pax_global_header00006660000000000000000000000064141626434500014517gustar00rootroot0000000000000052 comment=eaf4936430bcc4b4eafc4e13aa2ae59d0d3e33c2 mlton-20210117+dfsg/000077500000000000000000000000001416264345000140265ustar00rootroot00000000000000mlton-20210117+dfsg/.gitignore000066400000000000000000000000451416264345000160150ustar00rootroot00000000000000/boot/ /build/ /install/ mlton-*.tgz mlton-20210117+dfsg/.travis.yml000066400000000000000000000016351416264345000161440ustar00rootroot00000000000000language: shell os: linux arch: amd64 addons: apt: packages: mlton homebrew: packages: mlton jobs: include: - os: linux dist: bionic arch: amd64 env: CC=gcc MLTON_COMPILE_ARGS="-codegen amd64" REGRESSION=true - os: linux dist: bionic arch: amd64 env: CC=gcc MLTON_COMPILE_ARGS="-codegen c" REGRESSION=false - os: linux dist: bionic arch: amd64 env: CC=clang MLTON_COMPILE_ARGS="-codegen c" REGRESSION=false - os: linux dist: bionic arch: amd64 env: CC=clang MLTON_COMPILE_ARGS="-codegen llvm" REGRESSION=false - os: osx osx_image: xcode11 arch: amd64 env: CC=clang MLTON_COMPILE_ARGS="-codegen amd64" REGRESSION=false - os: osx osx_image: xcode11 arch: amd64 env: CC=clang MLTON_COMPILE_ARGS="-codegen c" REGRESSION=false script: - ./bin/travis-ci notifications: email: false mlton-20210117+dfsg/CHANGELOG.adoc000066400000000000000000004065751416264345000161660ustar00rootroot00000000000000= CHANGELOG == Version 20210117 Here are the changes from version 20201002 to 20210117. === Summary * Compiler. ** Fix bug in `SimplifyTypes` SSA optimization pass. * Libraries. ** Other libraries. *** Updated: ckit library, MLLPT library, MLRISC library, SML/NJ library * Other. ** Preliminary support for `arm64-darwin`. ** Fix bug in `Makefile.binary` detecting default position-independent style. === Details * 2021-01-17 ** Update SML/NJ libraries to SML/NJ 110.99. * 2021-01-15 ** Fix bug in `Makefile.binary` detecting default position-independent style. Thanks to Greg Werbin for the but report. ** Preliminary support for `arm64-darwin` ("Apple Silicon"). Thanks to Chris Cannam for the patches. * 2020-10-22 ** Fix bug in `SimplifyTypes` SSA optimization pass. Thanks to Martin Elsman for the bug report. == Version 20201002 Here are the changes from version 20200817 to version 20201002. === Summary * Compiler. ** Fixed bug in handling of weak objects during mark-compact GC. === Details * 2020-09-20 ** Fix bug in handling of weak objects during mark-compact GC. Thanks to Bernard Berthomieu for the bug report. == Version 20200817 Here are the changes from version 20200722 to version 20200817 === Summary * Compiler. ** Fixed bug in `RssaShrink` optimization that would result in an unbound variable and an internal compiler error. * Other. ** Fixes for Solaris and MinGW platforms. === Details * 2020-07-30 ** Fix bug in jump-chaining optimization of `RssaShrink` that would result in an unbound variable and an internal compiler error. == Version 20200722 Here are the changes from version 20180206 to version 20200722. === Summary * Compiler. ** Added expert `-pi-style {default|npi|pic|pie}` and `-native-pic {false|true}` options, which can be used to override a target-determined default. ** Fix a number of instances of excessive live data during compilation. ** Disable `Zone` SSA optimization pass by default; the `Zone` pass is known to not be safe-for-space. ** Statically allocate and initialize some global objects. ** Many updates and improvements to C and LLVM codegens. ** Add new `BounceVars` RSSA optimization pass to split the live ranges of RSSA variables. ** Improve `RssaShrink` optimization. ** Add support for alternate globalization strategies in `ConstantPropagation`. ** Strengthen `Useless` optimization with respect to a number of primitives. ** Add new `DuplicateGlobals` and `SplitTypes` SSA optimization passes. ** Introduce new `Overflow`-checking primitives and remove old `Overflow`-checking primitives and special-case code required (e.g., `Arith` transfers in IRs) to support them. ** Add parsers for XML, SXML, SSA, and SSA2 IRs. * Runtime. ** Detect and report incompatible use of ASLR/PIE on `load-world`. ** Added support for RISC-V architecture. * Language. * Libraries. ** Basis Library. *** Change `OS.IO.poll` to not be restarted when interrupted by a signal. (This is consistent with `Socket.select`.) *** Add `MLton.sizeAll: unit -> IntInf.int` that returns the size of reachable live data. *** Change type of `MLton.size` from `'a -> int` to `'a -> IntInf.int`, because with 64-bit systems, the size of a single object can exceed that representable by a signed 32-bit integer. ** Other libraries. *** Updated: ckit library, MLLPT library, MLRISC library, SML/NJ library * Tools. * Other. ** Updates to simplify porting MLton. ** Support parallel build (i.e., `make -j`). This mainly supports platforms/packagers that use a parallel `make` by default; it does not obtain significant build speedups. ** Various updates to ``Makefile``s. See `Makefile.config` for common and user-customizable configuration. ** Characterize MLton-LICENSE as an instance of the Historical Permission Notice and Disclaimer (HPND) license, rather than BSD-style. === Details * 2020-07-18 ** Update SML/NJ libraries to SML/NJ 110.98. * 2020-07-08 ** Fix `Real{32,64}_gdtoa` race condition. * 2020-07-07 ** Upgrade `gdtoa.tgz`. * 2020-06-28 ** Update SML/NJ libraries to SML/NJ 110.97. * 2020-05-28 ** Fix bug in running `blockFn`-s for `CML.sync`. * 2020-05-23 ** Updates to simplify porting MLton. Add `remote-bootstrap` and `remote-add-cross-target` goals to `Makefile`. The `remote-bootstrap` goal automates the process of bootstraping MLton on a remote machine that doesn't have a suitable pre-compiled `mlton` binary. The `remote-add-cross-target` goal automatesthe process of adding a cross-compiler target. These goals replace `bin/add-cross` and `bin/save-bootstrap-source`. * 2020-05-12 ** Fix infinte loop with jump chaining in `RssaShrink`. * 2020-03-11 ** Fix `String.scan` to return `NONE` if first character is non-printable. * 2020-02-14 ** Fix bug in `SimplifyTypes` SSA optimization pass. * 2020-01-22 ** Add expert `-pi-style {default|npi|pic|pie}` and `-native-pic {false|true}` options, which can be used to override a target-determined default. See https://github.com/MLton/mlton/pull/365 for details. * 2020-01-21 ** Support parallel build (i.e., `make -j`). This mainly supports platforms/packagers that use a parallel `make` by default; it does not obtain significant build speedups. * 2020-01-11 ** Revise implementation of statically allocated and initialized global objects. * 2019-11-22 ** Many updates and improvements to C and LLVM codegens. See https://github.com/MLton/mlton/pull/351 for details. * 2019-11-05 ** Change `OS.IO.poll` to not be restarted when interrupted by a signal. (This is consistent with `Socket.select`.) * 2019-11-04 ** Detect and report incompatible use of ASLR/PIE on `load-world`. ** Fix bugs in `MLton.size` and `MLton.share`; calling `MLton.size` or `MLton.share` with a non-pointer variant of an object type that could be represented by either a pointer or a non-pointer (e.g., the `NONE` variant of an `int list option`) would segfault. * 2019-10-25 ** Fix a number of instances of excessive live data during compilation. ** Disable `Zone` SSA optimization pass by default; the `Zone` pass is known to not be safe-for-space. ** Add `MLton.sizeAll: unit -> IntInf.int` that returns the size of reachable live data. ** Change type of `MLton.size` from `'a -> int` to `'a -> IntInf.int`, because with 64-bit systems, the size of a single object can exceed that representable by a signed 32-bit integer. * 2019-09-19 ** Statically allocate and initialize some global objects. See https://github.com/MLton/mlton/pull/328 for details. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-07-18 ** Add `-llvm-aamd {none|tbaa}` to control including alias-analysis metadata when compiling with LLVM. See https://github.com/MLton/mlton/pull/324 for details. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-06-21 ** Improved parser combinator library (`structure Parse`) in the MLton Library. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-06-19 ** Raise values from raiser to handler via the ML stack. See https://github.com/MLton/mlton/pull/321 for details. * 2019-06-17 ** Various updates to ``Makefile``s. See `Makefile.config` for common and user-customizable configuration. * 2019-06-07 ** Refactor pass infrastructure. See https://github.com/MLton/mlton/pull/313 for details. * 2019-05-31 ** Add new `BounceVars` RSSA optimization pass to split the live ranges of RSSA variables. See https://github.com/MLton/mlton/pull/299 for details. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-05-24 ** Many updates and improvements to C and LLVM codegens. See https://github.com/MLton/mlton/pull/304 for details. * 2019-05-13 ** Improve RSSA shrink optimization. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-03-22 ** Update word primitives. Inline signed integer `quot` and `rem` in C codegen (C99 and C11 have reliable semantics for signed division). * 2019-03-20 ** Remove old `Overflow`-checking primitives and special-case code required to support them. Undertaken by Daman Morris at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2019-03-12 ** Fix latent `MLton.GC.collect` bug; an explicit `MLton.GC.collect` call was passed `0` bytes requested rather than the bytes required by the return block(s). * 2019-01-16 ** Add support for alternate globalization strategies in `ConstantPropagation` (but defaults correspond to previous behavior). * 2019-01-03 ** Strengthen `Useless` optimization with respect to a number of primitives (`MLton_equal`, `MLton_hash`, `MLton_eq`, `MLton_share`, `MLton_size`, `Weak_canGet`, and `MLton_touch`). ** Add new `DuplicateGlobals` and `SplitTypes` SSA optimization passes. `DuplicateGlobals` introduces a distinct instance of a `ConApp` global for each distict use within the program. `SplitTypes` performs a unification-based analysis to split a datatype into distinct instances for constructed values that are not unified. Because datatypes are recursive, other analyses often conflate all defs and uses of `ConApp`-s; `SplitTypes` allows non-unified instances of a datatype to be analyzed separately. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2018-11-07 ** Add support for OpenBSD 6.4, which added stack-pointer register checking to the kernel. On OpenBSD, `%rsp`/`%esp` must be reserved by the native codegens (so as to always point to the C stack) and the signal stack must be `mmap`-ed with `MAP_STACK`. Thanks to Dan Cross for the pull request. * 2018-10-15 ** Introduce new `Overflow`-checking primitives. Undertaken by Daman Morris at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2018-08-17 ** Add a parser for the SSA2 IR (`functor ParseSsa2`). Undertaken by Manan Joshi at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2018-05-18 ** Add a parser for the SSA IR (`functor ParseSsa`). Undertaken by James Reilly at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2018-04-28 ** Characterize MLton-LICENSE as an instance of the Historical Permission Notice and Disclaimer (HPND) license, rather than BSD-style. * 2018-04-04 ** Added support for RISC-V architecture. Thanks to Adam Goode for the pull request. * 2018-03-31 ** Add `./bin/save-bootstrap-source` script to aid bootstrapping on a new platform. Thanks to Adam Goode for the pull request. * 2018-03-28 ** Recognize `ppc64le` in `./bin/platform` as an instance of `powerpc64` architecture. Thanks to Adam Goode for the pull request. * 2018-02-15 ** Set `LIB_REL_BIN` in `mlton` script when installing. Some systems (e.g., x86_64 Fedora) will set `libdir` to `/usr/lib64`, so it is necessary to compute and set the relative path from `TBIN` to `TLIB` when installing `$(TBIN)/mlton`. == Version 20180206 Here are the changes from version 20130715 to version 20180206. === Summary * Compiler. ** Added an experimental LLVM codegen (`-codegen llvm`); requires LLVM tools (`llvm-as`, `opt`, `llc`) version ≥ 3.7. ** Made many substantial cosmetic improvements to front-end diagnostic messages, especially with respect to source location regions, type inference for `fun` and `val rec` declarations, signature constraints applied to a structure, `sharing type` specifications and `where type` signature expressions, type constructor or type variable escaping scope, and nonexhaustive pattern matching. ** Fixed minor bugs with exception replication, precedence parsing of function clauses, and simultaneous `sharing` of multiple structures. ** Made compilation deterministic (eliminate output executable name from compile-time specified `@MLton` runtime arguments; deterministically generate magic constant for executable). ** Updated `-show-basis` (recursively expand structures in environments, displaying components with long identifiers; append `(* @ region *)` annotations to items shown in environment). ** Forced amd64 codegen to generate PIC on amd64-linux targets. * Runtime. ** Added `gc-summary-file file` runtime option. ** Reorganized runtime support for `IntInf` operations so that programs that do not use `IntInf` compile to executables with no residual dependency on GMP. ** Changed heap representation to store forwarding pointer for an object in the object header (rather than in the object data and setting the header to a sentinel value). * Language. ** Added support for selected SuccessorML features; see http://mlton.org/SuccessorML for details. ** Added `(*#showBasis "file" *)` directive; see http://mlton.org/ShowBasisDirective for details. ** FFI: *** Added `pure`, `impure`, and `reentrant` attributes to `_import`. An unattributed `_import` is treated as `impure`. A `pure` `_import` may be subject to more aggressive optimizations (common subexpression elimination, dead-code elimination). An `_import`-ed C function that (directly or indirectly) calls an `_export`-ed SML function should be attributed `reentrant`. ** ML Basis annotations. *** Added `allowSuccessorML {false|true}` to enable all SuccessorML features and other annotations to enable specific SuccessorML features; see http://mlton.org/SuccessorML for details. *** Split `nonexhaustiveMatch {warn|error|igore}` and `redundantMatch {warn|error|ignore}` into `nonexhaustiveMatch` and `redundantMatch` (controls diagnostics for `case` expressions, `fn` expressions, and `fun` declarations (which may raise `Match` on failure)) and `nonexhaustiveBind` and `redundantBind` (controls diagnostics for `val` declarations (which may raise `Bind` on failure)). *** Added `valrecConstr {warn|error|ignore}` to report when a `val rec` (or `fun`) declaration redefines an identifier that previously had constructor status. * Libraries. ** Basis Library. *** Improved performance of `Array.copy`, `Array.copyVec`, `Vector.append`, `String.^`, `String.concat`, `String.concatWith`, and other related functions by using `memmove` rather than element-by-element constructions. ** `Unsafe` structure. *** Added unsafe operations for array uninitialization and raw arrays; see https://github.com/MLton/mlton/pull/207 for details. ** Other libraries. *** Updated: ckit library, MLLPT library, MLRISC library, SML/NJ library * Tools. ** mlnlffigen *** Updated to warn and skip (rather than abort) when encountering functions with `struct`/`union` argument or return type. === Details * 2018-02-6 ** Remove ancient and unused `cmcat` tool. * 2018-02-03 ** Upgrade `gdtoa.tgz`. * 2018-02-02 ** Remove docs from `all` target of `./Makefile`; this eliminates the `all-no-docs` target (which was frequently used in favor of `all`). * 2018-01-31 ** Use C compiler with `-std=gnu11` (rather than `-std=gnu99`). ** Revert rudimentary support for `./configure`; the support was so minimal that it seems unhelpful to pretend that there are exhaustive compatibility checks being performed. All of the basic configuration can be accomplished with simple `make` variable definitions. * 2018-01-25 ** Remove (expert, undocumented) `-debug-format` option; the same effect can be achieved with `-as-opt` and `-cc-opt`. ** Propagate C compiler from `./configure` to `mlton` script. * 2018-01-24 ** Extend `-target-*-opt` options to support `arch-os` pairs. ** Remove `./package/rpm/*` and corresponding targets in `./Makefile`; upstream MLton has not produced RPMs for years. * 2018-01-24 ** Slightly improve performance of `Vector.concat` and `String.{concat,concatWith,tokens,fields}` by avoiding `List.map`-s. * 2018-01-23 ** Restore, but deprecate, `-drop-pass` compile-time expert option. * 2018-01-19 ** Update SML/NJ libraries to SML/NJ 110.82. * 2017-12-29 ** Add support for `(*#showBasis "file" *)` directives. This feature is meant to facilitate auto-completion via https://github.com/MatthewFluet/company-mlton[`company-mlton`] and similar tools. * 2017-12-20 ** Update performance comparison on website. Thanks to Curtis Dunham for the pull request. * 2017-12-17 ** Updates to `-show-basis`: *** `-show-basis-flat`: Recursively expand structures in environments, displaying components with long identifiers. *** `-show-basis-def`: Appends `(* @ region *)` annotations to items shown in environment. *** `-show-basis-compact`: Tries to optimize vertical space (at the expense of long lines). * 2017-12-11 ** Drop `_BSD_SOURCE` and `_POSIX_C_SOURCE` feature macros in `./runtime/cenv.h`. * 2017-12-10 ** Add a `Dockerfile` to build/test MLton. Thanks to Richard Laughlin for the pull request. * 2017-12-06 ** Remove `$PREFIX` and `$prefix` from top-level `Makefile.in`; use `./configure --prefix path`. Thanks to Richard Laughlin for the pull request. * 2017-12-03 ** Fix heap invariant predicates. * 2017-11-15 ** Eliminate the use of (some) global mutable state for signal handling. * 2017-11-14 ** Store forwarding pointer for an object in the object header (rather than in the object data and setting the header to a sentinel value). * 2017-11-02 ** Updates to stack management in backend: *** Improve `Allocation.Stack.get`. *** Do not force `Cont` block arguments to stack. * 2017-10-30 ** In `signature SSA_TO_RSSA_STRUCTS` share by `Rssa.Atoms = Ssa.Atoms`. This is the idiom used elsewhere in the compiler, rather than sharing individual sub-structures of `Atoms`. ** Minor updates to `DirectedGraph` and `Tree` in MLton library. * 2017-10-23 ** Add `-seed-rand w` compile-time option, to seed the pseudo-random number generator. ** Add a new MachineShuffle pass (disabled by default) that shuffles the collection of chunks within the program and shuffles the collection of blocks within a chunk. With the `-seed-rand w` compile-time option, can be used to generate executables with distinct code placements. * 2017-10-23 ** Use a relative path in the `mlton` script, rather than an absolute path. The absolute path needed to be set to the intended installation directory, which made it difficult to install a binary release in a local directory. Undertaken by Maksim Yegorov at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-10-21 ** Add unsafe operations for array uninitialization and raw arrays. *** Rename `Array_uninit: SeqIndex.int -> 'a array` primitive to `Array_alloc: SeqIndex.int -> 'a array`. *** Add `Array_uninit: 'a array * SeqIndex.int -> unit` primitive to set all objptrs in the element at the given index to a bogus non-objptr value (`0wx1`). One motivation for this primitive is to support space-efficient polymorphic resizeable arrays. When shrinking a resizeable array, we would like to "`NULL`" out the elements that are no longer part of the logical array, in order to avoid a (logical) space leak. *** Add `Array_uninitIsNop: 'a array -> bool` primitive to answer if the `Array_uninit` primitive applied to the same array would be a nop (i.e., if the array has no objptrs in the elements). This can be used to skip a bulk-`Array_uninit` loop when it is known that the `Array_uninit` operations would be nops. *** Add `Array_allocRaw: SeqIndex.int -> 'a array` primitive to allocate an array, but with a header that indicates that the array has no objptrs. Add `Array_toArray: 'a array -> 'a array` primitive to update the header of an `Array_allocRaw` allocated array to reveal the objptrs. One motiviation for this primitive is that, in a parallel setting, the uninitialization of an array can be a sequential bottleneck. The `Array_allocRaw` is a constant time operation and the subsequent `Array_uninit` operations can be performed in parallel. *** Extend `structure Unsafe.Array` with additional operations. See `./basis-library/sml-nj/unsafe.sig`. * 2017-10-20 ** Introduce ShareZeroVec SSA optimization to share zero-length vectors after coercion-based optimizations. Undertaken by Maksim Yegorov at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-10-18 ** New canonicalization strategy for CommonSubexp SSA optimization. Previously, the canonicalization of commutative arithmetic primitives was sensitive to variable hashes (created by an unseeded pseudo-random number generator); now, the canonicalization of commutative arithmetic primitives is sensitive to relative definition order of variables. * 2017-10-12 ** Fix bug in runtime argument option parsing. * 2017-10-05 ** Many updates and improvements to diagnostic messages. See https://github.com/MLton/mlton/pull/195 for details. * 2017-09-27 ** Add rudimentary support for `./configure`; in particular, support `--with-gmp-lib` and `--with-gmp-include` to set location of GMP and `--prefix` to specify an install prefix. Undertaken by Maksim Yegorov at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-08-21 ** Introduce `Array_copyArray: 'a array * SeqIndex.int * 'a array * SeqIndex.int * SeqIndex.int -> unit` and `Array_copyVector: 'a array * SeqIndex.int * 'a vector * SeqIndex.int * SeqIndex.int -> unit` primitives which are used to implement a number of array and vector construction functions, particularly `append`, `concat`, and `concatWith`. The primitives compile to `memmove` operations, which (significantly) outperforms MLton's element-by-element construction for large sequences. Undertaken by Bryan Camp at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-07-25 ** Force PIC generation on amd64-linux targets. Thanks to Kuen-Bang Hou (Favonia) for the pull request. * 2017-07-11 ** Generalize the `subWord` primitives to + ---- | WordArray_subWord of {seqSize:WordSize.t, eleSize: WordSize.t} | WordArray_updateWord of {seqSize: WordSize.t, eleSize: WordSize.t} | WordVector_subWord of {seqSize: WordSize.t, eleSize: WordSize.t} ---- + Undertaken by Bryan Camp at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-07-11 ** Add a parser combinator library (`structure StreamParser`) to the MLton Library. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. ** Add a parser for the SXML IR (`structure ParseSxml`). Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. ** Allow compilation to start with a `.sxml` file. Undertaken by Jason Carr at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2017-06-29 ** Replace `-drop-pass regex` compile-time option with `-disable-pass regex` compile option and add `-enable-pass regex` compile option. Various XML, SXML, SSA, SSA2, RSSA, and Machine IR optimization passes are initialized with a default status, which can be overriden by `-{disable,enable}-pass`. In particular, it is now easy to add a work-in-progress (and potentially buggy) pass to the simplification pipeline with `execute = false` default status, to be selectively executed with `-enable-pass`. Undertaken by Bryan Camp at RIT supported by NSF CISE Research Infrastructure (CRI) award. ** Add LoopUnswitch and LoopUnroll SSA optimizations (undertaken by Matthew Surawski as an RIT CS MS Capstone Project). Initial evaluation demonstrates some non-trivial performance gains, no non-trivial performance losses, and only minor code size increases, but currently disabled pending a more thorough evaluation. * 2017-05-23 ** Expand the set of MLB annotations: *** `nonexhaustiveBind`, `nonexhaustiveExnBind`, `redundantBind`: controls diagnostics for `val` declarations (which may raise `Bind` on failure). *** `nonexhaustiveMatch`, `nonexhaustiveExnMatch`, `redundantMatch`: controls diagnostics for `case` expressions, `fn` expressions, and `fun` declarations (which may raise `Match` on failure). *** `nonexhaustiveRaise`, `nonexhaustiveExnRaise`, `redundantRaise`: controls diagnostics for `handle` expressions (which implicitly re-raise on failure). Note that `nonexhaustiveRaise` and `nonexhaustiveExnRaise` default to `ignore`. The combination of `nonexhaustiveRaise warn` and `nonexhaustiveExnRaise ignore` can be useful for finding handlers that handle some, but not all, values of an exception variant. ** Make a number of improvements to diagnostic messages: *** Display nonexhaustive exception patterns as `_ : exn`, rather than `e`. *** Normalize nonexhaustive patterns by sorting (e.g., by `ConApp` name). *** Report complete enumeration of unhandled constants, rather than a single example. *** Report nonexhaustive patterns of record type as records, rather than as tuples. * 2017-04-20 ** Updates to SSA, SSA2, and RSSA IR support infrastructure *** Display more context when reporting SSA and SSA2 IR type errors. *** Add `-layout-width n` compile expert option to control the target width for the pretty printer. *** Make cosmetic improvments to SSA and SSA2 IR display (uses of global variables bound to small constants and conapps are commented with the corresponding value; include loop forest for functions with `-keep dot`). *** Improve RSSA constant folding and copy propagation. *** Limit Machine IR `Globals` to variables used outside of the `main` function. * 2017-04-15 ** Add `gc-summary-file file` runtime option. * 2017-04-15 ** Rename and add `smlnj-mlton-x{2,4,8,16}` top-level `Makefile` targets. ** Update SML/NJ librarys to SML/NJ 110.80 (making use of supported SuccessorML features). ** Note support for SML/NJ extensions via SuccessorML MLB annotations on website. * 2017-04-14 ** Add support for vector expressions (`#[e1, e2, ..., en]`) and vector patterns (`#[p1, p2, ..., pn]`) and add `Vector_vector` n-ary primitive. Initial support for vector expressions and the `Vector_vector` primitive were undertaken by Krishna Ravikumar as an RIT CS MS Capstone Project. * 2017-03-29 ** Update DOS eol handling and tweak error messages in lexer. * 2017-03-27 ** Correct off-by-one error in column numbers. Thanks to Jacob Zimmerman for the error report and pull request. * 2017-03-15 ** Updates to SuccessorML support: *** Add an `allowSuccessorML {false|true}` MLB annotation to enable all Successor ML features with a single annotation. *** Fix parsing of numeric labels to only accept an INT token that does not begin with 0, is not an extended literal, is not negative, and is decimal. *** Drop the alternate word prefixes (`0xw` and `0bw`). *** Unconditionally allow line comments in MLB files. *** Allow UTF-8 byte sequences in text constants. *** Refactor `ml.lex` and `mlb.lex` to be more maintainable. *** Rename `allowRecPunning` annotation to `allowRecordPunExps`. * 2017-02-27 ** Update ML-Yacc examples (`calc`, `fol`, `pascal`) to comply with MLton build process. Thanks to Hai Nguyen Van for the pull request. * 2017-01-25 ** Update PortingMLton documentation and `./bin/add-cross` script. Thanks to Daniel Moerner for the pull request. * 2016-09-29 ** Constant fold `CPointer_equal(NULL, NULL)` to `true`. * 2016-09-29 ** Introduce `NEEDS_SIGALTSTACK_EXEC` config in runtime system. * 2016-09-27 ** Construct a devel build version string from last commit time and last commit hash. ** Omit build date and build node from version banner; makes self-compiles deterministic. ** Remove `upgrade-basis.sml` from build. The generated `upgrade-basis.sml` was introduced to handle incompatibilities in the Basis Library provided by an old version of MLton and the Basis Library assumed by the current sources. However, there are no incompatibilities with MLton 20130715, MLton 20100608, or MLton 20070826. Nonetheless, the feature testing performed by `./bin/upgrade-basis` to generate `upgrade-basis.sml` is time consuming, especially when trying to simply type check the compiler sources. * 2016-06-20 ** Do not `gzip` man pages on OpenBSD. Thanks to Alexander Abushkevich for the pull request. * 2016-06-20 ** Generate position independent code for OpenBSD. Thanks to Alexander Abushkevich for the pull request. * 2016-06-20 ** Fix profiling for amd64-openbsd and x86-openbsd. Thanks to Alexander Abushkevich for the pull request. * 2016-04-06 ** Update SML/NJ librarys to SML/NJ 110.79. * 2016-03-22 ** Update LLVM codegen to support (and require) >= llvm-3.7. Thanks to Eugene Akentyev for the pull request. * 2016-02-26 ** Configure GMP location via `Makefile`. * 2016-01-10 ** Fix typo in `mlb-formal.tex`. Thanks to Jon Sterling for the pull request. * 2015-11-10 ** Update SML/NJ librarys to SML/NJ 110.78. Use `allowOrPats` and `allowSigWithtype` to minimize diffs. * 2015-10-20 ** Fix elaboration of `withtype` in signature. * 2015-10-06 ** Add support for setting CM anchor bindings in `cm2mlb` tool. * 2015-10-06 ** Fix non-exhaustive match warnings with or-patterns. Thanks to Rob Simmons for the bug report. ** Distinguish between partial and fully redundant matches. ** Report partial redundancy in `val` declarations. ** Lower precedence of or-patterns in parser. ** Make a variety of cosmetic improvements to non-exhaustive and redundant error/warning messages, primarily to be consistent in formatting between quoted AST and generated messages. * 2015-07-10 ** Extend support for arm64 (aarch64). Thanks to Edmund Evans for the patch. * 2015-06-22 ** Introduce `valrecConstr {warn|error|ignore}` MLB annotation to report when a `val rec` (or `fun`) declaration redefines an identifier that previously had constructor status. * 2015-06-19 ** Add support for selected SuccessorML features (undertaken by Kevin Bradley as an RIT CS MS Capstone Project). *** `do`-declarations (`allowDoDecls`) *** extended literals (`allowExtendedLiterals`) *** line comments (`allowLineComments`) *** optional leading bar in matches, fun decls, and datatype decls (`allowOptBar`) *** optional trailing semicolon in sequence expressions (`allowOptSemicolon`) *** or patterns (`allowOrPats`) *** record expression punning (`allowRecPunning`) *** withtype in signatures (`allowSigWithtype`) * 2015-06-10 ** Hide equality status of poly (and mono) vector and array slices. ** Hide type equality of mono and poly `Word8.word` arrays and vectors. * 2015-06-08 ** Added `reentrant` attribute to `_import`. An `_import`-ed C function that (directly or indirectly) calls an `_export`-ed SML function should be attributed `reentrant`. * 2015-06-08 ** Make compilation deterministic: *** Eliminate output executable name from compile-time specified `@MLton` arguments. *** Deterministically generate magic constant for executable. * 2015-06-08 ** Add `-keep ast` compile option. Undertaken by Ross Bayer at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2015-06-02 ** Updates to Debian packaging. Thanks to Christopher Cramer for the pull request. * 2015-03-30 ** Use `LANG=en_us` when computing version and build date. Thanks to Eugene Akentyev for the pull request. * 2015-02-17 ** Update `mlnlffigen` to warn and skip functions with `struct`/`union` arguments. Thanks to Armando Doval for the pull request. * 2014-12-22 ** Move pervasive constructs from `./mlton/ast` to `./mlton/atoms`, so that `./mlton/ast/sources.mlb` depends on `./mlton/atoms/sources.mlb` (and not the other way around). Undertaken by Vedant Raiththa at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2014-12-17 ** Cache a worker thread to service calls of `_export`-ed functions. Thanks to Bernard Berthomieu for the bug report. * 2014-12-02 ** Post-process generated front-end files for compatibility with SML/NJ's recent `ml-lex` and `ml-yacc` tools that generate log identifiers rather than unqualified (top-level environment) identifiers. ** Corrected documentation for SML/NJ `Makefile` target and fixed `bootstrap-nj` target. Thanks to Daniel Rosenwasser for the pull request. * 2014-11-21 ** Reorganized runtime support for `IntInf` operations so that programs that do not use `IntInf` compile to executables with no residual dependency on GMP. ** Fixed bug in `MLton.IntInf.fromRep` that could yield values that violate the `IntInf` representation invariants. Thanks to Rob Simmons for the bug report. * 2014-10-24 ** Added `pure` and `impure` attributes to `_import`. An unattributed `_import` is treated as `impure`. A `pure` `_import` may be subject to more aggressive optimizations (common subexpression elimination, dead-code elimination). Undertaken by Vedant Raiththa at RIT supported by NSF CISE Research Infrastructure (CRI) award. * 2014-10-22 ** Various updates to treatment of `IntInf` constants in the compiler. *** Recognize both `Big` and `Small` representations of `IntInf`-s. *** Translate `IntInf` consts to `Big` and `Small` representations in conversion from SSA to RSSA. This is consistent with the treatment of other `IntInf` operations in the conversion. After the conversion, `IntInf` is no longer treated as a primitive. *** Remove `initIntInfs` from program initialization. *** Constant fold `IntInf_toVector` and `WordVector_toIntInf` primitives. * 2014-10-20 ** Various updates to `structure WordXVector` in compiler proper. *** Update the `WordXVector.layout` function. If the `elementSize` is `WordX.word8` and more than 90% of the characters satisfy `Char.isGraph orelse Char.isSpace`, then display as an SML string constant (with non-printable characters SML-escaped). Otherwise, display as an SML/NJ-style `#[0x0, 0xF]` vector literal. *** Update initialization of `static struct GC_vectorInit vectorInits[]` constants in runtime. If the `WordXVector`'s (primitive) `elementSize` is `WordSize.W8`, then emit a C-escaped string constant. Otherwise, emit a C-array initialization. * 2014-08-15 ** More updates to benchmark infrastructure. *** Make `update-counts.sh` script more robust. *** Update `hamlet.sml` benchmark program to close input file after each loop. *** Update `fft.sml` benchmark program to only invoke `test` function with power-of-2 arguments. *** Update `model-elimination.sml` benchmark program to iterate `main ()` according to `doit` size parameter. * 2014-08-11 ** Include `winsock2.h` before `windows.h` in MinGW port. Thanks to Shu-Hung You for the pull request. * 2014-07-31 ** Refactor array and vector implementation in Basis Library into a primitive implementation (using `SeqInt.int` for indexing) and a wrapper implementation (using the default `Int.int` for indexing). Thanks to Rob Simmons for the pull request. ** Correct description of `MLton.{Vector,Array}.unfoldi` on website. Thanks to Rob Simmons for the pull request. * 2014-07-14 ** Updates to benchmark infrastructure. *** Add `even-odd.sml` benchmark that exercises mutual tail recursion. *** Add `update-counts.sh` script to calculate appropriate benchmark iteration counts and update benchmark iteration counts so that all benchmarks run for at least 30 seconds. *** Updates to benchmark driver program. * 2014-07-07 ** Change `./basis-library/integer/int-inf.sml` to reduce dependency on GMP-specific details of `./basis-library/integer/int-inf0.sml`. Thanks to Rob Simmons for the pull request. ** Correct type and description of `MLton.IntInf.fromRep` on website. Thanks to Rob Simmons for the pull request. * 2014-07-01 ** Add experimental LLVM codegen (undertaken by Brian Leibig as an RIT CS MS Project). * 2014-06-09 ** Update `CallingFromSMLToC` page on website. Thanks to Bikal Gurung for the pull request. * 2014-03-18 ** Updates for MinGW port. * 2014-02-07 ** Update AsciiDoc sources for website. * 2013-10-31 ** Various updates to website. Thanks to Mauricio C Antunes for the pull request. *** Add Tofte's tutorial and Rossberg's grammar. *** Fix links to implementations. * 2013-10-10 ** Update links from `References` page on website. Thanks to Mauricio C Antunes for the pull request. * 2013-09-02 ** Fix example for `Lazy` page on website. Thanks to Daniel Rosenwasser for the pull request. == Version 20130715 Here are the changes from version 20100608 to version 20130715. === Summary * Compiler. ** Cosmetic improvements to type-error messages. ** Removed features: *** Bytecode codegen: The bytecode codegen had not seen significant use and it was not well understood by any of the active developers. *** Support for `.cm` files as input: The ML Basis system provides much better infrastructure for "programming in the very large" than the (very) limited support for CM. The `cm2mlb` tool (available in the source distribution) can be used to convert CM projects to MLB projects, preserving the CM scoping of module identifiers. ** Bug fixes: see changelog * Runtime. ** Bug fixes: see changelog * Language. ** Interpret `(*#line line:col "file" *)` directives as relative file names. ** ML Basis annotations. *** Added: `resolveScope` * Libraries. ** Basis Library. *** Improved performance of `String.concatWith`. *** Use bit operations for `REAL.class` and other low-level operations. *** Support additional variables with `Posix.ProcEnv.sysconf`. *** Bug fixes: see changelog ** `MLton` structure. *** Removed: `MLton.Socket` ** Other libraries. *** Updated: ckit library, MLRISC library, SML/NJ library *** Added: MLLPT library * Tools. ** mllex *** Generate `(*#line line:col "file.lex" *)` directives with simple (relative) file names, rather than absolute paths. ** mlyacc *** Generate `(*#line line:col "file.grm" *)` directives with simple (relative) file names, rather than absolute paths. *** Fixed bug in comment-handling in lexer. === Details * 2013-07-06 ** Update SML/NJ libraries to SML/NJ 110.76. * 2013-06-19 ** Upgrade `gdtoa.tgz`; fixed bug in `Real32.{fmt,toDecimal,toString}`, which in some cases produced too many digits * 2013-06-18 ** Removed `MLton.Socket` structure (deprecated in last release). * 2013-06-10 ** Improved performance of `String.concatWith`. * 2013-05-22 ** Update SML/NJ libraries to SML/NJ 110.75. * 2013-04-30 ** Detect PowerPC 64 architecture. * 2012-10-09 ** Fixed bug in elaboration that erroneously accepted the following: signature S = sig structure A : sig type t end and B : sig type t end where type t = A.t end * 2012-09-04 ** Introduce an MLB annotation to control overload and flex record resolution scope: `resolveScope {strdec|dec|topdec|program}`. * 2012-07-04 ** Simplify use of `getsockopt` and `setsockopt` in Basis Library. ** Direct implementation of `Socket.Ctl.{getATMARK,getNREAD}` in runtime system, rather than indirect implementation in Basis Library via `ioctl`. ** Replace use of casting through a union with `memcpy` in runtime. * 2012-06-11 ** Use bit operations for `REAL.class` and other low-level operations. ** Fixed bugs in `REAL.copySign`, `REAL.signBit`, and `REAL.{to,from}Decimal`. * 2012-06-01 ** Cosmetic improvements to type-error messages. ** Fixed bug in elaboration that erroneously rejected the following: datatype ('a, ''a) t = T type ('a, ''a) u = unit and erroneously accepted the following: fun f (x: 'a) : ''a = x fun g (x: 'a) : ''a = if x = x then x else x * 2012-02-24 ** Fixed bug in redundant SSA optimization. * 2011-06-20 ** Support additional variables with `Posix.ProcEnv.sysconf`. * 2011-06-17 ** Change `mllex` and `mlyacc` to generate `#line` directives with simple file names, rather than absolute paths. ** Interpret `#line` directives as relative file names. * 2011-06-14 ** Fixed bug in SSA/SSA2 shrinker that could erroneously turn a non-tail function call with a `Bug` transfer as its continuation into a tail function call. * 2011-06-11 ** Update SML/NJ libraries to SML/NJ 110.73 and add ML-LPT library. * 2011-06-10 ** Fixed bug in translation from SSA2 to RSSA with case expressions over non-primitive-sized words. ** Fixed bug in SSA/SSA2 type checking of case expressions over words. * 2011-06-04 ** Upgrade `gdtoa.tgz`. ** Remove bytecode codegen. ** Remove support for `.cm` files as input. * 2011-05-03 ** Fixed a bug with the treatment of `as`-patterns, which should not allow the redefinition of constructor status. * 2011-02-18 ** Fixed bug with treatment of nan in common subexpression elimination SSA optimization. * 2011-02-18 ** Fixed bug in translation from SSA2 to RSSA with weak pointers. * 2011-02-05 ** Fixed bug in amd64 codegen calling convention for varargs C calls. * 2011-01-17 ** Fixed bug in comment-handling in lexer for `mlyacc`'s input language. * 2010-06-22 ** Fixed bug in elaboration of function clauses with different numbers of arguments that would raise an uncaught `Subscript` exception. == Version 20100608 Here are the changes from version 20070826 to version 20100608. === Summary * New platforms. ** ia64-hpux ** powerpc64-aix * Compiler. ** Command-line switches. *** Added: `-mlb-path-var ' '` *** Removed: `-keep sml`, `-stop sml` ** Improved constant folding of floating-point operations. ** Experimental: Support for compiling to a C library; see wiki documentation. ** Extended `-show-def-use` output to include types of variable definitions. ** Deprecated features (to be removed in a future release) *** Bytecode codegen: The bytecode codegen has not seen significant use and it is not well understood by any of the active developers. *** Support for `.cm` files as input: The ML Basis system provides much better infrastructure for "programming in the very large" than the (very) limited support for CM. The `cm2mlb` tool (available in the source distribution) can be used to convert CM projects to MLB projects, preserving the CM scoping of module identifiers. ** Bug fixes: see changelog * Runtime. ** `@MLton` switches. *** Added: `may-page-heap {false|true}` ** `may-page-heap`: By default, MLton will not page the heap to disk when unable to grow the heap to accomodate an allocation. (Previously, this behavior was the default, with no means to disable, with security an least-surprise issues.) ** Bug fixes: see changelog * Language. ** Allow numeric characters in ML Basis path variables. * Libraries. ** Basis Library. *** Bug fixes: see changelog. ** `MLton` structure. *** Added: `MLton.equal`, `MLton.hash`, `MLton.Cont.isolate`, `MLton.GC.Statistics, `MLton.Pointer.sizeofPointer`, `MLton.Socket.Address.toVector` *** Changed: *** Deprecated: `MLton.Socket` ** `Unsafe` structure. *** Added versions of all of the monomorphic array and vector structures. ** Other libraries. *** Updated: ckit library, MLRISC library, SML/NJ library. * Tools. ** `mllex` *** Eliminated top-level `type int = Int.int` in output. *** Include `(*#line line:col "file.lex" *)` directives in output. *** Added `%posint` command, to set the `yypos` type and allow the lexing of multi-gigabyte files. ** `mlnlffigen` *** Added command-line switches `-linkage archive` and `-linkage shared`. *** Deprecated command-line switch `-linkage static`. *** Added support for ia64 and hppa targets. ** `mlyacc` *** Eliminated top-level `type int = Int.int` in output. *** Include `(*#line line:col "file.grm" *)` directives in output. === Details * 2010-05-12 ** Fixed bug in the mark-compact garbage collector where the C library's `memcpy` was used to move objects during the compaction phase; this could lead to heap corruption and segmentation faults with newer versions of `gcc` and/or `glibc`, which assume that src and dst in a `memcpy` do not overlap. * 2010-03-12 ** Fixed bug in elaboration of `datatype` declarations with `withtype` bindings. * 2009-12-11 ** Fixed performance bug in RefFlatten SSA2 optimization. * 2009-12-09 ** Fixed performance bug in SimplifyTypes SSA optimization. * 2009-12-02 ** Fixed bug in amd64 codegen register allocation of indirect C calls. * 2009-09-17 ** Fixed bug in `IntInf.scan` and `IntInf.fromString` where leading spaces were only accepted if the stream had an explicit sign character. * 2009-07-10 ** Added CombineConversions SSA optimization. * 2009-06-09 ** Removed deprecated command line switch `-show-anns {false, true}`. * 2009-04-18 ** Removed command line switches `-keep sml` and `-stop sml`. Their meaning was unclear with `.mlb` files; their effect with `.cm` files can be achieved with `-stop f`. * 2009-04-16 ** Fixed bug in `IntInf.~>>` that could cause a `glibc` assertion failure. * 2009-04-01 ** Fixed exported type of `MLton.Process.reap`. * 2009-01-27 ** Added `MLton.Socket.Address.toVector` to get the network-byte-order representation of an IP address. * 2008-11-10 ** Fixed bug in `MLton.size` and `MLton.share` when tracing the current stack. * 2008-10-27 ** Fixed phantom typing of sockets by hiding the representation of socket types. Previously the representation of sockets was revealed rendering the phantom types useless. * 2008-10-10 ** Fixed bug in nested `_export`/`_import` functions. * 2008-09-12 ** Improved constant folding of floating point operations. * 2008-08-20 ** Store the card/cross map at the end of the allocated ML heap; avoids possible out of memory errors when resizing the ML heap cannot be followed by a card/cross map allocation. * 2008-07-24 ** Added support for compiling to a C library. The relevant new compiler options are `-ar` and `-format`. Libraries are named based on the name of the `-export-header` file. Libraries have two extra methods: *** `NAME_open(argc, argv)` initializes the library and runs the SML code until it reaches the end of the program. If the SML code exits or raises an uncaught exception, the entire program will terminate. *** `NAME_close()` will execute any registered atExit functions, any outstanding finalizers, and frees the ML heap. * 2008-07-16 ** Fixed bug in the name mangling of `_import`-ed functions with the `stdcall` convention. * 2008-06-12 ** Added `MLton.Pointer.sizeofPointer`. * 2008-06-06 ** Added expert command line switch `-emit-main {true|false}`. * 2008-05-17 ** Fixed bug in Windows code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Sami Evangelista for the bug report. * 2008-05-10 ** Implemented `MLton.Cont.isolate`. * 2008-04-20 ** Fixed bug in *NIX code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Nicolas Bertolotti for the bug report and patch. * 2008-04-07 ** More flexible active/paused stack resizing policy. + Removed `thread-shrink-ratio` runtime option. + Added `stack-current-grow-ratio`, `stack-current-max-reserved-ratio`, `stack-current-permit-ratio`, `stack-current-shrink-ratio`, `stack-max-reserved-ratio`, and `stack-shrink-ratio` runtime options. * 2008-04-07 ** Fixed bugs in Basis Library where the representations of `OS.IO.iodesc`, `Posix.IO.file_desc`, `Posix.Signal.signal`, `Socket.sock`, `Socket.SOGK.sock_type` as integers were exposed. * 2008-03-14 ** Added unsafe versions of all of the monomorphic array and vector structures. * 2008-03-02 ** Fixed bug in Basis Library where the representation of `OS.Process.status` as an integer was exposed. * 2008-02-13 ** Fixed space-safety bug in RefFlatten optimization (to flatten refs into containing data structure). Thanks to Daniel Spoonhower for the bug report and initial diagnosis and patch. * 2008-01-25 ** Various updates to GC statistics gathering. Some basic GC statistics can be accessed from SML by `MLton.GC.Statistics.*` functions. * 2008-01-24 ** Added primitive (structural) polymorphic hash. * 2008-01-21 ** Fixed frontend to accept `op _longvid_` patterns and expressions. Thanks to Florian Weimer for the bug report. * 2008-01-17 ** Extended `-show-def-use` output to include types of variable definitions. * 2008-01-09 ** Extended `MLton_equal` to be a structural equality on all types, including `real` and `->` types. * 2007-12-18 ** Changed ML-Yacc and ML-Lex to output line directives so that MLton's def-use information points to the source files (`.grm` and `.lex`) instead of the generated implementations (`.grm.sml` and `.lex.sml`). * 2007-12-14 ** Added runtime option `may-page-heap {false|true}`. By default, MLton will not page the heap to disk when unable to grow the heap to a desired size. (Previously, this behavior was the default, with no means to disable, with security and least-surprise concerns.) Thanks to Wesley Terpstra for the patch. ** Fixed bug the FFI visible representation of `Int16.int ref` (and references of other primitive types smaller than 32-bits) on big-endian platforms. Thanks to Dave Herman for the bug report. * 2007-12-13 ** Fixed bug in `ImperativeIOExtra.canInput` (`TextIO.canInput`). Thanks to Ville Laurikari for the bug report. * 2007-12-09 ** Better constant folding of `IntInf` operations. * 2007-12-07 ** Fixed bug in algebraic simplification of `RealX` primitives. `Real.<= (x, x)` is `false` when `x` is `NaN`. * 2007-11-29 ** Fixed bug in type inference of flexible records. This would later cause the compiler to raise the `TypeError` exception. Thanks to Wesley Terpstra for the bug report. * 2007-11-28 ** Fixed bug in cross-compilation of `gdtoa` library. Thanks to Wesley Terpstra for the bug report and patch. * 2007-11-20 ** Fixed bug in RefFlatten optimization (pass to flatten refs into containing data structure). Thanks to Ruy LeyWild for the bug report. * 2007-11-19 ** Fixed bug in the handling of weak pointers by the mark-compact garbage collector. Thanks to Sean McLaughlin for the bug report and Florian Weimer for the initial diagnosis. * 2007-11-07 ** Added `%posint` command to `ml-lex`, to set the `yypos` type and allow the lexing of multi-gigabyte input files. Thanks to Florian Weimer for the feature concept and original patch. * 2007-11-07 ** Added command-line switch `-mlb-path-var ' '` for specifying MLB path variables. * 2007-11-06 ** Allow numeric characters in MLB path variables. * 2007-09-20 ** Fixed bug in elaboration of structures with signature constraints. This would later cause the compiler to raise the `TypeError` exception. Thanks to Vesa Karvonen for the bug report. * 2007-09-11 ** Fixed bug in interaction of `_export`-ed functions and signal handlers. Thanks to Sean McLaughlin for the bug report. * 2007-09-03 ** Fixed bug in implementation of `_export`-ed functions using `char` type. Thanks to Katsuhiro Ueno for the bug report. == Version 20070826 Here are the changes from version 20051202 to version 20070826. === Summary * New platforms: ** amd64-linux, amd64-freebsd ** hppa-hpux ** powerpc-aix ** x86-darwin (Mac OS X) * Compiler. ** Support for 64-bit platforms. *** Native amd64 codegen. ** Command-line switches. *** Added: `-codegen amd64`, `-codegen x86`, `-default-type `, `-profile-val {false|true}`. *** Changed: `-stop f` (file listing now includes `.mlb` files) ** Bytecode codegen. *** Support for profiling. *** Support for exception history. * Language. ** ML Basis annotations. *** Removed: `allowExport`, `allowImport`, `sequenceUnit`, `warnMatch`. * Libraries. ** Basis Library. *** Added: `PackWord16Big, `PackWord16Little`, `PackWord64Big`, `PackWord64Little`. *** Bug Fixes: see changelog. ** `MLton` structure. *** Added: `MLTON_MONO_ARRAY`, `MLTON_MONO_VECTOR`, `MLTON_REAL`, `MLton.BinIO.tempPrefix`, `MLton.CharArray`, `MLton.CharVector`, `MLton.IntInf.BigWord`, `MLton.IntInf.SmallInt`, `MLton.Exn.defaultTopLevelHandler`, `MLton.Exn.getTopLevelHandler`, `MLton.Exn.setTopLevelHandler`, `MLton.LargeReal`, `MLton.LargeWord`, `MLton.Real`, `MLton.Real32`, `MLton.Real64`, `MLton.Rlimit.Rlim`, `MLton.TextIO.tempPrefix`, `MLton.Vector.create`, `MLton.Word.bswap`, `MLton.Word8.bswap`, `MLton.Word16`, `MLton.Word32`, `MLton.Word64`, `MLton.Word8Array`, `MLton.Word8Vector`. *** Changed: `MLton.Array.unfoldi`, `MLton.IntInf.rep`, `MLton.Rlimit`, `MLton.Vector.unfoldi`. *** Deprecated: `MLton.Socket` ** Other libraries. *** Added: MLRISC libary. *** Updated: ckit library, SML/NJ library. * Tools. === Details * 2007-08-12 ** Removed deprecated ML Basis annotations. * 2007-08-06 ** Fixed bug in treatment of `Real.{scan,fromString}` operations. `Real.{scan,fromString}` were using `TO_NEAREST` semantics, but should obey current rounding mode. (Only `Real.fromDecimal` is specified to always have `TO_NEAREST` semantics.) Thanks to Sean McLaughlin for the bug report. * 2007-07-27 ** Fixed bugs in constant-folding of floating-point operations with C codegen. * 2007-07-26 ** Fixed bug in treatment of floating-point operations. Floating-point operations depend on the current rounding mode, but were being treated as pure. Thanks to Sean McLaughlin for the bug report. * 2007-07-13 ** Added `MLton.Exn.{default,get,set}TopLevelHandler`. * 2007-07-12 ** Restored `native` option to `-codegen` flag. * 2007-07-11 ** Fixed bug in `Real32.toInt`: conversion of real values close to `Int.maxInt` could be incorrect. * 2007-07-07 ** Updates to bytecode code generator: support for amd64-* targets, support for profiling (including exception history). ** Fixed bug in `Socket` module of Basis Library; unmarshalling of socket options (for `get*` functions) used `andb` rather than `orb`. Thanks to Anders Petersson for the bug report (and patch). * 2007-07-06 ** Fixed bug in `Date` module of Basis Library; some functions would erroneously raise `Date` when given a year <= 1900. Thanks to Joe Hurd for the bug report. ** Fixed a long-standing bug in monomorphisation pass. Thanks to Vesa Karvonen for the bug report. * 2007-05-18 ** Native amd64 code generator for amd64-* targets. ** Eliminate `native` option from `-codegen` flag. ** Add `x86` and `amd64` options to `-codegen` flag. * 2007-04-29 ** Improved type checking of RSSA and Machine ILs. * 2007-04-14 ** Fixed aliasing issues with `basis/Real/*.c` files. ** Added real/word casts in `MLton` structure. * 2007-04-12 ** Added primitives for bit cast of word to/from real. ** Implement `PackReal{Big,Little}` using `PackWord{Big,Little}` and bit casts. * 2007-04-11 ** Move all system header `#include`-s to `platform/` os headers. ** Use C99 ``, rather than custom `"assert.{h,c}"`. * 2007-03-13 ** Implement `PackWord{Big,Little}` entirely in ML, using an ML byte swap function. * 2007-02-25 ** Change amd64-* target platforms from 32-bit compatibility mode (i.e., `-m32`) to 64-bit mode (i.e., `-m64`). Currently, only the C codegen is able to generate 64-bit executables. * 2007-02-23 ** Removed expert command line switch `-coalesce `. ** Added expert command line switch `-chunkify {coalesce|func|one}`. * 2007-02-20 ** Fixed bug in `PackReal.toBytes`. Thanks to Eric McCorkle for the bug report (and patch). * 2007-02-18 ** Added command line switch `-profile-val`, to profile the evaluation of `val` bindings; this is particularly useful with exception history for debugging uncaught exceptions at the top-level. * 2006-12-29 ** Added command line switch `-show {anns|path-map}` and deprecated command line switch `-show-anns {false|true}`. Use `-show path-map` to see the complete MLB path map as seen by the compiler. * 2006-12-20 ** Changed the output of command line switch `-stop f` to include `.mlb` files. This is useful for generating Makefile dependencies. The old output is easy to recover if necessary (e.g. `grep -v '\.mlb$'`). * 2006-12-08 ** Added command line switches `-{,target}-{as,cc,link}-opt-quote`, which pass their argument as a single argument to `gcc` (i.e., without tokenization at spaces). These options support using headers and libraries (including the MLton runtime headers and libraries) from a path with spaces. * 2006-12-02 ** Extensive reorganization of garbage collector, runtime system, and Basis Library implementation. (This is in preparation for future 64bit support.) They should be more C standards compliant and easier to port to new systems. ** FFI revisions *** Disallow nested indirect types (e.g., `int array array`). * 2006-11-30 ** Fixed a bug in elaboration of FFI forms; unary FFI types (e.g., `array`, `ref`, `vector`) could be used in places where `MLton.Pointer.t` was required. This would later cause the compiler to raise the `TypeError` exception, along with a lot of XML IL. * 2006-11-19 ** On *-darwin, work with GnuMP installed via Fink or MacPorts. * 2006-10-30 ** Ported to x86-darwin. * 2006-09-23 ** Added missing specification of `find` to the `MONO_VECTOR` signature. * 2006-08-03 ** Fixed a bug in Useless SSA optimization, caused by calling an imported C function and then ignoring the result. * 2006-06-24 ** Fixed a bug in pass to flatten data structures. Thanks to Joe Hurd for the bug report. * 2006-06-08 ** Fixed a bug in the native codegen's implementation of the C-calling convention. * 2006-05-11 ** Ported to PowerPC-AIX. ** Fixed a bug in the runtime for the cases where nonblocking IO with sockets was implemented using `MSG_DONTWAIT`. This flag does not exist on AIX, Cygwin, HPUX, and MinGW and was previously just ignored. Now the runtime simulates the flag for these platforms (except MinGW, yet, where it's still ignored). * 2006-05-06 ** Added `-default-type ''` for specifying the binding of default types in the Basis Library (e.g., `Int.int`). * 2006-04-25 ** Ported to HPPA-HPUX. ** Fixed `PackReal{,32,64}{Big,Little}` to follow the Basis Library specification. * 2006-04-19 ** Fixed a bug in `MLton.share` that could cause a segfault. * 2006-03-30 ** Changed `MLton.Vector.unfoldi` to return the state in addition to the result vector. * 2006-03-30 ** Added `MLton.Vector.create`, a more powerful vector-creation function than is available in the basis library. * 2006-03-04 ** Added MLRISC from SML/NJ 110.57 to standard distribution. * 2006-03-03 ** Fixed bug in SSA simplifier that could eliminate an irredundant test. * 2006-03-02 ** Ported a bugfix from SML/NJ for a bug with the combination of `withNack` and `never` in CML. * 2006-02-09 ** Support compiler specific annotations in ML Basis files. If an annotation contains `:`, then the text preceding the `:` is meant to denote a compiler. For MLton, if the text preceding the `:` is equal to `mlton`, then the remaining annotation is scanned as a normal annotation. If the text preceding the `:` is not-equal to `mlton`, then the annotation is ignored, and no warning is issued. * 2006-02-04 ** Fixed bug in elaboration of functors; a program with a very large number of functors could exhibit the error `ElaborateEnv.functorClosure: firstTycons`. == Version 20051202 Here are the changes from version 20041109 to version 20051202. === Summary * New license: BSD-style instead of GPL. * New platforms: ** hppa: Debian Linux. ** x86: MinGW. * Compiler. ** improved exception history. ** Command-line switches. *** Added: `-as-opt`, `-mlb-path-map`, `-target-as-opt`, `-target-cc-opt`. *** Deprecated: none. *** Removed: `-native`, `-sequence-unit`, `-warn-match`, `-warn-unused`. * Language. ** FFI syntax changes and extensions. *** Added: `_symbol`. *** Changed: `_export`, `_import`. *** Removed: `_ffi`. ** ML Basis annotations. *** Added: `allowFFI`, `nonexhaustiveExnMatch`, `nonexhaustiveMatch`, `redundantMatch`, `sequenceNonUnit`. *** Deprecated: `allowExport`, `allowImport`, `sequenceUnit`, `warnMatch`. * Libraries. ** Basis Library. *** Added: `Int1`, `Word1`. ** `MLton` structure. *** Added: `Process.create`, `ProcEnv.setgroups`, `Rusage.measureGC`, `Socket.fdToSock`, `Socket.Ctl.getError`. *** Changed: `MLton.Platform.Arch`. ** Other libraries. *** Added: ckit library, ML-NLFFI library, SML/NJ library. * Tools. ** updates of `mllex` and `mlyacc` from SML/NJ. ** added `mlnlffigen`. ** profiling supports better inclusion/exclusion of code. === Details * 2005-11-19 ** Updated SML/NJ Library and CKit Library from SML/NJ 110.57. * 2005-11-15 ** Fixed a bug in `MLton.ProcEnv.setgroups`. * 2005-11-11 ** Fixed a bug in the interleaving of lexing/parsing and elaborating of ML Basis files, which would raise an unhandled `Force` exception on cyclic basis references. Thanks to John Dias for the bug report. * 2005-11-10 ** Fixed two bugs in `Time.scan`. One would raise `Time` on a string with a large fractional component. Thanks to Carsten Varming for the bug report. The other failed to scan strings with an explicit sign followed by a decimal point. * 2005-11-03 ** Removed `MLton.GC.setRusage`. ** Added `MLton.Rusage.measureGC`. * 2005-09-11 ** Fixed bug in display of types with large numbers of type variables, which could cause unhandled exception `Chr`. * 2005-09-08 ** Fixed bug in type inference of flexible records that would show up as `"Type error: variable applied to wrong number of type args"`. * 2005-09-06 ** Fixed bug in `Real.signBit`, which had assumed that the underlying C signbit returned 0 or 1, when in fact any nonzero value is allowed to indicate the signbit is set. * 2005-09-05 ** Added `-mlb-path-map` switch. * 2005-08-25 ** Fixed bug in `MLton.Finalizable.touch`, which was not keeping alive finalizable values in all cases. * 2005-08-18 ** Added SML/NJ Library and CKit Library from SML/NJ 110.55 to standard distribution. ** Fixed bug in `Socket.Ctl.*`, which got the endianness wrong on big-endian machines. Thanks to Wesley Terpstra for the bug report and fix. ** Added `MLton.GC.setRusage`. ** Fixed bug in `mllex`, which had file positions starting at 2. They now start at zero. * 2005-08-15 ** Fixed bug in `LargeInt.scan`, which should skip leading `"0x"` and `"0X"`. Thanks to Wesley Terpstra for the bug report and fix. * 2005-08-06 ** Additional revisions of FFI: *** Deprecated `_export` with incomplete annotation. *** Added `_address` for address of C objects. *** Eliminated address component of `_symbol`. *** Changed the type of the `_symbol*` expression. *** See documentation for more detail. * 2005-08-06 ** Annotation changes: *** Deprecated: `sequenceUnit` *** Added: `sequenceNonUnit` * 2005-08-03 ** Annotation changes: *** Deprecated: `allowExport`, `allowImport`, `warnMatch` *** Added: `allowFFI`, `nonexhaustiveExnMatch`, `nonexhaustiveMatch`, `redundantMatch` * 2005-08-01 ** Update `mllex` and `mlyacc` with SML/NJ 110.55+ versions. This incorporates a small number of minor bug fixes. * 2005-07-23 ** Fixed bug in pass to flatten refs into containing data structure. * 2005-07-23 ** Overhaul of FFI: *** Deprecated `_import` of C base types. *** Added `_symbol` for address, getter, and setter of C base types. *** See documentation for more detail. * 2005-07-21 ** Update `mllex` and `mlyacc` with SML/NJ 110.55 versions. This incorporates a small number of minor bug fixes. * 2005-07-20 ** Fixed bug in front end that allowed unary constructors to be used without an argument in patterns. * 2005-07-19 ** Eliminated `_ffi`, which has been deprecated for some time. * 2005-07-14 ** Fixed bug in runtime that caused getrusage to be called on every GC, even if timing info isn't needed. * 2005-07-13 ** Fixed bug in closure conversion tickled by making a weak pointer to a closure. * 2005-07-12 ** Changed `{OS,Posix}.Process.sleep` to call `nanosleep()` instead of `sleep()`. ** Added `MLton.ProcEnv.setgroups`. * 2005-07-11 ** `InetSock.{any,toAddr}` raise `SysErr` if port is not in [0, 2^16^). * 2005-07-02 ** Fixed bug in `Socket.recvVecFrom{,',NB,NB'}`. The type was too polymorphic and allowed the creation of a bogus `sock_addr`. * 2005-06-28 ** The front end now reports errors on encountering undefined or cyclicly defined MLB path variables. * 2005-05-22 ** Fixed bug in `Posix.IO.{getlk,setlk,setlkw}` that caused a link-time error: undefined reference to `Posix_IO_FLock_typ`. ** Improved exception history so that the first entry in the history is the source position of the raise, and the rest is the call stack. * 2005-05-19 ** Improved exception history for `Overflow` exceptions. * 2005-04-20 ** Fixed a bug in pass to flatten refs into containing data structure. * 2005-04-14 ** Fixed a front-end bug that could cause an internal bug message of the form `"missing flexInst"`. * 2005-04-13 ** Fixed a bug in the representation of flat arrays/vectors that caused incorrect behavior when the element size was 2 or 4 bytes and there were multiple components to the element (e.g. `(char * char) vector`). * 2005-04-01 ** Fixed a bug in `GC_arrayAllocate` that could cause a segfault. * 2005-03-22 ** Added structures `Int1`, `Word1`. * 2005-03-19 ** Fixed a bug that caused `Socket.Ctl.{get,set}LINGER` to raise `Subscript`. The problem was in the use of `PackWord32Little.update`, which scales the supplied index by `bytesPerElem`. * 2005-03-13 ** Fixed a bug in CML mailboxes. * 2005-02-26 ** Fixed an off-by-one error in `mkstemp` defined in `mingw.c`. * 2005-02-13 ** Added `mlnlffigen` tool (heavily adapted from SML/NJ). * 2005-02-12 ** Added MLNLFFI Library (heavily adapted from SML/NJ) to standard distribution. * 2005-02-04 ** Fixed a bug in `OS.path.toString`, which did not raise `InvalidArc` when needed. * 2005-02-03 ** Fixed a bug in `OS.Path.joinDirFile`, which did not raise `InvalidArc` when passed a file that was not an arc. * 2005-01-26 ** Fixed a front end bug that incorrectly rejected expansive __valbind__s with useless bound type variables. * 2005-01-22 ** Fixed x86 codegen bug which failed to account for the possibility that a 64-bit move could interfere with itself (as simulated by 32-bit moves). * 2004-12-22 ** Fixed `Real32.fmt StringCvt.EXACT`, which had been producing too many digits of precision because it was converting to a `Real64.real`. * 2004-12-15 ** Replaced MLB path variable `MLTON_ROOT` with `SML_LIB`, to use a more compiler-independent name. We will keep `MLTON_ROOT` aliased to `SML_LIB` until after the next release. * 2004-12-02 ** `Unix.create` now works on all platforms (including Cygwin and MinGW). * 2004-11-24 ** Added support for `MLton.Process.create`, which works on all platforms (including Windows-based ones like Cygwin and MinGW) and allows better control over `std{in,out,err}` for child process. == Version 20041109 Here are the changes from version 20040227 to 20041109. === Summary * New platforms: ** x86: FreeBSD 5.x, OpenBSD ** PowerPC: Darwin (MacOSX) * Support for MLBasis files. * Support for dynamic libraries. * Support for Concurrent ML (CML). * New structures: `Int2`, `Int3`, ..., `Int31` and `Word2`, `Word3`, ..., `Word31`. * A new form of profiling: `-profile count`. * A bytecode generator. * Data representation improvements. * `MLton` structure changes. ** Added: `share`, `shareAll` ** Changed: `Exn`, `IntInf`, `Signal`, `Thread`. * Command-line switch changes. ** Deprecated: *** `-native` (use `-codegen`) *** `-sequence-unit` (use `-default-ann`) *** `-warn-match` (use `-default-ann`) *** `-warn-unused` (use `-default-ann`) ** Removed: *** `-detect-overflow` *** `-exn-history` (use `-const`) *** `-safe` *** `-show-basis-used` ** Added: *** `-codegen` *** `-const` *** `-default-ann` *** `-disable-ann` *** `-profile-branch` *** `-target-link-opt` === Details * 2004-09-22 ** Extended `_import` to support indirect function calls. * 2004-09-13 ** Made `Date.{fromString,scan}` accept a space (treated as zero) in the first character of the day of the month. * 2004-09-12 ** Fixed bug in `IntInf` that could cause a segfault. ** Remove `MLton.IntInf.size`. * 2004-09-05 ** Made `-detect-overflow` and `-safe` expert options. * 2004-08-30 ** Added `val MLton.share: 'a -> unit`, which maximizes sharing in a heap object. * 2004-08-27 ** Fixed bug in `Real.toLargeInt`. It would incorrectly raise `Option` instead of `Overflow` in the case when the real was not an `INF`, but rounding produced an `INF`. ** Fixed bugs in `Date.{fmt,fromString,scan,toString}`. They incorrectly allowed a space for the first character in the day of the month. * 2004-08-18 ** Changed `MLton.{Thread,Signal,World}` to distinguish between implicitly and explicitly paused threads. * 2004-07-28 ** Added support for programming in the large using the ML Basis system. * 2004-07-11 ** Fixed bugs in `ListPair.*Eq` functions, which incorrectly raised the `UnequalLengths` exception. * 2004-07-01 ** Added `val MLton.Exn.addExnMessager: (exn -> string option) -> unit`. * 2004-06-23 ** Runtime system options that take memory sizes now accept a "`g`" suffix indicating gigabytes. They also now take a real instead of an integer, e.g. `fixed-heap 0.5g`. They also now accept uppercase, e.g. `150M`. * 2004-06-12 ** Added support for OpenBSD. * 2004-06-10 ** Added support for FreeBSD 5.x. * 2004-05-28 ** Deprecated the `-native` flag. Instead, use the new flag `-codegen {native|bytecode|C}`. This is in anticipation of adding a bytecode compiler. * 2004-05-26 ** Fixed a front-end bug that could cause cascading error to print a very large and unreadable internal bug message of the form `"datatype ... realized with scheme Unknown"`. * 2004-05-17 ** Automatically restart functions in the Basis Library that correspond directly to interruptable system calls. * 2004-05-13 ** Added `-profile count`, for dynamic counts of function calls and branches. ** Equate the types `Posix.Signal.signal` and `Unix.signal`. * 2004-05-11 ** Fixed a bug with `-basis 1997` that would cause type errors due to differences between types in the MLton structure and types in the rest of the basis library. * 2004-05-01 ** Fixed a bug with sharing constraints in signatures that would sometimes mistakenly treat two structures as identical when they shouldn't have been. This would cause some programs to be mistakenly rejected. * 2004-04-30 ** Added `MLton.Signal.{handled,restart}`. * 2004-04-23 ** Added `Timer.checkCPUTimes`, and updated the `Timer` structure to match the latest basis spec. Also fixed `totalCPUTimer` and `totalRealTimer`, which were wrong. * 2004-04-13 ** Added `MLton.Signal.Mask.{getBlocked,isMember}`. * 2004-04-12 ** Fix bug that mistakenly generalized variable types containing unknown types when matching against a signature. ** Reasonable front-end error message when unification causes recursive (circular) type. * 2004-04-03 ** Fixed bug in sharing constraints so that `sharing A = B = C` means that all pairs `A = B`, `A = C`, `B = C` are shared, not just `A = B` and `B = C`. This matters in some situations. * 2004-03-20 ** Fixed `Time.now` which was treating microseconds as nanoseconds. * 2004-03-14 ** Fixed SSA optimizer bug that could cause the error `" has no tyconInfo property"`. * 2004-03-11 ** Fixed `Time.fromReal` to raise `Time`, not `Overflow`, on unrepresentable times. * 2004-03-04 ** Added structures `Word2`, `Word3`, ..., `Word31`. * 2004-03-03 ** Added structures `Int2`, `Int3`, ..., `Int31`. ** Fixed bug in elaboration of `and` with signatures, structures, and functors so that it now evaluates all right-hand sides before binding any left-hand sides. == Version 20040227 Here are the changes from version 20030716 to 20040227. === Summary * The front end now follows the Definition of SML and produces readable error messages. * Added support for NetBSD. * Basis library changes tracking revisions to the specification. * Added structures: `Int64`, `Real32`, `Word64`. * File positions use `Int64`. * Major improvements to `-show-basis`, which now displays the basis in a very readable way with full type information. * Command-line switch changes. ** Deprecated: `-basis`. ** Removed: `-lib-search`, `-link`, `-may-load-world`, `-static`. ** Added: `-link-opt`, `-runtime`, `-sequence-unit`, `-show-def-use`, `-stop tc`, `-warn-match`, `-warn-unused`. ** Changed: `-export-header`, `-show-basis`, `-show-basis-used`. ** Renamed: `-host` to `-target`. * FFI changes. ** Renamed `_ffi` as `_import`. ** Added `cdecl` and `stdcall` attributes to `_import` and `_export` expressions. * MLton structure changes. ** Added: Pointer. ** Removed: Ptrace. ** Changed: `Finalizable`, `IntInf`, `Platform`, `Random`, `Signal`, `Word`. === Details * 2004-02-16 ** Changed `-export-header`, `-show-basis`, `-show-basis-used` to take a file name argument, and they no longer force compilation to halt. ** Added `-show-def-use` and `-warn-unused`, which deal with def-use information. * 2004-02-13 ** Added flag `-sequence-unit`, which imposes the constraint that in the sequence expression `(e1; e2)`, `e1` must be of type `unit`. * 2004-02-10 ** Lots of changes to `MLton.Signal`: name changes, removal of superfluous functions, additional functions. * 2004-02-09 ** Extended `-show-basis` so that when used with an input program, it shows the basis defined by the input program. ** Added `stop` runtime argument. ** Made `-call-graph {false|true}` an option to `mlprof` that determines whether or not a call graph file is written. * 2004-01-20 ** Fixed a bug in `IEEEReal.{fromString,scan}`, which would improperly return `INF` instead of `ZERO` for things like `"0.0000e123456789012345"`. ** Fixed a bug in `Real.{fromDecimal,fromString,scan}`, which didn't return an appropriately signed zero for `~0.0`. ** Fixed a bug in `Real.{toDecimal,fmt}`, which didn't correctly handle `~0.0`. ** Report a compile-time error on unrepresentable real constants. * 2004-01-05 ** Removed option `-may-load-world`. You can now use `-runtime no-load-world` instead. ** Removed option `-static`. You can now use `-link-opt -static` instead. ** Changed `MLton.IntInf.size` to return 0 instead of 1 on small ints. * 2003-12-28 ** Fixed horrible bug in `MLton.Random.alphaNumString` that caused it to return 0 for all characters beyond position 11. * 2003-12-17 ** Removed `-basis` as a normal flag. It is still available as an expert flag, but its use is deprecated. It will almost certainly disappear after the next release. * 2003-12-10 ** Allow multiple `@MLton --` runtime args in sequnce. This makes it easier for scripts to prefix `@MLton` args without having to splice them with other ones. * 2003-12-04 ** Added support for files larger than 2G. This included changing `Position` from `Int32` to `Int64`. * 2003-12-01 ** Added `structure MLton.Pointer`, which includes a `type t` for pointers (memory addresses, not SML heap pointers) and operations for loading from and storing to memory. * 2003-11-03 ** Fixed `Timer.checkGCTime` so that only the GC user time is included, not GC system time. * 2003-10-13 ** Added `-warn-match` to control display nonexhaustive and redundant match warnings. ** Fixed space leak in `StreamIO` causing the entire stream to be retained. Thanks to Jared Showalter for the bug report and fix. * 2003-10-10 ** Added `-stop tc` switch to stop after type checking. * 2003-09-25 ** Fixed `Posix.IO.getfl`, which had mistakenly called `fcntl` with `F_GETFD` instead of `F_GETFL`. ** Tracking basis library changes: *** `Socket` module datagram functions no longer return amount written, since they always write the entire amount or fail. So, `send{Arr,Vec}To{,'}` now return `unit` instead of `int`. *** Added nonblocking versions of all the send and recv functions, as well as accept and connect. So, we now have: `acceptNB`, `connectNB`, `recv{Arr,Vec}{,From}NB{,'}`, `send{Arr,Vec}{,To}NB{,'}`. * 2003-09-24 ** Tracking basis library changes: *** `TextIO.inputLine` now returns a `string option`. *** Slices used in `Byte`, `PRIM_IO`, `PrimIO`, `Posix.IO`, `StreamIO`. *** `Posix.IO.readVec` raises `Size`, not `Subscript`, with negative argument. * 2003-09-22 ** Fixed `Real.toManExp` so that the mantissa is in [0.5, 1), not [1, 2). The spec says that 1.0 <= man * radix < radix, which since radix is 2, implies that the mantissa is in [0.5, 1). ** Added `Time.{from,to}Nanoseconds`. * 2003-09-11 ** Added `Real.realRound`. ** Added `Char{Array,Vector}Slice` to `Text`. * 2003-09-11 ** `OS.IO.poll` and `Socket.select` now raise errors on negative timeouts. ** `Time.time` is now implemented using `IntInf` instead of `Int`, which means that a much larger range of time values is representable. * 2003-09-10 ** `Word64` is now there. * 2003-09-09 ** Replaced `Pack32{Big,Little}` with `PackWord32{Big,Little}`. ** Fixed bug in `OS.FileSys.fullPath`, which mistakenly stopped as soon as it hit a symbolic link. * 2003-09-08 ** Fixed `@MLton max-heap`, which was mistakenly ignored. Cleaned up `@MLton fixed-heap`. Both `fixed-heap` and `max-heap` can use copying or mark-compact collection. * 2003-09-06 ** `Int64` is completely there. ** Fixed `OS.FileSys.tmpName` so that it creates the file, and doesn't use `tmpnam`. This eliminates an annoying linker warning message. * 2003-09-05 ** Added structures `{LargeInt,LargeReal,LargeWord,Word}{Array,Array2,ArraySlice,Vector,VectorSlice}` ** Fixed bug in `Real.toDecimal`, which return class `NORMAL` for subnormals. ** Fixed bug in `Real.toLargeInt`, which didn't return as precise an integer as possible. * 2003-09-03 ** Lots of fixes to `REAL` functions. *** `Real32` is now completely in place, except for `Real32.nextAfter` on SunOS. *** Fixed `Real.Math.exp` on x86 to return the right value when applied to `posInf` and `negInf`. *** Changed `Real.Math.{cos,sin,tan}` on x86 to always use a call to the C math library instead of using the x86 instruction. This eliminates some anomalies between compiling `-native false` and `-native true`. *** Change `Real.Math.pow` to handle exceptional cases in the SML code. *** Fixed `Real.signBit` on Sparcs. * 2003-08-28 ** Fixed `PackReal{,64}Little` to work correctly on Sparc. ** Added `PackReal{,64}Big`, `PackReal32{Big,Little}`. ** Added `-runtime` switch, which passes arguments to the runtime via `@MLton`. These arguments are processed before command line switches. ** Eliminated MLton switch `-may-load-world`. Can use `-runtime` combined with new runtime switch `-no-load-world` to disable load world in an executable. * 2003-08-26 ** Changed `-host` to `-target`. ** Split `MLton.Platform.{arch,os}` into `MLton.Platform.{Arch,OS}.t`. * 2003-08-21 ** Fixed bug in C codegen that would cause undefined references to `Real_{fetch,move,store}` when compiling on Sparcs with `-align 4`. * 2003-08-17 ** Eliminated `-link` and `-lib-search`, which are no longer needed. Eliminated support for passing `-l*`, `-L*`, and `*.a` on the command line. Use `-link-opt` instead. * 2003-08-16 ** Added `-link-opt`, for passing options to `gcc` when linking. * 2003-07-19 ** Renamed `_ffi` as `_import`. The old `_ffi` will remain for a while, but is deprecated and should be replaced with `_import`. ** Added attributes to `_export` and `_import`. For now, the only attributes are `cdecl` and `stdcall`. == Version 20030716 Here are the changes from version 20030711 to 20030716. == Summary * Fixed several serious bugs with the 20030711 release. == Details * 2003-07-15 ** Fixed bug that caused a segfault when attempting to create an array that was too large, e.g 1 + Array.sub (Array.tabulate (valOf Int.maxInt, fn i => i), 0) ** mlton now checks the command line arguments following the file to compile that are passed to the linker to make sure they are reasonable. * 2003-07-14 ** Fixed packaging for Cygwin and Sparc to include `libgmp.a`. ** Eliminated bootstrap target. The `Makefile` automatically determines whether to bootstrap or not. ** Fixed XML type checker bug that could cause error: `"empty tyvars in PolyVal dec"`. * 2003-07-12 ** Turned off `FORCE_GENERATIONAL` in gc. It had been set, which caused the gc to always use generational collection. This could seriously slow apps down that don't need it. == Version 20030711 Here are the changes from version 20030312 to 20030711. === Summary * Added support for Sparc/SunOS using the C code generator. * Completed the basis library implementation. At this point, the only missing basis library function is `use`. * Added `_export`, which allows one to call SML functions from C. * Added weak pointers (via `MLton.Weak`) and finalization (via `MLton.Finalizable`). * Added new integer modules: `Int8`, `Int16`. * Better profiling call graphs * Fixed conversions between reals and their decimal representations to be correct using the gdtoa library. === Details * 2003-07-07 ** Profiling improvements: *** Eliminated `mlton -profile-split`. Added `mlprof -split`. Now the profiling infrastructure keeps track of the splits and allows one to decide which splits to make (if any) when `mlprof` is run, which is much better than having to decide at compile time. *** Changed `mlprof -graph` to `mlprof -keep`, and changed the behavior so that `-keep` also controls which functions are displayed in the table. *** Eliminated `mlprof -ignore`: it's behavior is now subsumed by `-keep`, whose meaning has changed to be more like -ignore on nodes that are not kept. ** When calling `gcc` for linking, put `-link` args in same order as they appeared on the MLton command line (they used to be reversed). * 2003-07-03 ** Making `OS.Process.{atExit,exit}` conform to the basis library spec in that exceptions raised during cleaners are caught and ignored. Also, calls to `exit` from cleaners cause the rest of cleaners to run. * 2003-07-02 ** Fixed bug with negative `IntInf` constants that could cause compile time error message: `"x86Translate.translateChunk ... strange Offset: base: ..."` ** Changed argument type of `MLton.IntInf.Small` from `word` to `int`. ** Added fix to profiling so that the `mlmon.out` file is written even when the program terminates due to running out of memory. * 2003-06-25 ** Added `{Int{8,16},Word8}{,Array,ArraySlice,Vector,VectorSlice,Array2}` structures. * 2003-06-25 ** Fixed bug in `IntInf.sign`, which returned the wrong value for zero. * 2003-06-24 ** Added `_export`, for calling from C to SML. * 2003-06-18 ** Regularization of options: *** `-diag` --> `-diag-pass` *** `-drop-pass` takes a regexp * 2003-06-06 ** Fixed bug in `OS.IO.poll` that caused it to return the input event types polled for instead of what was actually available. * 2003-06-04 ** Fixed bug in KnownCase SSA optimization that could case incorrect results in compiled programs. * 2003-06-03 ** Fixed bug in SSA optimizer that could cause the error message: Type error: Type.equals {from = char vector, to = unit vector} Type error: analyze raised exception loopStatement: ... unhandled exception: TypeError * 2003-06-02 ** Fixed `Real.rem` to work correctly on `inf`-s and `nan`-s. ** Fixed bug in profiling that caused the function name to be omitted on functions defined by `val rec`. * 2003-05-31 ** `Fixed Real.{fmt,fromString,scan,toString}` to match the basis library spec. ** Added `IEEEReal.{fromString,scan}`. ** Added `Real.{from,to}Decimal`. * 2003-05-25 ** Added `Real.nextAfter`. ** Added `OS.Path.{from,to}UnixPath`, which are the identity function on Unix. * 2003-05-20 ** Added type `MLton.pointer`, the type of C pointers, for use with the FFI. * 2003-05-18 ** Fixed two bugs in type inference that could cause the compiler to raise the `TypeError` exception, along with a lot of XML IL. The `type-check.sml` regression contains simple examples of what failed. ** Fixed a bug in the simplifier that could cause the message: `"shrinker raised Prim.apply raised assertion failure: SmallIntInf.fromWord"`. * 2003-05-15 ** Fixed bug in `Real.class` introduced on 04-28 that cause many regression failures with reals when using newer `gcc`-s. ** Replaced `MLton.Finalize` with `MLton.Finalizable`, which has a more robust approach to finalization. * 2003-05-13 ** Fixed bug in `MLton.FFI` on Cygwin that caused `Thread_returnToC` to be undefined. * 2003-05-12 ** Added support for finalization with `MLton.Finalize`. * 2003-05-09 ** Fixed a runtime system bug that could cause a segfault. This bug would happen after a GC during heap resizing when copying a heap, if the heap was allocated at a very low (<10M) address. The bug actually showed up on a Cygwin system. * 2003-05-08 ** Fixed bug in `HashType` that raised `"Vector.forall2"` when the arity of a type constructor is changed by `SimplifyTypes`, but a newly constructed type has the same hash value. * 2003-05-02 ** Switched over to new layered IO implementation, which completes the implementation of the `BinIO` and `TextIO` modules. * 2003-04-28 ** Fixed bug that caused an assertion failure when generating a jump table for a case dispatch on a non-word sized index with non-zero lower bound on the range. * 2003-04-24 ** Added `-align {4|8}`, which controls alignment of objects. With `-align 8`, memory accesses to doubles are guaranteed to be aligned mod 8, and so don't need special routines to load or store. * 2003-04-22 ** Fixed bug that caused a total failure of time profiling with `-native false`. The bug was introduced with the C codegen improvements that split the C into multiple files. Now, the C codegen declares all profile labels used in each file so that they are global symbols. * 2003-04-18 ** Added `MLton.Weak`, which supports weak pointers. * 2003-04-10 ** Replaced the basis library's `MLton.hostType` with `MLton.Platform.arch` and `MLton.Platform.os`. * 2003-04 ** Added support for SPARC/SunOS using the C codegen. * 2003-03-25 ** Added `MLton.FFI`, which allows callbacks to SML from C. * 2003-03-21 ** Fixed `mlprof` so that the default `-graph arg` for data from `-profile-stack true` is `(thresh-stack x)`, not `(thresh x)`. == Version 20030312 Here are the changes from version 20020923 to 20030312. === Summary * Added source-level profiling of both time and allocation. * Updated basis library to 2002 specification. To obtain the old library, compile with `-basis 1997`. * Added many modules to basis library: ** `BinPrimIO`, `GenericSock`, `ImperativeIO`, `INetSock`, `NetHostDB`, `NetProtDB`, `NetServDB`, `Socket`, `StreamIO`, `TextPrimIO`, `UnixSock`. * Completed implementation of `IntInf` and `OS.IO`. === Details * 2003-02-23 ** Replaced `-profile-combine` wih `-profile-split`. * 2003-02-11 ** Regularization of options: *** `-l` --> `-link` *** `-L` --> `-lib-search` *** `-o` --> `-output` *** `-v` --> `-verbose` * 2003-02-10 ** Added option to `mlton`: `-profile-combine {false|true}` * 2003-02-09 ** Added options to `mlprof`: `-graph-title`, `-gray`, `-ignore`, `-mlmon`, `-tolerant`. * 2002-11 - 2003-01 ** Added source-level allocation and time profiling. This includes the new options to mlton: `-profile` and `-profile-stack`. * 2002-12-28 ** Added `NetHostDB`, `NetProtDB`, `NetServDB` structures. ** Added `Socket`, `GenericSock`, `INetSock`, `UnixSock` structures. * 2002-12-19 ** Fixed bug in signal check insertion that could cause some signals to be missed. The fix was to add a signal check on entry to each function in addition to at each loop header. * 2002-12-10 ** Fixed bug in runtime that might cause the message `"Unable to set cardMapForMutator"`. * 2002-11-23 ** Added support for the latest Basis Library specification. ** Added option `-basis` to choose Basis Library version. Currently available basis libraries are `2002`, `2002-strict`, `1997`, and `none`. ** Added `IntInf.{orb,xorb,andb,notb,<<,~>>}` values. ** Added `OS.IO.{poll_desc,poll_info}` types. ** Added `OS.IO.{pollDesc,pollToIODesc,infoToPollDesc,Poll}` values. ** Added `OS.IO.{pollIn,pollOut,pollPri,poll,isIn,isOut,isPri}` values. ** Added `BinPrimIO`, `TextPrimIO` structures. ** Added `StreamIO`, `ImperativeIO` functors. * 2002-11-22 ** Fixed bug that caused time profiling to fail (with a segfault) when resuming a saved world. * 2002-11-07 ** Fixed bug in `MLton.eq` that could arise when using `eq` on functions. * 2002-11-05 ** Improvements to polymorphic equality. Equality on IntInfs, vectors, and dataypes all do an `eq` test first before a more expensive comparison. * 2002-11-01 ** Added allocation profiling. Now, can compile with either `-profile alloc` or `-profile time`. Renamed `MLton.Profile` as `MLton.ProfileTime`. Added `MLton.ProfileAlloc`. Cleaned up and changed most `mlprof` option names. * 2002-10-31 ** Eliminated `MLton.debug`. ** Fixed bug in the optimizer that affected `IntInf.fmt`. The optimizer had been always using base 10, instead of the passed in radix. * 2002-10-22 ** Fixed `Real.toManExp` so that the mantissa is in [1, 2), not [0.5, 1). ** Added `Real.fromLargeInt`, `Real.toLargeInt`. ** Fixed `Real.split`, which would return an incorrect whole part due to the underlying primitive, `Real_modf`, being treated as functional instead of side-effecting. * 2002-09-30 ** Fixed `rpath` problem with packaging. All executables in packages previously made had included a setting for `RPATH`. == Version 20020923 Here are the changes from version 20020410 to 20020923. === Summary * MLton now runs on FreeBSD. * Major runtime system improvements. The runtime now implements mark-compact and generational collection, in addition to the copying collection that was there before. It automatically switches between the the collection strategies to improve performance and to try to avoid paging. * Performance when compiling `-exn-history true` has been improved. * Added `IntInf.log2`, `MLton.GC.pack`, `MLton.GC.unpack`. * Fixed bug in load world that could cause "sread failed" on Cygwin. * Fixed optimizer bug that could cause `"no analyze var value property"` message. === Details * 2002-09 ** Integrated Sam Rushing's changes to port MLton to FreeBSD. * 2002-08-25 ** Changed the implementation of exception history to be completely functional. Now, the extra field in exceptions (when compiling `-exn-history true`) is a `string list` instead of a `string list ref`, and `raise` conses a new exception with a new element in the list instead of assigning to the list. This changes the semantics of exception history (for the better) on some programs. See `regression/exnHistory3.sml` for an example. It also significantly improves performance when compiling `-exn-history true`. * 2002-07 and 2002-08 ** Added generational GC, and code to the runtime that automatically turns it on and off. * 2002-08-20 ** Fixed SSA optimizer bug that could cause the following error message: `"x_0 has no analyze var value property"` * 2002-07-28 ** Added `MLton.GC.{pack,unpack}`. `pack` shrinks the heap so that other processes can use the RAM, and its dual, `unpack`, resizes the heap to the desired size. * 2002-06 and 2002-07 ** Added mark compact GC. ** Changed array layout so that arrays have three, not two header words. The new word is a counter word that preceeds the array length and header. ** Changed all header words to be indices into an array of object descriptors. * 2002-06-27 ** Added patches from Michael Neumann to port runtime to FreeBSD 4.5. * 2002-06-05 ** Output file and intermediate file are now saved in the current directory instead of in the directory containing the input file. * 2002-05-31 ** Fixed bug in overloading of `/` so that the following now type checks: fun f (x, y) = x + y / y * 2002-04-26 ** Added back `max-heap` runtime option. * 2002-04-25 ** Fixed load/save world so that they use binary mode. This should fix the `sread failed` problem that Byron Hale saw on Cygwin that caused `mlton` to fail to start. ** Added `IntInf.log2`. ** Changed call to linker to use `libgmp.a` (if it exists) instead of `libgmp.so`. This is because the linker adds a dependency to a shared library even if there are no references to it * 2002-04-23 ** Rewrote heap resizing code. This fixed bug that was triggered with large heaps and could cause a spurious out of memory error. ** Removed GnuMP from MLton sources (again :-). == Version 20020410 Here are the changes from version 20011006 to version 20020410. === Details * 2002-03-28 ** Added BinIO. * 2002-03-27 ** Regularization of options *** `-g` --> `-degug {false|true}` *** `-h n` --> `-fixed-heap n` *** `-p` --> `-profile {false|true}` * 2002-03-22 ** Set up the stubs so that MLton can be compiled in the standard basis library, with no `MLton` structure. Thus it is now easy to compile MLton with an older (or newer) version of itself that has a different `MLton` structure. * 2002-03-17 ** Added `MLton.Process.{spawn,spawne,spawnp}`, which use primitives when running on Cygwin and fork/exec when running on Linux. * 2002-02 - 2002-03 ** Added the ability to cross-compile to Cygwin/Windows. * 2002-02-24 ** Added GnuMP back for use with Cygwin. * 2002-02-10 ** Reworked object header words so that `Array.maxLen = valOf Int.maxInt`. Also fixed a long-standing minor bug in MLton, where `Array.array (Array.maxLen, ...)` would raise `Size` instead of attempting to allocate the array. It was an off-by-one error in the meaning of `Array.maxLen`. * 2002-02-08 ** Modifications to runtime to behave better in situations where the amount of live data is a signifant fraction of the amount of RAM, based on code from PolySpace. MLton executables by default can now use more than the available amount of RAM. Executables will still respect the `max-heap` runtime arg if it is set. * 2002-02-04 ** Improvements to runtime so that it fails to get space, it attempts to get less space instead of failing. Based on PolySpace's modifications. ** Added `MLton.eq`. * 2002-02-03 ** Added `MLton.IntInf.gcd`. ** Removed GnuMP from MLton sources. We now link with `/usr/lib/libgmp.a`. ** Added `TextIO.getPosOut`. ** Renamed type `MLton.Itimer.which` to `MLton.Itimer.t` and `MLton.Itimer.whichSignal` to `MLton.Itimer.signal`. ** Added `-coalesce` flag, for use with the C backend. * 2002-01-26 ** Added `-show-basis-used`, which prints out the parts of the basis library that the input program uses. ** Changed several other flags (`-print-at-fun-entry`, `-show-basis`, `-static`) to follow the `{false|true}` convention. * 2002-01-22 ** Improved `MLton.profile` so that multiple profile arrays can exist simultaneously and so that the current one being used can be set from the SML side. * 2002-01-18 ** The Machine IL has been replaced with an RSSA (representation explicit SSA) IL and an improved Machine IL. * 2002-01-16 ** Added KnownCase SSA optimization * 2002-01-14 ** Added rudimentary profiling control from with a MLton compile program via the `MLton.Profile` structure. * 2002-01-09 ** Fixed bug in match compiler that caused case expressions on datatypes with redundant cases to be compiled incorrectly. * 2002-01-08 ** Added redundant tuple construction elimination to SSA shrinker. ** Improved Flatten SSA optimization. * 2001-12-06 ** Changed the interface for `MLton.Signal`. There is no longer a separate `Handler` substructure. This was done so that programs that just use `default` and `ignore` signal handlers don't bring in the entire thread mechanism. * 2001-12-05 ** Added LocalRef elimination SSA optimization. * 2001-11-19 ** The CPS IL has been replaced with an SSA (static-single assignment) IL. All of the optimizations have been ported from CPS to SSA. * 2001-10-24 ** Fixed bug in `Thread_atomicEnd` -- `limit` was mistakenly set to `base` instead of to 0. This caused assertion failures when for executables compiled `-g` because `GC_enter` didn't reset `limit`. ** Fixed bug in register allocation of byte registers. * 2001-10-23 ** Added `-D` option to `cmcat` for preprocessor defines. Thanks to Anoq for sending the code. ** Changed limit check insertion so that limit checks are only coalesced within a single basic block -- not across blocks. This slows many benchmarks down, but is needed to fix a bug in the way that limit checks were coalesced across blocks. Hopefully we will figure out a better fix soon. * 2001-10-18 ** Fixed type inference of flexrecord so that it now follows the Definition. Many programs containing flexrecords were incorrectly rejected. Added many new tests to regression/flexrecord.sml. ** Changed the behavior of `-keep dot` combined with `-keep pass` for SSA passes. Dot files are now saved for the program before and after, instead of just after. * 2001-10-11 ** Fixed a bug in the type inference that caused type variables to be mistakenly generalized. The bug was exposed in Norman Ramsey's `sled.sml`. Added a test to `regression/flexrecord.sml` to catch the problem. == Version 20011006 Here are the changes from version 20010806 to version 20011006. === Summary * Added `MLton.Exn.history`, which is similar to `SMLofNJ.exnHistory`. * Support for `#line` directives of the form `(*#line line.col "file"*)`. * Performance improvements in native codegenerator. * Bug fixes in front-end, optimizer, register allocator, `Real.{maxFinite,minPos,toManExp}`, and in heap save and restore. === Details * 2001-10-05 ** Fixed a bug in polymorphic layered patterns, like val 'a a as b = [] These would always fail due to the variable `a` not being handled correctly. ** Fixed the syntax of `val rec` so that a pattern is allowed on the left-hand side of the `=`. Thus, we used to reject, but now accept, the following. val rec a as b as c = fn _ => () val rec a : unit -> unit : unit -> unit = fn () => () Thanks again to Andreas Rossberg's test files. This is now tested for in `valrec.sml`. ** Fixed dynamic semantics of `val rec` so that if `val rec` is used to override constructor status, then at run time, the `Bind` exception is raised as per rule 126 of the Definition. So, for example, the following program type checks and compiles, but raises `Bind` at run time. val rec NONE = fn () => () val _ = NONE () Again, this is checked in `valrec.sml`. ** Added `\r\n` to ml.lex so that Windows style newlines are acceptable in input files. * 2001-10-04 ** Fixed bug in the implementation of `open` declarations, which in the case of `open A B` had opened `A` and then looked up `B` in the resulting environment. The correct behaviour (see rule 22 of the Definition) is to lookup each _longstrid_ in the current environment, and then open them all in sequence. This is now checked for in the `open.sml` regression test. Thanks to Andreas Rossberg for pointing this bug out. ** Fixed bug that caused tyvars of length 1 (i.e. `'`) to be rejected. This is now checked in the `id.sml` regression test. Again, thanks to Andreas Rossberg for the test. * 2001-10-02 ** Fixed bugs in `Real.toManExp` (which always returned the wrong result because the call to `frexp` was not treated as side-effecting by the optimizer) and in `Real.minPos`, which was zero because of a mistake with extra precision bits. * 2001-10-01 ** Added `MLton.Exn.history`. ** Fixed register allocation bug with `fucom` instruction. Was allowing `fucomp` when the first source was not removable. ** Changed `Real.isFinite` to use the C `math.h` `finite` function. This fixed the nontermination bug which occurred in any program that used `Real.maxFinite`. * 2001-09-22 ** Bug fixes found from Ramsey's `lrtl` in `contify.fun` and `unused-args.fun`, both of which caused compile-time exceptions to be raised. * 2001-09-21 ** Fixed `MLton.World.{load,save}` so that the saved world does not store the max heap size. Instead, the max heap size is computed upon load world in exactly the same way as at program startup. This fixes a long-standing (but only recently noticed) problem in which `mlton` (which uses a saved world) would attempt to use as much memory as was on the machine used to build `world.mlton`. * 2001-08-29 ** Overlow checking is now on by default in the C backend. This is a huge performance hit, but who cares, since we never use the C backend except for testing anyways. * 2001-08-22 ** Added support for #line directives of the form (*#line line.col "file"*) These directives only affect error messages produced by the parser and elaborator. * 2001-08-17 ** Fixed bug in RemoveUnused optimzation that caused the following program to fail to compile. fun f l = case l of [] => f l | _ :: l => f l val _ = f [13] * 2001-08-14 ** New x86-codegen infrastructure. *** support for tracking liveness of stack slots and carrying them in registers across basic blocks *** more specific `Entry` and `Transfer` datatypes to make calling convention distinctions more explicit *** new heuristic for carrying values in registers across basic blocks (look Ma, no Overflows!) *** new "predict" model for generating register allocation hints *** additional bug fixes * 2001-08-07 ** `MLton.Socket.shutdownWrite` flushes the outstream. == Version 20010806 Here are the changes from version 20010706 to version 20010806. === Summary * `Word.andb (w, 0xFF)` now works correctly * `MLton.Rusage.rusage` has a patch to work around a linux kernel bug * Programs of the form `_exp_ ; _program_` are now accepted * Added the `MLton.Rlimit` structure * Added the `-keep dot` flag, which produces call graphs, intraprocedural control-flow graphs, and dominator trees === Details * 2001-08-06 ** Added simple CommonBlock elimination CPS optimization. * 2001-08-02 ** Took out `-keep il`. * 2001-07-31 ** Performance improvements to `TextIO.{input, output, output1}`. * 2001-07-25 ** Added RedundantTest elimination CPS optimization. * 2001-07-21 ** Added CommonSubexp elimination CPS optimization. * 2001-07-20 ** Bug fix to x86 codegen. The `commuteBinALMD` peephole optimization would rewrite `mov 2,Y; add Y,Y` as `mov Y,Y; add 2,Y`. Now the appropriate interference checks are made. ** Added intraprocedural unused argument removal. ** Added intraprocedural flattener. This avoids some stupid tuple allocations in loops. Decent speedup on a few benchmarks (`count-graphs`, `psdes-random`, `wc-scanStream`) and no noticeable slowdowns. ** Added `-keep dot` flag. * 2001-07-17 ** Modified grammar to properly handle `val rec`. There were several problems. *** MLton had accepted `val rec 'a ...` instead of `val 'a rec ...` *** MLton had not accepted `val x = 13 and rec f = fn () => ()` *** MLton had not accepted `val rec rec f = fn () => ()` *** MLton had not accepted `val rec f = fn () => () and rec g = fn () => ()` * 2001-07-16 ** Workaround for Linux kernel bug that can cause `getrusage` to return a wrong system time value (low by one second). See `fixedGetrusage` in `gc.c`. ** Bug fix to x86 codegen. The register allocator could get confused when doing comparisons of floating point numbers and use the wrong operand. The bug seems to have never been detected because it only happens when both of the operands are already on the floating point stack, which is rare, since one is almost always in memory since we don't carry floating point values in the stack across basic blocks. ** Added production to the grammar on page 58 of the Definition that had been missing from MLton since day one. program ::= exp ; Also updated docs to reflect change. ** Modified grammar to accept the empty program. ** Added `-type-check` expert flag to turn on type checking in ILs. * 2001-07-15 ** Bug fix to the algebraic simplifier. It had been rewriting `Word32.andb (w, 0wxFF)` to `w` instead of `Word32.andb (w, 0wxFFFFFFFF)` to `w`. * 2001-07-13 ** Improved CPS shrinker so that `if`-tests where the `then` and `else` branch jump to the same label is turned into a direct jump. ** Improved CPS shrinker (`Prim.apply`) to handle constructors *** `A = A` --> `true` *** `A = B` --> `false` *** `A x` = `B y` --> `false` ** Rewrote a lot of loops in the basis library to use inequalities instead of equality for the loop termination test so that the (forthcoming) overflow detection elimination will work on the loop index variable. * 2001-07-11 ** Fixed minor bugs in `Array2.{array,tabulate}`, `Substring.{slice}` that caused the `Overflow` exception to be raised instead of `Size` or `Subscript` ** Fixed bug in `Pack32Big.update` that caused the wrong location to be updated. ** Fixed several bugs in `Pack32{Big,Little}.{subArr,subVec,update}` that caused `Overflow` to be raised instead of `Subscript`. Also, improved the implementation so that bounds checking only occurs once per call (instead of four times, which was sometimes happening. ** Fixed bugs in `Time.{toMilliseconds,toMicroseconds}` that could cause a spurious `Overflow` exception. ** Fixed bugs in `Time.{fromMilliseconds,fromMicroseconds}` that could cause a spurious `Time` exception. ** Improved `Pack32.sub*` by reordering the `orb`-s. ** Improved `{Int,IntInf}.mod` to increase chances of constant folding. ** Switched many uses of `+`, `-`, `*` in basis library to the non-overflow checked versions. Modules changed were: `Array`, `Array2`, `Byte`, `Char`, `Int`, `IntInf`, `List`, `Pack32{Big,Little}`, `Util`, `String`, `StringCvt`, `Substring`, `TextIO`, `Time`, `Vector`. ** Added regression tests for `Array2`, `Int` (overflow checking), `Pack32`, `Substring`, `Time`. ** Changed CPS output so that it includes a dot graph for each CPS function. * 2001-07-09 ** Change `OS.Process.exit` so that it raises an exception if the exit status is not in [0, 256). ** Added `MLton.Rlimit` to provide access to `getrlimit` and `setrlimit`. == Version 20010706 Here are the changes from the 20000906 version to the 20010706 version. === Summary * Native X86 code generator (instead of using `gcc`) * Significantly improved compile times * Significantly improved run times for generated executables * Many bug fixes * Correct raising of the `Overflow` exception for integer arithmetic * New modules in the `MLton` structure === Details * 2001-07-06 ** GC mods from Henry. Mostly adding `inline` declarations. * 2001-07-05 ** Fixed several runtime bugs involving threads, critical sections, and signals. * 2001-06-29 ** Fixed performance bug in `cps/two-point-lattice.fun` that caused quadratic behavior. This affects the raise-to-jump and useless analayses. In particular, the useless analysis was blowing up when compiling `fxp`. * 2001-06-27 ** Henry improved `wordAlign` -- this sped up GC by 27% (during a self compile). * 2001-06-20 ** Moved `MLton.random` to `MLton.Random.rand` and added other stuff to `MLton.Random` ** Added `MLton.TextIO.mkstemp`. ** Made `Int.{div,quot}` respect the `-detect-overflow` switch. * 2001-06-20 ** Added `MLton.Syslog`. * 2001-06-07 ** Fixed bug in `MLton.Socket.accept` that was in the runtime implementation `Socket_accept`. It did a `setsockopt SO_REUSEADDR` after the `accept`. It should have been after the call to `socket` in `Socket_listen`. Thanks to Doug Bagley for the fix. * 2001-05-30 ** Fixed bug in remove-unused that caused polymorphic equality to return `true` sometimes when constructors were never used in a pattern match. For example, the following (in which `A` and `B` are not used as patterns): datatype t = A | B datatype u = C of t val _ = if C A = C B then raise Fail "bug" else () * 2001-03-27 ** Fixed bug that caused all of the following to fail: `{LargeWord,Word,SysWord}.{toLargeInt,toLargeIntX,fromLargeInt}` The problem was the basis library file `integer/patch.sml` which fixed `Word32` but not the other structures that are the same. * 2001-02-12 ** Fixed bug in match compiler that caused it to spend a lot of extra time in deep patterns. It still could be exponential however. Hopefully this will get fixed in the release after next. This bug could cause very slow compile times in some cases. Anyways, this fix cut the `finish infer` time of a self compile down from 22 to under 4 seconds. I.E. most of the time used to be spent due to this bug. * 2001-02-06 ** Fixed bug in frontend that caused the wrong file and line number to be reported with errors in functor bodys. * 2001-01-03 - 2000-02-05 ** Changes to CoreML, XML, SXML, and CPS ILs to replace lists by vectors in order to decrease space usage. * 2001-01-16 ** Fixed a bug in constant propagation where the length of vectors was not propagated properly. * 2000-12-11 - 2001-01-03 ** Major rewrite of elaborator to use a single hash table for each namespace instead of a hash table for every environment. * 2000-12-20 ** Fixed some bugs in the SML/NJ compatibility library, `src/lib/mlton-subs-in-smlnj`. * 2000-12-08 ** More careful removal of tracing code when compiling `MLton_debug=0`. This cut down self compile data size by 100k and compile time by a few seconds. ** Added built in character and word cases propagated throughout all ILs. * 2000-12-06 ** Added max stack size information to `gc-summary`. * 2000-12-05 ** Added `src/benchmark`, which contains an SML program that benchmarks all of the SML compilers I have my hands on. The script has lots of hardwired paths for now. * 2000-12-04 ** Fixed bug in `Posix.ProcEnv.environ,` which did not work correctly in a saved world (the original `environ` was saved). In fact, it did not work at all because the ML primitive expected a constant and the C was a nullary function. This caused a segfault with any program using `Posix.ProcEnv.environ`. ** `Added MLton.ProcEnv.setenv`, since there doesn't seem to be any `setenv` in the basis library. * 2000-11-29 ** Changed backend so that it should no longer generate machine programs with `void` operands. ** Added `-detect-overflow` and `-safe` flags. * 2000-11-27 - 2000-11-28 ** Changes in many places to use `List.revMap` instead of `List.map` to cut down on allocation. * 2000-11-21 ** Added `MLton.Word.~` and `MLton.Word8.~` to the `MLton` structure. * 2000-11-20 ** Fixed a bug in the CPS shrinker that could cause a compile-time failure. It was maintaining occurrence counts incorrectly. * 2000-11-15 ** Fixed a (performance) bug in constant propagation that caused the hashing to be bad. ** Improved translation to XML so that the match compiler isn't called on tuple or if expressions. This should speed up the translation and make the output smaller. ** Fixed a bug in the match compiler that caused it to not generate integer case statements. This should speed up the mlyacc benchmark and the MLton front end. * 2000-11-09 ** Added `IntInf_equal` and `IntInf_compare` primitives. ** Took out the automatic `-keep c` when compiling `-g`. * 2000-11-08 ** Added a whole bunch of algebraic laws to the CPS shrinker, including some specifically targeted to `IntInf` primitives. * 2000-11-03 ** Improved implementation of properties so that sets don't allocate. ** Improved implementation of type homomorphism in type inference. What was there before appears to have been a bug -- it didn't use the property on types. * 2000-11-02 ** Fixed timers used with `-v` option to use user + sys time. * 2000-10-27 ** Split the runtime basis library C files into many separate files so that only the needed code would be included by the linker. ** Fixed several bugs in the front end grammar and elaborator that caused type specifications to be handled incorrectly. The following three programs used to be handled incorrectly, but are now handled correctly. signature S = sig type t and u = int end (* reject *) signature S = sig type t = int and u = t end (* accept *) signature S = sig eqtype t and u = int end (* reject *) * 2000-10-25 ** Changes to `main.sml` to run complete compiles with `-native` switch. * 2000-10-24 ** Removed defunctorizer. * 2000-10-20 ** Fixed bug in `cps-tree.fun` with `PrimExp.maySideEffect`. This bug could cause `"no operand"` failures in the backend. ** Fixed bug in the runtime implementation of `MLton.size`. The size for stack objects was using the `used` instead of `reserved`, and so was too low. * 2000-10-19 ** Replaced automatically generated dependencies in `src/runtime/Makefile` with hand generated ones. Took out `make depend` from `src/Makefile`. `make depend` was behaving really badly on RHAT 7.0. ** Tweaked compiler to shorten width of C output lines to work around bug in RHAT 7.0 `cpp` which silently truncates (very) long lines. ** Fixed bug in grammar that didn't allow `op` to occur in datatype and exception bindings, causing the following to fail datatype t = op T exception op E = op Fail ** Improved error messages in CM processor. Fixed bug in CM Alias handling. * 2000-10-18 ** Fixed two bugs in the gc that did comparisons with `(s->limit - s->frontier)`, which of course doesn't work if `frontier` is beyond `limit`, since these are unsigned. This could have caused segfaults, except that the mutator checks the `frontier` upon return from the GC. * 2000-10-17 ** Fixed bug in backend in the calculation of `maxFrameSize`. It could be wrong (low) in some situations. ** Improved CPS inliner's estimate of function sizes. The size of a function now takes into account other inlined functions that the function calls. This also changed the meaning of the size argument to the `-inline` switch. It now corresponds (roughly) to the product of the size of the function and the number of calls. In general, it should be larger than before. * 2000-10-13 ** Made some calls to `Array.sub` unsafe in the implementation of `Array2`. ** Integrated Matthew's new x86 backend with floating point support. * 2000-10-09 ** Fixed CM file processor so that MLton works if it is run from a different directory than the main CM file. * 2000-10-04 ** Changed LimitCheck so it loops on the `frontier > limit` check. This fixed a potential bug in threads caused when there is enough space available for a thread, `t`, before switching to another thread but not enough space when it resumes. This could have caused a segfault. * 2000-10-03 ** More rewrites of `TextIO.StreamIO` to improve speed. ** Changed `TextIO` so that only `TextIO.stdErr` is unbuffered. ** Changed `TextIO` so that FIFOs and sockets are buffered. * 2000-10-02 ** Combined remove-unused-constructors, remove-unused-functions, and remove-unused-globals into a single pass that runs to fixed-point and produces results at least as good as running the previous three in (any) sequence. * 2000-09-29 ** Added `GC_FIRST_CHECK`, which does a gc at each limit check the first time it reached. ** Reimplemented `TextIO.StreamIO` (from 2000-09-12) to use lists of strings instead of lists of characters so that the per char space overhead is small. * 2000-09-21 ** Fixed bug in profiling labels in C code. The label was always the basic block label instead of the cps function label. ** Added `-b` switch to `mlprof` to gather data at the basic block level. ** Improved performance of `TextIO.input1` by about 3X. * 2000-09-15 - 2000-09-19 ** Added overflow exceptions to CPS and Machine ILs. * 2000-09-12 ** Fixed `TextIO.scanStream`. It was very broken. ** Added `TextIO.{getInstream,mkInstream,setInstream}` and `TextIO.StreamIO.{canInput,closeIn,endOfStream,input1,input,inputAll,inputLine,inputN}`. * 2000-09-11 ** Fixed `Real_qequal` in `mlton-lib.h`. It was missing a paren that caused code using it to not even compile. It was also semantically incorrect. ** Noted that `Real_{equal,lt,le,gt,ge}` may not follow basis library spec, since ANSI does not require IEEE compliance, and hence these could return wrong results when nans are involved. == Version 20000906 Here are the changes from the 20000712 version to the 20000906 version. === Summary * Version 20000906 is mostly a bugfix release over 20000712. The other major changes are that `mllex` and `mlyacc` are now included and that `mlton` can now process a limited subset of CM files as input. === Details * 2000-09-06 ** Fixed `Socket_listen` in `mlton-lib.c` so that it closes the socket if the `bind`, `listen`, or `getsockname` fails. This could have caused a file descriptor leak. * 2000-09-05 ** Added `-static` commandline switch. ** Changed default max heap size to .85 RAM from .95 RAM. ** Added `PackRealLittle` structure to basis library. * 2000-08-25 ** Added cases on integers to ILs (instead of using sequences of tests) so that backend can emit more efficient test (jump table, binary tree, ...). * 2000-08-24 ** Fixed bug in `gc.c`. `dfsInitializeStack` would `smummap` a `NULL` pointer whenver `toSpace` was `NULL`. This could cause `MLton.size` to segfault. ** Fixed bug in `Popt` that caused `-k` to fail with no keeps. * 2000-08-22 - 2000-08-23 ** Ported `mllex` and `mlyacc` from SML/NJ * 2000-08-20 - 2000-08-21 ** Added ability to use a `.cm` file as input to MLton. * 2000-08-16 ** Ported `mlprof` to SML. ** Fixed bug in `library/basic/assert.sml` that caused asserts to be run even when `MLton.debug = false`. * 2000-08-15 ** Fixed bug in backend -- computation of `maxFrameSize` was wrong. It didn't count slots in frames that didn't make nontail calls. This could lead to the stack being overwritten because a stack limit check didn't guarantee enough space, and lead to a segfault. ** Fixed bug in `gc.c` `newThreadOfSize`. If the thread allocation caused a gc, then the stack wasn't forwarded, leading to a segfault. The solution was to ensure enough memory all at once, and then fill in both objects. * 2000-08-14 ** Changed limit checks so that checks < 512 bytes are replaced by a check for 0 bytes. The runtime also moves the limit down by 512. This is done so that the common case, a small limit check, has less code and is faster. ** Fixed bug in `cps/cps-tree.fun`. `Program.hasPrim` returned `true` for any program that had *any* primapp, not just programs satisfying the predicate. This caused `cps/once.fun` to be overly conservative, since it thought that every program used continuations. * 2000-08-10 ** Fixed bug in CPS typechecker. It didn't enforce that handlers should be defined before any reference to them -- including implicit references in `HandlerPops`. This caused an evil bug in the liveness analysis where a variable that was only live in the handler was missed in a continuation because the liveness for the handler wasn't computed yet. ** Limited the size for moving up limit checks for arrays whose size is known at compile time to avoid huge limit checks getting moved into loops. ** added `-indent`, `-kp`, `-show-types` switches. ** Put optimization in CPS IL suggested by Neal Glew. It determines for each toplevel function if it can raise an exception to its caller. Also, it removes `HanderPush` and `HandlerPop` for handlers that are not on top of the stack for any nontail call. * 2000-08-08 ** Changed register allocator so that continuation formals can be allocated in pseudo registers -- they aren't necessarily forced to the stack. * 2000-08-03 ** Fixed bug in constant folding. `Word8.>>` had been used to implement `Word8.~>>`. ** Fixed bug in allocate registers that was not forcing the size argument to `Primitive.Array.array` to be a stack slot. This could cause problems if there was a thread switch in the limit check, since upon return the size pseudo register would have a bogus value. * 2000-08-01 ** Turned back on XML simplification after monomorphisation. * 2000-07-31 ** Fixed bug in `MLton.Itimer.set` that caused the time to be doubled. ** Fixed bug in `MLton.Thread` that made it look like asynchronous exceptions were allowed by `throw`-ing an exception raising thunk to an interrupted thread obtained via a signal handler. Attempting asynchronous exceptions will now cause process death, with a helpful error message. * 2000-07-27 ** Updated docs to include `structure World: MLTON_WORLD` in `MLton` structure. ** Added toplevel signatures `MLTON_{CONT, ..., WORLD}` to basis library. ** Fixed broken link in docs to CM in `cmcat` section. * 2000-07-26 ** Eliminated `GC_switchToThread` and `Thread_switchTo1`, since the inlined version `Thread_switchTo` is all that's needed, and Matt's X86 backend now handles it. ** Added `MLton.Signal.vtalrm`, needed for `Itimer.Set{which = Itimer.Virtual, ...}`. * 2000-07-25 ** Added `MLton.Socket.shutdownWrite`. * 2000-07-21 ** Updated `mlton-lib.c` `MLton_bug` with new email (MLton@sourcelight.com). * 2000-07-19 ** Fixed `Posix.Process.kill` to check for errors. * 2000-07-18 ** Fixed the following `Posix.ProcEnv` functions to check for errors: `setgid`, `setpgid`, `setsid`, `setuid`. ** Fixed `doc/examples/callcc.sml`. == Version 20000712 Here are the changes from the 1999-07-12 to the 20000712 version. === Details * 2000-06-10 - 2000-07-12 ** Too many changes to count: bug fixes, new basis library modules, optimizer improvements. * 2000-06-30 ** Fixed bug in monomorphiser that caused programs with non-value carrying exception declarations in polymorphic functions to have a compile-time error because of a duplicate label. The problem was that the exception constructor wasn't duplicated. * 2000-05-22 - 2000-06-10 ** Finished the changes for the new CPS IL. * 2000-01-01 ** Fixed some errors in the basis library: *** `Real.copySign` *** `Posix.FileSys.fpathconf` *** `Posix.IO.{lseek, getlk, setlk, setlkw}` *** `Posix.ProcEnv.setpgid` *** `Posix.TTY.getattr` *** `System.FileSys.realPath` * 1999-12-22 ** Fixed bug in `src/closure-convert/abstract-value.fun` that caused a compiler failure whenever a program had a vector where the element type contained an `->`. * 1999-12-10 ** Changed dead code elimination in `core-ml/dead-code.fun` so that wildcard declarations (`val _ = ...`) in the basis are kept. Changed places in the basis library to take advantage of this. ** Added `setTopLevelHander` primitive so that the basis library code can define the toplevel handler. ** Changed `basis-library/misc/suffix.sml` to call `OS.Process.exit`. Took out `Halt` transfer from CPS, since the program never should reach it. ** Cleaned up `basis-library/system/{process.sml, unix.sml}` to use the new signal handling stuff. * 1999-11-28 - 1999-12-20 ** Added support for threads and cleaned up signal handling. This involved a number of changes: *** The stack is now allocated as just another kind of heap object. *** Limit checks are inserted at all loop headers, whether or not there is any allocation. This is to ensure that the signal handler always has a chance to get called. *** The register allocator puts more variables in stack slots. The new rule is that a variable goes in a stack slot if it is ever live across a nontail call, in a handler, or (this is the new part) across a limit check. *** Arguments are passed on the stack, with the convention determined by argument types. *** The "locals" array of pointers that was copied to/from for GC is now gone, because no registers (in particular no pointer valued registers) can be live at a limit check point. * 1999-11-21 ** Runtime system *** Fixed a bug introduced by the signal code (presumably on 1999-08-09) that caused a gc to *not* be performed when doing a save world. This caused the heaps created by save world to be the same size as the heap -- not the live data. This was quite bad. *** Cleaned up the `Makefile`. Add make depend. *** Added max gc pause to `gc-summary` info. *** Move heap translation variables that had been file statics into the `GC_state`. ** Made `structure Position` available at toplevel. ** Basis Library *** Added `MLton.loadWorld` ** Added `Primitive.usesCallcc` ** Added `Primitive.safe` ** Removed special size functions from `cps/save-world` -- they are no longer necessary since size doesn't do a gc. ** Fixed another (sigh) bug in `cps/simplify-types.fun` that could cause it to not terminate. * 1999-11-16 ** Cleaned up `backend/machine.fun` a bit so that it spits out macros for allocation of objects and bumping of frontier. Added macros `MLTON_object` and `MLTON_incFrontier` to `include/mlton-lib.h`. ** Fixed a bug in `backend/limit-check.fun` that caused loops to not be detected if they were only reached by a case branch. This could cause there to be loop that allocates with no limit check. Needless to say, this could cause a segfault if the loop ran for long enough. * 1999-10-18 ** Added basis library function `Array2.copy`. * 1999-08-15 ** Turned off globalization of ref cells (`closure-convert/globalize.fun`) because it interacts badly with serialization. * 1999-08-13 ** Fixed bug in `mlton-lib.h` in `MLTON_allocArrayNoPointers` that was triggered when `bytesPerElt == 0`. The problem was that it wasn't reserving space for the forwarding pointer. This could cause a segfault. * 1999-08-08 and 1999-08-09 ** Added support for signal handling. * 1999-08-07 ** Fixed bugs in `Array.tabulate` (and other `tabulate` variants) caused if the function argument used `callcc`. * 1999-08-01 ** Added serialization, which was mostly code in `src/runtime/gc.c`. + `GC_serialize` converts an object to a `Word8Vector.vector`. + `GC_deserialize` undoes the conversion. + (de)Serialization should work for all objects except for functions, because I haven't yet added the support in the flow analysis. * 1999-07-31 ** Cleaned up the GC. Changed headers, by stealing a bit from the number of non pointers and making it a mark bit (used in `GC_size`). ** Rewrote `GC_size` so that it runs in time proportional to the number of pointers in the object. It does a depth-first-search now, using toSpace to hold the stack. * 1999-07-30 ** Fixed bug in `SUBSTRING`. `getc` had the wrong type. This bug wasn't noticed because MLton doesn't do enough type checking. ** Fixed bug (segfault) caused when a GC immediately followed a throw. * 1999-07-29 ** Fixed bug in `Date.fmt` (`basis-library/system/date.sml`). It was not setting `Tm.buf`, and hence the time was always 0 unless there had been a previous call to `setTmBuf`. * 1999-07-28 ** Fixed bugs in `Posix.IO.FLock.{getlk,setlk,setlkw}`, which would cause compilation to fail because `FLock.toInt` was defined as the C `castInt`, which no longer exists. Instead, expand `FLock.toInt` to `MLTON_pointerToInt`, which was added to `include/mlton-lib.h`. ** Changed `Posix.Primitive.Flock` to `Posix.Primitive.FLock`. ** Added `MLTON_chown`, `MLTON_ftruncate` to `include/mlton-posix.h`. They were missing. This would cause compilation of any program using `Posix.FileSys.{chown,ftruncate}` to fail. Also made it so all of the primitives in `basis-library/posix/primitive.sml` use `MLTON_` versions of functions, even if a wrapper is unnecessary. * 1999-07-25 ** Added some other missing signature definitions to toplevel. * 1999-07-24 ** Added missing `OS_*` signature definitions to `basis-library/top-level/top-level.sml`. * 1999-07-19 ** Fixed bug in `basis-library/arrays-and-vectors/mono-array.sml`. Used `:>` instead of `:` so that the monomorphic array types are abstract. == Version 19990712 Here are the changes from the 1999-03-19 version to the 1999-07-12 version. === Details * 1999-07-12 ** Changed `src/backend/machine.fun` so that the 'pointer locals' array is only as large as neccessary in order to copy all pointer-valued locals, not as large as the number of pointer-valued locals. * 1999-07-11 ** Rewrote `src/backend/allocate-registers.fun` so that it does a better job of sharing "registers" (i.e. C local variables) and stack slots. This should cut down on the amount of copying that has to happen before and after a gc. It should also cut down on the size of stack slots. * 1999-07-10 ** Fixed a bug in `src/backend/parallel-move.fun` that should have been triggered on most any parallel move. I guess parallel moves almost never happened due to the old register allocation strategy -- but, with the new one (see note for 1999-07-12) parallel moves will be frequent. * 1999-06-27 ** Fixed `src/main.sml` so that when compiling `-p`, the `.c` file is compiled `-g` and the `.o` is linked `-p`. ** In `bakend/machine.fun`, added profiling comments before chunkswitches and put in an optimization to avoid printing repeated profiling comments. Also, profiling comments are only output when compiling `-p`. * 1999-06-17 ** Changed `-i` to `-inline`, `-f` to `-flatten`, `-np` to `-no-polyvariance`, `-u` to `-unsafe`. ** Added `-i`, `-I`, `-l`, `-L` flags for includes and libraries. ** Updated documentation for these options and for ffi. * 1999-06-16 ** Hardwired version number in `src/control/control.sml`. As it stood, the version number was computed when MLton was built after someone downloaded it, which was clearly wrong. * 1999-06-16 ** Fixed undefined variable `time` in `GC_done` in `src/runtime/gc.c`. * 19990-06-08 ** in `include/mlton-lib.h`: *** removed `#include ` *** added `#include ` *** and deleted all of the function signatures I had copied from `math.h` ** Changed `Real.{minNormalPos, minPos, maxFinite}` so that they are computed in `real.sml` instead of appearing as constants in the C. * 1999-06-07 `IntInf.pow` added to basis library. * 1999-06-04 ** `bin/mlton` changed to use `.arch-n-opsys` if it exists. * 1999-06-03 ** `src/Makefile` changed to use `sml-cm` instead of `sml` * 1999-05-10 ** Patch to `src/atoms/small-int-inf.fun` to work around a bug in the SML/NJ implementation of bignums. This bug was causing some hex bignum constants to be lexed incorrectly. * 1999-04-15 ** Comments emitted in C code for profiling. The comments identify the CPS function responsible for each C statement. * 1999-04-15 ** `callcc` and `throw` added. * 1999-04-15 ** Bug in `src/cps/simplify-types` fixed. The bug caused nontermination whenever there was a circular datatype with a vector on the rhs. E.g. `datatype t = T of t vector` == Version 19990319 Here are the changes from the 1998-08-26 version to the 1999-03-19 version. === Summary * Compile time and code size have decreased. * Runtime performance of executables has improved. * Large programs can now be compiled. * MLton is self hosting. * The basis library is mostly complete and many bugs have been fixed. * The monomorphiser (`-m`) is no longer available. * The heap and stack are automatically resized. * There are now facilities for heap checkpointing (`MLton.saveWorld`) and object size computation (`MLton.size`). * MLton uses the GNU multiprecision (GnuMP) library to provide a fast implementation of `IntInf`. mlton-20210117+dfsg/Dockerfile000066400000000000000000000006661416264345000160300ustar00rootroot00000000000000FROM ubuntu:latest # Install the dependencies. We'll use the ubuntu provided mlton to bootstrap our local build. RUN apt-get update -qq \ && apt-get install -qq git build-essential libgmp-dev mlton mlton-tools # Copy the current directory (MLton source root) to a location within the container & move there COPY . /root/mlton WORKDIR /root/mlton # Build from source & install RUN make \ && make install ENTRYPOINT ["make", "check"] mlton-20210117+dfsg/LICENSE000066400000000000000000000030661416264345000150400ustar00rootroot00000000000000This is the license for MLton, a whole-program optimizing compiler for the Standard ML programming language. The license is an instance of the Historical Permission Notice and Disclaimer (HPND) license, which is an open source (https://opensource.org/licenses/HPND) and free software (https://www.gnu.org/licenses/license-list.en.html#HPND) license. Send comments and questions to MLton@mlton.org. MLton COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright (C) 1999-2021 Henry Cejtin, Matthew Fluet, Suresh Jagannathan, and Stephen Weeks. Copyright (C) 1997-2000 by the NEC Research Institute Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the above copyright holders, or their entities, not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The above copyright holders disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the above copyright holders be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20210117+dfsg/Makefile000066400000000000000000000552321416264345000154750ustar00rootroot00000000000000## Copyright (C) 2009,2011,2013,2017-2020 Matthew Fluet. # Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := . include $(ROOT)/Makefile.config ###################################################################### .PHONY: all all: $(MAKE) dirs $(MAKE) runtime $(MAKE) compiler CHECK_FIXPOINT=false # tools0 + mlton0 -> mlton1 $(MAKE) script $(MAKE) basis $(MAKE) libraries $(MAKE) tools CHECK_FIXPOINT=false # tools0 + mlton1 -> tools1 ifeq (2, $(firstword $(sort $(BOOTSTRAP_STYLE) 2))) $(MAKE) compiler-clean $(MAKE) compiler SELF_COMPILE=true CHECK_FIXPOINT=false # tools1 + mlton1 -> mlton2 ifeq (3, $(firstword $(sort $(BOOTSTRAP_STYLE) 3))) $(MAKE) tools-clean $(MAKE) tools CHECK_FIXPOINT=true # tools1 + mlton2 -> tools2; tools2 == tools1 $(MAKE) compiler-clean $(MAKE) compiler SELF_COMPILE=true CHECK_FIXPOINT=true # tools2 + mlton2 -> mlton3; mlton3 == mlton2 endif endif @echo 'Build of MLton succeeded.' .PHONY: clean clean: $(SRC)/bin/clean --exclude package .PHONY: clean-git clean-git: $(FIND) . -type d -name .git -prune -exec $(RM) '{}' ';' .PHONY: check check: ./bin/regression $(CHECK_ARGS) $(eval $(MK_SHOW_CONFIG)) ###################################################################### .PHONY: basis-no-check basis-no-check: $(RM) "$(LIB)/sml/basis" $(MKDIR) "$(LIB)/sml/basis" ( \ cd "$(SRC)/basis-library" && \ $(FIND) . -type f '(' -name '*.mlb' -o -name '*.sml' -o -name '*.sig' -o -name '*.fun' ')' | \ $(XARGS) $(TAR) cf - | \ ( cd "$(LIB)/sml/basis" && $(TAR) xf - ) \ ) .PHONY: basis-check basis-check: @echo 'Type checking basis.' "$(BIN)/$(MLTON)" -disable-ann deadCode -stop tc '$$(SML_LIB)/basis/libs/all.mlb' >/dev/null .PHONY: basis basis: $(MAKE) basis-no-check $(MAKE) basis-check .PHONY: compiler compiler: $(MAKE) -C "$(SRC)/mlton" ifeq (true, $(CHECK_FIXPOINT)) $(DIFF) -b "$(SRC)/mlton/$(MLTON_OUTPUT)$(EXE)" "$(LIB)/$(MLTON_OUTPUT)$(EXE)" endif $(CP) "$(SRC)/mlton/$(MLTON_OUTPUT)$(EXE)" "$(LIB)/" .PHONY: compiler-clean compiler-clean: $(MAKE) -C "$(SRC)/mlton" clean .PHONY: dirs dirs: $(MKDIR) "$(BIN)" "$(LIB)" "$(INC)" $(MKDIR) "$(LIB)/targets/$(TARGET)/include" $(MKDIR) "$(LIB)/targets/$(TARGET)/sml" .PHONY: docs docs: $(MAKE) -C "$(SRC)/doc/guide" define LIBRARIES_NO_CHECK_TEMPLATE $(RM) "$(LIB)/sml/$(1)" $(MKDIR) "$(LIB)/sml/$(1)" ( \ cd "$(SRC)/lib/$(1)$(2)" && \ $(FIND) . '!' -path '*/.cm/*' $(3) -type f '(' -name '*.mlb' -o -name '*.sml' -o -name '*.sig' -o -name '*.fun' ')' | \ $(XARGS) $(TAR) cf - | \ ( cd "$(LIB)/sml/$(1)" && $(TAR) xf - ) \ ) endef .PHONY: libraries-no-check libraries-no-check: $(MAKE) -C "$(SRC)/lib/ckit-lib" $(call LIBRARIES_NO_CHECK_TEMPLATE,ckit-lib,/ckit/src,) $(call LIBRARIES_NO_CHECK_TEMPLATE,cml,,'!' -path '*/tests/*') $(MAKE) -C "$(SRC)/lib/mllpt-lib" $(call LIBRARIES_NO_CHECK_TEMPLATE,mllpt-lib,/ml-lpt/lib,) $(MAKE) -C "$(SRC)/lib/mlnlffi-lib" $(call LIBRARIES_NO_CHECK_TEMPLATE,mlnlffi-lib,,) $(MAKE) -C "$(SRC)/lib/mlrisc-lib" $(call LIBRARIES_NO_CHECK_TEMPLATE,mlrisc-lib,/MLRISC,'!' -path '*/demo/*' '!' -path '*/Tools/*' '!' -path './autoload.sml' '!' -path './make*.sml') $(call LIBRARIES_NO_CHECK_TEMPLATE,mlyacc-lib,,) $(MAKE) -C "$(SRC)/lib/smlnj-lib" $(call LIBRARIES_NO_CHECK_TEMPLATE,smlnj-lib,/smlnj-lib,'!' -path '*/examples/*' '!' -path '*/tests/*' '!' -path '*/Tests/*') define LIBRARIES_CHECK_TEMPLATE @echo "Type checking $(1) library." "$(BIN)/$(MLTON)" -disable-ann deadCode -stop tc '$$(SML_LIB)/$(1)/$(1).mlb' >/dev/null endef .PHONY: libraries-check libraries-check: $(call LIBRARIES_CHECK_TEMPLATE,ckit-lib) $(call LIBRARIES_CHECK_TEMPLATE,cml) $(call LIBRARIES_CHECK_TEMPLATE,mllpt-lib) $(call LIBRARIES_CHECK_TEMPLATE,mlnlffi-lib) $(call LIBRARIES_CHECK_TEMPLATE,mlrisc-lib) $(call LIBRARIES_CHECK_TEMPLATE,mlyacc-lib) $(call LIBRARIES_CHECK_TEMPLATE,smlnj-lib) .PHONY: libraries libraries: $(MAKE) libraries-no-check $(MAKE) libraries-check .PHONY: runtime runtime: @echo 'Compiling MLton runtime system for $(TARGET).' $(MAKE) -C "$(SRC)/runtime" $(CP) "$(SRC)/include/"*.h "$(INC)/" $(CP) "$(SRC)/runtime/"*.a "$(LIB)/targets/$(TARGET)/" $(CP) "$(SRC)/runtime/gen/constants" "$(LIB)/targets/$(TARGET)/" $(CP) "$(SRC)/runtime/gen/c-types.sml" "$(LIB)/targets/$(TARGET)/sml/" echo "$(TARGET_OS)" > "$(LIB)/targets/$(TARGET)/os" echo "$(TARGET_ARCH)" > "$(LIB)/targets/$(TARGET)/arch" $(CP) "$(SRC)/runtime/gen/basis-ffi.sml" \ basis-library/primitive/basis-ffi.sml $(CP) "$(SRC)/runtime/"*.h "$(INC)/" $(MV) "$(INC)/c-types.h" "$(LIB)/targets/$(TARGET)/include" for d in basis basis/Real basis/Word gc platform util; do \ $(MKDIR) "$(INC)/$$d"; \ $(CP) "$(SRC)/runtime/$$d/"*.h "$(INC)/$$d"; \ done .PHONY: script script: $(SED) \ -e "s;^LIB_REL_BIN=.*;LIB_REL_BIN=\"$(LIB_REL_BIN)\";" \ -e "s;^EXE=.*;EXE=\"$(EXE)\";" \ -e "s;^CC=.*;CC=\"$(CC)\";" \ -e "s;^GMP_INC_DIR=.*;GMP_INC_DIR=\"$(WITH_GMP_INC_DIR)\";" \ -e "s;^GMP_LIB_DIR=.*;GMP_LIB_DIR=\"$(WITH_GMP_LIB_DIR)\";" \ -e 's/mlton-compile/$(MLTON_OUTPUT)/' \ < "$(SRC)/bin/mlton-script" > "$(BIN)/$(MLTON)" $(CHMOD) a+x "$(BIN)/$(MLTON)" $(CP) "$(SRC)/bin/static-library" "$(LIB)" ifeq (mingw, $(TARGET_OS)) $(CP) "$(SRC)/bin/static-library.bat" "$(LIB)" endif ifeq (true, $(CHECK_FIXPOINT)) define TOOLS_TEMPLATE_CHECK_FIXPOINT $(DIFF) -b "$(SRC)/$(1)/$(1)$(EXE)" "$(BIN)/$(1)$(EXE)" endef else define TOOLS_TEMPLATE_CHECK_FIXPOINT endef endif define TOOLS_TEMPLATE +$(MAKE) -C "$(SRC)/$(1)" $(call TOOLS_TEMPLATE_CHECK_FIXPOINT,$(1)) $(CP) "$(SRC)/$(1)/$(1)$(EXE)" "$(BIN)/" endef .PHONY: tools tools: $(call TOOLS_TEMPLATE,mllex) $(call TOOLS_TEMPLATE,mlyacc) $(call TOOLS_TEMPLATE,mlprof) $(call TOOLS_TEMPLATE,mlnlffigen) .PHONY: tools-clean tools-clean: $(MAKE) -C "$(SRC)/mllex" clean $(MAKE) -C "$(SRC)/mlyacc" clean $(MAKE) -C "$(SRC)/mlprof" clean $(MAKE) -C "$(SRC)/mlnlffigen" clean ###################################################################### # debugged, profiled, traced targets .PHONY: debugged debugged: $(MAKE) -C "$(SRC)/mlton" MLTON_NAME="$(MLTON_NAME) (debug)" MLTON_OUTPUT=$(MLTON_OUTPUT).debug \ MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -debug true -const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -disable-pass 'deepFlatten'" $(CP) "$(SRC)/mlton/$(MLTON_OUTPUT).debug$(EXE)" "$(LIB)/" $(SED) -e 's/$(MLTON_OUTPUT)/$(MLTON_OUTPUT).debug/' \ < "$(BIN)/$(MLTON)" \ > "$(BIN)/$(MLTON).debug" $(CHMOD) u+x "$(BIN)/$(MLTON).debug" define PROFILED_TEMPLATE +$(MAKE) -C "$(SRC)/mlton" MLTON_NAME="$(MLTON_NAME) (profile-$(1))" MLTON_OUTPUT=$(MLTON_OUTPUT).$(1) \ MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -profile $(1)" $(CP) "$(SRC)/mlton/$(MLTON_OUTPUT).$(1)$(EXE)" "$(LIB)/" $(SED) -e "s/$(MLTON_OUTPUT)/$(MLTON_OUTPUT).$(1)/" \ < "$(BIN)/$(MLTON)" \ >"$(BIN)/$(MLTON).$(1)" $(CHMOD) u+x "$(BIN)/$(MLTON).$(1)" endef .PHONY: profiled-alloc profiled-alloc: $(call PROFILED_TEMPLATE,alloc) .PHONY: profiled-count profiled-count: $(call PROFILED_TEMPLATE,count) .PHONY: profiled-time profiled-time: $(call PROFILED_TEMPLATE,time) .PHONY: profiled profiled: $(MAKE) profiled-alloc $(MAKE) profiled-count $(MAKE) profiled-time .PHONY: traced traced: $(MAKE) -C "$(SRC)/mlton" MLTON_NAME="$(MLTON_NAME) (trace)" MLTON_OUTPUT=$(MLTON_OUTPUT).trace \ MLTON_COMPILE_ARGS="$(MLTON_COMPILE_ARGS) -const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -disable-pass 'deepFlatten'" $(CP) "$(SRC)/mlton/$(MLTON_OUTPUT).trace$(EXE)" "$(LIB)/" $(SED) -e 's/$(MLTON_OUTPUT)/$(MLTON_OUTPUT).trace/' \ < "$(BIN)/$(MLTON)" \ > "$(BIN)/$(MLTON).trace" $(CHMOD) u+x "$(BIN)/$(MLTON).trace" ###################################################################### # smlnj targets .PHONY: bootstrap-smlnj bootstrap-smlnj: $(MAKE) smlnj-mlton $(RM) "$(BIN)/$(MLTON)" $(MAKE) BOOTSTRAP_MLTON=$(MLTON).smlnj all smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null` && $(RM) "$(LIB)/$(MLTON_OUTPUT)-smlnj.$$smlnj_heap_suffix" $(RM) "$(BIN)/$(MLTON).smlnj" .PHONY: smlnj-mlton smlnj-mlton: $(MAKE) dirs $(MAKE) runtime $(MAKE) -C "$(SRC)/mlton" smlnj-mlton smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null` && $(CP) "$(SRC)/mlton/$(MLTON_OUTPUT)-smlnj.$$smlnj_heap_suffix" "$(LIB)/" $(MAKE) script $(MAKE) basis-no-check $(MAKE) libraries-no-check $(SED) \ -e 's;doitMLton "$$@";# doitMLton "$$@";' \ -e 's;doitPolyML "$$@";# doitPolyML "$$@";' \ < "$(BIN)/$(MLTON)" \ > "$(BIN)/$(MLTON).smlnj" $(CHMOD) u+x "$(BIN)/$(MLTON).smlnj" @echo 'Build of MLton (with SML/NJ) succeeded.' .PHONY: smlnj-mlton-x2 smlnj-mlton-x2: $(MAKE) SMLNJ_CM_SERVERS_NUM=2 smlnj-mlton .PHONY: smlnj-mlton-x4 smlnj-mlton-x4: $(MAKE) SMLNJ_CM_SERVERS_NUM=4 smlnj-mlton .PHONY: smlnj-mlton-x8 smlnj-mlton-x8: $(MAKE) SMLNJ_CM_SERVERS_NUM=8 smlnj-mlton .PHONY: smlnj-mlton-x16 smlnj-mlton-x16: $(MAKE) SMLNJ_CM_SERVERS_NUM=16 smlnj-mlton ###################################################################### # polyml targets .PHONY: bootstrap-polyml bootstrap-polyml: $(MAKE) polyml-mlton $(RM) "$(BIN)/$(MLTON)" $(MAKE) BOOTSTRAP_MLTON=$(MLTON).polyml all $(RM) "$(LIB)/$(MLTON)-polyml$(EXE)" $(RM) "$(BIN)/$(MLTON).polyml" .PHONY: polyml-mlton polyml-mlton: $(MAKE) dirs $(MAKE) runtime $(MAKE) -C "$(SRC)/mlton" polyml-mlton $(CP) "$(SRC)/mlton/mlton-polyml$(EXE)" "$(LIB)/" $(MAKE) script $(MAKE) basis-no-check $(MAKE) libraries-no-check $(SED) \ -e 's;doitMLton "$$@";# doitMLton "$$@";' \ -e 's;doitSMLNJ "$$@";# doitSMLNJ "$$@";' \ < "$(BIN)/$(MLTON)" \ > "$(BIN)/$(MLTON).polyml" $(CHMOD) u+x "$(BIN)/$(MLTON).polyml" @echo 'Build of MLton (with Poly/ML) succeeded.' ###################################################################### # version target .PHONY: version version: @echo 'Instantiating version numbers.' $(SED) \ -e "s/^MLTON_VERSION := .*/MLTON_VERSION := $(MLTON_VERSION)/" \ -e "s/^RELEASE := .*/RELEASE := true/" \ < "$(SRC)/Makefile.config" \ > z && \ $(MV) z "$(SRC)/Makefile.config"; ###################################################################### # install and release targets prefix := $(PREFIX) exec_prefix := $(prefix) bindir := $(exec_prefix)/bin datarootdir := $(prefix)/share docdir := $(datarootdir)/doc/mlton libdir := $(exec_prefix)/lib mandir := $(datarootdir)/man man1dir := $(mandir)/man1 TBIN := $(DESTDIR)$(bindir) TLIB := $(DESTDIR)$(libdir)/mlton TMAN := $(DESTDIR)$(man1dir) TDOC := $(DESTDIR)$(docdir) TEXM := $(TDOC)/examples TLIB_REL_TBIN := $(shell $(call TGT_REL_SRC,$(TLIB),$(TBIN))) GZIP_MAN := true ifeq ($(findstring $(TARGET_OS), openbsd solaris), $(TARGET_OS)) GZIP_MAN := false endif .PHONY: install install: install-no-strip install-strip MAN_PAGES := mlton.1 MAN_PAGES := $(MAN_PAGES) \ mllex.1 \ mlnlffigen.1 \ mlprof.1 \ mlyacc.1 .PHONY: install-no-strip install-no-strip: $(MKDIR) "$(TBIN)" "$(TLIB)" $(CP) "$(BIN)/." "$(TBIN)/" $(SED) \ -e "s;^LIB_REL_BIN=.*;LIB_REL_BIN=\"$(TLIB_REL_TBIN)\";" \ < "$(BIN)/$(MLTON)" > "$(TBIN)/$(MLTON)" $(CHMOD) a+x "$(TBIN)/$(MLTON)" $(CP) "$(LIB)/." "$(TLIB)/" $(MKDIR) "$(TMAN)" cd "$(SRC)/man" && $(CP) $(MAN_PAGES) "$(TMAN)/" ifeq (true, $(GZIP_MAN)) cd "$(TMAN)" && $(GZIP) --force --best $(MAN_PAGES); endif STRIP_PROGS := "$(TLIB)/$(MLTON_OUTPUT)$(EXE)" STRIP_PROGS := $(STRIP_PROGS) \ "$(TBIN)/mllex$(EXE)" \ "$(TBIN)/mlnlffigen$(EXE)" \ "$(TBIN)/mlprof$(EXE)" \ "$(TBIN)/mlyacc$(EXE)" .PHONY: install-strip install-strip: install-no-strip for f in $(STRIP_PROGS); do $(STRIP) "$$f"; done REGRESSION_EXAMPLES := \ callcc.sml command-line.sml hello-world.sml same-fringe.sml \ signals.sml size.sml taut.sml thread1.sml thread2.sml \ thread-switch.sml timeout.sml .PHONY: install-docs install-docs: $(MKDIR) "$(TDOC)" "$(TDOC)/license" ( \ cd "$(SRC)" && \ $(CP) CHANGELOG.adoc README.adoc "$(TDOC)/" && \ $(CP) LICENSE "$(TDOC)/license/MLton-LICENSE" \ ) ( \ cd "$(SRC)/doc" && \ $(FIND) examples -type f '!' -name .gitignore \ | $(XARGS) $(TAR) cf - \ | ( cd "$(TDOC)/" && $(TAR) xf - ) \ ) ( \ cd "$(SRC)/doc" && \ $(FIND) license -type f '!' -name .gitignore \ | $(XARGS) $(TAR) cf - \ | ( cd "$(TDOC)/" && $(TAR) xf - ) \ ) if [ -d "$(SRC)/doc/guide/localhost" ]; then \ $(CP) "$(SRC)/doc/guide/localhost" "$(TDOC)/guide"; \ fi ( \ cd "$(SRC)/util" && \ $(FIND) cm2mlb -type f '!' -name .gitignore \ | $(XARGS) $(TAR) cf - \ | ( cd "$(TDOC)/" && $(TAR) xf - ) \ ) ( \ cd "$(SRC)/regression" && \ $(CP) $(REGRESSION_EXAMPLES) "$(TEXM)/" \ ) .PHONY: source-release source-release: $(MAKE) clean $(MAKE) MLTON_VERSION=$(MLTON_VERSION) version $(MAKE) -C doc/guide $(TAR) cvzf ../mlton-$(MLTON_VERSION).src.tgz \ --exclude .git --exclude package \ --transform "s@^@mlton-$(MLTON_VERSION)/@S" \ * MLTON_BINARY_RELEASE := 1 MLTON_BINARY_RELEASE_SUFFIX := MLTON_BINARY_RELEASE_NAME := mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(TARGET_ARCH)-$(TARGET_OS)$(MLTON_BINARY_RELEASE_SUFFIX) MLTON_BINARY_RELEASE_WITH_DOCS := true .PHONY: binary-release binary-release: $(MAKE) all ifeq (true,$(MLTON_BINARY_RELEASE_WITH_DOCS)) $(MAKE) docs endif $(RM) "$(SRC)/$(MLTON_BINARY_RELEASE_NAME)" $(MKDIR) "$(SRC)/$(MLTON_BINARY_RELEASE_NAME)" $(MAKE) DESTDIR="$(SRC)/$(MLTON_BINARY_RELEASE_NAME)" PREFIX="" install ifeq (true,$(MLTON_BINARY_RELEASE_WITH_DOCS)) $(MAKE) DESTDIR="$(SRC)/$(MLTON_BINARY_RELEASE_NAME)" PREFIX="" install-docs endif $(CP) "$(SRC)/Makefile.binary" "$(SRC)/$(MLTON_BINARY_RELEASE_NAME)/Makefile" $(CP) "$(SRC)/CHANGELOG.adoc" "$(SRC)/LICENSE" "$(SRC)/README.adoc" "$(SRC)/$(MLTON_BINARY_RELEASE_NAME)/" $(TAR) cvzf $(MLTON_BINARY_RELEASE_NAME).tgz $(MLTON_BINARY_RELEASE_NAME) $(RM) $(MLTON_BINARY_RELEASE_NAME) ###################################################################### # remote-bootstrap and remote-add-cross-target # The `remote-bootstrap` goal automates the process of bootstraping MLton on a # remote machine that doesn't have a suitable pre-compiled `mlton` binary. It # works as follows: # * send the current sources to a remote machine (using ssh) # * build the MLton runtime system on the remote machine # * receive the built runtime system from the remote machine as a new target on # the host machine # * build bootstrap compiler sources on the host machine for the new target # * send the boostrap sources to the remote machine # * build the boostrap compiler on the remote machine using the boostrap # compiler sources # * complete the MLton build on the remote machine with the boostrap compiler to # obtain a boot package # * build MLton on the remote machine from clean sources using the boot package # * receive the built binary release from the remote machine # # The `remote-add-cross-target` goal automates the process of adding a cross # compiler target. It works as follows: # * send the current sources to a remote machine (using ssh) # * build the MLton runtime system on the remote machine # * receive the built runtime system from the remote machine as a new target on # the host machine # # # For both `remote-bootstrap` and `remote-add-cross`, the following `Makefile` # variables are used: # * REMOTE_MACHINE (required): Specify the remote machine to be used as an # `ssh` destination, either `[user@]hostname` or # `ssh://[user@]hostname[:port]`. # * REMOTE_TMP: Specify (absolute) path on remote machine for building; default # is `/tmp`. # * REMOTE_MAKE: Specify `make` on remote machine. # * REMOTE_MAKEFLAGS: Specify `Makefile` variables to set when invoking `make` # on the remote machine. # For `remote-add-cross`, the following additional `Makefile` variable is used: # * CROSS_TARGET (required): Specify target machine triple for host # cross-compiler; that is the value of `` in `-gcc` or # `` in `clang -target=` on the host machine, such as # `arm-linux-gnu`. # # # For example, on OpenBSD, GNU Make is named `gmake` (and `make` is BSD Make) # and GMP is provided at `/usr/local` (and not on the default search paths). To # boostrap on an OpenBSD virtual machine (with localhost port 2222 forwarded to # guest VM port 22), one could use: # # $ make REMOTE_MACHINE=ssh://localhost:2222 REMOTE_MAKE=gmake REMOTE_MAKEFLAGS=WITH_GMP_DIR=/usr/local remote-bootstrap ifneq (,$(findstring remote-,$(MAKECMDGOALS))) ifneq (,$(findstring dirty,$(MLTON_VERSION))) $(warning 'MLTON_VERSION' appears dirty; $(MLTON_VERSION)) endif ifeq (,$(REMOTE_MACHINE)) $(error 'REMOTE_MACHINE' not defined) endif SSH := ssh ifeq (false,$(shell $(SSH) $(REMOTE_MACHINE) true > /dev/null 2>&1 || echo false)) $(error '$(SSH) $(REMOTE_MACHINE) true' failed) endif REMOTE_TMP := /tmp REMOTE_ROOT := $(REMOTE_TMP)/mlton-$(MLTON_VERSION) REMOTE_BASH := bash REMOTE_TAR := $(TAR) REMOTE_CP := $(CP) REMOTE_MKDIR := $(MKDIR) REMOTE_RM := $(RM) REMOTE_MAKE := make REMOTE_MAKEFLAGS := REMOTE_XMAKEFLAGS := CHECK_MLCMD= REMOTE_PLATFORM := $(shell cat bin/platform | $(SSH) $(REMOTE_MACHINE) "$(REMOTE_BASH) -s") REMOTE_ARCH := $(patsubst HOST_ARCH=%,%,$(filter HOST_ARCH=%,$(REMOTE_PLATFORM))) REMOTE_OS := $(patsubst HOST_OS=%,%,$(filter HOST_OS=%,$(REMOTE_PLATFORM))) REMOTE_TARGET := $(REMOTE_ARCH)-$(REMOTE_OS) CROSS_TARGET := $(REMOTE_ARCH)-$(REMOTE_OS) .PHONY: remote-bootstrap remote-bootstrap: $(MAKE) remote--send-src $(MAKE) remote--make-version $(MAKE) remote--make-dirs $(MAKE) remote--make-runtime $(MAKE) remote--recv-runtime $(MAKE) remote--gen-bootstrap-compiler-files $(MAKE) remote--send-bootstrap-compiler-files $(MAKE) remote--make-bootstrap-compiler $(MAKE) remote--make-script $(MAKE) remote--make-basis $(MAKE) remote--make-libraries $(MAKE) remote--send-mlyacc-yacc-files $(MAKE) remote--make-tools $(MAKE) remote--recv-boot-files $(MAKE) remote--make-clean $(MAKE) remote--send-boot-files $(MAKE) remote--make-all $(MAKE) remote--make-binary-release $(MAKE) remote--recv-binary-release $(MAKE) remote--rm-root .PHONY: remote-add-target remote-add-target: $(MAKE) remote--send-src $(MAKE) remote--make-version $(MAKE) remote--make-dirs $(MAKE) remote--make-runtime $(MAKE) remote--recv-runtime ifneq ($(REMOTE_TARGET),$(CROSS_TARGET)) $(MV) "$(LIB)/targets/$(REMOTE_TARGET)" "$(LIB)/targets/$(CROSS_TARGET)" endif $(MAKE) remote--rm-root .PHONY: remote--send-src remote--send-src: $(SSH) $(REMOTE_MACHINE) "$(REMOTE_RM) $(REMOTE_ROOT) && $(REMOTE_MKDIR) $(REMOTE_ROOT)" $(GIT) archive --format=tar HEAD | $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_TAR) xf -" .PHONY: remote--send-mlyacc-yacc-files remote--send-mlyacc-yacc-files: $(MAKE) -C mlyacc src/yacc.lex.sml src/yacc.grm.sig src/yacc.grm.sml $(TAR) cf - mlyacc/src/yacc.lex.* mlyacc/src/yacc.grm.* | $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_TAR) xf -" $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && touch mlyacc/src/yacc.lex.* mlyacc/src/yacc.grm.*" .PHONY: remote--recv-runtime remote--recv-runtime: $(RM) "$(LIB)/targets/$(REMOTE_TARGET)" && $(MKDIR) "$(LIB)/targets/$(REMOTE_TARGET)" $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT)/build/lib/mlton/targets/self && $(REMOTE_TAR) cf - ." | (cd "$(LIB)/targets/$(REMOTE_TARGET)" && $(TAR) xf -) .PHONY: remote-bootstrap-gen-bootstrap-compiler-files remote--gen-bootstrap-compiler-files: $(MAKE) REMOTE_TARGET=$(REMOTE_TARGET) -C mlton mlton-bootstrap-$(REMOTE_TARGET).tgz .PHONY: remote--send-bootstrap-compiler-files remote--send-bootstrap-compiler-files: $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_RM) runtime/bootstrap && $(REMOTE_MKDIR) runtime/bootstrap" cat mlton/mlton-bootstrap-$(REMOTE_TARGET).tgz | $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT)/runtime/bootstrap && $(REMOTE_TAR) xzf -" .PHONY: remote--recv-boot-files remote--recv-boot-files: $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_RM) boot && $(REMOTE_CP) build boot" $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_TAR) czf - boot" | cat - > "$(LIB)/targets/$(REMOTE_TARGET)/boot.tgz" .PHONY: remote--send-boot-files remote--send-boot-files: $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_RM) boot" cat "$(LIB)/targets/$(REMOTE_TARGET)/boot.tgz" | $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && $(REMOTE_TAR) xzf -" .PHONY: remote--recv-binary-release remote--recv-binary-release: $(SSH) $(REMOTE_MACHINE) "cd $(REMOTE_ROOT) && cat mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(REMOTE_ARCH)-$(REMOTE_OS)$(MLTON_BINARY_RELEASE_SUFFIX).tgz" | cat - > mlton-$(MLTON_VERSION)-$(MLTON_BINARY_RELEASE).$(REMOTE_ARCH)-$(REMOTE_OS)$(MLTON_BINARY_RELEASE_SUFFIX).tgz .PHONY: remote--rm-root remote--rm-root: $(SSH) $(REMOTE_MACHINE) "$(REMOTE_RM) $(REMOTE_ROOT)" define MK_REMOTE_MAKE_TEMPLATE .PHONY: remote--make-$(1) remote--make-$(1): $$(SSH) $$(REMOTE_MACHINE) "cd $$(REMOTE_ROOT) && $$(REMOTE_MAKE) $$(REMOTE_MAKEFLAGS) $$(REMOTE_XMAKEFLAGS) $$($(1)_REMOTE_XMAKEFLAGS) $(1)" endef $(eval $(call MK_REMOTE_MAKE_TEMPLATE,show-config)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,clean)) version_REMOTE_XMAKEFLAGS := MLTON_VERSION=$(MLTON_VERSION) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,version)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,dirs)) runtime_REMOTE_XMAKEFLAGS := RELEASE=false $(eval $(call MK_REMOTE_MAKE_TEMPLATE,runtime)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,bootstrap-compiler)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,script)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,basis)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,libraries)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,check)) $(eval $(call MK_REMOTE_MAKE_TEMPLATE,tools)) all_REMOTE_XMAKEFLAGS := OLD_MLTON_DIR=$(REMOTE_ROOT)/boot/bin $(eval $(call MK_REMOTE_MAKE_TEMPLATE,all)) binary-release_REMOTE_XMAKEFLAGS := MLTON_BINARY_RELEASE_WITH_DOCS=false $(eval $(call MK_REMOTE_MAKE_TEMPLATE,binary-release)) endif .PHONY: bootstrap-compiler bootstrap-compiler: $(MAKE) -C "$(SRC)/runtime" "bootstrap/$(MLTON_OUTPUT)" $(CP) "$(SRC)/runtime/bootstrap/$(MLTON_OUTPUT)$(EXE)" "$(LIB)/" ###################################################################### # ????? BSDSRC := /tmp/mlton-$(MLTON_VERSION) MLTON_FREEBSD_RELEASE := 1 .PHONY: freebsd freebsd: $(MAKE) clean clean-git version $(RM) "$(BSDSRC)" $(MKDIR) "$(BSDSRC)" ( cd $(SRC) && $(TAR) -cpf - . ) | ( cd "$(BSDSRC)" && $(TAR) -xpf - ) cd /tmp && $(TAR) -cpf - mlton-$(MLTON_VERSION) | \ $(GZIP) --force --best >/usr/ports/distfiles/mlton-$(MLTON_VERSION)-$(MLTON_FREEBSD_RELEASE).freebsd.src.tgz # do not change "make" to "$(MAKE)" in the following line cd "$(BSDSRC)/package/freebsd" && MAINTAINER_MODE=yes make build-package mlton-20210117+dfsg/Makefile.binary000066400000000000000000000057171416264345000167630ustar00rootroot00000000000000# Specify C compiler and binutils. # Can be used for alternative tools (e.g., `CC=clang` or `CC=gcc-7`). CC := cc # Specify GMP include and library paths, if not on default search paths. WITH_GMP_DIR := ifneq ($(WITH_GMP_DIR),) WITH_GMP_INC_DIR := $(WITH_GMP_DIR)/include WITH_GMP_LIB_DIR := $(WITH_GMP_DIR)/lib endif # Specify installation prefix and staged install destination. PREFIX := /usr/local SED := sed ###################################################################### ###################################################################### ROOT := $(shell pwd) CP := cp -fpR MKDIR := mkdir -p RM := rm -rf ###################################################################### TGT_REL_SRC = ref="$(1)" pos="$(2)" down=; ref="$${ref%%/}" pos="$${pos%%/}"; while :; do test "$$pos" = '/' && break ; case "$$ref" in "$$pos"/*) break;; esac; down="../$$down"; pos="$${pos%/*}"; done; echo "$$down$${ref\#\#$$pos/}" SBIN := $(ROOT)/bin SLIB := $(ROOT)/lib/mlton SMAN := $(ROOT)/share/man/man1 SDOC := $(ROOT)/share/doc/mlton SLIB_REL_SBIN := $(shell $(call TGT_REL_SRC,$(SLIB),$(SBIN))) prefix := $(PREFIX) exec_prefix := $(prefix) bindir := $(exec_prefix)/bin datarootdir := $(prefix)/share docdir := $(datarootdir)/doc/mlton libdir := $(exec_prefix)/lib mandir := $(datarootdir)/man man1dir := $(mandir)/man1 TBIN := $(bindir) TLIB := $(libdir)/mlton TMAN := $(man1dir) TDOC := $(docdir) TEXM := $(TDOC)/examples TLIB_REL_TBIN := $(shell $(call TGT_REL_SRC,$(TLIB),$(TBIN))) .PHONY: install install: $(MKDIR) "$(TBIN)" "$(TLIB)" "$(TMAN)" "$(TDOC)" $(CP) "$(SBIN)/." "$(TBIN)/" $(SED) \ -e "s;^LIB_REL_BIN=.*;LIB_REL_BIN=\"$(TLIB_REL_TBIN)\";" \ < "$(SBIN)/mlton" > "$(TBIN)/mlton" chmod a+x "$(TBIN)/mlton" $(CP) "$(SLIB)/." "$(TLIB)/" $(CP) "$(SMAN)/." "$(TMAN)/" if [ -d "$(SDOC)" ]; then $(CP) "$(SDOC)/." "$(TDOC)/"; fi .PHONY: update update: $(CP) "$(SBIN)/mlton" "$(SBIN)/mlton.bak" $(SED) \ -e "s;^CC=.*;CC=\"$(CC)\";" \ -e "s;^GMP_INC_DIR=.*;GMP_INC_DIR=$(if $(WITH_GMP_INC_DIR),\"$(WITH_GMP_INC_DIR)\");" \ -e "s;^GMP_LIB_DIR=.*;GMP_LIB_DIR=$(if $(WITH_GMP_LIB_DIR),\"$(WITH_GMP_LIB_DIR)\");" \ < "$(SBIN)/mlton.bak" > "$(SBIN)/mlton" chmod a+x "$(SBIN)/mlton" $(RM) "$(SBIN)/mlton.bak" $(CP) "$(SLIB)/targets/self/constants" "$(SLIB)/targets/self/constants.bak" $(SED) \ -e "s;^default::pie=.*;default::pie=$(subst __pie__,0,$(shell echo "__pie__" | $(CC) -P -E -));" \ -e "s;^default::pic=.*;default::pic=$(subst __pic__,0,$(shell echo "__pic__" | $(CC) -P -E -));" \ < "$(SLIB)/targets/self/constants.bak" > "$(SLIB)/targets/self/constants" $(RM) "$(SLIB)/targets/self/constants.bak" if [ $$(echo "__pie__" | $(CC) -P -E -) != "__pie__" ]; then \ pi="-pie"; \ elif if [ $$(echo "__pic__" | $(CC) -P -E -) != "__pic__" ]; then \ pi="-pic"; \ else \ pi="-npi"; \ fi ; \ for lib in mlton gdtoa; do \ for md in "" -dbg; do \ $(CP) "$(SLIB)/targets/self/lib$${lib}$${md}$${pi}.a" "$(SLIB)/targets/self/lib$${lib}$${md}.a"; \ done; \ done mlton-20210117+dfsg/Makefile.config000066400000000000000000000147021416264345000167360ustar00rootroot00000000000000## Copyright (C) 2009,2011,2013,2017-2020 Matthew Fluet. # Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## # Specify C compiler and binutils. # Can be used for alternative tools (e.g., `CC=clang` or `CC=gcc-7`). CC := cc AR := ar RANLIB := ranlib STRIP := strip # Specify GMP include and library paths, if not on default search paths. WITH_GMP_DIR := ifneq ($(WITH_GMP_DIR),) WITH_GMP_INC_DIR := $(WITH_GMP_DIR)/include WITH_GMP_LIB_DIR := $(WITH_GMP_DIR)/lib endif # Specify installation prefix and staged install destination. PREFIX := /usr/local DESTDIR := # Specify runtime and compile arguments given to (the to-be-built) `mlton` # when compiling distributed executables ((self-compiled) `mlton`, `mllex`, # `mlyacc`, `mlprof`, and `mlnlffigen`). # Can be used for testing (e.g., `MLTON_COMPILE_ARGS="-codegen c"`) or for # downstream packaging. MLTON_RUNTIME_ARGS := MLTON_COMPILE_ARGS := # Specify runtime and compile arguments given to "old" `mlton` when # compiling "new" `mlton`. # Can be used to work around bugs in "old" `mlton` when compiling "new" # `mlton` (e.g., `OLD_MLTON_COMPILE_ARGS="-drop-pass 'deepFlatten'"`). OLD_MLTON := mlton OLD_MLTON_RUNTIME_ARGS := OLD_MLTON_COMPILE_ARGS := OLD_MLLEX := mllex OLD_MLYACC := mlyacc OLD_MLTON_DIR := ifneq (,$(OLD_MLTON_DIR)) OLD_MLTON := $(OLD_MLTON_DIR)/$(OLD_MLTON) OLD_MLLEX := $(OLD_MLTON_DIR)/$(OLD_MLLEX) OLD_MLYACC := $(OLD_MLTON_DIR)/$(OLD_MLYACC) endif # Specify standard tools. # Can be used for alternative tools (e.g., `SED=gsed`). DIFF := diff FIND := find GIT := git GREP := grep GZIP := gzip PATCH := patch SED := sed TAR := tar XARGS := xargs SHA1SUM := sha1sum SHA1 := sha1 OPENSSL := openssl SHASUM := shasum CHMOD := chmod CP := cp -fpR MKDIR := mkdir -p MV := mv -f RM := rm -rf ###################################################################### RELEASE := false MLTON_FORK := ifeq (,$(MLTON_FORK)) MLTON := mlton MLTON_NAME := MLton else MLTON := mlton-$(MLTON_FORK) MLTON_NAME := MLton [$(MLTON_FORK)] endif MLTON_OUTPUT := $(MLTON)-compile MLTON_VERSION := $(shell TZ=UTC $(GIT) log -n1 --date=format-local:"%Y%m%d.%H%M%S" --pretty=format:"%cd-g%h$$([ "$$($(GIT) status --porcelain 2> /dev/null)" ] && echo '-dirty')" 2> /dev/null || echo '????????') ###################################################################### ###################################################################### define HAVE_CMD $(shell if [ -x "$$(command -v "$(1)")" ]; then echo true; else echo false; fi) endef SHA1DGST := ifeq (,$(SHA1DGST)) ifeq (true, $(call HAVE_CMD,$(SHA1SUM))) SHA1DGST := $(SHA1SUM) | $(SED) 's/.*\([a-z0-9]\{40\}\).*/\1/' else ifeq (true, $(call HAVE_CMD,$(SHA1))) SHA1DGST := $(SHA1) | $(SED) 's/.*\([a-z0-9]\{40\}\).*/\1/' else ifeq (true, $(call HAVE_CMD,$(OPENSSL))) SHA1DGST := $(OPENSSL) sha1 | $(SED) 's/.*\([a-z0-9]\{40\}\).*/\1/' else ifeq (true, $(call HAVE_CMD,$(SHASUM))) SHA1DGST := $(SHASUM) -a | $(SED) 's/.*\([a-z0-9]\{40\}\).*/\1/' else $(error Could not determine suitable SHA-1 digest command) endif endif ###################################################################### ###################################################################### TGT_REL_SRC = ref="$(1)" pos="$(2)" down=; ref="$${ref%%/}" pos="$${pos%%/}"; while :; do test "$$pos" = '/' && break ; case "$$ref" in "$$pos"/*) break;; esac; down="../$$down"; pos="$${pos%/*}"; done; echo "$$down$${ref\#\#$$pos/}" SRC := $(shell cd $(ROOT) && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib/mlton INC := $(LIB)/include LIB_REL_BIN := $(shell $(call TGT_REL_SRC,$(LIB),$(BIN))) HOST_ARCH := $(shell $(SRC)/bin/host-arch) HOST_OS := $(shell $(SRC)/bin/host-os) ifeq (0, $(MAKELEVEL)) define CHECK_HOST ifeq ($$($(1)),) $$(error Could not determine '$(1)') endif endef $(eval $(call CHECK_HOST,HOST_ARCH)) $(eval $(call CHECK_HOST,HOST_OS)) endif TARGET := self TARGET_ARCH := $(HOST_ARCH) TARGET_OS := $(HOST_OS) ifeq (mingw, $(TARGET_OS)) EXE := .exe else EXE := endif ###################################################################### ## BOOTSTRAP_STYLE ## 0 -- Use $(OLD_MLTON) for round1 (and stop) ## 1 -- Use $(BIN)/$(MLTON) for round1 (and stop); ## default if $(BIN)/$(MLTON) exists ## 2 -- Use $(OLD_MLTON) for round1; use $(BIN)/$(MLTON) for round2; ## default if $(BIN)/$(MLTON) does not exist ## 3 -- Use $(OLD_MLTON) or use $(BIN)/$(MLTON) for round1; ## use $(BIN)/$(MLTON) for round2; ## use $(BIN)/$(MLTON) for round3 (and check fixpoint) ifeq (true, $(shell [ -x "$(BIN)/$(MLTON)" ] && echo true)) BOOTSTRAP_STYLE := 1 else BOOTSTRAP_STYLE := 2 endif ifeq (0, $(BOOTSTRAP_STYLE)) SELF_COMPILE := false else ifeq (1, $(BOOTSTRAP_STYLE)) SELF_COMPILE := true else ifeq (2, $(BOOTSTRAP_STYLE)) SELF_COMPILE := false else ifeq (3, $(BOOTSTRAP_STYLE)) SELF_COMPILE := false endif ifeq (true, $(SELF_COMPILE)) RUN_MLTON := $(BIN)/$(MLTON) RUN_MLTON_RUNTIME_ARGS := $(MLTON_RUNTIME_ARGS) RUN_MLTON_COMPILE_ARGS := $(MLTON_COMPILE_ARGS) ifeq (true, $(shell [ -x "$(BIN)/mllex" ] && echo true)) RUN_MLLEX := $(BIN)/mllex else RUN_MLLEX := $(OLD_MLLEX) endif ifeq (true, $(shell [ -x "$(BIN)/mlyacc" ] && echo true)) RUN_MLYACC := $(BIN)/mlyacc else RUN_MLYACC := $(OLD_MLYACC) endif else RUN_MLTON := $(OLD_MLTON) RUN_MLTON_RUNTIME_ARGS := $(OLD_MLTON_RUNTIME_ARGS) RUN_MLTON_COMPILE_ARGS := $(OLD_MLTON_COMPILE_ARGS) RUN_MLLEX := $(OLD_MLLEX) RUN_MLYACC := $(OLD_MLYACC) endif ifeq (0, $(MAKELEVEL)) define CHECK_MLCMD ifeq (false, $$(call HAVE_CMD,$$($(2)))) $$(warning '$(1)' command not found: $$($(2))) endif endef $(eval $(call CHECK_MLCMD,mlton,RUN_MLTON)) $(eval $(call CHECK_MLCMD,mllex,RUN_MLLEX)) $(eval $(call CHECK_MLCMD,mlyacc,RUN_MLYACC)) endif ifeq (true,$(call HAVE_CMD,$(RUN_MLTON))) RUN_MLTON_VERSION := $(shell "$(RUN_MLTON)" | $(SED) -n 's/MLton.*\([0-9]\{8\}\).*/\1/p') RUN_MLTON_DEPS := $(RUN_MLTON) else RUN_MLTON_VERSION := "????????" RUN_MLTON_DEPS := : endif ###################################################################### SHOW_VARS := MLTON_NAME MLTON_VERSION SRC BUILD BIN LIB INC LIB_REL_BIN HOST_ARCH HOST_OS TARGET TARGET_ARCH TARGET_OS BOOTSTRAP_STYLE SELF_COMPILE RUN_MLTON RUN_MLTON_VERSION RUN_MLLEX RUN_MLYACC SHOW_VAR = echo "$(1) = $(strip $($(1)))"; define MK_SHOW_CONFIG .PHONY: show-config show-config: @$$(foreach VAR, $$(SHOW_VARS), $$(call SHOW_VAR,$$(VAR))) endef mlton-20210117+dfsg/README.adoc000066400000000000000000000205011416264345000156110ustar00rootroot00000000000000= http://mlton.org[MLton] ifdef::env-github[] image:https://travis-ci.com/MLton/mlton.svg?branch=master[Build Status, link = https://travis-ci.com/MLton/mlton] endif::[] **** MLton is a whole-program optimizing compiler for the Standard{nbsp}ML programming language. MLton generates small executables with excellent runtime performance, utilizing untagged and unboxed native integers, reals, and words, unboxed native arrays, fast arbitrary-precision arithmetic based on GMP, and multiple code generation and garbage collection strategies. In addition, MLton provides a feature rich Standard{nbsp}ML programming environment, with full support for SML97 as given in The Definition of Standard{nbsp}ML (Revised), a number of useful language extensions, a complete implementation of the Standard ML Basis Library, various useful libraries, a simple and fast C foreign function interface, the ML Basis system for programming with source libraries, and tools such as a lexer generator, a parser generator, and a profiler. **** == Features * Robustness. - Supports the full SML{nbsp}97 language as given in The Definition of Standard{nbsp}ML (Revised). - A complete implementation of the http://sml-family.org/Basis/[Basis Library]. - Generates standalone executables. - Compiles large programs. - Support for large amounts of memory (up to 4G on 32-bit systems; more on 64-bit systems). - Support for large array lengths (up to 2^31^ - 1 on 32-bit systems; up to 2^63^-1 on 64-bit systems). - Support for large files, using 64-bit file positions. * Performance. - Executables have excellent runtime performance. - Generates small executables. - Untagged and unboxed native integers, reals, and words. - Unboxed native arrays. - Multiple garbage collection strategies. - Fast arbitrary-precision arithmetic based on https://gmplib.org[GMP]. * Tools. - Source-level http://mlton.org/Profiling[profiling] for both time and allocation. - MLLex lexer generator. - MLYacc parser generator. - MLNLFFIGEN foreign-function-interface generator. * Extensions. - The http://mlton.org/MLBasis[ML Basis system] for programming with source libraries. - A number of useful http://mlton.org/SuccessorML[language extensions]. - A simple and fast http://mlton.org/ForeignFunctionInterface[C FFI] that supports calling from SML to C and from C to SML. - Libraries for http://mlton.org/MLtonWeak[weak pointers] and http://mlton.org/MLtonFinalizable[finalization], http://mlton.org/MLtonThread[threads], http://mlton.org/MLtonCont[continuations], http://mlton.org/MLtonItimer[interval timers] and http://mlton.org/MLtonSignal[signal handlers], http://mlton.org/MLtonWorld[world save and restore], and http://mlton.org/MLtonStructure[more]. * Portability. - Runs on a wide variety of platforms. == Build and Install (from source) === Requirements ==== Software * http://gcc.gnu.org/[GCC] or http://clang.llvm.org[Clang] (The C compiler must support `-std=gnu11`.) * http://gmplib.org[GMP] (GNU Multiple Precision arithmetic library) * http://savannah.gnu.org/projects/make[GNU Make] * http://www.gnu.org/software/bash/[GNU Bash] * binutils (`ar`, `ranlib`, `strip`, ...) * miscellaneous Unix utilities (`diff`, `find`, `grep`, `gzip`, `patch`, `sed`, `tar`, `xargs`, ...) * Standard{nbsp}ML compiler and tools to bootstrap: - http://mlton.org[MLton] (`mlton`, `mllex`, and `mlyacc`) recommended. Pre-built binary packages for MLton can be installed via an OS package manager or (for select platforms) obtained from `http://mlton.org`. - http://www.smlnj.org[SML/NJ] (`sml`, `ml-lex`, `ml-yacc`) supported, but not recommended. * (optional, for documentation only) https://ctan.org/tex/[TeX], http://asciidoc.org/[AsciiDoc], http://pygments.org/[Pygments], http://www.graphicsmagick.org/[GraphicsMagick] or https://www.imagemagick.org/[ImageMagick], ... ==== Hardware * ≥ 1GB RAM (for 32-bit platforms) or ≥ 2GB RAM (for 64-bit platforms) === Build Instructions On typical platforms, building MLton requires no configuration and can be accomplished via: [source,shell] ---- $ make all ---- A small set of `Makefile` variables can be used to customize the build: * `CC`: Specify C compiler. Can be used for alternative tools (e.g., `CC=clang` or `CC=gcc-7`). * `WITH_GMP_DIR`, `WITH_GMP_INC_DIR`, `WITH_GMP_LIB_DIR`: Specify GMP include and library paths, if not on default search paths. (If `WITH_GMP_DIR` is set, then `WITH_GMP_INC_DIR` defaults to `$(WITH_GMP_DIR)/include` and `WITH_GMP_LIB_DIR` defaults to `$(WITH_GMP_DIR)/lib`.) * `MLTON_RUNTIME_ARGS`, `MLTON_COMPILE_ARGS`: Specify runtime and compile arguments given to (the to-be-built) `mlton` when compiling distributed executables ((self-compiled) `mlton`, `mllex`, `mlyacc`, `mlprof`, and `mlnlffigen`). Can be used for testing (e.g., `MLTON_COMPILE_ARGS="-codegen c"`) or for downstream packaging. * `OLD_MLTON_RUNTIME_ARGS`, `OLD_MLTON_COMPILE_ARGS`: Specify runtime and compile arguments given to "old" `mlton` when compiling "new" `mlton`. Can be used to work around bugs in "old" `mlton` when compiling "new" `mlton`. For example: [source,shell] ---- $ make CC=clang WITH_GMP_DIR=/opt/gmp MLTON_COMPILE_ARGS="-codegen c" all ---- The build artifacts are located under `./build`. The just-built `mlton` can be executed via `./build/bin/mlton`. Building documentation can be accomplished via: [source,shell] ---- $ make docs ---- === Install Instructions On typical platforms, installing MLton (after performing `make all` and, optionally, `make docs`) to `/usr/local` can be accomplished via: [source,shell] ---- $ make install ---- A small set of `Makefile` variables can be used to customize the installation: * `PREFIX`: Specify the installation prefix. For example: [source,shell] ---- $ make PREFIX=/opt/mlton install ---- == Install (from binary package) === Requirements ==== Software * http://gcc.gnu.org/[GCC] or http://clang.llvm.org[Clang] (The C compiler must support `-std=gnu11`.) * http://gmplib.org[GMP] (GNU Multiple Precision arithmetic library) * http://savannah.gnu.org/projects/make[GNU Make] * http://www.gnu.org/software/bash/[GNU Bash] * miscellaneous Unix utilities (`bzip2`, `gzip`, `sed`, `tar`, ...) === Binary Package A `.tgz` or `.tbz` binary package can be extracted at any location, yielding `README.adoc` (this file), `CHANGELOG.adoc`, `LICENSE`, `Makefile`, `bin/`, `lib/`, and `share/`. The compiler and tools can be executed in-place (e.g., `./bin/mlton`). A small set of `Makefile` variables can be used to customize the binary package via `make update`: * `CC`: Specify C compiler. Can be used for alternative tools (e.g., `CC=clang` or `CC=gcc-7`). * `WITH_GMP_DIR`, `WITH_GMP_INC_DIR`, `WITH_GMP_LIB_DIR`: Specify GMP include and library paths, if not on default search paths. (If `WITH_GMP_DIR` is set, then `WITH_GMP_INC_DIR` defaults to `$(WITH_GMP_DIR)/include` and `WITH_GMP_LIB_DIR` defaults to `$(WITH_GMP_DIR)/lib`.) For example: [source,shell] ---- $ make CC=clang WITH_GMP_DIR=/opt/gmp update ---- === Install Instructions On typical platforms, installing MLton (after optionally performing `make update`) to `/usr/local` can be accomplished via: [source,shell] ---- $ make install ---- A small set of `Makefile` variables can be used to customize the installation: * `PREFIX`: Specify the installation prefix. For example: [source,shell] ---- $ make PREFIX=/opt/mlton install ---- == Resources * `http://mlton.org` * Development - `https://github.com/MLton/mlton` - https://github.com/MLton/mlton/pulls[pull requests] - https://github.com/MLton/mlton/issues[issue tracker] * Mailing lists - `MLton-devel@mlton.org` -- MLton developers (https://sourceforge.net/mailarchive/forum.php?forum_name=mlton-devel[archive], https://lists.sourceforge.net/lists/listinfo/mlton-devel[subscribe]) - `MLton-user@mlton.org` -- MLton user community (https://sourceforge.net/mailarchive/forum.php?forum_name=mlton-user[archive], https://lists.sourceforge.net/lists/listinfo/mlton-user[subscribe]) == Support and Contributing To report bugs or suggest new features, use the https://github.com/MLton/mlton/issues[issue tracker] or ask on the mailto:mlton-user@mlton.org[mailing list]. https://github.com/MLton/mlton/pulls[Pull requests] with bug fixes or changes are welcome. mlton-20210117+dfsg/basis-library/000077500000000000000000000000001416264345000165715ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/.gitignore000066400000000000000000000000271416264345000205600ustar00rootroot00000000000000/basis-library.def-use mlton-20210117+dfsg/basis-library/Makefile000066400000000000000000000053011416264345000202300ustar00rootroot00000000000000## Copyright (C) 2010,2013,2016-2017,2019 Matthew Fluet. # Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### all: .PHONY: clean clean: $(SRC)/bin/clean RESOLVE_SCOPES = program topdec strdec dec OBJPTR_MAPS = objptr-rep32.map objptr-rep64.map NORMAL_METADATA_MAPS = normal-metadata-size32.map normal-metadata-size64.map normal-metadata-size128.map SEQUENCE_METADATA_MAPS = sequence-metadata-size96.map sequence-metadata-size128.map sequence-metadata-size196.map sequence-metadata-size256.map SEQINDEX_MAPS = seqindex-int32.map seqindex-int64.map DEFAULT_CHAR = char8 DEFAULT_INT = int32 int64 intinf DEFAULT_REAL = real32 real64 DEFAULT_WORD = word32 word64 .PHONY: def-use def-use: "$(BIN)/$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ -prefer-abs-paths true -show-def-use basis-library.def-use \ libs/all.mlb .PHONY: type-check-def type-check-def: "$(BIN)/$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ libs/all.mlb .PHONY: type-check-all type-check-all: for resolvescope in $(RESOLVE_SCOPES); do \ for objptr in $(OBJPTR_MAPS); do \ for normalmetadata in $(NORMAL_METADATA_MAPS); do \ for sequencemetadata in $(SEQUENCE_METADATA_MAPS); do \ for seqindex in $(SEQINDEX_MAPS); do \ for defchar in $(DEFAULT_CHAR); do \ for defint in $(DEFAULT_INT); do \ for defreal in $(DEFAULT_REAL); do \ for defword in $(DEFAULT_WORD); do \ echo "Type checking: $$resolvescope $$objptr $$normalmetadata $$sequencemetadata $$seqindex $$defchar $$defint $$defreal $$defword"; \ echo "$(MLTON)" -disable-ann deadCode -disable-ann resolveScope -default-ann "\"resolveScope $$resolvescope\"" -stop tc -show-types true \ -mlb-path-map "maps/$$objptr" \ -mlb-path-map "maps/$$normalmetadata" \ -mlb-path-map "maps/$$sequencemetadata" \ -mlb-path-map "maps/$$seqindex" \ -default-type "$$defchar" \ -default-type "$$defint" \ -default-type "$$defreal" \ -default-type "$$defword" \ libs/all.mlb; \ "$(MLTON)" -disable-ann deadCode -disable-ann resolveScope -default-ann "resolveScope $$resolvescope" -stop tc -show-types true \ -mlb-path-map "maps/$$objptr" \ -mlb-path-map "maps/$$normalmetadata" \ -mlb-path-map "maps/$$sequencemetadata" \ -mlb-path-map "maps/$$seqindex" \ -default-type "$$defchar" \ -default-type "$$defint" \ -default-type "$$defreal" \ -default-type "$$defword" \ libs/all.mlb; \ done; done; done; done; done; done; done; done; done; mlton-20210117+dfsg/basis-library/README000066400000000000000000000024341416264345000174540ustar00rootroot00000000000000This directory contains the MLton implementation of the Basis Library. The files are grouped in directories in the same way that the corresponding modules are grouped in the basis library documentation. All other implementation files are in the misc/ and libs/ directories. The basis is constructed using the ML Basis system. There are several special files that make use of non-SML extensions. misc/primitive.sml posix/primitve.sml These are not Standard ML. They describe all of the primitives and C routines used in the basis. top-level/overloads.sml Not Standard ML. Uses the notation _overload : as (and )* Dead Code Elimination ---------------------------------------- In order to compile small programs rapidly, a pass of dead code elimination (core-ml/dead-code.{sig,fun}) is run in order to eliminate as much of the basis library as possible. The dead code elimination algorithm used is not safe in general, and only works because the basis library implementation has special properties: * it terminates * it performs no I/O The dead code elimination includes the minimal set of declarations from the basis so that there are no free variables in the user program (or basis). It has a special hack to include all bindings of the form val _ = ... mlton-20210117+dfsg/basis-library/arrays-and-vectors/000077500000000000000000000000001416264345000223155ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/arrays-and-vectors/array-slice.sig000066400000000000000000000042111416264345000252320ustar00rootroot00000000000000signature ARRAY_SLICE_GLOBAL = sig end signature ARRAY_SLICE = sig include ARRAY_SLICE_GLOBAL type 'a slice val all: ('a -> bool) -> 'a slice -> bool val app : ('a -> unit) -> 'a slice -> unit val appi: (int * 'a -> unit) -> 'a slice -> unit val base: 'a slice -> 'a Array.array * int * int val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order val copy: {dst: 'a Array.array, di: int, src: 'a slice} -> unit val copyVec: {dst: 'a Array.array, di: int, src: 'a VectorSlice.slice} -> unit val exists: ('a -> bool) -> 'a slice -> bool val find: ('a -> bool) -> 'a slice -> 'a option val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val foldl: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val full: 'a Array.array -> 'a slice val getItem: 'a slice -> ('a * 'a slice) option val isEmpty: 'a slice -> bool val length: 'a slice -> int val modify : ('a -> 'a) -> 'a slice -> unit val modifyi: (int * 'a -> 'a) -> 'a slice -> unit val slice: 'a Array.array * int * int option -> 'a slice val sub: 'a slice * int -> 'a val subslice: 'a slice * int * int option -> 'a slice val update: 'a slice * int * 'a -> unit val vector: 'a slice -> 'a Vector.vector end signature ARRAY_SLICE_EXTRA = sig include ARRAY_SLICE val uninitIsNop: 'a slice -> bool val uninit: 'a slice * int -> unit val unsafeSub: 'a slice * int -> 'a val unsafeCopy: {dst: 'a Array.array, di: int, src: 'a slice} -> unit val unsafeCopyVec: {dst: 'a Array.array, di: int, src: 'a VectorSlice.slice} -> unit val unsafeSlice: 'a array * int * int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice val unsafeUninit: 'a slice * int -> unit val unsafeUpdate: 'a slice * int * 'a -> unit val concat: 'a slice list -> 'a array val toList: 'a slice -> 'a list end mlton-20210117+dfsg/basis-library/arrays-and-vectors/array.sig000066400000000000000000000050771416264345000241500ustar00rootroot00000000000000signature ARRAY_GLOBAL = sig type 'a array = 'a Array.array end signature ARRAY = sig include ARRAY_GLOBAL type 'a vector = 'a Vector.vector val all: ('a -> bool) -> 'a array -> bool val app: ('a -> unit) -> 'a array -> unit val appi: (int * 'a -> unit) -> 'a array -> unit val array: int * 'a -> 'a array val collate: ('a * 'a -> order) -> 'a array * 'a array -> order val copy: {src: 'a array, dst: 'a array, di: int} -> unit val copyVec: {src: 'a vector, dst: 'a array, di: int} -> unit val exists: ('a -> bool) -> 'a array -> bool val find: ('a -> bool) -> 'a array -> 'a option val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val fromList: 'a list -> 'a array val length: 'a array -> int val maxLen: int val modify: ('a -> 'a) -> 'a array -> unit val modifyi: (int * 'a -> 'a) -> 'a array -> unit val sub: 'a array * int -> 'a val tabulate: int * (int -> 'a) -> 'a array val update: 'a array * int * 'a -> unit val vector: 'a array -> 'a vector end signature ARRAY_EXTRA = sig include ARRAY structure ArraySlice: ARRAY_SLICE_EXTRA val alloc: int -> 'a array val uninitIsNop: 'a array -> bool val uninit: 'a array * int -> unit val unsafeAlloc: int -> 'a array val unsafeArray: int * 'a -> 'a array val unsafeCopy: {dst: 'a array, di: int, src: 'a array} -> unit val unsafeCopyVec: {dst: 'a array, di: int, src: 'a vector} -> unit val unsafeSub: 'a array * int -> 'a val unsafeUninit: 'a array * int -> unit val unsafeUpdate: 'a array * int * 'a -> unit val concat: 'a array list -> 'a array val duplicate: 'a array -> 'a array val toList: 'a array -> 'a list val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b val unfold: int * 'b * ('b -> 'a * 'b) -> 'a array * 'b structure Raw: sig type 'a rawarr val alloc: int -> 'a rawarr val length: 'a rawarr -> int val uninit: 'a rawarr * int -> unit val uninitIsNop: 'a rawarr -> bool val unsafeAlloc: int -> 'a rawarr val unsafeToArray: 'a rawarr -> 'a array val unsafeUninit: 'a rawarr * int -> unit end end mlton-20210117+dfsg/basis-library/arrays-and-vectors/array.sml000066400000000000000000000047001416264345000241510ustar00rootroot00000000000000(* Copyright (C) 2017,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Array: ARRAY_EXTRA = struct structure A = Sequence (Primitive.Array) open A val op < = Int.< val op <= = Int.<= fun wrap2 f = fn (i, x) => f (SeqIndex.toIntUnsafe i, x) type 'a array = 'a array type 'a vector = 'a Vector.vector structure ArraySlice = struct open Slice val vector = Primitive.Array.Slice.vector val copyVec = Vector.VectorSlice.copy val unsafeCopyVec = Vector.VectorSlice.unsafeCopy fun modifyi f sl = Primitive.Array.Slice.modifyi (wrap2 f) sl val modify = Primitive.Array.Slice.modify end val array = new val unsafeArray = unsafeNew val vector = Primitive.Array.vector val copyVec = Vector.copy val unsafeCopyVec = Vector.unsafeCopy fun modifyi f sl = Primitive.Array.modifyi (wrap2 f) sl val modify = Primitive.Array.modify structure Raw = Primitive.Array.Raw structure Raw = struct type 'a rawarr = 'a Raw.rawarr fun length a = if Primitive.Controls.safe then (SeqIndex.toInt (Raw.length a)) handle Overflow => raise Fail "Raw.length" else SeqIndex.toIntUnsafe (Raw.length a) fun alloc n = Raw.alloc (SeqIndex.fromIntForLength n) fun unsafeAlloc n = Raw.unsafeAlloc (SeqIndex.fromIntUnsafe n) val uninitIsNop = Raw.uninitIsNop fun unsafeUninit (a, i) = Raw.unsafeUninit (a, SeqIndex.fromIntUnsafe i) fun uninit (a, i) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in Raw.uninit (a, i) end else unsafeUninit (a, i) val unsafeToArray = Primitive.Array.Raw.unsafeToArray end end structure ArraySlice: ARRAY_SLICE_EXTRA = Array.ArraySlice structure ArrayGlobal: ARRAY_GLOBAL = Array open ArrayGlobal mlton-20210117+dfsg/basis-library/arrays-and-vectors/array2.sig000066400000000000000000000024651416264345000242300ustar00rootroot00000000000000signature ARRAY2 = sig eqtype 'a array type 'a region = {base: 'a array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = RowMajor | ColMajor val array: int * int * 'a -> 'a array val fromList: 'a list list -> 'a array val tabulate: traversal -> (int * int * (int * int -> 'a)) -> 'a array val sub: 'a array * int * int -> 'a val update: 'a array * int * int * 'a -> unit val dimensions: 'a array -> int * int val nRows: 'a array -> int val nCols: 'a array -> int val row: 'a array * int -> 'a vector val column: 'a array * int -> 'a vector val copy: {src: 'a region, dst: 'a array, dst_row: int, dst_col: int} -> unit val appi: traversal -> (int * int * 'a -> unit) -> 'a region -> unit val app: traversal -> ('a -> unit) -> 'a array -> unit val foldi: traversal -> (int * int * 'a * 'b -> 'b) -> 'b -> 'a region -> 'b val fold: traversal -> ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val modifyi: traversal -> (int * int * 'a -> 'a) -> 'a region -> unit val modify: traversal -> ('a -> 'a) -> 'a array -> unit end mlton-20210117+dfsg/basis-library/arrays-and-vectors/array2.sml000066400000000000000000000322501416264345000242340ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Array2 : ARRAY2 = struct val op +! = SeqIndex.+! val op + = SeqIndex.+ val op -! = SeqIndex.-! val op - = SeqIndex.- val op *! = SeqIndex.*! val op * = SeqIndex.* val op < = SeqIndex.< val op <= = SeqIndex.<= val op > = SeqIndex.> val op >= = SeqIndex.>= val ltu = SeqIndex.ltu val leu = SeqIndex.leu val gtu = SeqIndex.gtu val geu = SeqIndex.geu type 'a array = {array: 'a Array.array, rows: SeqIndex.int, cols: SeqIndex.int} fun dimensions' ({rows, cols, ...}: 'a array) = (rows, cols) fun dimensions ({rows, cols, ...}: 'a array) = (SeqIndex.toIntUnsafe rows, SeqIndex.toIntUnsafe cols) fun nRows' ({rows, ...}: 'a array) = rows fun nRows ({rows, ...}: 'a array) = SeqIndex.toIntUnsafe rows fun nCols' ({cols, ...}: 'a array) = cols fun nCols ({cols, ...}: 'a array) = SeqIndex.toIntUnsafe cols type 'a region = {base: 'a array, row: int, col: int, nrows: int option, ncols: int option} local fun checkSliceMax' (start: int, num: SeqIndex.int option, max: SeqIndex.int): SeqIndex.int * SeqIndex.int = case num of NONE => if Primitive.Controls.safe then let val start = (SeqIndex.fromInt start) handle Overflow => raise Subscript in if gtu (start, max) then raise Subscript else (start, max) end else (SeqIndex.fromIntUnsafe start, max) | SOME num => if Primitive.Controls.safe then let val start = (SeqIndex.fromInt start) handle Overflow => raise Subscript in if (start < 0 orelse num < 0 orelse start +! num > max) then raise Subscript else (start, start +! num) end else (SeqIndex.fromIntUnsafe start, SeqIndex.fromIntUnsafe start +! num) fun checkSliceMax (start: int, num: int option, max: SeqIndex.int): SeqIndex.int * SeqIndex.int = if Primitive.Controls.safe then (checkSliceMax' (start, Option.map SeqIndex.fromInt num, max)) handle Overflow => raise Subscript else checkSliceMax' (start, Option.map SeqIndex.fromIntUnsafe num, max) in fun checkRegion' {base, row, col, nrows, ncols} = let val (rows, cols) = dimensions' base val (startRow, stopRow) = checkSliceMax' (row, nrows, rows) val (startCol, stopCol) = checkSliceMax' (col, ncols, cols) in {startRow = startRow, stopRow = stopRow, startCol = startCol, stopCol = stopCol} end fun checkRegion {base, row, col, nrows, ncols} = let val (rows, cols) = dimensions' base val (startRow, stopRow) = checkSliceMax (row, nrows, rows) val (startCol, stopCol) = checkSliceMax (col, ncols, cols) in {startRow = startRow, stopRow = stopRow, startCol = startCol, stopCol = stopCol} end end fun wholeRegion (a : 'a array): 'a region = {base = a, row = 0, col = 0, nrows = NONE, ncols = NONE} datatype traversal = RowMajor | ColMajor local fun make (rows, cols, doit) = if Primitive.Controls.safe andalso (rows < 0 orelse cols < 0) then raise Size else {array = doit (rows * cols handle Overflow => raise Size), rows = rows, cols = cols} in fun alloc' (rows, cols) = make (rows, cols, Primitive.Array.alloc) fun array' (rows, cols, init) = make (rows, cols, fn size => Primitive.Array.new (size, init)) end local fun make (rows, cols, doit) = if Primitive.Controls.safe then let val rows = (SeqIndex.fromInt rows) handle Overflow => raise Size val cols = (SeqIndex.fromInt cols) handle Overflow => raise Size in doit (rows, cols) end else doit (SeqIndex.fromIntUnsafe rows, SeqIndex.fromIntUnsafe cols) in fun alloc (rows, cols) = make (rows, cols, fn (rows, cols) => alloc' (rows, cols)) fun array (rows, cols, init) = make (rows, cols, fn (rows, cols) => array' (rows, cols, init)) end fun array0 (): 'a array = {array = Primitive.Array.alloc 0, rows = 0, cols = 0} fun unsafeSpot' ({cols, ...}: 'a array, r, c) = r *! cols +! c fun spot' (a as {rows, cols, ...}: 'a array, r, c) = if Primitive.Controls.safe andalso (geu (r, rows) orelse geu (c, cols)) then raise Subscript else unsafeSpot' (a, r, c) fun unsafeSub' (a as {array, ...}: 'a array, r, c) = Primitive.Array.unsafeSub (array, unsafeSpot' (a, r, c)) fun sub' (a as {array, ...}: 'a array, r, c) = Primitive.Array.unsafeSub (array, spot' (a, r, c)) fun unsafeUpdate' (a as {array, ...}: 'a array, r, c, x) = Primitive.Array.unsafeUpdate (array, unsafeSpot' (a, r, c), x) fun update' (a as {array, ...}: 'a array, r, c, x) = Primitive.Array.unsafeUpdate (array, spot' (a, r, c), x) local fun make (r, c, doit) = if Primitive.Controls.safe then let val r = (SeqIndex.fromInt r) handle Overflow => raise Subscript val c = (SeqIndex.fromInt c) handle Overflow => raise Subscript in doit (r, c) end else doit (SeqIndex.fromIntUnsafe r, SeqIndex.fromIntUnsafe c) in fun sub (a, r, c) = make (r, c, fn (r, c) => sub' (a, r, c)) fun update (a, r, c, x) = make (r, c, fn (r, c) => update' (a, r, c, x)) end fun 'a fromList (rows: 'a list list): 'a array = case rows of [] => array0 () | row1 :: _ => let val cols = length row1 val a as {array, cols = cols', ...} = alloc (length rows, cols) val _ = List.foldl (fn (row: 'a list, i) => let val max = i +! cols' val i' = List.foldl (fn (x: 'a, i) => (if i >= max then raise Size else (Primitive.Array.unsafeUpdate (array, i, x) ; i +! 1))) i row in if i' = max then i' else raise Size end) 0 rows in a end fun row' ({array, rows, cols}, r) = if Primitive.Controls.safe andalso geu (r, rows) then raise Subscript else ArraySlice.vector (Primitive.Array.Slice.slice (array, r *! cols, SOME cols)) fun row (a, r) = if Primitive.Controls.safe then let val r = (SeqIndex.fromInt r) handle Overflow => raise Subscript in row' (a, r) end else row' (a, SeqIndex.fromIntUnsafe r) fun column' (a as {rows, cols, ...}: 'a array, c) = if Primitive.Controls.safe andalso geu (c, cols) then raise Subscript else Primitive.Vector.tabulate (rows, fn r => unsafeSub' (a, r, c)) fun column (a, c) = if Primitive.Controls.safe then let val c = (SeqIndex.fromInt c) handle Overflow => raise Subscript in column' (a, c) end else column' (a, SeqIndex.fromIntUnsafe c) fun foldi' trv f b (region as {base, ...}) = let val {startRow, stopRow, startCol, stopCol} = checkRegion region in case trv of RowMajor => let fun loopRow (r, b) = if r >= stopRow then b else let fun loopCol (c, b) = if c >= stopCol then b else loopCol (c +! 1, f (r, c, sub' (base, r, c), b)) in loopRow (r +! 1, loopCol (startCol, b)) end in loopRow (startRow, b) end | ColMajor => let fun loopCol (c, b) = if c >= stopCol then b else let fun loopRow (r, b) = if r >= stopRow then b else loopRow (r +! 1, f (r, c, sub' (base, r, c), b)) in loopCol (c +! 1, loopRow (startRow, b)) end in loopCol (startCol, b) end end fun foldi trv f b a = foldi' trv (fn (r, c, x, b) => f (SeqIndex.toIntUnsafe r, SeqIndex.toIntUnsafe c, x, b)) b a fun fold trv f b a = foldi trv (fn (_, _, x, b) => f (x, b)) b (wholeRegion a) fun appi trv f = foldi trv (fn (r, c, x, ()) => f (r, c, x)) () fun app trv f = fold trv (f o #1) () fun modifyi trv f (r as {base, ...}) = appi trv (fn (r, c, x) => update (base, r, c, f (r, c, x))) r fun modify trv f a = modifyi trv (f o #3) (wholeRegion a) fun tabulate trv (rows, cols, f) = let val a = alloc (rows, cols) val () = modifyi trv (fn (r, c, _) => f (r, c)) (wholeRegion a) in a end fun copy {src = src as {base, ...}: 'a region, dst, dst_row, dst_col} = let val {startRow, stopRow, startCol, stopCol} = checkRegion src val nrows = stopRow -! startRow val ncols = stopCol -! startCol val {startRow = dst_row, startCol = dst_col, ...} = checkRegion' {base = dst, row = dst_row, col = dst_col, nrows = SOME nrows, ncols = SOME ncols} fun forUp (start, stop, f: SeqIndex.int -> unit) = let fun loop i = if i >= stop then () else (f i; loop (i + 1)) in loop start end fun forDown (start, stop, f: SeqIndex.int -> unit) = let fun loop i = if i < start then () else (f i; loop (i - 1)) in loop (stop -! 1) end val forRows = if startRow <= dst_row then forDown else forUp val forCols = if startCol <= dst_col then forUp else forDown in forRows (0, nrows, fn r => forCols (0, ncols, fn c => unsafeUpdate' (dst, dst_row +! r, dst_col +! c, unsafeSub' (base, startRow +! r, startCol +! c)))) end end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-array-slice.sig000066400000000000000000000036231416264345000262060ustar00rootroot00000000000000signature MONO_ARRAY_SLICE = sig type array type elem type slice type vector type vector_slice val length: slice -> int val sub: slice * int -> elem val update: slice * int * elem -> unit val full: array -> slice val slice: array * int * int option -> slice val subslice: slice * int * int option -> slice val base: slice -> array * int * int val vector: slice -> vector val copy: {src: slice, dst: array, di: int} -> unit val copyVec: {src: vector_slice, dst: array, di: int} -> unit val isEmpty: slice -> bool val getItem: slice -> (elem * slice) option val appi: (int * elem -> unit) -> slice -> unit val app: (elem -> unit) -> slice -> unit val modifyi: (int * elem -> elem) -> slice -> unit val modify: (elem -> elem) -> slice -> unit val foldli: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldl: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool val collate: (elem * elem -> order) -> slice * slice -> order end signature MONO_ARRAY_SLICE_EXTRA = sig include MONO_ARRAY_SLICE val concat: slice list -> array val toList: slice -> elem list val toPoly: slice -> elem ArraySlice.slice val uninitIsNop: slice -> bool val uninit: slice * int -> unit val unsafeSlice: array * int * int option -> slice val unsafeSub: slice * int -> elem val unsafeSubslice: slice * int * int option -> slice val unsafeUninit: slice * int -> unit val unsafeUpdate: slice * int * elem -> unit end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-array.fun000066400000000000000000000024171416264345000251170ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MonoArray (type elem structure MV: MONO_VECTOR_EXTRA where type elem = elem and type vector = elem Vector.vector and type MonoVectorSlice.slice = elem VectorSlice.slice ): MONO_ARRAY_EXTRA where type elem = elem and type vector = MV.vector and type vector_slice = MV.MonoVectorSlice.slice = struct open Array type elem = MV.elem type array = elem array type vector = MV.vector type vector_slice = MV.MonoVectorSlice.slice val fromPoly = fn a => a val toPoly = fn a => a structure MonoArraySlice = struct open ArraySlice type elem = elem type array = array type slice = elem slice type vector = vector type vector_slice = vector_slice val toPoly = fn s => s end end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-array.sig000066400000000000000000000040451416264345000251100ustar00rootroot00000000000000signature MONO_ARRAY = sig eqtype array type elem type vector val all: (elem -> bool) -> array -> bool val app: (elem -> unit) -> array -> unit val appi: (int * elem -> unit) -> array -> unit val array: int * elem -> array val collate: (elem * elem -> order) -> array * array -> order val copy: {src: array, dst: array, di: int} -> unit val copyVec: {src: vector, dst: array, di: int} -> unit val exists: (elem -> bool) -> array -> bool val find: (elem -> bool) -> array -> elem option val findi: (int * elem -> bool) -> array -> (int * elem) option val foldl: (elem * 'b -> 'b) -> 'b -> array -> 'b val foldli: (int * elem * 'b -> 'b) -> 'b -> array -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> array -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> array -> 'b val fromList: elem list -> array val length: array -> int val maxLen: int val modify: (elem -> elem) -> array -> unit val modifyi: (int * elem -> elem) -> array -> unit val sub: array * int -> elem val tabulate: int * (int -> elem) -> array val update: array * int * elem -> unit val vector: array -> vector end signature MONO_ARRAY_EXTRA = sig include MONO_ARRAY type vector_slice structure MonoArraySlice: MONO_ARRAY_SLICE_EXTRA where type elem = elem and type array = array and type vector = vector and type vector_slice = vector_slice val alloc: int -> array val uninitIsNop: array -> bool val uninit: array * int -> unit val concat: array list -> array val duplicate: array -> array val fromPoly: elem Array.array -> array val toList: array -> elem list val toPoly: array -> elem Array.array val unfoldi: int * 'a * (int * 'a -> elem * 'a) -> array * 'a val unsafeAlloc: int -> array val unsafeSub: array * int -> elem val unsafeUninit: array * int -> unit val unsafeUpdate: array * int * elem -> unit end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-array2.fun000066400000000000000000000014201416264345000251720ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MonoArray2 (type elem structure MV: MONO_VECTOR where type elem = elem and type vector = elem Vector.vector): MONO_ARRAY2 = struct type elem = MV.elem type vector = MV.vector open Array2 type array = elem array type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-array2.sig000066400000000000000000000023511416264345000251700ustar00rootroot00000000000000signature MONO_ARRAY2 = sig eqtype array type elem type vector type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = datatype Array2.traversal val app: traversal -> (elem -> unit) -> array -> unit val appi: traversal -> (int * int * elem -> unit) -> region -> unit val array: int * int * elem -> array val column: array * int -> vector val copy: {src: region, dst: array, dst_row: int, dst_col: int} -> unit val dimensions: array -> int * int val fold: traversal -> (elem * 'b -> 'b) -> 'b -> array -> 'b val foldi: traversal -> (int * int * elem * 'b -> 'b) -> 'b -> region -> 'b val fromList: elem list list -> array val modify: traversal -> (elem -> elem) -> array -> unit val modifyi: traversal -> (int * int * elem -> elem) -> region -> unit val nCols: array -> int val nRows: array -> int val row: array * int -> vector val sub: array * int * int -> elem val tabulate: traversal -> int * int * (int * int -> elem) -> array val update: array * int * int * elem -> unit end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-vector-slice.sig000066400000000000000000000052231416264345000263700ustar00rootroot00000000000000signature MONO_VECTOR_SLICE = sig type elem type slice type vector val all: (elem -> bool) -> slice -> bool val app: (elem -> unit) -> slice -> unit val appi: (int * elem -> unit) -> slice -> unit val base: slice -> vector * int * int val collate: (elem * elem -> order) -> slice * slice -> order val concat: slice list -> vector val exists: (elem -> bool) -> slice -> bool val find : (elem -> bool) -> slice -> elem option val findi: (int * elem -> bool) -> slice -> (int * elem) option val foldl: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldli: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val full: vector -> slice val getItem: slice -> (elem * slice) option val isEmpty: slice -> bool val length: slice -> int val map: (elem -> elem) -> slice -> vector val mapi: (int * elem -> elem) -> slice -> vector val slice: vector * int * int option -> slice val sub: slice * int -> elem val subslice: slice * int * int option -> slice val vector: slice -> vector end signature MONO_VECTOR_SLICE_EXTRA = sig include MONO_VECTOR_SLICE val concatWith: vector -> slice list -> vector val dropl: (elem -> bool) -> slice -> slice val dropr: (elem -> bool) -> slice -> slice val fields: (elem -> bool) -> slice -> slice list val fromPoly: elem VectorSlice.slice -> slice val isPrefix: (elem * elem -> bool) -> vector -> slice -> bool val isSubvector: (elem * elem -> bool) -> vector -> slice -> bool val isSuffix: (elem * elem -> bool) -> vector -> slice -> bool val position: (elem * elem -> bool) -> vector -> slice -> slice * slice val splitAt: slice * int -> slice * slice val splitl: (elem -> bool) -> slice -> slice * slice val splitr: (elem -> bool) -> slice -> slice * slice val takel: (elem -> bool) -> slice -> slice val taker: (elem -> bool) -> slice -> slice val toList: slice -> elem list val toPoly: slice -> elem VectorSlice.slice val tokens: (elem -> bool) -> slice -> slice list val translate: (elem -> vector) -> slice -> vector val triml: int -> slice -> slice val trimr: int -> slice -> slice val unsafeSlice: vector * int * int option -> slice val unsafeSub: slice * int -> elem val unsafeSubslice: slice * int * int option -> slice end signature EQTYPE_MONO_VECTOR_SLICE_EXTRA = sig include MONO_VECTOR_SLICE_EXTRA val span: slice * slice -> slice end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-vector.fun000066400000000000000000000026511416264345000253030ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MonoVector (type elem): MONO_VECTOR_EXTRA where type elem = elem = struct open Vector type array = elem array type elem = elem type vector = elem vector val fromPoly = fn v => v val toPoly = fn v => v structure MonoVectorSlice = struct open VectorSlice type elem = elem type vector = vector type slice = elem slice val fromPoly = fn s => s val toPoly = fn s => s end end functor EqtypeMonoVector (eqtype elem): EQTYPE_MONO_VECTOR_EXTRA where type elem = elem = struct open Vector type array = elem array type elem = elem type vector = elem vector type vector_eqtype = vector val fromPoly = fn v => v val toPoly = fn v => v structure MonoVectorSlice = struct open VectorSlice type elem = elem type vector = vector type slice = elem slice val fromPoly = fn s => s val toPoly = fn s => s end end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono-vector.sig000066400000000000000000000047731416264345000253040ustar00rootroot00000000000000signature MONO_VECTOR = sig type vector type elem val all: (elem -> bool) -> vector -> bool val app: (elem -> unit) -> vector -> unit val appi: (int * elem -> unit) -> vector -> unit val collate: (elem * elem -> order) -> vector * vector -> order val concat: vector list -> vector val exists: (elem -> bool) -> vector -> bool val find: (elem -> bool) -> vector -> elem option val findi: (int * elem -> bool) -> vector -> (int * elem) option val foldl: (elem * 'a -> 'a) -> 'a -> vector -> 'a val foldli: (int * elem * 'a -> 'a) -> 'a -> vector -> 'a val foldr: (elem * 'a -> 'a) -> 'a -> vector -> 'a val foldri: (int * elem * 'a -> 'a) -> 'a -> vector -> 'a val fromList: elem list -> vector val length: vector -> int val map: (elem -> elem) -> vector -> vector val mapi: (int * elem -> elem) -> vector -> vector val maxLen: int val sub: vector * int -> elem val tabulate: int * (int -> elem) -> vector val update: vector * int * elem -> vector end signature MONO_VECTOR_EXTRA_COMMON = sig include MONO_VECTOR type array val append: vector * vector -> vector val concatWith: vector -> vector list -> vector val duplicate: vector -> vector val fields: (elem -> bool) -> vector -> vector list val fromPoly: elem Vector.vector -> vector val isPrefix: (elem * elem -> bool) -> vector -> vector -> bool val isSubvector: (elem * elem -> bool) -> vector -> vector -> bool val isSuffix: (elem * elem -> bool) -> vector -> vector -> bool val toList: vector -> elem list val toPoly: vector -> elem Vector.vector val tokens: (elem -> bool) -> vector -> vector list val translate: (elem -> vector) -> vector -> vector val unfoldi: int * 'a * (int * 'a -> elem * 'a) -> vector * 'a val unsafeFromArray: array -> vector val unsafeSub: vector * int -> elem val vector: int * elem -> vector end signature MONO_VECTOR_EXTRA = sig include MONO_VECTOR_EXTRA_COMMON structure MonoVectorSlice: MONO_VECTOR_SLICE_EXTRA where type elem = elem and type vector = vector end signature EQTYPE_MONO_VECTOR_EXTRA = sig eqtype vector_eqtype include MONO_VECTOR_EXTRA_COMMON sharing type vector_eqtype = vector structure MonoVectorSlice: EQTYPE_MONO_VECTOR_SLICE_EXTRA where type elem = elem and type vector = vector end mlton-20210117+dfsg/basis-library/arrays-and-vectors/mono.sml000066400000000000000000000210101416264345000237740ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature EQTYPE_MONO = sig type elem structure MonoArray: MONO_ARRAY_EXTRA structure MonoArray2: MONO_ARRAY2 structure MonoVector: EQTYPE_MONO_VECTOR_EXTRA sharing type MonoArray.array = MonoVector.array sharing type elem = MonoArray.elem = MonoArray2.elem = MonoVector.elem sharing type MonoArray.vector = MonoArray2.vector = MonoVector.vector sharing type MonoArray.MonoArraySlice.vector_slice = MonoVector.MonoVectorSlice.slice end signature MONO = sig type elem structure MonoArray: MONO_ARRAY_EXTRA structure MonoArray2: MONO_ARRAY2 structure MonoVector: MONO_VECTOR_EXTRA sharing type MonoArray.array = MonoVector.array sharing type elem = MonoArray.elem = MonoArray2.elem = MonoVector.elem sharing type MonoArray.vector = MonoArray2.vector = MonoVector.vector sharing type MonoArray.MonoArraySlice.vector_slice = MonoVector.MonoVectorSlice.slice end functor EqtypeMonoX (eqtype elem) = struct type elem = elem structure MonoVector = EqtypeMonoVector (type elem = elem) structure MonoArray = MonoArray (type elem = elem structure MV = MonoVector) structure MonoArray2 = MonoArray2 (type elem = elem structure MV = MonoVector) end functor EqtypeMono (eqtype elem) :> EQTYPE_MONO where type elem = elem = struct type elem = elem structure MonoVector = EqtypeMonoVector (type elem = elem) structure MonoArray = MonoArray (type elem = elem structure MV = MonoVector) structure MonoArray2 = MonoArray2 (type elem = elem structure MV = MonoVector) end functor Mono (type elem) :> MONO where type elem = elem = struct type elem = elem structure MonoVector = MonoVector (type elem = elem) structure MonoArray = MonoArray (type elem = elem structure MV = MonoVector) structure MonoArray2 = MonoArray2 (type elem = elem structure MV = MonoVector) end local structure S = EqtypeMono (type elem = Primitive.Bool.bool) open S in structure BoolVector = MonoVector structure BoolVectorSlice = MonoVector.MonoVectorSlice structure BoolArray = MonoArray structure BoolArraySlice = MonoArray.MonoArraySlice structure BoolArray2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Int8.int) open S in structure Int8Vector = MonoVector structure Int8VectorSlice = MonoVector.MonoVectorSlice structure Int8Array = MonoArray structure Int8ArraySlice = MonoArray.MonoArraySlice structure Int8Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Int16.int) open S in structure Int16Vector = MonoVector structure Int16VectorSlice = MonoVector.MonoVectorSlice structure Int16Array = MonoArray structure Int16ArraySlice = MonoArray.MonoArraySlice structure Int16Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Int32.int) open S in structure Int32Vector = MonoVector structure Int32VectorSlice = MonoVector.MonoVectorSlice structure Int32Array = MonoArray structure Int32ArraySlice = MonoArray.MonoArraySlice structure Int32Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Int64.int) open S in structure Int64Vector = MonoVector structure Int64VectorSlice = MonoVector.MonoVectorSlice structure Int64Array = MonoArray structure Int64ArraySlice = MonoArray.MonoArraySlice structure Int64Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.IntInf.int) open S in structure IntInfVector = MonoVector structure IntInfVectorSlice = MonoVector.MonoVectorSlice structure IntInfArray = MonoArray structure IntInfArraySlice = MonoArray.MonoArraySlice structure IntInfArray2 = MonoArray2 end local structure S = Mono (type elem = Primitive.Real32.real) open S in structure Real32Vector = MonoVector structure Real32VectorSlice = MonoVector.MonoVectorSlice structure Real32Array = MonoArray structure Real32ArraySlice = MonoArray.MonoArraySlice structure Real32Array2 = MonoArray2 end local structure S = Mono (type elem = Primitive.Real64.real) open S in structure Real64Vector = MonoVector structure Real64VectorSlice = MonoVector.MonoVectorSlice structure Real64Array = MonoArray structure Real64ArraySlice = MonoArray.MonoArraySlice structure Real64Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Word8.word) open S in structure Word8Vector = MonoVector structure Word8VectorSlice = MonoVector.MonoVectorSlice structure Word8Array = MonoArray structure Word8ArraySlice = MonoArray.MonoArraySlice structure Word8Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Word16.word) open S in structure Word16Vector = MonoVector structure Word16VectorSlice = MonoVector.MonoVectorSlice structure Word16Array = MonoArray structure Word16ArraySlice = MonoArray.MonoArraySlice structure Word16Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Word32.word) open S in structure Word32Vector = MonoVector structure Word32VectorSlice = MonoVector.MonoVectorSlice structure Word32Array = MonoArray structure Word32ArraySlice = MonoArray.MonoArraySlice structure Word32Array2 = MonoArray2 end local structure S = EqtypeMono (type elem = Primitive.Word64.word) open S in structure Word64Vector = MonoVector structure Word64VectorSlice = MonoVector.MonoVectorSlice structure Word64Array = MonoArray structure Word64ArraySlice = MonoArray.MonoArraySlice structure Word64Array2 = MonoArray2 end local structure S = EqtypeMonoX (type elem = Char.char) open S in structure CharVector = MonoVector structure CharVectorSlice = MonoVector.MonoVectorSlice structure CharArray = MonoArray structure CharArraySlice = MonoArray.MonoArraySlice structure CharArray2 = MonoArray2 end local structure S = EqtypeMonoX (type elem = WideChar.char) open S in structure WideCharVector = MonoVector structure WideCharVectorSlice = MonoVector.MonoVectorSlice structure WideCharArray = MonoArray structure WideCharArraySlice = MonoArray.MonoArraySlice structure WideCharArray2 = MonoArray2 end local structure S = EqtypeMono (type elem = Int.int) open S in structure IntVector = MonoVector structure IntVectorSlice = MonoVector.MonoVectorSlice structure IntArray = MonoArray structure IntArraySlice = MonoArray.MonoArraySlice structure IntArray2 = MonoArray2 end local structure S = EqtypeMono (type elem = LargeInt.int) open S in structure LargeIntVector = MonoVector structure LargeIntVectorSlice = MonoVector.MonoVectorSlice structure LargeIntArray = MonoArray structure LargeIntArraySlice = MonoArray.MonoArraySlice structure LargeIntArray2 = MonoArray2 end local structure S = Mono (type elem = Real.real) open S in structure RealVector = MonoVector structure RealVectorSlice = MonoVector.MonoVectorSlice structure RealArray = MonoArray structure RealArraySlice = MonoArray.MonoArraySlice structure RealArray2 = MonoArray2 end local structure S = Mono (type elem = LargeReal.real) open S in structure LargeRealVector = MonoVector structure LargeRealVectorSlice = MonoVector.MonoVectorSlice structure LargeRealArray = MonoArray structure LargeRealArraySlice = MonoArray.MonoArraySlice structure LargeRealArray2 = MonoArray2 end local structure S = EqtypeMono (type elem = Word.word) open S in structure WordVector = MonoVector structure WordVectorSlice = MonoVector.MonoVectorSlice structure WordArray = MonoArray structure WordArraySlice = MonoArray.MonoArraySlice structure WordArray2 = MonoArray2 end local structure S = EqtypeMono (type elem = LargeWord.word) open S in structure LargeWordVector = MonoVector structure LargeWordVectorSlice = MonoVector.MonoVectorSlice structure LargeWordArray = MonoArray structure LargeWordArraySlice = MonoArray.MonoArraySlice structure LargeWordArray2 = MonoArray2 end mlton-20210117+dfsg/basis-library/arrays-and-vectors/sequence.fun000066400000000000000000000511401416264345000246400ustar00rootroot00000000000000(* Copyright (C) 2013,2017-2018 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = struct open SeqIndex local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = SeqIndex.sextdFromInt8 val fInt16 = SeqIndex.sextdFromInt16 val fInt32 = SeqIndex.sextdFromInt32 val fInt64 = SeqIndex.sextdFromInt64 val fIntInf = SeqIndex.sextdFromIntInf) in val fromIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = SeqIndex.schckFromInt8 val fInt16 = SeqIndex.schckFromInt16 val fInt32 = SeqIndex.schckFromInt32 val fInt64 = SeqIndex.schckFromInt64 val fIntInf = SeqIndex.schckFromIntInf) in val fromInt = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = SeqIndex.sextdToInt8 val fInt16 = SeqIndex.sextdToInt16 val fInt32 = SeqIndex.sextdToInt32 val fInt64 = SeqIndex.sextdToInt64 val fIntInf = SeqIndex.sextdToIntInf) in val toIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = SeqIndex.schckToInt8 val fInt16 = SeqIndex.schckToInt16 val fInt32 = SeqIndex.schckToInt32 val fInt64 = SeqIndex.schckToInt64 val fIntInf = SeqIndex.schckToIntInf) in val toInt = S.f end fun fromIntForLength n = if Primitive.Controls.safe then (fromInt n) handle Overflow => raise Size else fromIntUnsafe n end functor Sequence (S: PRIM_SEQUENCE): SEQUENCE = struct val op +! = SeqIndex.+! val op +$ = SeqIndex.+$ val op -! = SeqIndex.-! val op <= = SeqIndex.<= val op > = SeqIndex.> val op >= = SeqIndex.>= (* fun wrap1 f = fn (i) => f (SeqIndex.toIntUnsafe i) *) fun wrap2 f = fn (i, x) => f (SeqIndex.toIntUnsafe i, x) fun wrap3 f = fn (i, x, y) => f (SeqIndex.toIntUnsafe i, x, y) fun unwrap1 f = fn (i) => f (SeqIndex.fromIntUnsafe i) fun unwrap2 f = fn (i, x) => f (SeqIndex.fromIntUnsafe i, x) type 'a sequence = 'a S.sequence type 'a elt = 'a S.elt (* S.maxLen must be representable as an Int.int already *) val maxLen = SeqIndex.toInt S.maxLen fun length s = if Primitive.Controls.safe then (SeqIndex.toInt (S.length s)) handle Overflow => raise Fail "Sequence.length" else SeqIndex.toIntUnsafe (S.length s) fun alloc n = S.alloc (SeqIndex.fromIntForLength n) fun unsafeAlloc n = S.unsafeAlloc (SeqIndex.fromIntUnsafe n) fun create n = let val {done, sub, update} = S.create (SeqIndex.fromIntForLength n) in {done = done, sub = unwrap1 sub, update = unwrap2 update} end fun unfoldi (n, b, f) = S.unfoldi (SeqIndex.fromIntForLength n, b, wrap2 f) fun unfold (n, b, f) = S.unfold (SeqIndex.fromIntForLength n, b, f) fun unsafeUnfold (n, b, f) = S.unfold (SeqIndex.fromIntUnsafe n, b, f) fun seq0 () = #1 (unfold (0, (), fn _ => raise Fail "Sequence.seq0")) fun tabulate (n, f) = #1 (unfoldi (n, (), fn (i, ()) => (f i, ()))) fun new (n, x) = #1 (unfold (n, (), fn () => (x, ()))) fun unsafeNew (n, x) = #1 (unsafeUnfold (n, (), fn () => (x, ()))) fun fromList l = #1 (unfold (List.length l, l, fn l => case l of nil => raise Fail "Sequence.fromList" | h::t => (h, t))) structure Slice = struct type 'a sequence = 'a S.Slice.sequence type 'a elt = 'a S.Slice.elt type 'a slice = 'a S.Slice.slice fun length sl = if Primitive.Controls.safe then (SeqIndex.toInt (S.Slice.length sl)) handle Overflow => raise Fail "Sequence.Slice.length" else SeqIndex.toIntUnsafe (S.Slice.length sl) fun unsafeSub (sl, i) = S.Slice.unsafeSub (sl, SeqIndex.fromIntUnsafe i) fun sub (sl, i) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in S.Slice.sub (sl, i) end else unsafeSub (sl, i) fun unsafeUpdate (sl, i, x) = S.Slice.unsafeUpdate (sl, SeqIndex.fromIntUnsafe i, x) fun update (sl, i, x) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in S.Slice.update (sl, i, x) end else unsafeUpdate (sl, i, x) val uninitIsNop = S.Slice.uninitIsNop fun unsafeUninit (sl, i) = S.Slice.unsafeUninit (sl, SeqIndex.fromIntUnsafe i) fun uninit (sl, i) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in S.Slice.uninit (sl, i) end else unsafeUninit (sl, i) fun unsafeCopy {dst, di, src} = S.Slice.unsafeCopy {dst = dst, di = SeqIndex.fromIntUnsafe di, src = src} fun copy {dst, di, src} = (S.Slice.copy {dst = dst, di = SeqIndex.fromInt di, src = src}) handle Overflow => raise Subscript val full = S.Slice.full fun unsafeSubslice (sl, start, len) = S.Slice.unsafeSubslice (sl, SeqIndex.fromIntUnsafe start, Option.map SeqIndex.fromIntUnsafe len) fun unsafeSlice (seq, start, len) = unsafeSubslice (full seq, start, len) fun subslice (sl, start, len) = if Primitive.Controls.safe then (S.Slice.subslice (sl, SeqIndex.fromInt start, Option.map SeqIndex.fromInt len)) handle Overflow => raise Subscript else unsafeSubslice (sl, start, len) fun slice (seq: 'a sequence, start, len) = subslice (full seq, start, len) fun base sl = let val (seq, start, len) = S.Slice.base sl in if Primitive.Controls.safe then (seq, SeqIndex.toInt start, SeqIndex.toInt len) handle Overflow => raise Fail "Sequence.Slice.base" else (seq, SeqIndex.toIntUnsafe start, SeqIndex.toIntUnsafe len) end val isEmpty = S.Slice.isEmpty val getItem = S.Slice.getItem fun foldli f b sl = S.Slice.foldli (wrap3 f) b sl fun foldri f b sl = S.Slice.foldri (wrap3 f) b sl val foldl = S.Slice.foldl val foldr = S.Slice.foldr fun appi f sl = S.Slice.appi (wrap2 f) sl val app = S.Slice.app fun mapi f sl = S.Slice.mapi (wrap2 f) sl val map = S.Slice.map fun findi p sl = Option.map (wrap2 (fn z => z)) (S.Slice.findi (wrap2 p) sl) val find = S.Slice.find fun existsi p sl = S.Slice.existsi (wrap2 p) sl val exists = S.Slice.exists fun alli p sl = S.Slice.alli (wrap2 p) sl val all = S.Slice.all val collate = S.Slice.collate val sequence = S.Slice.sequence val append = S.Slice.append fun concatGen (xs: 'b list, toSlice: 'b -> 'a slice): 'a sequence = case xs of [] => seq0 () | [x] => sequence (toSlice x) | xs => let val add = if Primitive.Controls.safe then (fn (x, s) => (s +$ S.Slice.length (toSlice x)) handle Overflow => raise Size) else (fn (x, s) => s +! S.Slice.length (toSlice x)) val n = List.foldl add 0 xs val a = Primitive.Array.alloc n fun loop (di, xs) = case xs of [] => S.unsafeFromArray a | x::xs => let val sl = toSlice x in S.Slice.unsafeCopy {dst = a, di = di, src = sl} ; loop (di +! S.Slice.length sl, xs) end in loop (0, xs) end fun concat (sls: 'a slice list): 'a sequence = concatGen (sls, fn sl => sl) fun concatWithGen (sep: 'a sequence) (xs: 'b list, toSlice: 'b -> 'a slice): 'a sequence = case xs of [] => seq0 () | [x] => sequence (toSlice x) | x::xs => let val sep = S.Slice.full sep val sepn = S.Slice.length sep val add = if Primitive.Controls.safe then (fn (x, s) => (s +$ sepn +$ S.Slice.length (toSlice x)) handle Overflow => raise Size) else (fn (x, s) => (s +! sepn +! S.Slice.length (toSlice x))) val n = List.foldl add (S.Slice.length (toSlice x)) xs val a = Primitive.Array.alloc n fun loop (di, xs) = case xs of [] => raise Fail "Sequence.Slice.concatWithGen" | [x] => let val sl = toSlice x val _ = S.Slice.unsafeCopy {dst = a, di = di, src = sl} in S.unsafeFromArray a end | x::xs => let val sl = toSlice x val _ = S.Slice.unsafeCopy {dst = a, di = di, src = sl} val di = di +! S.Slice.length sl val _ = S.Slice.unsafeCopy {dst = a, di = di, src = sep} val di = di +! sepn in loop (di, xs) end in loop (0, x::xs) end fun concatWith sep sls = concatWithGen sep (sls, fn sl => sl) fun triml k sl = if Primitive.Controls.safe andalso Int.< (k, 0) then raise Subscript else let val len = S.Slice.length sl val k = if Primitive.Controls.safe then SeqIndex.fromInt k else SeqIndex.fromIntUnsafe k in if SeqIndex.> (k, len) then S.Slice.unsafeSubslice (sl, len, SOME 0) else S.Slice.unsafeSubslice (sl, k, SOME (len -! k)) end handle Overflow => (* k is positive, so behavior is specified! *) S.Slice.unsafeSubslice (sl, S.Slice.length sl, SOME 0) fun trimr k sl = if Primitive.Controls.safe andalso Int.< (k, 0) then raise Subscript else let val len = S.Slice.length sl val k = if Primitive.Controls.safe then SeqIndex.fromInt k else SeqIndex.fromIntUnsafe k in if SeqIndex.> (k, len) then S.Slice.unsafeSubslice (sl, 0, SOME 0) else S.Slice.unsafeSubslice (sl, 0, SOME (len -! k)) end handle Overflow => (* k is positive, so behavior is specified! *) S.Slice.unsafeSubslice (sl, 0, SOME 0) fun isSubsequence (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = S.Slice.length sl in if n <= n' then let val n'' = n' -! n fun loop (i, j) = if i > n'' then false else if j >= n then true else if eq (S.unsafeSub (seq, j), S.Slice.unsafeSub (sl, i +! j)) then loop (i, j +! 1) else loop (i +! 1, 0) in loop (0, 0) end else false end fun isPrefix (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = S.Slice.length sl in if n <= n' then let fun loop (j) = if j >= n then true else if eq (S.unsafeSub (seq, j), S.Slice.unsafeSub (sl, j)) then loop (j +! 1) else false in loop (0) end else false end fun isSuffix (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = S.Slice.length sl in if n <= n' then let val n'' = n' -! n fun loop (j) = if j >= n then true else if eq (S.unsafeSub (seq, j), S.Slice.unsafeSub (sl, n'' +! j)) then loop (j +! 1) else false in loop (0) end else false end val splitl = S.Slice.splitl val splitr = S.Slice.splitr fun splitAt (sl, i) = if Primitive.Controls.safe then (S.Slice.splitAt (sl, SeqIndex.fromInt i)) handle Overflow => raise Subscript else S.Slice.splitAt (sl, SeqIndex.fromIntUnsafe i) val dropl = S.Slice.dropl val dropr = S.Slice.dropr val takel = S.Slice.takel val taker = S.Slice.taker val position = S.Slice.position fun translate f (sl: 'a slice) = concat (List.rev (foldl (fn (c, l) => (full (f c)) :: l) [] sl)) local fun make finish p sl = let val (seq, start, len) = S.Slice.base sl val max = start +! len fun loop (i, start, sls) = if i >= max then List.rev (finish (seq, start, i, sls)) else if p (S.unsafeSub (seq, i)) then loop (i +! 1, i +! 1, finish (seq, start, i, sls)) else loop (i +! 1, start, sls) in loop (start, start, []) end in fun tokensGen fromSlice p sl = make (fn (seq, start, stop, sls) => if start = stop then sls else (fromSlice (S.Slice.unsafeSlice (seq, start, SOME (stop -! start)))) :: sls) p sl fun fieldsGen fromSlice p sl = make (fn (seq, start, stop, sls) => (fromSlice (S.Slice.unsafeSlice (seq, start, SOME (stop -! start)))) :: sls) p sl end fun tokens p sl = tokensGen (fn sl => sl) p sl fun fields p sl = fieldsGen (fn sl => sl) p sl fun toList (sl: 'a slice) = foldr (fn (a,l) => a::l) [] sl end local fun make f seq = f (Slice.full seq) fun make2 f (seq1, seq2) = f (Slice.full seq1, Slice.full seq2) in fun sub (seq, i) = Slice.sub (Slice.full seq, i) fun unsafeSub (seq, i) = Slice.unsafeSub (Slice.full seq, i) fun update (seq, i, x) = Slice.update (Slice.full seq, i, x) fun unsafeUpdate (seq, i, x) = Slice.unsafeUpdate (Slice.full seq, i, x) fun uninitIsNop seq = Slice.uninitIsNop (Slice.full seq) fun uninit (seq, i) = Slice.uninit (Slice.full seq, i) fun unsafeUninit (seq, i) = Slice.unsafeUninit (Slice.full seq, i) fun copy {dst, di, src} = Slice.copy {dst = dst, di = di, src = Slice.full src} fun unsafeCopy {dst, di, src} = Slice.unsafeCopy {dst = dst, di = di, src = Slice.full src} fun append seqs = make2 Slice.append seqs fun concat seqs = Slice.concatGen (seqs, Slice.full) fun appi f = make (Slice.appi f) fun app f = make (Slice.app f) fun mapi f = make (Slice.mapi f) fun map f = make (Slice.map f) fun foldli f b = make (Slice.foldli f b) fun foldl f b = make (Slice.foldl f b) fun foldri f b = make (Slice.foldri f b) fun foldr f b = make (Slice.foldr f b) fun findi p = make (Slice.findi p) fun find p = make (Slice.find p) fun existsi p = make (Slice.existsi p) fun exists p = make (Slice.exists p) fun alli p = make (Slice.alli p) fun all p = make (Slice.all p) fun collate cmp = make2 (Slice.collate cmp) fun concatWith sep seqs = Slice.concatWithGen sep (seqs, Slice.full) fun isPrefix eq seq = make (Slice.isPrefix eq seq) fun isSubsequence eq seq = make (Slice.isSubsequence eq seq) fun isSuffix eq seq = make (Slice.isSuffix eq seq) fun translate f = make (Slice.translate f) fun tokens f seq = make (Slice.tokensGen Slice.sequence f) seq fun fields f seq = make (Slice.fieldsGen Slice.sequence f) seq fun duplicate seq = make Slice.sequence seq fun toList seq = make Slice.toList seq end end mlton-20210117+dfsg/basis-library/arrays-and-vectors/sequence.sig000066400000000000000000000066311416264345000246370ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2014 Rob Simmons. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SEQUENCE = sig type 'a sequence type 'a elt structure Slice : SLICE where type 'a sequence = 'a sequence and type 'a elt = 'a elt val maxLen: int val length: 'a sequence -> int val sub: 'a sequence * int -> 'a elt val unsafeSub: 'a sequence * int -> 'a elt val update: 'a sequence * int * 'a elt -> unit val unsafeUpdate: 'a sequence * int * 'a elt -> unit val uninitIsNop: 'a sequence -> bool val uninit: 'a sequence * int -> unit val unsafeUninit: 'a sequence * int -> unit val copy: {dst: 'a elt Array.array, di: int, src: 'a sequence} -> unit val unsafeCopy: {dst: 'a elt Array.array, di: int, src: 'a sequence} -> unit val tabulate: int * (int -> 'a elt) -> 'a sequence val appi: (int * 'a elt -> unit) -> 'a sequence -> unit val app: ('a elt -> unit) -> 'a sequence -> unit val mapi : (int * 'a elt -> 'b elt) -> 'a sequence -> 'b sequence val map: ('a elt -> 'b elt) -> 'a sequence -> 'b sequence val foldli: (int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldri: (int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val findi: (int * 'a elt -> bool) -> 'a sequence -> (int * 'a elt) option val find: ('a elt -> bool) -> 'a sequence -> 'a elt option val existsi: (int * 'a elt -> bool) -> 'a sequence -> bool val exists: ('a elt -> bool) -> 'a sequence -> bool val alli: (int * 'a elt -> bool) -> 'a sequence -> bool val all: ('a elt -> bool) -> 'a sequence -> bool val collate: ('a elt * 'a elt -> order) -> 'a sequence * 'a sequence -> order val fromList: 'a elt list -> 'a sequence val toList: 'a sequence -> 'a elt list val concat: 'a sequence list -> 'a sequence (* Extra *) val alloc: int -> 'a sequence val append: 'a sequence * 'a sequence -> 'a sequence val create: int -> {done: unit -> 'a sequence, sub: int -> 'a elt, update: int * 'a elt -> unit} val duplicate: 'a sequence -> 'a sequence val new: int * 'a elt -> 'a sequence val unfoldi: int * 'b * (int * 'b -> 'a elt * 'b) -> 'a sequence * 'b val unfold: int * 'b * ('b -> 'a elt * 'b) -> 'a sequence * 'b val unsafeAlloc: int -> 'a sequence val unsafeNew: int * 'a elt -> 'a sequence (* Used to implement Substring/String functions *) val isPrefix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val concatWith: 'a sequence -> 'a sequence list -> 'a sequence val isSubsequence: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val isSuffix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val translate: ('a elt -> 'b sequence) -> 'a sequence -> 'b sequence val tokens: ('a elt -> bool) -> 'a sequence -> 'a sequence list val fields: ('a elt -> bool) -> 'a sequence -> 'a sequence list end mlton-20210117+dfsg/basis-library/arrays-and-vectors/sequence0.sig000066400000000000000000000057711416264345000247230ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2014 Rob Simmons. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_SEQUENCE = sig type 'a sequence type 'a elt structure Slice: PRIM_SLICE where type 'a sequence = 'a sequence and type 'a elt = 'a elt val maxLen: SeqIndex.int (* Must also be representable as an Int.int *) val length: 'a sequence -> SeqIndex.int val sub: 'a sequence * SeqIndex.int -> 'a elt val unsafeSub: 'a sequence * SeqIndex.int -> 'a elt val uninitIsNop: 'a sequence -> bool val uninit: 'a sequence * SeqIndex.int -> unit val unsafeUninit: 'a sequence * SeqIndex.int -> unit val update: 'a sequence * SeqIndex.int * 'a elt -> unit val unsafeUpdate: 'a sequence * SeqIndex.int * 'a elt -> unit val copy: {dst: 'a elt array, di: SeqIndex.int, src: 'a sequence} -> unit val unsafeCopy: {dst: 'a elt array, di: SeqIndex.int, src: 'a sequence} -> unit val tabulate: SeqIndex.int * (SeqIndex.int -> 'a elt) -> 'a sequence val appi: (SeqIndex.int * 'a elt -> unit) -> 'a sequence -> unit val app: ('a elt -> unit) -> 'a sequence -> unit val mapi: (SeqIndex.int * 'a elt -> 'b elt) -> 'a sequence -> 'b sequence val map: ('a elt -> 'b elt) -> 'a sequence -> 'b sequence val foldli: (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldri: (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val findi: (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> (SeqIndex.int * 'a elt) option val find: ('a elt -> bool) -> 'a sequence -> 'a elt option val existsi: (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> bool val exists: ('a elt -> bool) -> 'a sequence -> bool val alli: (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> bool val all: ('a elt -> bool) -> 'a sequence -> bool val collate: ('a elt * 'a elt -> order) -> 'a sequence * 'a sequence -> order (* Extra *) val alloc: SeqIndex.int -> 'a sequence val append: 'a sequence * 'a sequence -> 'a sequence val create: SeqIndex.int -> {done: unit -> 'a sequence, sub: SeqIndex.int -> 'a elt, update: SeqIndex.int * 'a elt -> unit} val duplicate: 'a sequence -> 'a sequence val new: SeqIndex.int * 'a elt -> 'a sequence val unfoldi: SeqIndex.int * 'b * (SeqIndex.int * 'b -> 'a elt * 'b) -> 'a sequence * 'b val unfold: SeqIndex.int * 'b * ('b -> 'a elt * 'b) -> 'a sequence * 'b val unsafeAlloc: SeqIndex.int -> 'a sequence val unsafeFromArray: 'a elt array -> 'a sequence end mlton-20210117+dfsg/basis-library/arrays-and-vectors/sequence0.sml000066400000000000000000000577061416264345000247410ustar00rootroot00000000000000(* Copyright (C) 2015,2017 Matthew Fluet. * Copyright (C) 2014 Rob Simmons. * Copyright (C) 2013 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PrimSequence (S: sig type 'a sequence type 'a elt val copyUnsafe: 'a elt array * SeqIndex.int * 'a sequence * SeqIndex.int * SeqIndex.int -> unit (* fromArray should be constant time. *) val fromArray: 'a elt array -> 'a sequence val isMutable: bool val length: 'a sequence -> SeqIndex.int val sameArray: 'a elt array * 'a sequence -> bool val subUnsafe: 'a sequence * SeqIndex.int -> 'a elt val uninitIsNop: 'a sequence -> bool val uninitUnsafe: 'a sequence * SeqIndex.int -> unit val updateUnsafe: 'a sequence * SeqIndex.int * 'a elt -> unit end) :> PRIM_SEQUENCE where type 'a sequence = 'a S.sequence where type 'a elt = 'a S.elt = struct structure Array = Primitive.Array val op +! = SeqIndex.+! val op + = SeqIndex.+ val op -! = SeqIndex.-! val op < = SeqIndex.< val op <= = SeqIndex.<= val op > = SeqIndex.> val op >= = SeqIndex.>= val gtu = SeqIndex.gtu val geu = SeqIndex.geu val ! = Primitive.Ref.deref val op := = Primitive.Ref.assign fun (f o g) x = f (g x) type 'a sequence = 'a S.sequence type 'a elt = 'a S.elt local fun valOf x: Primitive.Int32.int = case x of SOME y => y | NONE => 0 fun doit (precision, fromInt, maxInt') = if Primitive.Int32.>= (valOf SeqIndex.precision, precision) then fromInt maxInt' else SeqIndex.maxInt' structure S = Int_ChooseInt (type 'a t = SeqIndex.int val fInt8 = doit (valOf Primitive.Int8.precision, SeqIndex.schckFromInt8, Primitive.Int8.maxInt') val fInt16 = doit (valOf Primitive.Int16.precision, SeqIndex.schckFromInt16, Primitive.Int16.maxInt') val fInt32 = doit (valOf Primitive.Int32.precision, SeqIndex.schckFromInt32, Primitive.Int32.maxInt') val fInt64 = doit (valOf Primitive.Int64.precision, SeqIndex.schckFromInt64, Primitive.Int64.maxInt') val fIntInf = SeqIndex.maxInt') in val maxLen = S.f end fun length s = S.length s fun unsafeArrayAlloc n = Array.allocUnsafe n fun arrayAlloc n = if Primitive.Controls.safe andalso gtu (n, maxLen) then raise Size else unsafeArrayAlloc n fun unsafeAlloc n = S.fromArray (unsafeArrayAlloc n) fun alloc n = S.fromArray (arrayAlloc n) val unsafeFromArray = S.fromArray exception CreateAlreadyGotVector exception CreateVectorNotFull fun create n = let val a = arrayAlloc n val subLim : SeqIndex.t ref = ref 0 fun sub i = if Primitive.Controls.safe andalso geu (i, !subLim) then raise Subscript else Array.subUnsafe (a, i) val updateLim : SeqIndex.t ref = ref 0 fun update (i, x) = if Primitive.Controls.safe andalso geu (i, !updateLim) then if i = !updateLim andalso i < n then (Array.updateUnsafe (a, i, x); subLim := i + 1; updateLim := i + 1) else raise Subscript else Array.updateUnsafe (a, i, x) val gotIt = ref false fun done () = if !gotIt then raise CreateAlreadyGotVector else if n = !updateLim then (gotIt := true; updateLim := 0; S.fromArray a) else raise CreateVectorNotFull in {done = done, sub = sub, update = update} end fun unfoldi (n, b, f) = let val a = arrayAlloc n fun loop (i, b) = if i >= n then b else let val (x, b) = f (i, b) val () = Array.updateUnsafe (a, i, x) in loop (i +! 1, b) end val b = loop (0, b) in (S.fromArray a, b) end fun unfold (n, b, f) = unfoldi (n, b, f o #2) fun tabulate (n, f) = #1 (unfoldi (n, (), fn (i, ()) => (f i, ()))) fun new (n, x) = tabulate (n, fn _ => x) structure Slice = struct type 'a sequence = 'a sequence type 'a elt = 'a elt datatype 'a t = T of {seq: 'a sequence, start: SeqIndex.int, len: SeqIndex.int} type 'a slice = 'a t fun length (T {len, ...}) = len fun unsafeSub (T {seq, start, ...}, i) = S.subUnsafe (seq, start +! i) fun sub (sl as T {len, ...}, i) = if Primitive.Controls.safe andalso geu (i, len) then raise Subscript else unsafeSub (sl, i) fun unsafeUpdate (T {seq, start, ...}, i, x) = S.updateUnsafe (seq, start +! i, x) fun update (sl as T {len, ...}, i, x) = if Primitive.Controls.safe andalso geu (i, len) then raise Subscript else unsafeUpdate (sl, i, x) fun uninitIsNop (T {seq, ...}) = S.uninitIsNop seq fun unsafeUninit (T {seq, start, ...}, i) = S.uninitUnsafe (seq, start +! i) fun uninit (sl as T {len, ...}, i) = if Primitive.Controls.safe andalso geu (i, len) then raise Subscript else unsafeUninit (sl, i) local fun smallCopy {dst: 'a elt array, di: SeqIndex.int, src: 'a sequence, si: SeqIndex.int, len: SeqIndex.int, overlap: unit -> bool} = let fun move i = Array.updateUnsafe (dst, di +! i, S.subUnsafe (src, si +! i)) val len = len -! 1 in if overlap () then let fun loop i = if i < 0 then () else (move i; loop (i -! 1)) in loop len end else let fun loop i = if i > len then () else (move i; loop (i +! 1)) in loop 0 end end val smallCopyLimit = 5 fun maybeSmallCopy {dst: 'a elt array, di: SeqIndex.int, src: 'a sequence, si: SeqIndex.int, len: SeqIndex.int, overlap: unit -> bool} = if len < smallCopyLimit then smallCopy {dst = dst, di = di, src = src, si = si, len = len, overlap = overlap} else S.copyUnsafe (dst, di, src, si, len) in fun unsafeCopy {dst: 'a elt array, di: SeqIndex.int, src = T {seq = src, start = si, len}} = maybeSmallCopy {dst = dst, di = di, src = src, si = si, len = len, overlap = fn () => false} fun copy {dst: 'a elt array, di: SeqIndex.int, src = T {seq = src, start = si, len}} = if Primitive.Controls.safe andalso (gtu (di, Array.length dst) orelse gtu (di +! len, Array.length dst)) then raise Subscript else let fun overlap () = S.sameArray (dst, src) andalso si < di andalso di <= si +! len in maybeSmallCopy {dst = dst, di = di, src = src, si = si, len = len, overlap = overlap} end end fun full (seq: 'a sequence) : 'a slice = T {seq = seq, start = 0, len = S.length seq} fun unsafeSubslice (T {seq, start, len}, start', len') = T {seq = seq, start = start +! start', len = (case len' of NONE => len -! start' | SOME len' => len')} fun unsafeSlice (seq, start, len) = unsafeSubslice (full seq, start, len) fun subslice (T {seq, start, len}, start', len') = case len' of NONE => if Primitive.Controls.safe andalso gtu (start', len) then raise Subscript else T {seq = seq, start = start +! start', len = len -! start'} | SOME len' => if Primitive.Controls.safe andalso (gtu (start', len) orelse gtu (len', len -! start')) then raise Subscript else T {seq = seq, start = start +! start', len = len'} fun slice (seq: 'a sequence, start, len) = subslice (full seq, start, len) fun base (T {seq, start, len}) = (seq, start, len) fun isEmpty sl = length sl = 0 fun getItem (sl as T {seq, start, len}) = if isEmpty sl then NONE else SOME (S.subUnsafe (seq, start), T {seq = seq, start = start +! 1, len = len -! 1}) fun foldli f b (T {seq, start, len}) = let val min = start val len = len -! 1 val max = start +! len fun loop (i, b) = if i > max then b else loop (i +! 1, f (i -! min, S.subUnsafe (seq, i), b)) in loop (min, b) end fun foldri f b (T {seq, start, len}) = let val min = start val len = len -! 1 val max = start +! len fun loop (i, b) = if i < min then b else loop (i -! 1, f (i -! min, S.subUnsafe (seq, i), b)) in loop (max, b) end local fun make foldi f b sl = foldi (fn (_, x, b) => f (x, b)) b sl in fun foldl f = make foldli f fun foldr f = make foldri f end fun appi f sl = foldli (fn (i, x, ()) => f (i, x)) () sl fun app f sl = appi (f o #2) sl fun mapi f (T {seq, start, len}) = tabulate (len, fn i => f (i, S.subUnsafe (seq, start +! i))) fun map f sl = mapi (f o #2) sl fun findi p (T {seq, start, len}) = let val min = start val len = len -! 1 val max = start +! len fun loop i = if i > max then NONE else let val z = (i -! min, S.subUnsafe (seq, i)) in if p z then SOME z else loop (i +! 1) end in loop min end fun find p sl = case findi (p o #2) sl of NONE => NONE | SOME (_, x) => SOME x fun existsi p sl = case findi p sl of NONE => false | SOME _ => true fun exists p sl = existsi (p o #2) sl fun alli p sl = not (existsi (not o p) sl) fun all p sl = alli (p o #2) sl fun collate cmp (T {seq = seq1, start = start1, len = len1}, T {seq = seq2, start = start2, len = len2}) = let val min1 = start1 val min2 = start2 val max1 = start1 +! len1 val max2 = start2 +! len2 fun loop (i, j) = case (i >= max1, j >= max2) of (true, true) => EQUAL | (true, false) => LESS | (false, true) => GREATER | (false, false) => (case cmp (S.subUnsafe (seq1, i), S.subUnsafe (seq2, j)) of EQUAL => loop (i +! 1, j +! 1) | ans => ans) in loop (min1, min2) end fun sequence (sl as T {seq, start, len}): 'a sequence = if S.isMutable orelse (start <> 0 orelse len <> S.length seq) then let val a = arrayAlloc len in S.copyUnsafe (a, 0, seq, start, len) ; S.fromArray a end else seq fun append (sl1: 'a slice, sl2: 'a slice): 'a sequence = if length sl1 = 0 then sequence sl2 else if length sl2 = 0 then sequence sl1 else let val (seq1, start1, len1) = base sl1 val (seq2, start2, len2) = base sl2 val n = len1 +! len2 val a = arrayAlloc n in S.copyUnsafe (a, 0, seq1, start1, len1) ; S.copyUnsafe (a, len1, seq2, start2, len2) ; S.fromArray a end fun split (T {seq, start, len}, i) = (unsafeSlice (seq, start, SOME (i -! start)), unsafeSlice (seq, i, SOME (len -! (i -! start)))) fun splitl f (sl as T {seq, start, len}) = let val stop = start +! len fun loop i = if i >= stop then i else if f (S.subUnsafe (seq, i)) then loop (i +! 1) else i in split (sl, loop start) end fun splitr f (sl as T {seq, start, len}) = let fun loop i = if i < start then start else if f (S.subUnsafe (seq, i)) then loop (i -! 1) else i +! 1 in split (sl, loop (start +! len -! 1)) end fun splitAt (T {seq, start, len}, i) = if Primitive.Controls.safe andalso gtu (i, len) then raise Subscript else (unsafeSlice (seq, start, SOME i), unsafeSlice (seq, start +! i, SOME (len -! i))) fun dropl p s = #2 (splitl p s) fun dropr p s = #1 (splitr p s) fun takel p s = #1 (splitl p s) fun taker p s = #2 (splitr p s) fun position (eq: 'a elt * 'a elt -> bool) (seq': 'a sequence) (sl as T {seq, start, len}) = let val len' = S.length seq' val max = start +! len -! len' +! 1 (* loop returns the index of the front of the suffix. *) fun loop i = if i >= max then start +! len else let fun loop' j = if j >= len' then i else if eq (S.subUnsafe (seq, i +! j), S.subUnsafe (seq', j)) then loop' (j +! 1) else loop (i +! 1) in loop' 0 end in split (sl, loop start) end fun span (eq: 'a sequence * 'a sequence -> bool) (T {seq, start, ...}, T {seq = seq', start = start', len = len'}) = if Primitive.Controls.safe andalso (not (eq (seq, seq')) orelse start' +! len' < start) then raise Span else unsafeSlice (seq, start, SOME ((start' +! len') -! start)) end local fun make f seq = f (Slice.full seq) fun make2 f (seq1, seq2) = f (Slice.full seq1, Slice.full seq2) in fun sub (seq, i) = Slice.sub (Slice.full seq, i) fun unsafeSub (seq, i) = Slice.unsafeSub (Slice.full seq, i) fun update (seq, i, x) = Slice.update (Slice.full seq, i, x) fun unsafeUpdate (seq, i, x) = Slice.unsafeUpdate (Slice.full seq, i, x) fun uninitIsNop seq = Slice.uninitIsNop (Slice.full seq) fun uninit (seq, i) = Slice.uninit (Slice.full seq, i) fun unsafeUninit (seq, i) = Slice.unsafeUninit (Slice.full seq, i) fun copy {dst, di, src} = Slice.copy {dst = dst, di = di, src = Slice.full src} fun unsafeCopy {dst, di, src} = Slice.unsafeCopy {dst = dst, di = di, src = Slice.full src} fun appi f = make (Slice.appi f) fun app f = make (Slice.app f) fun mapi f = make (Slice.mapi f) fun map f = make (Slice.map f) fun foldli f b = make (Slice.foldli f b) fun foldl f b = make (Slice.foldl f b) fun foldri f b = make (Slice.foldri f b) fun foldr f b = make (Slice.foldr f b) fun findi p = make (Slice.findi p) fun find p = make (Slice.find p) fun existsi p = make (Slice.existsi p) fun exists p = make (Slice.exists p) fun alli p = make (Slice.alli p) fun all p = make (Slice.all p) fun collate cmp = make2 (Slice.collate cmp) fun append seqs = make2 Slice.append seqs fun duplicate seq = make Slice.sequence seq end end structure Primitive = struct open Primitive structure Array = struct local structure P = PrimSequence (type 'a sequence = 'a array type 'a elt = 'a val sameArray = op = val copyUnsafe = Primitive.Array.copyArrayUnsafe val fromArray = fn a => a val isMutable = true val length = Primitive.Array.length val subUnsafe = Primitive.Array.subUnsafe val uninitIsNop = Primitive.Array.uninitIsNop val uninitUnsafe = Primitive.Array.uninitUnsafe val updateUnsafe = Primitive.Array.updateUnsafe) in open P type 'a array = 'a array structure Slice = struct open Slice fun vector sl = let val a = unsafeAlloc (length sl) val () = unsafeCopy {dst = a, di = 0, src = sl} in Vector.fromArrayUnsafe a end fun modifyi f sl = appi (fn (i, x) => unsafeUpdate (sl, i, f (i, x))) sl fun modify f sl = modifyi (fn (_, x) => f x) sl end fun vector s = Slice.vector (Slice.full s) fun modifyi f s = Slice.modifyi f (Slice.full s) fun modify f s = Slice.modify f (Slice.full s) end structure Raw = struct type 'a rawarr = 'a Primitive.Array.Raw.rawarr val length = Primitive.Array.Raw.length val unsafeAlloc = Primitive.Array.Raw.allocUnsafe fun alloc n = if Primitive.Controls.safe andalso SeqIndex.gtu (n, maxLen) then raise Size else unsafeAlloc n val unsafeToArray = Primitive.Array.Raw.toArrayUnsafe val uninitIsNop = Primitive.Array.Raw.uninitIsNop val unsafeUninit = Primitive.Array.Raw.uninitUnsafe fun uninit (a, i) = if Primitive.Controls.safe andalso SeqIndex.geu (i, length a) then raise Subscript else unsafeUninit (a, i) end end structure Vector = struct local exception Vector_uninitIsNop exception Vector_uninitUnsafe exception Vector_updateUnsafe structure P = PrimSequence (type 'a sequence = 'a vector type 'a elt = 'a val copyUnsafe = Primitive.Array.copyVectorUnsafe val fromArray = Primitive.Vector.fromArrayUnsafe val isMutable = false val length = Vector.length val sameArray = fn _ => false val subUnsafe = Primitive.Vector.subUnsafe val uninitIsNop = fn _ => raise Vector_uninitIsNop val uninitUnsafe = fn _ => raise Vector_uninitUnsafe val updateUnsafe = fn _ => raise Vector_updateUnsafe) in open P type 'a vector = 'a vector fun updateVector (v, i, x) = if Primitive.Controls.safe andalso SeqIndex.geu (i, length v) then raise Subscript else let val a = Array.unsafeAlloc (length v) val () = copy {dst = a, di = 0, src = v} val () = Array.unsafeUpdate (a, i, x) in unsafeFromArray a end end end end structure Array = struct type 'a array = 'a array end structure Vector = struct type 'a vector = 'a vector end mlton-20210117+dfsg/basis-library/arrays-and-vectors/slice.sig000066400000000000000000000072071416264345000241260ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2014 Rob Simmons. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SLICE = sig type 'a sequence type 'a elt type 'a slice val length: 'a slice -> int val sub: 'a slice * int -> 'a elt val unsafeSub: 'a slice * int -> 'a elt val update: 'a slice * int * 'a elt -> unit val unsafeUpdate: 'a slice * int * 'a elt -> unit val uninitIsNop: 'a slice -> bool val uninit: 'a slice * int -> unit val unsafeUninit: 'a slice * int -> unit val copy: {dst: 'a elt Array.array, di: int, src: 'a slice} -> unit val unsafeCopy: {dst: 'a elt Array.array, di: int, src: 'a slice} -> unit val full: 'a sequence -> 'a slice val slice: 'a sequence * int * int option -> 'a slice val unsafeSlice: 'a sequence * int * int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice val base: 'a slice -> 'a sequence * int * int val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a elt * 'a slice) option val appi: (int * 'a elt -> unit) -> 'a slice -> unit val app: ('a elt -> unit) -> 'a slice -> unit val mapi: (int * 'a elt -> 'b elt) -> 'a slice -> 'b sequence val map: ('a elt -> 'b elt) -> 'a slice -> 'b sequence val foldli: (int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val findi: (int * 'a elt -> bool) -> 'a slice -> (int * 'a elt) option val find: ('a elt -> bool) -> 'a slice -> 'a elt option val existsi: (int * 'a elt -> bool) -> 'a slice -> bool val exists: ('a elt -> bool) -> 'a slice -> bool val alli: (int * 'a elt -> bool) -> 'a slice -> bool val all: ('a elt -> bool) -> 'a slice -> bool val collate: ('a elt * 'a elt -> order) -> 'a slice * 'a slice -> order val splitl: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitr: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitAt: 'a slice * int -> 'a slice * 'a slice val dropl: ('a elt -> bool) -> 'a slice -> 'a slice val dropr: ('a elt -> bool) -> 'a slice -> 'a slice val takel: ('a elt -> bool) -> 'a slice -> 'a slice val taker: ('a elt -> bool) -> 'a slice -> 'a slice val position: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> 'a slice * 'a slice val append: 'a slice * 'a slice -> 'a sequence val sequence: 'a slice -> 'a sequence val toList: 'a slice -> 'a elt list (* Used to implement Substring/String functions *) val concat: 'a slice list -> 'a sequence val concatWith: 'a sequence -> 'a slice list -> 'a sequence val triml: int -> 'a slice -> 'a slice val trimr: int -> 'a slice -> 'a slice val isPrefix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val isSubsequence: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val isSuffix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val translate: ('a elt -> 'b sequence) -> 'a slice -> 'b sequence val tokens: ('a elt -> bool) -> 'a slice -> 'a slice list val fields: ('a elt -> bool) -> 'a slice -> 'a slice list end mlton-20210117+dfsg/basis-library/arrays-and-vectors/slice0.sig000066400000000000000000000064731416264345000242120ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2014 Rob Simmons. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_SLICE = sig type 'a sequence type 'a elt type 'a slice val length: 'a slice -> SeqIndex.int val sub: 'a slice * SeqIndex.int -> 'a elt val unsafeSub: 'a slice * SeqIndex.int -> 'a elt val update: 'a slice * SeqIndex.int * 'a elt -> unit val unsafeUpdate: 'a slice * SeqIndex.int * 'a elt -> unit val uninitIsNop: 'a slice -> bool val uninit: 'a slice * SeqIndex.int -> unit val unsafeUninit: 'a slice * SeqIndex.int -> unit val copy: {dst: 'a elt array, di: SeqIndex.int, src: 'a slice} -> unit val unsafeCopy: {dst: 'a elt array, di: SeqIndex.int, src: 'a slice} -> unit val full: 'a sequence -> 'a slice val slice: 'a sequence * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSlice: 'a sequence * SeqIndex.int * SeqIndex.int option -> 'a slice val subslice: 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSubslice: 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val base: 'a slice -> 'a sequence * SeqIndex.int * SeqIndex.int val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a elt * 'a slice) option val appi: (SeqIndex.int * 'a elt -> unit) -> 'a slice -> unit val app: ('a elt -> unit) -> 'a slice -> unit val mapi: (SeqIndex.int * 'a elt -> 'b elt) -> 'a slice -> 'b sequence val map: ('a elt -> 'b elt) -> 'a slice -> 'b sequence val foldli: (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val findi: (SeqIndex.int * 'a elt -> bool) -> 'a slice -> (SeqIndex.int * 'a elt) option val find: ('a elt -> bool) -> 'a slice -> 'a elt option val existsi: (SeqIndex.int * 'a elt -> bool) -> 'a slice -> bool val exists: ('a elt -> bool) -> 'a slice -> bool val alli: (SeqIndex.int * 'a elt -> bool) -> 'a slice -> bool val all: ('a elt -> bool) -> 'a slice -> bool val collate: ('a elt * 'a elt -> order) -> 'a slice * 'a slice -> order val splitl: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitr: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitAt: 'a slice * SeqIndex.int -> 'a slice * 'a slice val dropl: ('a elt -> bool) -> 'a slice -> 'a slice val dropr: ('a elt -> bool) -> 'a slice -> 'a slice val takel: ('a elt -> bool) -> 'a slice -> 'a slice val taker: ('a elt -> bool) -> 'a slice -> 'a slice val position: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> 'a slice * 'a slice val append: 'a slice * 'a slice -> 'a sequence val sequence: 'a slice -> 'a sequence (* span: * ('a sequence * 'a sequence -> bool) should be polymorphic equality *) val span: ('a sequence * 'a sequence -> bool) -> 'a slice * 'a slice -> 'a slice end mlton-20210117+dfsg/basis-library/arrays-and-vectors/vector-slice.sig000066400000000000000000000057611416264345000254310ustar00rootroot00000000000000signature VECTOR_SLICE_GLOBAL = sig end signature VECTOR_SLICE = sig include VECTOR_SLICE_GLOBAL type 'a slice val length: 'a slice -> int val sub: 'a slice * int -> 'a val full: 'a Vector.vector -> 'a slice val slice: 'a Vector.vector * int * int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val base: 'a slice -> 'a Vector.vector * int * int val vector: 'a slice -> 'a Vector.vector val concat: 'a slice list -> 'a Vector.vector val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a * 'a slice) option val appi: (int * 'a -> unit) -> 'a slice -> unit val app: ('a -> unit) -> 'a slice -> unit val mapi: (int * 'a -> 'b) -> 'a slice -> 'b Vector.vector val map: ('a -> 'b) -> 'a slice -> 'b Vector.vector val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldl: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val find: ('a -> bool) -> 'a slice -> 'a option val exists: ('a -> bool) -> 'a slice -> bool val all: ('a -> bool) -> 'a slice -> bool val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order end signature VECTOR_SLICE_EXTRA = sig include VECTOR_SLICE val copy: {dst: 'a Array.array, di: int, src: 'a slice} -> unit val unsafeSub: 'a slice * int -> 'a val unsafeCopy: {dst: 'a Array.array, di: int, src: 'a slice} -> unit val unsafeSlice: 'a Vector.vector * int * int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice (* Used to implement Substring/String functions *) val concatWith: 'a Vector.vector -> 'a slice list -> 'a Vector.vector val triml: int -> 'a slice -> 'a slice val trimr: int -> 'a slice -> 'a slice val isPrefix: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val isSubvector: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val isSuffix: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val splitl: ('a -> bool) -> 'a slice -> 'a slice * 'a slice val splitr: ('a -> bool) -> 'a slice -> 'a slice * 'a slice val splitAt: 'a slice * int -> 'a slice * 'a slice val dropl: ('a -> bool) -> 'a slice -> 'a slice val dropr: ('a -> bool) -> 'a slice -> 'a slice val takel: ('a -> bool) -> 'a slice -> 'a slice val taker: ('a -> bool) -> 'a slice -> 'a slice val position: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> 'a slice * 'a slice val span: ''a slice * ''a slice -> ''a slice val translate: ('a -> 'b Vector.vector) -> 'a slice -> 'b Vector.vector val tokens: ('a -> bool) -> 'a slice -> 'a slice list val fields: ('a -> bool) -> 'a slice -> 'a slice list val toList: 'a slice -> 'a list end mlton-20210117+dfsg/basis-library/arrays-and-vectors/vector.sig000066400000000000000000000047421416264345000243320ustar00rootroot00000000000000signature VECTOR_GLOBAL = sig type 'a vector = 'a vector end signature VECTOR = sig include VECTOR_GLOBAL val maxLen: int val fromList: 'a list -> 'a vector val tabulate: int * (int -> 'a) -> 'a vector val length: 'a vector -> int val sub: 'a vector * int -> 'a val update: 'a vector * int * 'a -> 'a vector val concat: 'a vector list -> 'a vector val appi: (int * 'a -> unit) -> 'a vector -> unit val app: ('a -> unit) -> 'a vector -> unit val mapi : (int * 'a -> 'b) -> 'a vector -> 'b vector val map: ('a -> 'b) -> 'a vector -> 'b vector val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldl: ('a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a vector -> 'b val findi: (int * 'a -> bool) -> 'a vector -> (int * 'a) option val find: ('a -> bool) -> 'a vector -> 'a option val exists: ('a -> bool) -> 'a vector -> bool val all: ('a -> bool) -> 'a vector -> bool val collate: ('a * 'a -> order) -> 'a vector * 'a vector -> order end signature VECTOR_EXTRA = sig include VECTOR structure VectorSlice: VECTOR_SLICE_EXTRA val copy: {dst: 'a Array.array, di: int, src: 'a vector} -> unit val unsafeFromArray: 'a array -> 'a vector val unsafeSub: 'a vector * int -> 'a val unsafeCopy: {dst: 'a Array.array, di: int, src: 'a vector} -> unit (* Used to implement Substring/String functions *) val concatWith: 'a vector -> 'a vector list -> 'a vector val isPrefix: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val isSubvector: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val isSuffix: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val translate: ('a -> 'b vector) -> 'a vector -> 'b vector val tokens: ('a -> bool) -> 'a vector -> 'a vector list val fields: ('a -> bool) -> 'a vector -> 'a vector list val append: 'a vector * 'a vector -> 'a vector val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val duplicate: 'a vector -> 'a vector val toList: 'a vector -> 'a list val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b val unfold: int * 'b * ('b -> 'a * 'b) -> 'a vector * 'b val vector: int * 'a -> 'a vector end mlton-20210117+dfsg/basis-library/arrays-and-vectors/vector.sml000066400000000000000000000023221416264345000243330ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Vector: VECTOR_EXTRA = struct structure V = Sequence (Primitive.Vector) open V type 'a vector = 'a vector structure VectorSlice = struct open Slice type 'a vector = 'a vector val vector = sequence val isSubvector = isSubsequence val span = fn (sl, sl') => Primitive.Vector.Slice.span (op = : ''a vector * ''a vector -> bool) (sl, sl') end fun update (v, i, x) = (Primitive.Vector.updateVector (v, SeqIndex.fromInt i, x)) handle Overflow => raise Subscript val isSubvector = isSubsequence val unsafeFromArray = Primitive.Vector.unsafeFromArray val vector = new end structure VectorSlice: VECTOR_SLICE_EXTRA = Vector.VectorSlice structure VectorGlobal: VECTOR_GLOBAL = Vector open VectorGlobal val vector = Vector.fromList mlton-20210117+dfsg/basis-library/basis-1997.mlb000066400000000000000000000013641416264345000210010ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local basis-2002.mlb libs/basis-1997/basis-1997.mlb in libs/basis-1997/top-level/basis-funs.sml libs/basis-1997/top-level/basis-sigs.sml libs/basis-1997/top-level/top-level.sml libs/basis-1997/top-level/infixes.sml ann "allowOverload true" in libs/basis-1997/top-level/overloads.sml end end end mlton-20210117+dfsg/basis-library/basis-2002.mlb000066400000000000000000000013771416264345000207570ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb libs/basis-2002/basis-2002.mlb in libs/basis-2002/top-level/basis-funs.sml libs/basis-2002/top-level/basis-sigs.sml libs/basis-2002/top-level/top-level.sml libs/basis-2002/top-level/infixes.sml ann "allowOverload true" in libs/basis-2002/top-level/overloads.sml end end end mlton-20210117+dfsg/basis-library/basis-none.mlb000066400000000000000000000013161416264345000213240ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb ann "allowSpecifySpecialIds true" in libs/basis-none/top-level/basis.sig end libs/basis-none/top-level/basis.sml in libs/basis-none/top-level/top-level.sml libs/basis-none/top-level/infixes.sml end end mlton-20210117+dfsg/basis-library/basis.mlb000066400000000000000000000003301416264345000203620ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) basis-2002.mlb mlton-20210117+dfsg/basis-library/build/000077500000000000000000000000001416264345000176705ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/build/sources.mlb000066400000000000000000000235461416264345000220610ustar00rootroot00000000000000(* Copyright (C) 2013,2016-2017 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused false" "forceUsed" in ../primitive/primitive.mlb ../top-level/infixes.sml ../top-level/infixes-overflow.sml ../top-level/infixes-unsafe.sml ../util/dynamic-wind.sig ../util/dynamic-wind.sml ../integer/iwconv0.sml ../integer/num0.sml local ../config/bind/int-prim.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml ../config/metadata/sequence-metadata-$(SEQUENCE_METADATA_SIZE).sml ../config/metadata/normal-metadata-$(NORMAL_METADATA_SIZE).sml ../config/seqindex/seqindex-$(SEQINDEX_INT).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml end end ../arrays-and-vectors/slice0.sig ../arrays-and-vectors/sequence0.sig local local ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_INT).sml end end in ../arrays-and-vectors/sequence0.sml end ../integer/int-inf0.sml local local ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-word.sml ../config/c/position.sml ../config/c/sys-word.sml end end in ../integer/num1.sml end local ../config/bind/char-prim.sml ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/real-prim.sml ../config/bind/string-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_CHAR).sml ../config/default/default-$(DEFAULT_WIDECHAR).sml ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_REAL).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-real.sml ../config/default/large-word.sml end end ../general/general.sig ../general/general.sml ../util/one.sml ../general/option.sig ../general/option.sml ../list/list.sig ../list/list.sml ../list/list-pair.sig ../list/list-pair.sml local ../config/bind/int-prim.sml in ann "forceUsed" in ../config/seqindex/seqindex-$(SEQINDEX_INT).sml end end ../arrays-and-vectors/slice.sig ../arrays-and-vectors/sequence.sig ../arrays-and-vectors/sequence.fun ../arrays-and-vectors/vector-slice.sig ../arrays-and-vectors/vector.sig ../arrays-and-vectors/vector.sml ../arrays-and-vectors/array-slice.sig ../arrays-and-vectors/array.sig ../arrays-and-vectors/array.sml ../arrays-and-vectors/array2.sig ../arrays-and-vectors/array2.sml ../arrays-and-vectors/mono-vector-slice.sig ../arrays-and-vectors/mono-vector.sig ../arrays-and-vectors/mono-vector.fun ../arrays-and-vectors/mono-array-slice.sig ../arrays-and-vectors/mono-array.sig ../arrays-and-vectors/mono-array.fun ../arrays-and-vectors/mono-array2.sig ../arrays-and-vectors/mono-array2.fun ../arrays-and-vectors/mono.sml ../text/char0.sig ../text/string0.sml ../text/char0.sml ../util/reader.sig ../util/reader.sml ../text/string-cvt.sig ../text/string-cvt.sml ../general/bool.sig ../general/bool.sml ../integer/integer.sig ../integer/int.sml ../integer/word.sig ../integer/word.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../integer/int-inf.sig ../integer/int-inf.sml local ../config/bind/int-top.sml ../config/bind/int-inf-top.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-word.sml end end ../integer/int-global.sml ../integer/word-global.sml ../top-level/arithmetic.sml ../util/natural.sml ../integer/embed-int.sml ../integer/embed-word.sml ../integer/pack-word.sig ../integer/pack-word.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../text/char.sig ../text/string.sig ../text/substring.sig ../text/text.sig ../util/heap.sml ../text/char.sml ../text/string.sml ../text/substring.sml ../text/text.sml ../text/char-global.sml ../text/string-global.sml ../text/substring-global.sml ../text/byte.sig ../text/byte.sml ../text/nullstring.sml ../util/CUtil.sig ../util/CUtil.sml ../util/unique-id.sig ../util/unique-id.fun ../util/cleaner.sig ../util/cleaner.sml ../util/abs-rep.sig ../util/abs-rep.fun ../config/c/sys-types.sml ../system/pre-os.sml ../posix/pre-posix.sml ../posix/error.sig ../posix/error.sml ../real/IEEE-real.sig ../real/IEEE-real.sml ../real/math.sig ../real/real.sig ../real/real.sml local ../config/bind/real-top.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_REAL).sml ../config/default/large-real.sml end end ../real/real-global.sml ../real/pack-real.sig ../real/pack-real.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-top.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../system/time.sig ../system/time.sml ../system/date.sig ../system/date.sml ../io/io.sig ../io/io.sml ../io/prim-io.sig ../io/prim-io.fun ../io/bin-prim-io.sml ../io/text-prim-io.sml ../posix/stub-mingw.sml ../posix/flags.sig ../posix/flags.sml ../posix/signal.sig ../posix/signal.sml ../posix/proc-env.sig ../posix/proc-env.sml ../posix/file-sys.sig ../posix/file-sys.sml ../posix/io.sig ../posix/io.sml ../posix/process.sig ../posix/process.sml ../posix/sys-db.sig ../posix/sys-db.sml ../posix/tty.sig ../posix/tty.sml ../posix/posix.sig ../posix/posix.sml ../platform/cygwin.sml ../platform/mingw.sml ../io/stream-io.sig ../io/stream-io.fun ../io/imperative-io.sig ../io/imperative-io.fun ../io/bin-stream-io.sig ../io/bin-io.sig ../io/bin-io.sml ../io/text-stream-io.sig ../io/text-io.sig ../io/text-io.sml ../system/path.sig ../system/path.sml ../system/file-sys.sig ../system/file-sys.sml ../system/command-line.sig ../system/command-line.sml ../general/sml90.sig ../general/sml90.sml ../mlton/pointer.sig ../mlton/pointer.sml ../mlton/call-stack.sig ../mlton/call-stack.sml ../mlton/exit.sml ../mlton/exn.sig ../mlton/exn.sml ../mlton/thread.sig ../mlton/thread.sml ../mlton/signal.sig ../mlton/signal.sml ../mlton/process.sig ../mlton/process.sml ../mlton/gc.sig ../mlton/gc.sml ../mlton/rusage.sig ../mlton/rusage.sml ../system/process.sig ../system/process.sml ../system/io.sig ../system/io.sml ../system/os.sig ../system/os.sml ../system/unix.sig ../system/unix.sml ../system/timer.sig ../system/timer.sml ../net/net.sig ../net/net.sml ../net/net-host-db.sig ../net/net-host-db.sml ../net/net-prot-db.sig ../net/net-prot-db.sml ../net/net-serv-db.sig ../net/net-serv-db.sml ../net/socket.sig ../net/socket.sml ../net/generic-sock.sig ../net/generic-sock.sml ../net/inet-sock.sig ../net/inet-sock.sml ../net/unix-sock.sig ../net/unix-sock.sml ../mlton/platform.sig ../mlton/platform.sml ../mlton/array.sig ../mlton/cont.sig ../mlton/cont.sml ../mlton/random.sig ../mlton/random.sml ../mlton/io.sig ../mlton/io.fun ../mlton/text-io.sig ../mlton/bin-io.sig ../mlton/itimer.sig ../mlton/itimer.sml ../mlton/ffi.sig ann "ffiStr MLtonFFI" in ../mlton/ffi.sml end ../mlton/int-inf.sig ../mlton/proc-env.sig ../mlton/proc-env.sml ../mlton/profile.sig ../mlton/profile.sml (* ../mlton/ptrace.sig *) (* ../mlton/ptrace.sml *) ../mlton/rlimit.sig ../mlton/rlimit.sml ../mlton/syslog.sig ../mlton/syslog.sml ../mlton/vector.sig ../mlton/weak.sig ../mlton/weak.sml ../mlton/finalizable.sig ../mlton/finalizable.sml ../mlton/real.sig ../mlton/word.sig ../mlton/world.sig ../mlton/world.sml ../mlton/mono-array.sig ../mlton/mono-vector.sig ../mlton/mlton.sig ../mlton/mlton.sml ../sml-nj/sml-nj.sig ../sml-nj/sml-nj.sml ../sml-nj/unsafe.sig ../sml-nj/unsafe.sml end mlton-20210117+dfsg/basis-library/c-types.mlb000066400000000000000000000043271416264345000206570ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local basis.mlb mlton.mlb local config/choose-int.sml config/choose-real.sml config/choose-word.sml config/c/word-to-bool.sml config/bind/int-top.sml config/bind/real-top.sml config/bind/word-top.sml in ann "forceUsed" in $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml end end local local primitive/primitive.mlb in structure Primitive end in c/pointer.sig c/pointer.sml end in structure C_Char structure C_SChar functor C_SChar_ChooseIntN structure C_UChar functor C_UChar_ChooseWordN structure C_Short structure C_SShort functor C_SShort_ChooseIntN structure C_UShort functor C_UShort_ChooseWordN structure C_Int structure C_SInt functor C_SInt_ChooseIntN structure C_UInt functor C_UInt_ChooseWordN structure C_Long structure C_SLong functor C_SLong_ChooseIntN structure C_ULong functor C_ULong_ChooseWordN structure C_LongLong structure C_SLongLong functor C_SLongLong_ChooseIntN structure C_ULongLong functor C_ULongLong_ChooseWordN structure C_Float functor C_Float_ChooseRealN structure C_Double functor C_Double_ChooseRealN structure C_Size functor C_Size_ChooseWordN structure C_Ptrdiff functor C_Ptrdiff_ChooseIntN structure C_Intmax functor C_Intmax_ChooseIntN structure C_UIntmax functor C_UIntmax_ChooseWordN structure C_Intptr functor C_Intptr_ChooseIntN structure C_UIntptr functor C_UIntptr_ChooseWordN signature C_POINTER structure C_Pointer end end mlton-20210117+dfsg/basis-library/c/000077500000000000000000000000001416264345000170135ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/c/pointer.sig000066400000000000000000000066341416264345000212100ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_POINTER = sig type t = MLton.Pointer.t val add: t * C_Ptrdiff.t -> t val compare: t * t -> order val diff: t * t -> C_Ptrdiff.t val fromWord: C_Size.t -> t val getC_SChar: t * C_Ptrdiff.t -> C_SChar.t val getC_UChar: t * C_Ptrdiff.t -> C_UChar.t val getC_SShort: t * C_Ptrdiff.t -> C_SShort.t val getC_UShort: t * C_Ptrdiff.t -> C_UShort.t val getC_SInt: t * C_Ptrdiff.t -> C_SInt.t val getC_UInt: t * C_Ptrdiff.t -> C_UInt.t val getC_SLong: t * C_Ptrdiff.t -> C_SLong.t val getC_ULong: t * C_Ptrdiff.t -> C_ULong.t val getC_SLongLong: t * C_Ptrdiff.t -> C_SLongLong.t val getC_ULongLong: t * C_Ptrdiff.t -> C_ULongLong.t val getC_Float: t * C_Ptrdiff.t -> C_Float.t val getC_Double: t * C_Ptrdiff.t -> C_Double.t val getC_Size: t * C_Ptrdiff.t -> C_Size.t val getC_Ptrdiff: t * C_Ptrdiff.t -> C_Ptrdiff.t val getC_Intmax: t * C_Ptrdiff.t -> C_Intmax.t val getC_UIntmax: t * C_Ptrdiff.t -> C_UIntmax.t val getC_Intptr: t * C_Ptrdiff.t -> C_Intptr.t val getC_UIntptr: t * C_Ptrdiff.t -> C_UIntptr.t val getC_Pointer: t * C_Ptrdiff.t -> t val getInt8: t * C_Ptrdiff.t -> Int8.int val getInt16: t * C_Ptrdiff.t -> Int16.int val getInt32: t * C_Ptrdiff.t -> Int32.int val getInt64: t * C_Ptrdiff.t -> Int64.int val getReal32: t * C_Ptrdiff.t -> Real32.real val getReal64: t * C_Ptrdiff.t -> Real64.real val getWord8: t * C_Ptrdiff.t -> Word8.word val getWord16: t * C_Ptrdiff.t -> Word16.word val getWord32: t * C_Ptrdiff.t -> Word32.word val getWord64: t * C_Ptrdiff.t -> Word64.word val isNull: t -> bool val null: t val setC_SChar: t * C_Ptrdiff.t * C_SChar.t -> unit val setC_UChar: t * C_Ptrdiff.t * C_UChar.t -> unit val setC_SShort: t * C_Ptrdiff.t * C_SShort.t -> unit val setC_UShort: t * C_Ptrdiff.t * C_UShort.t -> unit val setC_SInt: t * C_Ptrdiff.t * C_SInt.t -> unit val setC_UInt: t * C_Ptrdiff.t * C_UInt.t -> unit val setC_SLong: t * C_Ptrdiff.t * C_SLong.t -> unit val setC_ULong: t * C_Ptrdiff.t * C_ULong.t -> unit val setC_SLongLong: t * C_Ptrdiff.t * C_SLongLong.t -> unit val setC_ULongLong: t * C_Ptrdiff.t * C_ULongLong.t -> unit val setC_Float: t * C_Ptrdiff.t * C_Float.t -> unit val setC_Double: t * C_Ptrdiff.t * C_Double.t -> unit val setC_Size: t * C_Ptrdiff.t * C_Size.t -> unit val setC_Ptrdiff: t * C_Ptrdiff.t * C_Ptrdiff.t -> unit val setC_Intmax: t * C_Ptrdiff.t * C_Intmax.t -> unit val setC_UIntmax: t * C_Ptrdiff.t * C_UIntmax.t -> unit val setC_Intptr: t * C_Ptrdiff.t * C_Intptr.t -> unit val setC_UIntptr: t * C_Ptrdiff.t * C_UIntptr.t -> unit val setC_Pointer: t * C_Ptrdiff.t * t -> unit val setInt8: t * C_Ptrdiff.t * Int8.int -> unit val setInt16: t * C_Ptrdiff.t * Int16.int -> unit val setInt32: t * C_Ptrdiff.t * Int32.int -> unit val setInt64: t * C_Ptrdiff.t * Int64.int -> unit val setReal32: t * C_Ptrdiff.t * Real32.real -> unit val setReal64: t * C_Ptrdiff.t * Real64.real -> unit val setWord8: t * C_Ptrdiff.t * Word8.word -> unit val setWord16: t * C_Ptrdiff.t * Word16.word -> unit val setWord32: t * C_Ptrdiff.t * Word32.word -> unit val setWord64: t * C_Ptrdiff.t * Word64.word -> unit val sizeofPointer: C_Size.t val sub: t * C_Ptrdiff.t -> t val toWord: t -> C_Size.t endmlton-20210117+dfsg/basis-library/c/pointer.sml000066400000000000000000000213751416264345000212200ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure C_Pointer : C_POINTER = struct open Primitive.MLton.Pointer val sizeofPointer = C_Size.div (C_Size.fromInt C_Size.wordSize, 0w8) local structure S = C_SChar_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SChar = S.f end local structure S = C_UChar_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UChar = S.f end local structure S = C_SShort_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SShort = S.f end local structure S = C_UShort_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UShort = S.f end local structure S = C_SInt_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SInt = S.f end local structure S = C_UInt_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UInt = S.f end local structure S = C_SLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SLong = S.f end local structure S = C_ULong_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_ULong = S.f end local structure S = C_SLongLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SLongLong = S.f end local structure S = C_ULongLong_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_ULongLong = S.f end local structure S = C_Float_ChooseRealN (type 'a t = t * C_Ptrdiff.t -> 'a val fReal32 = getReal32 val fReal64 = getReal64) in val getC_Float = S.f end local structure S = C_Double_ChooseRealN (type 'a t = t * C_Ptrdiff.t -> 'a val fReal32 = getReal32 val fReal64 = getReal64) in val getC_Double = S.f end local structure S = C_Size_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_Size = S.f end local structure S = C_Ptrdiff_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Ptrdiff = S.f end local structure S = C_Intmax_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Intmax = S.f end local structure S = C_UIntmax_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UIntmax = S.f end local structure S = C_Intptr_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Intptr = S.f end local structure S = C_UIntptr_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UIntptr = S.f end val getC_Pointer = getCPointer local structure S = C_SChar_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SChar = S.f end local structure S = C_UChar_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UChar = S.f end local structure S = C_SShort_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SShort = S.f end local structure S = C_UShort_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UShort = S.f end local structure S = C_SInt_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SInt = S.f end local structure S = C_UInt_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UInt = S.f end local structure S = C_SLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SLong = S.f end local structure S = C_ULong_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_ULong = S.f end local structure S = C_SLongLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SLongLong = S.f end local structure S = C_ULongLong_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_ULongLong = S.f end local structure S = C_Float_ChooseRealN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fReal32 = setReal32 val fReal64 = setReal64) in val setC_Float = S.f end local structure S = C_Double_ChooseRealN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fReal32 = setReal32 val fReal64 = setReal64) in val setC_Double = S.f end local structure S = C_Size_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_Size = S.f end local structure S = C_Ptrdiff_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Ptrdiff = S.f end local structure S = C_Intmax_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Intmax = S.f end local structure S = C_UIntmax_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UIntmax = S.f end local structure S = C_Intptr_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Intptr = S.f end local structure S = C_UIntptr_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UIntptr = S.f end val setC_Pointer = setCPointer end mlton-20210117+dfsg/basis-library/config/000077500000000000000000000000001416264345000200365ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/bind/000077500000000000000000000000001416264345000207525ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/bind/char-prim.sml000066400000000000000000000004631416264345000233540ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Char8 = Primitive.Char8 structure Char16 = Primitive.Char16 structure Char32 = Primitive.Char32 mlton-20210117+dfsg/basis-library/config/bind/int-inf-prim.sml000066400000000000000000000003551416264345000240030ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IntInf = Primitive.IntInf mlton-20210117+dfsg/basis-library/config/bind/int-inf-top.sml000066400000000000000000000003431416264345000236330ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IntInf = IntInf mlton-20210117+dfsg/basis-library/config/bind/int-prim.sml000066400000000000000000000005171416264345000232310ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int8 = Primitive.Int8 structure Int16 = Primitive.Int16 structure Int32 = Primitive.Int32 structure Int64 = Primitive.Int64 mlton-20210117+dfsg/basis-library/config/bind/int-top.sml000066400000000000000000000004471416264345000230660ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int8 = Int8 structure Int16 = Int16 structure Int32 = Int32 structure Int64 = Int64 mlton-20210117+dfsg/basis-library/config/bind/pointer-mlton.sml000066400000000000000000000003531416264345000242770ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Pointer = MLton.Pointer mlton-20210117+dfsg/basis-library/config/bind/pointer-prim.sml000066400000000000000000000003571416264345000241210ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Pointer = Primitive.Pointer mlton-20210117+dfsg/basis-library/config/bind/real-prim.sml000066400000000000000000000004211416264345000233540ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Real32 = Primitive.Real32 structure Real64 = Primitive.Real64 mlton-20210117+dfsg/basis-library/config/bind/real-top.sml000066400000000000000000000003751416264345000232170ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Real32 = Real32 structure Real64 = Real64 mlton-20210117+dfsg/basis-library/config/bind/string-prim.sml000066400000000000000000000004771416264345000237520ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure String8 = Primitive.String8 structure String16 = Primitive.String16 structure String32 = Primitive.String32 mlton-20210117+dfsg/basis-library/config/bind/word-prim.sml000066400000000000000000000005271416264345000234130ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Word8 = Primitive.Word8 structure Word16 = Primitive.Word16 structure Word32 = Primitive.Word32 structure Word64 = Primitive.Word64 mlton-20210117+dfsg/basis-library/config/bind/word-top.sml000066400000000000000000000004571416264345000232500ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Word8 = Word8 structure Word16 = Word16 structure Word32 = Word32 structure Word64 = Word64 mlton-20210117+dfsg/basis-library/config/c/000077500000000000000000000000001416264345000202605ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/c/errno.sml000066400000000000000000000006261416264345000221260ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure C_Errno :> sig type 'a t val check: 'a t -> 'a val inject: 'a -> 'a t end = struct type 'a t = 'a val check = fn x => x val inject = fn x => x end mlton-20210117+dfsg/basis-library/config/c/position.sml000066400000000000000000000005251416264345000226430ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Position = C_Off functor Position_ChooseIntN (A: CHOOSE_INT_ARG) : sig val f : Position.int A.t end = C_Off_ChooseIntN (A) mlton-20210117+dfsg/basis-library/config/c/sys-types.sml000066400000000000000000000052611416264345000227610ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_SYSTYPE = sig type t val castFromSysWord: SysWord.word -> t val castToSysWord: t -> SysWord.t end signature C_FLAGTYPE = sig include C_SYSTYPE val andb: t * t -> t val notb: t -> t val orb: t * t -> t end (* from *) structure C_DirP : C_SYSTYPE = C_DirP (* from *) structure C_NFds : sig include C_SYSTYPE val fromInt: Int.int -> t end = C_NFds (* from *) structure C_RLim : C_SYSTYPE = C_RLim (* from *) structure C_Clock : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val toLargeInt: t -> LargeInt.int end = C_Clock structure C_Dev : C_SYSTYPE = C_Dev structure C_GId : C_SYSTYPE = C_GId structure C_INo : C_SYSTYPE = C_INo structure C_Mode : C_FLAGTYPE = C_Mode structure C_NLink : sig include C_SYSTYPE val toInt: t -> int end = C_NLink structure C_Off = C_Off structure C_PId : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val ~ : t -> t end = C_PId structure C_SSize : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val toInt: t -> Int.int end = C_SSize structure C_SUSeconds : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val fromLargeInt: LargeInt.int -> t val toLargeInt: t -> LargeInt.int end = C_SUSeconds structure C_Time : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val fromInt: Int.int -> t val fromLargeInt: LargeInt.int -> t val toInt: t -> Int.int val toLargeInt: t -> LargeInt.int end = C_Time structure C_UId : C_SYSTYPE = C_UId (* from *) structure C_Socklen = C_Socklen (* from *) structure C_CC : C_SYSTYPE = C_CC structure C_Speed : sig include C_SYSTYPE val compare: t * t -> order end = C_Speed structure C_TCFlag : C_FLAGTYPE = C_TCFlag mlton-20210117+dfsg/basis-library/config/c/sys-word.sml000066400000000000000000000005371416264345000225710ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SysWord = C_UIntmax functor SysWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : SysWord.word A.t end = C_UIntmax_ChooseWordN (A) mlton-20210117+dfsg/basis-library/config/c/word-to-bool.sml000066400000000000000000000013041416264345000233170ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor WordToBool (S : sig eqtype t val one: t val zero: t end) : sig eqtype t val fromBool: bool -> t val toBool: t -> bool end = struct open S val fromBool: bool -> t = fn b => if b then zero else one val toBool: t -> bool = fn w => w <> zero end mlton-20210117+dfsg/basis-library/config/choose-char.sml000066400000000000000000000015431416264345000227510ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_CHARN_ARG = sig type 'a t val fChar8: Char8.char t val fChar16: Char16.char t val fChar32: Char32.char t end functor ChooseCharN_Char8 (A : CHOOSE_CHARN_ARG) : sig val f : Char8.char A.t end = struct val f = A.fChar8 val _ = A.fChar16 val _ = A.fChar32 end functor ChooseCharN_Char16 (A : CHOOSE_CHARN_ARG) : sig val f : Char16.char A.t end = struct val _ = A.fChar8 val f = A.fChar16 val _ = A.fChar32 end functor ChooseCharN_Char32 (A : CHOOSE_CHARN_ARG) : sig val f : Char32.char A.t end = struct val _ = A.fChar8 val _ = A.fChar16 val f = A.fChar32 end mlton-20210117+dfsg/basis-library/config/choose-int.sml000066400000000000000000000042341416264345000226260ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_INTN_ARG = sig type 'a t val fInt8: Int8.int t val fInt16: Int16.int t val fInt32: Int32.int t val fInt64: Int64.int t end functor ChooseIntN_Int8 (A : CHOOSE_INTN_ARG) : sig val f : Int8.int A.t end = struct val f = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int16 (A : CHOOSE_INTN_ARG) : sig val f : Int16.int A.t end = struct val _ = A.fInt8 val f = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int32 (A : CHOOSE_INTN_ARG) : sig val f : Int32.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val f = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int64 (A : CHOOSE_INTN_ARG) : sig val f : Int64.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val f = A.fInt64 end signature CHOOSE_INT_ARG = sig type 'a t val fInt8: Int8.int t val fInt16: Int16.int t val fInt32: Int32.int t val fInt64: Int64.int t val fIntInf: IntInf.int t end functor ChooseInt_Int8 (A : CHOOSE_INT_ARG) : sig val f : Int8.int A.t end = struct val f = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int16 (A : CHOOSE_INT_ARG) : sig val f : Int16.int A.t end = struct val _ = A.fInt8 val f = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int32 (A : CHOOSE_INT_ARG) : sig val f : Int32.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val f = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int64 (A : CHOOSE_INT_ARG) : sig val f : Int64.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val f = A.fInt64 val _ = A.fIntInf end functor ChooseInt_IntInf (A : CHOOSE_INT_ARG) : sig val f : IntInf.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val f = A.fIntInf end mlton-20210117+dfsg/basis-library/config/choose-real.sml000066400000000000000000000012061416264345000227530ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_REALN_ARG = sig type 'a t val fReal32: Real32.real t val fReal64: Real64.real t end functor ChooseRealN_Real32 (A : CHOOSE_REALN_ARG) : sig val f : Real32.real A.t end = struct val f = A.fReal32 val _ = A.fReal64 end functor ChooseRealN_Real64 (A : CHOOSE_REALN_ARG) : sig val f : Real64.real A.t end = struct val _ = A.fReal32 val f = A.fReal64 end mlton-20210117+dfsg/basis-library/config/choose-string.sml000066400000000000000000000014141416264345000233370ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_STRINGN_ARG = sig type 'a t val fString8: String8.string t val fString16: String16.string t val fString32: String32.string t end functor ChooseStringN_String8 (A : CHOOSE_STRINGN_ARG) : sig val f : String8.string A.t end = struct val f = A.fString8 end functor ChooseStringN_String16 (A : CHOOSE_STRINGN_ARG) : sig val f : String16.string A.t end = struct val f = A.fString16 end functor ChooseStringN_String32 (A : CHOOSE_STRINGN_ARG) : sig val f : String32.string A.t end = struct val f = A.fString32 end mlton-20210117+dfsg/basis-library/config/choose-word.sml000066400000000000000000000021521416264345000230040ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_WORDN_ARG = sig type 'a t val fWord8: Word8.word t val fWord16: Word16.word t val fWord32: Word32.word t val fWord64: Word64.word t end functor ChooseWordN_Word8 (A : CHOOSE_WORDN_ARG) : sig val f : Word8.word A.t end = struct val f = A.fWord8 val _ = A.fWord16 val _ = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word16 (A : CHOOSE_WORDN_ARG) : sig val f : Word16.word A.t end = struct val _ = A.fWord8 val f = A.fWord16 val _ = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word32 (A : CHOOSE_WORDN_ARG) : sig val f : Word32.word A.t end = struct val _ = A.fWord8 val _ = A.fWord16 val f = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word64 (A : CHOOSE_WORDN_ARG) : sig val f : Word64.word A.t end = struct val _ = A.fWord8 val _ = A.fWord16 val _ = A.fWord32 val f = A.fWord64 end mlton-20210117+dfsg/basis-library/config/default/000077500000000000000000000000001416264345000214625ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/default/default-char8.sml000066400000000000000000000010251416264345000246240ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Char = Char8 type char = Char.char structure String = String8 type string = String.string functor Char_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : Char.char A.t end = ChooseCharN_Char8 (A) functor String_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : String.string A.t end = ChooseStringN_String8 (A) mlton-20210117+dfsg/basis-library/config/default/default-int32.sml000066400000000000000000000005271416264345000245640ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int = Int32 type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_Int32 (A) mlton-20210117+dfsg/basis-library/config/default/default-int64.sml000066400000000000000000000005271416264345000245710ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int = Int64 type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_Int64 (A) mlton-20210117+dfsg/basis-library/config/default/default-intinf.sml000066400000000000000000000005311416264345000251070ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int = IntInf type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_IntInf (A) mlton-20210117+dfsg/basis-library/config/default/default-real32.sml000066400000000000000000000005461416264345000247160ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Real = Real32 type real = Real.real functor Real_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : Real.real A.t end = ChooseRealN_Real32 (A) mlton-20210117+dfsg/basis-library/config/default/default-real64.sml000066400000000000000000000005461416264345000247230ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Real = Real64 type real = Real.real functor Real_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : Real.real A.t end = ChooseRealN_Real64 (A) mlton-20210117+dfsg/basis-library/config/default/default-widechar16.sml000066400000000000000000000007771416264345000255710ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure WideChar = Char16 structure WideString = String16 functor WideChar_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : WideChar.char A.t end = ChooseCharN_Char16 (A) functor WideString_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : WideString.string A.t end = ChooseStringN_String16 (A) mlton-20210117+dfsg/basis-library/config/default/default-widechar32.sml000066400000000000000000000007771416264345000255670ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure WideChar = Char32 structure WideString = String32 functor WideChar_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : WideChar.char A.t end = ChooseCharN_Char32 (A) functor WideString_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : WideString.string A.t end = ChooseStringN_String32 (A) mlton-20210117+dfsg/basis-library/config/default/default-word32.sml000066400000000000000000000005461416264345000247460ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Word = Word32 type word = Word.word functor Word_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : Word.word A.t end = ChooseWordN_Word32 (A) mlton-20210117+dfsg/basis-library/config/default/default-word64.sml000066400000000000000000000005461416264345000247530ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Word = Word64 type word = Word.word functor Word_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : Word.word A.t end = ChooseWordN_Word64 (A) mlton-20210117+dfsg/basis-library/config/default/fixed-int.sml000066400000000000000000000005261416264345000240710ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure FixedInt = Int64 functor FixedInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : FixedInt.int A.t end = ChooseIntN_Int64 (A) mlton-20210117+dfsg/basis-library/config/default/large-int.sml000066400000000000000000000005251416264345000240630ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure LargeInt = IntInf functor LargeInt_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : LargeInt.int A.t end = ChooseInt_IntInf (A) mlton-20210117+dfsg/basis-library/config/default/large-real.sml000066400000000000000000000005371416264345000242170ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure LargeReal = Real64 functor LargeReal_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : LargeReal.real A.t end = ChooseRealN_Real64 (A) mlton-20210117+dfsg/basis-library/config/default/large-word.sml000066400000000000000000000005371416264345000242470ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure LargeWord = Word64 functor LargeWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : LargeWord.word A.t end = ChooseWordN_Word64 (A) mlton-20210117+dfsg/basis-library/config/metadata/000077500000000000000000000000001416264345000216165ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/metadata/normal-metadata-size128.sml000066400000000000000000000003371416264345000266070ustar00rootroot00000000000000(* Copyright (C) 2016-2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NormalMetaDataSize = struct val bytes : Int32.int = 16 end mlton-20210117+dfsg/basis-library/config/metadata/normal-metadata-size32.sml000066400000000000000000000003361416264345000265200ustar00rootroot00000000000000(* Copyright (C) 2016-2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NormalMetaDataSize = struct val bytes : Int32.int = 4 end mlton-20210117+dfsg/basis-library/config/metadata/normal-metadata-size64.sml000066400000000000000000000003361416264345000265250ustar00rootroot00000000000000(* Copyright (C) 2016-2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NormalMetaDataSize = struct val bytes : Int32.int = 8 end mlton-20210117+dfsg/basis-library/config/metadata/sequence-metadata-size128.sml000066400000000000000000000003341416264345000271240ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SequenceMetaDataSize = struct val bytes : Int32.int = 16 end mlton-20210117+dfsg/basis-library/config/metadata/sequence-metadata-size192.sml000066400000000000000000000003341416264345000271250ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SequenceMetaDataSize = struct val bytes : Int32.int = 24 end mlton-20210117+dfsg/basis-library/config/metadata/sequence-metadata-size256.sml000066400000000000000000000003341416264345000271260ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SequenceMetaDataSize = struct val bytes : Int32.int = 32 end mlton-20210117+dfsg/basis-library/config/metadata/sequence-metadata-size96.sml000066400000000000000000000003341416264345000270500ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SequenceMetaDataSize = struct val bytes : Int32.int = 12 end mlton-20210117+dfsg/basis-library/config/objptr/000077500000000000000000000000001416264345000213365ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/objptr/objptr-rep32.sml000066400000000000000000000007631416264345000243120ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure ObjptrInt = Int32 structure ObjptrWord = Word32 functor ObjptrInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : ObjptrInt.int A.t end = ChooseIntN_Int32 (A) functor ObjptrWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : ObjptrWord.word A.t end = ChooseWordN_Word32 (A) mlton-20210117+dfsg/basis-library/config/objptr/objptr-rep64.sml000066400000000000000000000007631416264345000243170ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure ObjptrInt = Int64 structure ObjptrWord = Word64 functor ObjptrInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : ObjptrInt.int A.t end = ChooseIntN_Int64 (A) functor ObjptrWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : ObjptrWord.word A.t end = ChooseWordN_Word64 (A) mlton-20210117+dfsg/basis-library/config/seqindex/000077500000000000000000000000001416264345000216565ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/config/seqindex/seqindex-int32.sml000066400000000000000000000005271416264345000251540ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = Int32 functor SeqIndex_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : SeqIndex.int A.t end = ChooseIntN_Int32 (A) mlton-20210117+dfsg/basis-library/config/seqindex/seqindex-int64.sml000066400000000000000000000005271416264345000251610ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = Int64 functor SeqIndex_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : SeqIndex.int A.t end = ChooseIntN_Int64 (A) mlton-20210117+dfsg/basis-library/default.mlb000066400000000000000000000006331416264345000207130ustar00rootroot00000000000000(* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Order here matters for choice of type names. In particular, we want * basis.mlb to come last so that basis type names are preferred to MLton type * names. *) unsafe.mlb sml-nj.mlb mlton.mlb basis.mlb mlton-20210117+dfsg/basis-library/equal.mlb000066400000000000000000000012271416264345000203760ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb ann "allowSpecifySpecialIds true" in libs/basis-2002/top-level/basis-equal.sig end in libs/basis-2002/top-level/pervasive-equal.sml end end mlton-20210117+dfsg/basis-library/general/000077500000000000000000000000001416264345000202065ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/general/bool.sig000066400000000000000000000004751416264345000216530ustar00rootroot00000000000000signature BOOL_GLOBAL = sig datatype bool = datatype bool val not: bool -> bool end signature BOOL = sig include BOOL_GLOBAL val fromString: string -> bool option val scan: (char, 'a) StringCvt.reader -> (bool, 'a) StringCvt.reader val toString: bool -> string end mlton-20210117+dfsg/basis-library/general/bool.sml000066400000000000000000000022051416264345000216550ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Bool: BOOL = struct datatype bool = datatype bool val not = not fun scan reader state = case reader state of NONE => NONE | SOME(c, state) => case c of #"f" => (case Reader.reader4 reader state of SOME((#"a", #"l", #"s", #"e"), state) => SOME(false, state) | _ => NONE) | #"t" => (case Reader.reader3 reader state of SOME((#"r", #"u", #"e"), state) => SOME(true, state) | _ => NONE) | _ => NONE val fromString = StringCvt.scanString scan val toString = fn true => "true" | false => "false" end structure BoolGlobal: BOOL_GLOBAL = Bool open BoolGlobal mlton-20210117+dfsg/basis-library/general/general.sig000066400000000000000000000014051416264345000223270ustar00rootroot00000000000000signature GENERAL_GLOBAL = sig eqtype unit type exn exception Bind exception Match exception Chr exception Div exception Domain exception Fail of string exception Overflow exception Size exception Span exception Subscript val exnName: exn -> string val exnMessage: exn -> string datatype order = LESS | EQUAL | GREATER val ! : 'a ref -> 'a val := : ('a ref * 'a) -> unit val o : (('b -> 'c) * ('a -> 'b)) -> 'a -> 'c val before: ('a * unit) -> 'a val ignore: 'a -> unit end signature GENERAL = sig include GENERAL_GLOBAL end signature GENERAL_EXTRA = sig include GENERAL val addExnMessager: (exn -> string option) -> unit end mlton-20210117+dfsg/basis-library/general/general.sml000066400000000000000000000030161416264345000223400ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure General: GENERAL_EXTRA = struct type unit = Primitive.Unit.unit type exn = exn exception Bind = Bind exception Match = Match exception Chr exception Div = Div exception Domain = Domain exception Fail of string exception Overflow = Overflow exception Size = Size exception Span = Span exception Subscript = Subscript datatype order = datatype Primitive.Order.order val ! = Primitive.Ref.deref val op := = Primitive.Ref.assign fun (f o g) x = f (g x) fun x before () = x fun ignore _ = () val exnName = Primitive.Exn.name local val messagers: (exn -> string option) list ref = ref [] in val addExnMessager: (exn -> string option) -> unit = fn f => messagers := f :: !messagers val rec exnMessage: exn -> string = fn e => let val rec find = fn [] => exnName e | m :: ms => case m e of NONE => find ms | SOME s => s in find (!messagers) end end end structure GeneralGlobal: GENERAL_GLOBAL = General open GeneralGlobal mlton-20210117+dfsg/basis-library/general/option.sig000066400000000000000000000013021416264345000222160ustar00rootroot00000000000000signature OPTION_GLOBAL = sig datatype 'a option = NONE | SOME of 'a exception Option val getOpt: 'a option * 'a -> 'a val isSome: 'a option -> bool val valOf: 'a option -> 'a end signature OPTION = sig include OPTION_GLOBAL val app: ('a -> unit) -> 'a option -> unit val compose: ('a -> 'b) * ('c -> 'a option) -> 'c -> 'b option val composePartial: ('a -> 'b option) * ('c -> 'a option) -> 'c -> 'b option val filter: ('a -> bool) -> 'a -> 'a option val join: 'a option option -> 'a option val map: ('a -> 'b) -> 'a option -> 'b option val mapPartial: ('a -> 'b option) -> 'a option -> 'b option end mlton-20210117+dfsg/basis-library/general/option.sml000066400000000000000000000016071416264345000222370ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Option: OPTION = struct datatype option = datatype option exception Option fun map f = fn NONE => NONE | SOME a => SOME (f a) fun app f z = (ignore (map f z); ()) fun compose (f, g) c = map f (g c) val join = fn NONE => NONE | SOME v => v fun mapPartial f = join o (map f) fun composePartial (f, g) = (mapPartial f) o g fun filter f a = if f a then SOME a else NONE fun getOpt (z, a) = case z of NONE => a | SOME v => v val isSome = fn NONE => false | SOME _ => true val valOf = fn NONE => raise Option | SOME v => v end structure OptionGlobal: OPTION_GLOBAL = Option open OptionGlobal mlton-20210117+dfsg/basis-library/general/sml90.sig000066400000000000000000000020721416264345000216570ustar00rootroot00000000000000signature SML90 = sig type instream type outstream exception Abs exception Diff exception Exp exception Floor exception Interrupt exception Io of string exception Ln exception Mod exception Neg exception Ord exception Prod exception Quot exception Sqrt exception Sum val arctan: real -> real val chr: int -> string val close_in: instream -> unit val close_out: outstream -> unit val cos: real -> real val end_of_stream: instream -> bool val exp: real -> real val explode: string -> string list val implode: string list -> string val input: instream * int -> string val ln: real -> real val lookahead: instream -> string val open_in: string -> instream val open_out: string -> outstream val ord: string -> int val output: outstream * string -> unit val sin: real -> real val sqrt: real -> real val std_in: instream val std_out: outstream end mlton-20210117+dfsg/basis-library/general/sml90.sml000066400000000000000000000043241416264345000216720ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SML90:> SML90 = struct type instream = TextIO.instream type outstream = TextIO.outstream exception Abs = Overflow exception Quot = Overflow exception Prod = Overflow exception Neg = Overflow exception Sum = Overflow exception Diff = Overflow exception Floor = Overflow exception Exp = Overflow exception Sqrt exception Ln exception Ord exception Mod = Div exception Io of string exception Interrupt local open Real.Math in val sqrt = fn x => if Real.< (x, 0.0) then raise Sqrt else sqrt x val exp = fn x => let val y = exp x in if Real.isFinite y then y else raise Exp end val ln = fn x => if Real.> (x, 0.0) then ln x else raise Ln val sin = sin val cos = cos val arctan = atan end fun ord s = if String.size s = 0 then raise Ord else Char.ord(String.sub(s, 0)) val chr = String.str o Char.chr fun explode s = List.map String.str (String.explode s) val implode = String.concat fun lookahead ins = case TextIO.lookahead ins of NONE => "" | SOME c => str c val std_in = TextIO.stdIn fun open_in f = TextIO.openIn f handle IO.Io _ => raise Io (concat ["Cannot open ", f]) fun input ins = TextIO.inputN ins handle IO.Io _ => raise Io "Input stream is closed" val close_in = TextIO.closeIn fun end_of_stream ins = TextIO.endOfStream ins handle _ => true val std_out = TextIO.stdOut fun open_out f = TextIO.openOut f handle IO.Io _ => raise Io (concat ["Cannot open ", f]) fun output (out, s) = TextIO.output (out, s) handle IO.Io _ => raise Io "Output stream is closed" val close_out = TextIO.closeOut end mlton-20210117+dfsg/basis-library/infixes.mlb000066400000000000000000000006571416264345000207420ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in libs/basis-2002/top-level/infixes.sml end mlton-20210117+dfsg/basis-library/integer/000077500000000000000000000000001416264345000202265ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/integer/embed-int.sml000066400000000000000000000112351416264345000226110ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature EMBED_INT = sig eqtype int type big val fromBigUnsafe: big -> int val sizeInBits: Int32.int val toBig: int -> big end functor EmbedInt (structure Big: INTEGER_EXTRA structure Small: EMBED_INT where type big = Big.int): INTEGER = struct structure Small = struct open Small val precision': Int.int = Int32.toInt sizeInBits end val () = if Int.< (Small.precision', Big.precision') then () else raise Fail "EmbedWord" open Small val shift = Word.fromInt (Int.- (Big.precision', precision')) val extend: Big.int -> Big.int = fn i => Big.~>> (Big.<< (i, shift), shift) val toBig: Small.int -> Big.int = extend o Small.toBig val precision = SOME precision' val maxIntBig = Big.>> (Big.fromInt ~1, Word.+ (shift, 0w1)) val minIntBig = Big.- (Big.~ maxIntBig, Big.fromInt 1) val mask = Big.>> (Big.fromInt ~1, shift) fun fromBig (i: Big.int): int = let val i' = Big.andb (i, mask) in if i = extend i' then fromBigUnsafe i' else raise Overflow end val maxInt = SOME (fromBig maxIntBig) val minInt = SOME (fromBig minIntBig) local val make: (Big.int * Big.int -> Big.int) -> (int * int -> int) = fn f => fn (x, y) => fromBig (f (toBig x, toBig y)) in val op * = make Big.* val op + = make Big.+ val op - = make Big.- val op div = make Big.div val op mod = make Big.mod val quot = make Big.quot val rem = make Big.rem end local val make: (Big.int * Big.int -> 'a) -> (int * int -> 'a) = fn f => fn (x, y) => f (toBig x, toBig y) in val op < = make Big.< val op <= = make Big.<= val op > = make Big.> val op >= = make Big.>= val compare = make Big.compare end val fromInt = fromBig o Big.fromInt val toInt = Big.toInt o toBig local val make: (Big.int -> Big.int) -> (int -> int) = fn f => fn x => fromBig (f (toBig x)) in val ~ = make Big.~ val abs = make Big.abs end fun fmt r i = Big.fmt r (toBig i) val fromLarge = fromBig o Big.fromLarge fun fromString s = Option.map fromBig (Big.fromString s) fun max (i, j) = if i >= j then i else j fun min (i, j) = if i <= j then i else j fun scan r reader state = Option.map (fn (i, state) => (fromBig i, state)) (Big.scan r reader state) val sign = Big.sign o toBig fun sameSign (x, y) = sign x = sign y val toLarge = Big.toLarge o toBig val toString = Big.toString o toBig end functor Embed8 (Small: EMBED_INT where type big = Int8.int): INTEGER = EmbedInt (structure Big = Int8 structure Small = Small) functor Embed16 (Small: EMBED_INT where type big = Int16.int): INTEGER = EmbedInt (structure Big = Int16 structure Small = Small) functor Embed32 (Small: EMBED_INT where type big = Int32.int): INTEGER = EmbedInt (structure Big = Int32 structure Small = Small) structure Int1 = Embed8 (Primitive.Int1) structure Int2 = Embed8 (Primitive.Int2) structure Int3 = Embed8 (Primitive.Int3) structure Int4 = Embed8 (Primitive.Int4) structure Int5 = Embed8 (Primitive.Int5) structure Int6 = Embed8 (Primitive.Int6) structure Int7 = Embed8 (Primitive.Int7) structure Int9 = Embed16 (Primitive.Int9) structure Int10 = Embed16 (Primitive.Int10) structure Int11 = Embed16 (Primitive.Int11) structure Int12 = Embed16 (Primitive.Int12) structure Int13 = Embed16 (Primitive.Int13) structure Int14 = Embed16 (Primitive.Int14) structure Int15 = Embed16 (Primitive.Int15) structure Int17 = Embed32 (Primitive.Int17) structure Int18 = Embed32 (Primitive.Int18) structure Int19 = Embed32 (Primitive.Int19) structure Int20 = Embed32 (Primitive.Int20) structure Int21 = Embed32 (Primitive.Int21) structure Int22 = Embed32 (Primitive.Int22) structure Int23 = Embed32 (Primitive.Int23) structure Int24 = Embed32 (Primitive.Int24) structure Int25 = Embed32 (Primitive.Int25) structure Int26 = Embed32 (Primitive.Int26) structure Int27 = Embed32 (Primitive.Int27) structure Int28 = Embed32 (Primitive.Int28) structure Int29 = Embed32 (Primitive.Int29) structure Int30 = Embed32 (Primitive.Int30) structure Int31 = Embed32 (Primitive.Int31) mlton-20210117+dfsg/basis-library/integer/embed-word.sml000066400000000000000000000134131416264345000227720ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature EMBED_WORD = sig eqtype word type big val fromBigUnsafe: big -> word val sizeInBits: Int32.int val toBig: word -> big end functor EmbedWord (structure Big: WORD structure Small: EMBED_WORD where type big = Big.word): WORD = struct structure Small = struct open Small val wordSize: Int.int = Int32.toInt sizeInBits end val () = if Int.< (Small.wordSize, Big.wordSize) then () else raise Fail "EmbedWord" open Small fun ones size = Big.- (Big.<< (Big.fromLarge 0w1, Word.fromInt size), Big.fromLarge 0w1) val maxWord = ones wordSize fun fromBig (w: Big.word): word = fromBigUnsafe (Big.andb (w, maxWord)) fun fromBigOverflow (w: Big.word): word = if Big.<= (w, maxWord) then fromBigUnsafe w else raise Overflow fun highBitIsSet (w: Big.word): bool = Big.> (w, ones (Int.- (wordSize, 1))) fun toBigX (w: word): Big.word = let val w = toBig w in if highBitIsSet w then Big.orb (w, Big.notb maxWord) else w end local val make: (Big.word * Big.word -> Big.word) -> (word * word -> word) = fn f => fn (x, y) => fromBig (f (toBig x, toBig y)) in val op * = make Big.* val op + = make Big.+ val op - = make Big.- val andb = make Big.andb val op div = make Big.div val op mod = make Big.mod val orb = make Big.orb val xorb = make Big.xorb end local val make: ((Big.word * Word.word -> Big.word) -> word * Word.word -> word) = fn f => fn (w, w') => fromBig (f (toBig w, w')) in val >> = make Big.>> val << = make Big.<< end fun ~>> (w, w') = fromBig (Big.~>> (toBigX w, w')) local val make: (Big.word * Big.word -> 'a) -> (word * word -> 'a) = fn f => fn (x, y) => f (toBig x, toBig y) in val op < = make Big.< val op <= = make Big.<= val op > = make Big.> val op >= = make Big.>= val compare = make Big.compare end local val make: (Big.word -> Big.word) -> word -> word = fn f => fn w => fromBig (f (toBig w)) in val notb = make Big.notb end local val make: ('a -> Big.word) -> 'a -> word = fn f => fn a => fromBig (f a) in val fromInt = make Big.fromInt val fromLarge = make Big.fromLarge val fromLargeInt = make Big.fromLargeInt end local val make: (Big.word -> 'a) -> word -> 'a = fn f => fn w => f (toBig w) in val toInt = make Big.toInt val toLarge = make Big.toLarge val toLargeInt = make Big.toLargeInt val toString = make Big.toString end local val make: (Big.word -> 'a) -> word -> 'a = fn f => fn w => f (toBigX w) in val toIntX = make Big.toIntX val toLargeIntX = make Big.toLargeIntX val toLargeX = make Big.toLargeX end fun fmt r i = Big.fmt r (toBig i) val fromLargeWord = fromLarge fun fromString s = Option.map fromBigOverflow (Big.fromString s) fun max (w, w') = if w >= w' then w else w' fun min (w, w') = if w <= w' then w else w' fun scan r reader state = Option.map (fn (w, state) => (fromBigOverflow w, state)) (Big.scan r reader state) val toLargeWord = toLarge val toLargeWordX = toLargeX fun ~ w = fromLarge 0w0 - w end functor EmbedWord8 (Small: EMBED_WORD where type big = Word8.word): WORD = EmbedWord (structure Big = Word8 structure Small = Small) functor EmbedWord16 (Small: EMBED_WORD where type big = Word16.word): WORD = EmbedWord (structure Big = Word16 structure Small = Small) functor EmbedWord32 (Small: EMBED_WORD where type big = Word32.word): WORD = EmbedWord (structure Big = Word32 structure Small = Small) structure Word1 = EmbedWord8 (Primitive.Word1) structure Word2 = EmbedWord8 (Primitive.Word2) structure Word3 = EmbedWord8 (Primitive.Word3) structure Word4 = EmbedWord8 (Primitive.Word4) structure Word5 = EmbedWord8 (Primitive.Word5) structure Word6 = EmbedWord8 (Primitive.Word6) structure Word7 = EmbedWord8 (Primitive.Word7) structure Word9 = EmbedWord16 (Primitive.Word9) structure Word10 = EmbedWord16 (Primitive.Word10) structure Word11 = EmbedWord16 (Primitive.Word11) structure Word12 = EmbedWord16 (Primitive.Word12) structure Word13 = EmbedWord16 (Primitive.Word13) structure Word14 = EmbedWord16 (Primitive.Word14) structure Word15 = EmbedWord16 (Primitive.Word15) structure Word17 = EmbedWord32 (Primitive.Word17) structure Word18 = EmbedWord32 (Primitive.Word18) structure Word19 = EmbedWord32 (Primitive.Word19) structure Word20 = EmbedWord32 (Primitive.Word20) structure Word21 = EmbedWord32 (Primitive.Word21) structure Word22 = EmbedWord32 (Primitive.Word22) structure Word23 = EmbedWord32 (Primitive.Word23) structure Word24 = EmbedWord32 (Primitive.Word24) structure Word25 = EmbedWord32 (Primitive.Word25) structure Word26 = EmbedWord32 (Primitive.Word26) structure Word27 = EmbedWord32 (Primitive.Word27) structure Word28 = EmbedWord32 (Primitive.Word28) structure Word29 = EmbedWord32 (Primitive.Word29) structure Word30 = EmbedWord32 (Primitive.Word30) structure Word31 = EmbedWord32 (Primitive.Word31) mlton-20210117+dfsg/basis-library/integer/int-global.sml000066400000000000000000000004651416264345000230000ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IntGlobal: INTEGER_GLOBAL = Int open IntGlobal mlton-20210117+dfsg/basis-library/integer/int-inf.sig000066400000000000000000000021341416264345000222760ustar00rootroot00000000000000signature INT_INF = sig include INTEGER val divMod: int * int -> int * int val quotRem: int * int -> int * int val pow: int * Int.int -> int val log2: int -> Int.int val orb: int * int -> int val xorb: int * int -> int val andb: int * int -> int val notb: int -> int val << : int * Word.word -> int val ~>> : int * Word.word -> int end signature INT_INF_EXTRA = sig include INT_INF type t = int structure BigWord : WORD structure SmallInt : INTEGER val areSmall: int * int -> bool val gcd: int * int -> int val isSmall: int -> bool datatype rep = Big of BigWord.word Vector.vector | Small of SmallInt.int val rep: int -> rep val fromRep: rep -> int option val zero: int val one: int val +! : int * int -> int val *! : int * int -> int val -! : int * int -> int val ~! : int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool end mlton-20210117+dfsg/basis-library/integer/int-inf.sml000066400000000000000000000277361416264345000223260ustar00rootroot00000000000000(* Copyright (C) 2013-2014 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IntInf: INT_INF_EXTRA = struct open Primitive.IntInf type t = int structure BigWord = C_MPLimb structure SmallInt = ObjptrInt structure W = ObjptrWord structure I = ObjptrInt structure MPLimb = C_MPLimb val precision: Int.int option = NONE fun sign (arg: int): Int.int = case compare (arg, zero) of LESS => ~1 | EQUAL => 0 | GREATER => 1 fun sameSign (x, y) = sign x = sign y local val maxShift32 = Word32.<< (0wx1, 0w30) val maxShift = Word32.toWord maxShift32 fun make f (arg, shift) = let fun body loop (arg, shift) = if Word.<= (shift, maxShift) then f (arg, Word32.fromWord shift) else loop (f (arg, maxShift32), Word.- (shift, maxShift)) fun loop (arg, shift) = body loop (arg, shift) in body loop (arg, shift) end in val << = make << val ~>> = make ~>> end val fromInt = schckFromInt val toInt = schckToInt val fromLarge = schckFromLargeInt val toLarge = schckToLargeInt local open StringCvt val binCvt = mkCvt {base = 2, smallCvt = I.fmt BIN} val octCvt = mkCvt {base = 8, smallCvt = I.fmt OCT} val decCvt = mkCvt {base = 10, smallCvt = I.fmt DEC} val hexCvt = mkCvt {base = 16, smallCvt = I.fmt HEX} in fun fmt radix = case radix of BIN => binCvt | OCT => octCvt | DEC => decCvt | HEX => hexCvt val toString = fmt DEC end local open StringCvt (* * Given a char, if it is a digit in the appropriate base, * convert it to a word. Otherwise, return NONE. * Note, both a-f and A-F are accepted as hexadecimal digits. *) fun binDig (ch: char): W.word option = case ch of #"0" => SOME 0w0 | #"1" => SOME 0w1 | _ => NONE local val op <= = Char.<= in fun octDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"7" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else NONE fun decDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"9" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else NONE fun hexDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"9" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else if #"a" <= ch andalso ch <= #"f" then SOME (W.fromInt (Int.- (Char.ord ch, Int.- (Char.ord #"a", 0xa)))) else if #"A" <= ch andalso ch <= #"F" then SOME (W.fromInt (Int.- (Char.ord ch, Int.- (Char.ord #"A", 0xA)))) else NONE end (* * Given a digit converter and a char reader, return a digit * reader. *) fun toDigR (charToDig: char -> W.word option, cread: (char, 'a) reader) (s: 'a) : (W.word * 'a) option = case cread s of NONE => NONE | SOME (ch, s') => case charToDig ch of NONE => NONE | SOME dig => SOME (dig, s') (* * A chunk represents the result of processing some digits. * more is a bool indicating if there might be more digits. * shift is base raised to the number-of-digits-seen power. * chunk is the value of the digits seen. *) type chunk = {more: bool, shift: W.word, chunk: W.word} (* * Given the base and a digit reader, * return a chunk reader. *) fun toChunkR (base: W.word, dread: (W.word, 'a) reader) : (chunk, 'a) reader = let fun loop {left: Int32.int, shift: W.word, chunk: W.word, s: 'a} : chunk * 'a = if Int32.<= (left, 0) then ({more = true, shift = shift, chunk = chunk}, s) else case dread s of NONE => ({more = false, shift = shift, chunk = chunk}, s) | SOME (dig, s') => loop {left = Int32.- (left, 1), shift = W.* (base, shift), chunk = W.+ (W.* (base, chunk), dig), s = s'} (* digitsPerChunk = floor((W.wordSize - 3) / (log2 base)) *) val digitsPerChunk : Int32.t = case (W.wordSize, base) of (64, 0w16) => 15 | (64, 0w10) => 18 | (64, 0w8) => 20 | (64, 0w2) => 61 | (32, 0w16) => 7 | (32, 0w10) => 8 | (32, 0w8) => 9 | (32, 0w2) => 29 | _ => raise (Fail "IntInf.scan:digitsPerChunk") fun reader (s: 'a): (chunk * 'a) option = case dread s of NONE => NONE | SOME (dig, next) => SOME (loop {left = Int32.- (digitsPerChunk, 1), shift = base, chunk = dig, s = next}) in reader end (* * Given a chunk reader, return an unsigned reader. *) fun toUnsR (ckread: (chunk, 'a) reader): (int, 'a) reader = let fun loop (more: bool, acc: int, s: 'a) = if more then case ckread s of NONE => (acc, s) | SOME ({more, shift, chunk}, s') => loop (more, ((W.toLargeInt shift) * acc) + (W.toLargeInt chunk), s') else (acc, s) fun reader (s: 'a): (int * 'a) option = case ckread s of NONE => NONE | SOME ({more, chunk, ...}, s') => SOME (loop (more, W.toLargeInt chunk, s')) in reader end (* * Given a char reader and an unsigned reader, return an unsigned * reader that includes skipping the option hex '0x'. *) fun toHexR (cread: (char, 'a) reader, uread: (int, 'a) reader) s = case cread s of NONE => NONE | SOME (c1, s1) => if c1 = #"0" then case cread s1 of NONE => SOME (zero, s1) | SOME (c2, s2) => if c2 = #"x" orelse c2 = #"X" then case uread s2 of NONE => SOME (zero, s1) | SOME x => SOME x else uread s else uread s (* * Given a char reader and an unsigned reader, return a signed * reader. This includes skipping any initial white space. *) fun toSign (cread: (char, 'a) reader, uread: (int, 'a) reader) : (int, 'a) reader = let fun reader (s: 'a): (int * 'a) option = let val s = StringCvt.skipWS cread s in case cread s of NONE => NONE | SOME (ch, s') => let val (isNeg, s'') = case ch of #"+" => (false, s') | #"-" => (true, s') | #"~" => (true, s') | _ => (false, s) in if isNeg then case uread s'' of NONE => NONE | SOME (abs, s''') => SOME (~ abs, s''') else uread s'' end end in reader end (* * Base-specific conversions from char readers to * int readers. *) local fun reader (base, dig) (cread: (char, 'a) reader) : (int, 'a) reader = let val dread = toDigR (dig, cread) val ckread = toChunkR (base, dread) val uread = toUnsR ckread val hread = if base = 0w16 then toHexR (cread, uread) else uread val reader = toSign (cread, hread) in reader end in fun binReader z = reader (0w2, binDig) z fun octReader z = reader (0w8, octDig) z fun decReader z = reader (0w10, decDig) z fun hexReader z = reader (0w16, hexDig) z end in fun scan radix = case radix of BIN => binReader | OCT => octReader | DEC => decReader | HEX => hexReader end val fromString = StringCvt.scanString (scan StringCvt.DEC) local fun isEven (n: Int.int) = Int.andb (n, 0x1) = 0 in fun pow (i: int, j: Int.int): int = if Int.< (j, 0) then if i = zero then raise Div else if i = one then one else if i = negOne then if isEven j then one else negOne else zero else if j = 0 then one else let fun square (n: int): int = n * n (* pow (j) returns (i ^ j) *) fun pow (j: Int.int): int = if Int.<= (j, 0) then one else if isEven j then evenPow j else i * evenPow (Int.- (j, 1)) (* evenPow (j) returns (i ^ j), assuming j is even *) and evenPow (j: Int.int): int = square (pow (Int.div (j, 2))) in pow j end end val log2 = mkLog2 {fromSmall = fn {smallLog2} => Int32.toInt smallLog2, fromLarge = fn {numLimbsMinusOne, mostSigLimbLog2} => Int.+ (Int.* (MPLimb.wordSize, SeqIndex.toInt numLimbsMinusOne), Int32.toInt mostSigLimbLog2)} end mlton-20210117+dfsg/basis-library/integer/int-inf0.sml000066400000000000000000002115421416264345000223740ustar00rootroot00000000000000(* Copyright (C) 2013-2014,2016-2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_INT_INF = sig eqtype int type t = int val precision: Primitive.Int32.int option val maxInt: int option val minInt: int option val zero: int val one: int val negOne: int datatype rep = Big of C_MPLimb.word vector | Small of ObjptrInt.int val rep: int -> rep val fromRep: rep -> int option val isSmall: int -> bool val areSmall: int * int -> bool val abs: int -> int val +! : int * int -> int val + : int * int -> int val divMod: int * int -> int * int val div: int * int -> int val gcd: int * int -> int val mod: int * int -> int val *! : int * int -> int val * : int * int -> int val ~! : int -> int val ~ : int -> int val quotRem: int * int -> int * int val quot: int * int -> int val rem: int * int -> int val -! : int * int -> int val - : int * int -> int val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val compare: int * int -> Primitive.Order.order val min: int * int -> int val max: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val andb: int * int -> int val < int val << : int * Primitive.Word32.word -> int val notb: int -> int val orb: int * int -> int val ~>>? : int * Primitive.Word32.word -> int val ~>> : int * Primitive.Word32.word -> int val xorb: int * int -> int val mkCvt: ({base: Primitive.Int32.int, smallCvt: ObjptrInt.int -> Primitive.String8.string} -> int -> Primitive.String8.string) val mkLog2: ({fromSmall: {smallLog2: Primitive.Int32.int} -> 'a, fromLarge: {mostSigLimbLog2: Primitive.Int32.int, numLimbsMinusOne: SeqIndex.int} -> 'a} -> int -> 'a) val zextdFromInt8: Primitive.Int8.int -> int val zextdFromInt16: Primitive.Int16.int -> int val zextdFromInt32: Primitive.Int32.int -> int val zextdFromInt64: Primitive.Int64.int -> int val zextdFromIntInf: Primitive.IntInf.int -> int val zextdFromWord8: Primitive.Word8.word -> int val zextdFromWord16: Primitive.Word16.word -> int val zextdFromWord32: Primitive.Word32.word -> int val zextdFromWord64: Primitive.Word64.word -> int val zextdToInt8: int -> Primitive.Int8.int val zextdToInt16: int -> Primitive.Int16.int val zextdToInt32: int -> Primitive.Int32.int val zextdToInt64: int -> Primitive.Int64.int val zextdToIntInf: int -> Primitive.IntInf.int val zextdToWord8: int -> Primitive.Word8.word val zextdToWord16: int -> Primitive.Word16.word val zextdToWord32: int -> Primitive.Word32.word val zextdToWord64: int -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> int val sextdFromInt16: Primitive.Int16.int -> int val sextdFromInt32: Primitive.Int32.int -> int val sextdFromInt64: Primitive.Int64.int -> int val sextdFromIntInf: Primitive.IntInf.int -> int val sextdFromWord8: Primitive.Word8.word -> int val sextdFromWord16: Primitive.Word16.word -> int val sextdFromWord32: Primitive.Word32.word -> int val sextdFromWord64: Primitive.Word64.word -> int val sextdToInt8: int -> Primitive.Int8.int val sextdToInt16: int -> Primitive.Int16.int val sextdToInt32: int -> Primitive.Int32.int val sextdToInt64: int -> Primitive.Int64.int val sextdToIntInf: int -> Primitive.IntInf.int val sextdToWord8: int -> Primitive.Word8.word val sextdToWord16: int -> Primitive.Word16.word val sextdToWord32: int -> Primitive.Word32.word val sextdToWord64: int -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> int val castFromInt16: Primitive.Int16.int -> int val castFromInt32: Primitive.Int32.int -> int val castFromInt64: Primitive.Int64.int -> int val castFromIntInf: Primitive.IntInf.int -> int val castFromWord8: Primitive.Word8.word -> int val castFromWord16: Primitive.Word16.word -> int val castFromWord32: Primitive.Word32.word -> int val castFromWord64: Primitive.Word64.word -> int val castToInt8: int -> Primitive.Int8.int val castToInt16: int -> Primitive.Int16.int val castToInt32: int -> Primitive.Int32.int val castToInt64: int -> Primitive.Int64.int val castToIntInf: int -> Primitive.IntInf.int val castToWord8: int -> Primitive.Word8.word val castToWord16: int -> Primitive.Word16.word val castToWord32: int -> Primitive.Word32.word val castToWord64: int -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> int val zchckFromInt16: Primitive.Int16.int -> int val zchckFromInt32: Primitive.Int32.int -> int val zchckFromInt64: Primitive.Int64.int -> int val zchckFromIntInf: Primitive.IntInf.int -> int val zchckFromWord8: Primitive.Word8.word -> int val zchckFromWord16: Primitive.Word16.word -> int val zchckFromWord32: Primitive.Word32.word -> int val zchckFromWord64: Primitive.Word64.word -> int val zchckToInt8: int -> Primitive.Int8.int val zchckToInt16: int -> Primitive.Int16.int val zchckToInt32: int -> Primitive.Int32.int val zchckToInt64: int -> Primitive.Int64.int val zchckToIntInf: int -> Primitive.IntInf.int val zchckToWord8: int -> Primitive.Word8.word val zchckToWord16: int -> Primitive.Word16.word val zchckToWord32: int -> Primitive.Word32.word val zchckToWord64: int -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> int val schckFromInt16: Primitive.Int16.int -> int val schckFromInt32: Primitive.Int32.int -> int val schckFromInt64: Primitive.Int64.int -> int val schckFromIntInf: Primitive.IntInf.int -> int val schckFromWord8: Primitive.Word8.word -> int val schckFromWord16: Primitive.Word16.word -> int val schckFromWord32: Primitive.Word32.word -> int val schckFromWord64: Primitive.Word64.word -> int val schckToInt8: int -> Primitive.Int8.int val schckToInt16: int -> Primitive.Int16.int val schckToInt32: int -> Primitive.Int32.int val schckToInt64: int -> Primitive.Int64.int val schckToIntInf: int -> Primitive.IntInf.int val schckToWord8: int -> Primitive.Word8.word val schckToWord16: int -> Primitive.Word16.word val schckToWord32: int -> Primitive.Word32.word val schckToWord64: int -> Primitive.Word64.word end signature PRIM_INTWORD_CONV = sig include PRIM_INTWORD_CONV val idFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zextdFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val zextdFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val zextdFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val zextdFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val zextdFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val zextdFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val zextdFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val zextdFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val zextdFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val zextdFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val zextdFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val zextdFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val zextdFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zextdFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val zextdFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val zextdFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val zextdFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val sextdFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val sextdFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val sextdFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val sextdFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val sextdFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val sextdFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val sextdFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val sextdFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val sextdFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val sextdFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val sextdFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val sextdFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val sextdFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val sextdFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val sextdFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val sextdFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val sextdFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val castFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val castFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val castFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val castFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val castFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val castFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val castFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val castFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val castFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val castFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val castFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val castFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val castFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val castFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val castFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val castFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val castFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val zchckFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val zchckFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val zchckFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val zchckFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val zchckFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val zchckFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val zchckFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val zchckFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val zchckFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val zchckFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val zchckFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val zchckFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val zchckFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zchckFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val zchckFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val zchckFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val zchckFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val schckFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val schckFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val schckFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val schckFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val schckFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val schckFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val schckFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val schckFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val schckFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val schckFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val schckFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val schckFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val schckFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val schckFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val schckFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val schckFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val schckFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word end signature PRIM_INTEGER = sig include PRIM_INTEGER val zextdFromIntInf: Primitive.IntInf.int -> int val zextdToIntInf: int -> Primitive.IntInf.int val sextdFromIntInf: Primitive.IntInf.int -> int val sextdToIntInf: int -> Primitive.IntInf.int val castFromIntInf: Primitive.IntInf.int -> int val castToIntInf: int -> Primitive.IntInf.int val zchckFromIntInf: Primitive.IntInf.int -> int val zchckToIntInf: int -> Primitive.IntInf.int val schckFromIntInf: Primitive.IntInf.int -> int val schckToIntInf: int -> Primitive.IntInf.int end signature PRIM_WORD = sig include PRIM_WORD val zextdFromIntInf: Primitive.IntInf.int -> word val zextdToIntInf: word -> Primitive.IntInf.int val sextdFromIntInf: Primitive.IntInf.int -> word val sextdToIntInf: word -> Primitive.IntInf.int val castFromIntInf: Primitive.IntInf.int -> word val castToIntInf: word -> Primitive.IntInf.int val zchckFromIntInf: Primitive.IntInf.int -> word val zchckToIntInf: word -> Primitive.IntInf.int val schckFromIntInf: Primitive.IntInf.int -> word val schckToIntInf: word -> Primitive.IntInf.int end structure Primitive = struct open Primitive structure IntInf = struct structure Prim = Primitive.IntInf structure MLton = Primitive.MLton structure A = Primitive.Array structure V = Primitive.Vector structure S = SeqIndex structure ObjptrWord = struct open ObjptrWord local structure S = ObjptrInt_ChooseIntN (type 'a t = 'a -> ObjptrWord.word val fInt8 = ObjptrWord.zextdFromInt8 val fInt16 = ObjptrWord.zextdFromInt16 val fInt32 = ObjptrWord.zextdFromInt32 val fInt64 = ObjptrWord.zextdFromInt64) in val idFromObjptrInt = S.f end local structure S = ObjptrInt_ChooseIntN (type 'a t = ObjptrWord.word -> 'a val fInt8 = ObjptrWord.zextdToInt8 val fInt16 = ObjptrWord.zextdToInt16 val fInt32 = ObjptrWord.zextdToInt32 val fInt64 = ObjptrWord.zextdToInt64) in val idToObjptrInt = S.f end local structure S = C_MPLimb_ChooseWordN (type 'a t = 'a -> ObjptrWord.word val fWord8 = ObjptrWord.castFromWord8 val fWord16 = ObjptrWord.castFromWord16 val fWord32 = ObjptrWord.castFromWord32 val fWord64 = ObjptrWord.castFromWord64) in val castFromMPLimb = S.f end local structure S = C_MPLimb_ChooseWordN (type 'a t = ObjptrWord.word -> 'a val fWord8 = ObjptrWord.castToWord8 val fWord16 = ObjptrWord.castToWord16 val fWord32 = ObjptrWord.castToWord32 val fWord64 = ObjptrWord.castToWord64) in val castToMPLimb = S.f end end structure W = ObjptrWord structure I = ObjptrInt structure MPLimb = C_MPLimb structure Sz = struct open C_Size local structure S = SeqIndex_ChooseIntN (type 'a t = 'a -> C_Size.word val fInt8 = C_Size.zextdFromInt8 val fInt16 = C_Size.zextdFromInt16 val fInt32 = C_Size.zextdFromInt32 val fInt64 = C_Size.zextdFromInt64) in val zextdFromSeqIndex = S.f end end type bigInt = Prim.int val zero: bigInt = 0 val one: bigInt = 1 val negOne: bigInt = ~1 (* Check if an IntInf.int is small (i.e., a fixnum). *) fun isSmall (i: bigInt): bool = 0w0 <> W.andb (Prim.toWord i, 0w1) (* Check if two IntInf.int's are both small (i.e., fixnums). *) fun areSmall (i: bigInt, i': bigInt): bool = 0w0 <> W.andb (W.andb (Prim.toWord i, Prim.toWord i'), 0w1) (* Return the number of `limbs' in a bigInt. *) fun bigNumLimbs i = S.- (V.length (Prim.toVector i), 1) fun numLimbs i = if isSmall i then 1 else bigNumLimbs i fun dropTag (w: W.word): W.word = W.~>>? (w, 0w1) fun dropTagCoerce (i: bigInt): W.word = dropTag (Prim.toWord i) fun dropTagCoerceInt (i: bigInt): I.int = W.idToObjptrInt (dropTagCoerce i) fun addTag (w: W.word): W.word = W.orb (W.< let val limbsPerObjptr = if Int32.>= (MPLimb.sizeInBits, ObjptrWord.sizeInBits) then 1 else S.sextdFromInt32 (Int32.quot (ObjptrWord.sizeInBits, MPLimb.sizeInBits)) val l = V.length v val ok = (* sign limb + magnitude limb(s) *) S.>= (l, 2) andalso (* sign limb is 0w0 (positive) or 0w1 (negative) *) MPLimb.<= (V.unsafeSub (v, 0), 0w1) andalso (* most-significant magnitude limb is non-zero *) MPLimb.> (V.unsafeSub (v, S.- (l, 1)), 0w0) andalso (* value exceeds Small representation; * if positive, then mag in [1, 2^(ObjptrWord.sizeInBits - 2)]. * if negative, then mag in [0, 2^(ObjptrWord.sizeInBits - 2) - 1]. *) (S.> (l, S.+ (1, limbsPerObjptr)) orelse if Int32.<= (ObjptrWord.sizeInBits, MPLimb.sizeInBits) then let val mag = V.unsafeSub (v, 1) in MPLimb.>= (if MPLimb.>= (V.unsafeSub (v, 0), 0w1) then MPLimb.- (mag, 0w1) else mag, MPLimb.<= (if MPLimb.>= (V.unsafeSub (v, 0), 0w1) then ObjptrWord.- (mag, 0w1) else mag, ObjptrWord.< let val w = ObjptrWord.idFromObjptrInt i val wt = addTag w val ok = w = dropTag wt in if ok then SOME (Prim.fromWord wt) else NONE end local fun 'a make {zextdToMPLimb: 'a -> MPLimb.word, zextdToObjptrWord: 'a -> ObjptrWord.word, sextdToObjptrWord: 'a -> ObjptrWord.word, other : {sizeInBits: Int32.int, zero: 'a, eq: 'a * 'a -> bool, isNeg: 'a -> bool, neg: 'a -> 'a, notb: 'a -> 'a, rashift: 'a * Word32.word -> 'a, rshift: 'a * Word32.word -> 'a}} (sextd, w) = if Int32.> (ObjptrWord.sizeInBits, #sizeInBits other) orelse let val shift = Word32.- (ObjptrWord.sizeInBitsWord, 0w2) val upperBits = (#rashift other) (w, shift) val zeroBits = #zero other val oneBits = (#notb other) zeroBits in (#eq other) (upperBits, zeroBits) orelse (sextd andalso (#eq other) (upperBits, oneBits)) end then if sextd then Prim.fromWord (addTag (sextdToObjptrWord w)) else Prim.fromWord (addTag (zextdToObjptrWord w)) else let fun loop (w, i, acc) = if (#eq other) (w, (#zero other)) then (i, acc) else let val limb = zextdToMPLimb w val w = (#rshift other) (w, MPLimb.sizeInBitsWord) in loop (w, S.+ (i, 1), (i, limb) :: acc) end val (n, acc) = if sextd andalso (#isNeg other) w then loop ((#neg other) w, 1, [(0,0w1)]) else loop (w, 1, [(0,0w0)]) val a = A.unsafeAlloc n fun loop acc = case acc of [] => () | (i, v) :: acc => (A.unsafeUpdate (a, i, v) ; loop acc) val () = loop acc in Prim.fromVector (V.unsafeFromArray a) end in fun extdFromWord8 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord8, zextdToObjptrWord = ObjptrWord.zextdFromWord8, sextdToObjptrWord = ObjptrWord.sextdFromWord8, other = {sizeInBits = Word8.sizeInBits, zero = Word8.zero, eq = ((op =) : Word8.word * Word8.word -> bool), isNeg = fn w => Int8.< (IntWordConv.idFromWord8ToInt8 w, 0), neg = Word8.~, notb = Word8.notb, rashift = Word8.~>>?, rshift = Word8.>>?}} (sextd, w) fun zextdFromWord8 w = extdFromWord8 (false, w) fun zextdFromInt8 i = zextdFromWord8 (IntWordConv.idFromInt8ToWord8 i) fun sextdFromWord8 w = extdFromWord8 (true, w) fun sextdFromInt8 i = sextdFromWord8 (IntWordConv.idFromInt8ToWord8 i) val castFromInt8 = sextdFromInt8 val castFromWord8 = zextdFromWord8 val zchckFromInt8 = zextdFromInt8 val zchckFromWord8 = zextdFromWord8 val schckFromInt8 = sextdFromInt8 val schckFromWord8 = sextdFromWord8 fun extdFromWord16 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord16, zextdToObjptrWord = ObjptrWord.zextdFromWord16, sextdToObjptrWord = ObjptrWord.sextdFromWord16, other = {sizeInBits = Word16.sizeInBits, zero = Word16.zero, eq = ((op =) : Word16.word * Word16.word -> bool), isNeg = fn w => Int16.< (IntWordConv.idFromWord16ToInt16 w, 0), neg = Word16.~, notb = Word16.notb, rashift = Word16.~>>?, rshift = Word16.>>?}} (sextd, w) fun zextdFromWord16 w = extdFromWord16 (false, w) fun zextdFromInt16 i = zextdFromWord16 (IntWordConv.idFromInt16ToWord16 i) fun sextdFromWord16 w = extdFromWord16 (true, w) fun sextdFromInt16 i = sextdFromWord16 (IntWordConv.idFromInt16ToWord16 i) val castFromInt16 = sextdFromInt16 val castFromWord16 = zextdFromWord16 val zchckFromInt16 = zextdFromInt16 val zchckFromWord16 = zextdFromWord16 val schckFromInt16 = sextdFromInt16 val schckFromWord16 = sextdFromWord16 fun extdFromWord32 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord32, zextdToObjptrWord = ObjptrWord.zextdFromWord32, sextdToObjptrWord = ObjptrWord.sextdFromWord32, other = {sizeInBits = Word32.sizeInBits, zero = Word32.zero, eq = ((op =) : Word32.word * Word32.word -> bool), isNeg = fn w => Int32.< (IntWordConv.idFromWord32ToInt32 w, 0), neg = Word32.~, notb = Word32.notb, rashift = Word32.~>>?, rshift = Word32.>>?}} (sextd, w) fun zextdFromWord32 w = extdFromWord32 (false, w) fun zextdFromInt32 i = zextdFromWord32 (IntWordConv.idFromInt32ToWord32 i) fun sextdFromWord32 w = extdFromWord32 (true, w) fun sextdFromInt32 i = sextdFromWord32 (IntWordConv.idFromInt32ToWord32 i) val castFromInt32 = sextdFromInt32 val castFromWord32 = zextdFromWord32 val zchckFromInt32 = zextdFromInt32 val zchckFromWord32 = zextdFromWord32 val schckFromInt32 = sextdFromInt32 val schckFromWord32 = sextdFromWord32 fun extdFromWord64 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord64, zextdToObjptrWord = ObjptrWord.zextdFromWord64, sextdToObjptrWord = ObjptrWord.sextdFromWord64, other = {sizeInBits = Word64.sizeInBits, zero = Word64.zero, eq = ((op =) : Word64.word * Word64.word -> bool), isNeg = fn w => Int64.< (IntWordConv.idFromWord64ToInt64 w, 0), neg = Word64.~, notb = Word64.notb, rashift = Word64.~>>?, rshift = Word64.>>?}} (sextd, w) fun zextdFromWord64 w = extdFromWord64 (false, w) fun zextdFromInt64 i = zextdFromWord64 (IntWordConv.idFromInt64ToWord64 i) fun sextdFromWord64 w = extdFromWord64 (true, w) fun sextdFromInt64 i = sextdFromWord64 (IntWordConv.idFromInt64ToWord64 i) val castFromInt64 = sextdFromInt64 val castFromWord64 = zextdFromWord64 val zchckFromInt64 = zextdFromInt64 val zchckFromWord64 = zextdFromWord64 val schckFromInt64 = sextdFromInt64 val schckFromWord64 = sextdFromWord64 fun zextdFromIntInf ii = ii fun sextdFromIntInf ii = ii fun castFromIntInf ii = ii fun zchckFromIntInf ii = ii fun schckFromIntInf ii = ii end local structure S = ObjptrInt_ChooseIntN (type 'a t = 'a -> bigInt val fInt8 = sextdFromInt8 val fInt16 = sextdFromInt16 val fInt32 = sextdFromInt32 val fInt64 = sextdFromInt64) in val sextdFromObjptrInt = S.f end local datatype 'a ans = Big of bool * bool * 'a | Small of ObjptrWord.word fun 'a make {zextdFromMPLimb: MPLimb.word -> 'a, other : {sizeInBits: Int32.int, sizeInBitsWord: Word32.word, zero: 'a, lshift: 'a * Word32.word -> 'a, orb: 'a * 'a -> 'a}} i = if isSmall i then Small (dropTagCoerce i) else let val v = Prim.toVector i val n = V.length v val isneg = V.unsafeSub (v, 0) <> 0w0 in if Int32.>= (MPLimb.sizeInBits, #sizeInBits other) then let val limbsPer : S.t = 1 val limb = V.unsafeSub (v, 1) val extra = S.> (n, S.+ (limbsPer, 1)) orelse (MPLimb.>>? (limb, #sizeInBitsWord other)) <> 0w0 val ans = zextdFromMPLimb limb in Big (isneg, extra, ans) end else let val limbsPer = S.sextdFromInt32 (Int32.quot (#sizeInBits other, MPLimb.sizeInBits)) val extra = S.> (n, S.+ (limbsPer, 1)) val ans = let fun loop (i, ans) = if S.> (i, 0) then let val limb = V.unsafeSub (v, i) val ans = (#orb other) ((#lshift other) (ans, MPLimb.sizeInBitsWord), zextdFromMPLimb limb) in loop (S.- (i, 1), ans) end else ans in loop (S.min (S.- (n, 1), limbsPer), #zero other) end in Big (isneg, extra, ans) end end in val chckToWord8Aux = make {zextdFromMPLimb = MPLimb.zextdToWord8, other = {sizeInBits = Word8.sizeInBits, sizeInBitsWord = Word8.sizeInBitsWord, zero = Word8.zero, lshift = Word8.< ObjptrWord.sextdToWord8 w | Big (isneg, _, ans) => if isneg then Word8.~ ans else ans fun sextdToInt8 i = IntWordConv.idFromWord8ToInt8 (sextdToWord8 i) val zextdToWord8 = sextdToWord8 fun zextdToInt8 i = IntWordConv.idFromWord8ToInt8 (zextdToWord8 i) val castToWord8 = sextdToWord8 val castToInt8 = sextdToInt8 fun schckToWord8 i = if not Primitive.Controls.detectOverflow then sextdToWord8 i else case chckToWord8Aux i of Small w => ObjptrWord.schckToWord8 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word8.~ ans val ans' = IntWordConv.idFromWord8ToInt8 ans in if Int8.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord8ToInt8 ans in if Int8.< (ans', 0) then raise Overflow else ans end fun schckToInt8 i = IntWordConv.idFromWord8ToInt8 (schckToWord8 i) fun zchckToWord8 i = if not Primitive.Controls.detectOverflow then zextdToWord8 i else case chckToWord8Aux i of Small w => ObjptrWord.schckToWord8 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt8 i = IntWordConv.idFromWord8ToInt8 (zchckToWord8 i) val chckToWord16Aux = make {zextdFromMPLimb = MPLimb.zextdToWord16, other = {sizeInBits = Word16.sizeInBits, sizeInBitsWord = Word16.sizeInBitsWord, zero = Word16.zero, lshift = Word16.< ObjptrWord.sextdToWord16 w | Big (isneg, _, ans) => if isneg then Word16.~ ans else ans fun sextdToInt16 i = IntWordConv.idFromWord16ToInt16 (sextdToWord16 i) val zextdToWord16 = sextdToWord16 fun zextdToInt16 i = IntWordConv.idFromWord16ToInt16 (zextdToWord16 i) val castToWord16 = sextdToWord16 val castToInt16 = sextdToInt16 fun schckToWord16 i = if not Primitive.Controls.detectOverflow then sextdToWord16 i else case chckToWord16Aux i of Small w => ObjptrWord.schckToWord16 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word16.~ ans val ans' = IntWordConv.idFromWord16ToInt16 ans in if Int16.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord16ToInt16 ans in if Int16.< (ans', 0) then raise Overflow else ans end fun schckToInt16 i = IntWordConv.idFromWord16ToInt16 (schckToWord16 i) fun zchckToWord16 i = if not Primitive.Controls.detectOverflow then zextdToWord16 i else case chckToWord16Aux i of Small w => ObjptrWord.schckToWord16 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt16 i = IntWordConv.idFromWord16ToInt16 (zchckToWord16 i) val chckToWord32Aux = make {zextdFromMPLimb = MPLimb.zextdToWord32, other = {sizeInBits = Word32.sizeInBits, sizeInBitsWord = Word32.sizeInBitsWord, zero = Word32.zero, lshift = Word32.< ObjptrWord.sextdToWord32 w | Big (isneg, _, ans) => if isneg then Word32.~ ans else ans fun sextdToInt32 i = IntWordConv.idFromWord32ToInt32 (sextdToWord32 i) val zextdToWord32 = sextdToWord32 fun zextdToInt32 i = IntWordConv.idFromWord32ToInt32 (zextdToWord32 i) val castToWord32 = sextdToWord32 val castToInt32 = sextdToInt32 fun schckToWord32 i = if not Primitive.Controls.detectOverflow then sextdToWord32 i else case chckToWord32Aux i of Small w => ObjptrWord.schckToWord32 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word32.~ ans val ans' = IntWordConv.idFromWord32ToInt32 ans in if Int32.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord32ToInt32 ans in if Int32.< (ans', 0) then raise Overflow else ans end fun schckToInt32 i = IntWordConv.idFromWord32ToInt32 (schckToWord32 i) fun zchckToWord32 i = if not Primitive.Controls.detectOverflow then zextdToWord32 i else case chckToWord32Aux i of Small w => ObjptrWord.schckToWord32 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt32 i = IntWordConv.idFromWord32ToInt32 (zchckToWord32 i) val chckToWord64Aux = make {zextdFromMPLimb = MPLimb.zextdToWord64, other = {sizeInBits = Word64.sizeInBits, sizeInBitsWord = Word64.sizeInBitsWord, zero = Word64.zero, lshift = Word64.< ObjptrWord.sextdToWord64 w | Big (isneg, _, ans) => if isneg then Word64.~ ans else ans fun sextdToInt64 i = IntWordConv.idFromWord64ToInt64 (sextdToWord64 i) val zextdToWord64 = sextdToWord64 fun zextdToInt64 i = IntWordConv.idFromWord64ToInt64 (zextdToWord64 i) val castToWord64 = sextdToWord64 val castToInt64 = sextdToInt64 fun schckToWord64 i = if not Primitive.Controls.detectOverflow then sextdToWord64 i else case chckToWord64Aux i of Small w => ObjptrWord.schckToWord64 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word64.~ ans val ans' = IntWordConv.idFromWord64ToInt64 ans in if Int64.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord64ToInt64 ans in if Int64.< (ans', 0) then raise Overflow else ans end fun schckToInt64 i = IntWordConv.idFromWord64ToInt64 (schckToWord64 i) fun zchckToWord64 i = if not Primitive.Controls.detectOverflow then zextdToWord64 i else case chckToWord64Aux i of Small w => ObjptrWord.schckToWord64 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt64 i = IntWordConv.idFromWord64ToInt64 (zchckToWord64 i) fun zextdToIntInf ii = ii fun sextdToIntInf ii = ii fun castToIntInf ii = ii fun zchckToIntInf ii = ii fun schckToIntInf ii = ii end local val bytesPerMPLimb = Sz.zextdFromInt32 (Int32.quot (MPLimb.sizeInBits, 8)) in val bytesPerSequenceMetaData = Sz.zextdFromInt32 SequenceMetaDataSize.bytes (* Reserve heap space for a large IntInf.int with room for num + extra * `limbs'. The reason for splitting this up is that extra is intended * to be a constant, and so can be combined at compile time. *) fun reserve (num: S.int, extra: S.int) = Sz.+ (Sz.* (bytesPerMPLimb, Sz.zextdFromSeqIndex num), Sz.+ (Sz.* (bytesPerMPLimb, Sz.zextdFromSeqIndex extra), Sz.+ (bytesPerMPLimb, (* isneg Field *) Sz.+ (bytesPerSequenceMetaData, (* Sequence MetaData *) case MLton.Align.align of (* alignment *) MLton.Align.Align4 => 0w3 | MLton.Align.Align8 => 0w7 )))) end (* badObjptr{Int,Word}{,Tagged} is the fixnum IntInf.int whose * negation and absolute values are not fixnums. * negBadIntInf is the negation (and absolute value) of that IntInf.int. *) val badObjptrInt: I.int = I.~>>? (I.minInt', 0w1) val badObjptrWord: W.word = W.idFromObjptrInt badObjptrInt val badObjptrWordTagged: W.word = addTag badObjptrWord (* val badObjptrIntTagged: I.int = W.idToObjptrInt badObjptrWordTagged *) val negBadIntInf: bigInt = sextdFromObjptrInt (I.~ badObjptrInt) (* Given two ObjptrWord.word's, check if they have the same 'high'/'sign' bit. *) fun sameSignBit (lhs: W.word, rhs: W.word): bool = I.>= (W.idToObjptrInt (W.xorb (lhs, rhs)), 0) (* Given a bignum bigint, test if it is (strictly) negative. *) fun bigIsNeg (arg: bigInt): bool = V.unsafeSub (Prim.toVector arg, 0) <> 0w0 local fun make (smallOp, bigOp, limbsFn, extra) (lhs: bigInt, rhs: bigInt): bigInt = let val res = if areSmall (lhs, rhs) then let val lhsw = dropTagCoerce lhs val lhsi = W.idToObjptrInt lhsw val rhsw = dropTagCoerce rhs val rhsi = W.idToObjptrInt rhsw val ansi = smallOp (lhsi, rhsi) val answ = W.idFromObjptrInt ansi val ans = addTag answ in if sameSignBit (ans, answ) then SOME (Prim.fromWord ans) else NONE end handle Overflow => NONE else NONE in case res of NONE => bigOp (lhs, rhs, reserve (limbsFn (numLimbs lhs, numLimbs rhs), extra)) | SOME i => i end in val bigAdd = make (I.+$, Prim.+, S.max, 1) val bigSub = make (I.-$, Prim.-, S.max, 1) val bigMul = make (I.*$, Prim.*, S.+, 0) end fun bigNeg (arg: bigInt): bigInt = if isSmall arg then let val argw = Prim.toWord arg in if argw = badObjptrWordTagged then negBadIntInf else Prim.fromWord (W.- (0w2, argw)) end else Prim.~ (arg, reserve (numLimbs arg, 1)) fun bigQuot (num: bigInt, den: bigInt): bigInt = if areSmall (num, den) then let val numw = dropTagCoerce num val numi = W.idToObjptrInt numw val denw = dropTagCoerce den val deni = W.idToObjptrInt denw in if numw = badObjptrWord andalso deni = ~1 then negBadIntInf else let val ansi = I.quot (numi, deni) val answ = W.idFromObjptrInt ansi val ans = addTag answ in Prim.fromWord ans end end else let val nlimbs = numLimbs num val dlimbs = numLimbs den in if S.< (nlimbs, dlimbs) then zero else if den = zero then raise Div else Prim.quot (num, den, reserve (S.- (nlimbs, dlimbs), 2)) end fun bigRem (num: bigInt, den: bigInt): bigInt = if areSmall (num, den) then let val numw = dropTagCoerce num val numi = W.idToObjptrInt numw val denw = dropTagCoerce den val deni = W.idToObjptrInt denw val ansi = I.rem (numi, deni) val answ = W.idFromObjptrInt ansi val ans = addTag answ in Prim.fromWord ans end else let val nlimbs = numLimbs num val dlimbs = numLimbs den in if S.< (nlimbs, dlimbs) then num else if den = zero then raise Div else Prim.rem (num, den, reserve (dlimbs, 1)) end (* Based on code from PolySpace. *) local open I fun mod2 x = I.andb (x, 1) fun div2 x = I.>>? (x, 0w1) fun smallGcd (a, b, acc) = case (a, b) of (0, _) => b * acc | (_, 0) => a * acc | (_, 1) => acc | (1, _) => acc | (_ : I.t * I.t) => if a = b then a * acc else let val a_2 = div2 a val a_r2 = mod2 a val b_2 = div2 b val b_r2 = mod2 b in if 0 = a_r2 then if 0 = b_r2 then smallGcd (a_2, b_2, acc + acc) else smallGcd (a_2, b, acc) else if 0 = b_r2 then smallGcd (a, b_2, acc) else if a >= b then smallGcd (div2 (a - b), b, acc) else smallGcd (a, div2 (b - a), acc) end in fun bigGcd (lhs: bigInt, rhs: bigInt): bigInt = if areSmall (lhs, rhs) then addTagCoerceInt (smallGcd (I.abs (dropTagCoerceInt lhs), I.abs (dropTagCoerceInt rhs), 1)) else Prim.gcd (lhs, rhs, reserve (S.max (numLimbs lhs, numLimbs rhs), 0)) end local fun make (smallTest: I.int * I.int -> 'a, int32Test: Int32.int * Int32.int -> 'a) (lhs: bigInt, rhs: bigInt): 'a = if areSmall (lhs, rhs) then smallTest (W.idToObjptrInt (Prim.toWord lhs), W.idToObjptrInt (Prim.toWord rhs)) else int32Test (Prim.compare (lhs, rhs), 0) in val bigCompare = make (I.compare, Int32.compare) val bigLT = make (I.<, Int32.<) val bigLE = make (I.<=, Int32.<=) val bigGT = make (I.>, Int32.>) val bigGE = make (I.>=, Int32.>=) end fun bigAbs (arg: bigInt): bigInt = if isSmall arg then let val argw = Prim.toWord arg in if argw = badObjptrWordTagged then negBadIntInf else if I.< (W.idToObjptrInt argw, 0) then Prim.fromWord (W.- (0w2, argw)) else arg end else if bigIsNeg arg then Prim.~ (arg, reserve (numLimbs arg, 1)) else arg fun bigMin (lhs: bigInt, rhs: bigInt): bigInt = if bigLE (lhs, rhs) then lhs else rhs fun bigMax (lhs: bigInt, rhs: bigInt): bigInt = if bigLE (lhs, rhs) then rhs else lhs local fun bigLTU (lhs, rhs) = case (bigCompare (lhs, 0), bigCompare (rhs, 0)) of (LESS, LESS) => bigLT (lhs, rhs) | (LESS, GREATER) => false | (_, EQUAL) => false | (EQUAL, _) => true | (GREATER, LESS) => true | (GREATER, GREATER) => bigLT (lhs, rhs) structure S = IntegralComparisons(type t = bigInt val op < = bigLTU) in val bigLTU = S.< val bigLEU = S.<= val bigGTU = S.> val bigGEU = S.>= end local val op + = bigAdd val op - = bigSub val op > = bigGT val op >= = bigGE val op < = bigLT val quot = bigQuot val rem = bigRem in fun bigDiv (x, y) = if x >= zero then if y > zero then quot (x, y) else if y < zero then if x = zero then zero else quot (x - one, y) - one else raise Div else if y < zero then quot (x, y) else if y > zero then quot (x + one, y) - one else raise Div fun bigMod (x, y) = if x >= zero then if y > zero then rem (x, y) else if y < zero then if x = zero then zero else rem (x - one, y) + (one + y) else raise Div else if y < zero then rem (x, y) else if y > zero then rem (x + one, y) + (y - one) else raise Div fun bigDivMod (x, y) = (bigDiv (x, y), bigMod (x, y)) fun bigQuotRem (x, y) = (bigQuot (x, y), bigRem (x, y)) end local fun make (smallOp, bigOp) (lhs: bigInt, rhs: bigInt) = if areSmall (lhs, rhs) then let val answ = smallOp (Prim.toWord lhs, Prim.toWord rhs) val ans = oneTagCoerce answ in ans end else bigOp (lhs, rhs, reserve (S.max (numLimbs lhs, numLimbs rhs), 0)) in val bigAndb = make (W.andb, Prim.andb) val bigOrb = make (W.orb, Prim.orb) val bigXorb = make (W.xorb, Prim.xorb) end fun bigNotb (arg: bigInt): bigInt = if isSmall arg then oneTagCoerce (W.notb (Prim.toWord arg)) else Prim.notb (arg, reserve (numLimbs arg, 0)) local val bitsPerLimb = MPLimb.sizeInBitsWord fun shiftSize shift = S.sextdFromWord32 (Word32.div (shift, bitsPerLimb)) in fun bigLshift (arg: bigInt, shift: Word32.word): bigInt = if shift = 0wx0 then arg else Prim.<< (arg, shift, reserve (S.+ (numLimbs arg, shiftSize shift), 1)) fun bigRashift (arg: bigInt, shift: Word32.word): bigInt = if shift = 0wx0 then arg else Prim.~>> (arg, shift, reserve (S.max (0, S.- (numLimbs arg, shiftSize shift)), 1)) end fun mkBigCvt {base: Int32.int, smallCvt: I.int -> Primitive.String8.string} (arg: bigInt) : Primitive.String8.string = if isSmall arg then smallCvt (dropTagCoerceInt arg) else let val bpd = Int32.log2 base val bpl = MPLimb.sizeInBits val dpl = Int32.+ (Int32.quot (bpl, bpd), if Int32.mod (bpl, bpd) = 0 then 0 else 1) val bytes = Sz.+ (Sz.+ (bytesPerSequenceMetaData (* Sequence MetaData *), Sz.+ (0w1 (* sign *), case MLton.Align.align of (* alignment *) MLton.Align.Align4 => 0w3 | MLton.Align.Align8 => 0w7)), Sz.* (Sz.zextdFromInt32 dpl, Sz.zextdFromSeqIndex (numLimbs arg))) in Prim.toString (arg, base, bytes) end fun mkBigLog2 {fromSmall: {smallLog2: Primitive.Int32.int} -> 'a, fromLarge: {numLimbsMinusOne: SeqIndex.int, mostSigLimbLog2: Primitive.Int32.int} -> 'a} (arg: bigInt) = if bigLE (arg, 0) then raise Domain else if isSmall arg then fromSmall {smallLog2 = W.log2 (dropTagCoerce arg)} else let val v = Prim.toVector arg val n = V.length v val w = MPLimb.log2 (V.unsafeSub (v, S.- (n, 1))) in fromLarge {numLimbsMinusOne = S.- (n, 2), mostSigLimbLog2 = w} end type int = bigInt type t = int val precision = NONE val maxInt = NONE val minInt = NONE val abs = bigAbs val op +! = bigAdd val op + = bigAdd val divMod = bigDivMod val op div = bigDiv val gcd = bigGcd val op mod = bigMod val op *! = bigMul val op * = bigMul val op ~! = bigNeg val op ~ = bigNeg val quotRem = bigQuotRem val quot = bigQuot val rem = bigRem val op -! = bigSub val op - = bigSub val op < = bigLT val op <= = bigLE val op > = bigGT val op >= = bigGE val compare = bigCompare val min = bigMin val max = bigMax val ltu = bigLTU val leu = bigLEU val gtu = bigGTU val geu = bigGEU val andb = bigAndb val <>? = bigRashift val ~>> = bigRashift val xorb = bigXorb val mkCvt = mkBigCvt val mkLog2 = mkBigLog2 end structure IntWordConv : PRIM_INTWORD_CONV = struct open IntWordConv val idFromIntInfToIntInf = fn i => i val zextdFromInt8ToIntInf = IntInf.zextdFromInt8 val zextdFromInt16ToIntInf = IntInf.zextdFromInt16 val zextdFromInt32ToIntInf = IntInf.zextdFromInt32 val zextdFromInt64ToIntInf = IntInf.zextdFromInt64 val zextdFromWord8ToIntInf = IntInf.zextdFromWord8 val zextdFromWord16ToIntInf = IntInf.zextdFromWord16 val zextdFromWord32ToIntInf = IntInf.zextdFromWord32 val zextdFromWord64ToIntInf = IntInf.zextdFromWord64 val zextdFromIntInfToInt8 = IntInf.zextdToInt8 val zextdFromIntInfToInt16 = IntInf.zextdToInt16 val zextdFromIntInfToInt32 = IntInf.zextdToInt32 val zextdFromIntInfToInt64 = IntInf.zextdToInt64 val zextdFromIntInfToIntInf = IntInf.zextdToIntInf val zextdFromIntInfToWord8 = IntInf.zextdToWord8 val zextdFromIntInfToWord16 = IntInf.zextdToWord16 val zextdFromIntInfToWord32 = IntInf.zextdToWord32 val zextdFromIntInfToWord64 = IntInf.zextdToWord64 val sextdFromInt8ToIntInf = IntInf.sextdFromInt8 val sextdFromInt16ToIntInf = IntInf.sextdFromInt16 val sextdFromInt32ToIntInf = IntInf.sextdFromInt32 val sextdFromInt64ToIntInf = IntInf.sextdFromInt64 val sextdFromWord8ToIntInf = IntInf.sextdFromWord8 val sextdFromWord16ToIntInf = IntInf.sextdFromWord16 val sextdFromWord32ToIntInf = IntInf.sextdFromWord32 val sextdFromWord64ToIntInf = IntInf.sextdFromWord64 val sextdFromIntInfToInt8 = IntInf.sextdToInt8 val sextdFromIntInfToInt16 = IntInf.sextdToInt16 val sextdFromIntInfToInt32 = IntInf.sextdToInt32 val sextdFromIntInfToInt64 = IntInf.sextdToInt64 val sextdFromIntInfToIntInf = IntInf.sextdToIntInf val sextdFromIntInfToWord8 = IntInf.sextdToWord8 val sextdFromIntInfToWord16 = IntInf.sextdToWord16 val sextdFromIntInfToWord32 = IntInf.sextdToWord32 val sextdFromIntInfToWord64 = IntInf.sextdToWord64 val castFromInt8ToIntInf = IntInf.castFromInt8 val castFromInt16ToIntInf = IntInf.castFromInt16 val castFromInt32ToIntInf = IntInf.castFromInt32 val castFromInt64ToIntInf = IntInf.castFromInt64 val castFromWord8ToIntInf = IntInf.castFromWord8 val castFromWord16ToIntInf = IntInf.castFromWord16 val castFromWord32ToIntInf = IntInf.castFromWord32 val castFromWord64ToIntInf = IntInf.castFromWord64 val castFromIntInfToInt8 = IntInf.castToInt8 val castFromIntInfToInt16 = IntInf.castToInt16 val castFromIntInfToInt32 = IntInf.castToInt32 val castFromIntInfToInt64 = IntInf.castToInt64 val castFromIntInfToIntInf = IntInf.castToIntInf val castFromIntInfToWord8 = IntInf.castToWord8 val castFromIntInfToWord16 = IntInf.castToWord16 val castFromIntInfToWord32 = IntInf.castToWord32 val castFromIntInfToWord64 = IntInf.castToWord64 val zchckFromInt8ToIntInf = IntInf.zchckFromInt8 val zchckFromInt16ToIntInf = IntInf.zchckFromInt16 val zchckFromInt32ToIntInf = IntInf.zchckFromInt32 val zchckFromInt64ToIntInf = IntInf.zchckFromInt64 val zchckFromWord8ToIntInf = IntInf.zchckFromWord8 val zchckFromWord16ToIntInf = IntInf.zchckFromWord16 val zchckFromWord32ToIntInf = IntInf.zchckFromWord32 val zchckFromWord64ToIntInf = IntInf.zchckFromWord64 val zchckFromIntInfToInt8 = IntInf.zchckToInt8 val zchckFromIntInfToInt16 = IntInf.zchckToInt16 val zchckFromIntInfToInt32 = IntInf.zchckToInt32 val zchckFromIntInfToInt64 = IntInf.zchckToInt64 val zchckFromIntInfToIntInf = IntInf.zchckToIntInf val zchckFromIntInfToWord8 = IntInf.zchckToWord8 val zchckFromIntInfToWord16 = IntInf.zchckToWord16 val zchckFromIntInfToWord32 = IntInf.zchckToWord32 val zchckFromIntInfToWord64 = IntInf.zchckToWord64 val schckFromInt8ToIntInf = IntInf.schckFromInt8 val schckFromInt16ToIntInf = IntInf.schckFromInt16 val schckFromInt32ToIntInf = IntInf.schckFromInt32 val schckFromInt64ToIntInf = IntInf.schckFromInt64 val schckFromWord8ToIntInf = IntInf.schckFromWord8 val schckFromWord16ToIntInf = IntInf.schckFromWord16 val schckFromWord32ToIntInf = IntInf.schckFromWord32 val schckFromWord64ToIntInf = IntInf.schckFromWord64 val schckFromIntInfToInt8 = IntInf.schckToInt8 val schckFromIntInfToInt16 = IntInf.schckToInt16 val schckFromIntInfToInt32 = IntInf.schckToInt32 val schckFromIntInfToInt64 = IntInf.schckToInt64 val schckFromIntInfToIntInf = IntInf.schckToIntInf val schckFromIntInfToWord8 = IntInf.schckToWord8 val schckFromIntInfToWord16 = IntInf.schckToWord16 val schckFromIntInfToWord32 = IntInf.schckToWord32 val schckFromIntInfToWord64 = IntInf.schckToWord64 end structure Int8 : PRIM_INTEGER = struct open Int8 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt8 val zextdToIntInf = IntWordConv.zextdFromInt8ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt8 val sextdToIntInf = IntWordConv.sextdFromInt8ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt8 val castToIntInf = IntWordConv.castFromInt8ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt8 val zchckToIntInf = IntWordConv.zchckFromInt8ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt8 val schckToIntInf = IntWordConv.schckFromInt8ToIntInf end structure Int16 : PRIM_INTEGER = struct open Int16 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt16 val zextdToIntInf = IntWordConv.zextdFromInt16ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt16 val sextdToIntInf = IntWordConv.sextdFromInt16ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt16 val castToIntInf = IntWordConv.castFromInt16ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt16 val zchckToIntInf = IntWordConv.zchckFromInt16ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt16 val schckToIntInf = IntWordConv.schckFromInt16ToIntInf end structure Int32 : PRIM_INTEGER = struct open Int32 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt32 val zextdToIntInf = IntWordConv.zextdFromInt32ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt32 val sextdToIntInf = IntWordConv.sextdFromInt32ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt32 val castToIntInf = IntWordConv.castFromInt32ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt32 val zchckToIntInf = IntWordConv.zchckFromInt32ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt32 val schckToIntInf = IntWordConv.schckFromInt32ToIntInf end structure Int64 : PRIM_INTEGER = struct open Int64 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt64 val zextdToIntInf = IntWordConv.zextdFromInt64ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt64 val sextdToIntInf = IntWordConv.sextdFromInt64ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt64 val castToIntInf = IntWordConv.castFromInt64ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt64 val zchckToIntInf = IntWordConv.zchckFromInt64ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt64 val schckToIntInf = IntWordConv.schckFromInt64ToIntInf end structure Word8 : PRIM_WORD = struct open Word8 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord8 val zextdToIntInf = IntWordConv.zextdFromWord8ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord8 val sextdToIntInf = IntWordConv.sextdFromWord8ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord8 val castToIntInf = IntWordConv.castFromWord8ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord8 val zchckToIntInf = IntWordConv.zchckFromWord8ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord8 val schckToIntInf = IntWordConv.schckFromWord8ToIntInf end structure Word16 : PRIM_WORD = struct open Word16 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord16 val zextdToIntInf = IntWordConv.zextdFromWord16ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord16 val sextdToIntInf = IntWordConv.sextdFromWord16ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord16 val castToIntInf = IntWordConv.castFromWord16ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord16 val zchckToIntInf = IntWordConv.zchckFromWord16ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord16 val schckToIntInf = IntWordConv.schckFromWord16ToIntInf end structure Word32 : PRIM_WORD = struct open Word32 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord32 val zextdToIntInf = IntWordConv.zextdFromWord32ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord32 val sextdToIntInf = IntWordConv.sextdFromWord32ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord32 val castToIntInf = IntWordConv.castFromWord32ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord32 val zchckToIntInf = IntWordConv.zchckFromWord32ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord32 val schckToIntInf = IntWordConv.schckFromWord32ToIntInf end structure Word64 : PRIM_WORD = struct open Word64 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord64 val zextdToIntInf = IntWordConv.zextdFromWord64ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord64 val sextdToIntInf = IntWordConv.sextdFromWord64ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord64 val castToIntInf = IntWordConv.castFromWord64ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord64 val zchckToIntInf = IntWordConv.zchckFromWord64ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord64 val schckToIntInf = IntWordConv.schckFromWord64ToIntInf end structure IntInf : PRIM_INT_INF = IntInf end mlton-20210117+dfsg/basis-library/integer/int.sml000066400000000000000000000135071416264345000215430ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Integer (I: PRIM_INTEGER): INTEGER_EXTRA = struct open I type t = int val precision': Int.int = Primitive.Int32.zextdToInt sizeInBits val precision: Int.int option = SOME precision' val sizeInBitsWord = Primitive.Word32.zextdToWord sizeInBitsWord val maxInt: int option = SOME maxInt' val minInt: int option = SOME minInt' val sign: int -> Int.int = fn i => if i = zero then (0: Int.int) else if i < zero then (~1: Int.int) else (1: Int.int) fun sameSign (x, y) = sign x = sign y fun << (i, n) = if Word.>= (n, sizeInBitsWord) then zero else I.<> (i, n) = if Word.>= (n, sizeInBitsWord) then zero else I.>>? (i, Primitive.Word32.zextdFromWord n) fun ~>> (i, n) = if Word.< (n, sizeInBitsWord) then I.~>>? (i, Primitive.Word32.zextdFromWord n) else I.~>>? (i, Primitive.Word32.- (I.sizeInBitsWord, 0w1)) fun rol (i, n) = I.rolUnsafe (i, Primitive.Word32.zextdFromWord n) fun ror (i, n) = I.rorUnsafe (i, Primitive.Word32.zextdFromWord n) val fromInt = I.schckFromInt val toInt = I.schckToInt val fromLargeInt = I.schckFromLargeInt val toLargeInt = I.schckToLargeInt val fromLarge = fromLargeInt val toLarge = toLargeInt (* fmt constructs a string to represent the integer by building it into a * statically allocated buffer. For the most part, this is a textbook * algorithm: loop starting at the end of the buffer; we use rem to * extract the next digit to put into the buffer; and we use quot to * figure out the part of the integer that we haven't yet formatted. * However, this function uses the negative absolute value of the input * number, which allows it to take into account minInt without any * special-casing. This requires the rem function to behave in a very * specific way, or else things will go terribly wrong. This may be a * concern when porting to platforms where the division hardware has a * different interpretation than SML about what happens when doing * division of negative numbers. *) local (* Allocate a buffer large enough to hold any formatted integer in any radix. * The most that will be required is for minInt in binary. *) val maxNumDigits = Int.+ (precision', 1) val oneBuf = One.make (fn () => CharArray.array (maxNumDigits, #"\000")) in fun fmt radix (n: int): string = One.use (oneBuf, fn buf => let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, i: Int.int) = let val _ = CharArray.update (buf, i, StringCvt.digitToChar (toInt (~! (rem (q, radix))))) val q = quot (q, radix) in if q = zero then let val start = if n < zero then let val i = Int.- (i, 1) val () = CharArray.update (buf, i, #"~") in i end else i in CharArraySlice.vector (CharArraySlice.slice (buf, start, NONE)) end else loop (q, Int.- (i, 1)) end in loop (if n < zero then n else ~! n, Int.- (maxNumDigits, 1)) end) end val toString = fmt StringCvt.DEC fun scan radix reader s = let (* Works with the negative of the number so that minInt can be scanned. *) val s = StringCvt.skipWS reader s fun charToDigit c = case StringCvt.charToDigit radix c of NONE => NONE | SOME n => SOME (fromInt n) val radixInt = fromInt (StringCvt.radixToInt radix) fun finishNum (s, n) = case reader s of NONE => SOME (n, s) | SOME (c, s') => case charToDigit c of NONE => SOME (n, s) | SOME n' => finishNum (s', n * radixInt - n') fun num s = case (reader s, radix) of (NONE, _) => NONE | (SOME (#"0", s), StringCvt.HEX) => (case reader s of NONE => SOME (zero, s) | SOME (c, s') => if c = #"x" orelse c = #"X" then case reader s' of NONE => SOME (zero, s) | SOME (c, s') => case charToDigit c of NONE => SOME (zero, s) | SOME n => finishNum (s', ~! n) else case charToDigit c of NONE => SOME (zero, s) | SOME n => finishNum (s', ~! n)) | (SOME (c, s), _) => case charToDigit c of NONE => NONE | SOME n => finishNum (s, ~! n) fun negate s = case num s of NONE => NONE | SOME (n, s) => SOME (~ n, s) in case reader s of NONE => NONE | SOME (c, s') => case c of #"~" => num s' | #"-" => num s' | #"+" => negate s' | _ => negate s end val fromString = StringCvt.scanString (scan StringCvt.DEC) end structure Int8 = Integer (Primitive.Int8) structure Int16 = Integer (Primitive.Int16) structure Int32 = Integer (Primitive.Int32) structure Int64 = Integer (Primitive.Int64) mlton-20210117+dfsg/basis-library/integer/integer.sig000066400000000000000000000043231416264345000223710ustar00rootroot00000000000000signature INTEGER_GLOBAL = sig eqtype int end signature INTEGER = sig include INTEGER_GLOBAL val precision : Int.int option val minInt : int option val maxInt : int option val toLarge: int -> LargeInt.int val fromLarge: LargeInt.int -> int val toInt: int -> Int.int val fromInt: Int.int -> int val + : int * int -> int val - : int * int -> int val * : int * int -> int val div: int * int -> int val mod: int * int -> int val quot: int * int -> int val rem: int * int -> int val compare: int * int -> order val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val ~ : int -> int val abs: int -> int val min: int * int -> int val max: int * int -> int val sign: int -> Int.int val sameSign: int * int -> bool val fmt: StringCvt.radix -> int -> string val toString: int -> string val scan: (StringCvt.radix -> (char, 'a) StringCvt.reader -> (int, 'a) StringCvt.reader) val fromString: string -> int option end signature INTEGER_EXTRA = sig include INTEGER type t = int val zero: int val one: int val precision' : Int.int val maxInt' : int val minInt' : int val +! : int * int -> int val *! : int * int -> int val -! : int * int -> int val ~! : int -> int val andb: int * int -> int val << : int * Word.word -> int val notb: int -> int val orb: int * int -> int val rol: int * Word.word -> int val ror: int * Word.word -> int val ~>> : int * Word.word -> int val >> : int * Word.word -> int val xorb: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val toLargeInt: int -> LargeInt.int val fromLargeInt: LargeInt.int -> int val castFromFixedInt: FixedInt.int -> int val castToFixedInt: int -> FixedInt.int val castFromSysWord: SysWord.word -> int val castToSysWord: int -> SysWord.word end mlton-20210117+dfsg/basis-library/integer/iwconv0.sml000066400000000000000000002373411416264345000223420ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_INTWORD_CONV = sig include PRIM_INTWORD_CONV (* C-like cast: extend according to signedness of from or low-bits *) val castFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val castFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val castFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val castFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val castFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val castFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val castFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val castFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val castFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val castFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val castFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val castFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val castFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val castFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val castFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val castFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val castFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val castFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val castFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val castFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val castFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val castFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val castFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val castFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val castFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val castFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val castFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val castFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val castFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val castFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val castFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val castFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val castFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val castFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val castFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val castFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val castFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val castFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val castFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val castFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val castFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val castFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val castFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val castFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val castFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val castFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val castFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val castFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val castFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val castFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val castFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val castFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val castFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val castFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val castFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val castFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val castFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val castFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val castFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val castFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val castFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val castFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val castFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val castFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* checked zero-extend or low-bits, * Overflow if composed zero-extend not identity *) val zchckFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val zchckFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val zchckFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val zchckFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val zchckFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val zchckFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val zchckFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val zchckFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val zchckFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val zchckFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val zchckFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val zchckFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val zchckFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val zchckFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val zchckFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val zchckFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val zchckFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val zchckFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val zchckFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val zchckFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val zchckFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val zchckFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val zchckFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val zchckFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val zchckFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val zchckFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val zchckFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val zchckFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val zchckFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val zchckFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val zchckFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val zchckFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val zchckFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val zchckFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val zchckFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val zchckFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val zchckFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val zchckFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val zchckFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val zchckFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val zchckFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val zchckFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val zchckFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val zchckFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val zchckFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val zchckFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val zchckFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val zchckFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val zchckFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val zchckFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val zchckFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val zchckFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val zchckFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val zchckFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val zchckFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val zchckFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val zchckFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val zchckFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val zchckFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val zchckFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val zchckFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val zchckFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val zchckFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val zchckFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* checked sign-extend or low-bits, * Overflow if composed sign-extend not identity *) val schckFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val schckFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val schckFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val schckFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val schckFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val schckFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val schckFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val schckFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val schckFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val schckFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val schckFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val schckFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val schckFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val schckFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val schckFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val schckFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val schckFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val schckFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val schckFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val schckFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val schckFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val schckFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val schckFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val schckFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val schckFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val schckFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val schckFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val schckFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val schckFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val schckFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val schckFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val schckFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val schckFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val schckFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val schckFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val schckFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val schckFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val schckFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val schckFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val schckFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val schckFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val schckFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val schckFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val schckFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val schckFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val schckFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val schckFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val schckFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val schckFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val schckFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val schckFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val schckFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val schckFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val schckFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val schckFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val schckFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val schckFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val schckFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val schckFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val schckFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val schckFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val schckFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val schckFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val schckFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word end signature PRIM_INTEGER = sig include PRIM_INTEGER val zextdFromInt8: Primitive.Int8.int -> int val zextdFromInt16: Primitive.Int16.int -> int val zextdFromInt32: Primitive.Int32.int -> int val zextdFromInt64: Primitive.Int64.int -> int val zextdFromWord8: Primitive.Word8.word -> int val zextdFromWord16: Primitive.Word16.word -> int val zextdFromWord32: Primitive.Word32.word -> int val zextdFromWord64: Primitive.Word64.word -> int val zextdToInt8: int -> Primitive.Int8.int val zextdToInt16: int -> Primitive.Int16.int val zextdToInt32: int -> Primitive.Int32.int val zextdToInt64: int -> Primitive.Int64.int val zextdToWord8: int -> Primitive.Word8.word val zextdToWord16: int -> Primitive.Word16.word val zextdToWord32: int -> Primitive.Word32.word val zextdToWord64: int -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> int val sextdFromInt16: Primitive.Int16.int -> int val sextdFromInt32: Primitive.Int32.int -> int val sextdFromInt64: Primitive.Int64.int -> int val sextdFromWord8: Primitive.Word8.word -> int val sextdFromWord16: Primitive.Word16.word -> int val sextdFromWord32: Primitive.Word32.word -> int val sextdFromWord64: Primitive.Word64.word -> int val sextdToInt8: int -> Primitive.Int8.int val sextdToInt16: int -> Primitive.Int16.int val sextdToInt32: int -> Primitive.Int32.int val sextdToInt64: int -> Primitive.Int64.int val sextdToWord8: int -> Primitive.Word8.word val sextdToWord16: int -> Primitive.Word16.word val sextdToWord32: int -> Primitive.Word32.word val sextdToWord64: int -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> int val castFromInt16: Primitive.Int16.int -> int val castFromInt32: Primitive.Int32.int -> int val castFromInt64: Primitive.Int64.int -> int val castFromWord8: Primitive.Word8.word -> int val castFromWord16: Primitive.Word16.word -> int val castFromWord32: Primitive.Word32.word -> int val castFromWord64: Primitive.Word64.word -> int val castToInt8: int -> Primitive.Int8.int val castToInt16: int -> Primitive.Int16.int val castToInt32: int -> Primitive.Int32.int val castToInt64: int -> Primitive.Int64.int val castToWord8: int -> Primitive.Word8.word val castToWord16: int -> Primitive.Word16.word val castToWord32: int -> Primitive.Word32.word val castToWord64: int -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> int val zchckFromInt16: Primitive.Int16.int -> int val zchckFromInt32: Primitive.Int32.int -> int val zchckFromInt64: Primitive.Int64.int -> int val zchckFromWord8: Primitive.Word8.word -> int val zchckFromWord16: Primitive.Word16.word -> int val zchckFromWord32: Primitive.Word32.word -> int val zchckFromWord64: Primitive.Word64.word -> int val zchckToInt8: int -> Primitive.Int8.int val zchckToInt16: int -> Primitive.Int16.int val zchckToInt32: int -> Primitive.Int32.int val zchckToInt64: int -> Primitive.Int64.int val zchckToWord8: int -> Primitive.Word8.word val zchckToWord16: int -> Primitive.Word16.word val zchckToWord32: int -> Primitive.Word32.word val zchckToWord64: int -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> int val schckFromInt16: Primitive.Int16.int -> int val schckFromInt32: Primitive.Int32.int -> int val schckFromInt64: Primitive.Int64.int -> int val schckFromWord8: Primitive.Word8.word -> int val schckFromWord16: Primitive.Word16.word -> int val schckFromWord32: Primitive.Word32.word -> int val schckFromWord64: Primitive.Word64.word -> int val schckToInt8: int -> Primitive.Int8.int val schckToInt16: int -> Primitive.Int16.int val schckToInt32: int -> Primitive.Int32.int val schckToInt64: int -> Primitive.Int64.int val schckToWord8: int -> Primitive.Word8.word val schckToWord16: int -> Primitive.Word16.word val schckToWord32: int -> Primitive.Word32.word val schckToWord64: int -> Primitive.Word64.word end signature PRIM_WORD = sig include PRIM_WORD val zextdFromInt8: Primitive.Int8.int -> word val zextdFromInt16: Primitive.Int16.int -> word val zextdFromInt32: Primitive.Int32.int -> word val zextdFromInt64: Primitive.Int64.int -> word val zextdFromWord8: Primitive.Word8.word -> word val zextdFromWord16: Primitive.Word16.word -> word val zextdFromWord32: Primitive.Word32.word -> word val zextdFromWord64: Primitive.Word64.word -> word val zextdToInt8: word -> Primitive.Int8.int val zextdToInt16: word -> Primitive.Int16.int val zextdToInt32: word -> Primitive.Int32.int val zextdToInt64: word -> Primitive.Int64.int val zextdToWord8: word -> Primitive.Word8.word val zextdToWord16: word -> Primitive.Word16.word val zextdToWord32: word -> Primitive.Word32.word val zextdToWord64: word -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> word val sextdFromInt16: Primitive.Int16.int -> word val sextdFromInt32: Primitive.Int32.int -> word val sextdFromInt64: Primitive.Int64.int -> word val sextdFromWord8: Primitive.Word8.word -> word val sextdFromWord16: Primitive.Word16.word -> word val sextdFromWord32: Primitive.Word32.word -> word val sextdFromWord64: Primitive.Word64.word -> word val sextdToInt8: word -> Primitive.Int8.int val sextdToInt16: word -> Primitive.Int16.int val sextdToInt32: word -> Primitive.Int32.int val sextdToInt64: word -> Primitive.Int64.int val sextdToWord8: word -> Primitive.Word8.word val sextdToWord16: word -> Primitive.Word16.word val sextdToWord32: word -> Primitive.Word32.word val sextdToWord64: word -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> word val castFromInt16: Primitive.Int16.int -> word val castFromInt32: Primitive.Int32.int -> word val castFromInt64: Primitive.Int64.int -> word val castFromWord8: Primitive.Word8.word -> word val castFromWord16: Primitive.Word16.word -> word val castFromWord32: Primitive.Word32.word -> word val castFromWord64: Primitive.Word64.word -> word val castToInt8: word -> Primitive.Int8.int val castToInt16: word -> Primitive.Int16.int val castToInt32: word -> Primitive.Int32.int val castToInt64: word -> Primitive.Int64.int val castToWord8: word -> Primitive.Word8.word val castToWord16: word -> Primitive.Word16.word val castToWord32: word -> Primitive.Word32.word val castToWord64: word -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> word val zchckFromInt16: Primitive.Int16.int -> word val zchckFromInt32: Primitive.Int32.int -> word val zchckFromInt64: Primitive.Int64.int -> word val zchckFromWord8: Primitive.Word8.word -> word val zchckFromWord16: Primitive.Word16.word -> word val zchckFromWord32: Primitive.Word32.word -> word val zchckFromWord64: Primitive.Word64.word -> word val zchckToInt8: word -> Primitive.Int8.int val zchckToInt16: word -> Primitive.Int16.int val zchckToInt32: word -> Primitive.Int32.int val zchckToInt64: word -> Primitive.Int64.int val zchckToWord8: word -> Primitive.Word8.word val zchckToWord16: word -> Primitive.Word16.word val zchckToWord32: word -> Primitive.Word32.word val zchckToWord64: word -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> word val schckFromInt16: Primitive.Int16.int -> word val schckFromInt32: Primitive.Int32.int -> word val schckFromInt64: Primitive.Int64.int -> word val schckFromWord8: Primitive.Word8.word -> word val schckFromWord16: Primitive.Word16.word -> word val schckFromWord32: Primitive.Word32.word -> word val schckFromWord64: Primitive.Word64.word -> word val schckToInt8: word -> Primitive.Int8.int val schckToInt16: word -> Primitive.Int16.int val schckToInt32: word -> Primitive.Int32.int val schckToInt64: word -> Primitive.Int64.int val schckToWord8: word -> Primitive.Word8.word val schckToWord16: word -> Primitive.Word16.word val schckToWord32: word -> Primitive.Word32.word val schckToWord64: word -> Primitive.Word64.word end structure Primitive = struct open Primitive structure IntWordConv : PRIM_INTWORD_CONV = struct open IntWordConv (* C-like cast: extend according to signedness of from or low-bits *) val castFromInt8ToInt8 = sextdFromInt8ToInt8 val castFromInt8ToInt16 = sextdFromInt8ToInt16 val castFromInt8ToInt32 = sextdFromInt8ToInt32 val castFromInt8ToInt64 = sextdFromInt8ToInt64 val castFromInt8ToWord8 = sextdFromInt8ToWord8 val castFromInt8ToWord16 = sextdFromInt8ToWord16 val castFromInt8ToWord32 = sextdFromInt8ToWord32 val castFromInt8ToWord64 = sextdFromInt8ToWord64 val castFromInt16ToInt8 = sextdFromInt16ToInt8 val castFromInt16ToInt16 = sextdFromInt16ToInt16 val castFromInt16ToInt32 = sextdFromInt16ToInt32 val castFromInt16ToInt64 = sextdFromInt16ToInt64 val castFromInt16ToWord8 = sextdFromInt16ToWord8 val castFromInt16ToWord16 = sextdFromInt16ToWord16 val castFromInt16ToWord32 = sextdFromInt16ToWord32 val castFromInt16ToWord64 = sextdFromInt16ToWord64 val castFromInt32ToInt8 = sextdFromInt32ToInt8 val castFromInt32ToInt16 = sextdFromInt32ToInt16 val castFromInt32ToInt32 = sextdFromInt32ToInt32 val castFromInt32ToInt64 = sextdFromInt32ToInt64 val castFromInt32ToWord8 = sextdFromInt32ToWord8 val castFromInt32ToWord16 = sextdFromInt32ToWord16 val castFromInt32ToWord32 = sextdFromInt32ToWord32 val castFromInt32ToWord64 = sextdFromInt32ToWord64 val castFromInt64ToInt8 = sextdFromInt64ToInt8 val castFromInt64ToInt16 = sextdFromInt64ToInt16 val castFromInt64ToInt32 = sextdFromInt64ToInt32 val castFromInt64ToInt64 = sextdFromInt64ToInt64 val castFromInt64ToWord8 = sextdFromInt64ToWord8 val castFromInt64ToWord16 = sextdFromInt64ToWord16 val castFromInt64ToWord32 = sextdFromInt64ToWord32 val castFromInt64ToWord64 = sextdFromInt64ToWord64 val castFromWord8ToInt8 = zextdFromWord8ToInt8 val castFromWord8ToInt16 = zextdFromWord8ToInt16 val castFromWord8ToInt32 = zextdFromWord8ToInt32 val castFromWord8ToInt64 = zextdFromWord8ToInt64 val castFromWord8ToWord8 = zextdFromWord8ToWord8 val castFromWord8ToWord16 = zextdFromWord8ToWord16 val castFromWord8ToWord32 = zextdFromWord8ToWord32 val castFromWord8ToWord64 = zextdFromWord8ToWord64 val castFromWord16ToInt8 = zextdFromWord16ToInt8 val castFromWord16ToInt16 = zextdFromWord16ToInt16 val castFromWord16ToInt32 = zextdFromWord16ToInt32 val castFromWord16ToInt64 = zextdFromWord16ToInt64 val castFromWord16ToWord8 = zextdFromWord16ToWord8 val castFromWord16ToWord16 = zextdFromWord16ToWord16 val castFromWord16ToWord32 = zextdFromWord16ToWord32 val castFromWord16ToWord64 = zextdFromWord16ToWord64 val castFromWord32ToInt8 = zextdFromWord32ToInt8 val castFromWord32ToInt16 = zextdFromWord32ToInt16 val castFromWord32ToInt32 = zextdFromWord32ToInt32 val castFromWord32ToInt64 = zextdFromWord32ToInt64 val castFromWord32ToWord8 = zextdFromWord32ToWord8 val castFromWord32ToWord16 = zextdFromWord32ToWord16 val castFromWord32ToWord32 = zextdFromWord32ToWord32 val castFromWord32ToWord64 = zextdFromWord32ToWord64 val castFromWord64ToInt8 = zextdFromWord64ToInt8 val castFromWord64ToInt16 = zextdFromWord64ToInt16 val castFromWord64ToInt32 = zextdFromWord64ToInt32 val castFromWord64ToInt64 = zextdFromWord64ToInt64 val castFromWord64ToWord8 = zextdFromWord64ToWord8 val castFromWord64ToWord16 = zextdFromWord64ToWord16 val castFromWord64ToWord32 = zextdFromWord64ToWord32 val castFromWord64ToWord64 = zextdFromWord64ToWord64 (* checked zero-extend or low-bits, * Overflow if composed zero-extend not identity *) local fun (''l, ''s) make {zextdFromLargeToSmall: ''l -> ''s, zextdFromSmallToLarge: ''s -> ''l} = if Primitive.Controls.detectOverflow then fn (x: ''l) => let val res = zextdFromLargeToSmall x in if x = (zextdFromSmallToLarge res) then res else raise Overflow end else zextdFromLargeToSmall in val zchckFromInt8ToInt8 = zextdFromInt8ToInt8 val zchckFromInt8ToInt16 = zextdFromInt8ToInt16 val zchckFromInt8ToInt32 = zextdFromInt8ToInt32 val zchckFromInt8ToInt64 = zextdFromInt8ToInt64 val zchckFromInt8ToWord8 = zextdFromInt8ToWord8 val zchckFromInt8ToWord16 = zextdFromInt8ToWord16 val zchckFromInt8ToWord32 = zextdFromInt8ToWord32 val zchckFromInt8ToWord64 = zextdFromInt8ToWord64 val zchckFromInt16ToInt8 = make {zextdFromLargeToSmall = zextdFromInt16ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt16} val zchckFromInt16ToInt16 = zextdFromInt16ToInt16 val zchckFromInt16ToInt32 = zextdFromInt16ToInt32 val zchckFromInt16ToInt64 = zextdFromInt16ToInt64 val zchckFromInt16ToWord8 = make {zextdFromLargeToSmall = zextdFromInt16ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt16} val zchckFromInt16ToWord16 = zextdFromInt16ToWord16 val zchckFromInt16ToWord32 = zextdFromInt16ToWord32 val zchckFromInt16ToWord64 = zextdFromInt16ToWord64 val zchckFromInt32ToInt8 = make {zextdFromLargeToSmall = zextdFromInt32ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt32} val zchckFromInt32ToInt16 = make {zextdFromLargeToSmall = zextdFromInt32ToInt16, zextdFromSmallToLarge = zextdFromInt16ToInt32} val zchckFromInt32ToInt32 = zextdFromInt32ToInt32 val zchckFromInt32ToInt64 = zextdFromInt32ToInt64 val zchckFromInt32ToWord8 = make {zextdFromLargeToSmall = zextdFromInt32ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt32} val zchckFromInt32ToWord16 = make {zextdFromLargeToSmall = zextdFromInt32ToWord16, zextdFromSmallToLarge = zextdFromWord16ToInt32} val zchckFromInt32ToWord32 = zextdFromInt32ToWord32 val zchckFromInt32ToWord64 = zextdFromInt32ToWord64 val zchckFromInt64ToInt8 = make {zextdFromLargeToSmall = zextdFromInt64ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt64} val zchckFromInt64ToInt16 = make {zextdFromLargeToSmall = zextdFromInt64ToInt16, zextdFromSmallToLarge = zextdFromInt16ToInt64} val zchckFromInt64ToInt32 = make {zextdFromLargeToSmall = zextdFromInt64ToInt32, zextdFromSmallToLarge = zextdFromInt32ToInt64} val zchckFromInt64ToInt64 = zextdFromInt64ToInt64 val zchckFromInt64ToWord8 = make {zextdFromLargeToSmall = zextdFromInt64ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt64} val zchckFromInt64ToWord16 = make {zextdFromLargeToSmall = zextdFromInt64ToWord16, zextdFromSmallToLarge = zextdFromWord16ToInt64} val zchckFromInt64ToWord32 = make {zextdFromLargeToSmall = zextdFromInt64ToWord32, zextdFromSmallToLarge = zextdFromWord32ToInt64} val zchckFromInt64ToWord64 = zextdFromInt64ToWord64 val zchckFromWord8ToInt8 = zextdFromWord8ToInt8 val zchckFromWord8ToInt16 = zextdFromWord8ToInt16 val zchckFromWord8ToInt32 = zextdFromWord8ToInt32 val zchckFromWord8ToInt64 = zextdFromWord8ToInt64 val zchckFromWord8ToWord8 = zextdFromWord8ToWord8 val zchckFromWord8ToWord16 = zextdFromWord8ToWord16 val zchckFromWord8ToWord32 = zextdFromWord8ToWord32 val zchckFromWord8ToWord64 = zextdFromWord8ToWord64 val zchckFromWord16ToInt8 = make {zextdFromLargeToSmall = zextdFromWord16ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord16} val zchckFromWord16ToInt16 = zextdFromWord16ToInt16 val zchckFromWord16ToInt32 = zextdFromWord16ToInt32 val zchckFromWord16ToInt64 = zextdFromWord16ToInt64 val zchckFromWord16ToWord8 = make {zextdFromLargeToSmall = zextdFromWord16ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord16} val zchckFromWord16ToWord16 = zextdFromWord16ToWord16 val zchckFromWord16ToWord32 = zextdFromWord16ToWord32 val zchckFromWord16ToWord64 = zextdFromWord16ToWord64 val zchckFromWord32ToInt8 = make {zextdFromLargeToSmall = zextdFromWord32ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord32} val zchckFromWord32ToInt16 = make {zextdFromLargeToSmall = zextdFromWord32ToInt16, zextdFromSmallToLarge = zextdFromInt16ToWord32} val zchckFromWord32ToInt32 = zextdFromWord32ToInt32 val zchckFromWord32ToInt64 = zextdFromWord32ToInt64 val zchckFromWord32ToWord8 = make {zextdFromLargeToSmall = zextdFromWord32ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord32} val zchckFromWord32ToWord16 = make {zextdFromLargeToSmall = zextdFromWord32ToWord16, zextdFromSmallToLarge = zextdFromWord16ToWord32} val zchckFromWord32ToWord32 = zextdFromWord32ToWord32 val zchckFromWord32ToWord64 = zextdFromWord32ToWord64 val zchckFromWord64ToInt8 = make {zextdFromLargeToSmall = zextdFromWord64ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord64} val zchckFromWord64ToInt16 = make {zextdFromLargeToSmall = zextdFromWord64ToInt16, zextdFromSmallToLarge = zextdFromInt16ToWord64} val zchckFromWord64ToInt32 = make {zextdFromLargeToSmall = zextdFromWord64ToInt32, zextdFromSmallToLarge = zextdFromInt32ToWord64} val zchckFromWord64ToInt64 = zextdFromWord64ToInt64 val zchckFromWord64ToWord8 = make {zextdFromLargeToSmall = zextdFromWord64ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord64} val zchckFromWord64ToWord16 = make {zextdFromLargeToSmall = zextdFromWord64ToWord16, zextdFromSmallToLarge = zextdFromWord16ToWord64} val zchckFromWord64ToWord32 = make {zextdFromLargeToSmall = zextdFromWord64ToWord32, zextdFromSmallToLarge = zextdFromWord32ToWord64} val zchckFromWord64ToWord64 = zextdFromWord64ToWord64 end (* checked sign-extend or low-bits, * Overflow if composed sign-extend not identity *) local fun (''l, ''s) make {sextdFromLargeToSmall: ''l -> ''s, sextdFromSmallToLarge: ''s -> ''l} = if Primitive.Controls.detectOverflow then fn (x: ''l) => let val res = sextdFromLargeToSmall x in if x = (sextdFromSmallToLarge res) then res else raise Overflow end else sextdFromLargeToSmall in val schckFromInt8ToInt8 = sextdFromInt8ToInt8 val schckFromInt8ToInt16 = sextdFromInt8ToInt16 val schckFromInt8ToInt32 = sextdFromInt8ToInt32 val schckFromInt8ToInt64 = sextdFromInt8ToInt64 val schckFromInt8ToWord8 = sextdFromInt8ToWord8 val schckFromInt8ToWord16 = sextdFromInt8ToWord16 val schckFromInt8ToWord32 = sextdFromInt8ToWord32 val schckFromInt8ToWord64 = sextdFromInt8ToWord64 val schckFromInt16ToInt8 = make {sextdFromLargeToSmall = sextdFromInt16ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt16} val schckFromInt16ToInt16 = sextdFromInt16ToInt16 val schckFromInt16ToInt32 = sextdFromInt16ToInt32 val schckFromInt16ToInt64 = sextdFromInt16ToInt64 val schckFromInt16ToWord8 = make {sextdFromLargeToSmall = sextdFromInt16ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt16} val schckFromInt16ToWord16 = sextdFromInt16ToWord16 val schckFromInt16ToWord32 = sextdFromInt16ToWord32 val schckFromInt16ToWord64 = sextdFromInt16ToWord64 val schckFromInt32ToInt8 = make {sextdFromLargeToSmall = sextdFromInt32ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt32} val schckFromInt32ToInt16 = make {sextdFromLargeToSmall = sextdFromInt32ToInt16, sextdFromSmallToLarge = sextdFromInt16ToInt32} val schckFromInt32ToInt32 = sextdFromInt32ToInt32 val schckFromInt32ToInt64 = sextdFromInt32ToInt64 val schckFromInt32ToWord8 = make {sextdFromLargeToSmall = sextdFromInt32ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt32} val schckFromInt32ToWord16 = make {sextdFromLargeToSmall = sextdFromInt32ToWord16, sextdFromSmallToLarge = sextdFromWord16ToInt32} val schckFromInt32ToWord32 = sextdFromInt32ToWord32 val schckFromInt32ToWord64 = sextdFromInt32ToWord64 val schckFromInt64ToInt8 = make {sextdFromLargeToSmall = sextdFromInt64ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt64} val schckFromInt64ToInt16 = make {sextdFromLargeToSmall = sextdFromInt64ToInt16, sextdFromSmallToLarge = sextdFromInt16ToInt64} val schckFromInt64ToInt32 = make {sextdFromLargeToSmall = sextdFromInt64ToInt32, sextdFromSmallToLarge = sextdFromInt32ToInt64} val schckFromInt64ToInt64 = sextdFromInt64ToInt64 val schckFromInt64ToWord8 = make {sextdFromLargeToSmall = sextdFromInt64ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt64} val schckFromInt64ToWord16 = make {sextdFromLargeToSmall = sextdFromInt64ToWord16, sextdFromSmallToLarge = sextdFromWord16ToInt64} val schckFromInt64ToWord32 = make {sextdFromLargeToSmall = sextdFromInt64ToWord32, sextdFromSmallToLarge = sextdFromWord32ToInt64} val schckFromInt64ToWord64 = sextdFromInt64ToWord64 val schckFromWord8ToInt8 = sextdFromWord8ToInt8 val schckFromWord8ToInt16 = sextdFromWord8ToInt16 val schckFromWord8ToInt32 = sextdFromWord8ToInt32 val schckFromWord8ToInt64 = sextdFromWord8ToInt64 val schckFromWord8ToWord8 = sextdFromWord8ToWord8 val schckFromWord8ToWord16 = sextdFromWord8ToWord16 val schckFromWord8ToWord32 = sextdFromWord8ToWord32 val schckFromWord8ToWord64 = sextdFromWord8ToWord64 val schckFromWord16ToInt8 = make {sextdFromLargeToSmall = sextdFromWord16ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord16} val schckFromWord16ToInt16 = sextdFromWord16ToInt16 val schckFromWord16ToInt32 = sextdFromWord16ToInt32 val schckFromWord16ToInt64 = sextdFromWord16ToInt64 val schckFromWord16ToWord8 = make {sextdFromLargeToSmall = sextdFromWord16ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord16} val schckFromWord16ToWord16 = sextdFromWord16ToWord16 val schckFromWord16ToWord32 = sextdFromWord16ToWord32 val schckFromWord16ToWord64 = sextdFromWord16ToWord64 val schckFromWord32ToInt8 = make {sextdFromLargeToSmall = sextdFromWord32ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord32} val schckFromWord32ToInt16 = make {sextdFromLargeToSmall = sextdFromWord32ToInt16, sextdFromSmallToLarge = sextdFromInt16ToWord32} val schckFromWord32ToInt32 = sextdFromWord32ToInt32 val schckFromWord32ToInt64 = sextdFromWord32ToInt64 val schckFromWord32ToWord8 = make {sextdFromLargeToSmall = sextdFromWord32ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord32} val schckFromWord32ToWord16 = make {sextdFromLargeToSmall = sextdFromWord32ToWord16, sextdFromSmallToLarge = sextdFromWord16ToWord32} val schckFromWord32ToWord32 = sextdFromWord32ToWord32 val schckFromWord32ToWord64 = sextdFromWord32ToWord64 val schckFromWord64ToInt8 = make {sextdFromLargeToSmall = sextdFromWord64ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord64} val schckFromWord64ToInt16 = make {sextdFromLargeToSmall = sextdFromWord64ToInt16, sextdFromSmallToLarge = sextdFromInt16ToWord64} val schckFromWord64ToInt32 = make {sextdFromLargeToSmall = sextdFromWord64ToInt32, sextdFromSmallToLarge = sextdFromInt32ToWord64} val schckFromWord64ToInt64 = sextdFromWord64ToInt64 val schckFromWord64ToWord8 = make {sextdFromLargeToSmall = sextdFromWord64ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord64} val schckFromWord64ToWord16 = make {sextdFromLargeToSmall = sextdFromWord64ToWord16, sextdFromSmallToLarge = sextdFromWord16ToWord64} val schckFromWord64ToWord32 = make {sextdFromLargeToSmall = sextdFromWord64ToWord32, sextdFromSmallToLarge = sextdFromWord32ToWord64} val schckFromWord64ToWord64 = sextdFromWord64ToWord64 end end structure Int8 : PRIM_INTEGER = struct open Int8 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt8 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt8 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt8 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt8 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt8 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt8 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt8 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt8 val zextdToInt8 = IntWordConv.zextdFromInt8ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt8ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt8ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt8ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt8ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt8ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt8ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt8ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt8 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt8 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt8 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt8 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt8 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt8 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt8 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt8 val sextdToInt8 = IntWordConv.sextdFromInt8ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt8ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt8ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt8ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt8ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt8ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt8ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt8ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt8 val castFromInt16 = IntWordConv.castFromInt16ToInt8 val castFromInt32 = IntWordConv.castFromInt32ToInt8 val castFromInt64 = IntWordConv.castFromInt64ToInt8 val castFromWord8 = IntWordConv.castFromWord8ToInt8 val castFromWord16 = IntWordConv.castFromWord16ToInt8 val castFromWord32 = IntWordConv.castFromWord32ToInt8 val castFromWord64 = IntWordConv.castFromWord64ToInt8 val castToInt8 = IntWordConv.castFromInt8ToInt8 val castToInt16 = IntWordConv.castFromInt8ToInt16 val castToInt32 = IntWordConv.castFromInt8ToInt32 val castToInt64 = IntWordConv.castFromInt8ToInt64 val castToWord8 = IntWordConv.castFromInt8ToWord8 val castToWord16 = IntWordConv.castFromInt8ToWord16 val castToWord32 = IntWordConv.castFromInt8ToWord32 val castToWord64 = IntWordConv.castFromInt8ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt8 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt8 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt8 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt8 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt8 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt8 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt8 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt8 val zchckToInt8 = IntWordConv.zchckFromInt8ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt8ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt8ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt8ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt8ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt8ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt8ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt8ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt8 val schckFromInt16 = IntWordConv.schckFromInt16ToInt8 val schckFromInt32 = IntWordConv.schckFromInt32ToInt8 val schckFromInt64 = IntWordConv.schckFromInt64ToInt8 val schckFromWord8 = IntWordConv.schckFromWord8ToInt8 val schckFromWord16 = IntWordConv.schckFromWord16ToInt8 val schckFromWord32 = IntWordConv.schckFromWord32ToInt8 val schckFromWord64 = IntWordConv.schckFromWord64ToInt8 val schckToInt8 = IntWordConv.schckFromInt8ToInt8 val schckToInt16 = IntWordConv.schckFromInt8ToInt16 val schckToInt32 = IntWordConv.schckFromInt8ToInt32 val schckToInt64 = IntWordConv.schckFromInt8ToInt64 val schckToWord8 = IntWordConv.schckFromInt8ToWord8 val schckToWord16 = IntWordConv.schckFromInt8ToWord16 val schckToWord32 = IntWordConv.schckFromInt8ToWord32 val schckToWord64 = IntWordConv.schckFromInt8ToWord64 end structure Int16 : PRIM_INTEGER = struct open Int16 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt16 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt16 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt16 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt16 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt16 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt16 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt16 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt16 val zextdToInt8 = IntWordConv.zextdFromInt16ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt16ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt16ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt16ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt16ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt16ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt16ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt16ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt16 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt16 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt16 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt16 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt16 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt16 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt16 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt16 val sextdToInt8 = IntWordConv.sextdFromInt16ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt16ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt16ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt16ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt16ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt16ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt16ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt16ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt16 val castFromInt16 = IntWordConv.castFromInt16ToInt16 val castFromInt32 = IntWordConv.castFromInt32ToInt16 val castFromInt64 = IntWordConv.castFromInt64ToInt16 val castFromWord8 = IntWordConv.castFromWord8ToInt16 val castFromWord16 = IntWordConv.castFromWord16ToInt16 val castFromWord32 = IntWordConv.castFromWord32ToInt16 val castFromWord64 = IntWordConv.castFromWord64ToInt16 val castToInt8 = IntWordConv.castFromInt16ToInt8 val castToInt16 = IntWordConv.castFromInt16ToInt16 val castToInt32 = IntWordConv.castFromInt16ToInt32 val castToInt64 = IntWordConv.castFromInt16ToInt64 val castToWord8 = IntWordConv.castFromInt16ToWord8 val castToWord16 = IntWordConv.castFromInt16ToWord16 val castToWord32 = IntWordConv.castFromInt16ToWord32 val castToWord64 = IntWordConv.castFromInt16ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt16 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt16 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt16 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt16 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt16 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt16 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt16 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt16 val zchckToInt8 = IntWordConv.zchckFromInt16ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt16ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt16ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt16ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt16ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt16ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt16ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt16ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt16 val schckFromInt16 = IntWordConv.schckFromInt16ToInt16 val schckFromInt32 = IntWordConv.schckFromInt32ToInt16 val schckFromInt64 = IntWordConv.schckFromInt64ToInt16 val schckFromWord8 = IntWordConv.schckFromWord8ToInt16 val schckFromWord16 = IntWordConv.schckFromWord16ToInt16 val schckFromWord32 = IntWordConv.schckFromWord32ToInt16 val schckFromWord64 = IntWordConv.schckFromWord64ToInt16 val schckToInt8 = IntWordConv.schckFromInt16ToInt8 val schckToInt16 = IntWordConv.schckFromInt16ToInt16 val schckToInt32 = IntWordConv.schckFromInt16ToInt32 val schckToInt64 = IntWordConv.schckFromInt16ToInt64 val schckToWord8 = IntWordConv.schckFromInt16ToWord8 val schckToWord16 = IntWordConv.schckFromInt16ToWord16 val schckToWord32 = IntWordConv.schckFromInt16ToWord32 val schckToWord64 = IntWordConv.schckFromInt16ToWord64 end structure Int32 : PRIM_INTEGER = struct open Int32 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt32 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt32 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt32 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt32 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt32 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt32 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt32 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt32 val zextdToInt8 = IntWordConv.zextdFromInt32ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt32ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt32ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt32ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt32ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt32ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt32ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt32ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt32 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt32 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt32 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt32 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt32 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt32 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt32 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt32 val sextdToInt8 = IntWordConv.sextdFromInt32ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt32ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt32ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt32ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt32ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt32ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt32ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt32ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt32 val castFromInt16 = IntWordConv.castFromInt16ToInt32 val castFromInt32 = IntWordConv.castFromInt32ToInt32 val castFromInt64 = IntWordConv.castFromInt64ToInt32 val castFromWord8 = IntWordConv.castFromWord8ToInt32 val castFromWord16 = IntWordConv.castFromWord16ToInt32 val castFromWord32 = IntWordConv.castFromWord32ToInt32 val castFromWord64 = IntWordConv.castFromWord64ToInt32 val castToInt8 = IntWordConv.castFromInt32ToInt8 val castToInt16 = IntWordConv.castFromInt32ToInt16 val castToInt32 = IntWordConv.castFromInt32ToInt32 val castToInt64 = IntWordConv.castFromInt32ToInt64 val castToWord8 = IntWordConv.castFromInt32ToWord8 val castToWord16 = IntWordConv.castFromInt32ToWord16 val castToWord32 = IntWordConv.castFromInt32ToWord32 val castToWord64 = IntWordConv.castFromInt32ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt32 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt32 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt32 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt32 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt32 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt32 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt32 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt32 val zchckToInt8 = IntWordConv.zchckFromInt32ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt32ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt32ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt32ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt32ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt32ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt32ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt32ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt32 val schckFromInt16 = IntWordConv.schckFromInt16ToInt32 val schckFromInt32 = IntWordConv.schckFromInt32ToInt32 val schckFromInt64 = IntWordConv.schckFromInt64ToInt32 val schckFromWord8 = IntWordConv.schckFromWord8ToInt32 val schckFromWord16 = IntWordConv.schckFromWord16ToInt32 val schckFromWord32 = IntWordConv.schckFromWord32ToInt32 val schckFromWord64 = IntWordConv.schckFromWord64ToInt32 val schckToInt8 = IntWordConv.schckFromInt32ToInt8 val schckToInt16 = IntWordConv.schckFromInt32ToInt16 val schckToInt32 = IntWordConv.schckFromInt32ToInt32 val schckToInt64 = IntWordConv.schckFromInt32ToInt64 val schckToWord8 = IntWordConv.schckFromInt32ToWord8 val schckToWord16 = IntWordConv.schckFromInt32ToWord16 val schckToWord32 = IntWordConv.schckFromInt32ToWord32 val schckToWord64 = IntWordConv.schckFromInt32ToWord64 end structure Int64 : PRIM_INTEGER = struct open Int64 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt64 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt64 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt64 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt64 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt64 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt64 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt64 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt64 val zextdToInt8 = IntWordConv.zextdFromInt64ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt64ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt64ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt64ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt64ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt64ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt64ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt64ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt64 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt64 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt64 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt64 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt64 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt64 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt64 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt64 val sextdToInt8 = IntWordConv.sextdFromInt64ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt64ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt64ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt64ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt64ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt64ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt64ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt64ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt64 val castFromInt16 = IntWordConv.castFromInt16ToInt64 val castFromInt32 = IntWordConv.castFromInt32ToInt64 val castFromInt64 = IntWordConv.castFromInt64ToInt64 val castFromWord8 = IntWordConv.castFromWord8ToInt64 val castFromWord16 = IntWordConv.castFromWord16ToInt64 val castFromWord32 = IntWordConv.castFromWord32ToInt64 val castFromWord64 = IntWordConv.castFromWord64ToInt64 val castToInt8 = IntWordConv.castFromInt64ToInt8 val castToInt16 = IntWordConv.castFromInt64ToInt16 val castToInt32 = IntWordConv.castFromInt64ToInt32 val castToInt64 = IntWordConv.castFromInt64ToInt64 val castToWord8 = IntWordConv.castFromInt64ToWord8 val castToWord16 = IntWordConv.castFromInt64ToWord16 val castToWord32 = IntWordConv.castFromInt64ToWord32 val castToWord64 = IntWordConv.castFromInt64ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt64 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt64 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt64 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt64 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt64 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt64 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt64 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt64 val zchckToInt8 = IntWordConv.zchckFromInt64ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt64ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt64ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt64ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt64ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt64ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt64ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt64ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt64 val schckFromInt16 = IntWordConv.schckFromInt16ToInt64 val schckFromInt32 = IntWordConv.schckFromInt32ToInt64 val schckFromInt64 = IntWordConv.schckFromInt64ToInt64 val schckFromWord8 = IntWordConv.schckFromWord8ToInt64 val schckFromWord16 = IntWordConv.schckFromWord16ToInt64 val schckFromWord32 = IntWordConv.schckFromWord32ToInt64 val schckFromWord64 = IntWordConv.schckFromWord64ToInt64 val schckToInt8 = IntWordConv.schckFromInt64ToInt8 val schckToInt16 = IntWordConv.schckFromInt64ToInt16 val schckToInt32 = IntWordConv.schckFromInt64ToInt32 val schckToInt64 = IntWordConv.schckFromInt64ToInt64 val schckToWord8 = IntWordConv.schckFromInt64ToWord8 val schckToWord16 = IntWordConv.schckFromInt64ToWord16 val schckToWord32 = IntWordConv.schckFromInt64ToWord32 val schckToWord64 = IntWordConv.schckFromInt64ToWord64 end structure Word8 : PRIM_WORD = struct open Word8 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord8 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord8 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord8 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord8 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord8 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord8 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord8 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord8 val zextdToInt8 = IntWordConv.zextdFromWord8ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord8ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord8ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord8ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord8ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord8ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord8ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord8ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord8 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord8 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord8 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord8 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord8 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord8 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord8 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord8 val sextdToInt8 = IntWordConv.sextdFromWord8ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord8ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord8ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord8ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord8ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord8ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord8ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord8ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord8 val castFromInt16 = IntWordConv.castFromInt16ToWord8 val castFromInt32 = IntWordConv.castFromInt32ToWord8 val castFromInt64 = IntWordConv.castFromInt64ToWord8 val castFromWord8 = IntWordConv.castFromWord8ToWord8 val castFromWord16 = IntWordConv.castFromWord16ToWord8 val castFromWord32 = IntWordConv.castFromWord32ToWord8 val castFromWord64 = IntWordConv.castFromWord64ToWord8 val castToInt8 = IntWordConv.castFromWord8ToInt8 val castToInt16 = IntWordConv.castFromWord8ToInt16 val castToInt32 = IntWordConv.castFromWord8ToInt32 val castToInt64 = IntWordConv.castFromWord8ToInt64 val castToWord8 = IntWordConv.castFromWord8ToWord8 val castToWord16 = IntWordConv.castFromWord8ToWord16 val castToWord32 = IntWordConv.castFromWord8ToWord32 val castToWord64 = IntWordConv.castFromWord8ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord8 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord8 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord8 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord8 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord8 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord8 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord8 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord8 val zchckToInt8 = IntWordConv.zchckFromWord8ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord8ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord8ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord8ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord8ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord8ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord8ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord8ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord8 val schckFromInt16 = IntWordConv.schckFromInt16ToWord8 val schckFromInt32 = IntWordConv.schckFromInt32ToWord8 val schckFromInt64 = IntWordConv.schckFromInt64ToWord8 val schckFromWord8 = IntWordConv.schckFromWord8ToWord8 val schckFromWord16 = IntWordConv.schckFromWord16ToWord8 val schckFromWord32 = IntWordConv.schckFromWord32ToWord8 val schckFromWord64 = IntWordConv.schckFromWord64ToWord8 val schckToInt8 = IntWordConv.schckFromWord8ToInt8 val schckToInt16 = IntWordConv.schckFromWord8ToInt16 val schckToInt32 = IntWordConv.schckFromWord8ToInt32 val schckToInt64 = IntWordConv.schckFromWord8ToInt64 val schckToWord8 = IntWordConv.schckFromWord8ToWord8 val schckToWord16 = IntWordConv.schckFromWord8ToWord16 val schckToWord32 = IntWordConv.schckFromWord8ToWord32 val schckToWord64 = IntWordConv.schckFromWord8ToWord64 end structure Word16 : PRIM_WORD = struct open Word16 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord16 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord16 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord16 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord16 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord16 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord16 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord16 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord16 val zextdToInt8 = IntWordConv.zextdFromWord16ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord16ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord16ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord16ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord16ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord16ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord16ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord16ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord16 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord16 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord16 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord16 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord16 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord16 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord16 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord16 val sextdToInt8 = IntWordConv.sextdFromWord16ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord16ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord16ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord16ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord16ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord16ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord16ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord16ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord16 val castFromInt16 = IntWordConv.castFromInt16ToWord16 val castFromInt32 = IntWordConv.castFromInt32ToWord16 val castFromInt64 = IntWordConv.castFromInt64ToWord16 val castFromWord8 = IntWordConv.castFromWord8ToWord16 val castFromWord16 = IntWordConv.castFromWord16ToWord16 val castFromWord32 = IntWordConv.castFromWord32ToWord16 val castFromWord64 = IntWordConv.castFromWord64ToWord16 val castToInt8 = IntWordConv.castFromWord16ToInt8 val castToInt16 = IntWordConv.castFromWord16ToInt16 val castToInt32 = IntWordConv.castFromWord16ToInt32 val castToInt64 = IntWordConv.castFromWord16ToInt64 val castToWord8 = IntWordConv.castFromWord16ToWord8 val castToWord16 = IntWordConv.castFromWord16ToWord16 val castToWord32 = IntWordConv.castFromWord16ToWord32 val castToWord64 = IntWordConv.castFromWord16ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord16 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord16 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord16 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord16 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord16 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord16 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord16 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord16 val zchckToInt8 = IntWordConv.zchckFromWord16ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord16ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord16ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord16ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord16ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord16ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord16ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord16ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord16 val schckFromInt16 = IntWordConv.schckFromInt16ToWord16 val schckFromInt32 = IntWordConv.schckFromInt32ToWord16 val schckFromInt64 = IntWordConv.schckFromInt64ToWord16 val schckFromWord8 = IntWordConv.schckFromWord8ToWord16 val schckFromWord16 = IntWordConv.schckFromWord16ToWord16 val schckFromWord32 = IntWordConv.schckFromWord32ToWord16 val schckFromWord64 = IntWordConv.schckFromWord64ToWord16 val schckToInt8 = IntWordConv.schckFromWord16ToInt8 val schckToInt16 = IntWordConv.schckFromWord16ToInt16 val schckToInt32 = IntWordConv.schckFromWord16ToInt32 val schckToInt64 = IntWordConv.schckFromWord16ToInt64 val schckToWord8 = IntWordConv.schckFromWord16ToWord8 val schckToWord16 = IntWordConv.schckFromWord16ToWord16 val schckToWord32 = IntWordConv.schckFromWord16ToWord32 val schckToWord64 = IntWordConv.schckFromWord16ToWord64 end structure Word32 : PRIM_WORD = struct open Word32 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord32 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord32 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord32 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord32 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord32 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord32 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord32 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord32 val zextdToInt8 = IntWordConv.zextdFromWord32ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord32ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord32ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord32ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord32ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord32ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord32ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord32ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord32 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord32 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord32 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord32 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord32 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord32 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord32 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord32 val sextdToInt8 = IntWordConv.sextdFromWord32ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord32ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord32ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord32ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord32ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord32ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord32ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord32ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord32 val castFromInt16 = IntWordConv.castFromInt16ToWord32 val castFromInt32 = IntWordConv.castFromInt32ToWord32 val castFromInt64 = IntWordConv.castFromInt64ToWord32 val castFromWord8 = IntWordConv.castFromWord8ToWord32 val castFromWord16 = IntWordConv.castFromWord16ToWord32 val castFromWord32 = IntWordConv.castFromWord32ToWord32 val castFromWord64 = IntWordConv.castFromWord64ToWord32 val castToInt8 = IntWordConv.castFromWord32ToInt8 val castToInt16 = IntWordConv.castFromWord32ToInt16 val castToInt32 = IntWordConv.castFromWord32ToInt32 val castToInt64 = IntWordConv.castFromWord32ToInt64 val castToWord8 = IntWordConv.castFromWord32ToWord8 val castToWord16 = IntWordConv.castFromWord32ToWord16 val castToWord32 = IntWordConv.castFromWord32ToWord32 val castToWord64 = IntWordConv.castFromWord32ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord32 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord32 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord32 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord32 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord32 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord32 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord32 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord32 val zchckToInt8 = IntWordConv.zchckFromWord32ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord32ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord32ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord32ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord32ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord32ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord32ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord32ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord32 val schckFromInt16 = IntWordConv.schckFromInt16ToWord32 val schckFromInt32 = IntWordConv.schckFromInt32ToWord32 val schckFromInt64 = IntWordConv.schckFromInt64ToWord32 val schckFromWord8 = IntWordConv.schckFromWord8ToWord32 val schckFromWord16 = IntWordConv.schckFromWord16ToWord32 val schckFromWord32 = IntWordConv.schckFromWord32ToWord32 val schckFromWord64 = IntWordConv.schckFromWord64ToWord32 val schckToInt8 = IntWordConv.schckFromWord32ToInt8 val schckToInt16 = IntWordConv.schckFromWord32ToInt16 val schckToInt32 = IntWordConv.schckFromWord32ToInt32 val schckToInt64 = IntWordConv.schckFromWord32ToInt64 val schckToWord8 = IntWordConv.schckFromWord32ToWord8 val schckToWord16 = IntWordConv.schckFromWord32ToWord16 val schckToWord32 = IntWordConv.schckFromWord32ToWord32 val schckToWord64 = IntWordConv.schckFromWord32ToWord64 end structure Word64 : PRIM_WORD = struct open Word64 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord64 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord64 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord64 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord64 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord64 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord64 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord64 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord64 val zextdToInt8 = IntWordConv.zextdFromWord64ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord64ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord64ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord64ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord64ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord64ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord64ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord64ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord64 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord64 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord64 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord64 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord64 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord64 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord64 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord64 val sextdToInt8 = IntWordConv.sextdFromWord64ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord64ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord64ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord64ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord64ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord64ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord64ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord64ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord64 val castFromInt16 = IntWordConv.castFromInt16ToWord64 val castFromInt32 = IntWordConv.castFromInt32ToWord64 val castFromInt64 = IntWordConv.castFromInt64ToWord64 val castFromWord8 = IntWordConv.castFromWord8ToWord64 val castFromWord16 = IntWordConv.castFromWord16ToWord64 val castFromWord32 = IntWordConv.castFromWord32ToWord64 val castFromWord64 = IntWordConv.castFromWord64ToWord64 val castToInt8 = IntWordConv.castFromWord64ToInt8 val castToInt16 = IntWordConv.castFromWord64ToInt16 val castToInt32 = IntWordConv.castFromWord64ToInt32 val castToInt64 = IntWordConv.castFromWord64ToInt64 val castToWord8 = IntWordConv.castFromWord64ToWord8 val castToWord16 = IntWordConv.castFromWord64ToWord16 val castToWord32 = IntWordConv.castFromWord64ToWord32 val castToWord64 = IntWordConv.castFromWord64ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord64 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord64 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord64 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord64 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord64 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord64 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord64 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord64 val zchckToInt8 = IntWordConv.zchckFromWord64ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord64ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord64ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord64ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord64ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord64ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord64ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord64ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord64 val schckFromInt16 = IntWordConv.schckFromInt16ToWord64 val schckFromInt32 = IntWordConv.schckFromInt32ToWord64 val schckFromInt64 = IntWordConv.schckFromInt64ToWord64 val schckFromWord8 = IntWordConv.schckFromWord8ToWord64 val schckFromWord16 = IntWordConv.schckFromWord16ToWord64 val schckFromWord32 = IntWordConv.schckFromWord32ToWord64 val schckFromWord64 = IntWordConv.schckFromWord64ToWord64 val schckToInt8 = IntWordConv.schckFromWord64ToInt8 val schckToInt16 = IntWordConv.schckFromWord64ToInt16 val schckToInt32 = IntWordConv.schckFromWord64ToInt32 val schckToInt64 = IntWordConv.schckFromWord64ToInt64 val schckToWord8 = IntWordConv.schckFromWord64ToWord8 val schckToWord16 = IntWordConv.schckFromWord64ToWord16 val schckToWord32 = IntWordConv.schckFromWord64ToWord32 val schckToWord64 = IntWordConv.schckFromWord64ToWord64 end end mlton-20210117+dfsg/basis-library/integer/num0.sml000066400000000000000000000233131416264345000216240ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MKNUM0_ARG = sig structure Int: PRIM_INTEGER structure Word: PRIM_WORD val idFromIntToWord: Int.int -> Word.word val idFromWordToInt: Word.word -> Int.int end signature PRIM_INTEGER = sig include PRIM_INTEGER val maxInt': int val minInt': int val maxInt: int option val minInt: int option val zero: int val one: int val abs: int -> int val div: int * int -> int val mod: int * int -> int val quot: int * int -> int val rem: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val andb : int * int -> int val < int val notb : int -> int val orb : int * int -> int val rolUnsafe : int * Primitive.Word32.word -> int val rorUnsafe : int * Primitive.Word32.word -> int val ~>>? : int * Primitive.Word32.word -> int val >>? : int * Primitive.Word32.word -> int val xorb : int * int -> int val power: {base:int, exp: int} -> int val log2: int -> Primitive.Int32.int val log2Word: int -> Primitive.Word32.word end signature PRIM_WORD = sig include PRIM_WORD val zero: word val one: word val maxWord': word val div: word * word -> word val mod: word * word -> word val log2: word -> Primitive.Int32.int val log2Word: word -> Primitive.Word32.word end functor MkNum0 (S: MKNUM0_ARG): sig structure Int: PRIM_INTEGER structure Word: PRIM_WORD end = struct open S val _ = if Int.sizeInBits <> Word.sizeInBits orelse Int.sizeInBitsWord <> Word.sizeInBitsWord then raise Primitive.Exn.Fail8 "MkNum0: Int.sizeInBits <> Word.sizeInBits" else () structure Word = struct open Word val zero = zextdFromWord32 0w0 val one = zextdFromWord32 0w1 val maxWord' = notb zero local fun make f (w, w') = if Primitive.Controls.safe andalso w' = zero then raise Div else f (w, w') in val op div = make (op quotUnsafe) val op mod = make (op remUnsafe) end fun log2Word w = let fun loop (n, s, acc) = if n = one then acc else let val (n, acc) = if n >= <>? (n, s), Primitive.Word32.+ (acc, s)) else (n, acc) in loop (n, Primitive.Word32.>>? (s, 0w1), acc) end in if Primitive.Controls.safe andalso w = zero then raise Domain else loop (w, Primitive.Word32.>>? (sizeInBitsWord, 0w1), 0w0) end fun log2 w = Primitive.IntWordConv.zextdFromWord32ToInt32 (log2Word w) end structure Int = struct open Int val zero = zextdFromInt32 0 val one = zextdFromInt32 1 local fun makeBinop f = fn (x: int, y: int) => idFromWordToInt (f (idFromIntToWord x, idFromIntToWord y)) fun makeUnop f = fn (x: int) => idFromWordToInt (f (idFromIntToWord x)) fun makeShop f = fn (x: int, w: Primitive.Word32.word) => idFromWordToInt (f (idFromIntToWord x, w)) in val andb = makeBinop Word.andb val <>? = makeShop Word.~>>? val >>? = makeShop Word.>>? val xorb = makeBinop Word.xorb end fun log2 i = Word.log2 (idFromIntToWord i) fun log2Word i = Word.log2Word (idFromIntToWord i) val minInt' = <>? (notb zero, 0w1) val minInt = SOME minInt' val maxInt = SOME maxInt' fun abs (x: int) = if x < zero then ~ x else x fun quot (x, y) = if Primitive.Controls.safe andalso y = zero then raise Div else if (Primitive.Controls.detectOverflow orelse Primitive.Controls.safe) andalso x = minInt' andalso y = ~one then if Primitive.Controls.detectOverflow then raise Overflow else minInt' else quotUnsafe (x, y) fun rem (x, y) = if Primitive.Controls.safe andalso y = zero then raise Div else if x = minInt' andalso y = ~one then zero else remUnsafe (x, y) fun x div y = if x >= zero then if y > zero then quotUnsafe (x, y) else if y < zero then if x = zero then zero else quotUnsafe (x -! one, y) -! one else raise Div else if y < zero then if (Primitive.Controls.detectOverflow orelse Primitive.Controls.safe) andalso x = minInt' andalso y = ~one then if Primitive.Controls.detectOverflow then raise Overflow else minInt' else quotUnsafe (x, y) else if y > zero then quotUnsafe (x +! one, y) -! one else raise Div fun x mod y = if x >= zero then if y > zero then remUnsafe (x, y) else if y < zero then if x = zero then zero else remUnsafe (x -! one, y) +! (y + one) else raise Div else if y < zero then if x = minInt' andalso y = ~one then zero else remUnsafe (x, y) else if y > zero then remUnsafe (x +! one, y) +! (y -! one) else raise Div local structure S = UnsignedIntegralComparisons (type int = int type word = Word.word val idFromIntToWord = idFromIntToWord val op < = Word.<) in open S end fun power {base, exp} = if Primitive.Controls.safe andalso exp < zero then raise Primitive.Exn.Fail8 "Int.power" else let fun loop (exp, accum) = if exp <= zero then accum else loop (exp - one, base * accum) in loop (exp, one) end end end structure Primitive = struct open Primitive local structure S = MkNum0 (structure Int = Int8 structure Word = Word8 val idFromIntToWord = IntWordConv.idFromInt8ToWord8 val idFromWordToInt = IntWordConv.idFromWord8ToInt8) in structure Int8 : PRIM_INTEGER = S.Int structure Word8 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int16 structure Word = Word16 val idFromIntToWord = IntWordConv.idFromInt16ToWord16 val idFromWordToInt = IntWordConv.idFromWord16ToInt16) in structure Int16 : PRIM_INTEGER = S.Int structure Word16 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int32 structure Word = Word32 val idFromIntToWord = IntWordConv.idFromInt32ToWord32 val idFromWordToInt = IntWordConv.idFromWord32ToInt32) in structure Int32 : PRIM_INTEGER = S.Int structure Word32 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int64 structure Word = Word64 val idFromIntToWord = IntWordConv.idFromInt64ToWord64 val idFromWordToInt = IntWordConv.idFromWord64ToInt64) in structure Int64 : PRIM_INTEGER = S.Int structure Word64 : PRIM_WORD = S.Word end end mlton-20210117+dfsg/basis-library/integer/num1.sml000066400000000000000000000743511416264345000216350ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MKNUM1_ARG = sig type num val zextdFromInt8: Primitive.Int8.int -> num val zextdFromInt16: Primitive.Int16.int -> num val zextdFromInt32: Primitive.Int32.int -> num val zextdFromInt64: Primitive.Int64.int -> num val zextdFromIntInf: Primitive.IntInf.int -> num val zextdFromWord8: Primitive.Word8.word -> num val zextdFromWord16: Primitive.Word16.word -> num val zextdFromWord32: Primitive.Word32.word -> num val zextdFromWord64: Primitive.Word64.word -> num val zextdToInt8: num -> Primitive.Int8.int val zextdToInt16: num -> Primitive.Int16.int val zextdToInt32: num -> Primitive.Int32.int val zextdToInt64: num -> Primitive.Int64.int val zextdToIntInf: num -> Primitive.IntInf.int val zextdToWord8: num -> Primitive.Word8.word val zextdToWord16: num -> Primitive.Word16.word val zextdToWord32: num -> Primitive.Word32.word val zextdToWord64: num -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> num val sextdFromInt16: Primitive.Int16.int -> num val sextdFromInt32: Primitive.Int32.int -> num val sextdFromInt64: Primitive.Int64.int -> num val sextdFromIntInf: Primitive.IntInf.int -> num val sextdFromWord8: Primitive.Word8.word -> num val sextdFromWord16: Primitive.Word16.word -> num val sextdFromWord32: Primitive.Word32.word -> num val sextdFromWord64: Primitive.Word64.word -> num val sextdToInt8: num -> Primitive.Int8.int val sextdToInt16: num -> Primitive.Int16.int val sextdToInt32: num -> Primitive.Int32.int val sextdToInt64: num -> Primitive.Int64.int val sextdToIntInf: num -> Primitive.IntInf.int val sextdToWord8: num -> Primitive.Word8.word val sextdToWord16: num -> Primitive.Word16.word val sextdToWord32: num -> Primitive.Word32.word val sextdToWord64: num -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> num val castFromInt16: Primitive.Int16.int -> num val castFromInt32: Primitive.Int32.int -> num val castFromInt64: Primitive.Int64.int -> num val castFromIntInf: Primitive.IntInf.int -> num val castFromWord8: Primitive.Word8.word -> num val castFromWord16: Primitive.Word16.word -> num val castFromWord32: Primitive.Word32.word -> num val castFromWord64: Primitive.Word64.word -> num val castToInt8: num -> Primitive.Int8.int val castToInt16: num -> Primitive.Int16.int val castToInt32: num -> Primitive.Int32.int val castToInt64: num -> Primitive.Int64.int val castToIntInf: num -> Primitive.IntInf.int val castToWord8: num -> Primitive.Word8.word val castToWord16: num -> Primitive.Word16.word val castToWord32: num -> Primitive.Word32.word val castToWord64: num -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> num val zchckFromInt16: Primitive.Int16.int -> num val zchckFromInt32: Primitive.Int32.int -> num val zchckFromInt64: Primitive.Int64.int -> num val zchckFromIntInf: Primitive.IntInf.int -> num val zchckFromWord8: Primitive.Word8.word -> num val zchckFromWord16: Primitive.Word16.word -> num val zchckFromWord32: Primitive.Word32.word -> num val zchckFromWord64: Primitive.Word64.word -> num val zchckToInt8: num -> Primitive.Int8.int val zchckToInt16: num -> Primitive.Int16.int val zchckToInt32: num -> Primitive.Int32.int val zchckToInt64: num -> Primitive.Int64.int val zchckToIntInf: num -> Primitive.IntInf.int val zchckToWord8: num -> Primitive.Word8.word val zchckToWord16: num -> Primitive.Word16.word val zchckToWord32: num -> Primitive.Word32.word val zchckToWord64: num -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> num val schckFromInt16: Primitive.Int16.int -> num val schckFromInt32: Primitive.Int32.int -> num val schckFromInt64: Primitive.Int64.int -> num val schckFromIntInf: Primitive.IntInf.int -> num val schckFromWord8: Primitive.Word8.word -> num val schckFromWord16: Primitive.Word16.word -> num val schckFromWord32: Primitive.Word32.word -> num val schckFromWord64: Primitive.Word64.word -> num val schckToInt8: num -> Primitive.Int8.int val schckToInt16: num -> Primitive.Int16.int val schckToInt32: num -> Primitive.Int32.int val schckToInt64: num -> Primitive.Int64.int val schckToIntInf: num -> Primitive.IntInf.int val schckToWord8: num -> Primitive.Word8.word val schckToWord16: num -> Primitive.Word16.word val schckToWord32: num -> Primitive.Word32.word val schckToWord64: num -> Primitive.Word64.word end signature MKNUM1_RES = sig type num val zextdFromInt: Int.int -> num val zextdToInt: num -> Int.int val sextdFromInt: Int.int -> num val sextdToInt: num -> Int.int val castFromInt: Int.int -> num val castToInt: num -> Int.int val zchckFromInt: Int.int -> num val zchckToInt: num -> Int.int val schckFromInt: Int.int -> num val schckToInt: num -> Int.int val zextdFromFixedInt: FixedInt.int -> num val zextdToFixedInt: num -> FixedInt.int val sextdFromFixedInt: FixedInt.int -> num val sextdToFixedInt: num -> FixedInt.int val castFromFixedInt: FixedInt.int -> num val castToFixedInt: num -> FixedInt.int val zchckFromFixedInt: FixedInt.int -> num val zchckToFixedInt: num -> FixedInt.int val schckFromFixedInt: FixedInt.int -> num val schckToFixedInt: num -> FixedInt.int val zextdFromLargeInt: LargeInt.int -> num val zextdToLargeInt: num -> LargeInt.int val sextdFromLargeInt: LargeInt.int -> num val sextdToLargeInt: num -> LargeInt.int val castFromLargeInt: LargeInt.int -> num val castToLargeInt: num -> LargeInt.int val zchckFromLargeInt: LargeInt.int -> num val zchckToLargeInt: num -> LargeInt.int val schckFromLargeInt: LargeInt.int -> num val schckToLargeInt: num -> LargeInt.int val zextdFromWord: Word.word -> num val zextdToWord: num -> Word.word val sextdFromWord: Word.word -> num val sextdToWord: num -> Word.word val castFromWord: Word.word -> num val castToWord: num -> Word.word val zchckFromWord: Word.word -> num val zchckToWord: num -> Word.word val schckFromWord: Word.word -> num val schckToWord: num -> Word.word val zextdFromLargeWord: LargeWord.word -> num val zextdToLargeWord: num -> LargeWord.word val sextdFromLargeWord: LargeWord.word -> num val sextdToLargeWord: num -> LargeWord.word val castFromLargeWord: LargeWord.word -> num val castToLargeWord: num -> LargeWord.word val zchckFromLargeWord: LargeWord.word -> num val zchckToLargeWord: num -> LargeWord.word val schckFromLargeWord: LargeWord.word -> num val schckToLargeWord: num -> LargeWord.word val zextdFromSysWord: SysWord.word -> num val zextdToSysWord: num -> SysWord.word val sextdFromSysWord: SysWord.word -> num val sextdToSysWord: num -> SysWord.word val castFromSysWord: SysWord.word -> num val castToSysWord: num -> SysWord.word val zchckFromSysWord: SysWord.word -> num val zchckToSysWord: num -> SysWord.word val schckFromSysWord: SysWord.word -> num val schckToSysWord: num -> SysWord.word end signature PRIM_INTEGER = sig include PRIM_INTEGER include MKNUM1_RES where type num = int end signature PRIM_WORD = sig include PRIM_WORD include MKNUM1_RES where type num = word end functor MkNum1 (I: MKNUM1_ARG) : MKNUM1_RES = struct open I local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64 val fIntInf = I.zextdFromIntInf) in val zextdFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64 val fIntInf = I.zextdToIntInf) in val zextdToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64 val fIntInf = I.sextdFromIntInf) in val sextdFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64 val fIntInf = I.sextdToIntInf) in val sextdToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64 val fIntInf = I.castFromIntInf) in val castFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64 val fIntInf = I.castToIntInf) in val castToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64 val fIntInf = I.zchckFromIntInf) in val zchckFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64 val fIntInf = I.zchckToIntInf) in val zchckToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64 val fIntInf = I.schckFromIntInf) in val schckFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64 val fIntInf = I.schckToIntInf) in val schckToInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64) in val zextdFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64) in val zextdToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64) in val sextdFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64) in val sextdToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64) in val castFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64) in val castToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64) in val zchckFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64) in val zchckToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64) in val schckFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64) in val schckToFixedInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64 val fIntInf = I.zextdFromIntInf) in val zextdFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64 val fIntInf = I.zextdToIntInf) in val zextdToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64 val fIntInf = I.sextdFromIntInf) in val sextdFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64 val fIntInf = I.sextdToIntInf) in val sextdToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64 val fIntInf = I.castFromIntInf) in val castFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64 val fIntInf = I.castToIntInf) in val castToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64 val fIntInf = I.zchckFromIntInf) in val zchckFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64 val fIntInf = I.zchckToIntInf) in val zchckToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64 val fIntInf = I.schckFromIntInf) in val schckFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64 val fIntInf = I.schckToIntInf) in val schckToLargeInt = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToLargeWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToSysWord = S.f end end structure Primitive = struct open Primitive structure Int8 = struct open Int8 local structure S = MkNum1(struct open Int8 type num = int end) in open S end end structure Int16 = struct open Int16 local structure S = MkNum1(struct open Int16 type num = int end) in open S end end structure Int32 = struct open Int32 local structure S = MkNum1(struct open Int32 type num = int end) in open S end end structure Int64 = struct open Int64 local structure S = MkNum1(struct open Int64 type num = int end) in open S end end structure IntInf = struct open IntInf local structure S = MkNum1(struct open IntInf type num = int end) in open S end end structure Word8 = struct open Word8 local structure S = MkNum1(struct open Word8 type num = word end) in open S end end structure Word16 = struct open Word16 local structure S = MkNum1(struct open Word16 type num = word end) in open S end end structure Word32 = struct open Word32 local structure S = MkNum1(struct open Word32 type num = word end) in open S end end structure Word64 : PRIM_WORD = struct open Word64 local structure S = MkNum1(struct open Word64 type num = word end) in open S end end end mlton-20210117+dfsg/basis-library/integer/pack-word.sig000066400000000000000000000014571416264345000226300ustar00rootroot00000000000000signature PACK_WORD = sig val bytesPerElem: int val isBigEndian: bool val subArr: Word8Array.array * int -> LargeWord.word val subArrX: Word8Array.array * int -> LargeWord.word val subVec: Word8Vector.vector * int -> LargeWord.word val subVecX: Word8Vector.vector * int -> LargeWord.word val update: Word8Array.array * int * LargeWord.word -> unit end signature PACK_WORD_EXTRA = sig include PACK_WORD val unsafeSubArr: Word8Array.array * int -> LargeWord.word val unsafeSubArrX: Word8Array.array * int -> LargeWord.word val unsafeSubVec: Word8Vector.vector * int -> LargeWord.word val unsafeSubVecX: Word8Vector.vector * int -> LargeWord.word val unsafeUpdate: Word8Array.array * int * LargeWord.word -> unit end mlton-20210117+dfsg/basis-library/integer/pack-word.sml000066400000000000000000000202531416264345000226340ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PackWord (S: sig type word val wordSize: int val isBigEndian: bool val subArr: Word8.word array * SeqIndex.int -> word val subVec: Word8.word vector * SeqIndex.int -> word val update: Word8.word array * SeqIndex.int * word -> unit val bswap: word -> word val toLarge: word -> LargeWord.word val toLargeX: word -> LargeWord.word val fromLarge: LargeWord.word -> word end): PACK_WORD_EXTRA = struct open S val bytesPerElem = Int.div (wordSize, 8) fun offset (i, n) = let val () = if Primitive.Controls.safe andalso (Int.geu (Int.+ (Int.* (bytesPerElem, i), Int.- (bytesPerElem, 1)), n)) then raise Subscript else () in SeqIndex.fromInt i end handle Overflow => raise Subscript val subArrRev = bswap o subArr val subVecRev = bswap o subVec fun updateRev (a, i, w) = update (a, i, bswap w) val (subA, subV, updA) = if isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian then (subArr, subVec, update) else (subArrRev, subVecRev, updateRev) fun unsafeUpdate (a, i, w) = let val i = SeqIndex.fromInt i val a = Word8Array.toPoly a in updA (a, i, fromLarge w) end fun update (a, i, w) = let val i = offset (i, Word8Array.length a) val a = Word8Array.toPoly a in updA (a, i, fromLarge w) end local fun make (sub, length, toPoly) (av, i) = let val i = offset (i, length av) in sub (toPoly av, i) end in val subArr = toLarge o (make (subA, Word8Array.length, Word8Array.toPoly)) val subArrX = toLargeX o (make (subA, Word8Array.length, Word8Array.toPoly)) val subVec = toLarge o (make (subV, Word8Vector.length, Word8Vector.toPoly)) val subVecX = toLargeX o (make (subV, Word8Vector.length, Word8Vector.toPoly)) end local fun make (sub, length, toPoly) (av, i) = let val i = SeqIndex.fromInt i in sub (toPoly av, i) end in val unsafeSubArr = toLarge o (make (subA, Word8Array.length, Word8Array.toPoly)) val unsafeSubArrX = toLargeX o (make (subA, Word8Array.length, Word8Array.toPoly)) val unsafeSubVec = toLarge o (make (subV, Word8Vector.length, Word8Vector.toPoly)) val unsafeSubVecX = toLargeX o (make (subV, Word8Vector.length, Word8Vector.toPoly)) end end structure PackWord8Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord8 open Word8) structure PackWord8Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord8 open Word8) structure PackWord8Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord8 open Word8) structure PackWord16Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord16 open Word16) structure PackWord16Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord16 open Word16) structure PackWord16Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord16 open Word16) structure PackWord32Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord32 open Word32) structure PackWord32Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord32 open Word32) structure PackWord32Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord32 open Word32) structure PackWord64Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord64 open Word64) structure PackWord64Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord64 open Word64) structure PackWord64Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord64 open Word64) local structure PackWord = struct local structure S = Word_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subArr val fWord16 = Primitive.PackWord16.subArr val fWord32 = Primitive.PackWord32.subArr val fWord64 = Primitive.PackWord64.subArr) in val subArr = S.f end local structure S = Word_ChooseWordN (type 'a t = Word8.word vector * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subVec val fWord16 = Primitive.PackWord16.subVec val fWord32 = Primitive.PackWord32.subVec val fWord64 = Primitive.PackWord64.subVec) in val subVec = S.f end local structure S = Word_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t * 'a -> unit val fWord8 = Primitive.PackWord8.update val fWord16 = Primitive.PackWord16.update val fWord32 = Primitive.PackWord32.update val fWord64 = Primitive.PackWord64.update) in val update = S.f end end in structure PackWordBig: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open PackWord open Word) structure PackWordLittle: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open PackWord open Word) structure PackWordHost: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open PackWord open Word) end local structure PackLargeWord = struct local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subArr val fWord16 = Primitive.PackWord16.subArr val fWord32 = Primitive.PackWord32.subArr val fWord64 = Primitive.PackWord64.subArr) in val subArr = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word vector * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subVec val fWord16 = Primitive.PackWord16.subVec val fWord32 = Primitive.PackWord32.subVec val fWord64 = Primitive.PackWord64.subVec) in val subVec = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t * 'a -> unit val fWord8 = Primitive.PackWord8.update val fWord16 = Primitive.PackWord16.update val fWord32 = Primitive.PackWord32.update val fWord64 = Primitive.PackWord64.update) in val update = S.f end end in structure PackLargeWordBig: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open PackLargeWord open LargeWord) structure PackLargeWordLittle: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open PackLargeWord open LargeWord) structure PackLargeWordHost: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open PackLargeWord open LargeWord) end mlton-20210117+dfsg/basis-library/integer/word-global.sml000066400000000000000000000004651416264345000231610ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure WordGlobal: WORD_GLOBAL = Word open WordGlobal mlton-20210117+dfsg/basis-library/integer/word.sig000066400000000000000000000042401416264345000217050ustar00rootroot00000000000000signature WORD_GLOBAL = sig eqtype word end signature WORD = sig include WORD_GLOBAL val wordSize: Int.int val toLarge: word -> LargeWord.word val toLargeX: word -> LargeWord.word val toLargeWord: word -> LargeWord.word val toLargeWordX: word -> LargeWord.word val fromLarge: LargeWord.word -> word val fromLargeWord: LargeWord.word -> word val toLargeInt: word -> LargeInt.int val toLargeIntX: word -> LargeInt.int val fromLargeInt: LargeInt.int -> word val toInt: word -> int val toIntX: word -> int val fromInt: int -> word val + : word * word -> word val - : word * word -> word val * : word * word -> word val div: word * word -> word val mod: word * word -> word val andb: word * word -> word val << : word * Word.word -> word val notb: word -> word val orb: word * word -> word val ~>> : word * Word.word -> word val >> : word * Word.word -> word val xorb: word * word -> word val compare: word * word -> order val < : word * word -> bool val <= : word * word -> bool val > : word * word -> bool val >= : word * word -> bool val ~ : word -> word val min: word * word -> word val max: word * word -> word val fmt: StringCvt.radix -> word -> string val toString: word -> string val scan: (StringCvt.radix -> (char, 'a) StringCvt.reader -> (word, 'a) StringCvt.reader) val fromString: string -> word option end signature WORD_EXTRA = sig include WORD type t = word val zero: word val one: word val maxWord' : word val toWord: word -> Word.word val toWordX: word -> Word.word val fromWord: Word.word -> word val bswap: word -> word val rol: word * Word.word -> word val ror: word * Word.word -> word val log2 : word -> Primitive.Int32.int val castFromFixedInt: FixedInt.int -> word val castToFixedInt: word -> FixedInt.int val castFromSysWord: SysWord.word -> word val castToSysWord: word -> SysWord.word end mlton-20210117+dfsg/basis-library/integer/word.sml000066400000000000000000000162211416264345000217200ustar00rootroot00000000000000(* Copyright (C) 2013 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Word (W: PRIM_WORD) : WORD_EXTRA = struct open W type t = word val wordSize: Int.int = Primitive.Int32.zextdToInt sizeInBits val sizeInBitsWord = Primitive.Word32.zextdToWord sizeInBitsWord fun << (i, n) = if Word.>= (n, sizeInBitsWord) then zero else W.<> (i, n) = if Word.>= (n, sizeInBitsWord) then zero else W.>>? (i, Primitive.Word32.zextdFromWord n) fun ~>> (i, n) = if Word.< (n, sizeInBitsWord) then W.~>>? (i, Primitive.Word32.zextdFromWord n) else W.~>>? (i, Primitive.Word32.- (W.sizeInBitsWord, 0w1)) fun rol (i, n) = W.rolUnsafe (i, Primitive.Word32.zextdFromWord n) fun ror (i, n) = W.rorUnsafe (i, Primitive.Word32.zextdFromWord n) local fun st (w, msk, sft) = let val odd = andb (w, msk) val evn = xorb (w, odd) in (xorb (W.<>? (evn, sft)), xorb (msk, W.<>? (sft, 0w1))), Primitive.Word32.>>? (sft, 0w1)) end val (f, sft : Primitive.Word32.t) = case W.sizeInBitsWord of 0w8 => (fn x => x, 0w4) | 0w16 => (st, 0w8) | 0w32 => (st o st, 0w16) | 0w64 => (st o st o st, 0w32) | _ => raise (Fail "Word.bswap") in fun bswap w = #1 (f (w, W.< false | SOME precision => Int32.<= (precision, W.sizeInBits)) andalso Int.< (i, 0) then raise Overflow else i end val fromLargeInt = W.sextdFromLargeInt val toLargeIntX = W.schckToLargeInt fun toLargeInt w = let val i = W.zchckToLargeInt w in if Primitive.Controls.detectOverflow andalso (case LargeInt.precision of NONE => false | SOME precision => Int32.<= (precision, W.sizeInBits)) andalso LargeInt.< (i, 0) then raise Overflow else i end val fromLargeWord = W.zextdFromLargeWord val fromLarge = fromLargeWord val toLargeWordX = W.sextdToLargeWord val toLargeX = toLargeWordX val toLargeWord = W.zextdToLargeWord val toLarge = toLargeWord val fromWord = W.zextdFromWord val toWordX = W.sextdToWord val toWord = W.zextdToWord local (* Allocate a buffer large enough to hold any formatted word in any radix. * The most that will be required is for maxWord in binary. *) val maxNumDigits = wordSize val oneBuf = One.make (fn () => CharArray.array (maxNumDigits, #"\000")) in fun fmt radix (w: word): string = One.use (oneBuf, fn buf => let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, i: Int.int) = let val _ = CharArray.update (buf, i, StringCvt.digitToChar (toInt (q mod radix))) val q = q div radix in if q = zero then CharArraySlice.vector (CharArraySlice.slice (buf, i, NONE)) else loop (q, Int.- (i, 1)) end in loop (w, Int.- (maxNumDigits, 1)) end) end (* fun fmt radix (w: word): string = let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, chars) = let val chars = StringCvt.digitToChar (toInt (q mod radix)) :: chars val q = q div radix in if q = zero then String.implode chars else loop (q, chars) end in loop (w, []) end *) val toString = fmt StringCvt.HEX fun scan radix reader state = let val state = StringCvt.skipWS reader state val charToDigit = StringCvt.charToDigit radix val radixWord = fromInt (StringCvt.radixToInt radix) fun finishNum (state, n) = case reader state of NONE => SOME (n, state) | SOME (c, state') => case charToDigit c of NONE => SOME (n, state) | SOME n' => let val n'' = n * radixWord in if n'' div radixWord = n then let val n' = fromInt n' val n''' = n'' + n' in if n''' >= n'' then finishNum (state', n''') else raise Overflow end else raise Overflow end fun num state = finishNum (state, zero) in case reader state of NONE => NONE | SOME (c, state) => case c of #"0" => (case reader state of NONE => SOME (zero, state) | SOME (c, state') => case c of #"w" => (case radix of StringCvt.HEX => (case reader state' of NONE => (* the #"w" was not followed by * an #"X" or #"x", therefore we * return 0 *) SOME (zero, state) | SOME (c, state) => (case c of #"x" => num state | #"X" => num state | _ => (* the #"w" was not followed by * an #"X" or #"x", therefore we * return 0 *) SOME (zero, state))) | _ => num state') | #"x" => (case radix of StringCvt.HEX => num state' | _ => NONE) | #"X" => (case radix of StringCvt.HEX => num state' | _ => NONE) | _ => num state) | _ => (case charToDigit c of NONE => NONE | SOME n => finishNum (state, fromInt n)) end val fromString = StringCvt.scanString (scan StringCvt.HEX) end structure Word8 = Word (Primitive.Word8) structure Word16 = Word (Primitive.Word16) structure Word32 = Word (Primitive.Word32) structure Word64 = Word (Primitive.Word64) mlton-20210117+dfsg/basis-library/io/000077500000000000000000000000001416264345000172005ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/io/bin-io.sig000066400000000000000000000032031416264345000210570ustar00rootroot00000000000000signature BIN_IO = sig structure StreamIO: BIN_STREAM_IO type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setInstream: (instream * StreamIO.instream) -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit end signature BIN_IO_EXTRA = sig include BIN_IO val equalsIn: instream * instream -> bool val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc val stdErr: outstream val stdIn: instream val stdOut: outstream end mlton-20210117+dfsg/basis-library/io/bin-io.sml000066400000000000000000000014371416264345000210770ustar00rootroot00000000000000(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure BinIO: BIN_IO_EXTRA = ImperativeIOExtra (structure Array = Word8Array structure ArraySlice = Word8ArraySlice structure PrimIO = BinPrimIO structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice val chunkSize = Int32.toInt (Primitive.Controls.bufSize) val fileTypeFlags = [PrimitiveFFI.Posix.FileSys.O.BINARY] val line = NONE val mkReader = Posix.IO.mkBinReader val mkWriter = Posix.IO.mkBinWriter val someElem = 0wx0: Word8.word val xlatePos = SOME {fromInt = fn i => i, toInt = fn i => i}) mlton-20210117+dfsg/basis-library/io/bin-prim-io.sml000066400000000000000000000013611416264345000220400ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure BinPrimIO : PRIM_IO where type array = Word8Array.array where type vector = Word8Vector.vector where type elem = Word8.word where type pos = Position.int = PrimIO (structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice structure Array = Word8Array structure ArraySlice = Word8ArraySlice type pos = Position.int val compare = Position.compare val someElem = 0wx0: Word8.word) mlton-20210117+dfsg/basis-library/io/bin-stream-io.sig000066400000000000000000000001671416264345000223560ustar00rootroot00000000000000signature BIN_STREAM_IO = STREAM_IO where type elem = Word8Vector.elem where type vector = Word8Vector.vector mlton-20210117+dfsg/basis-library/io/imperative-io.fun000066400000000000000000000647231416264345000225000ustar00rootroot00000000000000(* Copyright (C) 2013,2017 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature IMPERATIVE_IO_EXTRA_ARG = sig structure Array: sig include MONO_ARRAY val alloc: int -> array val unsafeSub: array * int -> elem end structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: sig include MONO_VECTOR val unsafeFromArray: Array.array -> vector end structure VectorSlice: MONO_VECTOR_SLICE sharing type Array.array = ArraySlice.array = PrimIO.array sharing type Array.elem = ArraySlice.elem = PrimIO.elem = Vector.elem = VectorSlice.elem sharing type Array.vector = ArraySlice.vector = PrimIO.vector = Vector.vector = VectorSlice.vector sharing type ArraySlice.slice = PrimIO.array_slice sharing type ArraySlice.vector_slice = PrimIO.vector_slice = VectorSlice.slice val chunkSize: int val fileTypeFlags: Posix.FileSys.O.flags list val line : {isLine: Vector.elem -> bool, lineElem: Vector.elem} option val mkReader: {fd: Posix.FileSys.file_desc, name: string, initBlkMode: bool} -> PrimIO.reader val mkWriter: {fd: Posix.FileSys.file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> PrimIO.writer val someElem: PrimIO.elem val xlatePos : {toInt : PrimIO.pos -> Position.int, fromInt : Position.int -> PrimIO.pos} option end functor ImperativeIOExtra (S: IMPERATIVE_IO_EXTRA_ARG): IMPERATIVE_IO_EXTRA = struct open S structure StreamIO = StreamIOExtraFile (S) structure PIO = PrimIO structure SIO = StreamIO structure A = Array structure AS = ArraySlice structure V = Vector structure VS = VectorSlice type elem = PrimIO.elem type vector = PrimIO.vector type vector_slice = VS.slice (* ------------------------------------------------- *) (* outstream *) (* ------------------------------------------------- *) (* The following :> hides the fact that Outstream.t is an eqtype. Doing it * here is much easier than putting :> on the functor result. *) structure Outstream:> sig type t val get: t -> SIO.outstream val make: SIO.outstream -> t val set: t * SIO.outstream -> unit end = struct datatype t = T of SIO.outstream ref fun get (T r) = !r fun set (T r, s) = r := s fun make s = T (ref s) end type outstream = Outstream.t fun output (os, v) = SIO.output (Outstream.get os, v) fun output1 (os, v) = SIO.output1 (Outstream.get os, v) fun outputSlice (os, v) = SIO.outputSlice (Outstream.get os, v) fun flushOut os = SIO.flushOut (Outstream.get os) fun closeOut os = SIO.closeOut (Outstream.get os) val mkOutstream = Outstream.make val getOutstream = Outstream.get val setOutstream = Outstream.set val getPosOut = SIO.getPosOut o Outstream.get fun setPosOut (os, outPos) = Outstream.set (os, SIO.setPosOut outPos) fun newOut {appendMode, bufferMode, closeAtExit, fd, name} = let val writer = mkWriter {appendMode = appendMode, chunkSize = chunkSize, fd = fd, initBlkMode = true, name = name} val outstream = SIO.mkOutstream'' {bufferMode = bufferMode, closeAtExit = closeAtExit, closed = false, writer = writer} in mkOutstream outstream end structure PFS = Posix.FileSys val stdErr = newOut {appendMode = true, bufferMode = IO.NO_BUF, closeAtExit = false, fd = PFS.stderr, name = ""} val newOut = fn {appendMode, closeAtExit, fd, name} => newOut {appendMode = appendMode, bufferMode = if Posix.ProcEnv.isatty fd then IO.LINE_BUF else IO.BLOCK_BUF, closeAtExit = closeAtExit, fd = fd, name = name} val stdOut = newOut {appendMode = true, closeAtExit = false, fd = PFS.stdout, name = ""} val newOut = fn {appendMode, fd, name} => newOut {appendMode = appendMode, closeAtExit = true, fd = fd, name = name} fun 'a protect' (function: string, name: string, f: unit -> 'a): 'a = f () handle e => raise IO.Io {cause = e, function = function, name = name} local val readWrite = let open PFS.S in flags [irusr, iwusr, irgrp, iwgrp, iroth, iwoth] end in fun openOut file = protect' ("openOut", file, fn () => let val fd = PFS.createf (file, Posix.IO.O_WRONLY, PFS.O.flags (PFS.O.trunc::fileTypeFlags), readWrite) in newOut {fd = fd, name = file, appendMode = false} end) fun openAppend file = protect' ("openAppend", file, fn () => let val fd = PFS.createf (file, Posix.IO.O_WRONLY, PFS.O.flags (PFS.O.append::fileTypeFlags), readWrite) in newOut {fd = fd, name = file, appendMode = true} end) end val newOut = fn (fd, name) => newOut {fd = fd, name = name, appendMode = false} val outFd = SIO.outFd o getOutstream (* ------------------------------------------------- *) (* instream *) (* ------------------------------------------------- *) datatype state = Closed | Open of {eos: bool} | Stream of SIO.instream (* Inv: if !first < !last then !state = Open {eos = false} * if !state = Closed then !first = !last * if !state = Open {eos = true} then !first = !last *) datatype instream = In of {augmentedReader: PIO.reader, buf: A.array, first: int ref, (* index of first character *) last: int ref, (* one past the index of the last char *) reader: PIO.reader, state: state ref} local val augmentedReader = PIO.nullRd () val buf = A.alloc 0 val first = ref 0 val last = ref 0 val reader = PIO.nullRd () in fun mkInstream s = In {augmentedReader = augmentedReader, buf = buf, first = first, last = last, reader = reader, state = ref (Stream s)} end fun setInstream (In {first, last, state, ...}, s) = (first := 0 ; last := 0 ; state := Stream s) fun equalsIn (In {first = f, ...}, In {first = f', ...}) = f = f' fun augmentedReaderSel (In {augmentedReader = PIO.RD v, ...}, sel) = sel v fun readerSel (In {reader = PIO.RD v, ...}, sel) = sel v fun inbufferName ib = readerSel (ib, #name) fun inFd ib = case readerSel (ib, #ioDesc) of NONE => raise IO.Io {cause = Fail "", function = "inFd", name = inbufferName ib} | SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) val empty = V.tabulate (0, fn _ => someElem) local fun make (sel, e: exn) ib = case augmentedReaderSel (ib, sel) of NONE => raise e | SOME x => x in val readArr = make (#readArr, IO.BlockingNotSupported) val readArrNB = make (#readArrNB, IO.NonblockingNotSupported) val readVec = make (#readVec, IO.BlockingNotSupported) end fun 'a protect (ib, function: string, f: unit -> 'a): 'a = f () handle e => raise IO.Io {cause = e, function = function, name = inbufferName ib} fun update (ib as In {buf, first, last, state, ...}) = let val i = readArr ib (AS.full buf) in if i = 0 then (state := Open {eos = true} ; false) else (first := 0 ; last := i ; true) end fun input (ib as In {buf, first, last, ...}) = let val f = !first val l = !last in if f < l then (first := l ; AS.vector (AS.slice (buf, f, SOME (l - f)))) else let val In {state, ...} = ib in case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "input", fn () => readVec ib (augmentedReaderSel (ib, #chunkSize))) | Stream s => let val (v, s') = SIO.input s val _ = state := Stream s' in v end end end (* input1 will move past a temporary end of stream *) fun input1 (ib as In {buf, first, last, ...}) = let val f = !first in if f < !last then (first := f + 1 ; SOME (A.unsafeSub (buf, f))) else let val In {state, ...} = ib in case !state of Closed => NONE | Open {eos} => if eos then (state := Open {eos = false} ; NONE) else if protect (ib, "input1", fn () => update ib) then (first := 1 ; SOME (A.sub (buf, 0))) else NONE | Stream s => let val (c, s') = SIO.input1' s val _ = state := Stream s' in c end end end fun inputN (ib as In {buf, first, last, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else let val f = !first val l = !last val size = l - f in if size >= n then (first := f + n ; AS.vector (AS.slice (buf, f, SOME n))) else let val In {state, ...} = ib in case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "inputN", fn () => let val readArr = readArr ib val inp = A.alloc n fun fill k = if k >= size then () else (A.update (inp, k, A.sub (buf, f + k)) ; fill (k + 1)) val _ = fill 0 val _ = first := l fun loop i = if i = n then i else let val j = readArr (AS.slice (inp, i, SOME (n - i))) in if j = 0 then (state := Open {eos = true}; i) else loop (i + j) end val i = loop size in if i = n then V.unsafeFromArray inp else AS.vector (AS.slice (inp, 0, SOME i)) end) | Stream s => let val (v, s') = SIO.inputN (s, n) val _ = state := Stream s' in v end end end fun inputAll (ib as In {state, ...}) = case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "inputAll", fn () => let val In {buf, first, last, ...} = ib val readVec = readVec ib val f = !first val l = !last val inp = AS.vector (AS.slice (buf, f, SOME (l - f))) val inps = [inp] fun loop inps = let val inp = readVec (augmentedReaderSel (ib, #chunkSize)) in if V.length inp = 0 then V.concat (List.rev inps) else loop (inp :: inps) end in loop inps end) | Stream s => let val (v, s') = SIO.inputAll s val _ = state := Stream s' in v end val inputLine = case line of NONE => (fn ib => SOME (input ib)) | SOME {isLine, lineElem} => let val lineVec = V.tabulate (1, fn _ => lineElem) in fn (ib as In {state, ...}) => case !state of Closed => NONE | Open {eos} => if eos then NONE else protect (ib, "inputLine", fn () => let val In {buf, first, last, ...} = ib fun finish (inps, trail) = let val inps = if trail then lineVec :: inps else inps val inp = V.concat (List.rev inps) in SOME inp end fun loop inps = if !first < !last orelse update ib then let val f = !first val l = !last (* !first < !last *) fun loop' i = (* pre: !first <= i <= !last *) let fun done j = (* pre: !first < j <= !last *) let val inp = AS.vector (AS.slice (buf, f, SOME (j - f))) in first := j; inp::inps end in if i >= l then loop (done i) else if isLine (A.sub (buf, i)) then finish (done (i + 1), false) else loop' (i + 1) end in loop' f end else (case inps of [] => NONE | _ => finish (inps, true)) in loop [] end) | Stream s => Option.map (fn (v, s') => (state := Stream s'; v)) (SIO.inputLine s) end fun canInput (ib as In {state, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else case !state of Closed => SOME 0 | Open {eos} => if eos then SOME 0 else protect (ib, "canInput", fn () => let val readArrNB = readArrNB ib val In {buf, first, last, ...} = ib val f = !first val l = !last val read = l - f val _ = if f > 0 then (AS.copy {di = 0, dst = buf, src = AS.slice (buf, f, SOME read)} ; first := 0) else () val size = A.length buf (* 0 = !first *) fun loop read = if read = size then {read = read, eos = false} else let val slice = AS.slice (buf, read, NONE) val i = readArrNB slice in case i of NONE => {read = read, eos = false} | SOME i => if 0 = i then {read = read, eos = true} else loop (read + i) end val {read, eos} = loop read val _ = last := read in if read > 0 then SOME (Int.min (n, read)) else if eos then (state := Open {eos = true}; SOME 0) else NONE end) | Stream s => SIO.canInput (s, n) fun lookahead (ib as In {buf, first, last, ...}) = let val f = !first val l = !last in if f < l then SOME (A.unsafeSub (buf, f)) else let val In {state, ...} = ib in case !state of Closed => NONE | Open {eos, ...} => if eos then NONE else if protect (ib, "lookahead", fn () => update ib) then SOME (A.sub (buf, 0)) else NONE | Stream s => Option.map #1 (SIO.input1 s) end end fun closeIn (ib as In {first, last, state, ...}) = case !state of Closed => () | Open _ => (first := !last ; state := Closed ; protect (ib, "closeIn", fn () => readerSel (ib, #close) ())) | Stream s => SIO.closeIn s fun endOfStream (ib as In {first, last, state, ...}) = !first = !last andalso (case !state of Closed => true | Open {eos, ...} => eos orelse not (protect (ib, "endOfStream", fn () => update ib)) | Stream s => SIO.endOfStream s) fun mkInbuffer' {reader, closed, bufferContents} = let val (state, first, last, buf) = if closed then (ref Closed, ref 0, ref 0, Array.array (0, someElem)) else let val PIO.RD {chunkSize, ...} = reader val buf = Array.array (chunkSize, someElem) val first = ref 0 val (state, last) = case bufferContents of NONE => (ref (Open {eos = false}), ref 0) | SOME v => if V.length v = 0 then (ref (Open {eos = true}), ref 0) else (V.appi (fn (i, c) => A.update (buf, i, c)) v ; (ref (Open {eos = false}), ref (V.length v))) in (state, first, last, buf) end in In {augmentedReader = PIO.augmentReader reader, buf = buf, first = first, last = last, reader = reader, state = state} end fun openVector v = mkInbuffer' {bufferContents = NONE, closed = false, reader = PIO.openVector v} val openInbuffers : (instream * {close: bool}) list ref = ref [] fun getInstream (ib as In {state, ...}) = let fun doit (closed: bool, bufferContents) = let val In {reader, ...} = ib val (ibs, openInbuffers') = List.partition (fn (ib', _) => equalsIn (ib, ib')) (!openInbuffers) val _ = openInbuffers := openInbuffers' val closeAtExit = List.foldr (fn ((_, {close = close'}), close) => close orelse close') false ibs in SIO.mkInstream'' {bufferContents = bufferContents, closeAtExit = closeAtExit, closed = closed, reader = reader} end in case !state of Closed => doit (true, NONE) | Open {eos} => if eos then doit (false, SOME (true, empty)) else let val In {buf, first, last, ...} = ib val f = !first val l = !last val s = if f < l then doit (false, SOME (true, AS.vector (AS.slice (buf, f, SOME (l - f))))) else doit (false, NONE) val () = state := Stream s in s end | Stream s => s end val mkInbuffer'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app (fn (ib, {close}) => if close then closeIn ib else ()) (!openInbuffers)) in fn {bufferContents, closeAtExit, closed, reader} => let val ib = mkInbuffer' {bufferContents = bufferContents, closed = closed, reader = reader} val _ = if closed then () else openInbuffers := ((ib, {close = closeAtExit}) :: (!openInbuffers)) in ib end end fun scanStream f is = case f SIO.input1 (getInstream is) of NONE => NONE | SOME (v, s') => (setInstream (is, s'); SOME v) val closeIn = fn ib => let val _ = openInbuffers := List.filter (fn (ib',_) => not (equalsIn (ib, ib'))) (!openInbuffers) in closeIn ib end fun newIn {bufferContents, closeAtExit, fd, name} = let val reader = mkReader {fd = fd, initBlkMode = true, name = name} in mkInbuffer'' {bufferContents = bufferContents, closeAtExit = closeAtExit, closed = false, reader = reader} end val newIn = fn (fd, name) => newIn {bufferContents = NONE, closeAtExit = true, fd = fd, name = name} val stdIn = newIn (PFS.stdin, "") fun openIn file = protect' ("openIn", file, fn () => let val fd = PFS.openf (file, Posix.IO.O_RDONLY, PFS.O.flags fileTypeFlags) in newIn (fd, file) end) end signature IMPERATIVE_IO_ARG = sig structure Array: MONO_ARRAY (* structure ArraySlice: MONO_ARRAY_SLICE *) structure StreamIO: STREAM_IO structure Vector: MONO_VECTOR (* structure VectorSlice: MONO_VECTOR_SLICE *) (* sharing type Array.array = ArraySlice.array *) sharing type Array.elem (* = ArraySlice.elem *) = StreamIO.elem = Vector.elem (* = VectorSlice.elem *) sharing type Array.vector (* = ArraySlice.vector *) = Vector.vector (* = VectorSlice.vector *) (* sharing type ArraySlice.vector_slice = VectorSlice.slice *) end functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = struct open S structure SIO = StreamIO type elem = SIO.elem type vector = SIO.vector datatype outstream = Out of SIO.outstream ref fun output (Out os, v) = SIO.output (!os, v) fun output1 (Out os, v) = SIO.output1 (!os, v) fun flushOut (Out os) = SIO.flushOut (!os) fun closeOut (Out os) = SIO.closeOut (!os) fun mkOutstream os = Out (ref os) fun getOutstream (Out os) = !os fun setOutstream (Out os, os') = os := os' fun getPosOut (Out os) = SIO.getPosOut (!os) fun setPosOut (Out os, out_pos) = os := SIO.setPosOut out_pos datatype instream = In of SIO.instream ref fun canInput (In is, n) = SIO.canInput (!is, n) fun closeIn (In is) = SIO.closeIn (!is) fun endOfStream (In is) = SIO.endOfStream (!is) fun getInstream (In is) = !is fun input (In is) = let val (v, is') = SIO.input (!is) in is := is'; v end (* input1 will never move past a temporary end of stream *) fun input1 (In is) = case SIO.input1 (!is) of SOME (c,is') => (is := is'; SOME c) | NONE => NONE fun inputAll (In is) = let val (v, is') = SIO.inputAll (!is) in is := is'; v end fun inputN (In is, n) = let val (v, is') = SIO.inputN (!is, n) in is := is'; v end fun lookahead (In is) = Option.map #1 (SIO.input1 (!is)) fun mkInstream is = In (ref is) fun setInstream (In is, is') = is := is' end mlton-20210117+dfsg/basis-library/io/imperative-io.sig000066400000000000000000000060211416264345000224550ustar00rootroot00000000000000signature IMPERATIVE_IO = sig structure StreamIO: STREAM_IO type elem = StreamIO.elem type vector = StreamIO.vector type instream type outstream val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setInstream: instream * StreamIO.instream -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit end signature IMPERATIVE_IO_EXTRA = sig structure StreamIO: STREAM_IO_EXTRA type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector type vector_slice = StreamIO.vector_slice val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val equalsIn: instream * instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val inFd: instream -> Posix.IO.file_desc val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> vector option val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val openVector: vector -> instream val outFd: outstream -> Posix.IO.file_desc val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSlice: outstream * vector_slice -> unit val scanStream: ((elem, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: instream * StreamIO.instream -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit val stdErr: outstream val stdIn: instream val stdOut: outstream end mlton-20210117+dfsg/basis-library/io/io.sig000066400000000000000000000011331416264345000203110ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature IO = sig exception Io of {name : string, function : string, cause : exn} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20210117+dfsg/basis-library/io/io.sml000066400000000000000000000016061416264345000203270ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IO: IO = struct exception BlockingNotSupported exception ClosedStream exception Io of {cause : exn, function : string, name : string} val _ = General.addExnMessager (fn e => case e of Io {cause, function, name, ...} => SOME (concat ["Io: ", function, " \"", name, "\" failed with ", exnMessage cause]) | _ => NONE) exception NonblockingNotSupported exception RandomAccessNotSupported datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20210117+dfsg/basis-library/io/prim-io.fun000066400000000000000000000322321416264345000212700ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_IO_ARG = sig structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE sharing type Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type VectorSlice.slice = ArraySlice.vector_slice sharing type Array.array = ArraySlice.array val someElem: Vector.elem eqtype pos val compare: pos * pos -> order end functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = struct open S structure V = Vector structure VS = VectorSlice structure A = Array structure AS = ArraySlice type elem = A.elem type vector = V.vector type vector_slice = VS.slice type array = A.array type array_slice = AS.slice type pos = pos val compare = compare datatype reader = RD of {avail: unit -> int option, block: (unit -> unit) option, canInput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, readArr: (array_slice -> int) option, readArrNB: (array_slice -> int option) option, readVec: (int -> vector) option, readVecNB: (int -> vector option) option, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option} datatype writer = WR of {block: (unit -> unit) option, canOutput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option, writeArr: (array_slice -> int) option, writeArrNB: (array_slice -> int option) option, writeVec: (vector_slice -> int) option, writeVecNB: (vector_slice -> int option) option} fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} fun openVector v = let val name = "openVector" val closed = ref false val pos = ref 0 val eofPos = V.length v fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) fun readVec f i = let val _ = check f val n = Int.min (i, eofPos - !pos) in VS.vector (VS.slice (v, !pos, SOME n)) before (pos := !pos + n) end fun readArr f sl = let val _ = check f val (buf, i, sz) = AS.base sl val n = Int.min (sz, eofPos - !pos) in AS.copyVec {src = VS.slice (v, !pos, SOME n), dst = buf, di = i}; pos := !pos + n; n end in RD {avail = const "avail" NONE, block = SOME (const "block" ()), canInput = SOME (const "canInput" true), chunkSize = 32, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, readArr = SOME (readArr "readArr"), readArrNB = SOME (SOME o (readArr "readVecNB")), readVec = SOME (readVec "readVec"), readVecNB = SOME (SOME o (readVec "readVecNB")), setPos = NONE, verifyPos = NONE} end fun nullRd () = let val name = "nullRd" val closed = ref false fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) val empty = V.fromList [] in RD {avail = const "avail" NONE, block = SOME (const "block" ()), canInput = SOME (const "canInput" true), chunkSize = 1, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, readArr = SOME (const "readArr" 0), readArrNB = SOME (const "readArrNB" (SOME 0)), readVec = SOME (const "readVec" empty), readVecNB = SOME (const "readVecNB" (SOME empty)), setPos = NONE, verifyPos = NONE} end fun nullWr () = let val name = "nullWr" val closed = ref false fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) fun function f g = fn x => (check f; g x) in WR {block = SOME (const "block" ()), canOutput = SOME (const "canOutput" true), chunkSize = 1, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, setPos = NONE, verifyPos = NONE, writeArr = SOME (function "writeArr" AS.length), writeArrNB = SOME (function "writeArrNB" (SOME o AS.length)), writeVec = SOME (function "writeVec" VS.length), writeVecNB = SOME (function "writeVecNB" (SOME o VS.length))} end fun doBlock (f, block: unit -> unit) x = (block (); valOf (f x)) fun doCanInput (f, canInput) x = if canInput () then SOME (f x) else NONE fun augmentReader (RD {name, chunkSize, readVec, readArr, readVecNB, readArrNB, block, canInput, avail, getPos, setPos, endPos, verifyPos, close, ioDesc}) = let fun augmentRead (readVec, readArr) = case (readVec, readArr) of (SOME readVec, SOME readArr) => (SOME readVec, SOME readArr) | (NONE, SOME readArr) => (SOME (fn i => let val buf = A.array (i, someElem) fun first j = AS.slice (buf, 0, SOME j) in (AS.vector o first) (readArr (first i)) end), SOME readArr) | (SOME readVec, NONE) => (SOME readVec, SOME (fn sl => let val (buf, i, sz) = AS.base sl val v = readVec sz val _ = A.copyVec {src = v, dst = buf, di = i} in V.length v end)) | (NONE, NONE) => (NONE, NONE) fun augmentReadNB (readVecNB, readArrNB) = case (readVecNB, readArrNB) of (SOME readVecNB, SOME readArrNB) => (SOME readVecNB, SOME readArrNB) | (NONE, SOME readArrNB) => (SOME (fn i => let val buf = A.array (i, someElem) fun first j = AS.slice (buf, 0, SOME j) in Option.map (AS.vector o first) (readArrNB (first i)) end), SOME readArrNB) | (SOME readVecNB, NONE) => (SOME readVecNB, SOME (fn sl => let val (buf, i, sz) = AS.base sl in case readVecNB sz of NONE => NONE | SOME v => (A.copyVec {src = v, dst = buf, di = i} ; SOME (V.length v)) end)) | (NONE, NONE) => (NONE, NONE) fun augmentSeq (readSeq, readSeqNB) = case (readSeq, readSeqNB) of (SOME readSeq, SOME readSeqNB) => (SOME readSeq, SOME readSeqNB) | (NONE, SOME readSeqNB) => (case block of NONE => NONE | SOME block => SOME (doBlock (readSeqNB, block)), SOME readSeqNB) | (SOME readSeq, NONE) => (SOME readSeq, case canInput of NONE => NONE | SOME canInput => SOME (doCanInput (readSeq, canInput))) | (NONE, NONE) => (NONE, NONE) val ((readVec,readArr),(readVecNB,readArrNB)) = (augmentRead (readVec, readArr), augmentReadNB (readVecNB, readArrNB)) val ((readVec,readVecNB),(readArr,readArrNB)) = (augmentSeq (readVec, readVecNB), augmentSeq (readArr, readArrNB)) in RD {name = name, chunkSize = chunkSize, readVec = readVec, readArr = readArr, readVecNB = readVecNB, readArrNB = readArrNB, block = block, canInput = canInput, avail = avail, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc} end fun augmentWriter (WR {name, chunkSize, writeVec, writeArr, writeVecNB, writeArrNB, block, canOutput, getPos, setPos, endPos, verifyPos, close, ioDesc}) = let fun augmentWrite (writeVec, writeArr) = case (writeVec, writeArr) of (SOME writeVec, SOME writeArr) => (SOME writeVec, SOME writeArr) | (NONE, SOME writeArr) => (SOME (fn sl => writeArr (AS.full (A.tabulate (VS.length sl, fn i => VS.sub (sl, i))))), SOME writeArr) | (SOME writeVec, NONE) => (SOME writeVec, SOME (fn sl => writeVec (VS.full (AS.vector sl)))) | (NONE, NONE) => (NONE, NONE) fun augmentSeq (writeSeq, writeSeqNB) = case (writeSeq, writeSeqNB) of (SOME writeSeq, SOME writeSeqNB) => (SOME writeSeq, SOME writeSeqNB) | (NONE, SOME writeSeqNB) => (case block of NONE => NONE | SOME block => SOME (fn x => (block (); valOf (writeSeqNB x))), SOME writeSeqNB) | (SOME writeSeq, NONE) => (SOME writeSeq, case canOutput of NONE => NONE | SOME canOutput => SOME (fn x => (if canOutput () then SOME (writeSeq x) else NONE))) | (NONE, NONE) => (NONE, NONE) val ((writeVec,writeArr),(writeVecNB,writeArrNB)) = (augmentWrite (writeVec, writeArr), augmentWrite (writeVecNB, writeArrNB)) val ((writeVec,writeVecNB),(writeArr,writeArrNB)) = (augmentSeq (writeVec, writeVecNB), augmentSeq (writeArr, writeArrNB)) in WR {name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = writeVecNB, writeArrNB = writeArrNB, block = block, canOutput = canOutput, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc} end end mlton-20210117+dfsg/basis-library/io/prim-io.sig000066400000000000000000000037101416264345000212610ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_IO = sig type elem type vector type vector_slice type array type array_slice eqtype pos val compare: pos * pos -> order datatype reader = RD of {avail: unit -> int option, block: (unit -> unit) option, canInput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, readArr: (array_slice -> int) option, readArrNB: (array_slice -> int option) option, readVec: (int -> vector) option, readVecNB: (int -> vector option) option, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option} datatype writer = WR of {block: (unit -> unit) option, canOutput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option, writeArr: (array_slice -> int) option, writeArrNB: (array_slice -> int option) option, writeVec: (vector_slice -> int) option, writeVecNB: (vector_slice -> int option) option} val openVector: vector -> reader val nullRd: unit -> reader val nullWr: unit -> writer val augmentReader: reader -> reader val augmentWriter: writer -> writer end mlton-20210117+dfsg/basis-library/io/stream-io.fun000066400000000000000000001124121416264345000216130ustar00rootroot00000000000000(* Copyright (C) 2013 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature STREAM_IO_EXTRA_ARG = sig structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE sharing type PrimIO.elem = Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.array_slice = ArraySlice.slice val line: {isLine: PrimIO.elem -> bool, lineElem: PrimIO.elem} option val someElem: PrimIO.elem val xlatePos : {toInt : PrimIO.pos -> Position.int, fromInt : Position.int -> PrimIO.pos} option end functor StreamIOExtra (S: STREAM_IO_EXTRA_ARG): STREAM_IO_EXTRA = struct open S structure PIO = PrimIO structure A = Array structure AS = ArraySlice structure V = struct open Vector val extract : vector * int * int option -> vector = VectorSlice.vector o VectorSlice.slice end structure VS = VectorSlice type elem = PIO.elem type vector = PIO.vector type vector_slice = PIO.vector_slice type reader = PIO.reader type writer = PIO.writer type pos = PIO.pos fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} (*---------------*) (* outstream *) (*---------------*) datatype buf = Buf of {array: A.array, size: int ref} datatype bufferMode = NO_BUF | LINE_BUF of buf | BLOCK_BUF of buf fun newLineBuf bufSize = LINE_BUF (Buf {size = ref 0, array = A.array (bufSize, someElem)}) fun newBlockBuf bufSize = BLOCK_BUF (Buf {size = ref 0, array = A.array (bufSize, someElem)}) datatype state = Active | Terminated | Closed fun active state = case state of Active => true | _ => false fun terminated state = not (active state) fun closed state = case state of Closed => true | _ => false datatype outstream = Out of {writer: writer, augmented_writer: writer, state: state ref, bufferMode: bufferMode ref} fun equalsOut (Out {state = state1, ...}, Out {state = state2, ...}) = state1 = state2 fun outstreamSel (Out v, sel) = sel v fun outstreamWriter os = outstreamSel (os, #writer) fun writerSel (PIO.WR v, sel) = sel v fun outstreamName os = writerSel (outstreamWriter os, #name) local fun flushGen (write: 'a -> int, base: 'a -> ('b * int * int), slice: ('b * int * int option) -> 'a, a: 'a) = let val (b, i, sz) = base a val max = i + sz fun loop i = if i = max then () else let val j = write (slice (b, i, SOME (max - i))) in if j = 0 then raise (Fail "partial write") else loop (i + j) end in loop i end in fun flushVec (writer, x) = case writerSel (writer, #writeVec) of NONE => raise IO.BlockingNotSupported | SOME writeVec => flushGen (writeVec, VS.base, VS.slice, x) fun flushArr (writer, x) = case writerSel (writer, #writeArr) of NONE => raise IO.BlockingNotSupported | SOME writeArr => flushGen (writeArr, AS.base, AS.slice, x) end fun flushBuf' (writer, size, array) = let val size' = !size in size := 0 ; flushArr (writer, AS.slice (array, 0, SOME size')) end fun flushBuf (writer, Buf {size, array}) = flushBuf' (writer, size, array) fun output (os as Out {augmented_writer, state, bufferMode, ...}, v) = if terminated (!state) then liftExn (outstreamName os) "output" IO.ClosedStream else let fun put () = flushVec (augmented_writer, VS.full v) fun doit (buf as Buf {size, array}, maybe) = let val curSize = !size val newSize = curSize + V.length v in if newSize >= A.length array orelse maybe () then (flushBuf (augmented_writer, buf); put ()) else (A.copyVec {src = v, dst = array, di = curSize}; size := newSize) end in case !bufferMode of NO_BUF => put () | LINE_BUF buf => doit (buf, fn () => (case line of NONE => false | SOME {isLine, lineElem} => V.exists isLine v)) | BLOCK_BUF buf => doit (buf, fn () => false) end handle exn => liftExn (outstreamName os) "output" exn fun ensureActive (os as Out {state, ...}) = if active (!state) then () else liftExn (outstreamName os) "output" IO.ClosedStream local val buf1 = A.array (1, someElem) fun flush (os, size, array) = let val Out {augmented_writer, ...} = os in flushBuf' (augmented_writer, size, array) handle exn => liftExn (outstreamName os) "output1" exn end in (* output1 is implemented very carefully to make it fast. Think hard * before modifying it, and test after you do, to make sure that it * hasn't been slowed down. *) fun output1 (os as Out {bufferMode, ...}, c): unit = case !bufferMode of BLOCK_BUF (Buf {array, size}) => let val n = !size in (* Use the bounds check for the update to make sure there * is space to put the character in the array. *) (A.update (array, n, c) ; size := 1 + n) handle Subscript => let val _ = ensureActive os val _ = flush (os, size, array) val _ = A.update (array, 0, c) val _ = size := 1 in () end end | LINE_BUF (Buf {array, size}) => let val n = !size val _ = (* Use the bounds check for the update to make sure there * is space to put the character in the array. *) (A.update (array, n, c) ; size := 1 + n) handle Subscript => let val _ = ensureActive os val _ = flush (os, size, array) val _ = A.update (array, 0, c) val _ = size := 1 in () end in case line of NONE => () | SOME {isLine, lineElem} => if isLine c then flush (os, size, array) else () end | NO_BUF => let val _ = ensureActive os val _ = A.update (buf1, 0, c) val Out {augmented_writer, ...} = os in flushArr (augmented_writer, AS.slice (buf1, 0, SOME 1)) end end fun outputSlice (os as Out {augmented_writer, state, bufferMode, ...}, v) = if terminated (!state) then liftExn (outstreamName os) "output" IO.ClosedStream else let fun put () = flushVec (augmented_writer, v) fun doit (buf as Buf {size, array}, maybe) = let val curSize = !size val newSize = curSize + VS.length v in if newSize >= A.length array orelse maybe () then (flushBuf (augmented_writer, buf); put ()) else (AS.copyVec {src = v, dst = array, di = curSize}; size := newSize) end in case !bufferMode of NO_BUF => put () | LINE_BUF buf => doit (buf, fn () => (case line of NONE => false | SOME {isLine, lineElem} => VS.exists isLine v)) | BLOCK_BUF buf => doit (buf, fn () => false) end handle exn => liftExn (outstreamName os) "output" exn fun flushOut (os as Out {augmented_writer, state, bufferMode, ...}) = if terminated (!state) then () else case !bufferMode of NO_BUF => () | LINE_BUF buf => flushBuf (augmented_writer, buf) | BLOCK_BUF buf => flushBuf (augmented_writer, buf) handle exn => liftExn (outstreamName os) "flushOut" exn fun makeTerminated (Out {bufferMode, ...}) = let fun doit (Buf {array, size}) = size := A.length array in case !bufferMode of BLOCK_BUF b => doit b | LINE_BUF b => doit b | NO_BUF => () end fun closeOut (os as Out {state, ...}) = if closed (!state) then () else (flushOut os; if terminated (!state) then () else (writerSel (outstreamWriter os, #close)) (); state := Closed ; makeTerminated os) handle exn => liftExn (outstreamName os) "closeOut" exn fun getBufferMode (Out {bufferMode, ...}) = case !bufferMode of NO_BUF => IO.NO_BUF | LINE_BUF _ => IO.LINE_BUF | BLOCK_BUF _ => IO.BLOCK_BUF fun setBufferMode (os as Out {bufferMode, ...}, mode) = case mode of IO.NO_BUF => (flushOut os; bufferMode := NO_BUF) | IO.LINE_BUF => let fun doit () = bufferMode := newLineBuf (writerSel (outstreamWriter os, #chunkSize)) in case !bufferMode of NO_BUF => doit () | LINE_BUF _ => () | BLOCK_BUF _ => doit () end | IO.BLOCK_BUF => let fun doit () = bufferMode := newBlockBuf (writerSel (outstreamWriter os, #chunkSize)) in case !bufferMode of NO_BUF => doit () | LINE_BUF _ => doit () | BLOCK_BUF _ => () end fun mkOutstream' {writer, closed, bufferMode} = let val bufSize = writerSel (writer, #chunkSize) in Out {writer = writer, augmented_writer = PIO.augmentWriter writer, state = ref (if closed then Closed else Active), bufferMode = ref (case bufferMode of IO.NO_BUF => NO_BUF | IO.LINE_BUF => newLineBuf bufSize | IO.BLOCK_BUF => newBlockBuf bufSize)} end fun mkOutstream (writer, bufferMode) = mkOutstream' {writer = writer, closed = false, bufferMode = bufferMode} fun getWriter (os as Out {writer, state, bufferMode, ...}) = if closed (!state) then liftExn (outstreamName os) "getWriter" IO.ClosedStream else (flushOut os ; state := Terminated ; makeTerminated os ; (writer, case !bufferMode of NO_BUF => IO.NO_BUF | LINE_BUF _ => IO.LINE_BUF | BLOCK_BUF _ => IO.BLOCK_BUF)) datatype out_pos = OutPos of {pos: pos, outstream: outstream} fun getPosOut (os as Out {...}) = (flushOut os; case writerSel (outstreamSel (os, #writer), #getPos) of NONE => liftExn (outstreamName os) "getPosOut" IO.RandomAccessNotSupported | SOME getPos => OutPos {pos = getPos (), outstream = os}) fun setPosOut (OutPos {pos, outstream = os}) = (flushOut os; case writerSel (outstreamSel (os, #writer), #setPos) of NONE => liftExn (outstreamName os) "setPosOut" IO.RandomAccessNotSupported | SOME setPos => setPos pos; os) fun filePosOut (OutPos {pos, ...}) = pos (*---------------*) (* instream *) (*---------------*) datatype state = Link of {buf: buf} | Eos of {buf: buf} (* V.length inp = 0 *) | End | Truncated | Closed and buf = Buf of {inp: V.vector, base: pos option, next: state ref} datatype instream = In of {common: {reader: reader, augmented_reader: reader, tail: state ref ref}, pos: int, buf: buf} (* @ s = Eos, End, Truncated, Closed ==> * pos = V.length inp, !next = s *) fun equalsIn (In {common = {tail = tail1, ...}, ...}, In {common = {tail = tail2, ...}, ...}) = tail1 = tail2 fun update (In {common, ...}, pos, buf) = In {common = common, pos = pos, buf = buf} fun updatePos (is as In {buf, ...}, pos) = update (is, pos, buf) fun updateBufBeg (is, buf) = update (is, 0, buf) fun updateBufEnd (is, buf as Buf {inp, ...}) = update (is, V.length inp, buf) fun instreamSel (In v, sel) = sel v fun instreamCommon is = instreamSel (is, #common) fun instreamCommonSel (is, sel) = sel (instreamCommon is) fun instreamReader is = instreamCommonSel (is, #reader) fun instreamTail is = instreamCommonSel (is, #tail) fun readerSel (PIO.RD v, sel) = sel v fun instreamName is = readerSel (instreamReader is, #name) val empty = V.tabulate (0, fn _ => someElem) fun extend function (is as In {common = {augmented_reader, tail, ...}, ...}) blocking = case !(!tail) of End => let fun link (base, inp) = let val next = ref End val buf = Buf {inp = inp, base = base, next = next} val this = if V.length inp = 0 then Eos {buf = buf} else Link {buf = buf} val _ = !tail := this val _ = tail := next in SOME this end fun doit readVec = let val base = case readerSel (augmented_reader, #getPos) of NONE => NONE | SOME getPos => SOME (getPos ()) val inp = readVec (readerSel (augmented_reader, #chunkSize)) handle exn => liftExn (instreamName is) function exn in case inp of NONE => NONE | SOME inp => link (base, inp) end in if blocking then case readerSel (augmented_reader, #readVec) of NONE => liftExn (instreamName is) function IO.BlockingNotSupported | SOME readVec => doit (SOME o readVec) else case readerSel (augmented_reader, #readVecNB) of NONE => liftExn (instreamName is) function IO.NonblockingNotSupported | SOME readVecNB => doit readVecNB end | _ => liftExn (instreamName is) function Match fun extendB function is = valOf (extend function is true) fun extendNB function is = extend function is false fun input (is as In {pos, buf as Buf {inp, next, ...}, ...}) = if pos < V.length inp then (V.extract(inp, pos, NONE), updateBufEnd (is, buf)) else let fun doit next = case next of Link {buf as Buf {inp, ...}} => (inp, updateBufEnd (is, buf)) | Eos {buf} => (empty, updateBufBeg (is, buf)) | End => doit (extendB "input" is) | _ => (empty, is) in doit (!next) end fun inputN (is, n) = if n < 0 orelse n > V.maxLen then raise Size else let fun first (is as In {pos, buf as Buf {inp, ...}, ...}, n) = if pos + n <= V.length inp then let val inp' = V.extract(inp, pos, SOME n) in (inp', updatePos (is, pos + n)) end else let val inp' = VS.slice(inp, pos, NONE) in loop (buf, [inp'], n - (V.length inp - pos)) end and loop (buf' as Buf {next, ...}, inps, n) = let fun doit next = case next of Link {buf as Buf {inp, ...}} => if n <= V.length inp then let val inp' = VS.slice(inp, 0, SOME n) val inps = inp'::inps in finish (inps, update (is, n, buf)) end else loop (buf, (VS.full inp)::inps, n - V.length inp) | Eos {buf} => finish (inps, if n > 0 then updateBufBeg (is, buf) else updateBufEnd (is, buf')) | End => doit (extendB "inputN" is) | _ => finish (inps, updateBufEnd (is, buf')) in doit (!next) end and finish (inps, is) = let val inp = VS.concat (List.rev inps) in (inp, is) end in first (is, n) end (* input1' will move past a temporary end of stream *) fun input1' (is as In {pos, buf = Buf {inp, next, ...}, ...}) = case SOME (V.sub (inp, pos)) handle Subscript => NONE of NONE => let fun doit next = case next of Link {buf} => input1' (updateBufBeg (is, buf)) | Eos {buf} => (NONE, updateBufBeg (is, buf)) | End => doit (extendB "input1" is) | _ => (NONE, is) in doit (!next) end | SOME e => let val is' = updatePos (is, pos + 1) in (SOME e, is') end (* input1 will never move past a temporary end of stream *) fun input1 is = case input1' is of (SOME c, is') => SOME (c, is') | _ => NONE fun inputAll is = let fun loop (is, ac) = let val (inp, is') = input is in if V.length inp = 0 then (V.concat (List.rev ac), is') else loop (is', inp::ac) end in loop (is, []) end val inputLine = case line of NONE => (fn is => SOME (input is)) | SOME {isLine, lineElem} => let val lineVecSl = VS.full (V.tabulate (1, fn _ => lineElem)) in fn is => let fun findLine (v, i) = let fun loop i = case SOME (V.sub (v, i)) handle Subscript => NONE of NONE => NONE | SOME c => if isLine c then SOME (i + 1) else loop (i + 1) in loop i end fun first (is as In {pos, buf as Buf {inp, next, ...}, ...}) = (case findLine (inp, pos) of SOME i => let val inp' = V.extract(inp, pos, SOME (i - pos)) in SOME (inp', updatePos (is, i)) end | NONE => if pos < V.length inp then let val inp' = VS.slice(inp, pos, NONE) in loop (buf, [inp']) end else let fun doit next = case next of Link {buf} => first (updateBufBeg (is, buf)) | Eos _ => NONE | End => doit (extendB "inputLine" is) | _ => NONE in doit (!next) end) and loop (buf' as Buf {next, ...}, inps) = (* List.length inps > 0 *) let fun doit next = case next of Link {buf as Buf {inp, ...}} => (case findLine (inp, 0) of SOME i => let val inp' = VS.slice(inp, 0, SOME i) val inps = inp'::inps in finish (inps, update (is, i, buf), false) end | NONE => loop (buf, (VS.full inp)::inps)) | End => doit (extendB "inputLine" is) | _ => finish (inps, updateBufEnd (is, buf'), true) in doit (!next) end and finish (inps, is, trail) = let val inps = if trail then lineVecSl::inps else inps val inp = VS.concat (List.rev inps) in SOME (inp, is) end in first is end end fun canInput (is as In {pos, buf = Buf {inp, next, ...}, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else if n = 0 then SOME 0 else let fun start inp = add ([], inp, 0) and add (inps, inp, k) = let val l = V.length inp val inps = inp::inps in if k + l > n then finish (inps, n) else loop (inps, k + l) end and loop (inps, k) = case extendNB "canInput" is of NONE => finish (inps, k) | SOME (Link {buf = Buf {inp, ...}}) => add (inps, inp, k) | SOME (Eos _) => finish (inps, k) | _ => raise Fail "extendNB bug" and finish (inps, k) = let val inp = V.concat (List.rev inps) in (inp, k) end in if pos < V.length inp then SOME (Int.min (V.length inp - pos, n)) else case !next of End => (case extendNB "canInput" is of NONE => NONE | SOME (Link {buf = Buf {inp, base, ...}}) => let val (inp, k) = start inp val buf = Buf {inp = inp, base = base, next = ref End} in next := Link {buf = buf}; SOME k end | SOME (Eos _) => SOME 0 | _ => raise Fail "extendNB bug") | _ => SOME 0 end structure Close = struct datatype t = T of {close: unit -> unit, name: string, tail: state ref ref} fun close (T {close, name, tail}) = case !(!tail) of End => (!tail := Closed ; close () handle exn => liftExn name "closeIn" exn) | _ => () fun equalsInstream (T {tail, ...}, is) = tail = instreamTail is fun make (In {common = {reader = PIO.RD {close, name, ...}, tail, ...}, ...}): t = T {close = close, name = name, tail = tail} end val closeIn = Close.close o Close.make fun endOfStream is = let val (inp, _) = input is in V.length inp = 0 end fun mkInstream' {bufferContents, closed, reader} = let val next = ref (if closed then Closed else End) val base = case readerSel (reader, #getPos) of NONE => NONE | SOME getPos => SOME (getPos ()) val buf = case bufferContents of NONE => Buf {inp = empty, base = base, next = next} | SOME (lastRead, v) => if V.length v = 0 then Buf {inp = empty, base = base, next = ref (Eos {buf = Buf {inp = empty, base = base, next = next}})} else case (lastRead, base, xlatePos) of (true, SOME b, SOME {fromInt, toInt}) => let val b = fromInt (Position.- (toInt b, Position.fromInt (V.length v))) in Buf {inp = v, base = SOME b, next = next} end | _ => Buf {inp = v, base = NONE, next = next} in In {common = {reader = reader, augmented_reader = PIO.augmentReader reader, tail = ref next}, pos = 0, buf = buf} end fun mkInstream (reader, bufferContents) = mkInstream' {bufferContents = if 0 = V.length bufferContents then NONE else SOME (false, bufferContents), closed = false, reader = reader} fun getReader (is as In {common = {reader, tail, ...}, ...}) = case !(!tail) of End => (!tail := Truncated; let val (inp, _) = inputAll is in (reader, inp) end) | _ => liftExn (instreamName is) "getReader" IO.ClosedStream fun filePosIn (is as In {common = {augmented_reader, ...}, pos, buf = Buf {base, ...}, ...}) = case base of SOME b => (case xlatePos of SOME {fromInt, toInt} => (fromInt (Position.+ (Position.fromInt pos, toInt b))) | NONE => (case (readerSel (augmented_reader, #readVec), readerSel (augmented_reader, #getPos), readerSel (augmented_reader, #setPos)) of (SOME readVec, SOME getPos, SOME setPos) => let val curPos = getPos () in setPos b ; ignore (readVec pos) ; getPos () before setPos curPos end | _ => liftExn (instreamName is) "filePosIn" IO.RandomAccessNotSupported)) | NONE => liftExn (instreamName is) "filePosIn" IO.RandomAccessNotSupported end signature STREAM_IO_ARG = sig structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE sharing type PrimIO.elem = Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.array_slice = ArraySlice.slice val someElem: PrimIO.elem end functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIOExtra (open S val line = NONE val xlatePos = NONE) signature STREAM_IO_EXTRA_FILE_ARG = STREAM_IO_EXTRA_ARG functor StreamIOExtraFile (S: STREAM_IO_EXTRA_FILE_ARG): STREAM_IO_EXTRA_FILE = struct open S structure PIO = PrimIO structure V = Vector structure StreamIO = StreamIOExtra (S) open StreamIO fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} (*---------------*) (* outstream *) (*---------------*) fun writerSel (PIO.WR v, sel) = sel v fun outstreamName os = writerSel (outstreamWriter os, #name) fun outFd os = case writerSel (outstreamWriter os, #ioDesc) of SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) | NONE => liftExn (outstreamName os) "outFd" (Fail "") val openOutstreams : (outstream * {close: bool}) list ref = ref [] val mkOutstream'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app (fn (os, {close}) => if close then closeOut os else flushOut os) (!openOutstreams)) in fn {bufferMode, closeAtExit, closed, writer} => let val os = mkOutstream' {bufferMode = bufferMode, closed = closed, writer = writer} val _ = if closed then () else openOutstreams := ((os, {close = closeAtExit}) :: (!openOutstreams)) in os end end fun mkOutstream' {bufferMode, closed, writer} = mkOutstream'' {bufferMode = bufferMode, closeAtExit = true, closed = closed, writer = writer} fun mkOutstream (writer, bufferMode) = mkOutstream' {bufferMode = bufferMode, closed = false, writer = writer} val closeOut = fn os => let val _ = openOutstreams := List.filter (fn (os', _) => not (equalsOut (os, os'))) (!openOutstreams) in closeOut os end (*---------------*) (* instream *) (*---------------*) fun readerSel (PIO.RD v, sel) = sel v fun instreamName is = readerSel (instreamReader is, #name) fun inFd is = case readerSel (instreamReader is, #ioDesc) of SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) | NONE => liftExn (instreamName is) "inFd" (Fail "") val closeAtExits: Close.t list ref = ref [] val mkInstream'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app Close.close (!closeAtExits)) in fn {bufferContents, closeAtExit, closed, reader} => let val is = mkInstream' {bufferContents = bufferContents, closed = closed, reader = reader} val _ = if closed orelse not closeAtExit then () else closeAtExits := Close.make is :: (!closeAtExits) in is end end fun mkInstream' {bufferContents, closed, reader} = mkInstream'' {bufferContents = bufferContents, closeAtExit = true, closed = closed, reader = reader} fun mkInstream (reader, bufferContents) = mkInstream' {bufferContents = (if V.length bufferContents = 0 then NONE else SOME (false, bufferContents)), closed = false, reader = reader} val closeIn = fn is => let val _ = closeAtExits := List.filter (fn c => Close.equalsInstream (c, is)) (!closeAtExits) in closeIn is end end mlton-20210117+dfsg/basis-library/io/stream-io.sig000066400000000000000000000051701416264345000216070ustar00rootroot00000000000000signature STREAM_IO = sig type elem type instream type out_pos type outstream type pos type reader type vector type writer val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val filePosIn: instream -> pos val filePosOut: out_pos -> pos val flushOut: outstream -> unit val getBufferMode: outstream -> IO.buffer_mode val getPosOut: outstream -> out_pos val getReader: instream -> reader * vector val getWriter: outstream -> writer * IO.buffer_mode val input1: instream -> (elem * instream) option val input: instream -> vector * instream val inputAll: instream -> vector * instream val inputN: instream * int -> vector * instream val mkInstream: reader * vector -> instream val mkOutstream: writer * IO.buffer_mode -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setBufferMode: outstream * IO.buffer_mode -> unit val setPosOut: out_pos -> outstream end signature STREAM_IO_EXTRA = sig include STREAM_IO type vector_slice structure Close: sig type t val close: t -> unit val equalsInstream: t * instream -> bool val make: instream -> t end val equalsIn: instream * instream -> bool val equalsOut: outstream * outstream -> bool val input1': instream -> elem option * instream val inputLine: instream -> (vector * instream) option val instreamReader: instream -> reader val mkInstream': {bufferContents: (bool * vector) option, closed: bool, reader: reader} -> instream val mkOutstream': {bufferMode: IO.buffer_mode, closed: bool, writer: writer} -> outstream val outputSlice: outstream * vector_slice -> unit val outstreamWriter: outstream -> writer end signature STREAM_IO_EXTRA_FILE = sig include STREAM_IO_EXTRA val inFd: instream -> Posix.IO.file_desc val mkInstream'': {bufferContents: (bool * vector) option, closeAtExit: bool, closed: bool, reader: reader} -> instream val outFd: outstream -> Posix.IO.file_desc val mkOutstream'': {bufferMode: IO.buffer_mode, closeAtExit: bool, closed: bool, writer: writer} -> outstream end mlton-20210117+dfsg/basis-library/io/text-io.sig000066400000000000000000000044511416264345000213010ustar00rootroot00000000000000signature TEXT_IO_GLOBAL = sig val print: string -> unit end signature TEXT_IO = sig include TEXT_IO_GLOBAL structure StreamIO: TEXT_STREAM_IO (* where type elem = Char.char *) (* redundant *) where type pos = TextPrimIO.pos where type reader = TextPrimIO.reader (* where type vector = CharVector.vector *) (* redundant *) where type writer = TextPrimIO.writer type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> string option val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val openString: string -> instream val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSubstr: outstream * substring -> unit val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: (instream * StreamIO.instream) -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit val stdErr: outstream val stdIn: instream val stdOut: outstream end signature TEXT_IO_EXTRA = sig include TEXT_IO val equalsIn: instream * instream -> bool val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end mlton-20210117+dfsg/basis-library/io/text-io.sml000066400000000000000000000026011416264345000213050ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure TextIO: TEXT_IO_EXTRA = struct structure IO = ImperativeIOExtra (structure Array = CharArray structure ArraySlice = CharArraySlice structure PrimIO = TextPrimIO structure Vector = CharVector structure VectorSlice = CharVectorSlice val chunkSize = Int32.toInt (Primitive.Controls.bufSize) val fileTypeFlags = [PrimitiveFFI.Posix.FileSys.O.TEXT] val line = SOME {isLine = fn c => c = #"\n", lineElem = #"\n"} val mkReader = Posix.IO.mkTextReader val mkWriter = Posix.IO.mkTextWriter val someElem = (#"\000": Char.char) val xlatePos = SOME {fromInt = fn i => i, toInt = fn i => i}) open IO structure StreamIO = struct open StreamIO fun outputSubstr (s, ss) = outputSlice (s, ss) end val outputSubstr = outputSlice val openString = openVector fun print (s: string) = (output (stdOut, s); flushOut stdOut) end structure TextIOGlobal: TEXT_IO_GLOBAL = TextIO open TextIOGlobal mlton-20210117+dfsg/basis-library/io/text-prim-io.sml000066400000000000000000000013021416264345000222470ustar00rootroot00000000000000(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure TextPrimIO : PRIM_IO where type array = CharArray.array where type vector = CharVector.vector where type elem = Char.char = PrimIO (structure Vector = CharVector structure VectorSlice = CharVectorSlice structure Array = CharArray structure ArraySlice = CharArraySlice type pos = Position.int val compare = Position.compare val someElem = #"\000": Char.char) mlton-20210117+dfsg/basis-library/io/text-stream-io.sig000066400000000000000000000004111416264345000225620ustar00rootroot00000000000000signature TEXT_STREAM_IO = sig include STREAM_IO where type elem = Char.char where type vector = CharVector.vector val inputLine: instream -> (string * instream) option val outputSubstr: outstream * substring -> unit end mlton-20210117+dfsg/basis-library/libs/000077500000000000000000000000001416264345000175225ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/all.mlb000066400000000000000000000005751416264345000207750ustar00rootroot00000000000000(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../basis.mlb ../pervasive.mlb ../basis-2002.mlb ../basis-1997.mlb ../basis-none.mlb ../mlton.mlb ../sml-nj.mlb ../unsafe.mlb ../c-types.mlb in end mlton-20210117+dfsg/basis-library/libs/basis-1997/000077500000000000000000000000001416264345000212325ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/000077500000000000000000000000001416264345000247565ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/array.sig000066400000000000000000000022241416264345000266000ustar00rootroot00000000000000signature ARRAY_1997 = sig eqtype 'a array type 'a vector val app: ('a -> unit) -> 'a array -> unit val appi: (int * 'a -> unit) -> 'a array * int * int option -> unit val array: int * 'a -> 'a array val copy: {src: 'a array, si: int, len: int option, dst: 'a array, di: int} -> unit val copyVec: {src: 'a vector, si: int, len: int option, dst: 'a array, di: int} -> unit val extract: 'a array * int * int option -> 'a vector val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array * int * int option -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array * int * int option -> 'b val fromList: 'a list -> 'a array val length: 'a array -> int val maxLen: int val modify: ('a -> 'a) -> 'a array -> unit val modifyi: (int * 'a -> 'a) -> 'a array * int * int option -> unit val sub: 'a array * int -> 'a val tabulate: int * (int -> 'a) -> 'a array val update: 'a array * int * 'a -> unit end mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/mono-array.sig000066400000000000000000000022661416264345000275540ustar00rootroot00000000000000signature MONO_ARRAY_1997 = sig eqtype array type elem structure Vector: MONO_VECTOR_1997 val maxLen: int val array: (int * elem) -> array val fromList: elem list -> array val tabulate: (int * (int -> elem)) -> array val length: array -> int val sub: (array * int) -> elem val update: (array * int * elem) -> unit val extract: (array * int * int option) -> Vector.vector val copy: {src: array, si: int, len: int option, dst: array, di: int} -> unit val copyVec: {src: Vector.vector, si: int, len: int option, dst: array, di: int} -> unit val appi: ((int * elem) -> unit) -> (array * int * int option) -> unit val app: (elem -> unit) -> array -> unit val foldli: ((int * elem * 'b) -> 'b) -> 'b -> (array * int * int option) -> 'b val foldri: ((int * elem * 'b) -> 'b) -> 'b -> (array * int * int option) -> 'b val foldl: ((elem * 'b) -> 'b) -> 'b -> array -> 'b val foldr: ((elem * 'b) -> 'b) -> 'b -> array -> 'b val modifyi: ((int * elem) -> elem) -> (array * int * int option) -> unit val modify: (elem -> elem) -> array -> unit end mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/mono-array2.sig000066400000000000000000000024521416264345000276330ustar00rootroot00000000000000signature MONO_ARRAY2_1997 = sig eqtype array type elem type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = datatype Array2.traversal structure Vector: MONO_VECTOR_1997 val array: (int * int * elem) -> array val fromList: elem list list -> array val tabulate: traversal -> (int * int * ((int * int) -> elem)) -> array val sub: (array * int * int) -> elem val update: (array * int * int * elem) -> unit val dimensions: array -> (int * int) val nCols: array -> int val nRows: array -> int val row: (array * int) -> Vector.vector val column: (array * int) -> Vector.vector val copy: {src: region, dst: array, dst_row: int, dst_col: int} -> unit val appi: Array2.traversal -> ((int * int * elem) -> unit) -> region -> unit val app: Array2.traversal -> (elem -> unit) -> array -> unit val modifyi: Array2.traversal -> ((int * int * elem) -> elem) -> region -> unit val modify: Array2.traversal -> (elem -> elem) -> array -> unit val foldi: Array2.traversal -> ((int * int * elem * 'b) -> 'b) -> 'b -> region -> 'b val fold: Array2.traversal -> ((elem * 'b) -> 'b) -> 'b -> array -> 'b end mono-vector-array-array2-convert.fun000066400000000000000000000053561416264345000336620ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MonoVectorArrayArray2Convert (structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure Array2: MONO_ARRAY2 sharing type Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem = Array2.elem sharing type Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector = Array2.vector sharing type VectorSlice.slice = ArraySlice.vector_slice sharing type Array.array = ArraySlice.array) : sig structure Vector: MONO_VECTOR_1997 structure Array: MONO_ARRAY_1997 structure Array2: MONO_ARRAY2_1997 sharing type Vector.elem = Array.elem = Array2.elem sharing type Vector.vector = Array.Vector.vector = Array2.Vector.vector end = struct fun shift1 f (_, s, _) = fn (i:int, x) => f (i + s, x) fun shift2 f (_, s, _) = fn (i:int, x, y) => f (i + s, x, y) structure V = struct open Vector fun extract sl = VectorSlice.vector (VectorSlice.slice sl) fun mapi f sl = VectorSlice.mapi (shift1 f sl) (VectorSlice.slice sl) fun appi f sl = VectorSlice.appi (shift1 f sl) (VectorSlice.slice sl) fun foldli f b sl = VectorSlice.foldli (shift2 f sl) b (VectorSlice.slice sl) fun foldri f b sl = VectorSlice.foldri (shift2 f sl) b (VectorSlice.slice sl) end structure A = struct open Array structure Vector = V fun appi f sl = ArraySlice.appi (shift1 f sl) (ArraySlice.slice sl) fun copy {src, si, len, dst, di} = ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun copyVec {src, si, len, dst, di} = ArraySlice.copyVec {src = VectorSlice.slice (src, si, len), dst = dst, di = di} fun extract sl = ArraySlice.vector (ArraySlice.slice sl) fun foldli f b sl = ArraySlice.foldli (shift2 f sl) b (ArraySlice.slice sl) fun foldri f b sl = ArraySlice.foldri (shift2 f sl) b (ArraySlice.slice sl) fun modifyi f sl = ArraySlice.modifyi (shift1 f sl) (ArraySlice.slice sl) end structure A2 = struct open Array2 structure Vector = V end structure Array = A structure Vector = V structure Array2 = A2 end mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/mono-vector.sig000066400000000000000000000016131416264345000277330ustar00rootroot00000000000000signature MONO_VECTOR_1997 = sig type vector type elem val maxLen: int val fromList: elem list -> vector val tabulate: (int * (int -> elem)) -> vector val length: vector -> int val sub: (vector * int) -> elem val extract: (vector * int * int option) -> vector val concat: vector list -> vector val mapi: ((int * elem) -> elem) -> (vector * int * int option) -> vector val map: (elem -> elem) -> vector -> vector val appi: ((int * elem) -> unit) -> (vector * int * int option) -> unit val app: (elem -> unit) -> vector -> unit val foldli: ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldri: ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldl: ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldr: ((elem * 'a) -> 'a) -> 'a -> vector -> 'a end mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/vector-array-convert.fun000066400000000000000000000040741416264345000315710ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor VectorArrayConvert (structure Vector: VECTOR structure VectorSlice: VECTOR_SLICE where type 'a slice = 'a VectorSlice.slice structure Array: ARRAY structure ArraySlice: ARRAY_SLICE where type 'a slice = 'a ArraySlice.slice) : sig structure Vector: VECTOR_1997 structure Array: ARRAY_1997 end = struct fun shift1 f (_, s, _) = fn (i:int, x) => f (i + s, x) fun shift2 f (_, s, _) = fn (i:int, x, y) => f (i + s, x, y) structure V = struct open Vector fun extract sl = VectorSlice.vector (VectorSlice.slice sl) fun mapi f sl = VectorSlice.mapi (shift1 f sl) (VectorSlice.slice sl) fun appi f sl = VectorSlice.appi (shift1 f sl) (VectorSlice.slice sl) fun foldli f b sl = VectorSlice.foldli (shift2 f sl) b (VectorSlice.slice sl) fun foldri f b sl = VectorSlice.foldri (shift2 f sl) b (VectorSlice.slice sl) end structure A = struct open Array fun appi f sl = ArraySlice.appi (shift1 f sl) (ArraySlice.slice sl) fun copy {src, si, len, dst, di} = ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun copyVec {src, si, len, dst, di} = ArraySlice.copyVec {src = VectorSlice.slice (src, si, len), dst = dst, di = di} fun extract sl = ArraySlice.vector (ArraySlice.slice sl) fun foldli f b sl = ArraySlice.foldli (shift2 f sl) b (ArraySlice.slice sl) fun foldri f b sl = ArraySlice.foldri (shift2 f sl) b (ArraySlice.slice sl) fun modifyi f sl = ArraySlice.modifyi (shift1 f sl) (ArraySlice.slice sl) end structure Vector = V structure Array = A end mlton-20210117+dfsg/basis-library/libs/basis-1997/arrays-and-vectors/vector.sig000066400000000000000000000016041416264345000267650ustar00rootroot00000000000000signature VECTOR_1997 = sig eqtype 'a vector val maxLen: int val fromList: 'a list -> 'a vector val tabulate: (int * (int -> 'a)) -> 'a vector val length: 'a vector -> int val sub: ('a vector * int) -> 'a val extract: ('a vector * int * int option) -> 'a vector val concat: 'a vector list -> 'a vector val mapi: ((int * 'a) -> 'b) -> ('a vector * int * int option) -> 'b vector val map: ('a -> 'b) -> 'a vector -> 'b vector val appi: ((int * 'a) -> unit) -> ('a vector * int * int option) -> unit val app: ('a -> unit) -> 'a vector -> unit val foldli: ((int * 'a * 'b) -> 'b) -> 'b -> ('a vector * int * int option) -> 'b val foldri: ((int * 'a * 'b) -> 'b) -> 'b -> ('a vector * int * int option) -> 'b val foldl: (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldr: (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b end mlton-20210117+dfsg/basis-library/libs/basis-1997/basis-1997.mlb000066400000000000000000000054201416264345000234370ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local ../basis-2002/basis-2002.mlb ../../basis-2002.mlb local ../basis-extra/basis-extra.mlb in signature SML90 structure SML90 end arrays-and-vectors/vector.sig arrays-and-vectors/array.sig arrays-and-vectors/vector-array-convert.fun arrays-and-vectors/mono-vector.sig arrays-and-vectors/mono-array.sig arrays-and-vectors/mono-array2.sig arrays-and-vectors/mono-vector-array-array2-convert.fun integer/word.sig text/string.sig text/substring.sig text/text-convert.fun real/IEEE-real.sig real/IEEE-real-convert.fun real/real.sig real/real-convert.fun posix/flags.sig posix/flags-convert.fun posix/process.sig posix/process-convert.fun posix/file-sys.sig posix/file-sys-convert.fun posix/io.sig posix/io-convert.fun posix/tty.sig posix/tty-convert.fun posix/posix.sig posix/posix-convert.fun system/timer.sig system/timer-convert.fun system/file-sys.sig system/file-sys-convert.fun system/path.sig system/path-convert.fun system/process.sig system/process-convert.fun system/os.sig system/os-convert.fun system/unix.sig system/unix-convert.fun io/io.sig io/io-convert.fun io/stream-io.sig io/text-stream-io.sig io/text-io.sig io/text-io-convert.fun io/bin-stream-io.sig io/bin-io.sig io/bin-io-convert.fun ann "allowSpecifySpecialIds true" in top-level/basis.sig end top-level/basis.sml in signature MONO_ARRAY_1997 signature MONO_VECTOR_1997 signature REAL_1997 signature STRING_1997 signature SUBSTRING_1997 signature WORD_1997 signature ARRAY_1997 signature IEEE_REAL_1997 signature IO_1997 signature OS_1997 signature OS_FILE_SYS_1997 signature OS_PATH_1997 signature OS_PROCESS_1997 signature SML90 signature TIMER_1997 signature VECTOR_1997 signature MONO_ARRAY2_1997 signature POSIX_FLAGS_1997 signature POSIX_1997 signature POSIX_PROCESS_1997 signature POSIX_FILE_SYS_1997 signature POSIX_IO_1997 signature POSIX_TTY_1997 signature UNIX_1997 structure Basis1997 end end mlton-20210117+dfsg/basis-library/libs/basis-1997/integer/000077500000000000000000000000001416264345000226675ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/integer/word.sig000066400000000000000000000026161416264345000243530ustar00rootroot00000000000000signature WORD_1997 = sig eqtype word val wordSize: int val toLargeWord: word -> LargeWord.word val toLargeWordX: word -> LargeWord.word val fromLargeWord: LargeWord.word -> word val toLargeInt: word -> LargeInt.int val toLargeIntX: word -> LargeInt.int val fromLargeInt: LargeInt.int -> word val toInt: word -> Int.int val toIntX: word -> Int.int val fromInt: Int.int -> word val orb: (word * word) -> word val xorb: (word * word) -> word val andb: (word * word) -> word val notb: word -> word val << : (word * Word.word) -> word val >> : (word * Word.word) -> word val ~>> : (word * Word.word) -> word val + : (word * word) -> word val - : (word * word) -> word val * : (word * word) -> word val div: (word * word) -> word val mod: (word * word) -> word val compare: (word * word) -> order val > : (word * word) -> bool val < : (word * word) -> bool val >= : (word * word) -> bool val <= : (word * word) -> bool val min: (word * word) -> word val max: (word * word) -> word val fmt: StringCvt.radix -> word -> string val toString: word -> string val fromString: string -> word option val scan: StringCvt.radix -> (char, 'a) StringCvt.reader -> (word, 'a) StringCvt.reader end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/000077500000000000000000000000001416264345000216415ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/io/bin-io-convert.fun000066400000000000000000000006561416264345000252150ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor BinIOConvert (structure BinIO: BIN_IO) : BIN_IO_1997 = struct open BinIO structure StreamIO = struct open StreamIO val inputAll = #1 o inputAll end end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/bin-io.sig000066400000000000000000000030431416264345000235220ustar00rootroot00000000000000signature BIN_IO_1997 = sig structure StreamIO: BIN_STREAM_IO_1997 type vector = StreamIO.vector type elem = StreamIO.elem type instream val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val getInstream: instream -> StreamIO.instream val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val openIn: string -> instream (* val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option *) val setInstream: (instream * StreamIO.instream) -> unit (* val getPosIn: instream -> StreamIO.in_pos val setPosIn: (instream * StreamIO.in_pos) -> unit *) type outstream val closeOut: outstream -> unit val flushOut: outstream -> unit val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setOutstream: outstream * StreamIO.outstream -> unit (* val setPosOut: outstream * StreamIO.out_pos -> unit *) end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/bin-stream-io.sig000066400000000000000000000002471416264345000250160ustar00rootroot00000000000000signature BIN_STREAM_IO_1997 = sig include STREAM_IO_1997 where type vector = Word8Vector.vector where type elem = Word8Vector.elem end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/io-convert.fun000066400000000000000000000005061416264345000244410ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor IOConvert (structure IO: IO) : IO_1997 = struct open IO exception TerminatedStream end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/io.sig000066400000000000000000000006021416264345000227520ustar00rootroot00000000000000signature IO_1997 = sig exception Io of {cause: exn, function: string, name: string} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception TerminatedStream exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/stream-io.sig000066400000000000000000000022501416264345000242440ustar00rootroot00000000000000signature STREAM_IO_1997 = sig type elem type vector (* type reader type writer *) type instream type outstream type out_pos type pos (* = int *) val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val filePosOut: out_pos -> pos val input1: instream -> (elem * instream) option val input: instream -> vector * instream val inputAll: instream -> vector val inputN: instream * int -> vector * instream (* val mkInstream: reader * vector -> instream (* need to update this *) val getReader: instream -> reader * vector val output: outstream * vector -> unit val output1: outstream * elem -> unit val flushOut: outstream -> unit val closeOut: outstream -> unit val setBufferMode: outstream * IO.buffer_mode -> unit val getBufferMode: outstream -> IO.buffer_mode val mkOutstream: writer * IO.buffer_mode -> outstream val getWriter: outstream -> writer * IO.buffer_mode val getPosOut: outstream -> out_pos val setPosOut: out_pos -> outstream *) end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/text-io-convert.fun000066400000000000000000000012731416264345000254250ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TextIOConvert (structure TextIO: TEXT_IO) : TEXT_IO_1997 = struct open TextIO fun inputLine ins = case TextIO.inputLine ins of NONE => "" | SOME s => s structure StreamIO = struct open StreamIO val inputAll = #1 o inputAll fun inputLine ins = case StreamIO.inputLine ins of NONE => ("", ins) | SOME (s, ins) => (s, ins) end end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/text-io.sig000066400000000000000000000034301416264345000237360ustar00rootroot00000000000000signature TEXT_IO_1997 = sig structure StreamIO: TEXT_STREAM_IO_1997 type vector = StreamIO.vector type elem = StreamIO.elem type instream val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val getInstream: instream -> StreamIO.instream val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> string val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val openIn: string -> instream val print: string -> unit val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: (instream * StreamIO.instream) -> unit val stdIn: instream (* val openString: string -> instream val getPosIn: instream -> StreamIO.in_pos val setPosIn: (instream * StreamIO.in_pos) -> unit *) type outstream val closeOut: outstream -> unit val flushOut: outstream -> unit val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSubstr: outstream * substring -> unit val setOutstream: outstream * StreamIO.outstream -> unit val stdErr: outstream val stdOut: outstream (* val setPosOut: outstream * StreamIO.out_pos -> unit *) end mlton-20210117+dfsg/basis-library/libs/basis-1997/io/text-stream-io.sig000066400000000000000000000004201416264345000252230ustar00rootroot00000000000000signature TEXT_STREAM_IO_1997 = sig include STREAM_IO_1997 where type vector = CharVector.vector where type elem = Char.char val inputLine: instream -> string * instream (* val outputSubstr: outstream * substring -> unit *) end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/000077500000000000000000000000001416264345000223745ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/file-sys-convert.fun000066400000000000000000000013311416264345000263150ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PosixFileSysConvert (structure FileSys: POSIX_FILE_SYS) : POSIX_FILE_SYS_1997 = struct open FileSys val readdir = fn d => case readdir d of NONE => "" | SOME s => s structure S = struct open S structure Flags = FlagsConvert(structure Flags = S) open Flags end structure O = struct open O structure Flags = FlagsConvert(structure Flags = O) open Flags end end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/file-sys.sig000066400000000000000000000072151416264345000246400ustar00rootroot00000000000000signature POSIX_FILE_SYS_1997 = sig eqtype uid eqtype gid eqtype file_desc val fdToWord: file_desc -> SysWord.word val wordToFD: SysWord.word -> file_desc (* identity functions *) val fdToIOD: file_desc -> OS.IO.iodesc val iodToFD: OS.IO.iodesc -> file_desc option type dirstream val opendir: string -> dirstream val readdir: dirstream -> string val rewinddir: dirstream -> unit val closedir: dirstream -> unit val chdir: string -> unit val getcwd: unit -> string val stdin: file_desc val stdout: file_desc val stderr: file_desc structure S: sig eqtype mode include POSIX_FLAGS_1997 where type flags = mode val irwxu: mode val irusr: mode val iwusr: mode val ixusr: mode val irwxg: mode val irgrp: mode val iwgrp: mode val ixgrp: mode val irwxo: mode val iroth: mode val iwoth: mode val ixoth: mode val isuid: mode val isgid: mode end structure O: sig include POSIX_FLAGS_1997 val append: flags val excl: flags val noctty: flags val nonblock: flags val sync: flags val trunc: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val openf: string * open_mode * O.flags -> file_desc val createf: string * open_mode * O.flags * S.mode -> file_desc val creat: string * S.mode -> file_desc val umask: S.mode -> S.mode val link: {old: string, new: string} -> unit val mkdir: string * S.mode -> unit val mkfifo: string * S.mode -> unit val unlink: string -> unit val rmdir: string -> unit val rename: {old: string, new: string} -> unit val symlink: {old: string, new: string} -> unit val readlink: string -> string eqtype dev val wordToDev: SysWord.word -> dev val devToWord: dev -> SysWord.word eqtype ino val wordToIno: SysWord.word -> ino val inoToWord: ino -> SysWord.word structure ST: sig type stat val isDir: stat -> bool val isChr: stat -> bool val isBlk: stat -> bool val isReg: stat -> bool val isFIFO: stat -> bool val isLink: stat -> bool val isSock: stat -> bool val mode: stat -> S.mode val ino: stat -> ino val dev: stat -> dev val nlink: stat -> int val uid: stat -> uid val gid: stat -> gid val size: stat -> Position.int val atime: stat -> Time.time val mtime: stat -> Time.time val ctime: stat -> Time.time end val stat: string -> ST.stat val lstat: string -> ST.stat val fstat: file_desc -> ST.stat datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val chmod: string * S.mode -> unit val fchmod: file_desc * S.mode -> unit val chown: string * uid * gid -> unit val fchown: file_desc * uid * gid -> unit val utime: string * {actime: Time.time, modtime: Time.time} option -> unit val ftruncate: file_desc * Position.int -> unit val pathconf: string * string -> SysWord.word option val fpathconf: file_desc * string -> SysWord.word option end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/flags-convert.fun000066400000000000000000000005711416264345000256630ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor FlagsConvert (structure Flags: BIT_FLAGS) : POSIX_FLAGS_1997 where type flags = Flags.flags = struct open Flags val wordTo = fromWord end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/flags.sig000066400000000000000000000004101416264345000241670ustar00rootroot00000000000000signature POSIX_FLAGS_1997 = sig eqtype flags val toWord: flags -> SysWord.word val wordTo: SysWord.word -> flags val flags: flags list -> flags val allSet: flags * flags -> bool val anySet: flags * flags -> bool end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/io-convert.fun000066400000000000000000000016051416264345000251750ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PosixIOConvert (structure IO: POSIX_IO): POSIX_IO_1997 = struct open IO structure FD = struct open FD structure Flags = FlagsConvert (structure Flags = FD) open Flags end structure O = struct open O structure Flags = FlagsConvert (structure Flags = O) open Flags end fun readArr (fd, {buf, i, sz}) = IO.readArr (fd, Word8ArraySlice.slice (buf, i, sz)) fun writeArr (fd, {buf, i, sz}) = IO.writeArr (fd, Word8ArraySlice.slice (buf, i, sz)) fun writeVec (fd, {buf, i, sz}) = IO.writeVec (fd, Word8VectorSlice.slice (buf, i, sz)) end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/io.sig000066400000000000000000000044741416264345000235200ustar00rootroot00000000000000signature POSIX_IO_1997 = sig eqtype file_desc eqtype pid val pipe: unit -> {infd: file_desc, outfd: file_desc} val dup: file_desc -> file_desc val dup2: {old: file_desc, new: file_desc} -> unit val close: file_desc -> unit val readVec: file_desc * int -> Word8Vector.vector val readArr: file_desc * {buf: Word8Array.array, i: int, sz: int option} -> int val writeVec: file_desc * {buf: Word8Vector.vector, i: int, sz: int option} -> int val writeArr: file_desc * {buf: Word8Array.array, i: int, sz: int option} -> int datatype whence = SEEK_SET | SEEK_CUR | SEEK_END structure FD: sig include POSIX_FLAGS_1997 val cloexec: flags end structure O: sig include POSIX_FLAGS_1997 val append: flags val nonblock: flags val sync: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val dupfd: {old: file_desc, base: file_desc} -> file_desc val getfd: file_desc -> FD.flags val setfd: file_desc * FD.flags -> unit val getfl: file_desc -> O.flags * open_mode val setfl: file_desc * O.flags -> unit val lseek: file_desc * Position.int * whence -> Position.int val fsync: file_desc -> unit datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock: sig type flock val flock: { ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option } -> flock val ltype: flock -> lock_type val whence: flock -> whence val start: flock -> Position.int val len: flock -> Position.int val pid: flock -> pid option end val getlk: file_desc * FLock.flock -> FLock.flock val setlk: file_desc * FLock.flock -> FLock.flock val setlkw: file_desc * FLock.flock -> FLock.flock end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/posix-convert.fun000066400000000000000000000010731416264345000257270ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PosixConvert (structure Posix : POSIX) : POSIX_1997 = struct open Posix structure Process = PosixProcessConvert(structure Process = Process) structure FileSys = PosixFileSysConvert(structure FileSys = FileSys) structure IO = PosixIOConvert(structure IO = IO) structure TTY = PosixTTYConvert(structure TTY = TTY) end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/posix.sig000066400000000000000000000005061416264345000242430ustar00rootroot00000000000000signature POSIX_1997 = sig structure Error: POSIX_ERROR structure Signal: POSIX_SIGNAL structure Process: POSIX_PROCESS_1997 structure ProcEnv: POSIX_PROC_ENV structure FileSys: POSIX_FILE_SYS_1997 structure IO: POSIX_IO_1997 structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY_1997 end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/process-convert.fun000066400000000000000000000007451416264345000262500ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PosixProcessConvert (structure Process: POSIX_PROCESS) : POSIX_PROCESS_1997 = struct open Process structure W = struct open W structure Flags = FlagsConvert(structure Flags = W) open Flags end end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/process.sig000066400000000000000000000023031416264345000245540ustar00rootroot00000000000000signature POSIX_PROCESS_1997 = sig eqtype signal eqtype pid val wordToPid: SysWord.word -> pid val pidToWord: pid -> SysWord.word val fork: unit -> pid option val exec: string * string list -> 'a val exece: string * string list * string list -> 'a val execp: string * string list -> 'a datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal structure W : sig include POSIX_FLAGS_1997 val untraced: flags end val wait: unit -> pid * exit_status val waitpid: waitpid_arg * W.flags list -> pid * exit_status val waitpid_nh: waitpid_arg * W.flags list -> (pid * exit_status) option val exit: Word8.word -> 'a datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid val kill: killpid_arg * signal -> unit val alarm: Time.time -> Time.time val pause: unit -> unit val sleep: Time.time -> Time.time end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/tty-convert.fun000066400000000000000000000016351416264345000254110ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PosixTTYConvert (structure TTY: POSIX_TTY) : POSIX_TTY_1997 = struct open TTY structure I = struct open I structure Flags = FlagsConvert(structure Flags = I) open Flags end structure O = struct open O structure Flags = FlagsConvert(structure Flags = O) open Flags end structure C = struct open C structure Flags = FlagsConvert(structure Flags = C) open Flags end structure L = struct open L structure Flags = FlagsConvert(structure Flags = L) open Flags end open TC end mlton-20210117+dfsg/basis-library/libs/basis-1997/posix/tty.sig000066400000000000000000000103721416264345000237230ustar00rootroot00000000000000signature POSIX_TTY_1997 = sig eqtype pid eqtype file_desc structure V: sig val eof: int val eol: int val erase: int val intr: int val kill: int val min: int val quit: int val susp: int val time: int val start: int val stop: int val nccs: int type cc val cc: (int * char) list -> cc val update: cc * (int * char) list -> cc val sub: cc * int -> char end structure I: sig include POSIX_FLAGS_1997 val brkint: flags val icrnl: flags val ignbrk: flags val igncr: flags val ignpar: flags val inlcr: flags val inpck: flags val istrip: flags val ixoff: flags val ixon: flags val parmrk: flags end structure O: sig include POSIX_FLAGS_1997 val opost: flags end structure C: sig include POSIX_FLAGS_1997 val clocal: flags val cread: flags val cs5: flags val cs6: flags val cs7: flags val cs8: flags val csize: flags val cstopb: flags val hupcl: flags val parenb: flags val parodd: flags end structure L: sig include POSIX_FLAGS_1997 val echo: flags val echoe: flags val echok: flags val echonl: flags val icanon: flags val iexten: flags val isig: flags val noflsh: flags val tostop: flags end eqtype speed val compareSpeed: speed * speed -> order val speedToWord: speed -> SysWord.word val wordToSpeed: SysWord.word -> speed val b0: speed val b50: speed val b75: speed val b110: speed val b134: speed val b150: speed val b200: speed val b300: speed val b600: speed val b1200: speed val b1800: speed val b2400: speed val b4800: speed val b9600: speed val b19200: speed val b38400: speed type termios val termios: {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} -> termios val fieldsOf: termios -> {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val getiflag: termios -> I.flags val getoflag: termios -> O.flags val getcflag: termios -> C.flags val getlflag: termios -> L.flags val getcc: termios -> V.cc structure CF: sig val getospeed: termios -> speed val setospeed: termios * speed -> termios val getispeed: termios -> speed val setispeed: termios * speed -> termios end structure TC: sig eqtype set_action val sanow: set_action val sadrain: set_action val saflush: set_action eqtype flow_action val ooff: flow_action val oon: flow_action val ioff: flow_action val ion: flow_action eqtype queue_sel val iflush: queue_sel val oflush: queue_sel val ioflush: queue_sel end val getattr: file_desc -> termios val setattr: file_desc * TC.set_action * termios -> unit val sendbreak: file_desc * int -> unit val drain: file_desc -> unit val flush: file_desc * TC.queue_sel -> unit val flow: file_desc * TC.flow_action -> unit val getpgrp: file_desc -> pid val setpgrp: file_desc * pid -> unit end mlton-20210117+dfsg/basis-library/libs/basis-1997/real/000077500000000000000000000000001416264345000221555ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/real/IEEE-real-convert.fun000066400000000000000000000032021416264345000257720ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor IEEERealConvert (structure IEEEReal: IEEE_REAL): sig include IEEE_REAL_1997 val >> : IEEEReal.float_class -> float_class val << : float_class -> IEEEReal.float_class val >>> : IEEEReal.decimal_approx -> decimal_approx val <<< : decimal_approx -> IEEEReal.decimal_approx end = struct open IEEEReal datatype nan_mode = QUIET | SIGNALLING datatype float_class = NAN of nan_mode | INF | ZERO | NORMAL | SUBNORMAL val >> = fn IEEEReal.NAN => NAN QUIET | IEEEReal.INF => INF | IEEEReal.ZERO => ZERO | IEEEReal.NORMAL => NORMAL | IEEEReal.SUBNORMAL => SUBNORMAL val << = fn NAN _ => IEEEReal.NAN | INF => IEEEReal.INF | ZERO => IEEEReal.ZERO | NORMAL => IEEEReal.NORMAL | SUBNORMAL => IEEEReal.SUBNORMAL type decimal_approx = {kind: float_class, sign: bool, digits: int list, exp: int} val <<< = fn {kind, sign, digits, exp} => {class = << kind, sign = sign, digits = digits, exp = exp} val >>> = fn {class, sign, digits, exp} => {kind = >> class, sign = sign, digits = digits, exp = exp} val toString = toString o <<< val fromString = fn s => Option.map (>>>) (fromString s) end structure IEEEReal1997 = IEEERealConvert(structure IEEEReal = IEEEReal) mlton-20210117+dfsg/basis-library/libs/basis-1997/real/IEEE-real.sig000066400000000000000000000013131416264345000243070ustar00rootroot00000000000000signature IEEE_REAL_1997 = sig exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype nan_mode = QUIET | SIGNALLING datatype float_class = NAN of nan_mode | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO val setRoundingMode: rounding_mode -> unit val getRoundingMode: unit -> rounding_mode type decimal_approx = {kind: float_class, sign: bool, digits: int list, exp: int} val toString: decimal_approx -> string val fromString: string -> decimal_approx option end mlton-20210117+dfsg/basis-library/libs/basis-1997/real/real-convert.fun000066400000000000000000000007021416264345000252670ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RealConvert (structure Real: REAL) : REAL_1997 = struct open Real val class = IEEEReal1997.>> o class val toDecimal = IEEEReal1997.>>> o toDecimal val fromDecimal = fromDecimal o IEEEReal1997.<<< end mlton-20210117+dfsg/basis-library/libs/basis-1997/real/real.sig000066400000000000000000000047301416264345000236100ustar00rootroot00000000000000signature REAL_1997 = sig type real structure Math: MATH where type real = real val ceil: real -> Int.int val floor: real -> Int.int val round: real -> Int.int val trunc: real -> Int.int val radix: int val precision: int val maxFinite: real val minPos: real val minNormalPos: real val posInf: real val negInf: real val + : real * real -> real val - : real * real -> real val * : real * real -> real val / : real * real -> real val rem: real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val ~ : real -> real val abs: real -> real val min: real * real -> real val max: real * real -> real val sign: real -> int val signBit: real -> bool val sameSign: real * real -> bool val copySign: real * real -> real val compare: real * real -> order val compareReal: real * real -> IEEEReal1997.real_order val < : real * real -> bool val <= : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val == : real * real -> bool val != : real * real -> bool val ?= : real * real -> bool val unordered: real * real -> bool val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val class: real -> IEEEReal1997.float_class val fmt: StringCvt.realfmt -> real -> string val toString: real -> string val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val fromString: string -> real option val toManExp: real -> {man: real, exp: int} val fromManExp: {man: real, exp: int} -> real val split: real -> {whole: real, frac: real} val realMod: real -> real val nextAfter: real * real -> real val checkFloat: real -> real val realFloor: real -> real val realCeil: real -> real val realTrunc: real -> real val toInt: IEEEReal1997.rounding_mode -> real -> int val toLargeInt: IEEEReal1997.rounding_mode -> real -> LargeInt.int val fromInt: int -> real val fromLargeInt: LargeInt.int -> real val toLarge: real -> LargeReal.real val fromLarge: IEEEReal1997.rounding_mode -> LargeReal.real -> real val toDecimal: real -> IEEEReal1997.decimal_approx val fromDecimal: IEEEReal1997.decimal_approx -> real option end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/000077500000000000000000000000001416264345000225565ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/system/file-sys-convert.fun000066400000000000000000000006471416264345000265100ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor OSFileSysConvert (structure FileSys : OS_FILE_SYS) : OS_FILE_SYS_1997 = struct open FileSys val readDir = fn d => case readDir d of NONE => "" | SOME s => s end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/file-sys.sig000066400000000000000000000020551416264345000250170ustar00rootroot00000000000000signature OS_FILE_SYS_1997 = sig type dirstream val openDir: string -> dirstream val readDir: dirstream -> string val rewindDir: dirstream -> unit val closeDir: dirstream -> unit val chDir: string -> unit val getDir: unit -> string val mkDir: string -> unit val rmDir: string -> unit val isDir: string -> bool val isLink: string -> bool val readLink: string -> string val fullPath: string -> string val realPath: string -> string val modTime: string -> Time.time val fileSize: string -> Position.int val setTime: string * Time.time option -> unit val remove: string -> unit val rename: {old: string, new: string} -> unit datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val tmpName: unit -> string eqtype file_id val fileId: string -> file_id val hash: file_id -> word val compare: file_id * file_id -> order end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/os-convert.fun000066400000000000000000000007601416264345000253720ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor OSConvert (structure OS: OS) : OS_1997 = struct open OS structure FileSys = OSFileSysConvert(structure FileSys = FileSys) structure Path = OSPathConvert(structure Path = Path) structure Process = OSProcessConvert(structure Process = Process) end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/os.sig000066400000000000000000000005741416264345000237110ustar00rootroot00000000000000signature OS_1997 = sig eqtype syserror exception SysErr of string * syserror option val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option structure FileSys: OS_FILE_SYS_1997 structure Path: OS_PATH_1997 structure Process: OS_PROCESS_1997 structure IO: OS_IO end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/path-convert.fun000066400000000000000000000010121416264345000256740ustar00rootroot00000000000000(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor OSPathConvert (structure Path : OS_PATH) : OS_PATH_1997 = struct open Path val mkAbsolute = fn (path, relativeTo) => mkAbsolute {path = path, relativeTo = relativeTo} val mkRelative = fn (path, relativeTo) => mkRelative {path = path, relativeTo = relativeTo} end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/path.sig000066400000000000000000000024021416264345000242140ustar00rootroot00000000000000signature OS_PATH_1997 = sig exception Path exception InvalidArc val parentArc : string val currentArc : string val validVolume : {isAbs : bool, vol : string} -> bool val fromString : string -> {isAbs : bool, vol : string, arcs : string list} val toString : {isAbs : bool, vol : string, arcs : string list} -> string val getVolume : string -> string val getParent : string -> string val splitDirFile : string -> {dir : string, file : string} val joinDirFile : {dir : string, file : string} -> string val dir : string -> string val file : string -> string val splitBaseExt : string -> {base : string, ext : string option} val joinBaseExt : {base : string, ext : string option} -> string val base : string -> string val ext : string -> string option val mkCanonical : string -> string val isCanonical : string -> bool val mkAbsolute : (string * string) -> string val mkRelative : (string * string) -> string val isAbsolute : string -> bool val isRelative : string -> bool val isRoot : string -> bool val concat : (string * string) -> string val toUnixPath : string -> string val fromUnixPath : string -> string end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/process-convert.fun000066400000000000000000000005101416264345000264200ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor OSProcessConvert (structure Process : OS_PROCESS) : OS_PROCESS_1997 = struct open Process end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/process.sig000066400000000000000000000005341416264345000247420ustar00rootroot00000000000000signature OS_PROCESS_1997 = sig (* VIOLATION *) (* eqtype status *) type status val atExit: (unit -> unit) -> unit val exit: status -> 'a val failure: status val getEnv: string -> string option val success: status val system: string -> status val terminate: status -> 'a end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/timer-convert.fun000066400000000000000000000007631416264345000260740ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TimerConvert (structure Timer: TIMER) : TIMER_1997 = struct open Timer val checkCPUTimer = fn cput => let val {usr, sys} = checkCPUTimer cput val gc = checkGCTime cput in {usr = usr, sys = sys, gc = gc} end end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/timer.sig000066400000000000000000000006101416264345000243770ustar00rootroot00000000000000signature TIMER_1997 = sig type cpu_timer type real_timer val startCPUTimer: unit -> cpu_timer val checkCPUTimer: cpu_timer -> {usr: Time.time, sys: Time.time, gc: Time.time} val totalCPUTimer: unit -> cpu_timer val startRealTimer: unit -> real_timer val checkRealTimer: real_timer -> Time.time val totalRealTimer: unit -> real_timer end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/unix-convert.fun000066400000000000000000000005521416264345000257330ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor UnixConvert (structure Unix: UNIX) : UNIX_1997 = struct open Unix type proc = (TextIO.instream, TextIO.outstream) proc end mlton-20210117+dfsg/basis-library/libs/basis-1997/system/unix.sig000066400000000000000000000005161416264345000242470ustar00rootroot00000000000000signature UNIX_1997 = sig type proc type signal val executeInEnv: string * string list * string list -> proc val execute: string * string list -> proc val streamsOf: proc -> TextIO.instream * TextIO.outstream val reap: proc -> OS.Process.status val kill: proc * signal -> unit end mlton-20210117+dfsg/basis-library/libs/basis-1997/text/000077500000000000000000000000001416264345000222165ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/text/string.sig000066400000000000000000000024251416264345000242330ustar00rootroot00000000000000signature STRING_1997 = sig eqtype string structure Char: CHAR val maxSize: int val size: string -> int val sub: (string * int) -> Char.char val extract: (string * int * int option) -> string val substring: (string * int * int) -> string val concat: string list -> string val ^ : (string * string) -> string val str: Char.char -> string val implode: Char.char list -> string val explode: string -> Char.char list val map: (Char.char -> Char.char) -> string -> string val translate: (Char.char -> string) -> string -> string val tokens: (Char.char -> bool) -> string -> string list val fields: (Char.char -> bool) -> string -> string list val isPrefix: string -> string -> bool val compare: (string * string) -> order val collate: (((Char.char * Char.char) -> order) -> (string * string) -> order) val < : (string * string) -> bool val <= : (string * string) -> bool val > : (string * string) -> bool val >= : (string * string) -> bool val fromString: String.string -> string option val toString: string -> String.string val fromCString: String.string -> string option val toCString: string -> String.string end mlton-20210117+dfsg/basis-library/libs/basis-1997/text/substring.sig000066400000000000000000000043251416264345000247460ustar00rootroot00000000000000signature SUBSTRING_1997 = sig structure String: STRING_1997 type substring val base: substring -> (String.string * int * int) val string: substring -> String.string val extract: (String.string * int * int option) -> substring val substring: (String.string * int * int) -> substring val all: String.string -> substring val isEmpty: substring -> bool val getc: substring -> (String.Char.char * substring) option val first: substring -> String.Char.char option val triml: int -> substring -> substring val trimr: int -> substring -> substring val slice: (substring * int * int option) -> substring val sub: (substring * int) -> String.Char.char val size: substring -> int val concat: substring list -> String.string val explode: substring -> String.Char.char list val isPrefix: String.string -> substring -> bool val compare: (substring * substring) -> order val collate: ((String.Char.char * String.Char.char) -> order) -> (substring * substring) -> order val splitl: ((String.Char.char -> bool) -> substring -> (substring * substring)) val splitr: ((String.Char.char -> bool) -> substring -> (substring * substring)) val splitAt: (substring * int) -> (substring * substring) val dropl: (String.Char.char -> bool) -> substring -> substring val dropr: (String.Char.char -> bool) -> substring -> substring val takel: (String.Char.char -> bool) -> substring -> substring val taker: (String.Char.char -> bool) -> substring -> substring val position: String.string -> substring -> (substring * substring) val span: (substring * substring) -> substring val translate: ((String.Char.char -> String.string) -> substring -> String.string) val tokens: (String.Char.char -> bool) -> substring -> substring list val fields: (String.Char.char -> bool) -> substring -> substring list val foldl: ((String.Char.char * 'a) -> 'a) -> 'a -> substring -> 'a val foldr: ((String.Char.char * 'a) -> 'a) -> 'a -> substring -> 'a val app: (String.Char.char -> unit) -> substring -> unit end mlton-20210117+dfsg/basis-library/libs/basis-1997/text/text-convert.fun000066400000000000000000000014671416264345000254020ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TextConvert (structure Text: TEXT): sig structure Char: CHAR structure String: STRING_1997 structure Substring: SUBSTRING_1997 sharing type Char.char = String.Char.char = Substring.String.Char.char sharing type String.string = Substring.String.string end = struct structure Char = Text.Char structure String = struct structure Char = Char open Text.String end structure Substring = struct structure String = String open Text.Substring val all = full end end mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/000077500000000000000000000000001416264345000231415ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/basis-funs.sml000066400000000000000000000003721416264345000257320ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/basis-sigs.sml000066400000000000000000000036621416264345000257310ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature CHAR = CHAR signature INTEGER = INTEGER signature MATH = MATH signature IMPERATIVE_IO = IMPERATIVE_IO signature MONO_ARRAY = MONO_ARRAY_1997 signature MONO_VECTOR = MONO_VECTOR_1997 signature PRIM_IO = PRIM_IO signature REAL = REAL_1997 signature STREAM_IO = STREAM_IO signature STRING = STRING_1997 signature SUBSTRING = SUBSTRING_1997 signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature WORD = WORD_1997 signature ARRAY = ARRAY_1997 signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL_1997 signature IO = IO_1997 signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature OPTION = OPTION signature OS = OS_1997 signature OS_FILE_SYS = OS_FILE_SYS_1997 signature OS_PATH = OS_PATH_1997 signature OS_PROCESS = OS_PROCESS_1997 signature OS_IO = OS_IO signature SML90 = SML90 signature STRING_CVT = STRING_CVT signature TIME = TIME signature TIMER = TIMER_1997 signature VECTOR = VECTOR_1997 (* Optional signatures *) signature ARRAY2 = ARRAY2 signature INT_INF = INT_INF (* signature LOCALE = LOCALE *) signature MONO_ARRAY2 = MONO_ARRAY2_1997 (* signature MULTIBYTE = MULTIBYTE *) signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX_FLAGS = POSIX_FLAGS_1997 signature POSIX = POSIX_1997 signature POSIX_ERROR = POSIX_ERROR signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_PROCESS = POSIX_PROCESS_1997 signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_FILE_SYS = POSIX_FILE_SYS_1997 signature POSIX_IO = POSIX_IO_1997 signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY_1997 signature UNIX = UNIX_1997 mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/basis.sig000066400000000000000000000175051416264345000247560ustar00rootroot00000000000000signature BASIS_1997 = sig (* Top-level types *) eqtype unit eqtype int eqtype word type real eqtype char eqtype string type substring type exn eqtype 'a array eqtype 'a vector datatype ref = datatype ref datatype bool = datatype bool datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector val = : ''a * ''a -> bool val <> : ''a * ''a -> bool (* Required structures *) structure Array : ARRAY_1997 structure BinIO : BIN_IO_1997 (* structure BinPrimIO : PRIM_IO *) structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY_1997 structure CharVector : MONO_VECTOR_1997 structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL_1997 structure Int : INTEGER structure IO : IO_1997 structure LargeInt : INTEGER structure LargeReal : REAL_1997 structure LargeWord : WORD_1997 structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS_1997 (* structure OS.FileSys : OS_FILE_SYS_1997 structure OS.Path : OS_PATH_1997 structure OS.Process : OS_PROCESS_1997 structure OS.IO : OS_IO *) structure Position : INTEGER structure Real : REAL_1997 structure SML90 : SML90 structure String : STRING_1997 structure StringCvt : STRING_CVT structure Substring : SUBSTRING_1997 structure TextIO : TEXT_IO_1997 (* structure TextPrimIO : PRIM_IO *) structure Time : TIME structure Timer : TIMER_1997 structure Vector : VECTOR_1997 structure Word : WORD_1997 structure Word8 : WORD_1997 structure Word8Array : MONO_ARRAY_1997 structure Word8Vector : MONO_VECTOR_1997 (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY_1997 structure BoolArray2 : MONO_ARRAY2_1997 structure BoolVector : MONO_VECTOR_1997 structure CharArray2 : MONO_ARRAY2_1997 structure FixedInt : INTEGER structure IntInf : INT_INF structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure IntArray : MONO_ARRAY_1997 structure Int32Array : MONO_ARRAY_1997 structure IntArray2 : MONO_ARRAY2_1997 structure Int32Array2 : MONO_ARRAY2_1997 structure IntVector : MONO_VECTOR_1997 structure Int32Vector : MONO_VECTOR_1997 (* structure Locale : LOCALE structure MultiByte : MULTIBYTE *) (* structure PackReal64Big : PACK_REAL *) structure PackReal64Little : PACK_REAL (* structure PackRealBig : PACK_REAL *) structure PackRealLittle : PACK_REAL structure Pack32Big : PACK_WORD structure Pack32Little : PACK_WORD structure Posix : POSIX_1997 (* structure Posix.Error : POSIX_ERROR structure Posix.Signal : POSIX_SIGNAL structure Posix.Process : POSIX_PROCESS_1997 structure Posix.ProcEnv : POSIX_PROC_ENV structure Posix.FileSys : POSIX_FILE_SYS_1997 structure Posix.IO : POSIX_IO_1997 structure Posix.SysDB : POSIX_SYS_DB structure Posix.TTY : POSIX_TTY_1997 *) structure RealArray : MONO_ARRAY_1997 structure RealVector : MONO_VECTOR_1997 structure Real64 : REAL_1997 structure Real64Array : MONO_ARRAY_1997 structure Real64Vector : MONO_VECTOR_1997 structure RealArray2 : MONO_ARRAY2_1997 structure Real64Array2 : MONO_ARRAY2_1997 structure SysWord : WORD_1997 (* structure WideChar : CHAR structure WideCharArray : MONO_ARRAY_1997 structure WideCharArray2 : MONO_ARRAY2_1997 structure WideCharVector : MONO_VECTOR_1997 structure WideString : STRING structure WideSubstring : SUBSTRING structure WideTextPrimIO : PRIM_IO structure WideTextIO : TEXT_IO *) structure Word1: WORD_1997 structure Word2: WORD_1997 structure Word3: WORD_1997 structure Word4: WORD_1997 structure Word5: WORD_1997 structure Word6: WORD_1997 structure Word7: WORD_1997 structure Word9: WORD_1997 structure Word10: WORD_1997 structure Word11: WORD_1997 structure Word12: WORD_1997 structure Word13: WORD_1997 structure Word14: WORD_1997 structure Word15: WORD_1997 structure Word16: WORD_1997 structure Word17: WORD_1997 structure Word18: WORD_1997 structure Word19: WORD_1997 structure Word20: WORD_1997 structure Word21: WORD_1997 structure Word22: WORD_1997 structure Word23: WORD_1997 structure Word24: WORD_1997 structure Word25: WORD_1997 structure Word26: WORD_1997 structure Word27: WORD_1997 structure Word28: WORD_1997 structure Word29: WORD_1997 structure Word30: WORD_1997 structure Word31: WORD_1997 structure Word32: WORD_1997 structure Word64: WORD_1997 structure Word8Array2 : MONO_ARRAY2_1997 structure Unix : UNIX_1997 end mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/basis.sml000066400000000000000000000126641416264345000247700ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Basis1997: BASIS_1997 = struct open Basis2002 structure SML90 = SML90 structure VectorArray = VectorArrayConvert (structure Vector = Vector structure VectorSlice = VectorSlice structure Array = Array structure ArraySlice = ArraySlice) structure Vector = VectorArray.Vector structure Array = VectorArray.Array structure BoolVectorArray = MonoVectorArrayArray2Convert (structure Vector = BoolVector structure VectorSlice = BoolVectorSlice structure Array = BoolArray structure ArraySlice = BoolArraySlice structure Array2 = BoolArray2) structure BoolVector = BoolVectorArray.Vector structure BoolArray = BoolVectorArray.Array structure BoolArray2 = BoolVectorArray.Array2 structure CharVectorArray = MonoVectorArrayArray2Convert (structure Vector = CharVector structure VectorSlice = CharVectorSlice structure Array = CharArray structure ArraySlice = CharArraySlice structure Array2 = CharArray2) structure CharVector = CharVectorArray.Vector structure CharArray = CharVectorArray.Array structure CharArray2 = CharVectorArray.Array2 structure IntVectorArray = MonoVectorArrayArray2Convert (structure Vector = IntVector structure VectorSlice = IntVectorSlice structure Array = IntArray structure ArraySlice = IntArraySlice structure Array2 = IntArray2) structure IntVector = IntVectorArray.Vector structure IntArray = IntVectorArray.Array structure IntArray2 = IntVectorArray.Array2 structure Int32VectorArray = MonoVectorArrayArray2Convert (structure Vector = Int32Vector structure VectorSlice = Int32VectorSlice structure Array = Int32Array structure ArraySlice = Int32ArraySlice structure Array2 = Int32Array2) structure Int32Vector = Int32VectorArray.Vector structure Int32Array = Int32VectorArray.Array structure Int32Array2 = Int32VectorArray.Array2 structure RealVectorArray = MonoVectorArrayArray2Convert (structure Vector = RealVector structure VectorSlice = RealVectorSlice structure Array = RealArray structure ArraySlice = RealArraySlice structure Array2 = RealArray2) structure RealVector = RealVectorArray.Vector structure RealArray = RealVectorArray.Array structure RealArray2 = RealVectorArray.Array2 structure Real64VectorArray = MonoVectorArrayArray2Convert (structure Vector = Real64Vector structure VectorSlice = Real64VectorSlice structure Array = Real64Array structure ArraySlice = Real64ArraySlice structure Array2 = Real64Array2) structure Real64Vector = Real64VectorArray.Vector structure Real64Array = Real64VectorArray.Array structure Real64Array2 = Real64VectorArray.Array2 structure Word8VectorArray = MonoVectorArrayArray2Convert (structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice structure Array = Word8Array structure ArraySlice = Word8ArraySlice structure Array2 = Word8Array2) structure Word8Vector = Word8VectorArray.Vector structure Word8Array = Word8VectorArray.Array structure Word8Array2 = Word8VectorArray.Array2 structure Pack32Big = PackWord32Big structure Pack32Little = PackWord32Little structure Text = TextConvert (structure Text = Text) structure Char = Text.Char structure String = Text.String structure Substring = Text.Substring structure IEEEReal = IEEEReal1997 structure LargeReal = RealConvert(structure Real = LargeReal) structure Real = RealConvert(structure Real = Real) structure Real64 = RealConvert(structure Real = Real64) structure Posix = PosixConvert(structure Posix = Posix) structure OS = OSConvert(structure OS = OS) structure Timer = TimerConvert(structure Timer = Timer) structure IO = IOConvert(structure IO = IO) structure TextIO = TextIOConvert(structure TextIO = TextIO) structure BinIO = BinIOConvert(structure BinIO = BinIO) structure Unix = UnixConvert (structure Unix = Unix) end mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/infixes.sml000066400000000000000000000005441416264345000253260ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/overloads.sml000066400000000000000000000035201416264345000256540ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) _overload ~ : ('a -> 'a) as Int.~ and IntInf.~ and Real.~ _overload + : ('a * 'a -> 'a) as Int.+ and IntInf.+ and Word.+ and Word8.+ and Real.+ _overload - : ('a * 'a -> 'a) as Int.- and IntInf.- and Word.- and Word8.- and Real.- _overload * : ('a * 'a -> 'a) as Int.* and IntInf.* and Word.* and Word8.* and Real.* (* Can't use the following overload, because then * fun f (x, y) = x + y / y * fails to type check. The problem is that because + and / are not constrained, * the type checker chooses the default type for +, int * int -> int. It is * then screwed because it can't chose that type for /. The problem happens * when there are overloaded variables that have some compatible type (in this * case real) but one of whose default types (int) is not a valid instance * of the other. *) (* * _overload / : ('a * 'a -> 'a) * as Real./ *) val op / = Real./ _overload div: ('a * 'a -> 'a) as Int.div and IntInf.div and Word.div and Word8.div _overload mod: ('a * 'a -> 'a) as Int.mod and IntInf.mod and Word.mod and Word8.mod _overload < : ('a * 'a -> bool) as Int.< and IntInf.< and Word.< and Word8.< and Real.< and Char.< and String.< _overload <= : ('a * 'a -> bool) as Int.<= and IntInf.<= and Word.<= and Word8.<= and Real.<= and Char.<= and String.<= _overload > : ('a * 'a -> bool) as Int.> and IntInf.> and Word.> and Word8.> and Real.> and Char.> and String.> _overload >= : ('a * 'a -> bool) as Int.>= and IntInf.>= and Word.>= and Word8.>= and Real.>= and Char.>= and String.>= _overload abs: ('a -> 'a) as Int.abs and IntInf.abs and Real.abs mlton-20210117+dfsg/basis-library/libs/basis-1997/top-level/top-level.sml000066400000000000000000000003311416264345000255620ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) open Basis1997 mlton-20210117+dfsg/basis-library/libs/basis-2002-strict/000077500000000000000000000000001416264345000225125ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-2002-strict/top-level/000077500000000000000000000000001416264345000244215ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-2002-strict/top-level/top-level.sml000066400000000000000000000004341416264345000270460ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) open Basis2002 val op = = op = mlton-20210117+dfsg/basis-library/libs/basis-2002/000077500000000000000000000000001416264345000212045ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-2002/basis-2002.mlb000066400000000000000000000011541416264345000233630ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local ../basis-extra/basis-extra.mlb ann "allowSpecifySpecialIds true" in top-level/basis.sig end top-level/basis.sml in structure Basis2002 end end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/000077500000000000000000000000001416264345000231135ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/.gitignore000066400000000000000000000000541416264345000251020ustar00rootroot00000000000000/generate-overloads /generate-overloads.exe mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/Makefile000066400000000000000000000005241416264345000245540ustar00rootroot00000000000000## Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## GEN := generate-overloads overloads.sml: $(GEN).sml mlton $(GEN).sml $(GEN) >overloads.sml .PHONY: clean clean: ../../../../bin/clean mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-equal.sig000066400000000000000000000001551416264345000260260ustar00rootroot00000000000000signature BASIS_2002_EQUAL = sig val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-exns.sig000066400000000000000000000005371416264345000257000ustar00rootroot00000000000000signature BASIS_2002_EXNS = sig (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-funs.sml000066400000000000000000000006741416264345000257110ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = PrimIO (S) functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIO (S) functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = ImperativeIO (S) mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-sigs.sml000066400000000000000000000044021416264345000256740ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature ARRAY = ARRAY signature ARRAY_SLICE = ARRAY_SLICE signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature CHAR = CHAR signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL signature IMPERATIVE_IO = IMPERATIVE_IO signature INTEGER = INTEGER signature INT_INF = INT_INF signature IO = IO signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature MATH = MATH signature MONO_ARRAY = MONO_ARRAY signature MONO_ARRAY_SLICE = MONO_ARRAY_SLICE signature MONO_VECTOR = MONO_VECTOR signature MONO_VECTOR_SLICE = MONO_VECTOR_SLICE signature OPTION = OPTION signature OS = OS signature OS_FILE_SYS = OS_FILE_SYS signature OS_IO = OS_IO signature OS_PATH = OS_PATH signature OS_PROCESS = OS_PROCESS signature PRIM_IO = PRIM_IO signature REAL = REAL signature STREAM_IO = STREAM_IO signature STRING = STRING signature STRING_CVT = STRING_CVT signature SUBSTRING = SUBSTRING signature TEXT = TEXT signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature TIME = TIME signature TIMER = TIMER signature VECTOR = VECTOR signature VECTOR_SLICE = VECTOR_SLICE signature WORD = WORD (* Optional signatures *) signature ARRAY2 = ARRAY2 signature BIT_FLAGS = BIT_FLAGS signature GENERIC_SOCK = GENERIC_SOCK signature INET_SOCK = INET_SOCK signature INT_INF = INT_INF signature MONO_ARRAY2 = MONO_ARRAY2 signature NET_HOST_DB = NET_HOST_DB signature NET_PROT_DB = NET_PROT_DB signature NET_SERV_DB = NET_SERV_DB signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX = POSIX signature POSIX_ERROR = POSIX_ERROR signature POSIX_FILE_SYS = POSIX_FILE_SYS signature POSIX_IO = POSIX_IO signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_PROCESS = POSIX_PROCESS signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY signature SOCKET = SOCKET signature UNIX = UNIX signature UNIX_SOCK = UNIX_SOCK (* signature WINDOWS = WINDOWS *) mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-types.sig000066400000000000000000000007151416264345000260650ustar00rootroot00000000000000signature BASIS_2002_TYPES = sig (* Top-level types *) eqtype 'a array datatype bool = datatype bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list datatype ref = datatype ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis-vals.sig000066400000000000000000000030511416264345000256620ustar00rootroot00000000000000signature BASIS_2002_VALS = sig (* Top-level values *) val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis.sig000066400000000000000000000670101416264345000247240ustar00rootroot00000000000000signature BASIS_2002 = sig (* Top-level types *) eqtype 'a array datatype bool = datatype BasisExtra.bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype BasisExtra.list datatype ref = datatype BasisExtra.ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val = : ''a * ''a -> bool val <> : ''a * ''a -> bool val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector (* Required structures *) structure Array : ARRAY structure ArraySlice : ARRAY_SLICE structure BinIO : BIN_IO structure BinPrimIO : PRIM_IO structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY structure CharArraySlice : MONO_ARRAY_SLICE structure CharVector : MONO_VECTOR structure CharVectorSlice : MONO_VECTOR_SLICE structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL structure Int : INTEGER structure IO : IO structure LargeInt : INTEGER structure LargeReal : REAL structure LargeWord : WORD structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS structure Position : INTEGER structure Real : REAL structure StringCvt : STRING_CVT structure String : STRING structure Substring : SUBSTRING structure TextIO : TEXT_IO structure TextPrimIO : PRIM_IO structure Text : TEXT structure Time : TIME structure Timer : TIMER structure VectorSlice : VECTOR_SLICE structure Vector : VECTOR structure Word : WORD structure Word8Array : MONO_ARRAY structure Word8Array2 : MONO_ARRAY2 structure Word8ArraySlice : MONO_ARRAY_SLICE structure Word8Vector : MONO_VECTOR structure Word8VectorSlice : MONO_VECTOR_SLICE (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY structure BoolArray2 : MONO_ARRAY2 structure BoolArraySlice : MONO_ARRAY_SLICE structure BoolVector : MONO_VECTOR structure BoolVectorSlice : MONO_VECTOR_SLICE structure CharArray2 : MONO_ARRAY2 structure FixedInt : INTEGER structure GenericSock : GENERIC_SOCK structure INetSock : INET_SOCK structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure Int8Array : MONO_ARRAY structure Int8Array2 : MONO_ARRAY2 structure Int8ArraySlice : MONO_ARRAY_SLICE structure Int8Vector : MONO_VECTOR structure Int8VectorSlice : MONO_VECTOR_SLICE structure Int16Array : MONO_ARRAY structure Int16Array2 : MONO_ARRAY2 structure Int16ArraySlice : MONO_ARRAY_SLICE structure Int16Vector : MONO_VECTOR structure Int16VectorSlice : MONO_VECTOR_SLICE structure Int32Array : MONO_ARRAY structure Int32Array2 : MONO_ARRAY2 structure Int32ArraySlice : MONO_ARRAY_SLICE structure Int32Vector : MONO_VECTOR structure Int32VectorSlice : MONO_VECTOR_SLICE structure Int64Array : MONO_ARRAY structure Int64Array2 : MONO_ARRAY2 structure Int64ArraySlice : MONO_ARRAY_SLICE structure Int64Vector : MONO_VECTOR structure Int64VectorSlice : MONO_VECTOR_SLICE structure IntArray : MONO_ARRAY structure IntArray2 : MONO_ARRAY2 structure IntArraySlice : MONO_ARRAY_SLICE structure IntVector : MONO_VECTOR structure IntVectorSlice : MONO_VECTOR_SLICE structure IntInf : INT_INF structure LargeIntArray : MONO_ARRAY structure LargeIntArray2 : MONO_ARRAY2 structure LargeIntArraySlice : MONO_ARRAY_SLICE structure LargeIntVector : MONO_VECTOR structure LargeIntVectorSlice : MONO_VECTOR_SLICE structure LargeRealArray : MONO_ARRAY structure LargeRealArray2 : MONO_ARRAY2 structure LargeRealArraySlice : MONO_ARRAY_SLICE structure LargeRealVector : MONO_VECTOR structure LargeRealVectorSlice : MONO_VECTOR_SLICE structure LargeWordArray : MONO_ARRAY structure LargeWordArray2 : MONO_ARRAY2 structure LargeWordArraySlice : MONO_ARRAY_SLICE structure LargeWordVector : MONO_VECTOR structure LargeWordVectorSlice : MONO_VECTOR_SLICE structure NetHostDB : NET_HOST_DB structure NetProtDB : NET_PROT_DB structure NetServDB : NET_SERV_DB structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD structure Posix : POSIX structure Real32 : REAL structure Real32Array : MONO_ARRAY structure Real32Array2 : MONO_ARRAY2 structure Real32ArraySlice : MONO_ARRAY_SLICE structure Real32Vector : MONO_VECTOR structure Real32VectorSlice : MONO_VECTOR_SLICE structure Real64 : REAL structure Real64Array : MONO_ARRAY structure Real64Array2 : MONO_ARRAY2 structure Real64ArraySlice : MONO_ARRAY_SLICE structure Real64Vector : MONO_VECTOR structure Real64VectorSlice : MONO_VECTOR_SLICE structure RealArray : MONO_ARRAY structure RealArray2 : MONO_ARRAY2 structure RealArraySlice : MONO_ARRAY_SLICE structure RealVector : MONO_VECTOR structure RealVectorSlice : MONO_VECTOR_SLICE structure Socket : SOCKET structure SysWord : WORD structure Unix : UNIX structure UnixSock : UNIX_SOCK structure WideChar : CHAR structure WideCharArray : MONO_ARRAY structure WideCharArray2 : MONO_ARRAY2 structure WideCharArraySlice : MONO_ARRAY_SLICE structure WideCharVector : MONO_VECTOR structure WideCharVectorSlice : MONO_VECTOR_SLICE structure WideString : STRING structure WideSubstring : SUBSTRING structure WideText : TEXT (* structure WideTextIO : TEXT_IO structure WideTextPrimIO : PRIM_IO *) (* structure Windows : WINDOWS *) structure Word1: WORD structure Word2: WORD structure Word3: WORD structure Word4: WORD structure Word5: WORD structure Word6: WORD structure Word7: WORD structure Word8: WORD structure Word9: WORD structure Word10: WORD structure Word11: WORD structure Word12: WORD structure Word13: WORD structure Word14: WORD structure Word15: WORD structure Word16: WORD structure Word17: WORD structure Word18: WORD structure Word19: WORD structure Word20: WORD structure Word21: WORD structure Word22: WORD structure Word23: WORD structure Word24: WORD structure Word25: WORD structure Word26: WORD structure Word27: WORD structure Word28: WORD structure Word29: WORD structure Word30: WORD structure Word31: WORD structure Word32: WORD structure Word64: WORD structure WordArray : MONO_ARRAY structure WordArray2 : MONO_ARRAY2 structure WordArraySlice : MONO_ARRAY_SLICE structure WordVector : MONO_VECTOR structure WordVectorSlice : MONO_VECTOR_SLICE structure Word16Array : MONO_ARRAY structure Word16Array2 : MONO_ARRAY2 structure Word16ArraySlice : MONO_ARRAY_SLICE structure Word16Vector : MONO_VECTOR structure Word16VectorSlice : MONO_VECTOR_SLICE structure Word32Array : MONO_ARRAY structure Word32Array2 : MONO_ARRAY2 structure Word32ArraySlice : MONO_ARRAY_SLICE structure Word32Vector : MONO_VECTOR structure Word32VectorSlice : MONO_VECTOR_SLICE structure Word64Array : MONO_ARRAY structure Word64Array2 : MONO_ARRAY2 structure Word64ArraySlice : MONO_ARRAY_SLICE structure Word64Vector : MONO_VECTOR structure Word64VectorSlice : MONO_VECTOR_SLICE (* ************************************************** *) (* ************************************************** *) (* Sharing constraints *) (* Top-level types *) sharing type unit = General.unit sharing type int = Int.int sharing type word = Word.word sharing type real = Real.real sharing type char = Char.char sharing type string = String.string sharing type substring = Substring.substring sharing type exn = General.exn (* Can't use sharing on type array or vector, because they are rigid tycons. * Don't need it anyways, since it's built into the ARRAY and VECTOR signatures. *) (* sharing type array = Array.array sharing type vector = Vector.vector *) (* sharing type ref = General.ref *) (* sharing type bool = Bool.bool *) sharing type option = Option.option sharing type order = General.order (* sharing type list = List.list *) (* Required structures *) (* sharing type BinIO.StreamIO.elem = Word8.word *) sharing type BinIO.StreamIO.reader = BinPrimIO.reader sharing type BinIO.StreamIO.pos = BinPrimIO.pos (* sharing type BinIO.StreamIO.vector = Word8Vector.vector *) sharing type BinIO.StreamIO.writer = BinPrimIO.writer sharing type BinPrimIO.array = Word8Array.array sharing type BinPrimIO.array_slice = Word8ArraySlice.slice sharing type BinPrimIO.elem = Word8.word sharing type BinPrimIO.pos = Position.int sharing type BinPrimIO.vector = Word8Vector.vector sharing type BinPrimIO.vector_slice = Word8VectorSlice.slice sharing type Char.char = char sharing type Char.string = String.string sharing type CharArray.elem = char sharing type CharArray.vector = CharVector.vector sharing type CharArraySlice.elem = char sharing type CharArraySlice.array = CharArray.array sharing type CharArraySlice.vector = CharVector.vector sharing type CharArraySlice.vector_slice = CharVectorSlice.slice sharing type CharVector.elem = char sharing type CharVector.vector = String.string sharing type CharVectorSlice.elem = char sharing type CharVectorSlice.vector = String.string sharing type CharVectorSlice.slice = Substring.substring sharing type Int.int = int sharing type Math.real = Real.real sharing type Real.real = real sharing type String.string = string sharing type String.string = CharVector.vector sharing type String.char = Char.char sharing type Substring.substring = CharVectorSlice.slice sharing type Substring.string = String.string sharing type Substring.char = Char.char sharing type Text.Char.char = Char.char sharing type Text.String.string = String.string sharing type Text.Substring.substring = Substring.substring sharing type Text.CharVector.vector = CharVector.vector sharing type Text.CharArray.array = CharArray.array sharing type Text.CharArraySlice.slice = CharArraySlice.slice sharing type Text.CharVectorSlice.slice = CharVectorSlice.slice (* redundant *) (* sharing type TextIO.elem = char sharing type TextIO.vector = string *) sharing type TextPrimIO.array = CharArray.array sharing type TextPrimIO.array_slice = CharArraySlice.slice sharing type TextPrimIO.elem = Char.char sharing type TextPrimIO.pos = Position.int sharing type TextPrimIO.vector = CharVector.vector sharing type TextPrimIO.vector_slice = CharVectorSlice.slice sharing type Word.word = word sharing type Word8Array.elem = Word8.word sharing type Word8Array.vector = Word8Vector.vector sharing type Word8ArraySlice.elem = Word8.word sharing type Word8ArraySlice.array = Word8Array.array sharing type Word8ArraySlice.vector = Word8Vector.vector sharing type Word8ArraySlice.vector_slice = Word8VectorSlice.slice sharing type Word8Vector.elem = Word8.word sharing type Word8VectorSlice.elem = Word8.word sharing type Word8VectorSlice.vector = Word8Vector.vector sharing type Word8Array2.elem = Word8.word sharing type Word8Array2.vector = Word8Vector.vector (* Optional structures *) sharing type BoolArray.vector = BoolVector.vector sharing type BoolArraySlice.array = BoolArray.array sharing type BoolArraySlice.vector = BoolVector.vector sharing type BoolArraySlice.vector_slice = BoolVectorSlice.slice sharing type BoolVectorSlice.vector = BoolVector.vector sharing type BoolArray2.vector = BoolVector.vector sharing type CharArray2.elem = char sharing type CharArray2.vector = CharVector.vector sharing type IntArray.elem = int sharing type IntArray.vector = IntVector.vector sharing type IntArraySlice.elem = int sharing type IntArraySlice.array = IntArray.array sharing type IntArraySlice.vector = IntVector.vector sharing type IntArraySlice.vector_slice = IntVectorSlice.slice sharing type IntVector.elem = int sharing type IntVectorSlice.elem = int sharing type IntVectorSlice.vector = IntVector.vector sharing type IntArray2.elem = int sharing type IntArray2.vector = IntVector.vector sharing type Int8Array.elem = Int8.int sharing type Int8Array.vector = Int8Vector.vector sharing type Int8ArraySlice.elem = Int8.int sharing type Int8ArraySlice.array = Int8Array.array sharing type Int8ArraySlice.vector = Int8Vector.vector sharing type Int8ArraySlice.vector_slice = Int8VectorSlice.slice sharing type Int8Vector.elem = Int8.int sharing type Int8VectorSlice.elem = Int8.int sharing type Int8VectorSlice.vector = Int8Vector.vector sharing type Int8Array2.elem = Int8.int sharing type Int8Array2.vector = Int8Vector.vector sharing type Int16Array.elem = Int16.int sharing type Int16Array.vector = Int16Vector.vector sharing type Int16ArraySlice.elem = Int16.int sharing type Int16ArraySlice.array = Int16Array.array sharing type Int16ArraySlice.vector = Int16Vector.vector sharing type Int16ArraySlice.vector_slice = Int16VectorSlice.slice sharing type Int16Vector.elem = Int16.int sharing type Int16VectorSlice.elem = Int16.int sharing type Int16VectorSlice.vector = Int16Vector.vector sharing type Int16Array2.elem = Int16.int sharing type Int16Array2.vector = Int16Vector.vector sharing type Int32Array.elem = Int32.int sharing type Int32Array.vector = Int32Vector.vector sharing type Int32ArraySlice.elem = Int32.int sharing type Int32ArraySlice.array = Int32Array.array sharing type Int32ArraySlice.vector = Int32Vector.vector sharing type Int32ArraySlice.vector_slice = Int32VectorSlice.slice sharing type Int32Vector.elem = Int32.int sharing type Int32VectorSlice.elem = Int32.int sharing type Int32VectorSlice.vector = Int32Vector.vector sharing type Int32Array2.elem = Int32.int sharing type Int32Array2.vector = Int32Vector.vector sharing type Int64Array.elem = Int64.int sharing type Int64Array.vector = Int64Vector.vector sharing type Int64ArraySlice.elem = Int64.int sharing type Int64ArraySlice.array = Int64Array.array sharing type Int64ArraySlice.vector = Int64Vector.vector sharing type Int64ArraySlice.vector_slice = Int64VectorSlice.slice sharing type Int64Vector.elem = Int64.int sharing type Int64VectorSlice.elem = Int64.int sharing type Int64VectorSlice.vector = Int64Vector.vector sharing type Int64Array2.elem = Int64.int sharing type Int64Array2.vector = Int64Vector.vector sharing type LargeIntArray.elem = LargeInt.int sharing type LargeIntArray.vector = LargeIntVector.vector sharing type LargeIntArraySlice.elem = LargeInt.int sharing type LargeIntArraySlice.array = LargeIntArray.array sharing type LargeIntArraySlice.vector = LargeIntVector.vector sharing type LargeIntArraySlice.vector_slice = LargeIntVectorSlice.slice sharing type LargeIntVector.elem = LargeInt.int sharing type LargeIntVectorSlice.elem = LargeInt.int sharing type LargeIntVectorSlice.vector = LargeIntVector.vector sharing type LargeIntArray2.elem = LargeInt.int sharing type LargeIntArray2.vector = LargeIntVector.vector sharing type LargeRealArray.elem = LargeReal.real sharing type LargeRealArray.vector = LargeRealVector.vector sharing type LargeRealArraySlice.elem = LargeReal.real sharing type LargeRealArraySlice.array = LargeRealArray.array sharing type LargeRealArraySlice.vector = LargeRealVector.vector sharing type LargeRealArraySlice.vector_slice = LargeRealVectorSlice.slice sharing type LargeRealVector.elem = LargeReal.real sharing type LargeRealVectorSlice.elem = LargeReal.real sharing type LargeRealVectorSlice.vector = LargeRealVector.vector sharing type LargeRealArray2.elem = LargeReal.real sharing type LargeRealArray2.vector = LargeRealVector.vector sharing type LargeWordArray.elem = LargeWord.word sharing type LargeWordArray.vector = LargeWordVector.vector sharing type LargeWordArraySlice.elem = LargeWord.word sharing type LargeWordArraySlice.array = LargeWordArray.array sharing type LargeWordArraySlice.vector = LargeWordVector.vector sharing type LargeWordArraySlice.vector_slice = LargeWordVectorSlice.slice sharing type LargeWordVector.elem = LargeWord.word sharing type LargeWordVectorSlice.elem = LargeWord.word sharing type LargeWordVectorSlice.vector = LargeWordVector.vector sharing type LargeWordArray2.elem = LargeWord.word sharing type LargeWordArray2.vector = LargeWordVector.vector sharing type PackRealBig.real = real sharing type PackRealLittle.real = real sharing type PackReal32Big.real = Real32.real sharing type PackReal32Little.real = Real32.real sharing type PackReal64Big.real = Real64.real sharing type PackReal64Little.real = Real64.real sharing type Posix.Error.syserror = OS.syserror sharing type Posix.IO.file_desc = Posix.ProcEnv.file_desc sharing type Posix.FileSys.dirstream = OS.FileSys.dirstream sharing type Posix.FileSys.access_mode = OS.FileSys.access_mode sharing type Posix.Process.exit_status = Unix.exit_status sharing type Posix.Signal.signal = Unix.signal sharing type RealArray.elem = real sharing type RealArray.vector = RealVector.vector sharing type RealArraySlice.elem = real sharing type RealArraySlice.array = RealArray.array sharing type RealArraySlice.vector = RealVector.vector sharing type RealArraySlice.vector_slice = RealVectorSlice.slice sharing type RealVector.elem = real sharing type RealVectorSlice.elem = real sharing type RealVectorSlice.vector = RealVector.vector sharing type RealArray2.elem = real sharing type RealArray2.vector = RealVector.vector sharing type Real32Array.elem = Real32.real sharing type Real32Array.vector = Real32Vector.vector sharing type Real32ArraySlice.elem = Real32.real sharing type Real32ArraySlice.array = Real32Array.array sharing type Real32ArraySlice.vector = Real32Vector.vector sharing type Real32ArraySlice.vector_slice = Real32VectorSlice.slice sharing type Real32Vector.elem = Real32.real sharing type Real32VectorSlice.elem = Real32.real sharing type Real32VectorSlice.vector = Real32Vector.vector sharing type Real32Array2.elem = Real32.real sharing type Real32Array2.vector = Real32Vector.vector sharing type Real64Array.elem = Real64.real sharing type Real64Array.vector = Real64Vector.vector sharing type Real64ArraySlice.elem = Real64.real sharing type Real64ArraySlice.array = Real64Array.array sharing type Real64ArraySlice.vector = Real64Vector.vector sharing type Real64ArraySlice.vector_slice = Real64VectorSlice.slice sharing type Real64Vector.elem = Real64.real sharing type Real64VectorSlice.elem = Real64.real sharing type Real64VectorSlice.vector = Real64Vector.vector sharing type Real64Array2.elem = Real64.real sharing type Real64Array2.vector = Real64Vector.vector sharing type Unix.exit_status = Posix.Process.exit_status sharing type WideChar.string = WideString.string sharing type WideCharArray.elem = WideChar.char sharing type WideCharArray.vector = WideCharVector.vector sharing type WideCharArray2.elem = WideChar.char sharing type WideCharArray2.vector = WideCharVector.vector sharing type WideCharArraySlice.elem = WideChar.char sharing type WideCharArraySlice.array = WideCharArray.array sharing type WideCharArraySlice.vector = WideCharVector.vector sharing type WideCharArraySlice.vector_slice = WideCharVectorSlice.slice sharing type WideCharVector.elem = WideChar.char sharing type WideCharVector.vector = WideString.string sharing type WideCharVectorSlice.elem = WideChar.char sharing type WideCharVectorSlice.slice = WideSubstring.substring sharing type WideCharVectorSlice.vector = WideString.string sharing type WideString.char = WideChar.char (* next two are redundant? basis & char both do it... *) sharing type WideString.string = WideCharVector.vector sharing type WideSubstring.substring = WideCharVectorSlice.slice sharing type WideSubstring.string = WideString.string sharing type WideSubstring.char = WideChar.char sharing type WideText.Char.char = WideChar.char sharing type WideText.String.string = WideString.string sharing type WideText.Substring.substring = WideSubstring.substring sharing type WideText.CharVector.vector = WideCharVector.vector sharing type WideText.CharArray.array = WideCharArray.array sharing type WideText.CharArraySlice.slice = WideCharArraySlice.slice sharing type WideText.CharVectorSlice.slice = WideCharVectorSlice.slice sharing type WordArray.elem = word sharing type WordArray.vector = WordVector.vector sharing type WordArraySlice.elem = word sharing type WordArraySlice.array = WordArray.array sharing type WordArraySlice.vector = WordVector.vector sharing type WordArraySlice.vector_slice = WordVectorSlice.slice sharing type WordVector.elem = word sharing type WordVectorSlice.elem = word sharing type WordVectorSlice.vector = WordVector.vector sharing type WordArray2.elem = word sharing type WordArray2.vector = WordVector.vector sharing type Word16Array.elem = Word16.word sharing type Word16Array.vector = Word16Vector.vector sharing type Word16ArraySlice.elem = Word16.word sharing type Word16ArraySlice.array = Word16Array.array sharing type Word16ArraySlice.vector = Word16Vector.vector sharing type Word16ArraySlice.vector_slice = Word16VectorSlice.slice sharing type Word16Vector.elem = Word16.word sharing type Word16VectorSlice.elem = Word16.word sharing type Word16VectorSlice.vector = Word16Vector.vector sharing type Word16Array2.elem = Word16.word sharing type Word16Array2.vector = Word16Vector.vector sharing type Word32Array.elem = Word32.word sharing type Word32Array.vector = Word32Vector.vector sharing type Word32ArraySlice.elem = Word32.word sharing type Word32ArraySlice.array = Word32Array.array sharing type Word32ArraySlice.vector = Word32Vector.vector sharing type Word32ArraySlice.vector_slice = Word32VectorSlice.slice sharing type Word32Vector.elem = Word32.word sharing type Word32VectorSlice.elem = Word32.word sharing type Word32VectorSlice.vector = Word32Vector.vector sharing type Word32Array2.elem = Word32.word sharing type Word32Array2.vector = Word32Vector.vector sharing type Word64Array.elem = Word64.word sharing type Word64Array.vector = Word64Vector.vector sharing type Word64ArraySlice.elem = Word64.word sharing type Word64ArraySlice.array = Word64Array.array sharing type Word64ArraySlice.vector = Word64Vector.vector sharing type Word64ArraySlice.vector_slice = Word64VectorSlice.slice sharing type Word64Vector.elem = Word64.word sharing type Word64VectorSlice.elem = Word64.word sharing type Word64VectorSlice.vector = Word64Vector.vector sharing type Word64Array2.elem = Word64.word sharing type Word64Array2.vector = Word64Vector.vector end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/basis.sml000066400000000000000000000003671416264345000247370ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Basis2002 : BASIS_2002 = BasisExtra mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/generate-overloads.sml000066400000000000000000000035731416264345000274260ustar00rootroot00000000000000(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure List = struct fun foreach (l, f) = List.app f l fun map (l, f) = List.map f l val tabulate = List.tabulate end val int = ["Int", "IntInf", "LargeInt", "FixedInt", "Position"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Int", Int.toString i]) val real = ["Real", "Real32", "Real64", "LargeReal"] val word = ["Word", "LargeWord", "SysWord"] @ List.map (List.tabulate (32, fn i => i + 1) @ [64], fn i => concat ["Word", Int.toString i]) val text = ["Char", "WideChar", "String", "WideString"] (* Order matters here in the appends, since the first element will be the * default. *) val num = int @ word @ real val numtext = num @ text val realint = int @ real val wordint = int @ word val binary = "'a * 'a -> 'a" val compare = "'a * 'a -> bool" val unary = "'a -> 'a" val () = print "(* This file is automatically generated. Do not edit. *)\n" val () = List.foreach ([(2, "~", unary, num), (2, "+", binary, num), (2, "-", binary, num), (2, "*", binary, num), (4, "/", binary, real), (3, "div", binary, wordint), (3, "mod", binary, wordint), (3, "abs", unary, realint), (1, "<", compare, numtext), (1, "<=", compare, numtext), (1, ">", compare, numtext), (1, ">=", compare, numtext)], fn (prec, f, ty, class) => (print (concat ["\n_overload ", Int.toString prec, " ", f, " : ", ty, "\n"]) ; (case class of [] => () | c :: class => (print (concat ["as ", c, ".", f, "\n"]) ; List.foreach (class, fn c => print (concat ["and ", c, ".", f, "\n"])))))) mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/infixes.sml000066400000000000000000000005441416264345000253000ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/overloads.sml000066400000000000000000000257241416264345000256400ustar00rootroot00000000000000(* This file is automatically generated. Do not edit. *) _overload 2 ~ : 'a -> 'a as Int.~ and IntInf.~ and LargeInt.~ and FixedInt.~ and Position.~ and Int2.~ and Int3.~ and Int4.~ and Int5.~ and Int6.~ and Int7.~ and Int8.~ and Int9.~ and Int10.~ and Int11.~ and Int12.~ and Int13.~ and Int14.~ and Int15.~ and Int16.~ and Int17.~ and Int18.~ and Int19.~ and Int20.~ and Int21.~ and Int22.~ and Int23.~ and Int24.~ and Int25.~ and Int26.~ and Int27.~ and Int28.~ and Int29.~ and Int30.~ and Int31.~ and Int32.~ and Int64.~ and Word.~ and LargeWord.~ and SysWord.~ and Word1.~ and Word2.~ and Word3.~ and Word4.~ and Word5.~ and Word6.~ and Word7.~ and Word8.~ and Word9.~ and Word10.~ and Word11.~ and Word12.~ and Word13.~ and Word14.~ and Word15.~ and Word16.~ and Word17.~ and Word18.~ and Word19.~ and Word20.~ and Word21.~ and Word22.~ and Word23.~ and Word24.~ and Word25.~ and Word26.~ and Word27.~ and Word28.~ and Word29.~ and Word30.~ and Word31.~ and Word32.~ and Word64.~ and Real.~ and Real32.~ and Real64.~ and LargeReal.~ _overload 2 + : 'a * 'a -> 'a as Int.+ and IntInf.+ and LargeInt.+ and FixedInt.+ and Position.+ and Int2.+ and Int3.+ and Int4.+ and Int5.+ and Int6.+ and Int7.+ and Int8.+ and Int9.+ and Int10.+ and Int11.+ and Int12.+ and Int13.+ and Int14.+ and Int15.+ and Int16.+ and Int17.+ and Int18.+ and Int19.+ and Int20.+ and Int21.+ and Int22.+ and Int23.+ and Int24.+ and Int25.+ and Int26.+ and Int27.+ and Int28.+ and Int29.+ and Int30.+ and Int31.+ and Int32.+ and Int64.+ and Word.+ and LargeWord.+ and SysWord.+ and Word1.+ and Word2.+ and Word3.+ and Word4.+ and Word5.+ and Word6.+ and Word7.+ and Word8.+ and Word9.+ and Word10.+ and Word11.+ and Word12.+ and Word13.+ and Word14.+ and Word15.+ and Word16.+ and Word17.+ and Word18.+ and Word19.+ and Word20.+ and Word21.+ and Word22.+ and Word23.+ and Word24.+ and Word25.+ and Word26.+ and Word27.+ and Word28.+ and Word29.+ and Word30.+ and Word31.+ and Word32.+ and Word64.+ and Real.+ and Real32.+ and Real64.+ and LargeReal.+ _overload 2 - : 'a * 'a -> 'a as Int.- and IntInf.- and LargeInt.- and FixedInt.- and Position.- and Int2.- and Int3.- and Int4.- and Int5.- and Int6.- and Int7.- and Int8.- and Int9.- and Int10.- and Int11.- and Int12.- and Int13.- and Int14.- and Int15.- and Int16.- and Int17.- and Int18.- and Int19.- and Int20.- and Int21.- and Int22.- and Int23.- and Int24.- and Int25.- and Int26.- and Int27.- and Int28.- and Int29.- and Int30.- and Int31.- and Int32.- and Int64.- and Word.- and LargeWord.- and SysWord.- and Word1.- and Word2.- and Word3.- and Word4.- and Word5.- and Word6.- and Word7.- and Word8.- and Word9.- and Word10.- and Word11.- and Word12.- and Word13.- and Word14.- and Word15.- and Word16.- and Word17.- and Word18.- and Word19.- and Word20.- and Word21.- and Word22.- and Word23.- and Word24.- and Word25.- and Word26.- and Word27.- and Word28.- and Word29.- and Word30.- and Word31.- and Word32.- and Word64.- and Real.- and Real32.- and Real64.- and LargeReal.- _overload 2 * : 'a * 'a -> 'a as Int.* and IntInf.* and LargeInt.* and FixedInt.* and Position.* and Int2.* and Int3.* and Int4.* and Int5.* and Int6.* and Int7.* and Int8.* and Int9.* and Int10.* and Int11.* and Int12.* and Int13.* and Int14.* and Int15.* and Int16.* and Int17.* and Int18.* and Int19.* and Int20.* and Int21.* and Int22.* and Int23.* and Int24.* and Int25.* and Int26.* and Int27.* and Int28.* and Int29.* and Int30.* and Int31.* and Int32.* and Int64.* and Word.* and LargeWord.* and SysWord.* and Word1.* and Word2.* and Word3.* and Word4.* and Word5.* and Word6.* and Word7.* and Word8.* and Word9.* and Word10.* and Word11.* and Word12.* and Word13.* and Word14.* and Word15.* and Word16.* and Word17.* and Word18.* and Word19.* and Word20.* and Word21.* and Word22.* and Word23.* and Word24.* and Word25.* and Word26.* and Word27.* and Word28.* and Word29.* and Word30.* and Word31.* and Word32.* and Word64.* and Real.* and Real32.* and Real64.* and LargeReal.* _overload 4 / : 'a * 'a -> 'a as Real./ and Real32./ and Real64./ and LargeReal./ _overload 3 div : 'a * 'a -> 'a as Int.div and IntInf.div and LargeInt.div and FixedInt.div and Position.div and Int2.div and Int3.div and Int4.div and Int5.div and Int6.div and Int7.div and Int8.div and Int9.div and Int10.div and Int11.div and Int12.div and Int13.div and Int14.div and Int15.div and Int16.div and Int17.div and Int18.div and Int19.div and Int20.div and Int21.div and Int22.div and Int23.div and Int24.div and Int25.div and Int26.div and Int27.div and Int28.div and Int29.div and Int30.div and Int31.div and Int32.div and Int64.div and Word.div and LargeWord.div and SysWord.div and Word1.div and Word2.div and Word3.div and Word4.div and Word5.div and Word6.div and Word7.div and Word8.div and Word9.div and Word10.div and Word11.div and Word12.div and Word13.div and Word14.div and Word15.div and Word16.div and Word17.div and Word18.div and Word19.div and Word20.div and Word21.div and Word22.div and Word23.div and Word24.div and Word25.div and Word26.div and Word27.div and Word28.div and Word29.div and Word30.div and Word31.div and Word32.div and Word64.div _overload 3 mod : 'a * 'a -> 'a as Int.mod and IntInf.mod and LargeInt.mod and FixedInt.mod and Position.mod and Int2.mod and Int3.mod and Int4.mod and Int5.mod and Int6.mod and Int7.mod and Int8.mod and Int9.mod and Int10.mod and Int11.mod and Int12.mod and Int13.mod and Int14.mod and Int15.mod and Int16.mod and Int17.mod and Int18.mod and Int19.mod and Int20.mod and Int21.mod and Int22.mod and Int23.mod and Int24.mod and Int25.mod and Int26.mod and Int27.mod and Int28.mod and Int29.mod and Int30.mod and Int31.mod and Int32.mod and Int64.mod and Word.mod and LargeWord.mod and SysWord.mod and Word1.mod and Word2.mod and Word3.mod and Word4.mod and Word5.mod and Word6.mod and Word7.mod and Word8.mod and Word9.mod and Word10.mod and Word11.mod and Word12.mod and Word13.mod and Word14.mod and Word15.mod and Word16.mod and Word17.mod and Word18.mod and Word19.mod and Word20.mod and Word21.mod and Word22.mod and Word23.mod and Word24.mod and Word25.mod and Word26.mod and Word27.mod and Word28.mod and Word29.mod and Word30.mod and Word31.mod and Word32.mod and Word64.mod _overload 3 abs : 'a -> 'a as Int.abs and IntInf.abs and LargeInt.abs and FixedInt.abs and Position.abs and Int2.abs and Int3.abs and Int4.abs and Int5.abs and Int6.abs and Int7.abs and Int8.abs and Int9.abs and Int10.abs and Int11.abs and Int12.abs and Int13.abs and Int14.abs and Int15.abs and Int16.abs and Int17.abs and Int18.abs and Int19.abs and Int20.abs and Int21.abs and Int22.abs and Int23.abs and Int24.abs and Int25.abs and Int26.abs and Int27.abs and Int28.abs and Int29.abs and Int30.abs and Int31.abs and Int32.abs and Int64.abs and Real.abs and Real32.abs and Real64.abs and LargeReal.abs _overload 1 < : 'a * 'a -> bool as Int.< and IntInf.< and LargeInt.< and FixedInt.< and Position.< and Int2.< and Int3.< and Int4.< and Int5.< and Int6.< and Int7.< and Int8.< and Int9.< and Int10.< and Int11.< and Int12.< and Int13.< and Int14.< and Int15.< and Int16.< and Int17.< and Int18.< and Int19.< and Int20.< and Int21.< and Int22.< and Int23.< and Int24.< and Int25.< and Int26.< and Int27.< and Int28.< and Int29.< and Int30.< and Int31.< and Int32.< and Int64.< and Word.< and LargeWord.< and SysWord.< and Word1.< and Word2.< and Word3.< and Word4.< and Word5.< and Word6.< and Word7.< and Word8.< and Word9.< and Word10.< and Word11.< and Word12.< and Word13.< and Word14.< and Word15.< and Word16.< and Word17.< and Word18.< and Word19.< and Word20.< and Word21.< and Word22.< and Word23.< and Word24.< and Word25.< and Word26.< and Word27.< and Word28.< and Word29.< and Word30.< and Word31.< and Word32.< and Word64.< and Real.< and Real32.< and Real64.< and LargeReal.< and Char.< and WideChar.< and String.< and WideString.< _overload 1 <= : 'a * 'a -> bool as Int.<= and IntInf.<= and LargeInt.<= and FixedInt.<= and Position.<= and Int2.<= and Int3.<= and Int4.<= and Int5.<= and Int6.<= and Int7.<= and Int8.<= and Int9.<= and Int10.<= and Int11.<= and Int12.<= and Int13.<= and Int14.<= and Int15.<= and Int16.<= and Int17.<= and Int18.<= and Int19.<= and Int20.<= and Int21.<= and Int22.<= and Int23.<= and Int24.<= and Int25.<= and Int26.<= and Int27.<= and Int28.<= and Int29.<= and Int30.<= and Int31.<= and Int32.<= and Int64.<= and Word.<= and LargeWord.<= and SysWord.<= and Word1.<= and Word2.<= and Word3.<= and Word4.<= and Word5.<= and Word6.<= and Word7.<= and Word8.<= and Word9.<= and Word10.<= and Word11.<= and Word12.<= and Word13.<= and Word14.<= and Word15.<= and Word16.<= and Word17.<= and Word18.<= and Word19.<= and Word20.<= and Word21.<= and Word22.<= and Word23.<= and Word24.<= and Word25.<= and Word26.<= and Word27.<= and Word28.<= and Word29.<= and Word30.<= and Word31.<= and Word32.<= and Word64.<= and Real.<= and Real32.<= and Real64.<= and LargeReal.<= and Char.<= and WideChar.<= and String.<= and WideString.<= _overload 1 > : 'a * 'a -> bool as Int.> and IntInf.> and LargeInt.> and FixedInt.> and Position.> and Int2.> and Int3.> and Int4.> and Int5.> and Int6.> and Int7.> and Int8.> and Int9.> and Int10.> and Int11.> and Int12.> and Int13.> and Int14.> and Int15.> and Int16.> and Int17.> and Int18.> and Int19.> and Int20.> and Int21.> and Int22.> and Int23.> and Int24.> and Int25.> and Int26.> and Int27.> and Int28.> and Int29.> and Int30.> and Int31.> and Int32.> and Int64.> and Word.> and LargeWord.> and SysWord.> and Word1.> and Word2.> and Word3.> and Word4.> and Word5.> and Word6.> and Word7.> and Word8.> and Word9.> and Word10.> and Word11.> and Word12.> and Word13.> and Word14.> and Word15.> and Word16.> and Word17.> and Word18.> and Word19.> and Word20.> and Word21.> and Word22.> and Word23.> and Word24.> and Word25.> and Word26.> and Word27.> and Word28.> and Word29.> and Word30.> and Word31.> and Word32.> and Word64.> and Real.> and Real32.> and Real64.> and LargeReal.> and Char.> and WideChar.> and String.> and WideString.> _overload 1 >= : 'a * 'a -> bool as Int.>= and IntInf.>= and LargeInt.>= and FixedInt.>= and Position.>= and Int2.>= and Int3.>= and Int4.>= and Int5.>= and Int6.>= and Int7.>= and Int8.>= and Int9.>= and Int10.>= and Int11.>= and Int12.>= and Int13.>= and Int14.>= and Int15.>= and Int16.>= and Int17.>= and Int18.>= and Int19.>= and Int20.>= and Int21.>= and Int22.>= and Int23.>= and Int24.>= and Int25.>= and Int26.>= and Int27.>= and Int28.>= and Int29.>= and Int30.>= and Int31.>= and Int32.>= and Int64.>= and Word.>= and LargeWord.>= and SysWord.>= and Word1.>= and Word2.>= and Word3.>= and Word4.>= and Word5.>= and Word6.>= and Word7.>= and Word8.>= and Word9.>= and Word10.>= and Word11.>= and Word12.>= and Word13.>= and Word14.>= and Word15.>= and Word16.>= and Word17.>= and Word18.>= and Word19.>= and Word20.>= and Word21.>= and Word22.>= and Word23.>= and Word24.>= and Word25.>= and Word26.>= and Word27.>= and Word28.>= and Word29.>= and Word30.>= and Word31.>= and Word32.>= and Word64.>= and Real.>= and Real32.>= and Real64.>= and LargeReal.>= and Char.>= and WideChar.>= and String.>= and WideString.>= mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/pervasive-equal.sml000066400000000000000000000004161416264345000267420ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure B = Basis2002 : BASIS_2002_EQUAL in open B end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/pervasive-exns.sml000066400000000000000000000004151416264345000266070ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_EXNS = Basis2002 in open B end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/pervasive-types.sml000066400000000000000000000004161416264345000267770ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_TYPES = Basis2002 in open B end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/pervasive-vals.sml000066400000000000000000000004151416264345000265770ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_VALS = Basis2002 in open B end mlton-20210117+dfsg/basis-library/libs/basis-2002/top-level/top-level.sml000066400000000000000000000057351416264345000255510ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) open Basis2002 (* Rebind some structures so that their definitions appear later, so that they * will be used for displaying tycon names. * * Order here matters! Do not alphabetize or otherwise reorder without thinking. *) structure Posix = Posix structure OS = OS structure BoolArray = BoolArray structure BoolArray2 = BoolArray2 structure BoolVector = BoolVector structure CharArraySlice = CharArraySlice structure CharArray = CharArray structure CharArray2 = CharArray2 structure Int8Array = Int8Array structure Int8Array2 = Int8Array2 structure Int8Vector = Int8Vector structure Int16Array = Int16Array structure Int16Array2 = Int16Array2 structure Int16Vector = Int16Vector structure Int32Array = Int32Array structure Int32Array2 = Int32Array2 structure Int32Vector = Int32Vector structure Int64Array = Int64Array structure Int64Array2 = Int64Array2 structure Int64Vector = Int64Vector structure IntArray = IntArray structure IntArray2 = IntArray2 structure IntVector = IntVector structure LargeIntArray = LargeIntArray structure LargeIntArray2 = LargeIntArray2 structure LargeIntVector = LargeIntVector structure LargeRealArray = LargeRealArray structure LargeRealArray2 = LargeRealArray2 structure LargeRealVector = LargeRealVector structure LargeWordArray = LargeWordArray structure LargeWordArray2 = LargeWordArray2 structure LargeWordVector = LargeWordVector structure Real32Array = Real32Array structure Real32Array2 = Real32Array2 structure Real32Vector = Real32Vector structure Real64Array = Real64Array structure Real64Array2 = Real64Array2 structure Real64Vector = Real64Vector structure RealArray = RealArray structure RealArray2 = RealArray2 structure RealVector = RealVector structure Word8Array = Word8Array structure Word8Array2 = Word8Array2 structure Word8Vector = Word8Vector structure Word16Array = Word16Array structure Word16Array2 = Word16Array2 structure Word16Vector = Word16Vector structure Word32Array = Word32Array structure Word32Array2 = Word32Array2 structure Word32Vector = Word32Vector structure Word64Array = Word64Array structure Word64Array2 = Word64Array2 structure Word64Vector = Word64Vector structure WordArray = WordArray structure WordArray2 = WordArray2 structure WordVector = WordVector structure Array = Array structure Array2 = Array2 structure Vector = Vector structure Int8 = Int8 structure Int16 = Int16 structure Int32 = Int32 structure Int64 = Int64 structure IntInf = IntInf structure LargeInt = LargeInt structure Int = Int structure Real32 = Real32 structure Real64 = Real64 structure LargeReal = LargeReal structure Real = Real structure Word8 = Word8 structure Word16 = Word16 structure Word32 = Word32 structure Word64 = Word64 structure LargeWord = LargeWord structure Word = Word mlton-20210117+dfsg/basis-library/libs/basis-extra/000077500000000000000000000000001416264345000217445ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-extra/basis-extra.mlb000066400000000000000000000013771416264345000246720ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local ../../build/sources.mlb ann "allowSpecifySpecialIds true" in top-level/basis.sig end ann "allowRedefineSpecialIds true" in top-level/basis.sml end in structure BasisExtra top-level/basis-sigs.sml top-level/basis-funs.sml top-level/top-level.sml end end mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/000077500000000000000000000000001416264345000236535ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/basis-funs.sml000066400000000000000000000006741416264345000264510ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = PrimIO (S) functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIO (S) functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = ImperativeIO (S) mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/basis-sigs.sml000066400000000000000000000071311416264345000264360ustar00rootroot00000000000000(* Copyright (C) 2013 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature ARRAY = ARRAY signature ARRAY_SLICE = ARRAY_SLICE signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature CHAR = CHAR signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL signature IMPERATIVE_IO = IMPERATIVE_IO signature INTEGER = INTEGER signature INT_INF = INT_INF signature IO = IO signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature MATH = MATH signature MONO_ARRAY = MONO_ARRAY signature MONO_ARRAY_SLICE = MONO_ARRAY_SLICE signature MONO_VECTOR = MONO_VECTOR signature MONO_VECTOR_SLICE = MONO_VECTOR_SLICE signature OPTION = OPTION signature OS = OS signature OS_FILE_SYS = OS_FILE_SYS signature OS_IO = OS_IO signature OS_PATH = OS_PATH signature OS_PROCESS = OS_PROCESS signature PRIM_IO = PRIM_IO signature REAL = REAL signature STREAM_IO = STREAM_IO signature STRING = STRING signature STRING_CVT = STRING_CVT signature SUBSTRING = SUBSTRING signature TEXT = TEXT signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature TIME = TIME signature TIMER = TIMER signature VECTOR = VECTOR signature VECTOR_SLICE = VECTOR_SLICE signature WORD = WORD (* Optional signatures *) signature ARRAY2 = ARRAY2 signature BIT_FLAGS = BIT_FLAGS signature GENERIC_SOCK = GENERIC_SOCK signature INET_SOCK = INET_SOCK signature INT_INF = INT_INF signature MONO_ARRAY2 = MONO_ARRAY2 signature NET_HOST_DB = NET_HOST_DB signature NET_PROT_DB = NET_PROT_DB signature NET_SERV_DB = NET_SERV_DB signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX = POSIX signature POSIX_ERROR = POSIX_ERROR signature POSIX_FILE_SYS = POSIX_FILE_SYS signature POSIX_IO = POSIX_IO signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_PROCESS = POSIX_PROCESS signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY signature SOCKET = SOCKET signature UNIX = UNIX signature UNIX_SOCK = UNIX_SOCK (* signature WINDOWS = WINDOWS *) (* Non-standard signatures *) signature PRIM_IO_ARG = PRIM_IO_ARG signature STREAM_IO_ARG = STREAM_IO_ARG signature IMPERATIVE_IO_ARG = IMPERATIVE_IO_ARG signature SML90 = SML90 signature MLTON = MLTON signature MLTON_ARRAY = MLTON_ARRAY signature MLTON_BIN_IO = MLTON_BIN_IO signature MLTON_CONT = MLTON_CONT signature MLTON_EXN = MLTON_EXN signature MLTON_FINALIZABLE = MLTON_FINALIZABLE signature MLTON_GC = MLTON_GC signature MLTON_INT_INF = MLTON_INT_INF signature MLTON_IO = MLTON_IO signature MLTON_ITIMER = MLTON_ITIMER signature MLTON_MONO_ARRAY = MLTON_MONO_ARRAY signature MLTON_MONO_VECTOR = MLTON_MONO_VECTOR signature MLTON_PLATFORM = MLTON_PLATFORM signature MLTON_POINTER = MLTON_POINTER signature MLTON_PROC_ENV = MLTON_PROC_ENV signature MLTON_PROCESS = MLTON_PROCESS signature MLTON_PROFILE = MLTON_PROFILE signature MLTON_RANDOM = MLTON_RANDOM signature MLTON_REAL = MLTON_REAL signature MLTON_RLIMIT = MLTON_RLIMIT signature MLTON_RUSAGE = MLTON_RUSAGE signature MLTON_SIGNAL = MLTON_SIGNAL signature MLTON_SYSLOG = MLTON_SYSLOG signature MLTON_TEXT_IO = MLTON_TEXT_IO signature MLTON_THREAD = MLTON_THREAD signature MLTON_VECTOR = MLTON_VECTOR signature MLTON_WEAK = MLTON_WEAK signature MLTON_WORD = MLTON_WORD signature MLTON_WORLD = MLTON_WORLD signature SML_OF_NJ = SML_OF_NJ signature UNSAFE = UNSAFE mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/basis.sig000066400000000000000000001142601416264345000254640ustar00rootroot00000000000000signature BASIS_EXTRA = sig (* Top-level types *) eqtype 'a array datatype bool = datatype bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list datatype ref = datatype ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val = : ''a * ''a -> bool val <> : ''a * ''a -> bool val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector (* Required structures *) structure Array : ARRAY structure ArraySlice : ARRAY_SLICE structure BinIO : BIN_IO structure BinPrimIO : PRIM_IO structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY structure CharArraySlice : MONO_ARRAY_SLICE structure CharVector : MONO_VECTOR structure CharVectorSlice : MONO_VECTOR_SLICE structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL structure Int : INTEGER structure IO : IO structure LargeInt : INTEGER structure LargeReal : REAL structure LargeWord : WORD structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS structure Position : INTEGER structure Real : REAL structure StringCvt : STRING_CVT structure String : STRING structure Substring : SUBSTRING structure TextIO : TEXT_IO structure TextPrimIO : PRIM_IO structure Text : TEXT structure Time : TIME structure Timer : TIMER structure VectorSlice : VECTOR_SLICE structure Vector : VECTOR structure Word : WORD structure Word8: WORD structure Word8Array : MONO_ARRAY structure Word8Array2 : MONO_ARRAY2 structure Word8ArraySlice : MONO_ARRAY_SLICE structure Word8Vector : MONO_VECTOR structure Word8VectorSlice : MONO_VECTOR_SLICE (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY structure BoolArray2 : MONO_ARRAY2 structure BoolArraySlice : MONO_ARRAY_SLICE structure BoolVector : MONO_VECTOR structure BoolVectorSlice : MONO_VECTOR_SLICE structure CharArray2 : MONO_ARRAY2 structure FixedInt : INTEGER structure GenericSock : GENERIC_SOCK structure INetSock : INET_SOCK structure IntArray : MONO_ARRAY structure IntArray2 : MONO_ARRAY2 structure IntArraySlice : MONO_ARRAY_SLICE structure IntVector : MONO_VECTOR structure IntVectorSlice : MONO_VECTOR_SLICE structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure Int8Array : MONO_ARRAY structure Int8Array2 : MONO_ARRAY2 structure Int8ArraySlice : MONO_ARRAY_SLICE structure Int8Vector : MONO_VECTOR structure Int8VectorSlice : MONO_VECTOR_SLICE structure Int16Array : MONO_ARRAY structure Int16Array2 : MONO_ARRAY2 structure Int16ArraySlice : MONO_ARRAY_SLICE structure Int16Vector : MONO_VECTOR structure Int16VectorSlice : MONO_VECTOR_SLICE structure Int32Array : MONO_ARRAY structure Int32Array2 : MONO_ARRAY2 structure Int32ArraySlice : MONO_ARRAY_SLICE structure Int32Vector : MONO_VECTOR structure Int32VectorSlice : MONO_VECTOR_SLICE structure Int64Array : MONO_ARRAY structure Int64Array2 : MONO_ARRAY2 structure Int64ArraySlice : MONO_ARRAY_SLICE structure Int64Vector : MONO_VECTOR structure Int64VectorSlice : MONO_VECTOR_SLICE structure IntInf : INT_INF structure IntInfArray : MONO_ARRAY structure IntInfArray2 : MONO_ARRAY2 structure IntInfArraySlice : MONO_ARRAY_SLICE structure IntInfVector : MONO_VECTOR structure IntInfVectorSlice : MONO_VECTOR_SLICE structure LargeIntArray : MONO_ARRAY structure LargeIntArray2 : MONO_ARRAY2 structure LargeIntArraySlice : MONO_ARRAY_SLICE structure LargeIntVector : MONO_VECTOR structure LargeIntVectorSlice : MONO_VECTOR_SLICE structure LargeRealArray : MONO_ARRAY structure LargeRealArray2 : MONO_ARRAY2 structure LargeRealArraySlice : MONO_ARRAY_SLICE structure LargeRealVector : MONO_VECTOR structure LargeRealVectorSlice : MONO_VECTOR_SLICE structure LargeWordArray : MONO_ARRAY structure LargeWordArray2 : MONO_ARRAY2 structure LargeWordArraySlice : MONO_ARRAY_SLICE structure LargeWordVector : MONO_VECTOR structure LargeWordVectorSlice : MONO_VECTOR_SLICE structure NetHostDB : NET_HOST_DB structure NetProtDB : NET_PROT_DB structure NetServDB : NET_SERV_DB structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD structure Posix : POSIX structure RealArray : MONO_ARRAY structure RealArray2 : MONO_ARRAY2 structure RealArraySlice : MONO_ARRAY_SLICE structure RealVector : MONO_VECTOR structure RealVectorSlice : MONO_VECTOR_SLICE structure Real32 : REAL structure Real32Array : MONO_ARRAY structure Real32Array2 : MONO_ARRAY2 structure Real32ArraySlice : MONO_ARRAY_SLICE structure Real32Vector : MONO_VECTOR structure Real32VectorSlice : MONO_VECTOR_SLICE structure Real64 : REAL structure Real64Array : MONO_ARRAY structure Real64Array2 : MONO_ARRAY2 structure Real64ArraySlice : MONO_ARRAY_SLICE structure Real64Vector : MONO_VECTOR structure Real64VectorSlice : MONO_VECTOR_SLICE structure Socket : SOCKET structure SysWord : WORD structure Unix : UNIX structure UnixSock : UNIX_SOCK structure WideChar : CHAR structure WideCharArray : MONO_ARRAY structure WideCharArray2 : MONO_ARRAY2 structure WideCharArraySlice : MONO_ARRAY_SLICE structure WideCharVector : MONO_VECTOR structure WideCharVectorSlice : MONO_VECTOR_SLICE structure WideString : STRING structure WideSubstring : SUBSTRING structure WideText : TEXT (* structure WideTextIO : TEXT_IO structure WideTextPrimIO : PRIM_IO *) (* structure Windows : WINDOWS *) structure WordArray : MONO_ARRAY structure WordArray2 : MONO_ARRAY2 structure WordArraySlice : MONO_ARRAY_SLICE structure WordVector : MONO_VECTOR structure WordVectorSlice : MONO_VECTOR_SLICE structure Word1: WORD structure Word2: WORD structure Word3: WORD structure Word4: WORD structure Word5: WORD structure Word6: WORD structure Word7: WORD (* structure Word8: WORD (* Word8 is a required structure *)*) structure Word9: WORD structure Word10: WORD structure Word11: WORD structure Word12: WORD structure Word13: WORD structure Word14: WORD structure Word15: WORD structure Word16: WORD structure Word17: WORD structure Word18: WORD structure Word19: WORD structure Word20: WORD structure Word21: WORD structure Word22: WORD structure Word23: WORD structure Word24: WORD structure Word25: WORD structure Word26: WORD structure Word27: WORD structure Word28: WORD structure Word29: WORD structure Word30: WORD structure Word31: WORD structure Word32: WORD structure Word64: WORD structure Word16Array : MONO_ARRAY structure Word16Array2 : MONO_ARRAY2 structure Word16ArraySlice : MONO_ARRAY_SLICE structure Word16Vector : MONO_VECTOR structure Word16VectorSlice : MONO_VECTOR_SLICE structure Word32Array : MONO_ARRAY structure Word32Array2 : MONO_ARRAY2 structure Word32ArraySlice : MONO_ARRAY_SLICE structure Word32Vector : MONO_VECTOR structure Word32VectorSlice : MONO_VECTOR_SLICE structure Word64Array : MONO_ARRAY structure Word64Array2 : MONO_ARRAY2 structure Word64ArraySlice : MONO_ARRAY_SLICE structure Word64Vector : MONO_VECTOR structure Word64VectorSlice : MONO_VECTOR_SLICE (* Non-standard structures *) structure SML90: SML90 structure MLton: MLTON structure SMLofNJ: SML_OF_NJ structure Unsafe: UNSAFE sharing type MLton.IntInf.t = IntInf.int sharing type MLton.Process.pid = Posix.Process.pid sharing type MLton.ProcEnv.gid = Posix.ProcEnv.gid sharing type MLton.LargeReal.t = LargeReal.real sharing type MLton.LargeWord.t = LargeWord.word sharing type MLton.Real.t = Real.real sharing type MLton.Real32.t = Real32.real sharing type MLton.Real64.t = Real64.real sharing type MLton.Signal.t = Posix.Signal.signal sharing type MLton.Word.t = Word.word sharing type MLton.Word8.t = Word8.word sharing type MLton.Word16.t = Word16.word sharing type MLton.Word32.t = Word32.word sharing type MLton.Word64.t = Word64.word sharing Unsafe.BoolArray = BoolArray sharing Unsafe.BoolVector = BoolVector sharing Unsafe.CharArray = CharArray sharing Unsafe.CharVector = CharVector sharing Unsafe.IntArray = IntArray sharing Unsafe.IntVector = IntVector sharing Unsafe.Int8Array = Int8Array sharing Unsafe.Int8Vector = Int8Vector sharing Unsafe.Int16Array = Int16Array sharing Unsafe.Int16Vector = Int16Vector sharing Unsafe.Int32Array = Int32Array sharing Unsafe.Int32Vector = Int32Vector sharing Unsafe.Int64Array = Int64Array sharing Unsafe.Int64Vector = Int64Vector sharing Unsafe.IntInfArray = IntInfArray sharing Unsafe.IntInfVector = IntInfVector sharing Unsafe.LargeIntArray = LargeIntArray sharing Unsafe.LargeIntVector = LargeIntVector sharing Unsafe.LargeRealArray = LargeRealArray sharing Unsafe.LargeRealVector = LargeRealVector sharing Unsafe.LargeWordArray = LargeWordArray sharing Unsafe.LargeWordVector = LargeWordVector sharing Unsafe.RealArray = RealArray sharing Unsafe.RealVector = RealVector sharing Unsafe.Real32Array = Real32Array sharing Unsafe.Real32Vector = Real32Vector sharing Unsafe.Real64Array = Real64Array sharing Unsafe.Real64Vector = Real64Vector sharing Unsafe.WordArray = WordArray sharing Unsafe.WordVector = WordVector sharing Unsafe.Word8Array = Word8Array sharing Unsafe.Word8Vector = Word8Vector sharing Unsafe.Word16Array = Word16Array sharing Unsafe.Word16Vector = Word16Vector sharing Unsafe.Word32Array = Word32Array sharing Unsafe.Word32Vector = Word32Vector sharing Unsafe.Word64Array = Word64Array sharing Unsafe.Word64Vector = Word64Vector sharing Unsafe.PackReal32Big = PackReal32Big sharing Unsafe.PackReal32Little = PackReal32Little sharing Unsafe.PackReal64Big = PackReal64Big sharing Unsafe.PackReal64Little = PackReal64Little sharing Unsafe.PackRealBig = PackRealBig sharing Unsafe.PackRealLittle = PackRealLittle sharing Unsafe.PackWord16Big = PackWord16Big sharing Unsafe.PackWord16Little = PackWord16Little sharing Unsafe.PackWord32Big = PackWord32Big sharing Unsafe.PackWord32Little = PackWord32Little sharing Unsafe.PackWord64Big = PackWord64Big sharing Unsafe.PackWord64Little = PackWord64Little (* ************************************************** *) (* ************************************************** *) (* Sharing constraints *) (* Top-level types *) sharing type unit = General.unit sharing type int = Int.int sharing type word = Word.word sharing type real = Real.real sharing type char = Char.char sharing type string = String.string sharing type substring = Substring.substring sharing type exn = General.exn (* Can't use sharing on type array or vector, because they are rigid tycons. * Don't need it anyways, since it's built into the ARRAY and VECTOR signatures. *) (* sharing type array = Array.array sharing type vector = Vector.vector *) (* sharing type ref = General.ref *) (* sharing type bool = Bool.bool *) sharing type option = Option.option sharing type order = General.order (* sharing type list = List.list *) (* Required structures *) (* sharing type BinIO.StreamIO.elem = Word8.word *) sharing type BinIO.StreamIO.reader = BinPrimIO.reader sharing type BinIO.StreamIO.pos = BinPrimIO.pos (* sharing type BinIO.StreamIO.vector = Word8Vector.vector *) sharing type BinIO.StreamIO.writer = BinPrimIO.writer sharing type BinPrimIO.array = Word8Array.array sharing type BinPrimIO.array_slice = Word8ArraySlice.slice sharing type BinPrimIO.elem = Word8.word sharing type BinPrimIO.pos = Position.int sharing type BinPrimIO.vector = Word8Vector.vector sharing type BinPrimIO.vector_slice = Word8VectorSlice.slice sharing type Char.char = char sharing type Char.string = String.string sharing type CharArray.elem = char sharing type CharArray.vector = CharVector.vector sharing type CharArraySlice.elem = char sharing type CharArraySlice.array = CharArray.array sharing type CharArraySlice.vector = CharVector.vector sharing type CharArraySlice.vector_slice = CharVectorSlice.slice sharing type CharVector.elem = char sharing type CharVector.vector = String.string sharing type CharVectorSlice.elem = char sharing type CharVectorSlice.vector = String.string sharing type CharVectorSlice.slice = Substring.substring sharing type Int.int = int sharing type Math.real = Real.real sharing type Real.real = real sharing type String.string = string sharing type String.string = CharVector.vector sharing type String.char = Char.char sharing type Substring.substring = CharVectorSlice.slice sharing type Substring.string = String.string sharing type Substring.char = Char.char sharing type Text.Char.char = Char.char sharing type Text.String.string = String.string sharing type Text.Substring.substring = Substring.substring sharing type Text.CharVector.vector = CharVector.vector sharing type Text.CharArray.array = CharArray.array sharing type Text.CharArraySlice.slice = CharArraySlice.slice sharing type Text.CharVectorSlice.slice = CharVectorSlice.slice (* redundant *) (* sharing type TextIO.elem = char sharing type TextIO.vector = string *) sharing type TextPrimIO.array = CharArray.array sharing type TextPrimIO.array_slice = CharArraySlice.slice sharing type TextPrimIO.elem = Char.char sharing type TextPrimIO.pos = Position.int sharing type TextPrimIO.vector = CharVector.vector sharing type TextPrimIO.vector_slice = CharVectorSlice.slice sharing type Word.word = word sharing type Word8Array.elem = Word8.word sharing type Word8Array.vector = Word8Vector.vector sharing type Word8ArraySlice.elem = Word8.word sharing type Word8ArraySlice.array = Word8Array.array sharing type Word8ArraySlice.vector = Word8Vector.vector sharing type Word8ArraySlice.vector_slice = Word8VectorSlice.slice sharing type Word8Vector.elem = Word8.word sharing type Word8VectorSlice.elem = Word8.word sharing type Word8VectorSlice.vector = Word8Vector.vector sharing type Word8Array2.elem = Word8.word sharing type Word8Array2.vector = Word8Vector.vector (* Optional structures *) sharing type BoolArray.vector = BoolVector.vector sharing type BoolArraySlice.array = BoolArray.array sharing type BoolArraySlice.vector = BoolVector.vector sharing type BoolArraySlice.vector_slice = BoolVectorSlice.slice sharing type BoolVectorSlice.vector = BoolVector.vector sharing type BoolArray2.vector = BoolVector.vector sharing type CharArray2.elem = char sharing type CharArray2.vector = CharVector.vector sharing type IntArray.elem = int sharing type IntArray.vector = IntVector.vector sharing type IntArraySlice.elem = int sharing type IntArraySlice.array = IntArray.array sharing type IntArraySlice.vector = IntVector.vector sharing type IntArraySlice.vector_slice = IntVectorSlice.slice sharing type IntVector.elem = int sharing type IntVectorSlice.elem = int sharing type IntVectorSlice.vector = IntVector.vector sharing type IntArray2.elem = int sharing type IntArray2.vector = IntVector.vector sharing type Int8Array.elem = Int8.int sharing type Int8Array.vector = Int8Vector.vector sharing type Int8ArraySlice.elem = Int8.int sharing type Int8ArraySlice.array = Int8Array.array sharing type Int8ArraySlice.vector = Int8Vector.vector sharing type Int8ArraySlice.vector_slice = Int8VectorSlice.slice sharing type Int8Vector.elem = Int8.int sharing type Int8VectorSlice.elem = Int8.int sharing type Int8VectorSlice.vector = Int8Vector.vector sharing type Int8Array2.elem = Int8.int sharing type Int8Array2.vector = Int8Vector.vector sharing type Int16Array.elem = Int16.int sharing type Int16Array.vector = Int16Vector.vector sharing type Int16ArraySlice.elem = Int16.int sharing type Int16ArraySlice.array = Int16Array.array sharing type Int16ArraySlice.vector = Int16Vector.vector sharing type Int16ArraySlice.vector_slice = Int16VectorSlice.slice sharing type Int16Vector.elem = Int16.int sharing type Int16VectorSlice.elem = Int16.int sharing type Int16VectorSlice.vector = Int16Vector.vector sharing type Int16Array2.elem = Int16.int sharing type Int16Array2.vector = Int16Vector.vector sharing type Int32Array.elem = Int32.int sharing type Int32Array.vector = Int32Vector.vector sharing type Int32ArraySlice.elem = Int32.int sharing type Int32ArraySlice.array = Int32Array.array sharing type Int32ArraySlice.vector = Int32Vector.vector sharing type Int32ArraySlice.vector_slice = Int32VectorSlice.slice sharing type Int32Vector.elem = Int32.int sharing type Int32VectorSlice.elem = Int32.int sharing type Int32VectorSlice.vector = Int32Vector.vector sharing type Int32Array2.elem = Int32.int sharing type Int32Array2.vector = Int32Vector.vector sharing type Int64Array.elem = Int64.int sharing type Int64Array.vector = Int64Vector.vector sharing type Int64ArraySlice.elem = Int64.int sharing type Int64ArraySlice.array = Int64Array.array sharing type Int64ArraySlice.vector = Int64Vector.vector sharing type Int64ArraySlice.vector_slice = Int64VectorSlice.slice sharing type Int64Vector.elem = Int64.int sharing type Int64VectorSlice.elem = Int64.int sharing type Int64VectorSlice.vector = Int64Vector.vector sharing type Int64Array2.elem = Int64.int sharing type Int64Array2.vector = Int64Vector.vector sharing type LargeIntArray.elem = LargeInt.int sharing type LargeIntArray.vector = LargeIntVector.vector sharing type LargeIntArraySlice.elem = LargeInt.int sharing type LargeIntArraySlice.array = LargeIntArray.array sharing type LargeIntArraySlice.vector = LargeIntVector.vector sharing type LargeIntArraySlice.vector_slice = LargeIntVectorSlice.slice sharing type LargeIntVector.elem = LargeInt.int sharing type LargeIntVectorSlice.elem = LargeInt.int sharing type LargeIntVectorSlice.vector = LargeIntVector.vector sharing type LargeIntArray2.elem = LargeInt.int sharing type LargeIntArray2.vector = LargeIntVector.vector sharing type LargeRealArray.elem = LargeReal.real sharing type LargeRealArray.vector = LargeRealVector.vector sharing type LargeRealArraySlice.elem = LargeReal.real sharing type LargeRealArraySlice.array = LargeRealArray.array sharing type LargeRealArraySlice.vector = LargeRealVector.vector sharing type LargeRealArraySlice.vector_slice = LargeRealVectorSlice.slice sharing type LargeRealVector.elem = LargeReal.real sharing type LargeRealVectorSlice.elem = LargeReal.real sharing type LargeRealVectorSlice.vector = LargeRealVector.vector sharing type LargeRealArray2.elem = LargeReal.real sharing type LargeRealArray2.vector = LargeRealVector.vector sharing type LargeWordArray.elem = LargeWord.word sharing type LargeWordArray.vector = LargeWordVector.vector sharing type LargeWordArraySlice.elem = LargeWord.word sharing type LargeWordArraySlice.array = LargeWordArray.array sharing type LargeWordArraySlice.vector = LargeWordVector.vector sharing type LargeWordArraySlice.vector_slice = LargeWordVectorSlice.slice sharing type LargeWordVector.elem = LargeWord.word sharing type LargeWordVectorSlice.elem = LargeWord.word sharing type LargeWordVectorSlice.vector = LargeWordVector.vector sharing type LargeWordArray2.elem = LargeWord.word sharing type LargeWordArray2.vector = LargeWordVector.vector sharing type PackRealBig.real = real sharing type PackRealLittle.real = real sharing type PackReal32Big.real = Real32.real sharing type PackReal32Little.real = Real32.real sharing type PackReal64Big.real = Real64.real sharing type PackReal64Little.real = Real64.real sharing type Posix.Error.syserror = OS.syserror sharing type Posix.IO.file_desc = Posix.ProcEnv.file_desc sharing type Posix.FileSys.dirstream = OS.FileSys.dirstream sharing type Posix.FileSys.access_mode = OS.FileSys.access_mode sharing type Posix.Process.exit_status = Unix.exit_status sharing type Posix.Signal.signal = Unix.signal sharing type RealArray.elem = real sharing type RealArray.vector = RealVector.vector sharing type RealArraySlice.elem = real sharing type RealArraySlice.array = RealArray.array sharing type RealArraySlice.vector = RealVector.vector sharing type RealArraySlice.vector_slice = RealVectorSlice.slice sharing type RealVector.elem = real sharing type RealVectorSlice.elem = real sharing type RealVectorSlice.vector = RealVector.vector sharing type RealArray2.elem = real sharing type RealArray2.vector = RealVector.vector sharing type Real32Array.elem = Real32.real sharing type Real32Array.vector = Real32Vector.vector sharing type Real32ArraySlice.elem = Real32.real sharing type Real32ArraySlice.array = Real32Array.array sharing type Real32ArraySlice.vector = Real32Vector.vector sharing type Real32ArraySlice.vector_slice = Real32VectorSlice.slice sharing type Real32Vector.elem = Real32.real sharing type Real32VectorSlice.elem = Real32.real sharing type Real32VectorSlice.vector = Real32Vector.vector sharing type Real32Array2.elem = Real32.real sharing type Real32Array2.vector = Real32Vector.vector sharing type Real64Array.elem = Real64.real sharing type Real64Array.vector = Real64Vector.vector sharing type Real64ArraySlice.elem = Real64.real sharing type Real64ArraySlice.array = Real64Array.array sharing type Real64ArraySlice.vector = Real64Vector.vector sharing type Real64ArraySlice.vector_slice = Real64VectorSlice.slice sharing type Real64Vector.elem = Real64.real sharing type Real64VectorSlice.elem = Real64.real sharing type Real64VectorSlice.vector = Real64Vector.vector sharing type Real64Array2.elem = Real64.real sharing type Real64Array2.vector = Real64Vector.vector sharing type Unix.exit_status = Posix.Process.exit_status sharing type WideChar.string = WideString.string sharing type WideCharArray.elem = WideChar.char sharing type WideCharArray.vector = WideCharVector.vector sharing type WideCharArray2.elem = WideChar.char sharing type WideCharArray2.vector = WideCharVector.vector sharing type WideCharArraySlice.elem = WideChar.char sharing type WideCharArraySlice.array = WideCharArray.array sharing type WideCharArraySlice.vector = WideCharVector.vector sharing type WideCharArraySlice.vector_slice = WideCharVectorSlice.slice sharing type WideCharVector.elem = WideChar.char sharing type WideCharVector.vector = WideString.string sharing type WideCharVectorSlice.elem = WideChar.char sharing type WideCharVectorSlice.slice = WideSubstring.substring sharing type WideCharVectorSlice.vector = WideString.string sharing type WideString.char = WideChar.char (* next two are redundant? basis & char both do it... *) sharing type WideString.string = WideCharVector.vector sharing type WideSubstring.substring = WideCharVectorSlice.slice sharing type WideSubstring.string = WideString.string sharing type WideSubstring.char = WideChar.char sharing type WideText.Char.char = WideChar.char sharing type WideText.String.string = WideString.string sharing type WideText.Substring.substring = WideSubstring.substring sharing type WideText.CharVector.vector = WideCharVector.vector sharing type WideText.CharArray.array = WideCharArray.array sharing type WideText.CharArraySlice.slice = WideCharArraySlice.slice sharing type WideText.CharVectorSlice.slice = WideCharVectorSlice.slice (* sharing type WideTextIO. sharing type WideTextPrimIO.array = WideCharArray.array sharing type WideTextPrimIO.vector = WideCharVector.vector sharing type WideTextPrimIO.elem = WideChar.char *) sharing type WordArray.elem = word sharing type WordArray.vector = WordVector.vector sharing type WordArraySlice.elem = word sharing type WordArraySlice.array = WordArray.array sharing type WordArraySlice.vector = WordVector.vector sharing type WordArraySlice.vector_slice = WordVectorSlice.slice sharing type WordVector.elem = word sharing type WordVectorSlice.elem = word sharing type WordVectorSlice.vector = WordVector.vector sharing type WordArray2.elem = word sharing type WordArray2.vector = WordVector.vector sharing type Word16Array.elem = Word16.word sharing type Word16Array.vector = Word16Vector.vector sharing type Word16ArraySlice.elem = Word16.word sharing type Word16ArraySlice.array = Word16Array.array sharing type Word16ArraySlice.vector = Word16Vector.vector sharing type Word16ArraySlice.vector_slice = Word16VectorSlice.slice sharing type Word16Vector.elem = Word16.word sharing type Word16VectorSlice.elem = Word16.word sharing type Word16VectorSlice.vector = Word16Vector.vector sharing type Word16Array2.elem = Word16.word sharing type Word16Array2.vector = Word16Vector.vector sharing type Word32Array.elem = Word32.word sharing type Word32Array.vector = Word32Vector.vector sharing type Word32ArraySlice.elem = Word32.word sharing type Word32ArraySlice.array = Word32Array.array sharing type Word32ArraySlice.vector = Word32Vector.vector sharing type Word32ArraySlice.vector_slice = Word32VectorSlice.slice sharing type Word32Vector.elem = Word32.word sharing type Word32VectorSlice.elem = Word32.word sharing type Word32VectorSlice.vector = Word32Vector.vector sharing type Word32Array2.elem = Word32.word sharing type Word32Array2.vector = Word32Vector.vector sharing type Word64Array.elem = Word64.word sharing type Word64Array.vector = Word64Vector.vector sharing type Word64ArraySlice.elem = Word64.word sharing type Word64ArraySlice.array = Word64Array.array sharing type Word64ArraySlice.vector = Word64Vector.vector sharing type Word64ArraySlice.vector_slice = Word64VectorSlice.slice sharing type Word64Vector.elem = Word64.word sharing type Word64VectorSlice.elem = Word64.word sharing type Word64VectorSlice.vector = Word64Vector.vector sharing type Word64Array2.elem = Word64.word sharing type Word64Array2.vector = Word64Vector.vector sharing type MLton.BinIO.instream = BinIO.instream sharing type MLton.BinIO.outstream = BinIO.outstream sharing type MLton.CharArray.t = CharArray.array sharing type MLton.CharArray.elem = CharArray.elem sharing type MLton.CharVector.t = CharVector.vector sharing type MLton.CharVector.elem = CharVector.elem sharing type MLton.TextIO.instream = TextIO.instream sharing type MLton.TextIO.outstream = TextIO.outstream sharing type MLton.Word8Array.t = Word8Array.array sharing type MLton.Word8Array.elem = Word8Array.elem sharing type MLton.Word8Vector.t = Word8Vector.vector sharing type MLton.Word8Vector.elem = Word8Vector.elem end (* bool is already defined as bool and so cannot be shared. * So, we where these to get the needed sharing. *) where type BoolArray.elem = bool where type BoolArray2.elem = bool where type BoolArraySlice.elem = bool where type BoolVector.elem = bool where type BoolVectorSlice.elem = bool (* Top-level types. These appear free in basis signatures and hence must be * the same in the basis as at the top level. *) where type 'a array = 'a array where type 'a option = 'a option where type 'a vector = 'a vector where type char = char where type exn = exn where type int = int where type order = order where type real = real where type string = string where type substring = substring where type unit = unit where type word = word (* Types referenced in signatures by structure name *) (* where type 'a Array.array = 'a Array.array *) where type Array2.traversal = Array2.traversal where type 'a ArraySlice.slice = 'a ArraySlice.slice where type BinIO.instream = BinIO.instream (* UNIX *) where type BinIO.outstream = BinIO.outstream (* UNIX *) where type BinPrimIO.reader = BinPrimIO.reader (* POSIX_IO *) where type BinPrimIO.writer = BinPrimIO.writer (* POSIX_IO *) where type IO.buffer_mode = IO.buffer_mode where type LargeInt.int = LargeInt.int where type LargeReal.real = LargeReal.real where type LargeWord.word = LargeWord.word where type IEEEReal.real_order = IEEEReal.real_order where type IEEEReal.float_class = IEEEReal.float_class where type IEEEReal.rounding_mode = IEEEReal.rounding_mode where type NetHostDB.in_addr = NetHostDB.in_addr where type NetHostDB.addr_family = NetHostDB.addr_family where type OS.IO.iodesc = OS.IO.iodesc (* PRIM_IO, POSIX_FILE_SYS *) where type OS.Process.status = OS.Process.status (* UNIX, POSIX_PROCESS *) where type Position.int = Position.int where type Posix.IO.file_desc = Posix.IO.file_desc where type Posix.Process.exit_status = Posix.Process.exit_status where type Posix.Signal.signal = Posix.Signal.signal where type Socket.dgram = Socket.dgram where type ('a, 'b) Socket.sock = ('a, 'b) Socket.sock where type 'a Socket.sock_addr = 'a Socket.sock_addr where type Socket.SOCK.sock_type = Socket.SOCK.sock_type (* GENERIC_SOCK *) where type 'a Socket.stream = 'a Socket.stream where type StringCvt.radix = StringCvt.radix where type StringCvt.realfmt = StringCvt.realfmt (* where type ('a, 'b) StringCvt.reader = ('a, 'b) StringCvt.reader *) where type SysWord.word = SysWord.word where type TextIO.instream = TextIO.instream (* UNIX *) where type TextIO.outstream = TextIO.outstream (* UNIX *) where type TextPrimIO.reader = TextPrimIO.reader (* POSIX_IO *) where type TextPrimIO.writer = TextPrimIO.writer (* POSIX_IO *) where type Time.time = Time.time (* where type 'a Vector.vector = 'a Vector.vector *) where type 'a VectorSlice.slice = 'a VectorSlice.slice (* where type WideTextIO.instream = WideTextIO.instream where type WideTextIO.outstream = WideTextIO.outstream where type WideTextPrimIO.reader = WideTextPrimIO.reader where type WideTextPrimIO.writer = WideTextPrimIO.writer *) where type Word8Array.array = Word8Array.array where type Word8ArraySlice.slice = Word8ArraySlice.slice where type Word8ArraySlice.vector_slice = Word8ArraySlice.vector_slice where type Word8Vector.vector = Word8Vector.vector where type MLton.Pointer.t = MLton.Pointer.t where type 'a MLton.Thread.t = 'a MLton.Thread.t where type MLton.Thread.Runnable.t = MLton.Thread.Runnable.t (* Types that must be exposed because constants denote them. *) where type FixedInt.int = FixedInt.int where type Int1.int = Int1.int where type Int2.int = Int2.int where type Int3.int = Int3.int where type Int4.int = Int4.int where type Int5.int = Int5.int where type Int6.int = Int6.int where type Int7.int = Int7.int where type Int8.int = Int8.int where type Int9.int = Int9.int where type Int10.int = Int10.int where type Int11.int = Int11.int where type Int12.int = Int12.int where type Int13.int = Int13.int where type Int14.int = Int14.int where type Int15.int = Int15.int where type Int16.int = Int16.int where type Int17.int = Int17.int where type Int18.int = Int18.int where type Int19.int = Int19.int where type Int20.int = Int20.int where type Int21.int = Int21.int where type Int22.int = Int22.int where type Int23.int = Int23.int where type Int24.int = Int24.int where type Int25.int = Int25.int where type Int26.int = Int26.int where type Int27.int = Int27.int where type Int28.int = Int28.int where type Int29.int = Int29.int where type Int30.int = Int30.int where type Int31.int = Int31.int where type Int32.int = Int32.int where type Int64.int = Int64.int where type IntInf.int = IntInf.int where type Real32.real = Real32.real where type Real64.real = Real64.real where type WideChar.char = WideChar.char where type WideString.string = WideString.string where type Word1.word = Word1.word where type Word2.word = Word2.word where type Word3.word = Word3.word where type Word4.word = Word4.word where type Word5.word = Word5.word where type Word6.word = Word6.word where type Word7.word = Word7.word where type Word8.word = Word8.word where type Word9.word = Word9.word where type Word10.word = Word10.word where type Word11.word = Word11.word where type Word12.word = Word12.word where type Word13.word = Word13.word where type Word14.word = Word14.word where type Word15.word = Word15.word where type Word16.word = Word16.word where type Word17.word = Word17.word where type Word18.word = Word18.word where type Word19.word = Word19.word where type Word20.word = Word20.word where type Word21.word = Word21.word where type Word22.word = Word22.word where type Word23.word = Word23.word where type Word24.word = Word24.word where type Word25.word = Word25.word where type Word26.word = Word26.word where type Word27.word = Word27.word where type Word28.word = Word28.word where type Word29.word = Word29.word where type Word30.word = Word30.word where type Word31.word = Word31.word where type Word32.word = Word32.word where type Word64.word = Word64.word mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/basis.sml000066400000000000000000000236241416264345000255000ustar00rootroot00000000000000(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure BasisExtra :> BASIS_EXTRA = struct (* Required structures *) structure Array = Array structure ArraySlice = ArraySlice structure BinIO = BinIO structure BinPrimIO = BinPrimIO structure Bool = Bool structure Byte = Byte structure Char = Char structure CharArray = CharArray structure CharArraySlice = CharArraySlice structure CharVector = CharVector structure CharVectorSlice = CharVectorSlice structure CommandLine = CommandLine structure Date = Date structure General = General structure IEEEReal = IEEEReal structure IO = IO structure Int = Int structure LargeInt = LargeInt structure LargeReal = LargeReal structure LargeWord = LargeWord structure List = List structure ListPair = ListPair structure OS = OS structure Option = Option structure Position = Position structure Real = Real structure String = String structure StringCvt = StringCvt structure Substring = Substring structure Text = Text structure TextIO = TextIO structure TextPrimIO = TextPrimIO structure Time = Time structure Timer = Timer structure Vector = Vector structure VectorSlice = VectorSlice structure Word = Word structure Word8 = Word8 structure Word8Array = Word8Array structure Word8Array2 = Word8Array2 structure Word8ArraySlice = Word8ArraySlice structure Word8Vector = Word8Vector structure Word8VectorSlice = Word8VectorSlice (* Optional structures *) structure Array2 = Array2 structure BoolArray = BoolArray structure BoolArray2 = BoolArray2 structure BoolArraySlice = BoolArraySlice structure BoolVector = BoolVector structure BoolVectorSlice = BoolVectorSlice structure CharArray2 = CharArray2 structure FixedInt = FixedInt structure GenericSock = GenericSock structure INetSock = INetSock structure Int1 = Int1 structure Int2 = Int2 structure Int3 = Int3 structure Int4 = Int4 structure Int5 = Int5 structure Int6 = Int6 structure Int7 = Int7 structure Int8 = Int8 structure Int9 = Int9 structure Int10 = Int10 structure Int11 = Int11 structure Int12 = Int12 structure Int13 = Int13 structure Int14 = Int14 structure Int15 = Int15 structure Int16 = Int16 structure Int16 = Int16 structure Int17 = Int17 structure Int18 = Int18 structure Int19 = Int19 structure Int20 = Int20 structure Int21 = Int21 structure Int22 = Int22 structure Int23 = Int23 structure Int24 = Int24 structure Int25 = Int25 structure Int26 = Int26 structure Int27 = Int27 structure Int28 = Int28 structure Int29 = Int29 structure Int30 = Int30 structure Int31 = Int31 structure Int32 = Int32 structure Int64 = Int64 structure IntArray = IntArray structure IntArray2 = IntArray2 structure IntArraySlice = IntArraySlice structure IntVector = IntVector structure IntVectorSlice = IntVectorSlice structure Int8Array = Int8Array structure Int8Array2 = Int8Array2 structure Int8ArraySlice = Int8ArraySlice structure Int8Vector = Int8Vector structure Int8VectorSlice = Int8VectorSlice structure Int16Array = Int16Array structure Int16Array2 = Int16Array2 structure Int16ArraySlice = Int16ArraySlice structure Int16Vector = Int16Vector structure Int16VectorSlice = Int16VectorSlice structure Int32Array = Int32Array structure Int32Array2 = Int32Array2 structure Int32ArraySlice = Int32ArraySlice structure Int32Vector = Int32Vector structure Int32VectorSlice = Int32VectorSlice structure Int64Array = Int64Array structure Int64Array2 = Int64Array2 structure Int64ArraySlice = Int64ArraySlice structure Int64Vector = Int64Vector structure Int64VectorSlice = Int64VectorSlice structure IntInf = IntInf structure IntInfArray = IntInfArray structure IntInfArray2 = IntInfArray2 structure IntInfArraySlice = IntInfArraySlice structure IntInfVector = IntInfVector structure IntInfVectorSlice = IntInfVectorSlice structure LargeIntArray = LargeIntArray structure LargeIntArray2 = LargeIntArray2 structure LargeIntArraySlice = LargeIntArraySlice structure LargeIntVector = LargeIntVector structure LargeIntVectorSlice = LargeIntVectorSlice structure LargeRealArray = LargeRealArray structure LargeRealArray2 = LargeRealArray2 structure LargeRealArraySlice = LargeRealArraySlice structure LargeRealVector = LargeRealVector structure LargeRealVectorSlice = LargeRealVectorSlice structure LargeWordArray = LargeWordArray structure LargeWordArray2 = LargeWordArray2 structure LargeWordArraySlice = LargeWordArraySlice structure LargeWordVector = LargeWordVector structure LargeWordVectorSlice = LargeWordVectorSlice structure NetHostDB = NetHostDB structure NetProtDB = NetProtDB structure NetServDB = NetServDB structure PackReal32Big = PackReal32Big structure PackReal32Little = PackReal32Little structure PackReal64Big = PackReal64Big structure PackReal64Little = PackReal64Little structure PackRealBig = PackRealBig structure PackRealLittle = PackRealLittle structure PackWord16Big = PackWord16Big structure PackWord16Little = PackWord16Little structure PackWord32Big = PackWord32Big structure PackWord32Little = PackWord32Little structure PackWord64Big = PackWord64Big structure PackWord64Little = PackWord64Little structure Posix = Posix structure Real32 = Real32 structure Real32Array = Real32Array structure Real32Array2 = Real32Array2 structure Real32ArraySlice = Real32ArraySlice structure Real32Vector = Real32Vector structure Real32VectorSlice = Real32VectorSlice structure Real64 = Real64 structure Real64Array = Real64Array structure Real64Array2 = Real64Array2 structure Real64ArraySlice = Real64ArraySlice structure Real64Vector = Real64Vector structure Real64VectorSlice = Real64VectorSlice structure RealArray = RealArray structure RealArray2 = RealArray2 structure RealArraySlice = RealArraySlice structure RealVector = RealVector structure RealVectorSlice = RealVectorSlice structure Socket = Socket structure SysWord = SysWord structure Unix = Unix structure UnixSock = UnixSock structure WideChar = WideChar structure WideCharArray = WideCharArray structure WideCharArray2 = WideCharArray2 structure WideCharArraySlice = WideCharArraySlice structure WideCharVector = WideCharVector structure WideCharVectorSlice = WideCharVectorSlice structure WideString = WideString structure WideSubstring = WideSubstring structure WideText = WideText (* structure WideTextIO = WideTextIO structure WideTextPrimIO = WideTextPrimIO *) (* structure Windows = Windows *) structure Word1 = Word1 structure Word2 = Word2 structure Word3 = Word3 structure Word4 = Word4 structure Word5 = Word5 structure Word6 = Word6 structure Word7 = Word7 structure Word8 = Word8 structure Word9 = Word9 structure Word10 = Word10 structure Word11 = Word11 structure Word12 = Word12 structure Word13 = Word13 structure Word14 = Word14 structure Word15 = Word15 structure Word16 = Word16 structure Word17 = Word17 structure Word18 = Word18 structure Word19 = Word19 structure Word20 = Word20 structure Word21 = Word21 structure Word22 = Word22 structure Word23 = Word23 structure Word24 = Word24 structure Word25 = Word25 structure Word26 = Word26 structure Word27 = Word27 structure Word28 = Word28 structure Word29 = Word29 structure Word30 = Word30 structure Word31 = Word31 structure Word32 = Word32 structure Word64 = Word64 structure Word16 = Word16 structure WordArray = WordArray structure WordArray2 = WordArray2 structure WordArraySlice = WordArraySlice structure WordVector = WordVector structure WordVectorSlice = WordVectorSlice structure Word16Array = Word16Array structure Word16Array2 = Word16Array2 structure Word16ArraySlice = Word16ArraySlice structure Word16Vector = Word16Vector structure Word16VectorSlice = Word16VectorSlice structure Word32Array = Word32Array structure Word32Array2 = Word32Array2 structure Word32ArraySlice = Word32ArraySlice structure Word32Vector = Word32Vector structure Word32VectorSlice = Word32VectorSlice structure Word64Array = Word64Array structure Word64Array2 = Word64Array2 structure Word64ArraySlice = Word64ArraySlice structure Word64Vector = Word64Vector structure Word64VectorSlice = Word64VectorSlice (* Non-standard structures *) structure SML90 = SML90 structure MLton = MLton structure SMLofNJ = SMLofNJ structure Unsafe = Unsafe open ArrayGlobal BoolGlobal CharGlobal IntGlobal GeneralGlobal ListGlobal OptionGlobal RealGlobal StringGlobal SubstringGlobal TextIOGlobal VectorGlobal WordGlobal val real = real val op = = op = val op <> = op <> val vector = vector datatype ref = datatype ref end mlton-20210117+dfsg/basis-library/libs/basis-extra/top-level/top-level.sml000066400000000000000000000005271416264345000263030ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local open BasisExtra in structure SML90 = SML90 structure MLton = MLton structure SMLofNJ = SMLofNJ structure Unsafe = Unsafe end mlton-20210117+dfsg/basis-library/libs/basis-none/000077500000000000000000000000001416264345000215605ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-none/top-level/000077500000000000000000000000001416264345000234675ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/libs/basis-none/top-level/basis.sig000066400000000000000000000010221416264345000252670ustar00rootroot00000000000000signature BASIS_NONE = sig (* Top-level types *) eqtype 'a array datatype bool = datatype BasisExtra.bool eqtype char type exn eqtype int datatype list = datatype BasisExtra.list datatype ref = datatype BasisExtra.ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word exception Bind exception Match exception Overflow val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20210117+dfsg/basis-library/libs/basis-none/top-level/basis.sml000066400000000000000000000003671416264345000253130ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure BasisNone : BASIS_NONE = BasisExtra mlton-20210117+dfsg/basis-library/libs/basis-none/top-level/infixes.sml000066400000000000000000000004101416264345000256440ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 4 = mlton-20210117+dfsg/basis-library/libs/basis-none/top-level/top-level.sml000066400000000000000000000003371416264345000261160ustar00rootroot00000000000000(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) open BasisNone mlton-20210117+dfsg/basis-library/list/000077500000000000000000000000001416264345000175445ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/list/list-pair.sig000066400000000000000000000017121416264345000221550ustar00rootroot00000000000000signature LIST_PAIR = sig exception UnequalLengths val zip: 'a list * 'b list -> ('a * 'b) list val zipEq: 'a list * 'b list -> ('a * 'b) list val unzip: ('a * 'b) list -> 'a list * 'b list val app: ('a * 'b -> unit) -> 'a list * 'b list -> unit val appEq: ('a * 'b -> unit) -> 'a list * 'b list -> unit val map: ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val mapEq: ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val foldl: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldr: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldlEq: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldrEq: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val all: ('a * 'b -> bool) -> 'a list * 'b list -> bool val exists: ('a * 'b -> bool) -> 'a list * 'b list -> bool val allEq: ('a * 'b -> bool) -> 'a list * 'b list -> bool end mlton-20210117+dfsg/basis-library/list/list-pair.sml000066400000000000000000000043141416264345000221670ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure ListPair: LIST_PAIR = struct exception UnequalLengths fun id x = x fun ul _ = raise UnequalLengths fun unzip l = List.foldr (fn ((x, y), (xs, ys)) => (x :: xs, y :: ys)) ([], []) l fun foldl' w f b (l1, l2) = let fun loop (l1, l2, b) = case (l1, l2) of ([], []) => b | (x1 :: l1, x2 :: l2) => loop (l1, l2, f (x1, x2, b)) | _ => w b in loop (l1, l2, b) end fun foldl f = foldl' id f fun foldlEq f = foldl' ul f fun foldr' w f b (l1, l2) = let fun loop (l1, l2) = case (l1, l2) of ([], []) => b | (x1 :: l1, x2 :: l2) => f (x1, x2, loop (l1, l2)) | _ => w b in loop (l1, l2) end fun foldr f = foldr' id f fun foldrEq f = foldr' ul f fun zip' w (l1, l2) = rev (foldl' w (fn (x, x', l) => (x, x') :: l) [] (l1, l2)) fun zip (l1, l2) = zip' id (l1, l2) fun zipEq (l1, l2) = zip' ul (l1, l2) fun map' w f = rev o (foldl' w (fn (x1, x2, l) => f (x1, x2) :: l) []) fun map f = map' id f fun mapEq f = map' ul f fun app' w f = foldl' w (fn (x1, x2, ()) => f (x1, x2)) () fun app f = app' id f fun appEq f = app' ul f fun exists p (l1, l2) = let fun loop (l1, l2) = case (l1, l2) of (x1 :: l1, x2 :: l2) => p (x1, x2) orelse loop (l1, l2) | _ => false in loop (l1, l2) end fun all p ls = not (exists (not o p) ls) fun allEq p = let fun loop (l1, l2) = case (l1, l2) of ([], []) => true | (x1 :: l1, x2 :: l2) => p (x1, x2) andalso loop (l1, l2) | _ => false in loop end end mlton-20210117+dfsg/basis-library/list/list.sig000066400000000000000000000024611416264345000212260ustar00rootroot00000000000000signature LIST_GLOBAL = sig datatype list = datatype list exception Empty val @ : 'a list * 'a list -> 'a list val app: ('a -> unit) -> 'a list -> unit val foldl: ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val hd: 'a list -> 'a val length: 'a list -> int val map: ('a -> 'b) -> 'a list -> 'b list val null: 'a list -> bool val rev: 'a list -> 'a list val tl: 'a list -> 'a list end signature LIST = sig include LIST_GLOBAL val all: ('a -> bool) -> 'a list -> bool val collate: ('a * 'a -> order) -> 'a list * 'a list -> order val concat: 'a list list -> 'a list val drop: 'a list * int -> 'a list val exists: ('a -> bool) -> 'a list -> bool val filter: ('a -> bool) -> 'a list -> 'a list val find: ('a -> bool) -> 'a list -> 'a option val getItem: 'a list -> ('a * 'a list) option val last: 'a list -> 'a val mapPartial: ('a -> 'b option) -> 'a list -> 'b list val nth: 'a list * int -> 'a val partition: ('a -> bool) -> 'a list -> 'a list * 'a list val revAppend: 'a list * 'a list -> 'a list val tabulate: int * (int -> 'a) -> 'a list val take: 'a list * int -> 'a list end mlton-20210117+dfsg/basis-library/list/list.sml000066400000000000000000000102271416264345000212360ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure List: LIST = struct open Int datatype list = datatype Primitive.List.list exception Empty val null = fn [] => true | _ => false val hd = fn x :: _ => x | _ => raise Empty val tl = fn _ :: l => l | _ => raise Empty val rec last = fn [] => raise Empty | [x] => x | _ :: l => last l val getItem = fn [] => NONE | x :: r => SOME (x, r) fun foldl f b l = let fun loop (l, b) = case l of [] => b | x :: l => loop (l, f (x, b)) in loop (l, b) end fun length l = foldl (fn (_, n) => n +! 1) 0 l fun appendRev (l1, l2) = foldl (op ::) l2 l1 val revAppend = appendRev fun rev l = appendRev (l, []) fun l1 @ l2 = case l2 of [] => l1 | _ => appendRev (rev l1, l2) fun foldr f b l = foldl f b (rev l) fun concat ls = foldr (op @) [] ls fun app f = foldl (f o #1) () fun map f l = rev (foldl (fn (x, l) => f x :: l) [] l) fun mapPartial pred l = rev (foldl (fn (x, l) => (case pred x of NONE => l | SOME y => y :: l)) [] l) fun filter pred = mapPartial (fn x => if pred x then SOME x else NONE) fun partition pred l = let val (pos, neg) = foldl (fn (x, (trues, falses)) => if pred x then (x :: trues, falses) else (trues, x :: falses)) ([], []) l in (rev pos, rev neg) end fun find pred = let val rec loop = fn [] => NONE | x :: l => if pred x then SOME x else loop l in loop end fun exists pred l = case find pred l of NONE => false | SOME _ => true fun all pred = not o (exists (not o pred)) fun tabulate (n, f) = if Primitive.Controls.safe andalso n < 0 then raise Size else let fun loop (i, ac) = if i < n then loop (i + 1, f i :: ac) else rev ac in loop (0, []) end fun nth (l, n) = let fun loop (l, n) = case l of [] => raise Subscript | x :: l => if n > 0 then loop (l, n - 1) else x in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n) end fun take (l, n) = let fun loop (l, n, ac) = if n > 0 then (case l of [] => raise Subscript | x :: l => loop (l, n - 1, x :: ac)) else rev ac in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n, []) end fun drop (l, n) = let fun loop (l, n) = if n > 0 then (case l of [] => raise Subscript | _ :: l => loop (l, n - 1)) else l in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n) end fun collate cmp = let val rec loop = fn ([], []) => EQUAL | ([], _) => LESS | (_, []) => GREATER | (x1::l1,x2::l2) => (case cmp (x1, x2) of EQUAL => loop (l1, l2) | ans => ans) in loop end end structure ListGlobal: LIST_GLOBAL = List open ListGlobal mlton-20210117+dfsg/basis-library/maps/000077500000000000000000000000001416264345000175315ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/maps/normal-metadata-size128.map000066400000000000000000000000351416264345000244770ustar00rootroot00000000000000NORMAL_METADATA_SIZE size128 mlton-20210117+dfsg/basis-library/maps/normal-metadata-size32.map000066400000000000000000000000341416264345000244100ustar00rootroot00000000000000NORMAL_METADATA_SIZE size32 mlton-20210117+dfsg/basis-library/maps/normal-metadata-size64.map000066400000000000000000000000341416264345000244150ustar00rootroot00000000000000NORMAL_METADATA_SIZE size64 mlton-20210117+dfsg/basis-library/maps/objptr-rep32.map000066400000000000000000000000211416264345000224520ustar00rootroot00000000000000OBJPTR_REP rep32 mlton-20210117+dfsg/basis-library/maps/objptr-rep64.map000066400000000000000000000000211416264345000224570ustar00rootroot00000000000000OBJPTR_REP rep64 mlton-20210117+dfsg/basis-library/maps/seqindex-int32.map000066400000000000000000000000231416264345000230000ustar00rootroot00000000000000SEQINDEX_INT int32 mlton-20210117+dfsg/basis-library/maps/seqindex-int64.map000066400000000000000000000000231416264345000230050ustar00rootroot00000000000000SEQINDEX_INT int64 mlton-20210117+dfsg/basis-library/maps/sequence-metadata-size128.map000066400000000000000000000000371416264345000250210ustar00rootroot00000000000000SEQUENCE_METADATA_SIZE size128 mlton-20210117+dfsg/basis-library/maps/sequence-metadata-size192.map000066400000000000000000000000371416264345000250220ustar00rootroot00000000000000SEQUENCE_METADATA_SIZE size192 mlton-20210117+dfsg/basis-library/maps/sequence-metadata-size256.map000066400000000000000000000000371416264345000250230ustar00rootroot00000000000000SEQUENCE_METADATA_SIZE size256 mlton-20210117+dfsg/basis-library/maps/sequence-metadata-size96.map000066400000000000000000000000361416264345000247440ustar00rootroot00000000000000SEQUENCE_METADATA_SIZE size96 mlton-20210117+dfsg/basis-library/mlton.mlb000066400000000000000000000025031416264345000204160ustar00rootroot00000000000000(* Copyright (C) 2013 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature MLTON signature MLTON_ARRAY signature MLTON_BIN_IO signature MLTON_CONT signature MLTON_EXN signature MLTON_FINALIZABLE signature MLTON_GC signature MLTON_INT_INF signature MLTON_IO signature MLTON_ITIMER signature MLTON_MONO_ARRAY signature MLTON_MONO_VECTOR signature MLTON_PLATFORM signature MLTON_POINTER signature MLTON_PROC_ENV signature MLTON_PROCESS signature MLTON_PROFILE signature MLTON_RANDOM signature MLTON_REAL signature MLTON_RLIMIT signature MLTON_RUSAGE signature MLTON_SIGNAL signature MLTON_SYSLOG signature MLTON_TEXT_IO signature MLTON_THREAD signature MLTON_VECTOR signature MLTON_WEAK signature MLTON_WORD signature MLTON_WORLD structure MLton end end mlton-20210117+dfsg/basis-library/mlton/000077500000000000000000000000001416264345000177225ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/mlton/array.sig000066400000000000000000000005731416264345000215510ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_ARRAY = sig val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b end mlton-20210117+dfsg/basis-library/mlton/bin-io.sig000066400000000000000000000003611416264345000216030ustar00rootroot00000000000000(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_BIN_IO = MLTON_IO mlton-20210117+dfsg/basis-library/mlton/call-stack.sig000066400000000000000000000005321416264345000224440ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CALL_STACK = sig type t val keep: bool val current: unit -> t val toStrings: t -> string list end mlton-20210117+dfsg/basis-library/mlton/call-stack.sml000066400000000000000000000026661416264345000224670ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonCallStack = struct open Primitive.MLton.CallStack val gcState = Primitive.MLton.GCState.gcState structure Pointer = MLtonPointer val current: unit -> t = fn () => if not keep then T (Array.array (0, 0wx0)) else let val a = Array.alloc (Word32.toInt (numStackFrames (gcState ()))) val () = callStack (gcState (), a) in T a end val toStrings: t -> string list = fn T a => if not keep then [] else Array.foldr (fn (frameIndex, ac) => let val p = frameIndexSourceSeq (gcState (), frameIndex) val max = Int32.toInt (Pointer.getInt32 (p, 0)) fun loop (j, ac) = if j > max then ac else loop (j + 1, CUtil.C_String.toString (sourceName (gcState (), Pointer.getWord32 (p, j))) :: ac) in loop (1, ac) end) [] a end mlton-20210117+dfsg/basis-library/mlton/cont.sig000066400000000000000000000007771416264345000214040ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CONT = sig type 'a t val callcc: ('a t -> 'a) -> 'a val isolate: ('a -> unit) -> 'a t val prepend: 'a t * ('b -> 'a) -> 'b t val throw: 'a t * 'a -> 'b val throw': 'a t * (unit -> 'a) -> 'b end mlton-20210117+dfsg/basis-library/mlton/cont.sml000066400000000000000000000060401416264345000214020ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonCont:> MLTON_CONT = struct structure Thread = struct open Primitive.MLton.Thread val savedPre = fn () => savedPre (Primitive.MLton.GCState.gcState ()) end fun die (s: string): 'a = (PrimitiveFFI.Stdio.print s ; PrimitiveFFI.Posix.Process.exit 1 ; let exception DieFailed in raise DieFailed end) type 'a t = (unit -> 'a) -> unit fun callcc (f: 'a t -> 'a): 'a = if MLtonThread.amInSignalHandler () then die "MLton.Cont.callcc can not be used in a signal handler\n" else let datatype 'a state = Original of 'a t -> 'a | Copy of unit -> 'a | Clear val r: 'a state ref = ref (Original f) val _ = Thread.atomicBegin () (* Match 1 *) val _ = Thread.copyCurrent () in case (!r before r := Clear) of Clear => raise Fail "MLton.Cont.callcc: Clear" | Copy v => let val _ = Thread.atomicEnd () (* Match 2 *) in v () end | Original f => let val t = Thread.savedPre () val _ = Thread.atomicEnd () (* Match 1 *) in f (fn v => let val _ = Thread.atomicBegin () (* Match 2 *) val _ = r := Copy v val new = Thread.copy t val _ = Thread.atomicBegin () (* Match 3 *) in Thread.switchTo new (* Match 3 *) end) end end fun ('a, 'b) throw' (k: 'a t, v: unit -> 'a): 'b = (k v; raise Fail "MLton.Cont.throw': return from continuation") fun ('a, 'b) throw (k: 'a t, v: 'a): 'b = throw' (k, fn () => v) fun prepend (k, f) v = throw' (k, f o v) local val thRef: (unit -> unit) option ref = ref NONE val base: Thread.preThread = let val () = Thread.copyCurrent () in case !thRef of NONE => Thread.savedPre () | SOME th => let val () = thRef := NONE val () = Thread.atomicEnd () (* Match 1 *) val _ = (th () ; Exit.topLevelSuffix ()) handle exn => MLtonExn.topLevelHandler exn in raise Fail "MLton.Cont.isolate: return from (wrapped) func" end end in val isolate: ('a -> unit) -> 'a t = fn (f: 'a -> unit) => fn (v: unit -> 'a) => let val _ = Thread.atomicBegin () (* Match 1 *) val _ = Thread.atomicBegin () (* Match 2 *) val () = thRef := SOME (f o v) val new = Thread.copy base in Thread.switchTo new (* Match 2 *) end end end mlton-20210117+dfsg/basis-library/mlton/exit.sml000066400000000000000000000060321416264345000214110ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Exit = struct structure Status = struct open PreOS.Status val fromInt = fromRep o C_Status.fromInt val toInt = C_Status.toInt o toRep val failure = fromInt 1 val success = fromInt 0 end val exiting = ref false fun atExit f = if !exiting then () else Cleaner.addNew (Cleaner.atExit, f) fun halt (status: Status.t) = (Primitive.MLton.halt (Status.toRep status) ; Primitive.MLton.bug "MLton.Exit.halt") fun exit (status: Status.t): 'a = if !exiting then raise Fail "MLton.Exit.exit" else let val _ = exiting := true val i = Status.toInt status in if 0 <= i andalso i < 256 then (let open Cleaner in clean atExit end ; halt status ; raise Fail "MLton.Exit.exit") else raise Fail (concat ["MLton.Exit.exit(", Int.toString i, "): ", "exit must have 0 <= status < 256"]) end local val message = PrimitiveFFI.Stdio.print fun 'a wrapSuffix (suffix: unit -> unit) () : 'a = (suffix () ; message "Top-level suffix returned.\n" ; exit Status.failure) handle _ => (message "Top-level suffix raised exception.\n" ; halt Status.failure ; raise Fail "MLton.Exit.wrapSuffix") fun suffixArchiveOrLibrary () = let (* Return to 'lib_open'. *) val () = Primitive.MLton.Thread.returnToC () (* Enter from 'lib_close'. *) val _ = exiting := true val () = let open Cleaner in clean atExit end (* Return to 'lib_close'. *) val () = Primitive.MLton.Thread.returnToC () in () end fun suffixExecutable () = exit Status.success val defaultSuffix = let open Primitive.MLton.Platform.Format in case host of Archive => suffixArchiveOrLibrary | Executable => suffixExecutable | LibArchive => suffixArchiveOrLibrary | Library => suffixArchiveOrLibrary end in val getTopLevelSuffix = Primitive.TopLevel.getSuffix val setTopLevelSuffix = Primitive.TopLevel.setSuffix o wrapSuffix fun 'a defaultTopLevelSuffix ((): unit): 'a = wrapSuffix defaultSuffix () fun 'a topLevelSuffix ((): unit) : 'a = (getTopLevelSuffix () () ; raise Fail "MLton.Exit.topLevelSuffix") end end mlton-20210117+dfsg/basis-library/mlton/exn.sig000066400000000000000000000010621416264345000212170ustar00rootroot00000000000000(* Copyright (C) 2001-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_EXN = sig val addExnMessager: (exn -> string option) -> unit val history: exn -> string list val defaultTopLevelHandler: exn -> 'a (* does not return *) val getTopLevelHandler: unit -> (exn -> unit) val setTopLevelHandler: (exn -> unit) -> unit val topLevelHandler: exn -> 'a (* does not return *) end mlton-20210117+dfsg/basis-library/mlton/exn.sml000066400000000000000000000050761416264345000212410ustar00rootroot00000000000000(* Copyright (C) 2001-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonExn = struct open Primitive.MLton.Exn type t = exn val addExnMessager = General.addExnMessager val history: t -> string list = if keepHistory then (setExtendExtra (fn e => case e of NONE => SOME (MLtonCallStack.current ()) | SOME _ => e) ; (fn e => case extra e of NONE => [] | SOME cs => let (* Gets rid of the anonymous function passed to * setExtendExtra above. *) fun loop xs = case xs of [] => [] | x :: xs => if String.isPrefix "MLtonExn.fn " x then xs else loop xs in loop (MLtonCallStack.toStrings cs) end)) else fn _ => [] local val message = PrimitiveFFI.Stdio.print fun 'a wrapHandler (handler: exn -> unit) exn : 'a = (handler exn ; message "Top-level handler returned.\n" ; Exit.exit Exit.Status.failure) handle _ => (message "Top-level handler raised exception.\n" ; Exit.halt Exit.Status.failure ; raise Fail "MLton.Exn.wrapHandler") val defaultHandler = fn exn => (message (concat ["unhandled exception: ", exnMessage exn, "\n"]) ; (case history exn of [] => () | l => (message "with history:\n" ; List.app (fn s => message (concat ["\t", s, "\n"])) l)) ; Exit.exit Exit.Status.failure) in val getTopLevelHandler = Primitive.TopLevel.getHandler val setTopLevelHandler = Primitive.TopLevel.setHandler o wrapHandler fun 'a defaultTopLevelHandler (exn: exn): 'a = wrapHandler defaultHandler exn fun 'a topLevelHandler (exn: exn) : 'a = (getTopLevelHandler () exn ; raise Fail "MLton.Exn.topLevelHandler") end end mlton-20210117+dfsg/basis-library/mlton/ffi.sig000066400000000000000000000041701416264345000211740ustar00rootroot00000000000000(* Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FFI = sig val getBool: MLtonPointer.t * int -> bool val getChar8: MLtonPointer.t * int -> Char.char (* val getChar16: MLtonPointer.t * int -> Char16.char val getChar32: MLtonPointer.t * int -> Char32.char *) val getCPointer: MLtonPointer.t * int -> MLtonPointer.t val getInt8: MLtonPointer.t * int -> Int8.int val getInt16: MLtonPointer.t * int -> Int16.int val getInt32: MLtonPointer.t * int -> Int32.int val getInt64: MLtonPointer.t * int -> Int64.int val getObjptr: MLtonPointer.t * int -> 'a val getReal32: MLtonPointer.t * int -> Real32.real val getReal64: MLtonPointer.t * int -> Real64.real val getWord8: MLtonPointer.t * int -> Word8.word val getWord16: MLtonPointer.t * int -> Word16.word val getWord32: MLtonPointer.t * int -> Word32.word val getWord64: MLtonPointer.t * int -> Word64.word val register: int * (MLtonPointer.t -> unit) -> unit val setBool: MLtonPointer.t * int * bool -> unit val setChar8: MLtonPointer.t * int * Char.char -> unit (* val setChar16: MLtonPointer.t * Char16.char -> unit val setChar32: MLtonPointer.t * Char32.char -> unit *) val setCPointer: MLtonPointer.t * int * MLtonPointer.t -> unit val setInt8: MLtonPointer.t * int * Int8.int -> unit val setInt16: MLtonPointer.t * int * Int16.int -> unit val setInt32: MLtonPointer.t * int * Int32.int -> unit val setInt64: MLtonPointer.t * int * Int64.int -> unit val setObjptr: MLtonPointer.t * int * 'a -> unit val setReal32: MLtonPointer.t * int * Real32.real -> unit val setReal64: MLtonPointer.t * int * Real64.real -> unit val setWord8: MLtonPointer.t * int * Word8.word -> unit val setWord16: MLtonPointer.t * int * Word16.word -> unit val setWord32: MLtonPointer.t * int * Word32.word -> unit val setWord64: MLtonPointer.t * int * Word64.word -> unit end mlton-20210117+dfsg/basis-library/mlton/ffi.sml000066400000000000000000000045631416264345000212130ustar00rootroot00000000000000(* Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonFFI: MLTON_FFI = struct val register = MLtonThread.register local fun makeGet get (p,i) = get (MLtonPointer.getPointer (p, i), 0) fun makeSet set (p,i,x) = set (MLtonPointer.getPointer (p, i), 0, x) fun make (get,set) = (makeGet get, makeSet set) in val (getCPointer, setCPointer) = make (MLtonPointer.getCPointer, MLtonPointer.setCPointer) val (getInt8, setInt8) = make (MLtonPointer.getInt8, MLtonPointer.setInt8) val (getInt16, setInt16) = make (MLtonPointer.getInt16, MLtonPointer.setInt16) val (getInt32, setInt32) = make (MLtonPointer.getInt32, MLtonPointer.setInt32) val (getInt64, setInt64) = make (MLtonPointer.getInt64, MLtonPointer.setInt64) val getObjptr = fn (p,i) => makeGet MLtonPointer.getObjptr (p,i) val setObjptr = fn (p,i,x) => makeSet MLtonPointer.setObjptr (p,i,x) val (getReal32, setReal32) = make (MLtonPointer.getReal32, MLtonPointer.setReal32) val (getReal64, setReal64) = make (MLtonPointer.getReal64, MLtonPointer.setReal64) val (getWord8, setWord8) = make (MLtonPointer.getWord8, MLtonPointer.setWord8) val (getWord16, setWord16) = make (MLtonPointer.getWord16, MLtonPointer.setWord16) val (getWord32, setWord32) = make (MLtonPointer.getWord32, MLtonPointer.setWord32) val (getWord64, setWord64) = make (MLtonPointer.getWord64, MLtonPointer.setWord64) end (* To the C-world, chars are unsigned integers. *) val getChar8 = fn (p, i) => Primitive.Char8.idFromWord8 (getWord8 (p, i)) (* val getChar16 = fn (p, i) => Primitive.Char16.idFromWord16 (getWord16 (p, i)) val getChar32 = fn (p, i) => Primitive.Char32.idFromWord32 (getWord32 (p, i)) *) val setChar8 = fn (p, i, x) => setWord8 (p, i, Primitive.Char8.idToWord8 x) (* val setChar16 = fn (p, i, x) => setWord16 (p, i, Primitive.Char16.idToWord16 x) val setChar32 = fn (p, i, x) => setWord32 (p, i, Primitive.Char32.idToWord32 x) *) (* To the C-world, booleans are 32-bit integers. *) fun intToBool (i: Int32.int): bool = i <> 0 val getBool = fn (p, i) => intToBool(getInt32 (p, i)) fun boolToInt (b: bool): Int32.int = if b then 1 else 0 val setBool = fn (p, i, x) => setInt32 (p, i, boolToInt x) end mlton-20210117+dfsg/basis-library/mlton/finalizable.sig000066400000000000000000000007151416264345000227110ustar00rootroot00000000000000(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FINALIZABLE = sig type 'a t val addFinalizer: 'a t * ('a -> unit) -> unit val finalizeBefore: 'a t * 'b t -> unit val new: 'a -> 'a t val touch: 'a t -> unit val withValue: 'a t * ('a -> 'b) -> 'b end mlton-20210117+dfsg/basis-library/mlton/finalizable.sml000066400000000000000000000047201416264345000227220ustar00rootroot00000000000000(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonFinalizable: MLTON_FINALIZABLE = struct structure List = struct open List fun push (l, x) = l := x :: !l fun foreach (l, f) = app f l end datatype 'a t = T of {afters: (unit -> unit) list ref, finalizers: ('a -> unit) list ref, value: 'a ref} fun touch (T {value, ...}) = Primitive.MLton.Finalizable.touch value fun withValue (f as T {value, ...}, g) = DynamicWind.wind (fn () => g (!value), fn () => touch f) fun addFinalizer (T {finalizers, ...}, f) = List.push (finalizers, f) val finalize = let val r: {clean: unit -> unit, isAlive: unit -> bool} list ref = ref [] fun clean l = List.foldl (fn (z as {clean: unit -> unit, isAlive}, (gotOne, zs)) => if isAlive () then (gotOne, z :: zs) else (clean (); (true, zs))) (false, []) l val _ = MLtonSignal.handleGC (fn () => r := #2 (clean (!r))) val _ = Cleaner.addNew (Cleaner.atExit, fn () => let val l = !r (* Must clear r so that the handler doesn't interfere and so that * all other references to the finalizers are dropped. *) val _ = r := [] fun loop l = let val _ = MLtonGC.collect () val (gotOne, l) = clean l in if gotOne then loop l else () end in loop l end) in fn z => r := z :: !r end fun new (v: 'a): 'a t = let val afters = ref [] val finalizers = ref [] val value = ref v val f = T {afters = afters, finalizers = finalizers, value = value} val weak = MLtonWeak.new value fun clean () = (List.foreach (!finalizers, fn f => f v) ; List.foreach (!afters, fn f => f ())) fun isAlive () = isSome (MLtonWeak.get weak) val _ = finalize {clean = clean, isAlive = isAlive} in f end fun finalizeBefore (T {afters, ...}, f) = List.push (afters, fn () => touch f) end mlton-20210117+dfsg/basis-library/mlton/gc.sig000066400000000000000000000015431416264345000210220ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_GC = sig val collect: unit -> unit val pack: unit -> unit val setMessages: bool -> unit val setSummary: bool -> unit val unpack: unit -> unit (* Most meaningful immediately after 'collect()'. *) structure Statistics : sig val bytesAllocated: unit -> IntInf.int val lastBytesLive: unit -> IntInf.int val numCopyingGCs: unit -> IntInf.int val numMarkCompactGCs: unit -> IntInf.int val numMinorGCs: unit -> IntInf.int val maxBytesLive: unit -> IntInf.int end end mlton-20210117+dfsg/basis-library/mlton/gc.sml000066400000000000000000000030601416264345000210270ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonGC = struct open Primitive.MLton.GC val gcState = Primitive.MLton.GCState.gcState val pack : unit -> unit = fn () => pack (gcState ()) val unpack : unit -> unit = fn () => unpack (gcState ()) val setHashConsDuringGC : bool -> unit = fn b => setHashConsDuringGC (gcState (), b) val setMessages : bool -> unit = fn b => setMessages (gcState (), b) val setRusageMeasureGC : bool -> unit = fn b => setRusageMeasureGC (gcState (), b) val setSummary : bool -> unit = fn b => setSummary (gcState (), b) structure Statistics = struct local fun mk conv prim = fn () => conv (prim (gcState ())) val mkSize = mk C_Size.toLargeInt val mkUIntmax = mk C_UIntmax.toLargeInt in val bytesAllocated = mkUIntmax getBytesAllocated val lastBytesLive = mkSize getLastBytesLive val maxBytesLive = mkSize getMaxBytesLive val numCopyingGCs = mkUIntmax getNumCopyingGCs val numMarkCompactGCs = mkUIntmax getNumMarkCompactGCs val numMinorGCs = mkUIntmax getNumMinorGCs end end end mlton-20210117+dfsg/basis-library/mlton/int-inf.sig000066400000000000000000000010561416264345000217740ustar00rootroot00000000000000(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_INT_INF = sig type t val areSmall: t * t -> bool val gcd: t * t -> t val isSmall: t -> bool structure BigWord : WORD structure SmallInt : INTEGER datatype rep = Big of BigWord.word vector | Small of SmallInt.int val rep: t -> rep val fromRep: rep -> t option end mlton-20210117+dfsg/basis-library/mlton/io.fun000066400000000000000000000022551416264345000210470ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MLtonIO (S: MLTON_IO_ARG): MLTON_IO = struct open S fun mkstemps {prefix, suffix}: string * outstream = let fun loop () = let val name = concat [prefix, MLtonRandom.alphaNumString 6, suffix] open Posix.FileSys in (name, newOut (createf (name, O_WRONLY, O.flags [O.excl], let open S in flags [irusr, iwusr] end), name)) end handle e as PosixError.SysErr (_, s) => if s = SOME Posix.Error.exist then loop () else raise e in loop () end fun mkstemp s = mkstemps {prefix = s, suffix = ""} fun tempPrefix file = case MLtonPlatform.OS.host of MLtonPlatform.OS.MinGW => (case MinGW.getTempPath () of SOME d => d | NONE => "C:\\temp\\") ^ file | _ => "/tmp/" ^ file end mlton-20210117+dfsg/basis-library/mlton/io.sig000066400000000000000000000020141416264345000210320ustar00rootroot00000000000000(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_IO_ARG = sig type instream type outstream val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end signature MLTON_IO = sig include MLTON_IO_ARG (* mkstemp s creates and opens a new temp file with prefix s, returning * the name of the temp file and the outstream to write to it. *) val mkstemp: string -> string * outstream (* mkstemps is like mkstemp, except it has both a prefix and suffix. *) val mkstemps: {prefix: string, suffix: string} -> string * outstream (* adds a suitable system or user specific prefix (dir) for temp files *) val tempPrefix : string -> string end mlton-20210117+dfsg/basis-library/mlton/itimer.sig000066400000000000000000000007221416264345000217200ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ITIMER = sig datatype t = Prof | Real | Virtual val set: t * {interval: Time.time, value: Time.time} -> unit val signal: t -> Posix.Signal.signal end mlton-20210117+dfsg/basis-library/mlton/itimer.sml000066400000000000000000000025731416264345000217370ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonItimer = struct structure Prim = PrimitiveFFI.MLton.Itimer datatype t = Prof | Real | Virtual val signal = fn Prof => PosixSignal.prof | Real => PosixSignal.alrm | Virtual => PosixSignal.vtalrm val toInt = fn Prof => Prim.PROF | Real => Prim.REAL | Virtual => Prim.VIRTUAL fun set' (t, {interval, value}) = let fun split t = let val q = LargeInt.quot (Time.toMicroseconds t, 1000000) val r = LargeInt.rem (Time.toMicroseconds t, 1000000) in (C_Time.fromLargeInt q, C_SUSeconds.fromLargeInt r) end val (s1, u1) = split interval val (s2, u2) = split value in ignore (Prim.set (toInt t, s1, u1, s2, u2)) end fun set (z as (t, _)) = if Primitive.MLton.Profile.isOn andalso t = Prof then let open PosixError in raiseSys inval end else set' z end mlton-20210117+dfsg/basis-library/mlton/mlton.sig000066400000000000000000000057211416264345000215640ustar00rootroot00000000000000(* Copyright (C) 2013,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON = sig (* val cleanAtExit: unit -> unit *) val debug: bool (* val deserialize: Word8Vector.vector -> 'a *) (* Pointer equality. The usual caveats about lack of a well-defined * semantics. *) val eq: 'a * 'a -> bool (* Structural equality. Equivalent to SML's polymorphic * equality on equality types and a conservative approximation * of equivalence other types. *) val equal: 'a * 'a -> bool (* Structural hash. *) val hash: 'a -> Word32.word (* val errno: unit -> int *) (* the value of the C errno global *) val isMLton: bool val safe: bool (* val serialize: 'a -> Word8Vector.vector *) val share: 'a -> unit val shareAll: unit -> unit val size: 'a -> IntInf.int val sizeAll: unit -> IntInf.int structure Array: MLTON_ARRAY structure BinIO: MLTON_BIN_IO (* structure CallStack: MLTON_CALL_STACK *) structure CharArray: MLTON_MONO_ARRAY structure CharVector: MLTON_MONO_VECTOR structure Cont: MLTON_CONT structure Exn: MLTON_EXN structure Finalizable: MLTON_FINALIZABLE structure GC: MLTON_GC structure IntInf: MLTON_INT_INF structure Itimer: MLTON_ITIMER structure LargeReal: MLTON_REAL structure LargeWord: MLTON_WORD structure Platform: MLTON_PLATFORM structure Pointer: MLTON_POINTER structure ProcEnv: MLTON_PROC_ENV structure Process: MLTON_PROCESS structure Profile: MLTON_PROFILE (* structure Ptrace: MLTON_PTRACE *) structure Random: MLTON_RANDOM structure Real: MLTON_REAL structure Real32: sig include MLTON_REAL val castFromWord: Word32.word -> t val castToWord: t -> Word32.word end structure Real64: sig include MLTON_REAL val castFromWord: Word64.word -> Real64.real val castToWord: Real64.real -> Word64.word end structure Rlimit: MLTON_RLIMIT structure Rusage: MLTON_RUSAGE structure Signal: MLTON_SIGNAL structure Syslog: MLTON_SYSLOG structure TextIO: MLTON_TEXT_IO structure Thread: MLTON_THREAD structure Vector: MLTON_VECTOR structure Weak: MLTON_WEAK structure Word: MLTON_WORD structure Word8: MLTON_WORD structure Word16: MLTON_WORD structure Word32: MLTON_WORD structure Word64: MLTON_WORD structure Word8Array: MLTON_MONO_ARRAY structure Word8Vector: MLTON_MONO_VECTOR structure World: MLTON_WORLD end mlton-20210117+dfsg/basis-library/mlton/mlton.sml000066400000000000000000000070261416264345000215750ustar00rootroot00000000000000(* Copyright (C) 2010,2013,2016-2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLton: MLTON = struct val isMLton = true (* The ref stuff is so that the (de)serializer always deals with pointers * to heap objects. *) (* val serialize = fn x => serialize (ref x) * val deserialize = fn x => !(deserialize x) *) val share = Primitive.MLton.share structure GC = MLtonGC fun shareAll () = (GC.setHashConsDuringGC true ; GC.collect ()) fun size x = C_Size.toLargeInt (Primitive.MLton.size x) fun sizeAll () = C_Size.toLargeInt (Primitive.MLton.sizeAll (Primitive.MLton.GCState.gcState ())) (* fun cleanAtExit () = let open Cleaner in clean atExit end *) val debug = Primitive.Controls.debug val eq = Primitive.MLton.eq val equal = Primitive.MLton.equal val hash = Primitive.MLton.hash (* val errno = Primitive.errno *) val safe = Primitive.Controls.safe structure Array = Array structure BinIO = MLtonIO (BinIO) (*structure CallStack = MLtonCallStack*) structure CharArray = struct open CharArray type t = array end structure CharVector = struct open CharVector type t = vector end structure Cont = MLtonCont structure Exn = MLtonExn structure Finalizable = MLtonFinalizable structure IntInf = struct open IntInf type t = int end structure Itimer = MLtonItimer structure LargeReal = struct open LargeReal type t = real end structure LargeWord = struct open LargeWord type t = word end structure Platform = MLtonPlatform structure Pointer = MLtonPointer structure ProcEnv = MLtonProcEnv structure Process = MLtonProcess (* structure Ptrace = MLtonPtrace *) structure Profile = MLtonProfile structure Random = MLtonRandom structure Real = struct open Real type t = real end structure Real32 = struct open Real32 type t = real open Primitive.PackReal32 end structure Real64 = struct open Real64 type t = real open Primitive.PackReal64 end structure Rlimit = MLtonRlimit structure Rusage = MLtonRusage structure Signal = MLtonSignal structure Syslog = MLtonSyslog structure TextIO = MLtonIO (TextIO) structure Thread = MLtonThread structure Vector = Vector structure Weak = MLtonWeak structure World = MLtonWorld structure Word = struct open Word type t = word end structure Word8 = struct open Word8 type t = word end structure Word16 = struct open Word16 type t = word end structure Word32 = struct open Word32 type t = word end structure Word64 = struct open Word64 type t = word end structure Word8Array = struct open Word8Array type t = array end structure Word8Vector = struct open Word8Vector type t = vector end val _ = (Primitive.TopLevel.setHandler MLtonExn.defaultTopLevelHandler ; Primitive.TopLevel.setSuffix Exit.defaultTopLevelSuffix) end (* Patch OS.FileSys.tmpName to use mkstemp. *) structure OS = struct open OS structure FileSys = struct open FileSys fun tmpName () = let val (f, out) = MLton.TextIO.mkstemp (MLton.TextIO.tempPrefix "file") val _ = TextIO.closeOut out in f end end end mlton-20210117+dfsg/basis-library/mlton/mono-array.sig000066400000000000000000000001741416264345000225140ustar00rootroot00000000000000signature MLTON_MONO_ARRAY = sig type t type elem val fromPoly: elem array -> t val toPoly: t -> elem array end mlton-20210117+dfsg/basis-library/mlton/mono-vector.sig000066400000000000000000000001771416264345000227030ustar00rootroot00000000000000signature MLTON_MONO_VECTOR = sig type t type elem val fromPoly: elem vector -> t val toPoly: t -> elem vector end mlton-20210117+dfsg/basis-library/mlton/platform.sig000066400000000000000000000020731416264345000222540ustar00rootroot00000000000000(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PLATFORM = sig structure Arch: sig datatype t = Alpha | AMD64 | ARM | ARM64 | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | RISCV | S390 | Sparc | X86 val fromString: string -> t option val host: t val toString: t -> string end structure Format: sig datatype t = Archive | Executable | LibArchive | Library val fromString: string -> t option val host: t val toString: t -> string end structure OS: sig datatype t = AIX | Cygwin | Darwin | FreeBSD | Hurd | HPUX | Linux | MinGW | NetBSD | OpenBSD | Solaris val fromString: string -> t option val host: t val toString: t -> string end end mlton-20210117+dfsg/basis-library/mlton/platform.sml000066400000000000000000000047641416264345000222760ustar00rootroot00000000000000(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonPlatform: MLTON_PLATFORM = struct open Primitive.MLton.Platform fun peek (l, f) = List.find f l fun omap (opt, f) = Option.map f opt structure Arch = struct open Arch val all = [ (Alpha, "Alpha"), (AMD64, "AMD64"), (ARM, "ARM"), (ARM64, "ARM64"), (HPPA, "HPPA"), (IA64, "IA64"), (m68k, "m68k"), (MIPS, "MIPS"), (PowerPC, "PowerPC"), (PowerPC64, "PowerPC64"), (RISCV, "RISCV"), (S390, "S390"), (Sparc, "Sparc"), (X86, "X86")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end structure Format = struct open Format val all = [ (Archive, "Archive"), (Executable, "Executable"), (LibArchive, "LibArchive"), (Library, "Library")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end structure OS = struct open OS val all = [ (AIX, "AIX"), (Cygwin, "Cygwin"), (Darwin, "Darwin"), (FreeBSD, "FreeBSD"), (Hurd, "Hurd"), (HPUX, "HPUX"), (Linux, "Linux"), (MinGW, "MinGW"), (NetBSD, "NetBSD"), (OpenBSD, "OpenBSD"), (Solaris, "Solaris")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end end mlton-20210117+dfsg/basis-library/mlton/pointer.sig000066400000000000000000000032341416264345000221100ustar00rootroot00000000000000(* Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_POINTER = sig eqtype t val add: t * word -> t val compare: t * t -> order val diff: t * t -> word (* val free: t -> unit *) val getInt8: t * int -> Int8.int val getInt16: t * int -> Int16.int val getInt32: t * int -> Int32.int val getInt64: t * int -> Int64.int val getPointer: t * int -> t val getReal32: t * int -> Real32.real val getReal64: t * int -> Real64.real val getWord8: t * int -> Word8.word val getWord16: t * int -> Word16.word val getWord32: t * int -> Word32.word val getWord64: t * int -> Word64.word val null: t val setInt8: t * int * Int8.int -> unit val setInt16: t * int * Int16.int -> unit val setInt32: t * int * Int32.int -> unit val setInt64: t * int * Int64.int -> unit val setPointer: t * int * t -> unit val setReal32: t * int * Real32.real -> unit val setReal64: t * int * Real64.real -> unit val setWord8: t * int * Word8.word -> unit val setWord16: t * int * Word16.word -> unit val setWord32: t * int * Word32.word -> unit val setWord64: t * int * Word64.word -> unit val sizeofPointer: word val sub: t * word -> t end signature MLTON_POINTER_EXTRA = sig include MLTON_POINTER val getCPointer: t * int -> t val setCPointer: t * int * t -> unit val getObjptr: t * int -> 'a val setObjptr: t * int * 'a -> unit end mlton-20210117+dfsg/basis-library/mlton/pointer.sml000066400000000000000000000032231416264345000221170ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonPointer: MLTON_POINTER_EXTRA = struct open Primitive.MLton.Pointer val sizeofPointer = Word.div (Word.fromInt C_Size.wordSize, 0w8) val add = fn (p, t) => add (p, C_Ptrdiff.fromLarge (Word.toLargeIntX t)) val sub = fn (p, t) => sub (p, C_Ptrdiff.fromLarge (Word.toLargeIntX t)) val diff = fn (p, p') => Word.fromLargeInt (C_Ptrdiff.toLarge (diff (p, p'))) local fun wrap f (p, i) = f (p, C_Ptrdiff.fromInt i) in val getCPointer = wrap getCPointer val getInt8 = wrap getInt8 val getInt16 = wrap getInt16 val getInt32 = wrap getInt32 val getInt64 = wrap getInt64 val getObjptr = fn (p, i) => (wrap getObjptr) (p, i) val getReal32 = wrap getReal32 val getReal64 = wrap getReal64 val getWord8 = wrap getWord8 val getWord16 = wrap getWord16 val getWord32 = wrap getWord32 val getWord64 = wrap getWord64 end val getPointer = getCPointer local fun wrap f (p, i, x) = f (p, C_Ptrdiff.fromInt i, x) in val setCPointer = wrap setCPointer val setInt8 = wrap setInt8 val setInt16 = wrap setInt16 val setInt32 = wrap setInt32 val setInt64 = wrap setInt64 val setObjptr = fn (p, i, x) => (wrap setObjptr) (p, i, x) val setReal32 = wrap setReal32 val setReal64 = wrap setReal64 val setWord8 = wrap setWord8 val setWord16 = wrap setWord16 val setWord32 = wrap setWord32 val setWord64 = wrap setWord64 end val setPointer = setCPointer end mlton-20210117+dfsg/basis-library/mlton/proc-env.sig000066400000000000000000000006231416264345000221600ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROC_ENV = sig type gid val setenv: {name: string, value: string} -> unit val setgroups: gid list -> unit end mlton-20210117+dfsg/basis-library/mlton/proc-env.sml000066400000000000000000000016431416264345000221740ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonProcEnv: MLTON_PROC_ENV = struct structure GId = PrePosix.GId type gid = GId.t fun setenv {name, value} = let val name = NullString.nullTerm name val value = NullString.nullTerm value in PosixError.SysCall.simple (fn () => PrimitiveFFI.Posix.ProcEnv.setenv (name, value)) end fun setgroups gs = let val v = GId.vectorToRep (Vector.fromList gs) val n = C_Int.fromInt (Vector.length v) in PosixError.SysCall.simple (fn () => PrimitiveFFI.Posix.ProcEnv.setgroups (n, v)) end end mlton-20210117+dfsg/basis-library/mlton/process.sig000066400000000000000000000056371416264345000221170ustar00rootroot00000000000000(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROCESS = sig type pid val spawn: {args: string list, path: string} -> pid val spawne: {args: string list, env: string list, path: string} -> pid val spawnp: {file: string, args: string list} -> pid (* Process handle *) type ('stdin, 'stdout, 'stderr) t (* is the io 'dir input or output *) type input type output (* to what use can the stdio channel be put *) type none (* it's not connected to a pipe *) type chain (* connect one child to another *) type any (* any use is allowed -- dangerous *) exception MisuseOfForget (* you avoided the type safety and broke it *) exception DoublyRedirected (* you tried to reuse a Param.child *) structure Child: sig type ('use, 'dir) t val binIn: (BinIO.instream, input) t -> BinIO.instream val binOut: (BinIO.outstream, output) t -> BinIO.outstream (* not necessarily available on all systems; may raise an exception *) val fd: (Posix.FileSys.file_desc, 'dir) t -> Posix.FileSys.file_desc (* used for situations where 'forget' was needed for arbitrary redir *) val remember: (any, 'dir) t -> ('use, 'dir) t val textIn: (TextIO.instream, input) t -> TextIO.instream val textOut: (TextIO.outstream, output) t -> TextIO.outstream end structure Param: sig type ('use, 'dir) t (* {child,fd} close their parameter when create is called. * therefore they may only be used once! *) val child: (chain, 'dir) Child.t -> (none, 'dir) t (* Not necessarily available on all systems; may raise an exception *) val fd: Posix.FileSys.file_desc -> (none, 'dir) t val file: string -> (none, 'dir) t (* used if you want to return two posibilities; use with care *) val forget: ('use, 'dir) t -> (any, 'dir) t val null: (none, 'dir) t val pipe: ('use, 'dir) t val self: (none, 'dir) t end val create: {args: string list, env: string list option, path: string, stderr: ('stderr, output) Param.t, stdin: ('stdin, input) Param.t, stdout: ('stdout, output) Param.t} -> ('stdin, 'stdout, 'stderr) t val getStderr: ('stdin, 'stdout, 'stderr) t -> ('stderr, input) Child.t val getStdin: ('stdin, 'stdout, 'stderr) t -> ('stdin, output) Child.t val getStdout: ('stdin, 'stdout, 'stderr) t -> ('stdout, input) Child.t val kill: ('stdin, 'stdout, 'stderr) t * Posix.Signal.signal -> unit val reap: ('stdin, 'stdout, 'stderr) t -> Posix.Process.exit_status end mlton-20210117+dfsg/basis-library/mlton/process.sml000066400000000000000000000370421416264345000221230ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonProcess = struct structure Prim = PrimitiveFFI.MLton.Process structure MLton = Primitive.MLton local open Posix in structure FileSys = FileSys structure IO = IO structure ProcEnv = ProcEnv structure Process = Process structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Signal = PrePosix.Signal end structure Mask = MLtonSignal.Mask structure SysCall = PosixError.SysCall type pid = PId.t exception MisuseOfForget exception DoublyRedirected type input = unit type output = unit type none = unit type chain = unit type any = unit val useWindowsProcess = MLton.Platform.OS.useWindowsProcess val readWrite = let open FileSys.S in flags [irusr, iwusr, irgrp, iwgrp, iroth, iwoth] end structure Child = struct datatype 'use childt = FileDesc of FileSys.file_desc | Stream of 'use * ('use -> unit) | Term type ('use, 'dir) t = 'use childt ref (* This is _not_ the identity; by rebuilding it we get type * ('a, 'b) t -> ('c, 'd) t *) fun remember x = case !x of FileDesc f => (x := Stream ((), fn () => ()) ; ref (FileDesc f)) | Stream _ => raise MisuseOfForget (* remember twice = bad *) | Term => ref Term local fun convert (new, close) p = case !p of FileDesc fd => let val str = new (fd, "") val () = p := Stream (str, close) in str end | Stream (str, _) => str | Term => raise MisuseOfForget in val binIn = convert (BinIO.newIn, BinIO.closeIn) val binOut = convert (BinIO.newOut, BinIO.closeOut) val textIn = convert (TextIO.newIn, TextIO.closeIn) val textOut = convert (TextIO.newOut, TextIO.closeOut) end fun fd p = case !p of FileDesc fd => fd | _ => raise MisuseOfForget fun close ch = case ch of FileDesc fd => IO.close fd | Stream (str, close) => close str | Term => () val close = fn (stdin, stdout, stderr) => (close stdin; close stdout; close stderr) end structure Param = struct datatype ('use, 'dir) t = File of string | FileDesc of FileSys.file_desc | Pipe | Self (* This is _not_ the identity; by rebuilding it we get type * ('a, 'b) t -> ('c, 'd) t *) val forget = fn File x => File x | FileDesc f => FileDesc f | Pipe => Pipe | Self => Self val pipe = Pipe local val null = if useWindowsProcess then "nul" else "/dev/null" in val null = File null end val self = Self fun file f = File f fun fd f = FileDesc f fun child c = FileDesc (case !c of Child.FileDesc f => (c := Child.Stream ((), fn () => ()); f) | Child.Stream _ => raise DoublyRedirected | Child.Term => raise MisuseOfForget) fun setCloseExec fd = if useWindowsProcess then () else IO.setfd (fd, IO.FD.flags [IO.FD.cloexec]) local fun openOut std p = case p of File s => (FileSys.creat (s, readWrite), Child.Term) | FileDesc f => (f, Child.Term) | Pipe => let val {infd, outfd} = IO.pipe () val () = setCloseExec infd in (outfd, Child.FileDesc infd) end | Self => (std, Child.Term) in fun openStdout p = openOut FileSys.stdout p fun openStderr p = openOut FileSys.stderr p end fun openStdin p = case p of File s => (FileSys.openf (s, FileSys.O_RDONLY, FileSys.O.flags []), Child.Term) | FileDesc f => (f, Child.Term) | Pipe => let val {infd, outfd} = IO.pipe () val () = setCloseExec outfd in (infd, Child.FileDesc outfd) end | Self => (FileSys.stdin, Child.Term) fun close p fd = case p of File _ => IO.close fd | FileDesc _ => IO.close fd | Pipe => IO.close fd | _ => () end datatype ('stdin, 'stdout, 'stderr) t = T of {pid: Process.pid, (* if useWindowsProcess, * then this is a Windows process handle * and can't be passed to * Posix.Process.* functions. *) status: Posix.Process.exit_status option ref, stderr: ('stderr, input) Child.t, stdin: ('stdin, output) Child.t, stdout: ('stdout, input) Child.t} local fun make f (T r) = f r in val getStderr = fn z => make #stderr z val getStdin = fn z => make #stdin z val getStdout = fn z => make #stdout z end fun ('a, 'b) protect (f: 'a -> 'b, x: 'a): 'b = let val () = Mask.block Mask.all in DynamicWind.wind (fn () => f x, fn () => Mask.unblock Mask.all) end local fun reap reapFn (T {pid, status, stderr, stdin, stdout, ...}) = case !status of NONE => let val _ = Child.close (!stdin, !stdout, !stderr) val st = reapFn pid in status := SOME st ; st end | SOME st => st in fun reapForFork p = reap (fn pid => let (* protect is probably too much; typically, one * would only mask SIGINT, SIGQUIT and SIGHUP. *) val (_, st) = protect (Process.waitpid, (Process.W_CHILD pid, [])) in st end) p fun reapForCreate p = reap (fn pid => let val pid' = PId.toRep pid val status' = ref (C_Status.fromInt 0) val () = SysCall.simple (fn () => PrimitiveFFI.Windows.Process.getexitcode (pid', status')) in Process.fromStatus' (!status') end) p end val reap = fn p => (if useWindowsProcess then reapForCreate else reapForFork) p local fun kill killFn (p as T {pid, status, ...}, signal) = case !status of NONE => let val () = killFn (pid, signal) in ignore (reap p) end | SOME _ => () in fun killForFork p = kill (fn (pid, signal) => Process.kill (Process.K_PROC pid, signal)) p fun killForCreate p = kill (fn (pid, signal) => SysCall.simple (fn () => PrimitiveFFI.Windows.Process.terminate (PId.toRep pid, Signal.toRep signal))) p end val kill = fn (p, signal) => (if useWindowsProcess then killForCreate else killForFork) (p, signal) fun launchWithFork (path, args, env, stdin, stdout, stderr) = case protect (Process.fork, ()) of NONE => (* child *) let fun dup2 (old, new) = if old = new then () else (IO.dup2 {old = old, new = new}; IO.close old) val args = path :: args val execTh = case env of NONE => (fn () => Process.exec (path, args)) | SOME env => (fn () => Process.exece (path, args, env)) in dup2 (stdin, FileSys.stdin) ; dup2 (stdout, FileSys.stdout) ; dup2 (stderr, FileSys.stderr) ; ignore (execTh ()) ; Process.exit 0w127 (* just in case *) end | SOME pid => pid (* parent *) fun strContains seps s = CharVector.exists (Char.contains seps) s (* In MinGW, a string must be escaped if it contains " \t" or is "". * Escaping means adds "s on the front and end. Any quotes inside * must be escaped with \. Any \s already in the string must be * doubled ONLY when they precede a " or the end of string. *) fun mingwEscape (l, 0) = l | mingwEscape (l, i) = mingwEscape (#"\\"::l, i-1) fun mingwFold (#"\\", (l, escapeCount)) = (#"\\"::l, escapeCount+1) | mingwFold (#"\"", (l, escapeCount)) = (#"\"" :: mingwEscape (#"\\"::l, escapeCount), 0) | mingwFold (x, (l, _)) = (x :: l, 0) val mingwQuote = mingwEscape o CharVector.foldl mingwFold ([#"\""], 0) fun mingwEscape y = if not (strContains " \t\"" y) andalso y<>"" then y else String.implode (List.rev (#"\"" :: mingwQuote y)) fun cygwinEscape y = if not (strContains " \t\"\r\n\f'" y) andalso y<>"" then y else concat ["\"", String.translate (fn #"\"" => "\\\"" | #"\\" => "\\\\" | x => String.str x) y, "\""] val cmdEscapeCreate = if MLton.Platform.OS.host = MLton.Platform.OS.MinGW then mingwEscape else cygwinEscape val cmdEscapeSpawn = if MLton.Platform.OS.host = MLton.Platform.OS.MinGW then mingwEscape else (fn s => s) fun launchWithCreate (path, args, env, stdin, stdout, stderr) = let val path' = NullString.nullTerm (let open MLton.Platform.OS in case host of Cygwin => Cygwin.toFullWindowsPath path | MinGW => path | _ => raise Fail "MLton.Process.launchWithCreate: path'" end) val args' = NullString.nullTerm (String.concatWith " " (List.map cmdEscapeCreate (path :: args))) val env' = Option.map (fn env => NullString.nullTerm ((String.concatWith "\000" env) ^ "\000")) env val stdin' = FileDesc.toRep stdin val stdout' = FileDesc.toRep stdout val stderr' = FileDesc.toRep stderr val createTh = case env' of NONE => (fn () => PrimitiveFFI.Windows.Process.createNull (path', args', stdin', stdout', stderr')) | SOME env' => (fn () => PrimitiveFFI.Windows.Process.create (path', args', env', stdin', stdout', stderr')) val pid' = SysCall.simpleResult' ({errVal = C_PId.castFromFixedInt ~1}, fn () => createTh ()) val pid = PId.fromRep pid' in pid end val launch = fn z => (if useWindowsProcess then launchWithCreate else launchWithFork) z fun create {args, env, path, stderr, stdin, stdout} = if not (FileSys.access (path, [FileSys.A_EXEC])) then PosixError.raiseSys PosixError.noent else let val () = TextIO.flushOut TextIO.stdOut val (fstdin, cstdin) = Param.openStdin stdin val (fstdout, cstdout) = Param.openStdout stdout val (fstderr, cstderr) = Param.openStderr stderr val closeStdio = fn () => (Param.close stdin fstdin ; Param.close stdout fstdout ; Param.close stderr fstderr) val pid = launch (path, args, env, fstdin, fstdout, fstderr) handle ex => (closeStdio () ; Child.close (cstdin, cstdout, cstderr) ; raise ex) val () = closeStdio () in T {pid = pid, status = ref NONE, stderr = ref cstderr, stdin = ref cstdin, stdout = ref cstdout} end fun spawne {path, args, env} = if useWindowsProcess then let val args = List.map cmdEscapeSpawn args val path = NullString.nullTerm path val args = CUtil.C_StringArray.fromList args val env = CUtil.C_StringArray.fromList env in (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.spawne (path, args, env)) end else case Posix.Process.fork () of NONE => (Posix.Process.exece (path, args, env) handle _ => () ; Posix.Process.exit 0w127) | SOME pid => pid fun spawn {args, path}= spawne {args = args, env = ProcEnv.environ (), path = path} fun spawnp {args, file} = if useWindowsProcess then let val file = NullString.nullTerm file val args = List.map cmdEscapeSpawn args val args = CUtil.C_StringArray.fromList args in (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.spawnp (file, args)) end else case Posix.Process.fork () of NONE => (Posix.Process.execp (file, args) handle _ => () ; Posix.Process.exit 0w127) | SOME pid => pid open Exit end mlton-20210117+dfsg/basis-library/mlton/profile.sig000066400000000000000000000010531416264345000220650ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROFILE = sig structure Data: sig type t val equals: t * t -> bool val free: t -> unit val malloc: unit -> t val write: t * string -> unit end val isOn: bool (* a compile-time constant *) val withData: Data.t * (unit -> 'a) -> 'a end mlton-20210117+dfsg/basis-library/mlton/profile.sml000066400000000000000000000067051416264345000221070ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonProfile: MLTON_PROFILE = struct structure P = Primitive.MLton.Profile val gcState = Primitive.MLton.GCState.gcState val isOn = P.isOn structure Data = struct datatype t = T of {isCurrent: bool ref, isFreed: bool ref, raw: P.Data.t} val all: t list ref = ref [] local fun make f (T r) = f r in val isFreed = make #isFreed val raw = make #raw end fun equals (d, d') = isFreed d = isFreed d' fun free (d as T {isCurrent, isFreed, raw, ...}) = if not isOn then () else if !isFreed then raise Fail "free of freed profile data" else if !isCurrent then raise Fail "free of current profile data" else (all := List.foldl (fn (d', ac) => if equals (d, d') then ac else d' :: ac) [] (!all) ; P.Data.free (gcState (), raw) ; isFreed := true) fun make (raw: P.Data.t): t = T {isCurrent = ref false, isFreed = ref false, raw = raw} fun malloc (): t = let val array = if isOn then P.Data.malloc (gcState ()) else P.Data.dummy val d = make array val _ = all := d :: !all in d end fun write (T {isFreed, raw, ...}, file) = if not isOn then () else if !isFreed then raise Fail "write of freed profile data" else P.Data.write (gcState (), raw, Primitive.NullString8.fromString (String.nullTerm file)) end val r: Data.t ref = ref (Data.make P.Data.dummy) fun current () = !r fun setCurrent (d as Data.T {isCurrent, isFreed, raw, ...}) = if not isOn then () else if !isFreed then raise Fail "setCurrent of freed profile data" else let val Data.T {isCurrent = ic, ...} = current () val _ = ic := false val _ = isCurrent := true val _ = r := d val _ = P.setCurrent (gcState (), raw) in () end fun withData (d: Data.t, f: unit -> 'a): 'a = let val old = current () val _ = setCurrent d in DynamicWind.wind (f, fn () => setCurrent old) end fun init () = setCurrent (Data.make (P.getCurrent (gcState ()))) val _ = if not isOn then () else let val _ = Cleaner.addNew (Cleaner.atExit, fn () => (P.done (gcState ()) ; Data.write (current (), "mlmon.out") ; List.app (fn d => P.Data.free (gcState (), Data.raw d)) (!Data.all))) val _ = Cleaner.addNew (Cleaner.atLoadWorld, fn () => ((* In a new world, all of the old profiling data is invalid. *) Data.all := [] ; init ())) in init () end end mlton-20210117+dfsg/basis-library/mlton/ptrace.sig000066400000000000000000000010311416264345000216770ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PTRACE = sig type pid val attach: pid -> unit val cont: pid -> unit val detach: pid -> unit val kill: pid -> unit val peekText: pid * Word.word -> Word.word val singleStep: pid -> unit val sysCall: pid -> unit end mlton-20210117+dfsg/basis-library/mlton/ptrace.sml000066400000000000000000000016041416264345000217160ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonPtrace: MLTON_PTRACE = struct open Primitive.Ptrace type pid = Pid.t local fun make request pid = PosixError.checkResult(ptrace2(request, pid)) in val attach = make ATTACH val cont = make CONT val detach = make DETACH val kill = make KILL val singleStep = make SINGLESTEP val sysCall = make SYSCALL end local in fun peekText(pid, addr) = let val data: word ref = ref 0w0 in PosixError.checkResult(ptrace4(PEEKTEXT, pid, addr, data)) ; !data end end end mlton-20210117+dfsg/basis-library/mlton/random.sig000066400000000000000000000017411416264345000217110ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RANDOM = sig (* Return a random alphanumeric character. *) val alphaNumChar: unit -> char (* Return a string of random alphanumeric characters of specified * length. *) val alphaNumString: int -> string (* Get the next pseudrandom. *) val rand: unit -> word (* Use /dev/random to get a word. Useful as an arg to srand. * Return NONE if /dev/random can't be read. *) val seed: unit -> word option (* Set the seed used by rand. *) val srand: word -> unit (* Use /dev/urandom to get a word. Useful as an arg to srand. * Return NONE if /dev/urandom can't be read. *) val useed: unit -> word option end mlton-20210117+dfsg/basis-library/mlton/random.sml000066400000000000000000000065711416264345000217300ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonRandom: MLTON_RANDOM = struct (* Uses /dev/random and /dev/urandom to get a random word. * If they can't be read from, return NONE. *) local fun make (file, name) = let val buf = Word8Array.array (4, 0w0) in fn () => (let val fd = let open Posix.FileSys in openf (file, O_RDONLY, O.flags []) end fun loop rem = let val n = Posix.IO.readArr (fd, Word8ArraySlice.slice (buf, 4 - rem, SOME rem)) val _ = if n = 0 then (Posix.IO.close fd; raise Fail name) else () val rem = rem - n in if rem = 0 then () else loop rem end val _ = loop 4 val _ = Posix.IO.close fd in SOME (Word.fromLarge (PackWord32Little.subArr (buf, 0))) end handle OS.SysErr _ => NONE) end in val seed = make ("/dev/random", "Random.seed") val useed = make ("/dev/urandom", "Random.useed") end local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end fun srand (w: word): unit = seed := w end local val chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" val numChars = String.size chars val refresh = let val numChars = IntInf.fromInt numChars fun loop (i: IntInf.int, c: int): int = if IntInf.< (i, numChars) then c else loop (IntInf.div (i, numChars), c + 1) in loop (IntInf.pow (2, Word.wordSize), 0) end val r: word ref = ref 0w0 val count: int ref = ref refresh val numChars = Word.fromInt numChars in fun alphaNumChar (): char = let val n = !count val _ = if n = refresh then (r := rand () ; count := 1) else (count := n + 1) val w = !r val c = String.sub (chars, Word.toInt (Word.mod (w, numChars))) val _ = r := Word.div (w, numChars) in c end end fun alphaNumString (length: int): string = String.tabulate (length, fn _ => alphaNumChar ()) end mlton-20210117+dfsg/basis-library/mlton/real.sig000066400000000000000000000007651416264345000213610ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_REAL = sig type t val fromWord: word -> t val fromLargeWord: LargeWord.word -> t val toWord: IEEEReal.rounding_mode -> t -> word val toLargeWord: IEEEReal.rounding_mode -> t -> LargeWord.word end mlton-20210117+dfsg/basis-library/mlton/rlimit.sig000066400000000000000000000025131416264345000217270ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RLIMIT = sig structure RLim : sig type t val castFromSysWord: SysWord.word -> t val castToSysWord: t -> SysWord.word end val infinity: RLim.t type t val coreFileSize: t (* CORE max core file size *) val cpuTime: t (* CPU CPU time in seconds *) val dataSize: t (* DATA max data size *) val fileSize: t (* FSIZE Maximum filesize *) val numFiles: t (* NOFILE max number of open files *) val stackSize: t (* STACK max stack size *) val virtualMemorySize: t (* AS virtual memory limit *) (* NOT STANDARD *) val lockedInMemorySize: t (* MEMLOCK max locked address space *) val numProcesses: t (* NPROC max number of processes *) val residentSetSize: t (* RSS max resident set size *) (* *) val get: t -> {hard: RLim.t, soft: RLim.t} val set: t * {hard: RLim.t, soft: RLim.t} -> unit end mlton-20210117+dfsg/basis-library/mlton/rlimit.sml000066400000000000000000000023621416264345000217420ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonRlimit: MLTON_RLIMIT = struct open PrimitiveFFI.MLton.Rlimit structure RLim = struct type t = C_RLim.t val castFromSysWord = C_RLim.castFromSysWord val castToSysWord = C_RLim.castToSysWord end type t = C_Int.t val get = fn (r: t) => PosixError.SysCall.syscall (fn () => (get r, fn _ => {hard = getHard (), soft = getSoft ()})) val set = fn (r: t, {hard, soft}) => PosixError.SysCall.simple (fn () => set (r, hard, soft)) val infinity = INFINITY val coreFileSize = CORE val cpuTime = CPU val dataSize = DATA val fileSize = FSIZE val numFiles = NOFILE val stackSize = STACK val virtualMemorySize = AS (* NOT STANDARD *) val lockedInMemorySize = MEMLOCK val numProcesses = NPROC val residentSetSize = RSS (* *) end mlton-20210117+dfsg/basis-library/mlton/rusage.sig000066400000000000000000000007451416264345000217220ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RUSAGE = sig type t = {utime: Time.time, (* user time *) stime: Time.time} (* system time *) val measureGC: bool -> unit val rusage: unit -> {children: t, gc: t, self: t} end mlton-20210117+dfsg/basis-library/mlton/rusage.sml000066400000000000000000000033331416264345000217270ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonRusage: MLTON_RUSAGE = struct structure Prim = PrimitiveFFI.MLton.Rusage structure GCState = Primitive.MLton.GCState type t = {utime: Time.time, stime: Time.time} fun collect (utimeSec, utimeUsec, stimeSec, stimeUsec) = let fun toTime (sec, usec) = let val time_sec = Time.fromSeconds (C_Time.toLargeInt (sec ())) val time_usec = Time.fromMicroseconds (C_SUSeconds.toLargeInt (usec ())) in Time.+ (time_sec, time_usec) end in {stime = toTime (stimeSec, stimeUsec), utime = toTime (utimeSec, utimeUsec)} end val measureGC = MLtonGC.setRusageMeasureGC val rusage = let val () = measureGC true in fn () => let val () = Prim.getrusage (GCState.gcState ()) open Prim in {children = collect (children_utime_sec, children_utime_usec, children_stime_sec, children_stime_usec), gc = collect (gc_utime_sec, gc_utime_usec, gc_stime_sec, gc_stime_usec), self = collect (self_utime_sec, self_utime_usec, self_stime_sec, self_stime_usec)} end end end mlton-20210117+dfsg/basis-library/mlton/signal.sig000066400000000000000000000027741416264345000217150ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SIGNAL = sig type t type signal = t structure Handler: sig type t val default: t val handler: (MLtonThread.Runnable.t -> MLtonThread.Runnable.t) -> t val ignore: t val isDefault: t -> bool val isIgnore: t -> bool val simple: (unit -> unit) -> t end structure Mask: sig type t val all: t val allBut: signal list -> t val block: t -> unit val getBlocked: unit -> t val isMember: t * signal -> bool val none: t val setBlocked: t -> unit val some: signal list -> t val unblock: t -> unit end val getHandler: t -> Handler.t val handled: unit -> Mask.t val prof: t val restart: bool ref val setHandler: t * Handler.t -> unit (* suspend m temporarily sets the signal mask to m and suspends until an * unmasked signal is received and handled, and then resets the mask. *) val suspend: Mask.t -> unit val vtalrm: t end signature MLTON_SIGNAL_EXTRA = sig include MLTON_SIGNAL val handleGC: (unit -> unit) -> unit end mlton-20210117+dfsg/basis-library/mlton/signal.sml000066400000000000000000000156721416264345000217270ustar00rootroot00000000000000(* Copyright (C) 2015,2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonSignal: MLTON_SIGNAL_EXTRA = struct open Posix.Signal structure Prim = PrimitiveFFI.Posix.Signal structure GCState = Primitive.MLton.GCState structure Error = PosixError structure SysCall = Error.SysCall val restart = SysCall.restartFlag type t = signal type how = C_Int.t fun raiseInval () = let open PosixError in raiseSys inval end structure Mask = struct type pre_sig_set = Word8.word array type sig_set = Word8.word vector fun newSigSet (): (pre_sig_set * (unit -> sig_set)) = let val sslen = C_Size.toInt Prim.sigSetLen val ss = Array.array (sslen, 0wx0: Word8.word) in (ss, fn () => Array.vector ss) end type t = sig_set fun allBut sigs = let val (ss, finish) = newSigSet () val () = SysCall.simple (fn () => Prim.sigfillset ss) val () = List.app (fn s => SysCall.simple (fn () => Prim.sigdelset (ss, toRep s))) sigs in finish () end val all = allBut [] fun some sigs = let val (ss, finish) = newSigSet () val () = SysCall.simple (fn () => Prim.sigemptyset ss) val () = List.app (fn s => SysCall.simple (fn () => Prim.sigaddset (ss, toRep s))) sigs in finish () end val none = some [] fun isMember (ss, s) = SysCall.simpleResult (fn () => Prim.sigismember (ss, toRep s)) <> C_Int.zero local fun make (how: how) (ss: t) = let val (oss, finish) = newSigSet () val () = SysCall.simpleRestart (fn () => Prim.sigprocmask (how, ss, oss)) in finish () end in val block = ignore o make Prim.SIG_BLOCK val unblock = ignore o make Prim.SIG_UNBLOCK val setBlocked = ignore o make Prim.SIG_SETMASK fun getBlocked () = make Prim.SIG_BLOCK none end end structure Handler = struct datatype t = Default | Handler of MLtonThread.Runnable.t -> MLtonThread.Runnable.t | Ignore | InvalidSignal end datatype handler = datatype Handler.t local val r = ref C_Int.zero in fun initHandler (s: signal): Handler.t = SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.isDefault (toRep s, r), post = fn _ => if !r <> C_Int.zero then Default else Ignore, handlers = [(Error.inval, fn () => InvalidSignal)]}) end val (getHandler, setHandler, handlers) = let val handlers = Array.tabulate (C_Int.toInt Prim.NSIG, initHandler o fromInt) val _ = Cleaner.addNew (Cleaner.atLoadWorld, fn () => Array.modifyi (initHandler o fromInt o #1) handlers) in (fn s: t => Array.sub (handlers, toInt s), fn (s: t, h) => if Primitive.MLton.Profile.isOn andalso s = prof then raiseInval () else Array.update (handlers, toInt s, h), handlers) end val gcHandler = ref Ignore fun handled () = Mask.some (Array.foldri (fn (s, h, sigs) => case h of Handler _ => (fromInt s)::sigs | _ => sigs) [] handlers) structure Handler = struct open Handler val default = Default val ignore = Ignore val isDefault = fn Default => true | _ => false val isIgnore = fn Ignore => true | _ => false val handler = (* This let is used so that Thread.setHandler is only used if * Handler.handler is used. This prevents threads from being part * of every program. *) let (* As far as C is concerned, there is only one signal handler. * As soon as possible after a C signal is received, this signal * handler walks over the array of all SML handlers, and invokes any * one for which a C signal has been received. * * Any exceptions raised by a signal handler will be caught by * the topLevelHandler, which is installed in thread.sml. *) val _ = PosixError.SysCall.blocker := (fn () => let val m = Mask.getBlocked () val () = Mask.block (handled ()) in fn () => Mask.setBlocked m end) val () = MLtonThread.setSignalHandler (fn t => let val mask = Mask.getBlocked () val () = Mask.block (handled ()) val fs = case !gcHandler of Handler f => if Prim.isPendingGC (GCState.gcState ()) <> C_Int.zero then [f] else [] | _ => [] val fs = Array.foldri (fn (s, h, fs) => case h of Handler f => if Prim.isPending (GCState.gcState (), repFromInt s) <> C_Int.zero then f::fs else fs | _ => fs) fs handlers val () = Prim.resetPending (GCState.gcState ()) val () = Mask.setBlocked mask in List.foldl (fn (f, t) => f t) t fs end) in Handler end fun simple (f: unit -> unit) = handler (fn t => (f (); t)) end val setHandler = fn (s, h) => case (getHandler s, h) of (InvalidSignal, _) => raiseInval () | (_, InvalidSignal) => raiseInval () | (Default, Default) => () | (_, Default) => (setHandler (s, Default) ; SysCall.simpleRestart (fn () => Prim.default (GCState.gcState (), toRep s))) | (Handler _, Handler _) => setHandler (s, h) | (_, Handler _) => (setHandler (s, h) ; SysCall.simpleRestart (fn () => Prim.handlee (GCState.gcState (), toRep s))) | (Ignore, Ignore) => () | (_, Ignore) => (setHandler (s, Ignore) ; SysCall.simpleRestart (fn () => Prim.ignore (GCState.gcState (), toRep s))) fun suspend m = (Prim.sigsuspend m ; MLtonThread.switchToSignalHandler ()) fun handleGC f = (Prim.handleGC (GCState.gcState ()) ; gcHandler := Handler.simple f) end mlton-20210117+dfsg/basis-library/mlton/syslog.sig000066400000000000000000000037551416264345000217600ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* From Tom 7 . *) (* A rather complete interface to the syslog facilities. * * See * man 3 syslog * * .. for descriptions of these constants. *) signature MLTON_SYSLOG = sig type openflag val CONS : openflag val NDELAY : openflag val NOWAIT : openflag val ODELAY : openflag (* NOT STANDARD *) val PERROR : openflag (* *) val PID : openflag type facility val AUTHPRIV : facility val CRON : facility val DAEMON : facility val KERN : facility val LOCAL0 : facility val LOCAL1 : facility val LOCAL2 : facility val LOCAL3 : facility val LOCAL4 : facility val LOCAL5 : facility val LOCAL6 : facility val LOCAL7 : facility val LPR : facility val MAIL : facility val NEWS : facility (* NOT STANDARD *) val SYSLOG : facility (* *) val USER : facility val UUCP : facility type loglevel val EMERG : loglevel val ALERT : loglevel val CRIT : loglevel val ERR : loglevel val WARNING : loglevel val NOTICE : loglevel val INFO : loglevel val DEBUG : loglevel (* Closelog is also optional. *) val closelog: unit -> unit (* log a message at a particular loglevel. *) val log: loglevel * string -> unit (* * Openlog opens a connection to the system logger. * Calling openlog is optional but recommended. * From the man pages. * The string is prefixed to each message, and is typically set to the * program name. *) val openlog: string * openflag list * facility -> unit end mlton-20210117+dfsg/basis-library/mlton/syslog.sml000066400000000000000000000033251416264345000217620ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* From Tom 7 . *) (* Implementation of the SYSLOG interface using MLton FFI. * This will only work in MLton. *) structure MLtonSyslog :> MLTON_SYSLOG = struct open PrimitiveFFI.MLton.Syslog type openflag = C_Int.t local open Logopt in val CONS = LOG_CONS val NDELAY = LOG_NDELAY val NOWAIT = LOG_NOWAIT val ODELAY = LOG_ODELAY (* NOT STANDARD *) val PERROR = LOG_PERROR (* *) val PID = LOG_PID end type facility = C_Int.t local open Facility in val AUTHPRIV = LOG_AUTH val CRON = LOG_CRON val DAEMON = LOG_DAEMON val KERN = LOG_KERN val LOCAL0 = LOG_LOCAL0 val LOCAL1 = LOG_LOCAL1 val LOCAL2 = LOG_LOCAL2 val LOCAL3 = LOG_LOCAL3 val LOCAL4 = LOG_LOCAL4 val LOCAL5 = LOG_LOCAL5 val LOCAL6 = LOG_LOCAL6 val LOCAL7 = LOG_LOCAL7 val LPR = LOG_LPR val MAIL = LOG_MAIL val NEWS = LOG_NEWS (* NOT STANDARD *) val SYSLOG = LOG_SYSLOG (* *) val USER = LOG_USER val UUCP = LOG_UUCP end type loglevel = C_Int.t local open Severity in val ALERT = LOG_ALERT val CRIT = LOG_CRIT val DEBUG = LOG_DEBUG val EMERG = LOG_EMERG val ERR = LOG_ERR val INFO = LOG_INFO val NOTICE = LOG_NOTICE val WARNING = LOG_WARNING end val openlog = fn (s, opt, fac) => let val optf = foldl C_Int.orb 0 opt in openlog (NullString.nullTerm s, optf, fac) end val closelog = fn () => closelog () val log = fn (lev, msg) => syslog (lev, NullString.nullTerm msg) end mlton-20210117+dfsg/basis-library/mlton/text-io.sig000066400000000000000000000004371416264345000220230ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_TEXT_IO = MLTON_IO mlton-20210117+dfsg/basis-library/mlton/thread.sig000066400000000000000000000040711416264345000216770ustar00rootroot00000000000000(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_THREAD = sig structure AtomicState : sig datatype t = NonAtomic | Atomic of int end val atomically: (unit -> 'a) -> 'a val atomicBegin: unit -> unit val atomicEnd: unit -> unit val atomicState: unit -> AtomicState.t structure Runnable : sig type t end type 'a t (* atomicSwitch f * as switch, but assumes an atomic calling context. Upon * switch-ing back to the current thread, an implicit atomicEnd is * performed. *) val atomicSwitch: ('a t -> Runnable.t) -> 'a (* new f * create a new thread that, when run, applies f to * the value given to the thread. f must terminate by * switch-ing to another thread or exiting the process. *) val new: ('a -> unit) -> 'a t (* prepend(t, f) * create a new thread (destroying t in the process) that first * applies f to the value given to the thread and then continues * with t. This is a constant time operation. *) val prepend: 'a t * ('b -> 'a) -> 'b t (* prepare(t, v) * create a new runnable thread (destroying t in the process) * that will evaluate t on v. *) val prepare: 'a t * 'a -> Runnable.t (* switch f * apply f to the current thread to get rt, and then start * running thread rt. It is an error for f to * perform another switch. f is guaranteed to run * atomically. *) val switch: ('a t -> Runnable.t) -> 'a end signature MLTON_THREAD_EXTRA = sig include MLTON_THREAD val amInSignalHandler: unit -> bool val register: int * (MLtonPointer.t -> unit) -> unit val setSignalHandler: (Runnable.t -> Runnable.t) -> unit val switchToSignalHandler: unit -> unit end mlton-20210117+dfsg/basis-library/mlton/thread.sml000066400000000000000000000214031416264345000217060ustar00rootroot00000000000000(* Copyright (C) 2014,2019 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonThread:> MLTON_THREAD_EXTRA = struct structure Prim = Primitive.MLton.Thread fun die (s: string): 'a = (PrimitiveFFI.Stdio.print s ; PrimitiveFFI.Posix.Process.exit 1 ; let exception DieFailed in raise DieFailed end) val gcState = Primitive.MLton.GCState.gcState structure AtomicState = struct datatype t = NonAtomic | Atomic of int end local open Prim in val atomicBegin = atomicBegin val atomicEnd = atomicEnd val atomicState = fn () => case atomicState () of 0wx0 => AtomicState.NonAtomic | w => AtomicState.Atomic (Word32.toInt w) end fun atomically f = (atomicBegin (); DynamicWind.wind (f, atomicEnd)) datatype 'a thread = Dead | Interrupted of Prim.thread | New of 'a -> unit (* In Paused (f, t), f is guaranteed to not raise an exception. *) | Paused of ((unit -> 'a) -> unit) * Prim.thread datatype 'a t = T of 'a thread ref structure Runnable = struct type t = unit t end fun prepend (T r: 'a t, f: 'b -> 'a): 'b t = let val t = case !r of Dead => raise Fail "prepend to a Dead thread" | Interrupted _ => raise Fail "prepend to a Interrupted thread" | New g => New (g o f) | Paused (g, t) => Paused (fn h => g (f o h), t) in r := Dead ; T (ref t) end fun prepare (t: 'a t, v: 'a): Runnable.t = prepend (t, fn () => v) fun new f = T (ref (New f)) local local val func: (unit -> unit) option ref = ref NONE val base: Prim.preThread = let val () = Prim.copyCurrent () in case !func of NONE => Prim.savedPre (gcState ()) | SOME x => (* This branch never returns. *) let (* Atomic 1 *) val () = func := NONE val () = atomicEnd () (* Atomic 0 *) in (x () handle e => MLtonExn.topLevelHandler e) ; die "Thread didn't exit properly.\n" end end in fun newThread (f: unit -> unit) : Prim.thread = let (* Atomic 2 *) val () = func := SOME f in Prim.copy base end end val switching = ref false in fun 'a atomicSwitch (f: 'a t -> Runnable.t): 'a = (* Atomic 1 *) if !switching then let val () = atomicEnd () (* Atomic 0 *) in raise Fail "nested Thread.switch" end else let val _ = switching := true val r : (unit -> 'a) ref = ref (fn () => die "Thread.atomicSwitch didn't set r.\n") val t: 'a thread ref = ref (Paused (fn x => r := x, Prim.current (gcState ()))) fun fail e = (t := Dead ; switching := false ; atomicEnd () ; raise e) val (T t': Runnable.t) = f (T t) handle e => fail e val primThread = case !t' before t' := Dead of Dead => fail (Fail "switch to a Dead thread") | Interrupted t => t | New g => (atomicBegin (); newThread g) | Paused (f, t) => (f (fn () => ()); t) val _ = switching := false (* Atomic 1 when Paused/Interrupted, Atomic 2 when New *) val _ = Prim.switchTo primThread (* implicit atomicEnd() *) (* Atomic 0 when resuming *) in !r () end fun switch f = (atomicBegin () ; atomicSwitch f) end fun fromPrimitive (t: Prim.thread): Runnable.t = T (ref (Interrupted t)) fun toPrimitive (t as T r : unit t): Prim.thread = case !r of Dead => die "Thread.toPrimitive saw Dead.\n" | Interrupted t => (r := Dead ; t) | New _ => switch (fn cur : Prim.thread t => prepare (prepend (t, fn () => switch (fn t' : unit t => prepare (cur, toPrimitive t'))), ())) | Paused (f, t) => (r := Dead ; f (fn () => ()) ; t) local val signalHandler: Prim.thread option ref = ref NONE datatype state = Normal | InHandler val state: state ref = ref Normal in fun amInSignalHandler () = InHandler = !state fun setSignalHandler (f: Runnable.t -> Runnable.t): unit = let val _ = Primitive.MLton.installSignalHandler () fun loop (): unit = let (* Atomic 1 *) val _ = state := InHandler val t = f (fromPrimitive (Prim.saved (gcState ()))) val _ = state := Normal val _ = Prim.finishSignalHandler (gcState ()) val _ = atomicSwitch (fn (T r) => let val _ = case !r of Paused (f, _) => f (fn () => ()) | _ => raise die "Thread.setSignalHandler saw strange thread" in t end) (* implicit atomicEnd () *) in loop () end val p = toPrimitive (new (fn () => loop () handle e => MLtonExn.topLevelHandler e)) val _ = signalHandler := SOME p in Prim.setSignalHandler (gcState (), p) end fun switchToSignalHandler () = let (* Atomic 0 *) val () = atomicBegin () (* Atomic 1 *) val () = Prim.startSignalHandler (gcState ()) (* implicit atomicBegin () *) (* Atomic 2 *) in case !signalHandler of NONE => raise Fail "no signal handler installed" | SOME t => Prim.switchTo t (* implicit atomicEnd() *) end end local in val register: int * (MLtonPointer.t -> unit) -> unit = let val exports = Array.array (Int32.toInt (Primitive.MLton.FFI.numExports), fn _ => raise Fail "undefined export") val worker : (Prim.thread * Prim.thread option ref) option ref = ref NONE fun mkWorker (): Prim.thread * Prim.thread option ref = let val thisWorker : (Prim.thread * Prim.thread option ref) option ref = ref NONE val savedRef : Prim.thread option ref = ref NONE fun workerLoop () = let (* Atomic 1 *) val p = Primitive.MLton.FFI.getOpArgsResPtr (gcState ()) val _ = atomicEnd () (* Atomic 0 *) val i = MLtonPointer.getInt32 (MLtonPointer.getPointer (p, 0), 0) val _ = (Array.sub (exports, Int32.toInt i) p) handle e => (TextIO.output (TextIO.stdErr, "Call from C to SML raised exception.\n") ; MLtonExn.topLevelHandler e) (* Atomic 0 *) val _ = atomicBegin () (* Atomic 1 *) val _ = worker := !thisWorker val _ = Prim.setSaved (gcState (), valOf (!savedRef)) val _ = savedRef := NONE val _ = Prim.returnToC () (* implicit atomicEnd() *) in workerLoop () end val workerThread = toPrimitive (new workerLoop) val _ = thisWorker := SOME (workerThread, savedRef) in (workerThread, savedRef) end fun handlerLoop (): unit = let (* Atomic 2 *) val saved = Prim.saved (gcState ()) val (workerThread, savedRef) = case !worker of NONE => mkWorker () | SOME (workerThread, savedRef) => (worker := NONE ; (workerThread, savedRef)) val _ = savedRef := SOME saved val _ = Prim.switchTo (workerThread) (* implicit atomicEnd() *) in handlerLoop () end val handlerThread = toPrimitive (new handlerLoop) val _ = Prim.setCallFromCHandler (gcState (), handlerThread) in fn (i, f) => Array.update (exports, i, f) end end end mlton-20210117+dfsg/basis-library/mlton/vector.sig000066400000000000000000000010241416264345000217250ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_VECTOR = sig val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b end mlton-20210117+dfsg/basis-library/mlton/weak.sig000066400000000000000000000004721416264345000213600ustar00rootroot00000000000000(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WEAK = sig type 'a t val get: 'a t -> 'a option val new: 'a -> 'a t end mlton-20210117+dfsg/basis-library/mlton/weak.sml000066400000000000000000000013351416264345000213700ustar00rootroot00000000000000(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonWeak = struct structure Weak = Primitive.MLton.Weak type 'a t = 'a Weak.t val new = Weak.new fun get (w: 'a t): 'a option = let (* Need to do the canGet after the get. If you did the canGet first, * there could be a GC that invalidates the pointer between the * canGet and the get. *) val x = Weak.get w in if Weak.canGet w then SOME x else NONE end end mlton-20210117+dfsg/basis-library/mlton/word.sig000066400000000000000000000006011416264345000213760ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORD = sig type t val bswap: t -> t val rol: t * word -> t val ror: t * word -> t end mlton-20210117+dfsg/basis-library/mlton/world.sig000066400000000000000000000011021416264345000215470ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORLD = sig datatype status = Clone | Original val load: string -> 'a (* Save the world to resume with the current thread. *) val save: string -> status (* Save the world to resume with the given thread. *) val saveThread: string * MLtonThread.Runnable.t -> unit end mlton-20210117+dfsg/basis-library/mlton/world.sml000066400000000000000000000036011416264345000215660ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonWorld: MLTON_WORLD = struct structure Prim = Primitive.MLton.World structure Error = PosixError structure SysCall = Error.SysCall val gcState = Primitive.MLton.GCState.gcState datatype status = Clone | Original (* Need to worry about: * - open file descriptors * - redetermine buffer status when restart *) fun save' (file: string): status = let val () = SysCall.simple' ({errVal = false}, fn () => (Prim.save (NullString.nullTerm file) ; Prim.getSaveStatus (gcState ()))) in if Prim.getAmOriginal (gcState ()) then Original else (Prim.setAmOriginal (gcState (), true) ; Cleaner.clean Cleaner.atLoadWorld ; Clone) end fun saveThread (file: string, t: MLtonThread.Runnable.t): unit = case save' file of Clone => MLtonThread.switch (fn _ => t) | Original => () fun save (file: string): status = if MLtonThread.amInSignalHandler () then raise Fail "cannot call MLton.World.save within signal handler" else save' file fun load (file: string): 'a = if let open OS_FileSys in access (file, [A_READ]) end then let val c = CommandLine.name () in Posix.Process.exec (c, [c, "@MLton", "load-world", file, "--"]) end else raise Fail (concat ["World.load can not read ", file]) end mlton-20210117+dfsg/basis-library/net/000077500000000000000000000000001416264345000173575ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/net/generic-sock.sig000066400000000000000000000011271416264345000224350ustar00rootroot00000000000000signature GENERIC_SOCK = sig val socket: Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock val socketPair: Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock val socket': Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock val socketPair': Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock end mlton-20210117+dfsg/basis-library/net/generic-sock.sml000066400000000000000000000023521416264345000224470ustar00rootroot00000000000000(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure GenericSock : GENERIC_SOCK = struct structure Prim = PrimitiveFFI.Socket.GenericSock structure PE = Posix.Error structure PESC = PE.SysCall fun socket' (af, st, p) = (Socket.fromRep o PESC.simpleResult) (fn () => Prim.socket (Net.AddrFamily.toRep af, Socket.SOCKExtra.toRep st, C_Int.fromInt p)) fun socketPair' (af, st, p) = let val a : C_Sock.t array = Array.array (2, C_Sock.fromInt 0) val get = fn i => Socket.fromRep (Array.sub (a, i)) in PESC.syscall (fn () => (Prim.socketPair (Net.AddrFamily.toRep af, Socket.SOCKExtra.toRep st, C_Int.fromInt p, a), fn _ => (get 0, get 1))) end fun socket (af, st) = socket' (af, st, 0) fun socketPair (af, st) = socketPair' (af, st, 0) end mlton-20210117+dfsg/basis-library/net/inet-sock.sig000066400000000000000000000014761416264345000217670ustar00rootroot00000000000000signature INET_SOCK = sig type inet type 'sock_type sock = (inet, 'sock_type) Socket.sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr type 'mode stream_sock = 'mode Socket.stream sock val inetAF: Socket.AF.addr_family val toAddr: NetHostDB.in_addr * int -> sock_addr val fromAddr: sock_addr -> NetHostDB.in_addr * int val any: int -> sock_addr structure UDP: sig val socket: unit -> dgram_sock val socket': int -> dgram_sock end structure TCP: sig val socket: unit -> 'mode stream_sock val socket': int -> 'mode stream_sock val getNODELAY: 'mode stream_sock -> bool val setNODELAY: 'mode stream_sock * bool -> unit end end mlton-20210117+dfsg/basis-library/net/inet-sock.sml000066400000000000000000000042251416264345000217730ustar00rootroot00000000000000(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure INetSock:> INET_SOCK = struct structure Prim = PrimitiveFFI.Socket.INetSock datatype inet = INET (* a phantom type*) type 'sock_type sock = (inet, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr val inetAF = Net.AddrFamily.fromRep PrimitiveFFI.Socket.AF.INET fun toAddr (in_addr, port) = let val port = Word16.fromInt port handle Overflow => PosixError.raiseSys PosixError.inval val port = Net.Word16.hton port val (sa, salen, finish) = Socket.newSockAddr () val _ = Prim.toAddr (NetHostDB.inAddrToWord8Vector in_addr, port, sa, salen) in finish () end fun any port = toAddr (NetHostDB.any (), port) fun fromAddr sa = let val () = Prim.fromAddr (Socket.unpackSockAddr sa) val port = Prim.getPort () val port = Net.Word16.ntoh port val port = Word16.toInt port val (ia, finish) = NetHostDB.newInAddr () val _ = Prim.getInAddr (NetHostDB.preInAddrToWord8Array ia) in (finish (), port) end structure UDP = struct fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.dgram, prot) fun socket () = socket' 0 end structure TCP = struct structure Prim = Prim.Ctl fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.stream, prot) fun socket () = socket' 0 fun getNODELAY sock = Socket.CtlExtra.getSockOptBool (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) sock fun setNODELAY (sock, optval) = Socket.CtlExtra.setSockOptBool (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) (sock,optval) end end mlton-20210117+dfsg/basis-library/net/net-host-db.sig000066400000000000000000000015711416264345000222130ustar00rootroot00000000000000signature NET_HOST_DB = sig eqtype addr_family type entry eqtype in_addr val addr: entry -> in_addr val addrType: entry -> addr_family val addrs: entry -> in_addr list val aliases: entry -> string list val fromString: string -> in_addr option val getByAddr: in_addr -> entry option val getByName: string -> entry option val getHostName: unit -> string val name: entry -> string val scan: (char, 'a) StringCvt.reader -> (in_addr, 'a) StringCvt.reader val toString: in_addr -> string end signature NET_HOST_DB_EXTRA = sig include NET_HOST_DB type pre_in_addr val any: unit -> in_addr val inAddrToWord8Vector: in_addr -> Word8.word vector val newInAddr: unit -> pre_in_addr * (unit -> in_addr) val preInAddrToWord8Array: pre_in_addr -> Word8.word array end mlton-20210117+dfsg/basis-library/net/net-host-db.sml000066400000000000000000000174751416264345000222360ustar00rootroot00000000000000(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NetHostDB: NET_HOST_DB_EXTRA = struct structure Prim = PrimitiveFFI.NetHostDB (* network byte order (big-endian) *) type pre_in_addr = Word8.word array type in_addr = Word8.word vector val preInAddrToWord8Array = fn a => a val inAddrToWord8Vector = fn v => v val inAddrLen = C_Size.toInt Prim.inAddrSize fun newInAddr () = let val ia: pre_in_addr = Array.array (inAddrLen, 0wx0: Word8.word) fun finish () = Array.vector ia in (ia, finish) end fun any () = let val (wa, finish) = newInAddr () fun loop (i, acc) = if i >= inAddrLen then () else let val w = Word8.castFromSysWord (C_Int.castToSysWord acc) val () = Array.update (wa, (inAddrLen - 1) - i, w) in loop (i + 1, C_Int.>> (acc, 0w4)) end in loop (0, Prim.INADDR_ANY) ; finish () end structure AddrFamily = Net.AddrFamily type addr_family = AddrFamily.t datatype entry = T of {name: string, aliases: string list, addrType: addr_family, addrs: in_addr list} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val addrType = make #addrType val addrs = make #addrs end fun addr entry = hd (addrs entry) local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val addrType = Prim.getEntryAddrType () val length = Prim.getEntryLength () val numAddrs = Prim.getEntryAddrsNum () fun fill (n, addrs) = if C_Int.< (n, numAddrs) then let val addr = Word8Array.array (C_Int.toInt length, 0wx0) val _ = Prim.getEntryAddrsN (n, Word8Array.toPoly addr) val addr = Word8Vector.toPoly (Word8Array.vector addr) in fill (C_Int.+ (n, 1), addr::addrs) end else List.rev addrs val addrs = fill (0, []) in SOME (T {name = name, aliases = aliases, addrType = AddrFamily.fromRep addrType, addrs = addrs}) end else NONE in fun getByAddr in_addr = get (Prim.getByAddress (in_addr, C_Socklen.fromInt (Vector.length in_addr))) fun getByName name = get (Prim.getByName (NullString.nullTerm name)) end fun getHostName () = let val n = 128 val buf = CharArray.array (n, #"\000") val () = Posix.Error.SysCall.simple (fn () => Prim.getHostName (CharArray.toPoly buf, C_Size.fromInt n)) in case CharArray.findi (fn (_, c) => c = #"\000") buf of NONE => CharArray.vector buf | SOME (i, _) => CharArraySlice.vector (CharArraySlice.slice (buf, 0, SOME i)) end fun scan reader state = let fun scanW state = case reader state of SOME (#"0", state') => (case reader state' of NONE => SOME (0w0, state') | SOME (c, state'') => if Char.isDigit c then StringCvt.wdigits StringCvt.OCT reader state' else if c = #"x" orelse c = #"X" then StringCvt.wdigits StringCvt.HEX reader state'' else SOME (0w0, state')) | _ => StringCvt.wdigits StringCvt.DEC reader state fun loop (n, state, acc) = if n <= 0 then List.rev acc else let fun finish (w, state) = case reader state of SOME (#".", state') => loop (n - 1, state', (w, state)::acc) | _ => List.rev ((w, state)::acc) in case scanW state of SOME (w, state') => finish (w, state') | NONE => List.rev acc end val l = loop (4, state, []) fun get1 w = (Word8.fromLarge (Word.toLarge (Word.andb (w, 0wxFF))), Word.>>(w, 0w8)) fun get2 w = let val (a,w) = get1 w val (b,w) = get1 w in (a,b,w) end fun get3 w = let val (a,b,w) = get2 w val (c,w) = get1 w in (a,b,c,w) end fun get4 w = let val (a,b,c,w) = get3 w val (d,w) = get1 w in (a,b,c,d,w) end fun try l = case l of [] => NONE | [(w, statew)] => let val (d,c,b,a,w) = get4 w in if w = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else NONE end | [(x, statex), (w, statew)] => let val (d,c,b,w) = get3 w val (a,x) = get1 x in if w = 0wx0 andalso x = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(x, statex)] end | [(y, statey), (x, statex), (w, statew)] => let val (d,c,w) = get2 w val (b,x) = get1 x val (a,y) = get1 y in if w = 0wx0 andalso x = 0wx0 andalso y = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(y, statey), (x, statex)] end | [(z, statez), (y, statey), (x, statex), (w, statew)] => let val (d,w) = get1 w val (c,x) = get1 x val (b,y) = get1 y val (a,z) = get1 z in if w = 0wx0 andalso x = 0wx0 andalso y = 0wx0 andalso z = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(z, statez), (y, statey), (x, statex)] end | _ => NONE in try l end fun fromString s = StringCvt.scanString scan s fun toString in_addr = String.concatWith "." (Vector.foldr (fn (w,ss) => (Word8.fmt StringCvt.DEC w)::ss) [] in_addr) end mlton-20210117+dfsg/basis-library/net/net-prot-db.sig000066400000000000000000000003671416264345000222240ustar00rootroot00000000000000signature NET_PROT_DB = sig type entry val name: entry -> string val aliases: entry -> string list val protocol: entry -> int val getByName: string -> entry option val getByNumber: int -> entry option end mlton-20210117+dfsg/basis-library/net/net-prot-db.sml000066400000000000000000000033431416264345000222320ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NetProtDB: NET_PROT_DB = struct structure Prim = PrimitiveFFI.NetProtDB datatype entry = T of {name: string, aliases: string list, protocol: C_Int.t} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val protocol = C_Int.toInt o (make #protocol) end local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val protocol = Prim.getEntryProto () in SOME (T {name = name, aliases = aliases, protocol = protocol}) end else NONE in fun getByName name = get (Prim.getByName (NullString.nullTerm name)) fun getByNumber proto = get (Prim.getByNumber (C_Int.fromInt proto)) end end mlton-20210117+dfsg/basis-library/net/net-serv-db.sig000066400000000000000000000004651416264345000222160ustar00rootroot00000000000000signature NET_SERV_DB = sig type entry val name: entry -> string val aliases: entry -> string list val port: entry -> int val protocol: entry -> string val getByName: string * string option -> entry option val getByPort: int * string option -> entry option end mlton-20210117+dfsg/basis-library/net/net-serv-db.sml000066400000000000000000000045351416264345000222310ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NetServDB: NET_SERV_DB = struct structure Prim = PrimitiveFFI.NetServDB datatype entry = T of {name: string, aliases: string list, port: C_Int.t, protocol: string} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val port = C_Int.toInt o (make #port) val protocol = make #protocol end local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val port = Net.C_Int.ntoh (Prim.getEntryPort ()) val protocol = CUtil.C_String.toString (Prim.getEntryProto ()) in SOME (T {name = name, aliases = aliases, port = port, protocol = protocol}) end else NONE in fun getByName (name, proto) = case proto of SOME proto => get (Prim.getByName (NullString.nullTerm name, NullString.nullTerm proto)) | NONE => get (Prim.getByNameNull (NullString.nullTerm name)) fun getByPort (port, proto) = let val port = Net.C_Int.hton (C_Int.fromInt port) in case proto of NONE => get (Prim.getByPortNull port) | SOME proto => get (Prim.getByPort (port, NullString.nullTerm proto)) end end end mlton-20210117+dfsg/basis-library/net/net.sig000066400000000000000000000013011416264345000206440ustar00rootroot00000000000000(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature NET = sig structure AddrFamily : ABS_REP_EQ where type Rep.t = C_Int.t structure Sock : ABS_REP where type Rep.t = C_Sock.t structure SockType : ABS_REP_EQ where type Rep.t = C_Sock.t structure Word16 : sig val hton: Word16.word -> Word16.word val ntoh: Word16.word -> Word16.word end structure C_Int : sig val hton: C_Int.t -> C_Int.t val ntoh: C_Int.t -> C_Int.t end end mlton-20210117+dfsg/basis-library/net/net.sml000066400000000000000000000045711416264345000206710ustar00rootroot00000000000000(* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Net : NET = struct structure AddrFamily = MkAbsRepEq(type rep = C_Int.t) structure Sock = MkAbsRep(type rep = C_Sock.t) structure SockType = MkAbsRepEq(type rep = C_Int.t) structure Prim = PrimitiveFFI.Net structure Word32 = struct val hton = Prim.htonl val ntoh = Prim.ntohl end structure Word16 = struct val hton = Prim.htons val ntoh = Prim.ntohs end structure Int32 = struct val hton = Primitive.IntWordConv.idFromWord32ToInt32 o Word32.hton o Primitive.IntWordConv.idFromInt32ToWord32 val ntoh = Primitive.IntWordConv.idFromWord32ToInt32 o Word32.ntoh o Primitive.IntWordConv.idFromInt32ToWord32 end structure Int16 = struct val hton = Primitive.IntWordConv.idFromWord16ToInt16 o Word16.hton o Primitive.IntWordConv.idFromInt16ToWord16 val ntoh = Primitive.IntWordConv.idFromWord16ToInt16 o Word16.ntoh o Primitive.IntWordConv.idFromInt16ToWord16 end structure C_Int = struct local structure S = C_Int_ChooseIntN (type 'a t = 'a -> 'a val fInt8 = fn _ => raise Fail "Net.C_Int.hton: fInt8" val fInt16 = Int16.hton val fInt32 = Int32.hton val fInt64 = fn _ => raise Fail "Net.C_Int.hton: fInt64") in val hton = S.f end local structure S = C_Int_ChooseIntN (type 'a t = 'a -> 'a val fInt8 = fn _ => raise Fail "Net.C_Int.ntoh: fInt8" val fInt16 = Int16.ntoh val fInt32 = Int32.ntoh val fInt64 = fn _ => raise Fail "Net.C_Int.ntoh: fInt64") in val ntoh = S.f end end end mlton-20210117+dfsg/basis-library/net/socket.sig000066400000000000000000000213071416264345000213560ustar00rootroot00000000000000signature SOCKET = sig type active type dgram type in_flags = {peek: bool, oob: bool} type out_flags = {don't_route: bool, oob: bool} type passive datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS type ('af,'sock_type) sock type 'af sock_addr type sock_desc type 'mode stream structure AF: sig type addr_family = NetHostDB.addr_family val fromString: string -> addr_family option val list: unit -> (string * addr_family) list val toString: addr_family -> string end structure SOCK: sig eqtype sock_type val dgram: sock_type val fromString: string -> sock_type option val list: unit -> (string * sock_type) list val stream: sock_type val toString: sock_type -> string end structure Ctl: sig val getATMARK: ('af, active stream) sock -> bool val getBROADCAST: ('af, 'sock_type) sock -> bool val getDEBUG: ('af, 'sock_type) sock -> bool val getDONTROUTE: ('af, 'sock_type) sock -> bool val getERROR: ('af, 'sock_type) sock -> bool val getKEEPALIVE: ('af, 'sock_type) sock -> bool val getLINGER: ('af, 'sock_type) sock -> Time.time option val getNREAD: ('af, 'sock_type) sock -> int val getOOBINLINE: ('af, 'sock_type) sock -> bool val getPeerName: ('af, 'sock_type) sock -> 'af sock_addr val getRCVBUF: ('af, 'sock_type) sock -> int val getREUSEADDR: ('af, 'sock_type) sock -> bool val getSNDBUF: ('af, 'sock_type) sock -> int val getSockName: ('af, 'sock_type) sock -> 'af sock_addr val getTYPE: ('af, 'sock_type) sock -> SOCK.sock_type val setBROADCAST: ('af, 'sock_type) sock * bool -> unit val setDEBUG: ('af, 'sock_type) sock * bool -> unit val setDONTROUTE: ('af, 'sock_type) sock * bool -> unit val setKEEPALIVE: ('af, 'sock_type) sock * bool -> unit val setLINGER: ('af, 'sock_type) sock * Time.time option -> unit val setOOBINLINE: ('af, 'sock_type) sock * bool -> unit val setRCVBUF: ('af, 'sock_type) sock * int -> unit val setREUSEADDR: ('af, 'sock_type) sock * bool -> unit val setSNDBUF: ('af, 'sock_type) sock * int -> unit end val accept: ('af, passive stream) sock -> (('af, active stream) sock * 'af sock_addr) val acceptNB: ('af, passive stream) sock -> (('af, active stream) sock * 'af sock_addr) option val bind: ('af, 'sock_type) sock * 'af sock_addr -> unit val close: ('af, 'sock_type) sock -> unit val connect: ('af, 'sock_type) sock * 'af sock_addr -> unit val connectNB: ('af, 'sock_type) sock * 'af sock_addr -> bool val familyOfAddr: 'af sock_addr -> AF.addr_family val ioDesc: ('af, 'sock_type) sock -> OS.IO.iodesc val listen: ('af, passive stream) sock * int -> unit val recvArr: ('af, active stream) sock * Word8ArraySlice.slice -> int val recvArr': (('af, active stream) sock * Word8ArraySlice.slice * in_flags) -> int val recvArrFrom: (('af, dgram) sock * Word8ArraySlice.slice -> int * 'af sock_addr) val recvArrFrom': (('af, dgram) sock * Word8ArraySlice.slice * in_flags -> int * 'af sock_addr) val recvArrFromNB: (('af, dgram) sock * Word8ArraySlice.slice -> (int * 'af sock_addr) option) val recvArrFromNB': (('af, dgram) sock * Word8ArraySlice.slice * in_flags -> (int * 'af sock_addr) option) val recvArrNB: (('af, active stream) sock * Word8ArraySlice.slice) -> int option val recvArrNB': (('af, active stream) sock * Word8ArraySlice.slice * in_flags) -> int option val recvVec: ('af, active stream) sock * int -> Word8Vector.vector val recvVec': (('af, active stream) sock * int * in_flags -> Word8Vector.vector) val recvVecFrom: (('af, dgram) sock * int -> Word8Vector.vector * 'af sock_addr) val recvVecFrom': (('af, dgram) sock * int * in_flags -> Word8Vector.vector * 'af sock_addr) val recvVecFromNB: (('af, dgram) sock * int -> (Word8Vector.vector * 'af sock_addr) option) val recvVecFromNB': (('af, dgram) sock * int * in_flags -> (Word8Vector.vector * 'af sock_addr) option) val recvVecNB: ('af, active stream) sock * int -> Word8Vector.vector option val recvVecNB': (('af, active stream) sock * int * in_flags -> Word8Vector.vector option) val sameAddr: 'af sock_addr * 'af sock_addr -> bool val sameDesc: sock_desc * sock_desc -> bool val select: {exs: sock_desc list, rds: sock_desc list, timeout: Time.time option, wrs: sock_desc list} -> {exs: sock_desc list, rds: sock_desc list, wrs: sock_desc list} val sendArr: ('af, active stream) sock * Word8ArraySlice.slice -> int val sendArr': (('af, active stream) sock * Word8ArraySlice.slice * out_flags) -> int val sendArrNB: (('af, active stream) sock * Word8ArraySlice.slice -> int option) val sendArrNB': (('af, active stream) sock * Word8ArraySlice.slice * out_flags) -> int option val sendArrTo: (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice) -> unit val sendArrTo': (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags) -> unit val sendArrToNB: (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice) -> bool val sendArrToNB': (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags) -> bool val sendVec: ('af, active stream) sock * Word8VectorSlice.slice -> int val sendVec': (('af, active stream) sock * Word8VectorSlice.slice * out_flags) -> int val sendVecNB: (('af, active stream) sock * Word8VectorSlice.slice) -> int option val sendVecNB': (('af, active stream) sock * Word8VectorSlice.slice * out_flags) -> int option val sendVecTo: (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice) -> unit val sendVecTo': (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags) -> unit val sendVecToNB: (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice) -> bool val sendVecToNB': (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags) -> bool val shutdown: ('af, 'mode stream) sock * shutdown_mode -> unit val sockDesc: ('af, 'sock_type) sock -> sock_desc end signature SOCKET_EXTRA = sig include SOCKET val fromRep : C_Sock.t -> ('af, 'sock_type) sock val toRep : ('af, 'sock_type) sock -> C_Sock.t val sockToWord: ('af, 'sock_type) sock -> SysWord.word val wordToSock: SysWord.word -> ('af, 'sock_type) sock val sockToFD: ('af, 'sock_type) sock -> Posix.FileSys.file_desc val fdToSock: Posix.FileSys.file_desc -> ('af, 'sock_type) sock type pre_sock_addr = Word8.word array val unpackSockAddr: 'af sock_addr -> Word8.word vector val newSockAddr: unit -> (pre_sock_addr * C_Socklen.t ref * (unit -> 'af sock_addr)) structure SOCKExtra: sig val toRep : SOCK.sock_type -> C_Sock.t end structure CtlExtra: sig type level = C_Int.int type optname = C_Int.int val getERROR: ('af, 'sock_type) sock -> (string * Posix.Error.syserror option) option val getSockOptBool: level * optname -> ('af, 'sock_type) sock -> bool val setSockOptBool: level * optname -> ('af, 'sock_type) sock * bool -> unit end end mlton-20210117+dfsg/basis-library/net/socket.sml000066400000000000000000000477641416264345000214060ustar00rootroot00000000000000(* Copyright (C) 2012,2013,2015,2017 Matthew Fluet. * Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Socket :> SOCKET_EXTRA = struct structure Prim = PrimitiveFFI.Socket structure Error = Posix.Error structure Syscall = Error.SysCall structure FileSys = Posix.FileSys structure Sock = Net.Sock type sock = Sock.t val fromRep = Sock.fromRep val toRep = Sock.toRep val sockToWord = C_Sock.castToSysWord o Sock.toRep val wordToSock = Sock.fromRep o C_Sock.castFromSysWord val sockToFD = PrePosix.FileDesc.fromRep o Sock.toRep val fdToSock = Sock.fromRep o PrePosix.FileDesc.toRep type pre_sock_addr = Word8.word array datatype sock_addr = SA of Word8.word vector fun unpackSockAddr (SA sa) = sa fun newSockAddr (): (pre_sock_addr * C_Socklen.t ref * (unit -> sock_addr)) = let val salen = C_Size.toInt Prim.sockAddrStorageLen val sa = Array.array (salen, 0wx0: Word8.word) val salenRef = ref (C_Socklen.fromInt salen) fun finish () = SA (ArraySlice.vector (ArraySlice.slice (sa, 0, SOME (C_Socklen.toInt (!salenRef))))) in (sa, salenRef, finish) end datatype dgram = DGRAM (* phantom *) datatype stream = MODE (* phantom *) datatype passive = PASSIVE (* phantom *) datatype active = ACTIVE (* phantom *) structure AddrFamily = Net.AddrFamily structure AF = struct type addr_family = AddrFamily.t val names : (string * addr_family) list = ("UNIX", AddrFamily.fromRep Prim.AF.UNIX) :: ("INET", AddrFamily.fromRep Prim.AF.INET) :: ("INET6", AddrFamily.fromRep Prim.AF.INET6) :: ("UNSPEC", AddrFamily.fromRep Prim.AF.UNSPEC) :: nil fun list () = names fun toString af' = case List.find (fn (_, af) => af = af') names of SOME (name, _) => name | NONE => raise (Fail "Internal error: bogus addr_family") fun fromString name' = case List.find (fn (name, _) => name = name') names of SOME (_, af) => SOME af | NONE => NONE end structure SockType = Net.SockType structure SOCK = struct type sock_type = SockType.t val toRep = SockType.toRep val fromRep = SockType.fromRep val stream = SockType.fromRep Prim.SOCK.STREAM val dgram = SockType.fromRep Prim.SOCK.DGRAM val names : (string * sock_type) list = ("STREAM", stream) :: ("DGRAM", dgram) :: nil fun list () = names fun toString st' = case List.find (fn (_, st) => st = st') names of SOME (name, _) => name | NONE => raise (Fail "Internal error: bogus sock_type") fun fromString name' = case List.find (fn (name, _) => name = name') names of SOME (_, st) => SOME st | NONE => NONE end structure SOCKExtra = SOCK structure CtlExtra = struct type level = C_Int.t type optname = C_Int.t type request = C_Int.t fun getSockOptC_Int (level: level, optname: optname) s : C_Int.t = let val optval = ref (C_Int.fromInt 0) val () = Syscall.simple (fn () => Prim.Ctl.getSockOptC_Int (Sock.toRep s, level, optname, optval)) in ! optval end fun setSockOptC_Int (level: level, optname: optname) (s, optval: C_Int.t) : unit = let val () = Syscall.simple (fn () => Prim.Ctl.setSockOptC_Int (Sock.toRep s, level, optname, optval)) in () end fun getSockOptBool (level: level, optname: optname) s : bool = if getSockOptC_Int (level, optname) s = 0 then false else true fun setSockOptBool (level: level, optname: optname) (s, optval: bool) : unit = setSockOptC_Int (level, optname) (s, if optval then C_Int.fromInt 1 else C_Int.fromInt 0) fun gsSockOptBool (level: level, optname: optname) = (getSockOptBool (level, optname), setSockOptBool (level, optname)) fun getSockOptInt (level: level, optname: optname) s : int = C_Int.toInt (getSockOptC_Int (level, optname) s) fun setSockOptInt (level: level, optname: optname) (s, optval: int) : unit = setSockOptC_Int (level, optname) (s, C_Int.fromInt optval) fun gsSockOptInt (level: level, optname: optname) = (getSockOptInt (level, optname), setSockOptInt (level, optname)) fun getSockOptTimeOption (level: level, optname: optname) s : Time.time option = let val optval_l_onoff = ref (C_Int.fromInt 0) val optval_l_linger = ref (C_Int.fromInt 0) val () = Syscall.simple (fn () => Prim.Ctl.getSockOptC_Linger (Sock.toRep s, level, optname, optval_l_onoff, optval_l_linger)) in if ! optval_l_onoff = 0 then NONE else SOME (Time.fromSeconds (C_Int.toLarge (! optval_l_linger))) end fun setSockOptTimeOption (level: level, optname: optname) (s, optval: Time.time option) : unit = let val (optval_l_onoff, optval_l_linger) = case optval of NONE => (C_Int.fromInt 0, C_Int.fromInt 0) | SOME t => (C_Int.fromInt 1, C_Int.fromLarge (Time.toSeconds t)) val () = Syscall.simple (fn () => Prim.Ctl.setSockOptC_Linger (Sock.toRep s, level, optname, optval_l_onoff, optval_l_linger)) in () end val (getDEBUG, setDEBUG) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DEBUG) val (getREUSEADDR, setREUSEADDR) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_REUSEADDR) val (getKEEPALIVE, setKEEPALIVE) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_KEEPALIVE) val (getDONTROUTE, setDONTROUTE) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DONTROUTE) val getLINGER = getSockOptTimeOption (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_LINGER) val setLINGER = setSockOptTimeOption (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_LINGER) val (getBROADCAST, setBROADCAST) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_BROADCAST) val (getOOBINLINE, setOOBINLINE) = gsSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_OOBINLINE) val (getSNDBUF, setSNDBUF) = gsSockOptInt (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_SNDBUF) val (getRCVBUF, setRCVBUF) = gsSockOptInt (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_RCVBUF) fun getTYPE s = SOCK.fromRep (getSockOptC_Int (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_TYPE) s) fun getERROR s = let val se = getSockOptC_Int (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_ERROR) s val se = PrePosix.SysError.fromRep se in if PosixError.cleared = se then NONE else SOME (Error.errorMsg se, SOME se) end handle Error.SysErr z => SOME z local fun getName (s, f: C_Sock.t * pre_sock_addr * C_Socklen.t ref -> C_Int.int C_Errno.t) = let val (sa, salen, finish) = newSockAddr () val () = Syscall.simple (fn () => f (Sock.toRep s, sa, salen)) in finish () end in fun getPeerName s = getName (s, Prim.Ctl.getPeerName) fun getSockName s = getName (s, Prim.Ctl.getSockName) end fun getNREAD s = let val argp = ref (C_Int.fromInt ~1) val () = Syscall.simple (fn () => Prim.Ctl.getNREAD (Sock.toRep s, argp)) in C_Int.toInt (!argp) end fun getATMARK s = let val argp = ref (C_Int.fromInt ~1) val () = Syscall.simple (fn () => Prim.Ctl.getATMARK (Sock.toRep s, argp)) in if C_Int.toInt (!argp) = 0 then false else true end end structure Ctl = struct open CtlExtra val getERROR = isSome o CtlExtra.getERROR end fun sameAddr (SA sa1, SA sa2) = sa1 = sa2 fun familyOfAddr (SA sa) = AddrFamily.fromRep (Prim.familyOfAddr sa) fun bind (s, SA sa) = Syscall.simple (fn () => Prim.bind (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))) fun listen (s, n) = Syscall.simple (fn () => Prim.listen (Sock.toRep s, C_Int.fromInt n)) fun nonBlock' ({restart: bool}, errVal : ''a, f : unit -> ''a C_Errno.t, post : ''a -> 'b, again, no : 'b) = Syscall.syscallErr ({clear = false, restart = restart, errVal = errVal}, fn () => {return = f (), post = post, handlers = [(again, fn () => no)]}) fun nonBlock (errVal, f, post, no) = nonBlock' ({restart = true}, errVal, f, post, Error.again, no) local structure PIO = PrimitiveFFI.Posix.IO structure OS = Primitive.MLton.Platform.OS structure MinGW = PrimitiveFFI.MinGW fun withNonBlockNormal (s, f: unit -> 'a) = let val fd = Sock.toRep s val flags = Syscall.simpleResultRestart (fn () => PIO.fcntl2 (fd, PIO.F_GETFL)) val () = Syscall.simpleRestart (fn () => PIO.fcntl3 (fd, PIO.F_SETFL, C_Int.orb (flags, PrimitiveFFI.Posix.FileSys.O.NONBLOCK))) in DynamicWind.wind (f, fn () => Syscall.simpleRestart (fn () => PIO.fcntl3 (fd, PIO.F_SETFL, flags))) end fun withNonBlockMinGW (s, f: unit -> 'a) = let val fd = Sock.toRep s val () = MinGW.setNonBlock fd in DynamicWind.wind (f, fn () => MinGW.clearNonBlock fd) end in val withNonBlock = fn x => case OS.host of OS.MinGW => withNonBlockMinGW x | _ => withNonBlockNormal x end fun connect (s, SA sa) = Syscall.simple (fn () => Prim.connect (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))) fun connectNB (s, SA sa) = nonBlock' ({restart = false}, C_Int.fromInt ~1, fn () => withNonBlock (s, fn () => Prim.connect (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))), fn _ => true, Error.inprogress, false) fun accept s = let val (sa, salen, finish) = newSockAddr () val s = Syscall.simpleResultRestart (fn () => Prim.accept (Sock.toRep s, sa, salen)) in (Sock.fromRep s, finish ()) end fun acceptNB s = let val (sa, salen, finish) = newSockAddr () in nonBlock (C_Int.fromInt ~1, fn () => withNonBlock (s, fn () => Prim.accept (Sock.toRep s, sa, salen)), fn s => SOME (Sock.fromRep s, finish ()), NONE) end fun close s = Syscall.simple (fn () => Prim.close (Sock.toRep s)) datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS fun shutdownModeToHow m = case m of NO_RECVS => Prim.SHUT_RD | NO_SENDS => Prim.SHUT_WR | NO_RECVS_OR_SENDS => Prim.SHUT_RDWR fun shutdown (s, m) = let val m = shutdownModeToHow m in Syscall.simple (fn () => Prim.shutdown (Sock.toRep s, m)) end type sock_desc = FileSys.file_desc fun sockDesc sock = sockToFD sock fun sameDesc (desc1, desc2) = desc1 = desc2 fun select {rds: sock_desc list, wrs: sock_desc list, exs: sock_desc list, timeout: Time.time option} = let local fun mk l = let val vec = Vector.fromList l val arr = Array.array (Vector.length vec, 0: C_Int.t) in (PrePosix.FileDesc.vectorToRep vec, arr) end in val (read_vec, read_arr) = mk rds val (write_vec, write_arr) = mk wrs val (except_vec, except_arr) = mk exs end val setTimeout = case timeout of NONE => Prim.setTimeoutNull | SOME t => if Time.< (t, Time.zeroTime) then Error.raiseSys Error.inval else let val q = LargeInt.quot (Time.toMicroseconds t, 1000000) val q = C_Time.fromLargeInt q val r = LargeInt.rem (Time.toMicroseconds t, 1000000) val r = C_SUSeconds.fromLargeInt r in fn () => Prim.setTimeout (q, r) end handle Overflow => Error.raiseSys Error.inval val res = Syscall.simpleResult (fn () => (setTimeout () ; Prim.select (read_vec, write_vec, except_vec, read_arr, write_arr, except_arr))) val (rds, wrs, exs) = if res = 0 then ([],[],[]) else let fun mk (l, arr) = (List.rev o #1) (List.foldl (fn (sd, (l, i)) => (if Array.sub (arr, i) <> (0: C_Int.t) then sd::l else l, i + 1)) ([], 0) l) in (mk (rds, read_arr), mk (wrs, write_arr), mk (exs, except_arr)) end in {rds = rds, wrs = wrs, exs = exs} end val ioDesc = FileSys.fdToIOD o sockDesc type out_flags = {don't_route: bool, oob: bool} val no_out_flags = {don't_route = false, oob = false} fun mk_out_flags {don't_route, oob} = C_Int.orb (if don't_route then Prim.MSG_DONTROUTE else 0x0, C_Int.orb (if oob then Prim.MSG_OOB else 0x0, 0x0)) local fun make (toPoly, base, primSend, primSendTo) = let val base = fn sl => let val (buf, i, sz) = base sl in (toPoly buf, i, sz) end fun send' (s, sl, out_flags) = let val (buf, i, sz) = base sl in (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primSend (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, mk_out_flags out_flags)) end fun send (sock, buf) = send' (sock, buf, no_out_flags) fun sendNB' (s, sl, out_flags) = let val (buf, i, sz) = base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => primSend (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, C_Int.orb (Prim.MSG_DONTWAIT, mk_out_flags out_flags)), SOME o C_SSize.toInt, NONE) end fun sendNB (sock, sl) = sendNB' (sock, sl, no_out_flags) fun sendTo' (s, SA sa, sl, out_flags) = let val (buf, i, sz) = base sl in Syscall.simpleRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primSendTo (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, mk_out_flags out_flags, sa, C_Socklen.fromInt (Vector.length sa))) end fun sendTo (sock, sock_addr, sl) = sendTo' (sock, sock_addr, sl, no_out_flags) fun sendToNB' (s, SA sa, sl, out_flags) = let val (buf, i, sz) = base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => primSendTo (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, C_Int.orb (Prim.MSG_DONTWAIT, mk_out_flags out_flags), sa, C_Socklen.fromInt (Vector.length sa)), fn _ => true, false) end fun sendToNB (sock, sa, sl) = sendToNB' (sock, sa, sl, no_out_flags) in (send, send', sendNB, sendNB', sendTo, sendTo', sendToNB, sendToNB') end in val (sendArr, sendArr', sendArrNB, sendArrNB', sendArrTo, sendArrTo', sendArrToNB, sendArrToNB') = make (Word8Array.toPoly, Word8ArraySlice.base, Prim.sendArr, Prim.sendArrTo) val (sendVec, sendVec', sendVecNB, sendVecNB', sendVecTo, sendVecTo', sendVecToNB, sendVecToNB') = make (Word8Vector.toPoly, Word8VectorSlice.base, Prim.sendVec, Prim.sendVecTo) end type in_flags = {peek: bool, oob: bool} val no_in_flags = {peek = false, oob = false} fun mk_in_flags {peek, oob} = C_Int.orb (if peek then Prim.MSG_PEEK else 0x0, C_Int.orb (if oob then Prim.MSG_OOB else 0x0, 0x0)) fun recvArr' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl in (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flags in_flags)) end fun getVec (a, n, bytesRead) = if n = bytesRead then Word8Vector.unsafeFromArray a else Word8ArraySlice.vector (Word8ArraySlice.slice (a, 0, SOME bytesRead)) fun recvVec' (sock, n, in_flags) = let val a = Word8Array.alloc n val bytesRead = recvArr' (sock, Word8ArraySlice.full a, in_flags) in getVec (a, n, bytesRead) end fun recvArr (sock, sl) = recvArr' (sock, sl, no_in_flags) fun recvVec (sock, n) = recvVec' (sock, n, no_in_flags) fun recvArrFrom' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl val (sa, salen, finish) = newSockAddr () val n = (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flags in_flags, sa, salen)) in (n, finish ()) end fun recvVecFrom' (sock, n, in_flags) = let val a = Word8Array.alloc n val (bytesRead, sock_addr) = recvArrFrom' (sock, Word8ArraySlice.full a, in_flags) in (getVec (a, n, bytesRead), sock_addr) end fun recvArrFrom (sock, sl) = recvArrFrom' (sock, sl, no_in_flags) fun recvVecFrom (sock, n) = recvVecFrom' (sock, n, no_in_flags) fun mk_in_flagsNB in_flags = C_Int.orb (mk_in_flags in_flags, Prim.MSG_DONTWAIT) fun recvArrNB' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flagsNB in_flags), SOME o C_SSize.toInt, NONE) end fun recvVecNB' (s, n, in_flags) = let val a = Word8Array.alloc n in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly a, 0, C_Size.fromInt n, mk_in_flagsNB in_flags), fn bytesRead => SOME (getVec (a, n, C_SSize.toInt bytesRead)), NONE) end fun recvArrNB (sock, sl) = recvArrNB' (sock, sl, no_in_flags) fun recvVecNB (sock, n) = recvVecNB' (sock, n, no_in_flags) fun recvArrFromNB' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl val (sa, salen, finish) = newSockAddr () in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flagsNB in_flags, sa, salen), fn n => SOME (C_SSize.toInt n, finish ()), NONE) end fun recvVecFromNB' (s, n, in_flags) = let val a = Word8Array.alloc n val (sa, salen, finish) = newSockAddr () in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly a, 0, C_Size.fromInt n, mk_in_flagsNB in_flags, sa, salen), fn bytesRead => SOME (getVec (a, n, C_SSize.toInt bytesRead), finish ()), NONE) end fun recvArrFromNB (sock, sl) = recvArrFromNB' (sock, sl, no_in_flags) fun recvVecFromNB (sock, n) = recvVecFromNB' (sock, n, no_in_flags) (* Phantom type. *) type ('af, 'sock_type) sock = sock type 'af sock_addr = sock_addr type 'mode stream = stream end mlton-20210117+dfsg/basis-library/net/unix-sock.sig000066400000000000000000000012741416264345000220070ustar00rootroot00000000000000signature UNIX_SOCK = sig type unix type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF: Socket.AF.addr_family val toAddr: string -> sock_addr val fromAddr: sock_addr -> string structure Strm : sig val socket: unit -> 'mode stream_sock val socketPair: unit -> 'mode stream_sock * 'mode stream_sock end structure DGrm : sig val socket: unit -> dgram_sock val socketPair: unit -> dgram_sock * dgram_sock end end mlton-20210117+dfsg/basis-library/net/unix-sock.sml000066400000000000000000000032251416264345000220160ustar00rootroot00000000000000(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure UnixSock : UNIX_SOCK = struct structure Prim = PrimitiveFFI.Socket.UnixSock datatype unix = UNIX type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF = Net.AddrFamily.fromRep PrimitiveFFI.Socket.AF.UNIX fun toAddr s = let val (sa, salen, finish) = Socket.newSockAddr () val _ = Prim.toAddr (NullString.nullTerm s, C_Size.fromInt (String.size s), sa, salen) in finish () end fun fromAddr sa = let val sa = Socket.unpackSockAddr sa val len = Prim.pathLen sa val a = CharArray.array (C_Size.toInt len, #"\000") val _ = Prim.fromAddr (sa, CharArray.toPoly a, len) in CharArraySlice.vector (CharArraySlice.slice (a, 0, SOME (C_Size.toInt len))) end structure Strm = struct fun socket () = GenericSock.socket (unixAF, Socket.SOCK.stream) fun socketPair () = GenericSock.socketPair (unixAF, Socket.SOCK.stream) end structure DGrm = struct fun socket () = GenericSock.socket (unixAF, Socket.SOCK.dgram) fun socketPair () = GenericSock.socketPair (unixAF, Socket.SOCK.dgram) end end mlton-20210117+dfsg/basis-library/notes.txt000066400000000000000000001467021416264345000204740ustar00rootroot00000000000000 Date: Tue, 23 Jul 2002 11:49:57 -0400 (EDT) From: Matthew Fluet John and SML implementers, Here are a loose collection of notes I've taken while starting to update the MLton implementation of the SML Basis Library to the latest version. They span quite a range: errata and typos, signature constraint concerns, and some design questions. Thus far, I've looked at the structures that had been grouped under the headings General, Text, Integer, Reals, Lists, and Arrays and Vectors (i.e., excluding IO, System, and Posix) in the "old" web specification. A few high level comments: * As an organizational principal, I liked the grouping of modules into larger collections used in the "old" web specification better than the long alphabetical list. * I'm quite happy to see opaque signature matches for most structures. In particular, I think it will help avoid porting problems between implementations that provide different INTEGER structures, especially when LargeInt = Int in one implementation and LargeInt = IntInf in another. Required and optional components, Top-level: * A number of structures have an opaque signature match in overview.html, but not in the corresponding structure specific page: General, Bool, Option, List, ListPair, IntInf, Array, ArraySlice, Vector, VectorSlice. * Word8Array2 is listed as required in overview.html, but its signature, MONO_ARRAY2, is not required. Furthermore, Word8Array2 is marked optional in mono-array2.html. I don't quite see a rationale for Word8Array2 being required. * With the addition of val ~ : word -> word to the WORD signature, presumably ~ should be overloaded at num, rather than at intreal. Reals: * In pack-float.html, the where type clauses are incorrect: structure PackRealBig :> PACK_REAL where type PackRealBig.real = Real.real should be structure PackRealBig :> PACK_REAL where type real = Real.real * Likewise, in most places, references to basic types are unqualifed, so perhaps the where clause should read where type real = real for the PackRealBig and PackRealLittle structures. Arrays and Vectors: * In vector-slice.html, the description of subslice references |arr| when it should reference |sl|. * In {[mono-]array[-slice],[mono-]vector[-slice]}.html, the description of findi references appi when it should reference findi. * In mono-array-slice.html, structure CharArraySlice has the clause where type array = CharVector.vector which should be where type array = CharArray.array. * In mono-{vector[-slice],array[-slice],array2}.html, there are Word structures but no (default word) Word structures. * In mono-vector.html, structure CharVector has the clause where type elem = Char.char while the other monomorphic vectors of basic types reference the unqualified type; i.e. structure BoolVector has the clause where type elem = bool. * There are no "See also"'s into MONO_VECTOR_SLICE or MONO_ARRAY_SLICE from MONO_VECTOR or MONO_ARRAY. * A long discussion about types defined in [MONO_]{ARRAY,VECTOR}[_SLICE] signatures; deferred to a separate email. Really nit-picky: * Ordering of comparison functions (>, >=, etc.) and unary negation are different within INTEGER and WORD. * Ordering of functions in CHAR seems awkward. * Ordering of full, slice, subslice different in ARRAY_SLICE and VECTOR_SLICE. * Ordering of foldi/fold and modifi/modify different in ARRAY2 and MONO_ARRAY2. Top-level and opaque signatures: * I think it would be useful to see the entire top-level of required structures written out with their respective signature constraints. For example, in the description of the Math structure, the spec reads: "The top-level structure Math provides these functions for the default real type Real.real." Because the top-level Math structure has an opaque signature match (in overview.html), then the sentence above implies that there ought to be the constraint where type real = real (or Real.real). Granted, none of the other structures in overview.html have where clauses, and most type constraints are documented in the structure specific pages, but the constraint on the top-level Math.real slipped my mind when I first looked at it. -Matthew ****************************************************************************** ****************************************************************************** Date: Tue, 23 Jul 2002 11:54:09 -0400 (EDT) From: Matthew Fluet As promised, here is a longish look at the types used in Arrays and Vectors. Array and Vector design: * The ARRAY signature includes type 'a vector. Presumably, type 'a Array.vector = type 'a Vector.vector, but no constraint makes this explicit. * MONO_ARRAY_SLICE includes type vector and type vector_slice, while the ARRAY_SLICE signature explicitly references 'a VectorSlice.slice and 'a Vector.vector. * VECTOR_SLICE doesn't include 'a vector, but has val mapi : (int * 'a -> 'b) -> 'a slice -> 'b vector val map : ('a -> 'b) -> 'a slice -> 'b vector; On the other hand, full, slice, base, vector, and concat reference 'a Vector.vector. For consistency, I'd prefer to see signature VECTOR = sig type 'a vector ... end signature VECTOR_SLICE = sig type 'a vector type 'a slice ... end signature ARRAY = sig type 'a vector type 'a array ... end signature ARRAY_SLICE = sig type 'a vector type 'a vector_slice tyep 'a array type 'a slice ... end signature MONO_VECTOR = sig type elem type vector ... end signature MONO_VECTOR_SLICE = sig type elem type vector type slice ... end signature MONO_ARRAY = sig type elem type vector type array ... end signature MONO_ARRAY_SLICE = sig type elem type vector type vector_slice type array type slice ... end structure Vector :> VECTOR structure VectorSlice :> VECTOR_SLICE where type 'a vector = 'a Vector.vector structure Array :> ARRAY where type 'a vector = 'a Vector.vector structure ArraySlice :> ARRAY_SLICE where type 'a vector = 'a Vector where type 'a vector_slice = 'a VectorSlice.slice where type 'a array = 'a Array.array structure BoolVector :> MONO_VECTOR where type elem = bool structure BoolVectorSlice :> MONO_VECTOR_SLICE where type elem = bool where type vector = BoolVector.vector structure BoolArray :> MONO_ARRAY where type elem = bool where type vector = BoolVector.vector structure BoolArraySlice :> MONO_ARRAY_SLICE where type elem = bool where type vector = BoolVector.vector where type vector_slice = BoolVectorSlice.slice where type array = BoolArray.array While semantically, this shouldn't be any different than the specification, it could effect type-error messages. For example, if I have the structure Foo: structure Foo = struct open BoolArraySlice val copyVec0 {src: vector_slice, dst: array} = copyVec {src = src, dst = dst, di = 0} end which I decide to generalize to polymorphic array slices, then just changing BoolArraySlice to ArraySlice will lead to different type-error messages: either "ubound type constructor: vector_slice" (under the specification) or "type constructor vector_slice given 0 arguments, wants 1" (under the signatures given above); and an arity error for array in either case. It's not much of an argument, but I need to replace vector_slice with 'a VectorSlice.slice under the specification, while I only need to add 'a under the sigs above. Array2: * Why not have an ARRAY2_REGION analagous to ARRAY_SLICE? Likewise, how about VECTOR2 and VECTOR2_REGION? I think the decision to separate Arrays and Vectors from their corresponding slices is a nice design choice, and I'd be in favor of extending it to multi-dimentional ones. * Should ARRAY2 have findi/find, exists, all? collate? ****************************************************************************** ****************************************************************************** Date: Thu, 25 Jul 2002 15:20:01 +0200 From: Andreas Rossberg Like Matthew I started implementing the latest version of the Basis spec for Alice and Hamlet. I'm quite happy with most of the changes. It was a surprise to discover the presence of a Windows structure, though :-) Here is my list of comments, some of which may duplicate observations already made by Matthew. They primarily cover global issues and the required part of the library, though I haven't looked deeper into the IO and Posix parts yet. I also included some proposals for modest additions to the library, which I believe are useful and fit its spirit. Trivial bugs, typos, cosmetics ------------------------------ * Overview: - INT_INF appears in the list of required signatures. - WordArray2 appears under the list of required structures, instead of optional ones. * LIST_PAIR: - Typo in description of allEq: double "the". * SUBSTRING: - The scan example uses the deprecated "all" function. * VECTOR_SLICE: - Typo in synopsis of subslice: s/opt/sz/. - Typo in description of subslice: s/|arr|/|sl|/. - Typo in description of findi: s/appi/findi/. - Signature sometimes uses Vector.vector instead of plain vector. - The equation for mapi can be simplified to: Vector.fromList (foldri (fn (i,a,l) => f(i,a)::l) [] slice) * MONO_VECTOR_SLICE and ARRAY_SLICE and MONO_ARRAY_SLICE: - Typo in synopsis of subslice: s/opt/sz/. - Typo in description of findi: s/appi/findi/. * BYTE: - Accidental "val" keyword in synopsis of some functions. * TEXT_IO: - The "where" constraints contain erroneously qualified ids. - The specification of the TEXT_IO signature is not valid SML'97, since StreamIO is specified twice. You might want to add a comment regarding that. - The constraints for types vector and elem are redundant (in fact, invalid), because the signature TEXT_STREAM_IO already specifies the necessary equations. * The use of variable names is sometimes inconsistent: - Predicate arguments to higher-order functions are usually named "f" (eg. List.all), sometimes "p" (eg. String.tokens, StringCvt.splitl), and sometimes even "pred" (eg. ListPair.all). - Similarly, fold functions mostly use "init" to name initial accumulators, except in the List and ListPair modules. Ambiguities / Unclear Details ----------------------------- * Overview: - The subsection about dependencies among optional modules has disappeared. Does that mean that there aren't any anymore? (The nice subsection about design rules and conventions also has gone.) * The intended meaning of opaque signature constraints is not always clear to me. Sometimes the prose contains remarks about additional equalities that are not appearent from the signature constraints. For example, is or isn't - Text.Char.char = Char.char ? (and so on for the rest of Text) - LargeInt.int = IntN.int (for some structure IntN) ? (likewise LargeWord.word, LargeReal.real) - Char.string = String.string ? - Math.real = Real.real ? In particular, the spec sometimes speaks of "equal structures", which has no real technical meaning in SML'97. Note that from the opaque matching on the overview page one might even conclude that General.unit <> {} ! * The type specification of String.string and CharVector.vector is circular: structure String :> STRING where type string = CharVector.vector structure CharVector :> MONO_VECTOR where type vector = String.string Likewise for Substring.substring and CharVectorSlice.slice. A respective defining structure should be chosen. * STRING: - Function fromString has a special case that is not covered by implementing the function through straight-forward iterative application of the Char.scan function, namely a trailing gap escape (\f...f\) as in "foo\\ \\" or "foo\\ \\\000" (where \000 is an non-convertible character). Several implementations I tried get that detail wrong, so a corresponding note might be in order. Moreover, it is not completely obvious from the description what the result should be for strings that contain a gap escape as the only convertible sequence, e.g. "\\ \\" or "\\ \\\000" - it is supposed to be SOME "", I guess. * SUBSTRING: - Shouldn't span raise Span if i' < i? Otherwise, contrary to the prose, it in fact accepts arguments where ss' is left to ss, as long as they overlap (which is rather odd). - For the curried triml/trimr it is not clear whether an Subscript exception has to be raised already if k < 0 but no second argument is applied. Naming and structuring ---------------------- Its nicely chosen regular naming conventions and structure are two of the aspects I like most about the Standard Basis. The following list enumerates the few cases where I feel that the spec violates its own conventions. * WORD: - The fromLargeWord and toLargeWord functions should drop the "Word" suffix to be consistent with the corresponding functions in the REAL and INTEGER signatures. * CHAR: - The functions contains/notContains should be moved to the STRING signature, as they are similar to find/exist operations and thus functionality of the aggregate. The type string could then be removed from the signature. * ARRAY_SLICE and MONO_ARRAY_SLICE: - The function copyVec seems completely out of place: it does neither operate on array slices, nor on vectors. But honestly I have got no idea where else to put it :-( * STRING and SUBSTRING: - There is a certain asymmetry between slices and substrings which tends to confuse at least myself when hacking. For more consistency I propose: (1) changing the type of Substring.substring to string * int * int option -> substring (for consistency with VectorSlice.slice), (2) renaming Substring.slice to Substring.subsubstring, (for consistency with VectorSlice.subslice), (3) removing Substring.{app,foldl,foldr} (there are no similar functions in the STRING signature, and in both cases they are available through CharVector/CharVectorSlice), (4) removing String.extract and Substring.extract (the same functionality is available through CharVector[Slice]). - I believe the deprecated Substring.all can be removed for good. After all, there are more serious incompatible changes being made (e.g. array copying functions). * Vectors and arrays: - While the lib consistently uses the to/from convention for conversions on basic types, it sometimes uses adhoc conventions for aggregates. I propose renaming: (1) Array.vector to Array.toVector (2) VectorSlice.vector to VectorSlice.toVector, (3) ArraySlice.vector to ArraySlice.toVector, (4) Substring.string to Substring.toString, - Since the copy functions have only 3, mostly distinctly typed arguments now, there no longer seems to be a strong reason to require passing those by notationally heavy records. * INT_INF: - The presence of bit fiddling operators in that signature is something that feels exceptionally ad-hoc. Either they should be available for all integer types, or there should be a separate WORD_INF, with appropriate conversions, that makes these available. * Toplevel: - Now that there is Word.~ (which is good) it seems rather odd that the toplevel ~ is not overloaded for words, i.e. does not have type num-> num. * Net functionality: - I really like the idea of structuring the library namespace as it has been done with the OS and Posix structures. I would prefer to see something similar being done for the added network functionality. More precisely, I propose (1) moving the structures Socket, INetSock, GenericSock, and the three Net*DB structures into a new wrapper structure Net (renaming Net*DB to *DB), (2) defining a corresponding signature NET, (3) renaming the signatures SOCKET, GENERIC_SOCK and INET_SOCK to NET_SOCKET, NET_GENERIC_SOCK and NET_INET_SOCK, resp., (4) moving UnixSock to the Unix structure (renamed as Socket). Misc. proposals for additional functionality -------------------------------------------- Here is a small collection of miscellaneous simple functions which I believe the library is still lacking, either because they are commonly useful or because they would make the library more regular. * LIST and LIST_PAIR: - The IMHO single most convenient extension to the library would be indexed morphisms on lists, i.e. adding val appi : (int * 'a -> unit) -> 'a list -> unit val mapi : (int * 'a -> 'b) -> 'a list -> 'b list val foldli : (int * 'a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldri : (int * 'a * 'b -> 'b) -> 'b -> 'a list -> 'b val findi : (int * 'a -> bool) -> 'a list -> (int * 'a) option - Likewise for LIST_PAIR. - LIST_PAIR does not support partial mapping: val mapPartial : ('a * 'b -> 'c option) -> 'a list * 'b list -> 'c list * LIST, VECTOR, ARRAY, etc.: - Another function on lists that would be very useful from my perspective is val appr : ('a -> unit) -> 'a list -> unit and its indexed sibling val appri : (int * 'a -> unit) -> 'a list -> unit which traverse the list from right to left. - Likewise for all aggregate types. - All aggregates come with a fromList function. I often feel the need to have inverse toList functions. Use of foldr is obfuscating. * OPTION: - Often using isSome is a bit clumsy. I thus propose adding the dual val isNone : 'a option -> bool * STRING and SUBSTRING: - For historical reasons we have {String,Substring}.size instead of *.length, which is inconsistent with all other aggregates and frequently lets me mix them up when I use them side by side. I propose adding aliases String.maxLen String.length Substring.length * WideChar and WideString: - There is no convenient way to convert between the standard and wide character set. Would it be reasonable to introduce LargeChar and LargeString structures (and so on) and have the CHAR and STRING signatures enriched by fromLarge/toLarge functions, as for numbers? That would also allow a program to select the widest character set available (which is currently impossible within the language). * String conversion: - I don't quite see the rationale for which signatures contain a scan function and which don't. I believe it makes sense to have scan in every signature that has fromString. - There should be a function val scanC : (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader to scan strings as C characters. This would make Char.fromCString and particularly String.fromCString more modular. - How about a dual writer abstraction as with type ('a,'b) writer = 'a * 'b -> 'b option and supporting fmt functions for basic types? Such a thing might be useful for writing to streams or buffers. * Vectors: For some time now I have been trying to use vectors more often instead of an often inappropriate list representation. This is sometimes made more difficult simply because the library support isn't as good as for lists. It improved in the updated version but still I miss: - Array.fromVector, - Vector.mapPartial, - Vector.rev, - Vector.append (though I guess concat is good enough), - most of all: a VectorPair structure. * Hash functions: - Giving every basic type a (default) hash function in addition to comparison would be quite useful in conjunction with container libraries. * There is no defining structure for references. I would like to see signature REF structure Ref : REF where REF contains: datatype ref = datatype ref val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val swap : 'a ref * 'a ref -> unit (* or :=: ? *) val map : ('a -> 'a) -> 'a ref -> 'a ref You might then consider removing ! and := from GENERAL. * Signature conventions: Some additional conventions would make use of Basis types as functor arguments more convenient: - Each signature defining an abstract type should make that type available under the alias "t" as well (this includes monomorphic types as well as polymorphic ones). - Every equality type should come with an explicit equality function val eq : t * t -> bool to move away from the reliance on eqtypes. - There should be a uniform name for canonical constructor functions, e.g. "new" (or at least an alias). -- Andreas Rossberg, rossberg@ps.uni-sb.de ****************************************************************************** ****************************************************************************** Date: Fri, 2 Aug 2002 14:04:16 +0100 From: David Matthews I've been having another look at the Basis library implementation in Poly/ML and in particular the I/O library. I'm still not sure I fully understand the implications of the Stream IO (functional IO) layer and in particular the way "canInput" works and interacts with "input". The definition says that canInput(f, n) returns SOME k "if a call to input would return immediately with at least k characters". Specifically it does not say "if a call to inputN(f, k) would return immediately". Secondly it says that it "should attempt to return as large a k as possible" and gives the example of a buffer containing 10 characters with the user calling canInput(f, 15). This suggests that a call to canInput could have the effect of committing the stream since a perfectly good implementation of "input" would be to return what was left of the buffer, i.e. 10 characters, and only read from the underlying stream on a subsequent call to "input". Yet after a call to canInput(f, 15) which returns SOME 15 the call to "input" is forced to return at least 15. In other words a call to canInput changes the behaviour of a subsequent call to "input". Generally, what is the behaviour of canInput with an argument larger than the buffer size? How far ahead is canInput expected to read? A few other notes of things I've discovered, some of which are trivial: The signature for TextIO.StreamIO contains duplicates of where type StreamIO.reader = TextPrimIO.reader where type StreamIO.writer = TextPrimIO.writer There are declared constants for platformWin32Windows2000 and platformWin32WindowsXP in the Windows structure. When I proposed the Windows.Config structure I didn't include constants for these versions of the OS because the underlying GetVersionEx function returns the same value, VER_PLATFORM_WIN32_NT in the dwPlatformId field for NT, Windows 2000 and XP It is possible to distinguish these but only using the major and minor version fields. Windows CE does give a different value for the platformID. I would say it is confusing to have these here because it implies that it's possible to discriminate on the basis of the platformID field. The example definition of input1 at the bottom of STREAM_IO returns a value of type elem option * instream when the signature says it should be (elem * instream) option. Description of "input" function in STREAM_IO signature. The word "ay" should be "may". -- David. ****************************************************************************** ****************************************************************************** Date: Fri, 11 Oct 2002 17:46:59 -0400 (EDT) From: Matthew Fluet Following up my previous post, here is another loose collection of notes I've taken while updating the MLton implementation of the SML Basis Library. This includes the structures that had been grouped under the headings System, Posix, and IO in the "old" web specification. Required and optional components: * The optional functors PrimIO, StreamIO, and ImperativeIO are not listed among the optional components in overview.html. Lists: * The discussion for the ListPair structure says: "Note that a function requiring equal length arguments may determine this lazily, i.e. , it may act as though the lists have equal length and invoke the user-supplied function argument, but raise the exception when it arrives at the end of one list before the end of the other." Such an implementation choice seems to go against the spirit that programs run under conforming implementations of the Basis Library should behave the same. Posix: * In posix.html, last sentence in Discussion: "onsult" instead of "consult" PosixSignal: * In posix-signal.html, in Discussion: "The name of the coressponding ..." sentence is repeated. PosixError: * In the discussion of POSIX_ERROR: "The name of a corresponding POSIX error can be derived by capitalizing all letters and adding the character ``E'' as a prefix. For example, the POSIX error associated with nodev is ENODEV. The only exception to this rule is the error toobig, whose associated POSIX error is E2BIG." It isn't clear if this is the intended semantics for errorName and syserror. Time: * The type time now includes "negative values moving to the past." In the absence of negative values, the text for the the to{Seconds,Milliseconds,Microseconds} functions to drop fractions of the time unit was unambigous. With negative values, I would interpret this as rounding towards zero. Is this correct? Would it be clearer to describe the rounding as such? * The + and - functions are required to raise Overflow, although most other "result not representable as a time value" error raises Time. * The - function is written prefix instead of infix in the description. * The scan and fromString functions do not specify how to treat a value with greater precision than the internal representation; should it have rounding or truncation semantics? Also, the functions are required to raise Overflow for an unrepresentable time value. IO: * The nice introduction to IO that appears at http://cm.bell-labs.com/cm/cs/what/smlnj/doc/basis/pages/io-explain.html doesn't seem to be included with the new pages. * The functor arguments in PrimIO, StreamIO, and ImperativIO functors don't match; some use structure A: MONO_ARRAY and others use structure Array: MONO_ARRAY. PrimIO() and PRIM_IO * The PRIM_IO signature requires pos to be an eqtype, but the PrimIO functor argument only requires pos to be a type. * readArr[NB], write{Vec,Arr}[NB] take "slices" (records of type {buf: {vector,array}, i: int, sz: int option}) but no description of the appropriate action to take when the slices are invalid. Presumably, they should raise Subscript. * There are a number of "contradictory" statments: "Readers and writers should not, in general, raise the IO.Io exception. It is assumed that the higher levels will appropriately handle these exceptions." "A reader is required to raise IO.Io if any of its functions, except close or getPos, is invoked after a call to close. A writer is required to raise IO.Io if any of its functions, except close, is invoked after a call to close." "closes the reader and frees operating system resources. Further operations on the reader (besides close and getPos) raise IO.ClosedStream." "closes the writer and frees operating system resources. Further operations (other than close) raise IO.ClosedStream." * The augment_reader and augment_writer functions may introduce new functions. Should the synthesized operations handle IO.Io exceptions and change the function field? Maybe this falls under the "intentionally unspecified" clause. StreamIO() and STREAM_IO: * What is the difference between a terminated output stream and a closed output stream? Some operations say what to do when the stream is terminated or closed, but many are unspecified when the other condition holds. I resolved this by looking at the IO introduction mentioned above, where it discusses stream states. But, closeOut is still confusing: "flushes f's buffers, marks the stream closed, and closes the underlying writer. This operation has no effect if f is already closed. If f is terminated, it should close the underlying writer." Shouldn't closeOut always execute the underlying writer's close function? The only way to terminate an outstream is to getOutstream, but I would really expect TextIO.closeOut to "really" close the underlying file/outstream/writer. * The IO structure has dropped the TerminatedStream exception, but there seem to be sufficient cases when a stream should raise an exception when it is terminated. * The semantics of the vector returned by getReader are unclear. At the very least, the source code for SML/NJ and PolyML have very different interpretations, and I've chosen yet another. I think part of the problem is that the word "[un]consumed" only appears in the description of this function, so it's unclear what corresponds to consumed input. * I suspect the example under endOfStream is wrong: In these cases the StreamIO.instream will also have multiple EOF's; that is, it can be that val true = endOfStream(f) val ("",f') = input f val true = endOfStream(f') val ("xyz",f'') = input f The fact that input f can return two different values would seem to violate the principal argument for functional streams! Looking at the aforementioned IO introduction in the "old" pages, I see the more reasonable example: Consequently, the following is not guaranteed to be true: let val z = TextIO.StreamIO.endOfStream f val (a,f') = TextIO.StreamIO.input f val x = TextIO.StreamIO.endOfStream f' in x=z (* not necessarily true! *) end whereas the following is guaranteed to be true: let val z = TextIO.StreamIO.endOfStream f val (a,f') = TextIO.StreamIO.input f val x = TextIO.StreamIO.endOfStream f (* note, no prime! *) in x=z (* guaranteed true! *) end * David Matthews's post on Aug. 2 raised questions about canInput which are unresolved. General comments: * Various operations in IO take "slices", but aren't expressed in terms of {Vector,Array}Slice structures. One difficulty with this is that the slice types are not in scope within the IO signatures. I would really advocate making the VectorSlice structure a substructure of the Vector structure (and likewise for arrays). Even if this isn't done for the polymorphic vector/array structures, it would be extremely beneficial for the monomorphic structures, where in the {Prim,Stream,Imperative}IO functors, it is impossible to access the corresponding monomorphic vector/array slice structures. I found myself using Vector.tabulate when I really wanted ArraySlice.vector. The "old" MONO_ARRAY signature included structure Vector: MONO_VECTOR which gave access to the corresponding monomorphic vectors. -Matthew ****************************************************************************** ****************************************************************************** Date: Fri, 13 Dec 2002 15:57:55 +0100 From: Andreas Rossberg Here is a collection of issues and comments we gathered when implementing the I/O stack from the Standard Basis (primitive, stream, imperative I/O) for Alice. While in general the specification seems to be pretty precise and complete, we sometimes found it hard to understand the semantic details of stream I/O, especially since many of them can only be derived indirectly from the examples in the discussion section and there appear to be some minor ambiguities and inconsistencies. Also, the PrimIO and StreamIO functors cannot always be implemented as suggested, because of their parametricity in types such as position and element. As a general note, the I/O interface does not seem to have been designed with concurrency in mind. In particular, augmenting readers and writers cannot be made thread-safe, AFAWCS. This is a bit of a problem for us, since Alice is relying on concurrency. However, that does not seem to be an issue easily solved. - Leif Kornstaedt, Andreas Rossberg The IO structure ---------------- * exception Io: - function field: (pedantic) The wording seems to imply that only functions from STREAM_IO raise the Io exception, but this is clearly not the case (consider TextIO.openIn to name just one). * datatype buffer_mode: - There is no specification of what precisely line buffering is supposed to mean, in particular for non-text streams. The PRIM_IO signature --------------------- * Synopsis: - (pedantic) It says that "higher level I/O facilities do not access the OS structure directly...". That's somewhat misleading since OS does not provide the same functionality anyway (if any, it was the Posix structure). * type reader: - Unlike for writers, it is not specified what the minimal set of operations is that a reader must support. - It is not specified whether multiple end-of-streams may occur. Since they are anticipated for StreamIO, one should expect them to be possible for underlying readers as well. However, this requires clarification of the semantics of several operations. - readArr, readArrNB: It is specified nowhere what the option for sz is supposed to mean, i.e. what the semantics of NONE is (presumably as for slices). - readVec, readVecNB: Unlike all other similar read and write functions, these two do not accept an option for the size argument. - avail: The description suggests that the function can be used as a hint by inputAll. However, this information is too inaccurate to be useful, since (apart from translation issues) the physical size of elements cannot be obtained (in particular in the StreamIO functor, which is parametric in the element type). In practice, endPos seems to be more useful for this purpose. So it is not clear what purpose avail could actually serve at all at the abstraction level provided by readers. - endPos: (1) May it block? For example, when reading from terminal or from another kind of stream, this can be naturally expected. (2) Which position is returned if there are multiple end-of-streams? - getPos, setPos, endPos, verifyPos: Description should start with "when present". - setPos, endPos: Should not raise an exception if unimplemented, but rather be NONE. Actually, the implementation notes on writers state that endPos *must* be implemented for readers. - Implementation note, item 6: Why is it likely that the client uses getPos frequently? And why should the reader count *untranslated* elements (and how would there be actual elements before translation)? (See also comments on STREAM_IO.filePosIn) * type writer: - writeVec, writeArr, writeVecNB, writeArrNB: (1) Again, it is not specified what the optional size means. (2) When may k < sz occur without having IO failure? If it is arbitrary, then there appears to be no correct way to write a sequence of elements, because it is neither possible to detect partial element writes (which are explained in the paragraph before the Implementation Notes), nor to complete such writes. This particularly implies that the StreamIO functor cannot implement flushing correctly (see below). - getPos, setPos, endPos, verifyPos: Description should start with "when present". - getPos, setPos: Should not raise an exception if unimplemented, but rather be NONE. - last paragraph before Implementation Note: Typo, double "plus". - first sentence in Implementation Note: (pedantic) Why is this put into the implementation notes when it actually seems to be a requirement of the specification? - last paragraph of Implementation Note: (1) States that readers must implement getPos, which seems to be contradicted by its optional type. (2) Typo, double "need". * openVector: - Is this supposed to support random access? Note that for types generated with the PrimIO functor it cannot (see below)! That seems to make this function rather useless. * augmentReader, augmentWriter: - It is not possible to synthesize operations in a way that is thread-safe in concurrent systems, hence it should be noted that augmenting is potentially dangerous. * There is no reference to the PrimIO functor. The PrimIO functor ------------------ * General problems: - Since the implementation is necessarily parametric in the pos type, openVector, nullRd, nullWr cannot create readers that allow random access, although one would expect that at least for openVector. * Functor argument: - Structure names A and V are inconsistent with the StreamIO and ImperativeIO functors. - Type pos has to be an eqtype to match the result signature. - Since the extract and copy functions have been removed/changed from ARRAY and VECTOR signatures, the PrimIO functor now naturally requires slice structures for efficient implementation. (Likewise the StreamIO functor) * Functor result: - Type sharing of the pos type is not specified, though essential for this functor being useful at all. The STREAM_IO signature ----------------------- * Synopsis: - An exception likely to be raised in by the underlying reader/writer is Size, which is not mentioned. OTOH, Fail can only occur in the rare case of user-supplied readers/writers, as the Basis itself is supposed to never raise it. * type out_pos: - A note on the meaning of this type would be desirable, since its canonical representation is (outstream * pos) rather than pos. (That also may have caused confusion in the discussion of imperative I/O, see below.) * input1: - The signature of this function is inconsistent with all other input functions. It should rather have type instream -> elem option * instream which in fact appears to be the type assumed in the discussion example relating input1 to inputN. * input: - Typo, s/ay/may/ * inputN: - This function is somewhat underspecified for n=0. In particular, may it block? Is it required to raise Io if the underlying reader is closed? * input, input1, inputN, inputAll: - (pedantic) Descriptions speak of "underlying system calls", although the reader may not actually depend on system calls. Preferably speak of "underlying reader" only. * closeIn: - Likewise, description speaks of "releasing system resources". This should be replaced by saying that it closes the underlying reader (which is not even specified as is). * closeOut: - Does the function attempt to close the stream even if flushing fails? - Why is it possible to close terminated streams? That seems to allow unfortunate interference with another stream that has been created from the extracted writer. * mkInstream, getReader: - The table seems to imply that mkInstream always augments its reader. This is inappropriate for concurrent environments (see above). - Should getReader return the original or the augmented reader? - The table still includes the removed getPosIn and setPosIn functions. * mkOutstream, getWriter: - Likewise. * filePosIn: - There seems to be no way to implement this function for buffered I/O, because the reader position that corresponds to a mid-block-element is not available and cannot be calculated in general. So how is this meant? - Typo, s/character/element/ * filePosOut: - Likewise. * getWriter: - It is non-obvious what the precise meaning of "terminating" a stream is. If this is merely setting a status flag then a corresponding note would be helpful. * getPosOut: - May this flush the stream (and hence raise Io exceptions)? * setPosOut: - This may raise an exception because the position has been invalidated after obtaining it (e.g. by file truncation performed by another process). - Typo, s/underlying device/underlying writer/ * setBufferMode, getBufferMode: - There is no specification of the semantics of line buffering, in particular for non-text streams. (See also comments on StreamIO functor) - It is not specified whether the stream may be flushed when set to LINE_BUF mode (may cause Io exception). It seems unreasonable to require it not to do so (assuming that line buffering is intended to maintain the invariant that the buffer never contains line breaks). - The synopsis of this function uses "ostr", while all others use "f" for streams. * setPosOut, setBufferMode, getWriter: - Can raise an exception if flushing fails. * Discussion: - The statement that closing a stream just causes the not-yet-determined part of the stream to be empty should probably be generalised to explain what *truncating* a stream means (getReader also truncates the stream). - Example of freshly opened stream: s/mkInstream r/mkInstream(r, vector [])/ s/size/length/ - nreads example: s/mkInstream r/mkInstream(r, vector [])/ s/size/length/ - input1/inputN relation example: (1) Inconsistent with the actual typing of input1 (see above). (2) Typo, s/inputN f/inputN(f,1)/ - Unbuffered I/O, 1st example: (1) Typos, s/mkInstream(reader)/mkInstream(reader, vector [])/ s/PrimIO.Rd{chunkSize,...}/(PrimIO.RD{chunksize,...}, v)/ (2) More importantly, the actual condition appears to be incorrect. It should read: (chunkSize > 1 orelse length v = 1) andalso endOfStream f' - Unbuffered I/O, 2nd example: s/mkInstream(reader)/mkInstream(reader, vector [])/ s/PrimIO.Rd{chunkSize,...}/(PrimIO.RD{chunksize,...}, v)/ The condition must be corrected as above. * There is no reference to the StreamIO functor. The StreamIO functor -------------------- * General problems: - It is impossible for this functor to support line buffering, since it has no way of knowing which element consists a line break. This could be solved by changing the someElem functor argument to a breakElem argument. - It is also impossible to utilize reader's endPos for pre-allocation, because the functor is parametric in the position type. * Functor argument: - Since the extract and copy functions have been removed/changed from ARRAY and VECTOR signatures, the StreamIO functor now naturally requires slice structures for efficient implementation. (Likewise the PrimIO functor) * Functor result: - Type sharing of the result types is not specified. * Discussion, paragraph on flushing: - Most of this discussion rather belongs to the description of STREAM_IO. - Everything said here is not restricted to flushOut, but applies to flushing in general. - Unfortunately, it is left unspecified where flushing may happen and, consequently, where respective Io exceptions may occur. - Write retries as suggested here seem to be impossible to implement correctly using the writer interface as specified (see comments on PRIM_IO.writer). - According to the writer description, write operations may never return an element count of 0, so the last sentence is misleading. * Discussion, last paragraph: - Typo, missing ")" * Implementation note: - 3rd bullet: typo, s/PrimIO.augmentIn/PrimIO.augmentReader/ - 5th and 6th bullet: The endPos function cannot be utilized as suggested, because the functor is necessarily parametric in the position type. The IMPERATIVE_IO signature --------------------------- * General comment: - It is unfortunate that imperative I/O is asymmetric with respect to providing (limited) random access on input vs. output streams - the former requires going down to the lower-level stream I/O. That makes imperative I/O a somewhat incomplete abstraction layer. - Likewise, it would be desirable if there were ways for performing full-fledged random access without leaving the imperative I/O abstraction layer, at least for streams were it is suitable (e.g. BinIO). Despite the statement in the discussion this is neither available for input nor for output streams (see comments below). * closeIn: - Typo, s/S.closeIn/StreamIO.closeIn/ * flushOut: - Typo, s/S.flushOut/StreamIO.flushOut/ * closeOut: - Typo, s/S.closeOut/StreamIO.closeOut/ * Discussion: - Equivalences, last line: s/StreamIO.output/StreamIO.flushOut/ - Paragraph about random-access on output streams: It says that BinIO.StreamIO.out_pos = Position.int. This is not true, we have BinPrimIO.pos = Position.int, but that is a completely different type. In fact, it is impossible to implement out_pos as Position.int. * There is no reference to the ImperativeIO functor. The ImperativeIO functor ------------------------ * Functor argument: - The Array argument is unnecessary. * Functor result: - Type sharing of the result types is not specified. The TEXT_STREAM_IO signature ---------------------------- * General comment: - Why bother separating this signature from STREAM_IO? => outputSubstr can easily be generalised to outputSlice (for good), => if line buffering is part of STREAM_IO, inputLine might be as well. The TextIO structure -------------------- * General comment: - Systems providing WideText should also provide a WideTextIO structure (they have to provide WideTextPrimIO already, which seems inconsistent). * Interface: - Duplicated type constraints for StreamIO.reader and StreamIO.writer. The BinIO structure -------------------- * Interface: - Type sharing with BinPrimIO is not specified (unlike for TextIO), i.e. the following constraints are missing: where type StreamIO.reader = BinPrimIO.reader where type StreamIO.writer = BinPrimIO.writer where type StreamIO.pos = BinPrimIO.pos ****************************************************************************** ****************************************************************************** ****************************************************************************** ****************************************************************************** Doing host/network byte order conversions on ML side. Socket.Ctl * Semantics of setNBIO, getNREAD, getATMARK are unclear; Don't seem to be accessible via {get,set}sockopt; Instead, using ioctl. ****************************************************************************** ****************************************************************************** Posix.FileSys: * Within structure S, the type mode is constrained equal to flags, but flags is an eqtype. STREAM_IO.pos * "This is the type of positions in the underlying readers and writers. In some instantiations of this signature (e.g., TextIO.StreamIO), pos is abstract; in others (e.g., BinIO.StreamIO) it is Position.int." But, the equality of BinIO.StreamIO.pos and Position.int is never specified in any where constraint of BinIO. * How can filePosIn be implemented with completely abstract pos? Not sent to list: * (In general, probably a good idea to look at the entire top-level structure/signature matches and choose a consistent usage of base types. For example, Int:>INTEGER would seem to hide the top-level int; unless Int is opened afterwards. But, then what about all the other structures that reference int? Is top-level int = Int.int or is Int.int = top-level int.) --> I think I'm biased from looking at the MLton implementation, becuase I'm finding it hard to think about how to really express all of the sharing constraints in a way that will be acceptable. This might be the wrong way to look at things: the listing of structures and signatures with clauses doesn't correspond to a build order, it corresponds to the way the environment should look to the program. Sequences and Slices: Why not existsi, alli? Vector: Why no vector: int * 'a -> 'a vector? Resolved: If one defines VECTOR_SLICE by including a type 'a vector and replace 'a Vector.vector with the local 'a vector, but then binds structure Vector: VECTOR structure VectorSlice: VECTOR_SLICE where type 'a vector = 'a Vector.vector at the top-level, does one violate the basis spec? Rationale: it's easiset to implement Vector and VectorSlice simultaneously, say with VectorSlice as a substructure of Vector (in fact, with all of the Vector operations being dispatched to the corresponding VectorSlice ops with full slices), so Vector isn't in scope for the VECTOR_SLICE. *** No, it's not o.k., because opening VectorSlice will introduce a binding for 'a vector; but, if we're lucky, John will accept the proposal. IEEEReal: toString prepends a #"~" even when the class is NAN? *** I guess this is o.k.; there is an explicit sign field. PACK_WORD: structure PackBig :> PACK_WORD (* OPTIONAL *) structure PackLittle :> PACK_WORD (* OPTIONAL *) but PACK_WORD has val subVec : Word8Vector.vector * int -> LargeWord.word i.e., reference to LargeWord.word. Should it be PACK_WORD type word val subVec : Word8Vector.vector * int -> word with structure PackBig :> PACK_WORD with word = Word.word (* OPTIONAL *) Should there be PackBig and PackLittle with word = Word.word? Should there be PackLargeBig with word = LargeWord.word? There aren't many structures that refine on LargeXYZ; most refine on XYZ. *** O.k., we always unpack into a LargeWord, which we could then Word.fromLargeWord back to the size. I guess this is o.k.; It lets an implementation give more PackBig structures than there are Word structures. MLton specific: + why are Int32_gtu and Int32_geu primitive? Why not just Word.fromInt and use Word comparisons? + Real:>REAL doesn't match basis because it may peform arithmetic at extended precision. Should this be mentioned in the user guide? + QUESTION: proc-env.sml + QUESTION: char.sml + check uses of {Vector,Array}Slice.slice for replacement by unsafeSlice. ****************************************************************************** ****************************************************************************** UNIX: I'm not quite sure how the ('a, 'b) proc type is supposed to work in practice; The old Unix structure just used them as TextIO.{in,out}streams. My suspicion is that we're supposed to use Posix.IO.mk{Bin,Text}{Reader,Writer} functions and then use the type system to ensure that if we force a stream to be bin or text, then all other uses have to be the same. I also suspect that we're only supposed to lift the file_desc up to an instream/outstream once; i.e., multiple textInstreamOf calls should continue to return the same TextIO.instream. That would seem to suggest we need an 'a option ref that can be banged at the first call to a streamOf function, and subsequent calls just return the value there. textInstreamOf pr binInstreamOf pr return a text or binary instream connected to the standard output stream of the process pr. Note the multiple calls to these functions on the same proc will result in multiple streams that all share the same underlying Unix stream. textOutstreamOf pr binOutstreamOf pr return a text or binary outstream connected to the standard input stream of the process pr. Note the multiple calls to these functions on the same proc will result in multiple streams that all share the same underlying Unix stream. streamsOf pr returns a pair of input and output text streams associated with pr. This function is equivalent to (textInstream pr, textOutstream pr) and is provided for backward compatibility. mlton-20210117+dfsg/basis-library/overloads.mlb000066400000000000000000000010311416264345000212560ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local basis-2002.mlb in ann "allowOverload true" in libs/basis-2002/top-level/overloads.sml end end end mlton-20210117+dfsg/basis-library/pervasive-exns.mlb000066400000000000000000000010701416264345000222420ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-exns.sig in libs/basis-2002/top-level/pervasive-exns.sml end end mlton-20210117+dfsg/basis-library/pervasive-types.mlb000066400000000000000000000010721416264345000224330ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-types.sig in libs/basis-2002/top-level/pervasive-types.sml end end mlton-20210117+dfsg/basis-library/pervasive-vals.mlb000066400000000000000000000012251416264345000222340ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb ann "allowSpecifySpecialIds true" in libs/basis-2002/top-level/basis-vals.sig end in libs/basis-2002/top-level/pervasive-vals.sml end end mlton-20210117+dfsg/basis-library/pervasive.mlb000066400000000000000000000004471416264345000212760ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) pervasive-types.mlb pervasive-exns.mlb pervasive-vals.mlb infixes.mlb equal.mlb overloads.mlb mlton-20210117+dfsg/basis-library/platform/000077500000000000000000000000001416264345000204155ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/platform/cygwin.sml000066400000000000000000000006421416264345000224340ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Cygwin = struct fun toFullWindowsPath p = CUtil.C_String.toString (PrimitiveFFI.Cygwin.toFullWindowsPath (NullString.nullTerm p)) end mlton-20210117+dfsg/basis-library/platform/mingw.sml000066400000000000000000000017331416264345000222570ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MinGW = struct fun getTempPath () = let fun lp bufSz = let val buf = CharArray.alloc (C_Size.toInt bufSz) val reqSz = PrimitiveFFI.MinGW.getTempPath (bufSz, buf) in if 0w0 = reqSz then NONE else if C_Size.< (reqSz, bufSz) then SOME (CharArraySlice.vector (CharArraySlice.unsafeSlice (buf, 0, SOME (C_Size.toInt reqSz)))) else lp reqSz end in (* Win32 MAX_PATH is 260, but some subsystems allow longer names *) lp 0w261 end end mlton-20210117+dfsg/basis-library/posix/000077500000000000000000000000001416264345000177335ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/posix/error.sig000066400000000000000000000103331416264345000215700ustar00rootroot00000000000000signature POSIX_ERROR = sig eqtype syserror val toWord: syserror -> SysWord.word val fromWord: SysWord.word -> syserror val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option val acces: syserror val again: syserror val badf: syserror val badmsg: syserror val busy: syserror val canceled: syserror val child: syserror val deadlk: syserror val dom: syserror val exist: syserror val fault: syserror val fbig: syserror val inprogress: syserror val intr: syserror val inval: syserror val io: syserror val isdir: syserror val loop: syserror val mfile: syserror val mlink: syserror val msgsize: syserror val nametoolong: syserror val nfile: syserror val nodev: syserror val noent: syserror val noexec: syserror val nolck: syserror val nomem: syserror val nospc: syserror val nosys: syserror val notdir: syserror val notempty: syserror val notsup: syserror val notty: syserror val nxio: syserror val perm: syserror val pipe: syserror val range: syserror val rofs: syserror val spipe: syserror val srch: syserror val toobig: syserror val xdev: syserror end signature POSIX_ERROR_EXTRA = sig include POSIX_ERROR exception SysErr of string * syserror option val cleared: syserror val raiseSys: syserror -> 'a val raiseSysWithMsg: syserror * string -> 'a structure SysCall : sig val blocker: (unit -> (unit -> unit)) ref val restartFlag: bool ref val syscallErr: {clear: bool, restart: bool, errVal: ''a} * (unit -> {return: ''a C_Errno.t, post: ''a -> 'b, handlers: (syserror * (unit -> 'b)) list}) -> 'b (* clear = false, restart = false, errVal = ~1 * post = fn _ => (), handlers = [] *) val simple: (unit -> C_Int.t C_Errno.t) -> unit (* clear = false, restart = false, * post = fn _ => (), handlers = [] *) val simple': {errVal: ''a} * (unit -> ''a C_Errno.t) -> unit (* clear = false, restart = true, errVal = ~1 * post = fn _ => (), handlers = [] *) val simpleRestart: (unit -> C_Int.t C_Errno.t) -> unit (* clear = false, restart = true, * post = fn _ => (), handlers = [] *) val simpleRestart': {errVal: ''a} * (unit -> ''a C_Errno.t) -> unit (* clear = false, restart = false, errVal = ~1 * post = fn ret => ret, handlers = [] *) val simpleResult: (unit -> C_Int.t C_Errno.t) -> C_Int.t (* clear = false, restart = false, * post = fn ret => ret, handlers = [] *) val simpleResult': {errVal: ''a} * (unit -> ''a C_Errno.t) -> ''a (* clear = false, restart = true, errVal = ~1 * post = fn ret => ret, handlers = [] *) val simpleResultRestart: (unit -> C_Int.t C_Errno.t) -> C_Int.t (* clear = false, restart = true, * post = fn ret => ret, handlers = [] *) val simpleResultRestart': {errVal: ''a} * (unit -> ''a C_Errno.t) -> ''a (* clear = false, restart = false, errVal = ~1 * handlers = [] *) val syscall: (unit -> C_Int.t C_Errno.t * (C_Int.t -> 'a)) -> 'a (* clear = false, restart = false, * handlers = [] *) val syscall': {errVal: ''a} * (unit -> ''a C_Errno.t * (''a -> 'b)) -> 'b (* clear = false, restart = true, errVal = ~1 * handlers = [] *) val syscallRestart: (unit -> C_Int.t C_Errno.t * (C_Int.t -> 'a)) -> 'a (* clear = false, restart = true, * handlers = [] *) val syscallRestart': {errVal: ''a} * (unit -> ''a C_Errno.t * (''a -> 'b)) -> 'b end end mlton-20210117+dfsg/basis-library/posix/error.sml000066400000000000000000000323431416264345000216060ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixError: POSIX_ERROR_EXTRA = struct structure Prim = PrimitiveFFI.Posix.Error open Prim structure SysError = PrePosix.SysError type syserror = SysError.t val acces = SysError.fromRep EACCES val addrinuse = SysError.fromRep EADDRINUSE val addrnotavail = SysError.fromRep EADDRNOTAVAIL val afnosupport = SysError.fromRep EAFNOSUPPORT val again = SysError.fromRep EAGAIN val already = SysError.fromRep EALREADY val badf = SysError.fromRep EBADF val badmsg = SysError.fromRep EBADMSG val busy = SysError.fromRep EBUSY val canceled = SysError.fromRep ECANCELED val child = SysError.fromRep ECHILD val connaborted = SysError.fromRep ECONNABORTED val connrefused = SysError.fromRep ECONNREFUSED val connreset = SysError.fromRep ECONNRESET val deadlk = SysError.fromRep EDEADLK val destaddrreq = SysError.fromRep EDESTADDRREQ val dom = SysError.fromRep EDOM val dquot = SysError.fromRep EDQUOT val exist = SysError.fromRep EEXIST val fault = SysError.fromRep EFAULT val fbig = SysError.fromRep EFBIG val hostunreach = SysError.fromRep EHOSTUNREACH val idrm = SysError.fromRep EIDRM val ilseq = SysError.fromRep EILSEQ val inprogress = SysError.fromRep EINPROGRESS val intr = SysError.fromRep EINTR val inval = SysError.fromRep EINVAL val io = SysError.fromRep EIO val isconn = SysError.fromRep EISCONN val isdir = SysError.fromRep EISDIR val loop = SysError.fromRep ELOOP val mfile = SysError.fromRep EMFILE val mlink = SysError.fromRep EMLINK val msgsize = SysError.fromRep EMSGSIZE val multihop = SysError.fromRep EMULTIHOP val nametoolong = SysError.fromRep ENAMETOOLONG val netdown = SysError.fromRep ENETDOWN val netreset = SysError.fromRep ENETRESET val netunreach = SysError.fromRep ENETUNREACH val nfile = SysError.fromRep ENFILE val nobufs = SysError.fromRep ENOBUFS val nodata = SysError.fromRep ENODATA val nodev = SysError.fromRep ENODEV val noent = SysError.fromRep ENOENT val noexec = SysError.fromRep ENOEXEC val nolck = SysError.fromRep ENOLCK val nolink = SysError.fromRep ENOLINK val nomem = SysError.fromRep ENOMEM val nomsg = SysError.fromRep ENOMSG val noprotoopt = SysError.fromRep ENOPROTOOPT val nospc = SysError.fromRep ENOSPC val nosr = SysError.fromRep ENOSR val nostr = SysError.fromRep ENOSTR val nosys = SysError.fromRep ENOSYS val notconn = SysError.fromRep ENOTCONN val notdir = SysError.fromRep ENOTDIR val notempty = SysError.fromRep ENOTEMPTY val notsock = SysError.fromRep ENOTSOCK val notsup = SysError.fromRep ENOTSUP val notty = SysError.fromRep ENOTTY val nxio = SysError.fromRep ENXIO val opnotsupp = SysError.fromRep EOPNOTSUPP val overflow = SysError.fromRep EOVERFLOW val perm = SysError.fromRep EPERM val pipe = SysError.fromRep EPIPE val proto = SysError.fromRep EPROTO val protonosupport = SysError.fromRep EPROTONOSUPPORT val prototype = SysError.fromRep EPROTOTYPE val range = SysError.fromRep ERANGE val rofs = SysError.fromRep EROFS val spipe = SysError.fromRep ESPIPE val srch = SysError.fromRep ESRCH val stale = SysError.fromRep ESTALE val time = SysError.fromRep ETIME val timedout = SysError.fromRep ETIMEDOUT val toobig = SysError.fromRep E2BIG val txtbsy = SysError.fromRep ETXTBSY val wouldblock = SysError.fromRep EWOULDBLOCK val xdev = SysError.fromRep EXDEV local infixr 5 ::? fun (n,s) ::? l = if n = SysError.fromRep ~1 then l else (n,s) :: l in val errorNames = (acces,"acces") ::? (addrinuse,"addrinuse") ::? (addrnotavail,"addrnotavail") ::? (afnosupport,"afnosupport") ::? (again,"again") ::? (already,"already") ::? (badf,"badf") ::? (badmsg,"badmsg") ::? (busy,"busy") ::? (canceled,"canceled") ::? (child,"child") ::? (connaborted,"connaborted") ::? (connrefused,"connrefused") ::? (connreset,"connreset") ::? (deadlk,"deadlk") ::? (destaddrreq,"destaddrreq") ::? (dom,"dom") ::? (dquot,"dquot") ::? (exist,"exist") ::? (fault,"fault") ::? (fbig,"fbig") ::? (hostunreach,"hostunreach") ::? (idrm,"idrm") ::? (ilseq,"ilseq") ::? (inprogress,"inprogress") ::? (intr,"intr") ::? (inval,"inval") ::? (io,"io") ::? (isconn,"isconn") ::? (isdir,"isdir") ::? (loop,"loop") ::? (mfile,"mfile") ::? (mlink,"mlink") ::? (msgsize,"msgsize") ::? (multihop,"multihop") ::? (nametoolong,"nametoolong") ::? (netdown,"netdown") ::? (netreset,"netreset") ::? (netunreach,"netunreach") ::? (nfile,"nfile") ::? (nobufs,"nobufs") ::? (nodata,"nodata") ::? (nodev,"nodev") ::? (noent,"noent") ::? (noexec,"noexec") ::? (nolck,"nolck") ::? (nolink,"nolink") ::? (nomem,"nomem") ::? (nomsg,"nomsg") ::? (noprotoopt,"noprotoopt") ::? (nospc,"nospc") ::? (nosr,"nosr") ::? (nostr,"nostr") ::? (nosys,"nosys") ::? (notconn,"notconn") ::? (notdir,"notdir") ::? (notempty,"notempty") ::? (notsock,"notsock") ::? (notsup,"notsup") ::? (notty,"notty") ::? (nxio,"nxio") ::? (opnotsupp,"opnotsupp") ::? (overflow,"overflow") ::? (perm,"perm") ::? (pipe,"pipe") ::? (proto,"proto") ::? (protonosupport,"protonosupport") ::? (prototype,"prototype") ::? (range,"range") ::? (rofs,"rofs") ::? (spipe,"spipe") ::? (srch,"srch") ::? (stale,"stale") ::? (time,"time") ::? (timedout,"timedout") ::? (toobig,"toobig") ::? (txtbsy,"txtbsy") ::? (wouldblock,"wouldblock") ::? (xdev,"xdev") ::? [] end exception SysErr of string * syserror option val toWord = C_Int.castToSysWord o SysError.toRep val fromWord = SysError.fromRep o C_Int.castFromSysWord val cleared : syserror = SysError.fromRep 0 fun errorName n = case List.find (fn (m, _) => n = m) errorNames of NONE => "" | SOME (_, s) => s val _ = General.addExnMessager (fn e => case e of SysErr (s, eo) => SOME (concat ["SysErr: ", s, case eo of NONE => "" | SOME e => concat [" [", errorName e, "]"]]) | _ => NONE) fun syserror s = case List.find (fn (_, s') => s = s') errorNames of NONE => NONE | SOME (n, _) => SOME n fun errorMsg (n: syserror) = let val cs = strError (SysError.toRep n) in if Primitive.MLton.Pointer.isNull (Primitive.MLton.Pointer.fromWord cs) then "Unknown error" else CUtil.C_String.toString cs end fun raiseSys n = raise SysErr (errorMsg n, SOME n) fun raiseSysWithMsg (n, msg) = raise SysErr ((errorMsg n) ^ ": " ^ msg, SOME n) structure SysCall = struct structure Thread = Primitive.MLton.Thread val blocker: (unit -> (unit -> unit)) ref = ref (fn () => (fn () => ())) (* ref (fn () => raise Fail "blocker not installed") *) val restartFlag = ref true val syscallErr: {clear: bool, restart: bool, errVal: ''a} * (unit -> {return: ''a C_Errno.t, post: ''a -> 'b, handlers: (syserror * (unit -> 'b)) list}) -> 'b = fn ({clear, restart, errVal}, f) => let fun call (err: {errno: syserror, handlers: (syserror * (unit -> 'b)) list} -> 'b): 'b = let val () = Thread.atomicBegin () val () = if clear then clearErrno () else () val {return, post, handlers} = f () handle exn => (Thread.atomicEnd (); raise exn) val return = C_Errno.check return in if errVal = return then (* Must getErrno () in the critical section. *) let val e = SysError.fromRep (getErrno ()) val () = Thread.atomicEnd () in err {errno = e, handlers = handlers} end else DynamicWind.wind (fn () => post return , Thread.atomicEnd) end fun err {default: unit -> 'b, errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = case List.find (fn (e',_) => errno = e') handlers of NONE => default () | SOME (_, handler) => handler () fun errBlocked {errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = err {default = fn () => raiseSys errno, errno = errno, handlers = handlers} fun errUnblocked {errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = err {default = fn () => if restart andalso errno = intr andalso !restartFlag then if Thread.atomicState () = 0w0 then call errUnblocked else let val finish = !blocker () in DynamicWind.wind (fn () => call errBlocked, finish) end else raiseSys errno, errno = errno, handlers = handlers} in call errUnblocked end local val simpleResultAux = fn ({restart, errVal}, f) => syscallErr ({clear = false, restart = restart, errVal = errVal}, fn () => let val return = f () in {return = return, post = fn ret => ret, handlers = []} end) in val simpleResultRestart = fn f => simpleResultAux ({restart = true, errVal = C_Int.fromInt ~1}, f) val simpleResult = fn f => simpleResultAux ({restart = false, errVal = C_Int.fromInt ~1}, f) val simpleResultRestart' = fn ({errVal}, f) => simpleResultAux ({restart = true, errVal = errVal}, f) val simpleResult' = fn ({errVal}, f) => simpleResultAux ({restart = false, errVal = errVal}, f) end val simpleRestart = ignore o simpleResultRestart val simple = ignore o simpleResult val simpleRestart' = fn ({errVal}, f) => ignore (simpleResultRestart' ({errVal = errVal}, f)) val simple' = fn ({errVal}, f) => ignore (simpleResult' ({errVal = errVal}, f)) val syscallRestart' = fn ({errVal}, f) => syscallErr ({clear = false, restart = true, errVal = errVal}, fn () => let val (return, post) = f () in {return = return, post = post, handlers = []} end) val syscall' = fn ({errVal}, f) => syscallErr ({clear = false, restart = false, errVal = errVal}, fn () => let val (return, post) = f () in {return = return, post = post, handlers = []} end) val syscallRestart = fn f => syscallRestart' ({errVal = C_Int.fromInt ~1}, f) val syscall = fn f => syscall' ({errVal = C_Int.fromInt ~1}, f) end end mlton-20210117+dfsg/basis-library/posix/file-sys.sig000066400000000000000000000071701416264345000221770ustar00rootroot00000000000000signature POSIX_FILE_SYS = sig eqtype uid eqtype gid eqtype file_desc val fdToWord: file_desc -> SysWord.word val wordToFD: SysWord.word -> file_desc (* identity functions *) val fdToIOD: file_desc -> OS.IO.iodesc val iodToFD: OS.IO.iodesc -> file_desc option type dirstream val opendir: string -> dirstream val readdir: dirstream -> string option val rewinddir: dirstream -> unit val closedir: dirstream -> unit val chdir: string -> unit val getcwd: unit -> string val stdin: file_desc val stdout: file_desc val stderr: file_desc structure S: sig eqtype mode include BIT_FLAGS where type flags = mode val irwxu: mode val irusr: mode val iwusr: mode val ixusr: mode val irwxg: mode val irgrp: mode val iwgrp: mode val ixgrp: mode val irwxo: mode val iroth: mode val iwoth: mode val ixoth: mode val isuid: mode val isgid: mode end structure O: sig include BIT_FLAGS val append: flags val excl: flags val noctty: flags val nonblock: flags val sync: flags val trunc: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val openf: string * open_mode * O.flags -> file_desc val createf: string * open_mode * O.flags * S.mode -> file_desc val creat: string * S.mode -> file_desc val umask: S.mode -> S.mode val link: {old: string, new: string} -> unit val mkdir: string * S.mode -> unit val mkfifo: string * S.mode -> unit val unlink: string -> unit val rmdir: string -> unit val rename: {old: string, new: string} -> unit val symlink: {old: string, new: string} -> unit val readlink: string -> string eqtype dev val wordToDev: SysWord.word -> dev val devToWord: dev -> SysWord.word eqtype ino val wordToIno: SysWord.word -> ino val inoToWord: ino -> SysWord.word structure ST: sig type stat val isDir: stat -> bool val isChr: stat -> bool val isBlk: stat -> bool val isReg: stat -> bool val isFIFO: stat -> bool val isLink: stat -> bool val isSock: stat -> bool val mode: stat -> S.mode val ino: stat -> ino val dev: stat -> dev val nlink: stat -> int val uid: stat -> uid val gid: stat -> gid val size: stat -> Position.int val atime: stat -> Time.time val mtime: stat -> Time.time val ctime: stat -> Time.time end val stat: string -> ST.stat val lstat: string -> ST.stat val fstat: file_desc -> ST.stat datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val chmod: string * S.mode -> unit val fchmod: file_desc * S.mode -> unit val chown: string * uid * gid -> unit val fchown: file_desc * uid * gid -> unit val utime: string * {actime: Time.time, modtime: Time.time} option -> unit val ftruncate: file_desc * Position.int -> unit val pathconf: string * string -> SysWord.word option val fpathconf: file_desc * string -> SysWord.word option end signature POSIX_FILE_SYS_EXTRA = sig include POSIX_FILE_SYS val flagsToOpenMode: O.flags -> open_mode end mlton-20210117+dfsg/basis-library/posix/file-sys.sml000066400000000000000000000374231416264345000222140ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixFileSys: POSIX_FILE_SYS_EXTRA = struct structure Prim = PrimitiveFFI.Posix.FileSys open Prim structure FileDesc = PrePosix.FileDesc structure GId = PrePosix.GId structure PId = PrePosix.PId structure Stat = Prim.Stat structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall (* Patch to make Time look like it deals with C_Time.t * instead of LargeInt.int. *) structure Time = struct open Time val fromSeconds = fromSeconds o C_Time.toLargeInt fun toSeconds t = C_Time.fromLargeInt (Time.toSeconds t) handle Overflow => Error.raiseSys Error.inval end type file_desc = FileDesc.t type gid = GId.t type uid = UId.t val fdToWord = C_Fd.castToSysWord o FileDesc.toRep val wordToFD = FileDesc.fromRep o C_Fd.castFromSysWord val fdToIOD = PreOS.IODesc.fromRep o FileDesc.toRep val iodToFD = SOME o FileDesc.fromRep o PreOS.IODesc.toRep (*------------------------------------*) (* dirstream *) (*------------------------------------*) local structure Prim = Prim.Dirstream datatype dirstream = DS of C_DirP.t option ref fun get (DS r) = case !r of NONE => Error.raiseSys Error.badf | SOME d => d in type dirstream = dirstream fun opendir s = let val s = NullString.nullTerm s in SysCall.syscall' ({errVal = C_DirP.castFromSysWord 0w0}, fn () => (Prim.openDir s, fn d => DS (ref (SOME d)))) end fun readdir d = let val d = get d fun loop () = let val res = SysCall.syscallErr ({clear = true, restart = false, errVal = CUtil.C_Pointer.null}, fn () => {return = Prim.readDir d, post = fn cs => SOME cs, handlers = [(Error.cleared, fn () => NONE), (* MinGW sets errno to ENOENT when it * returns NULL. *) (Error.noent, fn () => NONE)]}) in case res of NONE => NONE | SOME cs => let val s = CUtil.C_String.toString cs in if s = "." orelse s = ".." then loop () else SOME s end end in loop () end fun rewinddir d = let val d = get d in Prim.rewindDir d end fun closedir (DS r) = case !r of NONE => () | SOME d => (SysCall.simple (fn () => Prim.closeDir d); r := NONE) end fun chdir s = SysCall.simple (fn () => Prim.chdir (NullString.nullTerm s)) local val size: int ref = ref 1 fun make () = Array.alloc (!size) val buffer = ref (make ()) fun extractToChar (a, c) = let val n = Array.length a (* find the null terminator *) fun loop i = if i >= n then raise Fail "extractToChar didn't find terminator" else if c = Array.sub (a, i) then i else loop (i + 1) in ArraySlice.vector (ArraySlice.slice (a, 0, SOME (loop 0))) end fun extract a = extractToChar (a, #"\000") in fun getcwd () = let val res = SysCall.syscallErr ({clear = false, restart = false, errVal = CUtil.C_Pointer.null}, fn () => {return = Prim.getcwd (!buffer, C_Size.fromInt (!size)), post = fn _ => true, handlers = [(Error.range, fn _ => false)]}) in if res then extract (!buffer) else (size := 2 * !size ; buffer := make () ; getcwd ()) end end val stdin : file_desc = FileDesc.fromRep 0 val stdout : file_desc = FileDesc.fromRep 1 val stderr : file_desc = FileDesc.fromRep 2 structure S = struct structure Flags = BitFlags(structure S = C_Mode) open S Flags type mode = C_Mode.t val ifblk = IFBLK val ifchr = IFCHR val ifdir = IFDIR val ififo = IFIFO val iflnk = IFLNK val ifmt = IFMT val ifreg = IFREG val ifsock = IFSOCK val irgrp = IRGRP val iroth = IROTH val irusr = IRUSR val irwxg = IRWXG val irwxo = IRWXO val irwxu = IRWXU val isgid = ISGID val isuid = ISUID val isvtx = ISVTX val iwgrp = IWGRP val iwoth = IWOTH val iwusr = IWUSR val ixgrp = IXGRP val ixoth = IXOTH val ixusr = IXUSR end structure O = struct structure Flags = BitFlags(structure S = C_Int) open O Flags val append = APPEND val binary = BINARY val creat = CREAT val dsync = DSYNC val excl = EXCL val noctty = NOCTTY val nonblock = NONBLOCK val rdonly = RDONLY val rdwr = RDWR val rsync = RSYNC val sync = SYNC val text = TEXT val trunc = TRUNC val wronly = WRONLY end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR fun flagsToOpenMode f = if f = O.rdonly then O_RDONLY else if f = O.wronly then O_WRONLY else if f = O.rdwr then O_RDWR else raise Fail "flagsToOpenMode: unknown flag" val openModeToFlags = fn O_RDONLY => O.rdonly | O_WRONLY => O.wronly | O_RDWR => O.rdwr fun createf (pathname, openMode, flags, mode) = let val pathname = NullString.nullTerm pathname val flags = O.Flags.flags [openModeToFlags openMode, flags, O.creat] val flags = C_Int.castFromSysWord (O.Flags.toWord flags) val fd = SysCall.simpleResult (fn () => Prim.open3 (pathname, flags, mode)) in FileDesc.fromRep fd end fun openf (pathname, openMode, flags) = let val pathname = NullString.nullTerm pathname val flags = O.Flags.flags [openModeToFlags openMode, flags] val flags = C_Int.castFromSysWord (O.Flags.toWord flags) val fd = SysCall.simpleResult (fn () => Prim.open3 (pathname, flags, C_Mode.castFromSysWord 0wx0)) in FileDesc.fromRep fd end fun creat (s, m) = createf (s, O_WRONLY, O.trunc, m) val umask = Prim.umask local fun wrap p arg = (SysCall.simple (fn () => p arg); ()) fun wrapRestart p arg = (SysCall.simpleRestart (fn () => p arg); ()) fun wrapOldNew p = wrap (fn {old,new} => p (NullString.nullTerm old, NullString.nullTerm new)) in val link = wrapOldNew Prim.link val mkdir = wrap (fn (p, m) => Prim.mkdir (NullString.nullTerm p, m)) val mkfifo = wrap (fn (p, m) => Prim.mkfifo (NullString.nullTerm p, m)) val unlink = wrap (Prim.unlink o NullString.nullTerm) val rmdir = wrap (Prim.rmdir o NullString.nullTerm) val rename = wrapOldNew Prim.rename val symlink = wrapOldNew Prim.symlink val chmod = wrap (fn (p, m) => Prim.chmod (NullString.nullTerm p, m)) val fchmod = wrap (fn (fd, m) => Prim.fchmod (FileDesc.toRep fd, m)) val chown = wrap (fn (s, uid, gid) => Prim.chown (NullString.nullTerm s, UId.toRep uid, GId.toRep gid)) val fchown = wrap (fn (fd, uid, gid) => Prim.fchown (FileDesc.toRep fd, UId.toRep uid, GId.toRep gid)) val ftruncate = wrapRestart (fn (fd, n) => Prim.ftruncate (FileDesc.toRep fd, n)) end local val size: int = 1024 val buf : char array = Array.array (size, #"\000") in fun readlink (path: string): string = let val path = NullString.nullTerm path in SysCall.syscall' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => (Prim.readlink (path, buf, C_Size.fromInt size), fn len => ArraySlice.vector (ArraySlice.slice (buf, 0, SOME (C_SSize.toInt len))))) end end type dev = C_Dev.t val wordToDev = C_Dev.castFromSysWord val devToWord = C_Dev.castToSysWord type ino = C_INo.t val wordToIno = C_INo.castFromSysWord val inoToWord = C_INo.castToSysWord structure ST = struct datatype stat = T of {dev: dev, ino: ino, mode: S.mode, nlink: int, uid: uid, gid: gid, size: Position.int, atime: Time.time, mtime: Time.time, ctime: Time.time} fun fromC (): stat = T {dev = Stat.getDev (), ino = Stat.getINo (), mode = Stat.getMode (), nlink = C_NLink.toInt (Stat.getNLink ()), uid = UId.fromRep (Stat.getUId ()), gid = GId.fromRep (Stat.getGId ()), size = Stat.getSize (), atime = Time.fromSeconds (Stat.getATime ()), mtime = Time.fromSeconds (Stat.getMTime ()), ctime = Time.fromSeconds (Stat.getCTime ())} local fun make sel (T r) = sel r in val mode = make #mode val ino = make #ino val dev = make #dev val nlink = make #nlink val uid = make #uid val gid = make #gid val size = make #size val atime = make #atime val mtime = make #mtime val ctime = make #ctime end local fun make prim s = prim (mode s) <> C_Int.zero in val isDir = make Prim.ST.isDir val isChr = make Prim.ST.isChr val isBlk = make Prim.ST.isBlk val isReg = make Prim.ST.isReg val isFIFO = make Prim.ST.isFIFO val isLink = make Prim.ST.isLink val isSock = make Prim.ST.isSock end end local fun make prim arg = SysCall.syscall (fn () => (prim arg, fn _ => ST.fromC ())) in val stat = (make Prim.Stat.stat) o NullString.nullTerm val lstat = (make Prim.Stat.lstat) o NullString.nullTerm val fstat = (make Prim.Stat.fstat) o FileDesc.toRep end datatype access_mode = A_READ | A_WRITE | A_EXEC val conv_access_mode = fn A_READ => A.R_OK | A_WRITE => A.W_OK | A_EXEC => A.X_OK fun access (path: string, mode: access_mode list): bool = let val mode = List.foldl C_Int.orb 0 (A.F_OK :: (map conv_access_mode mode)) val path = NullString.nullTerm path in SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.access (path, mode), post = fn _ => true, handlers = [(Error.acces, fn () => false), (Error.loop, fn () => false), (Error.nametoolong, fn () => false), (Error.noent, fn () => false), (Error.notdir, fn () => false), (Error.rofs, fn () => false)]}) end local structure U = Prim.Utimbuf in fun utime (f: string, opt: {actime: Time.time, modtime: Time.time} option): unit = let val (a, m) = case opt of NONE => let val t = Time.now () in (t, t) end | SOME {actime = a, modtime = m} => (a, m) val a = Time.toSeconds a val m = Time.toSeconds m val f = NullString.nullTerm f in SysCall.syscallRestart (fn () => (U.setAcTime a ; U.setModTime m ; (U.utime f, fn _ => ()))) end end local local open Prim.PC infixr 5 ::? fun (n,s) ::? l = if n = C_Int.fromInt ~1 then l else (n,s) :: l in val properties = (TWO_SYMLINKS,"2_SYMLINKS") ::? (ALLOC_SIZE_MIN,"ALLOC_SIZE_MIN") ::? (ASYNC_IO,"ASYNC_IO") ::? (CHOWN_RESTRICTED,"CHOWN_RESTRICTED") ::? (FILESIZEBITS,"FILESIZEBITS") ::? (LINK_MAX,"LINK_MAX") ::? (MAX_CANON,"MAX_CANON") ::? (MAX_INPUT,"MAX_INPUT") ::? (NAME_MAX,"NAME_MAX") ::? (NO_TRUNC,"NO_TRUNC") ::? (PATH_MAX,"PATH_MAX") ::? (PIPE_BUF,"PIPE_BUF") ::? (PRIO_IO,"PRIO_IO") ::? (REC_INCR_XFER_SIZE,"REC_INCR_XFER_SIZE") ::? (REC_MAX_XFER_SIZE,"REC_MAX_XFER_SIZE") ::? (REC_MIN_XFER_SIZE,"REC_MIN_XFER_SIZE") ::? (REC_XFER_ALIGN,"REC_XFER_ALIGN") ::? (SYMLINK_MAX,"SYMLINK_MAX") ::? (SYNC_IO,"SYNC_IO") ::? (VDISABLE,"VDISABLE") ::? [] end fun convertProperty s = case List.find (fn (_, s') => s = s') properties of NONE => Error.raiseSys Error.inval | SOME (n, _) => n fun make prim (f, s) = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Long.fromInt ~1}, fn () => {return = prim (f, convertProperty s), post = fn ret => SOME (SysWord.fromLargeInt (C_Long.toLarge ret)), handlers = [(Error.cleared, fn () => NONE)]}) in val pathconf = make (fn (path, s) => Prim.pathconf (NullString.nullTerm path, s)) val fpathconf = make (fn (fd, s) => Prim.fpathconf (FileDesc.toRep fd, s)) end end mlton-20210117+dfsg/basis-library/posix/flags.sig000066400000000000000000000013001416264345000215250ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature BIT_FLAGS = sig eqtype flags val all: flags val allSet: flags * flags -> bool val anySet: flags * flags -> bool val clear: flags * flags -> flags val flags: flags list -> flags val fromWord: SysWord.word -> flags val intersect: flags list -> flags val toWord: flags -> SysWord.word end signature BIT_FLAGS_EXTRA = sig include BIT_FLAGS val empty: flags end mlton-20210117+dfsg/basis-library/posix/flags.sml000066400000000000000000000021461416264345000215470ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor BitFlags(structure S : sig eqtype t val castToSysWord: t -> SysWord.word val castFromSysWord: SysWord.word -> t val andb: t * t -> t val notb: t -> t val orb: t * t -> t end): BIT_FLAGS_EXTRA = struct type flags = S.t val all: flags = S.castFromSysWord (SysWord.~ 0w1) val empty: flags = S.castFromSysWord 0w0 fun toWord f = S.castToSysWord f fun fromWord w = S.castFromSysWord (SysWord.andb (w, toWord all)) val flags: flags list -> flags = List.foldl S.orb empty val intersect: flags list -> flags = List.foldl S.andb all fun clear (f, f') = S.andb (S.notb f, f') fun allSet (f, f') = S.andb (f, f') = f' fun anySet (f, f') = S.andb (f, f') <> empty end mlton-20210117+dfsg/basis-library/posix/io.sig000066400000000000000000000052511416264345000210510ustar00rootroot00000000000000signature POSIX_IO = sig eqtype file_desc eqtype pid val pipe: unit -> {infd: file_desc, outfd: file_desc} val dup: file_desc -> file_desc val dup2: {old: file_desc, new: file_desc} -> unit val close: file_desc -> unit val readVec: file_desc * int -> Word8Vector.vector val readArr: file_desc * Word8ArraySlice.slice -> int val writeVec: file_desc * Word8VectorSlice.slice -> int val writeArr: file_desc * Word8ArraySlice.slice -> int datatype whence = SEEK_SET | SEEK_CUR | SEEK_END structure FD: sig include BIT_FLAGS val cloexec: flags end structure O: sig include BIT_FLAGS val append: flags val nonblock: flags val sync: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val dupfd: {old: file_desc, base: file_desc} -> file_desc val getfd: file_desc -> FD.flags val setfd: file_desc * FD.flags -> unit val getfl: file_desc -> O.flags * open_mode val setfl: file_desc * O.flags -> unit val lseek: file_desc * Position.int * whence -> Position.int val fsync: file_desc -> unit datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock: sig type flock val flock: {ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option} -> flock val ltype: flock -> lock_type val whence: flock -> whence val start: flock -> Position.int val len: flock -> Position.int val pid: flock -> pid option end val getlk: file_desc * FLock.flock -> FLock.flock val setlk: file_desc * FLock.flock -> FLock.flock val setlkw: file_desc * FLock.flock -> FLock.flock val mkBinReader: {fd: file_desc, name: string, initBlkMode: bool} -> BinPrimIO.reader val mkTextReader: {fd: file_desc, name: string, initBlkMode: bool} -> TextPrimIO.reader val mkBinWriter: {fd: file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> BinPrimIO.writer val mkTextWriter: {fd: file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> TextPrimIO.writer end mlton-20210117+dfsg/basis-library/posix/io.sml000066400000000000000000000352751416264345000210730ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixIO: POSIX_IO = struct structure Prim = PrimitiveFFI.Posix.IO open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Error = PosixError structure SysCall = Error.SysCall structure FS = PosixFileSys type file_desc = FileDesc.t type pid = PId.t local val a: C_Fd.t array = Array.array (2, C_Fd.fromInt 0) val get = fn i => FileDesc.fromRep (Array.sub (a, i)) in fun pipe () = SysCall.syscall (fn () => (Prim.pipe a, fn _ => {infd = get 0, outfd = get 1})) end fun dup fd = (FileDesc.fromRep o SysCall.simpleResult) (fn () => Prim.dup (FileDesc.toRep fd)) fun dup2 {new, old} = SysCall.simple (fn () => Prim.dup2 (FileDesc.toRep old, FileDesc.toRep new)) fun close fd = SysCall.simpleRestart (fn () => Prim.close (FileDesc.toRep fd)) structure FD = struct structure Flags = BitFlags(structure S = C_Int) open FD Flags val cloexec = CLOEXEC end structure O = PosixFileSys.O datatype open_mode = datatype PosixFileSys.open_mode fun dupfd {base, old} = (FileDesc.fromRep o SysCall.simpleResultRestart) (fn () => Prim.fcntl3 (FileDesc.toRep old, F_DUPFD, FileDesc.toRep base)) fun getfd fd = SysCall.simpleResultRestart (fn () => Prim.fcntl2 (FileDesc.toRep fd, F_GETFD)) fun setfd (fd, flags): unit = SysCall.simpleRestart (fn () => Prim.fcntl3 (FileDesc.toRep fd, F_SETFD, flags)) fun getfl fd : O.flags * open_mode = let val n = SysCall.simpleResultRestart (fn () => Prim.fcntl2 (FileDesc.toRep fd, F_GETFL)) val flags = C_Int.andb (n, C_Int.notb O_ACCMODE) val mode = C_Int.andb (n, O_ACCMODE) in (flags, PosixFileSys.flagsToOpenMode mode) end fun setfl (fd, flags: O.flags): unit = SysCall.simpleRestart (fn () => Prim.fcntl3 (FileDesc.toRep fd, F_SETFL, flags)) datatype whence = SEEK_SET | SEEK_CUR | SEEK_END val whenceToInt = fn SEEK_SET => Prim.SEEK_SET | SEEK_CUR => Prim.SEEK_CUR | SEEK_END => Prim.SEEK_END fun lseek (fd, n: Position.int, w: whence): Position.int = SysCall.simpleResult' ({errVal = C_Off.fromInt ~1}, fn () => Prim.lseek (FileDesc.toRep fd, n, whenceToInt w)) fun fsync fd : unit = SysCall.simple (fn () => Prim.fsync (FileDesc.toRep fd)) val whenceToInt = fn SEEK_SET => Prim.FLock.SEEK_SET | SEEK_CUR => Prim.FLock.SEEK_CUR | SEEK_END => Prim.FLock.SEEK_END fun intToWhence n = if n = Prim.FLock.SEEK_SET then SEEK_SET else if n = Prim.FLock.SEEK_CUR then SEEK_CUR else if n = Prim.FLock.SEEK_END then SEEK_END else raise Fail "Posix.IO.intToWhence" datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK val lockTypeToInt = fn F_RDLCK => Prim.FLock.F_RDLCK | F_WRLCK => Prim.FLock.F_WRLCK | F_UNLCK => Prim.FLock.F_UNLCK fun intToLockType n = if n = Prim.FLock.F_RDLCK then F_RDLCK else if n = Prim.FLock.F_WRLCK then F_WRLCK else if n = Prim.FLock.F_UNLCK then F_UNLCK else raise Fail "Posix.IO.intToLockType" structure FLock = struct open FLock type flock = {ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option} fun flock l = l val ltype: flock -> lock_type = #ltype val whence: flock -> whence = #whence val start: flock -> Position.int = #start val len: flock -> Position.int = #len val pid: flock -> pid option = #pid end local structure P = Prim.FLock fun make (cmd, usepid) (fd, {ltype, whence, start, len, ...}: FLock.flock) : FLock.flock = SysCall.syscallRestart (fn () => ((P.setType (lockTypeToInt ltype) ; P.setWhence (whenceToInt whence) ; P.setStart start ; P.setLen len ; P.fcntl (FileDesc.toRep fd, cmd)), fn _ => {ltype = intToLockType (P.getType ()), whence = intToWhence (P.getWhence ()), start = P.getStart (), len = P.getLen (), pid = if usepid then SOME (PId.fromRep (P.getPId ())) else NONE})) in val getlk = make (FLock.F_GETLK, true) val setlk = make (FLock.F_SETLK, false) val setlkw = make (FLock.F_SETLKW, false) end (* Adapted from SML/NJ sources. *) (* posix-bin-prim-io.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * This implements the UNIX version of the OS specific binary primitive * IO structure. The Text IO version is implemented by a trivial translation * of these operations (see posix-text-prim-io.sml). * *) local val pos0 = Position.fromInt 0 fun isReg fd = FS.ST.isReg(FS.fstat fd) fun posFns (closed, fd) = if (isReg fd) then let val pos = ref pos0 fun getPos () = !pos fun setPos p = (if !closed then raise IO.ClosedStream else (); pos := lseek(fd,p,SEEK_SET)) fun endPos () = (if !closed then raise IO.ClosedStream else (); FS.ST.size(FS.fstat fd)) fun verifyPos () = let val curPos = lseek(fd, pos0, SEEK_CUR) in pos := curPos; curPos end val _ = verifyPos () in {pos = pos, getPos = SOME getPos, setPos = SOME setPos, endPos = SOME endPos, verifyPos = SOME verifyPos} end else {pos = ref pos0, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE} fun make {RD, WR, fromVector, readArr, setMode, toArraySlice, toVectorSlice, vectorLength, writeArr, writeVec} = let val primReadArr = fn (fd, buf, i, sz) => readArr (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val primWriteArr = fn (fd, buf, i, sz) => writeArr (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val primWriteVec = fn (fd, buf, i, sz) => writeVec (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val setMode = fn fd => if let open Primitive.MLton.Platform.OS in case host of MinGW => true | _ => false end then setMode (FileDesc.toRep fd) else () fun readArr (fd, sl): int = let val (buf, i, sz) = ArraySlice.base (toArraySlice sl) val bytesRead = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primReadArr (fd, buf, i, sz)) val bytesRead = C_SSize.toInt bytesRead in bytesRead end fun readVec (fd, n) = let val buf = Array.alloc n val bytesRead = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primReadArr (fd, buf, 0, n)) val bytesRead = C_SSize.toInt bytesRead in fromVector (if n = bytesRead then Vector.unsafeFromArray buf else ArraySlice.vector (ArraySlice.slice (buf, 0, SOME bytesRead))) end fun writeArr (fd, sl): int = let val (buf, i, sz) = ArraySlice.base (toArraySlice sl) val bytesWrote = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primWriteArr (fd, buf, i, sz)) val bytesWrote = C_SSize.toInt bytesWrote in bytesWrote end fun writeVec (fd, sl): int = let val (buf, i, sz) = VectorSlice.base (toVectorSlice sl) val bytesWrote = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primWriteVec (fd, buf, i, sz)) val bytesWrote = C_SSize.toInt bytesWrote in bytesWrote end fun mkReader {fd, name, initBlkMode} = let val closed = ref false val {pos, getPos, setPos, endPos, verifyPos} = posFns (closed, fd) val blocking = ref initBlkMode fun blockingOn () = (setfl(fd, O.flags[]); blocking := true) fun blockingOff () = (setfl(fd, O.nonblock); blocking := false) fun ensureOpen () = if !closed then raise IO.ClosedStream else () fun incPos k = pos := Position.+ (!pos, Position.fromInt k) val readVec = fn n => let val v = readVec (fd, n) in incPos (vectorLength v); v end val readArr = fn x => let val k = readArr (fd, x) in incPos k; k end fun blockWrap f x = (ensureOpen (); if !blocking then () else blockingOn (); f x) fun noBlockWrap f x = (ensureOpen (); if !blocking then blockingOff () else (); (SOME (f x) handle (e as PosixError.SysErr (_, cause)) => if cause = SOME PosixError.again then NONE else raise e)) val close = fn () => if !closed then () else (closed := true; close fd) val avail = if isReg fd then fn () => if !closed then SOME 0 else SOME (Position.toInt (Position.- (FS.ST.size (FS.fstat fd), !pos))) else fn () => if !closed then SOME 0 else NONE val () = setMode fd in RD {avail = avail, block = NONE, canInput = NONE, chunkSize = Int32.toInt Primitive.Controls.bufSize, close = close, endPos = endPos, getPos = getPos, ioDesc = SOME (FS.fdToIOD fd), name = name, readArr = SOME (blockWrap readArr), readArrNB = SOME (noBlockWrap readArr), readVec = SOME (blockWrap readVec), readVecNB = SOME (noBlockWrap readVec), setPos = setPos, verifyPos = verifyPos} end fun mkWriter {fd, name, initBlkMode, appendMode, chunkSize} = let val closed = ref false val {pos, getPos, setPos, endPos, verifyPos} = posFns (closed, fd) fun incPos k = (pos := Position.+ (!pos, Position.fromInt k); k) val blocking = ref initBlkMode val appendFlgs = O.flags(if appendMode then [O.append] else []) fun updateStatus () = let val flgs = if !blocking then appendFlgs else O.flags [O.nonblock, appendFlgs] in setfl(fd, flgs) end fun ensureOpen () = if !closed then raise IO.ClosedStream else () fun ensureBlock x = if !blocking then () else (blocking := x; updateStatus ()) fun putV x = incPos (writeVec x) fun putA x = incPos (writeArr x) fun write (put, block) arg = (ensureOpen (); ensureBlock block; put (fd, arg)) fun handleBlock writer arg = SOME(writer arg) handle (e as PosixError.SysErr (_, cause)) => if cause = SOME PosixError.again then NONE else raise e val close = fn () => if !closed then () else (closed := true; close fd) val () = setMode fd in WR {block = NONE, canOutput = NONE, chunkSize = chunkSize, close = close, endPos = endPos, getPos = getPos, ioDesc = SOME (FS.fdToIOD fd), name = name, setPos = setPos, verifyPos = verifyPos, writeArr = SOME (write (putA, true)), writeArrNB = SOME (handleBlock (write (putA, false))), writeVec = SOME (write (putV, true)), writeVecNB = SOME (handleBlock (write (putV, false)))} end in {mkReader = mkReader, mkWriter = mkWriter, readArr = readArr, readVec = readVec, writeArr = writeArr, writeVec = writeVec} end in val {mkReader = mkBinReader, mkWriter = mkBinWriter, readArr, readVec, writeArr, writeVec} = make {RD = BinPrimIO.RD, WR = BinPrimIO.WR, fromVector = Word8Vector.fromPoly, readArr = readWord8, setMode = Prim.setbin, toArraySlice = Word8ArraySlice.toPoly, toVectorSlice = Word8VectorSlice.toPoly, vectorLength = Word8Vector.length, writeArr = writeWord8Arr, writeVec = writeWord8Vec} val {mkReader = mkTextReader, mkWriter = mkTextWriter, ...} = make {RD = TextPrimIO.RD, WR = TextPrimIO.WR, fromVector = fn v => v, readArr = readChar8, setMode = Prim.settext, toArraySlice = CharArraySlice.toPoly, toVectorSlice = CharVectorSlice.toPoly, vectorLength = CharVector.length, writeArr = writeChar8Arr, writeVec = writeChar8Vec} end end mlton-20210117+dfsg/basis-library/posix/posix.sig000066400000000000000000000025771416264345000216140ustar00rootroot00000000000000signature POSIX = sig structure Error: POSIX_ERROR structure FileSys: POSIX_FILE_SYS structure IO: POSIX_IO structure ProcEnv: POSIX_PROC_ENV structure Process: POSIX_PROCESS structure Signal: POSIX_SIGNAL structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY sharing type FileSys.file_desc = ProcEnv.file_desc = IO.file_desc = TTY.file_desc sharing type ProcEnv.gid = FileSys.gid = SysDB.gid sharing type FileSys.open_mode = IO.open_mode sharing type Process.pid = ProcEnv.pid = IO.pid = TTY.pid sharing type Process.signal = Signal.signal sharing type ProcEnv.uid = FileSys.uid = SysDB.uid end signature POSIX_EXTRA = sig structure Error: POSIX_ERROR_EXTRA structure FileSys: POSIX_FILE_SYS_EXTRA structure IO: POSIX_IO structure ProcEnv: POSIX_PROC_ENV structure Process: POSIX_PROCESS_EXTRA structure Signal: POSIX_SIGNAL_EXTRA structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY sharing type FileSys.file_desc = ProcEnv.file_desc = IO.file_desc = TTY.file_desc sharing type ProcEnv.gid = FileSys.gid = SysDB.gid sharing type FileSys.open_mode = IO.open_mode sharing type Process.pid = ProcEnv.pid = IO.pid = TTY.pid sharing type Process.signal = Signal.signal sharing type ProcEnv.uid = FileSys.uid = SysDB.uid end mlton-20210117+dfsg/basis-library/posix/posix.sml000066400000000000000000000011171416264345000216120ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Posix: POSIX_EXTRA = struct structure Error = PosixError structure Signal = PosixSignal structure Process = PosixProcess structure ProcEnv = PosixProcEnv structure FileSys = PosixFileSys structure IO = PosixIO structure SysDB = PosixSysDB structure TTY = PosixTTY end mlton-20210117+dfsg/basis-library/posix/pre-posix.sml000066400000000000000000000010671416264345000224020ustar00rootroot00000000000000(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PrePosix = struct structure FileDesc = MkAbsRepEq(type rep = C_Fd.t) structure GId = MkAbsRepEq(type rep = C_GId.t) structure PId = MkAbsRepEq(type rep = C_PId.t) structure Signal = MkAbsRepEq(type rep = C_Signal.t) structure SysError = MkAbsRepEq(type rep = C_Int.t) structure UId = MkAbsRepEq(type rep = C_UId.t) end mlton-20210117+dfsg/basis-library/posix/proc-env.sig000066400000000000000000000023551416264345000221750ustar00rootroot00000000000000signature POSIX_PROC_ENV = sig eqtype pid eqtype uid eqtype gid eqtype file_desc val uidToWord: uid -> SysWord.word val wordToUid: SysWord.word -> uid val gidToWord: gid -> SysWord.word val wordToGid: SysWord.word -> gid val getpid : unit -> pid val getppid: unit -> pid val getuid : unit -> uid val geteuid: unit -> uid val getgid : unit -> gid val getegid: unit -> gid val setuid: uid -> unit val setgid: gid -> unit val getgroups: unit -> gid list val getlogin: unit -> string val getpgrp: unit -> pid val setsid: unit -> pid val setpgid: {pid: pid option, pgid: pid option} -> unit val uname: unit -> (string * string) list val time: unit -> Time.time val times: unit -> {elapsed: Time.time, utime: Time.time, stime: Time.time, cutime: Time.time, cstime: Time.time} val getenv: string -> string option val environ: unit -> string list val ctermid: unit -> string val ttyname: file_desc -> string val isatty: file_desc -> bool val sysconf: string -> SysWord.word end mlton-20210117+dfsg/basis-library/posix/proc-env.sml000066400000000000000000000314101416264345000222000ustar00rootroot00000000000000(* Copyright (C) 2011,2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixProcEnv: POSIX_PROC_ENV = struct structure Prim = PrimitiveFFI.Posix.ProcEnv structure FileDesc = PrePosix.FileDesc structure GId = PrePosix.GId structure PId = PrePosix.PId structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall structure CS = CUtil.C_String structure CSS = CUtil.C_StringArray type file_desc = FileDesc.t type gid = GId.t type pid = PId.t type uid = UId.t val uidToWord = C_UId.castToSysWord o UId.toRep val wordToUid = UId.fromRep o C_UId.castFromSysWord val gidToWord = C_GId.castToSysWord o GId.toRep val wordToGid = GId.fromRep o C_GId.castFromSysWord local open Prim in val getpgrp = PId.fromRep o getpgrp (* No error checking required *) val getegid = GId.fromRep o getegid (* No error checking required *) val geteuid = UId.fromRep o geteuid (* No error checking required *) val getgid = GId.fromRep o getgid (* No error checking required *) val getpid = PId.fromRep o getpid (* No error checking required *) val getppid = PId.fromRep o getppid (* No error checking required *) val getuid = UId.fromRep o getuid (* No error checking required *) val setgid = fn gid => let val gid = GId.toRep gid in SysCall.simple (fn () => setgid gid) end val setuid = fn uid => let val uid = UId.toRep uid in SysCall.simple (fn () => setuid uid) end end fun setsid () = (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, Prim.setsid) fun getgroups () = SysCall.syscall (fn () => let val n = Prim.getgroupsN () val a: C_GId.t array = Array.alloc (C_Int.toInt n) in (Prim.getgroups (n, a), fn n => (GId.listFromRep o ArraySlice.toList) (ArraySlice.slice (a, 0, SOME (C_Int.toInt n)))) end) fun getlogin () = SysCall.syscall' ({errVal = CUtil.C_Pointer.null}, fn () => (Prim.getlogin (), fn cs => CS.toString cs)) fun setpgid {pid, pgid} = let val pid = case pid of NONE => 0 | SOME pid => PId.toRep pid val pgid = case pgid of NONE => 0 | SOME pgid => PId.toRep pgid in SysCall.simple (fn () => Prim.setpgid (pid, pgid)) end fun uname () = SysCall.syscall (fn () => (Prim.uname (), fn _ => [("sysname", CS.toString (Prim.Uname.getSysName ())), ("nodename", CS.toString (Prim.Uname.getNodeName ())), ("release", CS.toString (Prim.Uname.getRelease ())), ("version", CS.toString (Prim.Uname.getVersion ())), ("machine", CS.toString (Prim.Uname.getMachine ()))])) val time = Time.now local local infixr 5 ::? fun (n,s) ::? l = if n = C_Int.fromInt ~1 then l else (n,s) :: l in val sysconfNames = (Prim.SC_2_CHAR_TERM,"2_CHAR_TERM") ::? (Prim.SC_2_C_BIND,"2_C_BIND") ::? (Prim.SC_2_C_DEV,"2_C_DEV") ::? (Prim.SC_2_FORT_DEV,"2_FORT_DEV") ::? (Prim.SC_2_FORT_RUN,"2_FORT_RUN") ::? (Prim.SC_2_LOCALEDEF,"2_LOCALEDEF") ::? (Prim.SC_2_PBS,"2_PBS") ::? (Prim.SC_2_PBS_ACCOUNTING,"2_PBS_ACCOUNTING") ::? (Prim.SC_2_PBS_CHECKPOINT,"2_PBS_CHECKPOINT") ::? (Prim.SC_2_PBS_LOCATE,"2_PBS_LOCATE") ::? (Prim.SC_2_PBS_MESSAGE,"2_PBS_MESSAGE") ::? (Prim.SC_2_PBS_TRACK,"2_PBS_TRACK") ::? (Prim.SC_2_SW_DEV,"2_SW_DEV") ::? (Prim.SC_2_UPE,"2_UPE") ::? (Prim.SC_2_VERSION,"2_VERSION") ::? (Prim.SC_ADVISORY_INFO,"ADVISORY_INFO") ::? (Prim.SC_AIO_LISTIO_MAX,"AIO_LISTIO_MAX") ::? (Prim.SC_AIO_MAX,"AIO_MAX") ::? (Prim.SC_AIO_PRIO_DELTA_MAX,"AIO_PRIO_DELTA_MAX") ::? (Prim.SC_ARG_MAX,"ARG_MAX") ::? (Prim.SC_ASYNCHRONOUS_IO,"ASYNCHRONOUS_IO") ::? (Prim.SC_ATEXIT_MAX,"ATEXIT_MAX") ::? (Prim.SC_AVPHYS_PAGES,"AVPHYS_PAGES") ::? (Prim.SC_BARRIERS,"BARRIERS") ::? (Prim.SC_BC_BASE_MAX,"BC_BASE_MAX") ::? (Prim.SC_BC_DIM_MAX,"BC_DIM_MAX") ::? (Prim.SC_BC_SCALE_MAX,"BC_SCALE_MAX") ::? (Prim.SC_BC_STRING_MAX,"BC_STRING_MAX") ::? (Prim.SC_CHILD_MAX,"CHILD_MAX") ::? (Prim.SC_CLK_TCK,"CLK_TCK") ::? (Prim.SC_CLOCK_SELECTION,"CLOCK_SELECTION") ::? (Prim.SC_COLL_WEIGHTS_MAX,"COLL_WEIGHTS_MAX") ::? (Prim.SC_CPUTIME,"CPUTIME") ::? (Prim.SC_DELAYTIMER_MAX,"DELAYTIMER_MAX") ::? (Prim.SC_EXPR_NEST_MAX,"EXPR_NEST_MAX") ::? (Prim.SC_FSYNC,"FSYNC") ::? (Prim.SC_GETGR_R_SIZE_MAX,"GETGR_R_SIZE_MAX") ::? (Prim.SC_GETPW_R_SIZE_MAX,"GETPW_R_SIZE_MAX") ::? (Prim.SC_HOST_NAME_MAX,"HOST_NAME_MAX") ::? (Prim.SC_IOV_MAX,"IOV_MAX") ::? (Prim.SC_IPV6,"IPV6") ::? (Prim.SC_JOB_CONTROL,"JOB_CONTROL") ::? (Prim.SC_LINE_MAX,"LINE_MAX") ::? (Prim.SC_LOGIN_NAME_MAX,"LOGIN_NAME_MAX") ::? (Prim.SC_MAPPED_FILES,"MAPPED_FILES") ::? (Prim.SC_MEMLOCK,"MEMLOCK") ::? (Prim.SC_MEMLOCK_RANGE,"MEMLOCK_RANGE") ::? (Prim.SC_MEMORY_PROTECTION,"MEMORY_PROTECTION") ::? (Prim.SC_MESSAGE_PASSING,"MESSAGE_PASSING") ::? (Prim.SC_MONOTONIC_CLOCK,"MONOTONIC_CLOCK") ::? (Prim.SC_MQ_OPEN_MAX,"MQ_OPEN_MAX") ::? (Prim.SC_MQ_PRIO_MAX,"MQ_PRIO_MAX") ::? (Prim.SC_NGROUPS_MAX,"NGROUPS_MAX") ::? (Prim.SC_NPROCESSORS_CONF,"NPROCESSORS_CONF") ::? (Prim.SC_NPROCESSORS_ONLN,"NPROCESSORS_ONLN") ::? (Prim.SC_OPEN_MAX,"OPEN_MAX") ::? (Prim.SC_PAGESIZE,"PAGESIZE") ::? (Prim.SC_PAGE_SIZE,"PAGE_SIZE") ::? (Prim.SC_PHYS_PAGES,"PHYS_PAGES") ::? (Prim.SC_PRIORITIZED_IO,"PRIORITIZED_IO") ::? (Prim.SC_PRIORITY_SCHEDULING,"PRIORITY_SCHEDULING") ::? (Prim.SC_RAW_SOCKETS,"RAW_SOCKETS") ::? (Prim.SC_READER_WRITER_LOCKS,"READER_WRITER_LOCKS") ::? (Prim.SC_REALTIME_SIGNALS,"REALTIME_SIGNALS") ::? (Prim.SC_REGEXP,"REGEXP") ::? (Prim.SC_RE_DUP_MAX,"RE_DUP_MAX") ::? (Prim.SC_RTSIG_MAX,"RTSIG_MAX") ::? (Prim.SC_SAVED_IDS,"SAVED_IDS") ::? (Prim.SC_SEMAPHORES,"SEMAPHORES") ::? (Prim.SC_SEM_NSEMS_MAX,"SEM_NSEMS_MAX") ::? (Prim.SC_SEM_VALUE_MAX,"SEM_VALUE_MAX") ::? (Prim.SC_SHARED_MEMORY_OBJECTS,"SHARED_MEMORY_OBJECTS") ::? (Prim.SC_SHELL,"SHELL") ::? (Prim.SC_SIGQUEUE_MAX,"SIGQUEUE_MAX") ::? (Prim.SC_SPAWN,"SPAWN") ::? (Prim.SC_SPIN_LOCKS,"SPIN_LOCKS") ::? (Prim.SC_SPORADIC_SERVER,"SPORADIC_SERVER") ::? (Prim.SC_SS_REPL_MAX,"SS_REPL_MAX") ::? (Prim.SC_STREAM_MAX,"STREAM_MAX") ::? (Prim.SC_SYMLOOP_MAX,"SYMLOOP_MAX") ::? (Prim.SC_SYNCHRONIZED_IO,"SYNCHRONIZED_IO") ::? (Prim.SC_THREADS,"THREADS") ::? (Prim.SC_THREAD_ATTR_STACKADDR,"THREAD_ATTR_STACKADDR") ::? (Prim.SC_THREAD_ATTR_STACKSIZE,"THREAD_ATTR_STACKSIZE") ::? (Prim.SC_THREAD_CPUTIME,"THREAD_CPUTIME") ::? (Prim.SC_THREAD_DESTRUCTOR_ITERATIONS,"THREAD_DESTRUCTOR_ITERATIONS") ::? (Prim.SC_THREAD_KEYS_MAX,"THREAD_KEYS_MAX") ::? (Prim.SC_THREAD_PRIORITY_SCHEDULING,"THREAD_PRIORITY_SCHEDULING") ::? (Prim.SC_THREAD_PRIO_INHERIT,"THREAD_PRIO_INHERIT") ::? (Prim.SC_THREAD_PRIO_PROTECT,"THREAD_PRIO_PROTECT") ::? (Prim.SC_THREAD_PROCESS_SHARED,"THREAD_PROCESS_SHARED") ::? (Prim.SC_THREAD_SAFE_FUNCTIONS,"THREAD_SAFE_FUNCTIONS") ::? (Prim.SC_THREAD_SPORADIC_SERVER,"THREAD_SPORADIC_SERVER") ::? (Prim.SC_THREAD_STACK_MIN,"THREAD_STACK_MIN") ::? (Prim.SC_THREAD_THREADS_MAX,"THREAD_THREADS_MAX") ::? (Prim.SC_TIMEOUTS,"TIMEOUTS") ::? (Prim.SC_TIMERS,"TIMERS") ::? (Prim.SC_TIMER_MAX,"TIMER_MAX") ::? (Prim.SC_TRACE,"TRACE") ::? (Prim.SC_TRACE_EVENT_FILTER,"TRACE_EVENT_FILTER") ::? (Prim.SC_TRACE_EVENT_NAME_MAX,"TRACE_EVENT_NAME_MAX") ::? (Prim.SC_TRACE_INHERIT,"TRACE_INHERIT") ::? (Prim.SC_TRACE_LOG,"TRACE_LOG") ::? (Prim.SC_TRACE_NAME_MAX,"TRACE_NAME_MAX") ::? (Prim.SC_TRACE_SYS_MAX,"TRACE_SYS_MAX") ::? (Prim.SC_TRACE_USER_EVENT_MAX,"TRACE_USER_EVENT_MAX") ::? (Prim.SC_TTY_NAME_MAX,"TTY_NAME_MAX") ::? (Prim.SC_TYPED_MEMORY_OBJECTS,"TYPED_MEMORY_OBJECTS") ::? (Prim.SC_TZNAME_MAX,"TZNAME_MAX") ::? (Prim.SC_V6_ILP32_OFF32,"V6_ILP32_OFF32") ::? (Prim.SC_V6_ILP32_OFFBIG,"V6_ILP32_OFFBIG") ::? (Prim.SC_V6_LP64_OFF64,"V6_LP64_OFF64") ::? (Prim.SC_V6_LPBIG_OFFBIG,"V6_LPBIG_OFFBIG") ::? (Prim.SC_VERSION,"VERSION") ::? (Prim.SC_XBS5_ILP32_OFF32,"XBS5_ILP32_OFF32") ::? (Prim.SC_XBS5_ILP32_OFFBIG,"XBS5_ILP32_OFFBIG") ::? (Prim.SC_XBS5_LP64_OFF64,"XBS5_LP64_OFF64") ::? (Prim.SC_XBS5_LPBIG_OFFBIG,"XBS5_LPBIG_OFFBIG") ::? (Prim.SC_XOPEN_CRYPT,"XOPEN_CRYPT") ::? (Prim.SC_XOPEN_ENH_I18N,"XOPEN_ENH_I18N") ::? (Prim.SC_XOPEN_LEGACY,"XOPEN_LEGACY") ::? (Prim.SC_XOPEN_REALTIME,"XOPEN_REALTIME") ::? (Prim.SC_XOPEN_REALTIME_THREADS,"XOPEN_REALTIME_THREADS") ::? (Prim.SC_XOPEN_SHM,"XOPEN_SHM") ::? (Prim.SC_XOPEN_STREAMS,"XOPEN_STREAMS") ::? (Prim.SC_XOPEN_UNIX,"XOPEN_UNIX") ::? (Prim.SC_XOPEN_VERSION,"XOPEN_VERSION") ::? [] end in fun sysconf s = case List.find (fn (_, s') => s = s') sysconfNames of NONE => Error.raiseSys Error.inval | SOME (n, _) => (SysWord.fromLargeInt o C_Long.toLarge o SysCall.simpleResult') ({errVal = C_Long.fromInt ~1}, fn () => Prim.sysconf n) end local structure Times = Prim.Times val clocksPerSec = (* syconf is not implemented on MinGW; * we don't want a SysErr during Basis Library initialization. *) if (let open Primitive.MLton.Platform.OS in host = MinGW end) then LargeInt.zero else SysWord.toLargeIntX (sysconf "CLK_TCK") fun cvt (clocks: C_Clock.t) = Time.fromTicks (LargeInt.quot (LargeInt.* (C_Clock.toLargeInt clocks, Time.ticksPerSecond), clocksPerSec)) in fun times () = SysCall.syscall' ({errVal = C_Clock.castFromFixedInt ~1}, fn () => (Prim.times (), fn elapsed => {elapsed = cvt elapsed, utime = cvt (Times.getUTime ()), stime = cvt (Times.getSTime ()), cutime = cvt (Times.getCUTime ()), cstime = cvt (Times.getCSTime ())})) end fun environ () = CSS.toList (Prim.environGet ()) fun getenv name = let val cs = Prim.getenv (NullString.nullTerm name) in if CUtil.C_Pointer.isNull cs then NONE else SOME (CS.toString cs) end fun ctermid () = CS.toString (Prim.ctermid ()) fun isatty fd = (Prim.isatty (FileDesc.toRep fd)) <> C_Int.zero fun ttyname fd = SysCall.syscall' ({errVal = CUtil.C_Pointer.null}, fn () => (Prim.ttyname (FileDesc.toRep fd), fn cs => CS.toString cs)) end mlton-20210117+dfsg/basis-library/posix/process.sig000066400000000000000000000025471416264345000221250ustar00rootroot00000000000000signature POSIX_PROCESS = sig eqtype signal eqtype pid structure W: sig include BIT_FLAGS val untraced: flags end datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid val alarm: Time.time -> Time.time val exec: string * string list -> 'a val exece: string * string list * string list -> 'a val execp: string * string list -> 'a val exit: Word8.word -> 'a val fork: unit -> pid option val fromStatus: OS.Process.status -> exit_status val kill: killpid_arg * signal -> unit val pause: unit -> unit val pidToWord: pid -> SysWord.word val sleep: Time.time -> Time.time val wait: unit -> pid * exit_status val waitpid: waitpid_arg * W.flags list -> pid * exit_status val waitpid_nh: waitpid_arg * W.flags list -> (pid * exit_status) option val wordToPid: SysWord.word -> pid end signature POSIX_PROCESS_EXTRA = sig include POSIX_PROCESS val fromStatus': C_Status.t -> exit_status end mlton-20210117+dfsg/basis-library/posix/process.sml000066400000000000000000000150741416264345000221350ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixProcess: POSIX_PROCESS_EXTRA = struct structure Prim = PrimitiveFFI.Posix.Process open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Signal = PrePosix.Signal structure Error = PosixError structure SysCall = Error.SysCall type signal = Signal.t type pid = PId.t val pidToWord = C_PId.castToSysWord o PId.toRep val wordToPid = PId.fromRep o C_PId.castFromSysWord fun fork () = SysCall.syscall' ({errVal = C_PId.castFromFixedInt ~1}, fn () => (Prim.fork (), fn p => if p = C_PId.castFromFixedInt 0 then NONE else SOME (PId.fromRep p))) val fork = if Primitive.MLton.Platform.OS.forkIsEnabled then fork else fn () => Error.raiseSys Error.nosys val conv = NullString.nullTerm val convs = CUtil.C_StringArray.fromList fun exece (path, args, env): 'a = let val path = conv path val args = convs args val env = convs env in (SysCall.simple (fn () => Prim.exece (path, args, env)) ; raise Fail "Posix.Process.exece") end fun exec (path, args): 'a = exece (path, args, PosixProcEnv.environ ()) fun execp (file, args): 'a = let val file = conv file val args = convs args in (SysCall.simple (fn () => Prim.execp (file, args)) ; raise Fail "Posix.Process.execp") end datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal fun fromStatus' (status : C_Status.t) = if Prim.ifExited status <> C_Int.zero then (case Prim.exitStatus status of 0 => W_EXITED | n => W_EXITSTATUS (Word8.castFromSysWord (C_Int.castToSysWord n))) else if Prim.ifSignaled status <> C_Int.zero then W_SIGNALED (PosixSignal.fromRep (Prim.termSig status)) else if Prim.ifStopped status <> C_Int.zero then W_STOPPED (PosixSignal.fromRep (Prim.stopSig status)) else raise Fail "Posix.Process.fromStatus" fun fromStatus status = fromStatus' (PreOS.Status.toRep status) structure W = struct structure Flags = BitFlags(structure S = C_Int) open W Flags (* val continued = CONTINUED *) val nohang = NOHANG val untraced = UNTRACED end local val status: C_Status.t ref = ref (C_Status.fromInt 0) fun wait (wa, status, flags) = let val pid = case wa of W_ANY_CHILD => C_PId.castFromFixedInt ~1 | W_CHILD pid => PId.toRep pid | W_SAME_GROUP => C_PId.castFromFixedInt 0 | W_GROUP pid => C_PId.~ (PId.toRep pid) val flags = W.flags flags in (PId.fromRep o SysCall.simpleResultRestart') ({errVal = C_PId.castFromFixedInt ~1}, fn () => let val pid = Prim.waitpid (pid, status, flags) in pid end) end fun getStatus () = fromStatus' (!status) in fun waitpid (wa, flags) = let val pid = wait (wa, status, flags) in (pid, getStatus ()) end fun waitpid_nh (wa, flags) = let val pid = wait (wa, status, W.nohang :: flags) in if PId.fromRep (C_PId.castFromFixedInt 0) = pid then NONE else SOME (pid, getStatus ()) end end fun wait () = waitpid (W_ANY_CHILD, []) fun exit (w: Word8.word): 'a = (* Posix.Process.exit does not call atExit cleaners, as per the basis * library spec. *) (Prim.exit (C_Status.castFromSysWord (Word8.castToSysWord w)) ; raise Fail "Posix.Process.exit") datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid fun kill (ka: killpid_arg, s: signal): unit = let val pid = case ka of K_PROC pid => PId.toRep pid | K_SAME_GROUP => C_PId.castFromFixedInt ~1 | K_GROUP pid => C_PId.~ (PId.toRep pid) val s = PosixSignal.toRep s in SysCall.simple (fn () => Prim.kill (pid, s)) end local fun wrap prim (t: Time.time): Time.time = Time.fromSeconds (C_UInt.toLargeInt (prim ((C_UInt.fromLargeInt (Time.toSeconds t)) handle Overflow => Error.raiseSys Error.inval))) in val alarm = wrap Prim.alarm (* val sleep = wrap Prim.sleep *) end fun sleep (t: Time.time): Time.time = let val t = Time.toNanoseconds t val sec = LargeInt.quot (t, 1000000000) val nsec = LargeInt.rem (t, 1000000000) val (sec, nsec) = (C_Time.fromLargeInt sec, C_Long.fromLargeInt nsec) handle Overflow => Error.raiseSys Error.inval val secRem = ref sec val nsecRem = ref nsec fun remaining _ = Time.+ (Time.fromSeconds (C_Time.toLargeInt (!secRem)), Time.fromNanoseconds (C_Long.toLargeInt (!nsecRem))) in SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {handlers = [(Error.intr, remaining)], post = remaining, return = Prim.nanosleep (secRem, nsecRem)}) end (* FIXME: pause *) fun pause () = SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.pause (), post = fn _ => (), handlers = [(Error.intr, fn () => ())]}) end mlton-20210117+dfsg/basis-library/posix/signal.sig000066400000000000000000000016451416264345000217220ustar00rootroot00000000000000signature POSIX_SIGNAL = sig eqtype signal val toWord: signal -> SysWord.word val fromWord: SysWord.word -> signal val abrt: signal val alrm: signal val bus: signal val fpe: signal val hup: signal val ill: signal val int: signal val kill: signal val pipe: signal val quit: signal val segv: signal val term: signal val usr1: signal val usr2: signal val chld: signal val cont: signal val stop: signal val tstp: signal val ttin: signal val ttou: signal end signature POSIX_SIGNAL_EXTRA = sig include POSIX_SIGNAL val prof: signal val vtalrm: signal val fromRep: C_Int.t -> signal val toRep: signal -> C_Int.t val repFromInt: int -> C_Int.t val repToInt: C_Int.t -> int val fromInt: int -> signal val toInt: signal -> int end mlton-20210117+dfsg/basis-library/posix/signal.sml000066400000000000000000000036031416264345000217270ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixSignal: POSIX_SIGNAL_EXTRA = struct open PrimitiveFFI.Posix.Signal structure Signal = PrePosix.Signal type signal = Signal.t val abrt = Signal.fromRep SIGABRT val alrm = Signal.fromRep SIGALRM val bus = Signal.fromRep SIGBUS val chld = Signal.fromRep SIGCHLD val cont = Signal.fromRep SIGCONT val fpe = Signal.fromRep SIGFPE val hup = Signal.fromRep SIGHUP val ill = Signal.fromRep SIGILL val int = Signal.fromRep SIGINT val kill = Signal.fromRep SIGKILL val pipe = Signal.fromRep SIGPIPE val poll = Signal.fromRep SIGPOLL val prof = Signal.fromRep SIGPROF val quit = Signal.fromRep SIGQUIT val segv = Signal.fromRep SIGSEGV val stop = Signal.fromRep SIGSTOP val sys = Signal.fromRep SIGSYS val term = Signal.fromRep SIGTERM val trap = Signal.fromRep SIGTRAP val tstp = Signal.fromRep SIGTSTP val ttin = Signal.fromRep SIGTTIN val ttou = Signal.fromRep SIGTTOU val urg = Signal.fromRep SIGURG val usr1 = Signal.fromRep SIGUSR1 val usr2 = Signal.fromRep SIGUSR2 val vtalrm = Signal.fromRep SIGVTALRM val xcpu = Signal.fromRep SIGXCPU val xfsz = Signal.fromRep SIGXFSZ val fromRep = Signal.fromRep val toRep = Signal.toRep val repToInt = C_Int.toInt val repFromInt = C_Int.fromInt val toInt = repToInt o toRep val fromInt = fromRep o repFromInt val repToWord = C_Int.castToSysWord val repFromWord = C_Int.castFromSysWord val toWord = repToWord o toRep val fromWord = fromRep o repFromWord end mlton-20210117+dfsg/basis-library/posix/stub-mingw.sml000066400000000000000000000116641416264345000225540ustar00rootroot00000000000000(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Stub out functions that are not implemented on MinGW. *) local structure Error = PosixError val stub: string * ('a -> 'b) -> ('a -> 'b) = fn (msg, f) => if let open Primitive.MLton.Platform.OS in MinGW = host end then fn _ => (if true then () else (PrimitiveFFI.Stdio.print msg ; PrimitiveFFI.Stdio.print "\n") ; Error.raiseSysWithMsg (Error.nosys, msg)) else f in structure PrimitiveFFI = struct open PrimitiveFFI structure OS = struct open OS structure IO = struct open IO val poll = stub ("poll", poll) end end structure Posix = struct open Posix structure FileSys = struct open FileSys val chown = stub ("chown", chown) val fchown = stub ("fchown", fchown) val fpathconf = stub ("fpathconf", fpathconf) val link = stub ("link", link) val mkfifo = stub ("mkfifo", mkfifo) val pathconf = stub ("pathconf", pathconf) val readlink = stub ("readlink", readlink) val symlink = stub ("symlink", symlink) end structure IO = struct open IO val fcntl2 = stub ("fcntl2", fcntl2) val fcntl3 = stub ("fcntl3", fcntl3) end structure ProcEnv = struct open ProcEnv val ctermid = stub ("ctermid", ctermid) val getegid = stub ("getegid", getegid) val geteuid = stub ("geteuid", geteuid) val getgid = stub ("getgid", getgid) val getgroups = stub ("getgroups", getgroups) val getlogin = stub ("getlogin", getlogin) val getpgrp = stub ("getpgrp", getpgrp) val getppid = stub ("getppid", getppid) val getuid = stub ("getuid", getuid) val setgid = stub ("setgid", setgid) val setgroups = stub ("stegroups", setgroups) val setpgid = stub ("setpgid", setpgid) val setsid = stub ("setsid", setsid) val setuid = stub ("setuid", setuid) val sysconf = stub ("sysconf", sysconf) val times = stub ("times", times) val ttyname = stub ("ttyname", ttyname) end structure Process = struct open Process val exece = stub ("exece", exece) val execp = stub ("execp", execp) val fork = stub ("fork", fork) val pause = stub ("pause", pause) val waitpid = fn (args as (pid, _, _)) => if C_PId.<= (pid, 0) then stub ("waitpid", waitpid) args else waitpid args end structure SysDB = struct open SysDB val getgrgid = stub ("getgrgid", getgrgid) val getgrnam = stub ("getgrnam", getgrnam) val getpwuid = stub ("getpwuid", getpwuid) end structure TTY = struct open TTY structure TC = struct open TC val drain = stub ("drain", drain) val flow = stub ("flow", flow) val flush = stub ("flush", flush) val getattr = stub ("getattr", getattr) val getpgrp = stub ("getpgrp", getpgrp) val sendbreak = stub ("sendbreak", sendbreak) val setattr = stub ("setattr", setattr) val setpgrp = stub ("setpgrp", setpgrp) end end end structure Socket = struct open Socket structure UnixSock = struct open UnixSock val toAddr = stub ("toAddr", toAddr) val fromAddr = stub ("fromAddr", fromAddr) end end end end mlton-20210117+dfsg/basis-library/posix/sys-db.sig000066400000000000000000000013011416264345000216330ustar00rootroot00000000000000signature POSIX_SYS_DB = sig eqtype uid eqtype gid structure Passwd: sig type passwd val name: passwd -> string val uid: passwd -> uid val gid: passwd -> gid val home: passwd -> string val shell: passwd -> string end structure Group: sig type group val name: group -> string val gid: group -> gid val members: group -> string list end val getgrgid: gid -> Group.group val getgrnam: string -> Group.group val getpwuid: uid -> Passwd.passwd val getpwnam: string -> Passwd.passwd end mlton-20210117+dfsg/basis-library/posix/sys-db.sml000066400000000000000000000074311416264345000216560ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixSysDB: POSIX_SYS_DB = struct structure Prim = PrimitiveFFI.Posix.SysDB structure GId = PrePosix.GId structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall type gid = GId.t type uid = UId.t structure Passwd = struct type passwd = {name: string, uid: uid, gid: gid, home: string, shell: string} structure Passwd = Prim.Passwd fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): passwd = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Int.zero}, fn () => {return = f (), post = fn _ => {name = CUtil.C_String.toString (Passwd.getName ()), uid = UId.fromRep (Passwd.getUId ()), gid = GId.fromRep (Passwd.getGId ()), home = CUtil.C_String.toString (Passwd.getDir ()), shell = CUtil.C_String.toString (Passwd.getShell ())}, handlers = [(Error.cleared, fn () => raise Error.SysErr (concat ["Posix.SysDB.", fname, ": no group with ", fitem], NONE))]}) val name: passwd -> string = #name val uid: passwd -> uid = #uid val gid: passwd -> gid = #gid val home: passwd -> string = #home val shell: passwd -> string = #shell end fun getpwnam name = let val name = NullString.nullTerm name in Passwd.fromC (fn () => Prim.getpwnam name, "getpwnam", "name") end fun getpwuid uid = let val uid = UId.toRep uid in Passwd.fromC (fn () => Prim.getpwuid uid, "getpwuid", "user id") end structure Group = struct type group = {name: string, gid: gid, members: string list} structure Group = Prim.Group fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): group = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Int.zero}, fn () => {return = f (), post = fn _ => {name = CUtil.C_String.toString (Group.getName ()), gid = GId.fromRep (Group.getGId ()), members = CUtil.C_StringArray.toList (Group.getMem ())}, handlers = [(Error.cleared, fn () => raise Error.SysErr (concat ["Posix.SysDB.", fname, ": no group with ", fitem], NONE))]}) val name: group -> string = #name val gid: group -> gid = #gid val members: group -> string list = #members end fun getgrnam name = let val name = NullString.nullTerm name in Group.fromC (fn () => Prim.getgrnam name, "getgrnam", "name") end fun getgrgid gid = let val gid = GId.toRep gid in Group.fromC (fn () => Prim.getgrgid gid, "getgrgid", "group id") end end mlton-20210117+dfsg/basis-library/posix/tty.sig000066400000000000000000000104001416264345000212520ustar00rootroot00000000000000signature POSIX_TTY = sig eqtype pid eqtype file_desc structure V: sig val eof: int val eol: int val erase: int val intr: int val kill: int val min: int val quit: int val susp: int val time: int val start: int val stop: int val nccs: int type cc val cc: (int * char) list -> cc val update: cc * (int * char) list -> cc val sub: cc * int -> char end structure I: sig include BIT_FLAGS val brkint: flags val icrnl: flags val ignbrk: flags val igncr: flags val ignpar: flags val inlcr: flags val inpck: flags val istrip: flags val ixoff: flags val ixon: flags val parmrk: flags end structure O: sig include BIT_FLAGS val opost: flags end structure C: sig include BIT_FLAGS val clocal: flags val cread: flags val cs5: flags val cs6: flags val cs7: flags val cs8: flags val csize: flags val cstopb: flags val hupcl: flags val parenb: flags val parodd: flags end structure L: sig include BIT_FLAGS val echo: flags val echoe: flags val echok: flags val echonl: flags val icanon: flags val iexten: flags val isig: flags val noflsh: flags val tostop: flags end eqtype speed val compareSpeed: speed * speed -> order val speedToWord: speed -> SysWord.word val wordToSpeed: SysWord.word -> speed val b0: speed val b50: speed val b75: speed val b110: speed val b134: speed val b150: speed val b200: speed val b300: speed val b600: speed val b1200: speed val b1800: speed val b2400: speed val b4800: speed val b9600: speed val b19200: speed val b38400: speed type termios val termios: {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} -> termios val fieldsOf: termios -> {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val getiflag: termios -> I.flags val getoflag: termios -> O.flags val getcflag: termios -> C.flags val getlflag: termios -> L.flags val getcc: termios -> V.cc structure CF: sig val getospeed: termios -> speed val setospeed: termios * speed -> termios val getispeed: termios -> speed val setispeed: termios * speed -> termios end structure TC: sig eqtype set_action val sanow: set_action val sadrain: set_action val saflush: set_action eqtype flow_action val ooff: flow_action val oon: flow_action val ioff: flow_action val ion: flow_action eqtype queue_sel val iflush: queue_sel val oflush: queue_sel val ioflush: queue_sel val getattr: file_desc -> termios val setattr: file_desc * set_action * termios -> unit val sendbreak: file_desc * int -> unit val drain: file_desc -> unit val flush: file_desc * queue_sel -> unit val flow: file_desc * flow_action -> unit val getpgrp: file_desc -> pid val setpgrp: file_desc * pid -> unit end end mlton-20210117+dfsg/basis-library/posix/tty.sml000066400000000000000000000206611416264345000212750ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PosixTTY: POSIX_TTY = struct structure Prim = PrimitiveFFI.Posix.TTY open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Error = PosixError structure SysCall = Error.SysCall type file_desc = FileDesc.t type pid = PId.t structure V = struct open V val nccs = C_Int.toInt NCCS val eof = C_Int.toInt VEOF val eol = C_Int.toInt VEOL val erase = C_Int.toInt VERASE val intr = C_Int.toInt VINTR val kill = C_Int.toInt VKILL val min = C_Int.toInt VMIN val quit = C_Int.toInt VQUIT val susp = C_Int.toInt VSUSP val time = C_Int.toInt VTIME val start = C_Int.toInt VSTART val stop = C_Int.toInt VSTOP type cc = C_CC.t array val default = C_CC.castFromSysWord 0w0 fun new () = Array.array (nccs, default) fun updates (a, l) = List.app (fn (i, cc) => Array.update (a, i, (C_CC.castFromSysWord o Word8.castToSysWord o Byte.charToByte) cc)) l fun cc l = let val a = new () in updates (a, l) ; a end fun update (a, l) = let val a' = new () in Array.copy {src = a, dst = a', di = 0} ; updates (a', l) ; a' end val sub = (Byte.byteToChar o Word8.castFromSysWord o C_CC.castToSysWord) o Array.sub end structure Flags = BitFlags(structure S = C_TCFlag) structure I = struct open I Flags val brkint = BRKINT val icrnl = ICRNL val ignbrk = IGNBRK val igncr = IGNCR val ignpar = IGNPAR val inlcr = INLCR val inpck = INPCK val istrip = ISTRIP val ixany = IXANY val ixoff = IXOFF val ixon = IXON val parmrk = PARMRK end structure O = struct open O Flags val bs0 = BS0 val bs1 = BS1 val bsdly = BSDLY val cr0 = CR0 val cr1 = CR1 val cr2 = CR2 val cr3 = CR3 val crdly = CRDLY val ff0 = FF0 val ff1 = FF1 val ffdly = FFDLY val nl0 = NL0 val nl1 = NL1 val onldly = NLDLY val ocrnl = OCRNL val ofill = OFILL val onlcr = ONLCR val onlret = ONLRET val onocr = ONOCR val opost = OPOST val tab0 = TAB0 val tab1 = TAB1 val tab2 = TAB2 val tab3 = TAB3 val tabdly = TABDLY val vt0 = VT0 val vt1 = VT1 val vtdly = VTDLY end structure C = struct open C Flags val clocal = CLOCAL val cread = CREAD val cs5 = CS5 val cs6 = CS6 val cs7 = CS7 val cs8 = CS8 val csize = CSIZE val cstopb = CSTOPB val hupcl = HUPCL val parenb = PARENB val parodd = PARODD end structure L = struct open L Flags val echo = ECHO val echoe = ECHOE val echok = ECHOK val echonl = ECHONL val icanon = ICANON val iexten = IEXTEN val isig = ISIG val noflsh = NOFLSH val tostop = TOSTOP end type speed = C_Speed.t val b0 = B0 val b110 = B110 val b1200 = B1200 val b134 = B134 val b150 = B150 val b1800 = B1800 val b19200 = B19200 val b200 = B200 val b2400 = B2400 val b300 = B300 val b38400 = B38400 val b4800 = B4800 val b50 = B50 val b600 = B600 val b75 = B75 val b9600 = B9600 val compareSpeed = C_Speed.compare val speedToWord = C_Speed.castToSysWord val wordToSpeed = C_Speed.castFromSysWord type termios = {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val id = fn x => x val termios = id val fieldsOf = id val getiflag: termios -> I.flags = #iflag val getoflag: termios -> O.flags = #oflag val getcflag: termios -> C.flags = #cflag val getlflag: termios -> L.flags = #oflag val getcc: termios -> V.cc = #cc structure CF = struct val getospeed: termios -> speed = #ospeed fun setospeed ({iflag, oflag, cflag, lflag, cc, ispeed, ...}: termios, ospeed: speed): termios = {iflag = iflag, oflag = oflag, cflag = cflag, lflag = lflag, cc = cc, ispeed = ispeed, ospeed = ospeed} val getispeed: termios -> speed = #ispeed fun setispeed ({iflag, oflag, cflag, lflag, cc, ospeed, ...}: termios, ispeed: speed): termios = {iflag = iflag, oflag = oflag, cflag = cflag, lflag = lflag, cc = cc, ispeed = ispeed, ospeed = ospeed} end structure Termios = Prim.Termios structure TC = struct open Prim.TC type set_action = C_Int.t val sadrain = TCSADRAIN val saflush = TCSAFLUSH val sanow = TCSANOW type flow_action = C_Int.t val ioff = TCIOFF val ion = TCION val ooff = TCOOFF val oon = TCOON type queue_sel = C_Int.t val iflush = TCIFLUSH val oflush = TCOFLUSH val ioflush = TCIOFLUSH fun getattr fd = SysCall.syscallRestart (fn () => (Prim.TC.getattr (FileDesc.toRep fd), fn _ => {iflag = Termios.getIFlag (), oflag = Termios.getOFlag (), cflag = Termios.getCFlag (), lflag = Termios.getLFlag (), cc = let val a = V.new () in Termios.getCC (a); a end, ispeed = Termios.cfGetISpeed (), ospeed = Termios.cfGetOSpeed ()})) fun setattr (fd, a, {iflag, oflag, cflag, lflag, cc, ispeed, ospeed}) = SysCall.syscallRestart (fn () => (Termios.setIFlag iflag ; Termios.setOFlag oflag ; Termios.setCFlag cflag ; Termios.setLFlag lflag ; SysCall.simple (fn () => Termios.cfSetOSpeed ospeed) ; SysCall.simple (fn () => Termios.cfSetISpeed ispeed) ; Termios.setCC cc ; (Prim.TC.setattr (FileDesc.toRep fd, a), fn _ => ()))) fun sendbreak (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.sendbreak (FileDesc.toRep fd, C_Int.fromInt n)) fun drain fd = SysCall.simpleRestart (fn () => Prim.TC.drain (FileDesc.toRep fd)) fun flush (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.flush (FileDesc.toRep fd, n)) fun flow (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.flow (FileDesc.toRep fd, n)) fun getpgrp fd = (PId.fromRep o SysCall.simpleResultRestart') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.TC.getpgrp (FileDesc.toRep fd)) fun setpgrp (fd, pid) = SysCall.simpleRestart (fn () => Prim.TC.setpgrp (FileDesc.toRep fd, PId.toRep pid)) end end mlton-20210117+dfsg/basis-library/primitive/000077500000000000000000000000001416264345000206015ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/primitive/basis-ffi.sml000066400000000000000000002506041416264345000231700ustar00rootroot00000000000000(* This file is automatically generated. Do not edit. *) local open Primitive in structure PrimitiveFFI = struct structure CommandLine = struct val (argcGet, argcSet) = _symbol "CommandLine_argc" private : (unit -> (C_Int.t)) * ((C_Int.t) -> unit); val (argvGet, argvSet) = _symbol "CommandLine_argv" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val (commandNameGet, commandNameSet) = _symbol "CommandLine_commandName" private : (unit -> (C_String.t)) * ((C_String.t) -> unit); end structure Cygwin = struct val toFullWindowsPath = _import "Cygwin_toFullWindowsPath" private : NullString8.t -> C_String.t; end structure Date = struct val gmTime = _import "Date_gmTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val localOffset = _import "Date_localOffset" private : unit -> C_Double.t; val localTime = _import "Date_localTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val mkTime = _import "Date_mkTime" private : unit -> (C_Time.t) C_Errno.t; val strfTime = _import "Date_strfTime" private : (Char8.t) array * C_Size.t * NullString8.t -> C_Size.t; structure Tm = struct val getHour = _import "Date_Tm_getHour" private : unit -> C_Int.t; val getIsDst = _import "Date_Tm_getIsDst" private : unit -> C_Int.t; val getMDay = _import "Date_Tm_getMDay" private : unit -> C_Int.t; val getMin = _import "Date_Tm_getMin" private : unit -> C_Int.t; val getMon = _import "Date_Tm_getMon" private : unit -> C_Int.t; val getSec = _import "Date_Tm_getSec" private : unit -> C_Int.t; val getWDay = _import "Date_Tm_getWDay" private : unit -> C_Int.t; val getYDay = _import "Date_Tm_getYDay" private : unit -> C_Int.t; val getYear = _import "Date_Tm_getYear" private : unit -> C_Int.t; val setHour = _import "Date_Tm_setHour" private : C_Int.t -> unit; val setIsDst = _import "Date_Tm_setIsDst" private : C_Int.t -> unit; val setMDay = _import "Date_Tm_setMDay" private : C_Int.t -> unit; val setMin = _import "Date_Tm_setMin" private : C_Int.t -> unit; val setMon = _import "Date_Tm_setMon" private : C_Int.t -> unit; val setSec = _import "Date_Tm_setSec" private : C_Int.t -> unit; val setWDay = _import "Date_Tm_setWDay" private : C_Int.t -> unit; val setYDay = _import "Date_Tm_setYDay" private : C_Int.t -> unit; val setYear = _import "Date_Tm_setYear" private : C_Int.t -> unit; end end structure IEEEReal = struct val getRoundingMode = _import "IEEEReal_getRoundingMode" private : unit -> C_Int.t; structure RoundingMode = struct val FE_DOWNWARD = _const "IEEEReal_RoundingMode_FE_DOWNWARD" : C_Int.t; val FE_NOSUPPORT = _const "IEEEReal_RoundingMode_FE_NOSUPPORT" : C_Int.t; val FE_TONEAREST = _const "IEEEReal_RoundingMode_FE_TONEAREST" : C_Int.t; val FE_TOWARDZERO = _const "IEEEReal_RoundingMode_FE_TOWARDZERO" : C_Int.t; val FE_UPWARD = _const "IEEEReal_RoundingMode_FE_UPWARD" : C_Int.t; end val setRoundingMode = _import "IEEEReal_setRoundingMode" private : C_Int.t -> C_Int.t; end structure MinGW = struct val clearNonBlock = _import "MinGW_clearNonBlock" private : C_Fd.t -> unit; val getTempPath = _import "MinGW_getTempPath" private : C_Size.t * (Char8.t) array -> C_Size.t; val setNonBlock = _import "MinGW_setNonBlock" private : C_Fd.t -> unit; end structure MLton = struct val bug = _import "MLton_bug" private : String8.t -> unit; structure Itimer = struct val PROF = _const "MLton_Itimer_PROF" : C_Int.t; val REAL = _const "MLton_Itimer_REAL" : C_Int.t; val set = _import "MLton_Itimer_set" private : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> (C_Int.t) C_Errno.t; val VIRTUAL = _const "MLton_Itimer_VIRTUAL" : C_Int.t; end structure Process = struct val spawne = _import "MLton_Process_spawne" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_PId.t) C_Errno.t; val spawnp = _import "MLton_Process_spawnp" private : NullString8.t * (NullString8.t) array -> (C_PId.t) C_Errno.t; end structure Rlimit = struct val AS = _const "MLton_Rlimit_AS" : C_Int.t; val CORE = _const "MLton_Rlimit_CORE" : C_Int.t; val CPU = _const "MLton_Rlimit_CPU" : C_Int.t; val DATA = _const "MLton_Rlimit_DATA" : C_Int.t; val FSIZE = _const "MLton_Rlimit_FSIZE" : C_Int.t; val get = _import "MLton_Rlimit_get" private : C_Int.t -> (C_Int.t) C_Errno.t; val getHard = _import "MLton_Rlimit_getHard" private : unit -> C_RLim.t; val getSoft = _import "MLton_Rlimit_getSoft" private : unit -> C_RLim.t; val INFINITY = _const "MLton_Rlimit_INFINITY" : C_RLim.t; val MEMLOCK = _const "MLton_Rlimit_MEMLOCK" : C_Int.t; val NOFILE = _const "MLton_Rlimit_NOFILE" : C_Int.t; val NPROC = _const "MLton_Rlimit_NPROC" : C_Int.t; val RSS = _const "MLton_Rlimit_RSS" : C_Int.t; val set = _import "MLton_Rlimit_set" private : C_Int.t * C_RLim.t * C_RLim.t -> (C_Int.t) C_Errno.t; val STACK = _const "MLton_Rlimit_STACK" : C_Int.t; end structure Rusage = struct val children_stime_sec = _import "MLton_Rusage_children_stime_sec" private : unit -> C_Time.t; val children_stime_usec = _import "MLton_Rusage_children_stime_usec" private : unit -> C_SUSeconds.t; val children_utime_sec = _import "MLton_Rusage_children_utime_sec" private : unit -> C_Time.t; val children_utime_usec = _import "MLton_Rusage_children_utime_usec" private : unit -> C_SUSeconds.t; val gc_stime_sec = _import "MLton_Rusage_gc_stime_sec" private : unit -> C_Time.t; val gc_stime_usec = _import "MLton_Rusage_gc_stime_usec" private : unit -> C_SUSeconds.t; val gc_utime_sec = _import "MLton_Rusage_gc_utime_sec" private : unit -> C_Time.t; val gc_utime_usec = _import "MLton_Rusage_gc_utime_usec" private : unit -> C_SUSeconds.t; val getrusage = _import "MLton_Rusage_getrusage" private : GCState.t -> unit; val self_stime_sec = _import "MLton_Rusage_self_stime_sec" private : unit -> C_Time.t; val self_stime_usec = _import "MLton_Rusage_self_stime_usec" private : unit -> C_SUSeconds.t; val self_utime_sec = _import "MLton_Rusage_self_utime_sec" private : unit -> C_Time.t; val self_utime_usec = _import "MLton_Rusage_self_utime_usec" private : unit -> C_SUSeconds.t; end structure Syslog = struct val closelog = _import "MLton_Syslog_closelog" private : unit -> unit; structure Facility = struct val LOG_AUTH = _const "MLton_Syslog_Facility_LOG_AUTH" : C_Int.t; val LOG_CRON = _const "MLton_Syslog_Facility_LOG_CRON" : C_Int.t; val LOG_DAEMON = _const "MLton_Syslog_Facility_LOG_DAEMON" : C_Int.t; val LOG_KERN = _const "MLton_Syslog_Facility_LOG_KERN" : C_Int.t; val LOG_LOCAL0 = _const "MLton_Syslog_Facility_LOG_LOCAL0" : C_Int.t; val LOG_LOCAL1 = _const "MLton_Syslog_Facility_LOG_LOCAL1" : C_Int.t; val LOG_LOCAL2 = _const "MLton_Syslog_Facility_LOG_LOCAL2" : C_Int.t; val LOG_LOCAL3 = _const "MLton_Syslog_Facility_LOG_LOCAL3" : C_Int.t; val LOG_LOCAL4 = _const "MLton_Syslog_Facility_LOG_LOCAL4" : C_Int.t; val LOG_LOCAL5 = _const "MLton_Syslog_Facility_LOG_LOCAL5" : C_Int.t; val LOG_LOCAL6 = _const "MLton_Syslog_Facility_LOG_LOCAL6" : C_Int.t; val LOG_LOCAL7 = _const "MLton_Syslog_Facility_LOG_LOCAL7" : C_Int.t; val LOG_LPR = _const "MLton_Syslog_Facility_LOG_LPR" : C_Int.t; val LOG_MAIL = _const "MLton_Syslog_Facility_LOG_MAIL" : C_Int.t; val LOG_NEWS = _const "MLton_Syslog_Facility_LOG_NEWS" : C_Int.t; val LOG_SYSLOG = _const "MLton_Syslog_Facility_LOG_SYSLOG" : C_Int.t; val LOG_USER = _const "MLton_Syslog_Facility_LOG_USER" : C_Int.t; val LOG_UUCP = _const "MLton_Syslog_Facility_LOG_UUCP" : C_Int.t; end structure Logopt = struct val LOG_CONS = _const "MLton_Syslog_Logopt_LOG_CONS" : C_Int.t; val LOG_NDELAY = _const "MLton_Syslog_Logopt_LOG_NDELAY" : C_Int.t; val LOG_NOWAIT = _const "MLton_Syslog_Logopt_LOG_NOWAIT" : C_Int.t; val LOG_ODELAY = _const "MLton_Syslog_Logopt_LOG_ODELAY" : C_Int.t; val LOG_PERROR = _const "MLton_Syslog_Logopt_LOG_PERROR" : C_Int.t; val LOG_PID = _const "MLton_Syslog_Logopt_LOG_PID" : C_Int.t; end val openlog = _import "MLton_Syslog_openlog" private : NullString8.t * C_Int.t * C_Int.t -> unit; structure Severity = struct val LOG_ALERT = _const "MLton_Syslog_Severity_LOG_ALERT" : C_Int.t; val LOG_CRIT = _const "MLton_Syslog_Severity_LOG_CRIT" : C_Int.t; val LOG_DEBUG = _const "MLton_Syslog_Severity_LOG_DEBUG" : C_Int.t; val LOG_EMERG = _const "MLton_Syslog_Severity_LOG_EMERG" : C_Int.t; val LOG_ERR = _const "MLton_Syslog_Severity_LOG_ERR" : C_Int.t; val LOG_INFO = _const "MLton_Syslog_Severity_LOG_INFO" : C_Int.t; val LOG_NOTICE = _const "MLton_Syslog_Severity_LOG_NOTICE" : C_Int.t; val LOG_WARNING = _const "MLton_Syslog_Severity_LOG_WARNING" : C_Int.t; end val syslog = _import "MLton_Syslog_syslog" private : C_Int.t * NullString8.t -> unit; end end structure Net = struct val htonl = _import "Net_htonl" private : Word32.t -> Word32.t; val htons = _import "Net_htons" private : Word16.t -> Word16.t; val ntohl = _import "Net_ntohl" private : Word32.t -> Word32.t; val ntohs = _import "Net_ntohs" private : Word16.t -> Word16.t; end structure NetHostDB = struct val getByAddress = _import "NetHostDB_getByAddress" private : (Word8.t) vector * C_Socklen.t -> C_Int.t; val getByName = _import "NetHostDB_getByName" private : NullString8.t -> C_Int.t; val getEntryAddrsN = _import "NetHostDB_getEntryAddrsN" private : C_Int.t * (Word8.t) array -> unit; val getEntryAddrsNum = _import "NetHostDB_getEntryAddrsNum" private : unit -> C_Int.t; val getEntryAddrType = _import "NetHostDB_getEntryAddrType" private : unit -> C_Int.t; val getEntryAliasesN = _import "NetHostDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetHostDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryLength = _import "NetHostDB_getEntryLength" private : unit -> C_Int.t; val getEntryName = _import "NetHostDB_getEntryName" private : unit -> C_String.t; val getHostName = _import "NetHostDB_getHostName" private : (Char8.t) array * C_Size.t -> (C_Int.t) C_Errno.t; val INADDR_ANY = _const "NetHostDB_INADDR_ANY" : C_Int.t; val inAddrSize = _const "NetHostDB_inAddrSize" : C_Size.t; end structure NetProtDB = struct val getByName = _import "NetProtDB_getByName" private : NullString8.t -> C_Int.t; val getByNumber = _import "NetProtDB_getByNumber" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetProtDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetProtDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetProtDB_getEntryName" private : unit -> C_String.t; val getEntryProto = _import "NetProtDB_getEntryProto" private : unit -> C_Int.t; end structure NetServDB = struct val getByName = _import "NetServDB_getByName" private : NullString8.t * NullString8.t -> C_Int.t; val getByNameNull = _import "NetServDB_getByNameNull" private : NullString8.t -> C_Int.t; val getByPort = _import "NetServDB_getByPort" private : C_Int.t * NullString8.t -> C_Int.t; val getByPortNull = _import "NetServDB_getByPortNull" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetServDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetServDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetServDB_getEntryName" private : unit -> C_String.t; val getEntryPort = _import "NetServDB_getEntryPort" private : unit -> C_Int.t; val getEntryProto = _import "NetServDB_getEntryProto" private : unit -> C_String.t; end structure OS = struct structure IO = struct val poll = _import "OS_IO_poll" private : (C_Fd.t) vector * (C_Short.t) vector * C_NFds.t * C_Int.t * (C_Short.t) array -> (C_Int.t) C_Errno.t; val POLLIN = _const "OS_IO_POLLIN" : C_Short.t; val POLLOUT = _const "OS_IO_POLLOUT" : C_Short.t; val POLLPRI = _const "OS_IO_POLLPRI" : C_Short.t; end end structure Posix = struct structure Error = struct val clearErrno = _import "Posix_Error_clearErrno" private : unit -> unit; val E2BIG = _const "Posix_Error_E2BIG" : C_Int.t; val EACCES = _const "Posix_Error_EACCES" : C_Int.t; val EADDRINUSE = _const "Posix_Error_EADDRINUSE" : C_Int.t; val EADDRNOTAVAIL = _const "Posix_Error_EADDRNOTAVAIL" : C_Int.t; val EAFNOSUPPORT = _const "Posix_Error_EAFNOSUPPORT" : C_Int.t; val EAGAIN = _const "Posix_Error_EAGAIN" : C_Int.t; val EALREADY = _const "Posix_Error_EALREADY" : C_Int.t; val EBADF = _const "Posix_Error_EBADF" : C_Int.t; val EBADMSG = _const "Posix_Error_EBADMSG" : C_Int.t; val EBUSY = _const "Posix_Error_EBUSY" : C_Int.t; val ECANCELED = _const "Posix_Error_ECANCELED" : C_Int.t; val ECHILD = _const "Posix_Error_ECHILD" : C_Int.t; val ECONNABORTED = _const "Posix_Error_ECONNABORTED" : C_Int.t; val ECONNREFUSED = _const "Posix_Error_ECONNREFUSED" : C_Int.t; val ECONNRESET = _const "Posix_Error_ECONNRESET" : C_Int.t; val EDEADLK = _const "Posix_Error_EDEADLK" : C_Int.t; val EDESTADDRREQ = _const "Posix_Error_EDESTADDRREQ" : C_Int.t; val EDOM = _const "Posix_Error_EDOM" : C_Int.t; val EDQUOT = _const "Posix_Error_EDQUOT" : C_Int.t; val EEXIST = _const "Posix_Error_EEXIST" : C_Int.t; val EFAULT = _const "Posix_Error_EFAULT" : C_Int.t; val EFBIG = _const "Posix_Error_EFBIG" : C_Int.t; val EHOSTUNREACH = _const "Posix_Error_EHOSTUNREACH" : C_Int.t; val EIDRM = _const "Posix_Error_EIDRM" : C_Int.t; val EILSEQ = _const "Posix_Error_EILSEQ" : C_Int.t; val EINPROGRESS = _const "Posix_Error_EINPROGRESS" : C_Int.t; val EINTR = _const "Posix_Error_EINTR" : C_Int.t; val EINVAL = _const "Posix_Error_EINVAL" : C_Int.t; val EIO = _const "Posix_Error_EIO" : C_Int.t; val EISCONN = _const "Posix_Error_EISCONN" : C_Int.t; val EISDIR = _const "Posix_Error_EISDIR" : C_Int.t; val ELOOP = _const "Posix_Error_ELOOP" : C_Int.t; val EMFILE = _const "Posix_Error_EMFILE" : C_Int.t; val EMLINK = _const "Posix_Error_EMLINK" : C_Int.t; val EMSGSIZE = _const "Posix_Error_EMSGSIZE" : C_Int.t; val EMULTIHOP = _const "Posix_Error_EMULTIHOP" : C_Int.t; val ENAMETOOLONG = _const "Posix_Error_ENAMETOOLONG" : C_Int.t; val ENETDOWN = _const "Posix_Error_ENETDOWN" : C_Int.t; val ENETRESET = _const "Posix_Error_ENETRESET" : C_Int.t; val ENETUNREACH = _const "Posix_Error_ENETUNREACH" : C_Int.t; val ENFILE = _const "Posix_Error_ENFILE" : C_Int.t; val ENOBUFS = _const "Posix_Error_ENOBUFS" : C_Int.t; val ENODATA = _const "Posix_Error_ENODATA" : C_Int.t; val ENODEV = _const "Posix_Error_ENODEV" : C_Int.t; val ENOENT = _const "Posix_Error_ENOENT" : C_Int.t; val ENOEXEC = _const "Posix_Error_ENOEXEC" : C_Int.t; val ENOLCK = _const "Posix_Error_ENOLCK" : C_Int.t; val ENOLINK = _const "Posix_Error_ENOLINK" : C_Int.t; val ENOMEM = _const "Posix_Error_ENOMEM" : C_Int.t; val ENOMSG = _const "Posix_Error_ENOMSG" : C_Int.t; val ENOPROTOOPT = _const "Posix_Error_ENOPROTOOPT" : C_Int.t; val ENOSPC = _const "Posix_Error_ENOSPC" : C_Int.t; val ENOSR = _const "Posix_Error_ENOSR" : C_Int.t; val ENOSTR = _const "Posix_Error_ENOSTR" : C_Int.t; val ENOSYS = _const "Posix_Error_ENOSYS" : C_Int.t; val ENOTCONN = _const "Posix_Error_ENOTCONN" : C_Int.t; val ENOTDIR = _const "Posix_Error_ENOTDIR" : C_Int.t; val ENOTEMPTY = _const "Posix_Error_ENOTEMPTY" : C_Int.t; val ENOTSOCK = _const "Posix_Error_ENOTSOCK" : C_Int.t; val ENOTSUP = _const "Posix_Error_ENOTSUP" : C_Int.t; val ENOTTY = _const "Posix_Error_ENOTTY" : C_Int.t; val ENXIO = _const "Posix_Error_ENXIO" : C_Int.t; val EOPNOTSUPP = _const "Posix_Error_EOPNOTSUPP" : C_Int.t; val EOVERFLOW = _const "Posix_Error_EOVERFLOW" : C_Int.t; val EPERM = _const "Posix_Error_EPERM" : C_Int.t; val EPIPE = _const "Posix_Error_EPIPE" : C_Int.t; val EPROTO = _const "Posix_Error_EPROTO" : C_Int.t; val EPROTONOSUPPORT = _const "Posix_Error_EPROTONOSUPPORT" : C_Int.t; val EPROTOTYPE = _const "Posix_Error_EPROTOTYPE" : C_Int.t; val ERANGE = _const "Posix_Error_ERANGE" : C_Int.t; val EROFS = _const "Posix_Error_EROFS" : C_Int.t; val ESPIPE = _const "Posix_Error_ESPIPE" : C_Int.t; val ESRCH = _const "Posix_Error_ESRCH" : C_Int.t; val ESTALE = _const "Posix_Error_ESTALE" : C_Int.t; val ETIME = _const "Posix_Error_ETIME" : C_Int.t; val ETIMEDOUT = _const "Posix_Error_ETIMEDOUT" : C_Int.t; val ETXTBSY = _const "Posix_Error_ETXTBSY" : C_Int.t; val EWOULDBLOCK = _const "Posix_Error_EWOULDBLOCK" : C_Int.t; val EXDEV = _const "Posix_Error_EXDEV" : C_Int.t; val getErrno = _import "Posix_Error_getErrno" private : unit -> C_Int.t; val strError = _import "Posix_Error_strError" private : C_Int.t -> C_String.t; end structure FileSys = struct structure A = struct val F_OK = _const "Posix_FileSys_A_F_OK" : C_Int.t; val R_OK = _const "Posix_FileSys_A_R_OK" : C_Int.t; val W_OK = _const "Posix_FileSys_A_W_OK" : C_Int.t; val X_OK = _const "Posix_FileSys_A_X_OK" : C_Int.t; end val access = _import "Posix_FileSys_access" private : NullString8.t * C_Int.t -> (C_Int.t) C_Errno.t; val chdir = _import "Posix_FileSys_chdir" private : NullString8.t -> (C_Int.t) C_Errno.t; val chmod = _import "Posix_FileSys_chmod" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val chown = _import "Posix_FileSys_chown" private : NullString8.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; structure Dirstream = struct val closeDir = _import "Posix_FileSys_Dirstream_closeDir" private : C_DirP.t -> (C_Int.t) C_Errno.t; val openDir = _import "Posix_FileSys_Dirstream_openDir" private : NullString8.t -> (C_DirP.t) C_Errno.t; val readDir = _import "Posix_FileSys_Dirstream_readDir" private : C_DirP.t -> (C_String.t) C_Errno.t; val rewindDir = _import "Posix_FileSys_Dirstream_rewindDir" private : C_DirP.t -> unit; end val fchdir = _import "Posix_FileSys_fchdir" private : C_Fd.t -> (C_Int.t) C_Errno.t; val fchmod = _import "Posix_FileSys_fchmod" private : C_Fd.t * C_Mode.t -> (C_Int.t) C_Errno.t; val fchown = _import "Posix_FileSys_fchown" private : C_Fd.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; val fpathconf = _import "Posix_FileSys_fpathconf" private : C_Fd.t * C_Int.t -> (C_Long.t) C_Errno.t; val ftruncate = _import "Posix_FileSys_ftruncate" private : C_Fd.t * C_Off.t -> (C_Int.t) C_Errno.t; val getcwd = _import "Posix_FileSys_getcwd" private : (Char8.t) array * C_Size.t -> (C_String.t) C_Errno.t; val link = _import "Posix_FileSys_link" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val mkdir = _import "Posix_FileSys_mkdir" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val mkfifo = _import "Posix_FileSys_mkfifo" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; structure O = struct val APPEND = _const "Posix_FileSys_O_APPEND" : C_Int.t; val BINARY = _const "Posix_FileSys_O_BINARY" : C_Int.t; val CREAT = _const "Posix_FileSys_O_CREAT" : C_Int.t; val DSYNC = _const "Posix_FileSys_O_DSYNC" : C_Int.t; val EXCL = _const "Posix_FileSys_O_EXCL" : C_Int.t; val NOCTTY = _const "Posix_FileSys_O_NOCTTY" : C_Int.t; val NONBLOCK = _const "Posix_FileSys_O_NONBLOCK" : C_Int.t; val RDONLY = _const "Posix_FileSys_O_RDONLY" : C_Int.t; val RDWR = _const "Posix_FileSys_O_RDWR" : C_Int.t; val RSYNC = _const "Posix_FileSys_O_RSYNC" : C_Int.t; val SYNC = _const "Posix_FileSys_O_SYNC" : C_Int.t; val TEXT = _const "Posix_FileSys_O_TEXT" : C_Int.t; val TRUNC = _const "Posix_FileSys_O_TRUNC" : C_Int.t; val WRONLY = _const "Posix_FileSys_O_WRONLY" : C_Int.t; end val open2 = _import "Posix_FileSys_open2" private : NullString8.t * C_Int.t -> (C_Fd.t) C_Errno.t; val open3 = _import "Posix_FileSys_open3" private : NullString8.t * C_Int.t * C_Mode.t -> (C_Fd.t) C_Errno.t; val pathconf = _import "Posix_FileSys_pathconf" private : NullString8.t * C_Int.t -> (C_Long.t) C_Errno.t; structure PC = struct val ALLOC_SIZE_MIN = _const "Posix_FileSys_PC_ALLOC_SIZE_MIN" : C_Int.t; val ASYNC_IO = _const "Posix_FileSys_PC_ASYNC_IO" : C_Int.t; val CHOWN_RESTRICTED = _const "Posix_FileSys_PC_CHOWN_RESTRICTED" : C_Int.t; val FILESIZEBITS = _const "Posix_FileSys_PC_FILESIZEBITS" : C_Int.t; val LINK_MAX = _const "Posix_FileSys_PC_LINK_MAX" : C_Int.t; val MAX_CANON = _const "Posix_FileSys_PC_MAX_CANON" : C_Int.t; val MAX_INPUT = _const "Posix_FileSys_PC_MAX_INPUT" : C_Int.t; val NAME_MAX = _const "Posix_FileSys_PC_NAME_MAX" : C_Int.t; val NO_TRUNC = _const "Posix_FileSys_PC_NO_TRUNC" : C_Int.t; val PATH_MAX = _const "Posix_FileSys_PC_PATH_MAX" : C_Int.t; val PIPE_BUF = _const "Posix_FileSys_PC_PIPE_BUF" : C_Int.t; val PRIO_IO = _const "Posix_FileSys_PC_PRIO_IO" : C_Int.t; val REC_INCR_XFER_SIZE = _const "Posix_FileSys_PC_REC_INCR_XFER_SIZE" : C_Int.t; val REC_MAX_XFER_SIZE = _const "Posix_FileSys_PC_REC_MAX_XFER_SIZE" : C_Int.t; val REC_MIN_XFER_SIZE = _const "Posix_FileSys_PC_REC_MIN_XFER_SIZE" : C_Int.t; val REC_XFER_ALIGN = _const "Posix_FileSys_PC_REC_XFER_ALIGN" : C_Int.t; val SYMLINK_MAX = _const "Posix_FileSys_PC_SYMLINK_MAX" : C_Int.t; val SYNC_IO = _const "Posix_FileSys_PC_SYNC_IO" : C_Int.t; val TWO_SYMLINKS = _const "Posix_FileSys_PC_TWO_SYMLINKS" : C_Int.t; val VDISABLE = _const "Posix_FileSys_PC_VDISABLE" : C_Int.t; end val readlink = _import "Posix_FileSys_readlink" private : NullString8.t * (Char8.t) array * C_Size.t -> (C_SSize.t) C_Errno.t; val rename = _import "Posix_FileSys_rename" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val rmdir = _import "Posix_FileSys_rmdir" private : NullString8.t -> (C_Int.t) C_Errno.t; structure S = struct val IFBLK = _const "Posix_FileSys_S_IFBLK" : C_Mode.t; val IFCHR = _const "Posix_FileSys_S_IFCHR" : C_Mode.t; val IFDIR = _const "Posix_FileSys_S_IFDIR" : C_Mode.t; val IFIFO = _const "Posix_FileSys_S_IFIFO" : C_Mode.t; val IFLNK = _const "Posix_FileSys_S_IFLNK" : C_Mode.t; val IFMT = _const "Posix_FileSys_S_IFMT" : C_Mode.t; val IFREG = _const "Posix_FileSys_S_IFREG" : C_Mode.t; val IFSOCK = _const "Posix_FileSys_S_IFSOCK" : C_Mode.t; val IRGRP = _const "Posix_FileSys_S_IRGRP" : C_Mode.t; val IROTH = _const "Posix_FileSys_S_IROTH" : C_Mode.t; val IRUSR = _const "Posix_FileSys_S_IRUSR" : C_Mode.t; val IRWXG = _const "Posix_FileSys_S_IRWXG" : C_Mode.t; val IRWXO = _const "Posix_FileSys_S_IRWXO" : C_Mode.t; val IRWXU = _const "Posix_FileSys_S_IRWXU" : C_Mode.t; val ISGID = _const "Posix_FileSys_S_ISGID" : C_Mode.t; val ISUID = _const "Posix_FileSys_S_ISUID" : C_Mode.t; val ISVTX = _const "Posix_FileSys_S_ISVTX" : C_Mode.t; val IWGRP = _const "Posix_FileSys_S_IWGRP" : C_Mode.t; val IWOTH = _const "Posix_FileSys_S_IWOTH" : C_Mode.t; val IWUSR = _const "Posix_FileSys_S_IWUSR" : C_Mode.t; val IXGRP = _const "Posix_FileSys_S_IXGRP" : C_Mode.t; val IXOTH = _const "Posix_FileSys_S_IXOTH" : C_Mode.t; val IXUSR = _const "Posix_FileSys_S_IXUSR" : C_Mode.t; end structure ST = struct val isBlk = _import "Posix_FileSys_ST_isBlk" private : C_Mode.t -> C_Int.t; val isChr = _import "Posix_FileSys_ST_isChr" private : C_Mode.t -> C_Int.t; val isDir = _import "Posix_FileSys_ST_isDir" private : C_Mode.t -> C_Int.t; val isFIFO = _import "Posix_FileSys_ST_isFIFO" private : C_Mode.t -> C_Int.t; val isLink = _import "Posix_FileSys_ST_isLink" private : C_Mode.t -> C_Int.t; val isReg = _import "Posix_FileSys_ST_isReg" private : C_Mode.t -> C_Int.t; val isSock = _import "Posix_FileSys_ST_isSock" private : C_Mode.t -> C_Int.t; end structure Stat = struct val fstat = _import "Posix_FileSys_Stat_fstat" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getATime = _import "Posix_FileSys_Stat_getATime" private : unit -> C_Time.t; val getCTime = _import "Posix_FileSys_Stat_getCTime" private : unit -> C_Time.t; val getDev = _import "Posix_FileSys_Stat_getDev" private : unit -> C_Dev.t; val getGId = _import "Posix_FileSys_Stat_getGId" private : unit -> C_GId.t; val getINo = _import "Posix_FileSys_Stat_getINo" private : unit -> C_INo.t; val getMode = _import "Posix_FileSys_Stat_getMode" private : unit -> C_Mode.t; val getMTime = _import "Posix_FileSys_Stat_getMTime" private : unit -> C_Time.t; val getNLink = _import "Posix_FileSys_Stat_getNLink" private : unit -> C_NLink.t; val getRDev = _import "Posix_FileSys_Stat_getRDev" private : unit -> C_Dev.t; val getSize = _import "Posix_FileSys_Stat_getSize" private : unit -> C_Off.t; val getUId = _import "Posix_FileSys_Stat_getUId" private : unit -> C_UId.t; val lstat = _import "Posix_FileSys_Stat_lstat" private : NullString8.t -> (C_Int.t) C_Errno.t; val stat = _import "Posix_FileSys_Stat_stat" private : NullString8.t -> (C_Int.t) C_Errno.t; end val symlink = _import "Posix_FileSys_symlink" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val truncate = _import "Posix_FileSys_truncate" private : NullString8.t * C_Off.t -> (C_Int.t) C_Errno.t; val umask = _import "Posix_FileSys_umask" private : C_Mode.t -> C_Mode.t; val unlink = _import "Posix_FileSys_unlink" private : NullString8.t -> (C_Int.t) C_Errno.t; structure Utimbuf = struct val setAcTime = _import "Posix_FileSys_Utimbuf_setAcTime" private : C_Time.t -> unit; val setModTime = _import "Posix_FileSys_Utimbuf_setModTime" private : C_Time.t -> unit; val utime = _import "Posix_FileSys_Utimbuf_utime" private : NullString8.t -> (C_Int.t) C_Errno.t; end end structure IO = struct val close = _import "Posix_IO_close" private : C_Fd.t -> (C_Int.t) C_Errno.t; val dup = _import "Posix_IO_dup" private : C_Fd.t -> (C_Fd.t) C_Errno.t; val dup2 = _import "Posix_IO_dup2" private : C_Fd.t * C_Fd.t -> (C_Fd.t) C_Errno.t; val F_DUPFD = _const "Posix_IO_F_DUPFD" : C_Int.t; val F_GETFD = _const "Posix_IO_F_GETFD" : C_Int.t; val F_GETFL = _const "Posix_IO_F_GETFL" : C_Int.t; val F_GETOWN = _const "Posix_IO_F_GETOWN" : C_Int.t; val F_SETFD = _const "Posix_IO_F_SETFD" : C_Int.t; val F_SETFL = _const "Posix_IO_F_SETFL" : C_Int.t; val F_SETOWN = _const "Posix_IO_F_SETOWN" : C_Int.t; val fcntl2 = _import "Posix_IO_fcntl2" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val fcntl3 = _import "Posix_IO_fcntl3" private : C_Fd.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; structure FD = struct val CLOEXEC = _const "Posix_IO_FD_CLOEXEC" : C_Int.t; end structure FLock = struct val F_GETLK = _const "Posix_IO_FLock_F_GETLK" : C_Int.t; val F_RDLCK = _const "Posix_IO_FLock_F_RDLCK" : C_Short.t; val F_SETLK = _const "Posix_IO_FLock_F_SETLK" : C_Int.t; val F_SETLKW = _const "Posix_IO_FLock_F_SETLKW" : C_Int.t; val F_UNLCK = _const "Posix_IO_FLock_F_UNLCK" : C_Short.t; val F_WRLCK = _const "Posix_IO_FLock_F_WRLCK" : C_Short.t; val fcntl = _import "Posix_IO_FLock_fcntl" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getLen = _import "Posix_IO_FLock_getLen" private : unit -> C_Off.t; val getPId = _import "Posix_IO_FLock_getPId" private : unit -> C_PId.t; val getStart = _import "Posix_IO_FLock_getStart" private : unit -> C_Off.t; val getType = _import "Posix_IO_FLock_getType" private : unit -> C_Short.t; val getWhence = _import "Posix_IO_FLock_getWhence" private : unit -> C_Short.t; val SEEK_CUR = _const "Posix_IO_FLock_SEEK_CUR" : C_Short.t; val SEEK_END = _const "Posix_IO_FLock_SEEK_END" : C_Short.t; val SEEK_SET = _const "Posix_IO_FLock_SEEK_SET" : C_Short.t; val setLen = _import "Posix_IO_FLock_setLen" private : C_Off.t -> unit; val setPId = _import "Posix_IO_FLock_setPId" private : C_PId.t -> unit; val setStart = _import "Posix_IO_FLock_setStart" private : C_Off.t -> unit; val setType = _import "Posix_IO_FLock_setType" private : C_Short.t -> unit; val setWhence = _import "Posix_IO_FLock_setWhence" private : C_Short.t -> unit; end val fsync = _import "Posix_IO_fsync" private : C_Fd.t -> (C_Int.t) C_Errno.t; val lseek = _import "Posix_IO_lseek" private : C_Fd.t * C_Off.t * C_Int.t -> (C_Off.t) C_Errno.t; val O_ACCMODE = _const "Posix_IO_O_ACCMODE" : C_Int.t; val pipe = _import "Posix_IO_pipe" private : (C_Fd.t) array -> (C_Int.t) C_Errno.t; val readChar8 = _import "Posix_IO_readChar8" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val readWord8 = _import "Posix_IO_readWord8" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val SEEK_CUR = _const "Posix_IO_SEEK_CUR" : C_Int.t; val SEEK_END = _const "Posix_IO_SEEK_END" : C_Int.t; val SEEK_SET = _const "Posix_IO_SEEK_SET" : C_Int.t; val setbin = _import "Posix_IO_setbin" private : C_Fd.t -> unit; val settext = _import "Posix_IO_settext" private : C_Fd.t -> unit; val writeChar8Arr = _import "Posix_IO_writeChar8Arr" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeChar8Vec = _import "Posix_IO_writeChar8Vec" private : C_Fd.t * (Char8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Arr = _import "Posix_IO_writeWord8Arr" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Vec = _import "Posix_IO_writeWord8Vec" private : C_Fd.t * (Word8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; end structure ProcEnv = struct val ctermid = _import "Posix_ProcEnv_ctermid" private : unit -> C_String.t; val (environGet, environSet) = _symbol "Posix_ProcEnv_environ" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val getegid = _import "Posix_ProcEnv_getegid" private : unit -> C_GId.t; val getenv = _import "Posix_ProcEnv_getenv" private : NullString8.t -> C_String.t; val geteuid = _import "Posix_ProcEnv_geteuid" private : unit -> C_UId.t; val getgid = _import "Posix_ProcEnv_getgid" private : unit -> C_GId.t; val getgroups = _import "Posix_ProcEnv_getgroups" private : C_Int.t * (C_GId.t) array -> (C_Int.t) C_Errno.t; val getgroupsN = _import "Posix_ProcEnv_getgroupsN" private : unit -> C_Int.t; val getlogin = _import "Posix_ProcEnv_getlogin" private : unit -> (C_String.t) C_Errno.t; val getpgrp = _import "Posix_ProcEnv_getpgrp" private : unit -> C_PId.t; val getpid = _import "Posix_ProcEnv_getpid" private : unit -> C_PId.t; val getppid = _import "Posix_ProcEnv_getppid" private : unit -> C_PId.t; val getuid = _import "Posix_ProcEnv_getuid" private : unit -> C_UId.t; val isatty = _import "Posix_ProcEnv_isatty" private : C_Fd.t -> C_Int.t; val SC_2_C_BIND = _const "Posix_ProcEnv_SC_2_C_BIND" : C_Int.t; val SC_2_C_DEV = _const "Posix_ProcEnv_SC_2_C_DEV" : C_Int.t; val SC_2_CHAR_TERM = _const "Posix_ProcEnv_SC_2_CHAR_TERM" : C_Int.t; val SC_2_FORT_DEV = _const "Posix_ProcEnv_SC_2_FORT_DEV" : C_Int.t; val SC_2_FORT_RUN = _const "Posix_ProcEnv_SC_2_FORT_RUN" : C_Int.t; val SC_2_LOCALEDEF = _const "Posix_ProcEnv_SC_2_LOCALEDEF" : C_Int.t; val SC_2_PBS = _const "Posix_ProcEnv_SC_2_PBS" : C_Int.t; val SC_2_PBS_ACCOUNTING = _const "Posix_ProcEnv_SC_2_PBS_ACCOUNTING" : C_Int.t; val SC_2_PBS_CHECKPOINT = _const "Posix_ProcEnv_SC_2_PBS_CHECKPOINT" : C_Int.t; val SC_2_PBS_LOCATE = _const "Posix_ProcEnv_SC_2_PBS_LOCATE" : C_Int.t; val SC_2_PBS_MESSAGE = _const "Posix_ProcEnv_SC_2_PBS_MESSAGE" : C_Int.t; val SC_2_PBS_TRACK = _const "Posix_ProcEnv_SC_2_PBS_TRACK" : C_Int.t; val SC_2_SW_DEV = _const "Posix_ProcEnv_SC_2_SW_DEV" : C_Int.t; val SC_2_UPE = _const "Posix_ProcEnv_SC_2_UPE" : C_Int.t; val SC_2_VERSION = _const "Posix_ProcEnv_SC_2_VERSION" : C_Int.t; val SC_ADVISORY_INFO = _const "Posix_ProcEnv_SC_ADVISORY_INFO" : C_Int.t; val SC_AIO_LISTIO_MAX = _const "Posix_ProcEnv_SC_AIO_LISTIO_MAX" : C_Int.t; val SC_AIO_MAX = _const "Posix_ProcEnv_SC_AIO_MAX" : C_Int.t; val SC_AIO_PRIO_DELTA_MAX = _const "Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX" : C_Int.t; val SC_ARG_MAX = _const "Posix_ProcEnv_SC_ARG_MAX" : C_Int.t; val SC_ASYNCHRONOUS_IO = _const "Posix_ProcEnv_SC_ASYNCHRONOUS_IO" : C_Int.t; val SC_ATEXIT_MAX = _const "Posix_ProcEnv_SC_ATEXIT_MAX" : C_Int.t; val SC_AVPHYS_PAGES = _const "Posix_ProcEnv_SC_AVPHYS_PAGES" : C_Int.t; val SC_BARRIERS = _const "Posix_ProcEnv_SC_BARRIERS" : C_Int.t; val SC_BC_BASE_MAX = _const "Posix_ProcEnv_SC_BC_BASE_MAX" : C_Int.t; val SC_BC_DIM_MAX = _const "Posix_ProcEnv_SC_BC_DIM_MAX" : C_Int.t; val SC_BC_SCALE_MAX = _const "Posix_ProcEnv_SC_BC_SCALE_MAX" : C_Int.t; val SC_BC_STRING_MAX = _const "Posix_ProcEnv_SC_BC_STRING_MAX" : C_Int.t; val SC_CHILD_MAX = _const "Posix_ProcEnv_SC_CHILD_MAX" : C_Int.t; val SC_CLK_TCK = _const "Posix_ProcEnv_SC_CLK_TCK" : C_Int.t; val SC_CLOCK_SELECTION = _const "Posix_ProcEnv_SC_CLOCK_SELECTION" : C_Int.t; val SC_COLL_WEIGHTS_MAX = _const "Posix_ProcEnv_SC_COLL_WEIGHTS_MAX" : C_Int.t; val SC_CPUTIME = _const "Posix_ProcEnv_SC_CPUTIME" : C_Int.t; val SC_DELAYTIMER_MAX = _const "Posix_ProcEnv_SC_DELAYTIMER_MAX" : C_Int.t; val SC_EXPR_NEST_MAX = _const "Posix_ProcEnv_SC_EXPR_NEST_MAX" : C_Int.t; val SC_FSYNC = _const "Posix_ProcEnv_SC_FSYNC" : C_Int.t; val SC_GETGR_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETGR_R_SIZE_MAX" : C_Int.t; val SC_GETPW_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETPW_R_SIZE_MAX" : C_Int.t; val SC_HOST_NAME_MAX = _const "Posix_ProcEnv_SC_HOST_NAME_MAX" : C_Int.t; val SC_IOV_MAX = _const "Posix_ProcEnv_SC_IOV_MAX" : C_Int.t; val SC_IPV6 = _const "Posix_ProcEnv_SC_IPV6" : C_Int.t; val SC_JOB_CONTROL = _const "Posix_ProcEnv_SC_JOB_CONTROL" : C_Int.t; val SC_LINE_MAX = _const "Posix_ProcEnv_SC_LINE_MAX" : C_Int.t; val SC_LOGIN_NAME_MAX = _const "Posix_ProcEnv_SC_LOGIN_NAME_MAX" : C_Int.t; val SC_MAPPED_FILES = _const "Posix_ProcEnv_SC_MAPPED_FILES" : C_Int.t; val SC_MEMLOCK = _const "Posix_ProcEnv_SC_MEMLOCK" : C_Int.t; val SC_MEMLOCK_RANGE = _const "Posix_ProcEnv_SC_MEMLOCK_RANGE" : C_Int.t; val SC_MEMORY_PROTECTION = _const "Posix_ProcEnv_SC_MEMORY_PROTECTION" : C_Int.t; val SC_MESSAGE_PASSING = _const "Posix_ProcEnv_SC_MESSAGE_PASSING" : C_Int.t; val SC_MONOTONIC_CLOCK = _const "Posix_ProcEnv_SC_MONOTONIC_CLOCK" : C_Int.t; val SC_MQ_OPEN_MAX = _const "Posix_ProcEnv_SC_MQ_OPEN_MAX" : C_Int.t; val SC_MQ_PRIO_MAX = _const "Posix_ProcEnv_SC_MQ_PRIO_MAX" : C_Int.t; val SC_NGROUPS_MAX = _const "Posix_ProcEnv_SC_NGROUPS_MAX" : C_Int.t; val SC_NPROCESSORS_CONF = _const "Posix_ProcEnv_SC_NPROCESSORS_CONF" : C_Int.t; val SC_NPROCESSORS_ONLN = _const "Posix_ProcEnv_SC_NPROCESSORS_ONLN" : C_Int.t; val SC_OPEN_MAX = _const "Posix_ProcEnv_SC_OPEN_MAX" : C_Int.t; val SC_PAGE_SIZE = _const "Posix_ProcEnv_SC_PAGE_SIZE" : C_Int.t; val SC_PAGESIZE = _const "Posix_ProcEnv_SC_PAGESIZE" : C_Int.t; val SC_PHYS_PAGES = _const "Posix_ProcEnv_SC_PHYS_PAGES" : C_Int.t; val SC_PRIORITIZED_IO = _const "Posix_ProcEnv_SC_PRIORITIZED_IO" : C_Int.t; val SC_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_PRIORITY_SCHEDULING" : C_Int.t; val SC_RAW_SOCKETS = _const "Posix_ProcEnv_SC_RAW_SOCKETS" : C_Int.t; val SC_RE_DUP_MAX = _const "Posix_ProcEnv_SC_RE_DUP_MAX" : C_Int.t; val SC_READER_WRITER_LOCKS = _const "Posix_ProcEnv_SC_READER_WRITER_LOCKS" : C_Int.t; val SC_REALTIME_SIGNALS = _const "Posix_ProcEnv_SC_REALTIME_SIGNALS" : C_Int.t; val SC_REGEXP = _const "Posix_ProcEnv_SC_REGEXP" : C_Int.t; val SC_RTSIG_MAX = _const "Posix_ProcEnv_SC_RTSIG_MAX" : C_Int.t; val SC_SAVED_IDS = _const "Posix_ProcEnv_SC_SAVED_IDS" : C_Int.t; val SC_SEM_NSEMS_MAX = _const "Posix_ProcEnv_SC_SEM_NSEMS_MAX" : C_Int.t; val SC_SEM_VALUE_MAX = _const "Posix_ProcEnv_SC_SEM_VALUE_MAX" : C_Int.t; val SC_SEMAPHORES = _const "Posix_ProcEnv_SC_SEMAPHORES" : C_Int.t; val SC_SHARED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS" : C_Int.t; val SC_SHELL = _const "Posix_ProcEnv_SC_SHELL" : C_Int.t; val SC_SIGQUEUE_MAX = _const "Posix_ProcEnv_SC_SIGQUEUE_MAX" : C_Int.t; val SC_SPAWN = _const "Posix_ProcEnv_SC_SPAWN" : C_Int.t; val SC_SPIN_LOCKS = _const "Posix_ProcEnv_SC_SPIN_LOCKS" : C_Int.t; val SC_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_SPORADIC_SERVER" : C_Int.t; val SC_SS_REPL_MAX = _const "Posix_ProcEnv_SC_SS_REPL_MAX" : C_Int.t; val SC_STREAM_MAX = _const "Posix_ProcEnv_SC_STREAM_MAX" : C_Int.t; val SC_SYMLOOP_MAX = _const "Posix_ProcEnv_SC_SYMLOOP_MAX" : C_Int.t; val SC_SYNCHRONIZED_IO = _const "Posix_ProcEnv_SC_SYNCHRONIZED_IO" : C_Int.t; val SC_THREAD_ATTR_STACKADDR = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR" : C_Int.t; val SC_THREAD_ATTR_STACKSIZE = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE" : C_Int.t; val SC_THREAD_CPUTIME = _const "Posix_ProcEnv_SC_THREAD_CPUTIME" : C_Int.t; val SC_THREAD_DESTRUCTOR_ITERATIONS = _const "Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS" : C_Int.t; val SC_THREAD_KEYS_MAX = _const "Posix_ProcEnv_SC_THREAD_KEYS_MAX" : C_Int.t; val SC_THREAD_PRIO_INHERIT = _const "Posix_ProcEnv_SC_THREAD_PRIO_INHERIT" : C_Int.t; val SC_THREAD_PRIO_PROTECT = _const "Posix_ProcEnv_SC_THREAD_PRIO_PROTECT" : C_Int.t; val SC_THREAD_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING" : C_Int.t; val SC_THREAD_PROCESS_SHARED = _const "Posix_ProcEnv_SC_THREAD_PROCESS_SHARED" : C_Int.t; val SC_THREAD_SAFE_FUNCTIONS = _const "Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS" : C_Int.t; val SC_THREAD_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER" : C_Int.t; val SC_THREAD_STACK_MIN = _const "Posix_ProcEnv_SC_THREAD_STACK_MIN" : C_Int.t; val SC_THREAD_THREADS_MAX = _const "Posix_ProcEnv_SC_THREAD_THREADS_MAX" : C_Int.t; val SC_THREADS = _const "Posix_ProcEnv_SC_THREADS" : C_Int.t; val SC_TIMEOUTS = _const "Posix_ProcEnv_SC_TIMEOUTS" : C_Int.t; val SC_TIMER_MAX = _const "Posix_ProcEnv_SC_TIMER_MAX" : C_Int.t; val SC_TIMERS = _const "Posix_ProcEnv_SC_TIMERS" : C_Int.t; val SC_TRACE = _const "Posix_ProcEnv_SC_TRACE" : C_Int.t; val SC_TRACE_EVENT_FILTER = _const "Posix_ProcEnv_SC_TRACE_EVENT_FILTER" : C_Int.t; val SC_TRACE_EVENT_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX" : C_Int.t; val SC_TRACE_INHERIT = _const "Posix_ProcEnv_SC_TRACE_INHERIT" : C_Int.t; val SC_TRACE_LOG = _const "Posix_ProcEnv_SC_TRACE_LOG" : C_Int.t; val SC_TRACE_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_NAME_MAX" : C_Int.t; val SC_TRACE_SYS_MAX = _const "Posix_ProcEnv_SC_TRACE_SYS_MAX" : C_Int.t; val SC_TRACE_USER_EVENT_MAX = _const "Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX" : C_Int.t; val SC_TTY_NAME_MAX = _const "Posix_ProcEnv_SC_TTY_NAME_MAX" : C_Int.t; val SC_TYPED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS" : C_Int.t; val SC_TZNAME_MAX = _const "Posix_ProcEnv_SC_TZNAME_MAX" : C_Int.t; val SC_V6_ILP32_OFF32 = _const "Posix_ProcEnv_SC_V6_ILP32_OFF32" : C_Int.t; val SC_V6_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_V6_ILP32_OFFBIG" : C_Int.t; val SC_V6_LP64_OFF64 = _const "Posix_ProcEnv_SC_V6_LP64_OFF64" : C_Int.t; val SC_V6_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_V6_LPBIG_OFFBIG" : C_Int.t; val SC_VERSION = _const "Posix_ProcEnv_SC_VERSION" : C_Int.t; val SC_XBS5_ILP32_OFF32 = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFF32" : C_Int.t; val SC_XBS5_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG" : C_Int.t; val SC_XBS5_LP64_OFF64 = _const "Posix_ProcEnv_SC_XBS5_LP64_OFF64" : C_Int.t; val SC_XBS5_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG" : C_Int.t; val SC_XOPEN_CRYPT = _const "Posix_ProcEnv_SC_XOPEN_CRYPT" : C_Int.t; val SC_XOPEN_ENH_I18N = _const "Posix_ProcEnv_SC_XOPEN_ENH_I18N" : C_Int.t; val SC_XOPEN_LEGACY = _const "Posix_ProcEnv_SC_XOPEN_LEGACY" : C_Int.t; val SC_XOPEN_REALTIME = _const "Posix_ProcEnv_SC_XOPEN_REALTIME" : C_Int.t; val SC_XOPEN_REALTIME_THREADS = _const "Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS" : C_Int.t; val SC_XOPEN_SHM = _const "Posix_ProcEnv_SC_XOPEN_SHM" : C_Int.t; val SC_XOPEN_STREAMS = _const "Posix_ProcEnv_SC_XOPEN_STREAMS" : C_Int.t; val SC_XOPEN_UNIX = _const "Posix_ProcEnv_SC_XOPEN_UNIX" : C_Int.t; val SC_XOPEN_VERSION = _const "Posix_ProcEnv_SC_XOPEN_VERSION" : C_Int.t; val setenv = _import "Posix_ProcEnv_setenv" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val setgid = _import "Posix_ProcEnv_setgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val setgroups = _import "Posix_ProcEnv_setgroups" private : C_Int.t * (C_GId.t) vector -> (C_Int.t) C_Errno.t; val setpgid = _import "Posix_ProcEnv_setpgid" private : C_PId.t * C_PId.t -> (C_Int.t) C_Errno.t; val setsid = _import "Posix_ProcEnv_setsid" private : unit -> (C_PId.t) C_Errno.t; val setuid = _import "Posix_ProcEnv_setuid" private : C_UId.t -> (C_Int.t) C_Errno.t; val sysconf = _import "Posix_ProcEnv_sysconf" private : C_Int.t -> (C_Long.t) C_Errno.t; val times = _import "Posix_ProcEnv_times" private : unit -> (C_Clock.t) C_Errno.t; structure Times = struct val getCSTime = _import "Posix_ProcEnv_Times_getCSTime" private : unit -> C_Clock.t; val getCUTime = _import "Posix_ProcEnv_Times_getCUTime" private : unit -> C_Clock.t; val getSTime = _import "Posix_ProcEnv_Times_getSTime" private : unit -> C_Clock.t; val getUTime = _import "Posix_ProcEnv_Times_getUTime" private : unit -> C_Clock.t; end val ttyname = _import "Posix_ProcEnv_ttyname" private : C_Fd.t -> (C_String.t) C_Errno.t; val uname = _import "Posix_ProcEnv_uname" private : unit -> (C_Int.t) C_Errno.t; structure Uname = struct val getMachine = _import "Posix_ProcEnv_Uname_getMachine" private : unit -> C_String.t; val getNodeName = _import "Posix_ProcEnv_Uname_getNodeName" private : unit -> C_String.t; val getRelease = _import "Posix_ProcEnv_Uname_getRelease" private : unit -> C_String.t; val getSysName = _import "Posix_ProcEnv_Uname_getSysName" private : unit -> C_String.t; val getVersion = _import "Posix_ProcEnv_Uname_getVersion" private : unit -> C_String.t; end end structure Process = struct val alarm = _import "Posix_Process_alarm" private : C_UInt.t -> C_UInt.t; val exece = _import "Posix_Process_exece" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_Int.t) C_Errno.t; val execp = _import "Posix_Process_execp" private : NullString8.t * (NullString8.t) array -> (C_Int.t) C_Errno.t; val exit = _import "Posix_Process_exit" private : C_Status.t -> unit; val exitStatus = _import "Posix_Process_exitStatus" private : C_Status.t -> C_Int.t; val fork = _import "Posix_Process_fork" private : unit -> (C_PId.t) C_Errno.t; val ifExited = _import "Posix_Process_ifExited" private : C_Status.t -> C_Int.t; val ifSignaled = _import "Posix_Process_ifSignaled" private : C_Status.t -> C_Int.t; val ifStopped = _import "Posix_Process_ifStopped" private : C_Status.t -> C_Int.t; val kill = _import "Posix_Process_kill" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; val nanosleep = _import "Posix_Process_nanosleep" private : (C_Time.t) ref * (C_Long.t) ref -> (C_Int.t) C_Errno.t; val pause = _import "Posix_Process_pause" private : unit -> (C_Int.t) C_Errno.t; val sleep = _import "Posix_Process_sleep" private : C_UInt.t -> C_UInt.t; val stopSig = _import "Posix_Process_stopSig" private : C_Status.t -> C_Signal.t; val system = _import "Posix_Process_system" private : NullString8.t -> (C_Status.t) C_Errno.t; val termSig = _import "Posix_Process_termSig" private : C_Status.t -> C_Signal.t; structure W = struct val NOHANG = _const "Posix_Process_W_NOHANG" : C_Int.t; val UNTRACED = _const "Posix_Process_W_UNTRACED" : C_Int.t; end val waitpid = _import "Posix_Process_waitpid" private : C_PId.t * (C_Status.t) ref * C_Int.t -> (C_PId.t) C_Errno.t; end structure Signal = struct val default = _import "Posix_Signal_default" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val handlee = _import "Posix_Signal_handlee" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val handleGC = _import "Posix_Signal_handleGC" private : GCState.t -> unit; val ignore = _import "Posix_Signal_ignore" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val isDefault = _import "Posix_Signal_isDefault" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isIgnore = _import "Posix_Signal_isIgnore" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isPending = _import "Posix_Signal_isPending" private : GCState.t * C_Signal.t -> C_Int.t; val isPendingGC = _import "Posix_Signal_isPendingGC" private : GCState.t -> C_Int.t; val NSIG = _const "Posix_Signal_NSIG" : C_Int.t; val resetPending = _import "Posix_Signal_resetPending" private : GCState.t -> unit; val SIG_BLOCK = _const "Posix_Signal_SIG_BLOCK" : C_Int.t; val SIG_SETMASK = _const "Posix_Signal_SIG_SETMASK" : C_Int.t; val SIG_UNBLOCK = _const "Posix_Signal_SIG_UNBLOCK" : C_Int.t; val SIGABRT = _const "Posix_Signal_SIGABRT" : C_Signal.t; val sigaddset = _import "Posix_Signal_sigaddset" private : (Word8.t) array * C_Signal.t -> (C_Int.t) C_Errno.t; val SIGALRM = _const "Posix_Signal_SIGALRM" : C_Signal.t; val SIGBUS = _const "Posix_Signal_SIGBUS" : C_Signal.t; val SIGCHLD = _const "Posix_Signal_SIGCHLD" : C_Signal.t; val SIGCONT = _const "Posix_Signal_SIGCONT" : C_Signal.t; val sigdelset = _import "Posix_Signal_sigdelset" private : (Word8.t) array * C_Signal.t -> (C_Int.t) C_Errno.t; val sigemptyset = _import "Posix_Signal_sigemptyset" private : (Word8.t) array -> (C_Int.t) C_Errno.t; val sigfillset = _import "Posix_Signal_sigfillset" private : (Word8.t) array -> (C_Int.t) C_Errno.t; val SIGFPE = _const "Posix_Signal_SIGFPE" : C_Signal.t; val SIGHUP = _const "Posix_Signal_SIGHUP" : C_Signal.t; val SIGILL = _const "Posix_Signal_SIGILL" : C_Signal.t; val SIGINT = _const "Posix_Signal_SIGINT" : C_Signal.t; val sigismember = _import "Posix_Signal_sigismember" private : (Word8.t) vector * C_Signal.t -> (C_Int.t) C_Errno.t; val SIGKILL = _const "Posix_Signal_SIGKILL" : C_Signal.t; val SIGPIPE = _const "Posix_Signal_SIGPIPE" : C_Signal.t; val SIGPOLL = _const "Posix_Signal_SIGPOLL" : C_Signal.t; val sigprocmask = _import "Posix_Signal_sigprocmask" private : C_Int.t * (Word8.t) vector * (Word8.t) array -> (C_Int.t) C_Errno.t; val SIGPROF = _const "Posix_Signal_SIGPROF" : C_Signal.t; val SIGQUIT = _const "Posix_Signal_SIGQUIT" : C_Signal.t; val SIGSEGV = _const "Posix_Signal_SIGSEGV" : C_Signal.t; val sigSetLen = _const "Posix_Signal_sigSetLen" : C_Size.t; val SIGSTOP = _const "Posix_Signal_SIGSTOP" : C_Signal.t; val sigsuspend = _import "Posix_Signal_sigsuspend" private : (Word8.t) vector -> unit; val SIGSYS = _const "Posix_Signal_SIGSYS" : C_Signal.t; val SIGTERM = _const "Posix_Signal_SIGTERM" : C_Signal.t; val SIGTRAP = _const "Posix_Signal_SIGTRAP" : C_Signal.t; val SIGTSTP = _const "Posix_Signal_SIGTSTP" : C_Signal.t; val SIGTTIN = _const "Posix_Signal_SIGTTIN" : C_Signal.t; val SIGTTOU = _const "Posix_Signal_SIGTTOU" : C_Signal.t; val SIGURG = _const "Posix_Signal_SIGURG" : C_Signal.t; val SIGUSR1 = _const "Posix_Signal_SIGUSR1" : C_Signal.t; val SIGUSR2 = _const "Posix_Signal_SIGUSR2" : C_Signal.t; val SIGVTALRM = _const "Posix_Signal_SIGVTALRM" : C_Signal.t; val SIGXCPU = _const "Posix_Signal_SIGXCPU" : C_Signal.t; val SIGXFSZ = _const "Posix_Signal_SIGXFSZ" : C_Signal.t; end structure SysDB = struct val getgrgid = _import "Posix_SysDB_getgrgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val getgrnam = _import "Posix_SysDB_getgrnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwnam = _import "Posix_SysDB_getpwnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwuid = _import "Posix_SysDB_getpwuid" private : C_GId.t -> (C_Int.t) C_Errno.t; structure Group = struct val getGId = _import "Posix_SysDB_Group_getGId" private : unit -> C_GId.t; val getMem = _import "Posix_SysDB_Group_getMem" private : unit -> C_StringArray.t; val getName = _import "Posix_SysDB_Group_getName" private : unit -> C_String.t; end structure Passwd = struct val getDir = _import "Posix_SysDB_Passwd_getDir" private : unit -> C_String.t; val getGId = _import "Posix_SysDB_Passwd_getGId" private : unit -> C_GId.t; val getName = _import "Posix_SysDB_Passwd_getName" private : unit -> C_String.t; val getShell = _import "Posix_SysDB_Passwd_getShell" private : unit -> C_String.t; val getUId = _import "Posix_SysDB_Passwd_getUId" private : unit -> C_UId.t; end end structure TTY = struct val B0 = _const "Posix_TTY_B0" : C_Speed.t; val B110 = _const "Posix_TTY_B110" : C_Speed.t; val B1200 = _const "Posix_TTY_B1200" : C_Speed.t; val B134 = _const "Posix_TTY_B134" : C_Speed.t; val B150 = _const "Posix_TTY_B150" : C_Speed.t; val B1800 = _const "Posix_TTY_B1800" : C_Speed.t; val B19200 = _const "Posix_TTY_B19200" : C_Speed.t; val B200 = _const "Posix_TTY_B200" : C_Speed.t; val B2400 = _const "Posix_TTY_B2400" : C_Speed.t; val B300 = _const "Posix_TTY_B300" : C_Speed.t; val B38400 = _const "Posix_TTY_B38400" : C_Speed.t; val B4800 = _const "Posix_TTY_B4800" : C_Speed.t; val B50 = _const "Posix_TTY_B50" : C_Speed.t; val B600 = _const "Posix_TTY_B600" : C_Speed.t; val B75 = _const "Posix_TTY_B75" : C_Speed.t; val B9600 = _const "Posix_TTY_B9600" : C_Speed.t; structure C = struct val CLOCAL = _const "Posix_TTY_C_CLOCAL" : C_TCFlag.t; val CREAD = _const "Posix_TTY_C_CREAD" : C_TCFlag.t; val CS5 = _const "Posix_TTY_C_CS5" : C_TCFlag.t; val CS6 = _const "Posix_TTY_C_CS6" : C_TCFlag.t; val CS7 = _const "Posix_TTY_C_CS7" : C_TCFlag.t; val CS8 = _const "Posix_TTY_C_CS8" : C_TCFlag.t; val CSIZE = _const "Posix_TTY_C_CSIZE" : C_TCFlag.t; val CSTOPB = _const "Posix_TTY_C_CSTOPB" : C_TCFlag.t; val HUPCL = _const "Posix_TTY_C_HUPCL" : C_TCFlag.t; val PARENB = _const "Posix_TTY_C_PARENB" : C_TCFlag.t; val PARODD = _const "Posix_TTY_C_PARODD" : C_TCFlag.t; end structure I = struct val BRKINT = _const "Posix_TTY_I_BRKINT" : C_TCFlag.t; val ICRNL = _const "Posix_TTY_I_ICRNL" : C_TCFlag.t; val IGNBRK = _const "Posix_TTY_I_IGNBRK" : C_TCFlag.t; val IGNCR = _const "Posix_TTY_I_IGNCR" : C_TCFlag.t; val IGNPAR = _const "Posix_TTY_I_IGNPAR" : C_TCFlag.t; val INLCR = _const "Posix_TTY_I_INLCR" : C_TCFlag.t; val INPCK = _const "Posix_TTY_I_INPCK" : C_TCFlag.t; val ISTRIP = _const "Posix_TTY_I_ISTRIP" : C_TCFlag.t; val IXANY = _const "Posix_TTY_I_IXANY" : C_TCFlag.t; val IXOFF = _const "Posix_TTY_I_IXOFF" : C_TCFlag.t; val IXON = _const "Posix_TTY_I_IXON" : C_TCFlag.t; val PARMRK = _const "Posix_TTY_I_PARMRK" : C_TCFlag.t; end structure L = struct val ECHO = _const "Posix_TTY_L_ECHO" : C_TCFlag.t; val ECHOE = _const "Posix_TTY_L_ECHOE" : C_TCFlag.t; val ECHOK = _const "Posix_TTY_L_ECHOK" : C_TCFlag.t; val ECHONL = _const "Posix_TTY_L_ECHONL" : C_TCFlag.t; val ICANON = _const "Posix_TTY_L_ICANON" : C_TCFlag.t; val IEXTEN = _const "Posix_TTY_L_IEXTEN" : C_TCFlag.t; val ISIG = _const "Posix_TTY_L_ISIG" : C_TCFlag.t; val NOFLSH = _const "Posix_TTY_L_NOFLSH" : C_TCFlag.t; val TOSTOP = _const "Posix_TTY_L_TOSTOP" : C_TCFlag.t; end structure O = struct val BS0 = _const "Posix_TTY_O_BS0" : C_TCFlag.t; val BS1 = _const "Posix_TTY_O_BS1" : C_TCFlag.t; val BSDLY = _const "Posix_TTY_O_BSDLY" : C_TCFlag.t; val CR0 = _const "Posix_TTY_O_CR0" : C_TCFlag.t; val CR1 = _const "Posix_TTY_O_CR1" : C_TCFlag.t; val CR2 = _const "Posix_TTY_O_CR2" : C_TCFlag.t; val CR3 = _const "Posix_TTY_O_CR3" : C_TCFlag.t; val CRDLY = _const "Posix_TTY_O_CRDLY" : C_TCFlag.t; val FF0 = _const "Posix_TTY_O_FF0" : C_TCFlag.t; val FF1 = _const "Posix_TTY_O_FF1" : C_TCFlag.t; val FFDLY = _const "Posix_TTY_O_FFDLY" : C_TCFlag.t; val NL0 = _const "Posix_TTY_O_NL0" : C_TCFlag.t; val NL1 = _const "Posix_TTY_O_NL1" : C_TCFlag.t; val NLDLY = _const "Posix_TTY_O_NLDLY" : C_TCFlag.t; val OCRNL = _const "Posix_TTY_O_OCRNL" : C_TCFlag.t; val OFILL = _const "Posix_TTY_O_OFILL" : C_TCFlag.t; val ONLCR = _const "Posix_TTY_O_ONLCR" : C_TCFlag.t; val ONLRET = _const "Posix_TTY_O_ONLRET" : C_TCFlag.t; val ONOCR = _const "Posix_TTY_O_ONOCR" : C_TCFlag.t; val OPOST = _const "Posix_TTY_O_OPOST" : C_TCFlag.t; val TAB0 = _const "Posix_TTY_O_TAB0" : C_TCFlag.t; val TAB1 = _const "Posix_TTY_O_TAB1" : C_TCFlag.t; val TAB2 = _const "Posix_TTY_O_TAB2" : C_TCFlag.t; val TAB3 = _const "Posix_TTY_O_TAB3" : C_TCFlag.t; val TABDLY = _const "Posix_TTY_O_TABDLY" : C_TCFlag.t; val VT0 = _const "Posix_TTY_O_VT0" : C_TCFlag.t; val VT1 = _const "Posix_TTY_O_VT1" : C_TCFlag.t; val VTDLY = _const "Posix_TTY_O_VTDLY" : C_TCFlag.t; end structure TC = struct val drain = _import "Posix_TTY_TC_drain" private : C_Fd.t -> (C_Int.t) C_Errno.t; val flow = _import "Posix_TTY_TC_flow" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val flush = _import "Posix_TTY_TC_flush" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getattr = _import "Posix_TTY_TC_getattr" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getpgrp = _import "Posix_TTY_TC_getpgrp" private : C_Fd.t -> (C_PId.t) C_Errno.t; val sendbreak = _import "Posix_TTY_TC_sendbreak" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setattr = _import "Posix_TTY_TC_setattr" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setpgrp = _import "Posix_TTY_TC_setpgrp" private : C_Fd.t * C_PId.t -> (C_Int.t) C_Errno.t; val TCIFLUSH = _const "Posix_TTY_TC_TCIFLUSH" : C_Int.t; val TCIOFF = _const "Posix_TTY_TC_TCIOFF" : C_Int.t; val TCIOFLUSH = _const "Posix_TTY_TC_TCIOFLUSH" : C_Int.t; val TCION = _const "Posix_TTY_TC_TCION" : C_Int.t; val TCOFLUSH = _const "Posix_TTY_TC_TCOFLUSH" : C_Int.t; val TCOOFF = _const "Posix_TTY_TC_TCOOFF" : C_Int.t; val TCOON = _const "Posix_TTY_TC_TCOON" : C_Int.t; val TCSADRAIN = _const "Posix_TTY_TC_TCSADRAIN" : C_Int.t; val TCSAFLUSH = _const "Posix_TTY_TC_TCSAFLUSH" : C_Int.t; val TCSANOW = _const "Posix_TTY_TC_TCSANOW" : C_Int.t; end structure Termios = struct val cfGetISpeed = _import "Posix_TTY_Termios_cfGetISpeed" private : unit -> C_Speed.t; val cfGetOSpeed = _import "Posix_TTY_Termios_cfGetOSpeed" private : unit -> C_Speed.t; val cfSetISpeed = _import "Posix_TTY_Termios_cfSetISpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val cfSetOSpeed = _import "Posix_TTY_Termios_cfSetOSpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val getCC = _import "Posix_TTY_Termios_getCC" private : (C_CC.t) array -> unit; val getCFlag = _import "Posix_TTY_Termios_getCFlag" private : unit -> C_TCFlag.t; val getIFlag = _import "Posix_TTY_Termios_getIFlag" private : unit -> C_TCFlag.t; val getLFlag = _import "Posix_TTY_Termios_getLFlag" private : unit -> C_TCFlag.t; val getOFlag = _import "Posix_TTY_Termios_getOFlag" private : unit -> C_TCFlag.t; val setCC = _import "Posix_TTY_Termios_setCC" private : (C_CC.t) array -> unit; val setCFlag = _import "Posix_TTY_Termios_setCFlag" private : C_TCFlag.t -> unit; val setIFlag = _import "Posix_TTY_Termios_setIFlag" private : C_TCFlag.t -> unit; val setLFlag = _import "Posix_TTY_Termios_setLFlag" private : C_TCFlag.t -> unit; val setOFlag = _import "Posix_TTY_Termios_setOFlag" private : C_TCFlag.t -> unit; end structure V = struct val NCCS = _const "Posix_TTY_V_NCCS" : C_Int.t; val VEOF = _const "Posix_TTY_V_VEOF" : C_Int.t; val VEOL = _const "Posix_TTY_V_VEOL" : C_Int.t; val VERASE = _const "Posix_TTY_V_VERASE" : C_Int.t; val VINTR = _const "Posix_TTY_V_VINTR" : C_Int.t; val VKILL = _const "Posix_TTY_V_VKILL" : C_Int.t; val VMIN = _const "Posix_TTY_V_VMIN" : C_Int.t; val VQUIT = _const "Posix_TTY_V_VQUIT" : C_Int.t; val VSTART = _const "Posix_TTY_V_VSTART" : C_Int.t; val VSTOP = _const "Posix_TTY_V_VSTOP" : C_Int.t; val VSUSP = _const "Posix_TTY_V_VSUSP" : C_Int.t; val VTIME = _const "Posix_TTY_V_VTIME" : C_Int.t; end end end structure Real32 = struct type t = Real32.t val abs = _import "Real32_abs" private inline : Real32.t -> Real32.t; val add = _import "Real32_add" private inline : Real32.t * Real32.t -> Real32.t; val castToWord32 = _import "Real32_castToWord32" private inline : Real32.t -> Word32.t; val div = _import "Real32_div" private inline : Real32.t * Real32.t -> Real32.t; val equal = _import "Real32_equal" private inline : Real32.t * Real32.t -> Bool.t; val fetch = _import "Real32_fetch" private inline : (Real32.t) ref -> Real32.t; val frexp = _import "Real32_frexp" private inline : Real32.t * (C_Int.t) ref -> Real32.t; val gdtoa = _import "Real32_gdtoa" private : Real32.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real32_ldexp" private inline : Real32.t * C_Int.t -> Real32.t; val le = _import "Real32_le" private inline : Real32.t * Real32.t -> Bool.t; val lt = _import "Real32_lt" private inline : Real32.t * Real32.t -> Bool.t; structure Math = struct val acos = _import "Real32_Math_acos" private inline : Real32.t -> Real32.t; val asin = _import "Real32_Math_asin" private inline : Real32.t -> Real32.t; val atan = _import "Real32_Math_atan" private inline : Real32.t -> Real32.t; val atan2 = _import "Real32_Math_atan2" private inline : Real32.t * Real32.t -> Real32.t; val cos = _import "Real32_Math_cos" private inline : Real32.t -> Real32.t; val cosh = _import "Real32_Math_cosh" private inline : Real32.t -> Real32.t; val exp = _import "Real32_Math_exp" private inline : Real32.t -> Real32.t; val ln = _import "Real32_Math_ln" private inline : Real32.t -> Real32.t; val log10 = _import "Real32_Math_log10" private inline : Real32.t -> Real32.t; val pow = _import "Real32_Math_pow" private inline : Real32.t * Real32.t -> Real32.t; val sin = _import "Real32_Math_sin" private inline : Real32.t -> Real32.t; val sinh = _import "Real32_Math_sinh" private inline : Real32.t -> Real32.t; val sqrt = _import "Real32_Math_sqrt" private inline : Real32.t -> Real32.t; val tan = _import "Real32_Math_tan" private inline : Real32.t -> Real32.t; val tanh = _import "Real32_Math_tanh" private inline : Real32.t -> Real32.t; end val modf = _import "Real32_modf" private inline : Real32.t * (Real32.t) ref -> Real32.t; val move = _import "Real32_move" private inline : (Real32.t) ref * (Real32.t) ref -> unit; val mul = _import "Real32_mul" private inline : Real32.t * Real32.t -> Real32.t; val muladd = _import "Real32_muladd" private inline : Real32.t * Real32.t * Real32.t -> Real32.t; val mulsub = _import "Real32_mulsub" private inline : Real32.t * Real32.t * Real32.t -> Real32.t; val neg = _import "Real32_neg" private inline : Real32.t -> Real32.t; val realCeil = _import "Real32_realCeil" private inline : Real32.t -> Real32.t; val realFloor = _import "Real32_realFloor" private inline : Real32.t -> Real32.t; val realTrunc = _import "Real32_realTrunc" private inline : Real32.t -> Real32.t; val rndToReal32 = _import "Real32_rndToReal32" private inline : Real32.t -> Real32.t; val rndToReal64 = _import "Real32_rndToReal64" private inline : Real32.t -> Real64.t; val rndToWordS16 = _import "Real32_rndToWordS16" private inline : Real32.t -> Int16.t; val rndToWordS32 = _import "Real32_rndToWordS32" private inline : Real32.t -> Int32.t; val rndToWordS64 = _import "Real32_rndToWordS64" private inline : Real32.t -> Int64.t; val rndToWordS8 = _import "Real32_rndToWordS8" private inline : Real32.t -> Int8.t; val rndToWordU16 = _import "Real32_rndToWordU16" private inline : Real32.t -> Word16.t; val rndToWordU32 = _import "Real32_rndToWordU32" private inline : Real32.t -> Word32.t; val rndToWordU64 = _import "Real32_rndToWordU64" private inline : Real32.t -> Word64.t; val rndToWordU8 = _import "Real32_rndToWordU8" private inline : Real32.t -> Word8.t; val round = _import "Real32_round" private inline : Real32.t -> Real32.t; val store = _import "Real32_store" private inline : (Real32.t) ref * Real32.t -> unit; val strtor = _import "Real32_strtor" private : NullString8.t * C_Int.t -> Real32.t; val sub = _import "Real32_sub" private inline : Real32.t * Real32.t -> Real32.t; end structure Real64 = struct type t = Real64.t val abs = _import "Real64_abs" private inline : Real64.t -> Real64.t; val add = _import "Real64_add" private inline : Real64.t * Real64.t -> Real64.t; val castToWord64 = _import "Real64_castToWord64" private inline : Real64.t -> Word64.t; val div = _import "Real64_div" private inline : Real64.t * Real64.t -> Real64.t; val equal = _import "Real64_equal" private inline : Real64.t * Real64.t -> Bool.t; val fetch = _import "Real64_fetch" private inline : (Real64.t) ref -> Real64.t; val frexp = _import "Real64_frexp" private inline : Real64.t * (C_Int.t) ref -> Real64.t; val gdtoa = _import "Real64_gdtoa" private : Real64.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real64_ldexp" private inline : Real64.t * C_Int.t -> Real64.t; val le = _import "Real64_le" private inline : Real64.t * Real64.t -> Bool.t; val lt = _import "Real64_lt" private inline : Real64.t * Real64.t -> Bool.t; structure Math = struct val acos = _import "Real64_Math_acos" private inline : Real64.t -> Real64.t; val asin = _import "Real64_Math_asin" private inline : Real64.t -> Real64.t; val atan = _import "Real64_Math_atan" private inline : Real64.t -> Real64.t; val atan2 = _import "Real64_Math_atan2" private inline : Real64.t * Real64.t -> Real64.t; val cos = _import "Real64_Math_cos" private inline : Real64.t -> Real64.t; val cosh = _import "Real64_Math_cosh" private inline : Real64.t -> Real64.t; val exp = _import "Real64_Math_exp" private inline : Real64.t -> Real64.t; val ln = _import "Real64_Math_ln" private inline : Real64.t -> Real64.t; val log10 = _import "Real64_Math_log10" private inline : Real64.t -> Real64.t; val pow = _import "Real64_Math_pow" private inline : Real64.t * Real64.t -> Real64.t; val sin = _import "Real64_Math_sin" private inline : Real64.t -> Real64.t; val sinh = _import "Real64_Math_sinh" private inline : Real64.t -> Real64.t; val sqrt = _import "Real64_Math_sqrt" private inline : Real64.t -> Real64.t; val tan = _import "Real64_Math_tan" private inline : Real64.t -> Real64.t; val tanh = _import "Real64_Math_tanh" private inline : Real64.t -> Real64.t; end val modf = _import "Real64_modf" private inline : Real64.t * (Real64.t) ref -> Real64.t; val move = _import "Real64_move" private inline : (Real64.t) ref * (Real64.t) ref -> unit; val mul = _import "Real64_mul" private inline : Real64.t * Real64.t -> Real64.t; val muladd = _import "Real64_muladd" private inline : Real64.t * Real64.t * Real64.t -> Real64.t; val mulsub = _import "Real64_mulsub" private inline : Real64.t * Real64.t * Real64.t -> Real64.t; val neg = _import "Real64_neg" private inline : Real64.t -> Real64.t; val realCeil = _import "Real64_realCeil" private inline : Real64.t -> Real64.t; val realFloor = _import "Real64_realFloor" private inline : Real64.t -> Real64.t; val realTrunc = _import "Real64_realTrunc" private inline : Real64.t -> Real64.t; val rndToReal32 = _import "Real64_rndToReal32" private inline : Real64.t -> Real32.t; val rndToReal64 = _import "Real64_rndToReal64" private inline : Real64.t -> Real64.t; val rndToWordS16 = _import "Real64_rndToWordS16" private inline : Real64.t -> Int16.t; val rndToWordS32 = _import "Real64_rndToWordS32" private inline : Real64.t -> Int32.t; val rndToWordS64 = _import "Real64_rndToWordS64" private inline : Real64.t -> Int64.t; val rndToWordS8 = _import "Real64_rndToWordS8" private inline : Real64.t -> Int8.t; val rndToWordU16 = _import "Real64_rndToWordU16" private inline : Real64.t -> Word16.t; val rndToWordU32 = _import "Real64_rndToWordU32" private inline : Real64.t -> Word32.t; val rndToWordU64 = _import "Real64_rndToWordU64" private inline : Real64.t -> Word64.t; val rndToWordU8 = _import "Real64_rndToWordU8" private inline : Real64.t -> Word8.t; val round = _import "Real64_round" private inline : Real64.t -> Real64.t; val store = _import "Real64_store" private inline : (Real64.t) ref * Real64.t -> unit; val strtor = _import "Real64_strtor" private : NullString8.t * C_Int.t -> Real64.t; val sub = _import "Real64_sub" private inline : Real64.t * Real64.t -> Real64.t; end structure Socket = struct val accept = _import "Socket_accept" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; structure AF = struct val INET = _const "Socket_AF_INET" : C_Int.t; val INET6 = _const "Socket_AF_INET6" : C_Int.t; val UNIX = _const "Socket_AF_UNIX" : C_Int.t; val UNSPEC = _const "Socket_AF_UNSPEC" : C_Int.t; end val bind = _import "Socket_bind" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val close = _import "Socket_close" private : C_Sock.t -> (C_Int.t) C_Errno.t; val connect = _import "Socket_connect" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; structure Ctl = struct val getATMARK = _import "Socket_Ctl_getATMARK" private : C_Sock.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getNREAD = _import "Socket_Ctl_getNREAD" private : C_Sock.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getPeerName = _import "Socket_Ctl_getPeerName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockName = _import "Socket_Ctl_getSockName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockOptC_Int = _import "Socket_Ctl_getSockOptC_Int" private : C_Sock.t * C_Int.t * C_Int.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getSockOptC_Linger = _import "Socket_Ctl_getSockOptC_Linger" private : C_Sock.t * C_Int.t * C_Int.t * (C_Int.t) ref * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val setSockOptC_Int = _import "Socket_Ctl_setSockOptC_Int" private : C_Sock.t * C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val setSockOptC_Linger = _import "Socket_Ctl_setSockOptC_Linger" private : C_Sock.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val SO_ACCEPTCONN = _const "Socket_Ctl_SO_ACCEPTCONN" : C_Int.t; val SO_BROADCAST = _const "Socket_Ctl_SO_BROADCAST" : C_Int.t; val SO_DEBUG = _const "Socket_Ctl_SO_DEBUG" : C_Int.t; val SO_DONTROUTE = _const "Socket_Ctl_SO_DONTROUTE" : C_Int.t; val SO_ERROR = _const "Socket_Ctl_SO_ERROR" : C_Int.t; val SO_KEEPALIVE = _const "Socket_Ctl_SO_KEEPALIVE" : C_Int.t; val SO_LINGER = _const "Socket_Ctl_SO_LINGER" : C_Int.t; val SO_OOBINLINE = _const "Socket_Ctl_SO_OOBINLINE" : C_Int.t; val SO_RCVBUF = _const "Socket_Ctl_SO_RCVBUF" : C_Int.t; val SO_RCVLOWAT = _const "Socket_Ctl_SO_RCVLOWAT" : C_Int.t; val SO_RCVTIMEO = _const "Socket_Ctl_SO_RCVTIMEO" : C_Int.t; val SO_REUSEADDR = _const "Socket_Ctl_SO_REUSEADDR" : C_Int.t; val SO_SNDBUF = _const "Socket_Ctl_SO_SNDBUF" : C_Int.t; val SO_SNDLOWAT = _const "Socket_Ctl_SO_SNDLOWAT" : C_Int.t; val SO_SNDTIMEO = _const "Socket_Ctl_SO_SNDTIMEO" : C_Int.t; val SO_TYPE = _const "Socket_Ctl_SO_TYPE" : C_Int.t; val SOL_SOCKET = _const "Socket_Ctl_SOL_SOCKET" : C_Int.t; end val familyOfAddr = _import "Socket_familyOfAddr" private : (Word8.t) vector -> C_Int.t; structure GenericSock = struct val socket = _import "Socket_GenericSock_socket" private : C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val socketPair = _import "Socket_GenericSock_socketPair" private : C_Int.t * C_Int.t * C_Int.t * (C_Int.t) array -> (C_Int.t) C_Errno.t; end val getTimeout_sec = _import "Socket_getTimeout_sec" private : unit -> C_Time.t; val getTimeout_usec = _import "Socket_getTimeout_usec" private : unit -> C_SUSeconds.t; structure INetSock = struct structure Ctl = struct val IPPROTO_TCP = _const "Socket_INetSock_Ctl_IPPROTO_TCP" : C_Int.t; val TCP_NODELAY = _const "Socket_INetSock_Ctl_TCP_NODELAY" : C_Int.t; end val fromAddr = _import "Socket_INetSock_fromAddr" private : (Word8.t) vector -> unit; val getInAddr = _import "Socket_INetSock_getInAddr" private : (Word8.t) array -> unit; val getPort = _import "Socket_INetSock_getPort" private : unit -> Word16.t; val toAddr = _import "Socket_INetSock_toAddr" private : (Word8.t) vector * Word16.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end val listen = _import "Socket_listen" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; val MSG_CTRUNC = _const "Socket_MSG_CTRUNC" : C_Int.t; val MSG_DONTROUTE = _const "Socket_MSG_DONTROUTE" : C_Int.t; val MSG_DONTWAIT = _const "Socket_MSG_DONTWAIT" : C_Int.t; val MSG_EOR = _const "Socket_MSG_EOR" : C_Int.t; val MSG_OOB = _const "Socket_MSG_OOB" : C_Int.t; val MSG_PEEK = _const "Socket_MSG_PEEK" : C_Int.t; val MSG_TRUNC = _const "Socket_MSG_TRUNC" : C_Int.t; val MSG_WAITALL = _const "Socket_MSG_WAITALL" : C_Int.t; val recv = _import "Socket_recv" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val recvFrom = _import "Socket_recvFrom" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_SSize.t) C_Errno.t; val select = _import "Socket_select" private : (C_Fd.t) vector * (C_Fd.t) vector * (C_Fd.t) vector * (C_Int.t) array * (C_Int.t) array * (C_Int.t) array -> (C_Int.t) C_Errno.t; val sendArr = _import "Socket_sendArr" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendArrTo = _import "Socket_sendArrTo" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val sendVec = _import "Socket_sendVec" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendVecTo = _import "Socket_sendVecTo" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val setTimeout = _import "Socket_setTimeout" private : C_Time.t * C_SUSeconds.t -> unit; val setTimeoutNull = _import "Socket_setTimeoutNull" private : unit -> unit; val SHUT_RD = _const "Socket_SHUT_RD" : C_Int.t; val SHUT_RDWR = _const "Socket_SHUT_RDWR" : C_Int.t; val SHUT_WR = _const "Socket_SHUT_WR" : C_Int.t; val shutdown = _import "Socket_shutdown" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; structure SOCK = struct val DGRAM = _const "Socket_SOCK_DGRAM" : C_Int.t; val RAW = _const "Socket_SOCK_RAW" : C_Int.t; val SEQPACKET = _const "Socket_SOCK_SEQPACKET" : C_Int.t; val STREAM = _const "Socket_SOCK_STREAM" : C_Int.t; end val sockAddrStorageLen = _const "Socket_sockAddrStorageLen" : C_Size.t; structure UnixSock = struct val fromAddr = _import "Socket_UnixSock_fromAddr" private : (Word8.t) vector * (Char8.t) array * C_Size.t -> unit; val pathLen = _import "Socket_UnixSock_pathLen" private : (Word8.t) vector -> C_Size.t; val toAddr = _import "Socket_UnixSock_toAddr" private : NullString8.t * C_Size.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end end structure Stdio = struct val print = _import "Stdio_print" private : String8.t -> unit; val printStderr = _import "Stdio_printStderr" private : String8.t -> unit; val printStdout = _import "Stdio_printStdout" private : String8.t -> unit; end structure Time = struct val getTimeOfDay = _import "Time_getTimeOfDay" private : (C_Time.t) ref * (C_SUSeconds.t) ref -> C_Int.t; end structure Windows = struct structure Process = struct val create = _import "Windows_Process_create" private : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val createNull = _import "Windows_Process_createNull" private : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val getexitcode = _import "Windows_Process_getexitcode" private : C_PId.t * (C_Status.t) ref -> (C_Int.t) C_Errno.t; val terminate = _import "Windows_Process_terminate" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; end end structure Word16 = struct type t = Word16.t val add = _import "Word16_add" private inline : Word16.t * Word16.t -> Word16.t; val andb = _import "Word16_andb" private inline : Word16.t * Word16.t -> Word16.t; val equal = _import "Word16_equal" private inline : Word16.t * Word16.t -> Bool.t; val lshift = _import "Word16_lshift" private inline : Word16.t * Word32.t -> Word16.t; val neg = _import "Word16_neg" private inline : Word16.t -> Word16.t; val notb = _import "Word16_notb" private inline : Word16.t -> Word16.t; val orb = _import "Word16_orb" private inline : Word16.t * Word16.t -> Word16.t; val rol = _import "Word16_rol" private inline : Word16.t * Word32.t -> Word16.t; val ror = _import "Word16_ror" private inline : Word16.t * Word32.t -> Word16.t; val sub = _import "Word16_sub" private inline : Word16.t * Word16.t -> Word16.t; val xorb = _import "Word16_xorb" private inline : Word16.t * Word16.t -> Word16.t; end structure Word32 = struct type t = Word32.t val add = _import "Word32_add" private inline : Word32.t * Word32.t -> Word32.t; val andb = _import "Word32_andb" private inline : Word32.t * Word32.t -> Word32.t; val castToReal32 = _import "Word32_castToReal32" private inline : Word32.t -> Real32.t; val equal = _import "Word32_equal" private inline : Word32.t * Word32.t -> Bool.t; val lshift = _import "Word32_lshift" private inline : Word32.t * Word32.t -> Word32.t; val neg = _import "Word32_neg" private inline : Word32.t -> Word32.t; val notb = _import "Word32_notb" private inline : Word32.t -> Word32.t; val orb = _import "Word32_orb" private inline : Word32.t * Word32.t -> Word32.t; val rol = _import "Word32_rol" private inline : Word32.t * Word32.t -> Word32.t; val ror = _import "Word32_ror" private inline : Word32.t * Word32.t -> Word32.t; val sub = _import "Word32_sub" private inline : Word32.t * Word32.t -> Word32.t; val xorb = _import "Word32_xorb" private inline : Word32.t * Word32.t -> Word32.t; end structure Word64 = struct type t = Word64.t val add = _import "Word64_add" private inline : Word64.t * Word64.t -> Word64.t; val andb = _import "Word64_andb" private inline : Word64.t * Word64.t -> Word64.t; val castToReal64 = _import "Word64_castToReal64" private inline : Word64.t -> Real64.t; val equal = _import "Word64_equal" private inline : Word64.t * Word64.t -> Bool.t; val fetch = _import "Word64_fetch" private inline : (Word64.t) ref -> Word64.t; val lshift = _import "Word64_lshift" private inline : Word64.t * Word32.t -> Word64.t; val move = _import "Word64_move" private inline : (Word64.t) ref * (Word64.t) ref -> unit; val neg = _import "Word64_neg" private inline : Word64.t -> Word64.t; val notb = _import "Word64_notb" private inline : Word64.t -> Word64.t; val orb = _import "Word64_orb" private inline : Word64.t * Word64.t -> Word64.t; val rol = _import "Word64_rol" private inline : Word64.t * Word32.t -> Word64.t; val ror = _import "Word64_ror" private inline : Word64.t * Word32.t -> Word64.t; val store = _import "Word64_store" private inline : (Word64.t) ref * Word64.t -> unit; val sub = _import "Word64_sub" private inline : Word64.t * Word64.t -> Word64.t; val xorb = _import "Word64_xorb" private inline : Word64.t * Word64.t -> Word64.t; end structure Word8 = struct type t = Word8.t val add = _import "Word8_add" private inline : Word8.t * Word8.t -> Word8.t; val andb = _import "Word8_andb" private inline : Word8.t * Word8.t -> Word8.t; val equal = _import "Word8_equal" private inline : Word8.t * Word8.t -> Bool.t; val lshift = _import "Word8_lshift" private inline : Word8.t * Word32.t -> Word8.t; val neg = _import "Word8_neg" private inline : Word8.t -> Word8.t; val notb = _import "Word8_notb" private inline : Word8.t -> Word8.t; val orb = _import "Word8_orb" private inline : Word8.t * Word8.t -> Word8.t; val rol = _import "Word8_rol" private inline : Word8.t * Word32.t -> Word8.t; val ror = _import "Word8_ror" private inline : Word8.t * Word32.t -> Word8.t; val sub = _import "Word8_sub" private inline : Word8.t * Word8.t -> Word8.t; val xorb = _import "Word8_xorb" private inline : Word8.t * Word8.t -> Word8.t; end structure WordS16 = struct val addCheckP = _import "WordS16_addCheckP" private inline : Int16.t * Int16.t -> Bool.t; val extdToWord16 = _import "WordS16_extdToWord16" private inline : Int16.t -> Word16.t; val extdToWord32 = _import "WordS16_extdToWord32" private inline : Int16.t -> Word32.t; val extdToWord64 = _import "WordS16_extdToWord64" private inline : Int16.t -> Word64.t; val extdToWord8 = _import "WordS16_extdToWord8" private inline : Int16.t -> Word8.t; val ge = _import "WordS16_ge" private inline : Int16.t * Int16.t -> Bool.t; val gt = _import "WordS16_gt" private inline : Int16.t * Int16.t -> Bool.t; val le = _import "WordS16_le" private inline : Int16.t * Int16.t -> Bool.t; val lt = _import "WordS16_lt" private inline : Int16.t * Int16.t -> Bool.t; val mul = _import "WordS16_mul" private inline : Int16.t * Int16.t -> Int16.t; val mulCheckP = _import "WordS16_mulCheckP" private inline : Int16.t * Int16.t -> Bool.t; val negCheckP = _import "WordS16_negCheckP" private inline : Int16.t -> Bool.t; val quot = _import "WordS16_quot" private inline : Int16.t * Int16.t -> Int16.t; val rem = _import "WordS16_rem" private inline : Int16.t * Int16.t -> Int16.t; val rndToReal32 = _import "WordS16_rndToReal32" private : Int16.t -> Real32.t; val rndToReal64 = _import "WordS16_rndToReal64" private : Int16.t -> Real64.t; val rshift = _import "WordS16_rshift" private inline : Int16.t * Word32.t -> Int16.t; val subCheckP = _import "WordS16_subCheckP" private inline : Int16.t * Int16.t -> Bool.t; end structure WordS32 = struct val addCheckP = _import "WordS32_addCheckP" private inline : Int32.t * Int32.t -> Bool.t; val extdToWord16 = _import "WordS32_extdToWord16" private inline : Int32.t -> Word16.t; val extdToWord32 = _import "WordS32_extdToWord32" private inline : Int32.t -> Word32.t; val extdToWord64 = _import "WordS32_extdToWord64" private inline : Int32.t -> Word64.t; val extdToWord8 = _import "WordS32_extdToWord8" private inline : Int32.t -> Word8.t; val ge = _import "WordS32_ge" private inline : Int32.t * Int32.t -> Bool.t; val gt = _import "WordS32_gt" private inline : Int32.t * Int32.t -> Bool.t; val le = _import "WordS32_le" private inline : Int32.t * Int32.t -> Bool.t; val lt = _import "WordS32_lt" private inline : Int32.t * Int32.t -> Bool.t; val mul = _import "WordS32_mul" private inline : Int32.t * Int32.t -> Int32.t; val mulCheckP = _import "WordS32_mulCheckP" private inline : Int32.t * Int32.t -> Bool.t; val negCheckP = _import "WordS32_negCheckP" private inline : Int32.t -> Bool.t; val quot = _import "WordS32_quot" private inline : Int32.t * Int32.t -> Int32.t; val rem = _import "WordS32_rem" private inline : Int32.t * Int32.t -> Int32.t; val rndToReal32 = _import "WordS32_rndToReal32" private : Int32.t -> Real32.t; val rndToReal64 = _import "WordS32_rndToReal64" private : Int32.t -> Real64.t; val rshift = _import "WordS32_rshift" private inline : Int32.t * Word32.t -> Int32.t; val subCheckP = _import "WordS32_subCheckP" private inline : Int32.t * Int32.t -> Bool.t; end structure WordS64 = struct val addCheckP = _import "WordS64_addCheckP" private inline : Int64.t * Int64.t -> Bool.t; val extdToWord16 = _import "WordS64_extdToWord16" private inline : Int64.t -> Word16.t; val extdToWord32 = _import "WordS64_extdToWord32" private inline : Int64.t -> Word32.t; val extdToWord64 = _import "WordS64_extdToWord64" private inline : Int64.t -> Word64.t; val extdToWord8 = _import "WordS64_extdToWord8" private inline : Int64.t -> Word8.t; val ge = _import "WordS64_ge" private inline : Int64.t * Int64.t -> Bool.t; val gt = _import "WordS64_gt" private inline : Int64.t * Int64.t -> Bool.t; val le = _import "WordS64_le" private inline : Int64.t * Int64.t -> Bool.t; val lt = _import "WordS64_lt" private inline : Int64.t * Int64.t -> Bool.t; val mul = _import "WordS64_mul" private inline : Int64.t * Int64.t -> Int64.t; val mulCheckP = _import "WordS64_mulCheckP" private inline : Int64.t * Int64.t -> Bool.t; val negCheckP = _import "WordS64_negCheckP" private inline : Int64.t -> Bool.t; val quot = _import "WordS64_quot" private inline : Int64.t * Int64.t -> Int64.t; val rem = _import "WordS64_rem" private inline : Int64.t * Int64.t -> Int64.t; val rndToReal32 = _import "WordS64_rndToReal32" private : Int64.t -> Real32.t; val rndToReal64 = _import "WordS64_rndToReal64" private : Int64.t -> Real64.t; val rshift = _import "WordS64_rshift" private inline : Int64.t * Word32.t -> Int64.t; val subCheckP = _import "WordS64_subCheckP" private inline : Int64.t * Int64.t -> Bool.t; end structure WordS8 = struct val addCheckP = _import "WordS8_addCheckP" private inline : Int8.t * Int8.t -> Bool.t; val extdToWord16 = _import "WordS8_extdToWord16" private inline : Int8.t -> Word16.t; val extdToWord32 = _import "WordS8_extdToWord32" private inline : Int8.t -> Word32.t; val extdToWord64 = _import "WordS8_extdToWord64" private inline : Int8.t -> Word64.t; val extdToWord8 = _import "WordS8_extdToWord8" private inline : Int8.t -> Word8.t; val ge = _import "WordS8_ge" private inline : Int8.t * Int8.t -> Bool.t; val gt = _import "WordS8_gt" private inline : Int8.t * Int8.t -> Bool.t; val le = _import "WordS8_le" private inline : Int8.t * Int8.t -> Bool.t; val lt = _import "WordS8_lt" private inline : Int8.t * Int8.t -> Bool.t; val mul = _import "WordS8_mul" private inline : Int8.t * Int8.t -> Int8.t; val mulCheckP = _import "WordS8_mulCheckP" private inline : Int8.t * Int8.t -> Bool.t; val negCheckP = _import "WordS8_negCheckP" private inline : Int8.t -> Bool.t; val quot = _import "WordS8_quot" private inline : Int8.t * Int8.t -> Int8.t; val rem = _import "WordS8_rem" private inline : Int8.t * Int8.t -> Int8.t; val rndToReal32 = _import "WordS8_rndToReal32" private : Int8.t -> Real32.t; val rndToReal64 = _import "WordS8_rndToReal64" private : Int8.t -> Real64.t; val rshift = _import "WordS8_rshift" private inline : Int8.t * Word32.t -> Int8.t; val subCheckP = _import "WordS8_subCheckP" private inline : Int8.t * Int8.t -> Bool.t; end structure WordU16 = struct val addCheckP = _import "WordU16_addCheckP" private inline : Word16.t * Word16.t -> Bool.t; val extdToWord16 = _import "WordU16_extdToWord16" private inline : Word16.t -> Word16.t; val extdToWord32 = _import "WordU16_extdToWord32" private inline : Word16.t -> Word32.t; val extdToWord64 = _import "WordU16_extdToWord64" private inline : Word16.t -> Word64.t; val extdToWord8 = _import "WordU16_extdToWord8" private inline : Word16.t -> Word8.t; val ge = _import "WordU16_ge" private inline : Word16.t * Word16.t -> Bool.t; val gt = _import "WordU16_gt" private inline : Word16.t * Word16.t -> Bool.t; val le = _import "WordU16_le" private inline : Word16.t * Word16.t -> Bool.t; val lt = _import "WordU16_lt" private inline : Word16.t * Word16.t -> Bool.t; val mul = _import "WordU16_mul" private inline : Word16.t * Word16.t -> Word16.t; val mulCheckP = _import "WordU16_mulCheckP" private inline : Word16.t * Word16.t -> Bool.t; val negCheckP = _import "WordU16_negCheckP" private inline : Word16.t -> Bool.t; val quot = _import "WordU16_quot" private inline : Word16.t * Word16.t -> Word16.t; val rem = _import "WordU16_rem" private inline : Word16.t * Word16.t -> Word16.t; val rndToReal32 = _import "WordU16_rndToReal32" private : Word16.t -> Real32.t; val rndToReal64 = _import "WordU16_rndToReal64" private : Word16.t -> Real64.t; val rshift = _import "WordU16_rshift" private inline : Word16.t * Word32.t -> Word16.t; val subCheckP = _import "WordU16_subCheckP" private inline : Word16.t * Word16.t -> Bool.t; end structure WordU32 = struct val addCheckP = _import "WordU32_addCheckP" private inline : Word32.t * Word32.t -> Bool.t; val extdToWord16 = _import "WordU32_extdToWord16" private inline : Word32.t -> Word16.t; val extdToWord32 = _import "WordU32_extdToWord32" private inline : Word32.t -> Word32.t; val extdToWord64 = _import "WordU32_extdToWord64" private inline : Word32.t -> Word64.t; val extdToWord8 = _import "WordU32_extdToWord8" private inline : Word32.t -> Word8.t; val ge = _import "WordU32_ge" private inline : Word32.t * Word32.t -> Bool.t; val gt = _import "WordU32_gt" private inline : Word32.t * Word32.t -> Bool.t; val le = _import "WordU32_le" private inline : Word32.t * Word32.t -> Bool.t; val lt = _import "WordU32_lt" private inline : Word32.t * Word32.t -> Bool.t; val mul = _import "WordU32_mul" private inline : Word32.t * Word32.t -> Word32.t; val mulCheckP = _import "WordU32_mulCheckP" private inline : Word32.t * Word32.t -> Bool.t; val negCheckP = _import "WordU32_negCheckP" private inline : Word32.t -> Bool.t; val quot = _import "WordU32_quot" private inline : Word32.t * Word32.t -> Word32.t; val rem = _import "WordU32_rem" private inline : Word32.t * Word32.t -> Word32.t; val rndToReal32 = _import "WordU32_rndToReal32" private : Word32.t -> Real32.t; val rndToReal64 = _import "WordU32_rndToReal64" private : Word32.t -> Real64.t; val rshift = _import "WordU32_rshift" private inline : Word32.t * Word32.t -> Word32.t; val subCheckP = _import "WordU32_subCheckP" private inline : Word32.t * Word32.t -> Bool.t; end structure WordU64 = struct val addCheckP = _import "WordU64_addCheckP" private inline : Word64.t * Word64.t -> Bool.t; val extdToWord16 = _import "WordU64_extdToWord16" private inline : Word64.t -> Word16.t; val extdToWord32 = _import "WordU64_extdToWord32" private inline : Word64.t -> Word32.t; val extdToWord64 = _import "WordU64_extdToWord64" private inline : Word64.t -> Word64.t; val extdToWord8 = _import "WordU64_extdToWord8" private inline : Word64.t -> Word8.t; val ge = _import "WordU64_ge" private inline : Word64.t * Word64.t -> Bool.t; val gt = _import "WordU64_gt" private inline : Word64.t * Word64.t -> Bool.t; val le = _import "WordU64_le" private inline : Word64.t * Word64.t -> Bool.t; val lt = _import "WordU64_lt" private inline : Word64.t * Word64.t -> Bool.t; val mul = _import "WordU64_mul" private inline : Word64.t * Word64.t -> Word64.t; val mulCheckP = _import "WordU64_mulCheckP" private inline : Word64.t * Word64.t -> Bool.t; val negCheckP = _import "WordU64_negCheckP" private inline : Word64.t -> Bool.t; val quot = _import "WordU64_quot" private inline : Word64.t * Word64.t -> Word64.t; val rem = _import "WordU64_rem" private inline : Word64.t * Word64.t -> Word64.t; val rndToReal32 = _import "WordU64_rndToReal32" private : Word64.t -> Real32.t; val rndToReal64 = _import "WordU64_rndToReal64" private : Word64.t -> Real64.t; val rshift = _import "WordU64_rshift" private inline : Word64.t * Word32.t -> Word64.t; val subCheckP = _import "WordU64_subCheckP" private inline : Word64.t * Word64.t -> Bool.t; end structure WordU8 = struct val addCheckP = _import "WordU8_addCheckP" private inline : Word8.t * Word8.t -> Bool.t; val extdToWord16 = _import "WordU8_extdToWord16" private inline : Word8.t -> Word16.t; val extdToWord32 = _import "WordU8_extdToWord32" private inline : Word8.t -> Word32.t; val extdToWord64 = _import "WordU8_extdToWord64" private inline : Word8.t -> Word64.t; val extdToWord8 = _import "WordU8_extdToWord8" private inline : Word8.t -> Word8.t; val ge = _import "WordU8_ge" private inline : Word8.t * Word8.t -> Bool.t; val gt = _import "WordU8_gt" private inline : Word8.t * Word8.t -> Bool.t; val le = _import "WordU8_le" private inline : Word8.t * Word8.t -> Bool.t; val lt = _import "WordU8_lt" private inline : Word8.t * Word8.t -> Bool.t; val mul = _import "WordU8_mul" private inline : Word8.t * Word8.t -> Word8.t; val mulCheckP = _import "WordU8_mulCheckP" private inline : Word8.t * Word8.t -> Bool.t; val negCheckP = _import "WordU8_negCheckP" private inline : Word8.t -> Bool.t; val quot = _import "WordU8_quot" private inline : Word8.t * Word8.t -> Word8.t; val rem = _import "WordU8_rem" private inline : Word8.t * Word8.t -> Word8.t; val rndToReal32 = _import "WordU8_rndToReal32" private : Word8.t -> Real32.t; val rndToReal64 = _import "WordU8_rndToReal64" private : Word8.t -> Real64.t; val rshift = _import "WordU8_rshift" private inline : Word8.t * Word32.t -> Word8.t; val subCheckP = _import "WordU8_subCheckP" private inline : Word8.t * Word8.t -> Bool.t; end end end mlton-20210117+dfsg/basis-library/primitive/check-real.sml000066400000000000000000000064431416264345000233230ustar00rootroot00000000000000(* Copyright (C) 2012,2013,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local fun 'a check (_: 'a, _: 'a) : unit = () local structure R1 = Primitive.Real32 structure R2 = PrimitiveFFI.Real32 in val () = check (R1.Math.acos, R2.Math.acos) val () = check (R1.Math.asin, R2.Math.asin) val () = check (R1.Math.atan, R2.Math.atan) val () = check (R1.Math.atan2, R2.Math.atan2) val () = check (R1.Math.cos, R2.Math.cos) val () = check (R1.Math.cosh, R2.Math.cosh) val () = check (R1.Math.exp, R2.Math.exp) val () = check (R1.Math.ln, R2.Math.ln) val () = check (R1.Math.log10, R2.Math.log10) val () = check (R1.Math.pow, R2.Math.pow) val () = check (R1.Math.sin, R2.Math.sin) val () = check (R1.Math.sinh, R2.Math.sinh) val () = check (R1.Math.sqrt, R2.Math.sqrt) val () = check (R1.Math.tan, R2.Math.tan) val () = check (R1.Math.tanh, R2.Math.tanh) val () = check (R1.abs, R2.abs) val () = check (R1.+, R2.add) val () = check (R1./, R2.div) val () = check (R1.==, R2.equal) val () = check (R1.frexp, R2.frexp) val () = check (R1.gdtoa, R2.gdtoa) val () = check (R1.ldexp, R2.ldexp) val () = check (R1.<=, R2.le) val () = check (R1.<, R2.lt) val () = check (R1.modf, R2.modf) val () = check (R1.*, R2.mul) val () = check (R1.*+, R2.muladd) val () = check (R1.*-, R2.mulsub) val () = check (R1.~, R2.neg) val () = check (R1.round, R2.round) val () = check (R1.strtor, R2.strtor) val () = check (R1.-, R2.sub) end local structure R1 = Primitive.Real64 structure R2 = PrimitiveFFI.Real64 in val () = check (R1.Math.acos, R2.Math.acos) val () = check (R1.Math.asin, R2.Math.asin) val () = check (R1.Math.atan, R2.Math.atan) val () = check (R1.Math.atan2, R2.Math.atan2) val () = check (R1.Math.cos, R2.Math.cos) val () = check (R1.Math.cosh, R2.Math.cosh) val () = check (R1.Math.exp, R2.Math.exp) val () = check (R1.Math.ln, R2.Math.ln) val () = check (R1.Math.log10, R2.Math.log10) val () = check (R1.Math.pow, R2.Math.pow) val () = check (R1.Math.sin, R2.Math.sin) val () = check (R1.Math.sinh, R2.Math.sinh) val () = check (R1.Math.sqrt, R2.Math.sqrt) val () = check (R1.Math.tan, R2.Math.tan) val () = check (R1.Math.tanh, R2.Math.tanh) val () = check (R1.abs, R2.abs) val () = check (R1.+, R2.add) val () = check (R1./, R2.div) val () = check (R1.==, R2.equal) val () = check (R1.frexp, R2.frexp) val () = check (R1.gdtoa, R2.gdtoa) val () = check (R1.ldexp, R2.ldexp) val () = check (R1.<=, R2.le) val () = check (R1.<, R2.lt) val () = check (R1.modf, R2.modf) val () = check (R1.*, R2.mul) val () = check (R1.*+, R2.muladd) val () = check (R1.*-, R2.mulsub) val () = check (R1.~, R2.neg) val () = check (R1.round, R2.round) val () = check (R1.strtor, R2.strtor) val () = check (R1.-, R2.sub) end in end mlton-20210117+dfsg/basis-library/primitive/prim-basis.mlb000066400000000000000000000007051416264345000233450ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "allowPrim true" "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" in local _prim in prim-basis.sml end end mlton-20210117+dfsg/basis-library/primitive/prim-basis.sml000066400000000000000000000163011416264345000233650ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Primitive = struct (* Primitive Basis (Definition) *) structure Bool = struct datatype t = datatype bool datatype bool = datatype t end structure Exn = struct type t = exn type exn = t exception Bind = Bind exception Match = Match end structure List = struct datatype t = datatype list datatype list = datatype t end structure Ref = struct datatype t = datatype ref datatype ref = datatype t end structure Unit = struct type t = unit type unit = t end (* Primitive Basis (Basis Library) *) structure Array = struct type 'a t = 'a array type 'a array = 'a t end structure Vector = struct type 'a t = 'a vector type 'a vector = 'a t end (* Primitive Basis (Primitive Types) *) structure Char8 = struct type t = char8 type char = t end structure Char16 = struct type t = char16 type char = t end structure Char32 = struct type t = char32 type char = t end structure Int1 = struct type t = int1 type int = t end structure Int2 = struct type t = int2 type int = t end structure Int3 = struct type t = int3 type int = t end structure Int4 = struct type t = int4 type int = t end structure Int5 = struct type t = int5 type int = t end structure Int6 = struct type t = int6 type int = t end structure Int7 = struct type t = int7 type int = t end structure Int8 = struct type t = int8 type int = t end structure Int9 = struct type t = int9 type int = t end structure Int10 = struct type t = int10 type int = t end structure Int11 = struct type t = int11 type int = t end structure Int12 = struct type t = int12 type int = t end structure Int13 = struct type t = int13 type int = t end structure Int14 = struct type t = int14 type int = t end structure Int15 = struct type t = int15 type int = t end structure Int16 = struct type t = int16 type int = t end structure Int17 = struct type t = int17 type int = t end structure Int18 = struct type t = int18 type int = t end structure Int19 = struct type t = int19 type int = t end structure Int20 = struct type t = int20 type int = t end structure Int21 = struct type t = int21 type int = t end structure Int22 = struct type t = int22 type int = t end structure Int23 = struct type t = int23 type int = t end structure Int24 = struct type t = int24 type int = t end structure Int25 = struct type t = int25 type int = t end structure Int26 = struct type t = int26 type int = t end structure Int27 = struct type t = int27 type int = t end structure Int28 = struct type t = int28 type int = t end structure Int29 = struct type t = int29 type int = t end structure Int30 = struct type t = int30 type int = t end structure Int31 = struct type t = int31 type int = t end structure Int32 = struct type t = int32 type int = t end structure Int64 = struct type t = int64 type int = t end structure IntInf = struct type t = intInf type int = t end structure Real32 = struct type t = real32 type real = t end structure Real64 = struct type t = real64 type real = t end structure String8 = struct type t = Char8.t vector type string = t end structure String16 = struct type t = Char16.t vector type string = t end structure String32 = struct type t = Char32.t vector type string = t end structure Word1 = struct type t = word1 type word = t end structure Word2 = struct type t = word2 type word = t end structure Word3 = struct type t = word3 type word = t end structure Word4 = struct type t = word4 type word = t end structure Word5 = struct type t = word5 type word = t end structure Word6 = struct type t = word6 type word = t end structure Word7 = struct type t = word7 type word = t end structure Word8 = struct type t = word8 type word = t end structure Word9 = struct type t = word9 type word = t end structure Word10 = struct type t = word10 type word = t end structure Word11 = struct type t = word11 type word = t end structure Word12 = struct type t = word12 type word = t end structure Word13 = struct type t = word13 type word = t end structure Word14 = struct type t = word14 type word = t end structure Word15 = struct type t = word15 type word = t end structure Word16 = struct type t = word16 type word = t end structure Word17 = struct type t = word17 type word = t end structure Word18 = struct type t = word18 type word = t end structure Word19 = struct type t = word19 type word = t end structure Word20 = struct type t = word20 type word = t end structure Word21 = struct type t = word21 type word = t end structure Word22 = struct type t = word22 type word = t end structure Word23 = struct type t = word23 type word = t end structure Word24 = struct type t = word24 type word = t end structure Word25 = struct type t = word25 type word = t end structure Word26 = struct type t = word26 type word = t end structure Word27 = struct type t = word27 type word = t end structure Word28 = struct type t = word28 type word = t end structure Word29 = struct type t = word29 type word = t end structure Word30 = struct type t = word30 type word = t end structure Word31 = struct type t = word31 type word = t end structure Word32 = struct type t = word32 type word = t end structure Word64 = struct type t = word64 type word = t end (* Primitive Basis (MLton Extensions) *) structure Pointer = struct type t = cpointer end structure Thread = struct type t = thread end structure Weak = struct type 'a t = 'a weak end end (* Top-level bindings *) datatype bool = datatype Primitive.Bool.bool type exn = Primitive.Exn.exn datatype list = datatype Primitive.List.list datatype ref = datatype Primitive.Ref.ref type unit = Primitive.Unit.unit type 'a array = 'a Primitive.Array.array type 'a vector = 'a Primitive.Vector.vector mlton-20210117+dfsg/basis-library/primitive/prim-char.sml000066400000000000000000000037371416264345000232120ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure Char8 = struct open Char8 val < = _prim "WordU8_lt": char * char -> bool; val idToWord8 = _prim "WordU8_extdToWord8": char -> Word8.word; val idFromWord8 = _prim "WordU8_extdToWord8": Word8.word -> char; val idToInt8 = _prim "WordS8_extdToWord8": char -> Int8.int; val idFromInt8 = _prim "WordS8_extdToWord8": Int8.int -> char; end structure Char8 = struct open Char8 local structure S = IntegralComparisons(Char8) in open S end end structure Char16 = struct open Char16 val < = _prim "WordU16_lt": char * char -> bool; val idToWord16 = _prim "WordU16_extdToWord16": char -> Word16.word; val idFromWord16 = _prim "WordU16_extdToWord16": Word16.word -> char; val idToInt16 = _prim "WordS16_extdToWord16": char -> Int16.int; val idFromInt16 = _prim "WordS16_extdToWord16": Int16.int -> char; end structure Char16 = struct open Char16 local structure S = IntegralComparisons(Char16) in open S end end structure Char32 = struct open Char32 val < = _prim "WordU32_lt": char * char -> bool; val idToWord32 = _prim "WordU32_extdToWord32": char -> Word32.word; val idFromWord32 = _prim "WordU32_extdToWord32": Word32.word -> char; val idToInt32 = _prim "WordS32_extdToWord32": char -> Int32.int; val idFromInt32 = _prim "WordS32_extdToWord32": Int32.int -> char; end structure Char32 = struct open Char32 local structure S = IntegralComparisons(Char32) in open S end end end mlton-20210117+dfsg/basis-library/primitive/prim-int-inf.sml000066400000000000000000000032751416264345000236360ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure IntInf = struct open IntInf val + = _prim "IntInf_add": int * int * C_Size.t -> int; val andb = _prim "IntInf_andb": int * int * C_Size.t -> int; val ~>> = _prim "IntInf_arshift": int * Word32.word * C_Size.t -> int; val compare = _prim "IntInf_compare": int * int -> Int32.int; val fromVector = _prim "WordVector_toIntInf": C_MPLimb.t vector -> int; val fromWord = _prim "Word_toIntInf": ObjptrWord.word -> int; val gcd = _prim "IntInf_gcd": int * int * C_Size.t -> int; val << = _prim "IntInf_lshift": int * Word32.word * C_Size.t -> int; val * = _prim "IntInf_mul": int * int * C_Size.t -> int; val ~ = _prim "IntInf_neg": int * C_Size.t -> int; val notb = _prim "IntInf_notb": int * C_Size.t -> int; val orb = _prim "IntInf_orb": int * int * C_Size.t -> int; val quot = _prim "IntInf_quot": int * int * C_Size.t -> int; val rem = _prim "IntInf_rem": int * int * C_Size.t -> int; val - = _prim "IntInf_sub": int * int * C_Size.t -> int; val toString = _prim "IntInf_toString": int * Int32.int * C_Size.t -> String8.string; val toVector = _prim "IntInf_toVector": int -> C_MPLimb.t vector; val toWord = _prim "IntInf_toWord": int -> ObjptrWord.word; val xorb = _prim "IntInf_xorb": int * int * C_Size.t -> int; end end mlton-20210117+dfsg/basis-library/primitive/prim-int.sml000066400000000000000000000333251416264345000230630ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_INTEGER = sig eqtype int type t = int val sizeInBits: Primitive.Int32.int val sizeInBitsWord: Primitive.Word32.word val precision: Primitive.Int32.int option val +? : int * int -> bool val +! : int * int -> int val +$ : int * int -> int val + : int * int -> int val *? : int * int -> bool val *! : int * int -> int val *$ : int * int -> int val * : int * int -> int val ~? : int -> bool val ~! : int -> int val ~$ : int -> int val ~ : int -> int val quotUnsafe: int * int -> int val -? : int * int -> bool val -! : int * int -> int val -$ : int * int -> int val - : int * int -> int val remUnsafe: int * int -> int val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val compare: int * int -> Primitive.Order.order val min: int * int -> int val max: int * int -> int end structure Primitive = struct open Primitive structure Int1 = struct open Int1 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord1": big -> int; val sizeInBits: Int32.int = 1 val toBig = _prim "WordU1_extdToWord8": int -> big; end structure Int2 = struct open Int2 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord2": big -> int; val sizeInBits: Int32.int = 2 val toBig = _prim "WordU2_extdToWord8": int -> big; end structure Int3 = struct open Int3 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord3": big -> int; val sizeInBits: Int32.int = 3 val toBig = _prim "WordU3_extdToWord8": int -> big; end structure Int4 = struct open Int4 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord4": big -> int; val sizeInBits: Int32.int = 4 val toBig = _prim "WordU4_extdToWord8": int -> big; end structure Int5 = struct open Int5 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord5": big -> int; val sizeInBits: Int32.int = 5 val toBig = _prim "WordU5_extdToWord8": int -> big; end structure Int6 = struct open Int6 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord6": big -> int; val sizeInBits: Int32.int = 6 val toBig = _prim "WordU6_extdToWord8": int -> big; end structure Int7 = struct open Int7 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord7": big -> int; val sizeInBits: Int32.int = 7 val toBig = _prim "WordU7_extdToWord8": int -> big; end structure Int8 = struct open Int8 val sizeInBits: Int32.int = 8 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +? = _prim "WordS8_addCheckP": int * int -> bool; val +! = _prim "Word8_add": int * int -> int; val +$ = Exn.mkOverflow (+!, +?) val + = if Controls.detectOverflow then +$ else +! val *? = _prim "WordS8_mulCheckP": int * int -> bool; val *! = _prim "WordS8_mul": int * int -> int; val *$ = Exn.mkOverflow ( *!, *? ) val * = if Controls.detectOverflow then *$ else *! val ~? = _prim "WordS8_negCheckP": int -> bool; val ~! = _prim "Word8_neg": int -> int; val ~$ = Exn.mkOverflow (~!, ~?) val ~ = if Controls.detectOverflow then ~$ else ~! val quotUnsafe = _prim "WordS8_quot": int * int -> int; val -? = _prim "WordS8_subCheckP": int * int -> bool; val -! = _prim "Word8_sub": int * int -> int; val -$ = Exn.mkOverflow (-!, -?) val - = if Controls.detectOverflow then -$ else -! val remUnsafe = _prim "WordS8_rem": int * int -> int; val < = _prim "WordS8_lt": int * int -> bool; end structure Int8 : PRIM_INTEGER = struct open Int8 local structure S = IntegralComparisons(Int8) in open S end end structure Int9 = struct open Int9 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord9": big -> int; val sizeInBits: Int32.int = 9 val toBig = _prim "WordU9_extdToWord16": int -> big; end structure Int10 = struct open Int10 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord10": big -> int; val sizeInBits: Int32.int = 10 val toBig = _prim "WordU10_extdToWord16": int -> big; end structure Int11 = struct open Int11 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord11": big -> int; val sizeInBits: Int32.int = 11 val toBig = _prim "WordU11_extdToWord16": int -> big; end structure Int12 = struct open Int12 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord12": big -> int; val sizeInBits: Int32.int = 12 val toBig = _prim "WordU12_extdToWord16": int -> big; end structure Int13 = struct open Int13 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord13": big -> int; val sizeInBits: Int32.int = 13 val toBig = _prim "WordU13_extdToWord16": int -> big; end structure Int14 = struct open Int14 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord14": big -> int; val sizeInBits: Int32.int = 14 val toBig = _prim "WordU14_extdToWord16": int -> big; end structure Int15 = struct open Int15 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord15": big -> int; val sizeInBits: Int32.int = 15 val toBig = _prim "WordU15_extdToWord16": int -> big; end structure Int16 = struct open Int16 val sizeInBits: Int32.int = 16 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +? = _prim "WordS16_addCheckP": int * int -> bool; val +! = _prim "Word16_add": int * int -> int; val +$ = Exn.mkOverflow (+!, +?) val + = if Controls.detectOverflow then +$ else +! val *? = _prim "WordS16_mulCheckP": int * int -> bool; val *! = _prim "WordS16_mul": int * int -> int; val *$ = Exn.mkOverflow ( *!, *? ) val * = if Controls.detectOverflow then *$ else *! val ~? = _prim "WordS16_negCheckP": int -> bool; val ~! = _prim "Word16_neg": int -> int; val ~$ = Exn.mkOverflow (~!, ~?) val ~ = if Controls.detectOverflow then ~$ else ~! val quotUnsafe = _prim "WordS16_quot": int * int -> int; val -? = _prim "WordS16_subCheckP": int * int -> bool; val -! = _prim "Word16_sub": int * int -> int; val -$ = Exn.mkOverflow (-!, -?) val - = if Controls.detectOverflow then -$ else -! val remUnsafe = _prim "WordS16_rem": int * int -> int; val < = _prim "WordS16_lt": int * int -> bool; end structure Int16 : PRIM_INTEGER = struct open Int16 local structure S = IntegralComparisons(Int16) in open S end end structure Int17 = struct open Int17 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord17": big -> int; val sizeInBits: Int32.int = 17 val toBig = _prim "WordU17_extdToWord32": int -> big; end structure Int18 = struct open Int18 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord18": big -> int; val sizeInBits: Int32.int = 18 val toBig = _prim "WordU18_extdToWord32": int -> big; end structure Int19 = struct open Int19 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord19": big -> int; val sizeInBits: Int32.int = 19 val toBig = _prim "WordU19_extdToWord32": int -> big; end structure Int20 = struct open Int20 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord20": big -> int; val sizeInBits: Int32.int = 20 val toBig = _prim "WordU20_extdToWord32": int -> big; end structure Int21 = struct open Int21 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord21": big -> int; val sizeInBits: Int32.int = 21 val toBig = _prim "WordU21_extdToWord32": int -> big; end structure Int22 = struct open Int22 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord22": big -> int; val sizeInBits: Int32.int = 22 val toBig = _prim "WordU22_extdToWord32": int -> big; end structure Int23 = struct open Int23 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord23": big -> int; val sizeInBits: Int32.int = 23 val toBig = _prim "WordU23_extdToWord32": int -> big; end structure Int24 = struct open Int24 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord24": big -> int; val sizeInBits: Int32.int = 24 val toBig = _prim "WordU24_extdToWord32": int -> big; end structure Int25 = struct open Int25 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord25": big -> int; val sizeInBits: Int32.int = 25 val toBig = _prim "WordU25_extdToWord32": int -> big; end structure Int26 = struct open Int26 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord26": big -> int; val sizeInBits: Int32.int = 26 val toBig = _prim "WordU26_extdToWord32": int -> big; end structure Int27 = struct open Int27 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord27": big -> int; val sizeInBits: Int32.int = 27 val toBig = _prim "WordU27_extdToWord32": int -> big; end structure Int28 = struct open Int28 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord28": big -> int; val sizeInBits: Int32.int = 28 val toBig = _prim "WordU28_extdToWord32": int -> big; end structure Int29 = struct open Int29 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord29": big -> int; val sizeInBits: Int32.int = 29 val toBig = _prim "WordU29_extdToWord32": int -> big; end structure Int30 = struct open Int30 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord30": big -> int; val sizeInBits: Int32.int = 30 val toBig = _prim "WordU30_extdToWord32": int -> big; end structure Int31 = struct open Int31 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord31": big -> int; val sizeInBits: Int32.int = 31 val toBig = _prim "WordU31_extdToWord32": int -> big; end structure Int32 = struct open Int32 val sizeInBits: Int32.int = 32 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +? = _prim "WordS32_addCheckP": int * int -> bool; val +! = _prim "Word32_add": int * int -> int; val +$ = Exn.mkOverflow (+!, +?) val + = if Controls.detectOverflow then +$ else +! val *? = _prim "WordS32_mulCheckP": int * int -> bool; val *! = _prim "WordS32_mul": int * int -> int; val *$ = Exn.mkOverflow ( *!, *? ) val * = if Controls.detectOverflow then *$ else *! val ~? = _prim "WordS32_negCheckP": int -> bool; val ~! = _prim "Word32_neg": int -> int; val ~$ = Exn.mkOverflow (~!, ~?) val ~ = if Controls.detectOverflow then ~$ else ~! val quotUnsafe = _prim "WordS32_quot": int * int -> int; val -? = _prim "WordS32_subCheckP": int * int -> bool; val -! = _prim "Word32_sub": int * int -> int; val -$ = Exn.mkOverflow (-!, -?) val - = if Controls.detectOverflow then -$ else -! val remUnsafe = _prim "WordS32_rem": int * int -> int; val < = _prim "WordS32_lt": int * int -> bool; end structure Int32 : PRIM_INTEGER = struct open Int32 local structure S = IntegralComparisons(Int32) in open S end end structure Int64 = struct open Int64 val sizeInBits: Int32.int = 64 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +? = _prim "WordS64_addCheckP": int * int -> bool; val +! = _prim "Word64_add": int * int -> int; val +$ = Exn.mkOverflow (+!, +?) val + = if Controls.detectOverflow then +$ else +! val *? = _prim "WordS64_mulCheckP": int * int -> bool; val *! = _prim "WordS64_mul": int * int -> int; val *$ = Exn.mkOverflow ( *!, *? ) val * = if Controls.detectOverflow then *$ else *! val ~? = _prim "WordS64_negCheckP": int -> bool; val ~! = _prim "Word64_neg": int -> int; val ~$ = Exn.mkOverflow (~!, ~?) val ~ = if Controls.detectOverflow then ~$ else ~! val quotUnsafe = _prim "WordS64_quot": int * int -> int; val -? = _prim "WordS64_subCheckP": int * int -> bool; val -! = _prim "Word64_sub": int * int -> int; val -$ = Exn.mkOverflow (-!, -?) val - = if Controls.detectOverflow then -$ else -! val remUnsafe = _prim "WordS64_rem": int * int -> int; val < = _prim "WordS64_lt": int * int -> bool; end structure Int64 : PRIM_INTEGER = struct open Int64 local structure S = IntegralComparisons(Int64) in open S end end end mlton-20210117+dfsg/basis-library/primitive/prim-iwconv.sml000066400000000000000000000626251416264345000236030ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_INTWORD_CONV = sig (* identity *) val idFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val idFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val idFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val idFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val idFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val idFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val idFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val idFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val idFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val idFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val idFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val idFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val idFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val idFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val idFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val idFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* zero-extend or low-bits *) val zextdFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val zextdFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val zextdFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val zextdFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val zextdFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val zextdFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val zextdFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val zextdFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val zextdFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val zextdFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val zextdFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val zextdFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val zextdFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val zextdFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val zextdFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val zextdFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val zextdFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val zextdFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val zextdFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val zextdFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val zextdFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val zextdFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val zextdFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val zextdFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val zextdFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val zextdFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val zextdFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val zextdFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val zextdFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val zextdFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val zextdFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val zextdFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val zextdFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val zextdFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val zextdFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val zextdFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val zextdFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val zextdFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val zextdFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val zextdFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val zextdFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val zextdFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val zextdFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val zextdFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val zextdFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val zextdFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val zextdFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val zextdFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val zextdFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val zextdFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val zextdFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val zextdFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val zextdFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val zextdFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val zextdFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val zextdFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val zextdFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val zextdFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val zextdFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val zextdFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val zextdFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val zextdFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val zextdFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val zextdFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* sign-extend or low-bits *) val sextdFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val sextdFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val sextdFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val sextdFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val sextdFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val sextdFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val sextdFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val sextdFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val sextdFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val sextdFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val sextdFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val sextdFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val sextdFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val sextdFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val sextdFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val sextdFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val sextdFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val sextdFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val sextdFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val sextdFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val sextdFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val sextdFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val sextdFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val sextdFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val sextdFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val sextdFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val sextdFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val sextdFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val sextdFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val sextdFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val sextdFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val sextdFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val sextdFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val sextdFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val sextdFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val sextdFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val sextdFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val sextdFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val sextdFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val sextdFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val sextdFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val sextdFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val sextdFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val sextdFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val sextdFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val sextdFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val sextdFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val sextdFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val sextdFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val sextdFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val sextdFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val sextdFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val sextdFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val sextdFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val sextdFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val sextdFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val sextdFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val sextdFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val sextdFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val sextdFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val sextdFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val sextdFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val sextdFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val sextdFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word end structure Primitive = struct open Primitive structure IntWordConv : PRIM_INTWORD_CONV = struct (* identity *) val idFromInt8ToInt8 = _prim "WordU8_extdToWord8": Int8.int -> Int8.int; val idFromInt8ToWord8 = _prim "WordU8_extdToWord8": Int8.int -> Word8.word; val idFromInt16ToInt16 = _prim "WordU16_extdToWord16": Int16.int -> Int16.int; val idFromInt16ToWord16 = _prim "WordU16_extdToWord16": Int16.int -> Word16.word; val idFromInt32ToInt32 = _prim "WordU32_extdToWord32": Int32.int -> Int32.int; val idFromInt32ToWord32 = _prim "WordU32_extdToWord32": Int32.int -> Word32.word; val idFromInt64ToInt64 = _prim "WordU64_extdToWord64": Int64.int -> Int64.int; val idFromInt64ToWord64 = _prim "WordU64_extdToWord64": Int64.int -> Word64.word; val idFromWord8ToInt8 = _prim "WordU8_extdToWord8": Word8.word -> Int8.int; val idFromWord8ToWord8 = _prim "WordU8_extdToWord8": Word8.word -> Word8.word; val idFromWord16ToInt16 = _prim "WordU16_extdToWord16": Word16.word -> Int16.int; val idFromWord16ToWord16 = _prim "WordU16_extdToWord16": Word16.word -> Word16.word; val idFromWord32ToInt32 = _prim "WordU32_extdToWord32": Word32.word -> Int32.int; val idFromWord32ToWord32 = _prim "WordU32_extdToWord32": Word32.word -> Word32.word; val idFromWord64ToInt64 = _prim "WordU64_extdToWord64": Word64.word -> Int64.int; val idFromWord64ToWord64 = _prim "WordU64_extdToWord64": Word64.word -> Word64.word; (* zero-extend or low-bits *) val zextdFromInt8ToInt8 = _prim "WordU8_extdToWord8": Int8.int -> Int8.int; val zextdFromInt8ToInt16 = _prim "WordU8_extdToWord16": Int8.int -> Int16.int; val zextdFromInt8ToInt32 = _prim "WordU8_extdToWord32": Int8.int -> Int32.int; val zextdFromInt8ToInt64 = _prim "WordU8_extdToWord64": Int8.int -> Int64.int; val zextdFromInt8ToWord8 = _prim "WordU8_extdToWord8": Int8.int -> Word8.word; val zextdFromInt8ToWord16 = _prim "WordU8_extdToWord16": Int8.int -> Word16.word; val zextdFromInt8ToWord32 = _prim "WordU8_extdToWord32": Int8.int -> Word32.word; val zextdFromInt8ToWord64 = _prim "WordU8_extdToWord64": Int8.int -> Word64.word; val zextdFromInt16ToInt8 = _prim "WordU16_extdToWord8": Int16.int -> Int8.int; val zextdFromInt16ToInt16 = _prim "WordU16_extdToWord16": Int16.int -> Int16.int; val zextdFromInt16ToInt32 = _prim "WordU16_extdToWord32": Int16.int -> Int32.int; val zextdFromInt16ToInt64 = _prim "WordU16_extdToWord64": Int16.int -> Int64.int; val zextdFromInt16ToWord8 = _prim "WordU16_extdToWord8": Int16.int -> Word8.word; val zextdFromInt16ToWord16 = _prim "WordU16_extdToWord16": Int16.int -> Word16.word; val zextdFromInt16ToWord32 = _prim "WordU16_extdToWord32": Int16.int -> Word32.word; val zextdFromInt16ToWord64 = _prim "WordU16_extdToWord64": Int16.int -> Word64.word; val zextdFromInt32ToInt8 = _prim "WordU32_extdToWord8": Int32.int -> Int8.int; val zextdFromInt32ToInt16 = _prim "WordU32_extdToWord16": Int32.int -> Int16.int; val zextdFromInt32ToInt32 = _prim "WordU32_extdToWord32": Int32.int -> Int32.int; val zextdFromInt32ToInt64 = _prim "WordU32_extdToWord64": Int32.int -> Int64.int; val zextdFromInt32ToWord8 = _prim "WordU32_extdToWord8": Int32.int -> Word8.word; val zextdFromInt32ToWord16 = _prim "WordU32_extdToWord16": Int32.int -> Word16.word; val zextdFromInt32ToWord32 = _prim "WordU32_extdToWord32": Int32.int -> Word32.word; val zextdFromInt32ToWord64 = _prim "WordU32_extdToWord64": Int32.int -> Word64.word; val zextdFromInt64ToInt8 = _prim "WordU64_extdToWord8": Int64.int -> Int8.int; val zextdFromInt64ToInt16 = _prim "WordU64_extdToWord16": Int64.int -> Int16.int; val zextdFromInt64ToInt32 = _prim "WordU64_extdToWord32": Int64.int -> Int32.int; val zextdFromInt64ToInt64 = _prim "WordU64_extdToWord64": Int64.int -> Int64.int; val zextdFromInt64ToWord8 = _prim "WordU64_extdToWord8": Int64.int -> Word8.word; val zextdFromInt64ToWord16 = _prim "WordU64_extdToWord16": Int64.int -> Word16.word; val zextdFromInt64ToWord32 = _prim "WordU64_extdToWord32": Int64.int -> Word32.word; val zextdFromInt64ToWord64 = _prim "WordU64_extdToWord64": Int64.int -> Word64.word; val zextdFromWord8ToInt8 = _prim "WordU8_extdToWord8": Word8.word -> Int8.int; val zextdFromWord8ToInt16 = _prim "WordU8_extdToWord16": Word8.word -> Int16.int; val zextdFromWord8ToInt32 = _prim "WordU8_extdToWord32": Word8.word -> Int32.int; val zextdFromWord8ToInt64 = _prim "WordU8_extdToWord64": Word8.word -> Int64.int; val zextdFromWord8ToWord8 = _prim "WordU8_extdToWord8": Word8.word -> Word8.word; val zextdFromWord8ToWord16 = _prim "WordU8_extdToWord16": Word8.word -> Word16.word; val zextdFromWord8ToWord32 = _prim "WordU8_extdToWord32": Word8.word -> Word32.word; val zextdFromWord8ToWord64 = _prim "WordU8_extdToWord64": Word8.word -> Word64.word; val zextdFromWord16ToInt8 = _prim "WordU16_extdToWord8": Word16.word -> Int8.int; val zextdFromWord16ToInt16 = _prim "WordU16_extdToWord16": Word16.word -> Int16.int; val zextdFromWord16ToInt32 = _prim "WordU16_extdToWord32": Word16.word -> Int32.int; val zextdFromWord16ToInt64 = _prim "WordU16_extdToWord64": Word16.word -> Int64.int; val zextdFromWord16ToWord8 = _prim "WordU16_extdToWord8": Word16.word -> Word8.word; val zextdFromWord16ToWord16 = _prim "WordU16_extdToWord16": Word16.word -> Word16.word; val zextdFromWord16ToWord32 = _prim "WordU16_extdToWord32": Word16.word -> Word32.word; val zextdFromWord16ToWord64 = _prim "WordU16_extdToWord64": Word16.word -> Word64.word; val zextdFromWord32ToInt8 = _prim "WordU32_extdToWord8": Word32.word -> Int8.int; val zextdFromWord32ToInt16 = _prim "WordU32_extdToWord16": Word32.word -> Int16.int; val zextdFromWord32ToInt32 = _prim "WordU32_extdToWord32": Word32.word -> Int32.int; val zextdFromWord32ToInt64 = _prim "WordU32_extdToWord64": Word32.word -> Int64.int; val zextdFromWord32ToWord8 = _prim "WordU32_extdToWord8": Word32.word -> Word8.word; val zextdFromWord32ToWord16 = _prim "WordU32_extdToWord16": Word32.word -> Word16.word; val zextdFromWord32ToWord32 = _prim "WordU32_extdToWord32": Word32.word -> Word32.word; val zextdFromWord32ToWord64 = _prim "WordU32_extdToWord64": Word32.word -> Word64.word; val zextdFromWord64ToInt8 = _prim "WordU64_extdToWord8": Word64.word -> Int8.int; val zextdFromWord64ToInt16 = _prim "WordU64_extdToWord16": Word64.word -> Int16.int; val zextdFromWord64ToInt32 = _prim "WordU64_extdToWord32": Word64.word -> Int32.int; val zextdFromWord64ToInt64 = _prim "WordU64_extdToWord64": Word64.word -> Int64.int; val zextdFromWord64ToWord8 = _prim "WordU64_extdToWord8": Word64.word -> Word8.word; val zextdFromWord64ToWord16 = _prim "WordU64_extdToWord16": Word64.word -> Word16.word; val zextdFromWord64ToWord32 = _prim "WordU64_extdToWord32": Word64.word -> Word32.word; val zextdFromWord64ToWord64 = _prim "WordU64_extdToWord64": Word64.word -> Word64.word; (* sign-extend or low-bits *) val sextdFromInt8ToInt8 = _prim "WordS8_extdToWord8": Int8.int -> Int8.int; val sextdFromInt8ToInt16 = _prim "WordS8_extdToWord16": Int8.int -> Int16.int; val sextdFromInt8ToInt32 = _prim "WordS8_extdToWord32": Int8.int -> Int32.int; val sextdFromInt8ToInt64 = _prim "WordS8_extdToWord64": Int8.int -> Int64.int; val sextdFromInt8ToWord8 = _prim "WordS8_extdToWord8": Int8.int -> Word8.word; val sextdFromInt8ToWord16 = _prim "WordS8_extdToWord16": Int8.int -> Word16.word; val sextdFromInt8ToWord32 = _prim "WordS8_extdToWord32": Int8.int -> Word32.word; val sextdFromInt8ToWord64 = _prim "WordS8_extdToWord64": Int8.int -> Word64.word; val sextdFromInt16ToInt8 = _prim "WordS16_extdToWord8": Int16.int -> Int8.int; val sextdFromInt16ToInt16 = _prim "WordS16_extdToWord16": Int16.int -> Int16.int; val sextdFromInt16ToInt32 = _prim "WordS16_extdToWord32": Int16.int -> Int32.int; val sextdFromInt16ToInt64 = _prim "WordS16_extdToWord64": Int16.int -> Int64.int; val sextdFromInt16ToWord8 = _prim "WordS16_extdToWord8": Int16.int -> Word8.word; val sextdFromInt16ToWord16 = _prim "WordS16_extdToWord16": Int16.int -> Word16.word; val sextdFromInt16ToWord32 = _prim "WordS16_extdToWord32": Int16.int -> Word32.word; val sextdFromInt16ToWord64 = _prim "WordS16_extdToWord64": Int16.int -> Word64.word; val sextdFromInt32ToInt8 = _prim "WordS32_extdToWord8": Int32.int -> Int8.int; val sextdFromInt32ToInt16 = _prim "WordS32_extdToWord16": Int32.int -> Int16.int; val sextdFromInt32ToInt32 = _prim "WordS32_extdToWord32": Int32.int -> Int32.int; val sextdFromInt32ToInt64 = _prim "WordS32_extdToWord64": Int32.int -> Int64.int; val sextdFromInt32ToWord8 = _prim "WordS32_extdToWord8": Int32.int -> Word8.word; val sextdFromInt32ToWord16 = _prim "WordS32_extdToWord16": Int32.int -> Word16.word; val sextdFromInt32ToWord32 = _prim "WordS32_extdToWord32": Int32.int -> Word32.word; val sextdFromInt32ToWord64 = _prim "WordS32_extdToWord64": Int32.int -> Word64.word; val sextdFromInt64ToInt8 = _prim "WordS64_extdToWord8": Int64.int -> Int8.int; val sextdFromInt64ToInt16 = _prim "WordS64_extdToWord16": Int64.int -> Int16.int; val sextdFromInt64ToInt32 = _prim "WordS64_extdToWord32": Int64.int -> Int32.int; val sextdFromInt64ToInt64 = _prim "WordS64_extdToWord64": Int64.int -> Int64.int; val sextdFromInt64ToWord8 = _prim "WordS64_extdToWord8": Int64.int -> Word8.word; val sextdFromInt64ToWord16 = _prim "WordS64_extdToWord16": Int64.int -> Word16.word; val sextdFromInt64ToWord32 = _prim "WordS64_extdToWord32": Int64.int -> Word32.word; val sextdFromInt64ToWord64 = _prim "WordS64_extdToWord64": Int64.int -> Word64.word; val sextdFromWord8ToInt8 = _prim "WordS8_extdToWord8": Word8.word -> Int8.int; val sextdFromWord8ToInt16 = _prim "WordS8_extdToWord16": Word8.word -> Int16.int; val sextdFromWord8ToInt32 = _prim "WordS8_extdToWord32": Word8.word -> Int32.int; val sextdFromWord8ToInt64 = _prim "WordS8_extdToWord64": Word8.word -> Int64.int; val sextdFromWord8ToWord8 = _prim "WordS8_extdToWord8": Word8.word -> Word8.word; val sextdFromWord8ToWord16 = _prim "WordS8_extdToWord16": Word8.word -> Word16.word; val sextdFromWord8ToWord32 = _prim "WordS8_extdToWord32": Word8.word -> Word32.word; val sextdFromWord8ToWord64 = _prim "WordS8_extdToWord64": Word8.word -> Word64.word; val sextdFromWord16ToInt8 = _prim "WordS16_extdToWord8": Word16.word -> Int8.int; val sextdFromWord16ToInt16 = _prim "WordS16_extdToWord16": Word16.word -> Int16.int; val sextdFromWord16ToInt32 = _prim "WordS16_extdToWord32": Word16.word -> Int32.int; val sextdFromWord16ToInt64 = _prim "WordS16_extdToWord64": Word16.word -> Int64.int; val sextdFromWord16ToWord8 = _prim "WordS16_extdToWord8": Word16.word -> Word8.word; val sextdFromWord16ToWord16 = _prim "WordS16_extdToWord16": Word16.word -> Word16.word; val sextdFromWord16ToWord32 = _prim "WordS16_extdToWord32": Word16.word -> Word32.word; val sextdFromWord16ToWord64 = _prim "WordS16_extdToWord64": Word16.word -> Word64.word; val sextdFromWord32ToInt8 = _prim "WordS32_extdToWord8": Word32.word -> Int8.int; val sextdFromWord32ToInt16 = _prim "WordS32_extdToWord16": Word32.word -> Int16.int; val sextdFromWord32ToInt32 = _prim "WordS32_extdToWord32": Word32.word -> Int32.int; val sextdFromWord32ToInt64 = _prim "WordS32_extdToWord64": Word32.word -> Int64.int; val sextdFromWord32ToWord8 = _prim "WordS32_extdToWord8": Word32.word -> Word8.word; val sextdFromWord32ToWord16 = _prim "WordS32_extdToWord16": Word32.word -> Word16.word; val sextdFromWord32ToWord32 = _prim "WordS32_extdToWord32": Word32.word -> Word32.word; val sextdFromWord32ToWord64 = _prim "WordS32_extdToWord64": Word32.word -> Word64.word; val sextdFromWord64ToInt8 = _prim "WordS64_extdToWord8": Word64.word -> Int8.int; val sextdFromWord64ToInt16 = _prim "WordS64_extdToWord16": Word64.word -> Int16.int; val sextdFromWord64ToInt32 = _prim "WordS64_extdToWord32": Word64.word -> Int32.int; val sextdFromWord64ToInt64 = _prim "WordS64_extdToWord64": Word64.word -> Int64.int; val sextdFromWord64ToWord8 = _prim "WordS64_extdToWord8": Word64.word -> Word8.word; val sextdFromWord64ToWord16 = _prim "WordS64_extdToWord16": Word64.word -> Word16.word; val sextdFromWord64ToWord32 = _prim "WordS64_extdToWord32": Word64.word -> Word32.word; val sextdFromWord64ToWord64 = _prim "WordS64_extdToWord64": Word64.word -> Word64.word; end end mlton-20210117+dfsg/basis-library/primitive/prim-mlton.sml000066400000000000000000000357101416264345000234220ustar00rootroot00000000000000(* Copyright (C) 2010-2011,2013-2014,2017,2019 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure MLton = struct structure GCState = struct type t = Pointer.t val gcState = _prim "GC_state": unit -> t; end val bug = _prim "MLton_bug": String8.string -> unit; val eq = _prim "MLton_eq": 'a * 'a -> bool; val equal = _prim "MLton_equal": 'a * 'a -> bool; (* val deserialize = _prim "MLton_deserialize": Word8Vector.vector -> 'a ref; *) val halt = _prim "MLton_halt": C_Status.t -> unit; val hash = _prim "MLton_hash": 'a -> Word32.word; (* val serialize = _prim "MLton_serialize": 'a ref -> Word8Vector.vector; *) val share = _prim "MLton_share": 'a -> unit; val size = _prim "MLton_size": 'a -> C_Size.t; val sizeAll = _import "GC_sizeAll" runtime private: GCState.t -> C_Size.t; val installSignalHandler = _prim "MLton_installSignalHandler": unit -> unit; structure Align = struct datatype t = Align4 | Align8 val align = case _build_const "MLton_Align_align": Int32.int; of 4 => Align4 | 8 => Align8 | _ => raise Primitive.Exn.Fail8 "MLton_Align_align" end structure CallStack = struct (* The most recent caller is at index 0 in the array. *) datatype t = T of Word32.word array val callStack = _import "GC_callStack" runtime private: GCState.t * Word32.word array -> unit; val frameIndexSourceSeq = _import "GC_frameIndexSourceSeq" runtime private: GCState.t * Word32.word -> Pointer.t; val keep = _command_line_const "CallStack.keep": bool = false; val numStackFrames = _import "GC_numStackFrames" runtime private: GCState.t -> Word32.word; val sourceName = _import "GC_sourceName" runtime private: GCState.t * Word32.word -> C_String.t; end structure Codegen = struct datatype t = AMD64 | C | LLVM | X86 val codegen = case _build_const "MLton_Codegen_codegen": Int32.int; of 0 => C | 1 => X86 | 2 => AMD64 | 3 => LLVM | _ => raise Primitive.Exn.Fail8 "MLton_Codegen_codegen" val isC = codegen = C val isAMD64 = codegen = AMD64 val isLLVM = codegen = LLVM val isX86 = codegen = X86 end structure Exn = struct (* The polymorphism with extra and setInitExtra is because primitives * are only supposed to deal with basic types. The polymorphism * allows the various passes like monomorphisation to translate * the types appropriately. *) type extra = CallStack.t option val extra = _prim "Exn_extra": exn -> 'a; val extra: exn -> extra = extra val keepHistory = _command_line_const "Exn.keepHistory": bool = false; val setExtendExtra = _prim "Exn_setExtendExtra": ('a -> 'a) -> unit; val setExtendExtra: (extra -> extra) -> unit = setExtendExtra (* Ensure that setExtendExtra is initialized. * Important for -const 'Exn.keepHistory true', so that * exceptions can be raised (and handled) during Basis Library * initialization. *) val setExtendExtra : (extra -> extra) -> unit = if keepHistory then (setExtendExtra (fn _ => NONE) ; setExtendExtra) else fn _ => () end structure FFI = struct val getOpArgsResPtr = _import "GC_getCallFromCOpArgsResPtr" runtime private: GCState.t -> Pointer.t; val numExports = _build_const "MLton_FFI_numExports": Int32.int; end structure Finalizable = struct val touch = _prim "MLton_touch": 'a -> unit; end structure GC = struct val collect = _prim "GC_collect": unit -> unit; val pack = _import "GC_pack" runtime private: GCState.t -> unit; val getBytesAllocated = _import "GC_getCumulativeStatisticsBytesAllocated" runtime private: GCState.t -> C_UIntmax.t; val getNumCopyingGCs = _import "GC_getCumulativeStatisticsNumCopyingGCs" runtime private: GCState.t -> C_UIntmax.t; val getNumMarkCompactGCs = _import "GC_getCumulativeStatisticsNumMarkCompactGCs" runtime private: GCState.t -> C_UIntmax.t; val getNumMinorGCs = _import "GC_getCumulativeStatisticsNumMinorGCs" runtime private: GCState.t -> C_UIntmax.t; val getLastBytesLive = _import "GC_getLastMajorStatisticsBytesLive" runtime private: GCState.t -> C_Size.t; val getMaxBytesLive = _import "GC_getCumulativeStatisticsMaxBytesLive" runtime private: GCState.t -> C_Size.t; val setHashConsDuringGC = _import "GC_setHashConsDuringGC" runtime private: GCState.t * bool -> unit; val setMessages = _import "GC_setControlsMessages" runtime private: GCState.t * bool -> unit; val setRusageMeasureGC = _import "GC_setControlsRusageMeasureGC" runtime private: GCState.t * bool -> unit; val setSummary = _import "GC_setControlsSummary" runtime private: GCState.t * bool -> unit; val unpack = _import "GC_unpack" runtime private: GCState.t -> unit; end structure Platform = struct structure Arch = struct datatype t = Alpha | AMD64 | ARM | ARM64 | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | RISCV | S390 | Sparc | X86 val host: t = case _const "MLton_Platform_Arch_host": String8.string; of "alpha" => Alpha | "amd64" => AMD64 | "arm" => ARM | "arm64" => ARM64 | "hppa" => HPPA | "ia64" => IA64 | "m68k" => m68k | "mips" => MIPS | "powerpc" => PowerPC | "powerpc64" => PowerPC64 | "riscv" => RISCV | "s390" => S390 | "sparc" => Sparc | "x86" => X86 | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_Arch_host" val hostIsBigEndian = _const "MLton_Platform_Arch_bigendian": bool; end structure Format = struct datatype t = Archive | Executable | LibArchive | Library val host: t = case _build_const "MLton_Platform_Format": String8.string; of "archive" => Archive | "executable" => Executable | "libarchive" => LibArchive | "library" => Library | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_Format" end structure OS = struct datatype t = AIX | Cygwin | Darwin | FreeBSD | Hurd | HPUX | Linux | MinGW | NetBSD | OpenBSD | Solaris val host: t = case _const "MLton_Platform_OS_host": String8.string; of "aix" => AIX | "cygwin" => Cygwin | "darwin" => Darwin | "freebsd" => FreeBSD | "hurd" => Hurd | "hpux" => HPUX | "linux" => Linux | "mingw" => MinGW | "netbsd" => NetBSD | "openbsd" => OpenBSD | "solaris" => Solaris | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_OS_host" val forkIsEnabled = case host of Cygwin => #1 _symbol "MLton_Platform_CygwinUseMmap" private: bool GetSet.t; () | MinGW => false | _ => true val useWindowsProcess = not forkIsEnabled end end structure Pointer = struct open Pointer type pointer = t val add = _prim "CPointer_add": t * C_Ptrdiff.t -> t; val sub = _prim "CPointer_sub": t * C_Ptrdiff.t -> t; val diff = _prim "CPointer_diff": t * t -> C_Ptrdiff.t; val < = _prim "CPointer_lt": t * t -> bool; local structure S = IntegralComparisons(type t = t val < = <) in open S end val fromWord = _prim "CPointer_fromWord": C_Size.t -> t; val toWord = _prim "CPointer_toWord": t -> C_Size.t; val null: t = fromWord 0w0 fun isNull p = p = null val getCPointer = _prim "CPointer_getCPointer": t * C_Ptrdiff.t -> t; val getInt8 = _prim "CPointer_getWord8": t * C_Ptrdiff.t -> Int8.int; val getInt16 = _prim "CPointer_getWord16": t * C_Ptrdiff.t -> Int16.int; val getInt32 = _prim "CPointer_getWord32": t * C_Ptrdiff.t -> Int32.int; val getInt64 = _prim "CPointer_getWord64": t * C_Ptrdiff.t -> Int64.int; val getObjptr = _prim "CPointer_getObjptr": t * C_Ptrdiff.t -> 'a; val getReal32 = _prim "CPointer_getReal32": t * C_Ptrdiff.t -> Real32.real; val getReal64 = _prim "CPointer_getReal64": t * C_Ptrdiff.t -> Real64.real; val getWord8 = _prim "CPointer_getWord8": t * C_Ptrdiff.t -> Word8.word; val getWord16 = _prim "CPointer_getWord16": t * C_Ptrdiff.t -> Word16.word; val getWord32 = _prim "CPointer_getWord32": t * C_Ptrdiff.t -> Word32.word; val getWord64 = _prim "CPointer_getWord64": t * C_Ptrdiff.t -> Word64.word; val setCPointer = _prim "CPointer_setCPointer": t * C_Ptrdiff.t * t -> unit; val setInt8 = _prim "CPointer_setWord8": t * C_Ptrdiff.t * Int8.int -> unit; val setInt16 = _prim "CPointer_setWord16": t * C_Ptrdiff.t * Int16.int -> unit; val setInt32 = _prim "CPointer_setWord32": t * C_Ptrdiff.t * Int32.int -> unit; val setInt64 = _prim "CPointer_setWord64": t * C_Ptrdiff.t * Int64.int -> unit; val setObjptr = _prim "CPointer_setObjptr": t * C_Ptrdiff.t * 'a -> unit; val setReal32 = _prim "CPointer_setReal32": t * C_Ptrdiff.t * Real32.real -> unit; val setReal64 = _prim "CPointer_setReal64": t * C_Ptrdiff.t * Real64.real -> unit; val setWord8 = _prim "CPointer_setWord8": t * C_Ptrdiff.t * Word8.word -> unit; val setWord16 = _prim "CPointer_setWord16": t * C_Ptrdiff.t * Word16.word -> unit; val setWord32 = _prim "CPointer_setWord32": t * C_Ptrdiff.t * Word32.word -> unit; val setWord64 = _prim "CPointer_setWord64": t * C_Ptrdiff.t * Word64.word -> unit; end structure Profile = struct val isOn = _build_const "MLton_Profile_isOn": bool; structure Data = struct type t = Pointer.t val dummy = Pointer.null val free = _import "GC_profileFree" runtime private: GCState.t * t -> unit; val malloc = _import "GC_profileMalloc" runtime private: GCState.t -> t; val write = _import "GC_profileWrite" runtime private: GCState.t * t * NullString8.t -> unit; end val done = _import "GC_profileDone" runtime private: GCState.t -> unit; val getCurrent = _import "GC_getProfileCurrent" runtime private: GCState.t -> Data.t; val setCurrent = _import "GC_setProfileCurrent" runtime private : GCState.t * Data.t -> unit; end structure Thread = struct type preThread = PreThread.t type thread = Thread.t val atomicState = _prim "Thread_atomicState": unit -> Word32.word; val atomicBegin = _prim "Thread_atomicBegin": unit -> unit; fun atomicEnd () = if atomicState () = 0w0 then raise Primitive.Exn.Fail8 "Thread.atomicEnd" else _prim "Thread_atomicEnd": unit -> unit; () val copy = _prim "Thread_copy": preThread -> thread; (* copyCurrent's result is accesible via savedPre (). * It is not possible to have the type of copyCurrent as * unit -> preThread, because there are two different ways to * return from the call to copyCurrent. One way is the direct * obvious way, in the thread that called copyCurrent. That one, * of course, wants to call savedPre (). However, another way to * return is by making a copy of the preThread and then switching * to it. In that case, there is no preThread to return. Making * copyCurrent return a preThread creates nasty bugs where the * return code from the CCall expects to see a preThread result * according to the C return convention, but there isn't one when * switching to a copy. *) val copyCurrent = _prim "Thread_copyCurrent": unit -> unit; val current = _import "GC_getCurrentThread" runtime private: GCState.t -> thread; val finishSignalHandler = _import "GC_finishSignalHandler" runtime private: GCState.t -> unit; val returnToC = _prim "Thread_returnToC": unit -> unit; val saved = _import "GC_getSavedThread" runtime private: GCState.t -> thread; val savedPre = _import "GC_getSavedThread" runtime private: GCState.t -> preThread; val setCallFromCHandler = _import "GC_setCallFromCHandlerThread" runtime private: GCState.t * thread -> unit; val setSignalHandler = _import "GC_setSignalHandlerThread" runtime private: GCState.t * thread -> unit; val setSaved = _import "GC_setSavedThread" runtime private: GCState.t * thread -> unit; val startSignalHandler = _import "GC_startSignalHandler" runtime private: GCState.t -> unit; val switchTo = _prim "Thread_switchTo": thread -> unit; end structure Weak = struct open Weak val canGet = _prim "Weak_canGet": 'a t -> bool; val get = _prim "Weak_get": 'a t -> 'a; val new = _prim "Weak_new": 'a -> 'a t; end structure World = struct val getAmOriginal = _import "GC_getAmOriginal" runtime private: GCState.t -> bool; val setAmOriginal = _import "GC_setAmOriginal" runtime private: GCState.t * bool -> unit; val getSaveStatus = _import "GC_getSaveWorldStatus" runtime private: GCState.t -> bool C_Errno.t; (* save's result status is accesible via getSaveStatus (). * It is not possible to have the type of save as * NullString8.t -> bool C_Errno.t, because there are two * different ways to return from the call to save. One way is * the direct obvious way, in the program instance that called * save. However, another way to return is in the program * instance that loads the world. Making save return a bool * creates nasty bugs where the return code from the CCall * expects to see a bool result according to the C return * convention, but there isn't one when returning in the load * world. *) val save = _prim "World_save": NullString8.t -> unit; end end structure GCState = MLton.GCState end mlton-20210117+dfsg/basis-library/primitive/prim-nullstring.sml000066400000000000000000000016131416264345000244650ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive (* NullString is used for strings that must be passed to C and hence must be * null terminated. *) structure NullString8 :> sig type t val empty: t val fromString: String8.string -> t end = struct type t = String8.string fun fromString s = if #"\000" = Vector.subUnsafe (s, SeqIndex.- (Vector.length s, 1)) then s else raise Exn.Fail8 "NullString.fromString" val empty = fromString "\000" end structure NullString8Array = struct type t = NullString8.t array end end mlton-20210117+dfsg/basis-library/primitive/prim-pack-real.sml000066400000000000000000000015001416264345000241160ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure PackReal32 = struct type real = Real32.real type word = Word32.word val castFromWord = _prim "Word32_castToReal32": word -> real; val castToWord = _prim "Real32_castToWord32": real -> word; end structure PackReal64 = struct type real = Real64.real type word = Word64.word val castFromWord = _prim "Word64_castToReal64": word -> real; val castToWord = _prim "Real64_castToWord64": real -> word; end end mlton-20210117+dfsg/basis-library/primitive/prim-pack-word.sml000066400000000000000000000035431416264345000241570ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure PackWord8 = struct type word = Word8.word val subArr = _prim "Word8Array_subWord8": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord8": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord8": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord16 = struct type word = Word16.word val subArr = _prim "Word8Array_subWord16": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord16": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord16": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord32 = struct type word = Word32.word val subArr = _prim "Word8Array_subWord32": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord32": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord32": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord64 = struct type word = Word64.word val subArr = _prim "Word8Array_subWord64": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord64": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord64": Word8.word array * SeqIndex.int * word -> unit; end end mlton-20210117+dfsg/basis-library/primitive/prim-real.sml000066400000000000000000000250211416264345000232060ustar00rootroot00000000000000(* Copyright (C) 2012,2013,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_REAL = sig type real type t = real val realSize: Primitive.Int32.int val exponentBias : Primitive.Int32.int val precision: Primitive.Int32.int val radix: Primitive.Int32.int structure Math : sig type real val acos: real -> real val asin: real -> real val atan: real -> real val atan2: real * real -> real val cos: real -> real val cosh: real -> real val e: real val exp: real -> real val ln: real -> real val log10: real -> real val pi: real val pow: real * real -> real val sin: real -> real val sinh: real -> real val sqrt: real -> real val tan: real -> real val tanh: real -> real end val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val ~ : real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val ?= : real * real -> bool val abs: real -> real val frexp: real * C_Int.t ref -> real val gdtoa: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t val ldexp: real * C_Int.t -> real val modf: real * real ref -> real val round: real -> real val realCeil: real -> real val realFloor: real -> real val realTrunc: real -> real val strtor: Primitive.NullString8.t * C_Int.t -> real (* Integer to float; depends on rounding mode. *) val fromInt8Unsafe: Primitive.Int8.int -> real val fromInt16Unsafe: Primitive.Int16.int -> real val fromInt32Unsafe: Primitive.Int32.int -> real val fromInt64Unsafe: Primitive.Int64.int -> real (* Float to float; depends on rounding mode. *) val fromReal32Unsafe: Primitive.Real32.real -> real val fromReal64Unsafe: Primitive.Real64.real -> real (* Word to float; depends on rounding mode. *) val fromWord8Unsafe: Primitive.Word8.word -> real val fromWord16Unsafe: Primitive.Word16.word -> real val fromWord32Unsafe: Primitive.Word32.word -> real val fromWord64Unsafe: Primitive.Word64.word -> real (* Float to integer, taking lowbits. *) val toInt8Unsafe: real -> Primitive.Int8.int val toInt16Unsafe: real -> Primitive.Int16.int val toInt32Unsafe: real -> Primitive.Int32.int val toInt64Unsafe: real -> Primitive.Int64.int (* Float to float; depends on rounding mode. *) val toReal32Unsafe: real -> Primitive.Real32.real val toReal64Unsafe: real -> Primitive.Real64.real (* Float to word, taking lowbits. *) val toWord8Unsafe: real -> Primitive.Word8.word val toWord16Unsafe: real -> Primitive.Word16.word val toWord32Unsafe: real -> Primitive.Word32.word val toWord64Unsafe: real -> Primitive.Word64.word end structure Primitive = struct open Primitive structure Real32 : PRIM_REAL = struct open PrimitiveFFI.Real32 open Real32 val realSize : Int32.int = 32 val exponentBias : Int32.int = 127 val precision : Int32.int = 24 val radix : Int32.int = 2 structure Math = struct type real = real open Math val acos = _prim "Real32_Math_acos": real -> real; val asin = _prim "Real32_Math_asin": real -> real; val atan = _prim "Real32_Math_atan": real -> real; val atan2 = _prim "Real32_Math_atan2": real * real -> real; val cos = _prim "Real32_Math_cos": real -> real; val e = 2.71828182845904523536 : real val exp = _prim "Real32_Math_exp": real -> real; val ln = _prim "Real32_Math_ln": real -> real; val log10 = _prim "Real32_Math_log10": real -> real; val pi = 3.14159265358979323846 : real val sin = _prim "Real32_Math_sin": real -> real; val sqrt = _prim "Real32_Math_sqrt": real -> real; val tan = _prim "Real32_Math_tan": real -> real; end val * = _prim "Real32_mul": real * real -> real; val *+ = _prim "Real32_muladd": real * real * real -> real; val *- = _prim "Real32_mulsub": real * real * real -> real; val + = _prim "Real32_add": real * real -> real; val - = _prim "Real32_sub": real * real -> real; val / = _prim "Real32_div": real * real -> real; val ~ = _prim "Real32_neg": real -> real; val op < = _prim "Real32_lt": real * real -> bool; val op <= = _prim "Real32_le": real * real -> bool; val == = _prim "Real32_equal": real * real -> bool; val ?= = _prim "Real32_qequal": real * real -> bool; val abs = _prim "Real32_abs": real -> real; val ldexp = _prim "Real32_ldexp": real * C_Int.t -> real; val round = _prim "Real32_round": real -> real; val fromInt8Unsafe = _prim "WordS8_rndToReal32": Int8.int -> real; val fromInt16Unsafe = _prim "WordS16_rndToReal32": Int16.int -> real; val fromInt32Unsafe = _prim "WordS32_rndToReal32": Int32.int -> real; val fromInt64Unsafe = _prim "WordS64_rndToReal32": Int64.int -> real; val fromReal32Unsafe = _prim "Real32_rndToReal32": Real32.real -> real; val fromReal64Unsafe = _prim "Real64_rndToReal32": Real64.real -> real; val fromWord8Unsafe = _prim "WordU8_rndToReal32": Word8.word -> real; val fromWord16Unsafe = _prim "WordU16_rndToReal32": Word16.word -> real; val fromWord32Unsafe = _prim "WordU32_rndToReal32": Word32.word -> real; val fromWord64Unsafe = _prim "WordU64_rndToReal32": Word64.word -> real; val toInt8Unsafe = _prim "Real32_rndToWordS8": real -> Int8.int; val toInt16Unsafe = _prim "Real32_rndToWordS16": real -> Int16.int; val toInt32Unsafe = _prim "Real32_rndToWordS32": real -> Int32.int; val toInt64Unsafe = _prim "Real32_rndToWordS64": real -> Int64.int; val toReal32Unsafe = _prim "Real32_rndToReal32": real -> Real32.real; val toReal64Unsafe = _prim "Real32_rndToReal64": real -> Real64.real; val toWord8Unsafe = _prim "Real32_rndToWordU8": real -> Word8.word; val toWord16Unsafe = _prim "Real32_rndToWordU16": real -> Word16.word; val toWord32Unsafe = _prim "Real32_rndToWordU32": real -> Word32.word; val toWord64Unsafe = _prim "Real32_rndToWordU64": real -> Word64.word; end structure Real32 = struct open Real32 local structure S = RealComparisons (Real32) in open S end end structure Real64 : PRIM_REAL = struct open PrimitiveFFI.Real64 open Real64 val realSize : Int32.int = 64 val exponentBias : Int32.int = 1023 val precision : Int32.int = 53 val radix : Int32.int = 2 structure Math = struct type real = real open Math val acos = _prim "Real64_Math_acos": real -> real; val asin = _prim "Real64_Math_asin": real -> real; val atan = _prim "Real64_Math_atan": real -> real; val atan2 = _prim "Real64_Math_atan2": real * real -> real; val cos = _prim "Real64_Math_cos": real -> real; val e = 2.71828182845904523536 : real val exp = _prim "Real64_Math_exp": real -> real; val ln = _prim "Real64_Math_ln": real -> real; val log10 = _prim "Real64_Math_log10": real -> real; val pi = 3.14159265358979323846 : real val sin = _prim "Real64_Math_sin": real -> real; val sqrt = _prim "Real64_Math_sqrt": real -> real; val tan = _prim "Real64_Math_tan": real -> real; end val * = _prim "Real64_mul": real * real -> real; val *+ = _prim "Real64_muladd": real * real * real -> real; val *- = _prim "Real64_mulsub": real * real * real -> real; val + = _prim "Real64_add": real * real -> real; val - = _prim "Real64_sub": real * real -> real; val / = _prim "Real64_div": real * real -> real; val ~ = _prim "Real64_neg": real -> real; val op < = _prim "Real64_lt": real * real -> bool; val op <= = _prim "Real64_le": real * real -> bool; val == = _prim "Real64_equal": real * real -> bool; val ?= = _prim "Real64_qequal": real * real -> bool; val abs = _prim "Real64_abs": real -> real; val ldexp = _prim "Real64_ldexp": real * C_Int.t -> real; val round = _prim "Real64_round": real -> real; val fromInt8Unsafe = _prim "WordS8_rndToReal64": Int8.int -> real; val fromInt16Unsafe = _prim "WordS16_rndToReal64": Int16.int -> real; val fromInt32Unsafe = _prim "WordS32_rndToReal64": Int32.int -> real; val fromInt64Unsafe = _prim "WordS64_rndToReal64": Int64.int -> real; val fromReal32Unsafe = _prim "Real32_rndToReal64": Real32.real -> real; val fromReal64Unsafe = _prim "Real64_rndToReal64": Real64.real -> real; val fromWord8Unsafe = _prim "WordU8_rndToReal64": Word8.word -> real; val fromWord16Unsafe = _prim "WordU16_rndToReal64": Word16.word -> real; val fromWord32Unsafe = _prim "WordU32_rndToReal64": Word32.word -> real; val fromWord64Unsafe = _prim "WordU64_rndToReal64": Word64.word -> real; val toInt8Unsafe = _prim "Real64_rndToWordS8": real -> Int8.int; val toInt16Unsafe = _prim "Real64_rndToWordS16": real -> Int16.int; val toInt32Unsafe = _prim "Real64_rndToWordS32": real -> Int32.int; val toInt64Unsafe = _prim "Real64_rndToWordS64": real -> Int64.int; val toReal32Unsafe = _prim "Real64_rndToReal32": real -> Real32.real; val toReal64Unsafe = _prim "Real64_rndToReal64": real -> Real64.real; val toWord8Unsafe = _prim "Real64_rndToWordU8": real -> Word8.word; val toWord16Unsafe = _prim "Real64_rndToWordU16": real -> Word16.word; val toWord32Unsafe = _prim "Real64_rndToWordU32": real -> Word32.word; val toWord64Unsafe = _prim "Real64_rndToWordU64": real -> Word64.word; end structure Real64 = struct open Real64 local structure S = RealComparisons (Real64) in open S end end end mlton-20210117+dfsg/basis-library/primitive/prim-seq.sml000066400000000000000000000050041416264345000230520ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure Array = struct open Array val allocUnsafe = _prim "Array_alloc": SeqIndex.int -> 'a array; val copyArrayUnsafe = _prim "Array_copyArray": 'a array * SeqIndex.int * 'a array * SeqIndex.int * SeqIndex.int -> unit; val copyVectorUnsafe = _prim "Array_copyVector": 'a array * SeqIndex.int * 'a vector * SeqIndex.int * SeqIndex.int -> unit; val length = _prim "Array_length": 'a array -> SeqIndex.int; (* There is no maximum length on arrays, so maxLen' = SeqIndex.maxInt'. *) (* val maxLen': SeqIndex.int = SeqIndex.maxInt' *) val subUnsafe = _prim "Array_sub": 'a array * SeqIndex.int -> 'a; val uninitIsNop = _prim "Array_uninitIsNop": 'a array -> bool; val uninitUnsafe = _prim "Array_uninit": 'a array * SeqIndex.int -> unit; val updateUnsafe = _prim "Array_update": 'a array * SeqIndex.int * 'a -> unit; structure Raw :> sig type 'a rawarr val allocUnsafe: SeqIndex.int -> 'a rawarr val length: 'a rawarr -> SeqIndex.int val toArrayUnsafe: 'a rawarr -> 'a array val uninitIsNop: 'a rawarr -> bool val uninitUnsafe: 'a rawarr * SeqIndex.int -> unit end = struct type 'a rawarr = 'a array val allocUnsafe = _prim "Array_allocRaw": SeqIndex.int -> 'a rawarr; val length = length val toArrayUnsafe = _prim "Array_toArray": 'a rawarr -> 'a array; val uninitIsNop = uninitIsNop val uninitUnsafe = uninitUnsafe end end structure Vector = struct open Vector (* Don't mutate the array after you apply fromArray, because vectors * are supposed to be immutable and the optimizer depends on this. *) val fromArrayUnsafe = _prim "Array_toVector": 'a array -> 'a vector; val length = _prim "Vector_length": 'a vector -> SeqIndex.int; val subUnsafe = _prim "Vector_sub": 'a vector * SeqIndex.int -> 'a; val vector0 = _prim "Vector_vector": unit -> 'a vector; end end mlton-20210117+dfsg/basis-library/primitive/prim-string.sml000066400000000000000000000011461416264345000235730ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure String8 = struct open String8 val idFromWord8Vector = _prim "Word8Vector_toString": Word8.word vector -> string; val idToWord8Vector = _prim "String_toWord8Vector": string -> Word8.word vector; end end mlton-20210117+dfsg/basis-library/primitive/prim-word.sml000066400000000000000000000330741416264345000232450ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_WORD = sig eqtype word type t = word val sizeInBits: Primitive.Int32.int val sizeInBitsWord: Primitive.Word32.word val + : word * word -> word val andb : word * word -> word val < word val * : word * word -> word val ~ : word -> word val notb : word -> word val orb : word * word -> word val quotUnsafe : word * word -> word val remUnsafe: word * word -> word val rolUnsafe: word * Primitive.Word32.word -> word val rorUnsafe: word * Primitive.Word32.word -> word val ~>>? : word * Primitive.Word32.word -> word val >>? : word * Primitive.Word32.word -> word val - : word * word -> word val xorb: word * word -> word val < : word * word -> bool val <= : word * word -> bool val > : word * word -> bool val >= : word * word -> bool val compare: word * word -> Primitive.Order.order val min: word * word -> word val max: word * word -> word end structure Primitive = struct open Primitive structure Word1 = struct open Word1 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord1": big -> word; val toBig = _prim "WordU1_extdToWord8": word -> big; val sizeInBits: Int32.int = 1 end structure Word2 = struct open Word2 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord2": big -> word; val toBig = _prim "WordU2_extdToWord8": word -> big; val sizeInBits: Int32.int = 2 end structure Word3 = struct open Word3 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord3": big -> word; val toBig = _prim "WordU3_extdToWord8": word -> big; val sizeInBits: Int32.int = 3 end structure Word4 = struct open Word4 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord4": big -> word; val toBig = _prim "WordU4_extdToWord8": word -> big; val sizeInBits: Int32.int = 4 end structure Word5 = struct open Word5 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord5": big -> word; val toBig = _prim "WordU5_extdToWord8": word -> big; val sizeInBits: Int32.int = 5 end structure Word6 = struct open Word6 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord6": big -> word; val toBig = _prim "WordU6_extdToWord8": word -> big; val sizeInBits: Int32.int = 6 end structure Word7 = struct open Word7 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord7": big -> word; val toBig = _prim "WordU7_extdToWord8": word -> big; val sizeInBits: Int32.int = 7 end structure Word8 = struct open Word8 val sizeInBits: Int32.int = 8 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word8_add": word * word -> word; val andb = _prim "Word8_andb": word * word -> word; val < word; val * = _prim "WordU8_mul": word * word -> word; val ~ = _prim "Word8_neg": word -> word; val notb = _prim "Word8_notb": word -> word; val orb = _prim "Word8_orb": word * word -> word; val quotUnsafe = _prim "WordU8_quot": word * word -> word; val remUnsafe = _prim "WordU8_rem": word * word -> word; val rolUnsafe = _prim "Word8_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word8_ror": word * Word32.word -> word; val ~>>? = _prim "WordS8_rshift": word * Word32.word -> word; val >>? = _prim "WordU8_rshift": word * Word32.word -> word; val - = _prim "Word8_sub": word * word -> word; val xorb = _prim "Word8_xorb": word * word -> word; val < = _prim "WordU8_lt": word * word -> bool; end structure Word8 : PRIM_WORD = struct open Word8 local structure S = IntegralComparisons(Word8) in open S end end structure Word9 = struct open Word9 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord9": big -> word; val toBig = _prim "WordU9_extdToWord16": word -> big; val sizeInBits: Int32.int = 9 end structure Word10 = struct open Word10 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord10": big -> word; val toBig = _prim "WordU10_extdToWord16": word -> big; val sizeInBits: Int32.int = 10 end structure Word11 = struct open Word11 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord11": big -> word; val toBig = _prim "WordU11_extdToWord16": word -> big; val sizeInBits: Int32.int = 11 end structure Word12 = struct open Word12 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord12": big -> word; val toBig = _prim "WordU12_extdToWord16": word -> big; val sizeInBits: Int32.int = 12 end structure Word13 = struct open Word13 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord13": big -> word; val toBig = _prim "WordU13_extdToWord16": word -> big; val sizeInBits: Int32.int = 13 end structure Word14 = struct open Word14 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord14": big -> word; val toBig = _prim "WordU14_extdToWord16": word -> big; val sizeInBits: Int32.int = 14 end structure Word15 = struct open Word15 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord15": big -> word; val toBig = _prim "WordU15_extdToWord16": word -> big; val sizeInBits: Int32.int = 15 end structure Word16 = struct open Word16 val sizeInBits: Int32.int = 16 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word16_add": word * word -> word; val andb = _prim "Word16_andb": word * word -> word; val < word; val * = _prim "WordU16_mul": word * word -> word; val ~ = _prim "Word16_neg": word -> word; val notb = _prim "Word16_notb": word -> word; val orb = _prim "Word16_orb": word * word -> word; val quotUnsafe = _prim "WordU16_quot": word * word -> word; val remUnsafe = _prim "WordU16_rem": word * word -> word; val rolUnsafe = _prim "Word16_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word16_ror": word * Word32.word -> word; val ~>>? = _prim "WordS16_rshift": word * Word32.word -> word; val >>? = _prim "WordU16_rshift": word * Word32.word -> word; val - = _prim "Word16_sub": word * word -> word; val xorb = _prim "Word16_xorb": word * word -> word; val < = _prim "WordU16_lt": word * word -> bool; end structure Word16 : PRIM_WORD = struct open Word16 local structure S = IntegralComparisons(Word16) in open S end end structure Word17 = struct open Word17 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord17": big -> word; val toBig = _prim "WordU17_extdToWord32": word -> big; val sizeInBits: Int32.int = 17 end structure Word18 = struct open Word18 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord18": big -> word; val toBig = _prim "WordU18_extdToWord32": word -> big; val sizeInBits: Int32.int = 18 end structure Word19 = struct open Word19 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord19": big -> word; val toBig = _prim "WordU19_extdToWord32": word -> big; val sizeInBits: Int32.int = 19 end structure Word20 = struct open Word20 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord20": big -> word; val toBig = _prim "WordU20_extdToWord32": word -> big; val sizeInBits: Int32.int = 20 end structure Word21 = struct open Word21 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord21": big -> word; val toBig = _prim "WordU21_extdToWord32": word -> big; val sizeInBits: Int32.int = 21 end structure Word22 = struct open Word22 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord22": big -> word; val toBig = _prim "WordU22_extdToWord32": word -> big; val sizeInBits: Int32.int = 22 end structure Word23 = struct open Word23 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord23": big -> word; val toBig = _prim "WordU23_extdToWord32": word -> big; val sizeInBits: Int32.int = 23 end structure Word24 = struct open Word24 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord24": big -> word; val toBig = _prim "WordU24_extdToWord32": word -> big; val sizeInBits: Int32.int = 24 end structure Word25 = struct open Word25 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord25": big -> word; val toBig = _prim "WordU25_extdToWord32": word -> big; val sizeInBits: Int32.int = 25 end structure Word26 = struct open Word26 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord26": big -> word; val toBig = _prim "WordU26_extdToWord32": word -> big; val sizeInBits: Int32.int = 26 end structure Word27 = struct open Word27 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord27": big -> word; val toBig = _prim "WordU27_extdToWord32": word -> big; val sizeInBits: Int32.int = 27 end structure Word28 = struct open Word28 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord28": big -> word; val toBig = _prim "WordU28_extdToWord32": word -> big; val sizeInBits: Int32.int = 28 end structure Word29 = struct open Word29 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord29": big -> word; val toBig = _prim "WordU29_extdToWord32": word -> big; val sizeInBits: Int32.int = 29 end structure Word30 = struct open Word30 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord30": big -> word; val toBig = _prim "WordU30_extdToWord32": word -> big; val sizeInBits: Int32.int = 30 end structure Word31 = struct open Word31 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord31": big -> word; val toBig = _prim "WordU31_extdToWord32": word -> big; val sizeInBits: Int32.int = 31 end structure Word32 = struct open Word32 val sizeInBits: Int32.int = 32 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word32_add": word * word -> word; val andb = _prim "Word32_andb": word * word -> word; val < word; val * = _prim "WordU32_mul": word * word -> word; val ~ = _prim "Word32_neg": word -> word; val notb = _prim "Word32_notb": word -> word; val orb = _prim "Word32_orb": word * word -> word; val quotUnsafe = _prim "WordU32_quot": word * word -> word; val remUnsafe = _prim "WordU32_rem": word * word -> word; val rolUnsafe = _prim "Word32_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word32_ror": word * Word32.word -> word; val ~>>? = _prim "WordS32_rshift": word * Word32.word -> word; val >>? = _prim "WordU32_rshift": word * Word32.word -> word; val - = _prim "Word32_sub": word * word -> word; val xorb = _prim "Word32_xorb": word * word -> word; val < = _prim "WordU32_lt": word * word -> bool; end structure Word32 : PRIM_WORD = struct open Word32 local structure S = IntegralComparisons(Word32) in open S end end structure Word64 = struct open Word64 val sizeInBits: Int32.int = 64 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word64_add": word * word -> word; val andb = _prim "Word64_andb": word * word -> word; val < word; val * = _prim "WordU64_mul": word * word -> word; val ~ = _prim "Word64_neg": word -> word; val notb = _prim "Word64_notb": word -> word; val orb = _prim "Word64_orb": word * word -> word; val quotUnsafe = _prim "WordU64_quot": word * word -> word; val remUnsafe = _prim "WordU64_rem": word * word -> word; val rolUnsafe = _prim "Word64_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word64_ror": word * Word32.word -> word; val ~>>? = _prim "WordS64_rshift": word * Word32.word -> word; val >>? = _prim "WordU64_rshift": word * Word32.word -> word; val - = _prim "Word64_sub": word * word -> word; val xorb = _prim "Word64_xorb": word * word -> word; val < = _prim "WordU64_lt": word * word -> bool; end structure Word64 : PRIM_WORD = struct open Word64 local structure S = IntegralComparisons(Word64) in open S end end end mlton-20210117+dfsg/basis-library/primitive/prim1.sml000066400000000000000000000065021416264345000223510ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure GetSet = struct type 'a t = (unit -> 'a) * ('a -> unit) end structure PreThread :> sig type t end = struct type t = Thread.t end structure Thread :> sig type t end = struct type t = Thread.t end (**************************************************************************) structure Bool = struct open Bool fun not b = if b then false else true end structure Controls = struct val debug = _command_line_const "MLton.debug": bool = false; val detectOverflow = _command_line_const "MLton.detectOverflow": bool = true; val safe = _command_line_const "MLton.safe": bool = true; val bufSize = _command_line_const "TextIO.bufSize": Int32.int = 4096; end structure Exn = struct open Exn val name = _prim "Exn_name": exn -> String8.string; exception Div exception Domain exception Fail8 of String8.string exception Fail16 of String16.string exception Fail32 of String32.string exception Overflow exception Size exception Span exception Subscript (* Fusing of adjacent `Word_` and `Word{S,U}_CheckP` primitives * by the codegens may depend on the relative order of `!a` and `?a`; * see: * - /mlton/codegen/amd64-codegen/amd64-simplify.fun:elimALRedundant * - /mlton/codegen/c-codegen/c-codegen.fun:outputStatementsFuseOpAndChk * - /mlton/codegen/llvm-codegen/llvm-codegen.fun:outputStatementsFuseOpAndChk * - /mlton/codegen/x86-codegen/x86-simplify.fun:elimALRedundant *) val mkOverflow: ('a -> 'b) * ('a -> bool) -> ('a -> 'b) = fn (!, ?) => fn a => let val r = ! a in if ? a then raise Overflow else r end end structure Order = struct datatype t = LESS | EQUAL | GREATER datatype order = datatype t end structure Option = struct datatype 'a t = NONE | SOME of 'a datatype option = datatype t end structure Ref = struct open Ref val deref = _prim "Ref_deref": 'a ref -> 'a; val assign = _prim "Ref_assign": 'a ref * 'a -> unit; end structure TopLevel = struct val getHandler = _prim "TopLevel_getHandler": unit -> (exn -> unit); val getSuffix = _prim "TopLevel_getSuffix": unit -> (unit -> unit); val setHandler = _prim "TopLevel_setHandler": (exn -> unit) -> unit; val setSuffix = _prim "TopLevel_setSuffix": (unit -> unit) -> unit; end end val not = Primitive.Bool.not exception Bind = Primitive.Exn.Bind exception Div = Primitive.Exn.Div exception Domain = Primitive.Exn.Domain exception Match = Primitive.Exn.Match exception Overflow = Primitive.Exn.Overflow exception Size = Primitive.Exn.Size exception Span = Primitive.Exn.Span exception Subscript = Primitive.Exn.Subscript datatype option = datatype Primitive.Option.option datatype order = datatype Primitive.Order.order infix 4 = <> val op = = _prim "MLton_equal": ''a * ''a -> bool; val op <> = fn (x, y) => not (x = y) mlton-20210117+dfsg/basis-library/primitive/prim2.sml000066400000000000000000000027101416264345000223470ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Primitive = struct open Primitive val dontInline: (unit -> 'a) -> 'a = fn f => let val rec recur: Int32.int -> 'a = fn i => if i = 0 then f () else let val _ = recur (Int32.- (i, 1)) in recur (Int32.- (i, 2)) end in recur 0 end end (* Install an emergency exception handler. *) local structure P = Primitive structure PFFI = PrimitiveFFI val _ = P.TopLevel.setHandler (fn exn => (PFFI.Stdio.print "unhandled exception: " ; case exn of P.Exn.Fail8 msg => (PFFI.Stdio.print "Fail " ; PFFI.Stdio.print msg) | _ => PFFI.Stdio.print (P.Exn.name exn) ; PFFI.Stdio.print "\n" ; P.MLton.bug ("unhandled exception in Basis Library"))) in end (* Install an emergency suffix. *) local structure P = Primitive val _ = P.TopLevel.setSuffix (fn () => P.MLton.bug ("missing suffix in Basis Library")) in end mlton-20210117+dfsg/basis-library/primitive/primitive.mlb000066400000000000000000000036131416264345000233100ustar00rootroot00000000000000(* Copyright (C) 2016-2017,2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "allowConstant true" "allowFFI true" "allowPrim true" "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused false" in prim-basis.mlb ann "allowRedefineSpecialIds true" in prim1.sml end ../util/integral-comparisons.sml ../util/string-comparisons.sml ../util/real-comparisons.sml local ../config/bind/char-prim.sml ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/real-prim.sml ../config/bind/string-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/choose-char.sml ../config/choose-int.sml ../config/choose-real.sml ../config/choose-string.sml ../config/choose-word.sml ../config/c/word-to-bool.sml end end prim-iwconv.sml prim-word.sml prim-int.sml local ../config/bind/int-prim.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml ../config/seqindex/seqindex-$(SEQINDEX_INT).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/errno.sml ../config/c/position.sml ../config/c/sys-word.sml end end prim-seq.sml prim-nullstring.sml prim-mlton.sml basis-ffi.sml prim-int-inf.sml prim-char.sml prim-string.sml prim-real.sml prim-pack-word.sml prim-pack-real.sml prim2.sml (* Check compatibility between primitives and runtime functions. *) check-real.sml end mlton-20210117+dfsg/basis-library/real/000077500000000000000000000000001416264345000175145ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/real/IEEE-real.sig000066400000000000000000000016631416264345000216560ustar00rootroot00000000000000signature IEEE_REAL = sig exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO type decimal_approx = {class: float_class, digits: int list, exp: int, sign: bool} val fromString: string -> decimal_approx option val getRoundingMode: unit -> rounding_mode val scan: (char, 'a) StringCvt.reader -> (decimal_approx, 'a) StringCvt.reader val setRoundingMode: rounding_mode -> unit val toString: decimal_approx -> string end signature IEEE_REAL_EXTRA = sig include IEEE_REAL val withRoundingMode: rounding_mode * (unit -> 'a) -> 'a end mlton-20210117+dfsg/basis-library/real/IEEE-real.sml000066400000000000000000000352531416264345000216710ustar00rootroot00000000000000(* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure IEEEReal: IEEE_REAL_EXTRA = struct val op + = Int.+ val op - = Int.- val op * = Int.* exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED structure Prim = PrimitiveFFI.IEEEReal datatype float_class = INF | NAN | NORMAL | SUBNORMAL | ZERO structure RoundingMode = struct datatype t = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO fun fromInt (i: C_Int.int): t = let open Prim.RoundingMode in if i = FE_TONEAREST then TO_NEAREST else if i = FE_DOWNWARD then TO_NEGINF else if i = FE_UPWARD then TO_POSINF else if i = FE_TOWARDZERO then TO_ZERO else raise Fail "IEEEReal.RoundingMode.fromInt" end fun toInt (m: t): C_Int.int = let open Prim.RoundingMode val i = case m of TO_NEAREST => FE_TONEAREST | TO_NEGINF => FE_DOWNWARD | TO_POSINF => FE_UPWARD | TO_ZERO => FE_TOWARDZERO in if i = FE_NOSUPPORT then raise Fail "IEEEReal rounding mode not supported" else i end end datatype rounding_mode = datatype RoundingMode.t fun setRoundingMode (m: rounding_mode): unit = if Prim.setRoundingMode (RoundingMode.toInt m) = 0 then () else raise PosixError.raiseSys PosixError.inval val getRoundingMode = RoundingMode.fromInt o Prim.getRoundingMode fun withRoundingMode (m: rounding_mode, th: unit -> 'a): 'a = let val m' = getRoundingMode () val _ = setRoundingMode m val res = th () val _ = setRoundingMode m' in res end structure DecimalApprox = struct type t = {class: float_class, digits: int list, exp: int, sign: bool} val inf: t = {class = INF, digits = [], exp = 0, sign = false} val zero: t = {class = ZERO, digits = [], exp = 0, sign = false} end type decimal_approx = DecimalApprox.t fun 'a scan reader (state: 'a) = let val state = StringCvt.skipWS reader state fun readc (c, state, f) = case reader state of NONE => NONE | SOME (c', state') => if c = Char.toLower c' then f state' else NONE fun readString (s, state, failure, success) = let val n = String.size s fun loop (i, state) = if i = n then success state else case reader state of NONE => failure () | SOME (c, state) => if Char.toLower c = String.sub (s, i) then loop (i + 1, state) else failure () in loop (0, state) end fun charToDigit c = Char.ord c - Char.ord #"0" fun digitStar (ds: int list, state) = let fun done () = (rev ds, state) in case reader state of NONE => done () | SOME (c, state) => if Char.isDigit c then digitStar (charToDigit c :: ds, state) else done () end fun digitPlus (state, failure, success) = case reader state of NONE => failure () | SOME (c, state) => if Char.isDigit c then success (digitStar ([charToDigit c], state)) else failure () (* [+~-]?[0-9]+ *) type exp = {digits: int list, negate: bool} fun 'b afterE (state: 'a, failure: unit -> 'b, success: exp * 'a -> 'b) : 'b = case reader state of NONE => failure () | SOME (c, state) => let fun neg () = digitPlus (state, failure, fn (ds, state) => success ({digits = ds, negate = true}, state)) in case c of #"+" => digitPlus (state, failure, fn (ds, state) => success ({digits = ds, negate = false}, state)) | #"~" => neg () | #"-" => neg () | _ => if Char.isDigit c then let val (ds, state) = digitStar ([charToDigit c], state) in success ({digits = ds, negate = false}, state) end else failure () end (* e[+~-]?[0-9]+)? *) fun exp (state: 'a, failure, success) = case reader state of NONE => failure () | SOME (c, state) => case Char.toLower c of #"e" => afterE (state, failure, success) | _ => failure () (* (\.[0-9]+)(e[+~-]?[0-9]+)? *) fun 'b afterDot (state: 'a, failure: unit -> 'b, success: int list * exp * 'a -> 'b) = digitPlus (state, failure, fn (frac, state) => exp (state, fn () => success (frac, {digits = [], negate = false}, state), fn (e, state) => success (frac, e, state))) fun stripLeadingZeros (ds: int list): int * int list = let fun loop (i, ds) = case ds of [] => (i, []) | d :: ds' => if d = 0 then loop (i + 1, ds') else (i, ds) in loop (0, ds) end fun stripTrailingZeros ds = case ds of [] => [] | _ => case List.last ds of 0 => rev (#2 (stripLeadingZeros (rev ds))) | _ => ds fun done (whole: int list, frac: int list, {digits: int list, negate: bool}, state: 'a) = let val (_, il) = stripLeadingZeros whole val fl = stripTrailingZeros frac datatype exp = Int of int | Overflow of DecimalApprox.t val exp = case (SOME (let val i = List.foldl (fn (d, n) => n * 10 + d) 0 digits in if negate then Int.~ i else i end) handle General.Overflow => NONE) of NONE => Overflow (if negate then DecimalApprox.zero else DecimalApprox.inf) | SOME i => Int i val da = case il of [] => (case fl of [] => DecimalApprox.zero | _ => case exp of Int e => let val (m, fl) = stripLeadingZeros fl in {class = NORMAL, digits = fl, exp = e - m, sign = false} end | Overflow da => da) | _ => case exp of Int e => {class = NORMAL, digits = stripTrailingZeros (il @ fl), exp = e + length il, sign = false} | Overflow da => da in SOME (da, state) end fun normal' (c, state) = case Char.toLower c of #"i" => readc (#"n", state, fn state => readc (#"f", state, fn state => let fun res state = SOME ({class = INF, digits = [], exp = 0, sign = false}, state) in readString ("inity", state, fn () => res state, res) end)) | #"n" => readc (#"a", state, fn state => readc (#"n", state, fn state => SOME ({class = NAN, digits = [], exp = 0, sign = false}, state))) (* (([0-9]+(\.[0-9]+)?)|(\.[0-9]+))(e[+~-]?[0-9]+)? *) | #"." => afterDot (state, fn () => NONE, fn (frac, exp, state) => done ([], frac, exp, state)) | _ => if Char.isDigit c then (* ([0-9]+(\.[0-9]+)?)(e[+~-]?[0-9]+)? *) let val (whole, state) = digitStar ([charToDigit c], state) fun no () = done (whole, [], {digits = [], negate = false}, state) in case reader state of NONE => no () | SOME (c, state) => case Char.toLower c of #"." => afterDot (state, no, fn (frac, e, state) => done (whole, frac, e, state)) | #"e" => afterE (state, no, fn (e, state) => done (whole, [], e, state)) | _ => no () end else NONE fun normal state = case reader state of NONE => NONE | SOME z => normal' z fun negate state = case normal state of NONE => NONE | SOME ({class, digits, exp, ...}, state) => SOME ({class = class, digits = digits, exp = exp, sign = true}, state) in case reader state of NONE => NONE | SOME (c, state) => case c of #"~" => negate state | #"-" => negate state | #"+" => normal state | _ => normal' (c, state) end fun fromString s = StringCvt.scanString scan s fun toString {class, sign, digits, exp}: string = let fun digitStr () = implode (map StringCvt.digitToChar digits) fun norm () = let val num = "0." ^ digitStr() in if exp = 0 then num else concat [num, "E", Int.toString exp] end val num = case class of ZERO => "0.0" | NORMAL => norm () | SUBNORMAL => norm () | INF => "inf" | NAN => "nan" in if sign then "~" ^ num else num end end mlton-20210117+dfsg/basis-library/real/math.sig000066400000000000000000000010411416264345000211450ustar00rootroot00000000000000signature MATH = sig type real val acos: real -> real val asin: real -> real val atan2: real * real -> real val atan: real -> real val cos: real -> real val cosh: real -> real val e: real val exp: real -> real val ln: real -> real val log10: real -> real val pi: real val pow: real * real -> real val sin: real -> real val sinh: real -> real val sqrt: real -> real val tan: real -> real val tanh: real -> real end mlton-20210117+dfsg/basis-library/real/pack-real.sig000066400000000000000000000011401416264345000220530ustar00rootroot00000000000000signature PACK_REAL = sig type real val bytesPerElem: int val isBigEndian: bool val toBytes: real -> Word8Vector.vector val fromBytes: Word8Vector.vector -> real val subVec: Word8Vector.vector * int -> real val subArr: Word8Array.array * int -> real val update: Word8Array.array * int * real -> unit end signature PACK_REAL_EXTRA = sig include PACK_REAL val unsafeSubVec: Word8Vector.vector * int -> real val unsafeSubArr: Word8Array.array * int -> real val unsafeUpdate: Word8Array.array * int * real -> unit end mlton-20210117+dfsg/basis-library/real/pack-real.sml000066400000000000000000000224721416264345000220770ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PackRealArg (S: sig type real type word val subArr: Word8.word array * SeqIndex.int -> word val subVec: Word8.word vector * SeqIndex.int -> word val update: Word8.word array * SeqIndex.int * word -> unit val bswap: word -> word val castFromWord: word -> real val castToWord: real -> word end) = struct open S val subArrRev = castFromWord o bswap o subArr val subVecRev = castFromWord o bswap o subVec fun updateRev (a, i, r) = update (a, i, bswap (castToWord r)) val subArr = castFromWord o subArr val subVec = castFromWord o subVec val update = fn (a, i, r) => update (a, i, castToWord r) end structure PackReal32Arg = PackRealArg (open Primitive.PackReal32 open Primitive.PackWord32 val bswap = Word32.bswap) structure PackReal64Arg = PackRealArg (open Primitive.PackReal64 open Primitive.PackWord64 val bswap = Word64.bswap) structure PackRealArg = struct type real = Real.real local structure S = Real_ChooseRealN (type 'a t = int val fReal32 = Real32.realSize val fReal64 = Real64.realSize) in val realSize = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArr val fReal64 = PackReal64Arg.subArr) in val subArr = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVec val fReal64 = PackReal64Arg.subVec) in val subVec = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.update val fReal64 = PackReal64Arg.update) in val update = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArrRev val fReal64 = PackReal64Arg.subArrRev) in val subArrRev = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVecRev val fReal64 = PackReal64Arg.subVecRev) in val subVecRev = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.updateRev val fReal64 = PackReal64Arg.updateRev) in val updateRev = S.f end end structure PackLargeRealArg = struct type real = LargeReal.real local structure S = LargeReal_ChooseRealN (type 'a t = int val fReal32 = Real32.realSize val fReal64 = Real64.realSize) in val realSize = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArr val fReal64 = PackReal64Arg.subArr) in val subArr = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVec val fReal64 = PackReal64Arg.subVec) in val subVec = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.update val fReal64 = PackReal64Arg.update) in val update = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArrRev val fReal64 = PackReal64Arg.subArrRev) in val subArrRev = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVecRev val fReal64 = PackReal64Arg.subVecRev) in val subVecRev = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.updateRev val fReal64 = PackReal64Arg.updateRev) in val updateRev = S.f end end functor PackReal (S: sig type real val realSize: int val isBigEndian: bool val subArr: Word8.word array * SeqIndex.int -> real val subVec: Word8.word vector * SeqIndex.int -> real val update: Word8.word array * SeqIndex.int * real -> unit val subArrRev: Word8.word array * SeqIndex.int -> real val subVecRev: Word8.word vector * SeqIndex.int -> real val updateRev: Word8.word array * SeqIndex.int * real -> unit end): PACK_REAL_EXTRA = struct open S val bytesPerElem = Int.div (realSize, 8) fun offset (i, n) = let val i' = Int.* (bytesPerElem, i) val () = if Primitive.Controls.safe andalso (Int.geu (Int.+ (i', Int.- (bytesPerElem, 1)), n)) then raise Subscript else () in SeqIndex.fromInt i end handle Overflow => raise Subscript val (subA, subV, updA) = if isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian then (subArr, subVec, update) else (subArrRev, subVecRev, updateRev) fun update (a, i, r) = let val i = offset (i, Word8Array.length a) val a = Word8Array.toPoly a in updA (a, i, r) end fun unsafeUpdate (a, i, r) = let val i = SeqIndex.fromInt i val a = Word8Array.toPoly a in updA (a, i, r) end local fun make (sub, length, toPoly) (av, i) = let val i = offset (i, length av) in sub (toPoly av, i) end in val subArr = make (subA, Word8Array.length, Word8Array.toPoly) val subVec = make (subV, Word8Vector.length, Word8Vector.toPoly) end local fun make (sub, length, toPoly) (av, i) = let val i = SeqIndex.fromInt i in sub (toPoly av, i) end in val unsafeSubArr = make (subA, Word8Array.length, Word8Array.toPoly) val unsafeSubVec = make (subV, Word8Vector.length, Word8Vector.toPoly) end fun toBytes (r: real): Word8Vector.vector = let val a = Array.alloc bytesPerElem in (updA (a, 0, r) ; Word8Vector.fromPoly (Array.vector a)) end fun fromBytes v = subVec (v, 0) end structure PackReal32Big: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = true) structure PackReal32Little: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = false) structure PackReal32Host: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackReal64Big: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = true) structure PackReal64Little: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = false) structure PackReal64Host: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackRealBig: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = true) structure PackRealLittle: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = false) structure PackRealHost: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackLargeRealBig: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = true) structure PackLargeRealLittle: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = false) structure PackLargeRealHost: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) mlton-20210117+dfsg/basis-library/real/real-global.sml000066400000000000000000000005151416264345000224130ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val real = Real.fromInt structure RealGlobal: REAL_GLOBAL = Real open RealGlobal mlton-20210117+dfsg/basis-library/real/real.sig000066400000000000000000000120221416264345000211400ustar00rootroot00000000000000signature PRE_REAL_GLOBAL = sig type real structure Math: MATH where type real = real end signature PRE_REAL = sig include PRE_REAL_GLOBAL val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val ~ : real -> real val abs: real -> real val realSize: Primitive.Int32.int val exponentBias: Primitive.Int32.int val precision: Primitive.Int32.int val radix: Primitive.Int32.int val frexp: real * C_Int.int ref -> real val ldexp: real * C_Int.int -> real val modf: real * real ref -> real val round: real -> real val realCeil: real -> real val realFloor: real -> real val realTrunc: real -> real val gdtoa: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t val strtor: Primitive.NullString8.t * C_Int.t -> real val fromInt8Unsafe: Primitive.Int8.int -> real val fromInt16Unsafe: Primitive.Int16.int -> real val fromInt32Unsafe: Primitive.Int32.int -> real val fromInt64Unsafe: Primitive.Int64.int -> real val fromReal32Unsafe: Primitive.Real32.real -> real val fromReal64Unsafe: Primitive.Real64.real -> real val fromWord8Unsafe: Primitive.Word8.word -> real val fromWord16Unsafe: Primitive.Word16.word -> real val fromWord32Unsafe: Primitive.Word32.word -> real val fromWord64Unsafe: Primitive.Word64.word -> real val toInt8Unsafe: real -> Primitive.Int8.int val toInt16Unsafe: real -> Primitive.Int16.int val toInt32Unsafe: real -> Primitive.Int32.int val toInt64Unsafe: real -> Primitive.Int64.int val toReal32Unsafe: real -> Primitive.Real32.real val toReal64Unsafe: real -> Primitive.Real64.real val toWord8Unsafe: real -> Primitive.Word8.word val toWord16Unsafe: real -> Primitive.Word16.word val toWord32Unsafe: real -> Primitive.Word32.word val toWord64Unsafe: real -> Primitive.Word64.word end signature REAL_GLOBAL = sig include PRE_REAL_GLOBAL val round: real -> Int.int val trunc: real -> Int.int val ceil: real -> Int.int val floor: real -> Int.int end signature REAL = sig include REAL_GLOBAL val != : real * real -> bool val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val ~ : real -> real val abs: real -> real val checkFloat: real -> real val class: real -> IEEEReal.float_class val compare: real * real -> order val compareReal: real * real -> IEEEReal.real_order val copySign: real * real -> real val fmt: StringCvt.realfmt -> real -> string val fromDecimal: IEEEReal.decimal_approx -> real option val fromInt: int -> real val fromLarge: IEEEReal.rounding_mode -> LargeReal.real -> real val fromLargeInt: LargeInt.int -> real val fromManExp: {man: real, exp: int} -> real val fromString: string -> real option val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val max: real * real -> real val maxFinite: real val min: real * real -> real val minNormalPos: real val minPos: real val negInf: real val nextAfter: real * real -> real val posInf: real val precision: int val radix: int val realCeil: real -> real val realFloor: real -> real val realMod: real -> real val realRound: real -> real val realTrunc: real -> real val rem: real * real -> real val sameSign: real * real -> bool val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val sign: real -> int val signBit: real -> bool val split: real -> {whole: real, frac: real} val toDecimal: real -> IEEEReal.decimal_approx val toInt: IEEEReal.rounding_mode -> real -> int val toLarge: real -> LargeReal.real val toLargeInt: IEEEReal.rounding_mode -> real -> LargeInt.int val toManExp: real -> {man: real, exp: int} val toString: real -> string val unordered: real * real -> bool end signature REAL_EXTRA = sig include REAL val realSize: Int.int val fromWord: word -> real val fromLargeWord: LargeWord.word -> real val toWord: IEEEReal.rounding_mode -> real -> word val toLargeWord: IEEEReal.rounding_mode -> real -> LargeWord.word end mlton-20210117+dfsg/basis-library/real/real.sml000066400000000000000000001222211416264345000211540ustar00rootroot00000000000000(* Copyright (C) 2011-2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Real (structure W: WORD_EXTRA structure R: sig include PRE_REAL val castToWord: real -> W.word val castFromWord: W.word -> real end): REAL_EXTRA = struct structure MLton = Primitive.MLton structure Prim = R local open IEEEReal in datatype float_class = datatype float_class datatype rounding_mode = datatype rounding_mode end infix 4 == != ?= type real = R.real local open Prim in val realSize = Int32.toInt realSize val exponentBias = Int32.toInt exponentBias val precision = Int32.toInt precision val radix = Int32.toInt radix end val signBits = Word.one val exponentSignificandBits = Word.- (Word.fromInt realSize, signBits) val significandBits = Word.- (Word.fromInt precision, Word.one) val exponentBits = Word.- (exponentSignificandBits, significandBits) local val mkMask : Word.word -> W.word = fn b => W.notb (W.<< (W.notb W.zero, b)) in val signMask = W.<< (mkMask signBits, exponentSignificandBits) val exponentMask = W.<< (mkMask exponentBits, significandBits) val significandMask = mkMask significandBits end val class : real -> float_class = fn r => let val w = R.castToWord r in if W.andb (w, exponentMask) = exponentMask then if W.andb (w, significandMask) = W.zero then IEEEReal.INF else IEEEReal.NAN else if W.andb (w, exponentMask) = W.zero then if W.andb (w, significandMask) = W.zero then IEEEReal.ZERO else IEEEReal.SUBNORMAL else IEEEReal.NORMAL end val toBits : real -> {sign: bool, exponent: W.word, significand: W.word} = fn r => let val w = R.castToWord r val significand = W.andb (w, significandMask) val exponent = W.>> (W.andb (w, exponentMask), significandBits) val sign = W.andb (w, signMask) = signMask in {sign = sign, exponent = exponent, significand = significand} end val fromBits : {sign: bool, exponent: W.word, significand: W.word} -> real = fn {sign, exponent, significand} => let val w = W.orb (if sign then W.<< (W.one, exponentSignificandBits) else W.zero, W.orb (W.andb (W.<< (exponent, significandBits), exponentMask), W.andb (significand, significandMask))) val r = R.castFromWord w in r end local open Prim in val op *+ = op *+ val op *- = op *- val op * = op * val op + = op + val op - = op - val op / = op / val op < = op < val op <= = op <= val op > = op > val op >= = op >= val ~ = ~ val abs = abs end local fun 'a make {fromRealUnsafe: 'a -> real, toRealUnsafe: real -> 'a, other : {precision: Primitive.Int32.int}} = if R.precision = #precision other then (fn (_: rounding_mode) => fromRealUnsafe, toRealUnsafe) else (fn (m: rounding_mode) => fn r => IEEEReal.withRoundingMode (m, fn () => fromRealUnsafe r), toRealUnsafe) in val (fromReal32,toReal32) = make {fromRealUnsafe = R.fromReal32Unsafe, toRealUnsafe = R.toReal32Unsafe, other = {precision = Primitive.Real32.precision}} val (fromReal64,toReal64) = make {fromRealUnsafe = R.fromReal64Unsafe, toRealUnsafe = R.toReal64Unsafe, other = {precision = Primitive.Real64.precision}} end local structure S = LargeReal_ChooseRealN (type 'a t = real -> 'a val fReal32 = toReal32 val fReal64 = toReal64) in val toLarge = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = rounding_mode -> 'a -> real val fReal32 = fromReal32 val fReal64 = fromReal64) in val fromLarge = S.f end val negInf = R.castFromWord (W.orb (signMask, exponentMask)) val negOne = R.castFromWord (W.orb (signMask, W.<< (W.fromInt exponentBias, significandBits))) val negZero = R.castFromWord signMask val zero = R.castFromWord W.zero val minPos = R.castFromWord W.one val minNormalPos = R.castFromWord (W.<< (W.one, significandBits)) val half = R.castFromWord (W.<< (W.- (W.fromInt exponentBias, W.one), significandBits)) val one = R.castFromWord (W.<< (W.fromInt exponentBias, significandBits)) val two = R.castFromWord (W.<< (W.+ (W.fromInt exponentBias, W.one), significandBits)) val maxFinite = R.castFromWord (W.- (exponentMask, W.one)) val posInf = R.castFromWord exponentMask val nan = posInf + negInf val posNan = R.castFromWord (W.andb (R.castToWord nan, W.notb signMask)) val negNan = R.castFromWord (W.orb (R.castToWord nan, signMask)) fun isFinite r = abs r <= maxFinite val op == = Prim.== val op != = not o op == fun isNan r = r != r fun isNormal r = class r = NORMAL val op ?= = R.?= fun min (x, y) = if x <= y then x else if x > y then y else if isNan y then x else y fun max (x, y) = if x >= y then x else if x < y then y else if isNan y then x else y fun sign (x: real): int = if x > zero then 1 else if x < zero then ~1 else if x == zero then 0 else raise Domain val signBit = #sign o toBits fun sameSign (x, y) = signBit x = signBit y fun copySign (x, y) = if sameSign (x, y) then x else ~ x local structure I = IEEEReal in fun compareReal (x, y) = if x < y then I.LESS else if x > y then I.GREATER else if x == y then I.EQUAL else I.UNORDERED end local structure I = IEEEReal structure G = General in fun compare (x, y) = case compareReal (x, y) of I.EQUAL => G.EQUAL | I.GREATER => G.GREATER | I.LESS => G.LESS | I.UNORDERED => raise IEEEReal.Unordered end fun unordered (x, y) = isNan x orelse isNan y (* nextAfter for subnormal and normal values works by converting * the real to a word of equivalent size and doing an increment * or decrement on the word. Because of the way IEEE floating * point numbers are represented, word {de,in}crement * automatically does the right thing at the boundary between * normals and denormals. Also, convienently, * maxFinite+1 = posInf and minFinite-1 = negInf. *) val nextAfter: real * real -> real = fn (r, t) => case (class r, class t) of (NAN, _) => nan | (_, NAN) => nan | (INF, _) => r | (ZERO, ZERO) => t (* want "t", not "r", to get the sign right *) | (ZERO, _) => if t > zero then minPos else ~minPos | _ => if r == t then r else if (r > t) = (r > zero) then R.castFromWord (W.- (R.castToWord r, W.one)) else R.castFromWord (W.+ (R.castToWord r, W.one)) local val one = One.make (fn () => ref (0 : C_Int.t)) in fun toManExp x = case class x of INF => {exp = 0, man = x} | NAN => {exp = 0, man = nan} | ZERO => {exp = 0, man = x} | _ => One.use (one, fn r => let val man = R.frexp (x, r) in {exp = C_Int.toInt (!r), man = man} end) end fun fromManExp {exp, man} = (R.ldexp (man, C_Int.fromInt exp)) handle Overflow => man * (if Int.< (exp, 0) then zero else posInf) val fromManExp = if MLton.Codegen.isX86 then fromManExp else fn {exp, man} => case class man of INF => man | NAN => man | ZERO => man | _ => fromManExp {exp = exp, man = man} local val one = One.make (fn () => ref zero) in fun split x = case class x of INF => {frac = if x > zero then zero else ~zero, whole = x} | NAN => {frac = nan, whole = nan} | _ => let val (frac, whole) = One.use (one, fn int => (R.modf (x, int), !int)) (* Some platforms' C libraries don't get sign of * zero right. *) fun fix y = if class y = ZERO andalso not (sameSign (x, y)) then ~ y else y in {frac = fix frac, whole = fix whole} end end val realMod = #frac o split fun checkFloat x = if isFinite x then x else if isNan x then raise Div else raise Overflow val realCeil = R.realCeil val realFloor = R.realFloor val realTrunc = R.realTrunc (* Unfortunately, libc round ties to zero instead of even values. *) (* Fortunately, if any rounding mode is supported, it's TO_NEAREST. *) val realRound = fn r => IEEEReal.withRoundingMode (TO_NEAREST, fn () => R.round r) fun rem (x, y) = (case class x of INF => nan | NAN => nan | ZERO => zero | _ => (case class y of INF => x | NAN => nan | ZERO => nan | _ => x - realTrunc (x/y) * y)) (* fromDecimal, scan, fromString: decimal -> binary conversions *) fun strtor (str: NullString.t, rounding_mode: IEEEReal.rounding_mode) = let val rounding : C_Int.int = case rounding_mode of TO_NEAREST => 1 | TO_NEGINF => 3 | TO_POSINF => 2 | TO_ZERO => 0 in Prim.strtor (str, rounding) end exception Bad fun fromDecimalWithRoundingMode ({class, digits, exp, sign}: IEEEReal.decimal_approx, rounding_mode: IEEEReal.rounding_mode) = let fun doit () = let val exp = if Int.< (exp, 0) then concat ["-", Int.toString (Int.~ exp)] else Int.toString exp (* val str = concat [if sign then "-" else "", "0.", digits, "E", exp, "\000"] *) val n = Int.+ (if sign then 1 else 0, Int.+ (4 (* "0." + "E" + "\000" *), Int.+ (List.length digits, String.size exp))) val a = Array.alloc n fun upd (i, c) = (Array.update (a, i, c); Int.+ (i, 1)) val i = 0 val i = if sign then upd (i, #"-") else i val i = upd (i, #"0") val i = upd (i, #".") val i = List.foldl (fn (d, i) => if Int.< (d, 0) orelse Int.> (d, 9) then raise Bad else upd (i, Char.chr (Int.+ (d, Char.ord #"0")))) i digits val i = upd (i, #"E") val i = CharVector.foldl (fn (c, i) => upd (i, c)) i exp val _ = upd (i, #"\000") val str = Vector.unsafeFromArray a val x = strtor (NullString.fromString str, rounding_mode) in x end in SOME (case class of INF => if sign then negInf else posInf | NAN => if sign then negNan else posNan | NORMAL => doit () | SUBNORMAL => doit () | ZERO => if sign then negZero else zero) handle Bad => NONE end fun fromDecimal da = fromDecimalWithRoundingMode (da, TO_NEAREST) fun scan reader state = case IEEEReal.scan reader state of NONE => NONE | SOME (da, state) => SOME (valOf (fromDecimalWithRoundingMode (da, IEEEReal.getRoundingMode ())), state) val fromString = StringCvt.scanString scan (* toDecimal, fmt, toString: binary -> decimal conversions. *) datatype mode = Fix | Gen | Sci local val decpt = ref (0: C_Int.int) in fun gdtoa (x: real, mode: mode, ndig: int, rounding_mode: IEEEReal.rounding_mode) = let val mode : C_Int.int = case mode of Fix => 3 | Gen => 0 | Sci => 2 val ndig : C_Int.int = C_Int.fromInt ndig val rounding : C_Int.int = case rounding_mode of TO_NEAREST => 1 | TO_NEGINF => 3 | TO_POSINF => 2 | TO_ZERO => 0 val _ = Primitive.MLton.Thread.atomicBegin () in DynamicWind.wind (fn () => (CUtil.C_String.toString (Prim.gdtoa (x, mode, ndig, rounding, decpt)), C_Int.toInt (!decpt)), Primitive.MLton.Thread.atomicEnd) end end fun toDecimal (x: real): IEEEReal.decimal_approx = case class x of INF => {class = INF, digits = [], exp = 0, sign = x < zero} | NAN => {class = NAN, digits = [], exp = 0, sign = signBit x} | ZERO => {class = ZERO, digits = [], exp = 0, sign = signBit x} | c => let val (s, exp) = gdtoa (x, Gen, 0, TO_NEAREST) fun loop (i, ac) = if Int.< (i, 0) then ac else loop (Int.- (i, 1), (Int.- (Char.ord (String.sub (s, i)), Char.ord #"0")) :: ac) val digits = loop (Int.- (String.size s, 1), []) in {class = c, digits = digits, exp = exp, sign = x < zero} end datatype realfmt = datatype StringCvt.realfmt local fun fix (sign: string, s: String.string, decpt: int, ndig: int): string = let val length = String.size s in if Int.< (decpt, 0) then concat [sign, "0.", String.new (Int.~ decpt, #"0"), s, String.new (Int.+ (Int.- (ndig, length), decpt), #"0")] else let val whole = if decpt = 0 then "0" else String.tabulate (decpt, fn i => if Int.< (i, length) then String.sub (s, i) else #"0") in if 0 = ndig then concat [sign, whole] else let val frac = String.tabulate (ndig, fn i => let val j = Int.+ (i, decpt) in if Int.< (j, length) then String.sub (s, j) else #"0" end) in concat [sign, whole, ".", frac] end end end fun sci (x: real, ndig: int): string = let val sign = if x < zero then "~" else "" val (s, decpt) = gdtoa (x, Sci, Int.+ (1, ndig), IEEEReal.getRoundingMode ()) val length = String.size s val whole = String.tabulate (1, fn _ => String.sub (s, 0)) val frac = if 0 = ndig then "" else concat [".", String.tabulate (ndig, fn i => let val j = Int.+ (i, 1) in if Int.< (j, length) then String.sub (s, j) else #"0" end)] val exp = Int.- (decpt, 1) val exp = let val (exp, sign) = if Int.< (exp, 0) then (Int.~ exp, "~") else (exp, "") in concat [sign, Int.toString exp] end in concat [sign, whole, frac, "E", exp] end fun gen (x: real, n: int): string = let val (prefix, x) = if x < zero then ("~", ~ x) else ("", x) val ss = Substring.full (sci (x, Int.- (n, 1))) fun isE c = c = #"E" fun isZero c = c = #"0" val expS = Substring.string (Substring.taker (not o isE) ss) val exp = valOf (Int.fromString expS) val man = String.translate (fn #"." => "" | c => str c) (Substring.string (Substring.dropr isZero (Substring.takel (not o isE) ss))) val manSize = String.size man fun zeros i = CharVector.tabulate (i, fn _ => #"0") fun dotAt i = concat [String.substring (man, 0, i), ".", String.extract (man, i, NONE)] fun sci () = concat [prefix, if manSize = 1 then man else dotAt 1, "E", expS] val op - = Int.- val op + = Int.+ val ~ = Int.~ val op >= = Int.>= in if exp >= (if manSize = 1 then 3 else manSize + 3) then sci () else if exp >= manSize - 1 then concat [prefix, man, zeros (exp - (manSize - 1))] else if exp >= 0 then concat [prefix, dotAt (exp + 1)] else if exp >= (if manSize = 1 then ~2 else ~3) then concat [prefix, "0.", zeros (~exp - 1), man] else sci () end in fun fmt spec = let val doit = case spec of EXACT => IEEEReal.toString o toDecimal | FIX opt => let val n = case opt of NONE => 6 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 0) then raise Size else n in fn x => let val sign = if x < zero then "~" else "" val (s, decpt) = gdtoa (x, Fix, n, IEEEReal.getRoundingMode ()) in fix (sign, s, decpt, n) end end | GEN opt => let val n = case opt of NONE => 12 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 1) then raise Size else n in fn x => gen (x, n) end | SCI opt => let val n = case opt of NONE => 6 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 0) then raise Size else n in fn x => sci (x, n) end in fn x => case class x of NAN => (* if signBit x then "~nan" else *) "nan" | INF => if x > zero then "inf" else "~inf" | _ => doit x end end val toString = fmt (StringCvt.GEN NONE) (* Not all devices support all rounding modes. * However, every device has ceil/floor/round/trunc. *) fun safeConvert (m, cvt, x) = case m of TO_POSINF => cvt (realCeil x) | TO_NEGINF => cvt (realFloor x) | TO_NEAREST => cvt (realRound x) | TO_ZERO => cvt (realTrunc x) local fun 'a make {fromIntUnsafe: 'a -> real, toIntUnsafe: real -> 'a, other : {maxInt': Word.word -> 'a, minInt': 'a, precision': int}} = (fromIntUnsafe, if Int.< (precision, #precision' other) then let val trim = Int.- (Int.- (#precision' other, precision), 1) val maxInt' = (#maxInt' other) (Word.fromInt trim) val minInt' = #minInt' other val maxInt = fromIntUnsafe maxInt' val minInt = fromIntUnsafe minInt' in fn (m: rounding_mode) => fn x => if minInt <= x then if x <= maxInt then safeConvert (m, toIntUnsafe, x) else raise Overflow else if x < minInt then raise Overflow else raise Domain (* NaN *) end else let val maxInt' = (#maxInt' other) 0w0 val minInt' = #minInt' other val maxInt = fromIntUnsafe maxInt' val minInt = fromIntUnsafe minInt' in fn (m: rounding_mode) => fn x => if minInt <= x then if x <= maxInt then safeConvert (m, toIntUnsafe, x) else if x < maxInt + one then (case m of TO_NEGINF => maxInt' | TO_POSINF => raise Overflow | TO_ZERO => maxInt' | TO_NEAREST => (* Depends on maxInt being odd. *) if x - maxInt >= half then raise Overflow else maxInt') else raise Overflow else if x < minInt then if minInt - one < x then (case m of TO_NEGINF => raise Overflow | TO_POSINF => minInt' | TO_ZERO => minInt' | TO_NEAREST => (* Depends on minInt being even. *) if x - minInt < ~half then raise Overflow else minInt') else raise Overflow else raise Domain (* NaN *) end) in val (fromInt8,toInt8) = make {fromIntUnsafe = R.fromInt8Unsafe, toIntUnsafe = R.toInt8Unsafe, other = {maxInt' = fn w => Int8.<< (Int8.>> (Int8.maxInt', w), w), minInt' = Int8.minInt', precision' = Int8.precision'}} val (fromInt16,toInt16) = make {fromIntUnsafe = R.fromInt16Unsafe, toIntUnsafe = R.toInt16Unsafe, other = {maxInt' = fn w => Int16.<< (Int16.>> (Int16.maxInt', w), w), minInt' = Int16.minInt', precision' = Int16.precision'}} val (fromInt32,toInt32) = make {fromIntUnsafe = R.fromInt32Unsafe, toIntUnsafe = R.toInt32Unsafe, other = {maxInt' = fn w => Int32.<< (Int32.>> (Int32.maxInt', w), w), minInt' = Int32.minInt', precision' = Int32.precision'}} val (fromInt64,toInt64) = make {fromIntUnsafe = R.fromInt64Unsafe, toIntUnsafe = R.toInt64Unsafe, other = {maxInt' = fn w => Int64.<< (Int64.>> (Int64.maxInt', w), w), minInt' = Int64.minInt', precision' = Int64.precision'}} end val fromIntInf: IntInf.int -> real = fn i => let val str = if IntInf.< (i, 0) then "-" ^ (IntInf.toString (IntInf.~ i)) else IntInf.toString i val x = strtor (NullString.nullTerm str, IEEEReal.getRoundingMode ()) in x end val toIntInf: rounding_mode -> real -> LargeInt.int = fn mode => fn x => case class x of INF => raise Overflow | NAN => raise Domain | ZERO => (0 : LargeInt.int) | _ => let (* This round may turn x into an INF, so we need to check the * class again. *) val x = case mode of TO_POSINF => realCeil x | TO_NEGINF => realFloor x | TO_NEAREST => realRound x | TO_ZERO => realTrunc x in case class x of INF => raise Overflow | _ => valOf (IntInf.fromString (fmt (StringCvt.FIX (SOME 0)) x)) end local structure S = Int_ChooseInt (type 'a t = 'a -> real val fInt8 = fromInt8 val fInt16 = fromInt16 val fInt32 = fromInt32 val fInt64 = fromInt64 val fIntInf = fromIntInf) in val fromInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> real val fInt8 = fromInt8 val fInt16 = fromInt16 val fInt32 = fromInt32 val fInt64 = fromInt64 val fIntInf = fromIntInf) in val fromLargeInt = S.f end local structure S = Int_ChooseInt (type 'a t = rounding_mode -> real -> 'a val fInt8 = toInt8 val fInt16 = toInt16 val fInt32 = toInt32 val fInt64 = toInt64 val fIntInf = toIntInf) in val toInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = rounding_mode -> real -> 'a val fInt8 = toInt8 val fInt16 = toInt16 val fInt32 = toInt32 val fInt64 = toInt64 val fIntInf = toIntInf) in val toLargeInt = S.f end val floor = toInt TO_NEGINF val ceil = toInt TO_POSINF val trunc = toInt TO_ZERO val round = toInt TO_NEAREST local fun 'a make {fromWordUnsafe: 'a -> real, toWordUnsafe: real -> 'a, other : {maxWord': Word.word -> 'a, wordSize: int, zeroWord: 'a}} = (fromWordUnsafe, if Int.<= (precision, #wordSize other) then let val trim = Int.- (#wordSize other, precision) val maxWord' = (#maxWord' other) (Word.fromInt trim) val maxWord = fromWordUnsafe maxWord' val zeroWord = #zeroWord other in fn (m: rounding_mode) => fn x => case class x of INF => raise Overflow | NAN => raise Domain | _ => if zero <= x then if x <= maxWord then safeConvert (m, toWordUnsafe, x) else raise Overflow else if x > ~one then (case m of TO_NEGINF => raise Overflow | TO_POSINF => zeroWord | TO_ZERO => zeroWord | TO_NEAREST => if x < ~half then raise Overflow else zeroWord) else raise Overflow end else let val maxWord' = (#maxWord' other) 0w0 val maxWord = fromWordUnsafe maxWord' val zeroWord = #zeroWord other in fn (m: rounding_mode) => fn x => case class x of INF => raise Overflow | NAN => raise Domain | _ => if zero <= x then if x <= maxWord then safeConvert (m, toWordUnsafe, x) else if x < maxWord + one then (case m of TO_NEGINF => maxWord' | TO_POSINF => raise Overflow | TO_ZERO => maxWord' | TO_NEAREST => (* Depends on maxWord being odd. *) if x - maxWord >= half then raise Overflow else maxWord') else raise Overflow else if x > ~one then (case m of TO_NEGINF => raise Overflow | TO_POSINF => zeroWord | TO_ZERO => zeroWord | TO_NEAREST => if x < ~half then raise Overflow else zeroWord) else raise Overflow end) in val (fromWord8,toWord8) = make {fromWordUnsafe = R.fromWord8Unsafe, toWordUnsafe = R.toWord8Unsafe, other = {maxWord' = fn w => Word8.<< (Word8.>> (Word8.maxWord', w), w), wordSize = Word8.wordSize, zeroWord = Word8.zero}} val (fromWord16,toWord16) = make {fromWordUnsafe = R.fromWord16Unsafe, toWordUnsafe = R.toWord16Unsafe, other = {maxWord' = fn w => Word16.<< (Word16.>> (Word16.maxWord', w), w), wordSize = Word16.wordSize, zeroWord = Word16.zero}} val (fromWord32,toWord32) = make {fromWordUnsafe = R.fromWord32Unsafe, toWordUnsafe = R.toWord32Unsafe, other = {maxWord' = fn w => Word32.<< (Word32.>> (Word32.maxWord', w), w), wordSize = Word32.wordSize, zeroWord = Word32.zero}} val (fromWord64,toWord64) = make {fromWordUnsafe = R.fromWord64Unsafe, toWordUnsafe = R.toWord64Unsafe, other = {maxWord' = fn w => Word64.<< (Word64.>> (Word64.maxWord', w), w), wordSize = Word64.wordSize, zeroWord = Word64.zero}} end local structure S = Word_ChooseWordN (type 'a t = 'a -> real val fWord8 = fromWord8 val fWord16 = fromWord16 val fWord32 = fromWord32 val fWord64 = fromWord64) in val fromWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> real val fWord8 = fromWord8 val fWord16 = fromWord16 val fWord32 = fromWord32 val fWord64 = fromWord64) in val fromLargeWord = S.f end local structure S = Word_ChooseWordN (type 'a t = rounding_mode -> real -> 'a val fWord8 = toWord8 val fWord16 = toWord16 val fWord32 = toWord32 val fWord64 = toWord64) in val toWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = rounding_mode -> real -> 'a val fWord8 = toWord8 val fWord16 = toWord16 val fWord32 = toWord32 val fWord64 = toWord64) in val toLargeWord = S.f end structure Math = struct open Prim.Math (* Patch functions to handle out-of-range args. Many C math * libraries do not do what the SML Basis Spec requires. *) local fun patch f x = if x < ~one orelse x > one then nan else f x in val acos = patch acos val asin = patch asin end local fun patch f x = if x < zero then nan else f x in val ln = patch ln val log10 = patch log10 end (* The x86 doesn't get exp right on infs. *) val exp = if MLton.Codegen.isX86 andalso let open MLton.Platform.Arch in host = X86 end then (fn x => case class x of INF => if x > zero then posInf else zero | _ => exp x) else exp (* The Cygwin math library doesn't get pow right on some exceptional * cases. * * The Linux math library doesn't get pow (x, y) right when x < 0 * and y is large (but finite). * * So, we define a pow function that gives the correct result on * exceptional cases, and only calls the C pow with x > 0. *) fun isInt (x: real): bool = x == realFloor x (* isEven x assumes isInt x. *) fun isEven (x: real): bool = isInt (x / two) fun isOddInt x = isInt x andalso not (isEven x) fun isNeg x = x < zero fun pow (x, y) = case class y of INF => if class x = NAN then nan else if x < negOne orelse x > one then if isNeg y then zero else posInf else if negOne < x andalso x < one then if isNeg y then posInf else zero else (* x = 1 orelse x = ~1 *) nan | NAN => nan | ZERO => one | _ => (case class x of INF => if isNeg x then if isNeg y then if isOddInt y then negZero else zero else if isOddInt y then negInf else posInf else (* x = posInf *) if isNeg y then zero else posInf | NAN => nan | ZERO => if isNeg y then if isOddInt y then copySign (posInf, x) else posInf else if isOddInt y then x else zero | _ => if isNeg x then if isInt y then if isEven y then Prim.Math.pow (~ x, y) else negOne * Prim.Math.pow (~ x, y) else nan else Prim.Math.pow (x, y)) fun cosh x = case class x of INF => x | ZERO => one | _ => R.Math.cosh x fun sinh x = case class x of INF => x | ZERO => x | _ => R.Math.sinh x fun tanh x = case class x of INF => if x > zero then one else negOne | ZERO => x | _ => R.Math.tanh x end end structure Real32 = Real (structure W = Word32 structure R = struct open Primitive.Real32 local open Primitive.PackReal32 in val castToWord = castToWord val castFromWord = castFromWord end end) structure Real64 = Real (structure W = Word64 structure R = struct open Primitive.Real64 local open Primitive.PackReal64 in val castToWord = castToWord val castFromWord = castFromWord end end) mlton-20210117+dfsg/basis-library/sml-nj.mlb000066400000000000000000000007651416264345000204750ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature SML_OF_NJ structure SMLofNJ end end mlton-20210117+dfsg/basis-library/sml-nj/000077500000000000000000000000001416264345000177715ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/sml-nj/sml-nj.sig000066400000000000000000000014371416264345000217020ustar00rootroot00000000000000signature SML_OF_NJ = sig structure Cont: sig type 'a cont val callcc: ('a cont -> 'a) -> 'a val isolate: ('a -> unit) -> 'a cont val throw: 'a cont -> 'a -> 'b end structure SysInfo: sig exception UNKNOWN datatype os_kind = BEOS | MACOS | OS2 | UNIX | WIN32 val getHostArch: unit -> string val getOSKind: unit -> os_kind val getOSName: unit -> string end val exnHistory: exn -> string list val exportFn: string * (string * string list -> OS.Process.status) -> unit val exportML: string -> bool val getAllArgs: unit -> string list val getArgs: unit -> string list val getCmdName: unit -> string end mlton-20210117+dfsg/basis-library/sml-nj/sml-nj.sml000066400000000000000000000040661416264345000217140ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SMLofNJ: SML_OF_NJ = struct structure Cont = struct structure C = MLton.Cont type 'a cont = 'a C.t val callcc = C.callcc val isolate = C.isolate fun throw k v = C.throw (k, v) end structure SysInfo = struct exception UNKNOWN datatype os_kind = BEOS | MACOS | OS2 | UNIX | WIN32 fun getHostArch () = MLton.Platform.Arch.toString MLton.Platform.Arch.host fun getOSKind () = let open MLton.Platform.OS in case host of AIX => UNIX | Cygwin => UNIX | Darwin => MACOS | FreeBSD => UNIX | Hurd => UNIX | HPUX => UNIX | Linux => UNIX | MinGW => WIN32 | NetBSD => UNIX | OpenBSD => UNIX | Solaris => UNIX end fun getOSName () = MLton.Platform.OS.toString MLton.Platform.OS.host end val getCmdName = CommandLine.name val getArgs = CommandLine.arguments fun getAllArgs () = getCmdName () :: getArgs () val exnHistory = MLton.Exn.history fun exportFn (file: string, f) = let open MLton.World OS.Process in case save (file ^ ".mlton") of Original => exit success | Clone => exit (f (getCmdName (), getArgs ()) handle _ => failure) end fun exportML (f: string): bool = let open MLton.World in case save (f ^ ".mlton") of Clone => true | Original => false end end mlton-20210117+dfsg/basis-library/sml-nj/unsafe.sig000066400000000000000000000117651416264345000217700ustar00rootroot00000000000000(* A subset of the UNSAFE signature provided by SML/NJ. Modified from SML/NJ * sources, which are * * Copyright (c) 1997 Bell Labs, Lucent Technologies. * *) signature UNSAFE_MONO_ARRAY = sig type array type elem (* omit Size check; * elements have indeterminate value *) val create: int -> array (* omit Subscript check *) val sub: array * int -> elem (* omit Subscript check *) val update: array * int * elem -> unit end (* SML/NJ provides 'create' and 'update', * but they are not provided with MLton, * because vectors are immutable and optimizations may * break if they are updated. *) signature UNSAFE_MONO_VECTOR = sig type elem type vector (* omit Size check; * elements have indeterminate values *) (* val create: int -> vector *) (* omit Subscript check *) val sub: vector * int -> elem (* omit Subscript check *) (* val update: vector * int * elem -> unit *) end signature UNSAFE = sig structure Array: sig (* omit Size check; * objptr(s) at elements set to bogus non-objptr value; * non-objptr(s) at elements have indeterminate value *) val alloc: int -> 'a array (* omit Size check; * elements set to initial value *) val create: int * 'a -> 'a array (* omit Subscript check *) val sub: 'a array * int -> 'a val uninitIsNop: 'a array -> bool (* omit Subscript check; * objptr(s) at element set to bogus non-objptr value *) val uninit: 'a array * int -> unit (* omit Subscript check *) val update: 'a array * int * 'a -> unit structure Raw: sig type 'a rawarr (* omit Size check; * objptr(s) at elements have indeterminate value; * non-objptr(s) at elements have indeterminate value *) val alloc: int -> 'a rawarr (* prereq: all objptr(s) at elements set to bogus * non-objptr value (via uninit) *) val toArray: 'a rawarr -> 'a array val uninitIsNop: 'a rawarr -> bool (* omit Subscript check; * objptr(s) at element set to bogus non-objptr value *) val uninit: 'a rawarr * int -> unit end end structure BoolArray: UNSAFE_MONO_ARRAY structure BoolVector: UNSAFE_MONO_VECTOR structure CharArray: UNSAFE_MONO_ARRAY structure CharVector: UNSAFE_MONO_VECTOR structure IntArray: UNSAFE_MONO_ARRAY structure IntVector: UNSAFE_MONO_VECTOR structure Int8Array: UNSAFE_MONO_ARRAY structure Int8Vector: UNSAFE_MONO_VECTOR structure Int16Array: UNSAFE_MONO_ARRAY structure Int16Vector: UNSAFE_MONO_VECTOR structure Int32Array: UNSAFE_MONO_ARRAY structure Int32Vector: UNSAFE_MONO_VECTOR structure Int64Array: UNSAFE_MONO_ARRAY structure Int64Vector: UNSAFE_MONO_VECTOR structure IntInfArray: UNSAFE_MONO_ARRAY structure IntInfVector: UNSAFE_MONO_VECTOR structure LargeIntArray: UNSAFE_MONO_ARRAY structure LargeIntVector: UNSAFE_MONO_VECTOR structure LargeRealArray: UNSAFE_MONO_ARRAY structure LargeRealVector: UNSAFE_MONO_VECTOR structure LargeWordArray: UNSAFE_MONO_ARRAY structure LargeWordVector: UNSAFE_MONO_VECTOR structure RealArray: UNSAFE_MONO_ARRAY structure RealVector: UNSAFE_MONO_VECTOR structure Real32Array: UNSAFE_MONO_ARRAY structure Real32Vector: UNSAFE_MONO_VECTOR structure Real64Array: UNSAFE_MONO_ARRAY structure Real64Vector: UNSAFE_MONO_VECTOR structure Vector: sig (* val create: int * 'a list -> 'a vector *) val sub: 'a vector * int -> 'a end structure WordArray: UNSAFE_MONO_ARRAY structure WordVector: UNSAFE_MONO_VECTOR structure Word8Array: UNSAFE_MONO_ARRAY structure Word8Vector: UNSAFE_MONO_VECTOR structure Word16Array: UNSAFE_MONO_ARRAY structure Word16Vector: UNSAFE_MONO_VECTOR structure Word32Array: UNSAFE_MONO_ARRAY structure Word32Vector: UNSAFE_MONO_VECTOR structure Word64Array: UNSAFE_MONO_ARRAY structure Word64Vector: UNSAFE_MONO_VECTOR structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD end mlton-20210117+dfsg/basis-library/sml-nj/unsafe.sml000066400000000000000000000116231416264345000217720ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor UnsafeMonoArray (A: MONO_ARRAY_EXTRA): UNSAFE_MONO_ARRAY = struct open A val sub = unsafeSub val update = unsafeUpdate val create = fromPoly o Array.unsafeAlloc end functor UnsafeMonoVector (V: MONO_VECTOR_EXTRA): UNSAFE_MONO_VECTOR = struct open V val sub = unsafeSub end functor UnsafePackWord(PW : PACK_WORD_EXTRA) : PACK_WORD = struct open PW val subVec = unsafeSubVec val subVecX = unsafeSubVecX val subArr = unsafeSubArr val subArrX = unsafeSubArrX val update = unsafeUpdate end functor UnsafePackReal(PW : PACK_REAL_EXTRA) : PACK_REAL = struct open PW val subVec = unsafeSubVec val subArr = unsafeSubArr val update = unsafeUpdate end (* This is here so that the code generated by Lex and Yacc will work. *) structure Unsafe: UNSAFE = struct structure Array = struct val alloc = Array.unsafeAlloc val sub = Array.unsafeSub val uninitIsNop = Array.uninitIsNop val uninit = Array.unsafeUninit val update = Array.unsafeUpdate val create = Array.unsafeArray structure Raw = Array.Raw structure Raw = struct type 'a rawarr = 'a Raw.rawarr val alloc = Raw.unsafeAlloc val toArray = Raw.unsafeToArray val uninitIsNop = Raw.uninitIsNop val uninit = Raw.unsafeUninit end end structure BoolArray = UnsafeMonoArray (BoolArray) structure BoolVector = UnsafeMonoVector (BoolVector) structure CharArray = UnsafeMonoArray (CharArray) structure CharVector = UnsafeMonoVector (CharVector) structure IntArray = UnsafeMonoArray (IntArray) structure IntVector = UnsafeMonoVector (IntVector) structure Int8Array = UnsafeMonoArray (Int8Array) structure Int8Vector = UnsafeMonoVector (Int8Vector) structure Int16Array = UnsafeMonoArray (Int16Array) structure Int16Vector = UnsafeMonoVector (Int16Vector) structure Int32Array = UnsafeMonoArray (Int32Array) structure Int32Vector = UnsafeMonoVector (Int32Vector) structure Int64Array = UnsafeMonoArray (Int64Array) structure Int64Vector = UnsafeMonoVector (Int64Vector) structure IntInfArray = UnsafeMonoArray (IntInfArray) structure IntInfVector = UnsafeMonoVector (IntInfVector) structure LargeIntArray = UnsafeMonoArray (LargeIntArray) structure LargeIntVector = UnsafeMonoVector (LargeIntVector) structure LargeRealArray = UnsafeMonoArray (LargeRealArray) structure LargeRealVector = UnsafeMonoVector (LargeRealVector) structure LargeWordArray = UnsafeMonoArray (LargeWordArray) structure LargeWordVector = UnsafeMonoVector (LargeWordVector) structure RealArray = UnsafeMonoArray (RealArray) structure RealVector = UnsafeMonoVector (RealVector) structure Real32Array = UnsafeMonoArray (Real32Array) structure Real32Vector = UnsafeMonoVector (Real32Vector) structure Real64Array = UnsafeMonoArray (Real64Array) structure Real64Vector = UnsafeMonoVector (Real64Vector) structure Vector = struct val sub = Vector.unsafeSub end structure WordArray = UnsafeMonoArray (WordArray) structure WordVector = UnsafeMonoVector (WordVector) structure Word8Array = UnsafeMonoArray (Word8Array) structure Word8Vector = UnsafeMonoVector (Word8Vector) structure Word16Array = UnsafeMonoArray (Word16Array) structure Word16Vector = UnsafeMonoVector (Word16Vector) structure Word32Array = UnsafeMonoArray (Word32Array) structure Word32Vector = UnsafeMonoVector (Word32Vector) structure Word64Array = UnsafeMonoArray (Word64Array) structure Word64Vector = UnsafeMonoVector (Word64Vector) structure PackReal32Big = UnsafePackReal(PackReal32Big) structure PackReal32Little = UnsafePackReal(PackReal32Little) structure PackReal64Big = UnsafePackReal(PackReal64Big) structure PackReal64Little = UnsafePackReal(PackReal64Little) structure PackRealBig = UnsafePackReal(PackRealBig) structure PackRealLittle = UnsafePackReal(PackRealLittle) structure PackWord16Big = UnsafePackWord(PackWord16Big) structure PackWord16Little = UnsafePackWord(PackWord16Little) structure PackWord32Big = UnsafePackWord(PackWord32Big) structure PackWord32Little = UnsafePackWord(PackWord32Little) structure PackWord64Big = UnsafePackWord(PackWord64Big) structure PackWord64Little = UnsafePackWord(PackWord64Little) end mlton-20210117+dfsg/basis-library/system/000077500000000000000000000000001416264345000201155ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/system/command-line.sig000066400000000000000000000001601416264345000231610ustar00rootroot00000000000000signature COMMAND_LINE = sig val name: unit -> string val arguments: unit -> string list end mlton-20210117+dfsg/basis-library/system/command-line.sml000066400000000000000000000011061416264345000231730ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure CommandLine: COMMAND_LINE = struct structure Prim = PrimitiveFFI.CommandLine fun name () = CUtil.C_String.toString (Prim.commandNameGet ()) fun arguments () = (Array.toList o CUtil.C_StringArray.toArrayOfLength) (Prim.argvGet (), C_Int.toInt (Prim.argcGet ())) end mlton-20210117+dfsg/basis-library/system/date.sig000066400000000000000000000022671416264345000215450ustar00rootroot00000000000000signature DATE = sig datatype weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec type date exception Date val date: {year: int, month: month, day: int, hour: int, minute: int, second: int, offset: Time.time option} -> date val year: date -> int val month: date -> month val day: date -> int val hour: date -> int val minute: date -> int val second: date -> int val weekDay: date -> weekday val yearDay: date -> int val offset: date -> Time.time option val isDst: date -> bool option val localOffset: unit -> Time.time val fromTimeLocal: Time.time -> date val fromTimeUniv: Time.time -> date val toTime: date -> Time.time val toString: date -> string val fmt: string -> date -> string val fromString: string -> date option val scan: (char, 'a) StringCvt.reader -> (date, 'a) StringCvt.reader val compare: date * date -> order end mlton-20210117+dfsg/basis-library/system/date.sml000066400000000000000000000462051416264345000215560ustar00rootroot00000000000000(* Modified from the ML Kit 4.1.4; basislib/Date.sml * by mfluet@acm.org on 2017-04-07 * by mfluet@acm.org on 2006-4-25 * by mfluet@acm.org on 2005-8-10 based on * modifications from the ML Kit Version 3; basislib/Date.sml * by sweeks@research.nj.nec.com on 1999-1-3 and * by sweeks@acm.org on 2000-1-18. *) (* Date -- 1995-07-03, 1998-04-07 *) structure Date :> DATE = struct structure Prim = PrimitiveFFI.Date structure Tm = Prim.Tm (* Patch to make Time look like it deals with Int.int * instead of LargeInt.int. *) structure Time = struct open Time val toSeconds = LargeInt.toInt o toSeconds val fromSeconds = fromSeconds o LargeInt.fromInt end datatype weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec datatype t = T of {day: int, (* 1-31 *) hour: int, (* 0-23 *) isDst: bool option, (* daylight savings time in force *) minute: int, (* 0-59 *) month: month, offset: int option, (* signed seconds East of UTC: * this zone = UTC+t; ~82800 < t <= 82800 *) second: int, (* 0-61 (allowing for leap seconds) *) weekDay: weekday, year: int, (* e.g. 1995 *) yearDay: int} (* 0-365 *) type date = t local fun make f (T r) = f r in val day = make #day val hour = make #hour val isDst = make #isDst val minute = make #minute val month = make #month val second = make #second val weekDay = make #weekDay val year = make #year val yearDay = make #yearDay end exception Date (* 86400 = 24*60*6 is the number of seconds per day *) type tmoz = {tm_hour : C_Int.t, tm_isdst : C_Int.t, (* 0 = no, 1 = yes, ~1 = don't know *) tm_mday : C_Int.t, tm_min : C_Int.t, tm_mon : C_Int.t, tm_sec : C_Int.t, tm_wday : C_Int.t, tm_yday : C_Int.t, tm_year : C_Int.t} local fun make (f: C_Time.t ref -> C_Int.t C_Errno.t) (n: C_Time.t) : tmoz = (ignore (f (ref n)) ; {tm_hour = Tm.getHour (), tm_isdst = Tm.getIsDst (), tm_mday = Tm.getMDay (), tm_min = Tm.getMin (), tm_mon = Tm.getMon (), tm_sec = Tm.getSec (), tm_wday = Tm.getWDay (), tm_yday = Tm.getYDay (), tm_year = Tm.getYear ()}) in val getlocaltime_ = make Prim.localTime val getgmtime_ = make Prim.gmTime end fun setTmBuf ({tm_hour, tm_isdst, tm_mday, tm_min, tm_mon, tm_sec, tm_wday, tm_yday, tm_year}: tmoz) : unit = (Tm.setHour tm_hour ; Tm.setIsDst tm_isdst ; Tm.setMDay tm_mday ; Tm.setMin tm_min ; Tm.setMon tm_mon ; Tm.setSec tm_sec ; Tm.setWDay tm_wday ; Tm.setYDay tm_yday ; Tm.setYear tm_year) fun mktime_ (t: tmoz): C_Time.t = C_Errno.check (setTmBuf t; Prim.mkTime ()) (* The offset to add to local time to get UTC: positive West of UTC *) val localoffset: int = C_Double.round (Prim.localOffset ()) val toweekday: int -> weekday = fn 0 => Sun | 1 => Mon | 2 => Tue | 3 => Wed | 4 => Thu | 5 => Fri | 6 => Sat | _ => raise Fail "Internal error: Date.toweekday" val fromwday: weekday -> int = fn Sun => 0 | Mon => 1 | Tue => 2 | Wed => 3 | Thu => 4 | Fri => 5 | Sat => 6 val tomonth: int -> month = fn 0 => Jan | 1 => Feb | 2 => Mar | 3 => Apr | 4 => May | 5 => Jun | 6 => Jul | 7 => Aug | 8 => Sep | 9 => Oct | 10 => Nov | 11 => Dec | _ => raise Fail "Internal error: Date.tomonth" val frommonth: month -> int = fn Jan => 0 | Feb => 1 | Mar => 2 | Apr => 3 | May => 4 | Jun => 5 | Jul => 6 | Aug => 7 | Sep => 8 | Oct => 9 | Nov => 10 | Dec => 11 fun tmozToDate ({tm_hour, tm_isdst, tm_mday, tm_min, tm_mon, tm_sec, tm_wday, tm_yday, tm_year}: tmoz) offset = T {day = C_Int.toInt tm_mday, hour = C_Int.toInt tm_hour, isDst = (case tm_isdst of 0 => SOME false | 1 => SOME true | _ => NONE), minute = C_Int.toInt tm_min, month = tomonth (C_Int.toInt tm_mon), offset = offset, second = C_Int.toInt tm_sec, weekDay = toweekday (C_Int.toInt tm_wday), yearDay = C_Int.toInt tm_yday, year = (C_Int.toInt tm_year) + 1900} fun leapyear (y: int) = y mod 4 = 0 andalso y mod 100 <> 0 orelse y mod 400 = 0 fun monthdays year month : int = case month of Jan => 31 | Feb => if leapyear year then 29 else 28 | Mar => 31 | Apr => 30 | May => 31 | Jun => 30 | Jul => 31 | Aug => 31 | Sep => 30 | Oct => 31 | Nov => 30 | Dec => 31 (* Check whether date may be passed to ISO/ANSI C functions: *) fun okDate (T {year, month, day, hour, minute, second, ...}) = 1 <= day andalso day <= monthdays year month andalso 0 <= hour andalso hour <= 23 andalso 0 <= minute andalso minute <= 59 andalso 0 <= second andalso second <= 61 (* leap seconds *) fun dateToTmoz (dt as T {year, month, day, hour, minute, second, weekDay, yearDay, isDst, ...}): tmoz = if not (okDate dt) then raise Date else {tm_hour = C_Int.fromInt hour, tm_isdst = (case isDst of SOME false => 0 | SOME true => 1 | NONE=> ~1), tm_mday = C_Int.fromInt day, tm_min = C_Int.fromInt minute, tm_mon = C_Int.fromInt (frommonth month), tm_sec = C_Int.fromInt second, tm_wday = C_Int.fromInt (fromwday weekDay), tm_yday = C_Int.fromInt yearDay, tm_year = C_Int.fromInt (year - 1900)} (* -------------------------------------------------- *) (* Translated from Emacs's calendar.el: *) (* Reingold: Number of the day within the year: *) fun dayinyear (year: int, month: month, day: int): int = let val monthno = frommonth month in day - 1 + 31 * monthno - (if monthno > 1 then (27 + 4 * monthno) div 10 - (if leapyear year then 1 else 0) else 0) end (* Reingold: Find the number of days elapsed from the (imagined) Gregorian date Sunday, December 31, 1 BC to the given date. *) fun todaynumber year month day = let val prioryears = year - 1 in dayinyear (year, month, day) + 1 + 365 * prioryears + prioryears div 4 - prioryears div 100 + prioryears div 400 end (* Reingold et al: from absolute day number to year, month, date: *) fun fromdaynumber n = let val d0 = n - 1 val n400 = d0 div 146097 val d1 = d0 mod 146097 val n100 = d1 div 36524 val d2 = d1 mod 36524 val n4 = d2 div 1461 val d3 = d2 mod 1461 val n1 = d3 div 365 val day = 1 + d3 mod 365 val year = 400 * n400 + 100 * n100 + n4 * 4 + n1 + 1 fun loop month day = let val mdays = monthdays year (tomonth month) in if mdays < day then loop (month+1) (day-mdays) else (year, tomonth month, day) end in if n100 = 4 orelse n1 = 4 then (year-1, Dec, 31) else loop 0 day end (* -------------------------------------------------- *) fun weekday daynumber = toweekday (daynumber mod 7) (* Normalize a date, disregarding leap seconds: *) fun normalizedate yr0 mo0 dy0 hr0 mn0 sec0 offset = let val mn1 = mn0 + sec0 div 60 val second = sec0 mod 60 val hr1 = hr0 + mn1 div 60 val minute = mn1 mod 60 val dayno = todaynumber yr0 mo0 dy0 + hr1 div 24 val hour = hr1 mod 24 val (year, month, day) = fromdaynumber dayno val date1 = T {day = day, hour = hour, isDst = (case offset of NONE => NONE | SOME _ => SOME false), minute = minute, month = month, offset = offset, second = second, weekDay = weekday dayno, year = year, yearDay = dayinyear (year, month, day)} in (* One cannot reliably compute DST in non-local timezones, not even given the offset from UTC. Countries in the Northern hemisphere have DST during Mar-Oct, those around Equator do not have DST, and those in the Southern hemisphere have DST during Oct-Mar. *) if year < 1970 orelse year > 2037 then date1 else case offset of NONE => tmozToDate (getlocaltime_ (mktime_ (dateToTmoz date1))) offset | SOME _ => date1 end fun fromTimeLocal t = tmozToDate (getlocaltime_ (C_Time.fromInt (Time.toSeconds t))) NONE fun fromTimeUniv t = tmozToDate (getgmtime_ (C_Time.fromInt (Time.toSeconds t))) (SOME 0) (* The following implements conversion from a local date to * a Time.time. It IGNORES wday and yday. *) fun toTime (date as T {offset, ...}) = let val secoffset = case offset of NONE => 0 | SOME secs => localoffset + secs val clock = C_Time.toInt (mktime_ (dateToTmoz date)) - secoffset in if clock < 0 then raise Date else Time.fromSeconds clock end fun localOffset () = Time.fromSeconds (localoffset mod 86400) local val isFormatChar = let val a = Array.tabulate (Char.maxOrd + 1, fn _ => false) val validChars = "aAbBcdHIjmMpSUwWxXyYZ%" in Natural.foreach (size validChars, fn i => Array.update (a, Char.ord (String.sub (validChars, i)), true)); fn c => Array.sub (a, Char.ord c) end in fun fmt fmtStr d = let val _ = setTmBuf (dateToTmoz d) val bufLen = 50 (* more than enough for a single format char *) val buf = Array.alloc bufLen fun strftime fmtChar = let val len = Prim.strfTime (buf, C_Size.fromInt bufLen, NullString.fromString (concat ["%", str fmtChar, "\000"])) val len = C_Size.toInt len in if len = 0 then raise Fail "Date.fmt" else ArraySlice.vector (ArraySlice.slice (buf, 0, SOME len)) end val max = size fmtStr fun loop (i, start, accum) = let fun newAccum () = let val len = i - start in if len = 0 then accum else String.extract (fmtStr, start, SOME len) :: accum end in if i >= max then newAccum () else if #"%" = String.sub (fmtStr, i) then let val i = i + 1 in if i >= max then newAccum () else let val c = String.sub (fmtStr, i) in if isFormatChar c then loop (i + 1, i + 1, strftime c :: newAccum ()) else loop (i, i, newAccum ()) end end else loop (i + 1, start, accum) end in concat (rev (loop (0, 0, []))) end end val toString = fmt "%a %b %d %H:%M:%S %Y" type ('a, 'b) reader = ('a, 'b) Reader.reader fun scan (reader: (char, 'a) reader): (t, 'a) reader = let type 'b t = ('b, 'a) reader val none: 'b t = fn _ => NONE fun done (b: 'b): 'b t = fn a => SOME (b, a) fun peek1 (f: char -> 'b t): 'b t = fn a => case reader a of NONE => NONE | SOME (c, _) => f c a fun read1 (f: char -> 'b t): 'b t = fn a => case reader a of NONE => NONE | SOME (c, a) => f c a fun skipSpace (r: 'b t): 'b t = let fun loop (): 'b t = peek1 (fn c => if Char.isSpace c then read1 (fn _ => loop ()) else r) in loop () end fun readN (n: int, f: string -> 'b t): 'b t = let fun loop (n: int, ac: char list): 'b t = if 0 = n then f (implode (rev ac)) else read1 (fn c => loop (n - 1, c :: ac)) in loop (n, []) end fun readChar (c: char, r: 'b t): 'b t = read1 (fn c' => if c = c' then r else none) fun readWeekDay (f: weekday -> 'b t): 'b t = readN (3, fn s => case s of "Mon" => f Mon | "Tue" => f Tue | "Wed" => f Wed | "Thu" => f Thu | "Fri" => f Fri | "Sat" => f Sat | "Sun" => f Sun | _ => none) fun readMonth (f: month -> 'b t): 'b t = readN (3, fn s => case s of "Jan" => f Jan | "Feb" => f Feb | "Mar" => f Mar | "Apr" => f Apr | "May" => f May | "Jun" => f Jun | "Jul" => f Jul | "Aug" => f Aug | "Sep" => f Sep | "Oct" => f Oct | "Nov" => f Nov | "Dec" => f Dec | _ => none) fun readDigs (n: int, lower: int, upper: int, f: int -> 'b t): 'b t = readN (n, fn s => if not (CharVector.all Char.isDigit s) then none else let val v = CharVector.foldl (fn (c, ac) => ac * 10 + (Char.ord c - Char.ord #"0")) 0 s in if lower <= v andalso v <= upper then f v else none end) fun readDay f = peek1 (fn c => if c = #" " then read1 (fn _ => readDigs (1, 1, 9, f)) else readDigs (2, 1, 31, f)) fun readHour f = readDigs (2, 0, 23, f) fun readMinute f = readDigs (2, 0, 59, f) fun readSeconds f = readDigs (2, 0, 61, f) fun readYear f = readDigs (4, 0, 9999, f) in skipSpace (readWeekDay (fn weekDay => readChar (#" ", readMonth (fn month => readChar (#" ", readDay (fn day => readChar (#" ", readHour (fn hour => readChar (#":", readMinute (fn minute => (readChar (#":", readSeconds (fn second => readChar (#" ", readYear (fn year => done (T {day = day, hour = hour, isDst = NONE, minute = minute, month = month, offset = NONE, second = second, weekDay = weekDay, year = year, yearDay = dayinyear (year, month, day)} )))))))))))))))) end fun fromString s = StringCvt.scanString scan s (* Ignore timezone and DST when comparing dates: *) fun compare (T {year=y1,month=mo1,day=d1,hour=h1,minute=mi1,second=s1, ...}, T {year=y2,month=mo2,day=d2,hour=h2,minute=mi2,second=s2, ...}) = let fun cmp (v1, v2, cmpnext) = case Int.compare (v1, v2) of EQUAL => cmpnext () | r => r in cmp (y1, y2, fn _ => cmp (frommonth mo1, frommonth mo2, fn _ => cmp (d1, d2, fn _ => cmp (h1, h2, fn _ => cmp (mi1, mi2, fn _ => cmp (s1, s2, fn _ => EQUAL)))))) end fun date { year, month, day, hour, minute, second, offset } = if year < 0 then raise Date else let val (dayoffset, offset') = case offset of NONE => (0, NONE) | SOME time => let val secs = Time.toSeconds time val secoffset = if secs <= 82800 then ~secs else 86400 - secs in (Int.quot (secs, 86400), SOME secoffset) end val day' = day + dayoffset in normalizedate year month day' hour minute second offset' end fun offset (T {offset, ...}) = Option.map (fn secs => Time.fromSeconds ((86400 + secs) mod 86400)) offset end mlton-20210117+dfsg/basis-library/system/file-sys.sig000066400000000000000000000020041416264345000223500ustar00rootroot00000000000000signature OS_FILE_SYS = sig type dirstream val openDir: string -> dirstream val readDir: dirstream -> string option val rewindDir: dirstream -> unit val closeDir: dirstream -> unit val chDir: string -> unit val getDir: unit -> string val mkDir: string -> unit val rmDir: string -> unit val isDir: string -> bool val isLink: string -> bool val readLink: string -> string val fullPath: string -> string val realPath: string -> string val modTime: string -> Time.time val fileSize: string -> Position.int val setTime: string * Time.time option -> unit val remove: string -> unit val rename: {old: string, new: string} -> unit datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val tmpName: unit -> string eqtype file_id val fileId: string -> file_id val hash: file_id -> word val compare: file_id * file_id -> order end mlton-20210117+dfsg/basis-library/system/file-sys.sml000066400000000000000000000135421416264345000223720ustar00rootroot00000000000000(* os-filesys.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * The Posix implementation of the generic file system interface. * *) structure OS_FileSys = struct structure P_FSys = Posix.FileSys val sysWordToWord = Word.fromLargeWord o SysWord.toLargeWord type dirstream = P_FSys.dirstream val openDir = P_FSys.opendir val readDir = P_FSys.readdir val rewindDir = P_FSys.rewinddir val closeDir = P_FSys.closedir val chDir = P_FSys.chdir val getDir = P_FSys.getcwd local structure S = P_FSys.S val mode777 = S.flags[S.irwxu, S.irwxg, S.irwxo] in fun mkDir path = P_FSys.mkdir(path, mode777) end val rmDir = P_FSys.rmdir val isDir = P_FSys.ST.isDir o P_FSys.stat val isLink = P_FSys.ST.isLink o P_FSys.lstat val readLink = P_FSys.readlink (* the maximum number of links allowed *) val maxLinks: int = 64 structure P = OS_Path val isMinGW = let open Primitive.MLton.Platform.OS in host = MinGW end (* An implementation of fullPath which works on Unix and Windows (Cygwin and MinGW) *) fun fullPath p = let val oldCWD = getDir() fun mkPath (pathFromRoot, vol) = P.toString {arcs = List.rev pathFromRoot, isAbs = true, vol = vol} fun walkPath (n, pathFromRoot, arcs, vol) = if n = 0 then raise PosixError.SysErr ("too many links", NONE) else case arcs of [] => mkPath (pathFromRoot, vol) | arc :: al => if arc = "" orelse arc = "." then walkPath (n, pathFromRoot, al, vol) else if arc = ".." then case pathFromRoot of [] => walkPath (n, [], al, vol) | _ :: r => (chDir ".."; walkPath (n, r, al, vol)) else if isLink arc then expandLink (n, pathFromRoot, arc, al, vol) else case al of [] => mkPath (arc :: pathFromRoot, vol) | _ => (chDir arc ; walkPath (n, arc :: pathFromRoot, al, vol)) and expandLink (n, pathFromRoot, link, rest, vol) = let val {isAbs, arcs, ...} = P.fromString (readLink link) val arcs = List.@ (arcs, rest) in if isAbs then gotoRoot (n-1, arcs, vol) else walkPath (n-1, pathFromRoot, arcs, vol) end (* If the volume is not empty, chDir to it rather than to "/" *) and gotoRoot (n, arcs, vol) = (if vol <> "" andalso vol <> "/" then chDir (vol ^ (if isMinGW then "\\" else "/")) else chDir "/" ; walkPath (n, [], arcs, vol)) fun computeFullPath (arcs, vol) = (gotoRoot (maxLinks, arcs, vol) before chDir oldCWD) handle ex => (chDir oldCWD; raise ex) in case (P.fromString p) of {isAbs=false, arcs, vol} => let val {arcs=arcs', vol=vol, ...} = P.fromString(oldCWD) in computeFullPath (List.@(arcs', arcs), vol) end | {isAbs=true, arcs, vol} => computeFullPath (arcs, vol) end fun realPath p = if P.isAbsolute p then fullPath p else P.mkRelative {path = fullPath p, relativeTo = fullPath (getDir ())} val fileSize = P_FSys.ST.size o P_FSys.stat val modTime = P_FSys.ST.mtime o P_FSys.stat fun setTime (path, t) = P_FSys.utime (path, Option.map (fn t => {actime = t, modtime = t}) t) val remove = P_FSys.unlink val rename = P_FSys.rename datatype access_mode = datatype Posix.FileSys.access_mode fun access (path, al) = let fun cvt A_READ = P_FSys.A_READ | cvt A_WRITE = P_FSys.A_WRITE | cvt A_EXEC = P_FSys.A_EXEC in P_FSys.access (path, List.map cvt al) end datatype file_id = FID of {dev: SysWord.word, ino: SysWord.word} fun fileId fname = let val st = P_FSys.stat fname in FID{ dev = P_FSys.devToWord(P_FSys.ST.dev st), ino = P_FSys.inoToWord(P_FSys.ST.ino st) } end fun hash (FID{dev, ino}) = sysWordToWord(SysWord.+(SysWord.<<(dev, 0w16), ino)) fun compare (FID{dev=d1, ino=i1}, FID{dev=d2, ino=i2}) = if (SysWord.<(d1, d2)) then General.LESS else if (SysWord.>(d1, d2)) then General.GREATER else if (SysWord.<(i1, i2)) then General.LESS else if (SysWord.>(i1, i2)) then General.GREATER else General.EQUAL end (* * $Log: os-filesys.sml, v $ * Revision 1.3 1997/06/07 15:27:51 jhr * SML'97 Basis Library changes (phase 3; Posix changes) * * Revision 1.2 1997/02/26 21:00:32 george * Defined a new top level Option structure. All 'a option related * functions have been moved out of General. * * Revision 1.1.1.1 1997/01/14 01:38:25 george * Version 109.24 * *) mlton-20210117+dfsg/basis-library/system/io.sig000066400000000000000000000017331416264345000212340ustar00rootroot00000000000000signature OS_IO = sig eqtype iodesc eqtype iodesc_kind val hash: iodesc -> word val compare: iodesc * iodesc -> order val kind: iodesc -> iodesc_kind structure Kind: sig val file: iodesc_kind val dir: iodesc_kind val symlink: iodesc_kind val tty: iodesc_kind val pipe: iodesc_kind val socket: iodesc_kind val device: iodesc_kind end eqtype poll_desc type poll_info val pollDesc: iodesc -> poll_desc option val pollToIODesc: poll_desc -> iodesc exception Poll val pollIn: poll_desc -> poll_desc val pollOut: poll_desc -> poll_desc val pollPri: poll_desc -> poll_desc val poll: poll_desc list * Time.time option -> poll_info list val isIn: poll_info -> bool val isOut: poll_info -> bool val isPri: poll_info -> bool val infoToPollDesc: poll_info -> poll_desc end mlton-20210117+dfsg/basis-library/system/io.sml000066400000000000000000000132621416264345000212450ustar00rootroot00000000000000(* modified from SML/NJ sources by Stephen Weeks 1998-06-25 *) (* modified by Matthew Fluet 2002-10-11 *) (* modified by Matthew Fluet 2002-11-21 *) (* modified by Matthew Fluet 2006-04-30 *) (* modified by Matthew Fluet 2008-04-06 *) (* modified by Matthew Fluet 2013-06-18 *) (* modified by Matthew Fluet 2019-11-05 *) (* os-io.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * NOTE: this interface has been proposed, but not yet adopted by the * Standard basis committee. * *) structure OS_IO: OS_IO = struct structure Error = PosixError (* an iodesc is an abstract descriptor for an OS object that * supports I/O (e.g., file, tty device, socket, ...). *) type iodesc = PreOS.IODesc.t datatype iodesc_kind = K of string val iodToFd = PrePosix.FileDesc.fromRep o PreOS.IODesc.toRep val fdToIod = PreOS.IODesc.fromRep o PrePosix.FileDesc.toRep val iodescToWord = C_Fd.castToSysWord o PreOS.IODesc.toRep (* return a hash value for the I/O descriptor. *) val hash = SysWord.toWord o iodescToWord (* compare two I/O descriptors *) fun compare (i, i') = SysWord.compare (iodescToWord i, iodescToWord i') structure Kind = struct val file = K "FILE" val dir = K "DIR" val symlink = K "LINK" val tty = K "TTY" val pipe = K "PIPE" val socket = K "SOCK" val device = K "DEV" end (* return the kind of I/O descriptor *) fun kind (iod) = let val stat = Posix.FileSys.fstat (iodToFd iod) in if (Posix.FileSys.ST.isReg stat) then Kind.file else if (Posix.FileSys.ST.isDir stat) then Kind.dir else if (Posix.FileSys.ST.isChr stat) then Kind.tty else if (Posix.FileSys.ST.isBlk stat) then Kind.device (* ?? *) else if (Posix.FileSys.ST.isLink stat) then Kind.symlink else if (Posix.FileSys.ST.isFIFO stat) then Kind.pipe else if (Posix.FileSys.ST.isSock stat) then Kind.socket else K "UNKNOWN" end type poll_flags = {rd: bool, wr: bool, pri: bool} datatype poll_desc = PollDesc of iodesc * poll_flags datatype poll_info = PollInfo of iodesc * poll_flags (* create a polling operation on the given descriptor; note that * not all I/O devices support polling, but for the time being, we * don't test for this. *) fun pollDesc iod = SOME (PollDesc (iod, {rd=false, wr=false, pri=false})) (* return the I/O descriptor that is being polled *) fun pollToIODesc (PollDesc (iod, _)) = iod exception Poll (* set polling events; if the polling operation is not appropriate * for the underlying I/O device, then the Poll exception is raised. *) fun pollIn (PollDesc (iod, {wr, pri, ...}: poll_flags)) = PollDesc (iod, {rd=true, wr=wr, pri=pri}) fun pollOut (PollDesc (iod, {rd, pri, ...}: poll_flags)) = PollDesc (iod, {rd=rd, wr=true, pri=pri}) fun pollPri (PollDesc (iod, {rd, wr, ...}: poll_flags)) = PollDesc (iod, {rd=rd, wr=wr, pri=true}) (* polling function *) local structure Prim = PrimitiveFFI.OS.IO fun join (false, _, w) = w | join (true, b, w) = C_Short.orb(w, b) fun test (w, b) = (C_Short.andb(w, b) <> 0) val rdBit = PrimitiveFFI.OS.IO.POLLIN and wrBit = PrimitiveFFI.OS.IO.POLLOUT and priBit = PrimitiveFFI.OS.IO.POLLPRI fun fromPollDesc (PollDesc (iod, {rd, wr, pri})) = ( iodToFd iod, join (rd, rdBit, join (wr, wrBit, join (pri, priBit, 0))) ) fun toPollInfo (fd, i) = PollInfo (fdToIod fd, { rd = test(i, rdBit), wr = test(i, wrBit), pri = test(i, priBit) }) in fun poll (pds, timeOut) = let val (fds, events) = ListPair.unzip (List.map fromPollDesc pds) val fds = Vector.fromList fds val n = Vector.length fds val events = Vector.fromList events val timeOut = case timeOut of NONE => ~1 | SOME t => if Time.< (t, Time.zeroTime) then Error.raiseSys Error.inval else (C_Int.fromLarge (Time.toMilliseconds t) handle Overflow => Error.raiseSys Error.inval) val revents = Array.array (n, 0: C_Short.t) val _ = Posix.Error.SysCall.simple (fn () => Prim.poll (PrePosix.FileDesc.vectorToRep fds, events, C_NFds.fromInt n, timeOut, revents)) in Array.foldri (fn (i, w, l) => if w <> 0 then (toPollInfo (Vector.sub (fds, i), w))::l else l) [] revents end end (* local *) (* check for conditions *) fun isIn (PollInfo(_, flgs)) = #rd flgs fun isOut (PollInfo(_, flgs)) = #wr flgs fun isPri (PollInfo(_, flgs)) = #pri flgs fun infoToPollDesc (PollInfo arg) = PollDesc arg end (* OS_IO *) (* * $Log: os-io.sml, v $ * Revision 1.4 1997/07/31 17:25:26 jhr * We are now using 32-bit ints to represent the seconds portion of a * time value. This was required to handle the change in the type of * Time.{to, from}{Seconds, Milliseconds, Microseconds}. * * Revision 1.3 1997/06/07 15:27:51 jhr * SML'97 Basis Library changes (phase 3; Posix changes) * * Revision 1.2 1997/06/02 19:16:19 jhr * SML'97 Basis Library changes (phase 2) * * Revision 1.1.1.1 1997/01/14 01:38:25 george * Version 109.24 * *) mlton-20210117+dfsg/basis-library/system/os.sig000066400000000000000000000005441416264345000212450ustar00rootroot00000000000000signature OS = sig structure FileSys: OS_FILE_SYS structure Path: OS_PATH structure Process: OS_PROCESS structure IO: OS_IO eqtype syserror exception SysErr of string * syserror option val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option end mlton-20210117+dfsg/basis-library/system/os.sml000066400000000000000000000006661416264345000212630ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure OS = struct structure FileSys = OS_FileSys structure Path = OS_Path structure Process = OS_Process structure IO = OS_IO open PosixError end mlton-20210117+dfsg/basis-library/system/path.sig000066400000000000000000000023641416264345000215620ustar00rootroot00000000000000signature OS_PATH = sig exception InvalidArc exception Path val base: string -> string val concat: string * string -> string val currentArc: string val dir: string -> string val ext: string -> string option val file: string -> string val fromString: string -> {isAbs: bool, vol: string, arcs: string list} val fromUnixPath: string -> string val getParent: string -> string val getVolume: string -> string val isAbsolute: string -> bool val isCanonical: string -> bool val isRelative: string -> bool val isRoot: string -> bool val joinBaseExt: {base: string, ext: string option} -> string val joinDirFile: {dir: string, file: string} -> string val mkAbsolute: {path: string, relativeTo: string} -> string val mkCanonical: string -> string val mkRelative: {path: string, relativeTo: string} -> string val parentArc: string val splitBaseExt: string -> {base: string, ext: string option} val splitDirFile: string -> {dir: string, file: string} val toString: {isAbs: bool, vol: string, arcs: string list} -> string val toUnixPath: string -> string val validVolume: {isAbs: bool, vol: string} -> bool end mlton-20210117+dfsg/basis-library/system/path.sml000066400000000000000000000202021416264345000215620ustar00rootroot00000000000000(* Modified from the ML Kit 4.1.4; basislib/Path.sml * by mfluet@acm.org on 2005-8-10 based on * modifications from the ML Kit 3 Version; basislib/Path.sml * by sweeks@research.nj.nec.com on 1999-1-5. *) structure OS_Path: OS_PATH = struct exception Path exception InvalidArc (* It would make sense to use substrings for internal versions of * fromString and toString, and to allocate new strings only when * externalizing the strings. * Impossible cases: UNIX: {isAbs = false, vol = _, arcs = "" :: _} Mac: {isAbs = true, vol = _, arcs = "" :: _} *) val op @ = List.@ infix 9 sub val op sub = String.sub val substring = String.extract val isWindows = let open Primitive.MLton.Platform.OS in host = MinGW end (* the path separator used in canonical paths *) val slash = if isWindows then "\\" else "/" (* MinGW and newer Windows commands treat both / and \ as path * separators. * * Sadly this means that toString o fromString is not the identity * b/c foo/bar -> foo\bar. However, there's nothing else one can do! * This diverges from the standard. *) fun isslash c = c = #"/" orelse (isWindows andalso c = #"\\") fun iscolon c = c = #":" fun isVolumeName v = (isWindows andalso size v = 2 andalso Char.isAlpha (v sub 0) andalso iscolon (v sub 1)) fun volumeMatch (root, relative) = relative = "" orelse (isVolumeName root andalso isVolumeName relative andalso (Char.toUpper (root sub 0) = Char.toUpper (relative sub 0))) fun canonName a = if isWindows then String.translate (str o Char.toLower) a else a val parentArc = ".." val currentArc = "." (* Ahh joy. The SML basis library standard and Windows paths. * * The big problem with windows paths is "\foo"" * - It's not absolute, since chdir("A:\") may switch from "C:", thus * changing the meaning of "\foo". *) fun validVolume {isAbs, vol} = if isWindows then isVolumeName vol orelse (not isAbs andalso vol = "") else vol = "" fun fromString s = let val (vol, rest) = (* 4:foo has a volume of "4:" even tho invalid *) if isWindows andalso size s >= 2 andalso iscolon (s sub 1) then (substring (s, 0, SOME 2), substring (s, 2, NONE)) else ("", s) val (isAbs, arcs) = case (String.fields isslash rest) of "" :: [] => (false, []) | "" :: r => (true, r) | r => (false, r) in {arcs = arcs, isAbs = isAbs, vol = vol} end val getVolume = #vol o fromString val isAbsolute = #isAbs o fromString val isRelative = not o isAbsolute fun isArc s = s = "" orelse (case fromString s of {arcs = [_], isAbs = false, vol = ""} => true | _ => false) fun toString {arcs, isAbs, vol} = if not (validVolume {isAbs = isAbs, vol = vol}) then raise Path else if not isAbs andalso case arcs of ("" :: _) => true | _ => false then raise Path else if List.exists (not o isArc) arcs then raise InvalidArc else concat [vol, if isAbs then slash else "", String.concatWith slash arcs] fun concatArcs (a1, a2) = let val a1 = case List.rev a1 of "" :: r => List.rev r | _ => a1 in a1 @ a2 end fun concat (p1, p2) = let val {arcs = a1, isAbs, vol = v1} = fromString p1 val {arcs = a2, isAbs = isAbs2, vol = v2} = fromString p2 in if isAbs2 orelse not (volumeMatch (v1, v2)) then raise Path else toString {arcs = concatArcs (a1, a2), isAbs = isAbs, vol = v1} end fun getParent p = let val {isAbs, vol, arcs} = fromString p val arcs = List.rev (case List.rev arcs of [] => [parentArc] | "." :: r => parentArc :: r | ".." :: r => parentArc :: parentArc :: r | _ :: [] => if isAbs then [""] else [currentArc] | "" :: r => parentArc :: r | _ :: r => r) in toString {arcs = arcs, isAbs = isAbs, vol = vol} end fun mkCanonical p = let val {arcs, isAbs, vol} = fromString p fun backup l = case l of [] => if isAbs then [] else [parentArc] | first :: res => if first = ".." then parentArc :: parentArc :: res else res fun reduce arcs = let fun h (l, res) = case l of [] => (case res of [] => if isAbs then [""] else [currentArc] | _ => res ) | a1 :: ar => if a1 = "" orelse a1 = "." then h (ar, res) else if a1 = ".." then h (ar, backup res) else h (ar, canonName a1 :: res) in h (arcs, []) end in toString {arcs = List.rev (reduce arcs), isAbs = isAbs, vol = canonName vol} end val rec parentize = fn [] => [] | _ :: ar => parentArc :: parentize ar fun mkRelative {path = p1, relativeTo = p2} = let val {arcs = arcs1, isAbs = isAbs1, vol = vol1} = fromString p1 val {arcs = arcs2, isAbs = isAbs2, vol = vol2} = fromString (mkCanonical p2) in if not isAbs2 then raise Path else if not isAbs1 then p1 else let fun h (a1, a2) = case (a1, a2) of ([], []) => ["."] | (_, []) => a1 | ([], a2) => parentize a2 | (a11 :: a1r, a21 :: a2r) => if canonName a11 = a21 then h (a1r, a2r) else parentize a2 @ (if arcs1 = [""] then [] else a1) in if not (volumeMatch (vol2, vol1)) then raise Path else toString {arcs = h (arcs1, arcs2), isAbs = false, vol = ""} end end fun mkAbsolute {path = p1, relativeTo = p2} = if isRelative p2 then raise Path else if isAbsolute p1 then p1 else mkCanonical (concat (p2, p1)) fun isCanonical p = mkCanonical p = p fun joinDirFile {dir, file} = let val {arcs, isAbs, vol} = fromString dir val arcs = case (arcs, file) of ([], "") => [] | _ => concatArcs (arcs, [file]) in toString {arcs = arcs, isAbs = isAbs, vol = vol} end fun splitDirFile p = let open List val {isAbs, vol, arcs} = fromString p in case rev arcs of [] => {dir = p, file = ""} | arcn :: farcs => {dir = toString {arcs = rev farcs, isAbs = isAbs, vol = vol}, file = arcn} end val dir = #dir o splitDirFile val file = #file o splitDirFile fun joinBaseExt {base, ext} = case ext of NONE => base | SOME ex => if ex = "" then base else String.concat [base, ".", ex] fun splitBaseExt s = let val {dir, file} = splitDirFile s open Substring val (fst, snd) = splitr (fn c => c <> #".") (full file) in if isEmpty snd (* dot at right end *) orelse isEmpty fst (* no dot *) orelse size fst = 1 (* dot at left end only *) then {base = s, ext = NONE} else {base = joinDirFile {dir = dir, file = string (trimr 1 fst)}, ext = SOME (string snd)} end val ext = #ext o splitBaseExt val base = #base o splitBaseExt fun isRoot path = case fromString path of {isAbs = true, arcs=[""], ...} => true | _ => false fun fromUnixPath s = if not isWindows then s else if Char.contains s (slash sub 0) then raise InvalidArc else String.translate (fn c => if c = #"/" then slash else str c) s fun toUnixPath s = if not isWindows then s else let val {arcs, isAbs, vol} = fromString s in if vol <> "" then raise Path else (if isAbs then "/" else "") ^ String.concatWith "/" arcs end end mlton-20210117+dfsg/basis-library/system/pre-os.sml000066400000000000000000000011171416264345000220370ustar00rootroot00000000000000(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure PreOS = struct structure Status = MkAbsRep(type rep = C_Status.t) structure IODesc = MkAbsRepEq(type rep = C_Fd.t) end structure OS = struct structure Process = struct type status = PreOS.Status.t end structure IO = struct type iodesc = PreOS.IODesc.t end end mlton-20210117+dfsg/basis-library/system/process.sig000066400000000000000000000011311416264345000222730ustar00rootroot00000000000000signature OS_PROCESS = sig type status val atExit: (unit -> unit) -> unit val exit: status -> 'a val failure: status val getEnv: string -> string option val isSuccess: status -> bool val sleep: Time.time -> unit val success: status val system: string -> status val terminate: status -> 'a end signature OS_PROCESS_EXTRA = sig include OS_PROCESS structure Status: sig type t = status val fromInt: int -> t val fromPosix: Posix.Process.exit_status -> t end end mlton-20210117+dfsg/basis-library/system/process.sml000066400000000000000000000033371416264345000223160ustar00rootroot00000000000000(* Modified from SML/NJ sources by Stephen Weeks 1998-06-25 *) (* modified by Stephen Weeks 1999-12-10 *) (* modified by Stephen Weeks 2000-01-18 *) (* modified by Matthew Fluet 2008-03-02 *) (* modified by Matthew Fluet 2008-04-06 *) (* os-process.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * The Posix-based implementation of the generic process control * interface (OS.Process). * *) structure OS_Process: OS_PROCESS_EXTRA = struct open Posix.Process structure Status = struct open MLtonProcess.Status fun equals (s1, s2) = (toRep s1) = (toRep s2) val fromPosix = fn es => let datatype z = datatype Posix.Process.exit_status in case es of W_EXITED => success | W_EXITSTATUS w => fromRep (C_Status.castFromSysWord (Word8.castToSysWord w)) | W_SIGNALED _ => failure | W_STOPPED _ => failure end end type status = Status.t val failure = Status.failure val success = Status.success fun isSuccess st = Status.equals (st, success) fun system cmd = (Status.fromRep o Posix.Error.SysCall.simpleResult) (fn () => PrimitiveFFI.Posix.Process.system (NullString.nullTerm cmd)) val atExit = MLtonProcess.atExit val exit = MLtonProcess.exit fun terminate x = Posix.Process.exit (Word8.fromInt (Status.toInt x)) val getEnv = Posix.ProcEnv.getenv fun sleep t = if Time.<= (t, Time.zeroTime) then () else sleep (Posix.Process.sleep t) end mlton-20210117+dfsg/basis-library/system/time.sig000066400000000000000000000022261416264345000215610ustar00rootroot00000000000000signature TIME = sig eqtype time exception Time val + : time * time -> time val - : time * time -> time val < : time * time -> bool val <= : time * time -> bool val > : time * time -> bool val >= : time * time -> bool val compare: time * time -> order val fmt: int -> time -> string val fromMicroseconds: LargeInt.int -> time val fromMilliseconds: LargeInt.int -> time val fromNanoseconds: LargeInt.int -> time val fromReal: LargeReal.real -> time val fromSeconds: LargeInt.int -> time val fromString: string -> time option val now: unit -> time val scan: (char, 'a) StringCvt.reader -> (time, 'a) StringCvt.reader val toMicroseconds: time -> LargeInt.int val toMilliseconds: time -> LargeInt.int val toNanoseconds: time -> LargeInt.int val toReal: time -> LargeReal.real val toSeconds: time -> LargeInt.int val toString: time -> string val zeroTime: time end signature TIME_EXTRA = sig include TIME val fromTicks: LargeInt.int -> time val ticksPerSecond: LargeInt.int end mlton-20210117+dfsg/basis-library/system/time.sml000066400000000000000000000124301416264345000215700ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Time: TIME_EXTRA = struct structure Prim = PrimitiveFFI.Time (* A time is represented as a number of nanoseconds. *) val ticksPerSecond: LargeInt.int = 1000000000 datatype time = T of LargeInt.int val fromTicks = T exception Time val zeroTime = T 0 fun fromReal r = T (LargeReal.toLargeInt IEEEReal.TO_NEAREST (LargeReal.* (r, LargeReal.fromLargeInt ticksPerSecond))) handle Overflow => raise Time fun toReal (T i) = LargeReal./ (LargeReal.fromLargeInt i, LargeReal.fromLargeInt ticksPerSecond) local fun make ticksPer = let val d = LargeInt.quot (ticksPerSecond, ticksPer) in (fn i => T (LargeInt.* (i, d)), fn T i => LargeInt.quot (i, d)) end in val (fromSeconds, toSeconds) = make 1 val (fromMilliseconds, toMilliseconds) = make 1000 val (fromMicroseconds, toMicroseconds) = make 1000000 val (fromNanoseconds, toNanoseconds) = make 1000000000 end local fun make f (T i, T i') = f (i, i') in val compare = make LargeInt.compare val op < = make LargeInt.< val op <= = make LargeInt.<= val op > = make LargeInt.> val op >= = make LargeInt.>= end local fun make f (T i, T i') = T (f (i, i')) in val timeAdd = make LargeInt.+ val timeSub = make LargeInt.- end (* There's a mess here to work around a bug in vmware virtual machines * that may return a decreasing(!) sequence of time values. This will * cause some programs to raise Time exceptions where it should be * impossible. *) local fun getNow (): time = let val sec = ref (C_Time.castFromFixedInt 0) val usec = ref (C_SUSeconds.castFromFixedInt 0) in if ~1 = Prim.getTimeOfDay (sec, usec) then raise Fail "Time.now" else timeAdd(fromSeconds (C_Time.toLargeInt (! sec)), fromMicroseconds (C_SUSeconds.toLargeInt (! usec))) end val prev = ref (getNow ()) in fun now (): time = let val old = !prev val t = getNow () in case compare (old, t) of GREATER => old | _ => (prev := t; t) end end val fmt: int -> time -> string = fn n => (LargeReal.fmt (StringCvt.FIX (SOME n))) o toReal val toString = fmt 3 (* Adapted from the ML Kit 4.1.4; basislib/Time.sml * by mfluet@acm.org on 2005-11-10 based on * by mfluet@acm.org on 2005-8-10 based on * adaptations from the ML Kit 3 Version; basislib/Time.sml * by sweeks@research.nj.nec.com on 1999-1-3. *) fun scan getc src = let val charToDigit = StringCvt.charToDigit StringCvt.DEC fun pow10 0 = 1 | pow10 n = 10 * pow10 (n-1) fun mkTime sign intv fracv decs = let val nsec = LargeInt.div (LargeInt.+ (LargeInt.* (Int.toLarge (pow10 (10 - decs)), Int.toLarge fracv), 5), 10) val t = LargeInt.+ (LargeInt.* (Int.toLarge intv, ticksPerSecond), nsec) val t = if sign then t else LargeInt.~ t in T t end fun frac' sign intv fracv decs src = if Int.>= (decs, 7) then SOME (mkTime sign intv fracv decs, StringCvt.dropl Char.isDigit getc src) else case getc src of NONE => SOME (mkTime sign intv fracv decs, src) | SOME (c, rest) => (case charToDigit c of NONE => SOME (mkTime sign intv fracv decs, src) | SOME d => frac' sign intv (10 * fracv + d) (decs + 1) rest) fun frac sign intv src = case getc src of NONE => NONE | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => frac' sign intv d 1 rest) fun int' sign intv src = case getc src of NONE => SOME (mkTime sign intv 0 7, src) | SOME (#".", rest) => frac sign intv rest | SOME (c, rest) => (case charToDigit c of NONE => SOME (mkTime sign intv 0 7, src) | SOME d => int' sign (10 * intv + d) rest) fun int sign src = case getc src of NONE => NONE | SOME (#".", rest) => frac sign 0 rest | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => int' sign d rest) in case getc (StringCvt.skipWS getc src) of NONE => NONE | SOME (#"+", rest) => int true rest | SOME (#"~", rest) => int false rest | SOME (#"-", rest) => int false rest | SOME (#".", rest) => frac true 0 rest | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => int' true d rest) end handle Overflow => raise Time val fromString = StringCvt.scanString scan val op + = timeAdd val op - = timeSub end mlton-20210117+dfsg/basis-library/system/timer.sig000066400000000000000000000012321416264345000217370ustar00rootroot00000000000000signature TIMER = sig type cpu_timer type real_timer val checkCPUTimer: cpu_timer -> {sys: Time.time, usr: Time.time} val checkCPUTimes: cpu_timer -> {gc: {sys: Time.time, usr: Time.time}, nongc: {sys: Time.time, usr: Time.time}} val checkGCTime: cpu_timer -> Time.time val checkRealTimer: real_timer -> Time.time val startCPUTimer: unit -> cpu_timer val startRealTimer: unit -> real_timer val totalCPUTimer: unit -> cpu_timer val totalRealTimer: unit -> real_timer end mlton-20210117+dfsg/basis-library/system/timer.sml000066400000000000000000000037221416264345000217560ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Timer: TIMER = struct structure SysUsr = struct datatype t = T of {sys: Time.time, usr: Time.time} fun export (T r) = r fun (T {sys, usr}) - (T {sys = s', usr = u'}) = T {sys = Time.- (sys, s'), usr = Time.- (usr, u')} end type cpu_timer = {gc: SysUsr.t, self: SysUsr.t} fun startCPUTimer (): cpu_timer = let val {gc = {utime = gcu, stime = gcs, ...}, self = {utime = selfu, stime = selfs}, ...} = MLtonRusage.rusage () in {gc = SysUsr.T {sys = gcs, usr = gcu}, self = SysUsr.T {sys = selfs, usr = selfu}} end fun checkCPUTimes {gc, self} = let val {gc = g', self = s'} = startCPUTimer () val gc = SysUsr.- (g', gc) val self = SysUsr.- (s', self) in {gc = SysUsr.export gc, nongc = SysUsr.export (SysUsr.- (self, gc))} end fun checkCPUTimer timer = let val {nongc, gc} = checkCPUTimes timer in {sys = Time.+ (#sys gc, #sys nongc), usr = Time.+ (#usr gc, #usr nongc)} end val totalCPUTimer = let val t = startCPUTimer () in fn () => t end val checkGCTime = #usr o #gc o checkCPUTimes type real_timer = Time.time fun startRealTimer (): real_timer = Time.now () fun checkRealTimer (t: real_timer): Time.time = Time.- (startRealTimer (), t) val totalRealTimer = let val t = startRealTimer () in fn () => t end end mlton-20210117+dfsg/basis-library/system/unix.sig000066400000000000000000000016661416264345000216150ustar00rootroot00000000000000signature UNIX = sig type ('a, 'b) proc type signal datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal val binInstreamOf: (BinIO.instream, 'a) proc -> BinIO.instream val binOutstreamOf: ('a, BinIO.outstream) proc -> BinIO.outstream val execute: string * string list -> ('a, 'b) proc val executeInEnv: string * string list * string list -> ('a, 'b) proc val exit: Word8.word -> 'a val fromStatus: OS.Process.status -> exit_status val kill: ('a, 'b) proc * signal -> unit val reap: ('a, 'b) proc -> OS.Process.status val streamsOf: ((TextIO.instream, TextIO.outstream) proc -> TextIO.instream * TextIO.outstream) val textInstreamOf: (TextIO.instream, 'a) proc -> TextIO.instream val textOutstreamOf: ('a, TextIO.outstream) proc -> TextIO.outstream end mlton-20210117+dfsg/basis-library/system/unix.sml000066400000000000000000000031211416264345000216120ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Rewritten by wesley@terpstra.ca on 2004-11-23 to use MLtonProcess for the * implementation. *) structure Unix: UNIX = struct structure Status = OS_Process.Status structure Process = MLtonProcess local open Process in structure Child = Child structure Param = Param end type signal = Posix.Signal.signal datatype exit_status = datatype Posix.Process.exit_status val fromStatus = Posix.Process.fromStatus type ('in, 'out) proc = ('out, 'in, Process.none) Process.t local fun create {args, env, path} = Process.create {args = args, env = env, path = path, stderr = Param.self, stdin = Param.pipe, stdout = Param.pipe} in fun execute (path, args) = create {args = args, env = NONE, path = path} fun executeInEnv (path, args, env) = create {args = args, env = SOME env, path = path} end fun binInstreamOf proc = Child.binIn (Process.getStdout proc) fun binOutstreamOf proc = Child.binOut (Process.getStdin proc) fun textInstreamOf proc = Child.textIn (Process.getStdout proc) fun textOutstreamOf proc = Child.textOut (Process.getStdin proc) fun streamsOf pr = (textInstreamOf pr, textOutstreamOf pr) val kill = Process.kill fun reap z = Status.fromPosix (Process.reap z) fun exit (w: Word8.word): 'a = OS.Process.exit (Status.fromInt (Word8.toInt w)) end mlton-20210117+dfsg/basis-library/text/000077500000000000000000000000001416264345000175555ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/text/byte.sig000066400000000000000000000006221416264345000212240ustar00rootroot00000000000000signature BYTE = sig val byteToChar: Word8.word -> char val bytesToString: Word8Vector.vector -> string val charToByte: char -> Word8.word val packString: Word8Array.array * int * substring -> unit val stringToBytes: string -> Word8Vector.vector val unpackString: Word8ArraySlice.slice -> string val unpackStringVec: Word8VectorSlice.slice -> string end mlton-20210117+dfsg/basis-library/text/byte.sml000066400000000000000000000020621416264345000212350ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Byte: BYTE = struct val byteToChar = Primitive.Char8.idFromWord8 val bytesToString = Primitive.String8.idFromWord8Vector o Word8Vector.toPoly val charToByte = Primitive.Char8.idToWord8 fun packString (a: Word8Array.array, i: int, s: substring): unit = Natural.foreach (Substring.size s, fn j => Word8Array.update (a, i + j, charToByte (Substring.sub (s, j)))) val stringToBytes = Word8Vector.fromPoly o Primitive.String8.idToWord8Vector local fun make (length, sub) s = String.tabulate (length s, fn i => byteToChar (sub (s, i))) in val unpackString = make (Word8ArraySlice.length, Word8ArraySlice.sub) val unpackStringVec = make (Word8VectorSlice.length, Word8VectorSlice.sub) end end mlton-20210117+dfsg/basis-library/text/char-global.sml000066400000000000000000000004651416264345000224520ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure CharGlobal: CHAR_GLOBAL = Char open CharGlobal mlton-20210117+dfsg/basis-library/text/char.sig000066400000000000000000000032201416264345000211730ustar00rootroot00000000000000signature CHAR_GLOBAL = sig eqtype char val ord: char -> int val chr: int -> char end signature CHAR = sig include CHAR_GLOBAL eqtype string val minChar: char val maxChar: char val maxOrd: int val succ: char -> char val pred: char -> char val < : char * char -> bool val <= : char * char -> bool val > : char * char -> bool val >= : char * char -> bool val compare: char * char -> order val contains: string -> char -> bool val notContains: string -> char -> bool val toLower: char -> char val toUpper: char -> char val isAscii: char -> bool val isAlpha: char -> bool val isAlphaNum: char -> bool val isCntrl: char -> bool val isDigit: char -> bool val isGraph: char -> bool val isHexDigit: char -> bool val isLower: char -> bool val isUpper: char -> bool val isPrint: char -> bool val isPunct: char -> bool val isSpace: char -> bool val toString: char -> String.string val scan: (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader val fromString: String.string -> char option val toCString: char -> String.string val fromCString: String.string -> char option end signature CHAR_EXTRA = sig include CHAR val formatSequences: (Char.char, 'a) StringCvt.reader -> 'a -> 'a val formatSequencesOpt: (Char.char, 'a) StringCvt.reader -> (unit, 'a) StringCvt.reader val scanC: (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader end mlton-20210117+dfsg/basis-library/text/char.sml000066400000000000000000000324361416264345000212170ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHAR_ARG = sig structure PreChar : PRE_CHAR structure CharVector: EQTYPE_MONO_VECTOR_EXTRA structure CharArray: MONO_ARRAY_EXTRA sharing type PreChar.char = CharVector.elem = CharArray.elem sharing type PreChar.string = CharVector.vector = CharArray.vector end functor CharFn(Arg : CHAR_ARG) :> CHAR_EXTRA where type char = Arg.PreChar.char where type string = Arg.PreChar.string = struct open Arg.PreChar type string = Arg.CharVector.vector val maxOrd: int = numChars - 1 val fromString = Arg.CharVector.fromPoly o Vector.map (fn x => fromChar x) o String.toPoly fun succ c = if Primitive.Controls.safe andalso c = maxChar then raise Chr else chrUnsafe (Int.+ (ord c, 1)) fun pred c = if Primitive.Controls.safe andalso c = minChar then raise Chr else chrUnsafe (Int.- (ord c, 1)) fun chrOpt c = if Primitive.Controls.safe andalso Int.gtu (c, maxOrd) then NONE else SOME (chrUnsafe c) fun chr c = case chrOpt c of NONE => raise Chr | SOME c => c (* To implement character classes, we cannot use lookup tables on the * order of the number of characters. We don't want to scan the string * each time, so instead we'll sort it and use binary search. *) fun contains s = let val a = Array.tabulate (Arg.CharVector.length s, fn i => Arg.CharVector.sub (s, i)) val () = Heap.heapSort (a, op <) in fn c => let val x = Heap.binarySearch (a, fn d => d < c) in if x = Array.length a then false else Array.sub (a, x) = c end end fun notContains s = not o contains s val c = fromChar val ( la, lA, lf, lF, lz, lZ, l0, l9, lSPACE,lBANG, lTIL, lTAB, lCR, lDEL) = (c#"a", c#"A", c#"f", c#"F", c#"z", c#"Z", c#"0", c#"9", c#" ", c#"!", c#"~", c#"\t", c#"\r", c#"\127") (* Range comparisons don't need tables! It's faster to just compare. *) fun isLower c = la <= c andalso c <= lz fun isUpper c = c <= lZ andalso lA <= c (* More discriminating first! *) fun isDigit c = c <= l9 andalso l0 <= c (* More discriminating first! *) fun isGraph c = lBANG <= c andalso c <= lTIL fun isPrint c = lSPACE <= c andalso c <= lTIL fun isCntrl c = c < lSPACE orelse c = lDEL fun isAscii c = c <= lDEL (* These take advantage of ASCII ordering to minimize comparisons. *) fun isAlpha c = if la <= c then c <= lz else lA <= c andalso c <= lZ fun isAlphaNum c = if lA <= c then if la <= c then c <= lz else c <= lZ else l0 <= c andalso c <= l9 fun isHexDigit c = if lA <= c then if la <= c then c <= lf else c <= lF else l0 <= c andalso c <= l9 fun isSpace c = if lCR < c then c = lSPACE else lTAB <= c fun isPunct c = isGraph c andalso not (isAlphaNum c) local fun make (test, diff) c = if test c then chrUnsafe (Int.+! (ord c, diff)) else c val diff = Int.- (ord lA, ord la) in val toLower = make (isUpper, Int.~ diff) val toUpper = make (isLower, diff) end fun control reader state = case reader state of NONE => NONE | SOME (c, state) => if Char.<= (#"@", c) andalso Char.<= (c, #"_") then SOME (chr (Int.-! (Char.ord c, Char.ord #"@")), state) else NONE fun formatChar reader state = case reader state of NONE => NONE | SOME (c, state) => if StringCvt.isSpace c then SOME ((), state) else NONE fun formatChars reader = let fun loop state = case formatChar reader state of NONE => state | SOME ((), state) => loop state in loop end val 'a formatSequencesOpt: (Char.char, 'a) StringCvt.reader -> (unit, 'a) StringCvt.reader = fn reader => let fun loop state = case reader state of SOME (#"\\", state1) => (case formatChar reader state1 of NONE => NONE | SOME ((), state2) => let val state3 = formatChars reader state2 in case reader state3 of SOME (#"\\", state4) => (case loop state4 of state5 as SOME _ => state5 | NONE => SOME ((), state4)) | _ => NONE end) | _ => NONE in loop end fun formatSequences reader state = case formatSequencesOpt reader state of NONE => state | SOME ((), state) => state fun 'a scan (reader: (Char.char, 'a) StringCvt.reader) : (char, 'a) StringCvt.reader = let val escape : (char, 'a) StringCvt.reader = fn state => case reader state of NONE => NONE | SOME (c, state') => let fun yes c = SOME (fromChar c, state') in case c of #"a" => yes #"\a" | #"b" => yes #"\b" | #"t" => yes #"\t" | #"n" => yes #"\n" | #"v" => yes #"\v" | #"f" => yes #"\f" | #"r" => yes #"\r" | #"\\" => yes #"\\" | #"\"" => yes #"\"" | #"^" => control reader state' | #"u" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 4) reader) state' | #"U" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 8) reader) state' | _ => (* 3 decimal digits *) Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.DEC, 3) reader) state end val main: (char, 'a) StringCvt.reader = fn state => let val state = formatSequences reader state in case reader state of NONE => NONE | SOME (c, state) => (* isPrint doesn't exist. yuck: *) if Char.>= (c, #" ") andalso Char.<= (c, #"~") then case c of #"\\" => escape state | #"\"" => NONE | _ => SOME (fromChar c, formatSequences reader state) else NONE end in main end val fromString = StringCvt.scanString scan fun 'a scanC (reader: (Char.char, 'a) StringCvt.reader) : (char, 'a) StringCvt.reader = let val rec escape = fn state => case reader state of NONE => NONE | SOME (c, state') => let fun yes c = SOME (fromChar c, state') in case c of #"a" => yes #"\a" | #"b" => yes #"\b" | #"t" => yes #"\t" | #"n" => yes #"\n" | #"v" => yes #"\v" | #"f" => yes #"\f" | #"r" => yes #"\r" | #"?" => yes #"?" | #"\\" => yes #"\\" | #"\"" => yes #"\"" | #"'" => yes #"'" | #"^" => control reader state' | #"x" => Reader.mapOpt chrOpt (StringCvt.digits StringCvt.HEX reader) state' | #"u" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 4) reader) state' | #"U" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 8) reader) state' | _ => Reader.mapOpt chrOpt (StringCvt.digitsPlus (StringCvt.OCT, 3) reader) state end and main = fn NONE => NONE | SOME (c, state) => (* yuck. isPrint is not defined yet: *) if Char.>= (c, #" ") andalso Char.<= (c, #"~") then case c of #"\\" => escape state | _ => SOME (fromChar c, state) else NONE in main o reader end val fromCString = StringCvt.scanString scanC fun padLeft (s: String.string, n: int): String.string = let val m = String.size s val diff = Int.-! (n, m) in if Int.> (diff, 0) then String.concat [String.new (diff, #"0"), s] else if diff = 0 then s else raise Fail "padLeft" end fun unicodeEscape ord = if Int.< (ord, 65536) then String.concat ["\\u", padLeft (Int.fmt StringCvt.HEX ord, 4)] else String.concat ["\\U", padLeft (Int.fmt StringCvt.HEX ord, 8)] fun toString c = let val ord = ord c in if isPrint c then case ord of 92 (* #"\\" *) => "\\\\" | 34 (* #"\"" *) => "\\\"" | _ => String.new (1, Char.chrUnsafe ord) (* ^^^^ safe b/c isPrint < 128 *) else case ord of 7 (* #"\a" *) => "\\a" | 8 (* #"\b" *) => "\\b" | 9 (* #"\t" *) => "\\t" | 10 (* #"\n" *) => "\\n" | 11 (* #"\v" *) => "\\v" | 12 (* #"\f" *) => "\\f" | 13 (* #"\r" *) => "\\r" | _ => if Int.< (ord, 32) then String.concat ["\\^", String.new (1, Char.chrUnsafe (Int.+! (ord, 64 (* #"@" *) )))] else if Int.< (ord, 256) then String.concat ["\\", padLeft (Int.fmt StringCvt.DEC ord, 3)] else unicodeEscape ord end fun toCString c = let val ord = ord c in if isPrint c then case ord of 92 (* #"\\" *) => "\\\\" | 34 (* #"\"" *) => "\\\"" | 63 (* #"?" *) => "\\?" | 39 (* #"'" *) => "\\'" | _ => String.new (1, Char.chrUnsafe ord) else case ord of 7 (* #"\a" *) => "\\a" | 8 (* #"\b" *) => "\\b" | 9 (* #"\t" *) => "\\t" | 10 (* #"\n" *) => "\\n" | 11 (* #"\v" *) => "\\v" | 12 (* #"\f" *) => "\\f" | 13 (* #"\r" *) => "\\r" | _ => if Int.< (ord, 256) then String.concat ["\\", padLeft (Int.fmt StringCvt.OCT ord, 3)] else unicodeEscape ord end end structure CharArg : CHAR_ARG = struct structure PreChar = Char structure CharVector = CharVector structure CharArray = CharArray end structure WideCharArg : CHAR_ARG = struct structure PreChar = WideChar structure CharVector = WideCharVector structure CharArray = WideCharArray end structure Char : CHAR_EXTRA = CharFn(CharArg) structure WideChar : CHAR_EXTRA = CharFn(WideCharArg) mlton-20210117+dfsg/basis-library/text/char0.sig000066400000000000000000000007061416264345000212610ustar00rootroot00000000000000signature PRE_CHAR = sig eqtype char eqtype string val chrUnsafe: int -> char val ord: char -> int val fromChar: Char.char -> char val minChar : char val maxChar : char val numChars : int val compare: char * char -> order val < : char * char -> bool val <= : char * char -> bool val > : char * char -> bool val >= : char * char -> bool end mlton-20210117+dfsg/basis-library/text/char0.sml000066400000000000000000000045641416264345000213000ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure PreCharX = struct structure Prim8 = Primitive.Char8 structure Prim16 = Primitive.Char16 structure Prim32 = Primitive.Char32 type 'a t = { chrUnsafe: int -> 'a, ord: 'a -> int, minChar: 'a, maxChar: 'a, numChars: int } val fChar8 : Prim8.char t = { chrUnsafe = Prim8.idFromWord8 o Int.sextdToWord8, ord = Int.zextdFromWord8 o Prim8.idToWord8, minChar = #"\000", maxChar = #"\255", numChars = 256 (* 0x100 *) } val fChar16 : Prim16.char t = { chrUnsafe = Prim16.idFromWord16 o Int.sextdToWord16, ord = Int.zextdFromWord16 o Prim16.idToWord16, minChar = #"\000", maxChar = #"\uFFFF", numChars = 65536 (* 0x10000 *) } val fChar32 : Prim32.char t = { chrUnsafe = Prim32.idFromWord32 o Int.sextdToWord32, ord = Int.zextdFromWord32 o Prim32.idToWord32, minChar = #"\000", maxChar = Prim32.idFromWord32 0wx0010FFFF, numChars = 1114112 (* 0x110000 *) } end in structure Char : PRE_CHAR = struct (* set by config/default/default-charX.sml *) open Char type string = String.string local structure PCX = Char_ChooseChar(PreCharX) in val { chrUnsafe, ord, minChar, maxChar, numChars } = PCX.f end fun fromChar x = x end structure WideChar : PRE_CHAR = struct (* set by config/default/default-widecharX.sml *) open WideChar type string = WideString.string local structure PCX = WideChar_ChooseChar(PreCharX) in val { chrUnsafe, ord, minChar, maxChar, numChars } = PCX.f end (* safe b/c WideChar >= Char *) val fromChar = chrUnsafe o Char.ord end end mlton-20210117+dfsg/basis-library/text/nullstring.sml000066400000000000000000000007131416264345000224740ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure NullString = struct open Primitive.NullString8 val nullTerm = fromString o String.nullTerm end structure NullStringArray = struct open Primitive.NullString8Array end mlton-20210117+dfsg/basis-library/text/string-cvt.sig000066400000000000000000000031411416264345000223600ustar00rootroot00000000000000signature STRING_CVT = sig datatype radix = BIN | OCT | DEC | HEX datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option val padLeft: char -> int -> string -> string val padRight: char -> int -> string -> string val splitl: (char -> bool) -> (char, 'a) reader -> 'a -> string * 'a val takel: (char -> bool) -> (char, 'a) reader -> 'a -> string val dropl: (char -> bool) -> (char, 'a) reader -> 'a -> 'a val skipWS: (char, 'a) reader -> 'a -> 'a type cs val scanString: ((char, cs) reader -> ('a, cs) reader) -> string -> 'a option end signature STRING_CVT_EXTRA = sig include STRING_CVT val radixToInt: radix -> int val radixToWord: radix -> word val charToDigit: radix -> char -> int option val charToWDigit: radix -> char -> word option (* this exists before Char.isSpace *) val isSpace: char -> bool (* maps 0...15 to #"0", #"1", ..., #"F" *) val digitToChar: int -> char (* digitsExact(r, n) reads exactly n digits of radix r *) val digitsExact: radix * int -> (char, 'a) reader -> (int, 'a) reader (* digitsPlus(r, m) reads between 1 and m digits of radix r *) val digitsPlus: radix * int -> (char, 'a) reader -> (int, 'a) reader (* digits r reads as many digits of radix r as possible *) val digits: radix -> (char, 'a) reader -> (int, 'a) reader val wdigits: radix -> (char, 'a) reader -> (word, 'a) reader end mlton-20210117+dfsg/basis-library/text/string-cvt.sml000066400000000000000000000150021416264345000223700ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure StringCvt: STRING_CVT_EXTRA = struct open Reader val wordFromInt = Word.sextdFromInt datatype radix = BIN | OCT | DEC | HEX val radixToInt: radix -> int = fn BIN => 2 | OCT => 8 | DEC => 10 | HEX => 16 val radixToWord: radix -> word = wordFromInt o radixToInt datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option open Int local fun pad f (c: char) i s = let val n = String.size s in if n >= i then s else f (s, String.vector (i -! n, c)) end in val padLeft = pad (fn (s, pad) => String.^ (pad, s)) val padRight = pad String.^ end fun splitl p f src = let fun done chars = String.implode (rev chars) fun loop (src, chars) = case f src of NONE => (done chars, src) | SOME (c, src') => if p c then loop (src', c :: chars) else (done chars, src) in loop (src, []) end fun takel p f s = #1 (splitl p f s) fun dropl p f s = #2 (splitl p f s) type cs = int fun stringReader (s: string): (char, cs) reader = fn i => if i >= String.size s then NONE else SOME (String.sub (s, i), i + 1) fun 'a scanString (f: ((char, cs) reader -> ('a, cs) reader)) (s: string) : 'a option = case f (stringReader s) 0 of NONE => NONE | SOME (a, _) => SOME a local fun memoize (f: char -> 'a): char -> 'a = let val a = Array.tabulate (Char.numChars, f o Char.chrUnsafe) in fn c => Array.sub (a, Char.ord c) end fun range (add: int, cmin: char, cmax: char): char -> int option = let val min = Char.ord cmin in fn c => if Char.<= (cmin, c) andalso Char.<= (c, cmax) then SOME (add +! Char.ord c -! min) else NONE end fun 'a combine (ds: (char -> 'a option) list): char -> 'a option = memoize (fn c => let val rec loop = fn [] => NONE | d :: ds => case d c of NONE => loop ds | z => z in loop ds end) val bin = memoize (range (0, #"0", #"1")) val oct = memoize (range (0, #"0", #"7")) val dec = memoize (range (0, #"0", #"9")) val hex = combine [range (0, #"0", #"9"), range (10, #"a", #"f"), range (10, #"A", #"F")] fun isSpace c = (c = #" " orelse c = #"\t" orelse c = #"\r" orelse c = #"\n" orelse c = #"\v" orelse c = #"\f") in val isSpace = memoize isSpace fun skipWS x = dropl isSpace x fun charToDigit (radix: radix): char -> int option = case radix of BIN => bin | OCT => oct | DEC => dec | HEX => hex end fun charToWDigit radix = (Option.map wordFromInt) o (charToDigit radix) fun digits (radix, max, accum) reader state = let val r = radixToInt radix fun loop (max, accum, state) = let fun done () = SOME (accum, state) in if max <= 0 then done () else case reader state of NONE => done () | SOME (c, state) => case charToDigit radix c of NONE => done () | SOME n => loop (max - 1, n + accum * r, state) end in loop (max, accum, state) end fun digitsPlus (radix, max) reader state = case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => digits (radix, max -! 1, n) reader state fun digitsExact (radix, num) reader state = let val r = radixToInt radix fun loop (num, accum, state) = if num <= 0 then SOME (accum, state) else case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => loop (num - 1, n + accum * r, state) in loop (num, 0, state) end fun digits radix reader state = let val r = radixToInt radix fun loop (accum, state) = case reader state of NONE => SOME (accum, state) | SOME (c, state') => case charToDigit radix c of NONE => SOME (accum, state) | SOME n => loop (n + accum * r, state') in case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => loop (n, state) end fun wdigits radix reader state = let val op + = Word.+ val op * = Word.* val r = radixToWord radix fun loop (accum, state) = case reader state of NONE => SOME (accum, state) | SOME (c, state') => case charToWDigit radix c of NONE => SOME (accum, state) | SOME n => loop (n + accum * r, state') in case reader state of NONE => NONE | SOME (c, state) => case charToWDigit radix c of NONE => NONE | SOME n => loop (n, state) end fun digitToChar (n: int): char = String.sub ("0123456789ABCDEF", n) end mlton-20210117+dfsg/basis-library/text/string-global.sml000066400000000000000000000010001416264345000230250ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure StringGlobal: STRING_GLOBAL = String open StringGlobal (* Now that concat is defined, we can add the exnMessager for Fail. *) val _ = General.addExnMessager (fn e => case e of Fail s => SOME (concat ["Fail: ", s]) | _ => NONE) mlton-20210117+dfsg/basis-library/text/string.sig000066400000000000000000000034011416264345000215650ustar00rootroot00000000000000signature STRING_GLOBAL = sig eqtype char eqtype string val ^ : string * string -> string val concat: string list -> string val explode: string -> char list val implode: char list -> string val size: string -> int val str: char -> string val substring: string * int * int -> string end signature STRING = sig include STRING_GLOBAL val < : string * string -> bool val <= : string * string -> bool val > : string * string -> bool val >= : string * string -> bool val collate: (char * char -> order) -> string * string -> order val compare: string * string -> order val concatWith: string -> string list -> string val extract: string * int * int option -> string val fields: (char -> bool) -> string -> string list val fromCString: String.string -> string option val fromString: String.string -> string option val isPrefix: string -> string -> bool val isSubstring: string -> string -> bool val isSuffix: string -> string -> bool val map: (char -> char) -> string -> string val maxSize: int val scan: (Char.char, 'a) StringCvt.reader -> (string, 'a) StringCvt.reader val sub: string * int -> char val toCString: string -> String.string val toString: string -> String.string val tokens: (char -> bool) -> string -> string list val translate: (char -> string) -> string -> string end signature STRING_EXTRA = sig include STRING type array val unsafeFromArray: array -> string val new: int * char -> string val nullTerm: string -> string val tabulate: int * (int -> char) -> string val toLower: string -> string end mlton-20210117+dfsg/basis-library/text/string.sml000066400000000000000000000064411416264345000216050ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature STRING_ARG = sig structure Char: CHAR_EXTRA structure CharVector: EQTYPE_MONO_VECTOR_EXTRA sharing type Char.char = CharVector.elem sharing type Char.string = CharVector.vector end functor StringFn(Arg : STRING_ARG) :> STRING_EXTRA where type char = Arg.CharVector.elem where type string = Arg.CharVector.vector where type array = Arg.CharVector.array = struct open Arg open CharVector structure CharVectorSlice = MonoVectorSlice type char = elem type string = vector val new = vector fun str c = new (1, c) val maxSize = maxLen val size = length val op ^ = append val implode = fromList val explode = toList fun extract (s, start, len) = CharVectorSlice.vector (CharVectorSlice.slice (s, start, len)) fun substring (s, start, len) = extract (s, start, SOME len) val toLower = translate (str o Char.toLower) local fun make f = f (op = : char * char -> bool) in val isPrefix = make isPrefix val isSubstring = make isSubvector val isSuffix = make isSuffix end val compare = collate Char.compare local structure S = StringComparisons (type t = string val compare = compare) in open S end fun Stranslate f = String.fromPoly o Vector.translate f o toPoly val toString = Stranslate Char.toString val toCString = Stranslate Char.toCString val scan = fn reader => let fun loop (state, cs) = case Char.scan reader state of NONE => SOME (implode (rev cs), Char.formatSequences reader state) | SOME (c, state) => loop (state, c :: cs) in fn state => case reader state of NONE => SOME (implode [], state) | SOME _ => case Char.scan reader state of SOME (c, state) => loop (state, [c]) | NONE => case Char.formatSequencesOpt reader state of SOME ((), state) => SOME (implode [], state) | NONE => NONE end val fromString = StringCvt.scanString scan fun scanString scanChar reader = fn state => Option.map (fn (cs, state) => (implode cs, state)) (Reader.list (scanChar reader) state) val fromCString = StringCvt.scanString (scanString Char.scanC) val null = str (Char.chr 0) fun nullTerm s = s ^ null end structure StringArg : STRING_ARG = struct structure Char = Char structure CharVector = CharVector end structure WideStringArg : STRING_ARG = struct structure Char = WideChar structure CharVector = WideCharVector end structure String : STRING_EXTRA = StringFn(StringArg) structure WideString : STRING_EXTRA = StringFn(WideStringArg) mlton-20210117+dfsg/basis-library/text/string0.sml000066400000000000000000000012151416264345000216570ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure String = struct open CharVector type string = vector val size = length val op ^ = append val implode = fromList val new = vector end (* structure WideString = struct open WideCharVector type string = vector val size = length val op ^ = append val implode = fromList val new = vector end *) mlton-20210117+dfsg/basis-library/text/substring-global.sml000066400000000000000000000005111416264345000235450ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SubstringGlobal: SUBSTRING_GLOBAL = Substring open SubstringGlobal mlton-20210117+dfsg/basis-library/text/substring.sig000066400000000000000000000041531416264345000223040ustar00rootroot00000000000000signature SUBSTRING_GLOBAL = sig type substring end signature SUBSTRING = sig include SUBSTRING_GLOBAL eqtype char eqtype string val app: (char -> unit) -> substring -> unit val base: substring -> string * int * int val collate: (char * char -> order) -> substring * substring -> order val compare: substring * substring -> order val concat: substring list -> string val concatWith: string -> substring list -> string val dropl: (char -> bool) -> substring -> substring val dropr: (char -> bool) -> substring -> substring val explode: substring -> char list val extract: string * int * int option -> substring val fields: (char -> bool) -> substring -> substring list val first: substring -> char option val foldl: (char * 'a -> 'a) -> 'a -> substring -> 'a val foldr: (char * 'a -> 'a) -> 'a -> substring -> 'a val full: string -> substring val getc: substring -> (char * substring) option val isEmpty: substring -> bool val isPrefix: string -> substring -> bool val isSubstring: string -> substring -> bool val isSuffix: string -> substring -> bool val position: string -> substring -> substring * substring val size: substring -> int val slice: substring * int * int option -> substring val span: substring * substring -> substring val splitAt: substring * int -> substring * substring val splitl: (char -> bool) -> substring -> substring * substring val splitr: (char -> bool) -> substring -> substring * substring val string: substring -> string val sub: substring * int -> char val substring: string * int * int -> substring val takel: (char -> bool) -> substring -> substring val taker: (char -> bool) -> substring -> substring val tokens: (char -> bool) -> substring -> substring list val translate: (char -> string) -> substring -> string val triml: int -> substring -> substring val trimr: int -> substring -> substring end signature SUBSTRING_EXTRA = sig include SUBSTRING end mlton-20210117+dfsg/basis-library/text/substring.sml000066400000000000000000000036011416264345000223120ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* The :> is to hide the type substring. We must add the where's to make char * and string the same as the toplevel types. *) functor SubstringFn(Arg : STRING_ARG) :> SUBSTRING_EXTRA where type char = Arg.CharVector.MonoVectorSlice.elem where type string = Arg.CharVector.MonoVectorSlice.vector where type substring = Arg.CharVector.MonoVectorSlice.slice = struct open Arg open CharVector.MonoVectorSlice type char = elem type string = vector type substring = slice val size = length val extract = slice fun substring (s, start, len) = extract (s, start, SOME len) val string = vector val getc = getItem fun first ss = Option.map #1 (getItem ss) val slice = subslice val explode = toList local fun make f = f (op = : char * char -> bool) in val isPrefix = make isPrefix val isSubstring = make isSubvector val isSuffix = make isSuffix val position = make position end val compare = collate Char.compare (* type cs = int fun reader (T {str, start, size}): (char, cs) Reader.reader = fn i => if i >= size then NONE else SOME (String.sub (str, start +? i), i + 1) fun 'a scanSubstring (f: (char, cs) Reader.reader -> ('a, int) Reader.reader) (ss: substring): 'a option = case f (reader ss) 0 of NONE => NONE | SOME (a, _) => SOME a *) end structure Substring = SubstringFn(StringArg) structure WideSubstring = SubstringFn(WideStringArg) mlton-20210117+dfsg/basis-library/text/text.sig000066400000000000000000000015031416264345000212440ustar00rootroot00000000000000signature TEXT = sig structure Char: CHAR structure CharArray: MONO_ARRAY structure CharArraySlice: MONO_ARRAY_SLICE structure CharVector: MONO_VECTOR structure CharVectorSlice: MONO_VECTOR_SLICE structure String: STRING structure Substring: SUBSTRING sharing type Char.char = CharArray.elem = CharArraySlice.elem = CharVector.elem = CharVectorSlice.elem = String.char = Substring.char sharing type Char.string = CharArraySlice.vector = CharVector.vector = CharArray.vector = CharVectorSlice.vector = String.string = Substring.string sharing type CharArray.array = CharArraySlice.array sharing type CharVectorSlice.slice = CharArraySlice.vector_slice end mlton-20210117+dfsg/basis-library/text/text.sml000066400000000000000000000015361416264345000212630ustar00rootroot00000000000000(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Text: TEXT = struct structure Char = Char structure CharArray = CharArray structure CharArraySlice = CharArraySlice structure CharVector = CharVector structure CharVectorSlice = CharVectorSlice structure String = String structure Substring = Substring end structure WideText: TEXT = struct structure Char = WideChar structure CharArray = WideCharArray structure CharArraySlice = WideCharArraySlice structure CharVector = WideCharVector structure CharVectorSlice = WideCharVectorSlice structure String = WideString structure Substring = WideSubstring end mlton-20210117+dfsg/basis-library/top-level/000077500000000000000000000000001416264345000205005ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/top-level/arithmetic.sml000066400000000000000000000007311416264345000233470ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val ~ = Int.~ val ( op + ) = Int.+ val ( op - ) = Int.- val ( op * ) = Int.* val ( op div ) = Int.div val ( op mod ) = Int.mod val ( op < ) = Int.< val ( op <= ) = Int.<= val ( op > ) = Int.> val ( op >= ) = Int.>= mlton-20210117+dfsg/basis-library/top-level/infixes-overflow.sml000066400000000000000000000004401416264345000245210ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 7 *? *$ infix 6 +? +$ -? -$ mlton-20210117+dfsg/basis-library/top-level/infixes-unsafe.sml000066400000000000000000000004271416264345000241440ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 7 *! infix 6 +! -! mlton-20210117+dfsg/basis-library/top-level/infixes.sml000066400000000000000000000005441416264345000226650ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20210117+dfsg/basis-library/unsafe.mlb000066400000000000000000000007611416264345000205520ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature UNSAFE structure Unsafe end end mlton-20210117+dfsg/basis-library/util/000077500000000000000000000000001416264345000175465ustar00rootroot00000000000000mlton-20210117+dfsg/basis-library/util/CUtil.sig000066400000000000000000000024321416264345000212730ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_UTIL = sig structure C_Pointer : sig type t = C_Pointer.t val null: t val isNull: t -> bool end (* C char* *) structure C_String : sig type t = C_String.t (* string must be null terminated *) val length: t -> int val sub: t * int -> char val toCharArrayOfLength: t * int -> char array (* string must be null terminated *) val toString: t -> string (* extract first n characters of string *) val toStringOfLength: t * int -> string val update: t * int * char -> unit end (* NULL terminated char** *) structure C_StringArray : sig type t = C_StringArray.t val fromList: string list -> NullString.t array (* extract first n strings from array *) val toArrayOfLength: t * int -> string array val toList: t -> string list end end mlton-20210117+dfsg/basis-library/util/CUtil.sml000066400000000000000000000060341416264345000213060ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure CUtil: C_UTIL = struct open Int structure Pointer = Primitive.MLton.Pointer fun makeLength (sub, term) p = let fun loop i = if term (sub (p, i)) then i else loop (i +! 1) in loop 0 end fun toArrayOfLength (s: 'a, sub: 'a * int -> 'b, n: int) : 'b array = let val (a, _) = Array.unfoldi (n, (), fn (i, ()) => (sub (s, i), ())) in a end structure C_Pointer = struct type t = C_Pointer.t val null = Pointer.toWord Pointer.null fun isNull p = p = null end structure C_String = struct type t = C_String.t fun sub (cs, i) = Primitive.Char8.idFromWord8 (Pointer.getWord8 (Pointer.fromWord cs, C_Ptrdiff.fromInt i)) fun update (cs, i, c) = Pointer.setWord8 (Pointer.fromWord cs, C_Ptrdiff.fromInt i, Primitive.Char8.idToWord8 c) val length = makeLength (sub, fn #"\000" => true | _ => false) fun toCharArrayOfLength (cs, n) = toArrayOfLength (cs, sub, n) fun toStringOfLength (cs, n) = String.unsafeFromArray (CharArray.fromPoly (toCharArrayOfLength (cs, n))) fun toString cs = toStringOfLength (cs, length cs) end structure C_StringArray = struct type t = C_StringArray.t fun sub (css: t, i) = (Pointer.toWord o Pointer.getCPointer) (Pointer.fromWord css, C_Ptrdiff.fromInt i) val length = makeLength (sub, C_Pointer.isNull) val toArrayOfLength = fn (css, n) => toArrayOfLength (css, C_String.toString o sub, n) fun toArray css = toArrayOfLength (css, length css) val toList = Array.toList o toArray (* The C side converts the last element of the array, "", * to the null terminator that C primitives expect. * As far as C can tell, the other elements of the array * are just char*'s. *) fun fromList l = let val (a, _) = Array.unfoldi (1 +! List.length l, l, fn (_, l) => case l of [] => (NullString.empty, l) | s::l => (NullString.nullTerm s, l)) in a end end end mlton-20210117+dfsg/basis-library/util/abs-rep.fun000066400000000000000000000024761416264345000216220ustar00rootroot00000000000000(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MkAbsRep(type rep) :> ABS_REP where type Rep.t = rep = struct structure Rep = struct type t = rep end type t = Rep.t val arrayFromRep : rep array -> t array = fn x => x val arrayToRep : t array -> rep array = fn x => x val fromRep : rep -> t = fn x => x val listFromRep : rep list -> t list = fn x => x val listToRep : t list -> rep list = fn x => x val toRep : t -> rep = fn x => x val vectorFromRep : rep vector -> t vector = fn x => x val vectorToRep : t vector -> rep vector = fn x => x end functor MkAbsRepEq(eqtype rep) :> ABS_REP_EQ where type Rep.t = rep = struct structure Rep = struct type t = rep end type t = Rep.t val arrayFromRep : rep array -> t array = fn x => x val arrayToRep : t array -> rep array = fn x => x val fromRep : rep -> t = fn x => x val listFromRep : rep list -> t list = fn x => x val listToRep : t list -> rep list = fn x => x val toRep : t -> rep = fn x => x val vectorFromRep : rep vector -> t vector = fn x => x val vectorToRep : t vector -> rep vector = fn x => x end mlton-20210117+dfsg/basis-library/util/abs-rep.sig000066400000000000000000000020401416264345000215770ustar00rootroot00000000000000(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ABS_REP = sig type t structure Rep : sig type t end val arrayFromRep : Rep.t array -> t array val arrayToRep : t array -> Rep.t array val fromRep : Rep.t -> t val listFromRep : Rep.t list -> t list val listToRep : t list -> Rep.t list val toRep : t -> Rep.t val vectorFromRep : Rep.t vector -> t vector val vectorToRep : t vector -> Rep.t vector end signature ABS_REP_EQ = sig eqtype t structure Rep : sig eqtype t end val arrayFromRep : Rep.t array -> t array val arrayToRep : t array -> Rep.t array val fromRep : Rep.t -> t val listFromRep : Rep.t list -> t list val listToRep : t list -> Rep.t list val toRep : t -> Rep.t val vectorFromRep : Rep.t vector -> t vector val vectorToRep : t vector -> Rep.t vector end mlton-20210117+dfsg/basis-library/util/cleaner.sig000066400000000000000000000006721416264345000216700ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CLEANER = sig type t val addNew: t * (unit -> unit) -> unit val atExit: t val atLoadWorld: t val clean: t -> unit val new: unit -> t end mlton-20210117+dfsg/basis-library/util/cleaner.sml000066400000000000000000000007551416264345000217030ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Cleaner: CLEANER = struct type t = (unit -> unit) list ref fun new (): t = ref [] fun addNew (cs, f) = cs := f :: (!cs) fun clean cs = app (fn c => c () handle _ => ()) (!cs) val atExit = new () val atLoadWorld = new () end mlton-20210117+dfsg/basis-library/util/dynamic-wind.sig000066400000000000000000000005271416264345000226410ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DYNAMIC_WIND = sig val wind: (unit -> 'a) * (unit -> unit) -> 'a end mlton-20210117+dfsg/basis-library/util/dynamic-wind.sml000066400000000000000000000011651416264345000226510ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure DynamicWind: DYNAMIC_WIND = struct fun try (f: unit -> 'a, k: 'a -> 'b, h: exn -> 'b) = let datatype t = A of 'a | E of exn in case A (f ()) handle e => E e of A a => k a | E e => h e end fun wind (thunk, cleanup: unit -> unit) = try (thunk, fn a => (cleanup (); a), fn e => (cleanup (); raise e)) end mlton-20210117+dfsg/basis-library/util/heap.sml000066400000000000000000000074541416264345000212120ustar00rootroot00000000000000(* Copyright (C) 2007-2007 Wesley W. Terpstra * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Heap: sig (* Sorts the provided array relative to the lessthan argument*) val heapSort: 'a array * ('a * 'a -> bool) -> unit (* Precondition: array is 0+ true values followed by 0+ false values *) (* Finds the index of the first array entry where: f x = false *) val binarySearch: 'a array * ('a -> bool) -> int end = struct fun heapSort (a : 'a array, lessthan : 'a * 'a -> bool) = let open Array (* Push the hole down until value > both children *) fun pushHoleDown ( hole, end_of_heap, value ) = let val left_child = Int.+ (Int.* (hole, 2), 1) val right_child = Int.+ (left_child, 1) in (* Recursion: two children *) if Int.< (right_child, end_of_heap) then let val left_value = sub (a, left_child) val right_value = sub (a, right_child) val (bigger_child, bigger_value) = if lessthan (left_value, right_value) then (right_child, right_value) else (left_child, left_value) in if lessthan (bigger_value, value) then update (a, hole, value) else (update (a, hole, bigger_value); pushHoleDown (bigger_child, end_of_heap, value)) end (* Base case: one child *) else if right_child = end_of_heap then let val left_value = sub (a, left_child) in if lessthan (left_value, value) then update (a, hole, value) else (update (a, hole, left_value); update (a, left_child, value)) end (* Base case: no children *) else update (a, hole, value) end (* Move largest element to end_of_table, then restore invariant *) fun sortHeap end_of_heap = let val end_of_heap = Int.- (end_of_heap, 1) in if end_of_heap = 0 then () else let val value = sub (a, end_of_heap) in update (a, end_of_heap, sub (a, 0)); pushHoleDown (0, end_of_heap, value); sortHeap end_of_heap end end (* Start at last node w/ parent, loop till 0: push down *) val heapSize = Array.length a fun heapify i = if i = 0 then () else let val i = Int.- (i, 1) in pushHoleDown (i, heapSize, sub (a, i)); heapify i end in if Int.<= (heapSize, 1) then () else (heapify (Int.div (heapSize, 2)); sortHeap heapSize) end fun binarySearch (a : 'a array, f : 'a -> bool) = let fun loop (lower, upper) = (* Base case: one element left *) if Int.- (upper, lower) = 1 then if f (Array.sub (a, lower)) then upper else lower (* Recursive case: check middle *) else let val mid = Int.div (Int.+ (lower, upper), 2) in if f (Array.sub (a, mid)) then loop (mid, upper) else loop (lower, mid) end val size = Array.length a in if size = 0 then 0 else loop (0, size) end end mlton-20210117+dfsg/basis-library/util/integral-comparisons.sml000066400000000000000000000023071416264345000244250ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor IntegralComparisons (type t val < : t * t -> bool) = struct val < : t * t -> bool = < fun <= (a, b) = not (< (b, a)) fun > (a, b) = < (b, a) fun >= (a, b) = <= (b, a) fun compare (i, j) = if < (i, j) then LESS else if < (j, i) then GREATER else EQUAL fun min (x, y) = if < (x, y) then x else y fun max (x, y) = if < (x, y) then y else x end functor UnsignedIntegralComparisons (type int type word val idFromIntToWord : int -> word val < : word * word -> bool) = struct local fun ltu (i: int, i': int) = < (idFromIntToWord i, idFromIntToWord i') structure S = IntegralComparisons (type t = int val < = ltu) in val ltu = S.< val leu = S.<= val gtu = S.> val geu = S.>= end end mlton-20210117+dfsg/basis-library/util/natural.sml000066400000000000000000000013561416264345000217360ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Natural = struct fun foldStartStop (start, stop, b, f) = if start > stop then raise Subscript else let fun loop (i, b) = if i >= stop then b else loop (i + 1, f (i, b)) in loop (start, b) end fun foreachStartStop (start, stop, f) = foldStartStop (start, stop, (), fn (i, ()) => f i) fun foreach (n, f) = foreachStartStop (0, n, f) end mlton-20210117+dfsg/basis-library/util/one.sml000066400000000000000000000022361416264345000210470ustar00rootroot00000000000000(* Copyright (C) 2006-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure One: sig type 'a t val make: (unit -> 'a) -> 'a t val use: 'a t * ('a -> 'b) -> 'b end = struct datatype 'a t = T of {more: unit -> 'a, static: 'a, staticIsInUse: bool ref} fun make f = T {more = f, static = f (), staticIsInUse = ref false} fun use (T {more, static, staticIsInUse}, f) = let val () = Primitive.MLton.Thread.atomicBegin () val b = ! staticIsInUse val d = if b then (Primitive.MLton.Thread.atomicEnd (); more ()) else (staticIsInUse := true; Primitive.MLton.Thread.atomicEnd (); static) in DynamicWind.wind (fn () => f d, fn () => if b then () else staticIsInUse := false) end end mlton-20210117+dfsg/basis-library/util/reader.sig000066400000000000000000000022071416264345000215150ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature READER = sig type ('a, 'b) reader = 'b -> ('a * 'b) option (* read as many items as possible (never returns NONE) *) val list: ('a, 'b) reader -> ('a list, 'b) reader (* never return NONE *) (* val tokens: ('a -> bool) -> ('a, 'b) reader -> ('a list list, 'b) reader *) (* val fields: ('a -> bool) -> ('a, 'b) reader -> ('a list list, 'b) reader *) val map: ('a -> 'c) -> ('a, 'b) reader -> ('c, 'b) reader val mapOpt: ('a -> 'c option) -> ('a, 'b) reader -> ('c, 'b) reader val ignore: ('a -> bool) -> ('a, 'b) reader -> ('a, 'b) reader (* read excatly N items *) val readerN: ('a, 'b) reader * int -> ('a list, 'b) reader val reader2: ('a, 'b) reader -> ('a * 'a, 'b) reader val reader3: ('a, 'b) reader -> ('a * 'a * 'a, 'b) reader val reader4: ('a, 'b) reader -> ('a * 'a * 'a * 'a, 'b) reader end mlton-20210117+dfsg/basis-library/util/reader.sml000066400000000000000000000037201416264345000215270ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Reader: READER = struct open Int type ('a, 'b) reader = 'b -> ('a * 'b) option fun list (reader: ('a, 'b) reader): ('a list, 'b) reader = fn state => let fun loop (state, accum) = case reader state of NONE => SOME (rev accum, state) | SOME (a, state) => loop (state, a :: accum) in loop (state, []) end fun readerN (reader: ('a, 'b) reader, n: int): ('a list, 'b) reader = fn (state :'b) => let fun loop (n, state, accum) = if n <= 0 then SOME (rev accum, state) else case reader state of NONE => NONE | SOME (x, state) => loop (n - 1, state, x :: accum) in loop (n, state, []) end fun ignore f reader = let fun loop state = case reader state of NONE => NONE | SOME (x, state) => if f x then loop state else SOME (x, state) in loop end val _ = ignore fun map (f: 'a -> 'c) (reader: ('a, 'b) reader): ('c, 'b) reader = fn (b: 'b) => case reader b of NONE => NONE | SOME (a, b) => SOME (f a, b) fun mapOpt (f: 'a -> 'c option) (reader: ('a, 'b) reader): ('c, 'b) reader = fn (b: 'b) => case reader b of NONE => NONE | SOME (a, b) => case f a of NONE => NONE | SOME c => SOME (c, b) fun reader2 reader = map (fn [y, z] => (y, z) | _ => raise Fail "Reader.reader2") (readerN (reader, 2)) val _ = reader2 fun reader3 reader = map (fn [x, y, z] => (x, y, z) | _ => raise Fail "Reader.reader3") (readerN (reader, 3)) fun reader4 reader = map (fn [w, x, y, z] => (w, x, y, z) | _ => raise Fail "Reader.reader4") (readerN (reader, 4)) end mlton-20210117+dfsg/basis-library/util/real-comparisons.sml000066400000000000000000000006321416264345000235420ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RealComparisons (type t val < : t * t -> bool val <= : t * t -> bool) = struct fun > (a, b) = < (b, a) fun >= (a, b) = <= (b, a) end mlton-20210117+dfsg/basis-library/util/string-comparisons.sml000066400000000000000000000014301416264345000241220ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor StringComparisons (type t val compare: t * t -> order) = struct fun < (x, y) = (case compare (x, y) of LESS => true | _ => false) fun <= (x, y) = (case compare (x, y) of GREATER => false | _ => true) fun > (x, y) = (case compare (x, y) of GREATER => true | _ => false) fun >= (x, y) = (case compare (x, y) of LESS => false | _ => true) end mlton-20210117+dfsg/basis-library/util/unique-id.fun000066400000000000000000000005461416264345000221650ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor UniqueId () :> UNIQUE_ID = struct type t = unit ref fun new (): t = ref () end mlton-20210117+dfsg/basis-library/util/unique-id.sig000066400000000000000000000005071416264345000221540ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature UNIQUE_ID = sig type t val new: unit -> t end mlton-20210117+dfsg/benchmark/000077500000000000000000000000001416264345000157605ustar00rootroot00000000000000mlton-20210117+dfsg/benchmark/.gitignore000066400000000000000000000000321416264345000177430ustar00rootroot00000000000000/benchmark /benchmark.exe mlton-20210117+dfsg/benchmark/Makefile000066400000000000000000000035751416264345000174320ustar00rootroot00000000000000## Copyright (C) 2013,2019 Matthew Fluet. # Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### NAME := benchmark all: $(NAME) RUN_MLTON_COMPILE_XARGS := -default-ann 'sequenceNonUnit warn' -default-ann 'warnUnused true' $(NAME): $(NAME).mlb $(shell "$(RUN_MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(RUN_MLTON)" @MLton $(RUN_MLTON_RUNTIME_ARGS) -- $(RUN_MLTON_COMPILE_ARGS) $(RUN_MLTON_COMPILE_XARGS) -target $(TARGET) $(NAME).mlb .PHONY: clean clean: ../bin/clean BENCH := barnes-hut boyer checksum count-graphs DLXSimulator even-odd fft fib flat-array hamlet imp-for knuth-bendix lexgen life logic mandelbrot matrix-multiply md5 merge mlyacc model-elimination mpuz nucleic output1 peek psdes-random ratio-regions ray raytrace simple smith-normal-form string-concat tailfib tak tensor tsp tyan vector32-concat vector64-concat vector-rev vliw wc-input1 wc-scanStream zebra zern FPBENCH := barnes-hut fft hamlet mandelbrot matrix-multiply nucleic ray raytrace simple tensor tsp tyan vliw zern BFLAGS := -mlton "/usr/bin/mlton" -mlton "mlton -optimize-ssa {false,true}" BFLAGS := -wiki -mlton "/usr/bin/mlton" -mlkit -mosml -poly -smlnj BFLAGS := -mlton "$(BIN)/mlton" .PHONY: test test: $(NAME) cd tests && ../benchmark $(BFLAGS) $(BENCH) QBENCH := $(BENCH) QBFLAGS := -mlton "~/devel/mlton/builds/20171013.233239-g5513092e3/bin/mlton" QBFLAGS += -mlton "~/devel/mlton/mlton.git/build/bin/mlton -cse-canon {ascHash,descHash,ascIndex,descIndex}" .PHONY: qtest qtest: $(NAME) cd tests && ../benchmark $(QBFLAGS) $(QBENCH) && $(MAKE) clean mlton-20210117+dfsg/benchmark/benchmark.mlb000066400000000000000000000003661416264345000204130ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20210117+dfsg/benchmark/call-main.sml000066400000000000000000000004201416264345000203260ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20210117+dfsg/benchmark/main.sml000066400000000000000000000665551416264345000174420ustar00rootroot00000000000000(* Copyright (C) 2013,2014,2019 Matthew Fluet. * Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main = struct type int = Int.t fun usage msg = Process.usage {usage = "[-mlkit] [-mlton ] [-mosml] [-poly] [-smlnj] bench1 bench2 ...", msg = msg} val doOnce = ref false val doWiki = ref false val runArgs : string list ref = ref [] fun withInput (file, f: unit -> 'a): 'a = let open FileDesc val inFd = let open Pervasive.Posix.FileSys in openf (file, O_RDONLY, O.flags []) end in Exn.finally (fn () => FileDesc.fluidLet (FileDesc.stdin, inFd, f), fn () => FileDesc.close inFd) end fun ignoreOutput f = let val nullFd = let open Pervasive.Posix.FileSys in openf ("/dev/null", O_WRONLY, O.flags []) end open FileDesc in Exn.finally (fn () => fluidLet (stderr, nullFd, fn () => fluidLet (stdout, nullFd, f)), fn () => close nullFd) end datatype command = Explicit of {args: string list, com: string} | Shell of string list fun timeIt ca = Process.time (fn () => case ca of Explicit {args, com} => Process.wait (Process.spawnp {file = com, args = com :: args}) | Shell ss => List.foreach (ss, Process.system)) local val trialTime = Time.seconds (IntInf.fromInt 60) in fun timeCall (com, args): real = let fun doit ac = let val {user, system} = timeIt (Explicit {args = args, com = com}) val op + = Time.+ in ac + user + system end fun loop (n, ac: Time.t): real = if Time.> (ac, trialTime) then Time.toReal ac / Real.fromInt n else loop (n + 1, doit ac) in if !doOnce then Time.toReal (doit Time.zero) else loop (0, Time.zero) end end val benchCounts: (string * int) list = ("barnes-hut", 32768):: (* 41.85 sec *) ("boyer", 12288):: (* 36.04 sec *) ("checksum", 12288):: (* 42.48 sec *) ("count-graphs", 12):: (* 30.27 sec *) ("DLXSimulator", 6):: (* 31.83 sec *) ("even-odd", 24):: (* 38.96 sec *) ("fft", 16):: (* 39.63 sec *) ("fib", 32):: (* 40.10 sec *) ("flat-array", 49152):: (* 35.25 sec *) ("hamlet", 384):: (* 45.55 sec *) ("imp-for", 4096):: (* 31.57 sec *) ("knuth-bendix", 3072):: (* 34.40 sec *) ("lexgen", 1536):: (* 41.54 sec *) ("life", 32):: (* 38.71 sec *) ("logic", 256):: (* 33.24 sec *) ("mandelbrot", 6):: (* 35.66 sec *) ("matrix-multiply", 192):: (* 43.54 sec *) ("md5", 12):: (* 34.73 sec *) ("merge", 16384):: (* 33.35 sec *) ("mlyacc", 3072):: (* 34.04 sec *) ("model-elimination", 4):: (* 39.68 sec *) ("mpuz", 128):: (* 39.63 sec *) ("nucleic", 4096):: (* 31.41 sec *) ("output1", 12):: (* 32.92 sec *) ("peek", 192):: (* 36.99 sec *) ("pidigits", 4096):: (* 37.95 sec *) ("psdes-random", 24):: (* 33.80 sec *) ("ratio-regions", 1536):: (* 47.22 sec *) ("ray", 1536):: (* 37.14 sec *) ("raytrace", 96):: (* 33.44 sec *) ("simple", 1024):: (* 36.55 sec *) ("smith-normal-form", 192):: (* 40.96 sec *) ("string-concat", 256):: (* 30.66 sec *) ("tailfib", 512):: (* 37.87 sec *) ("tailmerge", 24576):: (* 42.64 sec *) ("tak", 32):: (* 37.01 sec *) ("tensor", 6):: (* 38.95 sec *) ("tsp", 16):: (* 37.29 sec *) ("tyan", 384):: (* 30.86 sec *) ("vector32-concat", 48):: (* 41.15 sec *) ("vector64-concat", 32):: (* 30.33 sec *) ("vector-rev", 96):: (* 39.46 sec *) ("vliw", 1024):: (* 39.60 sec *) ("wc-input1", 16384):: (* 30.21 sec *) ("wc-scanStream", 32768):: (* 31.67 sec *) ("zebra", 64):: (* 30.04 sec *) ("zern", 16384):: (* 38.98 sec *) nil val benchCount = String.memoize (fn s => case List.peek (benchCounts, fn (b, _) => b = s) of NONE => Error.bug (concat ["no benchCount for ", s]) | SOME (_, c) => Int.toString c) val default_main = (fn bench => concat ["val _ = Main.doit ", benchCount bench, "\n"]) fun compileSizeRun {command, exe, doTextPlusData: bool} = Escape.new (fn e => let val exe = "./" ^ exe val {system, user} = timeIt command handle _ => Escape.escape (e, {compile = NONE, run = NONE, size = NONE}) val compile = SOME (Time.toReal (Time.+ (system, user))) val size = if doTextPlusData then let val {text, data, ...} = Process.size exe in SOME (Position.fromInt (text + data)) end else SOME (File.size exe) val run = timeCall (exe, !runArgs) handle _ => Escape.escape (e, {compile = compile, run = NONE, size = size}) in {compile = compile, run = SOME run, size = size} end) fun batch_ {abbrv, bench} = let val abbrv = String.translate (abbrv, fn c => if Char.isAlphaNum c then String.fromChar c else "_") in concat [bench, ".", abbrv, ".batch"] end fun batch ab = concat [batch_ ab, ".sml"] local val next = Counter.generator 0 in fun makeMLton commandPattern = case ChoicePattern.expand commandPattern of Result.No m => usage m | Result.Yes cmds => List.map (cmds, fn cmd => let val abbrv = "MLton" ^ (Int.toString (next ())) in {name = cmd, abbrv = abbrv, main = default_main, test = (fn {bench} => let val src = batch {abbrv = abbrv, bench = bench} val exe = String.dropSuffix (src, 4) val cmds = (concat [cmd, " -output ", exe, " ", src]):: (*(concat ["strip ", exe])::*) nil in compileSizeRun {command = Shell cmds, exe = exe, doTextPlusData = true} end)} end) end fun kitCompile {bench} = let val bargs = {abbrv = "MLKit", bench = bench} val bin = batch_ bargs in compileSizeRun {command = Explicit {args = ["-o", bin, batch bargs], com = "mlkit"}, exe = bin, doTextPlusData = true} end fun mosmlCompile {bench} = let val bargs = {abbrv = "Moscow ML", bench = bench} val bin = batch_ bargs in compileSizeRun {command = Explicit {args = ["-orthodox", "-standalone", "-toplevel", "-o", bin, batch bargs], com = "mosmlc"}, exe = bin, doTextPlusData = false} end val njSuffix = Promise.delay (fn () => let val sml = "sml" val suffix = File.withTemp (fn tmp => (File.withTempOut (fn output => Out.output (output, concat ["val tmp = TextIO.openOut(\"", tmp, "\");\n", "val _ = TextIO.output(tmp, SMLofNJ.SysInfo.getHeapSuffix());\n", "val _ = TextIO.closeOut(tmp);\n"]), fn input => withInput (input, fn () => Process.wait (Process.spawnp {file = sml, args = [sml]}))) ; In.withClose (In.openIn tmp, In.inputAll))) in suffix end) fun njCompile {bench} = Escape.new (fn e => let (* sml should start SML/NJ *) val sml = "sml" val {system, user} = File.withTempOut (fn out => (Out.output (out, "local\nval _ = SMLofNJ.Internals.GC.messages false\n") ; File.outputContents (concat [bench, ".sml"], out) ; (Out.output (out, concat ["in val _ = SMLofNJ.exportFn (\"", bench, "\", fn _ => (Main.doit ", benchCount bench, "; OS.Process.success))\nend\n"] ))), fn input => withInput (input, fn () => timeIt (Explicit {args = [], com = sml}))) handle _ => Escape.escape (e, {compile = NONE, run = NONE, size = NONE}) val suffix = Promise.force njSuffix val heap = concat [bench, ".", suffix] in if not (File.doesExist heap) then {compile = NONE, run = NONE, size = NONE} else let val compile = Time.toReal (Time.+ (user, system)) val size = SOME (File.size heap) val run = timeCall (sml, [concat ["@SMLload=", heap]]) handle _ => Escape.escape (e, {compile = SOME compile, run = NONE, size = size}) in {compile = SOME compile, run = SOME run, size = size} end end) fun polyCompile {bench} = let val bargs = {abbrv = "Poly/ML", bench = bench} val bin = batch_ bargs in compileSizeRun {command = Explicit {args = [batch bargs, "-o", bin], com = "polyc"}, exe = bin, doTextPlusData = false} end type 'a data = {bench: string, compiler: string, value: 'a} list fun main args = let val compilers: {name: string, abbrv: string, main: string -> string, test: {bench: File.t} -> {compile: real option, run: real option, size: Position.int option}} list ref = ref [] fun pushCompiler compiler = List.push(compilers, compiler) fun pushCompilers compilers' = compilers := (List.rev compilers') @ (!compilers) fun setData (switch, data, str) = let fun die () = usage (concat ["invalid -", switch, " argument: ", str]) open Regexp val numSave = Save.new () val regexpSave = Save.new () val re = seq [save (star digit, numSave), char #",", save (star any, regexpSave)] val reC = compileDFA re in case Compiled.matchAll (reC, str) of NONE => die () | SOME match => let val num = Match.lookupString (match, numSave) val num = case Int.fromString num of NONE => die () | SOME num => num val regexp = Match.lookupString (match, regexpSave) val (regexp, saves) = case Regexp.fromString regexp of NONE => die () | SOME regexp => regexp val save = if 0 <= num andalso num < Vector.length saves then Vector.sub (saves, num) else die () val regexpC = compileDFA regexp fun doit s = Option.map (Compiled.matchAll (regexpC, s), fn match => Match.lookupString (match, save)) in data := SOME (str, doit) end end val outData : (string * (string -> string option)) option ref = ref NONE val setOutData = fn str => setData ("out", outData, str) val errData : (string * (string -> string option)) option ref = ref NONE val setErrData = fn str => setData ("err", errData, str) (* Set the stack limit to its max, since mlkit segfaults on some benchmarks * otherwise. *) val _ = let open MLton.Platform.OS in if host = Linux then let open MLton.Rlimit val {hard, ...} = get stackSize in set (stackSize, {hard = hard, soft = hard}) end else () end local open Popt in val res = parse {switches = args, opts = [("args", SpaceString (fn args => runArgs := String.tokens (args, Char.isSpace))), ("err", SpaceString setErrData), ("mlkit", None (fn () => pushCompiler {name = "MLKit", abbrv = "MLKit", main = default_main, test = kitCompile})), ("mosml", None (fn () => pushCompiler {name = "Moscow ML", abbrv = "Moscow ML", main = default_main, test = mosmlCompile})), ("mlton", SpaceString (fn arg => pushCompilers (makeMLton arg))), ("once", trueRef doOnce), ("out", SpaceString setOutData), ("poly", None (fn () => pushCompiler {name = "Poly/ML", abbrv = "Poly/ML", main = (fn bench => concat ["fun main _ = Main.doit ", benchCount bench, "\n"]), test = polyCompile})), ("smlnj", None (fn () => pushCompiler {name = "SML/NJ", abbrv = "SML/NJ", main = default_main, test = njCompile})), trace, ("wiki", trueRef doWiki)]} end in case res of Result.No msg => usage msg | Result.Yes benchmarks => let val compilers = List.rev (!compilers) val base = #abbrv (hd compilers) val _ = let open MLton.Signal in setHandler (Pervasive.Posix.Signal.pipe, Handler.ignore) end fun r2s n r = Real.format (r, Real.Format.fix (SOME n)) val i2s = Int.toCommaString val p2s = i2s o Position.toInt val s2s = fn s => s val failures = ref [] fun show ({compiles, runs, sizes, errs, outs}, {showAll}) = let val out = Out.standard val _ = List.foreach (compilers, fn {name, abbrv, ...} => Out.output (out, concat [abbrv, " -- ", name, "\n"])) val _ = case !failures of [] => () | fs => Out.output (out, concat ["WARNING: ", base, " failed on: ", concat (List.separate (fs, ", ")), "\n"]) fun show (title, data: 'a data, toString, toStringHtml) = let val _ = Out.output (out, concat [title, "\n"]) val compilers = List.fold (compilers, [], fn ({name = n, abbrv = a, ...}, ac) => if showAll orelse List.exists (data, fn {compiler = c', ...} => a = c') then (n, a) :: ac else ac) val benchmarks = List.fold (benchmarks, [], fn (b, ac) => if showAll orelse List.exists (data, fn {bench = b', ...} => b = b') then b :: ac else ac) fun rows toString = ("benchmark" :: List.revMap (compilers, fn (_, a) => a)) :: (List.revMap (benchmarks, fn b => b :: (List.revMap (compilers, fn (_, a) => case (List.peek (data, fn {bench = b', compiler = c', ...} => b = b' andalso a = c')) of NONE => "*" | SOME {value = v, ...} => toString v)))) open Justify val () = outputTable (table {columnHeads = NONE, justs = (Left :: List.revMap (compilers, fn _ => Right)), rows = rows toString}, out) fun prow ns = let fun p s = Out.output (out, s) in case ns of [] => raise Fail "bug" | b :: ns => (p "||" ; p b ; List.foreach (ns, fn n => (p "||"; p n)) ; p "||\n") end val _ = if not (!doWiki) then () else let val rows = rows toStringHtml in prow (hd rows) ; (List.foreach (tl rows, fn [] => raise Fail "bug" | b :: r => let val b = concat ["[attachment:", b, ".sml ", b, "]"] in prow (b :: r) end)) end in () end val bases = List.keepAll (runs, fn {compiler, ...} => compiler = base) val ratios = List.fold (runs, [], fn ({bench, compiler, value}, ac) => if compiler = base andalso not showAll then ac else {bench = bench, compiler = compiler, value = case List.peek (bases, fn {bench = b, ...} => bench = b) of NONE => ~1.0 | SOME {value = v, ...} => value / v} :: ac) val _ = show ("run time ratio", ratios, r2s 2, r2s 1) val _ = show ("size", sizes, p2s, p2s) val _ = show ("compile time", compiles, r2s 2, r2s 2) val _ = show ("run time", runs, r2s 2, r2s 2) val _ = case !outData of NONE => () | SOME (out, _) => show (concat ["out: ", out], outs, s2s, s2s) val _ = case !errData of NONE => () | SOME (err, _) => show (concat ["err: ", err], errs, s2s, s2s) in () end val totalFailures = ref [] val data = List.fold (benchmarks, {compiles = [], runs = [], sizes = [], outs = [], errs = []}, fn (bench, ac) => let val foundOne = ref false val res = List.fold (compilers, ac, fn ({name, abbrv, main, test}, ac as {compiles: real data, runs: real data, sizes: Position.int data, outs: string data, errs: string data}) => if true then let val _ = File.withOut (batch {abbrv = abbrv, bench = bench}, fn out => (File.outputContents (concat [bench, ".sml"], out); Out.output (out, (main bench)))) (* val outTmpFile = File.tempName {prefix = "tmp", suffix = "out"} val errTmpFile = File.tempName {prefix = "tmp", suffix = "err"} *) val {compile, run, size} = ignoreOutput (fn () => test {bench = bench}) val _ = if name = base andalso Option.isNone run then List.push (failures, bench) else () (* val out = case !outData of NONE => NONE | SOME (_, doit) => File.foldLines (outTmpFile, NONE, fn (s, v) => let val s = String.removeTrailing (s, fn c => Char.equals (c, Char.newline)) in case doit s of NONE => v | v => v end) val err = case !errData of NONE => NONE | SOME (_, doit) => File.foldLines (errTmpFile, NONE, fn (s, v) => let val s = String.removeTrailing (s, fn c => Char.equals (c, Char.newline)) in case doit s of NONE => v | v => v end) val _ = File.remove outTmpFile val _ = File.remove errTmpFile *) val out = NONE val err = NONE fun add (v, ac) = case v of NONE => ac | SOME v => (foundOne := true ; {bench = bench, compiler = abbrv, value = v} :: ac) val ac = {compiles = add (compile, compiles), runs = add (run, runs), sizes = add (size, sizes), outs = add (out, outs), errs = add (err, errs)} val _ = show (ac, {showAll = false}) val _ = Out.flush Out.standard in ac end else ac) val _ = if !foundOne then () else List.push (totalFailures, bench) in res end) val _ = show (data, {showAll = true}) val totalFailures = !totalFailures val _ = if List.isEmpty totalFailures then () else (print ("The following benchmarks failed completely.\n") ; List.foreach (totalFailures, fn s => print (concat [s, "\n"]))) in () end end val main = Process.makeMain main end mlton-20210117+dfsg/benchmark/sources.mlb000066400000000000000000000004211416264345000201340ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../lib/mlton/sources.mlb main.sml in structure Main end mlton-20210117+dfsg/benchmark/tests/000077500000000000000000000000001416264345000171225ustar00rootroot00000000000000mlton-20210117+dfsg/benchmark/tests/.gitignore000066400000000000000000000057251416264345000211230ustar00rootroot00000000000000/ML_dbase /PM /a.out /run /chess.ppm /TEST /DLXSimulator /DLXSimulator.*.batch /DLXSimulator.*.batch.sml /DLXSimulator.*-* /barnes-hut /barnes-hut.*.batch /barnes-hut.*.batch.sml /barnes-hut.*-* /boyer /boyer.*.batch /boyer.*.batch.sml /boyer.*-* /checksum /checksum.*.batch /checksum.*.batch.sml /checksum.*-* /count-graphs /count-graphs.*.batch /count-graphs.*.batch.sml /count-graphs.*-* /even-odd /even-odd.*.batch /even-odd.*.batch.sml /even-odd.*-* /fft /fft.*.batch /fft.*.batch.sml /fft.*-* /fib /fib.*.batch /fib.*.batch.sml /fib.*-* /flat-array /flat-array.*.batch /flat-array.*.batch.sml /flat-array.*-* /fxp /fxp.*.batch /fxp.*.batch.sml /fxp.*-* /hamlet /hamlet.*.batch /hamlet.*.batch.sml /hamlet.*-* /imp-for /imp-for.*.batch /imp-for.*.batch.sml /imp-for.*-* /knuth-bendix /knuth-bendix.*.batch /knuth-bendix.*.batch.sml /knuth-bendix.*-* /lexgen /lexgen.*.batch /lexgen.*.batch.sml /lexgen.*-* /life /life.*.batch /life.*.batch.sml /life.*-* /logic /logic.*.batch /logic.*.batch.sml /logic.*-* /mandelbrot /mandelbrot.*.batch /mandelbrot.*.batch.sml /mandelbrot.*-* /matrix-multiply /matrix-multiply.*.batch /matrix-multiply.*.batch.sml /matrix-multiply.*-* /md5 /md5.*.batch /md5.*.batch.sml /md5.*-* /merge /merge.*.batch /merge.*.batch.sml /merge.*-* /mlyacc /mlyacc.*.batch /mlyacc.*.batch.sml /mlyacc.*-* /model-elimination /model-elimination.*.batch /model-elimination.*.batch.sml /model-elimination.*-* /mpuz /mpuz.*.batch /mpuz.*.batch.sml /mpuz.*-* /nucleic /nucleic.*.batch /nucleic.*.batch.sml /nucleic.*-* /output1 /output1.*.batch /output1.*.batch.sml /output1.*-* /peek /peek.*.batch /peek.*.batch.sml /peek.*-* /pidigits /pidigits.*.batch /pidigits.*.batch.sml /pidigits.*-* /psdes-random /psdes-random.*.batch /psdes-random.*.batch.sml /psdes-random.*-* /ratio-regions /ratio-regions.*.batch /ratio-regions.*.batch.sml /ratio-regions.*-* /ray /ray.*.batch /ray.*.batch.sml /ray.*-* /raytrace /raytrace.*.batch /raytrace.*.batch.sml /raytrace.*-* /simple /simple.*.batch /simple.*.batch.sml /simple.*-* /smith-normal-form /smith-normal-form.*.batch /smith-normal-form.*.batch.sml /smith-normal-form.*-* /string-concat /string-concat.*.batch /string-concat.*.batch.sml /string-concat.*-* /tailfib /tailfib.*.batch /tailfib.*.batch.sml /tailfib.*-* /tak /tak.*.batch /tak.*.batch.sml /tak.*-* /tensor /tensor.*.batch /tensor.*.batch.sml /tensor.*-* /tsp /tsp.*.batch /tsp.*.batch.sml /tsp.*-* /tyan /tyan.*.batch /tyan.*.batch.sml /tyan.*-* /vector32-concat /vector32-concat.*.batch /vector32-concat.*.batch.sml /vector32-concat.*-* /vector64-concat /vector64-concat.*.batch /vector64-concat.*.batch.sml /vector64-concat.*-* /vector-rev /vector-rev.*.batch /vector-rev.*.batch.sml /vector-rev.*-* /vliw /vliw.*.batch /vliw.*.batch.sml /vliw.*-* /wc-input1 /wc-input1.*.batch /wc-input1.*.batch.sml /wc-input1.*-* /wc-scanStream /wc-scanStream.*.batch /wc-scanStream.*.batch.sml /wc-scanStream.*-* /zebra /zebra.*.batch /zebra.*.batch.sml /zebra.*-* /zern /zern.*.batch /zern.*.batch.sml /zern.*-* mlton-20210117+dfsg/benchmark/tests/DATA/000077500000000000000000000000001416264345000176335ustar00rootroot00000000000000mlton-20210117+dfsg/benchmark/tests/DATA/.gitignore000066400000000000000000000000771416264345000216270ustar00rootroot00000000000000/ml.lex.sml /ml.grm.desc /ml.grm.sig /ml.grm.sml /cmp.s /tmp.s mlton-20210117+dfsg/benchmark/tests/DATA/hamlet-input.sml000066400000000000000000000005531416264345000227620ustar00rootroot00000000000000datatype t = Z | S of t; val zero = Z; val one = S zero; val two = S one; val rec add: t * t -> t = fn (Z, n) => n | (S m, n) => S (add (m, n)); val rec mul: t * t -> t = fn (Z, n) => Z | (S z, n) => add (n, mul (z, n)); val four = mul (two, two); val rec exp: t * t -> t = fn (n, Z) => one | (n, S m) => mul (n, exp (n, m)); val _ = exp (exp (four, four), two); mlton-20210117+dfsg/benchmark/tests/DATA/ml.grm000066400000000000000000001037701416264345000207620ustar00rootroot00000000000000(* Copyright 1989 by AT&T Bell Laboratories *) open ErrorMsg Symbol Access Basics BasicTypes TypesUtil Absyn open EnvAccess Misc CoreLang Signs Strs TyvarSet fun fire a b c = (a(); b c) fun markexp (e as MARKexp _, _, _) = e | markexp(e,a,b) = if !System.Control.markabsyn then MARKexp(e,a,b) else e fun markdec((d as MARKdec _, e), _, _) = (d,e) | markdec((d,e),a,b) = if !System.Control.markabsyn then (MARKdec(d,a,b),e) else (d,e) fun markdec' d = let val (d,e) = markdec d in ([d],e) end fun markdec'' (([d],e),a,b) = markdec'((d,e),a,b) | markdec'' ((s,e),a,b) = markdec'((SEQdec s, e),a,b) fun markstr(f,a,b) $ = case f $ of s as (MARKstr _,x,y) => s | s as (t,x,y) => if !System.Control.markabsyn then (MARKstr(t,a,b),x,y) else s infix \/ val op \/ = union_tyvars fun V(_,vars) = vars and E(e,_) = e fun sequence (do1,do2) (env,a2,a3,a4) = let val (r1,env1) = do1 (env,a2,a3,a4) val (r2,env2) = do2 (Env.atop(env1,env),a2,a3,a4) in (r1 @ r2, Env.atop(env2,env1)) end fun sequence' (do1,do2) env = let val (r1,env1) = do1 env val (r2,env2) = do2 (Env.atop(env1,env)) in (r1 @ r2, Env.atop(env2,env1)) end fun seqdec (d,e) = ([d],e) %% %term EOF | SEMICOLON | ID of string | TYVAR of string | INT of int | INT0 of int | REAL of string | STRING of string | ABSTRACTION | ABSTYPE | AND | ARROW | AS | BAR | CASE | DATATYPE | DOTDOTDOT | ELSE | END | EQUAL | EQTYPE | EXCEPTION | DO | DOT | DARROW | FN | FUN | FUNCTOR | HANDLE | HASH | IF | IN | INCLUDE | INFIX | INFIXR | LET | LOCAL | NONFIX | OF | OP | OPEN | OVERLOAD | QUERY | RAISE | REC | SHARING | SIG | SIGNATURE | STRUCT | STRUCTURE | THEN | TYPE | VAL | WHILE | WILD | WITH | WITHTYPE | ASTERISK | COLON | COMMA | LBRACE | LBRACKET | LPAREN | RBRACE | RBRACKET | RPAREN | ORELSE | ANDALSO | IMPORT %nonterm ident of string | id of string | int of int | op_op of unit susp | opid of symbol enved | qid of ((string->symbol) -> symbol list) | qid_p0 of symbol list list | selector of symbol | tycon of symbol list | tlabel of (symbol * ty) enved uvars | tlabels of (symbol * ty) list enved uvars | ty' of ty enved uvars | tuple_ty of ty list enved uvars | ty of ty enved uvars | ty0_pc of ty list enved uvars | match of rule list evstamped uvars | rule of rule evstamped uvars | elabel of (symbol * exp) evstamped uvars | elabels of (symbol * exp) list evstamped uvars | exp_ps of exp list evstamped uvars | exp of exp evstamped uvars | app_exp of exp precStack evstamped uvars | aexp of exp evstamped uvars | exp_list of exp list evstamped uvars | exp_2c of exp list evstamped uvars | pat of pat enved uvars | pat' of pat enved uvars | pat'' of pat enved uvars | apat of (pat * fixity * complainer) enved uvars | apat' of (pat * fixity * complainer) enved uvars | apat'' of pat enved uvars | plabel of (symbol * pat) enved uvars | plabels of ((symbol * pat) list * bool) enved uvars | pat_2c of pat list enved uvars | pat_list of pat list enved uvars | vb of vb list evstamped | constraint of ty option enved uvars | rvb of rawrvb list enved | fb' of rawclause list enved uvars | fb of rawclause list list enved uvars | apats of (pat * fixity * complainer) list enved uvars | clause' of (symbol * pat list) enved uvars | clause of rawclause enved uvars | tb of bool -> tb list withenv epathvstamped | tyvars of tyvar list | tyvar_pc of tyvar list | db of (symbol * int * datacon list withenv epathed) list | constrs of (Basics.env * ty -> (symbol * bool * ty) list) uvars | constr of (Basics.env * ty -> symbol * bool * ty) uvars | eb of eb list withenv epathvstamped uvars | qid_p of structureVar list enved | fixity of fixity | ldec of dec withenv epathvstamped uvars | exp_pa of exp list evstamped | ldecs of dec withenv epathvstamped uvars | ops of symbol list | spec_s of spectype | spec of spectype | strspec of spectype | tyspec of eqprop -> spectype | valspec of spectype | exnspec of spectype | sharespec of spectype | patheqn of (string->symbol) -> symbol list list | sign of bool (* toplevel? *) * bool (* functor param? *) * Structure (*param*) -> signtype | sigconstraint_op of (Basics.env * Structure) -> Structure option | sigb of signatureVar list withenv enved | str of strtype | sdecs of dec list withenv epathnstamped | sdecs' of dec list withenv epathnstamped | sdec of dec withenv epathnstamped | strb of bool -> (symbol*structureVar*strb) list epathstamped | fparam of functorFormal | fctb of (symbol * functorVar * fctb) list enved | importdec of string list | interdec of dec withenv enved %pos int %arg (error) : pos * pos -> ErrorMsg.severity -> string -> unit %pure %start interdec %eop EOF SEMICOLON %noshift EOF %nonassoc WITHTYPE %right AND %right ARROW %right AS %right DARROW %left DO %left ELSE %left RAISE %right HANDLE %left ORELSE %left ANDALSO %left COLON %name ML %keyword ABSTRACTION ABSTYPE AND AS CASE DATATYPE DOTDOTDOT ELSE END EQTYPE EXCEPTION DO DARROW FN FUN FUNCTOR HANDLE IF IN INCLUDE INFIX INFIXR LET LOCAL NONFIX OF OP OPEN OVERLOAD RAISE REC SHARING SIG SIGNATURE STRUCT STRUCTURE THEN TYPE VAL WHILE WITH WITHTYPE ORELSE ANDALSO IMPORT %subst EQUAL for DARROW | DARROW for EQUAL | ANDALSO for AND | OF for COLON | COMMA for SEMICOLON | SEMICOLON for COMMA %prefer VAL THEN ELSE LPAREN %value ID ("bogus") %value TYVAR ("'bogus") %value INT (1) %value INT0 (0) %value REAL ("0.0") %value STRING ("") %% int : INT (INT) | INT0 (INT0) id : ID (ID) | ASTERISK ("*") ident : ID (ID) | ASTERISK ("*") | EQUAL ("=") op_op : OP (fn()=> error (OPleft,OPright) WARN "unnecessary `op'") | (fn()=>()) opid : id (fn env => let val (v,f) = var'n'fix id in case lookFIX env f of NONfix => () | _ => error (idleft,idright) COMPLAIN "nonfix identifier required"; v end) | OP ident (fn _ => varSymbol ident) qid : ID DOT qid (fn kind => strSymbol ID :: qid kind) | ident (fn kind => [kind ident]) selector: id (labSymbol id) | INT (Symbol.labSymbol(makestring INT)) tycon : ID DOT tycon (strSymbol ID :: tycon) | ID ([tycSymbol ID]) tlabel : selector COLON ty (fn $ =>(selector, E ty $), V ty) tlabels : tlabel COMMA tlabels (fn $ => E tlabel $ :: E tlabels $, V tlabel \/ V tlabels) | tlabel (fn $ => [E tlabel $], V tlabel) ty' : TYVAR (let val tyv = mkTyvar(mkUBOUND(tyvSymbol TYVAR)) in (fn _ => VARty tyv, singleton_tyvar tyv) end) | LBRACE tlabels RBRACE (fn $ => make_recordTy(E tlabels $, error(LBRACEleft,RBRACEright)), V tlabels) | LBRACE RBRACE (fn _ => make_recordTy(nil, error(LBRACEleft,RBRACEright)), no_tyvars) | LPAREN ty0_pc RPAREN tycon (fn env =>let val ts = E ty0_pc env in CONty(lookPathArTYC env (tycon,length ts, error (tyconleft,tyconright) COMPLAIN), ts) end, V ty0_pc) | LPAREN ty RPAREN (ty) | ty' tycon (fn env =>CONty(lookPathArTYC env (tycon,1, error(tyconleft,tyconright)COMPLAIN), [E ty' env]), V ty') | tycon (fn env =>CONty(lookPathArTYC env (tycon, 0, error(tyconleft,tyconright)COMPLAIN),[]), no_tyvars) tuple_ty : ty' ASTERISK tuple_ty (fn $ => E ty' $ :: E tuple_ty $, V ty' \/ V tuple_ty) | ty' ASTERISK ty' (fn $ =>[E ty'1 $, E ty'2 $], V ty'1 \/ V ty'2) ty : tuple_ty (fn $ =>tupleTy(E tuple_ty $), V tuple_ty) | ty ARROW ty (fn $ =>CONty(arrowTycon, [E ty1 $, E ty2 $]), V ty1 \/ V ty2) | ty' (ty') ty0_pc : ty COMMA ty (fn $ => [E ty1 $, E ty2 $], V ty1 \/ V ty2) | ty COMMA ty0_pc (fn $ => E ty $ :: E ty0_pc $, V ty \/ V ty0_pc) match : rule (fn evst => [E rule evst], V rule) | rule BAR match (fn evst => E rule evst :: E match evst, V rule \/ V match) rule : pat DARROW exp (makeRULE(E pat, fn $ => markexp(E exp $,expleft,expright), error(patleft,patright)), V pat \/ V exp) elabel : selector EQUAL exp (fn evst => (selector,E exp evst), V exp) elabels : elabel COMMA elabels (fn evst => (E elabel evst :: E elabels evst), V elabel \/ V elabels) | elabel (fn evst => [E elabel evst], V elabel) exp_ps : exp (fn st => [E exp st], V exp) | exp SEMICOLON exp_ps (fn st => E exp st :: E exp_ps st, V exp \/ V exp_ps) exp : exp HANDLE match (fn st=> makeHANDLEexp(E exp st, E match st), V exp \/ V match) | exp ORELSE exp (fn st=> ORELSEexp(markexp(E exp1 st, exp1left,exp1right), markexp(E exp2 st,exp2left,expright)), V exp1 \/ V exp2) | exp ANDALSO exp (fn st=> ANDALSOexp(markexp(E exp1 st,exp1left,exp1right), markexp(E exp2 st,exp2left,exp2right)), V exp1 \/ V exp2) | exp COLON ty (fn (st as (env,_,_))=> CONSTRAINTexp(E exp st, E ty env), V exp \/ V ty) | app_exp (fn st=> exp_finish(E app_exp st, error(app_expright,app_expright)), V app_exp) | FN match (fn st=> markexp(FNexp(completeMatch(E match st)), FNleft,matchright), V match) | CASE exp OF match (fn st=>markexp(CASEexp(E exp st, completeMatch(E match st)), CASEleft,matchright), V exp \/ V match) | WHILE exp DO exp (fn st=> WHILEexp(E exp1 st, markexp(E exp2 st,exp2left,exp2right)), V exp1 \/ V exp2) | IF exp THEN exp ELSE exp (fn st=>IFexp(E exp1 st, markexp(E exp2 st,exp2left,exp2right), markexp(E exp3 st,exp3left,exp3right)), V exp1 \/ V exp2 \/ V exp3) | RAISE exp (fn st=>markexp(RAISEexp(E exp st),RAISEleft,expright), V exp) app_exp : aexp (fn st => exp_start(markexp(E aexp st, aexpleft,aexpright), NONfix, error (aexpleft,aexpright)), V aexp) | ident (fn (env,_,_) => let val e = error(identleft,identright) val (v,f) = var'n'fix ident in exp_start(markexp(lookID env (v,e), identleft,identright), lookFIX env f, e) end, no_tyvars) | app_exp aexp (fn st => exp_parse(E app_exp st, markexp(E aexp st, aexpleft,aexpright), NONfix, error (aexpleft,aexpright)), V app_exp \/ V aexp) | app_exp ident (fn (st as (env,_,_)) => let val e = error(identleft,identright) val (v,f) = var'n'fix ident in exp_parse(E app_exp st, markexp(lookID env (v,e), identleft,identright), lookFIX env f, e) end, V app_exp) aexp : OP ident (fn (env,_,_) => lookID env (varSymbol ident, error(identleft,identright)), no_tyvars) | ID DOT qid (fn (env,_,_) => varcon(lookPathVARCON env (strSymbol ID ::(qid varSymbol), error(IDleft,qidright)COMPLAIN)), no_tyvars) | int (fn st => INTexp int, no_tyvars) | REAL (fn st => REALexp REAL, no_tyvars) | STRING (fn st => STRINGexp STRING, no_tyvars) | HASH selector (fn st => SELECTORexp selector, no_tyvars) | LBRACE elabels RBRACE (fn st=> makeRECORDexp(E elabels st, error(LBRACEleft,RBRACEright)), V elabels) | LBRACE RBRACE (fn st=> RECORDexp nil, no_tyvars) | LPAREN RPAREN (fn st=> unitExp, no_tyvars) | LPAREN exp_ps RPAREN (fn st=> SEQexp(E exp_ps st), V exp_ps) | LPAREN exp_2c RPAREN (fn st=> TUPLEexp(E exp_2c st), V exp_2c) | LBRACKET exp_list RBRACKET (fn st=> LISTexp(E exp_list st), V exp_list) | LBRACKET RBRACKET (fn st=> nilExp, no_tyvars) | LET ldecs IN exp_ps END (fn (env,tv,st) => let val (d,env') = E ldecs(env,[],tv,st) val e = E exp_ps (Env.atop(env',env),tv,st) in markexp(LETexp(d,SEQexp e), LETleft,ENDright) end, V exp_ps \/ V ldecs) exp_2c : exp COMMA exp_2c (fn st=> E exp st :: E exp_2c st, V exp \/ V exp_2c) | exp COMMA exp (fn st=> [E exp1 st, E exp2 st], V exp1 \/ V exp2) exp_list : exp (fn st=> [E exp st], V exp) | exp COMMA exp_list (fn st=> E exp st :: E exp_list st, V exp \/ V exp_list) pat : pat' (pat') | apat apats (fn $ => make_app_pat(E apat $ ::E apats $), V apat \/ V apats) pat' : pat AS pat (fn $ => layered(E pat1 $, E pat2 $, error(pat1left,pat1right)), V pat1 \/ V pat2) | pat'' (pat'') pat'' : apat apats COLON ty (fn env => CONSTRAINTpat( make_app_pat(E apat env ::E apats env), E ty env), V apat \/ V apats \/ V ty) | pat'' COLON ty (fn env => CONSTRAINTpat(E pat'' env, E ty env), V pat'' \/ V ty) apat : apat' (apat') | LPAREN pat RPAREN (fn $ =>(E pat $,NONfix,error(LPARENleft,RPARENright)), V pat) apat' : apat'' (fn $ =>(E apat'' $,NONfix,error(apat''left,apat''right)), V apat'') | id (fn env => let val e = error(idleft,idright) val (v,f) = var'n'fix id in (pat_id env v, lookFIX env f, e) end, no_tyvars) | LPAREN RPAREN (fn _ =>(unitPat,NONfix, error(LPARENleft,RPARENright)), no_tyvars) | LPAREN pat COMMA pat_list RPAREN (fn $ =>(TUPLEpat(E pat $ ::E pat_list $), NONfix,error(LPARENleft,RPARENright)), V pat \/ V pat_list) apat'' : OP ident (fn env =>pat_id env(varSymbol ident), no_tyvars) | ID DOT qid (fn env =>qid_pat env (strSymbol ID :: qid varSymbol, error(IDleft,qidright)), no_tyvars) | int (fn _ =>INTpat int, no_tyvars) | REAL (fn _ =>REALpat REAL, no_tyvars) | STRING (fn _ =>STRINGpat STRING, no_tyvars) | WILD (fn _ =>WILDpat, no_tyvars) | LBRACKET RBRACKET (fn _ =>LISTpat nil, no_tyvars) | LBRACKET pat_list RBRACKET (fn $ =>LISTpat(E pat_list $), V pat_list) | LBRACE RBRACE (fn _ =>makeRECORDpat((nil,false), error(LBRACEleft,RBRACEright)), no_tyvars) | LBRACE plabels RBRACE (fn $ =>makeRECORDpat(E plabels $, error(LBRACEleft,RBRACEright)), V plabels) plabel : selector EQUAL pat (fn $ => (selector,E pat $), V pat) | ID (fn env => (labSymbol ID, pat_id env(varSymbol ID)), no_tyvars) | ID AS pat (fn env => (labSymbol ID, LAYEREDpat(pat_id env (varSymbol ID), E pat env)), V pat) | ID COLON ty (fn env => (labSymbol ID, CONSTRAINTpat(pat_id env (varSymbol ID), E ty env)), V ty) | ID COLON ty AS pat (fn env => (labSymbol ID, LAYEREDpat(CONSTRAINTpat( pat_id env (varSymbol ID), E ty env), E pat env)), V ty \/ V pat) plabels : plabel COMMA plabels (fn $ =>let val (a,(b,fx))=(E plabel $,E plabels $) in (a::b, fx) end, V plabel \/ V plabels) | plabel (fn $ => ([E plabel $],false), V plabel) | DOTDOTDOT (fn _ => (nil, true), no_tyvars) pat_list: pat (fn $ => [E pat $], V pat) | pat COMMA pat_list (fn $ => E pat $ :: E pat_list $, V pat \/ V pat_list) vb : vb AND vb (fn st=> vb1 st @ vb2 st) | pat EQUAL exp (valbind(pat, exp)) constraint : (fn _ =>NONE, no_tyvars) | COLON ty (fn env =>SOME(E ty env), V ty) rvb : opid constraint EQUAL FN match (fn env =>[{name=opid env, ty=constraint,match=match}]) | rvb AND rvb (fn env => (rvb1 env) @ (rvb2 env)) fb' : clause (fn $ =>[E clause $], V clause) | clause BAR fb' (fn $ =>E clause $ ::E fb' $, V clause \/ V fb') fb : fb' (fn $ => [checkFB(E fb' $,error(fb'left,fb'right))], V fb') | fb' AND fb (fn $ => checkFB(E fb' $,error(fb'left,fb'right)) :: E fb $, V fb' \/ V fb) clause' : LPAREN apat apats RPAREN apats (fn $ =>makecl(E apat $ ::E apats1 $,E apats2 $), V apat \/ V apats1 \/ V apats2) | LPAREN pat' RPAREN apats (fn $ =>makecl([],(E pat' $,NONfix, error(LPARENleft,RPARENright)) ::E apats $), V pat' \/ V apats) | apat' apats (fn $ =>makecl([],E apat' $ ::E apats $), V apat' \/ V apats) apats : (fn _ =>nil, no_tyvars) | apat apats (fn $ => E apat $ ::E apats $, V apat \/ V apats) clause : clause' constraint EQUAL exp (fn env => let val (id,pats) = E clause' env in {name=id,pats=pats, resultty=E constraint env, exp=fn $ => markexp(E exp $,expleft,expright), err=error(clause'left,clause'right)} end, V clause' \/ V constraint \/ V exp) tb : tyvars ID EQUAL ty (makeTB(tyvars, tycSymbol ID, ty, error(tyleft,tyright))) | tb AND tb (fn nw => sequence(tb1 nw,tb2 nw)) tyvars : TYVAR ([mkTyvar(mkUBOUND(tyvSymbol TYVAR))]) | LPAREN tyvar_pc RPAREN (checkUniq(error(tyvar_pcleft,tyvar_pcright), "duplicate type variable") (List.map(fn ref(UBOUND{name,...})=>name) tyvar_pc); tyvar_pc) | (nil) tyvar_pc: TYVAR ([mkTyvar(mkUBOUND(tyvSymbol TYVAR))]) | TYVAR COMMA tyvar_pc (mkTyvar(mkUBOUND(tyvSymbol TYVAR)) :: tyvar_pc) db : db AND db (db1 @ db2) | tyvars ident EQUAL constrs (let val name = tycSymbol ident in [(name,length tyvars, makeDB'(tyvars,name,constrs, error(constrsleft,constrsright)))] end) constrs : constr (fn $ => [E constr $], V constr) | constr BAR constrs (fn $ => E constr $ :: E constrs $, V constr \/ V constrs) constr : op_op ident (fire op_op (fn(_,t)=> (varSymbol ident,true,t)), no_tyvars) | op_op ident OF ty (fire op_op (fn(env,t)=> (varSymbol ident,false, CONty(arrowTycon,[E ty env, t]))), V ty) eb : op_op ident (fire op_op (makeEB(varSymbol ident)), no_tyvars) | op_op ident OF ty (fire op_op (makeEBof(varSymbol ident,E ty, error(tyleft,tyright))), V ty) | op_op ident EQUAL qid (fire op_op (makeEBeq(varSymbol ident,qid varSymbol, error(qidleft,qidright))), no_tyvars) | eb AND eb (sequence(E eb1,E eb2), V eb1 \/ V eb2) qid_p0 : qid ([qid strSymbol]) | qid qid_p0 (qid strSymbol :: qid_p0) qid_p : qid (fn env => [getSTRpath env (qid strSymbol,error(qidleft,qidright))]) | qid qid_p (fn env => getSTRpath env (qid strSymbol,error(qidleft,qidright)) :: qid_p env) fixity : INFIX (infixleft 0) | INFIX int (infixleft int) | INFIXR (infixright 0) | INFIXR int (infixright int) | NONFIX (NONfix) ldec : VAL vb (makeVALdec(vb,error(vbleft,vbright)), no_tyvars) | VAL REC rvb (makeVALRECdec (rvb,error(rvbleft,rvbright)), no_tyvars) | FUN fb (makeFUNdec fb, no_tyvars) | TYPE tb ((fn $ => makeTYPEdec(tb true $, error(tbleft,tbright))), no_tyvars) | DATATYPE db (makeDB(db, nullTB), no_tyvars) | DATATYPE db WITHTYPE tb (makeDB(db,tb), no_tyvars) | ABSTYPE db WITH ldecs END (makeABSTYPEdec(db,nullTB,E ldecs),V ldecs) | ABSTYPE db WITHTYPE tb WITH ldecs END (makeABSTYPEdec(db,tb,E ldecs),V ldecs) | EXCEPTION eb ((fn $ => makeEXCEPTIONdec(E eb $, error(ebleft,ebright))), V eb) | OPEN qid_p (makeOPENdec qid_p, no_tyvars) | fixity ops (makeFIXdec(fixity,ops), no_tyvars) | OVERLOAD ident COLON ty AS exp_pa (makeOVERLOADdec(varSymbol ident,ty,exp_pa), no_tyvars) exp_pa : exp (fn st => [E exp st]) | exp AND exp_pa (fn st => E exp st :: exp_pa st) ldecs : (fn $ => (SEQdec nil,Env.empty), no_tyvars) | ldec ldecs (makeSEQdec(fn $ => markdec(E ldec $,ldecleft,ldecright), E ldecs), V ldec \/ V ldecs) | SEMICOLON ldecs (ldecs) | LOCAL ldecs IN ldecs END ldecs (makeSEQdec(fn $ => markdec(makeLOCALdec(E ldecs1,E ldecs2) $, LOCALleft,ENDright), E ldecs3), V ldecs1 \/ V ldecs2 \/ V ldecs3) ops : ident ([fixSymbol ident]) | ident ops (fixSymbol ident :: ops) spec_s : (fn $ => nil) | spec spec_s (fn $ => spec $ @ spec_s $) | SEMICOLON spec_s (spec_s) spec : STRUCTURE strspec (strspec) | DATATYPE db (make_dtyspec db) | TYPE tyspec (tyspec UNDEF) | EQTYPE tyspec (tyspec YES) | VAL valspec (valspec) | EXCEPTION exnspec (exnspec) | fixity ops (make_fixityspec(fixity,ops)) | SHARING sharespec (sharespec) | OPEN qid_p0 (make_openspec(qid_p0, error(OPENleft,qid_p0right))) | LOCAL spec_s IN spec_s END (fn $ => (spec_s1 $; error(spec_s1left,spec_s1right) WARN "LOCAL specs are only partially implemented"; spec_s2 $)) | INCLUDE ident (make_includespec (sigSymbol ident,error(identleft,identright))) strspec : strspec AND strspec (fn $ => strspec1 $ @ strspec2 $) | ident COLON sign (make_strspec(strSymbol ident, sign(false,false,NULLstr))) tyspec : tyspec AND tyspec (fn eq => fn $ => tyspec1 eq $ @ tyspec2 eq $) | tyvars ID (fn eq => make_tyspec(eq,tyvars,tycSymbol ID, error(tyvarsleft,IDright))) valspec : valspec AND valspec (fn $ => valspec1 $ @ valspec2 $) | op_op ident COLON ty (fire op_op (make_valspec(varSymbol ident,ty))) exnspec : exnspec AND exnspec (fn $ => exnspec1 $ @ exnspec2 $) | ident (make_exnspec(varSymbol ident)) | ident OF ty (make_exnspecOF (varSymbol ident,ty)) sharespec: sharespec AND sharespec (fn $ => sharespec1 $ @ sharespec2 $) | TYPE patheqn (make_type_sharespec(patheqn tycSymbol)) | patheqn (make_str_sharespec(patheqn strSymbol)) patheqn: qid EQUAL qid (fn kind => [qid1 kind, qid2 kind]) | qid EQUAL patheqn (fn kind => qid kind :: patheqn kind) sign : ID (makeSIGid(sigSymbol ID,error(IDleft,IDright))) | SIG spec_s END (makeSIG(spec_s,error(spec_sleft,spec_sright))) sigconstraint_op : (fn _ => NONE) | COLON sign (fn (env,param) => SOME(sign(true,false,param) (env,Stampset.newStampsets()))) sigb : sigb AND sigb (sequence'(sigb1,sigb2)) | ident EQUAL sign (make_sigb(sigSymbol ident, sign(true,false,NULLstr))) str : qid (markstr(make_str_qid(qid strSymbol, error(qidleft,qidright)),qidleft,qidright)) | STRUCT sdecs END (markstr(make_str_struct(sdecs, error(STRUCTleft,ENDright)), STRUCTleft,ENDright)) | ID LPAREN sdecs RPAREN (markstr(make_str_app(fctSymbol ID,error(IDleft,IDright), (fn $ => let val (s,s')=spread_args sdecs $ in (MARKstr(s,sdecsleft,sdecsright) ,s') end)),IDleft,RPARENright)) | ID LPAREN str RPAREN (markstr(make_str_app(fctSymbol ID,error(IDleft,IDright), single_arg str),IDleft,RPARENright)) | LET sdecs IN str END (markstr(make_str_let(sdecs,str),LETleft,ENDright)) sdecs : sdec sdecs (sequence(fn $ => markdec'(sdec $,sdecleft, sdecright), sdecs)) | SEMICOLON sdecs (sdecs) | LOCAL sdecs IN sdecs END sdecs (sequence(fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $,LOCALleft,ENDright), sdecs3)) | (fn $ => (nil,Env.empty)) sdecs' : sdec sdecs' (sequence(fn $ => markdec'(sdec $,sdecleft,sdecright), sdecs')) | LOCAL sdecs IN sdecs END sdecs' (sequence(fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $, LOCALleft,ENDright), sdecs')) | LOCAL sdecs IN sdecs END (fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $,LOCALleft,ENDright)) | sdec (fn $ => seqdec(markdec(sdec $,sdecleft,sdecright))) sdec : STRUCTURE strb (makeSTRBs(strb false)) | ABSTRACTION strb (makeSTRBs(strb true)) | SIGNATURE sigb (makeSIGdec(sigb,error(SIGNATUREleft,sigbright))) | FUNCTOR fctb (makeFCTdec(fctb,error(FUNCTORleft,fctbright))) | ldec (fn (env,pa,top,st) => let val (dec,env') = markdec(E ldec(env,pa,no_tyvars,st),ldecleft,ldecright) in Typecheck.decType(Env.atop(env',env),dec,top,error, (ldecleft,ldecright)); (dec,env') end) strb : ident sigconstraint_op EQUAL str (makeSTRB(strSymbol ident,sigconstraint_op,str, error(sigconstraint_opleft,sigconstraint_opright))) | strb AND strb (fn a => fn $ => strb1 a $ @ strb2 a $) fparam : ID COLON sign (single_formal(strSymbol ID, sign(true,true,NULLstr))) | spec_s (spread_formal(spec_s, error(spec_sleft,spec_sright))) fctb : ident LPAREN fparam RPAREN sigconstraint_op EQUAL str (makeFCTB(fctSymbol ident,fparam, sigconstraint_op,str, error(strleft,strright))) | fctb AND fctb (fn $ => fctb1 $ @ fctb2 $) importdec: STRING ([STRING]) | STRING importdec (STRING :: importdec) interdec: sdecs' (fn env=> let val (s,e)= sdecs'(env,[],true,Stampset.globalStamps) in markdec((SEQdec s,e),sdecs'left,sdecs'right) end) | IMPORT importdec (fn env =>(IMPORTdec importdec,env)) | exp (fn env=>markdec(toplevelexp(env,exp,error,(expleft,expright)), expleft,expright)) mlton-20210117+dfsg/benchmark/tests/DATA/ml.lex000066400000000000000000000220001416264345000207470ustar00rootroot00000000000000(* Copyright 1989 by AT&T Bell Laboratories *) open ErrorMsg type svalue = Tokens.svalue type pos = int type lexresult = (svalue,pos) Tokens.token type lexarg = {comLevel : int ref, lineNum : int ref, linePos : int list ref, (* offsets of lines in file *) charlist : string list ref, stringstart : int ref, (* start of current string or comment*) err : pos*pos -> ErrorMsg.severity -> string->unit} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token val eof = fn ({comLevel,err,linePos,stringstart,lineNum,charlist}:lexarg) => let val pos = Integer.max(!stringstart+2, hd(!linePos)) in if !comLevel>0 then err (!stringstart,pos) COMPLAIN "unclosed comment" else (); Tokens.EOF(pos,pos) end fun addString (charlist,s:string) = charlist := s :: (!charlist) fun makeString charlist = (implode(rev(!charlist)) before charlist := nil) fun makeHexInt sign s = let fun digit d = if (d < Ascii.uc_a) then (d - Ascii.zero) else (10 + (if (d < Ascii.lc_a) then (d - Ascii.uc_a) else (d - Ascii.lc_a))) in revfold (fn (c,a) => sign(a*16, digit(ord c))) (explode s) 0 end fun makeInt sign s = revfold (fn (c,a) => sign(a*10, ord c - Ascii.zero)) (explode s) 0 %% %s A S F; %header (functor MLLexFun(structure Tokens : ML_TOKENS)); %arg ({comLevel,lineNum,err,linePos,charlist,stringstart}); idchars=[A-Za-z'_0-9]; id=[A-Za-z'_]{idchars}*; ws=("\012"|[\t\ ])*; sym=[!%&$+/:<=>?@~|#*`]|\\|\-|\^; num=[0-9]+; frac="."{num}; exp="E"(~?){num}; real=(~?)(({num}{frac}?{exp})|({num}{frac}{exp}?)); hexnum=[0-9a-fA-F]+; %% {ws} => (continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); "*" => (Tokens.ASTERISK(yypos,yypos+1)); "|" => (Tokens.BAR(yypos,yypos+1)); ":" => (Tokens.COLON(yypos,yypos+1)); "=" => (Tokens.EQUAL(yypos,yypos+1)); "_" => (Tokens.WILD(yypos,yypos+1)); "#" => (Tokens.HASH(yypos,yypos+1)); "," => (Tokens.COMMA(yypos,yypos+1)); "{" => (Tokens.LBRACE(yypos,yypos+1)); "}" => (Tokens.RBRACE(yypos,yypos+1)); "[" => (Tokens.LBRACKET(yypos,yypos+1)); "]" => (Tokens.RBRACKET(yypos,yypos+1)); ";" => (Tokens.SEMICOLON(yypos,yypos+1)); "(" => (Tokens.LPAREN(yypos,yypos+1)); ")" => (Tokens.RPAREN(yypos,yypos+1)); "and" => (Tokens.AND(yypos,yypos+3)); "abstraction" => (Tokens.ABSTRACTION(yypos,yypos+11)); "abstype" => (Tokens.ABSTYPE(yypos,yypos+7)); "->" => (Tokens.ARROW(yypos,yypos+2)); "as" => (Tokens.AS(yypos,yypos+2)); "case" => (Tokens.CASE(yypos,yypos+4)); "datatype" => (Tokens.DATATYPE(yypos,yypos+8)); "." => (Tokens.DOT(yypos,yypos+1)); "..." => (Tokens.DOTDOTDOT(yypos,yypos+3)); "else" => (Tokens.ELSE(yypos,yypos+4)); "end" => (Tokens.END(yypos,yypos+3)); "eqtype" => (Tokens.EQTYPE(yypos,yypos+6)); "exception" => (Tokens.EXCEPTION(yypos,yypos+9)); "do" => (Tokens.DO(yypos,yypos+2)); "=>" => (Tokens.DARROW(yypos,yypos+2)); "fn" => (Tokens.FN(yypos,yypos+2)); "fun" => (Tokens.FUN(yypos,yypos+3)); "functor" => (Tokens.FUNCTOR(yypos,yypos+7)); "handle" => (Tokens.HANDLE(yypos,yypos+6)); "if" => (Tokens.IF(yypos,yypos+2)); "in" => (Tokens.IN(yypos,yypos+2)); "include" => (Tokens.INCLUDE(yypos,yypos+7)); "infix" => (Tokens.INFIX(yypos,yypos+5)); "infixr" => (Tokens.INFIXR(yypos,yypos+6)); "let" => (Tokens.LET(yypos,yypos+3)); "local" => (Tokens.LOCAL(yypos,yypos+5)); "nonfix" => (Tokens.NONFIX(yypos,yypos+6)); "of" => (Tokens.OF(yypos,yypos+2)); "op" => (Tokens.OP(yypos,yypos+2)); "open" => (Tokens.OPEN(yypos,yypos+4)); "overload" => (Tokens.OVERLOAD(yypos,yypos+8)); "raise" => (Tokens.RAISE(yypos,yypos+5)); "rec" => (Tokens.REC(yypos,yypos+3)); "sharing" => (Tokens.SHARING(yypos,yypos+7)); "sig" => (Tokens.SIG(yypos,yypos+3)); "signature" => (Tokens.SIGNATURE(yypos,yypos+9)); "struct" => (Tokens.STRUCT(yypos,yypos+6)); "structure" => (Tokens.STRUCTURE(yypos,yypos+9)); "then" => (Tokens.THEN(yypos,yypos+4)); "type" => (Tokens.TYPE(yypos,yypos+4)); "val" => (Tokens.VAL(yypos,yypos+3)); "while" => (Tokens.WHILE(yypos,yypos+5)); "with" => (Tokens.WITH(yypos,yypos+4)); "withtype" => (Tokens.WITHTYPE(yypos,yypos+8)); "orelse" => (Tokens.ORELSE(yypos,yypos+6)); "andalso" => (Tokens.ANDALSO(yypos,yypos+7)); "import" => (Tokens.IMPORT(yypos,yypos+6)); "'"{idchars}* => (Tokens.TYVAR(yytext, yypos, yypos+size yytext)); ({sym}+|{id}) => (Tokens.ID(yytext, yypos, yypos+size yytext)); {real} => (Tokens.REAL(yytext,yypos,yypos+size yytext)); [1-9][0-9]* => (Tokens.INT(makeInt (op +) yytext handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 1), yypos,yypos+size yytext)); {num} => (Tokens.INT0(makeInt (op +) yytext handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos,yypos+size yytext)); ~{num} => (Tokens.INT0(makeInt (op -) (substring(yytext,1,size(yytext)-1)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos,yypos+size yytext)); "0x"{hexnum} => ( Tokens.INT0(makeHexInt (op +) (substring(yytext, 2, size(yytext)-2)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos, yypos+size yytext)); "~0x"{hexnum} => ( Tokens.INT0(makeHexInt (op -) (substring(yytext, 3, size(yytext)-3)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos, yypos+size yytext)); \" => (charlist := [""]; stringstart := yypos; YYBEGIN S; continue()); "(*" => (YYBEGIN A; stringstart := yypos; comLevel := 1; continue()); \h => (err (yypos,yypos) COMPLAIN "non-Ascii character"; continue()); . => (err (yypos,yypos) COMPLAIN "illegal token"; continue()); "(*" => (inc comLevel; continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); "*)" => (dec comLevel; if !comLevel=0 then YYBEGIN INITIAL else (); continue()); . => (continue()); \" => (YYBEGIN INITIAL; Tokens.STRING(makeString charlist, !stringstart,yypos+1)); \n => (err (!stringstart,yypos) COMPLAIN "unclosed string"; inc lineNum; linePos := yypos :: !linePos; YYBEGIN INITIAL; Tokens.STRING(makeString charlist,!stringstart,yypos)); [^"\\\n]* => (addString(charlist,yytext); continue()); \\\n => (inc lineNum; linePos := yypos :: !linePos; YYBEGIN F; continue()); \\[\ \t] => (YYBEGIN F; continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); {ws} => (continue()); \\ => (YYBEGIN S; stringstart := yypos; continue()); . => (err (!stringstart,yypos) COMPLAIN "unclosed string"; YYBEGIN INITIAL; Tokens.STRING(makeString charlist,!stringstart,yypos+1)); \\t => (addString(charlist,"\t"); continue()); \\n => (addString(charlist,"\n"); continue()); \\\\ => (addString(charlist,"\\"); continue()); \\\" => (addString(charlist,chr(Ascii.dquote)); continue()); \\\^[@-_] => (addString(charlist,chr(ordof(yytext,2)-ord("@"))); continue()); \\[0-9]{3} => (let val x = ordof(yytext,1)*100 +ordof(yytext,2)*10 +ordof(yytext,3) -(Ascii.zero*111) in (if x>255 then err (yypos,yypos+4) COMPLAIN "illegal ascii escape" else addString(charlist,chr x); continue()) end); \\ => (err (yypos,yypos+1) COMPLAIN "illegal string escape"; continue()); mlton-20210117+dfsg/benchmark/tests/DATA/ndotprod.s000066400000000000000000000112471416264345000216550ustar00rootroot00000000000000ARITHI new_allocptr/R1 := zero/R0 iadd 257 LABEL v/L0: ( zero/R0 allocptr/R1 exnhandler/R2 std_closure/R3 std_arg/R4 std_cont/R5 ) GETLAB v/R6 := v/L4 STORE M[ allocptr/R1 + 0 ] := v/R6 STORE M[ allocptr/R1 + 1 ] := std_cont/R5 ARITHI closure/R5 := allocptr/R1 iadd 0 ARITHI int10/R8 := zero/R0 iadd 10 GETREAL real3.0/R9 := 3.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 2 BRANCH IF zero/R0 ieq zero/R0 GOTO array/L1 ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) LABEL array/L1: ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) STORE M[ allocptr/R1 + 0 ] := n/R8 ARITH new_allocptr/R1 := n/R8 iadd allocptr/R1 ARITH arr/R4 := allocptr/R1 isub n/R8 BRANCH IF zero/R0 ige n/R8 GOTO else/L8 ( zero/R0 allocptr/R1 exnhandler/R2 arr/R4 v/R5 ) GETLAB v/R6 := v/L3 STORE M[ allocptr/R1 + 1 ] := v/R6 STORE M[ allocptr/R1 + 2 ] := arr/R4 STORE M[ allocptr/R1 + 3 ] := v/R5 ARITHI closure/R5 := allocptr/R1 iadd 1 STORE M[ arr/R4 + 1 ] := v/R9 ARITHI int1/R6 := zero/R0 iadd 1 ARITHI new_allocptr/R1 := allocptr/R1 iadd 4 BRANCH IF zero/R0 ieq zero/R0 GOTO g/L2 ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) LABEL else/L8: ( zero/R0 allocptr/R1 exnhandler/R2 arr/R4 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] ARITHI new_allocptr/R1 := allocptr/R1 iadd 1 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL g/L2: ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) BRANCH IF i/R6 ige n/R8 GOTO else/L9 ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) ARITH x/R7 := arr/R4 iadd i/R6 STORE M[ x/R7 + 1 ] := v/R9 ARITHI i/R6 := i/R6 iadd 1 BRANCH IF i/R6 ige n/R8 GOTO else/L10 ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) ARITH x/R7 := arr/R4 iadd i/R6 STORE M[ x/R7 + 1 ] := v/R9 ARITHI i/R6 := i/R6 iadd 1 BRANCH IF zero/R0 ieq zero/R0 GOTO g/L2 ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) LABEL else/L10: ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] MOVE std_arg/R4 := zero/R0 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL else/L9: ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] MOVE std_arg/R4 := zero/R0 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L3: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) FETCHi arr/R4 := M[ std_cont/R5 + 1 ] FETCHi v/R5 := M[ std_cont/R5 + 2 ] FETCHi v/R6 := M[ v/R5 + 0 ] JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L4: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) GETLAB v/R6 := v/L5 STORE M[ allocptr/R1 + 0 ] := v/R6 FETCHi x/R6 := M[ std_cont/R5 + 1 ] STORE M[ allocptr/R1 + 1 ] := x/R6 STORE M[ allocptr/R1 + 2 ] := std_arg/R4 ARITHI closure/R5 := allocptr/R1 iadd 0 ARITHI int10/R8 := zero/R0 iadd 10 GETREAL real4.0/R9 := 4.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 3 BRANCH IF zero/R0 ieq zero/R0 GOTO array/L1 ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) LABEL v/L5: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) GETLAB v/R6 := v/L7 STORE M[ allocptr/R1 + 0 ] := v/R6 FETCHi x/R6 := M[ std_cont/R5 + 1 ] STORE M[ allocptr/R1 + 1 ] := x/R6 ARITHI closure/R11 := allocptr/R1 iadd 0 GETREAL real0.0/R10 := 0.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 2 MOVE k/R8 := zero/R0 BRANCH IF zero/R0 ieq zero/R0 GOTO f/L6 ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) LABEL f/L6: ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) ARITHI int10/R6 := zero/R0 iadd 10 BRANCH IF k/R8 ige int10/R6 GOTO else/L11 ( zero/R0 allocptr/R1 exnhandler/R2 v/R11 Q/R10 ) ARITHI v/R9 := k/R8 iadd 1 FETCHi Z1/R6 := M[ closure/R5 + 2 ] ARITH x/R6 := Z1/R6 iadd k/R8 FETCHm v/R7 := M[ x/R6 + 1 ] ARITH x/R6 := X1/R4 iadd k/R8 FETCHm v/R6 := M[ x/R6 + 1 ] ARITH v/R6 := v/R7 fmul v/R6 ARITH v/R10 := Q/R10 fadd v/R6 MOVE k/R8 := v/R9 BRANCH IF zero/R0 ieq zero/R0 GOTO f/L6 ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) LABEL else/L11: ( zero/R0 allocptr/R1 exnhandler/R2 v/R11 Q/R10 ) FETCHi v/R6 := M[ v/R11 + 0 ] MOVE std_cont/R5 := v/R11 MOVE std_arg/R4 := Q/R10 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L7: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) STORE M[ allocptr/R1 + 0 ] := std_arg/R4 ARITHI S/R4 := allocptr/R1 iadd 0 FETCHi v/R5 := M[ std_cont/R5 + 1 ] FETCHi v/R6 := M[ v/R5 + 0 ] ARITHI new_allocptr/R1 := allocptr/R1 iadd 1 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) mlton-20210117+dfsg/benchmark/tests/DATA/ray000066400000000000000000000000631416264345000203500ustar00rootroot00000000000000100 0 0 0 8 8 8 color sphere /./TEST raytrace stop mlton-20210117+dfsg/benchmark/tests/DLXSimulator.sml000066400000000000000000003500051416264345000221710ustar00rootroot00000000000000(* More tweaks by Matthew Fluet (Matthew.Fluet@gmail.com) on 2017-12-06 to * generalize implementation of I/O instructions and only output the * last run of each DLX program in the benchmark. *) (* Minor tweaks by Stephen Weeks (sweeks@sweeks.com) on 2001-07-17 to turn into a * benchmark. * Added rand function. *) (* * Matthew Thomas Fluet * Harvey Mudd College * Claremont, CA 91711 * e-mail: Matthew_Fluet@hmc.edu * * A DLX Simulator in Standard ML * * Description: * The DLX Simulator is a partial implementation of the RISC instruction * set described in Patterson's and Hennessy's _Computer Architecture_. * Currently, the DLX Simulator implements the following instructions: * ADD ADDI * ADDU ADDUI * SUB SUBI * SUBU SUBUI * AND ANDI * OR ORI * XOR XORI * * LHI * * SLL SLLI * SRL SRLI * SRA SRAI * * SEQ SEQI * SNE SNEI * SLT SLTI * SGT SGTI * SLE SLEI * SGE SGEI * * LB LBU SB * LH LHU SH * LW SW * * BEQZ BNEZ * J JR * JAL JALR * * TRAP * * NOP * * Currently, the DLX Simulator uses 32 bit words for addressing and * the register file and a 65535 word memory. To augment the memory * a cache can be installed in the simulator, with a number of different * caching options that can be made. Caches can also cache other caches, * so realistic dual level caches can be simulated. Input and output * is limited to requesting and outputing signed integers. * * Usage: * DLXSimulatorCX.run_file : string -> unit * DLXSimulatorCX.run_prog : string list -> unit; * The DLXSimualatorCX family of structures represent different caches * used on the simulator. The following table describes the different * caches used: * C1: a small level 1 cache * DLXSimulatorCX.run_file attempts to open and execute the instructions * in a file. DLXSimulatorCX.run_prog runs a set of instructions as * a list of strings. Four programs are included here. * Simple : simply outputs the number 42. * Twos: performs the twos complement on an inputed number. * Abs: performs the absolute value on an imputed number. * Fact: performs the factorial on an inputed number. * GCD: performs the greatest common divisor on two imputed numbers. * After running, the DLX Simulator outputs a set of statistics * concerning memory reads and writes, and cache hits and misses. * * Future Work: * With the implementation of the PACK_REAL structures * as documented in the SML'97 Basis Library, the remainder * of the DLX instruction set should be implemented. * Currently, without an efficient and correct means of * converting a 32 bit word into a 32 bit float, it is * difficult to incorporate these instructions. * In order to finish following the current development * model, a FPALU structure should be implemented as the * floating point arithmetic-logic unit. * Another possibility for future work would be to * model a pipelined processor. Currently, the DLX Simulator * uses a simple one cycle per instruction model. * It should be possible to break this model and implement * a pipeline, but it would mean a major reworking of the * DLXSimulatorFun functor. * * References: * Patterson, David A. and John L. Hennessy. _Computer Architecture: A * Quantitative Approach: Second Edition_. San Francisco: Morgan * Kaufmann Publishers, Inc., 1996. * *) (* ************************************************************************* *) (* sweeks added rand *) local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end end (* * ImmArray.sml * * The ImmArray structure defines an immutable array implementation. * An immarray is stored internally as a list. * This results in O(n) sub and update functions, as opposed * to O(1) sub and update functions found in Array. However, * immutable arrays are truly immutable, and can be integrated * with a functionally programming style easier than mutable * arrays. * * The ImmArray structure mimics the Array structure as much as possible. * The most obvious deviation is that unit return types in Array are replaced * by 'a immarray return types in ImmArray. Unlike an 'a array, an 'a immarray * is an equality type if and only if 'a is an equality type. Further immarray * equality is structural, rather than the "creation" equality used by Array. * Additionally, no vector type is supported, and consequently no copyVec * function is supported. Finally, the functions mapi and map provide * similar functionality as modifyi and modify, but relax the constraint that * the argument function need be of type 'a -> 'a. * * Future Work : There are random-access list implementations * that support O(log n) sub and update functions, * which may provide a faster implementation, although * possibly at the expense of space and the ease of * implementing app, foldl, foldr, modify, and map functions. *) signature IMMARRAY = sig type 'a immarray; val maxLen : int; val immarray : (int * 'a) -> 'a immarray; val fromList : 'a list -> 'a immarray; val toList : 'a immarray -> 'a list; val tabulate : int * (int -> 'a) -> 'a immarray; val length : 'a immarray -> int; val sub : 'a immarray * int -> 'a; val update : 'a immarray * int * 'a -> 'a immarray; val extract : 'a immarray * int * int option -> 'a immarray; val copy : {src : 'a immarray, si : int, len : int option, dst : 'a immarray, di : int} -> 'a immarray; val appi : (int * 'a -> unit) -> ('a immarray * int * int option) -> unit; val app : ('a -> unit) -> 'a immarray -> unit; val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> ('a immarray * int * int option) -> 'b; val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> ('a immarray * int * int option) -> 'b; val foldl : (('a * 'b) -> 'b) -> 'b -> 'a immarray -> 'b; val foldr : (('a * 'b) -> 'b) -> 'b -> 'a immarray -> 'b; val mapi : ((int * 'a) -> 'b) -> ('a immarray * int * int option) -> 'b immarray; val map : ('a -> 'b) -> 'a immarray -> 'b immarray; val modifyi : ((int * 'a) -> 'a) -> ('a immarray * int * int option) -> 'a immarray; val modify : ('a -> 'a) -> 'a immarray -> 'a immarray; end; structure ImmArray : IMMARRAY = struct (* datatype 'a immarray * An immarray is stored internally as a list. * The use of a constructor prevents list functions from * treating immarray type as a list. *) datatype 'a immarray = IA of 'a list; (* val maxLen : int * The maximum length of immarrays supported. * Technically, under this implementation, the maximum length * of immarrays is the same as the maximum length of a list, * but for convience and compatibility, use the Array structure's * maximum length. *) val maxLen = Array.maxLen; (* val tabulate : int * (int -> 'a) -> 'a immarray * val immarray : int * 'a -> 'a immarray * val fromList : 'a list -> 'a immarray * val toList : 'a immarray -> 'a list * val length : 'a immarray -> int * These functions perform basic immarray functions. * The tabulate, immarray, and fromList functions create an immarray. * The toList function converts an immarray to a list. * The length function returns the length of an immarray. *) fun tabulate (n, initfn) = IA (List.tabulate (n, initfn)); fun immarray (n, init) = tabulate (n, fn _ => init); fun fromList l = IA l; fun toList (IA ia) = ia; fun length (IA ia) = List.length ia; (* val sub : 'a immarray * int -> 'a * val update : 'a immarray * int * 'a -> 'a immarray * These functions sub and update an immarray by index. *) fun sub (IA ia, i) = List.nth (ia, i); fun update (IA ia, i, x) = IA ((List.take (ia, i)) @ (x::(List.drop (ia, i + 1)))); (* val extract : 'a immarray * int * int option -> 'a immarray * This function extracts an immarray slice from an immarray from * one index either through the rest of the immarray (NONE) * or for n elements (SOME n), as described in the * Standard ML Basis Library. *) fun extract (IA ia, i, NONE) = IA (List.drop (ia, i)) | extract (IA ia, i, SOME n) = IA (List.take (List.drop (ia, i), n)); (* val copy : {src : 'a immarray, si : int, len : int option, dst : 'a immarray, di : int} -> 'a immarray * This function copies an immarray slice from src into dst starting * at the di element. *) fun copy {src, si, len, dst=IA ia, di} = let val IA sia = extract (src, si, len); val pre = List.take (ia, di); val post = case len of NONE => List.drop (ia, di+(List.length sia)) | SOME n => List.drop (ia, di+n); in IA (pre @ sia @ post) end; (* val appi : ('a * int -> unit) -> ('a immarray * int * int option) * -> unit * val app : ('a -> unit) -> 'a immarray -> unit * These functions apply a function to every element * of an immarray. The appi function also provides the * index of the element as an argument to the applied function * and uses an immarray slice argument. *) local fun appi_aux f i [] = () | appi_aux f i (h::t) = (f(i,h); appi_aux f (i + 1) t); in fun appi f (IA ia, i, len) = let val IA sia = extract (IA ia, i, len); in appi_aux f i sia end; end; fun app f immarr = appi (f o #2) (immarr, 0, NONE); (* val foldli : (int * 'a * 'b -> 'b) -> 'b * -> ('a immarray * int * int option) -> 'b; * val foldri : (int * 'a * 'b -> 'b) -> 'b * -> ('a immarray * int * int option) -> 'b; * val foldl : ('a * 'b -> 'b) -> 'b -> 'a immarray -> 'b * val foldr : ('a * 'b -> 'b) -> 'b -> 'a immarray -> 'b * These functions fold a function over every element * of an immarray. The foldri and foldli functions also provide * the index of the element as an argument to the folded function * and uses an immarray slice argument. *) local fun foldli_aux f b i [] = b | foldli_aux f b i (h::t) = foldli_aux f (f(i,h,b)) (i+1) t; fun foldri_aux f b i [] = b | foldri_aux f b i (h::t) = f(i,h,foldri_aux f b (i+1) t); in fun foldli f b (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in foldli_aux f b i ia2 end; fun foldri f b (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in foldri_aux f b i ia2 end; end; fun foldl f b (IA ia) = foldli (fn (_,i,x) => f(i,x)) b (IA ia, 0, NONE); fun foldr f b (IA ia) = foldri (fn (_,i,x) => f(i,x)) b (IA ia, 0, NONE); (* val mapi : ('a * int -> 'b) -> 'a immarray -> 'b immarray * val map : ('a -> 'b) -> 'a immarray -> 'b immarray * These functions map a function over every element * of an immarray. The mapi function also provides the * index of the element as an argument to the mapped function * and uses an immarray slice argument. Although there are * similarities between mapi and modifyi, note that when mapi is * used with an immarray slice, the resulting immarray is the * same size as the slice. This is necessary to preserve the * type of the resulting immarray. Thus, mapi with the identity * function reduces to the extract function. *) local fun mapi_aux f i [] = [] | mapi_aux f i (h::t) = (f (i,h))::(mapi_aux f (i + 1) t); in fun mapi f (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in IA (mapi_aux f i ia2) end; end; fun map f (IA ia)= mapi (f o #2) (IA ia, 0, NONE); (* val modifyi : (int * 'a -> 'a) -> ('a immarray * int * int option) * -> 'a immarray * val modify : ('a -> 'a) -> 'a immarray -> 'a immarray * These functions apply a function to every element of an immarray * in left to right order and returns a new immarray where corresponding * elements are replaced by their modified values. The modifyi * function also provides the index of the element as an argument * to the mapped function and uses an immarray slice argument. *) local fun modifyi_aux f i [] = [] | modifyi_aux f i (h::t) = (f (i,h))::(modifyi_aux f (i + 1) t); in fun modifyi f (IA ia, i, len) = let val pre = List.take (ia, i); val IA ia2 = extract (IA ia, i, len); val post = case len of NONE => [] | SOME n => List.drop (ia, i+n); in IA (pre @ (modifyi_aux f i ia2) @ post) end; end; fun modify f (IA ia) = modifyi (f o #2) (IA ia, 0, NONE); end; (* ************************************************************************* *) (* * ImmArray2.sml * * The ImmArray2 structure defines a two dimensional immutable array * implementation. An immarray2 is stored internally as an immutable * array of immutable arrays. As such, the ImmArray2 makes heavy use * of the ImmArray structure. * * The ImmArray2 structure mimics the Array2 structure as much as possible. * The most obvious deviation is that unit return types in Array2 are replaced * by 'a immarray2 return types in ImmArray2. Unlike an 'a array, * an 'a immarray2 is an equality type if and only if 'a is an equality type. * Further immarray2 equality is structural, rather than the "creation" * equality used by Array2. Also, the 'a region type is not included in * ImmArray2, but all functions in Array2 that require 'a regions are present * with arguments taken in the natural order. Finally, the functions mapi * and map provide similar functionality as modifyi and modify, but relax * the constraint that the argument function need be of type 'a -> 'a. *) signature IMMARRAY2 = sig type 'a immarray2; datatype traversal = RowMajor | ColMajor val immarray2 : int * int * 'a -> 'a immarray2; val tabulate : traversal -> int * int * ((int * int) -> 'a) -> 'a immarray2; val fromList : 'a list list -> 'a immarray2; val dimensions : 'a immarray2 -> int * int; val sub : 'a immarray2 * int * int -> 'a; val update : 'a immarray2 * int * int * 'a -> 'a immarray2; val extract : 'a immarray2 * int * int * int option * int option -> 'a immarray2; val copy : {src : 'a immarray2, si : int, sj : int, ilen : int option, jlen : int option, dst : 'a immarray2, di : int, dj : int} -> 'a immarray2; val nRows : 'a immarray2 -> int; val nCols : 'a immarray2 -> int; val row : 'a immarray2 * int -> 'a ImmArray.immarray; val column : 'a immarray2 * int -> 'a ImmArray.immarray; val appi : traversal -> (int * int * 'a -> unit) -> ('a immarray2 * int * int * int option * int option) -> unit; val app : traversal -> ('a -> unit) -> 'a immarray2 -> unit; val foldli : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b -> ('a immarray2 * int * int * int option * int option) -> 'b val foldri : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b -> ('a immarray2 * int * int * int option * int option) -> 'b val foldl : traversal -> (('a * 'b) -> 'b) -> 'b -> 'a immarray2 -> 'b val foldr : traversal -> (('a * 'b) -> 'b) -> 'b -> 'a immarray2 -> 'b val mapi : traversal -> (int * int * 'a -> 'b) -> ('a immarray2 * int * int * int option * int option) -> 'b immarray2; val map : traversal -> ('a -> 'b) -> 'a immarray2 -> 'b immarray2; val modifyi : traversal -> ((int * int * 'a) -> 'a) -> ('a immarray2 * int * int * int option * int option) -> 'a immarray2; val modify : traversal -> ('a -> 'a) -> 'a immarray2 -> 'a immarray2; end; structure ImmArray2 : IMMARRAY2 = struct (* datatype 'a immarray2 * An immarray2 is stored internally as an immutable array * of immutable arrays. The use of a contructor prevents ImmArray * functions from treating the immarray2 type as an immarray. *) datatype 'a immarray2 = IA2 of 'a ImmArray.immarray ImmArray.immarray; datatype traversal = RowMajor | ColMajor (* val tabulate : traversal -> int * int * (int * int -> 'a) * -> 'a immarray2 * val immarray2 : int * int * 'a -> 'a immarray2 * val fromList : 'a list list -> 'a immarray2 * val dmensions : 'a immarray2 -> int * int * These functions perform basic immarray2 functions. * The tabulate and immarray2 functions create an immarray2. * The fromList function converts a list of lists into an immarray2. * Unlike Array2.fromList, fromList will accept lists of different * lengths, allowing one to create an immarray2 in which the * rows have different numbers of columns, although it is likely that * exceptions will be raised when other ImmArray2 functions are applied * to such an immarray2. Note that dimensions will return the * number of columns in row 0. * The dimensions function returns the dimensions of an immarray2. *) fun tabulate RowMajor (r, c, initfn) = let fun initrow r = ImmArray.tabulate (c, fn ic => initfn (r,ic)); in IA2 (ImmArray.tabulate (r, fn ir => initrow ir)) end | tabulate ColMajor (r, c, initfn) = turn (tabulate RowMajor (c,r, fn (c,r) => initfn(r,c))) and immarray2 (r, c, init) = tabulate RowMajor (r, c, fn (_, _) => init) and fromList l = IA2 (ImmArray.tabulate (length l, fn ir => ImmArray.fromList (List.nth(l,ir)))) and dimensions (IA2 ia2) = (ImmArray.length ia2, ImmArray.length (ImmArray.sub (ia2, 0))) (* turn : 'a immarray2 -> 'a immarray2 * This function reverses the rows and columns of an immarray2 * to allow handling of ColMajor traversals. *) and turn ia2 = let val (r,c) = dimensions ia2; in tabulate RowMajor (c,r,fn (cc,rr) => sub (ia2,rr,cc)) end (* val sub : 'a immarray2 * int * int -> 'a * val update : 'a immarray2 * int * int * 'a -> 'a immarray2 * These functions sub and update an immarray2 by indices. *) and sub (IA2 ia2, r, c) = ImmArray.sub(ImmArray.sub (ia2, r), c); fun update (IA2 ia2, r, c, x) = IA2 (ImmArray.update (ia2, r, ImmArray.update (ImmArray.sub (ia2, r), c, x))); (* val extract : 'a immarray2 * int * int * * int option * int option -> 'a immarray2 * This function extracts a subarray from an immarray2 from * one pair of indices either through the rest of the * immarray2 (NONE, NONE) or for the specfied number of elements. *) fun extract (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.map (fn ia => ImmArray.extract (ia, j, clen)) (ImmArray.extract (ia2, i, rlen))); (* val nRows : 'a immarray2 -> int * val nCols : 'a immarray2 -> int * These functions return specific dimensions of an immarray2. *) fun nRows (IA2 ia2) = (#1 o dimensions) (IA2 ia2); fun nCols (IA2 ia2) = (#2 o dimensions) (IA2 ia2); (* val row : immarray2 * int -> ImmArray.immarray * val column : immarray2 * int -> ImmArray.immarray * These functions extract an entire row or column from * an immarray2 by index, returning the row or column as * an ImmArray.immarray. *) fun row (ia2, r) = let val (c, _) = dimensions ia2; in ImmArray.tabulate (c, fn i => sub (ia2, r, i)) end; fun column (ia2, c) = let val (_, r) = dimensions ia2; in ImmArray.tabulate (r, fn i => sub (ia2, i, c)) end; (* val copy : {src : 'a immarray2, si : int, sj : int, * ilen : int option, jlen : int option, * dst : 'a immarray2, di : int, dj : int}; * This function copies an immarray2 slice from src int dst starting * at the di,dj element. *) fun copy {src, si, sj, ilen, jlen, dst=IA2 ia2, di, dj} = let val nilen = case ilen of NONE => SOME ((nRows src) - si) | SOME n => SOME n; in IA2 (ImmArray.modifyi (fn (r, ia) => ImmArray.copy {src=row (src, si+r-di), si=sj, len=jlen, dst=ia, di=dj}) (ia2, di, nilen)) end; (* val appi : traversal -> ('a * int * int -> unit) -> 'a immarray2 * -> unit * val app : traversal -> ('a -> unit) -> 'a immarray2 -> unit * These functions apply a function to every element * of an immarray2. The appi function also provides the * indices of the element as an argument to the applied function * and uses an immarray2 slice argument. *) fun appi RowMajor f (IA2 ia2, i, j, rlen, clen) = ImmArray.appi (fn (r,ia) => ImmArray.appi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen) | appi ColMajor f (ia2, i, j, rlen, clen) = appi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen); fun app tr f (IA2 ia2) = appi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); (* val foldli : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b * -> ('a immarray2 * int * int * int option * int option) * -> 'b * val foldri : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b * -> ('a immarray2 * int * int * int option * int option) * -> 'b * val foldl : traversal -> ('a * 'b -> 'b) -> 'b -> 'a immarray2 -> 'b * val foldr : traversal -> ('a * 'b -> 'b) -> 'b -> 'a immarray2 -> 'b * These functions fold a function over every element * of an immarray2. The foldri and foldli functions also provide * the index of the element as an argument to the folded function * and uses an immarray2 slice argument. *) fun foldli RowMajor f b (IA2 ia2, i, j, rlen, clen) = ImmArray.foldli (fn (r,ia,b) => ImmArray.foldli (fn (c,x,b) => f(r,c,x,b)) b (ia, j, clen)) b (ia2, i, rlen) | foldli ColMajor f b (ia2, i, j, rlen, clen) = foldli RowMajor (fn (c,r,x,b) => f(r,c,x,b)) b (turn ia2, j, i, clen, rlen); fun foldri RowMajor f b (IA2 ia2, i, j, rlen, clen) = ImmArray.foldri (fn (r,ia,b) => ImmArray.foldri (fn (c,x,b) => f(r,c,x,b)) b (ia, j, clen)) b (ia2, i, rlen) | foldri ColMajor f b (ia2, i, j, rlen, clen) = foldri RowMajor (fn (c,r,x,b) => f(r,c,x,b)) b (turn ia2, j, i, clen, rlen); fun foldl tr f b (IA2 ia2) = foldli tr (fn (_,_,x,b) => f(x,b)) b (IA2 ia2, 0, 0, NONE, NONE); fun foldr tr f b (IA2 ia2) = foldri tr (fn (_,_,x,b) => f(x,b)) b (IA2 ia2, 0, 0, NONE, NONE); (* val mapi : traversal -> ('a * int * int -> 'b) -> 'a immarray2 * -> 'b immarray2 * val map : traversal -> ('a -> 'b) -> 'a immarray2 -> 'b immarray2 * These functions map a function over every element * of an immarray2. The mapi function also provides the * indices of the element as an argument to the mapped function * and uses an immarray2 slice argument. Although there are * similarities between mapi and modifyi, note that when mapi is * used with an immarray2 slice, the resulting immarray2 is the * same size as the slice. This is necessary to preserve the * type of the resulting immarray2. Thus, mapi with the identity * function reduces to the extract function. *) fun mapi RowMajor f (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.mapi (fn (r,ia) => ImmArray.mapi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen)) | mapi ColMajor f (ia2, i, j, rlen, clen) = turn (mapi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen)) fun map tr f (IA2 ia2) = mapi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); (* val modifyi : traversal -> (int * int* 'a -> 'a) -> ('a immarray2 * int * int * int option * int option) * -> 'a immarray2 * val modify : traversal -> ('a -> 'a) -> 'a immarray2 -> 'a immarray2 * These functions apply a function to every element of an immarray2 * in row by column order and returns a new immarray2 where corresponding * elements are replaced by their modified values. The modifyi * function also provides the index of the element as an argument * to the mapped function and uses an immarray2 slice argument. *) fun modifyi RowMajor f (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.modifyi (fn (r,ia) => ImmArray.modifyi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen)) | modifyi ColMajor f (ia2, i, j, rlen, clen) = turn (modifyi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen)); fun modify tr f (IA2 ia2) = modifyi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); end; (* ************************************************************************* *) (* * RegisterFile.sig * * This defines the exported datatype and functions provided by the * register file. The datatype registerfile provides the encapsulation * of the register file, InitRegisterFile initializes the registerfile, * setting all registers to zero and setting r0, gp, sp, and fp to * their appropriate values, LoadRegister takes a registerfile and * an integer corresponding to the register, and returns the * Word32.word value at that register, and StoreRegister takes a * registerfile, an integer corresponding to the register, and a * Word32.word and returns the registerfile updated with the word * stored in the appropriate register. *) signature REGISTERFILE = sig type registerfile; val InitRegisterFile : unit -> registerfile; val LoadRegister : registerfile * int -> Word32.word; val StoreRegister : registerfile * int * Word32.word -> registerfile; end; (*****************************************************************************) (* * RegisterFile.sml * * This defines the RegisterFile structure, which provides the * functionality of the register file. The datatype registerfile * provides the encapsulation of the register file, InitRegisterFile * initializes the registerfile, setting all registers to zero and * setting r0, gp, sp, and fp to their appropriate values, * LoadRegister takes a registerfile and an integer corresponding to * the register, and returns the Word32.word value at that register, * and StoreRegister takes a registerfile, an integer corresponding to * the register, and a Word32.word and returns the registerfile * updated with the word stored in the appropriate register. * * The underlying structure of registerfile is an immutable array of * Word32.word. *) structure RegisterFile : REGISTERFILE = struct type registerfile = Word32.word ImmArray.immarray; fun InitRegisterFile () = ImmArray.update (ImmArray.update (ImmArray.update (ImmArray.update (ImmArray.immarray(32, 0wx00000000 : Word32.word), 00, 0wx00000000 : Word32.word), 28, 0wx00000000 : Word32.word), 29, 0wx00040000 : Word32.word), 30, 0wx00040000 : Word32.word) : registerfile; fun LoadRegister (rf, reg) = ImmArray.sub(rf, reg); fun StoreRegister (rf, reg, data) = ImmArray.update(rf, reg, data); end; (*****************************************************************************) (* * ALU.sig * * This defines the exported datatype and function provided by the * ALU. The datatype ALUOp provides a means to specify which * operation is to be performed by the ALU, and PerformAL performs * one of the operations on two thirty-two bit words, returning the * result as a thirty-two bit word. *) signature ALU = sig datatype ALUOp = SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE; val PerformAL : (ALUOp * Word32.word * Word32.word) -> Word32.word; end; (*****************************************************************************) (* * ALU.sml * * This defines the ALU structure, which provides the functionality of * an Arithmetic/Logic Unit. The datatype ALUOp provides a means to * specify which operation is to be performed by the ALU, and * PerformAL performs one of the operations on two thirty-two bit * words, returning the result as a thirty-two bit word. * * A note about SML'97 Basis Library implementation of thirty-two bit * numbers: the Word32.word is an unsigned thirty-two bit integer, * while Int.int (equivalent to Int.int) is a signed thirty-two * bit integer. In order to perform the signed operations, it is * necessary to convert the words to signed form, using the * Word32.toIntX function, which performs sign extension, * and to convert the result back into unsigned form using the * Word32.fromInt function. In addition, to perform a shift, * the second Word32.word needs to be "downsized" to a normal * Word.word using the Word.fromWord function. *) structure ALU : ALU = struct datatype ALUOp = SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE; fun PerformAL (opcode, s1, s2) = (case opcode of SLL => Word32.<< (s1, Word.fromLarge (Word32.toLarge s2)) | SRL => Word32.>> (s1, Word.fromLarge (Word32.toLarge s2)) | SRA => Word32.~>> (s1, Word.fromLarge (Word32.toLarge s2)) | ADD => Word32.fromInt (Int.+ (Word32.toIntX s1, Word32.toIntX s2)) | ADDU => Word32.+ (s1, s2) | SUB => Word32.fromInt (Int.- (Word32.toIntX s1, Word32.toIntX s2)) | SUBU => Word32.- (s1, s2) | AND => Word32.andb (s1, s2) | OR => Word32.orb (s1, s2) | XOR => Word32.xorb (s1, s2) | SEQ => if (s1 = s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SNE => if not (s1 = s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SLT => if Int.< (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SGT => if Int.> (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SLE => if Int.<= (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SGE => if Int.>= (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word) (* * This handle will handle all ALU errors, most * notably overflow and division by zero, and will * print an error message and return 0. *) handle _ => (print "Error : ALU returning 0\n"; 0wx00000000 : Word32.word); end; (*****************************************************************************) (* * Memory.sig * * This defines the exported datatype and functions provided by * memory. The datatype memory provides the encapsulation * of memory, InitMemory initializes memory, setting all * addresses to zero, LoadWord takes memory and * a Word32.word corresponding to the address, and returns the * Word32.word value at that address, StoreWord takes memory, * a Word32.word corresponding to the address, and a * Word32.word and returns memory updated with the word * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. *) signature MEMORY = sig type memory; val InitMemory : unit -> memory; val LoadWord : memory * Word32.word -> memory * Word32.word; val StoreWord : memory * Word32.word * Word32.word -> memory; val LoadHWord : memory * Word32.word -> memory * Word32.word; val LoadHWordU : memory * Word32.word -> memory * Word32.word; val StoreHWord : memory * Word32.word * Word32.word -> memory; val LoadByte : memory * Word32.word -> memory * Word32.word; val LoadByteU : memory * Word32.word -> memory * Word32.word; val StoreByte : memory * Word32.word * Word32.word -> memory; val GetStatistics : memory -> string; end; (*****************************************************************************) (* * Memory.sml * * This defines the Memory structure, which provides the functionality * of memory. The datatype memory provides the encapsulation of * memory, InitMemory initializes memory, setting all * addresses to zero, LoadWord takes memory and * a Word32.word corresponding to the address, and returns the * Word32.word value at that address and the updated memory, * StoreWord takes memory, a Word32.word corresponding to the * address, and a Word32.word and returns memory updated with the word * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. * * The underlying structure of memory is an immutable array of Word32.word. * The array has a length of 0x10000, since every element of the array * corresponds to a thirty-two bit integer. * * Also, the functions AlignWAddress and AlignHWAddress aligns a memory * address to a word and halfword address, respectively. If LoadWord, * StoreWord, LoadHWord, LoadHWordU, or StoreHWord is asked to access an * unaligned address, it writes an error message, and uses the address * rounded down to the aligned address. *) structure Memory : MEMORY = struct type memory = Word32.word ImmArray.immarray * (int * int); fun InitMemory () = (ImmArray.immarray(Word32.toInt(0wx10000 : Word32.word), 0wx00000000 : Word32.word), (0, 0)) : memory; fun AlignWAddress address = Word32.<< (Word32.>> (address, 0wx0002), 0wx0002); fun AlignHWAddress address = Word32.<< (Word32.>> (address, 0wx0001), 0wx0001); (* Load and Store provide errorless access to memory. * They provide a common interface to memory, while * the LoadX and StoreX specifically access words, * halfwords and bytes, requiring address to be aligned. * In Load and Store, two intermediate values are * generated. The value aligned_address is the aligned * version of the given address, and is used to compare with * the original address to determine if it was aligned. The * value use_address is equivalent to aligned_address divided * by four, and it corresponds to the index of the memory * array where the corresponding aligned address can be found. *) fun Load ((mem, (reads, writes)), address) = let val aligned_address = AlignWAddress address; val use_address = Word32.>> (aligned_address, 0wx0002); in ((mem, (reads + 1, writes)), ImmArray.sub(mem, Word32.toInt(use_address))) end; fun Store ((mem, (reads, writes)), address, data) = let val aligned_address = AlignWAddress address; val use_address = Word32.>> (aligned_address, 0wx0002); in (ImmArray.update(mem, Word32.toInt(use_address), data), (reads, writes + 1)) end; fun LoadWord (mem, address) = let val aligned_address = if address = AlignWAddress address then address else (print "Error LW: Memory using aligned address\n"; AlignWAddress address); in Load(mem, aligned_address) end; fun StoreWord (mem, address, data) = let val aligned_address = if address = AlignWAddress address then address else (print "Error SW: Memory using aligned address\n"; AlignWAddress address); in Store(mem, aligned_address, data) end; fun LoadHWord (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LH: Memory using aligned address\n"; AlignHWAddress address); val (nmem,l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LH: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadHWordU (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LHU: Memory using aligned address\n"; AlignHWAddress address); val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LHU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreHWord (mem, address, data) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error SH: Memory using aligned address\n"; AlignWAddress address); val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF0000 : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0000))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx0000FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0010))) | _ => (print "Error SH: Memory unchanged\n"; mem) end; fun LoadByte (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LB: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadByteU (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LBU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreByte (mem, address, data) = let val aligned_address = address; val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFFFF00 : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0000))) | 0wx00000008 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF00FF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0008))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFF00FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0010))) | 0wx00000018 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx00FFFFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0018))) | _ => (print "Error SB: Memory unchanged\n"; mem) end; fun GetStatistics (mem, (reads, writes)) = "Memory :\n" ^ "Memory Reads : " ^ (Int.toString reads) ^ "\n" ^ "Memory Writes : " ^ (Int.toString writes) ^ "\n"; end; (*****************************************************************************) (* * CacheSpec.sig * * This defines the signature that outlines the specifications to * describe a cache. The two datatypes are given to provide clear * means of differentiating between the write hit and write miss * options. CacheName can be any string describing the cache. * CacheSize is an integer that represents the total number of words * in the cache. BlockSize is an integer that represents the total * number of words in a block. Associativity is an integer that * represents the associativity of the cache. WriteHit and WriteMiss * represent the write hit and write miss options to be implemented by * this cache. *) signature CACHESPEC = sig datatype WriteHitOption = Write_Through | Write_Back; datatype WriteMissOption = Write_Allocate | Write_No_Allocate; val CacheName : string; val CacheSize : int; val BlockSize : int; val Associativity : int; val WriteHit : WriteHitOption; val WriteMiss : WriteMissOption; end; (*****************************************************************************) (* * CachedMemory.sml * * This defines the CachedMemory functor, which provides the * functionality of a cached memory and which takes two structures, * corresponding to the cache specification and the the level of * memory which the cache will be caching. The datatype memory * provides the encapsulation of the cache along with the memory * system that is being cached, InitMemory initializes the cache and * the memory system that is being cached, LoadWord takes memory and a * Word32.word corresponding to the address, and returns the * Word32.word at that address and the updated cache and memory, * StoreWord takes memory, a Word32.word corresponding to the address, * and a Word32.word and returns the cache and memory updated with the * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. * * The underlying structure of cache is a two dimensional array of * cache lines, where a cache line consists of a valid bit, dirty bit, * a tag and a block of words, as a Word32.word array. * The size of the cache, the associativity, and the block size are * specified by the cache specification. * * Also, the functions AlignWAddress and AlignHWAddress aligns a memory * address to a word and halfword address, respectively. If LoadWord, * StoreWord, LoadHWord, LoadHWordU, or StoreHWord is asked to access an * unaligned address, it writes an error message, and uses the address * rounded down to the aligned address. *) functor CachedMemory (structure CS : CACHESPEC; structure MEM : MEMORY;) : MEMORY = struct type cacheline = bool * bool * Word32.word * Word32.word ImmArray.immarray; type cacheset = cacheline ImmArray.immarray; type cache = cacheset ImmArray.immarray; type memory = (cache * (int * int * int * int)) * MEM.memory; (* Performs log[base2] on an integer. *) fun exp2 0 = 1 | exp2 n = 2 * (exp2 (n-1)) fun log2 x = let fun log2_aux n = if exp2 n > x then (n-1) else log2_aux (n+1) in log2_aux 0 end open CS; (* * The following values of index size and field bits are * calculated from the values in the cache specification * structure. *) val IndexSize = CacheSize div (BlockSize * Associativity); val BlockOffsetBits = log2 (BlockSize * 4); val IndexBits = log2 IndexSize; val TagBits = 32 - BlockOffsetBits - IndexBits; (* * RandEntry returns a random number between * [0, Associativity - 1]. It is used to determine * replacement of data in the cache. *) val RandEntry = let val modulus = Word.fromInt(Associativity - 1) in fn () => Word.toInt(Word.mod(rand (), modulus)) end (* * The InitCache function initializes the cache to * not-valid, not-dirty, 0wx00000000 tag, blocks initialized * to 0wx00000000. *) fun InitCache () = let val cacheline = (false, false, 0wx00000000 : Word32.word, ImmArray.immarray (BlockSize, 0wx00000000 : Word32.word)); val cacheset = ImmArray.immarray (Associativity, cacheline); in (ImmArray.immarray (IndexSize, cacheset), (0, 0, 0, 0)) end; (* * The InitMemory function initializes the cache * and the memory being cached. *) fun InitMemory () = (InitCache (), MEM.InitMemory ()) : memory; (* * GetTag returns the Word32.word corresponding to the tag field of * address *) fun GetTag address = Word32.>> (address, Word.fromInt (IndexBits + BlockOffsetBits)); (* * GetIndex returns the Word32.word corresponding to the index * field of address. *) fun GetIndex address = let val mask = Word32.notb (Word32.<< (Word32.>> (0wxFFFFFFFF : Word32.word, Word.fromInt (IndexBits + BlockOffsetBits)), Word.fromInt (IndexBits + BlockOffsetBits))); in Word32.>> (Word32.andb (address, mask), Word.fromInt (BlockOffsetBits)) end; (* * GetBlockOffset returns the Word32.word corresponding to the * block offset field of address. *) fun GetBlockOffset address = let val mask = Word32.notb (Word32.<< (Word32.>> (0wxFFFFFFFF : Word32.word, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits)); in Word32.andb (address, mask) end; (* * The InCache* family of functions returns a boolean value * that determines if the word specified by address is in the * cache at the current time (and that the data is valid). *) fun InCache_aux_entry ((valid, dirty, tag, block), address) = tag = (GetTag address) andalso valid; fun InCache_aux_set (set, address) = ImmArray.foldr (fn (entry, result) => (InCache_aux_entry (entry, address)) orelse result) false set; fun InCache (cac, address) = InCache_aux_set (ImmArray.sub (cac, Word32.toInt (GetIndex address)), address); (* * The ReadCache* family of functions returns the Word32.word * stored at address in the cache. *) fun ReadCache_aux_entry ((valid, dirty, tag, block), address) = ImmArray.sub (block, Word32.toInt (Word32.>> (GetBlockOffset address, 0wx0002))); fun ReadCache_aux_set (set, address) = ImmArray.foldr (fn (entry, result) => if InCache_aux_entry (entry, address) then ReadCache_aux_entry (entry, address) else result) (0wx00000000 : Word32.word) set; fun ReadCache (cac, address) = ReadCache_aux_set (ImmArray.sub (cac, Word32.toInt(GetIndex address)), address); (* * The WriteCache* family of functions returns the updated * cache with data stored at address. *) fun WriteCache_aux_entry ((valid, dirty, tag, block), address, data) = let val ndirty = case WriteHit of Write_Through => false | Write_Back => true; in (true, ndirty, tag, ImmArray.update (block, Word32.toInt (Word32.>> (GetBlockOffset address, 0wx0002)), data)) end; fun WriteCache_aux_set (set, address, data) = ImmArray.map (fn entry => if InCache_aux_entry (entry, address) then WriteCache_aux_entry (entry, address, data) else entry) set; fun WriteCache (cac, address, data) = let val index = Word32.toInt (GetIndex address); val nset = WriteCache_aux_set (ImmArray.sub (cac, index), address, data); in ImmArray.update (cac, index, nset) end; (* * The LoadBlock function returns the updated * memory and the block containing address loaded from memory. *) fun LoadBlock (mem, address) = ImmArray.foldr (fn (offset, (block, mem)) => let val laddress = Word32.+ (Word32.<< (Word32.>> (address, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits), Word32.<< (Word32.fromInt offset, 0wx0002)); val (nmem, nword) = MEM.LoadWord (mem, laddress); in (ImmArray.update (block, offset, nword), nmem) end) (ImmArray.immarray (BlockSize, 0wx00000000 : Word32.word), mem) (ImmArray.tabulate (BlockSize, fn i => i)); (* * The StoreBlock functionsreturns the updated * memory with block stored into the block containing address. *) fun StoreBlock (block, mem, address) = ImmArray.foldr (fn (offset, mem) => let val saddress = Word32.+ (Word32.<< (Word32.>> (address, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits), Word32.<< (Word32.fromInt offset, 0wx0002)); in MEM.StoreWord (mem, saddress, ImmArray.sub (block, offset)) end) mem (ImmArray.tabulate (BlockSize, fn i => i)); (* * The LoadCache* family of functions returns the updated * cache and memory, with the block containing address loaded * into the cache at the appropriate cache line, and dirty * data written back to memory as needed. *) fun LoadCache_aux_entry ((valid, dirty, tag, block), mem, address) = let val saddress = Word32.orb (Word32.<< (tag, Word.fromInt TagBits), Word32.<< (GetIndex address, Word.fromInt IndexBits)); val nmem = if valid andalso dirty then StoreBlock (block, mem, saddress) else mem; val (nblock, nnmem) = LoadBlock (nmem, address); in ((true, false, GetTag address, nblock), nnmem) end; fun LoadCache_aux_set (set, mem, address) = let val entry = RandEntry (); val (nentry, nmem) = LoadCache_aux_entry (ImmArray.sub (set, entry), mem, address); in (ImmArray.update (set, entry, nentry), nmem) end; fun LoadCache (cac, mem, address) = let val index = Word32.toInt (GetIndex address); val (nset, nmem) = LoadCache_aux_set (ImmArray.sub (cac, index), mem, address); in (ImmArray.update (cac, index, nset), nmem) end; (* * The remainder of the function defined here satisfy the MEMORY * signature. This allows a CachedMemory to act exactly like * a normal Memory, and thus caches can be nested to an arbitrary * depth. *) fun AlignWAddress address = Word32.<< (Word32.>> (address, 0wx0002), 0wx0002); fun AlignHWAddress address = Word32.<< (Word32.>> (address, 0wx0001), 0wx0001); (* Load and Store provide errorless access to memory. * They provide a common interface to memory, while * the LoadX and StoreX specifically access words, * halfwords and bytes, requiring address to be aligned. * In Load and Store, two intermediate values are * generated. The value aligned_address is the aligned * version of the given address, and is used to compare with * the original address to determine if it was aligned. The * value use_address is equivalent to aligned_address divided * by four, and it corresponds to the index of the memory * array where the corresponding aligned address can be found. *) fun Load (((cac, (rh, rm, wh, wm)), mem), address) = let val aligned_address = AlignWAddress address; in if InCache (cac, aligned_address) then (((cac, (rh + 1, rm, wh, wm)), mem), ReadCache (cac, aligned_address)) else let val (ncac, nmem) = LoadCache (cac, mem, aligned_address); in (((ncac, (rh, rm + 1, wh, wm)), nmem), ReadCache (ncac, aligned_address)) end end; fun Store (((cac, (rh, rm, wh, wm)), mem), address, data) = let val aligned_address = AlignWAddress address; in if InCache (cac, aligned_address) then let val ncac = WriteCache (cac, aligned_address, data); in case WriteHit of Write_Through => ((ncac, (rh, rm, wh + 1, wm)), MEM.StoreWord (mem, aligned_address, data)) | Write_Back => ((ncac, (rh, rm, wh + 1, wm)), mem) end else case WriteMiss of Write_Allocate => let val (ncac, nmem) = LoadCache (cac, mem, aligned_address); val nncac = WriteCache (ncac, aligned_address, data); in case WriteHit of Write_Through => ((nncac, (rh, rm, wh, wm + 1)), MEM.StoreWord (nmem, aligned_address, data)) | Write_Back => ((nncac, (rh, rm, wh, wm + 1)), nmem) end | Write_No_Allocate => ((cac, (rh, rm, wh, wm + 1)), MEM.StoreWord (mem, aligned_address, data)) end; fun LoadWord (mem, address) = let val aligned_address = if address = AlignWAddress address then address else (print "Error LW: Memory using aligned address\n"; AlignWAddress address); in Load(mem, aligned_address) end; fun StoreWord (mem, address, data) = let val aligned_address = if address = AlignWAddress address then address else (print "Error SW: Memory using aligned address\n"; AlignWAddress address); in Store(mem, aligned_address, data) end; fun LoadHWord (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LH: Memory using aligned address\n"; AlignHWAddress address); val (nmem,l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LH: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadHWordU (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LHU: Memory using aligned address\n"; AlignHWAddress address); val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LHU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreHWord (mem, address, data) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error SH: Memory using aligned address\n"; AlignWAddress address); val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF0000 : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0000))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx0000FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0010))) | _ => (print "Error SH: Memory unchanged\n"; mem) end; fun LoadByte (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LB: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadByteU (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LBU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreByte (mem, address, data) = let val aligned_address = address; val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFFFF00 : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0000))) | 0wx00000008 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF00FF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0008))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFF00FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0010))) | 0wx00000018 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx00FFFFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0018))) | _ => (print "Error SB: Memory unchanged\n"; mem) end; fun GetStatistics ((cac, (rh, rm, wh, wm)), mem) = let val th = rh + wh; val tm = rm + wm; val who = case WriteHit of Write_Through => "Write Through" | Write_Back => "Write Back"; val wmo = case WriteMiss of Write_Allocate => "Write Allocate" | Write_No_Allocate => "Write No Allocate"; in CacheName ^ " :\n" ^ "CacheSize : " ^ (Int.toString CacheSize) ^ "\n" ^ "BlockSize : " ^ (Int.toString BlockSize) ^ "\n" ^ "Associativity : " ^ (Int.toString Associativity) ^ "\n" ^ "Write Hit : " ^ who ^ "\n" ^ "Write Miss : " ^ wmo ^ "\n" ^ "Read hits : " ^ (Int.toString rh) ^ "\n" ^ "Read misses : " ^ (Int.toString rm) ^ "\n" ^ "Write hits : " ^ (Int.toString wh) ^ "\n" ^ "Write misses : " ^ (Int.toString wm) ^ "\n" ^ "Total hits : " ^ (Int.toString th) ^ "\n" ^ "Total misses : " ^ (Int.toString tm) ^ "\n" ^ (MEM.GetStatistics mem) end; end; (*****************************************************************************) (* * DLXSimulator.sig * * This defines the exported function provided by the DLXSimulator. * The function run_file takes a string corresponding to the name of the * file to be run, and executes it. The function run_prog takes a * list of instructions and executes them. *) signature DLXSIMULATOR = sig val run_file : string -> unit; val run_prog : {instructions: string list, trap: {inputFn: {state: 'state} -> {input: int, state: 'state}, outputFn: {output: int, state: 'state} -> {state: 'state}, state: 'state}} -> {state: 'state, statistics: unit -> string} end; (*****************************************************************************) (* * DLXSimulator.sml * * This defines the DLXSimulatorFun functor, which takes three * structures, corresponding to the register file, the ALU, and memory, * and provides the functionality of a DLX processor, able to execute * DLX programs. The function run_file takes a string corresponding to the * name of the file to be executed, and executes it. The function * run_prog takes a list of instructions and executes them. *) functor DLXSimulatorFun (structure RF : REGISTERFILE; structure ALU : ALU; structure MEM : MEMORY; ) : DLXSIMULATOR = struct (* * The datatype Opcode provides a means of differentiating * * among the main opcodes. *) datatype Opcode = (* for R-type opcodes *) SPECIAL | (* I-type opcodes *) BEQZ | BNEZ | ADDI | ADDUI | SUBI | SUBUI | ANDI | ORI | XORI | LHI | SLLI | SRLI | SRAI | SEQI | SNEI | SLTI | SGTI | SLEI | SGEI | LB | LBU | SB | LH | LHU | SH | LW | SW | (* J-type opcodes *) J | JAL | TRAP | JR | JALR | (* Unrecognized opcode *) NON_OP; (* * The datatype RRFuncCode provides a means of * differentiating among * the register-register function codes. *) datatype RRFunctCode = NOP | SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE | NON_FUNCT; (* * The datatype Instruction provides a means of * differentiating among the three different types of * instructions, I-type, R-type, and J-type. * An I-type is interpreted as (opcode, rs1, rd, immediate). * An R-type is interpreted as (opcode, rs1, rs2, rd, shamt, funct). * An J-type is interpreted as (opcode, offset). * An ILLEGAL causes the simulator to end. *) datatype Instruction = ITYPE of Opcode * int * int * Word32.word | RTYPE of Opcode * int * int * int * int * RRFunctCode | JTYPE of Opcode * Word32.word | ILLEGAL; (* * The value HALT is set to the DLX instruction TRAP #0, * and is used to check for the halt of the program. *) val HALT = JTYPE (TRAP, 0wx00000000); (* * The function DecodeIType decodes a Word32.word into an * I-type instruction. *) fun DecodeIType instr = let val opc = Word32.andb (Word32.>> (instr, 0wx001A), 0wx0000003F : Word32.word); val opcode = case opc of 0wx00000004 : Word32.word => BEQZ | 0wx00000005 : Word32.word => BNEZ | 0wx00000008 : Word32.word => ADDI | 0wx00000009 : Word32.word => ADDUI | 0wx0000000A : Word32.word => SUBI | 0wx0000000B : Word32.word => SUBUI | 0wx0000000C : Word32.word => ANDI | 0wx0000000D : Word32.word => ORI | 0wx0000000E : Word32.word => XORI | 0wx0000000F : Word32.word => LHI | 0wx00000014 : Word32.word => SLLI | 0wx00000016 : Word32.word => SRLI | 0wx00000017 : Word32.word => SRAI | 0wx00000018 : Word32.word => SEQI | 0wx00000019 : Word32.word => SNEI | 0wx0000001A : Word32.word => SLTI | 0wx0000001B : Word32.word => SGTI | 0wx0000001C : Word32.word => SLEI | 0wx0000001D : Word32.word => SGEI | 0wx00000020 : Word32.word => LB | 0wx00000024 : Word32.word => LBU | 0wx00000028 : Word32.word => SB | 0wx00000021 : Word32.word => LH | 0wx00000025 : Word32.word => LHU | 0wx00000029 : Word32.word => SH | 0wx00000023 : Word32.word => LW | 0wx0000002B : Word32.word => SW | _ => (print "Error : Non I-Type opcode\n"; NON_OP); val rs1 = Word32.toInt(Word32.andb (Word32.>> (instr, 0wx0015), 0wx0000001F : Word32.word)); val rd = Word32.toInt(Word32.andb (Word32.>> (instr, 0wx0010), 0wx0000001F : Word32.word)); val immediate = Word32.~>> (Word32.<< (instr, 0wx0010), 0wx0010); in if opcode = NON_OP then ILLEGAL else ITYPE (opcode, rs1, rd, immediate) end; (* * The function DecodeRType decodes a Word32.word into an * R-type instruction. *) fun DecodeRType instr = let val rs1 = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0015), 0wx0000001F : Word32.word)); val rs2 = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0010), 0wx0000001F : Word32.word)); val rd = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx000B), 0wx0000001F : Word32.word)); val shamt = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0006), 0wx0000001F : Word32.word)); val funct = Word32.andb (instr, 0wx0000003F : Word32.word); val functcode = case funct of 0wx00000000 : Word32.word => NOP | 0wx00000004 : Word32.word => SLL | 0wx00000006 : Word32.word => SRL | 0wx00000007 : Word32.word => SRA | 0wx00000020 : Word32.word => ADD | 0wx00000021 : Word32.word => ADDU | 0wx00000022 : Word32.word => SUB | 0wx00000023 : Word32.word => SUBU | 0wx00000024 : Word32.word => AND | 0wx00000025 : Word32.word => OR | 0wx00000026 : Word32.word => XOR | 0wx00000028 : Word32.word => SEQ | 0wx00000029 : Word32.word => SNE | 0wx0000002A : Word32.word => SLT | 0wx0000002B : Word32.word => SGT | 0wx0000002C : Word32.word => SLE | 0wx0000002D : Word32.word => SGE | _ => (print "Error : Non R-type funct\n"; NON_FUNCT); in if functcode = NON_FUNCT then ILLEGAL else RTYPE (SPECIAL, rs1, rs2, rd, shamt, functcode) end; (* * The function DecodeJType decodes a Word32.word into an * J-type instruction. *) fun DecodeJType instr = let val opc = Word32.andb (Word32.>> (instr, 0wx1A), 0wx0000003F : Word32.word); val opcode = case opc of 0wx00000002 : Word32.word => J | 0wx00000003 : Word32.word => JAL | 0wx00000011 : Word32.word => TRAP | 0wx00000012 : Word32.word => JR | 0wx00000013 : Word32.word => JALR | _ => (print "Error : Non J-type opcode\n"; NON_OP); val offset = Word32.~>> (Word32.<< (instr, 0wx0006), 0wx0006); in if opcode = NON_OP then ILLEGAL else JTYPE (opcode, offset) end; (* * The function DecodeInstr decodes a Word32.word into an * instruction. It first checks the opcode, and then calls * one of DecodeIType, DecodeJType, and DecodeRType to * complete the decoding process. *) fun DecodeInstr instr = let val opcode = Word32.andb (Word32.>> (instr, 0wx1A), 0wx0000003F : Word32.word); in case opcode of 0wx00000000 : Word32.word => DecodeRType instr | 0wx00000002 : Word32.word => DecodeJType instr | 0wx00000003 : Word32.word => DecodeJType instr | 0wx00000004 : Word32.word => DecodeIType instr | 0wx00000005 : Word32.word => DecodeIType instr | 0wx00000008 : Word32.word => DecodeIType instr | 0wx00000009 : Word32.word => DecodeIType instr | 0wx0000000A : Word32.word => DecodeIType instr | 0wx0000000B : Word32.word => DecodeIType instr | 0wx0000000C : Word32.word => DecodeIType instr | 0wx0000000D : Word32.word => DecodeIType instr | 0wx0000000E : Word32.word => DecodeIType instr | 0wx0000000F : Word32.word => DecodeIType instr | 0wx00000011 : Word32.word => DecodeJType instr | 0wx00000012 : Word32.word => DecodeJType instr | 0wx00000013 : Word32.word => DecodeJType instr | 0wx00000016 : Word32.word => DecodeIType instr | 0wx00000017 : Word32.word => DecodeIType instr | 0wx00000018 : Word32.word => DecodeIType instr | 0wx00000019 : Word32.word => DecodeIType instr | 0wx0000001A : Word32.word => DecodeIType instr | 0wx0000001B : Word32.word => DecodeIType instr | 0wx0000001C : Word32.word => DecodeIType instr | 0wx0000001D : Word32.word => DecodeIType instr | 0wx00000020 : Word32.word => DecodeIType instr | 0wx00000024 : Word32.word => DecodeIType instr | 0wx00000028 : Word32.word => DecodeIType instr | 0wx00000021 : Word32.word => DecodeIType instr | 0wx00000025 : Word32.word => DecodeIType instr | 0wx00000029 : Word32.word => DecodeIType instr | 0wx00000023 : Word32.word => DecodeIType instr | 0wx0000002B : Word32.word => DecodeIType instr | _ => (print "Error : Unrecognized opcode\n"; ILLEGAL) end; (* * The function PerformIType performs one of the I-Type * instructions. A number of the instructions make use of the * ALU, and as such, call ALU.PerformAL. *) fun PerformIType ((BEQZ, rs1, rd, immediate), (PC, rf, mem, trap)) = if (RF.LoadRegister(rf, rs1) = (0wx00000000 : Word32.word)) then (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (immediate, 0wx0002)))), rf, mem, trap) else (PC, rf, mem, trap) | PerformIType ((BNEZ, rs1, rd, immediate), (PC, rf, mem, trap)) = if not (RF.LoadRegister(rf, rs1) = (0wx00000000 : Word32.word)) then (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (immediate, 0wx0002)))), rf, mem, trap) else (PC, rf, mem, trap) | PerformIType ((ADDI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADD, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((ADDUI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADDU, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SUBI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUB, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SUBUI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUBU, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((ANDI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.AND, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((ORI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.OR, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((XORI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.XOR, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((LHI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, Word32.<< (immediate, 0wx0010)), mem, trap) | PerformIType ((SLLI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, Word32.<< (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem, trap) | PerformIType ((SRLI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, Word32.>> (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem, trap) | PerformIType ((SRAI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, Word32.~>> (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem, trap) | PerformIType ((SEQI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SEQ, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SNEI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SNE, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SLTI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLT, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SGTI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGT, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SLEI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLE, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((SGEI, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGE, RF.LoadRegister(rf, rs1), immediate)), mem, trap) | PerformIType ((LB, rs1, rd, immediate), (PC, rf, mem, trap)) = let val (nmem, l_byte) = MEM.LoadByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_byte), nmem, trap) end | PerformIType ((LBU, rs1, rd, immediate), (PC, rf, mem, trap)) = let val (nmem, l_byte) = MEM.LoadByteU(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_byte), nmem, trap) end | PerformIType ((SB, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, rf, MEM.StoreByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), Word32.andb(0wx000000FF, RF.LoadRegister(rf, rd))), trap) | PerformIType ((LH, rs1, rd, immediate), (PC, rf, mem, trap)) = let val (nmem, l_hword) = MEM.LoadHWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_hword), nmem, trap) end | PerformIType ((LHU, rs1, rd, immediate), (PC, rf, mem, trap)) = let val (nmem, l_hword) = MEM.LoadHWordU(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_hword), nmem, trap) end | PerformIType ((SH, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, rf, MEM.StoreByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), Word32.andb(0wx0000FFFF, RF.LoadRegister(rf, rd))), trap) | PerformIType ((LW, rs1, rd, immediate), (PC, rf, mem, trap)) = let val (nmem, l_word) = MEM.LoadWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_word), nmem, trap) end | PerformIType ((SW, rs1, rd, immediate), (PC, rf, mem, trap)) = (PC, rf, MEM.StoreWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), RF.LoadRegister(rf, rd)), trap) | PerformIType ((_, rs1, rd, immediate), (PC, rf, mem, trap)) = (print "Error : Non I-Type opcode, performing NOP\n"; (PC, rf, mem, trap)); (* * The function PerformRType performs one of the R-Type * instructions. All of the instructions make use of the * ALU, and as such, call ALU.PerformAL. *) fun PerformRType ((SPECIA, rs1, rs2, rd, shamt, NOP), (PC, rf, mem, trap)) = (PC, rf, mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLL), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLL, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SRL), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SRL, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SRA), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SRA, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, ADD), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADD, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, ADDU), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADDU, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SUB), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUB, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SUBU), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUBU, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, AND), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.AND, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, OR), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.OR, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, XOR), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.XOR, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SEQ), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SEQ, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SNE), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SNE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLT), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLT, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SGT), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGT, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLE), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SGE), (PC, rf, mem, trap)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem, trap) | PerformRType ((_, rs1, rs2, rd, shamt, _), (PC, rf, mem, trap)) = (print "Error : Non R-Type opcode, performing NOP\n"; (PC, rf, mem, trap)); (* * The function PerformJType performs one of the J-Type * instructions. *) fun PerformJType ((J, offset), (PC, rf, mem, trap)) = (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (offset, 0wx0002)))), rf, mem, trap) | PerformJType ((JR, offset), (PC, rf, mem, trap)) = (RF.LoadRegister(rf, Word32.toInt(Word32.andb (Word32.>> (offset, 0wx0015), 0wx0000001F : Word32.word))), rf, mem, trap) | PerformJType ((JAL, offset), (PC, rf, mem, trap)) = (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (offset, 0wx0002)))), RF.StoreRegister(rf, 31, PC), mem, trap) | PerformJType ((JALR, offset), (PC, rf, mem, trap)) = (RF.LoadRegister(rf, Word32.toInt (Word32.andb (Word32.>> (offset, 0wx0015), 0wx0000001F : Word32.word))), RF.StoreRegister(rf, 31, PC), mem, trap) | PerformJType ((TRAP, 0wx00000003 : Word32.word), (PC, rf, mem, trap)) = let val {inputFn, outputFn, state} = trap val {input, state} = inputFn {state = state} val trap = {inputFn = inputFn, outputFn = outputFn, state = state} in (PC, RF.StoreRegister(rf, 14, Word32.fromInt input), mem, trap) end | PerformJType ((TRAP, 0wx00000004 : Word32.word), (PC, rf, mem, trap)) = let val output = Word32.toIntX (RF.LoadRegister(rf, 14)); val {inputFn, outputFn, state} = trap val {state} = outputFn {output = output, state = state} val trap = {inputFn = inputFn, outputFn = outputFn, state = state} in (PC, rf, mem, trap) end | PerformJType ((_, offset), (PC, rf, mem, trap)) = (print "Error : Non J-Type opcode, performing NOP\n"; (PC, rf, mem, trap)); (* * The function PerformInstr performs an instruction by * passing the instruction to the appropriate auxiliary function. *) fun PerformInstr (ITYPE instr, (PC, rf, mem, trap)) = PerformIType (instr, (PC, rf, mem, trap)) | PerformInstr (RTYPE instr, (PC, rf, mem, trap)) = PerformRType (instr, (PC, rf, mem, trap)) | PerformInstr (JTYPE instr, (PC, rf, mem, trap)) = PerformJType (instr, (PC, rf, mem, trap)) | PerformInstr (ILLEGAL, (PC, rf, mem, trap)) = (PC, rf, mem, trap); (* * The function CycleLoop represents the basic clock cycle of * the DLX processor. It takes as input the current program * counter, the current register file, and the current memory. * It loads, decodes, and executes an instruction and increments * the program counter. If the instruction that was loaded is * the HALT instruction, the program terminates, otherwise, * CycleLoop is recursively called with the result of performing * the instruction. *) fun CycleLoop (PC, rf, mem, trap) = let val (nmem, instr_word) = MEM.LoadWord (mem, PC); val instr = DecodeInstr instr_word; val nPC = Word32.+ (PC, 0wx00000004 : Word32.word); in if instr = HALT orelse instr = ILLEGAL then (fn () => MEM.GetStatistics nmem, #state trap) else CycleLoop (PerformInstr (instr, (nPC, rf, nmem, trap))) end (* * The function LoadProgAux is an auxilary function that * assists in loading a program into memory. It recursively * calls itself, each time loading an instruction and incrementing * the address to which the next instruction is to be loaded. *) fun LoadProgAux ([], mem, address) = mem | LoadProgAux (instrs::instr_list, mem, address) = let val instro = Word32.fromString instrs; val instr = if isSome instro then valOf instro else (print ("Error : Invalid " ^ "instruction format, " ^ "returning NOP\n"); 0wx00000000 : Word32.word); in LoadProgAux (instr_list, MEM.StoreWord (mem, address, instr), Word32.+ (address, 0wx00000004 : Word32.word)) end; (* * The function LoadProg takes a list of instructions and memory, and * loads the file into memory, beginning at 0x10000. *) fun LoadProg (instr_list, mem) = LoadProgAux (instr_list, mem, 0wx00010000 : Word32.word); (* * The function ReadFileToInstr reads the sequence of * instructions in a file into a list. *) fun ReadFileToInstr file = (case TextIO.inputLine file of NONE => [] | SOME l => l :: (ReadFileToInstr file)); (* * The function run_prog is exported by DLXSimulator. * It takes a list of instructions, then begins * execution of the instructions loaded at 0x10000, with an * initialized register file, and the loaded program in an * initialised memory. *) fun run_prog {instructions, trap} = let val (statistics, state) = CycleLoop (0wx00010000 : Word32.word, RF.InitRegisterFile (), LoadProg (instructions, MEM.InitMemory ()), trap); in {state = state, statistics = statistics} end (* * The function run_file is exported by DLXSimulator. * It takes the name of a file to be run, then begins * execution of the loaded program at 0x10000, with an * initialized register file, and the loaded program in an * initialized memory. *) fun run_file filename = let val instructions = ReadFileToInstr (TextIO.openIn filename) val trap = let fun inputFn {state = ()} = let val x = TextIO.print "Value? "; val input = case TextIO.inputLine TextIO.stdIn of NONE => (TextIO.print "Error : Returning 0\n"; Int.fromInt 0) | SOME s => (case Int.fromString s of NONE => (TextIO.print "Error : Returning 0\n"; Int.fromInt 0) | SOME i => i) in {input = input, state = ()} end fun outputFn {output, state = ()} = (TextIO.print ("Output: " ^ (Int.toString output) ^ "\n") ; {state = ()}) in {inputFn = inputFn, outputFn = outputFn, state = ()} end val {state, statistics} = run_prog {instructions = instructions, trap = trap} in print "Program halted.\n"; print (statistics ()); () end end; (* ************************************************************************* *) (* * Cache1.sml * * This file describes a small simple level 1 cache. *) structure L1CacheSpec1 : CACHESPEC = struct datatype WriteHitOption = Write_Through | Write_Back; datatype WriteMissOption = Write_Allocate | Write_No_Allocate; val CacheName = "Level 1 Cache"; val CacheSize = 256; val BlockSize = 4; val Associativity = 2; val WriteHit = Write_Through; val WriteMiss = Write_No_Allocate; end; structure L1Cache1 : MEMORY = CachedMemory (structure CS = L1CacheSpec1; structure MEM = Memory; ); structure DLXSimulatorC1 : DLXSIMULATOR = DLXSimulatorFun (structure RF = RegisterFile; structure ALU = ALU; structure MEM = L1Cache1; ); (* Example programs *) val Simple = ["200E002F", "44000004", "44000000", "00000000"]; val Twos = ["44000003", "00000000", "3D00FFFF", "3508FFFF", "010E7026", "25CE0001", "44000004", "00000000", "44000000", "00000000"]; val Abs = ["44000003", "00000000", "01C0402A", "11000002", "00000000", "000E7022", "44000004", "00000000", "44000000", "00000000"]; val Fact = ["0C000002", "00000000", "44000000", "44000003", "000E2020", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0C000009", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "00027020", "44000004", "00001020", "4BE00000", "00000000", "20080001", "0088402C", "11000004", "00000000", "20020001", "08000016", "00000000", "2FBD0004", "AFA40000", "28840001", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0FFFFFF1", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "8FA40000", "27BD0004", "00004020", "10800005", "00000000", "01024020", "28840001", "0BFFFFFB", "00000000", "01001020", "4BE00000", "00000000"]; val GCD = ["0C000002", "00000000", "44000000", "44000003", "00000000", "000E2020", "0080402A", "11000002", "00000000", "00042022", "44000003", "00000000", "000E2820", "00A0402A", "11000002", "00000000", "00052822", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0C00000A", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "00027020", "44000004", "00000000", "00001020", "4BE00000", "00000000", "14A00004", "00000000", "00801020", "08000013", "00000000", "0085402C", "15000006", "00000000", "00804020", "00A02020", "01002820", "08000002", "00000000", "00A42822", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0FFFFFED", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "4BE00000", "00000000"]; (* val _ = DLXSimulatorC1.run_prog GCD *) structure Main = struct fun doit last (instructions, inputs) = let fun inputFn {state = (inputs, outputs)} = case inputs of [] => {input = 0, state = ([], outputs)} | input::inputs => {input = input, state = (inputs, outputs)} fun outputFn {output, state = (inputs, outputs)} = {state = (inputs, output::outputs)} val state = (inputs, []) val trap = {inputFn = inputFn, outputFn = outputFn, state = state} val {state = (_, outputs), statistics} = DLXSimulatorC1.run_prog {instructions = instructions, trap = trap} in if last then (app (fn output => print ("Output: " ^ (Int.toString output) ^ "\n")) outputs; print (statistics ()); print "\n"; ()) else () end val doit = fn last => app (doit last) [(Simple, []), (Twos, [10]), (Abs, [~10]), (Fact, [12]), (GCD, [123456789,98765])] val doit = fn size => let fun loop n = if n = 0 then () else (doit(n = 1); loop(n-1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/Makefile000066400000000000000000000006301416264345000205610ustar00rootroot00000000000000## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean rm -f *.c *.s for f in *; do \ if [ -x "$$f" -a ! -d "$$f" ]; then \ rm -f "$$f"; \ fi; \ done mlton-20210117+dfsg/benchmark/tests/barnes-hut.sml000066400000000000000000001205661416264345000217210ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* vector-sig.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * The abstract interface of vectors and matrices in some dimension. *) signature VECTOR = sig type 'a vec val dim : int (* dimension of the vectors *) val tabulate : (int -> 'a) -> 'a vec val equal : real vec * real vec -> bool val zerov : real vec val addv : (real vec * real vec) -> real vec val subv : (real vec * real vec) -> real vec val dotvp : (real vec * real vec) -> real val crossvp : (real vec * real vec) -> real vec val addvs : (real vec * real) -> real vec val mulvs : (real vec * real) -> real vec val divvs : (real vec * real) -> real vec val mapv : ('a -> 'b) -> 'a vec -> 'b vec val map3v : (('a * 'b * 'c) -> 'd) -> ('a vec * 'b vec * 'c vec) -> 'd vec val foldv : ('a * 'b -> 'b) -> 'a vec -> 'b -> 'b val format : {lp : string, sep : string, rp : string, cvt : 'a -> string} -> 'a vec -> string val explode : 'a vec -> 'a list val implode : 'a list -> 'a vec type matrix (* matrices are always real valued *) val zerom : matrix val addm : (matrix * matrix) -> matrix val outvp : (real vec * real vec) -> matrix end (* space.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * The quad/oct-tree representation of space. *) signature SPACE = sig structure V : VECTOR datatype body = Body of { mass : real, pos : real V.vec ref, vel : real V.vec ref, acc : real V.vec ref, phi : real ref } datatype cell = BodyCell of body | Cell of node Array.array and node = Empty | Node of { mass : real ref, pos : real V.vec ref, cell : cell } datatype space = Space of { rmin : real V.vec, rsize : real, root : node } val nsub : int (* number of sub cells / cell (2 ^ V.dim) *) val putCell : (cell * int * node) -> unit val getCell : (cell * int) -> node val mkCell : unit -> cell val mkBodyNode : body -> node val mkCellNode : cell -> node val eqBody : body * body -> bool (* debugging code *) val dumpTree : node -> unit val prBody : body -> string val prNode : node -> string end; (* SPACE *) functor Space (V : VECTOR) : SPACE = struct structure V = V datatype body = Body of { mass : real, pos : real V.vec ref, vel : real V.vec ref, acc : real V.vec ref, phi : real ref } datatype cell = BodyCell of body | Cell of node Array.array and node = Empty | Node of { mass : real ref, pos : real V.vec ref, cell : cell } datatype space = Space of { rmin : real V.vec, rsize : real, root : node } fun eqBody(Body{mass,pos,vel,acc,phi}, Body{mass=m1,pos=p1,vel=v1,acc=a1,phi=h1}) = (Real.==(mass, m1) andalso Real.==(!phi, !h1) andalso V.equal(!pos, !p1) andalso V.equal(!vel, !v1) andalso V.equal(!acc, !a1)) (* number of sub cells per cell (2 ^ V.dim) *) val nsub = Word.toInt(Word.<<(0w1, Word.fromInt V.dim)) fun putCell (Cell a, i, nd) = Array.update(a, i, nd) fun getCell (Cell a, i) = Array.sub(a, i) fun mkCell () = Cell(Array.array(nsub, Empty)) fun mkBodyNode (body as Body{pos, mass, ...}) = Node{ cell = BodyCell body, mass = ref mass, pos = ref (!pos) } fun mkCellNode cell = Node{cell = cell, mass = ref 0.0, pos = ref V.zerov} (* debugging code *) local val rfmt = Real.toString val vfmt = V.format{lp="[", rp="]", sep=",", cvt = rfmt} in fun prBody (Body{mass, pos, vel, acc, phi}) = String.concat [ "B{m=", rfmt mass, ", p=", vfmt(!pos), ", v=", vfmt(!vel), ", a=", vfmt(!acc), ", phi=", rfmt(!phi), "}" ] fun prNode Empty = "Empty" | prNode (Node{mass, pos, cell}) = let val cell = (case cell of (Cell _) => "Cell" | (BodyCell b) => (*prBody b*) "Body" (* end case *)) in String.concat [ "N{m=", rfmt(!mass), ", p=", vfmt(!pos), cell, "}" ] end end fun dumpTree tree = let fun printf items = TextIO.output(TextIO.stdOut, String.concat items) fun indent i = StringCvt.padLeft #" " (i+1) "" fun dump (node, l) = let fun dump' (Node{cell=Cell a, ...}) = let fun dump'' i = (dump(Array.sub(a, i), l+1); dump''(i+1)) in (dump'' 0) handle _ => () end | dump' _ = () in printf [ StringCvt.padLeft #" " 2 (Int.toString l), indent l, prNode node, "\n" ]; dump' node end in dump (tree, 0) end end; (* Space *) (* load.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * Code to build the tree from a list of bodies. *) signature LOAD = sig structure S : SPACE structure V : VECTOR sharing S.V = V val makeTree : (S.body list * real V.vec * real) -> S.space end; (* LOAD *) functor Load (S : SPACE) : LOAD = struct structure S = S structure V = S.V exception NotIntCoord fun rshift (n, k) = Word.toInt(Word.~>>(Word.fromInt n, Word.fromInt k)) val IMAX = 0x20000000 (* 2^29 *) val IMAXrs1 = rshift(IMAX, 1) val rIMAX = real IMAX (* compute integerized coordinates. Raises the NotIntCoord exception, * if rp is out of bounds. *) fun intcoord (rp, rmin, rsize) = let val xsc = V.divvs (V.subv(rp, rmin), rsize) fun cvt x = if ((0.0 <= x) andalso (x < 1.0)) then floor(rIMAX * x) else raise NotIntCoord in V.mapv cvt xsc end (* determine which subcell to select. *) fun subindex (iv, l) = let fun aux (v, (i, k)) = if (Word.andb(Word.fromInt v, Word.fromInt l) <> 0w0) then (i + rshift(S.nsub, k+1), k+1) else (i, k+1) in #1 (V.foldv aux iv (0, 0)) end (* enlarge cubical "box", salvaging existing tree structure. *) fun expandBox (nd as S.Body{pos, ...}, box as S.Space{rmin, rsize, root}) = ( (intcoord (!pos, rmin, rsize); box) handle NotIntCoord => let val rmid = V.addvs (rmin, 0.5 * rsize) val rmin' = V.map3v (fn (x,y,z) => if x < y then z - rsize else z) (!pos, rmid, rmin) val rsize' = 2.0 * rsize fun mksub (v, r) = let val x = intcoord (v, rmin', rsize') val k = subindex (x, IMAXrs1) val cell = S.mkCell () in S.putCell (cell, k, r); cell end val box = (case root of S.Empty => S.Space{rmin=rmin', rsize=rsize', root=root} | _ => S.Space{ rmin = rmin', rsize = rsize', root = S.mkCellNode (mksub (rmid, root)) } (* end case *)) in expandBox (nd, box) end) (* insert a single node into the tree *) fun loadTree (body as S.Body{pos=posp, ...}, S.Space{rmin, rsize, root}) = let val xp = intcoord (!posp, rmin, rsize) fun insert (S.Empty, _) = S.mkBodyNode body | insert (n as S.Node{cell=S.BodyCell _, pos=posq, ...}, l) = let val xq = intcoord (!posq, rmin, rsize) val k = subindex (xq, l) val a = S.mkCell() in S.putCell(a, k, n); insert (S.mkCellNode a, l) end | insert (n as S.Node{cell, ...}, l) = let val k = subindex (xp, l) val subtree = insert (S.getCell (cell, k), rshift(l, 1)) in S.putCell (cell, k, subtree); n end in S.Space{rmin = rmin, rsize = rsize, root = insert (root, IMAXrs1)} end (* descend tree finding center-of-mass coordinates. *) fun hackCofM S.Empty = () | hackCofM (S.Node{cell = S.BodyCell _, ...}) = () | hackCofM (S.Node{cell = S.Cell subcells, mass, pos}) = let fun sumMass (i, totMass, cofm) = if (i < S.nsub) then (case Array.sub(subcells, i) of S.Empty => sumMass (i+1, totMass, cofm) | (nd as S.Node{mass, pos, ...}) => let val _ = hackCofM nd val m = !mass in sumMass (i+1, totMass + m, V.addv(cofm, V.mulvs(!pos, m))) end (* end case *)) else ( mass := totMass; pos := V.divvs(cofm, totMass)) in sumMass (0, 0.0, V.zerov) end (* initialize tree structure for hack force calculation. *) fun makeTree (bodies, rmin, rsize) = let fun build ([], space) = space | build ((body as S.Body{mass, ...}) :: r, space) = if Real.==(mass, 0.0) then build (r, space) else let val box = expandBox (body, space) val box = loadTree(body, box) in build (r, box) end val (space as S.Space{root, ...}) = build (bodies, S.Space{rmin=rmin, rsize=rsize, root=S.Empty}) in hackCofM root; space end end; (* functor Load *) (* grav.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * Gravity module for hierarchical N-body code; routines to compute gravity. *) signature GRAV = sig structure S : SPACE structure V : VECTOR sharing S.V = V val hackGrav : {body:S.body, root:S.node, rsize:real, tol:real, eps : real} -> {n2bterm:int, nbcterm:int, skipSelf:bool} end; (* GRAV *) functor Grav (S : SPACE) : GRAV = struct structure S = S structure V = S.V fun walk {acc0, phi0, pos0, pskip, eps, rsize, tol, root} = let val skipSelf = ref false val nbcterm = ref 0 and n2bterm = ref 0 val tolsq = (tol * tol) (* compute a single body-body or body-cell interaction. *) fun gravsub (S.Empty, phi0, acc0, _) = (phi0, acc0) | gravsub (p as S.Node{mass, pos, cell, ...}, phi0, acc0, memo) = let val (dr, drsq) = (case memo of NONE => let val dr = V.subv(!pos, pos0) in (dr, V.dotvp(dr, dr) + (eps*eps)) end | SOME(dr', drsq') => (dr', drsq' + (eps*eps)) (* end case *)) val phii = !mass / (Math.sqrt drsq) in case cell of (S.Cell _) => nbcterm := !nbcterm + 1 | _ => n2bterm := !n2bterm + 1 (* end case *); (phi0 - phii, V.addv(acc0, V.mulvs(dr, phii / drsq))) end (* gravsub *) (* recursive routine to do hackwalk operation. This combines the * subdivp and walksub routines from the C version. *) fun walksub (p, dsq, phi0, acc0) = ( (*print(implode[" walksub: dsq = ", makestring dsq, ", ", S.prNode p, "\n"]);*) case p of S.Empty => (phi0, acc0) | (S.Node{cell = S.BodyCell body, ...}) => if S.eqBody(body, pskip) then (skipSelf := true; (phi0, acc0)) else gravsub (p, phi0, acc0, NONE) | (S.Node{cell = S.Cell a, pos, ...}) => let val dr = V.subv(!pos, pos0) val drsq = V.dotvp(dr, dr) in if ((tolsq * drsq) < dsq) then let (* open p up *) fun loop (i, phi0, acc0) = if (i < S.nsub) then let val (phi0', acc0') = walksub ( Array.sub(a, i), dsq/4.0, phi0, acc0) in loop (i+1, phi0', acc0') end else (phi0, acc0) in loop (0, phi0, acc0) end else gravsub (p, phi0, acc0, SOME(dr, drsq)) end (* end case *)) val (phi0, acc0) = walksub (root, rsize*rsize, phi0, acc0) in { phi0 = phi0, acc0 = acc0, nbcterm = !nbcterm, n2bterm = !n2bterm, skip = !skipSelf } end (* walk *) (* evaluate grav field at a given particle. *) fun hackGrav {body as S.Body{pos, phi, acc, ...}, root, rsize, eps, tol} = let val {phi0, acc0, nbcterm, n2bterm, skip} = walk { acc0 = V.zerov, phi0 = 0.0, pos0 = !pos, pskip = body, eps = eps, rsize = rsize, tol = tol, root = root } in phi := phi0; acc := acc0; (** app (fn (fmt, items) => print(Format.format fmt items)) [ ("pos = [%f %f %f]\n", map Format.REAL (V.explode(!pos))), ("pos = [%f %f %f]\n", map Format.REAL (V.explode acc0)), ("phi = %f\n", [Format.REAL phi0]) ]; raise Fail ""; **) {nbcterm=nbcterm, n2bterm=n2bterm, skipSelf=skip} end (* hackgrav *) end; (* Grav *) (* data-io.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * I/O routines for export version of hierarchical N-body code. *) signature DATA_IO = sig structure S : SPACE val inputData : string -> { nbody : int, bodies : S.body list, tnow : real, headline : string } (* output routines *) val initOutput : { outfile : string, headline : string, nbody : int, tnow : real, dtime : real, eps : real, tol : real, dtout : real, tstop : real } -> unit val output : { nbody : int, bodies : S.body list, n2bcalc : int, nbccalc : int, selfint : int, tnow : real } -> unit val stopOutput : unit -> unit end; functor DataIO (S : SPACE) : DATA_IO = struct structure SS = Substring structure S = S structure V = S.V val atoi = valOf o Int.scan StringCvt.DEC SS.getc (* NOTE: this really out to be implemented using the lazy IO streams, * but SML/NJ doesn't implement these correctly yet. *) fun inputData fname = let val strm = TextIO.openIn fname val buf = ref(SS.full "") fun getLn () = (case (TextIO.inputLine strm) of NONE => raise Fail "inputData: EOF" | SOME s => buf := SS.full s (* end case *)) fun skipWS () = let val buf' = SS.dropl Char.isSpace (!buf) in if (SS.isEmpty buf') then (getLn(); skipWS()) else buf' end fun readInt () = let val (n, ss) = atoi (skipWS ()) in buf := ss; n end fun readReal () = let val (r, ss) = valOf (Real.scan SS.getc (skipWS())) in buf := ss; r end val nbody = readInt() val _ = if (nbody < 1) then raise Fail "absurd nbody" else () val ndim = readInt() val _ = if (ndim <> V.dim) then raise Fail "absurd ndim" else () val tnow = readReal() fun iter f = let fun loop (0, l) = l | loop (n, l) = loop (n-1, f() :: l) in fn n => loop (n, []) end fun readVec () = V.implode (rev (iter readReal ndim)) val massList = iter readReal nbody val posList = iter readVec nbody val velList = iter readVec nbody fun mkBodies ([], [], [], l) = l | mkBodies (m::r1, p::r2, v::r3, l) = let val b = S.Body{ mass = m, pos = ref p, vel = ref v, acc = ref V.zerov, phi = ref 0.0 } in mkBodies(r1, r2, r3, b::l) end in TextIO.closeIn strm; { nbody = nbody, bodies = mkBodies (massList, posList, velList, []), tnow = tnow, headline = concat["Hack code: input file ", fname, "\n"] } end local val timer = ref (Timer.startCPUTimer ()) in fun initTimer () = timer := Timer.startCPUTimer() fun cputime () = let val {usr, sys, ...} = Timer.checkCPUTimer(!timer) val totTim = usr in (Time.toReal totTim) / 60.0 end end type out_state = { tout : real, dtout : real, dtime : real, strm : TextIO.outstream } val outState = ref (NONE : out_state option) fun fprintf (strm, items) = TextIO.output(strm, String.concat items) fun printf items = fprintf(TextIO.stdOut, items) fun pad n s = StringCvt.padLeft #" " n s fun fmtInt (wid, i) = pad wid (Int.toString i) fun fmtReal (wid, prec, r) = pad wid (Real.fmt (StringCvt.FIX(SOME prec)) r) fun fmtRealE (wid, prec, r) = pad wid (Real.fmt (StringCvt.SCI(SOME prec)) r) local fun itemFmt r = fmtReal (9, 4, r) val fmt = V.format{lp="", sep="", rp="", cvt=itemFmt} in fun printvec (init, vec) = printf [ "\t ", pad 9 init, fmt vec, "\n" ] end (* local *) fun stopOutput () = (case (! outState) of NONE => () | (SOME{strm, ...}) => (TextIO.closeOut strm; outState := NONE) (* end case *)) fun initOutput {outfile, headline, nbody, tnow, dtime, eps, tol, dtout, tstop} = ( initTimer(); printf ["\n\t\t", headline, "\n\n"]; printf (map (pad 12) ["nbody", "dtime", "eps", "tol", "dtout", "tstop"]); printf ["\n"]; printf [fmtInt(12, nbody), fmtReal(12, 5, dtime)]; printf [ fmtInt(12, nbody), fmtReal(12, 5, dtime), fmtReal(12, 4, eps), fmtReal(12, 2, tol), fmtReal(12, 3, dtout), fmtReal(12, 2, tstop), "\n\n" ]; case outfile of "" => stopOutput() | _ => outState := SOME{ dtime = dtime, tout = tnow, dtout = dtout, strm = TextIO.openOut outfile } (* end case *)) (* compute set of dynamical diagnostics. *) fun diagnostics bodies = let fun loop ([], arg) = { mtot = #totM arg, (* total mass *) totKE = #totKE arg, (* total kinetic energy *) totPE = #totPE arg, (* total potential energy *) cOfMPos = #cOfMPos arg, (* center of mass: position *) cOfMVel = #cOfMVel arg, (* center of mass: velocity *) amVec = #amVec arg (* angular momentum vector *) } | loop (S.Body{ mass, pos=ref pos, vel=ref vel, acc=ref acc, phi=ref phi } :: r, arg) = let val velsq = V.dotvp(vel, vel) val halfMass = 0.5 * mass val posXmass = V.mulvs(pos, mass) in loop ( r, { totM = (#totM arg) + mass, totKE = (#totKE arg) + halfMass * velsq, totPE = (#totPE arg) + halfMass * phi, keTen = V.addm(#keTen arg, V.outvp(V.mulvs(vel, halfMass), vel)), peTen = V.addm(#peTen arg, V.outvp(posXmass, acc)), cOfMPos = V.addv(#cOfMPos arg, posXmass), cOfMVel = V.addv(#cOfMVel arg, V.mulvs(vel, mass)), amVec = V.addv(#amVec arg, V.mulvs(V.crossvp(pos, vel), mass)) }) end in loop (bodies, { totM = 0.0, totKE = 0.0, totPE = 0.0, keTen = V.zerom, peTen = V.zerom, cOfMPos = V.zerov, cOfMVel = V.zerov, amVec = V.zerov }) end (* diagnostics *) fun outputData (strm, tnow, nbody, bodies) = let fun outInt i = fprintf(strm, [" ", Int.toString i, "\n"]) fun outReal r = fprintf(strm, [" ", fmtRealE(21, 14, r), "\n"]) fun prReal r = fprintf(strm, [" ", fmtRealE(21, 14, r)]) fun outVec v = let fun out [] = TextIO.output(strm, "\n") | out (x::r) = (prReal x; out r) in out(V.explode v) end in outInt nbody; outInt V.dim; outReal tnow; app (fn (S.Body{mass, ...}) => outReal mass) bodies; app (fn (S.Body{pos, ...}) => outVec(!pos)) bodies; app (fn (S.Body{vel, ...}) => outVec(!vel)) bodies; printf ["\n\tparticle data written\n"] end; fun output {nbody, bodies, n2bcalc, nbccalc, selfint, tnow} = let val nttot = n2bcalc + nbccalc val nbavg = floor(real n2bcalc / real nbody) val ncavg = floor(real nbccalc / real nbody) val data = diagnostics bodies in printf ["\n"]; printf (map (pad 9) [ "tnow", "T+U", "T/U", "nttot", "nbavg", "ncavg", "selfint", "cputime" ]); printf ["\n"]; printf [ fmtReal(9, 3, tnow), fmtReal(9, 4, #totKE data + #totPE data), fmtReal(9, 4, #totKE data / #totPE data), fmtInt(9, nttot), fmtInt(9, nbavg), fmtInt(9, ncavg), fmtInt(9, selfint), fmtReal(9, 2, cputime()), "\n\n" ]; printvec ("cm pos", #cOfMPos data); printvec ("cm vel", #cOfMVel data); printvec ("am pos", #amVec data); case !outState of NONE => () | (SOME{tout, dtout, dtime, strm}) => if ((tout - 0.01 * dtime) <= tnow) then ( outputData (strm, tnow, nbody, bodies); outState := SOME{ tout=tout+dtout, dtout=dtout, dtime=dtime, strm=strm }) else () (* end case *) end end; (* DataIO *) (* getparam.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. *) structure GetParam : sig exception EOF val initParam : (string list * string list) -> unit val getParam : string -> string val getIParam : string -> int val getRParam : string -> real val getBParam : string -> bool end = struct exception EOF val defaults = ref ([] : string list) (* ignore arg vector, remember defaults. *) fun initParam (argv, defl) = defaults := defl fun prompt items = ( TextIO.output(TextIO.stdOut, String.concat items); TextIO.flushOut TextIO.stdOut) structure SS = Substring (* export version prompts user for value. *) fun getParam name = let fun scanBind [] = NONE | scanBind (s::r) = let val (_, suffix) = SS.position name (SS.full s) in if (SS.isEmpty suffix) then scanBind r else SOME(SS.string(SS.triml (size name+1) suffix)) end fun get default = (case (TextIO.inputLine TextIO.stdIn) of NONE => raise EOF | SOME "\n" => default | SOME s => substring(s, 0, size s - 1) (* end case *)) in if (null (! defaults)) then raise Fail "getParam called before initParam" else (); case (scanBind (! defaults)) of (SOME s) => ( prompt ["enter ", name, " [", s, "]: "]; get s) | NONE => (prompt ["enter ", name, ": "]; get "") (* end case *) end local fun cvt scanFn = let fun cvt' name = let fun get () = (case getParam name of "" => get () | s => s) val param = get () in (valOf (scanFn param)) handle _ => (cvt' name) end in cvt' end in (* get integer parameter *) val getIParam = cvt Int.fromString (* get real parameter *) val getRParam = cvt Real.fromString (* get bool parameter *) val getBParam = cvt Bool.fromString end (* local *) end; (* GetParam *) (* rand-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for a simple random number generator. * *) signature RAND = sig val randMin : real val randMax : real val random : real -> real (* Given seed, return value randMin <= v <= randMax * Iteratively using the value returned by random as the * next seed to random will produce a sequence of pseudo-random * numbers. *) val mkRandom : real -> unit -> real (* Given seed, return function generating a sequence of * random numbers randMin <= v <= randMax *) val norm : real -> real (* r -> r / (randMax + 1.0) *) val range : (int * int) -> real -> int (* Map v, randMin <= v <= randMax to integer range [i,j] * Exception - * BadArg if j < i *) end (* RAND *) (* rand.sml * * COPYRIGHT (c) 1991 by AT&T Bell Laboratories. See COPYRIGHT file for details * * Random number generator taken from Paulson, pp. 170-171. * Recommended by Stephen K. Park and Keith W. Miller, * Random number generators: good ones are hard to find, * CACM 31 (1988), 1192-1201 * * Note: The Random structure provides a better generator. *) structure Rand : RAND = struct (* real number version for systems with 46-bit mantissas *) val a = 16807.0 and m = 2147483647.0 val randMin = 1.0 val randMax = m - 1.0 fun random seed = let val t = a*seed in t - m * real(floor(t/m)) end fun mkRandom seed = let val seed = ref seed in fn () => (seed := random (!seed); !seed) end fun norm r = r / m fun range (i,j) = if j < i then raise Fail "Rand.range" else let val R = real(j - i + 1) in fn r => i + floor(R*(r/m)) end handle _ => let val ri = real i val R = (real j)-ri+1.0 in fn r => floor(ri + R*(r/m)) end end (* Rand *) (* main.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * This is the main driver for the Barnse-HutN-body code. *) functor Main (V : VECTOR) : sig structure S : SPACE structure V : VECTOR structure L : LOAD val srand : int -> unit (* reset the random number generator *) val testdata : int -> S.body list (* generate the Plummer model data *) val go : { output : {n2bcalc:int, nbccalc:int, nstep:int, selfint:int, tnow:real} -> unit, bodies : S.body list, tnow : real, tstop : real, dtime : real, eps : real, tol : real, rmin : real V.vec, rsize : real } -> unit val doit : unit -> unit end = struct structure V = V structure S = Space(V) structure L = Load(S) structure G = Grav(S) structure DataIO = DataIO(S) (* some math utilities *) (** NOTE: these are part of the Math structure in the new basis *) val pi = 3.14159265358979323846 fun pow(x, y) = if Real.==(y, 0.0) then 1.0 else Math.exp (y * Math.ln x) (* random numbers *) local val seed = ref 0.0 in fun srand s = (seed := real s) fun xrand (xl, xh) = let val r = Rand.random (! seed) in seed := r; xl + (((xh - xl) * r) / 2147483647.0) end end (* local *) (* default parameter values *) val defaults = [ (* file names for input/output *) "in=", (* snapshot of initial conditions *) "out=", (* stream of output snapshots *) (* params, used if no input specified, to make a Plummer Model*) "nbody=128", (* number of particles to generate *) "seed=123", (* random number generator seed *) (* params to control N-body integration *) "dtime=0.025", (* integration time-step *) "eps=0.05", (* usual potential softening *) "tol=1.0", (* cell subdivision tolerence *) "fcells=0.75", (* cell allocation parameter *) "tstop=2.0", (* time to stop integration *) "dtout=0.25", (* data-output interval *) "debug=false", (* turn on debugging messages *) "VERSION=1.0" (* JEB 06 March 1988 *) ] (* pick a random point on a sphere of specified radius. *) fun pickshell rad = let fun pickvec () = let val vec = V.tabulate (fn _ => xrand(~1.0, 1.0)) val rsq = V.dotvp(vec, vec) in if (rsq > 1.0) then pickvec () else V.mulvs (vec, rad / Math.sqrt(rsq)) end in pickvec () end (* generate Plummer model initial conditions for test runs, scaled * to units such that M = -4E = G = 1 (Henon, Hegge, etc). * See Aarseth, SJ, Henon, M, & Wielen, R (1974) Astr & Ap, 37, 183. *) fun testdata n = let val mfrac = 0.999 (* mass cut off at mfrac of total *) val rn = real n val rsc = (3.0 * pi) / 16.0 val vsc = Math.sqrt(1.0 / rsc) fun mkBodies (0, cmr, cmv, l) = let (* offset bodies by normalized cm coordinates. Also, reverse * the list to get the same order of bodies as in the C version. *) val cmr = V.divvs(cmr, rn) val cmv = V.divvs(cmv, rn) fun norm ([], l) = l | norm ((p as S.Body{pos, vel, ...}) :: r, l) = ( pos := V.subv(!pos, cmr); vel := V.subv(!vel, cmv); norm (r, p::l)) in norm (l, []) end | mkBodies (i, cmr, cmv, l) = let val r = 1.0 / Math.sqrt (pow(xrand(0.0, mfrac), ~2.0/3.0) - 1.0) val pos = pickshell (rsc * r) fun vN () = let (* von Neumann technique *) val x = xrand(0.0,1.0) val y = xrand(0.0,0.1) in if (y > x*x * (pow (1.0-x*x, 3.5))) then vN () else x end val v = ((Math.sqrt 2.0) * vN()) / pow(1.0 + r*r, 0.25) val vel = pickshell (vsc * v) val body = S.Body{ mass = 1.0 / rn, pos = ref pos, vel = ref vel, acc = ref V.zerov, phi = ref 0.0 } in mkBodies (i-1, V.addv(cmr, pos), V.addv(cmv, vel), body :: l) end in mkBodies (n, V.zerov, V.zerov, []) end (* testdata *) (* startup hierarchical N-body code. This either reads in or generates * an initial set of bodies, and other parameters. *) fun startrun argv = let val _ = GetParam.initParam(argv, defaults) val {nbody, bodies, tnow, headline} = (case (GetParam.getParam "in") of "" => let val nbody = GetParam.getIParam "nbody" in if (nbody < 1) then raise Fail "startrun: absurd nbody" else (); srand (GetParam.getIParam "seed"); { nbody = nbody, bodies = testdata nbody, tnow = 0.0, headline = "Hack code: Plummer model" } end | fname => DataIO.inputData fname (* end case *)) in { nbody = nbody, bodies = bodies, headline = headline, outfile = GetParam.getParam "out", dtime = GetParam.getRParam "dtime", eps = GetParam.getRParam "eps", tol = GetParam.getRParam "tol", tnow = tnow, tstop = GetParam.getRParam "tstop", dtout = GetParam.getRParam "dtout", debug = GetParam.getBParam "debug", rmin = V.tabulate (fn _ => ~2.0), rsize = 4.0 } end (* advance N-body system one time-step. *) fun stepSystem output {plist, dtime, eps, nstep, rmin, rsize, tnow, tol} = let val dthf = 0.5 * dtime val S.Space{rmin, rsize, root} = L.makeTree (plist, rmin, rsize) (* recalculate accelaration *) fun recalc ([], n2bcalc, nbccalc, selfint) = (n2bcalc, nbccalc, selfint) | recalc (p::r, n2bcalc, nbccalc, selfint) = let val S.Body{acc as ref acc1, vel, ...} = p val {n2bterm, nbcterm, skipSelf} = G.hackGrav { body = p, root = root, rsize = rsize, eps = eps, tol = tol } in if (nstep > 0) then (* use change in accel to make 2nd order *) (* correction to vel. *) vel := V.addv(!vel, V.mulvs(V.subv(!acc, acc1), dthf)) else (); recalc (r, n2bcalc+n2bterm, nbccalc+nbcterm, if skipSelf then selfint else (selfint+1)) end (* advance bodies *) fun advance (S.Body{pos, acc, vel, ...}) = let val dvel = V.mulvs (!acc, dthf) val vel1 = V.addv (!vel, dvel) val dpos = V.mulvs (vel1, dtime) in pos := V.addv (!pos, dpos); vel := V.addv (vel1, dvel) end val (n2bcalc, nbccalc, selfint) = recalc (plist, 0, 0, 0) in output {nstep=nstep, tnow=tnow, n2bcalc=n2bcalc, nbccalc=nbccalc, selfint=selfint}; app advance plist; (nstep+1, tnow + dtime) end (* given an initial configuration, run the simulation *) fun go { output, bodies, tnow, tstop, dtime, eps, tol, rsize, rmin } = let val step = stepSystem output fun loop (nstep, tnow) = if (tnow < tstop + (0.1 * dtime)) then loop (step { plist = bodies, dtime = dtime, eps = eps, nstep = nstep, rmin = rmin, rsize = rsize, tnow = tnow, tol = tol }) else () in loop (0, tnow) end fun doit () = let val { nbody, bodies, headline, outfile, dtime, eps, tol, tnow, tstop, dtout, debug, rsize, rmin } = startrun [] fun output {nstep, tnow, n2bcalc, nbccalc, selfint} = DataIO.output{ bodies = bodies, nbody = nbody, n2bcalc = n2bcalc, nbccalc = nbccalc, selfint = selfint, tnow = tnow } in DataIO.initOutput { outfile = outfile, headline = headline, nbody = nbody, tnow = tnow, dtime = dtime, eps = eps, tol = tol, dtout = dtout, tstop = tstop }; go { output=output, bodies=bodies, tnow=tnow, tstop=tstop, dtime=dtime, eps=eps, tol=tol, rsize=rsize, rmin=rmin }; DataIO.stopOutput() end (* doit *) end; (* Main *) (* vector3.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * 3 dimensional vector arithmetic. *) structure Vector3 : VECTOR = struct type 'a vec = {x : 'a, y : 'a, z : 'a} type realvec = real vec val dim = 3 fun tabulate f = {x = f 0, y = f 1, z = f 2} val zerov = {x = 0.0, y = 0.0, z = 0.0} fun equal({x, y, z}, {x=x1, y=y1, z=z1}) = Real.==(x, x1) andalso Real.==(y, y1) andalso Real.==(z, z1) fun addv ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x=x1+x2, y=y1+y2, z=z1+z2} fun subv ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x=x1-x2, y=y1-y2, z=z1-z2} fun dotvp ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = x1*x2 + y1*y2 + z1*z2 fun crossvp ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x = y1*z2 - z1*y2, y = x1*z2 - z1*x2, z = x1*y2 - y1*x2} fun addvs ({x, y, z} : realvec, s) = {x=x+s, y=y+s, z=z+s} fun mulvs ({x, y, z} : realvec, s) = {x=x*s, y=y*s, z=z*s} fun divvs ({x, y, z} : realvec, s) = {x=x/s, y=y/s, z=z/s} fun mapv f {x, y, z} = {x = f x, y = f y, z = f z} fun map3v f ({x=x1, y=y1, z=z1}, {x=x2, y=y2, z=z2}, {x=x3, y=y3, z=z3}) = {x = f(x1, x2, x3), y = f(y1, y2, y3), z = f(z1, z2, z3)} fun foldv f {x, y, z} init = f(z, f(y, f(x, init))) fun format {lp, rp, sep, cvt} {x, y, z} = String.concat[ lp, cvt x, sep, cvt y, sep, cvt z, rp ] fun explode {x, y, z} = [x, y, z] fun implode [x, y, z] = {x=x, y=y, z=z} | implode _ = raise Fail "implode: bad dimension" type matrix = { m00 : real, m01 : real, m02 : real, m10 : real, m11 : real, m12 : real, m20 : real, m21 : real, m22 : real } val zerom = { m00 = 0.0, m01 = 0.0, m02 = 0.0, m10 = 0.0, m11 = 0.0, m12 = 0.0, m20 = 0.0, m21 = 0.0, m22 = 0.0 } fun addm (a : matrix, b : matrix) = { m00=(#m00 a + #m00 b), m01=(#m01 a + #m01 b), m02=(#m02 a + #m02 b), m10=(#m10 a + #m10 b), m11=(#m11 a + #m11 b), m12=(#m12 a + #m12 b), m20=(#m20 a + #m20 b), m21=(#m21 a + #m21 b), m22=(#m22 a + #m22 b) } fun outvp ({x=a0, y=a1, z=a2} : realvec, {x=b0, y=b1, z=b2}) = { m00=(a0*b0), m01=(a0*b1), m02=(a0*b2), m10=(a1*b0), m11=(a1*b1), m12=(a1*b2), m20=(a2*b0), m21=(a2*b1), m22=(a2*b2) } end (* VectMath *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* load file for bmark version *) (* app use [ "rand-sig.sml", "rand.sml", "vector-sig.sml", "space.sml", "load.sml", "grav.sml", "getparam.sml", "data-io.sml", "main.sml", "vector3.sml" ]; *) structure Main : BMARK = struct structure M3 = Main(Vector3); val name = "Barnes-Hut (3d)" fun testit strm = () fun doit n = ( M3.srand 123; M3.go { output = fn _ => (), bodies = M3.testdata n, tnow = 0.0, tstop = 2.0, dtime = 0.025, eps = 0.05, tol = 1.0, rmin = M3.S.V.tabulate (fn _ => ~2.0), rsize = 4.0 }) end; mlton-20210117+dfsg/benchmark/tests/boyer.sml000066400000000000000000000614011416264345000207610ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* terms.sml: * * Manipulations over terms *) signature TERMS = sig type head; datatype term = Var of int | Prop of head * term list; datatype binding = Bind of int * term; val get: string -> head and headname: head -> string and add_lemma: term -> unit and apply_subst: binding list -> term -> term and rewrite: term -> term end; structure Terms:TERMS = struct datatype term = Var of int | Prop of { name: string, props: (term * term) list ref } * term list type head = { name: string, props: (term * term) list ref } val lemmas = ref ([] : head list) (* replacement for property lists *) fun headname {name = n, props=p} = n; fun get name = let fun get_rec ((hd1 as {name=n,...})::hdl) = if n = name then hd1 else get_rec hdl | get_rec [] = let val entry = {name = name, props = ref []} in lemmas := entry :: !lemmas; entry end in get_rec (!lemmas) end ; fun add_lemma (Prop(_, [(left as Prop({props=r,...},_)), right])) = r := (left, right) :: !r ; (* substitutions *) exception failure of string; datatype binding = Bind of int * term ; fun get_binding v = let fun get_rec [] = raise (failure "unbound") | get_rec (Bind(w,t)::rest) = if v = w then t else get_rec rest in get_rec end ; fun apply_subst alist = let fun as_rec (term as Var v) = ((get_binding v alist) handle failure _ => term) | as_rec (Prop (head,argl)) = Prop (head, map as_rec argl) in as_rec end ; exception Unify; fun unify (term1, term2) = unify1 (term1, term2, []) and unify1 (term1, term2, unify_subst) = (case term2 of Var v => ((if get_binding v unify_subst = term1 then unify_subst else raise Unify) handle failure _ => Bind(v,term1)::unify_subst) | Prop (head2,argl2) => case term1 of Var _ => raise Unify | Prop (head1,argl1) => if head1=head2 then unify1_lst (argl1, argl2, unify_subst) else raise Unify) and unify1_lst ([], [], unify_subst) = unify_subst | unify1_lst (h1::r1, h2::r2, unify_subst) = unify1_lst(r1, r2, unify1(h1, h2, unify_subst)) | unify1_lst _ = raise Unify ; fun rewrite (term as Var _) = term | rewrite (Prop ((head as {props=p,...}), argl)) = rewrite_with_lemmas (Prop (head, map rewrite argl), !p) and rewrite_with_lemmas (term, []) = term | rewrite_with_lemmas (term, (t1,t2)::rest) = rewrite (apply_subst (unify (term, t1)) t2) handle unify => rewrite_with_lemmas (term, rest) ; end; (* rules.sml: *) structure Rules = struct open Terms; datatype cterm = CVar of int | CProp of string * cterm list; fun cterm_to_term (CVar v) = Var v | cterm_to_term (CProp(p, l)) = Prop(get p, map cterm_to_term l) fun add t = add_lemma (cterm_to_term t) val _ = ( add (CProp ("equal", [CProp ("compile",[CVar 5]), CProp ("reverse", [CProp ("codegen",[CProp ("optimize",[CVar 5]), CProp ("nil",[])])])])); add (CProp ("equal", [CProp ("eqp",[CVar 23, CVar 24]), CProp ("equal",[CProp ("fix",[CVar 23]), CProp ("fix",[CVar 24])])])); add (CProp ("equal", [CProp ("gt",[CVar 23, CVar 24]), CProp ("lt",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("le",[CVar 23, CVar 24]), CProp ("ge",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("ge",[CVar 23, CVar 24]), CProp ("le",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("boolean",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("true",[])]), CProp ("equal",[CVar 23, CProp ("false",[])])])])); add (CProp ("equal", [CProp ("iff",[CVar 23, CVar 24]), CProp ("and", [CProp ("implies",[CVar 23, CVar 24]), CProp ("implies",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("even1",[CVar 23]), CProp ("if", [CProp ("zerop",[CVar 23]), CProp ("true",[]), CProp ("odd",[CProp ("sub1",[CVar 23])])])])); add (CProp ("equal", [CProp ("countps_",[CVar 11, CVar 15]), CProp ("countps_loop",[CVar 11, CVar 15, CProp ("zero",[])])])); add (CProp ("equal", [CProp ("fact_",[CVar 8]), CProp ("fact_loop",[CVar 8, CProp ("one",[])])])); add (CProp ("equal", [CProp ("reverse_",[CVar 23]), CProp ("reverse_loop",[CVar 23, CProp ("nil",[])])])); add (CProp ("equal", [CProp ("divides",[CVar 23, CVar 24]), CProp ("zerop",[CProp ("remainder",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("assume_true",[CVar 21, CVar 0]), CProp ("cons",[CProp ("cons",[CVar 21, CProp ("true",[])]), CVar 0])])); add (CProp ("equal", [CProp ("assume_false",[CVar 21, CVar 0]), CProp ("cons",[CProp ("cons",[CVar 21, CProp ("false",[])]), CVar 0])])); add (CProp ("equal", [CProp ("tautology_checker",[CVar 23]), CProp ("tautologyp",[CProp ("normalize",[CVar 23]), CProp ("nil",[])])])); add (CProp ("equal", [CProp ("falsify",[CVar 23]), CProp ("falsify1",[CProp ("normalize",[CVar 23]), CProp ("nil",[])])])); add (CProp ("equal", [CProp ("prime",[CVar 23]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 23])]), CProp ("not", [CProp ("equal",[CVar 23, CProp ("add1",[CProp ("zero",[])])])]), CProp ("prime1",[CVar 23, CProp ("sub1",[CVar 23])])])])); add (CProp ("equal", [CProp ("and",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("false",[])])])); add (CProp ("equal", [CProp ("or",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("true",[]), CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("false",[])])])); add (CProp ("equal", [CProp ("not",[CVar 15]), CProp ("if",[CVar 15, CProp ("false",[]), CProp ("true",[])])])); add (CProp ("equal", [CProp ("implies",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("true",[])])])); add (CProp ("equal", [CProp ("fix",[CVar 23]), CProp ("if",[CProp ("numberp",[CVar 23]), CVar 23, CProp ("zero",[])])])); add (CProp ("equal", [CProp ("if",[CProp ("if",[CVar 0, CVar 1, CVar 2]), CVar 3, CVar 4]), CProp ("if", [CVar 0, CProp ("if",[CVar 1, CVar 3, CVar 4]), CProp ("if",[CVar 2, CVar 3, CVar 4])])])); add (CProp ("equal", [CProp ("zerop",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("not",[CProp ("numberp",[CVar 23])])])])); add (CProp ("equal", [CProp ("plus",[CProp ("plus",[CVar 23, CVar 24]), CVar 25]), CProp ("plus",[CVar 23, CProp ("plus",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("equal",[CProp ("plus",[CVar 0, CVar 1]), CProp ("zero",[])]), CProp ("and",[CProp ("zerop",[CVar 0]), CProp ("zerop",[CVar 1])])])); add (CProp ("equal",[CProp ("difference",[CVar 23, CVar 23]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("equal", [CProp ("plus",[CVar 0, CVar 1]), CProp ("plus",[CVar 0, CVar 2])]), CProp ("equal",[CProp ("fix",[CVar 1]), CProp ("fix",[CVar 2])])])); add (CProp ("equal", [CProp ("equal",[CProp ("zero",[]), CProp ("difference",[CVar 23, CVar 24])]), CProp ("not",[CProp ("gt",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("equal",[CVar 23, CProp ("difference",[CVar 23, CVar 24])]), CProp ("and", [CProp ("numberp",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("zerop",[CVar 24])])])])); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("append",[CVar 23, CVar 24])]), CVar 0]), CProp ("plus", [CProp ("meaning",[CProp ("plus_tree",[CVar 23]), CVar 0]), CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0])])])); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("plus_fringe",[CVar 23])]), CVar 0]), CProp ("fix",[CProp ("meaning",[CVar 23, CVar 0])])])); add (CProp ("equal", [CProp ("append",[CProp ("append",[CVar 23, CVar 24]), CVar 25]), CProp ("append",[CVar 23, CProp ("append",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("reverse",[CProp ("append",[CVar 0, CVar 1])]), CProp ("append",[CProp ("reverse",[CVar 1]), CProp ("reverse",[CVar 0])])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("plus",[CVar 24, CVar 25])]), CProp ("plus", [CProp ("times",[CVar 23, CVar 24]), CProp ("times",[CVar 23, CVar 25])])])); add (CProp ("equal", [CProp ("times",[CProp ("times",[CVar 23, CVar 24]), CVar 25]), CProp ("times",[CVar 23, CProp ("times",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("equal",[CProp ("times",[CVar 23, CVar 24]), CProp ("zero",[])]), CProp ("or",[CProp ("zerop",[CVar 23]), CProp ("zerop",[CVar 24])])])); add (CProp ("equal", [CProp ("exec",[CProp ("append",[CVar 23, CVar 24]), CVar 15, CVar 4]), CProp ("exec",[CVar 24, CProp ("exec",[CVar 23, CVar 15, CVar 4]), CVar 4])])); add (CProp ("equal", [CProp ("mc_flatten",[CVar 23, CVar 24]), CProp ("append",[CProp ("flatten",[CVar 23]), CVar 24])])); add (CProp ("equal", [CProp ("member",[CVar 23, CProp ("append",[CVar 0, CVar 1])]), CProp ("or", [CProp ("member",[CVar 23, CVar 0]), CProp ("member",[CVar 23, CVar 1])])])); add (CProp ("equal", [CProp ("member",[CVar 23, CProp ("reverse",[CVar 24])]), CProp ("member",[CVar 23, CVar 24])])); add (CProp ("equal", [CProp ("length",[CProp ("reverse",[CVar 23])]), CProp ("length",[CVar 23])])); add (CProp ("equal", [CProp ("member",[CVar 0, CProp ("intersect",[CVar 1, CVar 2])]), CProp ("and", [CProp ("member",[CVar 0, CVar 1]), CProp ("member",[CVar 0, CVar 2])])])); add (CProp ("equal",[CProp ("nth",[CProp ("zero",[]), CVar 8]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("exp",[CVar 8, CProp ("plus",[CVar 9, CVar 10])]), CProp ("times", [CProp ("exp",[CVar 8, CVar 9]), CProp ("exp",[CVar 8, CVar 10])])])); add (CProp ("equal", [CProp ("exp",[CVar 8, CProp ("times",[CVar 9, CVar 10])]), CProp ("exp",[CProp ("exp",[CVar 8, CVar 9]), CVar 10])])); add (CProp ("equal", [CProp ("reverse_loop",[CVar 23, CVar 24]), CProp ("append",[CProp ("reverse",[CVar 23]), CVar 24])])); add (CProp ("equal", [CProp ("reverse_loop",[CVar 23, CProp ("nil",[])]), CProp ("reverse",[CVar 23])])); add (CProp ("equal", [CProp ("count_list",[CVar 25, CProp ("sort_lp",[CVar 23, CVar 24])]), CProp ("plus", [CProp ("count_list",[CVar 25, CVar 23]), CProp ("count_list",[CVar 25, CVar 24])])])); add (CProp ("equal", [CProp ("equal", [CProp ("append",[CVar 0, CVar 1]), CProp ("append",[CVar 0, CVar 2])]), CProp ("equal",[CVar 1, CVar 2])])); add (CProp ("equal", [CProp ("plus", [CProp ("remainder",[CVar 23, CVar 24]), CProp ("times",[CVar 24, CProp ("quotient",[CVar 23, CVar 24])])]), CProp ("fix",[CVar 23])])); add (CProp ("equal", [CProp ("power_eval",[CProp ("big_plus",[CVar 11, CVar 8, CVar 1]), CVar 1]), CProp ("plus",[CProp ("power_eval",[CVar 11, CVar 1]), CVar 8])])); add (CProp ("equal", [CProp ("power_eval", [CProp ("big_plus",[CVar 23, CVar 24, CVar 8, CVar 1]), CVar 1]), CProp ("plus", [CVar 8, CProp ("plus", [CProp ("power_eval",[CVar 23, CVar 1]), CProp ("power_eval",[CVar 24, CVar 1])])])])); add (CProp ("equal", [CProp ("remainder",[CVar 24, CProp ("one",[])]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("lt",[CProp ("remainder",[CVar 23, CVar 24]), CVar 24]), CProp ("not",[CProp ("zerop",[CVar 24])])])); add (CProp ("equal",[CProp ("remainder",[CVar 23, CVar 23]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("lt",[CProp ("quotient",[CVar 8, CVar 9]), CVar 8]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 8])]), CProp ("or", [CProp ("zerop",[CVar 9]), CProp ("not",[CProp ("equal",[CVar 9, CProp ("one",[])])])])])])); add (CProp ("equal", [CProp ("lt",[CProp ("remainder",[CVar 23, CVar 24]), CVar 23]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 24])]), CProp ("not",[CProp ("zerop",[CVar 23])]), CProp ("not",[CProp ("lt",[CVar 23, CVar 24])])])])); add (CProp ("equal", [CProp ("power_eval",[CProp ("power_rep",[CVar 8, CVar 1]), CVar 1]), CProp ("fix",[CVar 8])])); add (CProp ("equal", [CProp ("power_eval", [CProp ("big_plus", [CProp ("power_rep",[CVar 8, CVar 1]), CProp ("power_rep",[CVar 9, CVar 1]), CProp ("zero",[]), CVar 1]), CVar 1]), CProp ("plus",[CVar 8, CVar 9])])); add (CProp ("equal", [CProp ("gcd",[CVar 23, CVar 24]), CProp ("gcd",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("nth",[CProp ("append",[CVar 0, CVar 1]), CVar 8]), CProp ("append", [CProp ("nth",[CVar 0, CVar 8]), CProp ("nth", [CVar 1, CProp ("difference",[CVar 8, CProp ("length",[CVar 0])])])])])); add (CProp ("equal", [CProp ("difference",[CProp ("plus",[CVar 23, CVar 24]), CVar 23]), CProp ("fix",[CVar 24])])); add (CProp ("equal", [CProp ("difference",[CProp ("plus",[CVar 24, CVar 23]), CVar 23]), CProp ("fix",[CVar 24])])); add (CProp ("equal", [CProp ("difference", [CProp ("plus",[CVar 23, CVar 24]), CProp ("plus",[CVar 23, CVar 25])]), CProp ("difference",[CVar 24, CVar 25])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("difference",[CVar 2, CVar 22])]), CProp ("difference", [CProp ("times",[CVar 2, CVar 23]), CProp ("times",[CVar 22, CVar 23])])])); add (CProp ("equal", [CProp ("remainder",[CProp ("times",[CVar 23, CVar 25]), CVar 25]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("difference", [CProp ("plus",[CVar 1, CProp ("plus",[CVar 0, CVar 2])]), CVar 0]), CProp ("plus",[CVar 1, CVar 2])])); add (CProp ("equal", [CProp ("difference", [CProp ("add1",[CProp ("plus",[CVar 24, CVar 25])]), CVar 25]), CProp ("add1",[CVar 24])])); add (CProp ("equal", [CProp ("lt", [CProp ("plus",[CVar 23, CVar 24]), CProp ("plus",[CVar 23, CVar 25])]), CProp ("lt",[CVar 24, CVar 25])])); add (CProp ("equal", [CProp ("lt", [CProp ("times",[CVar 23, CVar 25]), CProp ("times",[CVar 24, CVar 25])]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 25])]), CProp ("lt",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("lt",[CVar 24, CProp ("plus",[CVar 23, CVar 24])]), CProp ("not",[CProp ("zerop",[CVar 23])])])); add (CProp ("equal", [CProp ("gcd", [CProp ("times",[CVar 23, CVar 25]), CProp ("times",[CVar 24, CVar 25])]), CProp ("times",[CVar 25, CProp ("gcd",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("value",[CProp ("normalize",[CVar 23]), CVar 0]), CProp ("value",[CVar 23, CVar 0])])); add (CProp ("equal", [CProp ("equal", [CProp ("flatten",[CVar 23]), CProp ("cons",[CVar 24, CProp ("nil",[])])]), CProp ("and", [CProp ("nlistp",[CVar 23]), CProp ("equal",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("listp",[CProp ("gother",[CVar 23])]), CProp ("listp",[CVar 23])])); add (CProp ("equal", [CProp ("samefringe",[CVar 23, CVar 24]), CProp ("equal",[CProp ("flatten",[CVar 23]), CProp ("flatten",[CVar 24])])])); add (CProp ("equal", [CProp ("equal", [CProp ("greatest_factor",[CVar 23, CVar 24]), CProp ("zero",[])]), CProp ("and", [CProp ("or", [CProp ("zerop",[CVar 24]), CProp ("equal",[CVar 24, CProp ("one",[])])]), CProp ("equal",[CVar 23, CProp ("zero",[])])])])); add (CProp ("equal", [CProp ("equal", [CProp ("greatest_factor",[CVar 23, CVar 24]), CProp ("one",[])]), CProp ("equal",[CVar 23, CProp ("one",[])])])); add (CProp ("equal", [CProp ("numberp",[CProp ("greatest_factor",[CVar 23, CVar 24])]), CProp ("not", [CProp ("and", [CProp ("or", [CProp ("zerop",[CVar 24]), CProp ("equal",[CVar 24, CProp ("one",[])])]), CProp ("not",[CProp ("numberp",[CVar 23])])])])])); add (CProp ("equal", [CProp ("times_list",[CProp ("append",[CVar 23, CVar 24])]), CProp ("times", [CProp ("times_list",[CVar 23]), CProp ("times_list",[CVar 24])])])); add (CProp ("equal", [CProp ("prime_list",[CProp ("append",[CVar 23, CVar 24])]), CProp ("and", [CProp ("prime_list",[CVar 23]), CProp ("prime_list",[CVar 24])])])); add (CProp ("equal", [CProp ("equal",[CVar 25, CProp ("times",[CVar 22, CVar 25])]), CProp ("and", [CProp ("numberp",[CVar 25]), CProp ("or", [CProp ("equal",[CVar 25, CProp ("zero",[])]), CProp ("equal",[CVar 22, CProp ("one",[])])])])])); add (CProp ("equal", [CProp ("ge",[CVar 23, CVar 24]), CProp ("not",[CProp ("lt",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("equal",[CVar 23, CProp ("times",[CVar 23, CVar 24])]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("and", [CProp ("numberp",[CVar 23]), CProp ("equal",[CVar 24, CProp ("one",[])])])])])); add (CProp ("equal", [CProp ("remainder",[CProp ("times",[CVar 24, CVar 23]), CVar 24]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("equal",[CProp ("times",[CVar 0, CVar 1]), CProp ("one",[])]), CProp ("and", [CProp ("not",[CProp ("equal",[CVar 0, CProp ("zero",[])])]), CProp ("not",[CProp ("equal",[CVar 1, CProp ("zero",[])])]), CProp ("numberp",[CVar 0]), CProp ("numberp",[CVar 1]), CProp ("equal",[CProp ("sub1",[CVar 0]), CProp ("zero",[])]), CProp ("equal",[CProp ("sub1",[CVar 1]), CProp ("zero",[])])])])); add (CProp ("equal", [CProp ("lt", [CProp ("length",[CProp ("delete",[CVar 23, CVar 11])]), CProp ("length",[CVar 11])]), CProp ("member",[CVar 23, CVar 11])])); add (CProp ("equal", [CProp ("sort2",[CProp ("delete",[CVar 23, CVar 11])]), CProp ("delete",[CVar 23, CProp ("sort2",[CVar 11])])])); add (CProp ("equal",[CProp ("dsort",[CVar 23]), CProp ("sort2",[CVar 23])])); add (CProp ("equal", [CProp ("length", [CProp ("cons", [CVar 0, CProp ("cons", [CVar 1, CProp ("cons", [CVar 2, CProp ("cons", [CVar 3, CProp ("cons",[CVar 4, CProp ("cons",[CVar 5, CVar 6])])])])])])]) , CProp ("plus",[CProp ("six",[]), CProp ("length",[CVar 6])])])); add (CProp ("equal", [CProp ("difference", [CProp ("add1",[CProp ("add1",[CVar 23])]), CProp ("two",[])]), CProp ("fix",[CVar 23])])); add (CProp ("equal", [CProp ("quotient", [CProp ("plus",[CVar 23, CProp ("plus",[CVar 23, CVar 24])]), CProp ("two",[])]), CProp ("plus",[CVar 23, CProp ("quotient",[CVar 24, CProp ("two",[])])])])); add (CProp ("equal", [CProp ("sigma",[CProp ("zero",[]), CVar 8]), CProp ("quotient", [CProp ("times",[CVar 8, CProp ("add1",[CVar 8])]), CProp ("two",[])])])); add (CProp ("equal", [CProp ("plus",[CVar 23, CProp ("add1",[CVar 24])]), CProp ("if", [CProp ("numberp",[CVar 24]), CProp ("add1",[CProp ("plus",[CVar 23, CVar 24])]), CProp ("add1",[CVar 23])])])); add (CProp ("equal", [CProp ("equal", [CProp ("difference",[CVar 23, CVar 24]), CProp ("difference",[CVar 25, CVar 24])]), CProp ("if", [CProp ("lt",[CVar 23, CVar 24]), CProp ("not",[CProp ("lt",[CVar 24, CVar 25])]), CProp ("if", [CProp ("lt",[CVar 25, CVar 24]), CProp ("not",[CProp ("lt",[CVar 24, CVar 23])]), CProp ("equal",[CProp ("fix",[CVar 23]), CProp ("fix",[CVar 25])])])])]) ); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("delete",[CVar 23, CVar 24])]), CVar 0]), CProp ("if", [CProp ("member",[CVar 23, CVar 24]), CProp ("difference", [CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0]), CProp ("meaning",[CVar 23, CVar 0])]), CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0])])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("add1",[CVar 24])]), CProp ("if", [CProp ("numberp",[CVar 24]), CProp ("plus", [CVar 23, CProp ("times",[CVar 23, CVar 24]), CProp ("fix",[CVar 23])])])])); add (CProp ("equal", [CProp ("nth",[CProp ("nil",[]), CVar 8]), CProp ("if",[CProp ("zerop",[CVar 8]), CProp ("nil",[]), CProp ("zero",[])])])); add (CProp ("equal", [CProp ("last",[CProp ("append",[CVar 0, CVar 1])]), CProp ("if", [CProp ("listp",[CVar 1]), CProp ("last",[CVar 1]), CProp ("if", [CProp ("listp",[CVar 0]), CProp ("cons",[CProp ("car",[CProp ("last",[CVar 0])]), CVar 1]), CVar 1])])])); add (CProp ("equal", [CProp ("equal",[CProp ("lt",[CVar 23, CVar 24]), CVar 25]), CProp ("if", [CProp ("lt",[CVar 23, CVar 24]), CProp ("equal",[CProp ("true",[]), CVar 25]), CProp ("equal",[CProp ("false",[]), CVar 25])])])); add (CProp ("equal", [CProp ("assignment",[CVar 23, CProp ("append",[CVar 0, CVar 1])]), CProp ("if", [CProp ("assignedp",[CVar 23, CVar 0]), CProp ("assignment",[CVar 23, CVar 0]), CProp ("assignment",[CVar 23, CVar 1])])])); add (CProp ("equal", [CProp ("car",[CProp ("gother",[CVar 23])]), CProp ("if", [CProp ("listp",[CVar 23]), CProp ("car",[CProp ("flatten",[CVar 23])]), CProp ("zero",[])])])); add (CProp ("equal", [CProp ("flatten",[CProp ("cdr",[CProp ("gother",[CVar 23])])]), CProp ("if", [CProp ("listp",[CVar 23]), CProp ("cdr",[CProp ("flatten",[CVar 23])]), CProp ("cons",[CProp ("zero",[]), CProp ("nil",[])])])])); add (CProp ("equal", [CProp ("quotient",[CProp ("times",[CVar 24, CVar 23]), CVar 24]), CProp ("if", [CProp ("zerop",[CVar 24]), CProp ("zero",[]), CProp ("fix",[CVar 23])])])); add (CProp ("equal", [CProp ("get",[CVar 9, CProp ("set",[CVar 8, CVar 21, CVar 12])]), CProp ("if", [CProp ("eqp",[CVar 9, CVar 8]), CVar 21, CProp ("get",[CVar 9, CVar 12])])]))) end; (* Rules *) (* boyer.sml: * * Tautology checker *) signature BOYER = sig include TERMS val tautp: term -> bool end structure Boyer: BOYER = struct open Terms fun mem x [] = false | mem x (y::L) = x=y orelse mem x L fun truep (x, lst) = case x of Prop(head, _) => headname head = "true" orelse mem x lst | _ => mem x lst and falsep (x, lst) = case x of Prop(head, _) => headname head = "false" orelse mem x lst | _ => mem x lst fun tautologyp (x, true_lst, false_lst) = if truep (x, true_lst) then true else if falsep (x, false_lst) then false else (case x of Var _ => false | Prop (head,[test, yes, no]) => if headname head = "if" then if truep (test, true_lst) then tautologyp (yes, true_lst, false_lst) else if falsep (test, false_lst) then tautologyp (no, true_lst, false_lst) else tautologyp (yes, test::true_lst, false_lst) andalso tautologyp (no, true_lst, test::false_lst) else false) fun tautp x = tautologyp(rewrite x, [], []); end; (* Boyer *) signature BMARK = sig val doit : unit -> unit val testit : TextIO.outstream -> unit end; (* the benchmark *) structure Main : BMARK = struct open Terms; open Boyer; val subst = [Bind(23, Prop (get "f", [Prop (get "plus", [Prop (get "plus",[Var 0, Var 1]), Prop (get "plus",[Var 2, Prop (get "zero",[])])])])), Bind(24, Prop (get "f", [Prop (get "times", [Prop (get "times",[Var 0, Var 1]), Prop (get "plus",[Var 2, Var 3])])])), Bind(25, Prop (get "f", [Prop (get "reverse", [Prop (get "append", [Prop (get "append",[Var 0, Var 1]), Prop (get "nil",[])])])])), Bind(20, Prop (get "equal", [Prop (get "plus",[Var 0, Var 1]), Prop (get "difference",[Var 23, Var 24])])), Bind(22, Prop (get "lt", [Prop (get "remainder",[Var 0, Var 1]), Prop (get "member",[Var 0, Prop (get "length",[Var 1])])]))] val term = Prop (get "implies", [Prop (get "and", [Prop (get "implies",[Var 23, Var 24]), Prop (get "and", [Prop (get "implies",[Var 24, Var 25]), Prop (get "and", [Prop (get "implies",[Var 25, Var 20]), Prop (get "implies",[Var 20, Var 22])])])]), Prop (get "implies",[Var 23, Var 22])]) fun testit outstrm = if tautp (apply_subst subst term) then TextIO.output (outstrm, "Proved!\n") else TextIO.output (outstrm, "Cannot prove!\n") fun doit () = (tautp (apply_subst subst term); ()) end; (* Main *) structure Main = struct val doit = fn n => let fun loop n = if n = 0 then () else (Main.doit (); loop(n-1)) in loop n end end; mlton-20210117+dfsg/benchmark/tests/checksum.sml000066400000000000000000000021571416264345000214460ustar00rootroot00000000000000(* Author: sweeks@sweeks.com * This code is based on the following paper. * The Performance of FoxNet 2.0 * Herb Derby * CMU-CS-99-137 * June 1999 *) fun checkOne (new, ac) = let open Word32 in ac + >> (new, 0w16) + andb (new, 0wxFFFF) end fun fold f b (buf, first, last) = let fun loop (i, ac) = if i > last then ac else loop (i + 1, f (Word32.fromLarge (PackWord32Little.subArr (buf, i)), ac)) in loop (first, b) end fun checksum buf = fold checkOne 0w0 buf structure Main = struct fun doit n = let val first = 0 val size = 10000000 val buf = Word8Array.array (size, 0w0) val bytesPerWord = 4 val last = size div bytesPerWord - 1 val rec loop = fn 0 => () | n => let val w = checksum (buf, first, last) val _ = if w <> 0w0 then raise Fail "bug" else () in loop (n - 1) end in loop n end end mlton-20210117+dfsg/benchmark/tests/count-graphs.sml000066400000000000000000000560231416264345000222570ustar00rootroot00000000000000(* Written by Henry Cejtin (henry@sourcelight.com). *) fun print _ = () (* * My favorite high-order procedure. *) fun fold (lst, folder, state) = let fun loop (lst, state) = case lst of [] => state | first::rest => loop (rest, folder (first, state)) in loop (lst, state) end fun naturalFold (limit, folder, state) = if limit < 0 then raise Domain else let fun loop (i, state) = if i = limit then state else loop (i+1, folder (i, state)) in loop (0, state) end fun naturalAny (limit, ok) = if limit < 0 then raise Domain else let fun loop i = i <> limit andalso (ok i orelse loop (i+1)) in loop 0 end fun naturalAll (limit, ok) = if limit < 0 then raise Domain else let fun loop i = i = limit orelse (ok i andalso loop (i+1)) in loop 0 end (* * Fold over all permutations. * Universe is a list of all the items to be permuted. * pFolder is used to build up the permutation. It is called via * pFolder (next, pState, state, accross) * where next is the next item in the permutation, pState is the * partially constructed permutation and state is the current fold * state over permutations that have already been considered. * If pFolder knows what will result from folding over all permutations * descending from the resulting partial permutation (starting at state), * it should raise the accross exception carrying the new state value. * If pFolder wants to continue building up the permutation, it should * return (newPState, newState). * When a permutation has been completely constructed, folder is called * via * folder (pState, state) * where pState is the final pState and state is the current state. * It should return the new state. *) fun 'a foldOverPermutations (universe, pFolder, pState, folder, state: 'a) = let exception accross of 'a fun outer (universe, pState, state) = case universe of [] => folder (pState, state) | first::rest => let fun inner (first, rest, revOut, state) = let val state = let val (newPState, state) = pFolder (first, pState, state, accross) in outer (fold (revOut, op ::, rest), newPState, state) end handle accross state => state in case rest of [] => state | second::rest => inner (second, rest, first::revOut, state) end in inner (first, rest, [], state) end in outer (universe, pState, state) end (* * Fold over all arrangements of bag elements. * Universe is a list of lists of items, with equivalent items in the * same list. * pFolder is used to build up the permutation. It is called via * pFolder (next, pState, state, accross) * where next is the next item in the permutation, pState is the * partially constructed permutation and state is the current fold * state over permutations that have already been considered. * If pFolder knows what will result from folding over all permutations * descending from the resulting partial permutation (starting at state), * it should raise the accross exception carrying the new state value. * If pFolder wants to continue building up the permutation, it should * return (newPState, newState). * When a permutation has been completely constructed, folder is called * via * folder (pState, state) * where pState is the final pState and state is the current state. * It should return the new state. *) fun 'a foldOverBagPerms (universe, pFolder, pState, folder, state: 'a) = let exception accross of 'a fun outer (universe, pState, state) = case universe of [] => folder (pState, state) | (fbag as (first::fclone))::rest => let fun inner (fbag, first, fclone, rest, revOut, state) = let val state = let val (newPState, state) = pFolder (first, pState, state, accross) in outer (fold (revOut, op ::, case fclone of [] => rest | _ => fclone::rest), newPState, state) end handle accross state => state in case rest of [] => state | (sbag as (second::sclone))::rest => inner (sbag, second, sclone, rest, fbag::revOut, state) end in inner (fbag, first, fclone, rest, [], state) end in outer (universe, pState, state) end (* * Fold over the tree of subsets of the elements of universe. * The tree structure comes from the root picking if the first element * is in the subset, etc. * eFolder is called to build up the subset given a decision on wether * or not a given element is in it or not. It is called via * eFolder (elem, isinc, eState, state, fini) * If this determines the result of folding over all the subsets consistant * with the choice so far, then eFolder should raise the exception * fini newState * If we need to proceed deeper in the tree, then eFolder should return * the tuple * (newEState, newState) * folder is called to buld up the final state, folding over subsets * (represented as the terminal eStates). It is called via * folder (eState, state) * It returns the new state. * Note, the order in which elements are folded (via eFolder) is the same * as the order in universe. *) fun 'a foldOverSubsets (universe, eFolder, eState, folder, state: 'a) = let exception fini of 'a fun f (first, rest, eState) (isinc, state) = let val (newEState, newState) = eFolder (first, isinc, eState, state, fini) in outer (rest, newEState, newState) end handle fini state => state and outer (universe, eState, state) = case universe of [] => folder (eState, state) | first::rest => let val f = f (first, rest, eState) in f (false, f (true, state)) end in outer (universe, eState, state) end fun f universe = foldOverSubsets (universe, fn (elem, isinc, set, state, _) => (if isinc then elem::set else set, state), [], fn (set, sets) => set::sets, []) (* * Given a partitioning of [0, size) into equivalence classes (as a list * of the classes, where each class is a list of integers), and where two * vertices are equivalent iff transposing the two is an automorphism * of the full subgraph on the vertices [0, size), return the equivalence * classes for the graph. The graph is provided as a connection function. * In the result, two equivalent vertices in [0, size) remain equivalent * iff they are either both connected or neither is connected to size. * The vertex size is equivalent to a vertex x in [0, size) iff * connected (size, y) = connected (x, if y = x then size else y) * for all y in [0, size). *) fun refine (size: int, classes: int list list, connected: int*int -> bool): int list list = let fun sizeMatch x = (* Check if vertex size is equivalent to vertex x. *) naturalAll (size, fn y => connected (size, y) = connected (x, if y = x then size else y)) fun merge (class, (merged, classes)) = (* Add class into classes, testing if size should be merged. *) if merged then (true, (rev class)::classes) else let val first::_ = class in if sizeMatch first then (true, fold (class, op ::, [size])::classes) else (false, (rev class)::classes) end fun split (elem, (yes, no)) = if connected (elem, size) then (elem::yes, no) else (yes, elem::no) fun subdivide (class, state) = case class of [first] => merge (class, state) | _ => case fold (class, split, ([], [])) of ([], no) => merge (no, state) | (yes, []) => merge (yes, state) | (yes, no) => merge (no, merge (yes, state)) in case fold (classes, subdivide, (false, [])) of (true, classes) => rev classes | (false, classes) => fold (classes, op ::, [[size]]) end (* * Given a count of the number of vertices, a partitioning of the vertices * into equivalence classes (where two vertices are equivalent iff * transposing them is a graph automorphism), and a function which, given * two distinct vertices, returns a bool indicating if there is an edge * connecting them, check if the graph is minimal. * If it is, return * SOME how-many-clones-we-walked-through * If not, return NONE. * A graph is minimal iff its connection matrix is (weakly) smaller * then all its permuted friends, where true is less than false, and * the entries are compared lexicographically in the following order: * - * 0 - * 1 2 - * 3 4 5 - * ... * Note, the vertices are the integers in [0, nverts). *) fun minimal (nverts: int, classes: int list list, connected: int*int -> bool): int option = let val perm = Array.array (nverts, ~1) exception fini fun pFolder (new, old, state, accross) = let fun loop v = if v = old then (Array.update (perm, old, new); (old + 1, state)) else case (connected (old, v), connected (new, Array.sub (perm, v))) of (true, false) => raise (accross state) | (false, true) => raise fini | _ => loop (v + 1) in loop 0 end fun folder (_, state) = state + 1 in SOME (foldOverBagPerms ( classes, pFolder, 0, folder, 0)) handle fini => NONE end (* * Fold over the tree of graphs. * * eFolder is used to fold over the choice of edges via * eFolder (from, to, isinc, eState, state, accross) * with from > to. * * If eFolder knows the result of folding over all graphs which agree * with the currently made decisions, then it should raise the accross * exception carrying the resulting state as a value. * * To continue normally, it should return the tuple * (newEState, newState) * * When all decisions are made with regards to edges from `from', folder * is called via * folder (size, eState, state, accross) * where size is the number of vertices in the graph (the last from+1) and * eState is the final eState for edges from `from'. * * If folder knows the result of folding over all extensions of this graph, * it should raise accross carrying the resulting state as a value. * * If extensions of this graph should be folded over, it should return * the new state. *) fun ('a, 'b) foldOverGraphs (eFolder, eState: 'a, folder, state: 'b) = let exception noextend of 'b fun makeVertss limit = Vector.tabulate (limit, fn nverts => List.tabulate (nverts, fn v => v)) val vertss = ref (makeVertss 0) fun findVerts size = ( if size >= Vector.length (!vertss) then vertss := makeVertss (size + 1) else (); Vector.sub (!vertss, size)) fun f (size, eState, state) = let val state = folder (size, eState, state, noextend) in g (size+1, state) end handle noextend state => state and g (size, state) = let val indices = findVerts (size - 1) fun SeFolder (to, isinc, eState, state, accross) = eFolder (size-1, to, isinc, eState, state, accross) fun Sf (eState, state) = f (size, eState, state) in foldOverSubsets ( indices, SeFolder, eState, Sf, state) end in f (0, eState, state) end (* * Given the size of a graph, a list of the vertices (the integers in * [0, size)), and the connected function, check if for all full subgraphs, * 3*V - 4 - 2*E >= 0 or V <= 1 * where V is the number of vertices and E is the number of edges. *) local fun short lst = case lst of [] => true | [_] => true | _ => false in fun okSoFar (size, verts, connected) = let exception fini of unit fun eFolder (elem, isinc, eState as (ac, picked), _, accross) = (if isinc then (fold (picked, fn (p, ac) => if connected (elem, p) then ac - 2 else ac, ac + 3), elem::picked) else eState, ()) fun folder ((ac, picked), state) = if ac >= 0 orelse short picked then state else raise (fini ()) in (foldOverSubsets ( verts, eFolder, (~4, []), folder, ()); true) handle fini () => false end end fun showGraph (size, connected) = naturalFold (size, fn (from, _) => ( print ((Int.toString from) ^ ":"); naturalFold (size, fn (to, _) => if from <> to andalso connected (from, to) then print (" " ^ (Int.toString to)) else (), ()); print "\n"), ()); fun showList (start, sep, stop, trans) lst = ( start (); case lst of [] => () | first::rest => ( trans first; fold (rest, fn (item, _) => ( sep (); trans item), ())); stop ()) val showIntList = showList ( fn () => print "[", fn () => print ", ", fn () => print "]", fn i => print (Int.toString i)) val showIntListList = showList ( fn () => print "[", fn () => print ", ", fn () => print "]", showIntList) fun h (maxSize, folder, state) = let val ctab = Array.tabulate (maxSize, fn v => Array.array (v, false)) val classesv = Array.array (maxSize+1, []) fun connected (from, to) = let val (from, to) = if from > to then (from, to) else (to, from) in Array.sub (Array.sub (ctab, from), to) end fun update (from, to, value) = let val (from, to) = if from > to then (from, to) else (to, from) in Array.update (Array.sub (ctab, from), to, value) end fun triangle (vnum, e) = naturalAny (e, fn f => connected (vnum, f) andalso connected (e, f)) fun eFolder (from, to, isinc, _, state, accross) = if isinc andalso triangle (from, to) then raise (accross state) else ( update (from, to, isinc); ((), state)) fun Gfolder (size, _, state, accross) = ( if size <> 0 then Array.update (classesv, size, refine (size-1, Array.sub (classesv, size-1), connected)) else (); case minimal (size, Array.sub (classesv, size), connected) of NONE => raise (accross state) | SOME eatMe => if okSoFar (size, List.tabulate (size, fn v => v), connected) then let val state = folder (size, connected, state) in if size = maxSize then raise (accross state) else state end else raise (accross state)) in foldOverGraphs (eFolder, (), Gfolder, state) end local fun final (size: int, connected: int * int -> bool): int = naturalFold (size, fn (from, ac) => naturalFold (from, fn (to, ac) => if connected (from, to) then ac - 2 else ac, ac), 3*size - 4) in fun f maxSize = h (maxSize, fn (size, connected, state) => if final (size, connected) = 0 then state + 1 else state, 0) end fun doOne arg = ( print (arg ^ " -> "); case Int.fromString arg of SOME n => print ((Int.toString (f n)) ^ "\n") | NONE => print "NOT A NUMBER\n") structure Main = struct fun doit() = List.app doOne ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"] val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/even-odd.sml000066400000000000000000000007661416264345000213510ustar00rootroot00000000000000local fun even' 0 = true | even' i = odd' (i-1) and odd' 0 = false | odd' i = even' (i-1) in fun even i = even' (abs i) fun odd i = odd' (abs i) end structure Main = struct fun doit n = if n = 0 then () else let val _ = if (even 500000000) <> not (odd 500000000) then raise Fail "bug" else () in doit (n - 1) end end mlton-20210117+dfsg/benchmark/tests/fft.sml000066400000000000000000000201261416264345000204170ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) fun print _ = () signature BMARK = sig val doit : int -> unit end; structure Main: BMARK = struct local open Array Math val printr = print o (Real.fmt (StringCvt.SCI(SOME 14))) val printi = print o Int.toString in val PI = 3.14159265358979323846 val tpi = 2.0 * PI (* fun trace(name,f) x = (print name ; print "(" ; printr x ; print ") = " ; let val y = f x in printr y ; print "\n" ; y end) fun trace2(name,f) (x,y) = (printr x ; print " "; print name ; print " "; printr y ; print " = " ; let val z = f(x,y) in printr z ; print "\n" ; z end) fun trace2(_,f) = f val op * = trace2("*", Real.* ) val op - = trace2("-", Real.-) val op + = trace2("+", Real.+) local nonfix * + - in _overload * : ('a * 'a -> 'a) as Int.* and * _overload + : ('a * 'a -> 'a) as Int.+ and + _overload - : ('a * 'a -> 'a) as Int.- and - end val sin = trace("sin", sin) val cos = trace("cos", cos) val sub = fn (a,i) => let val x = sub(a,i) in print "sub(_, " ; printi i ; print ") = "; printr x ; print "\n" ; x end val update = fn (a,i,x) => (update(a,i,x); print "update(_, " ; printi i ; print ", " ; printr x ; print ")\n") *) fun fft px py np = let fun find_num_points i m = if i < np then find_num_points (i+i) (m+1) else (i,m) val (n,m) = find_num_points 2 1 (* val _ = (printi n ; print "\n" ; printi m ; print "\n") *) in if n <> np then let fun loop i = if i > n then () else (update(px, i, 0.0); update(py, i, 0.0); loop (i+1)) in loop (np+1); print "Use "; printi n; print " point fft\n" end else (); let fun loop_k k n2 = if k >= m then () else let val n4 = n2 div 4 val e = tpi / (real n2) fun loop_j j a = if j > n4 then () else let val a3 = 3.0 * a val cc1 = cos(a) val ss1 = sin(a) val cc3 = cos(a3) val ss3 = sin(a3) fun loop_is is id = if is >= n then () else let fun loop_i0 i0 = if i0 >= n then () else let val i1 = i0 + n4 val i2 = i1 + n4 val i3 = i2 + n4 val r1 = sub(px, i0) - sub(px, i2) val _ = update(px, i0, sub(px, i0) + sub(px, i2)) val r2 = sub(px, i1) - sub(px, i3) val _ = update(px, i1, sub(px, i1) + sub(px, i3)) val s1 = sub(py, i0) - sub(py, i2) val _ = update(py, i0, sub(py, i0) + sub(py, i2)) val s2 = sub(py, i1) - sub(py, i3) val _ = update(py, i1, sub(py, i1) + sub(py, i3)) val s3 = r1 - s2 val r1 = r1 + s2 val s2 = r2 - s1 val r2 = r2 + s1 val _ = update(px, i2, r1*cc1 - s2*ss1) val _ = update(py, i2, ~s2*cc1 - r1*ss1) val _ = update(px, i3, s3*cc3 + r2*ss3) val _ = update(py, i3, r2*cc3 - s3*ss3) in loop_i0 (i0 + id) end in loop_i0 is; loop_is (2 * id - n2 + j) (4 * id) end in loop_is j (2 * n2); loop_j (j+1) (e * real j) end in loop_j 1 0.0; loop_k (k+1) (n2 div 2) end in loop_k 1 n end; (************************************) (* Last stage, length=2 butterfly *) (************************************) let fun loop_is is id = if is >= n then () else let fun loop_i0 i0 = if i0 > n then () else let val i1 = i0 + 1 val r1 = sub(px, i0) val _ = update(px, i0, r1 + sub(px, i1)) val _ = update(px, i1, r1 - sub(px, i1)) val r1 = sub(py, i0) val _ = update(py, i0, r1 + sub(py, i1)) val _ = update(py, i1, r1 - sub(py, i1)) in loop_i0 (i0 + id) end in loop_i0 is; loop_is (2*id - 1) (4 * id) end in loop_is 1 4 end; (*************************) (* Bit reverse counter *) (*************************) let fun loop_i i j = if i >= n then () else (if i < j then (let val xt = sub(px, j) in update(px, j, sub(px, i)); update(px, i, xt) end; let val xt = sub(py, j) in update(py, j, sub(py, i)); update(py, i, xt) end) else (); let fun loop_k k j = if k < j then loop_k (k div 2) (j-k) else j+k val j' = loop_k (n div 2) j in loop_i (i+1) j' end) in loop_i 1 1 end; n end fun abs x = if x >= 0.0 then x else ~x fun test np = let val _ = (printi np; print "... ") val enp = real np val npm = (np div 2) - 1 val pxr = array (np+2, 0.0) val pxi = array (np+2, 0.0) val t = PI / enp val _ = update(pxr, 1, (enp - 1.0) * 0.5) val _ = update(pxi, 1, 0.0) val n2 = np div 2 val _ = update(pxr, n2+1, ~0.5) val _ = update(pxi, n2+1, 0.0) fun loop_i i = if i > npm then () else let val j = np - i val _ = update(pxr, i+1, ~0.5) val _ = update(pxr, j+1, ~0.5) val z = t * real i val y = ~0.5*(cos(z)/sin(z)) val _ = update(pxi, i+1, y) val _ = update(pxi, j+1, ~y) in loop_i (i+1) end val _ = loop_i 1 (* val _ = print "\n" fun loop_i i = if i > 15 then () else (printi i; print "\t"; printr (sub(pxr, i+1)); print "\t"; printr (sub(pxi, i+1)); print "\n"; loop_i (i+1)) val _ = loop_i 0 *) val _ = fft pxr pxi np (* fun loop_i i = if i > 15 then () else (printi i; print "\t"; printr (sub(pxr, i+1)); print "\t"; printr (sub(pxi, i+1)); print "\n"; loop_i (i+1)) val _ = loop_i 0 *) fun loop_i i zr zi kr ki = if i >= np then (zr,zi) else let val a = abs(sub(pxr, i+1) - real i) val (zr, kr) = if zr < a then (a, i) else (zr, kr) val a = abs(sub(pxi, i+1)) val (zi, ki) = if zi < a then (a, i) else (zi, ki) in loop_i (i+1) zr zi kr ki end val (zr, zi) = loop_i 0 0.0 0.0 0 0 val zm = if abs zr < abs zi then zi else zr in printr zm; print "\n" end fun loop_np i np = if i > 15 then () else (test np; loop_np (i+1) (np*2)) fun doit n = if n = 0 then () else (loop_np 1 256; doit (n - 1)) end end; mlton-20210117+dfsg/benchmark/tests/fib.sml000066400000000000000000000005771416264345000204100ustar00rootroot00000000000000val rec fib = fn 0 => 0 | 1 => 1 | n => fib (n - 1) + fib (n - 2) structure Main = struct fun doit n = if n = 0 then () else let val _ = if 165580141 <> fib 41 then raise Fail "bug" else () in doit (n - 1) end end mlton-20210117+dfsg/benchmark/tests/flat-array.sml000066400000000000000000000011221416264345000216750ustar00rootroot00000000000000structure Main = struct fun doit n = let val v = Vector.tabulate (1000000, fn i => (i, i + 1)) fun loop n = if 0 = n then () else let val sum = Vector.foldl (fn ((a, b), c) => a + b + c handle Overflow => 0) 0 v val _ = if 1105694191 <> sum then raise Fail "bug" else () in loop (n - 1) end in loop n end end mlton-20210117+dfsg/benchmark/tests/fxp.sml000066400000000000000000027743561416264345000204640ustar00rootroot00000000000000(* MLton 20010629 (built Fri Jun 29 11:14:21 2001 on starlinux) *) (* created this file on Fri Jun 29 13:02:19 2001. *) (* Do not edit this file. *) (* Flag settings: *) (* aux: false *) (* chunk: chunk per function *) (* debug: false *) (* defines: [NODEBUG,MLton_safe=TRUE,MLton_detectOverflow=TRUE] *) (* detect overflow: true *) (* fixed heap: None *) (* indentation: 3 *) (* includes: [mlton.h] *) (* inline: NonRecursive {product = 320,small = 60} *) (* input file: fxp.cm *) (* instrument: false *) (* instrument Sxml: false *) (* keep Cps: false *) (* native: true *) (* native commented: 0 *) (* native copy prop: true *) (* future: 64 *) (* native ieee fp: false *) (* native live transfer: true *) (* native move hoist: true *) (* native optimize: 1 *) (* native split: Some (20000) *) (* polyvariance: Some ({rounds = 2,small = 30,product = 300}) *) (* print at fun entry: false *) (* profile: false *) (* safe: true *) (* show types: false *) (* static: false *) (* use basis library: true *) (* verbosity: Silent *) (* start of ../../Util/utilTime.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilTime *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* time : none *) (* timeN : none *) (*--------------------------------------------------------------------------*) signature UtilTime = sig val time : ('a -> 'b) -> 'a -> 'b * {usr:Time.time, sys:Time.time, gc:Time.time} val timeN : int -> ('a -> 'b) -> 'a -> 'b * {usr:Time.time, sys:Time.time, gc:Time.time} end structure UtilTime : UtilTime = struct (*--------------------------------------------------------------------*) (* run f on x, and measure the runtime. return the result and time. *) (*--------------------------------------------------------------------*) fun time f x = let val timer = Timer.startCPUTimer () val y = f x val ptime = Timer.checkCPUTimer timer in (y,ptime) end (*--------------------------------------------------------------------*) (* run f n times on x, and measure the runtime. return the time. *) (*--------------------------------------------------------------------*) fun timeN n f x = let fun iter m = if m<=1 then f x else (ignore (f x); iter (m-1)) in time iter n end end (* stop of ../../Util/utilTime.sml *) (* start of ../../Util/utilString.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilString *) (*--------------------------------------------------------------------------*) signature UtilString = sig val quoteString : char -> string -> string val numberNth : int -> string val prependAnA : string -> string val nBlanks : int -> string val padxLeft : char -> string * int -> string val padxRight : char -> string * int -> string val breakLines : int -> string -> string list val toUpperFirst : string -> string val toUpperString : string -> string val Int2String : int -> string val Bool2xString : string * string -> bool -> string val Bool2String : bool -> string val Option2xString : string * (('a -> string) -> 'a -> string) -> ('a -> string) -> 'a option -> string val Option2String0 : ('a -> string) -> 'a option -> string val Option2String : ('a -> string) -> 'a option -> string val List2xString : string * string * string -> ('a -> string) -> 'a list -> string val List2String0 : ('a -> string) -> 'a list -> string val List2String : ('a -> string) -> 'a list -> string val Vector2xString : string * string * string -> ('a -> string) -> 'a vector -> string val Vector2String : ('a -> string) -> 'a vector -> string end structure UtilString : UtilString = struct fun quoteString q s = let val quote = String.implode [q] in quote^s^quote end (*--------------------------------------------------------------------*) (* generate a string with the ordinal number of n, by appending *) (* "st", "nd", "rd" or "th" to the number. *) (*--------------------------------------------------------------------*) fun numberNth n = let val suffix = case n mod 9 of 1 => "st" | 2 => "nd" | 3 => "rd" | _ => "th" in Int.toString n^suffix end (*--------------------------------------------------------------------*) (* is the single character c represented by a word starting with a *) (* vocal in the alphabet? (l~ell->true, k~kay->false) *) (*--------------------------------------------------------------------*) fun vocalLetter c = case Char.toLower c of #"a" => true | #"f" => true | #"h" => true | #"i" => true | #"l" => true | #"m" => true | #"n" => true | #"o" => true | #"r" => true | #"s" => true | #"x" => true | #"8" => true | _ => false (*--------------------------------------------------------------------*) (* is character c a vocal? *) (*--------------------------------------------------------------------*) fun isVocal c = case Char.toLower c of #"a" => true | #"e" => true | #"i" => true | #"o" => true | #"u" => true | _ => false (*--------------------------------------------------------------------*) (* does a word require "an" as undefinite article? true if: *) (* - it is a single letter that starts with a vocal in the alphabet *) (* - its first two letters are capitals, i.e. it is an abbreviation, *) (* and its first letter starts with a vocal in the alphabet *) (* - it has more than one letter, is not an abbreviation, and either *) (* + it starts with a, i or o *) (* + it starts with e and the second letter is not a u (europe) *) (* + it starts with a u and continues with a vocal (very unlikely, *) (* only in c.s., like uuencoded or uid *) (* + it starts with a u, continues with a consonant not followed by *) (* an i (like in unicode); that is something like un-... *) (* This ruleset is not complete since it does not cover, e.g., the *) (* word uninvented, but sufficient for most cases. *) (* (Is english pronounciation decidable at all?) *) (*--------------------------------------------------------------------*) fun extendsAtoAn word = case String.explode word of nil => false | [c] => vocalLetter c | c1::c2::cs => if not (Char.isLower c1 orelse Char.isLower c2) then vocalLetter c1 else case Char.toLower c1 of #"a" => true | #"i" => true | #"o" => true | #"e" => Char.toLower c2 <> #"u" | #"u" => if isVocal c2 then false else (case cs of nil => true | c3::_ => Char.toLower c3 <> #"i") | _ => false (*--------------------------------------------------------------------*) (* add an undefinite article to a word. *) (*--------------------------------------------------------------------*) fun prependAnA word = if extendsAtoAn word then "an "^word else "a "^word (*--------------------------------------------------------------------*) (* generate a list/string of n times character c. *) (*--------------------------------------------------------------------*) fun nCharsC c n = if n>0 then c::nCharsC c (n-1) else nil fun nChars c n = String.implode (nCharsC c n) val nBlanks = nChars #" " (*--------------------------------------------------------------------*) (* add a minimal number of characters c to the left/right of a string *) (* in order to make its length at least n. *) (*--------------------------------------------------------------------*) fun padxLeft c (s,n) = (nChars c (n-String.size s))^s fun padxRight c (s,n) = s^(nChars c (n-String.size s)) val padLeft = padxLeft #" " val padRight = padxRight #" " (*--------------------------------------------------------------------*) (* break a string into several lines of length width. *) (*--------------------------------------------------------------------*) fun breakLines width str = let val tokens = String.tokens (fn c => #" "=c) str fun makeLine(toks,lines) = if null toks then lines else (String.concat (rev toks))::lines fun doit w (toks,lines) nil = makeLine(toks,lines) | doit w (toks,lines) (one::rest) = let val l = String.size one val w1 = w+l in if w1=width then doit 0 (nil,one::makeLine(toks,lines)) rest else doit (l+1) ([" ",one],makeLine(toks,lines)) rest end in List.rev (doit 0 (nil,nil) tokens) end (*--------------------------------------------------------------------*) (* convert the first/all characters of a string to upper case *) (*--------------------------------------------------------------------*) fun toUpperFirst str = case String.explode str of nil => "" | c::cs => String.implode (Char.toUpper c::cs) fun toUpperString str = String.implode(map Char.toUpper (String.explode str)) (*--------------------------------------------------------------------*) (* return a string representation of an int, char or unit. *) (*--------------------------------------------------------------------*) val Int2String = Int.toString val Char2String = Char.toString fun Unit2String() = "()" (*--------------------------------------------------------------------*) (* return a string representation of a boolean. *) (*--------------------------------------------------------------------*) fun Bool2xString (t,f) b = if b then t else f val Bool2String = Bool2xString ("true","false") (*--------------------------------------------------------------------*) (* return a string representation of an option. *) (* the first arg is a string for the NONE case, the second a function *) (* that converts x to a string, given a function for doing so. *) (*--------------------------------------------------------------------*) fun Option2xString (none,Some2String) x2String opt = case opt of NONE => none | SOME x => Some2String x2String x fun Option2String0 x2String = Option2xString ("",fn f => fn x => f x) x2String fun Option2String x2String = Option2xString ("NONE",fn f => fn x => "SOME "^f x) x2String (*--------------------------------------------------------------------*) (* return a string representation of list; start with pre, separate *) (* with sep and finish with post; use X2String for each element. *) (*--------------------------------------------------------------------*) fun List2xString (pre,sep,post) X2String nil = pre^post | List2xString (pre,sep,post) X2String l = let fun doit nil _ = [post] | doit (x::r) str = str::X2String x::doit r sep in String.concat (doit l pre) end fun List2String X2String nil = "[]" | List2String X2String l = let fun doit nil _ = ["]"] | doit (x::r) str = str::X2String x::doit r "," in String.concat (doit l "[") end fun List2String0 X2String nil = "" | List2String0 X2String l = let fun doit nil _ = nil | doit (x::r) str = str::X2String x::doit r " " in String.concat (doit l "") end (* a compiler bug in smlnj 110 makes the following uncompilable: *) (* fun List2String X2String xs = List2xString ("[",",","]") X2String xs *) (* fun List2String0 X2String xs = List2xString (""," ","") X2String xs *) (*--------------------------------------------------------------------*) (* return a string representation of list; start with pre, separate *) (* with sep and finish with post; use X2String for each element. *) (*--------------------------------------------------------------------*) fun Vector2xString (pre,sep,post) X2String vec = if Vector.length vec=0 then pre^post else String.concat (pre::X2String(Vector.sub(vec,0)):: Vector.foldri (fn (_,x,yet) => sep::X2String x::yet) [post] (vec,1,NONE)) fun Vector2String X2String vec = Vector2xString ("#[",",","]") X2String vec end (* stop of ../../Util/utilString.sml *) (* start of ../../Util/utilCompare.sml *) signature UtilCompare = sig type 'a Comparer = 'a * 'a -> order val comparePair : 'a Comparer * 'b Comparer -> ('a * 'b) Comparer val compareTriple : 'a Comparer * 'b Comparer * 'c Comparer -> ('a * 'b * 'c) Comparer val compareOption : 'a Comparer -> 'a option Comparer val compareList : 'a Comparer -> 'a list Comparer val compareVector : 'a Comparer -> 'a vector Comparer val compareInt : int Comparer val compareIntPair : (int * int) Comparer val compareIntTriple : (int * int * int) Comparer val compareWord : word Comparer val compareWordPair : (word * word) Comparer val compareWordTriple : (word * word * word) Comparer end structure UtilCompare : UtilCompare = struct type 'a Comparer = 'a * 'a -> order fun comparePair (compareA,compareB) ((a1,b1),(a2,b2)) = case compareA(a1,a2) of EQUAL => compareB(b1,b2) | order => order fun compareTriple (compareA,compareB,compareC) ((a1,b1,c1),(a2,b2,c2)) = case compareA(a1,a2) of EQUAL => (case compareB(b1,b2) of EQUAL => compareC(c1,c2) | order => order) | order => order val compareInt = Int.compare fun compareIntPair((x1,y1),(x2,y2)) = case Int.compare(x1,x2) of EQUAL => Int.compare (y1,y2) | order => order fun compareIntTriple((x1,y1,z1),(x2,y2,z2)) = case Int.compare(x1,x2) of EQUAL => (case Int.compare (y1,y2) of EQUAL => Int.compare (z1,z2) | order => order) | order => order val compareWord = Word.compare fun compareWordPair((x1,y1),(x2,y2)) = case Word.compare(x1,x2) of EQUAL => Word.compare (y1,y2) | order => order fun compareWordTriple((x1,y1,z1),(x2,y2,z2)) = case Word.compare(x1,x2) of EQUAL => (case Word.compare (y1,y2) of EQUAL => Word.compare (z1,z2) | order => order) | order => order fun compareOption compareA opts = case opts of (NONE,NONE) => EQUAL | (NONE,SOME x) => LESS | (SOME x,NONE) => GREATER | (SOME x,SOME y) => compareA(x,y) fun compareList compA ll = let fun doit (nil,nil) = EQUAL | doit (nil,_) = LESS | doit (_,nil) = GREATER | doit (a1::as1,a2::as2) = case compA(a1,a2) of EQUAL => doit(as1,as2) | order => order in doit ll end fun compareVector compA (vec1,vec2) = let val (l,l2) = (Vector.length vec1,Vector.length vec2) in case Int.compare(l,l2) of EQUAL => let fun doit i = if i>=l then EQUAL else case compA(Vector.sub(vec1,i),Vector.sub(vec2,i)) of EQUAL => doit (i+1) | order => order in doit 0 end | order => order end end (* stop of ../../Util/utilCompare.sml *) (* start of ../../Util/utilHash.sml *) signature UtilHash = sig val hashPair : ('a -> word) * ('b -> word) -> 'a * 'b -> word val hashTriple : ('a -> word) * ('b -> word) * ('c -> word) -> 'a * 'b * 'c -> word val hashOption : ('a -> word) -> 'a option -> word val hashList : ('a -> word) -> 'a list -> word val hashVector : ('a -> word) -> 'a vector -> word val hashString : string -> word val hashInt : int -> word val hashIntPair : int * int -> word val hashIntTriple : int * int * int -> word val hashWord : word -> word val hashWordPair : word * word -> word val hashWordTriple : word * word * word -> word end structure UtilHash : UtilHash = struct fun hashPair (hashA,hashB) (a,b) = 0w1327 * hashA a + 0w3853 * hashB b fun hashTriple (hashA,hashB,hashC) (a,b,c) = 0w1327 * hashA a + 0w3853 * hashB b + 0w2851 * hashC c val hashInt = Word.fromInt fun hashIntPair (i,j) = 0w1327 * Word.fromInt i + 0w3853 * Word.fromInt j fun hashIntTriple (i,j,k) = 0w1327 * Word.fromInt i + 0w3853 * Word.fromInt j + 0w2851 * Word.fromInt k fun hashWord w = w fun hashWordPair (i,j) = 0w1327 * i + 0w3853 * j fun hashWordTriple (i,j,k) = 0w1327 * i + 0w3853 * j + 0w2851 * k val hashChar = Word.fromInt o ord fun hashString s = case String.size s of 0 => 0wx0 | 1 => 0w1 + hashChar(String.sub(s,0)) | 2 => let val w1 = String.sub(s,0) val w2 = String.sub(s,1) in 0w2 + hashChar w1 * 0wx1327 + hashChar w2 end | n => let val w1 = String.sub(s,0) val w2 = String.sub(s,1) val wn = String.sub(s,n-1) in 0w3 + hashChar w1 * 0wx3853 + hashChar w2 * 0wx1327 + hashChar wn end fun hashOption hashA opt = case opt of NONE => 0w0 | SOME a => 0w1 + hashA a fun hashList hashA l = case l of nil => 0wx0 | [a] => 0w1 + hashA a | a1::a2::_ => 0w2 + 0w3853 * hashA a1 + 0wx1327 * hashA a2 fun hashVector hashA cv = case Vector.length cv of 0 => 0wx0 | 1 => 0w1 + hashA(Vector.sub(cv,0)) | 2 => let val w1 = Vector.sub(cv,0) val w2 = Vector.sub(cv,1) in 0w2 + hashA w1 * 0wx1327 + hashA w2 end | n => let val w1 = Vector.sub(cv,0) val w2 = Vector.sub(cv,1) val wn = Vector.sub(cv,n-1) in 0w3 + hashA w1 * 0wx3853 + hashA w2 * 0wx1327 + hashA wn end end (* stop of ../../Util/utilHash.sml *) (* start of ../../Util/SymDict/key.sml *) (*--------------------------------------------------------------------------*) (* In order to be used as a dictinary/symbol table key, a type must have a *) (* null value, hash to words, must be comparable and printable. *) (*--------------------------------------------------------------------------*) signature Key = sig type Key val null : Key val hash : Key -> word val compare : Key * Key -> order val toString : Key -> string end (* stop of ../../Util/SymDict/key.sml *) (* start of ../../Util/utilInt.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilInt *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* appInterval : none *) (* insertInt : none *) (* insertNewInt : none *) (* nextPowerTwo : none *) (*--------------------------------------------------------------------------*) signature UtilInt = sig val intervalList : (int * int) -> int list val appInterval : (int -> unit) -> (int * int) -> unit val insertInt : int * int list -> int list val insertNewInt : int * int list -> int list option val powerOfTwo : int -> int val nextPowerTwo : int -> int end structure UtilInt : UtilInt = struct (*--------------------------------------------------------------------*) (* generate the list [n,...,m] *) (*--------------------------------------------------------------------*) fun intervalList(n,m) = if n>m then nil else n::intervalList(n+1,m) (*--------------------------------------------------------------------*) (* apply f to each number in [n...m] *) (*--------------------------------------------------------------------*) fun appInterval f (n,m) = let fun doit i = if i>m then () else let val _ = f i in doit (i+1) end in doit n end (*--------------------------------------------------------------------*) (* insert an integer into a sorted list without duplicates. *) (*--------------------------------------------------------------------*) fun insertInt (x:int,l) = let fun go nil = [x] | go (l as y::ys) = case Int.compare (x,y) of LESS => x::l | EQUAL => l | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* insert an integer into a sorted list if it is not yet in it. *) (*--------------------------------------------------------------------*) fun insertNewInt (x:int,l) = let fun go nil = SOME [x] | go (l as y::ys) = case Int.compare (x,y) of LESS => SOME(x::l) | EQUAL => NONE | GREATER => case go ys of NONE => NONE | SOME xys => SOME(y::xys) in go l end (*--------------------------------------------------------------------*) (* compute the power to the base of two. *) (*--------------------------------------------------------------------*) fun powerOfTwo n = if n=0 then 1 else if n mod 2=0 then let val x=powerOfTwo (n div 2) in x*x end else let val x=powerOfTwo (n-1) in 2*x end (*--------------------------------------------------------------------*) (* find the smallest p with 2^p >= n. *) (*--------------------------------------------------------------------*) fun nextPowerTwo n = let fun doit (p,m) = if m>=n then p else if m*m<2*n then doit (2*p,m*m) else doit (1+p,2*m) in doit (1,2) end end (* stop of ../../Util/utilInt.sml *) (* start of ../../Util/utilError.sml *) signature UtilError = sig exception InternalError of string * string * string exception NoSuchFile of string * string val formatMessage : int * int -> string list -> string end structure UtilError : UtilError = struct open UtilString exception InternalError of string * string * string exception NoSuchFile of string * string fun formatMessage (indentWidth,lineWidth) strs = let val indent = nBlanks indentWidth val nl = "\n"^indent val blank = " " val dot = "." fun isSep c = #" "=c orelse #"\n"=c orelse #"\t"=c fun go (w,yet) nil = List.rev ("\n"::yet) | go (w,yet) (x::xs) = let val y = if null xs then x^dot else x val l = String.size y val w1 = w+l val (w2,yet2) = if w1<=lineWidth then (w1,y::yet) else (indentWidth+l,y::nl::yet) val (w3,yet3) = if null xs then (w2,yet2) else (if w2 'a Dict val makeDict : string * int * 'a -> 'a Dict val clearDict : 'a Dict * int option -> unit val hasIndex : 'a Dict * Key -> int option val getIndex : 'a Dict * Key -> int val getKey : 'a Dict * int -> Key val getByIndex : 'a Dict * int -> 'a val getByKey : 'a Dict * Key -> 'a val setByIndex : 'a Dict * int * 'a -> unit val setByKey : 'a Dict * Key * 'a -> unit val usedIndices : 'a Dict -> int val extractDict : 'a Dict -> (Key * 'a) array val printDict : ('a -> string) -> 'a Dict -> unit end functor Dict (structure Key : Key) : Dict = struct open UtilError UtilInt type Key = Key.Key exception NoSuchIndex (*--------------------------------------------------------------------*) (* a dictionary can have at most size MAX_WIDTH. This is because *) (* arrays may at most have Array.maxLen elements. We only use powers *) (* of two as sizes, so we are really only interested in the position *) (* of maxLen's highest bit. That would be the maximal width for hash *) (* tables, and thus we must decrease it by one for obtaining the max *) (* table width. *) (*--------------------------------------------------------------------*) fun highestBit w = if w=0w0 then 0 else 1+highestBit(Word.>>(w,0w1)) val MAX_WIDTH = highestBit (Word.fromInt Array.maxLen)-1 type Bucket = (Key * int) list val nullBucket = nil : Bucket (*--------------------------------------------------------------------*) (* buckets are unsorted - they are probably small, so comparing the *) (* keys might be overkill. *) (*--------------------------------------------------------------------*) fun addToBucket (ni as (key,_),bucket) = let fun doit nil = [ni] | doit (nis as (ni' as (key',_))::rest) = case Key.compare (key',key) of LESS => ni'::doit rest | EQUAL => ni::rest | GREATER => ni::nis in doit bucket end fun searchBucket (key,bucket) = let fun doit nil = NONE | doit ((key',i)::rest) = case Key.compare (key',key) of LESS => doit rest | EQUAL => SOME i | GREATER => NONE in doit bucket end (*--------------------------------------------------------------------*) (* a dictionary consists of *) (* - a string desc saying what is stored in this dictionary *) (* - an array tab holding for each index its key and value *) (* - a hash table, i.e. Bucket array, of double size than tab *) (* - a hashFun mapping Key to the range of the hash table *) (* - an integer width for computing table sizes *) (* - an integer size wich is the size of the value table *) (* - an integer count holding the next free index *) (* - a default value for the value table *) (*--------------------------------------------------------------------*) type 'a Dict = {desc : string, tab : (Key * 'a) array ref, hashTab : Bucket array ref, hashFun : (Key -> int) ref, width : int ref, (* bit width *) size : int ref, (* tab size=2^width, hash size is double *) count : int ref, (* number of entries *) def : 'a (* default for values *) } fun nullDict (desc,def) = {desc = desc, tab = ref (Array.array(1,(Key.null,def))), hashTab = ref (Array.array(2,nullBucket)), hashFun = ref (fn _ => 0), count = ref 0, size = ref 1, width = ref 0, def = def} (*--------------------------------------------------------------------*) (* how many entries are in the dictionary? *) (*--------------------------------------------------------------------*) fun usedIndices ({count,...}:'a Dict) = !count (*--------------------------------------------------------------------*) (* what is the table load, i.e. percentage of number of entries to *) (* hash table size = 100*count/(2*size) = 50*count/size. *) (*--------------------------------------------------------------------*) fun hashRatio({count,size,...}:'a Dict) = 50 * !count div !size handle Div => 100 (*--------------------------------------------------------------------*) (* this is the hash function. Key.hash hashes data to arbitrary *) (* words, that are mapped to the hash range by this function, where *) (* mask is the bitmask corresponding to the size of the hash table: *) (* 1. square the word produced by Key.hash *) (* 2. take the width bits from the middle of the square, these are *) (* the bit-places influenced by all input bit-places: *) (* - shift to the right by half of the destination width *) (* - mask out all bits to the left of destination *) (* this is a simple strategy but experiences good results. *) (*--------------------------------------------------------------------*) fun square (x:word) = Word.*(x,x) fun hashKey(half,mask) x = Word.toInt(Word.andb(mask,Word.>>(square(Key.hash x),half))) fun makeHashFun(size,width) = let val mask = 0w2*Word.fromInt size-0w1 val half = Word.fromInt((width+1) div 2) in hashKey(half,mask) end (*--------------------------------------------------------------------*) (* create a new dictionary for 2^w, but at least 2 and at most 2^m *) (* entries, where m is the value of MAX_WIDTH. *) (*--------------------------------------------------------------------*) fun makeDict (desc,w,def) = let val width= Int.min(Int.max(1,w),MAX_WIDTH) val size = Word.toInt(Word.<<(0w1,Word.fromInt(width-1))) in {desc = desc, tab = ref (Array.array(size,(Key.null,def))), hashTab = ref (Array.array(2*size,nullBucket)), hashFun = ref (makeHashFun(size,width)), width = ref width, size = ref size, count = ref 0, def = def} end (*--------------------------------------------------------------------*) (* clear a dictionary. If the 2nd arg is SOME w, use w for resizing. *) (*--------------------------------------------------------------------*) fun clearDict (dict:'a Dict,widthOpt) = case widthOpt of NONE => let val {tab=ref tab,hashTab=ref hashTab,size,count,def,...} = dict val _ = appInterval (fn i => Array.update(tab,i,(Key.null,def))) (0,!count-1) val _ = appInterval (fn i => Array.update(hashTab,i,nullBucket)) (0,!size*2-1) in count := 0 end | SOME w => let val {tab,hashTab,hashFun,width,size,count,def,...} = dict val newWidth = Int.min(Int.max(1,w),MAX_WIDTH) val newSize = Word.toInt(Word.<<(0w1,Word.fromInt(newWidth-1))) val _ = tab := (Array.array(newSize,(Key.null,def))) val _ = hashTab := (Array.array(2*newSize,nullBucket)) val _ = hashFun := (makeHashFun(newSize,newWidth)) val _ = width := newWidth val _ = size := newSize in count := 0 end (*--------------------------------------------------------------------*) (* grow a dictionary to the double size. raise InternalError if the *) (* dictionary already has maximal size. *) (*--------------------------------------------------------------------*) fun growDictionary ({desc,tab,hashTab,hashFun,width,size,count,def}:'a Dict) = let val oldTab = !tab val _ = if !width < MAX_WIDTH then width := !width+1 else raise InternalError ("Dict","growDictionary", String.concat ["growing the ",desc," dictionary ", "exceeded the system maximum size of ", Int.toString Array.maxLen," for arrays"]) val _ = size := !size*2 val _ = tab := Array.array(!size,(Key.null,def)) val _ = hashTab := Array.array(!size*2,nullBucket) val _ = hashFun := makeHashFun(!size,!width) fun addTo (i,kv as (key,_)) = let val idx = !hashFun key val _ = Array.update(!hashTab,idx,addToBucket((key,i),Array.sub(!hashTab,idx))) val _ = Array.update(!tab,i,kv) in () end in Array.appi addTo (oldTab,0,NONE) end (*--------------------------------------------------------------------*) (* lookup the key for an index of the dictionary. *) (*--------------------------------------------------------------------*) fun getKey({tab,count,...}:'a Dict,idx) = if !count>idx then #1(Array.sub(!tab,idx)) else raise NoSuchIndex (*--------------------------------------------------------------------*) (* map a Key to its index in the dictionary. if it is not in the *) (* dictionary yet, add a new entry with a new index. grow the table *) (* if there is no more free index in the dictionary. *) (*--------------------------------------------------------------------*) fun getIndex(dict as {tab,hashTab,hashFun,size,count,def,...}:'a Dict,key) = let val k = !hashFun key val bucket = Array.sub(!hashTab,k) in case searchBucket(key,bucket) of SOME idx => idx | NONE => let val idx = !count val (k',buck') = if !size>idx then (k,bucket) else let val _ = growDictionary dict val k' = !hashFun key val buck' = Array.sub(!hashTab,k') in (k',buck') end val _ = Array.update(!hashTab,k',addToBucket((key,idx),buck')) val _ = Array.update(!tab,idx,(key,def)) val _ = count := idx+1 in idx end end (*--------------------------------------------------------------------*) (* does a Key have an entry in a dictionary? *) (*--------------------------------------------------------------------*) fun hasIndex({hashTab,hashFun,...}:'a Dict,key) = let val idx = !hashFun key val bucket = Array.sub(!hashTab,idx) in searchBucket(key,bucket) end (*--------------------------------------------------------------------*) (* get the value stored for index idx *) (*--------------------------------------------------------------------*) fun getByIndex({tab,count,...}:'a Dict,idx) = if !count>idx then #2(Array.sub(!tab,idx)) else raise NoSuchIndex (*--------------------------------------------------------------------*) (* get the value stored for a key *) (*--------------------------------------------------------------------*) fun getByKey(dict,key) = getByIndex(dict,getIndex(dict,key)) (*--------------------------------------------------------------------*) (* enter a value for index idx. *) (*--------------------------------------------------------------------*) fun setByIndex({tab,count,...}:'a Dict,idx,a) = if !count>idx then let val (key,_) = Array.sub(!tab,idx) in Array.update(!tab,idx,(key,a)) end else raise NoSuchIndex (*--------------------------------------------------------------------*) (* enter a value for a key. *) (*--------------------------------------------------------------------*) fun setByKey(dict,key,v) = setByIndex(dict,getIndex(dict,key),v) (*--------------------------------------------------------------------*) (* extract the contents of the dictionary to an array. *) (*--------------------------------------------------------------------*) fun extractDict({count,tab,...}:'a Dict) = Array.tabulate(!count,fn i => Array.sub(!tab,i)) (*--------------------------------------------------------------------*) (* print the contents of the dictionary. *) (*--------------------------------------------------------------------*) fun printDict X2String ({desc,tab,count,...}:'a Dict) = (print (desc^" dictionary:\n"); Array.appi (fn (n,(key,value)) => print (" "^Int.toString n^": "^Key.toString key^" = "^X2String value^"\n")) (!tab,0,SOME (!count))) end (* stop of ../../Util/SymDict/dict.sml *) (* start of ../../Util/SymDict/symbolTable.sml *) (*--------------------------------------------------------------------------*) (* Functor: SymbolTable *) (* *) (* Exceptions raised by functions in this structure: *) (* getSymIndex : Key.InternalError *) (* getSymKey : NoSuchSymbol *) (* hasSymIndex : none *) (* makeSymTable : none *) (* nullSymTable : none *) (* printSymTable : none *) (* usedSymbols : none *) (*--------------------------------------------------------------------------*) (* A symbol table maps Keys to consecutive integers. *) (*--------------------------------------------------------------------------*) signature SymTable = sig type Key type SymTable exception NoSuchSymbol val nullSymTable : string -> SymTable val makeSymTable : string * int -> SymTable val clearSymTable : SymTable * int option -> unit val hasSymIndex : SymTable * Key -> int option val getSymIndex : SymTable * Key -> int val getSymKey : SymTable * int -> Key val usedSymbols : SymTable -> int val assignSymIndex : SymTable * Key * int -> unit val reserveSymIndex : SymTable -> int val extractSymTable : SymTable -> Key vector val printSymTable : SymTable -> unit end functor SymTable (structure Key : Key) : SymTable = struct open UtilError UtilInt exception NoSuchSymbol type Key = Key.Key (*--------------------------------------------------------------------*) (* a symbol table can have at most size MAX_WIDTH. This is because *) (* arrays may at most have Array.maxLen elements. We only use powers *) (* of two as sizes, so we are really only interested in the position *) (* of maxLen's highest bit. That would be the maximal width for hash *) (* tables, and thus we must decrease it by one for obtaining the max *) (* table width. *) (*--------------------------------------------------------------------*) fun highestBit w = if w=0w0 then 0 else 1+highestBit(Word.>>(w,0w1)) val MAX_WIDTH = highestBit (Word.fromInt Array.maxLen)-1 type Bucket = (Key * int) list val nullBucket = nil : Bucket (*--------------------------------------------------------------------*) (* buckets are sorted - though they are probably small. *) (*--------------------------------------------------------------------*) fun addToBucket (ni as (key,_),bucket) = let fun doit nil = [ni] | doit (nis as (ni' as (key',_))::rest) = case Key.compare (key',key) of LESS => ni'::doit rest | EQUAL => ni::rest | GREATER => ni::nis in doit bucket end fun searchBucket (key,bucket) = let fun doit nil = NONE | doit ((key',i)::rest) = case Key.compare (key',key) of LESS => doit rest | EQUAL => SOME i | GREATER => NONE in doit bucket end (*--------------------------------------------------------------------*) (* a symbol table consists of *) (* - an array tab holding for each index its key *) (* - a hash table, i.e. Bucket array, of double size than tab *) (* - a hashFun mapping Key to the range of the hash table *) (* - an integer width for computing table sizes *) (* - an integer size wich is the size of the value table *) (* - an integer count holding the next free index *) (*--------------------------------------------------------------------*) type SymTable = {desc : string, tab : Key array ref, hash : Bucket array ref, hashFun : (Key -> int) ref, width : int ref, (* bit width *) size : int ref, (* tab size=2^width, hash size is double *) count : int ref (* number of entries *) } fun nullSymTable desc = {desc = desc, tab = ref (Array.array(1,Key.null)), hash = ref (Array.array(2,nullBucket)), hashFun = ref (fn _ => 0), count = ref 0, size = ref 1, width = ref 0} : SymTable (*--------------------------------------------------------------------*) (* how many entries are in the symtable? *) (*--------------------------------------------------------------------*) fun usedSymbols ({count,...}:SymTable) = !count (*--------------------------------------------------------------------*) (* what is the table load, i.e. percentage of number of entries to *) (* hash table size = 100*count/(2*size) = 50*count/size. *) (*--------------------------------------------------------------------*) fun hashRatio({count,size,...}:SymTable) = 50 * !count div !size handle Div => 100 (*--------------------------------------------------------------------*) (* this is the hash function. Key.hash hashes data to arbitrary *) (* words, that are mapped to the hash range by this function, where *) (* mask is the bitmask corresponding to the size of the hash table: *) (* 1. square the word produced by Key.hash *) (* 2. take the width bits from the middle of the square, these are *) (* the bit-places influenced by all input bit-places: *) (* - shift to the right by half of the destination width *) (* - mask out all bits to the left of destination *) (* this is a simple strategy but experiences good results. *) (*--------------------------------------------------------------------*) fun square (x:word) = Word.*(x,x) fun hashKey(half,mask) x = Word.toInt(Word.andb(mask,Word.>>(square(Key.hash x),half))) fun makeHashFun(size,width) = let val mask = Word.fromInt(2*size-1) val half = Word.fromInt((width+1) div 2) in hashKey(half,mask) end (*--------------------------------------------------------------------*) (* create a new symtable for 2^w, but at least 2 and at most 2^m *) (* entries, where m is the value of MAX_WIDTH. *) (*--------------------------------------------------------------------*) fun makeSymTable (desc,w) = let val width= Int.min(Int.max(1,w),MAX_WIDTH) val size = Word.toInt(Word.<<(0w1,Word.fromInt(width-1))) in {desc = desc, tab = ref (Array.array(size,Key.null)), hash = ref (Array.array(2*size,nullBucket)), hashFun = ref (makeHashFun(size,width)), width = ref width, size = ref size, count = ref 0} end (*--------------------------------------------------------------------*) (* clear a dictionary. If the 2nd arg is SOME w, use w for resizing. *) (*--------------------------------------------------------------------*) fun clearSymTable (symTab:SymTable,widthOpt) = case widthOpt of NONE => let val {tab=ref tab,hash=ref hash,size,count,...} = symTab val _ = appInterval (fn i => Array.update(tab,i,Key.null)) (0,!count-1) val _ = appInterval (fn i => Array.update(hash,i,nullBucket)) (0,!size*2-1) in count := 0 end | SOME w => let val {tab,hash,hashFun,width,size,count,...} = symTab val newWidth = Int.min(Int.max(1,w),MAX_WIDTH) val newSize = Word.toInt(Word.<<(0w1,Word.fromInt(newWidth-1))) val _ = tab := (Array.array(newSize,Key.null)) val _ = hash := (Array.array(2*newSize,nullBucket)) val _ = hashFun := (makeHashFun(newSize,newWidth)) val _ = width := newWidth val _ = size := newSize in count := 0 end (*--------------------------------------------------------------------*) (* grow a symtable to the double size. raise InternalError if the *) (* table already has maximal size. *) (*--------------------------------------------------------------------*) fun growTable ({desc,tab,hash,hashFun,width,size,count}:SymTable) = let val newWidth = if !width < MAX_WIDTH then !width+1 else raise InternalError ("SymTable","growTable", String.concat ["growing the ",desc," symbol table ", "exceeded the system maximum size of ", Int.toString Array.maxLen," for arrays"]) val newSize = !size*2 val oldTab = !tab val newTab = Array.array(newSize,Key.null) val newHash = Array.array(2*newSize,nullBucket) val newHashFun = makeHashFun(newSize,newWidth) fun addToNew (inv as (i,key)) = let val idx = newHashFun key val _ = Array.update(newHash,idx,addToBucket((key,i),Array.sub(newHash,idx))) val _ = Array.update(newTab,i,key) in () end val _ = Array.appi addToNew (!tab,0,NONE) val _ = tab := newTab val _ = hash := newHash val _ = size := newSize val _ = width := newWidth val _ = hashFun := newHashFun in () end (*--------------------------------------------------------------------*) (* lookup the key for an index of the symbol table. *) (*--------------------------------------------------------------------*) fun getSymKey({tab,count,...}:SymTable,idx) = if !count>idx then Array.sub(!tab,idx) else raise NoSuchSymbol (*--------------------------------------------------------------------*) (* map a Key to its index in the symbol table. if it is not in the *) (* symbol table yet, add a new entry with a new index. grow the table *) (* if there is no more free index in the table. *) (*--------------------------------------------------------------------*) fun getSymIndex(st as {tab,hash,hashFun,size,count,...}:SymTable,key) = let val idx = !hashFun key val bucket = Array.sub(!hash,idx) in case searchBucket(key,bucket) of SOME i => i | NONE => let val i = !count val (idx',buck') = if !size>i then (idx,bucket) else let val _ = growTable st val idx' = !hashFun key val buck' = Array.sub(!hash,idx') in (idx',buck') end val _ = Array.update(!hash,idx',addToBucket((key,i),buck')) val _ = Array.update(!tab,i,key) val _ = count := i+1 in i end end (*--------------------------------------------------------------------*) (* does a Key have an entry in a symbol table? *) (*--------------------------------------------------------------------*) fun hasSymIndex({hash,hashFun,...}:SymTable,key) = let val idx = !hashFun key val buck = Array.sub(!hash,idx) in searchBucket(key,buck) end (*--------------------------------------------------------------------*) (* reserve an index for a (yet unknown) key. *) (*--------------------------------------------------------------------*) fun reserveSymIndex(st as {size,count=count as ref i,...}:SymTable) = let val _ = if !size>i then () else growTable st val _ = count := i+1 in i end (*--------------------------------------------------------------------*) (* assign an index to a (previously reserved) index. *) (*--------------------------------------------------------------------*) fun assignSymIndex(st as {count,hash,hashFun,tab,...}:SymTable,key,i) = if !count<=i then raise NoSuchSymbol else let val idx = !hashFun key val buck = Array.sub(!hash,idx) val newBuck = addToBucket((key,i),buck) val _ = Array.update(!hash,idx,newBuck) val _ = Array.update(!tab,i,key) in () end (*--------------------------------------------------------------------*) (* extract the contents of a symbol table to a vector. *) (*--------------------------------------------------------------------*) fun extractSymTable({count,tab,...}:SymTable) = Array.extract(!tab,0,SOME(!count)) (*--------------------------------------------------------------------*) (* print the contents of the symbol table. *) (*--------------------------------------------------------------------*) fun printSymTable ({desc,tab,count,...}:SymTable) = (print (desc^" table:\n"); Array.appi (fn (n,key) => print (" "^Int.toString n^": "^Key.toString key^"\n")) (!tab,0,SOME (!count))) end (* stop of ../../Util/SymDict/symbolTable.sml *) (* start of ../../Util/SymDict/intListDict.sml *) structure KeyIntList : Key = struct type Key = int list val null = nil val hash = UtilHash.hashList Word.fromInt val compare = UtilCompare.compareList Int.compare val toString = UtilString.List2String Int.toString end structure IntListDict = Dict (structure Key = KeyIntList) structure IntListSymTab = SymTable (structure Key = KeyIntList) (* stop of ../../Util/SymDict/intListDict.sml *) (* start of ../../Util/SymDict/intDict.sml *) structure KeyInt : Key = struct type Key = int val null = 0 val hash = Word.fromInt val compare = Int.compare val toString = Int.toString end structure IntDict = Dict (structure Key = KeyInt) structure IntSymTab = SymTable (structure Key = KeyInt) (* stop of ../../Util/SymDict/intDict.sml *) (* start of ../../Unicode/Chars/uniChar.sml *) (*--------------------------------------------------------------------------*) (* Structure: UniChar *) (* *) (* Depends on: *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (*--------------------------------------------------------------------------*) signature UniChar = sig structure Chars : WORD type Char = Chars.word type Data = Char list type Vector = Char vector val nullData : Data val nullVector : Vector val hashChar : Char -> word val hashData : Data -> word val hashVector : Vector -> word val compareChar : Char * Char -> order val compareData : Data * Data -> order val compareVector : Vector * Vector -> order val char2Char : char -> Char val Char2char : Char -> char val Char2Uni : Char -> string val Char2String : Char -> string val String2Data : string -> Data val Data2String : Data -> string val Latin2String : Data -> string val Data2Vector : Data -> Vector val Vector2Data : Vector -> Data val String2Vector : string -> Vector val Vector2String : Vector -> string val quoteUni : Char -> string -> string val quoteChar : Char -> Char -> string val quoteData : Char -> Data -> string val quoteVector : Char -> Vector -> string end structure UniChar : UniChar = struct val O_VECTOR_PRINTLEN = 48 structure Chars = Word val _ = if Chars.wordSize > 21 then () else let val str = ("UniChar: Chars.wordSize is too small.\n"^ "Cannot compile on this system!\n" ) val _ = print str in raise Fail str end type Char = Chars.word type Data = Char list type CharInterval = Char * Char type CharRange = CharInterval list type Vector = Char vector val nullChar = 0wx0:Char val nullData = nil:Data val nullVector = Vector.fromList nullData val hashChar = Word.fromLargeWord o Chars.toLargeWord val hashData = UtilHash.hashList hashChar val hashVector = UtilHash.hashVector hashChar val compareChar = Chars.compare val compareData = UtilCompare.compareList compareChar val compareVector = UtilCompare.compareVector compareChar val char2Char = Chars.fromLargeWord o Word8.toLargeWord o Byte.charToByte val Char2char = Byte.byteToChar o Word8.fromLargeWord o Chars.toLargeWord fun Char2Uni c = "U+"^UtilString.toUpperString(StringCvt.padLeft #"0" 4 (Chars.toString c)) fun Char2String c = case c of 0wx9 => "\\t" | 0wxA => "\\n" | _ => if c<0wx100 then String.implode [Char2char c] else Char2Uni c fun String2Data s = map char2Char (String.explode s) fun Data2String cs = String.concat (map Char2String cs) fun Latin2String cs = String.implode (map Char2char cs) val Data2Vector = Vector.fromList fun String2Vector s = Vector.tabulate(String.size s,fn i => char2Char(String.sub(s,i))) fun Vector2Data vec = Vector.foldr (op ::) nil vec fun Vector2String vec = let val maxlen = O_VECTOR_PRINTLEN val len = Vector.length vec in if len<=maxlen orelse maxlen=0 then Data2String (Vector2Data vec) else let val cs1 = Vector.foldri (fn (_,c,cs) => c::cs) nil (vec,0,SOME (maxlen div 2)) val cs2 = Vector.foldri (fn (_,c,cs) => c::cs) nil (vec,len-3-maxlen div 2,NONE) in Data2String cs1^"..."^Data2String cs2 end end fun quoteUni q s = let val sQ = Char2String q in sQ^s^sQ end fun quoteChar q c = if c=0wx0 then "entity end" else quoteUni q (Char2String c) fun quoteData q cs = quoteUni q (Data2String cs) fun quoteVector q v = quoteUni q (Vector2String v) end (* stop of ../../Unicode/Chars/uniChar.sml *) (* start of ../../Unicode/Chars/charVecDict.sml *) structure KeyVector : Key = struct type Key = UniChar.Vector val null = UniChar.nullVector val compare = UniChar.compareVector val toString = UniChar.Vector2String val hash = UniChar.hashVector end structure VectorDict = Dict (structure Key = KeyVector) (* stop of ../../Unicode/Chars/charVecDict.sml *) (* start of ../../Util/SymDict/stringDict.sml *) structure KeyString : Key = struct type Key = string val null = "" val hash = UtilHash.hashString val compare = String.compare fun toString str = str end structure StringDict = Dict (structure Key = KeyString) (* stop of ../../Util/SymDict/stringDict.sml *) (* start of ../../Unicode/encoding.sml *) signature Encoding = sig datatype Encoding = NOENC | ASCII | EBCDIC | LATIN1 | UCS4B | UCS4L | UCS4SB | UCS4SL | UCS2B | UCS2L | UTF16B | UTF16L | UTF8 val UCS2 : Encoding val UCS4 : Encoding val UTF16 : Encoding val encodingName : Encoding -> string val isEncoding : string -> Encoding val switchEncoding : Encoding * Encoding -> Encoding end structure Encoding : Encoding = struct open StringDict datatype Encoding = NOENC | ASCII | EBCDIC | LATIN1 | UCS4B | UCS4L | UCS4SB | UCS4SL | UCS2B | UCS2L | UTF16B | UTF16L | UTF8 val UCS2 = UCS2B val UCS4 = UCS4B val UTF16 = UTF16B fun encodingName enc = case enc of NOENC => "NONE" | ASCII => "ASCII" | EBCDIC => "EBCDIC" | LATIN1 => "ISO-8859-1" | UCS2B => "UCS-2" | UCS2L => "UCS-2" | UCS4B => "UCS-4" | UCS4L => "UCS-4" | UCS4SB => "UCS-4" | UCS4SL => "UCS-4" | UTF8 => "UTF-8" | UTF16B => "UTF-16" | UTF16L => "UTF-16" val encDict = makeDict("encoding",6,NOENC) val encAliases = [(ASCII,["ANSI_X3.4-1968","ANSI_X3.4-1986","ASCII","US-ASCII","US", "ISO646-US","ISO-IR-6","ISO_646.IRV:1991","IBM367","CP367"]), (EBCDIC,["EBCDIC"]), (LATIN1,["ISO_8859-1:1987","ISO-8859-1","ISO_8859-1", "ISO-IR-100","CP819","IBM819","L1","LATIN1"]), (UCS2,["UCS-2","ISO-10646-UCS-2"]), (UCS4,["UCS-4","ISO-10646-UCS-4"]), (UTF16,["UTF-16"]), (UTF8,["UTF-8"]) ] val _ = app (fn (x,ys) => app (fn y => setByKey(encDict,y,x)) ys) encAliases fun isEncoding name = getByKey(encDict,name) fun compatAscii new = case new of ASCII => new | LATIN1 => new | UTF8 => new | _ => NOENC fun compatUcs4 (old,new) = if new=UCS4 then old else NOENC fun switchEncoding(old,new) = case old of NOENC => NOENC | ASCII => compatAscii new | EBCDIC => if new=EBCDIC then new else NOENC | LATIN1 => compatAscii new | UCS4B => compatUcs4(old,new) | UCS4L => compatUcs4(old,new) | UCS4SB => compatUcs4(old,new) | UCS4SL => compatUcs4(old,new) | UTF16B => if new=UTF16 then old else if new=UCS2 then UCS2B else NOENC | UTF16L => if new=UTF16 then old else if new=UCS2 then UCS2L else NOENC | UCS2B => if new=UCS2 then old else if new=UTF16 then UTF16B else NOENC | UCS2L => if new=UCS2 then old else if new=UTF16 then UTF16L else NOENC | UTF8 => compatAscii new end (* stop of ../../Unicode/encoding.sml *) (* start of ../../Unicode/Encode/encodeBasic.sml *) (*--------------------------------------------------------------------------*) (* Structure: EncodeBasic *) (* *) (* Exceptions raised by functions in this structure: *) (* closeFile : none *) (* fileName : none *) (* openFile : NoSuchFile *) (* writeByte : Io *) (*--------------------------------------------------------------------------*) signature EncodeBasic = sig type File val stdOutFile : File val closeFile : File -> unit val fileName : File -> string val openFile : string -> File val writeByte : File * Word8.word -> File end structure EncodeBasic : EncodeBasic = struct open UtilError type outstream = TextIO.outstream val closeOut = TextIO.closeOut val openOut = TextIO.openOut val output1 = TextIO.output1 val stdOut = TextIO.stdOut type File = string * outstream val stdOutFile = ("-",stdOut) fun closeFile(fname,s) = if fname="-" then () else closeOut s fun fileName(fname,_) = if fname="-" then "" else fname fun openFile fname = if fname = "-" then (fname,stdOut) else (fname,openOut fname) handle IO.Io {name,cause,...} => raise NoSuchFile(name,exnMessage cause) fun writeByte (f as (_,s),b) = f before output1(s,chr(Word8.toInt b)) end (* stop of ../../Unicode/Encode/encodeBasic.sml *) (* start of ../../Unicode/Encode/encodeError.sml *) signature EncodeError = sig datatype EncodeError = ERR_ILLEGAL_CHAR of UniChar.Char * string val encodeMessage : EncodeError -> string list exception EncodeError of EncodeBasic.File * EncodeError end structure EncodeError : EncodeError = struct open UtilString UniChar datatype EncodeError = ERR_ILLEGAL_CHAR of UniChar.Char * string fun encodeMessage err = case err of ERR_ILLEGAL_CHAR(c,what) => [Char2Uni c,"is not",prependAnA what,"character"] exception EncodeError of EncodeBasic.File * EncodeError end (* stop of ../../Unicode/Encode/encodeError.sml *) (* start of ../../Unicode/Encode/encodeMisc.sml *) (* require "basis.__word"; require "basis.__word8"; require "basis.__word8_vector"; require "chars"; require "encodeBasic"; require "encodeError"; *) signature EncodeMisc = sig val writeCharAscii : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharEbcdic : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharLatin1 : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4SB : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4SL : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf8 : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf16B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf16L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs2B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs2L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val validCharAscii : UniChar.Char -> bool val validCharEbcdic : UniChar.Char -> bool val validCharLatin1 : UniChar.Char -> bool end structure EncodeMisc : EncodeMisc = struct open UniChar EncodeBasic EncodeError infix 8 >> infix 7 && infix 6 || val op && = Chars.andb val op >> = Chars.>> val op || = Word8.orb fun splitSurrogates (c : Char) = (((c-0wx10000) >> 0w10)+0wxD800,c && 0wx3FF + 0wxDC00) fun Char2Byte c = Word8.fromLargeWord(Chars.toLargeWord c) (*---------------------------------------------------------------------*) (* Ascii *) (*---------------------------------------------------------------------*) fun validCharAscii (c : Char) = c<0wx80 fun writeCharAscii(c,f) = if c<0wx80 then writeByte(f,Char2Byte c) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"ASCII")) (*---------------------------------------------------------------------*) (* Ebcdic *) (*---------------------------------------------------------------------*) val latin2ebcdicTab = Word8Vector.fromList [0wx00,0wx01,0wx02,0wx03,0wx37,0wx2D,0wx2E,0wx2F, 0wx16,0wx05,0wx25,0wx0B,0wx0C,0wx0D,0wx0E,0wx0F, 0wx10,0wx11,0wx12,0wx13,0wx3C,0wx3D,0wx32,0wx26, 0wx18,0wx19,0wx3F,0wx27,0wx1C,0wx1D,0wx1E,0wx1F, 0wx40,0wx4F,0wx7F,0wx7B,0wx5B,0wx6C,0wx50,0wx7D, 0wx4D,0wx5D,0wx5C,0wx4E,0wx6B,0wx60,0wx4B,0wx61, 0wxF0,0wxF1,0wxF2,0wxF3,0wxF4,0wxF5,0wxF6,0wxF7, 0wxF8,0wxF9,0wx7A,0wx5E,0wx4C,0wx7E,0wx6E,0wx6F, 0wx7C,0wxC1,0wxC2,0wxC3,0wxC4,0wxC5,0wxC6,0wxC7, 0wxC8,0wxC9,0wxD1,0wxD2,0wxD3,0wxD4,0wxD5,0wxD6, 0wxD7,0wxD8,0wxD9,0wxE2,0wxE3,0wxE4,0wxE5,0wxE6, 0wxE7,0wxE8,0wxE9,0wx4A,0wxE0,0wx5A,0wx5F,0wx6D, 0wx79,0wx81,0wx82,0wx83,0wx84,0wx85,0wx86,0wx87, 0wx88,0wx89,0wx91,0wx92,0wx93,0wx94,0wx95,0wx96, 0wx97,0wx98,0wx99,0wxA2,0wxA3,0wxA4,0wxA5,0wxA6, 0wxA7,0wxA8,0wxA9,0wxC0,0wx6A,0wxD0,0wxA1,0wx07, 0wx20,0wx21,0wx22,0wx23,0wx24,0wx15,0wx06,0wx17, 0wx28,0wx29,0wx2A,0wx2B,0wx2C,0wx09,0wx0A,0wx1B, 0wx30,0wx31,0wx1A,0wx33,0wx34,0wx35,0wx36,0wx08, 0wx38,0wx39,0wx3A,0wx3B,0wx04,0wx14,0wx3E,0wxE1, 0wx41,0wx42,0wx43,0wx44,0wx45,0wx46,0wx47,0wx48, 0wx49,0wx51,0wx52,0wx53,0wx54,0wx55,0wx56,0wx57, 0wx58,0wx59,0wx62,0wx63,0wx64,0wx65,0wx66,0wx67, 0wx68,0wx69,0wx70,0wx71,0wx72,0wx73,0wx74,0wx75, 0wx76,0wx77,0wx78,0wx80,0wx8A,0wx8B,0wx8C,0wx8D, 0wx8E,0wx8F,0wx90,0wx9A,0wx9B,0wx9C,0wx9D,0wx9E, 0wx9F,0wxA0,0wxAA,0wxAB,0wxAC,0wxAD,0wxAE,0wxAF, 0wxB0,0wxB1,0wxB2,0wxB3,0wxB4,0wxB5,0wxB6,0wxB7, 0wxB8,0wxB9,0wxBA,0wxBB,0wxBC,0wxBD,0wxBE,0wxBF, 0wxCA,0wxCB,0wxCC,0wxCD,0wxCE,0wxCF,0wxDA,0wxDB, 0wxDC,0wxDD,0wxDE,0wxDF,0wxEA,0wxEB,0wxEC,0wxED, 0wxEE,0wxEF,0wxFA,0wxFB,0wxFC,0wxFD,0wxFE,0wxFF ] fun validCharEbcdic (c : Char) = c<0wx100 fun writeCharEbcdic(c,f) = if c<0wx100 then writeByte(f,Word8Vector.sub(latin2ebcdicTab,Chars.toInt c)) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"EBCDIC")) (*---------------------------------------------------------------------*) (* Latin1 *) (*---------------------------------------------------------------------*) fun validCharLatin1 (c : Char) = c<0wx100 fun writeCharLatin1(c,f) = if c<0wx100 then writeByte(f,Char2Byte c) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"LATIN-1")) (*---------------------------------------------------------------------*) (* UCS-4 *) (*---------------------------------------------------------------------*) fun ucs4Bytes c = (Char2Byte(c >> 0w24), Char2Byte(c >> 0w16), Char2Byte(c >> 0w8), Char2Byte c) fun writeCharUcs4 perm = fn (c,f) => let val bytes = ucs4Bytes c val (b1,b2,b3,b4) = perm bytes val f1 = writeByte(f,b1) val f2 = writeByte(f1,b2) val f3 = writeByte(f2,b3) val f4 = writeByte(f3,b4) in f4 end fun permUcs4B x = x fun permUcs4L (b1,b2,b3,b4) = (b4,b3,b2,b1) fun permUcs4SB (b1,b2,b3,b4) = (b2,b1,b4,b3) fun permUcs4SL (b1,b2,b3,b4) = (b3,b4,b1,b2) val writeCharUcs4B = writeCharUcs4 permUcs4B val writeCharUcs4L = writeCharUcs4 permUcs4L val writeCharUcs4SB = writeCharUcs4 permUcs4SB val writeCharUcs4SL = writeCharUcs4 permUcs4SL (*---------------------------------------------------------------------*) (* UTF-8 *) (*---------------------------------------------------------------------*) fun writeCharUtf8(c,f) = if c<0wx80 then writeByte(f,Char2Byte c) else if c<0wx800 then let val f1 = writeByte(f,0wxC0 || Char2Byte(c >> 0w6)) val f2 = writeByte(f1,0wx80 || Char2Byte(c && 0wx3F)) in f2 end else if c<0wx10000 then let val f1 = writeByte(f, 0wxE0 || Char2Byte(c >> 0w12)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte(c && 0wx3F)) in f3 end else if c<0wx200000 then let val f1 = writeByte(f, 0wxF0 || Char2Byte(c >> 0w18)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte(c && 0wx3F)) in f4 end else if c<0wx4000000 then let val f1 = writeByte(f, 0wxF8 || Char2Byte(c >> 0w24)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w18) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f5 = writeByte(f4,0wx80 || Char2Byte(c && 0wx3F)) in f5 end else let val f1 = writeByte(f, 0wxFC || Char2Byte(c >> 0w30)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w24) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w18) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f5 = writeByte(f4,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f6 = writeByte(f5,0wx80 || Char2Byte(c && 0wx3F)) in f6 end (*---------------------------------------------------------------------*) (* UTF-16 *) (*---------------------------------------------------------------------*) fun oneUtf16 isL (c,f) = let val (b1,b2) = (Char2Byte(c >> 0w8),Char2Byte c) in if isL then writeByte(writeByte(f,b2),b1) else writeByte(writeByte(f,b1),b2) end fun writeCharUtf16 isL = fn (c,f) => if c<0wx10000 then oneUtf16 isL (c,f) else let val (hi,lo) = splitSurrogates c val f1 = oneUtf16 isL (hi,f) val f2 = oneUtf16 isL (lo,f1) in f2 end val writeCharUtf16B = writeCharUtf16 false val writeCharUtf16L = writeCharUtf16 true (*---------------------------------------------------------------------*) (* UCS-2 *) (*---------------------------------------------------------------------*) fun writeCharUcs2 isL = fn (c,f) => if c<0wx10000 then let val (b1,b2) = (Char2Byte(c >> 0w8),Char2Byte c) in if isL then writeByte(writeByte(f,b2),b1) else writeByte(writeByte(f,b1),b2) end else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"UCS-2")) val writeCharUcs2B = writeCharUcs2 false val writeCharUcs2L = writeCharUcs2 true end (* stop of ../../Unicode/Encode/encodeMisc.sml *) (* start of ../../Unicode/Encode/encode.sml *) signature Encode = sig include EncodeError type File type EncFile val encNoFile : EncFile val encStdOut : EncFile val encOpenFile : string * Encoding.Encoding * string -> EncFile val encCloseFile : EncFile -> unit val encAdapt : EncFile * File -> EncFile val encPutChar : EncFile * UniChar.Char -> EncFile val encValidChar : EncFile * UniChar.Char -> bool end structure Encode : Encode = struct open Encoding UtilError EncodeBasic EncodeError EncodeMisc type EncFile = Encoding * File val encNoFile = (NOENC,stdOutFile) val encStdOut = (LATIN1,stdOutFile) fun encAdapt((enc,_),f) = (enc,f) fun encValidChar((enc,_),c) = case enc of ASCII => validCharAscii c | EBCDIC => validCharEbcdic c | LATIN1 => validCharLatin1 c | _ => true fun encPutChar((enc,f),c) = let val f1 = case enc of NOENC => f | ASCII => (writeCharAscii(c,f)) | EBCDIC => (writeCharEbcdic(c,f)) | LATIN1 => (writeCharLatin1(c,f)) | UCS2B => (writeCharUcs2B(c,f)) | UCS2L => (writeCharUcs2L(c,f)) | UCS4B => (writeCharUcs4B(c,f)) | UCS4L => (writeCharUcs4L(c,f)) | UCS4SB => (writeCharUcs4SB(c,f)) | UCS4SL => (writeCharUcs4SL(c,f)) | UTF8 => (writeCharUtf8(c,f)) | UTF16B => (writeCharUtf16B(c,f)) | UTF16L => (writeCharUtf16L(c,f)) in (enc,f1) end fun encCloseFile(_,f) = closeFile f fun encOpenFile (fname,enc,name) = let val outEnc = case enc of NOENC => (case isEncoding name of NOENC => raise NoSuchFile(fname,"Unsupported encoding \""^name^"\"") | enc => enc) | enc => enc val f = openFile fname val f1 = case outEnc of UTF16B => writeByte(writeByte(f,0wxFE),0wxFF) | UTF16L => writeByte(writeByte(f,0wxFF),0wxFE) | _ => f in (outEnc,f1) end end (* stop of ../../Unicode/Encode/encode.sml *) (* start of nullHard.sml *) (* structure NullHard = struct fun parseNull uri = NullParse.parseDocument uri NONE NullHooks.nullStart open NullCatOptions NullOptions Options NullParserOptions Uri val usage = List.concat [parserUsage,[("","")],catalogUsage,[("","")],nullUsage] exception Exit of OS.Process.status fun null(prog,args) = let val prog = "fxp" val hadError = ref false fun optError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in hadError := true end fun exitError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in raise Exit OS.Process.failure end fun exitHelp prog = let val _ = printUsage TextIO.stdOut prog usage in raise Exit OS.Process.success end fun exitVersion prog = let val _ = app print [prog," version ",Version.FXP_VERSION,"\n"] in raise Exit OS.Process.success end fun summOpt prog = "For a summary of options type "^prog^" --help" fun noFile(f,cause) = "can't open file '"^f^"': "^exnMessage cause val opts = parseOptions args val _ = setParserDefaults() val opts1 = setParserOptions (opts,optError) val _ = setCatalogDefaults() val opts2 = setCatalogOptions (opts1,optError) val _ = setNullDefaults() val (vers,help,err,file) = setNullOptions (opts2,optError) val _ = if !hadError then exitError (summOpt prog) else () val _ = if vers then exitVersion prog else () val _ = if help then exitHelp prog else () val _ = case err of SOME "-" => O_ERROR_DEVICE := TextIO.stdErr | SOME f => (O_ERROR_DEVICE := TextIO.openOut f handle IO.Io {cause,...} => exitError(noFile(f,cause))) | NONE => () val f = valOf file handle Option => "-" val uri = if f="-" then NONE else SOME(String2Uri f) val status = parseNull uri val _ = if isSome err then TextIO.closeOut (!O_ERROR_DEVICE) else () in status end handle Exit status => status | exn => let val _ = TextIO.output (TextIO.stdErr,prog^": Unexpected exception: "^exnMessage exn^".\n") in OS.Process.failure end end *) structure NullHard = struct end (* stop of nullHard.sml *) (* start of ../../Util/options.sml *) signature Options= sig datatype Option = OPT_LONG of string * string option | OPT_SHORT of char list | OPT_NEG of char list | OPT_NOOPT | OPT_STRING of string val parseOptions : string list -> Option list datatype UsageItem = U_SEP | U_TITLE of string | U_ITEM of string list * string type Usage = UsageItem list val printUsage : TextIO.outstream -> string -> Usage -> unit end structure Options : Options = struct exception BadOption of string datatype Option = OPT_LONG of string * string option | OPT_SHORT of char list | OPT_NEG of char list | OPT_NOOPT | OPT_STRING of string datatype UsageItem = U_SEP | U_TITLE of string | U_ITEM of string list * string type Usage = UsageItem list fun parseOptions ss = let fun doOne opt = if String.isPrefix "--" opt then let val opt1 = Substring.extract(opt,2,NONE) val (key0,opt2) = Substring.splitl (fn c => #"="<>c) opt1 val key = if Substring.isEmpty key0 then raise BadOption opt else Substring.string key0 val valOpt = if Substring.isPrefix "=" opt2 then let val val0 = Substring.triml 1 opt2 in if Substring.isEmpty val0 then raise BadOption opt else SOME(Substring.string val0) end else NONE in OPT_LONG(key,valOpt) end handle BadOption s => if opt="--" then OPT_NOOPT else OPT_STRING opt else if String.isPrefix "-" opt then let val chars = tl(String.explode opt) (* val _ = app (fn c => if Char.isAlphaNum c then () else raise BadOption opt) chars *) in case chars of nil => OPT_STRING opt | #"n"::(cs as _::_) => OPT_NEG cs | _ => OPT_SHORT chars end handle BadOption s => OPT_STRING opt else OPT_STRING opt fun doAll nil = nil | doAll (s::ss) = let val opt = doOne s in case opt of OPT_NOOPT => opt::map OPT_STRING ss | _ => opt::doAll ss end in doAll ss end fun printUsage stream prog usage = let val KEY_WIDTH = 30 val LINE_WIDTH = 80 val EMPTY_KEY = UtilString.nBlanks KEY_WIDTH fun appendKeys col nil = if col>KEY_WIDTH then "\n"^EMPTY_KEY else UtilString.nBlanks (KEY_WIDTH-col) | appendKeys col [key] = key^" "^appendKeys (col+1+String.size key) nil | appendKeys col (key::keys) = let val col1 = col+2+String.size key in if col1>KEY_WIDTH then key^",\n"^appendKeys 0 keys else key^", "^appendKeys col1 keys end fun makeKey keylist = appendKeys 0 keylist val makeText = UtilString.breakLines(LINE_WIDTH-KEY_WIDTH) fun format (keylist,text) = let val key = makeKey keylist in case makeText text of nil => [key] | line::lines => key^line::map (fn line => EMPTY_KEY^line) lines end val _ = app (fn x => TextIO.output(stream,x)) ["Usage: ",prog," [option ...] file\n","where option is one of:\n\n"] val _ = app (fn item => app (fn x => TextIO.output(stream,x^"\n")) (case item of U_SEP => [""] | U_TITLE txt => ["",txt] | U_ITEM option => format option)) usage in () end end (* stop of ../../Util/options.sml *) (* start of ../../config.sml *) structure Config = struct (*---------------------------------------------------------------------*) (* The OS command for retrieving a URI from the internet and storing *) (* it in a local file, where *) (* %1 is replaced by the URI. *) (* %2 is replaced by the local filename. *) (* It is recommended that the command exits with failure in case the *) (* URI cannot be retrieved. If the command generates a HTML error *) (* message instead (like, e.g., lynx), this HTML file is considered *) (* to be XML and will probably cause a mess of parsing errors. If you *) (* don't need URI retrieval, use "exit 1" which always fails. *) (* Sensible values are, e.g.: *) (* val retrieveCommand = "wget -qO %2 %1" *) (* val retrieveCommand = "got_it -o %2 %1" *) (* val retrieveCommand = "urlget -s -o %2 %1" *) (*---------------------------------------------------------------------*) val retrieveCommand = "wget -qO %2 %1" end (* stop of ../../config.sml *) (* start of ../../Unicode/Chars/charClasses.sml *) (*--------------------------------------------------------------------------*) (* Structure: CharClasses *) (* *) (* Notes: *) (* This implementation uses the UNSAFE array operations, and does NO *) (* range checks. This is for efficiency reasons. *) (* If class=makeCharClass(lo,hi) then a filed of size hi-lo+1 is allo- *) (* cated. In order to lookup a character, first make sure it in [lo..hi], *) (* then subtract lo before calling inCharClass! *) (* The same holds for addChar. *) (* *) (* Depends on: *) (* UniChar *) (* UtilInt *) (* *) (* Exceptions raised by functions in this structure: *) (* addChar : none *) (* addCharClass : none *) (* inCharClass : none *) (* makeCharClass : none *) (*--------------------------------------------------------------------------*) signature CharClasses = sig type CharClass type MutableClass type CharInterval = UniChar.Char * UniChar.Char type CharRange = CharInterval list val initialize : CharInterval -> MutableClass val finalize : MutableClass -> CharClass val addChar : MutableClass * UniChar.Char * UniChar.Char * UniChar.Char -> unit val addCharRange : MutableClass * UniChar.Char * UniChar.Char * CharRange -> CharRange val inCharClass : UniChar.Char * CharClass -> bool end structure CharClasses : CharClasses = struct open UniChar type CharInterval = Char * Char type CharRange = CharInterval list val Char2Word = Word.fromLargeWord o Chars.toLargeWord (*--------------------------------------------------------------------*) (* helpers *) (*--------------------------------------------------------------------*) infix 5 >> >>> <<< infix 6 || ||| infix 6 -- infix 7 & && &&& val op >> = Chars.>> val op -- = Chars.- val op || = Chars.orb val op && = Chars.andb val op >>> = Word32.>> val op <<< = Word32.<< val op &&& = Word32.andb val op ||| = Word32.orb val op & = Word.andb val max32 = Word32.notb 0wx0 (*--------------------------------------------------------------------*) (* a char class is an array of words, interpreted as bitvectors. *) (*--------------------------------------------------------------------*) type MutableClass = Word32.word array type CharClass = Word32.word vector (*--------------------------------------------------------------------*) (* each word in a char class holds 32 entries. Thus the for a char c *) (* is c div 32 == c >> 5. The bitmask is a word of zeros, only the *) (* significant bit for c, i.e. the (c && 31==0x1F)th bit set to one. *) (*--------------------------------------------------------------------*) fun indexMask c = let val idx = Chars.toInt(c>>0w5) val mask = 0wx1 <<< Char2Word c & 0w31 in (idx,mask) end (*--------------------------------------------------------------------*) (* generate index and mask, then lookup. *) (*--------------------------------------------------------------------*) fun inCharClass(c,vec) = let val (idx,mask) = indexMask c in mask &&& Vector.sub(vec,idx) <> 0wx0 end (*--------------------------------------------------------------------*) (* generate a CharClass large enough to hold (max-min+1) characters. *) (*--------------------------------------------------------------------*) fun initialize(min,max) = Array.array((Chars.toInt max-Chars.toInt min+1) div 32+1,0wx0):MutableClass fun finalize arr = Array.extract(arr,0,NONE) (*--------------------------------------------------------------------*) (* add a single character to a CharClass. *) (*--------------------------------------------------------------------*) fun addChar(cls,min,max,c) = let val (idx,new) = indexMask c val old = Array.sub(cls,idx) in Array.update(cls,idx,old|||new) end (*--------------------------------------------------------------------*) (* add a full range of characters to a CharClass. *) (* this is the only function that computes the offset before access *) (* to the array. *) (*--------------------------------------------------------------------*) fun addCharRange(cls,min,max,range) = let fun doOne (lo,hi) = let val (l,h) = (lo-min,hi-min) val (idxL,idxH) = ((Chars.toInt l) div 32,(Chars.toInt h) div 32) val (bitL,bitH) = (Char2Word l & 0w31,Char2Word h & 0w31) in if idxL=idxH then let val new = (max32>>>(0w31-bitH+bitL))<<>>(0w31-bitH) val oldL = Array.sub(cls,idxL) val oldH = Array.sub(cls,idxH) val _ = Array.update(cls,idxL,oldL|||newL) val _ = Array.update(cls,idxH,oldH|||newH) val _ = UtilInt.appInterval (fn i => Array.update(cls,i,max32)) (idxL+1,idxH-1) in () end else () end fun doAll nil = nil | doAll ((lh as (lo,hi))::lhs) = if himax then lh::doAll lhs else if lo=min andalso hi<=max then (doOne lh; doAll lhs) else if lo>=min andalso hi>max then (doOne(lo,max); (max+0w1,hi)::lhs) else (doOne(min,max); (max+0w1,hi)::lhs) val _ = doAll range in doAll range end end (* stop of ../../Unicode/Chars/charClasses.sml *) (* start of ../../Unicode/Chars/uniRanges.sml *) structure UniRanges = struct val digitRange = [(0wx0030,0wx0039), (0wx0660,0wx0669), (0wx06F0,0wx06F9), (0wx0966,0wx096F), (0wx09E6,0wx09EF), (0wx0A66,0wx0A6F), (0wx0AE6,0wx0AEF), (0wx0B66,0wx0B6F), (0wx0BE7,0wx0BEF), (0wx0C66,0wx0C6F), (0wx0CE6,0wx0CEF), (0wx0D66,0wx0D6F), (0wx0E50,0wx0E59), (0wx0ED0,0wx0ED9), (0wx0F20,0wx0F29) ] : CharClasses.CharRange val digitRange09 = [(0wx0030,0wx0039), (0wx0660,0wx0669), (0wx06F0,0wx06F9), (0wx0E50,0wx0E59), (0wx0ED0,0wx0ED9), (0wx0F20,0wx0F29) ] : CharClasses.CharRange val digitRange6F = [(0wx0966,0wx096F), (0wx09E6,0wx09EF), (0wx0A66,0wx0A6F), (0wx0AE6,0wx0AEF), (0wx0B66,0wx0B6F), (0wx0BE7,0wx0BEF), (0wx0C66,0wx0C6F), (0wx0CE6,0wx0CEF), (0wx0D66,0wx0D6F) ] : CharClasses.CharRange val baseRange = [(0wx0041,0wx005A), (0wx0061,0wx007A), (0wx00C0,0wx00D6), (0wx00D8,0wx00F6), (0wx00F8,0wx00FF), (0wx0100,0wx0131), (0wx0134,0wx013E), (0wx0141,0wx0148), (0wx014A,0wx017E), (0wx0180,0wx01C3), (0wx01CD,0wx01F0), (0wx01F4,0wx01F5), (0wx01FA,0wx0217), (0wx0250,0wx02A8), (0wx02BB,0wx02C1), (0wx0386,0wx0386), (0wx0388,0wx038A), (0wx038C,0wx038C), (0wx038E,0wx03A1), (0wx03A3,0wx03CE), (0wx03D0,0wx03D6), (0wx03DA,0wx03DA), (0wx03DC,0wx03DC), (0wx03DE,0wx03DE), (0wx03E0,0wx03E0), (0wx03E2,0wx03F3), (0wx0401,0wx040C), (0wx040E,0wx044F), (0wx0451,0wx045C), (0wx045E,0wx0481), (0wx0490,0wx04C4), (0wx04C7,0wx04C8), (0wx04CB,0wx04CC), (0wx04D0,0wx04EB), (0wx04EE,0wx04F5), (0wx04F8,0wx04F9), (0wx0531,0wx0556), (0wx0559,0wx0559), (0wx0561,0wx0586), (0wx05D0,0wx05EA), (0wx05F0,0wx05F2), (0wx0621,0wx063A), (0wx0641,0wx064A), (0wx0671,0wx06B7), (0wx06BA,0wx06BE), (0wx06C0,0wx06CE), (0wx06D0,0wx06D3), (0wx06D5,0wx06D5), (0wx06E5,0wx06E6), (0wx0905,0wx0939), (0wx093D,0wx093D), (0wx0958,0wx0961), (0wx0985,0wx098C), (0wx098F,0wx0990), (0wx0993,0wx09A8), (0wx09AA,0wx09B0), (0wx09B2,0wx09B2), (0wx09B6,0wx09B9), (0wx09DC,0wx09DD), (0wx09DF,0wx09E1), (0wx09F0,0wx09F1), (0wx0A05,0wx0A0A), (0wx0A0F,0wx0A10), (0wx0A13,0wx0A28), (0wx0A2A,0wx0A30), (0wx0A32,0wx0A33), (0wx0A35,0wx0A36), (0wx0A38,0wx0A39), (0wx0A59,0wx0A5C), (0wx0A5E,0wx0A5E), (0wx0A72,0wx0A74), (0wx0A85,0wx0A8B), (0wx0A8D,0wx0A8D), (0wx0A8F,0wx0A91), (0wx0A93,0wx0AA8), (0wx0AAA,0wx0AB0), (0wx0AB2,0wx0AB3), (0wx0AB5,0wx0AB9), (0wx0ABD,0wx0ABD), (0wx0AE0,0wx0AE0), (0wx0B05,0wx0B0C), (0wx0B0F,0wx0B10), (0wx0B13,0wx0B28), (0wx0B2A,0wx0B30), (0wx0B32,0wx0B33), (0wx0B36,0wx0B39), (0wx0B3D,0wx0B3D), (0wx0B5C,0wx0B5D), (0wx0B5F,0wx0B61), (0wx0B85,0wx0B8A), (0wx0B8E,0wx0B90), (0wx0B92,0wx0B95), (0wx0B99,0wx0B9A), (0wx0B9C,0wx0B9C), (0wx0B9E,0wx0B9F), (0wx0BA3,0wx0BA4), (0wx0BA8,0wx0BAA), (0wx0BAE,0wx0BB5), (0wx0BB7,0wx0BB9), (0wx0C05,0wx0C0C), (0wx0C0E,0wx0C10), (0wx0C12,0wx0C28), (0wx0C2A,0wx0C33), (0wx0C35,0wx0C39), (0wx0C60,0wx0C61), (0wx0C85,0wx0C8C), (0wx0C8E,0wx0C90), (0wx0C92,0wx0CA8), (0wx0CAA,0wx0CB3), (0wx0CB5,0wx0CB9), (0wx0CDE,0wx0CDE), (0wx0CE0,0wx0CE1), (0wx0D05,0wx0D0C), (0wx0D0E,0wx0D10), (0wx0D12,0wx0D28), (0wx0D2A,0wx0D39), (0wx0D60,0wx0D61), (0wx0E01,0wx0E2E), (0wx0E30,0wx0E30), (0wx0E32,0wx0E33), (0wx0E40,0wx0E45), (0wx0E81,0wx0E82), (0wx0E84,0wx0E84), (0wx0E87,0wx0E88), (0wx0E8A,0wx0E8A), (0wx0E8D,0wx0E8D), (0wx0E94,0wx0E97), (0wx0E99,0wx0E9F), (0wx0EA1,0wx0EA3), (0wx0EA5,0wx0EA5), (0wx0EA7,0wx0EA7), (0wx0EAA,0wx0EAB), (0wx0EAD,0wx0EAE), (0wx0EB0,0wx0EB0), (0wx0EB2,0wx0EB3), (0wx0EBD,0wx0EBD), (0wx0EC0,0wx0EC4), (0wx0F40,0wx0F47), (0wx0F49,0wx0F69), (0wx10A0,0wx10C5), (0wx10D0,0wx10F6), (0wx1100,0wx1100), (0wx1102,0wx1103), (0wx1105,0wx1107), (0wx1109,0wx1109), (0wx110B,0wx110C), (0wx110E,0wx1112), (0wx113C,0wx113C), (0wx113E,0wx113E), (0wx1140,0wx1140), (0wx114C,0wx114C), (0wx114E,0wx114E), (0wx1150,0wx1150), (0wx1154,0wx1155), (0wx1159,0wx1159), (0wx115F,0wx1161), (0wx1163,0wx1163), (0wx1165,0wx1165), (0wx1167,0wx1167), (0wx1169,0wx1169), (0wx116D,0wx116E), (0wx1172,0wx1173), (0wx1175,0wx1175), (0wx119E,0wx119E), (0wx11A8,0wx11A8), (0wx11AB,0wx11AB), (0wx11AE,0wx11AF), (0wx11B7,0wx11B8), (0wx11BA,0wx11BA), (0wx11BC,0wx11C2), (0wx11EB,0wx11EB), (0wx11F0,0wx11F0), (0wx11F9,0wx11F9), (0wx1E00,0wx1E9B), (0wx1EA0,0wx1EF9), (0wx1F00,0wx1F15), (0wx1F18,0wx1F1D), (0wx1F20,0wx1F45), (0wx1F48,0wx1F4D), (0wx1F50,0wx1F57), (0wx1F59,0wx1F59), (0wx1F5B,0wx1F5B), (0wx1F5D,0wx1F5D), (0wx1F5F,0wx1F7D), (0wx1F80,0wx1FB4), (0wx1FB6,0wx1FBC), (0wx1FBE,0wx1FBE), (0wx1FC2,0wx1FC4), (0wx1FC6,0wx1FCC), (0wx1FD0,0wx1FD3), (0wx1FD6,0wx1FDB), (0wx1FE0,0wx1FEC), (0wx1FF2,0wx1FF4), (0wx1FF6,0wx1FFC), (0wx2126,0wx2126), (0wx212A,0wx212B), (0wx212E,0wx212E), (0wx2180,0wx2182), (0wx3041,0wx3094), (0wx30A1,0wx30FA), (0wx3105,0wx312C), (0wxAC00,0wxD7A3) ] : CharClasses.CharRange val ideoRange = [(0wx3007,0wx3007), (0wx3021,0wx3029), (0wx4E00,0wx9FA5) ] : CharClasses.CharRange val combRange = [(0wx0300,0wx0345), (0wx0360,0wx0361), (0wx0483,0wx0486), (0wx0591,0wx05A1), (0wx05A3,0wx05B9), (0wx05BB,0wx05BD), (0wx05BF,0wx05BF), (0wx05C1,0wx05C2), (0wx05C4,0wx05C4), (0wx064B,0wx0652), (0wx0670,0wx0670), (0wx06D6,0wx06DC), (0wx06DD,0wx06DF), (0wx06E0,0wx06E4), (0wx06E7,0wx06E8), (0wx06EA,0wx06ED), (0wx0901,0wx0903), (0wx093C,0wx093C), (0wx093E,0wx094C), (0wx094D,0wx094D), (0wx0951,0wx0954), (0wx0962,0wx0963), (0wx0981,0wx0983), (0wx09BC,0wx09BC), (0wx09BE,0wx09BE), (0wx09BF,0wx09BF), (0wx09C0,0wx09C4), (0wx09C7,0wx09C8), (0wx09CB,0wx09CD), (0wx09D7,0wx09D7), (0wx09E2,0wx09E3), (0wx0A02,0wx0A02), (0wx0A3C,0wx0A3C), (0wx0A3E,0wx0A3E), (0wx0A3F,0wx0A3F), (0wx0A40,0wx0A42), (0wx0A47,0wx0A48), (0wx0A4B,0wx0A4D), (0wx0A70,0wx0A71), (0wx0A81,0wx0A83), (0wx0ABC,0wx0ABC), (0wx0ABE,0wx0AC5), (0wx0AC7,0wx0AC9), (0wx0ACB,0wx0ACD), (0wx0B01,0wx0B03), (0wx0B3C,0wx0B3C), (0wx0B3E,0wx0B43), (0wx0B47,0wx0B48), (0wx0B4B,0wx0B4D), (0wx0B56,0wx0B57), (0wx0B82,0wx0B83), (0wx0BBE,0wx0BC2), (0wx0BC6,0wx0BC8), (0wx0BCA,0wx0BCD), (0wx0BD7,0wx0BD7), (0wx0C01,0wx0C03), (0wx0C3E,0wx0C44), (0wx0C46,0wx0C48), (0wx0C4A,0wx0C4D), (0wx0C55,0wx0C56), (0wx0C82,0wx0C83), (0wx0CBE,0wx0CC4), (0wx0CC6,0wx0CC8), (0wx0CCA,0wx0CCD), (0wx0CD5,0wx0CD6), (0wx0D02,0wx0D03), (0wx0D3E,0wx0D43), (0wx0D46,0wx0D48), (0wx0D4A,0wx0D4D), (0wx0D57,0wx0D57), (0wx0E31,0wx0E31), (0wx0E34,0wx0E3A), (0wx0E47,0wx0E4E), (0wx0EB1,0wx0EB1), (0wx0EB4,0wx0EB9), (0wx0EBB,0wx0EBC), (0wx0EC8,0wx0ECD), (0wx0F18,0wx0F19), (0wx0F35,0wx0F35), (0wx0F37,0wx0F37), (0wx0F39,0wx0F39), (0wx0F3E,0wx0F3E), (0wx0F3F,0wx0F3F), (0wx0F71,0wx0F84), (0wx0F86,0wx0F8B), (0wx0F90,0wx0F95), (0wx0F97,0wx0F97), (0wx0F99,0wx0FAD), (0wx0FB1,0wx0FB7), (0wx0FB9,0wx0FB9), (0wx20D0,0wx20DC), (0wx20E1,0wx20E1), (0wx302A,0wx302F), (0wx3099,0wx3099), (0wx309A,0wx309A) ] : CharClasses.CharRange val extRange = [(0wx00B7,0wx00B7), (0wx02D0,0wx02D0), (0wx02D1,0wx02D1), (0wx0387,0wx0387), (0wx0640,0wx0640), (0wx0E46,0wx0E46), (0wx0EC6,0wx0EC6), (0wx3005,0wx3005), (0wx3031,0wx3035), (0wx309D,0wx309E), (0wx30FC,0wx30FE) ] : CharClasses.CharRange val nmsRange = List.concat [[(0wx3A,0wx3A),(0wx5F,0wx5F)](* :_ *), baseRange, ideoRange] val nameRange = List.concat [[(0wx2D,0wx2D),(0wx2E,0wx2E)](* -. *), digitRange, combRange, extRange, nmsRange] val pubidRange = List.concat [map (fn c => (c,c)) [0wx0A,0wx0D,0wx20], (* space,cr,lf *) map (fn c => (c,c)) (UniChar.String2Data "-'()+,./:=?;!*#@$_%"), [(0wx0030,0wx0039),(0wx0041,0wx005A),(0wx0061,0wx007A)] (* [0-9A-Za-z] *) ] : CharClasses.CharRange val encRange = [(0wx002D,0wx002E), (* -. *) (0wx0030,0wx0039), (* 0-9 *) (0wx0041,0wx005A), (* A-Z *) (0wx005F,0wx005F), (* _ *) (0wx0061,0wx007A) (* a-z *) ] : CharClasses.CharRange end (* stop of ../../Unicode/Chars/uniRanges.sml *) (* start of ../../Unicode/Chars/uniClasses.sml *) (*--------------------------------------------------------------------------*) (* Structure: UniClasses *) (* *) (* Notes: *) (* read CharClasses in order to understand how CharClasses are handled. *) (* *) (* Depends on: *) (* UniChar *) (* CharClasses *) (* *) (* Exceptions raised by functions in this structure: *) (* decValue : none *) (* hexValue : none *) (* isAsciiLetter : none *) (* isEnc : none *) (* isEncS : none *) (* isName : none *) (* isNms : none *) (* isPubid : none *) (* isS : none *) (* isXml : none *) (* isUnicode : none *) (* isVers : none *) (*--------------------------------------------------------------------------*) signature UniClasses = sig val isName : UniChar.Char -> bool val isNms : UniChar.Char -> bool val isPubid : UniChar.Char -> bool val isS : UniChar.Char -> bool val isEnc : UniChar.Char -> bool val isEncS : UniChar.Char -> bool val isVers : UniChar.Char -> bool val isDec : UniChar.Char -> bool val isHex : UniChar.Char -> bool val isXml : UniChar.Char -> bool val isUnicode : UniChar.Char -> bool val decValue : UniChar.Char -> UniChar.Char option val hexValue : UniChar.Char -> UniChar.Char option val isAsciiLetter : UniChar.Char -> bool end structure UniClasses : UniClasses = struct open UniChar CharClasses UniRanges (*--------------------------------------------------------------------*) (* initialize the character classes. *) (*--------------------------------------------------------------------*) local val nmsTemp = initialize(0wx0000,0wx3FFF) val restNms = addCharRange(nmsTemp,0wx0000,0wx3FFF,nmsRange) val _ = if restNms=[(0wxAC00,0wxD7A3),(0wx4E00,0wx9FA5)] then () else print ("Warning: extra characters after computing nms char class.\n") val nameTemp = initialize(0wx0000,0wxFFFF) val restName = addCharRange(nameTemp,0wx0000,0wx3FFF,nameRange) val _ = if restName=[(0wxAC00,0wxD7A3),(0wx4E00,0wx9FA5)] then () else print ("Warning: extra characters after computing name char class.\n") val pubTemp = initialize(0wx0000,0wx007F) val restPubid = addCharRange(pubTemp,0wx0000,0wx007F,pubidRange) val _ = if restPubid=nil then () else print ("Warning: extra characters after computing pubid char class.\n") val encTemp = initialize(0wx0000,0wx007F) val restEnc = addCharRange(encTemp,0wx0000,0wx007F,encRange) val _ = if restEnc=nil then () else print ("Warning: extra characters after computing enc char class.\n") in val nmsClass = finalize nmsTemp val nameClass = finalize nameTemp val pubClass = finalize pubTemp val encClass = finalize encTemp end (*--------------------------------------------------------------------*) (* is a character a name start char? *) (*--------------------------------------------------------------------*) fun isNms c = if c<0wx4000 then inCharClass(c,nmsClass) else c>=0wx4E00 andalso c<=0wx9FA5 orelse c>=0wxAC00 andalso c<=0wxD7A3 (*--------------------------------------------------------------------*) (* is a character a name char? *) (*--------------------------------------------------------------------*) fun isName c = if c<0wx4000 then inCharClass(c,nameClass) else c>=0wx4E00 andalso c<=0wx9FA5 orelse c>=0wxAC00 andalso c<=0wxD7A3 (*--------------------------------------------------------------------*) (* is a character a pubid char? *) (*--------------------------------------------------------------------*) fun isPubid c = c<0wx80 andalso inCharClass(c,pubClass) (*--------------------------------------------------------------------*) (* is a character valid in an encoding name, at its start, or in a *) (* version number? *) (*--------------------------------------------------------------------*) fun isEnc c = c<0wx80 andalso inCharClass(c,encClass) fun isEncS (c:UniChar.Char) = c>=0wx41 andalso c<=0wx5A orelse c>=0wx61 andalso c<=0wx7A fun isVers c = isEnc c orelse c=0wx3A (* #":" *) (*--------------------------------------------------------------------*) (* these are the valid Unicode characters (including surrogates). *) (*--------------------------------------------------------------------*) fun isUnicode (c:UniChar.Char) = c<=0wx10FFFF (*--------------------------------------------------------------------*) (* XML characters if not checked for Unicode char in advance. *) (*--------------------------------------------------------------------*) fun isXml (c:UniChar.Char) = c>=0wx0020 andalso c<=0wxD7FF orelse c>=0wxE000 andalso c<=0wxFFFD orelse c>=0wx10000 andalso c<=0wx10FFFF orelse c=0wx9 orelse c=0wxA orelse c=0wxD (*--------------------------------------------------------------------*) (* the frontend supresses 0wxD (carriage return), but its is still *) (* present when encoding is recognized. *) (*--------------------------------------------------------------------*) fun isS (c:UniChar.Char) = case c of 0wx09 => true | 0wx0A => true | 0wx0D => true | 0wx20 => true | _ => false (*--------------------------------------------------------------------*) (* is this character an ascii decimal/hexadecimal digit? *) (*--------------------------------------------------------------------*) fun isDec (c:UniChar.Char) = c>=0wx30 andalso c<=0wx39 fun isHex (c:UniChar.Char) = c>=0wx30 andalso c<=0wx39 orelse c>=0wx41 andalso c<=0wx46 orelse c>=0wx61 andalso c<=0wx66 (*--------------------------------------------------------------------*) (* calculate the decimal/hexadecimal value of an ascii (hex-)digit. *) (*--------------------------------------------------------------------*) fun decValue (c:UniChar.Char) = let val v = c-0wx30 in if v<=0wx9 then SOME v else NONE end fun hexValue (c:UniChar.Char) = let val v = c-0wx30 in if v<=0wx9 then SOME v else (if c>=0wx41 andalso c<=0wx46 then SOME(c-0wx37) else if c>=0wx61 andalso c<=0wx66 then SOME(c-0wx57) else NONE) end (*--------------------------------------------------------------------*) (* is c in [a-z]+[A-Z]? *) (*--------------------------------------------------------------------*) fun isAsciiLetter (c:UniChar.Char) = c>=0wx41 andalso c<=0wx5A orelse c>=0wx61 andalso c<=0wx7A end (* stop of ../../Unicode/Chars/uniClasses.sml *) (* start of ../../Unicode/Uri/uriDecode.sml *) signature UriDecode = sig val decodeUriLatin : string -> string val decodeUriUtf8 : string -> string end structure UriDecode : UriDecode = struct open UniChar UtilInt infix 8 << <<< infix 7 && infix 6 || ||| val op && = Word8.andb val op << = Word8.<< val op <<< = Chars.<< val op || = Word8.orb val op ||| = Chars.orb val Byte2Char = Chars.fromLargeWord o Word8.toLargeWord fun hexValue c = if #"0"<=c andalso #"9">=c then SOME (Byte.charToByte c-0wx30) else if #"A"<=c andalso #"F">=c then SOME (Byte.charToByte c-0wx37) else if #"a"<=c andalso #"f">=c then SOME (Byte.charToByte c-0wx57) else NONE exception Failed of char list fun getQuads cs = case cs of c1::c2::cs1 => (case (hexValue c1,hexValue c2) of (SOME b1,SOME b2) => ((b1 << 0w4 || b2),cs1) | _ => raise Failed cs1) | _ => raise Failed nil (*--------------------------------------------------------------------*) (* decode UTF-8 *) (*--------------------------------------------------------------------*) val byte1switch = Array.array(256,1) (* 1 byte *) val _ = appInterval (fn i => Array.update(byte1switch,i,0)) (0x80,0xBF) (* Error *) val _ = appInterval (fn i => Array.update(byte1switch,i,2)) (0xC0,0xDF) (* 2 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,3)) (0xE0,0xEF) (* 3 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,4)) (0xF0,0xF7) (* 4 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,5)) (0xF8,0xFB) (* 5 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,6)) (0xFC,0xFD) (* 6 bytes *) val diff2 = 0wx00003080 val diff3 = diff2 <<< 0wx6 ||| 0wx00020080 val diff4 = diff3 <<< 0wx6 ||| 0wx00400080 val diff5 = diff4 <<< 0wx6 ||| 0wx08000080 val diff6 = diff5 <<< 0wx6 ||| 0wx00000080 val diffsByLen = Vector.fromList [0w0,0w0,diff2,diff3,diff4,diff5,diff6] fun getByte cs = case cs of #"%"::cs1 => getQuads cs1 | c::cs1 => (Byte.charToByte c,cs1) | nil => raise Failed nil fun getBytes(b,cs,n) = let fun do_err (cs,m) = if n do_err(cs,m+1) val w1 = if b && 0wxC0 = 0wx80 then w <<< 0w6 + Byte2Char b else do_err(cs1,m+1) in doit (w1,cs1,m+1) end val (w,cs1) = doit (Byte2Char b,cs,2) val diff = Vector.sub(diffsByLen,n) val c = w-diff in if c<0wx100 then (Char2char c,cs1) else raise Failed cs1 end fun getCharUtf8 cs = let val (b,cs1) = getQuads cs in case Array.sub(byte1switch,Word8.toInt b) of 0 (* error *) => raise Failed cs1 | 1 (* 1 byte *) => (Byte.byteToChar b,cs1) | n (* n bytes *) => getBytes(b,cs1,n) end fun decodeUriUtf8 str = let val cs = String.explode str fun doit yet nil = yet | doit yet (c::cs) = if #"%"<>c then doit (c::yet) cs else let val (yet1,cs1) = let val (ch,cs1) = getCharUtf8 cs in (ch::yet,cs1) end handle Failed cs => (yet,cs) in doit yet1 cs1 end in String.implode(rev(doit nil cs)) end (*--------------------------------------------------------------------*) (* decode Latin *) (*--------------------------------------------------------------------*) fun getChar cs = case cs of #"%"::cs1 => let val (b,cs2) = getQuads cs1 in (Byte.byteToChar b,cs2) end | c::cs1 => (c,cs1) | nil => raise Failed nil fun decodeUriLatin str = let val cs = String.explode str fun doit yet nil = yet | doit yet (c::cs) = let val (yet1,cs1) = let val (ch,cs1) = getChar cs in (ch::yet,cs1) end handle Failed cs => (yet,cs) in doit yet1 cs1 end in String.implode(rev(doit nil cs)) end end (* stop of ../../Unicode/Uri/uriDecode.sml *) (* start of ../../Unicode/Uri/uriEncode.sml *) signature UriEncode = sig val Data2UriUtf8 : UniChar.Data -> string val Data2UriLatin : UniChar.Data -> string val Vector2UriUtf8 : UniChar.Vector -> string val Vector2UriLatin : UniChar.Vector -> string val String2UriUtf8 : string -> string val String2UriLatin : string -> string end structure UriEncode : UriEncode = struct open UniChar UniClasses infix 8 >> >>> infix 7 && &&& infix 6 || val op && = Word8.andb val op &&& = Chars.andb val op >> = Word8.>> val op >>> = Chars.>> val op || = Word8.orb val Char2Byte = Word8.fromLargeWord o Chars.toLargeWord fun encodeCharUtf8 c = if c<0wx80 then [Char2Byte c] else if c<0wx800 then [0wxC0 || Char2Byte(c >>> 0w6), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx10000 then [0wxE0 || Char2Byte(c >>> 0w12), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx200000 then [0wxF0 || Char2Byte(c >>> 0w18), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx4000000 then [0wxF8 || Char2Byte(c >>> 0w24), 0wx80 || Char2Byte((c >>> 0w18) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else [0wxFC || Char2Byte(c >>> 0w30), 0wx80 || Char2Byte((c >>> 0w24) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w18) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] fun Byte2Cc b = let fun Quad2C b = if b<0wxA then Byte.byteToChar(b+0wx30) else Byte.byteToChar(b+0wx37) in (Quad2C(b >> 0w4),Quad2C(b && 0wx0F)) end fun precedesHex (i,cv) = if Vector.length cv <= i+2 then false else let val (c1,c2) = (Vector.sub(cv,i+1),Vector.sub(cv,i+2)) in isHex c1 andalso isHex c2 end fun Vector2UriUtf8 cv = let val revd = Vector.foldli (fn (i,c,s) => if c<0wx80 andalso (c<>0wx25 orelse precedesHex(i,cv)) then Char2char c::s else foldl (fn (b,s) => let val (c1,c2) = Byte2Cc b in c2::c1:: #"%"::s end) s (encodeCharUtf8 c)) nil (cv,0,NONE) in String.implode (rev revd) end fun Vector2UriLatin cv = let val revd = Vector.foldli (fn (i,c,s) => if c<0wx80 andalso (c<>0wx25 orelse precedesHex(i,cv)) then Char2char c::s else (if c>= 0w100 then s else let val (c1,c2) = Byte2Cc (Char2Byte c) in c2::c1:: #"%"::s end)) nil (cv,0,NONE) in String.implode (rev revd) end val Data2UriUtf8 = Vector2UriUtf8 o Data2Vector val Data2UriLatin = Vector2UriLatin o Data2Vector val String2UriUtf8 = Vector2UriUtf8 o String2Vector val String2UriLatin = Vector2UriLatin o String2Vector end (* stop of ../../Unicode/Uri/uriEncode.sml *) (* start of ../../Unicode/Uri/uri.sml *) (* require "basis.__array"; require "basis.__byte"; require "basis.__string"; require "basis.__vector"; require "basis.__word"; require "basis.__word8"; require "util.unsafe"; require "util.utilInt"; require "chars"; require "naming"; *) signature Uri = sig eqtype Uri val emptyUri : Uri val hashUri : Uri -> word val compareUri : Uri * Uri -> order val uriJoin : Uri * Uri -> Uri val uriSuffix : Uri -> string val Data2Uri : UniChar.Data -> Uri val Vector2Uri : UniChar.Vector -> Uri val String2Uri : string -> Uri val Uri2String : Uri -> string val retrieveUri : Uri -> string * string * bool end structure Uri :> Uri = struct open UniChar UniClasses UriDecode UriEncode UtilError UtilInt (*--------------------------------------------------------------------*) (* decoding *) (*--------------------------------------------------------------------*) type Uri = string val emptyUri = "" val Vector2Uri = Vector2UriUtf8 val Data2Uri = Data2UriUtf8 val String2Uri = String2UriUtf8 val Uri2String = decodeUriUtf8 val slash = "/" fun uriSuffix s = let fun search i = if i<0 then NONE else case String.sub(s,i) of #"." => SOME i | #"/" => NONE | _ => search (i-1) in case search (String.size s-1) of NONE => "" | SOME i => String.extract(s,i+1,NONE) end fun isScheme c = Char.isAlphaNum c orelse #"+"=c orelse #"-"=c orelse #"."=c fun uriAbsolute uri = let fun search i = if i>=String.size uri then false else let val c=String.sub(uri,i) in if #":"=c then true else if isScheme c then search (i+1) else false end in if uri="" then false else if Char.isAlpha (String.sub(uri,0)) then search 1 else false end fun uriRelative uri = not (uriAbsolute uri) fun uriLocal uri = if String.isPrefix "file:" uri then SOME(String.extract(uri,5,NONE)) else if uriRelative uri then SOME uri else NONE fun uriPath s = let fun search (i,hadSlash) = if i<0 then if hadSlash then SOME 0 else NONE else case String.sub(s,i) of #"/" => if hadSlash then NONE else search(i-1,true) | _ => if hadSlash then SOME(i+1) else search(i-1,false) val len = String.size s val posOpt = search(len-1,false) in case posOpt of NONE => emptyUri | SOME i => if i=0 then slash else String.extract(s,0,SOME(i+1)) end fun uriAuth uri = let fun searchScheme i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #":"=c then SOME i else if isScheme c then searchScheme (i+1) else NONE end fun searchSlash i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #"/"=c then SOME i else searchSlash (i+1) end in if uri="" then "" else if not (Char.isAlpha(String.sub(uri,0))) then "" else case searchScheme 1 of NONE => "" | SOME i => if String.size uri<=i+2 then String.extract(uri,0,SOME(i+1)) else if #"/"=String.sub(uri,i+1) andalso #"/"=String.sub(uri,i+2) then case searchSlash (i+3) of NONE => uri | SOME j => String.extract(uri,0,SOME j) else String.extract(uri,0,SOME(i+1)) end fun uriScheme uri = let fun searchScheme i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #":"=c then SOME i else if isScheme c then searchScheme (i+1) else NONE end in if uri="" then "" else if not (Char.isAlpha(String.sub(uri,0))) then "" else case searchScheme 1 of NONE => "" | SOME i => String.extract(uri,0,SOME(i+1)) end fun uriJoin(abs,rel) = if rel="" then uriPath abs else if abs="" then rel else if String.isPrefix "//" rel then uriScheme abs^rel else if #"/"=String.sub(rel,0) then uriAuth abs^rel else if uriAbsolute rel then rel else uriPath abs^rel val compareUri = String.compare val hashUri = UtilHash.hashString fun convertCommand str (src,dst) = let val s = Substring.all str fun doit ss s = if Substring.isEmpty s then ss else let val (sl,sr) = Substring.splitr (fn c => #"%"<>c) s in if Substring.isEmpty sl then sr::ss else let val sl' = Substring.trimr 1 sl in case Substring.first sr of SOME #"1" => let val sr' = Substring.triml 1 sr in doit (Substring.all src::sr'::ss) sl' end | SOME #"2" => let val sr' = Substring.triml 1 sr in doit (Substring.all dst::sr'::ss) sl' end | _ => doit (Substring.all "%"::sr::ss) sl' end end val ss = doit nil s val s = Substring.concat ss in s end fun retrieveRemote uri = let val tmp = OS.FileSys.tmpName() val cmd = convertCommand Config.retrieveCommand (uri,tmp) val status = OS.Process.system cmd val _ = if status = OS.Process.success then () else let val _ = (OS.FileSys.remove tmp handle OS.SysErr _ => ()) val cmd = convertCommand Config.retrieveCommand ("",tmp) in raise NoSuchFile (uri,"command '"^cmd^"' failed") end in (Uri2String uri,tmp,true) end fun retrieveUri uri = case uriLocal uri of SOME f => (Uri2String uri,Uri2String f,false) | NONE => retrieveRemote uri end (* stop of ../../Unicode/Uri/uri.sml *) (* start of ../../Parser/version.sml *) structure Version = struct val FXP_VERSION = "1.4.4" end (* stop of ../../Parser/version.sml *) (* start of ../../Util/utilList.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilList *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* member : none *) (* findAndDelete : none *) (*--------------------------------------------------------------------------*) signature UtilList = sig val split : ('a -> bool) -> 'a list -> 'a list list val member : ''a -> ''a list -> bool val mapAllPairs : ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val findAndMap : ('a -> 'b option) -> 'a list -> 'b option val findAndDelete : ('a -> bool) -> 'a list -> ('a option * 'a list) val sort : ('a * 'a -> order) -> 'a list -> 'a list val merge : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val diff : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val cap : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val sub : ('a * 'a -> order) -> 'a list * 'a list -> bool val insert : ('a * 'a -> order) -> 'a * 'a list -> 'a list val delete : ('a * 'a -> order) -> 'a * 'a list -> 'a list val elem : ('a * 'a -> order) -> 'a * 'a list -> bool end structure UtilList : UtilList = struct (*--------------------------------------------------------------------*) (* split a list into a list of lists at each element fullfilling p. *) (*--------------------------------------------------------------------*) fun split p l = let val (one,ls) = foldr (fn (a,(curr,ls)) => if p a then (nil,curr::ls) else (a::curr,ls)) (nil,nil) l in one::ls end (*--------------------------------------------------------------------*) (* is x a member of l? *) (*--------------------------------------------------------------------*) fun member x l = List.exists (fn y => x=y) l (*--------------------------------------------------------------------*) (* for [a1,...,an] and [b1,...,bk], generate *) (* [f(a1,b1),f(a1,b2),...,f(an,bk-1),f(an,bk)]. *) (*--------------------------------------------------------------------*) fun mapAllPairs f (ass,bs) = foldr (fn (a,cs) => foldr (fn (b,cs) => f(a,b)::cs) cs bs) nil ass (*--------------------------------------------------------------------*) (* find the first element x of l such that f x = SOME y, and return *) (* f x. If there is no such x, return NONE. *) (*--------------------------------------------------------------------*) fun findAndMap _ nil = NONE | findAndMap f (x::xs) = case f x of NONE => findAndMap f xs | y => y (*--------------------------------------------------------------------*) (* find the first element x of l such that f x = true, delete it from *) (* l, and return SOME x with the modified list. If there is no such x *) (* return (NONE,l). *) (*--------------------------------------------------------------------*) fun findAndDelete _ nil = (NONE,nil) | findAndDelete f (x::xs) = if f x then (SOME x,xs) else let val (y,ys) = findAndDelete f xs in (y,x::ys) end (*--------------------------------------------------------------------*) (* given a function that compares elements, merge two sorted lists. *) (*--------------------------------------------------------------------*) fun merge comp (l1,l2) = let fun go (nil,l) = l | go (l,nil) = l | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => x1::go(r1,l2) | EQUAL => go(l1,r2) | GREATER => x2::go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, compute the intersection of two *) (* ordered lists. *) (*--------------------------------------------------------------------*) fun cap comp (l1,l2) = let fun go (nil,l) = nil | go (l,nil) = nil | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => go(r1,l2) | EQUAL => x1::go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, compute the difference of two *) (* ordered lists. *) (*--------------------------------------------------------------------*) fun diff comp (l1,l2) = let fun go (nil,l) = nil | go (l,nil) = l | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => x1::go(r1,l2) | EQUAL => go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, find out whether an ordered list is *) (* contained in an other ordered list. *) (*--------------------------------------------------------------------*) fun sub comp (l1,l2) = let fun go (nil,l) = true | go (l,nil) = false | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => false | EQUAL => go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a function that compares elements, insert an element into an *) (* ordered list. *) (*--------------------------------------------------------------------*) fun insert comp (x,l) = let fun go nil = [x] | go (l as y::ys) = case comp(x,y) of LESS => x::l | EQUAL => l | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* given a function that compares elements, delete an element from *) (* an ordered list. *) (*--------------------------------------------------------------------*) fun delete comp (x,l) = let fun go nil = [x] | go (l as y::ys) = case comp(x,y) of LESS => l | EQUAL => ys | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* given a function that compares elements, insert an element into an *) (* ordered list. *) (*--------------------------------------------------------------------*) fun elem comp (x,l) = let fun go nil = false | go (l as y::ys) = case comp(x,y) of LESS => false | EQUAL => true | GREATER => go ys in go l end (*--------------------------------------------------------------------*) (* merge-sort a list of elements comparable with the function in the *) (* 1st argument. Preserve duplicate elements. *) (*--------------------------------------------------------------------*) fun sort _ nil = nil | sort comp l = let fun mergeOne (x::y::l) = merge comp (x,y)::mergeOne l | mergeOne l = l fun mergeAll [l] = l | mergeAll ls = mergeAll (mergeOne ls) val singles = map (fn x => [x]) l in mergeAll singles end end (* stop of ../../Util/utilList.sml *) (* start of ../../Parser/Dfa/dfaOptions.sml *) signature DfaOptions = sig val O_DFA_INITIAL_WIDTH : int ref val O_DFA_MAX_STATES : int ref val O_DFA_WARN_TOO_LARGE : bool ref val setDfaDefaults : unit -> unit val setDfaOptions : Options.Option list * (string -> unit) -> Options.Option list val dfaUsage : Options.Usage end functor DfaOptions () : DfaOptions = struct open Options UtilInt val O_DFA_INITIAL_WIDTH = ref 4 val O_DFA_MAX_STATES = ref 256 val O_DFA_WARN_TOO_LARGE = ref true fun setDfaDefaults() = let val _ = O_DFA_INITIAL_WIDTH := 4 val _ = O_DFA_MAX_STATES := 256 val _ = O_DFA_WARN_TOO_LARGE := true in () end val dfaUsage = [U_ITEM(["--dfa-initial-size=n"],"Initial size of DFA transition tables (16)"), U_ITEM(["--dfa-initial-width=n"],"Same as --dfa-initial-size=2^n (4)"), U_ITEM(["--dfa-max-size=n"],"Maximal size of DFAs for ambiguous content models (256)"), U_ITEM(["--dfa-warn-size[=(yes|no)]"],"Warn about too large DFAs (yes)") ] fun setDfaOptions(opts,doError) = let exception Failed of string option fun getNat str = if str="" then raise Failed NONE else let val cs = String.explode str in foldl (fn (c,n) => if #"0">c orelse #"9" raise Failed (SOME("number "^str^" is too large for this system")) end val yesNo = "'yes' or 'no'" fun tooLarge n = String.concat ["number ",n," is too large for this system"] fun mustHave key = String.concat ["option --",key," must have an argument"] fun mustBe key what = String.concat ["the argument to option --",key," must be ",what] fun do_yesno(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME "yes" => flag := true | SOME "no" => flag := false | SOME s => doError (mustBe key yesNo) fun do_num(key,valOpt,flag) = case valOpt of NONE => doError (mustHave key) | SOME s => flag := getNat s handle Failed NONE => doError (mustBe key "a number") | Failed (SOME s) => doError s fun do_dfa_ts(key,valOpt,toWidth) = case valOpt of NONE => doError (mustHave key) | SOME s => O_DFA_INITIAL_WIDTH := toWidth (getNat s) handle Failed NONE => doError (mustBe key "a number") | Failed (SOME s) => doError s fun do_long(key,valOpt) = case key of "dfa-initial-size" => true before do_dfa_ts(key,valOpt,nextPowerTwo) | "dfa-initial-width" => true before do_dfa_ts(key,valOpt,fn i => i) | "dfa-max-size" => true before do_num(key,valOpt,O_DFA_MAX_STATES) | "dfa-warn-size" => true before do_yesno(key,valOpt,O_DFA_WARN_TOO_LARGE) | _ => false and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_NEG _ => opt::doit opts | OPT_SHORT _ => opt::doit opts | OPT_STRING _ => opt::doit opts in doit opts end end (* stop of ../../Parser/Dfa/dfaOptions.sml *) (* start of ../../Parser/Params/parserOptions.sml *) (*--------------------------------------------------------------------------*) (* Structure: ParserOptions *) (* *) (* Depends on: none *) (*--------------------------------------------------------------------------*) signature ParserOptions = sig structure DfaOptions : DfaOptions val O_CHECK_ISO639 : bool ref val O_CHECK_LANGID : bool ref val O_CHECK_PREDEFINED : bool ref val O_CHECK_RESERVED : bool ref val O_CHECK_VERSION : bool ref val O_WARN_MULT_ENUM : bool ref val O_WARN_XML_DECL : bool ref val O_WARN_ATT_NO_ELEM : bool ref val O_WARN_MULT_ENT_DECL : bool ref val O_WARN_MULT_NOT_DECL : bool ref val O_WARN_MULT_ATT_DEF : bool ref val O_WARN_MULT_ATT_DECL : bool ref val O_WARN_SHOULD_DECLARE : bool ref val O_WARN_NON_ASCII_URI : bool ref val O_ERROR_MINIMIZE : bool ref val O_VALIDATE : bool ref val O_COMPATIBILITY : bool ref val O_INTEROPERABILITY : bool ref val O_INCLUDE_EXT_PARSED : bool ref val O_INCLUDE_PARAM_ENTS : bool ref val setParserDefaults : unit -> unit val setParserOptions : Options.Option list * (string -> unit) -> Options.Option list val parserUsage : Options.Usage end functor ParserOptions () : ParserOptions = struct structure DfaOptions = DfaOptions () open DfaOptions Options UtilInt UtilList val O_CHECK_VERSION = ref true (* check for conforming xml version? *) val O_CHECK_ISO639 = ref true (* check whether a two-letter LangCode *) (* is acording to ISO 639? *) val O_CHECK_LANGID = ref true (* check whether a LangCode fullfills *) (* IETF RFC 1766? *) val O_CHECK_RESERVED = ref false(* check for names starting with xml? *) val O_CHECK_PREDEFINED = ref true (* check declarations of predefined *) val O_WARN_MULT_ENUM = ref true (* check whether a token occurs *) (* twice in the enumerated attribute *) (* types of the same element *) val O_WARN_XML_DECL = ref false (* warn if the XML decl is missing? *) val O_WARN_ATT_NO_ELEM = ref true (* warn for undeclared elements *) (* in att def list declarations? *) val O_WARN_MULT_ENT_DECL = ref true (* warn about redefined entities *) val O_WARN_MULT_NOT_DECL = ref true (* warn about redefined notations*) val O_WARN_SHOULD_DECLARE = ref true (* warn if predefined entities *) (* are not declared in the dtd *) val O_WARN_MULT_ATT_DEF = ref true (* warn if an attributes is defd *) (* twice for the same element? *) val O_WARN_MULT_ATT_DECL = ref true (* warn if there are multiple att *) (* def lists for one element? *) val O_WARN_NON_ASCII_URI = ref true (* warn about non-ascii chars in *) (* system identifiers? *) val O_ERROR_MINIMIZE = ref true (* try to avoid repeating errors? *) val O_VALIDATE = ref true val O_COMPATIBILITY = ref true val O_INTEROPERABILITY = ref false val O_INCLUDE_EXT_PARSED = ref false val O_INCLUDE_PARAM_ENTS = ref false fun setParserDefaults() = let val _ = setDfaDefaults() val _ = O_CHECK_ISO639 := false val _ = O_CHECK_LANGID := false val _ = O_CHECK_PREDEFINED := true val _ = O_CHECK_RESERVED := false val _ = O_CHECK_VERSION := true val _ = O_WARN_MULT_ENUM := true val _ = O_WARN_XML_DECL := false val _ = O_WARN_ATT_NO_ELEM := false val _ = O_WARN_MULT_ENT_DECL := false val _ = O_WARN_MULT_NOT_DECL := false val _ = O_WARN_MULT_ATT_DEF := false val _ = O_WARN_MULT_ATT_DECL := false val _ = O_WARN_SHOULD_DECLARE := true val _ = O_WARN_NON_ASCII_URI := true val _ = O_VALIDATE := true val _ = O_COMPATIBILITY := true val _ = O_INTEROPERABILITY := false val _ = O_ERROR_MINIMIZE := true val _ = O_INCLUDE_EXT_PARSED := false val _ = O_INCLUDE_PARAM_ENTS := false in () end val parserUsage = [U_ITEM(["-[n]v","--validate[=(yes|no)]"],"Turn on or off validation (yes)"), U_ITEM(["-[n]c","--compat[=(yes|no)]","--compatibility[=(yes|no)]"], "Turn on or off compatibility checking (yes)"), U_ITEM(["-[n]i","--interop[=(yes|no)]","--interoperability[=(yes|no)]"], "Turn on or off interoperability checking (no)"), U_SEP, U_ITEM(["--few-errors[=(yes|no)]"],"Report fewer errors (no)"), U_ITEM(["--check-reserved[=(yes|no)]"], "Checking for reserved names (no)"), U_ITEM(["--check-predef[=(yes|no)]","--check-predefined[=(yes|no)]"], "Check declaration of predefined entities (yes)"), U_ITEM(["--check-lang-id[=(yes|no)]"],"Checking language identifiers (no)"), U_ITEM(["--check-iso639[=(yes|no)]"],"Check ISO 639 language codes (no)"), U_ITEM(["--check-xml-version[=(yes|no)]"], "Check XML version number (yes)"), U_SEP, U_ITEM(["--warn-xml-decl[=(yes|no)]"],"Warn if there is no XML declaration (no)"), U_ITEM(["--warn-att-elem[=(yes|no)]"], "Warn about attlist declarations for undeclared elements (no)"), U_ITEM(["--warn-predefined[=(yes|no)]"], "Warn if the predefined entities are not declared (no)"), U_ITEM(["--warn-mult-decl[=]"],"Warn about multiple declarations (none)"), U_ITEM(["--warn-uri[=(yes|no)]"],"Warn about non-ASCII characters in URIs (yes)"), U_ITEM(["--warn[=all]"],"Warn about nearly everything"), U_ITEM(["--warn=none"],"Do not print warnings"), U_SEP, U_ITEM(["--include-ext[=(yes|no)]","--include-external[=(yes|no)]"], "Include external entities in non-validating mode (no)"), U_ITEM(["--include-par[=(yes|no)]","--include-parameter[=(yes|no)]"], "Include parameter entities and external subset in "^ "non-validating mode (no)"), U_SEP] @dfaUsage fun setParserOptions(opts,doError) = let datatype What = ATT | ATTLIST | ENT | NOT exception Failed of string option fun getNat str = if str="" then raise Failed NONE else let val cs = String.explode str in foldl (fn (c,n) => if #"0">c orelse #"9" raise Failed (SOME("number "^str^" is too large for this system")) end val allNone = "'all' or 'none'" val yesNo = "'yes' or 'no'" val yesNoWhat = "'yes', 'no' or a list of 'att', 'attlist', 'ent' and 'not'" fun errorMustBe(key,what) = doError (String.concat ["the argument to option --",key," must be ",what]) fun errorNoArg key = doError (String.concat ["option --",key," has no argument"]) fun do_mult_decl(key,valOpt) = let val all = [ATT,ATTLIST,ENT,NOT] fun setFlags whats = app (fn (what,flag) => flag := member what whats) [(ATT,O_WARN_MULT_ATT_DEF),(ATTLIST,O_WARN_MULT_ATT_DECL), (ENT,O_WARN_MULT_ENT_DECL),(NOT,O_WARN_MULT_NOT_DECL)] in case valOpt of NONE => setFlags all | SOME "yes" => setFlags all | SOME "no" => setFlags nil | SOME s => let val fields = String.fields (fn c => #","=c) s val whats = map (fn s => case s of "att" => ATT | "attlist" => ATTLIST | "ent" => ENT | "not" => NOT | _ => raise Failed NONE) fields in setFlags whats end handle Failed _ => errorMustBe(key,yesNoWhat) end fun do_noarg(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME _ => errorNoArg key fun do_yesno(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME "yes" => flag := true | SOME "no" => flag := false | SOME s => errorMustBe(key,yesNo) fun do_num(key,valOpt,flag) = case valOpt of NONE => errorMustBe(key,"a number") | SOME s => flag := getNat s handle Failed NONE => errorMustBe(key,"a number") | Failed (SOME s) => doError s fun do_warn(key,valOpt) = let val all = [O_WARN_MULT_ENUM,O_WARN_ATT_NO_ELEM, O_WARN_MULT_ENT_DECL,O_WARN_MULT_NOT_DECL,O_WARN_MULT_ATT_DEF, O_WARN_MULT_ATT_DECL,O_WARN_SHOULD_DECLARE,O_WARN_XML_DECL] fun setFlags value = app (fn flag => flag := value) all in case valOpt of NONE => setFlags true | SOME "all" => setFlags true | SOME "none" => setFlags false | SOME _ => errorMustBe(key,allNone) end fun do_long(key,valOpt) = case key of "validate" => true before do_yesno(key,valOpt,O_VALIDATE) | "compat" => true before do_yesno(key,valOpt,O_COMPATIBILITY) | "compatibility" => true before do_yesno(key,valOpt,O_COMPATIBILITY) | "interop" => true before do_yesno(key,valOpt,O_INTEROPERABILITY) | "interoperability" => true before do_yesno(key,valOpt,O_INTEROPERABILITY) | "few-errors" => true before do_yesno(key,valOpt,O_ERROR_MINIMIZE) | "check-reserved" => true before do_yesno(key,valOpt,O_CHECK_RESERVED) | "check-predef" => true before do_yesno(key,valOpt,O_CHECK_PREDEFINED) | "check-predefined" => true before do_yesno(key,valOpt,O_CHECK_PREDEFINED) | "check-lang-id" => true before do_yesno(key,valOpt,O_CHECK_LANGID) | "check-iso639" => true before do_yesno(key,valOpt,O_CHECK_ISO639) | "check-xml-version" => true before do_yesno(key,valOpt,O_CHECK_VERSION) | "warn" => true before do_warn(key,valOpt) | "warn-xml-decl" => true before do_yesno(key,valOpt,O_WARN_XML_DECL) | "warn-att-elem" => true before do_yesno(key,valOpt,O_WARN_ATT_NO_ELEM) | "warn-predefined" => true before do_yesno(key,valOpt,O_WARN_SHOULD_DECLARE) | "warn-mult-decl" => true before do_mult_decl(key,valOpt) | "warn-uri" => true before do_yesno(key,valOpt,O_WARN_NON_ASCII_URI) | "include-ext" => true before do_yesno(key,valOpt,O_INCLUDE_EXT_PARSED) | "include-external" => true before do_yesno(key,valOpt,O_INCLUDE_EXT_PARSED) | "include-par" => true before do_yesno(key,valOpt,O_INCLUDE_PARAM_ENTS) | "include-parameter" => true before do_yesno(key,valOpt,O_INCLUDE_PARAM_ENTS) | _ => false fun do_short cs = let fun doOne c = case c of #"v" => false before O_VALIDATE := true | #"c" => false before O_COMPATIBILITY := true | #"i" => false before O_INTEROPERABILITY := true | _ => true in List.filter doOne cs end fun do_neg cs = let fun doOne c = case c of #"v" => false before O_VALIDATE := false | #"c" => false before O_COMPATIBILITY := false | #"i" => false before O_INTEROPERABILITY := false | _ => true in List.filter doOne cs end and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_SHORT cs => (case do_short cs of nil => doit opts | rest => OPT_SHORT rest::doit opts) | OPT_NEG cs => (case do_neg cs of nil => doit opts | rest => OPT_NEG rest::doit opts) | OPT_STRING s => opt::doit opts val opts1 = setDfaOptions (opts,doError) in doit opts1 end end (* stop of ../../Parser/Params/parserOptions.sml *) (* start of ../../Util/intLists.sml *) signature IntLists = sig type IntList = int list val emptyIntList : IntList val singleIntList : int -> IntList val fullIntList : int -> IntList val isEmptyIntList : IntList -> bool val inIntList : int * IntList -> bool val subIntList : IntList * IntList -> bool val compareIntLists: IntList * IntList -> order val hashIntList : IntList -> word val addIntList : int * IntList -> IntList val delIntList : int * IntList -> IntList val cupIntLists : IntList * IntList -> IntList val capIntLists : IntList * IntList -> IntList val diffIntLists : IntList * IntList -> IntList val IntList2String : IntList -> string end structure IntLists : IntLists = struct open UtilCompare UtilHash UtilInt UtilList UtilString type IntList = int list val emptyIntList = nil : IntList fun fullIntList n = intervalList(0,n) fun singleIntList n = [n] val isEmptyIntList = null val inIntList = elem Int.compare val subIntList = sub Int.compare val addIntList = insert Int.compare val delIntList = delete Int.compare val capIntLists = cap Int.compare val cupIntLists = merge Int.compare val diffIntLists = diff Int.compare val compareIntLists = compareList Int.compare val hashIntList = hashList hashInt val IntList2String = List2String Int.toString end (* stop of ../../Util/intLists.sml *) (* start of ../../Unicode/Chars/dataDict.sml *) structure KeyData : Key = struct type Key = UniChar.Data val null = UniChar.nullData val hash = UniChar.hashData val compare = UniChar.compareData val toString = UniChar.Data2String end structure DataDict = Dict (structure Key = KeyData) structure DataSymTab = SymTable (structure Key = KeyData) (* stop of ../../Unicode/Chars/dataDict.sml *) (* start of ../../Parser/Dfa/dfaData.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaData *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* boundsFollow : none *) (* mergeFirst : ConflictFirst *) (* mergeFollow : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaData = sig type Dfa datatype ContentModel = CM_ELEM of int | CM_OPT of ContentModel | CM_REP of ContentModel | CM_PLUS of ContentModel | CM_ALT of ContentModel list | CM_SEQ of ContentModel list end structure DfaBase = struct (*--- visible to the parser ---*) datatype ContentModel = CM_ELEM of int | CM_OPT of ContentModel | CM_REP of ContentModel | CM_PLUS of ContentModel | CM_ALT of ContentModel list | CM_SEQ of ContentModel list type Sigma = int type State = int val dfaDontCare = ~2 val dfaError = ~1 val dfaInitial = 0 exception DfaTooLarge of int exception Ambiguous of Sigma * int * int exception ConflictFirst of Sigma * State * State exception ConflictFollow of Sigma * State * State type Empty = bool type First = (State * Sigma) list type Follow = First type Info = State * Empty * First datatype CM' = ELEM of Sigma | OPT of CM | REP of CM | PLUS of CM | ALT of CM list | SEQ of CM list withtype CM = CM' * Info type Row = Sigma * Sigma * State vector * bool val nullRow : Row = (1,0,Vector.fromList nil,false) type Dfa = Row vector val emptyDfa : Dfa = Vector.fromList [(1,0,Vector.fromList nil,true)] end structure DfaData = DfaBase : DfaData (* stop of ../../Parser/Dfa/dfaData.sml *) (* start of ../../Unicode/Decode/decodeFile.sml *) (*--------------------------------------------------------------------------*) (* Structure: DecodeBasic *) (* *) (* Exceptions raised by functions in this structure: *) (* closeFile : none *) (* filePos : none *) (* fileName : none *) (* nextByte : EndOfFile *) (* openFile : NoSuchFile *) (*--------------------------------------------------------------------------*) signature DecodeFile = sig structure Bytes : WORD type File type Byte = Bytes.word exception EndOfFile of File val Char2Byte : UniChar.Char -> Byte val Byte2Char : Byte -> UniChar.Char val Byte2Hex : Byte -> string val openFile : Uri.Uri option -> File val closeFile : File -> unit val getByte : File -> Byte * File val ungetBytes : File * Byte list -> File val fileUri : File -> Uri.Uri val fileName : File -> string end structure DecodeFile : DecodeFile = struct open UniChar Uri UtilError structure Bytes = Word8 type Byte = Bytes.word fun Byte2Char b = Chars.fromLargeWord(Bytes.toLargeWord b) fun Byte2Hex b = "0x"^UtilString.toUpperString(StringCvt.padLeft #"0" 2 (Bytes.toString b)) fun Char2Byte c = Bytes.fromLargeWord(Chars.toLargeWord c) type instream = TextIO.instream val closeIn = TextIO.closeIn val input = TextIO.input val input1 = TextIO.input1 val openIn = TextIO.openIn val stdIn = TextIO.stdIn (*--------------------------------------------------------------------*) (* a file type is stdin or a uri with its string representation and *) (* the file it is mapped to. *) (* a file position is a stream, an int position and a file type. *) (* a file is a file position, a buffer, its size and current index. *) (*--------------------------------------------------------------------*) datatype FileType = STD | FNAME of (Uri * string * string * bool) type FilePos = FileType * instream * int type File = FilePos * Word8Vector.vector * int * int exception EndOfFile of File val nullVec = Word8Vector.fromList nil (*--------------------------------------------------------------------*) (* return the uri of a file. *) (*--------------------------------------------------------------------*) fun fileUri ((typ,_,_),_,_,_) = case typ of STD => emptyUri | FNAME(uri,_,_,_) => uri (*--------------------------------------------------------------------*) (* return the uri string name of a file. *) (*--------------------------------------------------------------------*) fun fileName ((typ,_,_),_,_,_) = case typ of STD => "" | FNAME(_,str,_,_) => str (*--------------------------------------------------------------------*) (* return the uri string and the position in the the file. *) (*--------------------------------------------------------------------*) fun filePos ((typ,_,p),_,s,i) = case typ of STD => ("",p+i-s) | FNAME(_,str,_,_) => (str,p+i-s) (*--------------------------------------------------------------------*) (* open a file; report IO errors by raising NoSuchFile. *) (*--------------------------------------------------------------------*) fun openFile uriOpt = let val (typ,stream) = case uriOpt of NONE => (STD,stdIn) | SOME uri => let val (str,fname,tmp) = retrieveUri uri in (FNAME(uri,str,fname,tmp),openIn fname) end handle IO.Io {name,cause,...} => raise NoSuchFile(name,exnMessage cause) in ((typ,stream,0),nullVec,0,0) end (*--------------------------------------------------------------------*) (* close the file; ignore IO errors. *) (*--------------------------------------------------------------------*) fun closeStream (typ,stream,_) = case typ of STD => () | FNAME(_,uri,fname,tmp) => let val _ = closeIn stream handle IO.Io _ => () val _ = (if tmp andalso OS.FileSys.access(fname,nil) then OS.FileSys.remove fname else ()) handle exn as OS.SysErr _ => TextIO.output(TextIO.stdErr,String.concat ["Error removing temporary file ",fname,"for URI",uri, "(",exnMessage exn,")\n"]) in () end fun closeFile (tsp,_,_,_) = closeStream tsp (*--------------------------------------------------------------------*) (* read a byte from the file; if at the end of buffer, reload it. *) (* if a reload fails or returns an IO error, raise EndOfFile. --------*) (*--------------------------------------------------------------------*) fun getByte (tsp,vec,s,i) = if i nullVec val s = Word8Vector.length v in if s=0 then let val _ = closeStream tsp in raise EndOfFile(tsp,v,0,0) end else (Word8Vector.sub(v,0),((typ,stream,pos+s),v,s,1)) end (*--------------------------------------------------------------------*) (* un-get some bytes. this should only happen while checking for a *) (* byte-order mark or xml/text declaration. It should be efficient in *) (* that case, otherwise might be very space-consuming. *) (*--------------------------------------------------------------------*) fun ungetBytes ((tsp,vec,s,i),bs) = let val len = length bs in if len<=i then (tsp,vec,s,i-len) else let val diff = len-i val vec0 = Word8Vector.fromList(List.take(bs,diff)) in (tsp,Word8Vector.concat [vec0,vec],s+diff,0) end end end (* stop of ../../Unicode/Decode/decodeFile.sml *) (* start of ../../Unicode/Decode/decodeError.sml *) (*--------------------------------------------------------------------------*) (* Structure: DecodeError *) (* *) (* Exceptions raised by functions in this structure: *) (* decodeMessage : none *) (*--------------------------------------------------------------------------*) signature DecodeError = sig datatype DecodeError = ERR_ILLEGAL_CHAR of DecodeFile.Byte * string | ERR_NON_UNI_UCS4 of UniChar.Char | ERR_EOF_UCS4 of int * DecodeFile.Byte list | ERR_NON_DIRECT_UTF7 of DecodeFile.Byte | ERR_PADDING_UTF7 of UniChar.Char | ERR_ILLFORMED_UTF8 of DecodeFile.Byte * int * int | ERR_ILLEGAL_UTF8 of DecodeFile.Byte | ERR_INVALID_UTF8_SEQ of DecodeFile.Byte list | ERR_EOF_UTF8 of int * int | ERR_NON_UNI_UTF8 of UniChar.Char * int | ERR_EOF_UCS2 of DecodeFile.Byte | ERR_EOF_UTF16 of DecodeFile.Byte | ERR_LOW_SURROGATE of UniChar.Char | ERR_HIGH_SURROGATE of UniChar.Char * UniChar.Char | ERR_EOF_SURROGATE of UniChar.Char | ERR_NO_ENC_DECL of string | ERR_UNSUPPORTED_ENC of string | ERR_INCOMPATIBLE_ENC of string * string val decodeMessage : DecodeError -> string list exception DecodeError of DecodeFile.File * bool * DecodeError end structure DecodeError : DecodeError = struct open DecodeFile UtilString UniChar datatype DecodeError = ERR_ILLEGAL_CHAR of DecodeFile.Byte * string | ERR_NON_UNI_UCS4 of UniChar.Char | ERR_EOF_UCS4 of int * DecodeFile.Byte list | ERR_NON_DIRECT_UTF7 of DecodeFile.Byte | ERR_PADDING_UTF7 of UniChar.Char | ERR_ILLFORMED_UTF8 of DecodeFile.Byte * int * int | ERR_ILLEGAL_UTF8 of DecodeFile.Byte | ERR_INVALID_UTF8_SEQ of DecodeFile.Byte list | ERR_EOF_UTF8 of int * int | ERR_NON_UNI_UTF8 of UniChar.Char * int | ERR_EOF_UCS2 of DecodeFile.Byte | ERR_EOF_UTF16 of DecodeFile.Byte | ERR_LOW_SURROGATE of UniChar.Char | ERR_HIGH_SURROGATE of UniChar.Char * UniChar.Char | ERR_EOF_SURROGATE of UniChar.Char | ERR_NO_ENC_DECL of string | ERR_UNSUPPORTED_ENC of string | ERR_INCOMPATIBLE_ENC of string * string fun Char2Hex c = "0x"^UtilString.toUpperString(StringCvt.padLeft #"0" 4 (Chars.toString c)) fun decodeMessage err = case err of ERR_ILLEGAL_CHAR(b,what) => [Byte2Hex b,"is not",prependAnA what,"character"] | ERR_NON_UNI_UCS4 c => ["UCS-4 coded non-Unicode character",Char2Uni c] | ERR_EOF_UCS4(pos,bytes) => ["End of file after",Int2String pos,"bytes of UCS-4 character", "starting with ",List2String0 Byte2Hex bytes] | ERR_NON_DIRECT_UTF7 b => ["Indirect UTF-7 character ",Byte2Hex b,"in non-shifted mode"] | ERR_PADDING_UTF7 pad => ["Non-zero padding",Char2Hex pad,"at end of UTF-7 shifted sequence"] | ERR_ILLFORMED_UTF8 (b,len,pos) => [numberNth pos,"byte",Byte2Hex b,"of a",Int2String len^"-byte", "UTF-8 sequence does not start with bits 10"] | ERR_ILLEGAL_UTF8 b => ["Byte",Byte2Hex b,"is neither ASCII nor does it start", "a valid multi-byte UTF-8 sequence"] | ERR_EOF_UTF8 (len,pos) => ["End of file terminates a ",Int2String len^"-byte", "UTF-8 sequence before the ",numberNth pos,"byte"] | ERR_NON_UNI_UTF8 (c,len) => [Int2String len^"-byte UTF-8 sequence decodes to non-Unicode character",Char2Uni c] | ERR_INVALID_UTF8_SEQ bs => ["Invalid UTF-8 sequence",List2xString (""," ","") Byte2Hex bs] | ERR_EOF_UCS2 b => ["End of file before second byte of UCS-2 character starting with",Byte2Hex b] | ERR_EOF_UTF16 b => ["End of file before second byte of UTF-16 character starting with",Byte2Hex b] | ERR_LOW_SURROGATE c => ["Low surrogate",Char2Uni c,"without preceding high surrogate"] | ERR_HIGH_SURROGATE (c,c1) => ["High surrogate",Char2Uni c,"followed by",Char2Uni c1,"instead of low surrogate"] | ERR_EOF_SURROGATE c => ["High surrogate",Char2Uni c,"followed by the end of file"] | ERR_NO_ENC_DECL auto => ["Couldn't parse encoding declaration but auto-detected encoding",auto,"required so"] | ERR_UNSUPPORTED_ENC enc => ["Unsupported encoding",enc] | ERR_INCOMPATIBLE_ENC (enc,auto) => ["Encoding",enc,"is incompatible with auto-detected encoding",auto] exception DecodeError of File * bool * DecodeError end (* stop of ../../Unicode/Decode/decodeError.sml *) (* start of ../../Unicode/Decode/decodeUtil.sml *) (* require "basis.__word"; require "basis.__word8"; require "chars"; require "decodeBasic"; require "decodeError"; *) (*--------------------------------------------------------------------------*) (* Structure: DecodeUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* combineSurrogates : none *) (* combineUcs4big : none *) (* combineUcs4little : none *) (* combineUcs4strangeBig : none *) (* combineUcs4strangeLittle : none *) (* combineUtf16big : none *) (* combineUtf16little : none *) (* isLowSurrogate : none *) (* isHighSurrogate : none *) (* isSurrogate : none *) (*--------------------------------------------------------------------------*) signature DecodeUtil = sig val isSurrogate : UniChar.Char -> bool val isLowSurrogate : UniChar.Char -> bool val isHighSurrogate : UniChar.Char -> bool val combineSurrogates : UniChar.Char * UniChar.Char -> UniChar.Char end structure DecodeUtil : DecodeUtil = struct open UniChar DecodeFile DecodeError fun isSurrogate c = Chars.orb(c,0wx7FF)=0wxDFFF fun isLowSurrogate c = Chars.orb(c,0wx3FF)=0wxDFFF fun isHighSurrogate c = Chars.orb(c,0wx3FF)=0wxDBFF fun combineSurrogates(hi,lo) = (hi-0wxD800)*0wx400+lo+0wx2400 : Char end (* stop of ../../Unicode/Decode/decodeUtil.sml *) (* start of ../../Unicode/Decode/decodeUcs2.sml *) signature DecodeUcs2 = sig val getCharUcs2b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs2l : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUcs2 : DecodeUcs2 = struct open UniChar Encoding DecodeFile DecodeError DecodeUtil fun getCharUcs2b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS2 b1) val c = Chars.orb(Chars.<<(Byte2Char b1,0w8),Byte2Char b2) in (c,f2) end fun getCharUcs2l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS2 b1) val c = Chars.orb(Chars.<<(Byte2Char b2,0w8),Byte2Char b1) in (c,f2) end end (* stop of ../../Unicode/Decode/decodeUcs2.sml *) (* start of ../../Unicode/Decode/decodeMisc.sml *) signature DecodeMisc = sig val getCharAscii : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharEbcdic : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharEof : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharLatin1 : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeMisc : DecodeMisc = struct open UniChar DecodeFile DecodeError fun getCharEof f = raise EndOfFile f (*--------------------------------------------------------------------*) (* ASCII characters must be lower than 0wx80 *) (*--------------------------------------------------------------------*) fun getCharAscii f = let val (b,f1) = getByte f in if b<0wx80 then (Byte2Char b,f1) else raise DecodeError(f1,false,ERR_ILLEGAL_CHAR(b,"ASCII")) end (*--------------------------------------------------------------------*) (* LATIN-1 is the first plane of Unicode. *) (*--------------------------------------------------------------------*) fun getCharLatin1 f = let val (b,f1) = getByte f in (Byte2Char b,f1) end (*--------------------------------------------------------------------*) (* EBCDIC is mapped to the first plane of Unicode. *) (*--------------------------------------------------------------------*) (* according to rfc-1345 (and gnu recode experiments) *) val ebcdic2latinTab = Vector.fromList [0wx00,0wx01,0wx02,0wx03,0wx9C,0wx09,0wx86,0wx7F, 0wx97,0wx8D,0wx8E,0wx0B,0wx0C,0wx0D,0wx0E,0wx0F, 0wx10,0wx11,0wx12,0wx13,0wx9D,0wx85,0wx08,0wx87, 0wx18,0wx19,0wx92,0wx8F,0wx1C,0wx1D,0wx1E,0wx1F, 0wx80,0wx81,0wx82,0wx83,0wx84,0wx0A,0wx17,0wx1B, 0wx88,0wx89,0wx8A,0wx8B,0wx8C,0wx05,0wx06,0wx07, 0wx90,0wx91,0wx16,0wx93,0wx94,0wx95,0wx96,0wx04, 0wx98,0wx99,0wx9A,0wx9B,0wx14,0wx15,0wx9E,0wx1A, 0wx20,0wxA0,0wxA1,0wxA2,0wxA3,0wxA4,0wxA5,0wxA6, 0wxA7,0wxA8,0wx5B,0wx2E,0wx3C,0wx28,0wx2B,0wx21, 0wx26,0wxA9,0wxAA,0wxAB,0wxAC,0wxAD,0wxAE,0wxAF, 0wxB0,0wxB1,0wx5D,0wx24,0wx2A,0wx29,0wx3B,0wx5E, 0wx2D,0wx2F,0wxB2,0wxB3,0wxB4,0wxB5,0wxB6,0wxB7, 0wxB8,0wxB9,0wx7C,0wx2C,0wx25,0wx5F,0wx3E,0wx3F, 0wxBA,0wxBB,0wxBC,0wxBD,0wxBE,0wxBF,0wxC0,0wxC1, 0wxC2,0wx60,0wx3A,0wx23,0wx40,0wx27,0wx3D,0wx22, 0wxC3,0wx61,0wx62,0wx63,0wx64,0wx65,0wx66,0wx67, 0wx68,0wx69,0wxC4,0wxC5,0wxC6,0wxC7,0wxC8,0wxC9, 0wxCA,0wx6A,0wx6B,0wx6C,0wx6D,0wx6E,0wx6F,0wx70, 0wx71,0wx72,0wxCB,0wxCC,0wxCD,0wxCE,0wxCF,0wxD0, 0wxD1,0wx7E,0wx73,0wx74,0wx75,0wx76,0wx77,0wx78, 0wx79,0wx7A,0wxD2,0wxD3,0wxD4,0wxD5,0wxD6,0wxD7, 0wxD8,0wxD9,0wxDA,0wxDB,0wxDC,0wxDD,0wxDE,0wxDF, 0wxE0,0wxE1,0wxE2,0wxE3,0wxE4,0wxE5,0wxE6,0wxE7, 0wx7B,0wx41,0wx42,0wx43,0wx44,0wx45,0wx46,0wx47, 0wx48,0wx49,0wxE8,0wxE9,0wxEA,0wxEB,0wxEC,0wxED, 0wx7D,0wx4A,0wx4B,0wx4C,0wx4D,0wx4E,0wx4F,0wx50, 0wx51,0wx52,0wxEE,0wxEF,0wxF0,0wxF1,0wxF2,0wxF3, 0wx5C,0wx9F,0wx53,0wx54,0wx55,0wx56,0wx57,0wx58, 0wx59,0wx5A,0wxF4,0wxF5,0wxF6,0wxF7,0wxF8,0wxF9, 0wx30,0wx31,0wx32,0wx33,0wx34,0wx35,0wx36,0wx37, 0wx38,0wx39,0wxFA,0wxFB,0wxFC,0wxFD,0wxFE,0wxFF ] fun ebcdic2latin b = Vector.sub(ebcdic2latinTab,Word8.toInt b) fun getCharEbcdic f = let val (b,f1) = getByte f in (ebcdic2latin b,f1) end end (* stop of ../../Unicode/Decode/decodeMisc.sml *) (* start of ../../Unicode/Decode/decodeUcs4.sml *) signature DecodeUcs4 = sig val getCharUcs4b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4l : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4sb : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4sl : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUcs4 : DecodeUcs4 = struct open UniChar UniClasses DecodeFile DecodeError DecodeUtil fun getCharUcs4b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b1,0w24), Chars.<<(Byte2Char b2,0w16)), Chars.orb(Chars.<<(Byte2Char b3,0w08), Byte2Char b4)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b4,0w24), Chars.<<(Byte2Char b3,0w16)), Chars.orb(Chars.<<(Byte2Char b2,0w08), Byte2Char b1)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4sb f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b2,0w24), Chars.<<(Byte2Char b1,0w16)), Chars.orb(Chars.<<(Byte2Char b4,0w08), Byte2Char b3)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4sl f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b3,0w24), Chars.<<(Byte2Char b4,0w16)), Chars.orb(Chars.<<(Byte2Char b1,0w08), Byte2Char b2)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end end (* stop of ../../Unicode/Decode/decodeUcs4.sml *) (* start of ../../Unicode/Decode/decodeUtf16.sml *) signature DecodeUtf16 = sig val getCharUtf16b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUtf16l : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUtf16 : DecodeUtf16 = struct open UniChar Encoding DecodeFile DecodeError DecodeUtil fun getCharUtf16b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b1) val c = Chars.orb(Chars.<<(Byte2Char b1,0w8),Byte2Char b2) in if isSurrogate c then (* Chars.orb(c,0wx7FF)=0wxDFFF *) if isLowSurrogate c then raise DecodeError(f2,false,ERR_LOW_SURROGATE c) else let val (b3,f3) = getByte f2 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_SURROGATE c) val (b4,f4) = getByte f3 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b3) val c1 = Chars.orb(Chars.<<(Byte2Char b3,0w8),Byte2Char b4) in if isLowSurrogate c1 then (combineSurrogates(c,c1),f4) else raise DecodeError(f4,false,ERR_HIGH_SURROGATE(c,c1)) end else (c,f2) end fun getCharUtf16l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b1) val c = Chars.orb(Chars.<<(Byte2Char b2,0w8),Byte2Char b1) in if isSurrogate c then if isLowSurrogate c then raise DecodeError(f2,false,ERR_LOW_SURROGATE c) else let val (b3,f3) = getByte f2 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_SURROGATE c) val (b4,f4) = getByte f3 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b3) val c1 = Chars.orb(Chars.<<(Byte2Char b4,0w8),Byte2Char b3) in if isLowSurrogate c1 then (combineSurrogates(c,c1),f4) else raise DecodeError(f4,false,ERR_HIGH_SURROGATE(c,c1)) end else (c,f2) end end (* stop of ../../Unicode/Decode/decodeUtf16.sml *) (* start of ../../Unicode/Decode/decodeUtf8.sml *) signature DecodeUtf8 = sig val getCharUtf8 : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUtf8 : DecodeUtf8 = struct open UniChar UniClasses UtilError UtilInt DecodeFile DecodeError DecodeUtil val THIS_MODULE = "DecodeUtf8" infix 8 <<< infix 7 && infix 6 ||| val op && = Bytes.andb val op <<< = Chars.<< val op ||| = Chars.orb val byte1switch = Vector.tabulate (256,fn i => if i<0x80 then 1 else if i<0xC0 then 0 else if i<0xE0 then 2 else if i<0xF0 then 3 else if i<0xF8 then 4 else if i<0xFC then 5 else if i<0xFE then 6 else 0) val diff2 : Char = 0wx00003080 val diff3 : Char = diff2 <<< 0wx6 ||| 0wx00020080 val diff4 : Char = diff3 <<< 0wx6 ||| 0wx00400080 val diff5 : Char = diff4 <<< 0wx6 ||| 0wx08000080 val diff6 : Char = diff5 <<< 0wx6 ||| 0wx00000080 fun getCharUtf8 f = let val (b1,f1) = getByte f in if b1<0wx80 then (Byte2Char b1,f1) else let val n = Vector.sub(byte1switch,Word8.toInt b1) in case n of 0 (* error *) => raise DecodeError(f1,false,ERR_ILLEGAL_UTF8 b1) | 1 => (Byte2Char b1,f1) | 2 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f2,false,ERR_ILLFORMED_UTF8(b2,n,2)) else let val c = Byte2Char b1 <<< 0w6 + Byte2Char b2 - diff2 in if c>=0wx80 then (c,f2) else raise DecodeError(f2,false,ERR_INVALID_UTF8_SEQ [b1,b2]) end end | 3 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f3,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f3,false,ERR_ILLFORMED_UTF8(b2,n,3)) else let val c = (Byte2Char b1 <<< 0w12 + Byte2Char b2 <<< 0w06 + Byte2Char b3 - diff3) in if c>=0wx800 then (c,f3) else raise DecodeError (f3,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3]) end end | 4 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,4)) else let val c = (Byte2Char b1 <<< 0w18 + Byte2Char b2 <<< 0w12 + Byte2Char b3 <<< 0w06 + Byte2Char b4 - diff4) in if c>=0wx100000 andalso c<=0wx10FFFF then (c,f4) else if c<0wx10000 then raise DecodeError (f4,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4]) else raise DecodeError (f4,false,ERR_NON_UNI_UTF8(c,n)) end end | 5 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) val (b5,f5) = getByte f4 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,5)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,4)) else if b5 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,5)) else let val c = (Byte2Char b1 <<< 0w24 + Byte2Char b2 <<< 0w18 + Byte2Char b3 <<< 0w12 + Byte2Char b4 <<< 0w06 + Byte2Char b5 - diff5) in if c<0wx200000 then raise DecodeError (f5,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4,b5]) else raise DecodeError (f5,false,ERR_NON_UNI_UTF8(c,n)) end end | 6 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) val (b5,f5) = getByte f4 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,5)) val (b6,f6) = getByte f5 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,6)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,4)) else if b5 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,5)) else if b6 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,6)) else let val c = (Byte2Char b1 <<< 0w30 + Byte2Char b2 <<< 0w24 + Byte2Char b3 <<< 0w18 + Byte2Char b4 <<< 0w12 + Byte2Char b5 <<< 0w06 + Byte2Char b6 - diff6) in if c<0wx4000000 then raise DecodeError (f6,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4,b5,b6]) else raise DecodeError (f6,false,ERR_NON_UNI_UTF8(c,n)) end end | _ => raise InternalError(THIS_MODULE,"getCharUtf8", "byte1switch holds "^Int.toString n^ ">6 for byte "^Bytes.toString b1) end end end (* stop of ../../Unicode/Decode/decodeUtf8.sml *) (* start of ../../Unicode/Decode/decode.sml *) (*--------------------------------------------------------------------------*) (* Structure: Decode *) (* *) (* Exceptions raised by functions in this structure: *) (* checkEncoding : NoSuchFile *) (* encCloseFile : none *) (* encFileName : none *) (*--------------------------------------------------------------------------*) signature Decode = sig structure Error : DecodeError type DecFile exception DecEof of DecFile exception DecError of DecFile * bool * Error.DecodeError val decUri : DecFile -> Uri.Uri val decName : DecFile -> string val decEncoding : DecFile -> Encoding.Encoding val decOpenXml : Uri.Uri option -> DecFile val decOpenUni : Uri.Uri option * Encoding.Encoding -> DecFile val decClose : DecFile -> DecFile val decCommit : DecFile -> unit val decSwitch : DecFile * string -> DecFile val decGetChar : DecFile -> UniChar.Char * DecFile val decGetArray : DecFile -> UniChar.Char array -> int * DecFile * Error.DecodeError option end structure Decode : Decode = struct structure Error = DecodeError open UniChar Encoding Error DecodeFile DecodeMisc DecodeUcs2 DecodeUcs4 DecodeUtf16 DecodeUtf8 DecodeUtil type DecFile = Encoding * File exception DecEof of DecFile exception DecError of DecFile * bool * DecodeError (*--------------------------------------------------------------------*) (* close an encoded entity. *) (*--------------------------------------------------------------------*) fun decClose (_,f) = (NOENC,f) before closeFile f (*--------------------------------------------------------------------*) (* get the uri string of an encoded entity. *) (*--------------------------------------------------------------------*) fun decName (_,f) = fileName f (*--------------------------------------------------------------------*) (* get the uri of an encoded entity. *) (*--------------------------------------------------------------------*) fun decUri (_,f) = fileUri f (*--------------------------------------------------------------------*) (* get the encoding of an encoded entity. *) (*--------------------------------------------------------------------*) fun decEncoding (enc,_) = enc (*--------------------------------------------------------------------*) (* commit the auto-detected encoding. *) (*--------------------------------------------------------------------*) fun decCommit (enc,f) = case enc of UTF8 => () | UTF16B => () | UTF16L => () | _ => raise DecError((enc,f),false,ERR_NO_ENC_DECL(encodingName enc)) (*--------------------------------------------------------------------*) (* change to another - compatible - encoding. *) (*--------------------------------------------------------------------*) fun decSwitch ((enc,f),decl) = let val decEnc = isEncoding decl val _ = if decEnc<>NOENC then () else raise DecError((enc,f),false,ERR_UNSUPPORTED_ENC decl) val newEnc = switchEncoding(enc,decEnc) val _ = if decEnc<>NOENC orelse enc=NOENC then () else raise DecError((enc,f),false,ERR_INCOMPATIBLE_ENC(encodingName enc,decl)) in (newEnc,f) end (*--------------------------------------------------------------------*) (* get a character from an encoded entity. *) (*--------------------------------------------------------------------*) fun decGetChar (enc,f) = let val (c,f1) = case enc of NOENC => raise EndOfFile f | ASCII => getCharAscii f | EBCDIC => getCharEbcdic f | LATIN1 => getCharLatin1 f | UCS2B => getCharUcs2b f | UCS2L => getCharUcs2l f | UCS4B => getCharUcs4b f | UCS4L => getCharUcs4l f | UCS4SB => getCharUcs4sb f | UCS4SL => getCharUcs4sl f | UTF8 => getCharUtf8 f | UTF16B => getCharUtf16b f | UTF16L => getCharUtf16l f in (c,(enc,f1)) end handle EndOfFile f => raise DecEof(NOENC,f) | DecodeError(f,eof,err) => raise DecError((enc,f),eof,err) (*--------------------------------------------------------------------*) (* Load new characters, depending on the current entity's encoding. *) (*--------------------------------------------------------------------*) fun decGetArray (enc,f) arr = let (*--------------------------------------------------------------*) (* Load the buffer with len new characters, or until the entity *) (* end is reached. Close the current file in that case. *) (* Local exception Ended is needed in order to preserve tail *) (* recursion. *) (*--------------------------------------------------------------*) fun loadArray getChar = let val ende = Array.length arr exception Error of int * exn fun doit (idx,f) = if idx=ende then (ende,(enc,f),NONE) else let val (c,f1) = getChar f handle exn => raise Error (idx,exn) val _ = Array.update(arr,idx,c) in doit (idx+1,f1) end in doit (0,f) handle Error(idx,exn) => case exn of EndOfFile f => (idx,(NOENC,f),NONE) | DecodeError (f,_,err) => (idx,(enc,f),SOME err) | _ => raise exn end in case enc of NOENC => (0,(NOENC,f),NONE) | ASCII => loadArray getCharAscii | EBCDIC => loadArray getCharEbcdic | LATIN1 => loadArray getCharLatin1 | UCS2B => loadArray getCharUcs2b | UCS2L => loadArray getCharUcs2l | UCS4B => loadArray getCharUcs4b | UCS4L => loadArray getCharUcs4l | UCS4SB => loadArray getCharUcs4sb | UCS4SL => loadArray getCharUcs4sl | UTF8 => loadArray getCharUtf8 | UTF16B => loadArray getCharUtf16b | UTF16L => loadArray getCharUtf16l end (*--------------------------------------------------------------------*) (* open an XML file and try to auto-detect its encoding. *) (*--------------------------------------------------------------------*) (* Auto-detection of the encoding of XML entities according to App. F *) (* of the XML recommendation. *) (* *) (* The file is opened in basic mode and upto four bytes are read from *) (* it in order to detect the encoding: if they constitute a prefix of *) (* " (nil,f) fun detect bs = case bs of [0wx0,0wx0,0wxFE,0wxFF] => (UCS4B,nil) | [0wxFF,0wxFE,0wx0,0wx0] => (UCS4L,nil) | [0wxFE,0wxFF,0wx0,b4] => if b4 <> 0wx0 then (UTF16B,[0wx0,b4]) else (UTF8,bs) | [0wxFF,0wxFE,b3,0wx0] => if b3 <> 0wx0 then (UTF16L,[b3,0wx0]) else (UTF8,bs) | [0wxEF,0wxBB,0wxBF,b4] => (UTF8,[b4]) | [0wx0,0wx0,0wx0,0wx3C] => (UCS4B,bs) | [0wx3C,0wx0,0wx0,0wx0] => (UCS4L,bs) | [0wx0,0wx0,0wx3C,0wx0] => (UCS4SB,bs) | [0wx0,0wx3C,0wx0,0wx0] => (UCS4SL,bs) | [0wx0,b2,b3,b4] => if (b2=0wx3C orelse b2=0wx25 orelse b2=0wx20 orelse b2=0wx09 orelse b2=0wx0D orelse b2=0wx0A) andalso (b3<>0wx0 orelse b4<>0wx0) then (UTF16B,bs) else (UTF8,bs) | [b1,0wx0,b3,b4] => if (b1=0wx3C orelse b1=0wx25 orelse b1=0wx20 orelse b1=0wx09 orelse b1=0wx0D orelse b1=0wx0A) andalso (b3<>0wx0 orelse b4<>0wx0) then (UTF16L,bs) else (UTF8,bs) | [0wx4C,0wx6F,0wxA7,0wx94] => (EBCDIC,bs) | _ => (UTF8,bs) val f = openFile uri val (bs,f1) = get4Bytes(0,f) val (enc,unget) = detect bs in (enc,ungetBytes(f1,unget)) end (*--------------------------------------------------------------------*) (* open a Unicode file. Check whether it starts with a byte order *) (* mark. If yes, chose UTF16 encoding, otherwise use the default that *) (* is provided as second argument. *) (* *) (* return the encoded file, a list of bytes looked ahead and the *) (* encoding. *) (*--------------------------------------------------------------------*) fun decOpenUni (uri,default) = let fun def(f,bs) = (default,ungetBytes(f,bs)) fun detect f = let val (b1,f1) = getByte f in case b1 of 0wxFE => (let val (b2,f2) = getByte f1 in if b2 = 0wxFF then (UTF16B,f2) else def(f2,[b1,b2]) end handle EndOfFile f => def(f,[b1])) | 0wxFF => (let val (b2,f2) = getByte f1 in if b2 = 0wxFE then (UTF16L,f2) else def(f2,[b1,b2]) end handle EndOfFile f => def(f,[b1])) | _ => def(f1,[b1]) end handle EndOfFile f => def(f,nil) val f = openFile uri val (enc,f1) = detect f in (enc,f1) end end (* stop of ../../Unicode/Decode/decode.sml *) (* start of ../../Parser/Error/errorData.sml *) structure ErrorData = struct (*--------------------------------------------------------------------*) (* a position holds the filename, line and column number. *) (*--------------------------------------------------------------------*) type Position = string * int * int val nullPosition = ("",0,0) datatype ExpItem = EXP_CHAR of UniChar.Char | EXP_DATA of UniChar.Data | EXP_STRING of string type Expected = ExpItem list type Found = UniChar.Data datatype Location = LOC_NONE | LOC_AFTER_DTD | LOC_ATT_DECL | LOC_ATT_DEFAULT of Position | LOC_ATT_VALUE | LOC_CDATA | LOC_CHOICE | LOC_COMMENT | LOC_CONTENT | LOC_DECL | LOC_DOC_DECL | LOC_ELEM_DECL | LOC_ENCODING | LOC_ENT_DECL | LOC_ENT_VALUE | LOC_EPILOG | LOC_ETAG | LOC_IGNORED | LOC_INCLUDED | LOC_INT_DECL | LOC_INT_SUBSET | LOC_LITERAL | LOC_MIXED | LOC_NOT_DECL | LOC_OUT_COND | LOC_PROC | LOC_PROLOG | LOC_PUB_LIT | LOC_SEQ | LOC_STAG | LOC_SUBSET | LOC_SYS_LIT | LOC_TEXT_DECL | LOC_VERSION | LOC_XML_DECL datatype EntityClass = ENT_GENERAL | ENT_PARAMETER | ENT_EXTERNAL | ENT_UNPARSED datatype Item = IT_ATT_NAME | IT_CDATA | IT_CHAR of UniChar.Char | IT_CHAR_REF | IT_COND | IT_DATA of UniChar.Data | IT_DECL | IT_DTD | IT_ELEM | IT_ENT_NAME | IT_ETAG | IT_GEN_ENT | IT_ID_NAME | IT_LANG_ID | IT_NAME | IT_NMTOKEN | IT_NOT_NAME | IT_NOTATION | IT_PAR_ENT | IT_PAR_REF | IT_REF | IT_STAG | IT_TARGET datatype Error = (* syntax errors *) ERR_EMPTY of Location | ERR_ENDED_BY_EE of Location | ERR_EXPECTED of Expected * Found | ERR_NON_XML_CHAR of UniChar.Char | ERR_MISSING_WHITE | ERR_NON_XML_CHARREF of UniChar.Char (* other well-formedness errors *) | ERR_CANT_PARSE of Location | ERR_ELEM_ENT_NESTING of UniChar.Data | ERR_ELEM_TYPE_MATCH of UniChar.Data * UniChar.Data | ERR_OMITTED_END_TAG of UniChar.Data | ERR_IGNORED_END_TAG of UniChar.Data * UniChar.Data | ERR_ENDED_IN_PROLOG | ERR_FORBIDDEN_HERE of Item * Location | ERR_ILLEGAL_ENTITY of EntityClass * UniChar.Data * Location | ERR_MULTIPLE_DTD | ERR_MULT_ATT_SPEC of UniChar.Data | ERR_RECURSIVE_ENTITY of EntityClass * UniChar.Data | ERR_UNDEC_ENTITY of EntityClass * UniChar.Data (* validity errors concerning attributes *) | ERR_AT_LEAST_ONE of Item | ERR_AT_MOST_ONE of Item | ERR_ATT_IS_NOT of UniChar.Data * Item | ERR_EXACTLY_ONE of Item | ERR_FIXED_VALUE of UniChar.Data * UniChar.Vector * UniChar.Vector | ERR_ID_DEFAULT | ERR_MISSING_ATT of UniChar.Data | ERR_MULT_ID_ELEM of UniChar.Data | ERR_MUST_BE_AMONG of Item * UniChar.Data * UniChar.Data list | ERR_MUST_BE_UNPARSED of UniChar.Data * Location | ERR_REPEATED_ID of UniChar.Data | ERR_UNDECL_ATT of UniChar.Data * UniChar.Data | ERR_UNDECL_ID of UniChar.Data * Position list (* validity errors concerning elements *) | ERR_BAD_ELEM of UniChar.Data * UniChar.Data | ERR_ELEM_CONTENT of Item | ERR_EMPTY_TAG of UniChar.Data | ERR_ENDED_EARLY of UniChar.Data | ERR_MULT_MIXED of UniChar.Data | ERR_NONEMPTY of UniChar.Data | ERR_REDEC_ELEM of UniChar.Data | ERR_ROOT_ELEM of UniChar.Data * UniChar.Data (* other validity errors *) | ERR_DECL_ENT_NESTING of Location | ERR_EE_INT_SUBSET | ERR_GROUP_ENT_NESTING of Location | ERR_NO_DTD | ERR_STANDALONE_DEF of UniChar.Data | ERR_STANDALONE_ELEM of UniChar.Data | ERR_STANDALONE_ENT of EntityClass *UniChar.Data | ERR_STANDALONE_NORM of UniChar.Data | ERR_UNDECLARED of Item * UniChar.Data * Location (* miscellaneous errors *) | ERR_DECL_PREDEF of UniChar.Data * UniChar.Vector | ERR_NO_SUCH_FILE of string * string | ERR_RESERVED of UniChar.Data * Item | ERR_VERSION of string | ERR_XML_SPACE (* compatibility errors *) | ERR_AMBIGUOUS of UniChar.Data * int * int | ERR_MUST_ESCAPE of UniChar.Char (* interoperability errors *) | ERR_EMPTY_TAG_INTER of UniChar.Data | ERR_MUST_BE_EMPTY of UniChar.Data (* decoding errors *) | ERR_DECODE_ERROR of Decode.Error.DecodeError datatype Warning = WARN_NO_XML_DECL | WARN_MULT_DECL of Item * UniChar.Data | WARN_SHOULD_DECLARE of UniChar.Data list | WARN_ATT_UNDEC_ELEM of UniChar.Data | WARN_MULT_ATT_DECL of UniChar.Data | WARN_MULT_ATT_DEF of UniChar.Data * UniChar.Data | WARN_ENUM_ATTS of UniChar.Data * UniChar.Data list | WARN_DFA_TOO_LARGE of UniChar.Data * int | WARN_NON_ASCII_URI of UniChar.Char end (* stop of ../../Parser/Error/errorData.sml *) (* start of ../../Parser/Error/errorString.sml *) signature ErrorString = sig val errorChar2String : UniChar.Char -> string val errorData2String : UniChar.Data -> string val errorVector2String : UniChar.Vector -> string val quoteErrorChar0 : UniChar.Char -> string val quoteErrorChar : UniChar.Char -> string val quoteErrorData : UniChar.Data -> string val quoteErrorString : string -> string val quoteErrorVector : UniChar.Vector -> string val Position2String : ErrorData.Position -> string val Expected2String : ErrorData.Expected -> string val Found2String : ErrorData.Found -> string val Item2String : ErrorData.Item -> string val AnItem2String : ErrorData.Item -> string val Location2String : ErrorData.Location -> string val InLocation2String : ErrorData.Location -> string val EntityClass2String : ErrorData.EntityClass -> string end structure ErrorString : ErrorString = struct open ErrorData UniChar UtilString fun errorChar2String c = case c of 0wx9 => "\\t" | 0wxA => "\\n" | _ => if c>=0wx20 andalso c<0wx100 then String.implode [Char2char c] else "U+"^UtilString.toUpperString (StringCvt.padLeft #"0" 4 (Chars.toString c)) fun errorData2String cs = String.concat (map errorChar2String cs) fun errorVector2String vec = errorData2String (Vector.foldr (op ::) nil vec) val QUOTE = "'" fun quoteErrorChar0 c = QUOTE^errorChar2String c^QUOTE fun quoteErrorChar c = if c=0wx0 then "entity end" else QUOTE^errorChar2String c^QUOTE fun quoteErrorData cs = QUOTE^errorData2String cs^QUOTE fun quoteErrorString s = QUOTE^s^QUOTE fun quoteErrorVector v = QUOTE^errorVector2String v^QUOTE fun Position2String (fname,l,c) = if fname="" then "" else String.concat ["[",fname,":",Int2String l,".",Int2String c,"]"] fun ExpItem2String exp = case exp of EXP_CHAR c => quoteErrorChar c | EXP_DATA cs => quoteErrorData cs | EXP_STRING s => s fun Expected2String exp = case exp of nil => "nothing" | [one] => ExpItem2String one | _ => let val l=List.length exp in List2xString ("",", ","") ExpItem2String (List.take (exp,l-1)) ^" or "^ExpItem2String (List.last exp) end fun Found2String fnd = case fnd of [0wx0] => "entity end" | cs => quoteErrorData cs fun Location2String loc = case loc of LOC_NONE => "nothing" | LOC_AFTER_DTD => "document instance" | LOC_ATT_DECL => "attribute list declaration" | LOC_ATT_DEFAULT pos => "default value declared at "^Position2String pos | LOC_ATT_VALUE => "attribute value" | LOC_CDATA => "CDATA section" | LOC_CHOICE => "choice list" | LOC_COMMENT => "comment" | LOC_CONTENT => "content" | LOC_DECL => "declaration" | LOC_DOC_DECL => "document type declaration" | LOC_ELEM_DECL => "element type declaration" | LOC_ENCODING => "encoding name" | LOC_ENT_DECL => "entity declaration" | LOC_ENT_VALUE => "entity value" | LOC_EPILOG => "epilog" | LOC_ETAG => "end-tag" | LOC_IGNORED => "ignored section" | LOC_INCLUDED => "included section" | LOC_INT_DECL => "declaration in the internal subset" | LOC_INT_SUBSET => "internal subset" | LOC_LITERAL => "literal" | LOC_MIXED => "Mixed list" | LOC_NOT_DECL => "notation declaration" | LOC_OUT_COND => "outside a conditional section" | LOC_PROLOG => "prolog" | LOC_PROC => "processing instruction" | LOC_PUB_LIT => "public identifier" | LOC_SEQ => "sequence list" | LOC_STAG => "start-tag" | LOC_SUBSET => "declaration subset" | LOC_SYS_LIT => "system identifier" | LOC_TEXT_DECL => "text declaration" | LOC_VERSION => "version number" | LOC_XML_DECL => "XML declaration" fun InLocation2String loc = case loc of LOC_NONE => "" | LOC_AFTER_DTD => "after the DTD" | LOC_CONTENT => "in content" | LOC_ATT_DEFAULT pos => "in default value declared at "^Position2String pos | LOC_DOC_DECL => "in the document type declaration" | LOC_EPILOG => "after the root element" | LOC_INT_SUBSET => "in the internal subset" | LOC_OUT_COND => "outside a conditional section" | LOC_PROLOG => "in prolog" | LOC_SUBSET => "in the declaration subset" | LOC_XML_DECL => "in the XML declaration" | _ => "in "^prependAnA (Location2String loc) fun EntityClass2String ent = case ent of ENT_GENERAL => "general" | ENT_PARAMETER => "parameter" | ENT_UNPARSED => "unparsed" | ENT_EXTERNAL => "external" fun Item2String item = case item of IT_ATT_NAME => "attribute name" | IT_CDATA => "CDATA section" | IT_CHAR c => "character "^quoteErrorChar c | IT_CHAR_REF => "character reference" | IT_COND => "conditional section" | IT_DATA cs => if null cs then "character data" else quoteErrorData cs | IT_DECL => "declaration" | IT_DTD => "document type declaration" | IT_ELEM => "element type" | IT_ENT_NAME => "entity name" | IT_ETAG => "end-tag" | IT_GEN_ENT => "general entity" | IT_ID_NAME => "ID name" | IT_LANG_ID => "language identifier" | IT_NAME => "name" | IT_NMTOKEN => "name token" | IT_NOT_NAME => "notation name" | IT_NOTATION => "notation" | IT_PAR_ENT => "parameter entity" | IT_PAR_REF => "parameter entity reference" | IT_REF => "reference" | IT_STAG => "start-tag" | IT_TARGET => "target name" fun AnItem2String item = case item of IT_CHAR c => Item2String item | IT_DATA cs => Item2String item | _ => prependAnA (Item2String item) end (* stop of ../../Parser/Error/errorString.sml *) (* start of ../../Parser/Error/errorMessage.sml *) signature ErrorMessage = sig val errorMessage : ErrorData.Error -> string list val warningMessage : ErrorData.Warning -> string list end structure ErrorMessage : ErrorMessage = struct open Decode UtilString ErrorData ErrorString val quoteChar0 = quoteErrorChar0 val quoteChar = quoteErrorChar val quoteData = quoteErrorData val quoteString = quoteErrorString val quoteVector = quoteErrorVector fun errorMessage err = case err (* syntax errors *) of ERR_EMPTY loc => ["Empty",Location2String loc] | ERR_ENDED_BY_EE loc => [toUpperFirst (Location2String loc),"ended by entity end"] | ERR_EXPECTED (exp,found) => ["Expected",Expected2String exp,"but found",Found2String found] | ERR_MISSING_WHITE => ["Missing white space"] | ERR_NON_XML_CHAR c => ["Non-XML character",quoteChar0 c] | ERR_NON_XML_CHARREF c => ["Reference to non-XML character",quoteChar0 c] (* other well-formedness errors *) | ERR_CANT_PARSE loc => ["Cannot parse",Location2String loc] | ERR_ELEM_ENT_NESTING elem => ["The first and last character of element",quoteData elem, "are in different entities"] | ERR_ELEM_TYPE_MATCH (elem,other) => ["Element",quoteData elem,"was ended by an end-tag for",quoteData other] | ERR_IGNORED_END_TAG(elem,other) => ["An end-tag for element type",quoteData other,"is not allowed in the", "content of element",quoteData elem] | ERR_OMITTED_END_TAG elem => ["Element",quoteData elem,"has no end-tag"] | ERR_ENDED_IN_PROLOG => ["Document entity ended in prolog"] | ERR_FORBIDDEN_HERE(what,loc) => [AnItem2String what,"is not allowed",InLocation2String loc] | ERR_ILLEGAL_ENTITY(what,ent,loc) => ["Reference to",EntityClass2String what,"entity",quoteData ent,InLocation2String loc] | ERR_MULTIPLE_DTD => ["Repeated document type declaration"] | ERR_MULT_ATT_SPEC att => ["A value for attribute",quoteData att,"was already specified in this tag"] | ERR_RECURSIVE_ENTITY(what,ent) => ["Reference to",EntityClass2String what,"entity",quoteData ent, "that is already open"] | ERR_UNDEC_ENTITY(what,ent) => ["Reference to undeclared",EntityClass2String what,"entity",quoteData ent] (* validity errors concerning attributes *) | ERR_AT_LEAST_ONE what => ["At least one",Item2String what,"must be specified"] | ERR_AT_MOST_ONE what => ["Only one",Item2String what,"may be specified"] | ERR_ATT_IS_NOT(cs,what) => [quoteData cs,"is not",AnItem2String what] | ERR_EXACTLY_ONE what => [toUpperFirst (AnItem2String what),"must be specified"] | ERR_FIXED_VALUE(att,value,fixed) => ["Attribute",quoteData att,"has the value",quoteVector value, "but was declared with a fixed default value of",quoteVector fixed] | ERR_ID_DEFAULT => ["An ID attribute must have a default value of #IMPLIED or #REQUIRED"] | ERR_MISSING_ATT att => ["No value was specified for required attribute",quoteData att] | ERR_MULT_ID_ELEM elem => ["Element type",quoteData elem,"already has an ID attribute"] | ERR_MUST_BE_AMONG (what,x,ys) => [toUpperFirst (Item2String what),quoteData x,"is none of", List2xString ("",",","") quoteData ys] | ERR_MUST_BE_UNPARSED (name,loc) => [quoteData name,InLocation2String loc,"is not the name of an unparsed entity"] | ERR_REPEATED_ID name => ["ID name",quoteData name,"already occurred as an attribute value"] | ERR_UNDECL_ATT(att,elem) => ["Attribute",quoteData att,"was not declared for element type",quoteData elem] | ERR_UNDECL_ID(name,refs) => (if null refs then ["Reference to non-existent ID",quoteData name] else ["Reference to non-existent ID",quoteData name, "(also referenced at",List2xString ("",", ",")") Position2String refs]) (* validity errors concerning elements *) | ERR_BAD_ELEM (curr,elem) => ["Element type",quoteData elem,"not allowed at this point", "in the content of element",quoteData curr] | ERR_ELEM_CONTENT what => [toUpperFirst (AnItem2String what),"is not allowed in element content"] | ERR_EMPTY_TAG elem => ["Empty-element tag for element type",quoteData elem, "whose content model requires non-empty content"] | ERR_ENDED_EARLY elem => ["Element",quoteData elem,"ended before its content was completed"] | ERR_MULT_MIXED elem => ["Element type",quoteData elem,"already occurred in this mixed-content declaration"] | ERR_NONEMPTY elem => ["The end-tag for element",quoteData elem,"with declared EMPTY content", "must follow immediately after its start-tag"] | ERR_REDEC_ELEM elem => ["Element type",quoteData elem,"was already declared"] | ERR_ROOT_ELEM (dec,root) => ["Document element",quoteData root,"does not match the name", quoteData dec,"in the document type declaration"] (* other validity errors *) | ERR_DECL_ENT_NESTING loc => ["The first and last character of this",Location2String loc, "are not in the same entity replacement text"] | ERR_EE_INT_SUBSET => ["An entity end is not allowed in a declaration in the internal subset"] | ERR_GROUP_ENT_NESTING loc => ["The opening and closing parentheses of this",Location2String loc, "are not in the same entity replacement text"] | ERR_NO_DTD => ["There is no document type declaration. Switching to semi-validating mode", "(will not check for declaredness of entities, elements, etc.)"] | ERR_STANDALONE_DEF att => ["Externally declared attribute",quoteData att,"was defaulted,", "although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_ELEM elem => ["White space occurred in the content of externally declared", "element",quoteData elem,"with declared element content", "although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_ENT(what,ent) => ["Reference to externally declared",EntityClass2String what,"entity", quoteData ent^",","although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_NORM att => ["The value for externally declared attribute", quoteData att,"was changed as a result of normalization,", "although the standalone declaration is",quoteString "yes"] | ERR_UNDECLARED (what,x,loc) => ["Undeclared",Item2String what,quoteData x,InLocation2String loc] (* miscellaneous errors *) | ERR_DECL_PREDEF(ent,def) => ["General entity",quoteData ent,"must be declared as internal entity", "with replacement text",quoteVector def] | ERR_NO_SUCH_FILE(f,msg) => ["Could not open file",quoteString f,"("^msg^")"] | ERR_RESERVED(name,what) => [quoteData name,"is reserved for standardization and therefore not allowed as", AnItem2String what] | ERR_VERSION version => ["XML version",quoteString version,"is not supported"] | ERR_XML_SPACE => ["Attribute",quoteString "xml:space","must be given an enumeration type", "with values",quoteString "default","and",quoteString "preserve","only"] (* compatibility errors *) | ERR_AMBIGUOUS(a,n1,n2) => ["Content model is ambiguous: conflict between the",numberNth n1, "and the",numberNth n2,"occurrence of element",quoteData a^".", "Using an approximation instead"] | ERR_MUST_ESCAPE c => ["Character",quoteChar c,"must be escaped for compatibility"] (* interoperability errors *) | ERR_EMPTY_TAG_INTER elem => ["Empty-element tag for element",quoteData elem,"with non-EMPTY declared content"] | ERR_MUST_BE_EMPTY elem => ["An empty-element tag must be used for element type", quoteData elem,"with EMPTY declared content"] (* decoding errors *) | ERR_DECODE_ERROR err => "Decoding error:"::Decode.Error.decodeMessage err fun warningMessage warn = case warn of WARN_NO_XML_DECL => ["Document entity has no XML declaration"] | WARN_MULT_DECL(what,name) => ["Repeated declaration for",Item2String what,quoteData name] | WARN_SHOULD_DECLARE(ents) => let val (one,more) = (hd ents,tl ents) in case more of nil => ["The predefined entity",quoteData one,"should have been declared"] | _ => ["The predefined entities",List2xString ("",", ","") quoteData more, "and",quoteData one,"should have been declared"] end | WARN_ATT_UNDEC_ELEM elem => ["Attribute-list declaration for undeclared element type",quoteData elem] | WARN_MULT_ATT_DECL elem => ["Repeated attribute-list declaration for element type",quoteData elem] | WARN_MULT_ATT_DEF(elem,att) => ["Repeated definition of attribute",quoteData att,"for element type",quoteData elem] | WARN_ENUM_ATTS(elem,names) => ["The following name tokens occur more than once in the enumerated attribute", "types of element",quoteData elem^":",List2xString ("",", ","") quoteData names] | WARN_DFA_TOO_LARGE (elem,max) => ["The finite state machine for the content model of element type", quoteData elem,"would have more than the maximal allowed number of", Int2String max,"states. Using an approximation instead"] | WARN_NON_ASCII_URI c => ["System identifier contains non-ASCII character",quoteChar c] end (* stop of ../../Parser/Error/errorMessage.sml *) (* start of ../../Parser/Error/errorUtil.sml *) signature ErrorUtil = sig val isFatalError : ErrorData.Error -> bool val isDecodeError : ErrorData.Error -> bool val isSyntaxError : ErrorData.Error -> bool val isValidityError : ErrorData.Error -> bool val isWellFormedError : ErrorData.Error -> bool end structure ErrorUtil : ErrorUtil = struct open ErrorData fun isDecodeError err = case err of ERR_DECODE_ERROR _ => true | _ => false fun isSyntaxError err = case err of ERR_EMPTY _ => true | ERR_ENDED_BY_EE _ => true | ERR_EXPECTED _ => true | ERR_MISSING_WHITE => true | ERR_NON_XML_CHAR _ => true | ERR_NON_XML_CHARREF _ => true | _ => false fun isWellFormedError err = case err of ERR_CANT_PARSE _ => true | ERR_ELEM_ENT_NESTING _ => true | ERR_ELEM_TYPE_MATCH _ => true | ERR_OMITTED_END_TAG _ => true | ERR_IGNORED_END_TAG _ => true | ERR_ENDED_IN_PROLOG => true | ERR_FORBIDDEN_HERE _ => true | ERR_ILLEGAL_ENTITY _ => true | ERR_MULTIPLE_DTD => true | ERR_MULT_ATT_SPEC _ => true | ERR_RECURSIVE_ENTITY _ => true | ERR_UNDEC_ENTITY _ => true | _ => isSyntaxError err fun isFatalError err = case err of ERR_NO_SUCH_FILE _ => true | _ => isWellFormedError err fun isValidityError err = case err of ERR_AT_LEAST_ONE _ => true | ERR_AT_MOST_ONE _ => true | ERR_ATT_IS_NOT _ => true | ERR_EXACTLY_ONE _ => true | ERR_FIXED_VALUE _ => true | ERR_ID_DEFAULT => true | ERR_MISSING_ATT _ => true | ERR_MULT_ID_ELEM _ => true | ERR_MUST_BE_AMONG _ => true | ERR_MUST_BE_UNPARSED _ => true | ERR_REPEATED_ID _ => true | ERR_UNDECL_ATT _ => true | ERR_UNDECL_ID _ => true | ERR_BAD_ELEM _ => true | ERR_ELEM_CONTENT _ => true | ERR_EMPTY_TAG _ => true | ERR_ENDED_EARLY _ => true | ERR_MULT_MIXED _ => true | ERR_NONEMPTY _ => true | ERR_REDEC_ELEM _ => true | ERR_ROOT_ELEM _ => true | ERR_DECL_ENT_NESTING _ => true | ERR_EE_INT_SUBSET => true | ERR_GROUP_ENT_NESTING _ => true | ERR_NO_DTD => true | ERR_STANDALONE_DEF _ => true | ERR_STANDALONE_ELEM _ => true | ERR_STANDALONE_ENT _ => true | ERR_STANDALONE_NORM _ => true | ERR_UNDECLARED _ => true | _ => false end (* stop of ../../Parser/Error/errorUtil.sml *) (* start of ../../Parser/Error/expected.sml *) structure Expected = struct local open UniChar ErrorData in val expAnElemName = [EXP_STRING "an element name"] val expAnEntName = [EXP_STRING "an entity name"] val expAName = [EXP_STRING "a name"] val expANameToken = [EXP_STRING "a name token"] val expANotName = [EXP_STRING "a notation name"] val expATarget = [EXP_STRING "a target name"] val expAttDefKey = [EXP_DATA (String2Data "REQUIRED"),EXP_DATA (String2Data "IMPLIED"), EXP_DATA (String2Data "FIXED")] val expAttNameGt = [EXP_STRING "an attribute name",EXP_CHAR 0wx3E] val expAttSTagEnd = [EXP_STRING "an attribute name",EXP_CHAR 0wx3E, EXP_DATA(String2Data "/>")] val expAttType = [EXP_CHAR 0wx28,EXP_DATA (String2Data "CDATA"), EXP_DATA (String2Data "ID"),EXP_DATA (String2Data "IDREF"), EXP_DATA (String2Data "IDREFS"),EXP_DATA (String2Data "ENTITY"), EXP_DATA (String2Data "ENTITIES"),EXP_DATA (String2Data "NMTOKEN"), EXP_DATA (String2Data "NMTOKENS"),EXP_DATA (String2Data "NOTATION")] val expBarRpar = [EXP_CHAR 0wx29,EXP_CHAR 0wx7C] val expCdata = [EXP_DATA (String2Data "CDATA")] fun expConCRpar c = [EXP_CHAR 0wx29,EXP_CHAR c] val expConRpar = [EXP_CHAR 0wx29,EXP_CHAR 0wx2C,EXP_CHAR 0wx7C] val expCondStatus = [EXP_DATA (String2Data "IGNORE"),EXP_DATA (String2Data "INCLUDE")] val expContSpec = [EXP_CHAR 0wx28,EXP_DATA (String2Data "ANY"), EXP_DATA (String2Data "EMPTY")] val expElemLpar = [EXP_STRING "an element name",EXP_CHAR 0wx28] val expEncStand = [EXP_DATA (String2Data "encoding"), EXP_DATA (String2Data "standalone")] val expDash = [EXP_CHAR 0wx2D] val expDashDocLbrk = [EXP_CHAR 0wx2D,EXP_CHAR 0wx5B,EXP_DATA (String2Data "DOCTYPE")] val expDashLbrack = [EXP_CHAR 0wx2D,EXP_CHAR 0wx5B] val expDigitX = [EXP_STRING "a digit",EXP_CHAR 0wx78] val expEncoding = [EXP_DATA (String2Data "encoding")] val expEncVers = [EXP_DATA (String2Data "encoding"),EXP_DATA (String2Data "version")] val expEntNamePero = [EXP_STRING "an entity name",EXP_CHAR 0wx25] val expEq = [EXP_CHAR 0wx3D] val expExclQuest = [EXP_CHAR 0wx21,EXP_CHAR 0wx3F] val expExtId = [EXP_DATA (String2Data "PUBLIC"),EXP_DATA (String2Data "SYSTEM")] val expGt = [EXP_CHAR 0wx3E] val expGtNdata = [EXP_CHAR 0wx3E,EXP_DATA (String2Data "NDATA")] val expHexDigit = [EXP_STRING "a hexadecimal digit"] val expInSubset = [EXP_CHAR 0wx3C,EXP_CHAR 0wx5D,EXP_CHAR 0wx25, EXP_STRING "white space"] val expLbrack = [EXP_CHAR 0wx5B] val expLitQuote = [EXP_CHAR 0wx22,EXP_CHAR 0wx27] val expLitQuotExt = [EXP_CHAR 0wx22,EXP_CHAR 0wx27, EXP_DATA (String2Data "PUBLIC"),EXP_DATA (String2Data "SYSTEM")] val expLpar = [EXP_CHAR 0wx28] val expNoYes = [EXP_DATA (String2Data "no"),EXP_DATA (String2Data "yes")] val expPcdata = [EXP_DATA (String2Data "PCDATA")] val expProcEnd = [EXP_DATA (String2Data "?>")] val expQuoteRni = [EXP_CHAR 0wx22,EXP_CHAR 0wx27,EXP_CHAR 0wx23] val expRbrack = [EXP_CHAR 0wx5D] val expRep = [EXP_CHAR 0wx2A] val expSemi = [EXP_CHAR 0wx3B] val expStandOpt = [EXP_DATA (String2Data "standalone"),EXP_DATA (String2Data "?>")] val expStartEnc = [EXP_STRING "a letter"] val expStartMarkup = [EXP_DATA (String2Data "--"),EXP_DATA (String2Data "ATTLIST"), EXP_DATA (String2Data "ELEMENT"),EXP_DATA (String2Data "ENTITY"), EXP_DATA (String2Data "NOTATION")] val expVersion = [EXP_DATA (String2Data "version")] end end (* stop of ../../Parser/Error/expected.sml *) (* start of ../../Parser/Error/errors.sml *) structure Errors = struct open UtilError ErrorData ErrorMessage ErrorString ErrorUtil Expected end (* stop of ../../Parser/Error/errors.sml *) (* start of ../../Parser/Base/baseData.sml *) (*--------------------------------------------------------------------------*) (* Structure: BaseData *) (*--------------------------------------------------------------------------*) structure BaseData = struct open DfaData (*--- external ids may have a public id and must have a system id ---*) (*--- for notations, however, also the system id can be optional ----*) datatype ExternalId = EXTID of (string * UniChar.Char) option * (Uri.Uri * Uri.Uri * UniChar.Char) option (*--- external ids may have a public id and must have a system id ---*) type NotationInfo = ExternalId option (*--- replacement of a general entity ---*) datatype GenEntity = GE_NULL | GE_INTERN of UniChar.Vector * UniChar.Vector | GE_EXTERN of ExternalId | GE_UNPARSED of ExternalId * int * Errors.Position type GenEntInfo = GenEntity * bool fun isExtGen (GE_EXTERN _) = true | isExtGen _ = false (*--- replacement of a parameter entity ---*) datatype ParEntity = PE_NULL | PE_INTERN of UniChar.Vector * UniChar.Vector | PE_EXTERN of ExternalId type ParEntInfo = ParEntity * bool fun isExtPar (PE_EXTERN _) = true | isExtPar _ = false (*--- declared type of an attribute ---*) datatype AttType = AT_CDATA | AT_NMTOKEN | AT_NMTOKENS | AT_ID | AT_IDREF | AT_IDREFS | AT_ENTITY | AT_ENTITIES | AT_GROUP of int list | AT_NOTATION of int list (*--- typed attribute value ---*) datatype AttValue = AV_CDATA of UniChar.Vector | AV_NMTOKEN of UniChar.Data | AV_NMTOKENS of UniChar.Data list | AV_ID of int | AV_IDREF of int | AV_IDREFS of int list | AV_ENTITY of int | AV_ENTITIES of int list | AV_GROUP of int list * int | AV_NOTATION of int list * int fun isIdType at = at=AT_ID (*--- default values of attributes ---*) datatype AttDefault = AD_IMPLIED | AD_REQUIRED | AD_DEFAULT of (UniChar.Vector * UniChar.Vector * AttValue option) * (Errors.Position * bool ref) | AD_FIXED of (UniChar.Vector * UniChar.Vector * AttValue option) * (Errors.Position * bool ref) (*--- attribute definition (list) ---*) (*--- the boolean says whether it was externally declared ---*) type AttDef = int * AttType * AttDefault * bool type AttDefList = AttDef list (*--- content specification ---*) fun defaultAttDef idx = (idx,AT_CDATA,AD_IMPLIED,false) (*--- content specification ---*) datatype ContentSpec = CT_ANY | CT_EMPTY | CT_MIXED of int list | CT_ELEMENT of DfaData.ContentModel * DfaData.Dfa fun isMixed ct = case ct of CT_ANY => true | CT_MIXED _ => true | _ => false type ElemInfo = {decl : (ContentSpec * bool) option, atts : (AttDefList * bool) option, errAtts : int list} val nullElemInfo : ElemInfo = {decl=NONE, atts=NONE, errAtts=nil} (*--------------------------------------------------------------------*) (* the id info tells whether an id value has occurred for a name and *) (* the list of all positions where it occurred as an idref value. *) (*--------------------------------------------------------------------*) type IdInfo = bool * Errors.Position list val nullIdInfo : IdInfo = (false,nil) end (* stop of ../../Parser/Base/baseData.sml *) (* start of ../../Parser/Dfa/dfaString.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaString *) (* *) (* Notes: *) (* This structure is needed for debugging of content models and tables. *) (* *) (* Depends on: *) (* DfaData *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (* Table2String : none *) (* ContentModel2String : none *) (*--------------------------------------------------------------------------*) signature DfaString = sig val ContentModel2String : (int -> string) -> DfaData.ContentModel -> string val Dfa2String : (int -> string) -> DfaData.Dfa -> string end structure DfaString : DfaString = struct open DfaBase UtilString fun State2String q = if q=dfaError then "Error" else Int2String q fun Info2String Elem2String (q,mt,fst) = String.concat (State2String q::Bool2xString ("[empty]","") mt ::map (fn (q,a) => " "^Elem2String a^"->"^State2String q) fst) fun ContentModel2String Elem2String cm = case cm of CM_ELEM i => Elem2String i | CM_OPT cm => ContentModel2String Elem2String cm^"?" | CM_REP cm => ContentModel2String Elem2String cm^"*" | CM_PLUS cm => ContentModel2String Elem2String cm^"+" | CM_ALT cms => List2xString ("(","|",")") (ContentModel2String Elem2String) cms | CM_SEQ cms => List2xString ("(",",",")") (ContentModel2String Elem2String) cms fun CM2String Elem2String = let fun cm2s indent cm = case cm of (ELEM a,info) => String.concat [indent,Elem2String a," ",Info2String Elem2String info,"\n"] | (OPT cm',info) => String.concat [indent,"? ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (REP cm',info) => String.concat [indent,"* ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (PLUS cm',info) => String.concat [indent,"+ ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (ALT cms,info) => String.concat (indent^"| "::Info2String Elem2String info::"\n" ::map (cm2s (indent^" ")) cms) | (SEQ cms,info) => String.concat (indent^", "::Info2String Elem2String info::"\n" ::map (cm2s (indent^" ")) cms) in cm2s "" end fun Row2String Elem2String (lo,hi,tab,fin) = String.concat (Vector.foldri (fn (i,q,yet) => if q<0 then yet else " "::Elem2String (i+lo)::"->"::State2String q::yet) (if fin then [" [Final]"] else nil) (tab,0,NONE)) fun Dfa2String Elem2String tab = String.concat (Vector.foldri (fn (q,row,yet) => State2String q::":"::Row2String Elem2String row::yet) nil (tab,0,NONE)) end (* stop of ../../Parser/Dfa/dfaString.sml *) (* start of ../../Parser/Base/baseString.sml *) (*--------------------------------------------------------------------------*) (* Structure: BaseString *) (* *) (* Depends on: *) (* UniChar *) (* Dfa *) (* BaseData *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (* ElemInfo2xString : InternalError *) (* ExternalId2String : none *) (* GenEntity2xString : none *) (* Notation2String : none *) (* IdInfo2String : none *) (* ParEntity2String : none *) (*--------------------------------------------------------------------------*) signature BaseString = sig val ExternalId2String : BaseData.ExternalId -> string val NotationInfo2String : BaseData.NotationInfo -> string val GenEntity2xString : (int -> string) -> BaseData.GenEntity -> string val ParEntity2String : BaseData.ParEntity -> string val ElemInfo2xString : (int -> string) * (int -> string) * (int -> string) * (int -> string) * (int -> string) -> BaseData.ElemInfo -> string val IdInfo2String : BaseData.IdInfo -> string end structure BaseString : BaseString = struct open UtilString Uri Errors UniChar DfaString BaseData val THIS_MODULE = "BaseString" fun ExternalId2String (EXTID id) = case id of (SOME(p,pq),SOME(rel,s,sq)) => String.concat ["PUBLIC ",quoteUni pq p, " ",quoteUni sq (Uri2String rel), " @ ",quoteUni sq (Uri2String s)] | (SOME(p,pq),NONE) => String.concat ["PUBLIC ",quoteUni pq p] | (NONE,SOME(rel,s,sq)) => String.concat ["SYSTEM ",quoteUni sq (Uri2String rel), " @ ",quoteUni sq (Uri2String s)] | (NONE,NONE) => "" fun NotationInfo2String not = case not of NONE => "undeclared" | SOME extId => ExternalId2String extId fun GenEntity2xString NotIdx2String ge = case ge of GE_NULL => "NULL" | GE_INTERN(lit,cv) => let val quote = Vector.sub(lit,0) in String.concat ["INTERN ",Vector2String lit, " - ",quoteVector quote cv] end | GE_EXTERN id => "EXTERN "^ExternalId2String id | GE_UNPARSED(id,not,_) => "UNPARSED "^ExternalId2String id^" "^NotIdx2String not fun ParEntity2String pe = case pe of PE_NULL => "NULL" | PE_INTERN(lit,cv) => let val quote = Vector.sub(lit,0) in String.concat ["INTERN ",Vector2String lit, " - ",quoteVector quote cv] end | PE_EXTERN id => "EXTERN "^ExternalId2String id fun ContentSpec2String Elem2String cs = case cs of CT_ANY => "ANY" | CT_EMPTY => "EMPTY" | CT_MIXED is => List2xString ("MIXED (","|",")") Elem2String is | CT_ELEMENT(cm,_) => "ELEMENT "^ContentModel2String Elem2String cm fun AttValue2xString (Att2String,Ent2String,Id2String,Not2String) quote av = quoteUni quote (case av of AV_CDATA buf => Vector2String buf | AV_NMTOKEN cs => Data2String cs | AV_NMTOKENS css => List2xString (""," ","") Data2String css | AV_ID idx => Id2String idx | AV_IDREF idx => Id2String idx | AV_IDREFS idxs => List2xString (""," ","") Id2String idxs | AV_ENTITY idx => Ent2String idx | AV_ENTITIES idxs => List2xString (""," ","") Ent2String idxs | AV_GROUP(_,idx) => Att2String idx | AV_NOTATION(_,idx) => Not2String idx) fun AttDefault2xString funs ad = case ad of AD_DEFAULT ((lit,cv,av),_) => let val quote = Vector.sub(lit,0) in String.concat [quoteVector quote cv," ", Option2String0 (AttValue2xString funs quote) av] end | AD_FIXED ((lit,cv,av),_) => let val quote = Vector.sub(lit,0) in String.concat ["#FIXED ",quoteVector quote cv," ", Option2String0 (AttValue2xString funs quote) av] end | AD_IMPLIED => "#IMPLIED" | AD_REQUIRED => "#REQUIRED" fun AttType2xString (Att2String,Not2String) at = case at of AT_CDATA => "CDATA" | AT_NMTOKEN => "NMTOKEN" | AT_NMTOKENS => "NMTOKENS" | AT_ID => "ID" | AT_IDREF => "IDREF" | AT_IDREFS => "IDREFS" | AT_ENTITY => "ENTITY" | AT_ENTITIES => "ENTITIES" | AT_GROUP idxs => List2xString ("(","|",")") Att2String idxs | AT_NOTATION idxs => List2xString ("NOTATION(","|",")") Not2String idxs fun AttDef2xString (funs as (Att2String,_,_,Not2String)) (idx,attType,default,ext) = String.concat [Att2String idx," ", AttType2xString (Att2String,Not2String) attType," ", AttDefault2xString funs default, Bool2xString ("[external]","") ext] fun AttDefList2xString funs adl = List2xString ("",",","") (AttDef2xString funs) adl fun ElemInfo2xString (Att2String,Elem2String,Ent2String,Id2String,Not2String) ({decl,atts,...}:ElemInfo) = let val dec = case decl of NONE => "elem undeclared" | SOME(cont,ext) => String.concat ["elem declared ",if ext then "ex" else "in","ternally: ", ContentSpec2String Elem2String cont] val att = case atts of NONE => "no atts declared" | SOME(defs,hadId) => String.concat ["atts were declared",if hadId then "(has id attribute): " else ": ", AttDefList2xString (Att2String,Ent2String,Id2String,Not2String) defs] in dec^att end fun IdInfo2String (decl,refs) = Bool2xString ("declared","undeclared") decl^"/"^ (if null refs then "no references" else List2xString ("references: ",", ","") Position2String refs) end (* stop of ../../Parser/Base/baseString.sml *) (* start of ../../Parser/Base/base.sml *) structure Base = struct open BaseData BaseString end (* stop of ../../Parser/Base/base.sml *) (* start of ../../Parser/Params/dtd.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dtd *) (* *) (* Exceptions raised by functions in this structure: *) (* AttNot2Index : none *) (* Element2Index : none *) (* GenEnt2Index : none *) (* Id2Index : none *) (* Index2AttNot : NoSuchIndex *) (* Index2Element : NoSuchIndex *) (* Index2GenEnt : NoSuchIndex *) (* Index2Id : NoSuchIndex *) (* Index2ParEnt : NoSuchIndex *) (* ParEnt2Index : none *) (* entitiesWellformed : none *) (* getElement : NoSuchIndex *) (* getGenEnt : NoSuchIndex *) (* getId : NoSuchIndex *) (* getNotation : NoSuchIndex *) (* getParEnt : NoSuchIndex *) (* hasNotation : NoSuchIndex *) (* initDtdTables : none *) (* maxUsedElem : none *) (* maxUsedId : none *) (* printAttNotTable : none *) (* printIdTable : none *) (* printParEntTable : none *) (* printxElementTable : none *) (* printxGenEntTable : none *) (* setElement : NoSuchIndex *) (* setGenEnt : NoSuchIndex *) (* setId : NoSuchIndex *) (* setNotation : NoSuchIndex *) (* setParEnt : NoSuchIndex *) (*--------------------------------------------------------------------------*) signature Dtd = sig type Dtd val hasDtd : Dtd -> bool val hasExternal : Dtd -> bool val standsAlone : Dtd -> bool val setHasDtd : Dtd -> unit val setExternal : Dtd -> unit val setStandAlone : Dtd -> bool -> unit val entitiesWellformed : Dtd -> bool val validPredef : int -> UniChar.Vector val isRedefined : Dtd -> int -> bool val setRedefined : Dtd -> int -> unit val notRedefined : Dtd -> UniChar.Data list val AttNot2Index : Dtd -> UniChar.Data -> int val Element2Index : Dtd -> UniChar.Data -> int val Id2Index : Dtd -> UniChar.Data -> int val GenEnt2Index : Dtd -> UniChar.Data -> int val ParEnt2Index : Dtd -> UniChar.Data -> int val Index2Element : Dtd -> int -> UniChar.Data val Index2Id : Dtd -> int -> UniChar.Data val Index2GenEnt : Dtd -> int -> UniChar.Data val Index2AttNot : Dtd -> int -> UniChar.Data val Index2ParEnt : Dtd -> int -> UniChar.Data val getId : Dtd -> int -> Base.IdInfo val getElement : Dtd -> int -> Base.ElemInfo val getGenEnt : Dtd -> int -> Base.GenEntInfo val getNotation : Dtd -> int -> Base.NotationInfo val getParEnt : Dtd -> int -> Base.ParEntInfo val hasNotation : Dtd -> int -> bool val setId : Dtd -> int * Base.IdInfo -> unit val setElement : Dtd -> int * Base.ElemInfo -> unit val setGenEnt : Dtd -> int * Base.GenEntInfo -> unit val setNotation : Dtd -> int * Base.ExternalId -> unit val setParEnt : Dtd -> int * Base.ParEntInfo -> unit val maxUsedId : Dtd -> int val maxUsedElem : Dtd -> int val maxUsedGen : Dtd -> int val initDtdTables : unit -> Dtd val printDtdTables : Dtd -> unit val printAttNotTable : Dtd -> unit val printIdTable : Dtd -> unit val printElementTable : Dtd -> unit val printGenEntTable : Dtd -> unit val printParEntTable : Dtd -> unit val defaultIdx : int val preserveIdx : int val xmlLangIdx : int val xmlSpaceIdx : int val xmlSpaceType : Base.AttType end structure Dtd :> Dtd = struct open UtilInt Base UniChar DataDict DataSymTab val O_TS_ELEM = ref 6 (* Initial size of element table *) val O_TS_GEN_ENT = ref 6 (* Initial size of general entity table *) val O_TS_ID = ref 6 (* Initial size of id attribute table *) val O_TS_ATT_NOT = ref 6 (* Initial size of notation table *) val O_TS_PAR_ENT = ref 6 (* Initial size of parameter entity table *) (*--------------------------------------------------------------------*) (* this is how the predefined entities must be declared. *) (*--------------------------------------------------------------------*) val predefined = Vector.fromList (map (fn (x,y,z) => (String2Data x,String2Vector y,String2Vector z)) [("","",""), ("amp" ,"'&'","&"), ("lt" ,"'<'","<"), ("gt" ,"'>'",">"), ("apos","\"'\"" ,"'" ), ("quot","'\"'" ,"\"" )]) fun validPredef i = #3(Vector.sub(predefined,i)) (*--------------------------------------------------------------------*) (* this type holds all information relevent to the DTD. *) (*--------------------------------------------------------------------*) type Dtd = {hasDtdFlag : bool ref, standAloneFlag : bool ref, externalFlag : bool ref, elDict : ElemInfo DataDict.Dict, genDict : GenEntInfo DataDict.Dict, idDict : IdInfo DataDict.Dict, notDict : NotationInfo DataDict.Dict, parDict : ParEntInfo DataDict.Dict, preRedef : bool array } fun newDtd() = {hasDtdFlag = ref false, standAloneFlag = ref false, externalFlag = ref false, elDict = nullDict ("element",nullElemInfo), idDict = nullDict ("ID name",nullIdInfo), genDict = nullDict ("general entity",(GE_NULL,false)), notDict = nullDict ("attribute and notation",NONE:NotationInfo), parDict = nullDict ("parameter entity",(PE_NULL,false)), preRedef = Array.array(6,false) } : Dtd val default = String2Data "default" val preserve = String2Data "preserve" val xmlLang = String2Data "xml:lang" val xmlSpace = String2Data "xml:space" (*--------------------------------------------------------------------*) (* standalone status, existance of a DTD and of external declarations *) (* externalFlag is true if there is an external subset or a (not nece-*) (* ssarily external) parameter entity reference in the DTD. (cf. 4.1) *) (*--------------------------------------------------------------------*) fun standsAlone (dtd:Dtd) = !(#standAloneFlag dtd) fun hasExternal (dtd:Dtd) = !(#externalFlag dtd) fun hasDtd (dtd:Dtd) = !(#hasDtdFlag dtd) fun setHasDtd (dtd:Dtd) = #hasDtdFlag dtd := true fun setExternal (dtd:Dtd) = #externalFlag dtd := true fun setStandAlone (dtd:Dtd) x = #standAloneFlag dtd := x (*--------------------------------------------------------------------*) (* 4.1: *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration ... Note that *) (* if entities are declared in the external subset or in external *) (* parameter entities, a non-validating processor is not obligated *) (* to read and process their declarations; for such documents, the *) (* rule that an entity must be declared is a well-formedness *) (* constraint only if standalone='yes'. *) (* *) (* Thus a reference to an undeclared entity is a well-formedness *) (* error if either #hasDtdFlag or #externalFlag is false, or if *) (* #standaloneFlag is true *) (*--------------------------------------------------------------------*) (* bug fixed 080600: changed !hasDtdFlag to not(!hasDtdFlag) *) (*--------------------------------------------------------------------*) fun entitiesWellformed ({hasDtdFlag,standAloneFlag,externalFlag,...}:Dtd) = not (!hasDtdFlag andalso !externalFlag) orelse !standAloneFlag fun initStandalone ({hasDtdFlag,standAloneFlag,externalFlag,...}:Dtd) = (hasDtdFlag := false; standAloneFlag := false; externalFlag := false) (*--------------------------------------------------------------------*) (* this array tells whether the predefined entities (index 1-5) have *) (* been declared in the dtd. *) (*--------------------------------------------------------------------*) fun isRedefined (dtd:Dtd) i = Array.sub(#preRedef dtd,i) fun setRedefined (dtd:Dtd) i = Array.update(#preRedef dtd,i,true) fun notRedefined dtd = List.mapPartial (fn i => if isRedefined dtd i then NONE else SOME(#1(Vector.sub(predefined,i)))) [1,2,3,4,5] fun AttNot2Index (dtd:Dtd) name = getIndex(#notDict dtd,name) fun Element2Index (dtd:Dtd) name = getIndex(#elDict dtd,name) fun GenEnt2Index (dtd:Dtd) name = getIndex(#genDict dtd,name) fun Id2Index (dtd:Dtd) name = getIndex(#idDict dtd,name) fun ParEnt2Index (dtd:Dtd) name = getIndex(#parDict dtd,name) fun Index2AttNot (dtd:Dtd) idx = getKey(#notDict dtd,idx) fun Index2Element (dtd:Dtd) idx = getKey(#elDict dtd,idx) fun Index2GenEnt (dtd:Dtd) idx = getKey(#genDict dtd,idx) fun Index2Id (dtd:Dtd) idx = getKey(#idDict dtd,idx) fun Index2ParEnt (dtd:Dtd) idx = getKey(#parDict dtd,idx) fun getElement (dtd:Dtd) idx = getByIndex(#elDict dtd,idx) fun getGenEnt (dtd:Dtd) idx = getByIndex(#genDict dtd,idx) fun getId (dtd:Dtd) idx = getByIndex(#idDict dtd,idx) fun getNotation (dtd:Dtd) idx = getByIndex(#notDict dtd,idx) fun getParEnt (dtd:Dtd) idx = getByIndex(#parDict dtd,idx) fun hasNotation (dtd:Dtd) idx = isSome(getByIndex(#notDict dtd,idx)) fun setElement (dtd:Dtd) (idx,el) = setByIndex(#elDict dtd,idx,el) fun setGenEnt (dtd:Dtd) (idx,ge) = setByIndex(#genDict dtd,idx,ge) fun setId (dtd:Dtd) (idx,a) = setByIndex(#idDict dtd,idx,a) fun setNotation (dtd:Dtd) (idx,nt) = setByIndex(#notDict dtd,idx,SOME nt) fun setParEnt (dtd:Dtd) (idx,pe) = setByIndex(#parDict dtd,idx,pe) fun maxUsedElem (dtd:Dtd) = usedIndices(#elDict dtd)-1 fun maxUsedGen (dtd:Dtd) = usedIndices(#genDict dtd)-1 fun maxUsedId (dtd:Dtd) = usedIndices(#idDict dtd)-1 (*--------------------------------------------------------------------*) (* initialize the attribute tables. Make sure that indices 0...3 are *) (* assigned to "default", "preserve", "xml:lang" and "xml:space". *) (*--------------------------------------------------------------------*) fun initAttNotTable (dtd as {idDict,notDict,...}:Dtd) = let val _ = clearDict(notDict,SOME(!O_TS_ATT_NOT)) val _ = clearDict(idDict,SOME(!O_TS_ID)) val _ = AttNot2Index dtd default val _ = AttNot2Index dtd preserve val _ = AttNot2Index dtd xmlLang val _ = AttNot2Index dtd xmlSpace in () end fun initElementTable (dtd:Dtd) = clearDict(#elDict dtd,SOME(!O_TS_ELEM)) (*--------------------------------------------------------------------*) (* reserve 0 for gen entity -, i.e., the document entity. *) (* reserve 1 for gen entity amp, i.e., "&#38;" *) (* reserve 2 for gen entity lt, i.e., "&#60;" *) (* reserve 3 for gen entity gt, i.e., ">" *) (* reserve 4 for gen entity apos, i.e., "'" *) (* reserve 5 for gen entity quot, i.e., """ *) (* reserve 0 for par entity -, i.e., the external dtd subset. *) (* *) (* Cf. 4.1: *) (* *) (* ... except that well-formed documents need not declare any of *) (* the following entities: amp, lt, gt, apos, quot. *) (* *) (* and 4.6: *) (* *) (* *) (* *) (* *) (* *) (* *) (*--------------------------------------------------------------------*) fun initEntityTables (dtd as {genDict,parDict,preRedef,...}:Dtd) = let val _ = clearDict(genDict,SOME(!O_TS_GEN_ENT)) val _ = clearDict(parDict,SOME(!O_TS_PAR_ENT)) val _ = map (fn i => Array.update(preRedef,i,false)) [1,2,3,4,5] val _ = GenEnt2Index dtd [0wx2D] (* "-" *) val _ = ParEnt2Index dtd [0wx2D] (* "-" *) val _ = Vector.appi (fn (_,(name,lit,cs)) => (setGenEnt dtd (GenEnt2Index dtd name,(GE_INTERN(lit,cs),false)))) (predefined,1,NONE) in () end fun initDtdTables() = let val dtd = newDtd() val _ = initAttNotTable dtd val _ = initElementTable dtd val _ = initEntityTables dtd val _ = initStandalone dtd in dtd end local val dtd = initDtdTables() in val defaultIdx = AttNot2Index dtd default val preserveIdx = AttNot2Index dtd preserve val xmlLangIdx = AttNot2Index dtd xmlLang val xmlSpaceIdx = AttNot2Index dtd xmlSpace val xmlSpaceType = AT_GROUP (IntLists.addIntList (preserveIdx,[defaultIdx])) end fun printAttNotTable (dtd:Dtd) = printDict NotationInfo2String (#notDict dtd) fun printElementTable dtd = printDict (ElemInfo2xString (UniChar.Data2String o (Index2AttNot dtd), UniChar.Data2String o (Index2Element dtd), UniChar.Data2String o (Index2GenEnt dtd), UniChar.Data2String o (Index2Id dtd), UniChar.Data2String o (Index2AttNot dtd))) (#elDict dtd) fun printGenEntTable dtd = printDict (fn (ent,ext) => GenEntity2xString (Data2String o (Index2AttNot dtd)) ent ^(if ext then "[external]" else "")) (#genDict dtd) fun printIdTable (dtd:Dtd) = printDict (IdInfo2String) (#idDict dtd) fun printParEntTable (dtd:Dtd) = printDict (fn (ent,ext) => ParEntity2String ent ^(if ext then "[external]" else "")) (#parDict dtd) fun printDtdTables dtd = (printAttNotTable dtd; printElementTable dtd; printGenEntTable dtd; printIdTable dtd; printParEntTable dtd) end (* stop of ../../Parser/Params/dtd.sml *) (* start of ../../Parser/Params/hookData.sml *) structure HookData = struct type StartEnd = Errors.Position * Errors.Position (*--------------------------------------------------------------------*) (* a text declaration consists of a version info and an encoding decl.*) (* an xml declaration has an additional standalone decl. *) (*--------------------------------------------------------------------*) type TextDecl = string option * string option type XmlDecl = string option * string option * bool option type XmlInfo = Uri.Uri * Encoding.Encoding * XmlDecl option type ExtSubsetInfo = Uri.Uri * Encoding.Encoding * TextDecl option type SubsetInfo = Errors.Position type EndDtdInfo = Errors.Position type ErrorInfo = Errors.Position * Errors.Error type WarningInfo = Errors.Position * Errors.Warning type NoFileInfo = string * string type CommentInfo = StartEnd * UniChar.Vector type ProcInstInfo = StartEnd * UniChar.Data * Errors.Position * UniChar.Vector type DtdInfo = int * Base.ExternalId option datatype AttPresent = AP_IMPLIED | AP_MISSING | AP_DEFAULT of UniChar.Vector * UniChar.Vector * Base.AttValue option | AP_PRESENT of UniChar.Vector * UniChar.Vector * Base.AttValue option type AttSpec = int * AttPresent * (UniChar.Data * UniChar.Data) option type AttSpecList = AttSpec list type EndTagInfo = StartEnd * int * (int * UniChar.Data) option type StartTagInfo = StartEnd * int * AttSpecList * UniChar.Data * bool type WhiteInfo = UniChar.Vector type CDataInfo = StartEnd * UniChar.Vector type DataInfo = StartEnd * UniChar.Vector * bool type CharRefInfo = StartEnd * UniChar.Char * UniChar.Vector type GenRefInfo = StartEnd * int * Base.GenEntity * bool type ParRefInfo = StartEnd * int * Base.ParEntity * bool type EntEndInfo = Errors.Position datatype MarkupDecl = DEC_ATTLIST of int * (int * Base.AttType * Base.AttDefault) list * bool | DEC_ELEMENT of int * Base.ContentSpec * bool | DEC_GEN_ENT of int * Base.GenEntity * bool | DEC_PAR_ENT of int * Base.ParEntity * bool | DEC_NOTATION of int * Base.ExternalId * bool type DeclInfo = StartEnd * MarkupDecl fun isExtDecl decl = case decl of DEC_ATTLIST(_,_,ext) => ext | DEC_ELEMENT(_,_,ext) => ext | DEC_GEN_ENT(_,_,ext) => ext | DEC_PAR_ENT(_,_,ext) => ext | DEC_NOTATION(_,_,ext) => ext end (* stop of ../../Parser/Params/hookData.sml *) (* start of ../../Parser/Params/hooks.sml *) signature Hooks = sig type AppData type AppFinal val hookXml : AppData * HookData.XmlInfo -> AppData val hookFinish : AppData -> AppFinal val hookError : AppData * HookData.ErrorInfo -> AppData val hookWarning : AppData * HookData.WarningInfo -> AppData val hookProcInst : AppData * HookData.ProcInstInfo -> AppData val hookComment : AppData * HookData.CommentInfo -> AppData val hookWhite : AppData * HookData.WhiteInfo -> AppData val hookDecl : AppData * HookData.DeclInfo -> AppData val hookStartTag : AppData * HookData.StartTagInfo -> AppData val hookEndTag : AppData * HookData.EndTagInfo -> AppData val hookCData : AppData * HookData.CDataInfo -> AppData val hookData : AppData * HookData.DataInfo -> AppData val hookCharRef : AppData * HookData.CharRefInfo -> AppData val hookGenRef : AppData * HookData.GenRefInfo -> AppData val hookParRef : AppData * HookData.ParRefInfo -> AppData val hookEntEnd : AppData * HookData.EntEndInfo -> AppData val hookDocType : AppData * HookData.DtdInfo -> AppData val hookSubset : AppData * HookData.SubsetInfo -> AppData val hookExtSubset : AppData * HookData.ExtSubsetInfo -> AppData val hookEndDtd : AppData * HookData.EndDtdInfo -> AppData end (* stop of ../../Parser/Params/hooks.sml *) (* start of ../../Parser/Params/resolve.sml *) signature Resolve = sig val resolveExtId : Base.ExternalId -> Uri.Uri end structure ResolveNull : Resolve = struct open Base Errors Uri fun resolveExtId (EXTID(_,sys)) = case sys of NONE => raise NoSuchFile ("","Could not generate system identifier") | SOME (base,file,_) => uriJoin(base,file) end (* stop of ../../Parser/Params/resolve.sml *) (* start of ../../Parser/Dfa/dfaUtil.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaUtil *) (* *) (* Depends on: *) (* DfaData *) (* UtilInt *) (* *) (* Exceptions raised by functions in this structure: *) (* boundsFollow : none *) (* cmSymbols : none *) (* makeRow : none *) (* mergeFirst : ConflictFirst *) (* mergeFollow : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaUtil = sig val mergeFirst : bool -> DfaBase.First * DfaBase.First -> DfaBase.First val mergeFollow : bool -> DfaBase.Follow * DfaBase.Follow -> DfaBase.Follow val boundsFollow : DfaBase.Follow -> DfaBase.Sigma * DfaBase.Sigma val cmSymbols : DfaBase.ContentModel -> DfaBase.Sigma list val makeRow : DfaBase.Follow * bool -> DfaBase.Row end structure DfaUtil : DfaUtil = struct open UtilInt DfaBase (*--------------------------------------------------------------------*) (* merge two First sets, raise ConflictFirst at conflict: there may *) (* not be two entries (q1,a) and (q2,a) in the same First set, if *) (* nondet is false. *) (*--------------------------------------------------------------------*) fun mergeFirst nondet ll = let fun go_det (nil,l) = l | go_det (l,nil) = l | go_det (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_det(r1,l2) | GREATER => x2::go_det(l1,r2) | EQUAL => raise ConflictFirst(a1,q1,q2) fun go_nondet (nil,l) = l | go_nondet (l,nil) = l | go_nondet (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => case Int.compare(q1,q2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => go_nondet(l1,r2) in if nondet then go_nondet ll else go_det ll end (*--------------------------------------------------------------------*) (* merge two Follow sets, raise ConflictFollow at conflict. there may *) (* not be two entries (q1,a) and (q2,a) with q1<>q2 in the same Follow*) (* set, if nondet is false. Note that, e.g. for (a+)+, Follow(a) = *) (* Follow(a+) U First(a+), so duplicate occurrences of the same (q,a) *) (* are possible (as opposed to First). *) (*--------------------------------------------------------------------*) fun mergeFollow nondet ll = let fun go_det (nil,l) = l | go_det (l,nil) = l | go_det (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_det(r1,l2) | GREATER => x2::go_det(l1,r2) | EQUAL => if q1=q2 then go_det(l1,r2) else raise ConflictFollow(a1,q1,q2) fun go_nondet (nil,l) = l | go_nondet (l,nil) = l | go_nondet (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => case Int.compare(q1,q2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => go_nondet(l1,r2) in if nondet then go_nondet ll else go_det ll end (*--------------------------------------------------------------------*) (* what are the least and largest symbol occurring in a Follow set? *) (*--------------------------------------------------------------------*) fun boundsFollow (nil:Follow) = (1,0) | boundsFollow [(q,a)] = (a,a) | boundsFollow ((q,a)::xs) = (a,#2(List.last xs)) (*--------------------------------------------------------------------*) (* return the list of all symbols occurring in a content model. *) (*--------------------------------------------------------------------*) fun cmSymbols cm = let fun do_cm(cm,yet) = case cm of CM_ELEM a => insertInt(a,yet) | CM_OPT cm => do_cm(cm,yet) | CM_REP cm => do_cm(cm,yet) | CM_PLUS cm => do_cm(cm,yet) | CM_ALT cms => foldr do_cm yet cms | CM_SEQ cms => foldr do_cm yet cms in do_cm(cm,nil) end (*--------------------------------------------------------------------*) (* given the follow set and the final flag, make a row in the dfa. *) (*--------------------------------------------------------------------*) fun makeRow (flw,fin) = let val (lo,hi) = boundsFollow flw val tab = Array.array(hi-lo+1,dfaError) val _ = app (fn (q,a) => Array.update (tab,a-lo,q)) flw in (lo,hi,Array.extract (tab,0,NONE),fin) end end (* stop of ../../Parser/Dfa/dfaUtil.sml *) (* start of ../../Util/intSets.sml *) signature IntSets = sig eqtype IntSet val emptyIntSet : IntSet val singleIntSet : int -> IntSet val fullIntSet : int -> IntSet val isEmptyIntSet : IntSet -> bool val inIntSet : int * IntSet -> bool val compareIntSets: IntSet * IntSet -> order val hashIntSet : IntSet -> word val addIntSet : int * IntSet -> IntSet val delIntSet : int * IntSet -> IntSet val cupIntSets : IntSet * IntSet -> IntSet val capIntSets : IntSet * IntSet -> IntSet val diffIntSets : IntSet * IntSet -> IntSet val IntSet2List : IntSet -> int list val IntList2Set : int list -> IntSet end structure IntSets : IntSets = struct structure W = Word32 val wordSize = W.wordSize type IntSet = W.word vector infix 7 << >> infix 6 && infix 5 || val op >> = W.>> val op << = W.<< val op && = W.andb val op || = W.orb val !! = W.notb fun normalize (vec:IntSet) = let val max = Vector.foldli (fn (i,w,max) => if w=0wx0 then i else max) 0 (vec,0,NONE) in Vector.extract (vec,0,SOME max) end val emptyIntSet = Vector.fromList nil : IntSet fun fullIntSet n = let val size = (n+wordSize-1) div wordSize val full = 0w0-0w1:W.word val bits = (n-1) mod wordSize+1 val last = full >> (Word.fromInt (wordSize-bits)) in Vector.tabulate(n div wordSize+1, fn i => if i if i=idx then mask else 0w0):IntSet end fun isEmptyIntSet vec = Vector.length vec=0 fun inIntSet(n,vec) = let val idx = n div wordSize in if idx>=Vector.length vec then false else let val mask = 0w1 << (Word.fromInt (n mod wordSize)) in Vector.sub(vec,idx) && mask <> 0w0 end end fun addIntSet(n,vec) = let val idx = n div wordSize val mask = 0w1 << (Word.fromInt (n mod wordSize)) val size = Vector.length vec in if size>idx then Vector.mapi (fn (i,x) => if i=idx then x||mask else x) (vec,0,NONE) else Vector.tabulate (idx+1,fn i => if i if i=idx then x && mask else x) (vec,0,NONE) end in normalize vec1 end fun capIntSets(vec1,vec2) = let val l12 = Int.min(Vector.length vec1,Vector.length vec2) val v12 = Vector.tabulate(l12,fn i => Vector.sub(vec1,i) && Vector.sub(vec2,i)) in normalize v12 end fun cupIntSets(vec1,vec2) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val (shorter,longer,v) = if l1<=l2 then (l1,l2,vec2) else (l2,l1,vec1) in Vector.tabulate (longer,fn i => if i>=shorter then Vector.sub(v,i) else Vector.sub(vec1,i) || Vector.sub(vec2,i)) end fun diffIntSets(vec1,vec2) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val vec1 = Vector.tabulate (l1,fn i => if i>=l2 then Vector.sub(vec1,i) else Vector.sub(vec1,i) && !!(Vector.sub(vec2,i))) in normalize vec1 end fun IntList2Set l = List.foldl addIntSet emptyIntSet l fun IntSet2List vec = let val size = Vector.length vec fun doOne (w,off,yet) = let fun doit (i,mask) = if i=wordSize then yet else if w&&mask=0w0 then doit(i+1,mask<<0wx1) else (off+i)::doit(i+1,mask<<0wx1) in doit(0,0wx1) end fun doAll i = if i>=size then nil else doOne(Vector.sub(vec,i),wordSize*i,(doAll (i+1))) in doAll 0 end fun compareIntSets (vec1,vec2:IntSet) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val (l12,ifEq) = case Int.compare(l1,l2) of LESS => (l1,LESS) | order => (l2,order) fun doit i = if i>=l12 then ifEq else case W.compare(Vector.sub(vec1,i),Vector.sub(vec2,i)) of EQUAL => doit (i+1) | order => order in doit 0 end val intShift = case Int.precision of NONE => 0w0 | SOME x => Word.fromInt(Int.max(wordSize-x+1,0)) fun hashIntSet vec = case Vector.length vec of 0 => 0w0 | 1 => Word.fromInt(W.toInt(W.>>(Vector.sub(vec,0),intShift))) | l => Word.fromInt(W.toInt(W.>>(Vector.sub(vec,0)+Vector.sub(vec,l-1),intShift))) end (* stop of ../../Util/intSets.sml *) (* start of ../../Util/SymDict/intSetDict.sml *) structure KeyIntSet : Key = struct open IntSets UtilString type Key = IntSet val null = emptyIntSet val hash = hashIntSet val compare = compareIntSets val toString = (List2xString ("{",",","}") Int2String) o IntSet2List end structure IntSetDict = Dict (structure Key = KeyIntSet) structure IntSetSymTab = SymTable (structure Key = KeyIntSet) (* stop of ../../Util/SymDict/intSetDict.sml *) (* start of ../../Parser/Dfa/dfaPassThree.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassThree *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* IntSets *) (* IntSetDict *) (* ParseOptions *) (* *) (* Exceptions raised by functions in this structure: *) (* passThree : TooLarge *) (*--------------------------------------------------------------------------*) signature DfaPassThree = sig val passThree: bool -> (DfaBase.Follow * bool) vector -> DfaBase.Dfa end functor DfaPassThree (structure DfaOptions : DfaOptions) : DfaPassThree = struct open IntSets IntSetDict DfaBase DfaOptions DfaUtil (*--------------------------------------------------------------------*) (* do the subset construction. *) (*--------------------------------------------------------------------*) (* given an automaton (Q,q0,F,delta), the subset automaton is *) (* (Q',q0',F',delta') with: *) (* - Q' = 2^Q *) (* - q0'= {q0} *) (* - F' = {S | S cap F <> empty} *) (* - delta'(S,a) = {p | (q,a,p) in delta, q in S} *) (*--------------------------------------------------------------------*) fun makeDet tab = let (* the new start state is the singleton of the old start state *) val sNull = singleIntSet 0 (* create a dictionary for the subsets, make sNull get index 0 *) val tau = makeDict("",!O_DFA_INITIAL_WIDTH,(nil:Follow,false)) val pInitial = getIndex(tau,sNull) (* enter a new set state. raise DfaTooLarge if the new state *) (* would have a too large index *) fun makeState s = let val (max,i) = (!O_DFA_MAX_STATES,getIndex(tau,s)) in if max>i then i else raise DfaTooLarge max end (* compute the follow set for a set state from the follow sets *) (* of its members *) fun makeFollow NONE nil = nil | makeFollow (SOME(s,a)) nil = [(makeState s,a)] | makeFollow NONE ((q,a)::qas) = makeFollow (SOME(singleIntSet q,a)) qas | makeFollow (SOME(s,a)) ((q,b)::qas) = if a=b then makeFollow (SOME(addIntSet(q,s),a)) qas else (makeState s,a)::makeFollow (SOME(singleIntSet q,b)) qas (* continue until all entries in the state dictionary are done -*) fun doit i = if i>=usedIndices tau then i else let val sI = getKey(tau,i) val lI = IntSet2List sI val ffs = map (fn j => Vector.sub(tab,j)) lI val (followJs,finI) = foldl (fn ((flwJ,finJ),(flw,fin)) => (mergeFollow true (flwJ,flw), finJ orelse fin)) (nil,false) ffs val followI = makeFollow NONE followJs val _ = setByIndex(tau,i,(followI,finI)) in doit (i+1) end val size = doit 0 in (* finally create a vector holding the new follow/fin pairs *) Vector.tabulate (size,fn i => getByIndex(tau,i)) end (*--------------------------------------------------------------------*) (* given a vector of Follow and boolean final condition, make a dfa *) (* out of it. if the first arg is true, then the content model was *) (* ambiguous; in this case we must first apply a subset construction *) (* in order to obtain a deterministic finite machine. *) (*--------------------------------------------------------------------*) fun passThree nondet tab = let val det = if nondet then makeDet tab else tab in Vector.map makeRow det end end (* stop of ../../Parser/Dfa/dfaPassThree.sml *) (* start of ../../Parser/Dfa/dfaError.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaError *) (* *) (* Note: *) (* The function in this structure is for producing good error messages *) (* for ambiguous content models. It numbers the nodes of a cm exactly *) (* like passOne does, but counts the occurrences of symbol a in order to *) (* indicate which are in conflict. It is only executed in case of error. *) (* *) (* Depends on: *) (* DfaData *) (* *) (* Exceptions raised by functions in this structure: *) (* countOccs : none *) (*--------------------------------------------------------------------------*) signature DfaError = sig val countOccs : DfaBase.Sigma * DfaBase.State * DfaBase.State -> DfaBase.ContentModel -> DfaBase.Sigma * int * int end structure DfaError : DfaError = struct open DfaBase fun countOccs (a,q1,q2) cm = let val (q1,q2) = if q1>q2 then (q2,q1) else (q1,q2) fun next a nil = (1,[(a,2)]) | next a ((b,n)::rest) = if a=b then (n,(b,n+1)::rest) else if a insert a yet | CM_OPT cmi => doit (cmi,yet) | CM_REP cmi => doit (cmi,yet) | CM_PLUS cmi => doit (cmi,yet) | CM_ALT cmis => foldl doit yet cmis | CM_SEQ cmis => foldl doit yet cmis val (_,_,n1,n2) = doit (cm,(1,nil,0,0)) in (a,n1,n2) end end (* stop of ../../Parser/Dfa/dfaError.sml *) (* start of ../../Parser/Dfa/dfaPassOne.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassOne *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* passOne : ConflictFirst *) (*--------------------------------------------------------------------------*) signature DfaPassOne = sig val passOne : bool -> DfaBase.ContentModel -> DfaBase.CM end structure DfaPassOne : DfaPassOne = struct open DfaBase DfaUtil (*--------------------------------------------------------------------*) (* Given a content model, number the leafs, compute Empty and First *) (* for each node, and construct a corresponding CM annotated with *) (* these informations. *) (* *) (* Numbering: *) (* The leafs are numbered in left-to-right, depth-first order, *) (* starting with 1 (0 will be the start state of the DFA). *) (* *) (* Empty a = false *) (* Empty e? = Empty e* = true *) (* Empty e+ = Empty e *) (* Empty e1|...|eN = Empty e1 \/ ... \/ Empty eN *) (* Empty e1,...,eN = Empty e1 /\ ... /\ Empty eN *) (* *) (* First a = {q,a}, where q is the number of this leaf. *) (* First e? = First e* = First e+ = First e *) (* First e1|...|eN = First e1 ++ ... ++ First eN *) (* First e1,...,eN = ++{First eI | Empty eJ=False forall ja1 forall (q1,a1) in F1, (q1,a1) in F1} *) (* error, if exist (q1,a) in F1, (q2,a) in F2 *) (* then raise ConflictFirst(a,q1,q2) *) (*--------------------------------------------------------------------*) fun passOne nondet cm = let fun und(a,b) = a andalso b fun oder(a,b) = a orelse b fun op_fst_seq (fst,fsts,mt) = if mt then mergeFirst nondet (fst,fsts) else fst fun op_fst_or (fst,fsts,_) = mergeFirst nondet (fst,fsts) fun do_cm cm q = case cm of CM_ELEM a => (ELEM a,(q+1,false,[(q+1,a)])) | CM_OPT cm => let val cmi as (_,(q1,_,fst)) = do_cm cm q in (OPT cmi,(q1,true,fst)) end | CM_REP cm => let val cmi as (_,(q1,_,fst)) = do_cm cm q in (REP cmi,(q1,true,fst)) end | CM_PLUS cm => let val cmi as (_,info1) = do_cm cm q in (PLUS cmi,info1) end | CM_ALT cms => do_cms (ALT,false,oder,op_fst_or) cms q | CM_SEQ cms => do_cms (SEQ,true,und,op_fst_seq) cms q and do_cms(con,null_mt,op_mt,op_fst) cms q = let fun doit [] q = ([],(q,null_mt,[])) | doit (cm::cms) q = let val cmi as (_,(q1,mt1,fst1)) = do_cm cm q val (cmis,(q2,mt2,fst2)) = doit cms q1 in (cmi::cmis,(q2,op_mt(mt1,mt2),op_fst(fst1,fst2,mt1))) end val (cmis,info1) = doit cms q in (con cmis,info1) end in do_cm cm 0 end end (* stop of ../../Parser/Dfa/dfaPassOne.sml *) (* start of ../../Parser/Dfa/dfaPassTwo.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassTwo *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* passTwo : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaPassTwo = sig val passTwo: bool -> DfaBase.CM -> (DfaBase.Follow * bool) vector end structure DfaPassTwo : DfaPassTwo = struct open DfaBase DfaUtil (*--------------------------------------------------------------------*) (* Given a CM annotated with leaf numbers (states), Empty and First, *) (* compute Follow and Fin foreach node, and generate the transition *) (* row if node is a leaf. Follow and Fin are computed top-down: *) (* *) (* (Top-Level): *) (* Follow e = {}, Fin e = true *) (* *) (* (e=e1?): *) (* Follow e1 = Follow e, Fin e1 = Fin e *) (* *) (* (e=e1*, e=e1+) *) (* Follow e1 = Follow e1 ++ First e1, Fin e1 = Fin e *) (* *) (* (e=e1|...|eN) = *) (* Follow eI = Follow e, Fin eI = Fin e for i=0...n *) (* *) (* (e=e1,...,eN) = *) (* Follow eN = Follow e, Fin eN = Fin e *) (* Follow eI = First eI+1, if Empty eI+1 = false, ia1 forall (q1,a1) in F1, (q1,a1) in F1} *) (* error, if exist (q1,a) in F1, (q2,a) in F2 *) (* then raise ConflictFirst(a,q1,q2) *) (*--------------------------------------------------------------------*) fun passTwo nondet (cmi as (_,(n,mt,fst))) = let val table = Array.array(n+1,(nil,false)) val _ = Array.update(table,0,(fst,mt)) fun do_cm (ff as (flw,fin)) (cm,(q,mt,fst)) = case cm of ELEM a => Array.update(table,q,ff) | OPT cmi => do_cm ff cmi | REP cmi => do_cm (mergeFollow nondet (fst,flw),fin) cmi | PLUS cmi => do_cm (mergeFollow nondet (fst,flw),fin) cmi | ALT cmis => app (do_cm ff) cmis | SEQ cmis => ignore (do_seq ff cmis) and do_seq ff cmis = foldr (fn (cmi as (_,(_,mt,fst)),ff as (flw,fin)) => (do_cm ff cmi; if mt then (mergeFollow nondet (fst,flw),fin) else (fst,false))) ff cmis val _ = do_cm (nil,true) cmi in Array.extract (table,0,NONE) end end (* stop of ../../Parser/Dfa/dfaPassTwo.sml *) (* start of ../../Parser/Dfa/dfa.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dfa *) (* *) (* Depends on: *) (* DfaData *) (* DfaError *) (* DfaPassOne *) (* DfaPassTwo *) (* DfaString *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* ContentModel2String : none *) (* dfaFinal : none *) (* dfaTrans : none *) (* makeAmbiguous : DfaTooLarge *) (* makeChoiceDfa : none *) (* makeDfa : Ambiguous *) (* Dfa2String : none *) (*--------------------------------------------------------------------------*) signature Dfa = sig eqtype DfaState val dfaError : DfaState val dfaInitial : DfaState exception DfaTooLarge of int exception Ambiguous of int * int * int val emptyDfa : DfaData.Dfa val makeDfa : DfaData.ContentModel -> DfaData.Dfa val makeAmbiguous : DfaData.ContentModel -> DfaData.Dfa val makeChoiceDfa : DfaData.ContentModel -> DfaData.Dfa val dfaFinal : DfaData.Dfa * DfaState -> bool val dfaTrans : DfaData.Dfa * DfaState * int -> DfaState end functor Dfa (structure DfaOptions : DfaOptions) : Dfa = struct structure DfaPassThree = DfaPassThree (structure DfaOptions = DfaOptions) open DfaBase DfaError DfaPassOne DfaPassTwo DfaString DfaUtil type DfaState = State (*--------------------------------------------------------------------*) (* Create a dfa for the content model (a1|...|aN)*, where a1,...,aN *) (* are the symbols occurring in the input dfa. *) (*--------------------------------------------------------------------*) fun makeChoiceDfa cm = let val syms = cmSymbols cm val flw = map (fn a => (dfaInitial,a)) syms in Vector.fromList [makeRow(flw,true)] end (*--------------------------------------------------------------------*) (* create a dfa for an ambiguous content model. Raise DfaTooLarge if *) (* the subset construction yields too many states. *) (*--------------------------------------------------------------------*) fun makeAmbiguous cm = let val cmi = DfaPassOne.passOne true cm val tab = DfaPassTwo.passTwo true cmi val dfa = DfaPassThree.passThree true tab in dfa end (*--------------------------------------------------------------------*) (* generate a dfa for a content model. Raise Ambiguous if the content *) (* model is ambiguous. *) (*--------------------------------------------------------------------*) fun makeDfa cm = let val cmi = DfaPassOne.passOne false cm val tab = DfaPassTwo.passTwo false cmi val dfa = DfaPassThree.passThree false tab in dfa end handle ConflictFirst aqq => raise Ambiguous (countOccs aqq cm) | ConflictFollow aqq => raise Ambiguous (countOccs aqq cm) (*--------------------------------------------------------------------*) (* make one transitions in the dfa. *) (*--------------------------------------------------------------------*) fun dfaTrans(tab,q,a) = if q<0 then dfaDontCare else let val (lo,hi,tab,_) = Vector.sub(tab,q) in if a>=lo andalso a<=hi then Vector.sub(tab,a-lo) else dfaError end (*--------------------------------------------------------------------*) (* check whether a dfa's state is an accepting state. *) (*--------------------------------------------------------------------*) fun dfaFinal (tab,q) = q<0 orelse #4(Vector.sub(tab,q):Row) end (* stop of ../../Parser/Dfa/dfa.sml *) (* start of ../../Parser/entities.sml *) (*--------------------------------------------------------------------------*) (* Structure: Entities *) (* *) (* Exceptions raised by functions in this structure: *) (* closeAll : none *) (* getChar : none *) (* getEntId : none *) (* getPos : none *) (* inInternalSubset : none *) (* isOpenEntity : none *) (* isSpecialEnd : none *) (* Position2String : none *) (* pushDummy : none *) (* pushExtern : NoSuchFile *) (* pushIntern : none *) (* pushSpecial : NoSuchFile *) (* statePos : none *) (*--------------------------------------------------------------------------*) (* This module maintains the entity stack. For each open entity it holds a *) (* buffer to read characters from. When the buffer is exceeded, it gets re- *) (* filled with new characters, depending on the entity's encoding. *) (* *) (* End-of-line handling as specified in 2.11 is performed: *) (* *) (* ... To simplify the tasks of applications, wherever an external parsed *) (* entity or the literal entity value of an internal parsed entity *) (* contains either the literal two-character sequence "#xD#xA" or a *) (* standalone literal #xD, an XML processor must pass to the application *) (* the single character #xA. *) (* (This behavior can conveniently be produced by normalizing all line *) (* breaks to #xA on input, before parsing.) *) (* *) (* It also checks for illegal characters, cf. 2.2: *) (* *) (* [2] Char ::= #x9 | #xA | #xD /* any Unicode character, *) (* | [#x20-#xD7FF] excluding the surrogate *) (* | [#xE000-#xFFFD] blocks, FFFE, and FFFF. */ *) (* | [#x10000-#x10FFFF] *) (* *) (* More precisely, it assumes that all decoded characters are valid Unicode *) (* characters. It thus only checks for control characters other than #x9, *) (* #xA or #xD. *) (*--------------------------------------------------------------------------*) signature Entities = sig include Hooks type State eqtype EntId datatype Special = DOC_ENTITY | EXT_SUBSET exception CantOpenFile of (string * string) * AppData val pushIntern : State * int * bool * UniChar.Vector -> State val pushExtern : State * int * bool * Uri.Uri -> State * Encoding.Encoding val pushSpecial : Special * Uri.Uri option -> State * Encoding.Encoding val closeAll : State -> unit val commitAuto : AppData * State -> AppData * State val changeAuto : AppData * State * string -> AppData * State * Encoding.Encoding val getEntId : State -> EntId val getPos : State -> Errors.Position val getUri : State -> Uri.Uri val getChar : AppData * State -> UniChar.Char * AppData * State val ungetChars : State * UniChar.Data -> State val isOpen : int * bool * State -> bool val isSpecial : State -> bool val inDocEntity : State -> bool end functor Entities (structure Hooks : Hooks) : Entities = struct open UniChar Decode Decode.Error Errors Hooks Uri UtilError val THIS_MODULE = "Entities" val BUFSIZE = 1024 type CharBuffer = UniChar.Char array (*--------------------------------------------------------------------*) (* A special entity can not be popped from the stack by getChar, so *) (* it must be popped explicitly. This is for the document entity and *) (* the external subset. *) (*--------------------------------------------------------------------*) datatype Special = DOC_ENTITY | EXT_SUBSET (*--------------------------------------------------------------------*) (* In order to distinguish a general entity from a paramter entity, *) (* entity idxs are marked with this datatype. *) (*--------------------------------------------------------------------*) datatype EntId = GENERAL of int | PARAMETER of int (*--------------------------------------------------------------------*) (* Make an EntId from the entity's index. *) (*--------------------------------------------------------------------*) fun makeEntId(idx,isParam) = if isParam then PARAMETER idx else GENERAL idx (*--------------------------------------------------------------------*) (* A non-empty stack is: *) (* *) (* an internal entity INT(buf,size,idx,(id,other)): *) (* - (vec,idx,size) is a buffer,current index and its size; *) (* - id is the index of the entity's name in the entity table. *) (* - other contains the underlying entities (the rest of the stack). *) (* The components are nested according to access frequency. *) (* *) (* an external entity has three forms: *) (* EXT2(buf,size,idx,line,col,break,(dec,err,typ)) *) (* - (buf,size,idx) is a buffer, its size and current index; *) (* - (line,col) are the line and column; *) (* - break is a boolean indicating whether the last character was a *) (* carriage return (0xD) (then a succeeding line feed (0xA) must be *) (* supressed); *) (* - err is an option: if it is SOME(f,ee,err) then it indicates that *) (* the array was finished by a decoding error err, with the basic *) (* file f; f was at end of file if ee is true. Otherwise there was *) (* no error when loading the array. *) (* - dec describies the encoding of the entity and thus, how more *) (* data can be loaded; *) (* - typ is either of the form SPECIAL spec indicating a special *) (* entity; then this is the only entity on the stack. Otherwise it *) (* is NORMAL(id,other) for a normal external entity, with: *) (* + id is the index of the entity's name in the DTD; *) (* + other is the underlying stack. *) (* The components are nested according to access frequency. *) (* *) (* The second form of an external entity is *) (* EXT1(dec,line,col,break,typ). This is an unbuffered *) (* entity whose encoding declaration is being read. We may not load *) (* an array of characters as a whole because the encoding might still *) (* change. The components have the same meaning as for EXT2. *) (* *) (* A closed entity remains on the stack until the next getChar, for *) (* purposes of error printing. A closed external entity has the form *) (* CLOSED(dec,l,col,typ); components have the same meaning *) (* as for open external entities. A closed internal entity has the *) (* form ENDED(id,other) with components as above. *) (* *) (* Sometimes (for parsing xml/decl declarations) we need a lookahead. *) (* LOOKING(cs,q) is a state remembering all chars cs looked ahead up *) (* to state q, in reverse order. LOOKED(cs,q) is an undone lookahead, *) (* the looked-ahead chars now in the right order. *) (*--------------------------------------------------------------------*) datatype ExtType = SPECIAL of Special | NORMAL of EntId * State and State = LOOKED of Data * State | ENDED of EntId * State | CLOSED of DecFile * int * int * ExtType | INT of Vector * int * int * (EntId * State) | EXT1 of DecFile * int * int * bool * ExtType | EXT2 of CharBuffer * int * int * int * int * bool * (DecFile * DecodeError option * ExtType) exception CantOpenFile of (string * string) * AppData (*--------------------------------------------------------------------*) (* Extract the unique number from a state. *) (*--------------------------------------------------------------------*) fun getExtEntId extType = case extType of SPECIAL DOC_ENTITY => GENERAL 0 | SPECIAL EXT_SUBSET => PARAMETER 0 | NORMAL(id,_) => id fun getEntId q = case q of LOOKED (_,q) => getEntId q | ENDED(id,_) => id | CLOSED(_,_,_,extType) => getExtEntId extType | INT(_,_,_,(id,_)) => id | EXT1(_,_,_,_,extType) => getExtEntId extType | EXT2(_,_,_,_,_,_,(_,_,extType)) => getExtEntId extType (*--------------------------------------------------------------------*) (* Find the nearest enclosing external entity, and return its *) (* filename, line and column number. *) (*--------------------------------------------------------------------*) fun getPos q = case q of ENDED(_,other) => getPos other | INT(_,_,_,(_,other)) => getPos other | CLOSED(dec,l,col,_) => (decName dec,l,col) | EXT1(dec,l,col,_,_) => (decName dec,l,col) | EXT2(_,_,_,l,col,_,(dec,_,_)) => (decName dec,l,col) | LOOKED (cs,q) => let val (f,l,c) = getPos q val k = length cs in if c>=k then (f,l,c-k) else (f,l,0) end (*--------------------------------------------------------------------*) (* get the path of the nearest enclosing external entity. *) (*--------------------------------------------------------------------*) fun getUri q = case q of LOOKED (_,q) => getUri q | ENDED(_,other) => getUri other | INT(_,_,_,(_,other)) => getUri other | CLOSED(dec,l,col,_) => decUri dec | EXT1(dec,l,col,_,_) => decUri dec | EXT2(_,_,_,l,col,_,(dec,_,_)) => decUri dec (*--------------------------------------------------------------------*) (* close all files, return nothing. *) (*--------------------------------------------------------------------*) fun closeAll q = case q of LOOKED(_,other) => closeAll other | ENDED(_,other) => closeAll other | CLOSED(_,_,_,SPECIAL _) => () | CLOSED(_,_,_,NORMAL(_,other)) => closeAll other | INT(_,_,_,(_,other)) => closeAll other | EXT1(dec,_,_,_,SPECIAL _) => ignore(decClose dec) | EXT1(dec,_,_,_,NORMAL(_,other)) => (decClose dec; closeAll other) | EXT2(_,_,_,_,_,_,(dec,_,SPECIAL _)) => ignore(decClose dec) | EXT2(_,_,_,_,_,_,(dec,_,NORMAL(_,other))) => (decClose dec; closeAll other) (*--------------------------------------------------------------------*) (* is this entity already on the stack? *) (*--------------------------------------------------------------------*) fun isOpen (idx,isParam,q) = let val id = makeEntId(idx,isParam) fun doit q = case q of LOOKED (_,other) => doit other | ENDED(id',other) => id=id' orelse doit other | CLOSED(_,_,_,SPECIAL _) => false | CLOSED(_,_,_,NORMAL(id',other)) => id=id' orelse doit other | INT(_,_,_,(id',other)) => id=id' orelse doit other | EXT1(_,_,_,_,SPECIAL _) => false | EXT1(_,_,_,_,NORMAL(id',other)) => id=id' orelse doit other | EXT2(_,_,_,_,_,_,(_,_,SPECIAL _)) => false | EXT2(_,_,_,_,_,_,(_,_,NORMAL(id',other))) => id=id' orelse doit other in doit q end (*--------------------------------------------------------------------*) (* are we in the internal subset, i.e., in the document entity? *) (* The internal subset can only be in the document entity, since no *) (* parameter entities are declared prior to it. The document entity *) (* is then the only entity on the stack. *) (*--------------------------------------------------------------------*) fun inDocEntity q = case q of LOOKED (_,q) => inDocEntity q | ENDED(_,other) => inDocEntity other | INT(_,_,_,(_,other)) => inDocEntity other | CLOSED(_,_,_,NORMAL _) => false | CLOSED(_,_,_,SPECIAL what) => what=DOC_ENTITY | EXT1(_,_,_,_,NORMAL _) => false | EXT1(_,_,_,_,SPECIAL what) => what=DOC_ENTITY | EXT2(_,_,_,_,_,_,(_,_,NORMAL _)) => false | EXT2(_,_,_,_,_,_,(_,_,SPECIAL what)) => what=DOC_ENTITY (*--------------------------------------------------------------------*) (* is this state the document end, i.e., are all entities closed? *) (*--------------------------------------------------------------------*) fun isSpecial q = case q of LOOKED (_,q) => isSpecial q | CLOSED(_,_,_,SPECIAL _) => true | EXT1(_,_,_,_,SPECIAL _) => true | EXT2(_,_,_,_,_,_,(_,_,SPECIAL _)) => true | _ => false (*--------------------------------------------------------------------*) (* Initialize and load a new buffer when opening an external entity. *) (*--------------------------------------------------------------------*) fun initArray dec = let val arr = Array.array(BUFSIZE,0wx0) val (n,dec1,err) = decGetArray dec arr in (arr,n,dec1,err) end (*--------------------------------------------------------------------*) (* Open an external/internal entity. *) (*--------------------------------------------------------------------*) fun pushIntern(q,id,isParam,vec) = INT(vec,Vector.length vec,0,(makeEntId(id,isParam),q)) fun pushExtern(q,id,isParam,uri) = let val dec = decOpenXml (SOME uri) val auto = decEncoding dec val q1 = EXT1(dec,1,0,false,NORMAL(makeEntId(id,isParam),q)) in (q1,auto) end fun pushSpecial(what,uri) = let val dec = decOpenXml uri val auto = decEncoding dec val q = EXT1(dec,1,0,false,SPECIAL what) in (q,auto) end (*--------------------------------------------------------------------*) (* confirm the autodetected encoding of an external entity. *) (*--------------------------------------------------------------------*) fun commitAuto(a,q) = case q of EXT1(dec,l,col,brk,typ) => let val a1 = a before decCommit dec handle DecError(_,_,err) => hookError(a,(getPos q,ERR_DECODE_ERROR err)) val (arr,n,dec1,err) = initArray dec in (a1,EXT2(arr,n,0,l,col,brk,(dec1,err,typ))) end (* in (a1,EXT1(dec,l,col,brk,typ)) end *) | LOOKED(cs,q1) => let val (a1,q2) = commitAuto (a,q1) in (a1,LOOKED(cs,q2)) end | CLOSED _ => (a,q) | _ => raise InternalError(THIS_MODULE,"commitAuto", "entity is neither EXT1 nor CLOSED nor LOOKED") (*--------------------------------------------------------------------*) (* change from the autodetected encoding to the declared one. *) (*--------------------------------------------------------------------*) fun changeAuto (a,q,decl) = case q of EXT1(dec,l,col,brk,typ) => let val dec1 = decSwitch(dec,decl) handle DecError(dec,_,err) => let val a1 = hookError(a,(getPos q,ERR_DECODE_ERROR err)) val _ = decClose dec val uri = decName dec val msg = case err of ERR_UNSUPPORTED_ENC _ => "Unsupported encoding" | _ => "Declared encoding incompatible" ^"with auto-detected encoding" in raise CantOpenFile ((uri,msg),a1) end val newEnc = decEncoding dec1 val (arr,n,dec2,err) = initArray dec1 in (a,EXT2(arr,n,0,l,col,brk,(dec2,err,typ)),newEnc) end (* in (a,EXT1(dec1,l,col,brk,typ),newEnc) end *) | LOOKED(cs,q1) => let val (a2,q2,enc2) = changeAuto(a,q1,decl) in (a2,LOOKED(cs,q2),enc2) end | CLOSED(dec,_,_,_) => (a,q,decEncoding dec) | _ => raise InternalError(THIS_MODULE,"changeAuto", "entity is neither EXT1 nor CLOSED nor LOOKED") (*--------------------------------------------------------------------*) (* Get one character from the current entity. Possibly reload buffer. *) (* Return 0wx0 at entity end. Otherwise check whether the character *) (* is valid (cf. 2.2). If the last character was a carriage return *) (* (0xD) supress a line feed (0xA). *) (*--------------------------------------------------------------------*) fun getChar (a,q) = case q of ENDED(_,other) => getChar(a,other) | CLOSED(_,_,_,typ) => (case typ of SPECIAL _ => raise InternalError (THIS_MODULE,"getChar", "attempt to read beyond special entity end") | NORMAL(_,other) => getChar(a,other)) | INT(vec,s,i,io) => if i>=s then (0wx0,a,ENDED io) else (Vector.sub(vec,i),a,INT(vec,s,i+1,io)) | EXT1(dec,l,col,br,typ) => (let val (c,dec1) = decGetChar dec in if (* c>=0wx20 orelse c=0wx09 *) c>=0wx0020 andalso (c<=0wxD7FF orelse c>=0wxE000 andalso (c<=0wxFFFD orelse c>=0wx10000)) orelse c=0wx9 then (c,a,EXT1(dec1,l,col+1,false,typ)) else if c=0wxA then if br then getChar(a,EXT1(dec1,l,col,false,typ)) else (c,a,EXT1(dec1,l+1,0,false,typ)) else (if c=0wxD then (0wxA,a,EXT1(dec1,l+1,0,true,typ)) else let val a1 = hookError(a,(getPos q,ERR_NON_XML_CHAR c)) in getChar(a1,EXT1(dec1,l,col+1,false,typ)) end) end handle DecEof dec => (0wx0,a,CLOSED(dec,l,col,typ)) | DecError(dec,eof,err) => let val err = ERR_DECODE_ERROR err val a1 = hookError(a,(getPos q,err)) in if eof then (0wx0,a,CLOSED(dec,l,col,typ)) else getChar(a1,EXT1(dec,col,l,br,typ)) end) | EXT2(arr,s,i,l,col,br,det) => if i=0wx20 orelse c=0wx09 *) (* c>=0wx0020 andalso c<=0wxD7FF orelse c=0wx9 orelse *) (* c>=0wxE000 andalso c<=0wxFFFD orelse c>=0wx10000 *) c>=0wx0020 andalso (c<=0wxD7FF orelse c>=0wxE000 andalso (c<=0wxFFFD orelse c>=0wx10000)) orelse c=0wx9 then (c,a,EXT2(arr,s,i+1,l,col+1,false,det)) else if c=0wxA then if br then getChar(a,EXT2(arr,s,i+1,l,col,false,det)) else (c,a,EXT2(arr,s,i+1,l+1,0,false,det)) else (if c=0wxD then (0wxA,a,EXT2(arr,s,i+1,l+1,0,true,det)) else let val a1 = hookError(a,(getPos q,ERR_NON_XML_CHAR c)) in getChar(a1,EXT2(arr,s,i+1,l,col+1,false,det)) end) end else let val (dec,err,typ) = det val (a1,(n,dec1,err1)) = case err of NONE => if s=BUFSIZE then (a,decGetArray dec arr) else (a,(0,dec,NONE)) | SOME err => (hookError(a,(getPos q,ERR_DECODE_ERROR err)), decGetArray dec arr) in if n=0 andalso not (isSome err1) then (0wx0,a1,CLOSED(dec1,l,col,typ)) else getChar(a1,EXT2(arr,n,0,l,col,br,(dec1,err1,typ))) end | LOOKED(nil,q) => getChar(a,q) | LOOKED(c::cs,q) => (c,a,LOOKED(cs,q)) (*--------------------------------------------------------------------*) (* unget a list of characters. *) (*--------------------------------------------------------------------*) fun ungetChars (q,cs) = LOOKED(cs,q) end (* stop of ../../Parser/entities.sml *) (* start of ../../Parser/Dtd/dtdDeclare.sml *) (*--------------------------------------------------------------------------*) (* Structure: DtdDeclare *) (* *) (*--------------------------------------------------------------------------*) (* Functor: DtdDeclare *) (*--------------------------------------------------------------------------*) (* This module provides functions for adding declarations to the DTD tables *) (* and for doing checks on components of declarations. *) (*--------------------------------------------------------------------------*) functor DtdDeclare (structure Dtd : Dtd structure Entities : Entities structure ParserOptions : ParserOptions) = struct open UtilInt UtilList Base Dtd Errors Entities ParserOptions UniChar UniClasses (*--------------------------------------------------------------------*) (* check whether a sequence a chars is the b-adic representation of a *) (* character's code, terminated by ";". base will be 10 or 16, isBase *) (* will check for a character being a decimal/hexadecimal number. *) (*--------------------------------------------------------------------*) fun checkBasimal (base,baseValue) (ch:Char,cs) = let fun doit _ (nil:Data) = false | doit yet [0wx3B] = yet=ch | doit yet (c::cs) = case baseValue c of NONE => false | SOME v => doit (base*yet+v) cs in doit 0w0 cs end val checkDecimal = checkBasimal (0w10,decValue) val checkHeximal = checkBasimal (0wx10,hexValue) (*--------------------------------------------------------------------*) (* check a character reference for identifying a character. *) (*--------------------------------------------------------------------*) fun checkRef (ch,0wx26::0wx23::0wx78::cs) (* "&#x..." *) = checkHeximal(ch,cs) | checkRef (ch,0wx26::0wx23::cs) (* "&#..." *) = checkDecimal(ch,cs) | checkRef _ = false (*--------------------------------------------------------------------*) (* check for a single character ch. *) (*--------------------------------------------------------------------*) fun checkSingle (ch,[c]) = c=ch | checkSingle _ = false (*--------------------------------------------------------------------*) (* check a predefined entity for being well defined. Note that both *) (* a single char and a char ref representation are allowed, except *) (* for 'amp' which must be escaped. *) (*--------------------------------------------------------------------*) fun checkPredef (idx,cs) = case idx of 1 => checkRef(0wx26,cs) | 2 => checkSingle(0wx3C,cs) orelse checkRef(0wx3C,cs) | 3 => checkSingle(0wx3E,cs) orelse checkRef(0wx3E,cs) | 4 => checkSingle(0wx27,cs) orelse checkRef(0wx27,cs) | 5 => checkSingle(0wx22,cs) orelse checkRef(0wx22,cs) | _ => true (*--------------------------------------------------------------------*) (* Given the declaration of an entity check whether it is predefined. *) (* If no return false. If yes, check whether is was already declared *) (* and whether it is correctly declared. See 4.6: *) (* *) (* All XML processors must recognize these entities whether they *) (* are declared or not. For interoperability, valid XML documents *) (* should declare these entities, like any others, before using *) (* them. If the entities in question are declared, they must be *) (* declared as internal entities whose replacement text is the *) (* single character being escaped or a character reference to that *) (* character, as shown below. *) (* *) (* *) (* *) (* *) (* *) (* *) (* *) (* Note that the < and & characters in the declarations of "lt" and *) (* "amp" are doubly escaped to meet the requirement that entity *) (* replacement be well-formed. *) (* *) (* print an error if the entity was already declared. *) (* print an error if the declaration is not correct. *) (*--------------------------------------------------------------------*) fun checkPredefined dtd (a,q) (idx,ent) = if !O_VALIDATE andalso idx>=1 andalso idx<=5 then let val a1 = if !O_WARN_MULT_ENT_DECL andalso isRedefined dtd idx then let val warn = WARN_MULT_DECL(IT_GEN_ENT,Index2GenEnt dtd idx) in hookWarning(a,(getPos q,warn)) end else a before setRedefined dtd idx val a2 = if !O_CHECK_PREDEFINED then let val correct = case ent of GE_INTERN(_,rep) => checkPredef (idx,Vector2Data rep) | _ => false in if correct then a1 else let val err = ERR_DECL_PREDEF(Index2GenEnt dtd idx,validPredef idx) in hookError(a1,(getPos q,err)) end end else a1 in (true,a2) end else (false,a) (*--------------------------------------------------------------------*) (* add an entity declaration to the DTD tables. 4.2 *) (* *) (* ... If the same entity is declared more than once, the first *) (* declaration encountered is binding; at user option, an XML *) (* processor may issue a warning if entities are declared multiple *) (* times. *) (* *) (* For general entities, check whether it is a predefined entity and *) (* if so, whether it is declared correctly. *) (*--------------------------------------------------------------------*) (* print a warning and ignore the declaration if the notation was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addGenEnt dtd (a,q) (idx,ent,ext) = case getGenEnt dtd idx of (GE_NULL,_) => a before setGenEnt dtd (idx,(ent,ext)) | _ => let val (pre,a1) = checkPredefined dtd (a,q) (idx,ent) in if pre orelse not (!O_WARN_MULT_ENT_DECL) then a1 else hookWarning(a1,(getPos q,WARN_MULT_DECL (IT_GEN_ENT,Index2GenEnt dtd idx))) end fun addParEnt dtd (a,q) (idx,ent,ext) = case getParEnt dtd idx of (PE_NULL,_) => a before setParEnt dtd (idx,(ent,ext)) | _ => if !O_WARN_MULT_ENT_DECL then hookWarning(a,(getPos q,WARN_MULT_DECL (IT_PAR_ENT,Index2ParEnt dtd idx))) else a (*--------------------------------------------------------------------*) (* at option print a warning if not all predefined entities have been *) (* declared. Cf. 4.1: *) (* *) (* For interoperability, valid documents should declare the *) (* entities amp, lt, gt, apos, quot, in the form specified in *) (* "4.6 Predefined Entities". *) (*--------------------------------------------------------------------*) fun checkPreDefined dtd (a,q) = if !O_VALIDATE andalso !O_INTEROPERABILITY andalso !O_WARN_SHOULD_DECLARE andalso hasDtd dtd then case notRedefined dtd of nil => a | ents => hookWarning(a,(getPos q,WARN_SHOULD_DECLARE ents)) else a (*--------------------------------------------------------------------*) (* add a notation declaration to the DTD tables. *) (* *) (* though the rec. says nothing about repeated notation declarations, *) (* I assume that the intention is to treat them like entities, i.e. *) (* ignore repeated declarations with an optional warning. *) (* *) (* print a warning and ignore the declaration if the notation was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addNotation dtd (a,q) (idx,nt) = if hasNotation dtd idx then if !O_WARN_MULT_NOT_DECL then hookWarning(a,(getPos q,WARN_MULT_DECL (IT_NOTATION,Index2AttNot dtd idx))) else a else a before setNotation dtd (idx,nt) (*--------------------------------------------------------------------*) (* add an element declaration to the element table. Only the content *) (* part of the element info is updated. 3.2: *) (* *) (* Validity Constraint: Unique Element Type Declaration *) (* No element type may be declared more than once. *) (* *) (* print an error and ignore the declaration if the element was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addElement dtd (a,q) (idx,cont,ext) = let val {decl,atts,errAtts,...} = getElement dtd idx in case decl of NONE => a before setElement dtd (idx,{decl = SOME(cont,ext), atts = atts, errAtts = errAtts}) | SOME _ => if !O_VALIDATE then hookError(a,(getPos q,ERR_REDEC_ELEM(Index2Element dtd idx))) else a end (*--------------------------------------------------------------------*) (* at option, pretend an element is declared by adding a default *) (* declaration. Only the decl flag of the element info is updated. *) (*--------------------------------------------------------------------*) fun handleUndeclElement dtd idx = let val {atts,errAtts,...} = getElement dtd idx val newInfo = {decl = SOME(CT_ANY,false), atts = atts, errAtts = errAtts} in newInfo before setElement dtd (idx,newInfo) end (*--------------------------------------------------------------------*) (* check whether an element is declared and whether it already had an *) (* attribute list declaration. Cf. 3.3: *) (* *) (* At user option, an XML processor may issue a warning if *) (* attributes are declared for an element type not itself declared, *) (* but this is not an error. *) (* *) (* ... an XML processor may at user option issue a warning when *) (* more than one attribute-list declaration is provided for a given *) (* element type, ... *) (* *) (* print a warning if the element is not declared or already had an *) (* attribute list declaration. *) (*--------------------------------------------------------------------*) fun enterAttList dtd (a,q) idx = let val {decl,atts,errAtts,...} = getElement dtd idx val a1 = if isSome decl orelse not (!O_WARN_ATT_NO_ELEM) then a else hookWarning(a,(getPos q,WARN_ATT_UNDEC_ELEM(Index2Element dtd idx))) in case atts of NONE => a1 before setElement dtd (idx,{decl=decl,atts=SOME(nil,false),errAtts=errAtts}) | _ => if !O_INTEROPERABILITY andalso !O_WARN_MULT_ATT_DECL then hookWarning(a1,(getPos q,WARN_MULT_ATT_DECL(Index2Element dtd idx))) else a1 end (*--------------------------------------------------------------------*) (* check whether attribute "xml:space" is declared correctly. 2.10: *) (* *) (* A special attribute named xml:space may be attached ... In valid *) (* documents, this attribute, like any other, must be declared if *) (* it is used. When declared, it must be given as an enumerated *) (* type whose only possible values are "default" and "preserve". *) (*--------------------------------------------------------------------*) fun checkAttDef (a,q) (aidx,attType,_,_) = if aidx<>xmlSpaceIdx orelse attType=xmlSpaceType then a else hookError(a,(getPos q,ERR_XML_SPACE)) (*--------------------------------------------------------------------*) (* enter a definition of a single attribute to the element table. *) (* ignore the definition if the attribute is already defined for that *) (* element. Cf. 3.3: *) (* *) (* When more than one AttlistDecl is provided for a given element *) (* type, the contents of all those provided are merged. When more *) (* than one definition is provided for the same attribute of a *) (* given element type, the first declaration is binding and later *) (* declarations are ignored. For interoperability, an XML processor *) (* may at user option issue a warning when ... more than one *) (* attribute definition is provided for a given attribute, but this *) (* is not an error. *) (* *) (* If the attribute type is ID, check whether an element already has *) (* an attribute of that type. 3.3.1: *) (* *) (* Validity Constraint: One ID per Element Type *) (* No element type may have more than one ID attribute specified. *) (*--------------------------------------------------------------------*) (* print an error if the element already has an ID attribute. *) (* print a warning if the attr. is already defined for this element. *) (*--------------------------------------------------------------------*) (* return the new application data. *) (*--------------------------------------------------------------------*) fun addAttribute dtd (a,q) (eidx,attDef as (att,attType,attDefault,_)) = let val a1 = checkAttDef (a,q) attDef fun doit nil = (false,[attDef],a) | doit (atts as (ad as (aidx,_,_,_))::rest) = if aidx=att then let val a1 = if !O_INTEROPERABILITY andalso !O_WARN_MULT_ATT_DEF then let val warn = WARN_MULT_ATT_DEF (Index2Element dtd eidx,Index2AttNot dtd att) in hookWarning(a,(getPos q,warn)) end else a in (true,atts,a1) end else (if aidx (c1=0wx58 orelse c1=0wx78) andalso (c2=0wx4D orelse c2=0wx6D) andalso (c3=0wx4C orelse c3=0wx6C) | _ => false fun checkAttName (a,q) name = if !O_CHECK_RESERVED andalso startsWithXml name then case name of [0wx78,0wx6d,0wx6c,0wx3a,0wx6c,0wx61,0wx6e,0wx67] (* ":lang" *) => a | [0wx78,0wx6d,0wx6c,0wx3a,0wx73,0wx70,0wx61,0wx63,0wx65] (* ":space" *) => a | _ => hookError(a,(getPos q,ERR_RESERVED(name,IT_ATT_NAME))) else a fun checkElemName (a,q) name = if !O_CHECK_RESERVED andalso startsWithXml name then hookError(a,(getPos q,ERR_RESERVED(name,IT_ELEM))) else a (*--------------------------------------------------------------------*) (* check for each element in the dtd, whether a name token occurs *) (* more than once in its enumerated attribute types. *) (* *) (* print a warning for each element where this is true. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkMultEnum dtd (a,q) = if !O_INTEROPERABILITY andalso !O_WARN_MULT_ENUM then let fun doElem a idx = let (*-----------------------------------------------------*) (* for each i, add i to yet if it not in that list. *) (* otherwise add it to dup. *) (*-----------------------------------------------------*) fun do_list yd nil = yd | do_list (yet,dup) (i::is) = let val yd' = case insertNewInt (i,yet) of NONE => (yet,insertInt (i,dup)) | SOME new => (new,dup) in do_list yd' is end (*-----------------------------------------------------*) (* For each enumerated attribute type call the appro- *) (* priate function. *) (*-----------------------------------------------------*) fun doit (yet,dup) nil = dup | doit (yet,dup) ((_,attType,_,_)::rest) = case attType of AT_GROUP is => doit (do_list (yet,dup) is) rest | AT_NOTATION is => doit (do_list (yet,dup) is) rest | _ => doit (yet,dup) rest val defs = case #atts(getElement dtd idx) of NONE => nil | SOME(defs,_) => defs val dup = doit (nil,nil) defs in if null dup then a else hookWarning(a,(getPos q,WARN_ENUM_ATTS (Index2Element dtd idx,map (Index2AttNot dtd) dup))) end (*-----------------------------------------------------------*) (* the highest used index is usedIndices-1. *) (*-----------------------------------------------------------*) val maxIdx = maxUsedElem dtd fun doit a i = if i>maxIdx then a else doit (doElem a i) (i+1) in doit a 0 end else a (*--------------------------------------------------------------------*) (* check for all id names refereneced by some IDREF attribute whether *) (* it was also declared by an ID attribute. *) (* *) (* print an error if a referenced ID name was not defined. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkDefinedIds dtd (a,q) = if !O_VALIDATE then let val maxId = maxUsedId dtd fun doOne a i = let val (decl,refs) = getId dtd i in if decl orelse null refs then a else hookError(a,(hd refs,ERR_UNDECL_ID(Index2Id dtd i,tl refs))) end fun doAll a i = if i>maxId then a else doAll (doOne a i) (i+1) in doAll a 0 end else a (*--------------------------------------------------------------------*) (* check for all declared unparsed entities, whether their notations *) (* have been declared. *) (* *) (* print an error if a notation was not declared. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkUnparsed dtd a = if !O_VALIDATE then let val maxGen = maxUsedGen dtd fun doOne a i = case getGenEnt dtd i of (GE_UNPARSED(_,nidx,pos),_) => if hasNotation dtd nidx then a else hookError(a,(pos,ERR_UNDECLARED (IT_NOTATION,Index2AttNot dtd nidx,LOC_NONE))) | _ => a fun doAll a i = if i>maxGen then a else doAll (doOne a i) (i+1) in doAll a 0 end else a end (* stop of ../../Parser/Dtd/dtdDeclare.sml *) (* start of ../../Parser/Dtd/dtdAttributes.sml *) (*--------------------------------------------------------------------------*) (* Structure: DtdAttributes *) (* *) (* Exceptions raised by functions in this structure: *) (* checkAttValue : AttValue InternalError *) (* checkDefinedIds : none *) (* genMissingAtts : none *) (* makeAttValue : AttValue InternalError *) (*--------------------------------------------------------------------------*) functor DtdAttributes (structure Dtd : Dtd structure Entities : Entities structure ParserOptions : ParserOptions) = struct structure DtdDeclare = DtdDeclare (structure Dtd = Dtd structure Entities = Entities structure ParserOptions = ParserOptions) open UniChar UniClasses UtilList Base Dtd DtdDeclare Errors Entities HookData ParserOptions val THIS_MODULE = "DtdAttributes" exception AttValue of AppData (*--------------------------------------------------------------------*) (* this is the list of language codes in ISO 639. *) (*--------------------------------------------------------------------*) val iso639codes = Vector.fromList ["AA","AB","AF","AM","AR","AS","AY","AZ", "BA","BE","BG","BH","BI","BN","BO","BR", "CA","CO","CS","CY", "DA","DE","DZ", "EL","EN","EO","ES","ET","EU", "FA","FI","FJ","FO","FR","FY", "GA","GD","GL","GN","GU", "HA","HE","HI","HR","HU","HY", "IA","ID","IE","IK","IN","IS","IT","IU","IW", "JA","JI","JW", "KA","KK","KL","KM","KN","KO","KS","KU","KY", "LA","LN","LO","LT","LV", "MG","MI","MK","ML","MN","MO","MR","MS","MT","MY", "NA","NE","NL","NO", "OC","OM","OR", "PA","PL","PS","PT", "QU", "RM","RN","RO","RU","RW", "SA","SD","SG","SH","SI","SK","SL","SM","SN","SO","SQ","SR","SS","ST","SU","SV","SW", "TA","TE","TG","TH","TI","TK","TL","TN","TO","TR","TS","TT","TW", "UG","UK","UR","UZ", "VI","VO", "WO", "XH", "YI","YO", "ZA","ZH","ZU"] (*--------------------------------------------------------------------*) (* a two-dimensional field [0..25][0..25] of booleans for ISO 639. *) (*--------------------------------------------------------------------*) val iso639field = let val arr = Array.tabulate(26,fn _ => Array.array(26,false)) val _ = Vector.map (fn s => Array.update(Array.sub(arr,ord(String.sub(s,0))-65), ord(String.sub(s,1))-65, true)) iso639codes in Vector.tabulate(26,fn i => Array.extract (Array.sub(arr,i),0,NONE)) end (*--------------------------------------------------------------------*) (* for a letter, compute ord(toUpper c)-ord(#"A"), for subscripting. *) (*--------------------------------------------------------------------*) val toUpperMask = Chars.notb(0wx20) fun cIndex c = Chars.toInt(Chars.andb(c,toUpperMask)-0wx41) (*--------------------------------------------------------------------*) (* are these two letters an ISO 639 code? *) (*--------------------------------------------------------------------*) fun isIso639 (c1,c2) = if !O_CHECK_ISO639 then Vector.sub(Vector.sub(iso639field,cIndex c1),cIndex c2) handle Subscript => false else isAsciiLetter c1 andalso isAsciiLetter c2 (*--------------------------------------------------------------------*) (* does this match Subcode ('-' Subcode)* ? *) (* is this a sequence of ('-' Subcode) ? *) (* Iana codes and user codes also end on ([a-z] | [A-Z])+ *) (*--------------------------------------------------------------------*) fun isSubcode' nil = false | isSubcode' (c::cs) = let fun doit nil = true | doit (c::cs) = if c=0wx2D then isSubcode' cs else isAsciiLetter c andalso doit cs in isAsciiLetter c andalso doit cs end fun isSubcode nil = true | isSubcode (c::cs) = c=0wx2D andalso isSubcode' cs val isIanaUser = isSubcode' (*--------------------------------------------------------------------*) (* Check whether a "xml:lang" attribute matches the LanguageID *) (* production. 2.12: *) (* *) (* [33] LanguageID ::= Langcode ('-' Subcode)* *) (* [34] Langcode ::= ISO639Code | IanaCode | UserCode *) (* [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) *) (* [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ *) (* [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ *) (* [38] Subcode ::= ([a-z] | [A-Z])+ *) (* *) (* print an error and raise AttValue if the "xml:lang" attribute does *) (* not have a valid value. *) (*--------------------------------------------------------------------*) fun checkAttSpec (a,q) (aidx,cs) = if !O_CHECK_LANGID andalso aidx=xmlLangIdx then let val valid = case cs of c::0wx2D::cs' => (c=0wx49 orelse c=0wx69 orelse c=0wx58 orelse c=0wx78) andalso isIanaUser cs' | c1::c2::cs' => isIso639 (c1,c2) andalso isSubcode cs' | _ => false in if valid then a else raise AttValue(hookError(a,(getPos q,ERR_ATT_IS_NOT(cs,IT_LANG_ID)))) end else a (*--------------------------------------------------------------------*) (* Normalize an attribute value of type other than CDATA, and split *) (* it into tokens at space characters. Cf. 3.3.3: *) (* *) (* ... If the declared value is not CDATA, then the XML processor *) (* must further process the normalized attribute value by dis- *) (* carding any leading and trailing space (#x20) characters, and by *) (* replacing sequences of space (#x20) characters by a single space *) (* (#x20) character. *) (* *) (* replacement of references is already done when parsing the literal,*) (* thus we need only do whitespace normalization. we don't need to *) (* take care of the 3rd rule since replacement of sequences of #x20 *) (* and then splitting subsumes its effect. *) (* *) (* return the list of tokens as character lists and the normalized *) (* value as a char vector. *) (*--------------------------------------------------------------------*) fun splitAttValue av = let fun doOne nil = (nil,nil,nil) | doOne (c::cs) = if c=0wx20 then let val (toks,ys) = doAll true cs in (nil,toks,ys) end else let val (tok,toks,ys) = doOne cs in ((c::tok),toks,c::ys) end and doAll addS nil = (nil,nil) | doAll addS (c::cs) = if c=0wx20 then doAll addS cs else let val (tok,toks,ys) = doOne cs in ((c::tok)::toks, if addS then 0wx20::c::ys else c::ys) end val (tokens,normed) = doAll false av in (Data2Vector normed,tokens) end (*--------------------------------------------------------------------*) (* normalize an attribute value other than CDATA according to 3.3.3. *) (* *) (* return the normalized att value as a Vector. *) (*--------------------------------------------------------------------*) fun normAttValue av = let fun doOne nil = nil | doOne (c::cs) = if c=0wx20 then doAll true cs else c::doOne cs and doAll addS nil = nil | doAll addS (c::cs) = if c=0wx20 then doAll addS cs else let val ys = doOne cs in if addS then 0wx20::c::ys else c::ys end val normed = doAll false av in Data2Vector normed end (*--------------------------------------------------------------------*) (* Check whether a sequence of chars forms a name (token). *) (*--------------------------------------------------------------------*) fun isNmToken cs = List.all isName cs fun isaName nil = false | isaName (c::cs) = isNms c andalso List.all isName cs (*--------------------------------------------------------------------*) (* Check whether a list of tokens is a single what fulfilling isWhat. *) (* print an error and raise AttValue if it is not. *) (*--------------------------------------------------------------------*) fun checkOne (isWhat,what,detail) (a,q) toks = case toks of nil => raise AttValue (hookError(a,(getPos q,ERR_EXACTLY_ONE detail))) | [one] => if isWhat one then one else raise AttValue(hookError(a,(getPos q,ERR_ATT_IS_NOT(one,what)))) | more => raise AttValue(hookError(a,(getPos q,ERR_AT_MOST_ONE detail))) (*--------------------------------------------------------------------*) (* Check whether a list of tokens is non-empty and all elements ful- *) (* fil isWhat. *) (* print an error and raise AttValue if not. *) (*--------------------------------------------------------------------*) fun checkList (isWhat,what,detail) (a,q) toks = case toks of nil => raise AttValue (hookError(a,(getPos q,ERR_AT_LEAST_ONE detail))) | _ => app (fn one => if isWhat one then () else let val err = ERR_ATT_IS_NOT(one,what) in raise AttValue(hookError(a,(getPos q,err))) end) toks (*--------------------------------------------------------------------*) (* Convert a list of tokens into an ID att value. 3.3.1: *) (* *) (* Validity Constraint: ID *) (* Values of type ID must match the Name production. *) (* *) (* Validity Constraint: ID *) (* ... A name must not appear more than once in an XML document as *) (* a value of this type; i.e., ID values must uniquely identify the *) (* elements which bear them. *) (* *) (* mark the value as used, print an error and raise AttValue if it *) (* was already used. *) (* print an error and raise AttValue if it is not a name. *) (*--------------------------------------------------------------------*) fun takeId (dtd,inDtd) (a,q) toks = let val one = checkOne (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idx = Id2Index dtd one val _ = if inDtd then () else let val (decl,refs) = getId dtd idx in if decl then let val err = ERR_REPEATED_ID one in raise AttValue (hookError(a,(getPos q,err))) end else setId dtd (idx,(true,refs)) end in (SOME(AV_ID idx),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an IDREF/IDREFS att value. 3.3.1: *) (* *) (* Validity Constraint: IDREF *) (* Values of type IDREF must match the Name production. *) (* *) (* print an error an raise AttValue if it is not a (list of) name(s). *) (*--------------------------------------------------------------------*) fun setIdRef (dtd,q) idx = let val (decl,refs) = getId dtd idx in setId dtd (idx,(decl,getPos q::refs)) end fun takeIdref (dtd,_) (a,q) toks = let val one = checkOne (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idx=Id2Index dtd one val _ = setIdRef (dtd,q) idx in (SOME(AV_IDREF idx),a) end fun takeIdrefs (dtd,_) (a,q) toks = let val _ = checkList (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idxs = map (Id2Index dtd) toks val _ = app (setIdRef (dtd,q)) idxs in (SOME(AV_IDREFS idxs),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an ENTITY/IES att value. 3.3.1: *) (* *) (* Validity Constraint: Entity Name *) (* Values of type ENTITY must match the Name production... *) (* must match the name of an unparsed entity declared in the DTD. *) (* *) (* print an error and raise AttValue if a token is not a name. *) (* print an error and raise AttValue if an entity is undeclared or a *) (* parsed entity. *) (*--------------------------------------------------------------------*) fun checkEntity (dtd,inDtd) (a,q) name = let val idx = GenEnt2Index dtd name val (ent,_) = getGenEnt dtd idx val _ = if inDtd then () else case ent of GE_UNPARSED _ => () | GE_NULL => let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) in raise AttValue (hookError(a,(getPos q,err))) end | _ => let val err = ERR_MUST_BE_UNPARSED(name,LOC_NONE) in raise AttValue (hookError(a,(getPos q,err))) end in idx end fun takeEntity (dtd,inDtd) (aq as (a,_)) toks = let val one = checkOne (isaName,IT_NAME,IT_ENT_NAME) aq toks val idx = checkEntity (dtd,inDtd) aq one in (SOME(AV_ENTITY idx),a) end fun takeEntities (dtd,inDtd) (aq as (a,_)) toks = let val _ = checkList (isaName,IT_NAME,IT_ENT_NAME) aq toks val idxs = map (checkEntity (dtd,inDtd) aq) toks in (SOME(AV_ENTITIES idxs),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into a NOTATION att value. 3.3.1: *) (* *) (* Validity Constraint: Notation Attributes *) (* Values of this type must match one of the notation names *) (* included in the declaration. *) (* *) (* print an error and raise AttValue if it is not a single name. *) (* print an error and raise AttValue if the notation's index is not *) (* in the list given as 1st arg. *) (*--------------------------------------------------------------------*) fun takeNotation is (dtd,inDtd) (aq as (a,q)) toks = let val one = checkOne (isaName,IT_NAME,IT_NOT_NAME) aq toks val idx = AttNot2Index dtd one val _ = if member idx is then () else let val nots = map (Index2AttNot dtd) is val err = ERR_MUST_BE_AMONG(IT_NOT_NAME,one,nots) in raise AttValue (hookError(a,(getPos q,err))) end in (SOME(AV_NOTATION(is,idx)),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an enumerated att value. 3.3.1: *) (* *) (* Validity Constraint: Enumeration *) (* Values of this type must match one of the Nmtoken tokens in *) (* the declaration. *) (* *) (* print an error and raise AttValue if it is not a single name token.*) (* print an error and raise AttValue if the token's index is not *) (* in the list given as 1st arg. *) (*--------------------------------------------------------------------*) fun takeGroup is (dtd,_) (aq as (a,q)) toks = let val one = checkOne (isNmToken,IT_NMTOKEN,IT_NMTOKEN) aq toks val idx = AttNot2Index dtd one val _ = if member idx is then () else let val toks = map (Index2AttNot dtd) is val err = ERR_MUST_BE_AMONG(IT_NMTOKEN,one,toks) in raise AttValue (hookError(a,(getPos q,err))) end in (SOME(AV_GROUP(is,idx)),a) end (*--------------------------------------------------------------------*) (* Given an attribute type and a list of characters, construct the *) (* corresponding AttValue. *) (* *) (* print an error (and possibly raise AttValue) if the attribute *) (* is ill-formed. *) (*--------------------------------------------------------------------*) fun makeAttValue dtd (a,q) (aidx,attType,ext,inDtd,cs) = if attType=AT_CDATA then let val cv = Data2Vector cs in if !O_VALIDATE andalso hasDtd dtd then (cv,(SOME(AV_CDATA cv),checkAttSpec (a,q) (aidx,cs))) else (cv,(NONE,a)) end else if !O_VALIDATE andalso hasDtd dtd then let val a1 = checkAttSpec (a,q) (aidx,cs) val (cv,toks) = splitAttValue cs val a2 = if ext andalso standsAlone dtd then let val cdata = Data2Vector cs in if cdata=cv then a1 else let val err = ERR_STANDALONE_NORM(Index2AttNot dtd aidx) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a1,(getPos q,err)) end end else a1 in case attType of AT_NMTOKEN => (cv,(SOME(AV_NMTOKEN(checkOne(isNmToken,IT_NMTOKEN, IT_NMTOKEN) (a2,q) toks)),a2)) | AT_NMTOKENS => (cv,(SOME(AV_NMTOKENS toks),a2)) before checkList(isNmToken,IT_NMTOKEN,IT_NMTOKEN) (a2,q) toks | AT_ID => (cv,takeId (dtd,inDtd) (a2,q) toks) | AT_IDREF => (cv,takeIdref (dtd,inDtd) (a2,q) toks) | AT_IDREFS => (cv,takeIdrefs (dtd,inDtd) (a2,q) toks) | AT_ENTITY => (cv,takeEntity (dtd,inDtd) (a2,q) toks) | AT_ENTITIES => (cv,takeEntities (dtd,inDtd) (a2,q) toks) | AT_GROUP is => (cv,takeGroup is (dtd,inDtd) (a2,q) toks) | AT_NOTATION is => (cv,takeNotation is (dtd,inDtd) (a2,q) toks) | AT_CDATA => raise InternalError(THIS_MODULE,"makeAttValue", "AT_CDATA in the innermost case") end else (normAttValue cs,(NONE,a)) (*--------------------------------------------------------------------*) (* given an attribute value literal and the attribute type, generate *) (* the AttValue, and check whether it complies with its default value.*) (* If yes, make an AttPresent value out of it. *) (* See 3.3.2: *) (* *) (* Validity Constraint: Fixed Attribute Default *) (* If an attribute has a default value declared with the #FIXED *) (* keyword, instances of that attribute must match the default *) (* value. *) (* *) (* print an error and raise AttValue if the attribute value doesn't *) (* comply. *) (* *) (* return the value as a AttPresent value. *) (*--------------------------------------------------------------------*) fun checkAttValue dtd (a,q) ((aidx,attType,defVal,ext),literal,cs) = let val (cv,(av,a1)) = makeAttValue dtd (a,q) (aidx,attType,ext,false,cs) in if !O_VALIDATE andalso hasDtd dtd then case defVal of AD_FIXED((def,cv',_),_) => if cv=cv' then (AP_PRESENT(literal,cv,av),a1) else raise AttValue (hookError(a1,(getPos q,ERR_FIXED_VALUE(Index2AttNot dtd aidx,cv,cv')))) | _ => (AP_PRESENT(literal,cv,av),a1) else (AP_PRESENT(literal,cv,av),a1) end (*--------------------------------------------------------------------*) (* check a defaulted attribute value for validity. *) (* *) (* since the lexical constraints are checked when the default is *) (* declared we only need to check whether notations are declared and *) (* entities are declared and unparsed. An ID attribute cannot be *) (* defaulted, so no need to check for duplicate ID attributes. *) (*--------------------------------------------------------------------*) fun checkDefaultValue dtd (a,q,pos) av = let fun checkEntity (idx,a) = let val (ent,_) = getGenEnt dtd idx in case ent of GE_UNPARSED _ => a | GE_NULL => hookError(a,(getPos q,ERR_UNDECLARED (IT_GEN_ENT,Index2GenEnt dtd idx, LOC_ATT_DEFAULT pos))) | _ => hookError(a,(getPos q,ERR_MUST_BE_UNPARSED (Index2GenEnt dtd idx,LOC_ATT_DEFAULT pos))) end fun checkNotation (idx,a) = if hasNotation dtd idx then a else hookError(a,(getPos q,ERR_UNDECLARED (IT_NOTATION,Index2AttNot dtd idx,LOC_ATT_DEFAULT pos))) in case av of SOME(AV_ENTITY i) => checkEntity (i,a) | SOME(AV_ENTITIES is) => foldl checkEntity a is | SOME(AV_NOTATION(_,i)) => checkNotation(i,a) | _ => a end (*--------------------------------------------------------------------*) (* Generate the attributes not specified in a start-tag, the defs of *) (* these atts and the specified atts given as argument. 3.3.2: *) (* *) (* If the declaration is neither #REQUIRED nor #IMPLIED, then the *) (* AttValue value contains the declared default value; ... If a *) (* default value is declared, when an XML processor encounters an *) (* omitted attribute, it is to behave as though the attribute were *) (* present with the declared default value. *) (* *) (* Validity Constraint: Required Attribute *) (* If the default declaration is the keyword #REQUIRED, then the *) (* attribute must be specified for all elements of the type in the *) (* attribute-list declaration. *) (* *) (* print an error if a required attribute was omitted. *) (* *) (* return the AttSpecList of all attributes for this tag. *) (*--------------------------------------------------------------------*) fun genMissingAtts dtd (a,q) (defs,specd) = let fun default a (idx,(v as (_,_,av),(pos,checked)),ext) = let val a1 = if ext andalso !O_VALIDATE andalso standsAlone dtd then let val err = ERR_STANDALONE_DEF(Index2AttNot dtd idx) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a,(getPos q,err)) end else a val a2 = if !O_VALIDATE andalso not (!checked andalso !O_ERROR_MINIMIZE) then checkDefaultValue dtd (a1,q,pos) av before checked := true else a1 in (AP_DEFAULT v,a1) end fun doit a nil = (specd,a) | doit a ((idx,_,dv,ext)::rest) = let val (value,a1) = case dv of AD_DEFAULT v => default a (idx,v,ext) | AD_FIXED v => default a (idx,v,ext) | AD_IMPLIED => (AP_IMPLIED,a) | AD_REQUIRED => let val a1 = if not (!O_VALIDATE) then a else hookError(a,(getPos q, ERR_MISSING_ATT(Index2AttNot dtd idx))) in (AP_MISSING,a1) end val (other,a2) = doit a1 rest in ((idx,value,NONE)::other,a2) end in doit a defs end (*--------------------------------------------------------------------*) (* process an undeclared attribute in a start-tag. *) (* At option, an error message is generated only once for the same *) (* attribute and element. *) (* *) (* possibly print an error. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun handleUndeclAtt dtd (a,q) (aidx,att,eidx,elem) = if !O_ERROR_MINIMIZE then let val {decl,atts,errAtts} = getElement dtd eidx in if member aidx errAtts then a else let val a1 = if !O_VALIDATE andalso hasDtd dtd then let val err = ERR_UNDECL_ATT(att,elem) in hookError(a,(getPos q,err)) end else a val a2 = checkAttName (a1,q) att val _ = setElement dtd (eidx,{decl = decl, atts = atts, errAtts = aidx::errAtts}) in a2 end end else let val a1 = if !O_VALIDATE andalso hasDtd dtd then hookError(a,(getPos q,ERR_UNDECL_ATT(att,elem))) else a in checkAttName (a1,q) att end end (* stop of ../../Parser/Dtd/dtdAttributes.sml *) (* start of ../../Parser/Dtd/dtdManager.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dtd *) (* *) (* Depends on: *) (* UniChar *) (* DtdAttributes *) (* DtdElements *) (* DtdEntities *) (* DtdNotations *) (* DtdStandalone *) (* *) (* Exceptions raised by functions in this structure: *) (* initDtdTables : none *) (* AttIdx2String : NoSuchSymbol *) (* ElemIdx2String : NoSuchIndex *) (* GenEntIdx2String : NoSuchIndex *) (* IdIdx2String : NoSuchIndex *) (* NotIdx2String : NoSuchIndex *) (* GenEntity2String : NoSuchIndex *) (* ElemInfo2String : NoSuchIndex NoSuchSymbol *) (* printGenEntTable : NoSuchIndex *) (* printElementTable : NoSuchIndex NoSuchSymbol *) (* printDtdTables : NoSuchIndex NoSuchSymbol *) (*--------------------------------------------------------------------------*) signature DtdManager = sig include Entities include Dtd exception AttValue of AppData val makeAttValue : Dtd -> AppData * State -> int * Base.AttType * bool * bool * UniChar.Data -> UniChar.Vector * (Base.AttValue option * AppData) val checkAttValue : Dtd -> AppData * State -> Base.AttDef * UniChar.Vector * UniChar.Data -> HookData.AttPresent * AppData val genMissingAtts : Dtd -> AppData * State -> Base.AttDefList * HookData.AttSpecList -> HookData.AttSpecList * AppData val handleUndeclAtt : Dtd -> AppData * State -> int * UniChar.Data * int * UniChar.Data -> AppData val handleUndeclElement : Dtd -> int -> Base.ElemInfo val checkAttName : AppData * State -> UniChar.Data -> AppData val checkElemName : AppData * State -> UniChar.Data -> AppData val checkDefinedIds : Dtd -> AppData * State -> AppData val checkMultEnum : Dtd -> AppData * State -> AppData val checkPreDefined : Dtd -> AppData * State -> AppData val checkUnparsed : Dtd -> AppData -> AppData val enterAttList : Dtd -> AppData * State -> int -> AppData val addAttribute : Dtd -> AppData * State -> int * Base.AttDef -> AppData val addElement : Dtd -> AppData * State -> int * Base.ContentSpec * bool -> AppData val addGenEnt : Dtd -> AppData * State -> int * Base.GenEntity * bool -> AppData val addNotation : Dtd -> AppData * State -> int * Base.ExternalId -> AppData val addParEnt : Dtd -> AppData * State -> int * Base.ParEntity * bool -> AppData end functor DtdManager (structure Dtd : Dtd structure Hooks : Hooks structure ParserOptions : ParserOptions) : DtdManager = struct structure Entities = Entities (structure Hooks = Hooks) structure DtdAttributes = DtdAttributes (structure Dtd = Dtd structure Entities = Entities structure ParserOptions = ParserOptions) open Dtd DtdAttributes end (* stop of ../../Parser/Dtd/dtdManager.sml *) (* start of ../../Parser/Parse/parseBase.sml *) signature ParseBase = sig include Dfa DtdManager Resolve DfaOptions ParserOptions exception NoSuchChar of AppData * State exception NoSuchEntity of AppData * State exception NotFound of UniChar.Char * AppData * State exception SyntaxError of UniChar.Char * AppData * State val expectedOrEnded : Errors.Expected * Errors.Location -> UniChar.Char -> Errors.Error val recoverXml : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val recoverETag : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val recoverSTag : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val recoverDecl : bool -> UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val useParamEnts : unit -> bool end (*--------------------------------------------------------------------------*) (* Structure: ParseBase *) (*--------------------------------------------------------------------------*) (* This structure provides exceptions for the Parse functions, and strings *) (* for error generation (these strings don't really need to reside in their *) (* own structure, but like this the code is more easier to read). *) (*--------------------------------------------------------------------------*) functor ParseBase (structure Dtd : Dtd structure Hooks : Hooks structure Resolve : Resolve structure ParserOptions : ParserOptions) : ParseBase = struct structure DfaOptions = ParserOptions.DfaOptions structure Dfa = Dfa (structure DfaOptions = DfaOptions) structure DtdManager = DtdManager (structure Dtd = Dtd structure Hooks = Hooks structure ParserOptions = ParserOptions) open Base DtdManager DfaOptions Dfa Errors ParserOptions Resolve UniChar exception NoSuchChar of AppData * State exception NoSuchEntity of AppData * State exception NotFound of UniChar.Char * AppData * State exception SyntaxError of UniChar.Char * AppData * State fun expectedOrEnded (exp,ended) c = if c=0wx00 then ERR_ENDED_BY_EE ended else ERR_EXPECTED(exp,[c]) (*--------------------------------------------------------------------*) (* Besides "?>" also recognize ">" as end delimiter, because the typo *) (* might be an omitted "?". Also stop on "<"; then the entire "?>" *) (* was omitted; the "<" may not be consumed then. *) (* Within literals dont recognize ">" and "<", but only "?>"; then *) (* the typo is an omitted quote character. *) (*--------------------------------------------------------------------*) fun recoverXml caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3F (* #"?" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (c1,a1,q1) else do_lit ch (c1,a1,q1) end | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx25 (* #"%" *) => (c,a,q) | 0wx26 (* #"&" *) => (c,a,q) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3C (* #"<" *) => (c,a,q) | 0wx3E (* #">" *) => (getChar (a,q)) | _ => doit (getChar (a,q)) in doit caq end fun recoverETag caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx26 (* #"&" *) => (c,a,q) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3E (* #">" *) => (getChar (a,q)) | 0wx3C (* #"<" *) => (c,a,q) | _ => doit (getChar (a,q)) in doit caq end fun recoverSTag caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (false,(c,a,q)) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx26 (* #"&" *) => (false,(c,a,q)) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx2F (* #"/" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (true,(c1,a1,q1)) else doit (c1,a1,q1) end | 0wx3E (* #">" *) => (false,getChar (a,q)) | 0wx3C (* #"<" *) => (false,(c,a,q)) | _ => doit (getChar (a,q)) in doit caq end fun recoverDecl hasSubset caq = let fun do_lit ch (c,a,q) = if c=0wx00 then (c,a,q) else if c=ch then getChar (a,q) else do_lit ch (getChar(a,q)) fun do_decl (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #"\""*) => do_decl (do_lit c (getChar (a,q))) | 0wx27 (* #"'" *) => do_decl (do_lit c (getChar (a,q))) | 0wx3E (* #">" *) => getChar (a,q) | _ => do_decl (getChar (a,q)) fun do_subset (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3C (* #"<" *) => do_subset (do_decl (getChar (a,q))) | 0wx5D (* #"]" *) => getChar (a,q) | _ => do_subset (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => if isSpecial q then (c,a,q) else doit (getChar (a,q)) | 0wx22 (* #"\""*) => doit (do_lit c (getChar (a,q))) | 0wx25 (* #"%" *) => if hasSubset then (c,a,q) else doit (getChar (a,q)) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3C (* #"<" *) => (c,a,q) | 0wx3E (* #">" *) => getChar (a,q) | 0wx5B (* #"[" *) => if hasSubset then doit (do_subset (getChar (a,q))) else doit (getChar (a,q)) | _ => doit (getChar (a,q)) in doit caq end fun useParamEnts() = !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS end (* stop of ../../Parser/Parse/parseBase.sml *) (* start of ../../Parser/Parse/parseNames.sml *) signature ParseNames = sig include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseNames *) (* *) (* Exceptions raised by functions in this structure: *) (* parseEntName : none *) (* parseName : NotFound *) (* parseNmtoken : NotFound *) (*--------------------------------------------------------------------------*) functor ParseNames (structure ParseBase : ParseBase) : ParseNames = struct open Errors ParseBase UniClasses (*--------------------------------------------------------------------*) (* parse (the remainder of) a name or nmtoken. *) (* *) (* [5] Name ::= (Letter | '_' | ':') (NameChar)* *) (* *) (* raise NotFound if no name/name start character comes first. *) (* *) (* return the name as a list of characters, together with the next *) (* character and the remaining state. *) (*--------------------------------------------------------------------*) fun parseName' (c,a,q) = if isName c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else (nil,(c,a,q)) fun parseName (c,a,q) = if isNms c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else raise NotFound(c,a,q) fun parseNmtoken (c,a,q) = if isName c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else raise NotFound(c,a,q) (*--------------------------------------------------------------------*) (* parse a name, additionally accumulating its characters in reverse *) (* order to the first argument. *) (* *) (* raise NotFound if no name/name start character comes first. *) (*--------------------------------------------------------------------*) fun parseNameLit cs (c,a,q) = let fun doit (cs,ns) (c,a,q) = if isName c then doit (c::cs,c::ns) (getChar(a,q)) else (cs,rev ns,(c,a,q)) in if isNms c then doit (c::cs,[c]) (getChar(a,q)) else raise NotFound(c,a,q) end (*--------------------------------------------------------------------*) (* parse a name, accumulating its reverse in the first arg text. This *) (* is useful for parsing of entity values, where entity references *) (* are parsed but bypassed, and must thus be accumulated together *) (* the other literal text. *) (* *) (* print an error if no name/name start character comes first. *) (* *) (* return a boolean indicating whether a name was found, the reverse *) (* name as a list of characters, concatenated with the text in the *) (* first arg, together with the next character and remaining state. *) (*--------------------------------------------------------------------*) fun parseEntName (lit,text) (c,a,q) = let fun doit (lit,text) (c,a,q) = if isName c then doit (c::lit,c::text) (getChar (a,q)) else (true,lit,text,(c,a,q)) in if isNms c then doit (c::lit,c::text) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expAnEntName,[c]))) in (false,lit,text,(c,a1,q)) end end end (* stop of ../../Parser/Parse/parseNames.sml *) (* start of ../../Parser/Parse/parseMisc.sml *) signature ParseMisc = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseNames val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val skipEq : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseMisc *) (* *) (* Exceptions raised by functions in this structure: *) (* skipS : none *) (* skipSopt : none *) (* skipSmay : none *) (* skipEq : SyntaxError *) (* skipComment : none *) (* parseComment : none *) (* parseProcInstr : none *) (*--------------------------------------------------------------------------*) functor ParseMisc (structure ParseBase : ParseBase) : ParseMisc = struct structure ParseNames = ParseNames (structure ParseBase = ParseBase) open UniChar Errors ParseNames (*--------------------------------------------------------------------*) (* parse a sequence of white space. 2.3: *) (* *) (* [3] S ::= (#x20 | #x9 | #xD | #xA)+ *) (*--------------------------------------------------------------------*) (* parse optional white space. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipSopt (c,a,q) = case c of 0wx09 => skipSopt (getChar (a,q)) | 0wx0A => skipSopt (getChar (a,q)) | 0wx20 => skipSopt (getChar (a,q)) | _ => (c,a,q) fun parseSopt cs (c,a,q) = case c of 0wx09 => parseSopt (c::cs) (getChar (a,q)) | 0wx0A => parseSopt (c::cs) (getChar (a,q)) | 0wx20 => parseSopt (c::cs) (getChar (a,q)) | _ => (cs,(c,a,q)) (*--------------------------------------------------------------------*) (* parse optional white space. *) (*--------------------------------------------------------------------*) (* Return type: bool * (Char * AppData * State) *) (* the bool indicates whether white space was found or not. *) (*--------------------------------------------------------------------*) fun skipSmay (c,a,q) = case c of 0wx09 => (true,skipSopt (getChar (a,q))) | 0wx0A => (true,skipSopt (getChar (a,q))) | 0wx20 => (true,skipSopt (getChar (a,q))) | _ => (false,(c,a,q)) fun parseSmay cs (c,a,q) = case c of 0wx09 => (true,parseSopt (c::cs) (getChar (a,q))) | 0wx0A => (true,parseSopt (c::cs) (getChar (a,q))) | 0wx20 => (true,parseSopt (c::cs) (getChar (a,q))) | _ => (false,(cs,(c,a,q))) (*--------------------------------------------------------------------*) (* parse required white space. *) (*--------------------------------------------------------------------*) (* print an error if no white space character is found. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipS (c,a,q) = case c of 0wx09 => skipSopt (getChar (a,q)) | 0wx0A => skipSopt (getChar (a,q)) | 0wx20 => skipSopt (getChar (a,q)) | _ => (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) (*--------------------------------------------------------------------*) (* parse a "=" together with surrounding white space. Cf. 28: *) (* *) (* [25] Eq ::= S? '=' S? *) (*--------------------------------------------------------------------*) (* Raises: *) (* SyntaxError if no "=" is found. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipEq caq = let val (c1,a1,q1) = skipSopt caq in if c1=0wx3D then skipSopt (getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expEq,[c1]))) in raise SyntaxError(c1,a2,q1) end end fun parseEq caq = let val (cs1,(c1,a1,q1)) = parseSopt nil caq in if c1=0wx3D then let val (cs2,caq2)= parseSopt (c1::cs1) (getChar (a1,q1)) in (rev cs2,caq2) end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expEq,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse a comment, the initial "<--" already consumed. cf. 2.5: *) (* *) (* They are not part of the document's character data; an XML *) (* processor may, but need not, make it possible for an application *) (* to retrieve the text of comments. For compatibility, the string *) (* "--" (double-hyphen) must not occur within comments. *) (* *) (* [15] Comment ::= '' *) (*--------------------------------------------------------------------*) (* print an error and end the comment if an entity end is found. *) (* print an error if the comment contains "--". *) (*--------------------------------------------------------------------*) (* add the comment to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseComment startPos aq = let fun check_end yet (a0,q0) = let val (c,a,q) = getChar (a0,q0) in if c=0wx2D (* #"-" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then let val cs = Data2Vector(rev yet) val a2 = hookComment(a1,((startPos,getPos q1),cs)) in getChar(a2,q1) end else let val a2 = if not (!O_COMPATIBILITY) then a1 else hookError(a1,(getPos q0,ERR_FORBIDDEN_HERE (IT_DATA [c,c],LOC_COMMENT))) in doit (c::c::yet) (c1,a2,q1) end end else doit (0wx2D::yet) (c,a,q) end and doit yet (c,a,q) = if c=0wx2D (* #"-" *) then check_end yet (a,q) else if c<>0wx00 then doit (c::yet) (getChar (a,q)) else let val err = ERR_ENDED_BY_EE LOC_COMMENT val a1 = hookError(a,(getPos q,err)) val cs = Data2Vector(rev yet) val a2 = hookComment(a1,((startPos,getPos q),cs)) in (c,a2,q) end in doit nil (getChar aq) end (*--------------------------------------------------------------------*) (* check whether a name matches "xml", disregarding case, cf. 2.6: *) (* *) (* [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) *) (* *) (* The target names "XML", "xml", and so on are reserved for *) (* standardization in this or future versions of this specification.*) (*--------------------------------------------------------------------*) (* print an error if it does match. *) (*--------------------------------------------------------------------*) (* Return type: AppData *) (*--------------------------------------------------------------------*) fun checkPiTarget (a,q) name = case name of [c1,c2,c3] => if ((c1=0wx58 orelse c1=0wx78) andalso (c2=0wx4D orelse c2=0wx6D) andalso (c3=0wx4C orelse c3=0wx6C)) then hookError(a,(getPos q,ERR_RESERVED(name,IT_TARGET))) else a | _ => a (*--------------------------------------------------------------------*) (* parse a processing instruction, the initial "' Char* )))? '?>'*) (* *) (* The first arg consists of the target and the (reversed) list of *) (* leading characters of the text that have been looked ahead. *) (*--------------------------------------------------------------------*) (* print an error and end the proc. instr. if an entity end is found. *) (*--------------------------------------------------------------------*) (* add the processing instruction to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseProcInstr' (startPos,target,txtPos,yetText) caq = let fun doit text (c1,a1,q1) = case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PROC)) in (text,getPos q1,(c1,a2,q1)) end | 0wx3F => (* #"?" *) let val (c2,a2,q2) = getChar (a1,q1) in case c2 of 0wx3E => (* #">" *) (text,getPos q2,getChar(a2,q2)) | _ => doit (c1::text) (c2,a2,q2) end | _ => doit (c1::text) (getChar (a1,q1)) val (cs,endPos,(c2,a2,q2)) = doit yetText caq val text = Data2Vector(rev cs) val a3 = hookProcInst(a2,((startPos,endPos),target,txtPos,text)) in (c2,a3,q2) end (*--------------------------------------------------------------------*) (* parse a processing instruction, the initial "' Char* )))? '?>'*) (*--------------------------------------------------------------------*) (* print an error and end the proc. instr. if an entity end is found. *) (* print an error if no target name is found. *) (* print an error if no whitespace follows the target. *) (*--------------------------------------------------------------------*) (* add the processing instruction to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseProcInstr startPos (a,q) = let (* NotFound is handled after the 'in .. end' *) val (target,(c1,a1,q1)) = parseName (getChar(a,q)) val a1 = checkPiTarget (a1,q) target in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PROC)) val a3 = hookProcInst(a2,((startPos,getPos q1),target,getPos q1,nullVector)) in (c1,a3,q1) end | 0wx3F => (* #"?" *) let val (c2,a2,q2) = getChar (a1,q1) in case c2 of 0wx3E => (* #">" *) let val a3 = hookProcInst(a2,((startPos,getPos q2),target, getPos q1,nullVector)) in getChar (a3,q2) end | _ => let val a3 = hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in parseProcInstr' (startPos,target,getPos q1,[c1]) (c2,a3,q2) end end | _ => let val (hadS,(c2,a2,q2)) = skipSmay (c1,a1,q1) val a3 = if hadS then a2 else hookError(a2,(getPos q2,ERR_MISSING_WHITE)) in parseProcInstr' (startPos,target,getPos q2,nil) (c2,a3,q2) end end handle NotFound(c,a,q) => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expATarget,[c]))) in parseProcInstr' (startPos,nullData,getPos q,nil) (c,a1,q) end end (* stop of ../../Parser/Parse/parseMisc.sml *) (* start of ../../Parser/Parse/parseXml.sml *) signature ParseXml = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseMisc val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openExtern : int * bool * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseXml *) (* *) (* Exceptions raised by functions in this structure: *) (* openDocument : NoSuchFile *) (* openExtern : none *) (* openSubset : NoSuchFile *) (*--------------------------------------------------------------------------*) functor ParseXml (structure ParseBase : ParseBase) : ParseXml = struct structure ParseMisc = ParseMisc (structure ParseBase = ParseBase) open Errors UniChar UniClasses UtilString ParseMisc fun checkVersionNum (a,q) version = if not (!O_CHECK_VERSION) orelse version="1.0" then a else hookError(a,(getPos q,ERR_VERSION version)) (*--------------------------------------------------------------------*) (* parse a version number, the quote character ("'" or '"') passed as *) (* first argument. cf. 2.8: *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+ *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a disallowed character is found. *) (* *) (* return the version number as a string option, together with the *) (* next character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseVersionNum quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if isVers c then doit (c::text) (getChar (a,q)) else if c=0wx0 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_VERSION)) in (text,(c,a1,q)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c,LOC_VERSION) val a1 = hookError(a,(getPos q,err)) in doit text (getChar (a1,q)) end val (c1,a1,q1) = getChar aq val (text,(c2,a2,q2)) = if isVers c1 then doit [c1] (getChar (a1,q1)) else if c1=quote then let val a2 = hookError(a1,(getPos q1,ERR_EMPTY LOC_VERSION)) in (nil,getChar (a2,q1)) end else if c1=0wx00 then let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_VERSION)) val a3 = hookError(a2,(getPos q1,ERR_EMPTY LOC_VERSION)) in (nil,(c1,a3,q1)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_VERSION) val a2 = hookError(a1,(getPos q1,err)) in doit nil (getChar (a2,q1)) end val version = Latin2String (rev text) val a3 = checkVersionNum (a2,q1) version in (SOME version,(c2,a3,q2)) end (*--------------------------------------------------------------------*) (* parse a version info starting after 'version'. Cf. 2.8: *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no quote sign is found. *) (* *) (* return the version number as a string option, together with the *) (* next char and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseVersionInfo caq = let val (c1,a1,q1) = skipEq caq in case c1 of 0wx22 (* '""' *) => parseVersionNum c1 (a1,q1) | 0wx27 (* "'" *) => parseVersionNum c1 (a1,q1) | _ => let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expLitQuote,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse an encoding name, the quote character ("'" or '"') passed as *) (* first argument. cf. 4.3.3: *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* [81] EncName ::= [A-Za-z] /* Encoding name *) (* ([A-Za-z0-9._] | '-')* contains only Latin *) (* characters */ *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a disallowed character is found. *) (* *) (* return the encoding name as a string option, together with the *) (* next character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEncName quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if isEnc c then doit (c::text) (getChar (a,q)) else if c=0wx00 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ENCODING)) in (text,(c,a1,q)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c,LOC_ENCODING) val a1 = hookError(a,(getPos q,err)) in doit text (getChar (a,q)) end val (c1,a1,q1) = getChar aq val (text,caq2) = if isEncS c1 then doit [c1] (getChar (a1,q1)) else if c1=quote then let val a2 = hookError(a1,(getPos q1,ERR_EMPTY LOC_ENCODING)) in (nil,getChar (a2,q1)) end else if c1=0wx00 then let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_ENCODING)) val a3 = hookError(a2,(getPos q1,ERR_EMPTY LOC_ENCODING)) in (nil,(c1,a3,q1)) end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expStartEnc,[c1]))) in doit nil (getChar (a2,q1)) end val enc = toUpperString (Latin2String (rev text)) in (enc,caq2) end (*--------------------------------------------------------------------*) (* parse an encoding decl starting after 'encoding'. Cf. 4.3.3: *) (* *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no quote sign is found. *) (* *) (* return the encoding name as a string option, together with the *) (* next char and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseEncodingDecl caq = let val (c1,a1,q1) = skipEq caq in case c1 of 0wx22 (* '""' *) => parseEncName c1 (a1,q1) | 0wx27 (* "'" *) => parseEncName c1 (a1,q1) | _ => let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expLitQuote,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse a standalone declaration starting after 'standalone'. *) (* Cf. 2.9: *) (* *) (* [32] SDDecl ::= S 'standalone' Eq [ VC: Standalone *) (* ( ("'" ('yes' | 'no') "'") Document *) (* | ('"' ('yes' | 'no') '"')) Declaration ] *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no literal is found. *) (* print an error and end the literal if an entity end is found. *) (* print an error if the literal is neither 'yes' nor 'no'. *) (* *) (* return the standalone status as a boolean option, together with *) (* the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseStandaloneDecl caq0 = let val (quote,a,q) = skipEq caq0 fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if c<>0wx0 then doit (c::text) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_LITERAL)) in (text,(c,a1,q)) end val caq1 as (_,_,q1) = case quote of 0wx22 (* '""' *) => (getChar (a,q)) | 0wx27 (* "'" *) => (getChar (a,q)) | _ => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expLitQuote,[quote]))) in raise SyntaxError(quote,a1,q) end val (text,caq2) = doit nil caq1 in case text of [0wx73,0wx65,0wx79] (* reversed "yes" *) => (SOME true,caq2) | [0wx6f,0wx6e] (* reversed "no" *) => (SOME false,caq2) | revd => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expNoYes,revd))) in (NONE,(c2,a3,q2)) end end (*--------------------------------------------------------------------*) (* parse an xml declaration starting after 'xml ' (i.e. the first *) (* white space character is already consumed). Cf. 2.8: *) (* *) (* [23] XMLDecl ::= ''*) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* [32] SDDecl ::= S 'standalone' Eq [ VC: Standalone *) (* ( ("'" ('yes' | 'no') "'") Document *) (* | ('"' ('yes' | 'no') '"')) Declaration ] *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* default version, encoding and standalone status to NONE. *) (* *) (* print an error if no leading white space is found. *) (* print an error whenever a wrong name is encountered. *) (* print an Error if no VersionInfo is found. *) (* print an Error if no '?>' is found at the end. *) (* print an error and raise SyntaxState if no '=' or no literal is *) (* found in VersionInfo, EncodingDecl or SDDecl. *) (* print an error if a literal does not have a correct value. *) (* *) (* return the corresponding XmlDecl option and the next char & state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseXmlDecl auto caq = let (*-----------------------------------------------------------------*) (* skip the '?>' at the end of the xml declaration. *) (* *) (* print an error and raise SyntaxState if no '?>' is found. *) (* *) (* return the info passed as first arg, and the next char & state. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun skipXmlDeclEnd enc res (c,a,q) = if c=0wx3F (* "#?" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (enc,SOME res,getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in raise SyntaxError (c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expProcEnd,[c]))) in raise SyntaxError (c,a1,q) end (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'standalone', the version *) (* and encoding already parsed and given in the first arg. *) (* *) (* pass the version,encoding and sd status to skipXmlDeclEnd *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclAfterS enc (v,e) caq = let val (alone,caq1) = parseStandaloneDecl caq val caq2 = skipSopt caq1 in skipXmlDeclEnd enc (v,e,alone) caq2 end (*-----------------------------------------------------------------*) (* parse the remainder after the encoding declaration, the version *) (* and encoding already parsed and given in the first arg. *) (* *) (* print an error if a name other than 'standalone' is found. *) (* *) (* pass the version and encoding to parseXmlDeclAfterS. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclBeforeS enc (v,e) caq = let val (hadS,caq1 as (_,_,q1)) = skipSmay caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound handled below *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in case name of [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS enc (v,e) (c2,a3,q2) | _ => let val a4 = hookError(a3,(getPos q1,ERR_EXPECTED(expStandOpt,name))) in parseXmlDeclAfterS enc (v,e) (c2,a4,q2) end end handle NotFound caq => (* exception raised by parseName *) skipXmlDeclEnd enc (v,e,NONE) caq (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'encoding', the version *) (* already parsed and given in the first arg. *) (* *) (* pass the version and encoding and to parseXmlDeclBeforeS *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclAfterE ver caq = let val (enc,(c1,a1,q1)) = parseEncodingDecl caq val (a2,q2,enc1) = changeAuto(a1,q1,enc) in parseXmlDeclBeforeS enc1 (ver,SOME enc) (c1,a2,q2) end (*-----------------------------------------------------------------*) (* parse the remainder after the version info, the version already *) (* parsed and given in the first arg. *) (* *) (* print an error if a name other than 'encoding' or 'standalone' *) (* is found. *) (* *) (* pass obtained/default values to parseXmlDeclAfter[E|S] or to *) (* skipXmlDeclEnd. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclBeforeE ver caq = let val (hadS,caq1 as (_,_,q1)) = skipSmay caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound handled below *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in case name of [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseXmlDeclAfterE ver (c2,a3,q2) | [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS auto (ver,NONE) (c2,a3,q2) | _ => let val a4 = hookError(a3,(getPos q1,ERR_EXPECTED(expEncStand,name))) in parseXmlDeclAfterE ver (c2,a4,q2) end end handle NotFound caq => (* exception raised by parseName *) skipXmlDeclEnd auto (ver,NONE,NONE) caq (*-----------------------------------------------------------------*) (* do the main work. if the first name is not 'version' then it *) (* might be 'encoding' or 'standalone'. Then take the default *) (* NONE for version and - if needed - encoding and call the *) (* appropriate function. otherwise assume a typo and parse the *) (* version number, then call parseXmlDeclBeforeE. if no name is *) (* found at all, proceed with skipXmlDeclEnd. *) (* *) (* print an error and raise SyntaxState if an entity end is found. *) (* print an error and raise SyntaxState if appropriate. *) (* print an error if a name other than 'version' is found. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) val caq1 as (_,_,q1) = skipSopt caq val (name,(caq2 as (c2,a2,q2))) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expVersion,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if name=[0wx76,0wx65,0wx72,0wx73,0wx69,0wx6f,0wx6e] (* "version" *) then let val (ver,caq3) = parseVersionInfo caq2 in parseXmlDeclBeforeE ver caq3 end else let val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expVersion,name))) in case name of [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseXmlDeclAfterE NONE (c2,a3,q2) | [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS auto (NONE,NONE) (c2,a3,q2) | _ => let val (ver,caq3) = parseVersionInfo (c2,a3,q2) in parseXmlDeclBeforeE ver caq3 end end end (*----------------------------------------------------------------*) (* catch entity end exceptions raised by subfunctions, print an *) (* error and re-raise the exception. *) (*----------------------------------------------------------------*) handle SyntaxError(c,a,q) => let val err = if c=0wx0 then ERR_ENDED_BY_EE LOC_XML_DECL else ERR_CANT_PARSE LOC_XML_DECL val a1 = hookError(a,(getPos q,err)) in (auto,NONE,recoverXml(c,a1,q)) end (*--------------------------------------------------------------------*) (* parse a text declaration starting after 'xml ' (i.e. the first *) (* white space character is already consumed). Cf. 2.8: *) (* *) (* [77] TextDecl ::= '' *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* default version and encoding to NONE. *) (* *) (* print an error if no leading white space is found. *) (* print an error whenever a wrong name is encountered. *) (* print an Error if no EncodingDecl is found. *) (* print an Error if '?>' is found at the end. *) (* print an error and raise SyntaxState if no '=' or no literal is *) (* found in VersionInfo or EncodingDecl. *) (* print an error if a literal does not have a correct value. *) (* *) (* return the corresponding TextDecl option and the next char & state.*) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseTextDecl auto caq = let (*-----------------------------------------------------------------*) (* skip the '?>' at the end of the text declaration. *) (* *) (* print an error and raise SyntaxState if no '?>' is found. *) (* *) (* return the info passed as first arg, and the next char & state. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun skipTextDeclEnd enc res (c,a,q) = if c=0wx3F (* "#?" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (enc,SOME res,getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in raise SyntaxError(c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expProcEnd,[c]))) in raise SyntaxError(c,a1,q) end (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'encoding', the version *) (* already parsed and given in the first arg. *) (* *) (* pass the version and encoding and to skipTextDeclEnd. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseTextDeclAfterE ver caq = let val (enc,(c1,a1,q1)) = parseEncodingDecl caq val (a2,q2,enc1) = changeAuto(a1,q1,enc) val caq3 = skipSopt (c1,a2,q2) in skipTextDeclEnd enc1 (ver,SOME enc) caq3 end (*-----------------------------------------------------------------*) (* parse the remainder after the version info, the version given *) (* as first argument. *) (* *) (* print an error and raise SyntaxState is no name is found. *) (* print an error if a name other than 'encoding' is found. *) (* *) (* pass obtained/default values to parseTextDeclAfterE. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseTextDeclBeforeE ver caq = let val caq1 as (_,_,q1) = skipS caq val (name,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expEncoding,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if name=[0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] (* "encoding" *) then parseTextDeclAfterE ver caq2 else let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expEncoding,name))) in parseTextDeclAfterE ver (c2,a3,q2) end end (*-----------------------------------------------------------------*) (* do the main work. if the first name is neither 'version' nor *) (* 'encoding' then assume typo of 'version'. Then parse the *) (* version number, call parseTextDeclBeforeE. if no name is found *) (* at all, proceed with skipTextDeclEnd. *) (* *) (* print an error and raise SyntaxState if appropriate. *) (* print an error if a name other than 'version' or 'encoding' is *) (* found. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) val caq1 as (_,_,q1) = skipSopt caq val (name,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expEncVers,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end in case name of [0wx76,0wx65,0wx72,0wx73,0wx69,0wx6f,0wx6e] => (* "version" *) let val (ver,caq3) = parseVersionInfo caq2 in parseTextDeclBeforeE ver caq3 end | [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseTextDeclAfterE NONE caq2 | _ => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expEncVers,name))) val (ver,caq3) = parseVersionInfo (c2,a3,q2) in parseTextDeclBeforeE ver caq3 end end (*----------------------------------------------------------------*) (* catch entity end exceptions raised by subfunctions, print an *) (* error and re-raise the exception. *) (*----------------------------------------------------------------*) handle SyntaxError(c,a,q) => let val err = if c=0wx0 then ERR_ENDED_BY_EE LOC_TEXT_DECL else ERR_CANT_PARSE LOC_TEXT_DECL val a1 = hookError(a,(getPos q,err)) in (auto,NONE,recoverXml(c,a1,q)) end (*--------------------------------------------------------------------*) (* check for the string " if isS c1 then (true,(a1,q1)) else (false,(a1,ungetChars(q1,rev(c1::seen)))) | c::cs => if c1=c then doit (c1::seen,cs) (a1,q1) else (false,(a1,ungetChars(q1,rev(c1::seen)))) end in doit (nil,unseen) aq end (*--------------------------------------------------------------------*) (* consume the text/xml declaration. The first parameter is a pair of *) (* the function that parses the declaration and a boolean indicating *) (* whether a warning should we produced if the declaration is missing.*) (* The second parameter is a pair (seen,auto), where auto is the *) (* auto-detected encoding, and seen is SOME cs, if auto-detection *) (* found some initial characters cs of the string " raise CantOpenFile(fmsg,a) (*--------------------------------------------------------------------*) (* open the external subset; consume its text declaration if present. *) (* See 2.8: *) (* *) (* [30] extSubset ::= TextDecl? extSubsetDecl *) (* *) (* return the optional text declaration and the first char and state. *) (*--------------------------------------------------------------------*) (* might raise: NoSuchFile *) (*--------------------------------------------------------------------*) fun openSubset uri a = let val (q,auto) = pushSpecial (EXT_SUBSET,SOME uri) in findTextDecl (parseTextDecl,false) auto (a,q) end handle NoSuchFile fmsg => raise CantOpenFile(fmsg,a) (*--------------------------------------------------------------------*) (* open the document entity; consume its xml declaration if present. *) (* See 2.8: *) (* *) (* [1] document ::= prolog element Misc* *) (* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc* )? *) (* *) (* return the optional xml declaration and the first char and state. *) (*--------------------------------------------------------------------*) (* might raise: NoSuchFile *) (*--------------------------------------------------------------------*) fun openDocument uri a = let val (q,auto) = pushSpecial (DOC_ENTITY,uri) in findTextDecl (parseXmlDecl,!O_WARN_XML_DECL) auto (a,q) end handle NoSuchFile fmsg => raise CantOpenFile(fmsg,a) end (* stop of ../../Parser/Parse/parseXml.sml *) (* start of ../../Parser/Parse/parseRefs.sml *) signature ParseRefs = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseXml val parseCharRef : AppData * State -> UniChar.Char * AppData * State val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseGenRefLit : Dtd -> UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * ((int * Base.GenEntity) * (AppData * State)) val parseParRefLit : Dtd -> UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * ((int * Base.ParEntity) * (AppData * State)) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseRefs *) (* *) (* Exceptions raised by functions in this structure: *) (* parseCharRef : NoSuchChar SyntaxError *) (* parseGenRef : NoSuchEntity SyntaxState *) (* parseParRef : NoSuchEntity SyntaxState *) (* skipCharRef : none *) (* skipPS : none *) (* skipPSdec : none *) (* skipPSmay : none *) (* skipPSopt : none *) (* skipReference : none *) (*--------------------------------------------------------------------------*) functor ParseRefs (structure ParseBase : ParseBase) : ParseRefs = struct structure ParseXml = ParseXml (structure ParseBase = ParseBase) open Base Errors UniClasses ParseXml (*--------------------------------------------------------------------*) (* parse a character reference, the "&#" already read. See 4.1: *) (* *) (* [66] CharRef ::= '&#' [0-9]+ ';' *) (* | '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] *) (* *) (* Well-Formedness Constraint: Legal Character *) (* Characters referred to using character references must match the *) (* production for Char. *) (* *) (* If the character reference begins with "&#x", the digits and *) (* letters up to the terminating ; provide a hexadecimal *) (* representation of the character's code point in ISO/IEC 10646. *) (* If it begins just with "&#", the digits up to the terminating ; *) (* provide a decimal representation of the character's code point. *) (* *) (* raise SyntaxError if no number or x plus hexnum is found, or if no *) (* semicolon follows it. *) (* raise NoSuchChar if the reference is to a non-XML character. *) (* *) (* return the character referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseCharRef aq = let (*--------------------------------------------------------------*) (* parse a (hexa)decimal number, accumulating the value in the *) (* first parameter. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_n yet (c,a,q) = case hexValue c of NONE => (yet,(c,a,q)) | SOME v => do_hex_n (0wx10*yet+v) (getChar (a,q)) fun do_dec_n yet (c,a,q) = case decValue c of NONE => (yet,(c,a,q)) | SOME v => do_dec_n (0wx0A*yet+v) (getChar (a,q)) (*--------------------------------------------------------------*) (* Parse a (hexa)decimal number of at least one digit. *) (* *) (* raise SyntaxError if no hexdigit is found first. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_1 (c,a,q) = case hexValue c of SOME v => do_hex_n v (getChar (a,q)) | NONE => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expHexDigit,[c]))) in raise SyntaxError(c,a1,q) end (*--------------------------------------------------------------*) (* Parse a decimal number of at least one digit, or a hexnumber *) (* if the first character is 'x'. *) (* *) (* raise SyntaxError if neither 'x' nor digit is found first. *) (* *) (* return the number's value as a Char. *) (*--------------------------------------------------------------*) fun do_dec_1 (c,a,q) = case decValue c of SOME v => do_dec_n v (getChar (a,q)) | NONE => if c=0wx78 (* #"x" *) then do_hex_1 (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expDigitX,[c]))) in raise SyntaxError(c,a1,q) end val (ch,(c1,a1,q1)) = do_dec_1 (getChar aq) val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val _ = if isXml ch then () else let val a2 = hookError(a1,(getPos q1,ERR_NON_XML_CHARREF ch)) in raise NoSuchChar (a2,q1) end in (ch,a1,q1) end fun parseCharRefLit cs aq = let (*--------------------------------------------------------------*) (* parse a (hexa)decimal number, accumulating the value in the *) (* first parameter. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_n (cs,yet) (c,a,q) = case hexValue c of NONE => (cs,yet,(c,a,q)) | SOME v => do_hex_n (c::cs,0wx10*yet+v) (getChar (a,q)) fun do_dec_n (cs,yet) (c,a,q) = case decValue c of NONE => (cs,yet,(c,a,q)) | SOME v => do_dec_n (c::cs,0wx0A*yet+v) (getChar (a,q)) (*--------------------------------------------------------------*) (* Parse a (hexa)decimal number of at least one digit. *) (* *) (* raise SyntaxError if no hexdigit is found first. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_1 cs (c,a,q) = case hexValue c of SOME v => do_hex_n (c::cs,v) (getChar (a,q)) | NONE => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expHexDigit,[c]))) in raise SyntaxError(c,a1,q) end (*--------------------------------------------------------------*) (* Parse a decimal number of at least one digit, or a hexnumber *) (* if the first character is 'x'. *) (* *) (* raise SyntaxError if neither 'x' nor digit is found first. *) (* *) (* return the number's value as a Char. *) (*--------------------------------------------------------------*) fun do_dec_1 cs (c,a,q) = case decValue c of SOME v => do_dec_n (c::cs,v) (getChar (a,q)) | NONE => if c=0wx78 (* #"x" *) then do_hex_1 (c::cs) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expDigitX,[c]))) in raise SyntaxError(c,a1,q) end val (cs1,ch,(c1,a1,q1)) = do_dec_1 cs (getChar aq) val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val _ = if isXml ch then () else let val a2 = hookError(a1,(getPos q1,ERR_NON_XML_CHARREF ch)) in raise NoSuchChar (a2,q1) end in (c1::cs1,(ch,a1,q1)) end (*--------------------------------------------------------------------*) (* parse a general entity reference, the "&" already read. See 4.1: *) (* *) (* [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] *) (* [ VC: Entity Declared ] *) (* [ WFC: Parsed Entity ] *) (* [ WFC: No Recursion ] *) (* *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration, ... *) (* ... the declaration of a general entity must precede any *) (* reference to it which appears in a default value in an *) (* attribute-list declaration. *) (* *) (* Validity Constraint: Entity Declared *) (* In a document with an external subset or external parameter *) (* entities with "standalone='no'", the Name given in the entity *) (* reference must match that in an entity declaration. ... *) (* ... the declaration of a general entity must precede any *) (* reference to it which appears in a default value in an *) (* attribute-list declaration. *) (* *) (* Thus: in both cases it is an error if the entity is not declared. *) (* The only difference is the impact on well-formednes/validity. *) (* *) (* There are three contexts in which a general entity reference can *) (* appear: in content, in attribute value, in entity value. This *) (* passage states that it need not be declared prior to a reference *) (* in an entity value. But in this context, it is bypassed and not *) (* included, i.e., it need not be recognized. *) (* *) (* Well-Formedness Constraint: Parsed Entity *) (* An entity reference must not contain the name of an unparsed *) (* entity. Unparsed entities may be referred to only in attribute *) (* values ... *) (* *) (* Well-Formedness Constraint: No Recursion *) (* A parsed entity must not contain a recursive reference to *) (* itself, either directly or indirectly. *) (* *) (* print an error and raise SyntaxState if no name is found, or if no *) (* semicolon follows it. *) (* print an error and return GE_NULL if the reference is to an *) (* undeclared, unparsed or open entity. *) (* *) (* return the entity referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseGenRef dtd (caq as (_,_,q)) = let val (name,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val idx = GenEnt2Index dtd name val (ent,ext) = getGenEnt dtd idx val _ = (* check whether entity is undeclared/unparsed/open *) case ent of GE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () | GE_UNPARSED _ => let val err = ERR_ILLEGAL_ENTITY(ENT_UNPARSED,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end | _ => if isOpen(idx,false,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () val a2 = if ext andalso !O_VALIDATE andalso standsAlone dtd andalso inDocEntity q1 then let val _ = if !O_ERROR_MINIMIZE then setStandAlone dtd false else () in hookError(a1,(getPos q,ERR_STANDALONE_ENT(ENT_GENERAL,name))) end else a1 in ((idx,ent),(a2,q1)) end fun parseGenRefLit dtd cs (caq as (_,_,q)) = let val (cs1,name,(c1,a1,q1)) = parseNameLit cs caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val idx = GenEnt2Index dtd name val (ent,ext) = getGenEnt dtd idx val _ = (* check whether entity is undeclared/unparsed/open *) case ent of GE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () | GE_UNPARSED _ => let val err = ERR_ILLEGAL_ENTITY(ENT_UNPARSED,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end | _ => if isOpen(idx,false,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () val a2 = if ext andalso !O_VALIDATE andalso standsAlone dtd andalso inDocEntity q1 then let val _ = if !O_ERROR_MINIMIZE then setStandAlone dtd false else () in hookError(a1,(getPos q,ERR_STANDALONE_ENT(ENT_GENERAL,name))) end else a1 in (c1::cs1,((idx,ent),(a2,q1))) end (*--------------------------------------------------------------------*) (* parse a parameter entity reference, the "%" already read. See 4.1: *) (* *) (* [69] PEReference ::= '%' Name ';' [ VC: Entity Declared ] *) (* [ WFC: No Recursion ] *) (* [ WFC: In DTD ] *) (* *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration, ... *) (* The declaration of a parameter entity must precede any reference *) (* to it... *) (* *) (* Validity Constraint: Entity Declared *) (* In a document with an external subset or external parameter *) (* entities with "standalone='no'", the Name given in the entity *) (* reference must match that in an entity declaration. ... *) (* The declaration of a parameter entity must precede any reference *) (* to it... *) (* *) (* Thus: in both cases it is an error if the entity is not declared. *) (* The only difference is the impact on well-formednes/validity. *) (* Because the thing to be parsed is a parameter entity reference, *) (* this DTD has references, and thus an undeclared entity is probably *) (* a validity and not a well-formedness error. Thus setExternal must *) (* be called before determining a possible error! *) (* *) (* Well-Formedness Constraint: No Recursion *) (* A parsed entity must not contain a recursive reference to *) (* itself, either directly or indirectly. *) (* *) (* print an error and raise SyntaxError if no name is found, or if no *) (* semicolon follows it. *) (* print an error and return PE_NULL if the reference is to an *) (* undeclared or open entity. *) (* *) (* return the entity referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseParRef dtd (caq as (_,_,q)) = let val (name,(c1,a1,q1)) = parseName caq handle NotFound(c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in raise SyntaxError(c1,a2,q1) end val _ = setExternal dtd; val idx = ParEnt2Index dtd name val (ent,ext) = getParEnt dtd idx val _ = (* check whether entity is declared *) case ent of PE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_PAR_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () (* check whether the entity is already open *) | _ => if isOpen(idx,true,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () in ((idx,ent),(a1,q1)) end fun parseParRefLit dtd cs (caq as (_,_,q)) = let val (cs1,name,(c1,a1,q1)) = parseNameLit cs caq handle NotFound(c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in raise SyntaxError(c1,a2,q1) end val _ = setExternal dtd; val idx = ParEnt2Index dtd name val (ent,ext) = getParEnt dtd idx val _ = (* check whether entity is declared *) case ent of PE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_PAR_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () (* check whether the entity is already open *) | _ => if isOpen(idx,true,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () in (c1::cs1,((idx,ent),(a1,q1))) end (*--------------------------------------------------------------------*) (* skip a general/parameter entity reference, the "&/%" already read. *) (* *) (* print an error if no name is found, or if no semicolon follows it. *) (* *) (* handle any SyntaxState by returning its char and state. *) (* *) (* return the remaining state. *) (*--------------------------------------------------------------------*) fun skipReference caq = let val (_,(c1,a1,q1)) = parseName caq in if c1=0wx3B then getChar (a1,q1) else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in (c1,a2,q1) end end handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in (c,a1,q) end (*--------------------------------------------------------------------*) (* skip a character reference, the "&#" already read. See 4.1: *) (* *) (* print an error if no number or x plus hexnum is found, or if no *) (* semicolon follows it. *) (* *) (* handle any SyntaxState by returning its char and state. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) fun skipCharRef aq = let (*--------------------------------------------------------------*) (* skip a (hexa)decimal number. *) (*--------------------------------------------------------------*) fun skip_ximal isX (c,a,q) = if isX c then skip_ximal isX (getChar (a,q)) else (c,a,q) val (c1,a1,q1) = getChar aq val (c2,a2,q2) = if isDec c1 then skip_ximal isDec (getChar (a1,q1)) else if c1=0wx78 (* #"x" *) then let val (c2,a2,q2) = getChar (a1,q1) in if isHex c2 then skip_ximal isHex (getChar (a2,q2)) else let val err = ERR_EXPECTED(expHexDigit,[c2]) val a3 = hookError(a2,(getPos q2,err)) in raise SyntaxError(c2,a3,q2) end end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expDigitX,[c1]))) in raise SyntaxError (c1,a2,q1) end in if c2=0wx3B then getChar (a2,q2) else (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expSemi,[c2]))),q2) end handle SyntaxError caq => caq (*--------------------------------------------------------------------*) (* parse a sequence of white space in markup declarations. Cf. 2.3: *) (* *) (* [3] S ::= (#x20 | #x9 | #xD | #xA)+ *) (* *) (* and 2.8 states: *) (* *) (* The markup declarations may be made up in whole or in part of *) (* the replacement text of parameter entities. The productions *) (* later in this specification for individual nonterminals *) (* (elementdecl, AttlistDecl, and so on) describe the declarations *) (* after all the parameter entities have been included. *) (* *) (* in markup declarations, we thus have to include entity references *) (* and skip entity ends, except for the document end. *) (* *) (* Well-Formedness Constraint: PEs in Internal Subset *) (* In the internal DTD subset, parameter-entity references can *) (* occur only where markup declarations can occur, not within *) (* markup declarations. (This does not apply to references that *) (* occur in external parameter entities or to the external subset.) *) (* *) (* we therefore always check whether we are in the internal subset *) (* before including a parameter entity. *) (*--------------------------------------------------------------------*) (* handle a parameter entity reference *) (*--------------------------------------------------------------------*) fun doParRef dtd (caq as (c,a,q)) = if inDocEntity q then let val err = ERR_FORBIDDEN_HERE(IT_PAR_REF,LOC_INT_DECL) val a1 = hookError(a,(getPos q,err)) in skipReference (c,a1,q) end else let val ((id,ent),(a1,q1)) = parseParRef dtd caq in case ent of PE_NULL => getChar (a1,q1) | PE_INTERN (_,rep) => getChar(a1,(pushIntern(q1,id,true,rep))) | PE_EXTERN extId => #3(openExtern(id,true,resolveExtId extId) (a1,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) in (getChar(a1,q1)) end end handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------------*) (* parse optional white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return the following character and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSopt dtd caq = let fun doit (c,a,q) = case c of 0wx00 => if isSpecial q then (c,a,q) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in doit (getChar (a1,q)) end | 0wx09 => doit (getChar (a,q)) | 0wx0A => doit (getChar (a,q)) | 0wx20 => doit (getChar (a,q)) | 0wx25 (* #"%" *) => doit (doParRef dtd (getChar (a,q))) | _ => (c,a,q) in doit caq end (*--------------------------------------------------------------------*) (* parse optional white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return a boolean whether white space was actually found, and the *) (* following character with the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSmay dtd (c,a,q) = case c of 0wx00 => if isSpecial q then (false,(c,a,q)) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in (true,skipPSopt dtd (getChar (a1,q))) end | 0wx09 => (true,skipPSopt dtd (getChar (a,q))) | 0wx0A => (true,skipPSopt dtd (getChar (a,q))) | 0wx20 => (true,skipPSopt dtd (getChar (a,q))) | 0wx25 (* #"%" *) => (true,skipPSopt dtd (doParRef dtd (getChar (a,q)))) | _ => (false,(c,a,q)) (*--------------------------------------------------------------------*) (* parse required white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error and return if no white space character is found. *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return the following character and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPS dtd (c,a,q) = case c of 0wx00 => if isSpecial q then (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in skipPSopt dtd (getChar (a1,q)) end | 0wx09 => skipPSopt dtd (getChar (a,q)) | 0wx0A => skipPSopt dtd (getChar (a,q)) | 0wx20 => skipPSopt dtd (getChar (a,q)) | 0wx25 (* #"%" *) => skipPSopt dtd (doParRef dtd (getChar (a,q))) | _ => (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) (*--------------------------------------------------------------------*) (* parse required white space, taking care of a single '%' character. *) (* this is only needed before the entity name in an entity decl. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if no white space character is found. *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return a boolean whether a '%' was found, the following character *) (* and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSdec dtd caq = let fun doit req (c,a,q) = case c of 0wx00 => if isSpecial q then (false,(c,a,q)) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in doit false (getChar (a1,q)) end | 0wx09 => doit false (getChar (a,q)) | 0wx0A => doit false (getChar (a,q)) | 0wx20 => doit false (getChar (a,q)) | 0wx25 => (* #"%" *) let val (c1,a1,q1) = getChar (a,q) in if isNms c1 then doit false (doParRef dtd (c1,a1,q1)) else let val a2 = if req then hookError(a1,(getPos q,ERR_MISSING_WHITE)) else a1 in (true,(c1,a2,q1)) end end | _ => let val a1 = if req then hookError(a,(getPos q,ERR_MISSING_WHITE)) else a in (false,(c,a1,q)) end in doit true caq end end (* stop of ../../Parser/Parse/parseRefs.sml *) (* start of ../../Parser/Parse/parseLiterals.sml *) signature ParseLiterals = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseRefs val parseSystemLiteral : UniChar.Char * AppData * State -> Uri.Uri * UniChar.Char * (UniChar.Char * AppData * State) val parsePubidLiteral : UniChar.Char * AppData * State -> string * UniChar.Char * (UniChar.Char * AppData * State) val parseAttValue : Dtd -> UniChar.Char * AppData * State -> UniChar.Vector * UniChar.Data * (UniChar.Char * AppData * State) val parseEntityValue : Dtd -> (UniChar.Vector * UniChar.Vector -> 'a) -> UniChar.Char * AppData * State -> 'a * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseLiterals *) (* *) (* Exceptions raised by functions in this structure: *) (* parseSystemLiteral : NotFound *) (* parsePubidLiteral : NotFound *) (* parseAttValue : NotFound *) (* parseEntityValue : NotFound *) (*--------------------------------------------------------------------------*) functor ParseLiterals (structure ParseBase : ParseBase) : ParseLiterals = struct structure ParseRefs = ParseRefs (structure ParseBase = ParseBase) open Base UniChar Errors UniClasses Uri ParseRefs val THIS_MODULE = "ParseLiterals" (*--------------------------------------------------------------------*) (* parse a system literal, the quote character ("'" or '"') already --*) (* read and passed as first argument. cf. 2.3: *) (* *) (* ... Note that a SystemLiteral can be parsed without scanning *) (* for markup. *) (* *) (* [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") *) (* *) (* print an error and end the literal if an entity end is found. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseSystemLiteral' quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if c=0wx0 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_SYS_LIT)) in (text,(c,a1,q)) end else if c>0wx7F andalso !O_WARN_NON_ASCII_URI then let val a1 = hookWarning(a,(getPos q,WARN_NON_ASCII_URI c)) in doit (c::text) (getChar(a1,q)) end else doit (c::text) (getChar(a,q)) val (text,caq1) = doit nil (getChar aq) in (Data2Uri(rev text),quote,caq1) end (*--------------------------------------------------------------------*) (* parse a system literal. *) (* *) (* [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") *) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseSystemLiteral (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parseSystemLiteral' c (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse a pubid literal, the quote character ("'" or '"') already ---*) (* read and passed as first argument. cf. 2.3: *) (* *) (* [12] PubidLiteral ::= '"' PubidChar* '"' *) (* | "'" (PubidChar - "'")* "'" *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a non-pubid character is found. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parsePubidLiteral' quote aq = let fun doit (hadSpace,atStart,text) aq = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PUB_LIT)) in (text,(c1,a2,q1)) end | 0wx0A => doit (true,atStart,text) (a1,q1) | 0wx20 => doit (true,atStart,text) (a1,q1) | _ => if c1=quote then (text,getChar (a1,q1)) else if not (isPubid c1) then let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_PUB_LIT) val a2 = hookError(a1,(getPos q1,err)) in doit (hadSpace,atStart,text) (a2,q1) end else if hadSpace andalso not atStart then doit (false,false,c1::0wx20::text) (a1,q1) else doit (false,false,c1::text) (a1,q1) end val (text,caq1) = doit (false,true,nil) aq in (Latin2String(rev text),quote,caq1) end (*--------------------------------------------------------------------*) (* parse a pubid literal. *) (* *) (* [12] PubidLiteral ::= '"' PubidChar* '"' *) (* | "'" (PubidChar - "'")* "'" *) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parsePubidLiteral (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parsePubidLiteral' c (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse an entity value and the quote character ("'" or '"') passed *) (* as first argument. Cf. 2.3: *) (* *) (* [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'*) (* | "'" ([^%&'] | PEReference | Reference)* "'"*) (* See also 4.4.5: *) (* *) (* When ... a parameter entity reference appears in a literal *) (* entity value, its replacement text is processed in place of the *) (* reference itself as though it were part of the document at the *) (* location the reference was recognized, except that a single or *) (* double quote character in the replacement text is always treated *) (* as a normal data character and will not terminate the literal. *) (* *) (* and 4.4.7: *) (* *) (* When a general entity reference appears in the EntityValue in an *) (* entity declaration, it is bypassed and left as is. *) (* *) (* A bypassed entity ref must, however, be checked for syntactic *) (* validity, as opposed to SGML, where it is not even recognized. *) (* *) (* print an error and end the literal if an entity end is found at *) (* the toplevel. *) (* print an error if a general entity reference is ill-formed. *) (* *) (* handle any errors in references by ignoring them syntactically. *) (* *) (* return argument con applied to the entity value as a char buffer, *) (* and the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEntityValue' dtd (quote,con) aq = let fun doit (level,hadCr,lit,text) (c1,a1,q1) = case c1 of 0wx00 => if level=0 then let val err = ERR_ENDED_BY_EE LOC_ENT_VALUE val a2 = hookError(a1,(getPos q1,err)) in (lit,text,(c1,a2,q1)) end else doit (level-1,false,lit,text) (getChar (a1,q1)) | 0wx25 => (* #"%" *) let val (level1,lit1,caq2) = if inDocEntity q1 then let val err = ERR_FORBIDDEN_HERE(IT_PAR_REF,LOC_INT_DECL) val a2 = hookError(a1,(getPos q1,err)) in (level,lit,skipReference (getChar(a2,q1))) end else let val (lit1,((id,ent),(a2,q2))) = if level=0 then parseParRefLit dtd (c1::lit) (getChar(a1,q1)) else (lit,parseParRef dtd (getChar(a1,q1))) in case ent of PE_NULL => (level,lit1,getChar(a2,q2)) | PE_INTERN(_,rep) => let val q3 = pushIntern(q2,id,true,rep) in (level+1,lit1,getChar(a2,q3)) end | PE_EXTERN extId => let val fname = resolveExtId extId val caq3 = #3(openExtern (id,true,fname) (a2,q2)) in (level+1,lit1,caq3) end handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) in (level,lit1,getChar(a1,q1)) end end (* ignore syntax errors in references *) handle SyntaxError caq => (level,lit,caq) | NoSuchEntity aq => (level,lit,getChar aq) in doit (level1,false,lit1,text) caq2 end | 0wx26 => (* #"&" *) let val (c2,a2,q2) = getChar (a1,q1) in (if c2=0wx23 (* #"#" *) (*--------------------------------------------------*) (* it's a character reference. *) (*--------------------------------------------------*) then (if level=0 then let val (lit3,(ch,a3,q3)) = parseCharRefLit (c2::c1::lit) (a2,q2) in doit (level,false,lit3,ch::text) (getChar(a3,q3)) end else let val (ch,a3,q3) = parseCharRef (a2,q2) in doit (level,false,lit,ch::text) (getChar(a3,q3)) end) (* ignore errors in char references *) handle SyntaxError caq => doit (level,false,lit,text) caq | NoSuchChar aq => doit (level,false,lit,text) (getChar aq) (*-----------------------------------------------------*) (* it's a general entity reference. *) (*-----------------------------------------------------*) else let val (fnd,lit3,text3,(c3,a3,q3)) = parseEntName (c1::lit,c1::text) (c2,a2,q2) val (lit4,text4,caq4) = if not fnd then (lit,text,(c3,a3,q3)) else if c3=0wx3B (* #";" *) then (c3::lit3,c3::text3,(getChar(a3,q3))) else let val err = ERR_EXPECTED(expSemi,[c3]) val a4 = hookError(a3,(getPos q3,err)) in (lit,text,(c3,a4,q3)) end in doit (level,false,lit4,text4) caq4 end ) end | 0wx0A => doit (level,false,if level=0 then c1::lit else lit, if hadCr then text else c1::text) (getChar (a1,q1)) | 0wx0D => doit (level,true,if level=0 then c1::lit else lit,0wx0A::text) (getChar (a1,q1)) | _ => if c1=quote andalso level=0 then (lit,text,getChar(a1,q1)) else doit (level,false,if level=0 then c1::lit else lit,c1::text) (getChar (a1,q1)) val (lit,text,caq1) = doit (0,false,nil,nil) (getChar aq) val literal = Data2Vector(quote::rev(quote::lit)) val repText = Data2Vector(rev text) in (con(literal,repText),caq1) end (*--------------------------------------------------------------------*) (* parse an entity value. *) (* *) (* [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'*) (* | "'" ([^%&'] | PEReference | Reference)* "'"*) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the entity value as a char buffer, and the remaining char *) (* and state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseEntityValue dtd con (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parseEntityValue' dtd (c,con) (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse and normalize an attribute value, consume the final quote *) (* character ("'" or '""') passed in the argument. Cf. 2.3: *) (* *) (* [10] AttValue ::= '"' ([^<&""] | Reference)* '"' *) (* | "'" ([^<&'] | Reference)* "'" *) (* See also 4.4.5: *) (* *) (* When an entity reference appears in an attribute value ..., *) (* its replacement text is processed in place of the reference *) (* itself as though it were part of the document at the location *) (* the reference was recognized, except that a single or double *) (* quote character in the replacement text is always treated as a *) (* normal data character and will not terminate the literal. *) (* *) (* and 3.3.3: *) (* *) (* Before the value of an attribute is passed to the application *) (* or checked for validity, the XML processor must normalize it as *) (* follows: *) (* *) (* * a character reference is processed by appending the referenced *) (* character to the attribute value *) (* * an entity reference is processed by recursively processing the *) (* replacement text of the entity *) (* * a whitespace character (#x20, #xD, #xA, #x9) is processed by *) (* appending #x20 to the normalized value, except that only a *) (* single #x20 is appended for a "#xD#xA" sequence that is part *) (* of an external parsed entity or the literal entity value of *) (* an internal parsed entity *) (* * other characters are processed by appending them to the *) (* normalized value *) (* *) (* since #xD#xA are normalized by the parseEntityValue (internal) and *) (* getChar (external entities), we don't need to care about that. *) (*--------------------------------------------------------------------*) (* print an error and end the literal if an entity end is found. *) (* print an error if a general entity reference is ill-formed. *) (* print an error if a reference to an external or unparsed entity is *) (* found. *) (* print an error if character '<' appears literally. *) (* *) (* handle any errors in references by ignoring them syntactically. *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the list of chars in the value, and the next char and state *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseAttValue dtd (quote,a,q) = let fun doit (lhlt as (level,lit,text)) (c1,a1,q1) = case c1 of 0wx00 => if level=0 then let val err = ERR_ENDED_BY_EE LOC_ATT_VALUE val a2 = hookError(a1,(getPos q1,err)) in (lit,text,(c1,a2,q1)) end else doit (level-1,lit,text) (getChar (a1,q1)) | 0wx26 => (* #"&" *) let val (c2,a2,q2) = getChar (a1,q1) val ((level1,lit1,text1),caq3) = (if c2=0wx23 (* #"#" *) (*--------------------------------------------------*) (* it's a character reference. *) (*--------------------------------------------------*) then if level=0 then let val (lit3,(ch,a3,q3)) = parseCharRefLit (c2::c1::lit) (a2,q2) in ((level,lit3,ch::text),getChar(a3,q3)) end else let val (ch,a3,q3) = parseCharRef (a2,q2) in ((level,lit,ch::text),getChar (a3,q3)) end (*-----------------------------------------------------*) (* it's a general entity reference. *) (*-----------------------------------------------------*) else let val (lit3,((id,ent),(a3,q3))) = if level=0 then parseGenRefLit dtd (c1::lit) (c2,a2,q2) else (nil,parseGenRef dtd (c2,a2,q2)) in case ent of GE_NULL => ((level,lit3,text),getChar(a3,q3)) | GE_INTERN(_,rep) => let val q4 = pushIntern(q3,id,false,rep) in ((level+1,lit3,text),getChar (a3,q4)) end | GE_EXTERN _ => let val err = ERR_ILLEGAL_ENTITY (ENT_EXTERNAL,Index2GenEnt dtd id,LOC_ATT_VALUE) val a4 = hookError(a3,(getPos q2,err)) in ((level,lit,text),getChar (a4,q3)) end | GE_UNPARSED _ => raise InternalError (THIS_MODULE,"parseAttValue'", "parseGenRef returned GE_UNPARSED") end) (*------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*------------------------------------------------------*) handle SyntaxError caq => ((level,lit,text),caq) | NoSuchEntity aq => ((level,lit,text),getChar aq) | NoSuchChar aq => ((level,lit,text),getChar aq) in doit (level1,lit1,text1) caq3 end | 0wx3C => let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_ATT_VALUE) val a2 = hookError(a1,(getPos q1,err)) val lit1 = if level=0 then c1::lit else lit in doit (level,lit1,c1::text) (getChar (a2,q1)) end | _ => if isS c1 then doit (level,if level=0 then c1::lit else lit,0wx20::text) (getChar (a1,q1)) else (if c1=quote andalso level=0 then (lit,text,getChar (a1,q1)) else doit (level,if level=0 then c1::lit else lit,c1::text) (getChar (a1,q1))) val _ = if quote=0wx22 orelse quote=0wx27 (* "'",'"' *) then () else raise NotFound (quote,a,q) val (lit,text,caq1) = doit (0,nil,nil) (getChar(a,q)) in (Data2Vector(quote::rev(quote::lit)),rev text,caq1) end end (* stop of ../../Parser/Parse/parseLiterals.sml *) (* start of ../../Parser/Parse/parseTags.sml *) signature ParseTags = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSystemLiteral : UniChar.Char * AppData * State -> Uri.Uri * UniChar.Char * (UniChar.Char * AppData * State) val parsePubidLiteral : UniChar.Char * AppData * State -> string * UniChar.Char * (UniChar.Char * AppData * State) val parseAttValue : Dtd -> UniChar.Char * AppData * State -> UniChar.Vector * UniChar.Data * (UniChar.Char * AppData * State) val parseEntityValue : Dtd -> (UniChar.Vector * UniChar.Vector -> 'a) -> UniChar.Char * AppData * State -> 'a * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseLiterals val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseTags *) (* *) (* Exceptions raised by functions in this structure: *) (* skipTag : none *) (* parseETag : SyntaxState *) (* parseSTag : SyntaxState *) (*--------------------------------------------------------------------------*) functor ParseTags (structure ParseBase : ParseBase) : ParseTags = struct structure ParseLiterals = ParseLiterals (structure ParseBase = ParseBase) open UtilList Base Errors UniClasses ParseLiterals (*--------------------------------------------------------------------*) (* parse an end-tag, the "' *) (* *) (* and 3. states: *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching elementdecl *) (* where the Name matches the element type, and ... *) (* *) (* print an error, recover and raise SyntaxState if no name is found. *) (* print an error and recover if no ">" is found. *) (* print an error if the element is not declared. *) (* *) (* return the index of the element, and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseETag dtd aq = let val caq0 as (_,_,q0) = getChar aq val (elem,(c1,a1,q1)) = parseName caq0 handle NotFound (c,a,q) => let val err = expectedOrEnded (expAName,LOC_ETAG) c val a1 = hookError(a,(getPos q,err)) val caq1 = recoverETag (c,a1,q) in raise SyntaxError caq1 end val idx = Element2Index dtd elem val elemInfo as {decl,...} = getElement dtd idx val a1' = if isSome decl then a1 else let val a2 = if not (!O_VALIDATE andalso hasDtd dtd) then a1 else let val err = ERR_UNDECLARED(IT_ELEM,elem,LOC_ETAG) val a1' = hookError(a1,(getPos q0,err)) val _ = if not (!O_ERROR_MINIMIZE) then () else ignore (handleUndeclElement dtd idx) in a1' end in checkElemName (a2,q0) elem end val (cs,(c2,a2,q2)) = parseSopt nil (c1,a1',q1) val space = rev cs in if c2=0wx3E (* #">" *) then (idx,space,getPos q2,getChar(a2,q2)) else let val err = expectedOrEnded (expGt,LOC_ETAG) c2 val a3 = hookError(a2,(getPos q2,err)) val caq3 = recoverETag(c2,a3,q2) in (idx,space,getPos q2,caq3) end end (*--------------------------------------------------------------------*) (* parse a start-tag or an empty-element-tag, the "<" already read. *) (* 3.1: *) (* *) (* [40] STag ::= '<' Name (S Attribute)* S? '>' *) (* [ WFC: Unique Att Spec ] *) (* [41] Attribute ::= Name Eq AttValue [ VC: Attribute Value Type ] *) (* *) (* Well-Formedness Constraint: Unique Att Spec *) (* No attribute name may appear more than once in the same *) (* start-tag or empty-element tag. *) (* *) (* Validity Constraint: Attribute Value Type *) (* The attribute must have been declared; the value must be of the *) (* type declared for it. *) (* *) (* [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' *) (* [ WFC: Unique Att Spec ] *) (* *) (* and 3. states: *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching elementdecl *) (* where the Name matches the element type, and ... *) (* *) (* catch entity end exceptions in subfunctions by printing an error *) (* and re-raising the exception. *) (* *) (* print an error, recover and raise SyntaxState if no element name *) (* is found. *) (* print an error and recover if no ">" or "/>" is found. *) (* print an error and continue if no "=" is found after an att name. *) (* print an error and recover if no literal is found after the "=". *) (* print an error if white space is missing. *) (* print an error if the element is not declared. *) (* print an error and ignore the attribute if an attribute is *) (* specified twice. *) (* print an error if an attribute is not declared. *) (* *) (* return the index of the element, its ElemInfo, the list of *) (* AttSpecs (specified and omitted atts) and a boolean whether it was *) (* an empty-element-tag, together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseSTag dtd startPos (caq as (_,_,q)) = let val (elem,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = expectedOrEnded (expAName,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (_,caq1) = recoverSTag (c,a1,q) in raise SyntaxError (c,a1,q) end val eidx = Element2Index dtd elem val elemInfo as {atts,decl,...} = getElement dtd eidx val defs = case atts of NONE => nil | SOME (defs,_) => defs val (a1',elemInfo) = if isSome decl then (a1,elemInfo) else let val (a2,newInfo) = if not (!O_VALIDATE andalso hasDtd dtd) then (a1,elemInfo) else let val err = ERR_UNDECLARED(IT_ELEM,elem,LOC_STAG) val a1' = hookError(a1,(getPos q,err)) val newInfo = if not (!O_ERROR_MINIMIZE) then elemInfo else handleUndeclElement dtd eidx in (a1',newInfo) end in (checkElemName (a2,q) elem,newInfo) end val hscaq2 = parseSmay nil (c1,a1',q1) (*--------------------------------------------------------------*) (* yet are the indices of attributes encountered yet, old are *) (* the valid attributes specified yet, and todo are the defs of *) (* attributes yet to be specified. hadS indicates whether white *) (* space preceded. *) (*--------------------------------------------------------------*) fun doit (yet,old,todo) (hadS,(sp,(c,a,q))) = case c of 0wx3E (* #">" *) => (old,todo,sp,false,q,getChar(a,q)) | 0wx2F (* #"/" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx3E (* #">" *) then (old,todo,sp,true,q1,getChar(a1,q1)) else let val err = expectedOrEnded (expGt,LOC_STAG) c1 val a2 = hookError(a1,(getPos q1,err)) val (mt,caq2) = recoverSTag (c1,a2,q1) in (old,todo,sp,mt,q,caq2) end end | _ => if not (isNms c) then let val err = expectedOrEnded (expAttSTagEnd,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (mt,caq1) = recoverSTag (c,a1,q) in (old,todo,sp,mt,q,caq1) end else let(* first parse the name of the attribute *) val (att,(c1,a1,q1)) = parseName (c,a,q) val a2 = if hadS then a1 else hookError(a1,(getPos q,ERR_MISSING_WHITE)) (* now get its index, check whether it already *) (* occurred and get its definition. *) val aidx = AttNot2Index dtd att val (hadIt,a3) = if member aidx yet then (true,hookError(a2,(getPos q,ERR_MULT_ATT_SPEC att))) else (false,a2) val (def,rest) = findAndDelete (fn (i,_,_,_) => i=aidx) todo val a4 = if isSome def orelse hadIt then a3 else handleUndeclAtt dtd (a3,q) (aidx,att,eidx,elem) (* consume the " = ", ignore errors *) val (eq,caq5 as (_,_,q5)) = parseEq (c1,a4,q1) handle SyntaxError caq => ([0wx3D],caq) (* now parse the attribute value *) val (literal,value,(c6,a6,q6)) = parseAttValue dtd caq5 (* possibly make a new AttSpec *) val space = rev sp val (new,a7) = if hadIt then (old,a6) else case def of NONE => if !O_VALIDATE andalso hasDtd dtd then (old,a6) else (let val (attVal,a7) = checkAttValue dtd (a6,q5) (defaultAttDef aidx,literal,value) in ((aidx,attVal,SOME(space,eq))::old,a7) end handle AttValue a => (old,a)) | SOME ad => let val (attVal,a7) = checkAttValue dtd (a6,q5) (ad,literal,value) in ((aidx,attVal,SOME(space,eq))::old,a7) end handle AttValue a => (old,a) val hscaq8 = parseSmay nil (c6,a7,q6) in doit (aidx::yet,new,rest) hscaq8 end handle NotFound (c,a,q) (* raised by parseAttValue above *) => let val err = expectedOrEnded (expLitQuote,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (mt,caq1) = recoverSTag (c,a1,q) in (old,todo,sp,mt,q,caq1) end val (specd,todo,sp,empty,qe,(c3,a3,q3)) = doit (nil,nil,defs) hscaq2 val space = rev sp (* generate the defaults for unspecified attributes *) val (all,a4) = genMissingAtts dtd (a3,qe) (todo,rev specd) in ((((startPos,getPos q3),eidx,all,space,empty),elemInfo),(c3,a4,q3)) end (*--------------------------------------------------------------------*) (* skip a tag, the initial "<" or "" and *) (* "/>" if within a literal. *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipTag loc aq = let fun do_lit ch (c,a,q) = if c=0wx00 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE loc)) in (c,a1,q) end else if c=ch then doit (getChar(a,q)) else do_lit ch (getChar(a,q)) and doit (c,a,q) = case c of 0wx00 => let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE loc)) in (c,a1,q) end | 0wx22 (* #"\""*) => do_lit c (getChar(a,q)) | 0wx27 (* #"'" *) => do_lit c (getChar(a,q)) | 0wx2F (* #"/" *) => (case getChar(a,q) of (0wx3E,a1,q1) (* #">" *) => getChar(a1,q1) | caq1 => doit caq1) | 0wx3E (* #">" *) => getChar(a,q) | _ => doit(getChar(a,q)) in doit (getChar aq) end end (* stop of ../../Parser/Parse/parseTags.sml *) (* start of ../../Parser/Parse/parseDecl.sml *) signature ParseDecl = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseTags val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseExtIdSub : Dtd -> UniChar.Char * AppData * State -> Base.ExternalId * bool * (UniChar.Char * AppData * State) val parseEntityDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseElementDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseNotationDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseAttListDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State end (*--------------------------------------------------------------------------*) (* Structure: ParseDecl *) (* *) (* Exceptions raised by functions in this structure: *) (* skipDecl : none *) (* parseExtIdSub : NotFound SyntaxError *) (* parseEntityDecl : none *) (* parseElementDecl : none *) (* parseNotationDecl : none *) (* parseAttListDecl : none *) (*--------------------------------------------------------------------------*) functor ParseDecl (structure ParseBase : ParseBase) : ParseDecl = struct structure ParseTags = ParseTags (structure ParseBase = ParseBase) open UtilInt UtilList Base Errors HookData ParseTags (*--------------------------------------------------------------------*) (* skip a markup declaration, the initial "" if within a literal. yake care of internal subset if *) (* the first arg is true. *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipDecl hasSubset caq = let fun do_lit ch (c,a,q) = if c=0wx00 then (c,a,q) else if c=ch then getChar (a,q) else do_lit ch (getChar(a,q)) fun do_decl (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #"\""" *) => do_decl (do_lit c (getChar(a,q))) | 0wx27 (* #"'" *) => do_decl (do_lit c (getChar(a,q))) | 0wx3E (* #">" *) => getChar(a,q) | _ => do_decl (getChar(a,q)) fun do_subset (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3C (* #"<" *) => do_subset (do_decl (getChar(a,q))) | 0wx5D (* #"]" *) => getChar(a,q) | _ => do_subset (getChar(a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_DECL)),q) | 0wx22 (* #"\"""*) => doit (do_lit c (getChar(a,q))) | 0wx27 (* #"'" *) => doit (do_lit c (getChar(a,q))) | 0wx3E (* #">" *) => getChar(a,q) | 0wx5B (* #"[" *) => if hasSubset then doit (do_subset (getChar(a,q))) else doit (getChar(a,q)) | _ => doit (getChar(a,q)) in doit caq end (*--------------------------------------------------------------------*) (* parse an external id, or a public id if the first arg is true. *) (* Cf. 4.2.2 and 4.7: *) (* *) (* [75] ExternalID ::= 'SYSTEM' S SystemLiteral *) (* | 'PUBLIC' S PubidLiteral S SystemLiteral *) (* *) (* [83] PublicID ::= 'PUBLIC' S PubidLiteral *) (* *) (* raise NotFound if no name is found first. *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if a wrong name is found. *) (* print an Error and raise SyntaxState if a required literal is not *) (* found (depends on optSys). *) (* *) (* return the public and system identifiers as string options, *) (* a boolean, whether whit space followed the external id, *) (* and the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseExternalId dtd optSys (caq as (_,_,q))= let (* do not handle NotFound: in this case no extId was found *) val (name,caq1) = parseName caq val caq2 as (_,_,q2)= skipPS dtd caq1 in case name of [0wx50,0wx55,0wx42,0wx4c,0wx49,0wx43] => (* "PUBLIC" *) let val (pub,pquote,caq3) = parsePubidLiteral caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val (hadS,caq4 as (_,_,q4)) = skipPSmay dtd caq3 in let val (sys,squote,(c5,a5,q5)) = parseSystemLiteral caq4 val base = getUri q4 val a6 = if hadS then a5 else hookError(a5,(getPos q4,ERR_MISSING_WHITE)) val (hadS6,caq6) = skipPSmay dtd (c5,a6,q5) in (EXTID(SOME(pub,pquote),SOME(base,sys,squote)),hadS6,caq6) end handle NotFound (c,a,q) => (* no system id *) if optSys then (EXTID(SOME(pub,pquote),NONE),hadS,(c,a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expLitQuote,[c]))) in raise SyntaxError (c,a1,q) end end | [0wx53,0wx59,0wx53,0wx54,0wx45,0wx4d] => (* "SYSTEM" *) let val (sys,squote,caq3) = parseSystemLiteral caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val base = getUri q2 val (hadS,caq4) = skipPSmay dtd caq3 in (EXTID(NONE,SOME(base,sys,squote)),hadS,caq4) end | _ => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q,ERR_EXPECTED(expExtId,name))) in raise SyntaxError (c2,a3,q2) end end (*--------------------------------------------------------------------*) (* parse an external id in an entity definition. Cf. 4.2.2: *) (* *) (* print an Error and raise SyntaxState if no external id is found. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdEnt dtd caq = parseExternalId dtd false caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuotExt,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end (*--------------------------------------------------------------------*) (* parse an external or public id in a notation declaration. *) (* *) (* print an Error and raise SyntaxState if neither external nor *) (* public id is found. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdNot dtd caq = parseExternalId dtd true caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expExtId,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end (*--------------------------------------------------------------------*) (* parse an external id for the external subset. *) (* *) (* raise NotFound if no external id is found. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdSub dtd caq = parseExternalId dtd false caq (*--------------------------------------------------------------------*) (* parse a parameter entity declaration, starting after the '%'. The *) (* unique entity id of the initial '<' is given as first arg. 4.2: *) (* *) (* [72] PEDecl ::= '' *) (* [74] PEDef ::= EntityValue | ExternalID *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if neither entity value nor *) (* external identifier is found. *) (* print an error and raise SyntaxState if the closing '>' is missing.*) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnEntName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = ParEnt2Index dtd name val caq3 = skipPS dtd caq2 val (ent,(c4,a4,q4)) = let val (ent,caq4) = parseEntityValue dtd PE_INTERN caq3 val caq5 = skipPSopt dtd caq4 in (ent,caq5) end handle NotFound caq => let val (extId,_,caq1) = parseExtIdEnt dtd caq in (PE_EXTERN extId,caq1) end val a5 = if useParamEnts() orelse not ext then addParEnt dtd (a4,q1) (idx,ent,ext) else a4 val a6 = hookDecl(a5,((startPos,getPos q4),DEC_PAR_ENT(idx,ent,ext))) in if c4<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q4,ERR_EXPECTED(expGt,[c4]))) in raise SyntaxError(c4,a7,q4) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q4=startEnt then a6 else hookError(a6,(getPos q4,ERR_DECL_ENT_NESTING LOC_ENT_DECL)) in getChar(a7,q4) end end (*--------------------------------------------------------------------*) (* parse a general entity declaration, starting with the name. The *) (* unique entity id of the initial '<' is given as first arg. 4.2: *) (* *) (* [71] GEDecl ::= '' *) (* [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) *) (* *) (* [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation *) (* Declared ] *) (* *) (* If the NDataDecl is present, this is a general unparsed entity; *) (* otherwise it is a parsed entity. *) (* *) (* Validity Constraint: Notation Declared *) (* The Name must match the declared name of a notation. *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if neither entity value nor *) (* external identifier is found. *) (* print an error if name other then 'NDATA' is found after ext. id. *) (* print an error and raise SyntaxState if no name is found after the *) (* 'NDATA'. *) (* print an error if the notation is not declared. *) (* print an error and raise SyntaxState if the closing '>' is missing.*) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expEntNamePero,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = GenEnt2Index dtd name val caq2 = skipPS dtd caq1 val (ent,expEnd,(c3,a3,q3)) = (*-----------------------------------------------------------*) (* Try for an internal entity. Then '>' must follow. *) (*-----------------------------------------------------------*) let val (ent,caq3) = parseEntityValue dtd GE_INTERN caq2 val caq4 = skipPSopt dtd caq3 in (ent,expGt,caq4) end handle NotFound cq => (* raised by parseEntityValue *) (*-----------------------------------------------------------*) (* Must be external. First parse the external identifier. *) (*-----------------------------------------------------------*) let val (extId,hadS,caq1 as (_,_,q1)) = parseExtIdEnt dtd caq2 in let (*-----------------------------------------------------*) (* Does a name follow? Then is must be 'NDATA' and the *) (* notation name follows. Thus the entity is unparsed. *) (* Also, only '>' may come next. *) (* NotFound is handled at the end of the let. *) (*-----------------------------------------------------*) val (key,(c2,a2,q2)) = parseName caq1 val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) val a4 = if key = [0wx4e,0wx44,0wx41,0wx54,0wx41] (* "NDATA" *) then a3 else hookError(a3,(getPos q1,ERR_EXPECTED(expGtNdata,key))) val caq5 as (_,_,q5) = skipPS dtd (c2,a4,q2) val (not,caq6) = parseName caq5 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expANotName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val notIdx = AttNot2Index dtd not val caq7 = skipPSopt dtd caq6 in (GE_UNPARSED(extId,notIdx,getPos q5),expGt,caq7) end handle NotFound caq => (*--------------------------------------------------------*) (* No 'NDATA' present, so it's parsed external entity. *) (* A 'NDATA' might have followed. *) (*--------------------------------------------------------*) (GE_EXTERN extId,expGtNdata,caq) end val a4 = if useParamEnts() orelse not ext then addGenEnt dtd (a3,q) (idx,ent,ext) else a3 val a5 = hookDecl(a4,((startPos,getPos q3),DEC_GEN_ENT(idx,ent,ext))) in if c3<>0wx3E (* #">" *) then let val a6 = hookError(a5,(getPos q3,ERR_EXPECTED(expGt,[c3]))) in raise SyntaxError(c3,a6,q3) end else let val a6 = if not (!O_VALIDATE) orelse getEntId q3=startEnt then a5 else hookError(a5,(getPos q3,ERR_DECL_ENT_NESTING LOC_ENT_DECL)) in getChar(a6,q3) end end (*--------------------------------------------------------------------*) (* parse an entity declaration, the initial '' *) (* [72] PEDecl ::= '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* raise SyntaxState in case of a syntax error. *) (* print an error if white space is missing. *) (* *) (* print an error for entity end exceptions in subfunctions. *) (* catch syntax errors by recovering to the next possible state. *) (* *) (* pass control to parseParEntDecl or parseGenEntDecl, depending on *) (* whether the S is followed by a '%'. *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEntityDecl dtd pars caq = let val (hadPero,caq1) = skipPSdec dtd caq in if hadPero then parseParEntDecl dtd pars caq1 else parseGenEntDecl dtd pars caq1 end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ENT_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse a notation declaration, the initial '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error and raise SyntaxState if no notation name, no *) (* external/public identifier or no final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expANotName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = AttNot2Index dtd name val caq3 = skipPS dtd caq2 val (extId,_,(c4,a4,q4)) = parseExtIdNot dtd caq3 val a5 = if useParamEnts() orelse not ext then addNotation dtd (a4,q1) (idx,extId) else a4 val a6 = hookDecl(a5,((startPos,getPos q4),DEC_NOTATION(idx,extId,ext))) in if c4<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q4,ERR_EXPECTED(expGt,[c4]))) in raise SyntaxError (c4,a7,q4) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q4=startEnt then a6 else hookError(a6,(getPos q4,ERR_DECL_ENT_NESTING LOC_NOT_DECL)) in getChar(a7,q4) end end handle exn as SyntaxError(c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_NOT_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse a mixed-content specification, the initial '(', S? and '#' *) (* already read. The unique id of the openening paren's entity is *) (* given as first arg. Cf. 3.2.1/2: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. That is to say, if either of the opening *) (* or closing parentheses in a choice, seq, or Mixed construct is *) (* contained in the replacement text for a parameter entity, both *) (* must be contained in the same replacement text. *) (* ... *) (* [51] Mixed ::= '(' S? '#PCDATA' [ VC: Proper Group/PE *) (* (S? '|' S? Name)* S? ')*' Nesting ] *) (* | '(' S? '#PCDATA' S? ')' [ VC: No Duplicate *) (* Types ] *) (* *) (* print an error and raise SyntaxState if no name is found first. *) (* print an error if a name other than 'PCDATA' is found. *) (* is found in the first place. *) (* print an error if element names are specified but no '*' follows. *) (* print an error if an element name is specified more than once. *) (* print an error and raise SyntaxState if neither '|' nor ')' is *) (* found after the 'PCDATA' or after an element name. *) (* print an error if the closing parenthesis is not in the same *) (* as the opening one. *) (* *) (* return the mixed-content specification, togther with the next *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseMixed dtd lparEnt (caq as (_,_,q)) = let fun doit is (c,a,q) = case c of 0wx29 (* #")" *) => let val a1 = if not (!O_VALIDATE) orelse getEntId q=lparEnt then a else hookError(a,(getPos q,ERR_GROUP_ENT_NESTING LOC_MIXED)) in (rev is,getChar(a1,q)) end | 0wx7C (* #"|" *) => let val caq1 as (_,_,q1) = skipPSopt dtd (getChar(a,q)) val (name,(c2,a2,q2)) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val i = Element2Index dtd name val (newis,a3) = if not (member i is) then (i::is,a2) else let val a3 = if !O_VALIDATE then hookError(a2,(getPos q1,ERR_MULT_MIXED name)) else a2 in (is,a3) end val caq3 = skipPSopt dtd (c2,a3,q2) in doit newis caq3 end | _ => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expBarRpar,[c]))) in raise SyntaxError (c,a1,q) end val (name,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expPcdata,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val a2 = case name of [0wx50,0wx43,0wx44,0wx41,0wx54,0wx41] (* "PCDATA" *) => a1 | _ => hookError(a1,(getPos q,ERR_EXPECTED(expPcdata,name))) val caq2 = skipPSopt dtd (c1,a2,q1) val (is,(c3,a3,q3)) = doit nil caq2 val caq4 = if c3=0wx2A (* #"*" *) then getChar(a3,q3) else let val a4 = if null is then a3 else hookError(a3,(getPos q3,ERR_EXPECTED(expRep,[c3]))) in (c3,a4,q3) end in (CT_MIXED is,caq4) end (*--------------------------------------------------------------------*) (* parse an optional occurrence indicator afer a content particle or *) (* a content model, given as first argument. Cf. 3.2.1: *) (* *) (* [47] children ::= (choice | seq) ('?' | '*' | '+')? *) (* [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? *) (* *) (* return the (possibly modified) content particle, together with the *) (* next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseOcc cm (c,a,q) = case c of 0wx3F (* #"?" *) => (CM_OPT cm,getChar(a,q)) | 0wx2A (* #"*" *) => (CM_REP cm,getChar(a,q)) | 0wx2B (* #"+" *) => (CM_PLUS cm,getChar(a,q)) | _ => (cm,(c,a,q)) (*--------------------------------------------------------------------*) (* parse a content particle. Cf. 3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. ... *) (* *) (* (see also parseMixed) *) (* *) (* [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if no element name or "(" is *) (* found in the first place. *) (* *) (* return the content particle together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseCP dtd (c,a,q) = case c of 0wx28 (* #"(" *) => let val lparEnt = getEntId q val caq1 = skipPSopt dtd (getChar (a,q)) in parseGroup dtd lparEnt caq1 end | _ => (* must be an element name *) let val (name,caq1) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expElemLpar,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val idx = Element2Index dtd name in parseOcc (CM_ELEM idx) caq1 end (*--------------------------------------------------------------------*) (* parse a seq/choice, the first content particle and the connector *) (* already parsed; the connector, the type of group and the entity id *) (* of the opening parenthesis are given in first arg. Cf. 3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. ... *) (* *) (* (see also parseMixed) *) (* *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if something other than the *) (* connector or ')' is found after a content particle. *) (* print an error if the closing parenthesis of a group is not in the *) (* same entity as the opening one. *) (* *) (* return the list of content particles parsed, together with the *) (* remaining character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) and parseGroup' dtd (con,loc,lparEnt) caq = let fun doit caq = let val caq1 = skipPSopt dtd caq val (cp,caq2) = parseCP dtd caq1 val (c3,a3,q3) = skipPSopt dtd caq2 in if c3=0wx29 (* #")" ( *) then let val a4 = if not (!O_VALIDATE) orelse getEntId q3=lparEnt then a3 else hookError(a3,(getPos q3,ERR_GROUP_ENT_NESTING loc)) in ([cp],getChar(a4,q3)) end else (if c3=con then let val (cps,caq4) = doit (getChar(a3,q3)) in (cp::cps,caq4) end else let val err = ERR_EXPECTED(expConCRpar con,[c3]) in raise SyntaxError (c3,hookError(a3,(getPos q3,err)),q3) end) end in doit caq end (*--------------------------------------------------------------------*) (* parse a seq/choice, the first content particle parsed; the entity *) (* id of the opening parenthesis are given in first arg. Cf. 3.2.1: *) (* *) (* (see also parseMixed) *) (* *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if neither '|' nor ',' nor *) (* ')' follows the first content particle in a seq/choice. *) (* *) (* return the list of as a ContentModel, together with the remaining *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) and parseGroup dtd lparEnt caq = let val (cp,caq1) = parseCP dtd caq val (c2,a2,q2) = skipPSopt dtd caq1 val (group,caq3) = case c2 of 0wx29 (* #")" *) => let val a3 = if not (!O_VALIDATE) orelse getEntId q2=lparEnt then a2 else hookError(a2,(getPos q2,ERR_GROUP_ENT_NESTING LOC_SEQ)) in (CM_SEQ[cp],getChar(a3,q2)) end | 0wx2C (* #"," *) => let val (cps,caq3) = parseGroup' dtd (c2,LOC_SEQ,lparEnt) (getChar(a2,q2)) in (CM_SEQ(cp::cps),caq3) end | 0wx7C (* #"|" *) => let val (cps,caq3) = parseGroup' dtd (c2,LOC_CHOICE,lparEnt) (getChar(a2,q2)) in (CM_ALT(cp::cps),caq3) end | _ => let val a3 = hookError(a2,(getPos q2,ERR_EXPECTED(expConRpar,[c2]))) in raise SyntaxError (c2,a3,q2) end in parseOcc group caq3 end (*--------------------------------------------------------------------*) (* parse a content specification. Cf. 3.2/3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. That is to say, if either of the opening *) (* or closing parentheses in a choice, seq, or Mixed construct is *) (* contained in the replacement text for a parameter entity, both *) (* must be contained in the same replacement text. *) (* ... *) (* [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children *) (* *) (* [47] children ::= (choice | seq) ('?' | '*' | '+')? *) (* *) (* [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [ VC:Proper *) (* [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' Group/PE *) (* Nesting ]*) (* *) (* [51] Mixed ::= '(' S? '#PCDATA' [ VC: Proper Group/PE *) (* (S? '|' S? Name)* S? ')*' Nesting ] *) (* | '(' S? '#PCDATA' S? ')' [ VC: No Duplicate *) (* Types ] *) (* *) (* print an error and raise SyntaxState if no children, Mixed, or *) (* name is found. *) (* print an error and assume ANY if an ambiguous content model is *) (* specified. *) (* print an error and assume ANY if a name other than EMPTY or ANY *) (* is found. *) (* print an error if the closing parenthesis of a Mixed is not in the *) (* same entity as the opening one. *) (* *) (* return the parsed content specification, togther with the next *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseContentSpec dtd curr (c,a,q) = case c of 0wx28 (* #"(" *) => let val (c1,a1,q1) = skipPSopt dtd (getChar(a,q)) val lparEnt = getEntId q in if c1=0wx23 (* #"#" *) then parseMixed dtd lparEnt (getChar(a1,q1)) else let val (cm,(c2,a2,q2)) = parseGroup dtd lparEnt (c1,a1,q1) val (dfa,a3) = (makeDfa cm,a2) handle Ambiguous(a,n1,n2) => if !O_COMPATIBILITY then let val err = ERR_AMBIGUOUS(Index2Element dtd a,n1,n2) val a3 = hookError(a2,(getPos q,err)) val dfa = makeChoiceDfa cm in (dfa,a3) end else (makeAmbiguous cm,a2) handle DfaTooLarge max => let val a3 = if !O_DFA_WARN_TOO_LARGE then hookWarning (a2,(getPos q,WARN_DFA_TOO_LARGE(curr,max))) else a2 val dfa = makeChoiceDfa cm in (dfa,a3) end in (CT_ELEMENT(cm,dfa),(c2,a3,q2)) end end | _ => (* must be ANY or EMPTY *) let val (name,caq1 as (c1,a1,q1)) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expContSpec,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end in case name of [0wx41,0wx4e,0wx59] (* "ANY" *) => (CT_ANY,caq1) | [0wx45,0wx4d,0wx50,0wx54,0wx59] (* "EMPTY" *) => (CT_EMPTY,caq1) | _ => let val a2 = hookError(a1,(getPos q,ERR_EXPECTED(expContSpec,name))) in (CT_ANY,(c1,a2,q1)) end end (*--------------------------------------------------------------------*) (* parse an element declaration, the initial '' Element Type *) (* Declaration ] *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error and raise SyntaxState if no element name, no *) (* content specification, or no final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnElemName,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val a3 = checkElemName (a2,q1) name val idx = Element2Index dtd name val caq3 = skipPS dtd (c2,a3,q2) val (contSpec,(c4,a4,q4)) = parseContentSpec dtd name caq3 val a5 = if useParamEnts() orelse not ext then addElement dtd (a4,q1) (idx,contSpec,ext) else a4 val a5' = hookDecl(a5,((startPos,getPos q4),DEC_ELEMENT(idx,contSpec,ext))) val (c6,a6,q6) = skipPSopt dtd (c4,a5',q4) in if c6<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q6,ERR_EXPECTED(expGt,[c6]))) in raise SyntaxError(c6,a7,q6) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q6=startEnt then a6 else hookError(a6,(getPos q6,ERR_DECL_ENT_NESTING LOC_ELEM_DECL)) in getChar(a7,q6) end end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ELEM_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse an enumerated attribute type, the '(' already consumed. the *) (* 1st arg is a string describing the attribute (nmtoken or notation),*) (* the 2nd arg is a function that parses a single token, the 3rd arg *) (* a function for converting the token to its index. 3.3.1: *) (* *) (* [58] NotationType ::= 'NOTATION' S *) (* '(' S? Name (S? '|' S? Name)* S? ')' *) (* [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' *) (* *) (* print an error and raise SyntaxState if no token is found after a *) (* '(' or '|', or if neither '|' nor ')' follows a token. *) (* *) (* return the (sorted) list of indices of the parsed tokens. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseEnumerated dtd (expWhat,parseToken,Token2Index) caq = let fun doit idxs caq = let val caq1 as (_,_,q1) = skipPSopt dtd caq val (nt,(c2,a2,q2)) = parseToken caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expWhat,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val (idx,a3) = Token2Index dtd (a2,q1) nt val (c4,a4,q4) = skipPSopt dtd (c2,a3,q2) val newIdxs = insertInt(idx,idxs) in case c4 of 0wx7C (* #"|" *) => doit newIdxs (getChar(a4,q4)) | 0wx29 (* #")" *) => (newIdxs,getChar(a4,q4)) | _ => let val a5 = hookError(a4,(getPos q4,ERR_EXPECTED(expBarRpar,[c4]))) in raise SyntaxError (c4,a5,q4) end end in doit nil caq end (*--------------------------------------------------------------------*) (* Convert a (name) token to its index as an enumerated attribute. *) (* 3.3.1: *) (* *) (* Validity Constraint: Notation Attributes *) (* ... all notation names in the declaration must be declared. *) (* *) (* print an error if a notation is not declared. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun Token2NmtokenIndex dtd (a,_) token = (AttNot2Index dtd token,a) fun Token2NotationIndex dtd (a,q) token = let val idx = AttNot2Index dtd token val a1 = if not (!O_VALIDATE) orelse hasNotation dtd idx then a else hookError(a,(getPos q,ERR_UNDECLARED(IT_NOTATION,token,LOC_NONE))) in (idx,a1) end (*--------------------------------------------------------------------*) (* parse an attribute type, the 1st arg being the element this decl. *) (* refers to. 3.3.1: *) (* *) (* [54] AttType ::= StringType | TokenizedType | EnumeratedType *) (* *) (* [55] StringType ::= 'CDATA' *) (* [56] TokenizedType ::= 'ID' [VC: One ID per Element Type ] *) (* | 'IDREF' *) (* | 'IDREFS' *) (* | 'ENTITY' *) (* | 'ENTITIES' *) (* | 'NMTOKEN' *) (* | 'NMTOKENS' *) (* *) (* Validity Constraint: One ID per Element Type *) (* No element type may have more than one ID attribute specified. *) (* *) (* Enumerated Attribute Types *) (* *) (* [57] EnumeratedType ::= NotationType | Enumeration *) (* [58] NotationType ::= 'NOTATION' S '(' ... *) (* [59] Enumeration ::= '(' ... *) (* *) (* print an error and raise SyntaxState if no '(', or name is found *) (* in the first place, or the name does not start an attribute type, *) (* or if no '(' follows a 'NOTATION'. *) (* print an error and assume NMTOKEN instead of ID if the element *) (* already has an ID attribute. *) (* *) (* return the attribute type together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseAttType dtd elem (c,a,q) = if c=0wx28 (* #"(" *) then let val (idxs,caq1) = parseEnumerated dtd (expANameToken,parseNmtoken,Token2NmtokenIndex) (getChar(a,q)) in (AT_GROUP idxs,caq1) end else let val (name,caq1 as (c1,a1,q1)) = parseName (c,a,q) handle NotFound cq => let val err = ERR_EXPECTED(expAttType,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end in case name of [0wx43,0wx44,0wx41,0wx54,0wx41] (* "CDATA" *) => (AT_CDATA,caq1) | [0wx49,0wx44] (* "ID" *) => (AT_ID,caq1) | [0wx49,0wx44,0wx52,0wx45,0wx46] (* "IDREF" *) => (AT_IDREF,caq1) | [0wx49,0wx44,0wx52,0wx45,0wx46,0wx53] (* "IDREFS" *) => (AT_IDREFS,caq1) | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx59] (* "ENTITY" *) => (AT_ENTITY,caq1) | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx49,0wx45,0wx53] (* "ENTITIES" *) => (AT_ENTITIES,caq1) | [0wx4e,0wx4d,0wx54,0wx4f,0wx4b,0wx45,0wx4e] (* "NMTOKEN" *) => (AT_NMTOKEN,caq1) | [0wx4e,0wx4d,0wx54,0wx4f,0wx4b,0wx45,0wx4e,0wx53] (* "NMTOKEN" *) => (AT_NMTOKENS,caq1) | [0wx4e,0wx4f,0wx54,0wx41,0wx54,0wx49,0wx4f,0wx4e] (* "NOTATION" *) => let val (c2,a2,q2) = skipPSopt dtd caq1 in case c2 of 0wx28 (* #"(" *) => let val (idxs,caq3) = parseEnumerated dtd (expANotName,parseName,Token2NotationIndex) (getChar(a2,q2)) in (AT_NOTATION idxs,caq3) end | _ => let val err = ERR_EXPECTED(expLpar,[c2]) in raise SyntaxError(c2,hookError(a2,(getPos q2,err)),q2) end end | _ => let val a2 = hookError(a1,(getPos q,ERR_EXPECTED(expAttType,name))) in raise SyntaxError (c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse an attribute default, for an attribute whose type is given *) (* the 1st argument. Cf. 3.3.2: *) (* *) (* [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' *) (* | (('#FIXED' S)? AttValue) *) (* *) (* Validity Constraint: Attribute Default Legal *) (* The declared default value must meet the lexical constraints of *) (* the declared attribute type. *) (* *) (* and 3.3.1: *) (* *) (* Validity Constraint: ID Attribute Default *) (* An ID attribute must have a declared default of #IMPLIED or *) (* #REQUIRED. *) (* *) (* print an error and raise SyntaxState if no '#' or literal is found *) (* in the first place, or no name or a wrong name is found after the *) (* '#', or if no literal follows the 'FIXED'. *) (* print an error if white space is missing. *) (* print an error and assume IMPLIED if the default for an ID attrib. *) (* is not IMPLIED or REQUIRED. *) (* *) (* return the default together with the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseDefaultDecl dtd (aidx,attType) (c,a,q) = if c=0wx23 (* #"#" *) then let val caq0 as (_,_,q0) = (getChar(a,q)) val (name,caq1) = parseName caq0 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAttDefKey,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end in case name of [0wx46,0wx49,0wx58,0wx45,0wx44] (* "FIXED" *) => let val caq2 as (_,_,q2) = skipPS dtd caq1 val (lit,text,(c3,a3,q3)) = parseAttValue dtd caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if !O_VALIDATE andalso isIdType attType then let val a4 = hookError(a3,(getPos q,ERR_ID_DEFAULT)) in (AD_IMPLIED,(c3,a4,q3)) end else let val (cv,(av,a4)) = makeAttValue dtd (a3,q2) (aidx,attType,false,true,text) in (AD_FIXED((lit,cv,av),(getPos q2,ref false)),(c3,a4,q3)) end handle AttValue a => (AD_IMPLIED,(c3,a,q3)) end | [0wx49,0wx4d,0wx50,0wx4c,0wx49,0wx45,0wx44] (* "IMPLIED" *) => (AD_IMPLIED,caq1) | [0wx52,0wx45,0wx51,0wx55,0wx49,0wx52,0wx45,0wx44] (* "REQUIRED" *) => (AD_REQUIRED,caq1) | _ => let val (c1,a1,q1) = caq1 val a2 = hookError(a1,(getPos q0,ERR_EXPECTED(expAttDefKey,name))) in raise SyntaxError (c1,a2,q1) end end else let val (lit,text,(c1,a1,q1)) = parseAttValue dtd (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expQuoteRni,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end in if !O_VALIDATE andalso isIdType attType then let val a2 = hookError(a1,(getPos q,ERR_ID_DEFAULT)) in (AD_IMPLIED,(c1,a2,q1)) end else let val (cv,(av,a2)) = makeAttValue dtd (a1,q) (aidx,attType,false,true,text) in (AD_DEFAULT((lit,cv,av),(getPos q,ref false)),(c1,a2,q1)) end handle AttValue a => (AD_IMPLIED,(c1,a,q1)) end (*--------------------------------------------------------------------*) (* parse an attribute definition, the referred element given as 1st *) (* argument. 3.3: *) (* *) (* [53] AttDef ::= S Name S AttType S DefaultDecl *) (* *) (* raise NotFound if no name is found (and thus no attribute def.) *) (* print an error if white space is missing. *) (* *) (* enter the attribute definition into the element table. *) (* return the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseAttDef dtd (elem,ext) caq = let val (hadS,caq1 as (_,_,q1)) = skipPSmay dtd caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound falls through to the next level *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) val a4 = checkAttName (a3,q1) name val idx = AttNot2Index dtd name val caq5 = skipPS dtd (c2,a4,q2) val (attType,caq6) = parseAttType dtd elem caq5 val caq7 = skipPS dtd caq6 val (attDef,(c8,a8,q8)) = parseDefaultDecl dtd (idx,attType) caq7 val a9 = if useParamEnts() orelse not ext then addAttribute dtd (a8,q1) (elem,(idx,attType,attDef,ext)) else a8 in ((idx,attType,attDef),(c8,a9,q8)) end (*--------------------------------------------------------------------*) (* parse an attribute-list declaration, the initial '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* check whether the element already had an attlist declaration. (cf. *) (* DtdElements.enterAttDecl) *) (* *) (* print an error and raise SyntaxState if no element name, or no *) (* final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnElemName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val a3 = checkElemName (a2,q1) name val idx = Element2Index dtd name val a4 = if !O_VALIDATE orelse not ext then enterAttList dtd (a3,q1) idx else a3 fun doit attDefs caq = let val (attDef,caq1) = parseAttDef dtd (idx,ext) caq handle NotFound (c,a,q) => raise NotFound (c,hookDecl(a,((startPos,getPos q),DEC_ATTLIST(idx,rev attDefs,ext))),q) | SyntaxError (c,a,q) => raise SyntaxError (c,hookDecl(a,((startPos,getPos q),DEC_ATTLIST(idx,rev attDefs,ext))),q) in doit (attDef::attDefs) caq1 end val (c5,a5,q5) = doit nil (c2,a4,q2) handle NotFound caq => caq in if c5 <> 0wx3E (* #">" *) then let val a6 = hookError(a5,(getPos q5,ERR_EXPECTED(expAttNameGt,[c5]))) in raise SyntaxError (c5,a6,q5) end else let val a6 = if not (!O_VALIDATE) orelse getEntId q5=startEnt then a5 else hookError(a5,(getPos q5,ERR_DECL_ENT_NESTING LOC_ATT_DECL)) in getChar(a6,q5) end end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ATT_DECL)) else a in recoverDecl false (c,a,q) end end (* stop of ../../Parser/Parse/parseDecl.sml *) (* start of ../../Parser/Parse/parseDtd.sml *) signature ParseDtd = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State ----------------------------------------------------------------------*) include ParseDecl val parseDocTypeDecl : Dtd -> (UniChar.Char * AppData * State) -> int option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseDtd *) (* *) (* Exceptions raised by functions in this structure: *) (* parseDocTypeDecl : none *) (*--------------------------------------------------------------------------*) functor ParseDtd (structure ParseBase : ParseBase) : ParseDtd = struct structure ParseDecl = ParseDecl (structure ParseBase = ParseBase) open Base UniChar Errors ParseDecl (*--------------------------------------------------------------------*) (* parse a markup declaration other than a processing instruction, *) (* " (* #"-" *) let val (c1,a1,q1) = getChar (a,q) in if c1<>0wx2D (* #"-" *) then let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expDash,[c1]))) in recoverDecl false (c1,a2,q1) end else parseComment startPos (a1,q1) end | _ => let val (name,caq1) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expStartMarkup,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val ext = hasExternal dtd in case name of [0wx45,0wx4c,0wx45,0wx4d,0wx45,0wx4e,0wx54] (* "ELEMENT" *) => parseElementDecl dtd (startEnt,startPos,ext) caq1 | [0wx41,0wx54,0wx54,0wx4c,0wx49,0wx53,0wx54] (* "ATTLIST" *) => parseAttListDecl dtd (startEnt,startPos,ext) caq1 | [0wx4e,0wx4f,0wx54,0wx41,0wx54,0wx49,0wx4f,0wx4e] (* "NOTATION" *) => parseNotationDecl dtd (startEnt,startPos,ext) caq1 | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx59] (* "ENTITY" *) => parseEntityDecl dtd (startEnt,startPos,ext) caq1 | _ => let val (c1,a1,q1) = caq1 val err = ERR_EXPECTED(expStartMarkup,name) val a2 = hookError(a1,(getPos q,err)) in recoverDecl false (c1,a2,q1) end end (*--------------------------------------------------------------------*) (* skip an ignored section, starting after the '". 3.4: *) (* *) (* [63] ignoreSect ::= '' *) (* [64] ignoreSectContents ::= Ignore ('' Ignore)* *) (* [65] Ignore ::= Char* - (Char* ('') Char* ) *) (* *) (* ... If the keyword of the conditional section is IGNORE, then *) (* the contents of the conditional section are not logically part *) (* of the DTD. Note that for reliable parsing, the contents of even *) (* ignored conditional sections must be read in order to detect *) (* nested conditional sections and ensure that the end of the *) (* outermost (ignored) conditional section is properly detected. *) (* If a conditional section with a keyword of INCLUDE occurs within *) (* a larger conditional section with a keyword of IGNORE, both the *) (* outer and the inner conditional sections are ignored. *) (* *) (* print an error an finish if an entity end is encountered. *) (* *) (* return the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipIgnored caq = let (*--------------------------------------------------------------*) (* level counts the nesting of conditional sections. *) (* if the second char after a "<" ("]") is not a "[" ("]"), it *) (* can nevertheless start another delimiter and is therefore *) (* fed into a recursive call of doit. *) (*--------------------------------------------------------------*) fun doit level (c,a,q) = case c of 0wx00 => (c,hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_IGNORED)),q) | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx21 (* #"!" *) then let val (c2,a2,q2) = (getChar(a1,q1)) in if c2=0wx5B (* #"[" *) then doit (level+1) (getChar(a2,q2)) else doit level (c2,a2,q2) end else doit level (c1,a1,q1) end | 0wx5D (* #"]" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx5D (* #"]" *) then doit' level (getChar (a1,q1)) else doit level (c1,a1,q1) end | _ => doit level (getChar (a,q)) (*--------------------------------------------------------------*) (* if the second "]" is followed by a "]", then this might be *) (* the real second "]". Therefore doit' loops as long as it *) (* finds "]"'s. *) (*--------------------------------------------------------------*) and doit' level (c,a,q) = case c of 0wx3E (* #">" *) => if level>0 then doit (level-1) (getChar (a,q)) else getChar (a,q) | 0wx5D (* #"]" *) => doit' level (getChar (a,q)) | _ => doit level (c,a,q) in doit 0 caq end (*--------------------------------------------------------------------*) (* parse the internal or external subset of the dtd. handle included *) (* sections by counting their nesting level. Cf 2.8: *) (* *) (* Validity Constraint: Proper Declaration/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* markup declarations. That is to say, if either the first *) (* character or the last character of a markup declaration *) (* (markupdecl above) is contained in the replacement text for a *) (* parameter-entity reference, both must be contained in the same *) (* replacement text. *) (* ... *) (* [28] doctypedecl ::= '' *) (* [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl *) (* | NotationDecl | PI | Comment *) (* [30] extSubset ::= TextDecl? extSubsetDecl *) (* [31] extSubsetDecl ::= ( markupdecl | conditionalSect *) (* | PEReference | S )* *) (* and 3.4: *) (* *) (* [61] conditionalSect ::= includeSect | ignoreSect *) (* [62] includeSect ::= '' *) (* [63] ignoreSect ::= '' *) (* *) (* print an error and finish if the end of document is encountered in *) (* the internal subset. *) (* print an error and raise SyntaxState if a "<" is not followed by a *) (* "!" or a "?". *) (* print an error and raise SyntaxState if a "]" is not followed by *) (* "]>". *) (* print an error if a "" is found outside an included section. *) (* print an error an raise SyntaxState if something other than a *) (* markup declaration, parameter entity reference, white space or *) (* a conditional section is encountered. *) (* print an error and raise SyntaxState if a " (ws,(c,a,q)) | 0wx09 => doit false (c::ws) (getChar(a,q)) | 0wx0A => doit false (c::ws) (getChar(a,q)) | 0wx20 => doit false (c::ws) (getChar(a,q)) | 0wx25 => (ws,(c,a,q)) | 0wx3C => (ws,(c,a,q)) | 0wx5D => (ws,(c,a,q)) | _ => if hadError then doit true ws (getChar(a,q)) else let val err = ERR_FORBIDDEN_HERE(IT_DATA nil,LOC_SUBSET) val a1 = hookError (a,(getPos q,err)) in doit true ws (getChar(a1,q)) end val (ws,(c1,a1,q1)) = doit false nil caq val a2 = if null ws then a1 else hookWhite(a1,Data2Vector (rev ws)) in (c1,a2,q1) end fun doit cond (c,a,q) = case c of 0wx00 => if isSpecial q (*---------------------------------------------------*) (* the external subset ends at and of special entity.*) (* so does the internal subset, but with error. *) (*---------------------------------------------------*) then let val a1 = if inDocEntity q then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_INT_SUBSET)) else if cond=0 then a else hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_INCLUDED)) in (c,a1,q) end else let val a1 = hookEntEnd (a,getPos q) in doit cond (getChar(a1,q)) end (* ignore errors in parameter references -----------------*) | 0wx25 (* #"%" *) => let val caq2 = let val ((id,ent),(a1,q1)) = parseParRef dtd (getChar(a,q)) in if !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS then case ent of PE_NULL => getChar(a1,q1) | PE_INTERN(_,rep) => let val q2 = pushIntern(q1,id,true,rep) val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,true)) in getChar(a2,q2) end | PE_EXTERN extId => let val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,true)) val caq3 = #3(openExtern (id,true,resolveExtId extId) (a2,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) val a2 = hookEntEnd (a1,getPos q1) in (getChar(a2,q1)) end in caq3 end (* changed 080600: setExternal is already called by parseParRef *) else let val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,false)) in getChar(a2,q1) end end handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq in doit cond caq2 end | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar(a,q) in case c1 of 0wx3F => (* #"?" *) let val caq2 = parseProcInstr (getPos q) (a1,q1) in doit cond caq2 end | 0wx21 => (* #"!" *) let val (c2,a2,q2) = (getChar(a1,q1)) in if c2=0wx5B (* #"[" *) then do_cond cond q (a2,q2) else let val caq3 = parseMarkupDecl dtd (getEntId q,getPos q) (c2,a2,q2) in doit cond caq3 end end | _ => let val err = ERR_EXPECTED(expExclQuest,[c1]) val a2 = hookError(a1,(getPos q1,err)) val caq3 = recoverDecl false (c1,a2,q1) in doit cond caq3 end end | 0wx5D (* #"]" *) => do_brack cond q (getChar(a,q)) | _ => let val caq1 = do_data (c,a,q) in doit cond caq1 end and do_brack cond q0 (c,a,q) = if inDocEntity q then (c,a,q) else if c=0wx5D (* #"]" *) then let val (c1,a1,q1) = getChar(a,q) in if c1=0wx3E (* #">" *) (* ignore wrong "]]>"'s ------------------*) then if cond=0 then let val err = ERR_FORBIDDEN_HERE(IT_DATA [c,c,c1], LOC_OUT_COND) val a2 = hookError(a1,(getPos q0,err)) in doit cond (getChar(a2,q1)) end else doit (cond-1) (getChar(a1,q1)) (* the second "]" may start another "]]>" ---*) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in do_brack cond q (c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expRbrack,[c]))) in doit cond (c,a1,q) end and do_cond cond q0 (a,q) = let (* marked sections are forbidden in the internal subset. -*) val inInt = inDocEntity q val a1 = if inInt then hookError (a,(getPos q0,ERR_FORBIDDEN_HERE (IT_COND,LOC_INT_SUBSET))) else a val caq2 as (_,_,q2) = skipPSopt dtd (getChar(a1,q)) val (status,caq3) = let val (name,(c3,a3,q3)) = parseName caq2 (* ignore sections with bad status keyword ---------*) val (status,a4) = case name of [0wx49,0wx47,0wx4e,0wx4f,0wx52,0wx45] => (IGNORE,a3) | [0wx49,0wx4e,0wx43,0wx4c,0wx55,0wx44,0wx45] => (INCLUDE,a3) | _ => let val err = ERR_EXPECTED(expCondStatus,name) val a4 = hookError(a3,(getPos q2,err)) in (IGNORE,a4) end val (c5,a5,q5) = skipPSopt dtd (c3,a4,q3) in (* ignore sections without "[" after keyword -------*) if c5=0wx5B then (status,getChar(a5,q5)) else let val a6 = hookError(a5,(getPos q5,ERR_EXPECTED(expLbrack,[c5]))) in (IGNORE,(c5,a6,q5)) end end handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expCondStatus,[c]) val a1 = hookError(a,(getPos q,err)) in (IGNORE,(c,a1,q)) end in (* ignore sections in the internal subset ----------------*) case (status,inInt) of (INCLUDE,_) => doit (cond+1) caq3 | (_,_) => doit cond (skipIgnored caq3) end in doit 0 caq end (*--------------------------------------------------------------------*) (* parse the internal subset of the dtd. Cf 2.8: *) (* *) (* return the remaining character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseInternalSubset dtd (a,q) = let val a1 = hookSubset (a,getPos q) in parseSubset dtd (getChar(a1,q)) end (*--------------------------------------------------------------------*) (* parse the external subset of the dtd, the filename given as first *) (* argument. handle included sections by counting their nesting level.*) (* the file is opened on its own stack, and closed at the end. *) (* Cf 2.8: *) (* *) (* print an error and do nothing if the file cannot be opened. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseExternalSubset dtd (a,q) extId = let val uri = resolveExtId extId val (enc,textDecl,(c1,a1,q1)) = openSubset uri a val a2 = hookExtSubset (a1,(uri,enc,textDecl)) val (_,a3,q3) = parseSubset dtd (c1,a2,q1) val _ = closeAll q3 in a3 end handle CantOpenFile(fmsg,a) => hookError(a,(getPos q,ERR_NO_SUCH_FILE fmsg)) (*--------------------------------------------------------------------*) (* Parse the document type declaration, the ' *) (* *) (* print an error and raise SyntaxState if no name is found. *) (* print an error and raise SyntaxState if no final ">" is found. *) (* external identifier is found. *) (* print an error if white space is missing. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseDocTypeDecl dtd caq = let val _ = setHasDtd dtd val caq1 = skipS caq val (doc,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = Element2Index dtd doc val (hadS,caq3 as (_,_,q3)) = skipSmay caq2 val (ext,(c4,a4,q4)) = let val (extId,_,(c4,a4,q4)) = parseExtIdSub dtd caq3 val a5 = if hadS then a4 else hookError(a4,(getPos q3,ERR_MISSING_WHITE)) in (SOME extId,(c4,a5,q4)) end handle NotFound caq => (NONE,caq) val a4' = hookDocType(a4,(idx,ext)) val (c5,a5,q5) = case c4 of 0wx5B (* #"[" *) => let val caq5 = parseInternalSubset dtd (a4',q4) in skipSopt caq5 end | _ => (c4,a4',q4) val a6 = case ext of NONE => a5 | SOME extId => let val _ = setExternal dtd in if !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS then parseExternalSubset dtd (a5,q5) extId else a5 end val a7 = checkMultEnum dtd (a6,q5) val a7'= checkPreDefined dtd (a7,q5) val a8 = checkUnparsed dtd a7' val (c9,a9,q9) = if c5=0wx3E (* #">" *) then getChar(a8,q5) else let val err = expectedOrEnded(expGt,LOC_DOC_DECL) c5 val a9 = hookError(a8,(getPos q5,err)) in recoverDecl false (c5,a9,q5) end in (SOME idx,(c9,hookEndDtd(a9,getPos q9),q9)) end handle exn as SyntaxError(c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_DOC_DECL)) else a val (c2,a2,q2) = recoverDecl true (c,a1,q) in (NONE,(c2,hookEndDtd(a2,getPos q2),q2)) end end (* stop of ../../Parser/Parse/parseDtd.sml *) (* start of ../../Parser/Parse/parseContent.sml *) signature ParseContent = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseDocTypeDecl : Dtd -> (UniChar.Char * AppData * State) -> int option * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseDtd val skipBadSection : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseElement : Dtd * int list * State * (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) -> (int * UniChar.Data * Errors.Position * Errors.Position) option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseContent *) (* *) (* Exceptions raised by functions in this structure: *) (* skipBadSection : none *) (* parseElement : none *) (*--------------------------------------------------------------------------*) functor ParseContent (structure ParseBase : ParseBase) : ParseContent = struct structure ParseDtd = ParseDtd (structure ParseBase = ParseBase) open Base Errors UniChar UniClasses UtilList ParseDtd val THIS_MODULE = "ParseContent" val DATA_BUFSIZE = 1024 val dataBuffer = Array.array(DATA_BUFSIZE,0w0:UniChar.Char) (*--------------------------------------------------------------------*) (* skip a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* don't care abeout whether "CDATA[" is present. just skip until the *) (* next "]]>" or entity end. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipBadSection caq = let(*--------------------------------------------------------------*) (* for a sequence of "]"s, check whether the last two are *) (* followed by a ">" *) (*--------------------------------------------------------------*) fun checkEnd aq = let val (c1,a1,q1) = getChar aq in case c1 of 0wx3E (* #">" *) => getChar(a1,q1) | 0wx5D (* #"]" *) => checkEnd(a1,q1) | _ => doit(c1,a1,q1) end and doit (c,a,q) = case c of 0wx00 => let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_CDATA)) in (c,a1,q) end | 0wx5D (* #"]" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx5D (* #"]" *) then checkEnd(a1,q1) else doit (c1,a1,q1) end | _ => doit (getChar(a,q)) in doit caq end (*--------------------------------------------------------------------*) (* parse a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the data as a Vector option and the next char & state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseCDataSection' (aq as (_,q)) = let (*--------------------------------------------------------------*) (* for a sequence of "]"s, check whether the last two are *) (* followed by a ">" *) (*--------------------------------------------------------------*) fun doEnd (text,q0,q1) (a2,q2) = let val (c3,a3,q3) = getChar (a2,q2) in case c3 of 0wx00 => let val a4 = hookError(a3,(getPos q3,ERR_ENDED_BY_EE LOC_CDATA)) in (0wx5D::text,getPos q2,(c3,a4,q3)) end | 0wx3E => (* #">" *) (text,getPos q0,getChar(a3,q3)) | 0wx5D => doEnd (0wx5D::text,q1,q2) (a3,q3) | _ => doit (c3::0wx5D::0wx5D::text) (a3,q3) end and doBrack (text,q0) (a1,q1) = let val (c2,a2,q2) = getChar(a1,q1) in case c2 of 0wx00 => let val a3 = hookError(a2,(getPos q2,ERR_ENDED_BY_EE LOC_CDATA)) in (0wx5D::text,getPos q1,(c2,a3,q2)) end | 0wx5D (* #"]" *) => doEnd (text,q0,q1) (a2,q2) | _ => doit (c2::0wx5D::text) (a2,q2) end and doit text (a,q) = let val (c1,a1,q1) = getChar(a,q) in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_CDATA)) in (text,getPos q,(c1,a2,q1)) end | 0wx5D (* #"]" *) => doBrack (text,q) (a1,q1) | _ => doit (c1::text) (a1,q1) end val (c1,a1,q1) = getChar aq val startPos = getPos q1 val (cs,endPos,(c2,a2,q2)) = case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_CDATA)) in (nil,getPos q,(c1,a2,q1)) end | 0wx5D (* #"]" *) => doBrack (nil,q) (a1,q1) | _ => doit [c1] (a1,q1) val text = Data2Vector(rev cs) val a3 = hookCData(a1,((startPos,endPos),text)) in (c2,a3,q2) end (*--------------------------------------------------------------------*) (* parse a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* print an error and skip the section if no name or a name other *) (* than CDATA comes first, or no '[' follows the name. *) (* *) (* return the text of the section together with the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseCDataSection startPos aq = let val caq0 as (_,_,q0) = (getChar aq) val (name,(c1,a1,q1)) = parseName caq0 handle NotFound (c,a,q) => let val err = expectedOrEnded(expCdata,LOC_CDATA) c in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val _ = if name = [0wx43,0wx44,0wx41,0wx54,0wx41] (* "CDATA" *) then () else let val err = ERR_EXPECTED(expCdata,name) in raise SyntaxError(c1,hookError(a1,(getPos q0,err)),q1) end val _ = if c1=0wx5B (* #"[" *) then () else let val err = expectedOrEnded(expLbrack,LOC_CDATA) c1 in raise SyntaxError(c1,hookError(a1,(getPos q1,err)),q1) end in parseCDataSection'(a1,q1) end handle SyntaxError caq => skipBadSection caq (*--------------------------------------------------------------------*) (* parse element or empty content. The second arg holds the unique *) (* number of the element's first characters's entity, the index of *) (* the current element, and the dfa for its content. Cf. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* ... *) (* Well-Formedness Constraint: Element Type Match *) (* The Name in an element's end-tag must match the element type in *) (* the start-tag. *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching *) (* elementdecl where the Name matches the element type, and one of *) (* the following holds: *) (* *) (* 1. The declaration matches EMPTY and the element has no content. *) (* 2. The declaration matches children and the sequence of child *) (* elements belongs to the language generated by the regular *) (* expression in the content model, with optional white space *) (* (characters matching the nonterminal S) between each pair of *) (* child elements. *) (* *) (* and 3.1: *) (* *) (* [43] content ::= (element | CharData | Reference | CDSect | PI *) (* | Comment)* *) (* 2.4: *) (* The ampersand character (&) and the left angle bracket (<) may *) (* appear in their literal form only when used as markup delimiters,*) (* or within a comment, a processing instruction, or a CDATA *) (* section... If they are needed elsewhere, they must be escaped *) (* using either numeric character references or the strings "&" *) (* and "<" respectively... *) (* *) (* consume the content of the element, accumulating it via the user *) (* data functions (parameter a in subfunctions). trace the content *) (* model of the element with a dfa transitions on a dfa state (para- *) (* meter p in subfunctions). finish at the first end-tag, whether *) (* matching or not, or at the document end. *) (* *) (* handle all syntax and other recoverable errors from subfunctions *) (* and try to continue. *) (* *) (* return the accumulated user data and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseElementContent dtd (openElems,startEnt,curr,dfa,ext,mt) caq = let (*--------------------------------------------------------------*) (* check whether the dfa allows a transition/an end tag here. *) (* print an error if not. After a transition return the new *) (* dfa state. *) (*--------------------------------------------------------------*) fun fin_elem (a,pos,dfa,p) = if dfaFinal(dfa,p) then a else hookError(a,(pos,ERR_ENDED_EARLY(Index2Element dtd curr))) fun trans_elem (a,q,dfa,p,el) = let val p1 = dfaTrans(dfa,p,el) in if p1<>dfaError then (p1,a) else let val err = ERR_BAD_ELEM(Index2Element dtd curr,Index2Element dtd el) in (p1,hookError(a,(getPos q,err))) end end (*--------------------------------------------------------------*) (* consume all white space and skip all data until the next "<" *) (* or "&". print an error for each sequence of data encountered.*) (* *) (* add the white space as data to the user data. *) (* return the next char and state. *) (*--------------------------------------------------------------*) fun do_char_elem (c0,a0,q0) = let (*--------------------------------------------------------------*) (* read data characters until the next "<", "&" or entity end. *) (* add the data to the user data when an error occurs or no *) (* more data follows. *) (* *) (* return the modified user data with the next char and state. *) (*--------------------------------------------------------------*) fun data_hook(a,q,cs) = if null cs then a else hookData(a,((getPos q0,getPos q),Data2Vector(rev cs),true)) fun after_error (caq as (c,a,q)) = case c of 0wx00 => caq | 0wx26 (* #"&" *) => caq | 0wx3C (* #"<" *) => caq | _ => after_error(getChar(a,q)) fun do_data (yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(a1,q,yet),q1) | 0wx26 (* #"&" *) => (c1,data_hook(a1,q,yet),q1) | 0wx3C (* #"<" *) => (c1,data_hook(a1,q,yet),q1) | _ => if isS c1 then do_data (c1::yet,(a1,q1)) else let val a2 = data_hook(a1,q,yet) val err = ERR_ELEM_CONTENT(IT_DATA nil) val a3 = hookError(a2,(getPos q1,err)) in after_error (getChar(a3,q1)) end end in if isS c0 then let val a1 = if not (ext andalso standsAlone dtd) then a0 else let val err = ERR_STANDALONE_ELEM(Index2Element dtd curr) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a0,(getPos q0,err)) end in do_data ([c0],(a1,q0)) end else let val a1 = hookError(a0,(getPos q0,ERR_ELEM_CONTENT(IT_DATA nil))) in after_error(getChar(a1,q0)) end end (*--------------------------------------------------------------*) (* consume a reference, handling errors by ignoring them. *) (*--------------------------------------------------------------*) fun do_ref (q,(c1,a1,q1)) = if c1=0wx23 (* #"#" *) (*------------------------------------------------------*) (* it's a character reference. *) (*------------------------------------------------------*) then let val err = ERR_ELEM_CONTENT IT_CHAR_REF val a2 = hookError(a1,(getPos q,err)) in skipCharRef(a2,q1) end (*---------------------------------------------------------*) (* it's a general entity reference. *) (*---------------------------------------------------------*) else let val ((id,ent),(a2,q2)) = parseGenRef dtd (c1,a1,q1) in case ent of GE_NULL => let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,false)) in (getChar(a3,q2)) end | GE_INTERN(_,rep) => let val q3 = pushIntern(q2,id,false,rep) val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,true)) in (getChar(a3,q3)) end | GE_EXTERN ext => if !O_VALIDATE orelse !O_INCLUDE_EXT_PARSED then let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,true)) val caq4 = #3(openExtern (id,false,resolveExtId ext) (a3,q2)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a2 = hookError(a,(getPos q2,err)) val a3 = hookEntEnd(a2,getPos q2) in (getChar(a3,q2)) end in caq4 end else let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,false)) in getChar(a3,q2) end | GE_UNPARSED _ => raise InternalError (THIS_MODULE,"parseElementContent", "parseGenRef returned GE_UNPARSED") end (*-------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*-------------------------------------------------------*) handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------*) (* handle an end-tag. finish the element in the user data and *) (* return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_etag (p,etag as (elem,space,startPos,endPos),(c,a,q)) = let fun checkNesting a = if getEntId q=startEnt then a else hookError(a,(startPos,ERR_ELEM_ENT_NESTING(Index2Element dtd curr))) in if elem=curr then let val a1 = fin_elem (a,startPos,dfa,p) val a2 = checkNesting a1 val a3 = hookEndTag (a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end else if member elem openElems then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(startPos,err)) val a2 = fin_elem (a1,startPos,dfa,p) val a3 = hookEndTag(a2,((startPos,endPos),curr,NONE)) in (SOME etag,(c,a3,q)) end else if dfaFinal(dfa,p) then let val err = ERR_ELEM_TYPE_MATCH(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) val a2 = checkNesting a1 val a3 = hookEndTag(a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end else let val err = ERR_IGNORED_END_TAG(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) in do_elem(p,(c,a1,q)) end end (*--------------------------------------------------------------*) (* handle a declaration, proc. instr or tag. *) (*--------------------------------------------------------------*) and do_lt (p,q,(c1,a1,q1)) = case c1 of 0wx21 (* #"!" *) => (*------------------------------------------------------*) (* its a declaration, cdata section or comment. *) (* Only comments are valid. *) (*------------------------------------------------------*) let val (c2,a2,q2) = getChar(a1,q1) val caq3 = case c2 of 0wx2D (* #"-" *) => let val (c3,a3,q3) = getChar(a2,q2) in if c3=0wx2D then parseComment (getPos q) (a3,q3) else let val err = ERR_EXPECTED(expDash,[c3]) val a4 = hookError(a3,(getPos q3,err)) in recoverDecl false (c3,a4,q3) end end | 0wx5B (* #"[" *) => let val a3 = hookError(a2,(getPos q2,ERR_ELEM_CONTENT IT_CDATA)) in skipBadSection (getChar(a3,q2)) end | _ => (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expDash,[c2]))),q2) in do_elem(p,caq3) end | 0wx2F (* #"/" *) => (let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag (p,(elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_elem(p,caq)) | 0wx3F (* #"?" *) => do_elem (p,parseProcInstr (getPos q) (a1,q1)) | _ => (*------------------------------------------------------*) (* it's a start tag. the recursive call to parseElement *) (* might return an end-tag that has to be consumed. *) (*------------------------------------------------------*) if isNms c1 then let val (p1,(opt,caq2)) = (let val (stag as ((_,elem,_,_,_),_),(c2,a2,q2)) = parseSTag dtd (getPos q) (c1,a1,q1) val (p1,a3) = trans_elem (a2,q1,dfa,p,elem) in (p1,parseElement (dtd,curr::openElems,q,stag,(c2,a3,q2))) end) handle SyntaxError caq => (p,(NONE,caq)) in case opt of NONE => do_elem (p1,caq2) | SOME etag => do_etag (p1,etag,caq2) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,LOC_CONTENT) val a2 = hookError(a1,(getPos q,err)) in do_elem (p,(c1,a2,q1)) end (*--------------------------------------------------------------*) (* do element content. handle the document end by printing an *) (* error and finishing like with an end-tag. *) (*--------------------------------------------------------------*) and do_elem (p,(c,a,q)) = case c of 0wx00 => if isSpecial q then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(getPos q,err)) val pos = getPos q val a2 = fin_elem (a1,pos,dfa,p) val a3 = hookEndTag(a2,((pos,pos),curr,NONE)) in (NONE,(c,a3,q)) end else let val a1 = hookEntEnd(a,getPos q) in do_elem (p,getChar(a1,q)) end | 0wx26 (* #"&" *) => do_elem (p,do_ref (q,getChar(a,q))) | 0wx3C (* #"<" *) => do_lt (p,q,getChar(a,q)) | _ => do_elem (p,do_char_elem (c,a,q)) (*--------------------------------------------------------------*) (* do empty content. if the first thing to come is the current *) (* element's end-tag, finish it. Otherwise print an error and *) (* continue as for element content. *) (*--------------------------------------------------------------*) and do_empty (c,a,q) = if c<>0wx3C (* #"<" *) then let val a1 = hookError(a,(getPos q,ERR_NONEMPTY(Index2Element dtd curr))) in do_elem (dfaInitial,(c,a1,q)) end else let val (c1,a1,q1) = getChar(a,q) in if c1<>0wx2F (* #"/" *) then let val err = ERR_NONEMPTY(Index2Element dtd curr) val a2 = hookError(a1,(getPos q,err)) in do_lt (dfaInitial,q,(c1,a2,q1)) end else let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag (dfaInitial,(elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_elem (dfaInitial,caq) end in if mt then do_empty caq else do_elem (dfaInitial,caq) end (*--------------------------------------------------------------------*) (* parse mixed or any content. The second arg holds the unique number *) (* of the element's first characters's entity, the idx of the current *) (* element, and a function for validating child elements. Cf. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* ... *) (* Well-Formedness Constraint: Element Type Match *) (* The Name in an element's end-tag must match the element type in *) (* the start-tag. *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching *) (* elementdecl where the Name matches the element type, and one of *) (* the following holds: *) (* ... *) (* 3. The declaration matches Mixed and the content consists of *) (* character data and child elements whose types match names in *) (* the content model. *) (* 4. The declaration matches ANY, and the types of any child *) (* elements have been declared. *) (* *) (* 3.1: *) (* *) (* [43] content ::= (element | CharData | Reference | CDSect | PI *) (* | Comment)* *) (* 2.4: *) (* The ampersand character (&) and the left angle bracket (<) may *) (* appear in their literal form only when used as markup delimiters,*) (* or within a comment, a processing instruction, or a CDATA *) (* section... If they are needed elsewhere, they must be escaped *) (* using either numeric character references or the strings "&" *) (* and "<" respectively. The right angle bracket (>) may be *) (* represented using the string ">", and must, for compatibility,*) (* be escaped using ">" or a character reference when it appears *) (* in the string "]]>" in content, when that string is not marking *) (* the end of a CDATA section. *) (* *) (* consume the content of the element, accumulating it via the user *) (* data functions (parameter a in subfunctions). for each child, *) (* check whether it was specified in the element's Mixed content *) (* specification (validate). finish at the first end-tag, whether *) (* matching or not, or at the document end. *) (* *) (* handle all syntax and other recoverable errors from subfunctions *) (* and try to continue. *) (* *) (* return the accumulated user data and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) and parseMixedContent dtd (openElems,startEnt,curr,validate) caq = let (*--------------------------------------------------------------*) (* read data characters until the next "<", "&" or entity end. *) (* add the data to the user data when an error occurs or no *) (* more data follows. *) (* *) (* return the modified user data with the next char and state. *) (*--------------------------------------------------------------*) fun do_data (br,(c0,a0,q0)) = let val pos0 = ref (getPos q0) val _ = Array.update(dataBuffer,0,c0) fun data_hook (i,(a,q)) = hookData(a,((!pos0,getPos q),Array.extract(dataBuffer,0,SOME i),false)) fun takeOne (c,qE,i,aq as (a,q)) = if i (c1,data_hook(i,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx5D (* #"]" *) => do_br (n+1,takeOne(c1,q,i,(a1,q1))) | 0wx3E (* #">" *) => let val a2 = if n=1 then a1 else hookError(a1,(getPos q1,ERR_MUST_ESCAPE c1)) in doit (takeOne(c1,q,i,(a2,q1))) end | _ => doit (takeOne(c1,q,i,(a1,q1))) end and doit (i,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(i,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx5D (* #"]" *) => if !O_COMPATIBILITY then do_br (1,takeOne(c1,q,i,(a1,q1))) else doit (takeOne(c1,q,i,(a1,q1))) | _ => doit (takeOne(c1,q,i,(a1,q1))) end in if br then do_br (1,(1,(a0,q0))) else doit (1,(a0,q0)) end (* fun do_data (br,(c0,a0,q0)) = let fun data_hook (yet,(a,q)) = hookData(a,((getPos q0,getPos q),Data2Vector(rev yet),false)) fun do_br (n,yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(yet,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx5D (* #"]" *) => do_br (n+1,c1::yet,(a1,q1)) | 0wx3E (* #">" *) => let val a2 = if n=1 then a1 else hookError(a1,(getPos q1,ERR_MUST_ESCAPE c1)) in doit (c1::yet,(a2,q1)) end | _ => doit (c1::yet,(a1,q1)) end and doit (yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(yet,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx5D (* #"]" *) => if !O_COMPATIBILITY then do_br (1,c1::yet,(a1,q1)) else doit (c1::yet,(a1,q1)) | _ => doit (c1::yet,(a1,q1)) end in if br then do_br (1,[0wx5D],(a0,q0)) else doit ([c0],(a0,q0)) end *) (*--------------------------------------------------------------*) (* consume a reference, handling errors by ignoring them. *) (*--------------------------------------------------------------*) fun do_ref (q0,(c,a,q)) = if c=0wx23 (* #"#" *) (*------------------------------------------------------*) (* it's a character reference. *) (*------------------------------------------------------*) then let val (cs,(ch,a1,q1)) = parseCharRefLit [0wx23,0wx26] (a,q) val cv = Data2Vector(rev cs) val a2 = hookCharRef(a1,((getPos q0,getPos q1),ch,cv)) in getChar(a2,q1) end handle SyntaxError caq => caq | NoSuchChar aq => getChar aq (*---------------------------------------------------------*) (* it's a general entity reference. *) (*---------------------------------------------------------*) else let val ((id,ent),(a1,q1)) = parseGenRef dtd (c,a,q) in case ent of GE_NULL => let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,false)) in getChar(a2,q1) end | GE_INTERN(_,rep) => let val q2 = pushIntern(q1,id,false,rep) val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,true)) in getChar(a2,q2) end | GE_EXTERN ext => if !O_VALIDATE orelse !O_INCLUDE_EXT_PARSED then let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,true)) val caq3 = #3(openExtern (id,false,resolveExtId ext) (a2,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) val a2 = hookEntEnd(a1,getPos q1) in (getChar(a2,q1)) end in caq3 end else let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,false)) in getChar(a2,q1) end | GE_UNPARSED _ => raise InternalError ("THIS_MODULE","parseMixedContent", "parseGenRef returned GE_UNPARSED") end (*-------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*-------------------------------------------------------*) handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------*) (* handle an end-tag. finish the element in the user data and *) (* return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_etag (etag as (elem,space,startPos,endPos),(c,a,q)) = let fun checkNesting a = if getEntId q=startEnt then a else hookError(a,(startPos,ERR_ELEM_ENT_NESTING(Index2Element dtd curr))) in if elem=curr then let val a1 = checkNesting a val a2 = hookEndTag (a1,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a2,q)) end else if member elem openElems then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(startPos,err)) val a2 = hookEndTag(a1,((startPos,endPos),curr,NONE)) in (SOME etag,(c,a2,q)) end else let val err = ERR_ELEM_TYPE_MATCH(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) val a2 = checkNesting a1 val a3 = hookEndTag(a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end end (*--------------------------------------------------------------*) (* handle a declaration, proc. instr or tag. If it is an end- *) (* tag, finish the element in the user data and return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_lt (q,(c1,a1,q1)) = case c1 of 0wx21 (* #"!" *) => (*------------------------------------------------------*) (* its a declaration, cdata section or comment. *) (* Only comments and cdata sections are valid. *) (*------------------------------------------------------*) let val (c2,a2,q2) = getChar(a1,q1) val caq3 = case c2 of 0wx2D (* #"-" *) => let val (c3,a3,q3) = getChar(a2,q2) in if c3=0wx2D then parseComment (getPos q) (a3,q3) else let val err = ERR_EXPECTED(expDash,[c3]) val a4 = hookError(a3,(getPos q3,err)) in recoverDecl false (c3,a4,q3) end end | 0wx5B (* #"[" *) => parseCDataSection (getPos q) (a2,q2) | _ => (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expDashLbrack,[c2]))),q2) in do_mixed caq3 end | 0wx2F (* #"/" *) => (let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag ((elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_mixed caq) | 0wx3F (* #"?" *) => do_mixed (parseProcInstr (getPos q) (a1,q1)) | _ => (*------------------------------------------------------*) (* it's a start tag. the recursive call to parseElement *) (* might return an end-tag that has to be consumed. *) (*------------------------------------------------------*) if isNms c1 then let val (opt,caq2) = (let val (stag as ((_,elem,_,_,_),_),(c2,a2,q2)) = parseSTag dtd (getPos q) (c1,a1,q1) val a3 = validate (a2,q1) elem in parseElement (dtd,curr::openElems,q,stag,(c2,a3,q2)) end handle SyntaxError caq => (NONE,caq)) in case opt of NONE => do_mixed caq2 | SOME etag => do_etag (etag,caq2) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,LOC_CONTENT) val a2 = hookError(a1,(getPos q,err)) in do_mixed (c1,a2,q1) end (*--------------------------------------------------------------*) (* do mixed content. handle the document end by printing an *) (* error and finishing like with an end-tag. *) (*--------------------------------------------------------------*) and do_mixed (c,a,q) = case c of 0wx00 => if isSpecial q then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(getPos q,err)) val pos = getPos q val a2 = hookEndTag(a1,((pos,pos),curr,NONE)) in (NONE,(c,a2,q)) end else let val a1 = hookEntEnd(a,getPos q) in do_mixed (getChar(a1,q)) end | 0wx26 (* #"&" *) => do_mixed (do_ref (q,getChar(a,q))) | 0wx3C (* #"<" *) => do_lt (q,getChar(a,q)) | 0wx5D => do_mixed (do_data (!O_COMPATIBILITY,(c,a,q))) | _ => do_mixed (do_data (false,(c,a,q))) in do_mixed caq end (*--------------------------------------------------------------------*) (* parse an element, the start tag already read. the second arg holds *) (* the number of the entity of the start-tag's first char, and the *) (* start-tag information. The 1st arg is the start value for the user *) (* data. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* and 3.1: *) (* *) (* Empty-element tags may be used for any element which has no *) (* content, whether or not it is declared using the keyword EMPTY. *) (* For interoperability, the empty-element tag must be used, and *) (* can only be used, for elements which are declared EMPTY. *) (*--------------------------------------------------------------------*) and parseElement (dtd,openElems,q0,(stag as (_,curr,_,_,mt),elemInfo),(c,a,q)) = let (*--------------------------------------------------------------*) (* validate whether an element is allowed in mixed/any content. *) (*--------------------------------------------------------------*) fun trans_any (a,_) _ = a fun trans_mixed is (a,q) i = if member i is then a else let val err = ERR_BAD_ELEM(Index2Element dtd curr,Index2Element dtd i) in hookError(a,(getPos q,err)) end in (*-----------------------------------------------------------*) (* For empty-element tags, verify that the element's declar. *) (* allows empty content. *) (*-----------------------------------------------------------*) if mt then let val a1 = if not (!O_VALIDATE andalso hasDtd dtd) then a else case #decl elemInfo of (SOME(CT_EMPTY,_)) => a | (SOME(CT_ELEMENT(_,dfa),_)) => if not (dfaFinal(dfa,dfaInitial)) then hookError(a,(getPos q0,ERR_EMPTY_TAG(Index2Element dtd curr))) else if not (!O_INTEROPERABILITY) then a else hookError (a,(getPos q0,ERR_EMPTY_TAG_INTER (Index2Element dtd curr))) | _ => if not (!O_INTEROPERABILITY) then a else hookError(a,(getPos q0,ERR_EMPTY_TAG_INTER (Index2Element dtd curr))) in (NONE,(c,hookStartTag(a1,stag),q)) end (*-----------------------------------------------------------*) (* for normal start-tags, check whether the element's decl. *) (* requires an empty-element tag, or empty content, then *) (* call the appropriate function that parses the content. *) (*-----------------------------------------------------------*) else let val startEnt = getEntId q0 in if !O_VALIDATE then case getOpt(#decl elemInfo,(CT_ANY,false)) of (CT_ANY,_) => parseMixedContent dtd (openElems,startEnt,curr,trans_any) (c,hookStartTag(a,stag),q) | (CT_MIXED is,_) => parseMixedContent dtd (openElems,startEnt,curr,trans_mixed is) (c,hookStartTag(a,stag),q) | (CT_ELEMENT(_,dfa),ext) => parseElementContent dtd (openElems,startEnt,curr,dfa,ext,false) (c,hookStartTag(a,stag),q) | (CT_EMPTY,_) => let val a1 = if not (!O_INTEROPERABILITY) then a else let val err = ERR_MUST_BE_EMPTY(Index2Element dtd curr) in hookError(a,(getPos q0,err)) end val a2 = hookStartTag(a1,stag) in parseElementContent dtd (openElems,startEnt,curr,emptyDfa,false,true) (c,a2,q) end else parseMixedContent dtd (openElems,startEnt,curr,trans_any) (c,hookStartTag(a,stag),q) end end end (* stop of ../../Parser/Parse/parseContent.sml *) (* start of ../../Parser/Parse/parseDocument.sml *) (*--------------------------------------------------------------------------*) (* Structure: ParseDocument *) (* *) (* Exceptions raised by functions in this structure: *) (* parseDocTypeDecl : none *) (*--------------------------------------------------------------------------*) functor Parse (structure Dtd : Dtd structure Hooks : Hooks structure Resolve : Resolve structure ParserOptions : ParserOptions) : sig val parseDocument : Uri.Uri option -> Dtd.Dtd option -> Hooks.AppData -> Hooks.AppFinal end = struct structure ParseBase = ParseBase (structure Dtd = Dtd structure Hooks = Hooks structure Resolve = Resolve structure ParserOptions = ParserOptions) structure ParseContent = ParseContent (structure ParseBase = ParseBase) open Base UniChar Errors UniClasses Uri ParseContent val THIS_MODULE = "ParseContent" datatype Where = PROLOG | EPILOG | INSTANCE of int option fun locOf wher = case wher of PROLOG => LOC_PROLOG | INSTANCE _ => LOC_PROLOG | EPILOG => LOC_EPILOG fun checkRoot dtd (a,q) (doc,stag as ((_,elem,_,_,_),_)) = if !O_VALIDATE then case doc of NONE => a | SOME doc => if doc=elem then a else let val err = ERR_ROOT_ELEM(Index2Element dtd doc, Index2Element dtd elem) in hookError(a,(getPos q,err)) end else a fun parseDoc dtd caq = let fun do_data wher caq = let fun doit hadError ws (c,a,q) = case c of 0wx00 => (ws,(c,a,q)) | 0wx26 (* #"&" *) => (ws,(c,a,q)) | 0wx3C (* #"<" *) => (ws,(c,a,q)) | 0wx09 (* #"\t"*) => doit hadError (c::ws) (getChar(a,q)) | 0wx0A (* #"\n"*) => doit hadError (c::ws) (getChar(a,q)) | 0wx20 (* #" " *) => doit hadError (c::ws) (getChar(a,q)) | _ => let val a1 = if hadError then a else hookError(a,(getPos q,ERR_FORBIDDEN_HERE (IT_DATA nil,locOf wher))) in doit true ws (getChar(a1,q)) end val (ws,(c1,a1,q1)) = doit false nil caq val a2 = if null ws then a1 else hookWhite(a1,Data2Vector (rev ws)) in (c1,a2,q1) end fun do_decl wher q0 (c,a,q) = case c of 0wx2D (* #"-" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx2D then (wher,parseComment (getPos q0) (a1,q1)) else let val err = ERR_EXPECTED(expDash,[c1]) val a2 = hookError(a1,(getPos q1,err)) val caq2 = recoverDecl false (c1,a2,q1) in (wher,caq2) end end | 0wx5B (* #"[" *) => let val err = ERR_FORBIDDEN_HERE (IT_CDATA,locOf wher) val a1 = hookError(a,(getPos q0,err)) val caq2 = skipBadSection (getChar(a1,q)) in (wher,caq2) end | _ => case wher of PROLOG => (let val (name,(c1,a1,q1)) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = expectedOrEnded(expDashDocLbrk,LOC_DECL) c in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val _ = if name=[0wx44,0wx4f,0wx43,0wx54,0wx59,0wx50,0wx45] (* "DOCTYPE" *) then () else let val err = ERR_EXPECTED(expDashDocLbrk,name) val a2 = hookError(a1,(getPos q,err)) in raise SyntaxError (c1,a2,q1) end val (doc,caq2) = parseDocTypeDecl dtd (c1,a1,q1) in (INSTANCE doc,caq2) end handle SyntaxError caq => (PROLOG,recoverDecl true caq)) | _ => let val loc = if wher=EPILOG then LOC_EPILOG else LOC_AFTER_DTD val err = ERR_FORBIDDEN_HERE (IT_DECL,loc) val a1 = hookError(a,(getPos q0,err)) val caq2 = skipDecl true (c,a1,q) in (wher,caq2) end and doit wher (c,a,q) = case c of 0wx00 => if isSpecial q then (wher,(a,q)) else doit wher (getChar(a,q)) (*--------------------------------------------------------------*) (* References are forbidden outside the document element *) (*--------------------------------------------------------------*) | 0wx26 (* #"&" *) => let val (c1,a1,q1) = getChar(a,q) val caq2 = if c1=0wx23 (* #"#" *) then let val err = ERR_FORBIDDEN_HERE(IT_CHAR_REF,locOf wher) val a2 = hookError(a1,(getPos q,err)) in skipCharRef (a2,q1) end else let val err = ERR_FORBIDDEN_HERE(IT_REF,locOf wher) val a2 = hookError(a1,(getPos q,err)) in skipReference (c1,a2,q1) end in doit wher caq2 end | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar (a,q) in case c1 of 0wx21 (* #"!" *) => let val (wher1,caq2) = do_decl wher q (getChar(a1,q1)) in doit wher1 caq2 end | 0wx2F (* #"/" *) => let val err = ERR_FORBIDDEN_HERE(IT_ETAG,locOf wher) val a2 = hookError(a1,(getPos q,err)) val caq3 = skipTag LOC_ETAG (a2,q1) in doit wher caq3 end | 0wx3F (* #"?" *) => doit wher (parseProcInstr (getPos q) (a1,q1)) | _ => if isName c1 then let val wher1 = case wher of PROLOG => INSTANCE NONE | _ => wher in case wher1 of PROLOG => raise InternalError(THIS_MODULE,"parseDoc.doit","") | EPILOG => let val err = ERR_FORBIDDEN_HERE(IT_STAG,LOC_EPILOG) val a2 = hookError(a1,(getPos q,err)) val caq3 = skipTag LOC_STAG (a2,q1) in doit EPILOG caq3 end | INSTANCE doc => (let val a2 = if not (!O_VALIDATE) orelse isSome doc then a1 else hookError(a1,(getPos q,ERR_NO_DTD)) val (stag,(c3,a3,q3)) = parseSTag dtd (getPos q) (c1,a2,q1) val a4 = checkRoot dtd (a3,q1) (doc,stag) val (opt,(c5,a5,q5)) = parseElement (dtd,nil,q,stag,(c3,a4,q3)) val a6 = checkDefinedIds dtd (a5,q5) in case opt of NONE => doit EPILOG (c5,a6,q5) | SOME (_,_,startPos,_) => let val err = ERR_FORBIDDEN_HERE(IT_ETAG,LOC_EPILOG) val a7 = hookError(a6,(startPos,err)) in doit EPILOG (c5,a7,q5) end end handle SyntaxError caq => doit wher1 caq) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,locOf wher) val a2 = hookError(a1,(getPos q,err)) in doit wher (c1,a2,q1) end end | _ => let val caq1 = do_data wher (c,a,q) in doit wher caq1 end in doit PROLOG caq end (* to false. (cf. 2.9) *) (* *) (* ... If ... there is no standalone document declaration, the *) (* value "no" is assumed. *) fun parseDocument uriOpt dtdOpt a = let val dtd = case dtdOpt of NONE => initDtdTables () | SOME dtd => dtd val (enc,xmlDecl,(c1,a1,q1)) = openDocument uriOpt a val uri = getUri q1 val alone = case xmlDecl of (SOME(_,_,SOME sa)) => sa | _ => false val _ = if alone then setStandAlone dtd true else () val a2 = hookXml(a1,(uri,enc,xmlDecl)) val (wher,(a3,q3)) = parseDoc dtd (c1,a2,q1) val _ = closeAll q3 val a4 = case wher of EPILOG => a3 | _ => hookError(a3,(getPos q3,ERR_ENDED_IN_PROLOG)) in hookFinish a4 end handle CantOpenFile(fmsg,a) => let val a1 = hookError(a,(nullPosition,ERR_NO_SUCH_FILE fmsg)) in hookFinish a1 end end (* stop of ../../Parser/Parse/parseDocument.sml *) (* start of ../../Catalog/catError.sml *) signature CatError = sig type Position val nullPosition : Position val Position2String : Position -> string datatype Location = LOC_CATALOG | LOC_COMMENT | LOC_NOCOMMENT | LOC_PUBID | LOC_SYSID datatype Expected = EXP_NAME | EXP_LITERAL datatype CatError = ERR_DECODE_ERROR of Decode.Error.DecodeError | ERR_NO_SUCH_FILE of string * string | ERR_ILLEGAL_HERE of UniChar.Char * Location | ERR_MISSING_WHITE | ERR_EOF of Location | ERR_EXPECTED of Expected * UniChar.Char | ERR_XML of Errors.Error | ERR_MISSING_ATT of UniChar.Data * UniChar.Data | ERR_NON_PUBID of UniChar.Data * UniChar.Data val catMessage : CatError -> string list end structure CatError : CatError = struct open Errors UtilError UtilString type Position = string * int * int val nullPosition = ("",0,0) fun Position2String (fname,l,c) = if fname="" then "" else String.concat ["[",fname,":",Int2String l,".",Int2String c,"]"] datatype Location = LOC_CATALOG | LOC_COMMENT | LOC_NOCOMMENT | LOC_PUBID | LOC_SYSID fun Location2String loc = case loc of LOC_CATALOG => "catalog file" | LOC_COMMENT => "comment" | LOC_NOCOMMENT => "something other than a comment" | LOC_PUBID => "public identifier" | LOC_SYSID => "system identifier" fun InLocation2String loc = case loc of LOC_CATALOG => "in a catalog file" | LOC_COMMENT => "in a comment" | LOC_NOCOMMENT => "outside of comments" | LOC_PUBID => "in a public identifier" | LOC_SYSID => "in a system identifier" datatype Expected = EXP_NAME | EXP_LITERAL fun Expected2String exp = case exp of EXP_NAME => "a name" | EXP_LITERAL => "a literal" datatype CatError = ERR_DECODE_ERROR of Decode.Error.DecodeError | ERR_NO_SUCH_FILE of string * string | ERR_ILLEGAL_HERE of UniChar.Char * Location | ERR_MISSING_WHITE | ERR_EOF of Location | ERR_EXPECTED of Expected * UniChar.Char | ERR_XML of Error | ERR_MISSING_ATT of UniChar.Data * UniChar.Data | ERR_NON_PUBID of UniChar.Data * UniChar.Data fun catMessage err = case err of ERR_DECODE_ERROR err => Decode.Error.decodeMessage err | ERR_NO_SUCH_FILE(f,msg) => ["Could not open file",quoteErrorString f,"("^msg^")"] | ERR_ILLEGAL_HERE (c,loc) => ["Character",quoteErrorChar c,"is not allowed",InLocation2String loc] | ERR_MISSING_WHITE => ["Missing white space"] | ERR_EOF loc => [toUpperFirst (Location2String loc),"ended by end of file"] | ERR_EXPECTED (exp,c) => ["Expected",Expected2String exp,"but found",quoteErrorChar c] | ERR_XML err => errorMessage err | ERR_MISSING_ATT(elem,att) => ["Element",quoteErrorData elem,"has no",quoteErrorData att,"attribute"] | ERR_NON_PUBID(att,cs) => ["Value specified for attribute",quoteErrorData att,"contains non-PublicId", case cs of [c] => "character"^quoteErrorChar c | cs => List2xString ("characters ",", ","") quoteErrorChar cs] end (* stop of ../../Catalog/catError.sml *) (* start of ../../Catalog/catParams.sml *) signature CatParams = sig val O_CATALOG_FILES : Uri.Uri list ref val O_PREFER_SOCAT : bool ref val O_PREFER_SYSID : bool ref val O_PREFER_CATALOG : bool ref val O_SUPPORT_REMAP : bool ref val O_CATALOG_ENC : Encoding.Encoding ref val catError : CatError.Position * CatError.CatError -> unit end (* stop of ../../Catalog/catParams.sml *) (* start of ../../Unicode/Uri/uriDict.sml *) structure KeyUri : Key = struct type Key = Uri.Uri val null = Uri.emptyUri val compare = Uri.compareUri val toString = Uri.Uri2String val hash = Uri.hashUri end structure UriDict = Dict (structure Key = KeyUri) (* stop of ../../Unicode/Uri/uriDict.sml *) (* start of ../../Catalog/catData.sml *) structure CatData = struct datatype CatEntry = E_BASE of Uri.Uri | E_DELEGATE of string * Uri.Uri | E_EXTEND of Uri.Uri | E_MAP of string * Uri.Uri | E_REMAP of Uri.Uri * Uri.Uri type Catalog = Uri.Uri * CatEntry list end (* stop of ../../Catalog/catData.sml *) (* start of ../../Catalog/catFile.sml *) signature CatFile = sig type CatFile type Position val catOpenFile : Uri.Uri -> CatFile val catCloseFile : CatFile -> unit val catGetChar : CatFile -> UniChar.Char * CatFile val catPos : CatFile -> CatError.Position end functor CatFile ( structure Params : CatParams ) : CatFile = struct open UniChar CatError Decode Params Uri UtilError (* column, line, break *) type PosInfo = int * int * bool val startPos = (0,1,false) datatype CatFile = NOFILE of string * PosInfo | DIRECT of DecFile * PosInfo fun catPos cf = case cf of NOFILE (uri,(col,line,_)) => (uri,line,col) | DIRECT (dec,(col,line,_)) => (decName dec,line,col) fun catOpenFile uri = let val dec = decOpenUni(SOME uri,!O_CATALOG_ENC) in DIRECT(dec,startPos) end handle NoSuchFile fmsg => let val _ = catError(nullPosition,ERR_NO_SUCH_FILE fmsg) in NOFILE(Uri2String uri,startPos) end fun catCloseFile cf = case cf of NOFILE _ => () | DIRECT(dec,_) => ignore (decClose dec) fun catGetChar cf = case cf of NOFILE _ => (0wx00,cf) | DIRECT(dec,(col,line,brk)) => (let val (c,dec1) = decGetChar dec in case c of 0wx09 => (c,DIRECT(dec1,(col+1,line,false))) | 0wx0A => if brk then catGetChar(DIRECT(dec1,(col,line,false))) else (c,DIRECT(dec1,(0,line+1,false))) | 0wx0D => (0wx0A,DIRECT(dec1,(0,line+1,true))) | _ => if c>=0wx20 then (c,DIRECT(dec1,(col+1,line,false))) else let val err = ERR_ILLEGAL_HERE(c,LOC_CATALOG) val _ = catError(catPos cf,err) in catGetChar(DIRECT(dec1,(col+1,line,false))) end end handle DecEof dec => (0wx00,NOFILE(decName dec,(col,line,brk))) | DecError(dec,_,err) => let val _ = catError(catPos cf,ERR_DECODE_ERROR err) in catGetChar(DIRECT(dec,(col,line,false))) end ) end (* stop of ../../Catalog/catFile.sml *) (* start of ../../Catalog/socatParse.sml *) signature SocatParse = sig val parseSoCat : Uri.Uri -> CatData.Catalog end functor SocatParse ( structure Params : CatParams ) : SocatParse = struct structure CatFile = CatFile ( structure Params = Params ) open CatData CatError CatFile Params UniChar UniClasses Uri exception SyntaxError of UniChar.Char * CatFile.CatFile exception NotFound of UniChar.Char * CatFile.CatFile val getChar = catGetChar fun parseName' (c,f) = if isName c then let val (cs,cf1) = parseName' (getChar f) in (c::cs,cf1) end else (nil,(c,f)) fun parseName (c,f) = if isNms c then let val (cs,cf1) = parseName' (getChar f) in (c::cs,cf1) end else raise NotFound (c,f) datatype Keyword = KW_BASE | KW_CATALOG | KW_DELEGATE | KW_PUBLIC | KW_SYSTEM | KW_OTHER of UniChar.Data fun parseKeyword cf = let val (name,cf1) = parseName cf val kw = case name of [0wx42,0wx41,0wx53,0wx45] => KW_BASE | [0wx43,0wx41,0wx54,0wx41,0wx4c,0wx4f,0wx47] => KW_CATALOG | [0wx44,0wx45,0wx4c,0wx45,0wx47,0wx41,0wx54,0wx45] => KW_DELEGATE | [0wx50,0wx55,0wx42,0wx4c,0wx49,0wx43] => KW_PUBLIC | [0wx53,0wx59,0wx53,0wx54,0wx45,0wx4d] => KW_SYSTEM | _ => KW_OTHER name in (kw,cf1) end fun parseSysLit' quote f = let fun doit text (c,f) = if c=quote then (text,getChar f) else if c<>0wx0 then doit (c::text) (getChar f) else let val _ = catError(catPos f,ERR_EOF LOC_SYSID) in (text,(c,f)) end val (text,cf1) = doit nil (getChar f) in (Data2Uri(rev text),cf1) end fun parseSysLit req (c,f) = if c=0wx22 orelse c=0wx27 then parseSysLit' c f else if req then let val _ = catError(catPos f,ERR_EXPECTED(EXP_LITERAL,c)) in raise SyntaxError (c,f) end else raise NotFound (c,f) fun parsePubLit' quote f = let fun doit (hadSpace,atStart,text) (c,f) = case c of 0wx0 => let val _ = catError(catPos f,ERR_EOF LOC_PUBID) in (text,(c,f)) end | 0wx0A => doit (true,atStart,text) (getChar f) | 0wx20 => doit (true,atStart,text) (getChar f) | _ => if c=quote then (text,getChar f) else if isPubid c then if hadSpace andalso not atStart then doit (false,false,c::0wx20::text) (getChar f) else doit (false,false,c::text) (getChar f) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_PUBID)) in doit (hadSpace,atStart,text) (getChar f) end val (text,cf1) = doit (false,true,nil) (getChar f) in (Latin2String(rev text),cf1) end fun parsePubLit (c,f) = if c=0wx22 orelse c=0wx27 then parsePubLit' c f else let val _ = catError(catPos f,ERR_EXPECTED(EXP_LITERAL,c)) in raise SyntaxError (c,f) end fun skipComment (c,f) = case c of 0wx00 => let val _ = catError(catPos f,ERR_EOF LOC_COMMENT) in (c,f) end | 0wx2D => let val (c1,f1) = getChar f in if c1 = 0wx2D then (getChar f1) else skipComment (c1,f1) end | _ => skipComment (getChar f) fun skipCopt (c,f) = case c of 0wx00 => (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then skipComment (getChar f1) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in (c1,f1) end end | _ => (c,f) fun skipScomm req0 cf = let fun endit req (c,f) = if req andalso c<>0wx00 then let val _ = catError(catPos f,ERR_MISSING_WHITE) in (c,f) end else (c,f) fun doit req (c,f) = case c of 0wx00 => endit req (c,f) | 0wx09 => doit false (getChar f) | 0wx0A => doit false (getChar f) | 0wx20 => doit false (getChar f) | 0wx22 => endit req (c,f) | 0wx27 => endit req (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then let val _ = if not req then () else catError(catPos f1,ERR_MISSING_WHITE) val cf1 = skipComment (getChar f1) in doit true cf1 end else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in doit req (c1,f1) end end | _ => if isNms c then endit req (c,f) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in doit req (getChar f) end in doit req0 cf end val skipWS = skipScomm true val skipCommWS = (skipScomm false) o skipCopt val skipWSComm = skipScomm false fun skipOther cf = let val cf1 = skipWS cf val cf2 = let val (_,cf') = parseName cf1 in skipWS cf' end handle NotFound cf => cf fun doit cf = let val (_,cf1) = parseSysLit false cf in doit (skipWS cf1) end handle NotFound(c,f) => (c,f) in (NONE,doit cf2) end fun parseBase cf = let val cf1 = skipWS cf val (lit,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 in (SOME(E_BASE lit),cf3) end fun parseExtend cf = let val cf1 = skipWS cf val (lit,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 in (SOME(E_EXTEND lit),cf3) end fun parseDelegate cf = let val cf1 = skipWS cf val (pub,cf2) = parsePubLit cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_DELEGATE(pub,sys)),cf5) end fun parseRemap cf = let val cf1 = skipWS cf val (sys0,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_REMAP(sys0,sys)),cf5) end fun parseMap cf = let val cf1 = skipWS cf val (pub,cf2) = parsePubLit cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_MAP(pub,sys)),cf5) end fun recover cf = let fun do_lit q (c,f) = if c=0wx00 then (c,f) else if c=q then getChar f else do_lit q (getChar f) fun do_com (c,f) = case c of 0wx00 => (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then getChar f1 else do_com (c1,f1) end | _ => do_com (getChar f) fun doit (c,f) = case c of 0wx00 => (c,f) | 0wx22 => doit (do_lit c (getChar f)) | 0wx27 => doit (do_lit c (getChar f)) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then doit (do_com (getChar f1)) else doit (c1,f1) end | _ => if isNms c then (c,f) else doit (getChar f) in doit cf end fun parseEntry (cf as (c,f)) = let val (kw,cf1) = parseKeyword cf handle NotFound cf => raise SyntaxError cf in case kw of KW_BASE => parseBase cf1 | KW_CATALOG => parseExtend cf1 | KW_DELEGATE => parseDelegate cf1 | KW_SYSTEM => parseRemap cf1 | KW_PUBLIC => parseMap cf1 | KW_OTHER _ => skipOther cf1 end handle SyntaxError cf => (NONE,recover cf) fun parseDocument cf = let fun doit (c,f) = if c=0wx0 then nil before catCloseFile f else let val (opt,cf1) = parseEntry (c,f) val entries = doit cf1 in case opt of NONE => entries | SOME entry => entry::entries end val cf1 = skipCommWS cf in doit cf1 end fun parseSoCat uri = let val f = catOpenFile uri val cf1 = getChar f in (uri,parseDocument cf1) end end (* stop of ../../Catalog/socatParse.sml *) (* start of ../../Catalog/catDtd.sml *) signature CatDtd = sig type Dtd val baseIdx : int val delegateIdx : int val extendIdx : int val mapIdx : int val remapIdx : int val hrefIdx : int val pubidIdx : int val sysidIdx : int val Index2AttNot : Dtd -> int -> UniChar.Data val Index2Element : Dtd -> int -> UniChar.Data end structure CatDtd = struct open Dtd val baseGi = UniChar.String2Data "Base" val delegateGi = UniChar.String2Data "Delegate" val extendGi = UniChar.String2Data "Extend" val mapGi = UniChar.String2Data "Map" val remapGi = UniChar.String2Data "Remap" val hrefAtt = UniChar.String2Data "HRef" val pubidAtt = UniChar.String2Data "PublicId" val sysidAtt = UniChar.String2Data "SystemId" fun initDtdTables () = let val dtd = Dtd.initDtdTables() val _ = app (ignore o (Element2Index dtd)) [baseGi,delegateGi,extendGi,mapGi,remapGi] val _ = app (ignore o (AttNot2Index dtd)) [hrefAtt,pubidAtt,sysidAtt] in dtd end local val dtd = initDtdTables() in val baseIdx = Element2Index dtd baseGi val delegateIdx = Element2Index dtd delegateGi val extendIdx = Element2Index dtd extendGi val mapIdx = Element2Index dtd mapGi val remapIdx = Element2Index dtd remapGi val hrefIdx = AttNot2Index dtd hrefAtt val pubidIdx = AttNot2Index dtd pubidAtt val sysidIdx = AttNot2Index dtd sysidAtt end end (* stop of ../../Catalog/catDtd.sml *) (* start of ../../Parser/Params/ignore.sml *) structure IgnoreHooks = struct type AppData = unit type AppFinal = unit fun hookXml(a,_) = a fun hookFinish a = a fun hookError(a,_) = a fun hookWarning(a,_) = a fun hookProcInst(a,_) = a fun hookComment(a,_) = a fun hookWhite(a,_) = a fun hookDecl (a,_) = a fun hookStartTag(a,_) = a fun hookEndTag(a,_) = a fun hookCData(a,_) = a fun hookData(a,_) = a fun hookCharRef(a,_) = a fun hookGenRef(a,_) = a fun hookParRef(a,_) = a fun hookEntEnd(a,_) = a fun hookDocType(a,_) = a fun hookSubset(a,_) = a fun hookExtSubset(a,_) = a fun hookEndDtd(a,_) = a end (* stop of ../../Parser/Params/ignore.sml *) (* start of ../../Catalog/catHooks.sml *) signature CatHooks = sig type AppData = CatData.CatEntry list val initCatHooks : unit -> AppData end functor CatHooks (structure Params : CatParams structure Dtd : CatDtd ) = struct open Dtd HookData IgnoreHooks Params UniChar UniClasses Uri UtilList CatData CatError type AppData = Dtd * CatEntry list type AppFinal = CatEntry list fun initCatHooks dtd = (dtd,nil) fun hookError (a,(pos,err)) = a before catError (pos,ERR_XML err) fun getAtt dtd (pos,elem,att,trans) atts = let val cvOpt = findAndMap (fn (i,ap,_) => if i<>att then NONE else case ap of AP_DEFAULT(_,cv,_) => SOME cv | AP_PRESENT(_,cv,_) => SOME cv | _ => NONE) atts in case cvOpt of SOME cv => trans (pos,att) cv | NONE => NONE before catError (pos,ERR_MISSING_ATT(Index2Element dtd elem,Index2AttNot dtd att)) end fun makePubid dtd (pos,att) cv = let val (cs,bad) = Vector.foldr (fn (c,(cs,bad)) => if isPubid c then (Char2char c::cs,bad) else (cs,c::bad)) (nil,nil) cv in if null bad then SOME(String.implode cs) else NONE before catError(pos,ERR_NON_PUBID(Index2AttNot dtd att,bad)) end fun makeUri (pos,att) cv = SOME cv fun hookStartTag (a as (dtd,items),((_,pos),elem,atts,_,_)) = if elem=baseIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts in case hrefOpt of NONE => a | SOME href => (dtd,E_BASE (Vector2Uri href)::items) end else if elem=delegateIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val pubidOpt = getAtt dtd (pos,elem,pubidIdx,makePubid dtd) atts in case (hrefOpt,pubidOpt) of (SOME href,SOME pubid) => (dtd,E_DELEGATE(pubid,Vector2Uri href)::items) | _ => a end else if elem=extendIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts in case hrefOpt of NONE => a | SOME href => (dtd,E_EXTEND (Vector2Uri href)::items) end else if elem=mapIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val pubidOpt = getAtt dtd (pos,elem,pubidIdx,makePubid dtd) atts in case (hrefOpt,pubidOpt) of (SOME href,SOME pubid) => (dtd,E_MAP(pubid,Vector2Uri href)::items) | _ => a end else if elem=remapIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val sysidOpt = getAtt dtd (pos,elem,sysidIdx,makeUri) atts in case (hrefOpt,sysidOpt) of (SOME href,SOME sysid) => (dtd,E_REMAP(Vector2Uri sysid,Vector2Uri href)::items) | _ => a end else a fun hookFinish (_,items) = rev items end (* stop of ../../Catalog/catHooks.sml *) (* start of ../../Catalog/catParse.sml *) signature CatParse = sig val parseCatalog : Uri.Uri -> CatData.Catalog end functor CatParse (structure Params : CatParams) : CatParse = struct structure SocatParse = SocatParse (structure Params = Params) structure ParserOptions = struct structure Options = ParserOptions() open Options local fun setDefaults() = let val _ = setParserDefaults() val _ = O_WARN_MULT_ENUM := false val _ = O_WARN_XML_DECL := false val _ = O_WARN_ATT_NO_ELEM := false val _ = O_WARN_MULT_ENT_DECL := false val _ = O_WARN_MULT_NOT_DECL := false val _ = O_WARN_MULT_ATT_DEF := false val _ = O_WARN_MULT_ATT_DECL := false val _ = O_WARN_SHOULD_DECLARE := false val _ = O_VALIDATE := false val _ = O_COMPATIBILITY := false val _ = O_INTEROPERABILITY := false val _ = O_INCLUDE_EXT_PARSED := true in () end in val setParserDefaults = setDefaults end end structure CatHooks = CatHooks (structure Params = Params structure Dtd = CatDtd) structure Parse = Parse (structure Dtd = CatDtd structure Hooks = CatHooks structure Resolve = ResolveNull structure ParserOptions = ParserOptions) open CatHooks CatDtd Parse ParserOptions SocatParse Uri fun parseXmlCat uri = let val _ = setParserDefaults() val dtd = initDtdTables() val items = parseDocument (SOME uri) (SOME dtd) (initCatHooks dtd) in (uri,items) end fun isSocatSuffix x = x="soc" orelse x="SOC" fun isXmlSuffix x = x="xml" orelse x="XML" fun parseCatalog uri = let val suffix = uriSuffix uri in if isSocatSuffix suffix then parseSoCat uri else (if isXmlSuffix suffix then parseXmlCat uri else (if !O_PREFER_SOCAT then parseSoCat uri else parseXmlCat uri)) end end (* stop of ../../Catalog/catParse.sml *) (* start of ../../Catalog/catalog.sml *) signature Catalog = sig val resolveExtId : string option * (Uri.Uri * Uri.Uri) option -> Uri.Uri option end functor Catalog ( structure Params : CatParams ) : Catalog = struct structure CatParse = CatParse ( structure Params = Params ) open CatData CatParse Params Uri UriDict val catDict = makeDict("catalog",6,NONE:Catalog option) fun getCatalog uri = let val idx = getIndex(catDict,uri) in case getByIndex(catDict,idx) of SOME cat => cat | NONE => let val cat = parseCatalog uri val _ = setByIndex(catDict,idx,SOME cat) in cat end end datatype SearchType = SYS of Uri | PUB of string datatype SearchResult = FOUND of Uri * Uri | NOTFOUND of Uri list fun searchId id = let fun searchOne (base,other) nil = NOTFOUND other | searchOne (base,other) (entry::entries) = case entry of E_BASE path => let val newBase = uriJoin(base,path) in searchOne (newBase,other) entries end | E_EXTEND path => let val fullPath = uriJoin(base,path) in searchOne (base,fullPath::other) entries end | E_DELEGATE(prefix,path) => (case id of PUB pid => if String.isPrefix prefix pid then let val fullPath = uriJoin(base,path) in searchOne (base,fullPath::other) entries end else searchOne (base,other) entries | SYS _ => searchOne (base,other) entries) | E_MAP(pubid,path) => (case id of PUB pid => if pubid=pid then FOUND (base,path) else searchOne (base,other) entries | _ => searchOne (base,other) entries) | E_REMAP(sysid,path) => (case id of SYS sid => if sysid=sid then FOUND(base,path) else searchOne (base,other) entries | _ => searchOne (base,other) entries) fun searchLevel other nil = NOTFOUND(rev other) | searchLevel other (fname::fnames) = let val (base,entries) = getCatalog fname in case searchOne (base,other) entries of FOUND bp => FOUND bp | NOTFOUND other' => searchLevel other' fnames end fun searchAll fnames = if null fnames then NONE else case searchLevel nil fnames of FOUND bp => SOME bp | NOTFOUND other => searchAll other val fnames = !O_CATALOG_FILES in case id of PUB _ => searchAll fnames | SYS _ => if !O_SUPPORT_REMAP then searchAll fnames else NONE end fun resolveExtId (pub,sys) = let fun resolvePubCat () = case pub of NONE => NONE | SOME id => case searchId (PUB id) of NONE => NONE | SOME(base,sysid) => case searchId (SYS sysid) of NONE => SOME(base,sysid) | new => new fun resolveSysCat () = case sys of NONE => NONE | SOME(base,id) => searchId (SYS id) fun resolveCat () = if !O_PREFER_SYSID then case resolveSysCat () of NONE => resolvePubCat () | found => found else case resolvePubCat () of NONE => resolveSysCat () | found => found fun resolve () = if !O_PREFER_CATALOG then case resolveCat () of NONE => (case sys of NONE => NONE | SOME(base,id) => SOME(base,id)) | found => found else case sys of NONE => resolvePubCat () | SOME(base,id) => SOME(base,id) in if null (!O_CATALOG_FILES) then case sys of NONE => NONE | SOME(base,id) => SOME (uriJoin (base,id)) else case resolve () of NONE => NONE | SOME bp => SOME (uriJoin bp) end end (* stop of ../../Catalog/catalog.sml *) (* start of ../../Catalog/catResolve.sml *) functor ResolveCatalog ( structure Params : CatParams ) : Resolve = struct structure Catalog = Catalog ( structure Params = Params ) open Base Errors fun resolveExtId (id as EXTID(pub,sys)) = let val pub1 = case pub of NONE => NONE | SOME (str,_) => SOME str val sys1 = case sys of NONE => NONE | SOME (base,file,_) => SOME(base,file) in case Catalog.resolveExtId (pub1,sys1) of NONE => raise NoSuchFile ("","Could not generate system identifier") | SOME uri => uri end end (* stop of ../../Catalog/catResolve.sml *) (* start of ../../Catalog/catOptions.sml *) signature CatOptions = sig val O_CATALOG_FILES : Uri.Uri list ref val O_PREFER_SOCAT : bool ref val O_PREFER_SYSID : bool ref val O_PREFER_CATALOG : bool ref val O_SUPPORT_REMAP : bool ref val O_CATALOG_ENC : Encoding.Encoding ref val setCatalogDefaults : unit -> unit val setCatalogOptions : Options.Option list * (string -> unit) -> Options.Option list val catalogUsage : Options.Usage end functor CatOptions () : CatOptions = struct open Encoding Options Uri val O_CATALOG_FILES = ref nil: Uri list ref val O_PREFER_SOCAT = ref false val O_PREFER_SYSID = ref false val O_PREFER_CATALOG = ref true val O_SUPPORT_REMAP = ref true val O_CATALOG_ENC = ref LATIN1 fun setCatalogDefaults() = let val _ = O_CATALOG_FILES := nil val _ = O_PREFER_SOCAT := false val _ = O_PREFER_SYSID := false val _ = O_PREFER_CATALOG := true val _ = O_SUPPORT_REMAP := true val _ = O_CATALOG_ENC := LATIN1 in () end val catalogUsage = [U_ITEM(["-C ","--catalog="],"Use catalog "), U_ITEM(["--catalog-syntax=(soc|xml)"],"Default syntax for catalogs (xml)"), U_ITEM(["--catalog-encoding="],"Default encoding for Socat catalogs (LATIN1)"), U_ITEM(["--catalog-remap=[(yes|no)]"],"Support remapping of system identifiers (yes)"), U_ITEM(["--catalog-priority=(map|remap|sys)"],"Resolving strategy in catalogs (map)") ] fun setCatalogOptions (opts,doError) = let val catalogs = ref nil:string list ref fun hasNoArg key = "option "^key^" has no argument" fun mustHave key = String.concat ["option ",key," must have an argument"] fun mustBe(key,what) = String.concat ["the argument to --",key," must be ",what] val yesNo = "'yes' or 'no'" val mapRemapSys = "'map', 'remap' or 'sys'" val encName = "'ascii', 'latin1', 'utf8' or 'utf16'" val syntaxName = "'soc' or 'xml'" fun do_catalog valOpt = case valOpt of NONE => doError(mustHave "--catalog") | SOME s => catalogs := s::(!catalogs) fun do_prio valOpt = let fun set(cat,sys) = (O_PREFER_CATALOG := cat; O_PREFER_SYSID := sys) in case valOpt of NONE => doError(mustHave "--catalog-priority") | SOME "map" => set(true,false) | SOME "remap" => set(true,true) | SOME "sys" => set(false,true) | SOME s => doError(mustBe("catalog-priority",mapRemapSys)) end fun do_enc valOpt = case valOpt of NONE => doError(mustHave "--catalog-encoding") | SOME s => case isEncoding s of NOENC => doError("unsupported encoding "^s) | enc => O_CATALOG_ENC := enc fun do_remap valOpt = case valOpt of NONE => doError(mustHave "--catalog-remap") | SOME "no" => O_SUPPORT_REMAP := false | SOME "yes" => O_SUPPORT_REMAP := true | SOME s => doError(mustBe("catalog-remap",yesNo)) fun do_syntax valOpt = case valOpt of NONE => doError(mustHave "--catalog-syntax") | SOME "soc" => O_PREFER_SOCAT := true | SOME "xml" => O_PREFER_SOCAT := false | SOME s => doError(mustBe("catalog-remap",syntaxName)) fun do_long(key,valOpt) = case key of "catalog" => true before do_catalog valOpt | "catalog-remap" => true before do_remap valOpt | "catalog-syntax" => true before do_syntax valOpt | "catalog-encoding" => true before do_enc valOpt | "catalog-priority" => true before do_prio valOpt | _ => false fun do_short cs opts = case cs of nil => doit opts | [#"C"] => (case opts of OPT_STRING s::opts1 => (catalogs := s::(!catalogs); doit opts1) | _ => let val _ = doError (mustHave "-C") in doit opts end) | cs => let val cs1 = List.filter (fn c => if #"C"<>c then true else false before doError (mustHave "-C")) cs in if null cs1 then doit opts else (OPT_SHORT cs1)::doit opts end and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_SHORT cs => do_short cs opts | OPT_NEG cs => opt::doit opts | OPT_STRING s => opt::doit opts val opts1 = doit opts val uris = map String2Uri (!catalogs) val _ = O_CATALOG_FILES := uris in opts1 end end (* stop of ../../Catalog/catOptions.sml *) (* start of nullOptions.sml *) signature NullOptions = sig val O_SILENT : bool ref val O_ERROR_DEVICE : TextIO.outstream ref val O_ERROR_LINEWIDTH : int ref val setNullDefaults : unit -> unit val setNullOptions : Options.Option list * (string -> unit) -> bool * bool * string option * string option val nullUsage : Options.Usage end structure NullOptions : NullOptions = struct open Options val O_SILENT = ref false val O_ERROR_DEVICE = ref TextIO.stdErr val O_ERROR_LINEWIDTH = ref 80 val nullUsage = [U_ITEM(["-s","--silent"],"Suppress reporting of errors and warnings"), U_ITEM(["-e ","--error-output="],"Redirect errors to file (stderr)"), U_SEP, U_ITEM(["--version"],"Print the version number and exit"), U_ITEM(["-?","--help"],"Print this text and exit"), U_ITEM(["--"],"Do not recognize remaining arguments as options") ] fun setNullDefaults () = let val _ = O_SILENT := false val _ = O_ERROR_DEVICE := TextIO.stdErr in () end fun setNullOptions (opts,optError) = let fun onlyOne what = "at most one "^what^" may be specified" fun unknown pre opt = String.concat ["unknown option ",pre,opt] fun hasNoArg pre key = String.concat ["option ",pre,key," expects no argument"] fun mustHave pre key = String.concat ["option ",pre,key," must have an argument"] fun check_noarg(key,valOpt) = if isSome valOpt then optError (hasNoArg "--" key) else () fun do_long (pars as (v,h,e,f)) (key,valOpt) = case key of "help" => (v,true,e,f) before check_noarg(key,valOpt) | "version" => (true,h,e,f) before check_noarg(key,valOpt) | "silent" => pars before O_SILENT := true before check_noarg(key,valOpt) | "error-output" => (case valOpt of NONE => pars before optError (mustHave "--" key) | SOME s => (v,h,SOME s,f)) | _ => pars before optError(unknown "--" key) fun do_short (pars as (v,h,e,f)) (cs,opts) = case cs of nil => doit pars opts | [#"e"] => (case opts of OPT_STRING s::opts1 => doit (v,h,SOME s,f) opts1 | _ => (optError (hasNoArg "-" "e"); doit pars opts)) | cs => doit (foldr (fn (c,pars) => case c of #"e" => pars before optError (hasNoArg "-" "e") | #"s" => pars before O_SILENT := true | #"?" => (v,true,e,f) | c => pars before optError (unknown "-" (String.implode [c]))) pars cs) opts and doit pars nil = pars | doit (pars as (v,h,e,f)) (opt::opts) = case opt of OPT_LONG(key,valOpt) => doit (do_long pars (key,valOpt)) opts | OPT_SHORT cs => do_short pars (cs,opts) | OPT_STRING s => if isSome f then let val _ = optError(onlyOne "input file") in doit pars opts end else doit (v,h,e,SOME s) opts | OPT_NOOPT => doit pars opts | OPT_NEG cs => let val _ = if null cs then () else app (fn c => optError (unknown "-n" (String.implode[c]))) cs in doit pars opts end in doit (false,false,NONE,NONE) opts end end (* stop of nullOptions.sml *) (* start of nullHooks.sml *) structure NullHooks = struct open Errors IgnoreHooks NullOptions type AppData = OS.Process.status type AppFinal = AppData val nullStart = OS.Process.success fun printError(pos,err) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos ::(if isFatalError err then "Fatal error:" else "Error:") ::errorMessage err)) fun printWarning(pos,warn) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos^" Warning:"::warningMessage warn)) fun hookError (_,pe) = OS.Process.failure before printError pe fun hookWarning (status,pw) = status before printWarning pw end (* stop of nullHooks.sml *) (* start of null.sml *) structure Null = struct structure ParserOptions = ParserOptions () structure CatOptions = CatOptions () structure CatParams = struct open CatError CatOptions NullOptions Uri UtilError fun catError(pos,err) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos^" Error in catalog:"::catMessage err)) end structure Resolve = ResolveCatalog (structure Params = CatParams) structure ParseNull = Parse (structure Dtd = Dtd structure Hooks = NullHooks structure Resolve = Resolve structure ParserOptions = ParserOptions) fun parseNull uri = ParseNull.parseDocument uri NONE NullHooks.nullStart open CatOptions NullOptions Options ParserOptions Uri val usage = List.concat [parserUsage,[U_SEP],catalogUsage,[U_SEP],nullUsage] exception Exit of OS.Process.status fun null(prog,args) = let val prog = "fxp" val hadError = ref false fun optError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in hadError := true end fun exitError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in raise Exit OS.Process.failure end fun exitHelp prog = let val _ = printUsage TextIO.stdOut prog usage in raise Exit OS.Process.success end fun exitVersion prog = let val _ = app print [prog," version ",Version.FXP_VERSION,"\n"] in raise Exit OS.Process.success end fun summOpt prog = "For a summary of options type "^prog^" --help" fun noFile(f,cause) = "can't open file '"^f^"': "^exnMessage cause val opts = parseOptions args val _ = setParserDefaults() val opts1 = setParserOptions (opts,optError) val _ = setCatalogDefaults() val opts2 = setCatalogOptions (opts1,optError) val _ = setNullDefaults() val (vers,help,err,file) = setNullOptions (opts2,optError) val _ = if !hadError then exitError (summOpt prog) else () val _ = if vers then exitVersion prog else () val _ = if help then exitHelp prog else () val _ = case err of SOME "-" => O_ERROR_DEVICE := TextIO.stdErr | SOME f => (O_ERROR_DEVICE := TextIO.openOut f handle IO.Io {cause,...} => exitError(noFile(f,cause))) | NONE => () val f = valOf file handle Option => "-" val uri = if f="-" then NONE else SOME(String2Uri f) val status = parseNull uri val _ = if isSome err then TextIO.closeOut (!O_ERROR_DEVICE) else () in status end handle Exit status => status | exn => let val _ = TextIO.output (TextIO.stdErr,prog^": Unexpected exception: "^exnMessage exn^".\n") in OS.Process.failure end end (* stop of null.sml *) (* start of call-null.sml *) val _ = Null.null (CommandLine.name (), CommandLine.arguments ()) (* stop of call-null.sml *) mlton-20210117+dfsg/benchmark/tests/hamlet.sml000066400000000000000000031642021416264345000211210ustar00rootroot00000000000000(* * 2001-2-14. * Stephen Weeks (sweeks@sweeks.com) generated this file from the hamlet SML * interpreter written by Andreas Rossberg. * The sources are from http://www.ps.uni-sb.de/~rossberg/hamlet/hamlet.tar * * The file consists of the concatenation of all of the source code (plus SML/NJ * library code) in the correct order, with a simple test case to test the * interpreter at the end. * * I also removed uses of the nonstandard Unsafe structure. * * I also made a minor change so that it could read in from a file instead of * from stdIn. *) val ins = ref TextIO.stdIn (* start of STAMP.sml *) (* * Stamp generator. *) signature STAMP = sig eqtype stamp val stamp: unit -> stamp val toString: stamp -> string val reset: unit -> unit val compare: stamp * stamp -> order end (* stop of STAMP.sml *) (* start of Stamp.sml *) (* * Stamp generator. *) structure Stamp :> STAMP = struct type stamp = int val r = ref 0 fun reset() = r := 0 fun stamp() = (r := !r + 1; !r) val toString = Int.toString val compare = Int.compare end (* stop of Stamp.sml *) (* start of smlnj-lib/Util/ord-key-sig.sml *) (* ord-key-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Abstract linearly ordered keys. * *) signature ORD_KEY = sig type ord_key val compare : ord_key * ord_key -> order end (* ORD_KEY *) (* stop of smlnj-lib/Util/ord-key-sig.sml *) (* start of smlnj-lib/Util/lib-base-sig.sml *) (* lib-base-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. *) signature LIB_BASE = sig exception Unimplemented of string (* raised to report unimplemented features *) exception Impossible of string (* raised to report internal errors *) exception NotFound (* raised by searching operations *) val failure : {module : string, func : string, msg : string} -> 'a (* raise the exception Fail with a standard format message. *) val version : {date : string, system : string, version_id : int list} val banner : string end (* LIB_BASE *) (* stop of smlnj-lib/Util/lib-base-sig.sml *) (* start of smlnj-lib/Util/lib-base.sml *) (* lib-base.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. *) structure LibBase : LIB_BASE = struct (* raised to report unimplemented features *) exception Unimplemented of string (* raised to report internal errors *) exception Impossible of string (* raised by searching operations *) exception NotFound (* raise the exception Fail with a standard format message. *) fun failure {module, func, msg} = raise (Fail(concat[module, ".", func, ": ", msg])) val version = { date = "June 1, 1996", system = "SML/NJ Library", version_id = [1, 0] } fun f ([], l) = l | f ([x : int], l) = (Int.toString x)::l | f (x::r, l) = (Int.toString x) :: "." :: f(r, l) val banner = concat ( #system version :: ", Version " :: f (#version_id version, [", ", #date version])) end (* LibBase *) (* stop of smlnj-lib/Util/lib-base.sml *) (* start of smlnj-lib/Util/ord-map-sig.sml *) (* ord-map-sig.sml * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * Abstract signature of an applicative-style finite maps (dictionaries) * structure over ordered monomorphic keys. *) signature ORD_MAP = sig structure Key : ORD_KEY type 'a map val empty : 'a map (* The empty map *) val isEmpty : 'a map -> bool (* Return true if and only if the map is empty *) val singleton : (Key.ord_key * 'a) -> 'a map (* return the specified singleton map *) val insert : 'a map * Key.ord_key * 'a -> 'a map val insert' : ((Key.ord_key * 'a) * 'a map) -> 'a map (* Insert an item. *) val find : 'a map * Key.ord_key -> 'a option (* Look for an item, return NONE if the item doesn't exist *) val inDomain : ('a map * Key.ord_key) -> bool (* return true, if the key is in the domain of the map *) val remove : 'a map * Key.ord_key -> 'a map * 'a (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) val first : 'a map -> 'a option val firsti : 'a map -> (Key.ord_key * 'a) option (* return the first item in the map (or NONE if it is empty) *) val numItems : 'a map -> int (* Return the number of items in the map *) val listItems : 'a map -> 'a list val listItemsi : 'a map -> (Key.ord_key * 'a) list (* Return an ordered list of the items (and their keys) in the map. *) val listKeys : 'a map -> Key.ord_key list (* return an ordered list of the keys in the map. *) val collate : ('a * 'a -> order) -> ('a map * 'a map) -> order (* given an ordering on the map's range, return an ordering * on the map. *) val unionWith : ('a * 'a -> 'a) -> ('a map * 'a map) -> 'a map val unionWithi : (Key.ord_key * 'a * 'a -> 'a) -> ('a map * 'a map) -> 'a map (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) val intersectWith : ('a * 'b -> 'c) -> ('a map * 'b map) -> 'c map val intersectWithi : (Key.ord_key * 'a * 'b -> 'c) -> ('a map * 'b map) -> 'c map (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) val app : ('a -> unit) -> 'a map -> unit val appi : ((Key.ord_key * 'a) -> unit) -> 'a map -> unit (* Apply a function to the entries of the map in map order. *) val map : ('a -> 'b) -> 'a map -> 'b map val mapi : (Key.ord_key * 'a -> 'b) -> 'a map -> 'b map (* Create a new map by applying a map function to the * name/value pairs in the map. *) val foldl : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldli : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in increasing map order. *) val foldr : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldri : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in decreasing map order. *) val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) val mapPartial : ('a -> 'b option) -> 'a map -> 'b map val mapPartiali : (Key.ord_key * 'a -> 'b option) -> 'a map -> 'b map (* map a partial function over the elements of a map in increasing * map order. *) end (* ORD_MAP *) (* stop of smlnj-lib/Util/ord-map-sig.sml *) (* start of smlnj-lib/Util/binary-map-fn.sml *) (* binary-map-fn.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * *) functor BinaryMapFn (K : ORD_KEY) : ORD_MAP = struct structure Key = K (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i datatype 'a map = E | T of { key : K.ord_key, value : 'a, cnt : int, left : 'a map, right : 'a map } val empty = E fun isEmpty E = true | isEmpty _ = false fun numItems E = 0 | numItems (T{cnt,...}) = cnt (* return the first item in the map (or NONE if it is empty) *) fun first E = NONE | first (T{value, left=E, ...}) = SOME value | first (T{left, ...}) = first left (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti E = NONE | firsti (T{key, value, left=E, ...}) = SOME(key, value) | firsti (T{left, ...}) = firsti left local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv,left=T{key=b,value=bv,left=x,right=y,...},right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w,right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in fun mkDict () = E fun singleton (x,v) = T{key=x,value=v,cnt=1,left=E,right=E} fun insert (E,x,v) = T{key=x,value=v,cnt=1,left=E,right=E} | insert (T(set as {key,left,right,value,...}),x,v) = case K.compare (key,x) of GREATER => T'(key,value,insert(left,x,v),right) | LESS => T'(key,value,left,insert(right,x,v)) | _ => T{key=x,value=v,left=left,right=right,cnt= #cnt set} fun insert' ((k, x), m) = insert(m, k, x) fun inDomain (set, x) = let fun mem E = false | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => true | LESS => mem left (* end case *)) in mem set end fun find (set, x) = let fun mem E = NONE | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => SOME(#value n) | LESS => mem left (* end case *)) in mem set end fun remove (E,x) = raise LibBase.NotFound | remove (set as T{key,left,right,value,...},x) = ( case K.compare (key,x) of GREATER => let val (left', v) = remove(left, x) in (T'(key, value, left', right), v) end | LESS => let val (right', v) = remove (right, x) in (T'(key, value, left, right'), v) end | _ => (delete'(left,right),value) (* end case *)) fun listItems d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, value::(d2l(right,l))) in d2l (d,[]) end fun listItemsi d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, (key,value)::(d2l(right,l))) in d2l (d,[]) end fun listKeys d = let fun d2l (E, l) = l | d2l (T{key,left,right,...}, l) = d2l(left, key::(d2l(right,l))) in d2l (d,[]) end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun collate cmpRng (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{key=x1, value=y1, ...}, r1), (T{key=x2, value=y2, ...}, r2)) => ( case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end (* local *) fun appi f d = let fun app' E = () | app' (T{key,value,left,right,...}) = ( app' left; f(key, value); app' right) in app' d end fun app f d = let fun app' E = () | app' (T{value,left,right,...}) = ( app' left; f value; app' right) in app' d end fun mapi f d = let fun map' E = E | map' (T{key,value,left,right,cnt}) = let val left' = map' left val value' = f(key, value) val right' = map' right in T{cnt=cnt, key=key, value=value', left = left', right = right'} end in map' d end fun map f d = mapi (fn (_, x) => f x) d fun foldli f init d = let fun fold (E, v) = v | fold (T{key,value,left,right,...}, v) = fold (right, f(key, value, fold(left, v))) in fold (d, init) end fun foldl f init d = foldli (fn (_, v, accum) => f (v, accum)) init d fun foldri f init d = let fun fold (E,v) = v | fold (T{key,value,left,right,...},v) = fold (left, f(key, value, fold(right, v))) in fold (d, init) end fun foldr f init d = foldri (fn (_, v, accum) => f (v, accum)) init d (** To be implemented ** val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map **) end (* local *) (* the following are generic implementations of the unionWith and intersectWith * operetions. These should be specialized for the internal representations * at some point. *) fun unionWith f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (a, b) => f (b, a))) m1 m2 else foldli (ins f) m2 m1 end fun unionWithi f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (k, a, b) => f (k, b, a))) m1 m2 else foldli (ins f) m2 m1 end fun intersectWith f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (a, b) => f(b, a)) (m2, m1) end fun intersectWithi f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (k, a, b) => f(k, b, a)) (m2, m1) end (* this is a generic implementation of filter. It should * be specialized to the data-structure at some point. *) fun filter predFn m = let fun f (key, item, m) = if predFn item then insert(m, key, item) else m in foldli f empty m end fun filteri predFn m = let fun f (key, item, m) = if predFn(key, item) then insert(m, key, item) else m in foldli f empty m end (* this is a generic implementation of mapPartial. It should * be specialized to the data-structure at some point. *) fun mapPartial f m = let fun g (key, item, m) = (case f item of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end fun mapPartiali f m = let fun g (key, item, m) = (case f(key, item) of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end end (* functor BinaryMapFn *) (* stop of smlnj-lib/Util/binary-map-fn.sml *) (* start of FIN_MAP.sml *) (* * Standard ML finite maps * * Definition, section 4.2 * * Note: * This signature just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * (and more efficient) to be in the lib. Also see FIN_SET. *) signature FIN_MAP = sig include ORD_MAP val fromList: (Key.ord_key * 'a) list -> 'a map val all: ('a -> bool) -> 'a map -> bool val exists: ('a -> bool) -> 'a map -> bool val alli: (Key.ord_key * 'a -> bool) -> 'a map -> bool val existsi: (Key.ord_key * 'a -> bool) -> 'a map -> bool val disjoint: 'a map * 'a map -> bool end (* stop of FIN_MAP.sml *) (* start of FinMapFn.sml *) (* * Standard ML finite maps * * Definition, section 4.2 * * Note: * This functor just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * (and more efficient) to be in the lib. Also see FinSetFn. *) functor FinMapFn(Key: ORD_KEY) :> FIN_MAP where type Key.ord_key = Key.ord_key = struct structure BinaryMap = BinaryMapFn(Key) open BinaryMap fun fromList kvs = List.foldl (fn((k, v),m) => insert(m, k, v)) empty kvs fun all p = foldl (fn(v, b) => b andalso p v) true fun exists p = foldl (fn(v, b) => b orelse p v) false fun alli p = foldli (fn(k, v, b) => b andalso p(k, v)) true fun existsi p = foldli (fn(k, v, b) => b orelse p(k, v)) false fun disjoint(m1,m2) = isEmpty(intersectWith #2 (m1, m2)) end (* stop of FinMapFn.sml *) (* start of ID.sml *) (* * Standard ML identifiers * * Definition, section 2.4 * * Note: * This is a generic signature to represent all kinds of identifiers (except * for labels and tyvars). *) signature ID = sig (* Type [Section 2.4] *) eqtype Id (* [id] *) (* Operations *) val invent: unit -> Id val fromString: string -> Id val toString: Id -> string val compare: Id * Id -> order end (* stop of ID.sml *) (* start of IdFn.sml *) (* * Standard ML identifiers * * Definition, section 2.4 * * Note: * This is a generic functor to represent all kinds of identifiers (except * for labels tyvars). *) functor IdFn() :> ID = struct (* Type [Section 2.4] *) type Id = string (* [id] *) (* Creation *) fun invent() = "_id" ^ Stamp.toString(Stamp.stamp()) fun fromString s = s fun toString s = s (* Ordering *) val compare = String.compare end (* stop of IdFn.sml *) (* start of IdsModule.sml *) (* * Standard ML identifiers for modules * * Definition, section 3.2 *) structure SigId = IdFn() structure FunId = IdFn() (* stop of IdsModule.sml *) (* start of AssembliesModule.sml *) (* * Standard ML sets and maps for the module semantics * * Definition, sections 5.1 and 7.2 *) structure SigIdMap = FinMapFn(type ord_key = SigId.Id val compare = SigId.compare) structure FunIdMap = FinMapFn(type ord_key = FunId.Id val compare = FunId.compare) (* stop of AssembliesModule.sml *) (* start of LONGID.sml *) (* * Standard ML long identifiers * * Definition, section 2.4 * * Note: * This is a generic signature to represent all kinds of long identifiers. *) signature LONGID = sig (* Import *) structure Id: ID structure StrId: ID type Id = Id.Id type StrId = StrId.Id (* Type [Section 2.4] *) eqtype longId (* [longid] *) (* Operations *) val invent: unit -> longId val fromId: Id -> longId val toId: longId -> Id val toString: longId -> string val strengthen: StrId * longId -> longId val implode: StrId list * Id -> longId val explode: longId -> StrId list * Id val isUnqualified: longId -> bool val compare: longId * longId -> order end (* stop of LONGID.sml *) (* start of LongIdFn.sml *) (* * Standard ML long identifiers * * Definition, section 2.4 * * Note: * This is a generic functor that generates a long identifier type from a * given identifier type and the StrId type. *) functor LongIdFn(structure Id: ID structure StrId: ID ) :> LONGID where type Id.Id = Id.Id and type StrId.Id = StrId.Id = struct (* Import *) structure Id = Id structure StrId = StrId type Id = Id.Id type StrId = StrId.Id (* Type [Section 2.4] *) type longId = StrId list * Id (* [longid] *) (* Conversions *) fun toId(strid, id) = id fun fromId id = ([],id) fun invent() = ([],Id.invent()) fun toString(strids, id) = let fun prefix [] = Id.toString id | prefix(id::ids) = StrId.toString id ^ "." ^ prefix ids in prefix strids end fun strengthen(strid, (strids, id)) = (strid::strids, id) fun implode longid = longid fun explode longid = longid fun isUnqualified (strids,id) = List.null strids (* Ordering *) fun compare(longid1, longid2) = String.compare(toString longid1, toString longid2) end (* stop of LongIdFn.sml *) (* start of IdsCore.sml *) (* * Standard ML identifiers for the core * * Definition, section 2.4 *) structure VId = IdFn() structure TyCon = IdFn() structure StrId = IdFn() structure LongVId = LongIdFn(structure Id = VId structure StrId = StrId) structure LongTyCon = LongIdFn(structure Id = TyCon structure StrId = StrId) structure LongStrId = LongIdFn(structure Id = StrId structure StrId = StrId) (* stop of IdsCore.sml *) (* start of smlnj-lib/Util/ord-set-sig.sml *) (* ordset-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for a set of values with an order relation. *) signature ORD_SET = sig structure Key : ORD_KEY type item = Key.ord_key type set val empty : set (* The empty set *) val singleton : item -> set (* Create a singleton set *) val add : set * item -> set val add' : (item * set) -> set (* Insert an item. *) val addList : set * item list -> set (* Insert items from list. *) val delete : set * item -> set (* Remove an item. Raise NotFound if not found. *) val member : set * item -> bool (* Return true if and only if item is an element in the set *) val isEmpty : set -> bool (* Return true if and only if the set is empty *) val equal : (set * set) -> bool (* Return true if and only if the two sets are equal *) val compare : (set * set) -> order (* does a lexical comparison of two sets *) val isSubset : (set * set) -> bool (* Return true if and only if the first set is a subset of the second *) val numItems : set -> int (* Return the number of items in the table *) val listItems : set -> item list (* Return an ordered list of the items in the set *) val union : set * set -> set (* Union *) val intersection : set * set -> set (* Intersection *) val difference : set * set -> set (* Difference *) val map : (item -> item) -> set -> set (* Create a new set by applying a map function to the elements * of the set. *) val app : (item -> unit) -> set -> unit (* Apply a function to the entries of the set * in decreasing order *) val foldl : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in increasing order *) val foldr : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in decreasing order *) val filter : (item -> bool) -> set -> set val exists : (item -> bool) -> set -> bool val find : (item -> bool) -> set -> item option end (* ORD_SET *) (* stop of smlnj-lib/Util/ord-set-sig.sml *) (* start of smlnj-lib/Util/binary-set-fn.sml *) (* binary-set-fn.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * * 3. There are two implementations of union. The default, * hedge_union, is much more complex and usually 20% faster. I * am not sure that the performance increase warrants the * complexity (and time it took to write), but I am leaving it * in for the competition. It is derived from the original * union by replacing the split_lt(gt) operations with a lazy * version. The `obvious' version is called old_union. * * 4. Most time is spent in T', the rebalancing constructor. If my * understanding of the output of * in the sml batch * compiler is correct then the code produced by NJSML 0.75 * (sparc) for the final case is very disappointing. Most * invocations fall through to this case and most of these cases * fall to the else part, i.e. the plain contructor, * T(v,ln+rn+1,l,r). The poor code allocates a 16 word vector * and saves lots of registers into it. In the common case it * then retrieves a few of the registers and allocates the 5 * word T node. The values that it retrieves were live in * registers before the massive save. * * Modified to functor to support general ordered values *) functor BinarySetFn (K : ORD_KEY) : ORD_SET = struct structure Key = K type item = K.ord_key datatype set = E | T of { elt : item, cnt : int, left : set, right : set } fun numItems E = 0 | numItems (T{cnt,...}) = cnt fun isEmpty E = true | isEmpty _ = false fun mkT(v,n,l,r) = T{elt=v,cnt=n,left=l,right=r} (* N(v,l,r) = T(v,1+numItems(l)+numItems(r),l,r) *) fun N(v,E,E) = mkT(v,1,E,E) | N(v,E,r as T{cnt=n,...}) = mkT(v,n+1,E,r) | N(v,l as T{cnt=n,...}, E) = mkT(v,n+1,l,E) | N(v,l as T{cnt=n,...}, r as T{cnt=m,...}) = mkT(v,n+m+1,l,r) fun single_L (a,x,T{elt=b,left=y,right=z,...}) = N(b,N(a,x,y),z) | single_L _ = raise Match fun single_R (b,T{elt=a,left=x,right=y,...},z) = N(a,x,N(b,y,z)) | single_R _ = raise Match fun double_L (a,w,T{elt=c,left=T{elt=b,left=x,right=y,...},right=z,...}) = N(b,N(a,w,x),N(c,y,z)) | double_L _ = raise Match fun double_R (c,T{elt=a,left=w,right=T{elt=b,left=x,right=y,...},...},z) = N(b,N(a,w,x),N(c,y,z)) | double_R _ = raise Match (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i fun T' (v,E,E) = mkT(v,1,E,E) | T' (v,E,r as T{left=E,right=E,...}) = mkT(v,2,E,r) | T' (v,l as T{left=E,right=E,...},E) = mkT(v,2,l,E) | T' (p as (_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if lnrn then single_R p else double_R p | T' (p as (_,E,T{left=E,...})) = single_L p | T' (p as (_,T{right=E,...},E)) = single_R p | T' (p as (v,l as T{elt=lv,cnt=ln,left=ll,right=lr}, r as T{elt=rv,cnt=rn,left=rl,right=rr})) = if rn >= wt ln (*right is too big*) then let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn (*left is too big*) then let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else mkT(v,ln+rn+1,l,r) fun add (E,x) = mkT(x,1,E,E) | add (set as T{elt=v,left=l,right=r,cnt},x) = case K.compare(x,v) of LESS => T'(v,add(l,x),r) | GREATER => T'(v,l,add(r,x)) | EQUAL => mkT(x,cnt,l,r) fun add' (s, x) = add(x, s) fun concat3 (E,v,r) = add(r,v) | concat3 (l,v,E) = add(l,v) | concat3 (l as T{elt=v1,cnt=n1,left=l1,right=r1}, v, r as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat3(l,v,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat3(r1,v,r)) else N(v,l,r) fun split_lt (E,x) = E | split_lt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of GREATER => split_lt(l,x) | LESS => concat3(l,v,split_lt(r,x)) | _ => l fun split_gt (E,x) = E | split_gt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of LESS => split_gt(r,x) | GREATER => concat3(split_gt(l,x),v,r) | _ => r fun min (T{elt=v,left=E,...}) = v | min (T{left=l,...}) = min l | min _ = raise Match fun delmin (T{left=E,right=r,...}) = r | delmin (T{elt=v,left=l,right=r,...}) = T'(v,delmin l,r) | delmin _ = raise Match fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = T'(min r,l,delmin r) fun concat (E, s) = s | concat (s, E) = s | concat (t1 as T{elt=v1,cnt=n1,left=l1,right=r1}, t2 as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat(t1,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat(r1,t2)) else T'(min t2,t1, delmin t2) local fun trim (lo,hi,E) = E | trim (lo,hi,s as T{elt=v,left=l,right=r,...}) = if K.compare(v,lo) = GREATER then if K.compare(v,hi) = LESS then s else trim(lo,hi,l) else trim(lo,hi,r) fun uni_bd (s,E,_,_) = s | uni_bd (E,T{elt=v,left=l,right=r,...},lo,hi) = concat3(split_gt(l,lo),v,split_lt(r,hi)) | uni_bd (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo,hi) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v), v, uni_bd(r1,trim(v,hi,s2),v,hi)) (* inv: lo < v < hi *) (* all the other versions of uni and trim are * specializations of the above two functions with * lo=-infinity and/or hi=+infinity *) fun trim_lo (_, E) = E | trim_lo (lo,s as T{elt=v,right=r,...}) = case K.compare(v,lo) of GREATER => s | _ => trim_lo(lo,r) fun trim_hi (_, E) = E | trim_hi (hi,s as T{elt=v,left=l,...}) = case K.compare(v,hi) of LESS => s | _ => trim_hi(hi,l) fun uni_hi (s,E,_) = s | uni_hi (E,T{elt=v,left=l,right=r,...},hi) = concat3(l,v,split_lt(r,hi)) | uni_hi (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},hi) = concat3(uni_hi(l1,trim_hi(v,s2),v),v,uni_bd(r1,trim(v,hi,s2),v,hi)) fun uni_lo (s,E,_) = s | uni_lo (E,T{elt=v,left=l,right=r,...},lo) = concat3(split_gt(l,lo),v,r) | uni_lo (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v),v,uni_lo(r1,trim_lo(v,s2),v)) fun uni (s,E) = s | uni (E,s) = s | uni (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...}) = concat3(uni_hi(l1,trim_hi(v,s2),v), v, uni_lo(r1,trim_lo(v,s2),v)) in val hedge_union = uni end (* The old_union version is about 20% slower than * hedge_union in most cases *) fun old_union (E,s2) = s2 | old_union (s1,E) = s1 | old_union (T{elt=v,left=l,right=r,...},s2) = let val l2 = split_lt(s2,v) val r2 = split_gt(s2,v) in concat3(old_union(l,l2),v,old_union(r,r2)) end val empty = E fun singleton x = T{elt=x,cnt=1,left=E,right=E} fun addList (s,l) = List.foldl (fn (i,s) => add(s,i)) s l val add = add fun member (set, x) = let fun pk E = false | pk (T{elt=v, left=l, right=r, ...}) = ( case K.compare(x,v) of LESS => pk l | EQUAL => true | GREATER => pk r (* end case *)) in pk set end local (* true if every item in t is in t' *) fun treeIn (t,t') = let fun isIn E = true | isIn (T{elt,left=E,right=E,...}) = member(t',elt) | isIn (T{elt,left,right=E,...}) = member(t',elt) andalso isIn left | isIn (T{elt,left=E,right,...}) = member(t',elt) andalso isIn right | isIn (T{elt,left,right,...}) = member(t',elt) andalso isIn left andalso isIn right in isIn t end in fun isSubset (E,_) = true | isSubset (_,E) = false | isSubset (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n<=n') andalso treeIn (t,t') fun equal (E,E) = true | equal (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n=n') andalso treeIn (t,t') | equal _ = false end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun compare (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ( case Key.compare(e1, e2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end fun delete (E,x) = raise LibBase.NotFound | delete (set as T{elt=v,left=l,right=r,...},x) = case K.compare(x,v) of LESS => T'(v,delete(l,x),r) | GREATER => T'(v,l,delete(r,x)) | _ => delete'(l,r) val union = hedge_union fun intersection (E, _) = E | intersection (_, E) = E | intersection (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in if member(s,v) then concat3(intersection(l2,l),v,intersection(r2,r)) else concat(intersection(l2,l),intersection(r2,r)) end fun difference (E,s) = E | difference (s,E) = s | difference (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in concat(difference(l2,l),difference(r2,r)) end fun map f set = let fun map'(acc, E) = acc | map'(acc, T{elt,left,right,...}) = map' (add (map' (acc, left), f elt), right) in map' (E, set) end fun app apf = let fun apply E = () | apply (T{elt,left,right,...}) = (apply left;apf elt; apply right) in apply end fun foldl f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (right, f(elt, foldf (left, b))) in foldf (set, b) end fun foldr f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (left, f(elt, foldf (right, b))) in foldf (set, b) end fun listItems set = foldr (op::) [] set fun filter pred set = foldl (fn (item, s) => if (pred item) then add(s, item) else s) empty set fun find p E = NONE | find p (T{elt,left,right,...}) = (case find p left of NONE => if (p elt) then SOME elt else find p right | a => a (* end case *)) fun exists p E = false | exists p (T{elt, left, right,...}) = (exists p left) orelse (p elt) orelse (exists p right) end (* BinarySetFn *) (* stop of smlnj-lib/Util/binary-set-fn.sml *) (* start of FIN_SET.sml *) (* * Standard ML finite sets * * Definition, section 4.2 * * Note: * This signature just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * to be in the lib. Also see FIN_MAP. *) signature FIN_SET = sig include ORD_SET val fromList: item list -> set end (* stop of FIN_SET.sml *) (* start of FinSetFn.sml *) (* * Standard ML finite sets * * Definition, section 4.2 * * Note: * This functor just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * to be in the lib. Also see FinMapFn. *) functor FinSetFn(Key: ORD_KEY) :> FIN_SET where type Key.ord_key = Key.ord_key = struct structure BinarySet = BinarySetFn(Key) open BinarySet fun fromList xs = addList(empty, xs) end (* stop of FinSetFn.sml *) (* start of TYVAR.sml *) (* * Standard ML type variables * * Definition, sections 2.4 and 4.1 *) signature TYVAR = sig (* Type [Sections 2.4 and 4.1]*) eqtype TyVar (* [alpha] or [tyvar] *) (* Operations *) val invent: bool -> TyVar val fromIndex: bool -> int -> TyVar val fromString: string -> TyVar val toString: TyVar -> string val admitsEquality: TyVar -> bool val isExplicit: TyVar -> bool val instance: TyVar -> TyVar val normalise: TyVar * int -> TyVar val compare: TyVar * TyVar -> order end (* stop of TYVAR.sml *) (* start of TyVar.sml *) (* * Standard ML type variables * * Definition, sections 2.4 and 4.1 * * Note: * - Internally generated tyvars get names '#xxx, where xxx is a stamp number. * - Tyvars generated from integers are mapped to 'a,'b,..,'z,'aa,'bb,..,'zz, * 'aaa,... *) structure TyVar :> TYVAR = struct (* Type [Sections 2.4 and 4.1]*) type TyVar = { name: string, equality: bool } (* [alpha] or [tyvar] *) (* Creation *) fun invent equality = { name="'#" ^ Stamp.toString(Stamp.stamp()), equality=equality } fun fromIndex equality n = let fun rep(0,c) = c | rep(n,c) = c ^ rep(n-1,c) val c = String.str(Char.chr(Char.ord #"a" + n mod 26)) val name = (if equality then "''" else "'") ^ rep(n div 26, c) in { name=name, equality=equality } end fun fromString s = { name = s, equality = String.size(s) > 1 andalso String.sub(s,1) = #"'" } fun toString{name,equality} = name (* Attributes [Section 4.1] *) fun admitsEquality{name,equality} = equality fun isExplicit{name,equality} = String.size name = 1 orelse String.sub(name,1) <> #"#" (* Small helpers *) fun normalise({name,equality}, n) = fromIndex equality n fun instance{name,equality} = invent equality (* Ordering *) fun compare(alpha1: TyVar, alpha2: TyVar) = String.compare(#name alpha1, #name alpha2) end (* stop of TyVar.sml *) (* start of TYNAME.sml *) (* * Standard ML type names * * Definition, section 4.1 * * Notes: * - Equality is not a boolean attribute. We distinguish a 3rd kind of special * type names which have equality regardless of the types applied. This * implements ref, array, and equivalent types. * - For easy checking of pattern exhaustiveness we add an attribute * `span' counting the number of constructors of the type. *) signature TYNAME = sig (* Import *) type TyCon = TyCon.Id (* Type [Section 4.1] *) eqtype TyName (* [t] *) datatype Equality = NOEQ | EQ | SPECIALEQ (* Operations *) val tyname: TyCon * int * Equality * int -> TyName val invent: int * Equality -> TyName val rename: TyName -> TyName val removeEquality: TyName -> TyName val Abs: TyName -> TyName val arity: TyName -> int val equality: TyName -> Equality val span: TyName -> int val tycon: TyName -> TyCon val toString: TyName -> string val compare: TyName * TyName -> order end (* stop of TYNAME.sml *) (* start of TyName.sml *) (* * Standard ML type names * * Definition, section 4.1 * * Notes: * - Equality is not a boolean attribute. We distinguish a 3rd kind of special * type names which have equality regardless of the types applied. This * implements ref, array, and equivalent types. * - For easy checking of pattern exhaustiveness we add an attribute * `span' counting the number of constructors of the type. *) structure TyName :> TYNAME = struct (* Import *) type TyCon = TyCon.Id type stamp = Stamp.stamp (* Type [Section 4.1] *) datatype Equality = NOEQ | EQ | SPECIALEQ type TyName = (* [t] *) { tycon: TyCon , stamp: stamp , arity: int , equality: Equality , span: int } (* Creation *) fun tyname(tycon, arity, equality, span) = { tycon = tycon , stamp = Stamp.stamp() , arity = arity , equality = equality , span = span } fun invent(arity, equality) = tyname(TyCon.invent(), arity, equality, 0) (* Creation from existing *) fun rename{tycon, stamp, arity, equality, span} = tyname(tycon, arity, equality, span) fun removeEquality{tycon, stamp, arity, equality, span} = tyname(tycon, arity, NOEQ, span) fun Abs{tycon, stamp, arity, equality, span} = tyname(tycon, arity, NOEQ, 0) (* Attributes [Section 4.1] *) fun arity {tycon, stamp, arity, equality, span} = arity fun equality{tycon, stamp, arity, equality, span} = equality fun span {tycon, stamp, arity, equality, span} = span fun tycon {tycon, stamp, arity, equality, span} = tycon fun toString{tycon, stamp, arity, equality, span} = TyCon.toString tycon (* Ordering *) fun compare(t1: TyName, t2: TyName) = Stamp.compare(#stamp t1, #stamp t2) end (* stop of TyName.sml *) (* start of SCON.sml *) (* * Standard ML special constants * * Definition, section 2.2 *) signature SCON = sig (* Type [Section 2.2] *) datatype SCon = (* [scon] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Operations *) val fromInt: int -> SCon val fromWord: word -> SCon val fromString: string -> SCon val fromChar: char -> SCon val fromReal: real -> SCon val toString: SCon -> string val compare: SCon * SCon -> order end (* stop of SCON.sml *) (* start of SCon.sml *) (* * Standard ML special constants * * Definition, section 2.2 *) structure SCon :> SCON = struct (* Type [Section 2.2] *) datatype SCon = (* [scon] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Conversions *) val fromInt = INT val fromWord = WORD val fromString = STRING val fromChar = CHAR val fromReal = REAL fun toString(INT i) = Int.toString i | toString(WORD w) = "0wx" ^ Word.toString w | toString(STRING s) = "\"" ^ String.toCString s ^ "\"" | toString(CHAR c) = "\"#" ^ Char.toCString c ^ "\"" | toString(REAL r) = Real.toString r (* Ordering *) fun compare(INT n1, INT n2) = Int.compare(n1, n2) | compare(WORD w1, WORD w2) = Word.compare(w1, w2) | compare(STRING s1, STRING s2) = String.compare(s1, s2) | compare(CHAR c1, CHAR c2) = Char.compare(c1, c2) | compare(REAL x1, REAL x2) = Real.compare(x1, x2) | compare _ = raise Domain end (* stop of SCon.sml *) (* start of LAB.sml *) (* * Standard ML label identifiers * * Definition, section 2.4 *) signature LAB = sig (* Type [Section 2.4] *) eqtype Lab (* [lab] *) (* Operations *) val fromString: string -> Lab val fromInt: int -> Lab val toString: Lab -> string val compare: Lab * Lab -> order end (* stop of LAB.sml *) (* start of Lab.sml *) (* * Standard ML label identifiers * * Definition, section 2.4 *) structure Lab :> LAB = struct (* Type [Section 2.4] *) type Lab = string (* [lab] *) (* Conversions *) fun fromString s = s val fromInt = Int.toString fun toString s = s (* Ordering *) fun compare(lab1,lab2) = case (Int.fromString lab1, Int.fromString lab2) of (SOME i1, SOME i2) => Int.compare(i1,i2) | _ => String.compare(lab1,lab2) end (* stop of Lab.sml *) (* start of AssembliesCoreStatic.sml *) (* * Standard ML sets and maps for the static semantics of the core * * Definition, section 4.2 *) structure TyVarSet = FinSetFn(type ord_key = TyVar.TyVar val compare = TyVar.compare) structure TyNameSet = FinSetFn(type ord_key = TyName.TyName val compare = TyName.compare) structure SConSet = FinSetFn(type ord_key = SCon.SCon val compare = SCon.compare) structure VIdSet = FinSetFn(type ord_key = VId.Id val compare = VId.compare) structure LongVIdSet = FinSetFn(type ord_key = LongVId.longId val compare = LongVId.compare) structure LabMap = FinMapFn(type ord_key = Lab.Lab val compare = Lab.compare) structure VIdMap = FinMapFn(type ord_key = VId.Id val compare = VId.compare) structure TyConMap = FinMapFn(type ord_key = TyCon.Id val compare = TyCon.compare) structure TyVarMap = FinMapFn(type ord_key = TyVar.TyVar val compare = TyVar.compare) structure TyNameMap = FinMapFn(type ord_key = TyName.TyName val compare = TyName.compare) structure StrIdMap = FinMapFn(type ord_key = StrId.Id val compare = StrId.compare) (* stop of AssembliesCoreStatic.sml *) (* start of OVERLOADINGCLASS.sml *) (* * Standard ML overloading classes * * Definition, appendix E * * Note: * Overloading -- and defaulting in particular -- is not well formalised in * the Definition. We describe an overloading class as a pair (T,t) of a set * of type names (like the definition does), plus the default type name t. * For overloading to be sound some well-formedness properties have to be * enforced for all existing overloading classes (T,t): * (1) t elem T * (2) Eq T = 0 \/ t admits equality * (3) forall (T',t') . ( TT' = 0 \/ t = t' ) * where Eq T = { t elem T | t admits equality } and we write TT' for the * T intersect T' and 0 for the empty set. * The reason for (1) is obvious. (2) guarantees that we do not loose the * default if we enforce equality. (3) ensures the same if we have to unify * two overloading classes. (2) and (3) also allow the resulting set to become * empty which will cause a type error. *) signature OVERLOADINGCLASS = sig (* Import types *) type TyName = TyName.TyName type TyNameSet = TyNameSet.set (* Type *) type OverloadingClass (* [O] *) (* Operations *) val make: TyNameSet * TyName -> OverloadingClass val isEmpty: OverloadingClass -> bool val isSingular: OverloadingClass -> bool val default: OverloadingClass -> TyName val set: OverloadingClass -> TyNameSet val member: OverloadingClass * TyName -> bool val getItem: OverloadingClass -> TyName val makeEquality: OverloadingClass -> OverloadingClass option val intersection: OverloadingClass * OverloadingClass -> OverloadingClass option val union: OverloadingClass * OverloadingClass -> OverloadingClass end (* stop of OVERLOADINGCLASS.sml *) (* start of OverloadingClass.sml *) (* * Standard ML overloading classes * * Definition, appendix E * * Note: * Overloading -- and defaulting in particular -- is not well formalised in * the Definition. We describe an overloading class as a pair (T,t) of a set * of type names (like the definition does), plus the default type name t. * For overloading to be sound some well-formedness properties have to be * enforced for all existing overloading classes (T,t): * (1) t elem T * (2) Eq T = 0 \/ t admits equality * (3) forall (T',t') . ( TT' = 0 \/ t = t' ) * where Eq T = { t elem T | t admits equality } and we write TT' for the * T intersect T' and 0 for the empty set. * The reason for (1) is obvious. (2) guarantees that we do not loose the * default if we enforce equality. (3) ensures the same if we have to unify * two overloading classes. (2) and (3) also allow the resulting set to become * empty which will cause a type error. *) structure OverloadingClass :> OVERLOADINGCLASS = struct (* Import types *) type TyName = TyName.TyName type TyNameSet = TyNameSet.set (* Type *) type OverloadingClass = TyNameSet * TyName (* [O] *) (* Simple operations *) fun make O = O fun isEmpty (T,t) = TyNameSet.isEmpty T fun isSingular (T,t) = TyNameSet.numItems T = 1 fun default (T,t) = t fun set (T,t) = T fun member((T,t), t') = TyNameSet.member(T, t') fun getItem (T,t) = valOf(TyNameSet.find (fn _ => true) T) (* Filter equality types *) fun makeEquality (T,t) = let val T' = TyNameSet.filter (fn t => TyName.equality t = TyName.EQ) T in if TyNameSet.isEmpty T' then NONE else if TyName.equality t <> TyName.NOEQ then SOME(T',t) else raise Fail "OverloadingClass.makeEquality: \ \inconsistent overloading classes" end (* Intersection and union *) fun intersection((T1,t1), (T2,t2)) = let val T' = TyNameSet.intersection(T1,T2) in if TyNameSet.isEmpty T' then NONE else if t1 = t2 then SOME(T',t1) else raise Fail "OverloadingClass.intersect: \ \inconsistent overloading classes" end fun union((T1,t1), (T2,t2)) = ( TyNameSet.union(T1,T2), t2 ) end (* stop of OverloadingClass.sml *) (* start of TYPE.sml *) (* * Standard ML types * * Definition, section 4.2 and 4.4 * * Notes: * - Types are references so that unification can work via side effects. * We need links (forwards) to unify two type variables. * - Types built bottom-up have to be `normalised' to induce the required * sharing on type variables. * - Care has to be taken to clone types at the proper places. * - Substitution creates a clone, but shares free type variables. * - To represent overloaded type (variables), we add a special type. * - Record types may contain a row variable to represent open record types * (which appear during type inference). Flexible rows have to carry an * equality flag to properly propagate equality enforced by unification * when extending a row. *) signature TYPE = sig (* Import types *) type Lab = Lab.Lab type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type 'a LabMap = 'a LabMap.map type 'a TyVarMap = 'a TyVarMap.map type 'a TyNameMap = 'a TyNameMap.map (* Types [Section 4.2] *) datatype RowVar = CLOSEDRow | FLEXRow of bool (* [r] *) datatype Type' = (* [tau] *) TyVar of TyVar | RowType of (*RowType*) (Type' ref LabMap * RowVar) | FunType of (*FunType*) (Type' ref * Type' ref) | ConsType of (*ConsType*)(Type' ref list * TyName) | Overloaded of OverloadingClass | Link of (*Type*) Type' ref type Type = Type' ref type RowType = Type LabMap * RowVar (* [rho] *) type FunType = Type * Type type ConsType = Type list * TyName type TypeFcn = TyVar list * Type (* [theta] *) type Substitution = Type TyVarMap (* [mu] *) type Realisation = TypeFcn TyNameMap (* [phi] *) (* Operations *) val invent: unit -> Type val fromTyVar: TyVar -> Type val fromRowType: RowType -> Type val fromFunType: FunType -> Type val fromConsType: ConsType -> Type val fromOverloadingClass: OverloadingClass -> Type val range: Type -> Type val tyname: Type -> TyName val normalise: Type -> Type val substitute: Substitution -> Type -> Type val realise: Realisation -> Type -> Type val tyvars: Type -> TyVarSet val tynames: Type -> TyNameSet val admitsEquality: Type -> bool val isFlexible: Type -> bool exception Unify val unify: Type * Type -> unit (* Unify *) val unifyRestricted: TyVarSet -> Type * Type -> unit (* Unify *) val makeEquality: Type -> unit (* Unify *) val defaultOverloaded: Type -> unit (* Operations on rows *) val emptyRho: RowType val singletonRho: Lab * Type -> RowType val insertRho: RowType * Lab * Type -> RowType val inventRho: unit -> RowType val findLab: RowType * Lab -> Type option end (* stop of TYPE.sml *) (* start of Type.sml *) (* * Standard ML types * * Definition, section 4.2 and 4.4 * * Notes: * - Types are references so that unification can work via side effects. * We need links (forwards) to unify two type variables. * - Types built bottom-up have to be `normalised' to induce the required * sharing on type variables. * - Care has to be taken to clone types at the proper places. * - Substitution creates a clone, but shares free type variables. * - To represent overloaded type (variables), we add a special type. * - Record types may contain a row variable to represent open record types * (which appear during type inference). Flexible rows have to carry an * equality flag to properly propagate equality enforced by unification * when extending a row. *) structure Type :> TYPE = struct (* Import types *) type Lab = Lab.Lab type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type 'a LabMap = 'a LabMap.map type 'a TyVarMap = 'a TyVarMap.map type 'a TyNameMap = 'a TyNameMap.map (* Types [Section 4.2] *) datatype RowVar = CLOSEDRow | FLEXRow of bool (* [r] *) datatype Type' = (* [tau] *) TyVar of TyVar | RowType of RowType | FunType of FunType | ConsType of ConsType | Overloaded of OverloadingClass | Link of Type withtype Type = Type' ref and RowType = Type' ref LabMap * RowVar (* [rho] *) and FunType = Type' ref * Type' ref and ConsType = Type' ref list * TyName type TypeFcn = TyVar list * Type (* [theta] *) type Substitution = Type TyVarMap (* [mu] *) type Realisation = TypeFcn TyNameMap (* [phi] *) (* Creation *) fun invent() = ref(TyVar(TyVar.invent false)) fun fromTyVar alpha = ref(TyVar alpha) fun fromRowType rho = ref(RowType rho) fun fromFunType x = ref(FunType x) fun fromConsType x = ref(ConsType x) fun fromOverloadingClass O = ref(Overloaded O) (* Projections *) fun range(ref(FunType(tau1,tau2))) = tau2 | range tau = tau fun tyname(ref(ConsType(taus,t))) = t | tyname _ = raise Fail "Type.tyname: non-constructed type" (* Induce sharing on equal type variables in a type *) fun normalise tau = let (* Note that Overloaded nodes also have to be shared. * But since such types are always pre-built rather than * infered, we just take care that we construct them with * proper sharing and ignore Overloaded nodes here. *) val alphas = ref [] fun normalise(tau as ref(TyVar(alpha))) = (case List.find (fn(alpha1,_) => alpha1 = alpha) (!alphas) of SOME(_,tau1) => tau1 | NONE => ( alphas := (alpha,tau) :: !alphas ; tau ) ) | normalise(ref(Link(tau))) = normalise tau | normalise(tau as ref tau') = ( tau := normalise' tau' ; tau ) and normalise'(RowType(Rho,r)) = RowType(LabMap.map normalise Rho, r) | normalise'(FunType(tau1,tau2)) = FunType(normalise tau1, normalise tau2) | normalise'(ConsType(taus,t)) = ConsType(List.map normalise taus, t) | normalise'(Overloaded(O)) = Overloaded(O) | normalise' _ = raise Fail "Type.normalise: bypassed type variable or link" in normalise tau end (* Cloning under a substitution and a type realisation *) fun clone (mu,phi) tau = let (* Cloning must respect sharing, so an association list is used * to remember nodes already visited together with their copy. *) val mu' = ref mu val cloned = ref [] fun clone tau = case List.find (fn(tau1,_) => tau1 = tau) (!cloned) of SOME(_,tau2) => tau2 | NONE => let val tau2 = clone' tau in cloned := (tau,tau2) :: !cloned ; tau2 end and clone'(tau as ref(TyVar(alpha))) = (case TyVarMap.find(!mu', alpha) of NONE => tau | SOME tau => tau ) | clone'(ref(RowType(Rho,r))) = ref(RowType(LabMap.map clone Rho, r)) | clone'(ref(FunType(tau1,tau2))) = ref(FunType(clone tau1, clone tau2)) | clone'(tau as ref(ConsType(taus,t))) = let val taus2 = List.map clone taus in case TyNameMap.find(phi, t) of NONE => ref(ConsType(taus2,t)) | SOME(alphas,tau1) => let val cloned' = !cloned in mu' := ListPair.foldl (fn(alpha,tau2,mu) => TyVarMap.insert(mu,alpha,tau2)) (!mu') (alphas,taus2) ; clone' tau1 before cloned := cloned' end end | clone'(ref(Overloaded(O))) = ref(Overloaded(O)) | clone'(ref(Link(tau))) = clone tau in clone tau end (* Substitution, and realisation [Section 5.2] *) fun substitute mu = clone(mu,TyNameMap.empty) fun realise phi = clone(TyVarMap.empty,phi) (* Type variable and type name extraction [Section 4.2] *) fun tyvars(ref tau') = tyvars' tau' and tyvars'(TyVar(alpha)) = TyVarSet.singleton alpha | tyvars'(RowType(Rho,r)) = LabMap.foldl (fn(tau,U) => TyVarSet.union(U, tyvars tau)) TyVarSet.empty Rho | tyvars'(FunType(tau1,tau2)) = TyVarSet.union(tyvars tau1, tyvars tau2) | tyvars'(ConsType(taus,t)) = List.foldl (fn(tau,U) => TyVarSet.union(U, tyvars tau)) TyVarSet.empty taus | tyvars'(Overloaded(O)) = TyVarSet.empty | tyvars'(Link(tau)) = tyvars tau fun tynames(ref tau') = tynames' tau' and tynames'(TyVar(alpha)) = TyNameSet.empty | tynames'(RowType(Rho,r)) = LabMap.foldl (fn(tau,T) => TyNameSet.union(T, tynames tau)) TyNameSet.empty Rho | tynames'(FunType(tau1,tau2)) = TyNameSet.union(tynames tau1, tynames tau2) | tynames'(ConsType(taus,t)) = let val T = List.foldl (fn(tau,T) => TyNameSet.union(T, tynames tau)) TyNameSet.empty taus in TyNameSet.add(T, t) end | tynames'(Overloaded(O)) = (* Conservative approximation *) OverloadingClass.set O | tynames'(Link(tau)) = tynames tau (* Check for equality type [Section 4.4] *) fun admitsEquality(ref tau') = admitsEquality' tau' and admitsEquality'(TyVar alpha) = TyVar.admitsEquality alpha orelse not(TyVar.isExplicit alpha) | admitsEquality'(RowType(Rho,CLOSEDRow)) = LabMap.all admitsEquality Rho | admitsEquality'(RowType(Rho,FLEXRow _)) = raise Fail "Type.admitsEquality: flexible row" | admitsEquality'(FunType _) = false | admitsEquality'(ConsType(taus,t)) = (case TyName.equality t of TyName.SPECIALEQ => true | TyName.EQ => List.all admitsEquality taus | TyName.NOEQ => false ) | admitsEquality'(Overloaded(O)) = raise Fail "Type.admitsEquality: overloaded type" | admitsEquality'(Link(tau)) = admitsEquality tau (* Look for flexible records *) fun isFlexible(ref tau') = isFlexible' tau' and isFlexible'(TyVar(alpha')) = false | isFlexible'(RowType(Rho,r)) = r <> CLOSEDRow orelse LabMap.exists isFlexible Rho | isFlexible'(FunType(tau1,tau2)) = isFlexible tau1 orelse isFlexible tau2 | isFlexible'(ConsType(taus,t)) = List.exists isFlexible taus | isFlexible'(Overloaded(O)) = false | isFlexible'(Link(tau)) = isFlexible tau (* Unification *) exception Unify fun occurs(alpha, ref tau') = occurs'(alpha, tau') and occurs'(alpha, TyVar(alpha')) = alpha = alpha' | occurs'(alpha, RowType(Rho,r)) = LabMap.exists (fn tau => occurs(alpha, tau)) Rho | occurs'(alpha, FunType(tau1,tau2)) = occurs(alpha, tau1) orelse occurs(alpha, tau2) | occurs'(alpha, ConsType(taus,t)) = List.exists (fn tau => occurs(alpha, tau)) taus | occurs'(alpha, Overloaded(O)) = false | occurs'(alpha, Link(tau)) = occurs(alpha, tau) fun unify(ref(Link(tau1)), tau2) = unify(tau1, tau2) | unify(tau1, ref(Link(tau2))) = unify(tau1, tau2) | unify(tau1 as ref tau1', tau2 as ref tau2') = if tau1 = tau2 then () else let val tau' = Link(ref(unify'(tau1',tau2'))) in tau1 := tau' ; tau2 := tau' end and unify'(TyVar(alpha), tau') = unifyTyVar(alpha, tau') | unify'(tau', TyVar(alpha)) = unifyTyVar(alpha, tau') | unify'(Overloaded(O), tau') = unifyOverloaded(O, tau') | unify'(tau', Overloaded(O)) = unifyOverloaded(O, tau') | unify'(tau' as FunType(tau11,tau12), FunType(tau21,tau22)) = ( unify(tau11,tau21) ; unify(tau12,tau22) ; tau' ) | unify'(RowType(Rho1,r1), RowType(Rho2,r2)) = let fun unifyField r (lab, tau1, Rho) = case LabMap.find(Rho, lab) of SOME tau2 => ( unify(tau1,tau2) ; #1(LabMap.remove(Rho,lab)) ) | NONE => case r of CLOSEDRow => raise Unify | FLEXRow eq => ( if eq then makeEquality tau1 else () ; Rho ) val Rho1' = LabMap.foldli (unifyField r1) Rho1 Rho2 val _ = LabMap.foldli (unifyField r2) Rho2 Rho1' val r = case (r1,r2) of (CLOSEDRow, _) => CLOSEDRow | (_, CLOSEDRow) => CLOSEDRow | (FLEXRow eq1, FLEXRow eq2) => FLEXRow(eq1 orelse eq2) in RowType(LabMap.unionWith #2 (Rho2,Rho1'), r) end | unify'(tau' as ConsType(taus1,t1), ConsType(taus2,t2)) = if t1 = t2 then ( ListPair.app unify (taus1,taus2) ; tau' ) else raise Unify | unify' _ = raise Unify and unifyTyVar(alpha1, TyVar(alpha2)) = if alpha1 = alpha2 then TyVar(alpha2) else if not(TyVar.isExplicit alpha1) then bindTyVar(alpha1, TyVar(alpha2)) else if not(TyVar.isExplicit alpha2) then bindTyVar(alpha2, TyVar(alpha1)) else raise Unify | unifyTyVar(alpha, tau') = if TyVar.isExplicit alpha orelse occurs'(alpha, tau') then raise Unify else bindTyVar(alpha, tau') and bindTyVar(alpha, tau') = if TyVar.admitsEquality alpha then makeEquality' tau' else tau' and unifyOverloaded(O, TyVar(alpha2)) = unifyTyVar(alpha2, Overloaded(O)) | unifyOverloaded(O, tau' as ConsType([],t)) = if OverloadingClass.member(O, t) then tau' else raise Unify | unifyOverloaded(O1, Overloaded(O2)) = (case OverloadingClass.intersection(O1,O2) of NONE => raise Unify | SOME O => Overloaded(O) ) | unifyOverloaded(O, _) = raise Unify and makeEquality(tau as ref tau') = tau := makeEquality' tau' and makeEquality'(TyVar(alpha)) = if TyVar.admitsEquality alpha then TyVar(alpha) else if TyVar.isExplicit alpha then raise Unify else TyVar(TyVar.invent true) | makeEquality'(RowType(Rho,r)) = ( LabMap.app makeEquality Rho ; RowType(Rho, case r of CLOSEDRow => CLOSEDRow | FLEXRow _ => FLEXRow true) ) | makeEquality'(FunType _) = raise Unify | makeEquality'(tau' as ConsType(taus,t)) = (case TyName.equality t of TyName.SPECIALEQ => tau' | TyName.EQ => ( List.app makeEquality taus ; tau' ) | TyName.NOEQ => raise Unify ) | makeEquality'(Overloaded(O)) = (case OverloadingClass.makeEquality O of NONE => raise Unify | SOME O' => Overloaded(O') ) | makeEquality'(Link(tau)) = ( makeEquality tau ; Link(tau) ) fun unifyRestricted U (tau1,tau2) = let fun skolemise(alpha, mu) = let val equality = if TyVar.admitsEquality alpha then TyName.EQ else TyName.NOEQ val tau' = ConsType([], TyName.invent(0,equality)) in TyVarMap.insert(mu, alpha, ref tau') end val mu = TyVarSet.foldl skolemise TyVarMap.empty U in unify(substitute mu tau1, substitute mu tau2) end (* Assign default type to overloaded type components [Appendix E] *) fun defaultOverloaded(tau as ref(Overloaded(O))) = tau := ConsType([], OverloadingClass.default O) | defaultOverloaded(ref tau') = defaultOverloaded' tau' and defaultOverloaded'(TyVar(alpha')) = () | defaultOverloaded'(RowType(Rho,r)) = LabMap.app defaultOverloaded Rho | defaultOverloaded'(FunType(tau1,tau2)) = ( defaultOverloaded tau1 ; defaultOverloaded tau2 ) | defaultOverloaded'(ConsType(taus,t)) = List.app defaultOverloaded taus | defaultOverloaded'(Overloaded(O)) = raise Fail "Type.defaultOverloaded: bypassed overloaded type" | defaultOverloaded'(Link(tau)) = defaultOverloaded tau (* Operations on rows *) val emptyRho = ( LabMap.empty, CLOSEDRow ) fun singletonRho(lab,tau) = ( LabMap.singleton(lab,tau), CLOSEDRow ) fun inventRho() = ( LabMap.empty, FLEXRow false ) fun insertRho((Rho,r), lab, tau) = ( LabMap.insert(Rho, lab, tau), r ) fun findLab((Rho,r), lab) = LabMap.find(Rho, lab) end (* stop of Type.sml *) (* start of TYPESCHEME.sml *) (* * Standard ML type schemes * * Definition, section 4.2, 4.5, and 4.8 * * Note: * Instantiation copies a type (except free type variables). * Closure does not! *) signature TYPESCHEME = sig (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Substitution = Type.Substitution type Realisation = Type.Realisation type 'a TyNameMap = 'a TyNameMap.map (* Type [Section 4.2] *) type TypeScheme = TyVar list * Type (* [sigma] *) (* Operations *) val instance: TypeScheme -> Type val instance': TypeScheme -> TyVar list * Type val Clos: Type -> TypeScheme val ClosRestricted: TyVarSet -> Type -> TypeScheme val isClosed: TypeScheme -> bool val tyvars: TypeScheme -> TyVarSet val tynames: TypeScheme -> TyNameSet val normalise: TypeScheme -> TypeScheme val generalises: TypeScheme * TypeScheme -> bool val equals: TypeScheme * TypeScheme -> bool val substitute: Substitution -> TypeScheme -> TypeScheme val realise: Realisation -> TypeScheme -> TypeScheme end (* stop of TYPESCHEME.sml *) (* start of TypeScheme.sml *) (* * Standard ML type schemes * * Definition, section 4.2, 4.5, and 4.8 * * Note: * Instantiation copies a type (except free type variables). * Closure does not! *) structure TypeScheme :> TYPESCHEME = struct (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Substitution = Type.Substitution type Realisation = Type.Realisation type 'a TyNameMap = 'a TyNameMap.map (* Type [Section 4.2] *) type TypeScheme = TyVar list * Type (* [sigma] *) (* Some helper (this should be in the library...) *) fun List_foldri f y0 xs = let fun fold(n, []) = y0 | fold(n, x::xs) = f(n, x, fold(n+1,xs)) in fold(0,xs) end (* Type variable and type name extraction [Section 4.2] *) fun tyvars (alphas,tau) = let val U = Type.tyvars tau in List.foldl (fn(alpha,U) => TyVarSet.delete(U,alpha) handle LibBase.NotFound => U) U alphas end fun tynames (alphas,tau) = Type.tynames tau (* Instantiation *) fun instance' (alphas,tau) = let val alphas' = List.map TyVar.instance alphas val mu = ListPair.foldl (fn(alpha, alpha', mu) => TyVarMap.insert(mu, alpha, Type.fromTyVar alpha')) TyVarMap.empty (alphas, alphas') in ( alphas', Type.substitute mu tau ) end fun instance sigma = #2(instance' sigma) (* Generalisation [Section 4.5] *) fun generalisesType(sigma, tau) = let val U = Type.tyvars tau in ( Type.unifyRestricted U (instance sigma, tau) ; true ) handle Type.Unify => false end fun generalises(sigma1, sigma2) = generalisesType(sigma1, instance sigma2) (* Closure [Section 4.8] *) fun Clos tau = (* Does not copy! *) ( TyVarSet.listItems(Type.tyvars tau), tau ) fun ClosRestricted U tau = ( TyVarSet.listItems(TyVarSet.difference(Type.tyvars tau, U)), tau ) fun isClosed (alphas,tau) = TyVarSet.isSubset(Type.tyvars tau, TyVarSet.fromList alphas) (* Comparison [Section 4.5] *) fun equals((alphas1,tau1), (alphas2,tau2)) = List.length alphas1 = List.length alphas2 andalso let fun insert(alpha1, alpha2, mu) = TyVarMap.insert(mu, alpha1, Type.fromTyVar alpha2) val (alphas2',tau2') = instance' (alphas2,tau2) val mu = ListPair.foldl insert TyVarMap.empty (alphas1,alphas2') val tau1' = Type.substitute mu tau1 val U = TyVarSet.fromList alphas2' in ( Type.unifyRestricted U (tau1',tau2') ; true ) handle Type.Unify => false end (* Normalisation (for output) *) fun normalise (alphas,tau) = let fun insert(n, alpha, (alphas',mu)) = let val alpha' = TyVar.normalise(alpha, n) val tau = Type.fromTyVar alpha' in ( alpha'::alphas', TyVarMap.insert(mu, alpha,tau) ) end val (alphas',mu) = List_foldri insert (nil,TyVarMap.empty) alphas in ( alphas', Type.substitute mu tau ) end (* Substitution *) fun substitute mu (alphas,tau) = let val mu' = List.foldl (fn(alpha,mu) => #1(TyVarMap.remove(mu,alpha)) handle LibBase.NotFound => mu) mu alphas in ( alphas, Type.substitute mu' tau ) end (* Realisation [Section 5.2] *) fun realise phi (alphas,tau) = (alphas, Type.realise phi tau) end (* stop of TypeScheme.sml *) (* start of TYPEFCN.sml *) (* * Standard ML type functions * * Definition, section 4.2, 4.4, and 4.8 * * Note: * Application copies the type (except free type variables). *) signature TYPEFCN = sig (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.TypeFcn TyNameMap.map (* Type [Section 4.2] *) type TypeFcn = Type.TypeFcn (* [theta] *) (* Operations *) val fromTyName: TyName -> TypeFcn val toTyName: TypeFcn -> TyName option val isClosed: TypeFcn -> bool val arity: TypeFcn -> int val admitsEquality: TypeFcn -> bool val tyvars: TypeFcn -> TyVarSet val tynames: TypeFcn -> TyNameSet val normalise: TypeFcn -> TypeFcn val rename: TypeFcn -> TypeFcn val equals: TypeFcn * TypeFcn -> bool exception Apply val apply: Type list * TypeFcn -> Type (* may raise Apply *) val realise: Realisation -> TypeFcn -> TypeFcn val makeEquality: TypeFcn -> unit end (* stop of TYPEFCN.sml *) (* start of TypeFcn.sml *) (* * Standard ML type functions * * Definition, section 4.2, 4.4, and 4.8 * * Note: * Application copies the type (except free type variables). *) structure TypeFcn :> TYPEFCN = struct (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.TypeFcn TyNameMap.map (* Type [Section 4.2] *) type TypeFcn = Type.TypeFcn (* [theta] *) (* Operations *) val tyvars = TypeScheme.tyvars (* same type ;-) *) val tynames = TypeScheme.tynames val equals = TypeScheme.equals val isClosed = TypeScheme.isClosed val realise = TypeScheme.realise val rename = TypeScheme.instance' val normalise = TypeScheme.normalise (* Arity [Section 4.4] *) fun arity (alphas,tau) = List.length alphas (* Equality [Section 4.4] *) fun admitsEquality (alphas,tau) = let fun insert(alpha, mu) = TyVarMap.insert(mu, alpha, Type.fromTyVar(TyVar.invent true)) val mu = List.foldl insert TyVarMap.empty alphas in Type.admitsEquality(Type.substitute mu tau) end (* Eta-conversion [Section 4.4] *) fun fromTyName t = let val alphas = List.tabulate(TyName.arity t, TyVar.fromIndex false) in ( alphas, Type.fromConsType(List.map Type.fromTyVar alphas, t) ) end fun toTyName(alphas, ref(Type.ConsType(taus,t))) = t | toTyName _ = raise Fail "TypeFcn.toTyName: invalid type function" fun toTyName(alphas, ref(Type.ConsType(taus,t))) = let fun isSame(alpha, ref(Type.TyVar alpha')) = alpha = alpha' | isSame(alpha, _ ) = false in if List.length alphas = List.length taus andalso ListPair.all isSame (alphas, taus) then SOME t else NONE end | toTyName _ = NONE (* Application [Section 4.4] *) exception Apply fun apply(taus, (alphas,tau)) = if List.length taus <> List.length alphas then raise Apply else let fun insert(alpha, tau, mu) = TyVarMap.insert(mu, alpha, tau) val mu = ListPair.foldl insert TyVarMap.empty (alphas, taus) in Type.substitute mu tau end (* Make it an equality type *) fun makeEquality (alphas,tau) = Type.makeEquality tau end (* stop of TypeFcn.sml *) (* start of IDSTATUS.sml *) (* * Standard ML identifier status * * Definition, sections 4.1 and 5.5 *) signature IDSTATUS = sig (* Type [Section 4.1] *) datatype IdStatus = c | e | v (* [is] *) (* Operations *) val generalises: IdStatus * IdStatus -> bool end (* stop of IDSTATUS.sml *) (* start of IdStatus.sml *) (* * Standard ML identifier status * * Definition, sections 4.1 and 5.5 *) structure IdStatus :> IDSTATUS = struct (* Type [Section 4.1] *) datatype IdStatus = c | e | v (* [is] *) (* Generalisation [Section 5.5] *) fun generalises(is1,is2) = is1 = is2 orelse is2 = v end (* stop of IdStatus.sml *) (* start of GENERIC_ENV.sml *) (* * Standard ML generic core environment * * Definition, sections 4.2, 4.3, 6.3 and 7.2 * * Notes: * - A datatype Str is necessary to break the recursion * between Env and StrEnv. * - Also, all types are parameterised over the range of value and type * environments. This is because of the recursion between values and * the dynamic environment (via function closures) -- we cannot make them * into functor parameters as this would require recursive structures. *) signature GENERIC_ENV = sig (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type IdStatus = IdStatus.IdStatus type 'a VIdMap = 'a VIdMap.map type 'a TyConMap = 'a TyConMap.map type 'a StrIdMap = 'a StrIdMap.map (* Export types [Section 4.2 and 6.3] *) datatype ('a,'b) Str' = Str of (*Env*) ('a,'b) Str' StrIdMap * 'b TyConMap * 'a VIdMap type 'a ValEnv' = 'a VIdMap type 'b TyEnv' = 'b TyConMap type ('a,'b) StrEnv' = ('a,'b) Str' StrIdMap type ('a,'b) Env' = ('a,'b) StrEnv' * 'b TyEnv' * 'a ValEnv' (* Operations *) val empty: ('a,'b) Env' val fromSE: ('a,'b) StrEnv' -> ('a,'b) Env' val fromTE: 'b TyEnv' -> ('a,'b) Env' val fromVE: 'a ValEnv' -> ('a,'b) Env' val fromVEandTE: 'a ValEnv' * 'b TyEnv' -> ('a,'b) Env' val plus: ('a,'b) Env' * ('a,'b) Env' -> ('a,'b) Env' val plusVE: ('a,'b) Env' * 'a ValEnv' -> ('a,'b) Env' val plusTE: ('a,'b) Env' * 'b TyEnv' -> ('a,'b) Env' val plusSE: ('a,'b) Env' * ('a,'b) StrEnv' -> ('a,'b) Env' val plusVEandTE: ('a,'b) Env' * ('a ValEnv' * 'b TyEnv') -> ('a,'b) Env' val findVId: ('a,'b) Env' * VId -> 'a option val findTyCon: ('a,'b) Env' * TyCon -> 'b option val findStrId: ('a,'b) Env' * StrId -> ('a,'b) Str' option val findLongVId: ('a,'b) Env' * longVId -> 'a option val findLongTyCon: ('a,'b) Env' * longTyCon -> 'b option val findLongStrId: ('a,'b) Env' * longStrId -> ('a,'b) Str' option val disjoint: ('a,'b) Env' * ('a,'b) Env' -> bool end (* stop of GENERIC_ENV.sml *) (* start of GenericEnvFn.sml *) (* * Standard ML generic core environment * * Definition, sections 4.2, 4.3, 6.3 and 7.2 * * Notes: * - A datatype Str is necessary to break the recursion * between Env and StrEnv. * - Also, all types are parameterised over the range of value and type * environments. This is because of the recursion between values and * the dynamic environment (via function closures) -- we cannot make them * into functor parameters as this would require recursive structures. *) functor GenericEnvFn() :> GENERIC_ENV = struct (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type IdStatus = IdStatus.IdStatus type 'a VIdMap = 'a VIdMap.map type 'a TyConMap = 'a TyConMap.map type 'a StrIdMap = 'a StrIdMap.map (* Export types [Section 4.2 and 6.3] *) datatype ('a,'b) Str' = Str of (*Env*) ('a,'b) Str' StrIdMap * 'b TyConMap * 'a VIdMap type 'a ValEnv' = 'a VIdMap (* [VE] *) type 'b TyEnv' = 'b TyConMap (* [TE] *) type ('a,'b) StrEnv' = ('a,'b) Str' StrIdMap (* [SE] *) type ('a,'b) Env' = ('a,'b) StrEnv' * 'b TyEnv' * 'a ValEnv' (* [E] *) (* Injections [Section 4.3] *) val empty = ( StrIdMap.empty, TyConMap.empty, VIdMap.empty ) fun fromSE SE = ( SE, TyConMap.empty, VIdMap.empty ) fun fromTE TE = ( StrIdMap.empty, TE, VIdMap.empty ) fun fromVE VE = ( StrIdMap.empty, TyConMap.empty, VE ) fun fromVEandTE(VE,TE) = ( StrIdMap.empty, TE, VE ) (* Modifications [Section 4.3] *) infix plus plusVE plusTE plusSE plusVEandTE fun (SE,TE,VE) plus (SE',TE',VE') = ( StrIdMap.unionWith #2 (SE,SE') , TyConMap.unionWith #2 (TE,TE') , VIdMap.unionWith #2 (VE,VE') ) fun (SE,TE,VE) plusVE VE' = ( SE, TE, VIdMap.unionWith #2 (VE,VE') ) fun (SE,TE,VE) plusTE TE' = ( SE, TyConMap.unionWith #2 (TE,TE'), VE ) fun (SE,TE,VE) plusSE SE' = ( StrIdMap.unionWith #2 (SE,SE'), TE, VE ) fun (SE,TE,VE) plusVEandTE (VE',TE') = ( SE , TyConMap.unionWith #2 (TE,TE') , VIdMap.unionWith #2 (VE,VE') ) (* Application (lookup) [Section 4.3] *) fun findVId ((SE,TE,VE), vid) = VIdMap.find(VE, vid) fun findTyCon((SE,TE,VE), tycon) = TyConMap.find(TE, tycon) fun findStrId((SE,TE,VE), strid) = StrIdMap.find(SE, strid) fun findLongX'(E, findX, [], x) = findX(E, x) | findLongX'(E, findX, strid::strids, x) = Option.mapPartial (fn E => findLongX'(E, findX, strids, x)) (Option.map (fn Str E => E) (findStrId(E, strid))) fun findLongX (explodeLongX, findX) (E, longX) = let val (strids,x) = explodeLongX longX in findLongX'(E, findX, strids, x) end fun findLongVId x = findLongX (LongVId.explode, findVId) x fun findLongTyCon x = findLongX (LongTyCon.explode, findTyCon) x fun findLongStrId x = findLongX (LongStrId.explode, findStrId) x (* Disjointness *) fun disjoint((SE1,TE1,VE1), (SE2,TE2,VE2)) = StrIdMap.disjoint(SE1,SE2) andalso TyConMap.disjoint(TE1,TE2) andalso VIdMap.disjoint(VE1,VE2) end (* stop of GenericEnvFn.sml *) (* start of STATIC_ENV.sml *) (* * Standard ML environments of the static semantics of the core * * Definition, sections 4.2, 4.3, 4.8, 4.9, and 5.5 * * Note: * We call the domain type of value environments ValStr. *) signature STATIC_ENV = sig (* Inheritance *) include GENERIC_ENV (* Import types *) type TypeScheme = TypeScheme.TypeScheme type TypeFcn = TypeFcn.TypeFcn type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Export types [Section 4.2] *) type ValStr = TypeScheme * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = TypeFcn * ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Operations *) val tyvarsVE: ValEnv -> TyVarSet val tyvars: Env -> TyVarSet val tynamesTE: TyEnv -> TyNameSet val tynamesSE: StrEnv -> TyNameSet val tynames: Env -> TyNameSet val isWellFormed: Env -> bool val Clos: ValEnv -> ValEnv val containsFlexibleType: ValEnv -> bool val defaultOverloaded: ValEnv -> unit val makeEquality: TyEnv -> unit val maximiseEquality: TyEnv * ValEnv -> TyEnv * ValEnv val Abs: TyEnv * Env -> Env val realise: Realisation -> Env -> Env val enriches: Env * Env -> bool end (* stop of STATIC_ENV.sml *) (* start of StaticEnv.sml *) (* * Standard ML environments of the static semantics of the core * * Definition, sections 4.2, 4.3, 4.8, 4.9, and 5.5 * * Note: * We call the domain type of value environments ValStr. *) structure StaticEnv :> STATIC_ENV = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import types *) type TypeScheme = TypeScheme.TypeScheme type TypeFcn = TypeFcn.TypeFcn type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Export types [Section 4.2] *) type ValStr = TypeScheme * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = TypeFcn * ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Further modifications [Section 4.3] *) infix TEplus fun TE' TEplus (SE,TE,VE) = ( SE, TyConMap.unionWith #2 (TE',TE), VE ) (* Type variable and type name set [Section 4.2] *) fun tyvarsVE VE = VIdMap.foldl (fn((sigma,is), U) => TyVarSet.union(U, TypeScheme.tyvars sigma)) TyVarSet.empty VE fun tyvarsTE TE = TyConMap.foldl (fn((theta,VE), U) => TyVarSet.union(TyVarSet.union (U, TypeFcn.tyvars theta), tyvarsVE VE)) TyVarSet.empty TE fun tyvarsSE SE = StrIdMap.foldl (fn(Str E, U) => TyVarSet.union(U, tyvars E)) TyVarSet.empty SE and tyvars (SE,TE,VE) = TyVarSet.union(TyVarSet.union(tyvarsSE SE, tyvarsTE TE), tyvarsVE VE) fun tynamesVE VE = VIdMap.foldl (fn((sigma,is), T) => TyNameSet.union(T, TypeScheme.tynames sigma)) TyNameSet.empty VE fun tynamesTE TE = TyConMap.foldl (fn((theta,VE), T) => TyNameSet.union(TyNameSet.union (T, TypeFcn.tynames theta), tynamesVE VE)) TyNameSet.empty TE fun tynamesSE SE = StrIdMap.foldl (fn(Str E, T) => TyNameSet.union(T, tynames E)) TyNameSet.empty SE and tynames (SE,TE,VE) = TyNameSet.union(TyNameSet.union(tynamesSE SE, tynamesTE TE), tynamesVE VE) (* Well-formedness [Section 4.9] *) fun isWellFormedTyStr (theta,VE) = VIdMap.isEmpty VE orelse isSome(TypeFcn.toTyName theta) fun isWellFormedTE TE = TyConMap.all isWellFormedTyStr TE fun isWellFormedSE SE = StrIdMap.all (fn Str E => isWellFormed E) SE and isWellFormed (SE,TE,VE) = isWellFormedTE TE andalso isWellFormedSE SE (* Closure [Section 4.8] *) fun Clos VE = VIdMap.map (fn((_,tau), is) => (TypeScheme.Clos tau, is)) VE (* Check for unresolved flexible record types [Section 4.11, item 1] *) fun containsFlexibleType VE = VIdMap.exists (fn((_,tau), is) => Type.isFlexible tau) VE (* Assign default types to overloaded types [Appendix E] *) fun defaultOverloaded VE = VIdMap.app (fn((_,tau), is) => Type.defaultOverloaded tau) VE (* Realisation [Section 5.2] *) fun realiseVE phi VE = VIdMap.map (fn(sigma,is) => ( TypeScheme.realise phi sigma, is )) VE and realiseTE phi TE = TyConMap.map (fn(theta,VE) => ( TypeFcn.realise phi theta , realiseVE phi VE )) TE and realiseSE phi SE = StrIdMap.map (fn(Str E) => Str(realise phi E)) SE and realise phi (SE,TE,VE) = ( realiseSE phi SE , realiseTE phi TE , realiseVE phi VE ) (* Make all type names bound in a type environment equality types *) (* Assumes abstract types, i.e. no constructors. *) fun makeEquality TE = TyConMap.app (fn(theta,VE) => TypeFcn.makeEquality theta) TE (* Maximise equality of a type environment [Section 4.9], * together with its appendant value envrionment *) fun admitsEqualityValStr ((_,tau),_) = Type.admitsEquality tau fun maximiseEquality(TE,VE) = let fun checkTyStr((theta,VE), (phi,changed)) = let val t = valOf(TypeFcn.toTyName theta) in if TyName.equality t = TyName.EQ andalso not(VIdMap.all admitsEqualityValStr VE) then ( TyNameMap.insert(phi, t, TypeFcn.fromTyName (TyName.removeEquality t) ) , true ) else ( phi, changed ) end fun checkTE(TE, phi) = let val (phi',change) = TyConMap.foldl checkTyStr (phi,false) TE val TE' = realiseTE phi' TE in if change then checkTE(TE', phi') else (TE', phi') end val (TE',phi) = checkTE(TE, TyNameMap.empty) in ( TE', realiseVE phi VE ) end (* Abstraction of a type environment [Section 4.9] *) fun AbsTE(TE) = TyConMap.map (fn(theta,_) => (theta,VIdMap.empty)) TE fun Abs(TE,E) = let val ts = tynamesTE TE val phi = TyNameSet.foldl (fn(t,phi) => TyNameMap.insert(phi, t, TypeFcn.fromTyName(TyName.Abs t))) TyNameMap.empty ts in realise phi (AbsTE(TE) TEplus E) end (* Disjointness *) fun disjoint((SE1,TE1,VE1), (SE2,TE2,VE2)) = StrIdMap.disjoint(SE1,SE2) andalso TyConMap.disjoint(TE1,TE2) andalso VIdMap.disjoint(VE1,VE2) (* Enrichment [Section 5.5] *) fun equalsVE(VE1,VE2) = VIdMap.numItems VE1 = VIdMap.numItems VE2 andalso VIdMap.alli (fn(vid, (sigma1,is1)) => case VIdMap.find(VE2, vid) of NONE => false | SOME(sigma2,is2) => TypeScheme.equals(sigma1,sigma2) andalso is1 = is2 ) VE1 fun enriches((SE1,TE1,VE1), (SE2,TE2,VE2)) = enrichesSE(SE1,SE2) andalso enrichesTE(TE1,TE2) andalso enrichesVE(VE1,VE2) and enrichesSE(SE1,SE2) = StrIdMap.alli (fn(strid, Str E2) => case StrIdMap.find(SE1, strid) of NONE => false | SOME(Str E1) => enriches(E1,E2) ) SE2 and enrichesTE(TE1,TE2) = TyConMap.alli (fn(tycon, tystr2) => case TyConMap.find(TE1, tycon) of NONE => false | SOME tystr1 => enrichesTyStr(tystr1,tystr2) ) TE2 and enrichesVE(VE1,VE2) = VIdMap.alli (fn(vid, valstr2) => case VIdMap.find(VE1, vid) of NONE => false | SOME valstr1 => enrichesValStr(valstr1,valstr2) ) VE2 and enrichesTyStr((theta1,VE1), (theta2,VE2)) = TypeFcn.equals(theta1,theta2) andalso ( VIdMap.isEmpty VE2 orelse equalsVE(VE1,VE2) ) and enrichesValStr((sigma1,is1), (sigma2,is2)) = TypeScheme.generalises(sigma1,sigma2) andalso IdStatus.generalises(is1,is2) end (* stop of StaticEnv.sml *) (* start of SIG.sml *) (* * Standard ML signatures * * Definition, sections 5.1, 5.3, and 5.6 *) signature SIG = sig (* Import types *) type Env = StaticEnv.Env type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Type [Section 5.1] *) type Sig = TyNameSet * Env (* [Sigma] *) (* Operations *) val tyvars: Sig -> TyVarSet val tynames: Sig -> TyNameSet val rename: Sig -> Sig exception Match val match: Env * Sig -> Env * Realisation (* Matching *) end (* stop of SIG.sml *) (* start of Sig.sml *) (* * Standard ML signatures * * Definition, sections 5.1, 5.3, and 5.6 *) structure Sig :> SIG = struct (* Import types *) type Env = StaticEnv.Env type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Type [Section 5.1] *) type Sig = TyNameSet * Env (* [Sigma] *) (* Type variable and type name extraction [Section 4.2] *) fun tyvars (T,E) = StaticEnv.tyvars E fun tynames (T,E) = TyNameSet.difference(StaticEnv.tynames E, T) (* Alpha Renaming *) fun rename (T,E) = let val phi' = TyNameSet.foldl (fn(t,phi')=> TyNameMap.insert(phi',t,TyName.rename t)) TyNameMap.empty T val phi = TyNameMap.map TypeFcn.fromTyName phi' val T' = TyNameSet.map (fn t => valOf(TyNameMap.find(phi',t))) T val E' = StaticEnv.realise phi E in (T',E') end (* Matching [Section 5.6] *) exception Match fun matchTypeFcn(theta', theta, phi, T) = if TypeFcn.arity theta <> TypeFcn.arity theta' then raise Match else case TypeFcn.toTyName theta of NONE => phi | SOME t => if isSome(TyNameMap.find(phi, t)) orelse not(TyNameSet.member(T, t)) then phi else let val phi' = TyNameMap.insert(phi, t, TypeFcn.rename theta') in TyNameMap.map (TypeFcn.realise phi') phi' end fun matchTE(TE', TE, phi, T) = let fun matchTyStr(tycon, (theta,VE), phi) = case TyConMap.find(TE', tycon) of NONE => raise Match | SOME(theta',VE') => matchTypeFcn(theta', theta, phi, T) in TyConMap.foldli matchTyStr phi TE end fun matchSE(SE', SE, phi, T) = let fun matchStr(strid, StaticEnv.Str E, phi) = case StrIdMap.find(SE', strid) of NONE => raise Match | SOME(StaticEnv.Str E') => matchE(E', E, phi, T) in StrIdMap.foldli matchStr phi SE end and matchE((SE',TE',VE'), (SE,TE,VE), phi, T) = let val phi1 = matchTE(TE', TE, phi, T) val phi2 = matchSE(SE', SE, phi1, T) in phi2 end fun match(E', (T,E)) = let val phi = matchE(E', E, TyNameMap.empty, T) val E'' = StaticEnv.realise phi E in if StaticEnv.enriches(E',E'') then (E'', phi) else raise Match end end (* stop of Sig.sml *) (* start of FUNSIG.sml *) (* * Standard ML functor signatures * * Definition, sections 5.1 and 5.4 *) signature FUNSIG = sig (* Import types *) type Env = StaticEnv.Env type Sig = Sig.Sig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set (* Type [Section 5.1] *) type FunSig = TyNameSet * (Env * Sig) (* [Phi] *) (* Operations *) val tyvars: FunSig -> TyVarSet val tynames: FunSig -> TyNameSet end (* stop of FUNSIG.sml *) (* start of FunSig.sml *) (* * Standard ML functor signatures * * Definition, sections 5.1 and 5.4 *) structure FunSig :> FUNSIG = struct (* Import types *) type Env = StaticEnv.Env type Sig = Sig.Sig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set (* Type [Section 5.1] *) type FunSig = TyNameSet * (Env * Sig) (* [Phi] *) (* Type variable and type name extraction [Section 4.2] *) fun tyvars (T,(E,Sigma)) = TyVarSet.union(StaticEnv.tyvars E, Sig.tyvars Sigma) fun tynames (T,(E,Sigma)) = TyNameSet.difference(TyNameSet.union(StaticEnv.tynames E, Sig.tynames Sigma), T) end (* stop of FunSig.sml *) (* start of CONTEXT.sml *) (* * Standard ML contexts * * Definition, sections 4.2, 4.3, 4.7, and 4.9 *) signature CONTEXT = sig (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type TyName = TyName.TyName type TyNameSet = TyNameSet.set type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type IdStatus = IdStatus.IdStatus type TypeScheme = TypeScheme.TypeScheme type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type TyEnv = StaticEnv.TyEnv type ValStr = StaticEnv.ValStr type ValEnv = StaticEnv.ValEnv type Env = StaticEnv.Env (* Type [Section 4.2] *) type Context = TyNameSet * TyVarSet * Env (* [C] *) (* Operations *) val Tof: Context -> TyNameSet val Uof: Context -> TyVarSet val Eof: Context -> Env val plusVE: Context * ValEnv -> Context val plusU: Context * TyVarSet -> Context val oplusE: Context * Env -> Context val oplusTE: Context * TyEnv -> Context val oplusVEandTE: Context * (ValEnv * TyEnv) -> Context val findVId: Context * VId -> ValStr option val findTyCon: Context * TyCon -> TyStr option val findStrId: Context * StrId -> Str option val findLongVId: Context * longVId -> ValStr option val findLongTyCon: Context * longTyCon -> TyStr option val findLongStrId: Context * longStrId -> Str option val tyvars: Context -> TyVarSet end (* stop of CONTEXT.sml *) (* start of Context.sml *) (* * Standard ML contexts * * Definition, sections 4.2, 4.3, 4.7, and 4.9 *) structure Context :> CONTEXT = struct (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type TyName = TyName.TyName type TyNameSet = TyNameSet.set type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type IdStatus = IdStatus.IdStatus type TypeScheme = TypeScheme.TypeScheme type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type TyEnv = StaticEnv.TyEnv type ValStr = StaticEnv.ValStr type ValEnv = StaticEnv.ValEnv type Env = StaticEnv.Env (* Type [Section 4.2] *) type Context = TyNameSet * TyVarSet * Env (* [C] *) (* Projections [Section 4.3] *) fun Tof (T,U,E) = T fun Uof (T,U,E) = U fun Eof (T,U,E) = E (* Modification [Section 4.3] *) infix plusVE plusU oplusE oplusTE oplusVEandTE fun (T,U,E) plusVE VE = ( T, U, StaticEnv.plusVE(E,VE) ) fun (T,U,E) plusU U' = ( T, TyVarSet.union(U,U'), E ) fun (T,U,E) oplusE E' = ( TyNameSet.union(T, StaticEnv.tynames E) , U , StaticEnv.plus(E,E') ) fun (T,U,E) oplusTE TE = ( TyNameSet.union(T, StaticEnv.tynamesTE TE) , U , StaticEnv.plusTE(E,TE) ) fun (T,U,E) oplusVEandTE (VE,TE) = ( TyNameSet.union(T, StaticEnv.tynamesTE TE) , U , StaticEnv.plusVEandTE(E, (VE,TE)) ) (* Application (lookup) [Section 4.3] *) fun findVId ((T,U,E), vid) = StaticEnv.findVId(E, vid) fun findTyCon((T,U,E), tycon) = StaticEnv.findTyCon(E, tycon) fun findStrId((T,U,E), strid) = StaticEnv.findStrId(E, strid) fun findLongVId ((T,U,E), longvid) = StaticEnv.findLongVId(E,longvid) fun findLongTyCon((T,U,E), longtycon) = StaticEnv.findLongTyCon(E,longtycon) fun findLongStrId((T,U,E), longstrid) = StaticEnv.findLongStrId(E,longstrid) (* Calculation of tyvars [Section 4.2] *) fun tyvars (T,U,E) = TyVarSet.union(U, StaticEnv.tyvars E) end (* stop of Context.sml *) (* start of STATIC_BASIS.sml *) (* * Standard ML static basis and environments of modules * * Definition, section 5.1 *) signature STATIC_BASIS = sig (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = StaticEnv.Env type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type Context = Context.Context type Sig = Sig.Sig type FunSig = FunSig.FunSig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 5.1] *) type SigEnv = Sig SigIdMap (* [G] *) type FunEnv = FunSig FunIdMap (* [F] *) type Basis = TyNameSet * FunEnv * SigEnv * Env (* [B] *) (* Operations *) val empty: Basis val fromTandE: TyNameSet * Env -> Basis val fromTandF: TyNameSet * FunEnv -> Basis val fromTandG: TyNameSet * SigEnv -> Basis val Tof: Basis -> TyNameSet val Cof: Basis -> Context val plus: Basis * Basis -> Basis val plusT: Basis * TyNameSet -> Basis val oplusSE: Basis * StrEnv -> Basis val oplusG: Basis * SigEnv -> Basis val oplusF: Basis * FunEnv -> Basis val oplusE: Basis * Env -> Basis val findStrId: Basis * StrId -> Str option val findSigId: Basis * SigId -> Sig option val findFunId: Basis * FunId -> FunSig option val findLongStrId: Basis * longStrId -> Str option val findLongTyCon: Basis * longTyCon -> TyStr option val tyvars: Basis -> TyVarSet val tynamesF: FunEnv -> TyNameSet val tynamesG: SigEnv -> TyNameSet end (* stop of STATIC_BASIS.sml *) (* start of StaticBasis.sml *) (* * Standard ML static basis and environments of modules * * Definition, section 5.1 *) structure StaticBasis :> STATIC_BASIS = struct (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = StaticEnv.Env type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type Context = Context.Context type Sig = Sig.Sig type FunSig = FunSig.FunSig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 5.1] *) type SigEnv = Sig SigIdMap (* [G] *) type FunEnv = FunSig FunIdMap (* [F] *) type Basis = TyNameSet * FunEnv * SigEnv * Env (* [B] *) (* Calculation of type variable and type name sets [Section 4.2] *) fun tyvarsG G = SigIdMap.foldl (fn(Sigma, U) => TyVarSet.union(U, Sig.tyvars Sigma)) TyVarSet.empty G fun tyvarsF F = FunIdMap.foldl (fn(Phi, U) => TyVarSet.union(U, FunSig.tyvars Phi)) TyVarSet.empty F fun tyvars (T,F,G,E) = TyVarSet.union(TyVarSet.union( tyvarsF F, tyvarsG G), StaticEnv.tyvars E) fun tynamesG G = SigIdMap.foldl (fn(Sigma, T) => TyNameSet.union(T, Sig.tynames Sigma)) TyNameSet.empty G fun tynamesF F = FunIdMap.foldl (fn(Phi, T) => TyNameSet.union(T, FunSig.tynames Phi)) TyNameSet.empty F (* Injection [Sections 4.3 and 5.1] *) val empty = ( TyNameSet.empty, FunIdMap.empty, SigIdMap.empty, StaticEnv.empty ) fun fromTandE(T,E) = ( T, FunIdMap.empty, SigIdMap.empty, E ) fun fromTandF(T,F) = ( T, F, SigIdMap.empty, StaticEnv.empty ) fun fromTandG(T,G) = ( T, FunIdMap.empty, G, StaticEnv.empty ) (* Projections [Sections 4.3 and 5.1] *) fun Tof (T,F,G,E) = T fun Cof (T,F,G,E) = (T, TyVarSet.empty, E) (* Modifications [Sections 4.3 and 5.1] *) infix plus plusT oplusG oplusF oplusE oplusSE fun (T,F,G,E) plus (T',F',G',E') = ( TyNameSet.union(T,T') , FunIdMap.unionWith #2 (F,F') , SigIdMap.unionWith #2 (G,G') , StaticEnv.plus(E,E') ) fun (T,F,G,E) plusT T' = ( TyNameSet.union(T,T'), F, G, E ) fun (T,F,G,E) oplusG G' = ( TyNameSet.union(T, tynamesG G') , F , SigIdMap.unionWith #2 (G,G') , E ) fun (T,F,G,E) oplusF F' = ( TyNameSet.union(T, tynamesF F') , FunIdMap.unionWith #2 (F,F') , G , E ) fun (T,F,G,E) oplusE E' = ( TyNameSet.union(T, StaticEnv.tynames E') , F , G , StaticEnv.plus(E,E') ) fun (T,F,G,E) oplusSE SE = ( TyNameSet.union(T, StaticEnv.tynamesSE SE) , F , G , StaticEnv.plusSE(E,SE) ) (* Application (lookup) [Sections 5.1 and 4.3] *) fun findStrId((T,F,G,E), strid) = StaticEnv.findStrId(E, strid) fun findSigId((T,F,G,E), sigid) = SigIdMap.find(G, sigid) fun findFunId((T,F,G,E), funid) = FunIdMap.find(F, funid) fun findLongStrId((T,F,G,E), longstrid) = StaticEnv.findLongStrId(E, longstrid) fun findLongTyCon((T,F,G,E), longtycon) = StaticEnv.findLongTyCon(E, longtycon) end (* stop of StaticBasis.sml *) (* start of INITIAL_STATIC_ENV.sml *) (* * Standard ML core view of the initial static basis * * Definition, appendices C and E *) signature INITIAL_STATIC_ENV = sig (* Import types *) type Type = Type.Type type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type Env = StaticEnv.Env (* Predefined monomorphic types [Figure 24] *) val tauBool: Type val tauInt: Type val tauWord: Type val tauReal: Type val tauString: Type val tauChar: Type val tauExn: Type (* Overloading classes [Appendix E.1] *) val Int: OverloadingClass val Real: OverloadingClass val Word: OverloadingClass val String: OverloadingClass val Char: OverloadingClass val WordInt: OverloadingClass val RealInt: OverloadingClass val Num: OverloadingClass val NumTxt: OverloadingClass (* Initial environment [Appendix C] *) val T0: TyNameSet val E0: Env end (* stop of INITIAL_STATIC_ENV.sml *) (* start of InitialStaticEnv.sml *) (* * Standard ML core view of the initial static basis * * Definition, appendices C and E *) structure InitialStaticEnv :> INITIAL_STATIC_ENV = struct (* Import *) type Type = Type.Type type TyNameSet = TyNameSet.set type Overloadingclass = OverloadingClass.OverloadingClass type VIdSet = VIdSet.set type Env = StaticEnv.Env type ValEnv = StaticEnv.ValEnv open Type open IdStatus (* Helpers *) fun pairType(tau1,tau2) = let val Rho = LabMap.insert(LabMap.insert(LabMap.empty, Lab.fromInt 1, tau1), Lab.fromInt 2, tau2) in fromRowType (Rho,CLOSEDRow) end (* VIds [Figure 25] *) val vidEq = VId.fromString "=" val vidAssign = VId.fromString ":=" val vidFalse = VId.fromString "false" val vidTrue = VId.fromString "true" val vidNil = VId.fromString "nil" val vidCons = VId.fromString "::" val vidRef = VId.fromString "ref" val vidMatch = VId.fromString "Match" val vidBind = VId.fromString "Bind" (* TyCons [Figure 24] *) val tyconUnit = TyCon.fromString "unit" val tyconBool = TyCon.fromString "bool" val tyconInt = TyCon.fromString "int" val tyconWord = TyCon.fromString "word" val tyconReal = TyCon.fromString "real" val tyconString = TyCon.fromString "string" val tyconChar = TyCon.fromString "char" val tyconList = TyCon.fromString "list" val tyconRef = TyCon.fromString "ref" val tyconExn = TyCon.fromString "exn" (* TyNames [Appendix C] *) val tBool = TyName.tyname(tyconBool, 0, TyName.EQ, 2) val tInt = TyName.tyname(tyconInt, 0, TyName.EQ, 0) val tWord = TyName.tyname(tyconWord, 0, TyName.EQ, 0) val tReal = TyName.tyname(tyconReal, 0, TyName.NOEQ, 0) val tString = TyName.tyname(tyconString, 0, TyName.EQ, 0) val tChar = TyName.tyname(tyconChar, 0, TyName.EQ, 0) val tList = TyName.tyname(tyconList, 1, TyName.EQ, 2) val tRef = TyName.tyname(tyconRef, 1, TyName.SPECIALEQ, 1) val tExn = TyName.tyname(tyconExn, 0, TyName.NOEQ, 0) val T0 = TyNameSet.fromList[tBool, tInt, tWord, tReal, tString, tChar, tList, tRef, tExn] (* Types *) val alpha = TyVar.fromString "'a" val alphaEq = TyVar.fromString "''a" val tauAlpha = fromTyVar alpha val tauAlphaEq = fromTyVar alphaEq val tauUnit = fromRowType emptyRho val tauBool = fromConsType([], tBool) val tauInt = fromConsType([], tInt) val tauWord = fromConsType([], tWord) val tauReal = fromConsType([], tReal) val tauString = fromConsType([], tString) val tauChar = fromConsType([], tChar) val tauExn = fromConsType([], tExn) val tauAlphaList = fromConsType([tauAlpha], tList) val tauAlphaRef = fromConsType([tauAlpha], tRef) (* TypeSchemes [Figure 25] *) val sigmaEq = ([alphaEq], fromFunType(pairType(tauAlphaEq,tauAlphaEq), tauBool)) val sigmaAssign = ([alpha], fromFunType(pairType(tauAlphaRef,tauAlpha), tauUnit)) val sigmaFalse = ([], tauBool) val sigmaTrue = ([], tauBool) val sigmaNil = ([alpha], tauAlphaList) val sigmaCons = ([alpha], fromFunType(pairType(tauAlpha, tauAlphaList), tauAlphaList)) val sigmaRef = ([alpha], fromFunType(tauAlpha, tauAlphaRef)) val sigmaMatch = ([], tauExn) val sigmaBind = ([], tauExn) (* Value entries [Figure 25] *) val valstrEq = (sigmaEq, v) val valstrAssign = (sigmaAssign, v) val valstrFalse = (sigmaFalse, c) val valstrTrue = (sigmaTrue, c) val valstrNil = (sigmaNil, c) val valstrCons = (sigmaCons, c) val valstrRef = (sigmaRef, c) val valstrMatch = (sigmaMatch, e) val valstrBind = (sigmaBind, e) (* TypeFcns [Figure 24] *) val thetaUnit = ([], tauUnit) val thetaBool = ([], tauBool) val thetaInt = ([], tauInt) val thetaWord = ([], tauWord) val thetaReal = ([], tauReal) val thetaString = ([], tauString) val thetaChar = ([], tauChar) val thetaExn = ([], tauExn) val thetaList = ([alpha], tauAlphaList) val thetaRef = ([alpha], tauAlphaRef) (* TyStrs [Figure 25] *) val VEEmpty = VIdMap.empty val VEBool = VIdMap.fromList[(vidFalse, valstrFalse), (vidTrue, valstrTrue)] : ValEnv val VEList = VIdMap.fromList[(vidNil, valstrNil), (vidCons, valstrCons)] val VERef = VIdMap.fromList[(vidRef, valstrRef)] val tystrUnit = (thetaUnit, VEEmpty) val tystrBool = (thetaBool, VEBool ) val tystrInt = (thetaInt, VEEmpty) val tystrWord = (thetaWord, VEEmpty) val tystrReal = (thetaReal, VEEmpty) val tystrString = (thetaString, VEEmpty) val tystrChar = (thetaChar, VEEmpty) val tystrList = (thetaList, VEList ) val tystrRef = (thetaRef, VERef ) val tystrExn = (thetaExn, VEEmpty) (* Environments [Appendix C] *) val SE0 = StrIdMap.empty val TE0 = TyConMap.fromList[(tyconUnit, tystrUnit), (tyconBool, tystrBool), (tyconInt, tystrInt), (tyconWord, tystrWord), (tyconReal, tystrReal), (tyconString, tystrString), (tyconChar, tystrChar), (tyconList, tystrList), (tyconRef, tystrRef), (tyconExn, tystrExn)] val VE0 = VIdMap.fromList [(vidEq, valstrEq), (vidAssign, valstrAssign), (vidRef, valstrRef), (vidNil, valstrNil), (vidCons, valstrCons), (vidFalse, valstrFalse), (vidTrue, valstrTrue), (vidMatch, valstrMatch), (vidBind, valstrBind)] val E0 = (SE0,TE0,VE0) (* Overloading classes [Section E.1] *) val Int = OverloadingClass.make(TyNameSet.singleton tInt, tInt) val Real = OverloadingClass.make(TyNameSet.singleton tReal, tReal) val Word = OverloadingClass.make(TyNameSet.singleton tWord, tWord) val String = OverloadingClass.make(TyNameSet.singleton tString, tString) val Char = OverloadingClass.make(TyNameSet.singleton tChar, tChar) val WordInt = OverloadingClass.union(Word, Int) (* default is 2nd *) val RealInt = OverloadingClass.union(Real, Int) val Num = OverloadingClass.union(Word, RealInt) val Txt = OverloadingClass.union(String, Char) val NumTxt = OverloadingClass.union(Txt, Num) end (* stop of InitialStaticEnv.sml *) (* start of INITIAL_STATIC_BASIS.sml *) (* * Standard ML initial static basis * * Definition, appendices C and E *) signature INITIAL_STATIC_BASIS = sig (* Import *) type Basis = StaticBasis.Basis (* Export *) val B0: Basis end (* stop of INITIAL_STATIC_BASIS.sml *) (* start of InitialStaticBasis.sml *) (* * Standard ML initial static basis * * Definition, appendices C and E *) structure InitialStaticBasis :> INITIAL_STATIC_BASIS = struct (* Import *) type Basis = StaticBasis.Basis (* Enviornments *) val T0 = InitialStaticEnv.T0 val F0 = FunIdMap.empty val G0 = SigIdMap.empty val E0 = InitialStaticEnv.E0 val B0 = (T0,F0,G0,E0) end (* stop of InitialStaticBasis.sml *) (* start of EXNAME.sml *) (* * Standard ML exception names * * Definition, section 6.2 *) signature EXNAME = sig (* Import *) type VId = VId.Id (* Type [Section 6.2] *) eqtype ExName (* [en] *) (* Operations *) val exname: VId -> ExName val toString: ExName -> string val compare: ExName * ExName -> order end (* stop of EXNAME.sml *) (* start of ExName.sml *) (* * Standard ML exception names * * Definition, section 6.2 *) structure ExName :> EXNAME = struct (* Import *) type VId = VId.Id type stamp = Stamp.stamp (* Type [Section 6.2] *) type ExName = (* [en] *) { vid: VId , stamp: stamp } (* Creation *) fun exname vid = { vid = vid, stamp = Stamp.stamp() } (* Conversion *) fun toString{vid, stamp} = VId.toString vid (* Ordering *) fun compare(en1: ExName, en2: ExName) = Stamp.compare(#stamp en1, #stamp en2) end (* stop of ExName.sml *) (* start of ADDR.sml *) (* * Standard ML addresses * * Definition, section 6.2 *) signature ADDR = sig (* Type [Section 6.2] *) eqtype Addr (* [a] *) (* Operations *) val addr: unit -> Addr val compare: Addr * Addr -> order end (* stop of ADDR.sml *) (* start of Addr.sml *) (* * Standard ML addresses * * Definition, section 6.2 *) structure Addr :> ADDR = struct (* Type [Section 6.2] *) type Addr = Stamp.stamp (* [a] *) (* Operations *) val addr = Stamp.stamp val compare = Stamp.compare end (* stop of Addr.sml *) (* start of AssembliesCoreDynamic.sml *) (* * Standard ML additional sets and maps for the dynamic semantics of the core * * Definition, section 6.3 *) structure ExNameSet = FinSetFn(type ord_key = ExName.ExName val compare = ExName.compare) structure AddrMap = FinMapFn(type ord_key = Addr.Addr val compare = Addr.compare) (* stop of AssembliesCoreDynamic.sml *) (* start of SVAL.sml *) (* * Standard ML special values * * Definition, section 6.2 *) signature SVAL = sig (* Type [Section 6.2] *) datatype SVal = (* [sv] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Operations *) val toString: SVal -> string val equal: SVal * SVal -> bool end (* stop of SVAL.sml *) (* start of SVal.sml *) (* * Standard ML special values * * Definition, section 6.2 *) structure SVal :> SVAL = struct (* Type [Section 6.2] *) datatype SVal = (* [sv] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Conversions *) fun toString(INT i) = Int.toString i | toString(WORD w) = "0wx" ^ Word.toString w | toString(STRING s) = "\"" ^ String.toString s ^ "\"" | toString(CHAR c) = "\"#" ^ Char.toString c ^ "\"" | toString(REAL r) = Real.toString r (* Equality *) fun equal(INT n1, INT n2 ) = n1 = n2 | equal(WORD w1, WORD w2 ) = w1 = w2 | equal(STRING s1, STRING s2) = s1 = s2 | equal(CHAR c1, CHAR c2 ) = c1 = c2 | equal _ = raise Fail "type error: equality type expected" end (* stop of SVal.sml *) (* start of VAL.sml *) (* * Standard ML values * * Definition, sections 6.2, 6.3, and 6.4 * * Note: * - All value types are parameterised over the representation of function * closures to break up the recursion between values and environments. * - The basic values are just strings. *) signature VAL = sig (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type SVal = SVal.SVal type VId = VId.Id type 'a LabMap = 'a LabMap.map (* Types [Sections 6.2 and 6.3] *) type BasVal = string (* [b] *) datatype 'a Val = (* [v] *) := | SVal of SVal | BasVal of BasVal | VId of VId | VIdVal of VId * 'a Val | ExVal of 'a ExVal | Record of (*Record*) 'a Val LabMap | Addr of Addr | FcnClosure of 'a and 'a ExVal = (* [e] *) ExName of ExName | ExNameVal of ExName * 'a Val type 'a Record = 'a Val LabMap (* [r] *) (* Operations *) val equal: 'a Val * 'a Val -> bool val toBoolVal: bool -> 'a Val val unpair: 'a Val -> ('a Val * 'a Val) option end (* stop of VAL.sml *) (* start of Val.sml *) (* * Standard ML values * * Definition, sections 6.2, 6.3, and 6.4 * * Note: * - All value types are parameterised over the representation of function * closures to break up the recursion between values and environments. * - The basic values are just strings. *) structure Val :> VAL = struct (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type SVal = SVal.SVal type VId = VId.Id type 'a LabMap = 'a LabMap.map (* Types [Sections 6.2 and 6.3] *) type BasVal = string (* [b] *) datatype 'a Val = (* [v] *) op:= | SVal of SVal | BasVal of BasVal | VId of VId | VIdVal of VId * 'a Val | ExVal of 'a ExVal | Record of 'a Record | Addr of Addr | FcnClosure of 'a and 'a ExVal = (* [e] *) ExName of ExName | ExNameVal of ExName * 'a Val withtype 'a Record = 'a Val LabMap (* [r] *) (* Operations *) fun toBoolVal b = VId(VId.fromString(if b then "true" else "false")) fun unpair(Record r) = (case (LabMap.find(r, Lab.fromInt 1), LabMap.find(r, Lab.fromInt 2)) of (SOME v1, SOME v2) => SOME(v1, v2) | _ => NONE ) | unpair _ = NONE (* Implementation of polymorphic equality *) fun equal(SVal sv1, SVal sv2 ) = SVal.equal(sv1, sv2) | equal(VId vid1, VId vid2 ) = vid1 = vid2 | equal(ExVal(ExName en1), ExVal(ExName en2)) = en1 = en2 | equal(Addr a1, Addr a2 ) = a1 = a2 | equal(VIdVal(vid1, v1), VIdVal(vid2, v2)) = vid1 = vid2 andalso equal(v1, v2) | equal(ExVal(ExNameVal(en1,v1)), ExVal(ExNameVal(en2,v2))) = en1 = en2 andalso equal(v1, v2) | equal(Record r1, Record r2) = LabMap.numItems r1 = LabMap.numItems r2 andalso LabMap.alli (fn(lab, v1) => case LabMap.find(r2, lab) of SOME v2 => equal(v1, v2) | NONE => false ) r1 | equal _ = false end (* stop of Val.sml *) (* start of STATE.sml *) (* * Standard ML state * * Definition, section 6.3 * * Notes: * - Memory gets represented by references. This avoids expanding out all * occurances of the state convention in the inference rules. * - Since exception names are generated by stamps we do not really need the * exception name set. We maintain it anyway. *) signature STATE = sig (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type ExNameSet = ExNameSet.set type 'a Val = 'a Val.Val type 'a AddrMap = 'a AddrMap.map (* Types [Section 6.3] *) type 'a Mem = 'a Val AddrMap (* [mem] *) type 'a State = 'a Mem * ExNameSet (* [s] *) (* Operations *) val insertAddr: 'a State * Addr * 'a Val -> 'a State val insertExName: 'a State * ExName -> 'a State val findAddr: 'a State * Addr -> 'a Val option end (* stop of STATE.sml *) (* start of State.sml *) (* * Standard ML state * * Definition, section 6.3 * * Notes: * - Memory gets represented by references. This avoids expanding out all * occurances of the state convention in the inference rules. * - Since exception names are generated by stamps we do not really need the * exception name set. We maintain it anyway. *) structure State :> STATE = struct (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type ExNameSet = ExNameSet.set type 'a Val = 'a Val.Val type 'a AddrMap = 'a AddrMap.map (* Types [Section 6.3] *) type 'a Mem = 'a Val AddrMap (* [mem] *) type 'a State = 'a Mem * ExNameSet (* [s] *) (* Operations *) fun insertAddr ((mem,ens), a, v) = ( AddrMap.insert(mem, a, v), ens ) fun insertExName((mem,ens), en) = ( mem, ExNameSet.add(ens, en) ) fun findAddr((mem,ens), a) = AddrMap.find(mem, a) end (* stop of State.sml *) (* start of GRAMMAR_CORE.sml *) (* * Standard ML abstract core grammar * * Definition, section 2.8 * * Note: * This is the syntax used in the inference rules for the core [Definition, * sections 4.10 and 6.7]. It omits almost anything having to do with infixed * identifiers: * - fixity directives * - infixed application * - infixed value construction * However, op prefixes are kept, since they are required for rebuilding the * syntax tree during fixity resolution. * Optional semicolons are also omitted. *) signature GRAMMAR_CORE = sig (* Import *) type Info type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type TyCon = TyCon.Id type TyVar = TyVar.TyVar type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId (* Optional keyword `op' *) datatype Op = SANSOp | WITHOp (* Expressions [Figures 2 and 4] *) datatype AtExp = SCONAtExp of Info * SCon | LONGVIDAtExp of Info * Op * longVId | RECORDAtExp of Info * ExpRow option | LETAtExp of Info * Dec * Exp | PARAtExp of Info * Exp and ExpRow = ExpRow of Info * Lab * Exp * ExpRow option and Exp = ATEXPExp of Info * AtExp | APPExp of Info * Exp * AtExp | TYPEDExp of Info * Exp * Ty | HANDLEExp of Info * Exp * Match | RAISEExp of Info * Exp | FNExp of Info * Match (* Matches [Figures 2 and 4] *) and Match = Match of Info * Mrule * Match option and Mrule = Mrule of Info * Pat * Exp (* Declarations [Figures 2 and 4] *) and Dec = VALDec of Info * TyVarseq * ValBind | TYPEDec of Info * TypBind | DATATYPEDec of Info * DatBind | REPLICATIONDec of Info * TyCon * longTyCon | ABSTYPEDec of Info * DatBind * Dec | EXCEPTIONDec of Info * ExBind | LOCALDec of Info * Dec * Dec | OPENDec of Info * longStrId list | EMPTYDec of Info | SEQDec of Info * Dec * Dec (* Bindings [Figures 2 and 4] *) and ValBind = PLAINValBind of Info * Pat * Exp * ValBind option | RECValBind of Info * ValBind and TypBind = TypBind of Info * TyVarseq * TyCon * Ty * TypBind option and DatBind = DatBind of Info * TyVarseq * TyCon * ConBind * DatBind option and ConBind = ConBind of Info * Op * VId * Ty option * ConBind option and ExBind = NEWExBind of Info * Op * VId * Ty option * ExBind option | EQUALExBind of Info * Op * VId * Op * longVId * ExBind option (* Patterns [Figures 2 and 3] *) and AtPat = WILDCARDAtPat of Info | SCONAtPat of Info * SCon | LONGVIDAtPat of Info * Op * longVId | RECORDAtPat of Info * PatRow option | PARAtPat of Info * Pat and PatRow = WILDCARDPatRow of Info | ROWPatRow of Info * Lab * Pat * PatRow option and Pat = ATPATPat of Info * AtPat | CONPat of Info * Op * longVId * AtPat | TYPEDPat of Info * Pat * Ty | ASPat of Info * Op * VId * Ty option * Pat (* Type expressions [Figures 2 and 3] *) and Ty = TYVARTy of Info * TyVar | RECORDTy of Info * TyRow option | TYCONTy of Info * Tyseq * longTyCon | ARROWTy of Info * Ty * Ty | PARTy of Info * Ty and TyRow = TyRow of Info * Lab * Ty * TyRow option (* Sequences [Section 2.8] *) and Tyseq = Tyseq of Info * Ty list and TyVarseq = TyVarseq of Info * TyVar list (* Operations *) val infoAtExp: AtExp -> Info val infoExpRow: ExpRow -> Info val infoExp: Exp -> Info val infoMatch: Match -> Info val infoMrule: Mrule -> Info val infoDec: Dec -> Info val infoValBind: ValBind -> Info val infoTypBind: TypBind -> Info val infoDatBind: DatBind -> Info val infoConBind: ConBind -> Info val infoExBind: ExBind -> Info val infoAtPat: AtPat -> Info val infoPatRow: PatRow -> Info val infoPat: Pat -> Info val infoTy: Ty -> Info val infoTyRow: TyRow -> Info val infoTyseq: Tyseq -> Info val infoTyVarseq: TyVarseq -> Info end (* stop of GRAMMAR_CORE.sml *) (* start of GrammarCoreFn.sml *) (* * Standard ML abstract core grammar * * Definition, section 2.8 * * Note: * This is the syntax used in the inference rules for the core [Definition, * sections 4.10 and 6.7]. It omits almost anything having to do with infixed * identifiers: * - fixity directives * - infixed application * - infixed value construction * However, op prefixes are kept, since they are required for rebuilding the * syntax tree during fixity resolution. * Optional semicolons are also omitted. *) functor GrammarCoreFn(type Info) : GRAMMAR_CORE = struct (* Import *) type Info = Info type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type TyCon = TyCon.Id type TyVar = TyVar.TyVar type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId (* Optional keyword `op' *) datatype Op = SANSOp | WITHOp (* Expressions [Figures 2 and 4] *) datatype AtExp = SCONAtExp of Info * SCon | LONGVIDAtExp of Info * Op * longVId | RECORDAtExp of Info * ExpRow option | LETAtExp of Info * Dec * Exp | PARAtExp of Info * Exp and ExpRow = ExpRow of Info * Lab * Exp * ExpRow option and Exp = ATEXPExp of Info * AtExp | APPExp of Info * Exp * AtExp | TYPEDExp of Info * Exp * Ty | HANDLEExp of Info * Exp * Match | RAISEExp of Info * Exp | FNExp of Info * Match (* Matches [Figures 2 and 4] *) and Match = Match of Info * Mrule * Match option and Mrule = Mrule of Info * Pat * Exp (* Declarations [Figures 2 and 4] *) and Dec = VALDec of Info * TyVarseq * ValBind | TYPEDec of Info * TypBind | DATATYPEDec of Info * DatBind | REPLICATIONDec of Info * TyCon * longTyCon | ABSTYPEDec of Info * DatBind * Dec | EXCEPTIONDec of Info * ExBind | LOCALDec of Info * Dec * Dec | OPENDec of Info * longStrId list | EMPTYDec of Info | SEQDec of Info * Dec * Dec (* Bindings [Figures 2 and 4] *) and ValBind = PLAINValBind of Info * Pat * Exp * ValBind option | RECValBind of Info * ValBind and TypBind = TypBind of Info * TyVarseq * TyCon * Ty * TypBind option and DatBind = DatBind of Info * TyVarseq * TyCon * ConBind * DatBind option and ConBind = ConBind of Info * Op * VId * Ty option * ConBind option and ExBind = NEWExBind of Info * Op * VId * Ty option * ExBind option | EQUALExBind of Info * Op * VId * Op * longVId * ExBind option (* Patterns [Figures 2 and 3] *) and AtPat = WILDCARDAtPat of Info | SCONAtPat of Info * SCon | LONGVIDAtPat of Info * Op * longVId | RECORDAtPat of Info * PatRow option | PARAtPat of Info * Pat and PatRow = WILDCARDPatRow of Info | ROWPatRow of Info * Lab * Pat * PatRow option and Pat = ATPATPat of Info * AtPat | CONPat of Info * Op * longVId * AtPat | TYPEDPat of Info * Pat * Ty | ASPat of Info * Op * VId * Ty option * Pat (* Type expressions [Figures 2 and 3] *) and Ty = TYVARTy of Info * TyVar | RECORDTy of Info * TyRow option | TYCONTy of Info * Tyseq * longTyCon | ARROWTy of Info * Ty * Ty | PARTy of Info * Ty and TyRow = TyRow of Info * Lab * Ty * TyRow option (* Sequences [Section 2.8] *) and Tyseq = Tyseq of Info * Ty list and TyVarseq = TyVarseq of Info * TyVar list (* Extracting info fields *) fun infoAtExp(SCONAtExp(I,_)) = I | infoAtExp(LONGVIDAtExp(I,_,_)) = I | infoAtExp(RECORDAtExp(I,_)) = I | infoAtExp(LETAtExp(I,_,_)) = I | infoAtExp(PARAtExp(I,_)) = I fun infoExpRow(ExpRow(I,_,_,_)) = I fun infoExp(ATEXPExp(I,_)) = I | infoExp(APPExp(I,_,_)) = I | infoExp(TYPEDExp(I,_,_)) = I | infoExp(HANDLEExp(I,_,_)) = I | infoExp(RAISEExp(I,_)) = I | infoExp(FNExp(I,_)) = I fun infoMatch(Match(I,_,_)) = I fun infoMrule(Mrule(I,_,_)) = I fun infoDec(VALDec(I,_,_)) = I | infoDec(TYPEDec(I,_)) = I | infoDec(DATATYPEDec(I,_)) = I | infoDec(REPLICATIONDec(I,_,_)) = I | infoDec(ABSTYPEDec(I,_,_)) = I | infoDec(EXCEPTIONDec(I,_)) = I | infoDec(LOCALDec(I,_,_)) = I | infoDec(OPENDec(I,_)) = I | infoDec(EMPTYDec(I)) = I | infoDec(SEQDec(I,_,_)) = I fun infoValBind(PLAINValBind(I,_,_,_)) = I | infoValBind(RECValBind(I,_)) = I fun infoTypBind(TypBind(I,_,_,_,_)) = I fun infoDatBind(DatBind(I,_,_,_,_)) = I fun infoConBind(ConBind(I,_,_,_,_)) = I fun infoExBind(NEWExBind(I,_,_,_,_)) = I | infoExBind(EQUALExBind(I,_,_,_,_,_)) = I fun infoAtPat(WILDCARDAtPat(I)) = I | infoAtPat(SCONAtPat(I,_)) = I | infoAtPat(LONGVIDAtPat(I,_,_)) = I | infoAtPat(RECORDAtPat(I,_)) = I | infoAtPat(PARAtPat(I,_)) = I fun infoPatRow(WILDCARDPatRow(I)) = I | infoPatRow(ROWPatRow(I,_,_,_)) = I fun infoPat(ATPATPat(I,_)) = I | infoPat(CONPat(I,_,_,_)) = I | infoPat(TYPEDPat(I,_,_)) = I | infoPat(ASPat(I,_,_,_,_)) = I fun infoTy(TYVARTy(I,_)) = I | infoTy(RECORDTy(I,_)) = I | infoTy(TYCONTy(I,_,_)) = I | infoTy(ARROWTy(I,_,_)) = I | infoTy(PARTy(I,_)) = I fun infoTyRow(TyRow(I,_,_,_)) = I fun infoTyseq(Tyseq(I,_)) = I fun infoTyVarseq(TyVarseq(I,_)) = I end (* stop of GrammarCoreFn.sml *) (* start of SOURCE.sml *) (* * Helpers for handling source strings *) signature SOURCE = sig type source = string type region = int * int val over: region * region -> region val between: region * region -> region val compare: region * region -> order end (* stop of SOURCE.sml *) (* start of Source.sml *) (* * Helpers for handling source strings *) structure Source :> SOURCE = struct type source = string type region = int * int fun over(r1: region, r2: region) = (#1 r1, #2 r2) fun between(r1: region, r2: region) = (#2 r1, #1 r2) fun compare((m1,n1), (m2,n2)) = case Int.compare(m1, m2) of EQUAL => Int.compare(n1, n2) | order => order end (* stop of Source.sml *) (* start of GRAMMAR_MODULE.sml *) (* * Standard ML abstract module grammar * * Definition, section 3.4 * * Notes: * This is the syntax used in the inference rules for modules [Definition, * sections 5.7 and 7.3]. Optional semicolons are omitted. * The structure sharing derived form [Definition, Appendix A] has been added, * because it cannot be derived purely syntactically. *) signature GRAMMAR_MODULE = sig (* Import *) structure Core: GRAMMAR_CORE type Info type VId = Core.VId type TyCon = Core.TyCon type TyVar = Core.TyVar type StrId = Core.StrId type longVId = Core.longVId type longTyCon = Core.longTyCon type longStrId = Core.longStrId type Dec = Core.Dec type Ty = Core.Ty type TyVarseq = Core.TyVarseq type SigId = SigId.Id type FunId = FunId.Id (* Structures [Figures 5 and 6] *) datatype StrExp = STRUCTStrExp of Info * StrDec | LONGSTRIDStrExp of Info * longStrId | TRANSStrExp of Info * StrExp * SigExp | OPAQStrExp of Info * StrExp * SigExp | APPStrExp of Info * FunId * StrExp | LETStrExp of Info * StrDec * StrExp and StrDec = DECStrDec of Info * Dec | STRUCTUREStrDec of Info * StrBind | LOCALStrDec of Info * StrDec * StrDec | EMPTYStrDec of Info | SEQStrDec of Info * StrDec * StrDec and StrBind = StrBind of Info * StrId * StrExp * StrBind option (* Signatures [Figures 5 and 6] *) and SigExp = SIGSigExp of Info * Spec | SIGIDSigExp of Info * SigId | WHERETYPESigExp of Info * SigExp * TyVarseq * longTyCon * Ty and SigDec = SigDec of Info * SigBind and SigBind = SigBind of Info * SigId * SigExp * SigBind option (* Specifications [Figures 5 and 7] *) and Spec = VALSpec of Info * ValDesc | TYPESpec of Info * TypDesc | EQTYPESpec of Info * TypDesc | DATATYPESpec of Info * DatDesc | REPLICATIONSpec of Info * TyCon * longTyCon | EXCEPTIONSpec of Info * ExDesc | STRUCTURESpec of Info * StrDesc | INCLUDESpec of Info * SigExp | EMPTYSpec of Info | SEQSpec of Info * Spec * Spec | SHARINGTYPESpec of Info * Spec * longTyCon list | SHARINGSpec of Info * Spec * longStrId list and ValDesc = ValDesc of Info * VId * Ty * ValDesc option and TypDesc = TypDesc of Info * TyVarseq * TyCon * TypDesc option and DatDesc = DatDesc of Info * TyVarseq * TyCon * ConDesc * DatDesc option and ConDesc = ConDesc of Info * VId * Ty option * ConDesc option and ExDesc = ExDesc of Info * VId * Ty option * ExDesc option and StrDesc = StrDesc of Info * StrId * SigExp * StrDesc option (* Functors [Figures 5 and 8] *) and FunDec = FunDec of Info * FunBind and FunBind = FunBind of Info * FunId * StrId * SigExp * StrExp * FunBind option (* Top-level declarations [Figures 5 and 8] *) and TopDec = STRDECTopDec of Info * StrDec * TopDec option | SIGDECTopDec of Info * SigDec * TopDec option | FUNDECTopDec of Info * FunDec * TopDec option (* Operations *) val infoStrExp: StrExp -> Info val infoStrDec: StrDec -> Info val infoStrBind: StrBind -> Info val infoSigExp: SigExp -> Info val infoSigBind: SigBind -> Info val infoSpec: Spec -> Info val infoValDesc: ValDesc -> Info val infoTypDesc: TypDesc -> Info val infoDatDesc: DatDesc -> Info val infoConDesc: ConDesc -> Info val infoExDesc: ExDesc -> Info val infoStrDesc: StrDesc -> Info val infoFunDec: FunDec -> Info val infoFunBind: FunBind -> Info val infoTopDec: TopDec -> Info end (* stop of GRAMMAR_MODULE.sml *) (* start of GrammarModuleFn.sml *) (* * Standard ML abstract module grammar * * Definition, section 3.4 * * Notes: * This is the syntax used in the inference rules for modules [Definition, * sections 5.7 and 7.3]. Optional semicolons are omitted. * The structure sharing derived form [Definition, Appendix A] has been added, * because it cannot be derived purely syntactically. *) functor GrammarModuleFn(type Info structure Core: GRAMMAR_CORE ) : GRAMMAR_MODULE = struct (* Import *) structure Core = Core type Info = Info open Core type SigId = SigId.Id type FunId = FunId.Id (* Structures [Figures 5 and 6] *) datatype StrExp = STRUCTStrExp of Info * StrDec | LONGSTRIDStrExp of Info * longStrId | TRANSStrExp of Info * StrExp * SigExp | OPAQStrExp of Info * StrExp * SigExp | APPStrExp of Info * FunId * StrExp | LETStrExp of Info * StrDec * StrExp and StrDec = DECStrDec of Info * Dec | STRUCTUREStrDec of Info * StrBind | LOCALStrDec of Info * StrDec * StrDec | EMPTYStrDec of Info | SEQStrDec of Info * StrDec * StrDec and StrBind = StrBind of Info * StrId * StrExp * StrBind option (* Signatures [Figures 5 and 6] *) and SigExp = SIGSigExp of Info * Spec | SIGIDSigExp of Info * SigId | WHERETYPESigExp of Info * SigExp * TyVarseq * longTyCon * Ty and SigDec = SigDec of Info * SigBind and SigBind = SigBind of Info * SigId * SigExp * SigBind option (* Specifications [Figures 5 and 7] *) and Spec = VALSpec of Info * ValDesc | TYPESpec of Info * TypDesc | EQTYPESpec of Info * TypDesc | DATATYPESpec of Info * DatDesc | REPLICATIONSpec of Info * TyCon * longTyCon | EXCEPTIONSpec of Info * ExDesc | STRUCTURESpec of Info * StrDesc | INCLUDESpec of Info * SigExp | EMPTYSpec of Info | SEQSpec of Info * Spec * Spec | SHARINGTYPESpec of Info * Spec * longTyCon list | SHARINGSpec of Info * Spec * longStrId list and ValDesc = ValDesc of Info * VId * Ty * ValDesc option and TypDesc = TypDesc of Info * TyVarseq * TyCon * TypDesc option and DatDesc = DatDesc of Info * TyVarseq * TyCon * ConDesc * DatDesc option and ConDesc = ConDesc of Info * VId * Ty option * ConDesc option and ExDesc = ExDesc of Info * VId * Ty option * ExDesc option and StrDesc = StrDesc of Info * StrId * SigExp * StrDesc option (* Functors [Figures 5 and 8] *) and FunDec = FunDec of Info * FunBind and FunBind = FunBind of Info * FunId * StrId * SigExp * StrExp * FunBind option (* Top-level declarations [Figures 5 and 8] *) and TopDec = STRDECTopDec of Info * StrDec * TopDec option | SIGDECTopDec of Info * SigDec * TopDec option | FUNDECTopDec of Info * FunDec * TopDec option (* Extracting info fields *) fun infoStrExp(STRUCTStrExp(I,_)) = I | infoStrExp(LONGSTRIDStrExp(I,_)) = I | infoStrExp(TRANSStrExp(I,_,_)) = I | infoStrExp(OPAQStrExp(I,_,_)) = I | infoStrExp(APPStrExp(I,_,_)) = I | infoStrExp(LETStrExp(I,_,_)) = I fun infoStrDec(DECStrDec(I,_)) = I | infoStrDec(STRUCTUREStrDec(I,_)) = I | infoStrDec(LOCALStrDec(I,_,_)) = I | infoStrDec(EMPTYStrDec(I)) = I | infoStrDec(SEQStrDec(I,_,_)) = I fun infoStrBind(StrBind(I,_,_,_)) = I fun infoSigExp(SIGSigExp(I,_)) = I | infoSigExp(SIGIDSigExp(I,_)) = I | infoSigExp(WHERETYPESigExp(I,_,_,_,_)) = I fun infoSigDec(SigDec(I,_)) = I fun infoSigBind(SigBind(I,_,_,_)) = I fun infoSpec(VALSpec(I,_)) = I | infoSpec(TYPESpec(I,_)) = I | infoSpec(EQTYPESpec(I,_)) = I | infoSpec(DATATYPESpec(I,_)) = I | infoSpec(REPLICATIONSpec(I,_,_)) = I | infoSpec(EXCEPTIONSpec(I,_)) = I | infoSpec(STRUCTURESpec(I,_)) = I | infoSpec(INCLUDESpec(I,_)) = I | infoSpec(EMPTYSpec(I)) = I | infoSpec(SEQSpec(I,_,_)) = I | infoSpec(SHARINGTYPESpec(I,_,_)) = I | infoSpec(SHARINGSpec(I,_,_)) = I fun infoValDesc(ValDesc(I,_,_,_)) = I fun infoTypDesc(TypDesc(I,_,_,_)) = I fun infoDatDesc(DatDesc(I,_,_,_,_)) = I fun infoConDesc(ConDesc(I,_,_,_)) = I fun infoExDesc(ExDesc(I,_,_,_)) = I fun infoStrDesc(StrDesc(I,_,_,_)) = I fun infoFunDec(FunDec(I,_)) = I fun infoFunBind(FunBind(I,_,_,_,_,_)) = I fun infoTopDec(STRDECTopDec(I,_,_)) = I | infoTopDec(SIGDECTopDec(I,_,_)) = I | infoTopDec(FUNDECTopDec(I,_,_)) = I end (* stop of GrammarModuleFn.sml *) (* start of GRAMMAR_PROGRAM.sml *) (* * Standard ML abstract program grammar * * Definition, section 8 *) signature GRAMMAR_PROGRAM = sig (* Import *) structure Module: GRAMMAR_MODULE type Info = Module.Info type TopDec = Module.TopDec (* Programs *) datatype Program = Program of Info * TopDec * Program option (* Extracting the info field *) val infoProgram: Program -> Info end (* stop of GRAMMAR_PROGRAM.sml *) (* start of GrammarProgramFn.sml *) (* * Standard ML abstract program grammar * * Definition, section 8 *) functor GrammarProgramFn(type Info structure Module: GRAMMAR_MODULE ) : GRAMMAR_PROGRAM = struct (* Import *) structure Module = Module type Info = Info open Module (* Programs *) datatype Program = Program of Info * TopDec * Program option (* Extracting the info field *) fun infoProgram(Program(I,_,_)) = I end (* stop of GrammarProgramFn.sml *) (* start of Grammars.sml *) structure GrammarCore = GrammarCoreFn(type Info = Source.region) structure GrammarModule = GrammarModuleFn(type Info = Source.region structure Core = GrammarCore) structure GrammarProgram = GrammarProgramFn(type Info = Source.region structure Module = GrammarModule) (* stop of Grammars.sml *) (* start of DYNAMIC_ENV.sml *) (* * Standard ML environments of the dynamic semantics of the core * * Definition, sections 6.3 and 6.6 * * Notes: * - We call the domain type of value environments ValStr. * - The type definitions here are heavily recursive and it is really stupid * that SML allows no withtype in signatures... *) signature DYNAMIC_ENV = sig (* Inheritance *) include GENERIC_ENV (* Import types *) type 'a Val = 'a Val.Val type Match = GrammarCore.Match (* Export types [Section 6.6] *) datatype FcnClosure = FcnClosure of Match * ( (*Env*) ( FcnClosure Val * IdStatus , (FcnClosure Val * IdStatus) VIdMap ) Str' StrIdMap * (FcnClosure Val * IdStatus) VIdMap TyConMap * (FcnClosure Val * IdStatus) VIdMap ) * (*ValEnv*) (FcnClosure Val * IdStatus) VIdMap type ValStr = FcnClosure Val * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Operations *) val Rec: ValEnv -> ValEnv end (* stop of DYNAMIC_ENV.sml *) (* start of DynamicEnv.sml *) (* * Standard ML environments of the dynamic semantics of the core * * Definition, sections 6.3 and 6.6 * * Notes: * - We call the domain type of value environments ValStr. * - The type definitions here are heavily recursive. It would be easier if * SML would define withtype sequentially (as SML/NJ implements it). * However, it is still better than inside the signature... *) structure DynamicEnv :> DYNAMIC_ENV = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import types *) type 'a Val = 'a Val.Val type Match = GrammarCore.Match (* Export types [Section 6.6] *) datatype FcnClosure = FcnClosure of Match * ((*Env*) StrEnv * TyEnv * ValEnv) * ValEnv withtype ValEnv = (FcnClosure Val * IdStatus) VIdMap (* [VE] *) and TyEnv = (FcnClosure Val * IdStatus) VIdMap TyConMap (* [TE] *) and StrEnv = (FcnClosure Val * IdStatus, (FcnClosure Val * IdStatus) VIdMap) Str' StrIdMap (* [SE] *) type ValStr = FcnClosure Val * IdStatus type TyStr = ValEnv type Str = (ValStr, TyStr) Str' type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Unrolling [Section 6.6] *) fun Rec VE = VIdMap.map (fn (Val.FcnClosure(FcnClosure(match',E',VE')), IdStatus.v) => (Val.FcnClosure(FcnClosure(match',E',VE)), IdStatus.v) | valstr => valstr ) VE end (* stop of DynamicEnv.sml *) (* start of INITIAL_DYNAMIC_ENV.sml *) (* * Standard ML core view of the initial dynamic basis * * Definition, appendix D and section 6.5 * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial environment in * here, too. *) signature INITIAL_DYNAMIC_ENV = sig (* Import types *) type Env = DynamicEnv.Env type ExName = ExName.ExName type State = DynamicEnv.FcnClosure State.State (* Basic exception names [Section 6.5] *) val enMatch: ExName val enBind: ExName (* Initial environment [Appendix D] *) val E0: Env (* Associated state *) val s: State end (* stop of INITIAL_DYNAMIC_ENV.sml *) (* start of InitialDynamicEnv.sml *) (* * Standard ML core view of the initial dynamic basis * * Definition, appendix D and section 6.5 * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial environment in * here, too. *) structure InitialDynamicEnv :> INITIAL_DYNAMIC_ENV = struct (* Import *) type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type ExName = ExName.ExName type State = DynamicEnv.FcnClosure State.State open Val open IdStatus (* VIds [Appendix D] *) val vidEq = VId.fromString "=" val vidAssign = VId.fromString ":=" val vidFalse = VId.fromString "false" val vidTrue = VId.fromString "true" val vidNil = VId.fromString "nil" val vidCons = VId.fromString "::" val vidRef = VId.fromString "ref" val vidMatch = VId.fromString "Match" val vidBind = VId.fromString "Bind" (* Basic exception names [Section 6.5] *) val enMatch = ExName.exname vidMatch val enBind = ExName.exname vidBind (* Value entries [Appendix D] *) val valstrEq = (BasVal "=", v) val valstrAssign = (op:=, v) val valstrFalse = (VId vidFalse, c) val valstrTrue = (VId vidTrue, c) val valstrNil = (VId vidNil, c) val valstrCons = (VId vidCons, c) val valstrRef = (VId vidRef, c) val valstrMatch = (ExVal(ExName enMatch), e) val valstrBind = (ExVal(ExName enBind), e) (* TyCons [Figure 26] *) val tyconUnit = TyCon.fromString "unit" val tyconBool = TyCon.fromString "bool" val tyconInt = TyCon.fromString "int" val tyconWord = TyCon.fromString "word" val tyconReal = TyCon.fromString "real" val tyconString = TyCon.fromString "string" val tyconChar = TyCon.fromString "char" val tyconList = TyCon.fromString "list" val tyconRef = TyCon.fromString "ref" val tyconExn = TyCon.fromString "exn" (* Type ValEnvs [Figure 26] *) val VEUnit = VIdMap.empty val VEBool = VIdMap.fromList[(vidFalse, valstrFalse), (vidTrue, valstrTrue)] : ValEnv val VEInt = VIdMap.empty val VEWord = VIdMap.empty val VEReal = VIdMap.empty val VEString = VIdMap.empty val VEChar = VIdMap.empty val VEList = VIdMap.fromList[(vidNil, valstrNil), (vidCons, valstrCons)] : ValEnv val VERef = VIdMap.fromList[(vidRef, valstrRef)] : ValEnv val VEExn = VIdMap.empty (* Environments [Appendix D] *) val SE0 = StrIdMap.empty val TE0 = TyConMap.fromList[(tyconUnit, VEUnit), (tyconBool, VEBool), (tyconInt, VEInt), (tyconWord, VEWord), (tyconReal, VEReal), (tyconString, VEString), (tyconChar, VEChar), (tyconList, VEList), (tyconRef, VERef), (tyconExn, VEExn)] val VE0 = VIdMap.fromList [(vidEq, valstrEq), (vidAssign, valstrAssign), (vidRef, valstrRef), (vidNil, valstrNil), (vidCons, valstrCons), (vidFalse, valstrFalse), (vidTrue, valstrTrue), (vidMatch, valstrMatch), (vidBind, valstrBind)] : ValEnv val E0 = (SE0,TE0,VE0) (* Associated state *) val mem = AddrMap.empty val ens = ExNameSet.fromList[enMatch, enBind] val s = (mem, ens) end (* stop of InitialDynamicEnv.sml *) (* start of INTERFACE.sml *) (* * Standard ML interfaces * * Definition, section 7.2 *) signature INTERFACE = sig (* Inheritance *) include GENERIC_ENV (* Import *) type Env = DynamicEnv.Env (* Export types [Section 7.2] *) type ValInt = IdStatus VIdMap (* [VI] *) type TyInt = ValInt TyConMap (* [TI] *) type Str = (IdStatus, ValInt) Str' type StrInt = Str StrIdMap (* [SI] *) type Int = StrInt * TyInt * ValInt (* [I] *) (* Operations *) val fromSI: StrInt -> Int val fromTI: TyInt -> Int val fromVI: ValInt -> Int val fromVIandTI: ValInt * TyInt -> Int val Inter: Env -> Int val cutdown: Env * Int -> Env end (* stop of INTERFACE.sml *) (* start of Interface.sml *) (* * Standard ML interfaces * * Definition, section 7.2 *) structure Interface :> INTERFACE = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import *) type Env = DynamicEnv.Env (* Export types [Section 7.2] *) type ValInt = IdStatus VIdMap (* [VI] *) type TyInt = ValInt TyConMap (* [TI] *) type Str = (IdStatus, ValInt) Str' type StrInt = Str StrIdMap (* [SI] *) type Int = StrInt * TyInt * ValInt (* [I] *) (* Injections [Section 4.3] *) val fromSI = fromSE val fromTI = fromTE val fromVI = fromVE val fromVIandTI = fromVEandTE (* Extracting interfaces from environments [Section 7.2] *) fun InterVE VE = VIdMap.map (fn(v,is) => is) VE fun InterTE TE = TyConMap.map (fn VE => InterVE VE) TE fun InterSE SE = StrIdMap.map (fn DynamicEnv.Str E => Str(Inter E)) SE and Inter (SE,TE,VE) = (InterSE SE, InterTE TE, InterVE VE) (* Cutting down environments [Section 7.2] *) fun cutdownVE(VE, VI) = VIdMap.foldli (fn(vid, is, VE') => case VIdMap.find(VE, vid) of SOME(v,is') => VIdMap.insert(VE', vid, (v,is)) | NONE => VE' ) VIdMap.empty VI fun cutdownTE(TE, TI) = TyConMap.foldli (fn(tycon, VI', TE') => case TyConMap.find(TE, tycon) of SOME VE' => TyConMap.insert(TE', tycon, cutdownVE(VE',VI')) | NONE => TE' ) TyConMap.empty TI fun cutdownSE(SE, SI) = StrIdMap.foldli (fn(strid, Str I, SE') => case StrIdMap.find(SE, strid) of SOME(DynamicEnv.Str E) => StrIdMap.insert(SE', strid, DynamicEnv.Str(cutdown(E,I))) | NONE => SE' ) StrIdMap.empty SI and cutdown((SE,TE,VE), (SI,TI,VI)) = ( cutdownSE(SE, SI), cutdownTE(TE, TI), cutdownVE(VE, VI) ) end (* stop of Interface.sml *) (* start of DYNAMIC_BASIS.sml *) (* * Standard ML dynamic basis and environments of modules * * Definition, section 7.2 *) signature DYNAMIC_BASIS = sig (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type StrEnv = DynamicEnv.StrEnv type Str = DynamicEnv.Str type Int = Interface.Int type StrExp = GrammarModule.StrExp type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 7.2] *) datatype FunctorClosure = FunctorClosure of (StrId * Int) * StrExp * (*Basis*) (FunctorClosure FunIdMap * Int SigIdMap * Env) type SigEnv = Int SigIdMap (* [G] *) type FunEnv = FunctorClosure FunIdMap (* [F] *) type Basis = FunEnv * SigEnv * Env (* [B] *) (* Operations *) val empty: Basis val fromE: Env -> Basis val fromF: FunEnv -> Basis val fromG: SigEnv -> Basis val Eof: Basis -> Env val plus: Basis * Basis -> Basis val plusSE: Basis * StrEnv -> Basis val plusG: Basis * SigEnv -> Basis val plusF: Basis * FunEnv -> Basis val plusE: Basis * Env -> Basis val findStrId: Basis * StrId -> Str option val findSigId: Basis * SigId -> Int option val findFunId: Basis * FunId -> FunctorClosure option val findLongStrId: Basis * longStrId -> Str option val findLongTyCon: Basis * longTyCon -> ValEnv option end (* stop of DYNAMIC_BASIS.sml *) (* start of DynamicBasis.sml *) (* * Standard ML dynamic basis and environments of modules * * Definition, section 7.2 *) structure DynamicBasis :> DYNAMIC_BASIS = struct (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type StrEnv = DynamicEnv.StrEnv type Str = DynamicEnv.Str type Int = Interface.Int type StrExp = GrammarModule.StrExp type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 7.2] *) datatype FunctorClosure = FunctorClosure of (StrId * Int) * StrExp * (*Basis*) (FunEnv * SigEnv * Env) withtype SigEnv = Int SigIdMap (* [G] *) and FunEnv = FunctorClosure FunIdMap (* [F] *) type Basis = FunEnv * SigEnv * Env (* [B] *) (* Injections [Sections 4.3 and 7.2] *) val empty = ( FunIdMap.empty, SigIdMap.empty, DynamicEnv.empty ) fun fromE E = ( FunIdMap.empty, SigIdMap.empty, E ) fun fromF F = ( F, SigIdMap.empty, DynamicEnv.empty ) fun fromG G = ( FunIdMap.empty, G, DynamicEnv.empty ) (* Injections [Sections 4.3 and 7.2] *) fun Eof (F,G,E) = E (* Modifications [Sections 4.3 and 7.2] *) infix plus plusG plusF plusE plusSE IBplusI fun (F,G,E) plus (F',G',E') = ( FunIdMap.unionWith #2 (F,F') , SigIdMap.unionWith #2 (G,G') , DynamicEnv.plus(E,E') ) fun (F,G,E) plusG G' = ( F, SigIdMap.unionWith #2 (G,G'), E ) fun (F,G,E) plusF F' = ( FunIdMap.unionWith #2 (F,F'), G, E ) fun (F,G,E) plusE E' = ( F, G, DynamicEnv.plus(E,E') ) fun (F,G,E) plusSE SE = ( F, G, DynamicEnv.plusSE(E,SE) ) (* Application (lookup) [Sections 7.2 and 4.3] *) fun findStrId((F,G,E), strid) = DynamicEnv.findStrId(E, strid) fun findSigId((F,G,E), sigid) = SigIdMap.find(G, sigid) fun findFunId((F,G,E), funid) = FunIdMap.find(F, funid) fun findLongStrId((F,G,E), longstrid) = DynamicEnv.findLongStrId(E, longstrid) fun findLongTyCon((F,G,E), longtycon) = DynamicEnv.findLongTyCon(E, longtycon) end (* stop of DynamicBasis.sml *) (* start of INITIAL_DYNAMIC_BASIS.sml *) (* * Standard ML initial dynamic basis * * Definition, appendix D * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial basis in * here, too. *) signature INITIAL_DYNAMIC_BASIS = sig (* Import *) type Basis = DynamicBasis.Basis type State = InitialDynamicEnv.State (* Export *) val B0: Basis val s: State end (* stop of INITIAL_DYNAMIC_BASIS.sml *) (* start of InitialDynamicBasis.sml *) (* * Standard ML initial dynamic basis * * Definition, appendix D * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial basis in * here, too. *) structure InitialDynamicBasis :> INITIAL_DYNAMIC_BASIS = struct (* Import *) type Basis = DynamicBasis.Basis type State = InitialDynamicEnv.State (* Enviornments *) val F0 = FunIdMap.empty val G0 = SigIdMap.empty val E0 = InitialDynamicEnv.E0 val B0 = (F0,G0,E0) (* Associated state *) val s = InitialDynamicEnv.s end (* stop of InitialDynamicBasis.sml *) (* start of ERROR.sml *) (* * Error handling. *) signature ERROR = sig (* Import *) type position = Source.region (* Export *) exception Error of position * string val error: position * string -> 'a val warning: position * string -> unit end (* stop of ERROR.sml *) (* start of Error.sml *) (* * Error handling. *) structure Error :> ERROR = struct (* Import *) type position = Source.region (* Helper *) fun print((pos1,pos2), message) = let val a = Int.toString pos1 val b = Int.toString pos2 in TextIO.output(TextIO.stdErr, a ^ "-" ^ b ^ ": " ^ message ^ "\n") ; TextIO.flushOut TextIO.stdErr end (* Export *) exception Error of position * string fun error(pos, message) = ( print(pos, message) ; raise Error(pos, message) ) fun warning(pos, message) = print(pos, "warning: " ^ message) end (* stop of Error.sml *) (* start of INFIX.sml *) (* * Standard ML infix resolution * * Definition, section 2.6 *) signature INFIX = sig (* Import *) type Info = GrammarCore.Info type Op = GrammarCore.Op type VId = GrammarCore.VId type longVId = GrammarCore.longVId type Exp = GrammarCore.Exp type Pat = GrammarCore.Pat type AtExp = GrammarCore.AtExp type AtPat = GrammarCore.AtPat (* Modifying fixity status *) datatype Assoc = LEFT | RIGHT type InfStatus = Assoc * int type InfEnv = InfStatus VIdMap.map (* [J] *) val empty: InfEnv val assign: InfEnv * VId list * InfStatus -> InfEnv val cancel: InfEnv * VId list -> InfEnv (* Resolving phrases containing infixed identifiers *) val parseExp: InfEnv * AtExp list -> Exp val parsePat: InfEnv * AtPat list -> Pat val parseFmrule: InfEnv * AtPat list -> Op * VId * AtPat list end (* stop of INFIX.sml *) (* start of Infix.sml *) (* * Standard ML infix resolution * * Definition, section 2.6 *) structure Infix :> INFIX = struct (* Import *) open GrammarCore (* Type definitions *) datatype Assoc = LEFT | RIGHT type InfStatus = Assoc * int type InfEnv = InfStatus VIdMap.map (* [J] *) (* Modifying infix environments *) val empty = VIdMap.empty fun assign(J, vids, infstatus) = let fun insert(vid, J) = VIdMap.insert(J, vid, infstatus) in List.foldl insert J vids end fun cancel(J, vids) = let fun remove(vid, J) = #1(VIdMap.remove(J, vid)) in List.foldl remove J vids end (* Helpers for error messages *) val error = Error.error fun errorVId(I, s, vid) = error(I, s ^ VId.toString vid) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) (* Categorisation of atomic expressions and patterns *) datatype 'a FixityCategory = NONFIX of 'a | INFIX of InfStatus * VId * Info fun isInfix J (longvid) = LongVId.isUnqualified longvid andalso VIdMap.find(J, LongVId.toId longvid) <> NONE fun categoriseLongVId J (atomic, I, longvid) = if LongVId.isUnqualified longvid then let val vid = LongVId.toId longvid in case VIdMap.find(J, vid) of NONE => NONFIX(atomic) | SOME infstatus => INFIX(infstatus, vid, I) end else NONFIX(atomic) fun categoriseAtExp J (atexp as LONGVIDAtExp(I, SANSOp, longvid)) = categoriseLongVId J (atexp, I, longvid) | categoriseAtExp J (atexp) = NONFIX(atexp) fun categoriseAtPat J (atpat as LONGVIDAtPat(I, SANSOp, longvid)) = categoriseLongVId J (atpat, I, longvid) | categoriseAtPat J (atpat) = NONFIX(atpat) (* Resolving infixing [Section 2.6] *) fun parse(app, infapp, es) = let fun loop(NONFIX(e)::[], []) = e | loop(NONFIX(e2)::NONFIX(e1)::s', i) = (* reduce nonfix application *) loop(NONFIX(app(e1, e2))::s', i) | loop(s, NONFIX(e)::i') = (* shift *) loop(NONFIX(e)::s, i') | loop(s as NONFIX(e)::[], INFIX(x)::i') = (* shift *) loop(INFIX(x)::s, i') | loop(NONFIX(e2)::INFIX(_,vid,_)::NONFIX(e1)::s', []) = (* reduce infix application *) loop(NONFIX(infapp(e1, vid, e2))::s', []) | loop(s as NONFIX(e2)::INFIX((a1,p1),vid1,I1)::NONFIX(e1)::s', i as INFIX(x2 as ((a2,p2),vid2,I2))::i') = if p1 > p2 then (* reduce infix application *) loop(NONFIX(infapp(e1, vid1, e2))::s', i) else if p1 < p2 then (* shift *) loop(INFIX(x2)::s, i') else if a1 <> a2 then error(Source.over(I1,I2), "conflicting infix associativity") else if a1 = LEFT then (* reduce infix application *) loop(NONFIX(infapp(e1, vid1, e2))::s', i) else (* a1 = RIGHT *) (* shift *) loop(INFIX(x2)::s, i') | loop(INFIX(_, vid, I)::s, []) = errorVId(I, "misplaced infix identifier ", vid) | loop(INFIX(x)::s, INFIX(_, vid, I)::i) = errorVId(I, "misplaced infix identifier ", vid) | loop([], INFIX(_, vid, I)::i) = errorVId(I, "misplaced infix identifier ", vid) | loop _ = raise Fail "Infix.parse: inconsistency" in loop([], es) end (* Resolving infixed expressions [Section 2.6] *) fun atexpExp(PARAtExp(_, exp)) = exp | atexpExp atexp = ATEXPExp(infoAtExp atexp, atexp) fun appExp(atexp1, atexp2) = let val I1 = infoAtExp atexp1 val I2 = infoAtExp atexp2 val I = Source.over(I1, I2) in PARAtExp(I, APPExp(I, atexpExp atexp1, atexp2)) end fun pairExp(atexp1, atexp2) = let val I1 = infoAtExp atexp1 val I2 = infoAtExp atexp2 val lab1 = Lab.fromInt 1 val lab2 = Lab.fromInt 2 val exprow2 = ExpRow(I2, lab2, atexpExp atexp2, NONE) val exprow1 = ExpRow(I1, lab1, atexpExp atexp1, SOME exprow2) in RECORDAtExp(Source.over(I1,I2), SOME exprow1) end fun infappExp(atexp1, vid, atexp2) = let val Ivid = Source.between(infoAtExp atexp1, infoAtExp atexp2) val longvid = LongVId.fromId vid val atexp1' = LONGVIDAtExp(Ivid, SANSOp, longvid) val atexp2' = pairExp(atexp1, atexp2) in appExp(atexp1', atexp2') end fun parseExp(J, atexps) = let val atexp = parse(appExp, infappExp, List.map (categoriseAtExp J) atexps) in atexpExp atexp end (* Resolving infixed patterns [Section 2.6] *) fun atpatPat(PARAtPat(_, pat)) = pat | atpatPat atpat = ATPATPat(infoAtPat atpat, atpat) fun conPat(LONGVIDAtPat(I1, op_opt, longvid), atpat) = let val I2 = infoAtPat atpat val I = Source.over(I1, I2) in PARAtPat(I, CONPat(I, op_opt, longvid, atpat)) end | conPat(_, atpat) = error(infoAtPat atpat, "misplaced atomic pattern") fun pairPat(atpat1, atpat2) = let val I1 = infoAtPat atpat1 val I2 = infoAtPat atpat2 val lab1 = Lab.fromInt 1 val lab2 = Lab.fromInt 2 val patrow2 = ROWPatRow(I2, lab2, atpatPat atpat2, NONE) val patrow1 = ROWPatRow(I1, lab1, atpatPat atpat1, SOME patrow2) in RECORDAtPat(Source.over(I1,I2), SOME patrow1) end fun infconPat(atpat1, vid, atpat2) = let val Ivid = Source.between(infoAtPat atpat1, infoAtPat atpat2) val longvid = LongVId.fromId vid val atpat1' = LONGVIDAtPat(Ivid, SANSOp, longvid) val atpat2' = pairPat(atpat1, atpat2) in conPat(atpat1', atpat2') end fun parsePat(J, atpats) = let val atpat = parse(conPat, infconPat, List.map (categoriseAtPat J) atpats) in atpatPat atpat end (* Resolving fun match rules [Figure 21, note] *) fun parseFmrule(J, atpats) = (* * Allowed is the following: * (1) vid atpat+ * (2) (atpat infix_vid atpat) atpat* * (3) atpat infix_vid atpat *) let fun checkNonfixity [] = true | checkNonfixity(NONFIX _::t) = checkNonfixity t | checkNonfixity(INFIX(_, vid, I)::t) = errorVId(I, "misplaced infix identifier ", vid) fun maybeNonfixClause(ps) = case List.hd atpats of LONGVIDAtPat(I, op_opt, longvid) => if not(LongVId.isUnqualified longvid) then errorLongVId(I, "misplaced long identifier ", longvid) else if List.length atpats < 2 then error(I, "missing function arguments") else ( checkNonfixity ps (* including 1st *) ; ( op_opt, LongVId.toId longvid, List.tl atpats ) ) | WILDCARDAtPat(I) => error(I, "misplaced wildcard pattern") | SCONAtPat(I, _) => error(I, "misplaced constant pattern") | RECORDAtPat(I, _) => error(I, "misplaced record or tuple pattern") | PARAtPat(I, _) => error(I, "misplaced parenthesised pattern") fun maybeParenthesisedInfixClause(ps) = case List.hd ps of NONFIX(PARAtPat(_, CONPat(I, SANSOp, longvid, atpat))) => if not(LongVId.isUnqualified longvid) then errorLongVId(I, "misplaced long identifier ", longvid) else if not(isInfix J longvid) then error(I, "misplaced non-infix pattern") else (* Now, longvid has infix status but is sans `op', so it can only result from resolving an appropriate infix construction. *) ( checkNonfixity(List.tl ps) ; ( SANSOp, LongVId.toId longvid, atpat::List.tl atpats ) ) | NONFIX(PARAtPat(_, pat)) => error(infoPat pat, "misplaced non-infix pattern") | _ => maybeNonfixClause(ps) fun maybePlainInfixClause(ps) = case ps of [NONFIX atpat1, INFIX(_, vid, I), NONFIX atpat2] => ( SANSOp, vid, pairPat(atpat1, atpat2)::[] ) | _ => maybeParenthesisedInfixClause(ps) in maybePlainInfixClause(List.map (categoriseAtPat J) atpats) end end (* stop of Infix.sml *) (* start of INITIAL_INFIX_ENV.sml *) (* * Standard ML initial infix environment * * Definition, Appendix C *) signature INITIAL_INFIX_ENV = sig (* Import type *) type InfEnv = Infix.InfEnv (* Export *) val J0: InfEnv end (* stop of INITIAL_INFIX_ENV.sml *) (* start of InitialInfixEnv.sml *) (* * Standard ML initial infix environment * * Definition, Appendix C *) structure InitialInfixEnv :> INITIAL_INFIX_ENV = struct (* Import type *) type InfEnv = Infix.InfEnv (* Value identifiers *) val vidCons = VId.fromString "::" val vidEqual = VId.fromString "=" val vidAssign = VId.fromString ":=" (* Export *) val J0 = VIdMap.fromList[(vidCons, (Infix.RIGHT, 5)), (vidEqual, (Infix.LEFT, 4)), (vidAssign, (Infix.LEFT, 3))] end (* stop of InitialInfixEnv.sml *) (* start of BASIS.sml *) (* * Standard ML combined basis * * Definition, section 8 *) signature BASIS = sig (* Import types *) type StaticBasis = StaticBasis.Basis (* [B_STAT] *) type DynamicBasis = DynamicBasis.Basis (* [B_DYN] *) (* Type [Section 8] *) type Basis = StaticBasis * DynamicBasis (* [B] *) (* Operations *) val B_STATof: Basis -> StaticBasis val B_DYNof: Basis -> DynamicBasis val oplus: Basis * Basis -> Basis end (* stop of BASIS.sml *) (* start of Basis.sml *) (* * Standard ML combined basis * * Definition, section 8 *) structure Basis :> BASIS = struct (* Import types *) type StaticBasis = StaticBasis.Basis (* [B_STAT] *) type DynamicBasis = DynamicBasis.Basis (* [B_DYN] *) (* Type [Section 8] *) type Basis = StaticBasis * DynamicBasis (* [B] *) (* Projections *) fun B_STATof (B_STAT,B_DYN) = B_STAT fun B_DYNof (B_STAT,B_DYN) = B_DYN (* Modification [Section 4.3] *) infix oplus fun (B_STAT,B_DYN) oplus (B_STAT',B_DYN') = ( StaticBasis.plus(B_STAT, B_STAT') , DynamicBasis.plus(B_DYN, B_DYN') ) end (* stop of Basis.sml *) (* start of PACK.sml *) (* * Standard ML exception packets * * Definition, section 6.2 *) signature PACK = sig (* Import *) type 'a ExVal = 'a Val.ExVal type FcnClosure = DynamicEnv.FcnClosure (* Definitions [Section 6.2] *) type Pack = FcnClosure ExVal (* [p] *) exception Pack of Pack end (* stop of PACK.sml *) (* start of Pack.sml *) (* * Standard ML exception packets * * Definition, section 6.2 *) structure Pack :> PACK = struct (* Import *) type 'a ExVal = 'a Val.ExVal type FcnClosure = DynamicEnv.FcnClosure (* Definitions [Section 6.2] *) type Pack = FcnClosure ExVal (* [p] *) exception Pack of Pack end (* stop of Pack.sml *) (* start of BASVAL.sml *) (* * Standard ML basic values * * Definition, section 6.4 *) signature BASVAL = sig (* Import *) type BasVal = Val.BasVal type 'a Val = 'a Val.Val exception Pack of Pack.Pack (* = Pack.Pack *) (* Operations *) exception TypeError val APPLY: BasVal * 'a Val -> 'a Val (* / Pack *) val toString: BasVal -> string end (* stop of BASVAL.sml *) (* start of BasVal.sml *) (* * Standard ML basic values * * Definition, section 6.4 *) structure BasVal :> BASVAL = struct (* Import *) type BasVal = Val.BasVal type 'a Val = 'a Val.Val exception Pack = Pack.Pack (* Conversions *) fun toString b = b (* Application of basic values *) exception TypeError fun APPLY("=", v) = (case Val.unpair v of SOME vv => Val.toBoolVal(Val.equal vv) | NONE => raise TypeError ) | APPLY _ = raise Fail "BasVal.APPLY: unknown basic value" end (* stop of BasVal.sml *) (* start of EVAL_CORE.sml *) (* * Standard ML core evaluation * * Definition, section 6.7 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out of the state and exception convention in the inference * rules can be avoided (would really be a pain). Note that the state * therefore never is returned. * - Doing so, we can model the exception convention using exceptions. *) signature EVAL_CORE = sig (* Import types *) type Dec = GrammarCore.Dec type Env = DynamicEnv.Env type State = DynamicEnv.FcnClosure State.State (* Export *) val evalDec: State ref * Env * Dec -> Env end (* stop of EVAL_CORE.sml *) (* start of EvalCore.sml *) (* * Standard ML core evaluation * * Definition, sections 6.7 and 6.2 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. * Rules of the form A |- phrase => A'/p therefore turn into * A |- phrase => A'. * - We only pass the state where necessary. * - Special constants have already been evaluated inside the Lexer. *) structure EvalCore :> EVAL_CORE = struct (* Import *) type Dec = GrammarCore.Dec type Env = DynamicEnv.Env type State = DynamicEnv.FcnClosure State.State exception Pack = Pack.Pack open GrammarCore (* Some helpers for error messages *) val error = Error.error fun errorLab(I, s, lab) = error(I, s ^ Lab.toString lab) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for environment modification *) val plus = DynamicEnv.plus val plusVE = DynamicEnv.plusVE val plusTE = DynamicEnv.plusTE val plusVEandTE = DynamicEnv.plusVEandTE infix plus plusVE plusTE plusVEandTE (* Evaluating special constants [Section 6.2] *) fun valSCon(SCon.INT n) = Val.SVal(SVal.INT n) | valSCon(SCon.WORD w) = Val.SVal(SVal.WORD w) | valSCon(SCon.CHAR c) = Val.SVal(SVal.CHAR c) | valSCon(SCon.REAL x) = Val.SVal(SVal.REAL x) | valSCon(SCon.STRING s) = Val.SVal(SVal.STRING s) (* Inference rules [Section 6.7] *) exception FAIL (* Atomic Expressions *) fun evalAtExp(s,E, SCONAtExp(I, scon)) = (* [Rule 90] *) valSCon scon | evalAtExp(s,E, LONGVIDAtExp(I, _, longvid)) = (* [Rule 91] *) let val (v,is) = case DynamicEnv.findLongVId(E, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "runtime error: \ \unknown identifier ", longvid) in v end | evalAtExp(s,E, RECORDAtExp(I, exprow_opt)) = (* [Rule 92] *) let val r = case exprow_opt of NONE => LabMap.empty | SOME exprow => evalExpRow(s,E, exprow) in Val.Record r end | evalAtExp(s,E, LETAtExp(I, dec, exp)) = (* [Rule 93] *) let val E' = evalDec(s,E, dec) val v = evalExp(s,E plus E', exp) in v end | evalAtExp(s,E, PARAtExp(I, exp)) = (* [Rule 94] *) let val v = evalExp(s,E, exp) in v end (* Expression Rows *) and evalExpRow(s,E, ExpRow(I, lab, exp, exprow_opt)) = (* [Rule 95] *) let val v = evalExp(s,E, exp) val r = case exprow_opt of NONE => LabMap.empty | SOME exprow => evalExpRow(s,E, exprow) in LabMap.insert(r, lab, v) end (* Expressions *) and evalExp(s,E, ATEXPExp(I, atexp)) = (* [Rule 96] *) let val v = evalAtExp(s,E, atexp) in v end | evalExp(s,E, APPExp(I, exp, atexp)) = (* [Rules 97 to 103] *) let val v1 = evalExp(s,E, exp) val v = evalAtExp(s,E, atexp) in case v1 of Val.VId vid => if vid = VId.fromString "ref" then (* [Rule 99] *) let val a = Addr.addr() in s := State.insertAddr(!s, a, v) ; Val.Addr a end else (* [Rule 97] *) Val.VIdVal (vid,v) | Val.ExVal(Val.ExName en) => (* [Rule 98] *) Val.ExVal(Val.ExNameVal(en,v)) | Val.:= => (* [Rule 100] *) (case Val.unpair v of SOME(Val.Addr a, v) => ( s := State.insertAddr(!s, a, v) ; Val.Record LabMap.empty ) | _ => error(I, "runtime type error: address expected") ) | Val.BasVal b => (* [Rule 101] *) BasVal.APPLY(b, v) | Val.FcnClosure(DynamicEnv.FcnClosure(match,E',VE)) => (* [Rule 102] *) (let val v' = evalMatch(s,E' plusVE DynamicEnv.Rec VE, v, match) in v' end handle FAIL => (* [Rule 103] *) raise Pack(Val.ExName InitialDynamicEnv.enMatch) ) | _ => error(I, "runtime type error: applicative value expected") end | evalExp(s,E, TYPEDExp(I, exp, _)) = (* Omitted [Section 6.1] *) evalExp(s,E, exp) | evalExp(s,E, HANDLEExp(I, exp, match)) = (* [Rule 104 to 106] *) (let val v = evalExp(s,E, exp) in (* [Rule 104] *) v end handle Pack.Pack e => let val v = evalMatch(s,E,Val.ExVal e, match) in (* [Rule 105] *) v end handle FAIL => (* [Rule 106] *) raise Pack.Pack e ) | evalExp(s,E, RAISEExp(I, exp)) = (* [Rule 107] *) let val e = case evalExp(s,E, exp) of Val.ExVal e => e | _ => error(I, "runtime type error: \ \exception value expected") in raise Pack.Pack e end | evalExp(s,E, FNExp(I, match)) = (* [Rule 108] *) Val.FcnClosure(DynamicEnv.FcnClosure(match,E,VIdMap.empty)) (* Matches *) and evalMatch(s,E,v, Match(I, mrule, match_opt)) = (* [Rules 109 to 111] *) let val v' = evalMrule(s,E,v, mrule) in (* [Rule 109] *) v' end handle FAIL => case match_opt of NONE => (* [Rule 110] *) raise FAIL | SOME match => (* [Rule 111] *) let val v' = evalMatch(s,E,v, match) in v' end (* Match rules *) and evalMrule(s,E,v, Mrule(I, pat, exp)) = (* [Rules 112 and 113] *) let val VE = evalPat(s,E,v, pat) (* [Rule 112] *) val v' = evalExp(s,E plusVE VE, exp) in v' end (* FAIL on evalPat propagates through [Rule 113] *) (* Declarations *) and evalDec(s,E, VALDec(I, tyvarseq, valbind)) = (* [Rule 114] *) let val VE = evalValBind(s,E, valbind) in DynamicEnv.fromVE VE end | evalDec(s,E, TYPEDec(I, typbind)) = (* [Rule 115] *) let val TE = evalTypBind(typbind) in DynamicEnv.fromTE TE end | evalDec(s,E, DATATYPEDec(I, datbind)) = (* [Rule 116] *) let val (VE,TE) = evalDatBind(datbind) in DynamicEnv.fromVEandTE(VE,TE) end | evalDec(s,E, REPLICATIONDec(I, tycon, longtycon)) = (* [Rule 117] *) let val VE = case DynamicEnv.findLongTyCon(E, longtycon) of SOME VE => VE | NONE => errorLongTyCon(I, "runtime error: unknown type ", longtycon) in DynamicEnv.fromVEandTE(VE, TyConMap.singleton(tycon, VE)) end | evalDec(s,E, ABSTYPEDec(I, datbind, dec)) = (* [Rule 118] *) let val (VE,TE) = evalDatBind(datbind) val E' = evalDec(s,E plusVEandTE (VE,TE), dec) in E' end | evalDec(s,E, EXCEPTIONDec(I, exbind)) = (* [Rule 119] *) let val VE = evalExBind(s,E, exbind) in DynamicEnv.fromVE VE end | evalDec(s,E, LOCALDec(I, dec1, dec2)) = (* [Rule 120] *) let val E1 = evalDec(s,E, dec1) val E2 = evalDec(s,E plus E1, dec2) in E2 end | evalDec(s,E, OPENDec(I, longstrids)) = (* [Rule 121] *) let val Es = List.map (fn longstrid => case DynamicEnv.findLongStrId(E, longstrid) of SOME(DynamicEnv.Str E) => E | NONE => errorLongStrId(I, "runtime error: unknown \ \structure ", longstrid) ) longstrids in List.foldl DynamicEnv.plus DynamicEnv.empty Es end | evalDec(s,E, EMPTYDec(I)) = (* [Rule 122] *) DynamicEnv.empty | evalDec(s,E, SEQDec(I, dec1, dec2)) = (* [Rule 123] *) let val E1 = evalDec(s,E, dec1) val E2 = evalDec(s,E plus E1, dec2) in E1 plus E2 end (* Value Bindings *) and evalValBind(s,E, PLAINValBind(I, pat, exp, valbind_opt)) = (* [Rule 124 and 125] *) (let val v = evalExp(s,E, exp) val VE = evalPat(s,E,v, pat) (* [Rule 124] *) val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => evalValBind(s,E, valbind) in VIdMap.unionWith #2 (VE, VE') end handle FAIL => (* [Rule 125] *) raise Pack.Pack(Val.ExName InitialDynamicEnv.enBind) ) | evalValBind(s,E, RECValBind(I, valbind)) = (* [Rule 126] *) let val VE = evalValBind(s,E, valbind) in DynamicEnv.Rec VE end (* Type Bindings *) and evalTypBind(TypBind(I, tyvarseq, tycon, ty, typbind_opt)) = (* [Rule 127] *) let val TE = case typbind_opt of NONE => TyConMap.empty | SOME typbind => evalTypBind(typbind) in TyConMap.insert(TE, tycon, VIdMap.empty) end (* Datatype Bindings *) and evalDatBind(DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 128] *) let val VE = evalConBind(conbind) val (VE',TE') = case datbind_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datbind' => evalDatBind(datbind') in ( VIdMap.unionWith #2 (VE, VE') , TyConMap.insert(TE', tycon, VE) ) end (* Constructor Bindings *) and evalConBind(ConBind(I, _, vid, _, conbind_opt)) = (* [Rule 129] *) let val VE = case conbind_opt of NONE => VIdMap.empty | SOME conbind => evalConBind(conbind) in VIdMap.insert(VE, vid, (Val.VId vid,IdStatus.c)) end (* Exception Bindings *) and evalExBind(s,E, NEWExBind(I, _, vid, _, exbind_opt)) = (* [Rule 130] *) let val en = ExName.exname vid val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => evalExBind(s,E, exbind) in s := State.insertExName(!s, en) ; VIdMap.insert(VE, vid, (Val.ExVal(Val.ExName en),IdStatus.e)) end | evalExBind(s,E, EQUALExBind(I, _, vid, _, longvid, exbind_opt)) = (* [Rule 131] *) let val en = case DynamicEnv.findLongVId(E, longvid) of SOME(en,IdStatus.e) => en | SOME _ => errorLongVId(I, "runtime error: non-exception \ \identifier ", longvid) | NONE => errorLongVId(I, "runtime error: unknown identifier ", longvid) val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => evalExBind(s,E, exbind) in VIdMap.insert(VE, vid, (en,IdStatus.e)) end (* Atomic Patterns *) and evalAtPat(s,E,v, WILDCARDAtPat(I)) = (* [Rule 132] *) VIdMap.empty | evalAtPat(s,E,v, SCONAtPat(I, scon)) = (* [Rule 133 and 134] *) (case v of Val.SVal sv => if Val.equal(v, valSCon(scon)) then (* [Rule 133] *) VIdMap.empty else (* [Rule 134] *) raise FAIL | _ => error(I, "runtime type error: special constant expected") ) | evalAtPat(s,E,v, LONGVIDAtPat(I, _, longvid)) = (* [Rule 135 to 137] *) let val (strids,vid) = LongVId.explode longvid in if List.null strids andalso ( case DynamicEnv.findVId(E, vid) of NONE => true | SOME(_,is) => is = IdStatus.v ) then (* [Rule 135] *) VIdMap.singleton(vid, (v,IdStatus.v)) else let val (v',is) = case DynamicEnv.findLongVId(E, longvid) of SOME valstr => valstr | NONE => errorLongVId(I,"runtime error: \ \unknown constructor ", longvid) in if Val.equal(v, v') then (* [Rule 136] *) VIdMap.empty else (* [Rule 137] *) raise FAIL end end | evalAtPat(s,E,v, RECORDAtPat(I, patrow_opt)) = (* [Rule 138] *) let val r = case v of Val.Record r => r | _ => error(I, "runtime type error: record expected") val VE = case patrow_opt of NONE => if LabMap.isEmpty r then VIdMap.empty else error(I, "runtime type error: \ \empty record expected") | SOME patrow => evalPatRow(s,E,r, patrow) in VE end | evalAtPat(s,E,v, PARAtPat(I, pat)) = (* [Rule 139] *) let val VE = evalPat(s,E,v, pat) in VE end (* Pattern Rows *) and evalPatRow(s,E,r, WILDCARDPatRow(I)) = (* [Rule 140] *) VIdMap.empty | evalPatRow(s,E,r, ROWPatRow(I, lab, pat, patrow_opt)) = (* [Rule 141 and 142] *) let val v = case LabMap.find(r, lab) of SOME v => v | _ => errorLab(I, "runtime type error: \ \unmatched label ", lab) val VE = evalPat(s,E,v, pat) (* [Rule 142] *) val VE' = case patrow_opt of NONE => VIdMap.empty | SOME patrow => evalPatRow(s,E,r, patrow) in VIdMap.unionWithi #2 (VE, VE') end (* FAIL on evalPat propagates through [Rule 142] *) (* Patterns *) and evalPat(s,E,v, ATPATPat(I, atpat)) = (* [Rule 143] *) let val VE = evalAtPat(s,E,v, atpat) in VE end | evalPat(s,E,v, CONPat(I, _, longvid, atpat)) = (* [Rules 144 to 148] *) (case (DynamicEnv.findLongVId(E, longvid), v) of ( SOME(Val.VId vid, IdStatus.c), Val.VIdVal(vid',v') ) => if vid = VId.fromString "ref" then error(I, "runtime type error: address expected") else if vid = vid' then (* [Rule 144] *) let val VE = evalAtPat(s,E,v', atpat) in VE end else (* [Rule 145] *) raise FAIL | ( SOME(Val.ExVal(Val.ExName en),IdStatus.e), Val.ExVal(Val.ExNameVal(en',v')) ) => if en = en' then (* [Rule 146] *) let val VE = evalAtPat(s,E,v', atpat) in VE end else (* [Rule 147] *) raise FAIL | ( SOME(Val.VId vid, IdStatus.c), Val.Addr a ) => if vid = VId.fromString "ref" then (* [Rule 148] *) let val v = case State.findAddr(!s, a) of SOME v => v | NONE => raise Fail "EvalCore.evalPat: \ \invalid address" val VE = evalAtPat(s,E,v, atpat) in VE end else error(I, "runtime type error: reference expected") | _ => error(I, "runtime type error: constructor expected") ) | evalPat(s,E,v, TYPEDPat(I, pat, _)) = (* Omitted [Section 6.1] *) evalPat(s,E,v, pat) | evalPat(s,E,v, ASPat(I, _, vid, _, pat)) = (* [Rule 149] *) let val VE = evalPat(s,E,v, pat) in VIdMap.insert(VE, vid, (v,IdStatus.v)) end end (* stop of EvalCore.sml *) (* start of INTBASIS.sml *) (* * Standard ML interface basis * * Definition, section 7.2 *) signature INTBASIS = sig (* Import types *) type SigId = SigId.Id type longTyCon = LongTyCon.longId type Basis = DynamicBasis.Basis type SigEnv = DynamicBasis.SigEnv type Env = DynamicEnv.Env type Int = Interface.Int type ValInt = Interface.ValInt type 'a SigIdMap = 'a SigIdMap.map (* Types [Section 7.2] *) type IntBasis = SigEnv * Int (* [IB] *) (* Operations *) val Inter: Basis -> IntBasis val plusI: IntBasis * Int -> IntBasis val findSigId: IntBasis * SigId -> Int option val findLongTyCon: IntBasis * longTyCon -> ValInt option end (* stop of INTBASIS.sml *) (* start of IntBasis.sml *) (* * Standard ML interface basis * * Definition, section 7.2 *) structure IntBasis :> INTBASIS = struct (* Import types *) type SigId = SigId.Id type longTyCon = LongTyCon.longId type Basis = DynamicBasis.Basis type SigEnv = DynamicBasis.SigEnv type Env = DynamicEnv.Env type Int = Interface.Int type ValInt = Interface.ValInt type 'a SigIdMap = 'a SigIdMap.map (* Types [Section 7.2] *) type IntBasis = SigEnv * Int (* [IB] *) (* Injections [Section 7.2] *) fun Inter (F,G,E) = (G, Interface.Inter E) (* Modifications [Sections 4.3 and 7.2] *) infix plusI fun (G,I) plusI I' = ( G, Interface.plus(I,I') ) (* Application (lookup) [Sections 7.2 and 4.3] *) fun findSigId((G,I), sigid) = SigIdMap.find(G, sigid) fun findLongTyCon((G,I), longtycon) = Interface.findLongTyCon(I, longtycon) end (* stop of IntBasis.sml *) (* start of EVAL_MODULE.sml *) (* * Standard ML modules evaluation * * Definition, section 7.3 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. *) signature EVAL_MODULE = sig (* Import types *) type TopDec = GrammarModule.TopDec type Basis = DynamicBasis.Basis type State = EvalCore.State (* Export *) val evalTopDec: State ref * Basis * TopDec -> Basis end (* stop of EVAL_MODULE.sml *) (* start of EvalModule.sml *) (* * Standard ML modules evaluation * * Definition, section 7.3 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. * Rules of the form A |- phrase => A'/p therefore turn into * A |- phrase => A'. * - We only pass the state where necessary, ie. strexp, strdec, strbind, and * topdec (compare note in [Section 7.3]). * - There is a typo in the Definition in rule 182: both occurances of IB * should be replaced by B. * - The rules for toplevel declarations are all wrong: in the conclusions, * the result right of the arrow must be B' <+ B''> instead of B'<'> in * all three rules. *) structure EvalModule :> EVAL_MODULE = struct (* Import *) type TopDec = GrammarModule.TopDec type Basis = DynamicBasis.Basis type State = EvalCore.State open GrammarModule (* Helpers for error messages *) val error = Error.error fun errorSigId(I, s, sigid) = error(I, s ^ SigId.toString sigid) fun errorFunId(I, s, funid) = error(I, s ^ FunId.toString funid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for basis modification *) val plus = DynamicBasis.plus val plusSE = DynamicBasis.plusSE val plusG = DynamicBasis.plusG val plusF = DynamicBasis.plusF val plusE = DynamicBasis.plusE infix plus plusG plusF plusE plusSE (* Inference rules [Section 7.3] *) (* Structure Expressions *) fun evalStrExp(s,B, STRUCTStrExp(I, strdec)) = (* [Rule 150] *) let val E = evalStrDec(s,B, strdec) in E end | evalStrExp(s,B, LONGSTRIDStrExp(I, longstrid)) = (* [Rule 151] *) let val E = case DynamicBasis.findLongStrId(B, longstrid) of SOME(DynamicEnv.Str E) => E | NONE => errorLongStrId(I, "runtime error: unknown structure ", longstrid) in E end | evalStrExp(s,B, TRANSStrExp(I, strexp, sigexp)) = (* [Rule 152] *) let val E = evalStrExp(s,B, strexp) val I = evalSigExp(IntBasis.Inter B, sigexp) in Interface.cutdown(E, I) end | evalStrExp(s,B, OPAQStrExp(I, strexp, sigexp)) = (* [Rule 153] *) let val E = evalStrExp(s,B, strexp) val I = evalSigExp(IntBasis.Inter B, sigexp) in Interface.cutdown(E, I) end | evalStrExp(s,B, APPStrExp(I, funid, strexp)) = (* [Rule 154] *) let val DynamicBasis.FunctorClosure((strid, I), strexp', B') = case DynamicBasis.findFunId(B, funid) of SOME funcclos => funcclos | NONE => errorFunId(I, "runtime error: \ \unknown functor ", funid) val E = evalStrExp(s,B, strexp) val E' = evalStrExp( s, B' plusSE StrIdMap.singleton(strid, DynamicEnv.Str(Interface.cutdown(E, I))), strexp') in E' end | evalStrExp(s,B, LETStrExp(I, strdec, strexp)) = (* [Rule 155] *) let val E = evalStrDec(s,B, strdec) val E' = evalStrExp(s,B plusE E, strexp) in E' end (* Structure-level Declarations *) and evalStrDec(s,B, DECStrDec(I, dec)) = (* [Rule 156] *) let val E' = EvalCore.evalDec(s,DynamicBasis.Eof B, dec) in E' end | evalStrDec(s,B, STRUCTUREStrDec(I, strbind)) = (* [Rule 157] *) let val SE = evalStrBind(s,B, strbind) in DynamicEnv.fromSE SE end | evalStrDec(s,B, LOCALStrDec(I, strdec1, strdec2)) = (* [Rule 158] *) let val E1 = evalStrDec(s,B, strdec1) val E2 = evalStrDec(s,B plusE E1, strdec2) in E2 end | evalStrDec(s,B, EMPTYStrDec(I)) = (* [Rule 159] *) DynamicEnv.empty | evalStrDec(s,B, SEQStrDec(I, strdec1, strdec2)) = (* [Rule 160] *) let val E1 = evalStrDec(s,B, strdec1) val E2 = evalStrDec(s,B plusE E1, strdec2) in DynamicEnv.plus(E1, E2) end (* Structure Bindings *) and evalStrBind(s,B, StrBind(I, strid, strexp, strbind_opt)) = (* [Rule 161] *) let val E = evalStrExp(s,B, strexp) val SE = case strbind_opt of NONE => StrIdMap.empty | SOME strbind => evalStrBind(s,B, strbind) in StrIdMap.insert(SE, strid, DynamicEnv.Str E) end (* Signature Expressions *) and evalSigExp(IB, SIGSigExp(I, spec)) = (* [Rule 162] *) let val I = evalSpec(IB, spec) in I end | evalSigExp(IB, SIGIDSigExp(I, sigid)) = (* [Rule 163] *) let val I = case IntBasis.findSigId(IB, sigid) of SOME I => I | NONE => errorSigId(I, "runtime error: unknown \ \signature ",sigid) in I end | evalSigExp(IB, WHERETYPESigExp(I, sigexp, _, _, _)) = (* Omitted [Section 7.1] *) evalSigExp(IB, sigexp) (* Signature Declarations *) and evalSigDec(IB, SigDec(I, sigbind)) = (* [Rule 164] *) let val G = evalSigBind(IB, sigbind) in G end (* Signature Bindings *) and evalSigBind(IB, SigBind(I, sigid, sigexp, sigbind_opt)) = (* [Rule 165] *) let val I = evalSigExp(IB, sigexp) val G = case sigbind_opt of NONE => SigIdMap.empty | SOME sigbind => evalSigBind(IB, sigbind) in SigIdMap.insert(G, sigid, I) end (* Specifications *) and evalSpec(IB, VALSpec(I, valdesc)) = (* [Rule 166] *) let val VI = evalValDesc(valdesc) in Interface.fromVI VI end | evalSpec(IB, TYPESpec(I, typdesc)) = (* [Rule 167] *) let val TI = evalTypDesc(typdesc) in Interface.fromTI TI end | evalSpec(IB, EQTYPESpec(I, typdesc)) = (* [Rule 168] *) let val TI = evalTypDesc(typdesc) in Interface.fromTI TI end | evalSpec(IB, DATATYPESpec(I, datdesc)) = (* [Rule 169] *) let val (VI,TI) = evalDatDesc(datdesc) in Interface.fromVIandTI(VI,TI) end | evalSpec(IB, REPLICATIONSpec(I, tycon, longtycon)) = (* [Rule 170] *) let val VI = case IntBasis.findLongTyCon(IB, longtycon) of SOME VI => VI | NONE => errorLongTyCon(I, "runtime error: \ \unknown type ", longtycon) val TI = TyConMap.singleton(tycon, VI) in Interface.fromVIandTI(VI,TI) end | evalSpec(IB, EXCEPTIONSpec(I, exdesc)) = (* [Rule 171] *) let val VI = evalExDesc(exdesc) in Interface.fromVI VI end | evalSpec(IB, STRUCTURESpec(I, strdesc)) = (* [Rule 172] *) let val SI = evalStrDesc(IB, strdesc) in Interface.fromSI SI end | evalSpec(IB, INCLUDESpec(I, sigexp)) = (* [Rule 173] *) let val I = evalSigExp(IB, sigexp) in I end | evalSpec(IB, EMPTYSpec(I)) = (* [Rule 174] *) Interface.empty | evalSpec(IB, SEQSpec(I, spec1, spec2)) = (* [Rule 77] *) let val I1 = evalSpec(IB, spec1) val I2 = evalSpec(IntBasis.plusI(IB, I1), spec2) in Interface.plus(I1,I2) end | evalSpec(IB, SHARINGTYPESpec(I, spec, longtycons)) = (* Omitted [Section 7.1] *) evalSpec(IB, spec) | evalSpec(IB, SHARINGSpec(I, spec, longstrids)) = (* Omitted [Section 7.1] *) evalSpec(IB, spec) (* Value Descriptions *) and evalValDesc(ValDesc(I, vid, _, valdesc_opt)) = (* [Rule 176] *) let val VI = case valdesc_opt of NONE => VIdMap.empty | SOME valdesc => evalValDesc(valdesc) in VIdMap.insert(VI, vid, IdStatus.v) end (* Type Descriptions *) and evalTypDesc(TypDesc(I, tyvarseq, tycon, typdesc_opt)) = (* [Rule 177] *) let val TI = case typdesc_opt of NONE => TyConMap.empty | SOME typdesc => evalTypDesc(typdesc) in TyConMap.insert(TI, tycon, VIdMap.empty) end (* Datatype Descriptions *) and evalDatDesc(DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 178] *) let val VI = evalConDesc(condesc) val (VI',TI') = case datdesc_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datdesc' => evalDatDesc(datdesc') in ( VIdMap.unionWith #2 (VI, VI') , TyConMap.insert(TI', tycon, VI) ) end (* Constructor Descriptions *) and evalConDesc(ConDesc(I, vid, _, condesc_opt)) = (* [Rule 179] *) let val VI = case condesc_opt of NONE => VIdMap.empty | SOME condesc => evalConDesc(condesc) in VIdMap.insert(VI, vid, IdStatus.c) end (* Exception Description *) and evalExDesc(ExDesc(I, vid, _, exdesc_opt)) = (* [Rule 180] *) let val VI = case exdesc_opt of NONE => VIdMap.empty | SOME exdesc => evalExDesc(exdesc) in VIdMap.insert(VI, vid, IdStatus.e) end (* Structure Descriptions *) and evalStrDesc(IB, StrDesc(I, strid, sigexp, strdesc_opt)) = (* [Rule 181] *) let val I = evalSigExp(IB, sigexp) val SI = case strdesc_opt of NONE => StrIdMap.empty | SOME strdesc => evalStrDesc(IB, strdesc) in StrIdMap.insert(SI, strid, Interface.Str I) end (* Functor Bindings *) and evalFunBind(B, FunBind(I, funid, strid, sigexp, strexp, funbind_opt)) = (* [Rule 182] *) (* Note that there is a typo in this rule. *) let val I = evalSigExp(IntBasis.Inter B, sigexp) val F = case funbind_opt of NONE => FunIdMap.empty | SOME funbind => evalFunBind(B, funbind) in FunIdMap.insert(F, funid, DynamicBasis.FunctorClosure((strid,I),strexp,B)) end (* Functor Declarations *) and evalFunDec(B, FunDec(I, funbind)) = (* [Rule 183] *) let val F = evalFunBind(B, funbind) in F end (* Top-level Declarations *) and evalTopDec(s,B, STRDECTopDec(I, strdec, topdec_opt)) = (* [Rule 184] *) (* Note the mistake in the conclusion of this rule. *) let val E = evalStrDec(s,B, strdec) val B' = DynamicBasis.fromE E val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end | evalTopDec(s,B, SIGDECTopDec(I, sigdec, topdec_opt)) = (* [Rule 185] *) (* Note the mistake in the conclusion of this rule. *) let val G = evalSigDec(IntBasis.Inter B, sigdec) val B' = DynamicBasis.fromG G val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end | evalTopDec(s,B, FUNDECTopDec(I, fundec, topdec_opt)) = (* [Rule 186] *) (* Note the mistake in the conclusion of this rule. *) let val F = evalFunDec(B, fundec) val B' = DynamicBasis.fromF F val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end end (* stop of EvalModule.sml *) (* start of PRETTY_PRINT.sml *) (* * A generic pretty printer. * * Based on: * Philip Wadler. "A prettier printer" * http://cm.bell-labs.com/cm/cs/who/wadler/ * and Christian Lindig's port to OCaml. * * The semantics has been extended to allow 4 different kinds of * groups (`boxes'), 2 modes of nesting, and varying break representations. * This is no more easily described by an algebra though, and the `below' * combinator looses optimality. *) signature PRETTY_PRINT = sig type doc val empty : doc (* empty document *) val break : doc (* space or line break *) val ebreak : doc (* empty or line break *) val text : string -> doc (* raw text *) val ^^ : doc * doc -> doc (* concatenation *) val ^/^ : doc * doc -> doc (* concatenation with break *) val hbox : doc -> doc (* horizontal box *) val vbox : doc -> doc (* vertical box *) val fbox : doc -> doc (* fill box (h and v) *) val abox : doc -> doc (* auto box (h or v) *) val nest : int -> doc -> doc (* indentation by k char's *) val below : doc -> doc (* keep current indentation *) val isEmpty : doc -> bool val toString : doc * int -> string val output : TextIO.outstream * doc * int -> unit end (* stop of PRETTY_PRINT.sml *) (* start of PrettyPrint.sml *) (* * A generic pretty printer. * * Based on: * Philip Wadler. "A prettier printer" * http://cm.bell-labs.com/cm/cs/who/wadler/ * and Christian Lindig's port to OCaml. * * The semantics has been extended to allow 4 different kinds of * groups (`boxes'), 2 modes of nesting, and varying break representations. * This is no more easily described by an algebra though, and the `below' * combinator looses optimality. *) structure PrettyPrint :> PRETTY_PRINT = struct (* Types *) datatype mode = H | V | F | A datatype doc = EMPTY | BREAK of string | TEXT of string | CONS of doc * doc | BOX of mode * doc | NEST of int * doc | BELOW of doc datatype prim = PTEXT of string | PLINE of int (* Interface operators *) infixr ^^ ^/^ val empty = EMPTY val break = BREAK " " val ebreak = BREAK "" val text = TEXT fun x ^^ EMPTY = x | EMPTY ^^ y = y | x ^^ y = CONS(x, y) fun x ^/^ EMPTY = x | EMPTY ^/^ y = y | x ^/^ y = CONS(x, CONS(break, y)) fun below EMPTY = EMPTY | below x = BELOW x fun hbox EMPTY = EMPTY | hbox x = BOX(H, x) fun vbox EMPTY = EMPTY | vbox x = BOX(V, x) fun fbox EMPTY = EMPTY | fbox x = BOX(F, x) fun abox EMPTY = EMPTY | abox x = BOX(A, x) fun nest k EMPTY = EMPTY | nest k x = NEST(k, x) fun isEmpty EMPTY = true | isEmpty _ = false (* Check whether the first line of a document fits into remaining characters *) (* We abuse the mode A (which can never occur in the lists passed to * fits) to flag breaks which occur inside swallowed vboxes. *) fun fits(w, z) = w >= 0 andalso case z of [] => true | (i,m,EMPTY)::z => fits(w, z) | (i,m,CONS(x,y))::z => fits(w, (i,m,x)::(i,m,y)::z) | (i,m,TEXT s)::z => fits(w - String.size s, z) | (i,H,BREAK s)::z => fits(w - String.size s, z) | (i,A,BREAK s)::z => false | (i,m,BREAK s)::z => true | (i,m,BOX(V,x))::z => fits(w, (i,A,x)::z) | (i,m,BOX(n,x))::z => fits(w, (i,H,x)::z) | (i,m,NEST(j,x))::z => fits(w, (i,m,x)::z) | (i,m,BELOW x)::z => fits(w, (i,m,x)::z) (* Layout *) fun best(w, k, z, a) = case z of [] => List.rev a | (i,m,EMPTY)::z => best(w, k, z, a) | (i,m,CONS(x,y))::z => best(w, k, (i,m,x)::(i,m,y)::z, a) | (i,m,TEXT s)::z => best(w, k + String.size s, z, PTEXT(s)::a) | (i,H,BREAK s)::z => horizontal(w, k, s, z, a) | (i,V,BREAK s)::z => vertical(w, i, z, a) | (i,F,BREAK s)::z => if fits(w - k - String.size s, z) then horizontal(w, k, s, z, a) else vertical(w, i, z, a) | (i,A,BREAK s)::z => raise Fail "PrettyPrint.best" | (i,m,BOX(A,x))::z => if fits(w - k, (i,H,x)::z) then best(w, k, (i,H,x)::z, a) else best(w, k, (i,V,x)::z, a) | (i,m,BOX(n,x))::z => best(w, k, (i,n,x)::z, a) | (i,m,NEST(j,x))::z => best(w, k, (i+j,m,x)::z, a) | (i,m,BELOW x)::z => best(w, k, (k,m,x)::z, a) and horizontal(w, k, s, z, a) = best(w, k + String.size s, z, PTEXT(s)::a) and vertical(w, i, z, a) = best(w, i, z, PLINE(i)::a) fun layout(doc, w) = best(w, 0, [(0,V,doc)], []) (* Convert a document *) fun primToString(PTEXT s) = s | primToString(PLINE i) = String.implode(#"\n" :: List.tabulate(i, fn _ => #" ")) val toString = String.concat o List.map primToString o layout (* Output a document directly (is MUCH faster!) *) fun loop 0 f = () | loop n f = ( f() ; loop (n-1) f ) fun outputPrim os (PTEXT s) = TextIO.output(os, s) | outputPrim os (PLINE i) = ( TextIO.output1(os, #"\n") ; loop i (fn() => TextIO.output1(os, #" ")) ) fun output(os, doc, w) = List.app (outputPrim os) (layout(doc, w)) end (* stop of PrettyPrint.sml *) (* start of PP_MISC.sml *) (* * Standard ML miscellaneous pretty printing helpers *) signature PP_MISC = sig type doc = PrettyPrint.doc val nest: doc -> doc val paren: doc -> doc val brace: doc -> doc val brack: doc -> doc val ppCommaList: ('a -> doc) -> 'a list -> doc val ppStarList: ('a -> doc) -> 'a list -> doc val ppSeq: ('a -> doc) -> 'a list -> doc val ppSeqPrec: (int -> 'a -> doc) -> int -> 'a list -> doc end (* stop of PP_MISC.sml *) (* start of PPMisc.sml *) (* * Standard ML miscellaneous pretty printing helpers *) structure PPMisc :> PP_MISC = struct (* Import *) open PrettyPrint infixr ^^ (* Some PP combinators *) val nest = nest 2 fun paren doc = text "(" ^^ fbox(below doc) ^^ text ")" fun brace doc = text "{" ^^ fbox(below doc) ^^ text "}" fun brack doc = text "[" ^^ fbox(below doc) ^^ text "]" fun ppCommaList ppX [] = empty | ppCommaList ppX [x] = ppX x | ppCommaList ppX (x::xs) = ppX x ^^ text "," ^^ break ^^ ppCommaList ppX xs fun ppStarList ppX [] = empty | ppStarList ppX [x] = ppX x | ppStarList ppX (x::xs) = hbox(ppX x ^^ break ^^ text "*") ^^ break ^^ ppStarList ppX xs fun ppSeqPrec ppXPrec n [] = empty | ppSeqPrec ppXPrec n [x] = ppXPrec n x | ppSeqPrec ppXPrec n xs = paren(ppCommaList (ppXPrec 0) xs) fun ppSeq ppX = ppSeqPrec (fn _ => ppX) 0 end (* stop of PPMisc.sml *) (* start of PP_VAL.sml *) (* * Standard ML pretty printing of values *) signature PP_VAL = sig type doc = PrettyPrint.doc type 'a State = 'a State.State type 'a Val = 'a Val.Val type 'a ExVal = 'a Val.ExVal val ppVal: 'a State * 'a Val -> doc val ppExVal: 'a State * 'a ExVal -> doc end (* stop of PP_VAL.sml *) (* start of PPVal.sml *) (* * Standard ML pretty printing of values *) structure PPVal :> PP_VAL = struct (* Import *) type 'a State = 'a State.State open Val open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) val ppFn = text "" fun ppLab lab = text(Lab.toString lab) fun ppVId vid = text(VId.toString vid) fun ppExName en = text(ExName.toString en) fun ppSVal sv = text(SVal.toString sv) (* Values *) (* Precedence: * 0 : plain expressions * 1 : constructor arguments *) fun ppVal (s, v) = fbox(below(nest(ppValPrec (0, s) v))) and ppExVal(s, e) = fbox(below(nest(ppExValPrec (0, s) e))) and ppValPrec (p, s) (op:=) = ppFn | ppValPrec (p, s) (SVal sv) = ppSVal sv | ppValPrec (p, s) (BasVal b) = ppFn | ppValPrec (p, s) (VId vid) = ppVId vid | ppValPrec (p, s) (v as VIdVal(vid, v')) = let exception NotAList fun items(VId vid, vs) = if vid <> VId.fromString "nil" then raise NotAList else List.rev vs | items(VIdVal(vid, v), vs) = if vid <> VId.fromString "::" then raise NotAList else (case Val.unpair v of NONE => raise NotAList | SOME(v1, v2) => items(v2, v1::vs) ) | items(_, vs) = raise NotAList in let val vs = items(v, []) in brack(ppCommaList (ppValPrec (0, s)) vs) end handle NotAList => let val doc = ppVId vid ^/^ ppValPrec (1, s) v' in if p = 0 then doc else paren doc end end | ppValPrec (p, s) (ExVal e) = ppExValPrec (p, s) e | ppValPrec (p, s) (Record r) = let fun isTuple( [], n) = n > 2 | isTuple(lab::labs, n) = lab = Lab.fromInt n andalso isTuple(labs, n+1) val labvs = LabMap.listItemsi r val (labs,vs) = ListPair.unzip labvs in if List.null labs then text "()" else if isTuple(labs, 1) then paren(ppCommaList (ppValPrec (0, s)) vs) else brace(ppCommaList (ppLabVal s) labvs) end | ppValPrec (p, s) (Addr a) = let val v = case State.findAddr(s, a) of SOME v => v | NONE => raise Fail "PPVal.ppVal: invalid address" val doc = text "ref" ^/^ ppValPrec (1, s) v in if p = 0 then doc else paren doc end | ppValPrec (p, s) (FcnClosure _) = ppFn and ppLabVal s (lab, v) = abox( hbox( ppLab lab ^/^ text "=" ) ^^ below(nest(break ^^ ppVal(s, v) )) ) and ppExValPrec (p, s) (ExName en) = ppExName en | ppExValPrec (p, s) (ExNameVal(en, v)) = let val doc = ppExName en ^/^ ppValPrec (1, s) v in if p = 0 then doc else paren doc end end (* stop of PPVal.sml *) (* start of PP_DYNAMIC_ENV.sml *) (* * Standard ML pretty printing of the dynamic environment *) signature PP_DYNAMIC_ENV = sig type doc = PrettyPrint.doc type Env = DynamicEnv.Env type Str = DynamicEnv.Str type State = DynamicEnv.FcnClosure State.State val ppEnv: State * Env -> doc val ppStr: State * Str -> doc end (* stop of PP_DYNAMIC_ENV.sml *) (* start of PPDynamicEnv.sml *) (* * Standard ML pretty printing of the dynamic environment *) structure PPDynamicEnv :> PP_DYNAMIC_ENV = struct (* Import *) type Env = DynamicEnv.Env type Str = DynamicEnv.Str type State = DynamicEnv.FcnClosure State.State open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppStrId strid = text(StrId.toString strid) (* Environments *) fun ppValEnv(s, VE) = VIdMap.foldri (fn(vid, (v,IdStatus.v), doc) => abox( hbox( text "val" ^/^ ppVId vid ^/^ text "=" ) ^^ nest(break ^^ abox(PPVal.ppVal(s, v)) ) ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppExEnv VE = VIdMap.foldri (fn(vid, (v,IdStatus.e), doc) => hbox( text "exception" ^/^ ppVId vid ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppConEnv VE = VIdMap.foldli (fn(vid, (v,IdStatus.c), doc) => hbox( text "con" ^/^ ppVId vid ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppStrEnv(s, SE) = StrIdMap.foldri (fn(strid, S, doc) => abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text "=" ) ^^ nest(break ^^ ppStr(s, S) ) ) ^/^ doc ) empty SE and ppEnv(s, (SE,TE,VE)) = vbox( ppStrEnv(s, SE) ^/^ ppConEnv VE ^/^ ppExEnv VE ^/^ ppValEnv(s, VE) ) (* Structures *) and ppStr(s, DynamicEnv.Str E) = let val doc = ppEnv(s, E) in abox(below( text "struct" ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPDynamicEnv.sml *) (* start of PP_DYNAMIC_BASIS.sml *) (* * Standard ML pretty printing of the dynamic basis *) signature PP_DYNAMIC_BASIS = sig type doc = PrettyPrint.doc type Basis = DynamicBasis.Basis type State = DynamicEnv.FcnClosure State.State val ppBasis: State * Basis -> doc end (* stop of PP_DYNAMIC_BASIS.sml *) (* start of PPDynamicBasis.sml *) (* * Standard ML pretty printing of the dynamic basis *) structure PPDynamicBasis :> PP_DYNAMIC_BASIS = struct (* Import *) type Basis = DynamicBasis.Basis type State = DynamicEnv.FcnClosure State.State open PrettyPrint infixr ^^ ^/^ (* Simple objects *) fun ppFunId funid = text(FunId.toString funid) (* Environments *) fun ppFunEnv F = FunIdMap.foldri (fn(funid, _, doc) => hbox( text "functor" ^/^ ppFunId funid ) ^/^ doc ) empty F (* Basis *) fun ppBasis(s, (F,G,E)) = vbox( ppFunEnv F ^/^ PPDynamicEnv.ppEnv(s, E) ^/^ text "" ) end (* stop of PPDynamicBasis.sml *) (* start of CHECK_PATTERN.sml *) (* * Standard ML consistency of patterns and matches * * Definition, section 4.11 * * Note: * The requirement to check for irredundancy of matches is a `bug' in the * definition since this cannot be checked in general for two reasons: * * (1) There may be (hidden) aliasing of exception constructors. * Consequently, we only detect redundant exception constructors * if they are denoted by the same longvid. * * (2) There is no requirement of consistency for constructors in * sharing specifications or type realisations (actually, we * consider this a serious bug). For example, * datatype t1 = A | B * datatype t2 = C * sharing type t1 = t2 * is a legal specification. This allows a mix of the constructors * to appear in matches, rendering the terms of irredundancy and * exhaustiveness meaningless. We make no attempt to detect this, * so generated warnings may or may not make sense in that situation. *) signature CHECK_PATTERN = sig (* Import *) type Pat = GrammarCore.Pat type Match = GrammarCore.Match type Env = StaticEnv.Env (* Operations *) val checkPat: Env * Pat -> unit val checkMatch: Env * Match -> unit end (* stop of CHECK_PATTERN.sml *) (* start of CheckPattern.sml *) (* * Standard ML consistency of patterns and matches * * Definition, section 4.11 * * Note: * The requirement to check for irredundancy of matches is a `bug' in the * definition since this cannot be checked in general for two reasons: * * (1) There may be (hidden) aliasing of exception constructors. * Consequently, we only detect redundant exception constructors * if they are denoted by the same longvid. * * (2) There is no requirement of consistency for constructors in * sharing specifications or type realisations (actually, we * consider this a serious bug). For example, * datatype t1 = A | B * datatype t2 = C * sharing type t1 = t2 * is a legal specification. This allows a mix of the constructors * to appear in matches, rendering the terms of irredundancy and * exhaustiveness meaningless. We make no attempt to detect this, * so generated warnings may or may not make sense in that situation. * * Bugs: * All types of special constants are assumed to be infinite, so that * a match only gets exhaustive by placing a variable. This is a bit * inaccurate for char in particular where the programmer actually would * be able to write down the complete set of values. * The reason is that for special constants to be treated properly in * the presence of overloading we would require the (resolved) type * information. *) structure CheckPattern :> CHECK_PATTERN = struct (* Import *) type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type longVId = LongVId.longId type Pat = GrammarCore.Pat type Match = GrammarCore.Match type Env = StaticEnv.Env type SConSet = SConSet.set type VIdSet = VIdSet.set type LongVIdSet = LongVIdSet.set type 'a LabMap = 'a LabMap.map open GrammarCore (* * Algorithm has been derived from: * Peter Sestoft. * "ML pattern matching compilation and partial evaluation", * in: Dagstuhl Seminar on Partial Evaluation, * Lecture Notes in Computer Science, Springer-Verlag 1996 *) (* Value description *) datatype description = ANY | SCON of SCon | NOT_SCON of SConSet | EXCON of longVId * description option | NOT_EXCON of LongVIdSet | CON of VId * description option | NOT_CON of VIdSet | RECORD of description LabMap datatype context = EXCON' of longVId | CON' of VId | LAB' of Lab | RECORD' of description LabMap type knowledge = description * context list type continuations = PatRow option list * Match option (* Extending the context on partial success *) fun augment(EXCON'(longvid)::context, desc) = augment(context, EXCON(longvid, SOME desc)) | augment(CON'(vid)::context, desc) = augment(context, CON(vid, SOME desc)) | augment(LAB'(lab)::RECORD'(descs)::context, desc) = RECORD'(LabMap.insert(descs, lab, desc)) :: context | augment _ = raise Fail "CheckPattern.augment: invalid context" (* Building the description on failure *) fun build([], desc) = desc | build(EXCON'(longvid)::context, desc) = build(context, EXCON(longvid, SOME desc)) | build(CON'(vid)::context, desc) = build(context, CON(vid, SOME desc)) | build(LAB'(lab)::RECORD'(descs)::context, desc) = build(context, RECORD(LabMap.insert(descs, lab, desc))) | build _ = raise Fail "CheckPattern.build: invalid context" (* Result type for static matching *) structure RegionSet = FinSetFn(type ord_key = Source.region val compare = Source.compare) type result = RegionSet.set * bool val success = ( RegionSet.empty, true ) val failure = ( RegionSet.empty, false ) fun branch((P1, exhaustive1), (P2, exhaustive2)) = ( RegionSet.union(P1, P2), exhaustive1 andalso exhaustive2 ) fun reached(I, (P, exhaustive)) = ( RegionSet.add(P, I), exhaustive ) (* Static pattern matching *) fun matchMatch(E, desc, Match(_, mrule, match_opt)) = matchMrule(E, desc, mrule, match_opt) and matchMrule(E, desc, Mrule(I, pat, exp), match_opt) = reached(I, matchPat(E, (desc, []), pat, ([], match_opt))) and matchAtPat(E, know, atpat, cont) = case atpat of WILDCARDAtPat(_) => succeed(E, know, cont) | SCONAtPat(_, scon) => matchSCon(E, know, scon, cont) | LONGVIDAtPat(_, _, longvid) => (case StaticEnv.findLongVId(E, longvid) of NONE => succeed(E, know, cont) | SOME(sigma, IdStatus.v) => succeed(E, know, cont) | SOME(sigma, IdStatus.e) => matchExCon(E, know, longvid, NONE, cont) | SOME((_,tau), IdStatus.c) => let val vid = LongVId.toId longvid val span = TyName.span(Type.tyname(Type.range tau)) in matchCon(E, know, vid, span, NONE, cont) end ) | RECORDAtPat(_, patrow_opt) => matchRecord(E, know, patrow_opt, cont) | PARAtPat(_, pat) => matchPat(E, know, pat, cont) and matchPat(E, know, pat, cont) = case pat of ATPATPat(_, atpat) => matchAtPat(E, know, atpat, cont) | CONPat(_, _, longvid, atpat) => (case StaticEnv.findLongVId(E, longvid) of SOME(sigma, IdStatus.e) => matchExCon(E, know, longvid, SOME atpat, cont) | SOME((_,tau), IdStatus.c) => let val vid = LongVId.toId longvid val span = TyName.span(Type.tyname(Type.range tau)) in matchCon(E, know, vid, span, SOME atpat, cont) end | _ => raise Fail "CheckMatching.matchPat: \ \invalid constructed pattern" ) | TYPEDPat(_, pat, ty) => matchPat(E, know, pat, cont) | ASPat(_, _, vid, ty_opt, pat) => matchPat(E, know, pat, cont) and matchRecord(E, (desc, context), patrow_opt, cont) = let val descs = case desc of ANY => LabMap.empty | RECORD descs => descs | _ => raise Fail "CheckPattern.matchRecord: type error" in matchPatRowOpt(E, RECORD'(descs)::context, patrow_opt, cont) end and matchPatRowOpt(E, RECORD'(descs)::context, patrow_opt, cont as (patrow_opts, match_opt)) = (case patrow_opt of SOME(ROWPatRow(_, lab, pat, patrow_opt')) => let val desc' = case LabMap.find(descs, lab) of NONE => ANY | SOME desc' => desc' in matchPat(E, (desc', LAB'(lab)::RECORD'(descs)::context), pat, (patrow_opt'::patrow_opts, match_opt)) end | _ => succeed(E, (RECORD descs, context), cont) ) | matchPatRowOpt _ = raise Fail "CheckPattern.matchPatRowOpt: inconsistent context" and matchSCon(E, know as (desc, context), scon, cont) = let val knowSucc = (SCON scon, context) fun knowFail scons = (NOT_SCON(SConSet.add(scons, scon)), context) in case desc of ANY => branch(succeed(E, knowSucc, cont), fail(E, knowFail SConSet.empty, cont) ) | SCON scon' => if SCon.compare(scon, scon') = EQUAL then succeed(E, know, cont) else fail(E, know, cont) | NOT_SCON scons => if SConSet.member(scons, scon) then fail(E, know, cont) else branch(succeed(E, knowSucc, cont), fail(E, knowFail scons, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchExCon(E, know as (desc, context), longvid, atpat_opt, cont) = let val knowSucc = (EXCON(longvid, NONE), EXCON'(longvid)::context) fun knowFail longvids = (NOT_EXCON(LongVIdSet.add(longvids, longvid)), context) in case desc of ANY => branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail LongVIdSet.empty, cont) ) | EXCON(longvid', desc_opt) => if longvid = longvid' then matchArgOpt(E, knowSucc, desc_opt, atpat_opt, cont) else fail(E, know, cont) | NOT_EXCON longvids => if LongVIdSet.member(longvids, longvid) then fail(E, know, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail longvids, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchCon(E, know as (desc, context), vid, span, atpat_opt, cont) = let val knowSucc = (CON(vid, NONE), CON'(vid)::context) fun knowFail vids = (NOT_CON(VIdSet.add(vids, vid)), context) in case desc of ANY => if span = 1 then matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail VIdSet.empty, cont) ) | CON(vid', desc_opt) => if vid = vid' then matchArgOpt(E, knowSucc, desc_opt, atpat_opt, cont) else fail(E, know, cont) | NOT_CON vids => if VIdSet.member(vids, vid) then fail(E, know, cont) else if VIdSet.numItems vids = span - 1 then matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail vids, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchArgOpt(E, (desc, context), desc_opt, atpat_opt, cont) = case atpat_opt of NONE => succeed(E, (desc, List.tl context), cont) | SOME atpat => matchAtPat(E, (valOf desc_opt, context), atpat, cont) and succeed(E, know, ([], match_opt)) = success | succeed(E, (desc, context), (patrow_opt::patrow_opts, match_opt)) = let val context' = augment(context, desc) in matchPatRowOpt(E, context', patrow_opt, (patrow_opts, match_opt)) end and fail(E, know, (_, NONE)) = failure | fail(E, (desc, context), (_, SOME match)) = matchMatch(E, build(context, desc), match) (* Checking matches [Section 4.11, item 2] *) fun checkReachableMrule(reachables, Mrule(I, _, _)) = if RegionSet.member(reachables, I) then () else Error.warning(I, "redundant match rule") fun checkReachableMatchOpt(reachables, NONE) = () | checkReachableMatchOpt(reachables, SOME(Match(_, mrule, match_opt))) = ( checkReachableMrule(reachables, mrule) ; checkReachableMatchOpt(reachables, match_opt) ) fun checkMatch(E, match) = let val (reachables, exhaustive) = matchMatch(E, ANY, match) in checkReachableMatchOpt(reachables, SOME match) ; if exhaustive then () else Error.warning(infoMatch match, "match not exhaustive") end (* Checking single patterns [Section 4.11, item 3] *) fun checkPat(E, pat) = let val (_, exhaustive) = matchPat(E, (ANY, []), pat, ([], NONE)) in if exhaustive then () else Error.warning(infoPat pat, "pattern not exhaustive") end end (* stop of CheckPattern.sml *) (* start of ELAB_CORE.sml *) (* * Standard ML core elaboration * * Definition, sections 4.10, 4.11, 4.6, 4.7, 2.9 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 2.9] * and the further restrictions [Section 4.11]. * - To implement the 3rd restriction in 4.11 elabDec is passed an * additional boolean argument to recognise being on the toplevel. *) signature ELAB_CORE = sig (* Import types *) type Dec = GrammarCore.Dec type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type VId = VId.Id type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type Type = Type.Type type Env = StaticEnv.Env type Context = Context.Context (* Export *) val elabDec: bool * Context * Dec -> Env val elabTy: Context * Ty -> Type val tyvars: TyVarseq -> TyVarSet * TyVar list val validBindVId: VId -> bool val validConBindVId: VId -> bool end (* stop of ELAB_CORE.sml *) (* start of ElabCore.sml *) (* * Standard ML core elaboration * * Definition, sections 4.10, 4.11, 4.6, 4.7, 2.9 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 2.9] * and the further restrictions [Section 4.11]. * - To implement the 3rd restriction in 4.11 some elab functions are * passed an additional boolean argument to recognise being on the toplevel. * - There is a bug in the Definition -- an important syntactic restriction * is missing: * "Any tyvar occuring on the right side of a typbind or datbind of the * form tyvarseq tycon = ... must occur in tyvarseq." * - The definition says that overloaded types get defaulted if the * "surrounding text" does not resolve it. It leaves some freedom to * how large this context may be. We choose the innermost value binding. * - The definition states that "the program context" must determine the * exact type of flexible records, but it does not say how large this * context may be either. Again we choose the innermost surrounding value * binding. * - Most conditions on type names can be ignored since they are * always ensured by the Stamp mechanism. * * Bugs: * - Unresolved overloading is left unnoticed if it never propagates to a * value binding's result environment. To resolve all cases we either had * to annotate all expressions with their types and walk the whole tree * for each value binding's RHS, or extend the inference results with * complicated information on overloaded type variables, or use some dirty * side effect hack. * - The same goes for unresolved flexible record types, for essentially the * same reason. *) structure ElabCore :> ELAB_CORE = struct (* Import *) type Dec = GrammarCore.Dec type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type VId = VId.Id type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type Type = Type.Type type Env = StaticEnv.Env type Context = Context.Context open GrammarCore (* Some helpers for error messages *) val error = Error.error fun errorLab(I, s, lab) = error(I, s ^ Lab.toString lab) fun errorVId(I, s, vid) = error(I, s ^ VId.toString vid) fun errorTyCon(I, s, tycon) = error(I, s ^ TyCon.toString tycon) fun errorTyVar(I, s, tyvar) = error(I, s ^ TyVar.toString tyvar) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for context modification *) val plus = StaticEnv.plus val plusU = Context.plusU val plusVE = Context.plusVE val oplusE = Context.oplusE val oplusTE = Context.oplusTE val oplusVEandTE = Context.oplusVEandTE infix plusU plusVE oplusE oplusTE oplusVEandTE (* Checking restriction for vids in binding [Section 2.9, 5th bullet] *) fun validBindVId vid = vid <> VId.fromString "true" andalso vid <> VId.fromString "false" andalso vid <> VId.fromString "nil" andalso vid <> VId.fromString "::" andalso vid <> VId.fromString "ref" fun validConBindVId vid = validBindVId vid andalso vid <> VId.fromString "it" (* Treating tyvarseqs *) fun tyvars(TyVarseq(I, tyvars)) = let fun collect( [], U) = U | collect(tyvar::tyvars, U) = if TyVarSet.member(U, tyvar) then (* Syntactic restriction [Section 2.9, 3rd bullet] *) errorTyVar(I, "duplicate type variable ", tyvar) else collect(tyvars, TyVarSet.add(U, tyvar)) in ( collect(tyvars, TyVarSet.empty), tyvars ) end (* Typing special constants [Section 4.1, Appendix E.1] *) fun typeSCon(SCon.INT _) = Type.fromOverloadingClass InitialStaticEnv.Int | typeSCon(SCon.WORD _) = Type.fromOverloadingClass InitialStaticEnv.Word | typeSCon(SCon.CHAR _) = Type.fromOverloadingClass InitialStaticEnv.Char | typeSCon(SCon.REAL _) = Type.fromOverloadingClass InitialStaticEnv.Real | typeSCon(SCon.STRING _) = Type.fromOverloadingClass InitialStaticEnv.String (* Calculate sets of unguarded explicit type variables [Section 4.6] *) local val op+ = TyVarSet.union fun ? tyvarsX NONE = TyVarSet.empty | ? tyvarsX (SOME x) = tyvarsX x in fun unguardedTyVarsAtExp(RECORDAtExp(_, exprow_opt)) = ?unguardedTyVarsExpRow exprow_opt | unguardedTyVarsAtExp(LETAtExp(_, dec, exp)) = unguardedTyVarsDec dec + unguardedTyVarsExp exp | unguardedTyVarsAtExp(PARAtExp(_, exp)) = unguardedTyVarsExp exp | unguardedTyVarsAtExp _ = TyVarSet.empty and unguardedTyVarsExpRow(ExpRow(_, lab, exp, exprow_opt)) = unguardedTyVarsExp exp + ?unguardedTyVarsExpRow exprow_opt and unguardedTyVarsExp(ATEXPExp(_, atexp)) = unguardedTyVarsAtExp atexp | unguardedTyVarsExp(APPExp(_, exp, atexp)) = unguardedTyVarsExp exp + unguardedTyVarsAtExp atexp | unguardedTyVarsExp(TYPEDExp(_, exp, ty)) = unguardedTyVarsExp exp + unguardedTyVarsTy ty | unguardedTyVarsExp(HANDLEExp(_, exp, match)) = unguardedTyVarsExp exp + unguardedTyVarsMatch match | unguardedTyVarsExp(RAISEExp(_, exp)) = unguardedTyVarsExp exp | unguardedTyVarsExp(FNExp(_, match)) = unguardedTyVarsMatch match and unguardedTyVarsMatch(Match(_, mrule, match_opt)) = unguardedTyVarsMrule mrule + ?unguardedTyVarsMatch match_opt and unguardedTyVarsMrule(Mrule(_, pat, exp)) = unguardedTyVarsPat pat + unguardedTyVarsExp exp and unguardedTyVarsDec(ABSTYPEDec(_, datbind, dec)) = unguardedTyVarsDec dec | unguardedTyVarsDec(EXCEPTIONDec(_, exbind)) = unguardedTyVarsExBind exbind | unguardedTyVarsDec(LOCALDec(_, dec1, dec2)) = unguardedTyVarsDec dec1 + unguardedTyVarsDec dec2 | unguardedTyVarsDec(SEQDec(_, dec1, dec2)) = unguardedTyVarsDec dec1 + unguardedTyVarsDec dec2 | unguardedTyVarsDec _ = TyVarSet.empty and unguardedTyVarsValBind(PLAINValBind(_, pat, exp, valbind_opt)) = unguardedTyVarsPat pat + unguardedTyVarsExp exp + ?unguardedTyVarsValBind valbind_opt | unguardedTyVarsValBind(RECValBind(_, valbind)) = unguardedTyVarsValBind valbind and unguardedTyVarsExBind(NEWExBind(_, _, vid, ty_opt, exbind_opt)) = ?unguardedTyVarsTy ty_opt + ?unguardedTyVarsExBind exbind_opt | unguardedTyVarsExBind(EQUALExBind(_, _, vid, _, longvid, exbind_opt)) = ?unguardedTyVarsExBind exbind_opt and unguardedTyVarsAtPat(RECORDAtPat(_, patrow_opt)) = ?unguardedTyVarsPatRow patrow_opt | unguardedTyVarsAtPat(PARAtPat(_, pat)) = unguardedTyVarsPat pat | unguardedTyVarsAtPat _ = TyVarSet.empty and unguardedTyVarsPatRow(WILDCARDPatRow(_)) = TyVarSet.empty | unguardedTyVarsPatRow(ROWPatRow(_, lab, pat, patrow_opt)) = unguardedTyVarsPat pat + ?unguardedTyVarsPatRow patrow_opt and unguardedTyVarsPat(ATPATPat(_, atpat)) = unguardedTyVarsAtPat atpat | unguardedTyVarsPat(CONPat(_, _, longvid, atpat)) = unguardedTyVarsAtPat atpat | unguardedTyVarsPat(TYPEDPat(_, pat, ty)) = unguardedTyVarsPat pat + unguardedTyVarsTy ty | unguardedTyVarsPat(ASPat(_, _, vid, ty_opt, pat)) = ?unguardedTyVarsTy ty_opt + unguardedTyVarsPat pat and unguardedTyVarsTy(TYVARTy(_, tyvar)) = TyVarSet.singleton tyvar | unguardedTyVarsTy(RECORDTy(_, tyrow_opt)) = ?unguardedTyVarsTyRow tyrow_opt | unguardedTyVarsTy(TYCONTy(_, tyseq, longtycon)) = unguardedTyVarsTyseq tyseq | unguardedTyVarsTy(ARROWTy(_, ty, ty')) = unguardedTyVarsTy ty + unguardedTyVarsTy ty' | unguardedTyVarsTy(PARTy(_, ty)) = unguardedTyVarsTy ty and unguardedTyVarsTyRow(TyRow(_, lab, ty, tyrow_opt)) = unguardedTyVarsTy ty + ?unguardedTyVarsTyRow tyrow_opt and unguardedTyVarsTyseq(Tyseq(_, tys)) = List.foldl (fn(ty,U) => unguardedTyVarsTy ty + U) TyVarSet.empty tys end (* local *) (* Check whether a pattern binds an identifier *) local fun ? boundByX(NONE, vid) = false | ? boundByX(SOME x, vid) = boundByX(x, vid) in fun boundByAtPat(WILDCARDAtPat(_), vid) = false | boundByAtPat(SCONAtPat(_, scon), vid) = false | boundByAtPat(LONGVIDAtPat(_, _, longvid), vid) = let val (strids,vid') = LongVId.explode longvid in List.null strids andalso vid = vid' end | boundByAtPat(RECORDAtPat(_, patrow_opt), vid) = ?boundByPatRow(patrow_opt, vid) | boundByAtPat(PARAtPat(_, pat), vid) = boundByPat(pat, vid) and boundByPatRow(WILDCARDPatRow(_), vid) = false | boundByPatRow(ROWPatRow(_, lab, pat, patrow_opt), vid) = boundByPat(pat, vid) orelse ?boundByPatRow(patrow_opt, vid) and boundByPat(ATPATPat(_, atpat), vid) = boundByAtPat(atpat, vid) | boundByPat(CONPat(_, _, longvid, atpat), vid) = boundByAtPat(atpat, vid) | boundByPat(TYPEDPat(_, pat, ty), vid) = boundByPat(pat, vid) | boundByPat(ASPat(_, _, vid', ty_opt, pat), vid) = vid = vid' orelse boundByPat(pat, vid) end (* local *) (* Non-expansive expressions [Section 4.7] *) local fun ? isNonExpansiveX C NONE = true | ? isNonExpansiveX C (SOME x) = isNonExpansiveX C x in fun isNonExpansiveAtExp C (SCONAtExp(_, scon)) = true | isNonExpansiveAtExp C (LONGVIDAtExp(_, _, longvid)) = true | isNonExpansiveAtExp C (RECORDAtExp(_, exprow_opt)) = ?isNonExpansiveExpRow C exprow_opt | isNonExpansiveAtExp C (PARAtExp(_, exp)) = isNonExpansiveExp C exp | isNonExpansiveAtExp C _ = false and isNonExpansiveExpRow C (ExpRow(_, lab, exp, exprow_opt)) = isNonExpansiveExp C exp andalso ?isNonExpansiveExpRow C exprow_opt and isNonExpansiveExp C (ATEXPExp(_, atexp)) = isNonExpansiveAtExp C atexp | isNonExpansiveExp C (APPExp(_, exp, atexp)) = isConExp C exp andalso isNonExpansiveAtExp C atexp | isNonExpansiveExp C (TYPEDExp(_, exp, ty)) = isNonExpansiveExp C exp | isNonExpansiveExp C (FNExp(_, match)) = true | isNonExpansiveExp C _ = false and isConAtExp C (PARAtExp(_, exp)) = isConExp C exp | isConAtExp C (LONGVIDAtExp(_, _, longvid)) = LongVId.explode longvid <> ([],VId.fromString "ref") andalso (case Context.findLongVId(C, longvid) of SOME(_,is) => is=IdStatus.c orelse is=IdStatus.e | NONE => false ) | isConAtExp C _ = false and isConExp C (ATEXPExp(_, atexp)) = isConAtExp C atexp | isConExp C (TYPEDExp(_, ATEXPExp(_, atexp), ty)) = isConAtExp C atexp | isConExp C _ = false end (* local *) (* Closure of value environments [Section 4.8] *) fun hasNonExpansiveRHS C (vid, PLAINValBind(I, pat, exp, valbind_opt)) = if boundByPat(pat, vid) then isNonExpansiveExp C exp else hasNonExpansiveRHS C (vid, valOf valbind_opt) | hasNonExpansiveRHS C (vid, RECValBind _) = (* A rec valbind can only contain functions. *) true fun Clos (C,valbind) VE = let val tyvarsC = Context.tyvars C fun alphas(vid, tau) = if hasNonExpansiveRHS C (vid, valbind) then TyVarSet.listItems (TyVarSet.difference(Type.tyvars tau, tyvarsC)) else [] in VIdMap.mapi (fn(vid, ((_,tau),is)) => ((alphas(vid,tau),tau),is)) VE end (* Inference rules [Section 4.10] *) (* Atomic Expressions *) fun elabAtExp(C, SCONAtExp(I, scon)) = (* [Rule 1] *) typeSCon scon | elabAtExp(C, LONGVIDAtExp(I, _, longvid)) = (* [Rule 2] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "unknown identifier ",longvid) val tau = TypeScheme.instance sigma in tau end | elabAtExp(C, RECORDAtExp(I, exprow_opt)) = (* [Rule 3] *) let val rho = case exprow_opt of NONE => Type.emptyRho | SOME exprow => elabExpRow(C, exprow) in Type.fromRowType rho end | elabAtExp(C, LETAtExp(I, dec, exp)) = (* [Rule 4] *) let val E = elabDec(false, C, dec) val tau = elabExp(C oplusE E, exp) in if TyNameSet.isSubset(Type.tynames tau, Context.Tof C) then tau else error(I, "escaping local type name in let expression") end | elabAtExp(C, PARAtExp(I, exp)) = (* [Rule 5] *) let val tau = elabExp(C, exp) in tau end (* Expression Rows *) and elabExpRow(C, ExpRow(I, lab, exp, exprow_opt)) = (* [Rule 6] *) let val tau = elabExp(C, exp) val rho = case exprow_opt of NONE => Type.emptyRho | SOME exprow => elabExpRow(C, exprow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else Type.insertRho(rho, lab, tau) end (* Expressions *) and elabExp(C, ATEXPExp(I, atexp)) = (* [Rule 7] *) let val tau = elabAtExp(C, atexp) in tau end | elabExp(C, APPExp(I, exp, atexp)) = (* [Rule 8] *) let val tau1 = elabExp(C, exp) val tau' = elabAtExp(C, atexp) val tau = Type.invent() in Type.unify(tau1, Type.fromFunType(tau',tau)) handle Type.Unify => error(I, "type mismatch on application") ; tau end | elabExp(C, TYPEDExp(I, exp, ty)) = (* [Rule 9] *) let val tau1 = elabExp(C, exp) val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "expression does not match annotation") ; tau end | elabExp(C, HANDLEExp(I, exp, match)) = (* [Rule 10] *) let val tau1 = elabExp(C, exp) val tau2 = elabMatch(C, match) in Type.unify(tau1,tau2) handle Type.Unify => error(I, "type mismatch between expression and handler") ; tau1 end | elabExp(C, RAISEExp(I, exp)) = (* [Rule 11] *) let val tau1 = elabExp(C, exp) in Type.unify(tau1, InitialStaticEnv.tauExn) handle Type.Unify => error(I, "raised expression is not an exception") ; Type.invent() end | elabExp(C, FNExp(I, match)) = (* [Rule 12] *) let val tau = elabMatch(C, match) in (* Further restriction [Section 4.11, item 2] *) CheckPattern.checkMatch(Context.Eof C, match) ; tau end (* Matches *) and elabMatch(C, Match(I, mrule, match_opt)) = (* [Rule 13] *) let val tau = elabMrule(C, mrule) in case match_opt of NONE => tau | SOME match => let val tau2 = elabMatch(C, match) in Type.unify(tau, tau2) handle Type.Unify => error(I, "type mismatch between different matches") ; tau end end (* Match rules *) and elabMrule(C, Mrule(I, pat, exp)) = (* [Rule 14] *) let val (VE,tau) = elabPat(C, pat) val tau' = elabExp(C plusVE VE, exp) (* Side condition on type names is always ensured. *) in Type.fromFunType(tau,tau') end (* Declarations *) and elabDec(toplevel, C, VALDec(I, tyvarseq, valbind)) = (* [Rule 15] *) let val U' = #1(tyvars(tyvarseq)) (* Collect implicitly bound tyvars [Section 4.6] *) val U = TyVarSet.union(U', TyVarSet.difference(unguardedTyVarsValBind valbind, Context.Uof C)) val VE = elabValBind(toplevel, C plusU U, valbind) val VE' = Clos(C,valbind) VE val _ = StaticEnv.defaultOverloaded VE' in if not(TyVarSet.isEmpty( TyVarSet.intersection(Context.Uof C, U))) then (* Syntactic restriction [Section 2.9, last bullet] *) error(I, "some type variables shadow previous ones") else if StaticEnv.containsFlexibleType VE' then (* Further restriction [Section 4.11, item 1] *) error(I, "unresolved flexible record type") else if TyVarSet.isEmpty( TyVarSet.intersection(U, StaticEnv.tyvarsVE VE')) then StaticEnv.fromVE VE' else error(I, "some explicit type variables cannot be generalised") end | elabDec(toplevel, C, TYPEDec(I, typbind)) = (* [Rule 16] *) let val TE = elabTypBind(C, typbind) in StaticEnv.fromTE TE end | elabDec(toplevel, C, DATATYPEDec(I, datbind)) = (* [Rule 17] *) let val TE1 = lhsDatBind datbind val (VE2,TE2) = elabDatBind(C oplusTE TE1, datbind) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) (* Side condition on type names is always ensured. *) in StaticEnv.fromVEandTE(VE,TE) end | elabDec(toplevel, C, REPLICATIONDec(I, tycon, longtycon)) = (* [Rule 18] *) let val (theta,VE) = case Context.findLongTyCon(C, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type ", longtycon) val TE = TyConMap.singleton(tycon, (theta,VE)) in StaticEnv.fromVEandTE(VE,TE) end | elabDec(toplevel, C, ABSTYPEDec(I, datbind, dec)) = (* [Rule 19] *) let val TE1 = lhsDatBind datbind val (VE2,TE2) = elabDatBind(C oplusTE TE1, datbind) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) val E = elabDec(false, C oplusVEandTE (VE,TE), dec) (* Side condition on type names is always ensured. *) in StaticEnv.Abs(TE,E) end | elabDec(toplevel, C, EXCEPTIONDec(I, exbind)) = (* [Rule 20] *) let val VE = elabExBind(C, exbind) in StaticEnv.fromVE VE end | elabDec(toplevel, C, LOCALDec(I, dec1, dec2)) = (* [Rule 21] *) let val E1 = elabDec(false, C, dec1) val E2 = elabDec(false, C oplusE E1, dec2) in E2 end | elabDec(toplevel, C, OPENDec(I, longstrids)) = (* [Rule 22] *) let val Es = List.map (fn longstrid => case Context.findLongStrId(C, longstrid) of SOME(StaticEnv.Str E) => E | NONE => errorLongStrId(I, "unknown structure ", longstrid)) longstrids in List.foldl StaticEnv.plus StaticEnv.empty Es end | elabDec(toplevel, C, EMPTYDec(I)) = (* [Rule 23] *) StaticEnv.empty | elabDec(toplevel, C, SEQDec(I, dec1, dec2)) = (* [Rule 24] *) let val E1 = elabDec(toplevel, C, dec1) val E2 = elabDec(toplevel, C oplusE E1, dec2) in StaticEnv.plus(E1, E2) end (* Value Bindings *) and elabValBind(toplevel, C, PLAINValBind(I, pat, exp, valbind_opt)) = (* [Rule 25] *) let val (VE,tau1) = elabPat(C, pat) val tau2 = elabExp(C, exp) val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => elabValBind(toplevel, C, valbind) in Type.unify(tau1,tau2) handle Type.Unify => error(I, "type mismatch between pattern and expression") ; if toplevel then () else (* Further restriction [Section 4.11, item 3] *) CheckPattern.checkPat(Context.Eof C, pat) ; VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end | elabValBind(toplevel, C, RECValBind(I, valbind)) = (* [Rule 26] *) let val VE1 = lhsRecValBind valbind val VE = elabValBind(toplevel, C plusVE VE1, valbind) (* Side condition on type names is always ensured. *) in VE end (* Type Bindings *) and elabTypBind(C, TypBind(I, tyvarseq, tycon, ty, typbind_opt)) = (* [Rule 27] *) let val (U,alphas) = tyvars tyvarseq val tau = elabTy(C, ty) val TE = case typbind_opt of NONE => TyConMap.empty | SOME typbind => elabTypBind(C, typbind) in if not(TyVarSet.isSubset(Type.tyvars tau, U)) then (* Syntactic restriction (missing in the Definition!) *) error(I, "free type variables in type binding") else if isSome(TyConMap.find(TE, tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE, tycon, ((alphas,tau),VIdMap.empty)) end (* Datatype Bindings *) and elabDatBind(C, DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 28, part 2] *) let val (U,alphas) = tyvars tyvarseq val (alphas,tau) = case Context.findTyCon(C, tycon) of SOME(theta,VE) => theta | NONE => (* lhsDatBind inserted it! *) raise Fail "ElabCore.elabDatBind: \ \tycon not pre-bound" val VE = elabConBind(C,tau, conbind) val(VE',TE') = case datbind_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datbind => elabDatBind(C, datbind) (* Side condition on t is always true. *) val ClosVE = if TyVarSet.isSubset(StaticEnv.tyvarsVE VE, U) then StaticEnv.Clos VE else (* Syntactic restriction (missing in Definition!)*) error(I, "free type variables in datatype binding") in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else ( VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate data cnstructor ", vid)) (ClosVE,VE') , TyConMap.insert(TE', tycon, ((alphas,tau),ClosVE)) ) end (* Constructor Bindings *) and elabConBind(C,tau, ConBind(I, _, vid, ty_opt, conbind_opt)) = (* [Rule 29] *) let val tau1 = case ty_opt of NONE => tau | SOME ty => let val tau' = elabTy(C, ty) in Type.fromFunType(tau',tau) end val VE = case conbind_opt of NONE => VIdMap.empty | SOME conbind => elabConBind(C,tau, conbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate data constructor ", vid) else if not(validConBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.c)) end (* Exception Bindings *) and elabExBind(C, NEWExBind(I, _, vid, ty_opt, exbind_opt)) = (* [Rule 30] *) let val tau1 = case ty_opt of NONE => InitialStaticEnv.tauExn | SOME ty => let val tau = elabTy(C, ty) in Type.fromFunType(tau, InitialStaticEnv.tauExn) end val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => elabExBind(C, exbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else if not(validConBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.e)) end | elabExBind(C, EQUALExBind(I, _, vid, _, longvid, exbind_opt)) = (* [Rule 31] *) let val tau = case Context.findLongVId(C, longvid) of SOME(([],tau),IdStatus.e) => tau | SOME _ => errorLongVId(I, "non-exception identifier ", longvid) | NONE => errorLongVId(I, "unknown identifier ", longvid) val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => elabExBind(C, exbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else VIdMap.insert(VE, vid, (([],tau),IdStatus.e)) end (* Atomic Patterns *) and elabAtPat(C, WILDCARDAtPat(I)) = (* [Rule 32] *) ( VIdMap.empty, Type.invent() ) | elabAtPat(C, SCONAtPat(I, scon)) = (* [Rule 33] *) (case scon of SCon.REAL _ => (* Syntactic restriction [Section 2.9, 6th bullet] *) error(I, "real constant in pattern") | _ => ( VIdMap.empty, typeSCon scon ) ) | elabAtPat(C, LONGVIDAtPat(I, _, longvid)) = (* [Rule 34 and 35] *) let val (strids,vid) = LongVId.explode longvid in if List.null strids andalso ( case Context.findVId(C, vid) of NONE => true | SOME(sigma,is) => is = IdStatus.v ) then (* [Rule 34] *) let val tau = Type.invent() in ( VIdMap.singleton(vid, (([],tau),IdStatus.v)) , tau ) end else (* [Rule 35] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I,"unknown constructor ", longvid) val tau = TypeScheme.instance sigma (* Note that tau will always be a ConsType. *) in if is <> IdStatus.v then ( VIdMap.empty, tau ) else error(I, "non-constructor long identifier in pattern") end end | elabAtPat(C, RECORDAtPat(I, patrow_opt)) = (* [Rule 36] *) let val (VE,rho) = case patrow_opt of NONE => ( VIdMap.empty, Type.emptyRho ) | SOME patrow => elabPatRow(C, patrow) in (VE, Type.fromRowType rho) end | elabAtPat(C, PARAtPat(I, pat)) = (* [Rule 37] *) let val (VE,tau) = elabPat(C, pat) in (VE,tau) end (* Pattern Rows *) and elabPatRow(C, WILDCARDPatRow(I)) = (* [Rule 38] *) ( VIdMap.empty, Type.inventRho() ) | elabPatRow(C, ROWPatRow(I, lab, pat, patrow_opt)) = (* [Rule 39] *) let val (VE,tau) = elabPat(C, pat) val (VE',rho) = case patrow_opt of NONE => ( VIdMap.empty, Type.emptyRho ) | SOME patrow => elabPatRow(C, patrow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else ( VIdMap.unionWithi (fn(vid,_,_) => errorVId(I, "duplicate variable ", vid)) (VE,VE') , Type.insertRho(rho, lab, tau) ) end (* Patterns *) and elabPat(C, ATPATPat(I, atpat)) = (* [Rule 40] *) let val (VE,tau) = elabAtPat(C, atpat) in (VE,tau) end | elabPat(C, CONPat(I, _, longvid, atpat)) = (* [Rule 41] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "unknown constructor ", longvid) val _ = if is <> IdStatus.v then () else errorLongVId(I, "non-constructor ", longvid) val (tau',tau) = case !(TypeScheme.instance sigma) of Type.FunType(tau',tau) => (tau', tau) | _ => errorLongVId(I,"misplaced nullary constructor ", longvid) val (VE,tau'2) = elabAtPat(C, atpat) in Type.unify(tau',tau'2) handle Type.Unify => error(I, "type mismatch in constructor pattern") ; (VE,tau) end | elabPat(C, TYPEDPat(I, pat, ty)) = (* [Rule 42] *) let val (VE,tau1) = elabPat(C, pat) val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "pattern does not match annotation") ; (VE,tau) end | elabPat(C, ASPat(I, _, vid, ty_opt, pat)) = (* [Rule 43] *) let val (VE1,tau1) = elabPat(C, pat) val (VE, tau) = case ty_opt of NONE => (VE1,tau1) | SOME ty => let val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "pattern does not match annotation") ; (VE1,tau) end in if not( case Context.findVId(C, vid) of NONE => true | SOME(sigma,is) => is = IdStatus.v ) then errorVId(I, "misplaced constructor ", vid) else if isSome(VIdMap.find(VE, vid)) then errorVId(I, "duplicate variable ", vid) else ( VIdMap.insert(VE, vid, (([],tau),IdStatus.v)), tau ) end (* Type Expressions *) and elabTy(C, ty) = Type.normalise(elabTy'(C, ty)) and elabTy'(C, TYVARTy(I, tyvar)) = (* [Rule 44] *) let val alpha = tyvar in Type.fromTyVar alpha end | elabTy'(C, RECORDTy(I, tyrow_opt)) = (* [Rule 45] *) let val rho = case tyrow_opt of NONE => Type.emptyRho | SOME tyrow => elabTyRow'(C, tyrow) in Type.fromRowType rho end | elabTy'(C, TYCONTy(I, tyseq, longtycon)) = (* [Rule 46] *) let val Tyseq(I',tys) = tyseq val k = List.length tys val taus = List.map (fn ty => elabTy'(C, ty)) tys val (theta,VE) = case Context.findLongTyCon(C, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type constructor ", longtycon) in TypeFcn.apply(taus, theta) handle TypeFcn.Apply => errorLongTyCon(I, "arity mismatch at type application ", longtycon) end | elabTy'(C, ARROWTy(I, ty, ty')) = (* [Rule 47] *) let val tau = elabTy'(C, ty) val tau' = elabTy'(C, ty') in Type.fromFunType(tau,tau') end | elabTy'(C, PARTy(I, ty)) = (* [Rule 48] *) let val tau = elabTy'(C, ty) in tau end (* Type-expression Rows *) and elabTyRow'(C, TyRow(I, lab, ty, tyrow_opt)) = (* [Rule 49] *) let val tau = elabTy'(C, ty) val rho = case tyrow_opt of NONE => Type.emptyRho | SOME tyrow => elabTyRow'(C, tyrow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else Type.insertRho(rho, lab, tau) end (* Build tentative VE from LHSs of recursive valbind *) and lhsRecValBind(PLAINValBind(I, pat, exp, valbind_opt)) = let val VE = lhsRecValBindPat pat val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => lhsRecValBind valbind val _ = case exp of FNExp _ => () | _ => (* Syntactic restriction [Section 2.9, 4th bullet] *) error(I, "illegal expression within recursive \ \value binding") in VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end | lhsRecValBind(RECValBind(I, valbind)) = lhsRecValBind valbind and lhsRecValBindPat(ATPATPat(I, atpat)) = lhsRecValBindAtPat atpat | lhsRecValBindPat(CONPat(I, _, longvid, atpat)) = lhsRecValBindAtPat atpat | lhsRecValBindPat(TYPEDPat(I, pat, ty)) = lhsRecValBindPat pat | lhsRecValBindPat(ASPat(I, _, vid, ty_opt, pat)) = let val VE = lhsRecValBindPat pat in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid) else if not(validBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],Type.invent()), IdStatus.v)) end and lhsRecValBindAtPat(WILDCARDAtPat(I)) = VIdMap.empty | lhsRecValBindAtPat(SCONAtPat(I, scon)) = VIdMap.empty | lhsRecValBindAtPat(LONGVIDAtPat(I, _, longvid)) = (case LongVId.explode longvid of ([], vid) => if not(validBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.singleton(vid, (([],Type.invent()),IdStatus.v)) | _ => VIdMap.empty ) | lhsRecValBindAtPat(RECORDAtPat(I, patrow_opt)) = (case patrow_opt of NONE => VIdMap.empty | SOME patrow => lhsRecValBindPatRow patrow ) | lhsRecValBindAtPat(PARAtPat(I, pat)) = lhsRecValBindPat pat and lhsRecValBindPatRow(WILDCARDPatRow(I)) = VIdMap.empty | lhsRecValBindPatRow(ROWPatRow(I, lab, pat, patrow_opt)) = let val VE = lhsRecValBindPat pat in case patrow_opt of NONE => VE | SOME patrow => let val VE' = lhsRecValBindPatRow patrow in VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end end (* Build tentative TE from LHSs of datbind *) and lhsDatBind(DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 28, part 1] *) let val (U,alphas) = tyvars tyvarseq val k = List.length alphas val span = lhsConBind conbind val t = TyName.tyname(tycon, k, TyName.EQ, span) val tau = Type.fromConsType(List.map Type.fromTyVar alphas,t) val TE' = case datbind_opt of NONE => TyConMap.empty | SOME datbind => lhsDatBind datbind in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE', tycon, ((alphas,tau), VIdMap.empty)) end and lhsConBind(ConBind(I, _, vid, ty_opt, conbind_opt)) = case conbind_opt of NONE => 1 | SOME conbind => 1 + lhsConBind conbind end (* stop of ElabCore.sml *) (* start of ELAB_MODULE.sml *) (* * Standard ML modules elaboration * * Definition, sections 5.7 and 3.5 * * Note: * Elaboration also checks the syntactic restrictions [Section 3.5]. *) signature ELAB_MODULE = sig (* Import types *) type TopDec = GrammarModule.TopDec type Basis = StaticBasis.Basis (* Export *) val elabTopDec: Basis * TopDec -> Basis end (* stop of ELAB_MODULE.sml *) (* start of ElabModule.sml *) (* * Standard ML modules elaboration * * Definition, sections 5.7 and 3.5 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 3.5]. * - To implement the 3rd restriction in 4.11 some elab functions are * passed an additional boolean argument to recognise being on the toplevel. *) structure ElabModule :> ELAB_MODULE = struct (* Import *) type TopDec = GrammarModule.TopDec type Basis = StaticBasis.Basis open GrammarModule (* Helpers for error messages *) val error = Error.error fun errorVId (I, s, vid) = error(I, s ^ VId.toString vid) fun errorTyCon(I, s, tycon) = error(I, s ^ TyCon.toString tycon) fun errorStrId(I, s, strid) = error(I, s ^ StrId.toString strid) fun errorSigId(I, s, sigid) = error(I, s ^ SigId.toString sigid) fun errorFunId(I, s, funid) = error(I, s ^ FunId.toString funid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for basis modification *) val plus = StaticBasis.plus val plusT = StaticBasis.plusT val oplusSE = StaticBasis.oplusSE val oplusG = StaticBasis.oplusG val oplusF = StaticBasis.oplusF val oplusE = StaticBasis.oplusE infix plus plusT oplusG oplusF oplusE oplusSE (* Inference rules [Section 5.7] *) (* Structure Expressions *) fun elabStrExp(B, STRUCTStrExp(I, strdec)) = (* [Rule 50] *) let val E = elabStrDec(false, B, strdec) in E end | elabStrExp(B, LONGSTRIDStrExp(I, longstrid)) = (* [Rule 51] *) let val E = case StaticBasis.findLongStrId(B, longstrid) of SOME(StaticEnv.Str E) => E | NONE => errorLongStrId(I, "unknown structure ", longstrid) in E end | elabStrExp(B, TRANSStrExp(I, strexp, sigexp)) = (* [Rule 52] *) let val E = elabStrExp(B, strexp) val Sigma = elabSigExp(B, sigexp) val (E',_) = Sig.match(E, Sigma) handle Sig.Match => error(I, "structure does not match constraint") in E' end | elabStrExp(B, OPAQStrExp(I, strexp, sigexp)) = (* [Rule 53] *) let val E = elabStrExp(B, strexp) val (T',E') = Sig.rename(elabSigExp(B, sigexp)) val (E'',_) = Sig.match(E, (T',E')) handle Sig.Match => error(I, "structure does not match constraint") (* Renaming ensures side condition on T' *) in E' end | elabStrExp(B, APPStrExp(I, funid, strexp)) = (* [Rule 54] *) let val E = elabStrExp(B, strexp) val (T1'',(E1'',(T1',E1'))) = case StaticBasis.findFunId(B, funid) of SOME Phi => Phi | NONE => errorFunId(I, "unknown functor ", funid) val (E'',phi) = Sig.match(E, (T1'',E1'')) handle Sig.Match => error(I, "structure does not match constraint") val (T',E') = Sig.rename (T1', StaticEnv.realise phi E1') (* Renaming ensures side condition on T' *) in E' end | elabStrExp(B, LETStrExp(I, strdec, strexp)) = (* [Rule 55] *) let val E1 = elabStrDec(false, B, strdec) val E2 = elabStrExp(B oplusE E1, strexp) in E2 end (* Structure-level Declarations *) and elabStrDec(toplevel, B, DECStrDec(I, dec)) = (* [Rule 56] *) let val E = ElabCore.elabDec(toplevel, StaticBasis.Cof B, dec) in E end | elabStrDec(toplevel, B, STRUCTUREStrDec(I, strbind)) = (* [Rule 57] *) let val SE = elabStrBind(B, strbind) in StaticEnv.fromSE SE end | elabStrDec(toplevel, B, LOCALStrDec(I, strdec1, strdec2)) = (* [Rule 58] *) let val E1 = elabStrDec(false, B, strdec1) val E2 = elabStrDec(false, B oplusE E1, strdec2) in E2 end | elabStrDec(toplevel, B, EMPTYStrDec(I)) = (* [Rule 59] *) StaticEnv.empty | elabStrDec(toplevel, B, SEQStrDec(I, strdec1, strdec2)) = (* [Rule 60] *) let val E1 = elabStrDec(toplevel, B, strdec1) val E2 = elabStrDec(toplevel, B oplusE E1, strdec2) in StaticEnv.plus(E1,E2) end (* Structure Bindings *) and elabStrBind(B, StrBind(I, strid, strexp, strbind_opt)) = (* [Rule 61] *) let val E = elabStrExp(B, strexp) val SE = case strbind_opt of NONE => StrIdMap.empty | SOME strbind => elabStrBind(B plusT StaticEnv.tynames E, strbind) in if isSome(StrIdMap.find(SE, strid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorStrId(I, "duplicate structure identifier ", strid) else StrIdMap.insert(SE, strid, StaticEnv.Str E) end (* Signature Expressions *) and elabSigExpE(B, SIGSigExp(I, spec)) = (* [Rule 62] *) let val E = elabSpec(B, spec) in E end | elabSigExpE(B, SIGIDSigExp(I, sigid)) = (* [Rule 63] *) let val (T,E) = case StaticBasis.findSigId(B, sigid) of SOME Sigma => Sig.rename Sigma | NONE => errorSigId(I, "unknown signature ",sigid) in E end | elabSigExpE(B, WHERETYPESigExp(I, sigexp, tyvarseq, longtycon, ty)) = (* [Rule 64] *) let val E = elabSigExpE(B, sigexp) val alphas = #2(ElabCore.tyvars tyvarseq) val tau = ElabCore.elabTy(StaticBasis.Cof B, ty) val t = case StaticEnv.findLongTyCon(E,longtycon) of NONE => errorLongTyCon(I, "unknown type ", longtycon) | SOME(theta,VE) => case TypeFcn.toTyName theta of NONE => errorLongTyCon(I, "non-flexible type ", longtycon) | SOME t => t val _ = if not(TyNameSet.member(StaticBasis.Tof B, t)) then () else errorLongTyCon(I, "rigid type ", longtycon) val phi = TyNameMap.singleton(t, (alphas,tau)) val _ = if TyName.equality t = TyName.NOEQ orelse TypeFcn.admitsEquality (alphas,tau) then () else error(I, "type realisation does not respect equality") val E' = StaticEnv.realise phi E val _ = if StaticEnv.isWellFormed E' then () else error(I, "type realisation does not respect datatype") in E' end and elabSigExp(B, sigexp) = (* [Rule 65] *) let val E = elabSigExpE(B, sigexp) val T = TyNameSet.difference(StaticEnv.tynames E, StaticBasis.Tof B) in (T,E) end (* Signature Declarations *) and elabSigDec(B, SigDec(I, sigbind)) = (* [Rule 66] *) let val G = elabSigBind(B, sigbind) in G end (* Signature Bindings *) and elabSigBind(B, SigBind(I, sigid, sigexp, sigbind_opt)) = (* [Rule 67] *) let val Sigma = elabSigExp(B, sigexp) val G = case sigbind_opt of NONE => SigIdMap.empty | SOME sigbind => elabSigBind(B, sigbind) in if isSome(SigIdMap.find(G, sigid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorSigId(I, "duplicate signature identifier ", sigid) else SigIdMap.insert(G, sigid, Sigma) end (* Specifications *) and elabSpec(B, VALSpec(I, valdesc)) = (* [Rule 68] *) let val VE = elabValDesc(StaticBasis.Cof B, valdesc) in StaticEnv.fromVE(StaticEnv.Clos VE) end | elabSpec(B, TYPESpec(I, typdesc)) = (* [Rule 69] *) let val TE = elabTypDesc(StaticBasis.Cof B, typdesc) (* Side condition on type names is always ensured. *) in StaticEnv.fromTE TE end | elabSpec(B, EQTYPESpec(I, typdesc)) = (* [Rule 70] *) let val TE = elabTypDesc(StaticBasis.Cof B, typdesc) val _ = StaticEnv.makeEquality TE in StaticEnv.fromTE TE end | elabSpec(B, DATATYPESpec(I, datdesc)) = (* [Rule 71] *) let val TE1 = lhsDatDesc datdesc val (VE2,TE2) = elabDatDesc(Context.oplusTE(StaticBasis.Cof B,TE1), datdesc) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) (* Side condition on type names is always ensured. *) in StaticEnv.fromVEandTE(VE,TE) end | elabSpec(B, REPLICATIONSpec(I, tycon, longtycon)) = (* [Rule 72] *) let val (theta,VE) = case StaticBasis.findLongTyCon(B, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type ", longtycon) val TE = TyConMap.singleton(tycon, (theta,VE)) in StaticEnv.fromVEandTE(VE,TE) end | elabSpec(B, EXCEPTIONSpec(I, exdesc)) = (* [Rule 73] *) let val VE = elabExDesc(StaticBasis.Cof B, exdesc) in StaticEnv.fromVE VE end | elabSpec(B, STRUCTURESpec(I, strdesc)) = (* [Rule 74] *) let val SE = elabStrDesc(B, strdesc) in StaticEnv.fromSE SE end | elabSpec(B, INCLUDESpec(I, sigexp)) = (* [Rule 75] *) let val E = elabSigExpE(B, sigexp) in E end | elabSpec(B, EMPTYSpec(I)) = (* [Rule 76] *) StaticEnv.empty | elabSpec(B, SEQSpec(I, spec1, spec2)) = (* [Rule 77] *) let val E1 = elabSpec(B, spec1) val E2 = elabSpec(B oplusE E1, spec2) val _ = if StaticEnv.disjoint(E1,E2) then () else error(I, "duplicate specifications in signature") in StaticEnv.plus(E1,E2) end | elabSpec(B, SHARINGTYPESpec(I, spec, longtycons)) = (* [Rule 78] *) let val E = elabSpec(B, spec) val ts = List.map (fn longtycon => case StaticEnv.findLongTyCon(E, longtycon) of NONE => errorLongTyCon(I, "unknown type ", longtycon) | SOME(theta,VE) => case TypeFcn.toTyName theta of NONE => errorLongTyCon(I, "non-flexible type ", longtycon) | SOME t => if TyNameSet.member(StaticBasis.Tof B, t) then errorLongTyCon(I, "rigid type ", longtycon) else t ) longtycons val equality = if List.exists (fn t => TyName.equality t <> TyName.NOEQ) ts then TyName.EQ else TyName.NOEQ val span = List.foldl (fn(t, span) => Int.max(TyName.span t, span)) 0 ts val t1 = List.hd ts val t = TyName.tyname(TyName.tycon t1, TyName.arity t1, equality, span) val theta = TypeFcn.fromTyName t val phi = List.foldl (fn(ti, phi) => TyNameMap.insert(phi, ti, theta)) TyNameMap.empty ts in StaticEnv.realise phi E end | elabSpec(B, SHARINGSpec(I, spec, longstrids)) = (* [Appendix A] *) let fun shareFlexibleTyName(t1, t2, phi) = let val equality = if TyName.equality t1 <> TyName.NOEQ orelse TyName.equality t2 <> TyName.NOEQ then TyName.EQ else TyName.NOEQ val t = TyName.tyname(TyName.tycon t1, TyName.arity t1, equality, Int.max(TyName.span t1, TyName.span t2)) val theta = TypeFcn.fromTyName t in TyNameMap.insert(TyNameMap.insert(phi, t1, theta), t2, theta) end fun shareTE(TE1, TE2, phi) = TyConMap.foldli (fn(tycon, (theta1,VE1), phi) => case TyConMap.find(TE2, tycon) of NONE => phi | SOME(theta2,VE2) => case (TypeFcn.toTyName(TypeFcn.realise phi theta1), TypeFcn.toTyName(TypeFcn.realise phi theta2)) of (SOME t1, SOME t2) => if TyNameSet.member(StaticBasis.Tof B, t1) orelse TyNameSet.member(StaticBasis.Tof B,t2) then errorTyCon(I, "structure contains rigid type ", tycon) else shareFlexibleTyName(t1, t2, phi) | _ => errorTyCon(I, "structure contains non-flexible \ \type ", tycon) ) phi TE1 fun shareSE(SE1, SE2, phi) = StrIdMap.foldli (fn(strid, StaticEnv.Str E1, phi) => case StrIdMap.find(SE2, strid) of NONE => phi | SOME(StaticEnv.Str E2) => shareE(E1, E2, phi) ) phi SE1 and shareE((SE1,TE1,VE1), (SE2,TE2,VE2), phi) = let val phi' = shareTE(TE1, TE2, phi) val phi'' = shareSE(SE1, SE2, phi') in phi'' end fun share1(E1, [], phi) = phi | share1(E1, E2::Es, phi) = let val phi' = shareE(E1, E2, phi) in share1(E1, Es, phi') end fun shareAll( [], phi) = phi | shareAll(E::Es, phi) = let val phi' = share1(E, Es, phi) in shareAll(Es, phi') end val E = elabSpec(B, spec) val Es = List.map (fn longstrid => case StaticEnv.findLongStrId(E, longstrid) of SOME(StaticEnv.Str E') => E' | NONE => errorLongStrId(I, "unknown structure ", longstrid) ) longstrids val phi = shareAll(Es, TyNameMap.empty) in StaticEnv.realise phi E end (* Value Descriptions *) and elabValDesc(C, ValDesc(I, vid, ty, valdesc_opt)) = (* [Rule 79] *) let val tau = ElabCore.elabTy(C, ty) val VE = case valdesc_opt of NONE => VIdMap.empty | SOME valdesc => elabValDesc(C, valdesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate variable ", vid) else if not(ElabCore.validBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specification of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau),IdStatus.v)) end (* Type Descriptions *) and elabTypDesc(C, TypDesc(I, tyvarseq, tycon, typdesc_opt)) = (* [Rule 80] *) let val alphas = #2(ElabCore.tyvars tyvarseq) val k = List.length alphas val t = TyName.tyname(tycon, k, TyName.NOEQ, 0) val TE = case typdesc_opt of NONE => TyConMap.empty | SOME typdesc => elabTypDesc(C, typdesc) (* Side condition on t is always true. *) val tau = Type.fromConsType (List.map Type.fromTyVar alphas, t) in if isSome(TyConMap.find(TE, tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE, tycon, ((alphas,tau),VIdMap.empty)) end (* Datatype Descriptions *) and elabDatDesc(C, DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 81, part 2] *) let val (U,alphas) = ElabCore.tyvars tyvarseq val (alphas,tau) = case Context.findTyCon(C, tycon) of SOME(theta,VE) => theta | NONE => (* lhsDatDesc inserted it! *) raise Fail "ElabCore.elabDatDesc: \ \tycon not pre-bound" val VE = elabConDesc(C,tau, condesc) val(VE',TE') = case datdesc_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datdesc => elabDatDesc(C, datdesc) (* Side condition on t is always true. *) val ClosVE = if TyVarSet.isSubset(StaticEnv.tyvarsVE VE, U) then StaticEnv.Clos VE else (* Syntactic restriction [Section 3.5,4th bullet]*) error(I, "free type variables \ \in datatype description") in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else ( VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate data cnstructor ", vid)) (ClosVE,VE') , TyConMap.insert(TE', tycon, ((alphas,tau),ClosVE)) ) end (* Constructor Descriptions *) and elabConDesc(C,tau, ConDesc(I, vid, ty_opt, condesc_opt)) = (* [Rule 82] *) let val tau1 = case ty_opt of NONE => tau | SOME ty => let val tau' = ElabCore.elabTy(C, ty) in Type.fromFunType(tau',tau) end val VE = case condesc_opt of NONE => VIdMap.empty | SOME condesc => elabConDesc(C,tau, condesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate data constructor ", vid) else if not(ElabCore.validConBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specifiation of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.c)) end (* Exception Description *) and elabExDesc(C, ExDesc(I, vid, ty_opt, exdesc_opt)) = (* [Rule 83] *) let val tau1 = case ty_opt of NONE => InitialStaticEnv.tauExn | SOME ty => let val tau = ElabCore.elabTy(C, ty) val _ = if TyVarSet.isEmpty(Type.tyvars tau) then () else error(I, "free type variables \ \in exception description") in Type.fromFunType(tau, InitialStaticEnv.tauExn) end val VE = case exdesc_opt of NONE => VIdMap.empty | SOME exdesc => elabExDesc(C, exdesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else if not(ElabCore.validConBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specification of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.e)) end (* Structure Descriptions *) and elabStrDesc(B, StrDesc(I, strid, sigexp, strdesc_opt)) = (* [Rule 84] *) let val E = elabSigExpE(B, sigexp) val SE = case strdesc_opt of NONE => StrIdMap.empty | SOME strdesc => elabStrDesc(B plusT StaticEnv.tynames E, strdesc) in if isSome(StrIdMap.find(SE, strid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorStrId(I, "duplicate structure identifier ", strid) else StrIdMap.insert(SE, strid, StaticEnv.Str E) end (* Functor Declarations *) and elabFunDec(B, FunDec(I, funbind)) = (* [Rule 85] *) let val F = elabFunBind(B, funbind) in F end (* Functor Bindings *) and elabFunBind(B, FunBind(I, funid, strid, sigexp, strexp, funbind_opt)) = (* [Rule 86] *) let val (T,E) = elabSigExp(B, sigexp) val E' = elabStrExp( B oplusSE StrIdMap.singleton(strid,StaticEnv.Str E), strexp) (* Side condition on T is always ensured. *) val T' = TyNameSet.difference(StaticEnv.tynames E', TyNameSet.union(StaticBasis.Tof B, T)) val F = case funbind_opt of NONE => FunIdMap.empty | SOME funbind => elabFunBind(B, funbind) in if isSome(FunIdMap.find(F, funid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorFunId(I, "duplicate functor identifier ", funid) else FunIdMap.insert(F, funid, (T,(E,(T',E')))) end (* Top-level Declarations *) and elabTopDec(B, STRDECTopDec(I, strdec, topdec_opt)) = (* [Rule 87] *) let val E = elabStrDec(true, B, strdec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusE E, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandE(StaticEnv.tynames E, E), B') in if TyVarSet.isEmpty(StaticBasis.tyvars B'') then B'' else error(I, "free type variables on top-level") end | elabTopDec(B, SIGDECTopDec(I, sigdec, topdec_opt)) = (* [Rule 88] *) let val G = elabSigDec(B, sigdec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusG G, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandG(StaticBasis.tynamesG G, G), B') in B'' end | elabTopDec(B, FUNDECTopDec(I, fundec, topdec_opt)) = (* [Rule 89] *) let val F = elabFunDec(B, fundec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusF F, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandF(StaticBasis.tynamesF F, F), B') in if TyVarSet.isEmpty(StaticBasis.tyvars B'') then B'' else error(I, "free type variables on top-level") end (* Build tentative TE from LHSs of datdesc *) and lhsDatDesc(DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 81, part 1] *) let val (U,alphas) = ElabCore.tyvars tyvarseq val k = List.length alphas val span = lhsConDesc condesc val t = TyName.tyname(tycon, k, TyName.EQ, span) val tau = Type.fromConsType(List.map Type.fromTyVar alphas,t) val TE' = case datdesc_opt of NONE => TyConMap.empty | SOME datdesc => lhsDatDesc datdesc in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE', tycon, ((alphas,tau), VIdMap.empty)) end and lhsConDesc(ConDesc(I, vid, ty_opt, condesc_opt)) = case condesc_opt of NONE => 1 | SOME condesc => 1 + lhsConDesc condesc end (* stop of ElabModule.sml *) (* start of PP_TYPE.sml *) (* * Standard ML pretty printing of types and type schemes *) signature PP_TYPE = sig type doc = PrettyPrint.doc type Type = Type.Type type TypeScheme = TypeScheme.TypeScheme val ppType: Type -> doc val ppTypeScheme: TypeScheme -> doc end (* stop of PP_TYPE.sml *) (* start of PPType.sml *) (* * Standard ML pretty printing of types and type schemes *) structure PPType :> PP_TYPE = struct (* Import *) type TypeScheme = TypeScheme.TypeScheme open Type open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppLab lab = text(Lab.toString lab) fun ppTyVar alpha = text(TyVar.toString alpha) fun ppTyName t = text(TyName.toString t) fun ppOverloadingClass O = let val T = OverloadingClass.set O val t = OverloadingClass.default O val ts = t :: TyNameSet.listItems(TyNameSet.delete(T,t)) in brack(ppCommaList ppTyName ts) end fun ppRowVar CLOSEDRow = empty | ppRowVar(FLEXRow _) = text "," ^^ break ^^ text "..." (* Types *) (* Precedence: * 0 : function arrow (ty1 -> ty2) * 1 : tuple (ty1 * ... * tyn) * 2 : constructed type (tyseq tycon) *) fun ppType tau = fbox(below(nest(ppTypePrec 0 tau))) and ppTypePrec p (ref tau') = ppType'Prec p tau' and ppType'Prec p (TyVar(alpha)) = ppTyVar alpha | ppType'Prec p (RowType(Rho,r)) = let fun isTuple( [], n) = n > 2 | isTuple(lab::labs, n) = lab = Lab.fromInt n andalso isTuple(labs, n+1) val labtaus = LabMap.listItemsi Rho val (labs,taus) = ListPair.unzip labtaus in if r = CLOSEDRow andalso List.null labs then text "unit" else if r = CLOSEDRow andalso isTuple(labs, 1) then let val doc = ppStarList (ppTypePrec 2) taus in if p > 1 then paren doc else fbox(below(nest doc)) end else brace(ppCommaList ppLabType labtaus ^^ ppRowVar r) end | ppType'Prec p (FunType(tau1,tau2)) = let val doc = ppTypePrec 1 tau1 ^/^ text "->" ^/^ ppTypePrec 0 tau2 in if p > 0 then paren doc else doc end | ppType'Prec p (ConsType(taus,t)) = fbox(nest(ppSeqPrec ppTypePrec 2 taus ^/^ ppTyName t)) | ppType'Prec p (Overloaded(O)) = text "'" ^^ ppOverloadingClass O | ppType'Prec p (Link tau) = ppTypePrec p tau and ppLabType(lab, tau) = abox( hbox( ppLab lab ^/^ text ":" ) ^^ below(nest(break ^^ ppType tau )) ) (* Type schemes *) fun ppTypeScheme sigma = let val (alphas,tau) = TypeScheme.normalise sigma in ppType tau end end (* stop of PPType.sml *) (* start of PP_STATIC_ENV.sml *) (* * Standard ML pretty printing of the static environment *) signature PP_STATIC_ENV = sig type doc = PrettyPrint.doc type ValEnv = StaticEnv.ValEnv type TyEnv = StaticEnv.TyEnv type Env = StaticEnv.Env type TyNameSet = TyNameSet.set val ppEnv: Env -> doc val ppSig: TyNameSet * Env -> doc val ppTyEnv: TyNameSet * TyEnv -> doc val ppExEnv: ValEnv -> doc end (* stop of PP_STATIC_ENV.sml *) (* start of PPStaticEnv.sml *) (* * Standard ML pretty printing of the static environment *) structure PPStaticEnv :> PP_STATIC_ENV = struct (* Import *) type ValEnv = StaticEnv.ValEnv type TyEnv = StaticEnv.TyEnv type Env = StaticEnv.Env type TyNameSet = TyNameSet.set open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppTyCon tycon = text(TyCon.toString tycon) fun ppTyVar alpha = text(TyVar.toString alpha) fun ppStrId strid = text(StrId.toString strid) fun ppTyName t = text(TyName.toString t) (* Environments *) fun ppConTypeScheme (_, ref(Type.FunType(tau,_))) = text "of" ^^ break ^^ PPType.ppType tau | ppConTypeScheme _ = empty fun ppValEnv VE = VIdMap.foldri (fn(vid, (sigma,IdStatus.v), doc) => abox( hbox( text "val" ^/^ ppVId vid ^/^ text ":" ) ^^ nest(break ^^ abox(PPType.ppTypeScheme sigma) ) ) ^/^ doc | (vid, (sigma,_), doc) => doc ) empty VE fun ppExEnv VE = VIdMap.foldri (fn(vid, (sigma,IdStatus.e), doc) => abox( hbox( text "exception" ^/^ ppVId vid ) ^^ nest(break ^^ abox(ppConTypeScheme sigma) ) ) ^/^ doc | (vid, (sigma,_), doc) => doc ) empty VE fun ppConEnv VE = VIdMap.foldli (fn(vid, (sigma,_), doc) => doc ^/^ abox( hbox( (if isEmpty doc then empty else text "|") ^/^ ppVId vid ) ^^ nest(text "" ^/^ abox(ppConTypeScheme sigma) ) ) ) empty VE fun absTy(T, tycon, theta) = case TypeFcn.toTyName theta of NONE => NONE | SOME t => if TyName.tycon t = tycon andalso TyNameSet.member(T, t) then SOME(TyName.equality t <> TyName.NOEQ) else NONE fun ppAbsTyEnv(T,TE) = TyConMap.foldri (fn(tycon, (theta as (alphas,tau), VE), doc) => if VIdMap.isEmpty VE then case absTy(T, tycon, theta) of NONE => doc | SOME eq => abox( hbox( text(if eq then "eqtype" else "type") ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ) ) ^/^ doc else doc ) empty TE fun ppSynTyEnv(T,TE) = TyConMap.foldri (fn(tycon, (theta as (alphas,tau), VE), doc) => if VIdMap.isEmpty VE andalso not(isSome(absTy(T, tycon, theta))) then abox( hbox( text "type" ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ^/^ text "=" ) ^^ nest(break ^^ abox(PPType.ppType tau) ) ) ^/^ doc else doc ) empty TE fun ppDataTyEnv TE = TyConMap.foldri (fn(tycon, ((alphas,tau),VE), doc) => if VIdMap.isEmpty VE then doc else abox( hbox( text "datatype" ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ^/^ text "=" ) ^^ nest(break ^^ abox(ppConEnv VE) ) ) ^/^ doc ) empty TE fun ppTyEnv(T,TE) = vbox( ppAbsTyEnv(T,TE) ^/^ ppSynTyEnv(T,TE) ^/^ ppDataTyEnv TE ) fun ppStrEnv(T,SE) = StrIdMap.foldri (fn(strid, StaticEnv.Str E, doc) => abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text ":" ) ^^ nest(break ^^ ppSig (T,E) ) ) ^/^ doc ) empty SE and ppEnv'(T,(SE,TE,VE)) = vbox( ppStrEnv(T,SE) ^/^ ppTyEnv(T,TE) ^/^ ppExEnv VE ^/^ ppValEnv VE ) and ppEnv E = ppEnv'(TyNameSet.empty,E) (* Signatures *) and ppSig (T,E) = let val doc = ppEnv'(T, E) in abox(below( text "sig" ^^ brace(ppCommaList ppTyName (TyNameSet.listItems T)) ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPStaticEnv.sml *) (* start of PP_STATIC_BASIS.sml *) (* * Standard ML pretty printing of the static basis *) signature PP_STATIC_BASIS = sig type doc = PrettyPrint.doc type Basis = StaticBasis.Basis type SigEnv = StaticBasis.SigEnv type FunEnv = StaticBasis.FunEnv val ppBasis: Basis -> doc val ppSigEnv: SigEnv -> doc val ppFunEnv: FunEnv -> doc end (* stop of PP_STATIC_BASIS.sml *) (* start of PPStaticBasis.sml *) (* * Standard ML pretty printing of the static basis *) structure PPStaticBasis :> PP_STATIC_BASIS = struct (* Import *) type Basis = StaticBasis.Basis type SigEnv = StaticBasis.SigEnv type FunEnv = StaticBasis.FunEnv open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppSigId sigid = text(SigId.toString sigid) fun ppFunId funid = text(FunId.toString funid) (* Environments *) fun ppSigEnv G = SigIdMap.foldri (fn(sigid, Sigma, doc) => abox( hbox( text "signature" ^/^ ppSigId sigid ^/^ text "=" ) ^^ nest(break ^^ PPStaticEnv.ppSig Sigma ) ) ^/^ doc ) empty G fun ppFunEnv F = FunIdMap.foldri (fn(funid, (T,(E,Sigma)), doc) => abox( hbox( text "functor" ^/^ ppFunId funid ) ^^ nest(ebreak ^^ abox( hbox( text "(" ^^ text "Arg" ^/^ text ":" ) ^^ nest(break ^^ PPStaticEnv.ppSig(T,E) ) ^^ ebreak ^^ hbox( text ")" ^/^ text ":" ) ) ^/^ PPStaticEnv.ppSig Sigma ) ) ^/^ doc ) empty F (* Basis *) fun ppBasis (T,F,G,E) = vbox( ppSigEnv G ^/^ ppFunEnv F ^/^ PPStaticEnv.ppEnv E ^/^ text "" ) end (* stop of PPStaticBasis.sml *) (* start of PP_ENV.sml *) (* * Standard ML pretty printing of the combined static/dynamic environment *) signature PP_ENV = sig type doc = PrettyPrint.doc type Env = StaticEnv.Env * DynamicEnv.Env type State = PPDynamicEnv.State val ppEnv: State * Env -> doc end (* stop of PP_ENV.sml *) (* start of PPEnv.sml *) (* * Standard ML pretty printing of the combined static/dynamic environment *) structure PPEnv :> PP_ENV = struct (* Import *) type Env = StaticEnv.Env * DynamicEnv.Env type State = PPDynamicEnv.State open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppStrId strid = text(StrId.toString strid) (* Environments *) fun ppValEnv(s, (VE_STAT,VE_DYN)) = VIdMap.foldri (fn(vid, (sigma,IdStatus.v), doc) => let val (v,is) = valOf(VIdMap.find(VE_DYN, vid)) in fbox( hbox( text "val" ^/^ ppVId vid ) ^^ nest(break ^^ text "=" ^/^ below(abox(PPVal.ppVal(s, v))) ^/^ text ":" ^/^ below(abox(PPType.ppTypeScheme sigma)) ) ) ^/^ doc end | (vid, (sigma,_), doc) => doc ) empty VE_STAT fun ppStrEnv(s, T, (SE_STAT,SE_DYN)) = StrIdMap.foldri (fn(strid, StaticEnv.Str E_STAT, doc) => let val DynamicEnv.Str E_DYN = valOf(StrIdMap.find(SE_DYN, strid)) in abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text "=" ) ^^ nest(break ^^ ppStr (s, T, (E_STAT,E_DYN)) ) ) ^/^ doc end ) empty SE_STAT and ppEnv'(s, T, ((SE_STAT,TE_STAT,VE_STAT), (SE_DYN, TE_DYN, VE_DYN))) = vbox( ppStrEnv(s, T, (SE_STAT,SE_DYN)) ^/^ PPStaticEnv.ppTyEnv(T,TE_STAT) ^/^ PPStaticEnv.ppExEnv VE_STAT ^/^ ppValEnv(s, (VE_STAT,VE_DYN)) ) and ppEnv(s, E) = ppEnv'(s, TyNameSet.empty, E) (* Structures *) and ppStr(s, T, E) = let val doc = ppEnv'(s, T, E) in abox(below( text "struct" ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPEnv.sml *) (* start of PP_BASIS.sml *) (* * Standard ML pretty printing of the combined basis *) signature PP_BASIS = sig type doc = PrettyPrint.doc type Basis = Basis.Basis type State = PPEnv.State val ppBasis: State * Basis -> doc end (* stop of PP_BASIS.sml *) (* start of PPBasis.sml *) (* * Standard ML pretty printing of the combined basis *) structure PPBasis :> PP_BASIS = struct (* Import *) type Basis = Basis.Basis type State = PPEnv.State open PrettyPrint infixr ^^ ^/^ (* Basis *) fun ppBasis (s, ((T,F_STAT,G_STAT,E_STAT), (F_DYN,G_DYN,E_DYN))) = vbox( PPStaticBasis.ppSigEnv G_STAT ^/^ PPStaticBasis.ppFunEnv F_STAT ^/^ PPEnv.ppEnv(s, (E_STAT,E_DYN)) ^/^ text "" ) end (* stop of PPBasis.sml *) (* start of PROGRAM.sml *) (* * Standard ML programs * * Definition, section 8 * * Note: * State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * of modules and core can be avoided. Note that the state therefore * never is returned. *) signature PROGRAM = sig (* Import types *) type Program = GrammarProgram.Program type StaticBasis = StaticBasis.Basis type DynamicBasis = DynamicBasis.Basis type Basis = Basis.Basis type State = EvalModule.State (* Export *) val execProgram: State ref * Basis * Program -> Basis val elabProgram: StaticBasis * Program -> StaticBasis val evalProgram: State ref * DynamicBasis * Program -> DynamicBasis end (* stop of PROGRAM.sml *) (* start of Program.sml *) (* * Standard ML programs * * Definition, section 8 * * Note: * State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * of modules and core can be avoided. Note that the state therefore * never is returned. *) structure Program :> PROGRAM = struct (* Import *) type StaticBasis = StaticBasis.Basis type DynamicBasis = DynamicBasis.Basis type Basis = Basis.Basis type State = EvalModule.State open GrammarProgram (* Helpers for output *) val width = 79 fun printException(s, e) = ( TextIO.output(TextIO.stdOut, "Uncaught exception: ") ; PrettyPrint.output(TextIO.stdOut, PPVal.ppExVal(s, e), width) ; TextIO.output1(TextIO.stdOut, #"\n") ; TextIO.flushOut TextIO.stdOut ) fun printStaticBasis B_STAT = ( PrettyPrint.output(TextIO.stdOut, PPStaticBasis.ppBasis B_STAT, width) ; TextIO.flushOut TextIO.stdOut ) fun printDynamicBasis(s, B_DYN) = ( PrettyPrint.output(TextIO.stdOut, PPDynamicBasis.ppBasis(s, B_DYN), width) ; TextIO.flushOut TextIO.stdOut ) fun printBasis(s, B) = ( PrettyPrint.output(TextIO.stdOut, PPBasis.ppBasis(s, B), width) ; TextIO.flushOut TextIO.stdOut ) (* Helpers for basis modification *) val oplus = Basis.oplus infix oplus (* Inference rules [Section 8] *) fun execProgram(s,B, Program(I, topdec, program_opt)) = (* [Rules 187 to 189] *) let val B_STAT1 = ElabModule.elabTopDec(Basis.B_STATof B, topdec) val B_DYN1 = EvalModule.evalTopDec(s,Basis.B_DYNof B, topdec) (* [Rule 189] *) val _ = printBasis(!s, (B_STAT1,B_DYN1)) val B' = B oplus (B_STAT1,B_DYN1) val B'' = case program_opt of NONE => B' | SOME program => execProgram(s,B', program) in B'' end handle Error.Error m => (* [Rule 187] *) let val B' = case program_opt of NONE => B | SOME program => execProgram(s,B, program) in B' end | Pack.Pack e => (* [Rule 188] *) let val _ = printException(!s, e) val B' = case program_opt of NONE => B | SOME program => execProgram(s,B, program) in B' end (* Elaboration only *) fun elabProgram(B_STAT, Program(I, topdec, program_opt)) = let val B_STAT1 = ElabModule.elabTopDec(B_STAT, topdec) val _ = printStaticBasis B_STAT1 val B_STAT' = StaticBasis.plus(B_STAT, B_STAT1) val B_STAT'' = case program_opt of NONE => B_STAT' | SOME program => elabProgram(B_STAT', program) in B_STAT'' end handle Error.Error m => B_STAT (* Evaluation only *) fun evalProgram(s,B_DYN, Program(I, topdec, program_opt)) = let val B_DYN1 = EvalModule.evalTopDec(s,B_DYN, topdec) val _ = printDynamicBasis(!s, B_DYN1) val B_DYN' = DynamicBasis.plus(B_DYN, B_DYN1) val B_DYN'' = case program_opt of NONE => B_DYN' | SOME program => evalProgram(s,B_DYN', program) in B_DYN'' end handle Error.Error m => (* Runtime error *) let val B_DYN' = case program_opt of NONE => B_DYN | SOME program => evalProgram(s,B_DYN, program) in B_DYN' end | Pack.Pack e => let val _ = printException(!s, e) val B_DYN' = case program_opt of NONE => B_DYN | SOME program => evalProgram(s,B_DYN, program) in B_DYN' end end (* stop of Program.sml *) (* start of ml-yacc/lib/base.sig *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* base.sig: Base signature file for SML-Yacc. This file contains signatures that must be loaded before any of the files produced by ML-Yacc are loaded *) (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'xa stream val streamify : (unit -> '_a) -> '_a stream val cons : '_a * '_a stream -> '_a stream val get : '_a stream -> '_a * '_a stream end (* LR_TABLE: signature for an LR Table. The list of actions and gotos passed to mkLrTable must be ordered by state number. The values for state 0 are the first in the list, the values for state 1 are next, etc. *) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature revealing the internal structure of a token. This signature TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc. The {parser name}_TOKENS structures contain some types and functions to construct tokens from values and positions. The representation of token was very carefully chosen here to allow the polymorphic parser to work without knowing the types of semantic values or line numbers. This has had an impact on the TOKENS structure produced by SML-Yacc, which is a structure parameter to lexer functors. We would like to have some type 'a token which functions to construct tokens would create. A constructor function for a integer token might be INT: int * 'a * 'a -> 'a token. This is not possible because we need to have tokens with the representation given below for the polymorphic parser. Thus our constructur functions for tokens have the form: INT: int * 'a * 'a -> (svalue,'a) token This in turn has had an impact on the signature that lexers for SML-Yacc must match and the types that a user must declare in the user declarations section of lexers. *) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse : {table : LrTable.table, lexer : ('_b,'_c) Token.token Stream.stream, arg: 'arg, saction : int * '_c * (LrTable.state * ('_b * '_c * '_c)) list * 'arg -> LrTable.nonterm * ('_b * '_c * '_c) * ((LrTable.state *('_b * '_c * '_c)) list), void : '_b, ec : { is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_change : (LrTable.term list * LrTable.term list) list, errtermvalue : LrTable.term -> '_b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * '_c * '_c -> unit }, lookahead : int (* max amount of lookahead used in *) (* error correction *) } -> '_b * (('_b,'_c) Token.token Stream.stream) end (* LEXER: a signature that most lexers produced for use with SML-Yacc's output will match. The user is responsible for declaring type token, type pos, and type svalue in the UserDeclarations section of a lexer. Note that type token is abstract in the lexer. This allows SML-Yacc to create a TOKENS signature for use with lexers produced by ML-Lex that treats the type token abstractly. Lexers that are functors parametrized by a Tokens structure matching a TOKENS signature cannot examine the structure of tokens. *) signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun produced by SML-Yacc. All such structures match this signature. The {parser name}LrValsFun produces a structure which contains all the values except for the lexer needed to call the polymorphic parser mentioned before. *) signature PARSER_DATA = sig (* the type of line numbers *) type pos (* the type of semantic values *) type svalue (* the type of the user-supplied argument to the parser *) type arg (* the intended type of the result of the parser. This value is produced by applying extract from the structure Actions to the final semantic value resultiing from a parse. *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable (* structure Actions contains the functions which mantain the semantic values stack in the parser. Void is used to provide a default value for the semantic stack. *) structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg-> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_change : (LrTable.term list * LrTable.term list) list val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end (* signature PARSER is the signature that most user parsers created by SML-Yacc will match. *) signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError (* type pos is the type of line numbers *) type pos (* type result is the type of the result from the parser *) type result (* the type of the user-supplied argument to the parser *) type arg (* type svalue is the type of semantic values for the semantic value stack *) type svalue (* val makeLexer is used to create a stream of tokens for the parser *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream (* val parse takes a stream of tokens and a function to print errors and returns a value of type result and a stream containing the unused tokens *) val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* signature ARG_PARSER is the signature that will be matched by parsers whose lexer takes an additional argument. *) signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* stop of ml-yacc/lib/base.sig *) (* start of ml-yacc/lib/join.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* functor Join creates a user parser by putting together a Lexer structure, an LrValues structure, and a polymorphic parser structure. Note that the Lexer and LrValues structure must share the type pos (i.e. the type of line numbers), the type svalues for semantic values, and the type of tokens. *) functor Join(structure Lex : LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = LrParser.Stream.streamify o Lex.makeLexer val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end (* functor JoinWithArg creates a variant of the parser structure produced above. In this case, the makeLexer take an additional argument before yielding a value of type unit -> (svalue,pos) token *) functor JoinWithArg(structure Lex : ARG_LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : ARG_PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type lexarg = Lex.UserDeclarations.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = fn s => fn arg => LrParser.Stream.streamify (Lex.makeLexer s arg) val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end; (* stop of ml-yacc/lib/join.sml *) (* start of ml-yacc/lib/lrtable.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) structure LrTable : LR_TABLE = struct open Array List infix 9 sub datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype term = T of int datatype nonterm = NT of int datatype state = STATE of int datatype action = SHIFT of state | REDUCE of int (* rulenum from grammar *) | ACCEPT | ERROR exception Goto of state * nonterm type table = {states: int, rules : int,initialState: state, action: ((term,action) pairlist * action) array, goto : (nonterm,state) pairlist array} val numStates = fn ({states,...} : table) => states val numRules = fn ({rules,...} : table) => rules val describeActions = fn ({action,...} : table) => fn (STATE s) => action sub s val describeGoto = fn ({goto,...} : table) => fn (STATE s) => goto sub s fun findTerm (T term,row,default) = let fun find (PAIR (T key,data,r)) = if key < term then find r else if key=term then data else default | find EMPTY = default in find row end fun findNonterm (NT nt,row) = let fun find (PAIR (NT key,data,r)) = if key < nt then find r else if key=nt then SOME data else NONE | find EMPTY = NONE in find row end val action = fn ({action,...} : table) => fn (STATE state,term) => let val (row,default) = action sub state in findTerm(term,row,default) end val goto = fn ({goto,...} : table) => fn (a as (STATE state,nonterm)) => case findNonterm(nonterm,goto sub state) of SOME state => state | NONE => raise (Goto a) val initialState = fn ({initialState,...} : table) => initialState val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} => ({action=actions,goto=gotos, states=numStates, rules=numRules, initialState=initialState} : table) end; (* stop of ml-yacc/lib/lrtable.sml *) (* start of ml-yacc/lib/stream.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* Stream: a structure implementing a lazy stream. The signature STREAM is found in base.sig *) structure Stream :> STREAM = struct datatype 'a str = EVAL of 'a * 'a str ref | UNEVAL of (unit->'a) type 'a stream = 'a str ref fun get(ref(EVAL t)) = t | get(s as ref(UNEVAL f)) = let val t = (f(), ref(UNEVAL f)) in s := EVAL t; t end fun streamify f = ref(UNEVAL f) fun cons(a,s) = ref(EVAL(a,s)) end; (* stop of ml-yacc/lib/stream.sml *) (* start of ml-yacc/lib/parser2.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser.sml: This is a parser driver for LR tables with an error-recovery routine added to it. The routine used is described in detail in this article: 'A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery', by M. Burke and G. Fisher, ACM Transactions on Programming Langauges and Systems, Vol. 9, No. 2, April 1987, pp. 164-197. This program is an implementation is the partial, deferred method discussed in the article. The algorithm and data structures used in the program are described below. This program assumes that all semantic actions are delayed. A semantic action should produce a function from unit -> value instead of producing the normal value. The parser returns the semantic value on the top of the stack when accept is encountered. The user can deconstruct this value and apply the unit -> value function in it to get the answer. It also assumes that the lexer is a lazy stream. Data Structures: ---------------- * The parser: The state stack has the type (state * (semantic value * line # * line #)) list The parser keeps a queue of (state stack * lexer pair). A lexer pair consists of a terminal * value pair and a lexer. This allows the parser to reconstruct the states for terminals to the left of a syntax error, and attempt to make error corrections there. The queue consists of a pair of lists (x,y). New additions to the queue are cons'ed onto y. The first element of x is the top of the queue. If x is nil, then y is reversed and used in place of x. Algorithm: ---------- * The steady-state parser: This parser keeps the length of the queue of state stacks at a steady state by always removing an element from the front when another element is placed on the end. It has these arguments: stack: current stack queue: value of the queue lexPair ((terminal,value),lex stream) When SHIFT is encountered, the state to shift to and the value are are pushed onto the state stack. The state stack and lexPair are placed on the queue. The front element of the queue is removed. When REDUCTION is encountered, the rule is applied to the current stack to yield a triple (nonterm,value,new stack). A new stack is formed by adding (goto(top state of stack,nonterm),value) to the stack. When ACCEPT is encountered, the top value from the stack and the lexer are returned. When an ERROR is encountered, fixError is called. FixError takes the arguments to the parser, fixes the error if possible and returns a new set of arguments. * The distance-parser: This parser includes an additional argument distance. It pushes elements on the queue until it has parsed distance tokens, or an ACCEPT or ERROR occurs. It returns a stack, lexer, the number of tokens left unparsed, a queue, and an action option. *) signature FIFO = sig type 'a queue val empty : 'a queue exception Empty val get : 'a queue -> 'a * 'a queue val put : 'a * 'a queue -> 'a queue end (* drt (12/15/89) -- the functor should be used in development work, but it wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct structure LrTable = LrTable structure Stream = Stream structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => t=t' end open LrTable open Token val DEBUG1 = false val DEBUG2 = false exception ParseError exception ParseImpossible of int structure Fifo :> FIFO = struct type 'a queue = ('a list * 'a list) val empty = (nil,nil) exception Empty fun get(a::x, y) = (a, (x,y)) | get(nil, nil) = raise Empty | get(nil, y) = get(rev y, nil) fun put(a,(x,y)) = (x,a::y) end type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list type ('a,'b) lexv = ('a,'b) token type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream) type ('a,'b) distanceParse = ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int -> ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int * action option type ('a,'b) ecRecord = {is_keyword : term -> bool, preferred_change : (term list * term list) list, error : string * 'b * 'b -> unit, errtermvalue : term -> 'a, terms : term list, showTerminal : term -> string, noShift : term -> bool} local val print = fn s => TextIO.output(TextIO.stdOut,s) val println = fn s => (print s; print "\n") val showState = fn (STATE s) => "STATE " ^ (Int.toString s) in fun printStack(stack: ('a,'b) stack, n: int) = case stack of (state,_) :: rest => (print("\t" ^ Int.toString n ^ ": "); println(showState state); printStack(rest, n+1)) | nil => () fun prAction showTerminal (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT state => println ("SHIFT " ^ (showState state)) | REDUCE i => println ("REDUCE " ^ (Int.toString i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT") | prAction _ (_,_,action) = () end (* ssParse: parser which maintains the queue of (state * lexvalues) in a steady-state. It takes a table, showTerminal function, saction function, and fixError function. It parses until an ACCEPT is encountered, or an exception is raised. When an error is encountered, fixError is called with the arguments of parseStep (lexv,stack,and queue). It returns the lexv, and a new stack and queue adjusted so that the lexv can be parsed *) val ssParse = fn (table,showTerminal,saction,fixError,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(args as (lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue)) = let val nextAction = action (state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair), queue)) in parseStep(newLexPair,(s,value)::stack,newQueue) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue) | _ => raise (ParseImpossible 197)) | ERROR => parseStep(fixError args) | ACCEPT => (case stack of (_,(topvalue,_,_)) :: _ => let val (token,restLexer) = lexPair in (topvalue,Stream.cons(token,restLexer)) end | _ => raise (ParseImpossible 202)) end | parseStep _ = raise (ParseImpossible 204) in parseStep end (* distanceParse: parse until n tokens are shifted, or accept or error are encountered. Takes a table, showTerminal function, and semantic action function. Returns a parser which takes a lexPair (lex result * lexer), a state stack, a queue, and a distance (must be > 0) to parse. The parser returns a new lex-value, a stack with the nth token shifted on top, a queue, a distance, and action option. *) val distanceParse = fn (table,showTerminal,saction,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE) | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue,distance) = let val nextAction = action(state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer in parseStep(newLexPair,(s,value)::stack, Fifo.put((newStack,newLexPair),queue),distance-1) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue,distance) | _ => raise (ParseImpossible 240)) | ERROR => (lexPair,stack,queue,distance,SOME nextAction) | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction) end | parseStep _ = raise (ParseImpossible 242) in parseStep : ('_a,'_b) distanceParse end (* mkFixError: function to create fixError function which adjusts parser state so that parse may continue in the presence of an error *) fun mkFixError({is_keyword,terms,errtermvalue, preferred_change,noShift, showTerminal,error,...} : ('_a,'_b) ecRecord, distanceParse : ('_a,'_b) distanceParse, minAdvance,maxAdvance) (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) = let val _ = if DEBUG2 then error("syntax error found at " ^ (showTerminal term), leftPos,leftPos) else () fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p)) val minDelta = 3 (* pull all the state * lexv elements from the queue *) val stateList = let fun f q = let val (elem,newQueue) = Fifo.get q in elem :: (f newQueue) end handle Fifo.Empty => nil in f queue end (* now number elements of stateList, giving distance from error token *) val (_, numStateList) = List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList (* Represent the set of potential changes as a linked list. Values of datatype Change hold information about a potential change. oper = oper to be applied pos = the # of the element in stateList that would be altered. distance = the number of tokens beyond the error token which the change allows us to parse. new = new terminal * value pair at that point orig = original terminal * value pair at the point being changed. *) datatype ('a,'b) change = CHANGE of {pos : int, distance : int, leftPos: 'b, rightPos: 'b, new : ('a,'b) lexv list, orig : ('a,'b) lexv list} val showTerms = concat o map (fn TOKEN(t,_) => " " ^ showTerminal t) val printChange = fn c => let val CHANGE {distance,new,orig,pos,...} = c in (print ("{distance= " ^ (Int.toString distance)); print (",orig ="); print(showTerms orig); print (",new ="); print(showTerms new); print (",pos= " ^ (Int.toString pos)); print "}\n") end val printChangeList = app printChange (* parse: given a lexPair, a stack, and the distance from the error token, return the distance past the error token that we are able to parse.*) fun parse (lexPair,stack,queuePos : int) = case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1) of (_,_,_,distance,SOME ACCEPT) => if maxAdvance-distance-1 >= 0 then maxAdvance else maxAdvance-distance-1 | (_,_,_,distance,_) => maxAdvance - distance - 1 (* catList: concatenate results of scanning list *) fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new then minDelta else 0 fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} = let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new val distance = parse(lex',stack,pos+length new-length orig) in if distance >= minAdvance + keywordsDelta new then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos, distance=distance,orig=orig,new=new}] else [] end (* tryDelete: Try to delete n terminals. Return single-element [success] or nil. Do not delete unshiftable terminals. *) fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) = let fun del(0,accum,left,right,lexPair) = tryChange{lex=lexPair,stack=stack, pos=qPos,leftPos=left,rightPos=right, orig=rev accum, new=[]} | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) = if noShift term then [] else del(n-1,tok::accum,left,r,Stream.get lexer) in del(n,[],l,r,lexPair) end (* tryInsert: try to insert tokens before the current terminal; return a list of the successes *) fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) = catList terms (fn t => tryChange{lex=lexPair,stack=stack, pos=queuePos,orig=[],new=[tokAt(t,l)], leftPos=l,rightPos=l}) (* trySubst: try to substitute tokens for the current terminal; return a list of the successes *) fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)), queuePos) = if noShift term then [] else catList terms (fn t => tryChange{lex=Stream.get lexer,stack=stack, pos=queuePos, leftPos=l,rightPos=r,orig=[orig], new=[tokAt(t,r)]}) (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair". If it succeeds, returns SOME(toks',l,r,lp), where toks' is the actual tokens (with positions and values) deleted, (l,r) are the (leftmost,rightmost) position of toks', lp is what remains of the stream after deletion *) fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp) | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then SOME([tok],l,r,Stream.get lp') else NONE | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then case do_delete(rest,Stream.get lp') of SOME(deleted,l',r',lp'') => SOME(tok::deleted,l,r',lp'') | NONE => NONE else NONE fun tryPreferred((stack,lexPair),queuePos) = catList preferred_change (fn (delete,insert) => if List.exists noShift delete then [] (* should give warning at parser-generation time *) else case do_delete(delete,lexPair) of SOME(deleted,l,r,lp) => tryChange{lex=lp,stack=stack,pos=queuePos, leftPos=l,rightPos=r,orig=deleted, new=map (fn t=>(tokAt(t,r))) insert} | NONE => []) val changes = catList numStateList tryPreferred @ catList numStateList tryInsert @ catList numStateList trySubst @ catList numStateList (tryDelete 1) @ catList numStateList (tryDelete 2) @ catList numStateList (tryDelete 3) val findMaxDist = fn l => foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l (* maxDist: max distance past error taken that we could parse *) val maxDist = findMaxDist changes (* remove changes which did not parse maxDist tokens past the error token *) val changes = catList changes (fn(c as CHANGE{distance,...}) => if distance=maxDist then [c] else []) in case changes of (l as change :: _) => let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) = let val s = case (orig,new) of (_::_,[]) => "deleting " ^ (showTerms orig) | ([],_::_) => "inserting " ^ (showTerms new) | _ => "replacing " ^ (showTerms orig) ^ " with " ^ (showTerms new) in error ("syntax error: " ^ s,leftPos,rightPos) end val _ = (if length l > 1 andalso DEBUG2 then (print "multiple fixes possible; could fix it by:\n"; app print_msg l; print "chosen correction:\n") else (); print_msg change) (* findNth: find nth queue entry from the error entry. Returns the Nth queue entry and the portion of the queue from the beginning to the nth-1 entry. The error entry is at the end of the queue. Examples: queue = a b c d e findNth 0 = (e,a b c d) findNth 1 = (d,a b c) *) val findNth = fn n => let fun f (h::t,0) = (h,rev t) | f (h::t,n) = f(t,n-1) | f (nil,_) = let exception FindNth in raise FindNth end in f (rev stateList,n) end val CHANGE {pos,orig,new,...} = change val (last,queueFront) = findNth pos val (stack,lexPair) = last val lp1 = foldl(fn (_,(_,r)) => Stream.get r) lexPair orig val lp2 = foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new val restQueue = Fifo.put((stack,lp2), foldl Fifo.put Fifo.empty queueFront) val (lexPair,stack,queue,_,_) = distanceParse(lp2,stack,restQueue,pos) in (lexPair,stack,queue) end | nil => (error("syntax error found at " ^ (showTerminal term), leftPos,leftPos); raise ParseError) end val parse = fn {arg,table,lexer,saction,void,lookahead, ec=ec as {showTerminal,...} : ('_a,'_b) ecRecord} => let val distance = 15 (* defer distance tokens *) val minAdvance = 1 (* must parse at least 1 token past error *) val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *) val lexPair = Stream.get lexer val (TOKEN (_,(_,leftPos,_)),_) = lexPair val startStack = [(initialState table,(void,leftPos,leftPos))] val startQueue = Fifo.put((startStack,lexPair),Fifo.empty) val distanceParse = distanceParse(table,showTerminal,saction,arg) val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance) val ssParse = ssParse(table,showTerminal,saction,fixError,arg) fun loop (lexPair,stack,queue,_,SOME ACCEPT) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,distance,SOME ERROR) = let val (lexPair,stack,queue) = fixError(lexPair,stack,queue) in loop (distanceParse(lexPair,stack,queue,distance)) end | loop _ = let exception ParseInternal in raise ParseInternal end in loop (distanceParse(lexPair,startStack,startQueue,distance)) end end; (* stop of ml-yacc/lib/parser2.sml *) (* start of DERIVED_FORMS_CORE.sml *) (* * Standard ML core derived forms * * Definition, Section 2.7 and appendix A * * Note: * Two phrases named Fmatch and Fmrule have been added to factorize FvalBind. *) signature DERIVED_FORMS_CORE = sig (* Import *) type Info = GrammarCore.Info type Lab = GrammarCore.Lab type VId = GrammarCore.VId type Op = GrammarCore.Op type AtExp = GrammarCore.AtExp type AppExp = GrammarCore.AtExp list type InfExp = GrammarCore.Exp type Exp = GrammarCore.Exp type Match = GrammarCore.Match type Mrule = GrammarCore.Mrule type Dec = GrammarCore.Dec type ValBind = GrammarCore.ValBind type FvalBind = GrammarCore.ValBind type Fmatch = GrammarCore.Match * VId * int type Fmrule = GrammarCore.Mrule * VId * int type TypBind = GrammarCore.TypBind type DatBind = GrammarCore.DatBind type AtPat = GrammarCore.AtPat type PatRow = GrammarCore.PatRow type Pat = GrammarCore.Pat type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq (* Expressions [Figure 15] *) val UNITAtExp: Info -> AtExp val TUPLEAtExp: Info * Exp list -> AtExp val HASHAtExp: Info * Lab -> AtExp val CASEExp: Info * Exp * Match -> Exp val IFExp: Info * Exp * Exp * Exp -> Exp val ANDALSOExp: Info * Exp * Exp -> Exp val ORELSEExp: Info * Exp * Exp -> Exp val SEQAtExp: Info * Exp list -> AtExp val LETAtExp: Info * Dec * Exp list -> AtExp val WHILEExp: Info * Exp * Exp -> Exp val LISTAtExp: Info * Exp list -> AtExp (* Patterns [Figure 16] *) val UNITAtPat: Info -> AtPat val TUPLEAtPat: Info * Pat list -> AtPat val LISTAtPat: Info * Pat list -> AtPat val VIDPatRow: Info * VId * Ty option * Pat option * PatRow option -> PatRow (* Types [Figure 16] *) val TUPLETy: Info * Ty list -> Ty (* Function-value bindings [Figure 17] *) val FvalBind: Info * Fmatch * FvalBind option -> FvalBind val Fmatch: Info * Fmrule * Fmatch option -> Fmatch val Fmrule: Info * Op * VId * AtPat list * Ty option * Exp -> Fmrule (* Declarations [Figure 17] *) val FUNDec: Info * TyVarseq * FvalBind -> Dec val DATATYPEDec: Info * DatBind * TypBind option -> Dec val ABSTYPEDec: Info * DatBind * TypBind option * Dec -> Dec end (* stop of DERIVED_FORMS_CORE.sml *) (* start of DerivedFormsCore.sml *) (* * Standard ML core derived forms * * Definition, Section 2.7 and appendix A * * Notes: * - Two phrases named Fmatch and Fmrule have been added to factorize FvalBind. * - In Fvalbinds we do not enforce that all optional type annotations are * syntactically identical (as the Definition enforces, although this seems * to be a mistake). * - The Definition is somewhat inaccurate about the derived forms of Exp * [Definition, Appendix A, Figure 15] in that most forms are actually AtExp * derived forms, as can be seen from the full grammar [Definition, * Appendix B, Figure 20]. To achieve consistency, the equivalent forms must * be put in parentheses in some cases. * - The same goes for pattern derived forms [Definition, Appendix A, Figure 16; * Appendix B, Figure 22]. *) structure DerivedFormsCore :> DERIVED_FORMS_CORE = struct (* Import *) structure C = GrammarCore type Info = C.Info type Lab = C.Lab type VId = C.VId type Op = C.Op type AtExp = C.AtExp type AppExp = C.AtExp list type InfExp = C.Exp type Exp = C.Exp type Match = C.Match type Mrule = C.Mrule type Dec = C.Dec type ValBind = C.ValBind type FvalBind = C.ValBind type Fmatch = C.Match * C.VId * int type Fmrule = C.Mrule * C.VId * int type TypBind = C.TypBind type DatBind = C.DatBind type AtPat = C.AtPat type PatRow = C.PatRow type Pat = C.Pat type Ty = C.Ty type TyVarseq = C.TyVarseq (* Some helpers *) val vidFALSE = VId.fromString "false" val vidTRUE = VId.fromString "true" val vidNIL = VId.fromString "nil" val vidCONS = VId.fromString "::" val longvidCONS = LongVId.fromId vidCONS fun LONGVIDExp(I, longvid) = C.ATEXPExp(I, C.LONGVIDAtExp(I, C.SANSOp, longvid)) fun LONGVIDPat(I, longvid) = C.ATPATPat(I, C.LONGVIDAtPat(I, C.SANSOp, longvid)) fun VIDExp(I, vid) = LONGVIDExp(I, LongVId.fromId vid) fun VIDPat(I, vid) = LONGVIDPat(I, LongVId.fromId vid) fun FALSEExp(I) = VIDExp(I, vidFALSE) fun TRUEExp(I) = VIDExp(I, vidTRUE) fun NILExp(I) = VIDExp(I, vidNIL) fun CONSExp(I) = VIDExp(I, vidCONS) fun FALSEPat(I) = VIDPat(I, vidFALSE) fun TRUEPat(I) = VIDPat(I, vidTRUE) fun NILPat(I) = VIDPat(I, vidNIL) (* Rewriting of withtype declarations [Appendix A, 2nd bullet] *) fun lookupTyCon(tycon, C.TypBind(_, tyvarseq, tycon', ty, typbind_opt)) = if tycon' = tycon then (tyvarseq, ty) else lookupTyCon(tycon, Option.valOf typbind_opt) (* may raise Option *) fun replaceTy (C.TyVarseq(_,tyvars), C.Tyseq(i',tys)) (C.TYVARTy(i,tyvar)) = let fun loop(tyvar'::tyvars', ty'::tys') = if tyvar' = tyvar then ty' else loop(tyvars', tys') | loop([],_) = Error.error(i, "unbound type variable") | loop(_,[]) = Error.error(i', "type sequence has wrong arity") in loop(tyvars, tys) end | replaceTy tyvarseq_tyseq (C.RECORDTy(I, tyrow_opt)) = C.RECORDTy(I, Option.map (replaceTyRow tyvarseq_tyseq) tyrow_opt) | replaceTy tyvarseq_tyseq (C.TYCONTy(I, tyseq', tycon)) = C.TYCONTy(I, replaceTyseq tyvarseq_tyseq tyseq', tycon) | replaceTy tyvarseq_tyseq (C.ARROWTy(I, ty1, ty2)) = C.ARROWTy(I, replaceTy tyvarseq_tyseq ty1, replaceTy tyvarseq_tyseq ty2) | replaceTy tyvarseq_tyseq (C.PARTy(I, ty)) = C.PARTy(I, replaceTy tyvarseq_tyseq ty) and replaceTyRow tyvarseq_tyseq (C.TyRow(I, lab, ty, tyrow_opt)) = C.TyRow(I, lab, replaceTy tyvarseq_tyseq ty, Option.map (replaceTyRow tyvarseq_tyseq) tyrow_opt) and replaceTyseq tyvarseq_tyseq (C.Tyseq(I, tys)) = C.Tyseq(I, List.map (replaceTy tyvarseq_tyseq) tys) fun rewriteTy typbind (ty as C.TYVARTy _) = ty | rewriteTy typbind (C.RECORDTy(I, tyrow_opt)) = C.RECORDTy(I, Option.map (rewriteTyRow typbind) tyrow_opt) | rewriteTy typbind (C.TYCONTy(I, tyseq, longtycon)) = let val tyseq' = rewriteTyseq typbind tyseq val (strids, tycon) = LongTyCon.explode longtycon in if not(List.null strids) then C.TYCONTy(I, tyseq', longtycon) else let val (tyvarseq', ty') = lookupTyCon(tycon, typbind) in replaceTy (tyvarseq',tyseq') ty' end handle Option => C.TYCONTy(I, tyseq', longtycon) end | rewriteTy typbind (C.ARROWTy(I, ty1, ty2)) = C.ARROWTy(I, rewriteTy typbind ty1, rewriteTy typbind ty2) | rewriteTy typbind (C.PARTy(I, ty)) = C.PARTy(I, rewriteTy typbind ty) and rewriteTyRow typbind (C.TyRow(I, lab, ty, tyrow_opt)) = C.TyRow(I, lab, rewriteTy typbind ty, Option.map (rewriteTyRow typbind) tyrow_opt) and rewriteTyseq typbind (C.Tyseq(I, tys)) = C.Tyseq(I, List.map (rewriteTy typbind) tys) fun rewriteConBind typbind (C.ConBind(I, op_opt, vid, ty_opt, conbind_opt))= C.ConBind(I, op_opt, vid, Option.map (rewriteTy typbind) ty_opt, Option.map (rewriteConBind typbind) conbind_opt) fun rewriteDatBind typbind (C.DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = C.DatBind(I, tyvarseq, tycon, rewriteConBind typbind conbind, Option.map (rewriteDatBind typbind) datbind_opt) (* Patterns [Figure 16] *) fun UNITAtPat(I) = C.RECORDAtPat(I, NONE) fun TUPLEAtPat(I, [pat]) = C.PARAtPat(I, pat) | TUPLEAtPat(I, pats) = let fun toPatRow(n, [] ) = NONE | toPatRow(n, pat::pats') = SOME(C.ROWPatRow(I, Lab.fromInt n, pat, toPatRow(n+1,pats'))) in C.RECORDAtPat(I, toPatRow(1, pats)) end fun LISTAtPat(I, pats) = let fun toPatList [] = NILPat(I) | toPatList(pat::pats') = C.CONPat(I, C.SANSOp, longvidCONS, TUPLEAtPat(I, [pat,toPatList pats'])) in C.PARAtPat(I, toPatList pats) end (* Pattern Rows [Figure 16] *) fun VIDPatRow(I, vid, ty_opt, pat_opt, patrow_opt) = let val lab = Lab.fromString(VId.toString vid) val vidPat = VIDPat(I, vid) val pat = case (ty_opt, pat_opt) of (NONE, NONE) => vidPat | (SOME ty, NONE) => C.TYPEDPat(I, vidPat, ty) | ( _ , SOME pat) => C.ASPat(I, C.SANSOp,vid,ty_opt,pat) in C.ROWPatRow(I, lab, pat, patrow_opt) end (* Expressions [Figure 15] *) fun UNITAtExp(I) = C.RECORDAtExp(I, NONE) fun TUPLEAtExp(I, [exp]) = C.PARAtExp(I, exp) | TUPLEAtExp(I, exps) = let fun toExpRow(n, [] ) = NONE | toExpRow(n, exp::exps') = SOME(C.ExpRow(I, Lab.fromInt n, exp, toExpRow(n+1, exps'))) in C.RECORDAtExp(I, toExpRow(1, exps)) end fun HASHAtExp(I, lab) = let val vid = VId.invent() val dots = C.WILDCARDPatRow(I) val patrow = C.ROWPatRow(I, lab, VIDPat(I, vid), SOME dots) val pat = C.ATPATPat(I, C.RECORDAtPat(I, SOME patrow)) val mrule = C.Mrule(I, pat, VIDExp(I, vid)) val match = C.Match(I, mrule, NONE) in C.PARAtExp(I, C.FNExp(I, match)) end fun CASEExp(I, exp, match) = let val function = C.ATEXPExp(I, C.PARAtExp(I, C.FNExp(I, match))) in C.APPExp(I, function, C.PARAtExp(I, exp)) end fun IFExp(I, exp1, exp2, exp3) = let val mruleTrue = C.Mrule(I, TRUEPat(I), exp2) val mruleFalse = C.Mrule(I, FALSEPat(I), exp3) val matchFalse = C.Match(I, mruleFalse, NONE) val matchTrue = C.Match(I, mruleTrue, SOME matchFalse) in CASEExp(I, exp1, matchTrue) end fun ORELSEExp (I, exp1, exp2) = IFExp(I, exp1, TRUEExp(I), exp2) fun ANDALSOExp(I, exp1, exp2) = IFExp(I, exp1, exp2, FALSEExp(I)) fun SEQAtExp(I, exps) = let val wildcard = C.ATPATPat(I, C.WILDCARDAtPat(I)) fun toExpSeq [] = raise Fail "DerivedFormsCore.SEQAtExp: \ \empty exp list" | toExpSeq [exp] = exp | toExpSeq(exp::exps') = let val mrule = C.Mrule(I, wildcard, toExpSeq exps') val match = C.Match(I, mrule, NONE) in CASEExp(I, exp, match) end in C.PARAtExp(I, toExpSeq exps) end fun LETAtExp(I, dec, [exp]) = C.LETAtExp(I, dec, exp) | LETAtExp(I, dec, exps) = C.LETAtExp(I, dec, C.ATEXPExp(I, SEQAtExp(I, exps))) fun WHILEExp(I, exp1, exp2) = let val vid = VId.invent() val vidExp = VIDExp(I, vid) val unitAtExp = UNITAtExp(I) val unitExp = C.ATEXPExp(I, unitAtExp) val callVid = C.APPExp(I, vidExp, unitAtExp) val seqExp = C.ATEXPExp(I, SEQAtExp(I, [exp2, callVid])) val fnBody = IFExp(I, exp1, seqExp, unitExp) val mrule = C.Mrule(I, C.ATPATPat(I, UNITAtPat(I)), fnBody) val match = C.Match(I, mrule, NONE) val fnExp = C.FNExp(I, match) val fnBind = C.PLAINValBind(I, VIDPat(I, vid), fnExp, NONE) val valbind = C.RECValBind(I, fnBind) val dec = C.VALDec(I, C.TyVarseq(I, []), valbind) in C.ATEXPExp(I, C.LETAtExp(I, dec, callVid)) end fun LISTAtExp(I, exps) = let fun toExpList [] = NILExp(I) | toExpList(exp::exps') = C.APPExp(I, CONSExp(I), TUPLEAtExp(I, [exp, toExpList exps'])) in C.PARAtExp(I, toExpList exps) end (* Type Expressions [Figure 16] *) fun TUPLETy(I, [ty]) = ty | TUPLETy(I, tys) = let fun toTyRow(n, [] ) = NONE | toTyRow(n, ty::tys') = SOME(C.TyRow(I, Lab.fromInt n, ty, toTyRow(n+1, tys'))) in C.RECORDTy(I, toTyRow(1, tys)) end (* Function-value Bindings [Figure 17] *) fun FvalBind(I, (match, vid, arity), fvalbind_opt) = let fun abstract(0, vidExps) = let val exp = C.ATEXPExp(I, TUPLEAtExp(I, List.rev vidExps)) in CASEExp(I, exp, match) end | abstract(n, vidExps) = let val vid = VId.invent() val exp = VIDExp(I, vid) val pat = VIDPat(I, vid) val mrule = C.Mrule(I, pat, abstract(n-1, exp::vidExps)) in C.FNExp(I, C.Match(I, mrule, NONE)) end val exp = abstract(arity, []) val pat = VIDPat(I, vid) in C.PLAINValBind(I, pat, exp, fvalbind_opt) end fun Fmatch(I, (mrule, vid, arity), NONE) = ( C.Match(I, mrule, NONE), vid, arity ) | Fmatch(I, (mrule, vid, arity), SOME(match, vid', arity')) = if vid <> vid' then Error.error(I, "inconsistent function identifier") else if arity <> arity' then Error.error(I, "inconsistent function arity") else ( C.Match(I, mrule, SOME match), vid, arity ) fun Fmrule(I, _, vid, atpats, ty_opt, exp) = let val pats = List.map (fn atpat => C.ATPATPat(I, atpat)) atpats val pat' = C.ATPATPat(I, TUPLEAtPat(I, pats)) val exp' = case ty_opt of NONE => exp | SOME ty => C.TYPEDExp(I, exp, ty) val arity = List.length atpats in ( C.Mrule(I, pat', exp'), vid, arity ) end (* Declarations [Figure 17] *) fun FUNDec(I, tyvarseq, fvalbind) = C.VALDec(I, tyvarseq, C.RECValBind(I, fvalbind)) fun DATATYPEDec(I, datbind, NONE) = C.DATATYPEDec(I, datbind) | DATATYPEDec(I, datbind, SOME typbind) = let val datbind' = rewriteDatBind typbind datbind in C.SEQDec(I, C.DATATYPEDec(C.infoDatBind datbind, datbind'), C.TYPEDec(C.infoTypBind typbind, typbind)) end fun ABSTYPEDec(I, datbind, NONE, dec) = C.ABSTYPEDec(I, datbind,dec) | ABSTYPEDec(I, datbind, SOME typbind, dec) = let val I' = C.infoTypBind typbind val datbind' = rewriteDatBind typbind datbind in C.ABSTYPEDec(I, datbind', C.SEQDec(I, C.TYPEDec(I', typbind), dec)) end end (* stop of DerivedFormsCore.sml *) (* start of DERIVED_FORMS_MODULE.sml *) (* * Standard ML modules derived forms * * Definition, Appendix A * * Notes: * - A phrase named SynDesc has been added to factorize type synonym * specifications. * - Similarly, a phrase named TyReaDesc has been added to factorize type * realisation signature expressions. * - The structure sharing derived form is missing since it cannot be resolved * syntactically. It has been moved to the bare grammar. *) signature DERIVED_FORMS_MODULE = sig (* Import *) type Info = GrammarModule.Info type VId = GrammarCore.VId type TyCon = GrammarCore.TyCon type StrId = GrammarCore.StrId type SigId = GrammarModule.SigId type FunId = GrammarModule.FunId type longTyCon = GrammarCore.longTyCon type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type StrExp = GrammarModule.StrExp type StrDec = GrammarModule.StrDec type StrBind = GrammarModule.StrBind type SigExp = GrammarModule.SigExp type TyReaDesc = (Info * TyVarseq * longTyCon * Ty) list type Spec = GrammarModule.Spec type SynDesc = (Info * TyVarseq * TyCon * Ty) list type FunBind = GrammarModule.FunBind (* Structure Bindings [Figure 18] *) val TRANSStrBind: Info * StrId * SigExp option * StrExp * StrBind option -> StrBind val OPAQStrBind: Info * StrId * SigExp * StrExp * StrBind option -> StrBind (* Structure Expressions [Figure 18] *) val APPDECStrExp: Info * FunId * StrDec -> StrExp (* Functor Bindings [Figure 18] *) val TRANSFunBind: Info * FunId * StrId * SigExp * SigExp option * StrExp * FunBind option -> FunBind val OPAQFunBind: Info * FunId * StrId * SigExp * SigExp * StrExp * FunBind option -> FunBind val TRANSSPECFunBind: Info * FunId * Spec * SigExp option * StrExp * FunBind option -> FunBind val OPAQSPECFunBind: Info * FunId * Spec * SigExp * StrExp * FunBind option -> FunBind (* Specifications [Figure 19] *) val SYNSpec: Info * SynDesc -> Spec val INCLUDEMULTISpec: Info * SigId list -> Spec val SynDesc: Info * TyVarseq * TyCon * Ty * SynDesc option -> SynDesc (* Signature Expressions [Figure 19] *) val WHERETYPESigExp: Info * SigExp * TyReaDesc -> SigExp val TyReaDesc: Info * TyVarseq * longTyCon * Ty * TyReaDesc option -> TyReaDesc end (* stop of DERIVED_FORMS_MODULE.sml *) (* start of DerivedFormsModule.sml *) (* * Standard ML modules derived forms * * Definition, Appendix A * * Notes: * - A phrase named SynDesc has been added to factorize type synonym * specifications. * - Similarly, a phrase named TyReaDesc has been added to factorize type * realisation signature expressions. * - The structure sharing derived form is missing since it cannot be resolved * syntactically. It has been moved to the bare grammar. *) structure DerivedFormsModule :> DERIVED_FORMS_MODULE = struct (* Import *) structure C = GrammarCore structure M = GrammarModule type Info = M.Info type VId = M.VId type TyCon = M.TyCon type StrId = M.StrId type SigId = M.SigId type FunId = M.FunId type longTyCon = M.longTyCon type Ty = M.Ty type TyVarseq = M.TyVarseq type StrExp = M.StrExp type StrDec = M.StrDec type StrBind = M.StrBind type SigExp = M.SigExp type TyReaDesc = (M.Info * M.TyVarseq * M.longTyCon * M.Ty) list type Spec = M.Spec type SynDesc = (M.Info * M.TyVarseq * M.TyCon * M.Ty) list type FunBind = M.FunBind (* Structure Bindings [Figure 18] *) fun TRANSStrBind(I, strid, NONE, strexp, strbind_opt) = M.StrBind(I, strid, strexp, strbind_opt) | TRANSStrBind(I, strid, SOME sigexp, strexp, strbind_opt) = M.StrBind(I, strid, M.TRANSStrExp(I, strexp, sigexp), strbind_opt) fun OPAQStrBind(I, strid, sigexp, strexp, strbind_opt) = M.StrBind(I, strid, M.OPAQStrExp(I, strexp, sigexp), strbind_opt) (* Structure Expressions [Figure 18] *) fun APPDECStrExp(I, funid, strdec) = M.APPStrExp(I, funid, M.STRUCTStrExp(M.infoStrDec strdec, strdec)) (* Functor Bindings [Figure 18] *) fun TRANSFunBind(I, funid, strid, sigexp, NONE, strexp, funbind_opt) = M.FunBind(I, funid, strid, sigexp, strexp, funbind_opt) | TRANSFunBind(I, funid, strid,sigexp, SOME sigexp', strexp, funbind_opt)= M.FunBind(I, funid, strid, sigexp, M.TRANSStrExp(I, strexp,sigexp'), funbind_opt) fun OPAQFunBind(I, funid, strid, sigexp, sigexp', strexp, funbind_opt) = M.FunBind(I, funid, strid, sigexp, M.OPAQStrExp(I, strexp, sigexp'), funbind_opt) fun TRANSSPECFunBind(I, funid, spec, sigexp_opt, strexp, funbind_opt) = let val I' = M.infoStrExp strexp val strid = StrId.invent() val sigexp = M.SIGSigExp(M.infoSpec spec, spec) val strdec = M.DECStrDec(I', C.OPENDec(I',[LongStrId.fromId strid])) val strexp'= case sigexp_opt of NONE => strexp | SOME sigexp' => M.TRANSStrExp(I', strexp, sigexp') val letexp = M.LETStrExp(I', strdec, strexp') in M.FunBind(I, funid, strid, sigexp, letexp, funbind_opt) end fun OPAQSPECFunBind(I, funid, spec, sigexp', strexp, funbind_opt) = let val I' = M.infoStrExp strexp val strid = StrId.invent() val sigexp = M.SIGSigExp(M.infoSpec spec, spec) val strdec = M.DECStrDec(I', C.OPENDec(I',[LongStrId.fromId strid])) val strexp'= M.TRANSStrExp(I', strexp, sigexp') val letexp = M.LETStrExp(I', strdec, strexp') in M.FunBind(I, funid, strid, sigexp, letexp, funbind_opt) end (* Specifications [Figure 19] *) fun SYNSpec(I, []) = M.EMPTYSpec(I) | SYNSpec(I, (I',tyvarseq,tycon,ty)::syns') = let val longtycon = LongTyCon.fromId tycon val typdesc = M.TypDesc(I', tyvarseq, tycon, NONE) val sigexp = M.SIGSigExp(I', M.TYPESpec(I', typdesc)) val sigexp' = M.WHERETYPESigExp(I', sigexp, tyvarseq, longtycon, ty) val spec1 = M.INCLUDESpec(I', sigexp') in M.SEQSpec(I, spec1, SYNSpec(I, syns')) end fun INCLUDEMULTISpec(I, [] ) = M.EMPTYSpec(I) | INCLUDEMULTISpec(I, sigid::sigids') = let val spec1 = M.INCLUDESpec(I, M.SIGIDSigExp(I, sigid)) in M.SEQSpec(I, spec1, INCLUDEMULTISpec(I, sigids')) end fun SynDesc(I, tyvarseq, tycon, ty, NONE) = (I, tyvarseq, tycon, ty) :: [] | SynDesc(I, tyvarseq, tycon, ty, SOME syndesc) = (I, tyvarseq, tycon, ty) :: syndesc (* Signature Expressions [Figure 19] *) fun WHERETYPESigExp(I, sigexp, [] ) = sigexp | WHERETYPESigExp(I, sigexp, (I',tyvarseq,longtycon,ty)::reas') = let val sigexp' = M.WHERETYPESigExp(I', sigexp, tyvarseq, longtycon, ty) in WHERETYPESigExp(I, sigexp', reas') end fun TyReaDesc(I, tyvarseq, longtycon, ty, NONE) = (I, tyvarseq, longtycon, ty) :: [] | TyReaDesc(I, tyvarseq, longtycon, ty, SOME tyreadesc) = (I, tyvarseq, longtycon, ty) :: tyreadesc end (* stop of DerivedFormsModule.sml *) (* start of DERIVED_FORMS_PROGRAM.sml *) (* * Standard ML program derived forms * * Definition, Appendix A *) signature DERIVED_FORMS_PROGRAM = sig (* Import *) type Info = GrammarProgram.Info type Exp = GrammarCore.Exp type TopDec = GrammarModule.TopDec type Program = GrammarProgram.Program (* Programs [Figure 18] *) val TOPDECProgram: Info * TopDec * Program option -> Program val EXPProgram: Info * Exp * Program option -> Program end (* stop of DERIVED_FORMS_PROGRAM.sml *) (* start of DerivedFormsProgram.sml *) (* * Standard ML program derived forms * * Definition, Appendix A *) structure DerivedFormsProgram :> DERIVED_FORMS_PROGRAM = struct (* Import *) structure C = GrammarCore structure M = GrammarModule structure P = GrammarProgram type Info = GrammarProgram.Info type Exp = GrammarCore.Exp type TopDec = GrammarModule.TopDec type Program = GrammarProgram.Program (* Programs [Figure 18] *) fun TOPDECProgram(I, topdec, program_opt) = P.Program(I, topdec, program_opt) fun EXPProgram(I, exp, program_opt) = let val longvid = LongVId.fromId(VId.fromString "it") val pat = C.ATPATPat(I, C.LONGVIDAtPat(I, C.SANSOp, longvid)) val valbind = C.PLAINValBind(I, pat, exp, NONE) val dec = C.VALDec(I, C.TyVarseq(I, []), valbind) val topdec = M.STRDECTopDec(I, M.DECStrDec(I, dec), NONE) in P.Program(I, topdec, program_opt) end end (* stop of DerivedFormsProgram.sml *) (* start of Parser.grm.sig *) signature Parser_TOKENS = sig type ('a,'b) token type svalue val LONGID: (string list*string) * 'a * 'a -> (svalue,'a) token val ETYVAR: (string) * 'a * 'a -> (svalue,'a) token val TYVAR: (string) * 'a * 'a -> (svalue,'a) token val STAR: 'a * 'a -> (svalue,'a) token val SYMBOL: (string) * 'a * 'a -> (svalue,'a) token val ALPHA: (string) * 'a * 'a -> (svalue,'a) token val CHAR: (char) * 'a * 'a -> (svalue,'a) token val STRING: (string) * 'a * 'a -> (svalue,'a) token val REAL: (real) * 'a * 'a -> (svalue,'a) token val WORD: (word) * 'a * 'a -> (svalue,'a) token val INT: (int) * 'a * 'a -> (svalue,'a) token val NUMERIC: (int) * 'a * 'a -> (svalue,'a) token val DIGIT: (int) * 'a * 'a -> (svalue,'a) token val ZERO: 'a * 'a -> (svalue,'a) token val COLONGREATER: 'a * 'a -> (svalue,'a) token val WHERE: 'a * 'a -> (svalue,'a) token val STRUCTURE: 'a * 'a -> (svalue,'a) token val STRUCT: 'a * 'a -> (svalue,'a) token val SIGNATURE: 'a * 'a -> (svalue,'a) token val SIG: 'a * 'a -> (svalue,'a) token val SHARING: 'a * 'a -> (svalue,'a) token val INCLUDE: 'a * 'a -> (svalue,'a) token val FUNCTOR: 'a * 'a -> (svalue,'a) token val EQTYPE: 'a * 'a -> (svalue,'a) token val HASH: 'a * 'a -> (svalue,'a) token val ARROW: 'a * 'a -> (svalue,'a) token val DARROW: 'a * 'a -> (svalue,'a) token val EQUALS: 'a * 'a -> (svalue,'a) token val BAR: 'a * 'a -> (svalue,'a) token val UNDERBAR: 'a * 'a -> (svalue,'a) token val DOTS: 'a * 'a -> (svalue,'a) token val SEMICOLON: 'a * 'a -> (svalue,'a) token val COLON: 'a * 'a -> (svalue,'a) token val COMMA: 'a * 'a -> (svalue,'a) token val RBRACE: 'a * 'a -> (svalue,'a) token val LBRACE: 'a * 'a -> (svalue,'a) token val RBRACK: 'a * 'a -> (svalue,'a) token val LBRACK: 'a * 'a -> (svalue,'a) token val RPAR: 'a * 'a -> (svalue,'a) token val LPAR: 'a * 'a -> (svalue,'a) token val WHILE: 'a * 'a -> (svalue,'a) token val WITHTYPE: 'a * 'a -> (svalue,'a) token val WITH: 'a * 'a -> (svalue,'a) token val VAL: 'a * 'a -> (svalue,'a) token val TYPE: 'a * 'a -> (svalue,'a) token val THEN: 'a * 'a -> (svalue,'a) token val REC: 'a * 'a -> (svalue,'a) token val RAISE: 'a * 'a -> (svalue,'a) token val ORELSE: 'a * 'a -> (svalue,'a) token val OPEN: 'a * 'a -> (svalue,'a) token val OP: 'a * 'a -> (svalue,'a) token val OF: 'a * 'a -> (svalue,'a) token val NONFIX: 'a * 'a -> (svalue,'a) token val LOCAL: 'a * 'a -> (svalue,'a) token val LET: 'a * 'a -> (svalue,'a) token val INFIXR: 'a * 'a -> (svalue,'a) token val INFIX: 'a * 'a -> (svalue,'a) token val IN: 'a * 'a -> (svalue,'a) token val IF: 'a * 'a -> (svalue,'a) token val HANDLE: 'a * 'a -> (svalue,'a) token val FUN: 'a * 'a -> (svalue,'a) token val FN: 'a * 'a -> (svalue,'a) token val EXCEPTION: 'a * 'a -> (svalue,'a) token val END: 'a * 'a -> (svalue,'a) token val ELSE: 'a * 'a -> (svalue,'a) token val DATATYPE: 'a * 'a -> (svalue,'a) token val DO: 'a * 'a -> (svalue,'a) token val CASE: 'a * 'a -> (svalue,'a) token val AS: 'a * 'a -> (svalue,'a) token val ANDALSO: 'a * 'a -> (svalue,'a) token val AND: 'a * 'a -> (svalue,'a) token val ABSTYPE: 'a * 'a -> (svalue,'a) token val EOF: 'a * 'a -> (svalue,'a) token end signature Parser_LRVALS= sig structure Tokens : Parser_TOKENS structure ParserData:PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end (* stop of Parser.grm.sig *) (* start of Parser.grm.sml *) functor LrValsFn(structure Token: TOKEN) = struct structure ParserData= struct structure Header = struct (* *) (* Standard ML syntactical analysis *) (* *) (* Definition, sections 2, 3, and 8, Appendix A and B *) (* *) (* Notes: *) (* - Two phrases named Fmatch and Fmrule have been added to factorize *) (* Fvalbind. *) (* - A phrase named SynDesc has been added to factorize type synonym *) (* specifications. Similarly, a phrase named TyReaDesc has been added to *) (* factorize type realisation signature expressions. *) (* - Infix expressions [Definition, section 2.6] are resolved externally in *) (* structure Infix. The parser just maintains the infix environment J by *) (* side effect. To achieve correct treatment of scoped fixity directives, *) (* a stack of environments is used. To handle `local' we even need a *) (* second environment J' (together with a a second stack). *) (* - Syntactic restrictions [Definition, sections 2.9 and 3.5] are checked *) (* during elaboration, as well as the Fvalbind derived form. *) (* - The Definition is not clear about whether `=' should also be legal as *) (* a tycon. Since this would result in massive conflicts, and a type named *) (* `=' could only be used legally if an implementation would be mad enough *) (* to predefine it anyway, we simply disallow it. *) (* - The Definition is also vague about what consists a non-infixed occurance *) (* of an infix identifier: we assume any occurances in expressions *) (* or patterns. This implies that uses of the keyword `op' in constructor *) (* and exception bindings are completely redundant. *) (* - Datatype replication requires rules for datatype to be duplicated to *) (* avoid conflicts on empty tyvarseqs. *) (* - Layered patterns require some grammar transformation hack, see pat. *) (* - The messy `sigexp where type ... and type ...' syntax requires some *) (* really ugly transformations (in absence of a lookahead of 2), watch out *) (* for non-terminals of the form xxx__AND_yyybind_opt. *) (* - ML-Yacc does not seem to like comments that stretch over several *) (* lines... Similarly, comments in semantic actions make it puke... *) (* *) (* Bugs: *) (* - We do NOT support declarations like *) (* fun f p1 = case e1 of p2 => e2 *) (* | f p3 = e3 *) (* (without parentheses around the case) because the transformations *) (* required to support this would be even a magnitude uglier than those *) (* above. In fact, no compiler I know of supports this. *) (* *) (* Import *) open GrammarCore open GrammarModule open GrammarProgram open DerivedFormsCore open DerivedFormsModule open DerivedFormsProgram (* Helper to build info fields *) fun I(left, right) = if right = 0 then (left, left) else (left, right) (* Handling infix environments *) val J = ref Infix.empty (* context *) val J' = ref Infix.empty (* local environment (+ enclosing one) *) val stackJ = ref [] : Infix.InfEnv list ref val stackJ' = ref [] : Infix.InfEnv list ref fun initJandJ'(J0) = ( J := J0; J' := J0; stackJ := []; stackJ' := [] ) fun pushJ() = ( stackJ := !J :: !stackJ ) fun popJ() = ( J := List.hd(!stackJ); stackJ := List.tl(!stackJ) ) fun pushJ'shiftJ() = ( stackJ' := !J' :: !stackJ'; J' := List.hd(!stackJ) ) fun popJandJ'() = ( J := !J'; J' := List.hd(!stackJ'); stackJ := List.tl(!stackJ); stackJ' := List.tl(!stackJ') ) fun assignInfix(infstatus, vids) = ( J := Infix.assign(!J, vids, infstatus); J' := Infix.assign(!J', vids, infstatus) ) fun cancelInfix(vids) = ( J := Infix.cancel(!J, vids); J' := Infix.cancel(!J', vids) ) (* Helper for long identifiers *) fun toLongId toId (strids, id) = ( List.map StrId.fromString strids, toId id ) (* Helper to handle typed patterns (needed because of layered patterns) *) fun typedPat(pat, [] ) = pat | typedPat(pat, ty::tys) = let val I = Source.over(infoPat pat, infoTy ty) in typedPat(TYPEDPat(I, pat, ty), tys) end end structure LrTable = Token.LrTable structure Token = Token local open LrTable in val table=let val actionRows = "\ \\001\000\001\000\000\000\000\000\ \\001\000\001\000\184\003\002\000\049\000\006\000\048\000\008\000\047\000\ \\011\000\046\000\012\000\045\000\013\000\044\000\015\000\043\000\ \\017\000\042\000\018\000\041\000\019\000\040\000\020\000\039\000\ \\021\000\038\000\023\000\037\000\024\000\036\000\026\000\035\000\ \\029\000\034\000\030\000\033\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\038\000\029\000\042\000\174\003\046\000\151\002\ \\049\000\028\000\051\000\027\000\055\000\026\000\057\000\025\000\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\ \\068\000\151\002\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\002\000\139\002\003\000\139\002\008\000\139\002\010\000\139\002\ \\011\000\139\002\013\000\139\002\016\000\139\002\017\000\139\002\ \\018\000\139\002\020\000\139\002\021\000\139\002\024\000\139\002\ \\029\000\139\002\030\000\139\002\034\000\141\002\035\000\139\002\ \\041\000\139\002\042\000\139\002\051\000\139\002\055\000\139\002\ \\057\000\139\002\059\000\139\002\000\000\ \\001\000\002\000\178\002\003\000\178\002\004\000\178\002\007\000\178\002\ \\008\000\178\002\009\000\178\002\010\000\178\002\011\000\178\002\ \\013\000\178\002\014\000\178\002\016\000\178\002\017\000\178\002\ \\018\000\178\002\019\000\040\000\020\000\178\002\021\000\178\002\ \\022\000\178\002\023\000\037\000\024\000\178\002\025\000\178\002\ \\028\000\178\002\029\000\178\002\030\000\178\002\034\000\031\000\ \\035\000\178\002\036\000\030\000\037\000\178\002\038\000\029\000\ \\039\000\178\002\040\000\178\002\041\000\178\002\042\000\178\002\ \\045\000\178\002\046\000\151\002\049\000\028\000\051\000\178\002\ \\055\000\178\002\057\000\178\002\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\068\000\151\002\069\000\151\002\ \\070\000\151\002\073\000\151\002\000\000\ \\001\000\002\000\034\003\003\000\034\003\004\000\034\003\005\000\034\003\ \\007\000\034\003\008\000\034\003\009\000\034\003\010\000\034\003\ \\011\000\034\003\013\000\034\003\014\000\034\003\016\000\034\003\ \\017\000\034\003\018\000\034\003\020\000\034\003\021\000\034\003\ \\022\000\034\003\024\000\034\003\025\000\034\003\028\000\034\003\ \\029\000\034\003\030\000\034\003\031\000\034\003\032\000\034\003\ \\035\000\034\003\037\000\034\003\039\000\034\003\040\000\034\003\ \\041\000\034\003\042\000\034\003\045\000\034\003\046\000\034\003\ \\047\000\034\003\048\000\034\003\050\000\034\003\051\000\034\003\ \\052\000\034\003\053\000\034\003\055\000\034\003\057\000\034\003\ \\058\000\034\003\059\000\034\003\068\000\045\003\069\000\045\003\ \\070\000\248\000\073\000\045\003\000\000\ \\001\000\002\000\075\003\003\000\148\001\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\056\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\059\000\056\003\000\000\ \\001\000\002\000\075\003\003\000\148\001\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\086\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\058\000\086\003\059\000\086\003\000\000\ \\001\000\002\000\075\003\003\000\097\002\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\101\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\058\000\101\003\059\000\101\003\000\000\ \\001\000\002\000\093\003\003\000\086\001\008\000\093\003\011\000\093\003\ \\013\000\093\003\017\000\093\003\018\000\093\003\020\000\093\003\ \\021\000\093\003\024\000\093\003\029\000\093\003\030\000\093\003\ \\042\000\093\003\051\000\093\003\055\000\093\003\057\000\093\003\ \\058\000\086\003\000\000\ \\001\000\002\000\093\003\003\000\077\002\008\000\093\003\011\000\093\003\ \\013\000\093\003\017\000\093\003\018\000\093\003\020\000\093\003\ \\021\000\093\003\024\000\093\003\029\000\093\003\030\000\093\003\ \\042\000\093\003\051\000\093\003\055\000\093\003\057\000\093\003\ \\058\000\101\003\000\000\ \\001\000\002\000\164\003\003\000\032\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\056\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\059\000\056\003\000\000\ \\001\000\002\000\164\003\003\000\032\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\086\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\058\000\086\003\059\000\086\003\000\000\ \\001\000\002\000\164\003\003\000\108\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\101\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\058\000\101\003\059\000\101\003\000\000\ \\001\000\002\000\049\000\006\000\048\000\008\000\047\000\011\000\046\000\ \\012\000\045\000\013\000\044\000\015\000\043\000\017\000\042\000\ \\018\000\041\000\019\000\040\000\020\000\039\000\021\000\038\000\ \\023\000\037\000\024\000\036\000\026\000\035\000\029\000\034\000\ \\030\000\033\000\033\000\032\000\034\000\031\000\036\000\030\000\ \\038\000\029\000\042\000\174\003\046\000\151\002\049\000\028\000\ \\051\000\027\000\055\000\026\000\057\000\025\000\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\068\000\151\002\ \\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\003\000\005\002\008\000\152\003\010\000\152\003\011\000\152\003\ \\029\000\152\003\030\000\152\003\035\000\152\003\050\000\152\003\ \\052\000\152\003\053\000\152\003\057\000\152\003\058\000\086\003\000\000\ \\001\000\003\000\101\002\008\000\152\003\010\000\152\003\011\000\152\003\ \\029\000\152\003\030\000\152\003\035\000\152\003\050\000\152\003\ \\052\000\152\003\053\000\152\003\057\000\152\003\058\000\101\003\000\000\ \\001\000\004\000\059\000\007\000\183\000\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\009\000\131\001\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\022\000\242\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\028\000\224\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\035\000\180\000\ \\040\000\179\000\041\000\056\000\042\000\178\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\055\000\000\000\ \\001\000\005\000\133\002\039\000\133\002\040\000\133\002\041\000\133\002\ \\046\000\126\002\000\000\ \\001\000\005\000\134\002\039\000\134\002\040\000\134\002\041\000\134\002\ \\046\000\127\002\000\000\ \\001\000\005\000\135\002\039\000\135\002\040\000\135\002\041\000\135\002\ \\046\000\128\002\000\000\ \\001\000\005\000\012\003\035\000\029\003\037\000\029\003\039\000\029\003\ \\040\000\029\003\041\000\186\000\046\000\029\003\047\000\029\003\000\000\ \\001\000\005\000\013\003\023\000\144\002\034\000\144\002\035\000\144\002\ \\036\000\144\002\037\000\144\002\038\000\144\002\039\000\144\002\ \\040\000\144\002\041\000\031\001\044\000\144\002\046\000\144\002\ \\047\000\144\002\060\000\144\002\061\000\144\002\062\000\144\002\ \\063\000\144\002\064\000\144\002\065\000\144\002\066\000\144\002\ \\067\000\144\002\068\000\144\002\069\000\144\002\070\000\144\002\ \\073\000\144\002\000\000\ \\001\000\005\000\118\001\000\000\ \\001\000\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\037\000\163\002\038\000\029\000\046\000\151\002\ \\049\000\028\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\068\000\151\002\069\000\151\002\070\000\151\002\ \\073\000\151\002\000\000\ \\001\000\008\000\233\001\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\010\000\157\001\000\000\ \\001\000\010\000\198\001\000\000\ \\001\000\010\000\238\001\000\000\ \\001\000\010\000\020\002\000\000\ \\001\000\010\000\027\002\000\000\ \\001\000\010\000\070\002\000\000\ \\001\000\010\000\072\002\000\000\ \\001\000\016\000\045\001\000\000\ \\001\000\016\000\047\001\000\000\ \\001\000\016\000\190\001\000\000\ \\001\000\016\000\251\001\000\000\ \\001\000\019\000\081\001\056\000\080\001\068\000\079\001\073\000\118\000\000\000\ \\001\000\023\000\037\000\034\000\142\000\035\000\018\003\036\000\107\000\ \\037\000\018\003\038\000\106\000\039\000\018\003\040\000\018\003\ \\044\000\105\000\046\000\018\003\047\000\018\003\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\068\000\151\002\ \\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\023\000\037\000\034\000\142\000\035\000\026\003\036\000\107\000\ \\037\000\026\003\038\000\106\000\039\000\026\003\040\000\026\003\ \\041\000\026\003\044\000\105\000\046\000\026\003\047\000\026\003\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\ \\068\000\151\002\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\023\000\037\000\034\000\142\000\036\000\107\000\037\000\003\003\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\068\000\151\002\069\000\151\002\ \\070\000\151\002\073\000\151\002\000\000\ \\001\000\029\000\096\001\068\000\071\000\073\000\118\000\000\000\ \\001\000\029\000\155\001\000\000\ \\001\000\029\000\160\001\000\000\ \\001\000\029\000\160\001\068\000\074\000\000\000\ \\001\000\029\000\162\001\068\000\071\000\073\000\118\000\000\000\ \\001\000\029\000\024\002\000\000\ \\001\000\029\000\024\002\068\000\071\000\000\000\ \\001\000\029\000\040\002\000\000\ \\001\000\029\000\040\002\068\000\071\000\000\000\ \\001\000\029\000\088\002\000\000\ \\001\000\029\000\088\002\068\000\077\000\000\000\ \\001\000\031\000\066\001\000\000\ \\001\000\034\000\113\000\068\000\150\000\069\000\149\000\071\000\104\000\000\000\ \\001\000\034\000\173\000\000\000\ \\001\000\034\000\151\001\000\000\ \\001\000\035\000\181\000\000\000\ \\001\000\035\000\182\000\000\000\ \\001\000\035\000\038\001\000\000\ \\001\000\035\000\040\001\040\000\039\001\000\000\ \\001\000\035\000\041\001\000\000\ \\001\000\035\000\071\001\000\000\ \\001\000\035\000\073\001\040\000\072\001\000\000\ \\001\000\035\000\090\001\000\000\ \\001\000\035\000\217\001\058\000\082\001\000\000\ \\001\000\035\000\246\001\000\000\ \\001\000\035\000\249\001\041\000\248\001\059\000\247\001\000\000\ \\001\000\037\000\177\000\000\000\ \\001\000\037\000\037\001\000\000\ \\001\000\039\000\174\000\000\000\ \\001\000\039\000\033\001\000\000\ \\001\000\039\000\069\001\000\000\ \\001\000\041\000\070\001\000\000\ \\001\000\041\000\091\001\000\000\ \\001\000\041\000\150\001\059\000\149\001\000\000\ \\001\000\041\000\166\001\000\000\ \\001\000\041\000\173\001\000\000\ \\001\000\041\000\034\002\059\000\033\002\000\000\ \\001\000\042\000\050\000\000\000\ \\001\000\043\000\200\000\061\000\083\000\062\000\082\000\068\000\199\000\ \\069\000\198\000\070\000\197\000\000\000\ \\001\000\046\000\068\000\068\000\067\000\069\000\066\000\070\000\065\000\ \\073\000\064\000\000\000\ \\001\000\046\000\122\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\046\000\172\000\000\000\ \\001\000\046\000\175\000\000\000\ \\001\000\046\000\187\000\000\000\ \\001\000\046\000\241\000\000\000\ \\001\000\046\000\255\000\000\000\ \\001\000\046\000\035\001\000\000\ \\001\000\046\000\043\001\000\000\ \\001\000\046\000\050\001\000\000\ \\001\000\046\000\059\001\000\000\ \\001\000\046\000\065\001\000\000\ \\001\000\046\000\083\001\058\000\082\001\000\000\ \\001\000\046\000\167\001\000\000\ \\001\000\046\000\177\001\000\000\ \\001\000\046\000\215\001\000\000\ \\001\000\046\000\223\001\000\000\ \\001\000\046\000\227\001\000\000\ \\001\000\046\000\230\001\000\000\ \\001\000\046\000\001\002\058\000\082\001\000\000\ \\001\000\046\000\029\002\000\000\ \\001\000\046\000\030\002\000\000\ \\001\000\046\000\036\002\000\000\ \\001\000\046\000\063\002\058\000\082\001\000\000\ \\001\000\046\000\083\002\000\000\ \\001\000\046\000\084\002\000\000\ \\001\000\046\000\089\002\000\000\ \\001\000\046\000\103\002\000\000\ \\001\000\047\000\233\000\000\000\ \\001\000\054\000\003\001\068\000\074\000\000\000\ \\001\000\058\000\087\001\000\000\ \\001\000\058\000\006\002\000\000\ \\001\000\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\073\000\064\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\073\000\192\000\000\000\ \\001\000\068\000\071\000\000\000\ \\001\000\068\000\071\000\073\000\118\000\000\000\ \\001\000\068\000\074\000\000\000\ \\001\000\068\000\077\000\000\000\ \\001\000\068\000\150\000\069\000\149\000\000\000\ \\001\000\068\000\150\000\069\000\149\000\073\000\247\000\000\000\ \\001\000\071\000\104\000\000\000\ \\111\002\000\000\ \\112\002\000\000\ \\113\002\000\000\ \\113\002\041\000\248\001\059\000\247\001\000\000\ \\114\002\000\000\ \\115\002\000\000\ \\116\002\000\000\ \\117\002\000\000\ \\118\002\000\000\ \\119\002\000\000\ \\120\002\000\000\ \\121\002\000\000\ \\122\002\000\000\ \\123\002\000\000\ \\124\002\000\000\ \\125\002\000\000\ \\126\002\000\000\ \\127\002\000\000\ \\128\002\000\000\ \\129\002\000\000\ \\130\002\000\000\ \\131\002\000\000\ \\132\002\000\000\ \\133\002\000\000\ \\134\002\000\000\ \\135\002\000\000\ \\136\002\000\000\ \\137\002\000\000\ \\138\002\000\000\ \\139\002\000\000\ \\140\002\000\000\ \\141\002\000\000\ \\142\002\000\000\ \\143\002\000\000\ \\144\002\000\000\ \\145\002\000\000\ \\145\002\041\000\186\000\000\000\ \\146\002\000\000\ \\147\002\000\000\ \\148\002\000\000\ \\149\002\000\000\ \\150\002\000\000\ \\151\002\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\035\000\093\000\036\000\030\000\038\000\029\000\049\000\028\000\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\000\000\ \\151\002\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\038\000\029\000\049\000\028\000\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\000\000\ \\151\002\008\000\063\001\023\000\037\000\000\000\ \\151\002\023\000\037\000\000\000\ \\151\002\023\000\037\000\027\000\109\000\034\000\108\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\027\000\109\000\034\000\142\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\000\000\ \\151\002\023\000\037\000\034\000\108\000\036\000\107\000\038\000\106\000\ \\044\000\105\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\035\000\208\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\035\000\208\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\036\000\107\000\038\000\106\000\ \\044\000\105\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\000\000\ \\152\002\000\000\ \\153\002\000\000\ \\154\002\000\000\ \\155\002\000\000\ \\156\002\000\000\ \\157\002\000\000\ \\158\002\000\000\ \\159\002\000\000\ \\160\002\000\000\ \\161\002\000\000\ \\162\002\000\000\ \\164\002\000\000\ \\165\002\004\000\059\000\014\000\058\000\025\000\057\000\040\000\176\000\ \\041\000\056\000\000\000\ \\166\002\000\000\ \\167\002\000\000\ \\168\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\188\001\000\000\ \\169\002\000\000\ \\170\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\178\000\000\000\ \\171\002\000\000\ \\172\002\000\000\ \\173\002\004\000\059\000\014\000\058\000\025\000\057\000\040\000\114\001\ \\041\000\056\000\000\000\ \\174\002\000\000\ \\175\002\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\176\002\000\000\ \\177\002\000\000\ \\179\002\000\000\ \\180\002\000\000\ \\181\002\004\000\059\000\041\000\056\000\000\000\ \\182\002\004\000\059\000\025\000\057\000\041\000\056\000\000\000\ \\183\002\000\000\ \\184\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\185\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\186\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\187\002\000\000\ \\188\002\000\000\ \\189\002\000\000\ \\190\002\000\000\ \\191\002\045\000\235\000\000\000\ \\192\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\193\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\220\000\000\000\ \\194\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\220\000\000\000\ \\195\002\000\000\ \\196\002\000\000\ \\197\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\000\000\ \\198\002\000\000\ \\199\002\000\000\ \\200\002\000\000\ \\201\002\000\000\ \\202\002\000\000\ \\203\002\000\000\ \\204\002\000\000\ \\205\002\000\000\ \\206\002\000\000\ \\207\002\000\000\ \\208\002\000\000\ \\209\002\000\000\ \\210\002\000\000\ \\211\002\000\000\ \\212\002\000\000\ \\213\002\000\000\ \\214\002\032\000\239\000\000\000\ \\215\002\000\000\ \\216\002\046\000\122\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\217\002\000\000\ \\218\002\068\000\071\000\073\000\118\000\000\000\ \\219\002\000\000\ \\220\002\060\000\128\000\061\000\127\000\000\000\ \\221\002\000\000\ \\222\002\000\000\ \\223\002\000\000\ \\224\002\003\000\117\001\004\000\059\000\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\225\002\000\000\ \\226\002\000\000\ \\227\002\003\000\232\000\000\000\ \\228\002\000\000\ \\229\002\000\000\ \\230\002\045\000\230\000\000\000\ \\231\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\232\002\000\000\ \\233\002\000\000\ \\234\002\003\000\186\001\000\000\ \\235\002\000\000\ \\236\002\000\000\ \\237\002\000\000\ \\238\002\000\000\ \\239\002\003\000\139\001\000\000\ \\240\002\000\000\ \\241\002\000\000\ \\242\002\045\000\242\001\000\000\ \\243\002\000\000\ \\244\002\022\000\058\001\000\000\ \\244\002\022\000\058\001\046\000\057\001\000\000\ \\245\002\000\000\ \\246\002\000\000\ \\247\002\000\000\ \\248\002\003\000\134\001\000\000\ \\249\002\000\000\ \\249\002\041\000\186\000\000\000\ \\250\002\000\000\ \\251\002\000\000\ \\252\002\000\000\ \\253\002\000\000\ \\254\002\000\000\ \\255\002\000\000\ \\000\003\000\000\ \\001\003\000\000\ \\002\003\000\000\ \\004\003\000\000\ \\005\003\040\000\036\001\000\000\ \\006\003\000\000\ \\007\003\000\000\ \\008\003\000\000\ \\009\003\000\000\ \\010\003\000\000\ \\011\003\040\000\182\001\000\000\ \\012\003\000\000\ \\013\003\041\000\227\000\000\000\ \\014\003\000\000\ \\015\003\005\000\121\001\000\000\ \\016\003\000\000\ \\017\003\043\000\200\000\061\000\083\000\062\000\082\000\068\000\199\000\ \\069\000\198\000\070\000\197\000\000\000\ \\019\003\041\000\186\000\000\000\ \\020\003\000\000\ \\021\003\000\000\ \\022\003\000\000\ \\023\003\000\000\ \\024\003\000\000\ \\025\003\000\000\ \\027\003\000\000\ \\028\003\000\000\ \\029\003\041\000\186\000\000\000\ \\030\003\048\000\249\000\000\000\ \\031\003\000\000\ \\032\003\000\000\ \\033\003\000\000\ \\035\003\000\000\ \\036\003\000\000\ \\037\003\000\000\ \\038\003\000\000\ \\039\003\000\000\ \\040\003\000\000\ \\041\003\000\000\ \\042\003\040\000\200\001\000\000\ \\043\003\000\000\ \\044\003\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\046\003\034\000\165\000\038\000\164\000\071\000\104\000\000\000\ \\047\003\000\000\ \\048\003\000\000\ \\049\003\040\000\072\001\000\000\ \\050\003\000\000\ \\051\003\034\000\113\000\071\000\104\000\000\000\ \\052\003\000\000\ \\053\003\000\000\ \\054\003\000\000\ \\055\003\040\000\042\001\000\000\ \\056\003\000\000\ \\057\003\058\000\082\001\000\000\ \\057\003\058\000\245\001\000\000\ \\057\003\058\000\079\002\000\000\ \\058\003\058\000\082\001\000\000\ \\058\003\058\000\245\001\000\000\ \\058\003\058\000\079\002\000\000\ \\059\003\000\000\ \\060\003\000\000\ \\061\003\000\000\ \\062\003\000\000\ \\063\003\000\000\ \\064\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\216\000\ \\057\000\025\000\000\000\ \\065\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\019\000\081\001\020\000\039\000\ \\021\000\038\000\024\000\036\000\029\000\034\000\030\000\033\000\ \\042\000\216\000\056\000\080\001\057\000\025\000\068\000\079\001\ \\073\000\118\000\000\000\ \\065\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\216\000\ \\057\000\025\000\000\000\ \\066\003\000\000\ \\067\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\057\000\025\000\000\000\ \\068\003\000\000\ \\069\003\000\000\ \\070\003\000\000\ \\071\003\000\000\ \\072\003\000\000\ \\073\003\000\000\ \\074\003\000\000\ \\076\003\000\000\ \\077\003\000\000\ \\078\003\000\000\ \\079\003\000\000\ \\080\003\000\000\ \\081\003\000\000\ \\082\003\000\000\ \\083\003\000\000\ \\084\003\058\000\082\001\000\000\ \\085\003\041\000\171\000\059\000\170\000\000\000\ \\085\003\041\000\171\000\059\000\164\001\000\000\ \\085\003\041\000\171\000\059\000\003\002\000\000\ \\086\003\000\000\ \\087\003\000\000\ \\088\003\000\000\ \\089\003\000\000\ \\089\003\068\000\074\000\000\000\ \\090\003\000\000\ \\091\003\000\000\ \\092\003\000\000\ \\094\003\000\000\ \\095\003\000\000\ \\096\003\000\000\ \\097\003\000\000\ \\098\003\000\000\ \\099\003\000\000\ \\100\003\000\000\ \\101\003\003\000\074\002\000\000\ \\102\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\050\000\015\001\052\000\014\001\053\000\089\001\057\000\012\001\000\000\ \\103\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\042\000\016\001\050\000\015\001\052\000\014\001\053\000\013\001\ \\057\000\012\001\000\000\ \\103\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\042\000\016\001\050\000\015\001\052\000\014\001\053\000\013\001\ \\057\000\012\001\068\000\071\000\000\000\ \\104\003\000\000\ \\105\003\000\000\ \\106\003\000\000\ \\107\003\000\000\ \\108\003\000\000\ \\109\003\000\000\ \\110\003\000\000\ \\111\003\000\000\ \\112\003\000\000\ \\113\003\000\000\ \\114\003\000\000\ \\115\003\000\000\ \\116\003\000\000\ \\117\003\000\000\ \\118\003\000\000\ \\119\003\000\000\ \\120\003\058\000\082\001\000\000\ \\121\003\000\000\ \\122\003\000\000\ \\123\003\068\000\074\000\000\000\ \\124\003\000\000\ \\125\003\046\000\042\002\000\000\ \\126\003\000\000\ \\127\003\000\000\ \\128\003\046\000\007\002\000\000\ \\129\003\000\000\ \\130\003\000\000\ \\131\003\000\000\ \\132\003\003\000\012\002\000\000\ \\133\003\000\000\ \\134\003\000\000\ \\135\003\003\000\225\001\000\000\ \\135\003\003\000\225\001\046\000\227\001\000\000\ \\136\003\000\000\ \\137\003\000\000\ \\138\003\003\000\045\002\000\000\ \\139\003\000\000\ \\140\003\000\000\ \\141\003\000\000\ \\142\003\000\000\ \\143\003\003\000\017\002\000\000\ \\144\003\000\000\ \\145\003\000\000\ \\146\003\045\000\050\002\000\000\ \\147\003\000\000\ \\148\003\000\000\ \\149\003\003\000\229\001\000\000\ \\150\003\000\000\ \\151\003\000\000\ \\153\003\000\000\ \\154\003\000\000\ \\155\003\000\000\ \\156\003\000\000\ \\157\003\000\000\ \\158\003\000\000\ \\159\003\000\000\ \\160\003\000\000\ \\161\003\000\000\ \\162\003\000\000\ \\163\003\000\000\ \\165\003\000\000\ \\166\003\000\000\ \\167\003\000\000\ \\168\003\000\000\ \\169\003\000\000\ \\170\003\000\000\ \\171\003\000\000\ \\172\003\000\000\ \\173\003\000\000\ \\175\003\000\000\ \\176\003\000\000\ \\177\003\000\000\ \\178\003\000\000\ \\179\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\051\000\027\000\ \\055\000\026\000\057\000\025\000\000\000\ \\180\003\000\000\ \\181\003\000\000\ \\182\003\000\000\ \\183\003\000\000\ \" val actionRowNumbers = "\127\000\013\000\207\001\201\001\ \\082\000\206\001\206\001\206\001\ \\096\001\021\000\204\000\003\000\ \\202\000\084\000\179\000\139\000\ \\138\000\140\000\137\000\136\000\ \\135\000\134\000\133\000\120\000\ \\122\000\123\000\116\000\201\000\ \\028\000\169\000\170\000\173\000\ \\073\001\170\000\121\000\168\000\ \\085\000\128\000\128\000\245\000\ \\245\000\170\000\175\000\178\000\ \\172\000\057\000\170\000\073\001\ \\001\000\204\001\205\001\203\001\ \\202\001\001\000\068\001\170\000\ \\178\000\170\000\203\000\159\000\ \\180\000\161\000\162\000\152\000\ \\151\000\150\000\160\000\097\001\ \\111\001\156\000\119\001\086\000\ \\157\000\187\001\058\000\158\000\ \\182\000\145\000\144\000\143\000\ \\147\000\146\000\073\000\200\000\ \\087\000\191\000\189\000\071\000\ \\020\000\060\000\061\000\183\000\ \\016\000\174\000\044\001\088\000\ \\020\001\042\000\224\000\119\000\ \\074\001\023\001\155\000\022\001\ \\043\001\044\000\177\000\174\000\ \\072\001\124\000\228\000\126\000\ \\209\000\234\000\243\000\166\000\ \\167\000\237\000\148\000\241\000\ \\149\000\092\001\219\000\085\000\ \\244\000\142\000\141\000\085\000\ \\019\000\178\000\039\001\019\001\ \\043\000\255\000\252\000\226\000\ \\118\000\112\000\216\000\213\000\ \\176\000\233\000\117\000\124\000\ \\239\000\239\000\089\000\154\000\ \\153\000\018\000\124\000\239\000\ \\208\001\210\001\209\001\125\000\ \\058\001\004\000\056\001\054\001\ \\205\000\060\001\067\001\068\001\ \\207\000\208\000\206\000\090\000\ \\113\000\113\000\113\000\132\001\ \\181\000\170\000\170\000\185\000\ \\170\000\170\000\188\000\186\000\ \\184\000\170\000\225\000\046\001\ \\068\001\170\000\045\001\051\001\ \\021\001\026\000\163\000\074\000\ \\042\001\039\001\091\000\024\000\ \\023\000\022\000\033\001\031\001\ \\029\001\072\000\062\000\063\000\ \\064\000\077\001\025\001\247\000\ \\092\000\242\000\240\000\093\001\ \\090\001\037\000\095\001\220\000\ \\218\000\038\000\223\000\128\000\ \\236\000\235\000\170\000\227\000\ \\093\000\068\001\050\001\253\000\ \\178\000\250\000\178\000\170\000\ \\214\000\178\000\014\001\094\000\ \\230\000\073\001\229\000\171\000\ \\178\000\095\000\056\000\059\001\ \\164\000\165\000\068\001\068\001\ \\075\000\066\001\076\000\065\000\ \\066\000\041\000\114\001\096\000\ \\117\001\131\001\110\001\120\001\ \\008\000\114\000\133\001\130\001\ \\067\000\077\000\120\000\045\000\ \\113\000\073\001\135\001\117\000\ \\073\001\117\000\057\000\199\000\ \\190\000\196\000\195\000\192\000\ \\211\000\053\001\249\000\047\001\ \\027\000\068\001\048\001\024\001\ \\041\001\178\000\178\000\027\001\ \\075\001\178\000\028\001\026\001\ \\126\000\068\001\094\001\131\000\ \\222\000\170\000\219\000\017\000\ \\170\000\038\001\254\000\251\000\ \\217\000\215\000\018\001\172\000\ \\068\001\172\000\238\000\008\001\ \\117\000\125\000\212\000\172\000\ \\219\000\057\001\055\001\061\001\ \\068\001\069\001\068\001\062\001\ \\099\001\005\000\078\000\086\001\ \\059\000\002\000\128\000\128\000\ \\046\000\041\000\030\000\122\001\ \\122\000\047\000\134\001\049\000\ \\112\001\113\000\148\001\079\000\ \\138\001\097\000\125\000\150\001\ \\149\001\118\001\142\001\124\000\ \\140\001\080\000\143\001\141\001\ \\124\000\147\001\013\001\145\001\ \\144\001\124\000\098\000\197\000\ \\116\000\052\001\246\000\174\000\ \\178\000\025\000\037\001\178\000\ \\037\001\030\001\032\001\076\001\ \\003\001\092\001\194\000\129\000\ \\039\000\170\000\000\001\015\001\ \\172\000\084\000\012\001\008\001\ \\005\001\073\001\013\001\231\000\ \\008\001\031\000\065\001\070\001\ \\071\001\102\001\120\000\113\000\ \\113\000\091\001\092\001\092\001\ \\115\001\073\001\100\001\116\001\ \\121\001\123\001\073\001\139\001\ \\125\000\099\000\113\000\068\000\ \\113\000\121\000\136\001\100\000\ \\151\001\152\001\164\001\068\001\ \\165\001\179\001\102\000\029\000\ \\198\000\248\000\049\001\035\001\ \\083\000\040\001\034\001\001\001\ \\073\001\132\000\170\000\032\000\ \\131\000\210\000\017\001\018\001\ \\006\001\007\001\011\001\004\001\ \\232\000\063\001\116\000\101\001\ \\006\000\083\001\104\001\080\001\ \\103\001\069\000\078\001\070\000\ \\129\000\040\000\125\000\125\000\ \\137\001\041\000\103\000\113\001\ \\180\001\014\000\115\000\158\001\ \\157\001\125\000\162\001\073\001\ \\161\001\068\001\177\001\117\000\ \\117\000\173\001\013\001\125\000\ \\036\001\002\001\033\000\193\000\ \\187\000\219\000\016\001\009\001\ \\172\000\064\001\105\001\050\000\ \\088\001\113\000\113\000\087\001\ \\034\000\041\000\104\000\105\000\ \\190\001\010\000\081\000\041\000\ \\106\000\113\000\182\001\120\000\ \\052\000\121\000\155\001\154\001\ \\163\001\159\001\117\000\168\001\ \\178\001\173\001\170\001\073\001\ \\176\001\146\001\098\001\132\000\ \\010\001\106\001\073\001\082\001\ \\079\001\085\001\130\000\068\001\ \\068\001\193\001\123\000\113\000\ \\113\000\191\001\041\000\107\000\ \\181\001\183\001\073\001\156\001\ \\125\000\160\001\166\001\073\001\ \\171\001\172\001\124\000\174\001\ \\117\000\035\000\125\000\036\000\ \\129\001\009\000\192\001\195\001\ \\011\000\084\001\194\001\081\001\ \\188\001\041\000\125\000\153\001\ \\167\001\124\000\108\000\175\001\ \\221\000\109\000\089\001\127\001\ \\046\000\124\001\125\001\048\000\ \\196\001\054\000\189\001\110\000\ \\101\000\117\000\068\001\128\001\ \\126\001\197\001\073\001\068\001\ \\173\001\007\000\125\000\015\000\ \\169\001\107\001\108\001\051\000\ \\111\000\184\001\185\001\053\000\ \\109\001\068\001\186\001\012\000\ \\198\001\199\001\055\000\200\001\ \\000\000" val gotoT = "\ \\142\000\108\002\145\000\001\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\002\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\049\000\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\051\000\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\052\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\058\000\000\000\ \\000\000\ \\005\000\061\000\011\000\060\000\012\000\059\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\067\000\000\000\ \\009\000\071\000\098\000\070\000\000\000\ \\010\000\074\000\133\000\073\000\000\000\ \\003\000\076\000\000\000\ \\003\000\084\000\022\000\083\000\023\000\082\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\017\000\087\000\ \\018\000\086\000\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\019\000\090\000\ \\021\000\089\000\025\000\011\000\026\000\010\000\027\000\088\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\092\000\000\000\ \\001\000\101\000\007\000\100\000\015\000\099\000\038\000\098\000\ \\056\000\097\000\057\000\096\000\066\000\095\000\068\000\094\000\ \\081\000\093\000\000\000\ \\007\000\100\000\045\000\110\000\080\000\109\000\081\000\108\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\112\000\000\000\ \\008\000\115\000\014\000\114\000\036\000\113\000\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\117\000\000\000\ \\146\000\121\000\000\000\ \\146\000\122\000\000\000\ \\002\000\124\000\037\000\123\000\000\000\ \\002\000\124\000\037\000\127\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\128\000\000\000\ \\001\000\101\000\007\000\100\000\015\000\136\000\040\000\135\000\ \\042\000\134\000\044\000\133\000\056\000\132\000\057\000\131\000\ \\067\000\130\000\081\000\129\000\000\000\ \\001\000\101\000\015\000\099\000\028\000\139\000\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\015\000\142\000\054\000\141\000\000\000\ \\006\000\146\000\007\000\100\000\048\000\145\000\049\000\144\000\ \\081\000\143\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\149\000\000\000\ \\007\000\100\000\047\000\151\000\080\000\150\000\081\000\108\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\153\000\144\000\152\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\153\000\144\000\154\000\000\000\ \\007\000\161\000\070\000\160\000\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\164\000\000\000\ \\001\000\101\000\015\000\099\000\028\000\165\000\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\166\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\094\000\167\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\038\000\182\000\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\069\000\183\000\000\000\ \\000\000\ \\069\000\186\000\000\000\ \\001\000\101\000\015\000\136\000\056\000\132\000\057\000\131\000\ \\067\000\187\000\000\000\ \\000\000\ \\005\000\189\000\012\000\188\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\194\000\005\000\193\000\061\000\192\000\062\000\191\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\058\000\201\000\059\000\200\000\066\000\199\000\068\000\094\000\000\000\ \\001\000\101\000\007\000\205\000\015\000\099\000\056\000\097\000\ \\057\000\096\000\060\000\204\000\066\000\203\000\068\000\094\000\ \\082\000\202\000\000\000\ \\001\000\101\000\015\000\099\000\038\000\207\000\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\000\000\ \\006\000\208\000\000\000\ \\000\000\ \\007\000\205\000\082\000\202\000\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\014\000\114\000\036\000\209\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\210\000\000\000\ \\000\000\ \\033\000\008\000\085\000\213\000\086\000\212\000\087\000\211\000\000\000\ \\031\000\217\000\032\000\216\000\033\000\215\000\000\000\ \\004\000\119\000\005\000\118\000\035\000\220\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\221\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\040\000\223\000\042\000\134\000\ \\044\000\133\000\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\064\000\224\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\056\000\132\000\057\000\131\000\ \\067\000\226\000\000\000\ \\043\000\227\000\000\000\ \\041\000\229\000\000\000\ \\000\000\ \\005\000\061\000\012\000\188\000\000\000\ \\000\000\ \\029\000\232\000\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\060\000\204\000\066\000\203\000\068\000\094\000\000\000\ \\000\000\ \\005\000\234\000\000\000\ \\006\000\235\000\000\000\ \\034\000\236\000\000\000\ \\034\000\238\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\241\000\000\000\ \\034\000\242\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\243\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\250\000\075\000\249\000\076\000\248\000\000\000\ \\007\000\161\000\070\000\252\000\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\079\000\251\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\009\000\000\001\095\000\255\000\096\000\254\000\000\000\ \\009\000\000\001\095\000\002\001\096\000\254\000\000\000\ \\009\000\000\001\095\000\005\001\096\000\004\001\100\000\003\001\000\000\ \\008\000\009\001\105\000\008\001\106\000\007\001\107\000\006\001\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\019\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\018\000\020\001\ \\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\021\000\022\001\ \\025\000\011\000\026\000\010\000\027\000\021\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\018\000\023\001\ \\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\024\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\025\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\026\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\064\000\028\001\069\000\027\001\000\000\ \\069\000\030\001\000\000\ \\000\000\ \\000\000\ \\064\000\032\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\033\000\008\000\086\000\042\001\087\000\211\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\032\000\044\001\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\146\000\046\001\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\047\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\049\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\042\000\050\001\044\000\133\000\ \\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\040\000\051\001\042\000\134\000\ \\044\000\133\000\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\052\001\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\028\000\053\001\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\053\000\054\001\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\045\000\058\001\080\000\109\000\081\000\108\000\000\000\ \\000\000\ \\015\000\060\001\051\000\059\001\000\000\ \\001\000\101\000\015\000\099\000\028\000\062\001\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\072\000\065\001\073\000\157\000\074\000\156\000\ \\078\000\155\000\000\000\ \\007\000\161\000\070\000\066\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\074\001\ \\084\000\073\001\090\000\072\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\105\000\082\001\106\000\007\001\107\000\006\001\000\000\ \\000\000\ \\000\000\ \\099\000\083\001\000\000\ \\000\000\ \\000\000\ \\107\000\086\001\000\000\ \\000\000\ \\000\000\ \\008\000\091\001\127\000\090\001\000\000\ \\008\000\115\000\014\000\093\001\112\000\092\001\000\000\ \\009\000\097\001\095\000\096\001\096\000\254\000\108\000\095\001\000\000\ \\007\000\100\000\080\000\099\001\081\000\108\000\115\000\098\001\000\000\ \\000\000\ \\005\000\101\001\113\000\100\001\000\000\ \\007\000\100\000\080\000\104\001\081\000\108\000\115\000\103\001\ \\117\000\102\001\000\000\ \\005\000\106\001\125\000\105\001\000\000\ \\006\000\110\001\007\000\100\000\081\000\109\001\120\000\108\001\ \\121\000\107\001\000\000\ \\024\000\111\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\069\000\113\001\000\000\ \\039\000\114\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\117\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\065\000\118\001\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\120\001\068\000\094\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\059\000\121\001\066\000\199\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\059\000\122\001\066\000\199\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\007\000\205\000\082\000\123\001\000\000\ \\007\000\161\000\070\000\124\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\033\000\008\000\086\000\042\001\087\000\211\000\000\000\ \\148\000\125\001\000\000\ \\032\000\044\001\033\000\215\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\020\000\127\001\ \\025\000\011\000\026\000\010\000\027\000\126\001\000\000\ \\031\000\128\001\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\130\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\055\000\131\001\000\000\ \\015\000\133\001\000\000\ \\007\000\161\000\070\000\134\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\015\000\060\001\051\000\135\001\000\000\ \\000\000\ \\050\000\136\001\000\000\ \\005\000\138\001\000\000\ \\006\000\244\000\013\000\139\001\000\000\ \\000\000\ \\015\000\060\001\051\000\140\001\000\000\ \\031\000\141\001\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\142\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\007\000\161\000\070\000\144\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\079\000\143\001\000\000\ \\000\000\ \\000\000\ \\089\000\145\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\146\000\150\001\000\000\ \\146\000\151\001\000\000\ \\103\000\152\001\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\074\001\ \\084\000\073\001\090\000\154\001\000\000\ \\000\000\ \\000\000\ \\009\000\071\000\098\000\156\001\000\000\ \\101\000\157\001\103\000\152\001\000\000\ \\000\000\ \\008\000\115\000\014\000\093\001\112\000\159\001\000\000\ \\094\000\161\001\000\000\ \\009\000\000\001\095\000\163\001\096\000\254\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\167\001\110\000\166\001\000\000\ \\000\000\ \\000\000\ \\009\000\169\001\108\000\168\001\000\000\ \\000\000\ \\006\000\170\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\172\001\000\000\ \\000\000\ \\053\000\173\001\000\000\ \\000\000\ \\000\000\ \\006\000\174\001\000\000\ \\000\000\ \\000\000\ \\003\000\084\000\022\000\176\001\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\038\000\177\001\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\178\001\068\000\094\000\000\000\ \\069\000\113\001\000\000\ \\063\000\179\001\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\181\001\068\000\094\000\000\000\ \\063\000\182\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\046\000\183\001\000\000\ \\033\000\008\000\085\000\185\001\086\000\212\000\087\000\211\000\000\000\ \\000\000\ \\147\000\187\001\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\189\001\000\000\ \\000\000\ \\000\000\ \\015\000\142\000\054\000\190\001\000\000\ \\005\000\061\000\011\000\191\001\012\000\059\000\000\000\ \\000\000\ \\050\000\192\001\000\000\ \\000\000\ \\007\000\100\000\047\000\193\001\080\000\150\000\081\000\108\000\000\000\ \\053\000\194\001\000\000\ \\000\000\ \\050\000\195\001\000\000\ \\000\000\ \\077\000\197\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\199\001\000\000\ \\009\000\000\001\091\000\202\001\095\000\201\001\096\000\200\001\000\000\ \\009\000\000\001\091\000\204\001\095\000\203\001\096\000\200\001\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\033\000\008\000\ \\083\000\207\001\084\000\206\001\085\000\205\001\086\000\212\000\ \\087\000\211\000\000\000\ \\033\000\008\000\085\000\208\001\086\000\212\000\087\000\211\000\000\000\ \\033\000\008\000\085\000\209\001\086\000\212\000\087\000\211\000\000\000\ \\000\000\ \\007\000\100\000\080\000\210\001\081\000\108\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\211\001\081\000\108\000\000\000\ \\000\000\ \\006\000\244\000\013\000\167\001\110\000\212\001\000\000\ \\000\000\ \\009\000\000\001\095\000\214\001\096\000\254\000\000\000\ \\000\000\ \\009\000\000\001\095\000\218\001\096\000\217\001\129\000\216\001\000\000\ \\008\000\115\000\014\000\220\001\111\000\219\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\009\000\169\001\108\000\168\001\000\000\ \\116\000\222\001\000\000\ \\007\000\161\000\070\000\224\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\116\000\222\001\000\000\ \\126\000\226\001\000\000\ \\000\000\ \\005\000\230\001\123\000\229\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\194\000\005\000\193\000\061\000\232\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\045\000\233\001\080\000\109\000\081\000\108\000\000\000\ \\149\000\234\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\020\000\235\001\ \\025\000\011\000\026\000\010\000\027\000\126\001\000\000\ \\000\000\ \\148\000\237\001\000\000\ \\000\000\ \\000\000\ \\055\000\238\001\000\000\ \\000\000\ \\000\000\ \\052\000\239\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\250\000\075\000\241\001\000\000\ \\000\000\ \\089\000\242\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\147\000\248\001\000\000\ \\000\000\ \\006\000\244\000\013\000\250\001\000\000\ \\006\000\244\000\013\000\251\001\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\252\001\000\000\ \\000\000\ \\094\000\000\002\000\000\ \\000\000\ \\128\000\002\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\007\002\109\000\006\002\000\000\ \\000\000\ \\007\000\100\000\080\000\099\001\081\000\108\000\115\000\008\002\000\000\ \\114\000\009\002\000\000\ \\007\000\161\000\070\000\011\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\005\000\106\001\125\000\012\002\000\000\ \\005\000\230\001\123\000\013\002\000\000\ \\122\000\014\002\000\000\ \\053\000\016\002\000\000\ \\006\000\244\000\013\000\017\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\031\000\019\002\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\015\000\060\001\051\000\020\002\000\000\ \\000\000\ \\000\000\ \\092\000\021\002\103\000\152\001\000\000\ \\000\000\ \\009\000\000\001\095\000\023\002\096\000\254\000\000\000\ \\009\000\000\001\095\000\024\002\096\000\254\000\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\026\002\ \\084\000\206\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\134\000\029\002\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\033\002\000\000\ \\000\000\ \\009\000\000\001\095\000\035\002\096\000\254\000\000\000\ \\000\000\ \\008\000\091\001\127\000\036\002\000\000\ \\103\000\152\001\130\000\037\002\000\000\ \\008\000\115\000\014\000\220\001\111\000\039\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\005\000\101\001\113\000\041\002\000\000\ \\118\000\042\002\000\000\ \\000\000\ \\122\000\044\002\000\000\ \\000\000\ \\007\000\100\000\080\000\046\002\081\000\108\000\119\000\045\002\000\000\ \\124\000\047\002\000\000\ \\000\000\ \\000\000\ \\149\000\049\002\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\050\002\081\000\108\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\147\000\051\002\000\000\ \\007\000\161\000\070\000\052\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\007\000\161\000\070\000\053\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\010\000\074\000\133\000\054\002\000\000\ \\009\000\000\001\095\000\057\002\096\000\056\002\136\000\055\002\000\000\ \\009\000\000\001\095\000\059\002\096\000\056\002\136\000\058\002\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\060\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\062\002\081\000\108\000\000\000\ \\000\000\ \\006\000\244\000\013\000\007\002\109\000\063\002\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\065\002\081\000\108\000\117\000\064\002\000\000\ \\000\000\ \\000\000\ \\006\000\066\002\000\000\ \\000\000\ \\005\000\230\001\123\000\067\002\000\000\ \\000\000\ \\006\000\244\000\013\000\069\002\000\000\ \\000\000\ \\104\000\071\002\000\000\ \\099\000\074\002\102\000\073\002\104\000\071\002\000\000\ \\000\000\ \\000\000\ \\134\000\076\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\078\002\000\000\ \\006\000\244\000\013\000\079\002\000\000\ \\000\000\ \\000\000\ \\006\000\080\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\103\000\083\002\000\000\ \\000\000\ \\000\000\ \\009\000\071\000\098\000\156\001\101\000\084\002\103\000\083\002\000\000\ \\000\000\ \\103\000\152\001\137\000\085\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\005\000\230\001\123\000\088\002\000\000\ \\007\000\161\000\070\000\089\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\090\002\081\000\108\000\000\000\ \\007\000\161\000\070\000\091\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\122\000\092\002\000\000\ \\089\000\094\002\093\000\093\002\104\000\071\002\000\000\ \\006\000\244\000\013\000\096\002\000\000\ \\104\000\071\002\128\000\098\002\131\000\097\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\199\001\092\000\100\002\103\000\083\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\091\001\103\000\083\002\127\000\036\002\130\000\102\002\000\000\ \\000\000\ \\007\000\161\000\070\000\103\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\104\000\071\002\134\000\105\002\138\000\104\002\000\000\ \\000\000\ \\000\000\ \\010\000\074\000\103\000\083\002\133\000\054\002\137\000\107\002\000\000\ \\000\000\ \\000\000\ \" val numstates = 621 val numrules = 330 val s = ref "" and index = ref 0 val string_to_int = fn () => let val i = !index in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 end val string_to_list = fn s' => let val len = String.size s' fun f () = if !index < len then string_to_int() :: f() else nil in index := 0; s := s'; f () end val string_to_pairlist = fn (conv_key,conv_entry) => let fun f () = case string_to_int() of 0 => EMPTY | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) in f end val string_to_pairlist_default = fn (conv_key,conv_entry) => let val conv_row = string_to_pairlist(conv_key,conv_entry) in fn () => let val default = conv_entry(string_to_int()) val row = conv_row() in (row,default) end end val string_to_table = fn (convert_row,s') => let val len = String.size s' fun f ()= if !index < len then convert_row() :: f() else nil in (s := s'; index := 0; f ()) end local val memo = Array.array(numstates+numrules,ERROR) val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) fun f i = if i=numstates then g i else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) in f 0 handle Subscript => () end in val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) end val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) val actionRowNumbers = string_to_list actionRowNumbers val actionT = let val actionRowLookUp= let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end in Array.fromList(map actionRowLookUp actionRowNumbers) end in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, numStates=numstates,initialState=STATE 0} end end local open Header in type pos = int type arg = Infix.InfEnv structure MlyValue = struct datatype svalue = VOID | ntVOID of unit -> unit | LONGID of unit -> (string list*string) | ETYVAR of unit -> (string) | TYVAR of unit -> (string) | SYMBOL of unit -> (string) | ALPHA of unit -> (string) | CHAR of unit -> (char) | STRING of unit -> (string) | REAL of unit -> (real) | WORD of unit -> (word) | INT of unit -> (int) | NUMERIC of unit -> (int) | DIGIT of unit -> (int) | popLocalInfix of unit -> (unit) | pushLocalInfix of unit -> (unit) | popInfix of unit -> (unit) | pushInfix of unit -> (unit) | initInfix of unit -> (unit) | program_opt of unit -> (Program option) | program' of unit -> (Program) | program of unit -> (Program*Infix.InfEnv) | topdec_opt of unit -> (TopDec option) | topdec1 of unit -> (TopDec) | topdec of unit -> (TopDec) | AND_tyreadesc_opt__AND_funbind_opt of unit -> (TyReaDesc option*FunBind option) | tyreadesc__AND_funbind_opt of unit -> (TyReaDesc*FunBind option) | sigexp__AND_funbind_opt of unit -> (SigExp*FunBind option) | strexp__AND_funbind_opt of unit -> (StrExp*FunBind option) | AND_funbind_opt of unit -> (FunBind option) | funbind of unit -> (FunBind) | fundec of unit -> (FunDec) | AND_tyreadesc_opt__AND_strdesc_opt of unit -> (TyReaDesc option*StrDesc option) | tyreadesc__AND_strdesc_opt of unit -> (TyReaDesc*StrDesc option) | sigexp__AND_strdesc_opt of unit -> (SigExp*StrDesc option) | AND_strdesc_opt of unit -> (StrDesc option) | strdesc of unit -> (StrDesc) | AND_exdesc_opt of unit -> (ExDesc option) | exdesc of unit -> (ExDesc) | BAR_condesc_opt of unit -> (ConDesc option) | condesc of unit -> (ConDesc) | AND_datdesc_opt of unit -> (DatDesc option) | datdesc1 of unit -> (DatDesc) | datdesc0 of unit -> (DatDesc) | datdesc of unit -> (DatDesc) | AND_syndesc_opt of unit -> (SynDesc option) | syndesc of unit -> (SynDesc) | AND_typdesc_opt of unit -> (TypDesc option) | typdesc of unit -> (TypDesc) | AND_valdesc_opt of unit -> (ValDesc option) | valdesc of unit -> (ValDesc) | longstrid_EQUALS_list2 of unit -> (longStrId list) | longstrid_EQUALS_list1 of unit -> (longStrId list) | longtycon_EQUALS_list2 of unit -> (longTyCon list) | longtycon_EQUALS_list1 of unit -> (longTyCon list) | sigid_list2 of unit -> (SigId list) | spec1' of unit -> (Spec) | spec1 of unit -> (Spec) | spec of unit -> (Spec) | AND_tyreadesc_opt of unit -> (TyReaDesc option) | tyreadesc of unit -> (TyReaDesc) | AND_tyreadesc_opt__AND_sigbind_opt of unit -> (TyReaDesc option*SigBind option) | tyreadesc__AND_sigbind_opt of unit -> (TyReaDesc*SigBind option) | sigexp__AND_sigbind_opt of unit -> (SigExp*SigBind option) | AND_sigbind_opt of unit -> (SigBind option) | sigbind of unit -> (SigBind) | sigdec of unit -> (SigDec) | sigexp' of unit -> (SigExp) | sigexp of unit -> (SigExp) | COLON_sigexp_opt of unit -> (SigExp option) | AND_tyreadesc_opt__AND_strbind_opt of unit -> (TyReaDesc option*StrBind option) | tyreadesc__AND_strbind_opt of unit -> (TyReaDesc*StrBind option) | sigexp__AND_strbind_opt of unit -> (SigExp*StrBind option) | strexp__AND_strbind_opt of unit -> (StrExp*StrBind option) | AND_strbind_opt of unit -> (StrBind option) | strbind of unit -> (StrBind) | strdec1' of unit -> (StrDec) | strdec1 of unit -> (StrDec) | strdec of unit -> (StrDec) | strexp' of unit -> (StrExp) | strexp of unit -> (StrExp) | tyvar_COMMA_list1 of unit -> (TyVar list) | tyvarseq1 of unit -> (TyVarseq) | tyvarseq of unit -> (TyVarseq) | ty_COMMA_list2 of unit -> (Ty list) | tyseq of unit -> (Tyseq) | COMMA_tyrow_opt of unit -> (TyRow option) | tyrow_opt of unit -> (TyRow option) | tyrow of unit -> (TyRow) | atty of unit -> (Ty) | consty of unit -> (Ty) | ty_STAR_list of unit -> (Ty list) | tupty of unit -> (Ty) | ty of unit -> (Ty) | COLON_ty_list1 of unit -> (Ty list) | atpat_list2 of unit -> (AtPat list) | atpat_list1 of unit -> (AtPat list) | pat of unit -> (Pat) | AS_pat_opt of unit -> (Pat option) | COLON_ty_opt of unit -> (Ty option) | COMMA_patrow_opt of unit -> (PatRow option) | patrow_opt of unit -> (PatRow option) | patrow of unit -> (PatRow) | pat_COMMA_list2 of unit -> (Pat list) | pat_COMMA_list1 of unit -> (Pat list) | pat_COMMA_list0 of unit -> (Pat list) | atpat' of unit -> (AtPat) | atpat of unit -> (AtPat) | AND_exbind_opt of unit -> (ExBind option) | exbind of unit -> (ExBind) | OF_ty_opt of unit -> (Ty option) | BAR_conbind_opt of unit -> (ConBind option) | conbind of unit -> (ConBind) | AND_datbind_opt of unit -> (DatBind option) | datbind1 of unit -> (DatBind) | datbind0 of unit -> (DatBind) | datbind of unit -> (DatBind) | AND_typbind_opt of unit -> (TypBind option) | typbind of unit -> (TypBind) | fmrule of unit -> (Fmrule) | BAR_fmatch_opt of unit -> (Fmatch option) | fmatch of unit -> (Fmatch) | AND_fvalbind_opt of unit -> (FvalBind option) | fvalbind of unit -> (FvalBind) | AND_valbind_opt of unit -> (ValBind option) | valbind of unit -> (ValBind) | d_opt of unit -> (int) | longstrid_list1 of unit -> (longStrId list) | vid_list1 of unit -> (VId list) | WITHTYPE_typbind_opt of unit -> (TypBind option) | dec1' of unit -> (Dec) | dec1 of unit -> (Dec) | dec of unit -> (Dec) | mrule of unit -> (Mrule) | BAR_match_opt of unit -> (Match option) | match of unit -> (Match) | exp of unit -> (Exp) | infexp of unit -> (InfExp) | appexp of unit -> (AppExp) | COMMA_exprow_opt of unit -> (ExpRow option) | exprow_opt of unit -> (ExpRow option) | exprow of unit -> (ExpRow) | exp_SEMICOLON_list2 of unit -> (Exp list) | exp_SEMICOLON_list1 of unit -> (Exp list) | exp_COMMA_list2 of unit -> (Exp list) | exp_COMMA_list1 of unit -> (Exp list) | exp_COMMA_list0 of unit -> (Exp list) | atexp of unit -> (AtExp) | OP_opt of unit -> (Op) | longstrid of unit -> (longStrId) | longtycon of unit -> (longTyCon) | longvid' of unit -> (longVId) | longvid of unit -> (longVId) | funid of unit -> (FunId) | sigid of unit -> (SigId) | strid of unit -> (StrId) | tyvar of unit -> (TyVar) | tycon of unit -> (TyCon) | vid' of unit -> (VId) | vid of unit -> (VId) | lab of unit -> (Lab) | d of unit -> (int) | scon of unit -> (SCon) end type svalue = MlyValue.svalue type result = Program*Infix.InfEnv end structure EC= struct open LrTable val is_keyword = fn (T 1) => true | (T 2) => true | (T 3) => true | (T 4) => true | (T 5) => true | (T 6) => true | (T 7) => true | (T 8) => true | (T 9) => true | (T 10) => true | (T 11) => true | (T 12) => true | (T 13) => true | (T 14) => true | (T 15) => true | (T 16) => true | (T 17) => true | (T 18) => true | (T 19) => true | (T 20) => true | (T 21) => true | (T 22) => true | (T 23) => true | (T 24) => true | (T 25) => true | (T 26) => true | (T 27) => true | (T 28) => true | (T 29) => true | (T 30) => true | (T 31) => true | (T 32) => true | (T 49) => true | (T 50) => true | (T 51) => true | (T 52) => true | (T 53) => true | (T 54) => true | (T 55) => true | (T 56) => true | (T 57) => true | _ => false val preferred_change = nil val noShift = fn (T 0) => true | _ => false val showTerminal = fn (T 0) => "EOF" | (T 1) => "ABSTYPE" | (T 2) => "AND" | (T 3) => "ANDALSO" | (T 4) => "AS" | (T 5) => "CASE" | (T 6) => "DO" | (T 7) => "DATATYPE" | (T 8) => "ELSE" | (T 9) => "END" | (T 10) => "EXCEPTION" | (T 11) => "FN" | (T 12) => "FUN" | (T 13) => "HANDLE" | (T 14) => "IF" | (T 15) => "IN" | (T 16) => "INFIX" | (T 17) => "INFIXR" | (T 18) => "LET" | (T 19) => "LOCAL" | (T 20) => "NONFIX" | (T 21) => "OF" | (T 22) => "OP" | (T 23) => "OPEN" | (T 24) => "ORELSE" | (T 25) => "RAISE" | (T 26) => "REC" | (T 27) => "THEN" | (T 28) => "TYPE" | (T 29) => "VAL" | (T 30) => "WITH" | (T 31) => "WITHTYPE" | (T 32) => "WHILE" | (T 33) => "LPAR" | (T 34) => "RPAR" | (T 35) => "LBRACK" | (T 36) => "RBRACK" | (T 37) => "LBRACE" | (T 38) => "RBRACE" | (T 39) => "COMMA" | (T 40) => "COLON" | (T 41) => "SEMICOLON" | (T 42) => "DOTS" | (T 43) => "UNDERBAR" | (T 44) => "BAR" | (T 45) => "EQUALS" | (T 46) => "DARROW" | (T 47) => "ARROW" | (T 48) => "HASH" | (T 49) => "EQTYPE" | (T 50) => "FUNCTOR" | (T 51) => "INCLUDE" | (T 52) => "SHARING" | (T 53) => "SIG" | (T 54) => "SIGNATURE" | (T 55) => "STRUCT" | (T 56) => "STRUCTURE" | (T 57) => "WHERE" | (T 58) => "COLONGREATER" | (T 59) => "ZERO" | (T 60) => "DIGIT" | (T 61) => "NUMERIC" | (T 62) => "INT" | (T 63) => "WORD" | (T 64) => "REAL" | (T 65) => "STRING" | (T 66) => "CHAR" | (T 67) => "ALPHA" | (T 68) => "SYMBOL" | (T 69) => "STAR" | (T 70) => "TYVAR" | (T 71) => "ETYVAR" | (T 72) => "LONGID" | _ => "bogus-term" local open Header in val errtermvalue= fn _ => MlyValue.VOID end val terms = (T 0) :: (T 1) :: (T 2) :: (T 3) :: (T 4) :: (T 5) :: (T 6 ) :: (T 7) :: (T 8) :: (T 9) :: (T 10) :: (T 11) :: (T 12) :: (T 13) :: (T 14) :: (T 15) :: (T 16) :: (T 17) :: (T 18) :: (T 19) :: (T 20) :: (T 21) :: (T 22) :: (T 23) :: (T 24) :: (T 25) :: (T 26) :: (T 27) :: (T 28) :: (T 29) :: (T 30) :: (T 31) :: (T 32) :: (T 33) :: (T 34) :: (T 35) :: (T 36) :: (T 37) :: (T 38) :: (T 39) :: (T 40) :: (T 41) :: (T 42) :: (T 43) :: (T 44) :: (T 45) :: (T 46) :: (T 47) :: (T 48) :: (T 49) :: (T 50) :: (T 51) :: (T 52) :: (T 53) :: (T 54) :: (T 55) :: (T 56) :: (T 57) :: (T 58) :: (T 59) :: (T 69) :: nil end structure Actions = struct type int = Int.int exception mlyAction of int local open Header in val actions = fn (i392:int,defaultPos,stack, (J0):arg) => case (i392,stack) of (0,rest671) => let val result=MlyValue.initInfix(fn _ => ( initJandJ'(J0) )) in (LrTable.NT 144,(result,defaultPos,defaultPos),rest671) end | (1,rest671) => let val result=MlyValue.pushInfix(fn _ => ( pushJ() ) ) in (LrTable.NT 145,(result,defaultPos,defaultPos),rest671) end | (2,rest671) => let val result=MlyValue.popInfix(fn _ => ( popJ() )) in (LrTable.NT 146,(result,defaultPos,defaultPos),rest671) end | (3,rest671) => let val result=MlyValue.pushLocalInfix(fn _ => ( pushJ'shiftJ() )) in (LrTable.NT 147,(result,defaultPos,defaultPos),rest671) end | (4,rest671) => let val result=MlyValue.popLocalInfix(fn _ => ( popJandJ'() )) in (LrTable.NT 148,(result,defaultPos,defaultPos),rest671) end | (5,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.scon(fn _ => ( SCon.fromInt 0 )) in (LrTable.NT 0,(result,ZERO1left,ZERO1right),rest671) end | (6,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.scon(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( SCon.fromInt DIGIT ) end ) in (LrTable.NT 0,(result,DIGIT1left,DIGIT1right),rest671) end | (7,(_,(MlyValue.NUMERIC NUMERIC1,NUMERIC1left,NUMERIC1right)):: rest671) => let val result=MlyValue.scon(fn _ => let val NUMERIC as NUMERIC1=NUMERIC1 () in ( SCon.fromInt NUMERIC ) end ) in (LrTable.NT 0,(result,NUMERIC1left,NUMERIC1right),rest671) end | (8,(_,(MlyValue.INT INT1,INT1left,INT1right))::rest671) => let val result=MlyValue.scon(fn _ => let val INT as INT1=INT1 () in ( SCon.fromInt INT ) end ) in (LrTable.NT 0,(result,INT1left,INT1right),rest671) end | (9,(_,(MlyValue.WORD WORD1,WORD1left,WORD1right))::rest671) => let val result=MlyValue.scon(fn _ => let val WORD as WORD1=WORD1 () in ( SCon.fromWord WORD ) end ) in (LrTable.NT 0,(result,WORD1left,WORD1right),rest671) end | (10,(_,(MlyValue.STRING STRING1,STRING1left,STRING1right))::rest671) => let val result=MlyValue.scon(fn _ => let val STRING as STRING1= STRING1 () in ( SCon.fromString STRING ) end ) in (LrTable.NT 0,(result,STRING1left,STRING1right),rest671) end | (11,(_,(MlyValue.CHAR CHAR1,CHAR1left,CHAR1right))::rest671) => let val result=MlyValue.scon(fn _ => let val CHAR as CHAR1=CHAR1 () in ( SCon.fromChar CHAR ) end ) in (LrTable.NT 0,(result,CHAR1left,CHAR1right),rest671) end | (12,(_,(MlyValue.REAL REAL1,REAL1left,REAL1right))::rest671) => let val result=MlyValue.scon(fn _ => let val REAL as REAL1=REAL1 () in ( SCon.fromReal REAL ) end ) in (LrTable.NT 0,(result,REAL1left,REAL1right),rest671) end | (13,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.d(fn _ => ( 0 )) in (LrTable.NT 1,(result,ZERO1left,ZERO1right),rest671) end | (14,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.d(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( DIGIT ) end ) in (LrTable.NT 1,(result,DIGIT1left,DIGIT1right),rest671) end | (15,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.lab(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( Lab.fromString ALPHA ) end ) in (LrTable.NT 2,(result,ALPHA1left,ALPHA1right),rest671) end | (16,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.lab(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( Lab.fromString SYMBOL ) end ) in (LrTable.NT 2,(result,SYMBOL1left,SYMBOL1right),rest671) end | (17,(_,(_,STAR1left,STAR1right))::rest671) => let val result= MlyValue.lab(fn _ => ( Lab.fromString "*" )) in (LrTable.NT 2,(result,STAR1left,STAR1right),rest671) end | (18,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.lab(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( Lab.fromInt DIGIT ) end ) in (LrTable.NT 2,(result,DIGIT1left,DIGIT1right),rest671) end | (19,(_,(MlyValue.NUMERIC NUMERIC1,NUMERIC1left,NUMERIC1right)):: rest671) => let val result=MlyValue.lab(fn _ => let val NUMERIC as NUMERIC1=NUMERIC1 () in ( Lab.fromInt NUMERIC ) end ) in (LrTable.NT 2,(result,NUMERIC1left,NUMERIC1right),rest671) end | (20,(_,(MlyValue.vid' vid'1,vid'1left,vid'1right))::rest671) => let val result=MlyValue.vid(fn _ => let val vid' as vid'1=vid'1 () in ( vid' ) end ) in (LrTable.NT 3,(result,vid'1left,vid'1right),rest671) end | (21,(_,(_,EQUALS1left,EQUALS1right))::rest671) => let val result= MlyValue.vid(fn _ => ( VId.fromString "=" )) in (LrTable.NT 3,(result,EQUALS1left,EQUALS1right),rest671) end | (22,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.vid'(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( VId.fromString ALPHA ) end ) in (LrTable.NT 4,(result,ALPHA1left,ALPHA1right),rest671) end | (23,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.vid'(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( VId.fromString SYMBOL ) end ) in (LrTable.NT 4,(result,SYMBOL1left,SYMBOL1right),rest671) end | (24,(_,(_,STAR1left,STAR1right))::rest671) => let val result= MlyValue.vid'(fn _ => ( VId.fromString "*" )) in (LrTable.NT 4,(result,STAR1left,STAR1right),rest671) end | (25,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.tycon(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( TyCon.fromString ALPHA ) end ) in (LrTable.NT 5,(result,ALPHA1left,ALPHA1right),rest671) end | (26,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.tycon(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( TyCon.fromString SYMBOL ) end ) in (LrTable.NT 5,(result,SYMBOL1left,SYMBOL1right),rest671) end | (27,(_,(MlyValue.TYVAR TYVAR1,TYVAR1left,TYVAR1right))::rest671) => let val result=MlyValue.tyvar(fn _ => let val TYVAR as TYVAR1=TYVAR1 () in ( TyVar.fromString TYVAR ) end ) in (LrTable.NT 6,(result,TYVAR1left,TYVAR1right),rest671) end | (28,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.strid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( StrId.fromString ALPHA ) end ) in (LrTable.NT 7,(result,ALPHA1left,ALPHA1right),rest671) end | (29,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.sigid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( SigId.fromString ALPHA ) end ) in (LrTable.NT 8,(result,ALPHA1left,ALPHA1right),rest671) end | (30,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.funid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( FunId.fromString ALPHA ) end ) in (LrTable.NT 9,(result,ALPHA1left,ALPHA1right),rest671) end | (31,(_,(MlyValue.longvid' longvid'1,longvid'1left,longvid'1right)):: rest671) => let val result=MlyValue.longvid(fn _ => let val longvid' as longvid'1=longvid'1 () in ( longvid' ) end ) in (LrTable.NT 10,(result,longvid'1left,longvid'1right),rest671) end | (32,(_,(_,EQUALS1left,EQUALS1right))::rest671) => let val result= MlyValue.longvid(fn _ => ( LongVId.fromId(VId.fromString "=") )) in (LrTable.NT 10,(result,EQUALS1left,EQUALS1right),rest671) end | (33,(_,(MlyValue.vid' vid'1,vid'1left,vid'1right))::rest671) => let val result=MlyValue.longvid'(fn _ => let val vid' as vid'1=vid'1 () in ( LongVId.fromId vid' ) end ) in (LrTable.NT 11,(result,vid'1left,vid'1right),rest671) end | (34,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longvid'(fn _ => let val LONGID as LONGID1 =LONGID1 () in ( LongVId.implode(toLongId VId.fromString LONGID) ) end ) in (LrTable.NT 11,(result,LONGID1left,LONGID1right),rest671) end | (35,(_,(MlyValue.tycon tycon1,tycon1left,tycon1right))::rest671) => let val result=MlyValue.longtycon(fn _ => let val tycon as tycon1= tycon1 () in ( LongTyCon.fromId tycon ) end ) in (LrTable.NT 12,(result,tycon1left,tycon1right),rest671) end | (36,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longtycon(fn _ => let val LONGID as LONGID1=LONGID1 () in ( LongTyCon.implode(toLongId TyCon.fromString LONGID) ) end ) in (LrTable.NT 12,(result,LONGID1left,LONGID1right),rest671) end | (37,(_,(MlyValue.strid strid1,strid1left,strid1right))::rest671) => let val result=MlyValue.longstrid(fn _ => let val strid as strid1= strid1 () in ( LongStrId.fromId strid ) end ) in (LrTable.NT 13,(result,strid1left,strid1right),rest671) end | (38,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longstrid(fn _ => let val LONGID as LONGID1=LONGID1 () in ( LongStrId.implode(toLongId StrId.fromString LONGID) ) end ) in (LrTable.NT 13,(result,LONGID1left,LONGID1right),rest671) end | (39,(_,(_,OP1left,OP1right))::rest671) => let val result= MlyValue.OP_opt(fn _ => ( WITHOp )) in (LrTable.NT 14,(result,OP1left,OP1right),rest671) end | (40,rest671) => let val result=MlyValue.OP_opt(fn _ => ( SANSOp )) in (LrTable.NT 14,(result,defaultPos,defaultPos),rest671) end | (41,(_,(MlyValue.scon scon1,sconleft as scon1left,sconright as scon1right))::rest671) => let val result=MlyValue.atexp(fn _ => let val scon as scon1=scon1 () in ( SCONAtExp(I(sconleft,sconright), scon) ) end ) in (LrTable.NT 15,(result,scon1left,scon1right),rest671) end | (42,(_,(MlyValue.longvid longvid1,_,longvidright as longvid1right)) ::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val OP_opt as OP_opt1= OP_opt1 () val longvid as longvid1=longvid1 () in ( LONGVIDAtExp(I(OP_optleft,longvidright), OP_opt, longvid) ) end ) in (LrTable.NT 15,(result,OP_opt1left,longvid1right),rest671) end | (43,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.exprow_opt exprow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exprow_opt as exprow_opt1=exprow_opt1 () in ( RECORDAtExp(I(LBRACEleft,RBRACEright), exprow_opt) ) end ) in (LrTable.NT 15,(result,LBRACE1left,RBRACE1right),rest671) end | (44,(_,(MlyValue.lab lab1,_,labright as lab1right))::(_,(_,HASHleft as HASH1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val lab as lab1=lab1 () in ( HASHAtExp(I(HASHleft,labright), lab) ) end ) in (LrTable.NT 15,(result,HASH1left,lab1right),rest671) end | (45,(_,(_,_,RPARright as RPAR1right))::(_,(_,LPARleft as LPAR1left,_ ))::rest671) => let val result=MlyValue.atexp(fn _ => ( UNITAtExp(I(LPARleft,RPARright)) )) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (46,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.exp_COMMA_list2 exp_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exp_COMMA_list2 as exp_COMMA_list21=exp_COMMA_list21 () in ( TUPLEAtExp(I(LPARleft,RPARright), exp_COMMA_list2) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (47,(_,(_,_,RBRACKright as RBRACK1right))::(_,( MlyValue.exp_COMMA_list0 exp_COMMA_list01,_,_))::(_,(_,LBRACKleft as LBRACK1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exp_COMMA_list0 as exp_COMMA_list01=exp_COMMA_list01 () in ( LISTAtExp(I(LBRACKleft,RBRACKright), exp_COMMA_list0 )) end ) in (LrTable.NT 15,(result,LBRACK1left,RBRACK1right),rest671) end | (48,(_,(_,_,RPARright as RPAR1right))::(_,( MlyValue.exp_SEMICOLON_list2 exp_SEMICOLON_list21,_,_))::(_,(_, LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atexp( fn _ => let val exp_SEMICOLON_list2 as exp_SEMICOLON_list21= exp_SEMICOLON_list21 () in ( SEQAtExp(I(LPARleft,RPARright), exp_SEMICOLON_list2) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (49,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1 ,_,_))::(_,(MlyValue.exp_SEMICOLON_list1 exp_SEMICOLON_list11,_,_))::_ ::(_,(MlyValue.dec dec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_)) ::(_,(_,LETleft as LET1left,_))::rest671) => let val result= MlyValue.atexp(fn _ => let val pushInfix1=pushInfix1 () val dec as dec1=dec1 () val exp_SEMICOLON_list1 as exp_SEMICOLON_list11=exp_SEMICOLON_list11 () val popInfix1=popInfix1 () in ( LETAtExp(I(LETleft,ENDright), dec, exp_SEMICOLON_list1) ) end ) in (LrTable.NT 15,(result,LET1left,END1right),rest671) end | (50,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.exp exp1,_,_)):: (_,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atexp(fn _ => let val exp as exp1=exp1 () in ( PARAtExp(I(LPARleft,RPARright), exp) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (51,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11, exp_COMMA_list11left,exp_COMMA_list11right))::rest671) => let val result=MlyValue.exp_COMMA_list0(fn _ => let val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp_COMMA_list1 ) end ) in (LrTable.NT 16,(result,exp_COMMA_list11left,exp_COMMA_list11right) ,rest671) end | (52,rest671) => let val result=MlyValue.exp_COMMA_list0(fn _ => ( [] )) in (LrTable.NT 16,(result,defaultPos,defaultPos),rest671) end | (53,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11,_, exp_COMMA_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_COMMA_list1(fn _ => let val exp as exp1=exp1 () val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp::exp_COMMA_list1 ) end ) in (LrTable.NT 17,(result,exp1left,exp_COMMA_list11right),rest671) end | (54,(_,(MlyValue.exp exp1,exp1left,exp1right))::rest671) => let val result=MlyValue.exp_COMMA_list1(fn _ => let val exp as exp1=exp1 () in ( exp::[] ) end ) in (LrTable.NT 17,(result,exp1left,exp1right),rest671) end | (55,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11,_, exp_COMMA_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_COMMA_list2(fn _ => let val exp as exp1=exp1 () val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp::exp_COMMA_list1 ) end ) in (LrTable.NT 18,(result,exp1left,exp_COMMA_list11right),rest671) end | (56,(_,(MlyValue.exp_SEMICOLON_list1 exp_SEMICOLON_list11,_, exp_SEMICOLON_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_SEMICOLON_list1(fn _ => let val exp as exp1=exp1 () val exp_SEMICOLON_list1 as exp_SEMICOLON_list11=exp_SEMICOLON_list11 () in ( exp::exp_SEMICOLON_list1 ) end ) in (LrTable.NT 19,(result,exp1left,exp_SEMICOLON_list11right),rest671 ) end | (57,(_,(MlyValue.exp exp1,exp1left,exp1right))::rest671) => let val result=MlyValue.exp_SEMICOLON_list1(fn _ => let val exp as exp1=exp1 () in ( exp::[] ) end ) in (LrTable.NT 19,(result,exp1left,exp1right),rest671) end | (58,(_,(MlyValue.exp_SEMICOLON_list2 exp_SEMICOLON_list21,_, exp_SEMICOLON_list21right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_SEMICOLON_list2(fn _ => let val exp as exp1=exp1 () val exp_SEMICOLON_list2 as exp_SEMICOLON_list21=exp_SEMICOLON_list21 () in ( exp::exp_SEMICOLON_list2 ) end ) in (LrTable.NT 20,(result,exp1left,exp_SEMICOLON_list21right),rest671 ) end | (59,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp_SEMICOLON_list2( fn _ => let val exp1=exp1 () val exp2=exp2 () in ( [exp1, exp2] ) end ) in (LrTable.NT 20,(result,exp1left,exp2right),rest671) end | (60,(_,(MlyValue.COMMA_exprow_opt COMMA_exprow_opt1,_, COMMA_exprow_optright as COMMA_exprow_opt1right))::(_,(MlyValue.exp exp1,_,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.exprow(fn _ => let val lab as lab1=lab1 () val exp as exp1=exp1 () val COMMA_exprow_opt as COMMA_exprow_opt1=COMMA_exprow_opt1 () in ( ExpRow(I(lableft,COMMA_exprow_optright), lab, exp, COMMA_exprow_opt) ) end ) in (LrTable.NT 21,(result,lab1left,COMMA_exprow_opt1right),rest671) end | (61,(_,(MlyValue.exprow exprow1,_,exprow1right))::(_,(_,COMMA1left,_ ))::rest671) => let val result=MlyValue.COMMA_exprow_opt(fn _ => let val exprow as exprow1=exprow1 () in ( SOME exprow ) end ) in (LrTable.NT 23,(result,COMMA1left,exprow1right),rest671) end | (62,rest671) => let val result=MlyValue.COMMA_exprow_opt(fn _ => ( NONE )) in (LrTable.NT 23,(result,defaultPos,defaultPos),rest671) end | (63,(_,(MlyValue.exprow exprow1,exprow1left,exprow1right))::rest671) => let val result=MlyValue.exprow_opt(fn _ => let val exprow as exprow1=exprow1 () in ( SOME exprow ) end ) in (LrTable.NT 22,(result,exprow1left,exprow1right),rest671) end | (64,rest671) => let val result=MlyValue.exprow_opt(fn _ => ( NONE )) in (LrTable.NT 22,(result,defaultPos,defaultPos),rest671) end | (65,(_,(MlyValue.atexp atexp1,atexp1left,atexp1right))::rest671) => let val result=MlyValue.appexp(fn _ => let val atexp as atexp1=atexp1 () in ( atexp::[] ) end ) in (LrTable.NT 24,(result,atexp1left,atexp1right),rest671) end | (66,(_,(MlyValue.atexp atexp1,_,atexp1right))::(_,(MlyValue.appexp appexp1,appexp1left,_))::rest671) => let val result=MlyValue.appexp( fn _ => let val appexp as appexp1=appexp1 () val atexp as atexp1=atexp1 () in ( atexp::appexp ) end ) in (LrTable.NT 24,(result,appexp1left,atexp1right),rest671) end | (67,(_,(MlyValue.appexp appexp1,appexp1left,appexp1right))::rest671) => let val result=MlyValue.infexp(fn _ => let val appexp as appexp1= appexp1 () in ( Infix.parseExp(!J, List.rev appexp) ) end ) in (LrTable.NT 25,(result,appexp1left,appexp1right),rest671) end | (68,(_,(MlyValue.infexp infexp1,infexp1left,infexp1right))::rest671) => let val result=MlyValue.exp(fn _ => let val infexp as infexp1= infexp1 () in ( infexp ) end ) in (LrTable.NT 26,(result,infexp1left,infexp1right),rest671) end | (69,(_,(MlyValue.ty ty1,_,tyright as ty1right))::_::(_,(MlyValue.exp exp1,expleft as exp1left,_))::rest671) => let val result=MlyValue.exp (fn _ => let val exp as exp1=exp1 () val ty as ty1=ty1 () in ( TYPEDExp(I(expleft,tyright), exp, ty) ) end ) in (LrTable.NT 26,(result,exp1left,ty1right),rest671) end | (70,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( ANDALSOExp(I(exp1left,exp2right), exp1, exp2)) end ) in (LrTable.NT 26,(result,exp1left,exp2right),rest671) end | (71,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( ORELSEExp(I(exp1left,exp2right), exp1, exp2) ) end ) in (LrTable.NT 26,(result,exp1left,exp2right),rest671) end | (72,(_,(MlyValue.match match1,_,matchright as match1right))::_::(_,( MlyValue.exp exp1,expleft as exp1left,_))::rest671) => let val result= MlyValue.exp(fn _ => let val exp as exp1=exp1 () val match as match1=match1 () in ( HANDLEExp(I(expleft,matchright), exp, match) ) end ) in (LrTable.NT 26,(result,exp1left,match1right),rest671) end | (73,(_,(MlyValue.exp exp1,_,expright as exp1right))::(_,(_,RAISEleft as RAISE1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp as exp1=exp1 () in ( RAISEExp(I(RAISEleft,expright), exp) ) end ) in (LrTable.NT 26,(result,RAISE1left,exp1right),rest671) end | (74,(_,(MlyValue.exp exp3,_,exp3right))::_::(_,(MlyValue.exp exp2,_, _))::_::(_,(MlyValue.exp exp1,_,_))::(_,(_,IFleft as IF1left,_)):: rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () val exp3=exp3 () in ( IFExp(I(IFleft,exp3right), exp1, exp2, exp3) ) end ) in (LrTable.NT 26,(result,IF1left,exp3right),rest671) end | (75,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1,_, _))::(_,(_,WHILEleft as WHILE1left,_))::rest671) => let val result= MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( WHILEExp(I(WHILEleft,exp2right), exp1, exp2) ) end ) in (LrTable.NT 26,(result,WHILE1left,exp2right),rest671) end | (76,(_,(MlyValue.match match1,_,matchright as match1right))::_::(_,( MlyValue.exp exp1,_,_))::(_,(_,CASEleft as CASE1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp as exp1=exp1 () val match as match1=match1 () in ( CASEExp(I(CASEleft,matchright), exp, match) ) end ) in (LrTable.NT 26,(result,CASE1left,match1right),rest671) end | (77,(_,(MlyValue.match match1,_,matchright as match1right))::(_,(_, FNleft as FN1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val match as match1=match1 () in ( FNExp(I(FNleft,matchright), match) ) end ) in (LrTable.NT 26,(result,FN1left,match1right),rest671) end | (78,(_,(MlyValue.BAR_match_opt BAR_match_opt1,_,BAR_match_optright as BAR_match_opt1right))::(_,(MlyValue.mrule mrule1,mruleleft as mrule1left,_))::rest671) => let val result=MlyValue.match(fn _ => let val mrule as mrule1=mrule1 () val BAR_match_opt as BAR_match_opt1=BAR_match_opt1 () in ( Match(I(mruleleft,BAR_match_optright), mrule, BAR_match_opt) ) end ) in (LrTable.NT 27,(result,mrule1left,BAR_match_opt1right),rest671) end | (79,(_,(MlyValue.match match1,_,match1right))::(_,(_,BAR1left,_)):: rest671) => let val result=MlyValue.BAR_match_opt(fn _ => let val match as match1=match1 () in ( SOME match ) end ) in (LrTable.NT 28,(result,BAR1left,match1right),rest671) end | (80,rest671) => let val result=MlyValue.BAR_match_opt(fn _ => ( NONE )) in (LrTable.NT 28,(result,defaultPos,defaultPos),rest671) end | (81,(_,(MlyValue.exp exp1,_,expright as exp1right))::_::(_,( MlyValue.pat pat1,patleft as pat1left,_))::rest671) => let val result= MlyValue.mrule(fn _ => let val pat as pat1=pat1 () val exp as exp1=exp1 () in ( Mrule(I(patleft,expright), pat, exp) ) end ) in (LrTable.NT 29,(result,pat1left,exp1right),rest671) end | (82,(_,(MlyValue.dec1 dec11,dec11left,dec11right))::rest671) => let val result=MlyValue.dec(fn _ => let val dec1 as dec11=dec11 () in ( dec1 ) end ) in (LrTable.NT 30,(result,dec11left,dec11right),rest671) end | (83,rest671) => let val result=MlyValue.dec(fn _ => ( EMPTYDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 30,(result,defaultPos,defaultPos),rest671) end | (84,(_,(MlyValue.dec1' dec1'1,dec1'1left,dec1'1right))::rest671) => let val result=MlyValue.dec1(fn _ => let val dec1' as dec1'1=dec1'1 () in ( dec1' ) end ) in (LrTable.NT 31,(result,dec1'1left,dec1'1right),rest671) end | (85,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popLocalInfix popLocalInfix1,_,_))::(_,(MlyValue.dec dec2,_,_))::(_,( MlyValue.pushLocalInfix pushLocalInfix1,_,_))::_::(_,(MlyValue.dec dec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_))::(_,(_,LOCALleft as LOCAL1left,_))::rest671) => let val result=MlyValue.dec1(fn _ => let val pushInfix1=pushInfix1 () val dec1=dec1 () val pushLocalInfix1=pushLocalInfix1 () val dec2=dec2 () val popLocalInfix1=popLocalInfix1 () in ( LOCALDec(I(LOCALleft,ENDright), dec1, dec2) ) end ) in (LrTable.NT 31,(result,LOCAL1left,END1right),rest671) end | (86,(_,(MlyValue.dec1 dec12,_,dec12right))::(_,(MlyValue.dec1 dec11, dec11left,_))::rest671) => let val result=MlyValue.dec1(fn _ => let val dec11=dec11 () val dec12=dec12 () in ( SEQDec(I(dec11left,dec12right), dec11, dec12) ) end ) in (LrTable.NT 31,(result,dec11left,dec12right),rest671) end | (87,(_,(_,SEMICOLON1left,SEMICOLON1right))::rest671) => let val result=MlyValue.dec1(fn _ => ( EMPTYDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 31,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (88,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(_,VALleft as VAL1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val valbind as valbind1=valbind1 () in ( VALDec(I(VALleft,valbindright), TyVarseq(I(defaultPos,defaultPos), []), valbind) ) end ) in (LrTable.NT 32,(result,VAL1left,valbind1right),rest671) end | (89,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(MlyValue.tyvarseq1 tyvarseq11,_,_))::(_,(_,VALleft as VAL1left,_ ))::rest671) => let val result=MlyValue.dec1'(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val valbind as valbind1=valbind1 () in ( VALDec(I(VALleft,valbindright), tyvarseq1, valbind) ) end ) in (LrTable.NT 32,(result,VAL1left,valbind1right),rest671) end | (90,(_,(MlyValue.fvalbind fvalbind1,_,fvalbindright as fvalbind1right))::(_,(_,FUNleft as FUN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val fvalbind as fvalbind1=fvalbind1 () in ( FUNDec(I(FUNleft,fvalbindright), TyVarseq(I(defaultPos,defaultPos), []), fvalbind) ) end ) in (LrTable.NT 32,(result,FUN1left,fvalbind1right),rest671) end | (91,(_,(MlyValue.fvalbind fvalbind1,_,fvalbindright as fvalbind1right))::(_,(MlyValue.tyvarseq1 tyvarseq11,_,_))::(_,(_, FUNleft as FUN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val fvalbind as fvalbind1=fvalbind1 () in ( FUNDec(I(FUNleft,fvalbindright), tyvarseq1, fvalbind)) end ) in (LrTable.NT 32,(result,FUN1left,fvalbind1right),rest671) end | (92,(_,(MlyValue.typbind typbind1,_,typbindright as typbind1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val typbind as typbind1=typbind1 () in ( TYPEDec(I(TYPEleft,typbindright), typbind) ) end ) in (LrTable.NT 32,(result,TYPE1left,typbind1right),rest671) end | (93,(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_, WITHTYPE_typbind_optright as WITHTYPE_typbind_opt1right))::(_,( MlyValue.datbind0 datbind01,_,_))::(_,(_,DATATYPEleft as DATATYPE1left ,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind0 as datbind01=datbind01 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () in ( DATATYPEDec(I(DATATYPEleft,WITHTYPE_typbind_optright), datbind0, WITHTYPE_typbind_opt) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,WITHTYPE_typbind_opt1right), rest671) end | (94,(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_, WITHTYPE_typbind_optright as WITHTYPE_typbind_opt1right))::(_,( MlyValue.datbind1 datbind11,_,_))::(_,(_,DATATYPEleft as DATATYPE1left ,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind1 as datbind11=datbind11 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () in ( DATATYPEDec(I(DATATYPEleft,WITHTYPE_typbind_optright), datbind1, WITHTYPE_typbind_opt) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,WITHTYPE_typbind_opt1right), rest671) end | (95,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::_::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(_, DATATYPEleft as DATATYPE1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val tycon as tycon1=tycon1 () val longtycon as longtycon1=longtycon1 () in ( REPLICATIONDec(I(DATATYPEleft,longtyconright), tycon, longtycon) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,longtycon1right),rest671) end | (96,(_,(_,_,ENDright as END1right))::(_,(MlyValue.dec dec1,_,_))::_ ::(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_,_))::(_,( MlyValue.datbind datbind1,_,_))::(_,(_,ABSTYPEleft as ABSTYPE1left,_)) ::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind as datbind1=datbind1 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () val dec as dec1=dec1 () in ( ABSTYPEDec(I(ABSTYPEleft,ENDright), datbind, WITHTYPE_typbind_opt, dec) ) end ) in (LrTable.NT 32,(result,ABSTYPE1left,END1right),rest671) end | (97,(_,(MlyValue.exbind exbind1,_,exbindright as exbind1right))::(_, (_,EXCEPTIONleft as EXCEPTION1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val exbind as exbind1=exbind1 () in ( EXCEPTIONDec(I(EXCEPTIONleft,exbindright), exbind) ) end ) in (LrTable.NT 32,(result,EXCEPTION1left,exbind1right),rest671) end | (98,(_,(MlyValue.longstrid_list1 longstrid_list11,_, longstrid_list1right as longstrid_list11right))::(_,(_,OPENleft as OPEN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val longstrid_list1 as longstrid_list11=longstrid_list11 () in ( OPENDec(I(OPENleft,longstrid_list1right), longstrid_list1) ) end ) in (LrTable.NT 32,(result,OPEN1left,longstrid_list11right),rest671) end | (99,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(MlyValue.d_opt d_opt1,_,_))::(_,(_,INFIXleft as INFIX1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val d_opt as d_opt1=d_opt1 () val vid_list1 as vid_list11=vid_list11 () in ( assignInfix((Infix.LEFT, d_opt), vid_list1); EMPTYDec(I(INFIXleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,INFIX1left,vid_list11right),rest671) end | (100,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(MlyValue.d_opt d_opt1,_,_))::(_,(_,INFIXRleft as INFIXR1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val d_opt as d_opt1=d_opt1 () val vid_list1 as vid_list11=vid_list11 () in ( assignInfix((Infix.RIGHT, d_opt), vid_list1); EMPTYDec(I(INFIXRleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,INFIXR1left,vid_list11right),rest671) end | (101,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(_,NONFIXleft as NONFIX1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val vid_list1 as vid_list11= vid_list11 () in ( cancelInfix(vid_list1); EMPTYDec(I(NONFIXleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,NONFIX1left,vid_list11right),rest671) end | (102,(_,(MlyValue.typbind typbind1,_,typbind1right))::(_,(_, WITHTYPE1left,_))::rest671) => let val result= MlyValue.WITHTYPE_typbind_opt(fn _ => let val typbind as typbind1= typbind1 () in ( SOME typbind ) end ) in (LrTable.NT 33,(result,WITHTYPE1left,typbind1right),rest671) end | (103,rest671) => let val result=MlyValue.WITHTYPE_typbind_opt(fn _ => ( NONE )) in (LrTable.NT 33,(result,defaultPos,defaultPos),rest671) end | (104,(_,(MlyValue.vid_list1 vid_list11,_,vid_list11right))::(_,( MlyValue.vid vid1,vid1left,_))::rest671) => let val result= MlyValue.vid_list1(fn _ => let val vid as vid1=vid1 () val vid_list1 as vid_list11=vid_list11 () in ( vid::vid_list1 ) end ) in (LrTable.NT 34,(result,vid1left,vid_list11right),rest671) end | (105,(_,(MlyValue.vid vid1,vid1left,vid1right))::rest671) => let val result=MlyValue.vid_list1(fn _ => let val vid as vid1=vid1 () in ( vid::[] ) end ) in (LrTable.NT 34,(result,vid1left,vid1right),rest671) end | (106,(_,(MlyValue.longstrid_list1 longstrid_list11,_, longstrid_list11right))::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_list1(fn _ => let val longstrid as longstrid1= longstrid1 () val longstrid_list1 as longstrid_list11=longstrid_list11 () in ( longstrid::longstrid_list1 ) end ) in (LrTable.NT 35,(result,longstrid1left,longstrid_list11right), rest671) end | (107,(_,(MlyValue.longstrid longstrid1,longstrid1left, longstrid1right))::rest671) => let val result=MlyValue.longstrid_list1 (fn _ => let val longstrid as longstrid1=longstrid1 () in ( longstrid::[] ) end ) in (LrTable.NT 35,(result,longstrid1left,longstrid1right),rest671) end | (108,(_,(MlyValue.d d1,d1left,d1right))::rest671) => let val result= MlyValue.d_opt(fn _ => let val d as d1=d1 () in ( d ) end ) in (LrTable.NT 36,(result,d1left,d1right),rest671) end | (109,rest671) => let val result=MlyValue.d_opt(fn _ => ( 0 )) in (LrTable.NT 36,(result,defaultPos,defaultPos),rest671) end | (110,(_,(MlyValue.AND_valbind_opt AND_valbind_opt1,_, AND_valbind_optright as AND_valbind_opt1right))::(_,(MlyValue.exp exp1 ,_,_))::_::(_,(MlyValue.pat pat1,patleft as pat1left,_))::rest671) => let val result=MlyValue.valbind(fn _ => let val pat as pat1=pat1 () val exp as exp1=exp1 () val AND_valbind_opt as AND_valbind_opt1=AND_valbind_opt1 () in ( PLAINValBind(I(patleft,AND_valbind_optright), pat, exp, AND_valbind_opt) ) end ) in (LrTable.NT 37,(result,pat1left,AND_valbind_opt1right),rest671) end | (111,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(_,RECleft as REC1left,_))::rest671) => let val result= MlyValue.valbind(fn _ => let val valbind as valbind1=valbind1 () in ( RECValBind(I(RECleft,valbindright), valbind) ) end ) in (LrTable.NT 37,(result,REC1left,valbind1right),rest671) end | (112,(_,(MlyValue.valbind valbind1,_,valbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_valbind_opt(fn _ => let val valbind as valbind1=valbind1 () in ( SOME valbind ) end ) in (LrTable.NT 38,(result,AND1left,valbind1right),rest671) end | (113,rest671) => let val result=MlyValue.AND_valbind_opt(fn _ => ( NONE )) in (LrTable.NT 38,(result,defaultPos,defaultPos),rest671) end | (114,(_,(MlyValue.AND_fvalbind_opt AND_fvalbind_opt1,_, AND_fvalbind_optright as AND_fvalbind_opt1right))::(_,(MlyValue.fmatch fmatch1,fmatchleft as fmatch1left,_))::rest671) => let val result= MlyValue.fvalbind(fn _ => let val fmatch as fmatch1=fmatch1 () val AND_fvalbind_opt as AND_fvalbind_opt1=AND_fvalbind_opt1 () in ( FvalBind(I(fmatchleft,AND_fvalbind_optright), fmatch, AND_fvalbind_opt) ) end ) in (LrTable.NT 39,(result,fmatch1left,AND_fvalbind_opt1right),rest671 ) end | (115,(_,(MlyValue.fvalbind fvalbind1,_,fvalbind1right))::(_,(_, AND1left,_))::rest671) => let val result=MlyValue.AND_fvalbind_opt(fn _ => let val fvalbind as fvalbind1=fvalbind1 () in ( SOME fvalbind ) end ) in (LrTable.NT 40,(result,AND1left,fvalbind1right),rest671) end | (116,rest671) => let val result=MlyValue.AND_fvalbind_opt(fn _ => ( NONE )) in (LrTable.NT 40,(result,defaultPos,defaultPos),rest671) end | (117,(_,(MlyValue.BAR_fmatch_opt BAR_fmatch_opt1,_, BAR_fmatch_optright as BAR_fmatch_opt1right))::(_,(MlyValue.fmrule fmrule1,fmruleleft as fmrule1left,_))::rest671) => let val result= MlyValue.fmatch(fn _ => let val fmrule as fmrule1=fmrule1 () val BAR_fmatch_opt as BAR_fmatch_opt1=BAR_fmatch_opt1 () in ( Fmatch(I(fmruleleft,BAR_fmatch_optright), fmrule, BAR_fmatch_opt) ) end ) in (LrTable.NT 41,(result,fmrule1left,BAR_fmatch_opt1right),rest671) end | (118,(_,(MlyValue.fmatch fmatch1,_,fmatch1right))::(_,(_,BAR1left,_) )::rest671) => let val result=MlyValue.BAR_fmatch_opt(fn _ => let val fmatch as fmatch1=fmatch1 () in ( SOME fmatch ) end ) in (LrTable.NT 42,(result,BAR1left,fmatch1right),rest671) end | (119,rest671) => let val result=MlyValue.BAR_fmatch_opt(fn _ => ( NONE )) in (LrTable.NT 42,(result,defaultPos,defaultPos),rest671) end | (120,(_,(MlyValue.exp exp1,_,expright as exp1right))::_::(_,( MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.atpat_list1 atpat_list11,atpat_list1left as atpat_list11left,_))::rest671) => let val result=MlyValue.fmrule(fn _ => let val atpat_list1 as atpat_list11 =atpat_list11 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val exp as exp1=exp1 () in ( let val (op_opt, vid, atpats) = Infix.parseFmrule(!J, atpat_list1) in Fmrule(I(atpat_list1left,expright), op_opt, vid, atpats, COLON_ty_opt, exp) end ) end ) in (LrTable.NT 43,(result,atpat_list11left,exp1right),rest671) end | (121,(_,(MlyValue.AND_typbind_opt AND_typbind_opt1,_, AND_typbind_optright as AND_typbind_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.typbind(fn _ => let val tyvarseq as tyvarseq1= tyvarseq1 () val tycon as tycon1=tycon1 () val ty as ty1=ty1 () val AND_typbind_opt as AND_typbind_opt1=AND_typbind_opt1 () in ( TypBind(I(tyvarseqleft,AND_typbind_optright), tyvarseq, tycon, ty, AND_typbind_opt) ) end ) in (LrTable.NT 44,(result,tyvarseq1left,AND_typbind_opt1right), rest671) end | (122,(_,(MlyValue.typbind typbind1,_,typbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_typbind_opt(fn _ => let val typbind as typbind1=typbind1 () in ( SOME typbind ) end ) in (LrTable.NT 45,(result,AND1left,typbind1right),rest671) end | (123,rest671) => let val result=MlyValue.AND_typbind_opt(fn _ => ( NONE )) in (LrTable.NT 45,(result,defaultPos,defaultPos),rest671) end | (124,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671 ) => let val result=MlyValue.datbind(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyvarseqleft,AND_datbind_optright), tyvarseq, tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 46,(result,tyvarseq1left,AND_datbind_opt1right), rest671) end | (125,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,tyconleft as tycon1left,_ ))::rest671) => let val result=MlyValue.datbind0(fn _ => let val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyconleft,AND_datbind_optright), TyVarseq(I(defaultPos,defaultPos), []), tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 47,(result,tycon1left,AND_datbind_opt1right),rest671) end | (126,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq1 tyvarseq11,tyvarseq1left as tyvarseq11left,_)):: rest671) => let val result=MlyValue.datbind1(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyvarseq1left,AND_datbind_optright), tyvarseq1, tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 48,(result,tyvarseq11left,AND_datbind_opt1right), rest671) end | (127,(_,(MlyValue.datbind datbind1,_,datbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_datbind_opt(fn _ => let val datbind as datbind1=datbind1 () in ( SOME datbind ) end ) in (LrTable.NT 49,(result,AND1left,datbind1right),rest671) end | (128,rest671) => let val result=MlyValue.AND_datbind_opt(fn _ => ( NONE )) in (LrTable.NT 49,(result,defaultPos,defaultPos),rest671) end | (129,(_,(MlyValue.BAR_conbind_opt BAR_conbind_opt1,_, BAR_conbind_optright as BAR_conbind_opt1right))::(_,( MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_,_))::(_ ,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.conbind(fn _ => let val OP_opt as OP_opt1= OP_opt1 () val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val BAR_conbind_opt as BAR_conbind_opt1=BAR_conbind_opt1 () in ( ConBind(I(OP_optleft,BAR_conbind_optright), OP_opt, vid', OF_ty_opt, BAR_conbind_opt) ) end ) in (LrTable.NT 50,(result,OP_opt1left,BAR_conbind_opt1right),rest671) end | (130,(_,(MlyValue.conbind conbind1,_,conbind1right))::(_,(_,BAR1left ,_))::rest671) => let val result=MlyValue.BAR_conbind_opt(fn _ => let val conbind as conbind1=conbind1 () in ( SOME conbind ) end ) in (LrTable.NT 51,(result,BAR1left,conbind1right),rest671) end | (131,rest671) => let val result=MlyValue.BAR_conbind_opt(fn _ => ( NONE )) in (LrTable.NT 51,(result,defaultPos,defaultPos),rest671) end | (132,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,OF1left,_))::rest671) => let val result=MlyValue.OF_ty_opt(fn _ => let val ty as ty1=ty1 () in ( SOME ty ) end ) in (LrTable.NT 52,(result,OF1left,ty1right),rest671) end | (133,rest671) => let val result=MlyValue.OF_ty_opt(fn _ => ( NONE )) in (LrTable.NT 52,(result,defaultPos,defaultPos),rest671) end | (134,(_,(MlyValue.AND_exbind_opt AND_exbind_opt1,_, AND_exbind_optright as AND_exbind_opt1right))::(_,(MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_,_))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result= MlyValue.exbind(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val AND_exbind_opt as AND_exbind_opt1=AND_exbind_opt1 () in ( NEWExBind(I(OP_optleft,AND_exbind_optright), OP_opt, vid', OF_ty_opt, AND_exbind_opt) ) end ) in (LrTable.NT 53,(result,OP_opt1left,AND_exbind_opt1right),rest671) end | (135,(_,(MlyValue.AND_exbind_opt AND_exbind_opt1,_, AND_exbind_optright as AND_exbind_opt1right))::(_,(MlyValue.longvid longvid1,_,_))::(_,(MlyValue.OP_opt OP_opt2,_,_))::_::(_,( MlyValue.vid' vid'1,_,_))::(_,(MlyValue.OP_opt OP_opt1,OP_opt1left,_)) ::rest671) => let val result=MlyValue.exbind(fn _ => let val OP_opt1= OP_opt1 () val vid' as vid'1=vid'1 () val OP_opt2=OP_opt2 () val longvid as longvid1=longvid1 () val AND_exbind_opt as AND_exbind_opt1=AND_exbind_opt1 () in ( EQUALExBind(I(OP_opt1left,AND_exbind_optright), OP_opt1, vid', OP_opt2, longvid, AND_exbind_opt) ) end ) in (LrTable.NT 53,(result,OP_opt1left,AND_exbind_opt1right),rest671) end | (136,(_,(MlyValue.exbind exbind1,_,exbind1right))::(_,(_,AND1left,_) )::rest671) => let val result=MlyValue.AND_exbind_opt(fn _ => let val exbind as exbind1=exbind1 () in ( SOME exbind ) end ) in (LrTable.NT 54,(result,AND1left,exbind1right),rest671) end | (137,rest671) => let val result=MlyValue.AND_exbind_opt(fn _ => ( NONE )) in (LrTable.NT 54,(result,defaultPos,defaultPos),rest671) end | (138,(_,(MlyValue.atpat' atpat'1,atpat'1left,atpat'1right))::rest671 ) => let val result=MlyValue.atpat(fn _ => let val atpat' as atpat'1= atpat'1 () in ( atpat' ) end ) in (LrTable.NT 55,(result,atpat'1left,atpat'1right),rest671) end | (139,(_,(MlyValue.longvid' longvid'1,_,longvid'right as longvid'1right))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.atpat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val longvid' as longvid'1=longvid'1 () in ( LONGVIDAtPat(I(OP_optleft,longvid'right), OP_opt, longvid') ) end ) in (LrTable.NT 55,(result,OP_opt1left,longvid'1right),rest671) end | (140,(_,(_,UNDERBARleft as UNDERBAR1left,UNDERBARright as UNDERBAR1right))::rest671) => let val result=MlyValue.atpat'(fn _ => ( WILDCARDAtPat(I(UNDERBARleft,UNDERBARright)) )) in (LrTable.NT 56,(result,UNDERBAR1left,UNDERBAR1right),rest671) end | (141,(_,(MlyValue.scon scon1,sconleft as scon1left,sconright as scon1right))::rest671) => let val result=MlyValue.atpat'(fn _ => let val scon as scon1=scon1 () in ( SCONAtPat(I(sconleft,sconright), scon) ) end ) in (LrTable.NT 56,(result,scon1left,scon1right),rest671) end | (142,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.patrow_opt patrow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val patrow_opt as patrow_opt1=patrow_opt1 () in ( RECORDAtPat(I(LBRACEleft,RBRACEright), patrow_opt) ) end ) in (LrTable.NT 56,(result,LBRACE1left,RBRACE1right),rest671) end | (143,(_,(_,_,RPARright as RPAR1right))::(_,(_,LPARleft as LPAR1left, _))::rest671) => let val result=MlyValue.atpat'(fn _ => ( UNITAtPat(I(LPARleft,RPARright)) )) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (144,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.pat_COMMA_list2 pat_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val pat_COMMA_list2 as pat_COMMA_list21=pat_COMMA_list21 () in ( TUPLEAtPat(I(LPARleft,RPARright), pat_COMMA_list2) ) end ) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (145,(_,(_,_,RBRACKright as RBRACK1right))::(_,( MlyValue.pat_COMMA_list0 pat_COMMA_list01,_,_))::(_,(_,LBRACKleft as LBRACK1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val pat_COMMA_list0 as pat_COMMA_list01=pat_COMMA_list01 () in ( LISTAtPat(I(LBRACKleft,RBRACKright), pat_COMMA_list0) ) end ) in (LrTable.NT 56,(result,LBRACK1left,RBRACK1right),rest671) end | (146,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.pat pat1,_,_)) ::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atpat'(fn _ => let val pat as pat1=pat1 () in ( PARAtPat(I(LPARleft,RPARright), pat) ) end ) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (147,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11, pat_COMMA_list11left,pat_COMMA_list11right))::rest671) => let val result=MlyValue.pat_COMMA_list0(fn _ => let val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat_COMMA_list1 ) end ) in (LrTable.NT 57,(result,pat_COMMA_list11left,pat_COMMA_list11right) ,rest671) end | (148,rest671) => let val result=MlyValue.pat_COMMA_list0(fn _ => ( [] )) in (LrTable.NT 57,(result,defaultPos,defaultPos),rest671) end | (149,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11,_, pat_COMMA_list11right))::_::(_,(MlyValue.pat pat1,pat1left,_)):: rest671) => let val result=MlyValue.pat_COMMA_list1(fn _ => let val pat as pat1=pat1 () val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat::pat_COMMA_list1 ) end ) in (LrTable.NT 58,(result,pat1left,pat_COMMA_list11right),rest671) end | (150,(_,(MlyValue.pat pat1,pat1left,pat1right))::rest671) => let val result=MlyValue.pat_COMMA_list1(fn _ => let val pat as pat1=pat1 () in ( pat::[] ) end ) in (LrTable.NT 58,(result,pat1left,pat1right),rest671) end | (151,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11,_, pat_COMMA_list11right))::_::(_,(MlyValue.pat pat1,pat1left,_)):: rest671) => let val result=MlyValue.pat_COMMA_list2(fn _ => let val pat as pat1=pat1 () val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat::pat_COMMA_list1 ) end ) in (LrTable.NT 59,(result,pat1left,pat_COMMA_list11right),rest671) end | (152,(_,(_,DOTSleft as DOTS1left,DOTSright as DOTS1right))::rest671) => let val result=MlyValue.patrow(fn _ => ( WILDCARDPatRow(I(DOTSleft,DOTSright)) )) in (LrTable.NT 60,(result,DOTS1left,DOTS1right),rest671) end | (153,(_,(MlyValue.COMMA_patrow_opt COMMA_patrow_opt1,_, COMMA_patrow_optright as COMMA_patrow_opt1right))::(_,(MlyValue.pat pat1,_,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.patrow(fn _ => let val lab as lab1=lab1 () val pat as pat1=pat1 () val COMMA_patrow_opt as COMMA_patrow_opt1=COMMA_patrow_opt1 () in ( ROWPatRow(I(lableft,COMMA_patrow_optright), lab, pat, COMMA_patrow_opt) ) end ) in (LrTable.NT 60,(result,lab1left,COMMA_patrow_opt1right),rest671) end | (154,(_,(MlyValue.COMMA_patrow_opt COMMA_patrow_opt1,_, COMMA_patrow_optright as COMMA_patrow_opt1right))::(_,( MlyValue.AS_pat_opt AS_pat_opt1,_,_))::(_,(MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_)) ::rest671) => let val result=MlyValue.patrow(fn _ => let val vid' as vid'1=vid'1 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val AS_pat_opt as AS_pat_opt1=AS_pat_opt1 () val COMMA_patrow_opt as COMMA_patrow_opt1=COMMA_patrow_opt1 () in ( VIDPatRow(I(vid'left,COMMA_patrow_optright), vid', COLON_ty_opt, AS_pat_opt, COMMA_patrow_opt) ) end ) in (LrTable.NT 60,(result,vid'1left,COMMA_patrow_opt1right),rest671) end | (155,(_,(MlyValue.patrow patrow1,_,patrow1right))::(_,(_,COMMA1left, _))::rest671) => let val result=MlyValue.COMMA_patrow_opt(fn _ => let val patrow as patrow1=patrow1 () in ( SOME patrow ) end ) in (LrTable.NT 62,(result,COMMA1left,patrow1right),rest671) end | (156,rest671) => let val result=MlyValue.COMMA_patrow_opt(fn _ => ( NONE )) in (LrTable.NT 62,(result,defaultPos,defaultPos),rest671) end | (157,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,COLON1left,_))::rest671 ) => let val result=MlyValue.COLON_ty_opt(fn _ => let val ty as ty1= ty1 () in ( SOME ty ) end ) in (LrTable.NT 63,(result,COLON1left,ty1right),rest671) end | (158,rest671) => let val result=MlyValue.COLON_ty_opt(fn _ => ( NONE )) in (LrTable.NT 63,(result,defaultPos,defaultPos),rest671) end | (159,(_,(MlyValue.pat pat1,_,pat1right))::(_,(_,AS1left,_))::rest671 ) => let val result=MlyValue.AS_pat_opt(fn _ => let val pat as pat1= pat1 () in ( SOME pat ) end ) in (LrTable.NT 64,(result,AS1left,pat1right),rest671) end | (160,rest671) => let val result=MlyValue.AS_pat_opt(fn _ => ( NONE ) ) in (LrTable.NT 64,(result,defaultPos,defaultPos),rest671) end | (161,(_,(MlyValue.patrow patrow1,patrow1left,patrow1right))::rest671 ) => let val result=MlyValue.patrow_opt(fn _ => let val patrow as patrow1=patrow1 () in ( SOME patrow ) end ) in (LrTable.NT 61,(result,patrow1left,patrow1right),rest671) end | (162,rest671) => let val result=MlyValue.patrow_opt(fn _ => ( NONE ) ) in (LrTable.NT 61,(result,defaultPos,defaultPos),rest671) end | (163,(_,(MlyValue.atpat atpat1,atpat1left,atpat1right))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat as atpat1=atpat1 () in ( Infix.parsePat(!J, [atpat]) ) end ) in (LrTable.NT 65,(result,atpat1left,atpat1right),rest671) end | (164,(_,(MlyValue.atpat_list2 atpat_list21,atpat_list21left, atpat_list21right))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat_list2 as atpat_list21=atpat_list21 () in ( Infix.parsePat(!J, atpat_list2) ) end ) in (LrTable.NT 65,(result,atpat_list21left,atpat_list21right),rest671 ) end | (165,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.atpat' atpat'1,atpat'1left,_)):: rest671) => let val result=MlyValue.pat(fn _ => let val atpat' as atpat'1=atpat'1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val pat = Infix.parsePat(!J, [atpat']) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,atpat'1left,COLON_ty_list11right),rest671) end | (166,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.atpat_list2 atpat_list21, atpat_list21left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat_list2 as atpat_list21=atpat_list21 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val pat = Infix.parsePat(!J, atpat_list2) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,atpat_list21left,COLON_ty_list11right), rest671) end | (167,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.vid' vid'1,_,vid'right))::(_,( MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val atpat = LONGVIDAtPat(I(OP_optleft,vid'right), OP_opt, LongVId.fromId vid') val pat = Infix.parsePat(!J, [atpat]) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,OP_opt1left,COLON_ty_list11right),rest671) end | (168,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.LONGID LONGID1,_,LONGIDright))::( _,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val LONGID as LONGID1=LONGID1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val longvid = LongVId.implode (toLongId VId.fromString LONGID) val atpat = LONGVIDAtPat(I(OP_optleft,LONGIDright), OP_opt, longvid) val pat = Infix.parsePat(!J, [atpat]) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,OP_opt1left,COLON_ty_list11right),rest671) end | (169,(_,(MlyValue.pat pat1,_,patright as pat1right))::_::(_,( MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_, vid'right))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_)) ::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val pat as pat1=pat1 () in ( Infix.parsePat(!J, [ LONGVIDAtPat(I(OP_optleft,vid'right), OP_opt, LongVId.implode([],vid')) ] ) ; ASPat(I(OP_optleft,patright), OP_opt, vid', COLON_ty_opt, pat) ) end ) in (LrTable.NT 65,(result,OP_opt1left,pat1right),rest671) end | (170,(_,(MlyValue.atpat_list1 atpat_list11,_,atpat_list11right))::(_ ,(MlyValue.atpat atpat1,atpat1left,_))::rest671) => let val result= MlyValue.atpat_list1(fn _ => let val atpat as atpat1=atpat1 () val atpat_list1 as atpat_list11=atpat_list11 () in ( atpat::atpat_list1 ) end ) in (LrTable.NT 66,(result,atpat1left,atpat_list11right),rest671) end | (171,(_,(MlyValue.atpat atpat1,atpat1left,atpat1right))::rest671) => let val result=MlyValue.atpat_list1(fn _ => let val atpat as atpat1=atpat1 () in ( atpat::[] ) end ) in (LrTable.NT 66,(result,atpat1left,atpat1right),rest671) end | (172,(_,(MlyValue.atpat_list1 atpat_list11,_,atpat_list11right))::(_ ,(MlyValue.atpat atpat1,atpat1left,_))::rest671) => let val result= MlyValue.atpat_list2(fn _ => let val atpat as atpat1=atpat1 () val atpat_list1 as atpat_list11=atpat_list11 () in ( atpat::atpat_list1 ) end ) in (LrTable.NT 67,(result,atpat1left,atpat_list11right),rest671) end | (173,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.ty ty1,_,_))::(_,(_,COLON1left,_) )::rest671) => let val result=MlyValue.COLON_ty_list1(fn _ => let val ty as ty1=ty1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( ty::COLON_ty_list1 ) end ) in (LrTable.NT 68,(result,COLON1left,COLON_ty_list11right),rest671) end | (174,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,COLON1left,_))::rest671 ) => let val result=MlyValue.COLON_ty_list1(fn _ => let val ty as ty1= ty1 () in ( ty::[] ) end ) in (LrTable.NT 68,(result,COLON1left,ty1right),rest671) end | (175,(_,(MlyValue.tupty tupty1,tupty1left,tupty1right))::rest671) => let val result=MlyValue.ty(fn _ => let val tupty as tupty1=tupty1 () in ( tupty ) end ) in (LrTable.NT 69,(result,tupty1left,tupty1right),rest671) end | (176,(_,(MlyValue.ty ty1,_,tyright as ty1right))::_::(_,( MlyValue.tupty tupty1,tuptyleft as tupty1left,_))::rest671) => let val result=MlyValue.ty(fn _ => let val tupty as tupty1=tupty1 () val ty as ty1=ty1 () in ( ARROWTy(I(tuptyleft,tyright), tupty, ty) ) end ) in (LrTable.NT 69,(result,tupty1left,ty1right),rest671) end | (177,(_,(MlyValue.ty_STAR_list ty_STAR_list1,ty_STAR_listleft as ty_STAR_list1left,ty_STAR_listright as ty_STAR_list1right))::rest671) => let val result=MlyValue.tupty(fn _ => let val ty_STAR_list as ty_STAR_list1=ty_STAR_list1 () in ( TUPLETy(I(ty_STAR_listleft,ty_STAR_listright), ty_STAR_list) ) end ) in (LrTable.NT 70,(result,ty_STAR_list1left,ty_STAR_list1right), rest671) end | (178,(_,(MlyValue.ty_STAR_list ty_STAR_list1,_,ty_STAR_list1right)) ::_::(_,(MlyValue.consty consty1,consty1left,_))::rest671) => let val result=MlyValue.ty_STAR_list(fn _ => let val consty as consty1=consty1 () val ty_STAR_list as ty_STAR_list1=ty_STAR_list1 () in ( consty::ty_STAR_list ) end ) in (LrTable.NT 71,(result,consty1left,ty_STAR_list1right),rest671) end | (179,(_,(MlyValue.consty consty1,consty1left,consty1right))::rest671 ) => let val result=MlyValue.ty_STAR_list(fn _ => let val consty as consty1=consty1 () in ( consty::[] ) end ) in (LrTable.NT 71,(result,consty1left,consty1right),rest671) end | (180,(_,(MlyValue.atty atty1,atty1left,atty1right))::rest671) => let val result=MlyValue.consty(fn _ => let val atty as atty1=atty1 () in ( atty ) end ) in (LrTable.NT 72,(result,atty1left,atty1right),rest671) end | (181,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::(_,(MlyValue.tyseq tyseq1,tyseqleft as tyseq1left,_ ))::rest671) => let val result=MlyValue.consty(fn _ => let val tyseq as tyseq1=tyseq1 () val longtycon as longtycon1=longtycon1 () in ( TYCONTy(I(tyseqleft,longtyconright), tyseq, longtycon) ) end ) in (LrTable.NT 72,(result,tyseq1left,longtycon1right),rest671) end | (182,(_,(MlyValue.tyvar tyvar1,tyvarleft as tyvar1left,tyvarright as tyvar1right))::rest671) => let val result=MlyValue.atty(fn _ => let val tyvar as tyvar1=tyvar1 () in ( TYVARTy(I(tyvarleft,tyvarright), tyvar) ) end ) in (LrTable.NT 73,(result,tyvar1left,tyvar1right),rest671) end | (183,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.tyrow_opt tyrow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atty(fn _ => let val tyrow_opt as tyrow_opt1= tyrow_opt1 () in ( RECORDTy(I(LBRACEleft,RBRACEright), tyrow_opt) ) end ) in (LrTable.NT 73,(result,LBRACE1left,RBRACE1right),rest671) end | (184,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.ty ty1,_,_))::( _,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atty(fn _ => let val ty as ty1=ty1 () in ( PARTy(I(LPARleft,RPARright), ty) ) end ) in (LrTable.NT 73,(result,LPAR1left,RPAR1right),rest671) end | (185,(_,(MlyValue.COMMA_tyrow_opt COMMA_tyrow_opt1,_, COMMA_tyrow_optright as COMMA_tyrow_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.tyrow(fn _ => let val lab as lab1=lab1 () val ty as ty1=ty1 () val COMMA_tyrow_opt as COMMA_tyrow_opt1=COMMA_tyrow_opt1 () in ( TyRow(I(lableft,COMMA_tyrow_optright), lab, ty, COMMA_tyrow_opt) ) end ) in (LrTable.NT 74,(result,lab1left,COMMA_tyrow_opt1right),rest671) end | (186,(_,(MlyValue.tyrow tyrow1,_,tyrow1right))::(_,(_,COMMA1left,_)) ::rest671) => let val result=MlyValue.COMMA_tyrow_opt(fn _ => let val tyrow as tyrow1=tyrow1 () in ( SOME tyrow ) end ) in (LrTable.NT 76,(result,COMMA1left,tyrow1right),rest671) end | (187,rest671) => let val result=MlyValue.COMMA_tyrow_opt(fn _ => ( NONE )) in (LrTable.NT 76,(result,defaultPos,defaultPos),rest671) end | (188,(_,(MlyValue.tyrow tyrow1,tyrow1left,tyrow1right))::rest671) => let val result=MlyValue.tyrow_opt(fn _ => let val tyrow as tyrow1= tyrow1 () in ( SOME tyrow ) end ) in (LrTable.NT 75,(result,tyrow1left,tyrow1right),rest671) end | (189,rest671) => let val result=MlyValue.tyrow_opt(fn _ => ( NONE )) in (LrTable.NT 75,(result,defaultPos,defaultPos),rest671) end | (190,(_,(MlyValue.consty consty1,constyleft as consty1left, constyright as consty1right))::rest671) => let val result= MlyValue.tyseq(fn _ => let val consty as consty1=consty1 () in ( Tyseq(I(constyleft,constyright), [consty]) ) end ) in (LrTable.NT 77,(result,consty1left,consty1right),rest671) end | (191,rest671) => let val result=MlyValue.tyseq(fn _ => ( Tyseq(I(defaultPos,defaultPos), []) )) in (LrTable.NT 77,(result,defaultPos,defaultPos),rest671) end | (192,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.ty_COMMA_list2 ty_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.tyseq(fn _ => let val ty_COMMA_list2 as ty_COMMA_list21=ty_COMMA_list21 () in ( Tyseq(I(LPARleft,RPARright), ty_COMMA_list2) ) end ) in (LrTable.NT 77,(result,LPAR1left,RPAR1right),rest671) end | (193,(_,(MlyValue.ty_COMMA_list2 ty_COMMA_list21,_, ty_COMMA_list21right))::_::(_,(MlyValue.ty ty1,ty1left,_))::rest671) => let val result=MlyValue.ty_COMMA_list2(fn _ => let val ty as ty1= ty1 () val ty_COMMA_list2 as ty_COMMA_list21=ty_COMMA_list21 () in ( ty::ty_COMMA_list2 ) end ) in (LrTable.NT 78,(result,ty1left,ty_COMMA_list21right),rest671) end | (194,(_,(MlyValue.ty ty2,_,ty2right))::_::(_,(MlyValue.ty ty1, ty1left,_))::rest671) => let val result=MlyValue.ty_COMMA_list2(fn _ => let val ty1=ty1 () val ty2=ty2 () in ( [ty1, ty2] ) end ) in (LrTable.NT 78,(result,ty1left,ty2right),rest671) end | (195,(_,(MlyValue.tyvarseq1 tyvarseq11,tyvarseq11left, tyvarseq11right))::rest671) => let val result=MlyValue.tyvarseq(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () in ( tyvarseq1 ) end ) in (LrTable.NT 79,(result,tyvarseq11left,tyvarseq11right),rest671) end | (196,rest671) => let val result=MlyValue.tyvarseq(fn _ => ( TyVarseq(I(defaultPos,defaultPos), []) )) in (LrTable.NT 79,(result,defaultPos,defaultPos),rest671) end | (197,(_,(MlyValue.tyvar tyvar1,tyvarleft as tyvar1left,tyvarright as tyvar1right))::rest671) => let val result=MlyValue.tyvarseq1(fn _ => let val tyvar as tyvar1=tyvar1 () in ( TyVarseq(I(tyvarleft,tyvarright), [tyvar]) ) end ) in (LrTable.NT 80,(result,tyvar1left,tyvar1right),rest671) end | (198,(_,(_,_,RPARright as RPAR1right))::(_,( MlyValue.tyvar_COMMA_list1 tyvar_COMMA_list11,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.tyvarseq1(fn _ => let val tyvar_COMMA_list1 as tyvar_COMMA_list11=tyvar_COMMA_list11 () in ( TyVarseq(I(LPARleft,RPARright), tyvar_COMMA_list1) ) end ) in (LrTable.NT 80,(result,LPAR1left,RPAR1right),rest671) end | (199,(_,(MlyValue.tyvar_COMMA_list1 tyvar_COMMA_list11,_, tyvar_COMMA_list11right))::_::(_,(MlyValue.tyvar tyvar1,tyvar1left,_)) ::rest671) => let val result=MlyValue.tyvar_COMMA_list1(fn _ => let val tyvar as tyvar1=tyvar1 () val tyvar_COMMA_list1 as tyvar_COMMA_list11=tyvar_COMMA_list11 () in ( tyvar::tyvar_COMMA_list1 ) end ) in (LrTable.NT 81,(result,tyvar1left,tyvar_COMMA_list11right),rest671 ) end | (200,(_,(MlyValue.tyvar tyvar1,tyvar1left,tyvar1right))::rest671) => let val result=MlyValue.tyvar_COMMA_list1(fn _ => let val tyvar as tyvar1=tyvar1 () in ( tyvar::[] ) end ) in (LrTable.NT 81,(result,tyvar1left,tyvar1right),rest671) end | (201,(_,(MlyValue.strexp' strexp'1,strexp'1left,strexp'1right)):: rest671) => let val result=MlyValue.strexp(fn _ => let val strexp' as strexp'1=strexp'1 () in ( strexp' ) end ) in (LrTable.NT 82,(result,strexp'1left,strexp'1right),rest671) end | (202,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::_ ::(_,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp(fn _ => let val strexp as strexp1= strexp1 () val sigexp as sigexp1=sigexp1 () in ( TRANSStrExp(I(strexpleft,sigexpright), strexp, sigexp) ) end ) in (LrTable.NT 82,(result,strexp1left,sigexp1right),rest671) end | (203,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::_ ::(_,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp(fn _ => let val strexp as strexp1= strexp1 () val sigexp as sigexp1=sigexp1 () in ( OPAQStrExp(I(strexpleft,sigexpright), strexp, sigexp)) end ) in (LrTable.NT 82,(result,strexp1left,sigexp1right),rest671) end | (204,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1,_,_))::(_,(MlyValue.strdec strdec1,_,_))::(_,( MlyValue.pushInfix pushInfix1,_,_))::(_,(_,STRUCTleft as STRUCT1left,_ ))::rest671) => let val result=MlyValue.strexp'(fn _ => let val pushInfix1=pushInfix1 () val strdec as strdec1=strdec1 () val popInfix1=popInfix1 () in ( STRUCTStrExp(I(STRUCTleft,ENDright), strdec) ) end ) in (LrTable.NT 83,(result,STRUCT1left,END1right),rest671) end | (205,(_,(MlyValue.longstrid longstrid1,longstridleft as longstrid1left,longstridright as longstrid1right))::rest671) => let val result=MlyValue.strexp'(fn _ => let val longstrid as longstrid1= longstrid1 () in ( LONGSTRIDStrExp(I(longstridleft,longstridright), longstrid) ) end ) in (LrTable.NT 83,(result,longstrid1left,longstrid1right),rest671) end | (206,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.strexp strexp1, _,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_)):: rest671) => let val result=MlyValue.strexp'(fn _ => let val funid as funid1=funid1 () val strexp as strexp1=strexp1 () in ( APPStrExp(I(funidleft,RPARright), funid, strexp) ) end ) in (LrTable.NT 83,(result,funid1left,RPAR1right),rest671) end | (207,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.strdec strdec1, _,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_)):: rest671) => let val result=MlyValue.strexp'(fn _ => let val funid as funid1=funid1 () val strdec as strdec1=strdec1 () in ( APPDECStrExp(I(funidleft,RPARright), funid, strdec) ) end ) in (LrTable.NT 83,(result,funid1left,RPAR1right),rest671) end | (208,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1,_,_))::(_,(MlyValue.strexp strexp1,_,_))::_::(_,( MlyValue.strdec strdec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_)) ::(_,(_,LETleft as LET1left,_))::rest671) => let val result= MlyValue.strexp'(fn _ => let val pushInfix1=pushInfix1 () val strdec as strdec1=strdec1 () val strexp as strexp1=strexp1 () val popInfix1=popInfix1 () in ( LETStrExp(I(LETleft,ENDright), strdec, strexp) ) end ) in (LrTable.NT 83,(result,LET1left,END1right),rest671) end | (209,(_,(MlyValue.strdec1 strdec11,strdec11left,strdec11right)):: rest671) => let val result=MlyValue.strdec(fn _ => let val strdec1 as strdec11=strdec11 () in ( strdec1 ) end ) in (LrTable.NT 84,(result,strdec11left,strdec11right),rest671) end | (210,rest671) => let val result=MlyValue.strdec(fn _ => ( EMPTYStrDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 84,(result,defaultPos,defaultPos),rest671) end | (211,(_,(MlyValue.strdec1' strdec1'1,strdec1'1left,strdec1'1right)) ::rest671) => let val result=MlyValue.strdec1(fn _ => let val strdec1' as strdec1'1=strdec1'1 () in ( strdec1' ) end ) in (LrTable.NT 85,(result,strdec1'1left,strdec1'1right),rest671) end | (212,(_,(MlyValue.strdec1 strdec12,_,strdec12right))::(_,( MlyValue.strdec1 strdec11,strdec11left,_))::rest671) => let val result =MlyValue.strdec1(fn _ => let val strdec11=strdec11 () val strdec12=strdec12 () in ( SEQStrDec(I(strdec11left,strdec12right), strdec11, strdec12) ) end ) in (LrTable.NT 85,(result,strdec11left,strdec12right),rest671) end | (213,(_,(_,SEMICOLONleft as SEMICOLON1left,SEMICOLONright as SEMICOLON1right))::rest671) => let val result=MlyValue.strdec1(fn _ => ( EMPTYStrDec(I(SEMICOLONleft,SEMICOLONright)) )) in (LrTable.NT 85,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (214,(_,(MlyValue.dec1' dec1'1,dec1'left as dec1'1left,dec1'right as dec1'1right))::rest671) => let val result=MlyValue.strdec1'(fn _ => let val dec1' as dec1'1=dec1'1 () in ( DECStrDec(I(dec1'left,dec1'right), dec1') ) end ) in (LrTable.NT 86,(result,dec1'1left,dec1'1right),rest671) end | (215,(_,(MlyValue.strbind strbind1,_,strbindright as strbind1right)) ::(_,(_,STRUCTUREleft as STRUCTURE1left,_))::rest671) => let val result=MlyValue.strdec1'(fn _ => let val strbind as strbind1=strbind1 () in ( STRUCTUREStrDec(I(STRUCTUREleft,strbindright), strbind) ) end ) in (LrTable.NT 86,(result,STRUCTURE1left,strbind1right),rest671) end | (216,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popLocalInfix popLocalInfix1,_,_))::(_,(MlyValue.strdec strdec2,_,_))::(_,( MlyValue.pushLocalInfix pushLocalInfix1,_,_))::_::(_,(MlyValue.strdec strdec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_))::(_,(_, LOCALleft as LOCAL1left,_))::rest671) => let val result= MlyValue.strdec1'(fn _ => let val pushInfix1=pushInfix1 () val strdec1=strdec1 () val pushLocalInfix1=pushLocalInfix1 () val strdec2=strdec2 () val popLocalInfix1=popLocalInfix1 () in ( LOCALStrDec(I(LOCALleft,ENDright), strdec1, strdec2) ) end ) in (LrTable.NT 86,(result,LOCAL1left,END1right),rest671) end | (217,(_,(MlyValue.strexp__AND_strbind_opt strexp__AND_strbind_opt1,_ ,strexp__AND_strbind_optright as strexp__AND_strbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::(_,( MlyValue.strid strid1,stridleft as strid1left,_))::rest671) => let val result=MlyValue.strbind(fn _ => let val strid as strid1=strid1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_strbind_opt as strexp__AND_strbind_opt1= strexp__AND_strbind_opt1 () in ( TRANSStrBind(I(stridleft, strexp__AND_strbind_optright), strid, COLON_sigexp_opt, #1 strexp__AND_strbind_opt, #2 strexp__AND_strbind_opt) ) end ) in (LrTable.NT 87,(result,strid1left,strexp__AND_strbind_opt1right), rest671) end | (218,(_,(MlyValue.strexp__AND_strbind_opt strexp__AND_strbind_opt1,_ ,strexp__AND_strbind_optright as strexp__AND_strbind_opt1right))::_::( _,(MlyValue.sigexp sigexp1,_,_))::_::(_,(MlyValue.strid strid1, stridleft as strid1left,_))::rest671) => let val result= MlyValue.strbind(fn _ => let val strid as strid1=strid1 () val sigexp as sigexp1=sigexp1 () val strexp__AND_strbind_opt as strexp__AND_strbind_opt1= strexp__AND_strbind_opt1 () in ( OPAQStrBind(I(stridleft,strexp__AND_strbind_optright), strid, sigexp, #1 strexp__AND_strbind_opt, #2 strexp__AND_strbind_opt) ) end ) in (LrTable.NT 87,(result,strid1left,strexp__AND_strbind_opt1right), rest671) end | (219,(_,(MlyValue.strbind strbind1,_,strbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_strbind_opt(fn _ => let val strbind as strbind1=strbind1 () in ( SOME strbind ) end ) in (LrTable.NT 88,(result,AND1left,strbind1right),rest671) end | (220,rest671) => let val result=MlyValue.AND_strbind_opt(fn _ => ( NONE )) in (LrTable.NT 88,(result,defaultPos,defaultPos),rest671) end | (221,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1,_, AND_strbind_opt1right))::(_,(MlyValue.strexp' strexp'1,strexp'1left,_) )::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp' as strexp'1=strexp'1 () val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( strexp', AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp'1left,AND_strbind_opt1right),rest671 ) end | (222,(_,(MlyValue.sigexp__AND_strbind_opt sigexp__AND_strbind_opt1,_ ,sigexp__AND_strbind_optright as sigexp__AND_strbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_strbind_opt as sigexp__AND_strbind_opt1= sigexp__AND_strbind_opt1 () in ( ( TRANSStrExp(I(strexpleft, sigexp__AND_strbind_optright), strexp, #1 sigexp__AND_strbind_opt), #2 sigexp__AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp1left,sigexp__AND_strbind_opt1right), rest671) end | (223,(_,(MlyValue.sigexp__AND_strbind_opt sigexp__AND_strbind_opt1,_ ,sigexp__AND_strbind_optright as sigexp__AND_strbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_strbind_opt as sigexp__AND_strbind_opt1= sigexp__AND_strbind_opt1 () in ( ( OPAQStrExp(I(strexpleft, sigexp__AND_strbind_optright), strexp, #1 sigexp__AND_strbind_opt), #2 sigexp__AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp1left,sigexp__AND_strbind_opt1right), rest671) end | (224,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1,_, AND_strbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_strbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( sigexp', AND_strbind_opt ) ) end ) in (LrTable.NT 90,(result,sigexp'1left,AND_strbind_opt1right),rest671 ) end | (225,(_,(MlyValue.tyreadesc__AND_strbind_opt tyreadesc__AND_strbind_opt1,_,tyreadesc__AND_strbind_optright as tyreadesc__AND_strbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_strbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_strbind_opt as tyreadesc__AND_strbind_opt1= tyreadesc__AND_strbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_strbind_optright), sigexp, #1 tyreadesc__AND_strbind_opt), #2 tyreadesc__AND_strbind_opt ) ) end ) in (LrTable.NT 90,(result,sigexp1left, tyreadesc__AND_strbind_opt1right),rest671) end | (226,(_,(MlyValue.AND_tyreadesc_opt__AND_strbind_opt AND_tyreadesc_opt__AND_strbind_opt1,_, AND_tyreadesc_opt__AND_strbind_optright as AND_tyreadesc_opt__AND_strbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_strbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_strbind_opt as AND_tyreadesc_opt__AND_strbind_opt1= AND_tyreadesc_opt__AND_strbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_strbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_strbind_opt), #2 AND_tyreadesc_opt__AND_strbind_opt ) ) end ) in (LrTable.NT 91,(result,TYPE1left, AND_tyreadesc_opt__AND_strbind_opt1right),rest671) end | (227,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1, AND_strbind_opt1left,AND_strbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_strbind_opt(fn _ => let val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( NONE, AND_strbind_opt ) ) end ) in (LrTable.NT 92,(result,AND_strbind_opt1left,AND_strbind_opt1right) ,rest671) end | (228,(_,(MlyValue.tyreadesc__AND_strbind_opt tyreadesc__AND_strbind_opt1,_,tyreadesc__AND_strbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_strbind_opt(fn _ => let val tyreadesc__AND_strbind_opt as tyreadesc__AND_strbind_opt1= tyreadesc__AND_strbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_strbind_opt), #2 tyreadesc__AND_strbind_opt ) ) end ) in (LrTable.NT 92,(result,AND1left,tyreadesc__AND_strbind_opt1right), rest671) end | (229,(_,(MlyValue.sigexp sigexp1,_,sigexp1right))::(_,(_,COLON1left, _))::rest671) => let val result=MlyValue.COLON_sigexp_opt(fn _ => let val sigexp as sigexp1=sigexp1 () in ( SOME sigexp ) end ) in (LrTable.NT 93,(result,COLON1left,sigexp1right),rest671) end | (230,rest671) => let val result=MlyValue.COLON_sigexp_opt(fn _ => ( NONE )) in (LrTable.NT 93,(result,defaultPos,defaultPos),rest671) end | (231,(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,sigexp'1right)):: rest671) => let val result=MlyValue.sigexp(fn _ => let val sigexp' as sigexp'1=sigexp'1 () in ( sigexp' ) end ) in (LrTable.NT 94,(result,sigexp'1left,sigexp'1right),rest671) end | (232,(_,(MlyValue.tyreadesc tyreadesc1,_,tyreadescright as tyreadesc1right))::_::(_,(MlyValue.sigexp sigexp1,sigexpleft as sigexp1left,_))::rest671) => let val result=MlyValue.sigexp(fn _ => let val sigexp as sigexp1=sigexp1 () val tyreadesc as tyreadesc1=tyreadesc1 () in ( WHERETYPESigExp(I(sigexpleft,tyreadescright), sigexp, tyreadesc) ) end ) in (LrTable.NT 94,(result,sigexp1left,tyreadesc1right),rest671) end | (233,(_,(_,_,ENDright as END1right))::(_,(MlyValue.spec spec1,_,_)) ::(_,(_,SIGleft as SIG1left,_))::rest671) => let val result= MlyValue.sigexp'(fn _ => let val spec as spec1=spec1 () in ( SIGSigExp(I(SIGleft,ENDright), spec) ) end ) in (LrTable.NT 95,(result,SIG1left,END1right),rest671) end | (234,(_,(MlyValue.sigid sigid1,sigidleft as sigid1left,sigidright as sigid1right))::rest671) => let val result=MlyValue.sigexp'(fn _ => let val sigid as sigid1=sigid1 () in ( SIGIDSigExp(I(sigidleft,sigidright), sigid) ) end ) in (LrTable.NT 95,(result,sigid1left,sigid1right),rest671) end | (235,(_,(MlyValue.sigbind sigbind1,_,sigbindright as sigbind1right)) ::(_,(_,SIGNATUREleft as SIGNATURE1left,_))::rest671) => let val result=MlyValue.sigdec(fn _ => let val sigbind as sigbind1=sigbind1 () in ( SigDec(I(SIGNATUREleft,sigbindright), sigbind) ) end ) in (LrTable.NT 96,(result,SIGNATURE1left,sigbind1right),rest671) end | (236,(_,(MlyValue.sigexp__AND_sigbind_opt sigexp__AND_sigbind_opt1,_ ,sigexp__AND_sigbind_optright as sigexp__AND_sigbind_opt1right))::_::( _,(MlyValue.sigid sigid1,sigidleft as sigid1left,_))::rest671) => let val result=MlyValue.sigbind(fn _ => let val sigid as sigid1=sigid1 () val sigexp__AND_sigbind_opt as sigexp__AND_sigbind_opt1= sigexp__AND_sigbind_opt1 () in ( SigBind(I(sigidleft,sigexp__AND_sigbind_optright), sigid, #1 sigexp__AND_sigbind_opt, #2 sigexp__AND_sigbind_opt) ) end ) in (LrTable.NT 97,(result,sigid1left,sigexp__AND_sigbind_opt1right), rest671) end | (237,(_,(MlyValue.sigbind sigbind1,_,sigbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_sigbind_opt(fn _ => let val sigbind as sigbind1=sigbind1 () in ( SOME sigbind ) end ) in (LrTable.NT 98,(result,AND1left,sigbind1right),rest671) end | (238,rest671) => let val result=MlyValue.AND_sigbind_opt(fn _ => ( NONE )) in (LrTable.NT 98,(result,defaultPos,defaultPos),rest671) end | (239,(_,(MlyValue.AND_sigbind_opt AND_sigbind_opt1,_, AND_sigbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_sigbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_sigbind_opt as AND_sigbind_opt1=AND_sigbind_opt1 () in ( ( sigexp', AND_sigbind_opt ) ) end ) in (LrTable.NT 99,(result,sigexp'1left,AND_sigbind_opt1right),rest671 ) end | (240,(_,(MlyValue.tyreadesc__AND_sigbind_opt tyreadesc__AND_sigbind_opt1,_,tyreadesc__AND_sigbind_optright as tyreadesc__AND_sigbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_sigbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_sigbind_opt as tyreadesc__AND_sigbind_opt1= tyreadesc__AND_sigbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_sigbind_optright), sigexp, #1 tyreadesc__AND_sigbind_opt), #2 tyreadesc__AND_sigbind_opt ) ) end ) in (LrTable.NT 99,(result,sigexp1left, tyreadesc__AND_sigbind_opt1right),rest671) end | (241,(_,(MlyValue.AND_tyreadesc_opt__AND_sigbind_opt AND_tyreadesc_opt__AND_sigbind_opt1,_, AND_tyreadesc_opt__AND_sigbind_optright as AND_tyreadesc_opt__AND_sigbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_sigbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_sigbind_opt as AND_tyreadesc_opt__AND_sigbind_opt1= AND_tyreadesc_opt__AND_sigbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_sigbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_sigbind_opt), #2 AND_tyreadesc_opt__AND_sigbind_opt ) ) end ) in (LrTable.NT 100,(result,TYPE1left, AND_tyreadesc_opt__AND_sigbind_opt1right),rest671) end | (242,(_,(MlyValue.AND_sigbind_opt AND_sigbind_opt1, AND_sigbind_opt1left,AND_sigbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_sigbind_opt(fn _ => let val AND_sigbind_opt as AND_sigbind_opt1=AND_sigbind_opt1 () in ( ( NONE, AND_sigbind_opt) ) end ) in (LrTable.NT 101,(result,AND_sigbind_opt1left,AND_sigbind_opt1right ),rest671) end | (243,(_,(MlyValue.tyreadesc__AND_sigbind_opt tyreadesc__AND_sigbind_opt1,_,tyreadesc__AND_sigbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_sigbind_opt(fn _ => let val tyreadesc__AND_sigbind_opt as tyreadesc__AND_sigbind_opt1= tyreadesc__AND_sigbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_sigbind_opt), #2 tyreadesc__AND_sigbind_opt ) ) end ) in (LrTable.NT 101,(result,AND1left,tyreadesc__AND_sigbind_opt1right) ,rest671) end | (244,(_,(MlyValue.AND_tyreadesc_opt AND_tyreadesc_opt1,_, AND_tyreadesc_optright as AND_tyreadesc_opt1right))::(_,(MlyValue.ty ty1,_,_))::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_)):: rest671) => let val result=MlyValue.tyreadesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt as AND_tyreadesc_opt1=AND_tyreadesc_opt1 () in ( TyReaDesc(I(TYPEleft,AND_tyreadesc_optright), tyvarseq, longtycon, ty, AND_tyreadesc_opt) ) end ) in (LrTable.NT 102,(result,TYPE1left,AND_tyreadesc_opt1right),rest671 ) end | (245,(_,(MlyValue.tyreadesc tyreadesc1,_,tyreadesc1right))::(_,(_, AND1left,_))::rest671) => let val result=MlyValue.AND_tyreadesc_opt( fn _ => let val tyreadesc as tyreadesc1=tyreadesc1 () in ( SOME tyreadesc ) end ) in (LrTable.NT 103,(result,AND1left,tyreadesc1right),rest671) end | (246,rest671) => let val result=MlyValue.AND_tyreadesc_opt(fn _ => ( NONE )) in (LrTable.NT 103,(result,defaultPos,defaultPos),rest671) end | (247,(_,(MlyValue.spec1 spec11,spec11left,spec11right))::rest671) => let val result=MlyValue.spec(fn _ => let val spec1 as spec11= spec11 () in ( spec1 ) end ) in (LrTable.NT 104,(result,spec11left,spec11right),rest671) end | (248,rest671) => let val result=MlyValue.spec(fn _ => ( EMPTYSpec(I(defaultPos,defaultPos)) )) in (LrTable.NT 104,(result,defaultPos,defaultPos),rest671) end | (249,(_,(MlyValue.spec1' spec1'1,spec1'1left,spec1'1right))::rest671 ) => let val result=MlyValue.spec1(fn _ => let val spec1' as spec1'1= spec1'1 () in ( spec1' ) end ) in (LrTable.NT 105,(result,spec1'1left,spec1'1right),rest671) end | (250,(_,(MlyValue.spec1' spec1'1,_,spec1'right as spec1'1right))::(_ ,(MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val spec1' as spec1'1=spec1'1 () in ( SEQSpec(I(spec1left,spec1'right), spec1, spec1') ) end ) in (LrTable.NT 105,(result,spec11left,spec1'1right),rest671) end | (251,(_,(_,SEMICOLON1left,SEMICOLON1right))::rest671) => let val result=MlyValue.spec1(fn _ => ( EMPTYSpec(I(defaultPos,defaultPos)) )) in (LrTable.NT 105,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (252,(_,(MlyValue.longtycon_EQUALS_list2 longtycon_EQUALS_list21,_, longtycon_EQUALS_list2right as longtycon_EQUALS_list21right))::_::(_,( _,SHARINGleft as SHARING1left,_))::rest671) => let val result= MlyValue.spec1(fn _ => let val longtycon_EQUALS_list2 as longtycon_EQUALS_list21=longtycon_EQUALS_list21 () in ( SHARINGTYPESpec(I(SHARINGleft, longtycon_EQUALS_list2right), EMPTYSpec(I(SHARINGleft,SHARINGleft)), longtycon_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,SHARING1left,longtycon_EQUALS_list21right) ,rest671) end | (253,(_,(MlyValue.longtycon_EQUALS_list2 longtycon_EQUALS_list21,_, longtycon_EQUALS_list2right as longtycon_EQUALS_list21right))::_::_::( _,(MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val longtycon_EQUALS_list2 as longtycon_EQUALS_list21= longtycon_EQUALS_list21 () in ( SHARINGTYPESpec(I(spec1left, longtycon_EQUALS_list2right), spec1, longtycon_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,spec11left,longtycon_EQUALS_list21right), rest671) end | (254,(_,(MlyValue.longstrid_EQUALS_list2 longstrid_EQUALS_list21,_, longstrid_EQUALS_list2right as longstrid_EQUALS_list21right))::(_,(_, SHARINGleft as SHARING1left,_))::rest671) => let val result= MlyValue.spec1(fn _ => let val longstrid_EQUALS_list2 as longstrid_EQUALS_list21=longstrid_EQUALS_list21 () in ( SHARINGSpec(I(SHARINGleft, longstrid_EQUALS_list2right), EMPTYSpec(I(SHARINGleft,SHARINGleft)), longstrid_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,SHARING1left,longstrid_EQUALS_list21right) ,rest671) end | (255,(_,(MlyValue.longstrid_EQUALS_list2 longstrid_EQUALS_list21,_, longstrid_EQUALS_list2right as longstrid_EQUALS_list21right))::_::(_,( MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val longstrid_EQUALS_list2 as longstrid_EQUALS_list21= longstrid_EQUALS_list21 () in ( SHARINGSpec(I(spec1left,longstrid_EQUALS_list2right), spec1, longstrid_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,spec11left,longstrid_EQUALS_list21right), rest671) end | (256,(_,(MlyValue.valdesc valdesc1,_,valdescright as valdesc1right)) ::(_,(_,VALleft as VAL1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val valdesc as valdesc1=valdesc1 () in ( VALSpec(I(VALleft,valdescright), valdesc) ) end ) in (LrTable.NT 106,(result,VAL1left,valdesc1right),rest671) end | (257,(_,(MlyValue.typdesc typdesc1,_,typdescright as typdesc1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val typdesc as typdesc1=typdesc1 () in ( TYPESpec(I(TYPEleft,typdescright), typdesc) ) end ) in (LrTable.NT 106,(result,TYPE1left,typdesc1right),rest671) end | (258,(_,(MlyValue.typdesc typdesc1,_,typdescright as typdesc1right)) ::(_,(_,EQTYPEleft as EQTYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val typdesc as typdesc1=typdesc1 () in ( EQTYPESpec(I(EQTYPEleft,typdescright), typdesc) ) end ) in (LrTable.NT 106,(result,EQTYPE1left,typdesc1right),rest671) end | (259,(_,(MlyValue.syndesc syndesc1,_,syndescright as syndesc1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val syndesc as syndesc1=syndesc1 () in ( SYNSpec(I(TYPEleft,syndescright), syndesc) ) end ) in (LrTable.NT 106,(result,TYPE1left,syndesc1right),rest671) end | (260,(_,(MlyValue.datdesc0 datdesc01,_,datdesc0right as datdesc01right))::(_,(_,DATATYPEleft as DATATYPE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val datdesc0 as datdesc01=datdesc01 () in ( DATATYPESpec(I(DATATYPEleft,datdesc0right), datdesc0)) end ) in (LrTable.NT 106,(result,DATATYPE1left,datdesc01right),rest671) end | (261,(_,(MlyValue.datdesc1 datdesc11,_,datdesc1right as datdesc11right))::(_,(_,DATATYPEleft as DATATYPE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val datdesc1 as datdesc11=datdesc11 () in ( DATATYPESpec(I(DATATYPEleft,datdesc1right), datdesc1)) end ) in (LrTable.NT 106,(result,DATATYPE1left,datdesc11right),rest671) end | (262,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::_::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(_, DATATYPEleft as DATATYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val tycon as tycon1=tycon1 () val longtycon as longtycon1=longtycon1 () in ( REPLICATIONSpec(I(DATATYPEleft,longtyconright), tycon, longtycon) ) end ) in (LrTable.NT 106,(result,DATATYPE1left,longtycon1right),rest671) end | (263,(_,(MlyValue.exdesc exdesc1,_,exdescright as exdesc1right))::(_ ,(_,EXCEPTIONleft as EXCEPTION1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val exdesc as exdesc1=exdesc1 () in ( EXCEPTIONSpec(I(EXCEPTIONleft,exdescright), exdesc) ) end ) in (LrTable.NT 106,(result,EXCEPTION1left,exdesc1right),rest671) end | (264,(_,(MlyValue.strdesc strdesc1,_,strdescright as strdesc1right)) ::(_,(_,STRUCTUREleft as STRUCTURE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val strdesc as strdesc1=strdesc1 () in ( STRUCTURESpec(I(STRUCTUREleft,strdescright), strdesc)) end ) in (LrTable.NT 106,(result,STRUCTURE1left,strdesc1right),rest671) end | (265,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::(_ ,(_,INCLUDEleft as INCLUDE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val sigexp as sigexp1=sigexp1 () in ( INCLUDESpec(I(INCLUDEleft,sigexpright), sigexp) ) end ) in (LrTable.NT 106,(result,INCLUDE1left,sigexp1right),rest671) end | (266,(_,(MlyValue.sigid_list2 sigid_list21,_,sigid_list2right as sigid_list21right))::(_,(_,INCLUDEleft as INCLUDE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val sigid_list2 as sigid_list21=sigid_list21 () in ( INCLUDEMULTISpec(I(INCLUDEleft,sigid_list2right), sigid_list2) ) end ) in (LrTable.NT 106,(result,INCLUDE1left,sigid_list21right),rest671) end | (267,(_,(MlyValue.sigid_list2 sigid_list21,_,sigid_list21right))::(_ ,(MlyValue.sigid sigid1,sigid1left,_))::rest671) => let val result= MlyValue.sigid_list2(fn _ => let val sigid as sigid1=sigid1 () val sigid_list2 as sigid_list21=sigid_list21 () in ( sigid::sigid_list2 ) end ) in (LrTable.NT 107,(result,sigid1left,sigid_list21right),rest671) end | (268,(_,(MlyValue.sigid sigid2,_,sigid2right))::(_,(MlyValue.sigid sigid1,sigid1left,_))::rest671) => let val result=MlyValue.sigid_list2 (fn _ => let val sigid1=sigid1 () val sigid2=sigid2 () in ( sigid1::sigid2::[] ) end ) in (LrTable.NT 107,(result,sigid1left,sigid2right),rest671) end | (269,(_,(MlyValue.longtycon_EQUALS_list1 longtycon_EQUALS_list11,_, longtycon_EQUALS_list11right))::_::(_,(MlyValue.longtycon longtycon1, longtycon1left,_))::rest671) => let val result= MlyValue.longtycon_EQUALS_list1(fn _ => let val longtycon as longtycon1=longtycon1 () val longtycon_EQUALS_list1 as longtycon_EQUALS_list11= longtycon_EQUALS_list11 () in ( longtycon::longtycon_EQUALS_list1 ) end ) in (LrTable.NT 108,(result,longtycon1left, longtycon_EQUALS_list11right),rest671) end | (270,(_,(MlyValue.longtycon longtycon1,longtycon1left, longtycon1right))::rest671) => let val result= MlyValue.longtycon_EQUALS_list1(fn _ => let val longtycon as longtycon1=longtycon1 () in ( longtycon::[] ) end ) in (LrTable.NT 108,(result,longtycon1left,longtycon1right),rest671) end | (271,(_,(MlyValue.longtycon_EQUALS_list1 longtycon_EQUALS_list11,_, longtycon_EQUALS_list11right))::_::(_,(MlyValue.longtycon longtycon1, longtycon1left,_))::rest671) => let val result= MlyValue.longtycon_EQUALS_list2(fn _ => let val longtycon as longtycon1=longtycon1 () val longtycon_EQUALS_list1 as longtycon_EQUALS_list11= longtycon_EQUALS_list11 () in ( longtycon::longtycon_EQUALS_list1 ) end ) in (LrTable.NT 109,(result,longtycon1left, longtycon_EQUALS_list11right),rest671) end | (272,(_,(MlyValue.longstrid_EQUALS_list1 longstrid_EQUALS_list11,_, longstrid_EQUALS_list11right))::_::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_EQUALS_list1(fn _ => let val longstrid as longstrid1=longstrid1 () val longstrid_EQUALS_list1 as longstrid_EQUALS_list11= longstrid_EQUALS_list11 () in ( longstrid::longstrid_EQUALS_list1 ) end ) in (LrTable.NT 110,(result,longstrid1left, longstrid_EQUALS_list11right),rest671) end | (273,(_,(MlyValue.longstrid longstrid1,longstrid1left, longstrid1right))::rest671) => let val result= MlyValue.longstrid_EQUALS_list1(fn _ => let val longstrid as longstrid1=longstrid1 () in ( longstrid::[] ) end ) in (LrTable.NT 110,(result,longstrid1left,longstrid1right),rest671) end | (274,(_,(MlyValue.longstrid_EQUALS_list1 longstrid_EQUALS_list11,_, longstrid_EQUALS_list11right))::_::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_EQUALS_list2(fn _ => let val longstrid as longstrid1=longstrid1 () val longstrid_EQUALS_list1 as longstrid_EQUALS_list11= longstrid_EQUALS_list11 () in ( longstrid::longstrid_EQUALS_list1 ) end ) in (LrTable.NT 111,(result,longstrid1left, longstrid_EQUALS_list11right),rest671) end | (275,(_,(MlyValue.AND_valdesc_opt AND_valdesc_opt1,_, AND_valdesc_optright as AND_valdesc_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_))::rest671) => let val result=MlyValue.valdesc(fn _ => let val vid' as vid'1= vid'1 () val ty as ty1=ty1 () val AND_valdesc_opt as AND_valdesc_opt1=AND_valdesc_opt1 () in ( ValDesc(I(vid'left,AND_valdesc_optright), vid', ty, AND_valdesc_opt) ) end ) in (LrTable.NT 112,(result,vid'1left,AND_valdesc_opt1right),rest671) end | (276,(_,(MlyValue.valdesc valdesc1,_,valdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_valdesc_opt(fn _ => let val valdesc as valdesc1=valdesc1 () in ( SOME valdesc ) end ) in (LrTable.NT 113,(result,AND1left,valdesc1right),rest671) end | (277,rest671) => let val result=MlyValue.AND_valdesc_opt(fn _ => ( NONE )) in (LrTable.NT 113,(result,defaultPos,defaultPos),rest671) end | (278,(_,(MlyValue.AND_typdesc_opt AND_typdesc_opt1,_, AND_typdesc_optright as AND_typdesc_opt1right))::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.typdesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val AND_typdesc_opt as AND_typdesc_opt1=AND_typdesc_opt1 () in ( TypDesc(I(tyvarseqleft,AND_typdesc_optright), tyvarseq, tycon, AND_typdesc_opt) ) end ) in (LrTable.NT 114,(result,tyvarseq1left,AND_typdesc_opt1right), rest671) end | (279,(_,(MlyValue.typdesc typdesc1,_,typdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_typdesc_opt(fn _ => let val typdesc as typdesc1=typdesc1 () in ( SOME typdesc ) end ) in (LrTable.NT 115,(result,AND1left,typdesc1right),rest671) end | (280,rest671) => let val result=MlyValue.AND_typdesc_opt(fn _ => ( NONE )) in (LrTable.NT 115,(result,defaultPos,defaultPos),rest671) end | (281,(_,(MlyValue.AND_syndesc_opt AND_syndesc_opt1,_, AND_syndesc_optright as AND_syndesc_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.syndesc(fn _ => let val tyvarseq as tyvarseq1= tyvarseq1 () val tycon as tycon1=tycon1 () val ty as ty1=ty1 () val AND_syndesc_opt as AND_syndesc_opt1=AND_syndesc_opt1 () in ( SynDesc(I(tyvarseqleft,AND_syndesc_optright), tyvarseq, tycon, ty, AND_syndesc_opt) ) end ) in (LrTable.NT 116,(result,tyvarseq1left,AND_syndesc_opt1right), rest671) end | (282,(_,(MlyValue.syndesc syndesc1,_,syndesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_syndesc_opt(fn _ => let val syndesc as syndesc1=syndesc1 () in ( SOME syndesc ) end ) in (LrTable.NT 117,(result,AND1left,syndesc1right),rest671) end | (283,rest671) => let val result=MlyValue.AND_syndesc_opt(fn _ => ( NONE )) in (LrTable.NT 117,(result,defaultPos,defaultPos),rest671) end | (284,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671 ) => let val result=MlyValue.datdesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyvarseqleft,AND_datdesc_optright), tyvarseq, tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 118,(result,tyvarseq1left,AND_datdesc_opt1right), rest671) end | (285,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,tyconleft as tycon1left,_ ))::rest671) => let val result=MlyValue.datdesc0(fn _ => let val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyconleft,AND_datdesc_optright), TyVarseq(I(defaultPos,defaultPos), []), tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 119,(result,tycon1left,AND_datdesc_opt1right),rest671) end | (286,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq1 tyvarseq11,tyvarseq1left as tyvarseq11left,_)):: rest671) => let val result=MlyValue.datdesc1(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyvarseq1left,AND_datdesc_optright), tyvarseq1, tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 120,(result,tyvarseq11left,AND_datdesc_opt1right), rest671) end | (287,(_,(MlyValue.datdesc datdesc1,_,datdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_datdesc_opt(fn _ => let val datdesc as datdesc1=datdesc1 () in ( SOME datdesc ) end ) in (LrTable.NT 121,(result,AND1left,datdesc1right),rest671) end | (288,rest671) => let val result=MlyValue.AND_datdesc_opt(fn _ => ( NONE )) in (LrTable.NT 121,(result,defaultPos,defaultPos),rest671) end | (289,(_,(MlyValue.BAR_condesc_opt BAR_condesc_opt1,_, BAR_condesc_optright as BAR_condesc_opt1right))::(_,( MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_))::rest671) => let val result=MlyValue.condesc(fn _ => let val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val BAR_condesc_opt as BAR_condesc_opt1=BAR_condesc_opt1 () in ( ConDesc(I(vid'left,BAR_condesc_optright), vid', OF_ty_opt, BAR_condesc_opt) ) end ) in (LrTable.NT 122,(result,vid'1left,BAR_condesc_opt1right),rest671) end | (290,(_,(MlyValue.condesc condesc1,_,condesc1right))::(_,(_,BAR1left ,_))::rest671) => let val result=MlyValue.BAR_condesc_opt(fn _ => let val condesc as condesc1=condesc1 () in ( SOME condesc ) end ) in (LrTable.NT 123,(result,BAR1left,condesc1right),rest671) end | (291,rest671) => let val result=MlyValue.BAR_condesc_opt(fn _ => ( NONE )) in (LrTable.NT 123,(result,defaultPos,defaultPos),rest671) end | (292,(_,(MlyValue.AND_exdesc_opt AND_exdesc_opt1,_, AND_exdesc_optright as AND_exdesc_opt1right))::(_,(MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_)):: rest671) => let val result=MlyValue.exdesc(fn _ => let val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val AND_exdesc_opt as AND_exdesc_opt1=AND_exdesc_opt1 () in ( ExDesc(I(vid'left,AND_exdesc_optright), vid', OF_ty_opt, AND_exdesc_opt) ) end ) in (LrTable.NT 124,(result,vid'1left,AND_exdesc_opt1right),rest671) end | (293,(_,(MlyValue.exdesc exdesc1,_,exdesc1right))::(_,(_,AND1left,_) )::rest671) => let val result=MlyValue.AND_exdesc_opt(fn _ => let val exdesc as exdesc1=exdesc1 () in ( SOME exdesc ) end ) in (LrTable.NT 125,(result,AND1left,exdesc1right),rest671) end | (294,rest671) => let val result=MlyValue.AND_exdesc_opt(fn _ => ( NONE )) in (LrTable.NT 125,(result,defaultPos,defaultPos),rest671) end | (295,(_,(MlyValue.sigexp__AND_strdesc_opt sigexp__AND_strdesc_opt1,_ ,sigexp__AND_strdesc_optright as sigexp__AND_strdesc_opt1right))::_::( _,(MlyValue.strid strid1,stridleft as strid1left,_))::rest671) => let val result=MlyValue.strdesc(fn _ => let val strid as strid1=strid1 () val sigexp__AND_strdesc_opt as sigexp__AND_strdesc_opt1= sigexp__AND_strdesc_opt1 () in ( StrDesc(I(stridleft,sigexp__AND_strdesc_optright), strid, #1 sigexp__AND_strdesc_opt, #2 sigexp__AND_strdesc_opt) ) end ) in (LrTable.NT 126,(result,strid1left,sigexp__AND_strdesc_opt1right), rest671) end | (296,(_,(MlyValue.strdesc strdesc1,_,strdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_strdesc_opt(fn _ => let val strdesc as strdesc1=strdesc1 () in ( SOME strdesc ) end ) in (LrTable.NT 127,(result,AND1left,strdesc1right),rest671) end | (297,rest671) => let val result=MlyValue.AND_strdesc_opt(fn _ => ( NONE )) in (LrTable.NT 127,(result,defaultPos,defaultPos),rest671) end | (298,(_,(MlyValue.AND_strdesc_opt AND_strdesc_opt1,_, AND_strdesc_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_strdesc_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_strdesc_opt as AND_strdesc_opt1=AND_strdesc_opt1 () in ( ( sigexp', AND_strdesc_opt ) ) end ) in (LrTable.NT 128,(result,sigexp'1left,AND_strdesc_opt1right), rest671) end | (299,(_,(MlyValue.tyreadesc__AND_strdesc_opt tyreadesc__AND_strdesc_opt1,_,tyreadesc__AND_strdesc_optright as tyreadesc__AND_strdesc_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_strdesc_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_strdesc_opt as tyreadesc__AND_strdesc_opt1= tyreadesc__AND_strdesc_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_strdesc_optright), sigexp, #1 tyreadesc__AND_strdesc_opt), #2 tyreadesc__AND_strdesc_opt ) ) end ) in (LrTable.NT 128,(result,sigexp1left, tyreadesc__AND_strdesc_opt1right),rest671) end | (300,(_,(MlyValue.AND_tyreadesc_opt__AND_strdesc_opt AND_tyreadesc_opt__AND_strdesc_opt1,_, AND_tyreadesc_opt__AND_strdesc_optright as AND_tyreadesc_opt__AND_strdesc_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_strdesc_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_strdesc_opt as AND_tyreadesc_opt__AND_strdesc_opt1= AND_tyreadesc_opt__AND_strdesc_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_strdesc_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_strdesc_opt), #2 AND_tyreadesc_opt__AND_strdesc_opt ) ) end ) in (LrTable.NT 129,(result,TYPE1left, AND_tyreadesc_opt__AND_strdesc_opt1right),rest671) end | (301,(_,(MlyValue.AND_strdesc_opt AND_strdesc_opt1, AND_strdesc_opt1left,AND_strdesc_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_strdesc_opt(fn _ => let val AND_strdesc_opt as AND_strdesc_opt1=AND_strdesc_opt1 () in ( ( NONE, AND_strdesc_opt ) ) end ) in (LrTable.NT 130,(result,AND_strdesc_opt1left,AND_strdesc_opt1right ),rest671) end | (302,(_,(MlyValue.tyreadesc__AND_strdesc_opt tyreadesc__AND_strdesc_opt1,_,tyreadesc__AND_strdesc_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_strdesc_opt(fn _ => let val tyreadesc__AND_strdesc_opt as tyreadesc__AND_strdesc_opt1= tyreadesc__AND_strdesc_opt1 () in ( ( SOME(#1 tyreadesc__AND_strdesc_opt), #2 tyreadesc__AND_strdesc_opt ) ) end ) in (LrTable.NT 130,(result,AND1left,tyreadesc__AND_strdesc_opt1right) ,rest671) end | (303,(_,(MlyValue.funbind funbind1,_,funbindright as funbind1right)) ::(_,(_,FUNCTORleft as FUNCTOR1left,_))::rest671) => let val result= MlyValue.fundec(fn _ => let val funbind as funbind1=funbind1 () in ( FunDec(I(FUNCTORleft,funbindright), funbind) ) end ) in (LrTable.NT 131,(result,FUNCTOR1left,funbind1right),rest671) end | (304,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::_::(_,( MlyValue.sigexp sigexp1,_,_))::_::(_,(MlyValue.strid strid1,_,_))::_:: (_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val strid as strid1=strid1 () val sigexp as sigexp1=sigexp1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( TRANSFunBind(I(funidleft, strexp__AND_funbind_optright), funid, strid, sigexp, COLON_sigexp_opt, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (305,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.sigexp sigexp2,_,_))::_::_::(_,(MlyValue.sigexp sigexp1,_, _))::_::(_,(MlyValue.strid strid1,_,_))::_::(_,(MlyValue.funid funid1, funidleft as funid1left,_))::rest671) => let val result= MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val strid as strid1=strid1 () val sigexp1=sigexp1 () val sigexp2=sigexp2 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( OPAQFunBind(I(funidleft,strexp__AND_funbind_optright), funid, strid, sigexp1, sigexp2, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (306,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::_::(_,( MlyValue.spec spec1,_,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val spec as spec1=spec1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( TRANSSPECFunBind(I(funidleft, strexp__AND_funbind_optright), funid, spec, COLON_sigexp_opt, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (307,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.sigexp sigexp1,_,_))::_::_::(_,(MlyValue.spec spec1,_,_)) ::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1= funid1 () val spec as spec1=spec1 () val sigexp as sigexp1=sigexp1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( OPAQSPECFunBind(I(funidleft, strexp__AND_funbind_optright), funid, spec, sigexp, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (308,(_,(MlyValue.funbind funbind1,_,funbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_funbind_opt(fn _ => let val funbind as funbind1=funbind1 () in ( SOME funbind ) end ) in (LrTable.NT 133,(result,AND1left,funbind1right),rest671) end | (309,rest671) => let val result=MlyValue.AND_funbind_opt(fn _ => ( NONE )) in (LrTable.NT 133,(result,defaultPos,defaultPos),rest671) end | (310,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1,_, AND_funbind_opt1right))::(_,(MlyValue.strexp' strexp'1,strexp'1left,_) )::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp' as strexp'1=strexp'1 () val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( strexp', AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp'1left,AND_funbind_opt1right), rest671) end | (311,(_,(MlyValue.sigexp__AND_funbind_opt sigexp__AND_funbind_opt1,_ ,sigexp__AND_funbind_optright as sigexp__AND_funbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_funbind_opt as sigexp__AND_funbind_opt1= sigexp__AND_funbind_opt1 () in ( ( TRANSStrExp(I(strexpleft, sigexp__AND_funbind_optright), strexp, #1 sigexp__AND_funbind_opt), #2 sigexp__AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp1left,sigexp__AND_funbind_opt1right) ,rest671) end | (312,(_,(MlyValue.sigexp__AND_funbind_opt sigexp__AND_funbind_opt1,_ ,sigexp__AND_funbind_optright as sigexp__AND_funbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_funbind_opt as sigexp__AND_funbind_opt1= sigexp__AND_funbind_opt1 () in ( ( OPAQStrExp(I(strexpleft, sigexp__AND_funbind_optright), strexp, #1 sigexp__AND_funbind_opt), #2 sigexp__AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp1left,sigexp__AND_funbind_opt1right) ,rest671) end | (313,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1,_, AND_funbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_funbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( sigexp', AND_funbind_opt ) ) end ) in (LrTable.NT 135,(result,sigexp'1left,AND_funbind_opt1right), rest671) end | (314,(_,(MlyValue.tyreadesc__AND_funbind_opt tyreadesc__AND_funbind_opt1,_,tyreadesc__AND_funbind_optright as tyreadesc__AND_funbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_funbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_funbind_opt as tyreadesc__AND_funbind_opt1= tyreadesc__AND_funbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_funbind_optright), sigexp, #1 tyreadesc__AND_funbind_opt), #2 tyreadesc__AND_funbind_opt ) ) end ) in (LrTable.NT 135,(result,sigexp1left, tyreadesc__AND_funbind_opt1right),rest671) end | (315,(_,(MlyValue.AND_tyreadesc_opt__AND_funbind_opt AND_tyreadesc_opt__AND_funbind_opt1,_, AND_tyreadesc_opt__AND_funbind_optright as AND_tyreadesc_opt__AND_funbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_funbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_funbind_opt as AND_tyreadesc_opt__AND_funbind_opt1= AND_tyreadesc_opt__AND_funbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_funbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_funbind_opt), #2 AND_tyreadesc_opt__AND_funbind_opt ) ) end ) in (LrTable.NT 136,(result,TYPE1left, AND_tyreadesc_opt__AND_funbind_opt1right),rest671) end | (316,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1, AND_funbind_opt1left,AND_funbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_funbind_opt(fn _ => let val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( NONE, AND_funbind_opt ) ) end ) in (LrTable.NT 137,(result,AND_funbind_opt1left,AND_funbind_opt1right ),rest671) end | (317,(_,(MlyValue.tyreadesc__AND_funbind_opt tyreadesc__AND_funbind_opt1,_,tyreadesc__AND_funbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_funbind_opt(fn _ => let val tyreadesc__AND_funbind_opt as tyreadesc__AND_funbind_opt1= tyreadesc__AND_funbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_funbind_opt), #2 tyreadesc__AND_funbind_opt ) ) end ) in (LrTable.NT 137,(result,AND1left,tyreadesc__AND_funbind_opt1right) ,rest671) end | (318,(_,(MlyValue.topdec1 topdec11,topdec11left,topdec11right)):: rest671) => let val result=MlyValue.topdec(fn _ => let val topdec1 as topdec11=topdec11 () in ( topdec1 ) end ) in (LrTable.NT 138,(result,topdec11left,topdec11right),rest671) end | (319,rest671) => let val result=MlyValue.topdec(fn _ => ( STRDECTopDec(I(defaultPos,defaultPos), EMPTYStrDec(I(defaultPos,defaultPos)), NONE) )) in (LrTable.NT 138,(result,defaultPos,defaultPos),rest671) end | (320,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.strdec1' strdec1'1,strdec1'left as strdec1'1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val strdec1' as strdec1'1=strdec1'1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( STRDECTopDec(I(strdec1'left,topdec_optright), strdec1', topdec_opt) ) end ) in (LrTable.NT 139,(result,strdec1'1left,topdec_opt1right),rest671) end | (321,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.sigdec sigdec1,sigdecleft as sigdec1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val sigdec as sigdec1=sigdec1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( SIGDECTopDec(I(sigdecleft,topdec_optright), sigdec, topdec_opt) ) end ) in (LrTable.NT 139,(result,sigdec1left,topdec_opt1right),rest671) end | (322,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.fundec fundec1,fundecleft as fundec1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val fundec as fundec1=fundec1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( FUNDECTopDec(I(fundecleft,topdec_optright), fundec, topdec_opt) ) end ) in (LrTable.NT 139,(result,fundec1left,topdec_opt1right),rest671) end | (323,(_,(MlyValue.topdec1 topdec11,topdec11left,topdec11right)):: rest671) => let val result=MlyValue.topdec_opt(fn _ => let val topdec1 as topdec11=topdec11 () in ( SOME topdec1 ) end ) in (LrTable.NT 140,(result,topdec11left,topdec11right),rest671) end | (324,rest671) => let val result=MlyValue.topdec_opt(fn _ => ( NONE ) ) in (LrTable.NT 140,(result,defaultPos,defaultPos),rest671) end | (325,(_,(MlyValue.program' program'1,_,program'1right))::(_,( MlyValue.initInfix initInfix1,initInfix1left,_))::rest671) => let val result=MlyValue.program(fn _ => let val initInfix1=initInfix1 () val program' as program'1=program'1 () in ( (program', !J) ) end ) in (LrTable.NT 141,(result,initInfix1left,program'1right),rest671) end | (326,(_,(MlyValue.program_opt program_opt1,_,program_opt1right))::(_ ,(_,_,SEMICOLONright))::(_,(MlyValue.topdec topdec1,topdecleft as topdec1left,_))::rest671) => let val result=MlyValue.program'(fn _ => let val topdec as topdec1=topdec1 () val program_opt as program_opt1=program_opt1 () in ( TOPDECProgram(I(topdecleft,SEMICOLONright), topdec, program_opt) ) end ) in (LrTable.NT 142,(result,topdec1left,program_opt1right),rest671) end | (327,(_,(MlyValue.program_opt program_opt1,_,program_opt1right))::(_ ,(_,_,SEMICOLONright))::(_,(MlyValue.exp exp1,expleft as exp1left,_)) ::rest671) => let val result=MlyValue.program'(fn _ => let val exp as exp1=exp1 () val program_opt as program_opt1=program_opt1 () in ( EXPProgram(I(expleft,SEMICOLONright), exp, program_opt) ) end ) in (LrTable.NT 142,(result,exp1left,program_opt1right),rest671) end | (328,(_,(MlyValue.program' program'1,program'1left,program'1right)) ::rest671) => let val result=MlyValue.program_opt(fn _ => let val program' as program'1=program'1 () in ( SOME program' ) end ) in (LrTable.NT 143,(result,program'1left,program'1right),rest671) end | (329,rest671) => let val result=MlyValue.program_opt(fn _ => ( NONE )) in (LrTable.NT 143,(result,defaultPos,defaultPos),rest671) end | _ => raise (mlyAction i392) end val void = MlyValue.VOID val extract = fn a => (fn MlyValue.program x => x | _ => let exception ParseInternal in raise ParseInternal end) a () end end structure Tokens : Parser_TOKENS = struct type svalue = ParserData.svalue type ('a,'b) token = ('a,'b) Token.token fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( ParserData.MlyValue.VOID,p1,p2)) fun ABSTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( ParserData.MlyValue.VOID,p1,p2)) fun AND (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( ParserData.MlyValue.VOID,p1,p2)) fun ANDALSO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( ParserData.MlyValue.VOID,p1,p2)) fun AS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( ParserData.MlyValue.VOID,p1,p2)) fun CASE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( ParserData.MlyValue.VOID,p1,p2)) fun DO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( ParserData.MlyValue.VOID,p1,p2)) fun DATATYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( ParserData.MlyValue.VOID,p1,p2)) fun ELSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( ParserData.MlyValue.VOID,p1,p2)) fun END (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( ParserData.MlyValue.VOID,p1,p2)) fun EXCEPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( ParserData.MlyValue.VOID,p1,p2)) fun FN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( ParserData.MlyValue.VOID,p1,p2)) fun FUN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( ParserData.MlyValue.VOID,p1,p2)) fun HANDLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( ParserData.MlyValue.VOID,p1,p2)) fun IF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( ParserData.MlyValue.VOID,p1,p2)) fun IN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( ParserData.MlyValue.VOID,p1,p2)) fun INFIX (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( ParserData.MlyValue.VOID,p1,p2)) fun INFIXR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( ParserData.MlyValue.VOID,p1,p2)) fun LET (p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( ParserData.MlyValue.VOID,p1,p2)) fun LOCAL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( ParserData.MlyValue.VOID,p1,p2)) fun NONFIX (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( ParserData.MlyValue.VOID,p1,p2)) fun OF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( ParserData.MlyValue.VOID,p1,p2)) fun OP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( ParserData.MlyValue.VOID,p1,p2)) fun OPEN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( ParserData.MlyValue.VOID,p1,p2)) fun ORELSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( ParserData.MlyValue.VOID,p1,p2)) fun RAISE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( ParserData.MlyValue.VOID,p1,p2)) fun REC (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( ParserData.MlyValue.VOID,p1,p2)) fun THEN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( ParserData.MlyValue.VOID,p1,p2)) fun TYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( ParserData.MlyValue.VOID,p1,p2)) fun VAL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( ParserData.MlyValue.VOID,p1,p2)) fun WITH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( ParserData.MlyValue.VOID,p1,p2)) fun WITHTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( ParserData.MlyValue.VOID,p1,p2)) fun WHILE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( ParserData.MlyValue.VOID,p1,p2)) fun LPAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( ParserData.MlyValue.VOID,p1,p2)) fun RPAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( ParserData.MlyValue.VOID,p1,p2)) fun RBRACK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( ParserData.MlyValue.VOID,p1,p2)) fun RBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( ParserData.MlyValue.VOID,p1,p2)) fun COMMA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( ParserData.MlyValue.VOID,p1,p2)) fun COLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( ParserData.MlyValue.VOID,p1,p2)) fun SEMICOLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 41,( ParserData.MlyValue.VOID,p1,p2)) fun DOTS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 42,( ParserData.MlyValue.VOID,p1,p2)) fun UNDERBAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 43,( ParserData.MlyValue.VOID,p1,p2)) fun BAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 44,( ParserData.MlyValue.VOID,p1,p2)) fun EQUALS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 45,( ParserData.MlyValue.VOID,p1,p2)) fun DARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 46,( ParserData.MlyValue.VOID,p1,p2)) fun ARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 47,( ParserData.MlyValue.VOID,p1,p2)) fun HASH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 48,( ParserData.MlyValue.VOID,p1,p2)) fun EQTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 49,( ParserData.MlyValue.VOID,p1,p2)) fun FUNCTOR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 50,( ParserData.MlyValue.VOID,p1,p2)) fun INCLUDE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 51,( ParserData.MlyValue.VOID,p1,p2)) fun SHARING (p1,p2) = Token.TOKEN (ParserData.LrTable.T 52,( ParserData.MlyValue.VOID,p1,p2)) fun SIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 53,( ParserData.MlyValue.VOID,p1,p2)) fun SIGNATURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 54,( ParserData.MlyValue.VOID,p1,p2)) fun STRUCT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 55,( ParserData.MlyValue.VOID,p1,p2)) fun STRUCTURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 56,( ParserData.MlyValue.VOID,p1,p2)) fun WHERE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 57,( ParserData.MlyValue.VOID,p1,p2)) fun COLONGREATER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 58,( ParserData.MlyValue.VOID,p1,p2)) fun ZERO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 59,( ParserData.MlyValue.VOID,p1,p2)) fun DIGIT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 60,( ParserData.MlyValue.DIGIT (fn () => i),p1,p2)) fun NUMERIC (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 61,( ParserData.MlyValue.NUMERIC (fn () => i),p1,p2)) fun INT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 62,( ParserData.MlyValue.INT (fn () => i),p1,p2)) fun WORD (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 63,( ParserData.MlyValue.WORD (fn () => i),p1,p2)) fun REAL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 64,( ParserData.MlyValue.REAL (fn () => i),p1,p2)) fun STRING (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 65,( ParserData.MlyValue.STRING (fn () => i),p1,p2)) fun CHAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 66,( ParserData.MlyValue.CHAR (fn () => i),p1,p2)) fun ALPHA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 67,( ParserData.MlyValue.ALPHA (fn () => i),p1,p2)) fun SYMBOL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 68,( ParserData.MlyValue.SYMBOL (fn () => i),p1,p2)) fun STAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 69,( ParserData.MlyValue.VOID,p1,p2)) fun TYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 70,( ParserData.MlyValue.TYVAR (fn () => i),p1,p2)) fun ETYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 71,( ParserData.MlyValue.ETYVAR (fn () => i),p1,p2)) fun LONGID (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 72,( ParserData.MlyValue.LONGID (fn () => i),p1,p2)) end end (* stop of Parser.grm.sml *) (* start of Lexer.lex.sml *) type int = Int.int functor LexerFn(structure Tokens: Parser_TOKENS) = struct structure UserDeclarations = struct (* * Standard ML lexical analysis * * Definition, sections 2.1-2.5, 3.1 * * Notes: * Since all lexical classes must be disjoint: * - There is no single class ID, use ALPHA|SYMBOL|STAR|EQUALS. * - There is no class LAB, use ALPHA|SYMBOL|NUMERIC|DIGIT|STAR. * - ID does not contain `=' and `*', those are EQUALS and STAR. * - LONGID does not contain unqualified ids (but allows for `=' and `*'). * - INT does not contain positive decimal integers without leading 0, * and single DIGIT integers, those are in NUMERIC, DIGIT, and ZERO. * - NUMERIC does not contain single digit numbers, those are in DIGIT. * - DIGIT does not contain 0, that is ZERO. * * The parser uses a global variable to recognise nested comments, so it is * not reentrant. *) open Tokens (* Types to match structure LEXER.UserDeclaration *) type ('a,'b) token = ('a,'b) Tokens.token type pos = int type svalue = Tokens.svalue type lexresult = (svalue, pos) token (* Handling nested comments *) val nesting = ref 0 (* non-reentrant side-effect way :-P *) fun eof() = if !nesting = 0 then Tokens.EOF(0, 0) else Error.error((0,0), "unclosed comment") (* Some helpers to create tokens *) open Tokens fun toLRPos(yypos, yytext) = let val yypos = yypos - 2 (* bug in ML-Lex... *) in (yypos, yypos + String.size yytext) end fun token(TOKEN, yypos, yytext) = TOKEN(toLRPos(yypos, yytext)) fun tokenOf(TOKEN, toVal, yypos, yytext) = let val i as (l,r) = toLRPos(yypos, yytext) in TOKEN(toVal(yytext, i), l, r) end fun error(yypos, yytext, s) = Error.error(toLRPos(yypos,yytext), s) fun invalid(yypos, yytext) = let val s = "invalid character `" ^ String.toCString yytext ^ "'" in error(yypos, yytext, s) end (* Convert identifiers *) fun toId(s, i) = s fun toLongId(s, i) = let fun split [] = raise Fail "Lexer.toLongId: empty longid" | split [x] = ([],x) | split(x::xs) = let val (ys,y) = split xs in (x::ys,y) end in split(String.fields (fn c => c = #".") s) end (* Convert constants [Section 2.2] *) local open StringCvt in fun toInt(s,i) = (case String.explode s of #"0" :: #"x" :: s' => valOf(scanString (Int.scan HEX) (String.implode s')) | #"~" :: #"0" :: #"x" :: s' => ~(valOf(scanString (Int.scan HEX) (String.implode s'))) | _ => valOf(scanString (Int.scan DEC) s) ) handle Overflow => Error.error(i, "integer constant too big") fun toWord(s,i) = (case String.explode s of #"0" :: #"w" :: #"x" :: s' => valOf(scanString (Word.scan HEX) (String.implode s')) | #"0" :: #"w" :: s' => valOf(scanString (Word.scan DEC) (String.implode s')) | _ => raise Fail "Lexer.toWord: invalid word constant" ) handle Overflow => Error.error(i, "word constant too big") fun toReal(s,i) = valOf(scanString Real.scan s) fun toString(s,i) = let fun convert(#"\\"::s, cs) = escape(s, cs) | convert([#"\""], cs) = cs | convert(c::s, cs) = convert(s, c::cs) | convert([], cs) = raise Fail "Lexer.toString: unclosed string literal" and escape(#"a"::s, cs) = convert(s, #"\a"::cs) | escape(#"b"::s, cs) = convert(s, #"\b"::cs) | escape(#"t"::s, cs) = convert(s, #"\t"::cs) | escape(#"n"::s, cs) = convert(s, #"\n"::cs) | escape(#"v"::s, cs) = convert(s, #"\v"::cs) | escape(#"f"::s, cs) = convert(s, #"\f"::cs) | escape(#"r"::s, cs) = convert(s, #"\r"::cs) | escape(#"\""::s, cs) = convert(s, #"\""::cs) | escape(#"\\"::s, cs) = convert(s, #"\\"::cs) | escape(#"^"::c::s, cs) = convert(s, Char.chr(Char.ord c - 64)::cs) | escape(#"u"::x1::x2::x3::x4::s, cs) = convert(s, unicode[x1,x2,x3,x4]::cs) | escape(c::s, cs) = if Char.isDigit c then case s of c2::c3::s => convert(s, ascii[c,c2,c3]::cs) | _ => raise Fail "Lexer.toString: invalid ASCII escape sequence" else if Char.isSpace c then escapeGap(s,cs) else raise Fail "Lexer.toString: invalid escape sequence" | escape([], cs) = raise Fail "Lexer.toString: empty escape character" and escapeGap(c::s, cs) = if Char.isSpace c then escapeGap(s, cs) else (* c = #"\\" *) convert(s, cs) | escapeGap([], cs) = raise Fail "Lexer.toString: invalid string gap" and ascii s = Char.chr(valOf(scanString (Int.scan DEC) (String.implode s))) handle Chr => Error.error(i, "ASCII escape character too big") | Overflow => Error.error(i, "ASCII escape character too big") and unicode s = Char.chr(valOf(scanString (Int.scan HEX) (String.implode s))) handle Chr => Error.error(i, "unicode escape character too big") | Overflow => Error.error(i, "unicode escape character too big") val cs = List.tl(String.explode s) in String.implode(List.rev(convert(cs, []))) end fun toChar(s,i) = let val s' = String.substring(s, 1, String.size s-1) val ss' = toString(s',i) in if String.size ss' = 1 then String.sub(ss',0) else if ss' = "" then Error.error(i, "empty character constant") else Error.error(i, "character constant too long") end end (* local *) end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s = [ (0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (1, "\005\005\005\005\005\005\005\005\005\235\236\235\235\235\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\235\180\223\211\180\180\180\209\207\206\205\180\204\202\199\180\ \\191\189\189\189\189\189\189\189\189\189\187\186\180\184\180\180\ \\180\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\ \\025\025\025\025\025\025\025\025\025\025\025\183\180\182\180\181\ \\180\166\025\162\153\134\126\025\120\108\025\025\101\025\095\085\ \\025\025\078\055\048\025\045\030\025\025\025\024\023\022\006\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" ), (3, "\237\237\237\237\237\237\237\237\237\237\242\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\240\237\238\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237" ), (6, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\019\008\008\008\008\008\008\008\008\008\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (7, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (8, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\008\008\008\008\008\008\008\008\008\008\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (9, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (10, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\011\011\011\011\011\011\011\011\011\011\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (12, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (13, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (14, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (15, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\018\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (16, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (18, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\018\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (19, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\008\008\008\008\008\008\008\008\008\008\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (20, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\021\021\021\021\021\021\021\021\021\021\000\000\000\000\000\000\ \\000\021\021\021\021\021\021\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\021\021\021\021\021\021\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (25, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (27, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\028\000\028\028\028\028\000\000\000\028\028\000\028\000\028\ \\000\000\000\000\000\000\000\000\000\000\028\000\028\028\028\028\ \\028\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\028\000\028\000\ \\028\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\028\000\028\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (28, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\028\000\028\028\028\028\000\000\000\028\028\000\028\000\028\ \\000\000\000\000\000\000\000\000\000\000\028\000\028\028\028\028\ \\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\028\000\028\000\ \\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\028\000\028\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (29, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\029\000\000\000\000\000\000\027\000\ \\029\029\029\029\029\029\029\029\029\029\000\000\000\000\000\000\ \\000\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\000\000\000\029\ \\000\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (30, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\038\031\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (31, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\032\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (32, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\033\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (33, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\034\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (34, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\035\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (35, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\036\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (36, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\037\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (38, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\042\026\026\026\039\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (39, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\040\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (40, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\041\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (42, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\043\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (43, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\044\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (45, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\046\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (46, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\047\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (48, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\052\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\049\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (49, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\050\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (50, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\051\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (52, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\053\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (53, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\054\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (55, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\072\064\026\026\026\026\026\026\ \\026\026\026\026\056\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (56, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\057\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (57, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\058\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (58, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\059\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (59, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\060\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (60, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\061\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (61, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\062\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (62, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\063\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (64, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\065\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (65, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\066\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (66, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\067\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (67, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\068\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (68, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\069\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (69, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\070\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (70, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\071\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (72, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\073\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (73, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\074\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (74, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\075\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (75, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\076\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (76, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\077\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (78, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\081\026\026\026\079\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (79, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\080\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (81, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\082\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (82, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\083\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (83, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\084\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (85, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\094\026\026\026\026\026\026\026\026\026\ \\091\026\086\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (86, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\087\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (87, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\088\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (88, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\089\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (89, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\090\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (91, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\092\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (92, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\093\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (95, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\096\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (96, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\097\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (97, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\098\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (98, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\099\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (99, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\100\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (101, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\106\026\026\026\026\026\026\026\026\026\102\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (102, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\103\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (103, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\104\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (104, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\105\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (106, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\107\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (108, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\119\026\026\026\026\026\026\026\109\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (109, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\114\026\026\110\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (110, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\111\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (111, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\112\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (112, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\113\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (114, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\115\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (115, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\116\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (116, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\117\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (117, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\118\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (120, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\121\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (121, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\122\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (122, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\123\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (123, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\124\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (124, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\125\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (126, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\133\026\ \\026\026\026\026\026\127\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (127, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\128\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (128, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\129\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (129, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\130\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (130, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\131\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (131, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\132\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (134, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\150\026\148\026\ \\026\143\026\026\026\026\026\026\135\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (135, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\136\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (136, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\137\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (137, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\138\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (138, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\139\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (139, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\140\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (140, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\141\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (141, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\142\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (143, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\144\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (144, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\145\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (145, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\146\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (146, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\147\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (148, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\149\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (150, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\151\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (151, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\152\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (153, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\155\026\026\026\026\026\026\026\026\026\026\026\026\026\154\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (155, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\156\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (156, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\157\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (157, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\158\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (158, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\159\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (159, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\160\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (160, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\161\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (162, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\163\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (163, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\164\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (164, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\165\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (166, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\174\026\026\026\026\026\026\026\026\026\026\026\168\026\ \\026\026\026\167\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (168, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\169\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (169, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\170\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (170, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\171\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (171, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\172\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (172, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\173\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (174, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\175\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (175, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\176\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (176, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\177\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (177, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\178\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (178, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\179\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (184, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\185\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (187, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\188\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (189, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\190\190\190\190\190\190\190\190\190\190\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (191, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\198\198\198\198\198\198\198\198\198\198\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\194\192\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (192, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\193\193\193\193\193\193\193\193\193\193\000\000\000\000\000\000\ \\000\193\193\193\193\193\193\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\193\193\193\193\193\193\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (194, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\197\197\197\197\197\197\197\197\197\197\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\195\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (195, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\196\196\196\196\196\196\196\196\196\196\000\000\000\000\000\000\ \\000\196\196\196\196\196\196\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\196\196\196\196\196\196\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (197, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\197\197\197\197\197\197\197\197\197\197\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (198, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\198\198\198\198\198\198\198\198\198\198\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (199, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (200, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\201\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (202, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\203\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (207, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\208\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (209, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\210\000\000\000\000\000\000\000\000\ \\210\210\210\210\210\210\210\210\210\210\000\000\000\000\000\000\ \\000\210\210\210\210\210\210\210\210\210\210\210\210\210\210\210\ \\210\210\210\210\210\210\210\210\210\210\210\000\000\000\000\210\ \\000\210\210\210\210\210\210\210\210\210\210\210\210\210\210\210\ \\210\210\210\210\210\210\210\210\210\210\210\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (211, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\212\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (212, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\222\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\213\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\000\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212" ), (213, "\000\000\000\000\000\000\000\000\000\221\221\221\221\221\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\221\000\212\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\219\219\219\219\219\219\219\219\219\219\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\212\000\218\000\ \\000\212\212\000\000\000\212\000\000\000\000\000\000\000\212\000\ \\000\000\212\000\212\214\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (214, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\215\215\215\215\215\215\215\215\215\215\000\000\000\000\000\000\ \\000\215\215\215\215\215\215\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\215\215\215\215\215\215\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (215, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\216\216\216\216\216\216\216\216\216\216\000\000\000\000\000\000\ \\000\216\216\216\216\216\216\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\216\216\216\216\216\216\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (216, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\217\217\217\217\217\217\217\217\217\217\000\000\000\000\000\000\ \\000\217\217\217\217\217\217\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\217\217\217\217\217\217\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (217, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\000\000\000\000\000\000\ \\000\212\212\212\212\212\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\212\212\212\212\212\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (218, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (219, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\220\220\220\220\220\220\220\220\220\220\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (220, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (221, "\000\000\000\000\000\000\000\000\000\221\221\221\221\221\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\212\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (223, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\234\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\225\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\000\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224" ), (225, "\000\000\000\000\000\000\000\000\000\233\233\233\233\233\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\233\000\224\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\231\231\231\231\231\231\231\231\231\231\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\224\000\230\000\ \\000\224\224\000\000\000\224\000\000\000\000\000\000\000\224\000\ \\000\000\224\000\224\226\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (226, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\227\227\227\227\227\227\227\227\227\227\000\000\000\000\000\000\ \\000\227\227\227\227\227\227\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\227\227\227\227\227\227\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (227, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\228\228\228\228\228\228\228\228\228\228\000\000\000\000\000\000\ \\000\228\228\228\228\228\228\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\228\228\228\228\228\228\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (228, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\229\229\229\229\229\229\229\229\229\229\000\000\000\000\000\000\ \\000\229\229\229\229\229\229\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\229\229\229\229\229\229\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (229, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\000\000\000\000\000\000\ \\000\224\224\224\224\224\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\224\224\224\224\224\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (230, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (231, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\232\232\232\232\232\232\232\232\232\232\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (232, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (233, "\000\000\000\000\000\000\000\000\000\233\233\233\233\233\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (235, "\000\000\000\000\000\000\000\000\000\236\236\236\236\236\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (238, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (240, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (0, "")] fun f x = x val s = map f (rev (tl (rev s))) exception LexHackingError fun look ((j,x)::r, i) = if i = j then x else look(r, i) | look ([], i) = raise LexHackingError fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} in Vector.fromList(map g [{fin = [], trans = 0}, {fin = [], trans = 1}, {fin = [], trans = 1}, {fin = [], trans = 3}, {fin = [], trans = 3}, {fin = [(N 472)], trans = 0}, {fin = [(N 436),(N 472)], trans = 6}, {fin = [(N 436)], trans = 7}, {fin = [(N 304)], trans = 8}, {fin = [], trans = 9}, {fin = [], trans = 10}, {fin = [(N 342)], trans = 10}, {fin = [(N 342)], trans = 12}, {fin = [], trans = 13}, {fin = [(N 342)], trans = 14}, {fin = [], trans = 15}, {fin = [], trans = 16}, {fin = [(N 342)], trans = 16}, {fin = [(N 342)], trans = 18}, {fin = [(N 304)], trans = 19}, {fin = [], trans = 20}, {fin = [(N 304)], trans = 20}, {fin = [(N 43),(N 472)], trans = 0}, {fin = [(N 41),(N 436),(N 472)], trans = 7}, {fin = [(N 39),(N 472)], trans = 0}, {fin = [(N 433),(N 472)], trans = 25}, {fin = [(N 433)], trans = 25}, {fin = [], trans = 27}, {fin = [(N 455)], trans = 28}, {fin = [(N 455)], trans = 29}, {fin = [(N 433),(N 472)], trans = 30}, {fin = [(N 433)], trans = 31}, {fin = [(N 433)], trans = 32}, {fin = [(N 273),(N 433)], trans = 33}, {fin = [(N 433)], trans = 34}, {fin = [(N 433)], trans = 35}, {fin = [(N 433)], trans = 36}, {fin = [(N 282),(N 433)], trans = 25}, {fin = [(N 433)], trans = 38}, {fin = [(N 433)], trans = 39}, {fin = [(N 433)], trans = 40}, {fin = [(N 268),(N 433)], trans = 25}, {fin = [(N 433)], trans = 42}, {fin = [(N 433)], trans = 43}, {fin = [(N 262),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 45}, {fin = [(N 433)], trans = 46}, {fin = [(N 256),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 48}, {fin = [(N 433)], trans = 49}, {fin = [(N 433)], trans = 50}, {fin = [(N 252),(N 433)], trans = 25}, {fin = [(N 433)], trans = 52}, {fin = [(N 433)], trans = 53}, {fin = [(N 247),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 55}, {fin = [(N 433)], trans = 56}, {fin = [(N 433)], trans = 57}, {fin = [(N 433)], trans = 58}, {fin = [(N 433)], trans = 59}, {fin = [(N 232),(N 433)], trans = 60}, {fin = [(N 433)], trans = 61}, {fin = [(N 433)], trans = 62}, {fin = [(N 242),(N 433)], trans = 25}, {fin = [(N 433)], trans = 64}, {fin = [(N 215),(N 433)], trans = 65}, {fin = [(N 433)], trans = 66}, {fin = [(N 433)], trans = 67}, {fin = [(N 433)], trans = 68}, {fin = [(N 433)], trans = 69}, {fin = [(N 433)], trans = 70}, {fin = [(N 225),(N 433)], trans = 25}, {fin = [(N 433)], trans = 72}, {fin = [(N 433)], trans = 73}, {fin = [(N 433)], trans = 74}, {fin = [(N 433)], trans = 75}, {fin = [(N 433)], trans = 76}, {fin = [(N 211),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 78}, {fin = [(N 433)], trans = 79}, {fin = [(N 203),(N 433)], trans = 25}, {fin = [(N 433)], trans = 81}, {fin = [(N 433)], trans = 82}, {fin = [(N 433)], trans = 83}, {fin = [(N 199),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 85}, {fin = [(N 433)], trans = 86}, {fin = [(N 433)], trans = 87}, {fin = [(N 433)], trans = 88}, {fin = [(N 433)], trans = 89}, {fin = [(N 193),(N 433)], trans = 25}, {fin = [(N 181),(N 433)], trans = 91}, {fin = [(N 433)], trans = 92}, {fin = [(N 186),(N 433)], trans = 25}, {fin = [(N 178),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 95}, {fin = [(N 433)], trans = 96}, {fin = [(N 433)], trans = 97}, {fin = [(N 433)], trans = 98}, {fin = [(N 433)], trans = 99}, {fin = [(N 175),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 101}, {fin = [(N 433)], trans = 102}, {fin = [(N 433)], trans = 103}, {fin = [(N 433)], trans = 104}, {fin = [(N 168),(N 433)], trans = 25}, {fin = [(N 433)], trans = 106}, {fin = [(N 162),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 108}, {fin = [(N 137),(N 433)], trans = 109}, {fin = [(N 433)], trans = 110}, {fin = [(N 433)], trans = 111}, {fin = [(N 151),(N 433)], trans = 112}, {fin = [(N 158),(N 433)], trans = 25}, {fin = [(N 433)], trans = 114}, {fin = [(N 433)], trans = 115}, {fin = [(N 433)], trans = 116}, {fin = [(N 433)], trans = 117}, {fin = [(N 145),(N 433)], trans = 25}, {fin = [(N 134),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 120}, {fin = [(N 433)], trans = 121}, {fin = [(N 433)], trans = 122}, {fin = [(N 433)], trans = 123}, {fin = [(N 433)], trans = 124}, {fin = [(N 131),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 126}, {fin = [(N 433)], trans = 127}, {fin = [(N 116),(N 433)], trans = 128}, {fin = [(N 433)], trans = 129}, {fin = [(N 433)], trans = 130}, {fin = [(N 433)], trans = 131}, {fin = [(N 124),(N 433)], trans = 25}, {fin = [(N 112),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 134}, {fin = [(N 433)], trans = 135}, {fin = [(N 433)], trans = 136}, {fin = [(N 433)], trans = 137}, {fin = [(N 433)], trans = 138}, {fin = [(N 433)], trans = 139}, {fin = [(N 433)], trans = 140}, {fin = [(N 433)], trans = 141}, {fin = [(N 109),(N 433)], trans = 25}, {fin = [(N 433)], trans = 143}, {fin = [(N 433)], trans = 144}, {fin = [(N 433)], trans = 145}, {fin = [(N 433)], trans = 146}, {fin = [(N 99),(N 433)], trans = 25}, {fin = [(N 433)], trans = 148}, {fin = [(N 92),(N 433)], trans = 25}, {fin = [(N 433)], trans = 150}, {fin = [(N 433)], trans = 151}, {fin = [(N 88),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 153}, {fin = [(N 83),(N 433)], trans = 25}, {fin = [(N 433)], trans = 155}, {fin = [(N 433)], trans = 156}, {fin = [(N 433)], trans = 157}, {fin = [(N 433)], trans = 158}, {fin = [(N 433)], trans = 159}, {fin = [(N 433)], trans = 160}, {fin = [(N 80),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 162}, {fin = [(N 433)], trans = 163}, {fin = [(N 433)], trans = 164}, {fin = [(N 71),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 166}, {fin = [(N 66),(N 433)], trans = 25}, {fin = [(N 433)], trans = 168}, {fin = [(N 55),(N 433)], trans = 169}, {fin = [(N 433)], trans = 170}, {fin = [(N 433)], trans = 171}, {fin = [(N 433)], trans = 172}, {fin = [(N 63),(N 433)], trans = 25}, {fin = [(N 433)], trans = 174}, {fin = [(N 433)], trans = 175}, {fin = [(N 433)], trans = 176}, {fin = [(N 433)], trans = 177}, {fin = [(N 433)], trans = 178}, {fin = [(N 51),(N 433)], trans = 25}, {fin = [(N 436),(N 472)], trans = 7}, {fin = [(N 37),(N 472)], trans = 0}, {fin = [(N 35),(N 472)], trans = 0}, {fin = [(N 33),(N 472)], trans = 0}, {fin = [(N 28),(N 436),(N 472)], trans = 184}, {fin = [(N 31),(N 436)], trans = 7}, {fin = [(N 26),(N 472)], trans = 0}, {fin = [(N 21),(N 436),(N 472)], trans = 187}, {fin = [(N 24),(N 436)], trans = 7}, {fin = [(N 286),(N 289),(N 304),(N 472)], trans = 189}, {fin = [(N 289),(N 304)], trans = 189}, {fin = [(N 284),(N 304),(N 472)], trans = 191}, {fin = [], trans = 192}, {fin = [(N 304)], trans = 192}, {fin = [], trans = 194}, {fin = [], trans = 195}, {fin = [(N 314)], trans = 195}, {fin = [(N 314)], trans = 197}, {fin = [(N 304)], trans = 198}, {fin = [(N 472)], trans = 199}, {fin = [], trans = 200}, {fin = [(N 19)], trans = 0}, {fin = [(N 436),(N 472)], trans = 202}, {fin = [(N 15),(N 436)], trans = 7}, {fin = [(N 12),(N 472)], trans = 0}, {fin = [(N 10),(N 436),(N 472)], trans = 7}, {fin = [(N 8),(N 472)], trans = 0}, {fin = [(N 6),(N 472)], trans = 207}, {fin = [(N 458)], trans = 0}, {fin = [(N 428),(N 472)], trans = 209}, {fin = [(N 428)], trans = 209}, {fin = [(N 4),(N 436),(N 472)], trans = 211}, {fin = [], trans = 212}, {fin = [], trans = 213}, {fin = [], trans = 214}, {fin = [], trans = 215}, {fin = [], trans = 216}, {fin = [], trans = 217}, {fin = [], trans = 218}, {fin = [], trans = 219}, {fin = [], trans = 220}, {fin = [], trans = 221}, {fin = [(N 423)], trans = 0}, {fin = [(N 470),(N 472)], trans = 223}, {fin = [], trans = 223}, {fin = [], trans = 225}, {fin = [], trans = 226}, {fin = [], trans = 227}, {fin = [], trans = 228}, {fin = [], trans = 229}, {fin = [], trans = 230}, {fin = [], trans = 231}, {fin = [], trans = 232}, {fin = [], trans = 233}, {fin = [(N 382)], trans = 0}, {fin = [(N 2),(N 472)], trans = 235}, {fin = [(N 2)], trans = 235}, {fin = [(N 466)], trans = 0}, {fin = [(N 466)], trans = 238}, {fin = [(N 464)], trans = 0}, {fin = [(N 466)], trans = 240}, {fin = [(N 461)], trans = 0}, {fin = [(N 468)], trans = 0}]) end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val COMMENT = STARTSTATE 3; val INITIAL = STARTSTATE 1; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end type int = Int.int fun makeLexer (yyinput: int -> string) = let val yygone0:int=1 val yyb = ref "\n" (* buffer *) val yybl: int ref = ref 1 (*buffer length *) val yybufpos: int ref = ref 1 (* location of next character to use *) val yygone: int ref = ref yygone0 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin: int ref = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex () : Internal.result = let fun continue() = lex() in let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0: int) = let fun action (i: int,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let fun yymktext() = String.substring(!yyb,i0,i-i0) val yypos: int = i0+ !yygone open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 10 => let val yytext=yymktext() in token(STAR, yypos, yytext) end | 109 => let val yytext=yymktext() in token(EXCEPTION, yypos, yytext) end | 112 => let val yytext=yymktext() in token(FN, yypos, yytext) end | 116 => let val yytext=yymktext() in token(FUN, yypos, yytext) end | 12 => let val yytext=yymktext() in token(COMMA, yypos, yytext) end | 124 => let val yytext=yymktext() in token(FUNCTOR, yypos, yytext) end | 131 => let val yytext=yymktext() in token(HANDLE, yypos, yytext) end | 134 => let val yytext=yymktext() in token(IF, yypos, yytext) end | 137 => let val yytext=yymktext() in token(IN, yypos, yytext) end | 145 => let val yytext=yymktext() in token(INCLUDE, yypos, yytext) end | 15 => let val yytext=yymktext() in token(ARROW, yypos, yytext) end | 151 => let val yytext=yymktext() in token(INFIX, yypos, yytext) end | 158 => let val yytext=yymktext() in token(INFIXR, yypos, yytext) end | 162 => let val yytext=yymktext() in token(LET, yypos, yytext) end | 168 => let val yytext=yymktext() in token(LOCAL, yypos, yytext) end | 175 => let val yytext=yymktext() in token(NONFIX, yypos, yytext) end | 178 => let val yytext=yymktext() in token(OF, yypos, yytext) end | 181 => let val yytext=yymktext() in token(OP, yypos, yytext) end | 186 => let val yytext=yymktext() in token(OPEN, yypos, yytext) end | 19 => let val yytext=yymktext() in token(DOTS, yypos, yytext) end | 193 => let val yytext=yymktext() in token(ORELSE, yypos, yytext) end | 199 => let val yytext=yymktext() in token(RAISE, yypos, yytext) end | 2 => ( continue() ) | 203 => let val yytext=yymktext() in token(REC, yypos, yytext) end | 21 => let val yytext=yymktext() in token(COLON, yypos, yytext) end | 211 => let val yytext=yymktext() in token(SHARING, yypos, yytext) end | 215 => let val yytext=yymktext() in token(SIG, yypos, yytext) end | 225 => let val yytext=yymktext() in token(SIGNATURE, yypos, yytext) end | 232 => let val yytext=yymktext() in token(STRUCT, yypos, yytext) end | 24 => let val yytext=yymktext() in token(COLONGREATER, yypos, yytext) end | 242 => let val yytext=yymktext() in token(STRUCTURE, yypos, yytext) end | 247 => let val yytext=yymktext() in token(THEN, yypos, yytext) end | 252 => let val yytext=yymktext() in token(TYPE, yypos, yytext) end | 256 => let val yytext=yymktext() in token(VAL, yypos, yytext) end | 26 => let val yytext=yymktext() in token(SEMICOLON, yypos, yytext) end | 262 => let val yytext=yymktext() in token(WHERE, yypos, yytext) end | 268 => let val yytext=yymktext() in token(WHILE, yypos, yytext) end | 273 => let val yytext=yymktext() in token(WITH, yypos, yytext) end | 28 => let val yytext=yymktext() in token(EQUALS, yypos, yytext) end | 282 => let val yytext=yymktext() in token(WITHTYPE, yypos, yytext) end | 284 => let val yytext=yymktext() in token (ZERO, yypos, yytext) end | 286 => let val yytext=yymktext() in tokenOf(DIGIT, toInt, yypos, yytext) end | 289 => let val yytext=yymktext() in tokenOf(NUMERIC, toInt, yypos, yytext) end | 304 => let val yytext=yymktext() in tokenOf(INT, toInt, yypos, yytext) end | 31 => let val yytext=yymktext() in token(DARROW, yypos, yytext) end | 314 => let val yytext=yymktext() in tokenOf(WORD, toWord, yypos, yytext) end | 33 => let val yytext=yymktext() in token(LBRACK, yypos, yytext) end | 342 => let val yytext=yymktext() in tokenOf(REAL, toReal, yypos, yytext) end | 35 => let val yytext=yymktext() in token(RBRACK, yypos, yytext) end | 37 => let val yytext=yymktext() in token(UNDERBAR, yypos, yytext) end | 382 => let val yytext=yymktext() in tokenOf(STRING, toString, yypos, yytext) end | 39 => let val yytext=yymktext() in token(LBRACE, yypos, yytext) end | 4 => let val yytext=yymktext() in token(HASH, yypos, yytext) end | 41 => let val yytext=yymktext() in token(BAR, yypos, yytext) end | 423 => let val yytext=yymktext() in tokenOf(CHAR, toChar, yypos, yytext) end | 428 => let val yytext=yymktext() in tokenOf(TYVAR, toId, yypos, yytext) end | 43 => let val yytext=yymktext() in token(RBRACE, yypos, yytext) end | 433 => let val yytext=yymktext() in tokenOf(ALPHA, toId, yypos, yytext) end | 436 => let val yytext=yymktext() in tokenOf(SYMBOL, toId, yypos, yytext) end | 455 => let val yytext=yymktext() in tokenOf(LONGID, toLongId, yypos, yytext) end | 458 => ( nesting := 1 ; YYBEGIN COMMENT ; continue() ) | 461 => ( nesting := !nesting+1 ; continue() ) | 464 => ( nesting := !nesting-1 ; if !nesting = 0 then YYBEGIN INITIAL else () ; continue() ) | 466 => ( continue() ) | 468 => ( continue() ) | 470 => let val yytext=yymktext() in error(yypos, yytext, "invalid string") end | 472 => let val yytext=yymktext() in invalid(yypos, yytext) end | 51 => let val yytext=yymktext() in token(ABSTYPE, yypos, yytext) end | 55 => let val yytext=yymktext() in token(AND, yypos, yytext) end | 6 => let val yytext=yymktext() in token(LPAR, yypos, yytext) end | 63 => let val yytext=yymktext() in token(ANDALSO, yypos, yytext) end | 66 => let val yytext=yymktext() in token(AS, yypos, yytext) end | 71 => let val yytext=yymktext() in token(CASE, yypos, yytext) end | 8 => let val yytext=yymktext() in token(RPAR, yypos, yytext) end | 80 => let val yytext=yymktext() in token(DATATYPE, yypos, yytext) end | 83 => let val yytext=yymktext() in token(DO, yypos, yytext) end | 88 => let val yytext=yymktext() in token(ELSE, yypos, yytext) end | 92 => let val yytext=yymktext() in token(END, yypos, yytext) end | 99 => let val yytext=yymktext() in token(EQTYPE, yypos, yytext) end | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (String.size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof () else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := String.substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := String.size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(CharVector.sub(!yyb,l)) val NewState = Char.ord(CharVector.sub(trans,NewChar)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if String.substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end end in lex end end (* stop of Lexer.lex.sml *) (* start of PARSE.sml *) signature PARSE = sig (* Import *) type source = Source.source type InfEnv = Infix.InfEnv type Program = GrammarProgram.Program (* Export *) val parse: InfEnv * source -> InfEnv * Program end (* stop of PARSE.sml *) (* start of Parse.sml *) structure Parse :> PARSE = struct (* Import *) type source = Source.source type InfEnv = Infix.InfEnv type Program = GrammarProgram.Program (* Build Yacc parser *) structure LrVals = LrValsFn(structure Token = LrParser.Token) structure Lexer = LexerFn (structure Tokens = LrVals.Tokens) structure Parser = Join (structure LrParser = LrParser structure ParserData = LrVals.ParserData structure Lex = Lexer) (* The actual parsing function *) fun parse(J, source) = let val yyread = ref false fun yyinput _ = if !yyread then "" else ( yyread := true; source ) val lexer = Parser.makeLexer yyinput fun onError(s, pos1, pos2) = Error.error((pos1,pos2), s) val ((program,J'), lexer') = Parser.parse(0, lexer, onError, J) in (J',program) end end (* stop of Parse.sml *) (* start of SML.sml *) (* * Standard ML implementation main structure *) signature SML = sig val parseString: string -> unit (* Parse only *) val elabString: string -> unit (* Parse and elaborate *) val evalString: string -> unit (* Parse and evaluate *) val execString: string -> unit (* Parse, elaborate, and evaluate *) val parseFile: string -> unit val elabFile: string -> unit val evalFile: string -> unit val execFile: string -> unit val parseFiles: string -> unit val elabFiles: string -> unit val evalFiles: string -> unit val execFiles: string -> unit val parseSession: unit -> unit val elabSession: unit -> unit val evalSession: unit -> unit val execSession: unit -> unit end (* stop of SML.sml *) (* start of Sml.sml *) (* * Standard ML implementation main structure *) structure Sml :> SML = struct (* Initial arguments *) val J0 = InitialInfixEnv.J0 val B_STAT0 = InitialStaticBasis.B0 val B_DYN0 = InitialDynamicBasis.B0 val B0 = (B_STAT0, B_DYN0) val s0 = InitialDynamicBasis.s (* Parsing only *) fun parse J source = let val (J',program) = Parse.parse(J, source) val _ = TextIO.output(TextIO.stdOut, "OK\n") in J' end val parseInitialArg = J0 val parseInitial = parse parseInitialArg (* Parsing and elaboration *) val elabInitialArg = (J0, B_STAT0) fun elab (J, B_STAT) source = let val (J',program) = Parse.parse(J, source) val B_STAT' = Program.elabProgram(B_STAT, program) in (J', B_STAT') end (* Parsing and evaluation *) val evalInitialArg = (J0, B_DYN0, s0) fun eval (J, B_DYN, s) source = let val (J',program) = Parse.parse(J, source) val s' = ref s val B_DYN' = Program.evalProgram(s', B_DYN, program) in (J', B_DYN', !s') end (* Parsing, elaboration, and evaluation *) val execInitialArg = (J0, B0, s0) fun exec (J, B, s) source = let val (J',program) = Parse.parse(J, source) val s' = ref s val B' = Program.execProgram(s', B, program) in (J', B', !s' ) end (* Processing of strings *) fun processString (process, arg) source = ignore(process arg source) handle Error.Error _ => () (* Syntax error *) val parseString = processString(parse, parseInitialArg) val elabString = processString(elab, elabInitialArg) val evalString = processString(eval, evalInitialArg) val execString = processString(exec, execInitialArg) (* Processing of files *) fun processFile (process, arg) name = let val file = TextIO.openIn name val source = TextIO.inputAll file val _ = TextIO.closeIn file in ignore(process arg source) handle Error.Error _ => () (* Syntax error *) end val parseFile = processFile(parse, parseInitialArg) val elabFile = processFile(elab, elabInitialArg) val evalFile = processFile(eval, evalInitialArg) val execFile = processFile(exec, execInitialArg) (* Processing several files mentioned in a list file *) fun processFiles (process, initialArg) name = let val file = TextIO.openIn name val content = TextIO.inputAll file val _ = TextIO.closeIn file val _ = Stamp.reset() fun loop(arg, [] ) = () | loop(arg, "" ::names) = loop(arg, names) | loop(arg, name::names) = let val file = TextIO.openIn name val source = TextIO.inputAll file val _ = TextIO.closeIn file val _ = TextIO.output(TextIO.stdOut, ">> File \"" ^ name ^ "\":\n") in loop(process arg source, names) handle Error.Error _ => (* Syntax error *) loop(arg, names) end in loop(initialArg, String.fields Char.isSpace content) end val parseFiles = processFiles(parse, parseInitialArg) val elabFiles = processFiles(elab, elabInitialArg) val evalFiles = processFiles(eval, evalInitialArg) val execFiles = processFiles(exec, execInitialArg) (* Session *) fun processSession(process, initialArg) = let val ins = !ins fun loop arg = let val _ = TextIO.output(TextIO.stdOut, "SML> ") val _ = TextIO.flushOut TextIO.stdOut in case TextIO.inputLine ins of NONE => () | SOME source => loop(process arg source) handle Error.Error _ => (* Syntax error *) loop arg end in loop initialArg end fun parseSession() = processSession(parse, parseInitialArg) fun elabSession() = processSession(elab, elabInitialArg) fun evalSession() = processSession(eval, evalInitialArg) fun execSession() = processSession(exec, execInitialArg) end (* stop of Sml.sml *) (* start of Main.sml *) (* * Standard ML implementation stand-alone *) structure Main = struct val version = "0.5" fun usage() = ( TextIO.output(TextIO.stdErr, "Usage: hamlet -\n\ \where is one of:\n\ \ h help: print this message\n\ \ p parse mode: just parse input\n\ \ l elab mode: parse and elaborate\n\ \ v eval mode: parse and evaluate (no type checking!)\n\ \ x exec mode: parse, elaborate, and evaluate\n" ) ; TextIO.flushOut TextIO.stdErr ; OS.Process.failure ) fun start process = ( TextIO.output(TextIO.stdOut, "HaMLet " ^ version ^ " - to be or not to be SML\n") ; TextIO.flushOut TextIO.stdOut ; process() ; TextIO.output(TextIO.stdOut, "\n") ; TextIO.flushOut TextIO.stdOut ; OS.Process.success ) fun main' ["-h"] = ( usage() ; OS.Process.success ) | main' ["-p"] = start Sml.parseSession | main' ["-l"] = start Sml.elabSession | main' ["-v"] = start Sml.evalSession | main' ["-x"] = start Sml.execSession | main' _ = usage() fun main() = OS.Process.exit(main'(CommandLine.arguments())) end (* stop of Main.sml *) (* Here begins the simple test case. *) structure Main = struct fun doit size = let open TextIO fun loop n = if n < 0 then () else let val _ = ins := openIn "DATA/hamlet-input.sml" val _ = Main.main' ["-x"] val _ = closeIn (!ins) in loop (n - 1) end in loop size end end mlton-20210117+dfsg/benchmark/tests/imp-for.sml000066400000000000000000000013351416264345000212120ustar00rootroot00000000000000 fun for (start, stop, f) = let val i = ref start fun loop () = if !i >= stop then () else (f (!i) ; i := !i + 1 ; loop ()) in loop () end structure Main = struct fun doit () = let val x = ref 0 val _ = for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => x := !x + 1))))))) in if (!x) <> 10000000 then raise Fail "bug" else () end val doit = fn size => for (0, size, fn _ => doit ()) end mlton-20210117+dfsg/benchmark/tests/knuth-bendix.sml000066400000000000000000000443601416264345000222460ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* knuth-bendix.sml *) signature KB = sig datatype term = Var of int | Term of string * term list; datatype ordering = Greater | Equal | NotGE; val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering; val lex_ext: (term * term -> ordering) -> term * term -> ordering; val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit; include BMARK end; structure Main : KB = struct val name = "Knuth-Bendix" fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end (******* Quelques definitions du prelude CAML **************) exception Failure of string; fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = failwith "it_list2" in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = failwith "try_find" | try_find_rec (a::L) = (f a) handle Failure _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) fun mem a = let fun mem_rec [] = false | mem_rec (b::L) = (a=b) orelse mem_rec L in mem_rec end fun union L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem a L2 then union_rec L else a :: union_rec L in union_rec L1 end fun mem_assoc a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (a=b) orelse mem_rec L in mem_rec end fun assoc a = let fun assoc_rec [] = failwith "find" | assoc_rec ((b,d)::L) = if a=b then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) fun print s = TextIO.output(TextIO.stdOut, s) fun print _ = () val print_string = print val print_num = print o Int.toString fun print_newline () = print "\n"; fun message s = (print s; print "\n"); (* 5- Les ensembles *) fun union L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union (vars t) (vars_of_list r) fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc n subst) handle Failure _ => t in subst_rec end fun change f = let fun change_rec (h::t) n = if n=1 then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = failwith "change" in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = failwith "replace" in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc v subst then if M = assoc v subst then subst else failwith "matching" else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 match_rec subst sons1 sons2 else failwith "matching" | match_rec _ _ = failwith "matching" in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = (m=n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if term1 = term2 then [] else if occurs n1 term2 then failwith "unify" else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then failwith "unify" else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else failwith "unify" (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"]; fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => failwith "pretty_term : infix arity <> 2" else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union (vars M) (vars N); val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules l = it_list (fn n => fn (k,_) => if k=n+1 then k else failwith "Rule numbers not in sequence") 0 l fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle Failure _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle Failure _ => let fun tryrec [] = failwith "mrewrite1" | tryrec (son::rest) = (rewrec son :: rest) handle Failure _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => failwith "mrewrite1" end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle Failure _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE; fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = failwith "rem_eq" | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle Failure _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => order (M,N) = Greater) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = failwith "mult_ext" (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = failwith "lex_ext" (* recursive path ordering *) fun rpo op_order ext = let fun rporec (M,N) = if M=N then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (op_order op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1); val insides = fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle Failure _ => insides end | suprec _ = [] in suprec end (* Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : (term_pair -> bool) -> num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion greater = let fun kbrec n rules = let val normal_form = mrewrite_all rules; fun get_rule k = assoc k rules; fun process failures = let fun processf (k,l) = let fun processkl [] = if k rules (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; failwith "kb_completion")) | processkl ((M,N)::eqs) = let val M' = normal_form M; val N' = normal_form N; fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L; val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl; val eqs' = map (fn (_,(_,pair)) => pair) redl in kbrec (n+1) (new_rule::irreds) [] (k,l) (eqs @ eqs' @ failures) end) end) end in if M'=N' then processkl eqs else if greater(M',N') then enter_rule(M',N') else if greater(N',M') then enter_rule(N',M') else process ((M',N')::failures) (k,l) eqs end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if k=l then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle Failure "find" (*rule k deleted*) => next_criticals (k+1,l)) end handle Failure "find" (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end in kbrec end fun kb_complete greater complete_rules rules = let val n = check_rules complete_rules; val eqs = map (fn (_,(_,pair)) => pair) rules; val completed_rules = kb_completion greater n complete_rules [] (n,n) eqs in (message "Canonical set found :"; pretty_rules (rev completed_rules); ()) end val Group_rules = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))]; val Geom_rules = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ]; fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 fun Group_precedence op1 op2 = let val r1 = Group_rank op1; val r2 = Group_rank op2 in if r1 = r2 then Equal else if r1 > r2 then Greater else NotGE end val Group_order = rpo Group_precedence lex_ext fun greater pair = (case Group_order pair of Greater => true | _ => false) fun doit() = kb_complete greater [] Geom_rules val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit _ = () end (* Main *) mlton-20210117+dfsg/benchmark/tests/lexgen.sml000066400000000000000000001512121416264345000211230ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* Lexical analyzer generator for Standard ML. Version 1.6.0, October 1994 Copyright (c) 1989-1992 by Andrew W. Appel, David R. Tarditi, James S. Mattson This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Changes: 07/25/89 (drt): added %header declaration, code to place user declarations at same level as makeLexer, etc. This is needed for the parser generator. /10/89 (appel): added %arg declaration (see lexgen.doc). /04/90 (drt): fixed following bug: couldn't use the lexer after an error occurred -- NextTok and inquote weren't being reset 10/22/91 (drt): disabled use of lookahead 10/23/92 (drt): disabled use of $ operator (which involves lookahead), added handlers for dictionary lookup routine 11/02/92 (drt): changed handler for exception Reject in generated lexer to Internal.Reject 02/01/94 (appel): Moved the exception handler for Reject in such a way as to allow tail-recursion (improves performance wonderfully!). 02/01/94 (appel): Fixed a bug in parsing of state names. 05/19/94 (Mikael Pettersson, mpe@ida.liu.se): Transition tables are usually represented as strings, but when the range is too large, int vectors constructed by code like "Vector.vector[1,2,3,...]" are used instead. The problem with this isn't that the vector itself takes a lot of space, but that the code generated by SML/NJ to construct the intermediate list at run-time is *HUGE*. My fix is to encode an int vector as a string literal (using two bytes per int) and emit code to decode the string to a vector at run-time. SML/NJ compiles string literals into substrings in the code, so this uses much less space. 06/02/94 (jhr): Modified export-lex.sml to conform to new installation scheme. Also removed tab characters from string literals. 10/05/94 (jhr): Changed generator to produce code that uses the new basis style strings and characters. 10/06/94 (jhr) Modified code to compile under new basis style strings and characters. 02/08/95 (jhr) Modified to use new List module interface. 05/18/95 (jhr) changed Vector.vector to Vector.fromList * * $Log: lexgen.sml,v $ * Revision 1.6 1996/10/03 14:57:30 jhr * Qualified use of Int.quot, since it is no longer available at top-level; improved * the code that prints the tables. * * Revision 1.5 1996/09/16 12:25:14 george * here is a bug in ml-lex (109.17) when using the %count flag. The yylineno * variable should get reinitialized to zero on each call to makeLexer, but * instead is globally allocated and never reset. * * Revision 1.4 1996/08/13 13:50:36 george * Fixed bugs in counting lines (from jhr) * * Revision 1.3 1996/07/25 20:38:52 jhr * Fixed bug in ungetch that caused Subscript exceptions. * * Revision 1.2 1996/02/26 15:02:27 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:15 george * Version 109 * *) (* Subject: lookahead in sml-lex Reply-to: david.tarditi@CS.CMU.EDU Date: Mon, 21 Oct 91 14:13:26 -0400 There is a serious bug in the implementation of lookahead, as done in sml-lex, and described in Aho, Sethi, and Ullman, p. 134 "Implementing the Lookahead Operator" We have disallowed the use of lookahead for now because of this bug. As a counter-example to the implementation described in ASU, consider the following specification with the input string "aba" (this example is taken from a comp.compilers message from Dec. 1989, I think): type lexresult=unit val linenum = ref 1 fun error x = TextIO.output(TextIO.stdErr, x ^ "\n") val eof = fn () => () %% %structure Lex %% (a|ab)/ba => (print yytext; print "\n"; ()); The ASU proposal works as follows. Suppose that we are using NFA's to represent our regular expressions. Then to build an NFA for e1 / e2, we build an NFA n1 for e1 and an NFA n2 for e2, and add an epsilon transition from e1 to e2. When lexing, when we encounter the end state of e1e2, we take as the end of the string the position in the string that was the last occurrence of the state of the NFA having a transition on the epsilon introduced for /. Using the example we have above, we'll have an NFA with the following states: 1 -- a --> 2 -- b --> 3 | | | epsilon | epsilon | | |------------> 4 -- b --> 5 -- a --> 6 On our example, we get the following list of transitions: a : 2, 4 (make an epsilon transition from 2 to 4) ab : 3, 4, 5 (make an epsilon transition from 3 to 4) aba : 6 If we chose the last state in which we made an epsilon transition, we'll chose the transition from 3 to 4, and end up with "ab" as our token, when we should have "a" as our token. *) functor RedBlack(B : sig type key val > : key*key->bool end): sig type tree type key val empty : tree val insert : key * tree -> tree val lookup : key * tree -> key exception notfound of key end = struct open B datatype color = RED | BLACK datatype tree = empty | tree of key * color * tree * tree exception notfound of key fun insert (key,t) = let fun f empty = tree(key,RED,empty,empty) | f (tree(k,BLACK,l,r)) = if key>k then case f r of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rlk,BLACK,tree(k,RED,l,rll), tree(rk,RED,rlr,rr))) | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr)) | r => tree(k,BLACK,l,r) else if k>key then case f l of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl), tree(k,RED,lrr,r))) | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r))) | l => tree(k,BLACK,l,r) else tree(key,BLACK,l,r) | f (tree(k,RED,l,r)) = if key>k then tree(k,RED,l, f r) else if k>key then tree(k,RED, f l, r) else tree(key,RED,l,r) in case f t of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r) | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r) | t => t end fun lookup (key,t) = let fun look empty = raise (notfound key) | look (tree(k,_,l,r)) = if k>key then look l else if key>k then look r else k in look t end end signature LEXGEN = sig val lexGen: string -> unit end structure LexGen: LEXGEN = struct open Array List infix 9 sub datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR | LP | RP | CARAT | DOLLAR | SLASH | STATE of string list | REPS of int * int | ID of string | ACTION of string | BOF | EOF | ASSIGN | SEMI | ARROW | LEXMARK | LEXSTATES | COUNT | REJECT | FULLCHARSET | STRUCT | HEADER | ARG datatype exp = EPS | CLASS of bool array * int | CLOSURE of exp | ALT of exp * exp | CAT of exp * exp | TRAIL of int | END of int (* flags describing input Lex spec. - unnecessary code is omitted *) (* if possible *) val CharFormat = ref false; val UsesTrailingContext = ref false; val UsesPrevNewLine = ref false; (* flags for various bells & whistles that Lex has. These slow the lexer down and should be omitted from production lexers (if you really want speed) *) val CountNewLines = ref false; val HaveReject = ref false; (* Can increase size of character set *) val CharSetSize = ref 129; (* Can name structure or declare header code *) val StrName = ref "Mlex" val HeaderCode = ref "" val HeaderDecl = ref false val ArgCode = ref (NONE: string option) val StrDecl = ref false val ResetFlags = fn () => (CountNewLines := false; HaveReject := false; UsesTrailingContext := false; CharSetSize := 129; StrName := "Mlex"; HeaderCode := ""; HeaderDecl:= false; ArgCode := NONE; StrDecl := false) val LexOut = ref(TextIO.stdOut) fun say x = TextIO.output(!LexOut, x) (* Union: merge two sorted lists of integers *) fun union(a,b) = let val rec merge = fn (nil,nil,z) => z | (nil,el::more,z) => merge(nil,more,el::z) | (el::more,nil,z) => merge(more,nil,el::z) | (x::morex,y::morey,z) => if (x:int)=(y:int) then merge(morex,morey,x::z) else if x>y then merge(morex,y::morey,x::z) else merge(x::morex,morey,y::z) in merge(rev a,rev b,nil) end (* Nullable: compute if a important expression parse tree node is nullable *) val rec nullable = fn EPS => true | CLASS(_) => false | CLOSURE(_) => true | ALT(n1,n2) => nullable(n1) orelse nullable(n2) | CAT(n1,n2) => nullable(n1) andalso nullable(n2) | TRAIL(_) => true | END(_) => false (* FIRSTPOS: firstpos function for parse tree expressions *) and firstpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => firstpos(n) | ALT(n1,n2) => union(firstpos(n1),firstpos(n2)) | CAT(n1,n2) => if nullable(n1) then union(firstpos(n1),firstpos(n2)) else firstpos(n1) | TRAIL(i) => [i] | END(i) => [i] (* LASTPOS: Lastpos function for parse tree expressions *) and lastpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => lastpos(n) | ALT(n1,n2) => union(lastpos(n1),lastpos(n2)) | CAT(n1,n2) => if nullable(n2) then union(lastpos(n1),lastpos(n2)) else lastpos(n2) | TRAIL(i) => [i] | END(i) => [i] ; (* ++: Increment an integer reference *) fun ++(x) : int = (x := !x + 1; !x); structure Dict = struct type 'a relation = 'a * 'a -> bool abstype ('b,'a) dictionary = DATA of {Table : ('b * 'a) list, Leq : 'b * 'b -> bool } with exception LOOKUP fun create Leqfunc = DATA { Table = nil, Leq = Leqfunc } fun lookup (DATA { Table = entrylist, Leq = leq }) key = let fun search [] = raise LOOKUP | search((k,item)::entries) = if leq(key,k) then if leq(k,key) then item else raise LOOKUP else search entries in search entrylist end fun enter (DATA { Table = entrylist, Leq = leq }) (newentry as (key : 'b,item :'a)) : ('b,'a) dictionary = let val gt = fn a => fn b => not (leq(a,b)) val eq = fn k => fn k' => (leq(k,k')) andalso (leq(k',k)) fun update nil = [ newentry ] | update ((entry as (k,_))::entries) = if (eq key k) then newentry::entries else if gt k key then newentry::(entry::entries) else entry::(update entries) in DATA { Table = update entrylist, Leq = leq } end fun listofdict (DATA { Table = entrylist,Leq = leq}) = let fun f (nil,r) = rev r | f (a::b,r) = f (b,a::r) in f(entrylist,nil) end end end (* structure Dict *) open Dict; (* INPUT.ML : Input w/ one character push back capability *) val LineNum = ref 1; abstype ibuf = BUF of TextIO.instream * {b : string ref, p : int ref} with fun make_ibuf(s) = BUF (s, {b=ref"", p = ref 0}) fun close_ibuf (BUF (s,_)) = TextIO.closeIn(s) exception eof fun getch (a as (BUF(s,{b,p}))) = if (!p = (size (!b))) then (b := TextIO.inputN(s, 1024); p := 0; if (size (!b))=0 then raise eof else getch a) else (let val ch = String.sub(!b,!p) in (if ch = #"\n" then LineNum := !LineNum + 1 else (); p := !p + 1; ch) end) fun ungetch(BUF(s,{b,p})) = ( p := !p - 1; if String.sub(!b,!p) = #"\n" then LineNum := !LineNum - 1 else ()) end; exception Error fun prErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) fun prSynErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: syntax error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) exception SyntaxError; (* error in user's input file *) exception LexError; (* unexpected error in lexer *) val LexBuf = ref(make_ibuf(TextIO.stdIn)); val LexState = ref 0; val NextTok = ref BOF; val inquote = ref false; fun AdvanceTok () : unit = let fun isLetter c = ((c >= #"a") andalso (c <= #"z")) orelse ((c >= #"A") andalso (c <= #"Z")) fun isDigit c = (c >= #"0") andalso (c <= #"9") (* check for valid (non-leading) identifier character (added by JHR) *) fun isIdentChr c = ((isLetter c) orelse (isDigit c) orelse (c = #"_") orelse (c = #"'")) fun atoi s = let fun num (c::r, n) = if isDigit c then num (r, 10*n + (Char.ord c - Char.ord #"0")) else n | num ([], n) = n in num (explode s, 0) end fun skipws () = (case nextch() of #" " => skipws() | #"\t" => skipws() | #"\n" => skipws() | x => x (* end case *)) and nextch () = getch(!LexBuf) and escaped () = (case nextch() of #"b" => #"\008" | #"n" => #"\n" | #"t" => #"\t" | #"h" => #"\128" | x => let fun err t = prErr("illegal ascii escape '"^(implode(rev t))^"'") fun cvt c = (Char.ord c - Char.ord #"0") fun f (n, c, t) = if c=3 then if n >= (!CharSetSize) then err t else Char.chr n else let val ch=nextch() in if isDigit ch then f(n*10+(cvt ch), c+1, ch::t) else err t end in if isDigit x then f(cvt x, 1, [x]) else x end (* end case *)) and onechar x = let val c = array(!CharSetSize, false) in update(c, Char.ord(x), true); CHARS(c) end in case !LexState of 0 => let val makeTok = fn () => case skipws() (* Lex % operators *) of #"%" => (case nextch() of #"%" => LEXMARK | a => let fun f s = let val a = nextch() in if isLetter a then f(a::s) else (ungetch(!LexBuf); implode(rev s)) end val command = f [a] in if command = "reject" then REJECT else if command = "count" then COUNT else if command = "full" then FULLCHARSET else if command = "s" then LEXSTATES else if command = "S" then LEXSTATES else if command = "structure" then STRUCT else if command = "header" then HEADER else if command = "arg" then ARG else prErr "unknown % operator " end ) (* semicolon (for end of LEXSTATES) *) | #";" => SEMI (* anything else *) | ch => if isLetter(ch) then let fun getID matched = let val x = nextch() (**** fix by JHR in if isLetter(x) orelse isDigit(x) orelse x = "_" orelse x = "'" ****) in if (isIdentChr x) then getID (x::matched) else (ungetch(!LexBuf); implode(rev matched)) end in ID(getID [ch]) end else (prSynErr ("bad character: " ^ String.str ch)) in NextTok := makeTok() end | 1 => let val rec makeTok = fn () => if !inquote then case nextch() of (* inside quoted string *) #"\\" => onechar(escaped()) | #"\"" => (inquote := false; makeTok()) | x => onechar(x) else case skipws() of (* single character operators *) #"?" => QMARK | #"*" => STAR | #"+" => PLUS | #"|" => BAR | #"(" => LP | #")" => RP | #"^" => CARAT | #"$" => DOLLAR | #"/" => SLASH | #";" => SEMI | #"." => let val c = array(!CharSetSize,true) in update(c,10,false); CHARS(c) end (* assign and arrow *) | #"=" => let val c = nextch() in if c = #">" then ARROW else (ungetch(!LexBuf); ASSIGN) end (* character set *) | #"[" => let val rec classch = fn () => let val x = skipws() in if x = #"\\" then escaped() else x end; val first = classch(); val flag = (first <> #"^"); val c = array(!CharSetSize,not flag); fun add NONE = () | add (SOME x) = update(c, Char.ord(x), flag) and range (x, y) = if x>y then (prErr "bad char. range") else let val i = ref(Char.ord(x)) and j = Char.ord(y) in while !i<=j do ( add (SOME(Char.chr(!i))); i := !i + 1) end and getClass last = (case classch() of #"]" => (add(last); c) | #"-" => (case last of NONE => getClass(SOME #"-") | (SOME last') => let val x = classch() in if x = #"]" then (add(last); add(SOME #"-"); c) else (range(last',x); getClass(NONE)) end (* end case *)) | x => (add(last); getClass(SOME x)) (* end case *)) in CHARS(getClass(if first = #"^" then NONE else SOME first)) end (* Start States specification *) | #"<" => let val rec get_state = fn (prev,matched) => case nextch() of #">" => matched::prev | #"," => get_state(matched::prev,"") | x => if isIdentChr(x) then get_state(prev,matched ^ String.str x) else (prSynErr "bad start state list") in STATE(get_state(nil,"")) end (* {id} or repititions *) | #"{" => let val ch = nextch() in if isLetter(ch) then let fun getID matched = (case nextch() of #"}" => matched | x => if (isIdentChr x) then getID(matched ^ String.str x) else (prErr "invalid char. class name") (* end case *)) in ID(getID(String.str ch)) end else if isDigit(ch) then let fun get_r (matched, r1) = (case nextch() of #"}" => let val n = atoi(matched) in if r1 = ~1 then (n,n) else (r1,n) end | #"," => if r1 = ~1 then get_r("",atoi(matched)) else (prErr "invalid repetitions spec.") | x => if isDigit(x) then get_r(matched ^ String.str x,r1) else (prErr "invalid char in repetitions spec") (* end case *)) in REPS(get_r(String.str ch,~1)) end else (prErr "bad repetitions spec") end (* Lex % operators *) | #"%" => if nextch() = #"%" then LEXMARK else (ungetch(!LexBuf); onechar (#"%")) (* backslash escape *) | #"\\" => onechar(escaped()) (* start quoted string *) | #"\"" => (inquote := true; makeTok()) (* anything else *) | ch => onechar(ch) in NextTok := makeTok() end | 2 => NextTok := (case skipws() of #"(" => let fun GetAct (lpct,x) = (case getch(!LexBuf) of #"(" => GetAct (lpct+1, #"("::x) | #")" => if lpct = 0 then (implode (rev x)) else GetAct(lpct-1, #")"::x) | y => GetAct(lpct,y::x) (* end case *)) in ACTION (GetAct (0,nil)) end | #";" => SEMI | c => (prSynErr ("invalid character " ^ String.str c))) | _ => raise LexError end handle eof => NextTok := EOF ; fun GetTok (_:unit) : token = let val t = !NextTok in AdvanceTok(); t end; val SymTab = ref (create String.<=) : (string,exp) dictionary ref fun GetExp () : exp = let val rec optional = fn e => ALT(EPS,e) and lookup' = fn name => lookup(!SymTab) name handle LOOKUP => prErr ("bad regular expression name: "^ name) and newline = fn () => let val c = array(!CharSetSize,false) in update(c,10,true); c end and endline = fn e => trail(e,CLASS(newline(),0)) and trail = fn (e1,e2) => CAT(CAT(e1,TRAIL(0)),e2) and closure1 = fn e => CAT(e,CLOSURE(e)) and repeat = fn (min,max,e) => let val rec rep = fn (0,0) => EPS | (0,1) => ALT(e,EPS) | (0,i) => CAT(rep(0,1),rep(0,i-1)) | (i,j) => CAT(e,rep(i-1,j-1)) in rep(min,max) end and exp0 = fn () => case GetTok() of CHARS(c) => exp1(CLASS(c,0)) | LP => let val e = exp0() in if !NextTok = RP then (AdvanceTok(); exp1(e)) else (prSynErr "missing '('") end | ID(name) => exp1(lookup' name) | _ => raise SyntaxError and exp1 = fn (e) => case !NextTok of SEMI => e | ARROW => e | EOF => e | LP => exp2(e,exp0()) | RP => e | t => (AdvanceTok(); case t of QMARK => exp1(optional(e)) | STAR => exp1(CLOSURE(e)) | PLUS => exp1(closure1(e)) | CHARS(c) => exp2(e,CLASS(c,0)) | BAR => ALT(e,exp0()) | DOLLAR => (UsesTrailingContext := true; endline(e)) | SLASH => (UsesTrailingContext := true; trail(e,exp0())) | REPS(i,j) => exp1(repeat(i,j,e)) | ID(name) => exp2(e,lookup' name) | _ => raise SyntaxError) and exp2 = fn (e1,e2) => case !NextTok of SEMI => CAT(e1,e2) | ARROW => CAT(e1,e2) | EOF => CAT(e1,e2) | LP => exp2(CAT(e1,e2),exp0()) | RP => CAT(e1,e2) | t => (AdvanceTok(); case t of QMARK => exp1(CAT(e1,optional(e2))) | STAR => exp1(CAT(e1,CLOSURE(e2))) | PLUS => exp1(CAT(e1,closure1(e2))) | CHARS(c) => exp2(CAT(e1,e2),CLASS(c,0)) | BAR => ALT(CAT(e1,e2),exp0()) | DOLLAR => (UsesTrailingContext := true; endline(CAT(e1,e2))) | SLASH => (UsesTrailingContext := true; trail(CAT(e1,e2),exp0())) | REPS(i,j) => exp1(CAT(e1,repeat(i,j,e2))) | ID(name) => exp2(CAT(e1,e2),lookup' name) | _ => raise SyntaxError) in exp0() end; val StateTab = ref(create(String.<=)) : (string,int) dictionary ref val StateNum = ref 0; fun GetStates () : int list = let fun add nil sl = sl | add (x::y) sl = add y (union ([lookup (!StateTab)(x) handle LOOKUP => prErr ("bad state name: "^x) ],sl)) fun addall i sl = if i <= !StateNum then addall (i+2) (union ([i],sl)) else sl fun incall (x::y) = (x+1)::incall y | incall nil = nil fun addincs nil = nil | addincs (x::y) = x::(x+1)::addincs y val state_list = case !NextTok of STATE s => (AdvanceTok(); LexState := 1; add s nil) | _ => addall 1 nil in case !NextTok of CARAT => (LexState := 1; AdvanceTok(); UsesPrevNewLine := true; incall state_list) | _ => addincs state_list end val LeafNum = ref ~1; fun renum(e : exp) : exp = let val rec label = fn EPS => EPS | CLASS(x,_) => CLASS(x,++LeafNum) | CLOSURE(e) => CLOSURE(label(e)) | ALT(e1,e2) => ALT(label(e1),label(e2)) | CAT(e1,e2) => CAT(label(e1),label(e2)) | TRAIL(i) => TRAIL(++LeafNum) | END(i) => END(++LeafNum) in label(e) end; exception ParseError; fun parse() : (string * (int list * exp) list * ((string,string) dictionary)) = let val Accept = ref (create String.<=) : (string,string) dictionary ref val rec ParseRtns = fn l => case getch(!LexBuf) of #"%" => let val c = getch(!LexBuf) in if c = #"%" then (implode (rev l)) else ParseRtns(c :: #"%" :: l) end | c => ParseRtns(c::l) and ParseDefs = fn () => (LexState:=0; AdvanceTok(); case !NextTok of LEXMARK => () | LEXSTATES => let fun f () = (case !NextTok of (ID i) => (StateTab := enter(!StateTab)(i,++StateNum); ++StateNum; AdvanceTok(); f()) | _ => ()) in AdvanceTok(); f (); if !NextTok=SEMI then ParseDefs() else (prSynErr "expected ';'") end | ID x => (LexState:=1; AdvanceTok(); if GetTok() = ASSIGN then (SymTab := enter(!SymTab)(x,GetExp()); if !NextTok = SEMI then ParseDefs() else (prSynErr "expected ';'")) else raise SyntaxError) | REJECT => (HaveReject := true; ParseDefs()) | COUNT => (CountNewLines := true; ParseDefs()) | FULLCHARSET => (CharSetSize := 256; ParseDefs()) | HEADER => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => if (!StrDecl) then (prErr "cannot have both %s and %header \ \declarations") else if (!HeaderDecl) then (prErr "duplicate %header declarations") else (HeaderCode := s; LexState := 0; HeaderDecl := true; ParseDefs()) | _ => raise SyntaxError) | ARG => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => (case !ArgCode of SOME _ => prErr "duplicate %arg declarations" | NONE => ArgCode := SOME s; LexState := 0; ParseDefs()) | _ => raise SyntaxError) | STRUCT => (AdvanceTok(); case !NextTok of (ID i) => if (!HeaderDecl) then (prErr "cannot have both %s and %header \ \declarations") else if (!StrDecl) then (prErr "duplicate %s declarations") else StrName := i | _ => (prErr "expected ID"); ParseDefs()) | _ => raise SyntaxError) and ParseRules = fn rules => (LexState:=1; AdvanceTok(); case !NextTok of LEXMARK => rules | EOF => rules | _ => let val s = GetStates() val e = renum(CAT(GetExp(),END(0))) in if !NextTok = ARROW then (LexState:=2; AdvanceTok(); case GetTok() of ACTION(act) => if !NextTok=SEMI then (Accept:=enter(!Accept) (Int.toString (!LeafNum),act); ParseRules((s,e)::rules)) else (prSynErr "expected ';'") | _ => raise SyntaxError) else (prSynErr "expected '=>'") end) in let val usercode = ParseRtns nil in (ParseDefs(); (usercode,ParseRules(nil),!Accept)) end end handle SyntaxError => (prSynErr "") fun makebegin () : unit = let fun make nil = () | make ((x,n:int)::y)=(say "val "; say x; say " = " ; say "STARTSTATE "; say (Int.toString n); say ";\n"; make y) in say "\n(* start state definitions *)\n\n"; make(listofdict(!StateTab)) end structure L = struct nonfix > type key = int list * string fun > ((key,item:string),(key',item')) = let fun f ((a:int)::a') (b::b') = if Int.> (a,b) then true else if a=b then f a' b' else false | f _ _ = false in f key key' end end structure RB = RedBlack(L) fun maketable (fins:(int * (int list)) list, tcs :(int * (int list)) list, tcpairs: (int * int) list, trans : (int*(int list)) list) : unit = (* Fins = (state #, list of final leaves for the state) list tcs = (state #, list of trailing context leaves which begin in this state) list tcpairs = (trailing context leaf, end leaf) list trans = (state #,list of transitions for state) list *) let datatype elem = N of int | T of int | D of int val count = ref 0 val _ = (if length(trans)<256 then CharFormat := true else CharFormat := false; if !UsesTrailingContext then (say "\ndatatype yyfinstate = N of int | \ \ T of int | D of int\n") else say "\ndatatype yyfinstate = N of int"; say "\ntype statedata = {fin : yyfinstate list, trans: "; case !CharFormat of true => say "string}" | false => say "int Vector.vector}"; say "\n(* transition & final state table *)\nval tab = let\n"; case !CharFormat of true => () | false => (say "fun decode s k =\n"; say " let val k' = k + k\n"; say " val hi = Char.ord(String.sub(s, k'))\n"; say " val lo = Char.ord(String.sub(s, k' + 1))\n"; say " in hi * 256 + lo end\n")) val newfins = let fun IsEndLeaf t = let fun f ((l,e)::r) = if (e=t) then true else f r | f nil = false in f tcpairs end fun GetEndLeaf t = let fun f ((tl,el)::r) = if (tl=t) then el else f r in f tcpairs end fun GetTrConLeaves s = let fun f ((s',l)::r) = if (s = s') then l else f r | f nil = nil in f tcs end fun sort_leaves s = let fun insert (x:int) (a::b) = if (x <= a) then x::(a::b) else a::(insert x b) | insert x nil = [x] in List.foldr (fn (x,r) => insert x r) [] s end fun conv a = if (IsEndLeaf a) then (D a) else (N a) fun merge (a::a',b::b') = if (a <= b) then (conv a)::merge(a',b::b') else (T b)::(merge(a::a',b')) | merge (a::a',nil) = (conv a)::(merge (a',nil)) | merge (nil,b::b') = (T b)::(merge (b',nil)) | merge (nil,nil) = nil in map (fn (x,l) => rev (merge (l, sort_leaves (map (fn x => GetEndLeaf x) (GetTrConLeaves x))))) fins end val rs = let open RB fun makeItems x = let fun emit8(x, pos) = let val s = StringCvt.padLeft #"0" 3 (Int.toString x) in case pos of 16 => (say "\\\n\\\\"; say s; 1) | _ => (say "\\"; say s; pos+1) end fun emit16(x, pos) = let val hi8 = x div 256 val lo8 = x - hi8 * 256 (* x rem 256 *) in emit8(lo8, emit8(hi8, pos)) end fun MakeString([], _, _) = () | MakeString(x::xs, emitter, pos) = MakeString(xs, emitter, emitter(x, pos)) in case !CharFormat of true => (say " =\n\""; MakeString(x,emit8,0); say "\"\n") | false => (say " = Vector.tabulate("; say (Int.toString(length x)); say ", decode\n\""; MakeString(x,emit16,0); say "\")\n") end fun makeEntry(nil,rs,t) = rev rs | makeEntry(((l:int,x)::y),rs,t) = let val name = "s" ^ (Int.toString l) in let val (r,n) = lookup ((x,name),t) in makeEntry(y,(n::rs),t) end handle notfound _ => (count := !count+1; say "val "; say name; makeItems x; makeEntry(y,(name::rs),(insert ((x,name),t)))) end in (makeEntry(trans,nil,empty)) end fun makeTable(nil,nil) = () | makeTable(a::a',b::b') = let fun makeItems nil = () | makeItems (hd::tl) = let val (t,n) = case hd of (N i) => ("(N ",i) | (T i) => ("(T ",i) | (D i) => ("(D ",i) in (say t; say (Int.toString n); say ")"; if null tl then () else (say ","; makeItems tl)) end in (say "{fin = ["; makeItems b; say "], trans = "; say a; say "}"; if null a' then () else (say ",\n"; makeTable(a',b'))) end fun msg x = () (*TextIO.output(TextIO.stdOut, x)*) in (say "in Vector.fromList\n["; makeTable(rs,newfins); say "]\nend\n"; msg ("\nNumber of states = " ^ (Int.toString (length trans))); msg ("\nNumber of distinct rows = " ^ (Int.toString (!count))); msg ("\nApprox. memory size of trans. table = " ^ (Int.toString (!count*(!CharSetSize)*(if !CharFormat then 1 else 8)))); msg " bytes\n") end (* makeaccept: Takes a (string,string) dictionary, prints case statement for accepting leaf actions. The key strings are the leaf #'s, the data strings are the actions *) fun makeaccept ends = let fun startline f = if f then say " " else say "| " fun make(nil,f) = (startline f; say "_ => raise Internal.LexerError\n") | make((x,a)::y,f) = (startline f; say x; say " => ("; say a; say ")\n"; make(y,false)) in make (listofdict(ends),true) end fun leafdata(e:(int list * exp) list) = let val fp = array(!LeafNum + 1,nil) and leaf = array(!LeafNum + 1,EPS) and tcpairs = ref nil and trailmark = ref ~1; val rec add = fn (nil,x) => () | (hd::tl,x) => (update(fp,hd,union(fp sub hd,x)); add(tl,x)) and moredata = fn CLOSURE(e1) => (moredata(e1); add(lastpos(e1),firstpos(e1))) | ALT(e1,e2) => (moredata(e1); moredata(e2)) | CAT(e1,e2) => (moredata(e1); moredata(e2); add(lastpos(e1),firstpos(e2))) | CLASS(x,i) => update(leaf,i,CLASS(x,i)) | TRAIL(i) => (update(leaf,i,TRAIL(i)); if !trailmark = ~1 then trailmark := i else ()) | END(i) => (update(leaf,i,END(i)); if !trailmark <> ~1 then (tcpairs := (!trailmark,i)::(!tcpairs); trailmark := ~1) else ()) | _ => () and makedata = fn nil => () | (_,x)::tl => (moredata(x);makedata(tl)) in trailmark := ~1; makedata(e); (fp,leaf,!tcpairs) end; fun makedfa(rules) = let val StateTab = ref (create(String.<=)) : (string,int) dictionary ref val fintab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val transtab = ref (create(Int.<=)) : (int,int list) dictionary ref val tctab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val (fp, leaf, tcpairs) = leafdata(rules); fun visit (state,statenum) = let val transitions = gettrans(state) in fintab := enter(!fintab)(statenum,getfin(state)); tctab := enter(!tctab)(statenum,gettc(state)); transtab := enter(!transtab)(statenum,transitions) end and visitstarts (states) = let fun vs nil i = () | vs (hd::tl) i = (visit (hd,i); vs tl (i+1)) in vs states 0 end and hashstate(s: int list) = let val rec hs = fn (nil,z) => z | ((x:int)::y,z) => hs(y,z ^ " " ^ (Int.toString x)) in hs(s,"") end and find(s) = lookup(!StateTab)(hashstate(s)) and add(s,n) = StateTab := enter(!StateTab)(hashstate(s),n) and getstate (state) = find(state) handle LOOKUP => let val n = ++StateNum in add(state,n); visit(state,n); n end and getfin state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of END _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettc state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of TRAIL _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettrans (state) = let fun loop c tlist = let fun cktrans nil r = r | cktrans (hd::tl) r = case (leaf sub hd) of CLASS(i,_)=> (if (i sub c) then cktrans tl (union(r,fp sub hd)) else cktrans tl r handle Subscript => cktrans tl r ) | _ => cktrans tl r in if c >= 0 then let val v=cktrans state nil in loop (c-1) (if v=nil then 0::tlist else (getstate v)::tlist) end else tlist end in loop ((!CharSetSize) - 1) nil end and startstates() = let val startarray = array(!StateNum + 1, nil); fun listofarray(a,n) = let fun f i l = if i >= 0 then f (i-1) ((a sub i)::l) else l in f (n-1) nil end val rec makess = fn nil => () | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl)) and fix = fn (nil,_) => () | (s::tl,firsts) => (update(startarray,s, union(firsts,startarray sub s)); fix(tl,firsts)) in makess(rules);listofarray(startarray, !StateNum + 1) end in visitstarts(startstates()); (listofdict(!fintab),listofdict(!transtab),listofdict(!tctab),tcpairs) end val skel_hd = " struct\n\ \ structure UserDeclarations =\n\ \ struct\n\ \" val skel_mid2 = " | Internal.D k => action (i,(acts::l),k::rs)\n\ \ | Internal.T k =>\n\ \ let fun f (a::b,r) =\n\ \ if a=k\n\ \ then action(i,(((Internal.N a)::acts)::l),(b@r))\n\ \ else f (b,a::r)\n\ \ | f (nil,r) = action(i,(acts::l),rs)\n\ \ in f (rs,nil)\n\ \ end\n\ \" fun lexGen(infile) = let val outfile = infile ^ ".sml" fun PrintLexer (ends) = let val sayln = fn x => (say x; say "\n") in case !ArgCode of NONE => (sayln "fun lex () : Internal.result ="; sayln "let fun continue() = lex() in") | SOME s => (say "fun lex "; say "(yyarg as ("; say s; sayln ")) ="; sayln "let fun continue() : Internal.result = "); say " let fun scan (s,AcceptingLeaves : Internal.yyfinstate"; sayln " list list,l,i0) ="; if !UsesTrailingContext then say "\tlet fun action (i,nil,rs)" else say "\tlet fun action (i,nil)"; sayln " = raise LexError"; if !UsesTrailingContext then sayln "\t| action (i,nil::l,rs) = action(i-1,l,rs)" else sayln "\t| action (i,nil::l) = action (i-1,l)"; if !UsesTrailingContext then sayln "\t| action (i,(node::acts)::l,rs) =" else sayln "\t| action (i,(node::acts)::l) ="; sayln "\t\tcase node of"; sayln "\t\t Internal.N yyk => "; sayln "\t\t\t(let val yytext = substring(!yyb,i0,i-i0)\n\ \\t\t\t val yypos = i0+ !yygone"; if !CountNewLines then (sayln "\t\t\tval _ = yylineno := CharVector.foldl"; sayln "\t\t\t\t(fn (#\"\\n\", n) => n+1 | (_, n) => n) (!yylineno) yytext") else (); if !HaveReject then (say "\t\t\tfun REJECT() = action(i,acts::l"; if !UsesTrailingContext then sayln ",rs)" else sayln ")") else (); sayln "\t\t\topen UserDeclarations Internal.StartStates"; sayln " in (yybufpos := i; case yyk of "; sayln ""; sayln "\t\t\t(* Application actions *)\n"; makeaccept(ends); say "\n\t\t) end "; say ")\n\n"; if (!UsesTrailingContext) then say skel_mid2 else (); sayln "\tval {fin,trans} = Vector.sub(Internal.tab, s)"; sayln "\tval NewAcceptingLeaves = fin::AcceptingLeaves"; sayln "\tin if l = !yybl then"; sayln "\t if trans = #trans(Vector.sub(Internal.tab,0))"; sayln "\t then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then say ",nil" else (); say ") else"; sayln "\t let val newchars= if !yydone then \"\" else yyinput 1024"; sayln "\t in if (size newchars)=0"; sayln "\t\t then (yydone := true;"; say "\t\t if (l=i0) then UserDeclarations.eof "; sayln (case !ArgCode of NONE => "()" | SOME _ => "yyarg"); say "\t\t else action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil))" else sayln "))"; sayln "\t\t else (if i0=l then yyb := newchars"; sayln "\t\t else yyb := substring(!yyb,i0,l-i0)^newchars;"; sayln "\t\t yygone := !yygone+i0;"; sayln "\t\t yybl := size (!yyb);"; sayln "\t\t scan (s,AcceptingLeaves,l-i0,0))"; sayln "\t end"; sayln "\t else let val NewChar = Char.ord(String.sub(!yyb,l))"; say "\t\tval NewState = "; case (!CharFormat,!CharSetSize) of (true,129) => sayln "if NewChar<128 then Char.ord(String.sub(trans,NewChar)) else Char.ord(String.sub(trans,128))" | (true,256) => sayln "Char.ord(String.sub(trans,NewChar))" | (false,129) => sayln "if NewChar<128 then Vector.sub(trans, NewChar) else Vector.sub(trans, 128)" | (false,256) => sayln "Vector.sub(trans, NewChar)"; say "\t\tin if NewState=0 then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil)" else sayln ")"; sayln "\t\telse scan(NewState,NewAcceptingLeaves,l+1,i0)"; sayln "\tend"; sayln "\tend"; if !UsesPrevNewLine then () else sayln "(*"; sayln "\tval start= if substring(!yyb,!yybufpos-1,1)=\"\\n\""; sayln "then !yybegin+1 else !yybegin"; if !UsesPrevNewLine then () else sayln "*)"; say "\tin scan("; if !UsesPrevNewLine then say "start" else say "!yybegin (* start *)"; sayln ",nil,!yybufpos,!yybufpos)"; sayln " end"; sayln (case !ArgCode of NONE => "end" | SOME _ => "in continue end"); sayln " in lex"; sayln " end"; sayln "end" end in (UsesPrevNewLine := false; ResetFlags(); LexBuf := make_ibuf(TextIO.openIn infile); NextTok := BOF; inquote := false; LexOut := TextIO.openOut(outfile); StateNum := 2; LineNum := 1; StateTab := enter(create(String.<=))("INITIAL",1); LeafNum := ~1; let val (user_code,rules,ends) = parse() handle x => (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); raise x) val (fins,trans,tctab,tcpairs) = makedfa(rules) val _ = if !UsesTrailingContext then (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); prErr "lookahead is unimplemented") else () in if (!HeaderDecl) then say (!HeaderCode) else say ("structure " ^ (!StrName)); say "=\n"; say skel_hd; say user_code; say "end (* end of user routines *)\n"; say "exception LexError (* raised if illegal leaf "; say "action tried *)\n"; say "structure Internal =\n\tstruct\n"; maketable(fins,tctab,tcpairs,trans); say "structure StartStates =\n\tstruct\n"; say "\tdatatype yystartstate = STARTSTATE of int\n"; makebegin(); say "\nend\n"; say "type result = UserDeclarations.lexresult\n"; say "\texception LexerError (* raised if illegal leaf "; say "action tried *)\n"; say "end\n\n"; say "fun makeLexer yyinput = \n"; say "let \n"; if !CountNewLines then say "\tval yylineno = ref 0\n\n" else (); say "\tval yyb = ref \"\\n\" \t\t(* buffer *)\n\ \\tval yybl = ref 1\t\t(*buffer length *)\n\ \\tval yybufpos = ref 1\t\t(* location of next character to use *)\n\ \\tval yygone = ref 1\t\t(* position in file of beginning of buffer *)\n\ \\tval yydone = ref false\t\t(* eof found yet? *)\n\ \\tval yybegin = ref 1\t\t(*Current 'start state' for lexer *)\n\ \\n\tval YYBEGIN = fn (Internal.StartStates.STARTSTATE x) =>\n\ \\t\t yybegin := x\n\n"; PrintLexer(ends); close_ibuf(!LexBuf); TextIO.closeOut(!LexOut) end) end end structure Main : BMARK = struct val s = OS.FileSys.getDir() fun doit () = LexGen.lexGen (s^"/DATA/ml.lex"); val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit _ = LexGen.lexGen (s^"DATA/ml.lex") end (* Main *) mlton-20210117+dfsg/benchmark/tests/life.sml000066400000000000000000000126711416264345000205650ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; structure Main : BMARK = struct fun map f [] = [] | map f (a::x) = f a :: map f x exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f = let fun foldf a [] = a | foldf a (b::x) = foldf (f a b) x in foldf end fun filter p = let fun consifp x a = if p a then a::x else x in rev o accumulate consifp [] end fun exists p = let fun existsp [] = false | existsp (a::x) = if p a then true else existsp x in existsp end fun equal a b = (a = b) fun member x a = exists (equal a) x fun C f x y = f y x fun cons a x = a::x fun revonto x = accumulate (C cons) x fun length x = let fun count n a = n+1 in accumulate count 0 x end fun repeat f = let fun rptf n x = if n=0 then x else rptf(n-1)(f x) fun check n = if n<0 then error "repeat<0" else n in rptf o check end fun copy n x = repeat (cons x) n [] fun spaces n = concat (copy n " ") local fun lexordset [] = [] | lexordset (a::x) = lexordset (filter (lexless a) x) @ [a] @ lexordset (filter (lexgreater a) x) and lexless(a1:int,b1:int)(a2,b2) = if a2=xstart andalso y>=ystart in fun plot coordlist = plotfrom(xstart,ystart) "" (filter good coordlist) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end val rotate = map (fn (x:int,y:int) => (y,~x)) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if i=n then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun nthgen g 0 = g | nthgen g i = nthgen (mk_nextgen_fn neighbours g) (i-1) val gun = mkgen [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun show pr = (app (fn s => (pr s; pr "\n"))) o plot o alive fun doit () = show (fn _ => ()) (nthgen gun 25000) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit strm = show (fn c => TextIO.output (strm, c)) (nthgen gun 50) end (* Life *) mlton-20210117+dfsg/benchmark/tests/logic.sml000066400000000000000000000302271416264345000207400ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* term.sml *) structure Term = struct datatype term = STR of string * term list | INT of int | CON of string | REF of term option ref exception BadArg of string end; (* trail.sml *) structure Trail = struct local open Term val global_trail = ref (nil : term option ref list) val trail_counter = ref 0 in fun unwind_trail (0, tr) = tr | unwind_trail (n, r::tr) = ( r := NONE ; unwind_trail (n-1, tr) ) | unwind_trail (_, nil) = raise BadArg "unwind_trail" fun reset_trail () = ( global_trail := nil ) fun trail func = let val tc0 = !trail_counter in ( func () ; global_trail := unwind_trail (!trail_counter-tc0, !global_trail) ; trail_counter := tc0 ) end fun bind (r, t) = ( r := SOME t ; global_trail := r::(!global_trail) ; trail_counter := !trail_counter+1 ) end (* local *) end; (* Trail *) (* unify.sml *) structure Unify = struct local open Term Trail fun same_ref (r, REF(r')) = (r = r') | same_ref _ = false fun occurs_check r t = let fun oc (STR(_,ts)) = ocs ts | oc (REF(r')) = (case !r' of SOME(s) => oc s | _ => r <> r') | oc (CON _) = true | oc (INT _) = true and ocs nil = true | ocs (t::ts) = oc t andalso ocs ts in oc t end fun deref (t as (REF(x))) = (case !x of SOME(s) => deref s | _ => t) | deref t = t fun unify' (REF(r), t) sc = unify_REF (r,t) sc | unify' (s, REF(r)) sc = unify_REF (r,s) sc | unify' (STR(f,ts), STR(g,ss)) sc = if (f = g) then unifys (ts,ss) sc else () | unify' (CON(f), CON(g)) sc = if (f = g) then sc () else () | unify' (INT(f), INT(g)) sc = if (f = g) then sc () else () | unify' (_, _) sc = () and unifys (nil, nil) sc = sc () | unifys (t::ts, s::ss) sc = unify' (deref(t), deref(s)) (fn () => unifys (ts, ss) sc) | unifys _ sc = () and unify_REF (r, t) sc = if same_ref (r, t) then sc () else if occurs_check r t then ( bind(r, t) ; sc () ) else () in val deref = deref fun unify (s, t) = unify' (deref(s), deref(t)) end (* local *) end; (* Unify *) (* data.sml *) structure Data = struct local open Term Trail Unify val cons_s = "cons" val x_s = "x" val nil_s = "nil" val o_s = "o" val s_s = "s" val CON_o_s = CON(o_s) val CON_nil_s = CON(nil_s) val CON_x_s = CON(x_s) in fun exists sc = sc (REF(ref(NONE))) fun move_horiz (T_1, T_2) sc = ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => exists (fn T => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () => sc ()))))) ; exists (fn P1 => exists (fn P5 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn P1 => exists (fn P2 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P4 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P1 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn L2 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () => sc ()))))) )) ; exists (fn T => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () => sc ())))) )) ; exists (fn P1 => exists (fn P5 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn P1 => exists (fn P2 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P4 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P1 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn L2 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () => sc ()))))) ) (* | move_horiz _ _ = () *) and rotate (T_1, T_2) sc = exists (fn P11 => exists (fn P12 => exists (fn P13 => exists (fn P14 => exists (fn P15 => exists (fn P21 => exists (fn P22 => exists (fn P23 => exists (fn P24 => exists (fn P31 => exists (fn P32 => exists (fn P33 => exists (fn P41 => exists (fn P42 => exists (fn P51 => unify (T_1, STR(cons_s, [STR(cons_s, [P11, STR(cons_s, [P12, STR(cons_s, [P13, STR(cons_s, [P14, STR(cons_s, [P15, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P21, STR(cons_s, [P22, STR(cons_s, [P23, STR(cons_s, [P24, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P31, STR(cons_s, [P32, STR(cons_s, [P33, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P41, STR(cons_s, [P42, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P51, CON_nil_s]), CON_nil_s])])])])])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P51, STR(cons_s, [P41, STR(cons_s, [P31, STR(cons_s, [P21, STR(cons_s, [P11, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P42, STR(cons_s, [P32, STR(cons_s, [P22, STR(cons_s, [P12, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P33, STR(cons_s, [P23, STR(cons_s, [P13, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P24, STR(cons_s, [P14, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P15, CON_nil_s]), CON_nil_s])])])])])) (fn () => sc ()))))))))))))))))) (* | rotate _ _ = () *) and move (T_1, T_2) sc = ( trail (fn () => ( trail (fn () => exists (fn X => exists (fn Y => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => move_horiz (X, Y) sc))))) ; exists (fn X => exists (fn X1 => exists (fn Y => exists (fn Y1 => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => rotate (X, X1) (fn () => move_horiz (X1, Y1) (fn () => rotate (Y, Y1) sc)))))))) )) ; exists (fn X => exists (fn X1 => exists (fn Y => exists (fn Y1 => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => rotate (X1, X) (fn () => move_horiz (X1, Y1) (fn () => rotate (Y1, Y) sc)))))))) ) (* | move _ _ = () *) and solitaire (T_1, T_2, T_3) sc = ( trail (fn () => exists (fn X => unify (T_1, X) (fn () => unify (T_2, STR(cons_s, [X, CON_nil_s])) (fn () => unify (T_3, INT(0)) (fn () => sc ()))))) ; exists (fn N => exists (fn X => exists (fn Y => exists (fn Z => unify (T_1, X) (fn () => unify (T_2, STR(cons_s, [X, Z])) (fn () => unify (T_3, STR(s_s, [N])) (fn () => move (X, Y) (fn () => solitaire (Y, Z, N) sc)))))))) ) (* | solitaire _ _ = () *) and solution1 (T_1) sc = exists (fn X => unify (T_1, X) (fn () => solitaire (STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])]) , X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc)) (* | solution1 _ _ = () *) and solution2 (T_1) sc = exists (fn X => unify (T_1, X) (fn () => solitaire (STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])]) , X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc)) (* | solution2 _ _ = () *) end (* local *) end; (* Data *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml *) structure Main : BMARK = struct val name = "Logic" exception Done fun testit strm = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done)) handle Done => TextIO.output(strm, "yes\n") fun doit () = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done)) handle Done => () val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end; (* Main *) mlton-20210117+dfsg/benchmark/tests/mandelbrot.sml000066400000000000000000000041701416264345000217700ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* mandelbrot.sml *) structure Main : BMARK = struct val x_base = ~2.0 val y_base = 1.25 val side = 2.5 val sz = 32768 val maxCount = 2048 val delta = side / (real sz) val sum_iterations = ref 0 fun loop1 i = if (i >= sz) then () else let val c_im : real = y_base - (delta * real i) fun loop2 j = if (j >= sz) then () else let val c_re = x_base * (delta + real j) fun loop3 (count, z_re : real, z_im : real) = if (count < maxCount) then let val z_re_sq = z_re * z_re val z_im_sq = z_im * z_im in if ((z_re_sq + z_im_sq) > 4.0) then count else let val z_re_im = (z_re * z_im) in loop3 (count+1, (z_re_sq - z_im_sq) + c_re, z_re_im + z_re_im + c_im) end end (* loop3 *) else count val count = loop3 (0, c_re, c_im) in sum_iterations := !sum_iterations + count; loop2 (j+1) end in loop2 0; loop1 (i+1) end fun doit () = (sum_iterations := 0; loop1 0) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit outstrm = ( sum_iterations := 0; loop1 0; TextIO.output (outstrm, Int.toString(!sum_iterations) ^ " iterations\n")) end (* Mandelbrot *) mlton-20210117+dfsg/benchmark/tests/matrix-multiply.sml000066400000000000000000000031131416264345000230160ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Array = Array2 fun 'a fold (n : int, b : 'a, f : int * 'a -> 'a) = let fun loop (i : int, b : 'a) : 'a = if i = n then b else loop (i + 1, f (i, b)) in loop (0, b) end fun foreach (n : int, f : int -> unit) : unit = fold (n, (), f o #1) fun mult (a1 : real Array.array, a2 : real Array.array) : real Array.array = let val r1 = Array.nRows a1 val c1 = Array.nCols a1 val r2 = Array.nRows a2 val c2 = Array.nCols a2 in if c1 <> r2 then raise Fail "mult" else let val a = Array2.array (r1, c2, 0.0) fun dot (r, c) = fold (c1, 0.0, fn (i, sum) => sum + Array.sub (a1, r, i) * Array.sub (a2, i, c)) in foreach (r1, fn r => foreach (c2, fn c => Array.update (a, r, c, dot (r,c)))); a end end structure Main = struct fun doit () = let val dim = 500 val a = Array.tabulate Array.RowMajor (dim, dim, fn (r, c) => Real.fromInt (r + c)) in if Real.== (41541750.0, Array2.sub (mult (a, a), 0, 0)) then () else raise Fail "bug" end val doit = fn size => let fun loop n = if n = 0 then () else (doit (); loop (n-1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/merge.sml000066400000000000000000000014271416264345000207420ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) fun merge (l1: int list, l2) = case (l1, l2) of ([], _) => l2 | (_, []) => l1 | (x1 :: l1', x2 :: l2') => if x1 <= x2 then x1 :: merge (l1', l2) else x2 :: merge (l1, l2') structure Main = struct fun doit size = let val len = 100000 val l1 = List.tabulate (len, fn i => i * 2) val l2 = List.tabulate (len, fn i => i * 2 + 1) fun test () = if 0 = hd (merge (l1, l2)) then () else raise Fail "bug" fun loop n = if n = 0 then () else (test (); loop (n - 1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/mlyacc.sml000066400000000000000000010716051416264345000211210ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature ORDSET = sig type set type elem exception Select_arb val app : (elem -> unit) -> set -> unit and card: set -> int and closure: set * (elem -> set) -> set and difference: set * set -> set and elem_eq: (elem * elem -> bool) and elem_gt : (elem * elem -> bool) and empty: set and exists: (elem * set) -> bool and find : (elem * set) -> elem option and fold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and insert: (elem * set) -> set and is_empty: set -> bool and make_list: set -> elem list and make_set: (elem list -> set) and partition: (elem -> bool) -> (set -> set * set) and remove: (elem * set) -> set and revfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and select_arb: set -> elem and set_eq: (set * set) -> bool and set_gt: (set * set) -> bool and singleton: (elem -> set) and union: set * set -> set end signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* base.sig: Base signature file for SML-Yacc. This file contains signatures that must be loaded before any of the files produced by ML-Yacc are loaded *) (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'xa stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end (* LR_TABLE: signature for an LR Table. The list of actions and gotos passed to mkLrTable must be ordered by state number. The values for state 0 are the first in the list, the values for state 1 are next, etc. *) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature revealing the internal structure of a token. This signature TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc. The {parser name}_TOKENS structures contain some types and functions to construct tokens from values and positions. The representation of token was very carefully chosen here to allow the polymorphic parser to work without knowing the types of semantic values or line numbers. This has had an impact on the TOKENS structure produced by SML-Yacc, which is a structure parameter to lexer functors. We would like to have some type 'a token which functions to construct tokens would create. A constructor function for a integer token might be INT: int * 'a * 'a -> 'a token. This is not possible because we need to have tokens with the representation given below for the polymorphic parser. Thus our constructur functions for tokens have the form: INT: int * 'a * 'a -> (svalue,'a) token This in turn has had an impact on the signature that lexers for SML-Yacc must match and the types that a user must declare in the user declarations section of lexers. *) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse : {table : LrTable.table, lexer : ('b,'c) Token.token Stream.stream, arg: 'arg, saction : int * 'c * (LrTable.state * ('b * 'c * 'c)) list * 'arg -> LrTable.nonterm * ('b * 'c * 'c) * ((LrTable.state *('b * 'c * 'c)) list), void : 'b, ec : { is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_change : (LrTable.term list * LrTable.term list) list, errtermvalue : LrTable.term -> 'b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * 'c * 'c -> unit }, lookahead : int (* max amount of lookahead used in *) (* error correction *) } -> 'b * (('b,'c) Token.token Stream.stream) end (* LEXER: a signature that most lexers produced for use with SML-Yacc's output will match. The user is responsible for declaring type token, type pos, and type svalue in the UserDeclarations section of a lexer. Note that type token is abstract in the lexer. This allows SML-Yacc to create a TOKENS signature for use with lexers produced by ML-Lex that treats the type token abstractly. Lexers that are functors parametrized by a Tokens structure matching a TOKENS signature cannot examine the structure of tokens. *) signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun produced by SML-Yacc. All such structures match this signature. The {parser name}LrValsFun produces a structure which contains all the values except for the lexer needed to call the polymorphic parser mentioned before. *) signature PARSER_DATA = sig (* the type of line numbers *) type pos (* the type of semantic values *) type svalue (* the type of the user-supplied argument to the parser *) type arg (* the intended type of the result of the parser. This value is produced by applying extract from the structure Actions to the final semantic value resultiing from a parse. *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable (* structure Actions contains the functions which mantain the semantic values stack in the parser. Void is used to provide a default value for the semantic stack. *) structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg-> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_change : (LrTable.term list * LrTable.term list) list val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end (* signature PARSER is the signature that most user parsers created by SML-Yacc will match. *) signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError (* type pos is the type of line numbers *) type pos (* type result is the type of the result from the parser *) type result (* the type of the user-supplied argument to the parser *) type arg (* type svalue is the type of semantic values for the semantic value stack *) type svalue (* val makeLexer is used to create a stream of tokens for the parser *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream (* val parse takes a stream of tokens and a function to print errors and returns a value of type result and a stream containing the unused tokens *) val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* signature ARG_PARSER is the signature that will be matched by parsers whose lexer takes an additional argument. *) signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* ML-Yacc Parser Generator (c) 1989, 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:38 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature HEADER = sig type pos (*= int 1998-5-14 STW: taken out because leads to nonstandard sharing constraint on line 3386 *) val lineno : pos ref val text : string list ref type inputSource val newSource : string * TextIO.instream * TextIO.outstream -> inputSource val error : inputSource -> pos -> string -> unit val warn : inputSource -> pos -> string -> unit val errorOccurred : inputSource -> unit -> bool datatype symbol = SYMBOL of string * pos val symbolName : symbol -> string val symbolPos : symbol -> pos val symbolMake : string * int -> symbol type ty val tyName : ty -> string val tyMake : string -> ty (* associativities: each kind of associativity is assigned a unique integer *) datatype prec = LEFT | RIGHT | NONASSOC datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : string, prec : symbol option} datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol * ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol * ty option) list option, control : control list, value : (symbol * string) list} val join_decls : declData * declData * inputSource * pos -> declData type parseResult val getResult : parseResult -> string * declData * rule list end; signature PARSE_GEN_PARSER = sig structure Header : HEADER val parse : string -> Header.parseResult * Header.inputSource end; signature PARSE_GEN = sig val parseGen : string -> unit end; signature GRAMMAR = sig datatype term = T of int datatype nonterm = NT of int datatype symbol = TERM of term | NONTERM of nonterm (* grammar: terminals should be numbered from 0 to terms-1, nonterminals should be numbered from 0 to nonterms-1, rules should be numbered between 0 and (length rules) - 1, higher precedence binds tighter, start nonterminal should not occur on the rhs of any rule *) datatype grammar = GRAMMAR of {rules: {lhs : nonterm, rhs : symbol list, precedence : int option, rulenum : int } list, terms: int, nonterms: int, start : nonterm, eop : term list, noshift : term list, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end (* signature for internal version of grammar *) signature INTGRAMMAR = sig structure Grammar : GRAMMAR structure SymbolAssoc : TABLE structure NontermAssoc : TABLE sharing type SymbolAssoc.key = Grammar.symbol sharing type NontermAssoc.key = Grammar.nonterm datatype rule = RULE of {lhs : Grammar.nonterm, rhs : Grammar.symbol list, (* internal number of rule - convenient for producing LR graph *) num : int, rulenum : int, precedence : int option} val gtTerm : Grammar.term * Grammar.term -> bool val eqTerm : Grammar.term * Grammar.term -> bool val gtNonterm : Grammar.nonterm * Grammar.nonterm -> bool val eqNonterm : Grammar.nonterm * Grammar.nonterm -> bool val gtSymbol : Grammar.symbol * Grammar.symbol -> bool val eqSymbol : Grammar.symbol * Grammar.symbol -> bool (* Debugging information will be generated only if DEBUG is true. *) val DEBUG : bool val prRule : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> 'b) -> rule -> unit val prGrammar : (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> Grammar.grammar -> unit end signature CORE = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar datatype item = ITEM of { rule : IntGrammar.rule, dot : int, (* rhsAfter: The portion of the rhs of a rule that lies after the dot *) rhsAfter: Grammar.symbol list } (* eqItem and gtItem compare items *) val eqItem : item * item -> bool val gtItem : item * item -> bool (* functions for maintaining ordered item lists *) val insert : item * item list -> item list val union : item list * item list -> item list (* core: a set of items. It is represented by an ordered list of items. The list is in ascending order The rule numbers and the positions of the dots are used to order the items. *) datatype core = CORE of item list * int (* state # *) (* gtCore and eqCore compare the lists of items *) val gtCore : core * core -> bool val eqCore : core * core -> bool (* functions for debugging *) val prItem : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> item -> unit val prCore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> core -> unit end signature CORE_UTILS = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar (* mkFuncs: create functions for the set of productions derived from a nonterminal, the cores that result from shift/gotos from a core, and return a list of rules *) val mkFuncs : Grammar.grammar -> { produces : Grammar.nonterm -> IntGrammar.rule list, (* shifts: take a core and compute all the cores that result from shifts/gotos on symbols *) shifts : Core.core -> (Grammar.symbol*Core.item list) list, rules: IntGrammar.rule list, (* epsProds: take a core compute epsilon productions for it *) epsProds : Core.core -> IntGrammar.rule list} end signature LRGRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar type graph val edges : Core.core * graph -> {edge:Grammar.symbol,to:Core.core} list val nodes : graph -> Core.core list val shift : graph -> int * Grammar.symbol -> int (* int = state # *) val core : graph -> int -> Core.core (* get core for a state *) (* mkGraph: compute the LR(0) sets of items *) val mkGraph : Grammar.grammar -> {graph : graph, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds: Core.core -> IntGrammar.rule list} val prGraph: (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> graph -> unit end signature LOOK = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar val union : Grammar.term list * Grammar.term list -> Grammar.term list val make_set : Grammar.term list -> Grammar.term list val mkFuncs : {rules : IntGrammar.rule list, nonterms : int, produces : Grammar.nonterm -> IntGrammar.rule list} -> {nullable: Grammar.nonterm -> bool, first : Grammar.symbol list -> Grammar.term list} val prLook : (Grammar.term -> string) * (string -> unit) -> Grammar.term list -> unit end signature LALR_GRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH sharing Grammar = IntGrammar.Grammar = Core.Grammar = Graph.Grammar sharing IntGrammar = Core.IntGrammar = Graph.IntGrammar sharing Core = Graph.Core datatype lcore = LCORE of (Core.item * Grammar.term list) list * int val addLookahead : {graph : Graph.graph, first : Grammar.symbol list -> Grammar.term list, eop : Grammar.term list, nonterms : int, nullable: Grammar.nonterm -> bool, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds : Core.core -> IntGrammar.rule list, print : string -> unit, (* for debugging *) termToString : Grammar.term -> string, nontermToString : Grammar.nonterm -> string} -> lcore list val prLcore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (Grammar.term -> string) * (string -> unit) -> lcore -> unit end (* LR_ERRS: errors found while constructing an LR table *) signature LR_ERRS = sig structure LrTable : LR_TABLE (* RR = reduce/reduce, SR = shift/reduce NS: non-shiftable terminal found on the rhs of a rule NOT_REDUCED n: rule number n was not reduced START n : start symbol found on the rhs of rule n *) datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NS of LrTable.term * int | NOT_REDUCED of int | START of int val summary : err list -> {rr : int, sr: int, not_reduced : int, start : int,nonshift : int} val printSummary : (string -> unit) -> err list -> unit end (* PRINT_STRUCT: prints a structure which includes a value 'table' and a structure Table whose signature matches LR_TABLE. The table in the printed structure will contain the same information as the one passed to printStruct, although the representation may be different. It returns the number of entries left in the table after compaction.*) signature PRINT_STRUCT = sig structure LrTable : LR_TABLE val makeStruct : {table : LrTable.table, name : string, print: string -> unit, verbose : bool } -> int end (* VERBOSE: signature for a structure which takes a table and creates a verbose description of it *) signature VERBOSE = sig structure Errs : LR_ERRS val printVerbose : {table : Errs.LrTable.table, entries : int, termToString : Errs.LrTable.term -> string, nontermToString : Errs.LrTable.nonterm -> string, stateErrs : Errs.LrTable.state -> Errs.err list, errs : Errs.err list, print: string -> unit, printCores : (string -> unit) -> Errs.LrTable.state -> unit, printRule : (string -> unit) -> int -> unit} -> unit end (* MAKE_LR_TABLE: signature for a structure which includes a structure matching the signature LR_TABLE and a function which maps grammars to tables *) signature MAKE_LR_TABLE = sig structure Grammar : GRAMMAR structure Errs : LR_ERRS structure LrTable : LR_TABLE sharing Errs.LrTable = LrTable sharing type LrTable.term = Grammar.term sharing type LrTable.nonterm = Grammar.nonterm (* boolean value determines whether default reductions will be used. If it is true, reductions will be used. *) val mkTable : Grammar.grammar * bool -> LrTable.table * (LrTable.state -> Errs.err list) * (* errors in a state *) ((string -> unit) -> LrTable.state -> unit) * Errs.err list (* list of all errors *) end; (* SHRINK_LR_TABLE: finds unique action entry rows in the action table for the LR parser *) signature SHRINK_LR_TABLE = sig (* Takes an action table represented as a list of action rows. It returns the number of unique rows left in the action table, a list of integers which maps each original row to a unique row, and a list of unique rows *) structure LrTable : LR_TABLE val shrinkActionList : LrTable.table * bool -> (int * int list * ((LrTable.term,LrTable.action) LrTable.pairlist * LrTable.action) list) * int end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:34 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor HeaderFun () : HEADER = struct val DEBUG = true type pos = int val lineno = ref 0 val text = ref (nil: string list) type inputSource = {name : string, errStream : TextIO.outstream, inStream : TextIO.instream, errorOccurred : bool ref} val newSource = fn (s : string,i : TextIO.instream ,errs : TextIO.outstream) => {name=s,errStream=errs,inStream=i, errorOccurred = ref false} val errorOccurred = fn (s : inputSource) =>fn () => !(#errorOccurred s) val pr = fn out : TextIO.outstream => fn s : string => TextIO.output(out,s) val error = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString l); pr ": Error: "; pr msg; pr "\n"; errorOccurred := true) end val warn = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString l); pr ": Warning: "; pr msg; pr "\n") end datatype prec = LEFT | RIGHT | NONASSOC datatype symbol = SYMBOL of string * pos val symbolName = fn SYMBOL(s,_) => s val symbolPos = fn SYMBOL(_,p) => p val symbolMake = fn sp => SYMBOL sp type ty = string val tyName = fn i => i val tyMake = fn i => i datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol*ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol* ty option) list option, control : control list, value : (symbol * string) list} type rhsData = {rhs:symbol list,code:string, prec:symbol option} list datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : string, prec : symbol option} type parseResult = string * declData * rule list val getResult = fn p => p fun join_decls (DECL {eop=e,control=c,keyword=k,nonterm=n,prec, change=su,term=t,value=v}:declData, DECL {eop=e',control=c',keyword=k',nonterm=n',prec=prec', change=su',term=t',value=v'} : declData, inputSource,pos) = let val ignore = fn s => (warn inputSource pos ("ignoring duplicate " ^ s ^ " declaration")) val join = fn (e,NONE,NONE) => NONE | (e,NONE,a) => a | (e,a,NONE) => a | (e,a,b) => (ignore e; a) fun mergeControl (nil,a) = [a] | mergeControl (l as h::t,a) = case (h,a) of (PARSER_NAME _,PARSER_NAME n1) => (ignore "%name"; l) | (FUNCTOR _,FUNCTOR _) => (ignore "%header"; l) | (PARSE_ARG _,PARSE_ARG _) => (ignore "%arg"; l) | (START_SYM _,START_SYM s) => (ignore "%start"; l) | (POS _,POS _) => (ignore "%pos"; l) | (NSHIFT a,NSHIFT b) => (NSHIFT (a@b)::t) | _ => h :: mergeControl(t,a) fun loop (nil,r) = r | loop (h::t,r) = loop(t,mergeControl(r,h)) in DECL {eop=e@e',control=loop(c',c),keyword=k'@k, nonterm=join("%nonterm",n,n'), prec=prec@prec', change=su@su', term=join("%term",t,t'),value=v@v'} : declData end end; structure Header = HeaderFun(); signature Mlyacc_TOKENS = sig type ('a,'b) token type svalue val BOGUS_VALUE: 'a * 'a -> (svalue,'a) token val UNKNOWN: (string) * 'a * 'a -> (svalue,'a) token val VALUE: 'a * 'a -> (svalue,'a) token val VERBOSE: 'a * 'a -> (svalue,'a) token val TYVAR: (string) * 'a * 'a -> (svalue,'a) token val TERM: 'a * 'a -> (svalue,'a) token val START: 'a * 'a -> (svalue,'a) token val SUBST: 'a * 'a -> (svalue,'a) token val RPAREN: 'a * 'a -> (svalue,'a) token val RBRACE: 'a * 'a -> (svalue,'a) token val PROG: (string) * 'a * 'a -> (svalue,'a) token val PREFER: 'a * 'a -> (svalue,'a) token val PREC_TAG: 'a * 'a -> (svalue,'a) token val PREC: (Header.prec) * 'a * 'a -> (svalue,'a) token val PERCENT_ARG: 'a * 'a -> (svalue,'a) token val PERCENT_POS: 'a * 'a -> (svalue,'a) token val PERCENT_PURE: 'a * 'a -> (svalue,'a) token val PERCENT_EOP: 'a * 'a -> (svalue,'a) token val OF: 'a * 'a -> (svalue,'a) token val NOSHIFT: 'a * 'a -> (svalue,'a) token val NONTERM: 'a * 'a -> (svalue,'a) token val NODEFAULT: 'a * 'a -> (svalue,'a) token val NAME: 'a * 'a -> (svalue,'a) token val LPAREN: 'a * 'a -> (svalue,'a) token val LBRACE: 'a * 'a -> (svalue,'a) token val KEYWORD: 'a * 'a -> (svalue,'a) token val INT: (string) * 'a * 'a -> (svalue,'a) token val PERCENT_HEADER: 'a * 'a -> (svalue,'a) token val IDDOT: (string) * 'a * 'a -> (svalue,'a) token val ID: (string*int) * 'a * 'a -> (svalue,'a) token val HEADER: (string) * 'a * 'a -> (svalue,'a) token val FOR: 'a * 'a -> (svalue,'a) token val EOF: 'a * 'a -> (svalue,'a) token val DELIMITER: 'a * 'a -> (svalue,'a) token val COMMA: 'a * 'a -> (svalue,'a) token val COLON: 'a * 'a -> (svalue,'a) token val CHANGE: 'a * 'a -> (svalue,'a) token val BAR: 'a * 'a -> (svalue,'a) token val BLOCK: 'a * 'a -> (svalue,'a) token val ASTERISK: 'a * 'a -> (svalue,'a) token val ARROW: 'a * 'a -> (svalue,'a) token end signature Mlyacc_LRVALS= sig structure Tokens : Mlyacc_TOKENS structure ParserData:PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end functor MlyaccLrValsFun(structure Hdr : HEADER where type prec = Header.prec structure Token : TOKEN) = struct structure ParserData= struct structure Header = struct (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser for the ML parser generator *) open Hdr end structure LrTable = Token.LrTable structure Token = Token local open LrTable in val table=let val actionRows = "\ \\001\000\001\000\074\000\000\000\ \\001\000\005\000\024\000\008\000\023\000\014\000\022\000\016\000\021\000\ \\019\000\020\000\020\000\019\000\021\000\018\000\022\000\017\000\ \\024\000\016\000\025\000\015\000\026\000\014\000\027\000\013\000\ \\028\000\012\000\030\000\011\000\034\000\010\000\035\000\009\000\ \\036\000\008\000\038\000\007\000\039\000\006\000\000\000\ \\001\000\006\000\061\000\000\000\ \\001\000\006\000\072\000\000\000\ \\001\000\006\000\084\000\000\000\ \\001\000\006\000\096\000\000\000\ \\001\000\007\000\083\000\032\000\082\000\000\000\ \\001\000\009\000\000\000\000\000\ \\001\000\010\000\059\000\000\000\ \\001\000\011\000\003\000\000\000\ \\001\000\012\000\025\000\000\000\ \\001\000\012\000\027\000\000\000\ \\001\000\012\000\028\000\000\000\ \\001\000\012\000\031\000\000\000\ \\001\000\012\000\042\000\013\000\041\000\000\000\ \\001\000\012\000\042\000\013\000\041\000\017\000\040\000\031\000\039\000\ \\037\000\038\000\000\000\ \\001\000\012\000\046\000\000\000\ \\001\000\012\000\051\000\000\000\ \\001\000\012\000\069\000\015\000\068\000\000\000\ \\001\000\012\000\069\000\015\000\068\000\032\000\067\000\000\000\ \\001\000\012\000\075\000\000\000\ \\001\000\012\000\078\000\000\000\ \\001\000\012\000\099\000\000\000\ \\001\000\031\000\035\000\000\000\ \\001\000\031\000\048\000\000\000\ \\001\000\031\000\055\000\000\000\ \\001\000\031\000\098\000\000\000\ \\001\000\031\000\102\000\000\000\ \\104\000\012\000\051\000\000\000\ \\105\000\000\000\ \\106\000\000\000\ \\107\000\004\000\056\000\000\000\ \\108\000\004\000\056\000\000\000\ \\109\000\000\000\ \\110\000\000\000\ \\111\000\000\000\ \\112\000\000\000\ \\113\000\000\000\ \\114\000\000\000\ \\115\000\000\000\ \\116\000\000\000\ \\117\000\000\000\ \\118\000\000\000\ \\119\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\120\000\000\000\ \\121\000\000\000\ \\122\000\000\000\ \\123\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\124\000\000\000\ \\125\000\000\000\ \\126\000\004\000\073\000\000\000\ \\127\000\000\000\ \\128\000\000\000\ \\129\000\004\000\058\000\000\000\ \\130\000\000\000\ \\131\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\132\000\023\000\089\000\000\000\ \\133\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\134\000\023\000\057\000\000\000\ \\135\000\004\000\092\000\000\000\ \\136\000\000\000\ \\137\000\000\000\ \\138\000\000\000\ \\139\000\012\000\033\000\000\000\ \\140\000\000\000\ \\141\000\000\000\ \\142\000\000\000\ \\143\000\000\000\ \\144\000\000\000\ \\145\000\000\000\ \\146\000\000\000\ \\147\000\000\000\ \\148\000\012\000\042\000\013\000\041\000\000\000\ \\149\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\150\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\151\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\152\000\000\000\ \\153\000\000\000\ \\154\000\000\000\ \\155\000\000\000\ \\156\000\000\000\ \\157\000\029\000\094\000\000\000\ \" val actionRowNumbers = "\009\000\030\000\001\000\029\000\ \\010\000\044\000\011\000\012\000\ \\013\000\063\000\063\000\023\000\ \\015\000\046\000\063\000\063\000\ \\011\000\045\000\016\000\063\000\ \\024\000\017\000\063\000\025\000\ \\031\000\058\000\034\000\053\000\ \\039\000\008\000\037\000\063\000\ \\033\000\002\000\047\000\071\000\ \\066\000\069\000\019\000\014\000\ \\076\000\035\000\040\000\032\000\ \\042\000\036\000\041\000\028\000\ \\061\000\003\000\050\000\038\000\ \\000\000\048\000\020\000\015\000\ \\013\000\021\000\062\000\015\000\ \\070\000\015\000\015\000\006\000\ \\004\000\068\000\079\000\078\000\ \\077\000\060\000\063\000\063\000\ \\063\000\056\000\057\000\052\000\ \\054\000\043\000\072\000\073\000\ \\067\000\018\000\015\000\059\000\ \\081\000\049\000\051\000\015\000\ \\005\000\075\000\063\000\026\000\ \\022\000\055\000\015\000\081\000\ \\064\000\080\000\074\000\027\000\ \\065\000\007\000" val gotoT = "\ \\001\000\101\000\000\000\ \\006\000\002\000\000\000\ \\005\000\003\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\002\000\024\000\000\000\ \\000\000\ \\013\000\028\000\014\000\027\000\000\000\ \\003\000\030\000\000\000\ \\003\000\032\000\000\000\ \\000\000\ \\007\000\035\000\017\000\034\000\000\000\ \\000\000\ \\003\000\041\000\000\000\ \\003\000\042\000\000\000\ \\002\000\043\000\000\000\ \\000\000\ \\000\000\ \\003\000\045\000\000\000\ \\000\000\ \\010\000\048\000\011\000\047\000\000\000\ \\003\000\052\000\015\000\051\000\016\000\050\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\058\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\064\000\008\000\063\000\000\000\ \\007\000\068\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\010\000\069\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\074\000\000\000\ \\013\000\075\000\014\000\027\000\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\077\000\000\000\ \\000\000\ \\007\000\035\000\017\000\078\000\000\000\ \\007\000\035\000\017\000\079\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\084\000\009\000\083\000\000\000\ \\003\000\052\000\015\000\085\000\016\000\050\000\000\000\ \\003\000\086\000\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\007\000\060\000\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\004\000\088\000\000\000\ \\007\000\035\000\017\000\089\000\000\000\ \\000\000\ \\012\000\091\000\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\093\000\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\003\000\095\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\007\000\035\000\017\000\098\000\000\000\ \\012\000\099\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \" val numstates = 102 val numrules = 54 val s = ref "" and index = ref 0 val string_to_int = fn () => let val i = !index in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 end val string_to_list = fn s' => let val len = String.size s' fun f () = if !index < len then string_to_int() :: f() else nil in index := 0; s := s'; f () end val string_to_pairlist = fn (conv_key,conv_entry) => let fun f () = case string_to_int() of 0 => EMPTY | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) in f end val string_to_pairlist_default = fn (conv_key,conv_entry) => let val conv_row = string_to_pairlist(conv_key,conv_entry) in fn () => let val default = conv_entry(string_to_int()) val row = conv_row() in (row,default) end end val string_to_table = fn (convert_row,s') => let val len = String.size s' fun f ()= if !index < len then convert_row() :: f() else nil in (s := s'; index := 0; f ()) end local val memo = Array.array(numstates+numrules,ERROR) val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) fun f i = if i=numstates then g i else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) in f 0 handle Subscript => () end in val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) end val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) val actionRowNumbers = string_to_list actionRowNumbers val actionT = let val actionRowLookUp= let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end in Array.fromList(map actionRowLookUp actionRowNumbers) end in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, numStates=numstates,initialState=STATE 0} end end local open Header in type pos = int type arg = Hdr.inputSource structure MlyValue = struct datatype svalue = VOID | ntVOID of unit -> unit | UNKNOWN of unit -> (string) | TYVAR of unit -> (string) | PROG of unit -> (string) | PREC of unit -> (Header.prec) | INT of unit -> (string) | IDDOT of unit -> (string) | ID of unit -> (string*int) | HEADER of unit -> (string) | TY of unit -> (string) | CHANGE_DEC of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) ) | CHANGE_DECL of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) list) | SUBST_DEC of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) ) | SUBST_DECL of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) list) | G_RULE_PREC of unit -> (Hdr.symbol option) | G_RULE_LIST of unit -> (Hdr.rule list) | G_RULE of unit -> (Hdr.rule list) | RHS_LIST of unit -> ({ rhs:Hdr.symbol list,code:string,prec:Hdr.symbol option } list) | RECORD_LIST of unit -> (string) | QUAL_ID of unit -> (string) | MPC_DECLS of unit -> (Hdr.declData) | MPC_DECL of unit -> (Hdr.declData) | LABEL of unit -> (string) | ID_LIST of unit -> (Hdr.symbol list) | CONSTR_LIST of unit -> ( ( Hdr.symbol * Hdr.ty option ) list) | BEGIN of unit -> (string*Hdr.declData* ( Hdr.rule list ) ) end type svalue = MlyValue.svalue type result = string*Hdr.declData* ( Hdr.rule list ) end structure EC= struct open LrTable val is_keyword = fn _ => false val preferred_change = nil val noShift = fn (T 8) => true | _ => false val showTerminal = fn (T 0) => "ARROW" | (T 1) => "ASTERISK" | (T 2) => "BLOCK" | (T 3) => "BAR" | (T 4) => "CHANGE" | (T 5) => "COLON" | (T 6) => "COMMA" | (T 7) => "DELIMITER" | (T 8) => "EOF" | (T 9) => "FOR" | (T 10) => "HEADER" | (T 11) => "ID" | (T 12) => "IDDOT" | (T 13) => "PERCENT_HEADER" | (T 14) => "INT" | (T 15) => "KEYWORD" | (T 16) => "LBRACE" | (T 17) => "LPAREN" | (T 18) => "NAME" | (T 19) => "NODEFAULT" | (T 20) => "NONTERM" | (T 21) => "NOSHIFT" | (T 22) => "OF" | (T 23) => "PERCENT_EOP" | (T 24) => "PERCENT_PURE" | (T 25) => "PERCENT_POS" | (T 26) => "PERCENT_ARG" | (T 27) => "PREC" | (T 28) => "PREC_TAG" | (T 29) => "PREFER" | (T 30) => "PROG" | (T 31) => "RBRACE" | (T 32) => "RPAREN" | (T 33) => "SUBST" | (T 34) => "START" | (T 35) => "TERM" | (T 36) => "TYVAR" | (T 37) => "VERBOSE" | (T 38) => "VALUE" | (T 39) => "UNKNOWN" | (T 40) => "BOGUS_VALUE" | _ => "bogus-term" local open Header in val errtermvalue= fn _ => MlyValue.VOID end val terms = (T 0) :: (T 1) :: (T 2) :: (T 3) :: (T 4) :: (T 5) :: (T 6 ) :: (T 7) :: (T 8) :: (T 9) :: (T 13) :: (T 15) :: (T 16) :: (T 17) :: (T 18) :: (T 19) :: (T 20) :: (T 21) :: (T 22) :: (T 23) :: (T 24) :: (T 25) :: (T 26) :: (T 28) :: (T 29) :: (T 31) :: (T 32) :: (T 33) :: (T 34) :: (T 35) :: (T 37) :: (T 38) :: (T 40) :: nil end structure Actions = struct exception mlyAction of int local open Header in val actions = fn (i392,defaultPos,stack, (inputSource):arg) => case (i392,stack) of (0,(_,(MlyValue.G_RULE_LIST G_RULE_LIST1,_,G_RULE_LIST1right))::_:: (_,(MlyValue.MPC_DECLS MPC_DECLS1,_,_))::(_,(MlyValue.HEADER HEADER1, HEADER1left,_))::rest671) => let val result=MlyValue.BEGIN(fn _ => let val HEADER as HEADER1=HEADER1 () val MPC_DECLS as MPC_DECLS1=MPC_DECLS1 () val G_RULE_LIST as G_RULE_LIST1=G_RULE_LIST1 () in (HEADER,MPC_DECLS,rev G_RULE_LIST) end ) in (LrTable.NT 0,(result,HEADER1left,G_RULE_LIST1right),rest671) end | (1,(_,(MlyValue.MPC_DECL MPC_DECL1,MPC_DECLleft,MPC_DECL1right))::(_ ,(MlyValue.MPC_DECLS MPC_DECLS1,MPC_DECLS1left,_))::rest671) => let val result=MlyValue.MPC_DECLS(fn _ => let val MPC_DECLS as MPC_DECLS1= MPC_DECLS1 () val MPC_DECL as MPC_DECL1=MPC_DECL1 () in (join_decls(MPC_DECLS,MPC_DECL,inputSource,MPC_DECLleft)) end ) in (LrTable.NT 5,(result,MPC_DECLS1left,MPC_DECL1right),rest671) end | (2,rest671) => let val result=MlyValue.MPC_DECLS(fn _ => ( DECL {prec=nil,nonterm=NONE,term=NONE,eop=nil,control=nil, keyword=nil,change=nil, value=nil} )) in (LrTable.NT 5,(result,defaultPos,defaultPos),rest671) end | (3,(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,_,CONSTR_LIST1right))::(_,( _,TERM1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () in ( DECL { prec=nil,nonterm=NONE, term = SOME CONSTR_LIST, eop =nil,control=nil, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,TERM1left,CONSTR_LIST1right),rest671) end | (4,(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,_,CONSTR_LIST1right))::(_,( _,NONTERM1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () in ( DECL { prec=nil,control=nil,nonterm= SOME CONSTR_LIST, term = NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NONTERM1left,CONSTR_LIST1right),rest671) end | (5,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,( MlyValue.PREC PREC1,PREC1left,_))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => let val PREC as PREC1=PREC1 () val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec= [(PREC,ID_LIST)],control=nil, nonterm=NONE,term=NONE,eop=nil,change=nil, keyword=nil,value=nil} ) end ) in (LrTable.NT 4,(result,PREC1left,ID_LIST1right),rest671) end | (6,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,START1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID as ID1=ID1 () in ( DECL {prec=nil,control=[START_SYM (symbolMake ID)],nonterm=NONE, term = NONE, eop = nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,START1left,ID1right),rest671) end | (7,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, PERCENT_EOP1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE, eop=ID_LIST, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_EOP1left,ID_LIST1right),rest671) end | (8,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, KEYWORD1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=ID_LIST, value=nil} ) end ) in (LrTable.NT 4,(result,KEYWORD1left,ID_LIST1right),rest671) end | (9,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, PREFER1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=map (fn i=>([],[i])) ID_LIST,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PREFER1left,ID_LIST1right),rest671) end | (10,(_,(MlyValue.CHANGE_DECL CHANGE_DECL1,_,CHANGE_DECL1right))::(_, (_,CHANGE1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CHANGE_DECL as CHANGE_DECL1=CHANGE_DECL1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=CHANGE_DECL,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,CHANGE1left,CHANGE_DECL1right),rest671) end | (11,(_,(MlyValue.SUBST_DECL SUBST_DECL1,_,SUBST_DECL1right))::(_,(_, SUBST1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val SUBST_DECL as SUBST_DECL1=SUBST_DECL1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=SUBST_DECL,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,SUBST1left,SUBST_DECL1right),rest671) end | (12,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, NOSHIFT1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=[NSHIFT ID_LIST],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NOSHIFT1left,ID_LIST1right),rest671) end | (13,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(_, PERCENT_HEADER1left,_))::rest671) => let val result=MlyValue.MPC_DECL( fn _ => let val PROG as PROG1=PROG1 () in ( DECL {prec=nil,control=[FUNCTOR PROG],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_HEADER1left,PROG1right),rest671) end | (14,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,NAME1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID as ID1=ID1 () in ( DECL {prec=nil,control=[PARSER_NAME (symbolMake ID)], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NAME1left,ID1right),rest671) end | (15,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.PROG PROG1,_,_ ))::(_,(_,PERCENT_ARG1left,_))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => let val PROG as PROG1=PROG1 () val TY as TY1=TY1 () in ( DECL {prec=nil,control=[PARSE_ARG(PROG,TY)],nonterm=NONE, term=NONE,eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_ARG1left,TY1right),rest671) end | (16,(_,(_,VERBOSE1left,VERBOSE1right))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.VERBOSE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,VERBOSE1left,VERBOSE1right),rest671) end | (17,(_,(_,NODEFAULT1left,NODEFAULT1right))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.NODEFAULT], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,NODEFAULT1left,NODEFAULT1right),rest671) end | (18,(_,(_,PERCENT_PURE1left,PERCENT_PURE1right))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.PURE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,PERCENT_PURE1left,PERCENT_PURE1right), rest671) end | (19,(_,(MlyValue.TY TY1,_,TY1right))::(_,(_,PERCENT_POS1left,_)):: rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val TY as TY1 =TY1 () in ( DECL {prec=nil,control=[Hdr.POS TY], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_POS1left,TY1right),rest671) end | (20,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.ID ID1,_,_) )::(_,(_,VALUE1left,_))::rest671) => let val result=MlyValue.MPC_DECL( fn _ => let val ID as ID1=ID1 () val PROG as PROG1=PROG1 () in ( DECL {prec=nil,control=nil, nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=[(symbolMake ID,PROG)]} ) end ) in (LrTable.NT 4,(result,VALUE1left,PROG1right),rest671) end | (21,(_,(MlyValue.CHANGE_DECL CHANGE_DECL1,_,CHANGE_DECL1right))::_:: (_,(MlyValue.CHANGE_DEC CHANGE_DEC1,CHANGE_DEC1left,_))::rest671) => let val result=MlyValue.CHANGE_DECL(fn _ => let val CHANGE_DEC as CHANGE_DEC1=CHANGE_DEC1 () val CHANGE_DECL as CHANGE_DECL1=CHANGE_DECL1 () in (CHANGE_DEC :: CHANGE_DECL) end ) in (LrTable.NT 14,(result,CHANGE_DEC1left,CHANGE_DECL1right),rest671) end | (22,(_,(MlyValue.CHANGE_DEC CHANGE_DEC1,CHANGE_DEC1left, CHANGE_DEC1right))::rest671) => let val result=MlyValue.CHANGE_DECL( fn _ => let val CHANGE_DEC as CHANGE_DEC1=CHANGE_DEC1 () in ([CHANGE_DEC]) end ) in (LrTable.NT 14,(result,CHANGE_DEC1left,CHANGE_DEC1right),rest671) end | (23,(_,(MlyValue.ID_LIST ID_LIST2,_,ID_LIST2right))::_::(_,( MlyValue.ID_LIST ID_LIST1,ID_LIST1left,_))::rest671) => let val result =MlyValue.CHANGE_DEC(fn _ => let val ID_LIST1=ID_LIST1 () val ID_LIST2=ID_LIST2 () in (ID_LIST1, ID_LIST2) end ) in (LrTable.NT 15,(result,ID_LIST1left,ID_LIST2right),rest671) end | (24,(_,(MlyValue.SUBST_DECL SUBST_DECL1,_,SUBST_DECL1right))::_::(_, (MlyValue.SUBST_DEC SUBST_DEC1,SUBST_DEC1left,_))::rest671) => let val result=MlyValue.SUBST_DECL(fn _ => let val SUBST_DEC as SUBST_DEC1 =SUBST_DEC1 () val SUBST_DECL as SUBST_DECL1=SUBST_DECL1 () in (SUBST_DEC :: SUBST_DECL) end ) in (LrTable.NT 12,(result,SUBST_DEC1left,SUBST_DECL1right),rest671) end | (25,(_,(MlyValue.SUBST_DEC SUBST_DEC1,SUBST_DEC1left,SUBST_DEC1right ))::rest671) => let val result=MlyValue.SUBST_DECL(fn _ => let val SUBST_DEC as SUBST_DEC1=SUBST_DEC1 () in ([SUBST_DEC]) end ) in (LrTable.NT 12,(result,SUBST_DEC1left,SUBST_DEC1right),rest671) end | (26,(_,(MlyValue.ID ID2,_,ID2right))::_::(_,(MlyValue.ID ID1,ID1left ,_))::rest671) => let val result=MlyValue.SUBST_DEC(fn _ => let val ID1=ID1 () val ID2=ID2 () in ([symbolMake ID2],[symbolMake ID1]) end ) in (LrTable.NT 13,(result,ID1left,ID2right),rest671) end | (27,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.ID ID1,_,_)):: _::(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,CONSTR_LIST1left,_))::rest671 ) => let val result=MlyValue.CONSTR_LIST(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () val ID as ID1=ID1 () val TY as TY1=TY1 () in ((symbolMake ID,SOME (tyMake TY))::CONSTR_LIST) end ) in (LrTable.NT 1,(result,CONSTR_LIST1left,TY1right),rest671) end | (28,(_,(MlyValue.ID ID1,_,ID1right))::_::(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,CONSTR_LIST1left,_))::rest671) => let val result= MlyValue.CONSTR_LIST(fn _ => let val CONSTR_LIST as CONSTR_LIST1= CONSTR_LIST1 () val ID as ID1=ID1 () in ((symbolMake ID,NONE)::CONSTR_LIST) end ) in (LrTable.NT 1,(result,CONSTR_LIST1left,ID1right),rest671) end | (29,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.ID ID1,ID1left ,_))::rest671) => let val result=MlyValue.CONSTR_LIST(fn _ => let val ID as ID1=ID1 () val TY as TY1=TY1 () in ([(symbolMake ID,SOME (tyMake TY))]) end ) in (LrTable.NT 1,(result,ID1left,TY1right),rest671) end | (30,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.CONSTR_LIST(fn _ => let val ID as ID1=ID1 () in ([(symbolMake ID,NONE)]) end ) in (LrTable.NT 1,(result,ID1left,ID1right),rest671) end | (31,(_,(MlyValue.RHS_LIST RHS_LIST1,_,RHS_LIST1right))::_::(_,( MlyValue.ID ID1,ID1left,_))::rest671) => let val result= MlyValue.G_RULE(fn _ => let val ID as ID1=ID1 () val RHS_LIST as RHS_LIST1=RHS_LIST1 () in ( map (fn {rhs,code,prec} => Hdr.RULE {lhs=symbolMake ID,rhs=rhs, code=code,prec=prec}) RHS_LIST ) end ) in (LrTable.NT 9,(result,ID1left,RHS_LIST1right),rest671) end | (32,(_,(MlyValue.G_RULE G_RULE1,_,G_RULE1right))::(_,( MlyValue.G_RULE_LIST G_RULE_LIST1,G_RULE_LIST1left,_))::rest671) => let val result=MlyValue.G_RULE_LIST(fn _ => let val G_RULE_LIST as G_RULE_LIST1=G_RULE_LIST1 () val G_RULE as G_RULE1=G_RULE1 () in (G_RULE@G_RULE_LIST) end ) in (LrTable.NT 10,(result,G_RULE_LIST1left,G_RULE1right),rest671) end | (33,(_,(MlyValue.G_RULE G_RULE1,G_RULE1left,G_RULE1right))::rest671) => let val result=MlyValue.G_RULE_LIST(fn _ => let val G_RULE as G_RULE1=G_RULE1 () in (G_RULE) end ) in (LrTable.NT 10,(result,G_RULE1left,G_RULE1right),rest671) end | (34,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(MlyValue.ID ID1,ID1left,_))::rest671) => let val result=MlyValue.ID_LIST(fn _ => let val ID as ID1=ID1 () val ID_LIST as ID_LIST1=ID_LIST1 () in (symbolMake ID :: ID_LIST) end ) in (LrTable.NT 2,(result,ID1left,ID_LIST1right),rest671) end | (35,rest671) => let val result=MlyValue.ID_LIST(fn _ => (nil)) in (LrTable.NT 2,(result,defaultPos,defaultPos),rest671) end | (36,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.G_RULE_PREC G_RULE_PREC1,_,_))::(_,(MlyValue.ID_LIST ID_LIST1,ID_LIST1left,_)):: rest671) => let val result=MlyValue.RHS_LIST(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () val G_RULE_PREC as G_RULE_PREC1=G_RULE_PREC1 () val PROG as PROG1=PROG1 () in ([{rhs=ID_LIST,code=PROG,prec=G_RULE_PREC}]) end ) in (LrTable.NT 8,(result,ID_LIST1left,PROG1right),rest671) end | (37,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.G_RULE_PREC G_RULE_PREC1,_,_))::(_,(MlyValue.ID_LIST ID_LIST1,_,_))::_::(_,( MlyValue.RHS_LIST RHS_LIST1,RHS_LIST1left,_))::rest671) => let val result=MlyValue.RHS_LIST(fn _ => let val RHS_LIST as RHS_LIST1= RHS_LIST1 () val ID_LIST as ID_LIST1=ID_LIST1 () val G_RULE_PREC as G_RULE_PREC1=G_RULE_PREC1 () val PROG as PROG1=PROG1 () in ({rhs=ID_LIST,code=PROG,prec=G_RULE_PREC}::RHS_LIST) end ) in (LrTable.NT 8,(result,RHS_LIST1left,PROG1right),rest671) end | (38,(_,(MlyValue.TYVAR TYVAR1,TYVAR1left,TYVAR1right))::rest671) => let val result=MlyValue.TY(fn _ => let val TYVAR as TYVAR1=TYVAR1 () in (TYVAR) end ) in (LrTable.NT 16,(result,TYVAR1left,TYVAR1right),rest671) end | (39,(_,(_,_,RBRACE1right))::(_,(MlyValue.RECORD_LIST RECORD_LIST1,_, _))::(_,(_,LBRACE1left,_))::rest671) => let val result=MlyValue.TY(fn _ => let val RECORD_LIST as RECORD_LIST1=RECORD_LIST1 () in ("{ "^RECORD_LIST^" } ") end ) in (LrTable.NT 16,(result,LBRACE1left,RBRACE1right),rest671) end | (40,(_,(_,_,RBRACE1right))::(_,(_,LBRACE1left,_))::rest671) => let val result=MlyValue.TY(fn _ => ("{}")) in (LrTable.NT 16,(result,LBRACE1left,RBRACE1right),rest671) end | (41,(_,(MlyValue.PROG PROG1,PROG1left,PROG1right))::rest671) => let val result=MlyValue.TY(fn _ => let val PROG as PROG1=PROG1 () in (" ( "^PROG^" ) ") end ) in (LrTable.NT 16,(result,PROG1left,PROG1right),rest671) end | (42,(_,(MlyValue.QUAL_ID QUAL_ID1,_,QUAL_ID1right))::(_,(MlyValue.TY TY1,TY1left,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY as TY1=TY1 () val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (TY^" "^QUAL_ID) end ) in (LrTable.NT 16,(result,TY1left,QUAL_ID1right),rest671) end | (43,(_,(MlyValue.QUAL_ID QUAL_ID1,QUAL_ID1left,QUAL_ID1right)):: rest671) => let val result=MlyValue.TY(fn _ => let val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (QUAL_ID) end ) in (LrTable.NT 16,(result,QUAL_ID1left,QUAL_ID1right),rest671) end | (44,(_,(MlyValue.TY TY2,_,TY2right))::_::(_,(MlyValue.TY TY1,TY1left ,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY1=TY1 () val TY2=TY2 () in (TY1^"*"^TY2) end ) in (LrTable.NT 16,(result,TY1left,TY2right),rest671) end | (45,(_,(MlyValue.TY TY2,_,TY2right))::_::(_,(MlyValue.TY TY1,TY1left ,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY1=TY1 () val TY2=TY2 () in (TY1 ^ " -> " ^ TY2) end ) in (LrTable.NT 16,(result,TY1left,TY2right),rest671) end | (46,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.LABEL LABEL1,_ ,_))::_::(_,(MlyValue.RECORD_LIST RECORD_LIST1,RECORD_LIST1left,_)):: rest671) => let val result=MlyValue.RECORD_LIST(fn _ => let val RECORD_LIST as RECORD_LIST1=RECORD_LIST1 () val LABEL as LABEL1=LABEL1 () val TY as TY1=TY1 () in (RECORD_LIST^","^LABEL^":"^TY) end ) in (LrTable.NT 7,(result,RECORD_LIST1left,TY1right),rest671) end | (47,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.LABEL LABEL1, LABEL1left,_))::rest671) => let val result=MlyValue.RECORD_LIST(fn _ => let val LABEL as LABEL1=LABEL1 () val TY as TY1=TY1 () in (LABEL^":"^TY) end ) in (LrTable.NT 7,(result,LABEL1left,TY1right),rest671) end | (48,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.QUAL_ID(fn _ => let val ID as ID1=ID1 () in ((fn (a,_) => a) ID) end ) in (LrTable.NT 6,(result,ID1left,ID1right),rest671) end | (49,(_,(MlyValue.QUAL_ID QUAL_ID1,_,QUAL_ID1right))::(_,( MlyValue.IDDOT IDDOT1,IDDOT1left,_))::rest671) => let val result= MlyValue.QUAL_ID(fn _ => let val IDDOT as IDDOT1=IDDOT1 () val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (IDDOT^QUAL_ID) end ) in (LrTable.NT 6,(result,IDDOT1left,QUAL_ID1right),rest671) end | (50,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.LABEL(fn _ => let val ID as ID1=ID1 () in ((fn (a,_) => a) ID) end ) in (LrTable.NT 3,(result,ID1left,ID1right),rest671) end | (51,(_,(MlyValue.INT INT1,INT1left,INT1right))::rest671) => let val result=MlyValue.LABEL(fn _ => let val INT as INT1=INT1 () in (INT) end ) in (LrTable.NT 3,(result,INT1left,INT1right),rest671) end | (52,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,PREC_TAG1left,_)):: rest671) => let val result=MlyValue.G_RULE_PREC(fn _ => let val ID as ID1=ID1 () in (SOME (symbolMake ID)) end ) in (LrTable.NT 11,(result,PREC_TAG1left,ID1right),rest671) end | (53,rest671) => let val result=MlyValue.G_RULE_PREC(fn _ => (NONE)) in (LrTable.NT 11,(result,defaultPos,defaultPos),rest671) end | _ => raise (mlyAction i392) end val void = MlyValue.VOID val extract = fn a => (fn MlyValue.BEGIN x => x | _ => let exception ParseInternal in raise ParseInternal end) a () end end structure Tokens : Mlyacc_TOKENS = struct type svalue = ParserData.svalue type ('a,'b) token = ('a,'b) Token.token fun ARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( ParserData.MlyValue.VOID,p1,p2)) fun ASTERISK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( ParserData.MlyValue.VOID,p1,p2)) fun BLOCK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( ParserData.MlyValue.VOID,p1,p2)) fun BAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( ParserData.MlyValue.VOID,p1,p2)) fun CHANGE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( ParserData.MlyValue.VOID,p1,p2)) fun COLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( ParserData.MlyValue.VOID,p1,p2)) fun COMMA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( ParserData.MlyValue.VOID,p1,p2)) fun DELIMITER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( ParserData.MlyValue.VOID,p1,p2)) fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( ParserData.MlyValue.VOID,p1,p2)) fun FOR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( ParserData.MlyValue.VOID,p1,p2)) fun HEADER (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( ParserData.MlyValue.HEADER (fn () => i),p1,p2)) fun ID (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( ParserData.MlyValue.ID (fn () => i),p1,p2)) fun IDDOT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( ParserData.MlyValue.IDDOT (fn () => i),p1,p2)) fun PERCENT_HEADER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( ParserData.MlyValue.VOID,p1,p2)) fun INT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( ParserData.MlyValue.INT (fn () => i),p1,p2)) fun KEYWORD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( ParserData.MlyValue.VOID,p1,p2)) fun LPAREN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( ParserData.MlyValue.VOID,p1,p2)) fun NAME (p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( ParserData.MlyValue.VOID,p1,p2)) fun NODEFAULT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( ParserData.MlyValue.VOID,p1,p2)) fun NONTERM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( ParserData.MlyValue.VOID,p1,p2)) fun NOSHIFT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( ParserData.MlyValue.VOID,p1,p2)) fun OF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_EOP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_PURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_POS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_ARG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( ParserData.MlyValue.VOID,p1,p2)) fun PREC (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( ParserData.MlyValue.PREC (fn () => i),p1,p2)) fun PREC_TAG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( ParserData.MlyValue.VOID,p1,p2)) fun PREFER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( ParserData.MlyValue.VOID,p1,p2)) fun PROG (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( ParserData.MlyValue.PROG (fn () => i),p1,p2)) fun RBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( ParserData.MlyValue.VOID,p1,p2)) fun RPAREN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( ParserData.MlyValue.VOID,p1,p2)) fun SUBST (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( ParserData.MlyValue.VOID,p1,p2)) fun START (p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( ParserData.MlyValue.VOID,p1,p2)) fun TERM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( ParserData.MlyValue.VOID,p1,p2)) fun TYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( ParserData.MlyValue.TYVAR (fn () => i),p1,p2)) fun VERBOSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( ParserData.MlyValue.VOID,p1,p2)) fun VALUE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( ParserData.MlyValue.VOID,p1,p2)) fun UNKNOWN (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( ParserData.MlyValue.UNKNOWN (fn () => i),p1,p2)) fun BOGUS_VALUE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( ParserData.MlyValue.VOID,p1,p2)) end end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) structure LrTable : LR_TABLE = struct open Array List infix 9 sub datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype term = T of int datatype nonterm = NT of int datatype state = STATE of int datatype action = SHIFT of state | REDUCE of int (* rulenum from grammar *) | ACCEPT | ERROR exception Goto of state * nonterm type table = {states: int, rules : int,initialState: state, action: ((term,action) pairlist * action) array, goto : (nonterm,state) pairlist array} val numStates = fn ({states,...} : table) => states val numRules = fn ({rules,...} : table) => rules val describeActions = fn ({action,...} : table) => fn (STATE s) => action sub s val describeGoto = fn ({goto,...} : table) => fn (STATE s) => goto sub s fun findTerm (T term,row,default) = let fun find (PAIR (T key,data,r)) = if key < term then find r else if key=term then data else default | find EMPTY = default in find row end fun findNonterm (NT nt,row) = let fun find (PAIR (NT key,data,r)) = if key < nt then find r else if key=nt then SOME data else NONE | find EMPTY = NONE in find row end val action = fn ({action,...} : table) => fn (STATE state,term) => let val (row,default) = action sub state in findTerm(term,row,default) end val goto = fn ({goto,...} : table) => fn (a as (STATE state,nonterm)) => case findNonterm(nonterm,goto sub state) of SOME state => state | NONE => raise (Goto a) val initialState = fn ({initialState,...} : table) => initialState val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} => ({action=actions,goto=gotos, states=numStates, rules=numRules, initialState=initialState} : table) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:43 george * Version 109 * *) (* Stream: a structure implementing a lazy stream. The signature STREAM is found in base.sig *) structure Stream :> STREAM = struct datatype 'a str = EVAL of 'a * 'a str ref | UNEVAL of (unit->'a) type 'a stream = 'a str ref fun get(ref(EVAL t)) = t | get(s as ref(UNEVAL f)) = let val t = (f(), ref(UNEVAL f)) in s := EVAL t; t end fun streamify f = ref(UNEVAL f) fun cons(a,s) = ref(EVAL(a,s)) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/10/03 03:36:58 jhr * Qualified identifiers that are no-longer top-level (quot, rem, min, max). * * Revision 1.2 1996/02/26 15:02:29 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* parser.sml: This is a parser driver for LR tables with an error-recovery routine added to it. The routine used is described in detail in this article: 'A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery', by M. Burke and G. Fisher, ACM Transactions on Programming Langauges and Systems, Vol. 9, No. 2, April 1987, pp. 164-197. This program is an implementation is the partial, deferred method discussed in the article. The algorithm and data structures used in the program are described below. This program assumes that all semantic actions are delayed. A semantic action should produce a function from unit -> value instead of producing the normal value. The parser returns the semantic value on the top of the stack when accept is encountered. The user can deconstruct this value and apply the unit -> value function in it to get the answer. It also assumes that the lexer is a lazy stream. Data Structures: ---------------- * The parser: The state stack has the type (state * (semantic value * line # * line #)) list The parser keeps a queue of (state stack * lexer pair). A lexer pair consists of a terminal * value pair and a lexer. This allows the parser to reconstruct the states for terminals to the left of a syntax error, and attempt to make error corrections there. The queue consists of a pair of lists (x,y). New additions to the queue are cons'ed onto y. The first element of x is the top of the queue. If x is nil, then y is reversed and used in place of x. Algorithm: ---------- * The steady-state parser: This parser keeps the length of the queue of state stacks at a steady state by always removing an element from the front when another element is placed on the end. It has these arguments: stack: current stack queue: value of the queue lexPair ((terminal,value),lex stream) When SHIFT is encountered, the state to shift to and the value are are pushed onto the state stack. The state stack and lexPair are placed on the queue. The front element of the queue is removed. When REDUCTION is encountered, the rule is applied to the current stack to yield a triple (nonterm,value,new stack). A new stack is formed by adding (goto(top state of stack,nonterm),value) to the stack. When ACCEPT is encountered, the top value from the stack and the lexer are returned. When an ERROR is encountered, fixError is called. FixError takes the arguments to the parser, fixes the error if possible and returns a new set of arguments. * The distance-parser: This parser includes an additional argument distance. It pushes elements on the queue until it has parsed distance tokens, or an ACCEPT or ERROR occurs. It returns a stack, lexer, the number of tokens left unparsed, a queue, and an action option. *) signature FIFO = sig type 'a queue val empty : 'a queue exception Empty val get : 'a queue -> 'a * 'a queue val put : 'a * 'a queue -> 'a queue end (* drt (12/15/89) -- the functor should be used in development work, but it wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct structure LrTable = LrTable structure Stream = Stream structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => t=t' end open LrTable open Token val DEBUG1 = false val DEBUG2 = false exception ParseError exception ParseImpossible of int structure Fifo :> FIFO = struct type 'a queue = ('a list * 'a list) val empty = (nil,nil) exception Empty fun get(a::x, y) = (a, (x,y)) | get(nil, nil) = raise Empty | get(nil, y) = get(rev y, nil) fun put(a,(x,y)) = (x,a::y) end type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list type ('a,'b) lexv = ('a,'b) token type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream) type ('a,'b) distanceParse = ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int -> ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int * action option type ('a,'b) ecRecord = {is_keyword : term -> bool, preferred_change : (term list * term list) list, error : string * 'b * 'b -> unit, errtermvalue : term -> 'a, terms : term list, showTerminal : term -> string, noShift : term -> bool} local val print = fn s => TextIO.output(TextIO.stdOut,s) val println = fn s => (print s; print "\n") val showState = fn (STATE s) => "STATE " ^ (Int.toString s) in fun printStack(stack: ('a,'b) stack, n: int) = case stack of (state,_) :: rest => (print("\t" ^ Int.toString n ^ ": "); println(showState state); printStack(rest, n+1)) | nil => () fun prAction showTerminal (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT state => println ("SHIFT " ^ (showState state)) | REDUCE i => println ("REDUCE " ^ (Int.toString i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT") | prAction _ (_,_,action) = () end (* ssParse: parser which maintains the queue of (state * lexvalues) in a steady-state. It takes a table, showTerminal function, saction function, and fixError function. It parses until an ACCEPT is encountered, or an exception is raised. When an error is encountered, fixError is called with the arguments of parseStep (lexv,stack,and queue). It returns the lexv, and a new stack and queue adjusted so that the lexv can be parsed *) val ssParse = fn (table,showTerminal,saction,fixError,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(args as (lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue)) = let val nextAction = action (state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair), queue)) in parseStep(newLexPair,(s,value)::stack,newQueue) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue) | _ => raise (ParseImpossible 197)) | ERROR => parseStep(fixError args) | ACCEPT => (case stack of (_,(topvalue,_,_)) :: _ => let val (token,restLexer) = lexPair in (topvalue,Stream.cons(token,restLexer)) end | _ => raise (ParseImpossible 202)) end | parseStep _ = raise (ParseImpossible 204) in parseStep end (* distanceParse: parse until n tokens are shifted, or accept or error are encountered. Takes a table, showTerminal function, and semantic action function. Returns a parser which takes a lexPair (lex result * lexer), a state stack, a queue, and a distance (must be > 0) to parse. The parser returns a new lex-value, a stack with the nth token shifted on top, a queue, a distance, and action option. *) val distanceParse = fn (table,showTerminal,saction,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE) | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue,distance) = let val nextAction = action(state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer in parseStep(newLexPair,(s,value)::stack, Fifo.put((newStack,newLexPair),queue),distance-1) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue,distance) | _ => raise (ParseImpossible 240)) | ERROR => (lexPair,stack,queue,distance,SOME nextAction) | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction) end | parseStep _ = raise (ParseImpossible 242) in parseStep : ('a,'b) distanceParse end (* mkFixError: function to create fixError function which adjusts parser state so that parse may continue in the presence of an error *) fun mkFixError({is_keyword,terms,errtermvalue, preferred_change,noShift, showTerminal,error,...} : ('a,'b) ecRecord, distanceParse : ('a,'b) distanceParse, minAdvance,maxAdvance) (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) = let val _ = if DEBUG2 then error("syntax error found at " ^ (showTerminal term), leftPos,leftPos) else () fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p)) val minDelta = 3 (* pull all the state * lexv elements from the queue *) val stateList = let fun f q = let val (elem,newQueue) = Fifo.get q in elem :: (f newQueue) end handle Fifo.Empty => nil in f queue end (* now number elements of stateList, giving distance from error token *) val (_, numStateList) = List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList (* Represent the set of potential changes as a linked list. Values of datatype Change hold information about a potential change. oper = oper to be applied pos = the # of the element in stateList that would be altered. distance = the number of tokens beyond the error token which the change allows us to parse. new = new terminal * value pair at that point orig = original terminal * value pair at the point being changed. *) datatype ('a,'b) change = CHANGE of {pos : int, distance : int, leftPos: 'b, rightPos: 'b, new : ('a,'b) lexv list, orig : ('a,'b) lexv list} val showTerms = concat o map (fn TOKEN(t,_) => " " ^ showTerminal t) val printChange = fn c => let val CHANGE {distance,new,orig,pos,...} = c in (print ("{distance= " ^ (Int.toString distance)); print (",orig ="); print(showTerms orig); print (",new ="); print(showTerms new); print (",pos= " ^ (Int.toString pos)); print "}\n") end val printChangeList = app printChange (* parse: given a lexPair, a stack, and the distance from the error token, return the distance past the error token that we are able to parse.*) fun parse (lexPair,stack,queuePos : int) = case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1) of (_,_,_,distance,SOME ACCEPT) => if maxAdvance-distance-1 >= 0 then maxAdvance else maxAdvance-distance-1 | (_,_,_,distance,_) => maxAdvance - distance - 1 (* catList: concatenate results of scanning list *) fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new then minDelta else 0 fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} = let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new val distance = parse(lex',stack,pos+length new-length orig) in if distance >= minAdvance + keywordsDelta new then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos, distance=distance,orig=orig,new=new}] else [] end (* tryDelete: Try to delete n terminals. Return single-element [success] or nil. Do not delete unshiftable terminals. *) fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) = let fun del(0,accum,left,right,lexPair) = tryChange{lex=lexPair,stack=stack, pos=qPos,leftPos=left,rightPos=right, orig=rev accum, new=[]} | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) = if noShift term then [] else del(n-1,tok::accum,left,r,Stream.get lexer) in del(n,[],l,r,lexPair) end (* tryInsert: try to insert tokens before the current terminal; return a list of the successes *) fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) = catList terms (fn t => tryChange{lex=lexPair,stack=stack, pos=queuePos,orig=[],new=[tokAt(t,l)], leftPos=l,rightPos=l}) (* trySubst: try to substitute tokens for the current terminal; return a list of the successes *) fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)), queuePos) = if noShift term then [] else catList terms (fn t => tryChange{lex=Stream.get lexer,stack=stack, pos=queuePos, leftPos=l,rightPos=r,orig=[orig], new=[tokAt(t,r)]}) (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair". If it succeeds, returns SOME(toks',l,r,lp), where toks' is the actual tokens (with positions and values) deleted, (l,r) are the (leftmost,rightmost) position of toks', lp is what remains of the stream after deletion *) fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp) | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then SOME([tok],l,r,Stream.get lp') else NONE | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then case do_delete(rest,Stream.get lp') of SOME(deleted,l',r',lp'') => SOME(tok::deleted,l,r',lp'') | NONE => NONE else NONE fun tryPreferred((stack,lexPair),queuePos) = catList preferred_change (fn (delete,insert) => if List.exists noShift delete then [] (* should give warning at parser-generation time *) else case do_delete(delete,lexPair) of SOME(deleted,l,r,lp) => tryChange{lex=lp,stack=stack,pos=queuePos, leftPos=l,rightPos=r,orig=deleted, new=map (fn t=>(tokAt(t,r))) insert} | NONE => []) val changes = catList numStateList tryPreferred @ catList numStateList tryInsert @ catList numStateList trySubst @ catList numStateList (tryDelete 1) @ catList numStateList (tryDelete 2) @ catList numStateList (tryDelete 3) val findMaxDist = fn l => foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l (* maxDist: max distance past error taken that we could parse *) val maxDist = findMaxDist changes (* remove changes which did not parse maxDist tokens past the error token *) val changes = catList changes (fn(c as CHANGE{distance,...}) => if distance=maxDist then [c] else []) in case changes of (l as change :: _) => let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) = let val s = case (orig,new) of (_::_,[]) => "deleting " ^ (showTerms orig) | ([],_::_) => "inserting " ^ (showTerms new) | _ => "replacing " ^ (showTerms orig) ^ " with " ^ (showTerms new) in error ("syntax error: " ^ s,leftPos,rightPos) end val _ = (if length l > 1 andalso DEBUG2 then (print "multiple fixes possible; could fix it by:\n"; app print_msg l; print "chosen correction:\n") else (); print_msg change) (* findNth: find nth queue entry from the error entry. Returns the Nth queue entry and the portion of the queue from the beginning to the nth-1 entry. The error entry is at the end of the queue. Examples: queue = a b c d e findNth 0 = (e,a b c d) findNth 1 = (d,a b c) *) val findNth = fn n => let fun f (h::t,0) = (h,rev t) | f (h::t,n) = f(t,n-1) | f (nil,_) = let exception FindNth in raise FindNth end in f (rev stateList,n) end val CHANGE {pos,orig,new,...} = change val (last,queueFront) = findNth pos val (stack,lexPair) = last val lp1 = foldl(fn (_,(_,r)) => Stream.get r) lexPair orig val lp2 = foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new val restQueue = Fifo.put((stack,lp2), foldl Fifo.put Fifo.empty queueFront) val (lexPair,stack,queue,_,_) = distanceParse(lp2,stack,restQueue,pos) in (lexPair,stack,queue) end | nil => (error("syntax error found at " ^ (showTerminal term), leftPos,leftPos); raise ParseError) end val parse = fn {arg,table,lexer,saction,void,lookahead, ec=ec as {showTerminal,...} : ('a,'b) ecRecord} => let val distance = 15 (* defer distance tokens *) val minAdvance = 1 (* must parse at least 1 token past error *) val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *) val lexPair = Stream.get lexer val (TOKEN (_,(_,leftPos,_)),_) = lexPair val startStack = [(initialState table,(void,leftPos,leftPos))] val startQueue = Fifo.put((startStack,lexPair),Fifo.empty) val distanceParse = distanceParse(table,showTerminal,saction,arg) val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance) val ssParse = ssParse(table,showTerminal,saction,fixError,arg) fun loop (lexPair,stack,queue,_,SOME ACCEPT) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,distance,SOME ERROR) = let val (lexPair,stack,queue) = fixError(lexPair,stack,queue) in loop (distanceParse(lexPair,stack,queue,distance)) end | loop _ = let exception ParseInternal in raise ParseInternal end in loop (distanceParse(lexPair,startStack,startQueue,distance)) end end; (* drt (12/15/89) -- needed only when the code above is functorized structure LrParser = ParserGen(structure LrTable=LrTable structure Stream=Stream); *) functor LexMLYACC(structure Tokens : Mlyacc_TOKENS structure Hdr : HEADER where type prec = Header.prec and type inputSource = Header.inputSource and type pos = int) : ARG_LEXER = struct structure UserDeclarations = struct (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi yacc.lex: Lexer specification *) structure Tokens = Tokens type svalue = Tokens.svalue type pos = int type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token type lexarg = Hdr.inputSource type arg = lexarg open Tokens val error = Hdr.error val lineno = Hdr.lineno val text = Hdr.text val pcount = ref 0 val commentLevel = ref 0 val actionstart = ref 0 val eof = fn i => (if (!pcount)>0 then error i (!actionstart) " eof encountered in action beginning here !" else (); EOF(!lineno,!lineno)) val Add = fn s => (text := s::(!text)) local val dict = [("%prec",PREC_TAG),("%term",TERM), ("%nonterm",NONTERM), ("%eop",PERCENT_EOP),("%start",START), ("%prefer",PREFER),("%subst",SUBST),("%change",CHANGE), ("%keyword",KEYWORD),("%name",NAME), ("%verbose",VERBOSE), ("%nodefault",NODEFAULT), ("%value",VALUE), ("%noshift",NOSHIFT), ("%header",PERCENT_HEADER),("%pure",PERCENT_PURE), ("%arg",PERCENT_ARG), ("%pos",PERCENT_POS)] in val lookup = fn (s,left,right) => let fun f ((a,d)::b) = if a=s then d(left,right) else f b | f nil = UNKNOWN(s,left,right) in f dict end end fun inc (ri as ref i) = (ri := i+1) fun dec (ri as ref i) = (ri := i-1) end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s0 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s1 = "\015\015\015\015\015\015\015\015\015\015\021\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\019\015\015\017\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015" val s3 = "\022\022\022\022\022\022\022\022\022\065\067\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\065\022\022\022\022\045\022\043\041\022\040\022\039\037\022\022\ \\035\035\035\035\035\035\035\035\035\035\034\022\022\022\022\022\ \\022\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\022\022\022\022\022\ \\022\026\026\026\026\026\031\026\026\026\026\026\026\026\026\029\ \\026\026\026\026\026\026\026\026\026\026\026\025\024\023\022\022\ \\022" val s5 = "\068\068\068\068\068\068\068\068\068\068\021\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\072\068\068\068\068\068\070\069\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068" val s7 = "\073\073\073\073\073\073\073\073\073\075\021\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\075\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\074\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073" val s9 = "\077\077\077\077\077\077\077\077\077\077\021\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\081\080\078\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077" val s11 = "\083\083\083\083\083\083\083\083\083\083\088\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\087\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\084\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083" val s13 = "\089\089\089\089\089\089\089\089\089\089\021\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\093\092\090\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089" val s15 = "\016\016\016\016\016\016\016\016\016\016\000\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\000\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016" val s17 = "\016\016\016\016\016\016\016\016\016\016\000\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\000\016\016\016\016\018\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016" val s19 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s26 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s29 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\030\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s31 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\032\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s32 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\033\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s35 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\036\036\036\036\036\036\036\036\036\036\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s37 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\038\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s41 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\042\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s43 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\044\000\000\000\000\000\000\000\000\ \\044\044\044\044\044\044\044\044\044\044\000\000\000\000\000\000\ \\000\044\044\044\044\044\044\044\044\044\044\044\044\044\044\044\ \\044\044\044\044\044\044\044\044\044\044\044\000\000\000\000\044\ \\000\044\044\044\044\044\044\044\044\044\044\044\044\044\044\044\ \\044\044\044\044\044\044\044\044\044\044\044\000\000\000\000\000\ \\000" val s45 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\064\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\060\046\052\046\ \\046\046\047\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s46 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s47 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\048\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s48 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\049\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s49 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\050\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s50 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\051\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s52 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\053\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s53 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\054\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s54 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\055\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s55 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\056\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s56 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\057\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s57 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\058\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s58 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\059\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s60 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\061\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s61 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\062\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s62 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\063\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s65 = "\000\000\000\000\000\000\000\000\000\066\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\066\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s68 = "\068\068\068\068\068\068\068\068\068\068\000\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\000\068\068\068\068\068\000\000\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068" val s70 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\071\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s75 = "\000\000\000\000\000\000\000\000\000\076\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\076\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s77 = "\077\077\077\077\077\077\077\077\077\077\000\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\000\000\000\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077" val s78 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\079\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s81 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\082\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s83 = "\083\083\083\083\083\083\083\083\083\083\000\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\000\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\000\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083" val s84 = "\000\000\000\000\000\000\000\000\000\086\086\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\086\000\085\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s89 = "\089\089\089\089\089\089\089\089\089\089\000\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\000\000\000\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089" val s90 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\091\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s93 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\094\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" in Vector.fromList [{fin = [], trans = s0}, {fin = [], trans = s1}, {fin = [], trans = s1}, {fin = [], trans = s3}, {fin = [], trans = s3}, {fin = [], trans = s5}, {fin = [], trans = s5}, {fin = [], trans = s7}, {fin = [], trans = s7}, {fin = [], trans = s9}, {fin = [], trans = s9}, {fin = [], trans = s11}, {fin = [], trans = s11}, {fin = [], trans = s13}, {fin = [], trans = s13}, {fin = [(N 11),(N 18)], trans = s15}, {fin = [(N 11)], trans = s15}, {fin = [(N 11),(N 18)], trans = s17}, {fin = [(N 2),(N 11)], trans = s15}, {fin = [(N 18)], trans = s19}, {fin = [(N 14)], trans = s0}, {fin = [(N 16)], trans = s0}, {fin = [(N 94)], trans = s0}, {fin = [(N 36),(N 94)], trans = s0}, {fin = [(N 87),(N 94)], trans = s0}, {fin = [(N 34),(N 94)], trans = s0}, {fin = [(N 90),(N 94)], trans = s26}, {fin = [(N 90)], trans = s26}, {fin = [(N 77)], trans = s0}, {fin = [(N 90),(N 94)], trans = s29}, {fin = [(N 28),(N 90)], trans = s26}, {fin = [(N 90),(N 94)], trans = s31}, {fin = [(N 90)], trans = s32}, {fin = [(N 32),(N 90)], trans = s26}, {fin = [(N 85),(N 94)], trans = s0}, {fin = [(N 80),(N 94)], trans = s35}, {fin = [(N 80)], trans = s35}, {fin = [(N 94)], trans = s37}, {fin = [(N 43)], trans = s0}, {fin = [(N 38),(N 94)], trans = s0}, {fin = [(N 40),(N 94)], trans = s0}, {fin = [(N 92),(N 94)], trans = s41}, {fin = [(N 5)], trans = s0}, {fin = [(N 73),(N 94)], trans = s43}, {fin = [(N 73)], trans = s43}, {fin = [(N 94)], trans = s45}, {fin = [(N 70)], trans = s46}, {fin = [(N 70)], trans = s47}, {fin = [(N 70)], trans = s48}, {fin = [(N 70)], trans = s49}, {fin = [(N 70)], trans = s50}, {fin = [(N 56),(N 70)], trans = s46}, {fin = [(N 70)], trans = s52}, {fin = [(N 70)], trans = s53}, {fin = [(N 70)], trans = s54}, {fin = [(N 70)], trans = s55}, {fin = [(N 70)], trans = s56}, {fin = [(N 70)], trans = s57}, {fin = [(N 70)], trans = s58}, {fin = [(N 66),(N 70)], trans = s46}, {fin = [(N 70)], trans = s60}, {fin = [(N 70)], trans = s61}, {fin = [(N 70)], trans = s62}, {fin = [(N 49),(N 70)], trans = s46}, {fin = [(N 83)], trans = s0}, {fin = [(N 25),(N 94)], trans = s65}, {fin = [(N 25)], trans = s65}, {fin = [(N 20)], trans = s0}, {fin = [(N 103)], trans = s68}, {fin = [(N 98)], trans = s0}, {fin = [(N 96)], trans = s70}, {fin = [(N 8)], trans = s0}, {fin = [(N 100)], trans = s0}, {fin = [(N 147)], trans = s0}, {fin = [(N 145),(N 147)], trans = s0}, {fin = [(N 143),(N 147)], trans = s75}, {fin = [(N 143)], trans = s75}, {fin = [(N 114)], trans = s77}, {fin = [(N 105)], trans = s78}, {fin = [(N 108)], trans = s0}, {fin = [(N 105)], trans = s0}, {fin = [(N 105)], trans = s81}, {fin = [(N 111)], trans = s0}, {fin = [(N 134)], trans = s83}, {fin = [(N 129)], trans = s84}, {fin = [(N 137)], trans = s0}, {fin = [(N 140)], trans = s0}, {fin = [(N 127)], trans = s0}, {fin = [(N 131)], trans = s0}, {fin = [(N 125)], trans = s89}, {fin = [(N 116)], trans = s90}, {fin = [(N 119)], trans = s0}, {fin = [(N 116)], trans = s0}, {fin = [(N 116)], trans = s93}, {fin = [(N 122)], trans = s0}] end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val A = STARTSTATE 3; val CODE = STARTSTATE 5; val COMMENT = STARTSTATE 9; val EMPTYCOMMENT = STARTSTATE 13; val F = STARTSTATE 7; val INITIAL = STARTSTATE 1; val STRING = STARTSTATE 11; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end fun makeLexer yyinput = let val yyb = ref "\n" (* buffer *) val yybl = ref 1 (*buffer length *) val yybufpos = ref 1 (* location of next character to use *) val yygone = ref 1 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex (yyarg as (inputSource)) = let fun continue() : Internal.result = let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0) = let fun action (i,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let val yytext = substring(!yyb,i0,i-i0) val yypos = i0+ !yygone open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 100 => (Add yytext; YYBEGIN STRING; continue()) | 103 => (Add yytext; continue()) | 105 => (Add yytext; continue()) | 108 => (Add yytext; dec commentLevel; if !commentLevel=0 then BOGUS_VALUE(!lineno,!lineno) else continue() ) | 11 => (Add yytext; continue()) | 111 => (Add yytext; inc commentLevel; continue()) | 114 => (Add yytext; continue()) | 116 => (continue()) | 119 => (dec commentLevel; if !commentLevel=0 then YYBEGIN A else (); continue ()) | 122 => (inc commentLevel; continue()) | 125 => (continue()) | 127 => (Add yytext; YYBEGIN CODE; continue()) | 129 => (Add yytext; continue()) | 131 => (Add yytext; error inputSource (!lineno) "unclosed string"; inc lineno; YYBEGIN CODE; continue()) | 134 => (Add yytext; continue()) | 137 => (Add yytext; continue()) | 14 => (YYBEGIN A; HEADER (concat (rev (!text)),!lineno,!lineno)) | 140 => (Add yytext; if substring(yytext,1,1)="\n" then inc lineno else (); YYBEGIN F; continue()) | 143 => (Add yytext; continue()) | 145 => (Add yytext; YYBEGIN STRING; continue()) | 147 => (Add yytext; error inputSource (!lineno) "unclosed string"; YYBEGIN CODE; continue()) | 16 => (Add yytext; inc lineno; continue()) | 18 => (Add yytext; continue()) | 2 => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN INITIAL) | 20 => (inc lineno; continue ()) | 25 => (continue()) | 28 => (OF(!lineno,!lineno)) | 32 => (FOR(!lineno,!lineno)) | 34 => (LBRACE(!lineno,!lineno)) | 36 => (RBRACE(!lineno,!lineno)) | 38 => (COMMA(!lineno,!lineno)) | 40 => (ASTERISK(!lineno,!lineno)) | 43 => (ARROW(!lineno,!lineno)) | 49 => (PREC(Hdr.LEFT,!lineno,!lineno)) | 5 => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue()) | 56 => (PREC(Hdr.RIGHT,!lineno,!lineno)) | 66 => (PREC(Hdr.NONASSOC,!lineno,!lineno)) | 70 => (lookup(yytext,!lineno,!lineno)) | 73 => (TYVAR(yytext,!lineno,!lineno)) | 77 => (IDDOT(yytext,!lineno,!lineno)) | 8 => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN CODE) | 80 => (INT (yytext,!lineno,!lineno)) | 83 => (DELIMITER(!lineno,!lineno)) | 85 => (COLON(!lineno,!lineno)) | 87 => (BAR(!lineno,!lineno)) | 90 => (ID ((yytext,!lineno),!lineno,!lineno)) | 92 => (pcount := 1; actionstart := (!lineno); text := nil; YYBEGIN CODE; continue() before YYBEGIN A) | 94 => (UNKNOWN(yytext,!lineno,!lineno)) | 96 => (inc pcount; Add yytext; continue()) | 98 => (dec pcount; if !pcount = 0 then PROG (concat (rev (!text)),!lineno,!lineno) else (Add yytext; continue())) | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof yyarg else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(String.sub(!yyb,l)) val NewState = if NewChar<128 then Char.ord(String.sub(trans,NewChar)) else Char.ord(String.sub(trans,128)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end in continue end in lex end end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* functor Join creates a user parser by putting together a Lexer structure, an LrValues structure, and a polymorphic parser structure. Note that the Lexer and LrValues structure must share the type pos (i.e. the type of line numbers), the type svalues for semantic values, and the type of tokens. *) functor Join(structure Lex : LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = LrParser.Stream.streamify o Lex.makeLexer val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end (* functor JoinWithArg creates a variant of the parser structure produced above. In this case, the makeLexer take an additional argument before yielding a value of type unit -> (svalue,pos) token *) functor JoinWithArg(structure Lex : ARG_LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : ARG_PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type lexarg = Lex.UserDeclarations.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = fn s => fn arg => LrParser.Stream.streamify (Lex.makeLexer s arg) val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:38 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor ParseGenParserFun(S : sig structure Parser : ARG_PARSER structure Header : HEADER sharing type Parser.pos = Header.pos sharing type Parser.result = Header.parseResult sharing type Parser.arg = Header.inputSource = Parser.lexarg end where type Header.pos = int ) : PARSE_GEN_PARSER = struct open S structure Header = Header val parse = fn file => let val in_str = TextIO.openIn file val source = Header.newSource(file,in_str,TextIO.stdOut) val error = fn (s : string,i:int,_) => Header.error source i s val stream = Parser.makeLexer (fn i => (TextIO.inputN(in_str,i))) source val (result,_) = (Header.lineno := 1; Header.text := nil; Parser.parse(15,stream,error,source)) in (TextIO.closeIn in_str; (result,source)) end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:47 george * Version 109 * *) (* Implementation of ordered sets using ordered lists and red-black trees. The code for red-black trees was originally written by Norris Boyd, which was modified for use here. *) (* ordered sets implemented using ordered lists. Upper bound running times for functions implemented here: app = O(n) card = O(n) closure = O(n^2) difference = O(n+m), where n,m = the size of the two sets used here. empty = O(1) exists = O(n) find = O(n) fold = O(n) insert = O(n) is_empty = O(1) make_list = O(1) make_set = O(n^2) partition = O(n) remove = O(n) revfold = O(n) select_arb = O(1) set_eq = O(n), where n = the cardinality of the smaller set set_gt = O(n), ditto singleton = O(1) union = O(n+m) *) functor ListOrdSet(B : sig type elem val gt : elem * elem -> bool val eq : elem * elem -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq type set = elem list exception Select_arb val empty = nil val insert = fn (key,s) => let fun f (l as (h::t)) = if elem_gt(key,h) then h::(f t) else if elem_eq(key,h) then key::t else key::l | f nil = [key] in f s end val select_arb = fn nil => raise Select_arb | a::b => a val exists = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else elem_eq(h,key) | f nil = false in f s end val find = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else if elem_eq(h,key) then SOME h else NONE | f nil = NONE in f s end fun revfold f lst init = List.foldl f init lst fun fold f lst init = List.foldr f init lst val app = List.app fun set_eq(h::t,h'::t') = (case elem_eq(h,h') of true => set_eq(t,t') | a => a) | set_eq(nil,nil) = true | set_eq _ = false fun set_gt(h::t,h'::t') = (case elem_gt(h,h') of false => (case (elem_eq(h,h')) of true => set_gt(t,t') | a => a) | a => a) | set_gt(_::_,nil) = true | set_gt _ = false fun union(a as (h::t),b as (h'::t')) = if elem_gt(h',h) then h::union(t,b) else if elem_eq(h,h') then h::union(t,t') else h'::union(a,t') | union(nil,s) = s | union(s,nil) = s val make_list = fn s => s val is_empty = fn nil => true | _ => false val make_set = fn l => List.foldr insert [] l val partition = fn f => fn s => fold (fn (e,(yes,no)) => if (f e) then (e::yes,no) else (e::no,yes)) s (nil,nil) val remove = fn (e,s) => let fun f (l as (h::t)) = if elem_gt(h,e) then l else if elem_eq(h,e) then t else h::(f t) | f nil = nil in f s end (* difference: X-Y *) fun difference (nil,_) = nil | difference (r,nil) = r | difference (a as (h::t),b as (h'::t')) = if elem_gt (h',h) then h::difference(t,b) else if elem_eq(h',h) then difference(t,t') else difference(a,t') fun singleton X = [X] fun card(S) = fold (fn (a,count) => count+1) S 0 local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end (* ordered set implemented using red-black trees: Upper bound running time of the functions below: app: O(n) card: O(n) closure: O(n^2 ln n) difference: O(n ln n) empty: O(1) exists: O(ln n) find: O(ln n) fold: O(n) insert: O(ln n) is_empty: O(1) make_list: O(n) make_set: O(n ln n) partition: O(n ln n) remove: O(n ln n) revfold: O(n) select_arb: O(1) set_eq: O(n) set_gt: O(n) singleton: O(1) union: O(n ln n) *) functor RbOrdSet (B : sig type elem val eq : (elem*elem) -> bool val gt : (elem*elem) -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq datatype Color = RED | BLACK abstype set = EMPTY | TREE of (B.elem * Color * set * set) with exception Select_arb val empty = EMPTY fun insert(key,t) = let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if elem_gt (key,k) then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if elem_gt(k,key) then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(key,BLACK,l,r) | f (TREE(k,RED,l,r)) = if elem_gt(key,k) then TREE(k,RED,l, f r) else if elem_gt(k,key) then TREE(k,RED, f l, r) else TREE(key,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun select_arb (TREE(k,_,l,r)) = k | select_arb EMPTY = raise Select_arb fun exists(key,t) = let fun look EMPTY = false | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else SOME k in look t end fun revfold f t start = let fun scan (EMPTY,value) = value | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value))) in scan(t,start) end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun app f t = let fun scan EMPTY = () | scan(TREE(k,_,l,r)) = (scan l; f k; scan r) in scan t end (* equal_tree : test if two trees are equal. Two trees are equal if the set of leaves are equal *) fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = true | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_eq(v1,v2)) andalso f(news1,news2) end | f _ = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end | set_eq (EMPTY,EMPTY) = true | set_eq _ = false (* gt_tree : Test if tree1 is greater than tree 2 *) fun set_gt (tree1,tree2) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = false | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2)) end | f (_,nil) = true | f (nil,_) = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end fun is_empty S = (let val _ = select_arb S in false end handle Select_arb => true) fun make_list S = fold (op ::) S nil fun make_set l = List.foldr insert empty l fun partition F S = fold (fn (a,(Yes,No)) => if F(a) then (insert(a,Yes),No) else (Yes,insert(a,No))) S (empty,empty) fun remove(X, XSet) = let val (YSet, _) = partition (fn a => not (elem_eq (X, a))) XSet in YSet end fun difference(Xs, Ys) = fold (fn (p as (a,Xs')) => if exists(a,Ys) then Xs' else insert p) Xs empty fun singleton X = insert(X,empty) fun card(S) = fold (fn (_,count) => count+1) S 0 fun union(Xs,Ys)= fold insert Ys Xs local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end end (* signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end *) functor Table (B : sig type key val gt : (key * key) -> bool end ) : TABLE = struct datatype Color = RED | BLACK type key = B.key abstype 'a table = EMPTY | TREE of ((B.key * 'a ) * Color * 'a table * 'a table) with val empty = EMPTY fun insert(elem as (key,data),t) = let val key_gt = fn (a,_) => B.gt(key,a) val key_lt = fn (a,_) => B.gt(a,key) fun f EMPTY = TREE(elem,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if key_gt k then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if key_lt k then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(elem,BLACK,l,r) | f (TREE(k,RED,l,r)) = if key_gt k then TREE(k,RED,l, f r) else if key_lt k then TREE(k,RED, f l, r) else TREE(elem,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun exists(key,t) = let fun look EMPTY = false | look (TREE((k,_),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE((k,data),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else SOME data in look t end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun make_table l = List.foldr insert empty l fun size S = fold (fn (_,count) => count+1) S 0 fun make_list table = fold (op ::) table nil end end; (* assumes that a functor Table with signature TABLE from table.sml is in the environment *) (* signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end *) (* hash: creates a hash table of size n which assigns each distinct member a unique integer between 0 and n-1 *) functor Hash(B : sig type elem val gt : elem * elem -> bool end) : HASH = struct type elem=B.elem structure HashTable = Table(type key=B.elem val gt = B.gt) type table = {count : int, table : int HashTable.table} val empty = {count=0,table=HashTable.empty} val size = fn {count,table} => count val add = fn (e,{count,table}) => {count=count+1,table=HashTable.insert((e,count),table)} val find = fn (e,{table,count}) => HashTable.find(e,table) val exists = fn (e,{table,count}) => HashTable.exists(e,table) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:31 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) functor mkCore(structure IntGrammar : INTGRAMMAR) : CORE = struct open IntGrammar open Grammar structure IntGrammar = IntGrammar structure Grammar = Grammar datatype item = ITEM of { rule : rule, dot : int, rhsAfter : symbol list } val eqItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n=m andalso d=e val gtItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n>m orelse (n=m andalso d>e) structure ItemList = ListOrdSet (struct type elem = item val eq = eqItem val gt = gtItem end) open ItemList datatype core = CORE of item list * int val gtCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_gt(a,b) val eqCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_eq(a,b) (* functions for printing and debugging *) val prItem = fn (symbolToString,nontermToString,print) => let val printInt = print o (Int.toString : int -> string) val prSymbol = print o symbolToString val prNonterm = print o nontermToString fun showRest nil = () | showRest (h::t) = (prSymbol h; print " "; showRest t) fun showRhs (l,0) = (print ". "; showRest l) | showRhs (nil,_) = () | showRhs (h::t,n) = (prSymbol h; print " "; showRhs(t,n-1)) in fn (ITEM {rule=RULE {lhs,rhs,rulenum,num,...}, dot,rhsAfter,...}) => (prNonterm lhs; print " : "; showRhs(rhs,dot); case rhsAfter of nil => (print " (reduce by rule "; printInt rulenum; print ")") | _ => (); if DEBUG then (print " (num "; printInt num; print ")") else ()) end val prCore = fn a as (_,_,print) => let val prItem = prItem a in fn (CORE (items,state)) => (print "state "; print (Int.toString state); print ":\n\n"; app (fn i => (print "\t"; prItem i; print "\n")) items; print "\n") end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkCoreUtils(structure Core : CORE) : CORE_UTILS = struct open Array List infix 9 sub val DEBUG = true structure Core = Core structure IntGrammar = Core.IntGrammar structure Grammar = IntGrammar.Grammar open Grammar IntGrammar Core structure Assoc = SymbolAssoc structure NtList = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn (GRAMMAR {rules,terms,nonterms,...}) => let val derives=array(nonterms,nil : rule list) (* sort rules by their lhs nonterminal by placing them in an array indexed in their lhs nonterminal *) val _ = let val f = fn {lhs=lhs as (NT n), rhs, precedence,rulenum} => let val rule=RULE{lhs=lhs,rhs=rhs,precedence=precedence, rulenum=rulenum,num=0} in update(derives,n,rule::(derives sub n)) end in app f rules end (* renumber rules so that rule numbers increase monotonically with the number of their lhs nonterminal, and so that rules are numbered sequentially. **Functions below assume that this number is true**, i.e. productions for nonterm i are numbered from j to k, productions for nonterm i+1 are numbered from k+1 to m, and productions for nonterm 0 start at 0 *) val _ = let val f = fn (RULE{lhs,rhs,precedence,rulenum,num}, (l,i)) => (RULE{lhs=lhs,rhs=rhs, precedence=precedence, rulenum=rulenum, num=i}::l,i+1) fun g(i,num) = if i if DEBUG andalso (n<0 orelse n>=nonterms) then let exception Produces of int in raise (Produces n) end else derives sub n val memoize = fn f => let fun loop i = if i = nonterms then nil else f (NT i) :: (loop (i+1)) val data = Array.fromList(loop 0) in fn (NT i) => data sub i end (* compute nonterminals which must be added to a closure when a given nonterminal is added, i.e all nonterminals C for each nonterminal A such that A =*=> Cx *) val nontermClosure = let val collectNonterms = fn n => List.foldr (fn (r,l) => case r of RULE {rhs=NONTERM n :: _,...} => NtList.insert(n,l) | _ => l) NtList.empty (produces n) val closureNonterm = fn n => NtList.closure(NtList.singleton n, collectNonterms) in memoize closureNonterm end (* ntShifts: Take the items produced by a nonterminal, and sort them by their first symbol. For each first symbol, make sure the item list associated with the symbol is sorted also. ** This function assumes that the item list returned by produces is sorted ** Create a table of item lists keyed by symbols. Scan the list of items produced by a nonterminal, and insert those with a first symbol on to the beginning of the item list for that symbol, creating a list if necessary. Since produces returns an item list that is already in order, the list for each symbol will also end up in order. *) fun sortItems nt = let fun add_item (a as RULE{rhs=symbol::rest,...},r) = let val item = ITEM{rule=a,dot=1,rhsAfter=rest} in Assoc.insert((symbol,case Assoc.find (symbol,r) of SOME l => item::l | NONE => [item]),r) end | add_item (_,r) = r in List.foldr add_item Assoc.empty (produces nt) end val ntShifts = memoize sortItems (* getNonterms: get the nonterminals with a . before them in a core. Returns a list of nonterminals in ascending order *) fun getNonterms l = List.foldr (fn (ITEM {rhsAfter=NONTERM sym ::_, ...},r) => NtList.insert(sym,r) | (_,r) => r) [] l (* closureNonterms: compute the nonterminals that would have a . before them in the closure of the core. Returns a list of nonterminals in ascending order *) fun closureNonterms a = let val nonterms = getNonterms a in List.foldr (fn (nt,r) => NtList.union(nontermClosure nt,r)) nonterms nonterms end (* shifts: compute the core sets that result from shift/gotoing on the closure of a kernal set. The items in core sets are sorted, of course. (1) compute the core sets that result just from items added through the closure operation. (2) then add the shift/gotos on kernal items. We can do (1) the following way. Keep a table which for each shift/goto symbol gives the list of items that result from shifting or gotoing on the symbol. Compute the nonterminals that would have dots before them in the closure of the kernal set. For each of these nonterminals, we already have an item list in sorted order for each possible shift symbol. Scan the nonterminal list from back to front. For each nonterminal, prepend the shift/goto list for each shift symbol to the list already in the table. We end up with the list of items in correct order for each shift/goto symbol. We have kept the item lists in order, scanned the nonterminals from back to front (=> that the items end up in ascending order), and never had any duplicate items (each item is derived from only one nonterminal). *) fun shifts (CORE (itemList,_)) = let (* mergeShiftItems: add an item list for a shift/goto symbol to the table *) fun mergeShiftItems (args as ((k,l),r)) = case Assoc.find(k,r) of NONE => Assoc.insert args | SOME old => Assoc.insert ((k,l@old),r) (* mergeItems: add all items derived from a nonterminal to the table. We've kept these items sorted by their shift/goto symbol (the first symbol on their rhs) *) fun mergeItems (n,r) = Assoc.fold mergeShiftItems (ntShifts n) r (* nonterms: a list of nonterminals that are in a core after the closure operation *) val nonterms = closureNonterms itemList (* now create a table which for each shift/goto symbol gives the sorted list of closure items which would result from first taking all the closure items and then sorting them by the shift/goto symbols *) val newsets = List.foldr mergeItems Assoc.empty nonterms (* finally prepare to insert the kernal items of a core *) fun insertItem ((k,i),r) = case (Assoc.find(k,r)) of NONE => Assoc.insert((k,[i]),r) | SOME l => Assoc.insert((k,Core.insert(i,l)),r) fun shiftCores(ITEM{rule,dot,rhsAfter=symbol::rest},r) = insertItem((symbol, ITEM{rule=rule,dot=dot+1,rhsAfter=rest}),r) | shiftCores(_,r) = r (* insert the kernal items of a core *) val newsets = List.foldr shiftCores newsets itemList in Assoc.make_list newsets end (* nontermEpsProds: returns a list of epsilon productions produced by a nonterminal sorted by rule number. ** Depends on produces returning an ordered list **. It does not alter the order in which the rules were returned by produces; it only removes non-epsilon productions *) val nontermEpsProds = let val f = fn nt => List.foldr (fn (rule as RULE {rhs=nil,...},results) => rule :: results | (_,results) => results) [] (produces nt) in memoize f end (* epsProds: take a core and compute a list of epsilon productions for it sorted by rule number. ** Depends on closureNonterms returning a list of nonterminals sorted by nonterminal #, rule numbers increasing monotonically with their lhs production #, and nontermEpsProds returning an ordered item list for each production *) fun epsProds (CORE (itemList,state)) = let val prods = map nontermEpsProds (closureNonterms itemList) in List.concat prods end in {produces=produces,shifts=shifts,rules=rules,epsProds=epsProds} end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:34 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkGraph(structure IntGrammar : INTGRAMMAR structure Core : CORE structure CoreUtils : CORE_UTILS sharing IntGrammar = Core.IntGrammar = CoreUtils.IntGrammar sharing CoreUtils.Core = Core ) : LRGRAPH = struct open Array List infix 9 sub structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Core Core.Grammar CoreUtils IntGrammar structure NodeSet = RbOrdSet (struct type elem = core val eq = eqCore val gt = gtCore end) open NodeSet exception Shift of int * symbol type graph = {edges: {edge:symbol,to:core} list array, nodes: core list,nodeArray : core array} val edges = fn (CORE (_,i),{edges,...}:graph) => edges sub i val nodes = fn ({nodes,...} : graph) => nodes val shift = fn ({edges,nodes,...} : graph) => fn a as (i,sym) => let fun find nil = raise (Shift a) | find ({edge,to=CORE (_,state)} :: r) = if gtSymbol(sym,edge) then find r else if eqSymbol(edge,sym) then state else raise (Shift a) in find (edges sub i) end val core = fn ({nodeArray,...} : graph) => fn i => nodeArray sub i val mkGraph = fn (g as (GRAMMAR {start,...})) => let val {shifts,produces,rules,epsProds} = CoreUtils.mkFuncs g fun add_goto ((symbol,a),(nodes,edges,future,num)) = case find(CORE (a,0),nodes) of NONE => let val core =CORE (a,num) val edge = {edge=symbol,to=core} in (insert(core,nodes),edge::edges, core::future,num+1) end | (SOME c) => let val edge={edge=symbol,to=c} in (nodes,edge::edges,future,num) end fun f (nodes,node_list,edge_list,nil,nil,num) = let val nodes=rev node_list in {nodes=nodes, edges=Array.fromList (rev edge_list), nodeArray = Array.fromList nodes } end | f (nodes,node_list,edge_list,nil,y,num) = f (nodes,node_list,edge_list,rev y,nil,num) | f (nodes,node_list,edge_list,h::t,y,num) = let val (nodes,edges,future,num) = List.foldr add_goto (nodes,[],y,num) (shifts h) in f (nodes,h::node_list, edges::edge_list,t,future,num) end in {graph= let val makeItem = fn (r as (RULE {rhs,...})) => ITEM{rule=r,dot=0,rhsAfter=rhs} val initialItemList = map makeItem (produces start) val orderedItemList = List.foldr Core.insert [] initialItemList val initial = CORE (orderedItemList,0) in f(empty,nil,nil,[initial],nil,1) end, produces=produces, rules=rules, epsProds=epsProds} end val prGraph = fn a as (nontermToString,termToString,print) => fn g => let val printCore = prCore a val printSymbol = print o nontermToString val nodes = nodes g val printEdges = fn n => List.app (fn {edge,to=CORE (_,state)} => (print "\tshift on "; printSymbol edge; print " to "; print (Int.toString state); print "\n")) (edges (n,g)) in List.app (fn c => (printCore c; print "\n"; printEdges c)) nodes end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkLook (structure IntGrammar : INTGRAMMAR) : LOOK = struct open Array List infix 9 sub structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Grammar IntGrammar structure TermSet = ListOrdSet (struct type elem = term val eq = eqTerm val gt = gtTerm end) val union = TermSet.union val make_set = TermSet.make_set val prLook = fn (termToString,print) => let val printTerm = print o termToString fun f nil = print " " | f (a :: b) = (printTerm a; print " "; f b) in f end structure NontermSet = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn {rules : rule list, nonterms : int, produces : nonterm -> rule list} => let (* nullable: create a function which tells if a nonterminal is nullable or not. Method: Keep an array of booleans. The nth entry is true if NT i is nullable. If is false if we don't know whether NT i is nullable. Keep a list of rules whose remaining rhs we must prove to be null. First, scan the list of rules and remove those rules whose rhs contains a terminal. These rules are not nullable. Now iterate through the rules that were left: (1) if there is no remaining rhs we have proved that the rule is nullable, mark the nonterminal for the rule as nullable (2) if the first element of the remaining rhs is nullable, place the rule back on the list with the rest of the rhs (3) if we don't know whether the nonterminal is nullable, place it back on the list (4) repeat until the list does not change. We have found all the possible nullable rules. *) val nullable = let fun ok_rhs nil = true | ok_rhs ((TERM _)::_) = false | ok_rhs ((NONTERM i)::r) = ok_rhs r fun add_rule (RULE {lhs,rhs,...},r) = if ok_rhs rhs then (lhs,map (fn (NONTERM (NT i)) => i) rhs)::r else r val items = List.foldr add_rule [] rules val nullable = array(nonterms,false) val f = fn ((NT i,nil),(l,_)) => (update(nullable,i,true); (l,true)) | (a as (lhs,(h::t)),(l,change)) => case (nullable sub h) of false => (a::l,change) | true => ((lhs,t)::l,true) fun prove(l,true) = prove(List.foldr f (nil,false) l) | prove(_,false) = () in (prove(items,true); fn (NT i) => nullable sub i) end (* scanRhs : look at a list of symbols, scanning past nullable nonterminals, applying addSymbol to the symbols scanned *) fun scanRhs addSymbol = let fun f (nil,result) = result | f ((sym as NONTERM nt) :: rest,result) = if nullable nt then f (rest,addSymbol(sym,result)) else addSymbol(sym,result) | f ((sym as TERM _) :: _,result) = addSymbol(sym,result) in f end (* accumulate: look at the start of the right-hand-sides of rules, looking past nullable nonterminals, applying addObj to the visible symbols. *) fun accumulate(rules, empty, addObj) = List.foldr (fn (RULE {rhs,...},r) =>(scanRhs addObj) (rhs,r)) empty rules val nontermMemo = fn f => let val lookup = array(nonterms,nil) fun g i = if i=nonterms then () else (update(lookup,i,f (NT i)); g (i+1)) in (g 0; fn (NT j) => lookup sub j) end (* first1: the FIRST set of a nonterminal in the grammar. Only looks at other terminals, but it is clever enough to move past nullable nonterminals at the start of a production. *) fun first1 nt = accumulate(produces nt, TermSet.empty, fn (TERM t, set) => TermSet.insert (t,set) | (_, set) => set) val first1 = nontermMemo(first1) (* starters1: given a nonterminal "nt", return the set of nonterminals which can start its productions. Looks past nullables, but doesn't recurse *) fun starters1 nt = accumulate(produces nt, nil, fn (NONTERM nt, set) => NontermSet.insert(nt,set) | (_, set) => set) val starters1 = nontermMemo(starters1) (* first: maps a nonterminal to its first-set. Get all the starters of the nonterminal, get the first1 terminal set of each of these, union the whole lot together *) fun first nt = List.foldr (fn (a,r) => TermSet.union(r,first1 a)) [] (NontermSet.closure (NontermSet.singleton nt, starters1)) val first = nontermMemo(first) (* prefix: all possible terminals starting a symbol list *) fun prefix symbols = scanRhs (fn (TERM t,r) => TermSet.insert(t,r) | (NONTERM nt,r) => TermSet.union(first nt,r)) (symbols,nil) fun nullable_string ((TERM t) :: r) = false | nullable_string ((NONTERM nt) :: r) = (case (nullable nt) of true => nullable_string r | f => f) | nullable_string nil = true in {nullable = nullable, first = prefix} end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/10/03 03:37:12 jhr * Qualified identifiers that are no-longer top-level (quot, rem, min, max). * * Revision 1.2 1996/02/26 15:02:35 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkLalr ( structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH structure Look: LOOK sharing Graph.Core = Core sharing Graph.IntGrammar = Core.IntGrammar = Look.IntGrammar = IntGrammar) : LALR_GRAPH = struct open Array List infix 9 sub open IntGrammar.Grammar IntGrammar Core Graph Look structure Graph = Graph structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar datatype tmpcore = TMPCORE of (item * term list ref) list * int datatype lcore = LCORE of (item * term list) list * int val prLcore = fn a as (SymbolToString,nontermToString,termToString,print) => let val printItem = prItem (SymbolToString,nontermToString,print) val printLookahead = prLook(termToString,print) in fn (LCORE (items,state)) => (print "\n"; print "state "; print (Int.toString state); print " :\n\n"; List.app (fn (item,lookahead) => (print "{"; printItem item; print ","; printLookahead lookahead; print "}\n")) items) end exception Lalr of int structure ItemList = ListOrdSet (struct type elem = item * term list ref val eq = fn ((a,_),(b,_)) => eqItem(a,b) val gt = fn ((a,_),(b,_)) => gtItem(a,b) end) structure NontermSet = ListOrdSet (struct type elem = nonterm val gt = gtNonterm val eq = eqNonterm end) (* NTL: nonterms with lookahead *) structure NTL = RbOrdSet (struct type elem = nonterm * term list val gt = fn ((i,_),(j,_)) => gtNonterm(i,j) val eq = fn ((i,_),(j,_)) => eqNonterm(i,j) end) val DEBUG = false val addLookahead = fn {graph,nullable,first,eop, rules,produces,nonterms,epsProds, print,termToString,nontermToString} => let val eop = Look.make_set eop val symbolToString = fn (TERM t) => termToString t | (NONTERM t) => nontermToString t val print = if DEBUG then print else fn _ => () val prLook = if DEBUG then prLook (termToString,print) else fn _ => () val prNonterm = print o nontermToString val prRule = if DEBUG then prRule(symbolToString,nontermToString,print) else fn _ => () val printInt = print o (Int.toString : int -> string) val printItem = prItem(symbolToString,nontermToString,print) (* look_pos: position in the rhs of a rule at which we should start placing lookahead ref cells, i.e. the minimum place at which A -> x .B y, where B is a nonterminal and y =*=> epsilon, or A -> x. is true. Positions are given by the number of symbols before the place. The place before the first symbol is 0, etc. *) val look_pos = let val positions = array(length rules,0) (* rule_pos: calculate place in the rhs of a rule at which we should start placing lookahead ref cells *) val rule_pos = fn (RULE {rhs,...}) => case (rev rhs) of nil => 0 | (TERM t) :: r => length rhs | (l as (NONTERM n) :: r) => (* f assumes that everything after n in the rule has proven to be nullable so far. Remember that the rhs has been reversed, implying that this is true initially *) (* A -> .z t B y, where y is nullable *) let fun f (NONTERM b :: (r as (TERM _ :: _))) = (length r) (* A -> .z B C y *) | f (NONTERM c :: (r as (NONTERM b :: _))) = if nullable c then f r else (length r) (* A -> .B y, where y is nullable *) | f (NONTERM b :: nil) = 0 in f l end val check_rule = fn (rule as RULE {num,...}) => let val pos = rule_pos rule in (print "look_pos: "; prRule rule; print " = "; printInt pos; print "\n"; update(positions,num,rule_pos rule)) end in app check_rule rules; fn RULE{num,...} => (positions sub num) end (* rest_is_null: true for items of the form A -> x .B y, where y is nullable *) val rest_is_null = fn (ITEM{rule,dot, rhsAfter=NONTERM _ :: _}) => dot >= (look_pos rule) | _ => false (* map core to a new core including only items of the form A -> x. or A -> x. B y, where y =*=> epsilon. It also adds epsilon productions to the core. Each item is given a ref cell to hold the lookahead nonterminals for it.*) val map_core = let val f = fn (item as ITEM {rhsAfter=nil,...},r) => (item,ref nil) :: r | (item,r) => if (rest_is_null item) then (item,ref nil)::r else r in fn (c as CORE (items,state)) => let val epsItems = map (fn rule=>(ITEM{rule=rule,dot=0,rhsAfter=nil}, ref (nil : term list)) ) (epsProds c) in TMPCORE(ItemList.union(List.foldr f [] items,epsItems),state) end end val new_nodes = map map_core (nodes graph) exception Find (* findRef: state * item -> lookahead ref cell for item *) val findRef = let val states = Array.fromList new_nodes val dummy = ref nil in fn (state,item) => let val TMPCORE (l,_) = states sub state in case ItemList.find((item,dummy),l) of SOME (_,look_ref) => look_ref | NONE => (print "find failed: state "; printInt state; print "\nitem =\n"; printItem item; print "\nactual items =\n"; app (fn (i,_) => (printItem i; print "\n")) l; raise Find) end end (* findRuleRefs: state -> rule -> lookahead refs for rule. *) val findRuleRefs = let val shift = shift graph in fn state => (* handle epsilon productions *) fn (rule as RULE {rhs=nil,...}) => [findRef(state,ITEM{rule=rule,dot=0,rhsAfter=nil})] | (rule as RULE {rhs=sym::rest,...}) => let val pos = Int.max(look_pos rule,1) fun scan'(state,nil,pos,result) = findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=nil}) :: result | scan'(state,rhs as sym::rest,pos,result) = scan'(shift(state,sym), rest, pos+1, findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=rhs})::result) (* find first item of the form A -> x .B y, where y =*=> epsilon and x is not epsilon, or A -> x. use scan' to pick up all refs after this point *) fun scan(state,nil,_) = [findRef(state,ITEM{rule=rule,dot=pos,rhsAfter=nil})] | scan(state,rhs,0) = scan'(state,rhs,pos,nil) | scan(state,sym::rest,place) = scan(shift(state,sym),rest,place-1) in scan(shift(state,sym),rest,pos-1) end end (* function to compute for some nonterminal n the set of nonterminals A added through the closure of nonterminal n such that n =c*=> .A x, where x is nullable *) val nonterms_w_null = fn nt => let val collect_nonterms = fn n => List.foldr (fn (rule as RULE {rhs=rhs as NONTERM n :: _,...},r) => (case (rest_is_null(ITEM {dot=0,rhsAfter=rhs,rule=rule})) of true => n :: r | false => r) | (_,r) => r) [] (produces n) fun dfs(a as (n,r)) = if (NontermSet.exists a) then r else List.foldr dfs (NontermSet.insert(n,r)) (collect_nonterms n) in dfs(nt,NontermSet.empty) end val nonterms_w_null = let val data = array(nonterms,NontermSet.empty) fun f n = if n=nonterms then () else (update(data,n,nonterms_w_null (NT n)); f (n+1)) in (f 0; fn (NT nt) => data sub nt) end (* look_info: for some nonterminal n the set of nonterms A added through the closure of the nonterminal such that n =c+=> .Ax and the lookahead accumlated for each nonterm A *) val look_info = fn nt => let val collect_nonterms = fn n => List.foldr (fn (RULE {rhs=NONTERM n :: t,...},r) => (case NTL.find ((n,nil),r) of SOME (key,data) => NTL.insert((n,Look.union(data,first t)),r) | NONE => NTL.insert ((n,first t),r)) | (_,r) => r) NTL.empty (produces n) fun dfs(a as ((key1,data1),r)) = case (NTL.find a) of SOME (_,data2) => NTL.insert((key1,Look.union(data1,data2)),r) | NONE => NTL.fold dfs (collect_nonterms key1) (NTL.insert a) in dfs((nt,nil),NTL.empty) end val look_info = if not DEBUG then look_info else fn nt => (print "look_info of "; prNonterm nt; print "=\n"; let val info = look_info nt in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* prop_look: propagate lookaheads for nonterms added in the closure of a nonterm. Lookaheads must be propagated from each nonterminal m to all nonterminals { n | m =c+=> nx, where x=*=>epsilon} *) val prop_look = fn ntl => let val upd_lookhd = fn new_look => fn (nt,r) => case NTL.find ((nt,new_look),r) of SOME (_,old_look) => NTL.insert((nt, Look.union(new_look,old_look)),r) | NONE => raise (Lalr 241) val upd_nonterm = fn ((nt,look),r) => NontermSet.fold (upd_lookhd look) (nonterms_w_null nt) r in NTL.fold upd_nonterm ntl ntl end val prop_look = if not DEBUG then prop_look else fn ntl => (print "prop_look =\n"; let val info = prop_look ntl in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* now put the information from these functions together. Create a function which takes a nonterminal n and returns a list of triplets of (a nonterm added through closure, the lookahead for the nonterm, whether the nonterm should include the lookahead for the nonterminal whose closure is being taken (i.e. first(y) for an item j of the form A -> x .n y and lookahead(j) if y =*=> epsilon) *) val closure_nonterms = let val data = array(nonterms,nil: (nonterm * term list * bool) list) val do_nonterm = fn i => let val nonterms_followed_by_null = nonterms_w_null i val nonterms_added_through_closure = NTL.make_list (prop_look (look_info i)) val result = map (fn (nt,l) => (nt,l,NontermSet.exists (nt,nonterms_followed_by_null)) ) nonterms_added_through_closure in if DEBUG then (print "closure_nonterms = "; prNonterm i; print "\n"; app (fn (nt,look,nullable) => (prNonterm nt; print ":"; prLook look; case nullable of false => print "(false)\n" | true => print "(true)\n")) result; print "\n") else (); result end fun f i = if i=nonterms then () else (update(data,i,do_nonterm (NT i)); f (i+1)) val _ = f 0 in fn (NT i) => data sub i end (* add_nonterm_lookahead: Add lookahead to all completion items for rules added when the closure of a given nonterm in some state is taken. It returns a list of lookahead refs to which the given nonterm's lookahead should be propagated. For each rule, it must trace the shift/gotos in the LR(0) graph to find all items of the form A-> x .B y where y =*=> epsilon or A -> x. *) val add_nonterm_lookahead = fn (nt,state) => let val f = fn ((nt,lookahead,nullable),r) => let val refs = map (findRuleRefs state) (produces nt) val refs = List.concat refs val _ = app (fn r => r := (Look.union (!r,lookahead))) refs in if nullable then refs @ r else r end in List.foldr f [] (closure_nonterms nt) end (* scan_core: Scan a core for all items of the form A -> x .B y. Applies add_nonterm_lookahead to each such B, and then merges first(y) into the list of refs returned by add_nonterm_lookahead. It returns a list of ref * ref list for all the items where y =*=> epsilon *) val scan_core = fn (CORE (l,state)) => let fun f ((item as ITEM{rhsAfter= NONTERM b :: y, dot,rule})::t,r) = (case (add_nonterm_lookahead(b,state)) of nil => r | l => let val first_y = first y val newr = if dot >= (look_pos rule) then (findRef(state,item),l)::r else r in (app (fn r => r := Look.union(!r,first_y)) l; f (t,newr)) end) | f (_ :: t,r) = f (t,r) | f (nil,r) = r in f (l,nil) end (* add end-of-parse symbols to set of items consisting of all items immediately derived from the start symbol *) val add_eop = fn (c as CORE (l,state),eop) => let fun f (item as ITEM {rule,dot,...}) = let val refs = findRuleRefs state rule in (* first take care of kernal items. Add the end-of-parse symbols to the lookahead sets for these items. Epsilon productions of the start symbol do not need to be handled specially because they will be in the kernal also *) app (fn r => r := Look.union(!r,eop)) refs; (* now take care of closure items. These are all nonterminals C which have a derivation S =+=> .C x, where x is nullable *) if dot >= (look_pos rule) then case item of ITEM{rhsAfter=NONTERM b :: _,...} => (case add_nonterm_lookahead(b,state) of nil => () | l => app (fn r => r := Look.union(!r,eop)) l) | _ => () else () end in app f l end val iterate = fn l => let fun f lookahead (nil,done) = done | f lookahead (h::t,done) = let val old = !h in h := Look.union (old,lookahead); if (length (!h)) <> (length old) then f lookahead (t,false) else f lookahead(t,done) end fun g ((from,to)::rest,done) = let val new_done = f (!from) (to,done) in g (rest,new_done) end | g (nil,done) = done fun loop true = () | loop false = loop (g (l,true)) in loop false end val lookahead = List.concat (map scan_core (nodes graph)) (* used to scan the item list of a TMPCORE and remove the items not being reduced *) val create_lcore_list = fn ((item as ITEM {rhsAfter=nil,...},ref l),r) => (item,l) :: r | (_,r) => r in add_eop(Graph.core graph 0,eop); iterate lookahead; map (fn (TMPCORE (l,state)) => LCORE (List.foldr create_lcore_list [] l, state)) new_nodes end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/05/31 14:05:01 dbm * Rewrote definition of convert_to_pairlist to conform to value restriction. * * Revision 1.2 1996/02/26 15:02:36 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkMakeLrTable (structure IntGrammar : INTGRAMMAR structure LrTable : LR_TABLE sharing type LrTable.term = IntGrammar.Grammar.term sharing type LrTable.nonterm = IntGrammar.Grammar.nonterm ) : MAKE_LR_TABLE = struct open Array List infix 9 sub structure Core = mkCore(structure IntGrammar = IntGrammar) structure CoreUtils = mkCoreUtils(structure IntGrammar = IntGrammar structure Core = Core) structure Graph = mkGraph(structure IntGrammar = IntGrammar structure Core = Core structure CoreUtils = CoreUtils) structure Look = mkLook(structure IntGrammar = IntGrammar) structure Lalr = mkLalr(structure IntGrammar = IntGrammar structure Core = Core structure Graph = Graph structure Look = Look) structure LrTable = LrTable structure IntGrammar = IntGrammar structure Grammar = IntGrammar.Grammar structure GotoList = ListOrdSet (struct type elem = Grammar.nonterm * LrTable.state val eq = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a=b val gt = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a>b end) structure Errs : LR_ERRS = struct structure LrTable = LrTable datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NOT_REDUCED of int | NS of LrTable.term * int | START of int val summary = fn l => let val numRR = ref 0 val numSR = ref 0 val numSTART = ref 0 val numNOT_REDUCED = ref 0 val numNS = ref 0 fun loop (h::t) = (case h of RR _ => numRR := !numRR+1 | SR _ => numSR := !numSR+1 | START _ => numSTART := !numSTART+1 | NOT_REDUCED _ => numNOT_REDUCED := !numNOT_REDUCED+1 | NS _ => numNS := !numNS+1; loop t) | loop nil = {rr = !numRR, sr = !numSR, start = !numSTART, not_reduced = !numNOT_REDUCED, nonshift = !numNS} in loop l end val printSummary = fn say => fn l => let val {rr,sr,start, not_reduced,nonshift} = summary l val say_plural = fn (i,s) => (say (Int.toString i); say " "; case i of 1 => (say s) | _ => (say s; say "s")) val say_error = fn (args as (i,s)) => case i of 0 => () | i => (say_plural args; say "\n") in say_error(rr,"reduce/reduce conflict"); say_error(sr,"shift/reduce conflict"); if nonshift<>0 then (say "non-shiftable terminal used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if start<>0 then (say "start symbol used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if not_reduced<>0 then (say_plural(not_reduced,"rule"); say " not reduced\n") else () end end open IntGrammar Grammar Errs LrTable Core (* rules for resolving conflicts: shift/reduce: If either the terminal or the rule has no precedence, a shift/reduce conflict is reported. A shift is chosen for the table. If both have precedences, the action with the higher precedence is chosen. If the precedences are equal, neither the shift nor the reduce is chosen. reduce/reduce: A reduce/reduce conflict is reported. The lowest numbered rule is chosen for reduction. *) (* method for filling tables - first compute the reductions called for in a state, then add the shifts for the state to this information. How to compute the reductions: A reduction initially is given as an item and a lookahead set calling for reduction by that item. The first reduction is mapped to a list of terminal * rule pairs. Each additional reduction is then merged into this list and reduce/reduce conflicts are resolved according to the rule given. Missed Errors: This method misses some reduce/reduce conflicts that exist because some reductions are removed from the list before conflicting reductions can be compared against them. All reduce/reduce conflicts, however, can be generated given a list of the reduce/reduce conflicts generated by this method. This can be done by taking the transitive closure of the relation given by the list. If reduce/reduce (a,b) and reduce/reduce (b,c) are true, then reduce/reduce (a,c) is true. The relation is symmetric and transitive. Adding shifts: Finally scan the list merging in shifts and resolving conflicts according to the rule given. Missed Shift/Reduce Errors: Some errors may be missed by this method because some reductions were removed as the result of reduce/reduce conflicts. For a shift/reduce conflict of term a, reduction by rule n, shift/reduce conficts exist for all rules y such that reduce/reduce (x,y) or reduce/reduce (y,x) is true. *) val mergeReduces = let val merge = fn state => let fun f (j as (pair1 as (T t1,action1)) :: r1, k as (pair2 as (T t2,action2)) :: r2,result,errs) = if t1 < t2 then f(r1,k,pair1::result,errs) else if t1 > t2 then f(j,r2,pair2::result,errs) else let val REDUCE num1 = action1 val REDUCE num2 = action2 val errs = RR(T t1,state,num1,num2) :: errs val action = if num1 < num2 then pair1 else pair2 in f(r1,r2,action::result,errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (pair1::r,nil,result,errs) = f(r,nil,pair1::result,errs) | f (nil,pair2 :: r,result,errs) = f(nil,r,pair2::result,errs) in f end in fn state => fn ((ITEM {rule=RULE {rulenum,...},...}, lookahead), (reduces,errs)) => let val action = REDUCE rulenum val actions = map (fn a=>(a,action)) lookahead in case reduces of nil => (actions,errs) | _ => merge state (reduces,actions,nil,errs) end end val computeActions = fn (rules,precedence,graph,defaultReductions) => let val rulePrec = let val precData = array(length rules,NONE : int option) in app (fn RULE {rulenum=r,precedence=p,...} => update(precData,r,p)) rules; fn i => precData sub i end fun mergeShifts(state,shifts,nil) = (shifts,nil) | mergeShifts(state,nil,reduces) = (reduces,nil) | mergeShifts(state,shifts,reduces) = let fun f(shifts as (pair1 as (T t1,_)) :: r1, reduces as (pair2 as (T t2,action)) :: r2, result,errs) = if t1 < t2 then f(r1,reduces,pair1 :: result,errs) else if t1 > t2 then f(shifts,r2,pair2 :: result,errs) else let val REDUCE rulenum = action val (term1,_) = pair1 in case (precedence term1,rulePrec rulenum) of (SOME i,SOME j) => if i>j then f(r1,r2,pair1 :: result,errs) else if j>i then f(r1,r2,pair2 :: result,errs) else f(r1,r2,(T t1, ERROR)::result,errs) | (_,_) => f(r1,r2,pair1 :: result, SR (term1,state,rulenum)::errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (nil,h::t,result,errs) = f (nil,t,h::result,errs) | f (h::t,nil,result,errs) = f (t,nil,h::result,errs) in f(shifts,reduces,nil,nil) end fun mapCore ({edge=symbol,to=CORE (_,state)}::r,shifts,gotos) = (case symbol of (TERM t) => mapCore (r,(t,SHIFT(STATE state))::shifts,gotos) | (NONTERM nt) => mapCore(r,shifts,(nt,STATE state)::gotos) ) | mapCore (nil,shifts,gotos) = (rev shifts,rev gotos) fun pruneError ((_,ERROR)::rest) = pruneError rest | pruneError (a::rest) = a :: pruneError rest | pruneError nil = nil in fn (Lalr.LCORE (reduceItems,state),c as CORE (shiftItems,state')) => if DEBUG andalso (state <> state') then let exception MkTable in raise MkTable end else let val (shifts,gotos) = mapCore (Graph.edges(c,graph),nil,nil) val tableState = STATE state in case reduceItems of nil => ((shifts,ERROR),gotos,nil) | h :: nil => let val (ITEM {rule=RULE {rulenum,...},...}, l) = h val (reduces,_) = mergeReduces tableState (h,(nil,nil)) val (actions,errs) = mergeShifts(tableState, shifts,reduces) val actions' = pruneError actions val (actions,default) = let fun hasReduce (nil,actions) = (rev actions,REDUCE rulenum) | hasReduce ((a as (_,SHIFT _)) :: r,actions) = hasReduce(r,a::actions) | hasReduce (_ :: r,actions) = hasReduce(r,actions) fun loop (nil,actions) = (rev actions,ERROR) | loop ((a as (_,SHIFT _)) :: r,actions) = loop(r,a::actions) | loop ((a as (_,REDUCE _)) :: r,actions) = hasReduce(r,actions) | loop (_ :: r,actions) = loop(r,actions) in if defaultReductions andalso length actions = length actions' then loop(actions,nil) else (actions',ERROR) end in ((actions,default), gotos,errs) end | l => let val (reduces,errs1) = List.foldr (mergeReduces tableState) (nil,nil) l val (actions,errs2) = mergeShifts(tableState,shifts,reduces) in ((pruneError actions,ERROR),gotos,errs1@errs2) end end end val mkTable = fn (grammar as GRAMMAR{rules,terms,nonterms,start, precedence,termToString,noshift, nontermToString,eop},defaultReductions) => let val symbolToString = fn (TERM t) => termToString t | (NONTERM nt) => nontermToString nt val {rules,graph,produces,epsProds,...} = Graph.mkGraph grammar val {nullable,first} = Look.mkFuncs{rules=rules,produces=produces,nonterms=nonterms} val lcores = Lalr.addLookahead {graph=graph, nullable=nullable, produces=produces, eop=eop, nonterms=nonterms, first=first, rules=rules, epsProds=epsProds, print=(fn s=>TextIO.output(TextIO.stdOut,s)), termToString = termToString, nontermToString = nontermToString} fun zip (h::t,h'::t') = (h,h') :: zip(t,t') | zip (nil,nil) = nil | zip _ = let exception MkTable in raise MkTable end fun unzip l = let fun f ((a,b,c)::r,j,k,l) = f(r,a::j,b::k,c::l) | f (nil,j,k,l) = (rev j,rev k,rev l) in f(l,nil,nil,nil) end val (actions,gotos,errs) = let val doState = computeActions(rules,precedence,graph, defaultReductions) in unzip (map doState (zip(lcores,Graph.nodes graph))) end (* add goto from state 0 to a new state. The new state has accept actions for all of the end-of-parse symbols *) val (actions,gotos,errs) = case gotos of nil => (actions,gotos,errs) | h :: t => let val newStateActions = (map (fn t => (t,ACCEPT)) (Look.make_set eop),ERROR) val state0Goto = GotoList.insert((start,STATE (length actions)),h) in (actions @ [newStateActions], state0Goto :: (t @ [nil]), errs @ [nil]) end val startErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => if (exists (fn NONTERM a => a=start | _ => false) rhs) then START rulenum :: r else r) [] rules val nonshiftErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => (List.foldr (fn (nonshift,r) => if (exists (fn TERM a => a=nonshift | _ => false) rhs) then NS(nonshift,rulenum) :: r else r) r noshift) ) [] rules val notReduced = let val ruleReduced = array(length rules,false) val test = fn REDUCE i => update(ruleReduced,i,true) | _ => () val _ = app (fn (actions,default) => (app (fn (_,r) => test r) actions; test default) ) actions; fun scan (i,r) = if i >= 0 then scan(i-1, if ruleReduced sub i then r else NOT_REDUCED i :: r) else r in scan(Array.length ruleReduced-1,nil) end handle Subscript => (if DEBUG then print "rules not numbered correctly!" else (); nil) val numstates = length actions val allErrs = startErrs @ notReduced @ nonshiftErrs @ (List.concat errs) fun convert_to_pairlist(nil : ('a * 'b) list): ('a,'b) pairlist = EMPTY | convert_to_pairlist ((a,b) :: r) = PAIR(a,b,convert_to_pairlist r) in (mkLrTable {actions=Array.fromList(map (fn (a,b) => (convert_to_pairlist a,b)) actions), gotos=Array.fromList (map convert_to_pairlist gotos), numRules=length rules,numStates=length actions, initialState=STATE 0}, let val errArray = Array.fromList errs in fn (STATE state) => errArray sub state end, fn print => let val printCore = prCore(symbolToString,nontermToString,print) val core = Graph.core graph in fn STATE state => printCore (if state=(numstates-1) then Core.CORE (nil,state) else (core state)) end, allErrs) end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:33 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) structure Grammar : GRAMMAR = struct (* define types term and nonterm using those in LrTable datatype term = T of int datatype nonterm = NT of int *) open LrTable datatype symbol = TERM of term | NONTERM of nonterm datatype grammar = GRAMMAR of {rules: {lhs: nonterm, rhs: symbol list, precedence: int option, rulenum: int} list, noshift : term list, eop : term list, terms: int, nonterms: int, start : nonterm, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end; structure IntGrammar : INTGRAMMAR = struct structure Grammar = Grammar open Grammar datatype rule = RULE of {lhs: nonterm, rhs: symbol list, num: int,(* internal # assigned by coreutils *) rulenum: int, precedence: int option} val eqTerm = (op =) val gtTerm = fn (T i,T j) => i>j val eqNonterm = (op =) val gtNonterm = fn (NT i,NT j) => i>j val eqSymbol = (op =) val gtSymbol = fn (TERM (T i),TERM (T j)) => i>j | (NONTERM (NT i),NONTERM (NT j)) => i>j | (TERM _,NONTERM _) => false | (NONTERM _,TERM _) => true structure SymbolAssoc = Table(type key = symbol val gt = gtSymbol) structure NontermAssoc = Table(type key = nonterm val gt = gtNonterm) val DEBUG = false val prRule = fn (a as symbolToString,nontermToString,print) => let val printSymbol = print o symbolToString fun printRhs (h::t) = (printSymbol h; print " "; printRhs t) | printRhs nil = () in fn (RULE {lhs,rhs,num,rulenum,precedence,...}) => ((print o nontermToString) lhs; print " : "; printRhs rhs; if DEBUG then (print " num = "; print (Int.toString num); print " rulenum = "; print (Int.toString rulenum); print " precedence = "; case precedence of NONE => print " none" | (SOME i) => print (Int.toString i); ()) else ()) end val prGrammar = fn (a as (symbolToString,nontermToString,print)) => fn (GRAMMAR {rules,terms,nonterms,start,...}) => let val printRule = let val prRule = prRule a in fn {lhs,rhs,precedence,rulenum} => (prRule (RULE {lhs=lhs,rhs=rhs,num=0, rulenum=rulenum, precedence=precedence}); print "\n") end in print "grammar = \n"; List.app printRule rules; print "\n"; print (" terms = " ^ (Int.toString terms) ^ " nonterms = " ^ (Int.toString nonterms) ^ " start = "); (print o nontermToString) start; () end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:39 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:47 george * Version 109 * *) functor mkVerbose(structure Errs : LR_ERRS) : VERBOSE = struct structure Errs = Errs open Errs Errs.LrTable val mkPrintAction = fn print => let val printInt = print o (Int.toString : int -> string) in fn (SHIFT (STATE i)) => (print "\tshift "; printInt i; print "\n") | (REDUCE rulenum) => (print "\treduce by rule "; printInt rulenum; print "\n") | ACCEPT => print "\taccept\n" | ERROR => print "\terror\n" end val mkPrintGoto = fn (printNonterm,print) => let val printInt = print o (Int.toString : int -> string) in fn (nonterm,STATE i) => (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintTermAction = fn (printTerm,print) => let val printAction = mkPrintAction print in fn (term,action) => (print "\t"; printTerm term; printAction action) end val mkPrintGoto = fn (printNonterm,print) => fn (nonterm,STATE i) => let val printInt = print o (Int.toString : int -> string) in (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintError = fn (printTerm,printRule,print) => let val printInt = print o (Int.toString : int -> string) val printState = fn STATE s => (print " state "; printInt s) in fn (RR (term,state,r1,r2)) => (print "error: "; printState state; print ": reduce/reduce conflict between rule "; printInt r1; print " and rule "; printInt r2; print " on "; printTerm term; print "\n") | (SR (term,state,r1)) => (print "error: "; printState state; print ": shift/reduce conflict "; print "(shift "; printTerm term; print ", reduce by rule "; printInt r1; print ")\n") | NOT_REDUCED i => (print "warning: rule <"; printRule i; print "> will never be reduced\n") | START i => (print "warning: start symbol appears on the rhs of "; print "<"; printRule i; print ">\n") | NS (term,i) => (print "warning: non-shiftable terminal "; printTerm term; print "appears on the rhs of "; print "<"; printRule i; print ">\n") end structure PairList : sig val app : ('a * 'b -> unit) -> ('a,'b) pairlist -> unit val length : ('a,'b) pairlist -> int end = struct val app = fn f => let fun g EMPTY = () | g (PAIR(a,b,r)) = (f(a,b); g r) in g end val length = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end end val printVerbose = fn {termToString,nontermToString,table,stateErrs,entries:int, print,printRule,errs,printCores} => let val printTerm = print o termToString val printNonterm = print o nontermToString val printCore = printCores print val printTermAction = mkPrintTermAction(printTerm,print) val printAction = mkPrintAction print val printGoto = mkPrintGoto(printNonterm,print) val printError = mkPrintError(printTerm,printRule print,print) val gotos = LrTable.describeGoto table val actions = LrTable.describeActions table val states = numStates table val gotoTableSize = ref 0 val actionTableSize = ref 0 val _ = if length errs > 0 then (printSummary print errs; print "\n"; app printError errs) else () fun loop i = if i=states then () else let val s = STATE i in (app printError (stateErrs s); print "\n"; printCore s; let val (actionList,default) = actions s val gotoList = gotos s in (PairList.app printTermAction actionList; print "\n"; PairList.app printGoto gotoList; print "\n"; print "\t."; printAction default; print "\n"; gotoTableSize:=(!gotoTableSize)+ PairList.length gotoList; actionTableSize := (!actionTableSize) + PairList.length actionList + 1 ) end; loop (i+1)) end in loop 0; print (Int.toString entries ^ " of " ^ Int.toString (!actionTableSize)^ " action table entries left after compaction\n"); print (Int.toString (!gotoTableSize)^ " goto table entries\n") end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:37 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkPrintStruct(structure LrTable : LR_TABLE structure ShrinkLrTable : SHRINK_LR_TABLE sharing LrTable = ShrinkLrTable.LrTable):PRINT_STRUCT = struct open Array List infix 9 sub structure LrTable = LrTable open ShrinkLrTable LrTable (* lineLength = approximately the largest number of characters to allow on a line when printing out an encode string *) val lineLength = 72 (* maxLength = length of a table entry. All table entries are encoded using two 16-bit integers, one for the terminal number and the other for the entry. Each integer is printed as two characters (low byte, high byte), using the ML ascii escape sequence. We need 4 characters for each escape sequence and 16 characters for each entry *) val maxLength = 16 (* number of entries we can fit on a row *) val numEntries = lineLength div maxLength (* convert integer between 0 and 255 to the three character ascii decimal escape sequence for it *) val chr = let val lookup = Array.array(256,"\000") val intToString = fn i => if i>=100 then "\\" ^ (Int.toString i) else if i>=10 then "\\0" ^ (Int.toString i) else "\\00" ^ (Int.toString i) fun loop n = if n=256 then () else (Array.update(lookup,n,intToString n); loop (n+1)) in loop 0; fn i => lookup sub i end val makeStruct = fn {table,name,print,verbose} => let val states = numStates table val rules = numRules table fun printPairList (prEntry : 'a * 'b -> unit) l = let fun f (EMPTY,_) = () | f (PAIR(a,b,r),count) = if count >= numEntries then (print "\\\n\\"; prEntry(a,b); f(r,1)) else (prEntry(a,b); f(r,(count+1))) in f(l,0) end val printList : ('a -> unit) -> 'a list -> unit = fn prEntry => fn l => let fun f (nil,_) = () | f (a :: r,count) = if count >= numEntries then (print "\\\n\\"; prEntry a; f(r,1)) else (prEntry a; f(r,count+1)) in f(l,0) end val prEnd = fn _ => print "\\000\\000\\\n\\" fun printPairRow prEntry = let val printEntries = printPairList prEntry in fn l => (printEntries l; prEnd()) end fun printPairRowWithDefault (prEntry,prDefault) = let val f = printPairRow prEntry in fn (l,default) => (prDefault default; f l) end fun printTable (printRow,count) = (print "\"\\\n\\"; let fun f i = if i=count then () else (printRow i; f (i+1)) in f 0 end; print"\"\n") val printChar = print o chr (* print an integer between 0 and 2^16-1 as a 2-byte character, with the low byte first *) val printInt = fn i => (printChar (i mod 256); printChar (i div 256)) (* encode actions as integers: ACCEPT => 0 ERROR => 1 SHIFT i => 2 + i REDUCE rulenum => numstates+2+rulenum *) val printAction = fn (REDUCE rulenum) => printInt (rulenum+states+2) | (SHIFT (STATE i)) => printInt (i+2) | ACCEPT => printInt 0 | ERROR => printInt 1 val printTermAction = fn (T t,action) => (printInt (t+1); printAction action) val printGoto = fn (NT n,STATE s) => (printInt (n+1); printInt s) val ((rowCount,rowNumbers,actionRows),entries)= shrinkActionList(table,verbose) val getActionRow = let val a = Array.fromList actionRows in fn i => a sub i end val printGotoRow : int -> unit = let val f = printPairRow printGoto val g = describeGoto table in fn i => f (g (STATE i)) end val printActionRow = let val f = printPairRowWithDefault(printTermAction,printAction) in fn i => f (getActionRow i) end in print "val "; print name; print "="; print "let val actionRows =\n"; printTable(printActionRow,rowCount); print "val actionRowNumbers =\n\""; printList (fn i => printInt i) rowNumbers; print "\"\n"; print "val gotoT =\n"; printTable(printGotoRow,states); print "val numstates = "; print (Int.toString states); print "\nval numrules = "; print (Int.toString rules); print "\n\ \val s = ref \"\" and index = ref 0\n\ \val string_to_int = fn () => \n\ \let val i = !index\n\ \in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256\n\ \end\n\ \val string_to_list = fn s' =>\n\ \ let val len = String.size s'\n\ \ fun f () =\n\ \ if !index < len then string_to_int() :: f()\n\ \ else nil\n\ \ in index := 0; s := s'; f ()\n\ \ end\n\ \val string_to_pairlist = fn (conv_key,conv_entry) =>\n\ \ let fun f () =\n\ \ case string_to_int()\n\ \ of 0 => EMPTY\n\ \ | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f())\n\ \ in f\n\ \ end\n\ \val string_to_pairlist_default = fn (conv_key,conv_entry) =>\n\ \ let val conv_row = string_to_pairlist(conv_key,conv_entry)\n\ \ in fn () =>\n\ \ let val default = conv_entry(string_to_int())\n\ \ val row = conv_row()\n\ \ in (row,default)\n\ \ end\n\ \ end\n\ \val string_to_table = fn (convert_row,s') =>\n\ \ let val len = String.size s'\n\ \ fun f ()=\n\ \ if !index < len then convert_row() :: f()\n\ \ else nil\n\ \ in (s := s'; index := 0; f ())\n\ \ end\n\ \local\n\ \ val memo = Array.array(numstates+numrules,ERROR)\n\ \ val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1))\n\ \ fun f i =\n\ \ if i=numstates then g i\n\ \ else (Array.update(memo,i,SHIFT (STATE i)); f (i+1))\n\ \ in f 0 handle Subscript => ()\n\ \ end\n\ \in\n\ \val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2))\n\ \end\n\ \val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT))\n\ \val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows)\n\ \val actionRowNumbers = string_to_list actionRowNumbers\n\ \val actionT = let val actionRowLookUp=\n\ \let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end\n\ \in Array.fromList(map actionRowLookUp actionRowNumbers)\n\ \end\n\ \in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules,\n\ \numStates=numstates,initialState=STATE "; print (Int.toString ((fn (STATE i) => i) (initialState table))); print "}\nend\n"; entries end end; (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/05/30 17:52:58 dbm * Lifted a let to a local in definition of createEquivalences to conform with * value restriction. * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature SORT_ARG = sig type entry val gt : entry * entry -> bool end signature SORT = sig type entry val sort : entry list -> entry list end signature EQUIV_ARG = sig type entry val gt : entry * entry -> bool val eq : entry * entry -> bool end signature EQUIV = sig type entry (* equivalences: take a list of entries and divides them into equivalence classes numbered 0 to n-1. It returns a triple consisting of: * the number of equivalence classes * a list which maps each original entry to an equivalence class. The nth entry in this list gives the equivalence class for the nth entry in the original entry list. * a list which maps equivalence classes to some representative element. The nth entry in this list is an element from the nth equivalence class *) val equivalences : entry list -> (int * int list * entry list) end (* An O(n lg n) merge sort routine *) functor MergeSortFun(A : SORT_ARG) : SORT = struct type entry = A.entry (* sort: an O(n lg n) merge sort routine. We create a list of lists and then merge these lists in passes until only one list is left.*) fun sort nil = nil | sort l = let (* merge: merge two lists *) fun merge (l as a::at,r as b::bt) = if A.gt(a,b) then b :: merge(l,bt) else a :: merge(at,r) | merge (l,nil) = l | merge (nil,r) = r (* scan: merge pairs of lists on a list of lists. Reduces the number of lists by about 1/2 *) fun scan (a :: b :: rest) = merge(a,b) :: scan rest | scan l = l (* loop: calls scan on a list of lists until only one list is left. It terminates only if the list of lists is nonempty. (The pattern match for sort ensures this.) *) fun loop (a :: nil) = a | loop l = loop (scan l) in loop (map (fn a => [a]) l) end end (* an O(n lg n) routine for placing items in equivalence classes *) functor EquivFun(A : EQUIV_ARG) : EQUIV = struct open Array List infix 9 sub (* Our algorithm for finding equivalence class is simple. The basic idea is to sort the entries and place duplicates entries in the same equivalence class. Let the original entry list be E. We map E to a list of a pairs consisting of the entry and its position in E, where the positions are numbered 0 to n-1. Call this list of pairs EP. We then sort EP on the original entries. The second elements in the pairs now specify a permutation that will return us to EP. We then scan the sorted list to create a list R of representative entries, a list P of integers which permutes the sorted list back to the original list and a list SE of integers which gives the equivalence class for the nth entry in the sorted list . We then return the length of R, R, and the list that results from permuting SE by P. *) type entry = A.entry val gt = fn ((a,_),(b,_)) => A.gt(a,b) structure Sort = MergeSortFun(type entry = A.entry * int val gt = gt) val assignIndex = fn l => let fun loop (index,nil) = nil | loop (index,h :: t) = (h,index) :: loop(index+1,t) in loop (0,l) end local fun loop ((e,_) :: t, prev, class, R , SE) = if A.eq(e,prev) then loop(t,e,class,R, class :: SE) else loop(t,e,class+1,e :: R, (class + 1) :: SE) | loop (nil,_,_,R,SE) = (rev R, rev SE) in val createEquivalences = fn nil => (nil,nil) | (e,_) :: t => loop(t, e, 0, [e],[0]) end val inversePermute = fn permutation => fn nil => nil | l as h :: _ => let val result = array(length l,h) fun loop (elem :: r, dest :: s) = (update(result,dest,elem); loop(r,s)) | loop _ = () fun listofarray i = if i < Array.length result then (result sub i) :: listofarray (i+1) else nil in loop (l,permutation); listofarray 0 end fun makePermutation x = map (fn (_,b) => b) x val equivalences = fn l => let val EP = assignIndex l val sorted = Sort.sort EP val P = makePermutation sorted val (R, SE) = createEquivalences sorted in (length R, inversePermute P SE, R) end end functor ShrinkLrTableFun(structure LrTable : LR_TABLE) : SHRINK_LR_TABLE = struct structure LrTable = LrTable open LrTable val gtAction = fn (a,b) => case a of SHIFT (STATE s) => (case b of SHIFT (STATE s') => s>s' | _ => true) | REDUCE i => (case b of SHIFT _ => false | REDUCE i' => i>i' | _ => true) | ACCEPT => (case b of ERROR => true | _ => false) | ERROR => false structure ActionEntryList = struct type entry = (term,action) pairlist * action val rec eqlist = fn (EMPTY,EMPTY) => true | (PAIR (T t,d,r),PAIR(T t',d',r')) => t=t' andalso d=d' andalso eqlist(r,r') | _ => false val rec gtlist = fn (PAIR _,EMPTY) => true | (PAIR(T t,d,r),PAIR(T t',d',r')) => t>t' orelse (t=t' andalso (gtAction(d,d') orelse (d=d' andalso gtlist(r,r')))) | _ => false val eq = fn ((l,a),(l',a')) => a=a' andalso eqlist(l,l') val gt = fn ((l,a),(l',a')) => gtAction(a,a') orelse (a=a' andalso gtlist(l,l')) end (* structure GotoEntryList = struct type entry = (nonterm,state) pairlist val rec eq = fn (EMPTY,EMPTY) => true | (PAIR (t,d,r),PAIR(t',d',r')) => t=t' andalso d=d' andalso eq(r,r') | _ => false val rec gt = fn (PAIR _,EMPTY) => true | (PAIR(NT t,STATE d,r),PAIR(NT t',STATE d',r')) => t>t' orelse (t=t' andalso (d>d' orelse (d=d' andalso gt(r,r')))) | _ => false end *) structure EquivActionList = EquivFun(ActionEntryList) val states = fn max => let fun f i=if i int = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end val size : (('a,'b) pairlist * 'c) list -> int = fn l => let val c = ref 0 in (app (fn (row,_) => c := !c + length row) l; !c) end val shrinkActionList = fn (table,verbose) => case EquivActionList.equivalences (map (describeActions table) (states (numStates table))) of result as (_,_,l) => (result,if verbose then size l else 0) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) signature ABSYN = sig datatype exp = EVAR of string | EAPP of exp * exp | ETUPLE of exp list | EINT of int | FN of pat * exp | LET of decl list * exp | UNIT | SEQ of exp * exp | CODE of string and pat = PVAR of string | PAPP of string * pat | PTUPLE of pat list | PLIST of pat list | PINT of int | WILD | AS of pat * pat and decl = VB of pat * exp and rule = RULE of pat * exp val printRule : ((string -> unit) * (string -> unit)) -> rule -> unit end (* ML-Yacc Parser Generator (c) 1989, 1990 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/05/30 18:05:09 dbm * Made changes to generate code that conforms to the value restriction by * lifting lets to locals in the code generated to define errtermvalue and action. * * Revision 1.2 1996/02/26 15:02:40 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:48 george * Version 109 * *) functor ParseGenFun(structure ParseGenParser : PARSE_GEN_PARSER where type Header.pos = int structure MakeTable : MAKE_LR_TABLE structure Verbose : VERBOSE structure PrintStruct : PRINT_STRUCT sharing MakeTable.LrTable = PrintStruct.LrTable sharing MakeTable.Errs = Verbose.Errs structure Absyn : ABSYN ) : PARSE_GEN = struct open Array List infix 9 sub structure Grammar = MakeTable.Grammar structure Header = ParseGenParser.Header open Header Grammar (* approx. maximum length of a line *) val lineLength = 70 (* record type describing names of structures in the program being generated *) datatype names = NAMES of {miscStruct : string, (* Misc{n} struct name *) tableStruct : string, (* LR table structure *) tokenStruct : string, (* Tokens{n} struct name *) actionsStruct : string, (* Actions structure *) valueStruct: string, (* semantic value structure *) ecStruct : string, (* error correction structure *) arg: string, (* user argument for parser *) tokenSig : string, (* TOKENS{n} signature *) miscSig :string, (* Signature for Misc structure *) dataStruct:string, (* name of structure in Misc *) (* which holds parser data *) dataSig:string (* signature for this structure *) } val DEBUG = true exception Semantic (* common functions and values used in printing out program *) datatype values = VALS of {say : string -> unit, saydot : string -> unit, sayln : string -> unit, pureActions: bool, pos_type : string, arg_type : string, ntvoid : string, termvoid : string, start : Grammar.nonterm, hasType : Grammar.symbol -> bool, (* actual (user) name of terminal *) termToString : Grammar.term -> string, symbolToString : Grammar.symbol -> string, (* type symbol comes from the HDR structure, and is now abstract *) term : (Header.symbol * ty option) list, nonterm : (Header.symbol * ty option) list, terms : Grammar.term list} structure SymbolHash = Hash(type elem = string val gt = (op >) : string*string -> bool) structure TermTable = Table(type key = Grammar.term val gt = fn (T i,T j) => i > j) structure SymbolTable = Table( type key = Grammar.symbol val gt = fn (TERM(T i),TERM(T j)) => i>j | (NONTERM(NT i),NONTERM(NT j)) => i>j | (NONTERM _,TERM _) => true | (TERM _,NONTERM _) => false) (* printTypes: function to print the following types in the LrValues structure and a structure containing the datatype svalue: type svalue -- it holds semantic values on the parse stack type pos -- the type of line numbers type result -- the type of the value that results from the parse The type svalue is set equal to the datatype svalue declared in the structure named by valueStruct. The datatype svalue is declared inside the structure named by valueStruct to deal with the scope of constructors. *) val printTypes = fn (VALS {say,sayln,term,nonterm,symbolToString,pos_type, arg_type, termvoid,ntvoid,saydot,hasType,start, pureActions,...}, NAMES {valueStruct,...},symbolType) => let val prConstr = fn (symbol,SOME s) => say (" | " ^ (symbolName symbol) ^ " of " ^ (if pureActions then "" else "unit -> ") ^ " (" ^ tyName s ^ ")" ) | _ => () in sayln "local open Header in"; sayln ("type pos = " ^ pos_type); sayln ("type arg = " ^ arg_type); sayln ("structure " ^ valueStruct ^ " = "); sayln "struct"; say ("datatype svalue = " ^ termvoid ^ " | " ^ ntvoid ^ " of" ^ (if pureActions then "" else " unit -> ") ^ " unit"); app prConstr term; app prConstr nonterm; sayln "\nend"; sayln ("type svalue = " ^ valueStruct ^ ".svalue"); say "type result = "; case symbolType (NONTERM start) of NONE => sayln "unit" | SOME t => (say (tyName t); sayln ""); sayln "end" end (* function to print Tokens{n} structure *) val printTokenStruct = fn (VALS {say, sayln, termToString, hasType,termvoid,terms, pureActions,...}, NAMES {miscStruct,tableStruct,valueStruct, tokenStruct,tokenSig,dataStruct,...}) => (sayln ("structure " ^ tokenStruct ^ " : " ^ tokenSig ^ " ="); sayln "struct"; sayln ("type svalue = " ^ dataStruct ^ ".svalue"); sayln "type ('a,'b) token = ('a,'b) Token.token"; let val f = fn term as T i => (say "fun "; say (termToString term); say " ("; if (hasType (TERM term)) then say "i," else (); say "p1,p2) = Token.TOKEN ("; say (dataStruct ^ "." ^ tableStruct ^ ".T "); say (Int.toString i); say ",("; say (dataStruct ^ "." ^ valueStruct ^ "."); if (hasType (TERM term)) then (say (termToString term); if pureActions then say " i" else say " (fn () => i)") else say termvoid; say ","; sayln "p1,p2))") in app f terms end; sayln "end") (* function to print signatures out - takes print function which does not need to insert line breaks *) val printSigs = fn (VALS {term,...}, NAMES {tokenSig,tokenStruct,miscSig, dataStruct, dataSig, ...}, say) => say ("signature " ^ tokenSig ^ " =\nsig\n\ \type ('a,'b) token\ntype svalue\n" ^ (List.foldr (fn ((s,ty),r) => String.concat [ "val ", symbolName s, (case ty of NONE => ": " | SOME l => ": (" ^ (tyName l) ^ ") * "), " 'a * 'a -> (svalue,'a) token\n", r]) "" term) ^ "end\nsignature " ^ miscSig ^ "=\nsig\nstructure Tokens : " ^ tokenSig ^ "\nstructure " ^ dataStruct ^ ":" ^ dataSig ^ "\nsharing type " ^ dataStruct ^ ".Token.token = Tokens.token\nsharing type " ^ dataStruct ^ ".svalue = Tokens.svalue\nend\n") (* function to print structure for error correction *) val printEC = fn (keyword : term list, preferred_change : (term list * term list) list, noshift : term list, value : (term * string) list, VALS {termToString, say,sayln,terms,saydot,hasType, termvoid,pureActions,...}, NAMES {ecStruct,tableStruct,valueStruct,...}) => let val sayterm = fn (T i) => (say "(T "; say (Int.toString i); say ")") val printBoolCase = fn ( l : term list) => (say "fn "; app (fn t => (sayterm t; say " => true"; say " | ")) l; sayln "_ => false") val printTermList = fn (l : term list) => (app (fn t => (sayterm t; say " :: ")) l; sayln "nil") fun printChange () = (sayln "val preferred_change = "; app (fn (d,i) => (say"("; printTermList d; say ","; printTermList i; sayln ")::" ) ) preferred_change; sayln "nil") val printErrValues = fn (l : (term * string) list) => (sayln "local open Header in"; sayln "val errtermvalue="; say "fn "; app (fn (t,s) => (sayterm t; say " => "; saydot valueStruct; say (termToString t); say "("; if pureActions then () else say "fn () => "; say "("; say s; say "))"; sayln " | " ) ) l; say "_ => "; say (valueStruct ^ "."); sayln termvoid; sayln "end") val printNames = fn () => let val f = fn term => (sayterm term; say " => "; say "\""; say (termToString term); sayln "\""; say " | ") in (sayln "val showTerminal ="; say "fn "; app f terms; sayln "_ => \"bogus-term\"") end val ecTerms = List.foldr (fn (t,r) => if hasType (TERM t) orelse exists (fn (a,_)=>a=t) value then r else t::r) [] terms in say "structure "; say ecStruct; sayln "="; sayln "struct"; say "open "; sayln tableStruct; sayln "val is_keyword ="; printBoolCase keyword; printChange(); sayln "val noShift = "; printBoolCase noshift; printNames (); printErrValues value; say "val terms = "; printTermList ecTerms; sayln "end" end val printAction = fn (rules, VALS {hasType,say,sayln,termvoid,ntvoid, symbolToString,saydot,start,pureActions,...}, NAMES {actionsStruct,valueStruct,tableStruct,arg,...}) => let val printAbsynRule = Absyn.printRule(say,sayln) val is_nonterm = fn (NONTERM i) => true | _ => false val numberRhs = fn r => List.foldl (fn (e,(r,table)) => let val num = case SymbolTable.find(e,table) of SOME i => i | NONE => 1 in ((e,num,hasType e orelse is_nonterm e)::r, SymbolTable.insert((e,num+1),table)) end) (nil,SymbolTable.empty) r val saySym = symbolToString val printCase = fn (i:int, r as {lhs=lhs as (NT lhsNum),prec, rhs,code,rulenum}) => (* mkToken: Build an argument *) let open Absyn val mkToken = fn (sym,num : int,typed) => let val symString = symbolToString sym val symNum = symString ^ (Int.toString num) in PTUPLE[WILD, PTUPLE[if not (hasType sym) then (if is_nonterm sym then PAPP(valueStruct^"."^ntvoid, PVAR symNum) else WILD) else PAPP(valueStruct^"."^symString, if num=1 andalso pureActions then AS(PVAR symNum,PVAR symString) else PVAR symNum), if num=1 then AS(PVAR (symString^"left"), PVAR(symNum^"left")) else PVAR(symNum^"left"), if num=1 then AS(PVAR(symString^"right"), PVAR(symNum^"right")) else PVAR(symNum^"right")]] end val numberedRhs = #1 (numberRhs rhs) (* construct case pattern *) val pat = PTUPLE[PINT i,PLIST(map mkToken numberedRhs @ [PVAR "rest671"])] (* remove terminals in argument list w/o types *) val argsWithTypes = List.foldr (fn ((_,_,false),r) => r | (s as (_,_,true),r) => s::r) nil numberedRhs (* construct case body *) val defaultPos = EVAR "defaultPos" val resultexp = EVAR "result" val resultpat = PVAR "result" val code = CODE code val rest = EVAR "rest671" val body = LET([VB(resultpat, EAPP(EVAR(valueStruct^"."^ (if hasType (NONTERM lhs) then saySym(NONTERM lhs) else ntvoid)), if pureActions then code else if argsWithTypes=nil then FN(WILD,code) else FN(WILD, let val body = LET(map (fn (sym,num:int,_) => let val symString = symbolToString sym val symNum = symString ^ Int.toString num in VB(if num=1 then AS(PVAR symString,PVAR symNum) else PVAR symNum, EAPP(EVAR symNum,UNIT)) end) (rev argsWithTypes), code) in if hasType (NONTERM lhs) then body else SEQ(body,UNIT) end)))], ETUPLE[EAPP(EVAR(tableStruct^".NT"),EINT(lhsNum)), case rhs of nil => ETUPLE[resultexp,defaultPos,defaultPos] | r =>let val (rsym,rnum,_) = hd(numberedRhs) val (lsym,lnum,_) = hd(rev numberedRhs) in ETUPLE[resultexp, EVAR (symbolToString lsym ^ Int.toString lnum ^ "left"), EVAR (symbolToString rsym ^ Int.toString rnum ^ "right")] end, rest]) in printAbsynRule (RULE(pat,body)) end val prRules = fn () => (sayln "fn (i392,defaultPos,stack,"; say " ("; say arg; sayln "):arg) =>"; sayln "case (i392,stack)"; say "of "; app (fn (rule as {rulenum,...}) => (printCase(rulenum,rule); say "| ")) rules; sayln "_ => raise (mlyAction i392)") in say "structure "; say actionsStruct; sayln " ="; sayln "struct "; sayln "exception mlyAction of int"; sayln "local open Header in"; sayln "val actions = "; prRules(); sayln "end"; say "val void = "; saydot valueStruct; sayln termvoid; say "val extract = "; say "fn a => (fn "; saydot valueStruct; if hasType (NONTERM start) then say (symbolToString (NONTERM start)) else say "ntVOID"; sayln " x => x"; sayln "| _ => let exception ParseInternal"; say "\tin raise ParseInternal end) a "; sayln (if pureActions then "" else "()"); sayln "end" end val make_parser = fn ((header, DECL {eop,change,keyword,nonterm,prec, term, control,value} : declData, rules : rule list),spec,error : pos -> string -> unit, wasError : unit -> bool) => let val verbose = List.exists (fn VERBOSE=>true | _ => false) control val defaultReductions = not (List.exists (fn NODEFAULT=>true | _ => false) control) val pos_type = let fun f nil = NONE | f ((POS s)::r) = SOME s | f (_::r) = f r in f control end val start = let fun f nil = NONE | f ((START_SYM s)::r) = SOME s | f (_::r) = f r in f control end val name = let fun f nil = NONE | f ((PARSER_NAME s)::r) = SOME s | f (_::r) = f r in f control end val header_decl = let fun f nil = NONE | f ((FUNCTOR s)::r) = SOME s | f (_::r) = f r in f control end val arg_decl = let fun f nil = ("()","unit") | f ((PARSE_ARG s)::r) = s | f (_::r) = f r in f control end val noshift = let fun f nil = nil | f ((NSHIFT s)::r) = s | f (_::r) = f r in f control end val pureActions = let fun f nil = false | f ((PURE)::r) = true | f (_::r) = f r in f control end val term = case term of NONE => (error 1 "missing %term definition"; nil) | SOME l => l val nonterm = case nonterm of NONE => (error 1 "missing %nonterm definition"; nil) | SOME l => l val pos_type = case pos_type of NONE => (error 1 "missing %pos definition"; "") | SOME l => l val termHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) ("duplicate definition of " ^ name ^ " in %term"); table) else SymbolHash.add(name,table) end) SymbolHash.empty term val isTerm = fn name => SymbolHash.exists(name,termHash) val symbolHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) (if isTerm name then name ^ " is defined as a terminal and a nonterminal" else "duplicate definition of " ^ name ^ " in %nonterm"); table) else SymbolHash.add(name,table) end) termHash nonterm fun makeUniqueId s = if SymbolHash.exists(s,symbolHash) then makeUniqueId (s ^ "'") else s val _ = if wasError() then raise Semantic else () val numTerms = SymbolHash.size termHash val numNonterms = SymbolHash.size symbolHash - numTerms val symError = fn sym => fn err => fn symbol => error (symbolPos symbol) (symbolName symbol^" in "^err^" is not defined as a " ^ sym) val termNum : string -> Header.symbol -> term = let val termError = symError "terminal" in fn stmt => let val stmtError = termError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; T ~1) | SOME i => T (if i Header.symbol -> nonterm = let val nontermError = symError "nonterminal" in fn stmt => let val stmtError = nontermError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NT ~1) | SOME i => if i>=numTerms then NT (i-numTerms) else (stmtError symbol;NT ~1) end end val symbolNum : string -> Header.symbol -> Grammar.symbol = let val symbolError = symError "symbol" in fn stmt => let val stmtError = symbolError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NONTERM (NT ~1)) | SOME i => if i>=numTerms then NONTERM(NT (i-numTerms)) else TERM(T i) end end (* map all symbols in the following values to terminals and check that the symbols are defined as terminals: eop : symbol list keyword: symbol list prec: (lexvalue * (symbol list)) list change: (symbol list * symbol list) list *) val eop = map (termNum "%eop") eop val keyword = map (termNum "%keyword") keyword val prec = map (fn (a,l) => (a,case a of LEFT => map (termNum "%left") l | RIGHT => map (termNum "%right") l | NONASSOC => map (termNum "%nonassoc") l )) prec val change = let val mapTerm = termNum "%prefer, %subst, or %change" in map (fn (a,b) => (map mapTerm a, map mapTerm b)) change end val noshift = map (termNum "%noshift") noshift val value = let val mapTerm = termNum "%value" in map (fn (a,b) => (mapTerm a,b)) value end val (rules,_) = let val symbolNum = symbolNum "rule" val nontermNum = nontermNum "rule" val termNum = termNum "%prec tag" in List.foldr (fn (RULE {lhs,rhs,code,prec},(l,n)) => ( {lhs=nontermNum lhs,rhs=map symbolNum rhs, code=code,prec=case prec of NONE => NONE | SOME t => SOME (termNum t), rulenum=n}::l,n-1)) (nil,length rules-1) rules end val _ = if wasError() then raise Semantic else () (* termToString: map terminals back to strings *) val termToString = let val data = array(numTerms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i,name) end val _ = app unmap term in fn T i => if DEBUG andalso (i<0 orelse i>=numTerms) then "bogus-num" ^ (Int.toString i) else data sub i end val nontermToString = let val data = array(numNonterms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i-numTerms,name) end val _ = app unmap nonterm in fn NT i => if DEBUG andalso (i<0 orelse i>=numNonterms) then "bogus-num" ^ (Int.toString i) else data sub i end (* create functions mapping terminals to precedence numbers and rules to precedence numbers. Precedence statements are listed in order of ascending (tighter binding) precedence in the specification. We receive a list composed of pairs containing the kind of precedence (left,right, or assoc) and a list of terminals associated with that precedence. The list has the same order as the corresponding declarations did in the specification. Internally, a tighter binding has a higher precedence number. We give precedences using multiples of 3: p+2 = right associative (force shift of symbol) p+1 = precedence for rule p = left associative (force reduction of rule) Nonassociative terminals are given also given a precedence of p+1. The table generator detects when the associativity of a nonassociative terminal is being used to resolve a shift/reduce conflict by checking if the precedences of the rule and the terminal are equal. A rule is given the precedence of its rightmost terminal *) val termPrec = let val precData = array(numTerms, NONE : int option) val addPrec = fn termPrec => fn term as (T i) => case precData sub i of SOME _ => error 1 ("multiple precedences specified for terminal " ^ (termToString term)) | NONE => update(precData,i,termPrec) val termPrec = fn ((LEFT,_) ,i) => i | ((RIGHT,_),i) => i+2 | ((NONASSOC,l),i) => i+1 val _ = List.foldl (fn (args as ((_,l),i)) => (app (addPrec (SOME (termPrec args))) l; i+3)) 0 prec in fn (T i) => if DEBUG andalso (i < 0 orelse i >= numTerms) then NONE else precData sub i end val elimAssoc = fn i => (i - (i mod 3) + 1) val rulePrec = let fun findRightTerm (nil,r) = r | findRightTerm (TERM t :: tail,r) = findRightTerm(tail,SOME t) | findRightTerm (_ :: tail,r) = findRightTerm(tail,r) in fn rhs => case findRightTerm(rhs,NONE) of NONE => NONE | SOME term => case termPrec term of SOME i => SOME (elimAssoc i) | a => a end val grammarRules = let val conv = fn {lhs,rhs,code,prec,rulenum} => {lhs=lhs,rhs =rhs,precedence= case prec of SOME t => (case termPrec t of SOME i => SOME(elimAssoc i) | a => a) | _ => rulePrec rhs, rulenum=rulenum} in map conv rules end (* get start symbol *) val start = case start of NONE => #lhs (hd grammarRules) | SOME name => nontermNum "%start" name val symbolType = let val data = array(numTerms+numNonterms,NONE : ty option) val unmap = fn (symbol,ty) => update(data, case SymbolHash.find(symbolName symbol,symbolHash) of SOME i => i,ty) val _ = (app unmap term; app unmap nonterm) in fn NONTERM(NT i) => if DEBUG andalso (i<0 orelse i>=numNonterms) then NONE else data sub (i+numTerms) | TERM (T i) => if DEBUG andalso (i<0 orelse i>=numTerms) then NONE else data sub i end val symbolToString = fn NONTERM i => nontermToString i | TERM i => termToString i val grammar = GRAMMAR {rules=grammarRules, terms=numTerms,nonterms=numNonterms, eop = eop, start=start,noshift=noshift, termToString = termToString, nontermToString = nontermToString, precedence = termPrec} val name' = case name of NONE => "" | SOME s => symbolName s val names = NAMES {miscStruct=name' ^ "LrValsFun", valueStruct="MlyValue", tableStruct="LrTable", tokenStruct="Tokens", actionsStruct="Actions", ecStruct="EC", arg= #1 arg_decl, tokenSig = name' ^ "_TOKENS", miscSig = name' ^ "_LRVALS", dataStruct = "ParserData", dataSig = "PARSER_DATA"} val (table,stateErrs,corePrint,errs) = MakeTable.mkTable(grammar,defaultReductions) val entries = ref 0 (* save number of action table entries here *) in let val result = TextIO.openOut (spec ^ ".sml") val sigs = TextIO.openOut (spec ^ ".sig") val pos = ref 0 val pr = fn s => TextIO.output(result,s) val say = fn s => let val l = String.size s val newPos = (!pos) + l in if newPos > lineLength then (pr "\n"; pos := l) else (pos := newPos); pr s end val saydot = fn s => (say (s ^ ".")) val sayln = fn t => (pr t; pr "\n"; pos := 0) val termvoid = makeUniqueId "VOID" val ntvoid = makeUniqueId "ntVOID" val hasType = fn s => case symbolType s of NONE => false | _ => true val terms = let fun f n = if n=numTerms then nil else (T n) :: f(n+1) in f 0 end val values = VALS {say=say,sayln=sayln,saydot=saydot, termvoid=termvoid, ntvoid = ntvoid, hasType=hasType, pos_type = pos_type, arg_type = #2 arg_decl, start=start,pureActions=pureActions, termToString=termToString, symbolToString=symbolToString,term=term, nonterm=nonterm,terms=terms} val (NAMES {miscStruct,tableStruct,dataStruct,tokenSig,tokenStruct,dataSig,...}) = names in case header_decl of NONE => (say "functor "; say miscStruct; sayln "(structure Token : TOKEN)"; say " : sig structure "; say dataStruct; say " : "; sayln dataSig; say " structure "; say tokenStruct; say " : "; sayln tokenSig; sayln " end") | SOME s => say s; sayln " = "; sayln "struct"; sayln ("structure " ^ dataStruct ^ "="); sayln "struct"; sayln "structure Header = "; sayln "struct"; sayln header; sayln "end"; sayln "structure LrTable = Token.LrTable"; sayln "structure Token = Token"; sayln "local open LrTable in "; entries := PrintStruct.makeStruct{table=table,print=pr, name = "table", verbose=verbose}; sayln "end"; printTypes(values,names,symbolType); printEC (keyword,change,noshift,value,values,names); printAction(rules,values,names); sayln "end"; printTokenStruct(values,names); sayln "end"; printSigs(values,names,fn s => TextIO.output(sigs,s)); TextIO.closeOut sigs; TextIO.closeOut result; MakeTable.Errs.printSummary (fn s => () (* commented out by sweeks so it runs silently TextIO.output(TextIO.stdOut,s) *)) errs end; if verbose then let val f = TextIO.openOut (spec ^ ".desc") val say = fn s=> TextIO.output(f,s) val printRule = let val rules = Array.fromList grammarRules in fn say => let val prRule = fn {lhs,rhs,precedence,rulenum} => ((say o nontermToString) lhs; say " : "; app (fn s => (say (symbolToString s); say " ")) rhs) in fn i => prRule (rules sub i) end end in Verbose.printVerbose {termToString=termToString,nontermToString=nontermToString, table=table, stateErrs=stateErrs,errs = errs,entries = !entries, print=say, printCores=corePrint,printRule=printRule}; TextIO.closeOut f end else () end val parseGen = fn spec => let val (result,inputSource) = ParseGenParser.parse spec in make_parser(getResult result,spec,Header.error inputSource, errorOccurred inputSource) end end; (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/02/26 15:02:30 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.2 1996/02/15 01:51:38 jhr * Replaced character predicates (isalpha, isnum) with functions from Char. * * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) structure Absyn : ABSYN = struct datatype exp = CODE of string | EAPP of exp * exp | EINT of int | ETUPLE of exp list | EVAR of string | FN of pat * exp | LET of decl list * exp | SEQ of exp * exp | UNIT and pat = PVAR of string | PAPP of string * pat | PINT of int | PLIST of pat list | PTUPLE of pat list | WILD | AS of pat * pat and decl = VB of pat * exp and rule = RULE of pat * exp fun idchar #"'" = true | idchar #"_" = true | idchar c = Char.isAlpha c orelse Char.isDigit c fun code_to_ids s = let fun g(nil,r) = r | g(a as (h::t),r) = if Char.isAlpha h then f(t,[h],r) else g(t,r) and f(nil,accum,r)= implode(rev accum)::r | f(a as (h::t),accum,r) = if idchar h then f(t,h::accum,r) else g(a,implode (rev accum) :: r) in g(explode s,nil) end val simplifyRule : rule -> rule = fn (RULE(p,e)) => let val used : (string -> bool) = let fun f(CODE s) = code_to_ids s | f(EAPP(a,b)) = f a @ f b | f(ETUPLE l) = List.concat (map f l) | f(EVAR s) = [s] | f(FN(_,e)) = f e | f(LET(dl,e)) = (List.concat (map (fn VB(_,e) => f e) dl)) @ f e | f(SEQ(a,b)) = f a @ f b | f _ = nil val identifiers = f e in fn s => List.exists (fn a=>a=s) identifiers end val simplifyPat : pat -> pat = let fun f a = case a of (PVAR s) => if used s then a else WILD | (PAPP(s,pat)) => (case f pat of WILD => WILD | pat' => PAPP(s,pat')) | (PLIST l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PLIST l' else WILD end | (PTUPLE l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PTUPLE l' else WILD end | (AS(a,b)) => let val a'=f a val b'=f b in case(a',b') of (WILD,_) => b' | (_,WILD) => a' | _ => AS(a',b') end | _ => a in f end val simplifyExp : exp -> exp = let fun f(EAPP(a,b)) = EAPP(f a,f b) | f(ETUPLE l) = ETUPLE(map f l) | f(FN(p,e)) = FN(simplifyPat p,f e) | f(LET(dl,e)) = LET(map (fn VB(p,e) => VB(simplifyPat p,f e)) dl, f e) | f(SEQ(a,b)) = SEQ(f a,f b) | f a = a in f end in RULE(simplifyPat p,simplifyExp e) end fun printRule (say : string -> unit, sayln:string -> unit) = let val lp = ["("] val rp = [")"] val sp = [" "] val sm = [";"] val cm = [","] val cr = ["\n"] val unit = ["()"] fun printExp c = let fun f (CODE c) = ["(",c,")"] | f (EAPP(EVAR a,UNIT)) = [a," ","()"] | f (EAPP(EVAR a,EINT i)) = [a," ",Int.toString i] | f (EAPP(EVAR a,EVAR b)) = [a," ",b] | f (EAPP(EVAR a,b)) = List.concat[[a],lp,f b,rp] | f (EAPP(a,b)) = List.concat [lp,f a,rp,lp,f b,rp] | f (EINT i) = [Int.toString i] | f (ETUPLE (a::r)) = let fun scan nil = [rp] | scan (h :: t) = cm :: f h :: scan t in List.concat (lp :: f a :: scan r) end | f (ETUPLE _) = [""] | f (EVAR s) = [s] | f (FN (p,b)) = List.concat[["fn "],printPat p,[" => "],f b] | f (LET (nil,body)) = f body | f (LET (dl,body)) = let fun scan nil = [[" in "],f body,[" end"],cr] | scan (h :: t) = printDecl h :: scan t in List.concat(["let "] :: scan dl) end | f (SEQ (a,b)) = List.concat [lp,f a,sm,f b,rp] | f (UNIT) = unit in f c end and printDecl (VB (pat,exp)) = List.concat[["val "],printPat pat,["="],printExp exp,cr] and printPat c = let fun f (AS(PVAR a,PVAR b)) = [a," as ",b] | f (AS(a,b)) = List.concat [lp,f a,[") as ("],f b,rp] | f (PAPP(a,WILD)) = [a," ","_"] | f (PAPP(a,PINT i)) = [a," ",Int.toString i] | f (PAPP(a,PVAR b)) = [a," ",b] | f (PAPP(a,b)) = List.concat [lp,[a],sp,f b,rp] | f (PINT i) = [Int.toString i] | f (PLIST nil) = [""] | f (PLIST l) = let fun scan (h :: nil) = [f h] | scan (h :: t) = f h :: ["::"] :: scan t in List.concat (scan l) end | f (PTUPLE (a::r)) = let fun scan nil = [rp] | scan (h :: t) = cm :: f h :: scan t in List.concat (lp :: f a :: scan r) end | f (PTUPLE nil) = [""] | f (PVAR a) = [a] | f WILD = ["_"] in f c end fun oursay "\n" = sayln "" | oursay a = say a in fn a => let val RULE(p,e) = simplifyRule a in app oursay (printPat p); say " => "; app oursay (printExp e) end end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) local (* create parser *) structure LrVals = MlyaccLrValsFun(structure Token = LrParser.Token structure Hdr = Header) structure Lex = LexMLYACC(structure Tokens = LrVals.Tokens structure Hdr = Header) structure Parser = JoinWithArg(structure Lex=Lex structure ParserData = LrVals.ParserData structure LrParser= LrParser) structure ParseGenParser = ParseGenParserFun(structure Parser = Parser structure Header = Header) (* create structure for computing LALR table from a grammar *) structure MakeLrTable = mkMakeLrTable(structure IntGrammar =IntGrammar structure LrTable = LrTable) (* create structures for printing LALR tables: Verbose prints a verbose description of an lalr table PrintStruct prints an ML structure representing that is an lalr table *) structure Verbose = mkVerbose(structure Errs = MakeLrTable.Errs) structure PrintStruct = mkPrintStruct(structure LrTable = MakeLrTable.LrTable structure ShrinkLrTable = ShrinkLrTableFun(structure LrTable=LrTable)) in (* returns function which takes a file name, invokes the parser on the file, does semantic checks, creates table, and prints it *) structure ParseGen = ParseGenFun(structure ParseGenParser = ParseGenParser structure MakeTable = MakeLrTable structure Verbose = Verbose structure PrintStruct = PrintStruct structure Absyn = Absyn) end signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml *) structure Main : BMARK = struct val s = OS.FileSys.getDir() fun doit size = let fun loop n = if n = 0 then () else (ParseGen.parseGen(s^"/DATA/ml.grm"); loop(n - 1)) in loop size end fun testit _ = ParseGen.parseGen(s^"/DATA/ml.grm") end mlton-20210117+dfsg/benchmark/tests/model-elimination.sml000066400000000000000000011232141416264345000232510ustar00rootroot00000000000000(* Benchmark from Joe Hurd on 2002-09-24. * * He writes: * * FYI: this benchmark attacks a bunch of non-trivial problems using the * model elimination first-order proof procedure. I've spent a fairly * long time optimizing this at a "high-level" (meaning data-structures * and algorithms optimizations, as well as exploiting domain knowledge, * but no tricks that speed things up for a particular ML * implementation). *) exception Empty (*#line 0.0 "$HOME/dev/sml/basic/src/PP.sig"*) (* PP -- pretty-printing -- from the SML/NJ library *) signature PP = sig type ppstream type ppconsumer = { consumer : string -> unit, linewidth : int, flush : unit -> unit } datatype break_style = CONSISTENT | INCONSISTENT val mk_ppstream : ppconsumer -> ppstream val dest_ppstream : ppstream -> ppconsumer val add_break : ppstream -> int * int -> unit val add_newline : ppstream -> unit val add_string : ppstream -> string -> unit val begin_block : ppstream -> break_style -> int -> unit val end_block : ppstream -> unit val clear_ppstream : ppstream -> unit val flush_ppstream : ppstream -> unit val with_pp : ppconsumer -> (ppstream -> unit) -> unit val pp_to_string : int -> (ppstream -> 'a -> unit) -> 'a -> string end (* This structure provides tools for creating customized Oppen-style pretty-printers, based on the type ppstream. A ppstream is an output stream that contains prettyprinting commands. The commands are placed in the stream by various function calls listed below. There following primitives add commands to the stream: begin_block, end_block, add_string, add_break, and add_newline. All calls to add_string, add_break, and add_newline must happen between a pair of calls to begin_block and end_block must be properly nested dynamically. All calls to begin_block and end_block must be properly nested (dynamically). [ppconsumer] is the type of sinks for pretty-printing. A value of type ppconsumer is a record { consumer : string -> unit, linewidth : int, flush : unit -> unit } of a string consumer, a specified linewidth, and a flush function which is called whenever flush_ppstream is called. A prettyprinter can be called outright to print a value. In addition, a prettyprinter for a base type or nullary datatype ty can be installed in the top-level system. Then the installed prettyprinter will be invoked automatically whenever a value of type ty is to be printed. [break_style] is the type of line break styles for blocks: [CONSISTENT] specifies that if any line break occurs inside the block, then all indicated line breaks occur. [INCONSISTENT] specifies that breaks will be inserted to only to avoid overfull lines. [mk_ppstream {consumer, linewidth, flush}] creates a new ppstream which invokes the consumer to output text, putting at most linewidth characters on each line. [dest_ppstream ppstrm] extracts the linewidth, flush function, and consumer from a ppstream. [add_break ppstrm (size, offset)] notifies the pretty-printer that a line break is possible at this point. * When the current block style is CONSISTENT: ** if the entire block fits on the remainder of the line, then output size spaces; else ** increase the current indentation by the block offset; further indent every item of the block by offset, and add one newline at every add_break in the block. * When the current block style is INCONSISTENT: ** if the next component of the block fits on the remainder of the line, then output size spaces; else ** issue a newline and indent to the current indentation level plus the block offset plus the offset. [add_newline ppstrm] issues a newline. [add_string ppstrm str] outputs the string str to the ppstream. [begin_block ppstrm style blockoffset] begins a new block and level of indentation, with the given style and block offset. [end_block ppstrm] closes the current block. [clear_ppstream ppstrm] restarts the stream, without affecting the underlying consumer. [flush_ppstream ppstrm] executes any remaining commands in the ppstream (that is, flushes currently accumulated output to the consumer associated with ppstrm); executes the flush function associated with the consumer; and calls clear_ppstream. [with_pp consumer f] makes a new ppstream from the consumer and applies f (which can be thought of as a producer) to that ppstream, then flushed the ppstream and returns the value of f. [pp_to_string linewidth printit x] constructs a new ppstream ppstrm whose consumer accumulates the output in a string s. Then evaluates (printit ppstrm x) and finally returns the string s. Example 1: A simple prettyprinter for Booleans: load "PP"; fun ppbool pps d = let open PP in begin_block pps INCONSISTENT 6; add_string pps (if d then "right" else "wrong"); end_block pps end; Now one may define a ppstream to print to, and exercise it: val ppstrm = PP.mk_ppstream {consumer = fn s => TextIO.output(TextIO.stdOut, s), linewidth = 72, flush = fn () => TextIO.flushOut TextIO.stdOut}; fun ppb b = (ppbool ppstrm b; PP.flush_ppstream ppstrm); - ppb false; wrong> val it = () : unit The prettyprinter may also be installed in the toplevel system; then it will be used to print all expressions of type bool subsequently computed: - installPP ppbool; > val it = () : unit - 1=0; > val it = wrong : bool - 1=1; > val it = right : bool See library Meta for a description of installPP. Example 2: Prettyprinting simple expressions (examples/pretty/ppexpr.sml): datatype expr = Cst of int | Neg of expr | Plus of expr * expr fun ppexpr pps e0 = let open PP fun ppe (Cst i) = add_string pps (Int.toString i) | ppe (Neg e) = (add_string pps "~"; ppe e) | ppe (Plus(e1, e2)) = (begin_block pps CONSISTENT 0; add_string pps "("; ppe e1; add_string pps " + "; add_break pps (0, 1); ppe e2; add_string pps ")"; end_block pps) in begin_block pps INCONSISTENT 0; ppe e0; end_block pps end val _ = installPP ppexpr; (* Some example values: *) val e1 = Cst 1; val e2 = Cst 2; val e3 = Plus(e1, Neg e2); val e4 = Plus(Neg e3, e3); val e5 = Plus(Neg e4, e4); val e6 = Plus(e5, e5); val e7 = Plus(e6, e6); val e8 = Plus(e3, Plus(e3, Plus(e3, Plus(e3, Plus(e3, Plus(e3, e7)))))); *) (*#line 0.0 "$HOME/dev/sml/basic/src/PP.sml"*) (* PP -- Oppen-style prettyprinters. * * Modified for Milton ML from SML/NJ Library version 0.2 * * COPYRIGHT (c) 1992 by AT&T Bell Laboratories. * See file mosml/copyrght/copyrght.att for details. *) (* the functions and data for actually doing printing. *) structure PP :> PP = struct open Array infix 9 sub (* the queue library, formerly in unit Ppqueue *) datatype Qend = Qback | Qfront exception QUEUE_FULL exception QUEUE_EMPTY exception REQUESTED_QUEUE_SIZE_TOO_SMALL local fun ++ i n = (i + 1) mod n fun -- i n = (i - 1) mod n in abstype 'a queue = QUEUE of {elems: 'a array, (* the contents *) front: int ref, back: int ref, size: int} (* fixed size of element array *) with fun is_empty (QUEUE{front=ref ~1, back=ref ~1,...}) = true | is_empty _ = false fun mk_queue n init_val = if (n < 2) then raise REQUESTED_QUEUE_SIZE_TOO_SMALL else QUEUE{elems=array(n, init_val), front=ref ~1, back=ref ~1, size=n} fun clear_queue (QUEUE{front,back,...}) = (front := ~1; back := ~1) fun queue_at Qfront (QUEUE{elems,front,...}) = elems sub !front | queue_at Qback (QUEUE{elems,back,...}) = elems sub !back fun en_queue Qfront item (Q as QUEUE{elems,front,back,size}) = if (is_empty Q) then (front := 0; back := 0; update(elems,0,item)) else let val i = --(!front) size in if (i = !back) then raise QUEUE_FULL else (update(elems,i,item); front := i) end | en_queue Qback item (Q as QUEUE{elems,front,back,size}) = if (is_empty Q) then (front := 0; back := 0; update(elems,0,item)) else let val i = ++(!back) size in if (i = !front) then raise QUEUE_FULL else (update(elems,i,item); back := i) end fun de_queue Qfront (Q as QUEUE{front,back,size,...}) = if (!front = !back) (* unitary queue *) then clear_queue Q else front := ++(!front) size | de_queue Qback (Q as QUEUE{front,back,size,...}) = if (!front = !back) then clear_queue Q else back := --(!back) size end (* abstype queue *) end (* local *) val magic: 'a -> 'a = fn x => x (* exception PP_FAIL of string *) datatype break_style = CONSISTENT | INCONSISTENT datatype break_info = FITS | PACK_ONTO_LINE of int | ONE_PER_LINE of int (* Some global values *) val INFINITY = 999999 abstype indent_stack = Istack of break_info list ref with fun mk_indent_stack() = Istack (ref([]:break_info list)) fun clear_indent_stack (Istack stk) = (stk := ([]:break_info list)) fun top (Istack stk) = case !stk of nil => raise Fail "PP-error: top: badly formed block" | x::_ => x fun push (x,(Istack stk)) = stk := x::(!stk) fun pop (Istack stk) = case !stk of nil => raise Fail "PP-error: pop: badly formed block" | _::rest => stk := rest end (* The delim_stack is used to compute the size of blocks. It is a stack of indices into the token buffer. The indices only point to BBs, Es, and BRs. We push BBs and Es onto the stack until a BR is encountered. Then we compute sizes and pop. When we encounter a BR in the middle of a block, we compute the Distance_to_next_break of the previous BR in the block, if there was one. We need to be able to delete from the bottom of the delim_stack, so we use a queue, treated with a stack discipline, i.e., we only add items at the head of the queue, but can delete from the front or back of the queue. *) abstype delim_stack = Dstack of int queue with fun new_delim_stack i = Dstack(mk_queue i ~1) fun reset_delim_stack (Dstack q) = clear_queue q fun pop_delim_stack (Dstack d) = de_queue Qfront d fun pop_bottom_delim_stack (Dstack d) = de_queue Qback d fun push_delim_stack(i,Dstack d) = en_queue Qfront i d fun top_delim_stack (Dstack d) = queue_at Qfront d fun bottom_delim_stack (Dstack d) = queue_at Qback d fun delim_stack_is_empty (Dstack d) = is_empty d end type block_info = { Block_size : int ref, Block_offset : int, How_to_indent : break_style } (* Distance_to_next_break includes Number_of_blanks. Break_offset is a local offset for the break. BB represents a sequence of contiguous Begins. E represents a sequence of contiguous Ends. *) datatype pp_token = S of {String : string, Length : int} | BB of {Pblocks : block_info list ref, (* Processed *) Ublocks : block_info list ref} (* Unprocessed *) | E of {Pend : int ref, Uend : int ref} | BR of {Distance_to_next_break : int ref, Number_of_blanks : int, Break_offset : int} (* The initial values in the token buffer *) val initial_token_value = S{String = "", Length = 0} (* type ppstream = General.ppstream; *) datatype ppstream_ = PPS of {consumer : string -> unit, linewidth : int, flush : unit -> unit, the_token_buffer : pp_token array, the_delim_stack : delim_stack, the_indent_stack : indent_stack, ++ : int ref -> unit, (* increment circular buffer index *) space_left : int ref, (* remaining columns on page *) left_index : int ref, (* insertion index *) right_index : int ref, (* output index *) left_sum : int ref, (* size of strings and spaces inserted *) right_sum : int ref} (* size of strings and spaces printed *) type ppstream = ppstream_ type ppconsumer = {consumer : string -> unit, linewidth : int, flush : unit -> unit} fun mk_ppstream {consumer,linewidth,flush} = if (linewidth<5) then raise Fail "PP-error: linewidth too_small" else let val buf_size = 3*linewidth in magic( PPS{consumer = consumer, linewidth = linewidth, flush = flush, the_token_buffer = array(buf_size, initial_token_value), the_delim_stack = new_delim_stack buf_size, the_indent_stack = mk_indent_stack (), ++ = fn i => i := ((!i + 1) mod buf_size), space_left = ref linewidth, left_index = ref 0, right_index = ref 0, left_sum = ref 0, right_sum = ref 0} ) : ppstream end fun dest_ppstream(pps : ppstream) = let val PPS{consumer,linewidth,flush, ...} = magic pps in {consumer=consumer,linewidth=linewidth,flush=flush} end local val space = " " fun mk_space (0,s) = String.concat s | mk_space (n,s) = mk_space((n-1), (space::s)) val space_table = Vector.tabulate(100, fn i => mk_space(i,[])) fun nspaces n = Vector.sub(space_table, n) handle General.Subscript => if n < 0 then "" else let val n2 = n div 2 val n2_spaces = nspaces n2 val extra = if (n = (2*n2)) then "" else space in String.concat [n2_spaces, n2_spaces, extra] end in fun cr_indent (ofn, i) = ofn ("\n"^(nspaces i)) fun indent (ofn,i) = ofn (nspaces i) end (* Print a the first member of a contiguous sequence of Begins. If there are "processed" Begins, then take the first off the list. If there are no processed Begins, take the last member off the "unprocessed" list. This works because the unprocessed list is treated as a stack, the processed list as a FIFO queue. How can an item on the unprocessed list be printable? Because of what goes on in add_string. See there for details. *) fun print_BB (_,{Pblocks = ref [], Ublocks = ref []}) = raise Fail "PP-error: print_BB" | print_BB (PPS{the_indent_stack,linewidth,space_left=ref sp_left,...}, {Pblocks as ref({How_to_indent=CONSISTENT,Block_size, Block_offset}::rst), Ublocks=ref[]}) = (push ((if (!Block_size > sp_left) then ONE_PER_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); Pblocks := rst) | print_BB(PPS{the_indent_stack,linewidth,space_left=ref sp_left,...}, {Pblocks as ref({Block_size,Block_offset,...}::rst),Ublocks=ref[]}) = (push ((if (!Block_size > sp_left) then PACK_ONTO_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); Pblocks := rst) | print_BB (PPS{the_indent_stack, linewidth, space_left=ref sp_left,...}, {Ublocks,...}) = let fun pr_end_Ublock [{How_to_indent=CONSISTENT,Block_size,Block_offset}] l = (push ((if (!Block_size > sp_left) then ONE_PER_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); List.rev l) | pr_end_Ublock [{Block_size,Block_offset,...}] l = (push ((if (!Block_size > sp_left) then PACK_ONTO_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); List.rev l) | pr_end_Ublock (a::rst) l = pr_end_Ublock rst (a::l) | pr_end_Ublock _ _ = raise Fail "PP-error: print_BB: internal error" in Ublocks := pr_end_Ublock(!Ublocks) [] end (* Uend should always be 0 when print_E is called. *) fun print_E (_,{Pend = ref 0, Uend = ref 0}) = raise Fail "PP-error: print_E" | print_E (istack,{Pend, ...}) = let fun pop_n_times 0 = () | pop_n_times n = (pop istack; pop_n_times(n-1)) in pop_n_times(!Pend); Pend := 0 end (* "cursor" is how many spaces across the page we are. *) fun print_token(PPS{consumer,space_left,...}, S{String,Length}) = (consumer String; space_left := (!space_left) - Length) | print_token(ppstrm,BB b) = print_BB(ppstrm,b) | print_token(PPS{the_indent_stack,...},E e) = print_E (the_indent_stack,e) | print_token (PPS{the_indent_stack,space_left,consumer,linewidth,...}, BR{Distance_to_next_break,Number_of_blanks,Break_offset}) = (case (top the_indent_stack) of FITS => (space_left := (!space_left) - Number_of_blanks; indent (consumer,Number_of_blanks)) | (ONE_PER_LINE cursor) => let val new_cursor = cursor + Break_offset in space_left := linewidth - new_cursor; cr_indent (consumer,new_cursor) end | (PACK_ONTO_LINE cursor) => if (!Distance_to_next_break > (!space_left)) then let val new_cursor = cursor + Break_offset in space_left := linewidth - new_cursor; cr_indent(consumer,new_cursor) end else (space_left := !space_left - Number_of_blanks; indent (consumer,Number_of_blanks))) fun clear_ppstream(pps : ppstream) = let val PPS{the_token_buffer, the_delim_stack, the_indent_stack,left_sum, right_sum, left_index, right_index,space_left,linewidth,...} = magic pps val buf_size = 3*linewidth fun set i = if (i = buf_size) then () else (update(the_token_buffer,i,initial_token_value); set (i+1)) in set 0; clear_indent_stack the_indent_stack; reset_delim_stack the_delim_stack; left_sum := 0; right_sum := 0; left_index := 0; right_index := 0; space_left := linewidth end (* Move insertion head to right unless adding a BB and already at a BB, or unless adding an E and already at an E. *) fun BB_inc_right_index(PPS{the_token_buffer, right_index, ++,...})= case (the_token_buffer sub (!right_index)) of (BB _) => () | _ => ++right_index fun E_inc_right_index(PPS{the_token_buffer,right_index, ++,...})= case (the_token_buffer sub (!right_index)) of (E _) => () | _ => ++right_index fun pointers_coincide(PPS{left_index,right_index,the_token_buffer,...}) = (!left_index = !right_index) andalso (case (the_token_buffer sub (!left_index)) of (BB {Pblocks = ref [], Ublocks = ref []}) => true | (BB _) => false | (E {Pend = ref 0, Uend = ref 0}) => true | (E _) => false | _ => true) fun advance_left (ppstrm as PPS{consumer,left_index,left_sum, the_token_buffer,++,...}, instr) = let val NEG = ~1 val POS = 0 fun inc_left_sum (BR{Number_of_blanks, ...}) = left_sum := (!left_sum) + Number_of_blanks | inc_left_sum (S{Length, ...}) = left_sum := (!left_sum) + Length | inc_left_sum _ = () fun last_size [{Block_size, ...}:block_info] = !Block_size | last_size (_::rst) = last_size rst | last_size _ = raise Fail "PP-error: last_size: internal error" fun token_size (S{Length, ...}) = Length | token_size (BB b) = (case b of {Pblocks = ref [], Ublocks = ref []} => raise Fail "PP-error: BB_size" | {Pblocks as ref(_::_),Ublocks=ref[]} => POS | {Ublocks, ...} => last_size (!Ublocks)) | token_size (E{Pend = ref 0, Uend = ref 0}) = raise Fail "PP-error: token_size.E" | token_size (E{Pend = ref 0, ...}) = NEG | token_size (E _) = POS | token_size (BR {Distance_to_next_break, ...}) = !Distance_to_next_break fun loop (instr) = if (token_size instr < 0) (* synchronization point; cannot advance *) then () else (print_token(ppstrm,instr); inc_left_sum instr; if (pointers_coincide ppstrm) then () else (* increment left index *) (* When this is evaluated, we know that the left_index has not yet caught up to the right_index. If we are at a BB or an E, we can increment left_index if there is no work to be done, i.e., all Begins or Ends have been dealt with. Also, we should do some housekeeping and clear the buffer at left_index, otherwise we can get errors when left_index catches up to right_index and we reset the indices to 0. (We might find ourselves adding a BB to an "old" BB, with the result that the index is not pushed onto the delim_stack. This can lead to mangled output.) *) (case (the_token_buffer sub (!left_index)) of (BB {Pblocks = ref [], Ublocks = ref []}) => (update(the_token_buffer,!left_index, initial_token_value); ++left_index) | (BB _) => () | (E {Pend = ref 0, Uend = ref 0}) => (update(the_token_buffer,!left_index, initial_token_value); ++left_index) | (E _) => () | _ => ++left_index; loop (the_token_buffer sub (!left_index)))) in loop instr end fun begin_block (pps : ppstream) style offset = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer, the_delim_stack,left_index, left_sum, right_index, right_sum,...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then (left_index := 0; left_sum := 1; right_index := 0; right_sum := 1) else BB_inc_right_index ppstrm; case (the_token_buffer sub (!right_index)) of (BB {Ublocks, ...}) => Ublocks := {Block_size = ref (~(!right_sum)), Block_offset = offset, How_to_indent = style}::(!Ublocks) | _ => (update(the_token_buffer, !right_index, BB{Pblocks = ref [], Ublocks = ref [{Block_size = ref (~(!right_sum)), Block_offset = offset, How_to_indent = style}]}); push_delim_stack (!right_index, the_delim_stack))) end fun end_block(pps : ppstream) = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,right_index,...} = ppstrm in if (delim_stack_is_empty the_delim_stack) then print_token(ppstrm,(E{Pend = ref 1, Uend = ref 0})) else (E_inc_right_index ppstrm; case (the_token_buffer sub (!right_index)) of (E{Uend, ...}) => Uend := !Uend + 1 | _ => (update(the_token_buffer,!right_index, E{Uend = ref 1, Pend = ref 0}); push_delim_stack (!right_index, the_delim_stack))) end local fun check_delim_stack(PPS{the_token_buffer,the_delim_stack,right_sum,...}) = let fun check k = if (delim_stack_is_empty the_delim_stack) then () else case(the_token_buffer sub (top_delim_stack the_delim_stack)) of (BB{Ublocks as ref ((b as {Block_size, ...})::rst), Pblocks}) => if (k>0) then (Block_size := !right_sum + !Block_size; Pblocks := b :: (!Pblocks); Ublocks := rst; if (List.length rst = 0) then pop_delim_stack the_delim_stack else (); check(k-1)) else () | (E{Pend,Uend}) => (Pend := (!Pend) + (!Uend); Uend := 0; pop_delim_stack the_delim_stack; check(k + !Pend)) | (BR{Distance_to_next_break, ...}) => (Distance_to_next_break := !right_sum + !Distance_to_next_break; pop_delim_stack the_delim_stack; if (k>0) then check k else ()) | _ => raise Fail "PP-error: check_delim_stack.catchall" in check 0 end in fun add_break (pps : ppstream) (n, break_offset) = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,left_index, right_index,left_sum,right_sum, ++, ...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then (left_index := 0; right_index := 0; left_sum := 1; right_sum := 1) else ++right_index; update(the_token_buffer, !right_index, BR{Distance_to_next_break = ref (~(!right_sum)), Number_of_blanks = n, Break_offset = break_offset}); check_delim_stack ppstrm; right_sum := (!right_sum) + n; push_delim_stack (!right_index,the_delim_stack)) end fun flush_ppstream0(pps : ppstream) = let val ppstrm = magic pps : ppstream_ val PPS{the_delim_stack,the_token_buffer, flush, left_index,...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then () else (check_delim_stack ppstrm; advance_left(ppstrm, the_token_buffer sub (!left_index))); flush()) end end (* local *) fun flush_ppstream ppstrm = (flush_ppstream0 ppstrm; clear_ppstream ppstrm) fun add_string (pps : ppstream) s = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,consumer, right_index,right_sum,left_sum, left_index,space_left,++,...} = ppstrm fun fnl [{Block_size, ...}:block_info] = Block_size := INFINITY | fnl (_::rst) = fnl rst | fnl _ = raise Fail "PP-error: fnl: internal error" fun set(dstack,BB{Ublocks as ref[{Block_size,...}:block_info],...}) = (pop_bottom_delim_stack dstack; Block_size := INFINITY) | set (_,BB {Ublocks = ref(_::rst), ...}) = fnl rst | set (dstack, E{Pend,Uend}) = (Pend := (!Pend) + (!Uend); Uend := 0; pop_bottom_delim_stack dstack) | set (dstack,BR{Distance_to_next_break,...}) = (pop_bottom_delim_stack dstack; Distance_to_next_break := INFINITY) | set _ = raise (Fail "PP-error: add_string.set") fun check_stream () = if ((!right_sum - !left_sum) > !space_left) then if (delim_stack_is_empty the_delim_stack) then () else let val i = bottom_delim_stack the_delim_stack in if (!left_index = i) then set (the_delim_stack, the_token_buffer sub i) else (); advance_left(ppstrm, the_token_buffer sub (!left_index)); if (pointers_coincide ppstrm) then () else check_stream () end else () val slen = String.size s val S_token = S{String = s, Length = slen} in if (delim_stack_is_empty the_delim_stack) then print_token(ppstrm,S_token) else (++right_index; update(the_token_buffer, !right_index, S_token); right_sum := (!right_sum)+slen; check_stream ()) end (* Derived form. The +2 is for peace of mind *) fun add_newline (pps : ppstream) = let val PPS{linewidth, ...} = magic pps in add_break pps (linewidth+2,0) end (* Derived form. Builds a ppstream, sends pretty printing commands called in f to the ppstream, then flushes ppstream. *) fun with_pp ppconsumer ppfn = let val ppstrm = mk_ppstream ppconsumer in ppfn ppstrm; flush_ppstream0 ppstrm end handle Fail msg => (TextIO.print (">>>> Pretty-printer failure: " ^ msg ^ "\n")) fun pp_to_string linewidth ppfn ob = let val l = ref ([]:string list) fun attach s = l := (s::(!l)) in with_pp {consumer = attach, linewidth=linewidth, flush = fn()=>()} (fn ppstrm => ppfn ppstrm ob); String.concat(List.rev(!l)) end end (*#line 0.0 "$HOME/dev/sml/basic/src/Binarymap.sig"*) (* Binarymap -- applicative maps as balanced ordered binary trees *) (* From SML/NJ lib 0.2, copyright 1993 by AT&T Bell Laboratories *) (* Original implementation due to Stephen Adams, Southampton, UK *) signature Binarymap = sig type ('key, 'a) dict exception NotFound val mkDict : ('key * 'key -> order) -> ('key, 'a) dict val insert : ('key, 'a) dict * 'key * 'a -> ('key, 'a) dict val find : ('key, 'a) dict * 'key -> 'a val peek : ('key, 'a) dict * 'key -> 'a option val remove : ('key, 'a) dict * 'key -> ('key, 'a) dict * 'a val numItems : ('key, 'a) dict -> int val listItems : ('key, 'a) dict -> ('key * 'a) list val app : ('key * 'a -> unit) -> ('key,'a) dict -> unit val revapp : ('key * 'a -> unit) -> ('key,'a) dict -> unit val foldr : ('key * 'a * 'b -> 'b)-> 'b -> ('key,'a) dict -> 'b val foldl : ('key * 'a * 'b -> 'b) -> 'b -> ('key,'a) dict -> 'b val map : ('key * 'a -> 'b) -> ('key,'a) dict -> ('key, 'b) dict val transform : ('a -> 'b) -> ('key,'a) dict -> ('key, 'b) dict end (* [('key, 'a) dict] is the type of applicative maps from domain type 'key to range type 'a, or equivalently, applicative dictionaries with keys of type 'key and values of type 'a. They are implemented as ordered balanced binary trees. [mkDict ordr] returns a new, empty map whose keys have ordering ordr. [insert(m, i, v)] extends (or modifies) map m to map i to v. [find (m, k)] returns v if m maps k to v; otherwise raises NotFound. [peek(m, k)] returns SOME v if m maps k to v; otherwise returns NONE. [remove(m, k)] removes k from the domain of m and returns the modified map and the element v corresponding to k. Raises NotFound if k is not in the domain of m. [numItems m] returns the number of entries in m (that is, the size of the domain of m). [listItems m] returns a list of the entries (k, v) of keys k and the corresponding values v in m, in order of increasing key values. [app f m] applies function f to the entries (k, v) in m, in increasing order of k (according to the ordering ordr used to create the map or dictionary). [revapp f m] applies function f to the entries (k, v) in m, in decreasing order of k. [foldl f e m] applies the folding function f to the entries (k, v) in m, in increasing order of k. [foldr f e m] applies the folding function f to the entries (k, v) in m, in decreasing order of k. [map f m] returns a new map whose entries have form (k, f(k,v)), where (k, v) is an entry in m. [transform f m] returns a new map whose entries have form (k, f v), where (k, v) is an entry in m. *) (*#line 0.0 "$HOME/dev/sml/basic/src/Binarymap.sml"*) (* Binarymap -- modified for Milton ML * from SML/NJ library v. 0.2 file binary-dict.sml. * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. * See file mosml/copyrght/copyrght.att for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * *) structure Binarymap :> Binarymap = struct exception NotFound fun wt (i : int) = 3 * i datatype ('key, 'a) dict = DICT of ('key * 'key -> order) * ('key, 'a) tree and ('key, 'a) tree = E | T of {key : 'key, value : 'a, cnt : int, left : ('key, 'a) tree, right : ('key, 'a) tree} fun treeSize E = 0 | treeSize (T{cnt,...}) = cnt fun numItems (DICT(_, t)) = treeSize t local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv, left=T{key=b,value=bv,left=x,right=y,...}, right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w, right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = treeSize rl val rrn = treeSize rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = treeSize ll val lrn = treeSize lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in fun mkDict cmpKey = DICT(cmpKey, E) fun insert (DICT (cmpKey, t),x,v) = let fun ins E = T{key=x,value=v,cnt=1,left=E,right=E} | ins (T(set as {key,left,right,value,...})) = case cmpKey (key,x) of GREATER => T'(key,value,ins left,right) | LESS => T'(key,value,left,ins right) | _ => T{key=x,value=v,left=left,right=right,cnt= #cnt set} in DICT(cmpKey, ins t) end fun find (DICT(cmpKey, t), x) = let fun mem E = raise NotFound | mem (T(n as {key,left,right,...})) = case cmpKey (x,key) of GREATER => mem right | LESS => mem left | _ => #value n in mem t end fun peek arg = (SOME(find arg)) handle NotFound => NONE fun remove (DICT(cmpKey, t), x) = let fun rm E = raise NotFound | rm (set as T{key,left,right,value,...}) = (case cmpKey (key,x) of GREATER => let val (left', v) = rm left in (T'(key, value, left', right), v) end | LESS => let val (right', v) = rm right in (T'(key, value, left, right'), v) end | _ => (delete'(left,right),value)) val (newtree, valrm) = rm t in (DICT(cmpKey, newtree), valrm) end fun listItems (DICT(_, d)) = let fun d2l E res = res | d2l (T{key,value,left,right,...}) res = d2l left ((key,value) :: d2l right res) in d2l d [] end fun revapp f (DICT(_, d)) = let fun a E = () | a (T{key,value,left,right,...}) = (a right; f(key,value); a left) in a d end fun app f (DICT(_, d)) = let fun a E = () | a (T{key,value,left,right,...}) = (a left; f(key,value); a right) in a d end fun foldr f init (DICT(_, d)) = let fun a E v = v | a (T{key,value,left,right,...}) v = a left (f(key,value,a right v)) in a d init end fun foldl f init (DICT(_, d)) = let fun a E v = v | a (T{key,value,left,right,...}) v = a right (f(key,value,a left v)) in a d init end fun map f (DICT(cmpKey, d)) = let fun a E = E | a (T{key,value,left,right,cnt}) = let val left' = a left val value' = f(key,value) in T{cnt=cnt, key=key,value=value',left = left', right = a right} end in DICT(cmpKey, a d) end fun transform f (DICT(cmpKey, d)) = let fun a E = E | a (T{key,value,left,right,cnt}) = let val left' = a left in T{cnt=cnt, key=key, value=f value, left = left', right = a right} end in DICT(cmpKey, a d) end end end (*#line 0.0 "$HOME/dev/sml/basic/src/Susp.sig"*) (* Susp -- support for lazy evaluation *) signature Susp = sig type 'a susp val delay : (unit -> 'a) -> 'a susp val force : 'a susp -> 'a end (* ['a susp] is the type of lazily evaluated expressions with result type 'a. [delay (fn () => e)] creates a suspension for the expression e. The first time the suspension is forced, the expression e will be evaluated, and the result stored in the suspension. All subsequent forcing of the suspension will just return this result, so e is evaluated at most once. If the suspension is never forced, then e is never evaluated. [force su] forces the suspension su and returns the result of the expression e stored in the suspension. *) (*#line 0.0 "$HOME/dev/sml/basic/src/Susp.sml"*) (* Susp -- support for lazy evaluation 1995-05-22 *) structure Susp :> Susp = struct datatype 'a thunk = VAL of 'a | THUNK of unit -> 'a; type 'a susp = 'a thunk ref; fun delay (f : unit -> 'a) = ref (THUNK f); fun force (su : 'a susp) : 'a = case !su of VAL v => v | THUNK f => let val v = f () in su := VAL v; v end end (*#line 0.0 "$HOME/dev/sml/basic/src/Milton.sig"*) (* ========================================================================= *) (* MLton SPECIFIC FUNCTIONS *) (* Created by Joe Hurd, September 2002 *) (* ========================================================================= *) signature Milton = sig (* The ML implementation *) val ml : string (* Pointer equality using the run-time system *) (* Quotations a la Mosml *) datatype 'a frag = QUOTE of string | ANTIQUOTE of 'a (* Timing function applications a la Mosml.time *) val time : ('a -> 'b) -> 'a -> 'b (* Bring certain declarations to the top-level *) type ppstream = PP.ppstream (* Dummy versions of Mosml declarations to stop MLton barfing *) val quotation : bool ref val load : string -> unit val installPP : (ppstream -> 'a -> unit) -> unit end (*#line 0.0 "$HOME/dev/sml/basic/src/Milton.sml"*) (* ========================================================================= *) (* MLton SPECIFIC FUNCTIONS *) (* Created by Joe Hurd, September 2002 *) (* ========================================================================= *) structure Milton :> Milton = struct (* ------------------------------------------------------------------------- *) (* The ML implementation. *) (* ------------------------------------------------------------------------- *) val ml = "MLton"; (* ------------------------------------------------------------------------- *) (* Pointer equality using the run-time system. *) (* ------------------------------------------------------------------------- *) (* ------------------------------------------------------------------------- *) (* Quotations a la Mosml. *) (* ------------------------------------------------------------------------- *) datatype 'a frag = QUOTE of string | ANTIQUOTE of 'a; (* ------------------------------------------------------------------------- *) (* Timing function applications a la Mosml.time. *) (* ------------------------------------------------------------------------- *) fun time f x = let fun p t = let val s = Time.fmt 3 t in case size (List.last (String.fields (fn x => x = #".") s)) of 3 => s | 2 => s ^ "0" | 1 => s ^ "00" | _ => raise Fail "Milton.time" end val c = Timer.startCPUTimer () val r = Timer.startRealTimer () fun pt () = let val {usr, sys, ...} = Timer.checkCPUTimer c val real = Timer.checkRealTimer r in print ("User: " ^ p usr ^ " System: " ^ p sys ^ " Real: " ^ p real ^ "\n") end val y = f x handle e => (pt (); raise e) val () = pt () in y end; (* ------------------------------------------------------------------------- *) (* Bring certain declarations to the top-level. *) (* ------------------------------------------------------------------------- *) type ppstream = PP.ppstream; (* ------------------------------------------------------------------------- *) (* Dummy versions of Mosml declarations to stop MLton barfing. *) (* ------------------------------------------------------------------------- *) val quotation = ref false; val load = fn (_ : string) => (); val installPP = fn (_ : ppstream -> 'a -> unit) => (); end open Milton; (*#line 0.0 "basic/Useful.sig"*) (* ========================================================================= *) (* ML UTILITY FUNCTIONS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Useful = sig (* Exceptions, profiling and tracing *) exception ERR_EXN of {origin_function : string, message : string} exception BUG_EXN of {origin_function : string, message : string} val ERR : string -> string -> exn val BUG : string -> string -> exn val assert : bool -> exn -> unit val try : ('a -> 'b) -> 'a -> 'b val total : ('a -> 'b) -> 'a -> 'b option val can : ('a -> 'b) -> 'a -> bool val partial : exn -> ('a -> 'b option) -> 'a -> 'b val timed : ('a -> 'b) -> 'a -> real * 'b val tracing : int ref val traces : {module : string, alignment : int -> int} list ref val trace : {module : string, message : string, level : int} -> unit (* Combinators *) val C : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c val I : 'a -> 'a val K : 'a -> 'b -> 'a val N : int -> ('a -> 'a) -> 'a -> 'a val S : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c val W : ('a -> 'a -> 'b) -> 'a -> 'b val oo : ('a -> 'b) * ('c -> 'd -> 'a) -> 'c -> 'd -> 'b val ## : ('a -> 'b) * ('c -> 'd) -> 'a * 'c -> 'b * 'd (* Booleans *) val bool_to_string : bool -> string val non : ('a -> bool) -> 'a -> bool (* Pairs *) val D : 'a -> 'a * 'a val Df : ('a -> 'b) -> 'a * 'a -> 'b * 'b val fst : 'a * 'b -> 'a val snd : 'a * 'b -> 'b val pair : 'a -> 'b -> 'a * 'b val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c val uncurry : ('a -> 'b -> 'c) -> 'a * 'b -> 'c val equal : ''a -> ''a -> bool (* State transformers *) val unit : 'a -> 's -> 'a * 's val bind : ('s -> 'a * 's) -> ('a -> 's -> 'b * 's) -> 's -> 'b * 's val mmap : ('a -> 'b) -> ('s -> 'a * 's) -> 's -> 'b * 's val join : ('s -> ('s -> 'a * 's) * 's) -> 's -> 'a * 's val mwhile : ('a -> bool) -> ('a -> 's -> 'a * 's) -> 'a -> 's -> 'a * 's (* Lists: note we count elements from 0 *) val cons : 'a -> 'a list -> 'a list val append : 'a list -> 'a list -> 'a list val wrap : 'a -> 'a list val unwrap : 'a list -> 'a val first : ('a -> 'b option) -> 'a list -> 'b option val index : ('a -> bool) -> 'a list -> int option val maps : ('a -> 's -> 'b * 's) -> 'a list -> 's -> 'b list * 's val partial_maps : ('a -> 's -> 'b option * 's) -> 'a list -> 's -> 'b list * 's val enumerate : int -> 'a list -> (int * 'a) list val cartwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list val zipwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list val zip : 'a list -> 'b list -> ('a * 'b) list val unzip : ('a * 'b) list -> 'a list * 'b list val split : 'a list -> int -> 'a list * 'a list (* Subscript *) val update_nth : ('a -> 'a) -> int -> 'a list -> 'a list (* Subscript *) (* Lists-as-sets *) val mem : ''a -> ''a list -> bool val insert : ''a -> ''a list -> ''a list val delete : ''a -> ''a list -> ''a list val union : ''a list -> ''a list -> ''a list val intersect : ''a list -> ''a list -> ''a list val subtract : ''a list -> ''a list -> ''a list val setify : ''a list -> ''a list val subset : ''a list -> ''a list -> bool val distinct : ''a list -> bool (* Comparisons *) val lex_compare : ('a * 'a -> order) -> ('a * 'a) list -> order (* Sorting and searching *) val min : ('a -> 'a -> bool) -> 'a list -> 'a val merge : ('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list val sort : ('a -> 'a -> bool) -> 'a list -> 'a list (* Integers *) val int_to_string : int -> string val string_to_int : string -> int (* Overflow, Option *) val int_to_bits : int -> bool list val bits_to_int : bool list -> int (* Overflow *) val interval : int -> int -> int list val divides : int -> int -> bool val primes : int -> int list (* Strings *) val variant : string -> string list -> string val variant_num : string -> string list -> string val dest_prefix : string -> string -> string val is_prefix : string -> string -> bool val mk_prefix : string -> string -> string (* Reals *) val real_to_string : real -> string; (* Pretty-printing *) type 'a pp = ppstream -> 'a -> unit val LINE_LENGTH : int ref val unit_pp : 'a pp -> 'a -> unit pp val pp_unit_pp : unit pp pp val pp_map : ('a -> 'b) -> 'b pp -> 'a pp val pp_bracket : string * string -> 'a pp -> 'a pp val pp_sequence : string -> 'a pp -> 'a list pp val pp_unop : string -> 'a pp -> 'a pp val pp_binop : string -> 'a pp -> 'b pp -> ('a * 'b) pp val pp_nothing : 'a pp val pp_string : string pp val pp_unit : unit pp val pp_bool : bool pp val pp_int : int pp val pp_real : real pp val pp_order : order pp val pp_list : 'a pp -> 'a list pp val pp_pair : 'a pp -> 'b pp -> ('a * 'b) pp val pp_triple : 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp val pp_record : (string * unit pp) list -> unit pp val pp_option : 'a pp -> 'a option pp (* Sum datatype *) datatype ('a, 'b) sum = INL of 'a | INR of 'b val is_inl : ('a, 'b) sum -> bool val is_inr : ('a, 'b) sum -> bool (* Maplets *) datatype ('a, 'b) maplet = |-> of 'a * 'b val pp_maplet : 'a pp -> 'b pp -> ('a, 'b) maplet pp (* Trees *) datatype ('a, 'b) tree = BRANCH of 'a * ('a, 'b) tree list | LEAF of 'b val tree_size : ('a, 'b) tree -> int val tree_foldr : ('a -> 'c list -> 'c) -> ('b -> 'c) -> ('a, 'b) tree -> 'c val tree_foldl : ('a -> 'c -> 'c) -> ('b -> 'c -> 'd) -> 'c -> ('a, 'b) tree -> 'd list val tree_partial_foldl : ('a -> 'c -> 'c option) -> ('b -> 'c -> 'd option) -> 'c -> ('a, 'b) tree -> 'd list (* Useful imperative features *) val lazify_thunk : (unit -> 'a) -> unit -> 'a val new_int : unit -> int val new_ints : int -> int list val with_flag : 'r ref * ('r -> 'r) -> ('a -> 'b) -> 'a -> 'b (* Information about the environment *) val host : string val date : unit -> string end (*#line 0.0 "basic/Useful.sml"*) (* ========================================================================= *) (* ML UTILITY FUNCTIONS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) structure Useful :> Useful = struct infixr 0 oo ## |->; (* ------------------------------------------------------------------------- *) (* Exceptions, profiling and tracing. *) (* ------------------------------------------------------------------------- *) exception ERR_EXN of {origin_function : string, message : string}; exception BUG_EXN of {origin_function : string, message : string}; fun ERR f s = ERR_EXN {origin_function = f, message = s}; fun BUG f s = BUG_EXN {origin_function = f, message = s}; fun ERR_to_string (ERR_EXN {origin_function, message}) = "\nERR in function " ^ origin_function ^ ":\n" ^ message ^ "\n" | ERR_to_string _ = raise BUG "ERR_to_string" "not a ERR_EXN"; fun BUG_to_string (BUG_EXN {origin_function, message}) = "\nBUG in function " ^ origin_function ^ ":\n" ^ message ^ "\n" | BUG_to_string _ = raise BUG "BUG_to_string" "not a BUG_EXN"; fun assert b e = if b then () else raise e; fun try f a = f a handle h as ERR_EXN _ => (print (ERR_to_string h); raise h) | b as BUG_EXN _ => (print (BUG_to_string b); raise b) | e => (print "\ntry: strange exception raised\n"; raise e); fun total f x = SOME (f x) handle ERR_EXN _ => NONE; fun can f = Option.isSome o total f; fun partial (e as ERR_EXN _) f x = (case f x of SOME y => y | NONE => raise e) | partial _ _ _ = raise BUG "partial" "must take a ERR_EXN"; fun timed f a = let val tmr = Timer.startCPUTimer () val res = f a val {usr, sys, ...} = Timer.checkCPUTimer tmr in (Time.toReal usr + Time.toReal sys, res) end; val tracing = ref 1; val traces : {module : string, alignment : int -> int} list ref = ref []; local val MAX = 10; val trace_printer = print; fun query m l = let val t = List.find (fn {module, ...} => module = m) (!traces) in case t of NONE => MAX | SOME {alignment, ...} => alignment l end; in fun trace {module = m, message = s, level = l} = if 0 < !tracing andalso (MAX <= !tracing orelse query m l <= !tracing) then trace_printer s else (); end; (* ------------------------------------------------------------------------- *) (* Combinators *) (* ------------------------------------------------------------------------- *) fun C f x y = f y x; fun I x = x; fun K x y = x; fun N 0 _ x = x | N n f x = N (n - 1) f (f x); fun S f g x = f x (g x); fun W f x = f x x; fun f oo g = fn x => f o (g x); (* ------------------------------------------------------------------------- *) (* Booleans *) (* ------------------------------------------------------------------------- *) fun bool_to_string true = "true" | bool_to_string false = "false"; fun non f = not o f; (* ------------------------------------------------------------------------- *) (* Pairs *) (* ------------------------------------------------------------------------- *) fun op## (f, g) (x, y) = (f x, g y); fun D x = (x, x); fun Df f = f ## f; fun fst (x,_) = x; fun snd (_,y) = y; fun pair x y = (x, y) (* Note: val add_fst = pair and add_snd = C pair; *) fun curry f x y = f (x, y); fun uncurry f (x, y) = f x y; fun equal x y = (x = y); (* ------------------------------------------------------------------------- *) (* State transformers. *) (* ------------------------------------------------------------------------- *) val unit : 'a -> 's -> 'a * 's = pair; fun bind f (g : 'a -> 's -> 'b * 's) = uncurry g o f; fun mmap f (m : 's -> 'a * 's) = bind m (unit o f); fun join (f : 's -> ('s -> 'a * 's) * 's) = bind f I; fun mwhile c b = let fun f a = if c a then bind (b a) f else unit a in f end; (* ------------------------------------------------------------------------- *) (* Lists. *) (* ------------------------------------------------------------------------- *) fun cons x y = x :: y; fun append xs ys = xs @ ys; fun wrap a = [a]; fun unwrap [a] = a | unwrap _ = raise ERR "unwrap" "not a singleton"; fun first f [] = NONE | first f (x :: xs) = (case f x of NONE => first f xs | s => s); fun index p = let fun idx _ [] = NONE | idx n (x :: xs) = if p x then SOME n else idx (n + 1) xs in idx 0 end; (* This is the pure version fun maps (_ : 'a -> 's -> 'b * 's) [] = unit [] | maps f (x :: xs) = bind (f x) (fn y => bind (maps f xs) (fn ys => unit (y :: ys))); *) (* This is an optimized version *) fun maps f = let fun g (x, (ys, s)) = let val (y, s) = f x s in (y :: ys, s) end in fn l => fn (s : 's) => (rev ## I) (foldl g ([], s) l) end; (* This is the pure version fun partial_maps (_ : 'a -> 's -> 'b option * 's) [] = unit [] | partial_maps f (x :: xs) = bind (f x) (fn yo => bind (partial_maps f xs) (fn ys => unit (case yo of NONE => ys | SOME y => y :: ys))); *) (* This is an optimized version *) fun partial_maps f = let fun g (x, (ys, s)) = let val (yo, s) = f x s in (case yo of NONE => ys | SOME y => y :: ys, s) end in fn l => fn (s : 's) => (rev ## I) (foldl g ([], s) l) end; fun enumerate n = fst o C (maps (fn x => fn m => ((m, x), m + 1))) n; fun zipwith f = let fun z l [] [] = l | z l (x :: xs) (y :: ys) = z (f x y :: l) xs ys | z _ _ _ = raise ERR "zipwith" "lists different lengths"; in fn xs => fn ys => rev (z [] xs ys) end; fun zip xs ys = zipwith pair xs ys; fun unzip ab = foldl (fn ((x, y), (xs, ys)) => (x :: xs, y :: ys)) ([], []) (rev ab); fun cartwith f = let fun aux _ res _ [] = res | aux xs_copy res [] (y :: yt) = aux xs_copy res xs_copy yt | aux xs_copy res (x :: xt) (ys as y :: _) = aux xs_copy (f x y :: res) xt ys in fn xs => fn ys => let val xs' = rev xs in aux xs' [] xs' (rev ys) end end; local fun aux res l 0 = (rev res, l) | aux _ [] _ = raise Subscript | aux res (h :: t) n = aux (h :: res) t (n - 1); in fun split l n = aux [] l n; end; fun update_nth f n l = let val (a, b) = split l n in case b of [] => raise Subscript | h :: t => a @ (f h :: t) end; (* ------------------------------------------------------------------------- *) (* Lists-as-sets. *) (* ------------------------------------------------------------------------- *) fun mem x = List.exists (equal x); fun insert x s = if mem x s then s else x :: s; fun delete x s = List.filter (not o equal x) s; (* Removes duplicates *) fun setify s = foldl (fn (v, x) => if mem v x then x else v :: x) [] s; (* For all three set operations: if s has duplicates, so may the result. *) fun union s t = foldl (fn (v, x) => if mem v x then x else v :: x) s t; fun intersect s t = foldl (fn (v, x) => if mem v t then v :: x else x) [] s; fun subtract s t = foldl (fn (v, x) => if mem v t then x else v :: x) [] s; fun subset s t = List.all (fn x => mem x t) s; fun distinct [] = true | distinct (x :: rest) = not (mem x rest) andalso distinct rest; (* ------------------------------------------------------------------------- *) (* Comparisons. *) (* ------------------------------------------------------------------------- *) fun lex_compare f = let fun lex [] = EQUAL | lex (x :: l) = case f x of EQUAL => lex l | y => y in lex end; (* ------------------------------------------------------------------------- *) (* Finding the minimal element of a list, wrt some order. *) (* ------------------------------------------------------------------------- *) fun min f = let fun min_acc best [] = best | min_acc best (h :: t) = min_acc (if f best h then best else h) t in fn [] => raise ERR "min" "empty list" | h :: t => min_acc h t end; (* ------------------------------------------------------------------------- *) (* Merge (for the following merge-sort, but generally useful too). *) (* ------------------------------------------------------------------------- *) fun merge f = let fun mrg res [] ys = foldl (op ::) ys res | mrg res xs [] = foldl (op ::) xs res | mrg res (xs as x :: xt) (ys as y :: yt) = if f x y then mrg (x :: res) xt ys else mrg (y :: res) xs yt in mrg [] end; (* ------------------------------------------------------------------------- *) (* Order function here should be <= for a stable sort... *) (* ...and I think < gives a reverse stable sort (but don't quote me). *) (* ------------------------------------------------------------------------- *) fun sort f = let fun srt [] = [] | srt (l as [x]) = l | srt l = let val halfway = length l div 2 in merge f (srt (List.take (l, halfway))) (srt (List.drop (l, halfway))) end in srt end; (* ------------------------------------------------------------------------- *) (* Integers. *) (* ------------------------------------------------------------------------- *) val int_to_string = Int.toString; val string_to_int = Option.valOf o Int.fromString; fun int_to_bits 0 = [] | int_to_bits n = (n mod 2 <> 0) :: (int_to_bits (n div 2)); fun bits_to_int [] = 0 | bits_to_int (h :: t) = (if h then curry op+ 1 else I) (2 * bits_to_int t); fun interval m 0 = [] | interval m len = m :: interval (m + 1) (len - 1); fun divides a b = if a = 0 then b = 0 else b mod (Int.abs a) = 0; local fun both f g n = f n andalso g n; fun next f = let fun nx x = if f x then x else nx (x + 1) in nx end; fun looking res 0 _ _ = rev res | looking res n f x = let val p = next f x val res' = p :: res val f' = both f (not o divides p) in looking res' (n - 1) f' (p + 1) end in fun primes n = looking [] n (K true) 2 end; (* ------------------------------------------------------------------------- *) (* Strings. *) (* ------------------------------------------------------------------------- *) fun variant x vars = if mem x vars then variant (x ^ "'") vars else x; fun variant_num x vars = let fun xn n = x ^ int_to_string n fun v n = let val x' = xn n in if mem x' vars then v (n + 1) else x' end in if mem x vars then v 1 else x end; fun dest_prefix p = let fun check s = assert (String.isPrefix p s) (ERR "dest_prefix" "") val size_p = size p in fn s => (check s; String.extract (s, size_p, NONE)) end; fun is_prefix p = can (dest_prefix p); fun mk_prefix p s = p ^ s; (* ------------------------------------------------------------------------- *) (* Reals. *) (* ------------------------------------------------------------------------- *) val real_to_string = Real.toString; (* ------------------------------------------------------------------------- *) (* Pretty-printing. *) (* ------------------------------------------------------------------------- *) type 'a pp = ppstream -> 'a -> unit; val LINE_LENGTH = ref 75; fun unit_pp pp_a a pp () = pp_a pp a; fun pp_unit_pp pp upp = upp pp (); fun pp_map f pp_a (ppstrm : ppstream) x : unit = pp_a ppstrm (f x); fun pp_bracket (l, r) pp_a pp a = (PP.begin_block pp PP.INCONSISTENT (size l); PP.add_string pp l; pp_a pp a; PP.add_string pp r; PP.end_block pp); fun pp_sequence sep pp_a = let fun pp_elt pp x = (PP.add_string pp sep; PP.add_break pp (1, 0); pp_a pp x) fun pp_seq pp [] = () | pp_seq pp (h :: t) = (pp_a pp h; app (pp_elt pp) t) in fn pp => fn l => (PP.begin_block pp PP.INCONSISTENT 0; pp_seq pp l; PP.end_block pp) end; fun pp_unop s pp_a pp a = (PP.begin_block pp PP.CONSISTENT 0; PP.add_string pp s; PP.add_break pp (1, 0); pp_a pp a; PP.end_block pp); fun pp_binop s pp_a pp_b pp (a, b) = (PP.begin_block pp PP.CONSISTENT 0; pp_a pp a; PP.add_string pp s; PP.add_break pp (1, 0); pp_b pp b; PP.end_block pp); fun pp_nothing pp _ = (PP.begin_block pp PP.CONSISTENT 0; PP.end_block pp); fun pp_string pp s = (PP.begin_block pp PP.CONSISTENT 0; PP.add_string pp s; PP.end_block pp); val pp_unit = fn z => (pp_map (K "()") pp_string) z; val pp_bool = pp_map bool_to_string pp_string; val pp_int = pp_map int_to_string pp_string; val pp_real = pp_map real_to_string pp_string; val pp_order = pp_map (fn LESS => "LESS" | EQUAL => "EQUAL" | GREATER => "GREATER") pp_string; fun pp_list pp_a = pp_bracket ("[", "]") (pp_sequence "," pp_a); fun pp_pair pp_a pp_b = pp_bracket ("(", ")") (pp_binop "," pp_a pp_b); fun pp_triple pp_a pp_b pp_c = pp_bracket ("(", ")") (pp_map (fn (a, b, c) => (a, (b, c))) (pp_binop "," pp_a (pp_binop "," pp_b pp_c))); local val pp_l = fn z => (pp_sequence "," (pp_binop " =" pp_string pp_unit_pp)) z; in fun pp_record l = pp_bracket ("{", "}") (unit_pp pp_l l); end; fun pp_option pp_a pp NONE = pp_string pp "NONE" | pp_option pp_a pp (SOME a) = pp_unop "SOME" pp_a pp a; (* ------------------------------------------------------------------------- *) (* Sums. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) sum = INL of 'a | INR of 'b fun is_inl (INL _) = true | is_inl (INR _) = false; fun is_inr (INR _) = true | is_inr (INL _) = false; (* ------------------------------------------------------------------------- *) (* Maplets. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) maplet = |-> of 'a * 'b; fun pp_maplet pp_a pp_b = pp_map (fn a |-> b => (a, b)) (pp_binop " |->" pp_a pp_b); (* ------------------------------------------------------------------------- *) (* Trees. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) tree = BRANCH of 'a * ('a, 'b) tree list | LEAF of 'b; fun tree_size (LEAF _) = 1 | tree_size (BRANCH (_, t)) = foldl (op+ o (tree_size ## I)) 1 t; fun tree_foldr f_b f_l (LEAF l) = f_l l | tree_foldr f_b f_l (BRANCH (p, s)) = f_b p (map (tree_foldr f_b f_l) s); fun tree_foldl f_b f_l = let fun fold state (LEAF l, res) = f_l l state :: res | fold state (BRANCH (p, ts), res) = foldl (fold (f_b p state)) res ts in fn state => fn t => fold state (t, []) end; fun tree_partial_foldl f_b f_l = let fun fold state (LEAF l, res) = (case f_l l state of NONE => res | SOME x => x :: res) | fold state (BRANCH (p, ts), res) = (case f_b p state of NONE => res | SOME s => foldl (fold s) res ts) in fn state => fn t => fold state (t, []) end; (* ------------------------------------------------------------------------- *) (* Useful imperative features. *) (* ------------------------------------------------------------------------- *) fun lazify_thunk f = let val s = Susp.delay f in fn () => Susp.force s end; local val generator = ref 0 in fun new_int () = let val n = !generator val () = generator := n + 1 in n end; fun new_ints 0 = [] | new_ints k = let val n = !generator val () = generator := n + k in interval n k end; end; fun with_flag (r, update) f x = let val old = !r val () = r := update old val y = f x handle e => (r := old; raise e) val () = r := old in y end; (* ------------------------------------------------------------------------- *) (* Information about the environment. *) (* ------------------------------------------------------------------------- *) val host = Option.getOpt (OS.Process.getEnv "HOSTNAME", "unknown"); val date = Date.fmt "%H:%M:%S %d/%m/%Y" o Date.fromTimeLocal o Time.now; end (*#line 0.0 "basic/Queue.sig"*) (* ========================================================================= *) (* A QUEUE DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* ========================================================================= *) signature Queue = sig type 'a queue val empty : 'a queue val add : 'a -> 'a queue -> 'a queue val is_empty : 'a queue -> bool val hd : 'a queue -> 'a (* raises Empty *) val tl : 'a queue -> 'a queue (* raises Empty *) val length : 'a queue -> int val from_list : 'a list -> 'a queue val to_list : 'a queue -> 'a list val pp_queue : 'a Useful.pp -> 'a queue Useful.pp end (*#line 0.0 "basic/Queue.sml"*) (* ========================================================================= *) (* A QUEUE DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* ========================================================================= *) structure Queue :> Queue = struct type 'a queue = 'a list * 'a list; val empty : 'a queue = ([], []); fun norm ([], ys as _ :: _) = (rev ys, []) | norm q = q; fun add z (xs, ys) = norm (xs, z :: ys); fun is_empty ([], _) = true | is_empty (_ :: _, _) = false; fun hd ([], _) = raise Empty | hd (x :: _, _) = x; fun tl ([], _) = raise Empty | tl (_ :: xs, ys) = norm (xs, ys); val length = fn (xs, ys) => length xs + length ys; fun from_list l = (rev l, []); fun to_list (xs, ys) = xs @ rev ys; local open Useful; in fun pp_queue pp_a = pp_map to_list (pp_bracket ("Q[", "]") (pp_sequence "," pp_a)); end; end (*#line 0.0 "basic/Heap.sig"*) (* ========================================================================= *) (* A HEAP DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* Taken from Purely Functional Data Structures, by Chris Okasaki. *) (* ========================================================================= *) signature Heap = sig type 'a heap val empty : ('a * 'a -> order) -> 'a heap val add : 'a -> 'a heap -> 'a heap val is_empty : 'a heap -> bool val top : 'a heap -> 'a (* raises Empty *) val remove : 'a heap -> 'a * 'a heap (* raises Empty *) val size : 'a heap -> int val app : ('a -> unit) -> 'a heap -> unit val to_list : 'a heap -> 'a list val pp_heap : 'a Useful.pp -> 'a heap Useful.pp end (*#line 0.0 "basic/Heap.sml"*) (* ========================================================================= *) (* A HEAP DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* Taken from Purely Functional Data Structures, by Chris Okasaki. *) (* ========================================================================= *) (* *) structure Heap :> Heap = struct datatype 'a node = E | T of int * 'a * 'a node * 'a node; datatype 'a heap = Heap of ('a * 'a -> order) * int * 'a node; fun rank E = 0 | rank (T (r, _, _, _)) = r; fun makeT (x, a, b) = if rank a >= rank b then T (rank b + 1, x, a, b) else T (rank a + 1, x, b, a); fun merge f = let fun mrg (h, E) = h | mrg (E, h) = h | mrg (h1 as T (_, x, a1, b1), h2 as T (_, y, a2, b2)) = (case f (x, y) of GREATER => makeT (y, a2, mrg (h1, b2)) | _ => makeT (x, a1, mrg (b1, h2))) in mrg end; fun empty f = Heap (f, 0, E); fun add x (Heap (f, n, a)) = Heap (f, n + 1, merge f (T (1, x, E, E), a)); fun is_empty (Heap (_, _, E)) = true | is_empty (Heap (_, _, T _)) = false; fun top (Heap (_, _, E)) = raise Empty | top (Heap (_, _, T (_, x, _, _))) = x; fun remove (Heap (_, _, E)) = raise Empty | remove (Heap (f, n, T (_, x, a, b))) = (x, Heap (f, n - 1, merge f (a, b))); fun size (Heap (_, n, _)) = n; fun app f = let fun ap [] = () | ap (E :: rest) = ap rest | ap (T (_, d, a, b) :: rest) = (f d; ap (a :: b :: rest)) in fn Heap (_, _, a) => ap [a] end; local fun to_lst res h = if is_empty h then rev res else let val (x, h) = remove h in to_lst (x :: res) h end; in fun to_list h = to_lst [] h; end; local open Useful; in fun pp_heap pp_a = pp_map to_list (pp_bracket ("H[", "]") (pp_sequence "," pp_a)); end; end (*#line 0.0 "basic/Multiset.sig"*) (* ========================================================================= *) (* A MULTISET DATATYPE FOR ML *) (* Created by Joe Hurd, July 2002 *) (* ========================================================================= *) signature Multiset = sig type 'a mset val empty : ('a * 'a -> order) -> 'a mset val insert : 'a * int -> 'a mset -> 'a mset val count : 'a mset -> 'a -> int val union : 'a mset -> 'a mset -> 'a mset val compl : 'a mset -> 'a mset val subtract : 'a mset -> 'a mset -> 'a mset val subset : 'a mset -> 'a mset -> bool val compare : 'a mset * 'a mset -> order option val app : ('a * int -> unit) -> 'a mset -> unit val to_list : 'a mset -> ('a * int) list val pp_mset : 'a Useful.pp -> 'a mset Useful.pp end (*#line 0.0 "basic/Multiset.sml"*) (* ========================================================================= *) (* A MULTISET DATATYPE FOR ML *) (* Created by Joe Hurd, July 2002 *) (* ========================================================================= *) (* List.app load ["Binarymap", "Useful"]; *) (* *) structure Multiset :> Multiset = struct structure M = Binarymap; fun Mpurge m k = let val (m, _) = M.remove (m, k) in m end; fun Mall p = let exception Cut fun f (x, y, ()) = if p (x, y) then () else raise Cut in fn a => (M.foldl f () a; true) handle Cut => false end; type 'a mset = ('a, int) M.dict; fun empty ord : 'a mset = M.mkDict ord; fun insert (_, 0) a = a | insert (x, n) a = (case M.peek (a, x) of NONE => M.insert (a, x, n) | SOME n' => let val n'' = n + n' in if n'' = 0 then Mpurge a x else M.insert (a, x, n'') end); fun count m x = case M.peek (m, x) of SOME n => n | NONE => 0; local fun un a b = M.foldl (fn (x : 'a, n : int, d) => insert (x, n) d) a b; in fun union a b = if M.numItems a < M.numItems b then un b a else un a b; end; fun compl a : 'a mset = M.transform ~ a; fun subtract a b = union a (compl b); local fun sign a = (Mall (fn (_, n) => 0 <= n) a, Mall (fn (_, n) => n <= 0) a); in fun compare (a, b) = (case sign (subtract a b) of (true, true) => SOME EQUAL | (true, false) => SOME GREATER | (false, true) => SOME LESS | (false, false) => NONE); end; fun subset a b = (case compare (a, b) of SOME LESS => true | SOME EQUAL => true | _ => false); fun app f (a : 'a mset) = M.app f a; fun to_list (a : 'a mset) = M.listItems a; local open Useful; in fun pp_mset pp_a = pp_map (map Useful.|-> o to_list) (pp_bracket ("M[", "]") (pp_sequence "," (Useful.pp_maplet pp_a pp_int))); end; end (*#line 0.0 "basic/Stream.sig"*) (* ========================================================================= *) (* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Stream = sig datatype 'a stream = NIL | CONS of 'a * (unit -> 'a stream) type 'a Sthk = unit -> 'a stream (* If you're wondering how to create an infinite stream: *) (* val stream4 = let fun s4 () = CONS 4 s4 in s4 () end; *) val cons : 'a -> (unit -> 'a stream) -> 'a stream val null : 'a stream -> bool val hd : 'a stream -> 'a (* raises Empty *) val tl : 'a stream -> 'a stream (* raises Empty *) val dest : 'a stream -> 'a * 'a stream (* raises Empty *) val repeat : 'a -> 'a stream val count : int -> int stream val fold : ('a -> (unit -> 'b) -> 'b) -> 'b -> 'a stream -> 'b val map : ('a -> 'b) -> 'a stream -> 'b stream val map_thk : ('a Sthk -> 'a Sthk) -> 'a Sthk -> 'a Sthk val partial_map : ('a -> 'b option) -> 'a stream -> 'b stream val maps : ('a -> 'c -> 'b * 'c) -> 'c -> 'a stream -> 'b stream val partial_maps : ('a -> 'c -> 'b option * 'c) -> 'c -> 'a stream -> 'b stream val filter : ('a -> bool) -> 'a stream -> 'a stream val flatten : 'a stream stream -> 'a stream val zipwith : ('a -> 'b -> 'c) -> 'a stream -> 'b stream -> 'c stream val zip : 'a stream -> 'b stream -> ('a * 'b) stream val take : int -> 'a stream -> 'a stream (* raises Subscript *) val drop : int -> 'a stream -> 'a stream (* raises Subscript *) val to_list : 'a stream -> 'a list val from_list : 'a list -> 'a stream val from_textfile : string -> string stream (* lines of the file *) end (*#line 0.0 "basic/Stream.sml"*) (* ========================================================================= *) (* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) structure Stream :> Stream = struct open Useful; infixr 0 oo ##; (* ------------------------------------------------------------------------- *) (* The datatype declaration encapsulates all the primitive operations. *) (* ------------------------------------------------------------------------- *) datatype 'a stream = NIL | CONS of 'a * (unit -> 'a stream); type 'a Sthk = unit -> 'a stream; (* ------------------------------------------------------------------------- *) (* Useful functions. *) (* ------------------------------------------------------------------------- *) val cons = fn z => curry CONS z; fun null NIL = true | null (CONS _) = false; fun hd NIL = raise Empty | hd (CONS (h, _)) = h; fun tl NIL = raise Empty | tl (CONS (_, t)) = t (); fun dest s = (hd s, tl s); fun repeat x = let fun rep () = CONS (x, rep) in rep () end; fun count n = CONS (n, fn () => count (n + 1)); fun fold b c = let fun f NIL = c | f (CONS (x, xs)) = b x (fn () => f (xs ())) in f end; fun map f = let fun m NIL = NIL | m (CONS (h, t)) = CONS (f h, fn () => m (t ())) in m end; fun map_thk f = let fun mt NIL = NIL | mt (CONS (h, t)) = CONS (h, mt' t) and mt' t = f (fn () => mt (t ())) in mt' end; fun partial_map f = let fun mp NIL = NIL | mp (CONS (h, t)) = case f h of NONE => mp (t ()) | SOME h' => CONS (h', fn () => mp (t ())) in mp end; fun maps f = let fun mm _ NIL = NIL | mm s (CONS (x, xs)) = let val (y, s') = f x s in CONS (y, fn () => mm s' (xs ())) end in mm end; fun partial_maps f = let fun mm _ NIL = NIL | mm s (CONS (x, xs)) = let val (yo, s') = f x s val t = mm s' o xs in case yo of NONE => t () | SOME y => CONS (y, t) end in mm end; fun filter f = partial_map (fn x => if f x then SOME x else NONE); fun flatten NIL = NIL | flatten (CONS (NIL, ss)) = flatten (ss ()) | flatten (CONS (CONS (x, xs), ss)) = CONS (x, fn () => flatten (CONS (xs (), ss))); fun zipwith f = let fun z NIL _ = NIL | z _ NIL = NIL | z (CONS (x, xs)) (CONS (y, ys)) = CONS (f x y, fn () => z (xs ()) (ys ())) in z end; fun zip s t = zipwith pair s t; fun take 0 s = NIL | take n NIL = raise Subscript | take 1 (CONS (x, _)) = CONS (x, K NIL) | take n (CONS (x, xs)) = CONS (x, fn () => take (n - 1) (xs ())); fun drop n s = N n tl s handle Empty => raise Subscript; local fun to_lst res NIL = res | to_lst res (CONS (x, xs)) = to_lst (x :: res) (xs ()); in val to_list = fn z => (rev o to_lst []) z end; fun from_list [] = NIL | from_list (x :: xs) = CONS (x, fn () => from_list xs); fun from_textfile filename = let open TextIO val fh = openIn filename fun res () = case inputLine fh of NONE => (closeIn fh; NIL) | SOME s => CONS (s, lazify_thunk res) in res () end; end (*#line 0.0 "basic/Parser.sig"*) (* ========================================================================= *) (* PARSER COMBINATORS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Parser = sig (* Recommended fixities infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; *) type 'a pp = 'a Useful.pp type 'a stream = 'a Stream.stream (* Generic *) exception Noparse val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a val atleastone : ('a -> 'b * 'a) -> 'a -> 'b list * 'a val nothing : 'a -> unit * 'a val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a (* Stream-based *) type ('a, 'b) parser = 'a stream -> 'b * 'a stream val maybe : ('a -> 'b option) -> ('a, 'b) parser val finished : ('a, unit) parser val some : ('a -> bool) -> ('a, 'a) parser val any : ('a, 'a) parser val exact : ''a -> (''a, ''a) parser (* Parsing and pretty-printing for infix operators *) type infixities = {tok : string, prec : int, left_assoc : bool} list type 'a con = string * 'a * 'a -> 'a type 'a des = 'a -> (string * 'a * 'a) option type 'a iparser = (string, 'a) parser type 'a iprinter = ('a * bool) pp val optoks : infixities -> string list val parse_left_infix : string list -> 'a con -> 'a iparser -> 'a iparser val parse_right_infix : string list -> 'a con -> 'a iparser -> 'a iparser val parse_infixes : infixities -> 'a con -> 'a iparser -> 'a iparser val pp_left_infix : string list -> 'a des -> 'a iprinter -> 'a iprinter val pp_right_infix : string list -> 'a des -> 'a iprinter -> 'a iprinter val pp_infixes : infixities -> 'a des -> 'a iprinter -> 'a iprinter (* Lexing *) val space : char -> bool val digit : char -> bool val lower : char -> bool val upper : char -> bool val alpha : char -> bool val alphanum : char -> bool (* alpha + digit + _ + ' *) val symbol : char -> bool (* <>=-*+/\?@|!$%&~#^: *) val punct : char -> bool (* ()[]{}.,; *) (* Quotations *) type 'a quotation = 'a frag list val quotation_parser : (string -> 'a) -> 'b pp -> 'b quotation -> 'a end (*#line 0.0 "basic/Parser.sml"*) (* ========================================================================= *) (* PARSER COMBINATORS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) (* app load ["Useful", "Stream"]; *) (* *) structure Parser :> Parser = struct open Useful; structure S = Stream; infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; infix ##; type 'a stream = 'a Stream.stream; val omap = Option.map; (* ------------------------------------------------------------------------- *) (* Generic. *) (* ------------------------------------------------------------------------- *) exception Noparse; fun op ++ (parser1, parser2) input = let val (result1, rest1) = parser1 input val (result2, rest2) = parser2 rest1 in ((result1, result2), rest2) end; fun op >> (parser, treatment) input = let val (result, rest) = parser input in (treatment result, rest) end; fun op >>++ (parser, treatment) input = let val (result, rest) = parser input in treatment result rest end; fun op || (parser1, parser2) input = parser1 input handle Noparse => parser2 input; fun many parser input = let val (result, next) = parser input val (results, rest) = many parser next in ((result :: results), rest) end handle Noparse => ([], input); fun atleastone p = (p ++ many p) >> op::; fun nothing input = ((), input); fun optional p = (p >> SOME) || (nothing >> K NONE); (* ------------------------------------------------------------------------- *) (* Stream-based. *) (* ------------------------------------------------------------------------- *) type ('a, 'b) parser = 'a stream -> 'b * 'a stream fun maybe p S.NIL = raise Noparse | maybe p (S.CONS (h, t)) = case p h of SOME r => (r, t ()) | NONE => raise Noparse; fun finished S.NIL = ((), S.NIL) | finished (S.CONS _) = raise Noparse; val finished: ('a, unit) parser = finished fun some p = maybe (fn x => if p x then SOME x else NONE); fun any input = some (K true) input; fun exact tok = some (fn item => item = tok); (* ------------------------------------------------------------------------- *) (* Parsing and pretty-printing for infix operators. *) (* ------------------------------------------------------------------------- *) type infixities = {tok : string, prec : int, left_assoc : bool} list; type 'a con = string * 'a * 'a -> 'a; type 'a des = 'a -> (string * 'a * 'a) option; type 'a iparser = (string, 'a) parser; type 'a iprinter = ('a * bool) pp; local val sort_ops : infixities -> infixities = let fun order {prec, tok = _, left_assoc = _} {prec = prec', tok = _, left_assoc = _} = prec < prec' in sort order end; fun unflatten ({tok, prec, left_assoc}, ([], _)) = ([(left_assoc, [tok])], prec) | unflatten ({tok, prec, left_assoc}, ((a, l) :: dealt, p)) = if p = prec then (assert (left_assoc = a) (BUG "infix parser/printer" "mixed assocs"); ((a, tok :: l) :: dealt, p)) else ((left_assoc, [tok]) :: (a, l) :: dealt, prec); in val layerops = fst o foldl unflatten ([], 0) o sort_ops; end; local fun chop (#" " :: chs) = (curry op+ 1 ## I) (chop chs) | chop chs = (0, chs); fun nspaces n = N n (curry op^ " ") ""; fun spacify tok = let val chs = explode tok val (r, chs) = chop (rev chs) val (l, chs) = chop (rev chs) in ((l, r), implode chs) end; fun lrspaces (l, r) = (if l = 0 then K () else C PP.add_string (nspaces l), if r = 0 then K () else C PP.add_break (r, 0)); in val op_spaces = (lrspaces ## I) o spacify; val op_clean = snd o spacify; end; val optoks : infixities -> string list = map (fn {tok, ...} => op_clean tok); fun parse_gen_infix update sof toks parse inp = let val (e, rest) = parse inp val continue = case rest of S.NIL => NONE | S.CONS (h, t) => if mem h toks then SOME (h, t) else NONE in case continue of NONE => (sof e, rest) | SOME (h, t) => parse_gen_infix update (update sof h e) toks parse (t ()) end; fun parse_left_infix toks con = parse_gen_infix (fn f => fn t => fn a => fn b => con (t, f a, b)) I toks; fun parse_right_infix toks con = parse_gen_infix (fn f => fn t => fn a => fn b => f (con (t, a, b))) I toks; fun parse_infixes ops = let val layeredops = map (I ## map op_clean) (layerops ops) fun iparser (a, t) = (if a then parse_left_infix else parse_right_infix) t val iparsers = map iparser layeredops in fn con => fn subparser => foldl (fn (p, sp) => p con sp) subparser iparsers end; fun pp_gen_infix left toks : 'a des -> 'a iprinter -> 'a iprinter = let val spc = map op_spaces toks in fn dest => fn pp_sub => let fun dest' tm = case dest tm of NONE => NONE | SOME (t, a, b) => omap (pair (a, b)) (List.find (equal t o snd) spc) open PP fun pp_go pp (tmr as (tm, r)) = case dest' tm of NONE => pp_sub pp tmr | SOME ((a, b), ((lspc, rspc), tok)) => ((if left then pp_go else pp_sub) pp (a, true); lspc pp; add_string pp tok; rspc pp; (if left then pp_sub else pp_go) pp (b, r)) in fn pp => fn tmr as (tm, _) => case dest' tm of NONE => pp_sub pp tmr | SOME _ => (begin_block pp INCONSISTENT 0; pp_go pp tmr; end_block pp) end end; fun pp_left_infix toks = pp_gen_infix true toks; fun pp_right_infix toks = pp_gen_infix false toks; fun pp_infixes ops = let val layeredops = layerops ops val toks = List.concat (map (map op_clean o snd) layeredops) fun iprinter (a, t) = (if a then pp_left_infix else pp_right_infix) t val iprinters = map iprinter layeredops in fn dest => fn pp_sub => let fun printer sub = foldl (fn (ip, p) => ip dest p) sub iprinters fun is_op t = case dest t of SOME (x, _, _) => mem x toks | _ => false open PP fun subpr pp (tmr as (tm, _)) = if is_op tm then (begin_block pp INCONSISTENT 1; add_string pp "("; printer subpr pp (tm, false); add_string pp ")"; end_block pp) else pp_sub pp tmr in fn pp => fn tmr => (begin_block pp INCONSISTENT 0; printer subpr pp tmr; end_block pp) end end; (* ------------------------------------------------------------------------- *) (* Lexing. *) (* ------------------------------------------------------------------------- *) val space = Char.isSpace; val digit = Char.isDigit; val lower = Char.isLower; val upper = Char.isUpper; val alpha = Char.isAlpha; val alphanum = fn c => alpha c orelse digit c orelse c = #"'" orelse c = #"_"; val symbol = Char.contains "<>=-*+/\\?@|!$%&~#^:"; val punct = Char.contains "()[]{}.,;"; (* ------------------------------------------------------------------------- *) (* Quotations. *) (* ------------------------------------------------------------------------- *) type 'a quotation = 'a frag list; fun quotation_parser parser pp_a = let val f = PP.pp_to_string (!LINE_LENGTH) pp_a in parser o foldl (fn (QUOTE q, s) => s ^ q | (ANTIQUOTE a, s) => s ^ f a) "" end; end (*#line 0.0 "fol/Term1.sig"*) (* ========================================================================= *) (* BASIC FIRST-ORDER LOGIC MANIPULATIONS *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Term1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type 'a quotation = 'a Parser.quotation type infixities = Parser.infixities (* Datatypes for terms and formulas *) datatype term = Var of string | Fn of string * term list datatype formula = True | False | Atom of term | Not of formula | And of formula * formula | Or of formula * formula | Imp of formula * formula | Iff of formula * formula | Forall of string * formula | Exists of string * formula (* Contructors and destructors *) val dest_var : term -> string val is_var : term -> bool val dest_fn : term -> string * term list val is_fn : term -> bool val fn_name : term -> string val fn_args : term -> term list val fn_arity : term -> int val fn_function : term -> string * int val mk_const : string -> term val dest_const : term -> string val is_const : term -> bool val mk_binop : string -> term * term -> term val dest_binop : string -> term -> term * term val is_binop : string -> term -> bool val dest_atom : formula -> term val is_atom : formula -> bool val list_mk_conj : formula list -> formula val strip_conj : formula -> formula list val flatten_conj : formula -> formula list val list_mk_disj : formula list -> formula val strip_disj : formula -> formula list val flatten_disj : formula -> formula list val list_mk_forall : string list * formula -> formula val strip_forall : formula -> string list * formula val list_mk_exists : string list * formula -> formula val strip_exists : formula -> string list * formula (* New variables *) val new_var : unit -> term val new_vars : int -> term list (* Sizes of terms and formulas *) val term_size : term -> int val formula_size : formula -> int (* Total comparison functions for terms and formulas *) val term_compare : term * term -> order val formula_compare : formula * formula -> order (* Operations on literals *) val mk_literal : bool * formula -> formula val dest_literal : formula -> bool * formula val is_literal : formula -> bool val literal_atom : formula -> formula (* Operations on formula negations *) val negative : formula -> bool val positive : formula -> bool val negate : formula -> formula (* Functions and relations in a formula *) val functions : formula -> (string * int) list val function_names : formula -> string list val relations : formula -> (string * int) list val relation_names : formula -> string list (* The equality relation has a special status *) val eq_rel : string * int val mk_eq : term * term -> formula val dest_eq : formula -> term * term val is_eq : formula -> bool val lhs : formula -> term val rhs : formula -> term val eq_occurs : formula -> bool val relations_no_eq : formula -> (string * int) list (* Free variables *) val FVT : term -> string list val FV : formula -> string list val FVL : formula list -> string list val specialize : formula -> formula val generalize : formula -> formula (* Subterms *) val subterm : int list -> term -> term val rewrite : (int list, term) maplet -> term -> term val literal_subterm : int list -> formula -> term val literal_rewrite : (int list, term) maplet -> formula -> formula (* The Knuth-Bendix ordering *) type Weight = string * int -> int type Prec = (string * int) * (string * int) -> order val kb_weight : Weight -> term -> int * string Multiset.mset val kb_compare : Weight -> Prec -> term * term -> order option (* A datatype to antiquote both terms and formulas *) datatype thing = Term of term | Formula of formula; (* Operators parsed and printed infix *) val infixes : infixities ref (* Deciding whether a string denotes a variable or constant *) val var_string : (string -> bool) ref (* Parsing *) val string_to_term' : infixities -> string -> term (* purely functional *) val string_to_formula' : infixities -> string -> formula val parse_term' : infixities -> thing quotation -> term val parse_formula' : infixities -> thing quotation -> formula val string_to_term : string -> term (* using !infixes *) val string_to_formula : string -> formula val parse_term : thing quotation -> term val parse_formula : thing quotation -> formula (* Pretty-printing *) val pp_term' : infixities -> term pp (* purely functional *) val pp_formula' : infixities -> formula pp val term_to_string' : infixities -> int -> term -> string val formula_to_string' : infixities -> int -> formula -> string val pp_term : term pp (* using !infixes *) val pp_formula : formula pp (* and !LINE_LENGTH *) val term_to_string : term -> string val formula_to_string : formula -> string end (*#line 0.0 "fol/Term1.sml"*) (* ========================================================================= *) (* BASIC FIRST-ORDER LOGIC MANIPULATIONS *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Stream", "Parser", "Mosml", "Binarymap"]; *) (* *) structure Term1 :> Term1 = struct open Parser Useful; infixr 8 ++; infixr 7 >>; infixr 6 ||; infixr |-> ::> @> oo ##; (* ------------------------------------------------------------------------- *) (* Datatypes for storing first-order terms and formulas. *) (* ------------------------------------------------------------------------- *) datatype term = Var of string | Fn of string * term list; datatype formula = True | False | Atom of term | Not of formula | And of formula * formula | Or of formula * formula | Imp of formula * formula | Iff of formula * formula | Forall of string * formula | Exists of string * formula; (* ------------------------------------------------------------------------- *) (* Constructors and destructors. *) (* ------------------------------------------------------------------------- *) (* Variables *) fun dest_var (Var v) = v | dest_var (Fn _) = raise ERR "dest_var" ""; val is_var = can dest_var; (* Functions *) fun dest_fn (Fn f) = f | dest_fn (Var _) = raise ERR "dest_fn" ""; val is_fn = can dest_fn; val fn_name = fst o dest_fn; val fn_args = snd o dest_fn; val fn_arity = length o fn_args; fun fn_function tm = (fn_name tm, fn_arity tm); (* Constants *) fun mk_const c = (Fn (c, [])); fun dest_const (Fn (c, [])) = c | dest_const _ = raise ERR "dest_const" ""; val is_const = can dest_const; (* Binary functions *) fun mk_binop f (a, b) = Fn (f, [a, b]); fun dest_binop f (Fn (x, [a, b])) = if x = f then (a, b) else raise ERR "dest_binop" "wrong binop" | dest_binop _ _ = raise ERR "dest_binop" "not a binop"; fun is_binop f = can (dest_binop f); (* Atoms *) fun dest_atom (Atom a) = a | dest_atom _ = raise ERR "dest_atom" ""; val is_atom = can dest_atom; (* Conjunctions *) fun list_mk_conj l = (case rev l of [] => True | h :: t => foldl And h t); local fun conj cs (And (a, b)) = conj (a :: cs) b | conj cs fm = rev (fm :: cs); in fun strip_conj True = [] | strip_conj fm = conj [] fm; end; val flatten_conj = let fun flat acc [] = acc | flat acc (And (p, q) :: fms) = flat acc (q :: p :: fms) | flat acc (True :: fms) = flat acc fms | flat acc (fm :: fms) = flat (fm :: acc) fms in fn fm => flat [] [fm] end; (* Disjunctions *) fun list_mk_disj l = (case rev l of [] => False | h :: t => foldl Or h t); local fun disj cs (Or (a, b)) = disj (a :: cs) b | disj cs fm = rev (fm :: cs); in fun strip_disj False = [] | strip_disj fm = disj [] fm; end; val flatten_disj = let fun flat acc [] = acc | flat acc (Or (p, q) :: fms) = flat acc (q :: p :: fms) | flat acc (False :: fms) = flat acc fms | flat acc (fm :: fms) = flat (fm :: acc) fms in fn fm => flat [] [fm] end; (* Universal quantifiers *) fun list_mk_forall ([], body) = body | list_mk_forall (v :: vs, body) = Forall (v, list_mk_forall (vs, body)); local fun dest vs (Forall (v, b)) = dest (v :: vs) b | dest vs tm = (rev vs, tm); in val strip_forall = dest []; end; (* Existential quantifiers *) fun list_mk_exists ([], body) = body | list_mk_exists (v :: vs, body) = Exists (v, list_mk_exists (vs, body)); local fun dest vs (Exists (v, b)) = dest (v :: vs) b | dest vs tm = (rev vs, tm); in val strip_exists = dest []; end; (* ------------------------------------------------------------------------- *) (* A datatype to antiquote both terms and formulas. *) (* ------------------------------------------------------------------------- *) datatype thing = Term of term | Formula of formula; (* ------------------------------------------------------------------------- *) (* Built-in infix operators and reserved symbols. *) (* ------------------------------------------------------------------------- *) val infixes : infixities ref = ref [(* ML style *) {tok = " / ", prec = 7, left_assoc = true}, {tok = " div ", prec = 7, left_assoc = true}, {tok = " mod ", prec = 7, left_assoc = true}, {tok = " * ", prec = 7, left_assoc = true}, {tok = " + ", prec = 6, left_assoc = true}, {tok = " - ", prec = 6, left_assoc = true}, {tok = " ^ ", prec = 6, left_assoc = true}, {tok = " @ ", prec = 5, left_assoc = false}, {tok = " :: ", prec = 5, left_assoc = false}, {tok = " = ", prec = 4, left_assoc = true}, (* may be interpreted *) {tok = " == ", prec = 4, left_assoc = true}, (* won't be interpreted *) {tok = " <> ", prec = 4, left_assoc = true}, {tok = " <= ", prec = 4, left_assoc = true}, {tok = " < ", prec = 4, left_assoc = true}, {tok = " >= ", prec = 4, left_assoc = true}, {tok = " > ", prec = 4, left_assoc = true}, {tok = " o ", prec = 8, left_assoc = true}, (* ML prec = 3 *) (* HOL style *) {tok = " % ", prec = 9, left_assoc = true}, (* function application *) {tok = " -> ", prec = 2, left_assoc = false}, (* HOL ty prec = 50 *) {tok = " : ", prec = 1, left_assoc = false}, (* not in HOL grammars *) {tok = ", ", prec = 0, left_assoc = false}, (* HOL tm prec = 50 *) (* Convenient alternative symbols *) {tok = " ** ", prec = 7, left_assoc = true}, {tok = " ++ ", prec = 6, left_assoc = true}, {tok = " -- ", prec = 6, left_assoc = true}]; val connectives = [{tok = " /\\ ", prec = ~1, left_assoc = false}, {tok = " \\/ ", prec = ~2, left_assoc = false}, {tok = " ==> ", prec = ~3, left_assoc = false}, {tok = " <=> ", prec = ~4, left_assoc = false}]; val reserved = ["!", "?", "(", ")", ".", "~"]; (* ------------------------------------------------------------------------- *) (* Deciding whether a string denotes a variable or constant. *) (* ------------------------------------------------------------------------- *) val var_string = ref (C mem [#"_",#"v",#"w",#"x",#"y",#"z"] o Char.toLower o hd o explode); (* ------------------------------------------------------------------------- *) (* Pretty-printing. *) (* ------------------------------------------------------------------------- *) (* Purely functional pretty-printing *) val pp_vname = pp_map (fn s => if !var_string s then s else "var->" ^ s ^ "<-var") pp_string; val pp_cname = pp_map (fn s => if !var_string s then "const->" ^ s ^ "<-const" else s) pp_string; val pp_fname = pp_map (fn s => if !var_string s then "fn->" ^ s ^ "<-fn" else s) pp_string; fun pp_term' ops = let val ops = ops @ connectives val iprinter = pp_infixes ops val itoks = optoks ops fun pp_uninfix pp_s pp s = if mem s itoks then PP.add_string pp ("(" ^ s ^ ")") else pp_s pp s fun idest (Fn (f, [a, b])) = SOME (f, a, b) | idest _ = NONE fun is_op t = case idest t of SOME (f, _, _) => mem f itoks | NONE => false fun is_q (Fn ("!", _)) = true | is_q (Fn ("?", _)) = true | is_q _ = false fun negs (Fn ("~", [a])) = (curry op+ 1 ## I) (negs a) | negs tm = (0, tm) fun binds s (tm as Fn (n, [Var v, b])) = if s = n then (cons v ## I) (binds s b) else ([], tm) | binds _ tm = ([], tm) open PP fun basic pp (Var v) = pp_vname pp v | basic pp (Fn (c, [])) = pp_uninfix pp_cname pp c | basic pp (Fn (f, a)) = (pp_uninfix pp_fname pp f; app (fn x => (add_break pp (1, 0); argument pp x)) a) and argument pp tm = if is_var tm orelse is_const tm then basic pp tm else pp_btm pp tm and quant pp (tm, r) = let fun pr pp (Fn (q, [Var v, tm])) = let val (vs, body) = binds q tm in add_string pp q; pp_vname pp v; app (fn a => (add_break pp (1, 0); pp_vname pp a)) vs; add_string pp "."; add_break pp (1, 0); if is_q body then pr pp body else pp_tm pp (body, false) end | pr pp tm = raise BUG "pp_term" "not a quantifier" fun pp_q pp t = (begin_block pp INCONSISTENT 2; pr pp t; end_block pp) in (if is_q tm then (if r then pp_bracket ("(", ")") else I) pp_q else basic) pp tm end and molecule pp (tm, r) = let val (n, x) = negs tm in begin_block pp INCONSISTENT n; N n (fn () => add_string pp "~") (); if is_op x then pp_btm pp x else quant pp (x, r); end_block pp end and pp_btm pp tm = pp_bracket ("(", ")") pp_tm pp (tm, false) and pp_tm pp tmr = iprinter idest molecule pp tmr in pp_map (C pair false) pp_tm end; local fun demote True = Fn ("T", [] ) | demote False = Fn ("F", [] ) | demote (Not a) = Fn ("~", [demote a] ) | demote (And (a, b)) = Fn ("/\\", [demote a, demote b]) | demote (Or (a, b)) = Fn ("\\/", [demote a, demote b]) | demote (Imp (a, b)) = Fn ("==>", [demote a, demote b]) | demote (Iff (a, b)) = Fn ("<=>", [demote a, demote b]) | demote (Forall (v, b)) = Fn ("!", [Var v, demote b]) | demote (Exists (v, b)) = Fn ("?", [Var v, demote b]) | demote (Atom t) = t; in fun pp_formula' ops = pp_map demote (pp_term' ops); end; fun term_to_string' ops len tm = PP.pp_to_string len (pp_term' ops) tm; fun formula_to_string' ops len fm = PP.pp_to_string len (pp_formula' ops) fm; (* Pretty-printing things is needed for parsing thing quotations *) fun pp_thing ops pp (Term tm) = pp_term' ops pp tm | pp_thing ops pp (Formula fm) = pp_formula' ops pp fm; fun pp_bracketed_thing ops pp th = (PP.begin_block pp PP.INCONSISTENT 1; PP.add_string pp "("; pp_thing ops pp th; PP.add_string pp ")"; PP.end_block pp); (* Pretty-printing using !infixes and !LINE_LENGTH *) fun pp_term pp tm = pp_term' (!infixes) pp tm; fun pp_formula pp fm = pp_formula' (!infixes) pp fm; fun term_to_string tm = term_to_string' (!infixes) (!LINE_LENGTH) tm; fun formula_to_string fm = formula_to_string' (!infixes) (!LINE_LENGTH) fm; (* ------------------------------------------------------------------------- *) (* Parsing. *) (* ------------------------------------------------------------------------- *) (* Lexing *) val lexer = (fn ((_, (toks, _)), _) => toks) o (many (some space) ++ (many ((((atleastone (some alphanum) || (some (fn c => symbol c andalso c <> #"~") ++ many (some symbol)) >> op ::) >> implode || some (fn c => c = #"~" orelse punct c) >> str) ++ many (some space)) >> fst)) ++ finished); val lex_str = lexer o Stream.from_list o explode; (* Purely functional parsing *) val vname_parser = some (fn tok => not (mem tok reserved) andalso !var_string tok); fun term_parser ops = let val ops = ops @ connectives val iparser = parse_infixes ops val itoks = optoks ops val avoid = itoks @ reserved fun fname tok = not (mem tok avoid) andalso not (!var_string tok) fun uninfix tok = mem tok itoks val uninfix_parser = (exact "(" ++ some uninfix ++ exact ")") >> (fst o snd) val fname_parser = some fname || uninfix_parser fun bind s (v, t) = Fn (s, [Var v, t]) fun basic inp = ((exact "(" ++ tm_parser ++ exact ")") >> (fn (_, (t, _)) => t) || (exact "!" ++ atleastone vname_parser ++ exact "." ++ tm_parser) >> (fn (_, (vs, (_, body))) => foldr (bind "!") body vs) || (exact "?" ++ atleastone vname_parser ++ exact "." ++ tm_parser) >> (fn (_, (vs, (_, body))) => foldr (bind "?") body vs) || fname_parser >> (fn f => Fn (f, [])) || vname_parser >> Var) inp and molecule inp = ((many (exact "~") ++ ((fname_parser ++ many basic) >> Fn || basic)) >> (fn (l, t) => N (length l) (fn x => Fn ("~", [x])) t)) inp and tm_parser inp = iparser (fn (f, a, b) => Fn (f, [a, b])) molecule inp in tm_parser end; local fun promote (Fn ("T", [] )) = True | promote (Fn ("F", [] )) = False | promote (Fn ("~", [a] )) = Not (promote a) | promote (Fn ("/\\", [a, b] )) = And (promote a, promote b) | promote (Fn ("\\/", [a, b] )) = Or (promote a, promote b) | promote (Fn ("==>", [a, b] )) = Imp (promote a, promote b) | promote (Fn ("<=>", [a, b] )) = Iff (promote a, promote b) | promote (Fn ("!", [Var v, b])) = Forall (v, promote b) | promote (Fn ("?", [Var v, b])) = Exists (v, promote b) | promote tm = Atom tm; in fun formula_parser ops = term_parser ops >> promote; end; fun string_to_term' ops = fst o ((term_parser ops ++ finished) >> fst) o Stream.from_list o lex_str; fun string_to_formula' ops = fst o ((formula_parser ops ++ finished) >> fst) o Stream.from_list o lex_str; fun parse_term' ops = quotation_parser (string_to_term' ops) (pp_bracketed_thing ops); fun parse_formula' ops = quotation_parser (string_to_formula' ops) (pp_bracketed_thing ops); (* Parsing using !infixes *) fun string_to_term s = string_to_term' (!infixes) s; fun string_to_formula s = string_to_formula' (!infixes) s; fun parse_term q = parse_term' (!infixes) q; fun parse_formula q = parse_formula' (!infixes) q; (* ------------------------------------------------------------------------- *) (* New variables. *) (* ------------------------------------------------------------------------- *) local val prefix = "_"; val num_var = Var o mk_prefix prefix o int_to_string; in val new_var = num_var o new_int; val new_vars = map num_var o new_ints; end; (* ------------------------------------------------------------------------- *) (* Sizes of terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun szt n [] = n | szt n (Var _ :: tms) = szt (n + 1) tms | szt n (Fn (_, args) :: tms) = szt (n + 1) (args @ tms); fun sz n [] = n | sz n (True :: fms) = sz (n + 1) fms | sz n (False :: fms) = sz (n + 1) fms | sz n (Atom t :: fms) = sz (szt (n + 1) [t]) fms | sz n (Not p :: fms) = sz (n + 1) (p :: fms) | sz n (And (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Or (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Imp (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Iff (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Forall (_, p) :: fms) = sz (n + 1) (p :: fms) | sz n (Exists (_, p) :: fms) = sz (n + 1) (p :: fms); in val term_size = szt 0 o wrap; val formula_size = sz 0 o wrap; end; (* ------------------------------------------------------------------------- *) (* Total comparison functions for terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun lex EQUAL f x = f x | lex x _ _ = x; fun cmt [] = EQUAL | cmt ((Var _, Fn _) :: _) = LESS | cmt ((Fn _, Var _) :: _) = GREATER | cmt ((Var v, Var w) :: l) = lex (String.compare (v, w)) cmt l | cmt ((Fn (f, a), Fn (g, b)) :: l) = (case lex (String.compare (f, g)) (Int.compare o Df length) (a, b) of EQUAL => cmt (zip a b @ l) | x => x); fun cm [] = EQUAL | cm ((True, True ) :: l) = cm l | cm ((True, _ ) :: _) = LESS | cm ((_, True ) :: _) = GREATER | cm ((False, False ) :: l) = cm l | cm ((False, _ ) :: _) = LESS | cm ((_, False ) :: _) = GREATER | cm ((Atom t, Atom u ) :: l) = lex (cmt [(t, u)]) cm l | cm ((Atom _, _ ) :: _) = LESS | cm ((_, Atom _ ) :: _) = GREATER | cm ((Not p, Not q ) :: l) = cm ((p, q) :: l) | cm ((Not _ , _ ) :: _) = LESS | cm ((_, Not _ ) :: _) = GREATER | cm ((And (p1, q1), And (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((And _, _ ) :: _) = LESS | cm ((_, And _ ) :: _) = GREATER | cm ((Or (p1, q1), Or (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Or _, _ ) :: _) = LESS | cm ((_, Or _ ) :: _) = GREATER | cm ((Imp (p1, q1), Imp (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Imp _, _ ) :: _) = LESS | cm ((_, Imp _ ) :: _) = GREATER | cm ((Iff (p1, q1), Iff (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Iff _, _ ) :: _) = LESS | cm ((_, Iff _ ) :: _) = GREATER | cm ((Forall (v, p), Forall (w, q)) :: l) = lex (String.compare (v, w)) (cm o cons (p, q)) l | cm ((Forall _, Exists _ ) :: _) = LESS | cm ((Exists _, Forall _ ) :: _) = GREATER | cm ((Exists (v, p), Exists (w, q)) :: l) = lex (String.compare (v, w)) (cm o cons (p, q)) l; in val term_compare = cmt o wrap; val formula_compare = cm o wrap; end; (* ------------------------------------------------------------------------- *) (* Basic operations on literals. *) (* ------------------------------------------------------------------------- *) fun mk_literal (true, a) = a | mk_literal (false, a) = Not a; fun dest_literal (a as Atom _) = (true, a) | dest_literal (Not (a as Atom _)) = (false, a) | dest_literal _ = raise ERR "dest_literal" ""; val is_literal = can dest_literal; val literal_atom = snd o dest_literal; (* ------------------------------------------------------------------------- *) (* Dealing with formula negations. *) (* ------------------------------------------------------------------------- *) fun negative (Not p) = true | negative _ = false; val positive = non negative; fun negate (Not p) = p | negate p = Not p; (* ------------------------------------------------------------------------- *) (* Functions and relations in a formula. *) (* ------------------------------------------------------------------------- *) local fun fnc fs [] = fs | fnc fs (Var _ :: tms) = fnc fs tms | fnc fs (Fn (n, a) :: tms) = fnc (insert (n, length a) fs) (a @ tms); fun func fs [] = fs | func fs (True :: fms) = func fs fms | func fs (False :: fms) = func fs fms | func fs (Atom (Var _) :: fms) = func fs fms | func fs (Atom (Fn (_, tms)) :: fms) = func (fnc fs tms) fms | func fs (Not p :: fms) = func fs (p :: fms) | func fs (And (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Or (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Imp (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Iff (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Forall (_, p) :: fms) = func fs (p :: fms) | func fs (Exists (_, p) :: fms) = func fs (p :: fms); in val functions = func [] o wrap; end; val function_names = map fst o functions; local fun rel rs [] = rs | rel rs (True :: fms) = rel rs fms | rel rs (False :: fms) = rel rs fms | rel rs (Atom (Var _) :: fms) = rel rs fms | rel rs (Atom (f as Fn _) :: fms) = rel (insert (fn_function f) rs) fms | rel rs (Not p :: fms) = rel rs (p :: fms) | rel rs (And (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Or (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Imp (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Iff (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Forall (_, p) :: fms) = rel rs (p :: fms) | rel rs (Exists (_, p) :: fms) = rel rs (p :: fms); in val relations = rel [] o wrap; end; val relation_names = map fst o relations; (* ------------------------------------------------------------------------- *) (* The equality relation has a special status. *) (* ------------------------------------------------------------------------- *) val eq_rel = ("=", 2); fun mk_eq (a, b) = Atom (Fn ("=", [a, b])); fun dest_eq (Atom (Fn ("=", [a, b]))) = (a, b) | dest_eq _ = raise ERR "dest_eq" ""; val is_eq = can dest_eq; val lhs = fst o dest_eq; val rhs = snd o dest_eq; val eq_occurs = mem eq_rel o relations; val relations_no_eq = List.filter (non (equal eq_rel)) o relations; (* ------------------------------------------------------------------------- *) (* Free variables in terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun fvt av = let val seen = if null av then mem else (fn v => fn vs => mem v av orelse mem v vs) fun f vs [] = vs | f vs (Var v :: tms) = f (if seen v vs then vs else v :: vs) tms | f vs (Fn (_, args) :: tms) = f vs (args @ tms) in f end; fun fv vs [] = vs | fv vs ((_ , True ) :: fms) = fv vs fms | fv vs ((_ , False ) :: fms) = fv vs fms | fv vs ((av, Atom t ) :: fms) = fv (fvt av vs [t]) fms | fv vs ((av, Not p ) :: fms) = fv vs ((av, p) :: fms) | fv vs ((av, And (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Or (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Imp (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Iff (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Forall (x, p)) :: fms) = fv vs ((insert x av, p) :: fms) | fv vs ((av, Exists (x, p)) :: fms) = fv vs ((insert x av, p) :: fms); in fun FVT tm = rev (fvt [] [] [tm]); fun FV fm = rev (fv [] [([], fm)]); fun FVL fms = rev (fv [] (map (pair []) fms)); end; val specialize = snd o strip_forall; fun generalize fm = list_mk_forall (FV fm, fm); (* ------------------------------------------------------------------------- *) (* Subterms. *) (* ------------------------------------------------------------------------- *) fun subterm [] tm = tm | subterm (_ :: _) (Var _) = raise ERR "subterm" "Var" | subterm (h :: t) (Fn (_, args)) = subterm t (List.nth (args, h)) handle Subscript => raise ERR "subterm" "bad path"; local fun update _ _ [] = raise ERR "rewrite" "bad path" | update f n (h :: t) = if n = 0 then f h :: t else h :: update f (n - 1) t; in fun rewrite ([] |-> res) _ = res | rewrite _ (Var _) = raise ERR "rewrite" "Var" | rewrite ((h :: t) |-> res) (Fn (f, args)) = Fn (f, update (rewrite (t |-> res)) h args); end; local fun atom_rewrite r = Atom o rewrite r o dest_atom; in fun literal_subterm p = subterm p o dest_atom o literal_atom; fun literal_rewrite r = mk_literal o (I ## atom_rewrite r) o dest_literal; end; (* ------------------------------------------------------------------------- *) (* The Knuth-Bendix ordering. *) (* ------------------------------------------------------------------------- *) type Weight = string * int -> int; type Prec = (string * int) * (string * int) -> order; val no_vars = Multiset.empty String.compare; fun one_var v = Multiset.insert (v, 1) no_vars; fun kb_weight w = let fun weight (Var v) = (0, one_var v) | weight (Fn (f, a)) = foldl wght (w (f, length a), no_vars) a and wght (t, (n, v)) = (curry op+ n ## Multiset.union v) (weight t) in weight end; (* The Knuth-Bendix ordering is partial when terms contain variables *) fun kb_compare w p = let fun kbo [] = SOME EQUAL | kbo (tu :: rest) = if op= tu then SOME EQUAL else let val ((wt, vt), (wu, vu)) = Df (kb_weight w) tu in kbo1 (Int.compare (wt, wu)) (Multiset.compare (vt, vu)) tu rest end and kbo1 _ NONE _ _ = NONE | kbo1 LESS (SOME LESS) _ _ = SOME LESS | kbo1 GREATER (SOME LESS) _ _ = NONE | kbo1 EQUAL (SOME LESS) _ _ = SOME LESS | kbo1 LESS (SOME GREATER) _ _ = NONE | kbo1 GREATER (SOME GREATER) _ _ = SOME GREATER | kbo1 EQUAL (SOME GREATER) _ _ = SOME GREATER | kbo1 LESS (SOME EQUAL) _ _ = SOME LESS | kbo1 GREATER (SOME EQUAL) _ _ = SOME GREATER | kbo1 EQUAL (SOME EQUAL) (t, u) rest = kbo2 t u rest and kbo2 (Fn (f, a)) (Fn (g, b)) rest = (case p ((f, length a), (g, length b)) of LESS => SOME LESS | GREATER => SOME GREATER | EQUAL => kbo (zip a b @ rest)) | kbo2 _ _ _ = raise BUG "kbo" "variable" in kbo o wrap end; end (*#line 0.0 "fol/Subst1.sig"*) (* ========================================================================= *) (* SUBSTITUTIONS ON FIRST-ORDER TERMS AND FORMULAS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) signature Subst1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type term = Term1.term type formula = Term1.formula type subst val |<>| : subst val ::> : (string, term) maplet * subst -> subst val @> : subst * subst -> subst val null : subst -> bool val term_subst : subst -> term -> term val formula_subst : subst -> formula -> formula val find_redex : string -> subst -> term option val norm : subst -> subst (* Removes identity substitutions *) val restrict : string list -> subst -> subst val refine : subst -> subst -> subst val is_renaming : subst -> bool val to_maplets : subst -> (string, term) maplet list val from_maplets : (string, term) maplet list -> subst val foldl : ((string, term) maplet -> 'a -> 'a) -> 'a -> subst -> 'a val foldr : ((string, term) maplet -> 'a -> 'a) -> 'a -> subst -> 'a val pp_subst : subst pp end (*#line 0.0 "fol/Subst1.sml"*) (* ========================================================================= *) (* SUBSTITUTIONS ON FIRST-ORDER TERMS AND FORMULAS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) (* app load ["Binarymap", "Useful", "Term1"]; *) (* *) structure Subst1 :> Subst1 = struct open Useful Term1; infixr 8 ++; infixr 7 >>; infixr 6 ||; infixr |-> ::> @> oo ##; structure M = Binarymap; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun Mpurge (d, k) = fst (M.remove (d, k)) handle NotFound => d; (* ------------------------------------------------------------------------- *) (* The underlying representation. *) (* ------------------------------------------------------------------------- *) datatype subst = Subst of (string, term) M.dict; (* ------------------------------------------------------------------------- *) (* Operations. *) (* ------------------------------------------------------------------------- *) val |<>| = Subst (M.mkDict String.compare); fun (a |-> b) ::> (Subst d) = Subst (M.insert (d, a, b)); fun (Subst sub1) @> (Subst sub2) = Subst (M.foldl (fn (a, b, d) => M.insert (d, a, b)) sub2 sub1); fun null (Subst s) = M.numItems s = 0; fun find_redex r (Subst d) = M.peek (d, r); fun purge v (Subst d) = Subst (Mpurge (d, v)); local exception Unchanged; fun always f x = f x handle Unchanged => x; fun pair_unchanged f (x, y) = let val (c, x) = (true, f x) handle Unchanged => (false, x) val (c, y) = (true, f y) handle Unchanged => (c, y) in if c then (x, y) else raise Unchanged end; fun list_unchanged f = let fun g (x, (b, l)) = (true, f x :: l) handle Unchanged => (b, x :: l) fun h (true, l) = rev l | h (false, _) = raise Unchanged in h o foldl g (false, []) end; fun find_unchanged v r = case find_redex v r of SOME t => t | NONE => raise Unchanged; fun tm_subst r = let fun f (Var v) = find_unchanged v r | f (Fn (n, a)) = Fn (n, list_unchanged f a) in f end; fun fm_subst r = let fun f False = raise Unchanged | f True = raise Unchanged | f (Atom tm ) = Atom (tm_subst r tm) | f (Not p ) = Not (f p) | f (And pq ) = And (pair_unchanged f pq) | f (Or pq ) = Or (pair_unchanged f pq) | f (Imp pq ) = Imp (pair_unchanged f pq) | f (Iff pq ) = Iff (pair_unchanged f pq) | f (Forall vp) = fm_substq r Forall vp | f (Exists vp) = fm_substq r Exists vp in if null r then I else always f end and fm_substq r Q (v, p) = let val v' = variant v (FV (fm_subst (purge v r) p)) in Q (v', fm_subst ((v |-> Var v') ::> r) p) end; in fun term_subst env tm = if null env then tm else always (tm_subst env) tm; fun formula_subst env fm = fm_subst env fm; end; fun norm (sub as Subst dict) = let fun check (a, b, (c, d)) = if Var a = b then (true, fst (M.remove (d, a))) else (c, d) val (removed, dict') = M.foldl check (false, dict) dict in if removed then Subst dict' else sub end; fun to_maplets (Subst s) = map (op|->) (M.listItems s); fun from_maplets ms = foldl (op ::>) |<>| (rev ms); fun restrict vs = from_maplets o List.filter (fn (a |-> _) => mem a vs) o to_maplets; (* Note: this just doesn't work with cyclic substitutions! *) fun refine (Subst sub1) sub2 = let fun f ((a, b), s) = let val b' = term_subst sub2 b in if Var a = b' then s else (a |-> b') ::> s end in foldl f sub2 (M.listItems sub1) end; local exception QF fun rs (v, Var w, l) = if mem w l then raise QF else w :: l | rs (_, Fn _, _) = raise QF in fun is_renaming (Subst sub) = (M.foldl rs [] sub; true) handle QF => false; end; fun foldl f b (Subst sub) = M.foldl (fn (s, t, a) => f (s |-> t) a) b sub; fun foldr f b (Subst sub) = M.foldr (fn (s, t, a) => f (s |-> t) a) b sub; val pp_subst = pp_map to_maplets (fn pp => (fn [] => pp_string pp "|<>|" | l => pp_list (pp_maplet pp_string pp_term) pp l)); end (*#line 0.0 "fol/Kernel1.sig"*) (* ========================================================================= *) (* A LCF-STYLE LOGICAL KERNEL FOR FIRST-ORDER CLAUSES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Kernel1 = sig type term = Term1.term type formula = Term1.formula type subst = Subst1.subst (* An ABSTRACT type for theorems *) eqtype thm datatype inference = Axiom | Refl | Assume | Inst | Factor | Resolve | Equality (* Destruction of theorems is fine *) val dest_thm : thm -> formula list * (inference * thm list) (* But creation is only allowed by the primitive rules of inference *) val AXIOM : formula list -> thm val REFL : term -> thm val ASSUME : formula -> thm val INST : subst -> thm -> thm val FACTOR : thm -> thm val RESOLVE : formula -> thm -> thm -> thm val EQUALITY : formula -> int list -> term -> bool -> thm -> thm end (*#line 0.0 "fol/Kernel1.sml"*) (* ========================================================================= *) (* A LCF-STYLE LOGICAL KERNEL FOR FIRST-ORDER CLAUSES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) structure Kernel1 :> Kernel1 = struct open Useful Term1; infixr |-> ::> oo; type subst = Subst1.subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* An ABSTRACT type for theorems. *) (* ------------------------------------------------------------------------- *) datatype inference = Axiom | Refl | Assume | Inst | Factor | Resolve | Equality; datatype thm = Thm of formula list * (inference * thm list); (* ------------------------------------------------------------------------- *) (* Destruction of theorems is fine. *) (* ------------------------------------------------------------------------- *) fun dest_thm (Thm th) = th; val clause = fst o dest_thm; (* ------------------------------------------------------------------------- *) (* But creation is only allowed by the primitive rules of inference. *) (* ------------------------------------------------------------------------- *) fun AXIOM cl = if List.all is_literal cl then Thm (cl, (Axiom, [])) else raise ERR "AXIOM" "argument not a list of literals"; fun REFL tm = Thm ([mk_eq (tm, tm)], (Refl, [])); fun ASSUME fm = if is_literal fm then Thm ([fm, negate fm], (Assume, [])) else raise ERR "ASSUME" "argument not a literal"; fun INST env (th as Thm (cl, pr)) = let val cl' = map (formula_subst env) cl in if cl' = cl then th else case pr of (Inst, [th']) => if cl' = clause th' then th' else Thm (cl', (Inst, [th'])) | _ => Thm (cl', (Inst, [th])) end; fun FACTOR th = let val cl = rev (setify (clause th)) in if cl = clause th then th else Thm (cl, (Factor, [th])) end; fun RESOLVE fm th1 th2 = let val cl1 = clause th1 val cl1' = List.filter (not o equal fm) cl1 val cl2 = clause th2 val cl2' = List.filter (not o equal (negate fm)) cl2 val () = assert (cl1 <> cl1' orelse cl2 <> cl2') (ERR "RESOLVE" "resolvant does not feature in either clause") in Thm (cl1' @ cl2', (Resolve, [th1, th2])) end; fun EQUALITY fm p res lr th = let val eq_lit = let val red = literal_subterm p fm in Not (mk_eq (if lr then (red, res) else (res, red))) end val other_lits = let val l = clause th in case index (equal fm) l of NONE => raise ERR "EQUALITY" "literal does not occur in clause" | SOME n => update_nth (literal_rewrite (p |-> res)) n l end in Thm (eq_lit :: other_lits, (Equality, [th])) end; end (*#line 0.0 "fol/Match1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Match1 = sig type term = Term1.term type formula = Term1.formula type subst = Subst1.subst (* Matching *) val matchl : subst -> (term * term) list -> subst val match : term -> term -> subst val matchl_literals : subst -> (formula * formula) list -> subst val match_literals : formula -> formula -> subst (* Unification *) val unifyl : subst -> (term * term) list -> subst val unify : subst -> term -> term -> subst val unify_and_apply : term -> term -> term val unifyl_literals : subst -> (formula * formula) list -> subst val unify_literals : subst -> formula -> formula -> subst end (*#line 0.0 "fol/Match1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure Match1 :> Match1 = struct open Useful Term1; infixr |-> ::>; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Matching. *) (* ------------------------------------------------------------------------- *) fun raw_match env x tm = (case Subst1.find_redex x env of NONE => (x |-> tm) ::> env | SOME tm' => if tm = tm' then env else raise ERR "match" "one var trying to match two different terms"); fun matchl env [] = env | matchl env ((Var x, tm) :: rest) = matchl (raw_match env x tm) rest | matchl env ((Fn (f, args), Fn (f', args')) :: rest) = if f = f' andalso length args = length args' then matchl env (zip args args' @ rest) else raise ERR "match" "can't match two different functions" | matchl _ _ = raise ERR "match" "different structure"; fun match tm tm' = Subst1.norm (matchl |<>| [(tm, tm')]); local fun conv (Atom t, Atom t') = SOME (t, t') | conv (Not p, Not q) = conv (p, q) | conv (True, True) = NONE | conv (False, False) = NONE | conv _ = raise ERR "match_literals" "incompatible"; in fun matchl_literals sub = matchl sub o List.mapPartial conv; end; fun match_literals lit lit' = Subst1.norm (matchl_literals |<>| [(lit, lit')]); (* ------------------------------------------------------------------------- *) (* Unification. *) (* ------------------------------------------------------------------------- *) local fun occurs v tm = mem v (FVT tm); fun solve env [] = env | solve env ((tm1, tm2) :: rest) = solve' env (term_subst env tm1) (term_subst env tm2) rest and solve' env (Var x) tm rest = if Var x = tm then solve env rest else if occurs x tm then raise ERR "unify" "occurs check" else (case Subst1.find_redex x env of NONE => solve (Subst1.refine env ((x |-> tm) ::> |<>|)) rest | SOME tm' => solve' env tm' tm rest) | solve' env tm (tm' as Var _) rest = solve' env tm' tm rest | solve' env (Fn (f, args)) (Fn (f', args')) rest = if f = f' andalso length args = length args' then solve env (zip args args' @ rest) else raise ERR "unify" "different structure"; in val unifyl = solve; end; fun unify env tm tm' = unifyl env [(tm, tm')]; fun unify_and_apply tm tm' = term_subst (unify |<>| tm tm') tm; local fun conv (Atom t, Atom t') = SOME (t, t') | conv (Not p, Not q) = conv (p, q) | conv (True, True) = NONE | conv (False, False) = NONE | conv _ = raise ERR "unify_literals" "incompatible"; in fun unifyl_literals env = unifyl env o List.mapPartial conv; end; fun unify_literals env lit lit' = unifyl_literals env [(lit, lit')]; end (*#line 0.0 "fol/TermNet1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF TERMS *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature TermNet1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type term = Term1.term type 'a term_map val empty : 'a term_map val insert : (term, 'a) maplet -> 'a term_map -> 'a term_map val match : 'a term_map -> term -> 'a list val matched : 'a term_map -> term -> 'a list val unify : 'a term_map -> term -> 'a list val size : 'a term_map -> int val from_maplets : (term, 'a) maplet list -> 'a term_map val to_list : 'a term_map -> 'a list val pp_term_map : 'a pp -> 'a term_map pp end (*#line 0.0 "fol/TermNet1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF TERMS *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure TermNet1 :> TermNet1 = struct open Useful Term1; infixr |-> ::> oo; val flatten = List.concat; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) local fun fifo_order (m, _) (n, _) = m <= n; in fun restore_fifo_order l = map snd (sort fifo_order l); end; fun partition_find f l = let fun pf _ [] = (NONE, l) | pf dealt (x :: xs) = if f x then (SOME x, List.revAppend (dealt, xs)) else pf (x :: dealt) xs in pf [] l end; (* ------------------------------------------------------------------------- *) (* Term discrimination trees are optimized for match queries. *) (* ------------------------------------------------------------------------- *) datatype pattern = VAR | FN of string * int; type 'a map = (pattern, 'a) tree; datatype 'a term_map = MAP of int * (int * 'a) map list; val empty = MAP (0, []); fun size (MAP (i, _)) = i; fun to_list (MAP (_, n)) = restore_fifo_order (flatten (map (tree_foldr (K flatten) wrap) n)); fun pp_term_map pp_a = pp_map to_list (pp_list pp_a); local fun find_pat x (BRANCH (p, _)) = p = x | find_pat _ (LEAF _) = raise BUG "find_pat" "misplaced LEAF"; fun add a [] l = LEAF a :: l | add a (tm :: rest) l = let val (pat, rest) = case tm of Var _ => (VAR, rest) | Fn (f, args) => (FN (f, length args), args @ rest) val (this, others) = partition_find (find_pat pat) l val next = case this of NONE => [] | SOME (BRANCH (_, l)) => l | SOME (LEAF _) => raise BUG "add" "misplaced LEAF" in BRANCH (pat, add a rest next) :: others end; in fun insert (tm |-> a) (MAP (i, n)) = MAP (i + 1, add (i, a) [tm] n) handle ERR_EXN _ => raise BUG "insert" "should never fail"; end; fun from_maplets l = foldl (uncurry insert) empty l; local fun mat VAR (_ :: rest) = SOME rest | mat (FN (f, n)) (Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (args @ rest) else NONE | mat (FN _) (Var _ :: _) = NONE | mat _ [] = raise BUG "match" "ran out of subterms"; fun final a [] = SOME a | final _ (_ :: _) = raise BUG "match" "too many subterms"; in fun match (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final [tm]) n)) handle ERR_EXN _ => raise BUG "match" "should never fail"; end; local fun more VAR = 0 | more (FN (f, n)) = n; fun mat pat (0, Var _ :: rest) = SOME (more pat, rest) | mat VAR (0, Fn _ :: _) = NONE | mat (FN (f, n)) (0, Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (0, args @ rest) else NONE | mat _ (0, []) = raise BUG "matched" "ran out of subterms" | mat pat (n, rest) = SOME (more pat + n - 1, rest); fun final a (0, []) = SOME a | final _ (0, _ :: _) = raise BUG "matched" "too many subterms" | final _ (n, _) = raise BUG "matched" "still skipping"; in fun matched (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final (0,[tm])) n)) handle ERR_EXN _ => raise BUG "matched" "should never fail"; end; local fun more VAR = 0 | more (FN (f, n)) = n; fun mat pat (0, Var _ :: rest) = SOME (more pat, rest) | mat VAR (0, Fn _ :: rest) = SOME (0, rest) | mat (FN (f, n)) (0, Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (0, args @ rest) else NONE | mat _ (0, []) = raise BUG "unify" "ran out of subterms" | mat pat (n, rest) = SOME (more pat + n - 1, rest); fun final a (0, []) = SOME a | final _ (0, _ :: _) = raise BUG "unify" "too many subterms" | final _ (n, _) = raise BUG "unify" "still skipping"; in fun unify (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final (0,[tm])) n)) handle ERR_EXN _ => raise BUG "unify" "should never fail"; end; (* ------------------------------------------------------------------------- *) (* We can overlay the above type with a simple list type. *) (* ------------------------------------------------------------------------- *) (* type 'a simple = int * int * term list * 'a list; type 'a term_map = ('a simple, 'a term_map) sum; fun check (0, _, t, a) = INR (from_maplets (foldl (fn (x, xs) => op|-> x :: xs) [] (zip t a))) | check p = INL p; val empty : 'a term_map = INR empty; fun new n = check (n, 0, [], []); val insert = fn m => (fn INL (n, s, ts, xs) => (case m of t |-> x => check (n - 1, s + 1, t :: ts, x :: xs)) | INR d => INR (insert m d)); val match = fn INL (_, _, _, xs) => K (rev xs) | INR d => match d; val matched = fn INL (_, _, _, xs) => K (rev xs) | INR d => matched d; val unify = fn INL (_, _, _, xs) => K (rev xs) | INR d => unify d; val size = fn INL (_, s, _, _) => s | INR d => size d; val from_maplets = INR o from_maplets; val to_list = fn INL (_, _, _, xs) => rev xs | INR d => to_list d; val pp_term_map = fn pp_a => fn pp => (fn INL (_, _, _, xs) => pp_list pp_a pp xs | INR d => pp_term_map pp_a pp d); *) end (*#line 0.0 "fol/LiteralNet1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF LITERALS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) signature LiteralNet1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type ('a, 'b) maplet = ('a, 'b) Term1.maplet type 'a literal_map val empty : 'a literal_map val insert : (formula, 'a) maplet -> 'a literal_map -> 'a literal_map val match : 'a literal_map -> formula -> 'a list val matched : 'a literal_map -> formula -> 'a list val unify : 'a literal_map -> formula -> 'a list val size : 'a literal_map -> int val size_profile : 'a literal_map -> {t : int, f : int, p : int, n : int} val from_maplets : (formula, 'a) maplet list -> 'a literal_map val to_list : 'a literal_map -> 'a list val pp_literal_map : 'a pp -> 'a literal_map pp end (*#line 0.0 "fol/LiteralNet1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF LITERALS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure LiteralNet1 :> LiteralNet1 = struct open Useful Term1; infixr |-> ::> oo; structure T = TermNet1; (* ------------------------------------------------------------------------- *) (* Literal nets. *) (* ------------------------------------------------------------------------- *) type 'a literal_map = ('a T.term_map * 'a T.term_map) * ((int * 'a list) * (int * 'a list)); val empty = ((T.empty, T.empty), ((0, []), (0, []))); fun insert (Atom a |-> b) ((p, n), tf) = ((T.insert (a |-> b) p, n), tf) | insert (Not (Atom a) |-> b) ((p, n), tf) = ((p, T.insert (a |-> b) n), tf) | insert (True |-> b) (pn, ((n, l), f)) = (pn, ((n + 1, b :: l), f)) | insert (False |-> b) (pn, (t, (n, l))) = (pn, (t, (n + 1, b :: l))) | insert (f |-> _) _ = raise BUG "insert" ("not a lit: "^formula_to_string f); fun from_maplets l = foldl (uncurry insert) empty l; fun to_list ((pos, neg), ((_, t), (_, f))) = rev t @ rev f @ T.to_list pos @ T.to_list neg; fun pp_literal_map pp_a = pp_map to_list (pp_list pp_a); local fun pos ((pos, _ ), _ ) = T.size pos; fun neg ((_, neg), _ ) = T.size neg; fun truth (_, ((n, _), _ )) = n; fun falsity (_, (_, (n, _))) = n; in fun size l = truth l + falsity l + pos l + neg l; fun size_profile l = {t = truth l, f = falsity l, p = pos l, n = neg l}; end; fun match ((pos, _), _) (Atom a) = T.match pos a | match ((_, neg), _) (Not (Atom a)) = T.match neg a | match (_, ((_, t), _)) True = rev t | match (_, (_, (_, f))) False = rev f | match _ _ = raise BUG "match" "not a literal"; fun matched ((pos, _), _) (Atom a) = T.matched pos a | matched ((_, neg), _) (Not (Atom a)) = T.matched neg a | matched (_, ((_, t), _)) True = rev t | matched (_, (_, (_, f))) False = rev f | matched _ _ = raise BUG "matched" "not a literal"; fun unify ((pos, _), _) (Atom a) = T.unify pos a | unify ((_, neg), _) (Not (Atom a)) = T.unify neg a | unify (_, ((_, t), _)) True = rev t | unify (_, (_, (_, f))) False = rev f | unify _ _ = raise BUG "unify" "not a literal"; end (*#line 0.0 "fol/Subsume1.sig"*) (* ========================================================================= *) (* A TYPE FOR SUBSUMPTION CHECKING *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Subsume1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type formula = Term1.formula type subst = Subst1.subst type 'a subsume val empty : 'a subsume val add : (formula list, 'a) maplet -> 'a subsume -> 'a subsume val subsumed : 'a subsume -> formula list -> (subst * 'a) list val strictly_subsumed : 'a subsume -> formula list -> (subst * 'a) list val info : 'a subsume -> string val pp_subsum : 'a subsume pp end (*#line 0.0 "fol/Subsume1.sml"*) (* ========================================================================= *) (* A TYPE FOR SUBSUMPTION CHECKING *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Thm1", "Match1"]; *) (* *) structure Subsume1 :> Subsume1 = struct infix |-> ::>; open Useful Term1 Match1; structure N = LiteralNet1; val ofilter = Option.filter; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Subsume1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Subsume1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) val frozen_prefix = "FROZEN__"; fun mk_frozen v = Fn (frozen_prefix ^ v, []); local val chk = String.isPrefix frozen_prefix; val dest = let val l = size frozen_prefix in fn s => String.extract (s, l, NONE) end; in fun dest_frozen (Fn (s, [])) = (assert (chk s) (ERR "dest_frozen" "not a frozen var"); dest s) | dest_frozen _ = raise ERR "dest_frozen" "bad structure"; end; val is_frozen = can dest_frozen; fun freeze_vars fms = let val vars = FV (list_mk_disj fms) val sub = foldl (fn (v, s) => (v |-> mk_frozen v) ::> s) |<>| vars in map (formula_subst sub) fms end; local fun f (v |-> a) = (v |-> (if is_frozen a then Var (dest_frozen a) else a)); in val defrost_vars = Subst1.from_maplets o map f o Subst1.to_maplets; end; val lit_size = formula_size o literal_atom; val sort_literals_by_size = map snd o sort (fn (m, _) => fn (n, _) => m <= n) o map (fn lit => (lit_size lit, lit)); (* ------------------------------------------------------------------------- *) (* The core engine for subsumption checking. *) (* ------------------------------------------------------------------------- *) type 'a sinfo = {sub : subst, hd : formula, tl : formula list, fin : 'a}; type 'a subs = 'a sinfo N.literal_map; fun add_lits (i as {hd, ...}) (net : 'a subs) = N.insert (hd |-> i) net; local fun subsum strict lits = let val accept = (if strict then ofilter (non Subst1.is_renaming) else SOME) o defrost_vars val impossible = let val lit_net = N.from_maplets (map (fn l => (l |-> ())) lits) in List.exists (null o N.matched lit_net) end fun extend sub lits fin net = if impossible lits then net else case sort_literals_by_size lits of [] => raise BUG "extend" "null" | hd :: tl => add_lits {sub = sub, hd = hd, tl = tl, fin = fin} net fun examine lit ({sub, hd, tl, fin}, s as (net, res)) = case total (matchl_literals sub) [(hd, lit)] of NONE => s | SOME sub => if null tl then case accept sub of SOME sub => (net, (sub, fin) :: res) | NONE => s else (extend sub (map (formula_subst sub) tl) fin net, res) fun narrow1 net (lit, s) = foldl (examine lit) s (N.match net lit) fun narrow (net, res) = if N.size net = 0 then res else narrow (foldl (narrow1 net) (N.empty, res) lits) in narrow end; in fun subsumes strict net lits = subsum strict (freeze_vars lits) (net, []) handle ERR_EXN _ => raise BUG "subsumes" "shouldn't fail"; end; (* ------------------------------------------------------------------------- *) (* The user interface. *) (* ------------------------------------------------------------------------- *) type 'a subsume = ('a, 'a subs) sum; val empty : 'a subsume = INR N.empty; fun add _ (s as INL _) = s | add (fms |-> fin) (INR net) = case sort_literals_by_size fms of [] => INL fin | h :: t => INR (add_lits {sub = |<>|, hd = h, tl = t, fin = fin} net); fun subsumed (INL fin) _ = [(|<>|, fin)] | subsumed (INR _) [] = [] | subsumed (INR net) lits = subsumes false net lits; fun strictly_subsumed _ [] = [] | strictly_subsumed (INL fin) _ = [(|<>|, fin)] | strictly_subsumed (INR net) lits = subsumes true net lits; fun info ((INL _) : 'a subsume) = "*" | info (INR net) = int_to_string (N.size net); val pp_subsum = fn z => pp_map info pp_string z; (* Quick testing quotation := true; installPP pp_formula; installPP pp_term; installPP pp_subst; installPP pp_thm; freeze_vars (map parse [`x + y <= 0`, `x = __x()`]); val s = add_subsumer (AXIOM (map parse [`p(x,3)`, `p(2,y)`])) empty_subsum; subsumed s (map parse [`p(2,3)`]); *) end (*#line 0.0 "fol/Tptp1.sig"*) (* ========================================================================= *) (* INTERFACE TO TPTP PROBLEM FILES *) (* Created by Joe Hurd, December 2001 *) (* ========================================================================= *) signature Tptp1 = sig type term = Term1.term type formula = Term1.formula (* Maintaining different relation and function names in TPTP problems *) val renaming : {tptp : string, fol : string, arity : int} list ref (* Parsing: pass in a filename *) val parse_cnf : string -> formula end (*#line 0.0 "fol/Tptp1.sml"*) (* ========================================================================= *) (* INTERFACE TO TPTP PROBLEM FILES *) (* Created by Joe Hurd, December 2001 *) (* ========================================================================= *) (* app load ["Stream", "Useful", "Parser", "Term1"]; *) (* *) structure Tptp1 :> Tptp1 = struct open Parser Useful Term1; infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; infix |->; structure S = Stream; (* ------------------------------------------------------------------------- *) (* Abbreviating relation and function names in TPTP problems. *) (* ------------------------------------------------------------------------- *) type rename = {tptp : string, fol : string, arity : int}; val renaming : rename list ref = ref [{tptp = "equal", fol = "=", arity = 2}]; (* ------------------------------------------------------------------------- *) (* Parsing: pass in a filename. *) (* ------------------------------------------------------------------------- *) val comment = equal #"%" o hd o explode; val input_lines = S.filter (non comment) o S.from_textfile; val input_chars = S.flatten o S.map (S.from_list o explode); datatype tok_type = Lower | Upper | Symbol | Punct; val lexer = (many (some space) ++ (((some lower || some digit) ++ many (some alphanum) >> (fn (a, b) => (Lower, implode (a :: b)))) || (some upper ++ many (some alphanum) >> (fn (a, b) => (Upper, implode (a :: b)))) || (atleastone (some symbol) >> (fn l => (Symbol, implode l))) || (some punct >> (fn c => (Punct, str c))))) >> snd; val lex = many lexer ++ (many (some space) ++ finished) >> fst; val input_toks = S.from_list o fst o lex; fun Var' "T" = Var "T'" | Var' "F" = Var "F'" | Var' v = Var (if !var_string v then v else "v_" ^ v); local fun verify (f, a) = (if !var_string f then (if null a then "c_" else "f_") ^ f else f, a); fun mapped (f, a) (m : rename list) = let fun g {tptp, arity, fol = _} = tptp = f andalso arity = length a in case List.find g m of SOME {fol, ...} => (fol, a) | NONE => verify (f, a) end; in fun Fn' A = Fn (mapped A (!renaming)); end; fun term_parser input = ((some (equal Upper o fst) >> (Var' o snd)) || ((some (equal Lower o fst) >> snd) ++ (optional (exact (Punct, "(") ++ term_parser ++ many ((exact (Punct, ",") ++ term_parser) >> snd) ++ exact (Punct, ")")) >> (fn SOME (_, (t, (ts, _))) => t :: ts | NONE => [])) >> Fn')) input; val literal_parser = ((exact (Symbol, "++") >> K true || exact (Symbol, "--") >> K false) ++ term_parser) >> (fn (s, t) => mk_literal (s, Atom (case t of Var v => Fn (v, []) | _ => t))); val clause_parser = (exact (Lower, "input_clause") ++ exact (Punct, "(") ++ any ++ exact (Punct, ",") ++ any ++ exact (Punct, ",") ++ exact (Punct, "[") ++ literal_parser ++ many ((exact (Punct, ",") ++ literal_parser) >> snd) ++ exact (Punct, "]") ++ exact (Punct, ")") ++ exact (Punct, ".")) >> (fn (_, (_, (name, (_, (typ, (_, (_, (l, (ls, _))))))))) => (snd name, snd typ, l :: ls)); val cnf_parser = fst o ((many clause_parser ++ finished) >> fst); local fun cycle _ _ ([], _) = raise BUG "cycle" "" | cycle f v (h :: t, avoid) = let val h' = f h avoid in (h', (t @ [h], h' :: avoid)) end; in fun generalize_clause fm = let open Subst1 val vars = FV fm val nvars = length vars val var_fn = if nvars <= 15 then variant else variant_num val news = if nvars = 6 then ["x", "y", "z", "x'", "y'", "z'"] else fst (maps (cycle var_fn) vars (["x", "y", "z", "v", "w"], [])) val sub = from_maplets (zipwith (fn v => fn x => v |-> Var x) vars news) in generalize (formula_subst sub fm) end; end; val input_cnf = (fn (a, b) => Imp (a, Imp (b, False))) o Df (list_mk_conj o map (generalize_clause o list_mk_disj o #3)) o List.partition (not o equal "conjecture" o #2) o cnf_parser; val parse_cnf = input_cnf o input_toks o input_chars o input_lines; end (*#line 0.0 "fol/Thm1.sig"*) (* ========================================================================= *) (* INTERFACE TO THE LCF-STYLE LOGICAL KERNEL, PLUS SOME DERIVED RULES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Thm1 = sig type 'a pp = 'a Useful.pp include Kernel1 (* Annotated primitive inferences *) datatype inference' = Axiom' of formula list | Refl' of term | Assume' of formula | Inst' of subst * thm | Factor' of thm | Resolve' of formula * thm * thm | Equality' of formula * int list * term * bool * thm val primitive_inference : inference' -> thm (* User-friendly destructors *) val clause : thm -> formula list val inference : thm -> inference' val proof : thm -> (thm * inference') list (* Pretty-printing of theorems and inferences *) val pp_thm : thm pp val pp_inference : inference pp val pp_inference' : inference' pp val pp_proof : (thm * inference') list pp val thm_to_string' : int -> thm -> string (* purely functional *) val inference_to_string' : int -> inference' -> string val thm_to_string : thm -> string (* using !LINE_LENGTH *) val inference_to_string : inference' -> string (* A total comparison function for theorems *) val thm_compare : thm * thm -> order (* Contradictions and unit clauses *) val is_contradiction : thm -> bool val dest_unit : thm -> formula val is_unit : thm -> bool (* Derived rules and theorems *) val CONTR : formula -> thm -> thm val WEAKEN : formula list -> thm -> thm val FRESH_VARS : thm -> thm val FRESH_VARSL : thm list -> thm list val UNIT_SQUASH : thm -> thm val REFLEXIVITY : thm val SYMMETRY : thm val TRANSITIVITY : thm val FUN_CONGRUENCE : string * int -> thm val REL_CONGRUENCE : string * int -> thm end (*#line 0.0 "fol/Thm1.sml"*) (* ========================================================================= *) (* INTERFACE TO THE LCF-STYLE LOGICAL KERNEL, PLUS SOME DERIVED RULES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Term1", "Kernel1", "Match1"]; *) (* *) structure Thm1 :> Thm1 = struct open Useful Term1 Kernel1 Match1; infixr |-> ::> oo ##; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; val pp_subst = Subst1.pp_subst; (* ------------------------------------------------------------------------- *) (* Annotated primitive inferences. *) (* ------------------------------------------------------------------------- *) datatype inference' = Axiom' of formula list | Refl' of term | Assume' of formula | Inst' of subst * thm | Factor' of thm | Resolve' of formula * thm * thm | Equality' of formula * int list * term * bool * thm fun primitive_inference (Axiom' cl ) = AXIOM cl | primitive_inference (Refl' tm ) = REFL tm | primitive_inference (Assume' l ) = ASSUME l | primitive_inference (Inst' (s, th) ) = INST s th | primitive_inference (Factor' th ) = FACTOR th | primitive_inference (Resolve' (l, th1, th2) ) = RESOLVE l th1 th2 | primitive_inference (Equality' (l, p, t, s, th)) = EQUALITY l p t s th; val clause = fst o dest_thm; (* ------------------------------------------------------------------------- *) (* Pretty-printing of theorems *) (* ------------------------------------------------------------------------- *) fun pp_thm pp th = (PP.begin_block pp PP.INCONSISTENT 3; PP.add_string pp "|- "; pp_formula pp (list_mk_disj (clause th)); PP.end_block pp); local fun inf_to_string Axiom = "Axiom" | inf_to_string Refl = "Refl" | inf_to_string Assume = "Assume" | inf_to_string Inst = "Inst" | inf_to_string Factor = "Factor" | inf_to_string Resolve = "Resolve" | inf_to_string Equality = "Equality"; in val pp_inference = pp_map inf_to_string pp_string; end; local fun pp_inf (Axiom' a) = (Axiom, C (pp_list pp_formula) a) | pp_inf (Refl' a) = (Refl, C pp_term a) | pp_inf (Assume' a) = (Assume, C pp_formula a) | pp_inf (Inst' a) = (Inst, C (pp_pair pp_subst pp_thm) a) | pp_inf (Factor' a) = (Factor, C pp_thm a) | pp_inf (Resolve' a) = (Resolve, C (pp_triple pp_formula pp_thm pp_thm) a) | pp_inf (Equality' (lit, p, r, lr, th)) = (Equality, C (pp_record [("lit", unit_pp pp_formula lit), ("path", unit_pp (pp_list pp_int) p), ("res", unit_pp pp_term r), ("lr", unit_pp pp_bool lr), ("thm", unit_pp pp_thm th)]) ()); in fun pp_inference' pp inf = let open PP val (i, ppf) = pp_inf inf in (begin_block pp INCONSISTENT 0; pp_inference pp i; add_break pp (1, 0); ppf pp; end_block pp) end; end; val pp_proof = pp_list (pp_pair pp_thm pp_inference'); (* Purely functional pretty-printing *) fun thm_to_string' len = PP.pp_to_string len pp_thm; fun inference_to_string' len = PP.pp_to_string len pp_inference'; (* Pretty-printing using !LINE_LENGTH *) fun thm_to_string th = thm_to_string' (!LINE_LENGTH) th; fun inference_to_string inf = inference_to_string' (!LINE_LENGTH) inf; (* ------------------------------------------------------------------------- *) (* A total comparison function for theorems. *) (* ------------------------------------------------------------------------- *) local fun cmp Axiom Axiom = EQUAL | cmp Axiom _ = LESS | cmp _ Axiom = GREATER | cmp Refl Refl = EQUAL | cmp Refl _ = LESS | cmp _ Refl = GREATER | cmp Assume Assume = EQUAL | cmp Assume _ = LESS | cmp _ Assume = GREATER | cmp Inst Inst = EQUAL | cmp Inst _ = LESS | cmp _ Inst = GREATER | cmp Factor Factor = EQUAL | cmp Factor _ = LESS | cmp _ Factor = GREATER | cmp Resolve Resolve = EQUAL | cmp Resolve Equality = LESS | cmp Equality Resolve = GREATER | cmp Equality Equality = EQUAL; fun cm [] = EQUAL | cm ((th1, th2) :: l) = let val (l1, (p1, ths1)) = dest_thm th1 val (l2, (p2, ths2)) = dest_thm th2 in case Int.compare (length l1, length l2) of EQUAL => (case lex_compare formula_compare (zip l1 l2) of EQUAL => (case cmp p1 p2 of EQUAL => cm (zip ths1 ths2 @ l) | x => x) | x => x) | x => x end in val thm_compare = cm o wrap; end; (* ------------------------------------------------------------------------- *) (* Reconstructing proofs. *) (* ------------------------------------------------------------------------- *) fun reconstruct_resolvant cl1 cl2 (cl1', cl2') = case (subtract (setify cl1) cl1', subtract (setify cl2) cl2') of (_ :: _ :: _, _) => NONE | (_, _ :: _ :: _) => NONE | ([l], []) => SOME l | ([], [l']) => SOME (negate l') | ([l], [l']) => if negate l = l' then SOME l else NONE | ([], []) => NONE; fun reconstruct_equality l r = let fun recon_fn p (f, args) (f', args') rest = recon_tm (if f <> f' orelse length args <> length args' then rest else map (C cons p ## I) (enumerate 0 (zip args args')) @ rest) and recon_tm [] = NONE | recon_tm ((p, (tm, tm')) :: rest) = if tm = l andalso tm' = r then SOME (rev p) else case (tm, tm') of (Fn a, Fn a') => recon_fn p a a' rest | _ => recon_tm rest fun recon_lit (Not a) (Not a') = recon_lit a a' | recon_lit (Atom a) (Atom a') = if l <> r andalso a = a' then NONE else recon_tm [([], (a, a'))] | recon_lit _ _ = NONE in fn (lit, lit') => case recon_lit lit lit' of SOME p => SOME (lit, p) | NONE => NONE end; fun reconstruct (cl, (Axiom, [])) = Axiom' cl | reconstruct ([lit], (Refl, [])) = Refl' (lhs lit) | reconstruct ([fm, _], (Assume, [])) = Assume' fm | reconstruct (cl, (Inst, [th])) = Inst' (matchl_literals |<>| (zip (clause th) cl), th) | reconstruct (_, (Factor, [th])) = Factor' th | reconstruct (cl, (Resolve, [th1, th2])) = let val f = reconstruct_resolvant (clause th1) (clause th2) val l = case f (cl, cl) of SOME l => l | NONE => case first f (List.tabulate (length cl, split cl)) of SOME l => l | NONE => raise BUG "inference" "couldn't reconstruct resolvant" in Resolve' (l, th1, th2) end | reconstruct (Not fm :: cl, (Equality, [th])) = let val (tm1, tm2) = dest_eq fm in case first (reconstruct_equality tm1 tm2) (zip (clause th) cl) of SOME (l, p) => Equality' (l, p, tm2, true, th) | NONE => case first (reconstruct_equality tm2 tm1) (zip (clause th) cl) of SOME (l, p) => Equality' (l, p, tm1, false, th) | NONE => raise BUG "inference" "couldn't reconstruct equality step" end | reconstruct _ = raise BUG "inference" "malformed inference"; fun inference th = let val i = reconstruct (dest_thm th) val _ = (primitive_inference i = th) orelse raise BUG "inference" ("failed:\nth = " ^ thm_to_string th ^ "\ninf = " ^ inference_to_string i ^ "\ninf_th = " ^ thm_to_string (primitive_inference i)) in i end; local val empty = (Binarymap.mkDict thm_compare, []); fun contains (m, _) th = Option.isSome (Binarymap.peek (m, th)); fun add th (m, p) = (Binarymap.insert (m, th, ()), (th, inference th) :: p); val finalize = snd; fun reduce (th, pf) = if contains pf th then pf else add th (foldl reduce pf (snd (snd (dest_thm th)))); in fun proof th = finalize (reduce (th, empty)); end; (* ------------------------------------------------------------------------- *) (* Contradictions and unit clauses. *) (* ------------------------------------------------------------------------- *) val is_contradiction = null o clause; fun dest_unit th = case clause th of [lit] => lit | _ => raise ERR "dest_unit" "not a unit"; val is_unit = can dest_unit; (* ------------------------------------------------------------------------- *) (* Derived rules *) (* ------------------------------------------------------------------------- *) fun CONTR lit th = RESOLVE (negate lit) (ASSUME lit) th; fun WEAKEN lits th = foldl (uncurry CONTR) th (rev lits); fun FRESH_VARSL ths = let val fvs = FVL (List.concat (map clause ths)) val vvs = new_vars (length fvs) val sub = Subst1.from_maplets (zipwith (curry op |->) fvs vvs) in map (INST sub) ths end; val FRESH_VARS = unwrap o FRESH_VARSL o wrap; fun UNIT_SQUASH th = let fun squash env (x :: (xs as y :: _)) = squash (unify_literals env x y) xs | squash env _ = env in FACTOR (INST (squash |<>| (clause th)) th) end; val REFLEXIVITY = REFL (Var "x"); val SYMMETRY = EQUALITY (mk_eq (Var "x", Var "x")) [0] (Var "y") true REFLEXIVITY; val TRANSITIVITY = EQUALITY (mk_eq (Var "y", Var "z")) [0] (Var "x") false (ASSUME (Not (mk_eq (Var "y", Var "z")))); fun FUN_CONGRUENCE (function, arity) = let val xs = List.tabulate (arity, fn i => Var ("x" ^ int_to_string i)) val ys = List.tabulate (arity, fn i => Var ("y" ^ int_to_string i)) fun f (i, th) = EQUALITY (List.last (clause th)) [1,i] (List.nth (ys, i)) true th val refl = INST (("x" |-> Fn (function, xs)) ::> |<>|) REFLEXIVITY in foldl f refl (rev (interval 0 arity)) end; fun REL_CONGRUENCE (relation, arity) = let val xs = List.tabulate (arity, fn i => Var ("x" ^ int_to_string i)) val ys = List.tabulate (arity, fn i => Var ("y" ^ int_to_string i)) fun f (i, th) = EQUALITY (List.last (clause th)) [i] (List.nth (ys, i)) true th val refl = ASSUME (Not (Atom (Fn (relation, xs)))) in foldl f refl (rev (interval 0 arity)) end; end (*#line 0.0 "fol/Canon1.sig"*) (* ========================================================================= *) (* FIRST-ORDER LOGIC CANONICALIZATION *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Canon1 = sig type term = Term1.term type formula = Term1.formula type thm = Thm1.thm (* Simplification *) val simplify : formula -> formula (* Negation normal form *) val nnf : formula -> formula (* Prenex normal form *) val prenex : formula -> formula val pnf : formula -> formula (* Skolemization *) val skolemize : formula -> formula val full_skolemize : formula -> formula (* A tautology filter for clauses *) val tautologous : formula list -> bool (* Conjunctive normal form *) val purecnf : formula -> formula list list val simpcnf : formula -> formula list list val clausal : formula -> formula list list val cnf : formula -> formula val axiomatize : formula -> thm list val eq_axiomatize : formula -> thm list (* Adds equality axioms *) val eq_axiomatize' : formula -> thm list (* Adds if equality occurs *) end (*#line 0.0 "fol/Canon1.sml"*) (* ========================================================================= *) (* FIRST-ORDER LOGIC CANONICALIZATION *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Term1"]; *) structure Canon1 :> Canon1 = struct open Useful Term1 Thm1; infixr |-> ::> oo; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Simplification. *) (* ------------------------------------------------------------------------- *) fun simplify1 (Not False) = True | simplify1 (Not True) = False | simplify1 (Not (Not fm)) = fm | simplify1 (And (False, q)) = False | simplify1 (And (p, False)) = False | simplify1 (And (True, q)) = q | simplify1 (And (p, True)) = p | simplify1 (Or (False, q)) = q | simplify1 (Or (p, False)) = p | simplify1 (Or (True, q)) = True | simplify1 (Or (p, True)) = True | simplify1 (Imp (False, q)) = True | simplify1 (Imp (True, q)) = q | simplify1 (Imp (p, True)) = True | simplify1 (Imp (Not p, False)) = p | simplify1 (Imp (p, False)) = Not p | simplify1 (Iff (True, q)) = q | simplify1 (Iff (p, True)) = p | simplify1 (Iff (False, Not q)) = q | simplify1 (Iff (False, q)) = Not q | simplify1 (Iff (Not p, False)) = p | simplify1 (Iff (p, False)) = Not p | simplify1 (fm as Forall (x, p)) = if mem x (FV p) then fm else p | simplify1 (fm as Exists (x, p)) = if mem x (FV p) then fm else p | simplify1 fm = fm; fun simplify (Not p) = simplify1 (Not (simplify p)) | simplify (And (p, q)) = simplify1 (And (simplify p, simplify q)) | simplify (Or (p, q)) = simplify1 (Or (simplify p, simplify q)) | simplify (Imp (p, q)) = simplify1 (Imp (simplify p, simplify q)) | simplify (Iff (p, q)) = simplify1 (Iff (simplify p, simplify q)) | simplify (Forall (x, p)) = simplify1 (Forall (x, simplify p)) | simplify (Exists (x, p)) = simplify1 (Exists (x, simplify p)) | simplify fm = fm; (* ------------------------------------------------------------------------- *) (* Negation normal form. *) (* ------------------------------------------------------------------------- *) fun nnf (And (p, q)) = And (nnf p, nnf q) | nnf (Or (p, q)) = Or (nnf p, nnf q) | nnf (Imp (p, q)) = Or (nnf' p, nnf q) | nnf (Iff (p, q)) = Or (And (nnf p, nnf q), And (nnf' p, nnf' q)) | nnf (Forall (x, p)) = Forall (x, nnf p) | nnf (Exists (x, p)) = Exists (x, nnf p) | nnf (Not x) = nnf' x | nnf fm = fm and nnf' True = False | nnf' False = True | nnf' (And (p, q)) = Or (nnf' p, nnf' q) | nnf' (Or (p, q)) = And (nnf' p, nnf' q) | nnf' (Imp (p, q)) = And (nnf p, nnf' q) | nnf' (Iff (p, q)) = Or (And (nnf p, nnf' q), And (nnf' p, nnf q)) | nnf' (Forall (x, p)) = Exists (x, nnf' p) | nnf' (Exists (x, p)) = Forall (x, nnf' p) | nnf' (Not x) = nnf x | nnf' fm = Not fm; (* ------------------------------------------------------------------------- *) (* Prenex normal form. *) (* ------------------------------------------------------------------------- *) fun pullquants fm = (case fm of And (Forall (x, p), Forall (y, q)) => pullquant_2 fm Forall And x y p q | Or (Exists (x, p), Exists (y, q)) => pullquant_2 fm Exists Or x y p q | And (Forall (x, p), q) => pullquant_l fm Forall And x p q | And (p, Forall (x, q)) => pullquant_r fm Forall And x p q | Or (Forall (x, p), q) => pullquant_l fm Forall Or x p q | Or (p, Forall (x, q)) => pullquant_r fm Forall Or x p q | And (Exists (x, p), q) => pullquant_l fm Exists And x p q | And (p, Exists (x, q)) => pullquant_r fm Exists And x p q | Or (Exists (x, p), q) => pullquant_l fm Exists Or x p q | Or (p, Exists (x, q)) => pullquant_r fm Exists Or x p q | _ => fm) and pullquant_l fm Q C x p q = let val x' = variant x (FV fm) in Q (x', pullquants (C (formula_subst ((x |-> Var x') ::> |<>|) p, q))) end and pullquant_r fm Q C x p q = let val x' = variant x (FV fm) in Q (x', pullquants (C (p, formula_subst ((x |-> Var x') ::> |<>|) q))) end and pullquant_2 fm Q C x y p q = let val x' = variant x (FV fm) in Q (x', pullquants(C (formula_subst ((x |-> Var x') ::> |<>|) p, formula_subst ((x |-> Var x') ::> |<>|) q))) end; fun prenex (Forall (x, p)) = Forall (x, prenex p) | prenex (Exists (x, p)) = Exists (x, prenex p) | prenex (And (p, q)) = pullquants (And (prenex p, prenex q)) | prenex (Or (p, q)) = pullquants (Or (prenex p, prenex q)) | prenex fm = fm; val pnf = prenex o nnf o simplify; (* ------------------------------------------------------------------------- *) (* Skolemization function. *) (* ------------------------------------------------------------------------- *) fun skolem avoid (Exists (y, p)) = let val xs = subtract (FV p) [y] val f = variant (if xs = [] then "c_" ^ y else "f_" ^ y) avoid in skolem avoid (formula_subst ((y |-> Fn (f, map Var xs)) ::> |<>|) p) end | skolem avoid (Forall (x, p)) = Forall (x, skolem avoid p) | skolem avoid (And (p, q)) = skolem2 avoid And p q | skolem avoid (Or (p, q)) = skolem2 avoid Or p q | skolem _ fm = fm and skolem2 avoid C p q = let val p' = skolem avoid p val q' = skolem (union avoid (function_names p')) q in C (p', q') end; fun skolemize fm = skolem (function_names fm) fm; val full_skolemize = specialize o prenex o skolemize o nnf o simplify; (* ------------------------------------------------------------------------- *) (* A tautology filter for clauses. *) (* ------------------------------------------------------------------------- *) fun tautologous cls = let val (pos, neg) = List.partition positive cls in intersect pos (map negate neg) <> [] end; (* ------------------------------------------------------------------------- *) (* Conjunctive Normal Form. *) (* ------------------------------------------------------------------------- *) fun distrib s1 s2 = cartwith union s1 s2; fun purecnf (Or (p, q)) = distrib (purecnf p) (purecnf q) | purecnf (And (p, q)) = union (purecnf p) (purecnf q) | purecnf fm = [[fm]]; fun simpcnf True = [] | simpcnf False = [[]] | simpcnf fm = List.filter (non tautologous) (purecnf fm); val clausal = List.concat o map (simpcnf o specialize o prenex) o flatten_conj o skolemize o nnf o simplify val cnf = list_mk_conj o map list_mk_disj o clausal; val axiomatize = map AXIOM o clausal; fun eq_axiomatize fm = let val eqs = [REFLEXIVITY, SYMMETRY, TRANSITIVITY] val rels = map REL_CONGRUENCE (relations_no_eq fm) val funs = map FUN_CONGRUENCE (functions fm) in eqs @ funs @ rels @ axiomatize fm end; fun eq_axiomatize' fm = (if eq_occurs fm then eq_axiomatize else axiomatize) fm; end (*#line 0.0 "fol/Units1.sig"*) (* ========================================================================= *) (* A STORE IN WHICH TO CACHE UNIT THEOREMS *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Units1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type thm = Thm1.thm type units val empty : units val add : thm -> units -> units val addl : thm list -> units -> units val subsumes : units -> formula -> thm option val prove : units -> formula list -> thm list option val demod : units -> thm -> thm val info : units -> string val pp_units : units pp end (*#line 0.0 "fol/Units1.sml"*) (* ========================================================================= *) (* A STORE IN WHICH TO CACHE UNIT THEOREMS *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1"]; *) (* *) structure Units1 :> Units1 = struct open Useful Term1 Thm1 Match1; infix |-> ::> @> oo ##; structure N = LiteralNet1; (* ------------------------------------------------------------------------- *) (* Auxiliary functions. *) (* ------------------------------------------------------------------------- *) fun lift_options f = let fun g res [] = SOME (rev res) | g res (x :: xs) = case f x of SOME y => g (y :: res) xs | NONE => NONE in g [] end; (* ------------------------------------------------------------------------- *) (* Operations on the raw unit cache. *) (* ------------------------------------------------------------------------- *) type uns = thm N.literal_map; val uempty : uns = N.empty; fun uadd th uns = N.insert (dest_unit th |-> th) uns; fun usubsumes uns lit = List.find (can (C match_literals lit) o dest_unit) (rev (N.match uns lit)); fun uprove uns = let fun pr lit = Option.map (fn th => INST (match_literals (dest_unit th) lit) th) (usubsumes uns lit) in lift_options pr end; fun udemod uns = let fun demod (lit, th) = case uprove uns [negate lit] of NONE => th | SOME [dth] => RESOLVE lit th dth | SOME _ => raise BUG "unit_demod" "corrupt" in fn th => foldl demod th (clause th) end; (* ------------------------------------------------------------------------- *) (* The user interface. *) (* ------------------------------------------------------------------------- *) type units = (thm, uns) sum; val empty = INR uempty; fun subsumes (INL th) = K (SOME th) | subsumes (INR uns) = usubsumes uns; fun prove (INL th) = SOME o map (fn False => th | lit => CONTR lit th) | prove (INR uns) = uprove uns; fun demod (INL th) = K th | demod (INR uns) = udemod uns; fun info ((INL _) : units) = "*" | info (INR uns) = int_to_string (N.size uns); val pp_units = pp_map info pp_string; (* Adding a theorem involves squashing it to a unit, if possible. *) fun add _ (U as INL _) = U | add th (U as INR uns) = if List.exists (Option.isSome o usubsumes uns) (clause th) then U else let val th = udemod uns th in if is_contradiction th then INL th else case total UNIT_SQUASH th of NONE => U | SOME th => INR (uadd th uns) end; val addl = C (foldl (uncurry add)); end (*#line 0.0 "fol/Problem1.sig"*) (* ========================================================================= *) (* SOME SAMPLE PROBLEMS TO TEST PROOF PROCEDURES *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Problem1 = sig type 'a quotation = 'a frag list type 'a problem = {name : string, goal : 'a quotation} (* Accessing individual problems *) val get : 'a problem list -> string -> 'a quotation (* The master collections *) val nonequality : 'a problem list val equality : 'a problem list val tptp : 'a problem list (* Some compilations *) (*val quick : 'a problem list *) end (*#line 0.0 "fol/Problem1.sml"*) (* ========================================================================= *) (* SOME SAMPLE PROBLEMS TO TEST PROOF PROCEDURES *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) structure Problem1 :> Problem1 = struct type 'a quotation = 'a frag list; type 'a problem = {name : string, goal : 'a quotation}; (* ========================================================================= *) (* Accessing individual problems. *) (* ========================================================================= *) fun extract (p : 'a problem list) n = Option.valOf (List.find (fn {name, ...} => name = n) p); fun get p = #goal o extract p; (* ========================================================================= *) (* Problems without equality. *) (* ========================================================================= *) val nonequality = [ (* ------------------------------------------------------------------------- *) (* Trivia (some of which demonstrate ex-bugs in provers). *) (* ------------------------------------------------------------------------- *) {name = "TRUE", goal = [ QUOTE "\nT"]}, {name = "P_or_not_P", goal = [ QUOTE "\np \\/ ~p"]}, {name = "JH_test", goal = [ QUOTE "\n!x y. ?z. p x \\/ p y ==> p z"]}, {name = "CYCLIC", goal = [ QUOTE "\n(!x. p (g (c x))) ==> ?z. p (g z)"]}, {name = "MN_bug", goal = [ QUOTE "\n(!x. ?y. f y x x) ==> ?z. f z 0 0"]}, {name = "ERIC", goal = [ QUOTE "\n!x. ?v w. !y z. p x /\\ q y ==> (p v \\/ r w) /\\ (r z ==> q v)"]}, (* ------------------------------------------------------------------------- *) (* Propositional Logic. *) (* ------------------------------------------------------------------------- *) {name = "PROP_1", goal = [ QUOTE "\np ==> q <=> ~q ==> ~p"]}, {name = "PROP_2", goal = [ QUOTE "\n~~p <=> p"]}, {name = "PROP_3", goal = [ QUOTE "\n~(p ==> q) ==> q ==> p"]}, {name = "PROP_4", goal = [ QUOTE "\n~p ==> q <=> ~q ==> p"]}, {name = "PROP_5", goal = [ QUOTE "\n(p \\/ q ==> p \\/ r) ==> p \\/ (q ==> r)"]}, {name = "PROP_6", goal = [ QUOTE "\np \\/ ~p"]}, {name = "PROP_7", goal = [ QUOTE "\np \\/ ~~~p"]}, {name = "PROP_8", goal = [ QUOTE "\n((p ==> q) ==> p) ==> p"]}, {name = "PROP_9", goal = [ QUOTE "\n(p \\/ q) /\\ (~p \\/ q) /\\ (p \\/ ~q) ==> ~(~q \\/ ~q)"]}, {name = "PROP_10", goal = [ QUOTE "\n(q ==> r) /\\ (r ==> p /\\ q) /\\ (p ==> q /\\ r) ==> (p <=> q)"]}, {name = "PROP_11", goal = [ QUOTE "\np <=> p"]}, {name = "PROP_12", goal = [ QUOTE "\n((p <=> q) <=> r) <=> p <=> q <=> r"]}, {name = "PROP_13", goal = [ QUOTE "\np \\/ q /\\ r <=> (p \\/ q) /\\ (p \\/ r)"]}, {name = "PROP_14", goal = [ QUOTE "\n(p <=> q) <=> (q \\/ ~p) /\\ (~q \\/ p)"]}, {name = "PROP_15", goal = [ QUOTE "\np ==> q <=> ~p \\/ q"]}, {name = "PROP_16", goal = [ QUOTE "\n(p ==> q) \\/ (q ==> p)"]}, {name = "PROP_17", goal = [ QUOTE "\np /\\ (q ==> r) ==> s <=> (~p \\/ q \\/ s) /\\ (~p \\/ ~r \\/ s)"]}, {name = "MATHS4_EXAMPLE", goal = [ QUOTE "\n(a \\/ ~k ==> g) /\\ (g ==> q) /\\ ~q ==> k"]}, {name = "XOR_ASSOC", goal = [ QUOTE "\n~(~(p <=> q) <=> r) <=> ~(p <=> ~(q <=> r))"]}, (* ------------------------------------------------------------------------- *) (* Monadic Predicate Logic. *) (* ------------------------------------------------------------------------- *) (* The drinker's principle *) {name = "P18", goal = [ QUOTE "\n?very_popular_guy. !whole_pub. drinks very_popular_guy ==> drinks whole_pub"]}, {name = "P19", goal = [ QUOTE "\n?x. !y z. (p y ==> q z) ==> p x ==> q x"]}, {name = "P20", goal = [ QUOTE "\n(!x y. ?z. !w. p x /\\ q y ==> r z /\\ u w) /\\ (!x y. p x /\\ q y) ==> ?z. r z"]}, {name = "P21", goal = [ QUOTE "\n(?x. p ==> q x) /\\ (?x. q x ==> p) ==> ?x. p <=> q x"]}, {name = "P22", goal = [ QUOTE "\n(!x. p <=> q x) ==> (p <=> !x. q x)"]}, {name = "P23", goal = [ QUOTE "\n(!x. p \\/ q x) <=> p \\/ !x. q x"]}, {name = "P24", goal = [ QUOTE "\n~(?x. u x /\\ q x) /\\ (!x. p x ==> q x \\/ r x) /\\ ~(?x. p x ==> ?x. q x) /\\\n(!x. q x /\\ r x ==> u x) ==> ?x. p x /\\ r x"]}, {name = "P25", goal = [ QUOTE "\n(?x. p x) /\\ (!x. u x ==> ~g x /\\ r x) /\\ (!x. p x ==> g x /\\ u x) /\\\n((!x. p x ==> q x) \\/ ?x. q x /\\ p x) ==> ?x. q x /\\ p x"]}, {name = "P26", goal = [ QUOTE "\n((?x. p x) <=> ?x. q x) /\\ (!x y. p x /\\ q y ==> (r x <=> u y)) ==>\n((!x. p x ==> r x) <=> !x. q x ==> u x)"]}, {name = "P27", goal = [ QUOTE "\n(?x. p x /\\ ~q x) /\\ (!x. p x ==> r x) /\\ (!x. u x /\\ s x ==> p x) /\\\n(?x. r x /\\ ~q x) ==> (!x. u x ==> ~r x) ==> !x. u x ==> ~s x"]}, {name = "P28", goal = [ QUOTE "\n(!x. p x ==> !x. q x) /\\ ((!x. q x \\/ r x) ==> ?x. q x /\\ r x) /\\\n((?x. r x) ==> !x. l x ==> m x) ==> !x. p x /\\ l x ==> m x"]}, {name = "P29", goal = [ QUOTE "\n(?x. p x) /\\ (?x. g x) ==>\n((!x. p x ==> h x) /\\ (!x. g x ==> j x) <=>\n !x y. p x /\\ g y ==> h x /\\ j y)"]}, {name = "P30", goal = [ QUOTE "\n(!x. p x \\/ g x ==> ~h x) /\\ (!x. (g x ==> ~u x) ==> p x /\\ h x) ==>\n!x. u x"]}, {name = "P31", goal = [ QUOTE "\n~(?x. p x /\\ (g x \\/ h x)) /\\ (?x. q x /\\ p x) /\\ (!x. ~h x ==> j x) ==>\n?x. q x /\\ j x"]}, {name = "P32", goal = [ QUOTE "\n(!x. p x /\\ (g x \\/ h x) ==> q x) /\\ (!x. q x /\\ h x ==> j x) /\\\n(!x. r x ==> h x) ==> !x. p x /\\ r x ==> j x"]}, {name = "P33", goal = [ QUOTE "\n(!x. p a /\\ (p x ==> p b) ==> p c) <=>\n(!x. p a ==> p x \\/ p c) /\\ (p a ==> p b ==> p c)"]}, (* This gives rise to 5184 clauses when converted to CNF! *) {name = "P34", goal = [ QUOTE "\n((?x. !y. p x <=> p y) <=> (?x. q x) <=> !y. q y) <=>\n(?x. !y. q x <=> q y) <=> (?x. p x) <=> !y. p y"]}, {name = "P35", goal = [ QUOTE "\n?x y. p x y ==> !x y. p x y"]}, (* ------------------------------------------------------------------------- *) (* Full predicate logic (without Identity and Functions) *) (* ------------------------------------------------------------------------- *) {name = "P36", goal = [ QUOTE "\n(!x. ?y. p x y) /\\ (!x. ?y. g x y) /\\\n(!x y. p x y \\/ g x y ==> !z. p y z \\/ g y z ==> h x z) ==> !x. ?y. h x y"]}, {name = "P37", goal = [ QUOTE "\n(!z. ?w. !x. ?y. (p x z ==> p y w) /\\ p y z /\\ (p y w ==> ?v. q v w)) /\\\n(!x z. ~p x z ==> ?y. q y z) /\\ ((?x y. q x y) ==> !x. r x x) ==>\n!x. ?y. r x y"]}, {name = "P38", goal = [ QUOTE "\n(!x. p a /\\ (p x ==> ?y. p y /\\ r x y) ==> ?z w. p z /\\ r x w /\\ r w z) <=>\n!x.\n (~p a \\/ p x \\/ ?z w. p z /\\ r x w /\\ r w z) /\\\n (~p a \\/ ~(?y. p y /\\ r x y) \\/ ?z w. p z /\\ r x w /\\ r w z)"]}, {name = "P39", goal = [ QUOTE "\n~?x. !y. p y x <=> ~p y y"]}, {name = "P40", goal = [ QUOTE "\n(?y. !x. p x y <=> p x x) ==> ~!x. ?y. !z. p z y <=> ~p z x"]}, {name = "P41", goal = [ QUOTE "\n(!z. ?y. !x. p x y <=> p x z /\\ ~p x x) ==> ~?z. !x. p x z"]}, {name = "P42", goal = [ QUOTE "\n~?y. !x. p x y <=> ~?z. p x z /\\ p z x"]}, {name = "P43", goal = [ QUOTE "\n(!x y. q x y <=> !z. p z x <=> p z y) ==> !x y. q x y <=> q y x"]}, {name = "P44", goal = [ QUOTE "\n(!x. p x ==> (?y. g y /\\ h x y) /\\ ?y. g y /\\ ~h x y) /\\\n(?x. j x /\\ !y. g y ==> h x y) ==> ?x. j x /\\ ~p x"]}, {name = "P45", goal = [ QUOTE "\n(!x. p x /\\ (!y. g y /\\ h x y ==> j x y) ==> !y. g y /\\ h x y ==> r y) /\\\n~(?y. l y /\\ r y) /\\\n(?x. p x /\\ (!y. h x y ==> l y) /\\ !y. g y /\\ h x y ==> j x y) ==>\n?x. p x /\\ ~?y. g y /\\ h x y"]}, {name = "P46", goal = [ QUOTE "\n(!x. p x /\\ (!y. p y /\\ h y x ==> g y) ==> g x) /\\\n((?x. p x /\\ ~g x) ==> ?x. p x /\\ ~g x /\\ !y. p y /\\ ~g y ==> j x y) /\\\n(!x y. p x /\\ p y /\\ h x y ==> ~j y x) ==> !x. p x ==> g x"]}, {name = "P50", goal = [ QUOTE "\n(!x. f0 a x \\/ !y. f0 x y) ==> ?x. !y. f0 x y"]}, (* ------------------------------------------------------------------------- *) (* Example from Manthey and Bry, CADE-9. *) (* ------------------------------------------------------------------------- *) {name = "P55", goal = [ QUOTE "\nlives agatha /\\ lives butler /\\ lives charles /\\\n(killed agatha agatha \\/ killed butler agatha \\/ killed charles agatha) /\\\n(!x y. killed x y ==> hates x y /\\ ~richer x y) /\\\n(!x. hates agatha x ==> ~hates charles x) /\\\n(hates agatha agatha /\\ hates agatha charles) /\\\n(!x. lives x /\\ ~richer x agatha ==> hates butler x) /\\\n(!x. hates agatha x ==> hates butler x) /\\\n(!x. ~hates x agatha \\/ ~hates x butler \\/ ~hates x charles) ==>\nkilled agatha agatha /\\ ~killed butler agatha /\\ ~killed charles agatha"]}, {name = "P57", goal = [ QUOTE "\np (f a b) (f b c) /\\ p (f b c) (f a c) /\\\n(!x y z. p x y /\\ p y z ==> p x z) ==> p (f a b) (f a c)"]}, (* ------------------------------------------------------------------------- *) (* See info-hol, circa 1500. *) (* ------------------------------------------------------------------------- *) {name = "P58", goal = [ QUOTE "\n!x. ?v w. !y z. p x /\\ q y ==> (p v \\/ r w) /\\ (r z ==> q v)"]}, {name = "P59", goal = [ QUOTE "\n(!x. p x <=> ~p (f x)) ==> ?x. p x /\\ ~p (f x)"]}, {name = "P60", goal = [ QUOTE "\n!x. p x (f x) <=> ?y. (!z. p z y ==> p z (f x)) /\\ p x y"]}, (* ------------------------------------------------------------------------- *) (* From Gilmore's classic paper. *) (* ------------------------------------------------------------------------- *) (* JRH: Amazingly, this still seems non-trivial... in HOL it works at depth 45! Joe: Confirmed (depth=45, inferences=263702, time=148s), though if lemmaizing is used then a lemma is discovered at depth 29 that allows a much quicker proof (depth=30, inferences=10039, time=5.5s). [13 Oct 2001] *) {name = "GILMORE_1", goal = [ QUOTE "\n?x. !y z.\n (f y ==> g y <=> f x) /\\ (f y ==> h y <=> g x) /\\\n ((f y ==> g y) ==> h y <=> h x) ==> f z /\\ g z /\\ h z"]}, (* JRH: This is not valid, according to Gilmore {name = "GILMORE_2", goal = ` ?x y. !z. (f x z <=> f z y) /\ (f z y <=> f z z) /\ (f x y <=> f y x) ==> (f x y <=> f x z)`}, *) {name = "GILMORE_3", goal = [ QUOTE "\n?x. !y z.\n ((f y z ==> g y ==> h x) ==> f x x) /\\ ((f z x ==> g x) ==> h z) /\\\n f x y ==> f z z"]}, {name = "GILMORE_4", goal = [ QUOTE "\n?x y. !z. (f x y ==> f y z /\\ f z z) /\\ (f x y /\\ g x y ==> g x z /\\ g z z)"]}, {name = "GILMORE_5", goal = [ QUOTE "\n(!x. ?y. f x y \\/ f y x) /\\ (!x y. f y x ==> f y y) ==> ?z. f z z"]}, {name = "GILMORE_6", goal = [ QUOTE "\n!x. ?y.\n (?w. !v. f w x ==> g v w /\\ g w x) ==>\n (?w. !v. f w y ==> g v w /\\ g w y) \\/\n !z v. ?w. g v z \\/ h w y z ==> g z w"]}, {name = "GILMORE_7", goal = [ QUOTE "\n(!x. k x ==> ?y. l y /\\ (f x y ==> g x y)) /\\\n(?z. k z /\\ !w. l w ==> f z w) ==> ?v w. k v /\\ l w /\\ g v w"]}, {name = "GILMORE_8", goal = [ QUOTE "\n?x. !y z.\n ((f y z ==> g y ==> !w. ?v. h w v x) ==> f x x) /\\\n ((f z x ==> g x) ==> !w. ?v. h w v z) /\\ f x y ==> f z z"]}, (* JRH: This is still a very hard goal Joe: With lemmaizing (in HOL): (depth=18, inferences=15632, time=21s) Without: gave up waiting after (depth=25, inferences=2125072, time=3000s) [13 Oct 2001] *) {name = "GILMORE_9", goal = [ QUOTE "\n!x. ?y. !z.\n ((!w. ?v. f y w v /\\ g y w /\\ ~h y x) ==>\n (!w. ?v. f x w v /\\ g z u /\\ ~h x z) ==>\n !w. ?v. f x w v /\\ g y w /\\ ~h x y) /\\\n ((!w. ?v. f x w v /\\ g y w /\\ ~h x y) ==>\n ~(!w. ?v. f x w v /\\ g z w /\\ ~h x z) ==>\n (!w. ?v. f y w v /\\ g y w /\\ ~h y x) /\\\n !w. ?v. f z w v /\\ g y w /\\ ~h z y)"]}, (* ------------------------------------------------------------------------- *) (* Translation of Gilmore procedure using separate definitions. *) (* ------------------------------------------------------------------------- *) {name = "GILMORE_9a", goal = [ QUOTE "\n(!x y. p x y <=> !w. ?v. f x w v /\\ g y w /\\ ~h x y) ==>\n!x. ?y. !z.\n (p y x ==> p x z ==> p x y) /\\ (p x y ==> ~p x z ==> p y x /\\ p z y)"]}, (* ------------------------------------------------------------------------- *) (* Example from Davis-Putnam papers where Gilmore procedure is poor. *) (* ------------------------------------------------------------------------- *) {name = "DAVIS_PUTNAM_EXAMPLE", goal = [ QUOTE "\n?x y. !z. (f x y ==> f y z /\\ f z z) /\\ (f x y /\\ g x y ==> g x z /\\ g z z)"]}, (* ------------------------------------------------------------------------- *) (* The interesting example where connections make the proof longer. *) (* ------------------------------------------------------------------------- *) {name = "BAD_CONNECTIONS", goal = [ QUOTE "\n~a /\\ (a \\/ b) /\\ (c \\/ d) /\\ (~b \\/ e \\/ f) /\\ (~c \\/ ~e) /\\ (~c \\/ ~f) /\\\n(~b \\/ g \\/ h) /\\ (~d \\/ ~g) /\\ (~d \\/ ~h) ==> F"]}, (* ------------------------------------------------------------------------- *) (* The classic Los puzzle. (Clausal version MSC006-1 in the TPTP library.) *) (* Note: this is actually in the decidable "AE" subset, though that doesn't *) (* yield a very efficient proof. *) (* ------------------------------------------------------------------------- *) {name = "LOS", goal = [ QUOTE "\n(!x y z. p x y ==> p y z ==> p x z) /\\\n(!x y z. q x y ==> q y z ==> q x z) /\\ (!x y. q x y ==> q y x) /\\\n(!x y. p x y \\/ q x y) ==> (!x y. p x y) \\/ !x y. q x y"]}, (* ------------------------------------------------------------------------- *) (* The steamroller. *) (* ------------------------------------------------------------------------- *) {name = "STEAM_ROLLER", goal = [ QUOTE "\n((!x. p1 x ==> p0 x) /\\ ?x. p1 x) /\\ ((!x. p2 x ==> p0 x) /\\ ?x. p2 x) /\\\n((!x. p3 x ==> p0 x) /\\ ?x. p3 x) /\\ ((!x. p4 x ==> p0 x) /\\ ?x. p4 x) /\\\n((!x. p5 x ==> p0 x) /\\ ?x. p5 x) /\\ ((?x. q1 x) /\\ !x. q1 x ==> q0 x) /\\\n(!x.\n p0 x ==>\n (!y. q0 y ==> r x y) \\/\n !y. p0 y /\\ s0 y x /\\ (?z. q0 z /\\ r y z) ==> r x y) /\\\n(!x y. p3 y /\\ (p5 x \\/ p4 x) ==> s0 x y) /\\\n(!x y. p3 x /\\ p2 y ==> s0 x y) /\\ (!x y. p2 x /\\ p1 y ==> s0 x y) /\\\n(!x y. p1 x /\\ (p2 y \\/ q1 y) ==> ~r x y) /\\\n(!x y. p3 x /\\ p4 y ==> r x y) /\\ (!x y. p3 x /\\ p5 y ==> ~r x y) /\\\n(!x. p4 x \\/ p5 x ==> ?y. q0 y /\\ r x y) ==>\n?x y. p0 x /\\ p0 y /\\ ?z. q1 z /\\ r y z /\\ r x y"]}, (* ------------------------------------------------------------------------- *) (* An incestuous example used to establish completeness characterization. *) (* ------------------------------------------------------------------------- *) {name = "MODEL_COMPLETENESS", goal = [ QUOTE "\n(!w x. sentence x ==> holds w x \\/ holds w (not x)) /\\\n(!w x. ~(holds w x /\\ holds w (not x))) ==>\n((!x.\n sentence x ==>\n (!w. models w s ==> holds w x) \\/\n !w. models w s ==> holds w (not x)) <=>\n !w v.\n models w s /\\ models v s ==>\n !x. sentence x ==> (holds w x <=> holds v x))"]} ]; (* ========================================================================= *) (* Problems with equality. *) (* ========================================================================= *) val equality = [ (* ------------------------------------------------------------------------- *) (* Trivia (some of which demonstrate ex-bugs in the prover). *) (* ------------------------------------------------------------------------- *) {name = "REFLEXIVITY", goal = [ QUOTE "\nc = c"]}, {name = "SYMMETRY", goal = [ QUOTE "\n!x y. x = y ==> y = x"]}, {name = "TRANSITIVITY", goal = [ QUOTE "\n!x y z. x = y /\\ y = z ==> x = z"]}, {name = "TRANS_SYMM", goal = [ QUOTE "\n!x y z. x = y /\\ y = z ==> z = x"]}, {name = "SUBSTITUTIVITY", goal = [ QUOTE "\n!x y. f x /\\ x = y ==> f y"]}, {name = "CYCLIC_SUBSTITUTION_BUG", goal = [ QUOTE "\n(!x. y = g (c x)) ==> ?z. y = g z"]}, (* ------------------------------------------------------------------------- *) (* Simple equality problems. *) (* ------------------------------------------------------------------------- *) {name = "P48", goal = [ QUOTE "\n(a = b \\/ c = d) /\\ (a = c \\/ b = d) ==> a = d \\/ b = c"]}, {name = "P49", goal = [ QUOTE "\n(?x y. !z. z = x \\/ z = y) /\\ p a /\\ p b /\\ ~(a = b) ==> !x. p x"]}, {name = "P51", goal = [ QUOTE "\n(?z w. !x y. f0 x y <=> x = z /\\ y = w) ==>\n?z. !x. (?w. !y. f0 x y <=> y = w) <=> x = z"]}, {name = "P52", goal = [ QUOTE "\n(?z w. !x y. f0 x y <=> x = z /\\ y = w) ==>\n?w. !y. (?z. !x. f0 x y <=> x = z) <=> y = w"]}, (* ------------------------------------------------------------------------- *) (* The Melham problem after an inverse skolemization step. *) (* ------------------------------------------------------------------------- *) {name = "UNSKOLEMIZED_MELHAM", goal = [ QUOTE "\n(!x y. g x = g y ==> f x = f y) ==> !y. ?w. !x. y = g x ==> w = f x"]}, (* ------------------------------------------------------------------------- *) (* The example always given for congruence closure. *) (* ------------------------------------------------------------------------- *) {name = "CONGRUENCE_CLOSURE_EXAMPLE", goal = [ QUOTE "\n!x. f (f (f (f (f x)))) = x /\\ f (f (f x)) = x ==> f x = x"]}, (* ------------------------------------------------------------------------- *) (* A simple example (see EWD1266a and the application to Morley's theorem). *) (* ------------------------------------------------------------------------- *) {name = "EWD", goal = [ QUOTE "\n(!x. f x ==> g x) /\\ (?x. f x) /\\ (!x y. g x /\\ g y ==> x = y) ==>\n!y. g y ==> f y"]}, {name = "EWD'", goal = [ QUOTE "\n(!x. f (f x) = f x) /\\ (!x. ?y. f y = x) ==> !x. f x = x"]}, (* ------------------------------------------------------------------------- *) (* Wishnu Prasetya's example. *) (* ------------------------------------------------------------------------- *) {name = "WISHNU", goal = [ QUOTE "\n(?x. x = f (g x) /\\ !x'. x' = f (g x') ==> x = x') <=>\n?y. y = g (f y) /\\ !y'. y' = g (f y') ==> y = y'"]}, (* ------------------------------------------------------------------------- *) (* An equality version of the Agatha puzzle. *) (* ------------------------------------------------------------------------- *) {name = "AGATHA", goal = [ QUOTE "\n(?x. lives x /\\ killed x agatha) /\\\n(lives agatha /\\ lives butler /\\ lives charles) /\\\n(!x. lives x ==> x = agatha \\/ x = butler \\/ x = charles) /\\\n(!x y. killed x y ==> hates x y) /\\ (!x y. killed x y ==> ~richer x y) /\\\n(!x. hates agatha x ==> ~hates charles x) /\\\n(!x. ~(x = butler) ==> hates agatha x) /\\\n(!x. ~richer x agatha ==> hates butler x) /\\\n(!x. hates agatha x ==> hates butler x) /\\ (!x. ?y. ~hates x y) /\\\n~(agatha = butler) ==>\nkilled agatha agatha /\\ ~killed butler agatha /\\ ~killed charles agatha"]}, (* ------------------------------------------------------------------------- *) (* Group theory examples. *) (* ------------------------------------------------------------------------- *) (* JRH: (Size 18, 61814 seconds.) *) {name = "GROUP_RIGHT_INVERSE", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\\n(!x. i x * x = e) ==> !x. x * i x = e"]}, {name = "GROUP_RIGHT_IDENTITY", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\\n(!x. i x * x = e) ==> !x. x * e = x"]}, {name = "KLEIN_GROUP_COMMUTATIVE", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\ (!x. x * e = x) /\\\n(!x. x * x = e) ==> !x y. x * y = y * x"]} ]; (* ========================================================================= *) (* Some sample problems from the TPTP archive. *) (* Note: for brevity some relation/function names have been shortened. *) (* ========================================================================= *) val tptp = [ (* ------------------------------------------------------------------------- *) (* TPTP problems that have demonstrated bugs in the prover. *) (* ------------------------------------------------------------------------- *) (* Solved trivially by meson without cache cutting, but not with. *) {name = "PUZ011-1", goal = [ QUOTE "\nocean atlantic /\\ ocean indian /\\ borders atlantic brazil /\\\nborders atlantic uruguay /\\ borders atlantic c_venesuela /\\\nborders atlantic c_zaire /\\ borders atlantic nigeria /\\\nborders atlantic angola /\\ borders indian india /\\\nborders indian pakistan /\\ borders indian iran /\\ borders indian somalia /\\\nborders indian kenya /\\ borders indian tanzania /\\ south_american brazil /\\\nsouth_american uruguay /\\ south_american c_venesuela /\\ african c_zaire /\\\nafrican nigeria /\\ african angola /\\ african somalia /\\ african kenya /\\\nafrican tanzania /\\ asian india /\\ asian pakistan /\\ asian iran ==>\n(!x y z.\n ~ocean x \\/ ~borders x y \\/ ~african y \\/ ~borders x z \\/ ~asian z) ==>\nF"]}, (* ------------------------------------------------------------------------- *) (* Problems used by the fol unit test to exercise the TPTP parser. *) (* ------------------------------------------------------------------------- *) {name = "PUZ001-1", goal = [ QUOTE "\nlives agatha /\\ lives butler /\\ lives charles /\\\n(!x y. ~killed x y \\/ ~richer x y) /\\\n(!x. ~hates agatha x \\/ ~hates charles x) /\\\n(!x. ~hates x agatha \\/ ~hates x butler \\/ ~hates x charles) /\\\nhates agatha agatha /\\ hates agatha charles /\\\n(!x y. ~killed x y \\/ hates x y) /\\\n(!x. ~hates agatha x \\/ hates butler x) /\\\n(!x. ~lives x \\/ richer x agatha \\/ hates butler x) ==>\nkilled butler agatha \\/ killed charles agatha ==> F"]}, {name = "PUZ020-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. ~(x = y) \\/ statement_by x = statement_by y) /\\\n(!x. ~person x \\/ knight x \\/ knave x) /\\\n(!x. ~person x \\/ ~knight x \\/ ~knave x) /\\\n(!x y. ~says x y \\/ a_truth y \\/ ~a_truth y) /\\\n(!x y. ~says x y \\/ ~(x = y)) /\\ (!x y. ~says x y \\/ y = statement_by x) /\\\n(!x y. ~person x \\/ ~(x = statement_by y)) /\\\n(!x. ~person x \\/ ~a_truth (statement_by x) \\/ knight x) /\\\n(!x. ~person x \\/ a_truth (statement_by x) \\/ knave x) /\\\n(!x y. ~(x = y) \\/ ~knight x \\/ knight y) /\\\n(!x y. ~(x = y) \\/ ~knave x \\/ knave y) /\\\n(!x y. ~(x = y) \\/ ~person x \\/ person y) /\\\n(!x y z. ~(x = y) \\/ ~says x z \\/ says y z) /\\\n(!x y z. ~(x = y) \\/ ~says z x \\/ says z y) /\\\n(!x y. ~(x = y) \\/ ~a_truth x \\/ a_truth y) /\\\n(!x y. ~knight x \\/ ~says x y \\/ a_truth y) /\\\n(!x y. ~knave x \\/ ~says x y \\/ ~a_truth y) /\\ person husband /\\\nperson c_wife /\\ ~(husband = c_wife) /\\\nsays husband (statement_by husband) /\\\n(~a_truth (statement_by husband) \\/ ~knight husband \\/ knight c_wife) /\\\n(a_truth (statement_by husband) \\/ ~knight husband) /\\\n(a_truth (statement_by husband) \\/ knight c_wife) /\\\n(~knight c_wife \\/ a_truth (statement_by husband)) ==> ~knight husband ==>\nF"]}, {name = "NUM001-1", goal = [ QUOTE "\n(!x. x == x) /\\ (!x y z. ~(x == y) \\/ ~(y == z) \\/ x == z) /\\\n(!x y. x + y == y + x) /\\ (!x y z. x + (y + z) == x + y + z) /\\\n(!x y. x + y - y == x) /\\ (!x y. x == x + y - y) /\\\n(!x y z. x - y + z == x + z - y) /\\ (!x y z. x + y - z == x - z + y) /\\\n(!x y z v. ~(x == y) \\/ ~(z == x + v) \\/ z == y + v) /\\\n(!x y z v. ~(x == y) \\/ ~(z == v + x) \\/ z == v + y) /\\\n(!x y z v. ~(x == y) \\/ ~(z == x - v) \\/ z == y - v) /\\\n(!x y z v. ~(x == y) \\/ ~(z == v - x) \\/ z == v - y) ==>\n~(a + b + c == a + (b + c)) ==> F"]}, {name = "ALG005-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y. x + (y + x) = x) /\\\n(!x y. x + (x + y) = y + (y + x)) /\\\n(!x y z. x + y + z = x + z + (y + z)) /\\ (!x y. x * y = x + (x + y)) ==>\n~(a * b * c = a * (b * c)) ==> F"]}, {name = "GRP057-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z v. x * i (i (i y * (i x * z)) * v * i (y * v)) = z) /\\\n(!x y. ~(x = y) \\/ i x = i y) /\\ (!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) ==>\n~(i a1 * a1 = i b1 * b1) \\/ ~(i b2 * b2 * a2 = a2) \\/\n~(a3 * b3 * c3 = a3 * (b3 * c3)) ==> F"]}, {name = "LCL009-1", goal = [ QUOTE "\n(!x y. ~p (x - y) \\/ ~p x \\/ p y) /\\\n(!x y z. p (x - y - (z - y - (x - z)))) ==>\n~p (a - b - c - (a - (b - c))) ==> F"]}, (* ------------------------------------------------------------------------- *) (* Small problems that are tricky to prove. *) (* ------------------------------------------------------------------------- *) {name = "COL060-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. b % x % y % z = x % (y % z)) /\\ (!x y. t % x % y = y % x) /\\\n(!x y z. ~(x = y) \\/ x % z = y % z) /\\\n(!x y z. ~(x = y) \\/ z % x = z % y) ==>\n~(b % (b % (t % b) % b) % t % c_x % c_y % c_z = c_y % (c_x % c_z)) ==> F"]}, {name = "COL058-2", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. r (r 0 x) y = r x (r y y)) /\\ (!x y z. ~(x = y) \\/ r x z = r y z) /\\\n(!x y z. ~(x = y) \\/ r z x = r z y) ==>\n~(r (r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0)))\n (r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0))) =\n r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0))) ==> F"]}, {name = "LCL107-1", goal = [ QUOTE "\n(!x y. ~p (x - y) \\/ ~p x \\/ p y) /\\\n(!x y z v w x' y'.\n p\n (x - y - z - (v - w - (x' - w - (x' - v) - y')) -\n (z - (y - x - y')))) ==> ~p (a - b - c - (e - b - (a - e - c))) ==> F"]}, {name = "LDA007-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. f x (f y z) = f (f x y) (f x z)) /\\\n(!x y z. ~(x = y) \\/ f x z = f y z) /\\\n(!x y z. ~(x = y) \\/ f z x = f z y) /\\ tt = f t t /\\ ts = f t s /\\\ntt_ts = f tt ts /\\ tk = f t k /\\ tsk = f ts k ==>\n~(f t tsk = f tt_ts tk) ==> F"]}, {name = "GRP010-4", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x y. ~(x = y) \\/ i x = i y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y z. x * y * z = x * (y * z)) /\\\n(!x. 1 * x = x) /\\ (!x. i x * x = 1) /\\ c * b = 1 ==> ~(b * c = 1) ==> F"]}, {name = "ALG006-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. x + (y + x) = x) /\\\n(!x y. x + (x + y) = y + (y + x)) /\\\n(!x y z. x + y + z = x + z + (y + z)) ==> ~(a + c + b = a + b + c) ==> F"]}, {name = "BOO021-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ i x = i y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y. (x + y) * y = y) /\\\n(!x y z. x * (y + z) = y * x + z * x) /\\ (!x. x + i x = 1) /\\\n(!x y. x * y + y = y) /\\ (!x y z. x + y * z = (y + x) * (z + x)) /\\\n(!x. x * i x = 0) ==> ~(b * a = a * b) ==> F"]}, {name = "GEO002-4", goal = [ QUOTE "\n(!x y z v. ~between x y z \\/ ~between y v z \\/ between x y v) /\\\n(!x y z. ~equidistant x y z z \\/ x == y) /\\\n(!x y z v w.\n ~between x y z \\/ ~between v z w \\/\n between x (outer_pasch y x v w z) v) /\\\n(!x y z v w.\n ~between x y z \\/ ~between v z w \\/\n between w y (outer_pasch y x v w z)) /\\\n(!x y z v. between x y (extension x y z v)) /\\\n(!x y z v. equidistant x (extension y x z v) z v) /\\\n(!x y z v. ~(x == y) \\/ ~between z v x \\/ between z v y) ==>\n~between a a b ==> F"]}, {name = "GRP057-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z v. x * i (i (i y * (i x * z)) * v * i (y * v)) = z) /\\\n(!x y. ~(x = y) \\/ i x = i y) /\\ (!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) ==>\n~(i a1 * a1 = i b1 * b1) \\/ ~(i b2 * b2 * a2 = a2) \\/\n~(a3 * b3 * c3 = a3 * (b3 * c3)) ==> F"]}, {name = "HEN006-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. ~(x <= y) \\/ x / y = 0) /\\ (!x y. ~(x / y = 0) \\/ x <= y) /\\\n(!x y. x / y <= x) /\\ (!x y z. x / y / (z / y) <= x / z / y) /\\\n(!x. 0 <= x) /\\ (!x y. ~(x <= y) \\/ ~(y <= x) \\/ x = y) /\\ (!x. x <= 1) /\\\n(!x y z. ~(x = y) \\/ x / z = y / z) /\\\n(!x y z. ~(x = y) \\/ z / x = z / y) /\\\n(!x y z. ~(x = y) \\/ ~(x <= z) \\/ y <= z) /\\\n(!x y z. ~(x = y) \\/ ~(z <= x) \\/ z <= y) /\\ a / b <= d ==>\n~(a / d <= b) ==> F"]}, {name = "RNG035-7", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x. 0 + x = x) /\\\n(!x. x + 0 = x) /\\ (!x. n x + x = 0) /\\ (!x. x + n x = 0) /\\\n(!x y z. x + (y + z) = x + y + z) /\\ (!x y. x + y = y + x) /\\\n(!x y z. x * (y * z) = x * y * z) /\\\n(!x y z. x * (y + z) = x * y + x * z) /\\\n(!x y z. (x + y) * z = x * z + y * z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ n x = n y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x. x * (x * (x * x)) = x) ==>\na * b = c /\\ ~(b * a = c) ==> F"]}, {name = "ROB001-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x y. x + y = y + x) /\\\n(!x y z. x + y + z = x + (y + z)) /\\\n(!x y. n (n (x + y) + n (x + n y)) = x) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ n x = n y) ==>\n~(n (a + n b) + n (n a + n b) = b) ==> F"]}, {name = "GRP128-4.003", goal = [ QUOTE "\n(!x y.\n ~elt x \\/ ~elt y \\/ product e_1 x y \\/ product e_2 x y \\/\n product e_3 x y) /\\\n(!x y.\n ~elt x \\/ ~elt y \\/ product x e_1 y \\/ product x e_2 y \\/\n product x e_3 y) /\\ elt e_1 /\\ elt e_2 /\\ elt e_3 /\\ ~(e_1 == e_2) /\\\n~(e_1 == e_3) /\\ ~(e_2 == e_1) /\\ ~(e_2 == e_3) /\\ ~(e_3 == e_1) /\\\n~(e_3 == e_2) /\\\n(!x y.\n ~elt x \\/ ~elt y \\/ product x y e_1 \\/ product x y e_2 \\/\n product x y e_3) /\\\n(!x y z v. ~product x y z \\/ ~product x y v \\/ z == v) /\\\n(!x y z v. ~product x y z \\/ ~product x v z \\/ y == v) /\\\n(!x y z v. ~product x y z \\/ ~product v y z \\/ x == v) ==>\n(!x y z v. product x y z \\/ ~product x z v \\/ ~product z y v) /\\\n(!x y z v. product x y z \\/ ~product v x z \\/ ~product v y x) /\\\n(!x y z v. ~product x y z \\/ ~product z y v \\/ product x z v) ==> F"]}, {name = "NUM014-1", goal = [ QUOTE "\n(!x. product x x (square x)) /\\\n(!x y z. ~product x y z \\/ product y x z) /\\\n(!x y z. ~product x y z \\/ divides x z) /\\\n(!x y z v.\n ~prime x \\/ ~product y z v \\/ ~divides x v \\/ divides x y \\/\n divides x z) /\\ prime a /\\ product a (square c) (square b) ==>\n~divides a b ==> F"]} ]; (* ========================================================================= *) (* A FEW SAMPLE THEOREMS TO CHECK LARGE RUNS *) (* ========================================================================= *) (* val quick = * [extract nonequality "TRUE", * extract nonequality "P_or_not_P", * extract nonequality "JH_test", * extract nonequality "CYCLIC", * extract nonequality "MN_bug", * extract nonequality "ERIC", * extract nonequality "MATHS4_EXAMPLE", * extract nonequality "P18", * extract nonequality "P39", * extract nonequality "P59", * extract nonequality "DAVIS_PUTNAM_EXAMPLE", * extract nonequality "BAD_CONNECTIONS", * * extract equality "TRANS_SYMM", * extract equality "CYCLIC_SUBSTITUTION_BUG", * extract equality "P48"]; *) end (*#line 0.0 "src/Meter1.sig"*) (* ========================================================================= *) (* METERING TIME AND INFERENCES *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Meter1 = sig type 'a pp = 'a Useful.pp (* Search limits *) type limit = {time : real option, infs : int option} val unlimited : limit val expired : limit val limit_to_string : limit -> string (* Meter readings *) type meter_reading = {time : real, infs : int} val zero_reading : meter_reading val add_readings : meter_reading -> meter_reading -> meter_reading val pp_meter_reading : meter_reading pp val meter_reading_to_string : meter_reading -> string (* Meters record time and inferences *) type meter val new_meter : limit -> meter val sub_meter : meter -> limit -> meter val record_infs : meter -> int -> unit val read_meter : meter -> meter_reading val check_meter : meter -> bool val pp_meter : meter pp end (*#line 0.0 "src/Meter1.sml"*) (* ========================================================================= *) (* METERING TIME AND INFERENCES *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1"]; *) (* *) structure Meter1 :> Meter1 = struct open Useful; infix |-> ::> @> oo ## ::* ::@; (* ------------------------------------------------------------------------- *) (* Search limits *) (* ------------------------------------------------------------------------- *) type limit = {time : real option, infs : int option}; val unlimited = {time = NONE, infs = NONE}; val expired = {time = SOME 0.0, infs = SOME 0}; fun limit_to_string {time, infs} = "{time = " ^ (case time of NONE => "unlimited" | SOME r => Real.fmt (StringCvt.FIX (SOME 3)) r ^ "s") ^ ", infs = " ^ (case infs of NONE => "unlimited" | SOME i => int_to_string i) ^ "}"; (* ------------------------------------------------------------------------- *) (* Meter readings. *) (* ------------------------------------------------------------------------- *) type meter_reading = {time : real, infs : int}; val zero_reading = {time = 0.0, infs = 0}; fun add_readings {time : real, infs} {time = time', infs = infs'} = {time = time + time', infs = infs + infs'}; fun pp_meter_reading pp {time, infs} = let open PP val () = begin_block pp INCONSISTENT 1 val () = add_string pp "{"; val () = begin_block pp INCONSISTENT 2 val () = add_string pp "time =" val () = add_break pp (1, 0) val () = add_string pp (Real.fmt (StringCvt.FIX (SOME 3)) time) val () = end_block pp val () = add_string pp "," val () = add_break pp (1, 0) val () = begin_block pp INCONSISTENT 2 val () = add_string pp "infs =" val () = add_break pp (1, 0) val () = pp_int pp infs val () = end_block pp val () = add_string pp "}" val () = end_block pp in () end; fun meter_reading_to_string r = PP.pp_to_string (!LINE_LENGTH) pp_meter_reading r; (* ------------------------------------------------------------------------- *) (* Meters record time and inferences. *) (* ------------------------------------------------------------------------- *) type meter = {read : unit -> meter_reading, log : (int -> unit), lim : limit}; fun new_time_meter () = let val tmr = Timer.startCPUTimer () fun read () = (fn {usr, sys, ...} => Time.toReal (Time.+ (usr, sys))) (Timer.checkCPUTimer tmr) in read end; fun new_inference_meter () = let val infs = ref 0 fun read () = !infs in (read, fn n => infs := !infs + n) end; fun new_meter lim : meter = let val tread = new_time_meter () val (iread, ilog) = new_inference_meter () in {read = (fn () => {time = tread (), infs = iread ()}), log = ilog, lim = lim} end; fun sub_meter {read, log, lim = _} lim = let val {time = init_time : real, infs = init_infs} = read () fun sub {time, infs} = {time = time - init_time, infs = infs - init_infs} in {read = sub o read, log = log, lim = lim} end; val read_meter = fn ({read, ...} : meter) => read (); val check_meter = fn ({read, lim = {time, infs}, ...} : meter) => let val {time = t, infs = i} = read () in (case time of NONE => true | SOME time => t < time) andalso (case infs of NONE => true | SOME infs => i < infs) end; val record_infs = fn ({log, ...} : meter) => log; val pp_meter = pp_map read_meter pp_meter_reading; end (*#line 0.0 "src/Solver1.sig"*) (* ========================================================================= *) (* PACKAGING UP SOLVERS TO ALLOW THEM TO COOPERATE UNIFORMLY *) (* Created by Joe Hurd, March 2002 *) (* ========================================================================= *) signature Solver1 = sig type 'a pp = 'a Useful.pp type 'a stream = 'a Stream.stream type formula = Term1.formula type thm = Thm1.thm type limit = Meter1.limit type meter = Meter1.meter type meter_reading = Meter1.meter_reading type units = Units1.units (* The type of a generic solver *) type solver = formula list -> thm list option stream val contradiction_solver : thm -> solver (* Filters to cut off searching or drop subsumed solutions *) val solved_filter : solver -> solver val subsumed_filter : solver -> solver (* User-friendly interface to generic solvers *) val solve : solver -> formula list -> thm list list val find : solver -> formula list -> thm list option val refute : solver -> thm option (* Solver nodes must construct themselves from the following form. *) type form = {slice : meter ref, (* A meter to stop after each slice *) units : units ref, (* Solvers share a unit cache *) thms : thm list, (* Context, assumed consistent *) hyps : thm list} (* Hypothesis, or set of support *) (* Solver nodes also incorporate a name. *) type node_data = {name : string, solver_con : form -> solver} type solver_node val mk_solver_node : node_data -> solver_node val pp_solver_node : solver_node pp (* At each step we schedule a time slice to the least cost solver node. *) val SLICE : limit ref type cost_fn = meter_reading -> real val time1 : cost_fn (* Time taken (in seconds) *) val time2 : cost_fn (* Time squared *) val infs1 : cost_fn (* Number of inferences made*) val infs2 : cost_fn (* Inferences squared *) (* This allows us to hierarchically arrange solver nodes. *) val combine : (cost_fn * solver_node) list -> solver_node (* Overriding the 'natural' set of support from the problem. *) val set_of_support : (thm -> bool) -> solver_node -> solver_node val everything : thm -> bool val one_negative : thm -> bool val one_positive : thm -> bool val all_negative : thm -> bool (* This one is used by Metis1.prove *) val all_positive : thm -> bool val nothing : thm -> bool (* Initializing a solver node makes it ready for action. *) type init_data = {limit : limit, thms : thm list, hyps : thm list} val initialize : solver_node -> init_data -> solver end (*#line 0.0 "src/Solver1.sml"*) (* ========================================================================= *) (* PACKAGING UP SOLVERS TO ALLOW THEM TO COOPERATE UNIFORMLY *) (* Created by Joe Hurd, March 2002 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1", "Meter1", "Units1", "Solver1"]; *) (* *) structure Solver1 :> Solver1 = struct open Useful Term1 Match1 Thm1 Meter1; infix |-> ::> @> oo ##; structure S = Stream; structure U = Units1; type 'a stream = 'a S.stream; type units = U.units; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Solver1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Solver1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun drop_after f = S.fold (fn x => fn xs => S.CONS (x, if f x then K S.NIL else xs)) S.NIL; fun time_to_string t = let val dp = if t < 10.0 then 2 else if t < 1000.0 then 1 else 0 in Real.fmt (StringCvt.FIX (SOME dp)) t end; fun infs_to_string i = if i < 10000 then int_to_string i else if i < 10000000 then int_to_string (i div 1000) ^ "K" else int_to_string (i div 1000000) ^ "M"; val name_to_string = str o hd o explode; fun option_case n _ NONE = n | option_case _ s (SOME _) = s; (* ------------------------------------------------------------------------- *) (* The type of a generic solver. *) (* ------------------------------------------------------------------------- *) type solver = formula list -> thm list option stream; local fun contr th [False] = [th] | contr th gs = map (C CONTR th) gs; in fun contradiction_solver th = (assert (is_contradiction th) (ERR "contradiction_solver" "thm not |- F"); fn gs => S.CONS (SOME (contr th gs), K S.NIL)); end; (* ------------------------------------------------------------------------- *) (* Filters to cut off searching or drop subsumed solutions. *) (* ------------------------------------------------------------------------- *) local fun concl [] = False | concl [lit] = lit | concl _ = raise BUG "concl" "not a literal"; in fun solved_filter solver goals = let fun solves goals' = can (matchl_literals |<>|) (zip goals' goals) fun final NONE = false | final (SOME ths) = solves (map (concl o clause) ths) in drop_after final (solver goals) end; end; local fun munge s n = "MUNGED__" ^ int_to_string n ^ "__" ^ s; fun munge_lit (n, Atom (Fn (p, a))) = Atom (Fn (munge p n, a)) | munge_lit (n, Not (Atom (Fn (p, a)))) = Not (Atom (Fn (munge p n, a))) | munge_lit _ = raise BUG "munge_lit" "bad literal"; fun distinctivize fms = map munge_lit (enumerate 0 fms); fun advance NONE s = (SOME NONE, s) | advance (SOME ths) s = let val fms = distinctivize (List.mapPartial (total dest_unit) ths) in if non null (Subsume1.subsumed s fms) then (NONE, s) else (SOME (SOME ths), Subsume1.add (fms |-> ()) s) end handle ERR_EXN _ => raise BUG "advance" "shouldn't fail"; in fun subsumed_filter s g = S.partial_maps advance Subsume1.empty (s g); end; (* ------------------------------------------------------------------------- *) (* User-friendly interface to generic solvers *) (* ------------------------------------------------------------------------- *) fun raw_solve s = S.partial_map I o (subsumed_filter (solved_filter s)); fun solve s = S.to_list o (raw_solve s); fun find s = (fn S.NIL => NONE | S.CONS (x, _) => SOME x) o raw_solve s; fun refute s = Option.map unwrap (find s [False]); (* ------------------------------------------------------------------------- *) (* Solver nodes must construct themselves from the following form. *) (* ------------------------------------------------------------------------- *) type form = {slice : meter ref, (* A meter to stop after each slice *) units : units ref, (* Solvers share a unit cache *) thms : thm list, (* Context, assumed consistent *) hyps : thm list}; (* Hypothesis, no assumptions *) (* ------------------------------------------------------------------------- *) (* Solver nodes also incorporate a name. *) (* ------------------------------------------------------------------------- *) type node_data = {name : string, solver_con : form -> solver}; datatype solver_node = Solver_node of {name : string, initial : string, solver_con : form -> solver}; fun mk_solver_node {name, solver_con} = Solver_node {name = name, initial = (str o hd o explode) name, solver_con = solver_con}; val pp_solver_node = pp_map (fn Solver_node {name, ...} => name) pp_string; (* ------------------------------------------------------------------------- *) (* At each step we schedule a time slice to the least cost solver node. *) (* ------------------------------------------------------------------------- *) val SLICE : limit ref = ref {time = SOME (1.0 / 3.0), infs = NONE}; type cost_fn = Meter1.meter_reading -> real; local fun sq x : real = x * x; in val time1 : cost_fn = fn {time, ...} => time; val time2 : cost_fn = fn {time, ...} => sq time; val infs1 : cost_fn = fn {infs, ...} => Real.fromInt infs; val infs2 : cost_fn = fn {infs, ...} => sq (Real.fromInt infs); end; (* ------------------------------------------------------------------------- *) (* This allows us to hierarchically arrange solver nodes. *) (* ------------------------------------------------------------------------- *) local fun name (Solver_node {name, ...}) = name; fun initial (Solver_node {initial, ...}) = initial; fun seq f [] = "" | seq f (h :: t) = foldl (fn (n, s) => s ^ "," ^ f n) (f h) t; in fun combine_names csolvers = "[" ^ seq (name o snd) csolvers ^ "]"; fun combine_initials csolvers = "[" ^ seq (initial o snd) csolvers ^ "]"; end; datatype subnode = Subnode of {name : string, used : meter_reading, cost : meter_reading -> real, solns : (unit -> thm list option stream) option}; fun init_subnode (cost, (name, solver : solver)) goal = Subnode {name = name, used = zero_reading, cost = cost, solns = SOME (fn () => solver goal)}; fun least_cost [] = K NONE | least_cost _ = (SOME o snd o min (fn (r, _) => fn (s, _) => r <= s) o map (fn (n, Subnode {used, cost, ...}) => (cost used, n))) val choose_subnode = W least_cost o List.filter (fn (_, Subnode {solns, ...}) => Option.isSome solns) o enumerate 0; fun subnode_info (Subnode {name, used = {time, infs}, solns, ...}) = name_to_string name ^ "(" ^ time_to_string time ^ "," ^ infs_to_string infs ^ ")" ^ (case solns of NONE => "*" | SOME _ => ""); local fun seq f [] = "" | seq f (h :: t) = foldl (fn (n, s) => s ^ "--" ^ f n) (f h) t; in fun status_info subnodes units = "[" ^ seq subnode_info subnodes ^ "]--u=" ^ U.info units ^ "--"; end; fun schedule check read stat = let fun sched nodes = (chat 2 (stat nodes); if not (check ()) then (chat 1 "?\n"; S.CONS (NONE, fn () => sched nodes)) else case choose_subnode nodes of NONE => (chat 1 "!\n"; S.NIL) | SOME n => let val Subnode {name, used, solns, cost} = List.nth (nodes, n) val () = chat 1 name val seq = (Option.valOf solns) () val r = read () val () = chat 2 ("--t=" ^ time_to_string (#time r) ^ "\n") val used = add_readings used r val (res, solns) = case seq of S.NIL => (NONE, NONE) | S.CONS (a, r) => (a, SOME r) val node = Subnode {name = name, used = used, cost = cost, solns = solns} val nodes = update_nth (K node) n nodes val () = case res of NONE => () | SOME _ => (chat 2 (stat nodes); chat 1 "$\n") in S.CONS (res, fn () => sched nodes) end) in sched end; fun combine_solvers (n, i) csolvers {slice, units, thms, hyps} = let val () = chat 2 (n ^ "--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ ".\n") val meter = ref (new_meter expired) fun f (Solver_node {initial, solver_con, ...}) = (initial, solver_con {slice = meter, units = units, thms = thms, hyps = hyps}) val cnodes = map (I ## f) csolvers fun check () = check_meter (!slice) andalso (meter := sub_meter (!slice) (!SLICE); true) fun read () = read_meter (!meter) fun stat s = status_info s (!units) in fn goal => schedule check read stat (map (C init_subnode goal) cnodes) end; fun combine csolvers = let val n = combine_names csolvers val i = combine_initials csolvers in Solver_node {name = n, initial = i, solver_con = combine_solvers (n, i) csolvers} end; (* ------------------------------------------------------------------------- *) (* Overriding the 'natural' set of support from the problem. *) (* ------------------------------------------------------------------------- *) fun sos_solver_con filt name solver_con {slice, units, thms, hyps} = let val () = chat 2 (name ^ "--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ ".\n") val (hyps', thms') = List.partition filt (thms @ hyps) in solver_con {slice = slice, units = units, thms = thms', hyps = hyps'} end; fun set_of_support filt (Solver_node {name, initial, solver_con}) = let val name' = "!" ^ name in Solver_node {name = name', initial = initial, solver_con = sos_solver_con filt name' solver_con} end; val everything : thm -> bool = K true; val one_negative = (fn x => null x orelse List.exists negative x) o clause; val one_positive = (fn x => null x orelse List.exists positive x) o clause; val all_negative = List.all negative o clause; val all_positive = List.all positive o clause; val nothing : thm -> bool = K false; (* ------------------------------------------------------------------------- *) (* Initializing a solver node makes it ready for action. *) (* ------------------------------------------------------------------------- *) type init_data = {limit : limit, thms : thm list, hyps : thm list} fun initialize (Solver_node {solver_con, ...}) {limit, thms, hyps} = case List.find is_contradiction (thms @ hyps) of SOME th => contradiction_solver th | NONE => let val meter = ref (new_meter expired) val units = ref U.empty val solver = solver_con {slice = meter, units = units, thms = thms, hyps = hyps} in fn g => let val () = meter := new_meter limit in drop_after (fn _ => not (check_meter (!meter))) (solver g) end end; end (*#line 0.0 "src/Meson1.sig"*) (* ========================================================================= *) (* THE MESON PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Meson1 = sig type solver_node = Solver1.solver_node (* Tuning parameters *) type parameters = {ancestor_pruning : bool, ancestor_cutting : bool, state_simplify : bool, cache_cutting : bool, divide_conquer : bool, unit_lemmaizing : bool} val defaults : parameters (* The meson solver *) val meson' : parameters -> solver_node val meson : solver_node (* Uses defaults *) (* The delta preprocessor as a solver *) val delta' : parameters -> solver_node val delta : solver_node (* Uses defaults *) (* The prolog solver *) val prolog' : parameters -> solver_node val prolog : solver_node (* Uses defaults *) end (*#line 0.0 "src/Meson1.sml"*) (* ========================================================================= *) (* THE MESON PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Stream", "Mosml", "Term1", "Thm1", "Canon1", "Match1", "Solver1", "Meter1", "Units1"]; *) (* *) structure Meson1 :> Meson1 = struct open Useful Term1 Match1 Thm1 Canon1 Meter1 Solver1; infix |-> ::> @> oo ##; structure S = Stream; structure N = LiteralNet1; structure U = Units1; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Meson1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Meson1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {ancestor_pruning : bool, ancestor_cutting : bool, state_simplify : bool, cache_cutting : bool, divide_conquer : bool, unit_lemmaizing : bool}; val defaults = {ancestor_pruning = true, ancestor_cutting = true, state_simplify = true, cache_cutting = true, divide_conquer = true, unit_lemmaizing = true}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun halves n = let val n1 = n div 2 in (n1, n - n1) end; fun splittable [] = false | splittable [_] = false | splittable _ = true; (* fun protect r f x = let val v = !r val y = f x handle e as ERR_EXN _ => (r := v; raise e) val () = r := v in y end; fun until p = let open Stream fun u NIL = NIL | u (CONS (x, xs)) = CONS (x, if p x then K NIL else fn () => u (xs ())) in u end; *) local val prefix = "_m"; in val mk_mvar = mk_prefix prefix o int_to_string; fun mk_mvars n i = map (Var o mk_mvar) (interval n i); val dest_mvar = string_to_int o dest_prefix prefix; end; datatype 'a choice = CHOICE of unit -> 'a * 'a choice; fun dest_choice (CHOICE c) = c; val no_choice = (fn () => raise ERR "no_choice" "always fails"); fun binary_choice f g = (fn () => let val (a, c) = f () in (a, CHOICE (binary_choice (dest_choice c) g)) end handle ERR_EXN _ => g ()); fun first_choice [] = no_choice | first_choice [f] = f | first_choice (f :: fs) = binary_choice f (first_choice fs); fun choice_stream f = let val (a, CHOICE c) = f () in S.CONS (a, fn () => choice_stream c) end handle ERR_EXN _ => S.NIL; fun swivel m n l = let val (l1, l') = split l m val (l2, l3) = split l' n in l2 @ l1 @ l3 end; fun thm_proves th False = is_contradiction th | thm_proves th goal = case clause th of [lit] => lit = goal | [] => true | _ => false; fun filter_meter meter = S.filter (fn a => Option.isSome a orelse not (check_meter (!meter))); (* ------------------------------------------------------------------------- *) (* Compiling the rule set used by meson. *) (* ------------------------------------------------------------------------- *) type rule = {asms : formula list, c : formula, thm : thm, asmn : int}; datatype rules = Rules of rule N.literal_map; fun dest_rules (Rules r) = r; val empty_rules = Rules N.empty; val num_all_rules = N.size o dest_rules; val num_initial_rules = #f o N.size_profile o dest_rules; fun num_rules r = num_all_rules r - num_initial_rules r; val rules_unify = N.unify o dest_rules; val pp_rules = pp_map dest_rules (N.pp_literal_map (pp_map (fn {asms, c, ...} => (asms, c)) (pp_binop " ==>" (pp_list pp_formula) pp_formula))); fun add_contrapositives chosen sos th (Rules ruls) = let val th = FRESH_VARS th val lits = clause th val lits' = map negate lits val base = map (fn l => (subtract lits' [negate l], l)) (chosen lits) val contrs = if sos then (lits', False) :: base else base fun f (a, c) = c |-> {asms = a, c = c, thm = th, asmn = length a} in Rules (foldl (fn (h, t) => N.insert (f h) t) ruls contrs) end; fun thms_to_rules chosen thms hyps = let val f = uncurry o add_contrapositives chosen in foldl (f true) (foldl (f false) empty_rules thms) hyps end; val meson_rules = thms_to_rules I; val prolog_rules = thms_to_rules (wrap o hd); (* ------------------------------------------------------------------------- *) (* Creating the delta goals. *) (* ------------------------------------------------------------------------- *) val thms_to_delta_goals = List.concat o map (fn (f,n) => [Atom (Fn (f,new_vars n)), Not (Atom (Fn (f,new_vars n)))]) o foldl (uncurry union) [] o map relations o List.concat o map clause; (* ------------------------------------------------------------------------- *) (* The state passed around by meson. *) (* ------------------------------------------------------------------------- *) type state = {env : subst, depth : int, proof : thm list, offset : int}; fun update_env f ({env, depth, proof, offset} : state) = {env = f env, depth = depth, proof = proof, offset = offset}; fun update_depth f ({env, depth, proof, offset} : state) = {env = env, depth = f depth, proof = proof, offset = offset}; fun update_proof f ({env, depth, proof, offset} : state) = {env = env, depth = depth, proof = f proof, offset = offset}; fun update_offset f ({env, depth, proof, offset} : state) = {env = env, depth = depth, proof = proof, offset = f offset}; (* ------------------------------------------------------------------------- *) (* Ancestor pruning. *) (* ------------------------------------------------------------------------- *) fun ancestor_prune false _ _ = K false | ancestor_prune true env g = let val g' = formula_subst env g fun check a' = a' = g' in List.exists (check o formula_subst env) end; (* ------------------------------------------------------------------------- *) (* Ancestor cutting. *) (* ------------------------------------------------------------------------- *) fun ancestor_cut false _ _ = K false | ancestor_cut true env g = let val g' = negate (formula_subst env g) fun check a' = a' = g' in List.exists (check o formula_subst env) end; (* ------------------------------------------------------------------------- *) (* Cache cutting. *) (* ------------------------------------------------------------------------- *) fun cache_cont c ({offset, ...} : state) = let fun f v = case total dest_mvar v of NONE => true | SOME n => n < offset val listify = Subst1.foldr (fn m as v |-> _ => if f v then cons m else I) [] val mem = ref [] fun purify (s as {env, depth = n, ...} : state) = let val l = listify env fun p (n', l') = n <= n' andalso l = l' in if List.exists p (!mem) then raise ERR "cache_cut" "repetition" else (mem := (n, l) :: (!mem); update_env (K (Subst1.from_maplets l)) s) end in c o purify end; fun cache_cut false = I | cache_cut true = fn f => fn a => fn g => fn c => fn s => f a g (cache_cont c s) s; (* ------------------------------------------------------------------------- *) (* Unit clause shortcut. *) (* ------------------------------------------------------------------------- *) fun grab_unit units (s as {proof = th :: _, ...} : state) = (units := U.add th (!units); s) | grab_unit _ {proof = [], ...} = raise BUG "grab_unit" "no thms"; fun use_unit units g c (s as {env, ...}) = let val prove = partial (ERR "use_unit" "NONE") (U.prove (!units)) in c (update_proof (cons (unwrap (prove [formula_subst env g]))) s) end; fun unit_cut false _ = I | unit_cut true units = fn f => fn a => fn g => fn c => fn s => use_unit units g c s handle ERR_EXN _ => f a g (c o grab_unit units) s; (* ------------------------------------------------------------------------- *) (* The core of meson: ancestor unification or Prolog-style extension. *) (* ------------------------------------------------------------------------- *) fun freshen_rule ({thm, asms, c, ...} : rule) i = let val fvs = FVL (c :: asms) val fvn = length fvs val mvs = mk_mvars i fvn val sub = Subst1.from_maplets (zipwith (curry op|->) fvs mvs) in ((INST sub thm, map (formula_subst sub) asms, formula_subst sub c), i + fvn) end; fun reward r = update_depth (fn n => n + r); fun spend m f c (s as {depth = n, ...} : state) = let val low = n - m val () = assert (0 <= low) (ERR "meson" "impossible divide and conquer") fun check (s' as {depth = n', ...} : state) = if n' <= low then s' else raise ERR "meson" "divide and conquer" in f (c o check) s end; local fun unify env (th, asms, c) g = (th, asms, unify_literals env c g) fun match env (th, asms, c) g = let val sub = match_literals c g in (INST sub th, map (formula_subst sub) asms, env) end; in fun next_state false env r g = unify env r g | next_state true env r g = match env r g handle ERR_EXN _ => unify env r g; end; local fun mp _ th [] p = FACTOR th :: p | mp env th (g :: gs) (th1 :: p) = mp env (RESOLVE (formula_subst env g) (INST env th1) th) gs p | mp _ _ (_ :: _) [] = raise BUG "modus_ponens" "fresh out of thms" in fun modus_ponens th gs (state as {env, ...}) = update_proof (mp env (INST env th) (rev gs)) state; end; fun swivelp m n = update_proof (swivel m n); fun meson_expand {parm : parameters, rules, cut, meter, saturated} = let fun expand ancestors g cont (state as {env, ...}) = if not (check_meter (!meter)) then (NONE, CHOICE (fn () => expand ancestors g cont state)) else if ancestor_prune (#ancestor_pruning parm) env g ancestors then raise ERR "meson" "ancestor pruning" else if ancestor_cut (#ancestor_cutting parm) env g ancestors then (record_infs (!meter) 1; cont (update_proof (cons (ASSUME g)) state)) else let (*val () = print ("meson: " ^ formula_to_string g ^ ".\n")*) fun reduction a () = let val state = update_env (K (unify_literals env g (negate a))) state val state = update_proof (cons (ASSUME g)) state in (record_infs (!meter) 1; cont state) end val expansion = expand_rule ancestors g cont state in first_choice (map reduction ancestors @ map expansion (rules_unify rules (formula_subst env g))) () end and expand_rule ancestors g cont {env, depth, proof, offset} r () = let val depth = depth - #asmn r val () = if 0 <= depth then () else (saturated := false; raise ERR "meson" "too deep") val (r, offset) = freshen_rule r offset val (th, asms, env) = next_state (#state_simplify parm) env r g val () = record_infs (!meter) 1 in expands (g :: ancestors) asms (cont o modus_ponens th asms) {env = env, depth = depth, proof = proof, offset = offset} end and expands ancestors g c (s as {depth = n, ...}) = if #divide_conquer parm andalso splittable g then let val (l1, l2) = halves (length g) val (g1, g2) = split g l1 val (f1, f2) = Df (expands ancestors) (g1, g2) val (n1, n2) = halves n val s = update_depth (K n1) s in binary_choice (fn () => f1 (f2 c o reward n2) s) (fn () => f2 (spend (n1 + 1) f1 (c o swivelp l1 l2) o reward n2) s) () end else foldl (uncurry (cut expand ancestors)) c (rev g) s in cut expand [] end; (* ------------------------------------------------------------------------- *) (* Full meson procedure. *) (* ------------------------------------------------------------------------- *) fun meson_finally g ({env, proof, ...} : state) = let val () = assert (length proof = length g) (BUG "meson" "bad final state") val g' = map (formula_subst env) g val proof' = map (INST env) (rev proof) (*val () = (print "meson_finally: "; printVal (g', proof'); print ".\n")*) val () = assert (List.all (uncurry thm_proves) (zip proof' g')) (BUG "meson" "did not prove goal list") in (SOME (FRESH_VARSL proof'), CHOICE no_choice) end; fun raw_meson system goals depth = choice_stream (fn () => foldl (uncurry (meson_expand system)) (meson_finally goals) (rev goals) {env = |<>|, depth = depth, proof = [], offset = 0}); (* ------------------------------------------------------------------------- *) (* Raw solvers. *) (* ------------------------------------------------------------------------- *) type 'a system = {parm : parameters, rules : rules, meter : meter ref, saturated : bool ref, cut : (formula list -> formula -> (state -> 'a) -> state -> 'a) -> formula list -> formula -> (state -> 'a) -> state -> 'a}; fun mk_system parm units meter rules : 'a system = let val {cache_cutting = caching, unit_lemmaizing = lemmaizing, ...} = parm in {parm = parm, rules = rules, meter = meter, saturated = ref false, cut = unit_cut lemmaizing units o cache_cut caching} end; fun meson' parm = mk_solver_node {name = "meson", solver_con = fn {slice, units, thms, hyps} => let val ruls = meson_rules thms hyps val () = chat 2 ("meson--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--#rules=" ^ int_to_string (num_rules ruls) ^ "--#initial_rules=" ^ int_to_string (num_initial_rules ruls) ^ ".\n") val system as {saturated = b, ...} = mk_system parm units slice ruls fun d n = if !b then S.NIL else (b := true; S.CONS (n, fn () => d (n + 1))) fun f q d = (chat 1 ("-" ^ int_to_string d); raw_meson system q d) fun unit_check goals NONE = U.prove (!units) goals | unit_check _ s = s in fn goals => filter_meter slice (S.map (unit_check goals) (S.flatten (S.map (f goals) (d 0)))) end}; val meson = meson' defaults; fun delta' parm = mk_solver_node {name = "delta", solver_con = fn {slice, units, thms, hyps} => let val ruls = meson_rules thms hyps val dgoals = thms_to_delta_goals hyps val () = chat 2 ("delta--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--#rules=" ^ int_to_string (num_rules ruls) ^ "--#delta_goals=" ^ int_to_string (length dgoals) ^ ".\n") val system as {saturated = b, ...} = mk_system parm units slice ruls val delta_goals = S.from_list dgoals fun d n = if !b then S.NIL else (b := true; S.CONS (n, fn () => d (n + 1))) fun f d g = (chat 1 "+"; S.map (K NONE) (raw_meson system [g] d)) fun g d = (chat 1 (int_to_string d); S.flatten (S.map (f d) delta_goals)) fun h () = S.flatten (S.map g (d 0)) fun unit_check goals NONE = U.prove (!units) goals | unit_check _ s = s in case delta_goals of S.NIL => K S.NIL | _ => fn goals => filter_meter slice (S.map (unit_check goals) (h ())) end}; val delta = delta' defaults; val prolog_depth = case Int.maxInt of NONE => 1000000 | SOME i => i; fun prolog' parm = mk_solver_node {name = "prolog", solver_con = fn {slice, units, thms, hyps} => let val system = mk_system parm units slice (prolog_rules thms hyps) fun comment S.NIL = "!\n" | comment (S.CONS (NONE, _)) = "-" | comment (S.CONS (SOME _, _)) = "$\n" fun f t () = let val x = t () in chat 1 (comment x); x end in fn goals => S.map_thk f (fn () => raw_meson system goals prolog_depth) () end}; val prolog = prolog' defaults; (* quick testing load "Problem1"; open Problem1; val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_rules; installPP pp_thm; val limit : limit ref = ref {infs = NONE, time = SOME 30.0}; fun prolog_solve d q = try (solve (initialize prolog {limit = !limit, thms = d, hyps = []})) q; fun meson_prove g = try (time refute) (initialize (set_of_support all_negative meson) {limit = !limit, thms = [], hyps = axiomatize (Not (generalize g))}); fun delta_prove g = try (time refute) (initialize (set_of_support all_negative delta) {limit = !limit, thms = [], hyps = eq_axiomatize (Not (generalize g))}); (* Testing the delta prover *) val p48 = parse_formula (get equality "P48"); delta_prove p48; (* Testing the prolog solver *) val database = (axiomatize o parse_formula) [ QUOTE "subset nil nil /\\\n (!v x y. subset x y ==> subset (v :: x) (v :: y)) /\\\n (!v x y. subset x y ==> subset x (v :: y))"]; try (prolog_solve database) [parse_formula [QUOTE "subset x (0 :: 1 :: 2 :: nil)"]]; (* takes ages try (prolog_solve database) [parse_formula `subset (0 :: 1 :: 2 :: nil) x`]; *) val database = (axiomatize o parse_formula) [ QUOTE "p 0 3 /\\\n (!x. p x 4) /\\\n (!x. p x 3 ==> p (s (s (s x))) 3) /\\\n (!x. p (s x) 3 ==> p x 3)"]; try (prolog_solve database) [parse_formula [QUOTE "p (s 0) 3"]]; (* Testing the meson prover *) meson_prove True; val p59 = parse_formula (get nonequality "P59"); val ths = axiomatize (Not (generalize p59)); val rules = meson_rules [] ths; rules_unify rules (parse_formula [QUOTE "~P 0"]); meson_prove p59; val p39 = parse_formula (get nonequality "P39"); clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); meson_prove p39; val num14 = parse_formula (get tptp "NUM014-1"); meson_prove num14; val p55 = parse_formula (get nonequality "P55"); meson_prove p55; val p26 = parse_formula (get nonequality "P26"); clausal (Not (generalize p26)); meson_prove p26; val los = parse_formula (get nonequality "LOS"); meson_prove los; val reduced_num284 = parse_formula [ QUOTE "fibonacci 0 (s 0) /\\ fibonacci (s 0) (s 0) /\\\n (!x y z x' y' z'.\n ~sum x (s (s 0)) z \\/ ~sum y (s 0) z \\/\n ~fibonacci x x' \\/ ~fibonacci y y' \\/ ~sum x' y' z' \\/\n fibonacci z z') /\\ (!x. sum x 0 x) /\\\n (!x y z. ~sum x y z \\/ sum x (s y) (s z)) /\\\n (!x. ~fibonacci (s (s (s (s (s (s (s (s 0)))))))) x) ==> F"]; meson_prove reduced_num284; val p29 = parse_formula (get nonequality "P29"); clausal (Not (generalize p29)); meson_prove p29; val num1 = parse_formula (get tptp "NUM001-1"); meson_prove num1; val model_completeness = parse_formula (get nonequality "MODEL_COMPLETENESS"); meson_prove model_completeness; *) end (*#line 0.0 "src/Resolvers1.sig"*) (* ========================================================================= *) (* A TYPE TO FIND RESOLVANT CLAUSES *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Resolvers1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type subst = Subst1.subst type thm = Thm1.thm type resolvers type resolvant = {mate : thm, sub : subst, res : thm} val empty_resolvers : resolvers val add_resolver : thm -> resolvers -> resolvers val find_resolvants : resolvers -> thm -> resolvant list val resolvers_info : resolvers -> string val pp_resolvers : resolvers pp end (*#line 0.0 "src/Resolvers1.sml"*) (* ========================================================================= *) (* A TYPE TO FIND RESOLVANT CLAUSES *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Thm1", "Match1"]; *) (* *) structure Resolvers1 :> Resolvers1 = struct infix |-> ::>; open Useful Term1 Match1 Thm1 Canon1; structure N = LiteralNet1; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Resolvers1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Resolvers1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun trich l n = case split l n of (_, []) => raise ERR "trich" "no exact" | (l, h :: t) => (l, h, t); (* ------------------------------------------------------------------------- *) (* The type definition with some simple operations. *) (* ------------------------------------------------------------------------- *) type resolvers = (int * thm) N.literal_map; type resolvant = {mate : thm, sub : subst, res : thm}; val empty_resolvers : resolvers = N.empty; fun add_resolver th = let fun add_lit ((n, lit), net) = N.insert (lit |-> (n, th)) net in fn net => foldl add_lit net (enumerate 0 (clause th)) end; fun resolvers_info (net : resolvers) = int_to_string (N.size net); val pp_resolvers = pp_map resolvers_info pp_string; val dest_resolvers : resolvers -> thm list = map snd o List.filter (equal 0 o fst) o N.to_list; (* ------------------------------------------------------------------------- *) (* A reference implementation for debugging. *) (* ------------------------------------------------------------------------- *) fun canonize lits = let val nvars = enumerate 0 (FV (list_mk_conj lits)) val ms = map (fn (n, v) => v |-> Var ("__" ^ (int_to_string n))) nvars in map (formula_subst (Subst1.from_maplets ms)) lits end; local fun subs acc [] = acc | subs acc ((prev, []) :: others) = subs (prev :: acc) others | subs acc ((prev, h :: t) :: others) = subs acc ((h :: prev, t) :: (prev, t) :: others); in fun all_nonempty_subsets l = tl (subs [] [([], l)]); end; fun pairs [] = raise ERR "pairs" "empty" | pairs [h] = [] | pairs (h :: (t as h' :: _)) = (h, h') :: pairs t; fun sanity_resolve_on th th' s s' = let val sub = unifyl_literals |<>| (pairs (s @ s')) val lit = formula_subst sub (hd s) val res = FACTOR (RESOLVE lit (INST sub th) (INST sub th')) in {mate = th', sub = sub, res = res} end; fun sanity_resolve th th' = List.mapPartial I (cartwith (total o sanity_resolve_on th th') (all_nonempty_subsets (clause th)) (all_nonempty_subsets (map negate (clause th')))); fun sanity_resolvants net th = List.concat (map (sanity_resolve th) (dest_resolvers net)); fun sanity_check net th (res : resolvant list) = let val () = chat 1 "X" val f = PP.pp_to_string (!LINE_LENGTH) (pp_list (pp_map AXIOM pp_thm)) val fast = map (canonize o clause o #res) res val slow = map (canonize o clause o #res) (sanity_resolvants net th) val () = if subset fast slow then () else (print ("\nsanity_check: extra clauses:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nfast = " ^ f fast ^ "\nslow = " ^ f slow ^ "\nextra = " ^ f (subtract fast slow) ^ "\nmissing = " ^ f (subtract slow fast) ^ "\n"); raise BUG "find_resolvants" "extra clauses!") val () = if subset slow fast then () else (print ("\nsanity_check: missing clauses:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nfast = " ^ f fast ^ "\nslow = " ^ f slow ^ "\nmissing = " ^ f (subtract slow fast) ^ "\nextra = " ^ f (subtract fast slow) ^ "\n"); raise BUG "find_resolvants" "missing clauses") (* val () = (print ("\nsanity_check: ok:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nres = " ^ f fast ^ "\n")) *) in () end; (* ------------------------------------------------------------------------- *) (* The core engine for combined factor/resolution steps. *) (* ------------------------------------------------------------------------- *) fun resolve_on s r th th' = SOME (FACTOR (RESOLVE r (INST s th) (INST s th'))); fun resolve acc [] = acc | resolve acc ((avoid, sub, res, []) :: others) = resolve (if mem res (map (formula_subst sub) avoid) then acc else (res, sub) :: acc) others | resolve acc ((avoid, sub, res, x :: xs) :: others) = let fun f c = resolve acc (c ((x :: avoid, sub, res, xs) :: others)) in case total (unify_literals sub res) x of NONE => f I | SOME sub' => f (cons (avoid, Subst1.refine sub sub', formula_subst sub' res, xs)) end; fun resolve_from (n, th) (n', th') = let val (prev, lit, succ) = trich (clause th) n val (prev', lit', succ') = trich (map negate (clause th')) n' val sub = unify_literals |<>| lit lit' val res = formula_subst sub lit fun f (r, s) = Option.map (pair s) (resolve_on s r th th') in List.mapPartial f (resolve [] [(prev @ prev', sub, res, succ @ succ')]) end; fun resolvants net th = let fun g (_, mate) ((sub, res), l) = {mate = mate, sub = sub, res = res} :: l fun r m (u, acc) = case total (resolve_from (m, th)) u of NONE => acc | SOME l => foldl (g u) acc l fun f ((m, lit), acc) = foldl (r m) acc (N.unify net (negate lit)) val res = foldl f [] (enumerate 0 (clause th)) (*val () = sanity_check net th res*) in res end fun find_resolvants net th = List.filter (non tautologous o clause o #res) (resolvants net th) handle ERR_EXN _ => raise BUG "find_resolvants" "should never fail"; (* Quick testing quotation := true; installPP pp_formula; installPP pp_term; installPP pp_subst; installPP pp_thm; val th = AXIOM (map parse [`p(3, x, v)`, `q(x)`, `p(3, x, z)`]); val th' = AXIOM (map parse [`~p(3, f(y), w)`, `~q(y)`, `~p(3, f(y), 4)`]); try (resolve_from (0, th)) (0, th'); try (resolve_from (2, th)) (0, th'); try (resolve_from (0, th)) (2, th'); try (resolve_from (2, th)) (2, th'); val r = add_resolver th' empty_resolvers; map #res (find_resolvants r th); *) end (*#line 0.0 "src/Theap1.sig"*) (* ========================================================================= *) (* A TYPE TO STORE CLAUSES WAITING TO BE USED (THEAP = THEOREM HEAP) *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Theap1 = sig type 'a subsume = 'a Subsume1.subsume type thm = Thm1.thm (* Tuning parameters *) type parameters = {fifo_skew : int, cleaning_freq : int} val defaults : parameters (* Theorem HEAPs *) type theap val new_theap : parameters -> theap val empty_theap : theap (* Uses defaults *) val theap_size : theap -> int val theap_add : thm -> theap -> theap val theap_addl : thm list -> theap -> theap val theap_remove : theap -> (thm * theap) option val theap_subsumers : theap -> thm subsume val theap_info : theap -> string (* Outputs "(size,weight)" *) end (*#line 0.0 "src/Theap1.sml"*) (* ========================================================================= *) (* A TYPE TO STORE CLAUSES WAITING TO BE USED (THEAP = THEOREM HEAP) *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Heap", "Queue", "Thm1", "Subsumers1"]; *) (* *) structure Theap1 :> Theap1 = struct infix |->; open Useful Term1 Thm1; structure Q = Queue; structure H = Heap; structure S = Subsume1; type 'a queue = 'a Q.queue; type 'a heap = 'a H.heap; type 'a subsume = 'a S.subsume; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {fifo_skew : int, cleaning_freq : int} val defaults = {fifo_skew = 3, cleaning_freq = 1000}; (* ------------------------------------------------------------------------- *) (* Theorem HEAPs. *) (* ------------------------------------------------------------------------- *) type theap = ((int * int) * (int * int)) * thm queue * (int * (int * thm) heap) * thm subsume; local fun order ((m, _ : thm), (n, _ : thm)) = Int.compare (m, n); in val empty_theap_heap = H.empty order; end; fun new_theap {fifo_skew, cleaning_freq} = ((D cleaning_freq, D fifo_skew), Q.empty, (0, empty_theap_heap), S.empty); val empty_theap: theap = new_theap defaults; fun theap_size (_, _, (_, h), _) = H.size h; fun theap_weight (_, _, (w, _), _) = w; (* fun clean_theap (((_, C), F), Q, (_, H), _) = let val hash = Polyhash.mkPolyTable (10000, ERR "cleap_theap" "not found") fun mark (v, th) = Polyhash.insert hash (clause th, v) val () = H.app mark H fun add (v, th) (q, w, h, l) = (Q.add th q, w + v, H.add (v, th) h, S.add (clause th |-> th) l) fun check q n = if Q.is_empty q then n else let val th = Q.hd q in check (Q.tl q) (case total (Polyhash.remove hash) (clause th) of NONE => n | SOME v => add (v, th) n) end in (fn (q, w, h, l) => (((C, C), F), q, (w, h), l)) (check Q (Q.empty, 0, empty_theap_heap, S.empty)) end; *) (*fun theap_add th (h as (((0,_), _), _, _, _)) = theap_add th (clean_theap h)*) fun theap_add th (((c, cm), f), q, (w, h), l) = let val cl = clause th val v = formula_size (list_mk_disj cl) val h' = H.add (v, th) h in (((c - 1, cm), f), Q.add th q, (w + v, h'), S.add (clause th |-> th) l) end; fun theap_addl ths h = foldl (uncurry theap_add) h ths; fun theap_remove ((c, (0, f)), q, h, l) = if Q.is_empty q then NONE else SOME (Q.hd q, ((c, (f, f)), Q.tl q, h, l)) | theap_remove ((c, (n, f)), q, (w, h), l) = if H.is_empty h then NONE else let val ((v, x), h) = H.remove h in SOME (x, ((c, (n - 1, f)), q, (w - v, h), l)) end; fun theap_subsumers (_, _, _, l) = l; fun theap_info thp = "(" ^ int_to_string (theap_size thp) ^ "," ^ int_to_string (theap_weight thp) ^ ")"; end (*#line 0.0 "src/Resolution1.sig"*) (* ========================================================================= *) (* THE RESOLUTION PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Resolution1 = sig type solver_node = Solver1.solver_node (* Tuning parameters *) type parameters = {subsumption_checking : int, (* in the range 0..3 *) positive_refinement : bool, theap_parm : Theap1.parameters} val defaults : parameters (* Resolution *) val resolution' : parameters -> solver_node val resolution : solver_node (* Uses defaults *) end (*#line 0.0 "src/Resolution1.sml"*) (* ========================================================================= *) (* THE RESOLUTION PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Theap1", "Stream", "Solver1", "Meter1", "Units1", "Resolvers1"]; *) (* *) structure Resolution1 :> Resolution1 = struct open Useful Term1 Thm1 Canon1 Meter1 Solver1 Resolvers1 Theap1; infix |-> ::> @> oo ## ::* ::@; structure S = Stream; structure U = Units1; type 'a subsume = 'a Subsume1.subsume; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Resolution1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Resolution1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {subsumption_checking : int, (* in the range 0..3 *) positive_refinement : bool, theap_parm : Theap1.parameters} val defaults = {subsumption_checking = 1, positive_refinement = true, theap_parm = Theap1.defaults}; (* ------------------------------------------------------------------------- *) (* Clause stores. *) (* ------------------------------------------------------------------------- *) type store = thm subsume * resolvers; val empty_store : store = (Subsume1.empty, empty_resolvers); fun store_add th (s, r) = (Subsume1.add (clause th |-> th) s, add_resolver th r); fun store_resolvants ((_, r) : store) = find_resolvants r; fun store_subsumed ((s, _) : store) = Subsume1.subsumed s o clause; fun store_info (s, r) = "(" ^ Subsume1.info s ^ "," ^ resolvers_info r ^ ")"; (* ------------------------------------------------------------------------- *) (* Positive refinement. *) (* ------------------------------------------------------------------------- *) local val pos_th = List.all positive o clause; fun check true = K true | check false = fn ({mate, ...} : resolvant) => pos_th mate; in fun positive_check false = K (K true) | positive_check true = check o pos_th; end; (* ------------------------------------------------------------------------- *) (* Full resolution procedure. *) (* ------------------------------------------------------------------------- *) exception Contradiction of thm; fun unit_strengthen units th = (case first (U.subsumes units) (clause th) of SOME th => th | NONE => U.demod units th); fun subsumption_check store th = case store_subsumed store th of [] => SOME th | _ :: _ => NONE; fun theap_strengthen theap th = (case Subsume1.strictly_subsumed (theap_subsumers theap) (clause th) of [] => th | (_, th) :: _ => th); fun resolve (parm : parameters) = let fun feedback k r = int_to_string k ^ (if k = r then "" else "/" ^ int_to_string r) fun L n = n <= #subsumption_checking parm val pos_filt = Option.filter o positive_check (#positive_refinement parm) fun ftest b f = if b then Option.mapPartial (subsumption_check f) else I fun stest b s = if b then subsumption_check s else SOME fun wpass b w = if b then theap_strengthen w else I fun upass u = unit_strengthen u fun next_candidate u f s w = case theap_remove w of NONE => NONE | SOME (th, w) => (case (ftest (L 1) f o stest (L 1) s o wpass (L 2) w o upass u) th of NONE => next_candidate u f s w | SOME th => SOME (th, w)) fun retention_test u f s th = List.mapPartial (Option.mapPartial (ftest (L 3) f o stest (L 3) s o upass u o #res) o pos_filt th) fun check_add th = if is_contradiction th then raise Contradiction th else U.add th in fn record => fn (facts, used, unused) => fn units => (case next_candidate units facts used unused of NONE => NONE | SOME (th, unused) => let val units = check_add th units val used = store_add th used val th = FRESH_VARS th val resolvants = store_resolvants facts th @ store_resolvants used th val () = record (length resolvants) val units = foldl (uncurry check_add) units (map #res resolvants) val keep = retention_test units facts used th resolvants val () = chat 2 (feedback (length keep) (length resolvants)) val unused = theap_addl keep unused in SOME ((facts, used, unused), units) end) handle ERR_EXN _ => raise BUG "resolve" "shouldn't fail" end; fun raw_resolution parm = mk_solver_node {name = "resolution", solver_con = fn {slice, units, thms, hyps} => let val resolve' = resolve parm fun run wrap state = if not (check_meter (!slice)) then S.CONS (NONE, wrap state) else (chat 1 "+"; case resolve' (record_infs (!slice)) state (!units) of NONE => S.NIL | SOME (state, units') => (units := units'; run wrap state)) fun wrapper g (a as (_, _, w)) () = (chat 2 (theap_info w); run (wrapper g) a) handle Contradiction th => contradiction_solver th g val facts = foldl (fn (t, l) => store_add t l) empty_store thms val used = empty_store val unused = theap_addl hyps (new_theap (#theap_parm parm)) val () = chat 2 ("resolution--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--facts=" ^ store_info facts ^ "--unused=" ^ theap_info unused ^ ".\n") in fn goals => wrapper goals (facts, used, unused) () end}; fun resolution' parm = (if #positive_refinement parm then set_of_support everything else I) (raw_resolution parm); val resolution = resolution' defaults; (* quick testing load "Problem1"; open Problem1; val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_thm; (* Testing the resolution prover *) val limit : limit ref = ref {infs = NONE, time = SOME 30.0}; fun resolution_prove g = try (time refute) (initialize (set_of_support all_negative resolution) {limit = !limit, thms = [], hyps = axiomatize (Not (generalize g))}); axiomatize (Not (generalize True)); resolution_prove True; val prop13 = parse_formula (get nonequality "PROP_13"); axiomatize (Not (generalize prop13)); resolution_prove prop13; val p33 = parse_formula (get nonequality "P33"); axiomatize (Not (generalize p33)); resolution_prove p33; val p59 = parse_formula (get nonequality "P59"); val ths = axiomatize (Not (generalize p59)); resolution_prove p59; val p39 = parse_formula (get nonequality "P39"); clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); resolution_prove p39; val num14 = parse_formula (get tptp "NUM014-1"); resolution_prove num14; val p55 = parse_formula (get nonequality "P55"); resolution_prove p55; val p26 = parse_formula (get nonequality "P26"); clausal (Not (generalize p26)); resolution_prove p26; val los = parse_formula (get nonequality "LOS"); resolution_prove los; val reduced_num284 = parse_formula [ QUOTE "fibonacci 0 (s 0) /\\ fibonacci (s 0) (s 0) /\\\n (!x y z x' y' z'.\n ~sum x (s (s 0)) z \\/ ~sum y (s 0) z \\/\n ~fibonacci x x' \\/ ~fibonacci y y' \\/ ~sum x' y' z' \\/\n fibonacci z z') /\\ (!x. sum x 0 x) /\\\n (!x y z. ~sum x y z \\/ sum x (s y) (s z)) /\\\n (!x. ~fibonacci (s (s (s (s (s (s (s (s 0)))))))) x) ==> F"]; resolution_prove reduced_num284; val p29 = parse_formula (get nonequality "P29"); clausal (Not (generalize p29)); resolution_prove p29; val num1 = parse_formula (get tptp "NUM001-1"); resolution_prove num1; val gilmore9 = parse_formula (get nonequality "GILMORE_9"); axiomatize (Not (generalize gilmore9)); resolution_prove gilmore9; val model_completeness = parse_formula (get nonequality "MODEL_COMPLETENESS"); resolution_prove model_completeness; *) end (*#line 0.0 "src/Metis1.sig"*) (* ========================================================================= *) (* THE METIS COMBINATION OF PROOF PROCEDURES FOR FIRST-ORDER LOGIC *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Metis1 = sig type formula = Term1.formula type thm = Thm1.thm type limit = Meter1.limit type solver = Solver1.solver type solver_node = Solver1.solver_node (* Tuning parameters *) type Mparm = Meson1.parameters type Rparm = Resolution1.parameters type parameters = {meson : bool, delta : bool, resolution : bool, meson_parm : Mparm, resolution_parm : Rparm} val defaults : parameters val update_parm_meson : (bool -> bool) -> parameters -> parameters val update_parm_delta : (bool -> bool) -> parameters -> parameters val update_parm_resolution : (bool -> bool) -> parameters -> parameters val update_parm_meson_parm : (Mparm -> Mparm) -> parameters -> parameters val update_parm_resolution_parm : (Rparm -> Rparm) -> parameters -> parameters (* The metis combination of solvers *) val metis' : parameters -> solver_node val metis : solver_node (* Uses defaults *) (* A user-friendly interface *) val settings : parameters ref (* Starts off as defaults *) val limit : limit ref (* Starts off as 10 seconds *) val raw_prove : formula -> thm option (* Expects a ==> b ==> F *) val prove : formula -> thm option (* Adds eq axioms, converts to CNF *) val query : formula -> solver (* Prolog query engine *) end (*#line 0.0 "src/Metis1.sml"*) (* ========================================================================= *) (* THE METIS COMBINATION OF PROOF PROCEDURES FOR FIRST-ORDER LOGIC *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Solver1", "Meson1", "Resolution1"]; *) (* *) structure Metis1 :> Metis1 = struct open Useful Term1 Thm1 Meter1 Canon1 Solver1 Meson1 Resolution1; infix |-> ::> @> oo ## ::* ::@; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type Mparm = Meson1.parameters; type Rparm = Resolution1.parameters; type parameters = {meson : bool, delta : bool, resolution : bool, meson_parm : Mparm, resolution_parm : Rparm}; val defaults = {meson = true, delta = true, resolution = true, meson_parm = Meson1.defaults, resolution_parm = Resolution1.defaults}; fun update_parm_meson f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = f meson, delta = delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_delta f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = f delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_resolution f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = f resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_meson_parm f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = resolution, meson_parm = f meson_parm, resolution_parm = resolution_parm} end; fun update_parm_resolution_parm f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = f resolution_parm} end; (* ------------------------------------------------------------------------- *) (* The metis combination of solvers. *) (* ------------------------------------------------------------------------- *) fun metis' {meson = m, delta = d, resolution = r, meson_parm, resolution_parm} = combine ((if m then cons (time1, meson' meson_parm) else I) ((if r then cons (time1, resolution' resolution_parm) else I) ((if d then cons (time2, delta' meson_parm) else I) []))); val metis = metis' defaults; (* ------------------------------------------------------------------------- *) (* A user-friendly interface. *) (* ------------------------------------------------------------------------- *) val settings = ref defaults; val limit : limit ref = ref {time = NONE, infs = NONE}; fun raw_prove (Imp (a, Imp (b, False))) = let val (thms, hyps) = (axiomatize a, axiomatize b) val solv = metis' (!settings) in refute (initialize solv {limit = !limit, thms = thms, hyps = hyps}) end | raw_prove _ = raise ERR "raw_prove" "formula not of type a ==> b ==> F"; fun prove g = let val hyps = eq_axiomatize' (Not (generalize g)) val solv = set_of_support all_negative (metis' (!settings)) in refute (initialize solv {limit = !limit, thms = [], hyps = hyps}) end; fun query database = initialize prolog {thms = axiomatize database, hyps = [], limit = unlimited}; (* quick testing val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_thm; (* Testing the metis prover *) prove True; val p59 = parse_formula [QUOTE "(!x. P(x) <=> ~P(f(x))) ==> (?x. P(x) /\\ ~P(f(x)))"]; val ths = axiomatize (Not (generalize p59)); prove p59; val p39 = parse_formula [QUOTE "~(?x. !y. P(y,x) <=> ~P(y,y))"]; clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); prove p39; val num14 = parse_formula [ QUOTE "(!X. product(X, X, square(X))) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ product(Y, X, Z)) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ divides(X, Z)) /\\\n (!Y X V Z.\n ~prime(X) \\/ ~product(Y, Z, V) \\/ ~divides(X, V) \\/ divides(X, Y) \\/\n divides(X, Z)) /\\ prime(a) /\\\n product(a, square(c), square(b)) /\\ ~divides(a, b) ==> F"]; prove num14; val p26 = parse_formula [ QUOTE "((?x. P(x)) <=> (?x. Q(x))) /\\\n (!x y. P(x) /\\ Q(y) ==> (R(x) <=> U(y))) ==>\n ((!x. P(x) ==> R(x)) <=> (!x. Q(x) ==> U(x)))"]; clausal (Not (generalize p26)); prove p26; val los = parse_formula [ QUOTE "(!x y z. P x y ==> P y z ==> P x z) /\\\n (!x y z. Q x y ==> Q y z ==> Q x z) /\\ (!x y. Q x y ==> Q y x) /\\\n (!x y. P x y \\/ Q x y) ==> (!x y. P x y) \\/ !x y. Q x y"]; try prove los; val puz2 = parse_formula [ QUOTE "(!X. equal(X, X)) /\\ (!Y X. ~equal(X, Y) \\/ equal(Y, X)) /\\\n (!Z X Y. ~equal(X, Y) \\/ ~equal(Y, Z) \\/ equal(X, Z)) /\\\n (!B A. ~equal(A, B) \\/ equal(every_one_but(A), every_one_but(B))) /\\\n (!E C D. ~equal(C, D) \\/ ~hates(C, E) \\/ hates(D, E)) /\\\n (!H F_avoid G.\n ~equal(F_avoid, G) \\/ ~hates(H, F_avoid) \\/ hates(H, G)) /\\\n (!K I J. ~equal(I, J) \\/ ~killed(I, K) \\/ killed(J, K)) /\\\n (!N L M. ~equal(L, M) \\/ ~killed(N, L) \\/ killed(N, M)) /\\\n (!P O.\n ~equal(O, P) \\/ ~lives_at_dreadsbury(O) \\/ lives_at_dreadsbury(P)) /\\\n (!S Q R. ~equal(Q, R) \\/ ~richer(Q, S) \\/ richer(R, S)) /\\\n (!V T_avoid U.\n ~equal(T_avoid, U) \\/ ~richer(V, T_avoid) \\/ richer(V, U)) /\\\n lives_at_dreadsbury(someone()) /\\ killed(someone(), aunt_agatha()) /\\\n lives_at_dreadsbury(aunt_agatha()) /\\ lives_at_dreadsbury(butler()) /\\\n lives_at_dreadsbury(charles()) /\\\n (!Person.\n ~lives_at_dreadsbury(Person) \\/ equal(Person, aunt_agatha()) \\/\n equal(Person, butler()) \\/ equal(Person, charles())) /\\\n (!Victim Killer. ~killed(Killer, Victim) \\/ hates(Killer, Victim)) /\\\n (!Victim Killer. ~killed(Killer, Victim) \\/ ~richer(Killer, Victim)) /\\\n (!Person. ~hates(aunt_agatha(), Person) \\/ ~hates(charles(), Person)) /\\\n (!Person. equal(Person, butler()) \\/ hates(aunt_agatha(), Person)) /\\\n (!Person. richer(Person, aunt_agatha()) \\/ hates(butler(), Person)) /\\\n (!Person. ~hates(aunt_agatha(), Person) \\/ hates(butler(), Person)) /\\\n (!Person. ~hates(Person, every_one_but(Person))) /\\\n ~equal(aunt_agatha(), butler()) /\\\n ~killed(aunt_agatha(), aunt_agatha()) ==> F"]; prove puz2; val num284 = parse_formula [ QUOTE "fibonacci(0, successor(0)) /\\ fibonacci(successor(0), successor(0)) /\\\n (!N2 N1 N F1 FN F2.\n ~sum(N1, successor(0), N) \\/ ~sum(N2, successor(successor(0)), N) \\/\n ~fibonacci(N1, F1) \\/ ~fibonacci(N2, F2) \\/ ~sum(F1, F2, FN) \\/\n fibonacci(N, FN)) /\\ (!X. sum(X, 0, X)) /\\\n (!Z X Y. ~sum(X, Y, Z) \\/ sum(X, successor(Y), successor(Z))) /\\\n (!Result.\n ~fibonacci(successor(successor(successor(successor(successor(successor(successor(successor(0)))))))),\n Result)) ==> F"]; prove num284; val p29 = parse_formula [ QUOTE "(?x. P(x)) /\\ (?x. G(x)) ==>\n ((!x. P(x) ==> H(x)) /\\ (!x. G(x) ==> J(x)) <=>\n (!x y. P(x) /\\ G(y) ==> H(x) /\\ J(y)))"]; clausal (Not (generalize p29)); prove p29; val num27 = parse_formula [ QUOTE "(!A. equalish(add(A, 0), A)) /\\\n (!A B. equalish(add(A, successor(B)), successor(add(A, B)))) /\\\n (!A. equalish(multiply(A, 0), 0)) /\\\n (!A B. equalish(multiply(A, successor(B)), add(multiply(A, B), A))) /\\\n (!B A. ~equalish(successor(A), successor(B)) \\/ equalish(A, B)) /\\\n (!B A. ~equalish(A, B) \\/ equalish(successor(A), successor(B))) /\\\n (!C A B. ~less(A, B) \\/ ~less(C, A) \\/ less(C, B)) /\\\n (!C B A. ~equalish(add(successor(A), B), C) \\/ less(B, C)) /\\\n (!B A.\n ~less(A, B) \\/\n equalish(add(successor(predecessor_of_1st_minus_2nd(B, A)), A),\n B)) /\\ (!X. equalish(X, X)) /\\\n (!Y X. ~equalish(X, Y) \\/ equalish(Y, X)) /\\\n (!Z X Y. ~equalish(X, Y) \\/ ~equalish(Y, Z) \\/ equalish(X, Z)) /\\\n (!C A B. ~equalish(A, B) \\/ equalish(multiply(A, C), multiply(B, C))) /\\\n (!B A. ~less(A, B) \\/ ~equalish(A, B)) /\\\n (!B A. less(A, B) \\/ equalish(B, A) \\/ less(B, A)) /\\\n (!A. ~less(A, A)) /\\ (!A. ~equalish(successor(A), 0)) /\\\n (!C A B.\n ~less(A, B) \\/ equalish(C, 0) \\/\n less(multiply(A, C), multiply(B, C))) /\\ ~less(b(), a()) /\\\n less(multiply(b(), c()), multiply(a(), c())) /\\ ~equalish(c(), 0) ==>\n F"]; prove num27; val model_completeness = parse_formula [ QUOTE "(!M p. sentence(p) ==> holds(M,p) \\/ holds(M,not(p))) /\\\n (!M p. ~(holds(M,p) /\\ holds(M,not(p)))) ==>\n ((!p.\n sentence(p) ==>\n (!M. models(M,S) ==> holds(M,p)) \\/\n (!M. models(M,S) ==> holds(M,not(p)))) <=>\n (!M M'.\n models(M,S) /\\ models(M',S) ==>\n (!p. sentence(p) ==> (holds(M,p) <=> holds(M',p)))))"]; prove model_completeness; val agatha = parse_formula [ QUOTE "lives(agatha()) /\\ lives(butler()) /\\ lives(charles()) /\\\n (killed(agatha(),agatha()) \\/ killed(butler(),agatha()) \\/\n killed(charles(),agatha())) /\\\n (!x y. killed(x,y) ==> hates(x,y) /\\ ~richer(x,y)) /\\\n (!x. hates(agatha(),x) ==> ~hates(charles(),x)) /\\\n (hates(agatha(),agatha()) /\\ hates(agatha(),charles())) /\\\n (!x. lives(x) /\\ ~richer(x,agatha()) ==> hates(butler(),x)) /\\\n (!x. hates(agatha(),x) ==> hates(butler(),x)) /\\\n (!x. ~hates(x,agatha()) \\/ ~hates(x,butler()) \\/ ~hates(x,charles()))\n ==>\n killed(agatha(),agatha()) /\\ ~killed(butler(),agatha()) /\\\n ~killed(charles(),agatha())"]; prove agatha; val boo3 = parse_formula [ QUOTE "(!X. equal(X, X)) /\\ (!Y X. ~equal(X, Y) \\/ equal(Y, X)) /\\\n (!Z X Y. ~equal(X, Y) \\/ ~equal(Y, Z) \\/ equal(X, Z)) /\\\n (!Y X. sum(X, Y, add(X, Y))) /\\ (!Y X. product(X, Y, multiply(X, Y))) /\\\n (!Z X Y. ~sum(X, Y, Z) \\/ sum(Y, X, Z)) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ product(Y, X, Z)) /\\\n (!X. sum(additive_identity(), X, X)) /\\\n (!X. sum(X, additive_identity(), X)) /\\\n (!X. product(multiplicative_identity(), X, X)) /\\\n (!X. product(X, multiplicative_identity(), X)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~product(X, Y, V1) \\/ ~product(X, Z, V2) \\/ ~sum(Y, Z, V3) \\/\n ~product(X, V3, V4) \\/ sum(V1, V2, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~product(X, Y, V1) \\/ ~product(X, Z, V2) \\/ ~sum(Y, Z, V3) \\/\n ~sum(V1, V2, V4) \\/ product(X, V3, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~product(Y, X, V1) \\/ ~product(Z, X, V2) \\/ ~sum(Y, Z, V3) \\/\n ~product(V3, X, V4) \\/ sum(V1, V2, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~product(Y, X, V1) \\/ ~product(Z, X, V2) \\/ ~sum(Y, Z, V3) \\/\n ~sum(V1, V2, V4) \\/ product(V3, X, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~sum(X, Y, V1) \\/ ~sum(X, Z, V2) \\/ ~product(Y, Z, V3) \\/\n ~sum(X, V3, V4) \\/ product(V1, V2, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~sum(X, Y, V1) \\/ ~sum(X, Z, V2) \\/ ~product(Y, Z, V3) \\/\n ~product(V1, V2, V4) \\/ sum(X, V3, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~sum(Y, X, V1) \\/ ~sum(Z, X, V2) \\/ ~product(Y, Z, V3) \\/\n ~sum(V3, X, V4) \\/ product(V1, V2, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~sum(Y, X, V1) \\/ ~sum(Z, X, V2) \\/ ~product(Y, Z, V3) \\/\n ~product(V1, V2, V4) \\/ sum(V3, X, V4)) /\\\n (!X. sum(inverse(X), X, multiplicative_identity())) /\\\n (!X. sum(X, inverse(X), multiplicative_identity())) /\\\n (!X. product(inverse(X), X, additive_identity())) /\\\n (!X. product(X, inverse(X), additive_identity())) /\\\n (!V X Y U. ~sum(X, Y, U) \\/ ~sum(X, Y, V) \\/ equal(U, V)) /\\\n (!V X Y U. ~product(X, Y, U) \\/ ~product(X, Y, V) \\/ equal(U, V)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(X, W, Z) \\/ sum(Y, W, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(W, X, Z) \\/ sum(W, Y, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(W, Z, X) \\/ sum(W, Z, Y)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(X, W, Z) \\/ product(Y, W, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(W, X, Z) \\/ product(W, Y, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(W, Z, X) \\/ product(W, Z, Y)) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(add(X, W), add(Y, W))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(add(W, X), add(W, Y))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(multiply(X, W), multiply(Y, W))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(multiply(W, X), multiply(W, Y))) /\\\n (!Y X. ~equal(X, Y) \\/ equal(inverse(X), inverse(Y))) /\\\n ~product(x(), x(), x()) ==> F"]; prove boo3; val fld5 = parse_formula [ QUOTE "(!Y X V W Z U.\n sum(X, V, W) \\/ ~sum(X, Y, U) \\/ ~sum(Y, Z, V) \\/ ~sum(U, Z, W)) /\\\n (!X U Z W V Y.\n sum(U, Z, W) \\/ ~sum(X, Y, U) \\/ ~sum(Y, Z, V) \\/ ~sum(X, V, W)) /\\\n (!X. sum(additive_identity(), X, X) \\/ ~defined(X)) /\\\n (!X. sum(additive_inverse(X), X, additive_identity()) \\/ ~defined(X)) /\\\n (!Z Y X. sum(Y, X, Z) \\/ ~sum(X, Y, Z)) /\\\n (!Y X V W Z U.\n product(X, V, W) \\/ ~product(X, Y, U) \\/ ~product(Y, Z, V) \\/\n ~product(U, Z, W)) /\\\n (!X U Z W V Y.\n product(U, Z, W) \\/ ~product(X, Y, U) \\/ ~product(Y, Z, V) \\/\n ~product(X, V, W)) /\\\n (!X. product(multiplicative_identity(), X, X) \\/ ~defined(X)) /\\\n (!X.\n product(multiplicative_inverse(X), X, multiplicative_identity()) \\/\n sum(additive_identity(), X, additive_identity()) \\/ ~defined(X)) /\\\n (!Z Y X. product(Y, X, Z) \\/ ~product(X, Y, Z)) /\\\n (!X C D B Z A Y.\n sum(C, D, B) \\/ ~sum(X, Y, A) \\/ ~product(A, Z, B) \\/\n ~product(X, Z, C) \\/ ~product(Y, Z, D)) /\\\n (!X A Z B C D Y.\n product(A, Z, B) \\/ ~sum(X, Y, A) \\/ ~product(X, Z, C) \\/\n ~product(Y, Z, D) \\/ ~sum(C, D, B)) /\\\n (!X Y. defined(add(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n defined(additive_identity()) /\\\n (!X. defined(additive_inverse(X)) \\/ ~defined(X)) /\\\n (!X Y. defined(multiply(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n defined(multiplicative_identity()) /\\\n (!X.\n defined(multiplicative_inverse(X)) \\/ ~defined(X) \\/\n sum(additive_identity(), X, additive_identity())) /\\\n (!Y X. sum(X, Y, add(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n (!Y X. product(X, Y, multiply(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n (!Y X.\n sum(additive_identity(), X, Y) \\/ ~less_or_equal(X, Y) \\/\n ~less_or_equal(Y, X)) /\\\n (!Y X Z.\n less_or_equal(X, Z) \\/ ~less_or_equal(X, Y) \\/\n ~less_or_equal(Y, Z)) /\\\n (!Y X.\n less_or_equal(X, Y) \\/ less_or_equal(Y, X) \\/ ~defined(X) \\/\n ~defined(Y)) /\\\n (!X U V Z Y.\n less_or_equal(U, V) \\/ ~less_or_equal(X, Y) \\/ ~sum(X, Z, U) \\/\n ~sum(Y, Z, V)) /\\\n (!X Z Y.\n less_or_equal(additive_identity(), Z) \\/\n ~less_or_equal(additive_identity(), X) \\/\n ~less_or_equal(additive_identity(), Y) \\/ ~product(X, Y, Z)) /\\\n ~sum(additive_identity(), additive_identity(),\n multiplicative_identity()) /\\ defined(a()) /\\ defined(b()) /\\\n (!X. ~sum(a(), X, b())) ==> F"]; prove fld5; *) end (*#line 0.0 "data/preamble.sml"*) (* ========================================================================= *) (* SETTING UP THE ENVIRONMENT IN WHICH WE CAN EXECUTE THE METIS PROVER *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* Loading the modules we use *) structure Main = struct fun main _ = let val () = app load ["CommandLine", "Milton", "Useful", "Term1", "Canon1", "Tptp1", "Metis1", "Problem1"]; (* Infix operators *) infixr ## |-> ::> @> oo; (* Pretty printers *) val () = installPP Term1.pp_term; val () = installPP Term1.pp_formula; val () = installPP Subst1.pp_subst; val () = installPP Thm1.pp_thm; (* Parsing quotations *) val () = quotation := true; (* Creating nice output *) local fun dup _ 0 l = l | dup x n l = dup x (n - 1) (x :: l); fun chs x n = implode (dup x n []); in fun advertize s = print ("==" ^ s ^ chs #"=" (77 - size s) ^ "\n\n"); fun separator () = print (chs #"-" 79 ^ "\n\n"); end; fun cutoff max = let fun cut feas sofa l = let val poss = sofa ^ " ... " ^ Useful.int_to_string (length l) ^ " more" in cut' (if size poss < max then poss else feas) sofa l end and cut' _ sofa [] = sofa | cut' feas sofa (h :: t) = let val sofa' = if sofa = "" then h else sofa ^ " " ^ h in if size sofa' < max then cut feas sofa' t else feas end in cut "" "" end; local fun b2s true = "on" | b2s false = "off"; val i2s = Useful.int_to_string; val l2s = Meter1.limit_to_string; in fun show (settings : Metis1.parameters) = let val {meson = Mactive, delta = Dactive, resolution = Ractive, meson_parm = Mparm, resolution_parm = Rparm} = settings in "resolution = " ^ b2s Ractive ^ "\n" ^ "meson = " ^ b2s Mactive ^ "\n" ^ "delta = " ^ b2s Dactive ^ "\n" ^ "\n" ^ "resolution_parm:\n" ^ " subsumption_checking = " ^ i2s (#subsumption_checking Rparm) ^ "\n" ^ " positive_refinement = " ^ b2s (#positive_refinement Rparm) ^ "\n" ^ " theap_parm:\n" ^ " fifo_skew = " ^ i2s (#fifo_skew (#theap_parm Rparm)) ^ "\n" ^ " theap_cleaning = " ^ i2s (#cleaning_freq (#theap_parm Rparm)) ^"\n"^ "\n" ^ "meson_parm:\n" ^ " ancestor_pruning = " ^ b2s (#ancestor_pruning Mparm) ^ "\n" ^ " ancestor_cutting = " ^ b2s (#ancestor_cutting Mparm) ^ "\n" ^ " state_simplify = " ^ b2s (#state_simplify Mparm) ^ "\n" ^ " cache_cutting = " ^ b2s (#cache_cutting Mparm) ^ "\n" ^ " divide_conquer = " ^ b2s (#divide_conquer Mparm) ^ "\n" ^ " unit_lemmaizing = " ^ b2s (#unit_lemmaizing Mparm) ^ "\n" ^ "\n" ^ "limit = " ^ l2s (!Metis1.limit) ^ "\n\n" end; end; (* The core proving function *) val cnf_normalization = ref false; fun with_cnf b = Useful.with_flag (cnf_normalization, Useful.K b); fun core_prove fm = let val prover = if !cnf_normalization then Metis1.prove else Metis1.raw_prove in case Useful.try prover fm of SOME _ => print "METIS: SUCCESSFULLY PROVED\nMETIS: " | NONE => print "METIS: FAILED TO PROVE\nMETIS: " end; fun process name goal = (print ("METIS: Problem " ^ name ^ "\n"); Milton.time core_prove goal; print "\n"); fun process_set (n, s) = let val () = advertize n fun f {name, goal} = process name (Term1.parse_formula goal) in case s of [] => () | p :: ps => (f p; app (fn x => (separator (); f x)) ps) end; (* Get options from the command line *) local open Useful Metis1; fun tlimit "-" = NONE | tlimit s = SOME (Real.fromInt (string_to_int s)); fun opts [] = 0 | opts (x :: xs) = if x = "-t" orelse x = "--time" then case xs of [] => raise Fail "options: last argument -t / --time" | y :: ys => (limit := {time = tlimit y, infs = NONE}; opts ys) else if x = "-m" orelse x = "--meson" then (settings := update_parm_meson not (!settings); opts xs) else if x = "-r" orelse x = "--resolution" then (settings := update_parm_resolution not (!settings); opts xs) else if x = "-d" orelse x = "--delta" then (settings := update_parm_delta not (!settings); opts xs) else if x = "--" then length xs else if hd (explode x) = #"-" then raise Fail ("unknown parameter: " ^ x) else 1 + length xs; in fun options () = let val () = settings := update_parm_resolution (K false) (!settings); val () = settings := update_parm_meson (K false) (!settings); val () = settings := update_parm_delta (K false) (!settings); val l = (**CommandLine.arguments ()**) [] val n = opts l in split l (length l - n) end; end; val (opts, work) = if Milton.ml = "MLton" then options () else ([], []); (*#line 0.0 "data/benchmark.sml"*) val pure = null ((**CommandLine.arguments ()**) []); local open Useful Metis1; in val () = if pure then settings:= update_parm_meson (K true) (!settings) else (); end; local open Useful Problem1; fun extract p n = (Option.valOf o List.find (fn {name, goal = _} => name = n)) p; val meson_prune = if pure then ["P29", "LDA007-3", "GRP010-4", "GEO002-4"] else ["GEO002-4"]; val prune = let val {meson, resolution, ...} = !Metis1.settings in (fn f => List.filter (not o f)) (case (meson, resolution) of (false, false) => K true | (false, true) => C mem ["COL060-3"] | (true, false) => C mem meson_prune | (true, true) => K false) end; val src0 = ["P26", "P29", "P46", "GILMORE_1", "LOS", "STEAM_ROLLER"]; val src1 = ["P48", "P49", "AGATHA"]; val src2 = ["LCL009-1", "COL060-3", "COL058-2", "LCL107-1", "LDA007-3", "GRP010-4", "BOO021-1", "GEO002-4", "GRP128-4.003"]; in val set0 = map (extract nonequality) (prune src0); val set1 = map (extract equality) (prune src1); val set2 = map (extract tptp) (prune src2); end; val program = "benchmark" ^ (if pure then "*" else ""); val () = advertize (program ^ "==starting"); val () = advertize "settings"; val () = print (show (!Metis1.settings)); val () = with_cnf true process_set ("nonequality", set0); val () = with_cnf true process_set ("equality", set1); val () = with_cnf false process_set ("tptp", set2); val () = advertize (program ^ "==finishing"); in () end; fun doit n = if n = 0 then () else (main (); doit (n - 1)) end mlton-20210117+dfsg/benchmark/tests/mpuz.sml000066400000000000000000000073621416264345000206420ustar00rootroot00000000000000(* * Written by sweeks@sweeks.com on 1999-08-31. * * A solution to mpuz. (Try M-x mpuz in emacs.) * This solution is very loosely based on an OCAML solution posted to * comp.lang.ml by Laurent Vaucher . *) (* override print so the benchmark is silent *) fun print _ = () structure List = struct open List fun exists(l, p) = List.exists p l fun map(l, f) = List.map f l fun fold(l, b, f) = let fun loop(l, b) = case l of [] => b | x :: l => loop(l, f(x, b)) in loop(l, b) end fun foreach(l, f) = fold(l, (), fn (x, ()) => f x) end structure String = struct open String fun fold(s, b, f) = let val n = size s fun loop(i, b) = if i = n then b else loop(i + 1, f(String.sub(s, i), b)) in loop(0, b) end end structure Mpuz = struct fun solve(a, b, c, d, e) = let fun printNewline() = print "\n" val sub = Array.sub val update = Array.update val letters = List.fold ([a, b, c, d, e], [], fn (s, letters) => String.fold (s, letters, fn (c, letters) => if List.exists(letters, fn c' => c = c') then letters else c :: letters)) val letterValues = Array.array(Char.ord Char.maxChar + 1, 0) fun letterValue(c) = Array.sub(letterValues, ord c) fun setLetterValue(c, v) = Array.update(letterValues, ord c, v) fun stringValue(s) = String.fold(s, 0, fn (c, v) => v * 10 + letterValue c) fun printResult() = (List.foreach (letters, fn c => print(concat[String.str(c), " = ", Int.toString(letterValue(c)), " "])) ; print "\n") fun testOk() = let val b0 = letterValue(String.sub(b, 1)) val b1 = letterValue(String.sub(b, 0)) val a = stringValue a val b = stringValue b val c = stringValue c val d = stringValue d val e = stringValue e in if a * b0 = c andalso a * b1 = d andalso a * b = e andalso c + d * 10 = e then printResult() else () end val values = List.map([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], fn v => (v, ref false)) (* Try all assignments of values to letters. *) fun loop(letters) = case letters of [] => testOk() | c :: letters => List.foreach (values, fn (v, r) => if !r then () else (r := true ; setLetterValue(c, v) ; loop(letters) ; r := false)) in loop(letters) end end structure Main = struct fun doit() = Mpuz.solve("AGH", "FB", "CBEE", "GHFD", "FGIJE") (* * Solution: * J = 0 I = 1 D = 8 E = 2 C = 5 B = 6 F = 4 H = 7 G = 3 A = 9 *) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/nucleic.sml000066400000000000000000004617571416264345000213050ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* File: "nucleic.sml" *) structure Nucleic : sig val doit : unit -> unit end = struct type float = real type intg = int (* -- MATH UTILITIES --------------------------------------------------------*) val constant_pi = 3.14159265358979323846 val constant_minus_pi = ~3.14159265358979323846 val constant_pi2 = 1.57079632679489661923 val constant_minus_pi2 = ~1.57079632679489661923 fun math_atan2 y x = if (x > 0.0) then Math.atan (y / x) else if Real.==(x, 0.0) then if y < 0.0 then constant_minus_pi2 else Math.atan (y / x) + constant_minus_pi else if Real.==(x, 0.0) then constant_pi2 else (Math.atan (y / x) + constant_pi) (* -- POINTS ----------------------------------------------------------------*) type pt = float * float * float fun pt_sub ((x1,y1,z1):pt) (x2,y2,z2) = (x1 - x2, y1 - y2, z1 - z2) fun pt_dist (x1,y1,z1) (x2,y2,z2) = let val dx = x1 - x2 val dy = y1 - y2 val dz = z1 - z2 in Math.sqrt ((dx * dx) + (dy * dy) + (dz * dz)) end fun pt_phi (x,y,z) = let val b = math_atan2 x z in math_atan2 (((Math.cos b) * z + ((Math.sin b) * x))) y end fun pt_theta (x,y,z) = math_atan2 x z (* -- COORDINATE TRANSFORMATIONS --------------------------------------------*) (* The notation for the transformations follows "Paul, R.P. (1981) Robot || Manipulators. MIT Press." with the exception that our transformation || matrices don't have the perspective terms and are the transpose of || Paul's one. See also "M\"antyl\"a, M. (1985) An Introduction to || Solid Modeling, Computer Science Press" Appendix A. || || The components of a transformation matrix are named like this: || || a b c || d e f || g h i || tx ty tz || || The components tx, ty, and tz are the translation vector. *) type tfo = float*float*float*float*float*float*float*float*float*float*float*float val tfo_id = (1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0) (* The function "tfo-apply" multiplies a transformation matrix, tfo, by a || point vector, p. The result is a new point. || || Note: in the measured program, this function was coded in assembler. *) fun tfo_apply (a,b,c,d,e,f,g,h,i,tx,ty,tz) (x:real,y:real,z:real) = ( ((x * a) + (y * d) + (z * g) + tx) , ((x * b) + (y * e) + (z * h) + ty) , ((x * c) + (y * f) + (z * i) + tz) ) (* The function "tfo-combine" multiplies two transformation matrices A and B. || The result is a new matrix which cumulates the transformations described || by A and B. || || Note: in the measured program, this function was coded in assembler. *) fun tfo_combine (a_a:real,a_b:real,a_c:real,a_d:real,a_e:real,a_f:real,a_g:real,a_h:real,a_i:real,a_tx:real,a_ty:real,a_tz:real) (b_a:real,b_b:real,b_c:real,b_d:real,b_e:real,b_f:real,b_g:real,b_h:real,b_i:real,b_tx:real,b_ty:real,b_tz:real) = ( ((a_a * b_a) + (a_b * b_d) + (a_c * b_g)) , ((a_a * b_b) + (a_b * b_e) + (a_c * b_h)) , ((a_a * b_c) + (a_b * b_f) + (a_c * b_i)) , ((a_d * b_a) + (a_e * b_d) + (a_f * b_g)) , ((a_d * b_b) + (a_e * b_e) + (a_f * b_h)) , ((a_d * b_c) + (a_e * b_f) + (a_f * b_i)) , ((a_g * b_a) + (a_h * b_d) + (a_i * b_g)) , ((a_g * b_b) + (a_h * b_e) + (a_i * b_h)) , ((a_g * b_c) + (a_h * b_f) + (a_i * b_i)) , ((a_tx * b_a) + (a_ty * b_d) + (a_tz * b_g) + b_tx) , ((a_tx * b_b) + (a_ty * b_e) + (a_tz * b_h) + b_ty) , ((a_tx * b_c) + (a_ty * b_f) + (a_tz * b_i) + b_tz) ) (* The function "tfo-inv-ortho" computes the inverse of a homogeneous || transformation matrix. *) fun tfo_inv_ortho ((a,b,c,d,e,f,g,h,i,tx,ty,tz):tfo) = ( a,d,g, b,e,h, c,f,i, (~((a * tx) + (b * ty) + (c * tz))) , (~ ((d * tx) + (e * ty) + (f * tz))) , (~ ((g * tx) + (h * ty) + (i * tz))) ) (* Given three points p1, p2, and p3, the function "tfo-align" computes || a transformation matrix such that point p1 gets mapped to (0,0,0), p2 gets || mapped to the Y axis and p3 gets mapped to the YZ plane. *) fun tfo_align (x1:real,y1:real,z1:real) (x2:real,y2:real,z2:real) (x3,y3,z3) = let val x31 = x3 - x1 val y31 = y3 - y1 val z31 = z3 - z1 val rotpy = pt_sub (x2,y2,z2) (x1,y1,z1) val phi = pt_phi rotpy val theta = pt_theta rotpy val sinp = Math.sin phi val sint = Math.sin theta val cosp = Math.cos phi val cost = Math.cos theta val sinpsint = sinp * sint val sinpcost = sinp * cost val cospsint = cosp * sint val cospcost = cosp * cost val rotpz = ( ((cost * x31) - (sint * z31)) , ((sinpsint * x31) + (cosp * y31) + (sinpcost * z31)) , ((cospsint * x31) + (~ (sinp * y31)) + (cospcost * z31)) ) val rho = pt_theta rotpz val cosr = Math.cos rho val sinr = Math.sin rho val x = (~ (x1 * cost)) + (z1 * sint) val y = ((~ (x1 * sinpsint)) - (y1 * cosp)) - (z1 * sinpcost) val z = ((~ (x1 * cospsint) + (y1 * sinp))) - (z1 * cospcost) in ( ((cost * cosr) - (cospsint * sinr)) , sinpsint , ((cost * sinr + (cospsint * cosr))) , (sinp * sinr) , cosp , (~ (sinp * cosr)) , ((~ (sint * cosr)) - (cospcost * sinr)) , sinpcost , ((~ (sint * sinr) + (cospcost * cosr))) , ((x * cosr) - (z * sinr)) , y , ((x * sinr + (z * cosr))) ) end (* -- NUCLEIC ACID CONFORMATIONS DATA BASE ----------------------------------*) (* Numbering of atoms follows the paper: || || IUPAC-IUB Joint Commission on Biochemical Nomenclature (JCBN) || (1983) Abbreviations and Symbols for the Description of || Conformations of Polynucleotide Chains. Eur. J. Biochem 131, || 9-15. || || In the atom names, we have used "*" instead of "'". *) (* Define remaining atoms for each nucleotide type. *) datatype nuc_specific = A of pt*pt*pt*pt*pt*pt*pt*pt | C of pt*pt*pt*pt*pt*pt | G of pt*pt*pt*pt*pt*pt*pt*pt*pt | U of pt*pt*pt*pt*pt (* A N6 N7 N9 C8 H2 H61 H62 H8 || C N4 O2 H41 H42 H5 H6 || G N2 N7 N9 C8 O6 H1 H21 H22 H8 || U O2 O4 H3 H5 H6 *) (* Define part common to all 4 nucleotide types. *) type nuc = tfo*tfo*tfo*tfo* pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* pt*nuc_specific (* dgf-base-tfo ; defines the standard position for wc and wc-dumas || P-O3*-275-tfo ; defines the standard position for the connect function || P-O3*-180-tfo || P-O3*-60-tfo || P O1P O2P O5* C5* H5* H5** C4* H4* O4* C1* H1* C2* H2** O2* H2* C3* || H3* O3* N1 N3 C2 C4 C5 C6) *) fun is_A (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A _) = true | is_A x = false fun is_C (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C _) = true | is_C x = false fun is_G (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G _) = true | is_G x = false fun is_U (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U _) = true | is_U x = false fun nuc_C1' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c1' fun nuc_C2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c2 fun nuc_C2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c2' fun nuc_C3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c3' fun nuc_C4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c4 fun nuc_C4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c4' fun nuc_C5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c5 fun nuc_C5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c5' fun nuc_C6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c6 fun nuc_H1' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h1' fun nuc_H2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h2' fun nuc_H2'' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h2'' fun nuc_H3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h3' fun nuc_H4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h4' fun nuc_H5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h5' fun nuc_H5'' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h5'' fun nuc_N1 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = n1 fun nuc_N3 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = n3 fun nuc_O1P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o1p fun nuc_O2P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o2p fun nuc_O2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o2' fun nuc_O3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o3' fun nuc_O4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o4' fun nuc_O5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o5' fun nuc_P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p fun nuc_dgf_base_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = dgf_base_tfo fun nuc_p_o3'_180_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_180_tfo fun nuc_p_o3'_275_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_275_tfo fun nuc_p_o3'_60_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_60_tfo fun rA_N6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n6 fun rA_N7 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n7 fun rA_N9 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n9 fun rA_C8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = c8 fun rA_H2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h2 fun rA_H61 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h61 fun rA_H62 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h62 fun rA_H8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h8 fun rC_N4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = n4 fun rC_O2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = o2 fun rC_H41 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h41 fun rC_H42 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h42 fun rC_H5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h5 fun rC_H6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h6 fun rG_N2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n2 fun rG_N7 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n7 fun rG_N9 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n9 fun rG_C8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = c8 fun rG_O6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = o6 fun rG_H1 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h1 fun rG_H21 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h21 fun rG_H22 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h22 fun rG_H8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h8 fun rU_O2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = o2 fun rU_O4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = o4 fun rU_H3 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h3 fun rU_H5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h5 fun rU_H6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h6 (* Database of nucleotide conformations: *) val rA = ( ( (~0.0018), (~0.8207), (0.5714), (* dgf-base-tfo *) (0.2679), (~0.5509), (~0.7904), (0.9634), (0.1517), (0.2209), (0.0073), (8.4030), (0.6232)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4550), (8.2120), (~2.8810)), (* C5' *) ( (5.4546), (8.8508), (~1.9978)), (* H5' *) ( (5.7588), (8.6625), (~3.8259)), (* H5'' *) ( (6.4970), (7.1480), (~2.5980)), (* C4' *) ( (7.4896), (7.5919), (~2.5214)), (* H4' *) ( (6.1630), (6.4860), (~1.3440)), (* O4' *) ( (6.5400), (5.1200), (~1.4190)), (* C1' *) ( (7.2763), (4.9681), (~0.6297)), (* H1' *) ( (7.1940), (4.8830), (~2.7770)), (* C2' *) ( (6.8667), (3.9183), (~3.1647)), (* H2'' *) ( (8.5860), (5.0910), (~2.6140)), (* O2' *) ( (8.9510), (4.7626), (~1.7890)), (* H2' *) ( (6.5720), (6.0040), (~3.6090)), (* C3' *) ( (5.5636), (5.7066), (~3.8966)), (* H3' *) ( (7.3801), (6.3562), (~4.7350)), (* O3' *) ( (4.7150), (0.4910), (~0.1360)), (* N1 *) ( (6.3490), (2.1730), (~0.6020)), (* N3 *) ( (5.9530), (0.9650), (~0.2670)), (* C2 *) ( (5.2900), (2.9790), (~0.8260)), (* C4 *) ( (3.9720), (2.6390), (~0.7330)), (* C5 *) ( (3.6770), (1.3160), (~0.3660)), (* C6 *) (A ( ( (2.4280), (0.8450), (~0.2360)), (* N6 *) ( (3.1660), (3.7290), (~1.0360)), (* N7 *) ( (5.3170), (4.2990), (~1.1930)), (* N9 *) ( (4.0100), (4.6780), (~1.2990)), (* C8 *) ( (6.6890), (0.1903), (~0.0518)), (* H2 *) ( (1.6470), (1.4460), (~0.4040)), (* H61 *) ( (2.2780), (~0.1080), (~0.0280)), (* H62 *) ( (3.4421), (5.5744), (~1.5482))) (* H8 *) ) ) val rA01 = ( ( (~0.0043), (~0.8175), (0.5759), (* dgf-base-tfo *) (0.2617), (~0.5567), (~0.7884), (0.9651), (0.1473), (0.2164), (0.0359), (8.3929), (0.5532)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (4.7442), (0.4514), (~0.1390)), (* N1 *) ( (6.3687), (2.1459), (~0.5926)), (* N3 *) ( (5.9795), (0.9335), (~0.2657)), (* C2 *) ( (5.3052), (2.9471), (~0.8125)), (* C4 *) ( (3.9891), (2.5987), (~0.7230)), (* C5 *) ( (3.7016), (1.2717), (~0.3647)), (* C6 *) (A ( ( (2.4553), (0.7925), (~0.2390)), (* N6 *) ( (3.1770), (3.6859), (~1.0198)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.0156), (4.6415), (~1.2759)), (* C8 *) ( (6.7198), (0.1618), (~0.0547)), (* H2 *) ( (1.6709), (1.3900), (~0.4039)), (* H61 *) ( (2.3107), (~0.1627), (~0.0373)), (* H62 *) ( (3.4426), (5.5361), (~1.5199))) (* H8 *) ) ) val rA02 = ( ( (0.5566), (0.0449), (0.8296), (* dgf-base-tfo *) (0.5125), (0.7673), (~0.3854), (~0.6538), (0.6397), (0.4041), (~9.1161), (~3.7679), (~2.9968)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.3245), (8.5459), (1.5467)), (* N1 *) ( (9.8051), (6.9432), (~0.1497)), (* N3 *) ( (10.5175), (7.4328), (0.8408)), (* C2 *) ( (8.7523), (7.7422), (~0.4228)), (* C4 *) ( (8.4257), (8.9060), (0.2099)), (* C5 *) ( (9.2665), (9.3242), (1.2540)), (* C6 *) (A ( ( (9.0664), (10.4462), (1.9610)), (* N6 *) ( (7.2750), (9.4537), (~0.3428)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9479), (8.6157), (~1.2771)), (* C8 *) ( (11.4063), (6.9047), (1.1859)), (* H2 *) ( (8.2845), (11.0341), (1.7552)), (* H61 *) ( (9.6584), (10.6647), (2.7198)), (* H62 *) ( (6.0430), (8.9853), (~1.7594))) (* H8 *) ) ) val rA03 = ( ( (~0.5021), (0.0731), (0.8617), (* dgf-base-tfo *) (~0.8112), (0.3054), (~0.4986), (~0.2996), (~0.9494), (~0.0940), (6.4273), (~5.1944), (~3.7807)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (9.6740), (4.7656), (~7.6614)), (* N1 *) ( (9.0739), (4.3013), (~5.3941)), (* N3 *) ( (9.8416), (4.2192), (~6.4581)), (* C2 *) ( (7.9885), (5.0632), (~5.6446)), (* C4 *) ( (7.6822), (5.6856), (~6.8194)), (* C5 *) ( (8.5831), (5.5215), (~7.8840)), (* C6 *) (A ( ( (8.4084), (6.0747), (~9.0933)), (* N6 *) ( (6.4857), (6.3816), (~6.7035)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (6.1133), (6.1613), (~5.4808)), (* C8 *) ( (10.7627), (3.6375), (~6.4220)), (* H2 *) ( (7.6031), (6.6390), (~9.2733)), (* H61 *) ( (9.1004), (5.9708), (~9.7893)), (* H62 *) ( (5.1705), (6.6830), (~5.3167))) (* H8 *) ) ) val rA04 = ( ( (~0.5426), (~0.8175), (0.1929), (* dgf-base-tfo *) (0.8304), (~0.5567), (~0.0237), (0.1267), (0.1473), (0.9809), (~0.5075), (8.3929), (0.2229)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (3.6343), (2.6680), (2.0783)), (* N1 *) ( (5.4505), (3.9805), (1.2446)), (* N3 *) ( (4.7540), (3.3816), (2.1851)), (* C2 *) ( (4.8805), (3.7951), (0.0354)), (* C4 *) ( (3.7416), (3.0925), (~0.2305)), (* C5 *) ( (3.0873), (2.4980), (0.8606)), (* C6 *) (A ( ( (1.9600), (1.7805), (0.7462)), (* N6 *) ( (3.4605), (3.1184), (~1.5906)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.4244), (3.8244), (~2.0953)), (* C8 *) ( (5.0814), (3.4352), (3.2234)), (* H2 *) ( (1.5423), (1.6454), (~0.1520)), (* H61 *) ( (1.5716), (1.3398), (1.5392)), (* H62 *) ( (4.2675), (3.8876), (~3.1721))) (* H8 *) ) ) val rA05 = ( ( (~0.5891), (0.0449), (0.8068), (* dgf-base-tfo *) (0.5375), (0.7673), (0.3498), (~0.6034), (0.6397), (~0.4762), (~0.3019), (~3.7679), (~9.5913)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.2594), (10.6774), (~1.0056)), (* N1 *) ( (9.7528), (8.7080), (~2.2631)), (* N3 *) ( (10.4471), (9.7876), (~1.9791)), (* C2 *) ( (8.7271), (8.5575), (~1.3991)), (* C4 *) ( (8.4100), (9.3803), (~0.3580)), (* C5 *) ( (9.2294), (10.5030), (~0.1574)), (* C6 *) (A ( ( (9.0349), (11.3951), (0.8250)), (* N6 *) ( (7.2891), (8.9068), (0.3121)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9702), (7.8292), (~0.3353)), (* C8 *) ( (11.3132), (10.0537), (~2.5851)), (* H2 *) ( (8.2741), (11.2784), (1.4629)), (* H61 *) ( (9.6733), (12.1368), (0.9529)), (* H62 *) ( (6.0888), (7.3990), (0.1403))) (* H8 *) ) ) val rA06 = ( ( (~0.9815), (0.0731), (~0.1772), (* dgf-base-tfo *) (0.1912), (0.3054), (~0.9328), (~0.0141), (~0.9494), (~0.3137), (5.7506), (~5.1944), (4.7470)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (6.6624), (3.5061), (~8.2986)), (* N1 *) ( (6.5810), (3.2570), (~5.9221)), (* N3 *) ( (6.5151), (2.8263), (~7.1625)), (* C2 *) ( (6.8364), (4.5817), (~5.8882)), (* C4 *) ( (7.0116), (5.4064), (~6.9609)), (* C5 *) ( (6.9173), (4.8260), (~8.2361)), (* C6 *) (A ( ( (7.0668), (5.5163), (~9.3763)), (* N6 *) ( (7.2573), (6.7070), (~6.5394)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (7.2238), (6.6275), (~5.2453)), (* C8 *) ( (6.3146), (1.7741), (~7.3641)), (* H2 *) ( (7.2568), (6.4972), (~9.3456)), (* H61 *) ( (7.0437), (5.0478), (~10.2446)), (* H62 *) ( (7.4108), (7.6227), (~4.8418))) (* H8 *) ) ) val rA07 = ( ( (0.2379), (0.1310), (~0.9624), (* dgf-base-tfo *) (~0.5876), (~0.7696), (~0.2499), (~0.7734), (0.6249), (~0.1061), (30.9870), (~26.9344), (42.6416)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.3505), (8.4697), (42.6565)), (* C5' *) ( (39.1377), (7.5433), (42.1230)), (* H5' *) ( (39.7203), (9.3119), (42.0717)), (* H5'' *) ( (38.0405), (8.9195), (43.2869)), (* C4' *) ( (37.3687), (9.3036), (42.5193)), (* H4' *) ( (37.4319), (7.8146), (43.9387)), (* O4' *) ( (37.1959), (8.1354), (45.3237)), (* C1' *) ( (36.1788), (8.5202), (45.3970)), (* H1' *) ( (38.1721), (9.2328), (45.6504)), (* C2' *) ( (39.1555), (8.7939), (45.8188)), (* H2'' *) ( (37.7862), (10.0617), (46.7013)), (* O2' *) ( (37.3087), (9.6229), (47.4092)), (* H2' *) ( (38.1844), (10.0268), (44.3367)), (* C3' *) ( (39.1578), (10.5054), (44.2289)), (* H3' *) ( (37.0547), (10.9127), (44.3441)), (* O3' *) ( (34.8811), (4.2072), (47.5784)), (* N1 *) ( (35.1084), (6.1336), (46.1818)), (* N3 *) ( (34.4108), (5.1360), (46.7207)), (* C2 *) ( (36.3908), (6.1224), (46.6053)), (* C4 *) ( (36.9819), (5.2334), (47.4697)), (* C5 *) ( (36.1786), (4.1985), (48.0035)), (* C6 *) (A ( ( (36.6103), (3.2749), (48.8452)), (* N6 *) ( (38.3236), (5.5522), (47.6595)), (* N7 *) ( (37.3887), (7.0024), (46.2437)), (* N9 *) ( (38.5055), (6.6096), (46.9057)), (* C8 *) ( (33.3553), (5.0152), (46.4771)), (* H2 *) ( (37.5730), (3.2804), (49.1507)), (* H61 *) ( (35.9775), (2.5638), (49.1828)), (* H62 *) ( (39.5461), (6.9184), (47.0041))) (* H8 *) ) ) val rA08 = ( ( (0.1084), (~0.0895), (~0.9901), (* dgf-base-tfo *) (0.9789), (~0.1638), (0.1220), (~0.1731), (~0.9824), (0.0698), (~2.9039), (47.2655), (33.0094)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.4850), (8.9301), (44.6977)), (* C5' *) ( (39.0638), (9.8199), (44.2296)), (* H5' *) ( (40.0757), (9.0713), (45.6029)), (* H5'' *) ( (38.3102), (8.0414), (45.0789)), (* C4' *) ( (37.7842), (8.4637), (45.9351)), (* H4' *) ( (37.4200), (7.9453), (43.9769)), (* O4' *) ( (37.2249), (6.5609), (43.6273)), (* C1' *) ( (36.3360), (6.2168), (44.1561)), (* H1' *) ( (38.4347), (5.8414), (44.1590)), (* C2' *) ( (39.2688), (5.9974), (43.4749)), (* H2'' *) ( (38.2344), (4.4907), (44.4348)), (* O2' *) ( (37.6374), (4.0386), (43.8341)), (* H2' *) ( (38.6926), (6.6079), (45.4637)), (* C3' *) ( (39.7585), (6.5640), (45.6877)), (* H3' *) ( (37.8238), (6.0705), (46.4723)), (* O3' *) ( (33.9162), (6.2598), (39.7758)), (* N1 *) ( (34.6709), (6.5759), (42.0215)), (* N3 *) ( (33.7257), (6.5186), (41.0858)), (* C2 *) ( (35.8935), (6.3324), (41.5018)), (* C4 *) ( (36.2105), (6.0601), (40.1932)), (* C5 *) ( (35.1538), (6.0151), (39.2537)), (* C6 *) (A ( ( (35.3088), (5.7642), (37.9649)), (* N6 *) ( (37.5818), (5.8677), (40.0507)), (* N7 *) ( (37.0932), (6.3197), (42.1810)), (* N9 *) ( (38.0509), (6.0354), (41.2635)), (* C8 *) ( (32.6830), (6.6898), (41.3532)), (* H2 *) ( (36.2305), (5.5855), (37.5925)), (* H61 *) ( (34.5056), (5.7512), (37.3528)), (* H62 *) ( (39.1318), (5.8993), (41.2285))) (* H8 *) ) ) val rA09 = ( ( (0.8467), (0.4166), (~0.3311), (* dgf-base-tfo *) (~0.3962), (0.9089), (0.1303), (0.3552), (0.0209), (0.9346), (~42.7319), (~26.6223), (~29.8163)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.3505), (8.4697), (42.6565)), (* C5' *) ( (39.1377), (7.5433), (42.1230)), (* H5' *) ( (39.7203), (9.3119), (42.0717)), (* H5'' *) ( (38.0405), (8.9195), (43.2869)), (* C4' *) ( (37.6479), (8.1347), (43.9335)), (* H4' *) ( (38.2691), (10.0933), (44.0524)), (* O4' *) ( (37.3999), (11.1488), (43.5973)), (* C1' *) ( (36.5061), (11.1221), (44.2206)), (* H1' *) ( (37.0364), (10.7838), (42.1836)), (* C2' *) ( (37.8636), (11.0489), (41.5252)), (* H2'' *) ( (35.8275), (11.3133), (41.7379)), (* O2' *) ( (35.6214), (12.1896), (42.0714)), (* H2' *) ( (36.9316), (9.2556), (42.2837)), (* C3' *) ( (37.1778), (8.8260), (41.3127)), (* H3' *) ( (35.6285), (8.9334), (42.7926)), (* O3' *) ( (38.1482), (15.2833), (46.4641)), (* N1 *) ( (37.3641), (13.0968), (45.9007)), (* N3 *) ( (37.5032), (14.1288), (46.7300)), (* C2 *) ( (37.9570), (13.3377), (44.7113)), (* C4 *) ( (38.6397), (14.4660), (44.3267)), (* C5 *) ( (38.7473), (15.5229), (45.2609)), (* C6 *) (A ( ( (39.3720), (16.6649), (45.0297)), (* N6 *) ( (39.1079), (14.3351), (43.0223)), (* N7 *) ( (38.0132), (12.4868), (43.6280)), (* N9 *) ( (38.7058), (13.1402), (42.6620)), (* C8 *) ( (37.0731), (14.0857), (47.7306)), (* H2 *) ( (39.8113), (16.8281), (44.1350)), (* H61 *) ( (39.4100), (17.3741), (45.7478)), (* H62 *) ( (39.0412), (12.9660), (41.6397))) (* H8 *) ) ) val rA10 = ( ( (0.7063), (0.6317), (~0.3196), (* dgf-base-tfo *) (~0.0403), (~0.4149), (~0.9090), (~0.7068), (0.6549), (~0.2676), (6.4402), (~52.1496), (30.8246)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.4850), (8.9301), (44.6977)), (* C5' *) ( (39.0638), (9.8199), (44.2296)), (* H5' *) ( (40.0757), (9.0713), (45.6029)), (* H5'' *) ( (38.3102), (8.0414), (45.0789)), (* C4' *) ( (37.7099), (7.8166), (44.1973)), (* H4' *) ( (38.8012), (6.8321), (45.6380)), (* O4' *) ( (38.2431), (6.6413), (46.9529)), (* C1' *) ( (37.3505), (6.0262), (46.8385)), (* H1' *) ( (37.8484), (8.0156), (47.4214)), (* C2' *) ( (38.7381), (8.5406), (47.7690)), (* H2'' *) ( (36.8286), (8.0368), (48.3701)), (* O2' *) ( (36.8392), (7.3063), (48.9929)), (* H2' *) ( (37.3576), (8.6512), (46.1132)), (* C3' *) ( (37.5207), (9.7275), (46.1671)), (* H3' *) ( (35.9985), (8.2392), (45.9032)), (* O3' *) ( (39.9117), (2.2278), (48.8527)), (* N1 *) ( (38.6207), (3.6941), (47.4757)), (* N3 *) ( (38.9872), (2.4888), (47.9057)), (* C2 *) ( (39.2961), (4.6720), (48.1174)), (* C4 *) ( (40.2546), (4.5307), (49.0912)), (* C5 *) ( (40.5932), (3.2189), (49.4985)), (* C6 *) (A ( ( (41.4938), (2.9317), (50.4229)), (* N6 *) ( (40.7195), (5.7755), (49.5060)), (* N7 *) ( (39.1730), (6.0305), (47.9170)), (* N9 *) ( (40.0413), (6.6250), (48.7728)), (* C8 *) ( (38.5257), (1.5960), (47.4838)), (* H2 *) ( (41.9907), (3.6753), (50.8921)), (* H61 *) ( (41.6848), (1.9687), (50.6599)), (* H62 *) ( (40.3571), (7.6321), (49.0452))) (* H8 *) ) ) val rAs = [rA01,rA02,rA03,rA04,rA05,rA06,rA07,rA08,rA09,rA10] val rC = ( ( (~0.0359), (~0.8071), (0.5894), (* dgf-base-tfo *) (~0.2669), (0.5761), (0.7726), (~0.9631), (~0.1296), (~0.2361), (0.1584), (8.3434), (0.5434)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (7.2954), (~7.6762), (2.4898)), (* H4' *) ( (6.0140), (~6.5420), (1.2890)), (* O4' *) ( (6.4190), (~5.1840), (1.3620)), (* C1' *) ( (7.1608), (~5.0495), (0.5747)), (* H1' *) ( (7.0760), (~4.9560), (2.7270)), (* C2' *) ( (6.7770), (~3.9803), (3.1099)), (* H2'' *) ( (8.4500), (~5.1930), (2.5810)), (* O2' *) ( (8.8309), (~4.8755), (1.7590)), (* H2' *) ( (6.4060), (~6.0590), (3.5580)), (* C3' *) ( (5.4021), (~5.7313), (3.8281)), (* H3' *) ( (7.1570), (~6.4240), (4.7070)), (* O3' *) ( (5.2170), (~4.3260), (1.1690)), (* N1 *) ( (4.2960), (~2.2560), (0.6290)), (* N3 *) ( (5.4330), (~3.0200), (0.7990)), (* C2 *) ( (2.9930), (~2.6780), (0.7940)), (* C4 *) ( (2.8670), (~4.0630), (1.1830)), (* C5 *) ( (3.9570), (~4.8300), (1.3550)), (* C6 *) (C ( ( (2.0187), (~1.8047), (0.5874)), (* N4 *) ( (6.5470), (~2.5560), (0.6290)), (* O2 *) ( (1.0684), (~2.1236), (0.7109)), (* H41 *) ( (2.2344), (~0.8560), (0.3162)), (* H42 *) ( (1.8797), (~4.4972), (1.3404)), (* H5 *) ( (3.8479), (~5.8742), (1.6480))) (* H6 *) ) ) val rC01 = ( ( (~0.0137), (~0.8012), (0.5983), (* dgf-base-tfo *) (~0.2523), (0.5817), (0.7733), (~0.9675), (~0.1404), (~0.2101), (0.2031), (8.3874), (0.4228)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (4.3777), (~2.2062), (0.7229)), (* N3 *) ( (5.5069), (~2.9779), (0.9088)), (* C2 *) ( (3.0693), (~2.6246), (0.8500)), (* C4 *) ( (2.9279), (~4.0146), (1.2149)), (* C5 *) ( (4.0101), (~4.7892), (1.4017)), (* C6 *) (C ( ( (2.1040), (~1.7437), (0.6331)), (* N4 *) ( (6.6267), (~2.5166), (0.7728)), (* O2 *) ( (1.1496), (~2.0600), (0.7287)), (* H41 *) ( (2.3303), (~0.7921), (0.3815)), (* H42 *) ( (1.9353), (~4.4465), (1.3419)), (* H5 *) ( (3.8895), (~5.8371), (1.6762))) (* H6 *) ) ) val rC02 = ( ( (0.5141), (0.0246), (0.8574), (* dgf-base-tfo *) (~0.5547), (~0.7529), (0.3542), (0.6542), (~0.6577), (~0.3734), (~9.1111), (~3.4598), (~3.2939)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.6945), (~8.7046), (~0.2857)), (* N3 *) ( (8.6943), (~7.6514), (0.6066)), (* C2 *) ( (7.7426), (~9.6987), (~0.3801)), (* C4 *) ( (6.6642), (~9.5742), (0.5722)), (* C5 *) ( (6.6391), (~8.5592), (1.4526)), (* C6 *) (C ( ( (7.9033), (~10.6371), (~1.3010)), (* N4 *) ( (9.5840), (~6.8186), (0.6136)), (* O2 *) ( (7.2009), (~11.3604), (~1.3619)), (* H41 *) ( (8.7058), (~10.6168), (~1.9140)), (* H42 *) ( (5.8585), (~10.3083), (0.5822)), (* H5 *) ( (5.8197), (~8.4773), (2.1667))) (* H6 *) ) ) val rC03 = ( ( (~0.4993), (0.0476), (0.8651), (* dgf-base-tfo *) (0.8078), (~0.3353), (0.4847), (0.3132), (0.9409), (0.1290), (6.2989), (~5.2303), (~3.8577)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (7.9218), (~5.5700), (6.8877)), (* N3 *) ( (7.8908), (~5.0886), (5.5944)), (* C2 *) ( (6.9789), (~6.3827), (7.4823)), (* C4 *) ( (5.8742), (~6.7319), (6.6202)), (* C5 *) ( (5.8182), (~6.2769), (5.3570)), (* C6 *) (C ( ( (7.1702), (~6.7511), (8.7402)), (* N4 *) ( (8.7747), (~4.3728), (5.1568)), (* O2 *) ( (6.4741), (~7.3461), (9.1662)), (* H41 *) ( (7.9889), (~6.4396), (9.2429)), (* H42 *) ( (5.0736), (~7.3713), (6.9922)), (* H5 *) ( (4.9784), (~6.5473), (4.7170))) (* H6 *) ) ) val rC04 = ( ( (~0.5669), (~0.8012), (0.1918), (* dgf-base-tfo *) (~0.8129), (0.5817), (0.0273), (~0.1334), (~0.1404), (~0.9811), (~0.3279), (8.3874), (0.3355)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (3.8961), (~3.0896), (~0.1893)), (* N3 *) ( (5.0095), (~3.8907), (~0.0346)), (* C2 *) ( (3.0480), (~2.6632), (0.8116)), (* C4 *) ( (3.4093), (~3.1310), (2.1292)), (* C5 *) ( (4.4878), (~3.9124), (2.3088)), (* C6 *) (C ( ( (2.0216), (~1.8941), (0.4804)), (* N4 *) ( (5.7005), (~4.2164), (~0.9842)), (* O2 *) ( (1.4067), (~1.5873), (1.2205)), (* H41 *) ( (1.8721), (~1.6319), (~0.4835)), (* H42 *) ( (2.8048), (~2.8507), (2.9918)), (* H5 *) ( (4.7491), (~4.2593), (3.3085))) (* H6 *) ) ) val rC05 = ( ( (~0.6298), (0.0246), (0.7763), (* dgf-base-tfo *) (~0.5226), (~0.7529), (~0.4001), (0.5746), (~0.6577), (0.4870), (~0.0208), (~3.4598), (~9.6882)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.5977), (~9.5977), (0.7329)), (* N3 *) ( (8.5951), (~8.5745), (1.6594)), (* C2 *) ( (7.7372), (~9.7371), (~0.3364)), (* C4 *) ( (6.7596), (~8.6801), (~0.4476)), (* C5 *) ( (6.7338), (~7.6721), (0.4408)), (* C6 *) (C ( ( (7.8849), (~10.7881), (~1.1289)), (* N4 *) ( (9.3993), (~8.5377), (2.5743)), (* O2 *) ( (7.2499), (~10.8809), (~1.9088)), (* H41 *) ( (8.6122), (~11.4649), (~0.9468)), (* H42 *) ( (6.0317), (~8.6941), (~1.2588)), (* H5 *) ( (5.9901), (~6.8809), (0.3459))) (* H6 *) ) ) val rC06 = ( ( (~0.9837), (0.0476), (~0.1733), (* dgf-base-tfo *) (~0.1792), (~0.3353), (0.9249), (~0.0141), (0.9409), (0.3384), (5.7793), (~5.2303), (4.5997)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (6.6920), (~5.0495), (7.1354)), (* N3 *) ( (6.6201), (~4.5500), (5.8506)), (* C2 *) ( (6.9254), (~6.3614), (7.4926)), (* C4 *) ( (7.1046), (~7.2543), (6.3718)), (* C5 *) ( (7.0391), (~6.7951), (5.1106)), (* C6 *) (C ( ( (6.9614), (~6.6648), (8.7815)), (* N4 *) ( (6.4083), (~3.3696), (5.6340)), (* O2 *) ( (7.1329), (~7.6280), (9.0324)), (* H41 *) ( (6.8204), (~5.9469), (9.4777)), (* H42 *) ( (7.2954), (~8.3135), (6.5440)), (* H5 *) ( (7.1753), (~7.4798), (4.2735))) (* H6 *) ) ) val rC07 = ( ( (0.0033), (0.2720), (~0.9623), (* dgf-base-tfo *) (0.3013), (~0.9179), (~0.2584), (~0.9535), (~0.2891), (~0.0850), (43.0403), (13.7233), (34.5710)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (30.8152), (11.1619), (46.2003)), (* C5' *) ( (30.4519), (10.9454), (45.1957)), (* H5' *) ( (31.0379), (12.2016), (46.4400)), (* H5'' *) ( (29.7081), (10.7448), (47.1428)), (* C4' *) ( (28.8710), (11.4416), (47.0982)), (* H4' *) ( (29.2550), (9.4394), (46.8162)), (* O4' *) ( (29.3907), (8.5625), (47.9460)), (* C1' *) ( (28.4416), (8.5669), (48.4819)), (* H1' *) ( (30.4468), (9.2031), (48.7952)), (* C2' *) ( (31.4222), (8.9651), (48.3709)), (* H2'' *) ( (30.3701), (8.9157), (50.1624)), (* O2' *) ( (30.0652), (8.0304), (50.3740)), (* H2' *) ( (30.1622), (10.6879), (48.6120)), (* C3' *) ( (31.0952), (11.2399), (48.7254)), (* H3' *) ( (29.1076), (11.1535), (49.4702)), (* O3' *) ( (29.7883), (7.2209), (47.5235)), (* N1 *) ( (29.1825), (5.0438), (46.8275)), (* N3 *) ( (28.8008), (6.2912), (47.2263)), (* C2 *) ( (30.4888), (4.6890), (46.7186)), (* C4 *) ( (31.5034), (5.6405), (47.0249)), (* C5 *) ( (31.1091), (6.8691), (47.4156)), (* C6 *) (C ( ( (30.8109), (3.4584), (46.3336)), (* N4 *) ( (27.6171), (6.5989), (47.3189)), (* O2 *) ( (31.7923), (3.2301), (46.2638)), (* H41 *) ( (30.0880), (2.7857), (46.1215)), (* H42 *) ( (32.5542), (5.3634), (46.9395)), (* H5 *) ( (31.8523), (7.6279), (47.6603))) (* H6 *) ) ) val rC08 = ( ( (0.0797), (~0.6026), (~0.7941), (* dgf-base-tfo *) (0.7939), (0.5201), (~0.3150), (0.6028), (~0.6054), (0.5198), (~36.8341), (41.5293), (1.6628)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (31.8779), (9.9369), (47.8760)), (* C5' *) ( (31.3239), (10.6931), (48.4322)), (* H5' *) ( (32.8647), (9.6624), (48.2489)), (* H5'' *) ( (31.0429), (8.6773), (47.9401)), (* C4' *) ( (31.0779), (8.2331), (48.9349)), (* H4' *) ( (29.6956), (8.9669), (47.5983)), (* O4' *) ( (29.2784), (8.1700), (46.4782)), (* C1' *) ( (28.8006), (7.2731), (46.8722)), (* H1' *) ( (30.5544), (7.7940), (45.7875)), (* C2' *) ( (30.8837), (8.6410), (45.1856)), (* H2'' *) ( (30.5100), (6.6007), (45.0582)), (* O2' *) ( (29.6694), (6.4168), (44.6326)), (* H2' *) ( (31.5146), (7.5954), (46.9527)), (* C3' *) ( (32.5255), (7.8261), (46.6166)), (* H3' *) ( (31.3876), (6.2951), (47.5516)), (* O3' *) ( (28.3976), (8.9302), (45.5933)), (* N1 *) ( (26.2155), (9.6135), (44.9910)), (* N3 *) ( (27.0281), (8.8961), (45.8192)), (* C2 *) ( (26.7044), (10.3489), (43.9595)), (* C4 *) ( (28.1088), (10.3837), (43.7247)), (* C5 *) ( (28.8978), (9.6708), (44.5535)), (* C6 *) (C ( ( (25.8715), (11.0249), (43.1749)), (* N4 *) ( (26.5733), (8.2371), (46.7484)), (* O2 *) ( (26.2707), (11.5609), (42.4177)), (* H41 *) ( (24.8760), (10.9939), (43.3427)), (* H42 *) ( (28.5089), (10.9722), (42.8990)), (* H5 *) ( (29.9782), (9.6687), (44.4097))) (* H6 *) ) ) val rC09 = ( ( (0.8727), (0.4760), (~0.1091), (* dgf-base-tfo *) (~0.4188), (0.6148), (~0.6682), (~0.2510), (0.6289), (0.7359), (~8.1687), (~52.0761), (~25.0726)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (30.8152), (11.1619), (46.2003)), (* C5' *) ( (30.4519), (10.9454), (45.1957)), (* H5' *) ( (31.0379), (12.2016), (46.4400)), (* H5'' *) ( (29.7081), (10.7448), (47.1428)), (* C4' *) ( (29.4506), (9.6945), (47.0059)), (* H4' *) ( (30.1045), (10.9634), (48.4885)), (* O4' *) ( (29.1794), (11.8418), (49.1490)), (* C1' *) ( (28.4388), (11.2210), (49.6533)), (* H1' *) ( (28.5211), (12.6008), (48.0367)), (* C2' *) ( (29.1947), (13.3949), (47.7147)), (* H2'' *) ( (27.2316), (13.0683), (48.3134)), (* O2' *) ( (27.0851), (13.3391), (49.2227)), (* H2' *) ( (28.4131), (11.5507), (46.9391)), (* C3' *) ( (28.4451), (12.0512), (45.9713)), (* H3' *) ( (27.2707), (10.6955), (47.1097)), (* O3' *) ( (29.8751), (12.7405), (50.0682)), (* N1 *) ( (30.7172), (13.1841), (52.2328)), (* N3 *) ( (30.0617), (12.3404), (51.3847)), (* C2 *) ( (31.1834), (14.3941), (51.8297)), (* C4 *) ( (30.9913), (14.8074), (50.4803)), (* C5 *) ( (30.3434), (13.9610), (49.6548)), (* C6 *) (C ( ( (31.8090), (15.1847), (52.6957)), (* N4 *) ( (29.6470), (11.2494), (51.7616)), (* O2 *) ( (32.1422), (16.0774), (52.3606)), (* H41 *) ( (31.9392), (14.8893), (53.6527)), (* H42 *) ( (31.3632), (15.7771), (50.1491)), (* H5 *) ( (30.1742), (14.2374), (48.6141))) (* H6 *) ) ) val rC10 = ( ( (0.1549), (0.8710), (~0.4663), (* dgf-base-tfo *) (0.6768), (~0.4374), (~0.5921), (~0.7197), (~0.2239), (~0.6572), (25.2447), (~14.1920), (50.3201)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (31.8779), (9.9369), (47.8760)), (* C5' *) ( (31.3239), (10.6931), (48.4322)), (* H5' *) ( (32.8647), (9.6624), (48.2489)), (* H5'' *) ( (31.0429), (8.6773), (47.9401)), (* C4' *) ( (30.0440), (8.8473), (47.5383)), (* H4' *) ( (31.6749), (7.6351), (47.2119)), (* O4' *) ( (31.9159), (6.5022), (48.0616)), (* C1' *) ( (31.0691), (5.8243), (47.9544)), (* H1' *) ( (31.9300), (7.0685), (49.4493)), (* C2' *) ( (32.9024), (7.5288), (49.6245)), (* H2'' *) ( (31.5672), (6.1750), (50.4632)), (* O2' *) ( (31.8416), (5.2663), (50.3200)), (* H2' *) ( (30.8618), (8.1514), (49.3749)), (* C3' *) ( (31.1122), (8.9396), (50.0850)), (* H3' *) ( (29.5351), (7.6245), (49.5409)), (* O3' *) ( (33.1890), (5.8629), (47.7343)), (* N1 *) ( (34.4004), (4.2636), (46.4828)), (* N3 *) ( (33.2062), (4.8497), (46.7851)), (* C2 *) ( (35.5600), (4.6374), (47.0822)), (* C4 *) ( (35.5444), (5.6751), (48.0577)), (* C5 *) ( (34.3565), (6.2450), (48.3432)), (* C6 *) (C ( ( (36.6977), (4.0305), (46.7598)), (* N4 *) ( (32.1661), (4.5034), (46.2348)), (* O2 *) ( (37.5405), (4.3347), (47.2259)), (* H41 *) ( (36.7033), (3.2923), (46.0706)), (* H42 *) ( (36.4713), (5.9811), (48.5428)), (* H5 *) ( (34.2986), (7.0426), (49.0839))) (* H6 *) ) ) val rCs = [rC01,rC02,rC03,rC04,rC05,rC06,rC07,rC08,rC09,rC10] val rG = ( ( (~0.0018), (~0.8207), (0.5714), (* dgf-base-tfo *) (0.2679), (~0.5509), (~0.7904), (0.9634), (0.1517), (0.2209), (0.0073), (8.4030), (0.6232)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4550), (8.2120), (~2.8810)), (* C5' *) ( (5.4546), (8.8508), (~1.9978)), (* H5' *) ( (5.7588), (8.6625), (~3.8259)), (* H5'' *) ( (6.4970), (7.1480), (~2.5980)), (* C4' *) ( (7.4896), (7.5919), (~2.5214)), (* H4' *) ( (6.1630), (6.4860), (~1.3440)), (* O4' *) ( (6.5400), (5.1200), (~1.4190)), (* C1' *) ( (7.2763), (4.9681), (~0.6297)), (* H1' *) ( (7.1940), (4.8830), (~2.7770)), (* C2' *) ( (6.8667), (3.9183), (~3.1647)), (* H2'' *) ( (8.5860), (5.0910), (~2.6140)), (* O2' *) ( (8.9510), (4.7626), (~1.7890)), (* H2' *) ( (6.5720), (6.0040), (~3.6090)), (* C3' *) ( (5.5636), (5.7066), (~3.8966)), (* H3' *) ( (7.3801), (6.3562), (~4.7350)), (* O3' *) ( (4.7150), (0.4910), (~0.1360)), (* N1 *) ( (6.3490), (2.1730), (~0.6020)), (* N3 *) ( (5.9530), (0.9650), (~0.2670)), (* C2 *) ( (5.2900), (2.9790), (~0.8260)), (* C4 *) ( (3.9720), (2.6390), (~0.7330)), (* C5 *) ( (3.6770), (1.3160), (~0.3660)), (* C6 *) (G ( ( (6.8426), (0.0056), (~0.0019)), (* N2 *) ( (3.1660), (3.7290), (~1.0360)), (* N7 *) ( (5.3170), (4.2990), (~1.1930)), (* N9 *) ( (4.0100), (4.6780), (~1.2990)), (* C8 *) ( (2.4280), (0.8450), (~0.2360)), (* O6 *) ( (4.6151), (~0.4677), (0.1305)), (* H1 *) ( (6.6463), (~0.9463), (0.2729)), (* H21 *) ( (7.8170), (0.2642), (~0.0640)), (* H22 *) ( (3.4421), (5.5744), (~1.5482))) (* H8 *) ) ) val rG01 = ( ( (~0.0043), (~0.8175), (0.5759), (* dgf-base-tfo *) (0.2617), (~0.5567), (~0.7884), (0.9651), (0.1473), (0.2164), (0.0359), (8.3929), (0.5532)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (4.7442), (0.4514), (~0.1390)), (* N1 *) ( (6.3687), (2.1459), (~0.5926)), (* N3 *) ( (5.9795), (0.9335), (~0.2657)), (* C2 *) ( (5.3052), (2.9471), (~0.8125)), (* C4 *) ( (3.9891), (2.5987), (~0.7230)), (* C5 *) ( (3.7016), (1.2717), (~0.3647)), (* C6 *) (G ( ( (6.8745), (~0.0224), (~0.0058)), (* N2 *) ( (3.1770), (3.6859), (~1.0198)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.0156), (4.6415), (~1.2759)), (* C8 *) ( (2.4553), (0.7925), (~0.2390)), (* O6 *) ( (4.6497), (~0.5095), (0.1212)), (* H1 *) ( (6.6836), (~0.9771), (0.2627)), (* H21 *) ( (7.8474), (0.2424), (~0.0653)), (* H22 *) ( (3.4426), (5.5361), (~1.5199))) (* H8 *) ) ) val rG02 = ( ( (0.5566), (0.0449), (0.8296), (* dgf-base-tfo *) (0.5125), (0.7673), (~0.3854), (~0.6538), (0.6397), (0.4041), (~9.1161), (~3.7679), (~2.9968)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.3245), (8.5459), (1.5467)), (* N1 *) ( (9.8051), (6.9432), (~0.1497)), (* N3 *) ( (10.5175), (7.4328), (0.8408)), (* C2 *) ( (8.7523), (7.7422), (~0.4228)), (* C4 *) ( (8.4257), (8.9060), (0.2099)), (* C5 *) ( (9.2665), (9.3242), (1.2540)), (* C6 *) (G ( ( (11.6077), (6.7966), (1.2752)), (* N2 *) ( (7.2750), (9.4537), (~0.3428)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9479), (8.6157), (~1.2771)), (* C8 *) ( (9.0664), (10.4462), (1.9610)), (* O6 *) ( (10.9838), (8.7524), (2.2697)), (* H1 *) ( (12.2274), (7.0896), (2.0170)), (* H21 *) ( (11.8502), (5.9398), (0.7984)), (* H22 *) ( (6.0430), (8.9853), (~1.7594))) (* H8 *) ) ) val rG03 = ( ( (~0.5021), (0.0731), (0.8617), (* dgf-base-tfo *) (~0.8112), (0.3054), (~0.4986), (~0.2996), (~0.9494), (~0.0940), (6.4273), (~5.1944), (~3.7807)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (9.6740), (4.7656), (~7.6614)), (* N1 *) ( (9.0739), (4.3013), (~5.3941)), (* N3 *) ( (9.8416), (4.2192), (~6.4581)), (* C2 *) ( (7.9885), (5.0632), (~5.6446)), (* C4 *) ( (7.6822), (5.6856), (~6.8194)), (* C5 *) ( (8.5831), (5.5215), (~7.8840)), (* C6 *) (G ( ( (10.9733), (3.5117), (~6.4286)), (* N2 *) ( (6.4857), (6.3816), (~6.7035)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (6.1133), (6.1613), (~5.4808)), (* C8 *) ( (8.4084), (6.0747), (~9.0933)), (* O6 *) ( (10.3759), (4.5855), (~8.3504)), (* H1 *) ( (11.6254), (3.3761), (~7.1879)), (* H21 *) ( (11.1917), (3.0460), (~5.5593)), (* H22 *) ( (5.1705), (6.6830), (~5.3167))) (* H8 *) ) ) val rG04 = ( ( (~0.5426), (~0.8175), (0.1929), (* dgf-base-tfo *) (0.8304), (~0.5567), (~0.0237), (0.1267), (0.1473), (0.9809), (~0.5075), (8.3929), (0.2229)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (3.6343), (2.6680), (2.0783)), (* N1 *) ( (5.4505), (3.9805), (1.2446)), (* N3 *) ( (4.7540), (3.3816), (2.1851)), (* C2 *) ( (4.8805), (3.7951), (0.0354)), (* C4 *) ( (3.7416), (3.0925), (~0.2305)), (* C5 *) ( (3.0873), (2.4980), (0.8606)), (* C6 *) (G ( ( (5.1433), (3.4373), (3.4609)), (* N2 *) ( (3.4605), (3.1184), (~1.5906)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.4244), (3.8244), (~2.0953)), (* C8 *) ( (1.9600), (1.7805), (0.7462)), (* O6 *) ( (3.2489), (2.2879), (2.9191)), (* H1 *) ( (4.6785), (3.0243), (4.2568)), (* H21 *) ( (5.9823), (3.9654), (3.6539)), (* H22 *) ( (4.2675), (3.8876), (~3.1721))) (* H8 *) ) ) val rG05 = ( ( (~0.5891), (0.0449), (0.8068), (* dgf-base-tfo *) (0.5375), (0.7673), (0.3498), (~0.6034), (0.6397), (~0.4762), (~0.3019), (~3.7679), (~9.5913)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.2594), (10.6774), (~1.0056)), (* N1 *) ( (9.7528), (8.7080), (~2.2631)), (* N3 *) ( (10.4471), (9.7876), (~1.9791)), (* C2 *) ( (8.7271), (8.5575), (~1.3991)), (* C4 *) ( (8.4100), (9.3803), (~0.3580)), (* C5 *) ( (9.2294), (10.5030), (~0.1574)), (* C6 *) (G ( ( (11.5110), (10.1256), (~2.7114)), (* N2 *) ( (7.2891), (8.9068), (0.3121)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9702), (7.8292), (~0.3353)), (* C8 *) ( (9.0349), (11.3951), (0.8250)), (* O6 *) ( (10.9013), (11.4422), (~0.9512)), (* H1 *) ( (12.1031), (10.9341), (~2.5861)), (* H21 *) ( (11.7369), (9.5180), (~3.4859)), (* H22 *) ( (6.0888), (7.3990), (0.1403))) (* H8 *) ) ) val rG06 = ( ( (~0.9815), (0.0731), (~0.1772), (* dgf-base-tfo *) (0.1912), (0.3054), (~0.9328), (~0.0141), (~0.9494), (~0.3137), (5.7506), (~5.1944), (4.7470)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (6.6624), (3.5061), (~8.2986)), (* N1 *) ( (6.5810), (3.2570), (~5.9221)), (* N3 *) ( (6.5151), (2.8263), (~7.1625)), (* C2 *) ( (6.8364), (4.5817), (~5.8882)), (* C4 *) ( (7.0116), (5.4064), (~6.9609)), (* C5 *) ( (6.9173), (4.8260), (~8.2361)), (* C6 *) (G ( ( (6.2717), (1.5402), (~7.4250)), (* N2 *) ( (7.2573), (6.7070), (~6.5394)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (7.2238), (6.6275), (~5.2453)), (* C8 *) ( (7.0668), (5.5163), (~9.3763)), (* O6 *) ( (6.5754), (2.9964), (~9.1545)), (* H1 *) ( (6.1908), (1.1105), (~8.3354)), (* H21 *) ( (6.1346), (0.9352), (~6.6280)), (* H22 *) ( (7.4108), (7.6227), (~4.8418))) (* H8 *) ) ) val rG07 = ( ( (0.0894), (~0.6059), (0.7905), (* dgf-base-tfo *) (~0.6810), (0.5420), (0.4924), (~0.7268), (~0.5824), (~0.3642), (34.1424), (45.9610), (~11.8600)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (33.8709), (0.7918), (47.2113)), (* C5' *) ( (34.1386), (0.5870), (46.1747)), (* H5' *) ( (34.0186), (~0.0095), (47.9353)), (* H5'' *) ( (34.7297), (1.9687), (47.6685)), (* C4' *) ( (35.7723), (1.6845), (47.8113)), (* H4' *) ( (34.6455), (2.9768), (46.6660)), (* O4' *) ( (34.1690), (4.1829), (47.2627)), (* C1' *) ( (35.0437), (4.7633), (47.5560)), (* H1' *) ( (33.4145), (3.7532), (48.4954)), (* C2' *) ( (32.4340), (3.3797), (48.2001)), (* H2'' *) ( (33.3209), (4.6953), (49.5217)), (* O2' *) ( (33.2374), (5.6059), (49.2295)), (* H2' *) ( (34.2724), (2.5970), (48.9773)), (* C3' *) ( (33.6373), (1.8935), (49.5157)), (* H3' *) ( (35.3453), (3.1884), (49.7285)), (* O3' *) ( (34.0511), (7.8930), (43.7791)), (* N1 *) ( (34.9937), (6.3369), (45.3199)), (* N3 *) ( (35.0882), (7.3126), (44.4200)), (* C2 *) ( (33.7190), (5.9650), (45.5374)), (* C4 *) ( (32.5845), (6.4770), (44.9458)), (* C5 *) ( (32.7430), (7.5179), (43.9914)), (* C6 *) (G ( ( (36.3030), (7.7827), (44.1036)), (* N2 *) ( (31.4499), (5.8335), (45.4368)), (* N7 *) ( (33.2760), (4.9817), (46.4043)), (* N9 *) ( (31.9235), (4.9639), (46.2934)), (* C8 *) ( (31.8602), (8.1000), (43.3695)), (* O6 *) ( (34.2623), (8.6223), (43.1283)), (* H1 *) ( (36.5188), (8.5081), (43.4347)), (* H21 *) ( (37.0888), (7.3524), (44.5699)), (* H22 *) ( (31.0815), (4.4201), (46.7218))) (* H8 *) ) ) val rG08 = ( ( (0.2224), (0.6335), (0.7411), (* dgf-base-tfo *) (~0.3644), (~0.6510), (0.6659), (0.9043), (~0.4181), (0.0861), (~47.6824), (~0.5823), (~31.7554)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.5924), (2.3488), (48.2255)), (* C5' *) ( (33.3674), (2.1246), (48.9584)), (* H5' *) ( (31.5994), (2.5917), (48.6037)), (* H5'' *) ( (33.0722), (3.5577), (47.4258)), (* C4' *) ( (33.0310), (4.4778), (48.0089)), (* H4' *) ( (34.4173), (3.3055), (47.0316)), (* O4' *) ( (34.5056), (3.3910), (45.6094)), (* C1' *) ( (34.7881), (4.4152), (45.3663)), (* H1' *) ( (33.1122), (3.1198), (45.1010)), (* C2' *) ( (32.9230), (2.0469), (45.1369)), (* H2'' *) ( (32.7946), (3.6590), (43.8529)), (* O2' *) ( (33.5170), (3.6707), (43.2207)), (* H2' *) ( (32.2730), (3.8173), (46.1566)), (* C3' *) ( (31.3094), (3.3123), (46.2244)), (* H3' *) ( (32.2391), (5.2039), (45.7807)), (* O3' *) ( (39.3337), (2.7157), (44.1441)), (* N1 *) ( (37.4430), (3.8242), (45.0824)), (* N3 *) ( (38.7276), (3.7646), (44.7403)), (* C2 *) ( (36.7791), (2.6963), (44.7704)), (* C4 *) ( (37.2860), (1.5653), (44.1678)), (* C5 *) ( (38.6647), (1.5552), (43.8235)), (* C6 *) (G ( ( (39.5123), (4.8216), (44.9936)), (* N2 *) ( (36.2829), (0.6110), (44.0078)), (* N7 *) ( (35.4394), (2.4314), (44.9931)), (* N9 *) ( (35.2180), (1.1815), (44.5128)), (* C8 *) ( (39.2907), (0.6514), (43.2796)), (* O6 *) ( (40.3076), (2.8048), (43.9352)), (* H1 *) ( (40.4994), (4.9066), (44.7977)), (* H21 *) ( (39.0738), (5.6108), (45.4464)), (* H22 *) ( (34.3856), (0.4842), (44.4185))) (* H8 *) ) ) val rG09 = ( ( (~0.9699), (~0.1688), (~0.1753), (* dgf-base-tfo *) (~0.1050), (~0.3598), (0.9271), (~0.2196), (0.9176), (0.3312), (45.6217), (~38.9484), (~12.3208)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (33.8709), (0.7918), (47.2113)), (* C5' *) ( (34.1386), (0.5870), (46.1747)), (* H5' *) ( (34.0186), (~0.0095), (47.9353)), (* H5'' *) ( (34.7297), (1.9687), (47.6685)), (* C4' *) ( (34.5880), (2.8482), (47.0404)), (* H4' *) ( (34.3575), (2.2770), (49.0081)), (* O4' *) ( (35.5157), (2.1993), (49.8389)), (* C1' *) ( (35.9424), (3.2010), (49.8893)), (* H1' *) ( (36.4701), (1.2820), (49.1169)), (* C2' *) ( (36.1545), (0.2498), (49.2683)), (* H2'' *) ( (37.8262), (1.4547), (49.4008)), (* O2' *) ( (38.0227), (1.6945), (50.3094)), (* H2' *) ( (36.2242), (1.6797), (47.6725)), (* C3' *) ( (36.4297), (0.8197), (47.0351)), (* H3' *) ( (37.0289), (2.8480), (47.4426)), (* O3' *) ( (34.3005), (3.5042), (54.6070)), (* N1 *) ( (34.7693), (3.7936), (52.2874)), (* N3 *) ( (34.4484), (4.2541), (53.4939)), (* C2 *) ( (34.9354), (2.4584), (52.2785)), (* C4 *) ( (34.8092), (1.5915), (53.3422)), (* C5 *) ( (34.4646), (2.1367), (54.6085)), (* C6 *) (G ( ( (34.2514), (5.5708), (53.6503)), (* N2 *) ( (35.0641), (0.2835), (52.9337)), (* N7 *) ( (35.2669), (1.6690), (51.1915)), (* N9 *) ( (35.3288), (0.3954), (51.6563)), (* C8 *) ( (34.3151), (1.5317), (55.6650)), (* O6 *) ( (34.0623), (3.9797), (55.4539)), (* H1 *) ( (33.9950), (6.0502), (54.5016)), (* H21 *) ( (34.3512), (6.1432), (52.8242)), (* H22 *) ( (35.5414), (~0.6006), (51.2679))) (* H8 *) ) ) val rG10 = ( ( (~0.0980), (~0.9723), (0.2122), (* dgf-base-tfo *) (~0.9731), (0.1383), (0.1841), (~0.2083), (~0.1885), (~0.9597), (17.8469), (38.8265), (37.0475)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.5924), (2.3488), (48.2255)), (* C5' *) ( (33.3674), (2.1246), (48.9584)), (* H5' *) ( (31.5994), (2.5917), (48.6037)), (* H5'' *) ( (33.0722), (3.5577), (47.4258)), (* C4' *) ( (34.0333), (3.3761), (46.9447)), (* H4' *) ( (32.0890), (3.8338), (46.4332)), (* O4' *) ( (31.6377), (5.1787), (46.5914)), (* C1' *) ( (32.2499), (5.8016), (45.9392)), (* H1' *) ( (31.9167), (5.5319), (48.0305)), (* C2' *) ( (31.1507), (5.0820), (48.6621)), (* H2'' *) ( (32.0865), (6.8890), (48.3114)), (* O2' *) ( (31.5363), (7.4819), (47.7942)), (* H2' *) ( (33.2398), (4.8224), (48.2563)), (* C3' *) ( (33.3166), (4.5570), (49.3108)), (* H3' *) ( (34.2528), (5.7056), (47.7476)), (* O3' *) ( (28.2782), (6.3049), (42.9364)), (* N1 *) ( (30.4001), (5.8547), (43.9258)), (* N3 *) ( (29.6195), (6.1568), (42.8913)), (* C2 *) ( (29.7005), (5.7006), (45.0649)), (* C4 *) ( (28.3383), (5.8221), (45.2343)), (* C5 *) ( (27.5519), (6.1461), (44.0958)), (* C6 *) (G ( ( (30.1838), (6.3385), (41.6890)), (* N2 *) ( (27.9936), (5.5926), (46.5651)), (* N7 *) ( (30.2046), (5.3825), (46.3136)), (* N9 *) ( (29.1371), (5.3398), (47.1506)), (* C8 *) ( (26.3361), (6.3024), (44.0495)), (* O6 *) ( (27.8122), (6.5394), (42.0833)), (* H1 *) ( (29.7125), (6.5595), (40.8235)), (* H21 *) ( (31.1859), (6.2231), (41.6389)), (* H22 *) ( (28.9406), (5.1504), (48.2059))) (* H8 *) ) ) val rGs = [rG01,rG02,rG03,rG04,rG05,rG06,rG07,rG08,rG09,rG10] val rU = ( ( (~0.0359), (~0.8071), (0.5894), (* dgf-base-tfo *) (~0.2669), (0.5761), (0.7726), (~0.9631), (~0.1296), (~0.2361), (0.1584), (8.3434), (0.5434)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (7.2954), (~7.6762), (2.4898)), (* H4' *) ( (6.0140), (~6.5420), (1.2890)), (* O4' *) ( (6.4190), (~5.1840), (1.3620)), (* C1' *) ( (7.1608), (~5.0495), (0.5747)), (* H1' *) ( (7.0760), (~4.9560), (2.7270)), (* C2' *) ( (6.7770), (~3.9803), (3.1099)), (* H2'' *) ( (8.4500), (~5.1930), (2.5810)), (* O2' *) ( (8.8309), (~4.8755), (1.7590)), (* H2' *) ( (6.4060), (~6.0590), (3.5580)), (* C3' *) ( (5.4021), (~5.7313), (3.8281)), (* H3' *) ( (7.1570), (~6.4240), (4.7070)), (* O3' *) ( (5.2170), (~4.3260), (1.1690)), (* N1 *) ( (4.2960), (~2.2560), (0.6290)), (* N3 *) ( (5.4330), (~3.0200), (0.7990)), (* C2 *) ( (2.9930), (~2.6780), (0.7940)), (* C4 *) ( (2.8670), (~4.0630), (1.1830)), (* C5 *) ( (3.9570), (~4.8300), (1.3550)), (* C6 *) (U ( ( (6.5470), (~2.5560), (0.6290)), (* O2 *) ( (2.0540), (~1.9000), (0.6130)), (* O4 *) ( (4.4300), (~1.3020), (0.3600)), (* H3 *) ( (1.9590), (~4.4570), (1.3250)), (* H5 *) ( (3.8460), (~5.7860), (1.6240))) (* H6 *) ) ) val rU01 = ( ( (~0.0137), (~0.8012), (0.5983), (* dgf-base-tfo *) (~0.2523), (0.5817), (0.7733), (~0.9675), (~0.1404), (~0.2101), (0.2031), (8.3874), (0.4228)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (4.3777), (~2.2062), (0.7229)), (* N3 *) ( (5.5069), (~2.9779), (0.9088)), (* C2 *) ( (3.0693), (~2.6246), (0.8500)), (* C4 *) ( (2.9279), (~4.0146), (1.2149)), (* C5 *) ( (4.0101), (~4.7892), (1.4017)), (* C6 *) (U ( ( (6.6267), (~2.5166), (0.7728)), (* O2 *) ( (2.1383), (~1.8396), (0.6581)), (* O4 *) ( (4.5223), (~1.2489), (0.4716)), (* H3 *) ( (2.0151), (~4.4065), (1.3290)), (* H5 *) ( (3.8886), (~5.7486), (1.6535))) (* H6 *) ) ) val rU02 = ( ( (0.5141), (0.0246), (0.8574), (* dgf-base-tfo *) (~0.5547), (~0.7529), (0.3542), (0.6542), (~0.6577), (~0.3734), (~9.1111), (~3.4598), (~3.2939)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.6945), (~8.7046), (~0.2857)), (* N3 *) ( (8.6943), (~7.6514), (0.6066)), (* C2 *) ( (7.7426), (~9.6987), (~0.3801)), (* C4 *) ( (6.6642), (~9.5742), (0.5722)), (* C5 *) ( (6.6391), (~8.5592), (1.4526)), (* C6 *) (U ( ( (9.5840), (~6.8186), (0.6136)), (* O2 *) ( (7.8505), (~10.5925), (~1.2223)), (* O4 *) ( (9.4601), (~8.7514), (~0.9277)), (* H3 *) ( (5.9281), (~10.2509), (0.5782)), (* H5 *) ( (5.8831), (~8.4931), (2.1028))) (* H6 *) ) ) val rU03 = ( ( (~0.4993), (0.0476), (0.8651), (* dgf-base-tfo *) (0.8078), (~0.3353), (0.4847), (0.3132), (0.9409), (0.1290), (6.2989), (~5.2303), (~3.8577)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (7.9218), (~5.5700), (6.8877)), (* N3 *) ( (7.8908), (~5.0886), (5.5944)), (* C2 *) ( (6.9789), (~6.3827), (7.4823)), (* C4 *) ( (5.8742), (~6.7319), (6.6202)), (* C5 *) ( (5.8182), (~6.2769), (5.3570)), (* C6 *) (U ( ( (8.7747), (~4.3728), (5.1568)), (* O2 *) ( (7.1154), (~6.7509), (8.6509)), (* O4 *) ( (8.7055), (~5.3037), (7.4491)), (* H3 *) ( (5.1416), (~7.3178), (6.9665)), (* H5 *) ( (5.0441), (~6.5310), (4.7784))) (* H6 *) ) ) val rU04 = ( ( (~0.5669), (~0.8012), (0.1918), (* dgf-base-tfo *) (~0.8129), (0.5817), (0.0273), (~0.1334), (~0.1404), (~0.9811), (~0.3279), (8.3874), (0.3355)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (3.8961), (~3.0896), (~0.1893)), (* N3 *) ( (5.0095), (~3.8907), (~0.0346)), (* C2 *) ( (3.0480), (~2.6632), (0.8116)), (* C4 *) ( (3.4093), (~3.1310), (2.1292)), (* C5 *) ( (4.4878), (~3.9124), (2.3088)), (* C6 *) (U ( ( (5.7005), (~4.2164), (~0.9842)), (* O2 *) ( (2.0800), (~1.9458), (0.5503)), (* O4 *) ( (3.6834), (~2.7882), (~1.1190)), (* H3 *) ( (2.8508), (~2.8721), (2.9172)), (* H5 *) ( (4.7188), (~4.2247), (3.2295))) (* H6 *) ) ) val rU05 = ( ( (~0.6298), (0.0246), (0.7763), (* dgf-base-tfo *) (~0.5226), (~0.7529), (~0.4001), (0.5746), (~0.6577), (0.4870), (~0.0208), (~3.4598), (~9.6882)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.5977), (~9.5977), (0.7329)), (* N3 *) ( (8.5951), (~8.5745), (1.6594)), (* C2 *) ( (7.7372), (~9.7371), (~0.3364)), (* C4 *) ( (6.7596), (~8.6801), (~0.4476)), (* C5 *) ( (6.7338), (~7.6721), (0.4408)), (* C6 *) (U ( ( (9.3993), (~8.5377), (2.5743)), (* O2 *) ( (7.8374), (~10.6990), (~1.1008)), (* O4 *) ( (9.2924), (~10.3081), (0.8477)), (* H3 *) ( (6.0932), (~8.6982), (~1.1929)), (* H5 *) ( (6.0481), (~6.9515), (0.3446))) (* H6 *) ) ) val rU06 = ( ( (~0.9837), (0.0476), (~0.1733), (* dgf-base-tfo *) (~0.1792), (~0.3353), (0.9249), (~0.0141), (0.9409), (0.3384), (5.7793), (~5.2303), (4.5997)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (6.6920), (~5.0495), (7.1354)), (* N3 *) ( (6.6201), (~4.5500), (5.8506)), (* C2 *) ( (6.9254), (~6.3614), (7.4926)), (* C4 *) ( (7.1046), (~7.2543), (6.3718)), (* C5 *) ( (7.0391), (~6.7951), (5.1106)), (* C6 *) (U ( ( (6.4083), (~3.3696), (5.6340)), (* O2 *) ( (6.9679), (~6.6901), (8.6800)), (* O4 *) ( (6.5626), (~4.3957), (7.8812)), (* H3 *) ( (7.2781), (~8.2254), (6.5350)), (* H5 *) ( (7.1657), (~7.4312), (4.3503))) (* H6 *) ) ) val rU07 = ( ( (~0.9434), (0.3172), (0.0971), (* dgf-base-tfo *) (0.2294), (0.4125), (0.8816), (0.2396), (0.8539), (~0.4619), (8.3625), (~52.7147), (1.3745)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (21.5037), (16.8594), (43.7323)), (* C5' *) ( (20.8147), (17.6663), (43.9823)), (* H5' *) ( (21.1086), (16.0230), (43.1557)), (* H5'' *) ( (22.5654), (17.4874), (42.8616)), (* C4' *) ( (22.1584), (17.7243), (41.8785)), (* H4' *) ( (23.0557), (18.6826), (43.4751)), (* O4' *) ( (24.4788), (18.6151), (43.6455)), (* C1' *) ( (24.9355), (19.0840), (42.7739)), (* H1' *) ( (24.7958), (17.1427), (43.6474)), (* C2' *) ( (24.5652), (16.7400), (44.6336)), (* H2'' *) ( (26.1041), (16.8773), (43.2455)), (* O2' *) ( (26.7516), (17.5328), (43.5149)), (* H2' *) ( (23.8109), (16.5979), (42.6377)), (* C3' *) ( (23.5756), (15.5686), (42.9084)), (* H3' *) ( (24.2890), (16.7447), (41.2729)), (* O3' *) ( (24.9420), (19.2174), (44.8923)), (* N1 *) ( (25.2655), (20.5636), (44.8883)), (* N3 *) ( (25.1663), (21.2219), (43.8561)), (* C2 *) ( (25.6911), (21.1219), (46.0494)), (* C4 *) ( (25.8051), (20.4068), (47.2048)), (* C5 *) ( (26.2093), (20.9962), (48.2534)), (* C6 *) (U ( ( (25.4692), (19.0221), (47.2053)), (* O2 *) ( (25.0502), (18.4827), (46.0370)), (* O4 *) ( (25.9599), (22.1772), (46.0966)), (* H3 *) ( (25.5545), (18.4409), (48.1234)), (* H5 *) ( (24.7854), (17.4265), (45.9883))) (* H6 *) ) ) val rU08 = ( ( (~0.0080), (~0.7928), (0.6094), (* dgf-base-tfo *) (~0.7512), (0.4071), (0.5197), (~0.6601), (~0.4536), (~0.5988), (44.1482), (30.7036), (2.1088)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (23.5096), (16.1227), (44.5783)), (* C5' *) ( (23.5649), (15.8588), (43.5222)), (* H5' *) ( (23.9621), (15.4341), (45.2919)), (* H5'' *) ( (24.2805), (17.4138), (44.7151)), (* C4' *) ( (25.3492), (17.2309), (44.6030)), (* H4' *) ( (23.8497), (18.3471), (43.7208)), (* O4' *) ( (23.4090), (19.5681), (44.3321)), (* C1' *) ( (24.2595), (20.2496), (44.3524)), (* H1' *) ( (23.0418), (19.1813), (45.7407)), (* C2' *) ( (22.0532), (18.7224), (45.7273)), (* H2'' *) ( (23.1307), (20.2521), (46.6291)), (* O2' *) ( (22.8888), (21.1051), (46.2611)), (* H2' *) ( (24.0799), (18.1326), (46.0700)), (* C3' *) ( (23.6490), (17.4370), (46.7900)), (* H3' *) ( (25.3329), (18.7227), (46.5109)), (* O3' *) ( (22.2515), (20.1624), (43.6698)), (* N1 *) ( (22.4760), (21.0609), (42.6406)), (* N3 *) ( (23.6229), (21.3462), (42.3061)), (* C2 *) ( (21.3986), (21.6081), (42.0236)), (* C4 *) ( (20.1189), (21.3012), (42.3804)), (* C5 *) ( (19.1599), (21.8516), (41.7578)), (* C6 *) (U ( ( (19.8919), (20.3745), (43.4387)), (* O2 *) ( (20.9790), (19.8423), (44.0440)), (* O4 *) ( (21.5235), (22.3222), (41.2097)), (* H3 *) ( (18.8732), (20.1200), (43.7312)), (* H5 *) ( (20.8545), (19.1313), (44.8608))) (* H6 *) ) ) val rU09 = ( ( (~0.0317), (0.1374), (0.9900), (* dgf-base-tfo *) (~0.3422), (~0.9321), (0.1184), (0.9391), (~0.3351), (0.0765), (~32.1929), (25.8198), (~28.5088)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (21.5037), (16.8594), (43.7323)), (* C5' *) ( (20.8147), (17.6663), (43.9823)), (* H5' *) ( (21.1086), (16.0230), (43.1557)), (* H5'' *) ( (22.5654), (17.4874), (42.8616)), (* C4' *) ( (23.0565), (18.3036), (43.3915)), (* H4' *) ( (23.5375), (16.5054), (42.4925)), (* O4' *) ( (23.6574), (16.4257), (41.0649)), (* C1' *) ( (24.4701), (17.0882), (40.7671)), (* H1' *) ( (22.3525), (16.9643), (40.5396)), (* C2' *) ( (21.5993), (16.1799), (40.6133)), (* H2'' *) ( (22.4693), (17.4849), (39.2515)), (* O2' *) ( (23.0899), (17.0235), (38.6827)), (* H2' *) ( (22.0341), (18.0633), (41.5279)), (* C3' *) ( (20.9509), (18.1709), (41.5846)), (* H3' *) ( (22.7249), (19.3020), (41.2100)), (* O3' *) ( (23.8580), (15.0648), (40.5757)), (* N1 *) ( (25.1556), (14.5982), (40.4523)), (* N3 *) ( (26.1047), (15.3210), (40.7448)), (* C2 *) ( (25.3391), (13.3315), (40.0020)), (* C4 *) ( (24.2974), (12.5148), (39.6749)), (* C5 *) ( (24.5450), (11.3410), (39.2610)), (* C6 *) (U ( ( (22.9633), (12.9979), (39.8053)), (* O2 *) ( (22.8009), (14.2648), (40.2524)), (* O4 *) ( (26.3414), (12.9194), (39.8855)), (* H3 *) ( (22.1227), (12.3533), (39.5486)), (* H5 *) ( (21.7989), (14.6788), (40.3650))) (* H6 *) ) ) val rU10 = ( ( (~0.9674), (0.1021), (~0.2318), (* dgf-base-tfo *) (~0.2514), (~0.2766), (0.9275), (0.0306), (0.9555), (0.2933), (27.8571), (~42.1305), (~24.4563)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (23.5096), (16.1227), (44.5783)), (* C5' *) ( (23.5649), (15.8588), (43.5222)), (* H5' *) ( (23.9621), (15.4341), (45.2919)), (* H5'' *) ( (24.2805), (17.4138), (44.7151)), (* C4' *) ( (23.8509), (18.1819), (44.0720)), (* H4' *) ( (24.2506), (17.8583), (46.0741)), (* O4' *) ( (25.5830), (18.0320), (46.5775)), (* C1' *) ( (25.8569), (19.0761), (46.4256)), (* H1' *) ( (26.4410), (17.1555), (45.7033)), (* C2' *) ( (26.3459), (16.1253), (46.0462)), (* H2'' *) ( (27.7649), (17.5888), (45.6478)), (* O2' *) ( (28.1004), (17.9719), (46.4616)), (* H2' *) ( (25.7796), (17.2997), (44.3513)), (* C3' *) ( (25.9478), (16.3824), (43.7871)), (* H3' *) ( (26.2154), (18.4984), (43.6541)), (* O3' *) ( (25.7321), (17.6281), (47.9726)), (* N1 *) ( (25.5136), (18.5779), (48.9560)), (* N3 *) ( (25.2079), (19.7276), (48.6503)), (* C2 *) ( (25.6482), (18.1987), (50.2518)), (* C4 *) ( (25.9847), (16.9266), (50.6092)), (* C5 *) ( (26.0918), (16.6439), (51.8416)), (* C6 *) (U ( ( (26.2067), (15.9515), (49.5943)), (* O2 *) ( (26.0713), (16.3497), (48.3080)), (* O4 *) ( (25.4890), (18.9105), (51.0618)), (* H3 *) ( (26.4742), (14.9310), (49.8682)), (* H5 *) ( (26.2346), (15.6394), (47.4975))) (* H6 *) ) ) val rUs = [rU01,rU02,rU03,rU04,rU05,rU06,rU07,rU08,rU09,rU10] val rG' = ( ( (~0.2067), (~0.0264), (0.9780), (* dgf-base-tfo *) (0.9770), (~0.0586), (0.2049), (0.0519), (0.9979), (0.0379), (1.0331), (~46.8078), (~36.4742)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.1610), (2.2370), (46.2560)), (* C5' *) ( (31.2986), (2.8190), (46.5812)), (* H5' *) ( (32.0980), (1.7468), (45.2845)), (* H5'' *) ( (33.3476), (3.1959), (46.1947)), (* C4' *) ( (33.2668), (3.8958), (45.3630)), (* H4' *) ( (33.3799), (3.9183), (47.4216)), (* O4' *) ( (34.6515), (3.7222), (48.0398)), (* C1' *) ( (35.2947), (4.5412), (47.7180)), (* H1' *) ( (35.1756), (2.4228), (47.4827)), (* C2' *) ( (34.6778), (1.5937), (47.9856)), (* H2'' *) ( (36.5631), (2.2672), (47.4798)), (* O2' *) ( (37.0163), (2.6579), (48.2305)), (* H2' *) ( (34.6953), (2.5043), (46.0448)), (* C3' *) ( (34.5444), (1.4917), (45.6706)), (* H3' *) ( (35.6679), (3.3009), (45.3487)), (* O3' *) ( (37.4804), (4.0914), (52.2559)), (* N1 *) ( (36.9670), (4.1312), (49.9281)), (* N3 *) ( (37.8045), (4.2519), (50.9550)), (* C2 *) ( (35.7171), (3.8264), (50.3222)), (* C4 *) ( (35.2668), (3.6420), (51.6115)), (* C5 *) ( (36.2037), (3.7829), (52.6706)), (* C6 *) (G ( ( (39.0869), (4.5552), (50.7092)), (* N2 *) ( (33.9075), (3.3338), (51.6102)), (* N7 *) ( (34.6126), (3.6358), (49.5108)), (* N9 *) ( (33.5805), (3.3442), (50.3425)), (* C8 *) ( (35.9958), (3.6512), (53.8724)), (* O6 *) ( (38.2106), (4.2053), (52.9295)), (* H1 *) ( (39.8218), (4.6863), (51.3896)), (* H21 *) ( (39.3420), (4.6857), (49.7407)), (* H22 *) ( (32.5194), (3.1070), (50.2664))) (* H8 *) ) ) val rU' = ( ( (~0.0109), (0.5907), (0.8068), (* dgf-base-tfo *) (0.2217), (~0.7853), (0.5780), (0.9751), (0.1852), (~0.1224), (~1.4225), (~11.0956), (~2.5217)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (5.8744), (~6.2116), (2.4731)), (* H4' *) ( (7.2798), (~7.2260), (3.6420)), (* O4' *) ( (8.5733), (~6.9410), (3.1329)), (* C1' *) ( (8.9047), (~6.0374), (3.6446)), (* H1' *) ( (8.4429), (~6.6596), (1.6327)), (* C2' *) ( (9.2880), (~7.1071), (1.1096)), (* H2'' *) ( (8.2502), (~5.2799), (1.4754)), (* O2' *) ( (8.7676), (~4.7284), (2.0667)), (* H2' *) ( (7.1642), (~7.4416), (1.3021)), (* C3' *) ( (7.4125), (~8.5002), (1.2260)), (* H3' *) ( (6.5160), (~6.9772), (0.1267)), (* O3' *) ( (9.4531), (~8.1107), (3.4087)), (* N1 *) ( (11.5931), (~9.0015), (3.6357)), (* N3 *) ( (10.8101), (~7.8950), (3.3748)), (* C2 *) ( (11.1439), (~10.2744), (3.9206)), (* C4 *) ( (9.7056), (~10.4026), (3.9332)), (* C5 *) ( (8.9192), (~9.3419), (3.6833)), (* C6 *) (U ( ( (11.3013), (~6.8063), (3.1326)), (* O2 *) ( (11.9431), (~11.1876), (4.1375)), (* O4 *) ( (12.5840), (~8.8673), (3.6158)), (* H3 *) ( (9.2891), (~11.2898), (4.1313)), (* H5 *) ( (7.9263), (~9.4537), (3.6977))) (* H6 *) ) ) (* -- PARTIAL INSTANTIATIONS ------------------------------------------------*) type var = intg*tfo*nuc fun atom_pos atom (i,t,n) = tfo_apply t (atom n) fun get_var id ((i,t,n)::rest) = if id = i then (i,t,n) else get_var id rest (* -- SEARCH ----------------------------------------------------------------*) (* Queue operations (to efficiently append two lists of solutions) *) fun queue_to_list q = q val make_empty_queue = [] fun make_singleton_queue item = [item] fun append_queues q1 q2 = q1 @ q2 (* Sequential backtracking algorithm *) fun search partial_inst [] constraint = make_singleton_queue partial_inst | search partial_inst (h::t) constraint = search_aux partial_inst t constraint (h partial_inst) and search_aux partial_inst domains constraint [] = make_empty_queue | search_aux partial_inst domains constraint (h::t) = if constraint h partial_inst then append_queues (search (h::partial_inst) domains constraint) (search_aux partial_inst domains constraint t) else search_aux partial_inst domains constraint t (* -- DOMAINS ---------------------------------------------------------------*) (* Primary structure: strand A CUGCCACGUCUG, strand B CAGACGUGGCAG || || Secondary structure: strand A CUGCCACGUCUG || |||||||||||| || GACGGUGCAGAC strand B || || Tertiary structure: || || 5' end of strand A C1----G12 3' end of strand B || U2-------A11 || G3-------C10 || C4-----G9 || C5---G8 || A6 || G6-C7 || C5----G8 || A4-------U9 || G3--------C10 || A2-------U11 || 5' end of strand B C1----G12 3' end of strand A || || "helix", "stacked" and "connected" describe the spatial relationship || between two consecutive nucleotides. E.g. the nucleotides C1 and U2 || from the strand A. || || "wc" (stands for Watson-Crick and is a type of base-pairing), || and "wc-dumas" describe the spatial relationship between || nucleotides from two chains that are growing in opposite directions. || E.g. the nucleotides C1 from strand A and G12 from strand B. *) (* Dynamic Domains *) (* Given, || "ref" a nucleotide which is already positioned, || "nuc" the nucleotide to be placed, || and "tfo" a transformation matrix which expresses the desired || relationship between "ref" and "nuc", || the function "dgf-base" computes the transformation matrix that || places the nucleotide "nuc" in the given relationship to "ref". *) fun dgf_base tfo (i,t,n) nuc = let val x = if is_A n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (rA_N9 n)) (tfo_apply t (nuc_C4 n)) else if is_C n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (nuc_N1 n)) (tfo_apply t (nuc_C2 n)) else if is_G n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (rG_N9 n)) (tfo_apply t (nuc_C4 n)) else tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (nuc_N1 n)) (tfo_apply t (nuc_C2 n)) in tfo_combine (nuc_dgf_base_tfo nuc) (tfo_combine tfo (tfo_inv_ortho x)) end (* Placement of first nucleotide. *) fun reference nuc i partial_inst = [ (i,tfo_id,nuc) ] (* The transformation matrix for wc is from: || || Chandrasekaran R. et al (1989) A Re-Examination of the Crystal || Structure of A-DNA Using Fiber Diffraction Data. J. Biomol. || Struct. & Dynamics 6(6):1189-1202. *) val wc_tfo = ( (~1.0000), (0.0028), (~0.0019), (0.0028), (0.3468), (~0.9379), (~0.0019), (~0.9379), (~0.3468), (~0.0080), (6.0730), (8.7208) ) fun wc nuc i j partial_inst = [ (i,(dgf_base wc_tfo (get_var j partial_inst) nuc),nuc) ] val wc_Dumas_tfo = ( (~0.9737), (~0.1834), (0.1352), (~0.1779), (0.2417), (~0.9539), (0.1422), (~0.9529), (~0.2679), (0.4837), (6.2649), (8.0285) ) fun wc_Dumas nuc i j partial_inst = [ (i,(dgf_base wc_Dumas_tfo (get_var j partial_inst) nuc),nuc) ] val helix5'_tfo = ( (0.9886), (~0.0961), (0.1156), (0.1424), (0.8452), (~0.5152), (~0.0482), (0.5258), (0.8492), (~3.8737), (0.5480), (3.8024) ) fun helix5' nuc i j partial_inst = [ (i,(dgf_base helix5'_tfo (get_var j partial_inst) nuc),nuc) ] val helix3'_tfo = ( (0.9886), (0.1424), (~0.0482), (~0.0961), (0.8452), (0.5258), (0.1156), (~0.5152), (0.8492), (3.4426), (2.0474), (~3.7042) ) fun helix3' nuc i j partial_inst = [ (i,(dgf_base helix3'_tfo (get_var j partial_inst) nuc),nuc) ] val g37_a38_tfo = ( (0.9991), (0.0164), (~0.0387), (~0.0375), (0.7616), (~0.6470), (0.0189), (0.6478), (0.7615), (~3.3018), (0.9975), (2.5585) ) fun g37_a38 nuc i j partial_inst = (i,(dgf_base g37_a38_tfo (get_var j partial_inst) nuc),nuc) fun stacked5' nuc i j partial_inst = (g37_a38 nuc i j partial_inst) :: (helix5' nuc i j partial_inst) val a38_g37_tfo = ( (0.9991), (~0.0375), (0.0189), (0.0164), (0.7616), (0.6478), (~0.0387), (~0.6470), (0.7615), (3.3819), (0.7718), (~2.5321) ) fun a38_g37 nuc i j partial_inst = (i,(dgf_base a38_g37_tfo (get_var j partial_inst) nuc),nuc) fun stacked3' nuc i j partial_inst = (a38_g37 nuc i j partial_inst) :: (helix3' nuc i j partial_inst) fun p_o3' nucs i j partial_inst = let val (k,t,n) = get_var j partial_inst val align = tfo_inv_ortho (tfo_align (tfo_apply t (nuc_O3' n)) (tfo_apply t (nuc_C3' n)) (tfo_apply t (nuc_C4' n))) in List.concat (map (fn nuc => [ (i,(tfo_combine (nuc_p_o3'_60_tfo nuc) align),nuc), (i,(tfo_combine (nuc_p_o3'_180_tfo nuc) align),nuc), (i,(tfo_combine (nuc_p_o3'_275_tfo nuc) align),nuc) ]) nucs) end (* -- PROBLEM STATEMENT -----------------------------------------------------*) (* Define anticodon problem -- Science 253:1255 Figure 3a, 3b and 3c *) fun anticodon_domains () = [ reference rC 27, helix5' rC 28 27, helix5' rA 29 28, helix5' rG 30 29, helix5' rA 31 30, wc rU 39 31, helix5' rC 40 39, helix5' rU 41 40, helix5' rG 42 41, helix5' rG 43 42, stacked3' rA 38 39, stacked3' rG 37 38, stacked3' rA 36 37, stacked3' rA 35 36, stacked3' rG 34 35, (*<-. Distan, *) p_o3' rCs 32 31, (* | Constraint *) p_o3' rUs 33 32 (*<-' 3.0 Angstrom *) ] (* Anticodon constraint *) fun anticodon_constraint (i,t,n) partial_inst = if i = 33 then let val p = atom_pos nuc_P (get_var 34 partial_inst) val o3' = atom_pos nuc_O3' (i,t,n) in (pt_dist p o3') <= 3.0 end else true (* Anticodon*) fun anticodon () = queue_to_list (search [] (anticodon_domains ()) anticodon_constraint) fun anticodon_length () = length(anticodon()) fun pseudoknot_domains () = [ reference rA 23, wc_Dumas rU 8 23, helix3' rG 22 23, wc_Dumas rC 9 22, helix3' rG 21 22, wc_Dumas rC 10 21, helix3' rC 20 21, wc_Dumas rG 11 20, helix3' rU' 19 20, (* <-. *) wc_Dumas rA 12 19, (* | Distance *) (* | Constraint *) (* ; Helix 1 ; | 4.0 Angstroms *) helix3' rC 3 19, (* | *) wc_Dumas rG 13 3, (* | *) helix3' rC 2 3, (* | *) wc_Dumas rG 14 2, (* | *) helix3' rC 1 2, (* | *) wc_Dumas rG' 15 1, (* | *) (* | *) (* L2 LOOP | *) p_o3' rUs 16 15, (* | *) p_o3' rCs 17 16, (* | *) p_o3' rAs 18 17, (* <-' *) (* *) (* L1 LOOP *) helix3' rU 7 8, (* <-. *) p_o3' rCs 4 3, (* | Constraint *) stacked5' rU 5 4, (* | 4.5 Angstroms *) stacked5' rC 6 5 (* <-' *) ] fun pseudoknot_constraint (i, t, n) partial_inst = case i of 18 => let val p = atom_pos nuc_P (get_var 19 partial_inst) val o3' = atom_pos nuc_O3' (i, t, n) in pt_dist p o3' <= 4.0 end | 6 => let val p = atom_pos nuc_P (get_var 7 partial_inst) val o3' = atom_pos nuc_O3' (i, t, n) in pt_dist p o3' <= 4.5 end | _ => true fun pseudoknot () = search [] (pseudoknot_domains ()) pseudoknot_constraint fun maximum (xs: real list) = let fun loop (m, l) = case l of [] => m | x :: l => loop (if x > m then x else m, l) in case xs of [] => raise Fail "bug" | x :: xs => loop (x, xs) end fun list_of_common_atoms n = [ nuc_P n, nuc_O1P n, nuc_O2P n, nuc_O5' n, nuc_C5' n, nuc_H5' n, nuc_H5'' n, nuc_C4' n, nuc_H4' n, nuc_O4' n, nuc_C1' n, nuc_H1' n, nuc_C2' n, nuc_H2'' n, nuc_O2' n, nuc_H2' n, nuc_C3' n, nuc_H3' n, nuc_O3' n, nuc_N1 n, nuc_N3 n, nuc_C2 n, nuc_C4 n, nuc_C5 n, nuc_C6 n ] fun list_of_specific_atoms n = if is_A n then [ rA_N6 n, rA_N7 n, rA_N9 n, rA_C8 n, rA_H2 n, rA_H61 n, rA_H62 n, rA_H8 n ] else if is_C n then [ rC_N4 n, rC_O2 n, rC_H41 n, rC_H42 n, rC_H5 n, rC_H6 n ] else if is_G n then [ rG_N2 n, rG_N7 n, rG_N9 n, rG_C8 n, rG_O6 n, rG_H1 n, rG_H21 n, rG_H22 n, rG_H8 n ] else [ rU_O2 n, rU_O4 n, rU_H3 n, rU_H5 n, rU_H6 n ] fun list_of_atoms n = List.@ (list_of_common_atoms n, list_of_specific_atoms n) fun var_most_distant_atom (i, t, n) = let fun distance pos = let val (x, y, z) = tfo_apply t pos in Real.Math.sqrt (x * x + y * y + z * z) end in maximum (List.map distance (list_of_atoms n)) end fun sol_most_distant_atom s = maximum (List.map var_most_distant_atom s) fun most_distant_atom sols = maximum (List.map sol_most_distant_atom sols) fun doit () = let val result = most_distant_atom (pseudoknot ()) val x = result / 33.797594890762724 val _ = if x > 0.999999 andalso x < 1.000001 then () else raise Fail "bug" in () end end; signature BMARK = sig val doit : int -> unit end; (* main.sml * * COPYRIGHT (c) 1996 AT&T Research. *) structure Main : BMARK = struct val doit = Nucleic.doit val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end; mlton-20210117+dfsg/benchmark/tests/output1.sml000066400000000000000000000007631416264345000212660ustar00rootroot00000000000000structure Main = struct fun once () = let val count = 1000000000 open TextIO val out = openOut "/dev/null" fun loop n = if n = 0 then () else (output1 (out, #"a"); loop (n - 1)) val _ = loop count val _ = closeOut out in () end fun doit n = if n = 0 then () else (once (); doit (n - 1)) end mlton-20210117+dfsg/benchmark/tests/peek.sml000066400000000000000000000042461416264345000205710ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Plist: sig type t val new: unit -> t val addPeek: unit -> {add: t * 'a -> unit, peek: t -> 'a option} end = struct datatype t = T of exn list ref fun new () = T (ref []) fun addPeek () = let exception E of 'a fun add (T r, x) = r := E x :: !r fun peek (T r) = let val rec loop = fn [] => NONE | E x :: _ => SOME x | _ :: l => loop l in loop (!r) end in {add = add, peek = peek} end end structure Main = struct fun inner () = let val l1 = Plist.new () val l2 = Plist.new () val {add = addA, peek = peekA} = Plist.addPeek () val {add = addB, peek = peekB} = Plist.addPeek () val {add = addC, peek = peekC} = Plist.addPeek () val {add = addD, peek = peekD} = Plist.addPeek () val _ = addA (l1, 13: Int32.int) val _ = addB (l1, 15: Int64.int) val _ = addC (l1, 17: Int32.int) val _ = addD (l1, 19: Int64.int) val _ = addA (l2, 19: Int32.int) val _ = addB (l2, 17: Int64.int) val _ = addC (l2, 15: Int32.int) val _ = addD (l2, 13: Int64.int) fun peek l = Int32.toInt (valOf (peekA l1)) + Int64.toInt (valOf (peekB l)) + Int32.toInt (valOf (peekC l)) + Int64.toInt (valOf (peekD l)) fun loop (i, ac1, ac2) = if i = 0 then (ac1, ac2) else loop (i - 1, ac1 + peek l1, ac2 + peek l2) val (n1, n2) = loop (10000000, 0, 0) val _ = if n1 <> 640000000 orelse n2 <> 580000000 then raise Fail "bug" else () in () end fun doit size = let fun loop i = if i = 0 then () else (inner (); loop (i - 1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/pidigits.sml000066400000000000000000000102351416264345000214540ustar00rootroot00000000000000structure Stream = struct datatype 'a u = Nil | Cons of 'a * 'a t withtype 'a t = unit -> 'a u fun unfold (f : 'b -> ('a * 'b) option) : 'b -> 'a t = let fun loop b () = case f b of NONE => Nil | SOME (x, b) => Cons (x, loop b) in loop end fun map (f : 'a -> 'b) : 'a t -> 'b t = unfold (fn s => case s () of Nil => NONE | Cons (x, xs) => SOME (f x, xs)) end structure PiDigits = struct fun stream (next : 'b -> 'c) (safe : 'b -> 'c -> bool) (prod : 'b -> 'c -> 'b) (cons : 'b -> 'a -> 'b) : 'b -> 'a Stream.t -> 'c Stream.t = let fun loop z s () = let val y = next z in if safe z y then Stream.Cons (y, loop (prod z y) s) else (case s () of Stream.Nil => Stream.Nil | Stream.Cons (x, xs) => loop (cons z x) xs ()) end in loop end type lft = (IntInf.int * IntInf.int * IntInf.int * IntInf.int) val unit : lft = (1,0,0,1) fun comp (q,r,s,t) (u,v,w,x) : lft = (q*u+r*w, q*v+r*x, s*u+t*w, s*v+t*x) val pi = let val init = unit val lfts = Stream.map (fn k => (k, 4*k+2, 0, 2*k+1)) (Stream.unfold (fn i => SOME (i, i+1)) 1) fun floor_extr (q,r,s,t) x = (q * x + r) div (s * x + t) fun next z = floor_extr z 3 fun safe z n = n = floor_extr z 4 fun prod z n = comp (10, ~10*n, 0, 1) z fun cons z z' = comp z z' in stream next safe prod cons init lfts end end structure MainShootout = struct fun display n = let fun loop (ds, (k, col)) = if k < n then let val col = if col = 10 then (print "\t:"; print (IntInf.toString k); print "\n"; 1) else col + 1 in case ds () of Stream.Nil => raise Empty | Stream.Cons (d, ds) => (print (IntInf.toString d); loop (ds, (k + 1, col))) end else (print (CharVector.tabulate (10 - col, fn _ => #" ")); print "\t:"; print (IntInf.toString k); print "\n"; ()) in loop (PiDigits.pi, (0, 0)) end fun usage name = (TextIO.output (TextIO.stdErr, concat ["usage: ", OS.Path.file name, " \n"]); OS.Process.failure) fun main (name, arguments) = case arguments of [n] => (case IntInf.fromString n of SOME n => if n >= 1 then (display n; OS.Process.success) else usage name | NONE => usage name) | _ => usage name end (* val _ = OS.Process.exit (MainShootout.main (CommandLine.name (), CommandLine.arguments ())) *) structure MainBenchmark = struct fun display n = let fun loop (ds, k, n) = case ds () of Stream.Nil => raise Empty | Stream.Cons (d, ds) => if d = 0 then if n = 0 then (print (IntInf.toString k); print "\n") else loop (ds, k + 1, n - 1) else loop (ds, k + 1, n) in loop (PiDigits.pi, 0, n) end fun usage name = (TextIO.output (TextIO.stdErr, concat ["usage: ", OS.Path.file name, " \n"]); OS.Process.failure) fun main (name, arguments) = case arguments of [n] => (case IntInf.fromString n of SOME n => if n >= 1 then (display n; OS.Process.success) else usage name | NONE => usage name) | _ => usage name val doit = display o IntInf.fromInt end structure Main = MainBenchmark mlton-20210117+dfsg/benchmark/tests/psdes-random.sml000066400000000000000000000036601416264345000222400ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) (* * Random number generator based on page 302 of Numerical Recipes in C. *) fun once () = let fun natFold (start, stop, ac, f) = let fun loop (i, ac) = if i = stop then ac else loop (i + 1, f (i, ac)) in loop (start, ac) end val niter: int = 4 open Word32 fun make (l: word list) = let val a = Array.fromList l in fn i => Array.sub (a, i) end val c1 = make [0wxbaa96887, 0wx1e17d32c, 0wx03bdcd3c, 0wx0f33d1b2] val c2 = make [0wx4b0f3b58, 0wxe874f0c3, 0wx6955c5a6, 0wx55a7ca46] val half: Word.word = 0w16 fun reverse w = orb (>> (w, half), << (w, half)) fun psdes (lword: word, irword: word): word * word = natFold (0, niter, (lword, irword), fn (i, (lword, irword)) => let val ia = xorb (irword, c1 i) val itmpl = andb (ia, 0wxffff) val itmph = >> (ia, half) val ib = itmpl * itmpl + notb (itmph * itmph) in (irword, xorb (lword, itmpl * itmph + xorb (c2 i, reverse ib))) end) val zero: word = 0wx13 val lword: word ref = ref 0w13 val irword: word ref = ref 0w14 val needTo = ref true fun word () = if !needTo then let val (l, i) = psdes (!lword, !irword) val _ = lword := l val _ = irword := i val _ = needTo := false in l end else (needTo := true ; !irword) fun loop (i, w) = if i = 0 then if w = 0wx132B1B67 then () else raise Fail "bug" else loop (Int.- (i, 1), w + word()) in loop (150000000, 0w0) end structure Main = struct fun doit n = if n = 0 then () else (once () ; doit (n - 1)) end val _ = Main.doit 2 mlton-20210117+dfsg/benchmark/tests/ratio-regions.sml000066400000000000000000000734561416264345000224400ustar00rootroot00000000000000(* * Translated from Jeff Siskind's Scheme code by Stephen Weeks * (sweeks@sweeks.com). * Here is the description from Jeff Siskind (qobi@research.nj.nec.com) * * It is an implementation of Ratio * Regions, an image segmentation/contour finding technique due to Ingemar Cox, * Satish Rao, and Yu Zhong. The algorithm is a reduction to max flow, an * unpublished technique that Satish described to me. Peter Blicher originally * implemented this via a translation to Andrew Goldberg's generic max-flow code. * I've reimplemented it, specializing the max-flow algorithm to the particular * graphs that are produced by Satish's reduction instead of using Andrew's code. * The max-flow algorithm is preflow-push with periodic relabeling and a * wave-based heuristic for scheduling pushes and lifts due to Sebastien Roy. *) fun print _ = () local fun doo(max: int, f: int -> unit): unit = let fun loop i = if i >= max then () else (f i; loop(i + 1)) in loop 0 end fun zero x = x = 0 val cons = op :: val make_vector = Array.array val vector_length = Array.length val vector_ref = Array.sub val vector_set = Array.update val map_n_vector = Array.tabulate val string_length = String.size val string_ref = String.sub fun write_char c = () (* TextIO.output1(TextIO.stdOut, c) *) val modulo = Int.mod val quotient = Int.quot fun for_each(l, f) = List.app f l fun negative x = x < 0 fun positive x = x > 0 fun min l = case l of x :: l => let fun loop(l, min) = case l of [] => min | x :: l => loop(l, Int.min(min, x)) in loop(l, x) end | _ => raise Fail "min" fun every_n(n, p) = let fun loop i = i >= n orelse (p i andalso loop(i + 1)) in loop 0 end fun some(l, p) = List.exists p l fun some_n(n, p) = let fun loop i = i < n andalso (p i orelse loop(i + 1)) in loop 0 end fun some_vector(v, p) = let fun loop i = i < vector_length v andalso (p(vector_ref(v, i)) orelse loop(i + 1)) in loop 0 end fun x(x, _) = x fun y(_, y) = y datatype 'a matrix = Matrix of 'a array array fun make_matrix(m: int, n: int, a: 'a): 'a matrix = Matrix(map_n_vector(m, fn i => make_vector(n, a))) fun matrix_rows(Matrix a) = vector_length a fun matrix_columns(Matrix a) = vector_length(vector_ref(a, 0)) fun matrix_ref(Matrix a, i, j) = vector_ref(vector_ref(a, i), j) fun matrix_set(Matrix a, i, j, x) = vector_set(vector_ref(a, i), j, x) datatype pormatValue = Int of int | String of string fun pormat(control_string: string, values: pormatValue list): unit = let fun loop(i: int, values: pormatValue list): unit = if not(i = string_length control_string) then let val c = string_ref(control_string, i) in if c = #"~" then let val c2 = string_ref(control_string, i + 1) in case (c2, values) of (#"s", Int n :: values) => (print(Int.toString n) ; loop(i + 2, values)) | (#"a", String s :: values) => (print s ; loop(i + 2, values)) | (#"%", _) => (print "\n"; loop(i + 2, values)) | _ => (write_char c; loop(i + 1, values)) end else (write_char c ; loop(i + 1, values)) end else () in loop(0, values) end (* The vertices are s, t, and (y,x). * C_RIGHT[y,x] is the capacity from (y,x) to (y,x+1) which is the same as the * capacity from (y,x+1) to (y,x). * C_DOWN[y,x] is the capacity from (y,x) to (y+1,x) which is the same as the * capacity from (y+1,x) to (y,x). * The capacity from s to (y,0), (0,x), (y,Y_1), (0,X_1) is implicitly * infinite. * The capacity from (x,y) to t is V*W[y,x]. * F_RIGHT[y,x] is the preflow from (y,x) to (y,x+1) which is the negation of * the preflow from (y,x+1) to (y,x). * F_DOWN[y,x] is the preflow from (y,x) to (y+1,x) which is the negation of * the preflow from (y+1,x) to (y,x). * We do not record the preflow from s to (y,X_1), (y,0), (Y_1,x), and (0,x) * and from (y,X_1), (y,0), (Y_1,x), and (0,x) to s. * F_T[y,x] is the preflow from (y,x) to t. * We do not record the preflow from t to (y,x). * {C,F}_RIGHT[0:Y_1,0:X_2]. * {C,F}_DOWN[0:Y_2,0:X_1]. * F_T[0:Y_1,0:X_1] * For now, we will keep all capacities (and thus all preflows) as integers. * (CF_RIGHT y x) is the residual capacity from (y,x) to (y,x+1). * (CF_LEFT y x) is the residual capacity from (y,x) to (y,x_1). * (CF_DOWN y x) is the residual capacity from (y,x) to (y+1,x). * (CF_UP y x) is the residual capacity from (y,x) to (y_1,x). * We do not compute the residual capacities from s to (y,X_1), (y,0), * (Y_1,x), and (0,x) because they are all infinite. * We do not compute the residual capacities from (y,X_1), (y,0), (Y_1,x), * and (0,x) to s because they will never be used. * (CF_T y x) is the residual capacity from (y,x) to t. * We do not compute the residual capacity from t to (y,x) because it will * be used. * (EF_RIGHT? y x) is true if there is an edge from (y,x) to (y,x+1) in the * residual network. * (EF_LEFT? y x) is true if there is an edge from (y,x) to (y,x_1) in the * residual network. * (EF_DOWN? y x) is true if there is an edge from (y,x) to (y+1,x) in the * residual network. * (EF_UP? y x) is true if there is an edge from (y,x) to (y_1,x) in the * residual network. * (EF_T? y x) is true if there is an edge from (y,x) to t in the * residual network. * There are always edges in the residual network from s to (y,X_1), (y,0), * (Y_1,x), and (0,x). * We don't care whether there are edges in the residual network from * (y,X_1), (y,0), (Y_1,x), and (0,x) to s because they will never be used. * We don't care whether there are edges in the residual network from t to * (y,x) because they will never be used. *) fun positive_min(x, y) = if negative x then y else Int.min(x, y) fun positive_minus(x, y) = if negative x then x else x - y fun positive_plus(x, y) = if negative x then x else x + y fun rao_ratio_region(c_right, c_down, w, lg_max_v) = let val height = matrix_rows w val width = matrix_columns w val f_right = make_matrix(height, width - 1, 0) val f_down = make_matrix(height - 1, width, 0) val f_t = make_matrix(height, width, 0) val h = make_matrix(height, width, 0) val e = make_matrix(height, width, 0) val marked = make_matrix(height, width, false) val m1 = height * width + 2 val m2 = 2 * height * width + 2 val q = make_vector(2 * height * width + 3, []) fun cf_right(y, x) = matrix_ref(c_right, y, x) - matrix_ref(f_right, y, x) fun cf_left(y, x) = matrix_ref(c_right, y, x - 1) + matrix_ref(f_right, y, x - 1) fun cf_down(y, x) = matrix_ref(c_down, y, x) - matrix_ref(f_down, y, x) fun cf_up(y, x) = matrix_ref(c_down, y - 1, x) + matrix_ref(f_down, y - 1, x) fun ef_right(y, x) = positive(cf_right(y, x)) fun ef_left(y, x) = positive(cf_left(y, x)) fun ef_down(y, x) = positive(cf_down(y, x)) fun ef_up(y, x) = positive(cf_up(y, x)) fun preflow_push v = let fun enqueue(y, x) = if not(matrix_ref(marked, y, x)) then (vector_set(q, matrix_ref(h, y, x), (cons((x, y), vector_ref(q, matrix_ref(h, y, x))))) ; matrix_set(marked, y, x, true)) else () fun cf_t(y, x) = v * matrix_ref(w, y, x) - matrix_ref(f_t, y, x) fun ef_t(y, x) = positive(cf_t(y, x)) fun can_push_right(y, x) = x < width - 1 andalso not(zero(matrix_ref(e, y, x))) andalso ef_right(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y, x + 1) + 1 fun can_push_left(y, x) = x > 0 andalso not(zero(matrix_ref(e, y, x))) andalso ef_left(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y, x - 1) + 1 fun can_push_down(y, x) = y < height - 1 andalso not(zero(matrix_ref(e, y, x))) andalso ef_down(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y + 1, x) + 1 fun can_push_up(y, x) = y > 0 andalso not(zero(matrix_ref(e, y, x))) andalso ef_up(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y - 1, x) + 1 fun can_push_t(y, x) = not(zero(matrix_ref(e, y, x))) andalso ef_t(y, x) andalso matrix_ref(h, y, x) = 1 fun can_lift(y, x) = not(zero(matrix_ref(e, y, x))) andalso (if x = width - 1 then matrix_ref(h, y, x) <= m1 else (not(ef_right(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y, x + 1))) andalso (if x = 0 then matrix_ref(h, y, x) <= m1 else (not(ef_left(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y, x - 1))) andalso (if y = height - 1 then matrix_ref(h, y, x) <= m1 else (not(ef_down(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y + 1, x))) andalso (if y = 0 then matrix_ref(h, y, x) <= m1 else (not(ef_up(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y - 1, x))) andalso (not(ef_t(y, x)) orelse matrix_ref(h, y, x) = 0) fun push_right(y, x) = (* (pormat "Push right ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_right(y, x)) in matrix_set(f_right, y, x, matrix_ref(f_right, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y, x + 1, positive_plus(matrix_ref(e, y, x + 1), df_u_v)) ; enqueue(y, x + 1) end fun push_left(y, x) = (* (pormat "Push left ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_left(y, x)) in matrix_set(f_right, y, x - 1, matrix_ref(f_right, y, x - 1) - df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y, x - 1, positive_plus(matrix_ref(e, y, x - 1), df_u_v)) ; enqueue(y, x - 1) end fun push_down(y, x) = (* (pormat "Push down ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_down(y, x)) in matrix_set(f_down, y, x, matrix_ref(f_down, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y + 1, x, positive_plus(matrix_ref(e, y + 1, x), df_u_v)) ; enqueue(y + 1, x) end fun push_up(y, x) = (* ;;(pormat "Push up ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_up(y, x)) in matrix_set(f_down, y - 1, x, matrix_ref(f_down, y - 1, x) - df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y - 1, x, positive_plus(matrix_ref(e, y - 1, x), df_u_v)) ; enqueue(y - 1, x) end fun push_t(y, x) = (* ;;(pormat "Push t ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_t(y, x)) in matrix_set(f_t, y, x, matrix_ref(f_t, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) end fun lift(y, x) = (* ;;(pormat "Lift ~s ~s~%" y x) *) matrix_set (h, y, x, 1 + min[if x = width - 1 then m1 else if ef_right(y, x) then matrix_ref(h, y, x + 1) else m2, if x = 0 then m1 else if ef_left(y, x) then matrix_ref(h, y, x - 1) else m2, if y = height - 1 then m1 else if ef_down(y, x) then matrix_ref(h, y + 1, x) else m2, if y = 0 then m1 else if ef_up(y, x) then matrix_ref(h, y - 1, x) else m2, if ef_t(y, x) then 0 else m2]) fun relabel() = (* ;;(pormat "Relabel~%") *) let datatype 'a queue = Nil | Cons of 'a * 'a queue ref fun null(q: 'q queue ref) = case !q of Nil => true | _ => false val q: (int * int) queue ref = ref Nil val tail: (int * int) queue ref = ref Nil fun enqueue(y, x, value) = if value < matrix_ref(h, y, x) then (matrix_set(h, y, x, value) ; if not(matrix_ref(marked, y, x)) then (matrix_set(marked, y, x, true) ; (case !tail of Nil => (tail := Cons((x, y), ref Nil) ; q := !tail) | Cons(_, cdr) => (cdr := Cons((x, y), ref Nil) ; tail := !cdr))) else ()) else () fun dequeue() = case !q of Nil => raise Fail "dequeue" | Cons(p, rest) => (matrix_set(marked, y p, x p, false) ; q := !rest ; if null q then tail := Nil else () ; p) in doo(height, fn y => doo(width, fn x => (matrix_set(h, y, x, m1) ; matrix_set(marked, y, x, false)))) ; doo(height, fn y => doo(width, fn x => if ef_t(y, x) andalso matrix_ref(h, y, x) > 1 then enqueue(y, x, 1) else ())) ; let fun loop() = if not(null q) then (let val p = dequeue() val x = x p val y = y p val value = matrix_ref(h, y, x) + 1 in if x > 0 andalso ef_right(y, x - 1) then enqueue(y, x - 1, value) else () ; if x < width - 1 andalso ef_left(y, x + 1) then enqueue(y, x + 1, value) else () ; if y > 0 andalso ef_down(y - 1, x) then enqueue(y - 1, x, value) else () ; if y < height - 1 andalso ef_up(y + 1, x) then enqueue(y + 1, x, value) else () end ; loop()) else () in loop() end end (* relabel *) in doo(height, fn y => doo(width, fn x => (matrix_set(e, y, x, 0) ; matrix_set(f_t, y, x, 0)))) ; doo(height, fn y => doo(width - 1, fn x => matrix_set(f_right, y, x, 0))) ; doo(height - 1, fn y => doo(width, fn x => matrix_set(f_down, y, x, 0))) ; doo(height, fn y => (matrix_set(e, y, width - 1, ~1) ; matrix_set(e, y, 0, ~1))) ; doo(width - 1, fn x => (matrix_set(e, height - 1, x, ~1) ; matrix_set(e, 0, x, ~1))) ; let val pushes = ref 0 val lifts = ref 0 val relabels = ref 0 fun loop(i, p) = if zero(modulo(i, 6)) andalso not p then (relabel() ; relabels := !relabels + 1 ; if every_n(height, fn y => every_n(width, fn x => zero(matrix_ref(e, y, x)) orelse matrix_ref(h, y, x) = m1)) then (* Every vertex with excess capacity is not reachable from the sink in * the inverse residual network. So terminate early because we have * already found a min cut. In this case, the preflows and excess * capacities will not be correct. But the cut is indicated by the * heights. Vertices reachable from the source have height * HEIGHT * WIDTH + 2 while vertices reachable from the sink have * smaller height. Early termination is necessary with relabeling to * prevent an infinite loop. The loop arises because vertices that are * not reachable from the sink in the inverse residual network have * their height reset to HEIGHT * WIDTH + 2 by the relabeling * process. If there are such vertices with excess capacity, this is * not high enough for the excess capacity to be pushed back to the * perimeter. So after relabeling, vertices get lifted to try to push * excess capacity back to the perimeter but then a relabeling happens * to soon and foils this lifting. Terminating when all vertices with * excess capacity are not reachable from the sink in the inverse * residual network eliminates this problem. *) (pormat ("~s push~a, ~s lift~a, ~s relabel~a, ~s wave~a, terminated early~%", [Int(! pushes), String(if !pushes = 1 then "" else "es"), Int(! lifts), String(if !lifts = 1 then "" else "s"), Int(! relabels), String(if !relabels = 1 then "" else "s"), Int i, String(if i = 1 then "" else "s")])) else (* We need to rebuild the priority queue after relabeling since the * heights might have changed and the priority queue is indexed by * height. This also assumes that a relabel is done before any pushes * or lifts. *) (doo(vector_length q, fn k => vector_set(q, k, [])) ; doo(height, fn y => doo(width, fn x => matrix_set(marked, y, x, false))) ; doo(height, fn y => doo(width, fn x => if not(zero(matrix_ref(e, y, x))) then enqueue(y, x) else ())) ; loop(i, true))) else if some_vector(q, fn ps => some(ps, fn p => let val x = x p val y = y p in can_push_right(y, x) orelse can_push_left(y, x) orelse can_push_down(y, x) orelse can_push_up(y, x) orelse can_push_t(y, x) orelse can_lift(y, x) end)) then ( let fun loop k = if not(negative k) then ( let val ps = vector_ref(q, k) in vector_set(q, k, []) ; (for_each (ps, fn p => matrix_set(marked, y p, x p, false))) ; (for_each (ps, fn p => let val x = x p val y = y p in if can_push_right(y, x) then (pushes := !pushes + 1 ; push_right(y, x)) else () ; if can_push_left(y, x) then (pushes := !pushes + 1 ; push_left(y, x)) else () ; if can_push_down(y, x) then (pushes := !pushes + 1 ; push_down(y, x)) else () ; if can_push_up(y, x) then (pushes := !pushes + 1 ; push_up(y, x)) else () ; if can_push_t(y, x) then (pushes := !pushes + 1 ; push_t(y, x)) else () ; if can_lift(y, x) then (lifts := !lifts + 1 ; lift(y, x)) else () ; if not(zero(matrix_ref(e, y, x))) then enqueue(y, x) else () end)) end ; loop(k - 1)) else () in loop(vector_length q - 1) end ; loop(i + 1, false)) else (* This is so MIN_CUT and MIN_CUT_INCLUDES_EVERY_EDGE_TO_T work. *) (relabel() ; relabels := !relabels + 1 ; (pormat("~s push~a, ~s lift~a, ~s relabel~a, ~s wave~a~%", [Int(! pushes), String(if !pushes = 1 then "" else "es"), Int(! lifts), String(if !lifts = 1 then "" else "s"), Int(! relabels), String(if !relabels = 1 then "" else "s"), Int i, String(if i = 1 then "" else "s")]))) in loop(0, false) end end fun min_cut_includes_every_edge_to_t() = (* This requires that a relabel was done immediately before returning from * PREFLOW_PUSH. *) every_n(height, fn y => every_n(width, fn x => matrix_ref(h, y, x) = m1)) fun min_cut() = (* This requires that a relabel was done immediately before returning from * PREFLOW_PUSH *) map_n_vector (height, fn y => map_n_vector(width, fn x => not(matrix_ref(h, y, x) = m1))) fun loop(lg_v, v_max) = if negative lg_v then (pormat("V-MAX=~s~%",[Int v_max]) ; preflow_push(v_max + 1) ; min_cut()) else let val v = v_max + let fun loop(i, c) = if (zero i) then c else loop(i - 1, c + c) in loop(lg_v, 1) end in pormat("LG-V=~s, V-MAX=~s, V=~s~%", [Int lg_v, Int v_max, Int v]) ; preflow_push v ; loop(lg_v - 1, if min_cut_includes_every_edge_to_t() then v else v_max) end in loop(lg_max_v, 0) end in fun doit n = let val height = n val width = n val lg_max_v = 15 val c_right = make_matrix(height, width - 1, ~1) val c_down = make_matrix(height - 1, width, ~1) in doo(height, fn y => doo(width - 1, fn x => matrix_set (c_right, y, x, if (y >= quotient(height, 4) andalso y < quotient(3 * height, 4) andalso (x = quotient(width, 4) - 1 orelse x = quotient(3 * width, 4) - 1)) then 1 else 128))) ; doo(height - 1, fn y => doo(width, fn x => matrix_set (c_down, y, x, if (x >= quotient(width, 4) andalso x < quotient(3 * width, 4) andalso (y = quotient(height, 4) - 1 orelse y = quotient(3 * height, 4) - 1)) then 1 else 128))) ; rao_ratio_region(c_right, c_down, make_matrix(height, width, 1), lg_max_v) end end structure Main = struct val doit = doit end mlton-20210117+dfsg/benchmark/tests/ray.sml000066400000000000000000000343711416264345000204420ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* objects.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * Type declarations for the various objects in the ray tracer. *) structure Objects = struct datatype point = PT of {x : real, y : real, z : real} datatype vector = VEC of {l : real, m : real, n : real} datatype ray = Ray of {s : point, d : vector} datatype camera = Camera of { vp : point, ul : point, ur : point, ll : point, lr : point } datatype color = Color of {red : real, grn : real, blu : real} datatype sphere = Sphere of {c : point, r : real, color : color} datatype hit = Miss | Hit of {t : real, s : sphere} datatype visible = Visible of {h : point, s : sphere} datatype object = TOP | NUMBER of real | NAME of string | LIST of object list | OPERATOR of object list -> object list | MARK | LITERAL of string | UNMARK | POINT of point | VECTOR of vector | RAY of ray | CAMERA of camera | COLOR of color | SPHERE of sphere | HIT | VISIBLE end (* Objects *) (* interp.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories *) structure Interp = struct local val exit = OS.Process.exit fun ordof(s, i) = Char.ord(String.sub(s, i)) exception NotAChar exception NotAReal fun fromStr x = (case Char.fromString x of SOME c => c | NONE => raise NotAChar) fun strToReal s = (case Real.fromString s of SOME r => r | _ => raise NotAReal) fun intToReal x = (strToReal ((Int.toString x) ^ ".0")) val explode = (fn x => map Char.toString (explode x)) val implode = (fn x => implode (map fromStr x)) open Objects val dict = ref ([] : {key : string, value : object} list) fun dictInsert (NAME key, value) = let fun find [] = [{key=key, value=value}] | find (x::r) = if (key = #key x) then {key=key, value=value}::r else x :: (find r) in dict := find(!dict) end | dictInsert _ = raise Fail "dictInsert" fun prObj outStrm obj = let fun printf args = TextIO.output(outStrm, implode args) fun pr (NUMBER n) = printf[" ", Real.toString n, "\n"] | pr (NAME s) = printf[" ", s, "\n"] | pr (LITERAL s) = printf[" ", s, "\n"] | pr (LIST l) = app pr l | pr MARK = printf[" MARK\n"] | pr (OPERATOR _) = printf[" \n"] | pr TOP = printf[" TOP OF STACK\n"] | pr _ = printf[" \n"] in pr obj end in exception Stop fun error opName stk = let fun prStk ([], _) = () | prStk (_, 0) = () | prStk (obj::r, i) = (prObj TextIO.stdErr obj; prStk(r, i-1)) in TextIO.output(TextIO.stdErr, "ERROR: "^opName^"\n"); prStk (stk, 10); raise (Fail opName) end fun installOperator (name, rator) = dictInsert (NAME name, OPERATOR rator) fun ps_def (v::k::r) = (dictInsert(k, v); r) | ps_def stk = error "ps_def" stk local fun binOp (f, opName) = let fun g ((NUMBER arg1)::(NUMBER arg2)::r) = NUMBER(f(arg2, arg1)) :: r | g stk = error opName stk in g end in val ps_add = binOp (op +, "add") val ps_sub = binOp (op -, "sub") val ps_mul = binOp (op *, "mul") val ps_div = binOp (op /, "div") end fun ps_rand stk = (NUMBER 0.5)::stk (** ??? **) fun ps_print (obj::r) = (prObj TextIO.stdOut obj; r) | ps_print stk = error "print" stk fun ps_dup (obj::r) = (obj::obj::r) | ps_dup stk = error "dup" stk fun ps_stop _ = raise Stop (* initialize dictionary and begin parsing input *) fun parse inStrm = let fun getc () = case TextIO.input1 inStrm of NONE => "" | SOME c => Char.toString c fun peek () = case TextIO.lookahead inStrm of SOME x => Char.toString x | _ => "" (* parse one token from inStrm *) fun toke deferred = let fun doChar "" = exit OS.Process.success | doChar "%" = let fun lp "\n" = doChar(getc()) | lp "" = exit OS.Process.success | lp _ = lp(getc()) in lp(getc()) end | doChar "{" = (MARK, deferred+1) | doChar "}" = (UNMARK, deferred-1) | doChar c = if Char.isSpace (fromStr c) then doChar(getc()) else let fun lp buf = (case peek() of "{" => buf | "}" => buf | "%" => buf | c => if Char.isSpace(fromStr c) then buf else (getc(); lp(c::buf)) (* end case *)) val tok = implode (rev (lp [c])) val hd = ordof(tok, 0) in if (hd = ord (#"/")) then (LITERAL(substring(tok, 1, size tok - 1)), deferred) else if ((Char.isDigit (chr hd)) orelse (hd = ord (#"-"))) then (NUMBER(strToReal(tok)), deferred) else (NAME tok, deferred) end in doChar(getc()) end (* execute a token (if not deferred) *) fun exec (UNMARK, stk, _) = let fun lp ([], _) = raise Fail "MARK" | lp (MARK::r, l) = (LIST l)::r | lp (x::r, l) = lp (r, x::l) in lp (stk, []) end | exec (OPERATOR f, stk, 0) = f stk | exec (LIST l, stk, 0) = let fun execBody ([], stk) = stk | execBody (obj::r, stk) = (exec(obj, stk, 0); execBody(r, stk)) in execBody (l, stk) end | exec (NAME s, stk, 0) = let fun find [] = raise Fail "undefined name" | find ({key, value}::r) = if (key = s) then value else find r in exec (find (!dict), stk, 0) end | exec (obj, stk, _) = obj::stk fun lp (stk, level) = let val (obj, level) = toke level val stk = exec (obj, stk, level) in lp (stk, level) end in installOperator ("add", ps_add); installOperator ("def", ps_def); installOperator ("div", ps_div); installOperator ("dup", ps_dup); installOperator ("mul", ps_mul); installOperator ("print", ps_print); installOperator ("rand", ps_rand); installOperator ("stop", ps_stop); installOperator ("sub", ps_sub); (lp ([], 0)) handle Stop => () end (* parse *) end (* local *) end (* Interp *) (* ray.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories *) structure Ray = struct local open Objects in (** basic operations on points and vectors **) fun scaleVector (s, VEC{l, m, n}) = VEC{l=s*l, m=s*m, n=s*n} fun vecPlusVec (VEC{l, m, n}, VEC{l=l', m=m', n=n'}) = VEC{l=l+l', m=m+m', n=n+n'} fun vecPlusPt (VEC{l, m, n}, PT{x, y, z}) = PT{x=x+l, y=y+m, z=z+n} fun ptMinusPt (PT{x, y, z}, PT{x=x', y=y', z=z'}) = VEC{l=x-x', m=y-y', n=z-z'} fun wave (PT{x, y, z}, PT{x=x', y=y', z=z'}, w) = PT{ x = w * (x' - x) + x, y = w * (y' - y) + y, z = w * (z' - z) + z } fun dotProd (VEC{l, m, n}, VEC{l=l', m=m', n=n'}) = ((l*l') + (m*m') + (n*n')) (* normal vector to sphere *) fun normalSphere (Visible{h, s as Sphere{c, ...}}) = let val n = ptMinusPt(h, c) val norm = Math.sqrt(dotProd(n, n)) in scaleVector(1.0 / norm, n) end (* intersect a ray with a sphere *) fun intersectSphere (Ray ray, s as Sphere sphere) = let val a = dotProd(#d ray, #d ray) val sdiffc = ptMinusPt(#s ray, #c sphere) val b = 2.0 * dotProd(sdiffc, #d ray) val c = dotProd(sdiffc, sdiffc) - (#r sphere * #r sphere) val d = b*b - 4.0*a*c in if (d <= 0.0) then Miss else let val d = Math.sqrt(d) val t1 = (~b - d) / (2.0 * a) val t2 = (~b + d) / (2.0 * a) val t = if ((t1 > 0.0) andalso (t1 < t2)) then t1 else t2 in Hit{t=t, s=s} end end (* simple shading function *) fun shade {light, phi} (visible as Visible{h, s}) = let val l = ptMinusPt(light, h) val n = normalSphere(visible) val irradiance = phi * dotProd(l,n) / dotProd(l,l); val irradiance = (if (irradiance < 0.0) then 0.0 else irradiance) + 0.05 val Sphere{color=Color{red, grn, blu}, ...} = s in Color{red=red*irradiance, grn=grn*irradiance, blu=blu*irradiance} end fun trace (ray as (Ray ray'), objList) = let fun closest (Miss, x) = x | closest (x, Miss) = x | closest (h1 as Hit{t=t1, ...}, h2 as Hit{t=t2, ...}) = if (t2 < t1) then h2 else h1 fun lp ([], Hit{t, s}) = Visible{ h = vecPlusPt(scaleVector(t, #d ray'), #s ray'), s = s } | lp (s :: r, closestHit) = lp (r, closest (closestHit, intersectSphere (ray, s))) | lp _ = raise Fail "trace" in lp (objList, Miss) end fun camera (Camera cam) (x, y) = let val l = wave (#ul cam, #ll cam, y) val r = wave (#ur cam, #lr cam, y) val image_point = wave(l, r, x) in Ray{d = ptMinusPt(image_point, #vp cam), s = #vp cam} end val shade = shade {light = PT{x = 10.0, y = ~10.0, z = ~10.0}, phi = 16.0} val camera = camera (Camera{ vp = PT{x = 0.0, y = 0.0, z = ~3.0}, ul = PT{x = ~1.0, y = ~1.0, z = 0.0}, ur = PT{x = 1.0, y = ~1.0, z = 0.0}, ll = PT{x = ~1.0, y = 1.0, z = 0.0}, lr = PT{x = 1.0, y = 1.0, z = 0.0} }) fun image objList (x, y) = shade (trace(camera(x, y), objList)) fun picture (picName, objList) = let val outStrm = TextIO.openOut picName val image = image objList val print = fn x => TextIO.output (outStrm, x) fun putc c = TextIO.output1(outStrm, chr c) fun doPixel (i, j) = let val x = (real i) / 512.0 val y = (real j) / 512.0 val (Color c) = image (x, y) fun cvt x = if (x >= 1.0) then 255 else floor(256.0*x) in putc (cvt (#red c)); putc (cvt (#grn c)); putc (cvt (#blu c)) end fun lp_j j = if (j < 512) then let fun lp_i i = if (i < 512) then (doPixel(i, j); lp_i(i+1)) else () in lp_i 0; lp_j(j+1) end else () in print "TYPE=dump\n"; print "WINDOW=0 0 512 512\n"; print "NCHAN=3\n"; print "CHAN=rgb\n"; print "\n"; lp_j 0; TextIO.closeOut outStrm end end (* local *) end; (* Ray *) (* interface.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * The interface between the interpreter and the ray tracer. *) structure Interface = struct local open Objects in (* color pops three numbers and pushes a color object. * usage: red-value green-value blue-value color *) fun ps_color ((NUMBER blu)::(NUMBER grn)::(NUMBER red)::r) = (COLOR(Color{red=red, grn=grn, blu=blu})) :: r | ps_color stk = Interp.error "color" stk (* pop radius, coordinates of center, and a color and push a sphere * usage: radius x y z color-value sphere *) fun ps_sphere ( (COLOR c)::(NUMBER z)::(NUMBER y)::(NUMBER x)::(NUMBER rad)::r ) = SPHERE(Sphere{c=PT{x=x, y=y, z=z}, r=rad, color=c}) :: r | ps_sphere stk = Interp.error "sphere" stk (* build an object list from solids on the stack, then invoke raytracer *) fun ps_raytrace ((LITERAL picName)::r) = let fun mkObjList ([], l) = l | mkObjList ((SPHERE s)::r, l) = mkObjList(r, s::l) | mkObjList (_::r, l) = mkObjList(r, l) in Ray.picture(picName, mkObjList(r, [])); [] end | ps_raytrace stk = Interp.error "raytrace" stk (* add ray tracing operations to interpreter dictionary *) fun rtInit () = ( Interp.installOperator("color", ps_color); Interp.installOperator("sphere", ps_sphere); Interp.installOperator("raytrace", ps_raytrace)) end (* local *) end; signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * Main structure for running raytracer as benchmark. *) structure Main : BMARK = struct fun doit n = let fun loop n = if n = 0 then () else let val strm = TextIO.openIn "DATA/ray" val _ = Interface.rtInit() val _ = Interp.parse strm val _ = TextIO.closeIn strm in loop (n - 1) end in loop n end fun testit _ = () end mlton-20210117+dfsg/benchmark/tests/raytrace.sml000066400000000000000000002262111416264345000214550ustar00rootroot00000000000000(* * Translated by Stephen Weeks (sweeks@sweeks.com) 2000-10-11 from the * PLClub OCaml winning entry to the 2000 ICFP programming contest. *) (* raytrace.sml *) signature CAML = sig type float = real type int = int end structure Caml = struct type int = int type float = real val op div = Int.div exception Not_found exception Failure of string fun failwith s = raise(Failure s) structure Char = struct open Char val code = ord val chr = chr val unsafe_chr = chr val lowercase = toLower val uppercase = toUpper end local open TextIO in type out_channel = outstream val open_out = openOut val open_out_bin = open_out fun output_string (out, s) = output(out, s) val close_out = closeOut end type float = real structure Array = struct local open Array in val array = array val copy = copy val of_list = fromList val length = length val sub = sub val update = update val unsafe_get = Array.sub val unsafe_set = Array.update val make = array fun map f a = Array.tabulate(length a, fn i => f(Array.sub(a, i))) val init = tabulate end end fun for(a: int, b, f) = let fun loop a = if a > b then () else (f a; loop(a + 1)) in loop a end fun forDown(b: int, a, f) = let fun loop b = if b < a then () else (f b; loop(b - 1)) in loop b end local open Real open Math in val abs_float = abs val acos = acos val asin = asin val cos = cos val float = fromInt val float_of_int = float val sin = sin val sqrt = sqrt val tan = tan val truncate = trunc val ** = Math.pow infix 8 ** end (* A hack for hash tables with string domain where performance doesn't matter. *) structure Hashtbl: sig type ('a, 'b) t val add: ('a, 'b) t -> string -> 'b -> unit val create: int -> ('a, 'b) t val find: ('a, 'b) t -> string -> 'b end = struct datatype ('a, 'b) t = T of (string * 'b) list ref fun create _ = T (ref []) fun add (T t) k d = t := (k, d) :: !t fun find (T (ref t)) k = case List.find (fn (k', _) => k = k') t of NONE => raise Not_found | SOME(_, d) => d end structure List = struct local open List in val iter = app val map = map val filter = filter val nth = nth val rev = rev end end fun exit i = Posix.Process.exit(Word8.fromInt i) end structure Math = struct open Caml val epsilon = 1E~5 val dtr = acos (~1.0) / 180.0 val rtd = 180.0 / acos (~1.0) fun dcos t = cos (t * dtr) fun dsin t = sin (t * dtr) fun dtan t = tan (t * dtr) fun dacos x = rtd * acos x val infinity = Real.posInf val minus_infinity = Real.negInf fun max_float (x, y : float) = if x >= y then x else y end signature MATRIX = sig include CAML (**** Matrix arithmetic ****) type t = float array (* 4-dimension matrix *) type v = float * float * float * float (* 4-dimension vector *) (* Basic matrices *) val identity : t val translate : (*x:*)float * (*y:*)float * (*z:*)float -> t val scale : (*x:*)float * (*y:*)float * (*z:*)float -> t val uscale : float -> t val unscale : (*x:*)float * (*y:*)float * (*z:*)float -> t val unuscale : float -> t val rotatex : float -> t val rotatey : float -> t val rotatez : float -> t (* Operations on matrices *) val mul : t * t -> t val vmul : t * v -> v val transpose : t -> t val add_scaled : v * float * v -> v val add : v * v -> v val sub : v * v -> v val prod : v * v -> float val square : v -> float val normalize : v -> v val neg : v -> v end structure Matrix: MATRIX = struct open Caml open Math type t = float array type v = float * float * float * float (**** Basic matrices ****) val identity = Array.of_list[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0] fun translate(x, y, z) = Array.of_list[1.0, 0.0, 0.0, ~ x, 0.0, 1.0, 0.0, ~ y, 0.0, 0.0, 1.0, ~ z, 0.0, 0.0, 0.0, 1.0] fun unscale(x, y, z) = Array.of_list[ x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0] fun scale(x, y, z) = unscale (1.0 / x, 1.0 / y, 1.0 / z) fun unuscale s = unscale (s, s, s) fun uscale s = scale (s, s, s) fun rotatex t = let val co = dcos t val si = dsin t in Array.of_list[ 1.0, 0.0, 0.0, 0.0, 0.0, co, si, 0.0, 0.0, ~ si, co, 0.0, 0.0, 0.0, 0.0, 1.0 ] end fun rotatey t = let val co = dcos t val si = dsin t in Array.of_list[ co, 0.0, ~ si, 0.0, 0.0, 1.0, 0.0, 0.0, si, 0.0, co, 0.0, 0.0, 0.0, 0.0, 1.0 ] end fun rotatez t = let val co = dcos t val si = dsin t in Array.of_list[ co, si, 0.0, 0.0, ~ si, co, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] end (*** Operations on matrices ***) fun get (m : t, i, j) = Array.unsafe_get (m, i * 4 + j) fun set (m : t, i, j, v) = Array.unsafe_set (m, i * 4 + j, v) fun mul (m, m') = let val m'' = Array.make (16, 0.0) in for(0, 3, fn i => for(0, 3, fn j => let fun lp (4, s) = s | lp (k, s) = lp (k+1, s + get(m, i, k) * get(m', k, j)) in set(m'', i, j, lp(0, 0.0)) end)) ; m'' end fun transpose m = let val m' = Array.make (16, 0.0) in for(0, 3, fn i => for(0, 3, fn j => set (m', i, j, get (m, j, i)))) ; m' end fun vmul (m, (x, y, z, t)) = (x * get(m, 0, 0) + y * get(m, 0, 1) + z * get(m, 0, 2) + t * get(m, 0, 3), x * get(m, 1, 0) + y * get(m, 1, 1) + z * get(m, 1, 2) + t * get(m, 1, 3), x * get(m, 2, 0) + y * get(m, 2, 1) + z * get(m, 2, 2) + t * get(m, 2, 3), x * get(m, 3, 0) + y * get(m, 3, 1) + z * get(m, 3, 2) + t * get(m, 3, 3)) fun add_scaled (x: v, t, v: v) : v = ( #1 x + t * #1 v, #2 x + t * #2 v, #3 x + t * #3 v, #4 x + t * #4 v ) fun add (x: v, y: v) : v = ( #1 x + #1 y, #2 x + #2 y, #3 x + #3 y, #4 x + #4 y ) fun sub (x: v, y: v) : v = (#1 x - #1 y, #2 x - #2 y, #3 x - #3 y, #4 x - #4 y) fun prod (x: v, y: v) : real = #1 x * #1 y + #2 x * #2 y + #3 x * #3 y + #4 x * #4 y fun square (vx, vy, vz, vt) : real = vx * vx + vy * vy + vz * vz + vt * vt fun normalize (x: v): v = let val nx = sqrt (prod (x, x)) in (#1 x / nx, #2 x / nx, #3 x / nx, #4 x / nx) end fun neg (x: v) : v = (~(#1 x), ~(#2 x), ~(#3 x), ~(#4 x)) end signature LEX_TOKEN_STRUCTS = sig end signature LEX_TOKEN = sig include LEX_TOKEN_STRUCTS datatype t = Binder of string | Bool of bool | Eof | Identifier of string | Int of int | Lbrace | Lbracket | Rbrace | Rbracket | Real of real | String of string end functor LexToken(S: LEX_TOKEN_STRUCTS): LEX_TOKEN = struct open S datatype t = Binder of string | Bool of bool | Eof | Identifier of string | Int of int | Lbrace | Lbracket | Rbrace | Rbracket | Real of real | String of string end type int = Int.int functor Lex(structure Token: LEX_TOKEN)= struct structure UserDeclarations = struct val chars: char list ref = ref [] type lexarg = unit type lexresult = Token.t val eof: lexarg -> lexresult = fn () => Token.Eof fun fail s = raise Fail s end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s = [ (0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (1, "\000\000\000\000\000\000\000\000\000\026\026\026\000\026\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\026\000\025\000\000\024\000\000\000\000\000\000\000\023\000\021\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\011\000\010\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\008\000\007\000\000\ \\000" ), (3, "\000\000\000\000\000\000\000\000\000\027\029\029\000\028\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\000\ \\000" ), (5, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\030\030\031\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\000\ \\000" ), (9, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\ \\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\009\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\ \\000" ), (12, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\013\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\013\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (13, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (14, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (16, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (17, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (18, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\ \\019\019\019\019\019\019\019\019\019\019\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (19, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\019\019\019\019\019\019\019\019\019\019\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (21, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000" ), (22, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\ \\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\022\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000" ), (23, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (28, "\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (0, "")] fun f x = x val s = map f (rev (tl (rev s))) exception LexHackingError fun look ((j,x)::r, i) = if i = j then x else look(r, i) | look ([], i) = raise LexHackingError fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} in Vector.fromList(map g [{fin = [], trans = 0}, {fin = [], trans = 1}, {fin = [], trans = 1}, {fin = [], trans = 3}, {fin = [], trans = 3}, {fin = [], trans = 5}, {fin = [], trans = 5}, {fin = [(N 13)], trans = 0}, {fin = [(N 11)], trans = 0}, {fin = [(N 49)], trans = 9}, {fin = [(N 9)], trans = 0}, {fin = [(N 7)], trans = 0}, {fin = [(N 39)], trans = 12}, {fin = [], trans = 13}, {fin = [(N 35)], trans = 14}, {fin = [], trans = 14}, {fin = [], trans = 16}, {fin = [(N 35)], trans = 17}, {fin = [], trans = 18}, {fin = [(N 35)], trans = 19}, {fin = [], trans = 19}, {fin = [], trans = 21}, {fin = [(N 20)], trans = 22}, {fin = [], trans = 23}, {fin = [(N 43)], trans = 0}, {fin = [(N 41)], trans = 0}, {fin = [(N 5)], trans = 0}, {fin = [(N 58)], trans = 0}, {fin = [(N 55)], trans = 28}, {fin = [(N 55)], trans = 0}, {fin = [(N 62)], trans = 0}, {fin = [(N 60),(N 62)], trans = 0}]) end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val C = STARTSTATE 3; val INITIAL = STARTSTATE 1; val S = STARTSTATE 5; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end type int = Int.int fun makeLexer (yyinput: int -> string) = let val yygone0:int=1 val yyb = ref "\n" (* buffer *) val yybl: int ref = ref 1 (*buffer length *) val yybufpos: int ref = ref 1 (* location of next character to use *) val yygone: int ref = ref yygone0 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin: int ref = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex (yyarg as (())) = let fun continue() : Internal.result = let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0: int) = let fun action (i: int,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let fun yymktext() = String.substring(!yyb,i0,i-i0) val yypos: int = i0+ !yygone fun REJECT() = action(i,acts::l) open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 11 => (Token.Lbrace) | 13 => (Token.Rbrace) | 20 => let val yytext=yymktext() in Token.Binder(String.extract(yytext, 1, NONE)) end | 35 => let val yytext=yymktext() in Token.Real(case Real.fromString yytext of NONE => fail(concat["bad real constant ", yytext]) | SOME r => r) end | 39 => let val yytext=yymktext() in Token.Int(case Int.fromString yytext of NONE => fail(concat["bad int constant ", yytext]) | SOME i => i) end | 41 => (chars := []; YYBEGIN S; continue()) | 43 => (YYBEGIN C; continue()) | 49 => let val yytext=yymktext() in Token.Identifier yytext end | 5 => (continue()) | 55 => (YYBEGIN INITIAL; continue()) | 58 => (continue()) | 60 => (let val s = (implode(rev(!chars)) before chars := nil) in YYBEGIN INITIAL ; Token.String s end) | 62 => let val yytext=yymktext() in chars := String.sub(yytext, 0) :: !chars ; continue() end | 7 => (Token.Lbracket) | 9 => (Token.Rbracket) | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (String.size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof yyarg else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := String.substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := String.size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(CharVector.sub(!yyb,l)) val NewChar = if NewChar<128 then NewChar else 128 val NewState = Char.ord(CharVector.sub(trans,NewChar)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if String.substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end in continue end in lex end end signature PROGRAM = sig include CAML (**** Basic types: programs, values, ... ****) datatype k = Acos | Addi | Addf | Apply | Asin | Clampf | Cone | Cos | Cube | Cylinder | Difference | Divi | Divf | Eqi | Eqf | Floor | Frac | Get | Getx | Gety | Getz | If | Intersect | Length | Lessi | Lessf | Light | Modi | Muli | Mulf | Negi | Negf | Plane | Point | Pointlight | Real | Render | Rotatex | Rotatey | Rotatez | Scale | Sin | Sphere | Spotlight | Sqrt | Subi | Subf | Translate | Union | Uscale (* Program tokens *) datatype t = Fun of t list | Arr of t list | Ident of string | Binder of string | Int of int | Float of float | Bool of bool | String of string | Prim of k (* internal representation of program tokens *) datatype t' = Fun' of t' list | Arr' of t' list | Ident' of int (* index to environment stack *) | Binder' (* | Int' of int | Float' of float | Bool' of bool | String' of string *) | Prim' of k | Val' of v (* inlined value *) (* Values *) and v = VInt of int | VFloat of float | VBool of bool | VStr of string | VClos of v list * t' list | VFun of (v list -> v list) (* XXX for the compiler *) | VArr of v array | VPoint of v * v * v (* XXX Maybe these should be floats? *) | VObj of obj | VLight of v * v | VPtLight of v * v | VStLight of v * v * v * v * v and obj = OObj of kind * closure ref | OTransform of obj * Matrix.t * (* World to object *) Matrix.t * (* Object to world *) float * (* Scale factor *) bool (* Isometry? *) | OUnion of obj * obj | OInter of obj * obj | ODiff of obj * obj and kind = OSphere | OCube | OCylind | OCone | OPlane and closure = Unopt of v (* Unoptimized function *) | Opt of v | Cst of (float * float * float * float * float * float) (* Translation of an identifier *) val translate : string -> t (* Get the name of an identifier *) (* val name : t' -> string *) exception Stuck_computation of v list * v list * t' list exception Stuck_computation' (* for compiler *) val read: TextIO.instream -> t list end structure Program: PROGRAM = struct open Caml datatype k = Acos | Addi | Addf | Apply | Asin | Clampf | Cone | Cos | Cube | Cylinder | Difference | Divi | Divf | Eqi | Eqf | Floor | Frac | Get | Getx | Gety | Getz | If | Intersect | Length | Lessi | Lessf | Light | Modi | Muli | Mulf | Negi | Negf | Plane | Point | Pointlight | Real | Render | Rotatex | Rotatey | Rotatez | Scale | Sin | Sphere | Spotlight | Sqrt | Subi | Subf | Translate | Union | Uscale datatype t = Fun of t list | Arr of t list | Ident of string | Binder of string | Int of int | Float of float | Bool of bool | String of string | Prim of k datatype t' = Fun' of t' list | Arr' of t' list | Ident' of int (* index to environment stack *) | Binder' (* | Int' of int | Float' of float | Bool' of bool | String' of string *) | Prim' of k | Val' of v (* inlined value *) and v = VInt of int | VFloat of float | VBool of bool | VStr of string | VClos of v list * t' list | VFun of (v list -> v list) (* XXX for the compiler *) | VArr of v array | VPoint of v * v * v | VObj of obj | VLight of v * v | VPtLight of v * v | VStLight of v * v * v * v * v and obj = OObj of kind * closure ref | OTransform of obj * Matrix.t * (* World to object *) Matrix.t * (* Object to world *) float * (* Scale factor *) bool (* Isometry? *) | OUnion of obj * obj | OInter of obj * obj | ODiff of obj * obj and kind = OSphere | OCube | OCylind | OCone | OPlane and closure = Unopt of v | Opt of v | Cst of (float * float * float * float * float * float) fun create_hashtables size init = let val tbl: (string, t) Hashtbl.t = Hashtbl.create size (* val tbl' = Hashtbl.create size *) in List.iter (fn (key, data) => Hashtbl.add tbl key data) init; (* List.iter (fn (data, key) -> Hashtbl.add tbl' key data) init; *) tbl (*, tbl' *) end val keywords(*, keyword_name)*) = create_hashtables 101 (* Booleans are either the literal true or the literal false. *) [ ("true", Bool true), ("false", Bool false), (* Operators (see appendix) *) ("acos", Prim Acos), ("addi", Prim Addi), ("addf", Prim Addf), ("apply", Prim Apply), ("asin", Prim Asin), ("clampf", Prim Clampf), ("cone", Prim Cone), ("cos", Prim Cos), ("cube", Prim Cube), ("cylinder", Prim Cylinder), ("difference", Prim Difference), ("divi", Prim Divi), ("divf", Prim Divf), ("eqi", Prim Eqi), ("eqf", Prim Eqf), ("floor", Prim Floor), ("frac", Prim Frac), ("get", Prim Get), ("getx", Prim Getx), ("gety", Prim Gety), ("getz", Prim Getz), ("if", Prim If), ("intersect", Prim Intersect), ("length", Prim Length), ("lessi", Prim Lessi), ("lessf", Prim Lessf), ("light", Prim Light), ("modi", Prim Modi), ("muli", Prim Muli), ("mulf", Prim Mulf), ("negi", Prim Negi), ("negf", Prim Negf), ("plane", Prim Plane), ("point", Prim Point), ("pointlight", Prim Pointlight), ("real", Prim Real), ("render", Prim Render), ("rotatex", Prim Rotatex), ("rotatey", Prim Rotatey), ("rotatez", Prim Rotatez), ("scale", Prim Scale), ("sin", Prim Sin), ("sphere", Prim Sphere), ("spotlight", Prim Spotlight), ("sqrt", Prim Sqrt), ("subi", Prim Subi), ("subf", Prim Subf), ("translate", Prim Translate), ("union", Prim Union), ("uscale", Prim Uscale)] fun translate i = Hashtbl.find keywords i handle Not_found => Ident i (* fun name token = * Hashtbl.find keyword_name * (match token with * Prim' k -> Prim k * | _ -> raise Not_found) * *) exception Stuck_computation of v list * v list * t' list exception Stuck_computation' (* for compiler *) structure LexToken = LexToken() structure Lex = Lex(structure Token = LexToken) fun read(ins: TextIO.instream): t list = let val lex: unit -> LexToken.t = Lex.makeLexer(fn n => TextIO.inputN(ins, n))() local val next: LexToken.t option ref = ref NONE in fun token(): LexToken.t = case !next of NONE => lex() | SOME t => (next := NONE; t) fun save(t: LexToken.t): unit = next := SOME t end fun bad() = failwith "invalid input" fun many(done: LexToken.t -> bool): t list = let fun loop(ac: t list) = case one() of NONE => if done(token()) then rev ac else bad() | SOME t => loop(t :: ac) in loop [] end and one(): t option = let fun tok t = SOME t in case token() of LexToken.Binder x => tok(Binder x) | LexToken.Bool b => tok(Bool b) | LexToken.Identifier x => tok(translate x) | LexToken.Int i => tok(Int i) | LexToken.Lbrace => SOME(Fun(many(fn LexToken.Rbrace => true | _ => false))) | LexToken.Lbracket => SOME(Arr(many(fn LexToken.Rbracket => true | _ =>false))) | LexToken.Real r => tok(Float r) | LexToken.String s => tok(String s) | t => (save t; NONE) end in many(fn LexToken.Eof => true | _ => false) end end signature PPM = sig include CAML type pixmap val init : (*width:*)int * (*height:*)int -> pixmap val dump : string * pixmap -> unit (* val load : string -> pixmap *) val width : pixmap -> int val height : pixmap -> int val get : pixmap * int * int * int -> int val set : pixmap * int * int * int * int -> unit val setp : pixmap * int * int * int * int * int -> unit end structure Ppm: PPM = struct open Caml structure Array = Word8Array structure Word = Word8 type pixmap = Array.array * int fun get ((img, width), i, j, k) = Word.toInt (Array.sub (img, ((j * width) + i) * 3 + k)) fun set ((img, width), i, j, k, v) = Array.update (img, ((j * width) + i) * 3 + k, Word.fromInt v) fun setp ((img, width), i, j, r, g, b) = let val p = ((j * width) + i) * 3 in Array.update(img, p, Word.fromInt r) ; Array.update(img, p + 1, Word.fromInt g) ; Array.update(img, p + 2, Word.fromInt b) end fun init (width, height) = (Array.array(height * width * 3, 0w0), width) fun width (s, width) = width fun height (s, width) = Array.length s div width div 3 fun dump (file, (img, width)) = let val sz = Array.length img val height = sz div 3 div width val f = open_out_bin file in output_string (f, "P6\n# PL Club - translated to SML\n") ; output_string (f, concat[Int.toString width, " ", Int.toString height, "\n255\n"]) ; output_string (f, Byte.unpackString (Word8ArraySlice.slice (img, 0, NONE))) ; close_out f end (* fun load file = * let f = open_in_bin file in * assert (input_line f = "P6"); * assert ((input_line f).[0] = '#'); * let s = input_line f in * let i = ref 0 in * while s.[!i] >= '0' && s.[!i] <= '9' do incr i done; * let width = int_of_string (String.sub s 0 !i) in * let height = * int_of_string (String.sub s (!i + 1) (String.length s - !i - 1)) in * assert (input_line f = "255"); * let (s, _) as img = init width height in * really_input f s 0 (String.length s); * close_in f; * img *) end signature RENDER = sig include CAML val apply : (Program.v * Program.v list -> Program.v list) ref val inline_closure : (Program.v -> Program.v) ref val f : (*amb:*)(float * float * float) * (*lights:*) Program.v array * (*obj:*)Program.obj * (*depth:*)int * (*fov:*)float * (*wid:*)int * (*ht:*)int * (*file:*)string -> unit end structure Render: RENDER = struct open Caml infix 9 ** open Program (* Scene description *) datatype kind = (* section 3.2 *) SSphere of Matrix.v (* Center *) * float (* Square of the radius *) | SEllips | SCube of Matrix.v (* Normal x = 0 *) * Matrix.v (* Normal y = 0 *) * Matrix.v (* Normal z = 0 *) | SCylind of Matrix.v (* Normal *) | SCone of Matrix.v (* Normal *) | SPlane of Matrix.v (* Equation *) * Matrix.v (* Normal *) datatype scene = (* section 3.7 *) SObj of kind * closure ref (* surface function *) * Matrix.t | SBound of scene * Matrix.v (* Center *) * float (* Square of the radius *) | SUnion of scene * scene | SInter of scene * scene | SDiff of scene * scene datatype light = (* section 3.5 *) Light of Matrix.v (* negated & normalized *) * (float * float * float) | PtLight of Matrix.v * (float * float * float) | StLight of Matrix.v * Matrix.v (* negated & normalized *) * (float * float * float) * float (* cos *) * float type desc = { amb : float * float * float, lights : light array, scene : scene } open Math open Matrix (**** Scene calculation ****) (* Plane equation and normal in world coordinates *) fun plane_eq(m, v) = let val n = vmul (transpose m, v ) in (n, normalize(#1 n, #2 n, #3 n, 0.0)) end val origin = ( 0.0, 0.0, 0.0, 1.0 ) val cube_center = ( 0.5, 0.5, 0.5, 1.0 ) val cylinder_center = ( 0.0, 0.5, 0.0, 1.0 ) val cone_center = ( 0.0, 1.0, 0.0, 1.0 ) fun intern_obj(m, m1, scale, isom, ob) = (* apply transformations *) case ob of OObj (OSphere, f) => if isom then let val center = vmul (m1, origin) val radius = scale * scale in SBound (SObj (SSphere (center, radius), f, m), center, radius) end else let val center = vmul (m1, origin) val radius = scale * scale in SBound (SObj (SEllips, f, m), center, radius) end | OObj (OCube, f) => let val (nx, nx') = plane_eq(m, (1.0, 0.0, 0.0, 0.0)) val (ny, ny') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val (nz, nz') = plane_eq(m, (0.0, 0.0, 1.0, 0.0)) val c = SObj (SCube (nx', ny', nz'), f, m) in SBound (c, vmul (m1, cube_center), scale * scale * 0.75) end | OObj (OCylind, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val c = SObj (SCylind n', f, m) in SBound (c, vmul(m1, cylinder_center), scale * scale * 1.25) end | OObj (OCone, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val c = SObj (SCone n', f, m) in SBound (c, vmul(m1, cone_center), scale * scale) end | OObj (OPlane, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) in SObj (SPlane (n, n'), f, m) end | OTransform (o', m', m'1, scale', isom') => intern_obj (Matrix.mul(m', m), Matrix.mul(m1, m'1), scale * scale', isom andalso isom', o') | OUnion (o1, o2) => SUnion (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) | OInter (o1, o2) => SInter (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) | ODiff (ODiff (o1, o2), o3) => (* Better to have unions that diffs for introducing bounds *) intern_obj(m, m1, scale, isom, (ODiff (o1, OUnion (o2, o3)))) | ODiff (o1, o2) => SDiff (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) fun intern_lights a = Array.map (fn VLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat r, VFloat g, VFloat b)) => Light (normalize (neg (x, y, z, 0.0)), (r, g, b)) | VPtLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat r, VFloat g, VFloat b)) => PtLight ((x, y, z, 1.0), (r, g, b)) | VStLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat x', VFloat y', VFloat z'), VPoint (VFloat r, VFloat g, VFloat b), VFloat cutoff, VFloat exp) => StLight ((x, y, z, 1.0), normalize (x - x', y - y', z - z', 0.0), (r, g, b), dcos cutoff, exp) | _ => raise(Fail "assert false")) a (**** Scene optimization ****) fun flatten_rec(sc, rem) = case sc of SUnion (sc1, sc2) => flatten_rec(sc1, flatten_rec(sc2, rem)) | sc => sc :: rem fun flatten_union sc = flatten_rec(sc, []) fun object_cost k : int = case k of SSphere _ => 1 | SEllips => 2 | SCube _ => 4 | SCylind _ => 2 | SCone _ => 2 | SPlane _ => 0 (* Planes do not have a bounding box anyway *) fun add_bound (r0, (x, r, cost, sc)) = if r0 < 0.0 then if r < 0.0 orelse cost <= 1 then (cost, sc) else (1, SBound (sc, x, r)) else (* Cost of bounds *) let val c0 = r0 + r * float cost (* Cost ofout bounds *) val c1 = r0 * float cost in if c0 < c1 then (1, SBound (sc, x, r)) else (cost, sc) end fun union_bound (dsc1 as (x1, r1, cost1, sc1), dsc2 as (x2, r2, cost2, sc2)) = if r1 < 0.0 then let val (cost2', sc2') = add_bound(r1, dsc2) in (x1, r1, cost1, SUnion (sc1, sc2')) end else if r2 < 0.0 then let val (cost1', sc1') = add_bound (r2, dsc1) in (x2, r2, cost2, SUnion (sc1', sc2)) end else let val d = sqrt (square (sub(x2, x1))) val r1' = sqrt r1 val r2' = sqrt r2 in if d + r2' <= r1' then let val (cost2', sc2') = add_bound (r1, dsc2) in (x1, r1, cost1 + cost2', SUnion (sc1, sc2')) end else if d + r1' <= r2' then let val (cost1', sc1') = add_bound (r2, dsc1) in (x2, r2, cost1' + cost2, SUnion (sc1', sc2)) end else let val r' = (r1' + r2' + d) * 0.5 val r = r' * r' val x = add_scaled (x1, (r' - r1') / d, sub(x2, x1)) val (cost1', sc1') = add_bound (r, dsc1) val (cost2', sc2') = add_bound (r, dsc2) in (x, r, cost1' + cost2', SUnion (sc1', sc2')) end end fun union_radius (dsc1 as (x1, r1, cost1, sc1), dsc2 as (x2, r2, cost2, sc2)) = let val d = sqrt (square (sub (x2, x1))) val r1' = sqrt r1 val r2' = sqrt r2 in if d + r2' <= r1' then r1 else if d + r1' <= r2' then r2 else let val r' = (r1' + r2' + d) * 0.5 in r' * r' end end fun merge2 l = case l of sc1 :: sc2 :: r => union_bound (sc1, sc2) :: merge2 r | _ => l fun merge_union l = case l of [] => raise(Fail "assert false") | [sc1] => sc1 | l => merge_union (merge2 l) fun opt_union l = case l of [] => l | [_] => l | [sc1, sc2] => [union_bound(sc1, sc2)] | _ => let val c = Array.of_list l val n = Array.length c val m = Array2.array(n, n, infinity) val _ = for(0, n - 1, fn i => for(0, n - 1, fn j => if i <> j then Array2.update(m, i, j, union_radius (Array.sub(c, i), Array.sub(c, j))) else ())) val remain = Array.init (n, fn i => i) val _ = forDown (n - 1, 1, fn k => let val gain = ref infinity val i0 = ref 0 val j0 = ref 0 val _ = for(0, k, fn i => for(0, k, fn j => let val i' = Array.sub(remain, i) val j' = Array.sub(remain, j) in if Array2.sub(m, i', j') < !gain then (gain := Array2.sub(m, i', j') ; i0 := i ; j0 := j) else () end)) val i = Array.sub(remain, !i0) val j = Array.sub(remain, !j0) in Array.update(remain, !j0, Array.sub(remain, k)); Array.update(c, i, union_bound (Array.sub(c, i), Array.sub(c, j))); for(0, k - 1, fn j0 => let val j = Array.sub(remain, j0) in if i <> j then ( Array2.update (m, i, j, union_radius (Array.sub(c, i), Array.sub(c, j))); Array2.update (m, j, i, union_radius (Array.sub(c, i), Array.sub(c, j)))) else () end) end) in [Array.sub(c, Array.sub(remain, 0))] end fun optimize_rec sc = case sc of SObj (kind, _, _) => (origin, ~1.0, object_cost kind, sc) | SUnion _ => let val l = List.map optimize_rec (flatten_union sc) val unbounded = List.filter (fn (_, r, _, _) => r < 0.0) l val bounded = List.filter (fn (_, r, _, _) => r >= 0.0) l in merge_union (opt_union bounded @ unbounded) end | SInter (sc1, sc2) => let val (x1, r1, cost1, sc1) = optimize_rec sc1 val (x2, r2, cost2, sc2) = optimize_rec sc2 in (* XXX We could have a tighter bound... *) if r2 < 0.0 then (x2, r2, cost2, SInter (sc1, sc2)) else if r1 < 0.0 then (x1, r1, cost1, SInter (sc2, sc1)) else if r1 < r2 then (x1, r1, cost1, SInter (sc1, sc2)) else (x2, r2, cost1, SInter (sc2, sc1)) end | SDiff (sc1, sc2) => let val (x1, r1, cost1, sc1) = optimize_rec sc1 val dsc2 as (x2, r2, cost2, sc2) = optimize_rec sc2 val (cost2', sc2') = add_bound (r1, dsc2) in (x1, r1, cost1, SDiff (sc1, sc2')) end | SBound (sc1, x, r) => let val (_, _, cost1, sc1) = optimize_rec sc1 in (x, r, cost1, sc1) end fun optimize sc = #2 (add_bound (~1.0, optimize_rec sc)) (**** Rendering ****) (* operations for intervals *) fun union (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => l2 | (_, []) => l1 | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' < t2 then i1 :: union(r1, l2) else if t2' < t1 then i2 :: union(l1, r2) else if t1 < t2 then if t1' < t2' then union(r1, (t1, o1, t2', o2')::r2) else union((t1, o1, t1', o1')::r1, r2) else if t1' < t2' then union(r1, ((t2, o2, t2', o2')::r2)) else union((t2, o2, t1', o1')::r1, r2) fun inter (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => [] | (_, []) => [] | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' <= t2 then inter(r1, l2) else if t2' <= t1 then inter(l1, r2) else if t1 < t2 then if t1' < t2' then (t2, o2, t1', o1') :: inter(r1, l2) else i2 :: inter(l1, r2) else if t1' < t2' then i1 :: inter(r1, l2) else (t1, o1, t2', o2') :: inter(l1, r2) fun diff (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => [] | (_, []) => l1 | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' <= t2 then i1 :: diff(r1, l2) else if t2' <= t1 then diff(l1, r2) else if t1 < t2 then if t1' < t2' then (t1, o1, t2, o2) :: diff(r1, l2) else (t1, o1, t2, o2) :: diff((t2', o2', t1', o1') :: r1, r2) else if t1' < t2' then diff(r1, l2) else diff((t2', o2', t1', o1') :: r1, r2) (* intersection of ray and object *) fun plane (orig, dir, scene, eq) : (float * scene * float * scene) list = (* XXX Need to be checked *) let val porig = prod (eq, orig) val pdir = prod (eq, dir) val t = ~ porig / pdir in if porig < 0.0 then if t > 0.0 then [(0.0, scene, t, scene)] else [(0.0, scene, infinity, scene)] else if t > 0.0 then [(t, scene, infinity, scene)] else [] end fun band (obj, x, v, i) : (float * scene * float * scene) list = (* ES: checked *) let val t1 = ~ (i x) / (i v) val t2 = (1.0 - (i x)) / (i v) val t2' = if t1 >= t2 then t1 else t2 in if t2' < 0.0 then [] else let val t1' = if t1 <= t2 then t1 else t2 in if t1' < 0.0 then [(0.0, obj, t2', obj)] else [(t1', obj, t2', obj)] end end fun cube (orig, dir, scene, m): (float * scene * float * scene) list = (* ES: checked *) let val x = vmul (m, orig) val v = vmul (m, dir) in case band (scene, x, v, #1) of [] => [] | l0 => case inter (l0, band (scene, x, v, #2)) of [] => [] | l1 => inter (l1, band (scene, x, v, #3)) end fun sphere (orig, dir, scene, x, r2): (float * scene * float * scene) list = let val v = sub (x, orig) (* Square of the distance between the origin and the center of the sphere *) val v2 = square v val dir2 = square dir val p = prod (v, dir) (* Square of the distance between the ray and the center *) val d2 = v2 - p * p / dir2 val delta = r2 - d2 in if delta <= 0.0 then [] else let val sq = sqrt (delta / dir2) val t1 = p / dir2 - sq val t2 = p / dir2 + sq in if t2 < 0.0 then [] else [(max_float (0.0, t1), scene, t2, scene)] end end fun ellipsoid (orig, dir, scene, m): (float * scene * float * scene) list = (* ES: checked *) let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = square x val v2 = square v val xv = prod (x, v) val delta = xv * xv - v2 * (x2 - 2.0) in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t2 < 0.0 then [] else [(max_float (0.0, t1), scene, t2, scene)] end end fun cylinder (orig, dir, scene, m): (float * scene * float * scene) list = let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = #1 x * #1 x + #3 x * #3 x - 1.0 val v2 = #1 v * #1 v + #3 v * #3 v val xv = #1 x * #1 v + #3 x * #3 v val delta = xv * xv - v2 * x2 in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t2 < 0.0 then [] else inter ([(max_float (0.0, t1), scene, t2, scene)], band (scene, x, v, #2)) end end fun cone (orig, dir, scene, m): (float * scene * float * scene) list = let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = #1 x * #1 x + #3 x * #3 x - #2 x * #2 x val v2 = #1 v * #1 v + #3 v * #3 v - #2 v * #2 v val xv = #1 x * #1 v + #3 x * #3 v - #2 x * #2 v val delta = xv * xv - v2 * x2 in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t1 <= t2 then if t2 < 0.0 then [] else inter ([(max_float(0.0, t1), scene, t2, scene)], band (scene, x, v, #2)) else inter (if t1 <= 0.0 then [(0.0, scene, infinity, scene)] else if t2 <= 0.0 then [(t1, scene, infinity, scene)] else [(0.0, scene, t2, scene), (t1, scene, infinity, scene)], band (scene, x, v, #2)) end end (* XXX Maybe we should check whether the sphere is completely behind us ? *) fun intersect (orig, dir, x, r2) = let val (vx, vy, vz, vt) = sub (x, orig) (* Square of the distance between the origin and the center of the sphere *) val v2 = vx * vx + vy * vy + vz * vz + vt * vt val (dx, dy, dz, dt) = dir val dir2 = dx * dx + dy * dy + dz * dz + dt * dt val p = vx * dx + vy * dy + vz * dz + vt * dt (* Square of the distance between the ray and the center *) val d2 = v2 - p * p / dir2 in r2 > d2 end fun find_all (orig, dir, scene) = case scene of SObj (SSphere (x, r2), _, m) => sphere (orig, dir, scene, x, r2) | SObj (SEllips, _, m) => ellipsoid (orig, dir, scene, m) | SObj (SCube _, _, m) => cube (orig, dir, scene, m) | SObj (SCylind _, _, m) => cylinder (orig, dir, scene, m) | SObj (SCone _, _, m) => cone (orig, dir, scene, m) | SObj (SPlane (eq, _), _, m) => plane (orig, dir, scene, eq) | SBound (sc, x, r2) => if intersect (orig, dir, x, r2) then find_all (orig, dir, sc) else [] | SUnion (sc1, sc2) => union (find_all (orig, dir, sc1), find_all (orig, dir, sc2)) | SInter (sc1, sc2) => let val l1 = find_all (orig, dir, sc1) in case l1 of [] => [] | _ => inter(l1, find_all (orig, dir, sc2)) end | SDiff (sc1, sc2) => let val l1 = find_all(orig, dir, sc1) in case l1 of [] => [] | _ => diff(l1, find_all(orig, dir, sc2)) end fun filter_inter_list l = case l of (t, _, _, _)::r => if t < epsilon then filter_inter_list r else l | _ => l fun hit_from_inter bounded l0 = let val l = filter_inter_list l0 in case l of [] => false | (t, _, _, _)::r => (not bounded orelse t <= 1.0) end fun hit(orig, dir, scene, bounded) = case scene of SObj (kind, _, m) => (case (case kind of SSphere (x, r2) => sphere (orig, dir, scene, x, r2) | SEllips => ellipsoid (orig, dir, scene, m) | SCube _ => cube (orig, dir, scene, m) | SCylind _ => cylinder (orig, dir, scene, m) | SCone _ => cone (orig, dir, scene, m) | SPlane (eq, _) => plane (orig, dir, scene, eq)) of [] => false | [(t, _, _, _)] => if bounded andalso t > 1.0 then false else if t < epsilon then false else true | _ => true) | SBound (sc, x, r2) => intersect (orig, dir, x, r2) andalso hit (orig, dir, sc, bounded) | SUnion (sc1, sc2) => hit (orig, dir, sc1, bounded) orelse hit (orig, dir, sc2, bounded) | SInter (sc1, sc2) => let val l1 = find_all (orig, dir, sc1) in case l1 of [] => false | _ => hit_from_inter bounded (inter(l1, find_all (orig, dir, sc2))) end | SDiff (sc1, sc2) => let val l1 = find_all(orig, dir, sc1) in case l1 of [] => false | _ => hit_from_inter bounded (diff(l1, find_all(orig, dir, sc2))) end fun visible (desc: desc, orig, dir, bounded) = not (hit(orig, dir, #scene desc, bounded)) val black = (0.0, 0.0, 0.0) val apply : ((Program.v * Program.v list) -> Program.v list) ref = ref (fn _ => raise(Fail "assert false")) val inline_closure : (Program.v -> Program.v) ref = ref (fn _ => raise(Fail "assert false")) (* Value between 0 and 1 from the sinus and cosinus *) (* Actually, only the sign of the sinus is used *) fun angle (si, co) = let val u = dacos co / 360.0 in if si > 0.0 then u else 1.0 - u end (* XXX Check that 0 <= u,v <= 1 *) fun texture_coord (kind, x: v) = (* section 3.6 *) (* ES: checked *) let fun ellipsOrSphere() = let val y = #2 x val v = (y + 1.0) * 0.5 in if v < epsilon then [VFloat v, VFloat 0.0, VInt 0] else let val u = angle (#1 x, #3 x / sqrt (1.0 - y * y)) in [VFloat v, VFloat u, VInt 0] end end in (* [v; u; face] *) case kind of SEllips => ellipsOrSphere() | SSphere _ => ellipsOrSphere() | SCube _ => if abs_float (#3 x) < epsilon then [VFloat (#2 x), VFloat (#1 x), VInt 0] else if abs_float ((#3 x) - 1.0) < epsilon then [VFloat (#2 x), VFloat (#1 x), VInt 1] else if abs_float (#1 x) < epsilon then [VFloat (#2 x), VFloat (#3 x), VInt 2] else if abs_float ((#1 x) - 1.0) < epsilon then [VFloat (#2 x), VFloat (#3 x), VInt 3] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (#3 x), VFloat (#1 x), VInt 4] else (* if abs_float (#2 x) < epsilon then *) [VFloat (#3 x), VFloat (#1 x), VInt 5] | SCylind _ => if abs_float (#2 x) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 2] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 1] else let val u = angle (#1 x, #3 x) in [VFloat (#2 x), VFloat u, VInt 0] end | SCone _ => let val v = (#2 x) in if abs_float v < epsilon then [VFloat v, VFloat 0.0, VInt 0] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 1] else let val u = angle (#1 x, (#3 x) / v) in [VFloat v, VFloat u, VInt 0] end end | SPlane _ => [VFloat (#3 x), VFloat (#1 x), VInt 0] end fun normal (kind, m, x', x) = case kind of SSphere (x0, _) => normalize (sub (x, x0)) | SEllips => let val (n0, n1, n2, _) = vmul (transpose m, x') in normalize(n0, n1, n2, 0.0) end | SCylind n => if abs_float (#2 x') < epsilon orelse abs_float (#2 x') - 1.0 < epsilon then n else (* XXX Could be optimized... *) let val (n0, n1, n2, _) = vmul (transpose m, (#1 x', 0.0, #3 x', 0.0)) in normalize(n0, n1, n2, 0.0) end | SCone n => if abs_float (#2 x') - 1.0 < epsilon then n else let val (n0, n1, n2, _) = vmul (transpose m, (#1 x', ~(#2 x'), #3 x', 0.0)) in normalize(n0, n1, n2, 0.0) end | SCube (nx, ny, nz) => if abs_float (#3 x') < epsilon orelse abs_float (#3 x') - 1.0 < epsilon then nz else if abs_float (#1 x') < epsilon orelse abs_float (#1 x') - 1.0 < epsilon then nx else ny | SPlane (_, n) => n fun apply_surface_fun (f, v) = case !apply(f, v) of [VFloat n, VFloat ks, VFloat kd, VPoint (VFloat cr, VFloat cg, VFloat cb)] => (n, ks, kd, cr, cg, cb) | _ => failwith "A surface function returns some incorrect values" fun trace (desc: desc, depth: int, orig, dir) = let val dir = normalize dir in case filter_inter_list (find_all(orig, dir, #scene desc)) of [] => black | (t, ob, _, _) :: _ => trace_2(desc, depth, orig, dir, t, ob) end and trace_2 (desc, depth: int, orig, dir, t, obj) = let val x = add_scaled (orig, t, dir) in case obj of SObj (kind, f, m) => let val x' = vmul (m, x) val (n, ks, kd, cr, cg, cb) = (case !f of Unopt g => (* First we check whether the function would fail *) let val res = apply_surface_fun(g, texture_coord(kind, x')) fun stuck() = f := Opt (!inline_closure g) in (* Then, we check whether it is a constant function *) ((ignore (apply_surface_fun(g, [VInt 0, VInt 0, VFloat 0.0])) ; f := Cst res) handle Stuck_computation _ => stuck() | Stuck_computation' => stuck()) ; res end | Opt g => apply_surface_fun (g, texture_coord (kind, x')) | Cst res => res) val nm = normal (kind, m, x', x) val p = prod (dir, nm) val nm = if p > 0.0 then neg nm else nm val p = ~(abs_float p) (* Ambient composant *) val (ar, ag, ab) = #amb desc val r = ref (kd * ar) val g = ref (kd * ag) val b = ref (kd * ab) (* Lights *) val lights = #lights desc val _ = for(0, Array.length lights - 1, fn i => case (Array.sub(lights, i)) of Light (ldir, (lr, lg, lb)) => let val p' = prod (ldir, nm) in if p' > 0.0 andalso visible (desc, x, ldir, false) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub (ldir, dir)), nm) ** n else kd * p' in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end | PtLight (src, (lr, lg, lb)) => let val ldir = sub (src, x) val ldir' = normalize ldir val p' = prod (ldir', nm) in if p' > 0.0 andalso visible(desc, x, ldir, true) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub (ldir', dir)), nm) ** n else kd * p' val int = 100.0 * int / (99.0 + square ldir) in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end | StLight (src, maindir, (lr, lg, lb), cutoff, exp) => let val ldir = sub (src, x) val ldir' = normalize ldir val p' = prod (ldir', nm) val p'' = prod (ldir', maindir) in if p' > 0.0 andalso p'' > cutoff andalso visible(desc, x, ldir, true) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub(ldir', dir)), nm) ** n else kd * p' val int = 100.0 * int / (99.0 + square ldir) * (p'' ** exp) in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end) val _ = (* Reflexion *) if ks > epsilon andalso depth > 0 then let val dir' = add_scaled (dir, ~2.0 * p, nm) val (r', g', b') = trace(desc, depth - 1, x, dir') in r := !r + ks * r'; g := !g + ks * g'; b := !b + ks * b' end else () in (!r * cr, !g * cg, !b * cb) end | _ => raise(Fail "assert false") end fun conv c : int = let val i = truncate (c * 256.0) in if i < 0 then 0 else if i >= 256 then 255 else i end fun f (amb, lights, obj, depth: int, fov, wid, ht, file) = let val scene = intern_obj(Matrix.identity, Matrix.identity, 1.0, true, obj) val scene = optimize scene val img = Ppm.init (wid, ht) val orig = ( 0.0, 0.0, ~1.0, 1.0 ) val width = 2.0 * dtan (0.5 * fov) val delta = width / float wid val x0 = ~ width / 2.0 val y0 = delta * float ht / 2.0 val desc = { amb = amb, lights = intern_lights lights, scene = scene } in for(0, ht - 1, fn j => for(0, wid - 1, fn i => let val dir = (x0 + (float i + 0.5) * delta, y0 - (float j + 0.5) * delta, 1.0, 0.0) val (r, g, b) = trace(desc, depth, orig, dir) in Ppm.setp (img, i, j, conv r, conv g, conv b) end)) ; Ppm.dump (file, img) end end signature EVAL = sig val f : Program.t list -> unit end structure Eval: EVAL = struct open Caml open Program val rtd = 180.0 / acos (~1.0) val dtr = acos (~1.0) / 180.0 fun deg x = rtd * x fun rad x = dtr * x val zero = VFloat 0.0 val one = VFloat 1.0 fun lookup (env, s) : int = case env of [] => failwith ("Unbound variable \"" ^ s ^ "\"") | s' :: env' => if s = s' then 0 else 1 + (lookup(env', s)) (* XXX embed values *) fun conv (absenv, p) = case p of [] => [] | Float x :: Float y :: Float z :: Prim Point :: r => Val' (VPoint (VFloat x, VFloat y, VFloat z)) :: conv(absenv, r) | t :: r => (case t of Fun p' => Fun' (conv(absenv, p')) :: conv(absenv, r) | Arr p' => Arr' (conv(absenv, p')) :: conv(absenv, r) | Ident s => Ident' (lookup(absenv, s)) :: conv(absenv, r) | Binder s => Binder' :: conv (s :: absenv, r) | Int i => Val' (VInt i) :: conv(absenv, r) | Float f => Val' (VFloat f) :: conv(absenv, r) | Bool b => Val' (VBool b) :: conv(absenv, r) | String s => Val' (VStr s) :: conv(absenv, r) | Prim k => Prim' k :: conv(absenv, r)) fun inline (offset, env, p) = case p of [] => [] | t :: r => let fun normal() = t :: inline(offset, env, r) in case t of Fun' p' => Fun' (inline(offset, env, p')) :: inline(offset, env, r) | Arr' p' => Arr' (inline(offset, env, p')) :: inline(offset, env, r) | Ident' i => if i >= offset then Val' (List.nth (env, i - offset)) :: inline(offset, env, r) else normal() | Binder' => Binder' :: inline (1 + offset, env, r) | Prim' _ => normal() | Val' _ => normal() end val inline_closure = fn (VClos (env, p)) => VClos ([], inline(0, env, p)) | _ => failwith "a surface function was actually not a function" val _ = Render.inline_closure := inline_closure fun eval (env, st, p) = case (st, p) of (* inlined value *) (_, Val' v :: r) => eval(env, (v :: st), r) (* Rule 1 *) (* Rule 2 *) | (v::st', Binder' :: r) => eval((v :: env), st', r) (* Rule 3 *) | (_, Ident' i :: r) => let val v = List.nth(env, i) in eval(env, (v :: st), r) end (* Rule 4 *) | (_, Fun' f :: r) => eval(env, (VClos (env, f) :: st), r) (* Rule 5 *) | (VClos (env', f) :: st', Prim' Apply :: r) => eval(env, eval(env', st', f), r) (* Rule 6 *) | (_, Arr' a :: r) => eval(env, (VArr (Array.of_list (List.rev (eval(env, [], a))))) :: st, r) (* Rules 7 and 8 *) | (VClos _ :: VClos (env', iftrue) :: VBool true :: st', Prim' If :: r) => eval(env, eval(env', st', iftrue), r) | (VClos (env', iffalse) :: VClos _ :: VBool false :: st', Prim' If :: r) => eval(env, eval(env', st', iffalse), r) (* Operations on numbers *) | (VInt n2 :: VInt n1 :: st', Prim' Addi :: r) => eval(env, (VInt (n1 + n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Addf :: r) => eval(env, (VFloat (f1 + f2) :: st'), r) | (VFloat f :: st', Prim' Acos :: r) => eval(env, (VFloat (deg (acos f)) :: st'), r) | (VFloat f :: st', Prim' Asin :: r) => eval(env, (VFloat (deg (asin f)) :: st'), r) | ((vf as VFloat f):: st', Prim' Clampf :: r) => let val f' = if f < 0.0 then zero else if f > 1.0 then one else vf in eval(env, (f' :: st'), r) end | (VFloat f :: st', Prim' Cos :: r) => eval(env, (VFloat (cos (rad f)) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Divi :: r) => eval(env, (VInt (n1 div n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Divf :: r) => eval(env, (VFloat (f1 / f2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Eqi :: r) => eval(env, (VBool (n1 = n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Eqf :: r) => eval(env, (VBool (Real.==(f1, f2)) :: st'), r) | (VFloat f :: st', Prim' Floor :: r) => eval(env, (VInt (Real.floor f) :: st'), r) | (VFloat f :: st', Prim' Frac :: r) => eval(env, (VFloat (Real.realMod f) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Lessi :: r) => eval(env, (VBool (n1 < n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Lessf :: r) => eval(env, (VBool (f1 < f2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Modi :: r) => eval(env, (VInt (n1 mod n2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Muli :: r) => eval(env, (VInt (n1 * n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Mulf :: r) => eval(env, (VFloat (f1 * f2) :: st'), r) | (VInt n :: st', Prim' Negi :: r) => eval(env, (VInt (~ n) :: st'), r) | (VFloat f :: st', Prim' Negf :: r) => eval(env, (VFloat (~ f) :: st'), r) | (VInt n :: st', Prim' Real :: r) => eval(env, (VFloat (float n) :: st'), r) | (VFloat f :: st', Prim' Sin :: r) => eval(env, (VFloat (sin (rad f)) :: st'), r) | (VFloat f :: st', Prim' Sqrt :: r) => eval(env, (VFloat (sqrt f) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Subi :: r) => eval(env, (VInt (n1 - n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Subf :: r) => eval(env, (VFloat (f1 - f2) :: st'), r) (* Operations on points *) | (VPoint (x, _, _) :: st', Prim' Getx :: r ) => eval(env, (x :: st'), r) | (VPoint (_, y, _) :: st', Prim' Gety :: r ) => eval(env, (y :: st'), r) | (VPoint (_, _, z) :: st', Prim' Getz :: r ) => eval(env, (z :: st'), r) | ((z as VFloat _) :: (y as VFloat _) :: (x as VFloat _) :: st', Prim' Point :: r) => eval(env, (VPoint (x, y, z) :: st'), r) | (VInt i :: VArr a :: st', Prim' Get :: r) => (* if compiled of "-unsafe" *) if i < 0 orelse i >= Array.length a then failwith "illegal access beyond array boundary" else eval(env, (Array.sub(a, i) :: st'), r) | (VArr a :: st', Prim' Length :: r) => eval(env, (VInt (Array.length a) :: st'), r) (* Geometric primitives *) | ((f as VClos _) :: st', Prim' Sphere :: r ) => eval(env, (VObj (OObj (OSphere, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cube :: r ) => eval(env, (VObj (OObj (OCube, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cylinder :: r) => eval(env, (VObj (OObj (OCylind, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cone :: r ) => eval(env, (VObj (OObj (OCone, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Plane :: r ) => eval(env, (VObj (OObj (OPlane, ref (Unopt f))) :: st'), r) (* Transformations *) | (VFloat z :: VFloat y :: VFloat x :: VObj ob :: st', Prim' Translate :: r) => eval(env, (VObj (OTransform (ob, Matrix.translate (x, y, z), Matrix.translate (~ x, ~ y, ~ z), 1.0, true)) :: st'), r) | (VFloat z :: VFloat y :: VFloat x :: VObj ob :: st', Prim' Scale :: r) => eval( env, (VObj (OTransform (ob, Matrix.scale (x, y, z), Matrix.unscale (x, y, z), Real.max (abs_float x, (Real.max (abs_float y, abs_float z))), false)) :: st'), r) | (VFloat s :: VObj ob :: st', Prim' Uscale :: r) => eval(env, (VObj (OTransform (ob, Matrix.uscale s, Matrix.unuscale s, abs_float s, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatex :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatex t, Matrix.rotatex (~ t), 1.0, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatey :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatey t, Matrix.rotatey (~ t), 1.0, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatez :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatez t, Matrix.rotatez (~ t), 1.0, true)) :: st'), r) (* Lights *) | ((color as VPoint _) :: (dir as VPoint _) :: st', Prim' Light :: r) => eval(env, (VLight (dir, color) :: st'), r) | ((color as VPoint _) :: (pos as VPoint _) :: st', Prim' Pointlight :: r) => eval(env, (VPtLight (pos, color) :: st'), r) | ((expon as VFloat _) :: (cutoff as VFloat _) :: (color as VPoint _) :: (at as VPoint _) :: (pos as VPoint _) :: st', Prim' Spotlight :: r) => eval(env, (VStLight (pos, at, color, cutoff, expon) :: st'), r) (* Constructive geometry *) | ((VObj o2) :: (VObj o1) :: st', Prim' Union :: r) => eval(env, (VObj (OUnion (o1, o2)) :: st'), r) | ((VObj o2) :: (VObj o1) :: st', Prim' Intersect :: r) => eval(env, (VObj (OInter (o1, o2)) :: st'), r) | ((VObj o2) :: (VObj o1) :: st', Prim' Difference :: r) => eval(env, (VObj (ODiff (o1, o2)) :: st'), r) (* Rendering *) | (VStr file :: VInt ht :: VInt wid :: VFloat fov :: VInt depth :: VObj obj :: VArr lights :: VPoint (VFloat ax, VFloat ay, VFloat az) :: st', Prim' Render :: r) => (* amb the intensity of ambient light (a point). lights is an array of lights used to illuminate the scene. obj is the scene to render. depth is an integer limit on the recursive depth of the ray tracing. fov is the horizontal field of view in degrees (a real number). wid is the width of the rendered image in pixels (an integer). ht is the height of the rendered image in pixels (an integer). file is a string specifying output file for the rendered image. *) (Render.f ((ax, ay, az), lights, obj, depth, fov, wid, ht, file) ; eval(env, st', r)) (* Termination *) | (_, []) => st (* Failure *) | _ => raise (Stuck_computation (env, st, p)) fun apply (f, st) = case f of VClos (env, p) => eval(env, st, p) | _ => raise Fail "assert false" val _ = Render.apply := apply fun f p = let val st = eval([], [], (conv([], p))) in case st of [] => () | _ => failwith "error" end handle Stuck_computation (env, st, p) => failwith "stuck" end structure Main = struct fun doit () = Eval.f (Program.read (TextIO.openIn "DATA/chess.gml")) handle _ => () val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20210117+dfsg/benchmark/tests/simple.sml000066400000000000000000001076201416264345000211360ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) fun print _ = () structure Control = struct val trace = ref false end; structure Array2 : sig type 'a array2 exception Subscript val array: (int*int) * 'a -> 'a array2 val sub : 'a array2 * (int*int) -> 'a val update : 'a array2 * (int*int) * 'a -> unit val length : 'a array2 -> (int*int) end = struct type 'a array2 = {size : (int*int), value : 'a Array.array} exception Subscript = Subscript fun index ((i1:int,i2:int),(s1,s2)) = if i1>=0 andalso i1=0 andalso i2 unit val testit : TextIO.outstream -> unit end; (* Simple * error: grid_max < 5 *) functor Simple(val grid_max: int val step_count: int) : BMARK = struct fun fold f [] = (fn b => b) | fold f (a::r) = (fn b => let fun f2(e,[]) = f(e,b) | f2(e,a::r) = f(e,f2(a,r)) in f2(a,r) end) fun min (x:real,y:real) = if x0 andalso endd>=start then let fun f x = if x > endd then () else (body x; f(x+delta)) in f start end else if endd<=start then let fun f x = if x < endd then () else (body x; f(x+delta)) in f start end else () fun from(n,m) = if n>m then [] else n::from(n+1,m) fun flatten [] = [] | flatten (x::xs) = x @ flatten xs fun pow(x:real,y:int) = if y = 0 then 1.0 else x * pow(x,y-1) fun array2(bounds as ((l1,u1),(l2,u2)),v) = (Array2.array((u1-l1+1, u2-l2+1),v), bounds) fun sub2((A,((lb1:int,ub1:int),(lb2:int,ub2:int))),(k,l)) = Array2.sub(A, (k-lb1, l-lb2)) fun update2((A,((lb1,_),(lb2,_))),(k,l), v) = Array2.update(A,(k-lb1,l-lb2),v) fun bounds2(_,b) = b fun printarray2 (A as (M:real Array2.array2,((l1,u1),(l2,u2)))) = for {from=l1,step=1,to=u1} (fn i => (print "["; for {from=l2,step=1,to=u2-1} (fn j => print (Real.toString (sub2(A,(i,j))) ^ ", ")); print (Real.toString (sub2(A,(i,u2))) ^ "]\n"))) fun array1((l,u),v) = (Array.array(u-l+1,v),(l,u)) fun sub1((A,(l:int,u:int)),i:int) = Array.sub(A,i-l) fun update1((A,(l,_)),i,v) = Array.update(A,i-l,v) fun bounds1(_,b) = b (* * Specification of the state variable computation *) val grid_size = ((2,grid_max), (2,grid_max)) fun north (k,l) = (k-1,l) fun south (k,l) = (k+1,l) fun east (k,l) = (k,l+1) fun west (k,l) = (k,l-1) val northeast = north o east val southeast = south o east val northwest = north o west val southwest = south o west fun farnorth x = (north o north ) x fun farsouth x = (south o south) x fun fareast x = (east o east) x fun farwest x = (west o west) x fun zone_A(k,l) = (k,l) fun zone_B(k,l) = (k+1,l) fun zone_C(k,l) = (k+1,l+1) fun zone_D(k,l) = (k,l+1) val zone_corner_northeast = north val zone_corner_northwest = northwest fun zone_corner_southeast zone = zone val zone_corner_southwest = west val ((kmin,kmax),(lmin,lmax)) = grid_size val dimension_all_nodes = ((kmin-1,kmax+1),(lmin-1,lmax+1)) fun for_all_nodes f = for {from=kmin-1, step=1, to=kmax+1} (fn k => for {from=lmin-1, step=1, to=lmax+1} (fn l => f k l)) val dimension_interior_nodes = ((kmin,kmax),(lmin,lmax)) fun for_interior_nodes f = for {from=kmin, step=1, to=kmax} (fn k => for {from=lmin, step=1, to=lmax} (fn l => f k l)) val dimension_all_zones = ((kmin,kmax+1),(lmin,lmax+1)) fun for_all_zones f = for {from=kmin, step=1, to=kmax+1} (fn k => for {from=lmin, step=1, to=lmax+1} (fn l => f (k,l))) val dimension_interior_zones = ((kmin+1,kmax),(lmin+1,lmax)) fun for_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun map_interior_nodes f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin,lmax)))) (from(kmin,kmax))) fun map_interior_zones f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin+1,lmax)))) (from(kmin+1,kmax))) fun for_north_ward_interior_zones f = for {from=kmax, step= ~1, to=kmin+1} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun for_west_ward_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmax, step= ~1, to=lmin+1} (fn l => f (k,l))) fun for_north_zones f = for {from=lmin, step=1, to=lmax+1} (fn l => f (kmin,l)) fun for_south_zones f = for {from=lmin+1, step=1, to=lmax} (fn l => f (kmax+1,l)) fun for_east_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmax+1)) fun for_west_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmin)) fun reflect dir node A = sub2(A, dir node) val reflect_north = fn x => reflect north x val reflect_south = fn x => reflect south x val reflect_east = fn x => reflect east x val reflect_west = fn x => reflect west x fun for_north_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmin-1,l)) fun for_south_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmax+1,l)) fun for_east_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmax+1)) fun for_west_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmin-1)) val north_east_corner = (kmin-1,lmax+1) val north_west_corner = (kmin-1,lmin-1) val south_east_corner = (kmax+1,lmax+1) val south_west_corner = (kmax+1,lmin-1) val west_of_north_east = (kmin-1, lmax) val west_of_south_east = (kmax+1, lmax) val north_of_south_east = (kmax, lmax+1) val north_of_south_west = (kmax, lmin-1) (* * Initialization of parameters *) val constant_heat_source = 0.0 val deltat_maximum = 0.01 val specific_heat = 0.1 val p_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (1,1), 0.06698); M end val e_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (0,1), 0.1); M end val p_poly = array2(((1,4),(1,5)),p_coeffs) val e_poly = array2(((1,4),(1,5)), e_coeffs) val rho_table = let val V = array1((1,3), 0.0) in update1(V,2,1.0); update1(V,3,100.0); V end val theta_table = let val V = array1((1,4), 0.0) in update1(V,2,3.0); update1(V,3,300.0); update1(V,4,3000.0); V end val extract_energy_tables_from_constants = (e_poly,2,rho_table,theta_table) val extract_pressure_tables_from_constants = (p_poly,2,rho_table,theta_table) val nbc = let val M = array2(dimension_all_zones, 1) in for {from=lmin+1,step=1,to=lmax} (fn j => update2(M,(kmax+1, j),2)); update2(M,(kmin,lmin),4); update2(M,(kmin,lmax+1),4); update2(M,(kmax+1,lmin),4); update2(M,(kmax+1,lmax+1),4); M end val pbb = let val A = array1((1,4), 0.0) in update1(A,2,6.0); A end val pb = let val A = array1((1,4), 1.0) in update1(A,2,0.0); update1(A,3,0.0); A end val qb = pb val all_zero_nodes = array2(dimension_all_nodes, 0.0) val all_zero_zones = array2(dimension_all_zones, 0.0) (* * Positional Coordinates. (page 9-10) *) fun make_position_matrix interior_function = let val r' = array2(dimension_all_nodes, 0.0) val z' = array2(dimension_all_nodes, 0.0) fun boundary_position (rx,zx,ry,zy,ra,za) = let val (rax, zax) = (ra - rx, za - zx) val (ryx, zyx) = (ry - rx, zy - zx) val omega = 2.0*(rax*ryx + zax*zyx)/(ryx*ryx + zyx*zyx) val rb = rx - rax + omega*ryx val zb = zx - zax + omega*zyx in (rb, zb) end fun reflect_node (x_dir, y_dir, a_dir, node) = let val rx = reflect x_dir node r' val zx = reflect x_dir node z' val ry = reflect y_dir node r' val zy = reflect y_dir node z' val ra = reflect a_dir node r' val za = reflect a_dir node z' in boundary_position (rx, zx, ry, zy, ra, za) end fun u2 (rv,zv) n = (update2(r',n,rv); update2(z',n,zv)) in for_interior_nodes (fn k => fn l => u2 (interior_function (k,l)) (k,l)); for_north_nodes(fn n => u2 (reflect_node(south,southeast,farsouth,n)) n); for_south_nodes (fn n => u2(reflect_node(north,northeast,farnorth,n)) n); for_east_nodes (fn n => u2(reflect_node(west, southwest, farwest, n)) n); for_west_nodes (fn n => u2(reflect_node(east, southeast, fareast, n)) n); u2 (reflect_node(south, southwest, farsouth, west_of_north_east)) west_of_north_east; u2 (reflect_node(north, northwest, farnorth, west_of_south_east)) west_of_south_east; u2 (reflect_node(west, northwest, farwest, north_of_south_east)) north_of_south_east; u2 (reflect_node(east, northeast, fareast, north_of_south_west)) north_of_south_west; u2 (reflect_node(southwest, west, farwest, north_east_corner)) north_east_corner; u2 (reflect_node(northwest, west, farwest, south_east_corner)) south_east_corner; u2 (reflect_node(southeast, south, farsouth, north_west_corner)) north_west_corner; u2 (reflect_node(northeast, east, fareast, south_west_corner)) south_west_corner; (r',z') end (* * Physical Properties of a Zone (page 10) *) fun zone_area_vol ((r,z), zone) = let val (r1,z1)=(sub2(r,zone_corner_southwest zone), sub2(z,zone_corner_southwest zone)) val (r2,z2)=(sub2(r,zone_corner_southeast zone), sub2(z,zone_corner_southeast zone)) val (r3,z3)=(sub2(r,zone_corner_northeast zone), sub2(z,zone_corner_northeast zone)) val (r4,z4)=(sub2(r,zone_corner_northwest zone), sub2(z,zone_corner_northwest zone)) val area1 = (r2-r1)*(z3-z1) - (r3-r2)*(z3-z2) val radius1 = 0.3333 *(r1+r2+r3) val volume1 = area1 * radius1 val area2 = (r3-r1)*(z4-z3) - (r4-r3)*(z3-z1) val radius2 = 0.3333 *(r1+r3+r4) val volume2 = area2 * radius2 in (area1+area2, volume1+volume2) end (* * Velocity (page 8) *) fun make_velocity((u,w),(r,z),p,q,alpha,rho,delta_t) = let fun line_integral (p,z,node) : real = sub2(p,zone_A node)*(sub2(z,west node) - sub2(z,north node)) + sub2(p,zone_B node)*(sub2(z,south node) - sub2(z,west node)) + sub2(p,zone_C node)*(sub2(z,east node) - sub2(z,south node)) + sub2(p,zone_D node)*(sub2(z,north node) - sub2(z,east node)) fun regional_mass node = 0.5 * (sub2(rho, zone_A node)*sub2(alpha,zone_A node) + sub2(rho, zone_B node)*sub2(alpha,zone_B node) + sub2(rho, zone_C node)*sub2(alpha,zone_C node) + sub2(rho, zone_D node)*sub2(alpha,zone_D node)) fun velocity node = let val d = regional_mass node val n1 = ~(line_integral(p,z,node)) - line_integral(q,z,node) val n2 = line_integral(p,r,node) + line_integral(q,r,node) val u_dot = n1/d val w_dot = n2/d in (sub2(u,node)+delta_t*u_dot, sub2(w,node)+delta_t*w_dot) end val U = array2(dimension_interior_nodes,0.0) val W = array2(dimension_interior_nodes,0.0) in for_interior_nodes (fn k => fn l => let val (uv,wv) = velocity (k,l) in update2(U,(k,l),uv); update2(W,(k,l),wv) end); (U,W) end fun make_position ((r,z),delta_t,(u',w')) = let fun interior_position node = (sub2(r,node) + delta_t*sub2(u',node), sub2(z,node) + delta_t*sub2(w',node)) in make_position_matrix interior_position end fun make_area_density_volume(rho, s, x') = let val alpha' = array2(dimension_all_zones, 0.0) val s' = array2(dimension_all_zones, 0.0) val rho' = array2(dimension_all_zones, 0.0) fun interior_area zone = let val (area, vol) = zone_area_vol (x', zone) val density = sub2(rho,zone)*sub2(s,zone) / vol in (area,vol,density) end fun reflect_area_vol_density reflect_function = (reflect_function alpha',reflect_function s',reflect_function rho') fun update_asr (zone,(a,s,r)) = (update2(alpha',zone,a); update2(s',zone,s); update2(rho',zone,r)) fun r_area_vol_den (reflect_dir,zone) = let val asr = reflect_area_vol_density (reflect_dir zone) in update_asr(zone, asr) end in for_interior_zones (fn zone => update_asr(zone, interior_area zone)); for_south_zones (fn zone => r_area_vol_den(reflect_north, zone)); for_east_zones (fn zone => r_area_vol_den(reflect_west, zone)); for_west_zones (fn zone => r_area_vol_den(reflect_east, zone)); for_north_zones (fn zone => r_area_vol_den(reflect_south, zone)); (alpha', rho', s') end (* * Artifical Viscosity (page 11) *) fun make_viscosity(p,(u',w'),(r',z'), alpha',rho') = let fun interior_viscosity zone = let fun upper_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_northeast zone)) + (sub2(f,zone_corner_southwest zone) - sub2(f,zone_corner_northwest zone))) fun lower_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_southwest zone)) + (sub2(f,zone_corner_northeast zone) - sub2(f,zone_corner_northwest zone))) val xi = pow(upper_del r',2) + pow(upper_del z',2) val eta = pow(lower_del r',2) + pow(lower_del z',2) val upper_disc = (upper_del r')*(lower_del w') - (upper_del z')*(lower_del u') val lower_disc = (upper_del u')*(lower_del z') - (upper_del w') * (lower_del r') val upper_ubar = if upper_disc<0.0 then upper_disc/xi else 0.0 val lower_ubar = if lower_disc<0.0 then lower_disc/eta else 0.0 val gamma = 1.6 val speed_of_sound = gamma*sub2(p,zone)/sub2(rho',zone) val ubar = pow(upper_ubar,2) + pow(lower_ubar,2) val viscosity = sub2(rho',zone)*(1.5*ubar + 0.5*speed_of_sound*(Math.sqrt ubar)) val length = Math.sqrt(pow(upper_del r',2) + pow(lower_del r',2)) val courant_delta = 0.5* sub2(alpha',zone)/(speed_of_sound*length) in (viscosity, courant_delta) end val q' = array2(dimension_all_zones, 0.0) val d = array2(dimension_all_zones, 0.0) fun reflect_viscosity_cdelta (direction, zone) = sub2(q',direction zone) * sub1(qb, sub2(nbc,zone)) fun do_zones (dir,zone) = update2(q',zone,reflect_viscosity_cdelta (dir,zone)) in for_interior_zones (fn zone => let val (qv,dv) = interior_viscosity zone in update2(q',zone,qv); update2(d,zone,dv) end); for_south_zones (fn zone => do_zones(north,zone)); for_east_zones (fn zone => do_zones(west,zone)); for_west_zones (fn zone => do_zones(east,zone)); for_north_zones (fn zone => do_zones(south,zone)); (q', d) end (* * Pressure and Energy Polynomial (page 12) *) fun polynomial(G,degree,rho_table,theta_table,rho_value,theta_value) = let fun table_search (table, value) = let val (low, high) = bounds1 table fun search_down i = if value > sub1(table,i-1) then i else search_down (i-1) in if value>sub1(table,high) then high+1 else if value <= sub1(table,low) then low else search_down high end val rho_index = table_search(rho_table, rho_value) val theta_index = table_search(theta_table, theta_value) val A = sub2(G, (rho_index, theta_index)) fun from(n,m) = if n>m then [] else n::from(n+1,m) fun f(i,j) = sub2(A,(i,j))*pow(rho_value,i)*pow(theta_value,j) in sum_list (map (fn i => sum_list(map (fn j => f (i,j)) (from(0,degree)))) (from (0,degree))) end fun zonal_pressure (rho_value:real, theta_value:real) = let val (G,degree,rho_table,theta_table) = extract_pressure_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end fun zonal_energy (rho_value, theta_value) = let val (G, degree, rho_table, theta_table) = extract_energy_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end val dx = 0.000001 val tiny = 0.000001 fun newton_raphson (f,x) = let fun iter (x,fx) = if fx > tiny then let val fxdx = f(x+dx) val denom = fxdx - fx in if denom < tiny then iter(x,tiny) else iter(x-fx*dx/denom, fxdx) end else x in iter(x, f x) end (* * Temperature (page 13-14) *) fun make_temperature(p,epsilon,rho,theta,rho_prime,q_prime) = let fun interior_temperature zone = let val qkl = sub2(q_prime,zone) val rho_kl = sub2(rho,zone) val rho_prime_kl = sub2(rho_prime,zone) val tau_kl = (1.0 /rho_prime_kl - 1.0/rho_kl) fun energy_equation epsilon_kl theta_kl = epsilon_kl - zonal_energy(rho_kl,theta_kl) val epsilon_0 = sub2(epsilon,zone) fun revised_energy pkl = epsilon_0 - (pkl + qkl) * tau_kl fun revised_temperature epsilon_kl theta_kl = newton_raphson ((energy_equation epsilon_kl), theta_kl) fun revised_pressure theta_kl = zonal_pressure(rho_kl, theta_kl) val p_0 = sub2(p,zone) val theta_0 = sub2(theta,zone) val epsilon_1 = revised_energy p_0 val theta_1 = revised_temperature epsilon_1 theta_0 val p_1 = revised_pressure theta_1 val epsilon_2 = revised_energy p_1 val theta_2 = revised_temperature epsilon_2 theta_1 in theta_2 end val M = array2(dimension_all_zones, constant_heat_source) in for_interior_zones (fn zone => update2(M, zone, interior_temperature zone)); M end (* * Heat conduction *) fun make_cc(alpha_prime, theta_hat) = let fun interior_cc zone = (0.0001 * pow(sub2(theta_hat,zone),2) * (Math.sqrt (abs(sub2(theta_hat,zone)))) / sub2(alpha_prime,zone)) handle Sqrt => (print (Real.toString (sub2(theta_hat, zone))); print ("\nzone =(" ^ Int.toString (#1 zone) ^ "," ^ Int.toString (#2 zone) ^ ")\n"); printarray2 theta_hat; raise Sqrt) val cc = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(cc,zone, interior_cc zone)); for_south_zones(fn zone => update2(cc,zone, reflect_north zone cc)); for_west_zones(fn zone => update2(cc,zone,reflect_east zone cc)); for_east_zones(fn zone => update2(cc,zone,reflect_west zone cc)); for_north_zones(fn zone => update2(cc,zone, reflect_south zone cc)); cc end fun make_sigma(deltat, rho_prime, alpha_prime) = let fun interior_sigma zone = sub2(rho_prime,zone)*sub2(alpha_prime,zone)*specific_heat/ deltat val M = array2(dimension_interior_zones, 0.0) fun ohandle zone = (print (Real.toString (sub2(rho_prime, zone)) ^ " "); print (Real.toString (sub2(alpha_prime, zone)) ^ " "); print (Real.toString specific_heat ^ " "); print (Real.toString deltat ^ "\n"); raise Overflow) in if !Control.trace then print ("\t\tmake_sigma:deltat = " ^ Real.toString deltat ^ "\n") else (); (*** for_interior_zones(fn zone => update2(M,zone, interior_sigma zone)) **) for_interior_zones(fn zone => (update2(M,zone, interior_sigma zone) handle Overflow => ohandle zone)); M end fun make_gamma ((r_prime,z_prime), cc, succeeding, adjacent) = let fun interior_gamma zone = let val r1 = sub2(r_prime, zone_corner_southeast zone) val z1 = sub2(z_prime, zone_corner_southeast zone) val r2 = sub2(r_prime, zone_corner_southeast (adjacent zone)) val z2 = sub2(z_prime, zone_corner_southeast (adjacent zone)) val cross_section = 0.5*(r1+r2)*(pow(r1 - r2,2)+pow(z1 - z2,2)) val (c1,c2) = (sub2(cc, zone), sub2(cc, succeeding zone)) val specific_conductivity = 2.0 * c1 * c2 / (c1 + c2) in cross_section * specific_conductivity end val M = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(M,zone,interior_gamma zone)); M end fun make_ab(theta, sigma, Gamma, preceding) = let val a = array2(dimension_all_zones, 0.0) val b = array2(dimension_all_zones, 0.0) fun interior_ab zone = let val denom = sub2(sigma, zone) + sub2(Gamma, zone) + sub2(Gamma, preceding zone) * (1.0 - sub2(a, preceding zone)) val nume1 = sub2(Gamma,zone) val nume2 = sub2(Gamma,preceding zone)*sub2(b,preceding zone) + sub2(sigma,zone) * sub2(theta,zone) in (nume1/denom, nume2 / denom) end val f = fn zone => update2(b,zone,sub2(theta,zone)) in for_north_zones f; for_south_zones f; for_west_zones f; for_east_zones f; for_interior_zones(fn zone => let val ab = interior_ab zone in update2(a,zone,#1 ab); update2(b,zone,#2 ab) end); (a,b) end fun make_theta (a, b, succeeding, int_zones) = let val theta = array2(dimension_all_zones, constant_heat_source) fun interior_theta zone = sub2(a,zone) * sub2(theta,succeeding zone)+ sub2(b,zone) in int_zones (fn (k,l) => update2(theta, (k,l), interior_theta (k,l))); theta end fun compute_heat_conduction(theta_hat, deltat, x', alpha', rho') = let val sigma = make_sigma(deltat, rho', alpha') val _ = if !Control.trace then print "\tdone make_sigma\n" else () val cc = make_cc(alpha', theta_hat) val _ = if !Control.trace then print "\tdone make_cc\n" else () val Gamma_k = make_gamma( x', cc, north, east) val _ = if !Control.trace then print "\tdone make_gamma\n" else () val (a_k,b_k) = make_ab(theta_hat, sigma, Gamma_k, north) val _ = if !Control.trace then print "\tdone make_ab\n" else () val theta_k = make_theta(a_k,b_k,south,for_north_ward_interior_zones) val _ = if !Control.trace then print "\tdone make_theta\n" else () val Gamma_l = make_gamma(x', cc, west, south) val _ = if !Control.trace then print "\tdone make_gamma\n" else () val (a_l,b_l) = make_ab(theta_k, sigma, Gamma_l, west) val _ = if !Control.trace then print "\tdone make_ab\n" else () val theta_l = make_theta(a_l,b_l,east,for_west_ward_interior_zones) val _ = if !Control.trace then print "\tdone make_theta\n" else () in (theta_l, Gamma_k, Gamma_l) end (* * Final Pressure and Energy calculation *) fun make_pressure(rho', theta') = let val p = array2(dimension_all_zones, 0.0) fun boundary_p(direction, zone) = sub1(pbb, sub2(nbc, zone)) + sub1(pb,sub2(nbc,zone)) * sub2(p, direction zone) in for_interior_zones (fn zone => update2(p,zone,zonal_pressure(sub2(rho',zone), sub2(theta',zone)))); for_south_zones(fn zone => update2(p,zone,boundary_p(north,zone))); for_east_zones(fn zone => update2(p,zone,boundary_p(west,zone))); for_west_zones(fn zone => update2(p,zone,boundary_p(east,zone))); for_north_zones(fn zone => update2(p,zone,boundary_p(south,zone))); p end fun make_energy(rho', theta') = let val epsilon' = array2(dimension_all_zones, 0.0) in for_interior_zones (fn zone => update2(epsilon', zone, zonal_energy(sub2(rho',zone), sub2(theta',zone)))); for_south_zones (fn zone => update2(epsilon',zone, reflect_north zone epsilon')); for_west_zones (fn zone => update2(epsilon',zone, reflect_east zone epsilon')); for_east_zones (fn zone => update2(epsilon',zone, reflect_west zone epsilon')); for_north_zones (fn zone => update2(epsilon',zone, reflect_south zone epsilon')); epsilon' end (* * Energy Error Calculation (page 20) *) fun compute_energy_error ((u',w'),(r',z'),p',q',epsilon',theta',rho',alpha', Gamma_k,Gamma_l,deltat) = let fun mass zone = sub2(rho',zone) * sub2(alpha',zone):real val internal_energy = sum_list (map_interior_zones (fn z => sub2(epsilon',z)*(mass z))) fun kinetic node = let val average_mass = 0.25*((mass (zone_A node)) + (mass (zone_B node)) + (mass (zone_C node)) + (mass (zone_D node))) val v_square = pow(sub2(u',node),2) + pow(sub2(w',node),2) in 0.5 * average_mass * v_square end val kinetic_energy = sum_list (map_interior_nodes kinetic) fun work_done (node1, node2) = let val (r1, r2) = (sub2(r',node1), sub2(r',node2)) val (z1, z2) = (sub2(z',node1), sub2(z',node2)) val (u1, u2) = (sub2(p',node1), sub2(p',node2)) val (w1, w2) = (sub2(z',node1), sub2(z',node2)) val (p1, p2) = (sub2(p',node1), sub2(p',node2)) val (q1, q2) = (sub2(q',node1), sub2(q',node2)) val force = 0.5*(p1+p2+q1+q2) val radius = 0.5* (r1+r2) val area = 0.5* ((r1-r2)*(u1-u2) - (z1-z2)*(w1-w2)) in force * radius * area * deltat end fun from(n,m) = if n > m then [] else n::from(n+1,m) val north_line = map (fn l => (west(kmin,l),(kmin,l))) (from(lmin+1,lmax)) val south_line = map (fn l => (west(kmax,l),(kmax,l))) (from(lmin+1,lmax)) val east_line = map (fn k => (south(k,lmax),(k,lmax))) (from(kmin+1,kmax)) val west_line = map (fn k => (south(k,lmin+1),(k,lmin+1))) (from(kmin+1,kmax)) val w1 = sum_list (map work_done north_line) val w2 = sum_list (map work_done south_line) val w3 = sum_list (map work_done east_line) val w4 = sum_list (map work_done west_line) val boundary_work = w1 + w2 + w3 + w4 fun heat_flow Gamma (zone1,zone2) = deltat * sub2(Gamma, zone1) * (sub2(theta',zone1) - sub2(theta',zone2)) val north_flow = let val k = kmin+1 in map (fn l => (north(k,l),(k,l))) (from(lmin+1,lmax)) end val south_flow = let val k = kmax in map (fn l => (south(k,l),(k,l))) (from(lmin+2,lmax-1)) end val east_flow = let val l = lmax in map (fn k => (east(k,l),(k,l))) (from(kmin+2,kmax)) end val west_flow = let val l = lmin+1 in map (fn k => (west(k,l),(k,l))) (from(kmin+2,kmax)) end val h1 = sum_list (map (heat_flow Gamma_k) north_flow) val h2 = sum_list (map (heat_flow Gamma_k) south_flow) val h3 = sum_list (map (heat_flow Gamma_l) east_flow) val h4 = sum_list (map (heat_flow Gamma_l) west_flow) val boundary_heat = h1 + h2 + h3 + h4 in internal_energy + kinetic_energy - boundary_heat - boundary_work end fun compute_time_step(d, theta_hat, theta') = let val deltat_courant = min_list (map_interior_zones (fn zone => sub2(d,zone))) val deltat_conduct = max_list (map_interior_zones (fn z => (abs(sub2(theta_hat,z) - sub2(theta', z))/ sub2(theta_hat,z)))) val deltat_minimum = min (deltat_courant, deltat_conduct) in min (deltat_maximum, deltat_minimum) end fun compute_initial_state () = let val v = (all_zero_nodes, all_zero_nodes) val x = let fun interior_position (k,l) = let val pi = 3.1415926535898 val rp = real (lmax - lmin) val z1 = real(10 + k - kmin) val zz = (~0.5 + real(l - lmin) / rp) * pi in (z1 * Math.cos zz, z1 * Math.sin zz) end in make_position_matrix interior_position end val (alpha,s) = let val (alpha_prime,s_prime) = let val A = array2(dimension_all_zones, 0.0) val S = array2(dimension_all_zones, 0.0) fun reflect_area_vol f = (f A, f S) fun u2 (f,z) = let val (a,s) = reflect_area_vol(f z) in update2(A,z,a); update2(S,z,s) end in for_interior_zones (fn z => let val (a,s) = zone_area_vol(x, z) in update2(A,z,a); update2(S,z,s) end); for_south_zones (fn z => u2 (reflect_north, z)); for_east_zones (fn z => u2 (reflect_west, z)); for_west_zones (fn z => u2 (reflect_east, z)); for_north_zones (fn z => u2 (reflect_south, z)); (A,S) end in (alpha_prime,s_prime) end val rho = let val R = array2(dimension_all_zones, 0.0) in for_all_zones (fn z => update2(R,z,1.4)); R end val theta = let val T = array2(dimension_all_zones, constant_heat_source) in for_interior_zones(fn z => update2(T,z,0.0001)); T end val p = make_pressure(rho, theta) val q = all_zero_zones val epsilon = make_energy(rho, theta) val deltat = 0.01 val c = 0.0 in (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) end fun compute_next_state state = let val (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) = state val v' = make_velocity (v, x, p, q, alpha, rho, deltat) val _ = if !Control.trace then print "done make_velocity\n" else () val x' = make_position(x,deltat,v') handle Overflow =>(printarray2 (#1 v'); printarray2 (#2 v'); raise Overflow) val _ = if !Control.trace then print "done make_position\n" else () val (alpha',rho',s') = make_area_density_volume (rho, s , x') val _ = if !Control.trace then print "done make_area_density_volume\n" else () val (q',d) = make_viscosity (p, v', x', alpha', rho') val _ = if !Control.trace then print "done make_viscosity\n" else () val theta_hat = make_temperature (p, epsilon, rho, theta, rho', q') val _ = if !Control.trace then print "done make_temperature\n" else () val (theta',Gamma_k,Gamma_l) = compute_heat_conduction (theta_hat, deltat, x', alpha', rho') val _ = if !Control.trace then print "done compute_heat_conduction\n" else () val p' = make_pressure(rho', theta') val _ = if !Control.trace then print "done make_pressure\n" else () val epsilon' = make_energy (rho', theta') val _ = if !Control.trace then print "done make_energy\n" else () val c' = compute_energy_error (v', x', p', q', epsilon', theta', rho', alpha', Gamma_k, Gamma_l, deltat) val _ = if !Control.trace then print "done compute_energy_error\n" else () val deltat' = compute_time_step (d, theta_hat, theta') val _ = if !Control.trace then print "done compute_time_step\n\n" else () in (v',x',alpha',s',rho',p',q', epsilon',theta',deltat',c') end fun runit () = let fun iter (i,state) = if i = 0 then state else (print "."; iter(i-1, compute_next_state state)) in iter(step_count, compute_initial_state()) end fun print_state ((v1,v2),(r,z),alpha,s,rho,p,q,epsilon,theta,deltat,c) = ( print "Velocity matrices = \n"; printarray2 v1; print "\n\n"; printarray2 v2; print "\n\nPosition matrices = \n"; printarray2 r; print "\n\n"; printarray2 z; print "\n\nalpha = \n"; printarray2 alpha; print "\n\ns = \n"; printarray2 s; print "\n\nrho = \n"; printarray2 rho; print "\n\nPressure = \n"; printarray2 p; print "\n\nq = \n"; printarray2 q; print "\n\nepsilon = \n"; printarray2 epsilon; print "\n\ntheta = \n"; printarray2 theta; print ("delatat = " ^ Real.toString (deltat : real)^ "\n"); print ("c = " ^ Real.toString (c : real) ^ "\n")) fun testit outstrm = print_state (runit()) fun doit () = let val (_, _, _, _, _, _, _, _, _, delta', c') = runit() val delta = Real.trunc delta' val c = Real.trunc (c' * 10000.0) in if (c = 6787 andalso delta = ~33093) then () else TextIO.output (TextIO.stdErr, "*** ERROR ***\n") end val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end; (* functor Simple *) structure Main = Simple (val grid_max=100 val step_count=1); mlton-20210117+dfsg/benchmark/tests/smith-normal-form.sml000066400000000000000000000640211416264345000232150ustar00rootroot00000000000000(* Written by Henry Cejtin (henry@sourcelight.com). *) signature MATRIX = sig type 'entry matrix val make: int * int * (int * int -> 'entry) -> 'entry matrix val height: 'entry matrix -> int val width: 'entry matrix -> int val fetch: 'entry matrix * int * int -> 'entry val fetchRow: 'entry matrix * int -> int -> 'entry val fetchCol: 'entry matrix * int -> int -> 'entry val store: 'entry matrix * int * int * 'entry -> unit val storeRow: 'entry matrix * int -> int * 'entry -> unit val storeCol: 'entry matrix * int -> int * 'entry -> unit val rowSwap: 'entry matrix * int * int -> unit val colSwap: 'entry matrix * int * int -> unit val rowOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val colOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val copy: 'entry matrix -> 'entry matrix val map: 'entry1 matrix * ('entry1 -> 'entry2) -> 'entry2 matrix val toString: 'entry matrix * ('entry -> string) -> string end structure Matrix:> MATRIX = struct type 'entry matrix = int * int * 'entry array exception sizeError exception index exception foldError fun make (height: int, width: int, generator: int * int -> 'entry) : 'entry matrix = if height < 0 orelse width < 0 then raise sizeError else (height, width, Array.tabulate (height*width, fn z => generator (z div width, z mod width))) fun height (height, _, _) = height fun width (width, _, _) = width fun fetch ((height, width, mat), row, col) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.sub (mat, col + width*row) else raise index fun fetchRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn col => if 0 <= col andalso col < width then Array.sub (mat, col + offset) else raise index end else raise index fun fetchCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn row => if 0 <= row andalso row < height then Array.sub (mat, col + width*row) else raise index else raise index fun store ((height, width, mat), row, col, entry) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.update (mat, col + width*row, entry) else raise index fun storeRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn (col, entry) => if 0 <= col andalso col < width then Array.update (mat, col + offset, entry) else raise index end else raise index fun storeCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn (row, entry) => if 0 <= row andalso row < height then Array.update (mat, col + width*row, entry) else raise index else raise index fun swapLoop (from1: int -> 'entry, to1: int * 'entry -> unit, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int): unit = let fun loop (i: int): unit = if i = limit then () else let val tmp = from1 i in to1 (i, from2 i); to2 (i, tmp); loop (i + 1) end in loop 0 end fun rowSwap (mat as (height, width, _), row1, row2): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height then if row1 = row2 then () else swapLoop (fetchRow (mat, row1), storeRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width) else raise index fun colSwap (mat as (height, width, _), col1, col2): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width then if col1 = col2 then () else swapLoop (fetchCol (mat, col1), storeCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height) else raise index fun opLoop (from1: int -> 'entry, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int, f: 'entry * 'entry -> 'entry): unit = let fun loop (i: int): unit = if i = limit then () else ( to2 (i, f (from1 i, from2 i)); loop (i + 1)) in loop 0 end fun rowOp (mat as (height, width, _), row1, row2, f: 'entry * 'entry -> 'entry): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height andalso row1 <> row2 then opLoop (fetchRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width, f) else raise index fun colOp (mat as (height, width, _), col1, col2, f: 'entry * 'entry -> 'entry): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width andalso col1 <> col2 then opLoop (fetchCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height, f) else raise index fun copy ((height, width, mat)) = (height, width, Array.tabulate (Array.length mat, fn i => Array.sub (mat, i))) fun map ((height, width, mat: 'entry1 Array.array), f: 'entry1 -> 'entry2) : 'entry2 matrix = (height, width, Array.tabulate (Array.length mat, fn i => f (Array.sub (mat, i)))) (* Natural fold a range of integers in reverse. *) fun naturalFold (limit: int, state: 'state, folder: int * 'state -> 'state): 'state = let fun loop (i: int, state: 'state) = if i = 0 then state else loop (i - 1, folder (i - 1, state)) in if limit < 0 then raise foldError else loop (limit, state) end local val blank8 = Byte.charToByte #" " fun makeBlanks size = let val blanks = Word8Vector.tabulate (size, fn _ => blank8) in Byte.bytesToString blanks end in fun toString (mat: 'entry matrix, f: 'entry -> string): string = let val mat as (height, width, _) = map (mat, f) fun maxSize from (i, width) = Int.max (String.size (from i), width) fun colWidth col = naturalFold (height, 0, maxSize (fetchCol (mat, col))) val widths = Vector.tabulate (width, colWidth) fun doRow (row: int, ac: string list): string list = let val from = fetchRow (mat, row) fun loop (col: int, ac: string list) = let val next = from col val ac = next::ac val s = String.size next val pad = Vector.sub (widths, col) - s val ac = if pad <= 0 then ac else (makeBlanks pad)::ac in if col = 0 then ac else loop (col - 1, " "::ac) end val ac = "\n"::ac in if width = 0 then ac else loop (width - 1, ac) end val pieces = naturalFold (height, [], doRow) in String.concat pieces end end end val zero = IntInf.fromInt 0 fun smaller (a: IntInf.int, b: IntInf.int): bool = (not (a = zero)) andalso (b = zero orelse IntInf.< (IntInf.abs a , IntInf.abs b)) fun smithNormalForm (mat: IntInf.int Matrix.matrix): IntInf.int Matrix.matrix = let val height = Matrix.height mat val width = Matrix.width mat val mat = Matrix.copy mat val range = Int.min (width, height) fun dd pos = let val matCol = Matrix.fetchCol (mat, pos) val matRow = Matrix.fetchRow (mat, pos) val _ = print ("dd: pos = " ^ (Int.toString pos) ^ "\n") fun swapRowLoop (best, bestRow, bestCol, row) = if row >= height then (Matrix.rowSwap (mat, pos, bestRow); Matrix.colSwap (mat, pos, bestCol)) else let val matRow = Matrix.fetchRow (mat, row) fun swapColLoop (best, bestRow, bestCol, col) = if col >= width then swapRowLoop (best, bestRow, bestCol, row + 1) else let val next = matRow col in if smaller (next, best) then swapColLoop (next, row, col, col + 1) else swapColLoop (best, bestRow, bestCol, col + 1) end in swapColLoop (best, bestRow, bestCol, pos) end fun rowLoop row = if row < height then if (matCol row) = zero then rowLoop (row + 1) else (Matrix.rowOp (mat, pos, row, let val x = IntInf.~ (IntInf.quot(matCol row, matCol pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matCol row) = zero then rowLoop (row + 1) else hitPosAgain ()) else let fun colLoop col = if col < width then if (matRow col) = zero then colLoop (col + 1) else (Matrix.colOp (mat, pos, col, let val x = IntInf.~ (IntInf.quot (matRow col, matRow pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matRow col) = zero then colLoop (col + 1) else hitPosAgain ()) else () in colLoop (pos + 1) end and hitPosAgain () = (swapRowLoop (zero, pos, pos, pos); rowLoop (pos + 1)) in hitPosAgain () end fun loop pos = if pos = range then mat else (dd pos; loop (pos + 1)) in loop 0 end val table = [[ 8, ~3, 1, 3, 6, 9, ~2, 4, ~9, ~9, 2, 3, 8, ~1, 3, ~5, 4, ~3, ~5, ~6, 8, 1, 4, ~5, 7, ~4, ~4, ~7, 7, 1, 4, ~3, 8, 4, ~4, ~8, 5, ~9, 3, ~4, 1, 9, ~8, ~6, ~2, 8, ~9, ~5, ~3, ~3], [ 0, 8, ~6, ~2, ~3, 4, 5, ~2, 7, ~7, ~6, ~7, ~3, ~4, 9, 7, ~3, 3, 0, 3, 3, ~8, ~8, 2, 3, 8, 3, ~2, ~4, 3, ~6, ~6, ~2, 6, 5, ~1, ~3, 1, 8, ~8, 2, 1, ~7, ~7, ~7, ~3, ~6, 6, ~4, ~9], [ 0, ~5, 8, ~9, 2, 4, 2, 7, ~4, 9, ~3, 6, ~2, 3, ~3, 0, ~9, 5, 8, ~1, 2, ~8, 3, 4, ~6, 5, ~6, ~5, ~8, 0, ~5, 3, ~2, ~5, 8, 7, ~1, 1, ~1, 7, 6, 3, 6, 5, 6, 8, 7, 9, 7, ~3], [ 5, 4, 7, 2, 3, ~9, 7, ~7, 3, ~8, 7, 5, 5, ~2, ~6, ~3, 6, 5, 3, ~1, ~1, 4, 5, ~5, 5, 9, 9, 3, 8, ~3, ~1, 9, ~9, 6, ~7, 7, 4, 6, ~8, ~9, 0, ~3, ~2, ~7, 1, ~2, ~6, 7, 7, 7], [ 2, 9, 9, 3, ~4, 0, 9, 2, 5, 3, ~5, ~3, ~1, 1, 8, ~6, 2, ~4, ~8, ~7, ~8, 4, 5, 8, ~1, ~1, 7, 2, 5, 5, ~4, ~7, ~3, ~7, 6, ~4, ~5, ~8, ~5, ~9, ~8, 5, ~5, ~5, 0, 8, 8, 6, 4, ~1], [ 5, 5, 1, ~7, 3, ~5, 4, 9, 3, 4, 4, ~5, 7, ~1, 7, 4, ~7, 7, ~7, ~2, 9, ~9, 0, ~4, ~4, 0, 2, 6, 3, ~1, 6, 6, 8, ~6, ~4, ~9, 3, ~2, ~5, 5, ~3, 2, ~1, ~6, 9, 3, ~3, ~8, ~9, 7], [ 7, 1, 2, 7, 6, 5, ~6, ~3, ~4, ~8, 0, 9, 6, 1, 2, ~5, 4, 4, 4, ~6, ~7, ~9, ~6, 2, ~4, 5, ~2, 1, 0, 1, ~8, 7, ~7, ~5, 4, 1, ~5, 4, ~4, ~2, ~3, 1, 1, 3, 4, ~4, ~5, 9, 8, ~2], [ 6, 2, ~1, ~8, 4, ~7, 7, ~3, ~2, ~5, 3, 0, 3, ~9, 3, 3, 9, ~1, 4, 8, ~9, 6, ~5, 9, 5, ~1, ~1, ~9, 7, ~2, 3, 9, 8, 9, 2, 7, 7, 6, ~1, ~1, ~2, ~2, ~7, 3, ~6, 0, ~9, 4, 3, 7], [ 0, ~6, ~3, ~7, ~1, 5, ~2, 8, ~5, ~3, ~8, 7, ~2, ~2, 0, ~8, 4, 8, 9, ~5, ~4, ~8, ~1, 7, 1, 1, 6, ~9, ~4, 0, 8, 4, 3, ~7, 6, 0, 1, 8, 6, ~1, ~1, ~7, 9, ~9, ~5, ~2, ~2, ~1, 1, 0], [~4, 9, 6, ~3, ~2, ~6, ~3, 4, 8, ~8, 1, ~5, 9, 7, 9, 7, ~9, ~6, 6, 1, ~3, 3, ~3, ~7, 1, 7, ~7, 0, ~2, 7, ~4, ~6, 0, 1, ~3, ~5, ~9, ~7, 8, 4, 9, ~8, ~8, ~7, ~6, 7, 6, ~3, ~8, 5], [ 6, 7, ~5, ~9, 6, 1, 8, 4, ~2, 7, ~7, ~1, ~9, 1, ~6, ~5, 4, 9, 6, 0, ~8, ~3, 1, ~3, 8, ~3, 2, 9, ~3, ~9, ~1, ~3, 4, 3, 2, ~9, ~5, ~3, 8, ~4, 8, 5, ~4, 7, 6, ~8, 7, 6, ~5, 5], [ 1, 7, ~8, ~9, ~7, ~3, 8, 9, ~7, ~1, ~7, 4, 0, 0, 1, ~5, 9, ~8, ~1, ~2, 3, 5, 9, ~9, 5, 4, ~9, 1, ~4, ~2, 3, ~4, 8, ~6, ~4, ~8, ~5, ~5, 4, ~2, ~4, ~1, ~9, ~5, 2, ~9, 2, ~9, ~2, ~3], [~5, ~4, ~4, 9, 2, 7, ~2, 6, 7, 2, ~9, 4, 2, 7, 8, ~9, 2, 5, 3, 9, 6, 3, 0, ~7, ~6, ~7, 6, ~2, 9, ~3, ~6, 9, ~9, 2, 2, ~6, ~1, 4, ~3, 3, 0, 6, ~3, 4, 9, 9, ~6, 5, 5, ~5], [ 5, ~7, 8, ~4, 8, 8, ~4, ~9, 6, 0, ~3, 6, 0, 8, 8, ~6, ~2, 5, 4, ~1, ~8, 1, ~3, ~1, 2, 3, ~9, ~9, ~5, 1, 8, ~5, ~3, 0, ~4, ~9, 0, ~6, 3, ~1, ~7, 0, 8, 9, ~6, ~1, ~9, 1, ~6, 2], [ 7, ~5, ~1, 5, ~2, 7, 0, ~7, ~1, 8, 8, ~3, 9, ~5, 7, ~8, ~8, ~4, 3, 2, ~1, 8, ~2, 1, 2, 5, 0, ~6, 7, 3, 3, 7, ~5, 5, ~1, 1, 0, ~8, 1, 0, 0, ~4, 6, 9, ~5, ~6, 3, ~5, 8, 5], [~4, ~2, 3, ~3, ~1, 2, ~2, ~1, ~9, ~5, 1, 0, 0, 2, 9, ~3, ~9, 2, 9, 3, 8, ~3, 4, 8, 8, 3, ~3, ~1, ~4, 4, ~6, ~9, 5, ~2, 1, 3, ~7, ~5, ~6, ~5, ~8, 4, ~8, ~3, 5, 0, 7, ~9, 6, 2], [ 5, 1, 4, ~3, ~1, ~9, 5, ~8, ~8, 6, 1, 1, ~2, 7, 5, 6, ~4, 2, ~7, 0, ~7, ~3, ~5, 9, 3, 4, ~6, 8, ~4, 3, 6, 0, 2, 3, ~6, 3, 9, 4, 1, ~4, 6, ~5, ~7, 0, ~1, ~8, ~3, ~9, 9, 7], [ 2, ~6, ~1, 8, 4, ~3, ~1, ~6, ~2, ~8, ~2, ~1, ~1, ~5, ~9, ~8, 9, ~9, 5, 1, 9, ~1, ~6, 9, ~7, 2, 8, ~7, 4, ~9, 7, 6, ~2, 1, ~2, ~7, 8, 0, 5, 0, ~5, ~7, ~6, 0, 4, 0, 3, ~8, 5, 4], [~2, 9, ~9, ~6, 1, ~8, 8, 4, ~6, 8, 1, ~3, ~7, 8, ~5, 2, ~8, 1, 3, ~2, 6, 6, 6, 1, 0, 0, ~7, 7, ~3, ~3, 0, ~4, 3, ~7, ~6, 7, 5, 9, ~5, 7, ~8, 2, 3, ~8, ~7, 6, ~5, ~5, ~8, ~9], [~7, ~4, 4, 1, ~1, ~3, ~8, 3, 7, 9, 8, 3, 0, 4, 4, ~1, ~5, 4, 2, 2, 0, 6, ~6, 2, ~9, 8, ~9, 3, ~2, 2, 6, 6, 1, 7, 1, 0, ~8, 2, 3, ~3, 8, 9, 5, 5, ~6, 4, ~7, ~4, ~2, ~3], [~5, 8, 6, 1, ~6, ~6, 6, 1, 1, ~3, ~9, ~6, 2, ~7, 2, ~1, 6, ~6, 0, 2, ~7, 8, ~8, 4, 9, ~3, 9, ~7, ~9, ~6, ~4, ~4, ~5, 8, 2, ~5, ~4, ~3, 5, 2, 1, ~3, ~3, ~7, ~9, 3, 7, ~7, 3, ~8], [~4, ~7, ~2, 2, ~4, ~2, 6, ~3, ~1, ~4, 0, ~5, 9, 7, ~6, ~9, 7, ~9, ~6, 2, ~3, 1, 5, ~9, 4, ~5, 4, ~9, 1, ~2, ~2, 4, 0, 4, ~8, ~8, 3, ~1, ~5, ~4, ~9, ~7, 7, 6, 3, ~9, 6, 4, ~4, ~7], [~9, 6, 6, ~5, ~1, ~7, 4, ~9, 4, ~1, 6, ~4, 7, 2, 8, 7, 3, 1, ~7, 7, 7, 9, 8, ~9, 7, 2, 1, 2, ~8, 4, 5, 6, 7, 2, ~7, 6, 8, 4, ~9, 7, ~5, 6, 9, ~1, 9, 2, 0, 9, 3, 6], [ 4, ~3, 8, 0, ~2, ~2, 2, ~3, 8, 3, 1, ~8, ~5, ~2, 5, 6, 8, 0, ~3, 4, ~2, 4, ~9, ~5, 7, 6, ~4, ~7, 2, 4, ~3, ~8, ~9, 9, 8, ~9, 3, ~7, 4, ~7, ~5, 4, 9, 3, ~6, ~3, ~7, 4, 2, ~2], [~8, ~8, 6, ~2, ~6, 8, ~3, 3, ~1, ~7, 1, 9, 1, 7, ~6, 8, ~2, ~9, ~1, 3, ~4, 7, 8, ~1, 9, ~9, 6, ~3, 5, 0, 2, 5, ~1, ~6, ~6, 1, 8, 6, ~3, ~9, ~1, 9, ~2, 9, ~8, ~7, ~3, 6, ~3, ~3], [ 5, ~2, 3, 0, ~9, ~8, ~6, 1, 8, 0, 1, 2, ~8, ~2, 0, ~9, ~8, 0, 5, ~3, ~4, 5, 6, ~2, ~5, 0, ~9, 9, ~9, ~5, 9, 9, ~5, ~2, 4, 3, 8, ~8, ~7, 5, ~3, ~2, 2, 3, 9, 7, ~1, 0, 4, ~1], [~4, 5, ~5, 7, 8, 9, 7, ~3, 1, 9, ~7, ~1, 8, ~5, ~1, 2, ~8, 1, 0, 9, ~8, ~1, 6, ~1, 9, ~8, 7, 4, ~8, 7, 0, ~6, 2, 3, 7, 4, ~3, ~5, 9, ~3, 0, 6, ~9, 2, 4, ~8, 6, ~7, 9, 1], [ 7, 0, ~9, 6, 8, 2, 2, 5, ~6, ~6, 9, ~5, 9, 2, 2, ~8, 0, ~6, ~9, ~6, ~4, ~9, 8, ~2, 9, 7, ~5, ~1, 7, 2, ~7, 7, ~1, ~3, 6, 6, 1, ~4, 0, ~1, ~6, ~5, 6, ~7, ~3, ~2, 8, 2, ~9, 8], [ 8, ~7, ~9, ~6, 9, ~7, ~7, 6, ~8, 9, 5, ~4, 1, ~7, ~8, ~6, ~3, 8, ~8, 1, ~8, 6, 9, ~3, ~7, 7, 1, 6, 1, 0, 8, ~5, ~8, 8, ~9, 0, 4, 4, 3, ~4, 6, ~3, ~9, 0, 4, ~4, ~5, ~9, ~5, ~8], [~3, ~2, 8, 1, ~1, ~1, ~4, 3, 7, ~2, ~9, 9, ~8, ~9, 6, ~4, 7, ~1, ~5, ~3, ~9, 0, ~3, 0, 7, 9, 1, ~2, 7, ~9, ~6, 3, 3, ~4, ~7, ~3, ~4, ~8, ~2, ~3, ~9, ~2, ~6, 3, ~6, ~4, 7, ~5, ~8, ~1], [~9, ~9, ~2, ~9, ~9, 9, 6, 6, 7, 5, ~1, ~2, 1, 5, 2, ~3, ~4, 1, ~6, 0, ~3, ~9, ~1, 7, 0, ~9, 5, ~2, ~2, 5, 3, 4, ~1, 6, ~6, 3, ~6, 7, ~1, 5, ~8, ~4, ~2, ~2, ~6, ~5, ~6, 3, ~1, 4], [ 7, 7, 8, 7, 6, 1, ~2, 5, ~6, 9, 4, 8, 5, 0, ~4, ~2, ~2, ~5, ~2, ~6, 9, ~8, ~2, ~5, ~9, 3, ~6, ~3, ~4, ~5, ~2, 6, 1, 6, ~5, 0, ~3, ~2, 4, ~6, 1, 6, ~1, 3, ~9, 2, ~3, 1, 5, ~6], [ 6, 4, ~7, 3, ~7, 9, 1, ~7, ~8, 0, ~6, 8, 4, 1, 9, 6, 8, 3, 0, 9, 0, 4, 9, ~7, ~7, 1, 5, 1, ~5, 6, 9, 2, 4, 1, ~9, 8, 4, 5, 8, 3, 2, ~9, ~6, ~9, 9, ~9, 7, ~6, ~4, 3], [~3, ~9, ~4, 2, 3, 9, ~9, 8, ~9, 9, ~4, ~9, ~5, 5, 0, 7, 3, ~5, ~8, 2, ~3, 0, ~9, ~3, 1, 9, 4, 5, ~1, 8, 0, ~4, ~2, 9, ~4, ~1, 3, 5, 9, ~1, 1, 4, ~8, ~2, ~3, 5, 1, 5, ~6, 7], [ 9, ~3, 2, ~9, 3, 4, 0, 7, ~5, 9, 0, ~6, 7, ~2, 3, ~7, 2, ~5, ~2, 6, 3, ~9, ~5, ~9, 5, 2, ~5, ~3, 8, ~5, 6, 2, 9, ~7, ~7, ~7, ~6, 9, ~3, 6, 0, 6, ~6, ~9, 4, ~3, ~9, 0, ~4, ~9], [~4, ~8, 8, ~7, 7, 0, ~6, ~6, 8, ~9, ~4, 5, ~3, ~1, 7, ~5, ~6, ~1, 8, 6, ~2, 1, ~1, 5, ~9, 1, ~1, ~7, ~6, ~6, ~6, ~4, 6, 3, ~5, ~5, ~6, 2, 3, ~6, ~8, ~3, 8, ~2, ~5, ~4, ~3, 1, 4, ~4], [ 4, ~6, 2, 6, 2, ~8, 8, 5, 8, ~2, 0, ~6, ~1, ~6, ~2, 2, 6, ~9, ~7, ~6, ~4, ~4, ~7, ~2, 8, 6, 3, ~7, ~6, 8, 2, 3, 4, 5, 3, 4, ~6, 8, 8, ~1, 4, ~5, 6, 2, 8, ~3, ~9, ~2, 6, 7], [ 3, ~4, 0, ~3, ~5, 0, ~2, ~6, ~2, 8, 5, ~9, ~4, ~8, ~6, 0, 8, 9, 1, ~2, 8, 2, ~2, 8, 9, 3, 3, 5, ~9, ~3, ~2, 7, 2, 9, 0, 4, 8, ~9, 0, ~6, 9, ~9, 9, ~4, 8, ~8, ~8, 2, ~3, 2], [~1, 3, ~9, ~8, ~7, 6, ~6, 3, 0, 5, ~5, 1, 2, ~2, ~3, 7, 7, 3, ~4, ~2, ~9, ~5, ~1, 9, 6, 8, 2, 8, 7, ~3, 4, 6, 6, 0, ~2, 2, ~7, ~7, 6, ~3, 8, 2, 1, 0, 8, ~1, 3, 9, 8, 6], [ 1, ~2, ~3, 6, 5, 5, ~6, ~4, ~5, 1, 1, 6, ~7, ~4, ~3, 4, 4, ~8, ~9, 7, ~2, ~3, ~7, ~2, 1, 2, 0, 8, ~6, ~5, ~5, 7, 8, 5, ~2, 3, 9, 0, 5, 1, 3, ~4, ~6, 1, 4, ~9, ~2, 5, 4, 3], [ 3, 3, 9, ~2, 6, 9, 4, 9, 4, ~8, 5, ~1, 3, ~2, 1, ~7, ~3, 2, 2, 0, ~3, 3, 8, 2, 0, ~5, 7, 1, 4, ~8, 8, ~9, ~1, 1, ~9, ~4, 5, 2, 2, 8, 6, 1, 6, ~2, 2, 7, 1, ~6, ~1, ~1], [ 4, ~2, 4, ~1, ~5, ~1, 5, ~2, 3, ~4, ~5, 0, 2, ~4, 6, 4, ~3, 2, 2, 5, ~6, ~7, ~9, ~1, ~9, ~9, 6, 0, 6, 5, 9, ~1, 3, ~3, ~8, 8, ~8, 8, 4, 5, ~1, ~5, 1, 0, 3, ~2, 5, 6, 6, 5], [~4, 9, 6, 8, ~9, 5, 5, ~3, ~7, 7, 6, 8, ~8, 0, 4, ~1, 9, 5, ~7, 0, ~1, ~2, 3, 6, 0, 4, ~3, 1, 4, 6, 4, 0, 5, ~1, 7, ~7, ~6, ~8, ~3, ~6, 7, ~1, ~3, ~2, ~3, ~5, 3, 1, ~8, ~9], [~6, 4, ~5, 9, 9, ~7, ~1, ~8, ~4, 2, ~6, 0, ~6, ~6, 7, 6, 0, 1, 7, ~7, 0, ~4, ~6, ~8, ~9, 5, ~6, ~9, 2, ~7, ~2, ~6, 9, 4, ~5, 0, 4, ~4, ~5, 6, 9, 1, ~6, ~5, 3, ~1, 7, ~7, ~6, 7], [~8, 7, 7, ~6, 7, ~4, 8, 0, ~9, ~8, ~3, 7, ~3, 3, 8, ~7, ~2, ~7, 5, 5, ~5, 4, 6, 2, 4, 1, 4, ~9, ~3, 8, 8, ~9, ~4, ~2, 1, ~3, 1, 3, 9, ~5, ~8, ~2, 7, 8, 9, 2, 0, 1, ~9, 6], [~7, 1, ~9, 5, ~5, ~5, 7, 6, ~5, ~9, ~6, ~8, ~6, 9, 7, 9, 0, ~5, 7, 7, ~6, 4, 5, ~9, ~1, ~2, ~7, 3, ~5, ~2, ~5, 5, ~3, ~4, ~2, ~8, 2, ~8, 0, ~8, 0, ~8, 9, 8, ~5, ~5, 1, 3, 5, ~4], [~8, ~8, 0, ~5, ~8, ~6, 3, ~6, ~4, 6, 1, ~5, ~6, ~8, ~4, ~6, ~2, ~6, 6, ~4, 8, 8, 4, ~5, ~1, 0, 9, ~8, ~3, ~1, ~8, 7, ~3, 0, ~7, 1, ~7, ~1, ~7, 3, ~7, 3, ~4, ~8, 8, ~7, ~9, ~8, 3, 2], [ 3, 6, 8, ~9, 7, 1, ~9, 9, 3, 8, 6, 4, ~2, 1, ~8, 4, ~7, ~4, ~3, 3, ~5, ~6, ~7, ~2, 0, ~4, 5, 2, 5, 6, 3, ~8, 2, ~5, ~7, 6, 8, ~2, ~5, ~4, 9, 9, 2, ~2, ~2, 7, 4, 4, ~2, 3], [ 6, 6, ~5, ~2, ~8, ~2, ~9, 0, 2, 4, ~6, ~9, 9, 0, ~8, ~3, ~1, ~2, ~1, 6, 8, 2, ~9, 5, ~2, 1, 7, ~6, 5, 1, ~1, 4, ~4, ~7, ~6, ~3, ~8, 2, 2, 5, 5, ~6, 5, 3, 3, 7, 4, 7, ~3, ~9], [~9, 6, ~4, 1, 3, ~8, ~8, ~8, ~1, 5, 1, 1, ~1, 6, 5, 1, ~1, 5, ~8, 8, ~7, ~5, ~1, ~1, 6, ~8, ~3, ~1, ~2, ~6, ~5, ~5, ~6, 0, 2, 2, 7, ~1, ~5, ~7, ~1, ~3, 7, 6, 0, 2, 4, ~5, 0, ~4]] fun f (x, y) = List.nth (List.nth (table, x), y) fun show m = print (Matrix.toString (m, IntInf.toString)) structure Main = struct fun snf() = let val dim = 35 val big = Matrix.map (Matrix.make (dim, dim, f), IntInf.fromInt) val entry = Matrix.fetch(smithNormalForm big, dim - 1, dim - 1) (* val _ = print (concat [IntInf.toString entry, "\n"]) *) in if entry = valOf (IntInf.fromString "~1027954043102083189860753402541358641712697245") then () else raise Fail "bug" end fun doit n = let val rec loop = fn 0 => () | n => (snf(); loop(n - 1)) in loop n end end mlton-20210117+dfsg/benchmark/tests/string-concat.sml000066400000000000000000000011351416264345000224120ustar00rootroot00000000000000structure Main = struct val alpha = CharVector.tabulate (26, fn i => chr (ord #"A" + i)) fun doit n = let val len = 2017 val s = CharVector.tabulate (len, fn i => String.sub (alpha, i mod 26)) fun loop n = if n < 0 then () else if 468705 = CharVector.foldl (fn (c, s) => s + ord c) 0 (String.concat [s, s, s]) then loop (n - 1) else raise Fail "bug" in loop (n * 10000) end end mlton-20210117+dfsg/benchmark/tests/tailfib.sml000066400000000000000000000006551416264345000212570ustar00rootroot00000000000000 fun fib'(0,a,b) = a | fib'(n,a,b) = fib'(n-1,a+b,a) fun fib n = fib'(n,0,1) structure Main = struct fun doit() = if 701408733 <> fib 44 then raise Fail "bug" else () val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop (n * 1000000) end end mlton-20210117+dfsg/benchmark/tests/tailmerge.sml000066400000000000000000000020351416264345000216100ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) fun merge (l1: int list, l2) = let fun revapp (l, acc) = case l of [] => acc | h :: t => revapp (t, h :: acc) fun loop (l1, l2, acc) = case (l1, l2) of ([], _) => revapp (acc, l2) | (_, []) => revapp (acc, l1) | (x1 :: l1', x2 :: l2') => if x1 <= x2 then loop (l1', l2, x1 :: acc) else loop (l1, l2', x2 :: acc) in loop (l1, l2, []) end structure Main = struct fun doit size = let val len = 100000 val l1 = List.tabulate (len, fn i => i * 2) val l2 = List.tabulate (len, fn i => i * 2 + 1) fun test () = if 0 = hd (merge (l1, l2)) then () else raise Fail "bug" fun loop n = if n = 0 then () else (test (); loop (n - 1)) in loop size end end mlton-20210117+dfsg/benchmark/tests/tak.sml000066400000000000000000000007041416264345000204170ustar00rootroot00000000000000fun tak (x,y,z) = if not (y < x) then z else tak (tak (x - 1, y, z), tak (y - 1, z, x), tak (z - 1, x, y)) structure Main = struct fun doit n = if n = 0 then () else let val _ = if 22 <> tak (33,22,11) then raise Fail "bug" else () in doit (n - 1) end end mlton-20210117+dfsg/benchmark/tests/tensor.sml000066400000000000000000003153411416264345000211600ustar00rootroot00000000000000(* Obtained at http://www.arrakis.es/~worm/ *) signature MONO_VECTOR = sig type vector type elem val maxLen : int val fromList : elem list -> vector val tabulate : (int * (int -> elem)) -> vector val length : vector -> int val sub : (vector * int) -> elem val extract : (vector * int * int option) -> vector val concat : vector list -> vector val mapi : ((int * elem) -> elem) -> (vector * int * int option) -> vector val map : (elem -> elem) -> vector -> vector val appi : ((int * elem) -> unit) -> (vector * int * int option) -> unit val app : (elem -> unit) -> vector -> unit val foldli : ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* COPYRIGHT Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by Juan Jose Garcia Ripoll. 4. The name of Juan Jose Garcia Ripoll may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY JUAN JOSE GARCIA RIPOLL ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *) structure EvalTimer = struct local val TIME = ref (Time.now()) in fun timerOn () = (TIME := Time.now(); ()) fun timerRead () = Time.toMilliseconds(Time.-(Time.now(),!TIME)) fun timerOff () = let val delta = timerRead() in print "Elapsed: "; print (LargeInt.toString delta); print " ms\n" end fun time f = (timerOn(); f(); timerOff()) end end structure Loop = struct fun all (a, b, f) = if a > b then true else if f a then all (a+1, b, f) else false fun any (a, b, f) = if a > b then false else if f a then true else any (a+1, b, f) fun app (a, b, f) = if a < b then (f a; app (a+1, b, f)) else () fun app' (a, b, d, f) = if a < b then (f a; app' (a+d, b, d, f)) else () fun appi' (a, b, d, f) = if a < b then (f a; appi' (a+d, b, d, f)) else () end (* INDEX -Signature- Indices are a enumerable finite set of data with an order and a map to a continous nonnegative interval of integers. In the sample implementation, Index, each index is a list of integers, [i1,...,in] and each set of indices is defined by a shape, which has the same shape of an index but with each integer incremented by one shape = [k1,...,kn] 0 <= i1 < k1 type storage = RowMajor | ColumnMajor order : storage Identifies: 1) the underlying algorithms for this structure 2) the most significant index 3) the index that varies more slowly 4) the total order RowMajor means that first index is most significant and varies more slowly, while ColumnMajor means that last index is the most significant and varies more slowly. For instance RowMajor => [0,0]<[0,1]<[1,0]<[1,1] (C, C++, Pascal) ColumnMajor => [0,0]>[1,0]>[0,1]>[1,1] (Fortran) last shape first shape Returns the last/first index that belongs to the sed defined by 'shape'. inBounds shape index Checkes whether 'index' belongs to the set defined by 'shape'. toInt shape index As we said, indices can be sorted and mapped to a finite set of integers. 'toInt' obtaines the integer number that corresponds to a certain index. indexer shape It is equivalent to the partial evaluation 'toInt shape' but optimized for 'shape'. next shape index prev shape index next' shape index prev' shape index Obtain the following or previous index to the one we supply. next and prev return an object of type 'index option' so that if there is no such following/previous, the output is NONE. On the other hand, next'/prev' raise an exception when the output is not well defined and their output is always of type index. next/prev/next'/prev' raise an exception if 'index' does not belong to the set of 'shape'. all shape f any shape f app shape f Iterates 'f' over every index of the set defined by 'shape'. 'all' stops when 'f' first returns false, 'any' stops when 'f' first returns true and 'app' does not stop and discards the output of 'f'. compare(a,b) Returns LESS/GREATER/EQUAL according to the total order which is defined in the set of all indices. <,>,eq,<=,>=,<> Reduced comparisons which are defined in terms of 'compare'. validShape t validIndex t Checks whether 't' conforms a valid shape or index. iteri shape f *) signature INDEX = sig type t type indexer = t -> int datatype storage = RowMajor | ColumnMajor exception Index exception Shape val order : storage val toInt : t -> t -> int val length : t -> int val first : t -> t val last : t -> t val next : t -> t -> t option val prev : t -> t -> t option val next' : t -> t -> t val prev' : t -> t -> t val indexer : t -> (t -> int) val inBounds : t -> t -> bool val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val eq : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val <> : t * t -> bool val - : t * t -> t val validShape : t -> bool val validIndex : t -> bool val all : t -> (t -> bool) -> bool val any : t -> (t -> bool) -> bool val app : t -> (t -> unit) -> unit end structure Index : INDEX = struct type t = int list type indexer = t -> int datatype storage = RowMajor | ColumnMajor exception Index exception Shape val order = ColumnMajor fun validShape shape = List.all (fn x => x > 0) shape fun validIndex index = List.all (fn x => x >= 0) index fun toInt shape index = let fun loop ([], [], accum, _) = accum | loop ([], _, _, _) = raise Index | loop (_, [], _, _) = raise Index | loop (i::ri, l::rl, accum, fac) = if (i >= 0) andalso (i < l) then loop (ri, rl, i*fac + accum, fac*l) else raise Index in loop (index, shape, 0, 1) end (* ----- CACHED LINEAR INDEXER ----- An indexer is a function that takes a list of indices, validates it and produces a nonnegative integer number. In short, the indexer is the mapper from indices to element positions in arrays. 'indexer' builds such a mapper by optimizing the most common cases, which are 1d and 2d tensors. *) local fun doindexer [] _ = raise Shape | doindexer [a] [dx] = let fun f [x] = if (x > 0) andalso (x < a) then x else raise Index | f _ = raise Index in f end | doindexer [a,b] [dx, dy] = let fun f [x,y] = if ((x > 0) andalso (x < a) andalso (y > 0) andalso (y < b)) then x + dy * y else raise Index | f _ = raise Index in f end | doindexer [a,b,c] [dx,dy,dz] = let fun f [x,y,z] = if ((x > 0) andalso (x < a) andalso (y > 0) andalso (y < b) andalso (z > 0) andalso (z < c)) then x + dy * y + dz * z else raise Index | f _ = raise Index in f end | doindexer shape memo = let fun f [] [] accum [] = accum | f _ _ _ [] = raise Index | f (fac::rf) (ndx::ri) accum (dim::rd) = if (ndx >= 0) andalso (ndx < dim) then f rf ri (accum + ndx * fac) rd else raise Index in f shape memo 0 end in fun indexer shape = let fun memoize accum [] = [] | memoize accum (dim::rd) = accum :: (memoize (dim * accum) rd) in if validShape shape then doindexer shape (memoize 1 shape) else raise Shape end end fun length shape = let fun prod (a,b) = if b < 0 then raise Shape else a * b in foldl prod 1 shape end fun first shape = map (fn x => 0) shape fun last [] = [] | last (size :: rest) = if size < 1 then raise Shape else size - 1 :: last rest fun next' [] [] = raise Subscript | next' _ [] = raise Index | next' [] _ = raise Index | next' (dimension::restd) (index::resti) = if (index + 1) < dimension then (index + 1) :: resti else 0 :: (next' restd resti) fun prev' [] [] = raise Subscript | prev' _ [] = raise Index | prev' [] _ = raise Index | prev' (dimension::restd) (index::resti) = if (index > 0) then index - 1 :: resti else dimension - 1 :: prev' restd resti fun next shape index = (SOME (next' shape index)) handle Subscript => NONE fun prev shape index = (SOME (prev' shape index)) handle Subscript => NONE fun inBounds shape index = ListPair.all (fn (x,y) => (x >= 0) andalso (x < y)) (index, shape) fun compare ([],[]) = EQUAL | compare (_, []) = raise Index | compare ([],_) = raise Index | compare (a::ra, b::rb) = case Int.compare (a,b) of EQUAL => compare (ra,rb) | LESS => LESS | GREATER => GREATER local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then if inner (i::accum) f then innerloop (i+1) else false else true in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then if f (i::accum) then innerloop (i+1) else false else true in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun all shape = build_iterator shape [] end local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then if inner (i::accum) f then true else innerloop (i+1) else false in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then if f (i::accum) then true else innerloop (i+1) else false in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun any shape = build_iterator shape [] end local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then (inner (i::accum) f; innerloop (i+1)) else () in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then (f (i::accum); innerloop (i+1)) else () in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun app shape = build_iterator shape [] end fun a < b = compare(a,b) = LESS fun a > b = compare(a,b) = GREATER fun eq (a, b) = compare(a,b) = EQUAL fun a <> b = not (a = b) fun a <= b = not (a > b) fun a >= b = not (a < b) fun a - b = ListPair.map Int.- (a,b) end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* TENSOR - Signature - Polymorphic tensors of any type. With 'tensor' we denote a (mutable) array of any rank, with as many indices as one wishes, and that may be traversed (map, fold, etc) according to any of those indices. type 'a tensor Polymorphic tensor whose elements are all of type 'a. val storage = RowMajor | ColumnMajor RowMajor = data is stored in consecutive cells, first index varying fastest (FORTRAN convention) ColumnMajor = data is stored in consecutive cells, last index varying fastest (C,C++,Pascal,CommonLisp convention) new ([i1,...,in],init) Build a new tensor with n indices, each of sizes i1...in, filled with 'init'. fromArray (shape,data) fromList (shape,data) Use 'data' to fill a tensor of that shape. An exception is raised if 'data' is too large or too small to properly fill the vector. Later use of a 'data' array is disregarded -- one must think that the tensor now owns the array. length tensor rank tensor shape tensor Return the number of elements, the number of indices and the shape (size of each index) of the tensor. toArray tensor Return the data of the tensor in the form of an array. Mutation of this array may lead to unexpected behavior. sub (tensor,[i1,...,in]) update (tensor,[i1,...,in],new_value) Access the element that is indexed by the numbers [i1,..,in] app f a appi f a The same as 'map' and 'mapi' but the function 'f' outputs nothing and no new array is produced, i.e. one only seeks the side effect that 'f' may produce. map2 operation a b Apply function 'f' to pairs of elements of 'a' and 'b' and build a new tensor with the output. Both operands must have the same shape or an exception is raised. The procedure is sequential, as specified by 'storage'. foldl operation a n Fold-left the elements of tensor 'a' along the n-th index. all test a any test a Folded boolean tests on the elements of the tensor. *) signature TENSOR = sig structure Array : ARRAY structure Index : INDEX type index = Index.t type 'a tensor val new : index * 'a -> 'a tensor val tabulate : index * (index -> 'a) -> 'a tensor val length : 'a tensor -> int val rank : 'a tensor -> int val shape : 'a tensor -> (index) val reshape : index -> 'a tensor -> 'a tensor val fromList : index * 'a list -> 'a tensor val fromArray : index * 'a array -> 'a tensor val toArray : 'a tensor -> 'a array val sub : 'a tensor * index -> 'a val update : 'a tensor * index * 'a -> unit val map : ('a -> 'b) -> 'a tensor -> 'b tensor val map2 : ('a * 'b -> 'c) -> 'a tensor -> 'b tensor -> 'c tensor val app : ('a -> unit) -> 'a tensor -> unit val appi : (int * 'a -> unit) -> 'a tensor -> unit val foldl : ('c * 'a -> 'c) -> 'c -> 'a tensor -> int -> 'c tensor val all : ('a -> bool) -> 'a tensor -> bool val any : ('a -> bool) -> 'a tensor -> bool end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure Tensor : TENSOR = struct structure Array = Array structure Index = Index type index = Index.t type 'a tensor = {shape : index, indexer : Index.indexer, data : 'a array} exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun array_map f a = let fun apply index = f(Array.sub(a,index)) in Array.tabulate(Array.length a, apply) end fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); case i of 0 => c | i => dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-1)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = array_map f data} fun map2 f t1 t2= let val {shape, indexer, data} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 fun apply i = f (Array.sub(data,i), Array.sub(data2,i)) val len = Array.length data in if Index.eq(shape, shape2) then {shape = shape, indexer = indexer, data = Array.tabulate(len, apply)} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* Tensor *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* MONO_TENSOR - signature - Monomorphic tensor of arbitrary data (not only numbers). Operations should be provided to run the data in several ways, according to one index. type tensor The type of the tensor itself type elem The type of every element val storage = RowMajor | ColumnMajor RowMajor = data is stored in consecutive cells, first index varying fastest (FORTRAN convention) ColumnMajor = data is stored in consecutive cells, last index varying fastest (C,C++,Pascal,CommonLisp convention) new ([i1,...,in],init) Build a new tensor with n indices, each of sizes i1...in, filled with 'init'. fromArray (shape,data) fromList (shape,data) Use 'data' to fill a tensor of that shape. An exception is raised if 'data' is too large or too small to properly fill the vector. Later use of a 'data' array is disregarded -- one must think that the tensor now owns the array. length tensor rank tensor shape tensor Return the number of elements, the number of indices and the shape (size of each index) of the tensor. toArray tensor Return the data of the tensor in the form of an array. Mutation of this array may lead to unexpected behavior. The data in the array is stored according to `storage'. sub (tensor,[i1,...,in]) update (tensor,[i1,...,in],new_value) Access the element that is indexed by the numbers [i1,..,in] map f a mapi f a Produce a new array by mapping the function sequentially as specified by 'storage', to each element of tensor 'a'. In 'mapi' the function receives a (indices,value) tuple, while in 'map' it only receives the value. app f a appi f a The same as 'map' and 'mapi' but the function 'f' outputs nothing and no new array is produced, i.e. one only seeks the side effect that 'f' may produce. map2 operation a b Apply function 'f' to pairs of elements of 'a' and 'b' and build a new tensor with the output. Both operands must have the same shape or an exception is raised. The procedure is sequential, as specified by 'storage'. foldl operation a n Fold-left the elements of tensor 'a' along the n-th index. all test a any test a Folded boolean tests on the elements of the tensor. map', map2', foldl' Polymorphic versions of map, map2, foldl. *) signature MONO_TENSOR = sig structure Array : MONO_ARRAY structure Index : INDEX type index = Index.t type elem type tensor type t = tensor val new : index * elem -> tensor val tabulate : index * (index -> elem) -> tensor val length : tensor -> int val rank : tensor -> int val shape : tensor -> (index) val reshape : index -> tensor -> tensor val fromList : index * elem list -> tensor val fromArray : index * Array.array -> tensor val toArray : tensor -> Array.array val sub : tensor * index -> elem val update : tensor * index * elem -> unit val map : (elem -> elem) -> tensor -> tensor val map2 : (elem * elem -> elem) -> tensor -> tensor -> tensor val app : (elem -> unit) -> tensor -> unit val appi : (int * elem -> unit) -> tensor -> unit val foldl : (elem * 'a -> 'a) -> 'a -> tensor -> tensor val foldln : (elem * elem -> elem) -> elem -> tensor -> int -> tensor val all : (elem -> bool) -> tensor -> bool val any : (elem -> bool) -> tensor -> bool val map' : (elem -> 'a) -> tensor -> 'a Tensor.tensor val map2' : (elem * elem -> 'a) -> tensor -> tensor -> 'a Tensor.tensor val foldl' : ('a * elem -> 'a) -> 'a -> tensor -> int -> 'a Tensor.tensor end (* NUMBER - Signature - Guarantees a structure with a minimal number of mathematical operations so as to build an algebraic structure named Tensor. *) signature NUMBER = sig type t val zero : t val one : t val ~ : t -> t val + : t * t -> t val - : t * t -> t val * : t * t -> t val / : t * t -> t val toString : t -> string end signature NUMBER = sig type t val zero : t val one : t val + : t * t -> t val - : t * t -> t val * : t * t -> t val *+ : t * t * t -> t val *- : t * t * t -> t val ** : t * int -> t val ~ : t -> t val abs : t -> t val signum : t -> t val == : t * t -> bool val != : t * t -> bool val toString : t -> string val fromInt : int -> t val scan : (char,'a) StringCvt.reader -> (t,'a) StringCvt.reader end signature INTEGRAL_NUMBER = sig include NUMBER val quot : t * t -> t val rem : t * t -> t val mod : t * t -> t val div : t * t -> t val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val max : t * t -> t val min : t * t -> t end signature FRACTIONAL_NUMBER = sig include NUMBER val pi : t val e : t val / : t * t -> t val recip : t -> t val ln : t -> t val pow : t * t -> t val exp : t -> t val sqrt : t -> t val cos : t -> t val sin : t -> t val tan : t -> t val sinh : t -> t val cosh : t -> t val tanh : t -> t val acos : t -> t val asin : t -> t val atan : t -> t val asinh : t -> t val acosh : t -> t val atanh : t -> t val atan2 : t * t -> t end signature REAL_NUMBER = sig include FRACTIONAL_NUMBER val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val max : t * t -> t val min : t * t -> t end signature COMPLEX_NUMBER = sig include FRACTIONAL_NUMBER structure Real : REAL_NUMBER type real = Real.t val make : real * real -> t val split : t -> real * real val realPart : t -> real val imagPart : t -> real val abs2 : t -> real end structure INumber : INTEGRAL_NUMBER = struct open Int type t = Int.int val zero = 0 val one = 1 infix ** fun i ** n = let fun loop 0 = 1 | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if n < 0 then raise Domain else loop n end fun signum i = case compare(i, 0) of GREATER => 1 | EQUAL => 0 | LESS => ~1 infix == infix != fun a == b = a = b fun a != b = (a <> b) fun *+(b,c,a) = b * c + a fun *-(b,c,a) = b * c - b fun scan getc = Int.scan StringCvt.DEC getc end structure RNumber : REAL_NUMBER = struct open Real open Real.Math type t = Real.real val zero = 0.0 val one = 1.0 fun signum x = case compare(x,0.0) of LESS => ~1.0 | GREATER => 1.0 | EQUAL => 0.0 fun recip x = 1.0 / x infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun max (a, b) = if a < b then b else a fun min (a, b) = if a < b then a else b fun asinh x = ln (x + sqrt(1.0 + x * x)) fun acosh x = ln (x + (x + 1.0) * sqrt((x - 1.0)/(x + 1.0))) fun atanh x = ln ((1.0 + x) / sqrt(1.0 - x * x)) end (* Complex(R) - Functor - Provides support for complex numbers based on tuples. Should be highly efficient as most operations can be inlined. *) structure CNumber : COMPLEX_NUMBER = struct structure Real = RNumber type t = Real.t * Real.t type real = Real.t val zero = (0.0,0.0) val one = (1.0,0.0) val pi = (Real.pi, 0.0) val e = (Real.e, 0.0) fun make (r,i) = (r,i) : t fun split z = z fun realPart (r,_) = r fun imagPart (_,i) = i fun abs2 (r,i) = Real.+(Real.*(r,r),Real.*(i,i)) (* FIXME!!! *) fun arg (r,i) = Real.atan2(i,r) fun modulus z = Real.sqrt(abs2 z) fun abs z = (modulus z, 0.0) fun signum (z as (r,i)) = let val m = modulus z in (Real./(r,m), Real./(i,m)) end fun ~ (r1,i1) = (Real.~ r1, Real.~ i1) fun (r1,i1) + (r2,i2) = (Real.+(r1,r2), Real.+(i1,i2)) fun (r1,i1) - (r2,i2) = (Real.-(r1,r2), Real.-(i1,i1)) fun (r1,i1) * (r2,i2) = (Real.-(Real.*(r1,r2),Real.*(i1,i2)), Real.+(Real.*(r1,i2),Real.*(r2,i1))) fun (r1,i1) / (r2,i2) = let val modulus = abs2(r2,i2) val (nr,ni) = (r1,i1) * (r2,i2) in (Real./(nr,modulus), Real./(ni,modulus)) end fun *+((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*+(r1,r2,r0)), Real.*+(r2, i2, Real.*+(r1,i2,i0))) fun *-((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*-(r1,r2,r0)), Real.*+(r2, i2, Real.*-(r1,i2,i0))) infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun recip (r1, i1) = let val modulus = abs2(r1, i1) in (Real./(r1, modulus), Real./(Real.~ i1, modulus)) end fun ==(z, w) = Real.==(realPart z, realPart w) andalso Real.==(imagPart z, imagPart w) fun !=(z, w) = Real.!=(realPart z, realPart w) andalso Real.!=(imagPart z, imagPart w) fun fromInt i = (Real.fromInt i, 0.0) fun toString (r,i) = String.concat ["(",Real.toString r,",",Real.toString i,")"] fun exp (x, y) = let val expx = Real.exp x in (Real.*(x, (Real.cos y)), Real.*(x, (Real.sin y))) end local val half = Real.recip (Real.fromInt 2) in fun sqrt (z as (x,y)) = if Real.==(x, 0.0) andalso Real.==(y, 0.0) then zero else let val m = Real.+(modulus z, Real.abs x) val u' = Real.sqrt (Real.*(m, half)) val v' = Real./(Real.abs y , Real.+(u',u')) val (u,v) = if Real.<(x, 0.0) then (v',u') else (u',v') in (u, if Real.<(y, 0.0) then Real.~ v else v) end end fun ln z = (Real.ln (modulus z), arg z) fun pow (z, n) = let val l = ln z in exp (l * n) end fun sin (x, y) = (Real.*(Real.sin x, Real.cosh y), Real.*(Real.cos x, Real.sinh y)) fun cos (x, y) = (Real.*(Real.cos x, Real.cosh y), Real.~ (Real.*(Real.sin x, Real.sinh y))) fun tan (x, y) = let val (sx, cx) = (Real.sin x, Real.cos x) val (shy, chy) = (Real.sinh y, Real.cosh y) val a = (Real.*(sx, chy), Real.*(cx, shy)) val b = (Real.*(cx, chy), Real.*(Real.~ sx, shy)) in a / b end fun sinh (x, y) = (Real.*(Real.cos y, Real.sinh x), Real.*(Real.sin y, Real.cosh x)) fun cosh (x, y) = (Real.*(Real.cos y, Real.cosh x), Real.*(Real.sin y, Real.sinh x)) fun tanh (x, y) = let val (sy, cy) = (Real.sin y, Real.cos y) val (shx, chx) = (Real.sinh x, Real.cosh x) val a = (Real.*(cy, shx), Real.*(sy, chx)) val b = (Real.*(cy, chx), Real.*(sy, shx)) in a / b end fun asin (z as (x,y)) = let val w = sqrt (one - z * z) val (x',y') = ln ((Real.~ y, x) + w) in (y', Real.~ x') end fun acos (z as (x,y)) = let val (x', y') = sqrt (one + z * z) val (x'', y'') = ln (z + (Real.~ y', x')) in (y'', Real.~ x'') end fun atan (z as (x,y)) = let val w = sqrt (one + z*z) val (x',y') = ln ((Real.-(1.0, y), x) / w) in (y', Real.~ x') end fun atan2 (y, x) = atan(y / x) fun asinh x = ln (x + sqrt(one + x * x)) fun acosh x = ln (x + (x + one) * sqrt((x - one)/(x + one))) fun atanh x = ln ((one + x) / sqrt(one - x * x)) fun scan getc = let val scanner = Real.scan getc in fn stream => case scanner stream of NONE => NONE | SOME (a, rest) => case scanner rest of NONE => NONE | SOME (b, rest) => SOME (make(a,b), rest) end end (* ComplexNumber *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure INumberArray = struct open Array type array = INumber.t array type vector = INumber.t vector type elem = INumber.t structure Vector = struct open Vector type vector = INumber.t Vector.vector type elem = INumber.t end fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end structure RNumberArray = struct open Real64Array val sub = Unsafe.Real64Array.sub val update = Unsafe.Real64Array.update fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end (*--------------------- COMPLEX ARRAY -------------------------*) structure BasicCNumberArray = struct structure Complex : COMPLEX_NUMBER = CNumber structure Array : MONO_ARRAY = RNumberArray type elem = Complex.t type array = Array.array * Array.array val maxLen = Array.maxLen fun length (a,b) = Array.length a fun sub ((a,b),index) = Complex.make(Array.sub(a,index),Array.sub(b,index)) fun update ((a,b),index,z) = let val (re,im) = Complex.split z in Array.update(a, index, re); Array.update(b, index, im) end local fun makeRange (a, start, NONE) = makeRange(a, start, SOME (length a - 1)) | makeRange (a, start, SOME last) = let val len = length a val diff = last - start in if (start >= len) orelse (last >= len) then raise Subscript else if diff < 0 then (a, start, 0) else (a, start, diff + 1) end in fun array (size,z:elem) = let val realsize = size * 2 val r = Complex.realPart z val i = Complex.imagPart z in (Array.array(size,r), Array.array(size,i)) end fun zeroarray size = (Array.array(size,Complex.Real.zero), Array.array(size,Complex.Real.zero)) fun tabulate (size,f) = let val a = array(size, Complex.zero) fun loop i = case i = size of true => a | false => (update(a, i, f i); loop (i+1)) in loop 0 end fun fromList list = let val length = List.length list val a = zeroarray length fun loop (_, []) = a | loop (i, z::rest) = (update(a, i, z); loop (i+1, rest)) in loop(0,list) end fun extract range = let val (a, start, len) = makeRange range fun copy i = sub(a, i + start) in tabulate(len, copy) end fun concat array_list = let val total_length = foldl (op +) 0 (map length array_list) val a = array(total_length, Complex.zero) fun copy (_, []) = a | copy (pos, v::rest) = let fun loop i = case i = 0 of true => () | false => (update(a, i+pos, sub(v, i)); loop (i-1)) in (loop (length v - 1); copy(length v + pos, rest)) end in copy(0, array_list) end fun copy {src : array, si : int, len : int option, dst : array, di : int } = let val (a, ia, la) = makeRange (src, si, len) val (b, ib, lb) = makeRange (dst, di, len) fun copy i = case i < 0 of true => () | false => (update(b, i+ib, sub(a, i+ia)); copy (i-1)) in copy (la - 1) end val copyVec = copy fun modifyi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (update(a, i, f(i, sub(a,i))); loop (i+1)) in loop start end fun modify f a = let val last = length a fun loop i = case i >= last of true => () | false => (update(a, i, f(sub(a,i))); loop (i+1)) in loop 0 end fun app f a = let val size = length a fun loop i = case i = size of true => () | false => (f(sub(a,i)); loop (i+1)) in loop 0 end fun appi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (f(i, sub(a,i)); loop (i+1)) in loop start end fun map f a = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(a, i, f(sub(a,i))); loop (i-1)) in loop (len-1) end fun map2 f a b = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(c, i, f(sub(a,i),sub(b,i))); loop (i-1)) in loop (len-1) end fun mapi f range = let val (a, start, len) = makeRange range fun rule i = f (i+start, sub(a, i+start)) in tabulate(len, rule) end fun foldli f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i > last of true => accum | false => loop (i+1, f(i, sub(a,i), accum)) in loop (start, init) end fun foldri f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i < start of true => accum | false => loop (i-1, f(i, sub(a,i), accum)) in loop (last, init) end fun foldl f init a = foldli (fn (_, a, x) => f(a,x)) init (a,0,NONE) fun foldr f init a = foldri (fn (_, x, a) => f(x,a)) init (a,0,NONE) end end (* BasicCNumberArray *) structure CNumberArray = struct structure Vector = struct open BasicCNumberArray type vector = array end : MONO_VECTOR type vector = Vector.vector open BasicCNumberArray end (* CNumberArray *) structure INumber : INTEGRAL_NUMBER = struct open Int type t = Int.int val zero = 0 val one = 1 infix ** fun i ** n = let fun loop 0 = 1 | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if n < 0 then raise Domain else loop n end fun signum i = case compare(i, 0) of GREATER => 1 | EQUAL => 0 | LESS => ~1 infix == infix != fun a == b = a = b fun a != b = (a <> b) fun *+(b,c,a) = b * c + a fun *-(b,c,a) = b * c - b fun scan getc = Int.scan StringCvt.DEC getc end structure RNumber : REAL_NUMBER = struct open Real open Real.Math type t = Real.real val zero = 0.0 val one = 1.0 fun signum x = case compare(x,0.0) of LESS => ~1.0 | GREATER => 1.0 | EQUAL => 0.0 fun recip x = 1.0 / x infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun max (a, b) = if a < b then b else a fun min (a, b) = if a < b then a else b fun asinh x = ln (x + sqrt(1.0 + x * x)) fun acosh x = ln (x + (x + 1.0) * sqrt((x - 1.0)/(x + 1.0))) fun atanh x = ln ((1.0 + x) / sqrt(1.0 - x * x)) end (* Complex(R) - Functor - Provides support for complex numbers based on tuples. Should be highly efficient as most operations can be inlined. *) structure CNumber : COMPLEX_NUMBER = struct structure Real = RNumber type t = Real.t * Real.t type real = Real.t val zero = (0.0,0.0) val one = (1.0,0.0) val pi = (Real.pi, 0.0) val e = (Real.e, 0.0) fun make (r,i) = (r,i) : t fun split z = z fun realPart (r,_) = r fun imagPart (_,i) = i fun abs2 (r,i) = Real.+(Real.*(r,r),Real.*(i,i)) (* FIXME!!! *) fun arg (r,i) = Real.atan2(i,r) fun modulus z = Real.sqrt(abs2 z) fun abs z = (modulus z, 0.0) fun signum (z as (r,i)) = let val m = modulus z in (Real./(r,m), Real./(i,m)) end fun ~ (r1,i1) = (Real.~ r1, Real.~ i1) fun (r1,i1) + (r2,i2) = (Real.+(r1,r2), Real.+(i1,i2)) fun (r1,i1) - (r2,i2) = (Real.-(r1,r2), Real.-(i1,i1)) fun (r1,i1) * (r2,i2) = (Real.-(Real.*(r1,r2),Real.*(i1,i2)), Real.+(Real.*(r1,i2),Real.*(r2,i1))) fun (r1,i1) / (r2,i2) = let val modulus = abs2(r2,i2) val (nr,ni) = (r1,i1) * (r2,i2) in (Real./(nr,modulus), Real./(ni,modulus)) end fun *+((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*+(r1,r2,r0)), Real.*+(r2, i2, Real.*+(r1,i2,i0))) fun *-((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*-(r1,r2,r0)), Real.*+(r2, i2, Real.*-(r1,i2,i0))) infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun recip (r1, i1) = let val modulus = abs2(r1, i1) in (Real./(r1, modulus), Real./(Real.~ i1, modulus)) end fun ==(z, w) = Real.==(realPart z, realPart w) andalso Real.==(imagPart z, imagPart w) fun !=(z, w) = Real.!=(realPart z, realPart w) andalso Real.!=(imagPart z, imagPart w) fun fromInt i = (Real.fromInt i, 0.0) fun toString (r,i) = String.concat ["(",Real.toString r,",",Real.toString i,")"] fun exp (x, y) = let val expx = Real.exp x in (Real.*(x, (Real.cos y)), Real.*(x, (Real.sin y))) end local val half = Real.recip (Real.fromInt 2) in fun sqrt (z as (x,y)) = if Real.==(x, 0.0) andalso Real.==(y, 0.0) then zero else let val m = Real.+(modulus z, Real.abs x) val u' = Real.sqrt (Real.*(m, half)) val v' = Real./(Real.abs y , Real.+(u',u')) val (u,v) = if Real.<(x, 0.0) then (v',u') else (u',v') in (u, if Real.<(y, 0.0) then Real.~ v else v) end end fun ln z = (Real.ln (modulus z), arg z) fun pow (z, n) = let val l = ln z in exp (l * n) end fun sin (x, y) = (Real.*(Real.sin x, Real.cosh y), Real.*(Real.cos x, Real.sinh y)) fun cos (x, y) = (Real.*(Real.cos x, Real.cosh y), Real.~ (Real.*(Real.sin x, Real.sinh y))) fun tan (x, y) = let val (sx, cx) = (Real.sin x, Real.cos x) val (shy, chy) = (Real.sinh y, Real.cosh y) val a = (Real.*(sx, chy), Real.*(cx, shy)) val b = (Real.*(cx, chy), Real.*(Real.~ sx, shy)) in a / b end fun sinh (x, y) = (Real.*(Real.cos y, Real.sinh x), Real.*(Real.sin y, Real.cosh x)) fun cosh (x, y) = (Real.*(Real.cos y, Real.cosh x), Real.*(Real.sin y, Real.sinh x)) fun tanh (x, y) = let val (sy, cy) = (Real.sin y, Real.cos y) val (shx, chx) = (Real.sinh x, Real.cosh x) val a = (Real.*(cy, shx), Real.*(sy, chx)) val b = (Real.*(cy, chx), Real.*(sy, shx)) in a / b end fun asin (z as (x,y)) = let val w = sqrt (one - z * z) val (x',y') = ln ((Real.~ y, x) + w) in (y', Real.~ x') end fun acos (z as (x,y)) = let val (x', y') = sqrt (one + z * z) val (x'', y'') = ln (z + (Real.~ y', x')) in (y'', Real.~ x'') end fun atan (z as (x,y)) = let val w = sqrt (one + z*z) val (x',y') = ln ((Real.-(1.0, y), x) / w) in (y', Real.~ x') end fun atan2 (y, x) = atan(y / x) fun asinh x = ln (x + sqrt(one + x * x)) fun acosh x = ln (x + (x + one) * sqrt((x - one)/(x + one))) fun atanh x = ln ((one + x) / sqrt(one - x * x)) fun scan getc = let val scanner = Real.scan getc in fn stream => case scanner stream of NONE => NONE | SOME (a, rest) => case scanner rest of NONE => NONE | SOME (b, rest) => SOME (make(a,b), rest) end end (* ComplexNumber *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure PrettyPrint :> sig datatype modifier = Int of int | Real of real | Complex of CNumber.t | String of string val list : ('a -> string) -> 'a list -> unit val intList : int list -> unit val realList : real list -> unit val stringList : string list -> unit val array : ('a -> string) -> 'a array -> unit val intArray : int array -> unit val realArray : real array -> unit val stringArray : string array -> unit val sequence : int -> ((int * 'a -> unit) -> 'b -> unit) -> ('a -> string) -> 'b -> unit val print : modifier list -> unit end = struct datatype modifier = Int of int | Real of real | Complex of CNumber.t | String of string fun list _ [] = print "[]" | list cvt (a::resta) = let fun loop a [] = (print(cvt a); print "]") | loop a (b::restb) = (print(cvt a); print ", "; loop b restb) in print "["; loop a resta end fun boolList a = list Bool.toString a fun intList a = list Int.toString a fun realList a = list Real.toString a fun stringList a = list (fn x => x) a fun array cvt a = let val length = Array.length a - 1 fun print_one (i,x) = (print(cvt x); if not(i = length) then print ", " else ()) in Array.appi print_one a end fun boolArray a = array Bool.toString a fun intArray a = array Int.toString a fun realArray a = array Real.toString a fun stringArray a = array (fn x => x) a fun sequence length appi cvt seq = let val length = length - 1 fun print_one (i:int,x) = (print(cvt x); if not(i = length) then print ", " else ()) in print "["; appi print_one seq; print "]\n" end fun print b = let fun printer (Int a) = INumber.toString a | printer (Real a) = RNumber.toString a | printer (Complex a) = CNumber.toString a | printer (String a) = a in List.app (fn x => (TextIO.print (printer x))) b end end (* PrettyPrint *) fun print' x = List.app print x (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure INumberArray = struct open Array type array = INumber.t array type vector = INumber.t vector type elem = INumber.t structure Vector = struct open Vector type vector = INumber.t Vector.vector type elem = INumber.t end fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end structure RNumberArray = struct open Real64Array val sub = Unsafe.Real64Array.sub val update = Unsafe.Real64Array.update fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end (*--------------------- COMPLEX ARRAY -------------------------*) structure BasicCNumberArray = struct structure Complex : COMPLEX_NUMBER = CNumber structure Array : MONO_ARRAY = RNumberArray type elem = Complex.t type array = Array.array * Array.array val maxLen = Array.maxLen fun length (a,b) = Array.length a fun sub ((a,b),index) = Complex.make(Array.sub(a,index),Array.sub(b,index)) fun update ((a,b),index,z) = let val (re,im) = Complex.split z in Array.update(a, index, re); Array.update(b, index, im) end local fun makeRange (a, start, NONE) = makeRange(a, start, SOME (length a - 1)) | makeRange (a, start, SOME last) = let val len = length a val diff = last - start in if (start >= len) orelse (last >= len) then raise Subscript else if diff < 0 then (a, start, 0) else (a, start, diff + 1) end in fun array (size,z:elem) = let val realsize = size * 2 val r = Complex.realPart z val i = Complex.imagPart z in (Array.array(size,r), Array.array(size,i)) end fun zeroarray size = (Array.array(size,Complex.Real.zero), Array.array(size,Complex.Real.zero)) fun tabulate (size,f) = let val a = array(size, Complex.zero) fun loop i = case i = size of true => a | false => (update(a, i, f i); loop (i+1)) in loop 0 end fun fromList list = let val length = List.length list val a = zeroarray length fun loop (_, []) = a | loop (i, z::rest) = (update(a, i, z); loop (i+1, rest)) in loop(0,list) end fun extract range = let val (a, start, len) = makeRange range fun copy i = sub(a, i + start) in tabulate(len, copy) end fun concat array_list = let val total_length = foldl (op +) 0 (map length array_list) val a = array(total_length, Complex.zero) fun copy (_, []) = a | copy (pos, v::rest) = let fun loop i = case i = 0 of true => () | false => (update(a, i+pos, sub(v, i)); loop (i-1)) in (loop (length v - 1); copy(length v + pos, rest)) end in copy(0, array_list) end fun copy {src : array, si : int, len : int option, dst : array, di : int } = let val (a, ia, la) = makeRange (src, si, len) val (b, ib, lb) = makeRange (dst, di, len) fun copy i = case i < 0 of true => () | false => (update(b, i+ib, sub(a, i+ia)); copy (i-1)) in copy (la - 1) end val copyVec = copy fun modifyi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (update(a, i, f(i, sub(a,i))); loop (i+1)) in loop start end fun modify f a = let val last = length a fun loop i = case i >= last of true => () | false => (update(a, i, f(sub(a,i))); loop (i+1)) in loop 0 end fun app f a = let val size = length a fun loop i = case i = size of true => () | false => (f(sub(a,i)); loop (i+1)) in loop 0 end fun appi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (f(i, sub(a,i)); loop (i+1)) in loop start end fun map f a = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(a, i, f(sub(a,i))); loop (i-1)) in loop (len-1) end fun map2 f a b = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(c, i, f(sub(a,i),sub(b,i))); loop (i-1)) in loop (len-1) end fun mapi f range = let val (a, start, len) = makeRange range fun rule i = f (i+start, sub(a, i+start)) in tabulate(len, rule) end fun foldli f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i > last of true => accum | false => loop (i+1, f(i, sub(a,i), accum)) in loop (start, init) end fun foldri f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i < start of true => accum | false => loop (i-1, f(i, sub(a,i), accum)) in loop (last, init) end fun foldl f init a = foldli (fn (_, a, x) => f(a,x)) init (a,0,NONE) fun foldr f init a = foldri (fn (_, x, a) => f(x,a)) init (a,0,NONE) end end (* BasicCNumberArray *) structure CNumberArray = struct structure Vector = struct open BasicCNumberArray type vector = array end : MONO_VECTOR type vector = Vector.vector open BasicCNumberArray end (* CNumberArray *) structure ITensor = struct structure Number = INumber structure Array = INumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, accum) = accum | loopk (k, ia, ib, accum) = let val delta = Number.*(Array.sub(a,ia),Array.sub(b,ib)) in loopk (k-1, ia+1, ib+1, Number.+(delta,accum)) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, Number.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi (0, ia, ic, fac) = () | loopi (i, ia, ic, fac) = let val old = Array.sub(c,ic) val inc = Number.*(Array.sub(a,ia),fac) in Array.update(c,ic,Number.+(old,inc)); loopi(i-1, ia+1, ic+1, fac) end fun loopj (j, ib, ic) = let fun loopk (0, ia, ib) = () | loopk (k, ia, ib) = (loopi(li, ia, ic, Array.sub(b,ib)); loopk(k-1, ia+li, ib+lj)) in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun normInf a = let fun accum (y,x) = Number.max(x,Number.abs y) in foldl accum Number.zero a end end (* NumberTensor *) structure RTensor = struct structure Number = RNumber structure Array = RNumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, accum) = accum | loopk (k, ia, ib, accum) = let val delta = Number.*(Array.sub(a,ia),Array.sub(b,ib)) in loopk (k-1, ia+1, ib+1, Number.+(delta,accum)) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, Number.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi (0, ia, ic, fac) = () | loopi (i, ia, ic, fac) = let val old = Array.sub(c,ic) val inc = Number.*(Array.sub(a,ia),fac) in Array.update(c,ic,Number.+(old,inc)); loopi(i-1, ia+1, ic+1, fac) end fun loopj (j, ib, ic) = let fun loopk (0, ia, ib) = () | loopk (k, ia, ib) = (loopi(li, ia, ic, Array.sub(b,ib)); loopk(k-1, ia+li, ib+lj)) in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun a / b = map2 Number./ a b fun recip a = map Number.recip a fun ln a = map Number.ln a fun pow (a, b) = map (fn x => (Number.pow(x,b))) a fun exp a = map Number.exp a fun sqrt a = map Number.sqrt a fun cos a = map Number.cos a fun sin a = map Number.sin a fun tan a = map Number.tan a fun sinh a = map Number.sinh a fun cosh a = map Number.cosh a fun tanh a = map Number.tanh a fun asin a = map Number.asin a fun acos a = map Number.acos a fun atan a = map Number.atan a fun asinh a = map Number.asinh a fun acosh a = map Number.acosh a fun atanh a = map Number.atanh a fun atan2 (a,b) = map2 Number.atan2 a b fun normInf a = let fun accum (y,x) = Number.max(x,Number.abs y) in foldl accum Number.zero a end fun norm1 a = let fun accum (y,x) = Number.+(x,Number.abs y) in foldl accum Number.zero a end fun norm2 a = let fun accum (y,x) = Number.+(x, Number.*(y,y)) in Number.sqrt(foldl accum Number.zero a) end end (* RTensor *) structure CTensor = struct structure Number = CNumber structure Array = CNumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor, 0, NONE) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, r, i) = Number.make(r,i) | loopk (k, ia, ib, r, i) = let val (ar, ai) = Array.sub(a,ia) val (br, bi) = Array.sub(b,ib) val dr = ar * br - ai * bi val di = ar * bi + ai * br in loopk (k-1, ia+1, ib+1, r+dr, i+di) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, RNumber.zero, RNumber.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi(0, _, _, _, _) = () | loopi(i, ia, ic, br, bi) = let val (cr,ci) = Array.sub(c,ic) val (ar,ai) = Array.sub(a,ia) val dr = (ar * br - ai * bi) val di = (ar * bi + ai * br) in Array.update(c,ic,Number.make(cr+dr,ci+di)); loopi(i-1, ia+1, ic+1, br, bi) end fun loopj(j, ib, ic) = let fun loopk(0, _, _) = () | loopk(k, ia, ib) = let val (br, bi) = Array.sub(b,ib) in loopi(li, ia, ic, br, bi); loopk(k-1, ia+li, ib+lj) end in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun a / b = map2 Number./ a b fun recip a = map Number.recip a fun ln a = map Number.ln a fun pow (a, b) = map (fn x => (Number.pow(x,b))) a fun exp a = map Number.exp a fun sqrt a = map Number.sqrt a fun cos a = map Number.cos a fun sin a = map Number.sin a fun tan a = map Number.tan a fun sinh a = map Number.sinh a fun cosh a = map Number.cosh a fun tanh a = map Number.tanh a fun asin a = map Number.asin a fun acos a = map Number.acos a fun atan a = map Number.atan a fun asinh a = map Number.asinh a fun acosh a = map Number.acosh a fun atanh a = map Number.atanh a fun atan2 (a,b) = map2 Number.atan2 a b fun normInf a = let fun accum (y,x) = RNumber.max(x, Number.realPart(Number.abs y)) in foldl accum RNumber.zero a end fun norm1 a = let fun accum (y,x) = RNumber.+(x, Number.realPart(Number.abs y)) in foldl accum RNumber.zero a end fun norm2 a = let fun accum (y,x) = RNumber.+(x, Number.abs2 y) in RNumber.sqrt(foldl accum RNumber.zero a) end end (* CTensor *) structure MathFile = struct type file = TextIO.instream exception Data fun assert NONE = raise Data | assert (SOME a) = a (* ------------------ INPUT --------------------- *) fun intRead file = assert(TextIO.scanStream INumber.scan file) fun realRead file = assert(TextIO.scanStream RNumber.scan file) fun complexRead file = assert(TextIO.scanStream CNumber.scan file) fun listRead eltScan file = let val length = intRead file fun eltRead file = assert(TextIO.scanStream eltScan file) fun loop (0,accum) = accum | loop (i,accum) = loop(i-1, eltRead file :: accum) in if length < 0 then raise Data else List.rev(loop(length,[])) end fun intListRead file = listRead INumber.scan file fun realListRead file = listRead RNumber.scan file fun complexListRead file = listRead CNumber.scan file fun intTensorRead file = let val shape = intListRead file val length = Index.length shape val first = intRead file val a = ITensor.Array.array(length, first) fun loop 0 = ITensor.fromArray(shape, a) | loop j = (ITensor.Array.update(a, length-j, intRead file); loop (j-1)) in loop (length - 1) end fun realTensorRead file = let val shape = intListRead file val length = Index.length shape val first = realRead file val a = RTensor.Array.array(length, first) fun loop 0 = RTensor.fromArray(shape, a) | loop j = (RTensor.Array.update(a, length-j, realRead file); loop (j-1)) in loop (length - 1) end fun complexTensorRead file = let val shape = intListRead file val length = Index.length shape val first = complexRead file val a = CTensor.Array.array(length, first) fun loop j = if j = length then CTensor.fromArray(shape, a) else (CTensor.Array.update(a, j, complexRead file); loop (j+1)) in loop 1 end (* ------------------ OUTPUT -------------------- *) fun linedOutput(file, x) = (TextIO.output(file, x); TextIO.output(file, "\n")) fun intWrite file x = linedOutput(file, INumber.toString x) fun realWrite file x = linedOutput(file, RNumber.toString x) fun complexWrite file x = let val (r,i) = CNumber.split x in linedOutput(file, concat [RNumber.toString r, " ", RNumber.toString i]) end fun listWrite converter file x = (intWrite file (length x); List.app (fn x => (linedOutput(file, converter x))) x) fun intListWrite file x = listWrite INumber.toString file x fun realListWrite file x = listWrite RNumber.toString file x fun complexListWrite file x = listWrite CNumber.toString file x fun intTensorWrite file x = (intListWrite file (ITensor.shape x); ITensor.app (fn x => (intWrite file x)) x) fun realTensorWrite file x = (intListWrite file (RTensor.shape x); RTensor.app (fn x => (realWrite file x)) x) fun complexTensorWrite file x = (intListWrite file (CTensor.shape x); CTensor.app (fn x => (complexWrite file x)) x) end fun loop 0 _ = () | loop n f = (f(); loop (n-1) f) fun test_operator new list_op list_sizes = let fun test_many list_op size = let fun test_op (times,f) = let val a = new size in (EvalTimer.timerOn(); loop times (fn _ => f(a,a)); let val t = LargeInt.toInt(EvalTimer.timerRead()) div times val i = StringCvt.padLeft #" " 6 (Int.toString t) in print i end) end in print (Int.toString size); print " "; List.app test_op list_op; print "\n" end in List.app (test_many list_op) list_sizes end structure Main = struct fun one() = let val _ = let val operators = [(20, RTensor.+), (20, RTensor.* ), (20, RTensor./), (4, fn (a,b) => RTensor.+* a b), (4, fn (a,b) => RTensor.*+ a b)] fun constructor size = RTensor.new([size,size],1.0) in print "Real tensors: (+, *, /, +*, *+)\n"; test_operator constructor operators [100,200,300,400,500]; print "\n\n" end val _ = let val operators = [(20, CTensor.+), (20, CTensor.* ), (20, CTensor./), (4, fn (a,b) => CTensor.+* a b), (4, fn (a,b) => CTensor.*+ a b)] fun constructor size = CTensor.new([size,size],CNumber.one) in print "Real tensors: (+, *, /, +*, *+)\n"; test_operator constructor operators [100,200,300,400,500]; print "\n\n" end in () end fun doit n = if n = 0 then () else (one () ; doit (n - 1)) end mlton-20210117+dfsg/benchmark/tests/tsp.sml000066400000000000000000000370251416264345000204540ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) (* tree.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * * Trees for the TSP program. *) structure Tree = struct datatype tree = NULL | ND of { left : tree, right : tree, x : real, y : real, sz : int, prev : tree ref, next : tree ref } fun mkNode (l, r, x, y, sz) = ND{ left = l, right = r, x = x, y = y, sz = sz, prev = ref NULL, next = ref NULL } fun printTree (outS, NULL) = () | printTree (outS, ND{x, y, left, right, ...}) = ( TextIO.output(outS, String.concat [ Real.toString x, " ", Real.toString y, "\n"]); printTree (outS, left); printTree (outS, right)) fun printList (outS, NULL) = () | printList (outS, start as ND{next, ...}) = let fun cycle (ND{next=next', ...}) = (next = next') | cycle _ = false fun prt (NULL) = () | prt (t as ND{x, y, next, ...}) = ( TextIO.output(outS, String.concat [ Real.toString x, " ", Real.toString y, "\n" ]); if (cycle (!next)) then () else prt (!next)) in prt start end end; (* tsp.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. *) structure TSP : sig val tsp : (Tree.tree * int) -> Tree.tree end = struct structure T = Tree fun setPrev (T.ND{prev, ...}, x) = prev := x fun setNext (T.ND{next, ...}, x) = next := x fun link (a as T.ND{next, ...}, b as T.ND{prev, ...}) = ( next := b; prev := a) fun sameNd (T.ND{next, ...}, T.ND{next=next', ...}) = (next = next') | sameNd (T.NULL, T.NULL) = true | sameNd _ = false (* Find Euclidean distance from a to b *) fun distance (T.ND{x=ax, y=ay, ...}, T.ND{x=bx, y=by, ...}) = Math.sqrt(((ax-bx)*(ax-bx)+(ay-by)*(ay-by))) | distance _ = raise Fail "distance" (* sling tree nodes into a list -- requires root to be tail of list, and * only fills in next field, not prev. *) fun makeList T.NULL = T.NULL | makeList (t as T.ND{left, right, next = t_next, ...}) = let val retVal = (case (makeList left, makeList right) of (T.NULL, T.NULL) => t | (l as T.ND{...}, T.NULL) => (setNext(left, t); l) | (T.NULL, r as T.ND{...}) => (setNext(right, t); r) | (l as T.ND{...}, r as T.ND{...}) => ( setNext(right, t); setNext(left, r); l) (* end case *)) in t_next := T.NULL; retVal end (* reverse orientation of list *) fun reverse T.NULL = () | reverse (t as T.ND{next, prev, ...}) = let fun rev (_, T.NULL) = () | rev (back, tmp as T.ND{prev, next, ...}) = let val tmp' = !next in next := back; setPrev(back, tmp); rev (tmp, tmp') end in setNext (!prev, T.NULL); prev := T.NULL; rev (t, !next) end (* Use closest-point heuristic from Cormen Leiserson and Rivest *) fun conquer (T.NULL) = T.NULL | conquer t = let val (cycle as T.ND{next=cycle_next, prev=cycle_prev, ...}) = makeList t fun loop (T.NULL) = () | loop (t as T.ND{next=ref doNext, prev, ...}) = let fun findMinDist (min, minDist, tmp as T.ND{next, ...}) = if (sameNd(cycle, tmp)) then min else let val test = distance(t, tmp) in if (test < minDist) then findMinDist (tmp, test, !next) else findMinDist (min, minDist, !next) end val (min as T.ND{next=ref min_next, prev=ref min_prev, ...}) = findMinDist (cycle, distance(t, cycle), !cycle_next) val minToNext = distance(min, min_next) val minToPrev = distance(min, min_prev) val tToNext = distance(t, min_next) val tToPrev = distance(t, min_prev) in if ((tToPrev - minToPrev) < (tToNext - minToNext)) then ( (* insert between min and min_prev *) link (min_prev, t); link (t, min)) else ( link (min, t); link (t, min_next)); loop doNext end val t' = !cycle_next in (* Create initial cycle *) cycle_next := cycle; cycle_prev := cycle; loop t'; cycle end (* Merge two cycles as per Karp *) fun merge (a as T.ND{next, ...}, b, t) = let fun locateCycle (start as T.ND{next, ...}) = let fun findMin (min, minDist, tmp as T.ND{next, ...}) = if (sameNd(start, tmp)) then (min, minDist) else let val test = distance(t, tmp) in if (test < minDist) then findMin (tmp, test, !next) else findMin (min, minDist, !next) end val (min as T.ND{next=ref next', prev=ref prev', ...}, minDist) = findMin (start, distance(t, start), !next) val minToNext = distance(min, next') val minToPrev = distance(min, prev') val tToNext = distance(t, next') val tToPrev = distance(t, prev') in if ((tToPrev - minToPrev) < (tToNext - minToNext)) (* would insert between min and prev *) then (prev', tToPrev, min, minDist) (* would insert between min and next *) else (min, minDist, next', tToNext) end (* Compute location for first cycle *) val (p1, tToP1, n1, tToN1) = locateCycle a (* compute location for second cycle *) val (p2, tToP2, n2, tToN2) = locateCycle b (* Now we have 4 choices to complete: * 1:t,p1 t,p2 n1,n2 * 2:t,p1 t,n2 n1,p2 * 3:t,n1 t,p2 p1,n2 * 4:t,n1 t,n2 p1,p2 *) val n1ToN2 = distance(n1, n2) val n1ToP2 = distance(n1, p2) val p1ToN2 = distance(p1, n2) val p1ToP2 = distance(p1, p2) fun choose (testChoice, test, choice, minDist) = if (test < minDist) then (testChoice, test) else (choice, minDist) val (choice, minDist) = (1, tToP1+tToP2+n1ToN2) val (choice, minDist) = choose(2, tToP1+tToN2+n1ToP2, choice, minDist) val (choice, minDist) = choose(3, tToN1+tToP2+p1ToN2, choice, minDist) val (choice, minDist) = choose(4, tToN1+tToN2+p1ToP2, choice, minDist) in case choice of 1 => ( (* 1:p1,t t,p2 n2,n1 -- reverse 2! *) reverse n2; link (p1, t); link (t, p2); link (n2, n1)) | 2 => ( (* 2:p1,t t,n2 p2,n1 -- OK *) link (p1, t); link (t, n2); link (p2, n1)) | 3 => ( (* 3:p2,t t,n1 p1,n2 -- OK *) link (p2, t); link (t, n1); link (p1, n2)) | 4 => ( (* 4:n1,t t,n2 p2,p1 -- reverse 1! *) reverse n1; link (n1, t); link (t, n2); link (p2, p1)) (* end case *); t end (* merge *) (* Compute TSP for the tree t -- use conquer for problems <= sz * *) fun tsp (t as T.ND{left, right, sz=sz', ...}, sz) = if (sz' <= sz) then conquer t else merge (tsp(left, sz), tsp(right, sz), t) | tsp (T.NULL, _) = T.NULL end; (* rand-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * COPYRIGHT (c) 1998 by AT&T Laboratories. * * Signature for a simple random number generator. * *) signature RAND = sig type rand = Word.word val randMin : rand val randMax : rand val random : rand -> rand (* Given seed, return value randMin <= v <= randMax * Iteratively using the value returned by random as the * next seed to random will produce a sequence of pseudo-random * numbers. *) val mkRandom : rand -> unit -> rand (* Given seed, return function generating a sequence of * random numbers randMin <= v <= randMax *) val norm : rand -> real (* Map values in the range [randMin,randMax] to (0.0,1.0) *) val range : (int * int) -> rand -> int (* Map v, randMin <= v <= randMax, to integer range [i,j] * Exception - * Fail if j < i *) end (* RAND *) (* rand.sml * * COPYRIGHT (c) 1991 by AT&T Bell Laboratories. See COPYRIGHT file for details * COPYRIGHT (c) 1998 by AT&T Laboratories. See COPYRIGHT file for details * * Random number generator taken from Paulson, pp. 170-171. * Recommended by Stephen K. Park and Keith W. Miller, * Random number generators: good ones are hard to find, * CACM 31 (1988), 1192-1201 * Updated to include the new preferred multiplier of 48271 * CACM 36 (1993), 105-110 * Updated to use on Word. * * Note: The Random structure provides a better generator. *) structure Rand : RAND = struct type rand = Word.word type rand' = Int.int (* internal representation *) val a : rand' = 48271 val m : rand' = valOf Int.maxInt (* 2^31 - 1 *) val m_1 = m - 1 val q = m div a val r = m mod a val extToInt = Word.toInt val intToExt = Word.fromInt val randMin : rand = 0w1 val randMax : rand = intToExt m_1 fun chk 0w0 = 1 | chk 0wx7fffffff = m_1 | chk seed = extToInt seed fun random' seed = let val hi = seed div q val lo = seed mod q val test = a * lo - r * hi in if test > 0 then test else test + m end val random = intToExt o random' o chk fun mkRandom seed = let val seed = ref (chk seed) in fn () => (seed := random' (!seed); intToExt (!seed)) end val real_m = Real.fromInt m fun norm s = (Real.fromInt (Word.toInt s)) / real_m fun range (i,j) = if j < i then raise Fail "Random.range: hi < lo" else if j = i then fn _ => i else let val R = Int.fromInt j - Int.fromInt i val cvt = Word.toIntX o Word.fromInt in if R = m then Word.toIntX else fn s => i + cvt ((extToInt s) mod (R+1)) end end (* Rand *) (* build.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * * Build a two-dimensional tree for TSP. *) structure BuildTree : sig datatype axis = X_AXIS | Y_AXIS val buildTree : { n : int, dir : axis, min_x : real, min_y : real, max_x : real, max_y : real } -> Tree.tree end = struct structure T = Tree val m_e = 2.7182818284590452354 val m_e2 = 7.3890560989306502274 val m_e3 = 20.08553692318766774179 val m_e6 = 403.42879349273512264299 val m_e12 = 162754.79141900392083592475 datatype axis = X_AXIS | Y_AXIS (* builds a 2D tree of n nodes in specified range with dir as primary axis *) fun buildTree arg = let val rand = Rand.mkRandom 0w314 fun drand48 () = Rand.norm (rand ()) fun median {min, max, n} = let val t = drand48(); (* in [0.0..1.0) *) val retval = if (t > 0.5) then Math.ln(1.0-(2.0*(m_e12-1.0)*(t-0.5)/m_e12))/12.0 else ~(Math.ln(1.0-(2.0*(m_e12-1.0)*t/m_e12))/12.0) in min + ((retval + 1.0) * (max - min)/2.0) end fun uniform {min, max} = min + (drand48() * (max - min)) fun build {n = 0, ...} = T.NULL | build {n, dir=X_AXIS, min_x, min_y, max_x, max_y} = let val med = median{min=min_y, max=max_y, n=n} fun mkTree (min, max) = build{ n=n div 2, dir=Y_AXIS, min_x=min_x, max_x=max_x, min_y=min, max_y=max } in T.mkNode( mkTree(min_y, med), mkTree(med, max_y), uniform{min=min_x, max=max_x}, med, n) end | build {n, dir=Y_AXIS, min_x, min_y, max_x, max_y} = let val med = median{min=min_x, max=max_x, n=n} fun mkTree (min, max) = build{ n=n div 2, dir=X_AXIS, min_x=min, max_x=max, min_y=min_y, max_y=max_y } in T.mkNode( mkTree(min_x, med), mkTree(med, max_x), med, uniform{min=min_y, max=max_y}, n) end in build arg end end; (* Build *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * *) structure Main : sig include BMARK val dumpPS : TextIO.outstream -> unit end = struct val name = "TSP" val problemSz = ref 32767 val divideSz = ref 150 fun printLength (outS, Tree.NULL) = print "(* 0 points *)\n" | printLength (outS, start as Tree.ND{next, x, y, ...}) = let fun cycle (Tree.ND{next=next', ...}) = (next = next') | cycle _ = false fun distance (ax, ay, bx, by) = let val dx = ax-bx and dy = ay-by in Math.sqrt (dx*dx + dy*dy) end fun length (Tree.NULL, px, py, n, len) = (n, len+distance(px, py, x, y)) | length (t as Tree.ND{x, y, next, ...}, px, py, n, len) = if (cycle t) then (n, len+distance(px, py, x, y)) else length(!next, x, y, n+1, len+distance(px, py, x, y)) in if (cycle(!next)) then TextIO.output (outS, "(* 1 point *)\n") else let val (n, len) = length(!next, x, y, 1, 0.0) in TextIO.output (outS, concat[ "(* ", Int.toString n, "points, cycle length = ", Real.toString len, " *)\n" ]) end end fun mkTree n = BuildTree.buildTree { n=n, dir=BuildTree.X_AXIS, min_x=0.0, max_x=1.0, min_y=0.0, max_y=1.0 } fun doit' n = TSP.tsp (mkTree n, !divideSz) fun dumpPS outS = ( TextIO.output (outS, "newgraph\n"); TextIO.output (outS, "newcurve pts\n"); Tree.printList (outS, doit' (!problemSz)); TextIO.output (outS, "linetype solid\n")) fun testit strm = printLength (strm, doit' (!problemSz)) val _ = problemSz := 2097151 fun doit () = doit' (!problemSz) val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20210117+dfsg/benchmark/tests/tyan.sml000066400000000000000000001114641416264345000206210ustar00rootroot00000000000000(* Modified by sweeks@sweeks.com 2001-10-03 to go in the MLton benchmark suite. * Hardwired in the u6 list of polynomials and added a loop. *) (* tyan.sml * A Grobner Basis calculation for polynomials over F17 * Adapted from the TIL benchmark suite by Allyn Dimock: * update to SML '97, Standard Basis Library, comment out unreachable code * Original code from Thomas Yan, who has given his permission for this * code be used as a benchmarking code for SML compilers * (e-mail message Tue, 10 Apr 2001 13:07:44 -0400 (EDT)) * * The data structure for the intermediate results is described in * @article{Yan:1998:GBSP, * author = {Yan, Thomas}, * title = {The Geobucked Data Structure For Polynomials}, * journal = {Journal Of Symbolic Computation}, * volume = 23, * number = 3, * pages = {285 -- 293}, * year = 1998, * } *) val print : string -> unit = print type 'a array1 = 'a Array.array val sub1 = Array.sub val update1 = Array.update val array1 = Array.array val length1 = Array.length val op && = fn (i1, i2) => (Word.toInt (Word.andb (Word.fromInt (i1), Word.fromInt (i2)))) val op || = fn (i1, i2) => (Word.toInt (Word.orb (Word.fromInt (i1), Word.fromInt (i2)))) val op << = fn (i1, i2) => (Word.toInt (Word.<< (Word.fromInt (i1), Word.fromInt (i2)))) val op >> = fn (i1, i2) => (Word.toInt (Word.>> (Word.fromInt (i1), Word.fromInt (i2)))) infix && || << >> fun fold f l b = List.foldl f b l fun revfold f l b = List.foldr f b l val input_line = TextIO.inputLine val end_of_stream = TextIO.endOfStream val open_in = TextIO.openIn val close_in = TextIO.closeIn nonfix smlnj_mod nonfix smlnj_div val smlnj_mod = op mod val smlnj_div = op div infix 7 smlnj_mod infix 7 smlnj_div exception Tabulate fun tabulate (i,f) = if i <= 0 then raise Tabulate else let val a = array1(i,f 0) fun tabify j = if j < i then (update1(a,j,f j); tabify (j+1)) else a in tabify 1 end exception ArrayofList fun arrayoflist (hd::tl) = let val a = array1((length tl) + 1,hd) fun al([],_) = a | al(hd::tl,i) = (update1(a,i,hd); al(tl,i+1)) in al(tl,1) end | arrayoflist ([]) = raise ArrayofList structure Util = struct datatype relation = Less | Equal | Greater exception NotImplemented of string exception Impossible of string (* flag "impossible" condition *) exception Illegal of string (* flag function use violating precondition *) fun error exn msg = raise (exn msg) fun notImplemented msg = error NotImplemented msg fun impossible msg = error Impossible msg fun illegal msg = error Illegal msg (* arr[i] := obj :: arr[i]; extend non-empty arr if necessary *) fun insert (obj,i,arr) = let val len = length1 arr val res = if i length l + n) ls 0,obj0) fun ins (i,[]) = i | ins (i,x::l) = (update1(a,i,x); ins(i+1,l)) fun insert (i,[]) = a | insert (i,l::ll) = insert(ins(i,l),ll) in insert(0,ls) end *) (* given compare and array a, return list of contents of a sorted in * ascending order, with duplicates stripped out; which copy of a duplicate * remains is random. NOTE that a is modified. *) fun stripSort compare = fn a => let infix sub val op sub = sub1 and update = update1 fun swap (i,j) = let val ai = a sub i in update(a,i,a sub j); update(a,j,ai) end (* sort all a[k], 0<=i<=k (swap (lo,k); partition (lo+1,k+1,hi)) | Equal => partition (lo,k+1,hi) | Greater => (swap (k,hi-1); partition (lo,k,hi-1)) val (lo,hi) = partition (i,i,j) in s(i,lo,pivot::s(hi,j,acc)) end val res = s(0,length1 a,[]) in res end end structure F = struct val p = 17 datatype field = F of int (* for (F n), always 0<=n

=p then F(k-p) else F k end fun subtract (F n,F m) = if n>=m then F(n-m) else F(n-m+p) fun negate (F 0) = F 0 | negate (F n) = F(p-n) fun multiply (F n,F m) = F ((n*m) smlnj_mod p) fun reciprocal (F 0) = raise Div | reciprocal (F n) = let (* consider euclid gcd alg on (a,b) starting with a=p, b=n. * if maintain a = a1 n + a2 p, b = b1 n + b2 p, a>b, * then when 1 = a = a1 n + a2 p, have a1 = inverse of n mod p * note that it is not necessary to keep a2, b2 around. *) fun gcd ((a,a1),(b,b1)) = if b=1 then (* by continued fraction expansion, 0<|b1|

> *) (* unused code fun power(n,k) = if k<=3 then case k of 0 => one | 1 => n | 2 => multiply(n,n) | 3 => multiply(n,multiply(n,n)) | _ => reciprocal (power (n,~k)) (* know k<0 *) else if andb(k,1)=0 then power(multiply(n,n),rshift(k,1)) else multiply(n,power(multiply(n,n),rshift(k,1))) *) fun isZero (F n) = n=0 (* unused codeunless P.display is used fun equal (F n,F m) = n=m fun display (F n) = if n<=p smlnj_div 2 then Int.toString n else "-" ^ Int.toString (p-n) *) end structure M = struct (* MONO *) local val andb = op && infix sub << >> andb (* val op << = Bits.lshift and op >> = Bits.rshift and op andb = Bits.andb *) in (* encode (var,pwr) as a long word: hi word is var, lo word is pwr masks 0xffff for pwr, mask ~0x10000 for var, rshift 16 for var note that encoded pairs u, v have same var if u>=v, u andb ~0x10000 (print (Int.toString i); print ",")) x; print">") *) exception DoesntDivide (* unused code val numVars = 32 *) val one = M [] fun x_i v = M [(v<<16)+1] fun explode (M l) = map (fn v => (v>>16,v andb 65535)) l fun implode l = M (map (fn (v,p) => (v<<16)+p) l) val deg = let fun d([],n) = n | d(u::ul,n) = d(ul,(u andb 65535) + n) in fn (M l) => d(l,0) end (* x^k > y^l if x>k or x=y and k>l *) val compare = let fun cmp ([],[]) = Util.Equal | cmp (_::_,[]) = Util.Greater | cmp ([],_::_) = Util.Less | cmp ((u::us), (v::vs)) = if u=v then cmp (us,vs) else if uv *) Util.Greater in fn (M m,M m') => cmp(m,m') end fun display (M (l : int list)) : string = let fun dv v = if v<26 then chr (v+ord #"a") else chr (v-26+ord #"A") fun d (vv,acc) = let val v = vv>>16 and p = vv andb 65535 in if p=1 then dv v::acc else (dv v)::(String.explode (Int.toString p)) @ acc end in String.implode(fold d l []) end val multiply = let fun mul ([],m) = m | mul (m,[]) = m | mul (u::us, v::vs) = let val uu = u andb ~65536 in if uu = (v andb ~65536) then let val w = u + (v andb 65535) in if uu = (w andb ~65536) then w::mul(us,vs) else (Util.illegal (String.concat ["Mono.multiply overflow: ", display (M(u::us)),", ", display (M(v::vs))])) end else if u>v then u :: mul(us,v::vs) else (* u M (mul (m,m')) end val lcm = let fun lcm ([],m) = m | lcm (m,[]) = m | lcm (u::us, v::vs) = if u>=v then if (u andb ~65536) M (lcm (m,m')) end val tryDivide = let fun rev([],l) = l | rev(x::xs,l)=rev(xs,x::l) fun d (m,[],q) = SOME(M(rev(q,m))) | d ([],_::_,_) = NONE | d (u::us,v::vs,q) = if u d (m,m',[]) end fun divide (m,m') = case tryDivide(m,m') of SOME q => q | NONE => raise DoesntDivide end end (* local, structure M *) structure MI = struct (* MONO_IDEAL *) (* trie: * index first by increasing order of vars * children listed in increasing degree order *) datatype 'a mono_trie = MT of 'a option * (int * 'a mono_trie) list (* tag, encoded (var,pwr) and children *) datatype 'a mono_ideal = MI of (int * 'a mono_trie) ref (* int maxDegree = least degree > all elements *) fun rev ([],l) = l | rev (x::xs,l) = rev(xs,x::l) (* unused code fun tl (_::l) = l | tl [] = raise (Util.Impossible "MONO_IDEAL.tl") fun hd (x::_) = x | hd [] = raise (Util.Impossible "MONO_IDEAL.hd") *) val emptyTrie = MT(NONE,[]) fun mkEmpty () = MI(ref (0,emptyTrie)) (* unused code unless searchDeg is used fun maxDeg (MI(x)) = #1(!x) *) val lshift = op << (* unused code unless decode is used val rshift = op >> *) val andb = op && (* unused code val orb = op || *) fun encode (var,pwr) = lshift(var,16)+pwr (* unused code fun decode vp = (rshift(vp,16),andb(vp,65535)) *) fun grabVar vp = andb(vp,~65536) fun grabPwr vp = andb(vp,65535) fun smallerVar (vp,vp') = vp < andb(vp',~65536) exception Found fun search (MI(x),M.M m') = let val (d,mt) = !x val result = ref NONE (* exception Found of M.mono * '_a *) (* s works on remaining input mono, current output mono, tag, trie *) fun s (_,m,MT(SOME a,_)) = raise(result := SOME (M.M m,a); Found) | s (m',m,MT(NONE,trie)) = s'(m',m,trie) and s'([],_,_) = NONE | s'(_,_,[]) = NONE | s'(vp'::m',m,trie as (vp,child)::children) = if smallerVar(vp',vp) then s'(m',m,trie) else if grabPwr vp = 0 then (s(vp'::m',m,child); s'(vp'::m',m,children)) else if smallerVar(vp,vp') then NONE else if vp<=vp' then (s(m',vp::m,child); s'(vp'::m',m,children)) else NONE in s(rev(m',[]),[],mt) handle Found (* (m,a) => SOME(m,a) *) => !result end (* assume m is a new generator, i.e. not a multiple of an existing one *) fun insert (MI (mi),m,a) = let val (d,mt) = !mi fun i ([],MT (SOME _,_)) = Util.illegal "MONO_IDEAL.insert duplicate" | i ([],MT (NONE,children)) = MT(SOME a,children) | i (vp::m,MT(a',[])) = MT(a',[(vp,i(m,emptyTrie))]) | i (vp::m,mt as MT(a',trie as (vp',_)::_)) = let fun j [] = [(vp,i(m,emptyTrie))] | j ((vp',child)::children) = if vp M.compare (m,m')) msa val buckets = revfold ins ms (array1(0,[])) val n = length1 buckets val mi = mkEmpty() fun sort i = if i>=n then mi else let fun redundant (m,_) = case search(mi,m) of NONE => false | SOME _ => true fun filter ([],l) = app (fn (m,a) => insert(mi,m,a)) l | filter (x::xx,l) = if redundant x then filter(xx,l) else filter(xx,x::l) in filter(sub1(buckets,i),[]); update1(buckets,i,[]); sort(i+1) end in sort 0 end fun fold g (MI(x)) init = let val (_,mt) = !x fun f(acc,m,MT(NONE,children)) = f'(acc,m,children) | f(acc,m,MT(SOME a,children)) = f'(g((M.M m,a),acc),m,children) and f'(acc,m,[]) = acc | f'(acc,m,(vp,child)::children) = if grabPwr vp=0 then f'(f(acc,m,child),m,children) else f'(f(acc,vp::m,child),m,children) in f(init,[],mt) end (* unused code fun searchDeg (mi,d) = if d>maxDeg mi then [] else fold (fn ((m,a),l) => if M.deg m=d then (m,a)::l else l) mi [] *) end (* structure MI *) val log = let fun log(n,l) = if n<=1 then l else log((n >> 1),1+l) in fn n => log(n,0) end val maxLeft = ref 0 val maxRight = ref 0 val counts = tabulate(20,fn _ => array1(20,0)) val indices = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] (* unused code fun resetCounts() = app(fn i => app (fn j => update1(sub1(counts,i),j,0)) indices) indices *) fun pair(l,r) = let val l = log l and r = log r val _ = maxLeft := Int.max(!maxLeft,l) and _ = maxRight := Int.max(!maxRight,r) val a = sub1(counts,l) in update1(a,r,sub1(a,r)+1) end (* unused code unless printCounts is used fun getCounts () = map (fn i => map (fn j => sub1(sub1(counts,i),j)) indices) indices *) structure P = struct datatype poly = P of (F.field*M.mono) list (* descending mono order *) (* fun show (P x) = (print "[ "; app (fn (f, m) => (print "("; F.show f; print ","; M.show m; print ") ")) x; print " ]") *) val zero = P [] (* unused code unless power is used val one = P [(F.one,M.one)] *) (* unused code fun coerceInt n = P [(F.coerceInt n,M.one)] fun coerceField a = P [(a,M.one)] fun coerceMono m = P [(F.one,m)] *) fun coerce (a,m) = P [(a,m)] fun implode p = P p fun cons (am,P p) = P (am::p) local fun neg p = (map (fn (a,m) => (F.negate a,m)) p) fun plus ([],p2) = p2 | plus (p1,[]) = p1 | plus ((a,m)::ms,(b,n)::ns) = case M.compare(m,n) of Util.Less => (b,n) :: plus ((a,m)::ms,ns) | Util.Greater => (a,m) :: plus (ms,(b,n)::ns) | Util.Equal => let val c = F.add(a,b) in if F.isZero c then plus(ms,ns) else (c,m)::plus(ms,ns) end fun minus ([],p2) = neg p2 | minus (p1,[]) = p1 | minus ((a,m)::ms,(b,n)::ns) = case M.compare(m,n) of Util.Less => (F.negate b,n) :: minus ((a,m)::ms,ns) | Util.Greater => (a,m) :: minus (ms,(b,n)::ns) | Util.Equal => let val c = F.subtract(a,b) in if F.isZero c then minus(ms,ns) else (c,m)::minus(ms,ns) end fun termMult (a,m,p) = (map (fn (a',m') => (F.multiply(a,a'),M.multiply(m,m'))) p) in (* unused code fun negate (P p) = P (neg p) *) fun add (P p1,P p2) = (pair(length p1,length p2); P (plus(p1,p2))) fun subtract (P p1,P p2) = (pair(length p1,length p2); P (minus(p1,p2))) (* unused code unless power is used val multiply = let fun times (p1,p2) = revfold (fn ((a,m),tot) => plus (termMult(a,m,p2),tot)) p1 [] in fn (P p1,P p2) => if length p1 > length p2 then P(times (p2,p1)) else P(times (p1,p2)) end *) (* unused code fun singleReduce (P y,a,m,P x) = (pair(length y,length x); P(minus(y,termMult(a,m,x)))) *) fun spair (a,m,P f,b,n,P g) = (pair(length f,length g); P(minus(termMult(a,m,f),termMult(b,n,g)))) val termMult = fn (a,m,P f) => P(termMult(a,m,f)) end (* unused code unless power is used val rshift = op >> val lshift = op << *) (* unused code val andb = op && val orb = op || *) fun scalarMult (a,P p) = P (map (fn (b,m) => (F.multiply(a,b),m)) p) (* unused code fun power(p,k) = if k<=3 then case k of 0 => one | 1 => p | 2 => multiply(p,p) | 3 => multiply(p,multiply(p,p)) | _ => Util.illegal "POLY.power with k<0" else if andb(k,1)=0 then power(multiply(p,p),rshift(k,1)) else multiply(p,power(multiply(p,p),rshift(k,1))) *) fun isZero (P []) = true | isZero (P (_::_)) = false (* unused code val equal = let fun eq ([],[]) = true | eq (_::_,[]) = false | eq ([],_::_) = false | eq ((a,m)::p,(b,n)::q) = F.equal(a,b) andalso M.compare(m,n)=Util.Equal andalso eq (p,q) in fn (P p,P q) => eq (p,q) end *) (* these should only be called if there is a leading term, i.e. poly<>0 *) (* unused code fun leadTerm (P(am::_)) = am | leadTerm (P []) = Util.illegal "POLY.leadTerm" *) fun leadMono (P((_,m)::_)) = m | leadMono (P []) = Util.illegal "POLY.leadMono" fun leadCoeff (P((a,_)::_)) = a | leadCoeff (P []) = Util.illegal "POLY.leadCoeff" fun rest (P (_::p)) = P p | rest (P []) = Util.illegal "POLY.rest" fun leadAndRest (P (lead::rest)) = (lead,P rest) | leadAndRest (P []) = Util.illegal "POLY.leadAndRest" fun deg (P []) = Util.illegal "POLY.deg on zero poly" | deg (P ((_,m)::_)) = M.deg m (* homogeneous poly *) fun numTerms (P p) = length p (* only used if r is used fun display (P []) = F.display F.zero | display (P p) = let fun dsp (a,m) = let val s = if M.deg m = 0 then F.display a else if F.equal(F.one,F.negate a) then "-" ^ M.display m else if F.equal(F.one,a) then M.display m else F.display a ^ M.display m in if substring(s,0,1)="-" then s else "+" ^ s end in String.concat(map dsp p) end *) end structure HP = struct datatype hpoly = HP of P.poly array1 val log = let fun log(n,l) = if n<8 then l else log((n >> 2),1+l) in fn n => log(n,0) end fun mkHPoly p = let val l = log(P.numTerms p) in HP(tabulate(l+1,fn i => if i=l then p else P.zero)) end fun add(p,HP ps) = let val l = log(P.numTerms p) in if l>=length1 ps then let val n = length1 ps in HP(tabulate(n+n, fn i => if i=n then lar'(m,indices) else let val p = sub1(ps,i) in if P.isZero p then lar(m,indices,i+1) else if null indices then lar(P.leadMono p,[i],i+1) else case M.compare(m,P.leadMono p) of Util.Less => lar(P.leadMono p,[i],i+1) | Util.Equal => lar(m,i::indices,i+1) | Util.Greater => lar(m,indices,i+1) end and lar' (_,[]) = NONE | lar' (m,i::is) = let fun extract i = case P.leadAndRest(sub1(ps,i)) of ((a,_),rest) => (update1(ps,i,rest); a) val a = revfold (fn (j,b) => F.add(extract j,b)) is (extract i) in if F.isZero a then lar(M.one,[],0) else SOME(a,m,HP ps) end in lar(M.one,[],0) end end structure G = struct val autoReduce = ref true val maxDeg = ref 10000 val maybePairs = ref 0 val primePairs = ref 0 val usedPairs = ref 0 val newGens = ref 0 fun reset () = (maybePairs:=0; primePairs:=0; usedPairs:=0; newGens:=0) fun inc r = r := !r + 1 fun reduce (f,mi) = if P.isZero f then f else let (* use accumulator and reverse at end? *) fun r hp = case HP.leadAndRest hp of NONE => [] | (SOME(a,m,hp)) => case MI.search(mi,m) of NONE => (a,m)::(r hp) | SOME (m',p) => r (HP.add(P.termMult(F.negate a,M.divide(m,m'),!p),hp)) in P.implode(r (HP.mkHPoly f)) end (* assume f<>0 *) fun mkMonic f = P.scalarMult(F.reciprocal(P.leadCoeff f),f) (* given monic h, a monomial ideal mi of m's tagged with g's representing * an ideal (g1,...,gn): a poly g is represented as (lead mono m,rest of g). * update pairs to include new s-pairs induced by h on g's: * 1) compute minimal gi1...gik so that generate , i.e. * compute monomial ideal for gi:h's tagged with gi * 2) toss out gij's whose lead mono is rel. prime to h's lead mono (why?) * 3) put (h,gij) pairs into degree buckets: for h,gij with lead mono's m,m' * deg(h,gij) = deg lcm(m,m') = deg (lcm/m) + deg m = deg (m':m) + deg m * 4) store list of pairs (h,g1),...,(h,gn) as vector (h,g1,...,gn) *) fun addPairs (h,mi,pairs) = let val m = P.leadMono h val d = M.deg m fun tag ((m' : M.mono,g' : P.poly ref),quots) = (inc maybePairs; (M.divide(M.lcm(m,m'),m),(m',!g'))::quots) fun insert ((mm,(m',g')),arr) = (* recall mm = m':m *) if M.compare(m',mm)=Util.Equal then (* rel. prime *) (inc primePairs; arr) else (inc usedPairs; Util.insert(P.cons((F.one,m'),g'),M.deg mm+d,arr)) val buckets = MI.fold insert (MI.mkIdeal (MI.fold tag mi [])) (array1(0,[])) fun ins (~1,pairs) = pairs | ins (i,pairs) = case sub1(buckets,i) of [] => ins(i-1,pairs) | gs => ins(i-1,Util.insert(arrayoflist(h::gs),i,pairs)) in ins(length1 buckets - 1,pairs) end fun grobner fs = let fun pr l = print (String.concat (l@["\n"])) val fs = revfold (fn (f,fs) => Util.insert(f,P.deg f,fs)) fs (array1(0,[])) (* pairs at least as long as fs, so done when done w/ all pairs *) val pairs = ref(array1(length1 fs,[])) val mi = MI.mkEmpty() val newDegGens = ref [] val addGen = (* add and maybe auto-reduce new monic generator h *) if not(!autoReduce) then fn h => MI.insert (mi,P.leadMono h,ref (P.rest h)) else fn h => let val ((_,m),rh) = P.leadAndRest h fun autoReduce f = if P.isZero f then f else let val ((a,m'),rf) = P.leadAndRest f in case M.compare(m,m') of Util.Less => P.cons((a,m'),autoReduce rf) | Util.Equal => P.subtract(rf,P.scalarMult(a,rh)) | Util.Greater => f end val rrh = ref rh in MI.insert (mi,P.leadMono h,rrh); app (fn f => f:=autoReduce(!f)) (!newDegGens); newDegGens := rrh :: !newDegGens end val tasksleft = ref 0 fun feedback () = let val n = !tasksleft in if (n && 15)=0 then print (Int.toString n) else (); print "."; TextIO.flushOut TextIO.stdOut; tasksleft := n-1 end fun try h = let val _ = feedback () val h = reduce(h,mi) in if P.isZero h then () else let val h = mkMonic h val _ = (print "#"; TextIO.flushOut TextIO.stdOut) in pairs := addPairs(h,mi,!pairs); addGen h; inc newGens end end fun tryPairs fgs = let val ((a,m),f) = P.leadAndRest (sub1(fgs,0)) fun tryPair i = if i=0 then () else let val ((b,n),g) = P.leadAndRest (sub1(fgs,i)) val k = M.lcm(m,n) in try (P.spair(b,M.divide(k,m),f,a,M.divide(k,n),g)); tryPair (i-1) end in tryPair (length1 fgs -1) end fun numPairs ([],n) = n | numPairs (p::ps,n) = numPairs(ps,n-1+length1 p) fun gb d = if d>=length1(!pairs) then mi else (* note: i nullify entries to reclaim space *) ( pr ["DEGREE ",Int.toString d," with ", Int.toString(numPairs(sub1(!pairs,d),0))," pairs ", if d>=length1 fs then "0" else Int.toString(length(sub1(fs,d))), " generators to do"]; tasksleft := numPairs(sub1(!pairs,d),0); if d>=length1 fs then () else tasksleft := !tasksleft + length (sub1(fs,d)); if d>(!maxDeg) then () else ( reset(); newDegGens := []; app tryPairs (sub1(!pairs,d)); update1(!pairs,d,[]); if d>=length1 fs then () else (app try (sub1(fs,d)); update1(fs,d,[])); pr ["maybe ",Int.toString(!maybePairs)," prime ", Int.toString (!primePairs), " using ",Int.toString (!usedPairs), "; found ",Int.toString (!newGens)] ); gb(d+1) ) in gb 0 end local (* grammar: dig ::= 0 | ... | 9 var ::= a | ... | z | A | ... | Z sign ::= + | - nat ::= dig | nat dig mono ::= | var mono | var num mono term ::= nat mono | mono poly ::= term | sign term | poly sign term *) datatype char = Dig of int | Var of int | Sign of int fun char ch = let val och = ord ch in if ord #"0"<=och andalso och<=ord #"9" then Dig (och - ord #"0") else if ord #"a"<=och andalso och<=ord #"z" then Var (och - ord #"a") else if ord #"A"<=och andalso och<=ord #"Z" then Var (och - ord #"A" + 26) else if och = ord #"+" then Sign 1 else if och = ord #"-" then Sign ~1 else Util.illegal ("bad ch in poly: " ^ (Char.toString(ch))) end fun nat (n,Dig d::l) = nat(n*10+d,l) | nat (n,l) = (n,l) fun mono (m,Var v::Dig d::l) = let val (n,l) = nat(d,l) in mono(M.multiply(M.implode[(v,n)],m),l) end | mono (m,Var v::l) = mono(M.multiply(M.x_i v,m),l) | mono (m,l) = (m,l) fun term l = let val (n,l) = case l of (Dig d::l) => nat(d,l) | _ => (1,l) val (m,l) = mono(M.one,l) in ((F.coerceInt n,m),l) end fun poly (p,[]) = p | poly (p,l) = let val (s,l) = case l of Sign s::l => (F.coerceInt s,l) | _ => (F.one,l) val ((a,m),l) = term l in poly(P.add(P.coerce(F.multiply(s,a),m),p),l) end in fun parsePoly s = poly (P.zero,map char(String.explode s)) (* unused code fun readIdeal stream = let fun readLine () = let val s = input_line stream val n = size s val n = if n>0 andalso substring(s,n-1,1)="\n" then n-1 else n fun r i = if i>=n then [] else case substring(s,i,1) of ";" => r(i+1) | " " => r(i+1) | _ => map char (String.explode(substring(s,i,n-i))) in r 0 end fun r () = if end_of_stream stream then [] else poly(P.zero,readLine()) :: r() fun num() = if end_of_stream stream then Util.illegal "missing #" else case nat(0,readLine()) of (_,_::_) => Util.illegal "junk after #" | (n,_) => n val _ = 1=num() orelse Util.illegal "stream doesn't start w/ `1'" val n = num() val i = r() val _ = length i = n orelse Util.illegal "wrong # poly's" in i end *) (* unused code fun read filename = let val stream = open_in filename val i = readIdeal stream val _ = close_in stream in i end *) end (* local *) end (* structure G *) val _ = G.maxDeg:=1000000 fun grab mi = MI.fold (fn ((m,g),l) => P.cons((F.one,m),!g)::l) mi [] (* unused code fun r mi s = let val p = G.parsePoly s in print (P.display p); print "\n"; print (P.display(G.reduce(p,mi))); print "\n" end *) (* unused code unless printCounts is used fun p6 i= let val s= Int.toString (i:int) val n= size s in print(substring(" ",0,6-n)); print s end *) (* unused code fun hex n = let fun h n = if n=0 then "" else h(n smlnj_div 16) ^ substring("0123456789ABCDEF",n smlnj_mod 16,1) in if n=0 then "0" else h n end fun printCounts () = map (fn l => (map p6 l; print "\n")) (getCounts()) fun totalCount () = revfold (fn (l,c) => revfold op + l c) (getCounts()) 0 *) (* unused code fun maxCount () = revfold (fn (l,m) => revfold Int.max l m) (getCounts()) 0 *) (* unused code unless analyze is used fun terms (p,tt) = if P.isZero p then tt else terms(P.rest p,P.leadMono p::tt) fun tails ([],tt) = tt | tails (t as _::t',tt) = tails (t',t::tt) *) (* Unused code unless sort (analyze) is used local val a = 16807.0 and m = 2147483647.0 in val seed = ref 1.0 fun random n = let val t = a*(!seed) in seed := t - m * real(floor(t/m)); floor(real n * !seed/m) end end *) (* Unused code unless analyze is used fun sort [] = [] | sort a = let val a = arrayoflist a val b = tabulate(length1 a,fn i => i) val sub = sub1 and update = update1 infix sub fun swap (i,j) = let val ai = a sub i in update(a,i,a sub j); update(a,j,ai) end (* sort all k, 0<=i<=k (swap (lo,k); partition (dup,lo+1,k+1,hi)) | Util.Equal => partition (dup+1,lo,k+1,hi) | Util.Greater => (swap (k,hi-1); partition (dup,lo,k,hi-1))) val (dup,lo,hi) = partition (0,i,i,j) in s(i,lo,(dup,pivot)::s(hi,j,acc)) end in s(0,length1 a,[]) end *) (* Unused code unless analyze is used fun sum f l = revfold op + (map f l) 0 *) (* Unused code included in the benchmark fun analyze gb = let val aa = revfold terms gb [] val bb = map M.explode aa val aa = sort aa fun len m = length (M.explode m) fun prt (s:string) (i:int) = (print s; print(Int.toString i); print "\n"; i) val m= sum #1 aa val u= length aa val cm =sum (fn (d,l) => d*len l) aa val cu =sum (len o #2) aa val for=length(sort(map M.implode (revfold tails bb []))) val bak=length(sort(map (M.implode o rev) (revfold tails (map rev bb) []))) in {m=prt "m = " m, u=prt "u = " u, cm =prt "cm = " cm, cu =prt "cu = " cu, for=prt "for= " for, bak=prt "bak= " bak} end *) fun gb fs = let val g = G.grobner fs handle (Util.Illegal s) => (print s; raise Div) val fs = grab g fun info f = app print [M.display(P.leadMono f), " + ", Int.toString(P.numTerms f - 1), " terms\n"] in app info fs end fun report (e as Tabulate) = (print "exn: Tabulate\n"; raise e) | report (e as ArrayofList) = (print "exn: ArrayofList\n"; raise e) | report (e as (Util.NotImplemented s)) = (print ("exn: NotImplemented " ^ s ^ "\n"); raise e) | report (e as (Util.Impossible s)) = (print ("exn: Impossible " ^ s ^ "\n"); raise e) | report (e as (Util.Illegal s)) = (print ("exn: Illegal " ^ s ^ "\n"); raise e) | report (e as (M.DoesntDivide)) = (print ("exn: DoesntDivide\n"); raise e) | report (e as (MI.Found)) = (print ("exn: Found\n"); raise e) (* rather long running test case *) (* val fs = map G.parsePoly * ["-El-Dh-Cd+Bo+xn+tm","-Fo+Ep-Ek-Dg-Cc+Ao+wn+sm","-Fn-Ej+Dp-Df-Cb+zo+vn+rm", * "-Fm-Ei-De+Cp-Ca+yo+un+qm","Fl-Bp+Bk-Al-zh-yd+xj+ti","El-Bo-zg-yc+wj+si", * "Dl-Bn-Aj+zk-zf-yb+vj+ri","Cl-Bm-Ai-ze+yk-ya+uj+qi", * "Fh+Bg-xp+xf-wl-vh-ud+te","Eh+Ag-xo-wk+wf-vg-uc+se","Dh+zg-xn-wj-ub+re", * "Ch+yg-xm-wi-ve+uf-ua+qe","Fd+Bc+xb-tp+ta-sl-rh-qd", * "Ed+Ac+wb-to-sk+sa-rg-qc","Dd+zc+vb-tn-sj-rf+ra-qb","Cd+yc+ub-tm-si-re"] *) (* rather long running test case *) (* val u7 = map G.parsePoly * ["abcdefg-h7","a+b+c+d+e+f+g","ab+bc+cd+de+ef+fg+ga", * "abc+bcd+cde+def+efg+fga+gab","abcd+bcde+cdef+defg+efga+fgab+gabc", * "abcde+bcdef+cdefg+defga+efgab+fgabc+gabcd", * "abcdef+bcdefg+cdefga+defgab+efgabc+fgabcd+gabcde"] *) (* val u5 = map G.parsePoly ["abcde-f5","a+b+c+d+e","ab+bc+cd+de+ea", * "abc+bcd+cde+dea+eab","abcd+bcde+cdea+deab+eabc"] * * val u4 = map G.parsePoly ["abcd-e4","a+b+c+d","ab+bc+cd+da","abc+bcd+cda+dab"] * *) (* fun runit () = * let * val _ = (print "Enter fs, u7, u6, u5, or u4: "; * TextIO.flushOut TextIO.stdOut) * val s = TextIO.inputN(TextIO.stdIn,2) * val data = * if (s = "fs") then fs else if (s = "u7") then u7 * else if (s = "u6") then u6 else if (s = "u5") then u5 * else if (s = "u4") then u4 else * (print "no such data\n"; raise (Util.Impossible "no such data")) * in * gb data handle e => report e * end *) structure Main = struct fun doit n = let val u6 = map G.parsePoly ["abcdef-g6","a+b+c+d+e+f","ab+bc+cd+de+ef+fa", "abc+bcd+cde+def+efa+fab", "abcd+bcde+cdef+defa+efab+fabc", "abcde+bcdef+cdefa+defab+efabc+fabcd"] fun loop n = if n = 0 then () else (gb u6; loop (n - 1)) in loop n end end mlton-20210117+dfsg/benchmark/tests/vector-rev.sml000066400000000000000000000011241416264345000217310ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct open Vector fun rev v = let val n = length v in tabulate (n, fn i => sub (v, n - 1 - i)) end fun doit n = let val v = tabulate (200000, fn i => i) fun loop n = if n < 0 then () else if 0 = sub (rev (rev v), 0) then loop (n - 1) else raise Fail "bug" in loop (n * 1000) end end mlton-20210117+dfsg/benchmark/tests/vector32-concat.sml000066400000000000000000000010541416264345000225530ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let val len = 20000 val sum = Int32.fromInt (len * (len - 1)) val v = Vector.tabulate (len, fn i => Int32.fromInt i) fun loop n = if n < 0 then () else if sum = Vector.foldl (op +) 0 (Vector.concat [v, v]) then loop (n - 1) else raise Fail "bug" in loop (n * 10000) end end mlton-20210117+dfsg/benchmark/tests/vector64-concat.sml000066400000000000000000000010541416264345000225600ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let val len = 20000 val sum = Int64.fromInt (len * (len - 1)) val v = Vector.tabulate (len, fn i => Int64.fromInt i) fun loop n = if n < 0 then () else if sum = Vector.foldl (op +) 0 (Vector.concat [v, v]) then loop (n - 1) else raise Fail "bug" in loop (n * 10000) end end mlton-20210117+dfsg/benchmark/tests/vliw.sml000066400000000000000000003605371416264345000206360ustar00rootroot00000000000000(* From the SML/NJ benchmark suite. *) fun print _ = () signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; open Array (* List *) infix 9 sub fun fold f x y = List.foldr f y x fun revfold f x y = List.foldl f y x val makestring = Int.toString local open Real in val realEq = == val realNe = != end exception NotAChar fun fromStr x = (case Char.fromString x of SOME c => c | NONE => raise NotAChar) fun ordof(s, i) = Char.ord(String.sub(s, i)) val explode = (fn x => map Char.toString (explode x)) val implode = (fn x => implode (map fromStr x)) fun ord s = Char.ord (fromStr s) val output = TextIO.output val std_out = TextIO.stdOut val open_in = TextIO.openIn val open_out = TextIO.openOut val close_in = TextIO.closeIn val close_out = TextIO.closeOut val input_line = fn ins => case TextIO.inputLine ins of NONE => "" | SOME s => s type instream = TextIO.instream type outstream = TextIO.outstream fun outputc f x = TextIO.output(f, x) exception NotAReal fun strToReal s = (case Real.fromString s of SOME r => r | _ => raise NotAReal) fun intToReal x = (strToReal ((Int.toString x) ^ ".0")) structure Bits = struct fun wrap (f : Word.word * Word.word -> Word.word) = (fn (x : int, y : int) => Word.toInt(f(Word.fromInt x, Word.fromInt y))) val orb = wrap Word.orb val andb = wrap Word.andb val xorb = wrap Word.xorb val lshift = wrap Word.<< val rshift = wrap Word.>> end structure Ref = struct val inc = fn x => (x := !x + 1) val dec = fn x => (x := !x - 1) end (* stringmap.sml *) signature STRINGMAP = sig type 'a stringmap exception Stringmap val new : unit -> 'a stringmap val add : 'a stringmap -> string * 'a -> unit val rm : 'a stringmap -> string -> unit val map : 'a stringmap -> string -> 'a val app : (string * 'a -> unit) -> 'a stringmap -> unit val isin : 'a stringmap -> string -> bool val extract : 'a stringmap -> 'a list end structure Stringmap : STRINGMAP = struct type 'a stringmap = (string * 'a) list array exception Stringmap val hashFactor = 32 and tableSize = 2357 (* a string hashing function returns a number between 0 and tableSize-1 *) fun hash(str: string) : int = let val nchars = String.size str fun loop(i,n,r) = if i < n then loop(i+1,n,(hashFactor * r + ordof(str,i)) mod tableSize) else r in loop(0,nchars,0) (* while !i < nchars do (n := (hashFactor * !n + ordof(str, !i)) mod tableSize; i := !i + 1); !n *) end (* create a new stringmap *) fun new (): 'a stringmap = array(tableSize,nil) (* add a mapping pair s +-> x to the stringmap a *) fun add a (s,x) = let val index = hash s in update(a,index,(s,x)::(a sub index)) end (* apply the stringmap a to the index string s *) fun map a s = let fun find ((s',x)::r) = if s=s' then x else find r | find nil = raise Stringmap in find (a sub (hash s)) end (* return true if the string is in the map, false otherwise *) fun isin a s = ((map a s; true) handle Stringmap => false) (* remove all pairs mapping string s from stringmap a *) fun rm a s = let fun f ((b as (s',j))::r) = if s=s' then f r else b :: f r | f nil = nil val index = hash s in update(a,index, f(a sub index)) end (* apply a function f to all mapping pairs in stringmap a *) fun app (f: string * 'a -> unit) a = let fun zap 0 = () | zap n = let val m = n-1 in List.app f (a sub m); zap m end in zap tableSize end (* extract the stringmap items as a list *) fun extract a = let fun atol n = if n < Array.length a then (a sub n) :: atol (n + 1) else nil val al = atol 0 fun flatten (a, b) = a @ b val fal = fold flatten al nil fun strip (s, v) = v val answer = List.map strip fal in answer end end (* Stringmap *) structure StrPak : sig val stringListString : string list -> string end = struct fun sl nil = "]" | sl (h::nil) = h ^ "]" | sl (h::n::t) = h ^ "," ^ sl (n::t) fun stringListString l = "[" ^ sl l end signature SortObjSig = sig type obj val gt : obj * obj -> bool end functor Sort ( objfun : SortObjSig ) : sig type obj val sort : obj list -> obj list end = struct open objfun type obj = objfun.obj fun sort l = let fun m2 (nil, b) = b | m2 (a, nil) = a | m2 (ha::ta, hb::tb) = if gt(ha, hb) then hb::(m2(ha::ta, tb)) else ha::(m2(ta, hb::tb)) fun ml (nil) = nil | ml (h::nil) = h | ml (h1::h2::nil) = m2(h1, h2) | ml (h1::h2::l) = ml [m2(h1, h2), (ml l)] in ml (map (fn x => [x]) l) end end structure IntImp = struct type obj = int fun gt(a:obj, b:obj) = a > b end structure INTSort = Sort ( IntImp ) structure Set : sig exception SET exception LISTUNION type 'a set val make : ''a set val makeEQ : ('a * 'a -> bool) -> 'a set val listToSet : ''a list -> ''a set val listToSetEQ : ('a * 'a -> bool) * 'a list -> 'a set val add : 'a set * 'a -> 'a set val union : 'a set * 'a set -> 'a set val listUnion : 'a set list -> 'a set val listUnionEQ : ('a * 'a -> bool) * 'a set list -> 'a set val rm : 'a set * 'a -> 'a set val intersect : 'a set * 'a set -> 'a set val diff : 'a set * 'a set -> 'a set val member : 'a set * 'a -> bool val set : 'a set -> 'a list val mag : 'a set -> int val empty : 'a set -> bool end = struct datatype 'a set = S of ('a*'a->bool) * 'a list exception SET exception LISTUNION fun eqf (x, y) = x = y val make = S (eqf, nil) fun makeEQ eqf = S (eqf, nil) fun set (S (eqf, a)) = a fun member (S (eqf, nil), e) = false | member (S (eqf, (s::t)), e) = eqf(e, s) orelse member(S (eqf, t), e) fun add(st as (S (eqf, s)), e) = if member(st, e) then st else S(eqf, e::s) fun listToSetEQ (eqf, l) = let fun f (nil, s) = s | f (h::t, s) = f(t, add(s, h)) in f(l, makeEQ eqf) end fun listToSet l = listToSetEQ (eqf, l) fun union (a, S (eqf, nil)) = a | union (S (eqf, nil), b) = b | union (S (eqf, e::a), b) = union(S (eqf, a), add(b, e)) fun listUnion (h::t) = fold union t h | listUnion _ = raise LISTUNION fun listUnionEQ (eqf, l) = fold union l (makeEQ eqf) fun rm (S (eqf, nil), x) = raise SET | rm (S (eqf, s::t), x) = if eqf(s, x) then S (eqf, t) else S(eqf, s :: set(rm(S (eqf, t), x))) fun intersect1 (a, S (eqf, nil), c) = S (eqf, c) | intersect1 (S (eqf, nil), b, c) = S (eqf, c) | intersect1 (S (eqf, a::t), b, c) = if member(b, a) then intersect1(S (eqf, t), b, a::c) else intersect1(S (eqf, t), b, c) fun intersect (a, b) = intersect1 (a, b, nil) fun diff (S (eqf, nil), b) = S (eqf, nil) | diff (S (eqf, a::t), b) = if member(b, a) then diff(S (eqf, t), b) else S (eqf, a :: set(diff(S (eqf, t), b))) fun mag s = List.length (set s) (* fun empty s = set s = nil *) fun empty (S(eqf, nil)) = true | empty (S(eqf, _)) = false end (* Copyright 1989 by AT&T Bell Laboratories *) (* updated by John Danskin at Princeton *) structure AbsMach = struct type reg = (int*string) type label = (int*string) datatype values = INT of int | REAL of real | LABVAL of int * int datatype arithop = imul | iadd | isub | idiv | orb | andb | xorb | rshift | lshift | fadd | fdiv | fmul | fsub | real | floor | logb datatype comparison = ilt | ieq | igt | ile | ige | ine | flt | feq | fgt | fle | fge | fne | inrange | outofrange datatype opcode = FETCH of {immutable: bool, offset: int, ptr: reg, dst: reg} (* dst := M[ptr+offset] if immutable then unaffected by any STORE other than through the allocptr *) | STORE of {offset: int, src: reg, ptr: reg} (* M[ptr+offset] := src *) | GETLAB of {lab: label, dst: reg} | GETREAL of {value: string, dst: reg} | ARITH of {oper: arithop, src1: reg, src2: reg, dst: reg} | ARITHI of {oper: arithop, src1: reg, src2: int, dst: reg} | MOVE of {src: reg, dst: reg} | BRANCH of {test: comparison, src1: reg, src2: reg, dst: label, live: reg list} | JUMP of {dst: reg, live: reg list} | LABEL of {lab:label, live: reg list} | WORD of {value: int} | LABWORD of {lab: label} | NOP | BOGUS of {reads: reg list, writes: reg list} val opcodeEq : opcode * opcode -> bool = (op =) end structure AbsMachImp : sig type reg type operation val oeq : operation * operation -> bool type comparison val ceq : comparison * comparison -> bool val write_o : operation -> reg Set.set val read_o : operation -> reg Set.set val write_c : comparison -> reg Set.set val read_c : comparison -> reg Set.set val resources_ok : operation list * comparison list -> bool datatype codetypes = ASSIGNMENT of operation | LABELREF of int * operation | COMPARISON of int * operation | FLOW of int * operation | TARGET of int * operation | EXIT of operation | JUNK of operation | NERGLE val classify : operation -> codetypes val maxreg : AbsMach.opcode list -> int end = struct type reg = int (* register strings will gum up set operations etc *) type operation = AbsMach.opcode type comparison = AbsMach.opcode fun oeq (a, b) = AbsMach.opcodeEq(a, b) fun ceq (a, b) = AbsMach.opcodeEq(a, b) fun reg(i, s) = i fun label(i, s) = i fun srl rl = Set.listToSet((map reg) rl) fun sr r = srl [r] val immutableMem = ~1 val mutableMem = ~2 val flowControl = ~3 (* comparisons are limited to one because of difficulty writing larger trees *) fun resources_ok(ops, c) = (List.length ops) <= 4 andalso (List.length c) <= 1 fun allocptr r = reg r = 1 fun write_o i = let open Set open AbsMach val f = fn FETCH{dst, ...} => sr dst | STORE{ptr, ...} => if allocptr ptr then listToSet [immutableMem, mutableMem] else listToSet [mutableMem] | GETLAB {dst, ...} => sr dst | GETREAL {dst, ...} => sr dst | ARITH {dst, ...} => sr dst | ARITHI {dst, ...} => sr dst | MOVE {dst, ...} => sr dst | JUMP _ => listToSet [flowControl] | BOGUS {writes, ...} => srl writes | _ => make in f i end fun write_c c = Set.listToSet [flowControl] val std_reg_list = [(1, ""), (2, ""), (3, ""), (4, ""), (5, "")] fun read i = let open Set open AbsMach val f = fn FETCH {immutable, ptr, ...} => let val mem = if immutable then immutableMem else mutableMem in add(sr ptr, mem) end | STORE {src, ptr, ...} => srl [src, ptr] | ARITH {src1, src2, ...} => srl [src1, src2] | ARITHI {src1, ...} => sr src1 | MOVE {src, ...} => sr src | BRANCH {src1, src2, ...} => srl [src1, src2] | JUMP {dst, ...} => srl (dst :: std_reg_list) | BOGUS {reads, ...} => srl reads | _ => make in f i end fun read_o i = read i fun read_c i = read i datatype codetypes = ASSIGNMENT of operation | LABELREF of int * operation | COMPARISON of int * operation | FLOW of int * operation | TARGET of int * operation | EXIT of operation | JUNK of operation | NERGLE fun maxreg li = let fun f (a, b) = Int.max(a, b) val r = (Set.set (Set.listUnion((map write_o li) @ (map read li)))) in fold f r 0 end fun classify i = let open AbsMach val f = fn FETCH _ => ASSIGNMENT i | STORE _ => ASSIGNMENT i | GETLAB{lab, dst} => LABELREF(label lab, i) | GETREAL _ => ASSIGNMENT i | ARITH _ => ASSIGNMENT i | ARITHI _ => ASSIGNMENT i | MOVE{src, dst} => if reg src = reg dst then NERGLE else ASSIGNMENT i | BRANCH{test,src1,src2,dst,live} => if test = ieq andalso (reg src1) = (reg src2) then FLOW (label dst, i) else COMPARISON (label dst, i) | JUMP _ => EXIT i | LABEL {lab, ...} => TARGET(label lab, i) | WORD _ => JUNK i | LABWORD _ => JUNK i | NOP => JUNK i | BOGUS _ => ASSIGNMENT i in f i end end structure ReadAbs : sig val read: instream -> AbsMach.opcode list end = struct open AbsMach exception ReadError fun readline(i,f) = let fun error s = (print("Error in line "^makestring i^": "^s^"\n"); raise ReadError) fun b(" "::rest) = b rest | b rest = rest val aop = fn "i"::"m"::"u"::"l"::l => (imul,l) | "i"::"a"::"d"::"d"::l => (iadd,l) | "i"::"s"::"u"::"b"::l => (isub,l) | "i"::"d"::"i"::"v"::l => (idiv,l) | "o"::"r"::"b"::" "::l=> (orb,l) | "a"::"n"::"d"::"b"::l => (andb,l) | "x"::"o"::"r"::"b"::l => (xorb,l) | "r"::"s"::"h"::"i"::"f"::"t"::l => (rshift,l) | "l"::"s"::"h"::"i"::"f"::"t"::l => (lshift,l) | "f"::"a"::"d"::"d"::l => (fadd,l) | "f"::"d"::"i"::"v"::l => (fdiv,l) | "f"::"m"::"u"::"l"::l => (fmul,l) | "f"::"s"::"u"::"b"::l => (fsub,l) | "r"::"e"::"a"::"l"::l => (real,l) | "f"::"l"::"o"::"o"::"r"::l => (floor,l) | "l"::"o"::"g"::"b"::l => (logb,l) | _ => error "illegal arithmetic operator" val com = fn "i"::"l"::"t"::l => (ilt,l) | "i"::"e"::"q"::l => (ieq,l) | "i"::"g"::"t"::l => (igt,l) | "i"::"l"::"e"::l => (ile,l) | "i"::"g"::"e"::l => (ige,l) | "i"::"n"::"e"::l => (ine,l) | "f"::"l"::"t"::l => (flt,l) | "f"::"e"::"q"::l => (feq,l) | "f"::"g"::"t"::l => (fgt,l) | "f"::"l"::"e"::l => (fle,l) | "f"::"g"::"e"::l => (fge,l) | "f"::"n"::"e"::l => (fne,l) | "i"::"n"::"r"::"a"::"n"::"g"::"e"::l => (inrange,l) | "o"::"u"::"t"::"o"::"f"::"r"::"a"::"n"::"g"::"e"::l => (outofrange,l) | _ => error "illegal comparison operator" fun immut("i"::l) = (true,l) | immut("m"::l) = (false,l) | immut _ = error "i or m required" fun int l = let val z = ord "0" fun f(n,l0 as d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else (n,l0) | f _ = error "in readabs.int" in f(0,l) end fun string l = let fun f("/"::l) = (nil,l) | f(a::l) = let val (s,l') = f l in (a::s, l') end | f _ = error "name not terminated by \"/\"" val (s,l') = f l in (implode s, l') end fun realc s = let val (sign,s) = case explode s of "~"::rest => (~1.0,rest) | s => (1.0,s) fun j(exp,d::dl,mant) = j(exp,dl,mant * 0.1 + intToReal(d)) | j(0,nil,mant) = mant*sign | j(exp,nil,mant) = if exp>0 then j(exp-1,nil,mant*10.0) else j(exp+1,nil,mant*0.1) fun h(esign,wholedigits,diglist,exp,nil) = j(esign*exp+wholedigits-1,diglist,0.0) | h(es,fd,dl,exp,d::s) = h(es,fd,dl,exp*10+(ord d - ord "0"),s) fun g(i,r,"E"::"~"::s)=h(~1,i,r,0,s) | g(i,r,"E"::s)=h(1,i,r,0,s) | g(i,r,d::s) = if d>="0" andalso d<="9" then g(i, (ord d - ord "0")::r, s) else h(1,i,r,0,nil) | g(i,r,nil) = h(1,i,r,0,nil) fun f(i,r,"."::s)=g(i,r,s) | f(i,r,s as "E"::_)=g(i,r,s) | f(i,r,d::s) = f(i+1,(ord(d)-ord("0"))::r,s) | f _ = error "bad in readdabs" in f(0,nil,s) end handle Overflow => error ("real constant "^s^" out of range") fun require((a:string)::ar, b::br) = if a=b then require(ar,br) else error(a^" required") | require(nil, br) = br | require(a::_,_) = error(a^" required") fun reg l = let val (s,l) = string l val l = require(["R"],l) val (i,l) = int l in ((i,s),l) end fun lab l = let val (s,l) = string l val l = require(["L"],l) val (i,l) = int l in ((i,s),l) end fun live l = let fun f(")"::_) = nil | f l = let val (r,l) = reg l in r::f(b l) end in f(b(require(["("],l))) end val opcode = fn "F"::"E"::"T"::"C"::"H"::l => let val (imm,l) = immut(b l) val (dst,l) = reg(b l) val (ptr,l) = reg(b(require(["M","["],b(require([":","="],b l))))) val (offset,l) = int(b(require(["+"],b l))) in require(["]"], b l); FETCH{immutable=imm,dst=dst,ptr=ptr,offset=offset} end | "S"::"T"::"O"::"R"::"E"::l => let val (ptr,l) = reg(b(require(["M","["],b l))) val (offset,l) = int(b(require(["+"],b l))) val (src,l) = reg(b(require([":","="],b(require(["]"], b l))))) in STORE{src=src,ptr=ptr,offset=offset} end | "G"::"E"::"T"::"L"::"A"::"B"::l => let val (dst,l) = reg(b l) val (lab,l) = lab(b(require([":","="],b l))) in GETLAB{dst=dst,lab=lab} end | "G"::"E"::"T"::"R"::"E"::"A"::"L"::l => let val (dst,l) = reg(b l) val r = realc(implode(b(require([":","="],b l)))) in GETREAL{dst=dst,value=Real.toString r} end | "A"::"R"::"I"::"T"::"H"::"I"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) val (oper,l) = aop(b l) val (s2,l) = int(b l) in ARITHI{oper=oper,src1=s1,src2=s2,dst=dst} end | "A"::"R"::"I"::"T"::"H"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) val (oper,l) = aop(b l) val (s2,l) = reg(b l) in ARITH{oper=oper,src1=s1,src2=s2,dst=dst} end | "M"::"O"::"V"::"E"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) in MOVE{src=s1,dst=dst} end | "B"::"R"::"A"::"N"::"C"::"H"::l => let val (s1,l) = reg(b(require(["I","F"],b l))) val (test,l) = com(b l) val (s2,l) = reg(b l) val (dst,l) = lab(b(require(["G","O","T","O"],b l))) val liv = live(b l) in BRANCH{test=test,src1=s1,src2=s2,dst=dst,live=liv} end | "J"::"U"::"M"::"P"::l => let val (dst,l) = reg(b l) val live = live(b l) in JUMP{dst=dst,live=live} end | "L"::"A"::"B"::"E"::"L"::l => let val (lab,l) = lab(b l) val live = live(b(require([":"],l))) in LABEL{lab=lab,live=live} end | "W"::"O"::"R"::"D"::l => let val (i,l) = int(b l) in WORD{value=i} end | "L"::"A"::"B"::"W"::"O"::"R"::"D"::l => let val (i,l) = lab(b l) in LABWORD{lab=i} end | "N"::"O"::"P"::_ => NOP | _ => error "illegal opcode name" in case explode(input_line f) of nil => nil | l => opcode(b l)::readline(i+1,f) end fun read f = readline(0,f) end structure PrintAbs : sig val show: outstream -> AbsMach.opcode list -> unit val str: AbsMach.opcode list -> string end = struct open AbsMach fun xstr prog = let val outstr = ref "" fun pr s = outstr := !outstr ^ s val aop = fn imul => "imul" | iadd => "iadd" | isub => "isub" | idiv => "idiv" | orb => "orb" | andb => "andb" | xorb => "xorb" | rshift => "rshift" | lshift => "lshift" | fadd => "fadd" | fdiv => "fdiv" | fmul => "fmul" | fsub => "fsub" | real => "real" | floor => "floor" | logb => "logb" val com = fn ilt => "ilt" | ieq => "ieq" | igt => "igt" | ile => "ile" | ige => "ige" | ine => "ine" | flt => "flt" | feq => "feq" | fgt => "fgt" | fle => "fle" | fge => "fge" | fne => "fne" | inrange => "inrange" | outofrange => "outofrange" fun bo true = "t" | bo false = "f" fun reg(i,s) = (pr(s); pr "/R"; pr(makestring i)) fun label(i,s) = (pr(s); pr "/L"; pr(makestring i)) val p = fn FETCH{immutable,offset,ptr,dst} => (pr "FETCH"; if immutable then pr "i " else pr "m "; reg dst; pr " := M[ "; reg ptr; pr " + "; pr (makestring offset); pr(" ]\n")) | STORE{offset,ptr,src} => (pr "STORE "; pr "M[ "; reg ptr; pr " + "; pr (makestring offset); pr(" ] := "); reg src; pr "\n") | GETLAB{lab, dst} => (pr "GETLAB "; reg dst; pr " := "; label lab; pr "\n") | GETREAL{value,dst} => (pr "GETREAL "; reg dst; pr " := "; pr value; pr "\n") | ARITH{oper,src1,src2,dst} => (pr "ARITH "; reg dst; pr " := "; reg src1; pr " "; pr(aop oper); pr " "; reg src2; pr "\n") | ARITHI{oper,src1,src2,dst} => (pr "ARITHI "; reg dst; pr " := "; reg src1; pr " "; pr(aop oper); pr " "; pr(makestring src2); pr "\n") | MOVE{src,dst} => (pr "MOVE "; reg dst; pr " := "; reg src; pr "\n") | BRANCH{test,src1,src2,dst,live} => (pr "BRANCH "; pr "IF "; reg src1; pr " "; pr(com test); pr " "; reg src2; pr " GOTO "; label dst; pr " ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | JUMP{dst,live} => (pr "JUMP "; reg dst; pr " ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | LABEL{lab, live} => (pr "LABEL "; label lab; pr ": ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | WORD{value} => (pr "WORD "; pr (makestring value); pr "\n") | LABWORD{lab} => (pr "LABWORD "; label lab; pr "\n") | NOP => pr "NOP\n" | BOGUS{reads, writes} => (pr "BOGUS"; pr " ( "; List.app (fn r => (reg r; pr " ")) writes; pr ") := ("; List.app (fn r => (reg r; pr " ")) reads; pr ")\n") in (List.app p prog; !outstr) end fun str prog = let fun cat (a, b) = (xstr [a]) ^ b in fold cat prog "" end fun show out prog = let fun f nil = () | f (h::t) = (outputc out (xstr [h]); f t) in f prog end end structure HM = AbsMachImp structure BreakInst : sig val breaki : AbsMach.opcode list -> AbsMach.opcode list end = struct open AbsMach open HM val maxreg = AbsMachImp.maxreg fun reg(i:int, s:string) = i fun rstr(i:int, s:string) = s val new_reg_val = ref 0 val new_reg_pairs:(AbsMach.reg * AbsMach.reg) list ref = ref nil fun new_reg_init li = (new_reg_val := maxreg li; new_reg_pairs := nil) fun new_reg (r:AbsMach.reg) = let fun f nil = let val nr = (new_reg_val := !new_reg_val + 1; (!new_reg_val, rstr r)) in (new_reg_pairs := (r, nr) :: !new_reg_pairs; nr) end | f ((a, b)::t) = if r = a then b else f t in f (!new_reg_pairs) end fun breaki l = let fun f i = let val g = fn ARITH{oper, src1, src2, dst} => if reg dst = reg src1 orelse reg dst = reg src2 then let val nr = new_reg(dst) in [ARITH{oper=oper, src1=src2, src2=src2, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | ARITHI{oper, src1, src2, dst} => if reg dst = reg src1 then let val nr = new_reg(dst) in [ARITHI{oper=oper, src1=src1, src2=src2, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | FETCH{immutable, offset, ptr, dst} => if reg ptr = reg dst then let val nr = new_reg(dst) in [FETCH{immutable=immutable, offset=offset, ptr=ptr, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | MOVE{src, dst} => if reg src = reg dst then nil else [i] | _ => [i] in g i end fun h (a, b) = f a @ b val foo = new_reg_init l in fold h l nil end end structure OutFilter : sig val remnops : AbsMach.opcode list -> AbsMach.opcode list end = struct open AbsMach fun remnops ol = let fun f (NOP, NOP::b) = NOP::b | f (a, b) = a::b in fold f ol nil end end structure Delay : sig val init: AbsMach.opcode list -> unit val add_delay: AbsMach.opcode list -> AbsMach.opcode list val rm_bogus: AbsMach.opcode list -> AbsMach.opcode list val is_bogus_i : AbsMach.opcode -> bool val is_bogus_reg : AbsMach.reg -> bool val idempotency : int ref end = struct open AbsMach val maxreg = ref 0 val maxdelay = 12 val idempotency = ref 0 fun is_bogus_i (BOGUS _ ) = true | is_bogus_i _ = false fun bogus_reg ((i, s), which) = (!maxreg + maxdelay * i + which, s) fun is_bogus_reg (i, s) = i > !maxreg fun unbogus_reg (i, s) = if is_bogus_reg (i, s) then (i div maxdelay, s) else (i, s) val max_bog_reg = ref 0 val curr_idem_reg = ref 0 fun idem_reg() = (curr_idem_reg := !curr_idem_reg + 1; (!curr_idem_reg, "idem")) fun init il = ( maxreg := AbsMachImp.maxreg il; max_bog_reg := (!maxreg + 1) * maxdelay; curr_idem_reg := !max_bog_reg + 1 ) exception DELAY fun delay i = let fun opdelay oper = let val f = fn imul => 5 | iadd => 2 | isub => 2 | idiv => 12 | orb => 2 | andb => 2 | xorb => 2 | rshift => 2 | lshift => 2 | fadd => 2 | fdiv => 12 | fmul => 4 | fsub => 2 | real => 2 | floor => 2 | logb => 2 in f oper end val id = fn FETCH{immutable,offset,ptr,dst} => 2 | STORE{offset,ptr,src} => 2 | GETLAB{lab, dst} => 2 | GETREAL{value,dst} => 2 | ARITH{oper,src1,src2,dst} => opdelay oper | ARITHI{oper,src1,src2,dst} => opdelay oper | MOVE{src,dst} => 1 | BRANCH{test,src1,src2,dst,live} => 5 | JUMP{dst,live} => 1 | LABEL{lab, live} => 0 | NOP => 1 | _ => raise DELAY in id i end fun b_idemx (0, r, w) = nil | b_idemx (1, r, w) = BOGUS{reads=r @ w, writes = [idem_reg()]} :: nil | b_idemx (n, r, w) = let val ir = idem_reg() in BOGUS{reads=r @ w, writes = [ir]} :: b_idemx(n-1, r, [ir]) end fun b_idem (n, r, w) = let fun fil ((i, s), b) = if i = 0 then b else (i, s) :: b val nr = fold fil r nil in if null nr then nil else b_idemx(n, nr, w) end fun b_assx (0, r) = nil | b_assx (1, r) = BOGUS{reads=[bogus_reg(r, 1)], writes=[r]} :: nil | b_assx (n, r) = BOGUS{reads=[bogus_reg(r, n)], writes=[bogus_reg(r, n-1)]} :: b_assx(n-1, r) fun b_ass(n, r) = BOGUS{reads=[r], writes=[bogus_reg(r, n-1)]} :: b_assx(n-1, r) fun b_brxx (0, rl) = nil | b_brxx (1, rl) = let fun b r = bogus_reg(r, 1) in BOGUS{reads=rl, writes=map b rl} :: nil end | b_brxx (n, rl) = let fun br r = bogus_reg(r, n - 1) fun bw r = bogus_reg(r, n) in BOGUS{reads=map br rl, writes=map bw rl} :: b_brxx (n - 1, rl) end fun b_brx (n, rl) = let fun br r = bogus_reg(r, n-1) in BOGUS{reads=map br rl, writes=rl} :: b_brxx(n-1, rl) end fun b_br (b, n, rl) = rev (b :: b_brx(n, rl)) fun is_flow i = let open AbsMachImp fun f (FLOW _) = true | f _ = false in f (classify i) end fun add_delay il = let fun idem (r, w) = b_idem (!idempotency, r, w) fun g i = let val d = delay i val f = fn FETCH{immutable,offset,ptr,dst} => i :: (idem([ptr], [dst]) @ b_ass(d, dst)) | STORE{offset,ptr,src} => [i] | GETLAB{lab, dst} => i :: b_ass(d, dst) | GETREAL{value,dst} => i :: b_ass(d, dst) | ARITH{oper,src1,src2,dst} => i :: (idem([src1, src2], [dst]) @ b_ass(d, dst)) | ARITHI{oper,src1,src2,dst} => i :: (idem([src1], [dst]) @ b_ass(d, dst)) | MOVE{src,dst} => i :: idem([src], [dst]) | BRANCH{test,src1,src2,dst,live} => if is_flow i then [i] else b_br (BRANCH{test=test, src1=src1,src2=src2,dst=dst, live=live}, d, [src1, src2]) | _ => [i] in f i end fun apnd (nil, b) = b | apnd (a::t, b) = a :: apnd(t, b) fun fld(a, b) = apnd(g a, b) in fold fld il nil end fun rm_bogus il = let fun g nil = nil | g (i::t) = let val f = fn FETCH{immutable,offset,ptr,dst} => FETCH{immutable=immutable, offset=offset, ptr=ptr, dst= unbogus_reg dst} :: g t | STORE{offset,ptr,src} => i :: g t | GETLAB{lab, dst} => GETLAB{lab=lab, dst= unbogus_reg dst} :: g t | GETREAL{value,dst} => GETREAL{value=value, dst=unbogus_reg dst} :: g t | ARITH{oper,src1,src2,dst} => ARITH{oper=oper,src1=src1,src2=src2,dst=unbogus_reg dst} :: g t | ARITHI{oper,src1,src2,dst} => ARITHI{oper=oper,src1=src1,src2=src2,dst=unbogus_reg dst} :: g t | MOVE{src,dst} => i :: g t | BRANCH{test,src1,src2,dst,live} => BRANCH{test=test, src1=unbogus_reg src1, src2=unbogus_reg src2, dst=dst, live=live } :: g t | BOGUS _ => g t | _ => i :: g t in f i end in g il end end structure Ntypes : sig type name val init_names : unit -> unit val new_name : name -> name val prime_name : name -> name val name_prefix_eq : (name * name) -> bool type test val teq : test * test -> bool type reg type assignment val aeq : assignment * assignment -> bool datatype test_or_name = TEST of test | NAME of name | NEITHER val toneq : test_or_name * test_or_name -> bool datatype test_or_assign = TST of test | ASS of assignment val toaeq : test_or_assign * test_or_assign -> bool end = struct type test = HM.comparison val teq = HM.ceq type reg = int*string type assignment = HM.operation val aeq = HM.oeq type name = string val ct = ref 0 fun init_names () = ct := 0 fun nn() = (ct := !ct + 1; !ct - 1) fun pref nil = nil | pref ("_" :: t) = nil | pref (h :: t) = h :: pref t val name_prefix = implode o pref o explode fun name_prefix_eq(a, b) = (name_prefix a) = (name_prefix b) (* fun new_name n = n ^ "_" ^ (makestring (nn())) *) fun new_name n = name_prefix n ^ "_" ^ (makestring (nn())) fun prime_name n = (new_name n) ^ "'" datatype test_or_name = TEST of test | NAME of name | NEITHER fun toneq (TEST a, TEST b) = teq (a, b) | toneq (NAME a, NAME b) = a = b | toneq _ = false datatype test_or_assign = TST of test | ASS of assignment fun toaeq (TST a, TST b) = teq (a, b) | toaeq (ASS a, ASS b) = aeq (a, b) | toaeq _ = false end structure Dag : sig exception DAG exception DAGnotfound type dag val make : dag val tests_of : dag -> Ntypes.test Set.set val sel_of : dag -> ((Ntypes.test * bool) -> Ntypes.test_or_name) val root_of : dag -> Ntypes.test_or_name val succ_of : dag -> Ntypes.name Set.set val attach : Ntypes.test * dag * dag -> dag val reach : dag * Ntypes.test_or_name -> dag val replace_edge : dag * Ntypes.name list -> dag val newdag : (Ntypes.test Set.set * ((Ntypes.test * bool) -> Ntypes.test_or_name) * Ntypes.test_or_name * Ntypes.name Set.set) -> dag val dagToString : dag -> string end = struct open Ntypes; exception DAGnotfound exception DAG datatype dag = D of test Set.set * ((test * bool) -> test_or_name) * test_or_name * name Set.set fun tonToString (TEST t) = "TEST t" | tonToString (NAME n) = "NAME " ^ n | tonToString NEITHER = "NEITHER" fun sep (a, b) = a ^ ", " ^ b fun dagToString (D(t, sel, rt, s)) = "D([" ^ PrintAbs.str (Set.set t) ^ "]" ^ "fn, " ^ (tonToString rt) ^ ", " ^ (fold sep (Set.set s) ")") val make = D(Set.makeEQ teq, fn x => raise DAGnotfound, NEITHER, Set.make) fun newdag x = D x fun tests_of(D (b, sel, r, h)) = b fun sel_of(D (b, sel, r, h)) = sel fun root_of(D (b, sel, r, h)) = r fun succ_of(D (b, sel, r, h)) = h fun attach (t, D dt, D df) = let open Set val (b1, sel1, r1, h1) = dt val (b2, sel2, r2, h2) = df in D(add(union(b1, b2), t), (fn(x, y) => if teq(x, t) then if y then r1 else r2 else sel1(x, y) handle DAGnotfound => sel2(x, y)), TEST t, union(h1,h2) ) end fun reach (D d, tn) = let open Set val (b, sel, r, h) = d fun f (TEST t) = if not (member(b, t)) then raise DAGnotfound else attach(t, reach(D d, sel(t, true)), reach(D d, sel(t, false))) | f (NAME n) = D(makeEQ teq, fn x => raise DAGnotfound, NAME n, listToSet [n]) | f (_) = raise DAGnotfound in f tn end fun replace_edge (D d, nil) = D d | replace_edge (D d, old::new::tl) = let open Set val (b, sel, r, h) = d val nh = if member(h, old) then add(rm(h, old), new) else h val nr = if toneq(r, NAME old) then NAME new else r val nsel = fn(x, y) => let val v = sel(x, y) in if toneq(v, NAME old) then NAME new else v end in D (b, nsel, nr, nh) end | replace_edge _ = raise DAG end structure Node : sig type node type program val delete_debug : bool ref val move_op_debug : bool ref val move_test_debug : bool ref val rw_debug : bool ref val ntn_debug : bool ref val prog_node_debug : bool ref val prog_node_debug_verbose : bool ref val closure_progs_debug : bool ref val cpsiCheck : bool ref val makeProg : unit -> program val make : Ntypes.name * Ntypes.assignment Set.set * Dag.dag * Ntypes.name Set.set-> node val name_of : node -> Ntypes.name val assignment_of : node -> Ntypes.assignment Set.set val dag_of : node -> Dag.dag val succ : program * node -> Ntypes.name Set.set val prednm : program * Ntypes.name -> Ntypes.name Set.set val pred : program * node -> Ntypes.name Set.set val succNodes : program * node -> node Set.set val predNodes : program * node -> node Set.set val readNode : node -> int Set.set val writeNode : node -> int Set.set val unreachable : program * node -> bool val num_ops_node : node -> int val num_tests_node : node -> int val num_things_node : node -> int val replace_edge_node : node * string list -> node exception NAMETONODE val nameToNode : program * Ntypes.name -> node val nameSetToNodeSet : program * Ntypes.name Set.set -> node Set.set val eqn : node * node -> bool val n00 : node val fin : node val delete : program * node -> program val move_op : program * Ntypes.assignment * node Set.set * node -> program val move_test : program * Ntypes.test * node * node -> program val nodeToString : node -> string val progToString : program -> string val entries : program -> node list val programs : program -> program list val addPredInfo : program -> program val closure : program * node -> program val sortNodes : node list -> node list val updateNode : program * node -> program val addNode : program * node -> program val rmNode : program * node -> program end = struct open Ntypes open Dag open StrPak datatype node = N of name * assignment Set.set * dag * name Set.set type program = node Stringmap.stringmap * node * node type debug_fun = unit -> string val delete_debug = ref false val move_op_debug = ref false val dead_set_debug = ref false val move_test_debug = ref false val rw_debug = ref false val prog_node_debug = ref false val prog_node_debug_verbose = ref false val closure_progs_debug = ref false fun name_of(N(n, a, d, prd)) = n fun assignment_of(N(n, a, d, prd)) = a fun dag_of(N(n, a, d, prd)) = d fun pred_of(N(n, a, d, prd)) = prd fun eqn(n1, n2) = name_of n1 = name_of n2 val start:name = "START" val finish:name = "FINISH" fun printstringlist sl = stringListString sl val psl = printstringlist fun nodeToString (N(n, a, d, prd)) = "\nN(" ^ n ^ ", [" ^ PrintAbs.str (Set.set a) ^ "], " ^ Dag.dagToString d ^ "pred(" ^ psl (Set.set prd) ^ "))" fun progToString (ns, n0, F) = "P (" ^ (psl o (map nodeToString) o Stringmap.extract) ns ^ ",\n" ^ nodeToString n0 ^ ",\n" ^ nodeToString F ^ ")\n" fun make (n, a, t, prd) = N(n, a, t, prd) val n00 = make(start, Set.makeEQ aeq, Dag.make, Set.make) val fin = make(finish, Set.makeEQ aeq, Dag.make, Set.make) fun makeProg() = (Stringmap.new():node Stringmap.stringmap, n00, fin) fun addPredNode (N(n, a, t, prd), p) = (N(n, a, t, Set.add(prd, p))) fun unionPredNode (N(n, a, t, prd), ps) = (N(n, a, t, Set.union(prd, ps))) fun setPredNode (N(n, a, t, prd), p) = (N(n, a, t, p)) fun rmPredNode (N(n, a, t, prd), p) = (N(n, a, t, Set.rm(prd, p))) fun p_n_debug (f:debug_fun) = if !prog_node_debug then print ("p_n:" ^ f() ^ "\n") else () fun updateNode(P as (ns, n0, F), new_node) = let val answer = (Stringmap.rm (ns:node Stringmap.stringmap) ((name_of new_node):string); Stringmap.add ns ((name_of new_node), new_node); if name_of new_node = name_of n0 then (ns, new_node, F) else if name_of new_node = name_of F then (ns, n0, new_node) else P) val foo = p_n_debug (fn () => ("updateNode n=" ^ nodeToString new_node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun addNode(P as (ns, n0, F), new_node) = let val answer = if Stringmap.isin ns (name_of new_node) then updateNode(P, new_node) else (Stringmap.add ns ((name_of new_node), new_node); P) val foo = p_n_debug (fn () => ("addNode n=" ^ nodeToString new_node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun rmNode(P as (ns, n0, F), node) = let val answer = (Stringmap.rm ns (name_of node); P) val foo = p_n_debug (fn () => ("rmNode n=" ^ nodeToString node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun succ(p, n) = (succ_of o dag_of) n fun pred(p, n) = pred_of n val ntn_debug = ref true fun ntnPrint (f:debug_fun) = if !ntn_debug then print ("ntn:" ^ f() ^ "\n") else () exception NAMETONODE fun nameToNode(P as (ns, n0, F), nm) = Stringmap.map ns nm handle Stringmap => (ntnPrint (fn () => ("nameToNode " ^ nm ^ "not found")); raise NAMETONODE) exception NAMESETTONODESET fun nameSetToNodeSet(P, ns) = Set.listToSetEQ(eqn, map (fn x => nameToNode(P, x)) (Set.set ns)) handle NAMETONODE => raise NAMESETTONODESET fun prednm(p, nm) = pred(p, nameToNode(p, nm)) fun succNodes (p, n) = nameSetToNodeSet(p, succ(p, n)) fun predNodes (p, n) = nameSetToNodeSet(p, pred(p, n)) (* a correctness assertion *) exception CPSI val cpsiCheck = ref false fun checkPredSuccInfo(from, P as (ns, n0, F)) = let val nl = Stringmap.extract ns val badnode = ref n0 fun fail s = (print ("CPSI:" ^ s ^ " failed\nfrom " ^ from ^ "\nbadnode=" ^ nodeToString (!badnode) ^ "\nprogram=" ^ progToString P ^ "\n"); raise CPSI) fun chk (xpred, xsuccN, n) = let val foo = badnode := n val s = Set.set(xsuccN(P, n)) handle NAMESETTONODESET => fail "NAMESETTONODESET" fun cs x = Set.member(xpred x, name_of n) fun fs (x, b) = b andalso cs x in fold fs s true end fun cp (x, b) = b andalso chk(pred_of, succNodes, x) fun cs (x, b) = b andalso chk((succ_of o dag_of), predNodes, x) in if not (fold cp nl true) then fail "cp" else if not (fold cs nl true) then fail "cs" else () end fun cpsi x = if !cpsiCheck then checkPredSuccInfo x else () fun empty n = let open Set in empty (assignment_of n) andalso empty ((tests_of o dag_of) n) end fun unreachable(P as (ns, n0, F), n) = not (eqn (n0, n)) andalso Set.empty (pred(P, n)) fun read (TST(t)) = HM.read_c t | read (ASS(a)) = HM.read_o a fun write (TST(t)) = HM.write_c t | write (ASS(a)) = HM.write_o a fun read_write_debug (f:debug_fun) = if !rw_debug then print (f() ^ "\n") else () fun readNode n = let open Set val answer = union (listUnion (make::(map (read o ASS) ((set o assignment_of) n))), listUnion (make::(map (read o TST) ((set o tests_of o dag_of) n)))) val foo = read_write_debug (fn () => ("readNode " ^ nodeToString n ^ "=>" ^ stringListString (map makestring (set answer)))) in answer end fun writeNode n = let open Set val answer = union (listUnion (make::(map (write o ASS) ((set o assignment_of) n))), listUnion (make::(map (write o TST) ((set o tests_of o dag_of) n)))) val foo = read_write_debug (fn () => ("writeNode " ^ nodeToString n ^ "=>" ^ stringListString (map makestring (set answer)))) in answer end fun no_write_conflict (ta, n) = let open Set in empty (intersect(writeNode n, (union(read ta, write ta)))) end fun no_read_conflict (ta, n) = let open Set in empty (intersect (write ta, readNode n)) end fun empty n = let open Set in (empty o assignment_of) n andalso (empty o tests_of o dag_of) n end fun replace_edge_node(N (n, a, d, p), nl) = N(n, a, replace_edge(d, nl), p) fun except_bogus nil = nil | except_bogus (h::t) = if Delay.is_bogus_i h then except_bogus t else h :: except_bogus t val num_ops_node = List.length o except_bogus o Set.set o assignment_of val num_tests_node = List.length o Set.set o tests_of o dag_of fun num_things_node n = (num_ops_node n) + (num_tests_node n) fun dead_debug (f:debug_fun) = if !dead_set_debug then print ("dead" ^ f() ^ "\n") else () exception DEAD fun dead(P:program, r:HM.reg, n:node, done: name Set.set) = let val foo = dead_debug (fn () => "(P, " ^ makestring r ^ ", " ^ nodeToString n ^ ")") val new_done = Set.add(done, name_of n) fun nfil(a, b) = if Set.member(new_done, a) then b else a::b fun drl nil = true | drl (h::t) = dead(P, r, h, new_done) andalso drl t fun ntn n = nameToNode (P, n) handle NAMETONODE => raise DEAD val next = fold nfil (Set.set (succ(P, n))) nil val answer = ( not (Set.member(readNode n, r)) andalso (Set.member(writeNode n, r) orelse drl (map ntn next)) ) val foo = dead_debug(fn () => "=>" ^ Bool.toString answer) in answer end fun deadset(P, rs, n) = let val foo = dead_debug (fn () => "deadset(" ^ stringListString (map makestring (Set.set rs)) ^ ",\n" ^ nodeToString n ^ ")") fun f nil = true | f (r::t) = dead(P, r, n, Set.make) andalso f t val answer = f (Set.set rs) val foo = dead_debug(fn () => "deadset=>" ^ Bool.toString answer ^ "\n") in answer end fun del_debug (f:debug_fun) = if !delete_debug then print ("delete:" ^ f() ^ "\n") else () exception DELETE exception DELETE_HD exception DELETE_WIERDSUCC fun delete (P as (ns, n0, F), n) = let val foo = cpsi("delete enter", P) val em = empty n val un = unreachable(P, n) fun ntn n = nameToNode(P, n) handle NAMETONODE => raise DELETE val p = Set.listToSetEQ(eqn, (map ntn (Set.set (pred(P, n))))) open Set val foo = del_debug (fn () => "delete( n=" ^ (name_of n) ^ "\n" ^ "em=" ^ (Bool.toString em) ^ "\n" ^ "un=" ^ (Bool.toString un) ^ "\n" ^ "p =" ^ (psl (map name_of (Set.set p))) ^ "\n" ^ ")") in if (em orelse un) andalso not (eqn(n, F)) then if not un then let val foo = del_debug (fn () => "complex deletion") val s0 = Set.set (succ(P, n)) val nprime = if List.length s0 = 1 then hd s0 else (print (Int.toString (List.length s0)); raise DELETE_WIERDSUCC) val new_nprime = rmPredNode(unionPredNode(ntn nprime, pred_of n), name_of n) fun ren x = replace_edge_node(x, [name_of n, name_of new_nprime]) val pprime = map ren (set p) fun updt(n, p) = updateNode(p, n) val Nprime = fold updt (new_nprime :: pprime) P val foo = del_debug (fn () => "nprime=" ^ nprime) val foo = del_debug (fn () => "pprime=" ^ (psl (map nodeToString pprime))) val answer = rmNode(Nprime, n) val foo = cpsi("delete leave cd", answer) in answer end else (del_debug (fn () => "simple_deletion"); let val s = Set.set(nameSetToNodeSet(P, (succ(P, n)))) fun updt(s, p) = updateNode(p, rmPredNode(s, name_of n)) val np = rmNode(fold updt s P, n) val foo = cpsi("delete leave sd", np) in np end) else (del_debug (fn () => "No deletion"); P) end handle Hd => raise DELETE_HD fun mop_debug (f:debug_fun) = if !move_op_debug then (dead_set_debug := true; print ("mop:" ^ f() ^ "\n")) else dead_set_debug := false fun can_move_op1(P as (ns, n0, F), x, move_set, m) = let open Set val foo = mop_debug (fn () => "can_move_op") val rok = HM.resources_ok(set (add(assignment_of m, x)), set ((tests_of o dag_of) m)) val foo = mop_debug(fn () => "1") val p = diff(nameSetToNodeSet(P, succ(P, m)), move_set) val foo = mop_debug(fn () => "2") val l = (write o ASS) x val foo = mop_debug(fn () => "3") fun dlpf nil = true | dlpf (pj::t) = deadset(P, l, pj) andalso dlpf t fun cond nil = true | cond (nj::t) = (not o eqn)(nj, F) andalso (* no_read_conflict(ASS x, nj) andalso *) (* change ex model so it can run on a sequential machine *) no_read_conflict(ASS x, m) andalso no_write_conflict(ASS x, m) andalso cond t val foo = mop_debug(fn () => "4") val answer = rok andalso cond (set move_set) andalso dlpf (set p) val foo = mop_debug (fn () => "can_move_op=>" ^ Bool.toString answer) in answer end fun can_move_op(P, x, move_set, m) = let open Set val ms = set move_set fun pf n = pred(P, n) val ps = set(listUnion (map pf ms)) fun all (x, b) = b andalso can_move_op1(P, x, move_set, m) in if List.length ps > 1 then if List.length ms > 1 then false else fold all ((set o assignment_of o hd) ms) true else can_move_op1(P, x, move_set, m) end fun move_op (P as (ns, n0, F), x, move_set, m) = let val foo = cpsi("move_op enter", P) val foo = mop_debug (fn () => "move_op(x=" ^ PrintAbs.str [x] ^ "move_set\n" ^ (stringListString (map nodeToString (Set.set move_set))) ^ "\nm=" ^ nodeToString m ^"\n)\n") in if not (can_move_op(P, x, move_set, m)) then P else let open Set exception NOTFOUND val primed_pairs = ref nil fun pnf nm = let fun f nil = let val nn = prime_name nm in (primed_pairs := (nm, nn) :: !primed_pairs; nn) end | f ((a, b)::t) = if nm = a then b else f t val answer = f (!primed_pairs) val foo = mop_debug (fn () => "pnf " ^ nm ^ "=>" ^ answer) in answer end val foo = mop_debug(fn () => "1") fun njp nil = nil | njp ((N(n, a, d, prd))::t) = N(pnf n, rm(a, x), d, listToSet [name_of m]) :: njp t fun ojp l = map (fn x => rmPredNode(x, name_of m)) l fun replist nil = nil | replist (h::t) = h :: pnf h :: replist t val rlist = replist (map name_of (set move_set)) val foo = mop_debug(fn () => "2") val mprime = let val aprime = add(assignment_of m, x) val dprime = replace_edge(dag_of m, rlist) in N(name_of m, aprime, dprime, pred_of m) end val foo = mop_debug(fn () => "3") val nj = njp(set move_set) val foo = mop_debug(fn () => "nj=" ^ stringListString (map name_of nj)) fun uptd(n, p) = updateNode(p, n) val np = fold uptd (mprime :: (ojp (set move_set))) P fun addnpi(n, p) = let val s = set (succNodes(p, n)) fun ap x = addPredNode(x, name_of n) fun updt(x, p) = updateNode(p, ap x) in fold updt s p end fun addn(n, p) = addnpi(n, addNode(p, n)) val nnp = fold addn nj np val foo = mop_debug(fn () => "4") val answer = nnp val foo = mop_debug(fn () => "5") val foo = cpsi("move_op leave", answer) in mop_debug(fn () => "6"); answer end end fun updt_sel (d, nsel) = let val tst = tests_of d val rt = root_of d val s = succ_of d in newdag(tst, nsel, rt, s) end fun mt_debug (f:debug_fun) = if !move_test_debug then print ("move_test" ^ f() ^ "\n") else () fun can_move_test(P as (ns, n0, F):program, x:test, n:node, m:node) = let val foo = cpsi("move_test enter", P) val foo = mt_debug (fn () => "can_move_test") val answer = no_write_conflict(TST x, m) andalso (* hack because sel can't distinguish xj *) not (Set.member(tests_of(dag_of m), x)) andalso HM.resources_ok(Set.set (assignment_of m), Set.set (Set.add((tests_of o dag_of) m, x))) val foo = mt_debug (fn () => "can_move_test=>" ^ Bool.toString answer) in answer end fun move_test (P as (ns, n0, F):program, x:test, n:node, m:node) = if not (can_move_test(P, x, n, m)) then P else let val foo = mt_debug (fn () => "move_test" ^ name_of n ^ " " ^ name_of m) open Set val d_n = dag_of n val sel_n = sel_of d_n val rt_n = root_of d_n val nt = let val newname = (new_name o name_of) n ^ "tt" fun nsel (z, b) = let val v = sel_n(z, b) in if toneq(v, TEST x) then sel_n(x, true) else v end val nC = if TEST x = rt_n then reach(updt_sel(d_n, nsel), sel_n(x, true)) else reach(updt_sel(d_n, nsel), rt_n) in N(newname, assignment_of n, nC, listToSet [name_of m]) end val foo = mt_debug (fn () => "got nt") val nf = let val newname = ((new_name o name_of) n) ^ "ff" fun nsel (z, b) = let val v = sel_n(z, b) in if toneq(v, TEST x) then sel_n(x, false) else v end val nC = if TEST x = rt_n then reach(updt_sel(d_n, nsel), sel_n(x, false)) else reach(updt_sel(d_n, nsel), rt_n) in N(newname, assignment_of n, nC, listToSet [name_of m]) end val foo = mt_debug (fn () => "got nf") val d_m = dag_of m val sel_m = sel_of d_m fun nton n = NAME( name_of n) fun nsel (z, b) = if teq(z, x) then if b then nton nt else nton nf else let val v = sel_m(z, b) in if toneq(v, NAME(name_of n)) then TEST x else v end val nb = add(tests_of d_m, x) val nh = add(add(rm(succ_of d_m, name_of n), name_of nt), name_of nf) fun new_rt (NAME rt) = TEST x | new_rt t = t val nc = newdag(nb, nsel, (new_rt o root_of) d_m, nh) val new_m = N(name_of m, assignment_of m, nc, pred_of m) fun updt_t s = addPredNode(s, name_of nt) fun updt_f s = addPredNode(s, name_of nf) val upt = map updt_t (set (nameSetToNodeSet(P, succ(P, nt)))) val upf = map updt_f (set (nameSetToNodeSet(P, succ(P, nf)))) fun updtl(n, p) = updateNode(p, n) val np = fold updtl ([rmPredNode(n, name_of m), new_m] @ upt @ upf) P val answer = np val foo = mt_debug (fn () => "mtst done") val foo = cpsi("move_test leave", answer) in answer end fun entries (P as (ns, n0, F)) = let val nl = Stringmap.extract ns fun f (a, b) = if unreachable(P, a) then a::b else b in n0 :: (fold f nl nil) end fun addPredInfo(P as (ns, n0, F)) = let fun rmpi n = setPredNode (n, Set.make) val nl = map rmpi (Stringmap.extract ns) fun updt(n, p) = updateNode(p, n) val np = fold updt nl P fun addpi (n, p) = let val s = Set.set (succNodes(p, n)) fun api(s, p) = updateNode(p, addPredNode(s, name_of n)) in fold api s p end in fold addpi nl np end fun cp_debug (f:debug_fun) = if !closure_progs_debug then print ("cp:" ^ f() ^ "\n") else () fun closure (P as (ns, n0, F), entry) = let open Set val foo = cp_debug (fn () => "closure:entry=" ^ name_of entry ^ "\nprogram=" ^ progToString P) val isin = Stringmap.isin fun dfs(p, parent, nil) = p | dfs(p as (ns, n0, F), parent, cur::todo) = if not (isin ns (name_of cur)) then let val np = dfs(addNode(p, cur), cur, set(succNodes(P, cur))) in dfs(np, parent, todo) end else dfs(p, parent, todo) val prog:program = (Stringmap.new(), entry, F) val answer = dfs(addNode(prog, entry), entry, set(succNodes(P, entry))) val foo = cp_debug (fn () => "\nclosure=>" ^ progToString answer) in answer end fun programs(P as (ns, n0, F):program) = let val foo = cp_debug (fn () => "programs") val l = entries (addPredInfo P) (* make sure preds are in closure*) fun cf e = addPredInfo(closure(P, e)) val answer = map cf l val foo = cp_debug (fn () => "programs done") in answer end structure ns = struct type obj = node fun int l = let val z = ord "0" fun f(n, nil) = n | f (n, d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else n in f(0,l) end fun gt (a, b) = let val a = explode(name_of a) val b = explode(name_of b) in (int a) > (int b) end end structure sortN = Sort(ns) val sortNodes = sortN.sort end structure Compress : sig val compress_debug : bool ref val compress : (int * Node.program) -> Node.program val move_things_node : Node.program * Ntypes.name * Ntypes.name Set.set -> Node.program val do_move_tests : bool ref val do_move_ops : bool ref val dbg_p : Node.program ref end = struct open Ntypes open Dag open Node val do_move_tests = ref false val do_move_ops = ref true exception COMPRESS fun error (s:string) = (print (s ^ "\n"); raise COMPRESS) val compress_debug = ref false val dbg_p = ref (makeProg()) type debug_fun = unit -> string fun debug (f:debug_fun) = if !compress_debug then print (f() ^ "\n") else () exception FILTERSUCC fun filterSucc(P, nm, fence_set) = let open Set val s = set(succ(P, nameToNode(P, nm))) handle NAMETONODE => raise FILTERSUCC fun f (nm, l) = if member(fence_set, nm) then l else nm::l in fold f s nil end (* val inP = ref false val finP = ref makeProg val foutP = ref makeProg fun chinP (p, from) = let val nm = "11_100'_110tt_119'" val prd = prednm(p, nm) val pe = Set.empty(prd) in if !inP then if pe then (foutP := p; error ("chinP gone -" ^ from)) else () else if pe then () else (inP := true; print ("chinP found it -" ^ from ^ "\n"); finP := p; nameToNode(p, nm); ()) end *) exception MOVETHINGSNODE fun move_things_node(P, nm, fence_set) = let open Set (* val foo = debug (fn () => "move_things_node(\n" ^ progToString P ^ ",\n" ^ nm ^ ", [" ^ fold (fn (a, b) => a ^ ", " ^ b) (set fence_set) "]" ^ ")") *) fun ntn (p, nm) = ((* chinP (p, "ntn");*) nameToNode (p, nm)) handle NAMETONODE => (dbg_p := P; raise MOVETHINGSNODE) fun s_nm_list p = filterSucc(p, nm, fence_set) fun nd nm = ntn(P, nm) handle MOVETHINGSNODE => error "nd nm" val au = listUnionEQ(aeq, map (assignment_of o nd) (s_nm_list P)) val tu = listUnionEQ(teq, map (tests_of o dag_of o nd) (s_nm_list P)) fun ms (p, a) = let fun f(nm, l) = ((*chinP (p, "ms"); *) if member(assignment_of(ntn(p, nm)), a) then nm::l else l ) handle MOVETHINGSNODE => (dbg_p := p; error "ms") in fold f (s_nm_list p) nil end fun move_a1(a, p) = let val msl = ms (p, a) val ms_set = nameSetToNodeSet(p, listToSet msl) fun dms(a, p) = delete(p, ntn(p, a)) fun mop() = let val foo = debug (fn () => "mop start " ^ nm) val new_p = move_op(p, a, ms_set, ntn(p, nm)) handle MOVETHINGSNODE => error "move_a move_op" val foo = debug (fn () => "mop end") in new_p end val mpa = mop() (* val foo = chinP(mpa, "a_move_a amop " ^ nm ^ StrPak.stringListString (map name_of (set ms_set))) *) val answer = fold dms msl mpa (* val foo = chinP(answer, "a_move_a adel") *) in answer end fun move_a(a, p) = if !do_move_ops then move_a1(a, p) else p fun tset (p, t) = let fun f(nm, l) = ((*chinP (p, "tset");*) if member(tests_of(dag_of(ntn(p, nm))), t) then nm::l else l ) handle MOVETHINGSNODE => error "tset" in fold f (s_nm_list p) nil end fun move_t1(t, p) = let val ts = tset (p, t) val answer = if List.length ts > 0 then move_test(p, t, (ntn(p, hd ts) handle MOVETHINGSNODE => error "move_t 1"), (ntn(p, nm) handle MOVETHINGSNODE => error "move_t 2")) else p (*val foo = chinP(answer, "a_move_t")*) in answer end fun move_t(t, p) = if !do_move_tests then move_t1(t, p) else p in debug (fn () => "movethingsnode " ^ nm ^ "\n"); fold move_t (set tu) (fold move_a (set au) P) end exception MOVETHINGSWINDOW fun move_things_window(P, w, nm, fence_set) = let open Set (* val foo = debug (fn () => "move_things_window(\n" ^ progToString P ^ ",\n" ^ (makestring w) ^ ", " ^ nm ^ ", [" ^ fold (fn (a, b) => a ^ ", " ^ b) (set fence_set) "]" ^ ")\n") *) fun ntn (P, nm) = (nameToNode (P, nm)) handle NAMETONODE => raise MOVETHINGSWINDOW val node = ntn(P, nm) val things = num_things_node node val s_nm_list = filterSucc(P, nm, fence_set) fun nxt(nm, p) = move_things_window(p, w - things, nm, fence_set) val child_p = if w > things then fold nxt s_nm_list P else P in debug (fn () => "movethingswindow " ^ nm ^ "\n"); move_things_node(child_p, nm, fence_set) end exception CPRESS exception CPRESS1 exception CPRESS2 exception CPRESS3 exception CPRESS4 exception CPRESS5 fun cpress(window, P, fence_set, everin_fence_set) = let open Set fun nxt(nm, p:program) = ((* dbg_p := p; *) move_things_window(p, window, nm, fence_set)) handle MOVETHINGSWINDOW => raise CPRESS1 val filled = fold nxt (set fence_set) P handle CPRESS1 => raise CPRESS2 fun succf nm = succ(filled, nameToNode(filled, nm)) handle NAMETONODE => raise CPRESS val nfence_set = listUnion(make::(map succf (set fence_set))) fun filt(a, l) = if member(everin_fence_set, a) then l else a::l val f_fence_set = listToSet(fold filt (set nfence_set) nil) val n_everin_fc = fold (fn (a, s) => add(s, a)) (set f_fence_set) everin_fence_set in debug (fn () => "cpress: fence_set=" ^ StrPak.stringListString (set fence_set) ^ "\n f_fence_set =" ^ StrPak.stringListString (set f_fence_set)); if not (empty f_fence_set) then cpress(window, filled, f_fence_set, n_everin_fc) handle CPRESS => raise CPRESS3 handle CPRESS1 => raise CPRESS4 handle CPRESS2 => raise CPRESS5 else filled end fun clean_up (P as (ns, n0, F):program) = let val foo = debug (fn () => "cleanup") val clos = closure(P, n0) val (ns, n0, F) = clos val l = (map name_of (Stringmap.extract ns)) fun f (n, p) = (debug (fn () => "cleanup deleting " ^ n); delete(p, nameToNode(p, n))) val answer = fold f l clos val foo = debug (fn () => "exiting cleanup") in answer end fun compress(window, P as (ns, n0, F)) = let open Set val fence = n0 val fence_set = add(make, name_of n0) val everin_fence_set = add(makeEQ(name_prefix_eq), name_of n0) val uc = cpress(window, P, fence_set, everin_fence_set) val cu = clean_up uc in debug (fn () => "compress"); cu end end structure ReadI : sig val readI : HM.operation list -> (HM.operation list * Node.program list) val writeI : (HM.operation list * Node.program list) -> HM.operation list val progMap : Node.program -> string val read_debug : bool ref val write_debug : bool ref val live_debug : bool ref end = struct val read_debug = ref false val write_debug = ref false val live_debug = ref false fun read_dbg f = if !read_debug then print ("readI.read:" ^ f() ^ "\n") else () fun write_dbg f = if !write_debug then print ("writeI.read:" ^ f() ^ "\n") else () fun write_dbg_s s = write_dbg (fn () => s) exception BTARGET fun btarget (nil, n) = (fn x => raise BTARGET) | btarget (h::t, n) = let open HM val rf = btarget(t, n + 1) fun g lbl x = if lbl = x then n else rf x fun f (TARGET(lbl, inst)) = (g lbl) | f _ = rf in f h end val programs = Node.programs exception BNODES fun buildNodes l = let open HM open Ntypes val t = btarget(l, 0) fun f (nil, n) = nil | f (ci::rest, n) = let open Dag open AbsMach val nm = makestring n val nxtnm = makestring (n + 1) fun asn i = Set.listToSetEQ(aeq, i) val edag = reach(Dag.make, NAME nxtnm) fun tgtnm tgt = makestring (t tgt) fun edagt tgt = reach(Dag.make, NAME (tgtnm tgt)) val finDag = reach(Dag.make, NAME (Node.name_of Node.fin)) fun cdag (tgt,tst) = attach(tst, edagt tgt, edag) val g = fn ASSIGNMENT i => Node.make(nm, asn [i], edag, Set.make) | NERGLE => Node.make(nm, asn [], edag, Set.make) | LABELREF (tgt, i as GETLAB{lab, dst}) => Node.make(nm, asn [GETLAB{lab=(t tgt, tgtnm tgt), dst=dst}], edag, Set.make) | COMPARISON (tgt, tst) => Node.make(nm, asn nil, cdag(tgt, tst), Set.make) | FLOW (tgt, i) => Node.make(nm, asn nil, edagt tgt, Set.make) | EXIT i => Node.make(nm, asn [i], finDag, Set.make) | TARGET (lbl, i) => Node.make(nm, asn nil, edag, Set.make) | _ => raise BNODES in (g ci)::Node.fin::(f (rest, n + 1)) end fun addn(n, p) = Node.addNode(p, n) val prog = fold addn (Node.fin :: f(l, 0)) (Node.makeProg()) in prog end exception READI exception READI_NTN fun readI ol = let open HM fun junkfil (JUNK a, (junk, other)) = (JUNK a :: junk, other) | junkfil (x, (junk, other)) = (junk, x::other) val cl = map HM.classify ol val (junk, other) = fold junkfil cl (nil, nil) fun ntn x = (Node.nameToNode x ) handle NAMETONODE => raise READI_NTN val (ns, foo, fin) = buildNodes other val nn = (ns, ntn((ns, foo, fin), "0"), fin) fun unjunk (JUNK i) = i | unjunk _ = raise READI val progs = programs nn val foo = read_dbg (fn () => ("progs =>" ^ (StrPak.stringListString (map Node.progToString progs)))) in (map unjunk junk, progs) end structure ps = struct open Ntypes type obj = Node.program fun int l = let val z = ord "0" fun f(n, nil) = n | f (n, d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else n in f(0,l) end fun gt((nsa, n0a, Fa), (nsb, n0b, Fb)) = let val a = explode (Node.name_of n0a) val b = explode (Node.name_of n0b) in (int a) > (int b) end end structure sortP = Sort (ps) fun live_dbg f = if !live_debug then print ("live:" ^ f() ^ "\n") else () fun build_live_tab(P as (ns, n0, F): Node.program) = let open Ntypes open Node open Set fun fil (a, b) = if a < 0 orelse Delay.is_bogus_reg (a, "") then b else add(b, a) fun fil_lset s = fold fil (set s) make val lt:(int set) Stringmap.stringmap = Stringmap.new() val finset = listToSet [0, 1, 2, 3, 4, 5] fun flive f n = if Stringmap.isin lt (name_of n) then Stringmap.map lt (name_of n) else f n fun dfs cur = let fun fl n = flive dfs n val nm = name_of cur val gen = (fil_lset o readNode) cur val kill = writeNode cur val foo = Stringmap.add lt (nm, gen) val children = succNodes(P, cur) val ch_live = if empty children then finset else listUnion (map fl (set children)) val live = union(diff(ch_live, kill), gen) val foo = Stringmap.rm lt nm val foo = Stringmap.add lt (nm, live) in live end in dfs n0; (fn nm => let val ans = Stringmap.map lt nm val foo = live_dbg (fn () => nm ^ "=>" ^ StrPak.stringListString (map makestring (set ans))) in ans end) end (* live is the union of live in successors *) fun branch_live (P, tab, nm) = let open Node val s = Set.set (succ(P, nameToNode(P, nm))) val l:int Set.set = Set.listUnion (map tab s) val foo = live_dbg (fn()=>("branch_live " ^ nm ^ " s=" ^ StrPak.stringListString s ^ " -> " ^ StrPak.stringListString (map makestring (Set.set l)))) in l end exception WRITEP exception WRITEP1 exception WRITEP_NTN fun writeP (entry_map, lbl_fun, P as (ns, n0, F):Node.program) = let open Ntypes open Node open Set open HM open AbsMach val foo = write_dbg(fn () => "program:" ^ progToString P) fun blblmap nil = (fn x => (print ("blblmap_" ^ x); raise WRITEP)) | blblmap (nm::t) = let val mp = blblmap t val mylab = lbl_fun() in (fn x => if x = nm then mylab else mp x) end val lblmap = blblmap(map name_of (Stringmap.extract ns)) val live_tab = build_live_tab P fun label_list nm = map (fn r => (r, "")) (set (live_tab nm)) fun br_list nm = map (fn r => (r, "")) (set (branch_live(P, live_tab, nm))) fun getlab (GETLAB{lab=(i,s), dst}) = GETLAB{lab=(entry_map s, "node" ^ s), dst=dst} | getlab _ = raise WRITEP1 fun dogetlabs (i as GETLAB _, l) = (getlab i) :: l | dogetlabs (i, l) = i :: l fun ubranch (frm, nm) = BRANCH{test=ieq, src1=(0, "zero"), src2=(0, "zero"), dst=(lblmap nm, "node" ^ nm), live=br_list frm} fun cbranch (BRANCH{test, src1, src2, dst, live}, frm, nm) = BRANCH{test=test, src1=src1, src2=src2, dst=(lblmap nm, "node" ^ nm), live=br_list frm} | cbranch _ = (print "cbranch"; raise Match) fun label nm = LABEL{lab=(lblmap nm, "node" ^ nm), live=label_list nm} fun entry_label nm = LABEL{lab=(entry_map nm, "entry"), live=label_list nm} fun f (done, lastnm, nm) = let val foo = write_dbg (fn () => "f (" ^ StrPak.stringListString (set done) ^ "," ^ nm ^ ")") in if nm = name_of F then (write_dbg_s "fin"; (done, [NOP])) else if member(done, nm) then (write_dbg_s "already"; (done, [NOP, ubranch(lastnm, nm)])) else let open Dag val foo = write_dbg_s "doing" val node = nameToNode(P, nm) handle NAMETONODE => raise WRITEP_NTN val needlabel = let val pd = set (pred (P, node)) val foo = write_dbg (fn () => ("needlabel pd=" ^ StrPak.stringListString pd)) fun f nil = false | f ((p::nil):Ntypes.name list) = let val pn = nameToNode(P, p:Ntypes.name) val foo = write_dbg (fn () => ("ndlbl: pn=" ^ nodeToString pn)) val d = dag_of pn val sel = sel_of d val rt = root_of d fun istst (TEST t) = (write_dbg_s "ist true\n"; true) | istst (NAME n) = (write_dbg_s "ist false\n"; false) | istst NEITHER = (write_dbg_s "ist false\n"; false) fun untst (TEST t) = t | untst _ = (print "needlabel1"; raise Match) fun unnm (NAME nm) = nm | unnm _ = (print "needlabel2"; raise Match) val foo = if istst rt then write_dbg (fn () => ("sel=" ^ unnm(sel(untst rt, true)) ^ "\n")) else () in istst rt andalso (sel(untst rt, true) = NAME nm) end | f (a::b::c) = true val answer = f pd val foo = write_dbg (fn () => ("needlabel=>" ^ Bool.toString answer)) in answer end val nodelabel = if needlabel then [label nm] else nil val nodeNOP = [NOP] val a = fold dogetlabs (set (assignment_of node)) nil val d = dag_of node val sel = sel_of d val rt = root_of d (* only works for <= 1 test *) fun dag_code NEITHER = (nil, nil) | dag_code (NAME n) = ([n], nil) | dag_code (TEST t) = let fun unnm (NAME x) = x | unnm _ = (print "dag_code"; raise Match) val t_n = unnm(sel(t, true)) val f_n = unnm(sel(t, false)) in ([f_n, t_n], [cbranch(t, nm, t_n)]) end val (nl, cd) = dag_code rt exception DFS_SURPRISE fun dfs (done, nil) = (write_dbg_s "dfs nil"; (done, nil)) | dfs (done, h::nil) = (write_dbg_s "dfs 1"; f(done, nm, h)) | dfs (done, h::nxt::nil) = let val foo = write_dbg_s "dfs 2" val (dn1, cd1) = f(done, nm, h) val (dn2, cd2) = if member(dn1, nxt) then (dn1, nil) else dfs(dn1, nxt::nil) val lbl = if nxt = name_of F orelse member(dn2, nxt) then [NOP] else [NOP, label nxt] in (dn2, cd1 @ lbl @ cd2) end | dfs _ = raise DFS_SURPRISE val (dn, dcd) = dfs(add(done, nm), nl) in (dn, NOP :: nodelabel @ a @ cd @ dcd) end end val (done, code) = f (Set.make, "badname", name_of n0) in (entry_label (name_of n0)) :: (label (name_of n0)) :: code end exception WRITEI fun progMap(p as (ns, n0, F)) = let val l = Node.sortNodes (Stringmap.extract ns) val outstr = ref "" fun pr s = outstr := !outstr ^ s fun ntn n = Node.nameToNode(p, n) val n0nm = Node.name_of n0 val nFnm = Node.name_of F fun f n = let val s = Set.set (Node.succ(p, n)) val nm = Node.name_of n val pre = if nm = n0nm then "->\t" else "\t" val post = if nm = nFnm then "\t->\n" else "\n" in pr (pre ^ Node.name_of n ^ "\t->\t" ^ StrPak.stringListString s ^ post) end in List.app f l; !outstr end fun writeI(j:AbsMach.opcode list, p:Node.program list) = let val labelid = ref 0 fun newlabel () = (labelid := !labelid + 1; !labelid - 1) fun bentrymap nil = (fn x => (print ("bentrymap_" ^ x); raise WRITEI)) | bentrymap ((ns, n0, F)::t) = let val mp = bentrymap t val mylab = newlabel() in (fn x => if x = Node.name_of n0 then mylab else mp x) end val entry_map = bentrymap p val sp = sortP.sort p fun wp p = writeP (entry_map, newlabel, p) fun f(a, b) = (wp a) @ b val i = fold f sp nil in i @ j end end signature SIMLABS = sig exception Data_dependency_checked exception End_of_Program exception Simulator_error_1 exception Simulator_error_2 exception illegal_branch_within_branchdelay exception illegal_jump_within_branchdelay exception illegal_operator_or_operand exception negative_label_offset exception no_address_in_register exception no_label_in_register exception no_memory_address_in_register exception runtime_error_in_labwords exception runtime_error_in_words_or_labwords exception type_mismatch_in_comparison exception wrong_label val breakptr : int -> unit val clock : int ref val d_m : int * int -> unit val d_ms : int list -> unit val d_pc : unit -> unit val d_r : unit -> unit val d_regs : int list -> unit val init : AbsMach.opcode list -> unit val mcell : int -> AbsMach.values val pc : unit -> AbsMach.opcode list val pinit : int * (AbsMach.arithop -> int) * int * AbsMach.opcode list -> unit val pptr : unit -> int val prun : unit -> unit val pstep : unit -> unit val regc : int -> AbsMach.values val run : unit -> unit val runcount : int ref val step : unit -> unit val vinit : int * AbsMach.opcode list -> unit val vpc : unit -> unit val vrun1 : unit -> unit val vrun2 : unit -> unit val vrun3 : unit -> unit val vstep1 : unit -> unit val vstep2 : unit -> unit val vstep3 : unit -> unit val Memory : (AbsMach.values array) ref end; structure SetEnv : SIMLABS= struct open AbsMach; val codes : (opcode list ref)=ref nil; val RegN=ref 0 and LabN=ref 0 and memorysize=ref 10000; (*RegN = (pointer to) number of registers needed; LabN = (pointer to) number of labels; memorysize=(pointer to) memory space size. *) val IP: (opcode list) ref =ref nil; val inivalue=(INT 0); (*IP = Program Pointer; inivalue = zero- initial value of memory and registers. *) val Reg=ref (array(0,inivalue)) and Memory=ref (array(0,inivalue)) and Lab_Array=ref (array(0, (0,IP) )); (*Reg = register array; Memory = memory cell array; Lab_Array = label-opcode list array. *) fun max(n1:int,n2:int)=if (n1>n2) then n1 else n2; (* hvnop tests whether the instruction is not a real machine instruction, but only useful in simulation. *) fun hvnop(LABEL{...})=true | hvnop(LABWORD{...})=true | hvnop(WORD{...})=true | hvnop(_)=false; (*count_number is used to take into account register references and label declarations, and change RegN or LabN. *) fun count_number(FETCH {ptr=(n1,_),dst=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(STORE {src=(n1,_),ptr=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(ARITHI {src1=(n1,_),dst=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(MOVE {src=(n1,_),dst=(n2,_)})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(BRANCH {src1=(n1,_),src2=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(GETLAB {dst=(n,_),...})= (RegN:=max((!RegN),n) ) | count_number(GETREAL {dst=(n,_),...})= (RegN:=max((!RegN),n) ) | count_number(ARITH{src1=(n1,_),src2=(n2,_),dst=(n3,_),...})= (RegN:=max((!RegN),max(n1,max(n2,n3)) ) ) | count_number(LABEL{...})= ( Ref.inc(LabN) ) | count_number(_)=(); (* scan is used to scan the opcode list for the first time, to determine the size of Reg and Lab_Array, i.e. number of registers and labels. *) fun scan(nil)=() | scan(h::t)=(count_number(h);scan(t)); (* setlabels is used to set the label array, of which each item is a pair (label, codep), codep points to the codes containing the LABEL statement and afterwards codes. *) fun setlabels(nil,_)= () | setlabels(codel as ((LABEL {lab=(l,_),...})::t),k)= (update((!Lab_Array),k,(l,ref codel)); setlabels(t,k+1) ) | setlabels(h::t,k)=setlabels(t,k) ; (* initializing the enviroment of the simulation. *) fun init(l)=(RegN:=0; LabN:=0; IP:=l; codes:=l; scan(!IP); Ref.inc(RegN); Reg:=array( (!RegN), inivalue ) ; Memory:=array( (!memorysize), inivalue ) ; Lab_Array:=array( (!LabN), (0,IP)); setlabels(!IP,0) ); exception wrong_label; exception runtime_error_in_labwords; exception runtime_error_in_words_or_labwords; exception negative_label_offset; exception no_label_in_register; exception illegal_operator_or_operand; exception type_mismatch_in_comparison ; exception no_address_in_register; exception no_memory_address_in_register; (* getresult gives the results of arithmtic operations *) fun getresult(iadd,INT (n1:int),INT (n2:int))=INT (n1+n2) | getresult(isub,INT (n1:int),INT (n2:int))=INT (n1-n2) | getresult(imul,INT (n1:int),INT (n2:int))=INT (n1*n2) | getresult(idiv,INT (n1:int),INT (n2:int))=INT (n1 div n2) | getresult(fadd,REAL (r1:real),REAL (r2:real))=REAL (r1+r2) | getresult(fsub,REAL (r1:real),REAL (r2:real))=REAL (r1-r2) | getresult(fmul,REAL (r1:real),REAL (r2:real))=REAL (r1*r2) | getresult(fdiv,REAL (r1:real),REAL (r2:real))=REAL (r1/r2) | getresult(iadd,INT (n1:int),LABVAL (l,k))=LABVAL (l,k+n1) | getresult(iadd,LABVAL (l,k),INT (n1:int))=LABVAL (l,k+n1) | getresult(isub,LABVAL (l,k),INT (n1:int))=LABVAL (l,k-n1) | getresult(orb,INT n1,INT n2)=INT (Bits.orb(n1,n2)) | getresult(andb,INT n1,INT n2)=INT (Bits.andb(n1,n2)) | getresult(xorb,INT n1,INT n2)=INT (Bits.xorb(n1,n2)) | getresult(rshift,INT n1,INT n2)=INT (Bits.rshift(n1,n2)) | getresult(lshift,INT n1,INT n2)=INT (Bits.lshift(n1,n2)) | getresult(real,INT n,_)=REAL (intToReal(n)) | getresult(floor,REAL r,_)=INT (Real.floor(r)) | (* getresult(logb,REAL r,_)=INT (System.Unsafe.Assembly.A.logb(r))| *) getresult(_)=raise illegal_operator_or_operand; (* compare gives the results of comparisons in BRANCH statement. *) fun compare(ilt,INT n1,INT n2)= (n1n2) | compare(ile,INT n1,INT n2)= (n1<=n2) | compare(ige,INT n1,INT n2)= (n1>=n2) | compare(ine,INT n1,INT n2)= (n1<>n2) | compare(flt,REAL r1,REAL r2)= (r1r2) | compare(fle,REAL r1,REAL r2)= (r1<=r2) | compare(fge,REAL r1,REAL r2)= (r1>=r2) | compare(fne,REAL r1,REAL r2)= (realNe(r1,r2)) | compare(inrange,INT a,INT b)= (a>=0) andalso (ab) | compare(inrange,REAL a,REAL b)= (a>=0.0) andalso (ab) | compare(_)=raise type_mismatch_in_comparison ; (* findjmp_place returns the pointer to the codes corresponding to the given label (the codes containing the LABEL statement itself). *) fun findjmp_place lab = let val ipp=ref (ref nil) and i=ref 0 and flag=ref true; val none=(while ( (!i < !LabN) andalso (!flag) ) do ( let val (l,p)=((!Lab_Array) sub (!i)) in if (l=lab) then (ipp:=p;flag:=false) else Ref.inc(i) end ) ) in if (!flag) then raise wrong_label else (!ipp) end; (* findjmp_word returns the content of the k th labword in a code stream. *) fun findjmp_word(k,ip)=if (k<0) then raise negative_label_offset else let fun f2(1,LABWORD{lab=(herepos,_)}::t) =herepos | f2(k,LABWORD{...}::t)=f2(k-1,t) | f2(_)=raise runtime_error_in_labwords ; in f2(k, (!ip) ) end; (* inst_word returns the content of the k'th word or labword in a code stream. *) fun inst_word(k,ip)=if (k<0) then raise negative_label_offset else let fun f(1,LABWORD{lab=(herepos,_)}::t) =LABVAL (herepos,0) | f(1,WORD{value=n}::t)=INT n | f(k,LABWORD{...}::t)=f(k-1,t) | f(k,WORD{...}::t)=f(k-1,t) | f(_)=raise runtime_error_in_words_or_labwords in f(k,(!ip)) end; (* execjmp changes IP, makes it point to the codes of the given label. *) fun execjmp(LABVAL (l,0))= (IP:= !(findjmp_place l) ) | execjmp(LABVAL (l,k))= (IP:= ! (findjmp_place (findjmp_word(k,findjmp_place(l) ) ) ) ) | execjmp(_) = raise no_label_in_register; (* addrplus returns the result of address+offset. *) fun addrplus(INT n,ofst)= n+ofst | addrplus(_,_)=raise no_memory_address_in_register; (* content gives the content of the fetched word. *) fun content(INT n,ofst)= (!Memory) sub (n+ofst) | content(LABVAL (l,k),ofst)=inst_word(k+ofst,findjmp_place(l)) | content(_,_)=raise no_address_in_register; (* exec executes the given instruction. *) fun exec(FETCH{immutable=_,offset=ofst,ptr=(p,_),dst=(d,_)})= update((!Reg),d,content((!Reg) sub p,ofst) ) | exec(STORE{offset=ofst,src=(s,_),ptr=(p,_)})= update((!Memory),addrplus((!Reg) sub p,ofst),(!Reg) sub s) | exec(GETLAB {lab=(l,_),dst=(d,_)})= update((!Reg),d,(LABVAL (l,0)) ) | exec(GETREAL {value=v,dst=(d,_)})= update((!Reg),d,(REAL (strToReal v))) | exec(MOVE{src=(s,_),dst=(d,_)})= update((!Reg),d, (!Reg) sub s ) | exec(LABEL {...})= () | exec(LABWORD {...}) = () | exec(WORD{...})= () | exec(JUMP {dst=(d,_),...})= execjmp((!Reg) sub d) | exec(ARITH {oper=opn,src1=(s1,_),src2=(s2,_),dst=(d,_)})= update((!Reg),d,getresult(opn,(!Reg) sub s1,(!Reg) sub s2) ) | exec(ARITHI {oper=opn,src1=(s1,_),src2=n1,dst=(d,_)})= update((!Reg),d,getresult(opn,(!Reg) sub s1,(INT n1) ) ) | exec(BRANCH{test=comp,src1=(s1,_),src2=(s2,_),dst=(labnum,_),...})= if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum) ) ) else () | exec(NOP)= () | exec(BOGUS _)= raise Match ; exception End_of_Program; fun step () =let val Instruction=(hd(!IP) handle Hd=> raise End_of_Program) in (IP:=tl(!IP) handle Tl=>raise End_of_Program; exec(Instruction) ) end; fun run () =(step();run() ) handle End_of_Program =>output(std_out,"End of program\n"); (* bms, ims, rms are simply abbreviations. *) val bms : bool -> string = Bool.toString and ims : int -> string = Int.toString and rms : real -> string = Real.toString (* dispv shows the content of a register, dispm shows the content of a memory word. *) fun dispv(n,INT k)=output(std_out,"Register "^ims(n)^": "^ "INT "^ims(k)^"\n") | dispv(n,REAL r)=output(std_out,"Register "^ims(n)^": "^ "REAL "^rms(r)^"\n") | dispv(n,LABVAL (l,0))=output(std_out, "Register "^ims(n)^": "^ "LABEL "^ims(l)^"\n") | dispv(n,LABVAL (l,k))=output(std_out, "Register "^ims(n)^": "^ "LABWORD "^ims(k)^" after"^ "LABEL "^ims(l)^"\n") ; fun dispm(n,INT k)=output(std_out,"Memory "^ims(n)^": "^ "INT "^ims(k)^"\n") | dispm(n,REAL r)=output(std_out,"Memory "^ims(n)^": "^ "REAL "^rms(r)^"\n") | dispm(n,LABVAL (l,0))=output(std_out, "Memory "^ims(n)^": "^ "LABEL "^ims(l)^"\n") | dispm(n,LABVAL (l,k))=output(std_out, "Memory "^ims(n)^": "^ "LABWORD "^ims(k)^" after"^ "LABEL "^ims(l)^"\n") ; (* oms and cms give the strings of the functions and comparisions. *) fun oms(iadd)="iadd" | oms(isub)="isub" | oms(imul)="imul" | oms(idiv)="idiv" | oms(fadd)="fadd" | oms(fsub)="fsub" | oms(fmul)="fmul" | oms(fdiv)="fdiv" | oms(real)="real" | oms(floor)="floor" | oms(logb)="logb" | oms(orb)="orb" | oms(andb)="andb" | oms(xorb)="xorb" | oms(rshift)="rshift" | oms(lshift)="lshift" ; fun cms(ilt)="ilt" | cms(igt)="igt" | cms(ieq)="ieq" | cms(ile)="ile" | cms(ige)="ige" | cms(ine)="ine" | cms(flt)="flt" | cms(fgt)="fgt" | cms(feq)="feq" | cms(fle)="fle" | cms(fge)="fge" | cms(fne)="fne" | cms(outofrange)="outofrange" | cms(inrange)="inrange" ; (* lms gives the string of the live register list. *) fun lms(nil)="" | lms((h,s)::nil)="("^ims(h)^","^s^")" | lms((h,s)::t)="("^ims(h)^","^s^"),"^lms(t); (* disp gives the string for the instruction. *) fun disp(FETCH{immutable=b,offset=ofst,ptr=(p,s1),dst=(d,s2)}) = "FETCH{immutable="^bms(b)^",offset="^ims(ofst) ^",ptr=("^ims(p)^","^s1 ^"),dst=("^ims(d)^","^s2^")}\n" | disp(STORE{offset=ofst,src=(s,s1),ptr=(p,s2)}) = "STORE{offset="^ims(ofst)^",src=("^ims(s)^","^s1^"),ptr=(" ^ims(p)^","^s2^")}\n" | disp(GETLAB{lab=(l,ls),dst=(d,ds)}) = "GETLAB{lab=("^ims(l)^","^ls^"),dst=("^ims(d)^","^ds^")}\n" | disp(GETREAL{value=r,dst=(d,ds)}) = "GETREAL{value="^r^",dst=("^ims(d)^","^ds^")}\n" | disp(ARITH{oper=opn,src1=(s1,ss1),src2=(s2,ss2),dst=(d,ds)})= "ARITH{oper="^oms(opn)^",src1=("^ims(s1)^","^ss1^"),src2=("^ims(s2) ^","^ss2^"),dst=("^ims(d)^","^ds^")}\n" | disp(ARITHI{oper=opn,src1=(s1,ss1),src2=n,dst=(d,ds)})= "ARITH{oper="^oms(opn)^",src1=("^ims(s1)^","^ss1^"),src2="^ims(n)^ ",dst=("^ims(d)^","^ds^")}\n" | disp(MOVE{src=(s,ss),dst=(d,ds)})= "MOVE{src=("^ims(s)^","^ss^"),dst=("^ims(d)^","^ds^")}\n" | disp(BRANCH{test=comp,src1=(s1,ss1),src2=(s2,ss2),dst=(labnum,ss3), live=lt})= "BRANCH{test="^cms(comp)^",src1=("^ims(s1)^","^ss1^"),src2=("^ims(s2) ^","^ss2^"),dst=("^ims(labnum)^","^ss3^"),live=["^lms(lt)^"]}\n" | disp(JUMP{dst=(d,ds),live=lt}) = "JUMP{dst=("^ims(d)^","^ds^"),live=["^lms(lt)^"]}\n" | disp(LABWORD{lab=(l,s)})="LABWORD{lab=("^ims(l)^","^s^")}\n" | disp(LABEL{lab=(l,s),live=lt})= "LABEL{lab=("^ims(l)^","^s^"),live=["^lms(lt)^"]}\n" | disp(WORD{value=n})="WORD{value="^ims(n)^"}\n" | disp(NOP)="NOP" | disp(BOGUS _) = raise Match ; fun d_pc () =output(std_out,disp(hd(!IP)) handle Hd=>"No More Instruction\n"); fun pc () = (!IP); fun pptr () =(List.length(!codes)-List.length(!IP))+1; fun breakptr k=let fun goon (LABEL {lab=(l,_),...})=(l<>k) | goon (_)=true in while goon(hd(!IP)) do step() end; fun regc n=((!Reg) sub n); fun d_r () =let val i=ref 0 in (while ( !i < !RegN) do (dispv((!i),(!Reg) sub (!i)); Ref.inc(i) ) ) end; fun d_regs (nil)=() | d_regs (h::t)=(dispv(h,(!Reg) sub h);d_regs(t)); fun mcell n=((!Memory) sub n); fun d_m (n,m)=let val i=ref n in while ( !i <=m) do (dispm(!i,(!Memory) sub !i); Ref.inc(i) ) end; fun d_ms nil =() | d_ms (h::t)=(dispm(h,(!Memory) sub h); d_ms(t) ); (* This part for the VLIW mode execution. *) val runcount=ref 0 and sizen=ref 0 and flag=ref true; exception Simulator_error_1; exception Simulator_error_2; exception Data_dependency_checked; (* member tests whether element a is in a list. *) fun member(a,nil)=false | member(a,h::t)=if (a=h) then true else member(a,t); (* hvcom tests whether the intersection of two list isnot nil. *) fun hvcom(nil,l)=false | hvcom(h::t,l)=member(h,l) orelse hvcom(t,l); (* gset returns the list of registers refered in a instruction. gwset returns the list of the register being written in a instruction. *) fun gset(FETCH{ptr=(p,_),dst=(d,_),...})=[p,d] | gset(STORE{src=(s,_),ptr=(p,_),...})=[s,p] | gset(GETLAB{dst=(d,_),...})=[d] | gset(GETREAL{dst=(d,_),...})=[d] | gset(ARITH{src1=(s1,_),src2=(s2,_),dst=(d,_),...})=[s1,s2,d] | gset(ARITHI{src1=(s1,_),dst=(d,_),...})=[s1,d] | gset(MOVE{src=(s,_),dst=(d,_)})=[s,d] | gset(BRANCH{src1=(s1,_),src2=(s2,_),...})=[s1,s2] | gset(JUMP{dst=(d,_),...})=[d] | gset(_)=nil ; fun gwset(FETCH{dst=(d,_),...})=[d] | gwset(GETLAB{dst=(d,_),...})=[d] | gwset(GETREAL{dst=(d,_),...})=[d] | gwset(ARITH{dst=(d,_),...})=[d] | gwset(ARITHI{dst=(d,_),...})=[d] | gwset(MOVE{dst=(d,_),...})=[d] | gwset(_)=nil ; (* fetchcode returns the instruction word which contains the next k instruction. fetchcode3 is used in version 3 of VLIW mode, in which case labels within instruction words are OK. *) fun fetchcode(0)=nil | fetchcode(k)=let val h=hd(!IP) in (IP:=tl(!IP); if hvnop(h) then (output(std_out, "Warning: labels within the instruction word\n"); fetchcode(k) ) else h::fetchcode(k-1) ) end handle Hd=>nil; fun fetchcode3(0)=nil | fetchcode3(k)=let val h=hd(!IP) in (IP:=tl(!IP); if hvnop(h) then fetchcode3(k) else h::fetchcode3(k-1) ) end handle Hd=>nil; (* allnop tests if all instructions left mean no operation. *) fun allnop(nil)=true | allnop(NOP::t)=allnop(t) | allnop(_)=false; (* nopcut cut the instruction stream in a way that the first half are all NOP instruction. *) fun nopcut(nil)=(nil,nil) | nopcut(NOP::t)=let val (l1,l2)=nopcut(t) in (NOP::l1,l2) end | nopcut(l)=(nil,l); (* cmdd tests the data dependency on memory cells and IP. *) fun cmdd(_,nil)=false | cmdd(wset,STORE{ptr=(p,_),offset=ofst,...}::t)= cmdd(addrplus((!Reg) sub p,ofst)::wset,t) | cmdd(wset,FETCH{ptr=(p,_),offset=ofst,...}::t)= member(addrplus((!Reg) sub p,ofst),wset) orelse cmdd(wset,t) | cmdd(wset,BRANCH{...}::t)=if allnop(t) then false else true | cmdd(wset,JUMP{...}::t)=if allnop(t) then false else true | cmdd(wset,h::t)=cmdd(wset,t); (* crdd test the data dependency on registers. *) fun crdd(_,nil)=false | crdd(wset,h::t)=if hvcom(gset(h),wset) then true else crdd(gwset(h)@wset,t) ; (* check_dd checks whether there is data dependency in instruction stream l. *) fun check_dd(l)= crdd(nil,l) orelse cmdd(nil,l); (* rddcut seperate the longest part of the instruction stream that have no data dependency on registers , from the left. *) fun rddcut(_,nil)= (nil,nil) | rddcut(wset,l as (h::t))= if hvcom(gset(h),wset) then (nil,l) else let val (l1,l2)=rddcut(gwset(h)@wset,t) in (h::l1,l2) end ; (* mddcut seperate the longest part of the instruction stream that have no data dependency on memory cells and IP, from the left. *) fun mddcut(_,nil)= (nil,nil) | mddcut(wset,(h as STORE{ptr=(p,_),offset=ofst,...})::t)= let val (l1,l2)=mddcut(addrplus((!Reg) sub p,ofst)::wset,t) in (h::l1,l2) end | mddcut(wset,(h as FETCH{ptr=(p,_),offset=ofst,...})::t)= if member(addrplus((!Reg) sub p,ofst),wset) then (nil,h::t) else let val (l1,l2)=mddcut(wset,t) in (h::l1,l2) end | mddcut(wset,(h as BRANCH{...})::t)= let val (l1,l2)=nopcut(t) in (h::l1,l2) end | mddcut(wset,(h as JUMP{...})::t)= let val (l1,l2)=nopcut(t) in (h::l1,l2) end | mddcut(wset,h::t)= let val (l1,l2)=mddcut(wset,t) in (h::l1,l2) end ; (* calcult returns the necessary value list corresponding to a instruction stream. And change the IP when necessary. *) fun calcult(nil)=nil | calcult(FETCH{ptr=(p,_),offset=ofst,...}::t)= content((!Reg) sub p,ofst)::calcult(t) | calcult(STORE{src=(s,_),...}::t)=((!Reg) sub s )::calcult(t) | calcult(MOVE{src=(s,_),...}::t)=((!Reg) sub s)::calcult(t) | calcult(ARITH{oper=opn,src1=(s1,_),src2=(s2,_),...}::t)= getresult(opn,(!Reg) sub s1,(!Reg) sub s2)::calcult(t) | calcult(ARITHI{oper=opn,src1=(s1,_),src2=n1,...}::t)= getresult(opn,(!Reg) sub s1,(INT n1))::calcult(t) | calcult(JUMP{dst=(d,_),...}::t)=((!Reg) sub d)::calcult(t) | calcult(h::t)=calcult(t); (* dowr does the actual writing operations. *) fun dowr(nil,nil)=() | dowr(nil,h::t)=raise Simulator_error_1 | dowr(FETCH{...}::t,nil)=raise Simulator_error_2 | dowr(STORE{...}::t,nil)=raise Simulator_error_2 | dowr(MOVE{...}::t,nil)=raise Simulator_error_2 | dowr(ARITH{...}::t,nil)=raise Simulator_error_2 | dowr(ARITHI{...}::t,nil)=raise Simulator_error_2 | dowr(JUMP{...}::t,nil)=raise Simulator_error_2 | dowr(FETCH{dst=(d,_),...}::t,vh::vt)=(update((!Reg),d,vh); dowr(t,vt) ) | dowr(STORE{ptr=(p,_),offset=ofst,...}::t,vh::vt)= (update((!Memory),addrplus((!Reg) sub p,ofst),vh); dowr(t,vt) ) | dowr(GETLAB{lab=(l,_),dst=(d,_)}::t,vt)= (update((!Reg),d,(LABVAL (l,0)) ); dowr(t,vt) ) | dowr(GETREAL{value=v,dst=(d,_)}::t,vt)= (update((!Reg),d,(REAL (strToReal v)) ); dowr(t,vt) ) | dowr(MOVE{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(ARITH{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(ARITHI{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(JUMP{...}::t,vh::vt)= (execjmp(vh); flag:=false; dowr(t,vt) ) | dowr(BRANCH{test=comp,src1=(s1,_),src2=(s2,_), dst=(labnum,_),...}::t,vt)= if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum)); flag:=false; dowr(t,vt) ) else dowr(t,vt) | dowr(h::t,vt)=dowr(t,vt) ; (* vv3 executes an instruction word in version 3 mode. *) fun vv3(nil)= () | vv3(l)=let val (l1,l2)=rddcut(nil,l); val (l3,l4)=mddcut(nil,l1) in (flag:=true; dowr(l3,calcult(l3)); Ref.inc(runcount); if (!flag) then vv3(l4@l2) else () ) end; fun vinit(k,l)=(init(l); sizen:=k; runcount:=0 ) ; fun vstep1()=let val f=(while hvnop(hd(!IP)) do IP:=tl(!IP)) handle Hd=>raise End_of_Program; val codel=fetchcode(!sizen) in (dowr(codel,calcult(codel)); Ref.inc(runcount) ) end; fun vstep2()=let val f=(while hvnop(hd(!IP)) do IP:=tl(!IP)) handle Hd=>raise End_of_Program; val codel=fetchcode(!sizen) in if check_dd(codel) then (output(std_out,"Data dependency checked in:\n"); let fun f(nil)=() | f(h::t)=(output(std_out,":"^disp(h)); f(t)) in f(codel) end; raise Data_dependency_checked ) else (dowr(codel,calcult(codel)); Ref.inc(runcount) ) end; fun vstep3()=let val f=if (!IP)=nil then raise End_of_Program else (); val codel=fetchcode3(!sizen) in vv3(codel) end; fun vrun1()=(vstep1();vrun1()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" steps.\n"); fun vrun2()=(vstep2(); vrun2()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" steps.\n")| Data_dependency_checked=> output(std_out,"Program halted.\n") ; fun vrun3()=(vstep3(); vrun3()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" substeps.\n"); fun vpc()=let val codel=(!IP) ; fun f (_,nil)=() | f (0,_)= () | f (k,h::l)=if k<=0 then () else (output(std_out,disp(h) ); if hvnop(h) then f(k,l) else f(k-1,l) ) in f((!sizen),codel) end; (* This part for Pipeline mode *) exception illegal_jump_within_branchdelay; exception illegal_branch_within_branchdelay; exception illegal_label_within_branchdelay; exception illegal_labword_within_branchdelay; exception illegal_word_within_branchdelay; (* Rdelay points to the timing array of registers. *) val Rdelay=ref ( array(0,0) ); (* clock records run time. withindelay is a flag used in BRANCH and JUMP delays. *) val clock=ref 0 and withindelay=ref false; val fdelay=ref 1 and ardelay: ((arithop->int) ref)=ref (fn k=>1) and jdelay=ref 1; (* pexec executes one instruction, increasing the clock when necessary, which corresponding to the holding down of instruction streams. *) fun pexec(FETCH{immutable=_,offset=ofst,ptr=(p,_),dst=(d,_)})= (let val t=(!Rdelay) sub p in if (!clock) (i:=(!jdelay) ) ; (IP:=tl(!IP)) handle Tl=>() ) end; execjmp((!Reg) sub d) ) | pexec(BRANCH{test=comp,src1=(s1,_),src2=(s2,_),dst=(labnum,_),...})= if (!withindelay) then raise illegal_branch_within_branchdelay else (let val t1=((!Rdelay) sub s1) and t2=((!Rdelay) sub s2); val t=Int.max(t1,t2) in if (!clock) (i:=(!jdelay) ) ; (IP:=tl(!IP)) handle Tl=>() ) end; if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum) ) ) else () ) | pexec(NOP)=Ref.inc(clock) | pexec(LABEL{...})=if (!withindelay) then raise illegal_label_within_branchdelay else () | pexec(LABWORD{...})=if (!withindelay) then raise illegal_labword_within_branchdelay else () | pexec(WORD{...})=if (!withindelay) then raise illegal_word_within_branchdelay else () ; fun pinit(fetchdelay,arithdelay,jumpdelay,l)= (init(l); Rdelay:=array((!RegN),0); clock:=0; fdelay:=fetchdelay; ardelay:=arithdelay; jdelay:=jumpdelay ); fun pstep()= let val Instruction=(hd(!IP) handle Hd=>raise End_of_Program) in (IP:=tl(!IP) handle Tl=>raise End_of_Program; withindelay:=false; pexec(Instruction) ) end; fun prun()=(pstep(); prun() ) handle End_of_Program=> (output(std_out,"End of program.\n"); output(std_out,"Total time used: "^ims(!clock)^" cycles.\n") ); end; structure SimStuff = struct fun read file = let val if1 = (open_in "simprelude.s") val if2 = (open_in file) val if3 = (open_in "simpostlude.s") val prelude = ReadAbs.read if1 val prog = ReadAbs.read if2 val postlude = ReadAbs.read if3 in close_in if1; close_in if2; close_in if3; prelude @ prog @ postlude end fun init file = SetEnv.init (read file) val runcount = ref 0 fun run ()= let open AbsMach val foo = runcount := 0 fun updc NOP = runcount := !runcount + 1 | updc _ = () open SetEnv fun f () = (step(); (updc o hd o pc)(); f()) in f() end fun srun () = let open SetEnv in d_pc(); step(); srun() end; fun memsave () = !SetEnv.Memory fun memcmp(a:AbsMach.values array, b:AbsMach.values array) = let open AbsMach fun cmp (INT a, INT b) = a = b | cmp (REAL a, REAL b) = realEq(a, b) | cmp (LABVAL _, LABVAL _) = true | cmp _ = false fun f 0 = ~1 | f n = if cmp((a sub n), (b sub n)) then f (n - 1) else n val al = Array.length a val bl = Array.length b in if al = bl then f (al - 1) else (print "size\n"; 0) end fun copyarray a = let val la = Array.length a val na = array(la, a sub 0) fun f n = if n > 0 then (update(na, n, a sub n) ; f (n - 1)) else () val foo = f (la - 1) in na end exception PROG_NO_END local open AbsMach in fun vstring (INT i) = "INT " ^ makestring i | vstring (REAL i) = "REAL " ^ Real.toString i | vstring (LABVAL(i, j)) = "LABVAL(" ^ makestring i ^ ", " ^ makestring j ^ ")" end fun runf f = ((init f; run (); raise PROG_NO_END)) handle End_of_Program => (print "eop\n"; SetEnv.regc 4) fun cmprog(f1, f2) = let open AbsMach fun intof (INT i) = i fun ptsat p = SetEnv.mcell (intof p) val p1 = runf f1 (* val foo = print ("cmprog1:" ^ vstring p1 ^ "\n") *) val v1 = ptsat p1 val r1 = !runcount val p2 = runf f2 (* val foo = print ("cmprog2:" ^ vstring p2 ^ "\n") *) val v2 = ptsat p2 val r2 = !runcount in (f1 ^ " ct " ^ makestring r1 ^ " ptr " ^ vstring p1 ^ " val " ^ vstring v1 ^ f2 ^ " ct " ^ makestring r2 ^ " ptr " ^ vstring p2 ^ " val " ^ vstring v2 ^ "\n") end end fun time str f = let (* open System.Timer val s = start_timer() *) val v = f() (* val e = check_timer s val foo = print (str ^ " took " ^ makestring e ^ "sec.usec\n") *) in v end fun writeprog(file, j, p) = let val ot = (open_out file) val prog = ReadI.writeI(j, p) val filp = (Delay.rm_bogus o OutFilter.remnops) prog val xxx = PrintAbs.show ot filp in close_out ot end; fun wp(file, prog) = let val ot = (open_out file) val filp = Delay.rm_bogus prog val xxx = PrintAbs.show ot filp in close_out ot end; fun dodelay i = (Delay.init i; Delay.add_delay i); val _ = ( Node.move_test_debug := false; Node.move_op_debug := false; Node.rw_debug := false; Node.delete_debug := false; Node.ntn_debug := true; Node.prog_node_debug := false; Node.prog_node_debug_verbose := false; Node.closure_progs_debug := false; Node.cpsiCheck := false; Compress.compress_debug := false; ReadI.read_debug := false; ReadI.write_debug := false; ReadI.live_debug := false ) fun pm pl = print (StrPak.stringListString (map ReadI.progMap pl)); fun pp pl = print (StrPak.stringListString (map PrintAbs.str pl)); fun ndnm nil = raise Node.NAMETONODE | ndnm(h::t) = (fn (nm) => Node.nameToNode(h, nm) handle Node.NAMETONODE => ndnm t nm); exception ERROR; fun err (s:string) = (print s; raise ERROR); fun pmem nil = (err "oh well") | pmem ((ns, n0, f)::t) = fn n => if Set.member(ns, n) then (ns, n0, f) else pmem t n; structure Main = struct fun doitx (ifile:string, ofile:string, c_ofile:string, ws:int) = let val foo = Ntypes.init_names() val ins = open_in ifile val i = (dodelay o BreakInst.breaki o ReadAbs.read) ins val _ = close_in ins val (j, p) = time "Building Nodes" (fn () => ReadI.readI i) val x = time "writing unopt" (fn () => writeprog(ofile, j, p)) fun cwin p = Compress.compress(ws, p) val cp = time "compressing program" (fn () => map cwin p) val xx = time "writing opt program" (fn () => writeprog(c_ofile, j, cp)) val answer = "" (* SimStuff.cmprog(ofile, c_ofile) *) val code_motions = Ntypes.new_name "0" in print (answer ^ "code_motions " ^ code_motions ^ " \n") end fun main(s:string list, env:string list) = let val idemp = ref 0 val ws = ref 0 val ifile = ref "/dev/null" val ofile = ref "/dev/null" val c_ofile = ref "/dev/null" val gotifile = ref false val gotofile = ref false fun digit d = if ord d >= ord "0" andalso ord d <= ord "9" then ord d - ord "0" else err ("expected digit. got " ^ d) val parse = fn ("-" :: "i" :: "d" :: "e" :: "m" :: d :: nil) => idemp := digit d | ("-" :: "w" :: "s" :: d :: nil) => ws := digit d | ("-" :: t) => (print ("usage: comp [-ws#] [-idem#]" ^ "input_file temp_file compressed_file\n"); print ("ws is the window size\nidem is the idempotency\n"); err "exiting") | s => if !gotofile then c_ofile := implode s else if !gotifile then (gotofile := true; ofile := implode s) else (gotifile := true; ifile := implode s) val foo = List.app (parse o explode) (tl s) val foo = print ("compressing " ^ !ifile ^ " into (uncompressed)" ^ !ofile ^ " and (compressed)" ^ !c_ofile ^ " with idempotency " ^ makestring (!idemp) ^ " and window size " ^ makestring (!ws) ^ "\n") in Delay.idempotency := !idemp; doitx(!ifile, !ofile, !c_ofile, !ws) end val s = OS.FileSys.getDir() fun doit() = main(["foobar", "-ws9", s^"/DATA/ndotprod.s", s^"/DATA/tmp.s", s^"/DATA/cmp.s"], nil) fun testit _ = () end structure Main : BMARK = struct open Main val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20210117+dfsg/benchmark/tests/wc-input1.sml000066400000000000000000000021301416264345000214620ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let open TextIO val f = OS.FileSys.tmpName () val out = openOut f val _ = output (out, String.implode (List.tabulate (1000000, fn i => if i mod 10 = 0 then #"\n" else #"a"))) val _ = closeOut out fun wc f = let val ins = openIn f fun loop (i: int): int = case input1 ins of NONE => i | SOME c => loop (if c = #"\n" then i + 1 else i) val n = loop 0 val _ = if n <> 100000 then raise Fail "bug" else () val _ = closeIn ins in n end val rec loop = fn 0 => () | n => (wc f; loop (n - 1)) val _ = loop n val _ = OS.FileSys.remove f in () end end mlton-20210117+dfsg/benchmark/tests/wc-scanStream.sml000066400000000000000000000025721416264345000223540ustar00rootroot00000000000000(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let open TextIO val f = OS.FileSys.tmpName () val out = openOut f val _ = output (out, String.implode (List.tabulate (1000000, fn i => if i mod 10 = 0 then #"\n" else #"a"))) val _ = closeOut out fun wc f = let val ins = openIn f in TextIO.scanStream (fn reader => fn s => let fun loop (s, ns) = case reader s of NONE => (closeIn ins ; if ns <> 100000 then raise Fail "bug" else () ; NONE) | SOME (c, s') => loop (s', if c = #"\n" then ns + 1 else ns) in loop (s, 0) end) ins end val rec loop = fn 0 => () | n => (wc f; loop (n - 1)) val _ = loop n val _ = OS.FileSys.remove f in () end end mlton-20210117+dfsg/benchmark/tests/zebra.sml000066400000000000000000000224701416264345000207470ustar00rootroot00000000000000(* Copyright Stephen Weeks (sweeks@sweeks.com). 1999-6-21. * * This code solves the following "zebra" puzzle, and prints the solution. * There are 120^5 ~= 24 billion possibilities, so exhaustive search should * work fine, but I decided to write something that was a bit more clever. * It took me longer to write (2.5 hours) than to write exhaustive search, but * it runs fast (0.06 seconds on my 400MhZ P6). The code only needs to explore * 3342 posibilites to solve the puzzle. * * Here is the puzzle. * * This word problem has 25 variables and 24 are given values. You must * solve * the 25th. * * The trick is HOW? * * If you look at the problem mathematically, no sweat. If you get lost * in the * English, you are dead. * * You will know you are right by checking the answer with all the * conditions. * * Less than 1 percent of the population can solve this problem. * * The question is: Based on the following clues, who owns the zebra? * * **There are five houses. * * **Each house has its own unique color. * * **All house owners are of different nationalities. * * **They all have different pets. * * **They all drink different drinks. * * **They all smoke different cigarettes. * * **The Englishman lives in the red house. * * **The Swede has a dog. * * **The Dane drinks tea. * * **The green house is adjacent to the white house on the left. * * **In the green house they drink coffee. * * **The man who smokes Pall Malls has birds. * * **In the yellow house they smoke Dunhills. * * **In the middle house they drink milk. * * **The Norwegian lives in the first house. * * **The man who smokes Blends lives in a house next to the house with * cats. * * **In a house next to the house where they have a horse, they smoke * Dunhills. * * **The man who smokes Blue Masters drinks beer. * * **The German smokes Princes. * * **The Norwegian lives next to the blue house. * * **They drink water in a house next to the house where they smoke * Blends. * * Who owns the zebra? *) fun peek (l, p) = List.find p l fun map (l, f) = List.map f l fun fold (l, b, f) = List.foldl f b l datatype cigarette = Blend | BlueMaster | Dunhill | PallMall | Prince val cigaretteToString = fn Blend => "Blend" | BlueMaster => "BlueMaster" | Dunhill => "Dunhill" | PallMall => "PallMall" | Prince => "Prince" datatype color = Blue | Green | Red | White | Yellow val colorToString = fn Blue => "Blue" | Green => "Green" | Red => "Red" | White => "White" | Yellow => "Yellow" datatype drink = Beer | Coffee | Milk | Tea | Water val drinkToString = fn Beer => "Beer" | Coffee => "Coffee" | Milk => "Milk" | Tea => "Tea" | Water => "Water" datatype nationality = Dane | English | German | Norwegian | Swede val nationalityToString = fn Dane => "Dane" | English => "English" | German => "German" | Norwegian => "Norwegian" | Swede => "Swede" datatype pet = Bird | Cat | Dog | Horse | Zebra val petToString = fn Bird => "Bird" | Cat => "Cat" | Dog => "Dog" | Horse => "Horse" | Zebra => "Zebra" type pos = int val poss = [1, 2, 3, 4, 5] val first = SOME 1 val middle = SOME 3 type 'a attribute = {poss: pos list, unknown: 'a list, known: (pos * 'a) list} exception Done fun 'a fluidLet (r: 'a ref, x: 'a, f: unit -> 'b): 'b = let val old = !r in r := x ; (f () before r := old) handle Done => raise Done | e => (r := old; raise e) end fun search () = let fun init (unknown: 'a list): 'a attribute ref = ref {poss = poss, unknown = unknown, known = []} val cigarettes = init [Blend, BlueMaster, Dunhill, PallMall, Prince] val colors = init [Blue, Green, Red, White, Yellow] val drinks = init [Beer, Coffee, Milk, Tea, Water] val nationalities = init [Dane, English, German, Norwegian, Swede] val pets = init [Bird, Cat, Dog, Horse, Zebra] fun ''a find (r: ''a attribute ref) (x: ''a): pos option = Option.map #1 (peek (#known (!r), fn (_, y) => x = y)) val smoke = find cigarettes val color = find colors val drink = find drinks val nat = find nationalities val pet = find pets fun display () = let fun loop (r: 'a attribute ref, toString) = (List.app (fn i => let val x = #2 (valOf (peek (#known (!r), fn (j, _) => i = j))) val s = toString x in print s ; print (CharVector.tabulate (12 - size s, fn _ => #" ")) end) poss ; print "\n") in loop (cigarettes, cigaretteToString) ; loop (colors, colorToString) ; loop (drinks, drinkToString) ; loop (nationalities, nationalityToString) ; loop (pets, petToString) end fun make f = fn (SOME x, SOME y) => f (x, y) | _ => true val same = make (op =) val adjacent = make (fn (x, y) => x = y - 1 orelse y = x - 1) val left = make (fn (x, y) => x = y - 1) val num = ref 0 fun isConsistent (): bool = (num := !num + 1 ; same (nat English, color Red) andalso same (nat Swede, pet Dog) andalso same (nat Dane, drink Tea) andalso left (color Green, color White) andalso same (color Green, drink Coffee) andalso same (smoke PallMall, pet Bird) andalso same (color Yellow, smoke Dunhill) andalso same (middle, drink Milk) andalso same (nat Norwegian, first) andalso adjacent (smoke Blend, pet Cat) andalso adjacent (pet Horse, smoke Dunhill) andalso same (drink Beer, smoke BlueMaster) andalso same (nat German, smoke Prince) andalso adjacent (nat Norwegian, color Blue) andalso adjacent (drink Water, smoke Blend) ) fun tryEach (l, f) = let fun loop (l, ac) = case l of [] => () | x :: l => (f (x, l @ ac); loop (l, x :: ac)) in loop (l, []) end fun try (r: 'a attribute ref, f: unit -> (('a attribute -> unit) * ( unit -> unit))) = let val {poss, unknown, known} = !r in case unknown of [] => () | _ => tryEach (unknown, fn (x, unknown) => let val (each, done) = f () in tryEach (poss, fn (p, poss) => let val attr = {known = (p, x) :: known, unknown = unknown, poss = poss} in fluidLet (r, attr, fn () => if isConsistent () then each attr else ()) end) ; done () end) end (* loop takes the current state and either * - terminates in the same state if there is no consistent extension * - raises Done with the state set at the consistent extension *) exception Inconsistent exception Continue of unit -> unit fun loop (): unit = let fun test r = try (r, fn () => let datatype 'a attrs = None | One of 'a | Many val attrs = ref None fun each a = case !attrs of None => attrs := One a | One _ => attrs := Many | Many => () fun done () = case !attrs of None => raise Inconsistent | One a => raise (Continue (fn () => fluidLet (r, a, loop))) | Many => () in (each, done) end) fun explore r = try (r, fn () => let fun each _ = loop () fun done () = raise Inconsistent in (each, done) end) in (test cigarettes ; test colors ; test drinks ; test nationalities ; test pets ; explore cigarettes ; explore colors ; explore drinks ; explore nationalities ; explore pets ; raise Done) handle Inconsistent => () | Continue f => f () end val _ = loop () handle Done => () val _ = if 3342 = !num then () else raise Fail "bug" (* val _ = display () *) in () end structure Main = struct fun doit n = let fun loop n = if n < 0 then () else (search () ; loop (n - 1)) in loop (n * 1000) end end mlton-20210117+dfsg/benchmark/update-counts.sh000077500000000000000000000027601416264345000211170ustar00rootroot00000000000000#!/usr/bin/env bash # set -e die () { echo "$1" >&2 exit 1 } if $(which gtime) --version >/dev/null 2>&1; then time=$(which gtime) elif $(which gnutime) --version >/dev/null 2>&1; then time=$(which gnutime) elif $(which time) --version 2>&1 | grep -q GNU; then time=$(which time) else die 'Can'\''t find GNU time' fi minTime="30.0" cd tests bench=$(for p in $(ls *.sml); do echo $(basename $p .sml); done) for prog in $bench; do case "$prog" in "fxp") continue ;; esac ( cat $prog.sml ; echo "val _ = Main.doit (valOf (Int.fromString (hd (CommandLine.arguments ()))))" ) > $prog.main.sml mlton -output $prog $prog.main.sml 1>/dev/null 2>/dev/null n=0 t=0 while [ "$(echo "$t < $minTime" | bc)" = "1" ]; do if [ $n -eq 0 ]; then n=1 m=1 k=1 elif [ $n -lt $m ]; then n=$(($n+$k)) else m=$((2*$m)) if [ $m -lt 8 ]; then n=$m else k=$(( ($m-$n) / 2 )) n=$(($n+$k)) fi fi $time -o $prog.time --format "%U + %S" ./$prog $n 1>/dev/null 2>/dev/null t=$(cat $prog.time | grep -v "Command exited" | bc) s=$(grep "Command exited" $prog.time) if [ ! -z "$s" ]; then s="; $s " break fi done echo "(\"$prog\", $n):: (* $t sec $s*)" rm $prog $prog.main.sml $prog.time done mlton-20210117+dfsg/bin/000077500000000000000000000000001416264345000145765ustar00rootroot00000000000000mlton-20210117+dfsg/bin/Makefile000066400000000000000000000004451416264345000162410ustar00rootroot00000000000000## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean mlton-20210117+dfsg/bin/clean000077500000000000000000000020061416264345000156040ustar00rootroot00000000000000#!/usr/bin/env bash set -e die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name [--exclude ...]" } name=$(basename "$0") dir=$(dirname "$0") root=$(cd "$dir/.." && pwd) bin="$root/bin" declare -a exclude while [ "$#" -gt 0 ]; do case "$1" in "--exclude") shift if [ "$#" -gt 0 ]; then exclude+=("$1"); shift fi ;; *) usage ;; esac done doit () { # rm -rf '.#'* .*~ *~ *.a *.o .cm core mlmon.out svn-commit.* "$bin/ls-ignore" | xargs rm -rf for f in *; do if [ -d "$f" ]; then for ((i=0; i < ${#exclude[*]}; i++)); do if [ "$f" == "${exclude[$i]}" ]; then continue 2 fi done cd "$f" if [ -r Makefile ]; then "$bin/mmake" clean || doit else doit fi cd .. fi done } doit mlton-20210117+dfsg/bin/host-arch000077500000000000000000000004131416264345000164120ustar00rootroot00000000000000#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac eval `"$bin/platform"` echo $HOST_ARCH mlton-20210117+dfsg/bin/host-os000077500000000000000000000004111416264345000161140ustar00rootroot00000000000000#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac eval `"$bin/platform"` echo $HOST_OS mlton-20210117+dfsg/bin/ls-ignore000077500000000000000000000060731416264345000164310ustar00rootroot00000000000000#!/usr/bin/env bash set -e # List ignored files of current directory by constructing a "find" # expression that matches names of ignored files. # # This script supports a reasonable subset of "gitignore(5)" # semantics. Notably, it does support: # * Patterns read from .gitignore files in current and parent directories # * Blank line separators # * Leading "#" comments # * Trailing "/" directory patterns # * Leading "/" this-directory patterns # and it does not support: # * Patterns read from $GIT_DIR/info/exclude # (b/c inappropriate for a source release) # * Patterns read from file specified by configuration variable core.excludesfile # (b/c inappropriate for a source release) # * Leading "!" negation patterns # (b/c complex semantics) # * Internal "/" FNM_PATHNAME patterns # (b/c complex semantics incompatible with '-path' primary) name=$(basename "$0") dir=$(dirname "$0") root=$(cd "$dir/.." && pwd) ignore='.gitignore' declare -a fargs fargs+=("(") fargs+=("-exec") fargs+=("false") fargs+=(";") idir="." while true; do if [ -r "$idir/$ignore" ]; then while IFS= read -r opat; do pat="$opat" ## Blank line: Separator -- supported if [ -z "$pat" ]; then continue fi ## Leading "#": Comment -- supported if [ "${pat:0:1}" = "#" ]; then continue fi ## Leading "\#": Pattern beginning with "#" -- supported if [ "${pat:0:2}" = "\#" ]; then pat="#${pat:2}" fi ## Leading "!": Negated pattern -- unsupported if [ "${pat:0:1}" = "!" ]; then echo "$name:: unsupported pattern: $opat" exit 1 fi ## Leading "\!": Pattern beginning with "!" -- supported if [ "${pat:0:2}" = "\!" ]; then pat="!${pat:2}" fi ## Trailing "/": Directory pattern -- supported if [ "${pat:$((${#pat}-1)):1}" = "/" ]; then dirPat="yes" pat="${pat:0:$((${#pat}-1))}" else dirPat="no" fi ## Leading "/": This-directory pattern -- supported if [ "${pat:0:1}" = "/" ]; then if [ "$idir" = "." ]; then pat="${pat:1}" else continue fi fi ## Internal "/": FNM_PATHNAME pattern -- unsupported if [ -z "${pat##*/*}" ]; then echo "$name:: unsupported pattern: $opat" exit 1 fi fargs+=("-o") fargs+=("(") if [ "$dirPat" = "yes" ]; then fargs+=("-type") fargs+=("d") fi fargs+=("-name") fargs+=("$pat") fargs+=(")") done < "$idir/$ignore" fi if [ "$(cd "$idir" && pwd)" != "$root" ]; then idir="../$idir" else break fi done fargs+=(")") find . -mindepth 1 -maxdepth 1 "${fargs[@]}" -print mlton-20210117+dfsg/bin/mlton-script000066400000000000000000000102041416264345000171510ustar00rootroot00000000000000#!/usr/bin/env bash # This script calls MLton. LIB_REL_BIN="../lib/mlton" EXE= CC="cc" # You may need to set 'GMP_INC_DIR' so the C compiler can find gmp.h. GMP_INC_DIR= # You may need to set 'GMP_LIB_DIR' so the C compiler can find libgmp. GMP_LIB_DIR= set -e dir=`dirname "$0"` lib=`cd "$dir/$LIB_REL_BIN" && pwd` declare -a rargs case "$1" in @MLton) shift while [ "$#" -gt 0 -a "$1" != "--" ]; do rargs[${#rargs[@]}]="$1" shift done if [ "$#" -gt 0 -a "$1" == "--" ]; then shift else echo '@MLton missing --' exit 1 fi ;; esac doitMLton () { mlton_mlton="$lib/mlton-compile$EXE" if [ -x "$mlton_mlton" ]; then exec "$mlton_mlton" @MLton ram-slop 0.5 "${rargs[@]}" -- "$@" fi } doitSMLNJ () { smlnj='sml' if $smlnj -h >/dev/null 2>&1; then smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | $smlnj 2>&1 1> /dev/null` mlton_smlnj_heap="$lib/mlton-compile-smlnj.$smlnj_heap_suffix" if [ -s "$mlton_smlnj_heap" ]; then exec "$smlnj" @SMLload="$mlton_smlnj_heap" "$@" fi fi } doitPolyML () { mlton_polyml="$lib/mlton-compile-polyml$EXE" if [ -x "$mlton_polyml" ]; then exec "$mlton_polyml" "$@" fi } doit () { doitMLton "$@" doitSMLNJ "$@" doitPolyML "$@" echo 'Unable to run MLton. Check that lib is set properly.' >&2 exit 1 } if [ -n "$GMP_INC_DIR" ]; then gmpCCOpts="-cc-opt -I$GMP_INC_DIR" fi if [ -n "$GMP_LIB_DIR" ]; then gmpLinkOpts="-link-opt -L$GMP_LIB_DIR -target-link-opt netbsd -Wl,-R$GMP_LIB_DIR" fi doit "$lib" \ -ar-script "$lib/static-library" \ -cc "$CC" \ -cc-opt '-std=gnu11 -fno-common' \ -cc-opt '-O1 -fno-strict-aliasing' \ -cc-opt '-foptimize-sibling-calls' \ -cc-opt '-w' \ -cc-opt-quote "-I$lib/include" \ $gmpCCOpts $gmpLinkOpts \ -llvm-llc-opt '-O2' \ -llvm-opt-opt '-mem2reg -O2' \ -mlb-path-var 'SML_LIB $(LIB_MLTON_DIR)/sml' \ -target-as-opt amd64 '-m64' \ -target-as-opt x86 '-m32' \ -target-cc-opt aix '-maix64' \ -target-cc-opt alpha \ '-mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d' \ -target-cc-opt amd64 '-m64' \ -target-cc-opt amd64-darwin '-arch x86_64' \ -target-cc-opt arm64-darwin '-arch arm64' \ -target-cc-opt ia64-hpux "-mlp64" \ -target-cc-opt ia64 "-mtune=itanium2" \ -target-cc-opt sparc '-m32 -mcpu=v8 -Wa,-xarch=v8plusa' \ -target-cc-opt x86 '-m32' \ -target-link-opt aix '-maix64' \ -target-link-opt alpha \ '-mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d' \ -target-link-opt amd64 '-m64' \ -target-link-opt amd64-darwin '-arch x86_64' \ -target-link-opt arm64-darwin '-arch arm64' \ -target-link-opt ia64-hpux "-mlp64" \ -target-link-opt linux '-Wl,-znoexecstack' \ -target-link-opt mingw \ '-lws2_32 -lkernel32 -lpsapi -lnetapi32 -lwinmm' \ -target-link-opt mingw '-Wl,--enable-stdcall-fixup' \ -target-link-opt solaris '-lnsl -lsocket -lrt' \ -target-link-opt x86 '-m32' \ -profile-exclude '\$\(SML_LIB\)' \ "$@" mlton-20210117+dfsg/bin/mmake000077500000000000000000000005021416264345000156130ustar00rootroot00000000000000#!/usr/bin/env bash set -e die () { echo "$1" >&2 exit 1 } if gmake -v >/dev/null 2>&1; then make='gmake' elif gnumake -v >/dev/null 2>&1; then make='gnumake' elif make -v 2>&1 | grep -q GNU; then make=`which make` else die 'Can'\''t find GNU make' fi exec "$make" "$@" mlton-20210117+dfsg/bin/patch-mingw000077500000000000000000000004311416264345000167400ustar00rootroot00000000000000#!/usr/bin/env sh set -e dir=`dirname "$0"` for f in `find "$dir" -type f | grep -v '\.svn' | grep -v '~'`; do if head -n 1 "$f" | grep -q '#!/usr/bin/env bash'; then echo "Processing $f" sed 's;#!/usr/bin/env bash;#!/usr/bin/env sh;' <"$f" >.tmp; mv .tmp "$f"; fi done mlton-20210117+dfsg/bin/platform000077500000000000000000000035471416264345000163610ustar00rootroot00000000000000#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac uname=`uname` arch= case "$uname" in AIX) HOST_OS='aix' arch=`/usr/sbin/lsattr -a type -F deflt -l proc0` case $arch in POWER) arch=powerpc64 ;; esac ;; CYGWIN*) HOST_OS='cygwin' ;; Darwin) HOST_OS='darwin' ;; *FreeBSD*) HOST_OS='freebsd' ;; GNU) HOST_OS='hurd' ;; HP-UX) HOST_OS='hpux' ;; Linux) HOST_OS='linux' ;; MINGW*) HOST_OS='mingw' ;; NetBSD*) HOST_OS='netbsd' ;; OpenBSD*) HOST_OS='openbsd' ;; SunOS) HOST_OS='solaris' arch=`isainfo -k` ;; *) die "Unknown OS $uname." ;; esac if [ -z "$arch" ]; then arch=`uname -m` fi case "$arch" in alpha*) # not certain about this one; no alpha access HOST_ARCH=alpha ;; x86_64*) HOST_ARCH=amd64 ;; i?86_64) HOST_ARCH=amd64 ;; amd64) HOST_ARCH=amd64 ;; aarch64) HOST_ARCH=arm64 ;; arm64) HOST_ARCH=arm64 ;; aarch*) HOST_ARCH=arm ;; arm*) HOST_ARCH=arm ;; parisc*) HOST_ARCH=hppa ;; 9000/*) HOST_ARCH=hppa ;; ia64*) HOST_ARCH=ia64 ;; m68k*) HOST_ARCH=m68k ;; mips*) # big-endian and little-endian detect via headers HOST_ARCH=mips ;; powerpc64*) HOST_ARCH=powerpc64 ;; ppc64*) HOST_ARCH=powerpc64 ;; powerpc) HOST_ARCH=powerpc ;; ppc*) HOST_ARCH=powerpc ;; Power*) HOST_ARCH=powerpc ;; riscv*) HOST_ARCH=riscv ;; s390*) HOST_ARCH=s390 ;; sparc*) HOST_ARCH=sparc ;; sun*) HOST_ARCH=sparc ;; i?86*) HOST_ARCH=x86 ;; *) die "Unknown arch $arch." ;; esac echo "HOST_OS=$HOST_OS HOST_ARCH=$HOST_ARCH" mlton-20210117+dfsg/bin/regression000077500000000000000000000202501416264345000167030ustar00rootroot00000000000000#!/usr/bin/env bash # This script runs the regression tests in src/regression. # It also compiles the tests in benchmark/tests # set -e name=`basename "$0"` usage () { echo >&2 "usage: $name [-fail] [-short] [-test-reg reg] [mlton flags ...]" exit 1 } fail='false' short='false' testReg='false' exitFail=false declare -a testRegs declare -a flags declare -a extraFlags flags[${#flags[@]}]="-type-check" flags[${#flags[@]}]="true" while [ "$#" -gt 0 ]; do case "$1" in -fail) fail='true' shift ;; -short) short='true' shift ;; -test-reg) testReg='true' shift if [ "$#" = 0 ]; then usage fi testRegs[${#testRegs[@]}]="$1" shift ;; *) flags[${#flags[@]}]="$1" shift ;; esac done dir=`dirname "$0"` src=`cd "$dir/.." && pwd` bin="$src/build/bin" lib="$src/build/lib/mlton" mlton="$bin/mlton" cont='callcc.sml callcc2.sml callcc3.sml once.sml' flatArray='finalize.sml flat-array.sml flat-array.2.sml' intInf='conv.sml conv2.sml fixed-integer.sml harmonic.sml int-inf.*.sml slow.sml slower.sml smith-normal-form.sml' signal='finalize.sml signals.sml signals2.sml signals3.sml signals4.sml suspend.sml weak.sml' thread='thread0.sml thread1.sml thread2.sml mutex.sml prodcons.sml same-fringe.sml timeout.sml' world='world1.sml world2.sml world3.sml world4.sml world5.sml world6.sml' tmp=/tmp/z.regression.$$ PATH="$bin:$PATH" # whitelist tests that are known to fail (will still run but exit cleanly) declare -A whitelisted if [ -a $src/regression/whitelist ] ; then while read f ; do echo "whitelisting $f..." whitelisted["$f"]=1 done <$src/regression/whitelist fi isWhitelisted () { local f=$1 if [[ ${whitelisted["$f"]} ]] ; then echo 1 else echo 0 fi } compFail () { echo "compilation of $f failed with ${flags[*]}" } "$mlton" -verbose 1 || (echo 'no mlton present' && exitFail=true) echo "flags = ${flags[*]}" TARGET_ARCH=`"$mlton" -show path-map | sed -n 's/TARGET_ARCH \(.*\)/\1/p'` TARGET_OS=`"$mlton" -show path-map | sed -n 's/TARGET_OS \(.*\)/\1/p'` OBJPTR_REP=`"$mlton" -show path-map | sed -n 's/OBJPTR_REP \(.*\)/\1/p'` ALIGN=`echo "${flags[@]}" | sed -n 's/.*-align \(.\).*/\1/p'` if [ -z "$ALIGN" ]; then ALIGN=`"$mlton" -z 2>&1 | sed -n 's/.*-align {\(.\).*/\1/p'` fi cd "$src/regression" if $fail; then for f in fail/*.sml; do echo "testing $f" ( "$mlton" "${flags[@]}" -stop tc "$f" >/dev/null 2>&1 && echo "compilation of $f should have failed but did not" && ignore=$(isWhitelisted $f) && if [ "$ignore" -eq 0 ] ; then exitFail=true ; fi ) || true done if [ "$exitFail" = true ] ; then exit 1 else exit 0 fi fi forMinGW='false' if [ $TARGET_OS = mingw ]; then forMinGW='true' fi for f in *.sml; do f=`basename "$f" .sml` if ($testReg); then skip='true' for (( i = 0 ; $i < ${#testRegs[@]} ; i++ )); do if [ "$f" = "${testRegs[$i]}" ]; then skip='false' fi done if ($skip); then continue fi fi case $TARGET_OS in cygwin) case "$f" in textio.2) continue ;; esac ;; hurd) # Work-around hurd bug (http://bugs.debian.org/551470) case "$f" in mutex|prodcons|signals|signals2|signals3|signals4|suspend|thread2|timeout|world5) continue ;; esac ;; mingw) case "$f" in cmdline|command-line|echo|filesys|posix-exit|signals|signals2|signals3|signals4|socket|suspend|textio.2|unixpath|world*) continue ;; esac ;; esac case "$f" in serialize) continue ;; esac echo "testing $f" unset extraFlags case "$f" in exn-history*) extraFlags[${#extraFlags[@]}]="-const" extraFlags[${#extraFlags[@]}]="Exn.keepHistory true" ;; gc-collect2) extraFlags[${#extraFlags[@]}]="-runtime" extraFlags[${#extraFlags[@]}]="mark-compact-ratio 1.001 copy-ratio 1.001 live-ratio 1.001" ;; world*) extraFlags[${#extraFlags[@]}]="-link-opt" extraFlags[${#extraFlags[@]}]="-no-pie" ;; esac mlb="$f.mlb" echo "\$(SML_LIB)/basis/basis.mlb \$(SML_LIB)/basis/mlton.mlb \$(SML_LIB)/basis/sml-nj.mlb ann \"allowFFI true\" \"allowOverload true\" \"allowExtendedTextConsts true\" \"nonexhaustiveBind ignore\" \"nonexhaustiveMatch ignore\" \"redundantBind ignore\" \"redundantMatch ignore\" in $f.sml end" >"$mlb" "$mlton" "${flags[@]}" "${extraFlags[@]}" -output "$f" "$mlb" if [ "$?" -ne '0' ] || [ ! -x "$f" ]; then compFail "$f" exitFail=true fi rm "$mlb" if [ ! -r "$f".nonterm -a -x "$f" ]; then nonZeroMsg='Nonzero exit status.' if $forMinGW; then nonZeroMsg="$nonZeroMsg"'\r' fi ( "./$f" || echo -e "$nonZeroMsg" ) >$tmp 2>&1 if [ -r "$f.ok" ]; then compare="$f.ok" for x in "$OBJPTR_REP" "${OBJPTR_REP}a$ALIGN" "$TARGET_OS" "$TARGET_ARCH" "$TARGET_ARCH-$TARGET_OS"; do if [ -r "$f.$x.ok" ]; then compare="$f.$x.ok" fi done if $forMinGW; then newcompare="$f.sed.ok" sed $'s/$/\r/' <"$compare" > "$newcompare" compare="$newcompare" fi if ! diff "$compare" "$tmp"; then echo "$f: difference with ${flags[*]} ${extraFlags[*]}" ignore=$(isWhitelisted $f) if [ "$ignore" -eq 0 ] ; then exitFail=true fi fi fi fi done if $short || $testReg ; then if [ "$exitFail" = true ] ; then exit 1 else exit 0 fi fi "$src/bin/mmake" clean >/dev/null cd "$src/benchmark/tests" for f in *.sml; do f=`basename "$f" .sml` tmpf="/tmp/$f.$$" case "$f" in fxp) echo "skipping $f" ;; *) echo "testing $f" echo "val _ = Main.doit 0" | cat "$f.sml" - > "$tmpf.sml" $mlton -output "$tmpf" "${flags[@]}" \ -default-ann 'nonexhaustiveBind ignore'\ -default-ann 'nonexhaustiveMatch ignore'\ -default-ann 'redundantBind ignore' \ -default-ann 'redundantMatch ignore' \ "$tmpf.sml" if [ $? -ne 0 ]; then compFail "$f" exitFail=true fi rm -f "$tmpf" "$tmpf.sml" ;; esac done "$src/bin/mmake" clean >/dev/null cd "$src" for f in mllex mlyacc mlprof; do tmpf="/tmp/$f.$$" cd "$src/$f" echo "testing $f" "$src/bin/mmake" -W "$f" >/dev/null "$mlton" "${flags[@]}" -output "$tmpf" "$f.mlb" if [ $? -ne 0 ]; then compFail "$f" exitFail=true fi rm -f "$tmpf" done rm -f "$tmp" if [ "$exitFail" = true ] ; then exit 1 else exit 0 fi mlton-20210117+dfsg/bin/run-docker000077500000000000000000000003611416264345000165750ustar00rootroot00000000000000#!/bin/bash NAME="mlton-run-docker" # Remove any containers which already have $NAME. docker image rm $NAME # build container, and assign it tag $NAME docker build -t $NAME . # run container with the tag $NAME. docker run --rm -it $NAME mlton-20210117+dfsg/bin/static-library000077500000000000000000000046541416264345000174660ustar00rootroot00000000000000#! /usr/bin/env bash # This script creates a static library (archive). # It is invoked as: static-library TARGET OS OUTPUT objects* libraries* # eg: static-library self mingw foo.a /tmp/obj1.o /tmp/obj2.o /lib/libmlton.a # A safe fallback for unsupported platforms is: # rm -f foo.a # ar rc foo.a /tmp/obj1.o /tmp/obj2.o # ranlib foo.a # However, this script tries to mimic the behaviour of shared libraries as # closely as possible. It links in the required bits of dependent libraries, # links together the given objects, and then hides all non-public symbols. # # The end result of this process is that two MLton produced static libraries # can safely be used at the same time since their symbols don't overlap. It # is even possible to use libraries produced using different versions of the # runtime. set -e target="$1" shift os="$1" shift output="$1" shift if [ "$target" = "self" ]; then target=""; else target="$target-"; fi # Change this to false is partial linking does not work on your platform partialLink='true' rm -f "${output}" if "$partialLink"; then # Localize all but export symbols. Platform dependent. if [ "$os" = "darwin" ]; then "${target}ld" -r -o "$output.o" "$@" # The osx linker already makes hidden symbols local elif [ "$os" = "mingw" -o "$os" = "cygwin" ]; then # Link allowing _address of stdcall function fixups # Preserve the export list (.drectve section) "${target}ld" -r --unique=.drectve --enable-stdcall-fixup -o "$output.o" "$@" # Extract the list of exports to make only them global "${target}dlltool" --output-def "$output.def" "$output.o" grep '@' "$output.def" \ | sed 's/^[[:space:]]*\([^[:space:]]*\).*$/_\1/' \ > "$output.globals" "${target}objcopy" --keep-global-symbols "$output.globals" "$output.o" rm "$output.def" "$output.globals" else "${target}ld" -r -o "$output.o" "$@" # ELF systems are all the same... localize hidden symbols # Be careful not to localize gcc PIC's common section thunks "${target}objdump" -t "$output.o" \ | grep ' \.hidden ' \ | grep -v get_pc_thunk \ | sed 's/^.* \.hidden //' \ > "$output.locals" "${target}objcopy" --localize-symbols "$output.locals" "$output.o" rm "$output.locals" fi # Create the final archive "${target}ar" rc "$output" "$output.o" "${target}ranlib" "$output" rm "$output.o" else "${target}ar" rc "$output" "$@" "${target}ranlib" "$output" fi mlton-20210117+dfsg/bin/static-library.bat000066400000000000000000000000351416264345000202150ustar00rootroot00000000000000@bash %~dp0static-library %* mlton-20210117+dfsg/bin/travis-ci000077500000000000000000000010741416264345000164270ustar00rootroot00000000000000#!/usr/bin/env bash set -e echo mlton echo make -version echo $CC --version echo if [[ "$MLTON_COMPILE_ARGS" == *"llvm"* ]]; then llvm-as -version opt -version llc -version echo fi MLTON_RUNTIME_ARGS="ram-slop 0.90" echo "Building MLton..." make -j4 \ CC="$CC" \ OLD_MLTON_RUNTIME_ARGS="$MLTON_RUNTIME_ARGS" \ MLTON_RUNTIME_ARGS="$MLTON_RUNTIME_ARGS" \ MLTON_COMPILE_ARGS="$MLTON_COMPILE_ARGS" \ WITH_DBG_RUNTIME=false \ all if [ "$REGRESSION" == "true" ]; then echo "Running regression tests..." ./bin/regression $MLTON_COMPILE_ARGS fi mlton-20210117+dfsg/doc/000077500000000000000000000000001416264345000145735ustar00rootroot00000000000000mlton-20210117+dfsg/doc/CHANGELOG.adoc000077700000000000000000000000001416264345000212372../CHANGELOG.adocustar00rootroot00000000000000mlton-20210117+dfsg/doc/README.adoc000077700000000000000000000000001416264345000203532../README.adocustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/000077500000000000000000000000001416264345000164115ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/Makefile000066400000000000000000000005031416264345000200470ustar00rootroot00000000000000## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: %: %.sml mlton $< .PHONY: clean: ../../bin/clean rm -f *.sml mlton-20210117+dfsg/doc/examples/ffi/000077500000000000000000000000001416264345000171555ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/ffi/.gitignore000066400000000000000000000001521416264345000211430ustar00rootroot00000000000000/c_quot.o /export /export.h /ffi-export.o /ffi-import.o /iimport /import /import2 /test_quot /test_quot.h mlton-20210117+dfsg/doc/examples/ffi/Makefile000066400000000000000000000016671416264345000206270ustar00rootroot00000000000000## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton -default-ann 'allowFFI true' .PHONY: all all-win32 all-win32: import import2 export test_quot ./import ./import2 ./export ./test_quot all: all-win32 iimport ./iimport export: export.sml ffi-export.o import: import.sml ffi-import.o import2: import2.sml ffi-import.o test_quot : test_quot.sml c_quot.o ffi-import.o: export.h ffi-export.o: export.h c_quot.o : test_quot.h iimport: iimport.sml $(mlton) \ -target-link-opt linux -ldl \ -target-link-opt solaris -ldl \ iimport.sml %.o: %.c gcc -Wall -c -o $@ $< %.h: %.sml $(mlton) -export-header $@ -stop tc $< %: $(mlton) -output $@ $^ clean: ../../../bin/clean mlton-20210117+dfsg/doc/examples/ffi/c_quot.c000066400000000000000000000003511416264345000206120ustar00rootroot00000000000000#include "test_quot.h" #include PRIVATE Int8 c_quot(Int8 x, Int8 y) { Int8 z = x / y; return z; } PUBLIC void call_sml_quot() { Int8 x = -1; Int8 y = 10; Int8 z = sml_quot(x, y); printf(" sml_z = %i\n", z); } mlton-20210117+dfsg/doc/examples/ffi/export.sml000066400000000000000000000022131416264345000212110ustar00rootroot00000000000000val e = _export "f": (int * real * char -> char) -> unit; val _ = e (fn (i, r, _) => (print (concat ["i = ", Int.toString i, " r = ", Real.toString r, "\n"]) ; #"g")) val g = _import "g" public reentrant: unit -> unit; val _ = g () val _ = g () val e = _export "f2": (Word8.word -> word array) -> unit; val _ = e (fn w => Array.tabulate (10, fn _ => Word.fromLargeWord (Word8.toLargeWord w))) val g2 = _import "g2" public reentrant: unit -> word array; val a = g2 () val _ = print (concat ["0wx", Word.toString (Array.sub (a, 0)), "\n"]) val e = _export "f3": (unit -> unit) -> unit; val _ = e (fn () => print "hello\n"); val g3 = _import "g3" public reentrant: unit -> unit; val _ = g3 () (* This example demonstrates mutual recursion between C and SML. *) val e = _export "f4": (int -> unit) -> unit; val g4 = _import "g4" public reentrant: int -> unit; val _ = e (fn i => if i = 0 then () else g4 (i - 1)) val _ = g4 13 val (_, zzzSet) = _symbol "zzz" alloc: (unit -> int) * (int -> unit); val () = zzzSet 42 val g5 = _import "g5" public: unit -> unit; val _ = g5 () val _ = print "success\n" mlton-20210117+dfsg/doc/examples/ffi/ffi-export.c000066400000000000000000000013531416264345000214060ustar00rootroot00000000000000#include #include "export.h" /* Functions in C are by default PUBLIC symbols */ void g () { Char8 c; fprintf (stderr, "g starting\n"); c = f (13, 17.15, 'a'); fprintf (stderr, "g done char = %c\n", c); } Pointer g2 () { Pointer res; fprintf (stderr, "g2 starting\n"); res = f2 (0xFF); fprintf (stderr, "g2 done\n"); return res; } void g3 () { fprintf (stderr, "g3 starting\n"); f3 (); fprintf (stderr, "g3 done\n"); } void g4 (Int32 i) { fprintf (stderr, "g4 (%d)\n", i); f4 (i); } void g5 () { fprintf (stderr, "g5 ()\n"); fprintf (stderr, "zzz = %i\n", zzz); fprintf (stderr, "g5 done\n"); } mlton-20210117+dfsg/doc/examples/ffi/ffi-import.c000066400000000000000000000007651416264345000214050ustar00rootroot00000000000000#include "export.h" Int32 FFI_INT = 13; Word32 FFI_WORD = 0xFF; Bool FFI_BOOL = 1; Real64 FFI_REAL = 3.14159; Char8 ffi (Pointer a1, Int32 a1len, Pointer a2, Pointer a3, Int32 n) { double *ds = (double*)a1; int *pi = (int*)a2; char *pc = (char*)a3; int i; double sum; sum = 0.0; for (i = 0; i < a1len; ++i) { sum += ds[i]; ds[i] += n; } *pi = (int)sum; *pc = 'c'; return 'c'; } mlton-20210117+dfsg/doc/examples/ffi/iimport.sml000066400000000000000000000067321416264345000213650ustar00rootroot00000000000000signature DYN_LINK = sig type hndl type mode type fptr val dlopen : string * mode -> hndl val dlsym : hndl * string -> fptr val dlclose : hndl -> unit val RTLD_LAZY : mode val RTLD_NOW : mode end structure DynLink :> DYN_LINK = struct type hndl = MLton.Pointer.t type mode = Word32.word type fptr = MLton.Pointer.t (* These symbols come from a system libray, so the default import scope * of external is correct. *) val dlopen = _import "dlopen" : string * mode -> hndl; val dlerror = _import "dlerror": unit -> MLton.Pointer.t; val dlsym = _import "dlsym" : hndl * string -> fptr; val dlclose = _import "dlclose" : hndl -> Int32.int; val RTLD_LAZY = 0wx00001 (* Lazy function call binding. *) val RTLD_NOW = 0wx00002 (* Immediate function call binding. *) val dlerror = fn () => let val addr = dlerror () in if addr = MLton.Pointer.null then NONE else let fun loop (index, cs) = let val w = MLton.Pointer.getWord8 (addr, index) val c = Byte.byteToChar w in if c = #"\000" then SOME (implode (rev cs)) else loop (index + 1, c::cs) end in loop (0, []) end end val dlopen = fn (filename, mode) => let val filename = filename ^ "\000" val hndl = dlopen (filename, mode) in if hndl = MLton.Pointer.null then raise Fail (case dlerror () of NONE => "???" | SOME s => s) else hndl end val dlsym = fn (hndl, symbol) => let val symbol = symbol ^ "\000" val fptr = dlsym (hndl, symbol) in case dlerror () of NONE => fptr | SOME s => raise Fail s end val dlclose = fn hndl => if MLton.Platform.OS.host = MLton.Platform.OS.Darwin then () (* Darwin reports the following error message if you * try to close a dynamic library. * "dynamic libraries cannot be closed" * So, we disable dlclose on Darwin. *) else let val res = dlclose hndl in if res = 0 then () else raise Fail (case dlerror () of NONE => "???" | SOME s => s) end end val dll = let open MLton.Platform.OS in case host of Cygwin => "cygwin1.dll" | Darwin => "libm.dylib" | _ => "libm.so" end val hndl = DynLink.dlopen (dll, DynLink.RTLD_LAZY) local val double_to_double = _import * : DynLink.fptr -> real -> real; val cos_fptr = DynLink.dlsym (hndl, "cos") in val cos = double_to_double cos_fptr end val _ = print (concat [" Math.cos(2.0) = ", Real.toString (Math.cos 2.0), "\n", "libm.so::cos(2.0) = ", Real.toString (cos 2.0), "\n"]) val _ = DynLink.dlclose hndl mlton-20210117+dfsg/doc/examples/ffi/import.sml000066400000000000000000000012131416264345000212010ustar00rootroot00000000000000(* main.sml *) (* Declare ffi to be implemented by calling the C function ffi. *) val ffi = _import "ffi" public: real array * int * int ref * char ref * int -> char; open Array val size = 10 val a = tabulate (size, fn i => real i) val ri = ref 0 val rc = ref #"0" val n = 17 (* Call the C function *) val c = ffi (a, Array.length a, ri, rc, n) (* FFI_INT is declared as public in ffi-import.c *) val (nGet, nSet) = _symbol "FFI_INT" public: (unit -> int) * (int -> unit); val _ = print (concat [Int.toString (nGet ()), "\n"]) val _ = print (if c = #"c" andalso !ri = 45 andalso !rc = c then "success\n" else "fail\n") mlton-20210117+dfsg/doc/examples/ffi/import2.sml000066400000000000000000000052731416264345000212750ustar00rootroot00000000000000(* main.sml *) (* Declare ffi to be implemented by calling the C function ffi. *) val ffi_addr = _address "ffi" public: MLton.Pointer.t; val ffi_schema = _import * : MLton.Pointer.t -> real array * int * int ref * char ref * int -> char; open Array val size = 10 val a = tabulate (size, fn i => real i) val ri = ref 0 val rc = ref #"0" val n = 17 (* Call the C function *) val c = ffi_schema ffi_addr (a, Array.length a, ri, rc, n) val _ = print (if c = #"c" andalso !ri = 45 andalso !rc = c then "success\n" else "fail\n") val n = #1 (_symbol "FFI_INT" public: (unit -> int) * (int -> unit);) () val _ = print (concat [Int.toString n, "\n"]) val w = #1 (_symbol "FFI_WORD" public: (unit -> word) * (word -> unit);) () val _ = print (concat [Word.toString w, "\n"]) val b = #1 (_symbol "FFI_BOOL" public: (unit -> bool) * (bool -> unit);) () val _ = print (concat [Bool.toString b, "\n"]) val r = #1 (_symbol "FFI_REAL" public: (unit -> real) * (real -> unit);) () val _ = print (concat [Real.toString r, "\n"]) signature OPAQUE = sig type t val toString : t -> string end structure OpaqueInt :> OPAQUE = struct type t = Int.int val toString = Int.toString end structure OpaqueWord :> OPAQUE = struct type t = Word.word val toString = Word.toString end structure OpaqueBool :> OPAQUE = struct type t = Bool.bool val toString = Bool.toString end structure OpaqueReal :> OPAQUE = struct type t = Real.real val toString = Real.toString end val (n, _) = _symbol "FFI_INT" public: (unit -> OpaqueInt.t) * (OpaqueInt.t -> unit); val _ = print (concat [OpaqueInt.toString (n ()), "\n"]) val (w, _) = _symbol "FFI_WORD" public: (unit -> OpaqueWord.t) * (OpaqueWord.t -> unit); val _ = print (concat [OpaqueWord.toString (w ()), "\n"]) val (b, _) = _symbol "FFI_BOOL" public: (unit -> OpaqueBool.t) * (OpaqueBool.t -> unit); val _ = print (concat [OpaqueBool.toString (b ()), "\n"]) val (r, _) = _symbol "FFI_REAL" public: (unit -> OpaqueReal.t) * (OpaqueReal.t -> unit); val _ = print (concat [OpaqueReal.toString (r ()), "\n"]) val n_addr = _address "FFI_INT" public: MLton.Pointer.t; val n = MLton.Pointer.getInt32 (n_addr, 0); val _ = print (concat [Int.toString n, "\n"]) val w_addr = _address "FFI_WORD" public: MLton.Pointer.t; val w = MLton.Pointer.getWord32 (w_addr, 0); val _ = print (concat [Word.toString w, "\n"]) val b_addr = _address "FFI_BOOL" public: MLton.Pointer.t; val b = (MLton.Pointer.getInt32 (n_addr, 0)) <> 0 val _ = print (concat [Bool.toString b, "\n"]) val r_addr = _address "FFI_REAL" public: MLton.Pointer.t; val r = MLton.Pointer.getReal64 (r_addr, 0) val _ = print (concat [Real.toString r, "\n"]) mlton-20210117+dfsg/doc/examples/ffi/test_quot.sml000066400000000000000000000016651416264345000217310ustar00rootroot00000000000000(* By default _import is external *) val c_quot = _import "c_quot" private pure: Int8.int * Int8.int -> Int8.int; (* By default _export is public *) val sml_quot = _export "sml_quot": (Int8.int * Int8.int -> Int8.int) -> unit; val _ = sml_quot Int8.quot val call_sml_quot = _import "call_sml_quot" public reentrant: unit -> unit; val x : Int8.int = ~1 val y : Int8.int = 10 val z = Int8.quot (x, y) val c_z = c_quot (x, y) val bad_z = let val x : Int8.int = ~1 val x : Word8.word = 0wxFF val x : Int32.int = Word8.toInt x val y : Int8.int = 10 val y : Word8.word = 0wx0A val y : Int32.int = Word8.toInt y val z : Int32.int = Int32.quot (x, y) val z = Int8.fromInt z in z end val () = print (concat [" bad_z = ", Int8.toString bad_z, "\n", " z = ", Int8.toString z, "\n", " c_z = ", Int8.toString c_z, "\n"]) val () = call_sml_quot () mlton-20210117+dfsg/doc/examples/finalizable/000077500000000000000000000000001416264345000206715ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/finalizable/.gitignore000066400000000000000000000000151416264345000226550ustar00rootroot00000000000000/finalizable mlton-20210117+dfsg/doc/examples/finalizable/Makefile000066400000000000000000000006061416264345000223330ustar00rootroot00000000000000## Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton -default-ann 'allowFFI true' all: $(mlton) finalizable.sml cons.c ./finalizable .PHONY: clean clean: ../../../bin/clean mlton-20210117+dfsg/doc/examples/finalizable/cons.c000066400000000000000000000015621416264345000220030ustar00rootroot00000000000000#include typedef unsigned int uint; typedef struct Cons { struct Cons *next; int value; } *Cons; Cons listCons (int n, Cons c) { Cons res; res = (Cons) malloc (sizeof(*res)); fprintf (stderr, "0x%08x = listCons (%d)\n", (uint)res, n); res->next = c; res->value = n; return res; } Cons listSing (int n) { Cons res; res = (Cons) malloc (sizeof(*res)); fprintf (stderr, "0x%08x = listSing (%d)\n", (uint)res, n); res->next = NULL; res->value = n; return res; } void listFree (Cons p) { fprintf (stderr, "listFree (0x%08x)\n", (uint)p); free (p); } int listSum (Cons c) { int res; fprintf (stderr, "listSum\n"); res = 0; for (; c != NULL; c = c->next) res += c->value; return res; } mlton-20210117+dfsg/doc/examples/finalizable/finalizable.sml000066400000000000000000000047371416264345000237010ustar00rootroot00000000000000signature CLIST = sig type t val cons: int * t -> t val sing: int -> t val sum: t -> int end functor CList (structure F: MLTON_FINALIZABLE structure P: MLTON_POINTER structure Prim: sig val cons: int * P.t -> P.t val free: P.t -> unit val sing: int -> P.t val sum: P.t -> int end): CLIST = struct type t = P.t F.t fun cons (n: int, l: t) = F.withValue (l, fn w' => let val c = F.new (Prim.cons (n, w')) val _ = F.addFinalizer (c, Prim.free) val _ = F.finalizeBefore (c, l) in c end) fun sing n = let val c = F.new (Prim.sing n) val _ = F.addFinalizer (c, Prim.free) in c end fun sum c = F.withValue (c, Prim.sum) end functor Test (structure CList: CLIST structure MLton: sig structure GC: sig val collect: unit -> unit end end) = struct fun f n = if n = 1 then () else let val a = Array.tabulate (n, fn i => i) val _ = Array.sub (a, 0) + Array.sub (a, 1) in f (n - 1) end val l = CList.sing 2 val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val _ = MLton.GC.collect () val _ = f 100 val _ = print (concat ["listSum(l) = ", Int.toString (CList.sum l), "\n"]) val _ = MLton.GC.collect () val _ = f 100 end structure CList = CList (structure F = MLton.Finalizable structure P = MLton.Pointer structure Prim = struct val cons = _import "listCons": int * P.t -> P.t; val free = _import "listFree": P.t -> unit; val sing = _import "listSing": int -> P.t; val sum = _import "listSum": P.t -> int; end) structure S = Test (structure CList = CList structure MLton = MLton) mlton-20210117+dfsg/doc/examples/profiling/000077500000000000000000000000001416264345000204025ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/profiling/.gitignore000066400000000000000000000001371416264345000223730ustar00rootroot00000000000000/mlmon.out /list-rev /list-rev.dot /list-rev.ps /tak /fib-tak /mlmon.fib.out /mlmon.tak.out mlton-20210117+dfsg/doc/examples/profiling/Makefile000066400000000000000000000027551416264345000220530ustar00rootroot00000000000000## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## mlton := mlton mlprof := mlprof ALLOC_EX := list-rev COUNT_EX := tak MULT_EX := fib-tak TIME_EX := tak PATH := ../../../build/bin:$(shell echo $$PATH) .PHONY: all all: profile-time profile-alloc profile-count profile-stack profile-multiple .PHONY: clean clean: ../../../bin/clean .PHONY: profile-alloc profile-alloc: $(mlton) -profile alloc $(ALLOC_EX).sml ./$(ALLOC_EX) $(mlprof) -show-line true $(ALLOC_EX) mlmon.out .PHONY: profile-count profile-count: $(mlton) -profile count $(COUNT_EX).sml ./$(COUNT_EX) $(mlprof) -raw true -show-line true $(COUNT_EX) mlmon.out .PHONE: profile-multiple profile-multiple: $(mlton) -profile time $(MULT_EX).sml ./$(MULT_EX) $(mlprof) $(MULT_EX) mlmon.fib.out $(mlprof) $(MULT_EX) mlmon.tak.out $(mlprof) $(MULT_EX) mlmon.fib.out mlmon.tak.out mlmon.out .PHONY: profile-stack profile-stack: $(mlton) -profile alloc -profile-stack true $(ALLOC_EX).sml ./$(ALLOC_EX) $(mlprof) -call-graph $(ALLOC_EX).dot -show-line true \ $(ALLOC_EX) mlmon.out dot -Tps $(ALLOC_EX).dot >$(ALLOC_EX).ps || true .PHONY: profile-time profile-time: $(mlton) -profile time $(TIME_EX).sml ./$(TIME_EX) $(mlprof) $(TIME_EX) mlmon.out $(mlprof) -raw true $(TIME_EX) mlmon.out $(mlprof) -show-line true $(TIME_EX) mlmon.out mlton-20210117+dfsg/doc/examples/profiling/fib-tak.sml000066400000000000000000000014011416264345000224300ustar00rootroot00000000000000structure Profile = MLton.Profile val fibData = Profile.Data.malloc () val takData = Profile.Data.malloc () fun wrap (f, d) x = Profile.withData (d, fn () => f x) val rec fib = fn 0 => 0 | 1 => 1 | n => fib (n - 1) + fib (n - 2) val fib = wrap (fib, fibData) fun tak (x,y,z) = if not (y < x) then z else tak (tak (x - 1, y, z), tak (y - 1, z, x), tak (z - 1, x, y)) val tak = wrap (tak, takData) val rec f = fn 0 => () | n => (fib 38; f (n-1)) val _ = f 2 val rec g = fn 0 => () | n => (tak (18,12,6); g (n-1)) val _ = g 500 fun done (data, file) = (Profile.Data.write (data, file) ; Profile.Data.free data) val _ = done (fibData, "mlmon.fib.out") val _ = done (takData, "mlmon.tak.out") mlton-20210117+dfsg/doc/examples/profiling/list-rev.sml000066400000000000000000000003461416264345000226670ustar00rootroot00000000000000fun append (l1, l2) = case l1 of [] => l2 | x :: l1 => x :: append (l1, l2) fun rev l = case l of [] => [] | x :: l => append (rev l, [x]) val l = List.tabulate (1000, fn i => i) val _ = 1 + hd (rev l) mlton-20210117+dfsg/doc/examples/profiling/tak.sml000066400000000000000000000012411416264345000216740ustar00rootroot00000000000000structure Tak = struct fun tak1 (x, y, z) = let fun tak2 (x, y, z) = if y >= x then z else tak1 (tak2 (x - 1, y, z), tak2 (y - 1, z, x), tak2 (z - 1, x, y)) in if y >= x then z else tak1 (tak2 (x - 1, y, z), tak2 (y - 1, z, x), tak2 (z - 1, x, y)) end end val rec f = fn 0 => () | ~1 => print "this branch is not taken\n" | n => (Tak.tak1 (18, 12, 6) ; f (n-1)) val _ = f 5000 fun uncalled () = () mlton-20210117+dfsg/doc/examples/save-world/000077500000000000000000000000001416264345000204745ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/save-world/.gitignore000066400000000000000000000000231416264345000224570ustar00rootroot00000000000000/save-world /world mlton-20210117+dfsg/doc/examples/save-world/Makefile000066400000000000000000000010121416264345000221260ustar00rootroot00000000000000## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton all: test .PHONY: test test: world ./save-world @MLton load-world world -- world: save-world ./save-world save-world: save-world.sml $(mlton) save-world.sml .PHONY: clean clean: ../../../bin/clean mlton-20210117+dfsg/doc/examples/save-world/save-world.sml000066400000000000000000000002101416264345000232650ustar00rootroot00000000000000open MLton.World val _ = case save "world" of Original => print "I am the original\n" | Clone => print "I am the clone\n" mlton-20210117+dfsg/doc/examples/size/000077500000000000000000000000001416264345000173635ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/size/size.sml000066400000000000000000000033631416264345000210570ustar00rootroot00000000000000fun 'a printSize (name: string, value: 'a, use: 'a -> unit): unit= (print "The size of " ; print name ; print " is " ; print (IntInf.toString (MLton.size value)) ; print " bytes.\n" ; use value) fun chk (x, y) = if x = y then () else raise Fail "bug" val l = [1, 2, 3, 4] val _ = (printSize ("a char", #"c", fn _ => ()) ; printSize ("an int list of length 4", List.tabulate (4, fn i => i + 1), fn l => chk (foldl (op +) 0 l, 10)) ; printSize ("a string of length 10", CharVector.tabulate (10, fn i => chr (ord #"0" + i)), fn s => chk (CharVector.foldl (fn (c,s) => ord c + s) 0 s, 525)) ; printSize ("an int array of length 10", Array.tabulate (10, fn i => i), fn a => chk (Array.foldl (op +) 0 a, 45)) ; printSize ("a double array of length 10", Array.tabulate (10, real), fn a => chk (Real.floor (Array.foldl (op +) 0.0 a), 45)) ; printSize ("an array of length 10 of 2-ples of ints", Array.tabulate (10, fn i => (i, i + 1)), fn a => chk (Array.foldl (fn ((a,b),s) => a + b + s) 0 a, 100)) ; printSize ("a useless function", fn _ => 13, fn f => ()) ) local open MLton.Cont in val rc: int option t option ref = ref NONE val _ = case callcc (fn k: int option t => (rc := SOME k; throw (k, NONE))) of NONE => () | SOME i => print (concat [Int.toString i, "\n"]) end val _ = printSize ("a continuation option ref", rc, fn rc => case !rc of NONE => () | SOME k => (rc := NONE; MLton.Cont.throw (k, SOME 13))) mlton-20210117+dfsg/doc/examples/thread/000077500000000000000000000000001416264345000176605ustar00rootroot00000000000000mlton-20210117+dfsg/doc/examples/thread/non-preemptive-threads.sml000066400000000000000000000043171416264345000250020ustar00rootroot00000000000000structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open MLton open Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready (t: Thread.Runnable.t) : unit = Queue.enque(threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun run(): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; next())) ; topLevel := NONE) end val rec loop = fn 0 => () | n => (print(concat[Int.toString n, "\n"]) ; Thread.yield() ; loop(n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn (fn () => loop n); loop' (n - 2)) val _ = Thread.spawn (fn () => loop' 10) val _ = Thread.run () val _ = print "success\n" mlton-20210117+dfsg/doc/examples/thread/preemptive-threads.sml000066400000000000000000000050531416264345000242100ustar00rootroot00000000000000structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open Posix.Signal open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready (t: Thread.Runnable.t) : unit = Queue.enque(threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 20))))) ; setItimer Time.zeroTime ; ignore alrm ; topLevel := NONE) end val rec delay = fn 0 => () | n => delay (n - 1) val rec loop = fn 0 => () | n => (delay 500000; loop (n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn (fn () => loop n); loop' (n - 1)) val _ = Thread.spawn (fn () => loop' 10) val _ = Thread.run () val _ = print "success\n" mlton-20210117+dfsg/doc/guide/000077500000000000000000000000001416264345000156705ustar00rootroot00000000000000mlton-20210117+dfsg/doc/guide/.gitignore000066400000000000000000000000551416264345000176600ustar00rootroot00000000000000/localhost/ /mlton-guide.pdf /www.mlton.org/ mlton-20210117+dfsg/doc/guide/Makefile000066400000000000000000000151771416264345000173430ustar00rootroot00000000000000ROOT := ../.. include $(ROOT)/Makefile.config ###################################################################### export LC_ALL = C NULL := ASCIIDOC := asciidoc ifeq (true, $(call HAVE_CMD,$(ASCIIDOC))) ASCIIDOC_CONF_DIR := $(shell $(ASCIIDOC) -v /dev/null 2>&1 | head -n 1 | sed 's|.*reading: \(.*\)/asciidoc.conf|\1|') else ASCIIDOC_CONF_DIR := endif ASCIIDOC_MLTON_FLAGS := $(shell cat conf/asciidoc-mlton.flags | sed 's|^\#.*||' | sed "s|MLTON_VERSION|$(MLTON_VERSION)|") ASCIIDOC_MLTON_DEPS := bin/InclGitFile.py conf/asciidoc-mlton.flags $(shell cat conf/asciidoc-mlton.flags | sed -n 's|^.*\(conf/.*\)$$|\1|p') ASCIIDOC_HTML5_FLAGS := $(ASCIIDOC_MLTON_FLAGS) $(shell cat conf/asciidoc-html5.flags | sed 's|^\#.*||') ASCIIDOC_HTML5_DEPS := $(ASCIIDOC_MLTON_DEPS) conf/asciidoc-html5.flags $(shell cat conf/asciidoc-html5.flags | sed -n 's|^.*\(conf/.*\)$$|\1|p') ASCIIDOC_DOCBOOK45_FLAGS := $(ASCIIDOC_MLTON_FLAGS) $(shell cat conf/asciidoc-docbook45.flags | sed 's|^\#.*||') ASCIIDOC_DOCBOOK45_DEPS := $(ASCIIDOC_MLTON_DEPS) conf/asciidoc-docbook45.flags $(shell cat conf/asciidoc-docbook45.flags | sed -n 's|^.*\(conf/.*\)$$|\1|p') DBLATEX := dblatex GEN_PAGES := Index mlton-guide GEN_ATTACHMENTS := $(foreach size,16 32 64 128 256 512 1024,Logo.attachments/mlton-$(size).png Logo.attachments/mlton-$(size).pdf) SRC_PAGES := $(filter-out $(GEN_PAGES),$(patsubst ./%.adoc,%,$(shell cd src ; find . -type f -name '*.adoc'))) SRC_ATTACHMENTS := $(filter-out $(GEN_ATTACHMENTS),$(patsubst ./%,%,$(foreach dir,$(shell cd src ; find . -type d -name '*.attachments'),$(shell cd src ; find $(dir) -type f ! -name '.gitignore' ! -name '.gitattributes')))) HTML5_XTRA := asciidoc.css asciidoc.js pygments.css mlton.css mlton-gcse.js index.html HTML5_XTRA_PAGES := Index MLTON_ORG_XTRA := $(HTML5_XTRA) MLTON_ORG_XTRA_PAGES := $(HTML5_XTRA_PAGES) MLTON_ORG_XTRA_ATTACHMENTS := $(foreach size,16 32 64 128 256 512 1024,Logo.attachments/mlton-$(size).png) MLTON_ORG := $(addprefix www.mlton.org/, $(SRC_PAGES) $(SRC_ATTACHMENTS) $(MLTON_ORG_XTRA) $(MLTON_ORG_XTRA_PAGES) $(MLTON_ORG_XTRA_ATTACHMENTS)) MLTON_ORG_TORM := $(filter-out $(MLTON_ORG),$(shell if [ -d www.mlton.org ]; then find www.mlton.org -type f; fi)) LOCALHOST_XTRA := $(filter-out mlton-gcse.js,$(HTML5_XTRA)) LOCALHOST_XTRA_PAGES := $(HTML5_XTRA_PAGES) LOCALHOST_XTRA_ATTACHMENTS := $(foreach size,16 32 64 128 256 512 1024,Logo.attachments/mlton-$(size).png) LOCALHOST := $(addprefix localhost/, $(SRC_PAGES) $(SRC_ATTACHMENTS) $(LOCALHOST_XTRA) $(LOCALHOST_XTRA_PAGES) $(LOCALHOST_XTRA_ATTACHMENTS)) LOCALHOST_TORM := $(filter-out $(LOCALHOST),$(shell if [ -d localhost ]; then find localhost -type f; fi)) ALL := ifeq (true, $(call HAVE_CMD,$(ASCIIDOC))) ifeq (true, $(call HAVE_CMD,pygmentize)) ALL += $(LOCALHOST) localhost-rm endif endif all: $(ALL) ifeq (true, $(call HAVE_CMD,gm)) CONVERT := gm convert else ifeq (true, $(call HAVE_CMD,convert)) CONVERT := convert else CONVERT := no-convert endif endif %-16.png : %.svg $(CONVERT) $< -resize 16x16 $@ %-32.png : %.svg $(CONVERT) $< -resize 32x32 $@ %-64.png : %.svg $(CONVERT) $< -resize 64x64 $@ %-128.png : %.svg $(CONVERT) $< -resize 128x128 $@ %-256.png : %.svg $(CONVERT) $< -resize 256x256 $@ %-512.png : %.svg $(CONVERT) $< -resize 512x512 $@ %-1024.png : %.svg $(CONVERT) $< -resize 1024x1024 $@ %-16.pdf : %.svg $(CONVERT) $< -resize 16x16 $@ %-32.pdf : %.svg $(CONVERT) $< -resize 32x32 $@ %-64.pdf : %.svg $(CONVERT) $< -resize 64x64 $@ %-128.pdf : %.svg $(CONVERT) $< -resize 128x128 $@ %-256.pdf : %.svg $(CONVERT) $< -resize 256x256 $@ %-512.pdf : %.svg $(CONVERT) $< -resize 512x512 $@ %-1024.pdf : %.svg $(CONVERT) $< -resize 1024x1024 $@ conf/specialsections.conf : $(ASCIIDOC_CONF_DIR)/lang-en.conf bin/mk-specialsections-conf.sh ./bin/mk-specialsections-conf.sh $< $@ conf/html5-header.conf : $(ASCIIDOC_CONF_DIR)/html5.conf bin/mk-html5-header-conf.sh ./bin/mk-html5-header-conf.sh $< $@ conf/html5-footer.conf : $(ASCIIDOC_CONF_DIR)/html5.conf bin/mk-html5-footer-conf.sh ./bin/mk-html5-footer-conf.sh $< $@ src/Index.adoc : bin/mk-index.sh $(foreach page,$(SRC_PAGES),src/$(page).adoc) ./bin/mk-index.sh $(SRC_PAGES) > $@ src/mlton-guide.adoc : bin/mk-mlton-guide.sh $(foreach page,$(SRC_PAGES),src/$(page).adoc) ./bin/mk-mlton-guide.sh $(SRC_PAGES) > $@ $(ASCIIDOC_CONF_DIR)/stylesheets/asciidoc.css: ; %/asciidoc.css : $(ASCIIDOC_CONF_DIR)/stylesheets/asciidoc.css mkdir -p $(dir $@) ; cp $< $@ $(ASCIIDOC_CONF_DIR)/javascripts/asciidoc.js: ; %/asciidoc.js : $(ASCIIDOC_CONF_DIR)/javascripts/asciidoc.js mkdir -p $(dir $@) ; cp $< $@ $(ASCIIDOC_CONF_DIR)/stylesheets/pygments.css: ; %/pygments.css : $(ASCIIDOC_CONF_DIR)/stylesheets/pygments.css mkdir -p $(dir $@) ; cp $< $@ conf/mlton.css: ; %/mlton.css : conf/mlton.css mkdir -p $(dir $@) ; cp $< $@ conf/mlton-gcse.js: ; %/mlton-gcse.js : conf/mlton-gcse.js mkdir -p $(dir $@) ; cp $< $@ %/index.html : %/Home rm -f $@ ; mkdir -p $(dir $@) ; ln -s Home $@ ; touch $@ www.mlton.org/% : src/%.adoc $(ASCIIDOC_HTML5_DEPS) bin/mk-git-attribute-entity-flags.sh mkdir -p $(dir $@) ; $(ASCIIDOC) $(ASCIIDOC_HTML5_FLAGS) $(shell ./bin/mk-git-attribute-entity-flags.sh $<) -a mlton-guide-host=www.mlton.org -a mlton-guide-page=$(basename $(notdir $<)) -o $@ $< www.mlton.org/% : src/% mkdir -p $(dir $@) ; cp -prf $< $@ .PHONY: www.mlton.org-rm www.mlton.org-rm: $(MLTON_ORG) @rm -rf $(MLTON_ORG_TORM) .PHONY: www.mlton.org www.mlton.org: $(MLTON_ORG) .PHONY: upload_www.mlton.org upload_www.mlton.org: $(MLTON_ORG) www.mlton.org-rm rsync -avzP --delete -e ssh www.mlton.org/ fluet,mlton@web.sourceforge.net:htdocs/wiki localhost/% : src/%.adoc $(ASCIIDOC_HTML5_DEPS) mkdir -p $(dir $@) ; $(ASCIIDOC) $(ASCIIDOC_HTML5_FLAGS) -a mlton-guide-host=localhost -a mlton-guide-page=$(basename $(notdir $<)) -o $@ $< localhost/% : src/% mkdir -p $(dir $@) ; cp -prf $< $@ .PHONY: localhost-rm localhost-rm: $(LOCALHOST) @rm -rf $(LOCALHOST_TORM) .PHONY: localhost localhost: $(LOCALHOST) localhost-rm src/mlton-guide.xml : src/mlton-guide.adoc conf/asciidoc-docbook45.flags $(ASCIIDOC_DOCBOOK45_DEPS) mkdir -p $(dir $@) ; $(ASCIIDOC) $(ASCIIDOC_DOCBOOK45_FLAGS) -o $@ $< @true || xmllint --nonet --noout --valid $@ || true mlton-guide.pdf : src/mlton-guide.xml src/Logo.attachments/mlton-128.pdf conf/mlton-dblatex.xsl conf/mlton-dblatex.sty $(DBLATEX) -t pdf -p conf/mlton-dblatex.xsl -s conf/mlton-dblatex.sty -o $@ $< .PHONY: check-git-links check-git-links: @./bin/check-git-links.sh $(SRC_PAGES) ###### SHOW_VARS += ASCIIDOC_CONF_DIR ASCIIDOC_HTML5_FLAGS ASCIIDOC_HTML5_DEPS SHOW_VARS += GEN_PAGES GEN_ATTACHMENTS SRC_PAGES SRC_ATTACHMENTS $(eval $(MK_SHOW_CONFIG)) .PHONY: clean clean: ../../bin/clean mlton-20210117+dfsg/doc/guide/bin/000077500000000000000000000000001416264345000164405ustar00rootroot00000000000000mlton-20210117+dfsg/doc/guide/bin/InclGitFile.py000077500000000000000000000014041416264345000211450ustar00rootroot00000000000000#!/usr/bin/env python3 import sys import urllib.request import re i = 1 repo = sys.argv[i] i += 1 branch = sys.argv[i] i += 1 src = sys.argv[i] i += 1 url = 'https://raw.github.com/MLton/' + repo + '/' + branch + '/' + src response = urllib.request.urlopen(url) buff = response.readlines() if len(sys.argv) > i: newbuff = [] while len(sys.argv) > i: lines = sys.argv[i] match = re.compile(r"^\s*(?P-?[0-9]+)?:(?P-?[0-9]+)?\s*$").match(lines) start = match.group('start') if start: start = int(start) end = match.group('end') if end: end = int(end) newbuff.extend(buff[start:end]) i += 1 buff = newbuff sys.stdout.buffer.writelines(buff) sys.stdout.flush() mlton-20210117+dfsg/doc/guide/bin/check-git-links.sh000077500000000000000000000037001416264345000217530ustar00rootroot00000000000000#!/bin/sh dir=$(dirname "$0") root=$(cd "$dir/../../.." && pwd) pages=$(echo $@ | sort -f) for page in ${pages}; do for vgd in $(cat src/${page}.adoc | sed -E -n 's|.*().*|\1|p'); do rev=$(echo "$vgd" | sed -E -n 's||\1|p') path=$(echo "$vgd" | sed -E -n 's||\2|p') if (cd ${root}; git ls-tree ${rev} ${path} | grep -E -q '^[0-9]+[[:space:]]tree[[:space:]][0-9a-f]+[[:space:]]'${path}'$'); then : else echo "*** ${page}: ${vgd}" fi done for vgf in $(cat src/${page}.adoc | sed -E -n 's|.*().*|\1|p'); do rev=$(echo "$vgf" | sed -E -n 's||\1|p') path=$(echo "$vgf" | sed -E -n 's||\2|p') if (cd ${root}; git ls-tree ${rev} ${path} | grep -E -q '^[0-9]+[[:space:]]blob[[:space:]][0-9a-f]+[[:space:]]'${path}'$'); then : else echo "*** ${page}: ${vgf}" fi done for rgf in $(cat src/${page}.adoc | sed -E -n 's|.*().*|\1|p'); do rev=$(echo "$rgf" | sed -E -n 's||\1|p') path=$(echo "$rgf" | sed -E -n 's||\2|p') if (cd ${root}; git ls-tree ${rev} ${path} | grep -E -q '^[0-9]+[[:space:]]blob[[:space:]][0-9a-f]+[[:space:]]'${path}'$'); then : else echo "*** ${page}: ${rgf}" fi done done mlton-20210117+dfsg/doc/guide/bin/mk-git-attribute-entity-flags.sh000077500000000000000000000002761416264345000246010ustar00rootroot00000000000000#!/bin/sh if [ -n "$(which git)" ]; then git log -n 1 --format="-a git-commit-hash='%H' -a git-author-date='%ad' -a git-author-email='%ae' -a git-author-name='%an'" "$1" 2>/dev/null fi mlton-20210117+dfsg/doc/guide/bin/mk-html5-footer-conf.sh000077500000000000000000000004211416264345000226510ustar00rootroot00000000000000#!/bin/sh prefix="$2" csplit -f ${prefix} -n 2 -s $1 '%\[footer\]%' '/

mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/fragments/header.in000066400000000000000000000041301416264345000254120ustar00rootroot00000000000000 @AUTHOR@@KEYWORDS@ @TITLE@
mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/fragments/shim.in000066400000000000000000000000731416264345000251240ustar00rootroot00000000000000
mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/images/000077500000000000000000000000001416264345000231135ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/images/smlnj-logo.png000066400000000000000000001624701416264345000257140ustar00rootroot00000000000000‰PNG  IHDRím¬¼ÇsRGB®Îé pHYsÂÂnÐu> iTXtXML:com.adobe.xmp 2 5 1 2 †Ò®$@IDATxì€%E¹¶¿>3Èia ,› ‚ ˆ Á€ TÌ `Ž(?†‹WÅk@%#‚ˆ ¯¢`¸ ÊU¼‚‚ˆÈF2,`I»3SÿûÕéš=3;³;á„î>OAî®®®úêéÙÓ]ïùªÊŒ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @(¬döb. @€ Ðe‚Y¯ÍµM­_±G1³Í¬¦m° µ¿ ØúÚ®/,7È÷7Ðþt噦ã©Ú_CÜ÷ôšÒU|C Ç™­Ô™ÇV‹!¦=ªôFŒ™Òì:wŸâ½¾ÍǼÚ%@ Úª}i @€ I l.A`CÛR]ú-ÕÕ¯GßÏbÚVÚΔá›é¼‹ ²ã1ª.L¸èpŸÚ³\Û;$DÜ®ýz\©ícv{v—=<žbÉ ¢@d(ÚÁ@€ ”œ€\¦ØlÛFŸÛI$ØN"¶qkÚÏòýÌ6*y3[eþßÄj‰ _¤í"ñZ$Ž…~œ-µµªRÊ…@³ 24‹$å@€ @ ‹„–°‰1XCÌòý !!ÓÀBs „8üâFú' ’xsƒýÛþŒ÷Cs1SÚä 2LŽWC€ @ ²ä‘P³òI¶“DƒÇ©¡;)>NÇóu¼Ee^¦† º°èùàÂÃ5Š¿“¿Ã5Ùýö`™š­Õ!€ÈP{IK @€ 0!z$%Ì×ôŠ»JVØE…Ô…º˜0}B…rQçÔ…‡›dÀï$ýNÓW^mËìuþ†NrÙ9 ©¹Â*|si @€†;hBÅ)l7u@wÕùݯ}Ąᰪuüw5çW’~i}v¢Cµnn‘ZƒÈP¤»-€ @h"0[þ SlOu,÷”ˆðD½‡¶ sh"ãåL^©øs N?Ò¤’·•¸-˜^ ˆ º˜@€ ‰sm^2 &A¡.*l:Ñò¸®Ëû³ZücÅi=‹ß¨£Ø×ehn“ 24 $Å@€ @ ]ÂvZ×aŠí#!aÍ¡ðdÕ»·"‚B»n@Õë öOýmýD^ß¶GìÇÙú$@`ŒÆŠl€ @èÍÔ׫…!ŸÐ (ì£ÎŸ¯îÀ»|'nH÷Õùšü#ýÍ} Á¡ûnþDZÌÓD¨q  @€ZD lnëËOÁ½ž–Gß_¯EÕQ,ÆCÀ‡K­ß¾¦E3ªÎdÿx.&ow@dèŽûL+!@€ J ®öЛ ™=]¿ï.…ž‚š‹YHîÒÎùZó¼l™ÝœÙB‘¿@€ ´‘@jöLÍ¥°¿Ä„ýUõ‚6VOUhßh…Šsìa»(»KŸ„®&€ÈÐÕ·ŸÆC€ ´š@ØÚfغ¹¨¢°°S«ë¤|tˆÀ?ä‰s¶­°/g·Ú²Ù@µ&€ÈÐá@õ€ @Õ"çTØØöS«ž=‚í¢-ïÝպʹfM‚ü2û¡Áüb¶ÔþgMY9W=|ÙUïžÒ"@€ 6Ðê5 xØK¿à>GÕº°°¯¶SÚhUA ¸‚ýYÆl‹ìbu>™(²¸wªi–!24 %A€ t 0ÛfÛT .,dö,µ{“ni;í„À„­Gì“¶ØÎW'tÅ„Êà¢R@d(ÅmÂH@€ N·ÂT›£•zí²Ããã:iuC ´‚Ý!ÛO±GìÌì}*G‘¡r·”A€ 4ƒ@˜kÛj!Éç«,Ü[aýf”K€@$àK`žh íuJFQ¡? D† ÝLš@€ 0qòVèÑÜ OQ /Ttaa׉—Æ•€À üUùNÈÚ%cÌO¶‚@d(ø Â<@€ Ö3m=ÛÐT kn…i»Yëj£d@`TÁ®Ö¿Á÷Kløõ¨y8Q ˆ ¥¸M @€ Ð,a[ÛÚ¦ÛA*ï`Åg©c3­YeS 0IÁ.²Gí}ÙíæÃ)%$€ÈP›†É€ @ã#æÙã%&ªx°f¸ßK[ރLJÜh'UÙG5_Ãçõµ¯S×ä ðå:y†”@€ P@ž(³^j5E³ h"&Ak"ìF‰‚oËÛkÊÆ¹b@d(ÖýÀ@€ Ðę͵}5}£‹ ‡*Ξ`Q\‹ÀY6`ï•Øð@±Ìš‘ 2ŒD…4@€ Rˆ+B̵ýraá½U) ÇH@`|‚Ý.¯†£$4üt|’»ÝÚMœú @€&E z,,°§©W¨Óñ2ù/ÌœT\ ”‡À€iÿ”WÃýæó6 H‘¡€7“ @€V' 9ž,Aá:órm·Y=)€@Wv›õÛk²¥vUW´·dDd(Ù Ã\@€ ÐMÂ\ÛS7¾B¢Âaj÷öÝÔvÚ:Œ@Іf÷+þS>6hÈköÎ=ª1ü(ŸÇGÕ!}$¦ùñ€­´^¥¬TìÉ·S´‚çêÕÙ]ѧ3Óô×7%æªï÷(G°u”6]çÖ‰û¦ýZ¾ŸÙJÛHum¨4ßn”o¤R7Ññæ:ÞXûôÃcR!è~eö­@q²`ÊÁ‰PüqåN` @€@$ aaž:¯Éã|°T”@ˆÀ=êÞ£Öc}ÿ>ÿMø¿©{_ß>bË«@B½á)’ËfH„Ø\{[¨ý.<øŸYJ›·¾o¶µâEšÍÑ0`¯Ë–ؽkÊÆ¹ö@dhkj‚ @…€„…-ÔÁò¡..ì3J6’ËCàï2Õ'ê»=n3mòý~ ™Ý“-µ•§9í·4Î=2[âCͶ•ÿÄ\±œ++<ºçÇ[iK®~kî‘_ë%4ü²ýwЇàr8Ž!@€ÚB Ì´õä\þu¢^« Ÿ­ØÛ–Š©dòB–ª ËÔá­ï÷Û-ö˜Ý^¯ƒÉƒj] a–†hL‚ÃãõohgÕ´³$‡Çk;O±ûþ-ùð Ó„‹ìóÚ:H‘¡ƒð©€ tý:[Sè9ê ½^ñÅjÿzÝÆ 4í šûÀ4â=S v³¢o—HDX–Ýaî©@( ý›jslGýKÛMqOݳ'ÊÌ=t7, ¹­0élý¥¾EÝ­(œ2×N‘aíŒÈ@€ 0Ia¾í¤NÎTÌë}¬9¡‚1˜¼ÌnT¼) $,0Æ]D*$¡82[hç7 EB‘a0$C€ ŒL ÌÕÄq5;Jg}¾…FÎEê$ <¨ëÿO¹«%(\ã‚&±»c’er9šB@^S4‘ä3ä×ðbým¾L…nÕ”‚[YˆÏKì=úwô_­¬†²™“¿@€ 1ˆ“8N·×è%ݽvÃ%d+ú 7‰« WGaa‰ýE¿úÊš€_–öúû}… }©¶ÅžjW°âC÷ý Ðâ±ûÀTÍßàÞ ïÐÿ¾ñùPì¥ÙûþØZ@®±@d %ò@€ Šsl¾f†‹šu¸:Ǭ1žûlq$*Ô$*,Ôp 0.a¾í£ Þ¡K>wÔq]ÜÌÌÁ‘Hx€<®nf±Ý\"C7ß}Ú@€@WЯˆ5I /P£ß¦ø\½Üó.8–¿€`÷‰Ô/ô‹çÏ5QãϲevëX.# °va{-9ÕÞ£cîMµþÚ¯hIŽûõo{_y4,nIé]V(–.»á4€ î#—Ÿœ¦¥'5Ñ™^äçtq¶8ØÃºÂ'jü™âÏ5âz½4ûDq@ EÂ,ÛTë×¼=J±i‹ª½X÷P öy4Ü7z&ÎŒ…"ÃX(‘€ ”€Ü‘w—¨ð6½8ûrrë”° í4ùzUv¹~Íü‰XýFÇÚY9uAuqUŠM´²M°ãôo±½“D-)»Èž©Nò îÇÄ 2LœWB€ ÂÐÏí=šXíýø.W¬eãŠEë2çgêÈ\®îÄåZâîb™‡5èna¦V¸Ù0~¹ØÐ¾yc‚®¥-}èa‚&ŽË @€@‘„Ù¶±¦N;J6½]/äÛɶBØâ³Ègvm‚]&ÇèÿÓ‹p!lÃ@`TqÅ:v¼2¼Mÿ†Ûã‘5`GÊ›éœQâÄ 2¬'!@€@± h•ˆÖ—ƒ{£,]¯ØÖ¶Ýº%*üTµ^*‰áÇšÔíÞ¶[@…€@S„¶þ=\…½AbCkû±AÃ¥úíiÙR»¦)ÆwY!­½9]“æB€ vÐ ÷³õÂíC"^Ðòîv5ªõ[ªb.q‘]©—]ÆV7ƒ+e@  ôÝ··¾û¾¨ï½½[jR°Ûì!Û3»Ëîoi=,‘¡‚7•&A€ PM1]^ ¯ÕËõ»w®f+ÇÙ*aö¿Š?T¼Tc©og d‡JF@sÏdZŽ÷2ûdíµrrÈ˲…qÙß’ꬹˆ åOí€ @`­Â6¶™­koQF“¼ÅZ/¨z†`ª‰>iã÷µý!KÎUý†Ó>ŒL ÌÓÔ5û„¾ Þ¢ïÆÖômƒ½SâåF¶€Ô‘´æFŒTi€ @ã" è¹z~^ ß¨×çuÇuqõ2ûj?ŠÂÂZ b¹™ €D ÌÕJ:=v¶vwl:ŸŸ¡ÏöΖٟš^vE Dd¨è¥Y€ ”—€Ä…}%*¼O-x‰¶µò¶d’–»S¢Â%ñ}Í´àó+ôM²D.‡*J@ß›ÓÔ´ÿÐ7æqÚö6¹™7ØBÛKßAÌñ2°ˆ c€D@€ Ðjc\“ßÂÁú5ÎÅ…§¶º¾—«lû®„…ïh™É«õ²*4@c# ±a‰³_Wlî¼5ZÙBÃ&><6+º;"CwßZ@€@‡ Ä_ßjözu¥ÓKñü›Ó™êë+B|GKÆ}GKÆý¾3FP+ Pa–­£fŸQ{|.›f…>‰Ÿûh˜?4«Àª–ƒÈPÕ;K» @(40Ã6°MìX ï–¡[ÚØÖ·0z+˜„…ÅöÇÖTA©€@7ˆ{°|Ä|®†Mâp}>l‚¡[kŠÈ°8œ‚ @Í&  ʶ°ðNEŸ }ãf—_ðòn•ÇÆÅù5°àw ó Pa{‰¸Óì5ç€&5é}ZÖò³M*«’Å 2Tò¶Ò(@€ŠF ̶Ù6Uó-;BâÂ:E³¯…öÜ­6[ñ›Ì±ÐBÊ ŒJ@»ôh0ÚÉúîõI!'þ-/¬$”Þ1Ù‚ªz="CUï,í‚ @ ÂÛU¯·ÐËí+dP³g©Ï÷¯vrl wÙ ›+±õѱeïŽ\ˆ ÝqŸi% @M$¿˜ª"?¨—Ó=šXtÑŠzH >ãy¶Ä®Ð‹£šN€ P-šÒ—þ¢bm-cIËaІဠŒF Š óìezýÅGËWêô…„+Õ†¯Ù?í;̳P껉ñ€À Hhx¾×¿¦Ø3ÆKR¶ûíï6'»ßL ݾEdèö¿Ú@€ÀZ 4ˆ Ñ è.k½ Œ‚-•¼ð5 ‡8_®¿·”± Ø @`2$4&_† UÆø–öa-iùñÉÔ]¥kªt7i  @M%‹ /•°àž Õ‚=¢v}GâÂYš%ý×z1d8DSÿ‚( (-qùù2\,»§ŽÃö¿i…í³åöÐ8®©lVD†ÊÞZ@€ÀD Dqa¾Å³]'ZN¯»FrÂÙZ€ò¢l©^ € 0H Nè›i‰K³)ƒ‰kÛ°÷j¥‰S×–­Î#2tÃ]¦€ Œ‰@..’‹ »é¢òdú»„… Õ¶³³…v}yÌÆR@í'‡Ndv‘¾3Ç:ä]š(wŽ„†ÇÚom±jDd(ÖýÀ@€:D@/”éUòcªþ 2¡ùÕú$Ž™ýBŸ¥—ßKxùm>bJ„ªK@ Çê;ô+cna°Ã57ÃycÎ_ÑŒˆ ½±4 € ± ìÙꊟ¤ɽÇvE r»Wí9W–ž!¯…¥%°!’€„_ªx¬“:^¯ïÜÝ Ù6…ÈÐFØT@€@q„9ö4Mîõq½<îW«&aIÝká—òX8ÝËkÁlå$JãR@È Hhø/=+Þ9& ¶¿¼Æ®SÞŠfBd¨è¥Y€ ŒL@âÂ^ZœÌ‡E ßW<­Û'+ñ=Ät@ ‚$4¼OϘSÖØ´~; [b¿\cžŠžDd¨è¥Y€ n# Ï…éò\x«Ú}‚â¦%nÿ=²ý Z íηÓ!T’€&‚Ì4ä¥ú|Á¨ v®†´uå° D†Qÿ*8@€@èe¯ÇæÙô²w¢â¶e°yDƒýŸÒ?¯õ!¾­4–Ÿ‰€ŠA lc›Ùºvž;³F´(Øöˆm™Ý¡Ï. LüØe7œæB€ªD ,ÐJóíMêxvI†•q‘Fíî«_¼öQüC•þBi  PUÙö7=w^­ïðþÛ˜Ù†ò¯;hÄsODd¨ø ¦y€ *Ðr”OÕ˜Øß¨mßÓKÞN¥kc°ûôbúqý¾5[«5çÂÕ¥kCèrÒök!øÄ¨jö²QÏUøÃ%*|si @ j4©ã Ž8Y¡¥l[k­Ù$0|ƒ¥'Ky1€À²7UO¦k”¸ëõƒ‡ìaÛ¼Û†LôŽ‚$@€ P(ažm®!ÿ!£ŽQ,×ûKˆK˜]*»?+¯…_ ,Æ@€À¤èWû¡ß—îißOëiÞ†ç)ý’IUR²‹.Q²†¹€ n"fÙ:ñA KÔn_9bø \qqý~eöeÖ}œÄ…#0÷Va ÉÐR•×JNþôˆe ØKFL¯p"Ã%*|si @ ¬ä~ZÓŠoÔ°ˆÿTܦdí¸[ö~IÃWå"û÷’ÙŽ¹€ 0qØÄ|û£žYr¹ÏÁ³H«LXôjrªªˆ U½³´ € PRq $†SdþHã[‹Üª?ɸSm¡]äî³E6Û @ ù4oгäo÷óJÞG“Dú2Å].Ñ·™FB€ŠO@âÂãµ$åe.—µeÜÞçèò Š_C`(þßBhl©ý&öiþ…¶¢¾¢–‰'CQï vA€º„@ØÚfØúöQ½˜#7Óž’4»Oö^l}öél™¹€ `a{ÛAëMܤçÙ´AÁ®Ö¼<ûW|‘¡â7˜æA€ŠJ ¿úÙ÷!½ŒmTT;‡ÙõÄ…³4™ã©úÅê¶aç8„ ˜<óN’WÞ (ú4CϦÙýö`CZew*{ki @ ¸´bÄ¡²îÓæ×ÊË|â.³/Ú#v“96pa€V#fÚz’ÎêÄÖ '_¨!u?n8®ì.s2TöÖÒ0@€@ñ„¹¶§†+%.|·CÐÒ™ö‰ ÛËÕõc Åû›Â"@E#-7÷zûØ»ì€!Ç>À“¡Â7—¦A€ŠB@cT·ÒÕ“eÏë%.”áýãz‰ Ÿ°Åö]Û_ŽØ@å  \¬'Þ¶Ñâ`ÿ'±zŸrX?9+ñd˜?®† @` ü%KcS? é¯êEë %~£_Ÿ^$—ÖݳÅö-†5Ü\NA€À¨ôüX¡ç‰‹ëõÙa¶MO‡UÞ–á—„*ó§m€ ʸpD…S羑Á~ª—ÁOHX¸²ð¶b  ”‚@îͰDÏÁYÑà>{º& ¾ªÆOÂH<&K!@X€~©yœæ]¸\3kÿ ÐC¬ì{ ±—\XD`Xý^’@'°š7COw,c‰È0ñ¿®„ @ @˜c…ò\˜j’¸p`é¢íöi¾…óeÔÎ^š-±k‹f ö@€@eœ­–Ü[“Ù^•iÕ‚Ȱ8œ‚ @`íäZÓЈ£¬Ç)÷»§¬ýªŽäX)qáL{ÌÈká nêˆT @]C@Ï›Çôìùjlp°=º¡áÌÉÐ w™6B€ZD@KR>EÃ"¾(Ï…'¶¨ŠÉô‚gvކE|Rcao›|”@; #ÜR^~·iˆ^¯ýÃ6Êî·Ç~uùrâÉP¾{†Å€ ޏ°…æ]8WÃU…‚=ª:@æÊká- ÿ³Á@]I »EÃ%‚}[Ï£Ì6µÝ«‘¡êw˜öA€šH@C#z$.¼]â‚/IùÆøÂÔÄò›RT°‡UÎçl¥í qáZŽòΦ”K!€ ‰ö¥xé€í2Ñ"Êr]oY ÅN@€:K@;>MŽž§ÉŠÝ:kɨµÿ[¿}Yc_?«Éï5' @m& ¹~«É‘}¢áÇ·¹ê¶W‡ÈÐväT@(°ƒÍÔTާÈê×ÒòºçÂiö}:»Ëî/¤@š|¸f‡U?VýÓ>@€À hhD¯Í³·iHÄG7œ`1­»,Ø#²ë«ñ©l™-o]E” @˜<°mbÓíÆ7{ò¥·<Š{o° € Ð1šwáêÀûøÑ];fÄh×W‹8ÝVhµˆ[íîѲ‘@(ì6û‡ž¯3m½l¹üï**zci @`"ÂÖ6ÃÖÓПԱxa…L:K¶}‚É‹ws°€ÆDà=gç(ç cÊ]ÂLˆ %¼i˜ @h6 È44âHý”ÊÞ´ÙåO²¼•šÐñMèx’&t¼}’eq9 @ s‚ýÈzlŸÎÐú𙓡õŒ©€ PhšØq7;ðUÉ ûÊÐ Y!ØšsáD ‹XV(Û0€ 0Aažm¨Õ&˜àå…¿ ‘¡ð·!@­!6·õm#;QÞ ïT Åñn ’̾§Ïè%ì/­i=¥B€ Ð ˆ ­ J™€ ‚ÐÄS‡ÊÄÏË{aV¡L öù/|PÃ"|-q @%#Pœ_-Js!@e$¶·lªVÈì³ÿ*ÙsB¶È~]0»0€ qÀ“a°È @(+?èµùöÙ¢†u ÓŽ`ç‡ä¹pYalÂ@€&L‘aÂ踀 Paí-KÏTÜ­0[¤9>h‹í;zñ9€ T€"Cn"M€ ŒD ̰ l;IçÞ*ï…ÚHy:v$…Jb8K/!}¨Ÿ*!@h!D†Â¥h@€@§hy¬KXð¹Š1±cˆKu¢ÏÏeËí¡Nq¡^@€ZK‘¡µ|)€ ÐVa[ÛÚ¦Û%.øêÁ“_‘¬pRv—Ýßyƒ°€ V`u‰VÒ¥l@€@›hRƒšÍ³c%.œ¬¸a›ª½š é3»P">œ-³[GÏÈ@€ªD‘¡Jw“¶@€@WÐЈա?Sqß‚¸LâÂñþT{0€ 6`¸D›@S  @ Ùä½0EÞ 'ȇá•=µÙ廼`×Iè8.[h?÷µ\@€@%àÉP‰ÛH# @ ÛÄe)ƒ­Ný.o{°;dLJ´bÄ×õëÅ@ÇíÁ@€:F‘¡cè©€ 0~ak[×Ö·iÈw©cßée)T >ihň;ôI€ @ ë 0\¢ëÿ@e!æÚ’|î…9¶¹OõŸ!Ÿ…³Åv_‡m¡z@€ D‘¡@7S @#³mc͸pŠÎ5Òù6§ý·­´hRÇ›Û\/ÕA€ Pˆ %¸I˜@ÝK@Þ /±û²lÕQ Áþ¨!ï–畵ƒÊ!@(4D†Bߌƒ n% e)7×Ј/©ý‡u˜Á=ñA[lçé¥I;|3¨€ PtLüXô;„}€ Ðu$0¼\ó.œ¦†oÞ±Æ{Tž §Ú¿ìäì>ûwÇì b@€JE‘¡T· c!@ Ê¢÷B¦¡™½¬Ãí¼Øúâ¼ ·vت‡ @ d:½ôUÉpa. @ 5$0¦áé°Àð{ë·§f 핚Ø¡5·šR!@ ‹„—[Ï};Ú¾í–f3'C·ÜiÚ @…$ ‰·¸àÞ /í˜ÁîÔЈÿ§y.ЋAè˜T @(!»v²í5Èð鵚=.ÛQÏÒÕŒ™Á6ÐvÔ¤,ËÉ2{ÐBX®‡íÍÚ¿y`ÀþšM³«¶ú«Ý’ò•}‹ÈPö;ˆý€ PZ^¡ß5|rÇiD°Ç$)|V¯;ŸÈ–ÛC±J!@%#ö´)wýݞדÕ^,mþ€Â5Wé‡Éô=yo»1YÂÃ`ÈC¿Ò´»LÇ¿Ð?˜¹‘]–]«£Kòf•Ôz̆ ”@î½ð½QÚAóÿ[u¿GC#–vЪ† ”†Àòl7-³t”žß¯Ò¼3’¨Ä„ÔÔÉN"BJOùý¼/×Ô 7˜‹)¿ÙýY°‹jSìì™ íút}Y¶©ýe±;!@¥&WލÙWÔˆÍ:Ò`7é­æ]ÙbûiGê§R@€@É,Ÿ×»oèÿà@/tïDûä†. ŸäÐφ¤"äiéTÒºÐF/éÏO$o¿\§~”ÕzOš¹¸ï·ƒå|'µ³àfb @ ÜÂ,ÛT£2¿ä¿~t¤%A‹Qû¨æ]ø¢þ}±J!@%"pÇ[P ö™| ‹ I@Hž ® xzò@H‚à¶ŸÐpŠØêÁÎw¾ãÉC<ò ý2O÷CßæbÄO2{Ǭ¥¶0VàÁvØFLƒ ”š@X`/PÎRܪí z7Éì\­qB¶Äîm{ýT@(°¯­³ü^“ç‚§%!¦&ñ už{rñ ‹2@îÙ “¹–0(:x³Óµ¾ïs/4†$N¤t/?£È……tì×xº†Q¬ÐqÊÌ-f”ýöŽG<½ˆ!q*¢mØ@(50C³Joj§ªGu¤!Á®Ö[ÉÛ$.\Û‘ú©€ P2÷̱]%.|KâÀã\p‘ uš“C:N‚wðý‹¾I^#5p˜D~2‰ ^‘{.xð<^O£è4 åÿ«Ê?lË¥vƒç-ZH|Šfö@€JM@s/ì§7ŽóÔˆÙmoH°ûô‚s¼†Fœ«}z'i»T@({æõ¾…°NôõíjâBÞ‹–—C ùá Ãàq~~øÆÌILðsž? î~èÃ+V¯:ŸÄ?§ë‘mïØrYô”ôb "»ÂXƒ!€ ’³mº†Gœªw„_ª)³ÛÚœú;É—µ0厚Øñ½´ 0´õP ”‘@8ÑjwÏÕœEýgÖLƒ ]\ð¨ÿcôÎs¯§i;¥1]ûñ?¯èù<¦ë†oÓõ>ìÂcãù=º½¬X¶ž7ž×=•ëi²kmÎt»Ý~í&¸½@€š@ ̱'éíâ|õ¸&7¾"|hD°·J\øÃø.$7 @ { „mêò‡í|õõ_‘:Ç.,$‘ÀÉÄνÒ\pÀ'_ð­ÏÁà[Oò¶õ#ç i®†Á ?¸WBºNs.ÄNz.(!æSî1 ¾o=_ôˆ¨Ù·fN·×e7ÚŠ¼ˆŽnR{:j•C€ÊL@ù^[`VNPô1ÚÑ>ÖÔ@•"àÃÝÛ$"ŵ΅(2¨§œy/>kë‡u‘!ߎp¬¤AÑÀ²Õ_ €xJ½ð¼|<¤mž<8Q¤û9+|[Våϲպvp„†Ô<™J€ @`¼ä½0_¾Œè…aïñ^;©üõU#¾jÚ‡²Ûì“*‹‹!@]F@ód÷Ì;¡ñ+}øA£Èàää½àX’gƒï{ºwú}ëž é8sA!¹.Ô|$ƒ‡\.È7ƒçýTÿÃþY¡¾²tòdˆÞ :“¶Aõ¤}ÜÃ!Šùåñ8UûæÌÅý¯ÖD”©Æ’'„<ßjI\áʳ·= keÛë§B@€@©hiʃõÒàÃæm5<Ø…ÖgïÍ–Ùò¶ÖKe€ ¸{ž=Þ²ßKHX7y($Ï…á"Cáf?ç¢AÒpˆ)¹ÔiuBi[?2›š§§c—VhnÆÔ wu`Åcõcü¸/÷nÐ6 £Pº‹ é×…äÕàÙ“øÒòíÃY=i«Åöei{HÍk{ÅT@(0ÓÖ³ ìszËxS›í¾Y?M¼%[b¿hs½T@¨ýP0íž»V3ììÂÂê ¾zDÔâò‘ÊçÃï…Þ|Î…Þ©u>SsO†FQ!î»  o v¡!<¬lÜê÷læÕ„ïÄGqA)Í·QtÐÇ€*’7Ã3³°§†Væ{%í «OwÙžz©€ Pz)y²ž×_Wœ×6£ƒ¦t4û„†F|J/ o#m³€Š @•"po¨½¿fAC} JיּÀ Žz¡óƒCšwÁ‡Fôæ .$$aaj.88±Æ}? ^›‚_“ÄÏëûq›?î}x…+¹:‘i¾†¹3&±Â½¼¤§xŒy낃§«>Ôbç{‚}@‡ÿ©ØÖ·²­uR @ ôÌî‰KSûžæþƒF{B°Ÿèýà­úõaI{*¤@€@µ ,_`súWÚê—Owá y2ôªGœ:ÅÃ=<=z0¸Àç]PЉð8(.hß{ÿ.xg¿Q`H+9†\ H‡¶2’gÃàV¢ƒ{6¤9’WƒÏÓ ‹Ó„.‰¸àà{úJ}ø6F¥ëÿGkSlç™ m©çjWÀ“¡]¤©€JE ̶Ù6Uó ˜=eðí£õ-¸[oï’¸ð­ÖWE € î!úís¢À&rt ÀÒÜ Q|P𧻇@VSw9 qBG%&!‰ S¦Ô/ˆÇºrªŽCÊçiIDHç½"*vhX-¡n¨æiÈú¢@â× Èx/ÂEC<tBY¦‡•êiö☡M©YmªŽj @Å' ¥)_%+¿¢'÷Fm±6Ä׋34÷²¥ö¯¶ÔI%€ .!pç<Û#ë·?LQï7ƒPïÛ·1ŠAT'‚âÁàƒ‡F!z2¨ ´‰[ï]G‘!ïf»á!?Œû+VÖ?X©}ž·ò^ˆ[y8¸ áÃ(çjðI!}ž†a q²GÙ=t}Üú±¢YXè±'n³ØþËnÞ m€L€ Pa†¦vÜØ¾¤—×·Íâ ™ŸìhMìø¿m«“Š @]D 6`ìç«ãITÈÜUAÿ×…ÍÑ ž'n³<|rG£]oS”6MÑCòbðtßw î.áÁýú$*Ä}‰ i›ò Q%tÝ MÓ'™T9žÇ=$4¸­¼X~*ÎÑPOVZ}¬çÀ@ø ’^–'·|ƒÈÐrÄT@e ï…}dç…z®Ïm‹½A³=Mì¸Ø>©÷‚|Pf[j¦@€@׸oGÛ±…êó-èÿC|?÷Rˆiù~ò\H¢Ã`aùŽWâÁó¹§BTêI«}6Öï'“GCnãSu: ÚzzZÇSxÐæPç°ùÍvsLhñ"C‹S< ›€¿5Mîx¼¬ü¨b{ž‹Á®”ÿâ1Ù²ö<ì‹}°€ Ð:}+ípõåãüóÆážž<â0‰š–¨œâѽ$(¸·‚Ç$2LÑë‚ ~¡o=ÝCÒ¶žZ$’÷BJóm2ÈÅ€$@¤ó~ÎEˆ†ôCy3Ô|0„ö£g†çË•†>¥¥"ã•j¿sPßiyHV·¼"*€ @˜kÛê íKSî×&Ûþ¡¡ÇÉ{á=€ãs¿MõR  @ ë„­vÏùvkͲY¾¬£¯$‘Ä„4ƒû~\e" “葸ç_ÈE†(.äÞ IhpšîÍàÇIT˜¦c#Ò#>y;¬RV •ðë]xH q??v…À}õ‰87CÚæs4øª +N¬TvŸ!¨¾]µú„²ù9Õ?Ù[¾.lŸ§lðÚ[Úó‹MȨ̈`@€ÀÄ„y›X³3tõ&+aœWû¦~pxW¶Ì–óJ²C€ 0wžoû«Ã;Ë'tTÿ»þë¾ Šõå*5á£ö3ïÔ¯ü …("äBBôhÓ]P𨒘àÇSuœŠKâCýŠú§ŸË‹Ž;î­ÜbexL¢‚—™ò¥ò|"Èhk:Q¯*ÎÍàÅøõںȂŸóù¥³›å§‡ð1m10تçÍÙ"»´-õQ  @‘@oV;¨. Ô{ÝÞŸOs3Ä~½Qø6 Ñ‹AC$zÝ‹!y2È{Áƒ®[uÐèÁö=_FáûQxð =4ôú=}ÈЉüÜ`Öü¸1O:çC7|?£P>Ÿù$úÃǃDoööx•ýž9îë@[uþÒDA @€šB@Þ ×CöbÅ]šRàš IËR{¶ØXSVÎA€ Ð|! àmït7Š uQAéªÒ£÷ÃëaÕÞˆs1Ä¡î½àQ]ö(0hß½Äc¥iiË´iyÈi´¼*€ t”€†#õ”ý‚âº-7$hÖ…`GI\¸²åuQ @«¸{žm®Ÿòw‰‚‚ÎÆ>yž«¦¸ÏуwÆóô!^ ~~ð„2¤¹\´F2áKVz)Ñ$}¸™¦Jpq½a_%ÿ@±e‘¡eh)€:M ̱½ôtý¦âÜ6Ørƒ$†#²¥vMê¢ @€Ö@ V³Ç5žNÃ"¼÷Õûö­{:Ôƒv¼C?-Ÿ!&zn ƒ ¹è—´lÒù4Œ"]ãÛ(*øÎ`eõºâ±×›N îÔÓ¢¨ ú}… étš›ÁW™Èe?•†K¤¼Þ>i"ÈXÜ€í¤$D†H†@€À èqœÙ<{·ÞNÖ%¹ü?Ƌǟm…Þ?>n‹ì“zÀ7ø>Ž¿ ®€ @ ivŒj=œãò”Å*-Š ¹~P?¥ƒ^y/Ä´tBÝ‹À‡?xRÞ¡ûQLðs BÃà~îùЛÿ¦¯bbHeÇr”ŇT—rø®§¹¨àûžÏ¯Mõ'±ÁOúyŸ Ò—²LAi.,¤¡±ý:®{o¤L¶ãà^‹vðdhXŠ… Î[Û [ÏÎÓCù…-· Øÿé!¸æ^øKËë¢@€ÆL@ó,iéJ/ÀûíÞw¡Á÷cèÕp ?ˆ úˆó+äbAže•7ƒÒ=_êÅûy’7C&á¢C<§­¯‘D<ú‡§¥¹ây¯;¯×ë´Ÿ†M¤4¯¿GBC>/C¼Ü“t]¡Á>>"­:áç%@,ðš[ZI—²!@ ­Â|{†ú©Ò­[Zq°Çô^ðšÞñ3z^û< @€ŠD „-¼îëºpàÆibD2ÍkPïô+‹®1 áÛ¼iÃÒü¼‹IXHyãV']tˆž ÞåÖõ~œÄߺ]ÜHÏ—êK^ ñœ>üº(PxBÜ>Ÿ—!ª Jóù$úÔ<¼(ŸØÒ‡IÄbUWM;¾¤¥„•-VU– lî‘¡¹<) €:@@ÏÍLºüñz’~LÕ÷´Ô¼ZŠ—Â!@Í  ¾ûÑS!uæUhšðÑ;Þú¡¿îÉ©Kœ:ë^±çQ1£Ž= üœ‡˜–òã$*ø0‰¸ï"Dƒ€ ta!ÆXÒ*ñ!–ë‚{=äçbš >/ƒ'*6žËÓ2oGÈW¯ðâ=§gõ<Äö‹K:nÕV– @å%‡G¬o_W ž7ô¡Ûä6á½Ðd @h)ÁÎtìšûGÞáöηïçÇw‡¸“$äó2xZ¼Ð3晓0D?áç\Pð{õºÈ·ƒž †kôdðs~½ ¼ŽFï/ËëðëÏ|òÇ•¾ÊD:™W¤!¹Þ O«‡õÓN«¶ˆ ­"K¹€ Ðra®=Uþ€ßTE³ZZ™{/˜½Qs/ÜÔÒz(€ f˜î¿â{ŸÛ½¼ž<|? ©ã=ä@xz:çó øù!yüx˜™±"¯L;Itð,ñXBƒ/S™®iØ›s$4¦{Îa6Š.¤¹bº\`ð.‹ž žÑËgêƒû:—Ÿ®+:ñ˜—<¿ÇؘúÆ/KezÛÛï«NHpyس´2àÉÐJº” @M'fÙ¦Ò࿦‡ï‹š^xcx/4Ò`€ P*òbxP?Ilàî¤Dý@½ðØ7ׇ{6ÔCL©g\©Î¼E”Ãóåù˜É <@IDAT…æ>H+=xBêà ^”‡$4x9©ÓýDŸÊòëýºX¶iòÇToJ÷rcP‚•–îUÅb”î§’+Ã`ûëk[>X/£uŸˆ ­cKÉ€ Ðdò^ØGE~KOÎíš\tcq+õ„þOy/œ¬4+G4’a€ PêO?è+*Ä¡²9õá}9ÇU₟P'ßO6†ÁÎ{ìª×½|ž„ü0vÞݳ qX„_„¦+¯‡t]ý¨þÙ§ß/½”äF$Á!¦{ypÁ!Îà´†dso‹ÆÐÿp´4¶15XçýŸ—·1Y;^în¼´ûx2´‚*eB€@ÓH\ØPOÇóiZ¡Ã šyÁì3ò^ø°ž¿ÃžÜÃ3s @€@Ñ ¨ÃýWu¬÷óεÿªŸ:ÚɳÁ㜩!+%4L™ž÷Æ•˜&YôaQP!^Øôt±¶Q„ðR\pp"?LZE<… ð­•ðë¼\^$q!&æé~Ê=¼~^¶§¹ÝÂ{kxÈ7«¼d"uÚSçßE„!B‚gl *ÌŃ©Ýéפáž%•1DhPO÷èbBã¶Ñs!V¡ºWh(GŒ¹À‹Þ6wËô†ys|˜D_4U¯;žæç=ÖZ¿Zž ñfñ@E! çßTù-|^OÈc[fS°;TöÙBûYËê `@€:F`Zf¿Ñoÿ>sOÔòηwÄÝÃaP=ˆ»çeÐËH<Ÿæ>ð<|èDìÔ§„zò xËÍÓÒÆ…4|"w1Áਠ<¹XÓ½þ$dDÑA-‰B„¶)¤ü>C>écþ¡kƒ®‚ƒç•©±ýÚÕ©~ç’ŠhÕ‘¡Ud)€ÆM ì`ÛkZÇoëÂ'ûâ±^ì¶ÒÞšÝbÿë%äƒ @ \6[lÜ3Ç®UÇzoïpËy!vñ½oÞ¯^·÷ã=Íãà ŸßÀOxðe,ýŠÔ™÷4Ÿ2uþu’w‚àex¾tm¼ .¤­ï{YQDоÃð²üƒõäåzáîm±Rž ù| žÅ«êSÑ[!ÏÓuÎÛïQy®u.Úmi@dh)^ ‡ ±síyúiáåßl¬×Œ+_¨Ù›µrÄ7Çu™!@(+_Èð½Ýxï|GÍ@Û4|ÂcçÛO¹7€÷Ô“0àCêjA¾ÕÆCì¹û‡‚—9$4$äY†œNIdHB‚§{Z<–.4DÑÁ· Ñ=+ü8†º­îÅàmHÚG:å¶yºÇü8³_¤ÃVnZI—²!@`­ôÌ«Ùûˆ†VfÿA¡ázʾQ“;ÞÞŠÂ)€ è±ï«~|¼Ó_ïhGÀ­íѱx=z3hèA½·î'êçê´Ÿ'ÅtßO½úáb‚Ÿó4 |>)Ÿsñ`PÈÐ~EO“à×Ç4mãÜ î½àé ^ â‹V¹^tlŸv$&Ô…OÒ±çñ*kö}ÏÖê€ÈÐj”@£ÛÈka]»P|š{'‚=¦r?h íT=[ãów¥p  @%$°å"ûÝÝsl¡&E\à/Sô2àî$*¸°àéé×þoc|´7R¾X˜gV𣸠á\$ð S9~.?—ò{šŸk&óù…ùÅžw0è ¯?MøèmHÃ>|M ?WÏPz̓٭o±ß ÑÂD†Â¥h@€VØC~ ßSŽÙ£çšÔ™4ÝÓk²¥väJáb@€JK@ﯫ¿ý1oÀ@ìÕ»Ûd}N†¤ÄþºúòÁú,KÞ IH-½öüÀWpï*|µÐx­‹ )äÂ@\Tð|iøƒçó4?vÃâ±ö£Wƒ{0xêÅàC%’í^…_æ‚‚·ÎE‡ú¾vÜFqÐg["C[0S  4È—§<]ië4¦7eߟ¬™}NO×$0èiL€ @ [ h5…óVûˆæd˜2(.¨Óß*&O†Ø÷¹|¥‰~¹>àBÀ`ðÏ•‡†Ý”·. ¸C†”¡IXðóÉ»! Q”Ð~ìB† QhpA±O>Ê>ü…'z0hÏ«Híð}oŸÛ©+ƒ’ÛÚ‚™J @À èy7ÅæÙ©ú ám-!âKSØ4÷Â/ZR>…B€ P*ZMáŽ{æÚ×Ôß>*uÂ]ðŽxú¥?vнCž§ûùØ;÷­wêcBžæ™bÎ|ãÇQTwƒ ¾Ò„Ÿ×¤ •Ô’°Ä†Ç\ÍPH;¦2Óqò`ðtW òàKUÆ$§¶DÑD‰Q|ȳJløšsH×µz‹ÈÐj”@‘@˜m[ÚÔ¸<åÓZ‚$hèÅ#ö¦ìû{KʧP@€JI@³JJðÃ5dÏà¯ûêÿû¾‡ ïäøš›po†>eèóD/ßó‹òëâ ßO=ý˜îÚqÁaøÄ~§'¡ ‰ ië¢C¢À{/øu^f¿lr»¢C]Hp1!®œ¡j“1»>rá¡¿'³O¥´vlÚA™: t9 ØWÞ ß†­›Ž"ØÃzî¾[KSžÑô²)€ ÒØb‰-Öç«!‡{‡¼6LTˆƒúðY®¸V—´ôù¼ëîé#O×øÅ~Õ°ŒI0HÉž¥1¤y’ÈV‘ð²¢÷‚‹ ò¤ðëûêCã’•Þ–è± ÓîÁàÚ…gMé™—SËÎßbñÀâÆj[½?¼™­®ò!@ Ë„ùv¬D€Ï«ÙùTËMì:—|Uv‹ýµ‰¥RTuø»V7ÞóºùîÓv@` ™Øb`Àn–WÃÆ¾¤¥¯™­_øãÖ¿,=mÈqž–eú]¾g]y4ø4Rz¬L‘gÃÔiÚW˜¢m¡}ߦ§Î´á¯<^ƒBò`ðÃ$@xzÚ÷í 1-ŸÁ÷}Ȇ(0¨Ž4$Â=’ÈàÂÂc]¦êþ©î¸å»×‹iWÈ[ۮꨀº…€¼¦I\ø²âMos}rÇÿÒÒ”ÇëA¦'2#H¯{#žì‚DÞóºà&ÓD@`ìäÍðfy+|yˆÈ oJ÷`Hi^š ¢ƒ¹ÐP“Èàž>|¢7¦æC)’èúøþðoáôTò¡)DA'’Ðà ܃ÁÅI`ÐnôRPv<ÔE†úýR’ƒo%F¼e«¥ö•zÎö}ovûj¦&@¨,0×¶µž¸<å^Mod°åú¥à ÙbûIÓ˦ÀªH¯sUk×XÛÃ{ÞXI‘è áD«Ýs¾]!QáéITôhÐ7fâ° IyÜÃ! N)z5äâ‚{5xpIl¨­òrHǾMbBLI\Èàùðˆz¶¾(&$OO‹"‚ocz]Tˆéñ8³_oõz{fvâ á—µ%ðði f* Ð=Â{š†ïH½ŸÙôVû±•‡kõˆ¶ºý5½Ø.ˆ í"M=€JBàþ¶ÍÊ>»N‚ÂŒš^V\HÈÔ©oô\Hä!Ã'„ÂÃÍÙàÁ/p‘Á3Ž%øˆ”ß=¼d_AB«GxpÁC´ ùø _cЃ!¦¯t‰{áVKì2¿¶aŒ­ï„iÔ @e!àT›¯É3{sÓm¶HËWhxÄ›^6V@þzVõfŽÚ>ÞóFEà @ Û ,Ÿkï vŠsô­9(2(}PdÈÓc^ÿPð|Þçbƒï÷¸àíÆI"uèxH¢Ãà±Ò’Ç‚Ÿ÷e)|bǸŸCE¿´?OôlÐñà¾Î{5™'á3yÖŽlr ©›J!@ 4Áãæz¦úðˆg4½9Á.´h’¦ûíÁ¦—MÝ@‘¡î2m„ 0Awï`§¨cþ¾žüú$6x'9оÕAœ“!Oót¸øÖ;õé8Š b‚ÏÝs®Ú Š qiL¥§<òc<$!ŠJsïi˜„gó<ƒÛZí3[-8.fêà"CáS5 ²À°‡Ä…ï+n×ä¶<¤'æÛ5<âÜ&—KqÝEÀß»º9ðž×ÍwŸ¶Ck% ï€ìî¹vf-Ø‘ž9‰ i›©wÅ„\,ðý$.¤/Øtì×§´¤-DÍÁW¦Ha˜§‚çKÂgIûiëÃ#ê"B}xD’¨àž žæõhsöÌ%ö&íû鎆Aµ‚Ê!@ t4ÿÂ+õ;GÏ¿|@bÓšpƒ¥<,»ÅþÚ´)¨[ tüE«ÃàyÏëð  z@ –ϱOÉÒ÷»µIHp¡Á"~œ<üK5‰ ¾M™ä ó{¦üDü0eÔ~ ù·s ü0 ~>¥7Šž–†K$ñÁ—¬ô ëOÙb©} CnO´‹@€À˜èqV³ö eþÀ˜.O¦`_µ•ön i&¤ñ\M^ '0üµnøùª篱Uo&íƒ 0ywͱ÷héÊSôÅY[åÉ‹ yñžîÁƒâCÃÓ&å©ç¨¦/ã”-‰ýIYP†$,¤$?ö|¾õë|;x.?vGÍ\yÜÌÅvjc}ÞOíí´Ô@%  áêÉúM™úü¦šì_z‚¥É¿ÓÔr)¬Û ø{Y7ÞóºùîÓv@`ÜîÜ¡÷9=µþ äz°EôXP .H|ˆ!‰ IHHéîJ<R¥IˆðãAO†ü[9 IlHÇî“àBBоõìõã|«c1Íì^ÍÍðÚm–ÙÏê©ÅùÌ›Yƒ°€ŠI@Ã\=í~¨¸S“-¼ÆÓðˆ[mY“Ë¥8 2ð7@ã"pßN¶Ußcv¡„ýýBzr5 Mw„$:¸ˆ„¿&u²ÓÖÓ<øuA¡þxJ©A‘A¤ý¸ÍÓuixDÈì—½Óì5›ßdw×K.ÖçðvË:¬ BÀðLIôß•1›6Õ û’-¶÷êa´¢©åRêÒû[·òà=¯[ï<í†&E@¢A¦yŽÐrŸÔ¤3\5pa!‰ éË5Ó‰(.ä® )=Už<òÓ)ypëç]LH«´õ  ¾ïAâÂßtÍf.²s´mÌ^ÏPÏá bf@€@Q„ùvŒž¡_”=SšfS°òáßnZ™Õ öluS[’Â{^K°R( Ð-þµ³múð#v’Ú{¤<â{‹ þåꢃ?d|›ÄíFÑ!‰ ƒ_ÂùÎðô4‘c’ $"ÄàKTzH1‰ +uxöºëØ7ºÑþOøc°Ý¶Ó @ ô`ë±ùö9=IßÞÔêƒ]'yþåÙù0 ÐZéý¬µµ·tÞóŠ{o° (¿Í]gÛ•öØûŽ’È0Ý¿\“ÈàÍðýÆ08t"=…òoãô¥ìbCòNðëÒpˆË iÈ„²=ª‰Ï뜲õÒGnk¬£Èû©E¶Û @ ÍÂlÛXzýÅžÛÔªƒ!-þ¬ÑTª6:ôz7zŽjŸá=¯Ú÷—ÖAm&pÏ\ÛBÀk4„âõzÀìž¾dÝ“¡Qhð‡»xàÁ'rôòä{ITH«$>H¤¸NâÂ×u|Á–KìÞxq‰>R;Kd2¦B€@+ „9ò_èÕf;6±ž‡$Ù£Õ#.lb™µHïmkËWÕó¼çUõÎÒ.@ ãî™3u×°â`éÈá)îák C†O4šÎ§´4ÌBÃ#Õþo4$ãÒ~°åR»!å)ã–‡Oï6Ch Ï’Ààó$lÒ´*‚Ý(ï…—É{á¯M+“‚ 06ˆ cãD.@˜0oÞ´»Â-{õ ôí¤ÏŽ ü‡š™Šëëx‰ë*íau¾TÚ¿—+íæ¬Çn–ÀpÓÖ™]£bSz%"C%n#€ 0yZAâÍòíû‚Jê|iy Až ÙÑÙ]öpÓʤ Œ"ÃØY‘€ ÐÍ{‘lŠ9@í& ^XM$>+…ý]M¬{…†G¼GªüiM,“¢ @€ N‘¡à7ó ´’@ØÜÖ×ßÀpPÓê v‡Êz™†ß5­L ‚ @(D†RÜ&Œ„ Ð|1KâÂwoZéÁ~®á¯Òðˆû›V&A€ ”†@ãJ¥1C!@`r$0Í¿pœ†GüW“Ê£@€ Š@d¨È¤€F"æÚ¶šáG:·ëHçÇì>Mñx˜†+Æ}-@€ Tž"Cåo1 „º•@˜¯¥)³(0lÝ$¿—ÃK³%v{“Ê£@€ Š`âÇŠÝPš@À hˆÄ~¥Ýæ ÁΕÀðtþ¾ @€ÖDO†5Ñá Àp”†H|E¦7ã;~¥Ä…wjx„—G€ @€À 4ãtp€ÚC@+Hd6Ï>.á„&ÕxõÇá¿iRy@€ Pqˆ ¿Á4è¦j‰Ês$3¼¦I-¾Få¼DÃ#îlRy@€ кà&ÓD@ ÚÂlÛØ¦Ø%žÙ”–»ÐVÚQÙ-öhSÊ£@€ ®!€ÈÐ5·š†BU$v°í5óÂevštû‚f_0;>[d§Lº, € @èJˆ ]yÛi4 Pv“ÃejËäWöOI ¯ÒðˆË«À†6@€ t†"Cg¸S+ IsmMðø}²á¤ ª_|³&x<8[j ›PE@€ t1Z·¦C(%°À^i=ò8Èš 0û±õÙ> ¥üSÀh@€ P8ˆ …»%@`taž½Û‚}C9¦ŽžkŒg‚}ÚÙAþ5Æ+È@€ 5`¸Äñp€@1h‰ÊÌæiBÆš½· ­PGk‚ǯ5¡,Š€ @€À D†Aì@(& Sm¾'™áU“¶0Ø}šàñMðø¿“.‹ @€ 0Œ"Ã0 B( ØPÞ —Ȧ&mW°?ÛJ ¸Ån™tY@€  2Œ…$@E ¶·­$0ø•O˜´=Á.µØ«³ûíÁI—E€ @…"Ã(`H† ÐIò`˜+ág²a‡IÛ1`ŸµÅöþÌ4P‚@€ @dh!\І 0a¾í®ë.Wœ9‘ë®Y!YáÍÙb;§!]@€ ´Œ"CËÐR0 ñÃ~ºêšäqÃñ_=䊿k©ËC$0üjH*€ @h!Z ˦h@0×^"qá'“‚-²>{²–¨D`²B€ Lž"ÃäR IÑšƒá;¦Mª°`¿¶‡mßl©„ @€ÚL‘¡ÍÀ©€ÀpŽ—Àp–†žáçÆuìBI ÏÎî´¿ë:2C€ @ Iš’b Œ—@0ËÂ;UÃÉã½v„üÕðˆ×j‰#œ# € @m!ÀÄmÁL%€†ÀÐk ⪯zfÜG¾‚Ä‘šàñ‚q_É€ @h2D†&¥8@k#fÛt›b+ßÁkË»–ó>,ÂWøõZòq€ @m!€ÈÐzÌ[¨ŠÙŠÛ(nogh»Y7Öv}Åõò8E[¿/>6[žÏš#Þ¬?ßú~ã±»E?¤øoÅó­ï§èi÷+Þ«x_¾õý¿+ê‡T ð¡cþot®âœ|ßÿ6ÆMtì“2zœÚ°õ“5ÄGµïÿ·–þíÝ­}ŸˆqÑ%fËuõ÷´¿¿âÄC°%úfx>Ü¡ýeŠ· Û2qœ€*I`–ZõÄ<î¡íŽŠÞÉô‹–‡š¾¦X¶Û4³½§×ã^Úßл¯c Á~§¥ƒäÁàâ!aÍ6ÔéÝý^§8_ûë(¶3 ¨²Û]lú«â¯Uü‹¢‹„ÖèvA÷¼Öü]Qjœ~úéÛõôô<1ëÉž¨gãvTg{™Ø–纣à0 z—HȸQû7ªþëC_øí›Þô&Ï&@ ëðð™Ø-÷NÉSŸ¤¸§ânŠê&T*¸Ä-Š‹oRôaþrüˆ"e àßqÞÁ< þovsÅB7rg½ =w]³çɧéêþN“1Jøoù*½:»K UF"°©÷SÜ?.üùYç^0.8\©øKÅ«ÝCЈ ÍáH)(÷PØf›mö¨ÕjhÒäÔ±÷çúf…0nd#î”èð[yA\Ù—õýäØÃu¡™Ê(ò‹W‘໨ðÅg)º¸P¸NŠljWp/ˆ…ŠþR|â¯è®Â€»¼¢x â3‹üò!óVëê›y ‡Éê Ì6X%8œ¦}ïÐiÿUœ°ŠÀ®Ú=TñÅŠ.*•ùÙæÃ1\h¸Dñ¿oU$Lœ"ÃÄÙq% AàÌ3Ïœ)/…—HP8PCž)£6)„a0BbÃ2]ö=Å/¹ýöÛ!ÑÄ¿ó ¨2¿ˆµòfȉ9 kû|Åm[YYÊö—8÷vøâÕŠW*Þ¬ØMá#jì~]Ðào«_-`;·MÞÉ|™â3Ç3ø@Ù‹\p8h= ^qîÿfGËRúu1á•á÷݇?T5øŠ¯)~CñoUmd Û…ÈÐB¸U.úì³Ï>IÚ'W¹yÛ.8âˆ#Î-Z;5b«ÞÞÞC³Zö2y÷ì $6|úè£öáÉ”’@·Š >§‚ÿ*è•y¥¼så3z¶L>&jû?Š®ªý@ѽX9Êp‚â맬-sÅÏ» únEÿ7õyÅO)þK±jao5èxÅ—(vÙçoå“uö»ŠRü€âåŠ@¥"pÆg,Яø”ѯ–¨ÐË·¼tY6M<Ž—ÃÏ9÷œï†p’Üܯ/ÕÅXˆ@­Ë(ìªöº›ñmŠŸTD`„„éªÓÝÜÏPô_a]p8Z±tôÉfBë øxûó}ž#»]`‚Á é!íÿ).Q|bU„cïDû÷‚Ïórˆ"ƒ Œ|e£Ë¡èC¶€@³È_¿YEQÎPšÈq' ¸°wJï_Ô©~½bUž]C:‰#1ñ>ÚËõôûƒ<Î÷e:'Q—B íºEdxŠÈú/=þ«ÏŠÞÉ%ƒ€ÿ  xºâ=Š?Rô!îLènîqt¦¢O*úE^Ba”àÝg¯Qôñûe ;Èð‹«èß „±Ø_Ù|¥Ÿ)ú¯`@`²ºÎ_²ÀÖ~ýi§¶åÙçœýµZOíÏê<¿ZWøÜJ„5p±AН“ ³PbÃÉüÇ OÀ;xUOSãü×°ÿU<°Ê ­HÛ¼ùÅo+Þ­èœñ«µ tYð¿ƒw*.T½‰ÅRšF J"ÃëDÅ'†ó_op¯nÚŸHG º½£µSy»쮊üWwŸ¸ þšK}=wâ—}JQÂÁ2ÄçÚxUQ ª¨>æù犛U´}4 ­#€'ÄٞqîOÚhãþ(„xTM˜âÚ/”x³}-Ô®Ðð‰+7ïOkGFŽ6¨‚Ȱ­xýTñ|Å-ÚÈŽªZOÀ=Õ&à.ò>‡Þ ­½ÏoVñ?Pìô„Q.tøÜ ÿ­èž „Öð¹‰|^¢­[_5@]N “÷ =¡ç7x/´ç/Aœ5%ûOM¨ù]‰ Givj²‹ ‡«7(>g m%KùàÉP¾{6V‹}…ÿ…Ý;œŒÃ+µÉåó‰¢|©ÃNýªí‚ð¯]X"´—€»*_¡È°”ör§6t SN9e=ut¿%ï…“Ôñ-’ç\WÜ1?D¾ W³ÔeWÜîR4²¬"ƒ+u)ž£È¤'¥øS›‘ˆ ÂVø‹¼£ókÅ¢ÎPx€“0p]{•b»Õ~†êü£â¾Š„Θ¯j}Î<þ:ßZËF€9Æ|ÇÎ:ë¬í7ÝlÓÿUG÷ec¾ˆŒM' þ×< ¿=ýÜÓwmzáq(£È°›Úxâ+ÇÙV²—Àå3‹×BàI:ïÿ~÷ZK>N·Ž€¯¾ó3Åvy4ø¼ >¤­]õ©*Â(\hø¡â:£œ'H˜“!‘XãVÃSå®ÿ{upŸ°ÆŒœl ݇­§Ø”_ù}iK…TQ”Md8Díø­â‚QÚCrµàÉP­ûùt5ç·¬V³JÙ_ÚòrÅVß<^u\¨8M‘P {Ë ¿'LVŒûE%€'ÃZïŒ/O)á§êØn¾ÖÌdh'u_.Ghh'rêN L"ƒ¿¬~W±Ó— gÈqëàÉÐ:¶í.ùÙª°Úv·«Ìõ¹7‰OÙ À;°¾¢ÅÉŠtf¡`Áû fæ@%" ì õíþC ¼—ð¾é¾¬/¡á²3Ï<óÉ4“º€@D^V»àq„&>¦´ûGH'©|^$“/UäE¤x÷î™2é´&›åßÙ_Uô-Å%ðQ™¶_qÍÃ2t˜Ã%F½ZÅà¥êÀ^¢ >‰3¡ $4lÐÓÛs™/¬þâCè^ˆ å½÷î~íÃVåmBWZ>K­žè¯ÚGêÚÿוԪÑhŸ—Ã…& 0'C"af¨ƒz¹V‘¤R¾Ý¿WuîYï,ŸåX\FEÞ!o/#Lln*†K4gÛ s/¤¯+2ÉPÛ7µ¢ÃUÚóÇY¢Ï»á=ÊK`®Lç¹[Þû‡åhO<±Ö;µ÷›ê ÎkY%Ü6YÈ>ãÃ^ÚV!u-¢‰ î²yj×Þ ÞHO†FåÙŸL}ayÌÅÒœ¡´±›ØEy¿£è“ôÊMàÃ2F¹›€õh"†KD˜Ûm·Ý‡äÔñ¬&’¥¨XÔ[«Õ.8å”SÖë TÝŠ$2ì ÞL&Ótcl"ž cU lO‘-Ÿ(=˜21>lâ£c¸ÔçÛð•C6C^²Ÿ€ Kï-¾™X6`¸„iE‚ý¥µüG›ˆSM»d6³Í6ûl»ª£žî$P‘Á»Hq¬¿žuçÝê®VãÉP®û½™ÌõÕ`øE»\÷m4kߢóF;™§»ÇÃüµäát¹¼UænZ.“±-"Ðåž gžyæLMôøÿÏÞ}ÈU•ýîìn*ª¤D)Šúb§(Š€ˆ¯EBB+ˆ È«¢ˆš¿T)"è«â‹D±bAš RR $„–Ð$ÙìœÿïLv“ÍfË”Ûνßû¾Ç™¹÷œç|Î0™yæÜsõËw^¾+$4Ð%­6²Y>‰TÒÞÓíòòÆqºúºw ý¥‰0^P˜‡*Qv ø…ã¶G£0þ²£_¤7Çè¹wòö*¨€Å¾ }£[d‘dðk1™A_i2’ ù«·)¼þ.m˜ï¨‰8¸ÑØÂ”èt‰ /¹ðú‚¹GaÆŽŽ4% ™,‡ž{:˜ƒè#E’á#ŠËŸõþ\+ð¼î=¹ö/îäMà tNÞ‚"HD€$C"¬T„@If2(—rXä¢o1&™´@Û°aÃü÷46ZH;ÉàÏíÞrÔTPdf1ä{t§)½Æ†@ †¹aïQ·O+a×érLi&ÞSÌE©æuäj•?¨üMåY•$7?ŸÌèo£{’{êþËU^¦âg ¤¹1“!MmÚB†x¥v!É0´{ €…PŽípu„$C!F3›N¤¹&Û³éb®Z]¤hNU™¤²«ÊgU®WI:Á &†Üü)7«\®r‚Ê>*›¨ì®2Så•4>d’d4 #Ÿd`C(‰€N™xéù矿SIºK7Hk&ƒŸš¿]ñ‡Råú%•¨¬%hÅéOãøWw¹°;îmt»_¯÷iœ.Ñ Í  ½sa žk2¤gMK¹hoo?D}5—ÁTîÒšÉð_¹—H&@ÿ%ý+*/U¹T%¤ƒÂíw{X~_åý*>á°›Ê'UnRiu[® ü)l €ùx±B–Ÿpˆ¸„e È4‘kн%×ñ\®ÒJ2¼:× ÉçO8HÅŸ±"™&2¯Õ¯6î«2ØÆL†ÁtxÈN`—욦e2àt‰ Ði2oJ4¼.o1Oi$¶…/eÙîQGÏ)Kgëè§?¥â×*‡ªLU™£òœJ3úSá1@ {‰c6@ (×öÚu—®Æ(F’¡lLüUаÀcŒ/³µUݯ{SÙ^åt•¾—îd&ƒPØ@ ø$1åàt‰òŒ5=L`·9sæøKÚ³!Ð@{C{7·³¿A™¶_•©³MöõIwŠÊ·T>¥âÃUBN2DŠŸ-Eñz÷ÚU¯šÉfãU¶l3ÛLiÓá‰v•åU³¼`WéÉÚÚ(þ ’ŸîíÏ+ß*Å0i*^NU÷•»U¨<¤²LÅ',WªøÄ¹ÿ0ä‹g¿X¡÷—¨ŒTak^`²ÕeCžöÖ| ‰¬xΜݥ_Ñç+׳¨UÖ;Ïzz*ªF+«Õꪶ¶¶ö.ë­éü£+®²¥‹Ü3E‡ï¢ÇÆ€,+£GÞSµý>ž©¥,i$Æ–³»Ÿ KÖßVºû¸þ´Êy*_S 9ÉàO aKP`;½[<ÚlßQf¯UÙÂÝlsvÞAÙqýìâ&=Då0ÿå“-ß7+¼«T~§âïû…uÝFè€}UVy‡Êæ*l øKXúî4v{#€C ,Q‚àÚªUo\­þë±G;_G4ý¹JWD˜ÜÖÑö%(R=ê‹rßw†ìd¨;(C’!ÔÁË0î4þ£+S’a…Æò… Ç3Ô¦ýi‡‡®Û*'ªì ÂV¿€÷Šc<êo‘=@ ¨K4SᇮËýïŒ3ü¿É±m³fÍò3Ý|¹ðì³Ï;räÈè‹òÇ•t(ÛìêXL•¤ñI6HcM†2ýbä-K#qÓÐ ³3¡ (—°òcclåÂI]¦~æB †ŸÛ\;JuÔó+ȯeóF•·ª, Í©€ñú„ãÑ*Uf«$ñ…ö9Õûm Íi*þ ¶úHÊÔçÄ^ 0€€sîoú×ùðE,špôQG*îCßf?ô¡=2}úô¯­^µÚŸNñy=ÿLß}ø{p%gv|žE`C4¾ûsíË´MVgï-S‡é+q lÙ5·M°—Oì°5Qï Vµw+Á°ºÁcýZ*þÔ ÿåszƒÇ²{ëþ‹ÿ©*Þ¿™Ó!š‰À·ãg³\¡ò#?þlƒ d܇g@`%n× '3ýŸÜO}Óì†çÕèÿ\tÑE—è—ùË,ªýÀz!6¨±›¢SP:dHR>ÄÌ(æJ íú_÷Ë´íS¦ÎÒWbxlJ›ñäT›Úd‚áf{Ò‰æ×l&¬å:ÈÿŠþI•j3pLSÔQ~qƯ«¤•`èèúãÕ*×÷~ûý Œë÷QDxF3Ž_¼hñ^Y%z‡vôÑG?´hÑ¢ýtªÆçôå™ë{ã p߯iQ©T¦ ð4#Я@3Ê–døoI_Ô¯6"€À@Þ×샿™d?ÔÓÚiÇï±åZÜi©þ·õíLUá׸\%Dlë‡Yƒ?åTf«t©d¹ùé³oUñcîßÃÙúغÿ‡yèWà«:Ô/à‹ú}6£gÏží“ _¾ð ïÓ¿ò—±0äС$ÃNÚëî¡÷dÖ¤ñZ3—Kµé»’íQªÓYZøþ[ÌöûÍTM•lrº*I—í=T»”aÇpÀÿêñð·.°RU¼W啬 =½ñ§Ø|@å·=p»I† HxúpvƵ¿ºvß¼%zǪõ ~¤Y‡iFƒÿ7‰mpIƒ?ͳ¬/F’¡lçïø¤ÊÙ*C]`oý‘à/Ê)ðMuûÈ_MÓ3‘½­ Ô¢‰\þÔÿw|V1qÈàþ¼X?kÀ¯ƒ·ÍŸ®q¨ ¿Öô?2$úwáQèÐöÕ®êŽÔb‹Ÿ¹âŠ+ò’Dp|túÄ/uéÌ#µƒŸ]Ç6@ÅÆô#П@Iÿ¡­lÛ+Õá3ÊÖiú‹@ƒ~‘¿Ý´Ú‚~-„F7jÄѼD¿ž¬6nk40öPÀÿZä¯[~À{dÿ„]ùYeü·k(ýfcªNžGâ¬R‚á}qÿ~H]š9}æ•bð§ï± $àH2 DÃãý ¤‘d𫆗qû„:ýù2vœ>#P‡ÀµÏ J0£Û/Ô±ß]j¿8Gsí}Ÿˆùoߎÿ¹"æzËXÿ•èý*¿  óÿTŒ¼o8P›è!fémèÂ#”^ÀÏ`èr]ïÒ)ׄˆqíµ×ÎÖb 1ö4bÖe,Ç¥ÑmG $ÃSÅáj¸'_Ò¨”í2ž Cq@©nUo?è¦èmgç4Üs§+?Tí%Ò:wþ^ÅèOë`kM`¶¿¢µ*R=Ú¹{¶uþtÀ1ëþä °F@_ÐÓŒ€_„êáOíˆ\t”â/룃Æ—™lƒ ñd_4’ Oöm´dÏToVÙ«dý¦»ô'àßsSm7­Áð#•f~=A—©LûËêW÷cýuˆÇê¸V{ù¤kHÛjûÉN)ÖÍRj‡f@ "qÖŒé3. $ÜÃÔ:÷©/§¸C¹ŸØªÜݧ÷ ¤‘dx¤Ñ  ¸¿¿¼ŸÖý=•mUØ(«Àñ:EÂ'~©ÃȆœ}Mk0Ìiø¸ÖxVUøD[ãKuˆÿu(ÄEµ®RÜk¼Ë…>‚$C¡‡—Î!И€N“øÛâÅ‹?ÝØQùÝ[}9K¿Úߟß³‰L—ù>gÎÊu ¤‘dX\W$ÅßÉO3=RežÊÙ*SUØ(“Àÿ¹qv½:ü+%š™vw¹þëùL†`©íg2l?Ô¦?¤À 5xÅÍFÖ¼Öÿ“¿@ ¬J0<«_þß3{öl?ó«›ú²J§dÎ.DgbîDÛFmœ.³i‘«#ÉþèŽR“ǫܣâÏ];X¥C… " <»«Ÿz>Ò~®NîØpGýÆæÚteê²ü5ÜÏf~:hÃö­pOûÔ–Ö"ÞðèŸé¡…>\ÚGF—¶çtÖpö)-ôøÀú†ÿ×u×]÷f3l8Ž#mäÆ>Ê#ô/F’a¡šîì¿ùR?êíß®â¿t=¤â§€¿F%1Q3l¤*ð?ÿšj_Ö ÿolsº„ä“v˜ yxùncÁ—zoÿËÖÇ Ð¥>\R€~ÄÕf2Ä%I=„-ðw]ªòü°»ÐôÝ‹@~«ÿgKý(I†RcOã ­ÿ 9·±°J·÷–êñGTþ¤â×°ðÓ²ý þc[ð>5Ù¶P‚áÝMôä~[mFËÌÏ"ÈÃæg ý+ƒOÈå½ÿGx§"3Ò’¦ò+àVÛê*¼,g&ªÓÙÙy©Ny>ÑF«\~66u ¤‘dðü§®hØÉ øÕ[§«øO¨øÄÃçT^©Ò®Â†@PïßÈþ8¦­©Uú—)Áp@tîÎçç çЯÀ•Ú%´«I Ö+Ÿ,¹}°Jô\ã ¶–‡®"PJðãcŽ:ææ"÷uÖ¬YOG…~º_ÜCÄéÝq‹¸¾´’ þÊ l ø¤‚Ÿ^î/§ãW8RÅ_ ίâë“üÇ.¶ü ŒˆìñïnÝÄ g+¬ËŽî«-”š·þ2oå0zÁÃ9Œ«•÷5zÃ[AäX‚Ð7é`bM1Pýš]]½jõ©)6™YSêë3k<‡ W+U~ìÌá¸ä5¤´’ 7å °¸ü¹°oVùªŠO:<­ò;ÿf¿Ÿ çÊ -?§la o«]²²þ ü;gˆØ_ë?(Õ=ïRk¤ÚbXùæg†r]Ñú÷Z6³a P ýŒ]Š~6ÞÉŸêW~ê`á7-yƒ Ë ßÑ:;X©VH2ÔiÅné-2x‹°_è€T·~UÀ®5Õ%%\Òúqº©ø8(_i½XV¨ÛÎW× M›zµ‡Š_Œç'*~ºò<•‹UŽR™¨Â†@*ïÚÈ¢-ü+²‘ÍÙyÑ<ûz#‡d´/ïgß;ðSA?³JÑ3+$CÐ/b‚o@€™ `éKæMÓ§O/Õû ‹ÜÕ@ð )V’Áòë!£a‡$¦¨RŸ`ð‰†ûTP¹TÅ?6^… D>8¦Áj~-˜gnð¨¬vgÀþåÕÃ×õÿT!eÜ­ÁÓŸ 1ìt¢”ÌdØpØ•î2Î]«º~/ÖçØðÕÀ#'ì…@IDAT *f’áÊA#áÉ´vPCPñI‡…*~Õô³UQiôk¡aC`CíuÖÞüÉ<õnN+÷?eÿ™–{ c»CaVÃ5Õ(ý"Yþ²ÅEÝþYÔŽ5Я4?74»"³3ú‚>·bÅŠ÷}°èký‰eÊ7ùóÙ@ 4?,,T\~m¶| LU8Ç«üLÅ/nã3¶ŸPÙI… ¦ÛÈ,RÆ ®ÍÙb]KâmÑR[^×þùØÉŸ›ïtlë øÓ´Š¼‘dHo-§"¿Žè[ÌdXo”ÄqÕ‡>ô¡þ^/þÿÈëBÔ-v‹ÃHN Í$ƒï…Ÿ¦Ï–_¿jìëUÎT¹[e¾Š??þ*lÔ-pØÆuïº\¿{¿-ZlÕ}D~vôÿ}°­X¢»E?W·ˆ Z®Áúî¥ý¹¡¾¨Ø p]®t³Ö‚V ÿoÛÚ®r¸Òþ°ðîd C`²Âáp³Ê*þ”Š­UØXO`¿ÑšO]Ï×gŸÔ¥*¯Zïà°þXV¸‰G[ä{ã1î½5¸@Q8]bíÈŠâw'žxâ k(ÛUvºì¯0Ću ¤dðaù©øEÿµ«Nþ`w{I÷8>¨Û_¨ìlOÒÏ«pù·æÆ,¯G½X§âåû¢ —ÃBÙ6éÊñƒôÚÙ<­Êr˜Î¦èd¯PžâËæº‘ú󺻅¿Ç¸~ˆé ô8çÕ/ùþtRošØ2¯Ôt²J2ø_½/l0VvC`3…9[e¡Ê)*›¨°•D`Ÿ‘ƒvôIëÒ•$™_›¥ÛEèDL}¸1¦zB¨†qa”ˆV8]¢G°LIäž>op«dËý<È 0 @VIЧU02ž]`Suà4ÿ¦|‚Š~ãf+ºÀ^_Ubµ.UyxtŸN”(ζ¼8]i¹'·´\C80î጑"м§KÔìÄà¯0Vú­+êZTzh@ Ë$ÃSŠóà ÄÊ®a l®°ÏRù—Ê›ÂìQ×+ðòáìéìJ0maÀ"œò1À€5ô°O?ØÐaï̸‡=~D@}Ìd¨9U¬â¯*Vú­ÝÚ—È2ÉàÃü?u¶â ì¬.þVå •mŠßÝröp·þ’ Î.Ö™Œs (Âå¬Ö ê? 8¶ƒu‰qL‡ç@ H:KÀÝV¤5Û—jµÊìëfñ8®”Y'<º¿"Á’Rê—³ÓïT·ïP9¬œÝ/n¯wÐ 1›´mп¿j©Çã6x´ðesÍ8ÞYŒá¬»Œ{ÝTìˆ@Àœ.áï£>º,WôÅ:cÆŒ'•pñ—kfC:òdxTqª²²ŽxÙ¥[¨?U¹Deãbt‰^¼´ï,§)ôö]I¢¨_ʸBΚ—}Ù’ Œ;ow”A€Ó%L_ªËöþ>Ø+ÛEQ´l°xÖ ä!Éà£ñç{».,î•Dàƒê§ŸjýÒ’ô·ÐÝܱ÷¥+½ ‹ÔÝo>‰ÈVl®^ìñ¥w PVÈî.k×è·_OŽ êÈK’Á‡ú=•oø;l¥˜¤ÞþUåÀRõº€2l½N-°[×{„?Š*0¿¨£_ PbN—°ÈE¼¿÷úO@3;žîõ'w@`<%|˜'©œ3H¼Éàt‘yöÙ@»@Ø ,lüŽ@A`ÕªU÷‡gZ1jfÇ iµE;„.Ç$ƒêñ*熎KüM œ¨£¾ÖÔ‘”©Àvm¶Èž·wk¡Ç®L¡ñ4L³1ÚBRàt W©T–¤æ@C.r$'Ḃ@“ ^¦'Ñð Ýg%ï|¼VÒŒâ“jìËi6H[­ lZ17:²C£%öxk5qt`$0ÂE:8]âÑY³fuÖ©U–ÝV”¥£ôVòšdèé—Ÿ>ÿv®ÑÛ#RžÛ“ÕU¦Ý2Þš½°DËCÝH¸„ŸÀCñUEM €9`CŸÁÐé«û<ÄŸ 0€@Þ“ >ìkT^¥òÿ[©NWo*Uíì“Ucê@ǮŰ—¶x<‡#€ù(ùéê>ïï¾29tCA _’ >pŸ`ØKåÛ*þT ¶rèr»\eÇrt7è^òa$èák:xƽi:D\ ”ýt gåz|2®jUNáÎÀ&Ã%ÉàuýyPW9@…)\B(ɶ‰úùs™K¶ü ðe3¿c“ddŒ{’ºÔd%à¸Fò)Eïïù¢B P“ =¸wëξ*~qÀÛ{ä¶°~6ÃF…í]Ø{&ìð‰¾IƽI8Cœ ”|Mçïï9‰y=ÉÐc{µîì©ò•;zä¶pÛ©G_(\¯ŠÑ¡çŠÑ zÑ ãÞ »#€@ %?]ÂUïï¼T < %Éàmýb,?Sñ§PøiõPa+žÀÇÔ¥ ÅëVð=z!øÐFü{®_— @ `Wáßõ‚)ÝA M"%zÜüß_ª¼Aåe*ßWY¥ÂV aêÆìbt¥P½àËf¡†³®Î¬¬k/vBN Z­’dnÔü1ÉÐ[÷ŸúãH•mUNP¹S…-|#Ô…Éáw£P= ÉP¨á¬«3Œy]Lì„A ”|M-üH"9È.A#¢'z”×o©ì¢²·Ê¹*\ß]nmŠûÄ@c/jØ]EíýP`õ€Ïð º@É×dÐLÞãC ? ”%ÉЛøúãx?»á•KT¸°Û>¨x7 ,æ"‡K’¡È£Ûߪý?Ì£ €¡ h&ïñ¡"ñ#¡@“ =Ü>C{½Êt•©ø„Ã9*KTØò/0J!¾/ÿa–&B’ ¥êµeÌ×Rp(–€.aÉ{|±†”Þ ª@™“ ½¡;õ‡O8|He{•—«ÌV¹I…L®rºÍÈi\e Ë/¸ÊV.Ƽ\ãMo(—k2ðù·\¯xz‹@¬$6äôœoQ9Uå•*[«ø…/SyX…-?»+”ò‘ € €@!J¾&C!ÆN €@f$†¦_¦]~ ò¿Žƒ_<Ò/:x­Êr¶lÞ™mó´Ž € € Ð#@’¡G¢þ[Ìoª¨²¹ÊkTf«üYe• [º‡¤Û­!€ € € $@’a ™ú÷k9ܨâO­x­ŠO:¼EåL•ÛU8gY o/Sý[$ÜÕ#€ € €Ô!@’¡¤vyNû^§òI•=TüzïQ¹DåA¶øükøMñWK € € € dhT¬±ý—j÷©LWñW­ØMådj—BLÛ>1ÕC5 € € €-dh¯‰Cÿ­c¾ªâO­ð³|òáj••*lÍ ìÝü¡‰ € € —I†¸$¯çqâO£8He+Ÿpøƒ ë8¡ÁÍ_ʲ£ÁcØ@@@ f’ 1ƒ6Yݳ:Î'Þ 2Aåtª[}ô۴úve/@@@¤H2$%Û|½‹tè)*~ ‡£TîVaZàÅCï € € €I dHR·µºý: ßSÙEÅ'PaX`§Ÿâ@@@4H2¤¡ÜZþ*ßSÙQå+*\•Býl;ôó!€ € €¤(@’!Eì›ò3>«òJ•{[¬«ˆ‡+b§è € € ’I†FkM¬·èæU* /ôD#Þ.ÑÚ©@@@`H’ Cår‡'Õþ*Wæ2ºl‚Ú<›fi@@@ G€$CDx·«ò{Uþ^è‰D¼Y"µR) € € €@Ý$ê¦ÊåŽ~†ÿVy:—Ñ¥Ôh5×–n“´† € € Ð[€$Co0ï/Qا„zìQ½F*D@@¨[€$CÝT¹ÞñE÷p®#L'¸Žtš¡@@@þH2ô§Þcþ´‰Ë ;öˆI2ÄNJ… € € €@ý$ê·ÊûžWç=Àâ[B4 € € 0€I†`|øfÅìŒ;ÎWÄYu!€ € €4&@’¡1¯<ïí¿`?”çSˆÍŸ6† € € ‘I†Œàj¶Ì—²ì”iÙgr$ô²¢Z@@@ >’ õ9…²W[(&çòê¤J@@@H24€À®›cR!>šTÅÔ‹ € € PŸ@VI†sÞ±*Õ&{Õ!0BûlQÇ~EÝå±¢vŒ~!€ € €¡d•dx€ÎUY¢r¶ÊËTØZð†e>]‚™ ­½~8@@hY «$Öݑo¢ÛãUnS¹UåC*eþ5^Ýoz{cÓGãÀGŠÑ z € €„+U’aó~ÈöÐcßQñ—aü™Ê;Tü)lõ Yßn…Ýk^a{FÇ@@@@²H2l*›öA|†é¹CTþOÅOÿ¾Ê*þq¶þÓÃSûª4Þ[šžÒQ@@@ §Y$9ŸNñ~•kT–ªü@Å¡­Â¶FÀ/žù 0Œ$/@@@ c,’ =ë14ÚuŸpx¯ÊOUW¹Nå#*UʺEêøå*ãË ÐÝïçu»¨ät@@È\ ‹$C#3®'P™£rŸÊ\•ŠƒU|2¢ [‡:y©ŠïsÙ·[àÊŽ@ÿ@@@¬[!©ØšÉ0X<~=_ü•*ºTnWùcwù‹nŸP)Ò6Añ †×©S-ôåï-Ë¡ € € €1 d‘dˆc&Ã`ÝoÓ“{u—Otï¸@·7«ü£ûö6Ýú)ö¡m~ý…ªœ¬âï³­ ÉÀ+@@È@I†$f2 E9Y;øòîîýl‡»T|âÁÏzøOwyL·yÜ^¬ ¦«¥’t’&ý*¦¿µÏ#€ € €$/E’!_’ýl‡]ºKoåeúãn•ù½Š_óa±ŠO@¤uÞÿ¶jë•*û¨¨²£ [ÿÿÔÃôÿ"€ € €¤)E’!‹™ õšúØ^Ó]ú³J,é.>áàþ²š¾<£òl¯²B÷W«tvßVu;¬Oñ§;lÝ]^Ô};I·;©ä!£0‚ØüåMÙ@@@r E’!Ô/Ð>I0±»ä`è¡[€$/@@@ 'Y\Â2Ï3r2,„Q§ÀCÚï¦:÷e7@@@„²H2„:“!á¡ ú&.×1þT6@@@dÈÁ BÓ—6}$"€ € €Ä.v’acõÀ¯mÀ†@«þò£þ2¤l € € €9H;ÉÀz 9ø„ñíô. € € €…H;ÉÀz …zùdÖ™ÅjùÇ™µNà € € €ý ¤d`&C¿ÃÀƒ |Kû¯nðvG@@HX í$3ÐTÿˆúx~ úI@@@àÒN20“!¸—Hîž­ˆžË]T„ € € `i'˜ÉÀ‹®{tðE­TÀ± € € €É ¤d`&CrcY†š?®N²CFš>"€ € €@i'˜ÉäË$A_¦(~‹H@@@ _´“ Ìdèwxp¥zþ„!öái@@@ŒÒN20“!ã´ù™Šûñ@c'l@@@ 4i'˜ÉPš—Vlý¦júElµQ € € €@bi'˜ÉØP²â›Ô«O‡Ð³ÈLÿφ € €”[ Í$ÃhQ(77½o@`‘ö=T¥³c2Ûu—a6%³Æi@@ȉ@šIf1ädÐãÅøV•‡ˆÕÜ;¥Ã^B¬Äˆ € €$)f’õ’ÉâÔ½B]y‡ÊÁti˜}­-²Ž`â%P@@@ !4“ ÌdHh TíJõÅŸ"qC(}r“lÅúþPâ%N@@@ I4“ ÌdHr$ï»'Áp](]qfmÖnß %^âD@@’hOº^õ3“¡w×xJ¢òÇõÍûSíx…¸[ÞÃ$>@@@ -4“ ÌdHkTÃjg‘Â}‹Ê]!…íÆÙæºhå©!ÅL¬ € € €@Òiž.ÁL†¤G3¼úoTÈ{«•`¨1²Ót»Yí>ÿƒ € € PH3ÉÀL^t½¾©?Þ òHïC¸ï¦Ô.W9+„X‰@@HS ÍÓ%˜ÉæÈæ·­e ÍA¿2¿!Ydgi4ÿÛ" žF@@ò!æ%f2äc̳Œâ*5>SåÑ,ƒh¥mÍb8Hk1ìßJ‹ € €U ÍÓ%˜ÉPÔWÑÐýòI…¨¼]%܃Y‡ ߺ»ì € €”S Í$3Ê÷ëR—¿£²£ÊeÁwŠ}DI†©Á÷ƒ € € € ¤uºÄÅ?*¡>Pm>®QX'«Ü‘Ïð‹J§Il¥Ã;н@@@r ¤•d`Cy^W7ª«ŸUùs¡º\±/ª?c Õ':ƒ € €Ä,V’õb¸Vw­búŠJ±’ ê›dÓtÃ%+…À† € € &Öš +Ä¿ „ç‚xAQ_¤²»Ê*…K0¨OfmöUýoZ ¹Z“ü € € ¢@Z_œîÎn*;¨¼Uåm*oTñk5°…'p·B¾På•'à ¿þˆ5‹a­ÅphýG°' € € P^´’ =‹tçÜîâ‚ÜWÅ'öS™¨Â–_¥ íG*ßW¹%¿aÆY›sT‡ € €V í$CoÈçõÇ/»‹ÜÏrx}¯BÒAo©ýŸ©\©òGIÊÒlº¢ÄášÅ°wi:LG@@@²L2ô ÝÏrð¿’ûâ·ž¤Ãéþ^*»¨t¨°%'°ZUÿ]å:•_«ÜªâTJ·©ÓÔ`ð Y²!€ € €Ô)§$Cßû&†k‡]U|ÂaÏîÛ—è6Ï}Px¹Þ:O$ü©»Ü¨Û§UئÚqJ2L®⫺Hë§7ïï ž°w]°ÜîëÿÙÂ<ê×])ãæßʺù÷2n¿Q§Ë<î6èQ`ñnN\ÕPuÕÙ9 'õ0ªÕ꽩7šóW¯^}F¥R¹8ça&ÞòåË$VyÂ;ç*QÄ? 3¯W}èÚ~áÈ«ødƒ/;«øË NR¦Â¶NÀÏR˜«r»Ê?TnB·l½Ü–¶±m^K (uÐâæì×Ñ<{s‹µp8 € €4!páÅ~¾U¾ÔÄ¡Å8ÄÙǦOŸ>'Í΄> ÀAö_š}é½µéñ*SU&ªLPñûÛq*cUBﻺÐïæ/+9¯»ø¤‚¿ÄÝ·þR¢lC ln'i—Ö kÚùÆPÍñ< € €$# Y þ»ai·jTõ?6§ºõ‹¶_ ÐOOhŠzEÏm­²­ŠO8¼¨Wñ_.ýÄ÷Íz•1ºï¯†‘åæÊ|ª»øì.KúÜ_ª¿ÙšpÛÖ’ '4yøú‡9»S³üÔj6@@È@ rQ»Nƒ.íU£ÔOq-j’a¨QU;<Ü]†Ú·çyŸ˜ØHeãî2R·½‹?uÃ/LÙ·øÌ™Yûã{n}ÄvOñÙ¥žû«tÿYŸPðë#ôܦþâPÛåÛ6²ÏªÓ~ŒãØÎŽ£ê@@@æ\äÚ£2gÖ|Ïl¯É£Êšdh†Ë'&žé.ÍÏ19p“m{]KãøXÞƒœ^+OÙå9ï2á!€ € Ph²ÏdpçÄNuó¿®³!€€h³/*Áà¯bÇvi´Ô–ÇQu € € €@s~&CsGæ¨ÔgÄ“d(Ìk‡Ž´"à&ÚŽšÅðÁVêXïØN;g½¿ù@@RÐLŠ{y·®Úiù©ö¿ìYT±i,Çö%E×ʳ7D íž÷–Ð@@(‹@\ë­éåÚ8]"È#è°ÜTÛ]³Þc/Xð1FLªB@@ YgÎ/Þ_æ-õÓ%˜ÉPæ—}_#Ùl݉ëÂ6Ù\û%´ € € ½€®,±YöQdAÔ­L»uÖdH[œör%à¦ØËÐÁ±åìe+ü%JÙ@@@ kȶÊ:„,Û¯V«þ ‰©n$Rå¦±Ü ¬™ÅOXš‹¥ùÇSµ € € €@«ιµZGÈÇ···“dy‰=,7ÙöTRàí±EÙv_lõQ € €4-0{öìaQTîÓ%:;;I24ý â@¨ÔÖbhô¨÷wvÑÀOò  € €¤)0vüØñj/®µ×Ò =ζžŽ³²zêât‰z”اpn’í¥·›·Åر'uÚ+c¬ª@@@ ŽjÇÄ/¡ÏÌš5+õ«Kd(ÂK‡>4.Ðf§6~Ð G8»s¨÷D ìÖ˜ë¤:@@hA@Û½…Ã?TWÖx,‹N0“! uÚÌLÀM±Õø!± S%b­Ê@@@ %óÏ?¿CìÒR%¬$Ë’,º@’! uÚÌN Ò,†(Æfõ_®|üAv¢e@@è+ÐÞÞ¾·ÖdÕ÷ñ2ý­þ?˜EI2d¡N›™¸i6I ¿;ÖÆ#û‹|\kT† € €­ TìM­UþÑ®Ë-΢$²P§Ílœ}ZsÚbmœS%bå¤2@@bpö–Xê ¸­ÉI’¡=`3BG nÍbØN;°îêÛ±Ó^°+êÛ•½@@@ ­Ç0Y§ ìF[9oc~ñ1“! uÚÌBàjtXÌ ÿVg9=sT‡ € €-ttt¼¯…Ër芙3g²ðcQF“~äKÀ³ÍÑ1±GUµŸÆ^'"€ € €@Ó³gϦS¤ãÿìßtD™¸@-»,Zg&Cê´™®ÀH;^ ŽŽ¹ÑÕ:Uâ1×Iu € € ЂÀ¸Æ¥Ãý©Ò¥Þ´ÃܬH2d%O»©¸)6\ }8öÆœý>ZbÇ^/"€ € €@SguÖH]­þä¦.ØAÎÜYu‰$CVò´›–Àû5]jëØ‹8U"vS*D@@ 1cÆœ®Ç·PEa­X%³$W—(ÌˈŽôÐ H‘UÌ/øïæ¬Kg7ý,ÞJ© @@š¸àâ ^­c?ÞìñE;®³³óάúÄL†¬äi7y)ö65²S ÝÍ·¥ ÔK• € € Р€¿de›µý\³ø~+;­Ç°üá‡ÎlMf24øf÷€";)‘h#»*‘z©@@øîw¿;®ÒV¹N †­:°À;Ëâ]e£šUÉôd%O»‰ ¸iö ,ñÚDé´«©—J@@@ n‹.ºèUmím7ëKõ”º*ÁŽUWýG–Ýd&C–ú´¤À‰‰Tîl~t¿Ý›HÝTŠ € €C èôˆQíÃÚ?©+I|V;ò€’íà"wS–]&É¥>m'" Y þº¸‡%R¹1‹!!WªE@@`PÍ\ØX;¼[3–¿ øAw.ï“®ºªú§,»O’!K}ÚNFÀÙqzãIæµÝE’!™A£V@@¢\xá…/ÕUÞÞíÌÝ¡ë²ý{É’%ó´FÀêfú§Y Û´ kÛ'rÑ¡:-âÕ1²™zJsŒ³;gÍšµ,Ëþ&óE,ËÑv©Ü.€cBxÖî³L³‚ õ‹j@@ˆO Í&V¬ò¹Z…úÆ¹ÃøÜE_ä¿ø>ªÕåàŸÓL„4­ÿ=Ö©BU÷õÿQ¤¿GèÎ=?VWI˜¢Ä–µzü3lC (±óû!wJx’ S}Ê‘½Go\ɬ,ëì÷zoëL¹G4‡ € €@PQ5©™ ½7å jWðŸÓ_ªÏëµM‰„ž;º§ûkÿ\sGǬyžÿ­[ÀUÝõuïœÐŽë}BP-) |4Á¶~›`ÝT € €@!4S²Éžyæ™ßeÓôºVI2¬³à^àn’í£ìçËìI†q©@@ :í$CC©ÓKn8ñÄý)(™n$2å§ñXÚ-ÉY EóìîXã¥2@@ ( ÓH2d0®Zá4»A“$6 áÜxÛFqšXìUcCb¸TŒ € P$N—H45‹¡Óªveú-oØ"I† Mx$Da6Ca'·iÅn‘…˜@@H[€Ó%ÒW{‘]?cÆŒ'2hyƒ&I2l@¡ 8«­]ë“ ÉmUË|•ä:GÍ € €Ä' iûœ.g]5Éü‡uí˜ÂNÉýò›Bð4@M`ª¨ÌÝ j<Í·¬Ÿª@@(Ž@d#ŠÓ™ü÷D§J<ñà¢sqª„×b&Cþ_3D8´À¬¡wiagiáhE@@ Tœ.‘òpGöýÙ³g¯H¹Õ›#É0 O„  ËVú &«³­ŸÊ@@(§K¤;˜ÕÕÕ ÒmqðÖH2 îóyhÓ‚QÂ3rº˜É÷—ñ!€ €äH 2ÖdHi8tªÄµ3gμ;¥æêj†$C]Lì”G-øØ®ÃÑ‰Ææìi»ßîL´ *G@@ @œ.‘Þ`V»ª_K¯µúZ"ÉPŸ{åQ`нEam›hh‘ý-2]q– @@êpW—¨ ªÅtZÊ?4‹á-Vûá$b'¥ÂÔ";*ñ¶œÝ’x4€ € €@˜ÉÒ`Ví””Zj¨’ q±s^ܶ¶¥N•x[âñTíÖÄÛ @@ $À© æŽ>úèëSi©ÁFH24Æî9eG(’Ž¢!É2M € €G Š"~Lv8•DZÏ$ÛDóµ“dhÞŽ#³¨¤rªÄÒh-β›´ € €@hºâI†$ÍÙ%Ó§O¿)É&Z©›$C+z›‰€›b{¨á]Shü¶Ú  @@ %ÀL†D‡óIÕžÛY ¾ç$*OD ²&RoßJë1ô%áo@@ê`&CHÍìRµêIšÅ°´™cÓ:†$CZÒ´‹€3¦ßKeCWò¯¡wa@@è% +ÀÛð^s7&†rõŒ£f\Su‰UC’!1Z*ND`нYõnžHÝ}+­ÚÝ}âo@@XଳΡg}¢-F%–U»ª3b¬2±ªH2$FKʼnTRšÅà¬K'ÍM¤TŠ € €@A6ÙdN•ˆyl•`¨V£ê{gΜùhÌU'RI†DX©4 ·•m¤Kµ”DÝÔÙ‚h¾­Üàq@@@:;;I2 ¨Óܺ^åçg5ó7ÍþQ$Ò7§ÅfÆØ¡šx•Ö›§J4;N‡ € PZŽŽŽ´>¯—ÃØÙgLŸñÕ:ÛR°ÄZrн75ªÝ•Z[4„ € €@qüš l1è4‰ß/^´øªJë߇³1“!œ±*u¤nŠm%€}SC¨Ø=©µEC € €D ÚVe&C c©Ãí«;W:{öìU1T—j$R妱Þ¥cÓœys ±r( € €¥¨tUH2´>ò·ºªÛwÖ¬YO·^Uú5dHßœ›¨Ø{š9¬écºlaÓÇr  € €%¨V˜ÉÐâÐÿýé§žÞwÆŒO´XOf‡“dÈŒž†ëpãm…ôêz÷a¿N[`Kb¨‡*@@(•@¥ÊL†¦ÜÙ•«:ßt '<Õt980Íéç9è.!)ÐaïÐU%¢Ôbw¶HUSk†@@(ˆ@¥B’¡™¡Ôe*¿~ôô£?­cƒZ䱿¾’dèO…Çò%P±ÃR (âT‰T½i @@ 0Õ¨:²bL˜o`@Ÿê²®£g5óÊŽÉõ®Œ~®‡‡àjW•pöÚT%œ=j{4† € €@A¢jÄÂuŽ¥® ñ·•+V¾¬H ßu’ u¾Ø-3ƒu¢D[ª­;{$Õöh @@‚¸È‘dz,ŸÓÕ#NX¼hñ>ÇwÜ¡wkN—k¼ÊmdïL½Ó‘=šz›4ˆ € €@"§™ é­¦œ˜Ö^øùª«N(br¡g0H2ôHp›;7Á6ÕÔS¬J’!usD@(„@qºD¿éìæ®¨ë:5âÏý>_ I2h0 ו;P}êH½_ÌdHœ@@Š!àO—HóÂp¹WsöWÅø•éÓ§_£Ûà¯Q7I†z”Ø'+·eÒ0I†LØi@@ |N—P&Á¹N%Z®ªV«ßž1cÆŸÂÕÆz@’¡1/öNI@)¾v*ñ攚[¿™çí±õà/@@¨G@k”v&ƒ’ ÷j®Â÷”\¸dæÌ™¥]ç$C=ÿ¥°OúSì¿Ôèfé7¬—ØÓ™´K£ € €„.àl¹~,ô§”bùG%îTbåJ­·ðÓYÓgÝúðÅ)>(êHWÀMµ¯ëmé¤t[UkÎVDóŒËî¤Oƒ € €E˜3gÎ&#GŽÜ£R©ì©… ÷Ð: /Õçìuxð}t¶X}øcÕª¿í\Ùù[]%bIð}й$b¥ºxÜ4»[5íOm Õ²,šk[5t;#€ € €À ‡~xÛ›|Ó¤6×¶sÅU¦XÅ&jý†‰š0QɇtðèA+HùIÍPX­&hm…{”$ù·â¼Ù­vÿ(óiõI†z¥Ø/57Å&ëMg~j ®ßÐýJ2LZÿ!þB@@$üì‡Ñ£Go£õ ¶QÒa¬ÊúrïOŸÞ¼b•Íõ%}áßHÖãifÄ(ý=\³ŸýìˆaJ Óm‡Ž«èÖ—Þßu»ôw§öéÔó«tÿY•§|Q½þv©êù%¾tuu-Ôc fÍšÕ©[¶zÃ7x(»#Œ€N•ø¨Þ¾LíCÖúo%vr/v@@@¼ ô|ß-Å¥#ó2,ü˜—‘ ŽÞû÷þ#åûËSnæ@@@ ’ ɸZ«ŸF†@nô.СY ¯Ë, gL‰Ê Ÿ†@@@ t’ ¡`ÑâŸj¯R—ü¹VÙl‘U³i˜V@@@ðH2„?†EëÁ~™vÈ™_† @@@  ’ M qH¢Ù&Œ™ ‰Ž.•#€ € €@¡H2zxÃꜛ`›*â½2:b&C¦þ4Ž € €A pu‰ ‡¯`Á³7¨Gm™öJÊÍ´}G@@`&CÀƒW¸Ð]-Ém·"žm´Ž € €„+@’!ܱ+bä¯ÉA§Fä B@@@‚ Éä°/h7ÉÆ¨W»æ g$r0„€ € €a °&C˜ãV¼¨Ûí¿Ô©ì“^ÎH2ïÕE@@@ %ì¿Ô¥ÔQšÉ½Àks!I†œ a € € €@x$³¢Fœ‡õÌ"]T`ú… € €$-@’!iaêRÀ³‘Úi¯!wLg‡ÍÓi†V@@@â d(Þ˜†×£‘ör=,'s[ÚÆ9‰…0@@@ H25\… ö¹êÙF¶E®â!@@@ ’ T¡ÃŒ,_I†ŠmYho:‡ € €$$@’!!XªmH oIf244|ìŒ € €¬ ÉÀ+!S7Ù^¤ÆgD߯+6¶ïCü € € 0´I†¡Ø#IJmÑÇ$[h¼îjÎ’÷€#@@@LH2dÂN£kò¶ƒ,"ɰv|¸ƒ € €4 @’¡,vMDÀ_¾2_[dòÑ € € €adcœŠån¹ëœc&CîÆ„€@@@ ’ A S1ƒtÛ™¿ŠÃ¶¹ë]dÛ;3þÛÈÝÀ € €ä] =ï_FØ®9íÝ0›bm¾-Èi|„… €1 臅(9ÚÚm#ëÒm›J¤ûÕîÛH·fÿŒæÙ?cj’j@B d(ôðæ¼s•Ü&<ÜKUH2äü%Dx €åP" ²­m”¾ú¶Õ*mºWÑmem2 wb ÷ýtähs*¦}×$ üß=÷7Òãk{ÏclÓ£N©³/Û<»lí>ÜAT€$à<<™°@^g2ø“%^¢¾ÿ"áþS= €¥pSìuêô+k_øýŒ5 €5‰ ï÷$ Fiÿ¨†å¿ü÷Þz'º¿æÈuGõý{Ý3½ï-Slï‹æÛõ½ä> €Àà$÷áÙ$"Û%Éê[ªÛÕf2´T#€ €À:7ÁvÒœ¯+Uð¶uê^ï/üõÜ_ïà„þpögÅõ%–$ÔÕ"€… ÉPØ¡ÍwÇj +ú/ò½?Lä)ä¨6“!O  €A ¸Éö"Íœ­ógªùþì¹æôˆÿÑé§ê#JWàd,ï7úŒqh>A ¶ƒ>lŒL°…V«ÞI‰aú€±ªÕŠ8@2 ¸qúw~”}\}?Yeã Ö ï‹Øïˆ•@Ü ô>s-·AXÚmZÎ{å¯0±GÎc$<@r' $}¤uÞ¯ý îË*!$®U‚a7 ¹{9(ÀL†­ !O  ¯TŒ NBD@ :5â :5âLÍV %Qß©Å?«Ó#¾¡Ù‹Ê°!€´*@’¡UAŽoN ÊýL… Ÿd`C@!Ü$-æÜf_UráÀ!vÍÏÓÎîS¼ï‰æÙ?ò‘ €á d ÃìAIy-6@P@É…”\8M;¼__ØC: ÷'š·0S †gìO €4%@’¡)6jYÀÙT}Éû6Þ·m¢ìá¼J| €¤)àv°Íl¸N30ûˆþ=žfÛ-µåìÅû±h®}·¥z8@`@2Îv‚'ÂÐ ŠxBQwØ›‚ˆ“ @HAÀM°nª}JiªÁIA%Ìþ­Ù {‘`Há…B Pj’ ¥þŒ:?Ͷׇ’¶ŒZo¬ÙŠíߨì €@ñôAEÉ…£ô3Á<ý~†Ê¦ÁôÒ)µàìÛºzÄ+¢ùvW0q( ¨§K:pA‡]U’!œôÖ~A[< €- ¸iv¨¾¤Ÿ®ÄÂÎ-V•þáÎSrჺ4åµé7N‹ €@9ÂùªWÎñ)j¯w¨cck+f0¡"€ ‡€þý{“ þÊ W™`0%VÛ®$âx5P P¿3ê·bϸ*šÉÒÖ^;eâŽB&V@šÐi{+©ðeÿÆfëÈô8g+Õþ§ubÇ­1­3=Ø@Ò`&CšÚ´µFÀ–dpvC‡ €@ÑÜ{‰f.üL †¿«¯¡&îÒì…WèÒ”ß&ÁPôW,ýC¼ dÈëÈ;®°f2˜½ÆM´­‹=$ô@ ¬º\óD%.Uráß28$Xgçê•{E÷×úl7]€Ó%BÁã›Éi™Êv-zev^ˆÜÄŒ €@J,ŒSbáó*Óõ¼¿¼t˜›³¥:)b†®ñË0;@Ô €@±˜ÉP¬ñ £7ÎÆ†h¯(#{g¯¿¸‹ €@°n‚Õº ßVra¾Ê,u$äïtzÄ.$‚}98P@§«±!ž€V_Šlš­R‹aÍ¢qÖeÏÙØè![–ž-!€ Ÿ€ÛÖ¶´ÑZÑìCú×xd|5gP“³ç5{á$%ÎÍ ušDD ¬/zƒt„§ØÁ6U¤á½î"k³Qv¸bçÃL /5ÂDX#àv°Íl¸}B‰…é‘ àr³RÿGD÷ÙÜô…. €…àt‰Â iÎ;Ôn[å<ÂëØÑ?É3 €äKÀM²1Zwá J0ܯÃç]Ø ?«ÐÙ—”Zx5 †|½Öˆè-Þ/ʽ£ç~x‘¦j†»í©K{í͵…Û"G(º€O.hÉâ)±p‚ŠŸAþæl ï×é ¿3ô(¶3Š=¾ùë]ØIÓf3äïUED €èž¹ðEà·PI†S “`0»Ðž²ÝI0ð2GÂ ÉÆ8)ÊpO—ð£Ùšz:¼HB_@ÂÐÕ"6ÕL»ÙJ.< äÂìÂ$œ=fU;D3gFKmyØ£Dô €@y8]¢*è=nµ®Úì…ÓõA`uÐ=!x@AH2 ÊÓ± 8}”*Òæ×fh·/©Kô@ 9%†)¹0æÚ=úñ'úWdäZËEÍ~öÂçµöÂ+uéç;sA €$*ÀÕ%å¥ò~Š•dðŒìín’íÝg7öÓ_B@ÀôïÄd7Kÿf|LÛ–„ä­¸ðAN(ÉhÓM@ [€$/…t¢‚ÍdèÑk³ÿ§_§öÔP°ê1á@ÀÜdÛ¾–X¨Ø1âØ¸$þÊ‘Ö,šk_Ó¿‹]¥è3DX+P¼_•×v;9Ðçn‘í®©¯þ$ €¦…w«]†²Í(½þ ‘”#Á`vsíÊsí+$ø(§I†rŽ{–½ÖþÝ";Ý³Í Ú;º… P‡€rÜOÅ/äøO•#T:ê8,ü]œ­Ð\¾“5{áUœþpÒ@ ’ ­èqlãþCHq·-l‹@wxé п€²çZÌñýJ.ܮӮWÙ¿ÿ= ûèº^ÄîJ.|•Ù …c:†Ô-Àš uS±cL/ÄTO>«qv¬Î¿ýVÐþk>$*@¸Üv¶…ÖbŽfR)Ëb޽ùž­Í^˜oç(¹Pܙн{Ì}@!H2 IÄ1 y&ƒ¿ÒDE«‡_ì&è……žµóË‚ê@pô¿“N‚ðW‰8Red8‘Ç鵚½pltŸ-еV*C^€Ó%‚ÂÀ:•â‹÷ŽúðyZ`#C¸ €Ch!Ç}uJÄ5z¿KIåcUʘ`x\³>͵I0 ñ‚ái@ ¤$J:ðv»Ø3ÖÁž¨£¯X÷'÷@BЬ…ZoaºÞÓÿ­ø£ÄÂ*żRÒÐôc]rg­½pÙл² €@Y8]¢¬#ŸU¿½PŠf‘Nš0û¾ÛÚöŒµç²â¦]@æ´¾Îöú÷ê8ç/O¼Esµ樇4{á8%~Y˜Ñ@ĘÉ- ðôñám;»ˆ£O €@Q4cá5:%â %îW9Yý,o‚Ái1Ggçkí?{CQ_ôô ˆY€™ 1ƒRÝÎ/ÅL††ÈŽÔ4ÛßêÃÙå=q‹ /J„µÛ{•Tø¨"Û­TÿN 4NëNTí]-é/íÂã €ô'@’¡?KNÀÙÉUžÓš+v®›d7i¬y9°@R ¸‰6^‹8«ÎÏT)ޣïl¥þ<]ÿb}M O¬êý÷@¨G€$C=JìŸ@›f2”oÛH¿]á¶µWGÙóåë>=Fò#àüņ'Ûšµp¼¢z« §Žö ³?haÇYJŠÏíyˆ[@ ÉШû·&PU’¡œçv³Ñv©>ܾK¿ é† @ M7Î6×'§«MéÉÉi¶@[Oè_¦“¢yvI±" €@ÎÊz ¦œKqÃëžšº°¸=¢gξ q_b/žFˆI v9aW›µðßJ.Œˆ©ÚâTãì‡]†¦A"¢IDATZ{á­½ðXq:EO@² É¥~ ÛÖ/I#mT‰OðëtWíú0÷ó?]FRÐåƒGÛÆöÍœóë-ì™J£¡5âì>ý‹t¼&þuh¡/ €@¾H2ä{| ~UZªŽmYÈÎÕשå:çõõJ4ÜZßîì… P€.=¹»ö›¥ ïÓíÆõSÂ}V)Ù}¦­°Ó£í…öŸ.#€$,@’!a`ªßP@oÓÀ—møL‰qš–ZµÿR¢a~‰zMW@غg-¼[³f©ò—ÇÞ@‘*ô ;vÚqÑB»§HÝ¢/ €ù`áÇ|G9¢‰l‘:Zî$Cd/Òâ_kŠWG÷Û£åxz‰Ä'Ð=káÕø>%®7‰¯æÖäÛ~aÇùvY{G—@r&@’!gRŠpª¶¸¤W˜Xx#›¤K[^ë¦èÔ‰ùöÌúOò €@_7ÉÆX›½[I…zn¯¾Ïów¿ Ùš½p²f/<ÕçYþD@ ’ ‰°Ré ‘’ lküi#‘]ã¶²·DKm9, € (û:%§Ö¯ñïÔ{æÈ ÷à‘ œýS«+Ý´Ás<€ €@‚$Ä¥êªö€~‰b['°m¦ F¢a ÷@ ìn{ÛVé„#•X˜®Ä”š+IÕó²xVf§Ø<ûޏºê9€}@ˆS€$CœšÔUŸ@ NõE¢¡Br (ÙÚaÓìmµÄ‚¯ê}› lõ 8û‘®ñ‰h±=Tï!ì‡ €@ÜüÓ·(õ )à&Ø}Œ|N+Cî\¾n´'ìÀh™=[¾®Óc(«€›l{ê_„#õïÂ{e°EYšî·³ÿ(1óa­ïó‡¦ëà@@b É$Õ4& UÁèÃ䤯Ž*ÉÞÎn·Õ:u‚«N”dÀé&åPÂy¬ÎG¨÷>¹ðÒr*´Üëgµ´ãl] yŽ>Эn¹6*@@ ’ 1 REãJ2\£•6~dIŽpµ$ÌþÑ\»¯$=¦› P-à8\Ý=`7[Ç!€ „ÓÕ“P¥Î¡œÝ=ôN%Þ#²Éêý_º¯_bºŽ¡ h…È_ª×M³ï*©ð¨N‹øq-ÉL‚¡Ù¡½C§F¼NW8‚C³„‡ ¤ ?&©K݃ Ü5Ø“ÒÚlC 8qkö%¾>ôÎìd' Ù Ûé‹ð{”Tðk-ì–]$jÙIÔìûÖ©Ú#ê]A(¨I†‚lÞ»¥OLí6U¿ÊDº :[}U}È4;F«‡¯¬ïöB’pãlse‡©¥÷èëðëô¾Î©˜q±;»IžÕú<ÿˆ«JêA@ i’ I Sÿ€šÍðW}xzÕ€;ðĆÎþ®ñ‡+Ñðà†Oò Ž€ÛÒ6¶Mk 8úY û©ÕŽtZ.M+~ÆÂgl®}_ÔüL6@‚`M†`†ªÞ¬^‘dhdh#{¥>Ðß®s?-°k9”}@V4ca¤°·ê=èݪÇߎh¥>ŽíW`•R ß²'íôh™=Ûï<ˆ €@ÎH2ä|€ ž³[ô!•­q-5ùû|†~å:E„,Ö¸!G €@n‚ íµKM®÷ëƒuÈFuÆ.Í8»Z+ðœ òüfç@ò"ÀW¼¼ŒD ãpmGM°½§„]³Ë7*Åð¾è>[g¥Ô…å¨ÍXio‘À;•X8H·$’}9Üc]µäÂuÉ6Cí €¤#@’!gZ@@ë2<¢±[ð4×#à/kföq]}â’zvg@ ¯€ÛVK7޲5Kêp=÷V•Ñ}÷á=¥S#Në¾$eg̵S €™ dÈŒž†½€’ ÿ«$ƒ?¿—­Ug¿Ô¬†c¢ûíÑV«âx(¾€›dc¬­–Px‡zû½*~¯sÑÃÕ:-â<{ÁfGKìñ\DD €Ä(@’!FLªj\@ë ££ÎoüHŽ@`™¦Ý~Xçôþx€çyJ,àÆÛ66¬¶¶Â¡J*¼A\"Í׃³k¬ÓNŠrª`šì´… ®I†t½i­€®’0E¿¤Íëó0¶.p­´ã£ìþÖ«¢Y ö>[±CÕ_üjø·?ý½C§F|B§µý&ý¦i@tø ‘®7­õ# S&ë#ï¸~žâ¡Vœ&ãFö%]âLý‡Îù¾­Xr, 8ÓÊ SloýïÛõÅö ½¼$ ð‹ª³ÇÔ¡/(•~¡Þ‡»ŠÕ9zƒ €@ÿ$úwáÑ”døž>™b“åjÊÙôÑöcºÅ åê8½E <n+]bSÛ_=öWƒx«ÞS·*OïsØS§¹d‘}Kk/|9š_[œ7‡A €ÉdHÆ•ZpSt™´Š]ÑÀ!ìÚŒ€³«´0ä'µ0ä½ÍÎ1 /]x|máÆŠ Në+D6<_–0§‘0û‘æŽ}Vë.,,¡]F@@IØÈX û¸e|@Ne Vë#ð9:‘âÔèA{"•ibз×›l¯QRö-ªð@½gîKÅT€³?jÖØIš5vK<R  €a dsÜ µ®2ñ+uÊpfKCÀ_ŸÝìL{ÒæDËìÙ4š¤ h\@3½ÆÕ’ ®v‰É}UÃÆ×‰ 8»KõZ‹:^h;TŽ €@ $¨¢‡©uféW¹óŠÞÏöo™f6|Íž³³£‡ìùÆGH”JÀM°š¯ðuz½' Û]JVgQ¸_ÔâºéË:†5vD‹  I†q©º~·½m«ÖêC5¯ÉúÙâÛÓÙ£J6|Us¾=ª”¤& µvUba?ý7èn|­ÞG¤Ö8 5#°\ :ž©÷Ë3y¿l†c@Š.Àº¢p@ýÓl†¿êÃõ« ¹ˆ¡>®NmËíÿifò"v>!µ@-©:ÜÞ¤Ó öS,¾ŒÍ:&Ú¯CÀÕf+\¨EgkQG?‹ @ú ÉÐ e# sׇiV×p:uÂÙÅú0}Vô€Ý¿Þsü ¸mmKe¯Wõµb¶cC°söÎþOWçù\ÄÕy² "@ȽI†ÜQytÛÙ6ÚV;ÊÓëœ÷ÔÿrÕ3ûŽÎ;¾Aoþòll 0ˆ€¦›è¿ÚõÛõ_Í®ºÏ¿·ƒ˜åø©ß)¹ð]1âæÇHh €äJ€=¹‚ÑU&~.…ƒ‘È¥À½ú²tŽÒ—ê÷Ó¹Œ È@ – Q»´äëÔükUvSJ¡-ƒPh2.g·©ªÏ芿‰«JêA@ ,$Ê2ÒôSë2¦ç? $ܲ†ùœ’ ?Ñ8]͵?—~—W ¶¦ÂH%\-¡à“ ;ë¿þ=-ÂKÂÙ<ëçm¾]¡eæVÆ”> €¤.À‡¢ÔÉip0M3®ê¨l:Ø~<—g ɥݳå$*Â@ 6}Ël³iöR]Mà¿ô¾ôêZ1›[T”‡•R8U)9ÊÕy Š8@Q€$Cˆ£Vð˜5›áÛú ÿÑ‚w³XÝsúxÙô¿?V¹2šoK‹ÕAzS7ÉÆhÚ½U^­×²O,ì­¾o\–þ—°ŸO(ô5-u믨ó| ûO—@ˆ]€$Cì¤Tت€>äOÓo‡÷èÃ=¯ÏV1³8~ÍeÞ~§/h?±J8o¨Ä#- ÔÖQ˜l/ÖŒ¨=”ÜÚCÕí¡×ÝËt»Q‹Usx¸«ôZ8ß:íËÑB­ûÆ €‰ dHŒ–Š[¨ýê8Më{³ÀZ+Œy?öY}èÿƒ‚ü­n«Ywå=`âËŸ€ÛRë%Œ±]””ÜUÑùâ“ þ’#ó-e à™ßS:óKºô.‹Óf04‰ P>’ åó`z¬Ù 'ê‹Ã7‚ ˜@[xHÜ r£Î“¾Q)¦»õ¥|µB›MÒ mJ(Dk »é2Aóo/’õœÞEÌþWÿ;;ZPKX¯ÿ<!€ €@b|0KŒ–Š[p[ÛhýB¹PõlÙj]¤ÀúùEìvVr ZY¥›¢µÌv®•J÷­Ó‚°¬ŸÐe)w^“\ø‘N‹ø’N‹¸§”t@ŒH2d<4?¸€€üœ¾Xœ>ø^<[ 5W­¸[}½Eɇ[ôº¸E_$þ¥/+JÑÿ‚uÒ·m”N˜¦ÙJÓ4žS5žþÖ'¦¨«ë.ÝIZ`MráÇzO8äBÒØÔ €Àà$÷áÙŒj׬o³ôÅcLÆ¡Ð|>Vë‹é\½>îÔíšñp§îß¡ÉÑ÷ëÍÍO—fËH@3Ú•2ØAçÂOÔ½I‰J(LZ›P`ÆŒF¦`Í®I.üD½:-šg> Ɇ € dÈxh~hÍf8M_OzOö@ [`ÍeêîÕëf^wbž¾äÎÓ)s¹l]<¯·•®Ô0ÚÆiÎÁö2Þ^µn/ïT&êþÄÚc‘VP`C Ÿ\ˆì ½ÎN%¹0u"€ мI†æí82%·m¡/3 Õ—ŸKɼÐÍ8{J_NЗ_ußï¹]¢Y걳Ѓt®¶ÊÆ6V6ce³fŒÕ×¹mtÍߦĂO*D¶é ÕðÉô$ªš¹Ài’1¦V@Z ÉÐ" ‡§# Ù §èKÍié´F+¥pú ™_tòÝ>R»õ÷Í–é ÷úÂý¤Êµû]ºmÓßóm¹ÞLsszFí°lÅïO3£ÛMçšû®–ØRùU·Pñ·þïžû£õ7ùðk²DöC[e_fÍ…| Ñ € ÐW€$C_þÎ¥€ÛÖFiÃ<·m.$(Öœ¢±\Ëõeh¹’ÏÕî›­ÔíªZqº­ôº)1Q­%5z.Õ¹îÖ)-i5ƒH'$TUzîûE S}£j%Ò­SYs;R·£»ÿæý]@lÁ øYE—ª|%šk÷ß:€ €@ øZ‚A.JÝ›®/h¥?ô@`§«ÆDz¿ï²3¢¶x€½x@r(@’!‡ƒBHý Ô¦€O³êÙ]ú߃G@xN3wÎÓUIÎÔiþ4%6@L€$C`Vöp5›áÍf¸®ìô(”€³§ušÏÙö¼}3zH런!€ €@°$‚ºòî¦ÙÏÕûƒË+@Ï@Â<¢™ ßRoÎÕÕ"ž)L¯è €% ÉPâÁµëšÍ0N³îVü\Ò2ÔA$n(·€³8S‹ýžN‹XQn z €@±H2k’ ŠË’hø :(Ðä&ˆ^Ý’È—æ™WöþUOvPAÈ @€7dxSß °gÌh˜[õƒ$¾“‹9{>Ê»Œ@3XSá¶ÁŒ…—óÈÉuµqlb @`š$¦TuÝȬ†ãsÑqQ èNÔ"%ÐþŒ…ªùù^V/dÆÂ†ê?%‹ @`/’ {òmo%°kVÓlø¶Y o%å{Z!Ð_¼ñæÌ[X–íÕyää¦VôZ'  @€#$ É0Bƒ¡+í¬ÕPõËDð‰öF¡ç:(ÐdžB¯þ8H,ìÈS!ÖÖ3T2 @`Ú$¦RE]h*—*‹ëŒÌjøYöíº‡ø Œ°@±Æëò³zu=[èmÌŽ^ @€Ó" É0-Œ*!ðŠ@sT”å ”wÎv Å+.ö̪@SkòóxÍ ±°ºþœ?~ý5¼ @€¦Y@’ašAUG`·@Ök8:5?I9m÷{¶ I`ç!V&©pM~¯î­®UCjY3 @€N H2tzø? ÌlødíW?M[F{Ú ÐY¦žNBáÆ$®Ë ×õª':k!p @€À, H2̼f»'Ð,¨/ÔDý8AyÙ½áñÌ Ü—ªûë+\W«ë/ù£¶}æšR3 @€ÀÞ$ö&äû¦Q ‹CNÔ‚Z’5¾—j™ÆªUE +[èM)ýÙ ×ç1“v%pq @€Ú ÉІQÒDZ<‰baÖjèÕ÷SŽ»D`ºv®­pGª»!åÆÌV¸=¸¶MWõê!@€˜^I†éõTI 4‹ë”œôÝ”OOúd'Ou¹ýáÆ„vC½T7÷Ö×S㦨 @€ã' É0~c*¢– ìzÅ7Óý¯dvÃÛZ†n˜¼@S›rÒ­I,ÜÜO.dÁÆ5“¯Ä @€£ É0 £ ^%м·®¹uV gçí#_õ-»ÆE`s’ ·&˜åYWay=T÷çQî"ò"@€h»€$CÛGPÿÇV`°Hä¢úl<3 ‡Ó²Ýlƒظ <•Š”[òY^žuî‘T÷! ÐUI†®Ž¼¸[%м§Þ•(¾œN÷mUçu¶{M­Oз%©Ð/+ÌTèÞG@Ä @€@w$º;ö"o©@³(I†^‘‹·Ó³ßÒ0t{\úOèÕ?ÎԎº-k*l—ðÄA€ 09I†Éy9šÀÈìz æÇj¢–$á°$z‡Lçtd|šz"Á­”^¶;êo½5õìø,2 @€ÉH2LF˱FTàU ‡ÓÓÅϧ,Ñ®êV›š<@²êIbý5_­ì=RëÚ‚¾ @€ W@’a¸ÞZ#0<sA. ?—ÆNM91ûs‡Ò°FÚ+ÐÔ éü½ù¬Ü™Ù w ¶«O}ØÖÞ ôœ @`Ø’ Ã×! 4‡Õu`œ‹ÆSRNÊ­ÊÖÏþÇa¤škê™|îËgáîlï¬íI*¬­æCñòHõSg @€Z'àB£uC¦Ã¦&°ëIŸÊæI¹À<1µ­ßScÕ³·gœLçú3úI…{“P¸¯·®Õë @€@»\X´{üôžÀ”I‡yu|Í©RY¿ŸòÎ)W¬‚a lMaM\•ò@öW%©p­ÌNØ:ÌŽh‹ @ Û’ ÝÑØ£@³ æ"õ„”ãRŽÉE뇳=d{sxMmÌ8¬Éx¬N£«²} ë'<[Ê/s·: o$´D€ ð&’ oãm^+м¯Þ]û%á°;é0‘Û,šZ”¯ßþÚ#}5m1Ýóú_ée[ÊóI$l¬ç¦P·S  @€̸€$ÃŒk€Àx dÖá‰pQM¤4ytf/Ûª£Rægßì‡ÝÃßdÎAÕ¦˜<§õÙ_Ÿý y·¿]_/fC=ž_Êýã¼ @€´R@’¡•æÓÚ!Ùó’|è'æg͇ù¹¸žŸžžrhÞë' ú ŠCòþ;òumIÿŸLÿ7§÷›³ÿïì?>(½lw¤L¤lKy¸6%@·4É‹ @`|Úøúñ ‘è¨@S¹ãˆ$&RæÔÁaèß‚ñÆÒËÃ8«ææ‚~Þ`ÛßuiRÏ“¯üžkùý…·æ¸Ûþ~ÕKƒ÷vÔ éC?qðŸ$ ¶ Êîýþû/çÑs’TØž„ÂºÚœŠ·åX/ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€#!ð_!UÒôPdIEND®B`‚mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/index.adoc000066400000000000000000000055521416264345000236140ustar00rootroot00000000000000= Overview :title: SML/NJ Library Overview :Author: John Reppy :Date: {release-date} :stem: latexmath :source-highlighter: pygments :VERSION: {smlnj-version} == Introduction The **Standard ML of New Jersey Library** (**SML/NJ Library**) is a collection of over 200 modules grouped into 14 libraries. It was designed to build on the {sml-basis-url}/index.html[**Standard ML Basis Library**] by providing higher-level and application-specific services that were out of scope for the Basis Library. The **SML/NJ Library** is distributed as part of both the https://smlnj.org[**SML/NJ**] and https://mlton.org[**MLton SML Compiler**] systems. ifdef::backend-html[] == Libraries The following is a list of the libraries that comprise the **SML/NJ Library** with a brief description of what they provide. These are listed in alphabetical order: === xref:Controls/controls-lib.adoc[Controls Library] Support for managing application controls. === xref:HTML/html-lib.adoc[HTML Library] __not yet written__ === xref:HTML4/html4-lib.adoc[HTML4 Library] __not yet written__ === xref:HashCons/hash-cons-lib.adoc[HashCons Library] Supports the implementation of hash-consed representations of data structures. === xref:INet/inet-lib.adoc[INet Library] Provides utilities for network programming with sockets === xref:JSON/json-lib.adoc[JSON Library] The *JSON Library* provides support for parsing, printing, and manipulating https://www.json.org/json-en.html[*JSON*] data. === xref:PP/pp-lib.adoc[PP Library] __not yet written__ === xref:Reactive/reactive-lib.adoc[Reactive Library] __not yet written__ === xref:RegExp/regexp-lib.adoc[RegExp Library] __not yet written__ === xref:SExp/sexp-lib.adoc[SExp Library] Supports the parsing and printing of semi-structured data as https://en.wikipedia.org/wiki/S-expression[S-expressions]. === xref:Unix/unix-lib.adoc[Unix Library] The *Unix Library* provides some *Unix*-specific utilities. === xref:Util/smlnj-lib.adoc[Util Library] The *Util Library* provides a grab bag of data structures and algorithms. Modules from this library are autoloaded into the *SML/NJ* interactive environment by default. === xref:UUID/uuid-lib.adoc[UUID Library] The *UUID Library* provides support for generating and using UUIDs (_aka_ GUIDs). === xref:XML/xml-lib.adoc[XML Library] The *XML Library* is a small library for parsing https://www.w3.org/TR/REC-xml[*XML*] files. endif::[] ifdef::backend-pdf[] include::Controls/controls-lib.adoc[] //include::HTML/html-lib.adoc[] //include::HTML4/html4-lib.adoc[] include::HashCons/hash-cons-lib.adoc[] include::INet/inet-lib.adoc[] include::JSON/json-lib.adoc[] //include::PP/pp-lib.adoc[] include::Reactive/reactive-lib.adoc[] include::RegExp/regexp-lib.adoc[] include::SExp/sexp-lib.adoc[] include::Unix/unix-lib.adoc[] include::Util/smlnj-lib.adoc[] include::UUID/uuid-lib.adoc[] include::XML/xml-lib.adoc[] endif::[] mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/root.adoc000066400000000000000000000023771416264345000234720ustar00rootroot00000000000000The Standard ML of New Jersey Library: Reference Manual ======================================================= :Author: John Reppy :Date: {release-date} :stem: latexmath :source-highlighter: pygments :VERSION: {smlnj-version} :toc: == Introduction The **Standard ML of New Jersey Library** (**SML/NJ Library**) is a collection of over 200 modules grouped into 14 libraries. It was designed to build on the {sml-basis-url}/index.html[**Standard ML Basis Library**] by providing higher-level and application-specific services that were out of scope for the Basis Library. The **SML/NJ Library** is distributed as part of both the https://smlnj.org[**SML/NJ**] and https://mlton.org[**MLton SML Compiler**] systems. // include library root documents include::Controls/controls-lib.adoc[] //// \include::HTML/html-lib.adoc[] //// //// \include::HTML4/html4-lib.adoc[] //// include::HashCons/hash-cons-lib.adoc[] include::INet/inet-lib.adoc[] include::JSON/json-lib.adoc[] //// \include::PP/pp-lib.adoc[] //// //// \include::Reactive/reactive-lib.adoc[] //// //// \include::RegExp/regexp-lib.adoc[] //// include::SExp/sexp-lib.adoc[] include::UUID/uuid-lib.adoc[] include::Unix/unix-lib.adoc[] include::Util/smlnj-lib.adoc[] //// \include::XML/xml-lib.adoc[] //// mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/000077500000000000000000000000001416264345000233355ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/gen-css.sh000077500000000000000000000062741416264345000252440ustar00rootroot00000000000000#!/bin/sh # # COPYRIGHT (c) 2013 The SML3d Project (http://sml3d.cs.uchicago.edu) # All rights reserved. # # Script to generate CSS files for SML3d webpages by substituting specific colors # for symbolic color names # # usage: # gen-css.sh src > dst # # general document colors # BACKGROUND="#fff" LIGHT_BACKGROUND="#f8f8f7" MEDIUM_BACKGROUND="#ececec" #MEDIUM_BACKGROUND="#f8f8f7" #MEDIUM_BACKGROUND="#99ccff" DARK_BACKGROUND="#cae5ff" # previously #369 BANNER_BACKGROUND="$MEDIUM_BACKGROUND" TOC_HIGHLIGHT="#99ccff" # hover color for TOC hrefs HIGHLIGHT_BACKGROUND="yellow" # background for highlighted text TITLE_COLOR="#000099" # color for title in banner MAJOR_HEADER_COLOR="#cc6600" # orange/tawny for major headers MINOR_HEADER_COLOR="#003366" # dark blue for minor headers DEFAULT_COLOR="#000044" # default color for text HR_COLOR="#527bbd" # color for horizontal rules LINK_COLOR="#000099" # color for hyperlinks VISITED_COLOR="#6666ff" # color for visited links EM_COLOR="#000044" # color for emphasis elements STRONG_COLOR="#000044" # color for strong elements BULLET_COLOR="green" # color for UL bullets BLOCK_BORDER="#527bbd" # border for inset blocks BLOCK_BACKGROUND="#f8f8f8" # background for inset blocks BLOCK_COLOR="#839496" # foreground color for inset blocks # # code highlighting colors (pallete from http://ethanschoonover.com/solarized) # CODE_BORDER="$BLOCK_BORDER" # border for listing block CODE_BACKGROUND="$BLOCK_BACKGROUND" # background color for listings CODE_COLOR="#6c71c4" # default foreground color for code KW_COLOR="#268bd2" # keyword color COM_COLOR="#dc322f" # comment color LIT_COLOR="#b58900" # color for literals BIND_COLOR="#6c71c4" # color for identifiers at binding sites PUNCT_COLOR="#6c71c4" # color for punctuation # NOTE: the following two colors are from the default pygments color scheme TV_COLOR="#aa22ff" # color for type variables TY_COLOR="#b00040" # color for type names sed -e s/@BACKGROUND@/$BACKGROUND/g \ -e s/@LIGHT_BACKGROUND@/$MEDIUM_BACKGROUND/g \ -e s/@MEDIUM_BACKGROUND@/$MEDIUM_BACKGROUND/g \ -e s/@DARK_BACKGROUND@/$DARK_BACKGROUND/g \ -e s/@BANNER_BACKGROUND@/$BANNER_BACKGROUND/g \ -e s/@TOC_HIGHLIGHT@/$TOC_HIGHLIGHT/g \ -e s/@HIGHLIGHT_BACKGROUND@/$HIGHLIGHT_BACKGROUND/g \ -e s/@TITLE_COLOR@/$TITLE_COLOR/g \ -e s/@MAJOR_HEADER_COLOR@/$MAJOR_HEADER_COLOR/g \ -e s/@MINOR_HEADER_COLOR@/$MINOR_HEADER_COLOR/g \ -e s/@DEFAULT_COLOR@/$DEFAULT_COLOR/g \ -e s/@HR_COLOR@/$HR_COLOR/g \ -e s/@LINK_COLOR@/$LINK_COLOR/g \ -e s/@VISITED_COLOR@/$VISITED_COLOR/g \ -e s/@EM_COLOR@/$EM_COLOR/g \ -e s/@STRONG_COLOR@/$STRONG_COLOR/g \ -e s/@BULLET_COLOR@/$BULLET_COLOR/g \ -e s/@BLOCK_BORDER@/$BLOCK_BORDER/g \ -e s/@BLOCK_BACKGROUND@/$BLOCK_BACKGROUND/g \ -e s/@BLOCK_COLOR@/$BLOCK_COLOR/g \ -e s/@CODE_BORDER@/$CODE_BORDER/g \ -e s/@CODE_BACKGROUND@/$CODE_BACKGROUND/g \ -e s/@CODE_COLOR@/$CODE_COLOR/g \ -e s/@KW_COLOR@/$KW_COLOR/g \ -e s/@COM_COLOR@/$COM_COLOR/g \ -e s/@LIT_COLOR@/$LIT_COLOR/g \ -e s/@BIND_COLOR@/$BIND_COLOR/g \ -e s/@PUNCT_COLOR@/$PUNCT_COLOR/g \ -e s/@TV_COLOR@/$TV_COLOR/g \ -e s/@TY_COLOR@/$TY_COLOR/g \ $1 mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/prepare-fun.sh000077500000000000000000000013751416264345000261260ustar00rootroot00000000000000#!/bin/sh # # Script for adding a functor description file to an existing # library documentation directory. # # usage: scripts/prepare-fun.sh # function usage { echo "usage: scripts/prepare-str.sh " exit 1 } if [ ! -x scripts/prepare-fun.sh ] ; then usage fi if [ $# -ne 2 ] ; then usage fi d=$1 ; shift name=$1 ; shift if [ ! -d "$d" ] ; then echo "$0: missing library directory $d" exit 1 fi lib=$(basename $d/*-lib.adoc .adoc) template=Templates/fun.adoc stem="fun-$name" mod_adoc="$d/$stem.adoc" if [ -f $mod_adoc ] ; then echo "$0: file '$mod_adoc' already exists" exit 1 fi ## create the placeholder for the module sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" -e "s/@NAME@/$name/" $template > $mod_adoc exit 0 mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/prepare-lib.sh000077500000000000000000000037241416264345000261040ustar00rootroot00000000000000#!/bin/sh # # usage scripts/prepare-lib.sh # function usage { echo "usage: scripts/prepare-lib.sh " exit 1 } if [ ! -x scripts/prepare-lib.sh ] ; then usage fi if [ $# -ne 1 ] ; then usage fi d=$1 ; shift if [ ! -f $d/MODULES ] ; then echo "missing $d/MODULES" exit 1 fi lib=$(basename ../../$d/*-lib.cm .cm) lib_adoc=$d/$lib.adoc ## copy the header sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" Templates/lib-head.adoc > $lib_adoc ## add module entries while read -r line ; do name=$(echo $line | sed -e 's/structure //' -e 's/signature //' -e 's/functor //') case $line in signature*) template=Templates/sig.adoc kw="[.kw]#signature#" stem="sig-$name" ;; structure*) template=Templates/str.adoc kw="[.kw]#structure#" stem="str-$name" ;; functor*) template=Templates/fun.adoc kw="[.kw]#functor#" stem="fun-$name" ;; esac mod_adoc="$d/$stem.adoc" link="xref:$stem.adoc" ## add the module to the library file echo $link"[\`"$kw $name"\`]::" >> $lib_adoc echo " something" >> $lib_adoc echo "" >> $lib_adoc ## create the placeholder for the module sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" -e "s/@NAME@/$name/" $template > $mod_adoc done < $d/MODULES ## copy the middle part sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" Templates/lib-mid.adoc >> $lib_adoc ## add the module entries for the PDF version while read -r line ; do name=$(echo $line | sed -e 's/structure //' -e 's/signature //' -e 's/functor //') case $line in signature*) echo "include::sig-$name.adoc[]" >> $lib_adoc echo "" >> $lib_adoc ;; structure*) echo "include::str-$name.adoc[]" >> $lib_adoc echo "" >> $lib_adoc ;; functor*) echo "include::fun-$name.adoc[]" >> $lib_adoc echo "" >> $lib_adoc ;; esac done < $d/MODULES ## copy the footer sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" Templates/lib-foot.adoc >> $lib_adoc exit 0 mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/prepare-sig.sh000077500000000000000000000014341416264345000261140ustar00rootroot00000000000000#!/bin/sh # # Script for adding a signature description file to an existing # library documentation directory. # # usage: scripts/prepare-sig.sh # function usage { echo "usage: scripts/prepare-sig.sh " exit 1 } if [ ! -x scripts/prepare-sig.sh ] ; then usage fi if [ $# -ne 2 ] ; then usage fi d=$1 ; shift name=$1 ; shift if [ ! -d "$d" ] ; then echo "$0: missing library directory $d" exit 1 fi lib=$(basename $d/*-lib.adoc .adoc) template=Templates/sig.adoc stem="sig-$name" mod_adoc="$d/$stem.adoc" if [ -f $mod_adoc ] ; then echo "$0: file '$mod_adoc' already exists" exit 1 fi echo "creating $mod_adoc" ## create the placeholder for the module sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" -e "s/@NAME@/$name/" $template > $mod_adoc exit 0 mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/scripts/prepare-str.sh000077500000000000000000000013771416264345000261500ustar00rootroot00000000000000#!/bin/sh # # Script for adding a structure description file to an existing # library documentation directory. # # usage: scripts/prepare-str.sh # function usage { echo "usage: scripts/prepare-str.sh " exit 1 } if [ ! -x scripts/prepare-str.sh ] ; then usage fi if [ $# -ne 2 ] ; then usage fi d=$1 ; shift name=$1 ; shift if [ ! -d "$d" ] ; then echo "$0: missing library directory $d" exit 1 fi lib=$(basename $d/*-lib.adoc .adoc) template=Templates/str.adoc stem="str-$name" mod_adoc="$d/$stem.adoc" if [ -f $mod_adoc ] ; then echo "$0: file '$mod_adoc' already exists" exit 1 fi ## create the placeholder for the module sed -e "s/@DIR@/$d/" -e "s/@LIBRARY@/$lib/" -e "s/@NAME@/$name/" $template > $mod_adoc exit 0 mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/000077500000000000000000000000001416264345000231715ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/pygments-default.css000066400000000000000000000112461416264345000271770ustar00rootroot00000000000000pre.pygments .hll { background-color: #ffffcc } pre.pygments { background: #f8f8f8; } pre.pygments .tok-c { color: #408080; font-style: italic } /* Comment */ pre.pygments .tok-err { border: 1px solid #FF0000 } /* Error */ pre.pygments .tok-k { color: #008000; font-weight: bold } /* Keyword */ pre.pygments .tok-o { color: #666666 } /* Operator */ pre.pygments .tok-ch { color: #408080; font-style: italic } /* Comment.Hashbang */ pre.pygments .tok-cm { color: #408080; font-style: italic } /* Comment.Multiline */ pre.pygments .tok-cp { color: #BC7A00 } /* Comment.Preproc */ pre.pygments .tok-cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ pre.pygments .tok-c1 { color: #408080; font-style: italic } /* Comment.Single */ pre.pygments .tok-cs { color: #408080; font-style: italic } /* Comment.Special */ pre.pygments .tok-gd { color: #A00000 } /* Generic.Deleted */ pre.pygments .tok-ge { font-style: italic } /* Generic.Emph */ pre.pygments .tok-gr { color: #FF0000 } /* Generic.Error */ pre.pygments .tok-gh { color: #000080; font-weight: bold } /* Generic.Heading */ pre.pygments .tok-gi { color: #00A000 } /* Generic.Inserted */ pre.pygments .tok-go { color: #888888 } /* Generic.Output */ pre.pygments .tok-gp { color: #000080; font-weight: bold } /* Generic.Prompt */ pre.pygments .tok-gs { font-weight: bold } /* Generic.Strong */ pre.pygments .tok-gu { color: #800080; font-weight: bold } /* Generic.Subheading */ pre.pygments .tok-gt { color: #0044DD } /* Generic.Traceback */ pre.pygments .tok-kc { color: #008000; font-weight: bold } /* Keyword.Constant */ pre.pygments .tok-kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ pre.pygments .tok-kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ pre.pygments .tok-kp { color: #008000 } /* Keyword.Pseudo */ pre.pygments .tok-kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ pre.pygments .tok-kt { color: #B00040 } /* Keyword.Type */ pre.pygments .tok-m { color: #666666 } /* Literal.Number */ pre.pygments .tok-s { color: #BA2121 } /* Literal.String */ pre.pygments .tok-na { color: #7D9029 } /* Name.Attribute */ pre.pygments .tok-nb { color: #008000 } /* Name.Builtin */ pre.pygments .tok-nc { color: #0000FF; font-weight: bold } /* Name.Class */ pre.pygments .tok-no { color: #880000 } /* Name.Constant */ pre.pygments .tok-nd { color: #AA22FF } /* Name.Decorator */ pre.pygments .tok-ni { color: #999999; font-weight: bold } /* Name.Entity */ pre.pygments .tok-ne { color: #D2413A; font-weight: bold } /* Name.Exception */ pre.pygments .tok-nf { color: #0000FF } /* Name.Function */ pre.pygments .tok-nl { color: #A0A000 } /* Name.Label */ pre.pygments .tok-nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ pre.pygments .tok-nt { color: #008000; font-weight: bold } /* Name.Tag */ pre.pygments .tok-nv { color: #19177C } /* Name.Variable */ pre.pygments .tok-ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ pre.pygments .tok-w { color: #bbbbbb } /* Text.Whitespace */ pre.pygments .tok-mb { color: #666666 } /* Literal.Number.Bin */ pre.pygments .tok-mf { color: #666666 } /* Literal.Number.Float */ pre.pygments .tok-mh { color: #666666 } /* Literal.Number.Hex */ pre.pygments .tok-mi { color: #666666 } /* Literal.Number.Integer */ pre.pygments .tok-mo { color: #666666 } /* Literal.Number.Oct */ pre.pygments .tok-sa { color: #BA2121 } /* Literal.String.Affix */ pre.pygments .tok-sb { color: #BA2121 } /* Literal.String.Backtick */ pre.pygments .tok-sc { color: #BA2121 } /* Literal.String.Char */ pre.pygments .tok-dl { color: #BA2121 } /* Literal.String.Delimiter */ pre.pygments .tok-sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ pre.pygments .tok-s2 { color: #BA2121 } /* Literal.String.Double */ pre.pygments .tok-se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ pre.pygments .tok-sh { color: #BA2121 } /* Literal.String.Heredoc */ pre.pygments .tok-si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ pre.pygments .tok-sx { color: #008000 } /* Literal.String.Other */ pre.pygments .tok-sr { color: #BB6688 } /* Literal.String.Regex */ pre.pygments .tok-s1 { color: #BA2121 } /* Literal.String.Single */ pre.pygments .tok-ss { color: #19177C } /* Literal.String.Symbol */ pre.pygments .tok-bp { color: #008000 } /* Name.Builtin.Pseudo */ pre.pygments .tok-fm { color: #0000FF } /* Name.Function.Magic */ pre.pygments .tok-vc { color: #19177C } /* Name.Variable.Class */ pre.pygments .tok-vg { color: #19177C } /* Name.Variable.Global */ pre.pygments .tok-vi { color: #19177C } /* Name.Variable.Instance */ pre.pygments .tok-vm { color: #19177C } /* Name.Variable.Magic */ pre.pygments .tok-il { color: #666666 } /* Literal.Number.Integer.Long */mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/pygments-lovelace.css000066400000000000000000000110331416264345000273370ustar00rootroot00000000000000pre.pygments .hll { background-color: #ffffcc } pre.pygments { background: #ffffff; } pre.pygments .tok-c { color: #888888; font-style: italic } /* Comment */ pre.pygments .tok-err { background-color: #a848a8 } /* Error */ pre.pygments .tok-k { color: #2838b0 } /* Keyword */ pre.pygments .tok-o { color: #666666 } /* Operator */ pre.pygments .tok-p { color: #888888 } /* Punctuation */ pre.pygments .tok-ch { color: #287088; font-style: italic } /* Comment.Hashbang */ pre.pygments .tok-cm { color: #888888; font-style: italic } /* Comment.Multiline */ pre.pygments .tok-cp { color: #289870 } /* Comment.Preproc */ pre.pygments .tok-cpf { color: #888888; font-style: italic } /* Comment.PreprocFile */ pre.pygments .tok-c1 { color: #888888; font-style: italic } /* Comment.Single */ pre.pygments .tok-cs { color: #888888; font-style: italic } /* Comment.Special */ pre.pygments .tok-gd { color: #c02828 } /* Generic.Deleted */ pre.pygments .tok-ge { font-style: italic } /* Generic.Emph */ pre.pygments .tok-gr { color: #c02828 } /* Generic.Error */ pre.pygments .tok-gh { color: #666666 } /* Generic.Heading */ pre.pygments .tok-gi { color: #388038 } /* Generic.Inserted */ pre.pygments .tok-go { color: #666666 } /* Generic.Output */ pre.pygments .tok-gp { color: #444444 } /* Generic.Prompt */ pre.pygments .tok-gs { font-weight: bold } /* Generic.Strong */ pre.pygments .tok-gu { color: #444444 } /* Generic.Subheading */ pre.pygments .tok-gt { color: #2838b0 } /* Generic.Traceback */ pre.pygments .tok-kc { color: #444444; font-style: italic } /* Keyword.Constant */ pre.pygments .tok-kd { color: #2838b0; font-style: italic } /* Keyword.Declaration */ pre.pygments .tok-kn { color: #2838b0 } /* Keyword.Namespace */ pre.pygments .tok-kp { color: #2838b0 } /* Keyword.Pseudo */ pre.pygments .tok-kr { color: #2838b0 } /* Keyword.Reserved */ pre.pygments .tok-kt { color: #2838b0; font-style: italic } /* Keyword.Type */ pre.pygments .tok-m { color: #444444 } /* Literal.Number */ pre.pygments .tok-s { color: #b83838 } /* Literal.String */ pre.pygments .tok-na { color: #388038 } /* Name.Attribute */ pre.pygments .tok-nb { color: #388038 } /* Name.Builtin */ pre.pygments .tok-nc { color: #287088 } /* Name.Class */ pre.pygments .tok-no { color: #b85820 } /* Name.Constant */ pre.pygments .tok-nd { color: #287088 } /* Name.Decorator */ pre.pygments .tok-ni { color: #709030 } /* Name.Entity */ pre.pygments .tok-ne { color: #908828 } /* Name.Exception */ pre.pygments .tok-nf { color: #785840 } /* Name.Function */ pre.pygments .tok-nl { color: #289870 } /* Name.Label */ pre.pygments .tok-nn { color: #289870 } /* Name.Namespace */ pre.pygments .tok-nt { color: #2838b0 } /* Name.Tag */ pre.pygments .tok-nv { color: #b04040 } /* Name.Variable */ pre.pygments .tok-ow { color: #a848a8 } /* Operator.Word */ pre.pygments .tok-w { color: #a89028 } /* Text.Whitespace */ pre.pygments .tok-mb { color: #444444 } /* Literal.Number.Bin */ pre.pygments .tok-mf { color: #444444 } /* Literal.Number.Float */ pre.pygments .tok-mh { color: #444444 } /* Literal.Number.Hex */ pre.pygments .tok-mi { color: #444444 } /* Literal.Number.Integer */ pre.pygments .tok-mo { color: #444444 } /* Literal.Number.Oct */ pre.pygments .tok-sa { color: #444444 } /* Literal.String.Affix */ pre.pygments .tok-sb { color: #b83838 } /* Literal.String.Backtick */ pre.pygments .tok-sc { color: #a848a8 } /* Literal.String.Char */ pre.pygments .tok-dl { color: #b85820 } /* Literal.String.Delimiter */ pre.pygments .tok-sd { color: #b85820; font-style: italic } /* Literal.String.Doc */ pre.pygments .tok-s2 { color: #b83838 } /* Literal.String.Double */ pre.pygments .tok-se { color: #709030 } /* Literal.String.Escape */ pre.pygments .tok-sh { color: #b83838 } /* Literal.String.Heredoc */ pre.pygments .tok-si { color: #b83838; text-decoration: underline } /* Literal.String.Interpol */ pre.pygments .tok-sx { color: #a848a8 } /* Literal.String.Other */ pre.pygments .tok-sr { color: #a848a8 } /* Literal.String.Regex */ pre.pygments .tok-s1 { color: #b83838 } /* Literal.String.Single */ pre.pygments .tok-ss { color: #b83838 } /* Literal.String.Symbol */ pre.pygments .tok-bp { color: #388038; font-style: italic } /* Name.Builtin.Pseudo */ pre.pygments .tok-fm { color: #b85820 } /* Name.Function.Magic */ pre.pygments .tok-vc { color: #b04040 } /* Name.Variable.Class */ pre.pygments .tok-vg { color: #908828 } /* Name.Variable.Global */ pre.pygments .tok-vi { color: #b04040 } /* Name.Variable.Instance */ pre.pygments .tok-vm { color: #b85820 } /* Name.Variable.Magic */ pre.pygments .tok-il { color: #444444 } /* Literal.Number.Integer.Long */mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/pygments-manni.css000066400000000000000000000114251416264345000266540ustar00rootroot00000000000000pre.pygments .hll { background-color: #ffffcc } pre.pygments { background: #f0f3f3; } pre.pygments .tok-c { color: #0099FF; font-style: italic } /* Comment */ pre.pygments .tok-err { color: #AA0000; background-color: #FFAAAA } /* Error */ pre.pygments .tok-k { color: #006699; font-weight: bold } /* Keyword */ pre.pygments .tok-o { color: #555555 } /* Operator */ pre.pygments .tok-ch { color: #0099FF; font-style: italic } /* Comment.Hashbang */ pre.pygments .tok-cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ pre.pygments .tok-cp { color: #009999 } /* Comment.Preproc */ pre.pygments .tok-cpf { color: #0099FF; font-style: italic } /* Comment.PreprocFile */ pre.pygments .tok-c1 { color: #0099FF; font-style: italic } /* Comment.Single */ pre.pygments .tok-cs { color: #0099FF; font-weight: bold; font-style: italic } /* Comment.Special */ pre.pygments .tok-gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ pre.pygments .tok-ge { font-style: italic } /* Generic.Emph */ pre.pygments .tok-gr { color: #FF0000 } /* Generic.Error */ pre.pygments .tok-gh { color: #003300; font-weight: bold } /* Generic.Heading */ pre.pygments .tok-gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ pre.pygments .tok-go { color: #AAAAAA } /* Generic.Output */ pre.pygments .tok-gp { color: #000099; font-weight: bold } /* Generic.Prompt */ pre.pygments .tok-gs { font-weight: bold } /* Generic.Strong */ pre.pygments .tok-gu { color: #003300; font-weight: bold } /* Generic.Subheading */ pre.pygments .tok-gt { color: #99CC66 } /* Generic.Traceback */ pre.pygments .tok-kc { color: #006699; font-weight: bold } /* Keyword.Constant */ pre.pygments .tok-kd { color: #006699; font-weight: bold } /* Keyword.Declaration */ pre.pygments .tok-kn { color: #006699; font-weight: bold } /* Keyword.Namespace */ pre.pygments .tok-kp { color: #006699 } /* Keyword.Pseudo */ pre.pygments .tok-kr { color: #006699; font-weight: bold } /* Keyword.Reserved */ pre.pygments .tok-kt { color: #007788; font-weight: bold } /* Keyword.Type */ pre.pygments .tok-m { color: #FF6600 } /* Literal.Number */ pre.pygments .tok-s { color: #CC3300 } /* Literal.String */ pre.pygments .tok-na { color: #330099 } /* Name.Attribute */ pre.pygments .tok-nb { color: #336666 } /* Name.Builtin */ pre.pygments .tok-nc { color: #00AA88; font-weight: bold } /* Name.Class */ pre.pygments .tok-no { color: #336600 } /* Name.Constant */ pre.pygments .tok-nd { color: #9999FF } /* Name.Decorator */ pre.pygments .tok-ni { color: #999999; font-weight: bold } /* Name.Entity */ pre.pygments .tok-ne { color: #CC0000; font-weight: bold } /* Name.Exception */ pre.pygments .tok-nf { color: #CC00FF } /* Name.Function */ pre.pygments .tok-nl { color: #9999FF } /* Name.Label */ pre.pygments .tok-nn { color: #00CCFF; font-weight: bold } /* Name.Namespace */ pre.pygments .tok-nt { color: #330099; font-weight: bold } /* Name.Tag */ pre.pygments .tok-nv { color: #003333 } /* Name.Variable */ pre.pygments .tok-ow { color: #000000; font-weight: bold } /* Operator.Word */ pre.pygments .tok-w { color: #bbbbbb } /* Text.Whitespace */ pre.pygments .tok-mb { color: #FF6600 } /* Literal.Number.Bin */ pre.pygments .tok-mf { color: #FF6600 } /* Literal.Number.Float */ pre.pygments .tok-mh { color: #FF6600 } /* Literal.Number.Hex */ pre.pygments .tok-mi { color: #FF6600 } /* Literal.Number.Integer */ pre.pygments .tok-mo { color: #FF6600 } /* Literal.Number.Oct */ pre.pygments .tok-sa { color: #CC3300 } /* Literal.String.Affix */ pre.pygments .tok-sb { color: #CC3300 } /* Literal.String.Backtick */ pre.pygments .tok-sc { color: #CC3300 } /* Literal.String.Char */ pre.pygments .tok-dl { color: #CC3300 } /* Literal.String.Delimiter */ pre.pygments .tok-sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ pre.pygments .tok-s2 { color: #CC3300 } /* Literal.String.Double */ pre.pygments .tok-se { color: #CC3300; font-weight: bold } /* Literal.String.Escape */ pre.pygments .tok-sh { color: #CC3300 } /* Literal.String.Heredoc */ pre.pygments .tok-si { color: #AA0000 } /* Literal.String.Interpol */ pre.pygments .tok-sx { color: #CC3300 } /* Literal.String.Other */ pre.pygments .tok-sr { color: #33AAAA } /* Literal.String.Regex */ pre.pygments .tok-s1 { color: #CC3300 } /* Literal.String.Single */ pre.pygments .tok-ss { color: #FFCC33 } /* Literal.String.Symbol */ pre.pygments .tok-bp { color: #336666 } /* Name.Builtin.Pseudo */ pre.pygments .tok-fm { color: #CC00FF } /* Name.Function.Magic */ pre.pygments .tok-vc { color: #003333 } /* Name.Variable.Class */ pre.pygments .tok-vg { color: #003333 } /* Name.Variable.Global */ pre.pygments .tok-vi { color: #003333 } /* Name.Variable.Instance */ pre.pygments .tok-vm { color: #003333 } /* Name.Variable.Magic */ pre.pygments .tok-il { color: #FF6600 } /* Literal.Number.Integer.Long */mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/smlnj-lib-base_css.in000066400000000000000000000733221416264345000271770ustar00rootroot00000000000000/* Modified version of default asciidoctor.css */ /* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ /* Uncomment @import statement when using as custom stylesheet */ /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} audio,canvas,video{display:inline-block} audio:not([controls]){display:none;height:0} script{display:none!important} html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} a{background:none} a:focus{outline:thin dotted} a:active,a:hover{outline:0} h1{font-size:2em;margin:.67em 0} abbr[title]{border-bottom:1px dotted} b,strong{font-weight:bold} dfn{font-style:italic} hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} mark{background:#ff0;color:#000} code,kbd,pre,samp{font-family:monospace;font-size:1em} pre{white-space:pre-wrap} q{quotes:"\201C" "\201D" "\2018" "\2019"} small{font-size:80%} sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} sup{top:-.5em} sub{bottom:-.25em} img{border:0} svg:not(:root){overflow:hidden} figure{margin:0} fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} legend{border:0;padding:0} button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} button,input{line-height:normal} button,select{text-transform:none} button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} button[disabled],html input[disabled]{cursor:default} input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} textarea{overflow:auto;vertical-align:top} table{border-collapse:collapse;border-spacing:0} *,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} html,body{font-size:100%} body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} a:hover{cursor:pointer} img,object,embed{max-width:100%;height:auto} object,embed{height:100%} img{-ms-interpolation-mode:bicubic} .left{float:left!important} .right{float:right!important} .text-left{text-align:left!important} .text-right{text-align:right!important} .text-center{text-align:center!important} .text-justify{text-align:justify!important} .hide{display:none} img,object,svg{display:inline-block;vertical-align:middle} textarea{height:auto;min-height:50px} select{width:100%} .center{margin-left:auto;margin-right:auto} .stretch{width:100%} .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} a{color:#2156a5;text-decoration:underline;line-height:inherit} a:hover,a:focus{color:#1d4b8f} a img{border:0} p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} p aside{font-size:.875em;line-height:1.35;font-style:italic} h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} h1{font-size:2.125em} h2{font-size:1.6875em} h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} h4,h5{font-size:1.125em} h6{font-size:1em} hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} em,i{font-style:italic;line-height:inherit} strong,b{font-weight:bold;line-height:inherit} small{font-size:60%;line-height:inherit} code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} ul,ol{margin-left:1.5em} ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} ul.square{list-style-type:square} ul.circle{list-style-type:circle} ul.disc{list-style-type:disc} ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} dl dt{margin-bottom:.3125em;font-weight:bold} dl dd{margin-bottom:1.25em} abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} abbr{text-transform:none} blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} blockquote cite::before{content:"\2014 \0020"} blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} @media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} h1{font-size:2.75em} h2{font-size:2.3125em} h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} h4{font-size:1.4375em}} table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} table thead,table tfoot{background:#f7f8f7} table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} table tr.even,table tr.alt{background:#f8f8f7} table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} .clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} .clearfix::after,.float-group::after{clear:both} :not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} :not(pre)>code.nobreak{word-wrap:normal} :not(pre)>code.nowrap{white-space:nowrap} pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} pre>code{display:block} pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} em em{font-style:normal} strong strong{font-weight:400} .keyseq{color:rgba(51,51,51,.8)} kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} .keyseq kbd:first-child{margin-left:0} .keyseq kbd:last-child{margin-right:0} .menuseq,.menuref{color:#000} .menuseq b:not(.caret),.menuref{font-weight:inherit} .menuseq{word-spacing:-.02em} .menuseq b.caret{font-size:1.25em;line-height:.8} .menuseq i.caret{font-weight:bold;text-align:center;width:.45em} b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} b.button::before{content:"[";padding:0 3px 0 2px} b.button::after{content:"]";padding:0 2px 0 3px} p a>code:hover{color:rgba(0,0,0,.9)} #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} #header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} #header::after,#content::after,#footnotes::after,#footer::after{clear:both} #content{margin-top:1.25em} #content::before{content:none} #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} #header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} #header .details span:first-child{margin-left:-.125em} #header .details span.email a{color:rgba(0,0,0,.85)} #header .details br{display:none} #header .details br+span::before{content:"\00a0\2013\00a0"} #header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} #header .details br+span#revremark::before{content:"\00a0|\00a0"} #header #revnumber{text-transform:capitalize} #header #revnumber::after{content:"\00a0"} #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} #toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} #toc>ul{margin-left:.125em} #toc ul.sectlevel0>li>a{font-style:italic} #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} #toc li{line-height:1.3334;margin-top:.3334em} #toc a{text-decoration:none} #toc a:active{text-decoration:underline} #toctitle{color:#7a2518;font-size:1.2em} @media screen and (min-width:768px){#toctitle{font-size:1.375em} body.toc2{padding-left:15em;padding-right:0} #toc.toc2{ margin-top:0!important; background:#f8f8f7; position:fixed; width:15em; left:0; top:0; border-right:1px solid #e7e7e9; border-top-width:0!important; border-bottom-width:0!important; z-index:1000; padding:1.25em 1em; height:100%; overflow:auto } #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} #toc.toc2>ul{font-size:.9em;margin-bottom:0} #toc.toc2 ul ul{margin-left:0;padding-left:1em} #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} body.toc2.toc-right{padding-left:0;padding-right:15em} body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} @media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} #toc.toc2{width:20em} #toc.toc2 #toctitle{font-size:1.375em} #toc.toc2>ul{font-size:.95em} #toc.toc2 ul ul{padding-left:1.25em} body.toc2.toc-right{padding-left:0;padding-right:20em}} #content #toc{ border-style:solid; border-width:1px; border-color:#e0e0dc; margin-bottom:1.25em; padding:1.25em; background:#f8f8f7; -webkit-border-radius:4px; border-radius:4px } #content #toc>:first-child{margin-top:0} #content #toc>:last-child{margin-bottom:0} #footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} #footer-text{color:rgba(255,255,255,.8);line-height:1.44} #content{margin-bottom:.625em} .sect1{padding-bottom:.625em} @media screen and (min-width:768px){#content{margin-bottom:1.25em} .sect1{padding-bottom:1.25em}} .sect1:last-child{padding-bottom:0} .sect1+.sect1{border-top:1px solid #e7e7e9} #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} #content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} .paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} .admonitionblock>table td.icon{text-align:center;width:80px} .admonitionblock>table td.icon img{max-width:none} .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} .exampleblock>.content>:first-child{margin-top:0} .exampleblock>.content>:last-child{margin-bottom:0} .sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} .sidebarblock>:first-child{margin-top:0} .sidebarblock>:last-child{margin-bottom:0} .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} .literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} @media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} @media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} .literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} .listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} .listingblock>.content{position:relative} .listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} .listingblock:hover code[data-lang]::before{display:block} .listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} .listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} .listingblock pre.highlightjs{padding:0} .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} .listingblock pre.prettyprint{border-width:0} .prettyprint{background:#f7f7f8} pre.prettyprint .linenums{line-height:1.45;margin-left:2em} pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} pre.prettyprint li code[data-lang]::before{opacity:1} pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} table.linenotable td.code{padding-left:.75em} table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} pre.pygments .lineno::before{content:"";margin-right:-.125em} .quoteblock{margin:0 1em 1.25em 1.5em;display:table} .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em} .quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} .quoteblock blockquote{margin:0;padding:0;border:0} .quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} .quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} .verseblock{margin:0 1em 1.25em} .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} .verseblock pre strong{font-weight:400} .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} .quoteblock .attribution br,.verseblock .attribution br{display:none} .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} .quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} .quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} .quoteblock.abstract{margin:0 1em 1.25em;display:block} .quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} .quoteblock.excerpt,.quoteblock .quoteblock{margin:0 0 1.25em;padding:0 0 .25em 1em;border-left:.25em solid #dddddf} .quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} .quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} table.tableblock{max-width:100%;border-collapse:separate} p.tableblock:last-child{margin-bottom:0} td.tableblock>.content{margin-bottom:-1.25em} table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} table.frame-all{border-width:1px} table.frame-sides{border-width:0 1px} table.frame-topbot,table.frame-ends{border-width:1px 0} table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} th.halign-left,td.halign-left{text-align:left} th.halign-right,td.halign-right{text-align:right} th.halign-center,td.halign-center{text-align:center} th.valign-top,td.valign-top{vertical-align:top} th.valign-bottom,td.valign-bottom{vertical-align:bottom} th.valign-middle,td.valign-middle{vertical-align:middle} table thead th,table tfoot th{font-weight:bold} tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} p.tableblock>code:only-child{background:none;padding:0} p.tableblock{font-size:1em} ol{margin-left:1.75em} ul li ol{margin-left:1.5em} dl dd{margin-left:1.125em} dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} ul.unstyled,ol.unstyled{margin-left:0} ul.checklist{margin-left:.625em} ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} ul.inline>li{margin-left:1.25em} .unstyled dl dt{font-weight:400;font-style:normal} ol.arabic{list-style-type:decimal} ol.decimal{list-style-type:decimal-leading-zero} ol.loweralpha{list-style-type:lower-alpha} ol.upperalpha{list-style-type:upper-alpha} ol.lowerroman{list-style-type:lower-roman} ol.upperroman{list-style-type:upper-roman} ol.lowergreek{list-style-type:lower-greek} .hdlist>table,.colist>table{border:0;background:none} .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} td.hdlist1{font-weight:bold;padding-bottom:1.25em} .literalblock+.colist,.listingblock+.colist{margin-top:-.5em} .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} .colist td:not([class]):first-child img{max-width:none} .colist td:not([class]):last-child{padding:.25em 0} .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} .imageblock.left{margin:.25em .625em 1.25em 0} .imageblock.right{margin:.25em 0 1.25em .625em} .imageblock>.title{margin-bottom:0} .imageblock.thumb,.imageblock.th{border-width:6px} .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} .image.left{margin-right:.625em} .image.right{margin-left:.625em} a.image{text-decoration:none;display:inline-block} a.image object{pointer-events:none} sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} sup.footnote a,sup.footnoteref a{text-decoration:none} sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} #footnotes .footnote:last-of-type{margin-bottom:0} #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} .gist .file-data>table td.line-data{width:99%} div.unbreakable{page-break-inside:avoid} .big{font-size:larger} .small{font-size:smaller} .underline{text-decoration:underline} .overline{text-decoration:overline} .line-through{text-decoration:line-through} .aqua{color:#00bfbf} .aqua-background{background:#00fafa} .black{color:#000} .black-background{background:#000} .blue{color:#0000bf} .blue-background{background:#0000fa} .fuchsia{color:#bf00bf} .fuchsia-background{background:#fa00fa} .gray{color:#606060} .gray-background{background:#7d7d7d} .green{color:#006000} .green-background{background:#007d00} .lime{color:#00bf00} .lime-background{background:#00fa00} .maroon{color:#600000} .maroon-background{background:#7d0000} .navy{color:#000060} .navy-background{background:#00007d} .olive{color:#606000} .olive-background{background:#7d7d00} .purple{color:#600060} .purple-background{background:#7d007d} .red{color:#bf0000} .red-background{background:#fa0000} .silver{color:#909090} .silver-background{background:#bcbcbc} .teal{color:#006060} .teal-background{background:#007d7d} .white{color:#bfbfbf} .white-background{background:#fafafa} .yellow{color:#bfbf00} .yellow-background{background:#fafa00} span.icon>.fa{cursor:default} a span.icon>.fa{cursor:inherit} .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} .admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} .admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} .admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} .admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} .admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} .conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} .conum[data-value] *{color:#fff!important} .conum[data-value]+b{display:none} .conum[data-value]::after{content:attr(data-value)} pre .conum[data-value]{position:relative;top:-.125em} b.conum *{color:inherit!important} .conum:not([data-value]):empty{display:none} dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} h1,h2,p,td.content,span.alt{letter-spacing:-.01em} p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} p{margin-bottom:1.25rem} .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} .exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} .print-only{display:none!important} @page{margin:1.25cm .75cm} @media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} html{font-size:80%} a{color:inherit!important;text-decoration:underline!important} a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} abbr[title]::after{content:" (" attr(title) ")"} pre,blockquote,tr,img,object,svg{page-break-inside:avoid} thead{display:table-header-group} svg{max-width:100%} p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} #toc,.sidebarblock,.exampleblock>.content{background:none!important} #toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} body.book #header{text-align:center} body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} body.book #header .details{border:0!important;display:block;padding:0!important} body.book #header .details span:first-child{margin-left:0!important} body.book #header .details br{display:block} body.book #header .details br+span::before{content:none!important} body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} .listingblock code[data-lang]::before{display:block} #footer{padding:0 .9375em} .hide-on-print{display:none!important} .print-only{display:block!important} .hide-for-print{display:none!important} .show-for-print{display:inherit!important}} @media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} .sect1{padding:0!important} .sect1+.sect1{border:0} #footer{background:none} #footer-text{color:rgba(0,0,0,.6);font-size:.9em}} @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} /* additional code styling support */ dt > code { color: #19177C } /* tok-nv in pygments */ code > span.kw { color: #008000; font-weight: bold } /* tok-k in pygments */ code > span.tv { color: #AA22FF } /* tok-nd in pygments */ code > span.ty { color: #B00040 } /* tok-kt in pygments */ code > span.con { color: #0000FF; font-weight: bold } /* tok-nc in pygments */ mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/smlnj-lib-pygments_css.in000066400000000000000000000033021416264345000301220ustar00rootroot00000000000000/* pygmentize filter for SML code */ pre.pygments .hll { background-color: #ffffcc } pre.pygments { font-size: 0.9em; background: @CODE_BACKGROUND@; } /* code background */ pre.pygments .tok-k { color: @KW_COLOR@; font-weight: bold } /* Keyword */ pre.pygments .tok-kr { color: @KW_COLOR@; font-weight: bold; } /* keywords */ pre.pygments .tok-kt { color: @TY_COLOR@; } /* type */ pre.pygments .tok-o { color: @KW_COLOR@; } /* Operator */ pre.pygments .tok-c { color: @COM_COLOR@; font-style: italic; } /* comments */ pre.pygments .tok-cm { color: @COM_COLOR@; font-style: italic; } /* comments */ pre.pygments .tok-s2 { color: @LIT_COLOR@; } /* strings */ pre.pygments .tok-mb { color: @LIT_COLOR@; } /* Literal.Number.Bin */ pre.pygments .tok-mf { color: @LIT_COLOR@; } /* Literal.Number.Float */ pre.pygments .tok-mh { color: @LIT_COLOR@; } /* Literal.Number.Hex */ pre.pygments .tok-mi { color: @LIT_COLOR@; } /* Literal.Number.Integer */ pre.pygments .tok-mo { color: @LIT_COLOR@; } /* Literal.Number.Oct */ pre.pygments .tok-kt { color: @BIND_COLOR@; } /* lhs type names */ pre.pygments .tok-n { color: @CODE_COLOR@; } /* type names on rhs; parameters */ pre.pygments .tok-p { color: @PUNCT_COLOR@; } /* punctuation */ pre.pygments .tok-nn { color: @BIND_COLOR@; font-weight: bold; } /* Module names */ pre.pygments .tok-nv { color: @BIND_COLOR@; font-weight: bold; } /* variable names in val bindings */ pre.pygments .tok-nf { color: @BIND_COLOR@; font-weight: bold; } /* function names in fun bindings */ pre.pygments .tok-nc { color: @BIND_COLOR@; font-weight: bold; } /* data constructor name in rhs of datatype */ pre.pygments .tok-nd { color: @TV_COLOR@; } /* type variable */ mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/src/styles/smlnj-lib_css.in000066400000000000000000000063131416264345000262630ustar00rootroot00000000000000/* CSS for SML/NJ Library documentation * This file overrides the default asciidoctor definitions * in smlnj-lib-base.css. */ /* page layout */ #layout-top-mask { /* masks out scrolling material */ position: fixed; top: 0px; left: 0px; height: 2em; width: 100%; background-color: @BACKGROUND@; z-index: 5; } #layout-main { margin: 0.5em 0.5em 0.5em 0.5em; } #layout-banner-spacer { position: relative; width: 100%; height: 10em; clear: both; } #layout-banner { margin: 0; padding: 1.25em; background-color: @BANNER_BACKGROUND@; font-family: Arial, Helvetica, Geneva, sans-serif; text-align: left; -webkit-border-top-left-radius: 1em; -webkit-border-top-right-radius: 1em; -webkit-border-bottom-right-radius: 1em; -moz-border-radius-topright: 1em; -moz-border-radius-bottomright: 1em; border-top-right-radius: 1em; border-bottom-right-radius: 1em; position: fixed; top: 0.5em; /* should match layout-main margin */ left: 0.5em; right: 0.5em; z-index: 10; } #layout-title { height: 7.5em; color: @TITLE_COLOR@; } #layout-title-main { font-size: 4.0em; margin: 0 0 5px; color: inherit; } #layout-title-main a { color: inherit; text-decoration: none; } #layout-title-description { font-size: 2.4em; margin: 0; color: inherit; } #layout-title-description code { color: inherit; background-color: inherit; } #layout-logo { height: 7.5em; float: left; width: 14em; } #layout-logo img { height: 7.5em; max-width: none; /* override smlnj-lib-base.css */ } #layout-toc { position: fixed; left: 0.5em; width: 15em; top: 10em; bottom: 0; z-index: 2; background-color: @BANNER_BACKGROUND@; color: @TITLE_COLOR@; overflow: auto; } #layout-content-box { margin-left: 15em; z-index: 0; } #layout-footer-box { margin-left: 15em; margin-top: 4.0em; padding-left: 1.0em; padding-right: 0.4em; padding-top: 0.5em; } #layout-footer { border-top: 2px solid @HR_COLOR@; } #layout-footer-text { float: left; font-size: 0.8em; padding-top: 0.2em; padding-bottom: 0.5em; border-bottom: 2px solid @HR_COLOR@; margin-bottom: 1em; } /* Navigation (aka TOC) */ #toc { margin-top: 2em; margin-left: 0; margin-bottom: 2em; } #toc>:first-child{margin-top:0} #toc>:last-child{margin-bottom:0} #toc a{ color: inherit; background-color: inherit; text-decoration: none; } #toc a:hover{ background-color: @TOC_HIGHLIGHT@; } #toc code{ color: inherit; background-color: inherit; } ul.toc-lib-list{ font-size: 1.1em; list-style-type:none; padding: 0; margin-left: 0; } li.toc-lib{ margin-left: 0; margin-bottom: 0.2em; padding: 2px; } ul.toc-page-list{ font-size: 0.9em; list-style-type: none; padding: 0; margin-left: 1em; } li.toc-page{ margin-left: 0; margin-bottom: 0.2em; padding: 2px; } #toc-current { color: blue; } /* additional code styling support */ dt > code { color: #19177C } /* tok-nv in pygments */ code > span.kw { color: @KW_COLOR@; font-weight: bold } /* tok-k in pygments */ code > span.tv { color: #AA22FF } /* tok-nd in pygments */ code > span.ty { color: #B00040 } /* tok-kt in pygments */ code > span.con { color: @BIND_COLOR@; font-weight: bold } /* tok-nc in pygments */ mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/000077500000000000000000000000001416264345000222175ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/Makefile.in000066400000000000000000000010151416264345000242610ustar00rootroot00000000000000# Makefile.in # # COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) # All rights reserved. # # Makefile for SML/NJ Library documentation tools # # @configure_input@ # SHELL = @SHELL@ INSTALL = @INSTALL@ @SET_MAKE@ SUBDIRS = make-index gen-pages .PHONY: install install: for d in $(SUBDIRS) ; do \ (cd $$d && $(MAKE) install) || exit $$?; \ done include @MK_DIR@/clean-rules.gmk CLEAN_FILES = CLEAN_SUBDIRS = $(DOC_SUBDIRS) CLEANDIST_FILES = $(TOOL_BIN_DIR)/* $(TOOL_BIN_DIR)/.heap mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/README.md000066400000000000000000000002211416264345000234710ustar00rootroot00000000000000This directory tree contains some tools for extracting information from the document sources that can used for generating HTML navigation, etc. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/000077500000000000000000000000001416264345000240655ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/Makefile.in000066400000000000000000000012611416264345000261320ustar00rootroot00000000000000# Makefile.in # # COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) # All rights reserved. # # Makefile for gen-pages tool # # @configure_input@ # SHELL = @SHELL@ INSTALL = @INSTALL@ @SET_MAKE@ TOOL_BIN = @TOOL_BIN_DIR@ ML_BUILD = @ML_BUILD@ HEAP_SUFFIX = @SMLNJ_HEAP_SUFFIX@ INSTALL_WRAPPER = @ROOT_DIR@/bin/install-sml-wrapper.sh PROGRAM = gen-pages HEAP_IMAGE = $(PROGRAM).$(HEAP_SUFFIX) .PHONY: install install: $(HEAP_IMAGE) $(INSTALL_WRAPPER) $(PROGRAM) $(TOOL_BIN) $(HEAP_IMAGE): $(wildcard ../*.sml) $(wildcard *.sml) $(ML_BUILD) sources.cm Main.main $(PROGRAM) include @MK_DIR@/clean-rules.gmk CLEAN_FILES = $(HEAP_IMAGE) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/config_sml.in000066400000000000000000000005361416264345000265410ustar00rootroot00000000000000(* config_sml.in * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Information set by the configuration. *) structure Config = struct val releaseDate = "@SMLNJ_DATE@" val version = "@SMLNJ_VERSION@" val asciidoctor = "@ASCIIDOCTOR@" val fragDir = "@SRC_DIR@/fragments" end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/copy-file.sml000066400000000000000000000043771416264345000265040ustar00rootroot00000000000000(* copy-file.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure CopyFile : sig (* `copy subst (srcFile, outS)` copys the contents of `srcFile` to the output * stream while replacing strings of the form `@name@` with `value` where * `(name, value)` occurs in the substitution list `subst`. *) val copy : (string * string) list -> string * TextIO.outstream -> unit end = struct structure SS = Substring structure Tbl = HashTableFn ( struct type hash_key = substring val hashVal = HashString.hashSubstring fun sameKey (ss1, ss2) = (SS.compare (ss1, ss2) = EQUAL) end) fun copy subst = let val find = let val tbl = Tbl.mkTable (List.length subst, Fail "subst-tbl") fun ins (ss1, s2) = Tbl.insert tbl (SS.full ss1, s2) in ins ("", "@"); (* map "@@" to "@" *) List.app ins subst; Tbl.find tbl end fun rewriteLine (outS, ln) = let fun scanLine ss = let val (prefix, rest) = SS.splitl (fn #"@" => false | _ => true) ss in TextIO.outputSubstr (outS, prefix); if (SS.size rest = 0) then () else scanPlaceholder (SS.triml 1 rest) end (* scan a `@NAME@` placeholder starting from the first character of `NAME` *) and scanPlaceholder start = let fun scan (ss, n) = (case SS.getc ss of NONE => raise Fail "Incomplete placeholder" | SOME(#"@", rest) => (SS.slice(start, 0, SOME n), rest) | SOME(_, rest) => scan (rest, n+1) (* end case *)) val (placeholder, rest) = scan (start, 0) in case find placeholder of SOME expansion => ( TextIO.output(outS, expansion); scanLine rest) | NONE => raise Fail(concat[ "unknown placeholder @", SS.string placeholder, "@" ]) (* end case *) end in scanLine (SS.full ln) end fun rewrite (srcFile, outS) = let val inS = TextIO.openIn srcFile fun lp () = (case TextIO.inputLine inS of NONE => TextIO.closeIn inS | SOME s => (rewriteLine(outS, s); lp ()) (* end case *)) in lp() end in rewrite end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/gen-toc.sml000066400000000000000000000107211416264345000261370ustar00rootroot00000000000000(* gen-toc.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This module is used to generate the HTML fragment for a sidebar * table of contents. * * TODO: eventually, we should include the individual definitions from * the file in the sidebar. *) structure GenTOC : sig val root : FileTree.t -> TextIO.outstream -> unit val lib : FileTree.t * FileTree.library -> TextIO.outstream -> unit val page : FileTree.t * FileTree.library * FileTree.page -> TextIO.outstream -> unit end = struct structure FT = FileTree fun pr (outS, s) = TextIO.output(outS, s) fun prl (outS, s) = TextIO.output(outS, concat s) fun doTOC outS f = ( prl (outS, [ "
\n", "
\n" ]); f outS; prl (outS, [ "
\n", "
\n" ])) val styleText = Util.style (* returns the title string for the opening of a library item in the library * list. The flags are as follows: * link -- generate an HREF link * cur -- this library is the current page * inRoot -- the containing page is at root level *) fun libItemOpen {lib, link, cur, inRoot} = let val FT.FILE{dir, stem, title, ...} = lib val s = if link then [""] else [] val s = if cur then "" :: styleText title :: "" :: s else "" :: styleText title :: "" :: s val s = if link then let val dir = if inRoot orelse cur then dir else "../" ^ dir in "" :: s end else s val s = "
  • " :: s in concat s end (* returns the string for a page item in the pages list. The * flags are as follows: * link -- generate an HREF link * cur -- this library is the current page *) fun pageItem {page, link, cur} = let val title = styleText(FT.getTitle page) val s = if link then ["
  • "] else [""] val s = if cur then "" :: title :: "" :: s else "" :: title :: "" :: s val s = if link then "" :: s else s val s = "
  • " :: s in concat s end fun doRoot outS (true, _) = pr(outS, "
      \n") | doRoot outS (false, _) = pr(outS, "
    \n") (* generate a TOC file for the root page *) fun root (ft) outS = doTOC outS (fn outS => let fun doLib (true, _, lib) = prl(outS, [ " ", libItemOpen{lib=lib, link=true, cur=false, inRoot=true} ]) | doLib (false, _, _) = pr(outS, "
  • \n") in FT.walk { root = doRoot outS, lib = doLib, page = fn _ => () } ft end) (* generate a TOC file for a library page *) fun lib (ft, lib) outS = doTOC outS (fn outS => let fun doLib (true, _, lib') = let val cur = FT.same(lib, lib') in prl(outS, [ " ", libItemOpen{lib=lib', link=not cur, cur=cur, inRoot=false} ]); if cur then pr(outS, "\n
      \n") else () end | doLib (false, _, lib') = if FT.same(lib, lib') then prl(outS, ["
    \n", " \n"]) else pr(outS, "\n") fun doPage (_, lib', page) = if FT.same(lib, lib') then prl(outS, [ " ", pageItem {page=page, link=true, cur=false}, "\n" ]) else () in FT.walk { root = doRoot outS, lib = doLib, page = doPage } ft end) (* generate a TOC file for a manual page *) fun page (ft, lib, page) outS = doTOC outS (fn outS => let fun doLib (true, _, lib') = let val cur = FT.same(lib, lib') in prl(outS, [ " ", libItemOpen{lib=lib', link=true, cur=false, inRoot=false} ]); if cur then pr(outS, "\n
      \n") else () end | doLib (false, _, lib') = if FT.same(lib, lib') then prl(outS, ["
    \n", " \n"]) else pr(outS, "\n") fun doPage (_, lib', page') = if FT.same(lib, lib') then let val cur = FT.same(page, page') in prl(outS, [ " ", pageItem {page=page', link=not cur, cur=cur}, "\n" ]) end else () in FT.walk { root = doRoot outS, lib = doLib, page = doPage } ft end) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/main.sml000066400000000000000000000071661416264345000255400ustar00rootroot00000000000000(* main.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Main function for *gen-pages* tool. This program has the following * usage: * * gen-pages [options] * * Options: * * -h, --help print help message and exit * -v, --verbose run in verbose mode * --release-date= * --version= * --base-url= * --basis-lib-url= * --index= * *) structure Main : sig val main : string * string list -> OS.Process.status end = struct structure FT = FileTree structure P = OS.Path (* TODO: support relative path for @IMAGES_URL@. The actual value depends on * the path of the file we are generating, since we may need an extra ".." prefix. *) (* create a copy-file function with the specified substitutions *) fun copy {meta : FT.meta, title, file, base} = let val d = Date.fromTimeUniv(OS.FileSys.modTime file) val date = Date.fmt "%Y-%m-%d" d val time = Date.fmt "%H:%M:%S UTC" d val imagesURL = Option.getOpt(!Options.imagesURL, base ^ "images") val substs = [ ("STYLED-TITLE", Util.style title), ("DATE", !Options.releaseDate), ("VERSION", !Options.version), ("FILEDATE", date), ("FILETIME", time), ("BASE", base), ("IMAGES_URL", imagesURL) ] fun metaStr (k, v) = concat[ "\n " ] (* the contents of the element in the <head> *) val substs = (case #title meta of SOME s => ("TITLE", s) :: substs | NONE => ("TITLE", Util.clean title) :: substs (* end case *)) val substs = (case #author meta of SOME s => ("AUTHOR", metaStr("author", s)) :: substs | NONE => ("AUTHOR", "") :: substs (* end case *)) val substs = (case #kws meta of [] => ("KEYWORDS", "") :: substs | l => ("KEYWORDS", metaStr("keywords", String.concatWith "," l)) :: substs (* end case *)) in CopyFile.copy substs end fun gen genTOC (FT.FILE{dir, stem, title, meta, ...}) = let val srcFile = P.concat(dir, stem ^ ".adoc") val htmlFile = P.concat(dir, stem ^ ".html") val copy = copy { meta = meta, title = title, file = srcFile, base = if dir = "" then "" else "../" } val outS = TextIO.openOut htmlFile in if !Options.verbose then print(concat["generating ", htmlFile, "\n"]) else (); copy (P.concat(Config.fragDir, "header.in"), outS); genTOC outS; copy (P.concat(Config.fragDir, "shim.in"), outS); RunAsciidoctor.run (srcFile, outS); copy (P.concat(Config.fragDir, "footer.in"), outS); TextIO.closeOut outS end (* generate the root page *) fun appRoot ft = gen (GenTOC.root ft) ft (* generate a library page *) fun appLib (ft, lib) = gen (GenTOC.lib (ft, lib)) lib (* generate a TOC file for a manual page *) fun appPage (ft, lib, page) = gen (GenTOC.page (ft, lib, page)) page fun loadIndex indexFile = FT.fromJSON (JSONParser.parseFile indexFile) (* for every documentation page, generate a table of contents file *) val walkTree = FT.app {root = appRoot, lib = appLib, page = appPage} fun main (cmd, opts) = ( Options.process opts; walkTree (loadIndex (!Options.indexFile)); if not(!Options.verbose) then print " done\n" else print "done\n"; OS.Process.success) handle ex => ( TextIO.output(TextIO.stdErr, concat[ "uncaught exception ", General.exnName ex, " [", General.exnMessage ex, "]\n" ]); List.app (fn s => TextIO.output(TextIO.stdErr, concat [" raised at ", s, "\n"])) (SMLofNJ.exnHistory ex); OS.Process.failure) end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/options.sml�������������������������0000664�0000000�0000000�00000005424�14162643450�0026302�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* options.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Handle command-line options for the gen-page tool. The options are * * -h, --help * -v, --verbose * --release-date=<date> * --version=<version> * --base-url=<url> * --basis-lib-url=<url> * --index=<file> *) structure Options : sig val process : string list -> unit val usage : OS.Process.status -> unit (* option flags *) val verbose : bool ref val releaseDate : string ref val version : string ref val baseURL : string option ref val basisLibURL : string ref val indexFile : string ref val imagesURL : string option ref end = struct structure G = GetOpt val verbose = ref false val releaseDate = ref Config.releaseDate val version = ref Config.version val baseURL : string option ref = ref NONE val basisLibURL = ref "https://standardml.org/Basis" val indexFile = ref "index.json" val imagesURL = ref(SOME "https://smlnj.org/images") val helpFlg = ref false fun setOpt (r, name) = G.ReqArg(fn s => r := s, name) val opts = [ { short = "h", long = ["help"], desc = G.NoArg(fn () => helpFlg := true), help = "Print this message" }, { short = "v", long = ["verbose"], desc = G.NoArg(fn () => verbose := true), help = "Print progress messages" }, { short = "", long = ["release-date"], desc = setOpt (releaseDate, "<date>"), help = "Specify the release date attribute" }, { short = "", long = ["version"], desc = setOpt (version, "<version>"), help = "Specify the SML/NJ version" }, { short = "", long = ["base-url"], desc = G.ReqArg(fn s => baseURL := SOME s, "<url>"), help = "Specify a base URL for the documentation" }, { short = "", long = ["basis-lib-url"], desc = setOpt (basisLibURL, "<url>"), help = "Specify the URL for the SML Basis Library documentation" }, { short = "", long = ["index"], desc = setOpt (indexFile, "<file>"), help = "Specify the name of the index JSON file" } ] fun usage sts = ( print (G.usageInfo{header="gen-pages [options]", options=opts}); OS.Process.exit sts) fun process args = let val errFlg = ref false val (_, excess) = G.getOpt { argOrder = G.RequireOrder, options = opts, errFn = fn msg => ( TextIO.output(TextIO.stdErr, concat["gen-pages: ", msg, "\n"]); errFlg := true) } args in if !helpFlg then usage OS.Process.success else if !errFlg orelse not(null excess) then usage OS.Process.failure else (); case !baseURL of NONE => imagesURL := NONE (* use relative path to images *) | _ => () end end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/run-asciidoctor.sml�����������������0000664�0000000�0000000�00000002560�14162643450�0027712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* run-asciidoctor.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure RunAsciidoctor : sig val run : string * TextIO.outstream -> OS.Process.status end = struct fun pipe (inS, outS) = (case TextIO.input inS of "" => TextIO.closeIn inS | s => (TextIO.output(outS, s); pipe(inS, outS)) (* end case *)) val cmd = Config.asciidoctor fun args file = [ "-b", "html", "--no-header-footer", "-o", "-", "-a", concat["sml-basis-url=", !Options.basisLibURL], "-a", concat["smlnj-version=", !Options.version], "-a", concat["release-date=", !Options.releaseDate], file ] fun run' (srcFile, outS) = let val args = args srcFile val _ = if !Options.verbose then print(String.concatWith " " (cmd :: args @ ["\n"])) else () val proc = Unix.execute (cmd, args) val (fromProc, toProc) = Unix.streamsOf proc in pipe (fromProc, outS); TextIO.closeOut toProc; Unix.reap proc before (if not (!Options.verbose) then print "." else ()) end (* wrapper that first verifies that the file exists *) fun run (srcFile, outS) = if OS.FileSys.access (srcFile, [OS.FileSys.A_READ]) then run' (srcFile, outS) else raise Fail(concat[ "RunAsciidoctor.run: \"", String.toString srcFile, "\" not found" ]) end ������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/sources.cm��������������������������0000664�0000000�0000000�00000000477�14162643450�0026101�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* sources.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library structure Main is $/basis.cm $/smlnj-lib.cm $/json-lib.cm ../index/sources.cm config.sml copy-file.sml gen-toc.sml main.sml options.sml run-asciidoctor.sml util.sml �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-pages/util.sml����������������������������0000664�0000000�0000000�00000002525�14162643450�0025563�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* util.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Utilities for processing simple styled text *) structure Util : sig val style : string -> string val clean : string -> string end = struct (* handle some simple style notations found in the Asciidoctor title text. * We handle code "`" and bold "*" markup. We assume that these are _not_ * nested. *) fun style s = let fun bold (#"*" :: #"*" :: r, acc) = (r, "</b>" :: acc) | bold (#"*" :: r, acc) = (r, "</b>" :: acc) | bold (c :: r, acc) = bold (r, str c :: acc) | bold arg = arg and code (#"`" :: #"`" :: r, acc) = (r, "</code>" :: acc) | code (#"`" :: r, acc) = (r, "</code>" :: acc) | code (c :: r, acc) = code (r, str c :: acc) | code arg = arg and text (#"*" :: #"*" :: r, acc) = text (bold (r, "<b>" :: acc)) | text (#"*" :: r, acc) = text (bold (r, "<b>" :: acc)) | text (#"`" :: #"`" :: r, acc) = text (code (r, "<code>" :: acc)) | text (#"`" :: r, acc) = text (code (r, "<code>" :: acc)) | text (c :: r, acc) = text (r, str c :: acc) | text ([], acc) = acc in String.concat (List.rev (text (explode s, []))) end (* strip code and bold markup *) fun clean s = String.translate (fn #"`" => "" | #"*" => "" | c => str c) s end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-toc/��������������������������������������0000775�0000000�0000000�00000000000�14162643450�0023553�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-toc/gen-toc.sml���������������������������0000664�0000000�0000000�00000015716�14162643450�0025636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* gen-toc.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * NOTE: the TOC generation has been integrated into the gen-pages tool. * This program is preserved for historical interest only. * * This program is used to generate the HTML fragment for a sidebar * table of contents. * * Usage: * * gen-toc index.json * * This command will produce a file file.toc for each source file in * the index (including the root). These files are HTML fragments * for a navigation sidebar specialized to the corresponding documentation * file. * * NOTE: this program must be run from the root of the documentation source! * * TODO: eventually, we should include the individual definitions from * the file in the sidebar. *) structure GenTOC : sig val main : string * string list -> OS.Process.status end = struct structure FT = FileTree structure P = OS.Path fun usage sts = ( TextIO.print "usage: gen-toc index.json\n"; OS.Process.exit sts) fun error msg = ( TextIO.print(concat["gen-toc: ", msg, "\n"]); OS.Process.exit OS.Process.failure) fun loadIndex indexFile = FT.fromJSON (JSONParser.parseFile indexFile) fun withOutS file f = let val outS = TextIO.openOut file in (f outS) handle ex => (TextIO.closeOut outS; raise ex); TextIO.closeOut outS end fun pr (outS, s) = TextIO.output(outS, s) fun prl (outS, s) = TextIO.output(outS, concat s) fun doTOC file f = let fun f' outS = ( prl (outS, [ "<div id=\"toc\">\n" ]); f outS; prl (outS, [ "</div> <!-- toc -->\n" ])) in withOutS file f' end (* handle some simple style notations found in the Asciidoctor title text. * We handle code "`", bold "*", and italic "_" markup. We assume that * these are _not_ nested. *) fun styleText s = let fun bold (#"*" :: #"*" :: r, acc) = (r, "</b>" :: acc) | bold (#"*" :: r, acc) = (r, "</b>" :: acc) | bold (c :: r, acc) = bold (r, str c :: acc) | bold arg = arg and code (#"`" :: #"`" :: r, acc) = (r, "</code>" :: acc) | code (#"`" :: r, acc) = (r, "</code>" :: acc) | code (c :: r, acc) = code (r, str c :: acc) | code arg = arg and italic (#"_" :: #"_" :: r, acc) = (r, "</i>" :: acc) | italic (#"_" :: r, acc) = (r, "</i>" :: acc) | italic (c :: r, acc) = code (r, str c :: acc) | italic arg = arg and text (#"*" :: #"*" :: r, acc) = text (bold (r, "<b>" :: acc)) | text (#"*" :: r, acc) = text (bold (r, "<b>" :: acc)) | text (#"`" :: #"`" :: r, acc) = text (code (r, "<code>" :: acc)) | text (#"`" :: r, acc) = text (code (r, "<code>" :: acc)) | text (#"_" :: #"_" :: r, acc) = text (italic (r, "<i>" :: acc)) | text (#"_" :: r, acc) = text (italic (r, "<i>" :: acc)) | text (c :: r, acc) = text (r, str c :: acc) | text ([], acc) = acc in String.concat (List.rev (text (explode s, []))) end (* returns the title string for the opening of a library item in the library * list. The flags are as follows: * link -- generate an HREF link * cur -- this library is the current page * inRoot -- the containing page is at root level *) fun libItemOpen {lib, link, cur, inRoot} = let val FT.LIB{dir, stem, title, ...} = lib val s = if link then ["</a>"] else [] val s = if cur then "<span id=\"toc:current\">" :: styleText title :: "</span>" :: s else "<span class=\"toc:lib-title\">" :: styleText title :: "</span>" :: s val s = if link then let val dir = if inRoot orelse cur then dir else "../" ^ dir in "<a href=\"" :: dir :: "/" :: stem :: ".html\">" :: s end else s val s = "<li class=\"toc:lib\">" :: s in concat s end (* returns the string for a page item in the pages list. The * flags are as follows: * link -- generate an HREF link * cur -- this library is the current page *) fun pageItem {page, link, cur} = let val FT.PAGE{stem, title, ...} = page val s = if link then ["</a></li>"] else ["</li>"] val s = if cur then "<span id=\"toc:current\">" :: styleText title :: "</span>" :: s else "<span class=\"toc:lib-page\">" :: styleText title :: "</span>" :: s val s = if link then "<a href=\"" :: stem :: ".html\">" :: s else s val s = "<li class=\"toc:page\">" :: s in concat s end fun doRoot outS (true, _) = pr(outS, "<ul class=\"toc:lib-list\">\n") | doRoot outS (false, _) = pr(outS, "</ul>\n") (* generate a TOC file for the root page *) fun appRoot (ft as FT.ROOT{stem, ...}) = doTOC (stem ^ ".toc") (fn outS => let fun doLib (true, _, lib) = prl(outS, [ " ", libItemOpen{lib=lib, link=true, cur=false, inRoot=true} ]) | doLib (false, _, _) = pr(outS, "</li>\n") in FT.walk { root = doRoot outS, lib = doLib, page = fn _ => () } ft end) (* generate a TOC file for a library page *) fun appLib (ft, lib as FT.LIB{dir, stem, ...}) = doTOC (P.concat(dir, stem ^ ".toc")) (fn outS => let fun doLib (true, _, lib') = let val cur = FT.sameLib(lib, lib') in prl(outS, [ " ", libItemOpen{lib=lib', link=false, cur=cur, inRoot=false} ]); if cur then pr(outS, "\n <ul class=\"toc:page-list\">\n") else () end | doLib (false, _, lib') = if FT.sameLib(lib, lib') then prl(outS, [" </ul>\n", " </li>\n"]) else pr(outS, "<li>\n") fun doPage (_, lib', page) = if FT.sameLib(lib, lib') then prl(outS, [ " ", pageItem {page=page, link=true, cur=false}, "\n" ]) else () in FT.walk { root = doRoot outS, lib = doLib, page = doPage } ft end) (* generate a TOC file for a manual page *) fun appPage (ft, lib, page as FT.PAGE{dir, stem, ...}) = doTOC (P.concat(dir, stem ^ ".toc")) (fn outS => let fun doLib (true, _, lib') = let val cur = FT.sameLib(lib, lib') in prl(outS, [ " ", libItemOpen{lib=lib', link=false, cur=false, inRoot=false} ]); if cur then pr(outS, "\n <ul class=\"toc:page-list\">\n") else () end | doLib (false, _, lib') = if FT.sameLib(lib, lib') then prl(outS, [" </ul>\n", " </li>\n"]) else pr(outS, "<li>\n") fun doPage (_, lib', page') = if FT.sameLib(lib, lib') then let val cur = FT.samePage(page, page') in prl(outS, [ " ", pageItem {page=page', link=not cur, cur=cur}, "\n" ]) end else () in FT.walk { root = doRoot outS, lib = doLib, page = doPage } ft end) (* for every documentation page, generate a table of contents file *) val walkTree = FT.app {root = appRoot, lib = appLib, page = appPage} fun main (cmd, args) = (case args of "-h"::_ => usage OS.Process.success | [indexFile] => ( walkTree (loadIndex indexFile); OS.Process.success) | _ => usage OS.Process.failure (* end case *)) end ��������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/gen-toc/sources.cm����������������������������0000664�0000000�0000000�00000000351�14162643450�0025556�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* sources.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library structure GenTOC is $/basis.cm $/smlnj-lib.cm $/json-lib.cm ../index/sources.cm gen-toc.sml ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/index/����������������������������������������0000775�0000000�0000000�00000000000�14162643450�0023326�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/index/extract-index.sml�����������������������0000664�0000000�0000000�00000013522�14162643450�0026625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* extract-index.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This module implements a tree walker that extracts index information * from the documentation sources. *) structure ExtractIndex : sig (* given the root directory of the documentation sources, extract * index information. *) val extract : string -> FileTree.t end = struct structure FT = FileTree structure P = OS.Path structure RE = RegExpFn( structure P = AwkSyntax structure E = BackTrackEngine) structure MT = MatchTree structure SS = Substring structure SIO = TextIO.StreamIO val attrRE = RE.compileString "^:!?([^!:]+)!?:(.*)" val includeRE = RE.compileString "^include::([^.]+\\.adoc)\\[\\]" val xrefRE = RE.compileString "[ ]*xref:([^.]+\\.adoc)\\[([^\\]]+|`\\[\\.kw\\]#[a-z]+# [^`]+`)\\]::" (* match the title text for a module xref *) val pageRefRE = RE.compileString "`\\[\\.kw\\]#([a-z]+)# ([^`]+)`" fun match re = let val prefix = StringCvt.scanString (RE.prefix re) fun getSubstrs s = MT.map (fn {pos, len} => String.substring(s, pos, len)) in fn s => Option.map (getSubstrs s) (prefix s) end fun openIn (rootDir, path) = TextIO.openIn (P.concat(rootDir, path)) fun trimWS ss = SS.dropr Char.isSpace (SS.dropl Char.isSpace ss) (* match an asciidoctor atrribute *) val matchAttr = match attrRE (* extract attribute values from lines immediately following the title *) fun scanMeta inputStrm = let val inS' = TextIO.getInstream inputStrm val author = ref NONE val keywords = ref [] val title = ref NONE fun trim s = SS.string(trimWS(SS.full s)) fun scan inS = (case SIO.inputLine inS of SOME(ln, inS') => (case matchAttr ln of SOME(MT.Match(_, [MT.Match(a, []), MT.Match(v, [])])) => ( case String.map Char.toLower a of "author" => author := SOME(trim v) | "keywords" => keywords := List.map trim (String.tokens (fn #"," => true | _ => false) v) | "title" => title := SOME(trim v) | _ => () (* end case *); scan inS') | _ => inS (* end case *)) | NONE => inS (* end case *)) in TextIO.setInstream (inputStrm, scan (TextIO.getInstream inputStrm)); { author = !author, kws = !keywords, title = !title } end (* open a documentation file and extract some common information *) fun scanFile rootDir path getContents processContent = let val dir = P.dir path val stem = P.base(P.file path) val inS = openIn (rootDir, path) val SOME firstLn = TextIO.inputLine inS val title = if String.isPrefix "= " firstLn then SS.string(trimWS(SS.extract(firstLn, 2, NONE))) else "<title>" val meta = scanMeta inS val contents = getContents inS in TextIO.closeIn inS; FT.FILE{ dir = dir, stem = stem, title = title, meta = meta, info = processContent contents } end (* scan the input stream until a line for which f returns `SOME v` is encountered *) fun scanLines f inS = let fun lp () = (case TextIO.inputLine inS of SOME ln => (case f ln of NONE => lp () | someV => someV (* end case *)) | NONE => NONE (* end case *)) in lp () end (* find the next "include" directive in the input stream *) fun findInclude inS = scanLines (match includeRE) inS (* find the next "xref" directive in the input stream *) fun findXRef inS = scanLines (match xrefRE) inS (* match a module page reference *) val matchPageRef = match pageRefRE fun doPage rootDir libDir {file, info} = let val pagePath = P.joinDirFile{dir = libDir, file = file} in (* NOTE: for now, we only extract the header info from pages, but eventually * we should get the list of defined modules. *) scanFile rootDir pagePath (fn inS => info) (fn info => info) end (* extract the list of page files from a library document *) fun getPagesFromLib inS = let (* first we get the `xref` list items *) fun getPages pages = (case findXRef inS of SOME(MT.Match(_, [MT.Match(file, []), MT.Match(title, [])])) => ( case matchPageRef title of SOME(MT.Match(_, [MT.Match(kw, []), MT.Match(name, [])])) => let val kind = (case kw of "signature" => FT.SigPage | "structure" => FT.StructPage | "functor" => FT.FunctPage | _ => raise Fail(concat[ "**bogus keyword \"", kw, "\"" ]) (* end case *)) val page = { file = file, info = {kind = kind, name = name} } in getPages (page :: pages) end | _ => let (* non-module page *) val page = { file = file, info = {kind = FT.OtherPage, name = title} } in getPages (page :: pages) end (* end case *)) | NONE => List.rev pages | SOME(MT.Match(s, _)) => raise Fail(concat[ "**bogus xref \"", String.toString s, "\"" ]) (* end case *)) in {pages = getPages []} end (* process a library file *) fun doLib rootDir libPath = let val libDir = P.dir libPath in scanFile rootDir libPath getPagesFromLib (fn {pages} => {pages = List.map (doPage rootDir libDir) pages}) end (* extract the list of library files from the root document *) fun getLibsFromRoot inS = let fun getIncludes incs = (case findInclude inS of SOME(MT.Match(_, [MT.Match(path, [])])) => getIncludes(path :: incs) | NONE => List.rev incs | SOME(MT.Match(s, _)) => raise Fail(concat[ "**bogus include \"", String.toString s, "\"" ]) (* end case *)) in getIncludes [] end fun extract rootDir = let val rootDir = OS.FileSys.fullPath rootDir in scanFile rootDir "index.adoc" getLibsFromRoot (fn libs => {libs = List.map (doLib rootDir) libs}) end end ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/index/file-tree.sml���������������������������0000664�0000000�0000000�00000020235�14162643450�0025721�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* file-tree.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The file tree represents the structure of the documentation as a three-level * tree. This structure is generated by walking over the documentation source. *) structure FileTree : sig (* meta data extracted from the attributes *) type meta = { author : string option, (* value of "author" attribute *) kws : string list, (* value of "keywords" attribute *) title : string option (* alternate title to use in document header *) } (* a node in the file tree; the `info` field is used to distinguish the kind * of node (root, library, or page). *) datatype 'a file = FILE of { dir : string, (* directory relative to the root of the documentation *) stem : string, (* file-name stem; e.g., "json-lib" *) title : string, (* title of page *) meta : meta, (* meta data from attributes *) info : 'a (* information specific to the type of file in the tree *) } datatype page_kind = SigPage | StructPage | FunctPage | OtherPage (* the leaves of the tree are the pages that describe the modules *) type page = { kind : page_kind, (* specifies the kind of the main module * or `OtherPage` for other material. *) name : string (* the main module name or page title *) } file (* the interior nodes correspond to libraries. The info describes the pages * that comprise the library's documentation. *) type library = { pages : page list (* list of manual pages for library *) } file (* the root file of the documentation; the info is the list of libraries *) type t = {libs : library list} file (* test equality by name *) val same : 'a file * 'a file -> bool (* is a page in a library? *) val inLibrary : library -> page -> bool (* get various components of a tree node *) val getAuthor : 'a file -> string option val getKeywords : 'a file -> string list val getAltTitle : 'a file -> string option val getDir : 'a file -> string val getStem : 'a file -> string val getTitle : 'a file -> string val getLibs : t -> library list val getPages : library -> page list (* apply the functions to the nodes of the tree *) val app : { root : t -> unit, lib : t * library -> unit, page : t * library * page -> unit } -> t -> unit (* do a walk over the tree; for interior nodes (root and libraries), * the function is called with "true" on entry and with "false" after * visiting the node's kids. *) val walk : { root : bool * t -> unit, lib : bool * t * library -> unit, page : t * library * page -> unit } -> t -> unit (* convert between JSON objects and the file tree datatypes *) val fromJSON : JSON.value -> t val toJSON : t -> JSON.value end = struct structure U = JSONUtil (* meta data extracted from the attributes *) type meta = { author : string option, (* value of "author" attribute *) kws : string list, (* value of "keywords" attribute *) title : string option (* alternate title to use in document header *) } datatype 'a file = FILE of { dir : string, (* directory relative to the root of the documentation *) stem : string, (* file-name stem; e.g., "json-lib" *) title : string, (* title of page *) meta : meta, (* meta data from attributes *) info : 'a (* information specific to the type of file in the tree *) } datatype page_kind = SigPage | StructPage | FunctPage | OtherPage (* the leaves of the tree are the pages that describe the modules *) type page = { kind : page_kind, (* specifies the kind of the main module * or `OtherPage` for other material. *) name : string (* the main module name or page title *) } file (* the interior nodes correspond to libraries. The info describes the pages * that comprise the library's documentation. *) type library = { pages : page list (* list of manual pages for library *) } file (* the root file of the documentation; the info is the list of libraries *) type t = {libs : library list} file (* test equality by name *) fun same (FILE f1, FILE f2) = (#dir f1 = #dir f2) andalso (#stem f1 = #stem f2) (* is a page in a library? *) fun inLibrary (FILE lib) (FILE p) = (#dir lib = #dir p) (* get various components of a tree node *) fun getAuthor (FILE{meta={author, ...}, ...}) = author fun getKeywords (FILE{meta={kws, ...}, ...}) = kws fun getAltTitle (FILE{meta={title, ...}, ...}) = title fun getDir (FILE{dir, ...}) = dir fun getStem (FILE{stem, ...}) = stem fun getTitle (FILE{title, ...}) = title fun getLibs (FILE{info={libs}, ...}) = libs fun getPages (FILE{info={pages}, ...}) = pages fun inLibrary (FILE lib) (FILE p) = (#dir lib = #dir p) fun app {root, lib, page} (ft : t) = let fun walkLib (l : library) = ( lib (ft, l); List.app (fn p => page(ft, l, p)) (getPages l)) in root ft; List.app walkLib (getLibs ft) end fun walk {root, lib, page} (ft : t) = let fun walkLib (l : library) = ( lib (true, ft, l); List.app (fn p => page(ft, l, p)) (getPages l); lib (false, ft, l)) in root (true, ft); List.app walkLib (getLibs ft); root (false, ft) end datatype value = datatype JSON.value fun fromJSON root = let fun jsonToMeta findField = { author = (case findField "meta-author" of NONE => NONE | SOME NULL => NONE | SOME obj => SOME(U.asString obj) (* end case *)), kws = (case findField "meta-keywords" of NONE => [] | SOME NULL => [] | SOME kws => U.arrayMap U.asString kws (* end case *)), title = (case findField "meta-title" of NONE => NONE | SOME NULL => NONE | SOME obj => SOME(U.asString obj) (* end case *)) } fun jsonToFile obj getInfo = let val get = U.lookupField obj val find = U.findField obj in FILE{ dir = U.asString(get "dir"), stem = U.asString(get "stem"), title = U.asString(get "title"), meta = jsonToMeta find, info = getInfo (get, find) } end fun jsonToPage obj = jsonToFile obj (fn (_, find) => ( case (find "kind", find "name") of (SOME k, SOME n) => let val kind = (case U.asString k of "signature" => SigPage | "structure" => StructPage | "functor" => FunctPage | "other" => OtherPage | s => raise Fail(concat["unknown page kind \"", s, "\""]) (* end case *)) in {kind = kind, name = U.asString n} end | _ => raise Fail "misformed page" (* end case *))) fun jsonToLib obj = jsonToFile obj (fn (get, find) => { pages = U.arrayMap jsonToPage (get "pages") }) in jsonToFile root (fn (get, _) => { libs = U.arrayMap jsonToLib (get "libraries") }) end fun toJSON root = let fun metaToJSON (meta : meta, fields) = let val fields = (case #title meta of NONE => fields | SOME s => ("meta-title", STRING s) :: fields (* end case *)) val fields = (case #kws meta of [] => fields | kws => ("meta-keywords", ARRAY(List.map STRING kws)) :: fields (* end case *)) val fields = (case #author meta of NONE => fields | SOME s => ("meta-author", STRING s) :: fields (* end case *)) in fields end fun fileToJSON (FILE{dir, stem, title, meta, info}) infoToJSON = let val fields = infoToJSON info val fields = metaToJSON (meta, fields) in OBJECT( ("dir", STRING dir) :: ("stem", STRING stem) :: ("title", STRING title) :: fields) end fun pageToJSON page = let fun infoToJSON {kind, name} = let val kind = (case kind of SigPage => "signature" | StructPage => "structure" | FunctPage => "functor" | OtherPage => "other" (* end case *)) in [("kind", STRING kind), ("name", STRING name)] end in fileToJSON page infoToJSON end fun libToJSON lib = fileToJSON lib (fn _ => [("pages", ARRAY(map pageToJSON (getPages lib)))]) in fileToJSON root (fn {libs} => [("libraries", ARRAY(map libToJSON libs))]) end end �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/index/sources.cm������������������������������0000664�0000000�0000000�00000000425�14162643450�0025333�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* sources.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library structure ExtractIndex structure FileTree is $/basis.cm $/smlnj-lib.cm $/json-lib.cm $/regexp-lib.cm extract-index.sml file-tree.sml �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/make-index/�����������������������������������0000775�0000000�0000000�00000000000�14162643450�0024241�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/make-index/Makefile.in������������������������0000664�0000000�0000000�00000001265�14162643450�0026312�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile.in # # COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) # All rights reserved. # # Makefile for make-index tool # # @configure_input@ # SHELL = @SHELL@ INSTALL = @INSTALL@ @SET_MAKE@ TOOL_BIN = @TOOL_BIN_DIR@ ML_BUILD = @ML_BUILD@ HEAP_SUFFIX = @SMLNJ_HEAP_SUFFIX@ INSTALL_WRAPPER = @ROOT_DIR@/bin/install-sml-wrapper.sh PROGRAM = make-index HEAP_IMAGE = $(PROGRAM).$(HEAP_SUFFIX) .PHONY: install install: $(HEAP_IMAGE) $(INSTALL_WRAPPER) $(PROGRAM) $(TOOL_BIN) $(HEAP_IMAGE): $(wildcard ../*.sml) make-index.sml $(ML_BUILD) sources.cm MakeIndex.main $(PROGRAM) include @MK_DIR@/clean-rules.gmk CLEAN_FILES = $(HEAP_IMAGE) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/make-index/make-index.sml���������������������0000664�0000000�0000000�00000001511�14162643450�0026776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* make-index.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This program is used to generate extract index information from * the document sources and then write it out as a JSON file. * * Usage: * * make-index index.json *) structure MakeIndex : sig val main : string * string list -> OS.Process.status end = struct fun usage sts = ( TextIO.print "usage: make-index <outfile>\n"; OS.Process.exit sts) fun main (cmd, args) = (case args of "-h"::_ => usage OS.Process.success | [outFile] => let val tree = FileTree.toJSON(ExtractIndex.extract ".") val outS = TextIO.openOut outFile in JSONPrinter.print' {strm = outS, pretty = true} tree; OS.Process.success end | _ => usage OS.Process.failure (* end case *)) end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Doc/tools/make-index/sources.cm�������������������������0000664�0000000�0000000�00000000357�14162643450�0026252�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* sources.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library structure MakeIndex is $/basis.cm $/smlnj-lib.cm $/json-lib.cm ../index/sources.cm make-index.sml ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/���������������������������������������������������0000775�0000000�0000000�00000000000�14162643450�0021116�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/.cvsignore�����������������������������������������0000664�0000000�0000000�00000000070�14162643450�0023113�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������html-lex.sml html-gram.sml html-gram.sig html-gram.desc ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/HTML32.dtd�����������������������������������������0000664�0000000�0000000�00000047636�14162643450�0022544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- W3C Document Type Definition for the HyperText Markup Language version 3.2 as ratified by a vote of W3C member companies. For more information on W3C look at URL http://www.w3.org/ Date: Tuesday January 14th 1997 Author: Dave Raggett <dsr@w3.org> HTML 3.2 aims to capture recommended practice as of early '96 and as such to be used as a replacement for HTML 2.0 (RFC 1866). Widely deployed rendering attributes are included where they have been shown to be interoperable. SCRIPT and STYLE are included to smooth the introduction of client-side scripts and style sheets. Browsers must avoid showing the contents of these element Otherwise support for them is not required. ID, CLASS and STYLE attributes are not included in this version of HTML. --> <!ENTITY % HTML.Version "-//W3C//DTD HTML 3.2 Final//EN" -- Typical usage: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> ... </html> -- > <!--================== Deprecated Features Switch =========================--> <!ENTITY % HTML.Deprecated "INCLUDE"> <!--================== Imported Names =====================================--> <!ENTITY % Content-Type "CDATA" -- meaning a MIME content type, as per RFC1521 --> <!ENTITY % HTTP-Method "GET | POST" -- as per HTTP specification --> <!ENTITY % URL "CDATA" -- The term URL means a CDATA attribute whose value is a Uniform Resource Locator, See RFC1808 (June 95) and RFC1738 (Dec 94). --> <!-- Parameter Entities --> <!ENTITY % head.misc "SCRIPT|STYLE|META|LINK" -- repeatable head elements --> <!ENTITY % heading "H1|H2|H3|H4|H5|H6"> <!ENTITY % list "UL | OL | DIR | MENU"> <![ %HTML.Deprecated [ <!ENTITY % preformatted "PRE | XMP | LISTING"> ]]> <!ENTITY % preformatted "PRE"> <!--================ Character mnemonic entities ==========================--> <!ENTITY % ISOlat1 PUBLIC "ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML"> %ISOlat1; <!--================ Entities for special symbols =========================--> <!-- &trade and &cbsp are not widely deployed and so not included here --> <!ENTITY amp CDATA "&" -- ampersand --> <!ENTITY gt CDATA ">" -- greater than --> <!ENTITY lt CDATA "<" -- less than --> <!--=================== Text Markup =======================================--> <!ENTITY % font "TT | I | B | U | STRIKE | BIG | SMALL | SUB | SUP"> <!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE"> <!ENTITY % special "A | IMG | APPLET | FONT | BASEFONT | BR | SCRIPT | MAP"> <!ENTITY % form "INPUT | SELECT | TEXTAREA"> <!ENTITY % text "#PCDATA | %font | %phrase | %special | %form"> <!ELEMENT (%font|%phrase) - - (%text)*> <!-- there are also 16 widely known color names although the resulting colors are implementation dependent: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellow These colors were originally picked as being the standard 16 colors supported with the Windows VGA palette. --> <!ELEMENT FONT - - (%text)* -- local change to font --> <!ATTLIST FONT size CDATA #IMPLIED -- [+]nn e.g. size="+1", size=4 -- color CDATA #IMPLIED -- #RRGGBB in hex, e.g. red: color="#FF0000" -- > <!ELEMENT BASEFONT - O EMPTY -- base font size (1 to 7)--> <!ATTLIST BASEFONT size CDATA #IMPLIED -- e.g. size=3 -- > <!ELEMENT BR - O EMPTY -- forced line break --> <!ATTLIST BR clear (left|all|right|none) none -- control of text flow -- > <!--================== HTML content models ================================--> <!-- HTML has three basic content models: %text character level elements and text strings %flow block-like elements e.g. paragraphs and lists %bodytext as %flow plus headers H1-H6 and ADDRESS --> <!ENTITY % block "P | %list | %preformatted | DL | DIV | CENTER | BLOCKQUOTE | FORM | ISINDEX | HR | TABLE"> <!-- %flow is used for DD and LI --> <!ENTITY % flow "(%text | %block)*"> <!--=================== Document Body =====================================--> <!ENTITY % body.content "(%heading | %text | %block | ADDRESS)*"> <!ENTITY % color "CDATA" -- a color specification: #HHHHHH @@ details? --> <!ENTITY % body-color-attrs " bgcolor %color #IMPLIED text %color #IMPLIED link %color #IMPLIED vlink %color #IMPLIED alink %color #IMPLIED "> <!ELEMENT BODY O O %body.content> <!ATTLIST BODY background %URL #IMPLIED -- texture tile for document background -- %body-color-attrs; -- bgcolor, text, link, vlink, alink -- > <!ENTITY % address.content "((%text;) | P)*"> <!ELEMENT ADDRESS - - %address.content> <!ELEMENT DIV - - %body.content> <!ATTLIST DIV align (left|center|right) #IMPLIED -- alignment of following text -- > <!-- CENTER is a shorthand for DIV with ALIGN=CENTER --> <!ELEMENT center - - %body.content> <!--================== The Anchor Element =================================--> <!ELEMENT A - - (%text)* -(A)> <!ATTLIST A name CDATA #IMPLIED -- named link end -- href %URL #IMPLIED -- URL for linked resource -- rel CDATA #IMPLIED -- forward link types -- rev CDATA #IMPLIED -- reverse link types -- title CDATA #IMPLIED -- advisory title string -- > <!--================== Client-side image maps ============================--> <!-- These can be placed in the same document or grouped in a separate document although this isn't yet widely supported --> <!ENTITY % SHAPE "(rect|circle|poly)"> <!ENTITY % COORDS "CDATA" -- comma separated list of numbers --> <!ELEMENT MAP - - (AREA)*> <!ATTLIST MAP name CDATA #IMPLIED > <!ELEMENT AREA - O EMPTY> <!ATTLIST AREA shape %SHAPE rect coords %COORDS #IMPLIED -- defines coordinates for shape -- href %URL #IMPLIED -- this region acts as hypertext link -- nohref (nohref) #IMPLIED -- this region has no action -- alt CDATA #REQUIRED -- needed for non-graphical user agents -- > <!--================== The LINK Element ==================================--> <!ENTITY % Types "CDATA" -- See Internet Draft: draft-ietf-html-relrev-00.txt LINK has been part of HTML since the early days although few browsers as yet take advantage of it. Relationship values can be used in principle: a) for document specific toolbars/menus when used with the LINK element in the document head: b) to link to a separate style sheet c) to make a link to a script d) by stylesheets to control how collections of html nodes are rendered into printed documents e) to make a link to a printable version of this document e.g. a postscript or pdf version --> <!ELEMENT LINK - O EMPTY> <!ATTLIST LINK href %URL #IMPLIED -- URL for linked resource -- rel %Types #IMPLIED -- forward link types -- rev %Types #IMPLIED -- reverse link types -- title CDATA #IMPLIED -- advisory title string -- > <!--=================== Images ============================================--> <!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length --> <!ENTITY % Pixels "NUMBER" -- integer representing length in pixels --> <!-- Suggested widths are used for negotiating image size with the module responsible for painting the image. align=left or right cause image to float to margin and for subsequent text to wrap around image --> <!ENTITY % IAlign "(top|middle|bottom|left|right)"> <!ELEMENT IMG - O EMPTY -- Embedded image --> <!ATTLIST IMG src %URL #REQUIRED -- URL of image to embed -- alt CDATA #IMPLIED -- for display in place of image -- align %IAlign #IMPLIED -- vertical or horizontal alignment -- height %Pixels #IMPLIED -- suggested height in pixels -- width %Pixels #IMPLIED -- suggested width in pixels -- border %Pixels #IMPLIED -- suggested link border width -- hspace %Pixels #IMPLIED -- suggested horizontal gutter -- vspace %Pixels #IMPLIED -- suggested vertical gutter -- usemap %URL #IMPLIED -- use client-side image map -- ismap (ismap) #IMPLIED -- use server image map -- > <!-- USEMAP points to a MAP element which may be in this document or an external document, although the latter is not widely supported --> <!--=================== Java APPLET tag ===================================--> <!-- This tag is supported by all Java enabled browsers. Applet resources (including their classes) are normally loaded relative to the document URL (or <BASE> element if it is defined). The CODEBASE attribute is used to change this default behavior. If the CODEBASE attribute is defined then it specifies a different location to find applet resources. The value can be an absolute URL or a relative URL. The absolute URL is used as is without modification and is not effected by the documents <BASE> element. When the codebase attribute is relative, then it is relative to the document URL (or <BASE> tag if defined). --> <!ELEMENT APPLET - - (PARAM | %text)*> <!ATTLIST APPLET codebase %URL #IMPLIED -- code base -- code CDATA #REQUIRED -- class file -- alt CDATA #IMPLIED -- for display in place of applet -- name CDATA #IMPLIED -- applet name -- width %Pixels #REQUIRED -- suggested width in pixels -- height %Pixels #REQUIRED -- suggested height in pixels -- align %IAlign #IMPLIED -- vertical or horizontal alignment -- hspace %Pixels #IMPLIED -- suggested horizontal gutter -- vspace %Pixels #IMPLIED -- suggested vertical gutter -- > <!ELEMENT PARAM - O EMPTY> <!ATTLIST PARAM name NMTOKEN #REQUIRED -- The name of the parameter -- value CDATA #IMPLIED -- The value of the parameter -- > <!-- Here is an example: <applet codebase="applets/NervousText" code=NervousText.class width=300 height=50> <param name=text value="Java is Cool!"> <img src=sorry.gif alt="This looks better with Java support"> </applet> --> <!--=================== Horizontal Rule ===================================--> <!ELEMENT HR - O EMPTY> <!ATTLIST HR align (left|right|center) #IMPLIED noshade (noshade) #IMPLIED size %Pixels #IMPLIED width %Length #IMPLIED > <!--=================== Paragraphs=========================================--> <!ELEMENT P - O (%text)*> <!ATTLIST P align (left|center|right) #IMPLIED > <!--=================== Headings ==========================================--> <!-- There are six levels of headers from H1 (the most important) to H6 (the least important). --> <!ELEMENT ( %heading ) - - (%text;)*> <!ATTLIST ( %heading ) align (left|center|right) #IMPLIED > <!--=================== Preformatted Text =================================--> <!-- excludes images and changes in font size --> <!ENTITY % pre.exclusion "IMG|BIG|SMALL|SUB|SUP|FONT"> <!ELEMENT PRE - - (%text)* -(%pre.exclusion)> <!ATTLIST PRE width NUMBER #implied -- is this widely supported? -- > <![ %HTML.Deprecated [ <!ENTITY % literal "CDATA" -- historical, non-conforming parsing mode where the only markup signal is the end tag in full --> <!ELEMENT (XMP|LISTING) - - %literal> <!ELEMENT PLAINTEXT - O %literal> ]]> <!--=================== Block-like Quotes =================================--> <!ELEMENT BLOCKQUOTE - - %body.content> <!--=================== Lists =============================================--> <!-- HTML 3.2 allows you to control the sequence number for ordered lists. You can set the sequence number with the START and VALUE attributes. The TYPE attribute may be used to specify the rendering of ordered and unordered lists. --> <!-- definition lists - DT for term, DD for its definition --> <!ELEMENT DL - - (DT|DD)+> <!ATTLIST DL compact (compact) #IMPLIED -- more compact style -- > <!ELEMENT DT - O (%text)*> <!ELEMENT DD - O %flow;> <!-- Ordered lists OL, and unordered lists UL --> <!ELEMENT (OL|UL) - - (LI)+> <!-- Numbering style 1 arablic numbers 1, 2, 3, ... a lower alpha a, b, c, ... A upper alpha A, B, C, ... i lower roman i, ii, iii, ... I upper roman I, II, III, ... The style is applied to the sequence number which by default is reset to 1 for the first list item in an ordered list. This can't be expressed directly in SGML due to case folding. --> <!ENTITY % OLStyle "CDATA" -- constrained to: [1|a|A|i|I] --> <!ATTLIST OL -- ordered lists -- type %OLStyle #IMPLIED -- numbering style -- start NUMBER #IMPLIED -- starting sequence number -- compact (compact) #IMPLIED -- reduced interitem spacing -- > <!-- bullet styles --> <!ENTITY % ULStyle "disc|square|circle"> <!ATTLIST UL -- unordered lists -- type (%ULStyle) #IMPLIED -- bullet style -- compact (compact) #IMPLIED -- reduced interitem spacing -- > <!ELEMENT (DIR|MENU) - - (LI)+ -(%block)> <!ATTLIST DIR compact (compact) #IMPLIED > <!ATTLIST MENU compact (compact) #IMPLIED > <!-- <DIR> Directory list --> <!-- <DIR COMPACT> Compact list style --> <!-- <MENU> Menu list --> <!-- <MENU COMPACT> Compact list style --> <!-- The type attribute can be used to change the bullet style in unordered lists and the numbering style in ordered lists --> <!ENTITY % LIStyle "CDATA" -- constrained to: "(%ULStyle|%OLStyle)" --> <!ELEMENT LI - O %flow -- list item --> <!ATTLIST LI type %LIStyle #IMPLIED -- list item style -- value NUMBER #IMPLIED -- reset sequence number -- > <!--================ Forms ===============================================--> <!ELEMENT FORM - - %body.content -(FORM)> <!ATTLIST FORM action %URL #IMPLIED -- server-side form handler -- method (%HTTP-Method) GET -- see HTTP specification -- enctype %Content-Type; "application/x-www-form-urlencoded" > <!ENTITY % InputType "(TEXT | PASSWORD | CHECKBOX | RADIO | SUBMIT | RESET | FILE | HIDDEN | IMAGE)"> <!ELEMENT INPUT - O EMPTY> <!ATTLIST INPUT type %InputType TEXT -- what kind of widget is needed -- name CDATA #IMPLIED -- required for all but submit and reset -- value CDATA #IMPLIED -- required for radio and checkboxes -- checked (checked) #IMPLIED -- for radio buttons and check boxes -- size CDATA #IMPLIED -- specific to each type of field -- maxlength NUMBER #IMPLIED -- max chars allowed in text fields -- src %URL #IMPLIED -- for fields with background images -- align %IAlign #IMPLIED -- vertical or horizontal alignment -- > <!ELEMENT SELECT - - (OPTION+)> <!ATTLIST SELECT name CDATA #REQUIRED size NUMBER #IMPLIED multiple (multiple) #IMPLIED > <!ELEMENT OPTION - O (#PCDATA)*> <!ATTLIST OPTION selected (selected) #IMPLIED value CDATA #IMPLIED -- defaults to element content -- > <!-- Multi-line text input field. --> <!ELEMENT TEXTAREA - - (#PCDATA)*> <!ATTLIST TEXTAREA name CDATA #REQUIRED rows NUMBER #REQUIRED cols NUMBER #REQUIRED > <!--======================= Tables ========================================--> <!-- Widely deployed subset of the full table standard, see RFC 1942 e.g. at http://www.ics.uci.edu/pub/ietf/html/rfc1942.txt --> <!-- horizontal placement of table relative to window --> <!ENTITY % Where "(left|center|right)"> <!-- horizontal alignment attributes for cell contents --> <!ENTITY % cell.halign "align (left|center|right) #IMPLIED" > <!-- vertical alignment attributes for cell contents --> <!ENTITY % cell.valign "valign (top|middle|bottom) #IMPLIED" > <!ELEMENT table - - (caption?, tr+)> <!ELEMENT tr - O (th|td)*> <!ELEMENT (th|td) - O %body.content> <!ATTLIST table -- table element -- align %Where; #IMPLIED -- table position relative to window -- width %Length #IMPLIED -- table width relative to window -- border %Pixels #IMPLIED -- controls frame width around table -- cellspacing %Pixels #IMPLIED -- spacing between cells -- cellpadding %Pixels #IMPLIED -- spacing within cells -- > <!ELEMENT CAPTION - - (%text;)* -- table or figure caption --> <!ATTLIST CAPTION align (top|bottom) #IMPLIED > <!ATTLIST tr -- table row -- %cell.halign; -- horizontal alignment in cells -- %cell.valign; -- vertical alignment in cells -- > <!ATTLIST (th|td) -- header or data cell -- nowrap (nowrap) #IMPLIED -- suppress word wrap -- rowspan NUMBER 1 -- number of rows spanned by cell -- colspan NUMBER 1 -- number of cols spanned by cell -- %cell.halign; -- horizontal alignment in cell -- %cell.valign; -- vertical alignment in cell -- width %Pixels #IMPLIED -- suggested width for cell -- height %Pixels #IMPLIED -- suggested height for cell -- > <!--================ Document Head ========================================--> <!-- %head.misc defined earlier on as "SCRIPT|STYLE|META|LINK" --> <!ENTITY % head.content "TITLE & ISINDEX? & BASE?"> <!ELEMENT HEAD O O (%head.content) +(%head.misc)> <!ELEMENT TITLE - - (#PCDATA)* -(%head.misc) -- The TITLE element is not considered part of the flow of text. It should be displayed, for example as the page header or window title. --> <!ELEMENT ISINDEX - O EMPTY> <!ATTLIST ISINDEX prompt CDATA #IMPLIED -- prompt message --> <!-- The BASE element gives an absolute URL for dereferencing relative URLs, e.g. <BASE href="http://foo.com/index.html"> ... <IMG SRC="images/bar.gif"> The image is deferenced to http://foo.com/images/bar.gif In the absence of a BASE element the document URL should be used. Note that this is not necessarily the same as the URL used to request the document, as the base URL may be overridden by an HTTP header accompanying the document. --> <!ELEMENT BASE - O EMPTY> <!ATTLIST BASE href %URL #REQUIRED > <!ELEMENT META - O EMPTY -- Generic Metainformation --> <!ATTLIST META http-equiv NAME #IMPLIED -- HTTP response header name -- name NAME #IMPLIED -- metainformation name -- content CDATA #REQUIRED -- associated information -- > <!-- SCRIPT/STYLE are place holders for transition to next version of HTML --> <!ELEMENT STYLE - - CDATA -- placeholder for style info --> <!ELEMENT SCRIPT - - CDATA -- placeholder for script statements --> <!--================ Document Structure ===================================--> <!ENTITY % version.attr "VERSION CDATA #FIXED '%HTML.Version;'"> <![ %HTML.Deprecated [ <!ENTITY % html.content "HEAD, BODY, PLAINTEXT?"> ]]> <!ENTITY % html.content "HEAD, BODY"> <!ELEMENT HTML O O (%html.content)> <!ATTLIST HTML %version.attr; > ��������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/README���������������������������������������������0000664�0000000�0000000�00000002372�14162643450�0022002�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������This library provides support for parsing and pretty-printing HTML. The file html-sig.sml and html.sml define a parse-tree representation of HTML 3.2 (as defined in the January 14th 1997 specification). The HTML structure implements a collection of datatypes that describe the syntax of HTML trees according to the 3.2 spec. The library provides support for parsing and printing these datatypes. The functor HTMLParserFn implements the parser and the PrHTML structure provides printing of HTML trees. Also, there is a structure called MakeHTML, which provides helper functions for constructing HTML trees (mostly defaults of attribute values). Note that this is a fairly strict interpretation of the standard; non-standard tags and attributes will cause errors. To allow some flexibility, the parser is functorized over a collection of error reporting functions (see html-error-sig.sml). The file test-parser.sml gives an example of how the parser part of the library can be used. TODO LIST: The parser has trouble with white-space in the <HEAD>. The pretty-printer needs to be rewritten to deal with line breaks better. Some library support for entities (e.g., "<" should be provided). John Reppy Bell Labs, Lucent Technologies jhr@research.bell-labs.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/check-html-fn.sml����������������������������������0000664�0000000�0000000�00000015530�14162643450�0024257�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* check-html-fn.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This implements a tree walk over an HTML file to check for * errors, such as violations of exclusions. *) functor CheckHTMLFn (Err : HTML_ERROR) : sig type context = {file : string option, line : int} val check : context -> HTML.html -> unit end = struct type context = Err.context fun check context (HTML.HTML{body=HTML.BODY{content, ...}, ...}) = let fun error (elem, ctx) = Err.syntaxError context (Format.format "unexpected %s element in %s" [ Format.STR elem, Format.STR ctx ]) fun contentError ctx = Err.syntaxError context (Format.format "unexpected element in %s" [Format.STR ctx]) fun formError elem = Err.syntaxError context (Format.format "unexpected %s element not in FORM" [ Format.STR elem ]) fun attrError attr = Err.missingAttr context attr fun checkBodyContent {inForm} b = (case b of (HTML.Hn{n, align, content}) => checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet=false } content | (HTML.ADDRESS block) => checkAddress {inForm=inForm} block | (HTML.BlockList bl) => List.app (checkBodyContent {inForm=inForm}) bl | block => checkBlock {inForm=inForm} block (* end case *)) and checkAddress {inForm} blk = (case blk of (HTML.BlockList bl) => List.app (checkAddress {inForm=inForm}) bl | (HTML.TextBlock txt) => checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet = false } txt | (HTML.P{content, ...}) => checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet = false } content | _ => contentError "ADDRESS" (* end case *)) and checkBlock {inForm} blk = (case blk of (HTML.BlockList bl) => List.app (checkBlock {inForm=inForm}) bl | (HTML.TextBlock txt) => checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet = false } txt | (HTML.P{content, ...}) => checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet = false } content | (HTML.UL{content, ...}) => checkItems {inForm=inForm, inDirOrMenu=false} content | (HTML.OL{content, ...}) => checkItems {inForm=inForm, inDirOrMenu=false} content | (HTML.DIR{content, ...}) => checkItems {inForm=inForm, inDirOrMenu=true} content | (HTML.MENU{content, ...}) => checkItems {inForm=inForm, inDirOrMenu=true} content | (HTML.DL{content, ...}) => checkDLItems {inForm=inForm} content | (HTML.PRE{content, ...}) => checkText { inAnchor=false, inForm=inForm, inPre=true, inApplet = false } content | (HTML.DIV{content, ...}) => checkBodyContent {inForm=inForm} content | (HTML.CENTER content) => checkBodyContent {inForm=inForm} content | (HTML.BLOCKQUOTE content) => checkBodyContent {inForm=inForm} content | (HTML.FORM{content, ...}) => ( if inForm then error("FORM", "FORM") else (); checkBodyContent {inForm=true} content) | (HTML.ISINDEX _) => () | (HTML.HR _) => () | (HTML.TABLE{ caption=SOME(HTML.CAPTION{content=caption, ...}), content, ... }) => ( checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet = false } caption; checkRows {inForm=inForm} content) | (HTML.TABLE{content, ...}) => checkRows {inForm=inForm} content | (HTML.Hn _) => error ("Hn", "block") | (HTML.ADDRESS _) => error ("ADDRESS", "block") (* end case *)) and checkItems {inForm, inDirOrMenu} items = let fun chkBlk (HTML.BlockList bl) = List.app chkBlk bl | chkBlk (HTML.TextBlock txt) = () | chkBlk (HTML.P _) = () | chkBlk _ = error ("block", "DIR/MENU") val chk = if inDirOrMenu then (fn (HTML.LI{content, ...}) => ( chkBlk content; checkBlock {inForm=inForm} content)) else (fn (HTML.LI{content, ...}) => ( checkBlock {inForm=inForm} content)) in List.app chk items end and checkDLItems {inForm} items = let fun chk {dt, dd} = ( List.app (checkText { inAnchor=false, inForm=inForm, inPre=false, inApplet=false }) dt; checkBlock {inForm=inForm} dd) in List.app chk items end and checkRows {inForm} rows = let fun chkCell (HTML.TH{content, ...}) = checkBodyContent {inForm=inForm} content | chkCell (HTML.TD{content, ...}) = checkBodyContent {inForm=inForm} content fun chkRow (HTML.TR{content, ...}) = List.app chkCell content in List.app chkRow rows end and checkText {inAnchor, inForm, inPre, inApplet} = let fun chk txt = (case txt of (HTML.TextList tl) => List.app chk tl | (HTML.PCDATA _) => () | (HTML.TT txt) => chk txt | (HTML.I txt) => chk txt | (HTML.B txt) => chk txt | (HTML.U txt) => chk txt | (HTML.STRIKE txt) => chk txt | (HTML.BIG txt) => ( if inPre then error("BIG", "PRE") else (); chk txt) | (HTML.SMALL txt) => ( if inPre then error("SMALL", "PRE") else (); chk txt) | (HTML.SUB txt) => ( if inPre then error("SUB", "PRE") else (); chk txt) | (HTML.SUP txt) => ( if inPre then error("SUP", "PRE") else (); chk txt) | (HTML.EM txt) => chk txt | (HTML.STRONG txt) => chk txt | (HTML.DFN txt) => chk txt | (HTML.CODE txt) => chk txt | (HTML.SAMP txt) => chk txt | (HTML.KBD txt) => chk txt | (HTML.VAR txt) => chk txt | (HTML.CITE txt) => chk txt | (HTML.A{content, ...}) => ( if (inAnchor) then error("anchor", "anchor") else (); checkText { inAnchor=true, inForm=inForm, inPre=inPre, inApplet=inApplet } content) | (HTML.IMG _) => if inPre then error("IMG", "PRE") else () | (HTML.APPLET{content, ...}) => checkText { inAnchor=false, inForm=inForm, inPre=inPre, inApplet=true } content | (HTML.PARAM _) => if inApplet then error ("param", "applet") else () | (HTML.FONT{content, ...}) => if inPre then error("FONT", "PRE") else () | (HTML.BASEFONT{content, ...}) => if inPre then error("BASEFONT", "PRE") else () | (HTML.BR _) => () | (HTML.MAP _) => () | (HTML.INPUT{ty, name, value, ...}) => ( if (not inForm) then formError "INPUT" else (); if ((name = NONE) andalso (ty <> SOME(HTML.InputType.submit)) andalso (ty <> SOME(HTML.InputType.reset))) then attrError "NAME" else (); if ((value = NONE) andalso ((ty = SOME(HTML.InputType.radio)) orelse (ty = SOME(HTML.InputType.checkbox)))) then attrError "VALUE" else ()) | (HTML.SELECT _) => if (not inForm) then formError "SELECT" else () | (HTML.TEXTAREA _) => if (not inForm) then formError "TEXTAREA" else () | (HTML.SCRIPT _) => () (* end case *)) in chk end in checkBodyContent {inForm=false} content end end ������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-attr-vals.sml���������������������������������0000664�0000000�0000000�00000000775�14162643450�0024523�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-attr-vals.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This structure is necessary since the attrs type is used in the parser, * and there is no way to get it into the parser's signature. *) structure HTMLAttrVals = struct (* support for building elements that have attributes *) datatype attr_val = NAME of string (* [a-zA-Z.-]+ *) | STRING of string (* a string enclosed in "" or '' *) | IMPLICIT type attrs = (string * attr_val) list end; ���mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-attrs-fn.sml����������������������������������0000664�0000000�0000000�00000062272�14162643450�0024344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-attrs-fn.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This provides support for parsing element start tags. *) functor HTMLAttrsFn (Err : HTML_ERROR) : HTML_ATTRS = struct open HTMLAttrVals (* inherit types *) fun attrValToString (NAME s) = s | attrValToString (STRING s) = s | attrValToString IMPLICIT = "" datatype attr_ty = AT_TEXT (* either a string or name value *) | AT_NAMES of string list (* one of a list of names *) | AT_NUMBER (* an integer attribute *) | AT_IMPLICIT | AT_INSTANCE (* if an attribute FOO has type AT_NAMES with *) (* values BAR and BAZ, then BAR and BAZ are *) (* legal attributes, being shorthand for *) (* FOO=BAR and FOO=BAZ. We introduce an *) (* (k, AT_INSTANCE) entry for BAR and BAZ, where *) (* k is the slot that FOO has been assigned. *) type context = Err.context structure HTbl = HashTableFn (struct type hash_key = string val hashVal = HashString.hashString val sameKey = (op = : (string * string) -> bool) end) (* an attribute map (attr_map) is a map from attribute names to attribute * value slots and types. *) abstype attr_map = AMap of { numAttrs : int, attrTbl : (int * attr_ty) HTbl.hash_table } and attr_vec = AVec of { vec : attr_val option Array.array, ctx : context } with (* create an attr_map from the list of attribute names and types. *) fun mkAttrs data = let val n = length data val tbl = HTbl.mkTable (n, Fail "Attrs") fun ins ((name, ty), id) = ( HTbl.insert tbl (name, (id, ty)); case ty of (AT_NAMES l) => let fun ins' nm = if (nm <> name) then HTbl.insert tbl (nm, (id, AT_INSTANCE)) else () in List.app ins' l end | _ => () (* end case *); id+1) in List.foldl ins 0 data; AMap{numAttrs = n, attrTbl = tbl} end (* create an atttribute vector of attribute values using the attribute * map to assign slots and typecheck the values. *) fun attrListToVec (ctx, AMap{numAttrs, attrTbl}, attrs) = let val attrArray = Array.array (numAttrs, NONE) fun update (_, NONE) = () | update (id, SOME v) = (case Array.sub(attrArray, id) of NONE => Array.update(attrArray, id, SOME v) | (SOME _) => (* ignore multiple attribute definition *) () (* end case *)) (* compare two names for case-insensitive equality, where the second * name is known to be all uppercase. *) fun eqName name name' = let fun cmpC (c1, c2) = Char.compare(Char.toUpper c1, c2) in (String.collate cmpC (name, name')) = EQUAL end fun ins (attrName, attrVal) = let fun error () = ( Err.badAttrVal ctx (attrName, attrValToString attrVal); NONE) fun cvt (AT_IMPLICIT, IMPLICIT) = SOME IMPLICIT | cvt (AT_INSTANCE, IMPLICIT) = SOME(NAME attrName) | cvt (AT_TEXT, v) = SOME v | cvt (AT_NUMBER, v) = SOME v | cvt (AT_NAMES names, (NAME s | STRING s)) = ( case (List.find (eqName s) names) of NONE => error() | (SOME name) => SOME(NAME name) (* end case *)) | cvt (AT_IMPLICIT, (NAME s | STRING s)) = if (s = attrName) then SOME IMPLICIT else error() | cvt _ = error() in case (HTbl.find attrTbl attrName) of NONE => Err.unknownAttr ctx attrName | (SOME(id, ty)) => update (id, cvt (ty, attrVal)) (* end case *) end in List.app ins attrs; AVec{vec = attrArray, ctx = ctx} end (* given an attribute map and attribute name, return a function that * fetches a value from the attribute's slot in an attribute vector. *) fun bindFindAttr (AMap{attrTbl, ...}, attr) = let val (id, _) = HTbl.lookup attrTbl attr in fn (AVec{vec, ...}) => Array.sub(vec, id) end (* return the context of the element that contains the attribute vector *) fun getContext (AVec{ctx, ...}) = ctx end (* abstype *) fun getFlag (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) fun get attrVec = (case (getFn attrVec) of NONE => false | _ => true (* end case *)) in get end fun getCDATA (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) fun get attrVec = (case (getFn attrVec) of NONE => NONE | (SOME((STRING s) | (NAME s))) => SOME s | _ => ( Err.missingAttrVal (getContext attrVec) attr; NONE) (* end case *)) in get end fun getNAMES fromString (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) fun get attrVec = (case (getFn attrVec) of NONE => NONE | (SOME(NAME s)) => fromString s | (SOME v) => (** This case should be impossible, since attrListToVec ** ensures that AT_NAMES valued attributes are always NAME. **) raise Fail "getNAMES" (* end case *)) in get end fun getNUMBER (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) fun get attrVec = (case (getFn attrVec) of NONE => NONE | (SOME((STRING s) | (NAME s))) => (case (Int.fromString s) of NONE => ( Err.badAttrVal (getContext attrVec) (attr, s); NONE) | someN => someN (* end case *)) | SOME IMPLICIT => raise Fail "getNUMBER: IMPLICIT unexpected" (* end case *)) in get end fun getChar (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) fun get attrVec = (case (getFn attrVec) of NONE => NONE | (SOME((STRING s) | (NAME s))) => if (size s = 1) then SOME(String.sub(s, 0)) (** NOTE: we should probably accept &#xx; as a character value **) else ( Err.badAttrVal (getContext attrVec) (attr, s); NONE) | SOME IMPLICIT => raise Fail "getChar: IMPLICIT unexpected" (* end case *)) in get end fun require (getFn, attrMap, attr, dflt) = let val getFn = getFn (attrMap, attr) fun get attrVec = (case getFn attrVec of NONE => (Err.missingAttr (getContext attrVec) attr; dflt) | (SOME v) => v (* end case *)) in get end (**** Element ISINDEX ****) local val attrMap = mkAttrs [ ("PROMPT", AT_TEXT) ] val getPROMPT = getCDATA (attrMap, "PROMPT") in (* the ISINDEX element can occur in both the HEAD an BODY, so there are * two datatype constructors for it. We just define the argument of the * constructor here. *) fun mkISINDEX (ctx, attrs) = { prompt = getPROMPT (attrListToVec(ctx, attrMap, attrs)) } end (* local *) (**** Element BASE ****) local val attrMap = mkAttrs [ ("HREF", AT_TEXT) ] val getHREF = require (getCDATA, attrMap, "HREF", "") in fun mkBASE (ctx, attrs) = HTML.Head_BASE{ href = getHREF(attrListToVec(ctx, attrMap, attrs)) } end (* local *) (**** Element META ****) local val attrMap = mkAttrs [ ("HTTP-EQUIV", AT_TEXT), ("NAME", AT_TEXT), ("CONTENT", AT_TEXT) ] val getHTTP_EQUIV = getCDATA (attrMap, "HTTP-EQUIV") val getNAME = getCDATA (attrMap, "NAME") val getCONTENT = require (getCDATA, attrMap, "CONTENT", "") in fun mkMETA (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.Head_META{ httpEquiv = getHTTP_EQUIV attrVec, name = getNAME attrVec, content = getCONTENT attrVec } end end (* local *) (**** Element LINK ****) local val attrMap = mkAttrs [ ("HREF", AT_TEXT), ("ID", AT_TEXT), ("TITLE", AT_TEXT), ("REL", AT_TEXT), ("REV", AT_TEXT) ] val getHREF = getCDATA (attrMap, "HREF") val getID = getCDATA (attrMap, "ID") val getREL = getCDATA (attrMap, "REL") val getREV = getCDATA (attrMap, "REV") val getTITLE = getCDATA (attrMap, "TITLE") in fun mkLINK (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.Head_LINK{ href = getHREF attrVec, id = getID attrVec, rel = getREL attrVec, rev = getREV attrVec, title = getTITLE attrVec } end end (* local *) (**** Element BODY ****) local val attrMap = mkAttrs [ ("BACKGROUND", AT_TEXT), ("BGCOLOR", AT_TEXT), ("TEXT", AT_TEXT), ("LINK", AT_TEXT), ("VLINK", AT_TEXT), ("ALINK", AT_TEXT) ] val getBACKGROUND = getCDATA (attrMap, "BACKGROUND") val getBGCOLOR = getCDATA (attrMap, "BGCOLOR") val getTEXT = getCDATA (attrMap, "TEXT") val getLINK = getCDATA (attrMap, "LINK") val getVLINK = getCDATA (attrMap, "VLINK") val getALINK = getCDATA (attrMap, "ALINK") in fun mkBODY (ctx, attrs, blk) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.BODY{ background = getBACKGROUND attrVec, bgcolor = getBGCOLOR attrVec, text = getTEXT attrVec, link = getLINK attrVec, vlink = getVLINK attrVec, alink = getALINK attrVec, content = blk } end end (* local *) (**** Elements H1, H2, H3, H4, H5, H6 and P ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]) ] val getALIGN = getNAMES HTML.HAlign.fromString (attrMap, "ALIGN") in fun mkHn (n, ctx, attrs, text) = HTML.Hn{ n = n, align = getALIGN(attrListToVec(ctx, attrMap, attrs)), content = text } fun mkP (ctx, attrs, text) = HTML.P{ align = getALIGN(attrListToVec(ctx, attrMap, attrs)), content = text } end (* local *) (**** Element UL ****) local val attrMap = mkAttrs [ ("COMPACT", AT_IMPLICIT), ("TYPE", AT_NAMES["DISC", "SQUARE", "CIRCLE"]) ] val getCOMPACT = getFlag(attrMap, "COMPACT") val getTYPE = getNAMES HTML.ULStyle.fromString (attrMap, "TYPE") in fun mkUL (ctx, attrs, items) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.UL{ ty = getTYPE attrVec, compact = getCOMPACT attrVec, content = items } end end (* local *) (**** Element OL ****) local val attrMap = mkAttrs [ ("COMPACT", AT_IMPLICIT), ("START", AT_NUMBER), ("TYPE", AT_TEXT) ] val getCOMPACT = getFlag(attrMap, "COMPACT") val getSTART = getNUMBER(attrMap, "START") val getTYPE = getCDATA(attrMap, "TYPE") in fun mkOL (ctx, attrs, items) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.OL{ compact = getCOMPACT attrVec, start = getSTART attrVec, ty = getTYPE attrVec, content = items } end end (* local *) (**** Elements DIR, MENU and DL ****) local val attrMap = mkAttrs [ ("COMPACT", AT_IMPLICIT) ] val getCOMPACT = getFlag(attrMap, "COMPACT") in fun mkDIR (ctx, attrs, items) = HTML.DIR{ compact = getCOMPACT (attrListToVec(ctx, attrMap, attrs)), content = items } fun mkMENU (ctx, attrs, items) = HTML.MENU{ compact = getCOMPACT (attrListToVec(ctx, attrMap, attrs)), content = items } fun mkDL (ctx, attrs, items) = HTML.DL{ compact = getCOMPACT (attrListToVec(ctx, attrMap, attrs)), content = items } end (* local *) (**** Element LI ****) local val attrMap = mkAttrs [ ("TYPE", AT_TEXT), ("VALUE", AT_NUMBER) ] val getTYPE = getCDATA(attrMap, "TYPE") val getVALUE = getNUMBER(attrMap, "VALUE") in fun mkLI (ctx, attrs, text) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.LI{ ty = getTYPE attrVec, value = getVALUE attrVec, content = text } end end (* local *) (**** Element PRE ****) local val attrMap = mkAttrs [ ("WIDTH", AT_NUMBER) ] val getWIDTH = getNUMBER(attrMap, "WIDTH") in fun mkPRE (ctx, attrs, text) = HTML.PRE{ width = getWIDTH (attrListToVec (ctx, attrMap, attrs)), content = text } end (* local *) (**** Element DIV ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]) ] val getALIGN = require (getNAMES HTML.HAlign.fromString, attrMap, "ALIGN", HTML.HAlign.left) in fun mkDIV (ctx, attrs, content) = HTML.DIV{ align = getALIGN(attrListToVec(ctx, attrMap, attrs)), content = content } end (* local *) (**** Element FORM ****) local val attrMap = mkAttrs [ ("ACTION", AT_TEXT), ("METHOD", AT_NAMES["GET", "PUT"]), ("ENCTYPE", AT_TEXT) ] val getACTION = getCDATA (attrMap, "ACTION") val getMETHOD = require (getNAMES HTML.HttpMethod.fromString, attrMap, "METHOD", HTML.HttpMethod.get) val getENCTYPE = getCDATA (attrMap, "ENCTYPE") in fun mkFORM (ctx, attrs, contents) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.FORM{ action = getACTION attrVec, method = getMETHOD attrVec, enctype = getENCTYPE attrVec, content = contents } end end (* local *) (**** Element HR ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]), ("NOSHADE", AT_IMPLICIT), ("SIZE", AT_TEXT), ("WIDTH", AT_TEXT) ] val getALIGN = getNAMES HTML.HAlign.fromString (attrMap, "ALIGN") val getNOSHADE = getFlag (attrMap, "NOSHADE") val getSIZE = getCDATA (attrMap, "SIZE") val getWIDTH = getCDATA (attrMap, "WIDTH") in fun mkHR (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.HR{ align = getALIGN attrVec, noshade = getNOSHADE attrVec, size = getSIZE attrVec, width = getWIDTH attrVec } end end (* local *) (**** Element TABLE ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]), ("BORDER", AT_TEXT), ("CELLSPACING", AT_TEXT), ("CELLPADDING", AT_TEXT), ("WIDTH", AT_TEXT) ] val getALIGN = getNAMES HTML.HAlign.fromString (attrMap, "ALIGN") val getBORDER = getCDATA (attrMap, "BORDER") val getCELLSPACING = getCDATA (attrMap, "CELLSPACING") val getCELLPADDING = getCDATA (attrMap, "CELLPADDING") val getWIDTH = getCDATA (attrMap, "WIDTH") in fun mkTABLE (ctx, attrs, {caption, body}) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.TABLE{ align = getALIGN attrVec, border = getBORDER attrVec, cellspacing = getCELLSPACING attrVec, cellpadding = getCELLPADDING attrVec, width = getWIDTH attrVec, caption = caption, content = body } end end (* local *) (**** Element CAPTION ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["TOP", "BOTTOM"]) ] val getALIGN = getNAMES HTML.CaptionAlign.fromString (attrMap, "ALIGN") in fun mkCAPTION (ctx, attrs, text) = HTML.CAPTION{ align = getALIGN(attrListToVec(ctx, attrMap, attrs)), content = text } end (* local *) (**** Element TR ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]), ("VALIGN", AT_NAMES["TOP", "MIDDLE", "BOTTOM", "BASELINE"]) ] val getALIGN = getNAMES HTML.HAlign.fromString (attrMap, "ALIGN") val getVALIGN = getNAMES HTML.CellVAlign.fromString (attrMap, "VALIGN") in fun mkTR (ctx, attrs, cells) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.TR{ align = getALIGN attrVec, valign = getVALIGN attrVec, content = cells } end end (* local *) (**** Elements TH and TD ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["LEFT", "CENTER", "RIGHT"]), ("COLSPAN", AT_NUMBER), ("HEIGHT", AT_TEXT), ("NOWRAP", AT_IMPLICIT), ("ROWSPAN", AT_NUMBER), ("VALIGN", AT_NAMES["TOP", "MIDDLE", "BOTTOM", "BASELINE"]), ("WIDTH", AT_TEXT) ] val getALIGN = getNAMES HTML.HAlign.fromString (attrMap, "ALIGN") val getCOLSPAN = getNUMBER (attrMap, "COLSPAN") val getHEIGHT = getCDATA (attrMap, "HEIGHT") val getNOWRAP = getFlag (attrMap, "NOWRAP") val getROWSPAN = getNUMBER (attrMap, "ROWSPAN") val getVALIGN = getNAMES HTML.CellVAlign.fromString (attrMap, "VALIGN") val getWIDTH = getCDATA (attrMap, "WIDTH") fun mkCell (ctx, attrs, cells) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in { align = getALIGN attrVec, colspan = getCOLSPAN attrVec, height = getHEIGHT attrVec, nowrap = getNOWRAP attrVec, rowspan = getROWSPAN attrVec, valign = getVALIGN attrVec, width = getWIDTH attrVec, content = cells } end in fun mkTH arg = HTML.TH(mkCell arg) fun mkTD arg = HTML.TD(mkCell arg) end (* local *) (**** Element A ****) local val attrMap = mkAttrs [ ("HREF", AT_TEXT), ("NAME", AT_TEXT), ("REL", AT_TEXT), ("REV", AT_TEXT), ("TITLE", AT_TEXT) ] val getHREF = getCDATA (attrMap, "HREF") val getNAME = getCDATA (attrMap, "NAME") val getREL = getCDATA (attrMap, "REL") val getREV = getCDATA (attrMap, "REV") val getTITLE = getCDATA (attrMap, "TITLE") in fun mkA (ctx, attrs, contents) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.A{ name = getNAME attrVec, href = getHREF attrVec, rel = getREL attrVec, rev = getREV attrVec, title = getTITLE attrVec, content = contents } end end (* local *) (**** Element IMG ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["TOP", "MIDDLE", "BOTTOM", "LEFT", "RIGHT"]), ("ALT", AT_TEXT), ("BORDER", AT_TEXT), ("HEIGHT", AT_TEXT), ("HSPACE", AT_TEXT), ("ISMAP", AT_IMPLICIT), ("SRC", AT_TEXT), ("USEMAP", AT_TEXT), ("VSPACE", AT_TEXT), ("WIDTH", AT_TEXT) ] val getALIGN = getNAMES HTML.IAlign.fromString (attrMap, "ALIGN") val getALT = getCDATA (attrMap, "ALT") val getBORDER = getCDATA (attrMap, "BORDER") val getHEIGHT = getCDATA (attrMap, "HEIGHT") val getHSPACE = getCDATA (attrMap, "HSPACE") val getISMAP = getFlag (attrMap, "ISMAP") val getSRC = require (getCDATA, attrMap, "SRC", "") val getUSEMAP = getCDATA (attrMap, "USEMAP") val getVSPACE = getCDATA (attrMap, "VSPACE") val getWIDTH = getCDATA (attrMap, "WIDTH") in fun mkIMG (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.IMG{ src = getSRC attrVec, alt = getALT attrVec, align = getALIGN attrVec, height = getHEIGHT attrVec, width = getWIDTH attrVec, border = getBORDER attrVec, hspace = getHSPACE attrVec, vspace = getVSPACE attrVec, usemap = getUSEMAP attrVec, ismap = getISMAP attrVec } end end (* local *) (**** Element APPLET ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["TOP", "MIDDLE", "BOTTOM", "LEFT", "RIGHT"]), ("ALT", AT_TEXT), ("CODE", AT_TEXT), ("CODEBASE", AT_TEXT), ("HEIGHT", AT_TEXT), ("HSPACE", AT_TEXT), ("NAME", AT_TEXT), ("VSPACE", AT_TEXT), ("WIDTH", AT_TEXT) ] val getALIGN = getNAMES HTML.IAlign.fromString (attrMap, "ALIGN") val getALT = getCDATA (attrMap, "ALT") val getCODE = require (getCDATA, attrMap, "CODE", "") val getCODEBASE = getCDATA (attrMap, "CODEBASE") val getHEIGHT = getCDATA (attrMap, "HEIGHT") val getHSPACE = getCDATA (attrMap, "HSPACE") val getNAME = getCDATA (attrMap, "NAME") val getVSPACE = getCDATA (attrMap, "VSPACE") val getWIDTH = getCDATA (attrMap, "WIDTH") in fun mkAPPLET (ctx, attrs, content) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.APPLET{ codebase = getCODEBASE attrVec, code = getCODE attrVec, name = getNAME attrVec, alt = getALT attrVec, align = getALIGN attrVec, height = getHEIGHT attrVec, width = getWIDTH attrVec, hspace = getHSPACE attrVec, vspace = getVSPACE attrVec, content = content } end end (* local *) (**** Element PARAM ****) local val attrMap = mkAttrs [ ("NAME", AT_TEXT), ("VALUE", AT_TEXT) ] val getNAME = require (getCDATA, attrMap, "NAME", "") val getVALUE = getCDATA (attrMap, "VALUE") in fun mkPARAM (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.PARAM{ name = getNAME attrVec, value = getVALUE attrVec } end end (* local *) (**** Element FONT ****) local val attrMap = mkAttrs [ ("COLOR", AT_TEXT), ("SIZE", AT_TEXT) ] val getCOLOR = getCDATA (attrMap, "COLOR") val getSIZE = getCDATA (attrMap, "SIZE") in fun mkFONT (ctx, attrs, content) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.FONT{ size = getSIZE attrVec, color = getCOLOR attrVec, content = content } end end (* local *) (**** Element BASEFONT ****) local val attrMap = mkAttrs [ ("SIZE", AT_TEXT) ] val getSIZE = getCDATA (attrMap, "SIZE") in fun mkBASEFONT (ctx, attrs, content) = HTML.BASEFONT{ size = getSIZE(attrListToVec(ctx, attrMap, attrs)), content = content } end (* local *) (**** Element BR ****) local val attrMap = mkAttrs [ ("CLEAR", AT_NAMES["LEFT", "RIGHT", "ALL", "NONE"]) ] val getCLEAR = getNAMES HTML.TextFlowCtl.fromString (attrMap, "CLEAR") in fun mkBR (ctx, attrs) = HTML.BR{ clear = getCLEAR(attrListToVec(ctx, attrMap, attrs)) } end (* local *) (**** Element MAP ****) local val attrMap = mkAttrs [ ("NAME", AT_TEXT) ] val getNAME = getCDATA (attrMap, "NAME") in fun mkMAP (ctx, attrs, content) = HTML.MAP{ name = getNAME (attrListToVec(ctx, attrMap, attrs)), content = content } end (* local *) (**** Element INPUT ****) local val attrMap = mkAttrs [ ("ALIGN", AT_NAMES["TOP", "MIDDLE", "BOTTOM", "LEFT", "RIGHT"]), ("CHECKED", AT_IMPLICIT), ("MAXLENGTH", AT_NUMBER), ("NAME", AT_TEXT), ("SIZE", AT_TEXT), ("SRC", AT_TEXT), ("TYPE", AT_NAMES[ "TEXT", "PASSWORD", "CHECKBOX", "RADIO", "SUBMIT", "RESET", "FILE", "HIDDEN", "IMAGE" ]), ("VALUE", AT_TEXT) ] val getALIGN = getNAMES HTML.IAlign.fromString (attrMap, "ALIGN") val getCHECKED = getFlag (attrMap, "CHECKED") val getMAXLENGTH = getNUMBER (attrMap, "MAXLENGTH") val getNAME = getCDATA (attrMap, "NAME") val getSIZE = getCDATA (attrMap, "SIZE") val getSRC = getCDATA (attrMap, "SRC") val getTYPE = getNAMES HTML.InputType.fromString (attrMap, "TYPE") val getVALUE = getCDATA (attrMap, "VALUE") in fun mkINPUT (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.INPUT{ ty = getTYPE attrVec, name = getNAME attrVec, value = getVALUE attrVec, src = getSRC attrVec, checked = getCHECKED attrVec, size = getSIZE attrVec, maxlength = getMAXLENGTH attrVec, align = getALIGN attrVec } end end (* local *) (**** Element SELECT ****) local val attrMap = mkAttrs [ ("NAME", AT_TEXT), ("SIZE", AT_TEXT) ] val getNAME = require (getCDATA, attrMap, "NAME", "") val getSIZE = getNUMBER (attrMap, "SIZE") in fun mkSELECT (ctx, attrs, contents) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.SELECT{ name = getNAME attrVec, size = getSIZE attrVec, content = contents } end end (* local *) (**** Element TEXTAREA ****) local val attrMap = mkAttrs [ ("NAME", AT_TEXT), ("ROWS", AT_NUMBER), ("COLS", AT_NUMBER) ] val getNAME = require (getCDATA, attrMap, "NAME", "") val getROWS = require (getNUMBER, attrMap, "ROWS", 0) val getCOLS = require (getNUMBER, attrMap, "COLS", 0) in fun mkTEXTAREA (ctx, attrs, contents) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.TEXTAREA{ name = getNAME attrVec, rows = getROWS attrVec, cols = getCOLS attrVec, content = contents } end end (* local *) (**** Element AREA ****) local val attrMap = mkAttrs [ ("ALT", AT_TEXT), ("COORDS", AT_TEXT), ("HREF", AT_TEXT), ("NOHREF", AT_IMPLICIT), ("SHAPE", AT_NAMES["RECT", "CIRCLE", "POLY", "DEFAULT"]) ] val getALT = require (getCDATA, attrMap, "ALT", "") val getCOORDS = getCDATA (attrMap, "COORDS") val getHREF = getCDATA (attrMap, "HREF") val getNOHREF = getFlag (attrMap, "NOHREF") val getSHAPE = getNAMES HTML.Shape.fromString (attrMap, "SHAPE") in fun mkAREA (ctx, attrs) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.AREA{ shape = getSHAPE attrVec, coords = getCOORDS attrVec, href = getHREF attrVec, nohref = getNOHREF attrVec, alt = getALT attrVec } end end (* local *) (**** Element OPTION ****) local val attrMap = mkAttrs [ ("SELECTED", AT_IMPLICIT), ("VALUE", AT_TEXT) ] val getSELECTED = getFlag (attrMap, "SELECTED") val getVALUE = getCDATA (attrMap, "VALUE") in fun mkOPTION (ctx, attrs, contents) = let val attrVec = attrListToVec(ctx, attrMap, attrs) in HTML.OPTION{ selected = getSELECTED attrVec, value = getVALUE attrVec, content = contents } end end (* local *) end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-attrs-sig.sml���������������������������������0000664�0000000�0000000�00000005130�14162643450�0024511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-attrs.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This is the interface to HTMLAttrs, which provides support for parsing * element start tags. *) signature HTML_ATTRS = sig type context = {file : string option, line : int} (* support for building elements that have attributes *) datatype attr_val = datatype HTMLAttrVals.attr_val type attrs = (string * attr_val) list val mkISINDEX : (context * attrs) -> {prompt : HTML.cdata option} val mkBASE : (context * attrs) -> HTML.head_content val mkMETA : (context * attrs) -> HTML.head_content val mkLINK : (context * attrs) -> HTML.head_content val mkBODY : (context * attrs * HTML.block) -> HTML.body val mkHn : (int * context * attrs * HTML.text) -> HTML.block val mkP : (context * attrs * HTML.text) -> HTML.block val mkUL : (context * attrs * HTML.list_item list) -> HTML.block val mkOL : (context * attrs * HTML.list_item list) -> HTML.block val mkDIR : (context * attrs * HTML.list_item list) -> HTML.block val mkMENU : (context * attrs * HTML.list_item list) -> HTML.block val mkLI : (context * attrs * HTML.block) -> HTML.list_item val mkDL : (context * attrs * {dt : HTML.text list, dd : HTML.block} list) -> HTML.block val mkPRE : (context * attrs * HTML.text) -> HTML.block val mkDIV : (context * attrs * HTML.block) -> HTML.block val mkFORM : (context * attrs * HTML.block) -> HTML.block val mkHR : (context * attrs) -> HTML.block val mkTABLE : (context * attrs * { caption : HTML.caption option, body : HTML.tr list }) -> HTML.block val mkCAPTION : (context * attrs * HTML.text) -> HTML.caption val mkTR : (context * attrs * HTML.table_cell list) -> HTML.tr val mkTH : (context * attrs * HTML.block) -> HTML.table_cell val mkTD : (context * attrs * HTML.block) -> HTML.table_cell val mkA : (context * attrs * HTML.text) -> HTML.text val mkIMG : (context * attrs) -> HTML.text val mkAPPLET : (context * attrs * HTML.text) -> HTML.text val mkPARAM : (context * attrs) -> HTML.text val mkFONT : (context * attrs * HTML.text) -> HTML.text val mkBASEFONT : (context * attrs * HTML.text) -> HTML.text val mkBR : (context * attrs) -> HTML.text val mkMAP : (context * attrs * HTML.area list) -> HTML.text val mkINPUT : (context * attrs) -> HTML.text val mkSELECT : (context * attrs * HTML.select_option list) -> HTML.text val mkTEXTAREA : (context * attrs * HTML.pcdata) -> HTML.text val mkAREA : (context * attrs) -> HTML.area val mkOPTION : (context * attrs * HTML.pcdata) -> HTML.select_option end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-defaults.sml����������������������������������0000664�0000000�0000000�00000001070�14162643450�0024402�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-defaults.sml * * COPYRIGHT (c) 1996 AT&T Research. * * Some HTML attributes have default values specified by the DTD; this * file defines values for these. *) structure HTMLDefaults = struct val br_clear = HTML.TextFlowCtl.none val area_shape = HTML.Shape.rect val form_method = HTML.HttpMethod.get val form_enctype = "application/x-www-form-urlencoded" val input_type = HTML.InputType.text val input_align = HTML.IAlign.top val th_rowspan = 1 val th_colspan = 1 val td_rowspan = 1 val td_colspan = 1 end; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-elements-fn.sml�������������������������������0000664�0000000�0000000�00000021000�14162643450�0025003�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-elements-fn.sml * * COPYRIGHT (c) 1996 AT&T REsearch. * * This module builds element tags for the lexer. *) functor HTMLElementsFn ( structure Tokens : HTML_TOKENS structure Err : HTML_ERROR structure HTMLAttrs : HTML_ATTRS ) : sig structure T : HTML_TOKENS type pos = int val startTag : string option -> (string * pos * pos) -> (T.svalue, pos) T.token option val endTag : string option -> (string * pos * pos) -> (T.svalue, pos) T.token option end = struct structure T = Tokens structure A = HTMLAttrs type pos = int datatype start_tag = WAttrs of ((A.attrs * pos * pos) -> (T.svalue, pos) T.token) | WOAttrs of ((pos * pos) -> (T.svalue, pos) T.token) datatype end_tag = End of ((pos * pos) -> (T.svalue, pos) T.token) | Empty val tokenData = [ ("A", WAttrs T.START_A, End T.END_A), ("ADDRESS", WOAttrs T.START_ADDRESS, End T.END_ADDRESS), ("APPLET", WAttrs T.START_APPLET, End T.END_APPLET), ("AREA", WAttrs T.TAG_AREA, Empty), ("B", WOAttrs T.START_B, End T.END_B), ("BASE", WAttrs T.TAG_BASE, Empty), ("BASEFONT", WAttrs T.START_BASEFONT, End T.END_BASEFONT), ("BIG", WOAttrs T.START_BIG, End T.END_BIG), ("BLOCKQUOTE", WOAttrs T.START_BLOCKQUOTE, End T.END_BLOCKQUOTE), ("BODY", WAttrs T.START_BODY, End T.END_BODY), ("BR", WAttrs T.TAG_BR, Empty), ("CAPTION", WAttrs T.START_CAPTION, End T.END_CAPTION), ("CENTER", WOAttrs T.START_CENTER, End T.END_CENTER), ("CITE", WOAttrs T.START_CITE, End T.END_CITE), ("CODE", WOAttrs T.START_CODE, End T.END_CODE), ("DD", WOAttrs T.START_DD, End T.END_DD), ("DFN", WOAttrs T.START_DFN, End T.END_DFN), ("DIR", WAttrs T.START_DIR, End T.END_DIR), ("DIV", WAttrs T.START_DIV, End T.END_DIV), ("DL", WAttrs T.START_DL, End T.END_DL), ("DT", WOAttrs T.START_DT, End T.END_DT), ("EM", WOAttrs T.START_EM, End T.END_EM), ("FONT", WAttrs T.START_FONT, End T.END_FONT), ("FORM", WAttrs T.START_FORM, End T.END_FORM), ("H1", WAttrs T.START_H1, End T.END_H1), ("H2", WAttrs T.START_H2, End T.END_H2), ("H3", WAttrs T.START_H3, End T.END_H3), ("H4", WAttrs T.START_H4, End T.END_H4), ("H5", WAttrs T.START_H5, End T.END_H5), ("H6", WAttrs T.START_H6, End T.END_H6), ("HEAD", WOAttrs T.START_HEAD, End T.END_HEAD), ("HR", WAttrs T.TAG_HR, Empty), ("HTML", WOAttrs T.START_HTML, End T.END_HTML), ("I", WOAttrs T.START_I, End T.END_I), ("IMG", WAttrs T.TAG_IMG, Empty), ("INPUT", WAttrs T.TAG_INPUT, Empty), ("ISINDEX", WAttrs T.TAG_ISINDEX, Empty), ("KBD", WOAttrs T.START_KBD, End T.END_KBD), ("LI", WAttrs T.START_LI, End T.END_LI), ("LINK", WAttrs T.TAG_LINK, Empty), ("MAP", WAttrs T.START_MAP, End T.END_MAP), ("MENU", WAttrs T.START_MENU, End T.END_MENU), ("META", WAttrs T.TAG_META, Empty), ("OL", WAttrs T.START_OL, End T.END_OL), ("OPTION", WAttrs T.START_OPTION, End T.END_OPTION), ("P", WAttrs T.START_P, End T.END_P), ("PARAM", WAttrs T.TAG_PARAM, Empty), ("PRE", WAttrs T.START_PRE, End T.END_PRE), ("SAMP", WOAttrs T.START_SAMP, End T.END_SAMP), ("SCRIPT", WOAttrs T.START_SCRIPT, End T.END_SCRIPT), ("SELECT", WAttrs T.START_SELECT, End T.END_SELECT), ("SMALL", WOAttrs T.START_SMALL, End T.END_SMALL), ("STRIKE", WOAttrs T.START_STRIKE, End T.END_STRIKE), ("STRONG", WOAttrs T.START_STRONG, End T.END_STRONG), ("STYLE", WOAttrs T.START_STYLE, End T.END_STYLE), ("SUB", WOAttrs T.START_SUB, End T.END_SUB), ("SUP", WOAttrs T.START_SUP, End T.END_SUP), ("TABLE", WAttrs T.START_TABLE, End T.END_TABLE), ("TD", WAttrs T.START_TD, End T.END_TD), ("TEXTAREA", WAttrs T.START_TEXTAREA, End T.END_TEXTAREA), ("TH", WAttrs T.START_TH, End T.END_TH), ("TITLE", WOAttrs T.START_TITLE, End T.END_TITLE), ("TR", WAttrs T.START_TR, End T.END_TR), ("TT", WOAttrs T.START_TT, End T.END_TT), ("U", WOAttrs T.START_U, End T.END_U), ("UL", WAttrs T.START_UL, End T.END_UL), ("VAR", WOAttrs T.START_VAR, End T.END_VAR) ] structure HTbl = HashTableFn (struct type hash_key = string val hashVal = HashString.hashString val sameKey = (op = : (string * string) -> bool) end) val elemTbl = let val tbl = HTbl.mkTable (length tokenData, Fail "HTMLElements") fun ins (tag, startTok, endTok) = HTbl.insert tbl (tag, {startT=startTok, endT=endTok}) in List.app ins tokenData; tbl end structure SS = Substring fun canonName name = SS.translate (String.str o Char.toUpper) name fun find name = (HTbl.find elemTbl (canonName name)) val skipWS = SS.dropl Char.isSpace fun scanStr (ctx, quoteChar, ss) = let val (str, rest) = SS.splitl (fn c => (c <> quoteChar)) ss in if (SS.isEmpty rest) then ( Err.lexError ctx "missing close quote for string"; (A.STRING(SS.string str), rest)) else (A.STRING(SS.string str), SS.triml 1 rest) end (* scan an attribute value from a substring, returning the value, and * the rest of the substring. Attribute values have one of the following * forms: * 1) a name token (a sequence of letters, digits, periods, or hyphens). * 2) a string literal enclosed in "" * 3) a string literal enclosed in '' *) fun scanAttrVal (ctx, attrName, ss) = let fun isNameChar (#"." | #"-") = true | isNameChar c = (Char.isAlphaNum c) in case SS.getc ss of NONE => (A.IMPLICIT, ss) | (SOME(#"\"", rest)) => scanStr (ctx, #"\"", rest) | (SOME(#"'", rest)) => scanStr (ctx, #"'", rest) | (SOME(c, _)) => let (** * Unquoted attributes should be Names, but this is often not * the case, so we terminate them on whitespace or ">". *) val notNameChar = ref false fun isAttrChar c = if ((Char.isSpace c) orelse (c = #">")) then false else ( if isNameChar c then () else notNameChar := true; true) val (value, rest) = SS.splitl isAttrChar ss in if (SS.isEmpty value) then ( Err.badAttrVal ctx (SS.string attrName, ""); (A.IMPLICIT, ss)) else if (! notNameChar) then ( Err.unquotedAttrVal ctx (SS.string attrName); (A.STRING(SS.string value), rest)) else (A.NAME(SS.string value), rest) end (* end case *) end fun scanStartTag (ctx, ss) = let val (name, rest) = SS.splitl (not o Char.isSpace) ss fun scanAttrs (rest, attrs) = let val rest = skipWS rest in case SS.getc rest of NONE => (name, List.rev attrs) | (SOME(#"\"", rest)) => ( Err.lexError ctx "bogus text in element"; scanAttrs (#2(scanStr (ctx, #"\"", rest)), attrs)) | (SOME(#"'", rest)) => ( Err.lexError ctx "bogus text in element"; scanAttrs (#2(scanStr (ctx, #"'", rest)), attrs)) | (SOME(c, rest')) => if Char.isAlpha c then let val (aName, rest) = SS.splitl Char.isAlphaNum rest val rest = skipWS rest in case (SS.getc rest) of (SOME(#"=", rest)) => let (* get the attribute value *) val (aVal, rest) = scanAttrVal (ctx, aName, skipWS rest) in scanAttrs (rest, (canonName aName, aVal)::attrs) end | _ => scanAttrs (rest, (canonName aName, A.IMPLICIT)::attrs) (* end case *) end else ( Err.lexError ctx "bogus character in element"; scanAttrs (rest', attrs)) (* end case *) end in scanAttrs(rest, []) end fun startTag file (tag, p1, p2) = let val ctx = {file=file, line=p1} val tag' = SS.triml 1 (SS.trimr 1 (SS.full tag)) val (name, attrs) = scanStartTag (ctx, tag') in case (find name, attrs) of (NONE, _) => (Err.badStartTag ctx (SS.string name); NONE) | (SOME{startT=WOAttrs _, ...}, _::_) => ( List.app (Err.unknownAttr ctx o #1) attrs; NONE) | (SOME{startT=WOAttrs tag, ...}, []) => SOME(tag (p1, p2)) | (SOME{startT=WAttrs tag, ...}, attrs) => SOME(tag (attrs, p1, p2)) (* end case *) end fun endTag file (tag, p1, p2) = let val ctx = {file=file, line=p1} val name = SS.triml 2 (SS.trimr 1 (SS.full tag)) in case (find name) of NONE => (Err.badEndTag ctx (SS.string name); NONE) | (SOME{endT=Empty, ...}) => (Err.badEndTag ctx (SS.string name); NONE) | (SOME{endT=End endTok, ...}) => SOME(endTok (p1, p2)) (* end case *) end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-error-sig.sml���������������������������������0000664�0000000�0000000�00000002712�14162643450�0024510�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-error-sig.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This is the interface of the error functions supplied to the lexer * (and transitively, to HTMLElemnts). *) signature HTML_ERROR = sig type context = {file : string option, line : int} val badStartTag : context -> string -> unit (* called on unrecognized start tags; the string is the tag name *) val badEndTag : context -> string -> unit (* called on unrecognized end tags, or end tags for empty elements; * the string is the tag name. *) val badAttrVal : context -> (string * string) -> unit (* called on ill-formed attribute values; the first string is the * attribute name, and the second is the value. *) val lexError : context -> string -> unit (* called on other lexical errors; the string is an error message. *) val syntaxError : context -> string -> unit (* called on syntax errors; the string is an error message. *) val missingAttrVal : context -> string -> unit (* called when an attribute name is given without a value *) val missingAttr : context -> string -> unit (* called on a missing required attribute; the string is the attribute * name. *) val unknownAttr : context -> string -> unit (* called on unknown attributes; the string is the attribute name. *) val unquotedAttrVal : context -> string -> unit (* called when the attribute value should have been quoted, but wasn't; * the string is the attribute name. *) end ������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-gram������������������������������������������0000664�0000000�0000000�00000042023�14162643450�0022732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-gram * * COPYRIGHT (c) 1996 AT&T Research. * * This grammar parses HTML 3.2. Note that it does not enforce exclusions * (for the content of FORM, PRE, etc). Exclusions should be enforced as * a second pass over the parse tree. *) fun textList [text] = text | textList l = HTML.TextList l fun blockList [blk] = blk | blockList l = HTML.BlockList l fun textBlock l = HTML.TextBlock(textList l) (* The elements of a definition list (<DL>) are tags (<DT>) and items (<DD>). * To avoid shift/reduce problems, we parse them and then group them. *) datatype deflist_item = DL_tag of HTML.text | DL_item of HTML.block fun groupDefListContents [] = [] | groupDefListContents (h :: t) = let fun gdlc (DL_tag tag, []) = ({dt=[tag], dd=HTML.BlockList[]}, []) | gdlc (DL_tag tag, h :: t) = let val ({dt, dd}, r) = gdlc (h, t) in ({dt = tag :: dt, dd = dd}, r) end | gdlc (DL_item blk, r) = ({dt=[],dd=blk}, groupDefListContents r) in op :: (gdlc (h, t)) end (* A list of Text, paragraphs and blocks requires grouping the Text items and * making an implicit paragraph. We cannot directly use TextList because of * conflicts. *) datatype blklist_item = BL_text of HTML.text list | BL_block of HTML.block list fun consText (txt, BL_text tl :: r) = BL_text(txt::tl) :: r | consText (txt, l) = BL_text[txt] :: l fun consBlock (blk, BL_block bl :: r) = BL_block(blk::bl) :: r | consBlock (blk, l) = BL_block[blk] :: l fun mkBlock blks = let fun f (BL_text tl) = textBlock tl | f (BL_block bl) = blockList bl in blockList(List.map f blks) end fun mkBody blks = HTML.BODY{ background = NONE, bgcolor = NONE, text = NONE, link = NONE, vlink = NONE, alink = NONE, content = mkBlock blks } %% (* %pure *) %verbose %nonterm Document of HTML.html | StartHTML of HTML.cdata option | EndHTML | Head of HTML.head_content list | StartHEAD | EndHEAD | HeadContents of HTML.head_content list | HeadElements of HTML.head_content list | HeadElement of HTML.head_content | Body of HTML.body | StartBODY | EndBODY | BodyContent of HTML.block | BodyContent0 of HTML.body | BodyContent1 of blklist_item list | BodyContent2 of blklist_item list | BodyElement of HTML.block | AddressContent1 of blklist_item list | AddressContent2 of blklist_item list | BlockWOIndex of HTML.block | Block of HTML.block | Paragraph of HTML.block | List of HTML.block | ListItemList of HTML.list_item list | ListItem of HTML.list_item | DLItemList of deflist_item list | DLItem of deflist_item | Flow1 of blklist_item list | Flow2 of blklist_item list | EndLI | EndDT | EndDD | Preformatted of HTML.block | optCaption of HTML.caption option | TableRowList of HTML.tr list | TableRow of HTML.tr | TableCellList of HTML.table_cell list | TableCell of HTML.table_cell | TextList of HTML.text | TextList' of HTML.text list | TextWOScript of HTML.text | Text of HTML.text | Font of HTML.text | Phrase of HTML.text | Special of HTML.text | AreaList of HTML.area list | Form of HTML.text | OptionList of HTML.select_option list | EndOPTION | PCData of HTML.pcdata | PCDataList of HTML.pcdata list | PCDataElem of HTML.pcdata %term EOF (* tags in alphabetical order *) | START_A of HTMLAttrVals.attrs | END_A | START_ADDRESS | END_ADDRESS | START_APPLET of HTMLAttrVals.attrs | END_APPLET | TAG_AREA of HTMLAttrVals.attrs | START_B | END_B | TAG_BASE of HTMLAttrVals.attrs | START_BIG | END_BIG | START_BLOCKQUOTE | END_BLOCKQUOTE | START_BODY of HTMLAttrVals.attrs | END_BODY | TAG_BR of HTMLAttrVals.attrs | START_CAPTION of HTMLAttrVals.attrs | END_CAPTION | START_CENTER | END_CENTER | START_CITE | END_CITE | START_CODE | END_CODE | START_DD | END_DD | START_DFN | END_DFN | START_DIR of HTMLAttrVals.attrs | END_DIR | START_DIV of HTMLAttrVals.attrs | END_DIV | START_DL of HTMLAttrVals.attrs | END_DL | START_DT | END_DT | START_EM | END_EM | START_FONT of HTMLAttrVals.attrs | END_FONT | START_BASEFONT of HTMLAttrVals.attrs | END_BASEFONT | START_FORM of HTMLAttrVals.attrs | END_FORM | START_H1 of HTMLAttrVals.attrs | END_H1 | START_H2 of HTMLAttrVals.attrs | END_H2 | START_H3 of HTMLAttrVals.attrs | END_H3 | START_H4 of HTMLAttrVals.attrs | END_H4 | START_H5 of HTMLAttrVals.attrs | END_H5 | START_H6 of HTMLAttrVals.attrs | END_H6 | START_HEAD | END_HEAD | TAG_HR of HTMLAttrVals.attrs | START_HTML | END_HTML | START_I | END_I | TAG_IMG of HTMLAttrVals.attrs | TAG_INPUT of HTMLAttrVals.attrs | TAG_ISINDEX of HTMLAttrVals.attrs | START_KBD | END_KBD | START_LI of HTMLAttrVals.attrs | END_LI | TAG_LINK of HTMLAttrVals.attrs | START_MAP of HTMLAttrVals.attrs | END_MAP | START_MENU of HTMLAttrVals.attrs | END_MENU | TAG_META of HTMLAttrVals.attrs | START_OL of HTMLAttrVals.attrs | END_OL | START_OPTION of HTMLAttrVals.attrs | END_OPTION | START_P of HTMLAttrVals.attrs | END_P | TAG_PARAM of HTMLAttrVals.attrs | START_PRE of HTMLAttrVals.attrs | END_PRE | START_SAMP | END_SAMP | START_SCRIPT | END_SCRIPT | START_SELECT of HTMLAttrVals.attrs | END_SELECT | START_SMALL | END_SMALL | START_STRIKE | END_STRIKE | START_STRONG | END_STRONG | START_STYLE | END_STYLE | START_SUB | END_SUB | START_SUP | END_SUP | START_TABLE of HTMLAttrVals.attrs | END_TABLE | START_TD of HTMLAttrVals.attrs | END_TD | START_TEXTAREA of HTMLAttrVals.attrs | END_TEXTAREA | START_TH of HTMLAttrVals.attrs | END_TH | START_TITLE | END_TITLE | START_TR of HTMLAttrVals.attrs | END_TR | START_TT | END_TT | START_U | END_U | START_UL of HTMLAttrVals.attrs | END_UL | START_VAR | END_VAR (* raw text data *) | PCDATA of string | CHAR_REF of string (* &#dd; *) | ENTITY_REF of string (* &#name; *) %pure %pos int %name HTML %start Document %header ( functor HTMLLrValsFn ( structure Token : TOKEN structure HTMLAttrs : HTML_ATTRS)) %arg (ctx) : int -> HTMLAttrs.context %eop EOF %noshift EOF (* avoids infinite loop in error recovery *) (** Some error-correction support **) %value START_A ([]) %value START_APPLET ([ ("CODE", HTMLAttrs.NAME ""), ("WIDTH", HTMLAttrs.NAME ""), ("HEIGHT", HTMLAttrs.NAME "") ]) %value TAG_AREA ([("ALT", HTMLAttrs.NAME "")]) %value TAG_BASE ([("URL", HTMLAttrs.NAME "")]) %value START_BODY ([]) %value TAG_BR ([]) %value START_CAPTION ([]) %value START_DIR ([]) %value START_DIV ([]) %value START_DL ([]) %value START_FONT ([]) %value START_BASEFONT ([]) %value START_FORM ([]) %value START_H1 ([]) %value START_H2 ([]) %value START_H3 ([]) %value START_H4 ([]) %value START_H5 ([]) %value START_H6 ([]) %value TAG_HR ([]) %value TAG_IMG ([("SRC", HTMLAttrs.NAME "")]) %value TAG_INPUT ([]) %value TAG_ISINDEX ([]) %value TAG_LINK ([]) %value START_MAP ([]) %value START_MENU ([]) %value TAG_META ([("CONTENT", HTMLAttrs.NAME "")]) %value START_OL ([]) %value START_OPTION ([]) %value START_P ([]) %value TAG_PARAM ([("NAME", HTMLAttrs.NAME "")]) %value START_PRE ([]) %value START_SELECT ([("NAME", HTMLAttrs.NAME "")]) %value START_TABLE ([]) %value START_TD ([]) %value START_TEXTAREA ([ ("NAME", HTMLAttrs.NAME ""), ("ROWS", HTMLAttrs.NAME "0"), ("COLS", HTMLAttrs.NAME "0") ]) %value START_TH ([]) %value START_TR ([]) %value START_UL ([]) %% Document : StartHTML Head Body EndHTML (HTML.HTML{version=StartHTML, head=Head, body=Body}) StartHTML : (* empty *) (NONE) | START_HTML (NONE) EndHTML : (* empty *) () | END_HTML () (*** Head markup ***) Head : StartHEAD HeadContents EndHEAD (HeadContents) StartHEAD : (* empty *) () | START_HEAD () EndHEAD : (* empty *) () | END_HEAD () HeadContents : HeadElements START_TITLE PCData END_TITLE HeadElements (HeadElements1 @ (HTML.Head_TITLE PCData :: HeadElements2)) HeadElements : (* empty *) ([]) | HeadElement HeadElements (HeadElement :: HeadElements) HeadElement : TAG_META (HTMLAttrs.mkMETA(ctx TAG_METAleft, TAG_META)) | TAG_LINK (HTMLAttrs.mkLINK(ctx TAG_LINKleft, TAG_LINK)) | TAG_ISINDEX (let val stuff = HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) in HTML.Head_ISINDEX stuff end ) | TAG_BASE (HTMLAttrs.mkBASE(ctx TAG_BASEleft, TAG_BASE)) | START_STYLE PCData END_STYLE (HTML.Head_STYLE(PCData)) | START_SCRIPT PCData END_SCRIPT (HTML.Head_SCRIPT(PCData)) (*** Body content ***) Body : BodyContent0 EndBODY (BodyContent0) EndBODY : (* empty *) () | END_BODY () BodyContent : BodyContent1 (mkBlock BodyContent1) BodyContent0 : START_BODY BodyContent (HTMLAttrs.mkBODY(ctx START_BODYleft, START_BODY, BodyContent)) | TextWOScript BodyContent1 (mkBody(consText(TextWOScript, BodyContent1))) | BodyElement BodyContent1 (mkBody(consBlock(BodyElement, BodyContent1))) | BlockWOIndex BodyContent1 (mkBody(consBlock(BlockWOIndex, BodyContent1))) | Paragraph END_P BodyContent1 (mkBody(consBlock(Paragraph, BodyContent1))) | Paragraph BodyContent2 (mkBody(consBlock(Paragraph, BodyContent2))) BodyContent1 : (* empty *) ([]) | Text BodyContent1 (consText(Text, BodyContent1)) | BodyElement BodyContent1 (consBlock(BodyElement, BodyContent1)) | Block BodyContent1 (consBlock(Block, BodyContent1)) | Paragraph END_P BodyContent1 (consBlock(Paragraph, BodyContent1)) | Paragraph BodyContent2 (consBlock(Paragraph, BodyContent2)) BodyContent2 : (* empty *) ([]) | BodyElement BodyContent1 (consBlock(BodyElement, BodyContent1)) | Block BodyContent1 (consBlock(Block, BodyContent1)) | Paragraph END_P BodyContent1 (consBlock(Paragraph, BodyContent1)) | Paragraph BodyContent2 (consBlock(Paragraph, BodyContent2)) BodyElement : START_H1 TextList END_H1 (HTMLAttrs.mkHn(1, ctx START_H1left, START_H1, TextList)) | START_H2 TextList END_H2 (HTMLAttrs.mkHn(2, ctx START_H2left, START_H2, TextList)) | START_H3 TextList END_H3 (HTMLAttrs.mkHn(3, ctx START_H3left, START_H3, TextList)) | START_H4 TextList END_H4 (HTMLAttrs.mkHn(4, ctx START_H4left, START_H4, TextList)) | START_H5 TextList END_H5 (HTMLAttrs.mkHn(5, ctx START_H5left, START_H5, TextList)) | START_H6 TextList END_H6 (HTMLAttrs.mkHn(6, ctx START_H6left, START_H6, TextList)) | START_ADDRESS AddressContent1 END_ADDRESS (HTML.ADDRESS(mkBlock AddressContent1)) AddressContent1 : (* empty *) ([]) | Text AddressContent1 (consText(Text, AddressContent1)) | Paragraph END_P AddressContent1 (consBlock(Paragraph, AddressContent1)) | Paragraph AddressContent2 (consBlock(Paragraph, AddressContent2)) AddressContent2 : (* empty *) ([]) | Paragraph END_P AddressContent1 (consBlock(Paragraph, AddressContent1)) | Paragraph AddressContent2 (consBlock(Paragraph, AddressContent2)) (*** Block ***) BlockWOIndex : List (List) | Preformatted (Preformatted) | START_DIV BodyContent END_DIV (HTMLAttrs.mkDIV(ctx START_DIVleft, START_DIV, BodyContent)) | START_CENTER BodyContent END_CENTER (HTML.CENTER BodyContent) | START_BLOCKQUOTE BodyContent END_BLOCKQUOTE (HTML.BLOCKQUOTE BodyContent) | START_FORM BodyContent END_FORM (HTMLAttrs.mkFORM(ctx START_FORMleft, START_FORM, BodyContent)) | TAG_HR (HTMLAttrs.mkHR(ctx TAG_HRleft, TAG_HR)) | START_TABLE optCaption TableRowList END_TABLE (HTMLAttrs.mkTABLE( ctx START_TABLEleft, START_TABLE, {caption = optCaption, body = TableRowList}) ) Block : BlockWOIndex (BlockWOIndex) | TAG_ISINDEX (let val stuff = HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) in HTML.ISINDEX stuff end ) Paragraph : START_P TextList (HTMLAttrs.mkP(ctx START_Pleft, START_P, TextList)) List : START_UL ListItemList END_UL (HTMLAttrs.mkUL(ctx START_ULleft, START_UL, ListItemList)) | START_OL ListItemList END_OL (HTMLAttrs.mkOL(ctx START_OLleft, START_OL, ListItemList)) | START_DIR ListItemList END_DIR (HTMLAttrs.mkDIR(ctx START_DIRleft, START_DIR, ListItemList)) | START_MENU ListItemList END_MENU (HTMLAttrs.mkMENU(ctx START_MENUleft, START_MENU, ListItemList)) | START_DL DLItemList END_DL (HTMLAttrs.mkDL( ctx START_DLleft, START_DL, groupDefListContents DLItemList) ) ListItemList : (* empty *) ([]) | ListItem ListItemList (ListItem :: ListItemList) ListItem : START_LI Flow1 EndLI (HTMLAttrs.mkLI(ctx START_LIleft, START_LI, mkBlock Flow1)) DLItemList : (* empty *) ([]) | DLItem DLItemList (DLItem :: DLItemList) DLItem : START_DT TextList EndDT (DL_tag TextList) | START_DD Flow1 EndDD (DL_item(mkBlock Flow1)) Flow1 : (* empty *) ([]) | Text Flow1 (consText(Text, Flow1)) | Block Flow1 (consBlock(Block, Flow1)) | Paragraph END_P Flow1 (consBlock(Paragraph, Flow1)) | Paragraph Flow2 (consBlock(Paragraph, Flow2)) Flow2 : (* empty *) ([]) | Block Flow1 (consBlock(Block, Flow1)) | Paragraph END_P Flow1 (consBlock(Paragraph, Flow1)) | Paragraph Flow2 (consBlock(Paragraph, Flow2)) EndLI : (* empty *) () | END_LI () EndDT : (* empty *) () | END_DT () EndDD : (* empty *) () | END_DD () Preformatted : START_PRE TextList END_PRE (HTMLAttrs.mkPRE(ctx START_PREleft, START_PRE, TextList)) (*** Tables ***) optCaption : (* empty *) (NONE) | START_CAPTION TextList END_CAPTION (SOME(HTMLAttrs.mkCAPTION( ctx START_CAPTIONleft, START_CAPTION, TextList))) TableRowList : TableRow ([TableRow]) | TableRow TableRowList (TableRow :: TableRowList) TableRow : START_TR TableCellList (HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) | START_TR TableCellList END_TR (HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) TableCellList : TableCell ([TableCell]) | TableCell TableCellList (TableCell :: TableCellList) TableCell : START_TH BodyContent END_TH (HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) | START_TH BodyContent (HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) | START_TD BodyContent END_TD (HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) | START_TD BodyContent (HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) (*** Text ***) TextList : TextList' (textList TextList') TextList' : (* empty *) ([]) | Text TextList' (Text :: TextList') TextWOScript : PCDataElem (HTML.PCDATA PCDataElem) | Font (Font) | Phrase (Phrase) | Special (Special) | Form (Form) Text : TextWOScript (TextWOScript) | START_SCRIPT PCData END_SCRIPT (HTML.SCRIPT PCData) Font : START_TT TextList END_TT (HTML.TT(TextList)) | START_I TextList END_I (HTML.I(TextList)) | START_B TextList END_B (HTML.B(TextList)) | START_U TextList END_U (HTML.U(TextList)) | START_STRIKE TextList END_STRIKE (HTML.STRIKE(TextList)) | START_BIG TextList END_BIG (HTML.BIG(TextList)) | START_SMALL TextList END_SMALL (HTML.SMALL(TextList)) | START_SUB TextList END_SUB (HTML.SUB(TextList)) | START_SUP TextList END_SUP (HTML.SUP(TextList)) Phrase : START_EM TextList END_EM (HTML.EM(TextList)) | START_STRONG TextList END_STRONG (HTML.STRONG(TextList)) | START_CODE TextList END_CODE (HTML.CODE(TextList)) | START_DFN TextList END_DFN (HTML.DFN(TextList)) | START_SAMP TextList END_SAMP (HTML.SAMP(TextList)) | START_KBD TextList END_KBD (HTML.KBD(TextList)) | START_VAR TextList END_VAR (HTML.VAR(TextList)) | START_CITE TextList END_CITE (HTML.CITE(TextList)) Special : START_A TextList END_A (HTMLAttrs.mkA(ctx START_Aleft, START_A, TextList)) | TAG_IMG (HTMLAttrs.mkIMG(ctx TAG_IMGleft, TAG_IMG)) | START_APPLET TextList END_APPLET (HTMLAttrs.mkAPPLET(ctx START_APPLETleft, START_APPLET, TextList)) | START_FONT TextList END_FONT (HTMLAttrs.mkFONT(ctx START_FONTleft, START_FONT, TextList)) | START_BASEFONT TextList END_BASEFONT (HTMLAttrs.mkBASEFONT( ctx START_BASEFONTleft, START_BASEFONT, TextList) ) | TAG_BR (HTMLAttrs.mkBR(ctx TAG_BRleft, TAG_BR)) | START_MAP AreaList END_MAP (HTMLAttrs.mkMAP(ctx START_MAPleft, START_MAP, AreaList)) | TAG_PARAM (HTMLAttrs.mkPARAM(ctx TAG_PARAMleft, TAG_PARAM)) AreaList : (* empty *) ([]) | TAG_AREA AreaList (HTMLAttrs.mkAREA(ctx TAG_AREAleft, TAG_AREA) :: AreaList) Form : TAG_INPUT (HTMLAttrs.mkINPUT(ctx TAG_INPUTleft, TAG_INPUT)) | START_SELECT OptionList END_SELECT (HTMLAttrs.mkSELECT(ctx START_SELECTleft, START_SELECT, OptionList)) | START_TEXTAREA PCData END_TEXTAREA (HTMLAttrs.mkTEXTAREA( ctx START_TEXTAREAleft, START_TEXTAREA, PCData) ) OptionList : (* empty *) ([]) | START_OPTION PCData EndOPTION OptionList (HTMLAttrs.mkOPTION(ctx START_OPTIONleft, START_OPTION, PCData) :: OptionList ) EndOPTION : (* empty *) () | END_OPTION () (*** PCDATA list ***) PCData : PCDataList (concat PCDataList) PCDataList : (* empty *) ([]) | PCDataElem PCDataList (PCDataElem :: PCDataList) PCDataElem : PCDATA (PCDATA) | CHAR_REF (CHAR_REF) | ENTITY_REF (ENTITY_REF) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-gram.sig��������������������������������������0000664�0000000�0000000�00000015374�14162643450�0023524�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������signature HTML_TOKENS = sig type ('a,'b) token type svalue val ENTITY_REF: (string) * 'a * 'a -> (svalue,'a) token val CHAR_REF: (string) * 'a * 'a -> (svalue,'a) token val PCDATA: (string) * 'a * 'a -> (svalue,'a) token val END_VAR: 'a * 'a -> (svalue,'a) token val START_VAR: 'a * 'a -> (svalue,'a) token val END_UL: 'a * 'a -> (svalue,'a) token val START_UL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_U: 'a * 'a -> (svalue,'a) token val START_U: 'a * 'a -> (svalue,'a) token val END_TT: 'a * 'a -> (svalue,'a) token val START_TT: 'a * 'a -> (svalue,'a) token val END_TR: 'a * 'a -> (svalue,'a) token val START_TR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_TITLE: 'a * 'a -> (svalue,'a) token val START_TITLE: 'a * 'a -> (svalue,'a) token val END_TH: 'a * 'a -> (svalue,'a) token val START_TH: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_TEXTAREA: 'a * 'a -> (svalue,'a) token val START_TEXTAREA: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_TD: 'a * 'a -> (svalue,'a) token val START_TD: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_TABLE: 'a * 'a -> (svalue,'a) token val START_TABLE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_SUP: 'a * 'a -> (svalue,'a) token val START_SUP: 'a * 'a -> (svalue,'a) token val END_SUB: 'a * 'a -> (svalue,'a) token val START_SUB: 'a * 'a -> (svalue,'a) token val END_STYLE: 'a * 'a -> (svalue,'a) token val START_STYLE: 'a * 'a -> (svalue,'a) token val END_STRONG: 'a * 'a -> (svalue,'a) token val START_STRONG: 'a * 'a -> (svalue,'a) token val END_STRIKE: 'a * 'a -> (svalue,'a) token val START_STRIKE: 'a * 'a -> (svalue,'a) token val END_SMALL: 'a * 'a -> (svalue,'a) token val START_SMALL: 'a * 'a -> (svalue,'a) token val END_SELECT: 'a * 'a -> (svalue,'a) token val START_SELECT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_SCRIPT: 'a * 'a -> (svalue,'a) token val START_SCRIPT: 'a * 'a -> (svalue,'a) token val END_SAMP: 'a * 'a -> (svalue,'a) token val START_SAMP: 'a * 'a -> (svalue,'a) token val END_PRE: 'a * 'a -> (svalue,'a) token val START_PRE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_PARAM: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_P: 'a * 'a -> (svalue,'a) token val START_P: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_OPTION: 'a * 'a -> (svalue,'a) token val START_OPTION: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_OL: 'a * 'a -> (svalue,'a) token val START_OL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_META: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_MENU: 'a * 'a -> (svalue,'a) token val START_MENU: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_MAP: 'a * 'a -> (svalue,'a) token val START_MAP: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_LINK: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_LI: 'a * 'a -> (svalue,'a) token val START_LI: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_KBD: 'a * 'a -> (svalue,'a) token val START_KBD: 'a * 'a -> (svalue,'a) token val TAG_ISINDEX: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_INPUT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_IMG: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_I: 'a * 'a -> (svalue,'a) token val START_I: 'a * 'a -> (svalue,'a) token val END_HTML: 'a * 'a -> (svalue,'a) token val START_HTML: 'a * 'a -> (svalue,'a) token val TAG_HR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_HEAD: 'a * 'a -> (svalue,'a) token val START_HEAD: 'a * 'a -> (svalue,'a) token val END_H6: 'a * 'a -> (svalue,'a) token val START_H6: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_H5: 'a * 'a -> (svalue,'a) token val START_H5: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_H4: 'a * 'a -> (svalue,'a) token val START_H4: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_H3: 'a * 'a -> (svalue,'a) token val START_H3: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_H2: 'a * 'a -> (svalue,'a) token val START_H2: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_H1: 'a * 'a -> (svalue,'a) token val START_H1: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_FORM: 'a * 'a -> (svalue,'a) token val START_FORM: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_BASEFONT: 'a * 'a -> (svalue,'a) token val START_BASEFONT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_FONT: 'a * 'a -> (svalue,'a) token val START_FONT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_EM: 'a * 'a -> (svalue,'a) token val START_EM: 'a * 'a -> (svalue,'a) token val END_DT: 'a * 'a -> (svalue,'a) token val START_DT: 'a * 'a -> (svalue,'a) token val END_DL: 'a * 'a -> (svalue,'a) token val START_DL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_DIV: 'a * 'a -> (svalue,'a) token val START_DIV: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_DIR: 'a * 'a -> (svalue,'a) token val START_DIR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_DFN: 'a * 'a -> (svalue,'a) token val START_DFN: 'a * 'a -> (svalue,'a) token val END_DD: 'a * 'a -> (svalue,'a) token val START_DD: 'a * 'a -> (svalue,'a) token val END_CODE: 'a * 'a -> (svalue,'a) token val START_CODE: 'a * 'a -> (svalue,'a) token val END_CITE: 'a * 'a -> (svalue,'a) token val START_CITE: 'a * 'a -> (svalue,'a) token val END_CENTER: 'a * 'a -> (svalue,'a) token val START_CENTER: 'a * 'a -> (svalue,'a) token val END_CAPTION: 'a * 'a -> (svalue,'a) token val START_CAPTION: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val TAG_BR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_BODY: 'a * 'a -> (svalue,'a) token val START_BODY: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_BLOCKQUOTE: 'a * 'a -> (svalue,'a) token val START_BLOCKQUOTE: 'a * 'a -> (svalue,'a) token val END_BIG: 'a * 'a -> (svalue,'a) token val START_BIG: 'a * 'a -> (svalue,'a) token val TAG_BASE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_B: 'a * 'a -> (svalue,'a) token val START_B: 'a * 'a -> (svalue,'a) token val TAG_AREA: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_APPLET: 'a * 'a -> (svalue,'a) token val START_APPLET: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val END_ADDRESS: 'a * 'a -> (svalue,'a) token val START_ADDRESS: 'a * 'a -> (svalue,'a) token val END_A: 'a * 'a -> (svalue,'a) token val START_A: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token val EOF: 'a * 'a -> (svalue,'a) token end signature HTML_LRVALS= sig structure Tokens : HTML_TOKENS structure ParserData:PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-gram.sml��������������������������������������0000664�0000000�0000000�00000277735�14162643450�0023550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ functor HTMLLrValsFn ( structure Token : TOKEN structure HTMLAttrs : HTML_ATTRS) = struct structure ParserData= struct structure Header = struct (* html-gram * * COPYRIGHT (c) 1996 AT&T Research. * * This grammar parses HTML 3.2. Note that it does not enforce exclusions * (for the content of FORM, PRE, etc). Exclusions should be enforced as * a second pass over the parse tree. *) fun textList [text] = text | textList l = HTML.TextList l fun blockList [blk] = blk | blockList l = HTML.BlockList l fun textBlock l = HTML.TextBlock(textList l) (* The elements of a definition list (<DL>) are tags (<DT>) and items (<DD>). * To avoid shift/reduce problems, we parse them and then group them. *) datatype deflist_item = DL_tag of HTML.text | DL_item of HTML.block fun groupDefListContents [] = [] | groupDefListContents (h :: t) = let fun gdlc (DL_tag tag, []) = ({dt=[tag], dd=HTML.BlockList[]}, []) | gdlc (DL_tag tag, h :: t) = let val ({dt, dd}, r) = gdlc (h, t) in ({dt = tag :: dt, dd = dd}, r) end | gdlc (DL_item blk, r) = ({dt=[],dd=blk}, groupDefListContents r) in op :: (gdlc (h, t)) end (* A list of Text, paragraphs and blocks requires grouping the Text items and * making an implicit paragraph. We cannot directly use TextList because of * conflicts. *) datatype blklist_item = BL_text of HTML.text list | BL_block of HTML.block list fun consText (txt, BL_text tl :: r) = BL_text(txt::tl) :: r | consText (txt, l) = BL_text[txt] :: l fun consBlock (blk, BL_block bl :: r) = BL_block(blk::bl) :: r | consBlock (blk, l) = BL_block[blk] :: l fun mkBlock blks = let fun f (BL_text tl) = textBlock tl | f (BL_block bl) = blockList bl in blockList(List.map f blks) end fun mkBody blks = HTML.BODY{ background = NONE, bgcolor = NONE, text = NONE, link = NONE, vlink = NONE, alink = NONE, content = mkBlock blks } end structure LrTable = Token.LrTable structure Token = Token local open LrTable in val table=let val actionRows = "\ \\001\000\001\000\000\000\000\000\ \\001\000\002\000\081\000\004\000\080\000\006\000\079\000\009\000\078\000\ \\012\000\077\000\014\000\076\000\016\000\075\000\018\000\074\000\ \\021\000\073\000\023\000\072\000\025\000\071\000\029\000\070\000\ \\031\000\069\000\033\000\068\000\035\000\067\000\039\000\066\000\ \\041\000\065\000\043\000\064\000\045\000\063\000\047\000\062\000\ \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ \\057\000\057\000\061\000\056\000\064\000\055\000\066\000\054\000\ \\067\000\053\000\069\000\052\000\074\000\051\000\076\000\050\000\ \\079\000\049\000\083\000\048\000\085\000\047\000\086\000\046\000\ \\088\000\045\000\092\000\044\000\094\000\043\000\096\000\042\000\ \\098\000\041\000\102\000\040\000\104\000\039\000\106\000\038\000\ \\110\000\037\000\118\000\036\000\120\000\035\000\122\000\034\000\ \\124\000\033\000\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ \\001\000\003\000\241\000\000\000\ \\001\000\005\000\240\000\000\000\ \\001\000\007\000\235\000\000\000\ \\001\000\010\000\234\000\000\000\ \\001\000\013\000\233\000\000\000\ \\001\000\015\000\232\000\000\000\ \\001\000\020\000\004\001\000\000\ \\001\000\022\000\231\000\000\000\ \\001\000\024\000\230\000\000\000\ \\001\000\026\000\229\000\000\000\ \\001\000\030\000\228\000\000\000\ \\001\000\032\000\227\000\000\000\ \\001\000\034\000\226\000\000\000\ \\001\000\036\000\223\000\000\000\ \\001\000\040\000\221\000\000\000\ \\001\000\042\000\220\000\000\000\ \\001\000\044\000\219\000\000\000\ \\001\000\046\000\218\000\000\000\ \\001\000\048\000\217\000\000\000\ \\001\000\050\000\216\000\000\000\ \\001\000\052\000\215\000\000\000\ \\001\000\054\000\214\000\000\000\ \\001\000\056\000\213\000\000\000\ \\001\000\058\000\212\000\000\000\ \\001\000\065\000\211\000\000\000\ \\001\000\070\000\210\000\000\000\ \\001\000\075\000\208\000\000\000\ \\001\000\077\000\207\000\000\000\ \\001\000\080\000\206\000\000\000\ \\001\000\087\000\205\000\000\000\ \\001\000\089\000\204\000\000\000\ \\001\000\091\000\170\000\000\000\ \\001\000\091\000\244\000\000\000\ \\001\000\093\000\202\000\000\000\ \\001\000\095\000\201\000\000\000\ \\001\000\097\000\200\000\000\000\ \\001\000\099\000\199\000\000\000\ \\001\000\101\000\169\000\000\000\ \\001\000\103\000\198\000\000\000\ \\001\000\105\000\197\000\000\000\ \\001\000\107\000\255\000\000\000\ \\001\000\108\000\003\001\112\000\002\001\000\000\ \\001\000\111\000\192\000\000\000\ \\001\000\114\000\083\000\000\000\ \\001\000\115\000\242\000\000\000\ \\001\000\116\000\195\000\000\000\ \\001\000\119\000\191\000\000\000\ \\001\000\121\000\190\000\000\000\ \\001\000\123\000\185\000\000\000\ \\001\000\125\000\183\000\000\000\ \\029\001\000\000\ \\030\001\062\000\004\000\000\000\ \\031\001\000\000\ \\032\001\063\000\109\000\000\000\ \\033\001\000\000\ \\034\001\000\000\ \\035\001\059\000\007\000\000\000\ \\036\001\000\000\ \\037\001\060\000\085\000\000\000\ \\038\001\000\000\ \\039\001\000\000\ \\040\001\011\000\016\000\068\000\015\000\073\000\014\000\078\000\013\000\ \\090\000\012\000\100\000\011\000\000\000\ \\041\001\000\000\ \\042\001\000\000\ \\043\001\000\000\ \\044\001\000\000\ \\045\001\000\000\ \\046\001\000\000\ \\047\001\000\000\ \\048\001\000\000\ \\049\001\017\000\107\000\000\000\ \\050\001\000\000\ \\051\001\000\000\ \\052\001\000\000\ \\053\001\000\000\ \\054\001\000\000\ \\055\001\000\000\ \\056\001\000\000\ \\057\001\000\000\ \\058\001\002\000\081\000\004\000\080\000\006\000\079\000\009\000\078\000\ \\012\000\077\000\014\000\076\000\018\000\074\000\021\000\073\000\ \\023\000\072\000\025\000\071\000\029\000\070\000\031\000\069\000\ \\033\000\068\000\035\000\067\000\039\000\066\000\041\000\065\000\ \\043\000\064\000\045\000\063\000\047\000\062\000\049\000\061\000\ \\051\000\060\000\053\000\059\000\055\000\058\000\057\000\057\000\ \\061\000\056\000\064\000\055\000\066\000\054\000\067\000\053\000\ \\068\000\098\000\069\000\052\000\074\000\051\000\076\000\050\000\ \\079\000\049\000\083\000\048\000\085\000\047\000\086\000\046\000\ \\088\000\045\000\090\000\097\000\092\000\044\000\094\000\043\000\ \\096\000\042\000\098\000\041\000\102\000\040\000\104\000\039\000\ \\106\000\038\000\110\000\037\000\118\000\036\000\120\000\035\000\ \\122\000\034\000\124\000\033\000\126\000\032\000\127\000\031\000\ \\128\000\030\000\000\000\ \\059\001\000\000\ \\060\001\000\000\ \\061\001\000\000\ \\062\001\000\000\ \\063\001\000\000\ \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ \\079\000\049\000\083\000\048\000\084\000\103\000\086\000\046\000\ \\106\000\038\000\122\000\034\000\000\000\ \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ \\079\000\049\000\083\000\048\000\084\000\173\000\086\000\046\000\ \\106\000\038\000\122\000\034\000\000\000\ \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ \\079\000\049\000\083\000\048\000\084\000\178\000\086\000\046\000\ \\106\000\038\000\122\000\034\000\000\000\ \\065\001\000\000\ \\066\001\000\000\ \\067\001\000\000\ \\068\001\000\000\ \\069\001\000\000\ \\070\001\000\000\ \\071\001\000\000\ \\072\001\000\000\ \\073\001\000\000\ \\074\001\000\000\ \\075\001\000\000\ \\076\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ \\018\000\074\000\023\000\072\000\025\000\071\000\029\000\070\000\ \\039\000\066\000\041\000\065\000\043\000\064\000\064\000\055\000\ \\066\000\054\000\067\000\053\000\069\000\052\000\074\000\051\000\ \\083\000\048\000\085\000\047\000\088\000\045\000\090\000\097\000\ \\092\000\044\000\094\000\043\000\096\000\042\000\098\000\041\000\ \\102\000\040\000\104\000\039\000\110\000\037\000\118\000\036\000\ \\120\000\035\000\124\000\033\000\126\000\032\000\127\000\031\000\ \\128\000\030\000\000\000\ \\077\001\000\000\ \\078\001\000\000\ \\079\001\000\000\ \\080\001\083\000\048\000\084\000\239\000\000\000\ \\080\001\083\000\048\000\084\000\012\001\000\000\ \\081\001\000\000\ \\082\001\000\000\ \\083\001\000\000\ \\084\001\000\000\ \\085\001\000\000\ \\086\001\000\000\ \\087\001\000\000\ \\088\001\000\000\ \\089\001\000\000\ \\090\001\000\000\ \\091\001\000\000\ \\092\001\000\000\ \\093\001\000\000\ \\094\001\000\000\ \\095\001\000\000\ \\096\001\000\000\ \\097\001\000\000\ \\098\001\000\000\ \\099\001\071\000\115\000\000\000\ \\100\001\000\000\ \\101\001\000\000\ \\102\001\027\000\151\000\037\000\150\000\000\000\ \\103\001\000\000\ \\104\001\000\000\ \\105\001\000\000\ \\106\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ \\014\000\076\000\018\000\074\000\021\000\073\000\023\000\072\000\ \\025\000\071\000\029\000\070\000\031\000\069\000\033\000\068\000\ \\035\000\067\000\039\000\066\000\041\000\065\000\043\000\064\000\ \\045\000\063\000\061\000\056\000\064\000\055\000\066\000\054\000\ \\067\000\053\000\068\000\098\000\069\000\052\000\074\000\051\000\ \\076\000\050\000\079\000\049\000\083\000\048\000\085\000\047\000\ \\086\000\046\000\088\000\045\000\090\000\097\000\092\000\044\000\ \\094\000\043\000\096\000\042\000\098\000\041\000\102\000\040\000\ \\104\000\039\000\106\000\038\000\110\000\037\000\118\000\036\000\ \\120\000\035\000\122\000\034\000\124\000\033\000\126\000\032\000\ \\127\000\031\000\128\000\030\000\000\000\ \\107\001\000\000\ \\108\001\000\000\ \\109\001\000\000\ \\110\001\000\000\ \\111\001\014\000\076\000\021\000\073\000\031\000\069\000\033\000\068\000\ \\035\000\067\000\045\000\063\000\061\000\056\000\068\000\098\000\ \\076\000\050\000\079\000\049\000\083\000\048\000\084\000\252\000\ \\086\000\046\000\106\000\038\000\122\000\034\000\000\000\ \\111\001\014\000\076\000\021\000\073\000\031\000\069\000\033\000\068\000\ \\035\000\067\000\045\000\063\000\061\000\056\000\068\000\098\000\ \\076\000\050\000\079\000\049\000\083\000\048\000\084\000\016\001\ \\086\000\046\000\106\000\038\000\122\000\034\000\000\000\ \\112\001\000\000\ \\113\001\000\000\ \\114\001\000\000\ \\115\001\072\000\248\000\000\000\ \\116\001\000\000\ \\117\001\038\000\008\001\000\000\ \\118\001\000\000\ \\119\001\028\000\010\001\000\000\ \\120\001\000\000\ \\121\001\000\000\ \\122\001\019\000\120\000\000\000\ \\123\001\000\000\ \\124\001\116\000\195\000\000\000\ \\125\001\000\000\ \\126\001\117\000\020\001\000\000\ \\127\001\000\000\ \\128\001\108\000\003\001\112\000\002\001\000\000\ \\129\001\000\000\ \\130\001\000\000\ \\131\001\113\000\026\001\000\000\ \\132\001\000\000\ \\133\001\109\000\027\001\000\000\ \\134\001\000\000\ \\135\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ \\018\000\074\000\023\000\072\000\025\000\071\000\029\000\070\000\ \\039\000\066\000\041\000\065\000\043\000\064\000\064\000\055\000\ \\066\000\054\000\067\000\053\000\069\000\052\000\074\000\051\000\ \\085\000\047\000\088\000\045\000\090\000\097\000\092\000\044\000\ \\094\000\043\000\096\000\042\000\098\000\041\000\102\000\040\000\ \\104\000\039\000\110\000\037\000\118\000\036\000\120\000\035\000\ \\124\000\033\000\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ \\136\001\000\000\ \\137\001\000\000\ \\138\001\000\000\ \\139\001\000\000\ \\140\001\000\000\ \\141\001\000\000\ \\142\001\000\000\ \\143\001\000\000\ \\144\001\000\000\ \\145\001\000\000\ \\146\001\000\000\ \\147\001\000\000\ \\148\001\000\000\ \\149\001\000\000\ \\150\001\000\000\ \\151\001\000\000\ \\152\001\000\000\ \\153\001\000\000\ \\154\001\000\000\ \\155\001\000\000\ \\156\001\000\000\ \\157\001\000\000\ \\158\001\000\000\ \\159\001\000\000\ \\160\001\000\000\ \\161\001\000\000\ \\162\001\000\000\ \\163\001\000\000\ \\164\001\000\000\ \\165\001\000\000\ \\166\001\000\000\ \\167\001\000\000\ \\168\001\000\000\ \\169\001\008\000\134\000\000\000\ \\170\001\000\000\ \\171\001\000\000\ \\172\001\000\000\ \\173\001\000\000\ \\174\001\081\000\127\000\000\000\ \\175\001\000\000\ \\176\001\082\000\006\001\000\000\ \\177\001\000\000\ \\178\001\000\000\ \\179\001\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ \\180\001\000\000\ \\181\001\000\000\ \\182\001\000\000\ \\183\001\000\000\ \" val actionRowNumbers = "\053\000\058\000\054\000\063\000\ \\001\000\059\000\063\000\045\000\ \\060\000\206\000\206\000\065\000\ \\066\000\067\000\068\000\164\000\ \\168\000\167\000\166\000\165\000\ \\081\000\110\000\109\000\087\000\ \\081\000\081\000\072\000\055\000\ \\210\000\209\000\208\000\162\000\ \\125\000\162\000\162\000\206\000\ \\149\000\162\000\162\000\162\000\ \\162\000\162\000\201\000\162\000\ \\162\000\195\000\162\000\125\000\ \\125\000\196\000\162\000\198\000\ \\189\000\162\000\115\000\162\000\ \\162\000\162\000\162\000\162\000\ \\162\000\081\000\162\000\162\000\ \\162\000\128\000\081\000\125\000\ \\162\000\162\000\162\000\081\000\ \\193\000\081\000\081\000\162\000\ \\162\000\162\000\101\000\162\000\ \\064\000\206\000\057\000\061\000\ \\206\000\205\000\039\000\033\000\ \\081\000\169\000\088\000\081\000\ \\117\000\081\000\076\000\206\000\ \\118\000\089\000\081\000\081\000\ \\080\000\081\000\078\000\077\000\ \\071\000\073\000\052\000\056\000\ \\162\000\161\000\051\000\125\000\ \\050\000\132\000\049\000\048\000\ \\044\000\047\000\162\000\041\000\ \\040\000\038\000\037\000\036\000\ \\035\000\206\000\032\000\031\000\ \\119\000\030\000\029\000\028\000\ \\196\000\027\000\026\000\025\000\ \\024\000\023\000\022\000\021\000\ \\020\000\074\000\019\000\018\000\ \\017\000\016\000\128\000\015\000\ \\162\000\132\000\014\000\013\000\ \\012\000\011\000\010\000\009\000\ \\075\000\007\000\006\000\005\000\ \\004\000\101\000\105\000\003\000\ \\002\000\046\000\207\000\069\000\ \\070\000\082\000\086\000\081\000\ \\084\000\083\000\034\000\093\000\ \\081\000\091\000\090\000\079\000\ \\163\000\186\000\126\000\120\000\ \\132\000\142\000\137\000\132\000\ \\174\000\171\000\200\000\151\000\ \\042\000\043\000\008\000\179\000\ \\178\000\181\000\175\000\177\000\ \\199\000\203\000\184\000\148\000\ \\121\000\123\000\194\000\197\000\ \\185\000\172\000\099\000\098\000\ \\097\000\096\000\095\000\094\000\ \\114\000\192\000\191\000\180\000\ \\129\000\124\000\144\000\146\000\ \\111\000\122\000\183\000\182\000\ \\187\000\112\000\113\000\176\000\ \\173\000\190\000\102\000\106\000\ \\104\000\101\000\100\000\188\000\ \\063\000\085\000\170\000\092\000\ \\133\000\127\000\143\000\136\000\ \\138\000\132\000\132\000\134\000\ \\152\000\116\000\155\000\153\000\ \\081\000\081\000\150\000\201\000\ \\204\000\130\000\145\000\131\000\ \\147\000\108\000\101\000\103\000\ \\062\000\141\000\132\000\139\000\ \\135\000\156\000\154\000\158\000\ \\160\000\202\000\107\000\140\000\ \\157\000\159\000\000\000" val gotoT = "\ \\001\000\026\001\002\000\001\000\000\000\ \\004\000\004\000\005\000\003\000\000\000\ \\000\000\ \\007\000\008\000\008\000\007\000\009\000\006\000\000\000\ \\010\000\027\000\014\000\026\000\017\000\025\000\020\000\024\000\ \\022\000\023\000\023\000\022\000\033\000\021\000\041\000\020\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\008\000\080\000\009\000\006\000\000\000\ \\000\000\ \\006\000\082\000\000\000\ \\050\000\086\000\051\000\085\000\052\000\084\000\000\000\ \\050\000\087\000\051\000\085\000\052\000\084\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\015\000\094\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\016\000\100\000\017\000\099\000\020\000\092\000\021\000\098\000\ \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ \\015\000\102\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\015\000\103\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\012\000\104\000\000\000\ \\003\000\106\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\039\000\110\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\024\000\112\000\025\000\111\000\000\000\ \\039\000\114\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\115\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\050\000\116\000\051\000\085\000\052\000\084\000\000\000\ \\034\000\117\000\000\000\ \\039\000\119\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\120\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\121\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\122\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\123\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\048\000\124\000\000\000\ \\039\000\126\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\127\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\039\000\128\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\024\000\129\000\025\000\111\000\000\000\ \\024\000\130\000\025\000\111\000\000\000\ \\046\000\131\000\000\000\ \\039\000\133\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\039\000\134\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\039\000\135\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\136\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\137\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\138\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\139\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\140\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\013\000\142\000\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\039\000\143\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\144\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\145\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\026\000\147\000\027\000\146\000\000\000\ \\013\000\150\000\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\024\000\151\000\025\000\111\000\000\000\ \\039\000\152\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\153\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\154\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\013\000\155\000\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\013\000\156\000\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\013\000\157\000\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\039\000\158\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\159\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\160\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\018\000\163\000\022\000\162\000\041\000\089\000\042\000\161\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\039\000\164\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\050\000\165\000\051\000\085\000\052\000\084\000\000\000\ \\000\000\ \\000\000\ \\051\000\166\000\052\000\084\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\015\000\169\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\016\000\170\000\017\000\099\000\020\000\092\000\021\000\098\000\ \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ \\015\000\172\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\015\000\173\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\050\000\174\000\051\000\085\000\052\000\084\000\000\000\ \\000\000\ \\016\000\175\000\017\000\099\000\020\000\092\000\021\000\098\000\ \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ \\015\000\177\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\015\000\178\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\015\000\179\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\040\000\180\000\041\000\089\000\042\000\108\000\043\000\019\000\ \\044\000\018\000\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\024\000\182\000\025\000\111\000\000\000\ \\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\185\000\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\035\000\192\000\036\000\191\000\000\000\ \\039\000\194\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\050\000\201\000\051\000\085\000\052\000\084\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\046\000\207\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\026\000\220\000\027\000\146\000\000\000\ \\000\000\ \\039\000\222\000\040\000\109\000\041\000\089\000\042\000\108\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\223\000\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\018\000\234\000\022\000\162\000\041\000\089\000\042\000\161\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\019\000\236\000\022\000\235\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\015\000\241\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\015\000\243\000\017\000\093\000\020\000\092\000\021\000\091\000\ \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ \\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\244\000\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\030\000\245\000\000\000\ \\020\000\092\000\021\000\249\000\022\000\248\000\023\000\022\000\ \\029\000\247\000\033\000\021\000\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\251\000\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\035\000\252\000\036\000\191\000\000\000\ \\000\000\ \\037\000\255\000\038\000\254\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\049\000\003\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\031\000\005\001\000\000\ \\032\000\007\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\019\000\009\001\022\000\235\000\000\000\ \\000\000\ \\018\000\011\001\022\000\162\000\041\000\089\000\042\000\161\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\008\000\012\001\009\000\006\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\020\000\092\000\021\000\249\000\022\000\248\000\023\000\022\000\ \\029\000\013\001\033\000\021\000\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\015\001\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\016\001\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\037\000\017\001\038\000\254\000\000\000\ \\000\000\ \\013\000\019\001\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\013\000\020\001\015\000\141\000\017\000\093\000\020\000\092\000\ \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ \\000\000\ \\048\000\021\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\018\000\022\001\022\000\162\000\041\000\089\000\042\000\161\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ \\028\000\023\001\033\000\021\000\041\000\089\000\042\000\184\000\ \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ \\052\000\015\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \" val numstates = 283 val numrules = 155 val s = ref "" and index = ref 0 val string_to_int = fn () => let val i = !index in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 end val string_to_list = fn s' => let val len = String.size s' fun f () = if !index < len then string_to_int() :: f() else nil in index := 0; s := s'; f () end val string_to_pairlist = fn (conv_key,conv_entry) => let fun f () = case string_to_int() of 0 => EMPTY | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) in f end val string_to_pairlist_default = fn (conv_key,conv_entry) => let val conv_row = string_to_pairlist(conv_key,conv_entry) in fn () => let val default = conv_entry(string_to_int()) val row = conv_row() in (row,default) end end val string_to_table = fn (convert_row,s') => let val len = String.size s' fun f ()= if !index < len then convert_row() :: f() else nil in (s := s'; index := 0; f ()) end local val memo = Array.array(numstates+numrules,ERROR) val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) fun f i = if i=numstates then g i else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) in f 0 handle General.Subscript => () end in val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) end val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) val actionRowNumbers = string_to_list actionRowNumbers val actionT = let val actionRowLookUp= let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end in Array.fromList(List.map actionRowLookUp actionRowNumbers) end in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, numStates=numstates,initialState=STATE 0} end end local open Header in type pos = int type arg = int -> HTMLAttrs.context structure MlyValue = struct datatype svalue = VOID | ntVOID of unit | ENTITY_REF of (string) | CHAR_REF of (string) | PCDATA of (string) | START_UL of (HTMLAttrVals.attrs) | START_TR of (HTMLAttrVals.attrs) | START_TH of (HTMLAttrVals.attrs) | START_TEXTAREA of (HTMLAttrVals.attrs) | START_TD of (HTMLAttrVals.attrs) | START_TABLE of (HTMLAttrVals.attrs) | START_SELECT of (HTMLAttrVals.attrs) | START_PRE of (HTMLAttrVals.attrs) | TAG_PARAM of (HTMLAttrVals.attrs) | START_P of (HTMLAttrVals.attrs) | START_OPTION of (HTMLAttrVals.attrs) | START_OL of (HTMLAttrVals.attrs) | TAG_META of (HTMLAttrVals.attrs) | START_MENU of (HTMLAttrVals.attrs) | START_MAP of (HTMLAttrVals.attrs) | TAG_LINK of (HTMLAttrVals.attrs) | START_LI of (HTMLAttrVals.attrs) | TAG_ISINDEX of (HTMLAttrVals.attrs) | TAG_INPUT of (HTMLAttrVals.attrs) | TAG_IMG of (HTMLAttrVals.attrs) | TAG_HR of (HTMLAttrVals.attrs) | START_H6 of (HTMLAttrVals.attrs) | START_H5 of (HTMLAttrVals.attrs) | START_H4 of (HTMLAttrVals.attrs) | START_H3 of (HTMLAttrVals.attrs) | START_H2 of (HTMLAttrVals.attrs) | START_H1 of (HTMLAttrVals.attrs) | START_FORM of (HTMLAttrVals.attrs) | START_BASEFONT of (HTMLAttrVals.attrs) | START_FONT of (HTMLAttrVals.attrs) | START_DL of (HTMLAttrVals.attrs) | START_DIV of (HTMLAttrVals.attrs) | START_DIR of (HTMLAttrVals.attrs) | START_CAPTION of (HTMLAttrVals.attrs) | TAG_BR of (HTMLAttrVals.attrs) | START_BODY of (HTMLAttrVals.attrs) | TAG_BASE of (HTMLAttrVals.attrs) | TAG_AREA of (HTMLAttrVals.attrs) | START_APPLET of (HTMLAttrVals.attrs) | START_A of (HTMLAttrVals.attrs) | PCDataElem of (HTML.pcdata) | PCDataList of (HTML.pcdata list) | PCData of (HTML.pcdata) | OptionList of (HTML.select_option list) | Form of (HTML.text) | AreaList of (HTML.area list) | Special of (HTML.text) | Phrase of (HTML.text) | Font of (HTML.text) | Text of (HTML.text) | TextWOScript of (HTML.text) | TextList' of (HTML.text list) | TextList of (HTML.text) | TableCell of (HTML.table_cell) | TableCellList of (HTML.table_cell list) | TableRow of (HTML.tr) | TableRowList of (HTML.tr list) | optCaption of (HTML.caption option) | Preformatted of (HTML.block) | Flow2 of (blklist_item list) | Flow1 of (blklist_item list) | DLItem of (deflist_item) | DLItemList of (deflist_item list) | ListItem of (HTML.list_item) | ListItemList of (HTML.list_item list) | List of (HTML.block) | Paragraph of (HTML.block) | Block of (HTML.block) | BlockWOIndex of (HTML.block) | AddressContent2 of (blklist_item list) | AddressContent1 of (blklist_item list) | BodyElement of (HTML.block) | BodyContent2 of (blklist_item list) | BodyContent1 of (blklist_item list) | BodyContent0 of (HTML.body) | BodyContent of (HTML.block) | Body of (HTML.body) | HeadElement of (HTML.head_content) | HeadElements of (HTML.head_content list) | HeadContents of (HTML.head_content list) | Head of (HTML.head_content list) | StartHTML of (HTML.cdata option) | Document of (HTML.html) end type svalue = MlyValue.svalue type result = HTML.html end structure EC= struct open LrTable infix 5 $$ fun x $$ y = y::x val is_keyword = fn _ => false val preferred_change : (term list * term list) list = nil val noShift = fn (T 0) => true | _ => false val showTerminal = fn (T 0) => "EOF" | (T 1) => "START_A" | (T 2) => "END_A" | (T 3) => "START_ADDRESS" | (T 4) => "END_ADDRESS" | (T 5) => "START_APPLET" | (T 6) => "END_APPLET" | (T 7) => "TAG_AREA" | (T 8) => "START_B" | (T 9) => "END_B" | (T 10) => "TAG_BASE" | (T 11) => "START_BIG" | (T 12) => "END_BIG" | (T 13) => "START_BLOCKQUOTE" | (T 14) => "END_BLOCKQUOTE" | (T 15) => "START_BODY" | (T 16) => "END_BODY" | (T 17) => "TAG_BR" | (T 18) => "START_CAPTION" | (T 19) => "END_CAPTION" | (T 20) => "START_CENTER" | (T 21) => "END_CENTER" | (T 22) => "START_CITE" | (T 23) => "END_CITE" | (T 24) => "START_CODE" | (T 25) => "END_CODE" | (T 26) => "START_DD" | (T 27) => "END_DD" | (T 28) => "START_DFN" | (T 29) => "END_DFN" | (T 30) => "START_DIR" | (T 31) => "END_DIR" | (T 32) => "START_DIV" | (T 33) => "END_DIV" | (T 34) => "START_DL" | (T 35) => "END_DL" | (T 36) => "START_DT" | (T 37) => "END_DT" | (T 38) => "START_EM" | (T 39) => "END_EM" | (T 40) => "START_FONT" | (T 41) => "END_FONT" | (T 42) => "START_BASEFONT" | (T 43) => "END_BASEFONT" | (T 44) => "START_FORM" | (T 45) => "END_FORM" | (T 46) => "START_H1" | (T 47) => "END_H1" | (T 48) => "START_H2" | (T 49) => "END_H2" | (T 50) => "START_H3" | (T 51) => "END_H3" | (T 52) => "START_H4" | (T 53) => "END_H4" | (T 54) => "START_H5" | (T 55) => "END_H5" | (T 56) => "START_H6" | (T 57) => "END_H6" | (T 58) => "START_HEAD" | (T 59) => "END_HEAD" | (T 60) => "TAG_HR" | (T 61) => "START_HTML" | (T 62) => "END_HTML" | (T 63) => "START_I" | (T 64) => "END_I" | (T 65) => "TAG_IMG" | (T 66) => "TAG_INPUT" | (T 67) => "TAG_ISINDEX" | (T 68) => "START_KBD" | (T 69) => "END_KBD" | (T 70) => "START_LI" | (T 71) => "END_LI" | (T 72) => "TAG_LINK" | (T 73) => "START_MAP" | (T 74) => "END_MAP" | (T 75) => "START_MENU" | (T 76) => "END_MENU" | (T 77) => "TAG_META" | (T 78) => "START_OL" | (T 79) => "END_OL" | (T 80) => "START_OPTION" | (T 81) => "END_OPTION" | (T 82) => "START_P" | (T 83) => "END_P" | (T 84) => "TAG_PARAM" | (T 85) => "START_PRE" | (T 86) => "END_PRE" | (T 87) => "START_SAMP" | (T 88) => "END_SAMP" | (T 89) => "START_SCRIPT" | (T 90) => "END_SCRIPT" | (T 91) => "START_SELECT" | (T 92) => "END_SELECT" | (T 93) => "START_SMALL" | (T 94) => "END_SMALL" | (T 95) => "START_STRIKE" | (T 96) => "END_STRIKE" | (T 97) => "START_STRONG" | (T 98) => "END_STRONG" | (T 99) => "START_STYLE" | (T 100) => "END_STYLE" | (T 101) => "START_SUB" | (T 102) => "END_SUB" | (T 103) => "START_SUP" | (T 104) => "END_SUP" | (T 105) => "START_TABLE" | (T 106) => "END_TABLE" | (T 107) => "START_TD" | (T 108) => "END_TD" | (T 109) => "START_TEXTAREA" | (T 110) => "END_TEXTAREA" | (T 111) => "START_TH" | (T 112) => "END_TH" | (T 113) => "START_TITLE" | (T 114) => "END_TITLE" | (T 115) => "START_TR" | (T 116) => "END_TR" | (T 117) => "START_TT" | (T 118) => "END_TT" | (T 119) => "START_U" | (T 120) => "END_U" | (T 121) => "START_UL" | (T 122) => "END_UL" | (T 123) => "START_VAR" | (T 124) => "END_VAR" | (T 125) => "PCDATA" | (T 126) => "CHAR_REF" | (T 127) => "ENTITY_REF" | _ => "bogus-term" local open Header in val errtermvalue= fn (T 1) => MlyValue.START_A(([])) | (T 5) => MlyValue.START_APPLET(( [ ("CODE", HTMLAttrs.NAME ""), ("WIDTH", HTMLAttrs.NAME ""), ("HEIGHT", HTMLAttrs.NAME "") ] )) | (T 7) => MlyValue.TAG_AREA(([("ALT", HTMLAttrs.NAME "")])) | (T 10) => MlyValue.TAG_BASE(([("URL", HTMLAttrs.NAME "")])) | (T 15) => MlyValue.START_BODY(([])) | (T 17) => MlyValue.TAG_BR(([])) | (T 18) => MlyValue.START_CAPTION(([])) | (T 30) => MlyValue.START_DIR(([])) | (T 32) => MlyValue.START_DIV(([])) | (T 34) => MlyValue.START_DL(([])) | (T 40) => MlyValue.START_FONT(([])) | (T 42) => MlyValue.START_BASEFONT(([])) | (T 44) => MlyValue.START_FORM(([])) | (T 46) => MlyValue.START_H1(([])) | (T 48) => MlyValue.START_H2(([])) | (T 50) => MlyValue.START_H3(([])) | (T 52) => MlyValue.START_H4(([])) | (T 54) => MlyValue.START_H5(([])) | (T 56) => MlyValue.START_H6(([])) | (T 60) => MlyValue.TAG_HR(([])) | (T 65) => MlyValue.TAG_IMG(([("SRC", HTMLAttrs.NAME "")])) | (T 66) => MlyValue.TAG_INPUT(([])) | (T 67) => MlyValue.TAG_ISINDEX(([])) | (T 72) => MlyValue.TAG_LINK(([])) | (T 73) => MlyValue.START_MAP(([])) | (T 75) => MlyValue.START_MENU(([])) | (T 77) => MlyValue.TAG_META(([("CONTENT", HTMLAttrs.NAME "")])) | (T 78) => MlyValue.START_OL(([])) | (T 80) => MlyValue.START_OPTION(([])) | (T 82) => MlyValue.START_P(([])) | (T 84) => MlyValue.TAG_PARAM(([("NAME", HTMLAttrs.NAME "")])) | (T 85) => MlyValue.START_PRE(([])) | (T 91) => MlyValue.START_SELECT(([("NAME", HTMLAttrs.NAME "")])) | (T 105) => MlyValue.START_TABLE(([])) | (T 107) => MlyValue.START_TD(([])) | (T 109) => MlyValue.START_TEXTAREA(( [ ("NAME", HTMLAttrs.NAME ""), ("ROWS", HTMLAttrs.NAME "0"), ("COLS", HTMLAttrs.NAME "0") ] )) | (T 111) => MlyValue.START_TH(([])) | (T 115) => MlyValue.START_TR(([])) | (T 121) => MlyValue.START_UL(([])) | _ => MlyValue.VOID end val terms : term list = nil $$ (T 124) $$ (T 123) $$ (T 122) $$ (T 120) $$ (T 119) $$ (T 118) $$ (T 117) $$ (T 116) $$ (T 114) $$ (T 113) $$ (T 112) $$ (T 110) $$ (T 108) $$ (T 106) $$ (T 104) $$ (T 103) $$ (T 102) $$ (T 101) $$ (T 100) $$ (T 99) $$ (T 98) $$ (T 97) $$ (T 96) $$ (T 95) $$ (T 94) $$ (T 93) $$ (T 92) $$ (T 90) $$ (T 89) $$ (T 88) $$ (T 87) $$ (T 86) $$ (T 83) $$ (T 81) $$ (T 79) $$ (T 76) $$ (T 74) $$ (T 71) $$ (T 69) $$ (T 68) $$ (T 64) $$ (T 63) $$ (T 62) $$ (T 61) $$ (T 59) $$ (T 58) $$ (T 57) $$ (T 55) $$ (T 53) $$ (T 51) $$ (T 49) $$ (T 47) $$ (T 45) $$ (T 43) $$ (T 41) $$ (T 39) $$ (T 38) $$ (T 37) $$ (T 36) $$ (T 35) $$ (T 33) $$ (T 31) $$ (T 29) $$ (T 28) $$ (T 27) $$ (T 26) $$ (T 25) $$ (T 24) $$ (T 23) $$ (T 22) $$ (T 21) $$ (T 20) $$ (T 19) $$ (T 16) $$ (T 14) $$ (T 13) $$ (T 12) $$ (T 11) $$ (T 9) $$ (T 8) $$ (T 6) $$ (T 4) $$ (T 3) $$ (T 2) $$ (T 0)end structure Actions = struct exception mlyAction of int local open Header in val actions = fn (i392,defaultPos,stack, (ctx):arg) => case (i392,stack) of ( 0, ( ( _, ( _, _, EndHTML1right)) :: ( _, ( MlyValue.Body Body, _, _)) :: ( _, ( MlyValue.Head Head, _, _)) :: ( _, ( MlyValue.StartHTML StartHTML, StartHTML1left, _)) :: rest671)) => let val result = MlyValue.Document ( HTML.HTML{version=StartHTML, head=Head, body=Body}) in ( LrTable.NT 0, ( result, StartHTML1left, EndHTML1right), rest671) end | ( 1, ( rest671)) => let val result = MlyValue.StartHTML (NONE) in ( LrTable.NT 1, ( result, defaultPos, defaultPos), rest671) end | ( 2, ( ( _, ( _, START_HTML1left, START_HTML1right)) :: rest671)) => let val result = MlyValue.StartHTML (NONE) in ( LrTable.NT 1, ( result, START_HTML1left, START_HTML1right), rest671) end | ( 3, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 2, ( result, defaultPos, defaultPos), rest671) end | ( 4, ( ( _, ( _, END_HTML1left, END_HTML1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 2, ( result, END_HTML1left, END_HTML1right), rest671) end | ( 5, ( ( _, ( _, _, EndHEAD1right)) :: ( _, ( MlyValue.HeadContents HeadContents, _, _)) :: ( _, ( _, StartHEAD1left, _)) :: rest671)) => let val result = MlyValue.Head (HeadContents) in ( LrTable.NT 3, ( result, StartHEAD1left, EndHEAD1right), rest671) end | ( 6, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 4, ( result, defaultPos, defaultPos), rest671) end | ( 7, ( ( _, ( _, START_HEAD1left, START_HEAD1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 4, ( result, START_HEAD1left, START_HEAD1right), rest671) end | ( 8, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 5, ( result, defaultPos, defaultPos), rest671) end | ( 9, ( ( _, ( _, END_HEAD1left, END_HEAD1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 5, ( result, END_HEAD1left, END_HEAD1right), rest671) end | ( 10, ( ( _, ( MlyValue.HeadElements HeadElements2, _, HeadElements2right)) :: _ :: ( _, ( MlyValue.PCData PCData, _, _)) :: _ :: ( _, ( MlyValue.HeadElements HeadElements1, HeadElements1left, _ )) :: rest671)) => let val result = MlyValue.HeadContents ( HeadElements1 @ (HTML.Head_TITLE PCData :: HeadElements2)) in ( LrTable.NT 6, ( result, HeadElements1left, HeadElements2right), rest671) end | ( 11, ( rest671)) => let val result = MlyValue.HeadElements ([]) in ( LrTable.NT 7, ( result, defaultPos, defaultPos), rest671) end | ( 12, ( ( _, ( MlyValue.HeadElements HeadElements, _, HeadElements1right)) :: ( _, ( MlyValue.HeadElement HeadElement, HeadElement1left, _)) :: rest671)) => let val result = MlyValue.HeadElements (HeadElement :: HeadElements) in ( LrTable.NT 7, ( result, HeadElement1left, HeadElements1right), rest671) end | ( 13, ( ( _, ( MlyValue.TAG_META TAG_META, (TAG_METAleft as TAG_META1left), TAG_META1right)) :: rest671)) => let val result = MlyValue.HeadElement (HTMLAttrs.mkMETA(ctx TAG_METAleft, TAG_META)) in ( LrTable.NT 8, ( result, TAG_META1left, TAG_META1right), rest671) end | ( 14, ( ( _, ( MlyValue.TAG_LINK TAG_LINK, (TAG_LINKleft as TAG_LINK1left), TAG_LINK1right)) :: rest671)) => let val result = MlyValue.HeadElement (HTMLAttrs.mkLINK(ctx TAG_LINKleft, TAG_LINK)) in ( LrTable.NT 8, ( result, TAG_LINK1left, TAG_LINK1right), rest671) end | ( 15, ( ( _, ( MlyValue.TAG_ISINDEX TAG_ISINDEX, (TAG_ISINDEXleft as TAG_ISINDEX1left), TAG_ISINDEX1right)) :: rest671)) => let val result = MlyValue.HeadElement ( let val stuff = HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) in HTML.Head_ISINDEX stuff end ) in ( LrTable.NT 8, ( result, TAG_ISINDEX1left, TAG_ISINDEX1right), rest671) end | ( 16, ( ( _, ( MlyValue.TAG_BASE TAG_BASE, (TAG_BASEleft as TAG_BASE1left), TAG_BASE1right)) :: rest671)) => let val result = MlyValue.HeadElement (HTMLAttrs.mkBASE(ctx TAG_BASEleft, TAG_BASE)) in ( LrTable.NT 8, ( result, TAG_BASE1left, TAG_BASE1right), rest671) end | ( 17, ( ( _, ( _, _, END_STYLE1right)) :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( _, START_STYLE1left, _)) :: rest671)) => let val result = MlyValue.HeadElement (HTML.Head_STYLE(PCData)) in ( LrTable.NT 8, ( result, START_STYLE1left, END_STYLE1right), rest671) end | ( 18, ( ( _, ( _, _, END_SCRIPT1right)) :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( _, START_SCRIPT1left, _)) :: rest671)) => let val result = MlyValue.HeadElement (HTML.Head_SCRIPT(PCData)) in ( LrTable.NT 8, ( result, START_SCRIPT1left, END_SCRIPT1right), rest671) end | ( 19, ( ( _, ( _, _, EndBODY1right)) :: ( _, ( MlyValue.BodyContent0 BodyContent0, BodyContent01left, _)) :: rest671) ) => let val result = MlyValue.Body (BodyContent0) in ( LrTable.NT 9, ( result, BodyContent01left, EndBODY1right), rest671) end | ( 20, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 11, ( result, defaultPos, defaultPos), rest671) end | ( 21, ( ( _, ( _, END_BODY1left, END_BODY1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 11, ( result, END_BODY1left, END_BODY1right), rest671 ) end | ( 22, ( ( _, ( MlyValue.BodyContent1 BodyContent1, BodyContent11left, BodyContent11right)) :: rest671)) => let val result = MlyValue.BodyContent (mkBlock BodyContent1) in ( LrTable.NT 12, ( result, BodyContent11left, BodyContent11right), rest671) end | ( 23, ( ( _, ( MlyValue.BodyContent BodyContent, _, BodyContent1right)) :: ( _, ( MlyValue.START_BODY START_BODY, ( START_BODYleft as START_BODY1left), _)) :: rest671)) => let val result = MlyValue.BodyContent0 ( HTMLAttrs.mkBODY(ctx START_BODYleft, START_BODY, BodyContent)) in ( LrTable.NT 13, ( result, START_BODY1left, BodyContent1right), rest671) end | ( 24, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.TextWOScript TextWOScript, TextWOScript1left, _)) :: rest671)) => let val result = MlyValue.BodyContent0 (mkBody(consText(TextWOScript, BodyContent1))) in ( LrTable.NT 13, ( result, TextWOScript1left, BodyContent11right), rest671) end | ( 25, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, BodyElement1left, _)) :: rest671)) => let val result = MlyValue.BodyContent0 (mkBody(consBlock(BodyElement, BodyContent1))) in ( LrTable.NT 13, ( result, BodyElement1left, BodyContent11right), rest671) end | ( 26, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.BlockWOIndex BlockWOIndex, BlockWOIndex1left, _)) :: rest671)) => let val result = MlyValue.BodyContent0 (mkBody(consBlock(BlockWOIndex, BodyContent1))) in ( LrTable.NT 13, ( result, BlockWOIndex1left, BodyContent11right), rest671) end | ( 27, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent0 (mkBody(consBlock(Paragraph, BodyContent1))) in ( LrTable.NT 13, ( result, Paragraph1left, BodyContent11right), rest671) end | ( 28, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent0 (mkBody(consBlock(Paragraph, BodyContent2))) in ( LrTable.NT 13, ( result, Paragraph1left, BodyContent21right), rest671) end | ( 29, ( rest671)) => let val result = MlyValue.BodyContent1 ([]) in ( LrTable.NT 14, ( result, defaultPos, defaultPos), rest671) end | ( 30, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) :: rest671)) => let val result = MlyValue.BodyContent1 ( consText(Text, BodyContent1)) in ( LrTable.NT 14, ( result, Text1left, BodyContent11right), rest671 ) end | ( 31, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, BodyElement1left, _)) :: rest671)) => let val result = MlyValue.BodyContent1 (consBlock(BodyElement, BodyContent1)) in ( LrTable.NT 14, ( result, BodyElement1left, BodyContent11right), rest671) end | ( 32, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result = MlyValue.BodyContent1 ( consBlock(Block, BodyContent1)) in ( LrTable.NT 14, ( result, Block1left, BodyContent11right), rest671) end | ( 33, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent1 (consBlock(Paragraph, BodyContent1)) in ( LrTable.NT 14, ( result, Paragraph1left, BodyContent11right), rest671) end | ( 34, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent1 (consBlock(Paragraph, BodyContent2)) in ( LrTable.NT 14, ( result, Paragraph1left, BodyContent21right), rest671) end | ( 35, ( rest671)) => let val result = MlyValue.BodyContent2 ([]) in ( LrTable.NT 15, ( result, defaultPos, defaultPos), rest671) end | ( 36, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, BodyElement1left, _)) :: rest671)) => let val result = MlyValue.BodyContent2 (consBlock(BodyElement, BodyContent1)) in ( LrTable.NT 15, ( result, BodyElement1left, BodyContent11right), rest671) end | ( 37, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result = MlyValue.BodyContent2 ( consBlock(Block, BodyContent1)) in ( LrTable.NT 15, ( result, Block1left, BodyContent11right), rest671) end | ( 38, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent2 (consBlock(Paragraph, BodyContent1)) in ( LrTable.NT 15, ( result, Paragraph1left, BodyContent11right), rest671) end | ( 39, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.BodyContent2 (consBlock(Paragraph, BodyContent2)) in ( LrTable.NT 15, ( result, Paragraph1left, BodyContent21right), rest671) end | ( 40, ( ( _, ( _, _, END_H11right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H1 START_H1, (START_H1left as START_H11left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(1, ctx START_H1left, START_H1, TextList)) in ( LrTable.NT 16, ( result, START_H11left, END_H11right), rest671) end | ( 41, ( ( _, ( _, _, END_H21right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H2 START_H2, (START_H2left as START_H21left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(2, ctx START_H2left, START_H2, TextList)) in ( LrTable.NT 16, ( result, START_H21left, END_H21right), rest671) end | ( 42, ( ( _, ( _, _, END_H31right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H3 START_H3, (START_H3left as START_H31left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(3, ctx START_H3left, START_H3, TextList)) in ( LrTable.NT 16, ( result, START_H31left, END_H31right), rest671) end | ( 43, ( ( _, ( _, _, END_H41right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H4 START_H4, (START_H4left as START_H41left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(4, ctx START_H4left, START_H4, TextList)) in ( LrTable.NT 16, ( result, START_H41left, END_H41right), rest671) end | ( 44, ( ( _, ( _, _, END_H51right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H5 START_H5, (START_H5left as START_H51left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(5, ctx START_H5left, START_H5, TextList)) in ( LrTable.NT 16, ( result, START_H51left, END_H51right), rest671) end | ( 45, ( ( _, ( _, _, END_H61right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_H6 START_H6, (START_H6left as START_H61left), _)) :: rest671)) => let val result = MlyValue.BodyElement ( HTMLAttrs.mkHn(6, ctx START_H6left, START_H6, TextList)) in ( LrTable.NT 16, ( result, START_H61left, END_H61right), rest671) end | ( 46, ( ( _, ( _, _, END_ADDRESS1right)) :: ( _, ( MlyValue.AddressContent1 AddressContent1, _, _)) :: ( _, ( _, START_ADDRESS1left, _)) :: rest671)) => let val result = MlyValue.BodyElement (HTML.ADDRESS(mkBlock AddressContent1)) in ( LrTable.NT 16, ( result, START_ADDRESS1left, END_ADDRESS1right), rest671) end | ( 47, ( rest671)) => let val result = MlyValue.AddressContent1 ([] ) in ( LrTable.NT 17, ( result, defaultPos, defaultPos), rest671) end | ( 48, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, AddressContent11right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) :: rest671)) => let val result = MlyValue.AddressContent1 ( consText(Text, AddressContent1)) in ( LrTable.NT 17, ( result, Text1left, AddressContent11right), rest671) end | ( 49, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, AddressContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.AddressContent1 (consBlock(Paragraph, AddressContent1)) in ( LrTable.NT 17, ( result, Paragraph1left, AddressContent11right), rest671) end | ( 50, ( ( _, ( MlyValue.AddressContent2 AddressContent2, _, AddressContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.AddressContent1 (consBlock(Paragraph, AddressContent2)) in ( LrTable.NT 17, ( result, Paragraph1left, AddressContent21right), rest671) end | ( 51, ( rest671)) => let val result = MlyValue.AddressContent2 ([] ) in ( LrTable.NT 18, ( result, defaultPos, defaultPos), rest671) end | ( 52, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, AddressContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.AddressContent2 (consBlock(Paragraph, AddressContent1)) in ( LrTable.NT 18, ( result, Paragraph1left, AddressContent11right), rest671) end | ( 53, ( ( _, ( MlyValue.AddressContent2 AddressContent2, _, AddressContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.AddressContent2 (consBlock(Paragraph, AddressContent2)) in ( LrTable.NT 18, ( result, Paragraph1left, AddressContent21right), rest671) end | ( 54, ( ( _, ( MlyValue.List List, List1left, List1right)) :: rest671)) => let val result = MlyValue.BlockWOIndex (List) in ( LrTable.NT 19, ( result, List1left, List1right), rest671) end | ( 55, ( ( _, ( MlyValue.Preformatted Preformatted, Preformatted1left, Preformatted1right)) :: rest671)) => let val result = MlyValue.BlockWOIndex (Preformatted) in ( LrTable.NT 19, ( result, Preformatted1left, Preformatted1right), rest671) end | ( 56, ( ( _, ( _, _, END_DIV1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( MlyValue.START_DIV START_DIV, ( START_DIVleft as START_DIV1left), _)) :: rest671)) => let val result = MlyValue.BlockWOIndex ( HTMLAttrs.mkDIV(ctx START_DIVleft, START_DIV, BodyContent)) in ( LrTable.NT 19, ( result, START_DIV1left, END_DIV1right), rest671 ) end | ( 57, ( ( _, ( _, _, END_CENTER1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( _, START_CENTER1left, _)) :: rest671)) => let val result = MlyValue.BlockWOIndex (HTML.CENTER BodyContent) in ( LrTable.NT 19, ( result, START_CENTER1left, END_CENTER1right), rest671) end | ( 58, ( ( _, ( _, _, END_BLOCKQUOTE1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( _, START_BLOCKQUOTE1left, _)) :: rest671)) => let val result = MlyValue.BlockWOIndex (HTML.BLOCKQUOTE BodyContent) in ( LrTable.NT 19, ( result, START_BLOCKQUOTE1left, END_BLOCKQUOTE1right), rest671) end | ( 59, ( ( _, ( _, _, END_FORM1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( MlyValue.START_FORM START_FORM, (START_FORMleft as START_FORM1left), _)) :: rest671)) => let val result = MlyValue.BlockWOIndex ( HTMLAttrs.mkFORM(ctx START_FORMleft, START_FORM, BodyContent)) in ( LrTable.NT 19, ( result, START_FORM1left, END_FORM1right), rest671) end | ( 60, ( ( _, ( MlyValue.TAG_HR TAG_HR, (TAG_HRleft as TAG_HR1left), TAG_HR1right)) :: rest671)) => let val result = MlyValue.BlockWOIndex (HTMLAttrs.mkHR(ctx TAG_HRleft, TAG_HR)) in ( LrTable.NT 19, ( result, TAG_HR1left, TAG_HR1right), rest671) end | ( 61, ( ( _, ( _, _, END_TABLE1right)) :: ( _, ( MlyValue.TableRowList TableRowList, _, _)) :: ( _, ( MlyValue.optCaption optCaption, _, _)) :: ( _, ( MlyValue.START_TABLE START_TABLE, (START_TABLEleft as START_TABLE1left), _)) :: rest671)) => let val result = MlyValue.BlockWOIndex ( HTMLAttrs.mkTABLE( ctx START_TABLEleft, START_TABLE, {caption = optCaption, body = TableRowList}) ) in ( LrTable.NT 19, ( result, START_TABLE1left, END_TABLE1right), rest671) end | ( 62, ( ( _, ( MlyValue.BlockWOIndex BlockWOIndex, BlockWOIndex1left, BlockWOIndex1right)) :: rest671)) => let val result = MlyValue.Block (BlockWOIndex) in ( LrTable.NT 20, ( result, BlockWOIndex1left, BlockWOIndex1right), rest671) end | ( 63, ( ( _, ( MlyValue.TAG_ISINDEX TAG_ISINDEX, (TAG_ISINDEXleft as TAG_ISINDEX1left), TAG_ISINDEX1right)) :: rest671)) => let val result = MlyValue.Block ( let val stuff = HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) in HTML.ISINDEX stuff end ) in ( LrTable.NT 20, ( result, TAG_ISINDEX1left, TAG_ISINDEX1right), rest671) end | ( 64, ( ( _, ( MlyValue.TextList TextList, _, TextList1right)) :: ( _, ( MlyValue.START_P START_P, (START_Pleft as START_P1left), _)) :: rest671)) => let val result = MlyValue.Paragraph ( HTMLAttrs.mkP(ctx START_Pleft, START_P, TextList)) in ( LrTable.NT 21, ( result, START_P1left, TextList1right), rest671) end | ( 65, ( ( _, ( _, _, END_UL1right)) :: ( _, ( MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( MlyValue.START_UL START_UL, ( START_ULleft as START_UL1left), _)) :: rest671)) => let val result = MlyValue.List ( HTMLAttrs.mkUL(ctx START_ULleft, START_UL, ListItemList)) in ( LrTable.NT 22, ( result, START_UL1left, END_UL1right), rest671) end | ( 66, ( ( _, ( _, _, END_OL1right)) :: ( _, ( MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( MlyValue.START_OL START_OL, ( START_OLleft as START_OL1left), _)) :: rest671)) => let val result = MlyValue.List ( HTMLAttrs.mkOL(ctx START_OLleft, START_OL, ListItemList)) in ( LrTable.NT 22, ( result, START_OL1left, END_OL1right), rest671) end | ( 67, ( ( _, ( _, _, END_DIR1right)) :: ( _, ( MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( MlyValue.START_DIR START_DIR, (START_DIRleft as START_DIR1left), _)) :: rest671)) => let val result = MlyValue.List ( HTMLAttrs.mkDIR(ctx START_DIRleft, START_DIR, ListItemList)) in ( LrTable.NT 22, ( result, START_DIR1left, END_DIR1right), rest671 ) end | ( 68, ( ( _, ( _, _, END_MENU1right)) :: ( _, ( MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( MlyValue.START_MENU START_MENU, (START_MENUleft as START_MENU1left), _ )) :: rest671)) => let val result = MlyValue.List ( HTMLAttrs.mkMENU(ctx START_MENUleft, START_MENU, ListItemList)) in ( LrTable.NT 22, ( result, START_MENU1left, END_MENU1right), rest671) end | ( 69, ( ( _, ( _, _, END_DL1right)) :: ( _, ( MlyValue.DLItemList DLItemList, _, _)) :: ( _, ( MlyValue.START_DL START_DL, (START_DLleft as START_DL1left), _)) :: rest671)) => let val result = MlyValue.List ( HTMLAttrs.mkDL( ctx START_DLleft, START_DL, groupDefListContents DLItemList) ) in ( LrTable.NT 22, ( result, START_DL1left, END_DL1right), rest671) end | ( 70, ( rest671)) => let val result = MlyValue.ListItemList ([]) in ( LrTable.NT 23, ( result, defaultPos, defaultPos), rest671) end | ( 71, ( ( _, ( MlyValue.ListItemList ListItemList, _, ListItemList1right)) :: ( _, ( MlyValue.ListItem ListItem, ListItem1left, _)) :: rest671)) => let val result = MlyValue.ListItemList (ListItem :: ListItemList) in ( LrTable.NT 23, ( result, ListItem1left, ListItemList1right), rest671) end | ( 72, ( ( _, ( _, _, EndLI1right)) :: ( _, ( MlyValue.Flow1 Flow1, _, _)) :: ( _, ( MlyValue.START_LI START_LI, (START_LIleft as START_LI1left), _)) :: rest671)) => let val result = MlyValue.ListItem ( HTMLAttrs.mkLI(ctx START_LIleft, START_LI, mkBlock Flow1)) in ( LrTable.NT 24, ( result, START_LI1left, EndLI1right), rest671) end | ( 73, ( rest671)) => let val result = MlyValue.DLItemList ([]) in ( LrTable.NT 25, ( result, defaultPos, defaultPos), rest671) end | ( 74, ( ( _, ( MlyValue.DLItemList DLItemList, _, DLItemList1right) ) :: ( _, ( MlyValue.DLItem DLItem, DLItem1left, _)) :: rest671)) => let val result = MlyValue.DLItemList (DLItem :: DLItemList) in ( LrTable.NT 25, ( result, DLItem1left, DLItemList1right), rest671 ) end | ( 75, ( ( _, ( _, _, EndDT1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_DT1left, _)) :: rest671)) => let val result = MlyValue.DLItem (DL_tag TextList) in ( LrTable.NT 26, ( result, START_DT1left, EndDT1right), rest671) end | ( 76, ( ( _, ( _, _, EndDD1right)) :: ( _, ( MlyValue.Flow1 Flow1, _, _)) :: ( _, ( _, START_DD1left, _)) :: rest671)) => let val result = MlyValue.DLItem (DL_item(mkBlock Flow1)) in ( LrTable.NT 26, ( result, START_DD1left, EndDD1right), rest671) end | ( 77, ( rest671)) => let val result = MlyValue.Flow1 ([]) in ( LrTable.NT 27, ( result, defaultPos, defaultPos), rest671) end | ( 78, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) :: rest671)) => let val result = MlyValue.Flow1 (consText(Text, Flow1)) in ( LrTable.NT 27, ( result, Text1left, Flow11right), rest671) end | ( 79, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result = MlyValue.Flow1 (consBlock(Block, Flow1)) in ( LrTable.NT 27, ( result, Block1left, Flow11right), rest671) end | ( 80, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.Flow1 (consBlock(Paragraph, Flow1)) in ( LrTable.NT 27, ( result, Paragraph1left, Flow11right), rest671) end | ( 81, ( ( _, ( MlyValue.Flow2 Flow2, _, Flow21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.Flow1 (consBlock(Paragraph, Flow2)) in ( LrTable.NT 27, ( result, Paragraph1left, Flow21right), rest671) end | ( 82, ( rest671)) => let val result = MlyValue.Flow2 ([]) in ( LrTable.NT 28, ( result, defaultPos, defaultPos), rest671) end | ( 83, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result = MlyValue.Flow2 (consBlock(Block, Flow1)) in ( LrTable.NT 28, ( result, Block1left, Flow11right), rest671) end | ( 84, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.Flow2 (consBlock(Paragraph, Flow1)) in ( LrTable.NT 28, ( result, Paragraph1left, Flow11right), rest671) end | ( 85, ( ( _, ( MlyValue.Flow2 Flow2, _, Flow21right)) :: ( _, ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let val result = MlyValue.Flow2 (consBlock(Paragraph, Flow2)) in ( LrTable.NT 28, ( result, Paragraph1left, Flow21right), rest671) end | ( 86, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 29, ( result, defaultPos, defaultPos), rest671) end | ( 87, ( ( _, ( _, END_LI1left, END_LI1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 29, ( result, END_LI1left, END_LI1right), rest671) end | ( 88, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 30, ( result, defaultPos, defaultPos), rest671) end | ( 89, ( ( _, ( _, END_DT1left, END_DT1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 30, ( result, END_DT1left, END_DT1right), rest671) end | ( 90, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 31, ( result, defaultPos, defaultPos), rest671) end | ( 91, ( ( _, ( _, END_DD1left, END_DD1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 31, ( result, END_DD1left, END_DD1right), rest671) end | ( 92, ( ( _, ( _, _, END_PRE1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_PRE START_PRE, ( START_PREleft as START_PRE1left), _)) :: rest671)) => let val result = MlyValue.Preformatted ( HTMLAttrs.mkPRE(ctx START_PREleft, START_PRE, TextList)) in ( LrTable.NT 32, ( result, START_PRE1left, END_PRE1right), rest671 ) end | ( 93, ( rest671)) => let val result = MlyValue.optCaption (NONE) in ( LrTable.NT 33, ( result, defaultPos, defaultPos), rest671) end | ( 94, ( ( _, ( _, _, END_CAPTION1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_CAPTION START_CAPTION, (START_CAPTIONleft as START_CAPTION1left), _)) :: rest671)) => let val result = MlyValue.optCaption ( SOME(HTMLAttrs.mkCAPTION( ctx START_CAPTIONleft, START_CAPTION, TextList)) ) in ( LrTable.NT 33, ( result, START_CAPTION1left, END_CAPTION1right), rest671) end | ( 95, ( ( _, ( MlyValue.TableRow TableRow, TableRow1left, TableRow1right)) :: rest671)) => let val result = MlyValue.TableRowList ([TableRow]) in ( LrTable.NT 34, ( result, TableRow1left, TableRow1right), rest671 ) end | ( 96, ( ( _, ( MlyValue.TableRowList TableRowList, _, TableRowList1right)) :: ( _, ( MlyValue.TableRow TableRow, TableRow1left, _)) :: rest671)) => let val result = MlyValue.TableRowList (TableRow :: TableRowList) in ( LrTable.NT 34, ( result, TableRow1left, TableRowList1right), rest671) end | ( 97, ( ( _, ( MlyValue.TableCellList TableCellList, _, TableCellList1right)) :: ( _, ( MlyValue.START_TR START_TR, ( START_TRleft as START_TR1left), _)) :: rest671)) => let val result = MlyValue.TableRow ( HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) in ( LrTable.NT 35, ( result, START_TR1left, TableCellList1right), rest671) end | ( 98, ( ( _, ( _, _, END_TR1right)) :: ( _, ( MlyValue.TableCellList TableCellList, _, _)) :: ( _, ( MlyValue.START_TR START_TR, (START_TRleft as START_TR1left), _)) :: rest671)) => let val result = MlyValue.TableRow ( HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) in ( LrTable.NT 35, ( result, START_TR1left, END_TR1right), rest671) end | ( 99, ( ( _, ( MlyValue.TableCell TableCell, TableCell1left, TableCell1right)) :: rest671)) => let val result = MlyValue.TableCellList ([TableCell]) in ( LrTable.NT 36, ( result, TableCell1left, TableCell1right), rest671) end | ( 100, ( ( _, ( MlyValue.TableCellList TableCellList, _, TableCellList1right)) :: ( _, ( MlyValue.TableCell TableCell, TableCell1left, _)) :: rest671)) => let val result = MlyValue.TableCellList (TableCell :: TableCellList) in ( LrTable.NT 36, ( result, TableCell1left, TableCellList1right), rest671) end | ( 101, ( ( _, ( _, _, END_TH1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( MlyValue.START_TH START_TH, ( START_THleft as START_TH1left), _)) :: rest671)) => let val result = MlyValue.TableCell ( HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) in ( LrTable.NT 37, ( result, START_TH1left, END_TH1right), rest671) end | ( 102, ( ( _, ( MlyValue.BodyContent BodyContent, _, BodyContent1right)) :: ( _, ( MlyValue.START_TH START_TH, ( START_THleft as START_TH1left), _)) :: rest671)) => let val result = MlyValue.TableCell ( HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) in ( LrTable.NT 37, ( result, START_TH1left, BodyContent1right), rest671) end | ( 103, ( ( _, ( _, _, END_TD1right)) :: ( _, ( MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( MlyValue.START_TD START_TD, ( START_TDleft as START_TD1left), _)) :: rest671)) => let val result = MlyValue.TableCell ( HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) in ( LrTable.NT 37, ( result, START_TD1left, END_TD1right), rest671) end | ( 104, ( ( _, ( MlyValue.BodyContent BodyContent, _, BodyContent1right)) :: ( _, ( MlyValue.START_TD START_TD, ( START_TDleft as START_TD1left), _)) :: rest671)) => let val result = MlyValue.TableCell ( HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) in ( LrTable.NT 37, ( result, START_TD1left, BodyContent1right), rest671) end | ( 105, ( ( _, ( MlyValue.TextList' TextList', TextList'1left, TextList'1right)) :: rest671)) => let val result = MlyValue.TextList (textList TextList') in ( LrTable.NT 38, ( result, TextList'1left, TextList'1right), rest671) end | ( 106, ( rest671)) => let val result = MlyValue.TextList' ([]) in ( LrTable.NT 39, ( result, defaultPos, defaultPos), rest671) end | ( 107, ( ( _, ( MlyValue.TextList' TextList', _, TextList'1right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) :: rest671)) => let val result = MlyValue.TextList' (Text :: TextList') in ( LrTable.NT 39, ( result, Text1left, TextList'1right), rest671) end | ( 108, ( ( _, ( MlyValue.PCDataElem PCDataElem, PCDataElem1left, PCDataElem1right)) :: rest671)) => let val result = MlyValue.TextWOScript (HTML.PCDATA PCDataElem) in ( LrTable.NT 40, ( result, PCDataElem1left, PCDataElem1right), rest671) end | ( 109, ( ( _, ( MlyValue.Font Font, Font1left, Font1right)) :: rest671)) => let val result = MlyValue.TextWOScript (Font) in ( LrTable.NT 40, ( result, Font1left, Font1right), rest671) end | ( 110, ( ( _, ( MlyValue.Phrase Phrase, Phrase1left, Phrase1right)) :: rest671)) => let val result = MlyValue.TextWOScript (Phrase) in ( LrTable.NT 40, ( result, Phrase1left, Phrase1right), rest671) end | ( 111, ( ( _, ( MlyValue.Special Special, Special1left, Special1right)) :: rest671)) => let val result = MlyValue.TextWOScript (Special) in ( LrTable.NT 40, ( result, Special1left, Special1right), rest671) end | ( 112, ( ( _, ( MlyValue.Form Form, Form1left, Form1right)) :: rest671)) => let val result = MlyValue.TextWOScript (Form) in ( LrTable.NT 40, ( result, Form1left, Form1right), rest671) end | ( 113, ( ( _, ( MlyValue.TextWOScript TextWOScript, TextWOScript1left, TextWOScript1right)) :: rest671)) => let val result = MlyValue.Text (TextWOScript) in ( LrTable.NT 41, ( result, TextWOScript1left, TextWOScript1right), rest671) end | ( 114, ( ( _, ( _, _, END_SCRIPT1right)) :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( _, START_SCRIPT1left, _)) :: rest671)) => let val result = MlyValue.Text (HTML.SCRIPT PCData) in ( LrTable.NT 41, ( result, START_SCRIPT1left, END_SCRIPT1right), rest671) end | ( 115, ( ( _, ( _, _, END_TT1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_TT1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.TT(TextList)) in ( LrTable.NT 42, ( result, START_TT1left, END_TT1right), rest671) end | ( 116, ( ( _, ( _, _, END_I1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_I1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.I(TextList)) in ( LrTable.NT 42, ( result, START_I1left, END_I1right), rest671) end | ( 117, ( ( _, ( _, _, END_B1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_B1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.B(TextList)) in ( LrTable.NT 42, ( result, START_B1left, END_B1right), rest671) end | ( 118, ( ( _, ( _, _, END_U1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_U1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.U(TextList)) in ( LrTable.NT 42, ( result, START_U1left, END_U1right), rest671) end | ( 119, ( ( _, ( _, _, END_STRIKE1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_STRIKE1left, _)) :: rest671)) => let val result = MlyValue.Font ( HTML.STRIKE(TextList)) in ( LrTable.NT 42, ( result, START_STRIKE1left, END_STRIKE1right), rest671) end | ( 120, ( ( _, ( _, _, END_BIG1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_BIG1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.BIG(TextList)) in ( LrTable.NT 42, ( result, START_BIG1left, END_BIG1right), rest671 ) end | ( 121, ( ( _, ( _, _, END_SMALL1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_SMALL1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.SMALL(TextList)) in ( LrTable.NT 42, ( result, START_SMALL1left, END_SMALL1right), rest671) end | ( 122, ( ( _, ( _, _, END_SUB1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_SUB1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.SUB(TextList)) in ( LrTable.NT 42, ( result, START_SUB1left, END_SUB1right), rest671 ) end | ( 123, ( ( _, ( _, _, END_SUP1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_SUP1left, _)) :: rest671)) => let val result = MlyValue.Font (HTML.SUP(TextList)) in ( LrTable.NT 42, ( result, START_SUP1left, END_SUP1right), rest671 ) end | ( 124, ( ( _, ( _, _, END_EM1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_EM1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.EM(TextList)) in ( LrTable.NT 43, ( result, START_EM1left, END_EM1right), rest671) end | ( 125, ( ( _, ( _, _, END_STRONG1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_STRONG1left, _)) :: rest671)) => let val result = MlyValue.Phrase ( HTML.STRONG(TextList)) in ( LrTable.NT 43, ( result, START_STRONG1left, END_STRONG1right), rest671) end | ( 126, ( ( _, ( _, _, END_CODE1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_CODE1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.CODE(TextList)) in ( LrTable.NT 43, ( result, START_CODE1left, END_CODE1right), rest671) end | ( 127, ( ( _, ( _, _, END_DFN1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_DFN1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.DFN(TextList)) in ( LrTable.NT 43, ( result, START_DFN1left, END_DFN1right), rest671 ) end | ( 128, ( ( _, ( _, _, END_SAMP1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_SAMP1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.SAMP(TextList)) in ( LrTable.NT 43, ( result, START_SAMP1left, END_SAMP1right), rest671) end | ( 129, ( ( _, ( _, _, END_KBD1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_KBD1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.KBD(TextList)) in ( LrTable.NT 43, ( result, START_KBD1left, END_KBD1right), rest671 ) end | ( 130, ( ( _, ( _, _, END_VAR1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_VAR1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.VAR(TextList)) in ( LrTable.NT 43, ( result, START_VAR1left, END_VAR1right), rest671 ) end | ( 131, ( ( _, ( _, _, END_CITE1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_CITE1left, _)) :: rest671)) => let val result = MlyValue.Phrase (HTML.CITE(TextList)) in ( LrTable.NT 43, ( result, START_CITE1left, END_CITE1right), rest671) end | ( 132, ( ( _, ( _, _, END_A1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_A START_A, (START_Aleft as START_A1left), _)) :: rest671)) => let val result = MlyValue.Special (HTMLAttrs.mkA(ctx START_Aleft, START_A, TextList)) in ( LrTable.NT 44, ( result, START_A1left, END_A1right), rest671) end | ( 133, ( ( _, ( MlyValue.TAG_IMG TAG_IMG, (TAG_IMGleft as TAG_IMG1left), TAG_IMG1right)) :: rest671)) => let val result = MlyValue.Special (HTMLAttrs.mkIMG(ctx TAG_IMGleft, TAG_IMG)) in ( LrTable.NT 44, ( result, TAG_IMG1left, TAG_IMG1right), rest671) end | ( 134, ( ( _, ( _, _, END_APPLET1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_APPLET START_APPLET, (START_APPLETleft as START_APPLET1left), _)) :: rest671) ) => let val result = MlyValue.Special ( HTMLAttrs.mkAPPLET(ctx START_APPLETleft, START_APPLET, TextList)) in ( LrTable.NT 44, ( result, START_APPLET1left, END_APPLET1right), rest671) end | ( 135, ( ( _, ( _, _, END_FONT1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_FONT START_FONT, ( START_FONTleft as START_FONT1left), _)) :: rest671)) => let val result = MlyValue.Special ( HTMLAttrs.mkFONT(ctx START_FONTleft, START_FONT, TextList)) in ( LrTable.NT 44, ( result, START_FONT1left, END_FONT1right), rest671) end | ( 136, ( ( _, ( _, _, END_BASEFONT1right)) :: ( _, ( MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_BASEFONT START_BASEFONT, (START_BASEFONTleft as START_BASEFONT1left), _)) :: rest671)) => let val result = MlyValue.Special ( HTMLAttrs.mkBASEFONT( ctx START_BASEFONTleft, START_BASEFONT, TextList) ) in ( LrTable.NT 44, ( result, START_BASEFONT1left, END_BASEFONT1right ), rest671) end | ( 137, ( ( _, ( MlyValue.TAG_BR TAG_BR, (TAG_BRleft as TAG_BR1left) , TAG_BR1right)) :: rest671)) => let val result = MlyValue.Special ( HTMLAttrs.mkBR(ctx TAG_BRleft, TAG_BR)) in ( LrTable.NT 44, ( result, TAG_BR1left, TAG_BR1right), rest671) end | ( 138, ( ( _, ( _, _, END_MAP1right)) :: ( _, ( MlyValue.AreaList AreaList, _, _)) :: ( _, ( MlyValue.START_MAP START_MAP, ( START_MAPleft as START_MAP1left), _)) :: rest671)) => let val result = MlyValue.Special ( HTMLAttrs.mkMAP(ctx START_MAPleft, START_MAP, AreaList)) in ( LrTable.NT 44, ( result, START_MAP1left, END_MAP1right), rest671 ) end | ( 139, ( ( _, ( MlyValue.TAG_PARAM TAG_PARAM, (TAG_PARAMleft as TAG_PARAM1left), TAG_PARAM1right)) :: rest671)) => let val result = MlyValue.Special (HTMLAttrs.mkPARAM(ctx TAG_PARAMleft, TAG_PARAM)) in ( LrTable.NT 44, ( result, TAG_PARAM1left, TAG_PARAM1right), rest671) end | ( 140, ( rest671)) => let val result = MlyValue.AreaList ([]) in ( LrTable.NT 45, ( result, defaultPos, defaultPos), rest671) end | ( 141, ( ( _, ( MlyValue.AreaList AreaList, _, AreaList1right)) :: ( _, ( MlyValue.TAG_AREA TAG_AREA, (TAG_AREAleft as TAG_AREA1left), _) ) :: rest671)) => let val result = MlyValue.AreaList ( HTMLAttrs.mkAREA(ctx TAG_AREAleft, TAG_AREA) :: AreaList) in ( LrTable.NT 45, ( result, TAG_AREA1left, AreaList1right), rest671 ) end | ( 142, ( ( _, ( MlyValue.TAG_INPUT TAG_INPUT, (TAG_INPUTleft as TAG_INPUT1left), TAG_INPUT1right)) :: rest671)) => let val result = MlyValue.Form (HTMLAttrs.mkINPUT(ctx TAG_INPUTleft, TAG_INPUT)) in ( LrTable.NT 46, ( result, TAG_INPUT1left, TAG_INPUT1right), rest671) end | ( 143, ( ( _, ( _, _, END_SELECT1right)) :: ( _, ( MlyValue.OptionList OptionList, _, _)) :: ( _, ( MlyValue.START_SELECT START_SELECT, (START_SELECTleft as START_SELECT1left), _)) :: rest671 )) => let val result = MlyValue.Form ( HTMLAttrs.mkSELECT(ctx START_SELECTleft, START_SELECT, OptionList)) in ( LrTable.NT 46, ( result, START_SELECT1left, END_SELECT1right), rest671) end | ( 144, ( ( _, ( _, _, END_TEXTAREA1right)) :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( MlyValue.START_TEXTAREA START_TEXTAREA, (START_TEXTAREAleft as START_TEXTAREA1left), _)) :: rest671)) => let val result = MlyValue.Form ( HTMLAttrs.mkTEXTAREA( ctx START_TEXTAREAleft, START_TEXTAREA, PCData) ) in ( LrTable.NT 46, ( result, START_TEXTAREA1left, END_TEXTAREA1right ), rest671) end | ( 145, ( rest671)) => let val result = MlyValue.OptionList ([]) in ( LrTable.NT 47, ( result, defaultPos, defaultPos), rest671) end | ( 146, ( ( _, ( MlyValue.OptionList OptionList, _, OptionList1right )) :: _ :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( MlyValue.START_OPTION START_OPTION, (START_OPTIONleft as START_OPTION1left), _)) :: rest671)) => let val result = MlyValue.OptionList ( HTMLAttrs.mkOPTION(ctx START_OPTIONleft, START_OPTION, PCData) :: OptionList ) in ( LrTable.NT 47, ( result, START_OPTION1left, OptionList1right), rest671) end | ( 147, ( rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 48, ( result, defaultPos, defaultPos), rest671) end | ( 148, ( ( _, ( _, END_OPTION1left, END_OPTION1right)) :: rest671)) => let val result = MlyValue.ntVOID () in ( LrTable.NT 48, ( result, END_OPTION1left, END_OPTION1right), rest671) end | ( 149, ( ( _, ( MlyValue.PCDataList PCDataList, PCDataList1left, PCDataList1right)) :: rest671)) => let val result = MlyValue.PCData ( concat PCDataList) in ( LrTable.NT 49, ( result, PCDataList1left, PCDataList1right), rest671) end | ( 150, ( rest671)) => let val result = MlyValue.PCDataList ([]) in ( LrTable.NT 50, ( result, defaultPos, defaultPos), rest671) end | ( 151, ( ( _, ( MlyValue.PCDataList PCDataList, _, PCDataList1right )) :: ( _, ( MlyValue.PCDataElem PCDataElem, PCDataElem1left, _)) :: rest671)) => let val result = MlyValue.PCDataList ( PCDataElem :: PCDataList) in ( LrTable.NT 50, ( result, PCDataElem1left, PCDataList1right), rest671) end | ( 152, ( ( _, ( MlyValue.PCDATA PCDATA, PCDATA1left, PCDATA1right)) :: rest671)) => let val result = MlyValue.PCDataElem (PCDATA) in ( LrTable.NT 51, ( result, PCDATA1left, PCDATA1right), rest671) end | ( 153, ( ( _, ( MlyValue.CHAR_REF CHAR_REF, CHAR_REF1left, CHAR_REF1right)) :: rest671)) => let val result = MlyValue.PCDataElem (CHAR_REF) in ( LrTable.NT 51, ( result, CHAR_REF1left, CHAR_REF1right), rest671 ) end | ( 154, ( ( _, ( MlyValue.ENTITY_REF ENTITY_REF, ENTITY_REF1left, ENTITY_REF1right)) :: rest671)) => let val result = MlyValue.PCDataElem (ENTITY_REF) in ( LrTable.NT 51, ( result, ENTITY_REF1left, ENTITY_REF1right), rest671) end | _ => raise (mlyAction i392) end val void = MlyValue.VOID val extract = fn a => (fn MlyValue.Document x => x | _ => let exception ParseInternal in raise ParseInternal end) a end end structure Tokens : HTML_TOKENS = struct type svalue = ParserData.svalue type ('a,'b) token = ('a,'b) Token.token fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( ParserData.MlyValue.VOID,p1,p2)) fun START_A (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( ParserData.MlyValue.START_A i,p1,p2)) fun END_A (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( ParserData.MlyValue.VOID,p1,p2)) fun START_ADDRESS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( ParserData.MlyValue.VOID,p1,p2)) fun END_ADDRESS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( ParserData.MlyValue.VOID,p1,p2)) fun START_APPLET (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( ParserData.MlyValue.START_APPLET i,p1,p2)) fun END_APPLET (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_AREA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( ParserData.MlyValue.TAG_AREA i,p1,p2)) fun START_B (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( ParserData.MlyValue.VOID,p1,p2)) fun END_B (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_BASE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( ParserData.MlyValue.TAG_BASE i,p1,p2)) fun START_BIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( ParserData.MlyValue.VOID,p1,p2)) fun END_BIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( ParserData.MlyValue.VOID,p1,p2)) fun START_BLOCKQUOTE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( ParserData.MlyValue.VOID,p1,p2)) fun END_BLOCKQUOTE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( ParserData.MlyValue.VOID,p1,p2)) fun START_BODY (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( ParserData.MlyValue.START_BODY i,p1,p2)) fun END_BODY (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_BR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( ParserData.MlyValue.TAG_BR i,p1,p2)) fun START_CAPTION (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( ParserData.MlyValue.START_CAPTION i,p1,p2)) fun END_CAPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( ParserData.MlyValue.VOID,p1,p2)) fun START_CENTER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( ParserData.MlyValue.VOID,p1,p2)) fun END_CENTER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( ParserData.MlyValue.VOID,p1,p2)) fun START_CITE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( ParserData.MlyValue.VOID,p1,p2)) fun END_CITE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( ParserData.MlyValue.VOID,p1,p2)) fun START_CODE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( ParserData.MlyValue.VOID,p1,p2)) fun END_CODE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( ParserData.MlyValue.VOID,p1,p2)) fun START_DD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( ParserData.MlyValue.VOID,p1,p2)) fun END_DD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( ParserData.MlyValue.VOID,p1,p2)) fun START_DFN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( ParserData.MlyValue.VOID,p1,p2)) fun END_DFN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( ParserData.MlyValue.VOID,p1,p2)) fun START_DIR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( ParserData.MlyValue.START_DIR i,p1,p2)) fun END_DIR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( ParserData.MlyValue.VOID,p1,p2)) fun START_DIV (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( ParserData.MlyValue.START_DIV i,p1,p2)) fun END_DIV (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( ParserData.MlyValue.VOID,p1,p2)) fun START_DL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( ParserData.MlyValue.START_DL i,p1,p2)) fun END_DL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( ParserData.MlyValue.VOID,p1,p2)) fun START_DT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( ParserData.MlyValue.VOID,p1,p2)) fun END_DT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( ParserData.MlyValue.VOID,p1,p2)) fun START_EM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( ParserData.MlyValue.VOID,p1,p2)) fun END_EM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( ParserData.MlyValue.VOID,p1,p2)) fun START_FONT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( ParserData.MlyValue.START_FONT i,p1,p2)) fun END_FONT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 41,( ParserData.MlyValue.VOID,p1,p2)) fun START_BASEFONT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 42,( ParserData.MlyValue.START_BASEFONT i,p1,p2)) fun END_BASEFONT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 43,( ParserData.MlyValue.VOID,p1,p2)) fun START_FORM (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 44,( ParserData.MlyValue.START_FORM i,p1,p2)) fun END_FORM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 45,( ParserData.MlyValue.VOID,p1,p2)) fun START_H1 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 46,( ParserData.MlyValue.START_H1 i,p1,p2)) fun END_H1 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 47,( ParserData.MlyValue.VOID,p1,p2)) fun START_H2 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 48,( ParserData.MlyValue.START_H2 i,p1,p2)) fun END_H2 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 49,( ParserData.MlyValue.VOID,p1,p2)) fun START_H3 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 50,( ParserData.MlyValue.START_H3 i,p1,p2)) fun END_H3 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 51,( ParserData.MlyValue.VOID,p1,p2)) fun START_H4 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 52,( ParserData.MlyValue.START_H4 i,p1,p2)) fun END_H4 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 53,( ParserData.MlyValue.VOID,p1,p2)) fun START_H5 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 54,( ParserData.MlyValue.START_H5 i,p1,p2)) fun END_H5 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 55,( ParserData.MlyValue.VOID,p1,p2)) fun START_H6 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 56,( ParserData.MlyValue.START_H6 i,p1,p2)) fun END_H6 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 57,( ParserData.MlyValue.VOID,p1,p2)) fun START_HEAD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 58,( ParserData.MlyValue.VOID,p1,p2)) fun END_HEAD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 59,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_HR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 60,( ParserData.MlyValue.TAG_HR i,p1,p2)) fun START_HTML (p1,p2) = Token.TOKEN (ParserData.LrTable.T 61,( ParserData.MlyValue.VOID,p1,p2)) fun END_HTML (p1,p2) = Token.TOKEN (ParserData.LrTable.T 62,( ParserData.MlyValue.VOID,p1,p2)) fun START_I (p1,p2) = Token.TOKEN (ParserData.LrTable.T 63,( ParserData.MlyValue.VOID,p1,p2)) fun END_I (p1,p2) = Token.TOKEN (ParserData.LrTable.T 64,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_IMG (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 65,( ParserData.MlyValue.TAG_IMG i,p1,p2)) fun TAG_INPUT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 66,( ParserData.MlyValue.TAG_INPUT i,p1,p2)) fun TAG_ISINDEX (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 67,( ParserData.MlyValue.TAG_ISINDEX i,p1,p2)) fun START_KBD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 68,( ParserData.MlyValue.VOID,p1,p2)) fun END_KBD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 69,( ParserData.MlyValue.VOID,p1,p2)) fun START_LI (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 70,( ParserData.MlyValue.START_LI i,p1,p2)) fun END_LI (p1,p2) = Token.TOKEN (ParserData.LrTable.T 71,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_LINK (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 72,( ParserData.MlyValue.TAG_LINK i,p1,p2)) fun START_MAP (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 73,( ParserData.MlyValue.START_MAP i,p1,p2)) fun END_MAP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 74,( ParserData.MlyValue.VOID,p1,p2)) fun START_MENU (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 75,( ParserData.MlyValue.START_MENU i,p1,p2)) fun END_MENU (p1,p2) = Token.TOKEN (ParserData.LrTable.T 76,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_META (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 77,( ParserData.MlyValue.TAG_META i,p1,p2)) fun START_OL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 78,( ParserData.MlyValue.START_OL i,p1,p2)) fun END_OL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 79,( ParserData.MlyValue.VOID,p1,p2)) fun START_OPTION (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 80,( ParserData.MlyValue.START_OPTION i,p1,p2)) fun END_OPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 81,( ParserData.MlyValue.VOID,p1,p2)) fun START_P (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 82,( ParserData.MlyValue.START_P i,p1,p2)) fun END_P (p1,p2) = Token.TOKEN (ParserData.LrTable.T 83,( ParserData.MlyValue.VOID,p1,p2)) fun TAG_PARAM (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 84,( ParserData.MlyValue.TAG_PARAM i,p1,p2)) fun START_PRE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 85,( ParserData.MlyValue.START_PRE i,p1,p2)) fun END_PRE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 86,( ParserData.MlyValue.VOID,p1,p2)) fun START_SAMP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 87,( ParserData.MlyValue.VOID,p1,p2)) fun END_SAMP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 88,( ParserData.MlyValue.VOID,p1,p2)) fun START_SCRIPT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 89,( ParserData.MlyValue.VOID,p1,p2)) fun END_SCRIPT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 90,( ParserData.MlyValue.VOID,p1,p2)) fun START_SELECT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 91,( ParserData.MlyValue.START_SELECT i,p1,p2)) fun END_SELECT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 92,( ParserData.MlyValue.VOID,p1,p2)) fun START_SMALL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 93,( ParserData.MlyValue.VOID,p1,p2)) fun END_SMALL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 94,( ParserData.MlyValue.VOID,p1,p2)) fun START_STRIKE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 95,( ParserData.MlyValue.VOID,p1,p2)) fun END_STRIKE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 96,( ParserData.MlyValue.VOID,p1,p2)) fun START_STRONG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 97,( ParserData.MlyValue.VOID,p1,p2)) fun END_STRONG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 98,( ParserData.MlyValue.VOID,p1,p2)) fun START_STYLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 99,( ParserData.MlyValue.VOID,p1,p2)) fun END_STYLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 100,( ParserData.MlyValue.VOID,p1,p2)) fun START_SUB (p1,p2) = Token.TOKEN (ParserData.LrTable.T 101,( ParserData.MlyValue.VOID,p1,p2)) fun END_SUB (p1,p2) = Token.TOKEN (ParserData.LrTable.T 102,( ParserData.MlyValue.VOID,p1,p2)) fun START_SUP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 103,( ParserData.MlyValue.VOID,p1,p2)) fun END_SUP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 104,( ParserData.MlyValue.VOID,p1,p2)) fun START_TABLE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 105,( ParserData.MlyValue.START_TABLE i,p1,p2)) fun END_TABLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 106,( ParserData.MlyValue.VOID,p1,p2)) fun START_TD (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 107,( ParserData.MlyValue.START_TD i,p1,p2)) fun END_TD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 108,( ParserData.MlyValue.VOID,p1,p2)) fun START_TEXTAREA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 109,( ParserData.MlyValue.START_TEXTAREA i,p1,p2)) fun END_TEXTAREA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 110,( ParserData.MlyValue.VOID,p1,p2)) fun START_TH (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 111,( ParserData.MlyValue.START_TH i,p1,p2)) fun END_TH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 112,( ParserData.MlyValue.VOID,p1,p2)) fun START_TITLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 113,( ParserData.MlyValue.VOID,p1,p2)) fun END_TITLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 114,( ParserData.MlyValue.VOID,p1,p2)) fun START_TR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 115,( ParserData.MlyValue.START_TR i,p1,p2)) fun END_TR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 116,( ParserData.MlyValue.VOID,p1,p2)) fun START_TT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 117,( ParserData.MlyValue.VOID,p1,p2)) fun END_TT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 118,( ParserData.MlyValue.VOID,p1,p2)) fun START_U (p1,p2) = Token.TOKEN (ParserData.LrTable.T 119,( ParserData.MlyValue.VOID,p1,p2)) fun END_U (p1,p2) = Token.TOKEN (ParserData.LrTable.T 120,( ParserData.MlyValue.VOID,p1,p2)) fun START_UL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 121,( ParserData.MlyValue.START_UL i,p1,p2)) fun END_UL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 122,( ParserData.MlyValue.VOID,p1,p2)) fun START_VAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 123,( ParserData.MlyValue.VOID,p1,p2)) fun END_VAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 124,( ParserData.MlyValue.VOID,p1,p2)) fun PCDATA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 125,( ParserData.MlyValue.PCDATA i,p1,p2)) fun CHAR_REF (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 126,( ParserData.MlyValue.CHAR_REF i,p1,p2)) fun ENTITY_REF (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 127,( ParserData.MlyValue.ENTITY_REF i,p1,p2)) end end �����������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-lex�������������������������������������������0000664�0000000�0000000�00000005460�14162643450�0022600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-lex * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1996 AT&T Research. * * A scanner for HTML. * * TODO: * Recognize the DOCTYPE element * <!DOCTYPE HTML PUBLIC "..."> * Clean-up the scanning of start tags (do we need Err?). * Whitespace in PRE elements should be preserved, but how? *) structure T = Tokens structure Elems = HTMLElementsFn ( structure Tokens = Tokens structure Err = Err structure HTMLAttrs = HTMLAttrs) type pos = int type svalue = T.svalue type arg = (((string * int * int) -> unit) * string option) type ('a, 'b) token = ('a, 'b) T.token type lexresult= (svalue, pos) token fun eof _ = Tokens.EOF(0, 0) (* a buffer for collecting a string piecewise *) val buffer = ref ([] : string list) fun addStr s = (buffer := s :: !buffer) fun getStr () = (String.concat(List.rev(! buffer)) before (buffer := [])) %% %s COM1 COM2 STAG; %header (functor HTMLLexFn ( structure Tokens : HTML_TOKENS structure Err : HTML_ERROR structure HTMLAttrs : HTML_ATTRS)); %arg (errorFn, file); %full %count alpha=[A-Za-z]; digit=[0-9]; namechar=[-A-Za-z0-9.]; tag=({alpha}{namechar}*); ws = [\ \t]; %% <INITIAL>"<"{tag} => (addStr yytext; YYBEGIN STAG; continue()); <STAG>">" => (addStr yytext; YYBEGIN INITIAL; case Elems.startTag file (getStr(), !yylineno, !yylineno) of NONE => continue() | (SOME tag) => tag (* end case *)); <STAG>\n => (addStr " "; continue()); <STAG>{ws}+ => (addStr yytext; continue()); <STAG>{namechar}+ => (addStr yytext; continue()); <STAG>"=" => (addStr yytext; continue()); <STAG>"\""[^\"\n]*"\"" => (addStr yytext; continue()); <STAG>"'"[^'\n]*"'" => (addStr yytext; continue()); <STAG>. => (addStr yytext; continue()); <INITIAL>"</"{tag}{ws}*">" => (case Elems.endTag file (yytext, !yylineno, !yylineno) of NONE => continue() | (SOME tag) => tag (* end case *)); <INITIAL>"<!--" => (YYBEGIN COM1; continue()); <COM1>"--" => (YYBEGIN COM2; continue()); <COM1>\n => (continue()); <COM1>. => (continue()); <COM2>"--" => (YYBEGIN COM1; continue()); <COM2>">" => (YYBEGIN INITIAL; continue()); <COM2>\n => (continue()); <COM2>{ws} => (continue()); <COM2>. => (errorFn("bad comment syntax", !yylineno, !yylineno+1); YYBEGIN INITIAL; continue()); <INITIAL>"&#"[A-Za-z]+";" => ( (** At some point, we should support &#SPACE; and &#TAB; **) continue()); <INITIAL>"&#"[0-9]+";" => (T.CHAR_REF(yytext, !yylineno, !yylineno)); <INITIAL>"&"{tag}";" => (T.ENTITY_REF(yytext, !yylineno, !yylineno)); <INITIAL>"\n" => (continue()); <INITIAL>{ws} => (continue()); <INITIAL>[^<]+ => (T.PCDATA(yytext, !yylineno, !yylineno)); <INITIAL>. => (errorFn(concat[ "bogus character #\"", Char.toString(String.sub(yytext, 0)), "\" in PCDATA\n" ], !yylineno, !yylineno+1); continue()); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-lex.sml���������������������������������������0000664�0000000�0000000�00000114302�14162643450�0023366�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������functor HTMLLexFn ( structure Tokens : HTML_TOKENS structure Err : HTML_ERROR structure HTMLAttrs : HTML_ATTRS) = struct structure yyInput : sig type stream val mkStream : (int -> string) -> stream val fromStream : TextIO.StreamIO.instream -> stream val getc : stream -> (Char.char * stream) option val getpos : stream -> int val getlineNo : stream -> int val subtract : stream * stream -> string val eof : stream -> bool val lastWasNL : stream -> bool end = struct structure TIO = TextIO structure TSIO = TIO.StreamIO structure TPIO = TextPrimIO datatype stream = Stream of { strm : TSIO.instream, id : int, (* track which streams originated * from the same stream *) pos : int, lineNo : int, lastWasNL : bool } local val next = ref 0 in fun nextId() = !next before (next := !next + 1) end val initPos = 2 (* ml-lex bug compatibility *) fun mkStream inputN = let val strm = TSIO.mkInstream (TPIO.RD { name = "lexgen", chunkSize = 4096, readVec = SOME inputN, readArr = NONE, readVecNB = NONE, readArrNB = NONE, block = NONE, canInput = NONE, avail = (fn () => NONE), getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = (fn () => ()), ioDesc = NONE }, "") in Stream {strm = strm, id = nextId(), pos = initPos, lineNo = 1, lastWasNL = true} end fun fromStream strm = Stream { strm = strm, id = nextId(), pos = initPos, lineNo = 1, lastWasNL = true } fun getc (Stream {strm, pos, id, lineNo, ...}) = (case TSIO.input1 strm of NONE => NONE | SOME (c, strm') => SOME (c, Stream { strm = strm', pos = pos+1, id = id, lineNo = lineNo + (if c = #"\n" then 1 else 0), lastWasNL = (c = #"\n") }) (* end case*)) fun getpos (Stream {pos, ...}) = pos fun getlineNo (Stream {lineNo, ...}) = lineNo fun subtract (new, old) = let val Stream {strm = strm, pos = oldPos, id = oldId, ...} = old val Stream {pos = newPos, id = newId, ...} = new val (diff, _) = if newId = oldId andalso newPos >= oldPos then TSIO.inputN (strm, newPos - oldPos) else raise Fail "BUG: yyInput: attempted to subtract incompatible streams" in diff end fun eof s = not (isSome (getc s)) fun lastWasNL (Stream {lastWasNL, ...}) = lastWasNL end datatype yystart_state = COM2 | COM1 | STAG | INITIAL structure UserDeclarations = struct (* html-lex * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1996 AT&T Research. * * A scanner for HTML. * * TODO: * Recognize the DOCTYPE element * <!DOCTYPE HTML PUBLIC "..."> * Clean-up the scanning of start tags (do we need Err?). * Whitespace in PRE elements should be preserved, but how? *) structure T = Tokens structure Elems = HTMLElementsFn ( structure Tokens = Tokens structure Err = Err structure HTMLAttrs = HTMLAttrs) type pos = int type svalue = T.svalue type arg = (((string * int * int) -> unit) * string option) type ('a, 'b) token = ('a, 'b) T.token type lexresult= (svalue, pos) token fun eof _ = Tokens.EOF(0, 0) (* a buffer for collecting a string piecewise *) val buffer = ref ([] : string list) fun addStr s = (buffer := s :: !buffer) fun getStr () = (String.concat(List.rev(! buffer)) before (buffer := [])) end datatype yymatch = yyNO_MATCH | yyMATCH of yyInput.stream * action * yymatch withtype action = yyInput.stream * yymatch -> UserDeclarations.lexresult local val yytable = Vector.fromList [] fun mk yyins = let (* current start state *) val yyss = ref INITIAL fun YYBEGIN ss = (yyss := ss) (* current input stream *) val yystrm = ref yyins (* get one char of input *) val yygetc = yyInput.getc (* create yytext *) fun yymktext(strm) = yyInput.subtract (strm, !yystrm) open UserDeclarations fun lex (yyarg as (errorFn, file)) () = let fun continue() = let val yylastwasn = yyInput.lastWasNL (!yystrm) fun yystuck (yyNO_MATCH) = raise Fail "stuck state" | yystuck (yyMATCH (strm, action, old)) = action (strm, old) val yypos = yyInput.getpos (!yystrm) val yygetlineNo = yyInput.getlineNo fun yyactsToMatches (strm, [], oldMatches) = oldMatches | yyactsToMatches (strm, act::acts, oldMatches) = yyMATCH (strm, act, yyactsToMatches (strm, acts, oldMatches)) fun yygo actTable = (fn (~1, _, oldMatches) => yystuck oldMatches | (curState, strm, oldMatches) => let val (transitions, finals') = Vector.sub (yytable, curState) val finals = List.map (fn i => Vector.sub (actTable, i)) finals' fun tryfinal() = yystuck (yyactsToMatches (strm, finals, oldMatches)) fun find (c, []) = NONE | find (c, (c1, c2, s)::ts) = if c1 <= c andalso c <= c2 then SOME s else find (c, ts) in case yygetc strm of SOME(c, strm') => (case find (c, transitions) of NONE => tryfinal() | SOME n => yygo actTable (n, strm', yyactsToMatches (strm, finals, oldMatches))) | NONE => tryfinal() end) in let fun yyAction0 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; YYBEGIN STAG; continue()) end fun yyAction1 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; YYBEGIN INITIAL; case Elems.startTag file (getStr(), !yylineno, !yylineno) of NONE => continue() | (SOME tag) => tag (* end case *)) end fun yyAction2 (strm, lastMatch : yymatch) = (yystrm := strm; (addStr " "; continue())) fun yyAction3 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction4 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction5 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction6 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction7 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction8 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; (addStr yytext; continue()) end fun yyAction9 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (case Elems.endTag file (yytext, !yylineno, !yylineno) of NONE => continue() | (SOME tag) => tag (* end case *)) end fun yyAction10 (strm, lastMatch : yymatch) = (yystrm := strm; (YYBEGIN COM1; continue())) fun yyAction11 (strm, lastMatch : yymatch) = (yystrm := strm; (YYBEGIN COM2; continue())) fun yyAction12 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction13 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction14 (strm, lastMatch : yymatch) = (yystrm := strm; (YYBEGIN COM1; continue())) fun yyAction15 (strm, lastMatch : yymatch) = (yystrm := strm; (YYBEGIN INITIAL; continue())) fun yyAction16 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction17 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction18 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) in yystrm := strm; (errorFn("bad comment syntax", !yylineno, !yylineno+1); YYBEGIN INITIAL; continue()) end fun yyAction19 (strm, lastMatch : yymatch) = (yystrm := strm; ( (** At some point, we should support &#SPACE; and &#TAB; **) continue())) fun yyAction20 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (T.CHAR_REF(yytext, !yylineno, !yylineno)) end fun yyAction21 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (T.ENTITY_REF(yytext, !yylineno, !yylineno)) end fun yyAction22 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction23 (strm, lastMatch : yymatch) = (yystrm := strm; (continue())) fun yyAction24 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (T.PCDATA(yytext, !yylineno, !yylineno)) end fun yyAction25 (strm, lastMatch : yymatch) = let val yylineno = ref(yygetlineNo(!(yystrm))) val yytext = yymktext(strm) in yystrm := strm; (errorFn(concat[ "bogus character #\"", Char.toString(String.sub(yytext, 0)), "\" in PCDATA\n" ], !yylineno, !yylineno+1); continue()) end fun yyQ35 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #":" then yyAction0(strm, yyNO_MATCH) else if inp < #":" then if inp = #"/" then yyAction0(strm, yyNO_MATCH) else if inp < #"/" then if inp <= #"," then yyAction0(strm, yyNO_MATCH) else yyQ35(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyQ35(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = #"[" then yyAction0(strm, yyNO_MATCH) else if inp < #"[" then if inp <= #"@" then yyAction0(strm, yyNO_MATCH) else yyQ35(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = #"a" then yyQ35(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < #"a" then yyAction0(strm, yyNO_MATCH) else if inp <= #"z" then yyQ35(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ38 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction9(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction9(strm, yyNO_MATCH) (* end case *)) fun yyQ37 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #" " then yyQ37(strm', lastMatch) else if inp < #" " then if inp = #"\t" then yyQ37(strm', lastMatch) else yystuck(lastMatch) else if inp = #">" then yyQ38(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ36 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"0" then yyQ36(strm', lastMatch) else if inp < #"0" then if inp = #" " then yyQ37(strm', lastMatch) else if inp < #" " then if inp = #"\t" then yyQ37(strm', lastMatch) else yystuck(lastMatch) else if inp = #"-" then yyQ36(strm', lastMatch) else if inp < #"-" then yystuck(lastMatch) else if inp = #"/" then yystuck(lastMatch) else yyQ36(strm', lastMatch) else if inp = #"A" then yyQ36(strm', lastMatch) else if inp < #"A" then if inp = #">" then yyQ38(strm', lastMatch) else if inp < #">" then if inp <= #"9" then yyQ36(strm', lastMatch) else yystuck(lastMatch) else yystuck(lastMatch) else if inp = #"a" then yyQ36(strm', lastMatch) else if inp < #"a" then if inp <= #"Z" then yyQ36(strm', lastMatch) else yystuck(lastMatch) else if inp <= #"z" then yyQ36(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ34 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"[" then yystuck(lastMatch) else if inp < #"[" then if inp <= #"@" then yystuck(lastMatch) else yyQ36(strm', lastMatch) else if inp = #"a" then yyQ36(strm', lastMatch) else if inp < #"a" then yystuck(lastMatch) else if inp <= #"z" then yyQ36(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ40 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction10(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction10(strm, yyNO_MATCH) (* end case *)) fun yyQ39 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"-" then yyQ40(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ33 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"-" then yyQ39(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ32 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction25(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"0" then yyAction25(strm, yyNO_MATCH) else if inp < #"0" then if inp = #"\"" then yyAction25(strm, yyNO_MATCH) else if inp < #"\"" then if inp = #"!" then yyQ33(strm', yyMATCH(strm, yyAction25, yyNO_MATCH)) else yyAction25(strm, yyNO_MATCH) else if inp = #"/" then yyQ34(strm', yyMATCH(strm, yyAction25, yyNO_MATCH)) else yyAction25(strm, yyNO_MATCH) else if inp = #"[" then yyAction25(strm, yyNO_MATCH) else if inp < #"[" then if inp <= #"@" then yyAction25(strm, yyNO_MATCH) else yyQ35(strm', yyMATCH(strm, yyAction25, yyNO_MATCH)) else if inp = #"a" then yyQ35(strm', yyMATCH(strm, yyAction25, yyNO_MATCH)) else if inp < #"a" then yyAction25(strm, yyNO_MATCH) else if inp <= #"z" then yyQ35(strm', yyMATCH(strm, yyAction25, yyNO_MATCH)) else yyAction25(strm, yyNO_MATCH) (* end case *)) fun yyQ41 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction24(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ44 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction21(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction21(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction21, yyNO_MATCH)) (* end case *)) fun yyQ43 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction24(strm, yyNO_MATCH) else if inp < #"<" then if inp = #"0" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"0" then if inp = #"-" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"-" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"/" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #":" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #";" then yyQ44(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"[" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"[" then if inp <= #"@" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"a" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"a" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp <= #"z" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ47 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction19(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction19(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction19, yyNO_MATCH)) (* end case *)) fun yyQ46 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"A" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"A" then if inp = #"<" then yyAction24(strm, yyNO_MATCH) else if inp < #"<" then if inp = #";" then yyQ47(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"a" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"a" then if inp <= #"Z" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp <= #"z" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ48 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction20(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction20(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction20, yyNO_MATCH)) (* end case *)) fun yyQ45 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #";" then yyQ48(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #";" then if inp = #"0" then yyQ45(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"0" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #":" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"<" then yyAction24(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ42 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"=" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"=" then if inp = #":" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #":" then if inp <= #"/" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"<" then yyAction24(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"[" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"[" then if inp <= #"@" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"a" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"a" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp <= #"z" then yyQ46(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ31 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"=" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"=" then if inp = #"$" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"$" then if inp = #"#" then yyQ42(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"<" then yyAction24(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"[" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"[" then if inp <= #"@" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp = #"a" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp < #"a" then yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else if inp <= #"z" then yyQ43(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ30 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction22(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction22(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction22, yyNO_MATCH)) (* end case *)) fun yyQ29 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction23(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction23(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction23, yyNO_MATCH)) (* end case *)) fun yyQ28 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"<" then yyAction24(strm, yyNO_MATCH) else yyQ41(strm', yyMATCH(strm, yyAction24, yyNO_MATCH)) (* end case *)) fun yyQ3 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if yyInput.eof(!(yystrm)) then UserDeclarations.eof(yyarg) else yystuck(lastMatch) | SOME(inp, strm') => if inp = #"!" then yyQ28(strm', lastMatch) else if inp < #"!" then if inp = #"\n" then yyQ30(strm', lastMatch) else if inp < #"\n" then if inp = #"\t" then yyQ29(strm', lastMatch) else yyQ28(strm', lastMatch) else if inp = #" " then yyQ29(strm', lastMatch) else yyQ28(strm', lastMatch) else if inp = #"'" then yyQ28(strm', lastMatch) else if inp < #"'" then if inp = #"&" then yyQ31(strm', lastMatch) else yyQ28(strm', lastMatch) else if inp = #"<" then yyQ32(strm', lastMatch) else yyQ28(strm', lastMatch) (* end case *)) fun yyQ21 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction1(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction1(strm, yyNO_MATCH) (* end case *)) fun yyQ20 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction5(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction5(strm, yyNO_MATCH) (* end case *)) fun yyQ22 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction4(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #":" then yyAction4(strm, yyNO_MATCH) else if inp < #":" then if inp = #"/" then yyAction4(strm, yyNO_MATCH) else if inp < #"/" then if inp <= #"," then yyAction4(strm, yyNO_MATCH) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp = #"[" then yyAction4(strm, yyNO_MATCH) else if inp < #"[" then if inp <= #"@" then yyAction4(strm, yyNO_MATCH) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp = #"a" then yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp < #"a" then yyAction4(strm, yyNO_MATCH) else if inp <= #"z" then yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else yyAction4(strm, yyNO_MATCH) (* end case *)) fun yyQ19 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction4(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #":" then yyAction4(strm, yyNO_MATCH) else if inp < #":" then if inp = #"/" then yyAction4(strm, yyNO_MATCH) else if inp < #"/" then if inp <= #"," then yyAction4(strm, yyNO_MATCH) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp = #"[" then yyAction4(strm, yyNO_MATCH) else if inp < #"[" then if inp <= #"@" then yyAction4(strm, yyNO_MATCH) else yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp = #"a" then yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else if inp < #"a" then yyAction4(strm, yyNO_MATCH) else if inp <= #"z" then yyQ22(strm', yyMATCH(strm, yyAction4, yyNO_MATCH)) else yyAction4(strm, yyNO_MATCH) (* end case *)) fun yyQ24 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction7(strm, yyNO_MATCH) (* end case *)) fun yyQ23 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"\v" then yyQ23(strm', lastMatch) else if inp < #"\v" then if inp = #"\n" then yystuck(lastMatch) else yyQ23(strm', lastMatch) else if inp = #"'" then yyQ24(strm', lastMatch) else yyQ23(strm', lastMatch) (* end case *)) fun yyQ18 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction8(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"\v" then yyQ23(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp < #"\v" then if inp = #"\n" then yyAction8(strm, yyNO_MATCH) else yyQ23(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp = #"'" then yyQ24(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else yyQ23(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) (* end case *)) fun yyQ26 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction6(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction6(strm, yyNO_MATCH) (* end case *)) fun yyQ25 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = #"\v" then yyQ25(strm', lastMatch) else if inp < #"\v" then if inp = #"\n" then yystuck(lastMatch) else yyQ25(strm', lastMatch) else if inp = #"\"" then yyQ26(strm', lastMatch) else yyQ25(strm', lastMatch) (* end case *)) fun yyQ17 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction8(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"\v" then yyQ25(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp < #"\v" then if inp = #"\n" then yyAction8(strm, yyNO_MATCH) else yyQ25(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp = #"\"" then yyQ26(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else yyQ25(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) (* end case *)) fun yyQ16 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ27 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction3(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"\n" then yyAction3(strm, yyNO_MATCH) else if inp < #"\n" then if inp = #"\t" then yyQ27(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) else if inp = #" " then yyQ27(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) (* end case *)) fun yyQ15 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction3(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"\n" then yyAction3(strm, yyNO_MATCH) else if inp < #"\n" then if inp = #"\t" then yyQ27(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) else if inp = #" " then yyQ27(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) (* end case *)) fun yyQ14 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction8(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction8(strm, yyNO_MATCH) (* end case *)) fun yyQ2 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if yyInput.eof(!(yystrm)) then UserDeclarations.eof(yyarg) else yystuck(lastMatch) | SOME(inp, strm') => if inp = #"-" then yyQ19(strm', lastMatch) else if inp < #"-" then if inp = #"!" then yyQ14(strm', lastMatch) else if inp < #"!" then if inp = #"\n" then yyQ16(strm', lastMatch) else if inp < #"\n" then if inp = #"\t" then yyQ15(strm', lastMatch) else yyQ14(strm', lastMatch) else if inp = #" " then yyQ15(strm', lastMatch) else yyQ14(strm', lastMatch) else if inp = #"'" then yyQ18(strm', lastMatch) else if inp < #"'" then if inp = #"\"" then yyQ17(strm', lastMatch) else yyQ14(strm', lastMatch) else yyQ14(strm', lastMatch) else if inp = #">" then yyQ21(strm', lastMatch) else if inp < #">" then if inp = #"0" then yyQ19(strm', lastMatch) else if inp < #"0" then if inp = #"/" then yyQ14(strm', lastMatch) else yyQ19(strm', lastMatch) else if inp = #":" then yyQ14(strm', lastMatch) else if inp < #":" then yyQ19(strm', lastMatch) else if inp = #"=" then yyQ20(strm', lastMatch) else yyQ14(strm', lastMatch) else if inp = #"[" then yyQ14(strm', lastMatch) else if inp < #"[" then if inp <= #"@" then yyQ14(strm', lastMatch) else yyQ19(strm', lastMatch) else if inp = #"a" then yyQ19(strm', lastMatch) else if inp < #"a" then yyQ14(strm', lastMatch) else if inp <= #"z" then yyQ19(strm', lastMatch) else yyQ14(strm', lastMatch) (* end case *)) fun yyQ13 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction11(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction11(strm, yyNO_MATCH) (* end case *)) fun yyQ12 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"-" then yyQ13(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ11 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction12(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction12(strm, yyNO_MATCH) (* end case *)) fun yyQ10 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ1 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if yyInput.eof(!(yystrm)) then UserDeclarations.eof(yyarg) else yystuck(lastMatch) | SOME(inp, strm') => if inp = #"\v" then yyQ10(strm', lastMatch) else if inp < #"\v" then if inp = #"\n" then yyQ11(strm', lastMatch) else yyQ10(strm', lastMatch) else if inp = #"-" then yyQ12(strm', lastMatch) else yyQ10(strm', lastMatch) (* end case *)) fun yyQ8 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction15(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction15(strm, yyNO_MATCH) (* end case *)) fun yyQ9 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction14(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction14(strm, yyNO_MATCH) (* end case *)) fun yyQ7 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction18(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = #"-" then yyQ9(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else yyAction18(strm, yyNO_MATCH) (* end case *)) fun yyQ6 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction16(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction16(strm, yyNO_MATCH) (* end case *)) fun yyQ5 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ4 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction18(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction18(strm, yyNO_MATCH) (* end case *)) fun yyQ0 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if yyInput.eof(!(yystrm)) then UserDeclarations.eof(yyarg) else yystuck(lastMatch) | SOME(inp, strm') => if inp = #"!" then yyQ4(strm', lastMatch) else if inp < #"!" then if inp = #"\n" then yyQ6(strm', lastMatch) else if inp < #"\n" then if inp = #"\t" then yyQ5(strm', lastMatch) else yyQ4(strm', lastMatch) else if inp = #" " then yyQ5(strm', lastMatch) else yyQ4(strm', lastMatch) else if inp = #"." then yyQ4(strm', lastMatch) else if inp < #"." then if inp = #"-" then yyQ7(strm', lastMatch) else yyQ4(strm', lastMatch) else if inp = #">" then yyQ8(strm', lastMatch) else yyQ4(strm', lastMatch) (* end case *)) in (case (!(yyss)) of COM2 => yyQ0(!(yystrm), yyNO_MATCH) | COM1 => yyQ1(!(yystrm), yyNO_MATCH) | STAG => yyQ2(!(yystrm), yyNO_MATCH) | INITIAL => yyQ3(!(yystrm), yyNO_MATCH) (* end case *)) end end in continue() handle IO.Io{cause, ...} => raise cause end in lex end in fun makeLexer yyinputN = mk (yyInput.mkStream yyinputN) end end ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-lib.cm����������������������������������������0000664�0000000�0000000�00000001421�14162643450�0023145�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-lib.cm * * COPYRIGHT (c) 1996 AT&T Research. * * Sources file for HTML parsing/pretty-printing library; part of the SML/NJ * Library suite. *) Library signature HTML_ERROR signature HTML structure HTML structure MakeHTML structure PrHTML structure HTMLDefaults functor HTMLParserFn is #if defined(NEW_CM) $/basis.cm $/smlnj-lib.cm $/ml-yacc-lib.cm #else ../Util/smlnj-lib.cm ml-yacc-lib.cm #endif #if defined(NO_PLUGINS) html-lex.sml html-gram.sig html-gram.sml #else html-lex : MLLex html-gram : MLYacc #endif html-error-sig.sml html-sig.sml html.sml html-attr-vals.sml html-attrs-sig.sml html-attrs-fn.sml html-elements-fn.sml html-parser-fn.sml check-html-fn.sml html-defaults.sml make-html.sml pr-html.sml �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-lib.mlb���������������������������������������0000664�0000000�0000000�00000030122�14162643450�0023320�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ann "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" "allowOrPats true" "allowVectorExpsAndPats true" in local basis l41 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb $(SML_LIB)/basis/unsafe.mlb end basis l8 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis l69 = bas (* $/ml-yacc-lib.cm ====> *) $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local html-error-sig.sml in signature gs_0 = HTML_ERROR end local open l8 in structure gs_1 = Format end local open l41 in structure gs_2 = Char structure gs_3 = CharArray structure gs_4 = CharVector structure gs_5 = FixedInt structure gs_6 = General structure gs_7 = Int structure gs_8 = Int32 structure gs_9 = Int64 structure gs_10 = IntInf structure gs_11 = LargeInt structure gs_12 = LargeReal structure gs_13 = LargeWord structure gs_14 = OS structure gs_15 = Position structure gs_16 = Real structure gs_17 = Real64 structure gs_18 = RealArray structure gs_19 = RealArraySlice structure gs_20 = RealVector structure gs_21 = RealVectorSlice structure gs_22 = SMLofNJ structure gs_23 = Socket structure gs_24 = String structure gs_25 = Substring structure gs_26 = SysWord structure gs_27 = Time structure gs_28 = Word structure gs_29 = Word32 structure gs_30 = Word64 structure gs_31 = Word8 end local open l41 in structure gs_32 = List end local open l8 in structure gs_33 = ListFormat end local html-sig.sml in signature gs_34 = HTML end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 signature HTML = gs_34 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 html.sml in structure gs_35 = HTML end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure Format = gs_1 structure General = gs_6 structure HTML = gs_35 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure ListFormat = gs_33 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 pr-html.sml in structure gs_36 = PrHTML end local structure HTML = gs_35 make-html.sml in structure gs_37 = MakeHTML end local structure HTML = gs_35 html-defaults.sml in structure gs_38 = HTMLDefaults end local open l69 in functor gs_39 = Join functor gs_40 = JoinWithArg end local open l69 in structure gs_41 = LrParser end local open l41 in structure gs_42 = TextIO end local structure Format = gs_1 structure HTML = gs_35 signature HTML_ERROR = gs_0 structure List = gs_32 check-html-fn.sml in functor gs_43 = CheckHTMLFn end local open l41 in structure gs_44 = IO end local open l41 in structure gs_45 = TextPrimIO end local open l41 in structure gs_46 = Vector end local open l8 in functor gs_47 = HashTableFn end local open l8 in structure gs_48 = HashString end local html-attr-vals.sml in structure gs_49 = HTMLAttrVals end local structure HTML = gs_35 structure HTMLAttrVals = gs_49 html-attrs-sig.sml in signature gs_50 = HTML_ATTRS end local open l69 in signature gs_51 = ARG_LEXER signature gs_52 = ARG_PARSER signature gs_53 = LEXER signature gs_54 = LR_PARSER signature gs_55 = LR_TABLE signature gs_56 = PARSER signature gs_57 = PARSER_DATA signature gs_58 = STREAM signature gs_59 = TOKEN end local signature ARG_LEXER = gs_51 signature ARG_PARSER = gs_52 structure HTMLAttrVals = gs_49 signature LEXER = gs_53 signature LR_PARSER = gs_54 signature LR_TABLE = gs_55 signature PARSER = gs_56 signature PARSER_DATA = gs_57 signature STREAM = gs_58 signature TOKEN = gs_59 html-gram.sig in signature gs_60 = HTML_LRVALS signature gs_61 = HTML_TOKENS end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 signature HTML_ATTRS = gs_50 signature HTML_ERROR = gs_0 signature HTML_LRVALS = gs_60 signature HTML_TOKENS = gs_61 structure HashString = gs_48 functor HashTableFn = gs_47 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 html-elements-fn.sml in functor gs_62 = HTMLElementsFn end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 functor HTMLElementsFn = gs_62 signature HTML_ATTRS = gs_50 signature HTML_ERROR = gs_0 signature HTML_LRVALS = gs_60 signature HTML_TOKENS = gs_61 structure IO = gs_44 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure TextIO = gs_42 structure TextPrimIO = gs_45 structure Time = gs_27 structure Vector = gs_46 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 html-lex.sml in functor gs_63 = HTMLLexFn end local open l41 in structure gs_64 = Array end local signature ARG_LEXER = gs_51 signature ARG_PARSER = gs_52 structure Array = gs_64 structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure HTML = gs_35 structure HTMLAttrVals = gs_49 signature HTML_ATTRS = gs_50 signature HTML_LRVALS = gs_60 signature HTML_TOKENS = gs_61 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 signature LEXER = gs_53 signature LR_PARSER = gs_54 signature LR_TABLE = gs_55 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 signature PARSER = gs_56 signature PARSER_DATA = gs_57 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 signature STREAM = gs_58 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 signature TOKEN = gs_59 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 html-gram.sml in functor gs_65 = HTMLLrValsFn end local structure Array = gs_64 structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure HTML = gs_35 structure HTMLAttrVals = gs_49 signature HTML_ATTRS = gs_50 signature HTML_ERROR = gs_0 structure HashString = gs_48 functor HashTableFn = gs_47 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 html-attrs-fn.sml in functor gs_66 = HTMLAttrsFn end local functor CheckHTMLFn = gs_43 structure HTML = gs_35 functor HTMLAttrsFn = gs_66 functor HTMLLexFn = gs_63 functor HTMLLrValsFn = gs_65 signature HTML_ERROR = gs_0 functor Join = gs_39 functor JoinWithArg = gs_40 structure LrParser = gs_41 structure TextIO = gs_42 html-parser-fn.sml in functor gs_67 = HTMLParserFn end in signature HTML = gs_34 structure HTML = gs_35 structure HTMLDefaults = gs_38 functor HTMLParserFn = gs_67 signature HTML_ERROR = gs_0 structure MakeHTML = gs_37 structure PrHTML = gs_36 end end end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-parser-fn.sml���������������������������������0000664�0000000�0000000�00000002560�14162643450�0024475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-parser-fn.sml * * COPYRIGHT (c) 1996 AT&T REsearch. * * This glues the lexer and parser together. *) functor HTMLParserFn (Err : HTML_ERROR) : sig val parseFile : string -> HTML.html end = struct structure TIO = TextIO structure HTMLAttrs = HTMLAttrsFn(Err) structure HTMLLrVals = HTMLLrValsFn( structure Token = LrParser.Token structure HTMLAttrs = HTMLAttrs) structure Lex = HTMLLexFn( structure Err = Err structure Tokens = HTMLLrVals.Tokens structure HTMLAttrs = HTMLAttrs) structure Parser = JoinWithArg( structure Lex= Lex structure LrParser = LrParser structure ParserData = HTMLLrVals.ParserData) structure CheckHTML = CheckHTMLFn(Err) fun parseFile fname = let (* build a context to hand to the HTMLAttrs build functions. *) fun ctx lnum = {file = SOME fname, line=lnum} fun lexError (msg, lnum, _) = Err.lexError {file = SOME fname, line = lnum} msg fun syntaxError (msg, lnum, _) = Err.syntaxError {file = SOME fname, line = lnum} msg val inStrm = TIO.openIn fname fun close () = TIO.closeIn inStrm val lexer = Parser.makeLexer (fn n => TIO.inputN(inStrm, n)) (lexError, SOME fname) val (result, _) = Parser.parse ( 15, (* lookahead *) lexer, syntaxError, ctx) in CheckHTML.check (ctx 0) result handle ex => (close(); raise ex) close(); result end end; ������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html-sig.sml���������������������������������������0000664�0000000�0000000�00000017714�14162643450�0023371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1996 AT&T Research. * * This file defines the abstract syntax of HTML documents. The * AST follows the HTML 3.2 Proposed Standard. *) signature HTML = sig val htmlVersion : string (* = "3.2" *) (* the HTML data representations (these are all string) *) type pcdata = string type cdata = string type url = string type pixels = cdata type name = string type id = string (* the different types of HTTP methods *) structure HttpMethod : sig eqtype method val get : method val put : method val toString : method -> string val fromString : string -> method option end (* the different types of INPUT elements *) structure InputType : sig eqtype ty val text : ty val password : ty val checkbox : ty val radio : ty val submit : ty val reset : ty val file : ty val hidden : ty val image : ty val toString : ty -> string val fromString : string -> ty option end (* alignment attributes for IMG, APPLET and INPUT elements *) structure IAlign : sig eqtype align val top : align val middle : align val bottom : align val left : align val right : align val toString : align -> string val fromString : string -> align option end structure HAlign : sig eqtype align val left : align val center : align val right : align val toString : align -> string val fromString : string -> align option end structure CellVAlign : sig eqtype align val top : align val middle : align val bottom : align val baseline : align val toString : align -> string val fromString : string -> align option end structure CaptionAlign : sig eqtype align val top : align val bottom : align val toString : align -> string val fromString : string -> align option end structure ULStyle : sig eqtype style val disc : style val square : style val circle : style val toString : style -> string val fromString : string -> style option end structure Shape : sig eqtype shape val rect : shape val circle : shape val poly : shape val default : shape val toString : shape -> string val fromString : string -> shape option end structure TextFlowCtl : sig eqtype control val left : control val right : control val all : control val none : control val toString : control -> string val fromString : string -> control option end datatype html = HTML of { version : cdata option, head : head_content list, body : body } and head_content = Head_TITLE of pcdata | Head_ISINDEX of {prompt : cdata option} | Head_BASE of {href : url} | Head_META of { httpEquiv : name option, name : name option, content : cdata } | Head_LINK of { id : id option, href : url option, rel : cdata option, rev : cdata option, title : cdata option } (* SCRIPT/STYLE elements are placeholders for the next version of HTML *) | Head_SCRIPT of pcdata | Head_STYLE of pcdata and body = BODY of { background : url option, bgcolor : cdata option, text : cdata option, link : cdata option, vlink : cdata option, alink : cdata option, content : block } and block = BlockList of block list | TextBlock of text | Hn of { n : int, align : HAlign.align option, content : text } (* NOTE: the content of an ADDRESS element is really (text | P)* *) | ADDRESS of block | P of { align : HAlign.align option, content : text } | UL of { ty : ULStyle.style option, compact : bool, content : list_item list } | OL of { ty : cdata option, start : int option, compact : bool, content : list_item list } | DIR of { compact : bool, content : list_item list } | MENU of { compact : bool, content : list_item list } | DL of { compact : bool, content : {dt : text list, dd : block} list } | PRE of { width : int option, content : text } | DIV of { align : HAlign.align, content : block } | CENTER of block | BLOCKQUOTE of block | FORM of { action : url option, method : HttpMethod.method, enctype : cdata option, content : block (* -(FORM) *) } | ISINDEX of {prompt : cdata option} | HR of { align : HAlign.align option, noshade : bool, size : pixels option, width : cdata option } | TABLE of { align : HAlign.align option, width : cdata option, border : pixels option, cellspacing : pixels option, cellpadding : pixels option, caption : caption option, content : tr list } and list_item = LI of { ty : cdata option, value : int option, content : block } (** table content **) and caption = CAPTION of { align : CaptionAlign.align option, content : text } and tr = TR of { align : HAlign.align option, valign : CellVAlign.align option, content : table_cell list } and table_cell = TH of { nowrap : bool, rowspan : int option, colspan : int option, align : HAlign.align option, valign : CellVAlign.align option, width : pixels option, height : pixels option, content : block } | TD of { nowrap : bool, rowspan : int option, colspan : int option, align : HAlign.align option, valign : CellVAlign.align option, width : pixels option, height : pixels option, content : block } (** Text **) and text = TextList of text list | PCDATA of pcdata | TT of text | I of text | B of text | U of text | STRIKE of text | BIG of text | SMALL of text | SUB of text | SUP of text | EM of text | STRONG of text | DFN of text | CODE of text | SAMP of text | KBD of text | VAR of text | CITE of text | A of { name : cdata option, href : url option, rel : cdata option, rev : cdata option, title : cdata option, content : text (* -(A) *) } | IMG of { src : url, alt : cdata option, align : IAlign.align option, height : pixels option, width : pixels option, border : pixels option, hspace : pixels option, vspace : pixels option, usemap : url option, ismap : bool } | APPLET of { codebase : url option, code : cdata, name : cdata option, alt : cdata option, align : IAlign.align option, height : pixels option, width : pixels option, hspace : pixels option, vspace : pixels option, content : text } | PARAM of { (* applet parameter *) name : name, value : cdata option } | FONT of { size : cdata option, color : cdata option, content : text } | BASEFONT of { size : cdata option, content : text } | BR of { clear : TextFlowCtl.control option } | MAP of { name : cdata option, content : area list } | INPUT of { ty : InputType.ty option, name : cdata option, value : cdata option, checked : bool, size : cdata option, maxlength : int option, src : url option, align : IAlign.align option } | SELECT of { name : cdata, size : int option, content : select_option list } | TEXTAREA of { name : cdata, rows : int, cols : int, content : pcdata } (* SCRIPT elements are placeholders for the next version of HTML *) | SCRIPT of pcdata (* map areas *) and area = AREA of { shape : Shape.shape option, coords : cdata option, href : url option, nohref : bool, alt : cdata } (* SELECT options *) and select_option = OPTION of { selected : bool, value : cdata option, content : pcdata } end (* signature HTML *) ����������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/html.sml�������������������������������������������0000664�0000000�0000000�00000021044�14162643450�0022600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1996 AT&T Research. * * This file defines the abstract syntax of HTML documents. The * AST follows the HTML 3.2 Proposed Standard. *) structure HTML : HTML = struct val htmlVersion = "3.2 Final" type pcdata = string type cdata = string type url = string type pixels = cdata type name = string type id = string fun match sl s = let val cmp = String.collate (fn (c1, c2) => Char.compare(Char.toUpper c1, c2)) fun eq (ref s') = (cmp(s, s') = General.EQUAL) in List.find eq sl end (* the different types of HTTP methods *) structure HttpMethod = struct type method = string ref val get = ref "GET" val put = ref "PUT" fun toString (ref s) = s val fromString = match [get, put] end (* the different types of INPUT elements *) structure InputType = struct type ty = string ref val text = ref "TEXT" val password = ref "PASSWORD" val checkbox = ref "CHECKBOX" val radio = ref "RADIO" val submit = ref "SUBMIT" val reset = ref "RESET" val file = ref "FILE" val hidden = ref "HIDDEN" val image = ref "IMAGE" fun toString (ref s) = s val fromString = match [ text, password, checkbox, radio, submit, reset, file, hidden, image ] end (* alignment attributes for IMG, APPLET and INPUT elements *) structure IAlign = struct type align = string ref val top = ref "TOP" val middle = ref "MIDDLE" val bottom = ref "BOTTOM" val left = ref "LEFT" val right = ref "RIGHT" fun toString (ref s) = s val fromString = match [top, middle, bottom, left, right] end structure HAlign = struct type align = string ref val left = ref "LEFT" val center = ref "CENTER" val right = ref "RIGHT" fun toString (ref s) = s val fromString = match [left, center, right] end structure CellVAlign = struct type align = string ref val top = ref "TOP" val middle = ref "MIDDLE" val bottom = ref "BOTTOM" val baseline = ref "BASELINE" fun toString (ref s) = s val fromString = match [top, middle, bottom, baseline] end structure CaptionAlign = struct type align = string ref val top = ref "TOP" val bottom = ref "BOTTOM" val left = ref "LEFT" val right = ref "RIGHT" fun toString (ref s) = s val fromString = match [top, bottom, left, right] end structure ULStyle = struct type style = string ref val disc = ref "DISC" val square = ref "SQUARE" val circle = ref "CIRCLE" fun toString (ref s) = s val fromString = match [disc, square, circle] end structure Shape = struct type shape = string ref val rect = ref "RECT" val circle = ref "CIRCLE" val poly = ref "POLY" val default = ref "DEFAULT" fun toString (ref s) = s val fromString = match [rect, circle, poly, default] end structure TextFlowCtl = struct type control = string ref val left = ref "LEFT" val right = ref "RIGHT" val all = ref "ALL" val none = ref "NONE" fun toString (ref s) = s val fromString = match [left, right, all, none] end datatype html = HTML of { version : cdata option, head : head_content list, body : body } and head_content = Head_TITLE of pcdata | Head_ISINDEX of {prompt : cdata option} | Head_BASE of {href : url} | Head_META of { httpEquiv : name option, name : name option, content : cdata } | Head_LINK of { id : id option, href : url option, rel : cdata option, rev : cdata option, title : cdata option } (* SCRIPT/STYLE elements are placeholders for the next version of HTML *) | Head_SCRIPT of pcdata | Head_STYLE of pcdata and body = BODY of { background : url option, bgcolor : cdata option, text : cdata option, link : cdata option, vlink : cdata option, alink : cdata option, content : block } and block = BlockList of block list | TextBlock of text | Hn of { n : int, align : HAlign.align option, content : text } | ADDRESS of block | P of { align : HAlign.align option, content : text } | UL of { ty : ULStyle.style option, compact : bool, content : list_item list } | OL of { ty : cdata option, start : int option, compact : bool, content : list_item list } | DIR of { compact : bool, content : list_item list } | MENU of { compact : bool, content : list_item list } | DL of { compact : bool, content : {dt : text list, dd : block} list } | PRE of { width : int option, content : text } | DIV of { align : HAlign.align, content : block } | CENTER of block | BLOCKQUOTE of block | FORM of { action : url option, method : HttpMethod.method, enctype : cdata option, content : block (* -(FORM) *) } | ISINDEX of {prompt : cdata option} | HR of { align : HAlign.align option, noshade : bool, size : pixels option, width : cdata option } | TABLE of { align : HAlign.align option, width : cdata option, border : pixels option, cellspacing : pixels option, cellpadding : pixels option, caption : caption option, content : tr list } and list_item = LI of { ty : cdata option, value : int option, content : block } (** table content **) and caption = CAPTION of { align : CaptionAlign.align option, content : text } and tr = TR of { align : HAlign.align option, valign : CellVAlign.align option, content : table_cell list } and table_cell = TH of { nowrap : bool, rowspan : int option, colspan : int option, align : HAlign.align option, valign : CellVAlign.align option, width : pixels option, height : pixels option, content : block } | TD of { nowrap : bool, rowspan : int option, colspan : int option, align : HAlign.align option, valign : CellVAlign.align option, width : pixels option, height : pixels option, content : block } (** Text **) and text = TextList of text list | PCDATA of pcdata | TT of text | I of text | B of text | U of text | STRIKE of text | BIG of text | SMALL of text | SUB of text | SUP of text | EM of text | STRONG of text | DFN of text | CODE of text | SAMP of text | KBD of text | VAR of text | CITE of text | A of { name : cdata option, href : url option, rel : cdata option, rev : cdata option, title : cdata option, content : text (* -(A) *) } | IMG of { src : url, alt : cdata option, align : IAlign.align option, height : pixels option, width : pixels option, border : pixels option, hspace : pixels option, vspace : pixels option, usemap : url option, ismap : bool } | APPLET of { codebase : url option, code : cdata, name : cdata option, alt : cdata option, align : IAlign.align option, height : pixels option, width : pixels option, hspace : pixels option, vspace : pixels option, content : text } | PARAM of { (* applet parameter *) name : name, value : cdata option } | FONT of { size : cdata option, color : cdata option, content : text } | BASEFONT of { size : cdata option, content : text } | BR of { clear : TextFlowCtl.control option } | MAP of { name : cdata option, content : area list } | INPUT of { ty : InputType.ty option, name : cdata option, value : cdata option, checked : bool, size : cdata option, maxlength : int option, src : url option, align : IAlign.align option } | SELECT of { name : cdata, size : int option, content : select_option list } | TEXTAREA of { name : cdata, rows : int, cols : int, content : pcdata } (* SCRIPT elements are placeholders for the next version of HTML *) | SCRIPT of pcdata (* map areas *) and area = AREA of { shape : Shape.shape option, coords : cdata option, href : url option, nohref : bool, alt : cdata } (* SELECT options *) and select_option = OPTION of { selected : bool, value : cdata option, content : pcdata } end (* signature HTML *) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/make-html.sml��������������������������������������0000664�0000000�0000000�00000005750�14162643450�0023521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* make-html.sml * * COPYRIGHT (c) 1996 AT&T Research. * * This is a collection of constructors for building some of the common * kinds of HTML elements. *) structure MakeHTML : sig val blockList : HTML.block list -> HTML.block val textList : HTML.text list -> HTML.text val mkH : (int * HTML.pcdata) -> HTML.block val mkP : HTML.text -> HTML.block val mkUL : HTML.list_item list -> HTML.block val mkOL : HTML.list_item list -> HTML.block val mkDL : {dt : HTML.text list, dd : HTML.block} list -> HTML.block val HR : HTML.block val BR : HTML.text val mkLI : HTML.block -> HTML.list_item val mkA_HREF : {href : HTML.url, content : HTML.text} -> HTML.text val mkA_NAME : {name : HTML.cdata, content : HTML.text} -> HTML.text val mkTR : HTML.table_cell list -> HTML.tr val mkTH : HTML.block -> HTML.table_cell val mkTH_COLSPAN : {colspan : int, content : HTML.block} -> HTML.table_cell val mkTD : HTML.block -> HTML.table_cell val mkTD_COLSPAN : {colspan : int, content : HTML.block} -> HTML.table_cell end = struct fun blockList [b] = b | blockList bl = HTML.BlockList bl fun textList [t] = t | textList tl = HTML.TextList tl fun mkH (n, hdr) = HTML.Hn{n = n, align=NONE, content=HTML.PCDATA hdr} fun mkP content = HTML.P{align=NONE, content=content} fun mkUL items = HTML.UL{compact=false, ty=NONE, content=items} fun mkOL items = HTML.OL{compact=false, ty=NONE, start = NONE, content=items} fun mkDL items = HTML.DL{compact=false, content=items} val HR = HTML.HR{align=NONE, noshade=false, size=NONE, width=NONE} val BR = HTML.BR{clear = NONE} fun mkLI blk = HTML.LI{ty=NONE, value=NONE, content=blk} fun mkA_HREF {href, content} = HTML.A{ href = SOME href, title = NONE, name = NONE, rel = NONE, rev = NONE, content = content } fun mkA_NAME {name, content} = HTML.A{ href = NONE, title = NONE, name = SOME name, rel = NONE, rev = NONE, content = content } fun mkTR content = HTML.TR{ align = NONE, valign = NONE, content = content } fun mkTH content = HTML.TH{ nowrap = false, rowspan = NONE, colspan = NONE, align = NONE, valign = NONE, width = NONE, height = NONE, content = content } fun mkTH_COLSPAN {colspan, content} = HTML.TH{ nowrap = false, rowspan = NONE, colspan = SOME colspan, align = NONE, valign = NONE, width = NONE, height = NONE, content = content } fun mkTD content = HTML.TD{ nowrap = false, rowspan = NONE, colspan = NONE, align = NONE, valign = NONE, width = NONE, height = NONE, content = content } fun mkTD_COLSPAN {colspan, content} = HTML.TD{ nowrap = false, rowspan = NONE, colspan = SOME colspan, align = NONE, valign = NONE, width = NONE, height = NONE, content = content } end; ������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/pr-html.sml����������������������������������������0000664�0000000�0000000�00000032761�14162643450�0023227�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* pr-html.sml * * COPYRIGHT (c) 1996 AT&T REsearch. * * Pretty-print an HTML tree. *) structure PrHTML : sig val prHTML : { putc : char -> unit, puts : string -> unit } -> HTML.html -> unit end = struct structure H = HTML structure F = Format datatype outstream = OS of { putc : char -> unit, puts : string -> unit } fun putc (OS{putc, ...}, c) = putc c fun puts (OS{puts, ...}, s) = puts s datatype attr_data = IMPLICIT of bool | CDATA of string option | NAME of string option | NUMBER of int option local fun name toString NONE = NAME NONE | name toString (SOME x) = NAME(SOME(toString x)) in val httpMethod = name HTML.HttpMethod.toString val inputType = name HTML.InputType.toString val iAlign = name HTML.IAlign.toString val hAlign = name HTML.HAlign.toString val cellVAlign = name HTML.CellVAlign.toString val captionAlign = name HTML.CaptionAlign.toString val ulStyle = name HTML.ULStyle.toString val shape = name HTML.Shape.toString val textFlowCtl = name HTML.TextFlowCtl.toString end (* local *) fun fmtTag (tag, []) = concat["<", tag, ">"] | fmtTag (tag, attrs) = let fun fmtAttr (attrName, IMPLICIT true) = SOME attrName | fmtAttr (attrName, CDATA(SOME s)) = SOME(F.format "%s=\"%s\"" [F.STR attrName, F.STR s]) | fmtAttr (attrName, NAME(SOME s)) = SOME(F.format "%s=%s" [F.STR attrName, F.STR s]) | fmtAttr (attrName, NUMBER(SOME n)) = SOME(F.format "%s=%d" [F.STR attrName, F.INT n]) | fmtAttr _ = NONE val attrs = List.mapPartial fmtAttr attrs in ListFormat.fmt { init = "<", sep = " ", final = ">", fmt = fn x => x } (tag :: attrs) end fun fmtEndTag tag = concat["</", tag, ">"] fun prTag (OS{puts, ...}, tag, attrs) = puts(fmtTag (tag, attrs)) fun prEndTag (OS{puts, ...}, tag) = puts(fmtEndTag tag) fun newLine (OS{putc, ...}) = putc #"\n" fun space (OS{putc, ...}) = putc #" " (** NOTE: once we are doing linebreaks for text, this becomes ** important. **) fun setPre (_, _) = () fun prBlock (strm, blk : HTML.block) = (case blk of (HTML.BlockList bl) => List.app (fn b => prBlock (strm, b)) bl | (HTML.TextBlock txt) => (prText (strm, txt); newLine strm) | (HTML.Hn{n, align, content}) => let val tag = "H" ^ Int.toString n in prTag (strm, tag, [("align", hAlign align)]); prText (strm, content); prEndTag (strm, tag); newLine strm end | (HTML.ADDRESS blk) => ( prTag (strm, "ADDRESS", []); newLine strm; prBlock (strm, blk); prEndTag (strm, "ADDRESS"); newLine strm) | (HTML.P{align, content}) => ( prTag (strm, "P", [("ALIGN", hAlign align)]); newLine strm; prText (strm, content); newLine strm) | (HTML.UL{ty, compact, content}) => ( prTag (strm, "UL", [ ("TYPE", ulStyle ty), ("COMPACT", IMPLICIT compact) ]); newLine strm; prListItems (strm, content); prEndTag (strm, "UL"); newLine strm) | (HTML.OL{ty, start, compact, content}) => ( prTag (strm, "OL", [ ("TYPE", CDATA ty), ("START", NUMBER start), ("COMPACT", IMPLICIT compact) ]); newLine strm; prListItems (strm, content); prEndTag (strm, "OL"); newLine strm) | (HTML.DIR{compact, content}) => ( prTag (strm, "DIR", [("COMPACT", IMPLICIT compact)]); newLine strm; prListItems (strm, content); prEndTag (strm, "DIR"); newLine strm) | (HTML.MENU{compact, content}) => ( prTag (strm, "MENU", [("COMPACT", IMPLICIT compact)]); newLine strm; prListItems (strm, content); prEndTag (strm, "MENU"); newLine strm) | (HTML.DL{compact, content}) => ( prTag (strm, "DL", [("COMPACT", IMPLICIT compact)]); newLine strm; prDLItems (strm, content); prEndTag (strm, "DL"); newLine strm) | (HTML.PRE{width, content}) => ( prTag (strm, "PRE", [("WIDTH", NUMBER width)]); newLine strm; setPre (strm, true); prText (strm, content); setPre (strm, false); newLine strm; prEndTag (strm, "PRE"); newLine strm) | (HTML.DIV{align, content}) => ( prTag (strm, "DIV", [("ALIGN", hAlign(SOME align))]); newLine strm; prBlock (strm, content); prEndTag (strm, "DIV"); newLine strm) | (HTML.CENTER bl) => ( prTag (strm, "CENTER", []); newLine strm; prBlock (strm, bl); prEndTag (strm, "CENTER"); newLine strm) | (HTML.BLOCKQUOTE bl) => ( prTag (strm, "BLOCKQUOTE", []); newLine strm; prBlock (strm, bl); prEndTag (strm, "BLOCKQUOTE"); newLine strm) | (HTML.FORM{action, method, enctype, content}) => ( prTag (strm, "FORM", [ ("ACTION", CDATA action), ("METHOD", httpMethod(SOME method)), ("ENCTYPE", CDATA enctype) ]); newLine strm; prBlock (strm, content); prEndTag (strm, "FORM"); newLine strm) | (HTML.ISINDEX{prompt}) => ( prTag (strm, "ISINDEX", [("PROMPT", CDATA prompt)]); newLine strm) | (HTML.HR{align, noshade, size, width}) => ( prTag (strm, "HR", [ ("ALIGN", hAlign align), ("NOSHADE", IMPLICIT noshade), ("SIZE", CDATA size), ("WIDTH", CDATA width) ]); newLine strm) | (HTML.TABLE{ align, width, border, cellspacing, cellpadding, caption, content }) => ( prTag (strm, "TABLE", [ ("ALIGN", hAlign align), ("WIDTH", CDATA width), ("BORDER", CDATA border), ("CELLSPACING", CDATA cellspacing), ("CELLPADDING", CDATA cellpadding) ]); newLine strm; prCaption (strm, caption); prTableRows (strm, content); prEndTag (strm, "TABLE"); newLine strm) (* end case *)) and prListItems (strm, items) = let fun prItem (HTML.LI{ty, value, content}) = ( prTag (strm, "LI", [("TYPE", CDATA ty), ("VALUE", NUMBER value)]); newLine strm; prBlock (strm, content)) in List.app prItem items end and prDLItems (strm, items) = let fun prDT txt = ( prTag (strm, "DT", []); space strm; prText (strm, txt); newLine strm) fun prDD blk = ( prTag (strm, "DD", []); newLine strm; prBlock (strm, blk)) fun prItem ({dt, dd}) = (List.app prDT dt; prDD dd) in List.app prItem items end and prCaption (strm, NONE) = () | prCaption (strm, SOME(HTML.CAPTION{align, content})) = ( prTag (strm, "CAPTION", [("ALIGN", captionAlign align)]); newLine strm; prText (strm, content); prEndTag (strm, "CAPTION"); newLine strm) and prTableRows (strm, rows) = let fun prTR (HTML.TR{align, valign, content}) = ( prTag (strm, "TR", [ ("ALIGN", hAlign align), ("VALIGN", cellVAlign valign) ]); newLine strm; List.app (prTableCell strm) content) in List.app prTR rows end and prTableCell strm cell = let fun prCell (tag, { nowrap, rowspan, colspan , align, valign, width, height, content }) = ( prTag (strm, tag, [ ("NOWRAP", IMPLICIT nowrap), ("ROWSPAN", NUMBER rowspan), ("COLSPAN", NUMBER colspan), ("ALIGN", hAlign align), ("VALIGN", cellVAlign valign), ("WIDTH", CDATA width), ("HEIGHT", CDATA height) ]); newLine strm; prBlock (strm, content)) in case cell of (HTML.TH stuff) => prCell ("TH", stuff) | (HTML.TD stuff) => prCell ("TD", stuff) (* end case *) end and prEmph (strm, tag, text) = ( prTag (strm, tag, []); prText (strm, text); prEndTag (strm, tag)) and prText (strm, text) = (case text of (HTML.TextList tl) => List.app (fn txt => prText(strm, txt)) tl | (HTML.PCDATA pcdata) => prPCData(strm, pcdata) | (HTML.TT txt) => prEmph (strm, "TT", txt) | (HTML.I txt) => prEmph (strm, "I", txt) | (HTML.B txt) => prEmph (strm, "B", txt) | (HTML.U txt) => prEmph (strm, "U", txt) | (HTML.STRIKE txt) => prEmph (strm, "STRIKE", txt) | (HTML.BIG txt) => prEmph (strm, "BIG", txt) | (HTML.SMALL txt) => prEmph (strm, "SMALL", txt) | (HTML.SUB txt) => prEmph (strm, "SUB", txt) | (HTML.SUP txt) => prEmph (strm, "SUP", txt) | (HTML.EM txt) => prEmph (strm, "EM", txt) | (HTML.STRONG txt) => prEmph (strm, "STRONG", txt) | (HTML.DFN txt) => prEmph (strm, "DFN", txt) | (HTML.CODE txt) => prEmph (strm, "CODE", txt) | (HTML.SAMP txt) => prEmph (strm, "SAMP", txt) | (HTML.KBD txt) => prEmph (strm, "KBD", txt) | (HTML.VAR txt) => prEmph (strm, "VAR", txt) | (HTML.CITE txt) => prEmph (strm, "CITE", txt) | (HTML.A{name, href, rel, rev, title, content}) => ( prTag (strm, "A", [ ("NAME", CDATA name), ("HREF", CDATA href), ("REL", CDATA rel), ("REV", CDATA rev), ("TITLE", CDATA title) ]); prText (strm, content); prEndTag (strm, "A")) | (HTML.IMG{ src, alt, align, height, width, border, hspace, vspace, usemap, ismap }) => prTag (strm, "IMG", [ ("SRC", CDATA(SOME src)), ("ALT", CDATA alt), ("ALIGN", iAlign align), ("HEIGHT", CDATA height), ("WIDTH", CDATA width), ("BORDER", CDATA border), ("HSPACE", CDATA hspace), ("VSPACE", CDATA vspace), ("USEMAP", CDATA usemap), ("ISMAP", IMPLICIT ismap) ]) | (HTML.APPLET{ codebase, code, name, alt, align, height, width, hspace, vspace, content }) => ( prTag (strm, "APPLET", [ ("CODEBASE", CDATA codebase), ("CODE", CDATA(SOME code)), ("NAME", CDATA name), ("ALT", CDATA alt), ("ALIGN", iAlign align), ("HEIGHT", CDATA height), ("WIDTH", CDATA width), ("HSPACE", CDATA hspace), ("VSPACE", CDATA vspace) ]); prText (strm, content); prEndTag (strm, "APPLET")) | (HTML.PARAM{name, value}) => prTag (strm, "PARAM", [ ("NAME", NAME(SOME name)), ("VALUE", CDATA value) ]) | (HTML.FONT{size, color, content}) => ( prTag (strm, "FONT", [ ("SIZE", CDATA size), ("COLOR", CDATA color) ]); prText (strm, content); prEndTag (strm, "FONT")) | (HTML.BASEFONT{size, content}) => ( prTag (strm, "BASEFONT", [("SIZE", CDATA size)]); prText (strm, content); prEndTag (strm, "BASEFONT")) | (HTML.BR{clear}) => ( prTag (strm, "BR", [("CLEAR", textFlowCtl clear)]); newLine strm) | (HTML.MAP{name, content}) => ( prTag (strm, "MAP", [("NAME", CDATA name)]); List.app (prArea strm) content; prEndTag (strm, "MAP")) | (HTML.INPUT{ ty, name, value, checked, size, maxlength, src, align }) => prTag (strm, "INPUT", [ ("TYPE", inputType ty), ("NAME", NAME name), ("VALUE", CDATA value), ("CHECKED", IMPLICIT checked), ("SIZE", CDATA size), ("MAXLENGTH", NUMBER maxlength), ("SRC", CDATA src), ("ALIGN", iAlign align) ]) | (HTML.SELECT{name, size, content}) => ( prTag (strm, "SELECT", [ ("NAME", NAME(SOME name)), ("SIZE", NUMBER size) ]); List.app (prOption strm) content; prEndTag (strm, "SELECT")) | (HTML.TEXTAREA{name, rows, cols, content}) => ( prTag (strm, "TEXTAREA", [ ("NAME", NAME(SOME name)), ("ROWS", NUMBER(SOME rows)), ("COLS", NUMBER(SOME cols)) ]); prPCData (strm, content); prEndTag (strm, "TEXTAREA")) (* SCRIPT elements are placeholders for the next version of HTML *) | (HTML.SCRIPT pcdata) => () (* end case *)) and prArea strm (HTML.AREA{shape=s, coords, href, nohref, alt}) = prTag (strm, "AREA", [ ("SHAPE", shape s), ("COORDS", CDATA coords), ("HREF", CDATA href), ("nohref", IMPLICIT nohref), ("ALT", CDATA(SOME alt)) ]) and prOption strm (HTML.OPTION{selected, value, content}) = ( prTag (strm, "OPTION", [ ("SELECTED", IMPLICIT selected), ("VALUE", CDATA value) ]); prPCData (strm, content)) and prPCData (strm, data) = puts (strm, data) fun prBody (strm, HTML.BODY{ background, bgcolor, text, link, vlink, alink, content }) = ( prTag (strm, "BODY", [ ("BACKGROUND", CDATA background), ("BGCOLOR", CDATA bgcolor), ("TEXT", CDATA text), ("LINK", CDATA link), ("VLINK", CDATA vlink), ("ALINK", CDATA alink) ]); prBlock (strm, content); prEndTag (strm, "BODY")) fun prHeadElement strm elem = (case elem of (HTML.Head_TITLE pcdata) => ( prTag (strm, "TITLE", []); prPCData(strm, pcdata); prEndTag (strm, "TITLE"); newLine strm) | (HTML.Head_ISINDEX{prompt}) => ( prTag (strm, "ISINDEX", [("PROMPT", CDATA prompt)]); newLine strm) | (HTML.Head_BASE{href}) => ( prTag (strm, "BASE", [("HREF", CDATA(SOME href))]); newLine strm) | (HTML.Head_META{httpEquiv, name, content}) => ( prTag (strm, "META", [ ("HTTP-EQUIV", NAME httpEquiv), ("NAME", NAME name), ("CONTENT", CDATA(SOME content)) ]); newLine strm) | (HTML.Head_LINK{id, href, rel, rev, title}) => ( prTag (strm, "LINK", [ ("ID", NAME id), ("HREF", CDATA href), ("REL", CDATA rel), ("REV", CDATA rev), ("TITLE", CDATA title) ]); newLine strm) (* SCRIPT/STYLE elements are placeholders for the next version of HTML *) | (HTML.Head_SCRIPT pcdata) => () | (HTML.Head_STYLE pcdata) => () (* end case *)) fun prHTML {putc, puts} html = let val strm = OS{putc=putc, puts=puts} val HTML.HTML{head, body, version} = html in case version of NONE => () | (SOME v) => puts (F.format "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML %s//EN\">\n" [F.STR v]) (* end case *); puts "<HTML>\n"; puts "<HEAD>\n"; List.app (prHeadElement strm) head; puts "</HEAD>\n"; prBody (strm, body); puts "</HTML>\n" end end ���������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML/test-parser.sml������������������������������������0000664�0000000�0000000�00000003437�14162643450�0024113�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* test-parser.sml * * COPYRIGHT (c) 1996 AT&T REsearch. * * This is a simple test driver for the HTML parser. *) structure Main : sig val doit : string -> HTML.html option val main : (string * string list) -> OS.Process.status end = struct structure Err = struct type context = {file : string option, line : int} structure F = Format fun prf ({file, line}, fmt, args) = ( case file of NONE => TextIO.output ( TextIO.stdErr, F.format "line %3d: " [F.INT line]) | (SOME fname) => TextIO.output ( TextIO.stdErr, F.format "%s[%d]: " [F.STR fname, F.INT line]) (* end case *); TextIO.output(TextIO.stdErr, F.format fmt args); TextIO.output1(TextIO.stdErr, #"\n")) fun badStartTag ctx tagName = prf (ctx, "unrecognized start tag \"%s\"",[F.STR tagName]) fun badEndTag ctx tagName = prf (ctx, "unrecognized end tag \"%s\"",[F.STR tagName]) fun badAttrVal ctx (attrName, attrVal) = prf (ctx, "bad value \"%s\" for attribute \"%s\"", [F.STR attrVal, F.STR attrName]) fun lexError ctx msg = prf (ctx, "%s", [F.STR msg]) fun syntaxError ctx msg = prf (ctx, "%s", [F.STR msg]) fun missingAttrVal ctx attrName = prf (ctx, "missing value for \"%s\" attribute", [F.STR attrName]) fun missingAttr ctx attrName = prf (ctx, "missing \"%s\" attribute", [F.STR attrName]) fun unknownAttr ctx attrName = prf (ctx, "unknown attribute \"%s\"", [F.STR attrName]) fun unquotedAttrVal ctx attrName = prf (ctx, "attribute value for \"%s\" should be quoted", [F.STR attrName]) end structure P = HTMLParserFn(Err); fun doit fname = SOME(P.parseFile fname) (* handle _ => NONE *) fun main (_, files) = (List.app (ignore o doit) files; OS.Process.success) end; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/��������������������������������������������������0000775�0000000�0000000�00000000000�14162643450�0021202�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/README��������������������������������������������0000664�0000000�0000000�00000002560�14162643450�0022065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������______________________________________________________________________ README ______________________________________________________________________ This is the README for a new HTML 4.01 library for SML/NJ. ____________________________________________________________ Build targets ____________________________________________________________ The primary target is in html4-lib.cm. This will build everything needed to provide the HTML4 structure. There are several test targets coded in CM files. The first one tests the lexer, accepting a list of files as an argument, and outputing a token per line. For example: $ ml-build html4-lex-test.cm $ sml @SMLload=html4-lex-test.platform tests/test001.html The next one tests the parser, accepting a list of files as input, and outputing the parse tree (TODO). For example: $ ml-build html4-test.cm $ sml @SMLload=html4-test.platform tests/test001.html ____________________________________________________________ Helper script ____________________________________________________________ We've included a helper script, which we used to create the lexical token constructors. This script, helper.py, processes a table of elements, published in the HTML 4.01 specification. ______________________________________________________________________ End of README ______________________________________________________________________ ������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/TODO����������������������������������������������0000664�0000000�0000000�00000000525�14162643450�0021674�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������TODO list for the HTML4 library: - fix bugs in conformance tests (these are parsing issues) - streamline parser; we should be able to fold the processing of attributes (html4-attr.{lg}) into the scaner/parser for elements. - the printer should be "PRE" aware. - add the rest of the standard HTML4 entites to html4-entities.sml ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/helper.py�����������������������������������������0000775�0000000�0000000�00000007762�14162643450�0023052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /usr/bin/env python # ______________________________________________________________________ """helper.py Quick helper script for some minor code generation tasks. Requires the BeautifulSoup library. """ # ______________________________________________________________________ # Module imports from BeautifulSoup import BeautifulSoup # ______________________________________________________________________ # Function definitions def element_data_to_tuple_str ((tag_name, start_tag_data, end_tag_data, empty_data, depr_data, dtd_data, desc_data)): otag_ctor = u"START%s" % tag_name if end_tag_data == u"F": etag_ctor = u"NONE" else: etag_ctor = u"SOME END%s" % tag_name return u'("%s", %s, %s)' % (tag_name, otag_ctor, etag_ctor) # ______________________________________________________________________ def element_data_to_string_fun ((tag_name, start_tag_data, end_tag_data, empty_data, depr_data, dtd_data, desc_data)): print (u'| tokToString (START%s payload) = "START%s " ^ (payloadToString ' 'payload)' % (tag_name, tag_name)) if end_tag_data != u"F": print u'| tokToString END%s = "END%s"' % (tag_name, tag_name) # ______________________________________________________________________ def element_data_to_production ((tag_name, start_tag_data, end_tag_data, empty_data, depr_data, dtd_data, desc_data)): end_str = u";" if end_tag_data != u"F": end_str = u"END%s ;" % tag_name if empty_data != u"E": end_str = u"XXX %s" % end_str print u"%s : START%s %s" % (tag_name.lower(), tag_name, end_str) print # ______________________________________________________________________ # Main routine def main (): elements_doc = BeautifulSoup(open("tests/elements.html").read(), convertEntities = BeautifulSoup.HTML_ENTITIES) # Skip the header row. crnt_element_row = elements_doc.table.tr.findNextSibling("tr") strict_list = [] loose_list = [] frameset_list = [] while crnt_element_row is not None: cols = crnt_element_row.findAll("td") assert len(cols) == 7 element_data = tuple([cols[0].a.string.strip()] + [table_entry.string.strip() for table_entry in cols[1:]]) (tag_name, start_tag_data, end_tag_data, empty_data, depr_data, dtd_data, desc_data) = element_data print u"| START%s of token_payload" % tag_name if end_tag_data != u"F": print u"| END%s" % tag_name else: print u"(* No END tag for %s element. *)" % tag_name if dtd_data == u'': strict_list.append(element_data) elif dtd_data == u'F': frameset_list.append(element_data) else: assert dtd_data == u'L' loose_list.append(element_data) crnt_element_row = crnt_element_row.findNextSibling("tr") element_data_list = strict_list + loose_list + frameset_list element_data_list.sort() print print "val strict_tuple_list = [" print u",\n".join((element_data_to_tuple_str(elem_data) for elem_data in strict_list)) print "]" print print "val loose_tuple_list = [" print u",\n".join((element_data_to_tuple_str(elem_data) for elem_data in loose_list)) print "]" print print "val frameset_tuple_list = [" print u",\n".join((element_data_to_tuple_str(elem_data) for elem_data in frameset_list)) print "]" print for element_data in element_data_list: element_data_to_string_fun(element_data) print for element_data in element_data_list: element_data_to_production(element_data) # ______________________________________________________________________ if __name__ == "__main__": main() # ______________________________________________________________________ # End of helper.py ��������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-attr.g��������������������������������������0000664�0000000�0000000�00000001714�14162643450�0023355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-attr.g * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Grammar for parsing HTML 4 attributes. * * FIXME: we could probably just do this in the scanner!!! *) %name HTML4Attr; %tokens : NAME of Atom.atom | EQUALS ("=") | STRINGLIT of string | DOT (".") | NUMBER of string ; %start attrs; attrs : attr* ; attr : NAME (EQUALS attr_value => (attr_value))? => ((NAME, SR)) ; attr_value : STRINGLIT | NAME (DOT NAME => (NAME))* => ((Atom.toString NAME) ^ (String.concatWith "." (map Atom.toString SR))) | NUMBER (DOT NUMBER => (NUMBER))* => (NUMBER ^ (String.concatWith "." SR)) ; (* ______________________________________________________________________ End of html4-attr.g ______________________________________________________________________ *) ����������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-attr.g.sml����������������������������������0000664�0000000�0000000�00000022154�14162643450�0024150�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������structure HTML4AttrTokens = struct datatype token = NAME of Atom.atom | EQUALS | STRINGLIT of string | DOT | NUMBER of string | EOF val allToks = [ EQUALS, DOT, EOF ] fun toString tok = (case (tok) of (NAME(_)) => "NAME" | (EQUALS) => "=" | (STRINGLIT(_)) => "STRINGLIT" | (DOT) => "." | (NUMBER(_)) => "NUMBER" | (EOF) => "EOF" (* end case *)) fun isKW tok = (case (tok) of (NAME(_)) => false | (EQUALS) => false | (STRINGLIT(_)) => false | (DOT) => false | (NUMBER(_)) => false | (EOF) => false (* end case *)) fun isEOF EOF = true | isEOF _ = false end (* HTML4AttrTokens *) functor HTML4AttrParseFn (Lex : ANTLR_LEXER) = struct local structure Tok = HTML4AttrTokens structure UserCode = struct fun attr_PROD_1_SUBRULE_1_PROD_1_ACT (attr_value, EQUALS, NAME, attr_value_SPAN : (Lex.pos * Lex.pos), EQUALS_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (attr_value) fun attr_PROD_1_ACT (SR, NAME, SR_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((NAME, SR)) fun attr_value_PROD_2_SUBRULE_1_PROD_1_ACT (NAME, DOT, NAME_SPAN : (Lex.pos * Lex.pos), DOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (NAME) fun attr_value_PROD_2_ACT (SR, NAME, SR_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Atom.toString NAME) ^ (String.concatWith "." (map Atom.toString SR))) fun attr_value_PROD_3_SUBRULE_1_PROD_1_ACT (NUMBER, DOT, NUMBER_SPAN : (Lex.pos * Lex.pos), DOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (NUMBER) fun attr_value_PROD_3_ACT (SR, NUMBER, SR_SPAN : (Lex.pos * Lex.pos), NUMBER_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (NUMBER ^ (String.concatWith "." SR)) end (* UserCode *) structure Err = AntlrErrHandler( structure Tok = Tok structure Lex = Lex) (* replace functor with inline structure for better optimization structure EBNF = AntlrEBNF( struct type strm = Err.wstream val getSpan = Err.getSpan end) *) structure EBNF = struct fun optional (pred, parse, strm) = if pred strm then let val (y, span, strm') = parse strm in (SOME y, span, strm') end else (NONE, Err.getSpan strm, strm) fun closure (pred, parse, strm) = let fun iter (strm, (left, right), ys) = if pred strm then let val (y, (_, right'), strm') = parse strm in iter (strm', (left, right'), y::ys) end else (List.rev ys, (left, right), strm) in iter (strm, Err.getSpan strm, []) end fun posclos (pred, parse, strm) = let val (y, (left, _), strm') = parse strm val (ys, (_, right), strm'') = closure (pred, parse, strm') in (y::ys, (left, right), strm'') end end fun mk lexFn = let fun getS() = {} fun putS{} = () fun unwrap (ret, strm, repairs) = (ret, strm, repairs) val (eh, lex) = Err.mkErrHandler {get = getS, put = putS} fun fail() = Err.failure eh fun tryProds (strm, prods) = let fun try [] = fail() | try (prod :: prods) = (Err.whileDisabled eh (fn() => prod strm)) handle Err.ParseError => try (prods) in try prods end fun matchNAME strm = (case (lex(strm)) of (Tok.NAME(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchEQUALS strm = (case (lex(strm)) of (Tok.EQUALS, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTRINGLIT strm = (case (lex(strm)) of (Tok.STRINGLIT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchDOT strm = (case (lex(strm)) of (Tok.DOT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchNUMBER strm = (case (lex(strm)) of (Tok.NUMBER(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchEOF strm = (case (lex(strm)) of (Tok.EOF, span, strm') => ((), span, strm') | _ => fail() (* end case *)) val (attrs_NT) = let fun attr_value_NT (strm) = let fun attr_value_PROD_1 (strm) = let val (STRINGLIT_RES, STRINGLIT_SPAN, strm') = matchSTRINGLIT(strm) val FULL_SPAN = (#1(STRINGLIT_SPAN), #2(STRINGLIT_SPAN)) in ((STRINGLIT_RES), FULL_SPAN, strm') end fun attr_value_PROD_2 (strm) = let val (NAME_RES, NAME_SPAN, strm') = matchNAME(strm) fun attr_value_PROD_2_SUBRULE_1_NT (strm) = let val (DOT_RES, DOT_SPAN, strm') = matchDOT(strm) val (NAME_RES, NAME_SPAN, strm') = matchNAME(strm') val FULL_SPAN = (#1(DOT_SPAN), #2(NAME_SPAN)) in (UserCode.attr_value_PROD_2_SUBRULE_1_PROD_1_ACT (NAME_RES, DOT_RES, NAME_SPAN : (Lex.pos * Lex.pos), DOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun attr_value_PROD_2_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.DOT, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.closure(attr_value_PROD_2_SUBRULE_1_PRED, attr_value_PROD_2_SUBRULE_1_NT, strm') val FULL_SPAN = (#1(NAME_SPAN), #2(SR_SPAN)) in (UserCode.attr_value_PROD_2_ACT (SR_RES, NAME_RES, SR_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun attr_value_PROD_3 (strm) = let val (NUMBER_RES, NUMBER_SPAN, strm') = matchNUMBER(strm) fun attr_value_PROD_3_SUBRULE_1_NT (strm) = let val (DOT_RES, DOT_SPAN, strm') = matchDOT(strm) val (NUMBER_RES, NUMBER_SPAN, strm') = matchNUMBER(strm') val FULL_SPAN = (#1(DOT_SPAN), #2(NUMBER_SPAN)) in (UserCode.attr_value_PROD_3_SUBRULE_1_PROD_1_ACT (NUMBER_RES, DOT_RES, NUMBER_SPAN : (Lex.pos * Lex.pos), DOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun attr_value_PROD_3_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.DOT, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.closure(attr_value_PROD_3_SUBRULE_1_PRED, attr_value_PROD_3_SUBRULE_1_NT, strm') val FULL_SPAN = (#1(NUMBER_SPAN), #2(SR_SPAN)) in (UserCode.attr_value_PROD_3_ACT (SR_RES, NUMBER_RES, SR_SPAN : (Lex.pos * Lex.pos), NUMBER_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.NUMBER(_), _, strm') => attr_value_PROD_3(strm) | (Tok.STRINGLIT(_), _, strm') => attr_value_PROD_1(strm) | (Tok.NAME(_), _, strm') => attr_value_PROD_2(strm) | _ => fail() (* end case *)) end fun attr_NT (strm) = let val (NAME_RES, NAME_SPAN, strm') = matchNAME(strm) fun attr_PROD_1_SUBRULE_1_NT (strm) = let val (EQUALS_RES, EQUALS_SPAN, strm') = matchEQUALS(strm) val (attr_value_RES, attr_value_SPAN, strm') = attr_value_NT(strm') val FULL_SPAN = (#1(EQUALS_SPAN), #2(attr_value_SPAN)) in (UserCode.attr_PROD_1_SUBRULE_1_PROD_1_ACT (attr_value_RES, EQUALS_RES, NAME_RES, attr_value_SPAN : (Lex.pos * Lex.pos), EQUALS_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun attr_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.EQUALS, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(attr_PROD_1_SUBRULE_1_PRED, attr_PROD_1_SUBRULE_1_NT, strm') val FULL_SPAN = (#1(NAME_SPAN), #2(SR_SPAN)) in (UserCode.attr_PROD_1_ACT (SR_RES, NAME_RES, SR_SPAN : (Lex.pos * Lex.pos), NAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun attrs_NT (strm) = let fun attrs_PROD_1_SUBRULE_1_NT (strm) = let val (attr_RES, attr_SPAN, strm') = attr_NT(strm) val FULL_SPAN = (#1(attr_SPAN), #2(attr_SPAN)) in ((attr_RES), FULL_SPAN, strm') end fun attrs_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.NAME(_), _, strm') => true | _ => false (* end case *)) val (attr_RES, attr_SPAN, strm') = EBNF.closure(attrs_PROD_1_SUBRULE_1_PRED, attrs_PROD_1_SUBRULE_1_NT, strm) val FULL_SPAN = (#1(attr_SPAN), #2(attr_SPAN)) in ((attr_RES), FULL_SPAN, strm') end in (attrs_NT) end val attrs_NT = fn s => unwrap (Err.launch (eh, lexFn, attrs_NT , true) s) in (attrs_NT) end in fun parse lexFn s = let val (attrs_NT) = mk lexFn in attrs_NT s end end end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-attr.l��������������������������������������0000664�0000000�0000000�00000001460�14162643450�0023360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-attr.l * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Lexer for parsing HTML 4 attributes. *) %name HTML4AttrLexer; %defs ( open HTML4AttrTokens fun eof() = EOF type lex_result = token ); %let alpha=[A-Za-z]; %let digit=[0-9]; %let ws=[\ \t\r\n]; (* some XHTML attributes have ":" in their name *) {alpha}({alpha}|{digit}|[-.:])* => (NAME (Atom.atom yytext)); {digit}+ => (NUMBER yytext); "=" => (EQUALS); "." => (DOT); [\"][^\"]*[\"] => (STRINGLIT yytext); [\'][^\']*[\'] => (STRINGLIT yytext); {ws}+ => (continue()); . => ((* error; invalid character *) continue()); (* ______________________________________________________________________ End of html4-attr.l ______________________________________________________________________ *)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-attr.l.sml����������������������������������0000664�0000000�0000000�00000037067�14162643450�0024166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������structure HTML4AttrLexer = struct datatype yystart_state = INITIAL local structure UserDeclarations = struct open HTML4AttrTokens fun eof() = EOF type lex_result = token end datatype yymatch = yyNO_MATCH | yyMATCH of ULexBuffer.stream * action * yymatch withtype action = ULexBuffer.stream * yymatch -> UserDeclarations.lex_result val yytable : ((UTF8.wchar * UTF8.wchar * int) list * int list) Vector.vector = Vector.fromList [] fun yystreamify' p input = ULexBuffer.mkStream (p, input) fun yystreamifyReader' p readFn strm = let val s = ref strm fun iter(strm, n, accum) = if n > 1024 then (String.implode (rev accum), strm) else (case readFn strm of NONE => (String.implode (rev accum), strm) | SOME(c, strm') => iter (strm', n+1, c::accum)) fun input() = let val (data, strm) = iter(!s, 0, []) in s := strm; data end in yystreamify' p input end fun yystreamifyInstream' p strm = yystreamify' p (fn ()=>TextIO.input strm) fun innerLex (yystrm_, yyss_, yysm) = let (* current start state *) val yyss = ref yyss_ fun YYBEGIN ss = (yyss := ss) (* current input stream *) val yystrm = ref yystrm_ fun yysetStrm strm = yystrm := strm fun yygetPos() = ULexBuffer.getpos (!yystrm) fun yystreamify input = yystreamify' (yygetPos()) input fun yystreamifyReader readFn strm = yystreamifyReader' (yygetPos()) readFn strm fun yystreamifyInstream strm = yystreamifyInstream' (yygetPos()) strm (* start position of token -- can be updated via skip() *) val yystartPos = ref (yygetPos()) (* get one char of input *) fun yygetc strm = (case ULexBuffer.getu strm of (SOME (0w10, s')) => (AntlrStreamPos.markNewLine yysm (ULexBuffer.getpos strm); SOME (0w10, s')) | x => x) fun yygetList getc strm = let val get1 = UTF8.getu getc fun iter (strm, accum) = (case get1 strm of NONE => rev accum | SOME (w, strm') => iter (strm', w::accum) (* end case *)) in iter (strm, []) end (* create yytext *) fun yymksubstr(strm) = ULexBuffer.subtract (strm, !yystrm) fun yymktext(strm) = Substring.string (yymksubstr strm) fun yymkunicode(strm) = yygetList Substring.getc (yymksubstr strm) open UserDeclarations fun lex () = let fun yystuck (yyNO_MATCH) = raise Fail "lexer reached a stuck state" | yystuck (yyMATCH (strm, action, old)) = action (strm, old) val yypos = yygetPos() fun yygetlineNo strm = AntlrStreamPos.lineNo yysm (ULexBuffer.getpos strm) fun yygetcolNo strm = AntlrStreamPos.colNo yysm (ULexBuffer.getpos strm) fun yyactsToMatches (strm, [], oldMatches) = oldMatches | yyactsToMatches (strm, act::acts, oldMatches) = yyMATCH (strm, act, yyactsToMatches (strm, acts, oldMatches)) fun yygo actTable = (fn (~1, _, oldMatches) => yystuck oldMatches | (curState, strm, oldMatches) => let val (transitions, finals') = Vector.sub (yytable, curState) val finals = List.map (fn i => Vector.sub (actTable, i)) finals' fun tryfinal() = yystuck (yyactsToMatches (strm, finals, oldMatches)) fun find (c, []) = NONE | find (c, (c1, c2, s)::ts) = if c1 <= c andalso c <= c2 then SOME s else find (c, ts) in case yygetc strm of SOME(c, strm') => (case find (c, transitions) of NONE => tryfinal() | SOME n => yygo actTable (n, strm', yyactsToMatches (strm, finals, oldMatches))) | NONE => tryfinal() end) val yylastwasnref = ref (ULexBuffer.lastWasNL (!yystrm)) fun continue() = let val yylastwasn = !yylastwasnref in let fun yyAction0 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; NAME (Atom.atom yytext) end fun yyAction1 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; NUMBER yytext end fun yyAction2 (strm, lastMatch : yymatch) = (yystrm := strm; EQUALS) fun yyAction3 (strm, lastMatch : yymatch) = (yystrm := strm; DOT) fun yyAction4 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; STRINGLIT yytext end fun yyAction5 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; STRINGLIT yytext end fun yyAction6 (strm, lastMatch : yymatch) = (yystrm := strm; continue()) fun yyAction7 (strm, lastMatch : yymatch) = (yystrm := strm; (* error; invalid character *) continue()) fun yyQ9 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction0(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx2F then yyAction0(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction0(strm, yyNO_MATCH) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = 0wx5B then yyAction0(strm, yyNO_MATCH) else if inp < 0wx5B then if inp <= 0wx40 then yyAction0(strm, yyNO_MATCH) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = 0wx61 then yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wx61 then yyAction0(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ8 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction0(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx2F then yyAction0(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction0(strm, yyNO_MATCH) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = 0wx5B then yyAction0(strm, yyNO_MATCH) else if inp < 0wx5B then if inp <= 0wx40 then yyAction0(strm, yyNO_MATCH) else yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp = 0wx61 then yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wx61 then yyAction0(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ9(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ7 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ10 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction1(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ10(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else if inp < 0wx30 then yyAction1(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ10(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else yyAction1(strm, yyNO_MATCH) (* end case *)) fun yyQ6 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction1(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ10(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else if inp < 0wx30 then yyAction1(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ10(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else yyAction1(strm, yyNO_MATCH) (* end case *)) fun yyQ5 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction3(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction3(strm, yyNO_MATCH) (* end case *)) fun yyQ12 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction5(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction5(strm, yyNO_MATCH) (* end case *)) fun yyQ11 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx27 then yyQ12(strm', lastMatch) else yyQ11(strm', lastMatch) (* end case *)) fun yyQ4 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx27 then yyQ12(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else yyQ11(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) (* end case *)) fun yyQ14 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction4(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction4(strm, yyNO_MATCH) (* end case *)) fun yyQ13 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx22 then yyQ14(strm', lastMatch) else yyQ13(strm', lastMatch) (* end case *)) fun yyQ3 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx22 then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else yyQ13(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) (* end case *)) fun yyQ15 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction6(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxD then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else if inp < 0wxD then if inp = 0wx9 then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else if inp < 0wx9 then yyAction6(strm, yyNO_MATCH) else if inp <= 0wxA then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else yyAction6(strm, yyNO_MATCH) else if inp = 0wx20 then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else yyAction6(strm, yyNO_MATCH) (* end case *)) fun yyQ2 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction6(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxD then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else if inp < 0wxD then if inp = 0wx9 then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else if inp < 0wx9 then yyAction6(strm, yyNO_MATCH) else if inp <= 0wxA then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else yyAction6(strm, yyNO_MATCH) else if inp = 0wx20 then yyQ15(strm', yyMATCH(strm, yyAction6, yyNO_MATCH)) else yyAction6(strm, yyNO_MATCH) (* end case *)) fun yyQ1 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction7(strm, yyNO_MATCH) (* end case *)) fun yyQ0 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx28 then yyQ1(strm', lastMatch) else if inp < 0wx28 then if inp = 0wx20 then yyQ2(strm', lastMatch) else if inp < 0wx20 then if inp = 0wxB then yyQ1(strm', lastMatch) else if inp < 0wxB then if inp <= 0wx8 then yyQ1(strm', lastMatch) else yyQ2(strm', lastMatch) else if inp = 0wxD then yyQ2(strm', lastMatch) else yyQ1(strm', lastMatch) else if inp = 0wx23 then yyQ1(strm', lastMatch) else if inp < 0wx23 then if inp = 0wx21 then yyQ1(strm', lastMatch) else yyQ3(strm', lastMatch) else if inp = 0wx27 then yyQ4(strm', lastMatch) else yyQ1(strm', lastMatch) else if inp = 0wx3D then yyQ7(strm', lastMatch) else if inp < 0wx3D then if inp = 0wx2F then yyQ1(strm', lastMatch) else if inp < 0wx2F then if inp = 0wx2E then yyQ5(strm', lastMatch) else yyQ1(strm', lastMatch) else if inp <= 0wx39 then yyQ6(strm', lastMatch) else yyQ1(strm', lastMatch) else if inp = 0wx5B then yyQ1(strm', lastMatch) else if inp < 0wx5B then if inp <= 0wx40 then yyQ1(strm', lastMatch) else yyQ8(strm', lastMatch) else if inp = 0wx61 then yyQ8(strm', lastMatch) else if inp < 0wx61 then yyQ1(strm', lastMatch) else if inp <= 0wx7A then yyQ8(strm', lastMatch) else yyQ1(strm', lastMatch) (* end case *)) in (case (!(yyss)) of INITIAL => yyQ0(!(yystrm), yyNO_MATCH) (* end case *)) end end and skip() = (yystartPos := yygetPos(); yylastwasnref := ULexBuffer.lastWasNL (!yystrm); continue()) in (continue(), (!yystartPos, yygetPos()), !yystrm, !yyss) end in lex() end in type pos = AntlrStreamPos.pos type span = AntlrStreamPos.span type tok = UserDeclarations.lex_result datatype prestrm = STRM of ULexBuffer.stream * (yystart_state * tok * span * prestrm * yystart_state) option ref type strm = (prestrm * yystart_state) fun lex sm (STRM (yystrm, memo), ss) = (case !memo of NONE => let val (tok, span, yystrm', ss') = innerLex (yystrm, ss, sm) val strm' = STRM (yystrm', ref NONE); in memo := SOME (ss, tok, span, strm', ss'); (tok, span, (strm', ss')) end | SOME (ss', tok, span, strm', ss'') => if ss = ss' then (tok, span, (strm', ss'')) else ( memo := NONE; lex sm (STRM (yystrm, memo), ss)) (* end case *)) fun streamify input = (STRM (yystreamify' 0 input, ref NONE), INITIAL) fun streamifyReader readFn strm = (STRM (yystreamifyReader' 0 readFn strm, ref NONE), INITIAL) fun streamifyInstream strm = (STRM (yystreamifyInstream' 0 strm, ref NONE), INITIAL) fun getPos (STRM (strm, _), _) = ULexBuffer.getpos strm end end �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-attrs.sml�����������������������������������0000664�0000000�0000000�00000026321�14162643450�0024106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-attrs.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Helper functions for creating attribute-value pairs to include in * HTML tags. We omit the deprecated attributes (commented out below), * but include both the strict, loose, and frameset attributes. * * The source of the attribute list comes from * * http://www.w3.org/TR/html4/index/attributes.html *) structure HTML4Attrs = struct local val a_abbr = Atom.atom "abbr" val a_accept_charset = Atom.atom "accept-charset" val a_accept = Atom.atom "accept" val a_action = Atom.atom "action" val a_align = Atom.atom "align" val a_alink = Atom.atom "alink" val a_alt = Atom.atom "alt" val a_archive = Atom.atom "archive" val a_axis = Atom.atom "axis" val a_background = Atom.atom "background" val a_bgcolor = Atom.atom "bgcolor" val a_border = Atom.atom "border" val a_cellpadding = Atom.atom "cellpadding" val a_cellspacing = Atom.atom "cellspacing" val a_char = Atom.atom "char" val a_charoff = Atom.atom "charoff" val a_charset = Atom.atom "charset" val a_checked = Atom.atom "checked" val a_cite = Atom.atom "cite" val a_class = Atom.atom "class" val a_classid = Atom.atom "classid" val a_clear = Atom.atom "clear" val a_code = Atom.atom "code" val a_codebase = Atom.atom "codebase" val a_codetype = Atom.atom "codetype" val a_color = Atom.atom "color" val a_cols = Atom.atom "cols" val a_colspan = Atom.atom "colspan" val a_compact = Atom.atom "compact" val a_content = Atom.atom "content" val a_coords = Atom.atom "coords" val a_data = Atom.atom "data" val a_datetime = Atom.atom "datetime" val a_declare = Atom.atom "declare" val a_defer = Atom.atom "defer" val a_dir = Atom.atom "dir" val a_disabled = Atom.atom "disabled" val a_enctype = Atom.atom "enctype" val a_face = Atom.atom "face" val a_for = Atom.atom "for" val a_frame = Atom.atom "frame" val a_frameborder = Atom.atom "frameborder" val a_headers = Atom.atom "headers" val a_height = Atom.atom "height" val a_href = Atom.atom "href" val a_hreflang = Atom.atom "hreflang" val a_hspace = Atom.atom "hspace" val a_http_equiv = Atom.atom "http-equiv" val a_id = Atom.atom "id" val a_ismap = Atom.atom "ismap" val a_label = Atom.atom "label" val a_lang = Atom.atom "lang" val a_language = Atom.atom "language" val a_link = Atom.atom "link" val a_longdesc = Atom.atom "longdesc" val a_marginheight = Atom.atom "marginheight" val a_marginwidth = Atom.atom "marginwidth" val a_maxlength = Atom.atom "maxlength" val a_media = Atom.atom "media" val a_method = Atom.atom "method" val a_multiple = Atom.atom "multiple" val a_name = Atom.atom "name" val a_nohref = Atom.atom "nohref" val a_noresize = Atom.atom "noresize" val a_noshade = Atom.atom "noshade" val a_nowrap = Atom.atom "nowrap" val a_object = Atom.atom "object" val a_onblur = Atom.atom "onblur" val a_onchange = Atom.atom "onchange" val a_onclick = Atom.atom "onclick" val a_ondblclick = Atom.atom "ondblclick" val a_onfocus = Atom.atom "onfocus" val a_onkeydown = Atom.atom "onkeydown" val a_onkeypress = Atom.atom "onkeypress" val a_onkeyup = Atom.atom "onkeyup" val a_onload = Atom.atom "onload" val a_onmousedown = Atom.atom "onmousedown" val a_onmousemove = Atom.atom "onmousemove" val a_onmouseout = Atom.atom "onmouseout" val a_onmouseover = Atom.atom "onmouseover" val a_onmouseup = Atom.atom "onmouseup" val a_onreset = Atom.atom "onreset" val a_onselect = Atom.atom "onselect" val a_onsubmit = Atom.atom "onsubmit" val a_onunload = Atom.atom "onunload" val a_profile = Atom.atom "profile" val a_prompt = Atom.atom "prompt" val a_readonly = Atom.atom "readonly" val a_rel = Atom.atom "rel" val a_rev = Atom.atom "rev" val a_rows = Atom.atom "rows" val a_rowspan = Atom.atom "rowspan" val a_rules = Atom.atom "rules" val a_scheme = Atom.atom "scheme" val a_scope = Atom.atom "scope" val a_scrolling = Atom.atom "scrolling" val a_selected = Atom.atom "selected" val a_shape = Atom.atom "shape" val a_size = Atom.atom "size" val a_span = Atom.atom "span" val a_src = Atom.atom "src" val a_standby = Atom.atom "standby" val a_start = Atom.atom "start" val a_style = Atom.atom "style" val a_summary = Atom.atom "summary" val a_tabindex = Atom.atom "tabindex" val a_target = Atom.atom "target" val a_text = Atom.atom "text" val a_title = Atom.atom "title" val a_type = Atom.atom "type" val a_usemap = Atom.atom "usemap" val a_valign = Atom.atom "valign" val a_value = Atom.atom "value" val a_valuetype = Atom.atom "valuetype" val a_version = Atom.atom "version" val a_vlink = Atom.atom "vlink" val a_vspace = Atom.atom "vspace" val a_width = Atom.atom "width" in fun abbr (v : string) = (a_abbr, SOME v) fun accept_charset (v : string) = (a_accept_charset, SOME v) fun accept (v : string) = (a_accept, SOME v) fun action (v : string) = (a_action, SOME v) fun align (v : string) = (a_align, SOME v) fun alink (v : string) = (a_alink, SOME v) fun alt (v : string) = (a_alt, SOME v) fun archive (v : string) = (a_archive, SOME v) fun axis (v : string) = (a_axis, SOME v) (* DEPRECATED fun background (v : string) = (a_background, SOME v) (* deprecated *) fun bgcolor (v : string) = (a_bgcolor, SOME v) (* deprecated *) *) fun border (v : string) = (a_border, SOME v) fun cellpadding (v : string) = (a_cellpadding, SOME v) fun cellspacing (v : string) = (a_cellspacing, SOME v) fun char (v : string) = (a_char, SOME v) fun charoff (v : string) = (a_charoff, SOME v) fun charset (v : string) = (a_charset, SOME v) fun checked (v : string) = (a_checked, SOME v) fun cite (v : string) = (a_cite, SOME v) fun class (v : string) = (a_class, SOME v) fun classid (v : string) = (a_classid, SOME v) fun clear (v : string) = (a_clear, SOME v) fun code (v : string) = (a_code, SOME v) fun codebase (v : string) = (a_codebase, SOME v) fun codetype (v : string) = (a_codetype, SOME v) fun color (v : string) = (a_color, SOME v) fun cols (v : string) = (a_cols, SOME v) fun colspan (v : string) = (a_colspan, SOME v) (* DEPRECATED val compact = (a_compact, NONE) (* deprecated *) *) fun content (v : string) = (a_content, SOME v) fun coords (v : string) = (a_coords, SOME v) fun data (v : string) = (a_data, SOME v) fun datetime (v : string) = (a_datetime, SOME v) val declare = (a_declare, NONE) val defer = (a_defer, NONE) fun dir (v : string) = (a_dir, SOME v) val disabled = (a_disabled, NONE) fun enctype (v : string) = (a_enctype, SOME v) (* DEPRECATED fun face (v : string) = (a_face, SOME v) (* deprecated *) *) fun for (v : string) = (a_for, SOME v) fun frame (v : string) = (a_frame, SOME v) fun frameborder (v : string) = (a_frameborder, SOME v) fun headers (v : string) = (a_headers, SOME v) fun height (v : string) = (a_height, SOME v) fun href (v : string) = (a_href, SOME v) fun hreflang (v : string) = (a_hreflang, SOME v) fun hspace (v : string) = (a_hspace, SOME v) fun http_equiv (v : string) = (a_http_equiv, SOME v) fun id (v : string) = (a_id, SOME v) fun ismap (v : string) = (a_ismap, SOME v) fun label (v : string) = (a_label, SOME v) fun lang (v : string) = (a_lang, SOME v) (* DEPRECATED fun language (v : string) = (a_language, SOME v) (* deprecated *) fun link (v : string) = (a_link, SOME v) (* deprecated *) *) fun longdesc (v : string) = (a_longdesc, SOME v) fun marginheight (v : string) = (a_marginheight, SOME v) fun marginwidth (v : string) = (a_marginwidth, SOME v) fun maxlength (v : string) = (a_maxlength, SOME v) fun media (v : string) = (a_media, SOME v) fun method (v : string) = (a_method, SOME v) fun multiple (v : string) = (a_multiple, SOME v) fun name (v : string) = (a_name, SOME v) val nohref = (a_nohref, NONE) val noresize = (a_noresize, NONE) (* DEPRECATED val noshade = (a_noshade, NONE) (* deprecated *) val nowrap = (a_nowrap, NONE) (* deprecated *) fun object (v : string) = (a_object, SOME v) (* deprecated *) *) fun onblur (v : string) = (a_onblur, SOME v) fun onchange (v : string) = (a_onchange, SOME v) fun onclick (v : string) = (a_onclick, SOME v) fun ondblclick (v : string) = (a_ondblclick, SOME v) fun onfocus (v : string) = (a_onfocus, SOME v) fun onkeydown (v : string) = (a_onkeydown, SOME v) fun onkeypress (v : string) = (a_onkeypress, SOME v) fun onkeyup (v : string) = (a_onkeyup, SOME v) fun onload (v : string) = (a_onload, SOME v) fun onmousedown (v : string) = (a_onmousedown, SOME v) fun onmousemove (v : string) = (a_onmousemove, SOME v) fun onmouseout (v : string) = (a_onmouseout, SOME v) fun onmouseover (v : string) = (a_onmouseover, SOME v) fun onmouseup (v : string) = (a_onmouseup, SOME v) fun onreset (v : string) = (a_onreset, SOME v) fun onselect (v : string) = (a_onselect, SOME v) fun onsubmit (v : string) = (a_onsubmit, SOME v) fun onunload (v : string) = (a_onunload, SOME v) fun profile (v : string) = (a_profile, SOME v) (* DEPRECATED fun prompt (v : string) = (a_prompt, SOME v) (* deprecated *) *) val readonly = (a_readonly, NONE) fun rel (v : string) = (a_rel, SOME v) fun rev (v : string) = (a_rev, SOME v) fun rows (v : string) = (a_rows, SOME v) fun rowspan (v : string) = (a_rowspan, SOME v) fun rules (v : string) = (a_rules, SOME v) fun scheme (v : string) = (a_scheme, SOME v) fun scope (v : string) = (a_scope, SOME v) fun scrolling (v : string) = (a_scrolling, SOME v) val selected = (a_selected, NONE) fun shape (v : string) = (a_shape, SOME v) fun size (v : string) = (a_size, SOME v) fun span (v : string) = (a_span, SOME v) fun src (v : string) = (a_src, SOME v) fun standby (v : string) = (a_standby, SOME v) (* DEPRECATED fun start (v : string) = (a_start, SOME v) (* deprecated *) *) fun style (v : string) = (a_style, SOME v) fun summary (v : string) = (a_summary, SOME v) fun tabindex (v : string) = (a_tabindex, SOME v) fun target (v : string) = (a_target, SOME v) fun text (v : string) = (a_text, SOME v) fun title (v : string) = (a_title, SOME v) fun type' (v : string) = (a_type, SOME v) fun usemap (v : string) = (a_usemap, SOME v) fun valign (v : string) = (a_valign, SOME v) fun value (v : string) = (a_value, SOME v) fun valuetype (v : string) = (a_valuetype, SOME v) fun version (v : string) = (a_version, SOME v) (* DEPRECATED fun vlink (v : string) = (a_vlink, SOME v) (* deprecated *) *) fun vspace (v : string) = (a_vspace, SOME v) fun width (v : string) = (a_width, SOME v) end (* local *) end (* HTML4Attrs *) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-entities.sml��������������������������������0000664�0000000�0000000�00000001305�14162643450�0024570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-entities.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure HTML4Entities = struct val nbsp = HTML4.ENTITY(Atom.atom "nbsp") val lt = HTML4.ENTITY(Atom.atom "lt") val gt = HTML4.ENTITY(Atom.atom "gt") val amp = HTML4.ENTITY(Atom.atom "amp") val quot = HTML4.ENTITY(Atom.atom "quot") val cent = HTML4.ENTITY(Atom.atom "cent") val pound = HTML4.ENTITY(Atom.atom "pound") val yen = HTML4.ENTITY(Atom.atom "yen") val euro = HTML4.ENTITY(Atom.atom "euro") val copy = HTML4.ENTITY(Atom.atom "copy") val reg = HTML4.ENTITY(Atom.atom "reg") (* TODO: add the full set of HTML entities *) end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-lex-test-toks.sml���������������������������0000664�0000000�0000000�00000047322�14162643450�0025500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-lex-test-toks.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure HTML4Tokens = struct datatype token = EOF | OPENTAG of Atom.atom * HTML4Utils.tag_payload | CLOSETAG of Atom.atom | COMMENT of string | PCDATA of string | DOCTYPE of string | CHAR_REF of IntInf.int | ENTITY_REF of Atom.atom | XML_PROCESSING of string (* HTML 4 element tokens. *) | STARTA of HTML4Utils.tag_payload | ENDA | STARTABBR of HTML4Utils.tag_payload | ENDABBR | STARTACRONYM of HTML4Utils.tag_payload | ENDACRONYM | STARTADDRESS of HTML4Utils.tag_payload | ENDADDRESS | STARTAPPLET of HTML4Utils.tag_payload | ENDAPPLET | STARTAREA of HTML4Utils.tag_payload (* No END tag for AREA element. *) | STARTB of HTML4Utils.tag_payload | ENDB | STARTBASE of HTML4Utils.tag_payload (* No END tag for BASE element. *) | STARTBASEFONT of HTML4Utils.tag_payload (* No END tag for BASEFONT element. *) | STARTBDO of HTML4Utils.tag_payload | ENDBDO | STARTBIG of HTML4Utils.tag_payload | ENDBIG | STARTBLOCKQUOTE of HTML4Utils.tag_payload | ENDBLOCKQUOTE | STARTBODY of HTML4Utils.tag_payload | ENDBODY | STARTBR of HTML4Utils.tag_payload (* No END tag for BR element. *) | STARTBUTTON of HTML4Utils.tag_payload | ENDBUTTON | STARTCAPTION of HTML4Utils.tag_payload | ENDCAPTION | STARTCENTER of HTML4Utils.tag_payload | ENDCENTER | STARTCITE of HTML4Utils.tag_payload | ENDCITE | STARTCODE of HTML4Utils.tag_payload | ENDCODE | STARTCOL of HTML4Utils.tag_payload (* No END tag for COL element. *) | STARTCOLGROUP of HTML4Utils.tag_payload | ENDCOLGROUP | STARTDD of HTML4Utils.tag_payload | ENDDD | STARTDEL of HTML4Utils.tag_payload | ENDDEL | STARTDFN of HTML4Utils.tag_payload | ENDDFN | STARTDIR of HTML4Utils.tag_payload | ENDDIR | STARTDIV of HTML4Utils.tag_payload | ENDDIV | STARTDL of HTML4Utils.tag_payload | ENDDL | STARTDT of HTML4Utils.tag_payload | ENDDT | STARTEM of HTML4Utils.tag_payload | ENDEM | STARTFIELDSET of HTML4Utils.tag_payload | ENDFIELDSET | STARTFONT of HTML4Utils.tag_payload | ENDFONT | STARTFORM of HTML4Utils.tag_payload | ENDFORM | STARTFRAME of HTML4Utils.tag_payload (* No END tag for FRAME element. *) | STARTFRAMESET of HTML4Utils.tag_payload | ENDFRAMESET | STARTH1 of HTML4Utils.tag_payload | ENDH1 | STARTH2 of HTML4Utils.tag_payload | ENDH2 | STARTH3 of HTML4Utils.tag_payload | ENDH3 | STARTH4 of HTML4Utils.tag_payload | ENDH4 | STARTH5 of HTML4Utils.tag_payload | ENDH5 | STARTH6 of HTML4Utils.tag_payload | ENDH6 | STARTHEAD of HTML4Utils.tag_payload | ENDHEAD | STARTHR of HTML4Utils.tag_payload (* No END tag for HR element. *) | STARTHTML of HTML4Utils.tag_payload | ENDHTML | STARTI of HTML4Utils.tag_payload | ENDI | STARTIFRAME of HTML4Utils.tag_payload | ENDIFRAME | STARTIMG of HTML4Utils.tag_payload (* No END tag for IMG element. *) | STARTINPUT of HTML4Utils.tag_payload (* No END tag for INPUT element. *) | STARTINS of HTML4Utils.tag_payload | ENDINS | STARTISINDEX of HTML4Utils.tag_payload (* No END tag for ISINDEX element. *) | STARTKBD of HTML4Utils.tag_payload | ENDKBD | STARTLABEL of HTML4Utils.tag_payload | ENDLABEL | STARTLEGEND of HTML4Utils.tag_payload | ENDLEGEND | STARTLI of HTML4Utils.tag_payload | ENDLI | STARTLINK of HTML4Utils.tag_payload (* No END tag for LINK element. *) | STARTMAP of HTML4Utils.tag_payload | ENDMAP | STARTMENU of HTML4Utils.tag_payload | ENDMENU | STARTMETA of HTML4Utils.tag_payload (* No END tag for META element. *) | STARTNOFRAMES of HTML4Utils.tag_payload | ENDNOFRAMES | STARTNOSCRIPT of HTML4Utils.tag_payload | ENDNOSCRIPT | STARTOBJECT of HTML4Utils.tag_payload | ENDOBJECT | STARTOL of HTML4Utils.tag_payload | ENDOL | STARTOPTGROUP of HTML4Utils.tag_payload | ENDOPTGROUP | STARTOPTION of HTML4Utils.tag_payload | ENDOPTION | STARTP of HTML4Utils.tag_payload | ENDP | STARTPARAM of HTML4Utils.tag_payload (* No END tag for PARAM element. *) | STARTPRE of HTML4Utils.tag_payload | ENDPRE | STARTQ of HTML4Utils.tag_payload | ENDQ | STARTS of HTML4Utils.tag_payload | ENDS | STARTSAMP of HTML4Utils.tag_payload | ENDSAMP | STARTSCRIPT of HTML4Utils.tag_payload | ENDSCRIPT | STARTSELECT of HTML4Utils.tag_payload | ENDSELECT | STARTSMALL of HTML4Utils.tag_payload | ENDSMALL | STARTSPAN of HTML4Utils.tag_payload | ENDSPAN | STARTSTRIKE of HTML4Utils.tag_payload | ENDSTRIKE | STARTSTRONG of HTML4Utils.tag_payload | ENDSTRONG | STARTSTYLE of HTML4Utils.tag_payload | ENDSTYLE | STARTSUB of HTML4Utils.tag_payload | ENDSUB | STARTSUP of HTML4Utils.tag_payload | ENDSUP | STARTTABLE of HTML4Utils.tag_payload | ENDTABLE | STARTTBODY of HTML4Utils.tag_payload | ENDTBODY | STARTTD of HTML4Utils.tag_payload | ENDTD | STARTTEXTAREA of HTML4Utils.tag_payload | ENDTEXTAREA | STARTTFOOT of HTML4Utils.tag_payload | ENDTFOOT | STARTTH of HTML4Utils.tag_payload | ENDTH | STARTTHEAD of HTML4Utils.tag_payload | ENDTHEAD | STARTTITLE of HTML4Utils.tag_payload | ENDTITLE | STARTTR of HTML4Utils.tag_payload | ENDTR | STARTTT of HTML4Utils.tag_payload | ENDTT | STARTU of HTML4Utils.tag_payload | ENDU | STARTUL of HTML4Utils.tag_payload | ENDUL | STARTVAR of HTML4Utils.tag_payload | ENDVAR fun tokToString EOF = "EOF" | tokToString (OPENTAG (tagname, tagdata)) = String.concat ["OPENTAG ", Atom.toString tagname, " ", HTML4Utils.payloadToStr tagdata] | tokToString (CLOSETAG tagname) = "CLOSETAG " ^ (Atom.toString tagname) | tokToString (DOCTYPE docdata) = "DOCTYPE " ^ docdata | tokToString (PCDATA pcdata) = ("PCDATA \"" ^ (String.toString pcdata) ^ "\"") | tokToString (COMMENT comment) = "COMMENT " ^ comment | tokToString (CHAR_REF refint) = "CHAR REF " ^ (IntInf.toString refint) | tokToString (ENTITY_REF refatom) = "ENTITY REF " ^ (Atom.toString refatom) | tokToString (XML_PROCESSING directive) = "XML DIRECTIVE " ^ directive (* Automatically generated via helper.py: *) | tokToString (STARTA payload) = "STARTA " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDA = "ENDA" | tokToString (STARTABBR payload) = "STARTABBR " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDABBR = "ENDABBR" | tokToString (STARTACRONYM payload) = "STARTACRONYM " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDACRONYM = "ENDACRONYM" | tokToString (STARTADDRESS payload) = "STARTADDRESS " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDADDRESS = "ENDADDRESS" | tokToString (STARTAREA payload) = "STARTAREA " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTB payload) = "STARTB " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDB = "ENDB" | tokToString (STARTBASE payload) = "STARTBASE " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTBDO payload) = "STARTBDO " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDBDO = "ENDBDO" | tokToString (STARTBIG payload) = "STARTBIG " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDBIG = "ENDBIG" | tokToString (STARTBLOCKQUOTE payload) = "STARTBLOCKQUOTE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDBLOCKQUOTE = "ENDBLOCKQUOTE" | tokToString (STARTBODY payload) = "STARTBODY " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDBODY = "ENDBODY" | tokToString (STARTBR payload) = "STARTBR " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTBUTTON payload) = "STARTBUTTON " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDBUTTON = "ENDBUTTON" | tokToString (STARTCAPTION payload) = "STARTCAPTION " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDCAPTION = "ENDCAPTION" | tokToString (STARTCITE payload) = "STARTCITE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDCITE = "ENDCITE" | tokToString (STARTCODE payload) = "STARTCODE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDCODE = "ENDCODE" | tokToString (STARTCOL payload) = "STARTCOL " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTCOLGROUP payload) = "STARTCOLGROUP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDCOLGROUP = "ENDCOLGROUP" | tokToString (STARTDD payload) = "STARTDD " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDD = "ENDDD" | tokToString (STARTDEL payload) = "STARTDEL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDEL = "ENDDEL" | tokToString (STARTDFN payload) = "STARTDFN " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDFN = "ENDDFN" | tokToString (STARTDIV payload) = "STARTDIV " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDIV = "ENDDIV" | tokToString (STARTDL payload) = "STARTDL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDL = "ENDDL" | tokToString (STARTDT payload) = "STARTDT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDT = "ENDDT" | tokToString (STARTEM payload) = "STARTEM " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDEM = "ENDEM" | tokToString (STARTFIELDSET payload) = "STARTFIELDSET " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDFIELDSET = "ENDFIELDSET" | tokToString (STARTFORM payload) = "STARTFORM " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDFORM = "ENDFORM" | tokToString (STARTH1 payload) = "STARTH1 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH1 = "ENDH1" | tokToString (STARTH2 payload) = "STARTH2 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH2 = "ENDH2" | tokToString (STARTH3 payload) = "STARTH3 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH3 = "ENDH3" | tokToString (STARTH4 payload) = "STARTH4 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH4 = "ENDH4" | tokToString (STARTH5 payload) = "STARTH5 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH5 = "ENDH5" | tokToString (STARTH6 payload) = "STARTH6 " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDH6 = "ENDH6" | tokToString (STARTHEAD payload) = "STARTHEAD " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDHEAD = "ENDHEAD" | tokToString (STARTHR payload) = "STARTHR " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTHTML payload) = "STARTHTML " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDHTML = "ENDHTML" | tokToString (STARTI payload) = "STARTI " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDI = "ENDI" | tokToString (STARTIMG payload) = "STARTIMG " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTINPUT payload) = "STARTINPUT " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTINS payload) = "STARTINS " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDINS = "ENDINS" | tokToString (STARTKBD payload) = "STARTKBD " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDKBD = "ENDKBD" | tokToString (STARTLABEL payload) = "STARTLABEL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDLABEL = "ENDLABEL" | tokToString (STARTLEGEND payload) = "STARTLEGEND " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDLEGEND = "ENDLEGEND" | tokToString (STARTLI payload) = "STARTLI " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDLI = "ENDLI" | tokToString (STARTLINK payload) = "STARTLINK " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTMAP payload) = "STARTMAP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDMAP = "ENDMAP" | tokToString (STARTMETA payload) = "STARTMETA " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTNOSCRIPT payload) = "STARTNOSCRIPT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDNOSCRIPT = "ENDNOSCRIPT" | tokToString (STARTOBJECT payload) = "STARTOBJECT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDOBJECT = "ENDOBJECT" | tokToString (STARTOL payload) = "STARTOL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDOL = "ENDOL" | tokToString (STARTOPTGROUP payload) = "STARTOPTGROUP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDOPTGROUP = "ENDOPTGROUP" | tokToString (STARTOPTION payload) = "STARTOPTION " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDOPTION = "ENDOPTION" | tokToString (STARTP payload) = "STARTP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDP = "ENDP" | tokToString (STARTPARAM payload) = "STARTPARAM " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTPRE payload) = "STARTPRE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDPRE = "ENDPRE" | tokToString (STARTQ payload) = "STARTQ " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDQ = "ENDQ" | tokToString (STARTSAMP payload) = "STARTSAMP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSAMP = "ENDSAMP" | tokToString (STARTSCRIPT payload) = "STARTSCRIPT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSCRIPT = "ENDSCRIPT" | tokToString (STARTSELECT payload) = "STARTSELECT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSELECT = "ENDSELECT" | tokToString (STARTSMALL payload) = "STARTSMALL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSMALL = "ENDSMALL" | tokToString (STARTSPAN payload) = "STARTSPAN " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSPAN = "ENDSPAN" | tokToString (STARTSTRONG payload) = "STARTSTRONG " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSTRONG = "ENDSTRONG" | tokToString (STARTSTYLE payload) = "STARTSTYLE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSTYLE = "ENDSTYLE" | tokToString (STARTSUB payload) = "STARTSUB " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSUB = "ENDSUB" | tokToString (STARTSUP payload) = "STARTSUP " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSUP = "ENDSUP" | tokToString (STARTTABLE payload) = "STARTTABLE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTABLE = "ENDTABLE" | tokToString (STARTTBODY payload) = "STARTTBODY " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTBODY = "ENDTBODY" | tokToString (STARTTD payload) = "STARTTD " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTD = "ENDTD" | tokToString (STARTTEXTAREA payload) = "STARTTEXTAREA " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTEXTAREA = "ENDTEXTAREA" | tokToString (STARTTFOOT payload) = "STARTTFOOT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTFOOT = "ENDTFOOT" | tokToString (STARTTH payload) = "STARTTH " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTH = "ENDTH" | tokToString (STARTTHEAD payload) = "STARTTHEAD " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTHEAD = "ENDTHEAD" | tokToString (STARTTITLE payload) = "STARTTITLE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTITLE = "ENDTITLE" | tokToString (STARTTR payload) = "STARTTR " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTR = "ENDTR" | tokToString (STARTTT payload) = "STARTTT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDTT = "ENDTT" | tokToString (STARTUL payload) = "STARTUL " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDUL = "ENDUL" | tokToString (STARTVAR payload) = "STARTVAR " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDVAR = "ENDVAR" | tokToString (STARTAPPLET payload) = "STARTAPPLET " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDAPPLET = "ENDAPPLET" | tokToString (STARTBASEFONT payload) = "STARTBASEFONT " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTCENTER payload) = "STARTCENTER " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDCENTER = "ENDCENTER" | tokToString (STARTDIR payload) = "STARTDIR " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDDIR = "ENDDIR" | tokToString (STARTFONT payload) = "STARTFONT " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDFONT = "ENDFONT" | tokToString (STARTIFRAME payload) = "STARTIFRAME " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDIFRAME = "ENDIFRAME" | tokToString (STARTISINDEX payload) = "STARTISINDEX " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTMENU payload) = "STARTMENU " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDMENU = "ENDMENU" | tokToString (STARTS payload) = "STARTS " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDS = "ENDS" | tokToString (STARTSTRIKE payload) = "STARTSTRIKE " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDSTRIKE = "ENDSTRIKE" | tokToString (STARTU payload) = "STARTU " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDU = "ENDU" | tokToString (STARTFRAME payload) = "STARTFRAME " ^ (HTML4Utils.payloadToStr payload) | tokToString (STARTFRAMESET payload) = "STARTFRAMESET " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDFRAMESET = "ENDFRAMESET" | tokToString (STARTNOFRAMES payload) = "STARTNOFRAMES " ^ (HTML4Utils.payloadToStr payload) | tokToString ENDNOFRAMES = "ENDNOFRAMES" (* Should cause a "match redundant" error if code is all in synch: *) (* | tokToString _ = "???" *) end (* ______________________________________________________________________ End of html4-lex-test-toks.sml ______________________________________________________________________ *) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-lex-test.cm���������������������������������0000664�0000000�0000000�00000001035�14162643450�0024315�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-lex-test.cm * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Group is $/basis.cm $/smlnj-lib.cm $/ml-lpt-lib.cm html4-utils.sml html4-lex-test-toks.sml html4-attr.l : ml-ulex html4-attr.g : ml-antlr html4-token-utils.sml html4.l : ml-ulex html4-lex-test.sml (* ______________________________________________________________________ End of html4-lex-test.cm ______________________________________________________________________ *) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-lex-test.sml��������������������������������0000664�0000000�0000000�00000002620�14162643450�0024512�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-lex-test.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure Test = struct open HTML4Tokens fun handle_tok tok = print ((tokToString tok) ^ "\n") fun handle_toks (source_map, lex_stream) = let val (tok, span, lex_stream') = HTML4Lexer.lex source_map lex_stream handle ex => (print ("Exception at " ^ (Int.toString (HTML4Lexer.getPos lex_stream)) ^ "\n"); raise ex) in handle_tok tok; (* XXX Getting some weird equality type complaint if I use the equality operator here... *) case tok of EOF => () | _ => handle_toks(source_map, lex_stream') end fun handle_file file_name = let val source_map = AntlrStreamPos.mkSourcemap () val in_strm = TextIO.openIn file_name val lex_strm = HTML4Lexer.streamifyInstream in_strm val _ = handle_toks(source_map, lex_strm) handle ex => (TextIO.closeIn in_strm; raise ex) in TextIO.closeIn in_strm end fun main (_, args) = (List.app handle_file args; OS.Process.success) end (* ______________________________________________________________________ End of html4-lex-test.sml ______________________________________________________________________ *) ����������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-lib.cm��������������������������������������0000664�0000000�0000000�00000001706�14162643450�0023323�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-lib.cm * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * CM file for the HTML4 library. *) Library signature HTML4 structure HTML4 structure HTML4Attrs structure HTML4Entities structure HTML4Parser structure HTML4Tokens structure HTML4TokenUtils structure HTML4Utils structure HTML4Print is $/basis.cm $/smlnj-lib.cm $/ml-lpt-lib.cm $/pp-lib.cm pp-init.sml #if defined(NO_PLUGINS) html4.g.sml html4.l.sml html4-attr.g.sml html4-attr.l.sml #else html4.g : ml-antlr html4.l : ml-ulex html4-attr.g : ml-antlr html4-attr.l : ml-ulex #endif html4.sig html4.sml html4-attrs.sml html4-entities.sml html4-parser.sml html4-print.sml html4-token-utils.sml html4-utils.sml (* ______________________________________________________________________ End of html4-lib.cm ______________________________________________________________________ *) ����������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-lib.mlb�������������������������������������0000664�0000000�0000000�00000036115�14162643450�0023500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ann "nonexhaustiveBind ignore" "nonexhaustiveMatch ignore" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l14 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l4 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis l53 = bas (* $/ml-lpt-lib.cm ====> *) $(SML_LIB)/mllpt-lib/mllpt-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in signature gs_0 = ORD_MAP end local open l4 in functor gs_1 = RedBlackMapFn end local open l4 in structure gs_2 = Atom end local open l14 in structure gs_3 = CharVectorSlice end local open l14 in structure gs_4 = TextIO end local open l14 in structure gs_5 = Char structure gs_6 = CharArray structure gs_7 = CharVector structure gs_8 = FixedInt structure gs_9 = General structure gs_10 = Int structure gs_11 = Int32 structure gs_12 = Int64 structure gs_13 = IntInf structure gs_14 = LargeInt structure gs_15 = LargeReal structure gs_16 = LargeWord structure gs_17 = OS structure gs_18 = Position structure gs_19 = Real structure gs_20 = Real64 structure gs_21 = RealArray structure gs_22 = RealArraySlice structure gs_23 = RealVector structure gs_24 = RealVectorSlice structure gs_25 = SMLofNJ structure gs_26 = Socket structure gs_27 = String structure gs_28 = Substring structure gs_29 = SysWord structure gs_30 = Time structure gs_31 = Word structure gs_32 = Word32 structure gs_33 = Word64 structure gs_34 = Word8 end local open l53 in structure gs_35 = AntlrStreamPos end local open l53 in functor gs_36 = AntlrErrHandler end local open l14 in structure gs_37 = List end local open l53 in signature gs_38 = ANTLR_LEXER end local structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-utils.sml in structure gs_39 = HTML4Utils end local signature ANTLR_LEXER = gs_38 functor AntlrErrHandler = gs_36 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure HTML4Utils = gs_39 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure List = gs_37 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4.g.sml in functor gs_40 = HTML4ParseFn structure gs_41 = HTML4Tokens end local signature ANTLR_LEXER = gs_38 functor AntlrErrHandler = gs_36 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure List = gs_37 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-attr.g.sml in functor gs_42 = HTML4AttrParseFn structure gs_43 = HTML4AttrTokens end local open l14 in structure gs_44 = Vector end local open l53 in structure gs_45 = UTF8 end local open l53 in structure gs_46 = ULexBuffer end local structure AntlrStreamPos = gs_35 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 functor HTML4AttrParseFn = gs_42 structure HTML4AttrTokens = gs_43 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure List = gs_37 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure TextIO = gs_4 structure Time = gs_30 structure ULexBuffer = gs_46 structure UTF8 = gs_45 structure Vector = gs_44 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-attr.l.sml in structure gs_47 = HTML4AttrLexer end local structure AntlrStreamPos = gs_35 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure CharVectorSlice = gs_3 structure FixedInt = gs_8 structure General = gs_9 structure HTML4AttrLexer = gs_47 functor HTML4AttrParseFn = gs_42 structure HTML4AttrTokens = gs_43 functor HTML4ParseFn = gs_40 structure HTML4Tokens = gs_41 structure HTML4Utils = gs_39 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 signature ORD_MAP = gs_0 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 functor RedBlackMapFn = gs_1 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure TextIO = gs_4 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-token-utils.sml in structure gs_48 = HTML4TokenUtils end local structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4.sig in signature gs_49 = HTML4 end local structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 signature HTML4 = gs_49 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4.sml in structure gs_50 = HTML4 end local open l14 in structure gs_51 = Option end local open l14 in structure gs_52 = StringCvt end local structure AntlrStreamPos = gs_35 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure HTML4TokenUtils = gs_48 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure List = gs_37 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure StringCvt = gs_52 structure Substring = gs_28 structure SysWord = gs_29 structure TextIO = gs_4 structure Time = gs_30 structure ULexBuffer = gs_46 structure UTF8 = gs_45 structure Vector = gs_44 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4.l.sml in structure gs_53 = HTML4Lexer end local structure AntlrStreamPos = gs_35 structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure General = gs_9 structure HTML4 = gs_50 structure HTML4Lexer = gs_53 functor HTML4ParseFn = gs_40 structure HTML4TokenUtils = gs_48 structure HTML4Tokens = gs_41 structure HTML4Utils = gs_39 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure OS = gs_17 structure Option = gs_51 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure TextIO = gs_4 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-parser.sml in structure gs_54 = HTML4Parser end local open l4 in structure gs_55 = Format end local structure Atom = gs_2 structure Char = gs_5 structure CharArray = gs_6 structure CharVector = gs_7 structure FixedInt = gs_8 structure Format = gs_55 structure General = gs_9 structure HTML4 = gs_50 structure Int = gs_10 structure Int32 = gs_11 structure Int64 = gs_12 structure IntInf = gs_13 structure LargeInt = gs_14 structure LargeReal = gs_15 structure LargeWord = gs_16 structure List = gs_37 structure OS = gs_17 structure Position = gs_18 structure Real = gs_19 structure Real64 = gs_20 structure RealArray = gs_21 structure RealArraySlice = gs_22 structure RealVector = gs_23 structure RealVectorSlice = gs_24 structure SMLofNJ = gs_25 structure Socket = gs_26 structure String = gs_27 structure Substring = gs_28 structure SysWord = gs_29 structure Time = gs_30 structure Word = gs_31 structure Word32 = gs_32 structure Word64 = gs_33 structure Word8 = gs_34 html4-print.sml in structure gs_56 = HTML4Print end local structure Atom = gs_2 structure HTML4 = gs_50 html4-entities.sml in structure gs_57 = HTML4Entities end local structure Atom = gs_2 html4-attrs.sml in structure gs_58 = HTML4Attrs end in signature HTML4 = gs_49 structure HTML4 = gs_50 structure HTML4Attrs = gs_58 structure HTML4Entities = gs_57 structure HTML4Parser = gs_54 structure HTML4Print = gs_56 structure HTML4TokenUtils = gs_48 structure HTML4Tokens = gs_41 structure HTML4Utils = gs_39 end end end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-parser.sml����������������������������������0000664�0000000�0000000�00000073134�14162643450�0024251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-parser.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Defines the HTML4Parser structure, which defunctorizes the * automatically generated parser, defines an additional set of * utilities for working with the parser. *) structure HTML4Parser = struct structure H4 = HTML4 structure H4U = HTML4Utils structure H4T = HTML4Tokens structure H4TU = HTML4TokenUtils structure AtomMap = H4TU.AtomMap local structure TheParser = HTML4ParseFn(HTML4Lexer) in open TheParser end fun parseStream inStream = let val sourceMap = AntlrStreamPos.mkSourcemap () val lex = HTML4Lexer.lex sourceMap val stream = HTML4Lexer.streamifyInstream inStream val (result, _, _) = parse lex stream in result end exception IllFormedHTMLParseStream of H4T.token H4U.parsevisitation H4U.stream * string option val tokVisitationToString = H4U.visitationToString H4T.toString val strVisitationToString = H4U.visitationToString (fn x : string => x) val visitationSimilar = let fun tokSimilarToString (tok1, tokStr2) = (H4T.toString tok1) = tokStr2 in H4U.visitationSame tokSimilarToString end fun expect expectedVisit pstrm = let val pstrmHd = H4U.stream_hd pstrm handle _ => H4U.VisitT H4T.EOF fun expectationError () = let val msg = String.concat ["Expected ", strVisitationToString expectedVisit, ", got ", tokVisitationToString pstrmHd, " instead."] in IllFormedHTMLParseStream(pstrm, SOME msg) end in if visitationSimilar(pstrmHd, expectedVisit) then H4U.stream_tl pstrm else raise (expectationError()) end fun expectEnterNT nt = expect (H4U.EnterNT (Atom.atom nt)) fun expectExitNT nt = expect (H4U.ExitNT (Atom.atom nt)) fun expectVisitT tokStr = expect (H4U.VisitT tokStr) fun expectEnterNTInDomain ntMap pstrm = let val pstrmHd = H4U.stream_hd pstrm handle _ => H4U.VisitT H4T.EOF fun expectationError () = let val expectedNTs = String.concatWith ", " (map Atom.toString (AtomMap.listKeys ntMap)) val msg = String.concat [ "Expected entry of one of ", expectedNTs, "; got ", tokVisitationToString pstrmHd, " instead." ] in IllFormedHTMLParseStream(pstrm, SOME msg) end in case pstrmHd of H4U.EnterNT ntAtom => if AtomMap.inDomain (ntMap, ntAtom) then AtomMap.lookup (ntMap, ntAtom) else raise (expectationError ()) | _ => raise (expectationError ()) (* end case *) end fun optional optVisit (strm as H4U.StreamCons(strmHd, _)) = if visitationSimilar(strmHd, optVisit) then (H4U.stream_tl strm, SOME strmHd) else (strm, NONE) | optional _ _ = (H4U.StreamNil, NONE) fun optVisitTok tokName strm = case optional (H4U.VisitT tokName) strm of (strm', SOME (H4U.VisitT tok)) => (strm', SOME tok) | _ => (strm, NONE) fun isEnterNT nt pstrm = (expectEnterNT nt pstrm; true) handle IllFormedHTMLParseStream _ => false fun isExitNT nt pstrm = (expectExitNT nt pstrm; true) handle IllFormedHTMLParseStream _ => false fun isVisitT tokStr pstrm = (expectVisitT tokStr pstrm; true) handle IllFormedHTMLParseStream _ => false fun isEither (is1, is2) pstrm = (is1 pstrm) orelse (is2 pstrm) fun streamSkipUntil _ H4U.StreamNil = H4U.StreamNil | streamSkipUntil pred (strm as H4U.StreamCons (strmHd, _)) = if pred strmHd then strm else streamSkipUntil pred (H4U.stream_tl strm) fun streamSkipWhile pred = streamSkipUntil (fn strmHd => not (pred strmHd)) fun streamConsumeUntil consumer until strm = let fun streamConsumeUntil' strm' acc = if until strm' then (strm', rev acc) else let val (strm'', consumerVal) = consumer strm' in streamConsumeUntil' strm'' (consumerVal :: acc) end in streamConsumeUntil' strm [] end fun tokIsSpace (H4T.PCDATA pcstr) = CharVector.all Char.isSpace pcstr | tokIsSpace _ = false fun tokIsComment (H4T.COMMENT _) = true | tokIsComment _ = false fun visitationIsSpace (H4U.VisitT tok) = tokIsSpace tok | visitationIsSpace _ = false (* XXX I don't like the solution of skipping both whitespace and comments, but I don't know how to munge CDATA and comments into block elements, given the current HTML 4 data structure (I could add these, but it would break the "purity" of the existing data type). *) fun visitationIsSpaceOrComment (H4U.VisitT tok) = (tokIsSpace tok) orelse (tokIsComment tok) | visitationIsSpaceOrComment _ = false val skipWhitespace = streamSkipWhile visitationIsSpace val skipWhitespaceOrComment = streamSkipWhile visitationIsSpaceOrComment fun tokIsCdata (H4T.PCDATA _) = true | tokIsCdata (H4T.ENTITY_REF _) = true | tokIsCdata (H4T.CHAR_REF _) = true | tokIsCdata (H4T.COMMENT _) = true | tokIsCdata _ = false fun isNotCdata (H4U.StreamCons(H4U.VisitT tok, _)) = not (tokIsCdata tok) | isNotCdata _ = true exception InvalidToken of H4T.token fun tokToCdata (H4T.PCDATA str) = H4.PCDATA str | tokToCdata (H4T.ENTITY_REF ent) = H4.ENTITY ent | tokToCdata (H4T.CHAR_REF chr) = H4.CHAR chr | tokToCdata (H4T.COMMENT cmt) = H4.COMMENT cmt | tokToCdata tok = raise (InvalidToken tok) (*+DEBUG*) fun tokToString (H4T.DOCTYPE doctypeStr) = doctypeStr | tokToString (H4T.PCDATA dataStr) = ("PCDATA \"" ^ (String.toString dataStr) ^ "\"") | tokToString (H4T.COMMENT commentStr) = commentStr | tokToString tok = H4TU.tokToString tok fun printVisitationStream strm = print ((H4U.visitationToString tokToString (H4U.stream_hd strm)) ^ "\n") fun printIllFormedErr (IllFormedHTMLParseStream (strm, msgOpt)) = ( print "Error in parse stream at: "; printVisitationStream strm; (case msgOpt of SOME msg => print(concat["Message: ", msg, "\n"]) | _ => ())) | printIllFormedErr exn = raise exn (*-DEBUG*) fun getAttrsFromStream (H4U.StreamCons (H4U.VisitT tok, _)) = (case H4TU.tokGetAttrs tok of SOME attrs => attrs | NONE => []) | getAttrsFromStream _ = [] fun html0aryFromParseStream tag ctor pstrm = let val pstrm1 = expectEnterNT tag pstrm val pstrm2 = expectVisitT ("START" ^ tag) pstrm1 val attrs = getAttrsFromStream pstrm1 val pstrm3 = expectExitNT tag (skipWhitespaceOrComment pstrm2) in (pstrm3, SOME (ctor attrs)) end fun listOfOptsToList lst = map Option.valOf lst (*DEBUG*) handle ex => raise ex fun htmlNaryFromParseStream tag ctor childFromParseStream pstrm0 = let val endTag = "END" ^ tag val pstrm1 = expectEnterNT tag pstrm0 val pstrm2 = expectVisitT ("START" ^ tag) pstrm1 val attrs = getAttrsFromStream pstrm1 val (pstrm3, children) = streamConsumeUntil childFromParseStream (isEither (isVisitT endTag, isExitNT tag)) (skipWhitespaceOrComment pstrm2) val (pstrm4, _) = optVisitTok endTag pstrm3 val pstrm5 = expectExitNT tag (skipWhitespaceOrComment pstrm4) in (pstrm5, SOME (ctor (attrs, listOfOptsToList children))) end type parseVisitStream = H4T.token H4U.parsevisitation H4U.stream (* FIXME: might as well use AtomTable.hash_table for these, since we are initializing them later *) val headContentNTMap : (parseVisitStream -> parseVisitStream * H4.head_content option) AtomMap.map ref = ref AtomMap.empty val blockNTMap : (parseVisitStream -> parseVisitStream * H4.block option) AtomMap.map ref = ref AtomMap.empty val inlineNTMap : (parseVisitStream -> parseVisitStream * H4.inline option) AtomMap.map ref = ref AtomMap.empty val tableDataNTMap : (parseVisitStream -> parseVisitStream * H4.table_data option) AtomMap.map ref = ref AtomMap.empty fun cvtBlock ctor (SOME block) = SOME (ctor block) | cvtBlock _ NONE = NONE fun cvtInline ctor (SOME inline) = SOME (ctor inline) | cvtInline _ NONE = NONE fun cvtFlow ctor (SOME flow) = SOME (ctor flow) | cvtFlow _ _ = NONE fun cvtOption ctor (SOME htmlopt) = SOME (ctor htmlopt) | cvtOption _ _ = NONE fun cvtParam ctor (SOME param) = SOME (ctor param) | cvtParam _ _ = NONE fun cvtFrameset ctor (SOME frameset) = SOME (ctor frameset) | cvtFrameset _ NONE = NONE fun cvtScript ctor (SOME script) = SOME (ctor script) | cvtScript _ _ = NONE fun cdataFromParseStream pstrm = if isNotCdata pstrm then raise (IllFormedHTMLParseStream(pstrm, SOME "Expected character data.")) else let val pstrmHd = H4U.stream_hd pstrm val pstrmTl = H4U.stream_tl pstrm in case pstrmHd of H4U.VisitT tok => (pstrmTl, SOME (tokToCdata tok)) | _ => (pstrmTl, NONE) end fun htmlFromParseStream pstrm0 = let val pstrm1 = (skipWhitespaceOrComment o (expectEnterNT "DOCUMENT")) pstrm0 val (pstrm2, doctypeTokOpt) = optVisitTok "DOCTYPE" pstrm1 val theVersion = (case doctypeTokOpt of SOME (H4T.DOCTYPE doctype) => SOME doctype | _ => NONE) val (pstrm3, starthtmlTokOpt) = optVisitTok "STARTHTML" (skipWhitespaceOrComment pstrm2) val (pstrm4, headDataListOpt) = headFromParseStream (skipWhitespaceOrComment pstrm3) in if not (isSome headDataListOpt) then (pstrm4, NONE) else (case bodyOrFramesetFromParseStream pstrm4 of (pstrm5, SOME content) => let val (pstrm6, _) = optVisitTok "ENDHTML" pstrm5 val pstrm7 = (skipWhitespaceOrComment o (expectExitNT "DOCUMENT") o skipWhitespaceOrComment) pstrm6 in ( pstrm7, SOME (H4.HTML{ version = theVersion, head = [], content = content }) ) end | (pstrm5, NONE) => (pstrm5, NONE) (* end case *)) end and headFromParseStream pstrm0 = let val pstrm1 = (skipWhitespaceOrComment o (expectEnterNT "HEAD")) pstrm0 val (pstrm2, startheadTokOpt) = optVisitTok "STARTHEAD" pstrm1 val (pstrm3, children) = streamConsumeUntil headContentFromParseStream (isEither(isExitNT "HEAD", isVisitT "ENDHEAD")) (skipWhitespaceOrComment pstrm2) val (pstrm4, _) = optVisitTok "ENDHEAD" pstrm3 val pstrm5 = expectExitNT "HEAD" (skipWhitespaceOrComment pstrm4) in (pstrm5, SOME (listOfOptsToList children)) end and headContentFromParseStream pstrm = let val ntFunc = expectEnterNTInDomain (!headContentNTMap) pstrm val (pstrm', resultOpt) = ntFunc pstrm in (skipWhitespaceOrComment pstrm', resultOpt) end and bodyOrFramesetFromParseStream pstrm = let fun cvtBody (SOME body) = SOME (H4.BodyOrFrameset_BODY body) | cvtBody _ = NONE in if isEnterNT "BODY" pstrm then let val (pstrm', bodyOpt) = bodyFromParseStream pstrm in (pstrm', cvtBody bodyOpt) end else let val (pstrm', framesetOpt) = framesetFromParseStream pstrm in (pstrm', cvtFrameset H4.BodyOrFrameset_FRAMESET framesetOpt) end end and bodyFromParseStream pstrm0 = let val pstrm1 = expectEnterNT "BODY" pstrm0 val (pstrm2, startbodyTokOpt) = optVisitTok "STARTBODY" pstrm1 val attrs = (case startbodyTokOpt of SOME startbody => (case H4TU.tokGetAttrs startbody of SOME attrs => attrs | NONE => [] (* end case *)) | NONE => [] (* end case *)) val (pstrm3, children) = streamConsumeUntil blockOrScriptFromParseStream (isEither(isExitNT "BODY", isVisitT "ENDBODY")) (skipWhitespaceOrComment pstrm2) val (pstrm4, _) = optVisitTok "ENDBODY" pstrm3 val pstrm5 = expectExitNT "BODY" (skipWhitespaceOrComment pstrm4) in (pstrm5, SOME (H4.BODY (attrs, listOfOptsToList children))) end and framesetFromParseStream pstrm0 = let val pstrm1 = expectEnterNT "FRAMESET" pstrm0 val pstrm2 = expectVisitT "STARTFRAMESET" pstrm1 val attrs = getAttrsFromStream pstrm1 val (pstrm3, children) = streamConsumeUntil framesetOrFrameFromParseStream (isEither(isVisitT "ENDFRAMESET", isEnterNT "NOFRAMES")) (skipWhitespaceOrComment pstrm2) val (pstrm4, noframesOpt) = if isEnterNT "NOFRAMES" pstrm3 then let val (pstrm4', noframesOpt') = noFramesFromParseStream pstrm3 in (skipWhitespaceOrComment pstrm4', noframesOpt') end else (pstrm3, NONE) val pstrm5 = expectVisitT "ENDFRAMESET" pstrm4 val pstrm6 = expectExitNT "FRAMESET" (skipWhitespaceOrComment pstrm5) in (pstrm6, SOME (H4.FRAMESET (attrs, listOfOptsToList children, noframesOpt))) end and framesetOrFrameFromParseStream pstrm0 = let val pstrm1 = skipWhitespaceOrComment pstrm0 val (pstrm2, result) = if isEnterNT "FRAMESET" pstrm1 then let val (pstrm', result') = framesetFromParseStream pstrm1 in (pstrm', cvtFrameset H4.FramesetOrFrame_FRAMESET result') end else html0aryFromParseStream "FRAME" H4.FRAME pstrm1 in (skipWhitespaceOrComment pstrm2, result) end and noFramesFromParseStream pstrm0 = let val pstrm1 = expectEnterNT "NOFRAMES" pstrm0 val pstrm2 = expectVisitT "STARTNOFRAMES" pstrm1 val attrs = getAttrsFromStream pstrm1 val (pstrm3, bodyOpt) = bodyFromParseStream pstrm2 val pstrm4 = expectVisitT "ENDNOFRAMES" pstrm3 val pstrm5 = expectExitNT "NOFRAMES" pstrm4 in (pstrm5, SOME (H4.NOFRAMES (attrs, valOf bodyOpt))) (* DEBUG *)handle ex => raise ex end and flowFromParseStream pstrm = let val pstrmHd = H4U.stream_hd pstrm fun procInline pstrm = let val (pstrm', result') = inlineFromParseStream pstrm in (pstrm', cvtInline H4.Flow_INLINE result') end in case pstrmHd of H4U.EnterNT ntAtom => if AtomMap.inDomain (!blockNTMap, ntAtom) then let val (pstrm', result') = blockFromParseStream pstrm in (pstrm', cvtBlock H4.Flow_BLOCK result') end else procInline pstrm | _ => procInline pstrm end and blockFromParseStream pstrm = (expectEnterNTInDomain (!blockNTMap) pstrm) pstrm and inlineFromParseStream pstrm = let val pstrmHd = H4U.stream_hd pstrm in case pstrmHd of H4U.VisitT tok => let val (pstrm', cdataOptList) = streamConsumeUntil cdataFromParseStream isNotCdata pstrm in (pstrm', SOME (H4.CDATA (listOfOptsToList cdataOptList))) end | _ => (expectEnterNTInDomain (!inlineNTMap) pstrm) pstrm end and listItemFromParseStream pstrm = htmlNaryFromParseStream "LI" H4.LI flowFromParseStream pstrm and scriptFromParseStream pstrm = htmlNaryFromParseStream "SCRIPT" H4.SCRIPT cdataFromParseStream pstrm and paramFromParseStream pstrm = html0aryFromParseStream "PARAM" H4.PARAM pstrm and legendFromParseStream pstrm = htmlNaryFromParseStream "LEGEND" H4.LEGEND inlineFromParseStream pstrm and defTermOrDescFromParseStream pstrm = if isEnterNT "DT" pstrm then htmlNaryFromParseStream "DT" H4.DT inlineFromParseStream pstrm else htmlNaryFromParseStream "DD" H4.DD flowFromParseStream pstrm and tableDataFromParseStream pstrm = (expectEnterNTInDomain (!tableDataNTMap) pstrm) pstrm and trFromParseStream pstrm = htmlNaryFromParseStream "TR" H4.TR thOrTdFromParseStream pstrm and thOrTdFromParseStream pstrm = if isEnterNT "TH" pstrm then htmlNaryFromParseStream "TH" H4.TH flowFromParseStream pstrm else htmlNaryFromParseStream "TD" H4.TD flowFromParseStream pstrm and optgroupOrOptionFromParseStream pstrm = if isEnterNT "OPTGROUP" pstrm then let fun parseOpt pstrm = (case htmlOptionFromParseStream pstrm of (pstrm', SOME(H4.OPTION stuff)) => (pstrm', SOME stuff) | (pstrm', _) => (pstrm', NONE) (* end case *)) in htmlNaryFromParseStream "OPTGROUP" H4.OPTGROUP parseOpt pstrm end else htmlOptionFromParseStream pstrm and htmlOptionFromParseStream pstrm = htmlNaryFromParseStream "OPTION" H4.OPTION cdataFromParseStream pstrm and flowOrParamFromParseStream pstrm = if isEnterNT "PARAM" pstrm then let val (pstrm', paramOpt) = paramFromParseStream pstrm in (pstrm', cvtParam H4.FlowOrParam_PARAM paramOpt) end else let val (pstrm', flowOpt) = flowFromParseStream pstrm in (pstrm', cvtFlow H4.FlowOrParam_FLOW flowOpt) end and blockOrScriptFromParseStream pstrm = if isEnterNT "SCRIPT" pstrm then let val (pstrm', scriptOpt) = scriptFromParseStream pstrm in (skipWhitespaceOrComment pstrm', cvtScript H4.BlockOrScript_SCRIPT scriptOpt) end else let val (pstrm', blockOpt) = blockFromParseStream pstrm in (skipWhitespaceOrComment pstrm', cvtBlock H4.BlockOrScript_BLOCK blockOpt) end and blockOrAreaFromParseStream pstrm = if isEnterNT "AREA" pstrm then html0aryFromParseStream "AREA" H4.AREA pstrm else let val (pstrm', blockOpt) = blockFromParseStream pstrm in (pstrm', cvtBlock H4.BlockOrArea_BLOCK blockOpt) end and headObjectFromParseStream pstrm = htmlNaryFromParseStream "OBJECT" H4.Head_OBJECT flowOrParamFromParseStream pstrm and headScriptFromParseStream pstrm = let val (pstrm', scriptOpt) = scriptFromParseStream pstrm in (pstrm', cvtScript H4.Head_SCRIPT scriptOpt) end val titleFromParseStream = htmlNaryFromParseStream "TITLE" H4.Head_TITLE cdataFromParseStream val baseFromParseStream = html0aryFromParseStream "BASE" H4.Head_BASE val metaFromParseStream = html0aryFromParseStream "META" H4.Head_META val linkFromParseStream = html0aryFromParseStream "LINK" H4.Head_LINK val pFromParseStream = htmlNaryFromParseStream "P" H4.P inlineFromParseStream val h1FromParseStream = htmlNaryFromParseStream "H1" H4.H1 inlineFromParseStream val h2FromParseStream = htmlNaryFromParseStream "H2" H4.H2 inlineFromParseStream val h3FromParseStream = htmlNaryFromParseStream "H3" H4.H3 inlineFromParseStream val h4FromParseStream = htmlNaryFromParseStream "H4" H4.H4 inlineFromParseStream val h5FromParseStream = htmlNaryFromParseStream "H5" H4.H5 inlineFromParseStream val h6FromParseStream = htmlNaryFromParseStream "H6" H4.H6 inlineFromParseStream val ulFromParseStream = htmlNaryFromParseStream "UL" H4.UL listItemFromParseStream val olFromParseStream = htmlNaryFromParseStream "OL" H4.OL listItemFromParseStream val dirFromParseStream = htmlNaryFromParseStream "DIR" H4.DIR listItemFromParseStream val menuFromParseStream = htmlNaryFromParseStream "MENU" H4.MENU listItemFromParseStream val preFromParseStream = (* XXX This will not properly track whitespace currently. *) htmlNaryFromParseStream "PRE" H4.PRE inlineFromParseStream val dlFromParseStream = htmlNaryFromParseStream "DL" H4.DL defTermOrDescFromParseStream val divFromParseStream = htmlNaryFromParseStream "DIV" H4.DIV flowFromParseStream val noscriptFromParseStream = htmlNaryFromParseStream "NOSCRIPT" H4.NOSCRIPT blockFromParseStream val blockquoteFromParseStream = htmlNaryFromParseStream "BLOCKQUOTE" H4.BLOCKQUOTE blockOrScriptFromParseStream val formFromParseStream = htmlNaryFromParseStream "FORM" H4.FORM blockOrScriptFromParseStream val hrFromParseStream = html0aryFromParseStream "HR" H4.HR val tableFromParseStream = htmlNaryFromParseStream "TABLE" H4.TABLE tableDataFromParseStream fun fieldsetFromParseStream pstrm0 = let val pstrm1 = expectEnterNT "FIELDSET" pstrm0 val pstrm2 = expectVisitT "STARTFIELDSET" pstrm1 val attrs = getAttrsFromStream pstrm1 val (pstrm3, legendOpt) = legendFromParseStream (skipWhitespaceOrComment pstrm2) val (pstrm4, flows) = streamConsumeUntil flowFromParseStream (isVisitT "ENDFIELDSET") pstrm3 val pstrm5 = expectVisitT "ENDFIELDSET" pstrm4 val pstrm6 = expectExitNT "FIELDSET" pstrm5 in (pstrm5, SOME (H4.FIELDSET (attrs, legendOpt, listOfOptsToList flows))) end val addressFromParseStream = htmlNaryFromParseStream "ADDRESS" H4.ADDRESS inlineFromParseStream val centerFromParseStream = htmlNaryFromParseStream "CENTER" H4.CENTER flowFromParseStream val isindexFromParseStream = html0aryFromParseStream "ISINDEX" H4.ISINDEX val ttFromParseStream = htmlNaryFromParseStream "TT" H4.TT inlineFromParseStream val iFromParseStream = htmlNaryFromParseStream "I" H4.I inlineFromParseStream val bFromParseStream = htmlNaryFromParseStream "B" H4.B inlineFromParseStream val bigFromParseStream = htmlNaryFromParseStream "BIG" H4.BIG inlineFromParseStream val smallFromParseStream = htmlNaryFromParseStream "SMALL" H4.SMALL inlineFromParseStream val uFromParseStream = htmlNaryFromParseStream "U" H4.U inlineFromParseStream val sFromParseStream = htmlNaryFromParseStream "S" H4.S inlineFromParseStream val strikeFromParseStream = htmlNaryFromParseStream "STRIKE" H4.STRIKE inlineFromParseStream val emFromParseStream = htmlNaryFromParseStream "EM" H4.EM inlineFromParseStream val strongFromParseStream = htmlNaryFromParseStream "STRONG" H4.STRONG inlineFromParseStream val dfnFromParseStream = htmlNaryFromParseStream "DFN" H4.DFN inlineFromParseStream val codeFromParseStream = htmlNaryFromParseStream "CODE" H4.CODE inlineFromParseStream val sampFromParseStream = htmlNaryFromParseStream "SAMP" H4.SAMP inlineFromParseStream val kbdFromParseStream = htmlNaryFromParseStream "KBD" H4.KBD inlineFromParseStream val varFromParseStream = htmlNaryFromParseStream "VAR" H4.VAR inlineFromParseStream val citeFromParseStream = htmlNaryFromParseStream "CITE" H4.CITE inlineFromParseStream val abbrFromParseStream = htmlNaryFromParseStream "ABBR" H4.ABBR inlineFromParseStream val acronymFromParseStream = htmlNaryFromParseStream "ACRONYM" H4.ACRONYM inlineFromParseStream val aFromParseStream = htmlNaryFromParseStream "A" H4.A inlineFromParseStream val imgFromParseStream = html0aryFromParseStream "IMG" H4.IMG val objectFromParseStream = htmlNaryFromParseStream "OBJECT" H4.OBJECT flowOrParamFromParseStream val brFromParseStream = html0aryFromParseStream "BR" H4.BR fun inlineScriptFromParseStream pstrm = let val (pstrm', scriptOpt) = scriptFromParseStream pstrm in (pstrm', cvtScript H4.Inline_SCRIPT scriptOpt) end val mapFromParseStream = htmlNaryFromParseStream "MAP" H4.MAP blockOrAreaFromParseStream val qFromParseStream = htmlNaryFromParseStream "Q" H4.Q inlineFromParseStream val subFromParseStream = htmlNaryFromParseStream "SUB" H4.SUB inlineFromParseStream val supFromParseStream = htmlNaryFromParseStream "SUP" H4.SUP inlineFromParseStream val spanFromParseStream = htmlNaryFromParseStream "SPAN" H4.SPAN inlineFromParseStream val bdoFromParseStream = htmlNaryFromParseStream "BDO" H4.BDO inlineFromParseStream val appletFromParseStream = htmlNaryFromParseStream "APPLET" H4.APPLET flowOrParamFromParseStream val basefontFromParseStream = html0aryFromParseStream "BASEFONT" H4.BASEFONT val fontFromParseStream = htmlNaryFromParseStream "FONT" H4.FONT inlineFromParseStream val iframeFromParseStream = htmlNaryFromParseStream "IFRAME" H4.IFRAME flowFromParseStream val inputFromParseStream = html0aryFromParseStream "INPUT" H4.INPUT val selectFromParseStream = htmlNaryFromParseStream "SELECT" H4.SELECT optgroupOrOptionFromParseStream val textareaFromParseStream = htmlNaryFromParseStream "TEXTAREA" H4.TEXTAREA cdataFromParseStream val labelFromParseStream = htmlNaryFromParseStream "LABEL" H4.LABEL inlineFromParseStream val buttonFromParseStream = htmlNaryFromParseStream "BUTTON" H4.BUTTON flowFromParseStream val captionFromParseStream = htmlNaryFromParseStream "CAPTION" H4.CAPTION inlineFromParseStream val colFromParseStream = html0aryFromParseStream "COL" H4.COL val colgroupFromParseStream = let fun consumeCol pstrm = let val (pstrm', colOptVal) = colFromParseStream pstrm fun cvtCol (SOME (H4.COL attrs)) = SOME attrs | cvtCol _ = NONE in (skipWhitespaceOrComment pstrm', cvtCol colOptVal) end in htmlNaryFromParseStream "COLGROUP" H4.COLGROUP consumeCol end val theadFromParseStream = htmlNaryFromParseStream "THEAD" H4.THEAD trFromParseStream val tfootFromParseStream = htmlNaryFromParseStream "TFOOT" H4.TFOOT trFromParseStream val tbodyFromParseStream = htmlNaryFromParseStream "TBODY" H4.TBODY trFromParseStream val _ = (headContentNTMap := (foldl AtomMap.insert' AtomMap.empty [ (Atom.atom "TITLE", titleFromParseStream), (Atom.atom "BASE", baseFromParseStream), (Atom.atom "SCRIPT", headScriptFromParseStream), (Atom.atom "META", metaFromParseStream), (Atom.atom "LINK", linkFromParseStream), (Atom.atom "OBJECT", headObjectFromParseStream)]), blockNTMap := (foldl AtomMap.insert' AtomMap.empty [ (Atom.atom "P", pFromParseStream), (Atom.atom "H1", h1FromParseStream), (Atom.atom "H2", h2FromParseStream), (Atom.atom "H3", h3FromParseStream), (Atom.atom "H4", h4FromParseStream), (Atom.atom "H5", h5FromParseStream), (Atom.atom "H6", h6FromParseStream), (Atom.atom "UL", ulFromParseStream), (Atom.atom "OL", olFromParseStream), (Atom.atom "DIR", dirFromParseStream), (Atom.atom "MENU", menuFromParseStream), (Atom.atom "PRE", preFromParseStream), (Atom.atom "DL", dlFromParseStream), (Atom.atom "DIV", divFromParseStream), (Atom.atom "NOSCRIPT", noscriptFromParseStream), (Atom.atom "BLOCKQUOTE", blockquoteFromParseStream), (Atom.atom "FORM", formFromParseStream), (Atom.atom "HR", hrFromParseStream), (Atom.atom "TABLE", tableFromParseStream), (Atom.atom "FIELDSET", fieldsetFromParseStream), (Atom.atom "ADDRESS", addressFromParseStream), (Atom.atom "ISINDEX", isindexFromParseStream), (Atom.atom "CENTER", centerFromParseStream)]), inlineNTMap := (foldl AtomMap.insert' AtomMap.empty [ (Atom.atom "TT", ttFromParseStream), (Atom.atom "I", iFromParseStream), (Atom.atom "B", bFromParseStream), (Atom.atom "BIG", bigFromParseStream), (Atom.atom "SMALL", smallFromParseStream), (Atom.atom "U", uFromParseStream), (Atom.atom "S", sFromParseStream), (Atom.atom "STRIKE", strikeFromParseStream), (Atom.atom "EM", emFromParseStream), (Atom.atom "STRONG", strongFromParseStream), (Atom.atom "DFN", dfnFromParseStream), (Atom.atom "CODE", codeFromParseStream), (Atom.atom "SAMP", sampFromParseStream), (Atom.atom "KBD", kbdFromParseStream), (Atom.atom "VAR", varFromParseStream), (Atom.atom "CITE", citeFromParseStream), (Atom.atom "ABBR", abbrFromParseStream), (Atom.atom "ACRONYM", acronymFromParseStream), (Atom.atom "A", aFromParseStream), (Atom.atom "IMG", imgFromParseStream), (Atom.atom "OBJECT", objectFromParseStream), (Atom.atom "BR", brFromParseStream), (Atom.atom "SCRIPT", inlineScriptFromParseStream), (Atom.atom "MAP", mapFromParseStream), (Atom.atom "Q", qFromParseStream), (Atom.atom "SUB", subFromParseStream), (Atom.atom "SUP", supFromParseStream), (Atom.atom "SPAN", spanFromParseStream), (Atom.atom "BDO", bdoFromParseStream), (Atom.atom "APPLET", appletFromParseStream), (Atom.atom "BASEFONT", basefontFromParseStream), (Atom.atom "FONT", fontFromParseStream), (Atom.atom "IFRAME", iframeFromParseStream), (Atom.atom "INPUT", inputFromParseStream), (Atom.atom "SELECT", selectFromParseStream), (Atom.atom "TEXTAREA", textareaFromParseStream), (Atom.atom "LABEL", labelFromParseStream), (Atom.atom "BUTTON", buttonFromParseStream)]), tableDataNTMap := (foldl AtomMap.insert' AtomMap.empty [ (Atom.atom "CAPTION", captionFromParseStream), (Atom.atom "COL", colFromParseStream), (Atom.atom "COLGROUP", colgroupFromParseStream), (Atom.atom "THEAD", theadFromParseStream), (Atom.atom "TFOOT", tfootFromParseStream), (Atom.atom "TBODY", tbodyFromParseStream)]) ) fun fromParseTree pt = let val (_, result) = htmlFromParseStream (H4U.parsetreeToVisitationStream pt) in result end fun fromString str = let val pt_opt = parseStream (TextIO.openString str) in case pt_opt of NONE => NONE | SOME pt => fromParseTree pt end end (* HTML4ParserUtils *) (* ______________________________________________________________________ End of html4-parser.sml ______________________________________________________________________ *) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-print.sml�����������������������������������0000664�0000000�0000000�00000032201�14162643450�0024077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-print.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure HTML4Print : sig val prHTML : { putc : char -> unit, puts : string -> unit } -> HTML4.html -> unit val prBODY : { putc : char -> unit, puts : string -> unit } -> HTML4.body -> unit end = struct structure H = HTML4 structure F = Format datatype outstream = OS of { putc : char -> unit, puts : string -> unit } fun putc (OS{putc, ...}, c) = putc c fun puts (OS{puts, ...}, s) = puts s (* format an open tag *) fun fmtTag (tag, attrs) = let fun fmtAttr ((attrName, NONE), l) = " " :: Atom.toString attrName :: l | fmtAttr ((attrName, SOME s), l) = " " :: Atom.toString attrName :: "=\"" :: s :: "\"" :: l in String.concat("<" :: tag :: List.foldr fmtAttr [">"] attrs) end (* format an tag with no content tag *) fun fmtEmptyTag (tag, attrs) = let fun fmtAttr ((attrName, NONE), l) = " " :: Atom.toString attrName :: l | fmtAttr ((attrName, SOME s), l) = " " :: Atom.toString attrName :: "=\"" :: s :: "\"" :: l in String.concat("<" :: tag :: List.foldr fmtAttr ["/>"] attrs) end fun fmtEndTag tag = concat["</", tag, ">"] fun prTag (OS{puts, ...}, tag, attrs) = puts(fmtTag (tag, attrs)) fun prEmptyTag (OS{puts, ...}, tag, attrs) = puts(fmtEmptyTag (tag, attrs)) fun prEndTag (OS{puts, ...}, tag) = puts(fmtEndTag tag) fun newline (OS{putc, ...}) = putc #"\n" fun space (OS{putc, ...}) = putc #" " (* the various HTML4 headers *) val strictHdr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" val looseHdr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" val framesetHdr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">" val xhtmlHdr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">" fun isStrict _ = true (* FIXME: should check content to see if there are uses of Loose elements *) fun prCDATA (outS, txt) = let fun pr (H.CHAR chNum) = puts (outS, concat["&#", (IntInf.toString chNum), ";"]) | pr (H.COMMENT com) = puts (outS, concat["<!-- ", com, " -->"]) | pr (H.ENTITY ent) = puts (outS, concat["&", Atom.toString ent, ";"]) | pr (H.PCDATA s) = puts (outS, s) in List.app pr txt end fun prScript (outS, H.SCRIPT(attrs, content)) = ( prTag (outS, "STYLE", attrs); prCDATA (outS, content); prEndTag (outS, "STYLE")) fun prParam (outS, H.PARAM attrs) = prEmptyTag (outS, "PARAM", attrs) (* because an OBJECT element can appear in the HEAD and it contains a flow, we introduce * a union type for the argument to the body printing code *) datatype body_or_flow = Body of H.body | Flow of H.flow fun prBodyOrFlow (outS, element) = let fun prFlowList (nl, []) = nl | prFlowList (nl, H.Flow_BLOCK blk :: r) = ( if nl then () else newline outS; prBlock blk; prFlowList (true, r)) | prFlowList (_, H.Flow_INLINE txt :: t) = ( prInline txt; prFlowList (false, t)) and prFlowListElem (inline, tag, attrs, content) = ( if inline andalso not (List.exists (fn (H.Flow_BLOCK _) => true | _ => false) content) then ( prTag (outS, tag, attrs); ignore (prFlowList (false, content)); prEndTag (outS, tag)) else ( prTag (outS, tag, attrs); if prFlowList (true, content) then () else newline outS; prEndTag (outS, tag))) and prBlock elem = ( case elem of H.P(attrs, content) => prInlineElem("P", attrs, content) | H.H1(attrs, content) => prInlineElem("H1", attrs, content) | H.H2(attrs, content) => prInlineElem("H2", attrs, content) | H.H3(attrs, content) => prInlineElem("H3", attrs, content) | H.H4(attrs, content) => prInlineElem("H4", attrs, content) | H.H5(attrs, content) => prInlineElem("H5", attrs, content) | H.H6(attrs, content) => prInlineElem("H6", attrs, content) | H.UL(attrs, content) => prListElem("UL", attrs, content) | H.OL(attrs, content) => prListElem("OL", attrs, content) | H.DIR(attrs, content) => prListElem("DIR", attrs, content) | H.MENU(attrs, content) => prListElem("MENU", attrs, content) | H.PRE(attrs, content) => prInlineElem("PRE", attrs, content) | H.DL(attrs, content) => let fun prItem (H.DT(attrs, content)) = ( prInlineElem ("DT", attrs, content); newline outS) | prItem (H.DD(attrs, content)) = ( prFlowListElem (false, "DD", attrs, content); newline outS) in prTag (outS, "DL", attrs); newline outS; List.app prItem content; prEndTag (outS, "DL") end | H.DIV(attrs, content) => prFlowListElem (false, "DIV", attrs, content) | H.NOSCRIPT(attrs, content) => ( prTag (outS, "NOSCRIPT", attrs); List.app prBlock content; prEndTag (outS, "NOSCRIPT")) | H.BLOCKQUOTE(attrs, content) => ( prTag (outS, "BLOCKQUOTE", attrs); newline outS; List.app prBlockOrScript content; prEndTag (outS, "BLOCKQUOTE")) | H.FORM(attrs, content) => ( prTag (outS, "FORM", attrs); newline outS; List.app prBlockOrScript content; prEndTag (outS, "FORM")) | H.HR attrs => prEmptyTag(outS, "HR", attrs) | H.TABLE(attrs, content) => let fun prCOL attrs = prTag (outS, "COL", attrs) fun prData (H.CAPTION(attrs, content)) = ( prInlineElem("CAPTION", attrs, content); newline outS) | prData (H.COL attrs) = (prCOL attrs; newline outS) | prData (H.COLGROUP(attrs, content)) = ( prTag (outS, "COLGROUP", attrs); List.app prCOL content; prEndTag (outS, "COLGROUP"); newline outS) | prData (H.THEAD(attrs, content)) = prTableElem ("THEAD", attrs, content) | prData (H.TFOOT(attrs, content)) = prTableElem ("TFOOT", attrs, content) | prData (H.TBODY(attrs, content)) = prTableElem ("TBODY", attrs, content) and prTableElem (tag, attrs, content) = let fun prRow (H.TR(attrs, content)) = let fun prCell (H.TH(attrs, content)) = prFlowListElem (true, "TH", attrs, content) | prCell (H.TD(attrs, content)) = prFlowListElem (true, "TD", attrs, content) in prTag (outS, "TR", attrs); newline outS; List.app prCell content; newline outS; prEndTag (outS, "TR"); newline outS end in prTag (outS, "TR", attrs); newline outS; List.app prRow content; prEndTag (outS, "TR"); newline outS end in prTag (outS, "TABLE", attrs); newline outS; List.app prData content; prEndTag (outS, "TABLE") end | H.FIELDSET(attrs, legend, content) => ( prTag (outS, "FIELDSET", attrs); newline outS; case legend of SOME(H.LEGEND(attrs, content)) => ( prInlineElem("LEGEND", attrs, content); newline outS) | NONE => () (* end case *); if prFlowList (false, content) then () else newline outS; prEndTag (outS, "FIELDSET")) | H.ADDRESS(attrs, content) => prInlineElem("ADDRESS", attrs, content) | H.CENTER(attrs, content) => prFlowListElem (false, "CENTER", attrs, content) | H.ISINDEX attrs => prEmptyTag(outS, "ISINDEX", attrs) (* end case *); newline outS) and prListElem (tag, attrs, content) = let fun prItem (H.LI(attrs, content)) = ( prFlowListElem (true, "LI", attrs, content); newline outS) in prTag (outS, tag, attrs); newline outS; List.app prItem content; prEndTag (outS, tag); newline outS end and prInline elem = (case elem of H.TT(attrs, content) => prInlineElem("TT", attrs, content) | H.I(attrs, content) => prInlineElem("I", attrs, content) | H.B(attrs, content) => prInlineElem("B", attrs, content) | H.BIG(attrs, content) => prInlineElem("BIG", attrs, content) | H.SMALL(attrs, content) => prInlineElem("SMALL", attrs, content) | H.U(attrs, content) => prInlineElem("U", attrs, content) | H.S(attrs, content) => prInlineElem("S", attrs, content) | H.STRIKE(attrs, content) => prInlineElem("STRIKE", attrs, content) | H.EM(attrs, content) => prInlineElem("EM", attrs, content) | H.STRONG(attrs, content) => prInlineElem("STRONG", attrs, content) | H.DFN(attrs, content) => prInlineElem("DFN", attrs, content) | H.CODE(attrs, content) => prInlineElem("CODE", attrs, content) | H.SAMP(attrs, content) => prInlineElem("SAMP", attrs, content) | H.KBD(attrs, content) => prInlineElem("KBD", attrs, content) | H.VAR(attrs, content) => prInlineElem("VAR", attrs, content) | H.CITE(attrs, content) => prInlineElem("CITE", attrs, content) | H.ABBR(attrs, content) => prInlineElem("ABBR", attrs, content) | H.ACRONYM(attrs, content) => prInlineElem("ACRONYM", attrs, content) | H.A(attrs, content) => prInlineElem("A", attrs, content) | H.IMG attrs => prEmptyTag(outS, "IMG", attrs) | H.OBJECT(attrs, content) => ( prTag (outS, "OBJECT", attrs); newline outS; prFlowOrParamList content; prEndTag (outS, "OBJECT"); newline outS) | H.BR attrs => prEmptyTag(outS, "BR", attrs) | H.Inline_SCRIPT script => (newline outS; prScript (outS, script)) | H.MAP(attrs, content) => raise Fail "FIXME" | H.Q(attrs, content) => prInlineElem("Q", attrs, content) | H.SUB(attrs, content) => prInlineElem("SUB", attrs, content) | H.SUP(attrs, content) => prInlineElem("SUP", attrs, content) | H.SPAN(attrs, content) => prInlineElem("SPAN", attrs, content) | H.BDO(attrs, content) => prInlineElem("BDO", attrs, content) | H.APPLET(attrs, content) => ( prTag (outS, "APPLET", attrs); newline outS; prFlowOrParamList content; prEndTag (outS, "APPLET"); newline outS) | H.BASEFONT attrs => prEmptyTag(outS, "BASEFONT", attrs) | H.FONT(attrs, content) => prInlineElem("FONT", attrs, content) | H.IFRAME(attrs, content) => prFlowListElem (true, "IFRAME", attrs, content) | H.INPUT attrs => prEmptyTag(outS, "INPUT", attrs) | H.SELECT(attrs, content) => raise Fail "FIXME" | H.TEXTAREA(attrs, content) => ( prTag (outS, "TEXTAREA", attrs); prCDATA (outS, content); prEndTag (outS, "TEXTAREA")) | H.LABEL(attrs, content) => prInlineElem("LABEL", attrs, content) | H.BUTTON(attrs, content) => prFlowListElem (true, "BUTTON", attrs, content) | H.CDATA txt => prCDATA (outS, txt) (* end case *)) and prInlineElem (tag, attrs, content) = ( prTag (outS, tag, attrs); List.app prInline content; prEndTag (outS, tag)) and prBlockOrScript (H.BlockOrScript_BLOCK blk) = prBlock blk | prBlockOrScript (H.BlockOrScript_SCRIPT script) = (prScript (outS, script); newline outS) and prFlowOrParamList content = let fun pr (H.FlowOrParam_FLOW(H.Flow_BLOCK blk), nl) = ( if nl then () else newline outS; prBlock blk; true) | pr (H.FlowOrParam_FLOW(H.Flow_INLINE txt), _) = (prInline txt; false) | pr (H.FlowOrParam_PARAM param, _) = (prParam (outS, param); false) in (* This function is always called after a newline *) ignore (List.foldl pr true content) end in case element of Body(H.BODY(attrs, content)) => ( prTag (outS, "BODY", attrs); newline outS; List.app prBlockOrScript content; prEndTag (outS, "BODY"); newline outS) | Flow(H.Flow_BLOCK blk) => prBlock blk | Flow(H.Flow_INLINE txt) => prInline txt (* end case *) end (* prBodyOrFlow *) fun prHTML outS (H.HTML{version, head, content}) = let val outS = OS outS fun prHeadContent (H.Head_TITLE(attrs, txt)) = ( prTag (outS, "TITLE", attrs); newline outS; prCDATA (outS, txt); newline outS; prEndTag (outS, "TITLE"); newline outS) | prHeadContent (H.Head_BASE attrs) = ( prTag (outS, "TITLE", attrs); newline outS) | prHeadContent (H.Head_SCRIPT script) = ( prScript (outS, script); newline outS) | prHeadContent (H.Head_STYLE(attrs, content)) = ( prTag (outS, "STYLE", attrs); newline outS; prCDATA (outS, content); newline outS; prEndTag (outS, "STYLE"); newline outS) | prHeadContent (H.Head_META attrs) = ( prTag (outS, "META", attrs); newline outS) | prHeadContent (H.Head_LINK attrs) = ( prTag (outS, "LINK", attrs); newline outS) | prHeadContent (H.Head_OBJECT(attrs, content)) = raise Fail "FIXME" and prBodyOrFrameset (H.BodyOrFrameset_BODY body) = prBodyOrFlow (outS, Body body) | prBodyOrFrameset (H.BodyOrFrameset_FRAMESET frameset) = prFrameset frameset and prFrameset (H.FRAMESET(attrs, content, noframes)) = raise Fail "FIXME" in case (version, content) of (SOME vers, _) => puts (outS, vers) | (NONE, H.BodyOrFrameset_BODY(H.BODY(attrs, children))) => if isStrict children then puts (outS, strictHdr) else puts (outS, looseHdr) | (NONE, H.BodyOrFrameset_FRAMESET _) => puts (outS, framesetHdr) (* end case *); newline outS; puts (outS, "<HTML>\n"); puts (outS, "<HEAD>\n"); List.app prHeadContent head; puts (outS, "</HEAD>\n"); prBodyOrFrameset content; puts (outS, "</HTML>\n") end fun prBODY outS body = prBodyOrFlow (OS outS, Body body) end �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-printer.sml���������������������������������0000664�0000000�0000000�00000036607�14162643450�0024444�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-printer.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure HTML4Printer : sig val toString : HTML4.html -> string end = struct structure H4 = HTML4 structure PP = PrettyPrint exception NotImplemented structure HTML4TagStrings = struct (* Strict *) val A = "A" val ABBR = "ABBR" val ACRONYM = "ACRONYM" val ADDRESS = "ADDRESS" val AREA = "AREA" val B = "B" val BASE = "BASE" val BDO = "BDO" val BIG = "BIG" val BLOCKQUOTE = "BLOCKQUOTE" val BODY = "BODY" val BR = "BR" val BUTTON = "BUTTON" val CAPTION = "CAPTION" val CITE = "CITE" val CODE = "CODE" val COL = "COL" val COLGROUP = "COLGROUP" val DD = "DD" val DEL = "DEL" val DFN = "DFN" val DIV = "DIV" val DL = "DL" val DT = "DT" val EM = "EM" val FIELDSET = "FIELDSET" val FORM = "FORM" val H1 = "H1" val H2 = "H2" val H3 = "H3" val H4 = "H4" val H5 = "H5" val H6 = "H6" val HEAD = "HEAD" val HR = "HR" val HTML = "HTML" val I = "I" val IMG = "IMG" val INPUT = "INPUT" val INS = "INS" val KBD = "KBD" val LABEL = "LABEL" val LEGEND = "LEGEND" val LI = "LI" val LINK = "LINK" val MAP = "MAP" val META = "META" val NOSCRIPT = "NOSCRIPT" val OBJECT = "OBJECT" val OL = "OL" val OPTGROUP = "OPTGROUP" val OPTION = "OPTION" val P = "P" val PARAM = "PARAM" val PRE = "PRE" val Q = "Q" val SAMP = "SAMP" val SCRIPT = "SCRIPT" val SELECT = "SELECT" val SMALL = "SMALL" val SPAN = "SPAN" val STRONG = "STRONG" val STYLE = "STYLE" val SUB = "SUB" val SUP = "SUP" val TABLE = "TABLE" val TBODY = "TBODY" val TD = "TD" val TEXTAREA = "TEXTAREA" val TFOOT = "TFOOT" val TH = "TH" val THEAD = "THEAD" val TITLE = "TITLE" val TR = "TR" val TT = "TT" val UL = "UL" val VAR = "VAR" (* Frameset *) val FRAME = "FRAME" val FRAMESET = "FRAMESET" val NOFRAMES = "NOFRAMES" (* Loose *) val APPLET = "APPLET" val BASEFONT = "BASEFONT" val CENTER = "CENTER" val DIR = "DIR" val FONT = "FONT" val IFRAME = "IFRAME" val ISINDEX = "ISINDEX" val MENU = "MENU" val S = "S" val STRIKE = "STRIKE" val U = "U" end structure S = HTML4TagStrings val strictStr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" val looseStr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" val framesetStr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">" val xhtmlStr = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">" (* ____________________________________________________________ *) fun isStrict _ = true fun getVersionStr (doc as H4.HTML {head, content, ...}) = case content of H4.BodyOrFrameset_BODY (H4.BODY (attrs, children)) => if isStrict children then strictStr else looseStr | H4.BodyOrFrameset_FRAMESET _ => framesetStr (* ____________________________________________________________ *) fun ppOpenTag ppstrm (tag, attributes) = PP.string ppstrm (String.concat ["<", tag, case attributes of attrs as _::_ => " " ^ (HTML4Utils.attrsToStr attrs) | [] => "", ">"]) fun ppCloseTag ppstrm tag = PP.string ppstrm (String.concat ["</", tag, ">"]) fun ppChildren _ _ [] = () | ppChildren ppstrm ppChild children = ( PP.openHVBox ppstrm (PP.Abs 2); PP.newline ppstrm; app (ppChild ppstrm) children; PP.closeBox ppstrm; PP.newline ppstrm ) fun ppTagAndChildren ppstrm ppChild tag (attrs, children) = ( ppOpenTag ppstrm (tag, attrs); ppChildren ppstrm ppChild children; ppCloseTag ppstrm tag ) (* ____________________________________________________________ *) local open H4 in fun ppCol ppstrm attrs = ppOpenTag ppstrm (S.COL, attrs) fun ppCdata ppstrm (CHAR chNum) = PP.string ppstrm ("&#" ^ (IntInf.toString chNum) ^ ";") | ppCdata ppstrm (COMMENT comment_string) = PP.string ppstrm comment_string | ppCdata ppstrm (ENTITY ent) = PP.string ppstrm ("&" ^ (Atom.toString ent) ^ ";") | ppCdata ppstrm (PCDATA string_data) = PP.string ppstrm string_data and ppHtml ppstrm (doc as HTML {version, head, content}) = ( PP.string ppstrm (case version of SOME doctype_str => doctype_str | NONE => getVersionStr doc); PP.newline ppstrm; ppOpenTag ppstrm (S.HTML, []); PP.openHVBox ppstrm (PP.Abs 2); PP.newline ppstrm; ppOpenTag ppstrm (S.HEAD, []); ppChildren ppstrm ppHead_content head; ppCloseTag ppstrm S.HEAD; PP.newline ppstrm; ppBody_or_frameset ppstrm content; PP.closeBox ppstrm; PP.newline ppstrm; ppCloseTag ppstrm S.HTML; PP.newline ppstrm ) and ppHead_content ppstrm (Head_BASE attrs) = ppOpenTag ppstrm (S.BASE, attrs) | ppHead_content ppstrm (Head_LINK attrs) = ppOpenTag ppstrm (S.LINK, attrs) | ppHead_content ppstrm (Head_META attrs) = ppOpenTag ppstrm (S.META, attrs) | ppHead_content ppstrm (Head_OBJECT contents) = ppTagAndChildren ppstrm ppFlow_or_param S.OBJECT contents | ppHead_content ppstrm (Head_SCRIPT child) = ppScript ppstrm child | ppHead_content ppstrm (Head_STYLE contents) = ppTagAndChildren ppstrm ppCdata S.STYLE contents | ppHead_content ppstrm (Head_TITLE contents) = ppTagAndChildren ppstrm ppCdata S.TITLE contents and ppBody_or_frameset ppstrm (BodyOrFrameset_BODY body) = ppBody ppstrm body | ppBody_or_frameset ppstrm (BodyOrFrameset_FRAMESET frameset) = ppFrameset ppstrm frameset and ppBody ppstrm (BODY content) = ppTagAndChildren ppstrm ppBlock_or_script S.BODY content and ppFrameset ppstrm (FRAMESET (attrs, children, noframesOpt)) = ( ppOpenTag ppstrm (S.FRAMESET, attrs); ppChildren ppstrm ppFrameset_or_frame children; case noframesOpt of SOME noframes => (PP.newline ppstrm; ppNoframes ppstrm noframes) | _ => (); ppCloseTag ppstrm S.FRAMESET ) and ppFrameset_or_frame ppstrm (FRAME attrs) = ppOpenTag ppstrm (S.FRAME, attrs) | ppFrameset_or_frame ppstrm (FramesetOrFrame_FRAMESET frameset) = ppFrameset ppstrm frameset and ppNoframes ppstrm (NOFRAMES (attrs, body)) = (ppOpenTag ppstrm (S.NOFRAMES, attrs); ppBody ppstrm body; ppCloseTag ppstrm S.NOFRAMES) and ppFlow ppstrm (Flow_BLOCK block) = ppBlock ppstrm block | ppFlow ppstrm (Flow_INLINE inline) = ppInline ppstrm inline and ppBlock ppstrm (ADDRESS content) = ppTagAndChildren ppstrm ppInline S.ADDRESS content | ppBlock ppstrm (BLOCKQUOTE content) = ppTagAndChildren ppstrm ppBlock_or_script S.BLOCKQUOTE content | ppBlock ppstrm (CENTER content) = ppTagAndChildren ppstrm ppFlow S.CENTER content | ppBlock ppstrm (DIR content) = ppTagAndChildren ppstrm ppList_item S.DIR content | ppBlock ppstrm (DIV content) = ppTagAndChildren ppstrm ppFlow S.DIV content | ppBlock ppstrm (DL content) = ppTagAndChildren ppstrm ppDef_term_or_desc S.DL content | ppBlock ppstrm (FIELDSET (attrs, legend_opt, children)) = ( ppOpenTag ppstrm (S.FIELDSET, attrs); case legend_opt of SOME legend => ppLegend ppstrm legend | NONE => (); ppChildren ppstrm ppFlow children; ppCloseTag ppstrm S.FIELDSET ) | ppBlock ppstrm (FORM content) = ppTagAndChildren ppstrm ppBlock_or_script S.FORM content | ppBlock ppstrm (H1 content) = ppTagAndChildren ppstrm ppInline S.H1 content | ppBlock ppstrm (H2 content) = ppTagAndChildren ppstrm ppInline S.H2 content | ppBlock ppstrm (H3 content) = ppTagAndChildren ppstrm ppInline S.H3 content | ppBlock ppstrm (H4 content) = ppTagAndChildren ppstrm ppInline S.H4 content | ppBlock ppstrm (H5 content) = ppTagAndChildren ppstrm ppInline S.H5 content | ppBlock ppstrm (H6 content) = ppTagAndChildren ppstrm ppInline S.H6 content | ppBlock ppstrm (HR attrs) = ppOpenTag ppstrm (S.HR, attrs) | ppBlock ppstrm (ISINDEX attrs) = ppOpenTag ppstrm (S.ISINDEX, attrs) | ppBlock ppstrm (MENU content) = ppTagAndChildren ppstrm ppList_item S.MENU content | ppBlock ppstrm (NOSCRIPT content) = ppTagAndChildren ppstrm ppBlock S.NOSCRIPT content | ppBlock ppstrm (OL content) = ppTagAndChildren ppstrm ppList_item S.OL content | ppBlock ppstrm (P content) = ppTagAndChildren ppstrm ppInline S.P content | ppBlock ppstrm (PRE content) = ppTagAndChildren ppstrm ppInline S.PRE content | ppBlock ppstrm (TABLE content) = ppTagAndChildren ppstrm ppTable_data S.TABLE content | ppBlock ppstrm (UL content) = ppTagAndChildren ppstrm ppList_item S.UL content and ppInline ppstrm (A content) = ppTagAndChildren ppstrm ppInline S.A content | ppInline ppstrm (ABBR content) = ppTagAndChildren ppstrm ppInline S.ABBR content | ppInline ppstrm (ACRONYM content) = ppTagAndChildren ppstrm ppInline S.ACRONYM content | ppInline ppstrm (APPLET content) = ppTagAndChildren ppstrm ppFlow_or_param S.APPLET content | ppInline ppstrm (B content) = ppTagAndChildren ppstrm ppInline S.B content | ppInline ppstrm (BASEFONT attrs) = ppOpenTag ppstrm (S.BASEFONT, attrs) | ppInline ppstrm (BDO content) = ppTagAndChildren ppstrm ppInline S.BDO content | ppInline ppstrm (BIG content) = ppTagAndChildren ppstrm ppInline S.BIG content | ppInline ppstrm (BR attrs) = ppOpenTag ppstrm (S.BR, attrs) | ppInline ppstrm (BUTTON content) = ppTagAndChildren ppstrm ppFlow S.BUTTON content | ppInline ppstrm (CDATA children) = app (ppCdata ppstrm) children | ppInline ppstrm (CITE content) = ppTagAndChildren ppstrm ppInline S.CITE content | ppInline ppstrm (CODE content) = ppTagAndChildren ppstrm ppInline S.CODE content | ppInline ppstrm (DFN content) = ppTagAndChildren ppstrm ppInline S.DFN content | ppInline ppstrm (EM content) = ppTagAndChildren ppstrm ppInline S.EM content | ppInline ppstrm (FONT content) = ppTagAndChildren ppstrm ppInline S.FONT content | ppInline ppstrm (I content) = ppTagAndChildren ppstrm ppInline S.I content | ppInline ppstrm (IFRAME content) = ppTagAndChildren ppstrm ppFlow S.IFRAME content | ppInline ppstrm (IMG attrs) = ppOpenTag ppstrm (S.IMG, attrs) | ppInline ppstrm (INPUT attrs) = ppOpenTag ppstrm (S.INPUT, attrs) | ppInline ppstrm (Inline_SCRIPT script) = ppScript ppstrm script | ppInline ppstrm (KBD content) = ppTagAndChildren ppstrm ppInline S.KBD content | ppInline ppstrm (LABEL content) = ppTagAndChildren ppstrm ppInline S.LABEL content | ppInline ppstrm (MAP content) = ppTagAndChildren ppstrm ppBlock_or_area S.MAP content | ppInline ppstrm (OBJECT content) = ppTagAndChildren ppstrm ppFlow_or_param S.OBJECT content | ppInline ppstrm (Q content) = ppTagAndChildren ppstrm ppInline S.Q content | ppInline ppstrm (S content) = ppTagAndChildren ppstrm ppInline S.S content | ppInline ppstrm (SAMP content) = ppTagAndChildren ppstrm ppInline S.SAMP content | ppInline ppstrm (SELECT content) = ppTagAndChildren ppstrm ppOptgroup_or_option S.SELECT content | ppInline ppstrm (SMALL content) = ppTagAndChildren ppstrm ppInline S.SMALL content | ppInline ppstrm (SPAN content) = ppTagAndChildren ppstrm ppInline S.SPAN content | ppInline ppstrm (STRIKE content) = ppTagAndChildren ppstrm ppInline S.STRIKE content | ppInline ppstrm (STRONG content) = ppTagAndChildren ppstrm ppInline S.STRONG content | ppInline ppstrm (SUB content) = ppTagAndChildren ppstrm ppInline S.SUB content | ppInline ppstrm (SUP content) = ppTagAndChildren ppstrm ppInline S.SUP content | ppInline ppstrm (TEXTAREA content) = ppTagAndChildren ppstrm ppCdata S.TEXTAREA content | ppInline ppstrm (TT content) = ppTagAndChildren ppstrm ppInline S.TT content | ppInline ppstrm (U content) = ppTagAndChildren ppstrm ppInline S.U content | ppInline ppstrm (VAR content) = ppTagAndChildren ppstrm ppInline S.VAR content and ppList_item ppstrm (LI content) = ppTagAndChildren ppstrm ppFlow S.LI content and ppScript ppstrm (SCRIPT content) = ppTagAndChildren ppstrm ppCdata S.SCRIPT content and ppParam ppstrm (PARAM attrs) = ppOpenTag ppstrm (S.PARAM, attrs) and ppLegend ppstrm (LEGEND content) = ppTagAndChildren ppstrm ppInline S.LEGEND content and ppDef_term_or_desc ppstrm (DD content) = ppTagAndChildren ppstrm ppFlow S.DD content | ppDef_term_or_desc ppstrm (DT content) = ppTagAndChildren ppstrm ppInline S.DT content and ppTable_data ppstrm (CAPTION content) = ppTagAndChildren ppstrm ppInline S.CAPTION content | ppTable_data ppstrm (COL col) = ppCol ppstrm col | ppTable_data ppstrm (COLGROUP content) = ppTagAndChildren ppstrm ppCol S.COLGROUP content | ppTable_data ppstrm (TBODY content) = ppTagAndChildren ppstrm ppTr S.TBODY content | ppTable_data ppstrm (TFOOT content) = ppTagAndChildren ppstrm ppTr S.TFOOT content | ppTable_data ppstrm (THEAD content) = ppTagAndChildren ppstrm ppTr S.THEAD content and ppTr ppstrm (TR content) = ppTagAndChildren ppstrm ppTh_or_td S.TR content and ppTh_or_td ppstrm (TD content) = ppTagAndChildren ppstrm ppFlow S.TD content | ppTh_or_td ppstrm (TH content) = ppTagAndChildren ppstrm ppFlow S.TH content and ppOptgroup_or_option ppstrm (OPTGROUP content) = ppTagAndChildren ppstrm (fn pstrm => fn opt => ppTagAndChildren ppstrm ppCdata S.OPTION opt) S.OPTGROUP content | ppOptgroup_or_option ppstrm (OPTION content) = ppTagAndChildren ppstrm ppCdata S.OPTION content and ppFlow_or_param ppstrm (FlowOrParam_FLOW flow) = ppFlow ppstrm flow | ppFlow_or_param ppstrm (FlowOrParam_PARAM param) = ppParam ppstrm param and ppBlock_or_script ppstrm (BlockOrScript_BLOCK block) = ppBlock ppstrm block | ppBlock_or_script ppstrm (BlockOrScript_SCRIPT script) = ppScript ppstrm script and ppBlock_or_area ppstrm (AREA attrs) = ppOpenTag ppstrm (S.AREA, attrs) | ppBlock_or_area ppstrm (BlockOrArea_BLOCK block) = ppBlock ppstrm block end (* ____________________________________________________________ *) val toString = PP.pp_to_string 80 ppHtml end (* HTML4Printer *) (* ______________________________________________________________________ End of html4-printer.sml ______________________________________________________________________ *) �������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-test.cm�������������������������������������0000664�0000000�0000000�00000000613�14162643450�0023530�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-test.cm * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Group is $/basis.cm $/smlnj-lib.cm $/ml-lpt-lib.cm html4-lib.cm html4-test.sml (* ______________________________________________________________________ End of html4-test.cm ______________________________________________________________________ *) ���������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-test.sml������������������������������������0000664�0000000�0000000�00000004535�14162643450�0023733�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-test.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure Test = struct val parsetreeStreamToString = HTML4Utils.mkParsetreeStreamToString HTML4Tokens.toString fun handleFile outS fileName = let val inStream = TextIO.openIn fileName val concrete_pt_opt = HTML4Parser.parseStream inStream val pt_visit_strm = (case concrete_pt_opt of SOME concrete_pt => HTML4Utils.parsetreeToVisitationStream concrete_pt | NONE => HTML4Utils.StreamNil (* end case *)) val (_, htmlOpt) = HTML4Parser.htmlFromParseStream pt_visit_strm handle HTML4Parser.IllFormedHTMLParseStream (strm, SOME msg) => (HTML4Parser.printVisitationStream strm; print (msg ^ "\n\n"); (strm, NONE)) in TextIO.closeIn inStream; TextIO.output(outS, concat["<!-- ******************** start ", fileName, " ******************** -->\n"]); case htmlOpt of SOME html => HTML4Print.prHTML { putc = fn c => TextIO.output1(outS, c), puts = fn s => TextIO.output(outS, s) } html | NONE => TextIO.output (outS, parsetreeStreamToString pt_visit_strm) (* end case *); TextIO.output(outS, concat["<!-- ******************** end ", fileName, " ******************** -->\n"]) end fun main (_, args) = let val outS = TextIO.openOut "html4-test.out" in (List.app (handleFile outS) args; TextIO.closeOut outS; OS.Process.success) handle ex => ( TextIO.closeOut outS; print(concat["uncaught exception: ", exnMessage ex, "\n"]); List.app (fn s => print(concat[" ", s, "\n"])) (SMLofNJ.exnHistory ex); OS.Process.failure) end val tests = [ "tests/abbr.html", "tests/dir.html", "tests/edit.html", "tests/elements.html", "tests/entities.html", "tests/forms.html", "tests/framebody.html", "tests/frames.html", "tests/id.html", "tests/objaudio.html", "tests/objects.html", "tests/objvideo.html", "tests/quote.html", "tests/scripts.html", "tests/spchars.html", "tests/tables.html", "tests/template.html", "tests/test001.html", "tests/test002.html" ] end (* ______________________________________________________________________ End of html4-test.sml ______________________________________________________________________ *) �������������������������������������������������������������������������������������������������������������������������������������������������������������������mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-token-utils.sml�����������������������������0000664�0000000�0000000�00000060310�14162643450�0025223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* html4-token-utils.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A set of utilities used for working with tokens used in the HTML 4 * parser. *) structure HTML4TokenUtils = struct structure H4U = HTML4Utils (* ____________________________________________________________ *) (* Attribute handling *) (* XXX Is this too heavyweight? It certainly gives us some flexibility in the future. *) structure HTML4AttrParser = HTML4AttrParseFn(HTML4AttrLexer) fun parseAttrsFromStream inStream = let val sourceMap = AntlrStreamPos.mkSourcemap () val lex = HTML4AttrLexer.lex sourceMap val stream = HTML4AttrLexer.streamifyInstream inStream in case HTML4AttrParser.parse lex stream of (SOME result, _, _) => result | _ => [] (* end case *) end fun parseAttrs inStr = parseAttrsFromStream (TextIO.openString inStr) (*DEBUG*)handle ex => (print(concat["parseAttrs: \"", String.toString inStr, "\"\n"]); raise ex) (* ____________________________________________________________ *) open HTML4Tokens val strict_tuple_list = [ ("A", STARTA, SOME ENDA), ("ABBR", STARTABBR, SOME ENDABBR), ("ACRONYM", STARTACRONYM, SOME ENDACRONYM), ("ADDRESS", STARTADDRESS, SOME ENDADDRESS), ("AREA", STARTAREA, NONE), ("B", STARTB, SOME ENDB), ("BASE", STARTBASE, NONE), ("BDO", STARTBDO, SOME ENDBDO), ("BIG", STARTBIG, SOME ENDBIG), ("BLOCKQUOTE", STARTBLOCKQUOTE, SOME ENDBLOCKQUOTE), ("BODY", STARTBODY, SOME ENDBODY), ("BR", STARTBR, NONE), ("BUTTON", STARTBUTTON, SOME ENDBUTTON), ("CAPTION", STARTCAPTION, SOME ENDCAPTION), ("CITE", STARTCITE, SOME ENDCITE), ("CODE", STARTCODE, SOME ENDCODE), ("COL", STARTCOL, NONE), ("COLGROUP", STARTCOLGROUP, SOME ENDCOLGROUP), ("DD", STARTDD, SOME ENDDD), ("DEL", STARTDEL, SOME ENDDEL), ("DFN", STARTDFN, SOME ENDDFN), ("DIV", STARTDIV, SOME ENDDIV), ("DL", STARTDL, SOME ENDDL), ("DT", STARTDT, SOME ENDDT), ("EM", STARTEM, SOME ENDEM), ("FIELDSET", STARTFIELDSET, SOME ENDFIELDSET), ("FORM", STARTFORM, SOME ENDFORM), ("H1", STARTH1, SOME ENDH1), ("H2", STARTH2, SOME ENDH2), ("H3", STARTH3, SOME ENDH3), ("H4", STARTH4, SOME ENDH4), ("H5", STARTH5, SOME ENDH5), ("H6", STARTH6, SOME ENDH6), ("HEAD", STARTHEAD, SOME ENDHEAD), ("HR", STARTHR, NONE), ("HTML", STARTHTML, SOME ENDHTML), ("I", STARTI, SOME ENDI), ("IMG", STARTIMG, NONE), ("INPUT", STARTINPUT, NONE), ("INS", STARTINS, SOME ENDINS), ("KBD", STARTKBD, SOME ENDKBD), ("LABEL", STARTLABEL, SOME ENDLABEL), ("LEGEND", STARTLEGEND, SOME ENDLEGEND), ("LI", STARTLI, SOME ENDLI), ("LINK", STARTLINK, NONE), ("MAP", STARTMAP, SOME ENDMAP), ("META", STARTMETA, NONE), ("NOSCRIPT", STARTNOSCRIPT, SOME ENDNOSCRIPT), ("OBJECT", STARTOBJECT, SOME ENDOBJECT), ("OL", STARTOL, SOME ENDOL), ("OPTGROUP", STARTOPTGROUP, SOME ENDOPTGROUP), ("OPTION", STARTOPTION, SOME ENDOPTION), ("P", STARTP, SOME ENDP), ("PARAM", STARTPARAM, NONE), ("PRE", STARTPRE, SOME ENDPRE), ("Q", STARTQ, SOME ENDQ), ("SAMP", STARTSAMP, SOME ENDSAMP), ("SCRIPT", STARTSCRIPT, SOME ENDSCRIPT), ("SELECT", STARTSELECT, SOME ENDSELECT), ("SMALL", STARTSMALL, SOME ENDSMALL), ("SPAN", STARTSPAN, SOME ENDSPAN), ("STRONG", STARTSTRONG, SOME ENDSTRONG), ("STYLE", STARTSTYLE, SOME ENDSTYLE), ("SUB", STARTSUB, SOME ENDSUB), ("SUP", STARTSUP, SOME ENDSUP), ("TABLE", STARTTABLE, SOME ENDTABLE), ("TBODY", STARTTBODY, SOME ENDTBODY), ("TD", STARTTD, SOME ENDTD), ("TEXTAREA", STARTTEXTAREA, SOME ENDTEXTAREA), ("TFOOT", STARTTFOOT, SOME ENDTFOOT), ("TH", STARTTH, SOME ENDTH), ("THEAD", STARTTHEAD, SOME ENDTHEAD), ("TITLE", STARTTITLE, SOME ENDTITLE), ("TR", STARTTR, SOME ENDTR), ("TT", STARTTT, SOME ENDTT), ("UL", STARTUL, SOME ENDUL), ("VAR", STARTVAR, SOME ENDVAR) ] val loose_tuple_list = [ ("APPLET", STARTAPPLET, SOME ENDAPPLET), ("BASEFONT", STARTBASEFONT, NONE), ("CENTER", STARTCENTER, SOME ENDCENTER), ("DIR", STARTDIR, SOME ENDDIR), ("FONT", STARTFONT, SOME ENDFONT), ("IFRAME", STARTIFRAME, SOME ENDIFRAME), ("ISINDEX", STARTISINDEX, NONE), ("MENU", STARTMENU, SOME ENDMENU), ("S", STARTS, SOME ENDS), ("STRIKE", STARTSTRIKE, SOME ENDSTRIKE), ("U", STARTU, SOME ENDU) ] val frameset_tuple_list = [ ("FRAME", STARTFRAME, NONE), ("FRAMESET", STARTFRAMESET, SOME ENDFRAMESET), ("NOFRAMES", STARTNOFRAMES, SOME ENDNOFRAMES) ] val endTagNameTest = Char.notContains " \t\r\n>" fun splitTagStart inStr = Substring.splitl endTagNameTest (Substring.full inStr) fun extractTag str = let val (tagNameChs, _) = splitTagStart str val tagNameChs = (case CharVectorSlice.getItem tagNameChs of SOME(#"<", r) => (case CharVectorSlice.getItem r of SOME(#"/", r) => r | _ => r (* end case *)) | _ => tagNameChs (* end case *)) in Atom.atom (CharVectorSlice.map Char.toUpper tagNameChs) end fun extractAttrs str = let val (_, tagRest) = splitTagStart str val (tagRest', _) = Substring.splitr (fn c => c = #">") tagRest in parseAttrs (Substring.string tagRest') end structure AtomMap : ORD_MAP = RedBlackMapFn(struct type ord_key = Atom.atom val compare = Atom.compare end) fun element_tuple_to_ctor_maps ((tag_name, open_ctor, close_ctor_opt), (open_map, close_map)) = let val tag_atom = Atom.atom tag_name val open_map' = AtomMap.insert(open_map, tag_atom, open_ctor) val close_map' = case close_ctor_opt of NONE => close_map | SOME close_tok => AtomMap.insert( close_map, tag_atom, close_tok) in (open_map', close_map') end val (strict_open_map, strict_close_map) = foldl element_tuple_to_ctor_maps (AtomMap.empty, AtomMap.empty) strict_tuple_list val (loose_open_map, loose_close_map) = foldl element_tuple_to_ctor_maps (strict_open_map, strict_close_map) loose_tuple_list val (frameset_open_map, frameset_close_map) = foldl element_tuple_to_ctor_maps (strict_open_map, strict_close_map) frameset_tuple_list val open_map_ref = ref strict_open_map val close_map_ref = ref strict_close_map fun mkOpenTag payloadStr = let val tag_atom = extractTag payloadStr in case AtomMap.find(!open_map_ref, tag_atom) of NONE => OPENTAG (tag_atom, (payloadStr, extractAttrs payloadStr)) | SOME ctor => ctor (payloadStr, extractAttrs payloadStr) end fun mkCloseTag payloadStr = let val tag_atom = extractTag payloadStr in case AtomMap.find(!close_map_ref, tag_atom) of NONE => CLOSETAG tag_atom | SOME tok => tok end (* ____________________________________________________________ *) (* Alternative tokToString useful for printing. *) fun payloadToString (_, []) = "" | payloadToString (_, attrs as (_ :: _)) = " " ^ (HTML4Utils.attrsToStr attrs) fun tokToString EOF = "EOF" | tokToString (OPENTAG (tagname, tagdata)) = String.concat ["OPENTAG ", Atom.toString tagname, " ", payloadToString tagdata] | tokToString (CLOSETAG tagname) = "CLOSETAG " ^ (Atom.toString tagname) | tokToString (DOCTYPE docdata) = docdata | tokToString (PCDATA pcdata) = pcdata | tokToString (COMMENT comment) = comment | tokToString (CHAR_REF refint) = "&#" ^ (IntInf.toString refint) ^ ";" | tokToString (ENTITY_REF refatom) = "&" ^ (Atom.toString refatom) ^ ";" | tokToString (XML_PROCESSING directive) = "XML DIRECTIVE " ^ directive | tokToString (STARTA payload) = "<A" ^ (payloadToString payload) ^ ">" | tokToString ENDA = "</A>" | tokToString (STARTABBR payload) = "<ABBR" ^ (payloadToString payload) ^ ">" | tokToString ENDABBR = "</ABBR>" | tokToString (STARTACRONYM payload) = "<ACRONYM" ^ (payloadToString payload) ^ ">" | tokToString ENDACRONYM = "</ACRONYM>" | tokToString (STARTADDRESS payload) = "<ADDRESS" ^ (payloadToString payload) ^ ">" | tokToString ENDADDRESS = "</ADDRESS>" | tokToString (STARTAREA payload) = "<AREA" ^ (payloadToString payload) ^ ">" | tokToString (STARTB payload) = "<B" ^ (payloadToString payload) ^ ">" | tokToString ENDB = "</B>" | tokToString (STARTBASE payload) = "<BASE" ^ (payloadToString payload) ^ ">" | tokToString (STARTBDO payload) = "<BDO" ^ (payloadToString payload) ^ ">" | tokToString ENDBDO = "</BDO>" | tokToString (STARTBIG payload) = "<BIG" ^ (payloadToString payload) ^ ">" | tokToString ENDBIG = "</BIG>" | tokToString (STARTBLOCKQUOTE payload) = "<BLOCKQUOTE" ^ (payloadToString payload) ^ ">" | tokToString ENDBLOCKQUOTE = "</BLOCKQUOTE>" | tokToString (STARTBODY payload) = "<BODY" ^ (payloadToString payload) ^ ">" | tokToString ENDBODY = "</BODY>" | tokToString (STARTBR payload) = "<BR" ^ (payloadToString payload) ^ ">" | tokToString (STARTBUTTON payload) = "<BUTTON" ^ (payloadToString payload) ^ ">" | tokToString ENDBUTTON = "</BUTTON>" | tokToString (STARTCAPTION payload) = "<CAPTION" ^ (payloadToString payload) ^ ">" | tokToString ENDCAPTION = "</CAPTION>" | tokToString (STARTCITE payload) = "<CITE" ^ (payloadToString payload) ^ ">" | tokToString ENDCITE = "</CITE>" | tokToString (STARTCODE payload) = "<CODE" ^ (payloadToString payload) ^ ">" | tokToString ENDCODE = "</CODE>" | tokToString (STARTCOL payload) = "<COL" ^ (payloadToString payload) ^ ">" | tokToString (STARTCOLGROUP payload) = "<COLGROUP" ^ (payloadToString payload) ^ ">" | tokToString ENDCOLGROUP = "</COLGROUP>" | tokToString (STARTDD payload) = "<DD" ^ (payloadToString payload) ^ ">" | tokToString ENDDD = "</DD>" | tokToString (STARTDEL payload) = "<DEL" ^ (payloadToString payload) ^ ">" | tokToString ENDDEL = "</DEL>" | tokToString (STARTDFN payload) = "<DFN" ^ (payloadToString payload) ^ ">" | tokToString ENDDFN = "</DFN>" | tokToString (STARTDIV payload) = "<DIV" ^ (payloadToString payload) ^ ">" | tokToString ENDDIV = "</DIV>" | tokToString (STARTDL payload) = "<DL" ^ (payloadToString payload) ^ ">" | tokToString ENDDL = "</DL>" | tokToString (STARTDT payload) = "<DT" ^ (payloadToString payload) ^ ">" | tokToString ENDDT = "</DT>" | tokToString (STARTEM payload) = "<EM" ^ (payloadToString payload) ^ ">" | tokToString ENDEM = "</EM>" | tokToString (STARTFIELDSET payload) = "<FIELDSET" ^ (payloadToString payload) ^ ">" | tokToString ENDFIELDSET = "</FIELDSET>" | tokToString (STARTFORM payload) = "<FORM" ^ (payloadToString payload) ^ ">" | tokToString ENDFORM = "</FORM>" | tokToString (STARTH1 payload) = "<H1" ^ (payloadToString payload) ^ ">" | tokToString ENDH1 = "</H1>" | tokToString (STARTH2 payload) = "<H2" ^ (payloadToString payload) ^ ">" | tokToString ENDH2 = "</H2>" | tokToString (STARTH3 payload) = "<H3" ^ (payloadToString payload) ^ ">" | tokToString ENDH3 = "</H3>" | tokToString (STARTH4 payload) = "<H4" ^ (payloadToString payload) ^ ">" | tokToString ENDH4 = "</H4>" | tokToString (STARTH5 payload) = "<H5" ^ (payloadToString payload) ^ ">" | tokToString ENDH5 = "</H5>" | tokToString (STARTH6 payload) = "<H6" ^ (payloadToString payload) ^ ">" | tokToString ENDH6 = "</H6>" | tokToString (STARTHEAD payload) = "<HEAD" ^ (payloadToString payload) ^ ">" | tokToString ENDHEAD = "</HEAD>" | tokToString (STARTHR payload) = "<HR" ^ (payloadToString payload) ^ ">" | tokToString (STARTHTML payload) = "<HTML" ^ (payloadToString payload) ^ ">" | tokToString ENDHTML = "</HTML>" | tokToString (STARTI payload) = "<I" ^ (payloadToString payload) ^ ">" | tokToString ENDI = "</I>" | tokToString (STARTIMG payload) = "<IMG" ^ (payloadToString payload) ^ ">" | tokToString (STARTINPUT payload) = "<INPUT" ^ (payloadToString payload) ^ ">" | tokToString (STARTINS payload) = "<INS" ^ (payloadToString payload) ^ ">" | tokToString ENDINS = "</INS>" | tokToString (STARTKBD payload) = "<KBD" ^ (payloadToString payload) ^ ">" | tokToString ENDKBD = "</KBD>" | tokToString (STARTLABEL payload) = "<LABEL" ^ (payloadToString payload) ^ ">" | tokToString ENDLABEL = "</LABEL>" | tokToString (STARTLEGEND payload) = "<LEGEND" ^ (payloadToString payload) ^ ">" | tokToString ENDLEGEND = "</LEGEND>" | tokToString (STARTLI payload) = "<LI" ^ (payloadToString payload) ^ ">" | tokToString ENDLI = "</LI>" | tokToString (STARTLINK payload) = "<LINK" ^ (payloadToString payload) ^ ">" | tokToString (STARTMAP payload) = "<MAP" ^ (payloadToString payload) ^ ">" | tokToString ENDMAP = "</MAP>" | tokToString (STARTMETA payload) = "<META" ^ (payloadToString payload) ^ ">" | tokToString (STARTNOSCRIPT payload) = "<NOSCRIPT" ^ (payloadToString payload) ^ ">" | tokToString ENDNOSCRIPT = "</NOSCRIPT>" | tokToString (STARTOBJECT payload) = "<OBJECT" ^ (payloadToString payload) ^ ">" | tokToString ENDOBJECT = "</OBJECT>" | tokToString (STARTOL payload) = "<OL" ^ (payloadToString payload) ^ ">" | tokToString ENDOL = "</OL>" | tokToString (STARTOPTGROUP payload) = "<OPTGROUP" ^ (payloadToString payload) ^ ">" | tokToString ENDOPTGROUP = "</OPTGROUP>" | tokToString (STARTOPTION payload) = "<OPTION" ^ (payloadToString payload) ^ ">" | tokToString ENDOPTION = "</OPTION>" | tokToString (STARTP payload) = "<P" ^ (payloadToString payload) ^ ">" | tokToString ENDP = "</P>" | tokToString (STARTPARAM payload) = "<PARAM" ^ (payloadToString payload) ^ ">" | tokToString (STARTPRE payload) = "<PRE" ^ (payloadToString payload) ^ ">" | tokToString ENDPRE = "</PRE>" | tokToString (STARTQ payload) = "<Q" ^ (payloadToString payload) ^ ">" | tokToString ENDQ = "</Q>" | tokToString (STARTSAMP payload) = "<SAMP" ^ (payloadToString payload) ^ ">" | tokToString ENDSAMP = "</SAMP>" | tokToString (STARTSCRIPT payload) = "<SCRIPT" ^ (payloadToString payload) ^ ">" | tokToString ENDSCRIPT = "</SCRIPT>" | tokToString (STARTSELECT payload) = "<SELECT" ^ (payloadToString payload) ^ ">" | tokToString ENDSELECT = "</SELECT>" | tokToString (STARTSMALL payload) = "<SMALL" ^ (payloadToString payload) ^ ">" | tokToString ENDSMALL = "</SMALL>" | tokToString (STARTSPAN payload) = "<SPAN" ^ (payloadToString payload) ^ ">" | tokToString ENDSPAN = "</SPAN>" | tokToString (STARTSTRONG payload) = "<STRONG" ^ (payloadToString payload) ^ ">" | tokToString ENDSTRONG = "</STRONG>" | tokToString (STARTSTYLE payload) = "<STYLE" ^ (payloadToString payload) ^ ">" | tokToString ENDSTYLE = "</STYLE>" | tokToString (STARTSUB payload) = "<SUB" ^ (payloadToString payload) ^ ">" | tokToString ENDSUB = "</SUB>" | tokToString (STARTSUP payload) = "<SUP" ^ (payloadToString payload) ^ ">" | tokToString ENDSUP = "</SUP>" | tokToString (STARTTABLE payload) = "<TABLE" ^ (payloadToString payload) ^ ">" | tokToString ENDTABLE = "</TABLE>" | tokToString (STARTTBODY payload) = "<TBODY" ^ (payloadToString payload) ^ ">" | tokToString ENDTBODY = "</TBODY>" | tokToString (STARTTD payload) = "<TD" ^ (payloadToString payload) ^ ">" | tokToString ENDTD = "</TD>" | tokToString (STARTTEXTAREA payload) = "<TEXTAREA" ^ (payloadToString payload) ^ ">" | tokToString ENDTEXTAREA = "</TEXTAREA>" | tokToString (STARTTFOOT payload) = "<TFOOT" ^ (payloadToString payload) ^ ">" | tokToString ENDTFOOT = "</TFOOT>" | tokToString (STARTTH payload) = "<TH" ^ (payloadToString payload) ^ ">" | tokToString ENDTH = "</TH>" | tokToString (STARTTHEAD payload) = "<THEAD" ^ (payloadToString payload) ^ ">" | tokToString ENDTHEAD = "</THEAD>" | tokToString (STARTTITLE payload) = "<TITLE" ^ (payloadToString payload) ^ ">" | tokToString ENDTITLE = "" | tokToString (STARTTR payload) = "" | tokToString ENDTR = "" | tokToString (STARTTT payload) = "" | tokToString ENDTT = "" | tokToString (STARTUL payload) = "" | tokToString ENDUL = "" | tokToString (STARTVAR payload) = "" | tokToString ENDVAR = "" | tokToString (STARTAPPLET payload) = "" | tokToString ENDAPPLET = "" | tokToString (STARTBASEFONT payload) = "" | tokToString (STARTCENTER payload) = "" | tokToString ENDCENTER = "" | tokToString (STARTDIR payload) = "" | tokToString ENDDIR = "
    " | tokToString (STARTFONT payload) = "" | tokToString ENDFONT = "" | tokToString (STARTIFRAME payload) = "" | tokToString ENDIFRAME = "" | tokToString (STARTISINDEX payload) = "" | tokToString (STARTMENU payload) = "" | tokToString ENDMENU = "" | tokToString (STARTS payload) = "" | tokToString ENDS = "" | tokToString (STARTSTRIKE payload) = "" | tokToString ENDSTRIKE = "" | tokToString (STARTU payload) = "" | tokToString ENDU = "" | tokToString (STARTFRAME payload) = "" | tokToString (STARTFRAMESET payload) = "" | tokToString ENDFRAMESET = "" | tokToString (STARTNOFRAMES payload) = "" | tokToString ENDNOFRAMES = "" (* ______________________________________________________________________ *) fun tokGetAttrs (STARTA payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTABBR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTACRONYM payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTADDRESS payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTAREA payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTB payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBASE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBDO payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBIG payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBLOCKQUOTE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBODY payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBUTTON payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCAPTION payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCITE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCODE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCOL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCOLGROUP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDD payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDEL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDFN payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDIV payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTEM payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTFIELDSET payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTFORM payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH1 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH2 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH3 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH4 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH5 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTH6 payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTHEAD payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTHR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTHTML payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTI payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTIMG payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTINPUT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTINS payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTKBD payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTLABEL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTLEGEND payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTLI payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTLINK payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTMAP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTMETA payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTNOSCRIPT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTOBJECT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTOL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTOPTGROUP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTOPTION payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTPARAM payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTPRE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTQ payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSAMP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSCRIPT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSELECT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSMALL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSPAN payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSTRONG payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSTYLE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSUB payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSUP payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTABLE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTBODY payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTD payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTEXTAREA payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTFOOT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTH payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTHEAD payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTITLE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTTT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTUL payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTVAR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTAPPLET payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTBASEFONT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTCENTER payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTDIR payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTFONT payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTIFRAME payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTISINDEX payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTMENU payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTS payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTSTRIKE payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTU payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTFRAME payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTFRAMESET payload) = SOME (H4U.getAttrs payload) | tokGetAttrs (STARTNOFRAMES payload) = SOME (H4U.getAttrs payload) | tokGetAttrs _ = NONE end (* HTML4TokenUtils *) (* ______________________________________________________________________ End of html4-token-utils.sml ______________________________________________________________________ *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4-utils.sml000066400000000000000000000167101416264345000241120ustar00rootroot00000000000000(* html4-utils.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Defines a set of utility data types and functions for the HTML 4 parser. *) structure HTML4Utils = struct (* ____________________________________________________________ Parse trees *) datatype 'a parsetree = Nd of Atom.atom * 'a parsetree list | Lf of 'a (* ____________________________________________________________ Data structure and utilities for element tokens *) type tag_payload = string * (Atom.atom * string option) list fun attrToStr (name, NONE) = Atom.toString name | attrToStr (name, SOME a_val) = String.concat [Atom.toString name, "=", a_val] fun attrsToStr attrs = String.concatWith " " (map attrToStr attrs) fun payloadToStr (payload, []) = payload | payloadToStr (_, attrs as (attr :: _)) = attrsToStr attrs val getAttrs : tag_payload -> (Atom.atom * string option) list = #2 (* ____________________________________________________________ Streams *) datatype 'a stream = StreamCons of 'a * (unit -> 'a stream) | StreamNil exception EmptyStream fun stream_hd (StreamCons (v, _)) = v | stream_hd StreamNil = raise EmptyStream fun stream_tl (StreamCons (_, rst)) = rst() | stream_tl StreamNil = raise EmptyStream fun stream_nth (stream, 0) = stream_hd stream | stream_nth (stream, idx) = stream_nth(stream_tl stream, idx - 1) fun stream_empty StreamNil = true | stream_empty (StreamCons _) = false fun stream_concat (StreamNil, stream2) = stream2 | stream_concat (StreamCons(hdval, tl_thunk), stream2) = StreamCons(hdval, fn () => (stream_concat (tl_thunk(), stream2))) fun stream_concatl [] = StreamNil | stream_concatl (StreamNil :: streams) = stream_concatl streams | stream_concatl ((StreamCons(hdval, tl_thunk)) :: streams) = StreamCons(hdval, fn () => (stream_concatl ((tl_thunk())::streams))) (* stream_concatt() - Special concat that allows a stream thunk to be appended to the tail of a stream. *) fun stream_concatt (StreamNil, tl_thunk2) = tl_thunk2() | stream_concatt (StreamCons(hdval, tl_thunk1), tl_thunk2) = StreamCons(hdval, fn () => stream_concatt (tl_thunk1(), tl_thunk2)) fun stream_map mapfn StreamNil = StreamNil | stream_map mapfn (StreamCons (hdval, tl_thunk)) = StreamCons(mapfn hdval, fn () => (stream_map mapfn (tl_thunk()))) (* stream_maps() - Full blown transduction from one kind of stream to another, where the mapper returns a stream. This allows one to zero and one to many mappings, as opposed to stream_map() which only allows one to one maps. *) fun stream_maps mapsfn instrm = (case instrm of StreamNil => StreamNil | StreamCons(crnt_hd, tl_thunk) => let val outstrm_front = mapsfn crnt_hd fun tl_thunk' () = stream_maps mapsfn (tl_thunk ()) in stream_concatt(outstrm_front, tl_thunk') end) fun stream_app appfn StreamNil = () | stream_app appfn (StreamCons (hdval, tl_thunk)) = (appfn hdval; stream_app appfn (tl_thunk())); fun stream_filter pred StreamNil = StreamNil | stream_filter pred (StreamCons (hdval, tl_thunk)) = if pred hdval then StreamCons(hdval, fn () => (stream_filter pred (tl_thunk()))) else stream_filter pred (tl_thunk()) fun stream_foldl foldlfn acc StreamNil = acc | stream_foldl foldlfn acc (StreamCons(hd_val, tl_thunk)) = stream_foldl foldlfn (foldlfn(hd_val, acc)) (tl_thunk()) fun stream_singleton soleval = StreamCons(soleval, fn () => StreamNil) fun stream_inf infval = StreamCons(infval, fn () => (stream_inf infval)) fun stream_fromList [] = StreamNil | stream_fromList (elem::elems) = StreamCons(elem, fn () => stream_fromList elems) (* ____________________________________________________________ Parse tree streams *) datatype 'a parsevisitation = EnterNT of Atom.atom | ExitNT of Atom.atom | VisitT of 'a fun visitationToString _ (EnterNT ntAtom) = concat["entry of ", Atom.toString ntAtom, " nonterminal"] | visitationToString _ (ExitNT ntAtom) = concat["exit of ", Atom.toString ntAtom, " nonterminal"] | visitationToString termToString (VisitT terminal) = concat["vistation of ", termToString terminal, " terminal"] fun visitationSame _ (EnterNT ntAtom, EnterNT ntAtom') = Atom.same(ntAtom, ntAtom') | visitationSame _ (ExitNT ntAtom, ExitNT ntAtom') = Atom.same(ntAtom, ntAtom') | visitationSame termSame (VisitT term, VisitT term') = termSame(term, term') | visitationSame _ _ = false fun parsetreeToVisitationStream (node as (Nd (ntAtom, children))) = let fun tl_thunk () = let val children' = map parsetreeToVisitationStream children in stream_concat(stream_concatl children', stream_singleton (ExitNT ntAtom)) end in StreamCons(EnterNT ntAtom, tl_thunk) end | parsetreeToVisitationStream (node as (Lf payload)) = StreamCons(VisitT payload, fn () => StreamNil) fun visitationStreamToParsetree strm = let fun handleVisit (EnterNT _, (spine, peers)) = (peers :: spine, []) | handleVisit (ExitNT ntAtom, ((peers :: spine), children')) = (spine, (Nd (ntAtom, rev children')) :: peers) | handleVisit (VisitT term, (spine, peers)) = (spine, (Lf term) :: peers) val (_, result :: _) = stream_foldl handleVisit ([], []) strm in result end fun parsetreeStreamMapT maptfn = let fun transduce StreamNil = StreamNil | transduce (StreamCons(crnt_hd, tl_thunk)) = let val hd' = case crnt_hd of VisitT term => VisitT (maptfn term) | _ => crnt_hd fun tl_thunk' () = transduce (tl_thunk ()) in StreamCons(hd', tl_thunk') end in transduce end (* parsetreeStreamMapTStream(): given a function that maps from terminals to a parse tree visitation stream, do a map over an existing visitation stream. This should be useful for mapping some placeholder token into a synthetic nonterminal or list of terminals. *) fun parsetreeStreamMapTStream (guardfn, maptsfn) = let fun transduce StreamNil = StreamNil | transduce (StreamCons(crnt_hd, tl_thunk)) = let fun tl_thunk' () = transduce (tl_thunk ()) in case crnt_hd of VisitT term => if (guardfn term) then stream_concatt(maptsfn term, tl_thunk') else StreamCons(crnt_hd, tl_thunk') | _ => StreamCons(crnt_hd, tl_thunk') end in transduce end fun mkParsetreeStreamToString termToString strm = let fun handleVisit (EnterNT ntAtom, (indent, outs)) = (String.concat [indent, " "], (String.concat [indent, Atom.toString ntAtom, "\n"] :: outs)) | handleVisit (ExitNT ntAtom, (indent, outs)) = (String.extract(indent, 1, NONE), outs) | handleVisit (VisitT term, (indent, outs)) = (indent, String.concat [indent, termToString term, "\n"] :: outs) val (_, outs) = stream_foldl handleVisit ("", []) strm in String.concat(rev outs) end end (* ______________________________________________________________________ End of html4-utils.sml ______________________________________________________________________ *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4.g000066400000000000000000000675141416264345000224170ustar00rootroot00000000000000(* html4.g * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) %name HTML4; %defs( open HTML4Utils fun optToList NONE = [] | optToList (SOME thing) = [thing] fun optListToList NONE = [] | optListToList (SOME thing) = thing ); %tokens : OPENTAG of Atom.atom * HTML4Utils.tag_payload | CLOSETAG of Atom.atom | COMMENT of string | PCDATA of string | DOCTYPE of string | CHAR_REF of IntInf.int | ENTITY_REF of Atom.atom | XML_PROCESSING of string (* HTML 4 element tokens. *) | STARTA of HTML4Utils.tag_payload | ENDA | STARTABBR of HTML4Utils.tag_payload | ENDABBR | STARTACRONYM of HTML4Utils.tag_payload | ENDACRONYM | STARTADDRESS of HTML4Utils.tag_payload | ENDADDRESS | STARTAPPLET of HTML4Utils.tag_payload | ENDAPPLET | STARTAREA of HTML4Utils.tag_payload (* No END tag for AREA element. *) | STARTB of HTML4Utils.tag_payload | ENDB | STARTBASE of HTML4Utils.tag_payload (* No END tag for BASE element. *) | STARTBASEFONT of HTML4Utils.tag_payload (* No END tag for BASEFONT element. *) | STARTBDO of HTML4Utils.tag_payload | ENDBDO | STARTBIG of HTML4Utils.tag_payload | ENDBIG | STARTBLOCKQUOTE of HTML4Utils.tag_payload | ENDBLOCKQUOTE | STARTBODY of HTML4Utils.tag_payload | ENDBODY | STARTBR of HTML4Utils.tag_payload (* No END tag for BR element. *) | STARTBUTTON of HTML4Utils.tag_payload | ENDBUTTON | STARTCAPTION of HTML4Utils.tag_payload | ENDCAPTION | STARTCENTER of HTML4Utils.tag_payload | ENDCENTER | STARTCITE of HTML4Utils.tag_payload | ENDCITE | STARTCODE of HTML4Utils.tag_payload | ENDCODE | STARTCOL of HTML4Utils.tag_payload (* No END tag for COL element. *) | STARTCOLGROUP of HTML4Utils.tag_payload | ENDCOLGROUP | STARTDD of HTML4Utils.tag_payload | ENDDD | STARTDEL of HTML4Utils.tag_payload | ENDDEL | STARTDFN of HTML4Utils.tag_payload | ENDDFN | STARTDIR of HTML4Utils.tag_payload | ENDDIR | STARTDIV of HTML4Utils.tag_payload | ENDDIV | STARTDL of HTML4Utils.tag_payload | ENDDL | STARTDT of HTML4Utils.tag_payload | ENDDT | STARTEM of HTML4Utils.tag_payload | ENDEM | STARTFIELDSET of HTML4Utils.tag_payload | ENDFIELDSET | STARTFONT of HTML4Utils.tag_payload | ENDFONT | STARTFORM of HTML4Utils.tag_payload | ENDFORM | STARTFRAME of HTML4Utils.tag_payload (* No END tag for FRAME element. *) | STARTFRAMESET of HTML4Utils.tag_payload | ENDFRAMESET | STARTH1 of HTML4Utils.tag_payload | ENDH1 | STARTH2 of HTML4Utils.tag_payload | ENDH2 | STARTH3 of HTML4Utils.tag_payload | ENDH3 | STARTH4 of HTML4Utils.tag_payload | ENDH4 | STARTH5 of HTML4Utils.tag_payload | ENDH5 | STARTH6 of HTML4Utils.tag_payload | ENDH6 | STARTHEAD of HTML4Utils.tag_payload | ENDHEAD | STARTHR of HTML4Utils.tag_payload (* No END tag for HR element. *) | STARTHTML of HTML4Utils.tag_payload | ENDHTML | STARTI of HTML4Utils.tag_payload | ENDI | STARTIFRAME of HTML4Utils.tag_payload | ENDIFRAME | STARTIMG of HTML4Utils.tag_payload (* No END tag for IMG element. *) | STARTINPUT of HTML4Utils.tag_payload (* No END tag for INPUT element. *) | STARTINS of HTML4Utils.tag_payload | ENDINS | STARTISINDEX of HTML4Utils.tag_payload (* No END tag for ISINDEX element. *) | STARTKBD of HTML4Utils.tag_payload | ENDKBD | STARTLABEL of HTML4Utils.tag_payload | ENDLABEL | STARTLEGEND of HTML4Utils.tag_payload | ENDLEGEND | STARTLI of HTML4Utils.tag_payload | ENDLI | STARTLINK of HTML4Utils.tag_payload (* No END tag for LINK element. *) | STARTMAP of HTML4Utils.tag_payload | ENDMAP | STARTMENU of HTML4Utils.tag_payload | ENDMENU | STARTMETA of HTML4Utils.tag_payload (* No END tag for META element. *) | STARTNOFRAMES of HTML4Utils.tag_payload | ENDNOFRAMES | STARTNOSCRIPT of HTML4Utils.tag_payload | ENDNOSCRIPT | STARTOBJECT of HTML4Utils.tag_payload | ENDOBJECT | STARTOL of HTML4Utils.tag_payload | ENDOL | STARTOPTGROUP of HTML4Utils.tag_payload | ENDOPTGROUP | STARTOPTION of HTML4Utils.tag_payload | ENDOPTION | STARTP of HTML4Utils.tag_payload | ENDP | STARTPARAM of HTML4Utils.tag_payload (* No END tag for PARAM element. *) | STARTPRE of HTML4Utils.tag_payload | ENDPRE | STARTQ of HTML4Utils.tag_payload | ENDQ | STARTS of HTML4Utils.tag_payload | ENDS | STARTSAMP of HTML4Utils.tag_payload | ENDSAMP | STARTSCRIPT of HTML4Utils.tag_payload | ENDSCRIPT | STARTSELECT of HTML4Utils.tag_payload | ENDSELECT | STARTSMALL of HTML4Utils.tag_payload | ENDSMALL | STARTSPAN of HTML4Utils.tag_payload | ENDSPAN | STARTSTRIKE of HTML4Utils.tag_payload | ENDSTRIKE | STARTSTRONG of HTML4Utils.tag_payload | ENDSTRONG | STARTSTYLE of HTML4Utils.tag_payload | ENDSTYLE | STARTSUB of HTML4Utils.tag_payload | ENDSUB | STARTSUP of HTML4Utils.tag_payload | ENDSUP | STARTTABLE of HTML4Utils.tag_payload | ENDTABLE | STARTTBODY of HTML4Utils.tag_payload | ENDTBODY | STARTTD of HTML4Utils.tag_payload | ENDTD | STARTTEXTAREA of HTML4Utils.tag_payload | ENDTEXTAREA | STARTTFOOT of HTML4Utils.tag_payload | ENDTFOOT | STARTTH of HTML4Utils.tag_payload | ENDTH | STARTTHEAD of HTML4Utils.tag_payload | ENDTHEAD | STARTTITLE of HTML4Utils.tag_payload | ENDTITLE | STARTTR of HTML4Utils.tag_payload | ENDTR | STARTTT of HTML4Utils.tag_payload | ENDTT | STARTU of HTML4Utils.tag_payload | ENDU | STARTUL of HTML4Utils.tag_payload | ENDUL | STARTVAR of HTML4Utils.tag_payload | ENDVAR ; %start document; %entry body, flow, block, inline, cdata_opt; document : cdata_opt (DOCTYPE cdata_opt => ((Lf (Tok.DOCTYPE DOCTYPE)) :: cdata_opt))? (STARTHTML cdata_opt => ((Lf (Tok.STARTHTML STARTHTML)) :: cdata_opt))? head (body | frameset) (ENDHTML cdata_opt => ((Lf (Tok.ENDHTML)) :: cdata_opt))? => (Nd (Atom.atom "DOCUMENT", cdata_opt @ (optListToList SR1) @ (optListToList SR2) @ (head :: SR3 :: (optListToList SR4)))) ; (* ______________________________________________________________________ HEAD and related elements ______________________________________________________________________ *) head : (STARTHEAD cdata_opt => ((Lf (Tok.STARTHEAD STARTHEAD)) :: cdata_opt))? (head_content cdata_opt => (head_content :: cdata_opt))* (ENDHEAD cdata_opt => ((Lf (Tok.ENDHEAD)) :: cdata_opt))? => (Nd (Atom.atom "HEAD", (optListToList SR1) @ (foldr op@ [] SR2) @ (optListToList SR3))) ; head_content : title | base | script | style | meta | link | object ; title : STARTTITLE cdata_opt ENDTITLE => (Nd (Atom.atom "TITLE", (Lf (Tok.STARTTITLE STARTTITLE)) :: (cdata_opt @ [Lf (Tok.ENDTITLE)]))) ; base : STARTBASE => (Nd (Atom.atom "BASE", [Lf (Tok.STARTBASE STARTBASE)])) ; script : STARTSCRIPT cdata_opt ENDSCRIPT => (Nd (Atom.atom "SCRIPT", (Lf (Tok.STARTSCRIPT STARTSCRIPT)) :: (cdata_opt @ [Lf (Tok.ENDSCRIPT)]))) ; style : STARTSTYLE cdata_opt ENDSTYLE => (Nd (Atom.atom "STYLE", (Lf (Tok.STARTSTYLE STARTSTYLE)) :: (cdata_opt @ [Lf (Tok.ENDSTYLE)]))) ; meta : STARTMETA => (Nd (Atom.atom "META", [Lf (Tok.STARTMETA STARTMETA)])) ; link : STARTLINK => (Nd (Atom.atom "LINK", [Lf (Tok.STARTLINK STARTLINK)])) ; object : STARTOBJECT (param | flow)* ENDOBJECT => (Nd (Atom.atom "OBJECT", (Lf (Tok.STARTOBJECT STARTOBJECT)) :: (SR @ [Lf (Tok.ENDOBJECT)]))) ; param : STARTPARAM => (Nd (Atom.atom "PARAM", [(Lf (Tok.STARTPARAM STARTPARAM))])) ; (* ______________________________________________________________________ BODY and related elements ______________________________________________________________________ *) body : STARTBODY body_rest => (Nd (Atom.atom "BODY", (Lf (Tok.STARTBODY STARTBODY)) :: body_rest)) | (block | ins | del) body_rest => (Nd (Atom.atom "BODY", SR :: body_rest)) ; body_rest : (block | script | ins | del | cdata)* (ENDBODY cdata_opt => ((Lf (Tok.ENDBODY)) :: cdata_opt))? => (SR1 @ (optListToList SR2)) ; flow : block | inline ; block : p | heading | list | preformatted | dl | div | noscript | blockquote | form | hr | table | fieldset | address | block_loose ; block_loose : center | isindex ; heading : h1 | h2 | h3 | h4 | h5 | h6 ; list : ul | ol | list_loose ; list_loose : dir | menu ; preformatted : pre ; inline : fontstyle | phrase | special | formctrl | cdata ; fontstyle : tt | i | b | big | small | fontstyle_loose ; fontstyle_loose : u | s | strike ; phrase : em | strong | dfn | code | samp | kbd | var | cite | abbr | acronym ; special : a | img | object | br | script | map | q | sub | sup | span | bdo | special_loose ; special_loose : applet | basefont | font | iframe ; formctrl : input | select | textarea | label | button ; (* Actual elements *) a : STARTA inline* ENDA => (Nd (Atom.atom "A", (Lf (Tok.STARTA STARTA)) :: (inline @ [Lf (Tok.ENDA)]))) ; abbr : STARTABBR inline* ENDABBR => (Nd (Atom.atom "ABBR", (Lf (Tok.STARTABBR STARTABBR)) :: (inline @ [Lf (Tok.ENDABBR)]))) ; acronym : STARTACRONYM inline* ENDACRONYM => (Nd (Atom.atom "ACRONYM", (Lf (Tok.STARTACRONYM STARTACRONYM)) :: (inline @ [Lf (Tok.ENDACRONYM)]))) ; address : STARTADDRESS inline* ENDADDRESS => (Nd (Atom.atom "ADDRESS", (Lf (Tok.STARTADDRESS STARTADDRESS)) :: (inline @ [Lf (Tok.ENDADDRESS)]))) ; applet : STARTAPPLET (param | flow)* ENDAPPLET => (Nd (Atom.atom "APPLET", (Lf (Tok.STARTAPPLET STARTAPPLET)) :: (SR @ [Lf (Tok.ENDAPPLET)]))) ; area : STARTAREA => (Nd (Atom.atom "AREA", [Lf (Tok.STARTAREA STARTAREA)])) ; b : STARTB inline* ENDB => (Nd (Atom.atom "B", (Lf (Tok.STARTB STARTB)) :: (inline @ [Lf (Tok.ENDB)]))) ; basefont : STARTBASEFONT => (Nd (Atom.atom "BASEFONT", [Lf (Tok.STARTBASEFONT STARTBASEFONT)])) ; bdo : STARTBDO inline* ENDBDO => (Nd (Atom.atom "BDO", (Lf (Tok.STARTBDO STARTBDO)) :: (inline @ [Lf (Tok.ENDBDO)]))) ; big : STARTBIG inline* ENDBIG => (Nd (Atom.atom "BIG", (Lf (Tok.STARTBIG STARTBIG)) :: (inline @ [Lf (Tok.ENDBIG)]))) ; blockquote : STARTBLOCKQUOTE (block | script | cdata)+ ENDBLOCKQUOTE => (Nd (Atom.atom "BLOCKQUOTE", (Lf (Tok.STARTBLOCKQUOTE STARTBLOCKQUOTE)) :: (SR @ [Lf (Tok.ENDBLOCKQUOTE)]))) ; br : STARTBR => (Nd (Atom.atom "BR", [Lf (Tok.STARTBR STARTBR)])) ; button : STARTBUTTON flow* ENDBUTTON => (Nd (Atom.atom "BUTTON", (Lf (Tok.STARTBUTTON STARTBUTTON)) :: (flow @ [Lf (Tok.ENDBUTTON)]))) ; caption : STARTCAPTION inline* ENDCAPTION => (Nd (Atom.atom "CAPTION", (Lf (Tok.STARTCAPTION STARTCAPTION)) :: (inline @ [Lf (Tok.ENDCAPTION)]))) ; center : STARTCENTER flow* ENDCENTER => (Nd (Atom.atom "CENTER", (Lf (Tok.STARTCENTER STARTCENTER)) :: (flow @ [Lf (Tok.ENDCENTER)]))) ; cite : STARTCITE inline* ENDCITE => (Nd (Atom.atom "CITE", (Lf (Tok.STARTCITE STARTCITE)) :: (inline @ [Lf (Tok.ENDCITE)]))) ; code : STARTCODE inline* ENDCODE => (Nd (Atom.atom "CODE", (Lf (Tok.STARTCODE STARTCODE)) :: (inline @ [Lf (Tok.ENDCODE)]))) ; col : STARTCOL => (Nd (Atom.atom "COL", [Lf (Tok.STARTCOL STARTCOL)])) ; colgroup : STARTCOLGROUP cdata_opt (col cdata_opt => (col :: cdata_opt))* (ENDCOLGROUP => (Lf (Tok.ENDCOLGROUP)))? => (Nd (Atom.atom "COLGROUP", (Lf (Tok.STARTCOLGROUP STARTCOLGROUP)) :: (cdata_opt @ (foldr op@ [] SR1) @ (optToList SR2)))) ; dd : STARTDD flow* (ENDDD => (Lf (Tok.ENDDD)))? => (Nd (Atom.atom "DD", (Lf (Tok.STARTDD STARTDD)) :: (flow @ (optToList SR)))) ; del : STARTDEL flow* ENDDEL => (Nd (Atom.atom "DEL", (Lf (Tok.STARTDEL STARTDEL)) :: (flow @ [Lf (Tok.ENDDEL)]))) ; dfn : STARTDFN inline* ENDDFN => (Nd (Atom.atom "DFN", (Lf (Tok.STARTDFN STARTDFN)) :: (inline @ [Lf (Tok.ENDDFN)]))) ; dir : STARTDIR cdata_opt li+ ENDDIR => (Nd (Atom.atom "DIR", (Lf (Tok.STARTDIR STARTDIR)) :: (cdata_opt @ li @ [Lf (Tok.ENDDIR)]))) ; div : STARTDIV flow* ENDDIV => (Nd (Atom.atom "DIV", (Lf (Tok.STARTDIV STARTDIV)) :: (flow @ [Lf (Tok.ENDDIV)]))) ; dl : STARTDL cdata_opt (dt | dd)+ ENDDL => (Nd (Atom.atom "DL", (Lf (Tok.STARTDL STARTDL)) :: (cdata_opt @ SR @ [Lf (Tok.ENDDL)]))) ; dt : STARTDT inline* (ENDDT => (Lf (Tok.ENDDT)))? => (Nd (Atom.atom "DT", (Lf (Tok.STARTDT STARTDT)) :: (inline @ (optToList SR)))) ; em : STARTEM inline* ENDEM => (Nd (Atom.atom "EM", (Lf (Tok.STARTEM STARTEM)) :: (inline @ [Lf (Tok.ENDEM)]))) ; fieldset : STARTFIELDSET cdata_opt legend flow* ENDFIELDSET => (Nd (Atom.atom "FIELDSET", (Lf (Tok.STARTFIELDSET STARTFIELDSET)) :: (cdata_opt @ [legend] @ flow @ [Lf (Tok.ENDFIELDSET)]))) ; font : STARTFONT inline* ENDFONT => (Nd (Atom.atom "FONT", (Lf (Tok.STARTFONT STARTFONT)) :: (inline @ [Lf (Tok.ENDFONT)]))) ; form : STARTFORM (cdata | block | script)+ ENDFORM => (Nd (Atom.atom "FORM", (Lf (Tok.STARTFORM STARTFORM)) :: (SR @ [Lf (Tok.ENDFORM)]))) ; frame : STARTFRAME => (Nd (Atom.atom "FRAME", [Lf (Tok.STARTFRAME STARTFRAME)])) ; frameset : STARTFRAMESET (frameset | frame | cdata)+ (noframes cdata_opt => (noframes::cdata_opt))? ENDFRAMESET => (Nd (Atom.atom "FRAMESET", (Lf (Tok.STARTFRAMESET STARTFRAMESET)) :: (SR1 @ (optListToList SR2) @ [Lf (Tok.ENDFRAMESET)]))) ; h1 : STARTH1 inline* ENDH1 => (Nd (Atom.atom "H1", (Lf (Tok.STARTH1 STARTH1)) :: (inline @ [Lf (Tok.ENDH1)]))) ; h2 : STARTH2 inline* ENDH2 => (Nd (Atom.atom "H2", (Lf (Tok.STARTH2 STARTH2)) :: (inline @ [Lf (Tok.ENDH2)]))) ; h3 : STARTH3 inline* ENDH3 => (Nd (Atom.atom "H3", (Lf (Tok.STARTH3 STARTH3)) :: (inline @ [Lf (Tok.ENDH3)]))) ; h4 : STARTH4 inline* ENDH4 => (Nd (Atom.atom "H4", (Lf (Tok.STARTH4 STARTH4)) :: (inline @ [Lf (Tok.ENDH4)]))) ; h5 : STARTH5 inline* ENDH5 => (Nd (Atom.atom "H5", (Lf (Tok.STARTH5 STARTH5)) :: (inline @ [Lf (Tok.ENDH5)]))) ; h6 : STARTH6 inline* ENDH6 => (Nd (Atom.atom "H6", (Lf (Tok.STARTH6 STARTH6)) :: (inline @ [Lf (Tok.ENDH6)]))) ; hr : STARTHR => (Nd (Atom.atom "HR", [Lf (Tok.STARTHR STARTHR)])) ; i : STARTI inline* ENDI => (Nd (Atom.atom "I", (Lf (Tok.STARTI STARTI)) :: (inline @ [Lf (Tok.ENDI)]))) ; iframe : STARTIFRAME flow* ENDIFRAME => (Nd (Atom.atom "IFRAME", (Lf (Tok.STARTIFRAME STARTIFRAME)) :: (flow @ [Lf (Tok.ENDIFRAME)]))) ; img : STARTIMG => (Nd (Atom.atom "IMG", [Lf (Tok.STARTIMG STARTIMG)])) ; input : STARTINPUT => (Nd (Atom.atom "INPUT", [Lf (Tok.STARTINPUT STARTINPUT)])) ; ins : STARTINS flow* ENDINS => (Nd (Atom.atom "INS", (Lf (Tok.STARTINS STARTINS)) :: (flow @ [Lf (Tok.ENDINS)]))) ; isindex : STARTISINDEX => (Nd (Atom.atom "ISINDEX", [Lf (Tok.STARTISINDEX STARTISINDEX)])) ; kbd : STARTKBD inline* ENDKBD => (Nd (Atom.atom "KBD", (Lf (Tok.STARTKBD STARTKBD)) :: (inline @ [Lf (Tok.ENDKBD)]))) ; label : STARTLABEL inline* ENDLABEL => (Nd (Atom.atom "LABEL", (Lf (Tok.STARTLABEL STARTLABEL)) :: (inline @ [Lf (Tok.ENDLABEL)]))) ; legend : STARTLEGEND inline* ENDLEGEND => (Nd (Atom.atom "LEGEND", (Lf (Tok.STARTLEGEND STARTLEGEND)) :: (inline @ [Lf (Tok.ENDLEGEND)]))) ; li : STARTLI flow* (ENDLI => (Lf (Tok.ENDLI)))? => (Nd (Atom.atom "LI", (Lf (Tok.STARTLI STARTLI)) :: (flow @ (optToList SR)))) ; map : STARTMAP (cdata | block | area)+ ENDMAP => (Nd (Atom.atom "MAP", (Lf (Tok.STARTMAP STARTMAP)) :: (SR @ [Lf (Tok.ENDMAP)]))) ; menu : STARTMENU cdata_opt li+ ENDMENU => (Nd (Atom.atom "MENU", (Lf (Tok.STARTMENU STARTMENU)) :: (cdata_opt @ li @ [Lf (Tok.ENDMENU)]))) ; noframes : STARTNOFRAMES body ENDNOFRAMES => (Nd (Atom.atom "NOFRAMES", [Lf (Tok.STARTNOFRAMES STARTNOFRAMES), body, Lf (Tok.ENDNOFRAMES)])) ; noscript : STARTNOSCRIPT (cdata | block)+ ENDNOSCRIPT => (Nd (Atom.atom "NOSCRIPT", (Lf (Tok.STARTNOSCRIPT STARTNOSCRIPT)) :: (SR @ [Lf (Tok.ENDNOSCRIPT)]))) ; ol : STARTOL cdata_opt li+ ENDOL => (Nd (Atom.atom "OL", (Lf (Tok.STARTOL STARTOL)) :: (cdata_opt @ li @ [Lf (Tok.ENDOL)]))) ; optgroup : STARTOPTGROUP cdata_opt option+ ENDOPTGROUP cdata_opt => (Nd (Atom.atom "OPTGROUP", (Lf (Tok.STARTOPTGROUP STARTOPTGROUP)) :: (cdata_opt1 @ option @ ((Lf (Tok.ENDOPTGROUP)) :: cdata_opt2)))) ; option : STARTOPTION cdata_opt (ENDOPTION cdata_opt => ((Lf (Tok.ENDOPTION)) :: cdata_opt))? => (Nd (Atom.atom "OPTION", (Lf (Tok.STARTOPTION STARTOPTION)) :: (cdata_opt @ (optListToList SR)))) ; (* TODO: Making the ENDP optional, which is valid, causes left-recursion for the inline* part. This can be fixed by having a two state flow nonterminal, which the older HTML library does. *) p : STARTP inline* ENDP => (Nd (Atom.atom "P", (Lf (Tok.STARTP STARTP)) :: (inline @ [Lf (Tok.ENDP)]))) ; pre : STARTPRE inline* ENDPRE => (Nd (Atom.atom "PRE", (Lf (Tok.STARTPRE STARTPRE)) :: (inline @ [Lf (Tok.ENDPRE)]))) ; q : STARTQ inline* ENDQ => (Nd (Atom.atom "Q", (Lf (Tok.STARTQ STARTQ)) :: (inline @ [Lf (Tok.ENDQ)]))) ; s : STARTS inline* ENDS => (Nd (Atom.atom "S", (Lf (Tok.STARTS STARTS)) :: (inline @ [Lf (Tok.ENDS)]))) ; samp : STARTSAMP inline* ENDSAMP => (Nd (Atom.atom "SAMP", (Lf (Tok.STARTSAMP STARTSAMP)) :: (inline @ [Lf (Tok.ENDSAMP)]))) ; select : STARTSELECT cdata_opt (optgroup | option)+ ENDSELECT => (Nd (Atom.atom "SELECT", (Lf (Tok.STARTSELECT STARTSELECT)) :: (cdata_opt @ SR @ [Lf (Tok.ENDSELECT)]))) ; small : STARTSMALL inline* ENDSMALL => (Nd (Atom.atom "SMALL", (Lf (Tok.STARTSMALL STARTSMALL)) :: (inline @ [Lf (Tok.ENDSMALL)]))) ; span : STARTSPAN inline* ENDSPAN => (Nd (Atom.atom "SPAN", (Lf (Tok.STARTSPAN STARTSPAN)) :: (inline @ [Lf (Tok.ENDSPAN)]))) ; strike : STARTSTRIKE inline* ENDSTRIKE => (Nd (Atom.atom "STRIKE", (Lf (Tok.STARTSTRIKE STARTSTRIKE)) :: (inline @ [Lf (Tok.ENDSTRIKE)]))) ; strong : STARTSTRONG inline* ENDSTRONG => (Nd (Atom.atom "STRONG", (Lf (Tok.STARTSTRONG STARTSTRONG)) :: (inline @ [Lf (Tok.ENDSTRONG)]))) ; sub : STARTSUB inline* ENDSUB => (Nd (Atom.atom "SUB", (Lf (Tok.STARTSUB STARTSUB)) :: (inline @ [Lf (Tok.ENDSUB)]))) ; sup : STARTSUP inline* ENDSUP => (Nd (Atom.atom "SUP", (Lf (Tok.STARTSUP STARTSUP)) :: (inline @ [Lf (Tok.ENDSUP)]))) ; (* My reading of the HTML DTD indicates the following order of elements is enforceable: *) table : STARTTABLE cdata_opt (caption cdata_opt => (caption :: cdata_opt))? col_or_colgroups table_content ENDTABLE => (Nd (Atom.atom "TABLE", (Lf (Tok.STARTTABLE STARTTABLE)) :: (cdata_opt @ (optListToList SR) @ col_or_colgroups @ table_content @ [Lf (Tok.ENDTABLE)]))) ; (* The whole tr+ thing makes the original table production ambiguous: STARTTABLE ... thead? tfoot? tbody+ ENDTABLE *) table_content : thead tfoot? tbodies => (thead :: ((optToList tfoot)) @ tbodies) | tfoot tbodies => (tfoot :: tbodies) | tbodies_nostart ; col_or_colgroups : (* empty *) => ([]) | (col cdata_opt => (col :: cdata_opt))+ => (foldr op@ [] SR) | colgroup+ ; tbodies_nostart : (STARTTBODY cdata_opt => ((Lf (Tok.STARTTBODY STARTTBODY)) :: cdata_opt))? tr+ tbodies_rest? => (let val (tbody_rest, tbody_peers) = case tbodies_rest of NONE => ([], []) | SOME tbodies_tup => tbodies_tup in (Nd (Atom.atom "TBODIES_NOSTART", (optListToList SR) @ tr @ tbody_rest)) :: tbody_peers end) ; tbodies : STARTTBODY cdata_opt tr+ tbodies_rest => (let val (tbody_rest, tbody_peers) = tbodies_rest in (Nd (Atom.atom "TBODIES", (Lf (Tok.STARTTBODY STARTTBODY)) :: (cdata_opt @ tr @ tbody_rest))) :: tbody_peers end) ; tbodies_rest : ENDTBODY cdata_opt tbodies? => ((Lf (Tok.ENDTBODY)) :: cdata_opt, optListToList tbodies) | STARTTBODY cdata_opt tr+ tbodies_rest? => (let val (tbody_rest, tbody_peers) = case tbodies_rest of NONE => ([], []) | SOME tbodies_tup => tbodies_tup in ([], (Nd (Atom.atom "TBODIES_REST", (Lf (Tok.STARTTBODY STARTTBODY)) :: (cdata_opt @ tr @ tbody_rest))) :: tbody_peers) end) ; td : STARTTD flow* (ENDTD cdata_opt => ((Lf (Tok.ENDTD)) :: cdata_opt))? => (Nd (Atom.atom "TD", (Lf (Tok.STARTTD STARTTD)) :: (flow @ (optListToList SR)))) ; textarea : STARTTEXTAREA cdata_opt ENDTEXTAREA => (Nd (Atom.atom "TEXTAREA", (Lf (Tok.STARTTEXTAREA STARTTEXTAREA)) :: (cdata_opt @ [Lf (Tok.ENDTEXTAREA)]))) ; tfoot : STARTTFOOT cdata_opt tr+ (ENDTFOOT cdata_opt => ((Lf (Tok.ENDTFOOT)) :: cdata_opt))? => (Nd (Atom.atom "TFOOT", (Lf (Tok.STARTTFOOT STARTTFOOT)) :: (cdata_opt @ tr @ (optListToList SR)))) ; th : STARTTH flow* (ENDTH cdata_opt => ((Lf (Tok.ENDTH)) :: cdata_opt))? => (Nd (Atom.atom "TH", (Lf (Tok.STARTTH STARTTH)) :: (flow @ (optListToList SR)))) ; thead : STARTTHEAD cdata_opt tr+ (ENDTHEAD cdata_opt => ((Lf (Tok.ENDTHEAD)) :: cdata_opt))? => (Nd (Atom.atom "THEAD", (Lf (Tok.STARTTHEAD STARTTHEAD)) :: (cdata_opt @ tr @ (optListToList SR)))) ; tr : STARTTR cdata_opt (th | td)+ (ENDTR cdata_opt => ((Lf (Tok.ENDTR)) :: cdata_opt))? => (Nd (Atom.atom "TR", (Lf (Tok.STARTTR STARTTR)) :: (cdata_opt @ SR1 @ (optListToList SR2)))) ; tt : STARTTT inline* ENDTT => (Nd (Atom.atom "TT", (Lf (Tok.STARTTT STARTTT)) :: (inline @ [Lf (Tok.ENDTT)]))) ; u : STARTU inline* ENDU => (Nd (Atom.atom "U", (Lf (Tok.STARTU STARTU)) :: (inline @ [Lf (Tok.ENDU)]))) ; ul : STARTUL cdata_opt li+ ENDUL => (Nd (Atom.atom "UL", ((Lf (Tok.STARTUL STARTUL)) :: (cdata_opt @ li @ [Lf (Tok.ENDUL)])))) ; var : STARTVAR inline* ENDVAR => (Nd (Atom.atom "VAR", (Lf (Tok.STARTVAR STARTVAR)) :: (inline @ [Lf (Tok.ENDVAR)]))) ; (* ______________________________________________________________________ Miscellaneous data nonterminals ______________________________________________________________________ *) cdata : (PCDATA => (Tok.PCDATA PCDATA) | CHAR_REF => (Tok.CHAR_REF CHAR_REF) | ENTITY_REF => (Tok.ENTITY_REF ENTITY_REF) | COMMENT => (Tok.COMMENT COMMENT)) => ((Lf SR) : HTML4Tokens.token parsetree) ; cdata_opt : cdata* => (cdata : HTML4Tokens.token parsetree list) ; (* ______________________________________________________________________ End of html4.g ______________________________________________________________________ *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4.g.sml000066400000000000000000014377401416264345000232140ustar00rootroot00000000000000structure HTML4Tokens = struct datatype token = OPENTAG of Atom.atom * HTML4Utils.tag_payload | CLOSETAG of Atom.atom | COMMENT of string | PCDATA of string | DOCTYPE of string | CHAR_REF of IntInf.int | ENTITY_REF of Atom.atom | XML_PROCESSING of string | STARTA of HTML4Utils.tag_payload | ENDA | STARTABBR of HTML4Utils.tag_payload | ENDABBR | STARTACRONYM of HTML4Utils.tag_payload | ENDACRONYM | STARTADDRESS of HTML4Utils.tag_payload | ENDADDRESS | STARTAPPLET of HTML4Utils.tag_payload | ENDAPPLET | STARTAREA of HTML4Utils.tag_payload | STARTB of HTML4Utils.tag_payload | ENDB | STARTBASE of HTML4Utils.tag_payload | STARTBASEFONT of HTML4Utils.tag_payload | STARTBDO of HTML4Utils.tag_payload | ENDBDO | STARTBIG of HTML4Utils.tag_payload | ENDBIG | STARTBLOCKQUOTE of HTML4Utils.tag_payload | ENDBLOCKQUOTE | STARTBODY of HTML4Utils.tag_payload | ENDBODY | STARTBR of HTML4Utils.tag_payload | STARTBUTTON of HTML4Utils.tag_payload | ENDBUTTON | STARTCAPTION of HTML4Utils.tag_payload | ENDCAPTION | STARTCENTER of HTML4Utils.tag_payload | ENDCENTER | STARTCITE of HTML4Utils.tag_payload | ENDCITE | STARTCODE of HTML4Utils.tag_payload | ENDCODE | STARTCOL of HTML4Utils.tag_payload | STARTCOLGROUP of HTML4Utils.tag_payload | ENDCOLGROUP | STARTDD of HTML4Utils.tag_payload | ENDDD | STARTDEL of HTML4Utils.tag_payload | ENDDEL | STARTDFN of HTML4Utils.tag_payload | ENDDFN | STARTDIR of HTML4Utils.tag_payload | ENDDIR | STARTDIV of HTML4Utils.tag_payload | ENDDIV | STARTDL of HTML4Utils.tag_payload | ENDDL | STARTDT of HTML4Utils.tag_payload | ENDDT | STARTEM of HTML4Utils.tag_payload | ENDEM | STARTFIELDSET of HTML4Utils.tag_payload | ENDFIELDSET | STARTFONT of HTML4Utils.tag_payload | ENDFONT | STARTFORM of HTML4Utils.tag_payload | ENDFORM | STARTFRAME of HTML4Utils.tag_payload | STARTFRAMESET of HTML4Utils.tag_payload | ENDFRAMESET | STARTH1 of HTML4Utils.tag_payload | ENDH1 | STARTH2 of HTML4Utils.tag_payload | ENDH2 | STARTH3 of HTML4Utils.tag_payload | ENDH3 | STARTH4 of HTML4Utils.tag_payload | ENDH4 | STARTH5 of HTML4Utils.tag_payload | ENDH5 | STARTH6 of HTML4Utils.tag_payload | ENDH6 | STARTHEAD of HTML4Utils.tag_payload | ENDHEAD | STARTHR of HTML4Utils.tag_payload | STARTHTML of HTML4Utils.tag_payload | ENDHTML | STARTI of HTML4Utils.tag_payload | ENDI | STARTIFRAME of HTML4Utils.tag_payload | ENDIFRAME | STARTIMG of HTML4Utils.tag_payload | STARTINPUT of HTML4Utils.tag_payload | STARTINS of HTML4Utils.tag_payload | ENDINS | STARTISINDEX of HTML4Utils.tag_payload | STARTKBD of HTML4Utils.tag_payload | ENDKBD | STARTLABEL of HTML4Utils.tag_payload | ENDLABEL | STARTLEGEND of HTML4Utils.tag_payload | ENDLEGEND | STARTLI of HTML4Utils.tag_payload | ENDLI | STARTLINK of HTML4Utils.tag_payload | STARTMAP of HTML4Utils.tag_payload | ENDMAP | STARTMENU of HTML4Utils.tag_payload | ENDMENU | STARTMETA of HTML4Utils.tag_payload | STARTNOFRAMES of HTML4Utils.tag_payload | ENDNOFRAMES | STARTNOSCRIPT of HTML4Utils.tag_payload | ENDNOSCRIPT | STARTOBJECT of HTML4Utils.tag_payload | ENDOBJECT | STARTOL of HTML4Utils.tag_payload | ENDOL | STARTOPTGROUP of HTML4Utils.tag_payload | ENDOPTGROUP | STARTOPTION of HTML4Utils.tag_payload | ENDOPTION | STARTP of HTML4Utils.tag_payload | ENDP | STARTPARAM of HTML4Utils.tag_payload | STARTPRE of HTML4Utils.tag_payload | ENDPRE | STARTQ of HTML4Utils.tag_payload | ENDQ | STARTS of HTML4Utils.tag_payload | ENDS | STARTSAMP of HTML4Utils.tag_payload | ENDSAMP | STARTSCRIPT of HTML4Utils.tag_payload | ENDSCRIPT | STARTSELECT of HTML4Utils.tag_payload | ENDSELECT | STARTSMALL of HTML4Utils.tag_payload | ENDSMALL | STARTSPAN of HTML4Utils.tag_payload | ENDSPAN | STARTSTRIKE of HTML4Utils.tag_payload | ENDSTRIKE | STARTSTRONG of HTML4Utils.tag_payload | ENDSTRONG | STARTSTYLE of HTML4Utils.tag_payload | ENDSTYLE | STARTSUB of HTML4Utils.tag_payload | ENDSUB | STARTSUP of HTML4Utils.tag_payload | ENDSUP | STARTTABLE of HTML4Utils.tag_payload | ENDTABLE | STARTTBODY of HTML4Utils.tag_payload | ENDTBODY | STARTTD of HTML4Utils.tag_payload | ENDTD | STARTTEXTAREA of HTML4Utils.tag_payload | ENDTEXTAREA | STARTTFOOT of HTML4Utils.tag_payload | ENDTFOOT | STARTTH of HTML4Utils.tag_payload | ENDTH | STARTTHEAD of HTML4Utils.tag_payload | ENDTHEAD | STARTTITLE of HTML4Utils.tag_payload | ENDTITLE | STARTTR of HTML4Utils.tag_payload | ENDTR | STARTTT of HTML4Utils.tag_payload | ENDTT | STARTU of HTML4Utils.tag_payload | ENDU | STARTUL of HTML4Utils.tag_payload | ENDUL | STARTVAR of HTML4Utils.tag_payload | ENDVAR | EOF val allToks = [ ENDA, ENDABBR, ENDACRONYM, ENDADDRESS, ENDAPPLET, ENDB, ENDBDO, ENDBIG, ENDBLOCKQUOTE, ENDBODY, ENDBUTTON, ENDCAPTION, ENDCENTER, ENDCITE, ENDCODE, ENDCOLGROUP, ENDDD, ENDDEL, ENDDFN, ENDDIR, ENDDIV, ENDDL, ENDDT, ENDEM, ENDFIELDSET, ENDFONT, ENDFORM, ENDFRAMESET, ENDH1, ENDH2, ENDH3, ENDH4, ENDH5, ENDH6, ENDHEAD, ENDHTML, ENDI, ENDIFRAME, ENDINS, ENDKBD, ENDLABEL, ENDLEGEND, ENDLI, ENDMAP, ENDMENU, ENDNOFRAMES, ENDNOSCRIPT, ENDOBJECT, ENDOL, ENDOPTGROUP, ENDOPTION, ENDP, ENDPRE, ENDQ, ENDS, ENDSAMP, ENDSCRIPT, ENDSELECT, ENDSMALL, ENDSPAN, ENDSTRIKE, ENDSTRONG, ENDSTYLE, ENDSUB, ENDSUP, ENDTABLE, ENDTBODY, ENDTD, ENDTEXTAREA, ENDTFOOT, ENDTH, ENDTHEAD, ENDTITLE, ENDTR, ENDTT, ENDU, ENDUL, ENDVAR, EOF ] fun toString tok = (case (tok) of (OPENTAG(_)) => "OPENTAG" | (CLOSETAG(_)) => "CLOSETAG" | (COMMENT(_)) => "COMMENT" | (PCDATA(_)) => "PCDATA" | (DOCTYPE(_)) => "DOCTYPE" | (CHAR_REF(_)) => "CHAR_REF" | (ENTITY_REF(_)) => "ENTITY_REF" | (XML_PROCESSING(_)) => "XML_PROCESSING" | (STARTA(_)) => "STARTA" | (ENDA) => "ENDA" | (STARTABBR(_)) => "STARTABBR" | (ENDABBR) => "ENDABBR" | (STARTACRONYM(_)) => "STARTACRONYM" | (ENDACRONYM) => "ENDACRONYM" | (STARTADDRESS(_)) => "STARTADDRESS" | (ENDADDRESS) => "ENDADDRESS" | (STARTAPPLET(_)) => "STARTAPPLET" | (ENDAPPLET) => "ENDAPPLET" | (STARTAREA(_)) => "STARTAREA" | (STARTB(_)) => "STARTB" | (ENDB) => "ENDB" | (STARTBASE(_)) => "STARTBASE" | (STARTBASEFONT(_)) => "STARTBASEFONT" | (STARTBDO(_)) => "STARTBDO" | (ENDBDO) => "ENDBDO" | (STARTBIG(_)) => "STARTBIG" | (ENDBIG) => "ENDBIG" | (STARTBLOCKQUOTE(_)) => "STARTBLOCKQUOTE" | (ENDBLOCKQUOTE) => "ENDBLOCKQUOTE" | (STARTBODY(_)) => "STARTBODY" | (ENDBODY) => "ENDBODY" | (STARTBR(_)) => "STARTBR" | (STARTBUTTON(_)) => "STARTBUTTON" | (ENDBUTTON) => "ENDBUTTON" | (STARTCAPTION(_)) => "STARTCAPTION" | (ENDCAPTION) => "ENDCAPTION" | (STARTCENTER(_)) => "STARTCENTER" | (ENDCENTER) => "ENDCENTER" | (STARTCITE(_)) => "STARTCITE" | (ENDCITE) => "ENDCITE" | (STARTCODE(_)) => "STARTCODE" | (ENDCODE) => "ENDCODE" | (STARTCOL(_)) => "STARTCOL" | (STARTCOLGROUP(_)) => "STARTCOLGROUP" | (ENDCOLGROUP) => "ENDCOLGROUP" | (STARTDD(_)) => "STARTDD" | (ENDDD) => "ENDDD" | (STARTDEL(_)) => "STARTDEL" | (ENDDEL) => "ENDDEL" | (STARTDFN(_)) => "STARTDFN" | (ENDDFN) => "ENDDFN" | (STARTDIR(_)) => "STARTDIR" | (ENDDIR) => "ENDDIR" | (STARTDIV(_)) => "STARTDIV" | (ENDDIV) => "ENDDIV" | (STARTDL(_)) => "STARTDL" | (ENDDL) => "ENDDL" | (STARTDT(_)) => "STARTDT" | (ENDDT) => "ENDDT" | (STARTEM(_)) => "STARTEM" | (ENDEM) => "ENDEM" | (STARTFIELDSET(_)) => "STARTFIELDSET" | (ENDFIELDSET) => "ENDFIELDSET" | (STARTFONT(_)) => "STARTFONT" | (ENDFONT) => "ENDFONT" | (STARTFORM(_)) => "STARTFORM" | (ENDFORM) => "ENDFORM" | (STARTFRAME(_)) => "STARTFRAME" | (STARTFRAMESET(_)) => "STARTFRAMESET" | (ENDFRAMESET) => "ENDFRAMESET" | (STARTH1(_)) => "STARTH1" | (ENDH1) => "ENDH1" | (STARTH2(_)) => "STARTH2" | (ENDH2) => "ENDH2" | (STARTH3(_)) => "STARTH3" | (ENDH3) => "ENDH3" | (STARTH4(_)) => "STARTH4" | (ENDH4) => "ENDH4" | (STARTH5(_)) => "STARTH5" | (ENDH5) => "ENDH5" | (STARTH6(_)) => "STARTH6" | (ENDH6) => "ENDH6" | (STARTHEAD(_)) => "STARTHEAD" | (ENDHEAD) => "ENDHEAD" | (STARTHR(_)) => "STARTHR" | (STARTHTML(_)) => "STARTHTML" | (ENDHTML) => "ENDHTML" | (STARTI(_)) => "STARTI" | (ENDI) => "ENDI" | (STARTIFRAME(_)) => "STARTIFRAME" | (ENDIFRAME) => "ENDIFRAME" | (STARTIMG(_)) => "STARTIMG" | (STARTINPUT(_)) => "STARTINPUT" | (STARTINS(_)) => "STARTINS" | (ENDINS) => "ENDINS" | (STARTISINDEX(_)) => "STARTISINDEX" | (STARTKBD(_)) => "STARTKBD" | (ENDKBD) => "ENDKBD" | (STARTLABEL(_)) => "STARTLABEL" | (ENDLABEL) => "ENDLABEL" | (STARTLEGEND(_)) => "STARTLEGEND" | (ENDLEGEND) => "ENDLEGEND" | (STARTLI(_)) => "STARTLI" | (ENDLI) => "ENDLI" | (STARTLINK(_)) => "STARTLINK" | (STARTMAP(_)) => "STARTMAP" | (ENDMAP) => "ENDMAP" | (STARTMENU(_)) => "STARTMENU" | (ENDMENU) => "ENDMENU" | (STARTMETA(_)) => "STARTMETA" | (STARTNOFRAMES(_)) => "STARTNOFRAMES" | (ENDNOFRAMES) => "ENDNOFRAMES" | (STARTNOSCRIPT(_)) => "STARTNOSCRIPT" | (ENDNOSCRIPT) => "ENDNOSCRIPT" | (STARTOBJECT(_)) => "STARTOBJECT" | (ENDOBJECT) => "ENDOBJECT" | (STARTOL(_)) => "STARTOL" | (ENDOL) => "ENDOL" | (STARTOPTGROUP(_)) => "STARTOPTGROUP" | (ENDOPTGROUP) => "ENDOPTGROUP" | (STARTOPTION(_)) => "STARTOPTION" | (ENDOPTION) => "ENDOPTION" | (STARTP(_)) => "STARTP" | (ENDP) => "ENDP" | (STARTPARAM(_)) => "STARTPARAM" | (STARTPRE(_)) => "STARTPRE" | (ENDPRE) => "ENDPRE" | (STARTQ(_)) => "STARTQ" | (ENDQ) => "ENDQ" | (STARTS(_)) => "STARTS" | (ENDS) => "ENDS" | (STARTSAMP(_)) => "STARTSAMP" | (ENDSAMP) => "ENDSAMP" | (STARTSCRIPT(_)) => "STARTSCRIPT" | (ENDSCRIPT) => "ENDSCRIPT" | (STARTSELECT(_)) => "STARTSELECT" | (ENDSELECT) => "ENDSELECT" | (STARTSMALL(_)) => "STARTSMALL" | (ENDSMALL) => "ENDSMALL" | (STARTSPAN(_)) => "STARTSPAN" | (ENDSPAN) => "ENDSPAN" | (STARTSTRIKE(_)) => "STARTSTRIKE" | (ENDSTRIKE) => "ENDSTRIKE" | (STARTSTRONG(_)) => "STARTSTRONG" | (ENDSTRONG) => "ENDSTRONG" | (STARTSTYLE(_)) => "STARTSTYLE" | (ENDSTYLE) => "ENDSTYLE" | (STARTSUB(_)) => "STARTSUB" | (ENDSUB) => "ENDSUB" | (STARTSUP(_)) => "STARTSUP" | (ENDSUP) => "ENDSUP" | (STARTTABLE(_)) => "STARTTABLE" | (ENDTABLE) => "ENDTABLE" | (STARTTBODY(_)) => "STARTTBODY" | (ENDTBODY) => "ENDTBODY" | (STARTTD(_)) => "STARTTD" | (ENDTD) => "ENDTD" | (STARTTEXTAREA(_)) => "STARTTEXTAREA" | (ENDTEXTAREA) => "ENDTEXTAREA" | (STARTTFOOT(_)) => "STARTTFOOT" | (ENDTFOOT) => "ENDTFOOT" | (STARTTH(_)) => "STARTTH" | (ENDTH) => "ENDTH" | (STARTTHEAD(_)) => "STARTTHEAD" | (ENDTHEAD) => "ENDTHEAD" | (STARTTITLE(_)) => "STARTTITLE" | (ENDTITLE) => "ENDTITLE" | (STARTTR(_)) => "STARTTR" | (ENDTR) => "ENDTR" | (STARTTT(_)) => "STARTTT" | (ENDTT) => "ENDTT" | (STARTU(_)) => "STARTU" | (ENDU) => "ENDU" | (STARTUL(_)) => "STARTUL" | (ENDUL) => "ENDUL" | (STARTVAR(_)) => "STARTVAR" | (ENDVAR) => "ENDVAR" | (EOF) => "EOF" (* end case *)) fun isKW tok = (case (tok) of (OPENTAG(_)) => false | (CLOSETAG(_)) => false | (COMMENT(_)) => false | (PCDATA(_)) => false | (DOCTYPE(_)) => false | (CHAR_REF(_)) => false | (ENTITY_REF(_)) => false | (XML_PROCESSING(_)) => false | (STARTA(_)) => false | (ENDA) => false | (STARTABBR(_)) => false | (ENDABBR) => false | (STARTACRONYM(_)) => false | (ENDACRONYM) => false | (STARTADDRESS(_)) => false | (ENDADDRESS) => false | (STARTAPPLET(_)) => false | (ENDAPPLET) => false | (STARTAREA(_)) => false | (STARTB(_)) => false | (ENDB) => false | (STARTBASE(_)) => false | (STARTBASEFONT(_)) => false | (STARTBDO(_)) => false | (ENDBDO) => false | (STARTBIG(_)) => false | (ENDBIG) => false | (STARTBLOCKQUOTE(_)) => false | (ENDBLOCKQUOTE) => false | (STARTBODY(_)) => false | (ENDBODY) => false | (STARTBR(_)) => false | (STARTBUTTON(_)) => false | (ENDBUTTON) => false | (STARTCAPTION(_)) => false | (ENDCAPTION) => false | (STARTCENTER(_)) => false | (ENDCENTER) => false | (STARTCITE(_)) => false | (ENDCITE) => false | (STARTCODE(_)) => false | (ENDCODE) => false | (STARTCOL(_)) => false | (STARTCOLGROUP(_)) => false | (ENDCOLGROUP) => false | (STARTDD(_)) => false | (ENDDD) => false | (STARTDEL(_)) => false | (ENDDEL) => false | (STARTDFN(_)) => false | (ENDDFN) => false | (STARTDIR(_)) => false | (ENDDIR) => false | (STARTDIV(_)) => false | (ENDDIV) => false | (STARTDL(_)) => false | (ENDDL) => false | (STARTDT(_)) => false | (ENDDT) => false | (STARTEM(_)) => false | (ENDEM) => false | (STARTFIELDSET(_)) => false | (ENDFIELDSET) => false | (STARTFONT(_)) => false | (ENDFONT) => false | (STARTFORM(_)) => false | (ENDFORM) => false | (STARTFRAME(_)) => false | (STARTFRAMESET(_)) => false | (ENDFRAMESET) => false | (STARTH1(_)) => false | (ENDH1) => false | (STARTH2(_)) => false | (ENDH2) => false | (STARTH3(_)) => false | (ENDH3) => false | (STARTH4(_)) => false | (ENDH4) => false | (STARTH5(_)) => false | (ENDH5) => false | (STARTH6(_)) => false | (ENDH6) => false | (STARTHEAD(_)) => false | (ENDHEAD) => false | (STARTHR(_)) => false | (STARTHTML(_)) => false | (ENDHTML) => false | (STARTI(_)) => false | (ENDI) => false | (STARTIFRAME(_)) => false | (ENDIFRAME) => false | (STARTIMG(_)) => false | (STARTINPUT(_)) => false | (STARTINS(_)) => false | (ENDINS) => false | (STARTISINDEX(_)) => false | (STARTKBD(_)) => false | (ENDKBD) => false | (STARTLABEL(_)) => false | (ENDLABEL) => false | (STARTLEGEND(_)) => false | (ENDLEGEND) => false | (STARTLI(_)) => false | (ENDLI) => false | (STARTLINK(_)) => false | (STARTMAP(_)) => false | (ENDMAP) => false | (STARTMENU(_)) => false | (ENDMENU) => false | (STARTMETA(_)) => false | (STARTNOFRAMES(_)) => false | (ENDNOFRAMES) => false | (STARTNOSCRIPT(_)) => false | (ENDNOSCRIPT) => false | (STARTOBJECT(_)) => false | (ENDOBJECT) => false | (STARTOL(_)) => false | (ENDOL) => false | (STARTOPTGROUP(_)) => false | (ENDOPTGROUP) => false | (STARTOPTION(_)) => false | (ENDOPTION) => false | (STARTP(_)) => false | (ENDP) => false | (STARTPARAM(_)) => false | (STARTPRE(_)) => false | (ENDPRE) => false | (STARTQ(_)) => false | (ENDQ) => false | (STARTS(_)) => false | (ENDS) => false | (STARTSAMP(_)) => false | (ENDSAMP) => false | (STARTSCRIPT(_)) => false | (ENDSCRIPT) => false | (STARTSELECT(_)) => false | (ENDSELECT) => false | (STARTSMALL(_)) => false | (ENDSMALL) => false | (STARTSPAN(_)) => false | (ENDSPAN) => false | (STARTSTRIKE(_)) => false | (ENDSTRIKE) => false | (STARTSTRONG(_)) => false | (ENDSTRONG) => false | (STARTSTYLE(_)) => false | (ENDSTYLE) => false | (STARTSUB(_)) => false | (ENDSUB) => false | (STARTSUP(_)) => false | (ENDSUP) => false | (STARTTABLE(_)) => false | (ENDTABLE) => false | (STARTTBODY(_)) => false | (ENDTBODY) => false | (STARTTD(_)) => false | (ENDTD) => false | (STARTTEXTAREA(_)) => false | (ENDTEXTAREA) => false | (STARTTFOOT(_)) => false | (ENDTFOOT) => false | (STARTTH(_)) => false | (ENDTH) => false | (STARTTHEAD(_)) => false | (ENDTHEAD) => false | (STARTTITLE(_)) => false | (ENDTITLE) => false | (STARTTR(_)) => false | (ENDTR) => false | (STARTTT(_)) => false | (ENDTT) => false | (STARTU(_)) => false | (ENDU) => false | (STARTUL(_)) => false | (ENDUL) => false | (STARTVAR(_)) => false | (ENDVAR) => false | (EOF) => false (* end case *)) fun isEOF EOF = true | isEOF _ = false end (* HTML4Tokens *) functor HTML4ParseFn (Lex : ANTLR_LEXER) = struct local structure Tok = HTML4Tokens structure UserCode = struct open HTML4Utils fun optToList NONE = [] | optToList (SOME thing) = [thing] fun optListToList NONE = [] | optListToList (SOME thing) = thing fun document_PROD_1_SUBRULE_1_PROD_1_ACT (DOCTYPE, cdata_opt, DOCTYPE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.DOCTYPE DOCTYPE)) :: cdata_opt) fun document_PROD_1_SUBRULE_2_PROD_1_ACT (SR1, cdata_opt, STARTHTML, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTHTML_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.STARTHTML STARTHTML)) :: cdata_opt) fun document_PROD_1_SUBRULE_4_PROD_1_ACT (head, SR1, SR2, SR3, cdata_opt, ENDHTML, head_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDHTML_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDHTML)) :: cdata_opt) fun document_PROD_1_ACT (head, SR1, SR2, SR3, SR4, cdata_opt, head_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), SR4_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DOCUMENT", cdata_opt @ (optListToList SR1) @ (optListToList SR2) @ (head :: SR3 :: (optListToList SR4)))) fun head_PROD_1_SUBRULE_1_PROD_1_ACT (cdata_opt, STARTHEAD, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTHEAD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.STARTHEAD STARTHEAD)) :: cdata_opt) fun head_PROD_1_SUBRULE_2_PROD_1_ACT (SR1, cdata_opt, head_content, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), head_content_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (head_content :: cdata_opt) fun head_PROD_1_SUBRULE_3_PROD_1_ACT (SR1, SR2, cdata_opt, ENDHEAD, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDHEAD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDHEAD)) :: cdata_opt) fun head_PROD_1_ACT (SR1, SR2, SR3, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "HEAD", (optListToList SR1) @ (foldr op@ [] SR2) @ (optListToList SR3))) fun title_PROD_1_ACT (STARTTITLE, cdata_opt, ENDTITLE, STARTTITLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDTITLE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TITLE", (Lf (Tok.STARTTITLE STARTTITLE)) :: (cdata_opt @ [Lf (Tok.ENDTITLE)]))) fun base_PROD_1_ACT (STARTBASE, STARTBASE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BASE", [Lf (Tok.STARTBASE STARTBASE)])) fun script_PROD_1_ACT (cdata_opt, STARTSCRIPT, ENDSCRIPT, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTSCRIPT_SPAN : (Lex.pos * Lex.pos), ENDSCRIPT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SCRIPT", (Lf (Tok.STARTSCRIPT STARTSCRIPT)) :: (cdata_opt @ [Lf (Tok.ENDSCRIPT)]))) fun style_PROD_1_ACT (cdata_opt, STARTSTYLE, ENDSTYLE, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTSTYLE_SPAN : (Lex.pos * Lex.pos), ENDSTYLE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "STYLE", (Lf (Tok.STARTSTYLE STARTSTYLE)) :: (cdata_opt @ [Lf (Tok.ENDSTYLE)]))) fun meta_PROD_1_ACT (STARTMETA, STARTMETA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "META", [Lf (Tok.STARTMETA STARTMETA)])) fun link_PROD_1_ACT (STARTLINK, STARTLINK_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "LINK", [Lf (Tok.STARTLINK STARTLINK)])) fun object_PROD_1_ACT (SR, STARTOBJECT, ENDOBJECT, SR_SPAN : (Lex.pos * Lex.pos), STARTOBJECT_SPAN : (Lex.pos * Lex.pos), ENDOBJECT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "OBJECT", (Lf (Tok.STARTOBJECT STARTOBJECT)) :: (SR @ [Lf (Tok.ENDOBJECT)]))) fun param_PROD_1_ACT (STARTPARAM, STARTPARAM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "PARAM", [(Lf (Tok.STARTPARAM STARTPARAM))])) fun body_PROD_1_ACT (STARTBODY, body_rest, STARTBODY_SPAN : (Lex.pos * Lex.pos), body_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BODY", (Lf (Tok.STARTBODY STARTBODY)) :: body_rest)) fun body_PROD_2_ACT (SR, body_rest, SR_SPAN : (Lex.pos * Lex.pos), body_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BODY", SR :: body_rest)) fun body_rest_PROD_1_SUBRULE_2_PROD_1_ACT (ENDBODY, SR1, cdata_opt, ENDBODY_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDBODY)) :: cdata_opt) fun body_rest_PROD_1_ACT (SR1, SR2, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (SR1 @ (optListToList SR2)) fun a_PROD_1_ACT (inline, STARTA, ENDA, inline_SPAN : (Lex.pos * Lex.pos), STARTA_SPAN : (Lex.pos * Lex.pos), ENDA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "A", (Lf (Tok.STARTA STARTA)) :: (inline @ [Lf (Tok.ENDA)]))) fun abbr_PROD_1_ACT (inline, ENDABBR, STARTABBR, inline_SPAN : (Lex.pos * Lex.pos), ENDABBR_SPAN : (Lex.pos * Lex.pos), STARTABBR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "ABBR", (Lf (Tok.STARTABBR STARTABBR)) :: (inline @ [Lf (Tok.ENDABBR)]))) fun acronym_PROD_1_ACT (inline, STARTACRONYM, ENDACRONYM, inline_SPAN : (Lex.pos * Lex.pos), STARTACRONYM_SPAN : (Lex.pos * Lex.pos), ENDACRONYM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "ACRONYM", (Lf (Tok.STARTACRONYM STARTACRONYM)) :: (inline @ [Lf (Tok.ENDACRONYM)]))) fun address_PROD_1_ACT (inline, STARTADDRESS, ENDADDRESS, inline_SPAN : (Lex.pos * Lex.pos), STARTADDRESS_SPAN : (Lex.pos * Lex.pos), ENDADDRESS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "ADDRESS", (Lf (Tok.STARTADDRESS STARTADDRESS)) :: (inline @ [Lf (Tok.ENDADDRESS)]))) fun applet_PROD_1_ACT (SR, ENDAPPLET, STARTAPPLET, SR_SPAN : (Lex.pos * Lex.pos), ENDAPPLET_SPAN : (Lex.pos * Lex.pos), STARTAPPLET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "APPLET", (Lf (Tok.STARTAPPLET STARTAPPLET)) :: (SR @ [Lf (Tok.ENDAPPLET)]))) fun area_PROD_1_ACT (STARTAREA, STARTAREA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "AREA", [Lf (Tok.STARTAREA STARTAREA)])) fun b_PROD_1_ACT (inline, STARTB, ENDB, inline_SPAN : (Lex.pos * Lex.pos), STARTB_SPAN : (Lex.pos * Lex.pos), ENDB_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "B", (Lf (Tok.STARTB STARTB)) :: (inline @ [Lf (Tok.ENDB)]))) fun basefont_PROD_1_ACT (STARTBASEFONT, STARTBASEFONT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BASEFONT", [Lf (Tok.STARTBASEFONT STARTBASEFONT)])) fun bdo_PROD_1_ACT (inline, ENDBDO, STARTBDO, inline_SPAN : (Lex.pos * Lex.pos), ENDBDO_SPAN : (Lex.pos * Lex.pos), STARTBDO_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BDO", (Lf (Tok.STARTBDO STARTBDO)) :: (inline @ [Lf (Tok.ENDBDO)]))) fun big_PROD_1_ACT (inline, ENDBIG, STARTBIG, inline_SPAN : (Lex.pos * Lex.pos), ENDBIG_SPAN : (Lex.pos * Lex.pos), STARTBIG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BIG", (Lf (Tok.STARTBIG STARTBIG)) :: (inline @ [Lf (Tok.ENDBIG)]))) fun blockquote_PROD_1_ACT (SR, STARTBLOCKQUOTE, ENDBLOCKQUOTE, SR_SPAN : (Lex.pos * Lex.pos), STARTBLOCKQUOTE_SPAN : (Lex.pos * Lex.pos), ENDBLOCKQUOTE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BLOCKQUOTE", (Lf (Tok.STARTBLOCKQUOTE STARTBLOCKQUOTE)) :: (SR @ [Lf (Tok.ENDBLOCKQUOTE)]))) fun br_PROD_1_ACT (STARTBR, STARTBR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BR", [Lf (Tok.STARTBR STARTBR)])) fun button_PROD_1_ACT (STARTBUTTON, flow, ENDBUTTON, STARTBUTTON_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDBUTTON_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "BUTTON", (Lf (Tok.STARTBUTTON STARTBUTTON)) :: (flow @ [Lf (Tok.ENDBUTTON)]))) fun caption_PROD_1_ACT (inline, STARTCAPTION, ENDCAPTION, inline_SPAN : (Lex.pos * Lex.pos), STARTCAPTION_SPAN : (Lex.pos * Lex.pos), ENDCAPTION_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "CAPTION", (Lf (Tok.STARTCAPTION STARTCAPTION)) :: (inline @ [Lf (Tok.ENDCAPTION)]))) fun center_PROD_1_ACT (ENDCENTER, flow, STARTCENTER, ENDCENTER_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), STARTCENTER_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "CENTER", (Lf (Tok.STARTCENTER STARTCENTER)) :: (flow @ [Lf (Tok.ENDCENTER)]))) fun cite_PROD_1_ACT (inline, ENDCITE, STARTCITE, inline_SPAN : (Lex.pos * Lex.pos), ENDCITE_SPAN : (Lex.pos * Lex.pos), STARTCITE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "CITE", (Lf (Tok.STARTCITE STARTCITE)) :: (inline @ [Lf (Tok.ENDCITE)]))) fun code_PROD_1_ACT (inline, ENDCODE, STARTCODE, inline_SPAN : (Lex.pos * Lex.pos), ENDCODE_SPAN : (Lex.pos * Lex.pos), STARTCODE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "CODE", (Lf (Tok.STARTCODE STARTCODE)) :: (inline @ [Lf (Tok.ENDCODE)]))) fun col_PROD_1_ACT (STARTCOL, STARTCOL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "COL", [Lf (Tok.STARTCOL STARTCOL)])) fun colgroup_PROD_1_SUBRULE_1_PROD_1_ACT (STARTCOLGROUP, cdata_opt, col, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), col_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (col :: cdata_opt) fun colgroup_PROD_1_SUBRULE_2_PROD_1_ACT (STARTCOLGROUP, SR1, cdata_opt, ENDCOLGROUP, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDCOLGROUP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Lf (Tok.ENDCOLGROUP)) fun colgroup_PROD_1_ACT (STARTCOLGROUP, SR1, SR2, cdata_opt, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "COLGROUP", (Lf (Tok.STARTCOLGROUP STARTCOLGROUP)) :: (cdata_opt @ (foldr op@ [] SR1) @ (optToList SR2)))) fun dd_PROD_1_SUBRULE_2_PROD_1_ACT (ENDDD, STARTDD, flow, ENDDD_SPAN : (Lex.pos * Lex.pos), STARTDD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Lf (Tok.ENDDD)) fun dd_PROD_1_ACT (SR, STARTDD, flow, SR_SPAN : (Lex.pos * Lex.pos), STARTDD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DD", (Lf (Tok.STARTDD STARTDD)) :: (flow @ (optToList SR)))) fun del_PROD_1_ACT (flow, ENDDEL, STARTDEL, flow_SPAN : (Lex.pos * Lex.pos), ENDDEL_SPAN : (Lex.pos * Lex.pos), STARTDEL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DEL", (Lf (Tok.STARTDEL STARTDEL)) :: (flow @ [Lf (Tok.ENDDEL)]))) fun dfn_PROD_1_ACT (inline, ENDDFN, STARTDFN, inline_SPAN : (Lex.pos * Lex.pos), ENDDFN_SPAN : (Lex.pos * Lex.pos), STARTDFN_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DFN", (Lf (Tok.STARTDFN STARTDFN)) :: (inline @ [Lf (Tok.ENDDFN)]))) fun dir_PROD_1_ACT (li, cdata_opt, ENDDIR, STARTDIR, li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDDIR_SPAN : (Lex.pos * Lex.pos), STARTDIR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DIR", (Lf (Tok.STARTDIR STARTDIR)) :: (cdata_opt @ li @ [Lf (Tok.ENDDIR)]))) fun div_PROD_1_ACT (flow, ENDDIV, STARTDIV, flow_SPAN : (Lex.pos * Lex.pos), ENDDIV_SPAN : (Lex.pos * Lex.pos), STARTDIV_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DIV", (Lf (Tok.STARTDIV STARTDIV)) :: (flow @ [Lf (Tok.ENDDIV)]))) fun dl_PROD_1_ACT (ENDDL, SR, cdata_opt, STARTDL, ENDDL_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTDL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DL", (Lf (Tok.STARTDL STARTDL)) :: (cdata_opt @ SR @ [Lf (Tok.ENDDL)]))) fun dt_PROD_1_SUBRULE_2_PROD_1_ACT (ENDDT, inline, STARTDT, ENDDT_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTDT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Lf (Tok.ENDDT)) fun dt_PROD_1_ACT (SR, inline, STARTDT, SR_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTDT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "DT", (Lf (Tok.STARTDT STARTDT)) :: (inline @ (optToList SR)))) fun em_PROD_1_ACT (ENDEM, inline, STARTEM, ENDEM_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTEM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "EM", (Lf (Tok.STARTEM STARTEM)) :: (inline @ [Lf (Tok.ENDEM)]))) fun fieldset_PROD_1_ACT (cdata_opt, legend, flow, ENDFIELDSET, STARTFIELDSET, cdata_opt_SPAN : (Lex.pos * Lex.pos), legend_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDFIELDSET_SPAN : (Lex.pos * Lex.pos), STARTFIELDSET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "FIELDSET", (Lf (Tok.STARTFIELDSET STARTFIELDSET)) :: (cdata_opt @ [legend] @ flow @ [Lf (Tok.ENDFIELDSET)]))) fun font_PROD_1_ACT (inline, ENDFONT, STARTFONT, inline_SPAN : (Lex.pos * Lex.pos), ENDFONT_SPAN : (Lex.pos * Lex.pos), STARTFONT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "FONT", (Lf (Tok.STARTFONT STARTFONT)) :: (inline @ [Lf (Tok.ENDFONT)]))) fun form_PROD_1_ACT (SR, ENDFORM, STARTFORM, SR_SPAN : (Lex.pos * Lex.pos), ENDFORM_SPAN : (Lex.pos * Lex.pos), STARTFORM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "FORM", (Lf (Tok.STARTFORM STARTFORM)) :: (SR @ [Lf (Tok.ENDFORM)]))) fun frame_PROD_1_ACT (STARTFRAME, STARTFRAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "FRAME", [Lf (Tok.STARTFRAME STARTFRAME)])) fun frameset_PROD_1_SUBRULE_2_PROD_1_ACT (SR1, cdata_opt, STARTFRAMESET, noframes, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTFRAMESET_SPAN : (Lex.pos * Lex.pos), noframes_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (noframes::cdata_opt) fun frameset_PROD_1_ACT (SR1, SR2, STARTFRAMESET, ENDFRAMESET, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), STARTFRAMESET_SPAN : (Lex.pos * Lex.pos), ENDFRAMESET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "FRAMESET", (Lf (Tok.STARTFRAMESET STARTFRAMESET)) :: (SR1 @ (optListToList SR2) @ [Lf (Tok.ENDFRAMESET)]))) fun h1_PROD_1_ACT (ENDH1, inline, STARTH1, ENDH1_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH1_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H1", (Lf (Tok.STARTH1 STARTH1)) :: (inline @ [Lf (Tok.ENDH1)]))) fun h2_PROD_1_ACT (ENDH2, inline, STARTH2, ENDH2_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H2", (Lf (Tok.STARTH2 STARTH2)) :: (inline @ [Lf (Tok.ENDH2)]))) fun h3_PROD_1_ACT (ENDH3, inline, STARTH3, ENDH3_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH3_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H3", (Lf (Tok.STARTH3 STARTH3)) :: (inline @ [Lf (Tok.ENDH3)]))) fun h4_PROD_1_ACT (ENDH4, inline, STARTH4, ENDH4_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH4_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H4", (Lf (Tok.STARTH4 STARTH4)) :: (inline @ [Lf (Tok.ENDH4)]))) fun h5_PROD_1_ACT (ENDH5, inline, STARTH5, ENDH5_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH5_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H5", (Lf (Tok.STARTH5 STARTH5)) :: (inline @ [Lf (Tok.ENDH5)]))) fun h6_PROD_1_ACT (ENDH6, inline, STARTH6, ENDH6_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH6_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "H6", (Lf (Tok.STARTH6 STARTH6)) :: (inline @ [Lf (Tok.ENDH6)]))) fun hr_PROD_1_ACT (STARTHR, STARTHR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "HR", [Lf (Tok.STARTHR STARTHR)])) fun i_PROD_1_ACT (inline, STARTI, ENDI, inline_SPAN : (Lex.pos * Lex.pos), STARTI_SPAN : (Lex.pos * Lex.pos), ENDI_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "I", (Lf (Tok.STARTI STARTI)) :: (inline @ [Lf (Tok.ENDI)]))) fun iframe_PROD_1_ACT (ENDIFRAME, STARTIFRAME, flow, ENDIFRAME_SPAN : (Lex.pos * Lex.pos), STARTIFRAME_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "IFRAME", (Lf (Tok.STARTIFRAME STARTIFRAME)) :: (flow @ [Lf (Tok.ENDIFRAME)]))) fun img_PROD_1_ACT (STARTIMG, STARTIMG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "IMG", [Lf (Tok.STARTIMG STARTIMG)])) fun input_PROD_1_ACT (STARTINPUT, STARTINPUT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "INPUT", [Lf (Tok.STARTINPUT STARTINPUT)])) fun ins_PROD_1_ACT (STARTINS, flow, ENDINS, STARTINS_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDINS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "INS", (Lf (Tok.STARTINS STARTINS)) :: (flow @ [Lf (Tok.ENDINS)]))) fun isindex_PROD_1_ACT (STARTISINDEX, STARTISINDEX_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "ISINDEX", [Lf (Tok.STARTISINDEX STARTISINDEX)])) fun kbd_PROD_1_ACT (inline, STARTKBD, ENDKBD, inline_SPAN : (Lex.pos * Lex.pos), STARTKBD_SPAN : (Lex.pos * Lex.pos), ENDKBD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "KBD", (Lf (Tok.STARTKBD STARTKBD)) :: (inline @ [Lf (Tok.ENDKBD)]))) fun label_PROD_1_ACT (inline, ENDLABEL, STARTLABEL, inline_SPAN : (Lex.pos * Lex.pos), ENDLABEL_SPAN : (Lex.pos * Lex.pos), STARTLABEL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "LABEL", (Lf (Tok.STARTLABEL STARTLABEL)) :: (inline @ [Lf (Tok.ENDLABEL)]))) fun legend_PROD_1_ACT (inline, ENDLEGEND, STARTLEGEND, inline_SPAN : (Lex.pos * Lex.pos), ENDLEGEND_SPAN : (Lex.pos * Lex.pos), STARTLEGEND_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "LEGEND", (Lf (Tok.STARTLEGEND STARTLEGEND)) :: (inline @ [Lf (Tok.ENDLEGEND)]))) fun li_PROD_1_SUBRULE_2_PROD_1_ACT (ENDLI, STARTLI, flow, ENDLI_SPAN : (Lex.pos * Lex.pos), STARTLI_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Lf (Tok.ENDLI)) fun li_PROD_1_ACT (SR, STARTLI, flow, SR_SPAN : (Lex.pos * Lex.pos), STARTLI_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "LI", (Lf (Tok.STARTLI STARTLI)) :: (flow @ (optToList SR)))) fun map_PROD_1_ACT (SR, STARTMAP, ENDMAP, SR_SPAN : (Lex.pos * Lex.pos), STARTMAP_SPAN : (Lex.pos * Lex.pos), ENDMAP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "MAP", (Lf (Tok.STARTMAP STARTMAP)) :: (SR @ [Lf (Tok.ENDMAP)]))) fun menu_PROD_1_ACT (li, cdata_opt, STARTMENU, ENDMENU, li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTMENU_SPAN : (Lex.pos * Lex.pos), ENDMENU_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "MENU", (Lf (Tok.STARTMENU STARTMENU)) :: (cdata_opt @ li @ [Lf (Tok.ENDMENU)]))) fun noframes_PROD_1_ACT (STARTNOFRAMES, ENDNOFRAMES, body, STARTNOFRAMES_SPAN : (Lex.pos * Lex.pos), ENDNOFRAMES_SPAN : (Lex.pos * Lex.pos), body_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "NOFRAMES", [Lf (Tok.STARTNOFRAMES STARTNOFRAMES), body, Lf (Tok.ENDNOFRAMES)])) fun noscript_PROD_1_ACT (SR, ENDNOSCRIPT, STARTNOSCRIPT, SR_SPAN : (Lex.pos * Lex.pos), ENDNOSCRIPT_SPAN : (Lex.pos * Lex.pos), STARTNOSCRIPT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "NOSCRIPT", (Lf (Tok.STARTNOSCRIPT STARTNOSCRIPT)) :: (SR @ [Lf (Tok.ENDNOSCRIPT)]))) fun ol_PROD_1_ACT (ENDOL, li, cdata_opt, STARTOL, ENDOL_SPAN : (Lex.pos * Lex.pos), li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTOL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "OL", (Lf (Tok.STARTOL STARTOL)) :: (cdata_opt @ li @ [Lf (Tok.ENDOL)]))) fun optgroup_PROD_1_ACT (option, STARTOPTGROUP, ENDOPTGROUP, cdata_opt1, cdata_opt2, option_SPAN : (Lex.pos * Lex.pos), STARTOPTGROUP_SPAN : (Lex.pos * Lex.pos), ENDOPTGROUP_SPAN : (Lex.pos * Lex.pos), cdata_opt1_SPAN : (Lex.pos * Lex.pos), cdata_opt2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "OPTGROUP", (Lf (Tok.STARTOPTGROUP STARTOPTGROUP)) :: (cdata_opt1 @ option @ ((Lf (Tok.ENDOPTGROUP)) :: cdata_opt2)))) fun option_PROD_1_SUBRULE_1_PROD_1_ACT (STARTOPTION, cdata_opt, ENDOPTION, STARTOPTION_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDOPTION_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDOPTION)) :: cdata_opt) fun option_PROD_1_ACT (SR, STARTOPTION, cdata_opt, SR_SPAN : (Lex.pos * Lex.pos), STARTOPTION_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "OPTION", (Lf (Tok.STARTOPTION STARTOPTION)) :: (cdata_opt @ (optListToList SR)))) fun p_PROD_1_ACT (inline, STARTP, ENDP, inline_SPAN : (Lex.pos * Lex.pos), STARTP_SPAN : (Lex.pos * Lex.pos), ENDP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "P", (Lf (Tok.STARTP STARTP)) :: (inline @ [Lf (Tok.ENDP)]))) fun pre_PROD_1_ACT (inline, ENDPRE, STARTPRE, inline_SPAN : (Lex.pos * Lex.pos), ENDPRE_SPAN : (Lex.pos * Lex.pos), STARTPRE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "PRE", (Lf (Tok.STARTPRE STARTPRE)) :: (inline @ [Lf (Tok.ENDPRE)]))) fun q_PROD_1_ACT (inline, STARTQ, ENDQ, inline_SPAN : (Lex.pos * Lex.pos), STARTQ_SPAN : (Lex.pos * Lex.pos), ENDQ_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "Q", (Lf (Tok.STARTQ STARTQ)) :: (inline @ [Lf (Tok.ENDQ)]))) fun s_PROD_1_ACT (inline, STARTS, ENDS, inline_SPAN : (Lex.pos * Lex.pos), STARTS_SPAN : (Lex.pos * Lex.pos), ENDS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "S", (Lf (Tok.STARTS STARTS)) :: (inline @ [Lf (Tok.ENDS)]))) fun samp_PROD_1_ACT (inline, STARTSAMP, ENDSAMP, inline_SPAN : (Lex.pos * Lex.pos), STARTSAMP_SPAN : (Lex.pos * Lex.pos), ENDSAMP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SAMP", (Lf (Tok.STARTSAMP STARTSAMP)) :: (inline @ [Lf (Tok.ENDSAMP)]))) fun select_PROD_1_ACT (STARTSELECT, SR, cdata_opt, ENDSELECT, STARTSELECT_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDSELECT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SELECT", (Lf (Tok.STARTSELECT STARTSELECT)) :: (cdata_opt @ SR @ [Lf (Tok.ENDSELECT)]))) fun small_PROD_1_ACT (inline, ENDSMALL, STARTSMALL, inline_SPAN : (Lex.pos * Lex.pos), ENDSMALL_SPAN : (Lex.pos * Lex.pos), STARTSMALL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SMALL", (Lf (Tok.STARTSMALL STARTSMALL)) :: (inline @ [Lf (Tok.ENDSMALL)]))) fun span_PROD_1_ACT (inline, STARTSPAN, ENDSPAN, inline_SPAN : (Lex.pos * Lex.pos), STARTSPAN_SPAN : (Lex.pos * Lex.pos), ENDSPAN_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SPAN", (Lf (Tok.STARTSPAN STARTSPAN)) :: (inline @ [Lf (Tok.ENDSPAN)]))) fun strike_PROD_1_ACT (inline, STARTSTRIKE, ENDSTRIKE, inline_SPAN : (Lex.pos * Lex.pos), STARTSTRIKE_SPAN : (Lex.pos * Lex.pos), ENDSTRIKE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "STRIKE", (Lf (Tok.STARTSTRIKE STARTSTRIKE)) :: (inline @ [Lf (Tok.ENDSTRIKE)]))) fun strong_PROD_1_ACT (inline, STARTSTRONG, ENDSTRONG, inline_SPAN : (Lex.pos * Lex.pos), STARTSTRONG_SPAN : (Lex.pos * Lex.pos), ENDSTRONG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "STRONG", (Lf (Tok.STARTSTRONG STARTSTRONG)) :: (inline @ [Lf (Tok.ENDSTRONG)]))) fun sub_PROD_1_ACT (inline, ENDSUB, STARTSUB, inline_SPAN : (Lex.pos * Lex.pos), ENDSUB_SPAN : (Lex.pos * Lex.pos), STARTSUB_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SUB", (Lf (Tok.STARTSUB STARTSUB)) :: (inline @ [Lf (Tok.ENDSUB)]))) fun sup_PROD_1_ACT (inline, ENDSUP, STARTSUP, inline_SPAN : (Lex.pos * Lex.pos), ENDSUP_SPAN : (Lex.pos * Lex.pos), STARTSUP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "SUP", (Lf (Tok.STARTSUP STARTSUP)) :: (inline @ [Lf (Tok.ENDSUP)]))) fun table_PROD_1_SUBRULE_1_PROD_1_ACT (STARTTABLE, cdata_opt, caption, STARTTABLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), caption_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (caption :: cdata_opt) fun table_PROD_1_ACT (SR, STARTTABLE, cdata_opt, table_content, ENDTABLE, col_or_colgroups, SR_SPAN : (Lex.pos * Lex.pos), STARTTABLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), table_content_SPAN : (Lex.pos * Lex.pos), ENDTABLE_SPAN : (Lex.pos * Lex.pos), col_or_colgroups_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TABLE", (Lf (Tok.STARTTABLE STARTTABLE)) :: (cdata_opt @ (optListToList SR) @ col_or_colgroups @ table_content @ [Lf (Tok.ENDTABLE)]))) fun table_content_PROD_1_ACT (tbodies, tfoot, thead, tbodies_SPAN : (Lex.pos * Lex.pos), tfoot_SPAN : (Lex.pos * Lex.pos), thead_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (thead :: ((optToList tfoot)) @ tbodies) fun table_content_PROD_2_ACT (tbodies, tfoot, tbodies_SPAN : (Lex.pos * Lex.pos), tfoot_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (tfoot :: tbodies) fun col_or_colgroups_PROD_1_ACT (FULL_SPAN : (Lex.pos * Lex.pos)) = ([]) fun col_or_colgroups_PROD_2_SUBRULE_1_PROD_1_ACT (cdata_opt, col, cdata_opt_SPAN : (Lex.pos * Lex.pos), col_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (col :: cdata_opt) fun col_or_colgroups_PROD_2_ACT (SR, SR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (foldr op@ [] SR) fun tbodies_nostart_PROD_1_SUBRULE_1_PROD_1_ACT (cdata_opt, STARTTBODY, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.STARTTBODY STARTTBODY)) :: cdata_opt) fun tbodies_nostart_PROD_1_ACT (tr, SR, tbodies_rest, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (let val (tbody_rest, tbody_peers) = case tbodies_rest of NONE => ([], []) | SOME tbodies_tup => tbodies_tup in (Nd (Atom.atom "TBODIES_NOSTART", (optListToList SR) @ tr @ tbody_rest)) :: tbody_peers end) fun tbodies_PROD_1_ACT (tr, cdata_opt, STARTTBODY, tbodies_rest, tr_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (let val (tbody_rest, tbody_peers) = tbodies_rest in (Nd (Atom.atom "TBODIES", (Lf (Tok.STARTTBODY STARTTBODY)) :: (cdata_opt @ tr @ tbody_rest))) :: tbody_peers end) fun tbodies_rest_PROD_1_ACT (cdata_opt, tbodies, ENDTBODY, cdata_opt_SPAN : (Lex.pos * Lex.pos), tbodies_SPAN : (Lex.pos * Lex.pos), ENDTBODY_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTBODY)) :: cdata_opt, optListToList tbodies) fun tbodies_rest_PROD_2_ACT (tr, cdata_opt, STARTTBODY, tbodies_rest, tr_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (let val (tbody_rest, tbody_peers) = case tbodies_rest of NONE => ([], []) | SOME tbodies_tup => tbodies_tup in ([], (Nd (Atom.atom "TBODIES_REST", (Lf (Tok.STARTTBODY STARTTBODY)) :: (cdata_opt @ tr @ tbody_rest))) :: tbody_peers) end) fun td_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTD, cdata_opt, STARTTD, flow, ENDTD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTD)) :: cdata_opt) fun td_PROD_1_ACT (SR, STARTTD, flow, SR_SPAN : (Lex.pos * Lex.pos), STARTTD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TD", (Lf (Tok.STARTTD STARTTD)) :: (flow @ (optListToList SR)))) fun textarea_PROD_1_ACT (cdata_opt, STARTTEXTAREA, ENDTEXTAREA, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTEXTAREA_SPAN : (Lex.pos * Lex.pos), ENDTEXTAREA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TEXTAREA", (Lf (Tok.STARTTEXTAREA STARTTEXTAREA)) :: (cdata_opt @ [Lf (Tok.ENDTEXTAREA)]))) fun tfoot_PROD_1_SUBRULE_2_PROD_1_ACT (tr, STARTTFOOT, cdata_opt, ENDTFOOT, tr_SPAN : (Lex.pos * Lex.pos), STARTTFOOT_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDTFOOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTFOOT)) :: cdata_opt) fun tfoot_PROD_1_ACT (tr, SR, STARTTFOOT, cdata_opt, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), STARTTFOOT_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TFOOT", (Lf (Tok.STARTTFOOT STARTTFOOT)) :: (cdata_opt @ tr @ (optListToList SR)))) fun th_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTH, cdata_opt, STARTTH, flow, ENDTH_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTH_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTH)) :: cdata_opt) fun th_PROD_1_ACT (SR, STARTTH, flow, SR_SPAN : (Lex.pos * Lex.pos), STARTTH_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TH", (Lf (Tok.STARTTH STARTTH)) :: (flow @ (optListToList SR)))) fun thead_PROD_1_SUBRULE_2_PROD_1_ACT (tr, STARTTHEAD, ENDTHEAD, cdata_opt, tr_SPAN : (Lex.pos * Lex.pos), STARTTHEAD_SPAN : (Lex.pos * Lex.pos), ENDTHEAD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTHEAD)) :: cdata_opt) fun thead_PROD_1_ACT (tr, SR, STARTTHEAD, cdata_opt, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), STARTTHEAD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "THEAD", (Lf (Tok.STARTTHEAD STARTTHEAD)) :: (cdata_opt @ tr @ (optListToList SR)))) fun tr_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTR, SR1, cdata_opt, STARTTR, ENDTR_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf (Tok.ENDTR)) :: cdata_opt) fun tr_PROD_1_ACT (SR1, SR2, cdata_opt, STARTTR, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TR", (Lf (Tok.STARTTR STARTTR)) :: (cdata_opt @ SR1 @ (optListToList SR2)))) fun tt_PROD_1_ACT (ENDTT, inline, STARTTT, ENDTT_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTTT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "TT", (Lf (Tok.STARTTT STARTTT)) :: (inline @ [Lf (Tok.ENDTT)]))) fun u_PROD_1_ACT (inline, STARTU, ENDU, inline_SPAN : (Lex.pos * Lex.pos), STARTU_SPAN : (Lex.pos * Lex.pos), ENDU_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "U", (Lf (Tok.STARTU STARTU)) :: (inline @ [Lf (Tok.ENDU)]))) fun ul_PROD_1_ACT (li, ENDUL, cdata_opt, STARTUL, li_SPAN : (Lex.pos * Lex.pos), ENDUL_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTUL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "UL", ((Lf (Tok.STARTUL STARTUL)) :: (cdata_opt @ li @ [Lf (Tok.ENDUL)])))) fun var_PROD_1_ACT (inline, STARTVAR, ENDVAR, inline_SPAN : (Lex.pos * Lex.pos), STARTVAR_SPAN : (Lex.pos * Lex.pos), ENDVAR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Nd (Atom.atom "VAR", (Lf (Tok.STARTVAR STARTVAR)) :: (inline @ [Lf (Tok.ENDVAR)]))) fun cdata_PROD_1_SUBRULE_1_PROD_1_ACT (PCDATA, PCDATA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Tok.PCDATA PCDATA) fun cdata_PROD_1_SUBRULE_1_PROD_2_ACT (CHAR_REF, CHAR_REF_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Tok.CHAR_REF CHAR_REF) fun cdata_PROD_1_SUBRULE_1_PROD_3_ACT (ENTITY_REF, ENTITY_REF_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Tok.ENTITY_REF ENTITY_REF) fun cdata_PROD_1_SUBRULE_1_PROD_4_ACT (COMMENT, COMMENT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (Tok.COMMENT COMMENT) fun cdata_PROD_1_ACT (SR, SR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = ((Lf SR) : HTML4Tokens.token parsetree) fun cdata_opt_PROD_1_ACT (cdata, cdata_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)) = (cdata : HTML4Tokens.token parsetree list) end (* UserCode *) structure Err = AntlrErrHandler( structure Tok = Tok structure Lex = Lex) (* replace functor with inline structure for better optimization structure EBNF = AntlrEBNF( struct type strm = Err.wstream val getSpan = Err.getSpan end) *) structure EBNF = struct fun optional (pred, parse, strm) = if pred strm then let val (y, span, strm') = parse strm in (SOME y, span, strm') end else (NONE, Err.getSpan strm, strm) fun closure (pred, parse, strm) = let fun iter (strm, (left, right), ys) = if pred strm then let val (y, (_, right'), strm') = parse strm in iter (strm', (left, right'), y::ys) end else (List.rev ys, (left, right), strm) in iter (strm, Err.getSpan strm, []) end fun posclos (pred, parse, strm) = let val (y, (left, _), strm') = parse strm val (ys, (_, right), strm'') = closure (pred, parse, strm') in (y::ys, (left, right), strm'') end end fun mk lexFn = let fun getS() = {} fun putS{} = () fun unwrap (ret, strm, repairs) = (ret, strm, repairs) val (eh, lex) = Err.mkErrHandler {get = getS, put = putS} fun fail() = Err.failure eh fun tryProds (strm, prods) = let fun try [] = fail() | try (prod :: prods) = (Err.whileDisabled eh (fn() => prod strm)) handle Err.ParseError => try (prods) in try prods end fun matchOPENTAG strm = (case (lex(strm)) of (Tok.OPENTAG(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchCLOSETAG strm = (case (lex(strm)) of (Tok.CLOSETAG(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchCOMMENT strm = (case (lex(strm)) of (Tok.COMMENT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchPCDATA strm = (case (lex(strm)) of (Tok.PCDATA(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchDOCTYPE strm = (case (lex(strm)) of (Tok.DOCTYPE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchCHAR_REF strm = (case (lex(strm)) of (Tok.CHAR_REF(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENTITY_REF strm = (case (lex(strm)) of (Tok.ENTITY_REF(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchXML_PROCESSING strm = (case (lex(strm)) of (Tok.XML_PROCESSING(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTA strm = (case (lex(strm)) of (Tok.STARTA(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDA strm = (case (lex(strm)) of (Tok.ENDA, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTABBR strm = (case (lex(strm)) of (Tok.STARTABBR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDABBR strm = (case (lex(strm)) of (Tok.ENDABBR, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTACRONYM strm = (case (lex(strm)) of (Tok.STARTACRONYM(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDACRONYM strm = (case (lex(strm)) of (Tok.ENDACRONYM, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTADDRESS strm = (case (lex(strm)) of (Tok.STARTADDRESS(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDADDRESS strm = (case (lex(strm)) of (Tok.ENDADDRESS, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTAPPLET strm = (case (lex(strm)) of (Tok.STARTAPPLET(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDAPPLET strm = (case (lex(strm)) of (Tok.ENDAPPLET, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTAREA strm = (case (lex(strm)) of (Tok.STARTAREA(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTB strm = (case (lex(strm)) of (Tok.STARTB(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDB strm = (case (lex(strm)) of (Tok.ENDB, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTBASE strm = (case (lex(strm)) of (Tok.STARTBASE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTBASEFONT strm = (case (lex(strm)) of (Tok.STARTBASEFONT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTBDO strm = (case (lex(strm)) of (Tok.STARTBDO(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDBDO strm = (case (lex(strm)) of (Tok.ENDBDO, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTBIG strm = (case (lex(strm)) of (Tok.STARTBIG(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDBIG strm = (case (lex(strm)) of (Tok.ENDBIG, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTBLOCKQUOTE strm = (case (lex(strm)) of (Tok.STARTBLOCKQUOTE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDBLOCKQUOTE strm = (case (lex(strm)) of (Tok.ENDBLOCKQUOTE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTBODY strm = (case (lex(strm)) of (Tok.STARTBODY(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDBODY strm = (case (lex(strm)) of (Tok.ENDBODY, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTBR strm = (case (lex(strm)) of (Tok.STARTBR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTBUTTON strm = (case (lex(strm)) of (Tok.STARTBUTTON(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDBUTTON strm = (case (lex(strm)) of (Tok.ENDBUTTON, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTCAPTION strm = (case (lex(strm)) of (Tok.STARTCAPTION(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDCAPTION strm = (case (lex(strm)) of (Tok.ENDCAPTION, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTCENTER strm = (case (lex(strm)) of (Tok.STARTCENTER(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDCENTER strm = (case (lex(strm)) of (Tok.ENDCENTER, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTCITE strm = (case (lex(strm)) of (Tok.STARTCITE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDCITE strm = (case (lex(strm)) of (Tok.ENDCITE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTCODE strm = (case (lex(strm)) of (Tok.STARTCODE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDCODE strm = (case (lex(strm)) of (Tok.ENDCODE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTCOL strm = (case (lex(strm)) of (Tok.STARTCOL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTCOLGROUP strm = (case (lex(strm)) of (Tok.STARTCOLGROUP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDCOLGROUP strm = (case (lex(strm)) of (Tok.ENDCOLGROUP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDD strm = (case (lex(strm)) of (Tok.STARTDD(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDD strm = (case (lex(strm)) of (Tok.ENDDD, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDEL strm = (case (lex(strm)) of (Tok.STARTDEL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDEL strm = (case (lex(strm)) of (Tok.ENDDEL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDFN strm = (case (lex(strm)) of (Tok.STARTDFN(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDFN strm = (case (lex(strm)) of (Tok.ENDDFN, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDIR strm = (case (lex(strm)) of (Tok.STARTDIR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDIR strm = (case (lex(strm)) of (Tok.ENDDIR, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDIV strm = (case (lex(strm)) of (Tok.STARTDIV(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDIV strm = (case (lex(strm)) of (Tok.ENDDIV, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDL strm = (case (lex(strm)) of (Tok.STARTDL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDL strm = (case (lex(strm)) of (Tok.ENDDL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTDT strm = (case (lex(strm)) of (Tok.STARTDT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDDT strm = (case (lex(strm)) of (Tok.ENDDT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTEM strm = (case (lex(strm)) of (Tok.STARTEM(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDEM strm = (case (lex(strm)) of (Tok.ENDEM, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTFIELDSET strm = (case (lex(strm)) of (Tok.STARTFIELDSET(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDFIELDSET strm = (case (lex(strm)) of (Tok.ENDFIELDSET, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTFONT strm = (case (lex(strm)) of (Tok.STARTFONT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDFONT strm = (case (lex(strm)) of (Tok.ENDFONT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTFORM strm = (case (lex(strm)) of (Tok.STARTFORM(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDFORM strm = (case (lex(strm)) of (Tok.ENDFORM, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTFRAME strm = (case (lex(strm)) of (Tok.STARTFRAME(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTFRAMESET strm = (case (lex(strm)) of (Tok.STARTFRAMESET(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDFRAMESET strm = (case (lex(strm)) of (Tok.ENDFRAMESET, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH1 strm = (case (lex(strm)) of (Tok.STARTH1(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH1 strm = (case (lex(strm)) of (Tok.ENDH1, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH2 strm = (case (lex(strm)) of (Tok.STARTH2(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH2 strm = (case (lex(strm)) of (Tok.ENDH2, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH3 strm = (case (lex(strm)) of (Tok.STARTH3(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH3 strm = (case (lex(strm)) of (Tok.ENDH3, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH4 strm = (case (lex(strm)) of (Tok.STARTH4(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH4 strm = (case (lex(strm)) of (Tok.ENDH4, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH5 strm = (case (lex(strm)) of (Tok.STARTH5(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH5 strm = (case (lex(strm)) of (Tok.ENDH5, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTH6 strm = (case (lex(strm)) of (Tok.STARTH6(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDH6 strm = (case (lex(strm)) of (Tok.ENDH6, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTHEAD strm = (case (lex(strm)) of (Tok.STARTHEAD(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDHEAD strm = (case (lex(strm)) of (Tok.ENDHEAD, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTHR strm = (case (lex(strm)) of (Tok.STARTHR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTHTML strm = (case (lex(strm)) of (Tok.STARTHTML(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDHTML strm = (case (lex(strm)) of (Tok.ENDHTML, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTI strm = (case (lex(strm)) of (Tok.STARTI(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDI strm = (case (lex(strm)) of (Tok.ENDI, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTIFRAME strm = (case (lex(strm)) of (Tok.STARTIFRAME(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDIFRAME strm = (case (lex(strm)) of (Tok.ENDIFRAME, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTIMG strm = (case (lex(strm)) of (Tok.STARTIMG(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTINPUT strm = (case (lex(strm)) of (Tok.STARTINPUT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTINS strm = (case (lex(strm)) of (Tok.STARTINS(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDINS strm = (case (lex(strm)) of (Tok.ENDINS, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTISINDEX strm = (case (lex(strm)) of (Tok.STARTISINDEX(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTKBD strm = (case (lex(strm)) of (Tok.STARTKBD(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDKBD strm = (case (lex(strm)) of (Tok.ENDKBD, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTLABEL strm = (case (lex(strm)) of (Tok.STARTLABEL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDLABEL strm = (case (lex(strm)) of (Tok.ENDLABEL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTLEGEND strm = (case (lex(strm)) of (Tok.STARTLEGEND(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDLEGEND strm = (case (lex(strm)) of (Tok.ENDLEGEND, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTLI strm = (case (lex(strm)) of (Tok.STARTLI(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDLI strm = (case (lex(strm)) of (Tok.ENDLI, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTLINK strm = (case (lex(strm)) of (Tok.STARTLINK(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTMAP strm = (case (lex(strm)) of (Tok.STARTMAP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDMAP strm = (case (lex(strm)) of (Tok.ENDMAP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTMENU strm = (case (lex(strm)) of (Tok.STARTMENU(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDMENU strm = (case (lex(strm)) of (Tok.ENDMENU, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTMETA strm = (case (lex(strm)) of (Tok.STARTMETA(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTNOFRAMES strm = (case (lex(strm)) of (Tok.STARTNOFRAMES(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDNOFRAMES strm = (case (lex(strm)) of (Tok.ENDNOFRAMES, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTNOSCRIPT strm = (case (lex(strm)) of (Tok.STARTNOSCRIPT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDNOSCRIPT strm = (case (lex(strm)) of (Tok.ENDNOSCRIPT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTOBJECT strm = (case (lex(strm)) of (Tok.STARTOBJECT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDOBJECT strm = (case (lex(strm)) of (Tok.ENDOBJECT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTOL strm = (case (lex(strm)) of (Tok.STARTOL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDOL strm = (case (lex(strm)) of (Tok.ENDOL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTOPTGROUP strm = (case (lex(strm)) of (Tok.STARTOPTGROUP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDOPTGROUP strm = (case (lex(strm)) of (Tok.ENDOPTGROUP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTOPTION strm = (case (lex(strm)) of (Tok.STARTOPTION(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDOPTION strm = (case (lex(strm)) of (Tok.ENDOPTION, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTP strm = (case (lex(strm)) of (Tok.STARTP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDP strm = (case (lex(strm)) of (Tok.ENDP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTPARAM strm = (case (lex(strm)) of (Tok.STARTPARAM(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchSTARTPRE strm = (case (lex(strm)) of (Tok.STARTPRE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDPRE strm = (case (lex(strm)) of (Tok.ENDPRE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTQ strm = (case (lex(strm)) of (Tok.STARTQ(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDQ strm = (case (lex(strm)) of (Tok.ENDQ, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTS strm = (case (lex(strm)) of (Tok.STARTS(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDS strm = (case (lex(strm)) of (Tok.ENDS, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSAMP strm = (case (lex(strm)) of (Tok.STARTSAMP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSAMP strm = (case (lex(strm)) of (Tok.ENDSAMP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSCRIPT strm = (case (lex(strm)) of (Tok.STARTSCRIPT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSCRIPT strm = (case (lex(strm)) of (Tok.ENDSCRIPT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSELECT strm = (case (lex(strm)) of (Tok.STARTSELECT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSELECT strm = (case (lex(strm)) of (Tok.ENDSELECT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSMALL strm = (case (lex(strm)) of (Tok.STARTSMALL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSMALL strm = (case (lex(strm)) of (Tok.ENDSMALL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSPAN strm = (case (lex(strm)) of (Tok.STARTSPAN(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSPAN strm = (case (lex(strm)) of (Tok.ENDSPAN, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSTRIKE strm = (case (lex(strm)) of (Tok.STARTSTRIKE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSTRIKE strm = (case (lex(strm)) of (Tok.ENDSTRIKE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSTRONG strm = (case (lex(strm)) of (Tok.STARTSTRONG(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSTRONG strm = (case (lex(strm)) of (Tok.ENDSTRONG, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSTYLE strm = (case (lex(strm)) of (Tok.STARTSTYLE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSTYLE strm = (case (lex(strm)) of (Tok.ENDSTYLE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSUB strm = (case (lex(strm)) of (Tok.STARTSUB(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSUB strm = (case (lex(strm)) of (Tok.ENDSUB, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTSUP strm = (case (lex(strm)) of (Tok.STARTSUP(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDSUP strm = (case (lex(strm)) of (Tok.ENDSUP, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTABLE strm = (case (lex(strm)) of (Tok.STARTTABLE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTABLE strm = (case (lex(strm)) of (Tok.ENDTABLE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTBODY strm = (case (lex(strm)) of (Tok.STARTTBODY(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTBODY strm = (case (lex(strm)) of (Tok.ENDTBODY, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTD strm = (case (lex(strm)) of (Tok.STARTTD(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTD strm = (case (lex(strm)) of (Tok.ENDTD, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTEXTAREA strm = (case (lex(strm)) of (Tok.STARTTEXTAREA(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTEXTAREA strm = (case (lex(strm)) of (Tok.ENDTEXTAREA, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTFOOT strm = (case (lex(strm)) of (Tok.STARTTFOOT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTFOOT strm = (case (lex(strm)) of (Tok.ENDTFOOT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTH strm = (case (lex(strm)) of (Tok.STARTTH(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTH strm = (case (lex(strm)) of (Tok.ENDTH, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTHEAD strm = (case (lex(strm)) of (Tok.STARTTHEAD(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTHEAD strm = (case (lex(strm)) of (Tok.ENDTHEAD, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTITLE strm = (case (lex(strm)) of (Tok.STARTTITLE(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTITLE strm = (case (lex(strm)) of (Tok.ENDTITLE, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTR strm = (case (lex(strm)) of (Tok.STARTTR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTR strm = (case (lex(strm)) of (Tok.ENDTR, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTTT strm = (case (lex(strm)) of (Tok.STARTTT(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDTT strm = (case (lex(strm)) of (Tok.ENDTT, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTU strm = (case (lex(strm)) of (Tok.STARTU(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDU strm = (case (lex(strm)) of (Tok.ENDU, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTUL strm = (case (lex(strm)) of (Tok.STARTUL(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDUL strm = (case (lex(strm)) of (Tok.ENDUL, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchSTARTVAR strm = (case (lex(strm)) of (Tok.STARTVAR(x), span, strm') => (x, span, strm') | _ => fail() (* end case *)) fun matchENDVAR strm = (case (lex(strm)) of (Tok.ENDVAR, span, strm') => ((), span, strm') | _ => fail() (* end case *)) fun matchEOF strm = (case (lex(strm)) of (Tok.EOF, span, strm') => ((), span, strm') | _ => fail() (* end case *)) val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = let fun cdata_NT (strm) = let val (SR_RES, SR_SPAN, strm') = let fun cdata_PROD_1_SUBRULE_1_NT (strm) = let fun cdata_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (PCDATA_RES, PCDATA_SPAN, strm') = matchPCDATA(strm) val FULL_SPAN = (#1(PCDATA_SPAN), #2(PCDATA_SPAN)) in (UserCode.cdata_PROD_1_SUBRULE_1_PROD_1_ACT (PCDATA_RES, PCDATA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun cdata_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (CHAR_REF_RES, CHAR_REF_SPAN, strm') = matchCHAR_REF(strm) val FULL_SPAN = (#1(CHAR_REF_SPAN), #2(CHAR_REF_SPAN)) in (UserCode.cdata_PROD_1_SUBRULE_1_PROD_2_ACT (CHAR_REF_RES, CHAR_REF_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun cdata_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (ENTITY_REF_RES, ENTITY_REF_SPAN, strm') = matchENTITY_REF(strm) val FULL_SPAN = (#1(ENTITY_REF_SPAN), #2(ENTITY_REF_SPAN)) in (UserCode.cdata_PROD_1_SUBRULE_1_PROD_3_ACT (ENTITY_REF_RES, ENTITY_REF_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun cdata_PROD_1_SUBRULE_1_PROD_4 (strm) = let val (COMMENT_RES, COMMENT_SPAN, strm') = matchCOMMENT(strm) val FULL_SPAN = (#1(COMMENT_SPAN), #2(COMMENT_SPAN)) in (UserCode.cdata_PROD_1_SUBRULE_1_PROD_4_ACT (COMMENT_RES, COMMENT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => cdata_PROD_1_SUBRULE_1_PROD_4(strm) | (Tok.CHAR_REF(_), _, strm') => cdata_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.PCDATA(_), _, strm') => cdata_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.ENTITY_REF(_), _, strm') => cdata_PROD_1_SUBRULE_1_PROD_3(strm) | _ => fail() (* end case *)) end in cdata_PROD_1_SUBRULE_1_NT(strm) end val FULL_SPAN = (#1(SR_SPAN), #2(SR_SPAN)) in (UserCode.cdata_PROD_1_ACT (SR_RES, SR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun cdata_opt_NT (strm) = let fun cdata_opt_PROD_1_SUBRULE_1_NT (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end fun cdata_opt_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | _ => false (* end case *)) val (cdata_RES, cdata_SPAN, strm') = EBNF.closure(cdata_opt_PROD_1_SUBRULE_1_PRED, cdata_opt_PROD_1_SUBRULE_1_NT, strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in (UserCode.cdata_opt_PROD_1_ACT (cdata_RES, cdata_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun textarea_NT (strm) = let val (STARTTEXTAREA_RES, STARTTEXTAREA_SPAN, strm') = matchSTARTTEXTAREA(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val (ENDTEXTAREA_RES, ENDTEXTAREA_SPAN, strm') = matchENDTEXTAREA(strm') val FULL_SPAN = (#1(STARTTEXTAREA_SPAN), #2(ENDTEXTAREA_SPAN)) in (UserCode.textarea_PROD_1_ACT (cdata_opt_RES, STARTTEXTAREA_RES, ENDTEXTAREA_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTEXTAREA_SPAN : (Lex.pos * Lex.pos), ENDTEXTAREA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun option_NT (strm) = let val (STARTOPTION_RES, STARTOPTION_SPAN, strm') = matchSTARTOPTION(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun option_PROD_1_SUBRULE_1_NT (strm) = let val (ENDOPTION_RES, ENDOPTION_SPAN, strm') = matchENDOPTION(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDOPTION_SPAN), #2(cdata_opt_SPAN)) in (UserCode.option_PROD_1_SUBRULE_1_PROD_1_ACT (STARTOPTION_RES, cdata_opt_RES, ENDOPTION_RES, STARTOPTION_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDOPTION_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun option_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.ENDOPTION, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(option_PROD_1_SUBRULE_1_PRED, option_PROD_1_SUBRULE_1_NT, strm') val FULL_SPAN = (#1(STARTOPTION_SPAN), #2(SR_SPAN)) in (UserCode.option_PROD_1_ACT (SR_RES, STARTOPTION_RES, cdata_opt_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTOPTION_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun optgroup_NT (strm) = let val (STARTOPTGROUP_RES, STARTOPTGROUP_SPAN, strm') = matchSTARTOPTGROUP(strm) val (cdata_opt1_RES, cdata_opt1_SPAN, strm') = cdata_opt_NT(strm') fun optgroup_PROD_1_SUBRULE_1_NT (strm) = let val (option_RES, option_SPAN, strm') = option_NT(strm) val FULL_SPAN = (#1(option_SPAN), #2(option_SPAN)) in ((option_RES), FULL_SPAN, strm') end fun optgroup_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTOPTION(_), _, strm') => true | _ => false (* end case *)) val (option_RES, option_SPAN, strm') = EBNF.posclos(optgroup_PROD_1_SUBRULE_1_PRED, optgroup_PROD_1_SUBRULE_1_NT, strm') val (ENDOPTGROUP_RES, ENDOPTGROUP_SPAN, strm') = matchENDOPTGROUP(strm') val (cdata_opt2_RES, cdata_opt2_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(STARTOPTGROUP_SPAN), #2(cdata_opt2_SPAN)) in (UserCode.optgroup_PROD_1_ACT (option_RES, STARTOPTGROUP_RES, ENDOPTGROUP_RES, cdata_opt1_RES, cdata_opt2_RES, option_SPAN : (Lex.pos * Lex.pos), STARTOPTGROUP_SPAN : (Lex.pos * Lex.pos), ENDOPTGROUP_SPAN : (Lex.pos * Lex.pos), cdata_opt1_SPAN : (Lex.pos * Lex.pos), cdata_opt2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun select_NT (strm) = let val (STARTSELECT_RES, STARTSELECT_SPAN, strm') = matchSTARTSELECT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun select_PROD_1_SUBRULE_1_NT (strm) = let fun select_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (optgroup_RES, optgroup_SPAN, strm') = optgroup_NT(strm) val FULL_SPAN = (#1(optgroup_SPAN), #2(optgroup_SPAN)) in ((optgroup_RES), FULL_SPAN, strm') end fun select_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (option_RES, option_SPAN, strm') = option_NT(strm) val FULL_SPAN = (#1(option_SPAN), #2(option_SPAN)) in ((option_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTOPTION(_), _, strm') => select_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOPTGROUP(_), _, strm') => select_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun select_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTOPTGROUP(_), _, strm') => true | (Tok.STARTOPTION(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(select_PROD_1_SUBRULE_1_PRED, select_PROD_1_SUBRULE_1_NT, strm') val (ENDSELECT_RES, ENDSELECT_SPAN, strm') = matchENDSELECT(strm') val FULL_SPAN = (#1(STARTSELECT_SPAN), #2(ENDSELECT_SPAN)) in (UserCode.select_PROD_1_ACT (STARTSELECT_RES, SR_RES, cdata_opt_RES, ENDSELECT_RES, STARTSELECT_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDSELECT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun input_NT (strm) = let val (STARTINPUT_RES, STARTINPUT_SPAN, strm') = matchSTARTINPUT(strm) val FULL_SPAN = (#1(STARTINPUT_SPAN), #2(STARTINPUT_SPAN)) in (UserCode.input_PROD_1_ACT (STARTINPUT_RES, STARTINPUT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun basefont_NT (strm) = let val (STARTBASEFONT_RES, STARTBASEFONT_SPAN, strm') = matchSTARTBASEFONT(strm) val FULL_SPAN = (#1(STARTBASEFONT_SPAN), #2(STARTBASEFONT_SPAN)) in (UserCode.basefont_PROD_1_ACT (STARTBASEFONT_RES, STARTBASEFONT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun param_NT (strm) = let val (STARTPARAM_RES, STARTPARAM_SPAN, strm') = matchSTARTPARAM(strm) val FULL_SPAN = (#1(STARTPARAM_SPAN), #2(STARTPARAM_SPAN)) in (UserCode.param_PROD_1_ACT (STARTPARAM_RES, STARTPARAM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun area_NT (strm) = let val (STARTAREA_RES, STARTAREA_SPAN, strm') = matchSTARTAREA(strm) val FULL_SPAN = (#1(STARTAREA_SPAN), #2(STARTAREA_SPAN)) in (UserCode.area_PROD_1_ACT (STARTAREA_RES, STARTAREA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun isindex_NT (strm) = let val (STARTISINDEX_RES, STARTISINDEX_SPAN, strm') = matchSTARTISINDEX(strm) val FULL_SPAN = (#1(STARTISINDEX_SPAN), #2(STARTISINDEX_SPAN)) in (UserCode.isindex_PROD_1_ACT (STARTISINDEX_RES, STARTISINDEX_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun col_NT (strm) = let val (STARTCOL_RES, STARTCOL_SPAN, strm') = matchSTARTCOL(strm) val FULL_SPAN = (#1(STARTCOL_SPAN), #2(STARTCOL_SPAN)) in (UserCode.col_PROD_1_ACT (STARTCOL_RES, STARTCOL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun colgroup_NT (strm) = let val (STARTCOLGROUP_RES, STARTCOLGROUP_SPAN, strm') = matchSTARTCOLGROUP(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun colgroup_PROD_1_SUBRULE_1_NT (strm) = let val (col_RES, col_SPAN, strm') = col_NT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(col_SPAN), #2(cdata_opt_SPAN)) in (UserCode.colgroup_PROD_1_SUBRULE_1_PROD_1_ACT (STARTCOLGROUP_RES, cdata_opt_RES, col_RES, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), col_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun colgroup_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTCOL(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.closure(colgroup_PROD_1_SUBRULE_1_PRED, colgroup_PROD_1_SUBRULE_1_NT, strm') fun colgroup_PROD_1_SUBRULE_2_NT (strm) = let val (ENDCOLGROUP_RES, ENDCOLGROUP_SPAN, strm') = matchENDCOLGROUP(strm) val FULL_SPAN = (#1(ENDCOLGROUP_SPAN), #2(ENDCOLGROUP_SPAN)) in (UserCode.colgroup_PROD_1_SUBRULE_2_PROD_1_ACT (STARTCOLGROUP_RES, SR1_RES, cdata_opt_RES, ENDCOLGROUP_RES, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDCOLGROUP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun colgroup_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDCOLGROUP, _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.optional(colgroup_PROD_1_SUBRULE_2_PRED, colgroup_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTCOLGROUP_SPAN), #2(SR2_SPAN)) in (UserCode.colgroup_PROD_1_ACT (STARTCOLGROUP_RES, SR1_RES, SR2_RES, cdata_opt_RES, STARTCOLGROUP_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun col_or_colgroups_NT (strm) = let fun col_or_colgroups_PROD_1 (strm) = let val FULL_SPAN = (Err.getPos(strm), Err.getPos(strm)) in (UserCode.col_or_colgroups_PROD_1_ACT (FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm) end fun col_or_colgroups_PROD_2 (strm) = let fun col_or_colgroups_PROD_2_SUBRULE_1_NT (strm) = let val (col_RES, col_SPAN, strm') = col_NT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(col_SPAN), #2(cdata_opt_SPAN)) in (UserCode.col_or_colgroups_PROD_2_SUBRULE_1_PROD_1_ACT (cdata_opt_RES, col_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), col_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun col_or_colgroups_PROD_2_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTCOL(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(col_or_colgroups_PROD_2_SUBRULE_1_PRED, col_or_colgroups_PROD_2_SUBRULE_1_NT, strm) val FULL_SPAN = (#1(SR_SPAN), #2(SR_SPAN)) in (UserCode.col_or_colgroups_PROD_2_ACT (SR_RES, SR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun col_or_colgroups_PROD_3 (strm) = let fun col_or_colgroups_PROD_3_SUBRULE_1_NT (strm) = let val (colgroup_RES, colgroup_SPAN, strm') = colgroup_NT(strm) val FULL_SPAN = (#1(colgroup_SPAN), #2(colgroup_SPAN)) in ((colgroup_RES), FULL_SPAN, strm') end fun col_or_colgroups_PROD_3_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTCOLGROUP(_), _, strm') => true | _ => false (* end case *)) val (colgroup_RES, colgroup_SPAN, strm') = EBNF.posclos(col_or_colgroups_PROD_3_SUBRULE_1_PRED, col_or_colgroups_PROD_3_SUBRULE_1_NT, strm) val FULL_SPAN = (#1(colgroup_SPAN), #2(colgroup_SPAN)) in ((colgroup_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTCOLGROUP(_), _, strm') => col_or_colgroups_PROD_3(strm) | (Tok.STARTTBODY(_), _, strm') => col_or_colgroups_PROD_1(strm) | (Tok.STARTTFOOT(_), _, strm') => col_or_colgroups_PROD_1(strm) | (Tok.STARTTHEAD(_), _, strm') => col_or_colgroups_PROD_1(strm) | (Tok.STARTTR(_), _, strm') => col_or_colgroups_PROD_1(strm) | (Tok.STARTCOL(_), _, strm') => col_or_colgroups_PROD_2(strm) | _ => fail() (* end case *)) end fun hr_NT (strm) = let val (STARTHR_RES, STARTHR_SPAN, strm') = matchSTARTHR(strm) val FULL_SPAN = (#1(STARTHR_SPAN), #2(STARTHR_SPAN)) in (UserCode.hr_PROD_1_ACT (STARTHR_RES, STARTHR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun script_NT (strm) = let val (STARTSCRIPT_RES, STARTSCRIPT_SPAN, strm') = matchSTARTSCRIPT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val (ENDSCRIPT_RES, ENDSCRIPT_SPAN, strm') = matchENDSCRIPT(strm') val FULL_SPAN = (#1(STARTSCRIPT_SPAN), #2(ENDSCRIPT_SPAN)) in (UserCode.script_PROD_1_ACT (cdata_opt_RES, STARTSCRIPT_RES, ENDSCRIPT_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTSCRIPT_SPAN : (Lex.pos * Lex.pos), ENDSCRIPT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun br_NT (strm) = let val (STARTBR_RES, STARTBR_SPAN, strm') = matchSTARTBR(strm) val FULL_SPAN = (#1(STARTBR_SPAN), #2(STARTBR_SPAN)) in (UserCode.br_PROD_1_ACT (STARTBR_RES, STARTBR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun img_NT (strm) = let val (STARTIMG_RES, STARTIMG_SPAN, strm') = matchSTARTIMG(strm) val FULL_SPAN = (#1(STARTIMG_SPAN), #2(STARTIMG_SPAN)) in (UserCode.img_PROD_1_ACT (STARTIMG_RES, STARTIMG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun flow_NT (strm) = let fun flow_PROD_1 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun flow_PROD_2 (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => flow_PROD_2(strm) | (Tok.PCDATA(_), _, strm') => flow_PROD_2(strm) | (Tok.CHAR_REF(_), _, strm') => flow_PROD_2(strm) | (Tok.ENTITY_REF(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTA(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTABBR(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTACRONYM(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTAPPLET(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTB(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTBASEFONT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTBDO(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTBIG(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTBR(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTBUTTON(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTCITE(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTCODE(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTDFN(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTEM(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTFONT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTI(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTIFRAME(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTIMG(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTINPUT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTKBD(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTLABEL(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTMAP(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTOBJECT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTQ(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTS(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSAMP(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSCRIPT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSELECT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSMALL(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSPAN(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSTRIKE(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSTRONG(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSUB(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTSUP(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTTEXTAREA(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTTT(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTU(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTVAR(_), _, strm') => flow_PROD_2(strm) | (Tok.STARTADDRESS(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTCENTER(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTDIV(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTDL(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTFIELDSET(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTFORM(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH1(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH2(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH4(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH5(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTH6(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTHR(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTISINDEX(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTMENU(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTP(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTPRE(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTTABLE(_), _, strm') => flow_PROD_1(strm) | (Tok.STARTUL(_), _, strm') => flow_PROD_1(strm) | _ => fail() (* end case *)) end and inline_NT (strm) = let fun inline_PROD_1 (strm) = let val (fontstyle_RES, fontstyle_SPAN, strm') = fontstyle_NT(strm) val FULL_SPAN = (#1(fontstyle_SPAN), #2(fontstyle_SPAN)) in ((fontstyle_RES), FULL_SPAN, strm') end fun inline_PROD_2 (strm) = let val (phrase_RES, phrase_SPAN, strm') = phrase_NT(strm) val FULL_SPAN = (#1(phrase_SPAN), #2(phrase_SPAN)) in ((phrase_RES), FULL_SPAN, strm') end fun inline_PROD_3 (strm) = let val (special_RES, special_SPAN, strm') = special_NT(strm) val FULL_SPAN = (#1(special_SPAN), #2(special_SPAN)) in ((special_RES), FULL_SPAN, strm') end fun inline_PROD_4 (strm) = let val (formctrl_RES, formctrl_SPAN, strm') = formctrl_NT(strm) val FULL_SPAN = (#1(formctrl_SPAN), #2(formctrl_SPAN)) in ((formctrl_RES), FULL_SPAN, strm') end fun inline_PROD_5 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => inline_PROD_5(strm) | (Tok.PCDATA(_), _, strm') => inline_PROD_5(strm) | (Tok.CHAR_REF(_), _, strm') => inline_PROD_5(strm) | (Tok.ENTITY_REF(_), _, strm') => inline_PROD_5(strm) | (Tok.STARTA(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTAPPLET(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTBASEFONT(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTBDO(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTBR(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTFONT(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTIFRAME(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTIMG(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTMAP(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTOBJECT(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTQ(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTSCRIPT(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTSPAN(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTSUB(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTSUP(_), _, strm') => inline_PROD_3(strm) | (Tok.STARTB(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTBIG(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTI(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTS(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTSMALL(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTSTRIKE(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTTT(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTU(_), _, strm') => inline_PROD_1(strm) | (Tok.STARTABBR(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTACRONYM(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTCITE(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTCODE(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTDFN(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTEM(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTKBD(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTSAMP(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTSTRONG(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTVAR(_), _, strm') => inline_PROD_2(strm) | (Tok.STARTBUTTON(_), _, strm') => inline_PROD_4(strm) | (Tok.STARTINPUT(_), _, strm') => inline_PROD_4(strm) | (Tok.STARTLABEL(_), _, strm') => inline_PROD_4(strm) | (Tok.STARTSELECT(_), _, strm') => inline_PROD_4(strm) | (Tok.STARTTEXTAREA(_), _, strm') => inline_PROD_4(strm) | _ => fail() (* end case *)) end and formctrl_NT (strm) = let fun formctrl_PROD_1 (strm) = let val (input_RES, input_SPAN, strm') = input_NT(strm) val FULL_SPAN = (#1(input_SPAN), #2(input_SPAN)) in ((input_RES), FULL_SPAN, strm') end fun formctrl_PROD_2 (strm) = let val (select_RES, select_SPAN, strm') = select_NT(strm) val FULL_SPAN = (#1(select_SPAN), #2(select_SPAN)) in ((select_RES), FULL_SPAN, strm') end fun formctrl_PROD_3 (strm) = let val (textarea_RES, textarea_SPAN, strm') = textarea_NT(strm) val FULL_SPAN = (#1(textarea_SPAN), #2(textarea_SPAN)) in ((textarea_RES), FULL_SPAN, strm') end fun formctrl_PROD_4 (strm) = let val (label_RES, label_SPAN, strm') = label_NT(strm) val FULL_SPAN = (#1(label_SPAN), #2(label_SPAN)) in ((label_RES), FULL_SPAN, strm') end fun formctrl_PROD_5 (strm) = let val (button_RES, button_SPAN, strm') = button_NT(strm) val FULL_SPAN = (#1(button_SPAN), #2(button_SPAN)) in ((button_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTBUTTON(_), _, strm') => formctrl_PROD_5(strm) | (Tok.STARTTEXTAREA(_), _, strm') => formctrl_PROD_3(strm) | (Tok.STARTINPUT(_), _, strm') => formctrl_PROD_1(strm) | (Tok.STARTSELECT(_), _, strm') => formctrl_PROD_2(strm) | (Tok.STARTLABEL(_), _, strm') => formctrl_PROD_4(strm) | _ => fail() (* end case *)) end and button_NT (strm) = let val (STARTBUTTON_RES, STARTBUTTON_SPAN, strm') = matchSTARTBUTTON(strm) fun button_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun button_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(button_PROD_1_SUBRULE_1_PRED, button_PROD_1_SUBRULE_1_NT, strm') val (ENDBUTTON_RES, ENDBUTTON_SPAN, strm') = matchENDBUTTON(strm') val FULL_SPAN = (#1(STARTBUTTON_SPAN), #2(ENDBUTTON_SPAN)) in (UserCode.button_PROD_1_ACT (STARTBUTTON_RES, flow_RES, ENDBUTTON_RES, STARTBUTTON_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDBUTTON_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and label_NT (strm) = let val (STARTLABEL_RES, STARTLABEL_SPAN, strm') = matchSTARTLABEL(strm) fun label_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun label_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(label_PROD_1_SUBRULE_1_PRED, label_PROD_1_SUBRULE_1_NT, strm') val (ENDLABEL_RES, ENDLABEL_SPAN, strm') = matchENDLABEL(strm') val FULL_SPAN = (#1(STARTLABEL_SPAN), #2(ENDLABEL_SPAN)) in (UserCode.label_PROD_1_ACT (inline_RES, ENDLABEL_RES, STARTLABEL_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDLABEL_SPAN : (Lex.pos * Lex.pos), STARTLABEL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and special_NT (strm) = let fun special_PROD_1 (strm) = let val (a_RES, a_SPAN, strm') = a_NT(strm) val FULL_SPAN = (#1(a_SPAN), #2(a_SPAN)) in ((a_RES), FULL_SPAN, strm') end fun special_PROD_2 (strm) = let val (img_RES, img_SPAN, strm') = img_NT(strm) val FULL_SPAN = (#1(img_SPAN), #2(img_SPAN)) in ((img_RES), FULL_SPAN, strm') end fun special_PROD_3 (strm) = let val (object_RES, object_SPAN, strm') = object_NT(strm) val FULL_SPAN = (#1(object_SPAN), #2(object_SPAN)) in ((object_RES), FULL_SPAN, strm') end fun special_PROD_4 (strm) = let val (br_RES, br_SPAN, strm') = br_NT(strm) val FULL_SPAN = (#1(br_SPAN), #2(br_SPAN)) in ((br_RES), FULL_SPAN, strm') end fun special_PROD_5 (strm) = let val (script_RES, script_SPAN, strm') = script_NT(strm) val FULL_SPAN = (#1(script_SPAN), #2(script_SPAN)) in ((script_RES), FULL_SPAN, strm') end fun special_PROD_6 (strm) = let val (map_RES, map_SPAN, strm') = map_NT(strm) val FULL_SPAN = (#1(map_SPAN), #2(map_SPAN)) in ((map_RES), FULL_SPAN, strm') end fun special_PROD_7 (strm) = let val (q_RES, q_SPAN, strm') = q_NT(strm) val FULL_SPAN = (#1(q_SPAN), #2(q_SPAN)) in ((q_RES), FULL_SPAN, strm') end fun special_PROD_8 (strm) = let val (sub_RES, sub_SPAN, strm') = sub_NT(strm) val FULL_SPAN = (#1(sub_SPAN), #2(sub_SPAN)) in ((sub_RES), FULL_SPAN, strm') end fun special_PROD_9 (strm) = let val (sup_RES, sup_SPAN, strm') = sup_NT(strm) val FULL_SPAN = (#1(sup_SPAN), #2(sup_SPAN)) in ((sup_RES), FULL_SPAN, strm') end fun special_PROD_10 (strm) = let val (span_RES, span_SPAN, strm') = span_NT(strm) val FULL_SPAN = (#1(span_SPAN), #2(span_SPAN)) in ((span_RES), FULL_SPAN, strm') end fun special_PROD_11 (strm) = let val (bdo_RES, bdo_SPAN, strm') = bdo_NT(strm) val FULL_SPAN = (#1(bdo_SPAN), #2(bdo_SPAN)) in ((bdo_RES), FULL_SPAN, strm') end fun special_PROD_12 (strm) = let val (special_loose_RES, special_loose_SPAN, strm') = special_loose_NT(strm) val FULL_SPAN = (#1(special_loose_SPAN), #2(special_loose_SPAN)) in ((special_loose_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTAPPLET(_), _, strm') => special_PROD_12(strm) | (Tok.STARTBASEFONT(_), _, strm') => special_PROD_12(strm) | (Tok.STARTFONT(_), _, strm') => special_PROD_12(strm) | (Tok.STARTIFRAME(_), _, strm') => special_PROD_12(strm) | (Tok.STARTSPAN(_), _, strm') => special_PROD_10(strm) | (Tok.STARTSUB(_), _, strm') => special_PROD_8(strm) | (Tok.STARTMAP(_), _, strm') => special_PROD_6(strm) | (Tok.STARTBR(_), _, strm') => special_PROD_4(strm) | (Tok.STARTIMG(_), _, strm') => special_PROD_2(strm) | (Tok.STARTA(_), _, strm') => special_PROD_1(strm) | (Tok.STARTOBJECT(_), _, strm') => special_PROD_3(strm) | (Tok.STARTSCRIPT(_), _, strm') => special_PROD_5(strm) | (Tok.STARTQ(_), _, strm') => special_PROD_7(strm) | (Tok.STARTSUP(_), _, strm') => special_PROD_9(strm) | (Tok.STARTBDO(_), _, strm') => special_PROD_11(strm) | _ => fail() (* end case *)) end and special_loose_NT (strm) = let fun special_loose_PROD_1 (strm) = let val (applet_RES, applet_SPAN, strm') = applet_NT(strm) val FULL_SPAN = (#1(applet_SPAN), #2(applet_SPAN)) in ((applet_RES), FULL_SPAN, strm') end fun special_loose_PROD_2 (strm) = let val (basefont_RES, basefont_SPAN, strm') = basefont_NT(strm) val FULL_SPAN = (#1(basefont_SPAN), #2(basefont_SPAN)) in ((basefont_RES), FULL_SPAN, strm') end fun special_loose_PROD_3 (strm) = let val (font_RES, font_SPAN, strm') = font_NT(strm) val FULL_SPAN = (#1(font_SPAN), #2(font_SPAN)) in ((font_RES), FULL_SPAN, strm') end fun special_loose_PROD_4 (strm) = let val (iframe_RES, iframe_SPAN, strm') = iframe_NT(strm) val FULL_SPAN = (#1(iframe_SPAN), #2(iframe_SPAN)) in ((iframe_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTIFRAME(_), _, strm') => special_loose_PROD_4(strm) | (Tok.STARTBASEFONT(_), _, strm') => special_loose_PROD_2(strm) | (Tok.STARTAPPLET(_), _, strm') => special_loose_PROD_1(strm) | (Tok.STARTFONT(_), _, strm') => special_loose_PROD_3(strm) | _ => fail() (* end case *)) end and iframe_NT (strm) = let val (STARTIFRAME_RES, STARTIFRAME_SPAN, strm') = matchSTARTIFRAME(strm) fun iframe_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun iframe_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(iframe_PROD_1_SUBRULE_1_PRED, iframe_PROD_1_SUBRULE_1_NT, strm') val (ENDIFRAME_RES, ENDIFRAME_SPAN, strm') = matchENDIFRAME(strm') val FULL_SPAN = (#1(STARTIFRAME_SPAN), #2(ENDIFRAME_SPAN)) in (UserCode.iframe_PROD_1_ACT (ENDIFRAME_RES, STARTIFRAME_RES, flow_RES, ENDIFRAME_SPAN : (Lex.pos * Lex.pos), STARTIFRAME_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and font_NT (strm) = let val (STARTFONT_RES, STARTFONT_SPAN, strm') = matchSTARTFONT(strm) fun font_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun font_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(font_PROD_1_SUBRULE_1_PRED, font_PROD_1_SUBRULE_1_NT, strm') val (ENDFONT_RES, ENDFONT_SPAN, strm') = matchENDFONT(strm') val FULL_SPAN = (#1(STARTFONT_SPAN), #2(ENDFONT_SPAN)) in (UserCode.font_PROD_1_ACT (inline_RES, ENDFONT_RES, STARTFONT_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDFONT_SPAN : (Lex.pos * Lex.pos), STARTFONT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and applet_NT (strm) = let val (STARTAPPLET_RES, STARTAPPLET_SPAN, strm') = matchSTARTAPPLET(strm) fun applet_PROD_1_SUBRULE_1_NT (strm) = let fun applet_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (param_RES, param_SPAN, strm') = param_NT(strm) val FULL_SPAN = (#1(param_SPAN), #2(param_SPAN)) in ((param_RES), FULL_SPAN, strm') end fun applet_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.PCDATA(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.CHAR_REF(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.ENTITY_REF(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTA(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTABBR(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTACRONYM(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTADDRESS(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTAPPLET(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTB(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBASEFONT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBDO(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBIG(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBR(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBUTTON(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCITE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCODE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDFN(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTEM(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFONT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTI(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTIFRAME(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTIMG(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTINPUT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTKBD(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTLABEL(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMAP(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOBJECT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTP(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTQ(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTS(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSAMP(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSCRIPT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSELECT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSMALL(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSPAN(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSTRIKE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSTRONG(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSUB(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSUP(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTEXTAREA(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTT(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTU(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTVAR(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPARAM(_), _, strm') => applet_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun applet_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPARAM(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.closure(applet_PROD_1_SUBRULE_1_PRED, applet_PROD_1_SUBRULE_1_NT, strm') val (ENDAPPLET_RES, ENDAPPLET_SPAN, strm') = matchENDAPPLET(strm') val FULL_SPAN = (#1(STARTAPPLET_SPAN), #2(ENDAPPLET_SPAN)) in (UserCode.applet_PROD_1_ACT (SR_RES, ENDAPPLET_RES, STARTAPPLET_RES, SR_SPAN : (Lex.pos * Lex.pos), ENDAPPLET_SPAN : (Lex.pos * Lex.pos), STARTAPPLET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and bdo_NT (strm) = let val (STARTBDO_RES, STARTBDO_SPAN, strm') = matchSTARTBDO(strm) fun bdo_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun bdo_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(bdo_PROD_1_SUBRULE_1_PRED, bdo_PROD_1_SUBRULE_1_NT, strm') val (ENDBDO_RES, ENDBDO_SPAN, strm') = matchENDBDO(strm') val FULL_SPAN = (#1(STARTBDO_SPAN), #2(ENDBDO_SPAN)) in (UserCode.bdo_PROD_1_ACT (inline_RES, ENDBDO_RES, STARTBDO_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDBDO_SPAN : (Lex.pos * Lex.pos), STARTBDO_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and span_NT (strm) = let val (STARTSPAN_RES, STARTSPAN_SPAN, strm') = matchSTARTSPAN(strm) fun span_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun span_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(span_PROD_1_SUBRULE_1_PRED, span_PROD_1_SUBRULE_1_NT, strm') val (ENDSPAN_RES, ENDSPAN_SPAN, strm') = matchENDSPAN(strm') val FULL_SPAN = (#1(STARTSPAN_SPAN), #2(ENDSPAN_SPAN)) in (UserCode.span_PROD_1_ACT (inline_RES, STARTSPAN_RES, ENDSPAN_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTSPAN_SPAN : (Lex.pos * Lex.pos), ENDSPAN_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and sup_NT (strm) = let val (STARTSUP_RES, STARTSUP_SPAN, strm') = matchSTARTSUP(strm) fun sup_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun sup_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(sup_PROD_1_SUBRULE_1_PRED, sup_PROD_1_SUBRULE_1_NT, strm') val (ENDSUP_RES, ENDSUP_SPAN, strm') = matchENDSUP(strm') val FULL_SPAN = (#1(STARTSUP_SPAN), #2(ENDSUP_SPAN)) in (UserCode.sup_PROD_1_ACT (inline_RES, ENDSUP_RES, STARTSUP_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDSUP_SPAN : (Lex.pos * Lex.pos), STARTSUP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and sub_NT (strm) = let val (STARTSUB_RES, STARTSUB_SPAN, strm') = matchSTARTSUB(strm) fun sub_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun sub_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(sub_PROD_1_SUBRULE_1_PRED, sub_PROD_1_SUBRULE_1_NT, strm') val (ENDSUB_RES, ENDSUB_SPAN, strm') = matchENDSUB(strm') val FULL_SPAN = (#1(STARTSUB_SPAN), #2(ENDSUB_SPAN)) in (UserCode.sub_PROD_1_ACT (inline_RES, ENDSUB_RES, STARTSUB_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDSUB_SPAN : (Lex.pos * Lex.pos), STARTSUB_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and q_NT (strm) = let val (STARTQ_RES, STARTQ_SPAN, strm') = matchSTARTQ(strm) fun q_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun q_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(q_PROD_1_SUBRULE_1_PRED, q_PROD_1_SUBRULE_1_NT, strm') val (ENDQ_RES, ENDQ_SPAN, strm') = matchENDQ(strm') val FULL_SPAN = (#1(STARTQ_SPAN), #2(ENDQ_SPAN)) in (UserCode.q_PROD_1_ACT (inline_RES, STARTQ_RES, ENDQ_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTQ_SPAN : (Lex.pos * Lex.pos), ENDQ_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and map_NT (strm) = let val (STARTMAP_RES, STARTMAP_SPAN, strm') = matchSTARTMAP(strm) fun map_PROD_1_SUBRULE_1_NT (strm) = let fun map_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end fun map_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun map_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (area_RES, area_SPAN, strm') = area_NT(strm) val FULL_SPAN = (#1(area_SPAN), #2(area_SPAN)) in ((area_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTAREA(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.COMMENT(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.PCDATA(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.CHAR_REF(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.ENTITY_REF(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTADDRESS(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTP(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => map_PROD_1_SUBRULE_1_PROD_2(strm) | _ => fail() (* end case *)) end fun map_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAREA(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(map_PROD_1_SUBRULE_1_PRED, map_PROD_1_SUBRULE_1_NT, strm') val (ENDMAP_RES, ENDMAP_SPAN, strm') = matchENDMAP(strm') val FULL_SPAN = (#1(STARTMAP_SPAN), #2(ENDMAP_SPAN)) in (UserCode.map_PROD_1_ACT (SR_RES, STARTMAP_RES, ENDMAP_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTMAP_SPAN : (Lex.pos * Lex.pos), ENDMAP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and block_NT (strm) = let fun block_PROD_1 (strm) = let val (p_RES, p_SPAN, strm') = p_NT(strm) val FULL_SPAN = (#1(p_SPAN), #2(p_SPAN)) in ((p_RES), FULL_SPAN, strm') end fun block_PROD_2 (strm) = let val (heading_RES, heading_SPAN, strm') = heading_NT(strm) val FULL_SPAN = (#1(heading_SPAN), #2(heading_SPAN)) in ((heading_RES), FULL_SPAN, strm') end fun block_PROD_3 (strm) = let val (list_RES, list_SPAN, strm') = list_NT(strm) val FULL_SPAN = (#1(list_SPAN), #2(list_SPAN)) in ((list_RES), FULL_SPAN, strm') end fun block_PROD_4 (strm) = let val (preformatted_RES, preformatted_SPAN, strm') = preformatted_NT(strm) val FULL_SPAN = (#1(preformatted_SPAN), #2(preformatted_SPAN)) in ((preformatted_RES), FULL_SPAN, strm') end fun block_PROD_5 (strm) = let val (dl_RES, dl_SPAN, strm') = dl_NT(strm) val FULL_SPAN = (#1(dl_SPAN), #2(dl_SPAN)) in ((dl_RES), FULL_SPAN, strm') end fun block_PROD_6 (strm) = let val (div_RES, div_SPAN, strm') = div_NT(strm) val FULL_SPAN = (#1(div_SPAN), #2(div_SPAN)) in ((div_RES), FULL_SPAN, strm') end fun block_PROD_7 (strm) = let val (noscript_RES, noscript_SPAN, strm') = noscript_NT(strm) val FULL_SPAN = (#1(noscript_SPAN), #2(noscript_SPAN)) in ((noscript_RES), FULL_SPAN, strm') end fun block_PROD_8 (strm) = let val (blockquote_RES, blockquote_SPAN, strm') = blockquote_NT(strm) val FULL_SPAN = (#1(blockquote_SPAN), #2(blockquote_SPAN)) in ((blockquote_RES), FULL_SPAN, strm') end fun block_PROD_9 (strm) = let val (form_RES, form_SPAN, strm') = form_NT(strm) val FULL_SPAN = (#1(form_SPAN), #2(form_SPAN)) in ((form_RES), FULL_SPAN, strm') end fun block_PROD_10 (strm) = let val (hr_RES, hr_SPAN, strm') = hr_NT(strm) val FULL_SPAN = (#1(hr_SPAN), #2(hr_SPAN)) in ((hr_RES), FULL_SPAN, strm') end fun block_PROD_11 (strm) = let val (table_RES, table_SPAN, strm') = table_NT(strm) val FULL_SPAN = (#1(table_SPAN), #2(table_SPAN)) in ((table_RES), FULL_SPAN, strm') end fun block_PROD_12 (strm) = let val (fieldset_RES, fieldset_SPAN, strm') = fieldset_NT(strm) val FULL_SPAN = (#1(fieldset_SPAN), #2(fieldset_SPAN)) in ((fieldset_RES), FULL_SPAN, strm') end fun block_PROD_13 (strm) = let val (address_RES, address_SPAN, strm') = address_NT(strm) val FULL_SPAN = (#1(address_SPAN), #2(address_SPAN)) in ((address_RES), FULL_SPAN, strm') end fun block_PROD_14 (strm) = let val (block_loose_RES, block_loose_SPAN, strm') = block_loose_NT(strm) val FULL_SPAN = (#1(block_loose_SPAN), #2(block_loose_SPAN)) in ((block_loose_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTCENTER(_), _, strm') => block_PROD_14(strm) | (Tok.STARTISINDEX(_), _, strm') => block_PROD_14(strm) | (Tok.STARTFIELDSET(_), _, strm') => block_PROD_12(strm) | (Tok.STARTHR(_), _, strm') => block_PROD_10(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => block_PROD_8(strm) | (Tok.STARTDIV(_), _, strm') => block_PROD_6(strm) | (Tok.STARTPRE(_), _, strm') => block_PROD_4(strm) | (Tok.STARTH1(_), _, strm') => block_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => block_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => block_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => block_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => block_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => block_PROD_2(strm) | (Tok.STARTP(_), _, strm') => block_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => block_PROD_3(strm) | (Tok.STARTMENU(_), _, strm') => block_PROD_3(strm) | (Tok.STARTOL(_), _, strm') => block_PROD_3(strm) | (Tok.STARTUL(_), _, strm') => block_PROD_3(strm) | (Tok.STARTDL(_), _, strm') => block_PROD_5(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => block_PROD_7(strm) | (Tok.STARTFORM(_), _, strm') => block_PROD_9(strm) | (Tok.STARTTABLE(_), _, strm') => block_PROD_11(strm) | (Tok.STARTADDRESS(_), _, strm') => block_PROD_13(strm) | _ => fail() (* end case *)) end and block_loose_NT (strm) = let fun block_loose_PROD_1 (strm) = let val (center_RES, center_SPAN, strm') = center_NT(strm) val FULL_SPAN = (#1(center_SPAN), #2(center_SPAN)) in ((center_RES), FULL_SPAN, strm') end fun block_loose_PROD_2 (strm) = let val (isindex_RES, isindex_SPAN, strm') = isindex_NT(strm) val FULL_SPAN = (#1(isindex_SPAN), #2(isindex_SPAN)) in ((isindex_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTISINDEX(_), _, strm') => block_loose_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => block_loose_PROD_1(strm) | _ => fail() (* end case *)) end and center_NT (strm) = let val (STARTCENTER_RES, STARTCENTER_SPAN, strm') = matchSTARTCENTER(strm) fun center_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun center_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(center_PROD_1_SUBRULE_1_PRED, center_PROD_1_SUBRULE_1_NT, strm') val (ENDCENTER_RES, ENDCENTER_SPAN, strm') = matchENDCENTER(strm') val FULL_SPAN = (#1(STARTCENTER_SPAN), #2(ENDCENTER_SPAN)) in (UserCode.center_PROD_1_ACT (ENDCENTER_RES, flow_RES, STARTCENTER_RES, ENDCENTER_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), STARTCENTER_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and address_NT (strm) = let val (STARTADDRESS_RES, STARTADDRESS_SPAN, strm') = matchSTARTADDRESS(strm) fun address_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun address_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(address_PROD_1_SUBRULE_1_PRED, address_PROD_1_SUBRULE_1_NT, strm') val (ENDADDRESS_RES, ENDADDRESS_SPAN, strm') = matchENDADDRESS(strm') val FULL_SPAN = (#1(STARTADDRESS_SPAN), #2(ENDADDRESS_SPAN)) in (UserCode.address_PROD_1_ACT (inline_RES, STARTADDRESS_RES, ENDADDRESS_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTADDRESS_SPAN : (Lex.pos * Lex.pos), ENDADDRESS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and fieldset_NT (strm) = let val (STARTFIELDSET_RES, STARTFIELDSET_SPAN, strm') = matchSTARTFIELDSET(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val (legend_RES, legend_SPAN, strm') = legend_NT(strm') fun fieldset_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun fieldset_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(fieldset_PROD_1_SUBRULE_1_PRED, fieldset_PROD_1_SUBRULE_1_NT, strm') val (ENDFIELDSET_RES, ENDFIELDSET_SPAN, strm') = matchENDFIELDSET(strm') val FULL_SPAN = (#1(STARTFIELDSET_SPAN), #2(ENDFIELDSET_SPAN)) in (UserCode.fieldset_PROD_1_ACT (cdata_opt_RES, legend_RES, flow_RES, ENDFIELDSET_RES, STARTFIELDSET_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), legend_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDFIELDSET_SPAN : (Lex.pos * Lex.pos), STARTFIELDSET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and legend_NT (strm) = let val (STARTLEGEND_RES, STARTLEGEND_SPAN, strm') = matchSTARTLEGEND(strm) fun legend_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun legend_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(legend_PROD_1_SUBRULE_1_PRED, legend_PROD_1_SUBRULE_1_NT, strm') val (ENDLEGEND_RES, ENDLEGEND_SPAN, strm') = matchENDLEGEND(strm') val FULL_SPAN = (#1(STARTLEGEND_SPAN), #2(ENDLEGEND_SPAN)) in (UserCode.legend_PROD_1_ACT (inline_RES, ENDLEGEND_RES, STARTLEGEND_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDLEGEND_SPAN : (Lex.pos * Lex.pos), STARTLEGEND_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and table_NT (strm) = let val (STARTTABLE_RES, STARTTABLE_SPAN, strm') = matchSTARTTABLE(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun table_PROD_1_SUBRULE_1_NT (strm) = let val (caption_RES, caption_SPAN, strm') = caption_NT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(caption_SPAN), #2(cdata_opt_SPAN)) in (UserCode.table_PROD_1_SUBRULE_1_PROD_1_ACT (STARTTABLE_RES, cdata_opt_RES, caption_RES, STARTTABLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), caption_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun table_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTCAPTION(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(table_PROD_1_SUBRULE_1_PRED, table_PROD_1_SUBRULE_1_NT, strm') val (col_or_colgroups_RES, col_or_colgroups_SPAN, strm') = col_or_colgroups_NT(strm') val (table_content_RES, table_content_SPAN, strm') = table_content_NT(strm') val (ENDTABLE_RES, ENDTABLE_SPAN, strm') = matchENDTABLE(strm') val FULL_SPAN = (#1(STARTTABLE_SPAN), #2(ENDTABLE_SPAN)) in (UserCode.table_PROD_1_ACT (SR_RES, STARTTABLE_RES, cdata_opt_RES, table_content_RES, ENDTABLE_RES, col_or_colgroups_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTTABLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), table_content_SPAN : (Lex.pos * Lex.pos), ENDTABLE_SPAN : (Lex.pos * Lex.pos), col_or_colgroups_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and table_content_NT (strm) = let fun table_content_PROD_1 (strm) = let val (thead_RES, thead_SPAN, strm') = thead_NT(strm) fun table_content_PROD_1_SUBRULE_1_NT (strm) = let val (tfoot_RES, tfoot_SPAN, strm') = tfoot_NT(strm) val FULL_SPAN = (#1(tfoot_SPAN), #2(tfoot_SPAN)) in ((tfoot_RES), FULL_SPAN, strm') end fun table_content_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTFOOT(_), _, strm') => true | _ => false (* end case *)) val (tfoot_RES, tfoot_SPAN, strm') = EBNF.optional(table_content_PROD_1_SUBRULE_1_PRED, table_content_PROD_1_SUBRULE_1_NT, strm') val (tbodies_RES, tbodies_SPAN, strm') = tbodies_NT(strm') val FULL_SPAN = (#1(thead_SPAN), #2(tbodies_SPAN)) in (UserCode.table_content_PROD_1_ACT (tbodies_RES, tfoot_RES, thead_RES, tbodies_SPAN : (Lex.pos * Lex.pos), tfoot_SPAN : (Lex.pos * Lex.pos), thead_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun table_content_PROD_2 (strm) = let val (tfoot_RES, tfoot_SPAN, strm') = tfoot_NT(strm) val (tbodies_RES, tbodies_SPAN, strm') = tbodies_NT(strm') val FULL_SPAN = (#1(tfoot_SPAN), #2(tbodies_SPAN)) in (UserCode.table_content_PROD_2_ACT (tbodies_RES, tfoot_RES, tbodies_SPAN : (Lex.pos * Lex.pos), tfoot_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun table_content_PROD_3 (strm) = let val (tbodies_nostart_RES, tbodies_nostart_SPAN, strm') = tbodies_nostart_NT(strm) val FULL_SPAN = (#1(tbodies_nostart_SPAN), #2(tbodies_nostart_SPAN)) in ((tbodies_nostart_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => table_content_PROD_3(strm) | (Tok.STARTTR(_), _, strm') => table_content_PROD_3(strm) | (Tok.STARTTHEAD(_), _, strm') => table_content_PROD_1(strm) | (Tok.STARTTFOOT(_), _, strm') => table_content_PROD_2(strm) | _ => fail() (* end case *)) end and tbodies_nostart_NT (strm) = let fun tbodies_nostart_PROD_1_SUBRULE_1_NT (strm) = let val (STARTTBODY_RES, STARTTBODY_SPAN, strm') = matchSTARTTBODY(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(STARTTBODY_SPAN), #2(cdata_opt_SPAN)) in (UserCode.tbodies_nostart_PROD_1_SUBRULE_1_PROD_1_ACT (cdata_opt_RES, STARTTBODY_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun tbodies_nostart_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(tbodies_nostart_PROD_1_SUBRULE_1_PRED, tbodies_nostart_PROD_1_SUBRULE_1_NT, strm) fun tbodies_nostart_PROD_1_SUBRULE_2_NT (strm) = let val (tr_RES, tr_SPAN, strm') = tr_NT(strm) val FULL_SPAN = (#1(tr_SPAN), #2(tr_SPAN)) in ((tr_RES), FULL_SPAN, strm') end fun tbodies_nostart_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.STARTTR(_), _, strm') => true | _ => false (* end case *)) val (tr_RES, tr_SPAN, strm') = EBNF.posclos(tbodies_nostart_PROD_1_SUBRULE_2_PRED, tbodies_nostart_PROD_1_SUBRULE_2_NT, strm') fun tbodies_nostart_PROD_1_SUBRULE_3_NT (strm) = let val (tbodies_rest_RES, tbodies_rest_SPAN, strm') = tbodies_rest_NT(strm) val FULL_SPAN = (#1(tbodies_rest_SPAN), #2(tbodies_rest_SPAN)) in ((tbodies_rest_RES), FULL_SPAN, strm') end fun tbodies_nostart_PROD_1_SUBRULE_3_PRED (strm) = (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => true | (Tok.ENDTBODY, _, strm') => true | _ => false (* end case *)) val (tbodies_rest_RES, tbodies_rest_SPAN, strm') = EBNF.optional(tbodies_nostart_PROD_1_SUBRULE_3_PRED, tbodies_nostart_PROD_1_SUBRULE_3_NT, strm') val FULL_SPAN = (#1(SR_SPAN), #2(tbodies_rest_SPAN)) in (UserCode.tbodies_nostart_PROD_1_ACT (tr_RES, SR_RES, tbodies_rest_RES, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and tbodies_rest_NT (strm) = let fun tbodies_rest_PROD_1 (strm) = let val (ENDTBODY_RES, ENDTBODY_SPAN, strm') = matchENDTBODY(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun tbodies_rest_PROD_1_SUBRULE_1_NT (strm) = let val (tbodies_RES, tbodies_SPAN, strm') = tbodies_NT(strm) val FULL_SPAN = (#1(tbodies_SPAN), #2(tbodies_SPAN)) in ((tbodies_RES), FULL_SPAN, strm') end fun tbodies_rest_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => true | _ => false (* end case *)) val (tbodies_RES, tbodies_SPAN, strm') = EBNF.optional(tbodies_rest_PROD_1_SUBRULE_1_PRED, tbodies_rest_PROD_1_SUBRULE_1_NT, strm') val FULL_SPAN = (#1(ENDTBODY_SPAN), #2(tbodies_SPAN)) in (UserCode.tbodies_rest_PROD_1_ACT (cdata_opt_RES, tbodies_RES, ENDTBODY_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), tbodies_SPAN : (Lex.pos * Lex.pos), ENDTBODY_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun tbodies_rest_PROD_2 (strm) = let val (STARTTBODY_RES, STARTTBODY_SPAN, strm') = matchSTARTTBODY(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun tbodies_rest_PROD_2_SUBRULE_1_NT (strm) = let val (tr_RES, tr_SPAN, strm') = tr_NT(strm) val FULL_SPAN = (#1(tr_SPAN), #2(tr_SPAN)) in ((tr_RES), FULL_SPAN, strm') end fun tbodies_rest_PROD_2_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTR(_), _, strm') => true | _ => false (* end case *)) val (tr_RES, tr_SPAN, strm') = EBNF.posclos(tbodies_rest_PROD_2_SUBRULE_1_PRED, tbodies_rest_PROD_2_SUBRULE_1_NT, strm') fun tbodies_rest_PROD_2_SUBRULE_2_NT (strm) = let val (tbodies_rest_RES, tbodies_rest_SPAN, strm') = tbodies_rest_NT(strm) val FULL_SPAN = (#1(tbodies_rest_SPAN), #2(tbodies_rest_SPAN)) in ((tbodies_rest_RES), FULL_SPAN, strm') end fun tbodies_rest_PROD_2_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => true | (Tok.ENDTBODY, _, strm') => true | _ => false (* end case *)) val (tbodies_rest_RES, tbodies_rest_SPAN, strm') = EBNF.optional(tbodies_rest_PROD_2_SUBRULE_2_PRED, tbodies_rest_PROD_2_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTBODY_SPAN), #2(tbodies_rest_SPAN)) in (UserCode.tbodies_rest_PROD_2_ACT (tr_RES, cdata_opt_RES, STARTTBODY_RES, tbodies_rest_RES, tr_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTTBODY(_), _, strm') => tbodies_rest_PROD_2(strm) | (Tok.ENDTBODY, _, strm') => tbodies_rest_PROD_1(strm) | _ => fail() (* end case *)) end and tr_NT (strm) = let val (STARTTR_RES, STARTTR_SPAN, strm') = matchSTARTTR(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun tr_PROD_1_SUBRULE_1_NT (strm) = let fun tr_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (th_RES, th_SPAN, strm') = th_NT(strm) val FULL_SPAN = (#1(th_SPAN), #2(th_SPAN)) in ((th_RES), FULL_SPAN, strm') end fun tr_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (td_RES, td_SPAN, strm') = td_NT(strm) val FULL_SPAN = (#1(td_SPAN), #2(td_SPAN)) in ((td_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTTD(_), _, strm') => tr_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTH(_), _, strm') => tr_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun tr_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTD(_), _, strm') => true | (Tok.STARTTH(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.posclos(tr_PROD_1_SUBRULE_1_PRED, tr_PROD_1_SUBRULE_1_NT, strm') fun tr_PROD_1_SUBRULE_2_NT (strm) = let val (ENDTR_RES, ENDTR_SPAN, strm') = matchENDTR(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDTR_SPAN), #2(cdata_opt_SPAN)) in (UserCode.tr_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTR_RES, SR1_RES, cdata_opt_RES, STARTTR_RES, ENDTR_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun tr_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDTR, _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.optional(tr_PROD_1_SUBRULE_2_PRED, tr_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTR_SPAN), #2(SR2_SPAN)) in (UserCode.tr_PROD_1_ACT (SR1_RES, SR2_RES, cdata_opt_RES, STARTTR_RES, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and td_NT (strm) = let val (STARTTD_RES, STARTTD_SPAN, strm') = matchSTARTTD(strm) fun td_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun td_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(td_PROD_1_SUBRULE_1_PRED, td_PROD_1_SUBRULE_1_NT, strm') fun td_PROD_1_SUBRULE_2_NT (strm) = let val (ENDTD_RES, ENDTD_SPAN, strm') = matchENDTD(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDTD_SPAN), #2(cdata_opt_SPAN)) in (UserCode.td_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTD_RES, cdata_opt_RES, STARTTD_RES, flow_RES, ENDTD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun td_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDTD, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(td_PROD_1_SUBRULE_2_PRED, td_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTD_SPAN), #2(SR_SPAN)) in (UserCode.td_PROD_1_ACT (SR_RES, STARTTD_RES, flow_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTTD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and th_NT (strm) = let val (STARTTH_RES, STARTTH_SPAN, strm') = matchSTARTTH(strm) fun th_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun th_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(th_PROD_1_SUBRULE_1_PRED, th_PROD_1_SUBRULE_1_NT, strm') fun th_PROD_1_SUBRULE_2_NT (strm) = let val (ENDTH_RES, ENDTH_SPAN, strm') = matchENDTH(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDTH_SPAN), #2(cdata_opt_SPAN)) in (UserCode.th_PROD_1_SUBRULE_2_PROD_1_ACT (ENDTH_RES, cdata_opt_RES, STARTTH_RES, flow_RES, ENDTH_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTH_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun th_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDTH, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(th_PROD_1_SUBRULE_2_PRED, th_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTH_SPAN), #2(SR_SPAN)) in (UserCode.th_PROD_1_ACT (SR_RES, STARTTH_RES, flow_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTTH_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and tbodies_NT (strm) = let val (STARTTBODY_RES, STARTTBODY_SPAN, strm') = matchSTARTTBODY(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun tbodies_PROD_1_SUBRULE_1_NT (strm) = let val (tr_RES, tr_SPAN, strm') = tr_NT(strm) val FULL_SPAN = (#1(tr_SPAN), #2(tr_SPAN)) in ((tr_RES), FULL_SPAN, strm') end fun tbodies_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTR(_), _, strm') => true | _ => false (* end case *)) val (tr_RES, tr_SPAN, strm') = EBNF.posclos(tbodies_PROD_1_SUBRULE_1_PRED, tbodies_PROD_1_SUBRULE_1_NT, strm') val (tbodies_rest_RES, tbodies_rest_SPAN, strm') = tbodies_rest_NT(strm') val FULL_SPAN = (#1(STARTTBODY_SPAN), #2(tbodies_rest_SPAN)) in (UserCode.tbodies_PROD_1_ACT (tr_RES, cdata_opt_RES, STARTTBODY_RES, tbodies_rest_RES, tr_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTTBODY_SPAN : (Lex.pos * Lex.pos), tbodies_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and tfoot_NT (strm) = let val (STARTTFOOT_RES, STARTTFOOT_SPAN, strm') = matchSTARTTFOOT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun tfoot_PROD_1_SUBRULE_1_NT (strm) = let val (tr_RES, tr_SPAN, strm') = tr_NT(strm) val FULL_SPAN = (#1(tr_SPAN), #2(tr_SPAN)) in ((tr_RES), FULL_SPAN, strm') end fun tfoot_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTR(_), _, strm') => true | _ => false (* end case *)) val (tr_RES, tr_SPAN, strm') = EBNF.posclos(tfoot_PROD_1_SUBRULE_1_PRED, tfoot_PROD_1_SUBRULE_1_NT, strm') fun tfoot_PROD_1_SUBRULE_2_NT (strm) = let val (ENDTFOOT_RES, ENDTFOOT_SPAN, strm') = matchENDTFOOT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDTFOOT_SPAN), #2(cdata_opt_SPAN)) in (UserCode.tfoot_PROD_1_SUBRULE_2_PROD_1_ACT (tr_RES, STARTTFOOT_RES, cdata_opt_RES, ENDTFOOT_RES, tr_SPAN : (Lex.pos * Lex.pos), STARTTFOOT_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDTFOOT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun tfoot_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDTFOOT, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(tfoot_PROD_1_SUBRULE_2_PRED, tfoot_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTFOOT_SPAN), #2(SR_SPAN)) in (UserCode.tfoot_PROD_1_ACT (tr_RES, SR_RES, STARTTFOOT_RES, cdata_opt_RES, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), STARTTFOOT_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and thead_NT (strm) = let val (STARTTHEAD_RES, STARTTHEAD_SPAN, strm') = matchSTARTTHEAD(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun thead_PROD_1_SUBRULE_1_NT (strm) = let val (tr_RES, tr_SPAN, strm') = tr_NT(strm) val FULL_SPAN = (#1(tr_SPAN), #2(tr_SPAN)) in ((tr_RES), FULL_SPAN, strm') end fun thead_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTTR(_), _, strm') => true | _ => false (* end case *)) val (tr_RES, tr_SPAN, strm') = EBNF.posclos(thead_PROD_1_SUBRULE_1_PRED, thead_PROD_1_SUBRULE_1_NT, strm') fun thead_PROD_1_SUBRULE_2_NT (strm) = let val (ENDTHEAD_RES, ENDTHEAD_SPAN, strm') = matchENDTHEAD(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDTHEAD_SPAN), #2(cdata_opt_SPAN)) in (UserCode.thead_PROD_1_SUBRULE_2_PROD_1_ACT (tr_RES, STARTTHEAD_RES, ENDTHEAD_RES, cdata_opt_RES, tr_SPAN : (Lex.pos * Lex.pos), STARTTHEAD_SPAN : (Lex.pos * Lex.pos), ENDTHEAD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun thead_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDTHEAD, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(thead_PROD_1_SUBRULE_2_PRED, thead_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTTHEAD_SPAN), #2(SR_SPAN)) in (UserCode.thead_PROD_1_ACT (tr_RES, SR_RES, STARTTHEAD_RES, cdata_opt_RES, tr_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), STARTTHEAD_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and caption_NT (strm) = let val (STARTCAPTION_RES, STARTCAPTION_SPAN, strm') = matchSTARTCAPTION(strm) fun caption_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun caption_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(caption_PROD_1_SUBRULE_1_PRED, caption_PROD_1_SUBRULE_1_NT, strm') val (ENDCAPTION_RES, ENDCAPTION_SPAN, strm') = matchENDCAPTION(strm') val FULL_SPAN = (#1(STARTCAPTION_SPAN), #2(ENDCAPTION_SPAN)) in (UserCode.caption_PROD_1_ACT (inline_RES, STARTCAPTION_RES, ENDCAPTION_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTCAPTION_SPAN : (Lex.pos * Lex.pos), ENDCAPTION_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and form_NT (strm) = let val (STARTFORM_RES, STARTFORM_SPAN, strm') = matchSTARTFORM(strm) fun form_PROD_1_SUBRULE_1_NT (strm) = let fun form_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end fun form_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun form_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (script_RES, script_SPAN, strm') = script_NT(strm) val FULL_SPAN = (#1(script_SPAN), #2(script_SPAN)) in ((script_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTSCRIPT(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.COMMENT(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.PCDATA(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.CHAR_REF(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.ENTITY_REF(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTADDRESS(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTP(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => form_PROD_1_SUBRULE_1_PROD_2(strm) | _ => fail() (* end case *)) end fun form_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(form_PROD_1_SUBRULE_1_PRED, form_PROD_1_SUBRULE_1_NT, strm') val (ENDFORM_RES, ENDFORM_SPAN, strm') = matchENDFORM(strm') val FULL_SPAN = (#1(STARTFORM_SPAN), #2(ENDFORM_SPAN)) in (UserCode.form_PROD_1_ACT (SR_RES, ENDFORM_RES, STARTFORM_RES, SR_SPAN : (Lex.pos * Lex.pos), ENDFORM_SPAN : (Lex.pos * Lex.pos), STARTFORM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and blockquote_NT (strm) = let val (STARTBLOCKQUOTE_RES, STARTBLOCKQUOTE_SPAN, strm') = matchSTARTBLOCKQUOTE(strm) fun blockquote_PROD_1_SUBRULE_1_NT (strm) = let fun blockquote_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun blockquote_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (script_RES, script_SPAN, strm') = script_NT(strm) val FULL_SPAN = (#1(script_SPAN), #2(script_SPAN)) in ((script_RES), FULL_SPAN, strm') end fun blockquote_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.PCDATA(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.CHAR_REF(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.ENTITY_REF(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.STARTADDRESS(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTCENTER(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIV(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDL(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTFIELDSET(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTFORM(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH1(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH2(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH4(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH5(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH6(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTHR(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTISINDEX(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTMENU(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTP(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTPRE(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTTABLE(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTUL(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTSCRIPT(_), _, strm') => blockquote_PROD_1_SUBRULE_1_PROD_2(strm) | _ => fail() (* end case *)) end fun blockquote_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(blockquote_PROD_1_SUBRULE_1_PRED, blockquote_PROD_1_SUBRULE_1_NT, strm') val (ENDBLOCKQUOTE_RES, ENDBLOCKQUOTE_SPAN, strm') = matchENDBLOCKQUOTE(strm') val FULL_SPAN = (#1(STARTBLOCKQUOTE_SPAN), #2(ENDBLOCKQUOTE_SPAN)) in (UserCode.blockquote_PROD_1_ACT (SR_RES, STARTBLOCKQUOTE_RES, ENDBLOCKQUOTE_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTBLOCKQUOTE_SPAN : (Lex.pos * Lex.pos), ENDBLOCKQUOTE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and noscript_NT (strm) = let val (STARTNOSCRIPT_RES, STARTNOSCRIPT_SPAN, strm') = matchSTARTNOSCRIPT(strm) fun noscript_PROD_1_SUBRULE_1_NT (strm) = let fun noscript_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end fun noscript_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTADDRESS(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTP(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.COMMENT(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.PCDATA(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.CHAR_REF(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.ENTITY_REF(_), _, strm') => noscript_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun noscript_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(noscript_PROD_1_SUBRULE_1_PRED, noscript_PROD_1_SUBRULE_1_NT, strm') val (ENDNOSCRIPT_RES, ENDNOSCRIPT_SPAN, strm') = matchENDNOSCRIPT(strm') val FULL_SPAN = (#1(STARTNOSCRIPT_SPAN), #2(ENDNOSCRIPT_SPAN)) in (UserCode.noscript_PROD_1_ACT (SR_RES, ENDNOSCRIPT_RES, STARTNOSCRIPT_RES, SR_SPAN : (Lex.pos * Lex.pos), ENDNOSCRIPT_SPAN : (Lex.pos * Lex.pos), STARTNOSCRIPT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and div_NT (strm) = let val (STARTDIV_RES, STARTDIV_SPAN, strm') = matchSTARTDIV(strm) fun div_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun div_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(div_PROD_1_SUBRULE_1_PRED, div_PROD_1_SUBRULE_1_NT, strm') val (ENDDIV_RES, ENDDIV_SPAN, strm') = matchENDDIV(strm') val FULL_SPAN = (#1(STARTDIV_SPAN), #2(ENDDIV_SPAN)) in (UserCode.div_PROD_1_ACT (flow_RES, ENDDIV_RES, STARTDIV_RES, flow_SPAN : (Lex.pos * Lex.pos), ENDDIV_SPAN : (Lex.pos * Lex.pos), STARTDIV_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and dl_NT (strm) = let val (STARTDL_RES, STARTDL_SPAN, strm') = matchSTARTDL(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun dl_PROD_1_SUBRULE_1_NT (strm) = let fun dl_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (dt_RES, dt_SPAN, strm') = dt_NT(strm) val FULL_SPAN = (#1(dt_SPAN), #2(dt_SPAN)) in ((dt_RES), FULL_SPAN, strm') end fun dl_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (dd_RES, dd_SPAN, strm') = dd_NT(strm) val FULL_SPAN = (#1(dd_SPAN), #2(dd_SPAN)) in ((dd_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTDD(_), _, strm') => dl_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDT(_), _, strm') => dl_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun dl_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTDD(_), _, strm') => true | (Tok.STARTDT(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.posclos(dl_PROD_1_SUBRULE_1_PRED, dl_PROD_1_SUBRULE_1_NT, strm') val (ENDDL_RES, ENDDL_SPAN, strm') = matchENDDL(strm') val FULL_SPAN = (#1(STARTDL_SPAN), #2(ENDDL_SPAN)) in (UserCode.dl_PROD_1_ACT (ENDDL_RES, SR_RES, cdata_opt_RES, STARTDL_RES, ENDDL_SPAN : (Lex.pos * Lex.pos), SR_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTDL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and dd_NT (strm) = let val (STARTDD_RES, STARTDD_SPAN, strm') = matchSTARTDD(strm) fun dd_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun dd_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(dd_PROD_1_SUBRULE_1_PRED, dd_PROD_1_SUBRULE_1_NT, strm') fun dd_PROD_1_SUBRULE_2_NT (strm) = let val (ENDDD_RES, ENDDD_SPAN, strm') = matchENDDD(strm) val FULL_SPAN = (#1(ENDDD_SPAN), #2(ENDDD_SPAN)) in (UserCode.dd_PROD_1_SUBRULE_2_PROD_1_ACT (ENDDD_RES, STARTDD_RES, flow_RES, ENDDD_SPAN : (Lex.pos * Lex.pos), STARTDD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun dd_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDDD, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(dd_PROD_1_SUBRULE_2_PRED, dd_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTDD_SPAN), #2(SR_SPAN)) in (UserCode.dd_PROD_1_ACT (SR_RES, STARTDD_RES, flow_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTDD_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and dt_NT (strm) = let val (STARTDT_RES, STARTDT_SPAN, strm') = matchSTARTDT(strm) fun dt_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun dt_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(dt_PROD_1_SUBRULE_1_PRED, dt_PROD_1_SUBRULE_1_NT, strm') fun dt_PROD_1_SUBRULE_2_NT (strm) = let val (ENDDT_RES, ENDDT_SPAN, strm') = matchENDDT(strm) val FULL_SPAN = (#1(ENDDT_SPAN), #2(ENDDT_SPAN)) in (UserCode.dt_PROD_1_SUBRULE_2_PROD_1_ACT (ENDDT_RES, inline_RES, STARTDT_RES, ENDDT_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTDT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun dt_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDDT, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(dt_PROD_1_SUBRULE_2_PRED, dt_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTDT_SPAN), #2(SR_SPAN)) in (UserCode.dt_PROD_1_ACT (SR_RES, inline_RES, STARTDT_RES, SR_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTDT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and preformatted_NT (strm) = let val (pre_RES, pre_SPAN, strm') = pre_NT(strm) val FULL_SPAN = (#1(pre_SPAN), #2(pre_SPAN)) in ((pre_RES), FULL_SPAN, strm') end and pre_NT (strm) = let val (STARTPRE_RES, STARTPRE_SPAN, strm') = matchSTARTPRE(strm) fun pre_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun pre_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(pre_PROD_1_SUBRULE_1_PRED, pre_PROD_1_SUBRULE_1_NT, strm') val (ENDPRE_RES, ENDPRE_SPAN, strm') = matchENDPRE(strm') val FULL_SPAN = (#1(STARTPRE_SPAN), #2(ENDPRE_SPAN)) in (UserCode.pre_PROD_1_ACT (inline_RES, ENDPRE_RES, STARTPRE_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDPRE_SPAN : (Lex.pos * Lex.pos), STARTPRE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and list_NT (strm) = let fun list_PROD_1 (strm) = let val (ul_RES, ul_SPAN, strm') = ul_NT(strm) val FULL_SPAN = (#1(ul_SPAN), #2(ul_SPAN)) in ((ul_RES), FULL_SPAN, strm') end fun list_PROD_2 (strm) = let val (ol_RES, ol_SPAN, strm') = ol_NT(strm) val FULL_SPAN = (#1(ol_SPAN), #2(ol_SPAN)) in ((ol_RES), FULL_SPAN, strm') end fun list_PROD_3 (strm) = let val (list_loose_RES, list_loose_SPAN, strm') = list_loose_NT(strm) val FULL_SPAN = (#1(list_loose_SPAN), #2(list_loose_SPAN)) in ((list_loose_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTDIR(_), _, strm') => list_PROD_3(strm) | (Tok.STARTMENU(_), _, strm') => list_PROD_3(strm) | (Tok.STARTUL(_), _, strm') => list_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => list_PROD_2(strm) | _ => fail() (* end case *)) end and list_loose_NT (strm) = let fun list_loose_PROD_1 (strm) = let val (dir_RES, dir_SPAN, strm') = dir_NT(strm) val FULL_SPAN = (#1(dir_SPAN), #2(dir_SPAN)) in ((dir_RES), FULL_SPAN, strm') end fun list_loose_PROD_2 (strm) = let val (menu_RES, menu_SPAN, strm') = menu_NT(strm) val FULL_SPAN = (#1(menu_SPAN), #2(menu_SPAN)) in ((menu_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTMENU(_), _, strm') => list_loose_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => list_loose_PROD_1(strm) | _ => fail() (* end case *)) end and menu_NT (strm) = let val (STARTMENU_RES, STARTMENU_SPAN, strm') = matchSTARTMENU(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun menu_PROD_1_SUBRULE_1_NT (strm) = let val (li_RES, li_SPAN, strm') = li_NT(strm) val FULL_SPAN = (#1(li_SPAN), #2(li_SPAN)) in ((li_RES), FULL_SPAN, strm') end fun menu_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTLI(_), _, strm') => true | _ => false (* end case *)) val (li_RES, li_SPAN, strm') = EBNF.posclos(menu_PROD_1_SUBRULE_1_PRED, menu_PROD_1_SUBRULE_1_NT, strm') val (ENDMENU_RES, ENDMENU_SPAN, strm') = matchENDMENU(strm') val FULL_SPAN = (#1(STARTMENU_SPAN), #2(ENDMENU_SPAN)) in (UserCode.menu_PROD_1_ACT (li_RES, cdata_opt_RES, STARTMENU_RES, ENDMENU_RES, li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTMENU_SPAN : (Lex.pos * Lex.pos), ENDMENU_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and li_NT (strm) = let val (STARTLI_RES, STARTLI_SPAN, strm') = matchSTARTLI(strm) fun li_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun li_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(li_PROD_1_SUBRULE_1_PRED, li_PROD_1_SUBRULE_1_NT, strm') fun li_PROD_1_SUBRULE_2_NT (strm) = let val (ENDLI_RES, ENDLI_SPAN, strm') = matchENDLI(strm) val FULL_SPAN = (#1(ENDLI_SPAN), #2(ENDLI_SPAN)) in (UserCode.li_PROD_1_SUBRULE_2_PROD_1_ACT (ENDLI_RES, STARTLI_RES, flow_RES, ENDLI_SPAN : (Lex.pos * Lex.pos), STARTLI_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun li_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDLI, _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.optional(li_PROD_1_SUBRULE_2_PRED, li_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(STARTLI_SPAN), #2(SR_SPAN)) in (UserCode.li_PROD_1_ACT (SR_RES, STARTLI_RES, flow_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTLI_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and dir_NT (strm) = let val (STARTDIR_RES, STARTDIR_SPAN, strm') = matchSTARTDIR(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun dir_PROD_1_SUBRULE_1_NT (strm) = let val (li_RES, li_SPAN, strm') = li_NT(strm) val FULL_SPAN = (#1(li_SPAN), #2(li_SPAN)) in ((li_RES), FULL_SPAN, strm') end fun dir_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTLI(_), _, strm') => true | _ => false (* end case *)) val (li_RES, li_SPAN, strm') = EBNF.posclos(dir_PROD_1_SUBRULE_1_PRED, dir_PROD_1_SUBRULE_1_NT, strm') val (ENDDIR_RES, ENDDIR_SPAN, strm') = matchENDDIR(strm') val FULL_SPAN = (#1(STARTDIR_SPAN), #2(ENDDIR_SPAN)) in (UserCode.dir_PROD_1_ACT (li_RES, cdata_opt_RES, ENDDIR_RES, STARTDIR_RES, li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDDIR_SPAN : (Lex.pos * Lex.pos), STARTDIR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and ol_NT (strm) = let val (STARTOL_RES, STARTOL_SPAN, strm') = matchSTARTOL(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun ol_PROD_1_SUBRULE_1_NT (strm) = let val (li_RES, li_SPAN, strm') = li_NT(strm) val FULL_SPAN = (#1(li_SPAN), #2(li_SPAN)) in ((li_RES), FULL_SPAN, strm') end fun ol_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTLI(_), _, strm') => true | _ => false (* end case *)) val (li_RES, li_SPAN, strm') = EBNF.posclos(ol_PROD_1_SUBRULE_1_PRED, ol_PROD_1_SUBRULE_1_NT, strm') val (ENDOL_RES, ENDOL_SPAN, strm') = matchENDOL(strm') val FULL_SPAN = (#1(STARTOL_SPAN), #2(ENDOL_SPAN)) in (UserCode.ol_PROD_1_ACT (ENDOL_RES, li_RES, cdata_opt_RES, STARTOL_RES, ENDOL_SPAN : (Lex.pos * Lex.pos), li_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTOL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and ul_NT (strm) = let val (STARTUL_RES, STARTUL_SPAN, strm') = matchSTARTUL(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') fun ul_PROD_1_SUBRULE_1_NT (strm) = let val (li_RES, li_SPAN, strm') = li_NT(strm) val FULL_SPAN = (#1(li_SPAN), #2(li_SPAN)) in ((li_RES), FULL_SPAN, strm') end fun ul_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTLI(_), _, strm') => true | _ => false (* end case *)) val (li_RES, li_SPAN, strm') = EBNF.posclos(ul_PROD_1_SUBRULE_1_PRED, ul_PROD_1_SUBRULE_1_NT, strm') val (ENDUL_RES, ENDUL_SPAN, strm') = matchENDUL(strm') val FULL_SPAN = (#1(STARTUL_SPAN), #2(ENDUL_SPAN)) in (UserCode.ul_PROD_1_ACT (li_RES, ENDUL_RES, cdata_opt_RES, STARTUL_RES, li_SPAN : (Lex.pos * Lex.pos), ENDUL_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTUL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and heading_NT (strm) = let fun heading_PROD_1 (strm) = let val (h1_RES, h1_SPAN, strm') = h1_NT(strm) val FULL_SPAN = (#1(h1_SPAN), #2(h1_SPAN)) in ((h1_RES), FULL_SPAN, strm') end fun heading_PROD_2 (strm) = let val (h2_RES, h2_SPAN, strm') = h2_NT(strm) val FULL_SPAN = (#1(h2_SPAN), #2(h2_SPAN)) in ((h2_RES), FULL_SPAN, strm') end fun heading_PROD_3 (strm) = let val (h3_RES, h3_SPAN, strm') = h3_NT(strm) val FULL_SPAN = (#1(h3_SPAN), #2(h3_SPAN)) in ((h3_RES), FULL_SPAN, strm') end fun heading_PROD_4 (strm) = let val (h4_RES, h4_SPAN, strm') = h4_NT(strm) val FULL_SPAN = (#1(h4_SPAN), #2(h4_SPAN)) in ((h4_RES), FULL_SPAN, strm') end fun heading_PROD_5 (strm) = let val (h5_RES, h5_SPAN, strm') = h5_NT(strm) val FULL_SPAN = (#1(h5_SPAN), #2(h5_SPAN)) in ((h5_RES), FULL_SPAN, strm') end fun heading_PROD_6 (strm) = let val (h6_RES, h6_SPAN, strm') = h6_NT(strm) val FULL_SPAN = (#1(h6_SPAN), #2(h6_SPAN)) in ((h6_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTH6(_), _, strm') => heading_PROD_6(strm) | (Tok.STARTH4(_), _, strm') => heading_PROD_4(strm) | (Tok.STARTH2(_), _, strm') => heading_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => heading_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => heading_PROD_3(strm) | (Tok.STARTH5(_), _, strm') => heading_PROD_5(strm) | _ => fail() (* end case *)) end and h6_NT (strm) = let val (STARTH6_RES, STARTH6_SPAN, strm') = matchSTARTH6(strm) fun h6_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h6_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h6_PROD_1_SUBRULE_1_PRED, h6_PROD_1_SUBRULE_1_NT, strm') val (ENDH6_RES, ENDH6_SPAN, strm') = matchENDH6(strm') val FULL_SPAN = (#1(STARTH6_SPAN), #2(ENDH6_SPAN)) in (UserCode.h6_PROD_1_ACT (ENDH6_RES, inline_RES, STARTH6_RES, ENDH6_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH6_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and h5_NT (strm) = let val (STARTH5_RES, STARTH5_SPAN, strm') = matchSTARTH5(strm) fun h5_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h5_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h5_PROD_1_SUBRULE_1_PRED, h5_PROD_1_SUBRULE_1_NT, strm') val (ENDH5_RES, ENDH5_SPAN, strm') = matchENDH5(strm') val FULL_SPAN = (#1(STARTH5_SPAN), #2(ENDH5_SPAN)) in (UserCode.h5_PROD_1_ACT (ENDH5_RES, inline_RES, STARTH5_RES, ENDH5_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH5_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and h4_NT (strm) = let val (STARTH4_RES, STARTH4_SPAN, strm') = matchSTARTH4(strm) fun h4_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h4_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h4_PROD_1_SUBRULE_1_PRED, h4_PROD_1_SUBRULE_1_NT, strm') val (ENDH4_RES, ENDH4_SPAN, strm') = matchENDH4(strm') val FULL_SPAN = (#1(STARTH4_SPAN), #2(ENDH4_SPAN)) in (UserCode.h4_PROD_1_ACT (ENDH4_RES, inline_RES, STARTH4_RES, ENDH4_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH4_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and h3_NT (strm) = let val (STARTH3_RES, STARTH3_SPAN, strm') = matchSTARTH3(strm) fun h3_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h3_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h3_PROD_1_SUBRULE_1_PRED, h3_PROD_1_SUBRULE_1_NT, strm') val (ENDH3_RES, ENDH3_SPAN, strm') = matchENDH3(strm') val FULL_SPAN = (#1(STARTH3_SPAN), #2(ENDH3_SPAN)) in (UserCode.h3_PROD_1_ACT (ENDH3_RES, inline_RES, STARTH3_RES, ENDH3_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH3_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and h2_NT (strm) = let val (STARTH2_RES, STARTH2_SPAN, strm') = matchSTARTH2(strm) fun h2_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h2_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h2_PROD_1_SUBRULE_1_PRED, h2_PROD_1_SUBRULE_1_NT, strm') val (ENDH2_RES, ENDH2_SPAN, strm') = matchENDH2(strm') val FULL_SPAN = (#1(STARTH2_SPAN), #2(ENDH2_SPAN)) in (UserCode.h2_PROD_1_ACT (ENDH2_RES, inline_RES, STARTH2_RES, ENDH2_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and h1_NT (strm) = let val (STARTH1_RES, STARTH1_SPAN, strm') = matchSTARTH1(strm) fun h1_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun h1_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(h1_PROD_1_SUBRULE_1_PRED, h1_PROD_1_SUBRULE_1_NT, strm') val (ENDH1_RES, ENDH1_SPAN, strm') = matchENDH1(strm') val FULL_SPAN = (#1(STARTH1_SPAN), #2(ENDH1_SPAN)) in (UserCode.h1_PROD_1_ACT (ENDH1_RES, inline_RES, STARTH1_RES, ENDH1_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTH1_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and p_NT (strm) = let val (STARTP_RES, STARTP_SPAN, strm') = matchSTARTP(strm) fun p_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun p_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(p_PROD_1_SUBRULE_1_PRED, p_PROD_1_SUBRULE_1_NT, strm') val (ENDP_RES, ENDP_SPAN, strm') = matchENDP(strm') val FULL_SPAN = (#1(STARTP_SPAN), #2(ENDP_SPAN)) in (UserCode.p_PROD_1_ACT (inline_RES, STARTP_RES, ENDP_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTP_SPAN : (Lex.pos * Lex.pos), ENDP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and object_NT (strm) = let val (STARTOBJECT_RES, STARTOBJECT_SPAN, strm') = matchSTARTOBJECT(strm) fun object_PROD_1_SUBRULE_1_NT (strm) = let fun object_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (param_RES, param_SPAN, strm') = param_NT(strm) val FULL_SPAN = (#1(param_SPAN), #2(param_SPAN)) in ((param_RES), FULL_SPAN, strm') end fun object_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.PCDATA(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.CHAR_REF(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.ENTITY_REF(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTA(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTABBR(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTACRONYM(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTADDRESS(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTAPPLET(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTB(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBASEFONT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBDO(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBIG(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBR(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTBUTTON(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCITE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTCODE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDFN(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTEM(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFONT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTI(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTIFRAME(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTIMG(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTINPUT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTKBD(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTLABEL(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMAP(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOBJECT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTP(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTQ(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTS(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSAMP(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSCRIPT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSELECT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSMALL(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSPAN(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSTRIKE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSTRONG(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSUB(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTSUP(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTEXTAREA(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTTT(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTU(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTVAR(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTPARAM(_), _, strm') => object_PROD_1_SUBRULE_1_PROD_1(strm) | _ => fail() (* end case *)) end fun object_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPARAM(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (SR_RES, SR_SPAN, strm') = EBNF.closure(object_PROD_1_SUBRULE_1_PRED, object_PROD_1_SUBRULE_1_NT, strm') val (ENDOBJECT_RES, ENDOBJECT_SPAN, strm') = matchENDOBJECT(strm') val FULL_SPAN = (#1(STARTOBJECT_SPAN), #2(ENDOBJECT_SPAN)) in (UserCode.object_PROD_1_ACT (SR_RES, STARTOBJECT_RES, ENDOBJECT_RES, SR_SPAN : (Lex.pos * Lex.pos), STARTOBJECT_SPAN : (Lex.pos * Lex.pos), ENDOBJECT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and a_NT (strm) = let val (STARTA_RES, STARTA_SPAN, strm') = matchSTARTA(strm) fun a_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun a_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(a_PROD_1_SUBRULE_1_PRED, a_PROD_1_SUBRULE_1_NT, strm') val (ENDA_RES, ENDA_SPAN, strm') = matchENDA(strm') val FULL_SPAN = (#1(STARTA_SPAN), #2(ENDA_SPAN)) in (UserCode.a_PROD_1_ACT (inline_RES, STARTA_RES, ENDA_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTA_SPAN : (Lex.pos * Lex.pos), ENDA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and phrase_NT (strm) = let fun phrase_PROD_1 (strm) = let val (em_RES, em_SPAN, strm') = em_NT(strm) val FULL_SPAN = (#1(em_SPAN), #2(em_SPAN)) in ((em_RES), FULL_SPAN, strm') end fun phrase_PROD_2 (strm) = let val (strong_RES, strong_SPAN, strm') = strong_NT(strm) val FULL_SPAN = (#1(strong_SPAN), #2(strong_SPAN)) in ((strong_RES), FULL_SPAN, strm') end fun phrase_PROD_3 (strm) = let val (dfn_RES, dfn_SPAN, strm') = dfn_NT(strm) val FULL_SPAN = (#1(dfn_SPAN), #2(dfn_SPAN)) in ((dfn_RES), FULL_SPAN, strm') end fun phrase_PROD_4 (strm) = let val (code_RES, code_SPAN, strm') = code_NT(strm) val FULL_SPAN = (#1(code_SPAN), #2(code_SPAN)) in ((code_RES), FULL_SPAN, strm') end fun phrase_PROD_5 (strm) = let val (samp_RES, samp_SPAN, strm') = samp_NT(strm) val FULL_SPAN = (#1(samp_SPAN), #2(samp_SPAN)) in ((samp_RES), FULL_SPAN, strm') end fun phrase_PROD_6 (strm) = let val (kbd_RES, kbd_SPAN, strm') = kbd_NT(strm) val FULL_SPAN = (#1(kbd_SPAN), #2(kbd_SPAN)) in ((kbd_RES), FULL_SPAN, strm') end fun phrase_PROD_7 (strm) = let val (var_RES, var_SPAN, strm') = var_NT(strm) val FULL_SPAN = (#1(var_SPAN), #2(var_SPAN)) in ((var_RES), FULL_SPAN, strm') end fun phrase_PROD_8 (strm) = let val (cite_RES, cite_SPAN, strm') = cite_NT(strm) val FULL_SPAN = (#1(cite_SPAN), #2(cite_SPAN)) in ((cite_RES), FULL_SPAN, strm') end fun phrase_PROD_9 (strm) = let val (abbr_RES, abbr_SPAN, strm') = abbr_NT(strm) val FULL_SPAN = (#1(abbr_SPAN), #2(abbr_SPAN)) in ((abbr_RES), FULL_SPAN, strm') end fun phrase_PROD_10 (strm) = let val (acronym_RES, acronym_SPAN, strm') = acronym_NT(strm) val FULL_SPAN = (#1(acronym_SPAN), #2(acronym_SPAN)) in ((acronym_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTACRONYM(_), _, strm') => phrase_PROD_10(strm) | (Tok.STARTCITE(_), _, strm') => phrase_PROD_8(strm) | (Tok.STARTKBD(_), _, strm') => phrase_PROD_6(strm) | (Tok.STARTCODE(_), _, strm') => phrase_PROD_4(strm) | (Tok.STARTSTRONG(_), _, strm') => phrase_PROD_2(strm) | (Tok.STARTEM(_), _, strm') => phrase_PROD_1(strm) | (Tok.STARTDFN(_), _, strm') => phrase_PROD_3(strm) | (Tok.STARTSAMP(_), _, strm') => phrase_PROD_5(strm) | (Tok.STARTVAR(_), _, strm') => phrase_PROD_7(strm) | (Tok.STARTABBR(_), _, strm') => phrase_PROD_9(strm) | _ => fail() (* end case *)) end and acronym_NT (strm) = let val (STARTACRONYM_RES, STARTACRONYM_SPAN, strm') = matchSTARTACRONYM(strm) fun acronym_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun acronym_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(acronym_PROD_1_SUBRULE_1_PRED, acronym_PROD_1_SUBRULE_1_NT, strm') val (ENDACRONYM_RES, ENDACRONYM_SPAN, strm') = matchENDACRONYM(strm') val FULL_SPAN = (#1(STARTACRONYM_SPAN), #2(ENDACRONYM_SPAN)) in (UserCode.acronym_PROD_1_ACT (inline_RES, STARTACRONYM_RES, ENDACRONYM_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTACRONYM_SPAN : (Lex.pos * Lex.pos), ENDACRONYM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and abbr_NT (strm) = let val (STARTABBR_RES, STARTABBR_SPAN, strm') = matchSTARTABBR(strm) fun abbr_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun abbr_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(abbr_PROD_1_SUBRULE_1_PRED, abbr_PROD_1_SUBRULE_1_NT, strm') val (ENDABBR_RES, ENDABBR_SPAN, strm') = matchENDABBR(strm') val FULL_SPAN = (#1(STARTABBR_SPAN), #2(ENDABBR_SPAN)) in (UserCode.abbr_PROD_1_ACT (inline_RES, ENDABBR_RES, STARTABBR_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDABBR_SPAN : (Lex.pos * Lex.pos), STARTABBR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and cite_NT (strm) = let val (STARTCITE_RES, STARTCITE_SPAN, strm') = matchSTARTCITE(strm) fun cite_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun cite_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(cite_PROD_1_SUBRULE_1_PRED, cite_PROD_1_SUBRULE_1_NT, strm') val (ENDCITE_RES, ENDCITE_SPAN, strm') = matchENDCITE(strm') val FULL_SPAN = (#1(STARTCITE_SPAN), #2(ENDCITE_SPAN)) in (UserCode.cite_PROD_1_ACT (inline_RES, ENDCITE_RES, STARTCITE_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDCITE_SPAN : (Lex.pos * Lex.pos), STARTCITE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and var_NT (strm) = let val (STARTVAR_RES, STARTVAR_SPAN, strm') = matchSTARTVAR(strm) fun var_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun var_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(var_PROD_1_SUBRULE_1_PRED, var_PROD_1_SUBRULE_1_NT, strm') val (ENDVAR_RES, ENDVAR_SPAN, strm') = matchENDVAR(strm') val FULL_SPAN = (#1(STARTVAR_SPAN), #2(ENDVAR_SPAN)) in (UserCode.var_PROD_1_ACT (inline_RES, STARTVAR_RES, ENDVAR_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTVAR_SPAN : (Lex.pos * Lex.pos), ENDVAR_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and kbd_NT (strm) = let val (STARTKBD_RES, STARTKBD_SPAN, strm') = matchSTARTKBD(strm) fun kbd_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun kbd_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(kbd_PROD_1_SUBRULE_1_PRED, kbd_PROD_1_SUBRULE_1_NT, strm') val (ENDKBD_RES, ENDKBD_SPAN, strm') = matchENDKBD(strm') val FULL_SPAN = (#1(STARTKBD_SPAN), #2(ENDKBD_SPAN)) in (UserCode.kbd_PROD_1_ACT (inline_RES, STARTKBD_RES, ENDKBD_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTKBD_SPAN : (Lex.pos * Lex.pos), ENDKBD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and samp_NT (strm) = let val (STARTSAMP_RES, STARTSAMP_SPAN, strm') = matchSTARTSAMP(strm) fun samp_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun samp_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(samp_PROD_1_SUBRULE_1_PRED, samp_PROD_1_SUBRULE_1_NT, strm') val (ENDSAMP_RES, ENDSAMP_SPAN, strm') = matchENDSAMP(strm') val FULL_SPAN = (#1(STARTSAMP_SPAN), #2(ENDSAMP_SPAN)) in (UserCode.samp_PROD_1_ACT (inline_RES, STARTSAMP_RES, ENDSAMP_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTSAMP_SPAN : (Lex.pos * Lex.pos), ENDSAMP_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and code_NT (strm) = let val (STARTCODE_RES, STARTCODE_SPAN, strm') = matchSTARTCODE(strm) fun code_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun code_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(code_PROD_1_SUBRULE_1_PRED, code_PROD_1_SUBRULE_1_NT, strm') val (ENDCODE_RES, ENDCODE_SPAN, strm') = matchENDCODE(strm') val FULL_SPAN = (#1(STARTCODE_SPAN), #2(ENDCODE_SPAN)) in (UserCode.code_PROD_1_ACT (inline_RES, ENDCODE_RES, STARTCODE_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDCODE_SPAN : (Lex.pos * Lex.pos), STARTCODE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and dfn_NT (strm) = let val (STARTDFN_RES, STARTDFN_SPAN, strm') = matchSTARTDFN(strm) fun dfn_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun dfn_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(dfn_PROD_1_SUBRULE_1_PRED, dfn_PROD_1_SUBRULE_1_NT, strm') val (ENDDFN_RES, ENDDFN_SPAN, strm') = matchENDDFN(strm') val FULL_SPAN = (#1(STARTDFN_SPAN), #2(ENDDFN_SPAN)) in (UserCode.dfn_PROD_1_ACT (inline_RES, ENDDFN_RES, STARTDFN_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDDFN_SPAN : (Lex.pos * Lex.pos), STARTDFN_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and strong_NT (strm) = let val (STARTSTRONG_RES, STARTSTRONG_SPAN, strm') = matchSTARTSTRONG(strm) fun strong_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun strong_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(strong_PROD_1_SUBRULE_1_PRED, strong_PROD_1_SUBRULE_1_NT, strm') val (ENDSTRONG_RES, ENDSTRONG_SPAN, strm') = matchENDSTRONG(strm') val FULL_SPAN = (#1(STARTSTRONG_SPAN), #2(ENDSTRONG_SPAN)) in (UserCode.strong_PROD_1_ACT (inline_RES, STARTSTRONG_RES, ENDSTRONG_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTSTRONG_SPAN : (Lex.pos * Lex.pos), ENDSTRONG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and em_NT (strm) = let val (STARTEM_RES, STARTEM_SPAN, strm') = matchSTARTEM(strm) fun em_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun em_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(em_PROD_1_SUBRULE_1_PRED, em_PROD_1_SUBRULE_1_NT, strm') val (ENDEM_RES, ENDEM_SPAN, strm') = matchENDEM(strm') val FULL_SPAN = (#1(STARTEM_SPAN), #2(ENDEM_SPAN)) in (UserCode.em_PROD_1_ACT (ENDEM_RES, inline_RES, STARTEM_RES, ENDEM_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTEM_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and fontstyle_NT (strm) = let fun fontstyle_PROD_1 (strm) = let val (tt_RES, tt_SPAN, strm') = tt_NT(strm) val FULL_SPAN = (#1(tt_SPAN), #2(tt_SPAN)) in ((tt_RES), FULL_SPAN, strm') end fun fontstyle_PROD_2 (strm) = let val (i_RES, i_SPAN, strm') = i_NT(strm) val FULL_SPAN = (#1(i_SPAN), #2(i_SPAN)) in ((i_RES), FULL_SPAN, strm') end fun fontstyle_PROD_3 (strm) = let val (b_RES, b_SPAN, strm') = b_NT(strm) val FULL_SPAN = (#1(b_SPAN), #2(b_SPAN)) in ((b_RES), FULL_SPAN, strm') end fun fontstyle_PROD_4 (strm) = let val (big_RES, big_SPAN, strm') = big_NT(strm) val FULL_SPAN = (#1(big_SPAN), #2(big_SPAN)) in ((big_RES), FULL_SPAN, strm') end fun fontstyle_PROD_5 (strm) = let val (small_RES, small_SPAN, strm') = small_NT(strm) val FULL_SPAN = (#1(small_SPAN), #2(small_SPAN)) in ((small_RES), FULL_SPAN, strm') end fun fontstyle_PROD_6 (strm) = let val (fontstyle_loose_RES, fontstyle_loose_SPAN, strm') = fontstyle_loose_NT(strm) val FULL_SPAN = (#1(fontstyle_loose_SPAN), #2(fontstyle_loose_SPAN)) in ((fontstyle_loose_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTS(_), _, strm') => fontstyle_PROD_6(strm) | (Tok.STARTSTRIKE(_), _, strm') => fontstyle_PROD_6(strm) | (Tok.STARTU(_), _, strm') => fontstyle_PROD_6(strm) | (Tok.STARTBIG(_), _, strm') => fontstyle_PROD_4(strm) | (Tok.STARTI(_), _, strm') => fontstyle_PROD_2(strm) | (Tok.STARTTT(_), _, strm') => fontstyle_PROD_1(strm) | (Tok.STARTB(_), _, strm') => fontstyle_PROD_3(strm) | (Tok.STARTSMALL(_), _, strm') => fontstyle_PROD_5(strm) | _ => fail() (* end case *)) end and fontstyle_loose_NT (strm) = let fun fontstyle_loose_PROD_1 (strm) = let val (u_RES, u_SPAN, strm') = u_NT(strm) val FULL_SPAN = (#1(u_SPAN), #2(u_SPAN)) in ((u_RES), FULL_SPAN, strm') end fun fontstyle_loose_PROD_2 (strm) = let val (s_RES, s_SPAN, strm') = s_NT(strm) val FULL_SPAN = (#1(s_SPAN), #2(s_SPAN)) in ((s_RES), FULL_SPAN, strm') end fun fontstyle_loose_PROD_3 (strm) = let val (strike_RES, strike_SPAN, strm') = strike_NT(strm) val FULL_SPAN = (#1(strike_SPAN), #2(strike_SPAN)) in ((strike_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTSTRIKE(_), _, strm') => fontstyle_loose_PROD_3(strm) | (Tok.STARTU(_), _, strm') => fontstyle_loose_PROD_1(strm) | (Tok.STARTS(_), _, strm') => fontstyle_loose_PROD_2(strm) | _ => fail() (* end case *)) end and strike_NT (strm) = let val (STARTSTRIKE_RES, STARTSTRIKE_SPAN, strm') = matchSTARTSTRIKE(strm) fun strike_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun strike_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(strike_PROD_1_SUBRULE_1_PRED, strike_PROD_1_SUBRULE_1_NT, strm') val (ENDSTRIKE_RES, ENDSTRIKE_SPAN, strm') = matchENDSTRIKE(strm') val FULL_SPAN = (#1(STARTSTRIKE_SPAN), #2(ENDSTRIKE_SPAN)) in (UserCode.strike_PROD_1_ACT (inline_RES, STARTSTRIKE_RES, ENDSTRIKE_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTSTRIKE_SPAN : (Lex.pos * Lex.pos), ENDSTRIKE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and s_NT (strm) = let val (STARTS_RES, STARTS_SPAN, strm') = matchSTARTS(strm) fun s_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun s_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(s_PROD_1_SUBRULE_1_PRED, s_PROD_1_SUBRULE_1_NT, strm') val (ENDS_RES, ENDS_SPAN, strm') = matchENDS(strm') val FULL_SPAN = (#1(STARTS_SPAN), #2(ENDS_SPAN)) in (UserCode.s_PROD_1_ACT (inline_RES, STARTS_RES, ENDS_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTS_SPAN : (Lex.pos * Lex.pos), ENDS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and u_NT (strm) = let val (STARTU_RES, STARTU_SPAN, strm') = matchSTARTU(strm) fun u_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun u_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(u_PROD_1_SUBRULE_1_PRED, u_PROD_1_SUBRULE_1_NT, strm') val (ENDU_RES, ENDU_SPAN, strm') = matchENDU(strm') val FULL_SPAN = (#1(STARTU_SPAN), #2(ENDU_SPAN)) in (UserCode.u_PROD_1_ACT (inline_RES, STARTU_RES, ENDU_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTU_SPAN : (Lex.pos * Lex.pos), ENDU_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and small_NT (strm) = let val (STARTSMALL_RES, STARTSMALL_SPAN, strm') = matchSTARTSMALL(strm) fun small_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun small_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(small_PROD_1_SUBRULE_1_PRED, small_PROD_1_SUBRULE_1_NT, strm') val (ENDSMALL_RES, ENDSMALL_SPAN, strm') = matchENDSMALL(strm') val FULL_SPAN = (#1(STARTSMALL_SPAN), #2(ENDSMALL_SPAN)) in (UserCode.small_PROD_1_ACT (inline_RES, ENDSMALL_RES, STARTSMALL_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDSMALL_SPAN : (Lex.pos * Lex.pos), STARTSMALL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and big_NT (strm) = let val (STARTBIG_RES, STARTBIG_SPAN, strm') = matchSTARTBIG(strm) fun big_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun big_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(big_PROD_1_SUBRULE_1_PRED, big_PROD_1_SUBRULE_1_NT, strm') val (ENDBIG_RES, ENDBIG_SPAN, strm') = matchENDBIG(strm') val FULL_SPAN = (#1(STARTBIG_SPAN), #2(ENDBIG_SPAN)) in (UserCode.big_PROD_1_ACT (inline_RES, ENDBIG_RES, STARTBIG_RES, inline_SPAN : (Lex.pos * Lex.pos), ENDBIG_SPAN : (Lex.pos * Lex.pos), STARTBIG_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and b_NT (strm) = let val (STARTB_RES, STARTB_SPAN, strm') = matchSTARTB(strm) fun b_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun b_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(b_PROD_1_SUBRULE_1_PRED, b_PROD_1_SUBRULE_1_NT, strm') val (ENDB_RES, ENDB_SPAN, strm') = matchENDB(strm') val FULL_SPAN = (#1(STARTB_SPAN), #2(ENDB_SPAN)) in (UserCode.b_PROD_1_ACT (inline_RES, STARTB_RES, ENDB_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTB_SPAN : (Lex.pos * Lex.pos), ENDB_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and i_NT (strm) = let val (STARTI_RES, STARTI_SPAN, strm') = matchSTARTI(strm) fun i_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun i_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(i_PROD_1_SUBRULE_1_PRED, i_PROD_1_SUBRULE_1_NT, strm') val (ENDI_RES, ENDI_SPAN, strm') = matchENDI(strm') val FULL_SPAN = (#1(STARTI_SPAN), #2(ENDI_SPAN)) in (UserCode.i_PROD_1_ACT (inline_RES, STARTI_RES, ENDI_RES, inline_SPAN : (Lex.pos * Lex.pos), STARTI_SPAN : (Lex.pos * Lex.pos), ENDI_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end and tt_NT (strm) = let val (STARTTT_RES, STARTTT_SPAN, strm') = matchSTARTTT(strm) fun tt_PROD_1_SUBRULE_1_NT (strm) = let val (inline_RES, inline_SPAN, strm') = inline_NT(strm) val FULL_SPAN = (#1(inline_SPAN), #2(inline_SPAN)) in ((inline_RES), FULL_SPAN, strm') end fun tt_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (inline_RES, inline_SPAN, strm') = EBNF.closure(tt_PROD_1_SUBRULE_1_PRED, tt_PROD_1_SUBRULE_1_NT, strm') val (ENDTT_RES, ENDTT_SPAN, strm') = matchENDTT(strm') val FULL_SPAN = (#1(STARTTT_SPAN), #2(ENDTT_SPAN)) in (UserCode.tt_PROD_1_ACT (ENDTT_RES, inline_RES, STARTTT_RES, ENDTT_SPAN : (Lex.pos * Lex.pos), inline_SPAN : (Lex.pos * Lex.pos), STARTTT_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun del_NT (strm) = let val (STARTDEL_RES, STARTDEL_SPAN, strm') = matchSTARTDEL(strm) fun del_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun del_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(del_PROD_1_SUBRULE_1_PRED, del_PROD_1_SUBRULE_1_NT, strm') val (ENDDEL_RES, ENDDEL_SPAN, strm') = matchENDDEL(strm') val FULL_SPAN = (#1(STARTDEL_SPAN), #2(ENDDEL_SPAN)) in (UserCode.del_PROD_1_ACT (flow_RES, ENDDEL_RES, STARTDEL_RES, flow_SPAN : (Lex.pos * Lex.pos), ENDDEL_SPAN : (Lex.pos * Lex.pos), STARTDEL_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun ins_NT (strm) = let val (STARTINS_RES, STARTINS_SPAN, strm') = matchSTARTINS(strm) fun ins_PROD_1_SUBRULE_1_NT (strm) = let val (flow_RES, flow_SPAN, strm') = flow_NT(strm) val FULL_SPAN = (#1(flow_SPAN), #2(flow_SPAN)) in ((flow_RES), FULL_SPAN, strm') end fun ins_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTA(_), _, strm') => true | (Tok.STARTABBR(_), _, strm') => true | (Tok.STARTACRONYM(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTAPPLET(_), _, strm') => true | (Tok.STARTB(_), _, strm') => true | (Tok.STARTBASEFONT(_), _, strm') => true | (Tok.STARTBDO(_), _, strm') => true | (Tok.STARTBIG(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTBR(_), _, strm') => true | (Tok.STARTBUTTON(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTCITE(_), _, strm') => true | (Tok.STARTCODE(_), _, strm') => true | (Tok.STARTDFN(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTEM(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFONT(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTI(_), _, strm') => true | (Tok.STARTIFRAME(_), _, strm') => true | (Tok.STARTIMG(_), _, strm') => true | (Tok.STARTINPUT(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTKBD(_), _, strm') => true | (Tok.STARTLABEL(_), _, strm') => true | (Tok.STARTMAP(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTQ(_), _, strm') => true | (Tok.STARTS(_), _, strm') => true | (Tok.STARTSAMP(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSELECT(_), _, strm') => true | (Tok.STARTSMALL(_), _, strm') => true | (Tok.STARTSPAN(_), _, strm') => true | (Tok.STARTSTRIKE(_), _, strm') => true | (Tok.STARTSTRONG(_), _, strm') => true | (Tok.STARTSUB(_), _, strm') => true | (Tok.STARTSUP(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTTEXTAREA(_), _, strm') => true | (Tok.STARTTT(_), _, strm') => true | (Tok.STARTU(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | (Tok.STARTVAR(_), _, strm') => true | _ => false (* end case *)) val (flow_RES, flow_SPAN, strm') = EBNF.closure(ins_PROD_1_SUBRULE_1_PRED, ins_PROD_1_SUBRULE_1_NT, strm') val (ENDINS_RES, ENDINS_SPAN, strm') = matchENDINS(strm') val FULL_SPAN = (#1(STARTINS_SPAN), #2(ENDINS_SPAN)) in (UserCode.ins_PROD_1_ACT (STARTINS_RES, flow_RES, ENDINS_RES, STARTINS_SPAN : (Lex.pos * Lex.pos), flow_SPAN : (Lex.pos * Lex.pos), ENDINS_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun body_rest_NT (strm) = let fun body_rest_PROD_1_SUBRULE_1_NT (strm) = let fun body_rest_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun body_rest_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (script_RES, script_SPAN, strm') = script_NT(strm) val FULL_SPAN = (#1(script_SPAN), #2(script_SPAN)) in ((script_RES), FULL_SPAN, strm') end fun body_rest_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (ins_RES, ins_SPAN, strm') = ins_NT(strm) val FULL_SPAN = (#1(ins_SPAN), #2(ins_SPAN)) in ((ins_RES), FULL_SPAN, strm') end fun body_rest_PROD_1_SUBRULE_1_PROD_4 (strm) = let val (del_RES, del_SPAN, strm') = del_NT(strm) val FULL_SPAN = (#1(del_SPAN), #2(del_SPAN)) in ((del_RES), FULL_SPAN, strm') end fun body_rest_PROD_1_SUBRULE_1_PROD_5 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_5(strm) | (Tok.PCDATA(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_5(strm) | (Tok.CHAR_REF(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_5(strm) | (Tok.ENTITY_REF(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_5(strm) | (Tok.STARTINS(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.STARTADDRESS(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTCENTER(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIV(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTDL(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTFIELDSET(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTFORM(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH1(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH2(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH4(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH5(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTH6(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTHR(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTISINDEX(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTMENU(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTP(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTPRE(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTTABLE(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTUL(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTSCRIPT(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_2(strm) | (Tok.STARTDEL(_), _, strm') => body_rest_PROD_1_SUBRULE_1_PROD_4(strm) | _ => fail() (* end case *)) end fun body_rest_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTADDRESS(_), _, strm') => true | (Tok.STARTBLOCKQUOTE(_), _, strm') => true | (Tok.STARTCENTER(_), _, strm') => true | (Tok.STARTDEL(_), _, strm') => true | (Tok.STARTDIR(_), _, strm') => true | (Tok.STARTDIV(_), _, strm') => true | (Tok.STARTDL(_), _, strm') => true | (Tok.STARTFIELDSET(_), _, strm') => true | (Tok.STARTFORM(_), _, strm') => true | (Tok.STARTH1(_), _, strm') => true | (Tok.STARTH2(_), _, strm') => true | (Tok.STARTH3(_), _, strm') => true | (Tok.STARTH4(_), _, strm') => true | (Tok.STARTH5(_), _, strm') => true | (Tok.STARTH6(_), _, strm') => true | (Tok.STARTHR(_), _, strm') => true | (Tok.STARTINS(_), _, strm') => true | (Tok.STARTISINDEX(_), _, strm') => true | (Tok.STARTMENU(_), _, strm') => true | (Tok.STARTNOSCRIPT(_), _, strm') => true | (Tok.STARTOL(_), _, strm') => true | (Tok.STARTP(_), _, strm') => true | (Tok.STARTPRE(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTTABLE(_), _, strm') => true | (Tok.STARTUL(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.closure(body_rest_PROD_1_SUBRULE_1_PRED, body_rest_PROD_1_SUBRULE_1_NT, strm) fun body_rest_PROD_1_SUBRULE_2_NT (strm) = let val (ENDBODY_RES, ENDBODY_SPAN, strm') = matchENDBODY(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDBODY_SPAN), #2(cdata_opt_SPAN)) in (UserCode.body_rest_PROD_1_SUBRULE_2_PROD_1_ACT (ENDBODY_RES, SR1_RES, cdata_opt_RES, ENDBODY_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun body_rest_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.ENDBODY, _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.optional(body_rest_PROD_1_SUBRULE_2_PRED, body_rest_PROD_1_SUBRULE_2_NT, strm') val FULL_SPAN = (#1(SR1_SPAN), #2(SR2_SPAN)) in (UserCode.body_rest_PROD_1_ACT (SR1_RES, SR2_RES, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun body_NT (strm) = let fun body_PROD_1 (strm) = let val (STARTBODY_RES, STARTBODY_SPAN, strm') = matchSTARTBODY(strm) val (body_rest_RES, body_rest_SPAN, strm') = body_rest_NT(strm') val FULL_SPAN = (#1(STARTBODY_SPAN), #2(body_rest_SPAN)) in (UserCode.body_PROD_1_ACT (STARTBODY_RES, body_rest_RES, STARTBODY_SPAN : (Lex.pos * Lex.pos), body_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun body_PROD_2 (strm) = let val (SR_RES, SR_SPAN, strm') = let fun body_PROD_2_SUBRULE_1_NT (strm) = let fun body_PROD_2_SUBRULE_1_PROD_1 (strm) = let val (block_RES, block_SPAN, strm') = block_NT(strm) val FULL_SPAN = (#1(block_SPAN), #2(block_SPAN)) in ((block_RES), FULL_SPAN, strm') end fun body_PROD_2_SUBRULE_1_PROD_2 (strm) = let val (ins_RES, ins_SPAN, strm') = ins_NT(strm) val FULL_SPAN = (#1(ins_SPAN), #2(ins_SPAN)) in ((ins_RES), FULL_SPAN, strm') end fun body_PROD_2_SUBRULE_1_PROD_3 (strm) = let val (del_RES, del_SPAN, strm') = del_NT(strm) val FULL_SPAN = (#1(del_SPAN), #2(del_SPAN)) in ((del_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTDEL(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_3(strm) | (Tok.STARTADDRESS(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTCENTER(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTDIV(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTDL(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTFIELDSET(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTFORM(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH1(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH2(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH4(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH5(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTH6(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTHR(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTISINDEX(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTMENU(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTP(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTPRE(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTTABLE(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTUL(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_1(strm) | (Tok.STARTINS(_), _, strm') => body_PROD_2_SUBRULE_1_PROD_2(strm) | _ => fail() (* end case *)) end in body_PROD_2_SUBRULE_1_NT(strm) end val (body_rest_RES, body_rest_SPAN, strm') = body_rest_NT(strm') val FULL_SPAN = (#1(SR_SPAN), #2(body_rest_SPAN)) in (UserCode.body_PROD_2_ACT (SR_RES, body_rest_RES, SR_SPAN : (Lex.pos * Lex.pos), body_rest_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTADDRESS(_), _, strm') => body_PROD_2(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => body_PROD_2(strm) | (Tok.STARTCENTER(_), _, strm') => body_PROD_2(strm) | (Tok.STARTDEL(_), _, strm') => body_PROD_2(strm) | (Tok.STARTDIR(_), _, strm') => body_PROD_2(strm) | (Tok.STARTDIV(_), _, strm') => body_PROD_2(strm) | (Tok.STARTDL(_), _, strm') => body_PROD_2(strm) | (Tok.STARTFIELDSET(_), _, strm') => body_PROD_2(strm) | (Tok.STARTFORM(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH1(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH2(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH3(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH4(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH5(_), _, strm') => body_PROD_2(strm) | (Tok.STARTH6(_), _, strm') => body_PROD_2(strm) | (Tok.STARTHR(_), _, strm') => body_PROD_2(strm) | (Tok.STARTINS(_), _, strm') => body_PROD_2(strm) | (Tok.STARTISINDEX(_), _, strm') => body_PROD_2(strm) | (Tok.STARTMENU(_), _, strm') => body_PROD_2(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => body_PROD_2(strm) | (Tok.STARTOL(_), _, strm') => body_PROD_2(strm) | (Tok.STARTP(_), _, strm') => body_PROD_2(strm) | (Tok.STARTPRE(_), _, strm') => body_PROD_2(strm) | (Tok.STARTTABLE(_), _, strm') => body_PROD_2(strm) | (Tok.STARTUL(_), _, strm') => body_PROD_2(strm) | (Tok.STARTBODY(_), _, strm') => body_PROD_1(strm) | _ => fail() (* end case *)) end fun noframes_NT (strm) = let val (STARTNOFRAMES_RES, STARTNOFRAMES_SPAN, strm') = matchSTARTNOFRAMES(strm) val (body_RES, body_SPAN, strm') = body_NT(strm') val (ENDNOFRAMES_RES, ENDNOFRAMES_SPAN, strm') = matchENDNOFRAMES(strm') val FULL_SPAN = (#1(STARTNOFRAMES_SPAN), #2(ENDNOFRAMES_SPAN)) in (UserCode.noframes_PROD_1_ACT (STARTNOFRAMES_RES, ENDNOFRAMES_RES, body_RES, STARTNOFRAMES_SPAN : (Lex.pos * Lex.pos), ENDNOFRAMES_SPAN : (Lex.pos * Lex.pos), body_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun frame_NT (strm) = let val (STARTFRAME_RES, STARTFRAME_SPAN, strm') = matchSTARTFRAME(strm) val FULL_SPAN = (#1(STARTFRAME_SPAN), #2(STARTFRAME_SPAN)) in (UserCode.frame_PROD_1_ACT (STARTFRAME_RES, STARTFRAME_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun frameset_NT (strm) = let val (STARTFRAMESET_RES, STARTFRAMESET_SPAN, strm') = matchSTARTFRAMESET(strm) fun frameset_PROD_1_SUBRULE_1_NT (strm) = let fun frameset_PROD_1_SUBRULE_1_PROD_1 (strm) = let val (frameset_RES, frameset_SPAN, strm') = frameset_NT(strm) val FULL_SPAN = (#1(frameset_SPAN), #2(frameset_SPAN)) in ((frameset_RES), FULL_SPAN, strm') end fun frameset_PROD_1_SUBRULE_1_PROD_2 (strm) = let val (frame_RES, frame_SPAN, strm') = frame_NT(strm) val FULL_SPAN = (#1(frame_SPAN), #2(frame_SPAN)) in ((frame_RES), FULL_SPAN, strm') end fun frameset_PROD_1_SUBRULE_1_PROD_3 (strm) = let val (cdata_RES, cdata_SPAN, strm') = cdata_NT(strm) val FULL_SPAN = (#1(cdata_SPAN), #2(cdata_SPAN)) in ((cdata_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.PCDATA(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.CHAR_REF(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.ENTITY_REF(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_3(strm) | (Tok.STARTFRAMESET(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_1(strm) | (Tok.STARTFRAME(_), _, strm') => frameset_PROD_1_SUBRULE_1_PROD_2(strm) | _ => fail() (* end case *)) end fun frameset_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.COMMENT(_), _, strm') => true | (Tok.PCDATA(_), _, strm') => true | (Tok.CHAR_REF(_), _, strm') => true | (Tok.ENTITY_REF(_), _, strm') => true | (Tok.STARTFRAME(_), _, strm') => true | (Tok.STARTFRAMESET(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.posclos(frameset_PROD_1_SUBRULE_1_PRED, frameset_PROD_1_SUBRULE_1_NT, strm') fun frameset_PROD_1_SUBRULE_2_NT (strm) = let val (noframes_RES, noframes_SPAN, strm') = noframes_NT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(noframes_SPAN), #2(cdata_opt_SPAN)) in (UserCode.frameset_PROD_1_SUBRULE_2_PROD_1_ACT (SR1_RES, cdata_opt_RES, STARTFRAMESET_RES, noframes_RES, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTFRAMESET_SPAN : (Lex.pos * Lex.pos), noframes_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun frameset_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.STARTNOFRAMES(_), _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.optional(frameset_PROD_1_SUBRULE_2_PRED, frameset_PROD_1_SUBRULE_2_NT, strm') val (ENDFRAMESET_RES, ENDFRAMESET_SPAN, strm') = matchENDFRAMESET(strm') val FULL_SPAN = (#1(STARTFRAMESET_SPAN), #2(ENDFRAMESET_SPAN)) in (UserCode.frameset_PROD_1_ACT (SR1_RES, SR2_RES, STARTFRAMESET_RES, ENDFRAMESET_RES, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), STARTFRAMESET_SPAN : (Lex.pos * Lex.pos), ENDFRAMESET_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun link_NT (strm) = let val (STARTLINK_RES, STARTLINK_SPAN, strm') = matchSTARTLINK(strm) val FULL_SPAN = (#1(STARTLINK_SPAN), #2(STARTLINK_SPAN)) in (UserCode.link_PROD_1_ACT (STARTLINK_RES, STARTLINK_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun meta_NT (strm) = let val (STARTMETA_RES, STARTMETA_SPAN, strm') = matchSTARTMETA(strm) val FULL_SPAN = (#1(STARTMETA_SPAN), #2(STARTMETA_SPAN)) in (UserCode.meta_PROD_1_ACT (STARTMETA_RES, STARTMETA_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun style_NT (strm) = let val (STARTSTYLE_RES, STARTSTYLE_SPAN, strm') = matchSTARTSTYLE(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val (ENDSTYLE_RES, ENDSTYLE_SPAN, strm') = matchENDSTYLE(strm') val FULL_SPAN = (#1(STARTSTYLE_SPAN), #2(ENDSTYLE_SPAN)) in (UserCode.style_PROD_1_ACT (cdata_opt_RES, STARTSTYLE_RES, ENDSTYLE_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTSTYLE_SPAN : (Lex.pos * Lex.pos), ENDSTYLE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun base_NT (strm) = let val (STARTBASE_RES, STARTBASE_SPAN, strm') = matchSTARTBASE(strm) val FULL_SPAN = (#1(STARTBASE_SPAN), #2(STARTBASE_SPAN)) in (UserCode.base_PROD_1_ACT (STARTBASE_RES, STARTBASE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun title_NT (strm) = let val (STARTTITLE_RES, STARTTITLE_SPAN, strm') = matchSTARTTITLE(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val (ENDTITLE_RES, ENDTITLE_SPAN, strm') = matchENDTITLE(strm') val FULL_SPAN = (#1(STARTTITLE_SPAN), #2(ENDTITLE_SPAN)) in (UserCode.title_PROD_1_ACT (STARTTITLE_RES, cdata_opt_RES, ENDTITLE_RES, STARTTITLE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDTITLE_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun head_content_NT (strm) = let fun head_content_PROD_1 (strm) = let val (title_RES, title_SPAN, strm') = title_NT(strm) val FULL_SPAN = (#1(title_SPAN), #2(title_SPAN)) in ((title_RES), FULL_SPAN, strm') end fun head_content_PROD_2 (strm) = let val (base_RES, base_SPAN, strm') = base_NT(strm) val FULL_SPAN = (#1(base_SPAN), #2(base_SPAN)) in ((base_RES), FULL_SPAN, strm') end fun head_content_PROD_3 (strm) = let val (script_RES, script_SPAN, strm') = script_NT(strm) val FULL_SPAN = (#1(script_SPAN), #2(script_SPAN)) in ((script_RES), FULL_SPAN, strm') end fun head_content_PROD_4 (strm) = let val (style_RES, style_SPAN, strm') = style_NT(strm) val FULL_SPAN = (#1(style_SPAN), #2(style_SPAN)) in ((style_RES), FULL_SPAN, strm') end fun head_content_PROD_5 (strm) = let val (meta_RES, meta_SPAN, strm') = meta_NT(strm) val FULL_SPAN = (#1(meta_SPAN), #2(meta_SPAN)) in ((meta_RES), FULL_SPAN, strm') end fun head_content_PROD_6 (strm) = let val (link_RES, link_SPAN, strm') = link_NT(strm) val FULL_SPAN = (#1(link_SPAN), #2(link_SPAN)) in ((link_RES), FULL_SPAN, strm') end fun head_content_PROD_7 (strm) = let val (object_RES, object_SPAN, strm') = object_NT(strm) val FULL_SPAN = (#1(object_SPAN), #2(object_SPAN)) in ((object_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTOBJECT(_), _, strm') => head_content_PROD_7(strm) | (Tok.STARTMETA(_), _, strm') => head_content_PROD_5(strm) | (Tok.STARTSCRIPT(_), _, strm') => head_content_PROD_3(strm) | (Tok.STARTTITLE(_), _, strm') => head_content_PROD_1(strm) | (Tok.STARTBASE(_), _, strm') => head_content_PROD_2(strm) | (Tok.STARTSTYLE(_), _, strm') => head_content_PROD_4(strm) | (Tok.STARTLINK(_), _, strm') => head_content_PROD_6(strm) | _ => fail() (* end case *)) end fun head_NT (strm) = let fun head_PROD_1_SUBRULE_1_NT (strm) = let val (STARTHEAD_RES, STARTHEAD_SPAN, strm') = matchSTARTHEAD(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(STARTHEAD_SPAN), #2(cdata_opt_SPAN)) in (UserCode.head_PROD_1_SUBRULE_1_PROD_1_ACT (cdata_opt_RES, STARTHEAD_RES, cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTHEAD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun head_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.STARTHEAD(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.optional(head_PROD_1_SUBRULE_1_PRED, head_PROD_1_SUBRULE_1_NT, strm) fun head_PROD_1_SUBRULE_2_NT (strm) = let val (head_content_RES, head_content_SPAN, strm') = head_content_NT(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(head_content_SPAN), #2(cdata_opt_SPAN)) in (UserCode.head_PROD_1_SUBRULE_2_PROD_1_ACT (SR1_RES, cdata_opt_RES, head_content_RES, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), head_content_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun head_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.STARTBASE(_), _, strm') => true | (Tok.STARTLINK(_), _, strm') => true | (Tok.STARTMETA(_), _, strm') => true | (Tok.STARTOBJECT(_), _, strm') => true | (Tok.STARTSCRIPT(_), _, strm') => true | (Tok.STARTSTYLE(_), _, strm') => true | (Tok.STARTTITLE(_), _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.closure(head_PROD_1_SUBRULE_2_PRED, head_PROD_1_SUBRULE_2_NT, strm') fun head_PROD_1_SUBRULE_3_NT (strm) = let val (ENDHEAD_RES, ENDHEAD_SPAN, strm') = matchENDHEAD(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDHEAD_SPAN), #2(cdata_opt_SPAN)) in (UserCode.head_PROD_1_SUBRULE_3_PROD_1_ACT (SR1_RES, SR2_RES, cdata_opt_RES, ENDHEAD_RES, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDHEAD_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun head_PROD_1_SUBRULE_3_PRED (strm) = (case (lex(strm)) of (Tok.ENDHEAD, _, strm') => true | _ => false (* end case *)) val (SR3_RES, SR3_SPAN, strm') = EBNF.optional(head_PROD_1_SUBRULE_3_PRED, head_PROD_1_SUBRULE_3_NT, strm') val FULL_SPAN = (#1(SR1_SPAN), #2(SR3_SPAN)) in (UserCode.head_PROD_1_ACT (SR1_RES, SR2_RES, SR3_RES, SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun document_NT (strm) = let val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm) fun document_PROD_1_SUBRULE_1_NT (strm) = let val (DOCTYPE_RES, DOCTYPE_SPAN, strm') = matchDOCTYPE(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(DOCTYPE_SPAN), #2(cdata_opt_SPAN)) in (UserCode.document_PROD_1_SUBRULE_1_PROD_1_ACT (DOCTYPE_RES, cdata_opt_RES, DOCTYPE_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun document_PROD_1_SUBRULE_1_PRED (strm) = (case (lex(strm)) of (Tok.DOCTYPE(_), _, strm') => true | _ => false (* end case *)) val (SR1_RES, SR1_SPAN, strm') = EBNF.optional(document_PROD_1_SUBRULE_1_PRED, document_PROD_1_SUBRULE_1_NT, strm') fun document_PROD_1_SUBRULE_2_NT (strm) = let val (STARTHTML_RES, STARTHTML_SPAN, strm') = matchSTARTHTML(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(STARTHTML_SPAN), #2(cdata_opt_SPAN)) in (UserCode.document_PROD_1_SUBRULE_2_PROD_1_ACT (SR1_RES, cdata_opt_RES, STARTHTML_RES, SR1_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), STARTHTML_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun document_PROD_1_SUBRULE_2_PRED (strm) = (case (lex(strm)) of (Tok.STARTHTML(_), _, strm') => true | _ => false (* end case *)) val (SR2_RES, SR2_SPAN, strm') = EBNF.optional(document_PROD_1_SUBRULE_2_PRED, document_PROD_1_SUBRULE_2_NT, strm') val (head_RES, head_SPAN, strm') = head_NT(strm') val (SR3_RES, SR3_SPAN, strm') = let fun document_PROD_1_SUBRULE_3_NT (strm) = let fun document_PROD_1_SUBRULE_3_PROD_1 (strm) = let val (body_RES, body_SPAN, strm') = body_NT(strm) val FULL_SPAN = (#1(body_SPAN), #2(body_SPAN)) in ((body_RES), FULL_SPAN, strm') end fun document_PROD_1_SUBRULE_3_PROD_2 (strm) = let val (frameset_RES, frameset_SPAN, strm') = frameset_NT(strm) val FULL_SPAN = (#1(frameset_SPAN), #2(frameset_SPAN)) in ((frameset_RES), FULL_SPAN, strm') end in (case (lex(strm)) of (Tok.STARTFRAMESET(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_2(strm) | (Tok.STARTADDRESS(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTBLOCKQUOTE(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTBODY(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTCENTER(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTDEL(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTDIR(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTDIV(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTDL(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTFIELDSET(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTFORM(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH1(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH2(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH3(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH4(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH5(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTH6(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTHR(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTINS(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTISINDEX(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTMENU(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTNOSCRIPT(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTOL(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTP(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTPRE(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTTABLE(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | (Tok.STARTUL(_), _, strm') => document_PROD_1_SUBRULE_3_PROD_1(strm) | _ => fail() (* end case *)) end in document_PROD_1_SUBRULE_3_NT(strm') end fun document_PROD_1_SUBRULE_4_NT (strm) = let val (ENDHTML_RES, ENDHTML_SPAN, strm') = matchENDHTML(strm) val (cdata_opt_RES, cdata_opt_SPAN, strm') = cdata_opt_NT(strm') val FULL_SPAN = (#1(ENDHTML_SPAN), #2(cdata_opt_SPAN)) in (UserCode.document_PROD_1_SUBRULE_4_PROD_1_ACT (head_RES, SR1_RES, SR2_RES, SR3_RES, cdata_opt_RES, ENDHTML_RES, head_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), ENDHTML_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end fun document_PROD_1_SUBRULE_4_PRED (strm) = (case (lex(strm)) of (Tok.ENDHTML, _, strm') => true | _ => false (* end case *)) val (SR4_RES, SR4_SPAN, strm') = EBNF.optional(document_PROD_1_SUBRULE_4_PRED, document_PROD_1_SUBRULE_4_NT, strm') val FULL_SPAN = (#1(cdata_opt_SPAN), #2(SR4_SPAN)) in (UserCode.document_PROD_1_ACT (head_RES, SR1_RES, SR2_RES, SR3_RES, SR4_RES, cdata_opt_RES, head_SPAN : (Lex.pos * Lex.pos), SR1_SPAN : (Lex.pos * Lex.pos), SR2_SPAN : (Lex.pos * Lex.pos), SR3_SPAN : (Lex.pos * Lex.pos), SR4_SPAN : (Lex.pos * Lex.pos), cdata_opt_SPAN : (Lex.pos * Lex.pos), FULL_SPAN : (Lex.pos * Lex.pos)), FULL_SPAN, strm') end in (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) end val document_NT = fn s => unwrap (Err.launch (eh, lexFn, document_NT , true) s) val block_NT = fn s => unwrap (Err.launch (eh, lexFn, block_NT , false) s) val cdata_opt_NT = fn s => unwrap (Err.launch (eh, lexFn, cdata_opt_NT , false) s) val inline_NT = fn s => unwrap (Err.launch (eh, lexFn, inline_NT , false) s) val body_NT = fn s => unwrap (Err.launch (eh, lexFn, body_NT , false) s) val flow_NT = fn s => unwrap (Err.launch (eh, lexFn, flow_NT , false) s) in (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) end in fun parse lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in document_NT s end fun parseblock lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in block_NT s end fun parsecdata_opt lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in cdata_opt_NT s end fun parseinline lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in inline_NT s end fun parsebody lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in body_NT s end fun parseflow lexFn s = let val (document_NT, block_NT, cdata_opt_NT, inline_NT, body_NT, flow_NT) = mk lexFn in flow_NT s end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/HTML4/html4.l000066400000000000000000000044401416264345000224110ustar00rootroot00000000000000(* html4.l * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) %name HTML4Lexer; %defs ( open HTML4TokenUtils fun eof() = EOF type lex_result = token val buffer = ref ([] : string list) fun addStr s = (buffer := s :: !buffer) fun getStr () = (String.concat(List.rev(!buffer)) before (buffer := [])) (* trim an optional ";" from a non-empty substring *) fun trimSemi ss = if Substring.sub(ss, Substring.size ss - 1) = #";" then Substring.trimr 1 ss else ss val scanInt = #1 o valOf o IntInf.scan StringCvt.DEC Substring.getc val scanHex = #1 o valOf o IntInf.scan StringCvt.HEX Substring.getc ); %states INITIAL, INTAG, COM1, COM2; %let alpha=[A-Za-z]; %let digit=[0-9]; %let hexdigit=[0-9a-fA-F]; %let namechar=[-.A-Za-z0-9.]; %let tag={alpha}{namechar}*; %let ws=[\ \t]; %let nonct=[^>]+; (* Open tags *) "<"{tag} => (addStr yytext; YYBEGIN INTAG; continue()); ">" => (addStr yytext; YYBEGIN INITIAL; mkOpenTag(getStr())); {nonct} => (addStr yytext; continue()); (* Close tags *) "" => (mkCloseTag yytext); (* Comments *) " "; prI d; pr "\n") | (Move (i,SOME c,d)) => (pr " "; prI i; pr " --"; prC c; pr "--> "; prI d; pr "\n")) moves end fun nullAccept n = Nfa {states=iList [0,1], moves=M.add (M.empty, Move (0,NONE,1)), accepting=I2.singleton (1,n)} fun nullRefuse n = Nfa {states=iList [0,1], moves=M.empty, accepting=I2.singleton (1,n)} fun renumber n st = n + st fun renumberMove n (Move (s,c,s')) = Move (renumber n s, c, renumber n s') fun renumberAcc n (st,n') = (n+st,n') fun build' n (S.Group e) = build' n e | build' n (S.Alt l) = foldr (fn (Nfa {states=s1, moves=m1,...}, Nfa {states=s2, moves=m2,...}) => let val k1 = I.numItems s1 val k2 = I.numItems s2 val s1' = I.map (renumber 1) s1 val s2' = I.map (renumber (k1+1)) s2 val m1' = M.map (renumberMove 1) m1 val m2' = M.map (renumberMove (k1+1)) m2 in Nfa {states=I.addList (I.union (s1',s2'), [0,k1+k2+1]), moves=M.addList (M.union (m1',m2'), [Move (0,NONE,1), Move (0,NONE,k1+1), Move (k1,NONE,k1+k2+1), Move (k1+k2,NONE,k1+k2+1)]), accepting=I2.singleton (k1+k2+1,n)} end) (nullRefuse n) (map (build' n) l) | build' n (S.Concat l) = foldr (fn (Nfa {states=s1,moves=m1,...}, Nfa {states=s2,moves=m2,accepting}) => let val k = I.numItems s1 - 1 val s2' = I.map (renumber k) s2 val m2' = M.map (renumberMove k) m2 val accepting' = I2.map (renumberAcc k) accepting in Nfa {states=I.union (s1,s2'), moves=M.union (m1,m2'), accepting=accepting'} end) (nullAccept n) (map (build' n) l) | build' n (S.Interval(e, 0, SOME 1)) = build' n (S.Alt [S.Concat [], e]) | build' n (S.Interval(e, 0, NONE)) = build' n (S.Alt [S.Concat [], S.posClosure e]) | build' n (S.Interval(e, 1, NONE)) = let val (Nfa {states,moves,...}) = build' n e val m = I.numItems states in Nfa { states=I.add (states,m), moves=M.addList (moves, [Move (m-1,NONE,m), Move (m-1,NONE,0)]), accepting=I2.singleton (m,n) } end | build' n (S.Interval(e, n1, n2)) = raise SyntaxNotHandled | build' n (S.MatchSet s) = if (S.CharSet.isEmpty s) then nullAccept (n) else let val moves = S.CharSet.foldl (fn (c,moveSet) => M.add (moveSet,Move (0,SOME c,1))) M.empty s in Nfa {states=iList [0,1], moves=moves, accepting=I2.singleton (1,n)} end | build' n (S.NonmatchSet s) = let val moves = S.CharSet.foldl (fn (c,moveSet) => M.add (moveSet,Move (0,SOME c,1))) M.empty (S.CharSet.difference (S.allChars,s)) in Nfa {states=iList [0,1], moves=moves, accepting=I2.singleton (1,n)} end | build' n (S.Char c) = Nfa {states=iList [0,1], moves=M.singleton (Move (0,SOME c,1)), accepting=I2.singleton (1,n)} | build' n (S.Begin) = raise SyntaxNotHandled | build' n (S.End) = raise SyntaxNotHandled fun build (r,n) = let val (Nfa {states,moves,accepting}) = build' n r (* Clean up the nfa to remove epsilon moves. * A simple way to do this: * 1. states={0}, moves={} * 2. for every s in states, * 3. compute closure(s) * 4. for any move (i,c,o) with i in closure (s) * 5. add move (0,c,o) to moves * 6. add state o to states * 7. repeat until no modifications to states and moves *) in Nfa {states=states, moves=moves, accepting=accepting} end fun buildPattern rs = let fun loop ([],_) = [] | loop (r::rs,n) = (build (r,n))::(loop (rs,n+1)) val rs' = loop (rs,0) val renums = foldr (fn (Nfa {states,...},acc) => 1::(map (fn k=>k+I.numItems states) acc)) [] rs' val news = ListPair.map (fn (Nfa {states,moves,accepting},renum) => let val newStates=I.map (renumber renum) states val newMoves=M.map (renumberMove renum) moves val newAcc=I2.map (renumberAcc renum) accepting in Nfa{states=newStates, moves=newMoves, accepting=newAcc} end) (rs',renums) val (states,moves,accepting) = foldl (fn (Nfa{states,moves,accepting},(accS,accM,accA))=> (I.union (states,accS), M.union (moves,accM), I2.union (accepting,accA))) (I.singleton 0, M.addList (M.empty, map (fn k => Move (0,NONE,k)) renums), I2.empty) news in Nfa {states=states,moves=moves,accepting=accepting} end fun accepting (Nfa {accepting,...}) state = let val item = I2.find (fn (i,_) => (i=state)) accepting in case item of NONE => NONE | SOME (s,n) => SOME (n) end (* Compute possible next states from orig with character c *) fun oneMove (Nfa {moves,...}) (orig,char) = M.foldr (fn (Move (_,NONE,_),set) => set | (Move (or,SOME c,d),set) => if (c=char) andalso (or=orig) then I.add (set,d) else set) I.empty moves fun closure (Nfa {moves,...}) origSet = let fun addState (Move (orig,NONE,dest),(b,states)) = if (I.member (states,orig) andalso not (I.member (states,dest))) then (true,I.add (states,dest)) else (b,states) | addState (_,bs) = bs fun loop (states) = let val (modified,new) = M.foldr addState (false,states) moves in if modified then loop (new) else new end in loop (origSet) end fun move nfa = let val closure = closure nfa val oneMove = oneMove nfa in closure o oneMove end fun start nfa = closure nfa (I.singleton 0) fun chars (Nfa{moves,...}) state = let fun f (Move(s1, SOME c, s2), s) = if (s1 = state) then C.add(s, c) else s | f (_, s) = s in C.listItems (M.foldl f C.empty moves) end end signature DFA = sig exception SyntaxNotHandled type dfa val build : RegExpSyntax.syntax -> dfa val buildPattern : RegExpSyntax.syntax list -> dfa val move : dfa -> int * char -> int option val accepting : dfa -> int -> int option val canStart : dfa -> char -> bool end structure Dfa : DFA = struct exception SyntaxNotHandled datatype move = Move of int * char option * int fun compareCharOption (NONE,NONE) = EQUAL | compareCharOption (NONE,SOME (c)) = LESS | compareCharOption (SOME(c),NONE) = GREATER | compareCharOption (SOME(c),SOME(c')) = Char.compare (c,c') structure N = Nfa structure IntSet = N.IntSet structure IntSetSet = ListSetFn (struct type ord_key = IntSet.set val compare = IntSet.compare end) structure Int2Set = ListSetFn (struct type ord_key = int * int fun compare ((i1,i2),(j1,j2)) = case (Int.compare (i1,j1)) of EQUAL => Int.compare (i2,j2) | v => v end) structure MoveSet = ListSetFn (struct type ord_key = move fun compare (Move (i,c,j),Move (i',c',j')) = (case (Int.compare (i,i')) of EQUAL => (case (compareCharOption (c,c')) of EQUAL => Int.compare (j,j') | v => v) | v => v) end) structure CharSet = ListSetFn (struct type ord_key = char val compare = Char.compare end) structure IS = IntSetSet structure I = IntSet structure I2 = Int2Set structure M = MoveSet structure C = CharSet structure A2 = Array2 structure A = Array structure Map = ListMapFn (struct type ord_key = IntSet.set val compare = IntSet.compare end) (* create sets from lists *) fun iList l = I.addList (I.empty,l) fun mList l = M.addList (M.empty,l) datatype dfa = Dfa of {states : I.set, moves : M.set, accepting : I2.set, table : int option A2.array, accTable : (int option) A.array, startTable : bool A.array} fun print (Dfa {states,moves,accepting,...}) = let val pr = TextIO.print val prI = TextIO.print o Int.toString val prI2 = TextIO.print o (fn (i1,i2) => Int.toString i1) val prC = TextIO.print o Char.toString in pr ("States: 0 -> "); prI (I.numItems (states)-1); pr "\nAccepting:"; I2.app (fn k => (pr " "; prI2 k)) accepting; pr "\nMoves\n"; M.app (fn (Move (i,NONE,d)) => (pr " "; prI i; pr " --@--> "; prI d; pr "\n") | (Move (i,SOME c,d)) => (pr " "; prI i; pr " --"; prC c; pr "--> "; prI d; pr "\n")) moves end fun move' moves (i,c) = (case (M.find (fn (Move (s1,SOME c',s2)) => (s1=i andalso c=c')) moves) of NONE => NONE | SOME (Move (s1,SOME c',s2)) => SOME s2) (* fun move (Dfa {moves,...}) (i,c) = move' moves (i,c) *) fun move (Dfa {table,...}) (i,c) = A2.sub (table,i,ord(c)-ord(Char.minChar)) fun accepting' accepting i = I2.foldr (fn ((s,n),NONE) => if (s=i) then SOME(n) else NONE | ((s,n),SOME(n')) => if (s=i) then SOME(n) else SOME(n')) NONE accepting (* fun accepting (Dfa {accepting,...}) i = accepting' accepting i *) fun accepting (Dfa {accTable,...}) i = A.sub (accTable,i) fun canStart (Dfa {startTable,...}) c = A.sub (startTable,ord(c)) fun build' nfa = let val move = N.move nfa val accepting = N.accepting nfa val start = N.start nfa val chars = N.chars nfa fun getAllChars (ps) = I.foldl (fn (s,cs) => C.addList (cs,chars s)) C.empty ps val initChars = getAllChars (start) fun getAllStates (ps,c) = I.foldl (fn (s,ss) => I.union (ss,move (s,c))) I.empty ps fun loop ([],set,moves) = (set,moves) | loop (x::xs,set,moves) = let val cl = getAllChars (x) val (nstack,sdu,ml) = C.foldl (fn (c,(ns,sd,ml)) => let val u = getAllStates (x,c) in if (not (IS.member (set,u)) andalso (not (IS.member (sd,u)))) then (u::ns, IS.add (sd,u), (x,c,u)::ml) else (ns,sd,(x,c,u)::ml) end) ([],IS.empty,[]) cl in loop (nstack@xs,IS.union(set,sdu),ml@moves) end val (sSet,mList) = loop ([start],IS.singleton (start), []) val num = ref 1 fun new () = let val n = !num in num := n+1 ; n end val sMap = Map.insert (Map.empty, start, 0) val sSet' = IS.delete (sSet,start) val sMap = IS.foldl (fn (is,map) => Map.insert (map,is,new ())) sMap sSet' val states = I.addList (I.empty,List.tabulate(!num,fn x => x)) val moves = M.addList (M.empty, map (fn (is1,c,is2) => Move (valOf (Map.find (sMap,is1)), SOME c, valOf (Map.find (sMap,is2)))) mList) (* Given a set of accepting states, look for a given state, * with the minimal corresponding pattern number *) fun minPattern accSet = let val l = map (valOf o accepting) (I.listItems accSet) fun loop ([],min) = min | loop (n::ns,min) = if (n let val items = I.filter (fn k => case (accepting k) of SOME _ => true | NONE => false) is in if (I.isEmpty items) then cis else I2.add (cis,(valOf (Map.find (sMap,is)), minPattern items)) end) I2.empty sSet val table = A2.tabulate A2.RowMajor (!num, ord(Char.maxChar)-ord(Char.minChar)+1, fn (s,c) => move' moves (s,chr(c+ord(Char.minChar)))) val accTable = A.tabulate (!num, fn (s) => accepting' accept s) val startTable = A.tabulate (ord(Char.maxChar)- ord(Char.minChar)+1, fn (c) => C.member (initChars, chr(c+ord(Char.minChar)))) in Dfa {states=states,moves=moves,accepting=accept, table=table,accTable=accTable,startTable=startTable} end fun build r = build' (N.build (r,0)) fun buildPattern rs = build' (N.buildPattern rs) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/BackEnd/thompson-engine.sml000066400000000000000000000231221416264345000266620ustar00rootroot00000000000000(* thompson-engine.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This is an implementation of Ken Thompson's RE matchine algorithm from * CACM (1968). It is based on the description of the algorithm by Russ * Cox at http://swtch.com/~rsc/regexp/regexp1.html. *) structure ThompsonEngine : REGEXP_ENGINE = struct structure RE = RegExpSyntax structure CSet = RE.CharSet structure M = MatchTree (* a match specifies the position (as a stream) and the length of the match *) type 'a match = {pos : 'a, len : int} MatchTree.match_tree (* intermediate representation of states *) datatype state_kind = CHR' of (char * state' ref) | CSET' of (CSet.set * state' ref) | NCSET' of (CSet.set * state' ref) | SPLIT' of (state' ref * state' ref) | BOL' of state' ref (* assert beginning of line *) | EOL' of state' ref (* assert end of line *) | FINAL' withtype state' = {id : int, kind : state_kind} type frag = {start : state', out : state' ref list} (* return the ID of a state *) fun idOf {id, kind} = id val final = {id = 0, kind = FINAL'} (* interpreter representation of states *) datatype state = CHR of (char * int) | CSET of (CSet.set * int) | NCSET of (CSet.set * int) | SPLIT of (int * int) | BOL of int (* assert beginning of line *) | EOL of int (* assert end of line *) | FINAL fun cvtState {id, kind} = (case kind of CHR'(c, out) => CHR(c, idOf(!out)) | CSET'(cset, out) => CSET(cset, idOf(!out)) | NCSET'(cset, out) => NCSET(cset, idOf(!out)) | SPLIT'(out1, out2) => SPLIT(idOf(!out1), idOf(!out2)) | BOL' out => BOL(idOf(!out)) | EOL' out => EOL(idOf(!out)) | FINAL' => FINAL (* end case *)) datatype regexp = RE of {start : int, states : state vector} fun compile re = let (* the list of states; state 0 is always the accepting state *) val nStates = ref 1 val states = ref [final] (* create new states *) fun new kind = let val id = !nStates val s = {id = id, kind = kind} in states := s :: !states; nStates := id+1; s end fun newChr (c, out) = new (CHR'(c, out)) fun newCset (cset, out) = new (CSET'(cset, out)) fun newNcset (cset, out) = new (NCSET'(cset, out)) fun newSplit (out1, out2) = new (SPLIT'(out1, out2)) fun newBOL out = new (BOL' out) fun newEOL out = new (EOL' out) (* update the outputs of a fragment *) fun setOuts (f : frag, s : state') = List.app (fn r => r := s) (#out f) (* compile an RE *) fun reComp re = (case re of RE.Group re => reComp re | RE.Alt[] => raise RE.CannotCompile | RE.Alt[re] => reComp re | RE.Alt(re::rest) => let val f1 = reComp re val f2 = reComp (RE.Alt rest) val s = newSplit(ref(#start f1), ref(#start f2)) in {start = s, out = #out f1 @ #out f2} end | RE.Concat[] => raise RE.CannotCompile | RE.Concat[re] => reComp re | RE.Concat(re::rest) => cat (re, RE.Concat rest) | RE.Interval(re, 0, SOME 1) => option re | RE.Interval(re, 0, NONE) => closure re | RE.Interval(re, 1, NONE) => posClosure re | RE.Interval _ => raise RE.CannotCompile | RE.MatchSet cset => let val out = ref final in {start = newCset(cset, out), out = [out]} end | RE.NonmatchSet cset => let val out = ref final in {start = newNcset(cset, out), out = [out]} end | RE.Char c => let val out = ref final in {start = newChr(c, out), out = [out]} end | RE.Begin => let val out = ref final in {start = newBOL out, out = [out]} end | RE.End => raise RE.CannotCompile (* end case *)) (* compile re1 . re2 *) and cat (re1, re2) = let val f1 = reComp re1 val f2 = reComp re2 in setOuts (f1, #start f2); {start = #start f1, out = #out f2} end (* compile re? *) and option re = let val f = reComp re val out = ref final val s = newSplit(ref(#start f), out) in {start = s, out = out :: #out f} end (* compile re* *) and closure re = let val f = reComp re val out = ref final val s = newSplit(ref(#start f), out) in setOuts (f, s); {start = s, out = [out]} end (* compile re+ *) and posClosure re = let val f = reComp re val out = ref final val s = newSplit(ref(#start f), out) in setOuts (f, s); {start = #start f, out = [out]} end (* generate the intermediate state representation *) val frag = reComp re val _ = setOuts (frag, final) (* convert the states to the final representation; note that we reverse the list * so that the states are now in increasing order. *) val states = List.foldl (fn (s, l) => cvtState s :: l) [] (!states) in RE{ start = idOf(#start frag), states = Vector.fromList states } end (* +DEBUG *) fun stateToString (CHR(c, out)) = concat["CHR (#\"", Char.toString c, "\", ", Int.toString out, ")"] | stateToString (CSET(cs, out)) = concat["CSET (-, ", Int.toString out, ")"] | stateToString (NCSET(cs, out)) = concat["NCSET (-, ", Int.toString out, ")"] | stateToString (SPLIT(out1, out2)) = concat["SPLIT (", Int.toString out1, ", ", Int.toString out2, ")"] | stateToString (BOL out) = concat["BOL ", Int.toString out] | stateToString (EOL out) = concat["EOL ", Int.toString out] | stateToString FINAL = "FINAL" fun dump (RE{start, states}) = let fun prState st = print(stateToString st) in print(concat["start = ", Int.toString start, "\n"]); Vector.appi (fn (i, st) => (print(Int.toString i ^ ": "); prState st; print "\n")) states end (* -DEBUG *) (* scan the stream for the first occurrence of the regular expression *) fun scan (RE{start, states}, getc : (char,'a) StringCvt.reader) = let (*val _ = dump (RE{start=start, states=states})*) (* to make elimination of duplicates in a state set cheap, we map state IDs * to a stamp of the last set that they were added to. *) val stamp = ref 0w1 val lastStamp = Array.array(Vector.length states, 0w0) fun addState (stamp', stateList, id) = if (Array.sub(lastStamp, id) = stamp') then stateList else ( Array.update(lastStamp, id, stamp'); case Vector.sub(states, id) of SPLIT(out1, out2) => addState (stamp', addState (stamp', stateList, out1), out2) | state => state :: stateList (* end case *)) fun startState () = let val stamp' = !stamp in stamp := stamp' + 0w1; addState (stamp', [], start) end fun isMatch stamp' = (Array.sub(lastStamp, 0) = stamp') (* attempt to match the RE starting with the stream startPos *) fun find' (isFirst, startPos) = let fun scan (_, _, _, lastAccepting, []) = lastAccepting | scan (isFirst, n, strm, lastAccepting, nfaState) = (case getc strm of NONE => if isMatch (!stamp) then SOME(n, startPos) else lastAccepting | SOME(c, strm') => let val stamp' = !stamp val _ = (stamp := stamp' + 0w1) fun test ([], nextStates) = nextStates | test (s::r, nextStates) = let fun continue nextStates = test(r, nextStates) fun add out = continue(addState (stamp', nextStates, out)) in case s of CHR(c', out) => if (c = c') then add out else continue nextStates | CSET(cset, out) => if CSet.member(cset, c) then add out else continue nextStates | NCSET(cset, out) => if CSet.member(cset, c) then continue nextStates else add out | BOL out => if isFirst then test(Vector.sub(states, out)::r, nextStates) else continue nextStates | EOL out => raise Fail "end-of-line not supported yet" | _ => continue nextStates (* end case *) end val nextNfaState = test (nfaState, []) val lastAccepting = if isMatch stamp' then SOME(n+1, startPos) else lastAccepting in (* print(concat[ "{", String.concatWith "," (List.map stateToString nfaState), "} -- ", "#\"", Char.toString c, "\" --> {", String.concatWith "," (List.map stateToString nextNfaState), "}\n"]); *) scan ((c = #"\n"), n+1, strm', lastAccepting, nextNfaState) end (* end case *)) in case scan (isFirst, 0, startPos, NONE, startState()) of NONE => NONE | SOME(n, strm) => SOME(M.Match({pos=startPos, len=n}, []), strm) (* end case *) end in find' end fun find re getc stream = let val scan = scan (re, getc) fun loop (isFirst, s) = (case (scan (isFirst, s)) of NONE => (case (getc s) of SOME(#"\n", s') => loop (true, s') | SOME(_, s') => loop (false, s') | NONE => NONE (* end case *)) | SOME v => SOME v (* end case *)) in loop (true, stream) end fun prefix re getc strm = scan (re, getc) (true, strm) fun match [] = (fn getc => fn strm => NONE) | match l = let (* compile the REs *) val l = List.map (fn (re, act) => (compile re, act)) l fun match' getc strm = let (* find the longest SOME *) fun loop ([], max, _) = max | loop ((re, act)::r, max, maxLen) = (case scan(re, getc) (true, strm) of NONE => loop (r, max, maxLen) | SOME(m as MatchTree.Match({len, ...}, _), cs) => if (len > maxLen) then loop (r, SOME(m, act, cs), len) else loop (r, max, maxLen) (* end case *)) in case loop (l, NONE, ~1) of NONE => NONE | SOME(m, act, cs) => SOME(act m, cs) (* end case *) end in match' end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/FrontEnd/000077500000000000000000000000001416264345000232635ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/FrontEnd/awk-syntax.sml000066400000000000000000000174031416264345000261130ustar00rootroot00000000000000(* awk-syntax.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This module implements the AWK syntax for regular expressions. The * syntax is defined on pp. 28-30 of "The AWK Programming Language," * by Aho, Kernighan and Weinberger. We have extended it with interval * syntax, which was added as part of the POSIX standard. * * The meta characters are: * "\" "^" "$" "." "[" "]" "|" "(" ")" "*" "+" "?" * * Atomic REs: * c matches the character c (for non-metacharacters c) * "^" matches the empty string at the beginning of a line * "$" matches the empty string at the end of a line * "." matches any single character (except \000 and \n) * * Escape sequences: * "\b" matches backspace * "\f" matches formfeed * "\n" matches newline (linefeed) * "\r" matches carriage return * "\t" matches tab * "\"ddd matches the character with octal code ddd. * "\"c matches the character c (e.g., \\ for \, \" for ") * "\x"dd matches the character with hex code dd. * * Character classes: * [...] matches any character in "..." * [^...] a complemented character list, which matches any character not * in the list "..." * * Compound regular expressions, where A and B are REs: * A|B matches A or B * AB matches A followed by B * A? matches zero or one As * A* matches zero or more As * A+ matches one or more As * A{n} matches n copies of A * A{n,} matches n copies of A * A{n,m} matches n copies of A * (A) matches A *) structure AwkSyntax : REGEXP_PARSER = struct structure R = RegExpSyntax structure SC = StringCvt structure W8 = Word8 structure C = Char val isMeta = C.contains "\\^$.[]|()*+?" exception Error val dotMatch = R.NonmatchSet (R.CharSet.addList (R.CharSet.empty,explode "\000\n")) fun scan getc cs = let fun getc' cs = (case (getc cs) of NONE => raise Error | (SOME arg) => arg) (* end case *) fun isOctDigit c = (#"0" <= c) andalso (c <= #"7") fun returnVal (v, cl, cs) = let val (n, _) = valOf (Int.scan v List.getItem cl) in (C.chr n, cs) handle _ => raise Error (* SC.scanString (Int.scan SC.OCT) (implode [c1,c2,c3]) *) end fun getDecimal cs = let fun lp (cs, digits) = (case getc cs of NONE => (cs, List.rev digits) | SOME(c, cs') => if (C.isDigit c) then lp(cs', c::digits) else (cs, List.rev digits) (* end case *)) in case lp (cs, []) of (_, []) => raise Error (* no digits *) | (cs, digits) => let val SOME(n, _) = (Int.scan SC.DEC List.getItem digits) in (n, cs) end (* end case *) end fun getHexChar (c,cs) = (case (getc cs) of NONE => returnVal (SC.HEX,[c],cs) | SOME (c',cs') => if not (C.isHexDigit c') then returnVal (SC.HEX,[c],cs) else returnVal (SC.HEX,[c,c'],cs') (* end case *)) fun getOctalChar (c,cs) = (case (getc cs) of NONE => returnVal (SC.OCT,[c],cs) | SOME(c',cs') => if not (isOctDigit c') then returnVal (SC.OCT,[c],cs) else (case (getc cs') of NONE => returnVal (SC.OCT,[c,c'],cs') | SOME (c'',cs'') => if not (isOctDigit c'') then returnVal (SC.OCT,[c,c'],cs') else returnVal (SC.OCT,[c,c',c''],cs''))) fun getEscapeChar cs = (case (getc' cs) of (#"b", cs) => (#"\008", cs) | (#"f", cs) => (#"\012", cs) | (#"n", cs) => (#"\n", cs) | (#"r", cs) => (#"\013", cs) | (#"t", cs) => (#"\t", cs) | (#"x", cs) => let val (c1,cs) = getc' cs in if (C.isHexDigit c1) then getHexChar (c1,cs) else raise Error end | (c1, cs) => if (isOctDigit c1) then getOctalChar (c1,cs) else (c1, cs)) fun scanAlt (stk, cs) = let val (re, cs') = scanSeq([], cs) in case (stk, getc cs') of ([], NONE) => (re, cs') | (_, SOME(#"|", cs'')) => scanAlt(re::stk, cs'') | _ => (R.Alt(rev(re::stk)), cs') (* end case *) end and scanSeq (stk, cs) = let fun continue (re, cs') = scanSeq(re::stk, cs') fun done () = (R.Concat(rev stk), cs) in case (stk, getc cs) of ([], NONE) => raise Error | ([re], NONE) => (re, cs) | (_, NONE) => done() | (re::r, SOME(#"{", cs')) => let val (n, m, cs'') = scanInterval cs' in scanSeq (R.Interval(re, n, m)::r, cs'') end | (re::r, SOME(#"?", cs')) => scanSeq (R.optional re :: r, cs') | (re::r, SOME(#"*", cs')) => scanSeq (R.closure re :: r, cs') | (re::r, SOME(#"+", cs')) => scanSeq (R.posClosure re :: r, cs') | (_, SOME(#"|", _)) => done() | (_, SOME(#")", _)) => done() | (_, SOME(#"(", cs')) => continue(scanGrp cs') | (_, SOME(#".", cs')) => continue(dotMatch, cs') | (_, SOME(#"^", cs')) => continue(R.Begin, cs') | (_, SOME(#"$",cs')) => continue(R.End, cs') | (_, SOME(#"[", cs')) => continue(scanClass cs') | (_, SOME(#"\\", cs')) => continue(scanEscape cs') | (_, SOME(c, cs')) => if (isMeta c) then raise Error else scanSeq((R.Char c)::stk, cs') (* end case *) end (* scan the tail of "{n}", "{n,}", or "{n,m"}", where the leading "{" has already * been scanned. *) and scanInterval cs = let val (n, cs) = getDecimal cs in case getc cs of SOME(#",", cs) => (case getc cs of SOME(#"}", cs) => (n, NONE, cs) | _ => let val (m, cs) = getDecimal cs in case getc cs of SOME(#"}", cs) => (n, SOME m, cs) | _ => raise Error (* end case *) end (* end case *)) | SOME(#"}", cs) => (n, SOME n, cs) | _ => raise Error (* end case *) end and scanGrp cs = let val (re, cs') = scanAlt ([], cs) in case (getc' cs') of (#")", cs'') => (R.Group re, cs'') | _ => raise Error (* end case *) end and scanClass cs = let fun scanClass' cs = let fun scanRange1 (set, cs) = (case (getc' cs) of (#"]", cs) => (set,cs) | (#"\\", cs) => let val (c, cs) = getEscapeChar cs in scanRange2 (set, c, cs) end | (c, cs) => scanRange2 (set, c, cs) (* end case *)) and scanRange2 (set, c, cs) = (case (getc' cs) of (#"]", cs) => (R.CharSet.add(set, c), cs) | (#"\\", cs) => let val (c', cs) = getEscapeChar cs in scanRange2 (R.CharSet.add(set, c), c', cs) end | (#"-", cs) => scanRange3 (set, c, cs) | (c', cs) => scanRange2 (R.CharSet.add(set, c), c', cs) (* end case *)) and scanRange3 (set, minC, cs) = (case (getc' cs) of (#"]", cs) => (R.CharSet.add(R.CharSet.add(set, minC), #"-"), cs) | (#"\\", cs) => let val (c, cs) = getEscapeChar cs in chkRange(set, minC, c, cs) end | (c, cs) => chkRange(set, minC, c, cs) (* end case *)) and chkRange (set, minC, maxC, cs) = if (minC > maxC) then scanRange1 (set,cs ) (*raise Error *) (* as per bwk test suite *) else scanRange1 (R.addRange (set,minC,maxC),cs) (*R.CharSet.addList (set,List.tabulate (ord(maxC)-ord(minC)+1,fn v => chr (v+ord(minC)))), cs) *) in case (getc' cs) of (#"-", cs) => scanRange1(R.CharSet.add(R.CharSet.empty, #"-"), cs) | (#"]", cs) => scanRange2(R.CharSet.empty, #"]", cs) (* as per bwk test suite *) | _ => scanRange1(R.CharSet.empty, cs) (* end case *) end in case (getc' cs) of (#"^", cs) => let val (set, cs) = scanClass' cs in (R.NonmatchSet set, cs) end | _ => let val (set, cs) = scanClass' cs in (R.MatchSet set, cs) end (* end case *) end and scanEscape cs = let val (c, cs) = getEscapeChar cs in (R.Char c, cs) end in SOME(scanAlt([], cs)) handle Error => NONE end end (* AWK_RE_Syntax *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/FrontEnd/parser-sig.sml000066400000000000000000000006071416264345000260570ustar00rootroot00000000000000(* parser-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) signature REGEXP_PARSER = sig val scan : (char, 'a) StringCvt.reader -> (RegExpSyntax.syntax, 'a) StringCvt.reader (* read an external representation of a regular expression * from the stream and return an abstract syntax representation *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/FrontEnd/syntax-sig.sml000066400000000000000000000041611416264345000261100ustar00rootroot00000000000000(* syntax-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This is the abstract syntax tree used to represent regular expressions. * It serves as the glue between different front-ends (implementing * different RE specification languages), and different back-ends (implementing * different compilation/searching algorithms). *) signature REGEXP_SYNTAX = sig exception CannotCompile structure CharSet : ORD_SET where type Key.ord_key = char datatype syntax = Group of syntax | Alt of syntax list | Concat of syntax list | Interval of (syntax * int * int option) | MatchSet of CharSet.set | NonmatchSet of CharSet.set | Char of char | Begin (* Matches beginning of stream *) | End (* Matches end of stream *) (* shorthand for standard RE forms *) val optional : syntax -> syntax (* == Interval(re, 0, SOME 1) *) val closure : syntax -> syntax (* == Interval(re, 0, NONE) *) val posClosure : syntax -> syntax (* == Interval(re, 1, NONE) *) val fromRange : char * char -> CharSet.set val addRange : CharSet.set * char * char -> CharSet.set val allChars : CharSet.set (* POSIX character sets (plus a couple) *) val alnum : CharSet.set (* letters and digits *) val alpha : CharSet.set (* letters *) val ascii : CharSet.set (* 0 <= ord c <= 127 *) val blank : CharSet.set (* #"\t" and space *) val cntl : CharSet.set (* non-printable characters *) val digit : CharSet.set (* decimal digits *) val graph : CharSet.set (* visible characters (does not include space) *) val lower : CharSet.set (* lower-case letters *) val print : CharSet.set (* printable characters (includes space) *) val punct : CharSet.set (* visible characters other than letters and digits *) val space : CharSet.set (* #"\t", #"\r", #"\n", #"\v", #"\f", and space *) val upper : CharSet.set (* upper-case letters *) val word : CharSet.set (* letters, digit, and underscore *) val xdigit : CharSet.set (* hexadecimal digits *) end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/FrontEnd/syntax.sml000066400000000000000000000042051416264345000253270ustar00rootroot00000000000000(* syntax.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This is the abstract syntax tree used to represent regular expressions. * It serves as the glue between different front-ends (implementing * different RE specification languages), and different back-ends (implementing * different compilation/searching algorithms). *) structure RegExpSyntax : REGEXP_SYNTAX = struct exception CannotCompile structure CharSet = ListSetFn ( struct type ord_key = char val compare = Char.compare end) datatype syntax = Group of syntax | Alt of syntax list | Concat of syntax list | Interval of (syntax * int * int option) | MatchSet of CharSet.set | NonmatchSet of CharSet.set | Char of char | Begin | End fun optional re = Interval(re, 0, SOME 1) fun closure re = Interval(re, 0, NONE) fun posClosure re = Interval(re, 1, NONE) fun addRange (s, minC ,maxC) = let val fst = ord minC val lst = ord maxC in CharSet.addList (s, List.tabulate (lst - fst + 1, fn v => chr(v + fst))) end fun fromRange (minC, maxC) = addRange (CharSet.empty, minC, maxC) val allChars = fromRange (Char.minChar, Char.maxChar) val digit = fromRange (#"0", #"9") val lower = fromRange (#"a", #"z") val upper = fromRange (#"A", #"Z") val alpha = CharSet.union(lower, upper) val alnum = CharSet.union(alpha, digit) val ascii = fromRange (#"\000", #"\127") val blank = CharSet.fromList [#" ", #"\t"] val cntl = addRange(CharSet.singleton #"\127", #"\000", #"\031") val graph = fromRange (#"\033", #"\126") val print = CharSet.add (graph, #" ") val punct = CharSet.fromList [ #"]", #"[", #"!", #"\"", #"#", #"$", #"%", #"&", #"'", #"(", #")", #"*", #"+", #",", #".", #"/", #":", #";", #"<", #"=", #">", #"?", #"@", #"\\", #"^", #"_", #"`", #"{", #"|", #"}", #"~", #"-" ] val space = CharSet.fromList [#"\t", #"\r", #"\n", #"\v", #"\f", #" "] val word = CharSet.add(alnum, #"_") val xdigit = addRange (addRange (digit, #"a", #"f"), #"A", #"F") end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Glue/000077500000000000000000000000001416264345000224405ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Glue/match-tree.sml000066400000000000000000000062351416264345000252140ustar00rootroot00000000000000(* match-tree.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Match trees are used to represent the results of matching regular * expressions. *) signature MATCH_TREE = sig (* a match tree is used to represent the results of a nested * grouping of regular expressions. *) datatype 'a match_tree = Match of 'a * 'a match_tree list val root : 'a match_tree -> 'a (* return the root (outermost) match in the tree *) val nth : ('a match_tree * int) -> 'a (* raises Subscript *) (* return the nth match in the tree; matches are labeled in pre-order * starting at 0. *) val map : ('a -> 'b) -> 'a match_tree -> 'b match_tree (* map a function over the tree (in preorder) *) val app : ('a -> unit) -> 'a match_tree -> unit (* apply a given function over ever element of the tree (in preorder) *) val foldl : ('a * 'b -> 'b) -> 'b -> 'a match_tree -> 'b (* fold in left-to-right pre-order *) val foldr : ('a * 'b -> 'b) -> 'b -> 'a match_tree -> 'b (* fold in right-to-left post-order *) val find : ('a -> bool) -> 'a match_tree -> 'a option (* find the first match that satisfies the predicate (or NONE) *) val num : 'a match_tree -> int (* return the number of submatches included in the match tree *) end; structure MatchTree :> MATCH_TREE = struct datatype 'a match_tree = Match of 'a * 'a match_tree list fun num m = let fun count ([], n) = n | count (Match(_, l) :: ms, n) = count (ms, count (l, n + 1)) in count([m], ~1) end (* return the root (outermost) match in the tree *) fun root (Match(x,_)) = x (* return the nth match in the tree; matches are labeled in pre-order * starting at 0. *) fun nth (t, n) = let datatype 'a sum = INL of int | INR of 'a fun walk (0, Match (x, _)) = INR x | walk (i, Match (_, children)) = let fun walkList (i, []) = INL i | walkList (i, m::r) = (case walk(i, m) of (INL j) => walkList (j, r) | result => result (* end case *)) in walkList (i-1, children) end in case walk(n, t) of (INR x) => x | (INL _) => raise Subscript (* end case *) end (* map a function over the tree (in preorder) *) fun map f = let fun mapf (Match (x, children)) = Match(f x, mapl children) and mapl [] = [] | mapl (x::r) = (mapf x) :: (mapl r) in mapf end fun app f (Match (c,children)) = (f c; List.app (app f) children) (* fold in left-to-right pre-order *) fun foldl f init mt = let fun foldf (Match(x, kids), acc) = List.foldl foldf (f (x, acc)) kids in foldf (mt, init) end (* fold in right-to-left post-order *) fun foldr f init mt = let fun foldf (Match(x, kids), acc) = f (x, List.foldr foldf acc kids) in foldf (mt, init) end (* find the first match that satisfies the predicate *) fun find pred = let fun findP (Match (x, children)) = if (pred x) then SOME x else findList children and findList [] = NONE | findList (m::r) = (case (findP m) of NONE => findList r | result => result (* end case *)) in findP end end (* MatchTree *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Glue/regexp-fn.sml000066400000000000000000000022661416264345000250560ustar00rootroot00000000000000(* regexp-fn.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Functor that implements a regular expressions matcher by combining * a surface syntax and a matching engine. *) functor RegExpFn ( structure P : REGEXP_PARSER structure E : REGEXP_ENGINE ) :> REGEXP where type regexp = E.regexp = struct structure M = MatchTree type regexp = E.regexp (* a match specifies the position (as a stream) and the length of the match *) type 'a match = {pos : 'a, len : int} MatchTree.match_tree exception CannotParse fun compile reader s = (case (P.scan reader s) of SOME (syntax, s') => SOME(E.compile syntax, s') | NONE => NONE (* end case *)) fun compileString str = (case (StringCvt.scanString P.scan str) of SOME syntax => E.compile syntax | NONE => raise CannotParse (* end case *)) val prefix = E.prefix val find = E.find fun match l = let fun parse (s, f) = (case (StringCvt.scanString P.scan s) of SOME r => (r, f) | NONE => raise CannotParse (* end case *)) val m = E.match (map parse l) in fn getc => fn stream => m getc stream end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Glue/regexp-sig.sml000066400000000000000000000026201416264345000252270ustar00rootroot00000000000000(* regexp-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Main signature for regular expressions. *) signature REGEXP = sig type regexp (* the type of a compiled regular expression *) (* a match specifies the position (as a stream) and the length of the match *) type 'a match = {pos : 'a, len : int} MatchTree.match_tree exception CannotParse (* raised by compileString and match on syntax errors *) val compile : (char,'a) StringCvt.reader -> (regexp, 'a) StringCvt.reader (* read an external representation of a regular expression from a stream *) val compileString : string -> regexp (* read an external representation of a regular expression from a string *) val find : regexp -> (char,'a) StringCvt.reader -> ('a match, 'a) StringCvt.reader (* scan the stream for the first occurence of the regular expression *) val prefix : regexp -> (char,'a) StringCvt.reader -> ('a match, 'a) StringCvt.reader (* attempt to match the stream at the current position with the * regular expression *) val match : (string * ('a match -> 'b)) list -> (char,'a) StringCvt.reader -> ('b, 'a) StringCvt.reader (* attempt to match the stream at the current position with one * of the external representations of regular expressions and trigger * the corresponding action *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/README000066400000000000000000000065371416264345000224370ustar00rootroot00000000000000This is a regular expressions library. It is based on a decoupling of the surface syntax used to specify regular expressions and the backend engine that implements the matcher. An abstract syntax is used to communicate between the front end and the back end of the system, USING REGULAR EXPRESSIONS Given a structure S1 describing a surface syntax and a structure S2 describing a matching engine, a regular expression package can be defined by applying the functor: RegExpFn (structure P=S1 structure E=S2) : REGEXP To match a regular expression, one first needs to compile a representation in the surface syntax. The type of a compiled regular expression is given in the REGEXP signature as: type regexp Two functions are provided in the REGEXP signature: val compile : (char,'a) StringCvt.reader -> (regexp, 'a) StringCvt.reader val compileString : string -> regexp The function compile is a regexp reader, while compileString is specialized to strings. Once a regular expression has been compiled, three functions are provided to perform the matching: val find : val prefix : [[ See types in Glue/regexp-sig.sml ]] val match : The function find returns a reader that searches a stream and attempts to match the given regular expression. The function prefix returns a reader that attempts to match the regular expression at the current position in the stream. The function match takes a list of regular expressions and functions and returns a reader that attempts to match one of the regular expressions at the current position in the stream. The function corresponding to the matched regular expression is invoked on the matching information. MATCHING INFORMATION Once a match is found, it is returned as a match_tree datatype (defined in Glue/match-tree.sml). This is a hierarchical structure describing the matches of the various subexpressions appearing in the matched regular expression. A match for an expression is a record containing the position of the match and its length. The root of the structure always described the outermost match (the whole string matched by the regular expression). See the file Glue/match-tree.sml for more details. ROADMAP FrontEnd/ Implementation of various surface syntaxes BackEnd/ Implementation of various matching engines Glue/ Glue code Tests/ Testing code FRONT ENDS A single surface syntax is currently implemented, providing an AWK syntax to describe regular expressions. See the file FrontEnd/awk-syntax.sml for a description of the actual syntax. BACK ENDS Three matching engines are implemented: 1) A backtracking engine (BackEnd/bt-engine.sml), that provides full submatching information. Slow, low memory footprint, low startup cost. 2) An automaton-based engine (BackEnd/dfa-engine.sml), that provides only top-level matching information (the string matched). Fast, but memory-intensive and high startup cost (the cost of constructing the automaton in the first place) 3) An implementation of Ken Thompson's RE matching algorithm. This essentially simulates the NFA using sets of states. It provides very fast RE construction time and reasonable scanning time. It currently does not implement groups or begin/end markers. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Tests/000077500000000000000000000000001416264345000226465ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Tests/engines.sml000066400000000000000000000011461416264345000250150ustar00rootroot00000000000000(* engines.sml * * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure ThompsonRE = TestFn ( val engineName = "Thompson's engine" structure RE = RegExpFn( structure P = AwkSyntax structure E = ThompsonEngine)) structure DfaRE = TestFn ( val engineName = "DFA engine" structure RE = RegExpFn( structure P = AwkSyntax structure E = DfaEngine)) structure BackTrackRE = TestFn ( val engineName = "Back-tracking engine" structure RE = RegExpFn( structure P = AwkSyntax structure E = BackTrackEngine)) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/Tests/run.sh000077500000000000000000000001741416264345000240130ustar00rootroot00000000000000#!/bin/sh # # Run the RE tests # sml sources.cm < (print "compile failed\n"; raise ex) in case ((RE.find re (getc data) 0) handle ex => NONE) of NONE => print "match failed\n" | SOME(M.Match({pos, len}, _), _) => print(concat[ "match at ", Int.toString pos, " = \"", String.toString(String.substring(data, pos, len)), "\"\n" ]) (* end case *) end handle _ => () fun doTests () = ( print(concat[" testing ", engineName, "\n"]); test ("01", "[0-9]+", "abc123xyz"); test ("02", "^[0-9]+", "abc123def\n987xyz"); test ("03", "[0-9]+$", "abc123def\n987xyz456"); test ("04", "[0-9]+$", "987xyz456\nabc123"); test ("05", "^$", ""); test ("06", ".", "a"); test ("07", "^foo$", "foo"); test ("08", "^...$", "foo"); test ("09", "^.*$", "foo"); test ("10", "^.*foo@bar\\.com$", "foo@bar.com"); test ("11", "(abc)","abc"); test ("12", "\\(abc\\)","(abc)"); test ("13", "(abc){2,4}$", "abcabc"); test ("14", "(abc){2,4}$", "abcabcabc"); test ("15", "(abc){2,4}$", "abcabcabcabc"); print "** tests done\n") end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/regexp-lib.cm000066400000000000000000000016161416264345000241270ustar00rootroot00000000000000(* regexp-lib.cm * * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library signature REGEXP_SYNTAX signature REGEXP_PARSER signature MATCH_TREE signature REGEXP_ENGINE signature REGEXP structure RegExpSyntax structure MatchTree structure AwkSyntax structure BackTrackEngine structure DfaEngine structure ThompsonEngine functor RegExpFn is #if defined(NEW_CM) $/basis.cm $/smlnj-lib.cm #else ../Util/smlnj-lib.cm #endif (* utility functions *) Glue/match-tree.sml BackEnd/fsm.sml (* internal glue language *) FrontEnd/syntax-sig.sml FrontEnd/syntax.sml (* front/back-ends signatures *) FrontEnd/parser-sig.sml BackEnd/engine-sig.sml (* Frontends *) FrontEnd/awk-syntax.sml (* Engines *) BackEnd/bt-engine.sml BackEnd/dfa-engine.sml BackEnd/thompson-engine.sml (* Glue functor *) Glue/regexp-sig.sml Glue/regexp-fn.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/RegExp/regexp-lib.mlb000066400000000000000000000222541416264345000243030ustar00rootroot00000000000000 ann "nonexhaustiveBind ignore" "nonexhaustiveMatch ignore" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l4 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l12 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in structure gs_0 = List end local structure List = gs_0 Glue/match-tree.sml in signature gs_1 = MATCH_TREE structure gs_2 = MatchTree end local open l12 in signature gs_3 = ORD_SET end local signature ORD_SET = gs_3 FrontEnd/syntax-sig.sml in signature gs_4 = REGEXP_SYNTAX end local open l4 in structure gs_5 = Option end local open l4 in structure gs_6 = StringCvt end local open l12 in functor gs_7 = ListSetFn end local open l4 in structure gs_8 = Char structure gs_9 = CharArray structure gs_10 = CharVector structure gs_11 = FixedInt structure gs_12 = General structure gs_13 = Int structure gs_14 = Int32 structure gs_15 = Int64 structure gs_16 = IntInf structure gs_17 = LargeInt structure gs_18 = LargeReal structure gs_19 = LargeWord structure gs_20 = OS structure gs_21 = Position structure gs_22 = Real structure gs_23 = Real64 structure gs_24 = RealArray structure gs_25 = RealArraySlice structure gs_26 = RealVector structure gs_27 = RealVectorSlice structure gs_28 = SMLofNJ structure gs_29 = Socket structure gs_30 = String structure gs_31 = Substring structure gs_32 = SysWord structure gs_33 = Time structure gs_34 = Word structure gs_35 = Word32 structure gs_36 = Word64 structure gs_37 = Word8 end local structure Char = gs_8 structure CharArray = gs_9 structure CharVector = gs_10 structure FixedInt = gs_11 structure General = gs_12 structure Int = gs_13 structure Int32 = gs_14 structure Int64 = gs_15 structure IntInf = gs_16 structure LargeInt = gs_17 structure LargeReal = gs_18 structure LargeWord = gs_19 structure List = gs_0 functor ListSetFn = gs_7 structure OS = gs_20 structure Position = gs_21 signature REGEXP_SYNTAX = gs_4 structure Real = gs_22 structure Real64 = gs_23 structure RealArray = gs_24 structure RealArraySlice = gs_25 structure RealVector = gs_26 structure RealVectorSlice = gs_27 structure SMLofNJ = gs_28 structure Socket = gs_29 structure String = gs_30 structure Substring = gs_31 structure SysWord = gs_32 structure Time = gs_33 structure Word = gs_34 structure Word32 = gs_35 structure Word64 = gs_36 structure Word8 = gs_37 FrontEnd/syntax.sml in structure gs_38 = RegExpSyntax end local signature MATCH_TREE = gs_1 structure MatchTree = gs_2 structure RegExpSyntax = gs_38 structure StringCvt = gs_6 BackEnd/engine-sig.sml in signature gs_39 = REGEXP_ENGINE end local structure List = gs_0 signature MATCH_TREE = gs_1 structure MatchTree = gs_2 structure Option = gs_5 signature REGEXP_ENGINE = gs_39 structure RegExpSyntax = gs_38 BackEnd/bt-engine.sml in structure gs_40 = BackTrackEngine end local signature MATCH_TREE = gs_1 structure MatchTree = gs_2 structure StringCvt = gs_6 Glue/regexp-sig.sml in signature gs_41 = REGEXP end local structure RegExpSyntax = gs_38 structure StringCvt = gs_6 FrontEnd/parser-sig.sml in signature gs_42 = REGEXP_PARSER end local signature MATCH_TREE = gs_1 structure MatchTree = gs_2 signature REGEXP = gs_41 signature REGEXP_ENGINE = gs_39 signature REGEXP_PARSER = gs_42 structure StringCvt = gs_6 Glue/regexp-fn.sml in functor gs_43 = RegExpFn end local open l4 in structure gs_44 = Vector end local open l4 in structure gs_45 = Array end local structure Array = gs_45 structure Char = gs_8 structure CharArray = gs_9 structure CharVector = gs_10 structure FixedInt = gs_11 structure General = gs_12 structure Int = gs_13 structure Int32 = gs_14 structure Int64 = gs_15 structure IntInf = gs_16 structure LargeInt = gs_17 structure LargeReal = gs_18 structure LargeWord = gs_19 structure List = gs_0 signature MATCH_TREE = gs_1 structure MatchTree = gs_2 structure OS = gs_20 structure Position = gs_21 signature REGEXP_ENGINE = gs_39 structure Real = gs_22 structure Real64 = gs_23 structure RealArray = gs_24 structure RealArraySlice = gs_25 structure RealVector = gs_26 structure RealVectorSlice = gs_27 structure RegExpSyntax = gs_38 structure SMLofNJ = gs_28 structure Socket = gs_29 structure String = gs_30 structure StringCvt = gs_6 structure Substring = gs_31 structure SysWord = gs_32 structure Time = gs_33 structure Vector = gs_44 structure Word = gs_34 structure Word32 = gs_35 structure Word64 = gs_36 structure Word8 = gs_37 BackEnd/thompson-engine.sml in structure gs_46 = ThompsonEngine end local open l12 in functor gs_47 = ListMapFn end local open l4 in structure gs_48 = Array2 end local open l4 in structure gs_49 = TextIO end local open l4 in structure gs_50 = ListPair end local structure Array = gs_45 structure Array2 = gs_48 structure Char = gs_8 structure CharArray = gs_9 structure CharVector = gs_10 structure FixedInt = gs_11 structure General = gs_12 structure Int = gs_13 structure Int32 = gs_14 structure Int64 = gs_15 structure IntInf = gs_16 structure LargeInt = gs_17 structure LargeReal = gs_18 structure LargeWord = gs_19 structure List = gs_0 functor ListMapFn = gs_47 structure ListPair = gs_50 functor ListSetFn = gs_7 signature ORD_SET = gs_3 structure OS = gs_20 structure Position = gs_21 structure Real = gs_22 structure Real64 = gs_23 structure RealArray = gs_24 structure RealArraySlice = gs_25 structure RealVector = gs_26 structure RealVectorSlice = gs_27 structure RegExpSyntax = gs_38 structure SMLofNJ = gs_28 structure Socket = gs_29 structure String = gs_30 structure Substring = gs_31 structure SysWord = gs_32 structure TextIO = gs_49 structure Time = gs_33 structure Word = gs_34 structure Word32 = gs_35 structure Word64 = gs_36 structure Word8 = gs_37 BackEnd/fsm.sml in signature gs_51 = DFA structure gs_52 = Dfa signature gs_53 = NFA structure gs_54 = Nfa end local signature DFA = gs_51 structure Dfa = gs_52 signature MATCH_TREE = gs_1 structure MatchTree = gs_2 signature NFA = gs_53 structure Nfa = gs_54 signature REGEXP_ENGINE = gs_39 structure RegExpSyntax = gs_38 structure Vector = gs_44 BackEnd/dfa-engine.sml in structure gs_55 = DfaEngine end local structure Char = gs_8 structure CharArray = gs_9 structure CharVector = gs_10 structure FixedInt = gs_11 structure General = gs_12 structure Int = gs_13 structure Int32 = gs_14 structure Int64 = gs_15 structure IntInf = gs_16 structure LargeInt = gs_17 structure LargeReal = gs_18 structure LargeWord = gs_19 structure List = gs_0 structure OS = gs_20 structure Position = gs_21 signature REGEXP_PARSER = gs_42 structure Real = gs_22 structure Real64 = gs_23 structure RealArray = gs_24 structure RealArraySlice = gs_25 structure RealVector = gs_26 structure RealVectorSlice = gs_27 structure RegExpSyntax = gs_38 structure SMLofNJ = gs_28 structure Socket = gs_29 structure String = gs_30 structure StringCvt = gs_6 structure Substring = gs_31 structure SysWord = gs_32 structure Time = gs_33 structure Word = gs_34 structure Word32 = gs_35 structure Word64 = gs_36 structure Word8 = gs_37 FrontEnd/awk-syntax.sml in structure gs_56 = AwkSyntax end in structure AwkSyntax = gs_56 structure BackTrackEngine = gs_40 structure DfaEngine = gs_55 signature MATCH_TREE = gs_1 structure MatchTree = gs_2 signature REGEXP = gs_41 signature REGEXP_ENGINE = gs_39 signature REGEXP_PARSER = gs_42 signature REGEXP_SYNTAX = gs_4 functor RegExpFn = gs_43 structure RegExpSyntax = gs_38 structure ThompsonEngine = gs_46 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/000077500000000000000000000000001416264345000212315ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/README000066400000000000000000000037241416264345000221170ustar00rootroot00000000000000The *SExp Library* supports the reading and writing of structured data using the S-expression syntax. It is a work in progress, and does not fully conform with any formal S-exp specification. - End-of-line comments begin with a semicolon character - An S-Expression is either an atomic token (boolean, number, symbol, or string), a quoted expression, or a list of S-Expressions enclosed in brackets. - Quoted expressions are formed by the single-quote character (``'``) followed by an expression. - Lists are be delimited by matched pairs of `()` `[]` or `{}`, nested freely. - List items are separated with whitespace (space, tab, newlines, or carriage returns). - Symbols (or _identifiers_) begin with an initial character followed by zero or more _subsequent_ characters, where an initial character is either a letter or one of the characters `-+.@!$%&*/:<=>?^_~` and a subsequent character is either an initial character, a decimal digit, or the character `#`. - Booleans are represented by the literals `#f` (false) and `#t` (true). - Numbers are either signed integers or floating-point numbers; the sign (if present) is one of "'+'," "`-`," or "`~`". - Integers may be specified in decimal without any prefix, or in hexadecimal with the prefix "0x". In hex, the value is assumed to be unsigned, so -255 should be written "-0xff" rather than "0x-ff". - The format of a floating point number is described by the following regular expression: ? + '.' + ([eE] ? +) Notably, "`1.`" and "`.1`" are invalid and "`1`" is an integer --- floats must have a dot with digits on both sides. - Strings are enclosed in double quotes (``"``). + The difference between symbols and strings is that symbols are represented as Atom.atom types, so equality comparisons are more efficient. The original version of the library was written by Damon Wang at the University of Chicago. It has since been modified and maintained by John Reppy. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-lib.cm000066400000000000000000000007531416264345000233020ustar00rootroot00000000000000(* sexp-lib.cm * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) *) Library structure SExp structure SExpParser structure SExpPP structure SExpPrinter is $/basis.cm $/smlnj-lib.cm $/pp-lib.cm $/ml-lpt-lib.cm #if defined(NO_PLUGINS) sexp.lex.sml #else sexp.lex : ml-ulex #endif sexp.sml sexp-parser.sml sexp-pp.sml sexp-printer.sml sexp-tokens.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-lib.mlb000066400000000000000000000207141416264345000234540ustar00rootroot00000000000000 ann "nonexhaustiveBind ignore" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l4 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l8 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis l89 = bas (* $/pp-lib.cm ====> *) $(SML_LIB)/smlnj-lib/PP/pp-lib.mlb end basis l15 = bas (* $/ml-lpt-lib.cm ====> *) $(SML_LIB)/mllpt-lib/mllpt-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in structure gs_0 = TextIO end local open l8 in structure gs_1 = Atom end local open l4 in structure gs_2 = List end local open l15 in structure gs_3 = AntlrStreamPos end local open l4 in structure gs_4 = Char structure gs_5 = CharArray structure gs_6 = CharVector structure gs_7 = FixedInt structure gs_8 = General structure gs_9 = Int structure gs_10 = Int32 structure gs_11 = Int64 structure gs_12 = IntInf structure gs_13 = LargeInt structure gs_14 = LargeReal structure gs_15 = LargeWord structure gs_16 = OS structure gs_17 = Position structure gs_18 = Real structure gs_19 = Real64 structure gs_20 = RealArray structure gs_21 = RealArraySlice structure gs_22 = RealVector structure gs_23 = RealVectorSlice structure gs_24 = SMLofNJ structure gs_25 = Socket structure gs_26 = String structure gs_27 = Substring structure gs_28 = SysWord structure gs_29 = Time structure gs_30 = Word structure gs_31 = Word32 structure gs_32 = Word64 structure gs_33 = Word8 end local open l15 in structure gs_34 = UTF8 end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_2 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure UTF8 = gs_34 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 sexp-tokens.sml in structure gs_35 = SExpTokens end local open l4 in structure gs_36 = Vector end local open l4 in structure gs_37 = StringCvt end local open l15 in structure gs_38 = ULexBuffer end local structure AntlrStreamPos = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_2 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SExpTokens = gs_35 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_37 structure Substring = gs_27 structure SysWord = gs_28 structure TextIO = gs_0 structure Time = gs_29 structure ULexBuffer = gs_38 structure UTF8 = gs_34 structure Vector = gs_36 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 sexp.lex.sml in structure gs_39 = SExpLexer end local open l4 in structure gs_40 = ListPair end local structure Atom = gs_1 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_2 structure ListPair = gs_40 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 sexp.sml in structure gs_41 = SExp end local structure AntlrStreamPos = gs_3 structure Atom = gs_1 structure List = gs_2 structure SExp = gs_41 structure SExpLexer = gs_39 structure SExpTokens = gs_35 structure TextIO = gs_0 sexp-parser.sml in structure gs_42 = SExpParser end local open l8 in structure gs_43 = Format end local structure Atom = gs_1 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure Format = gs_43 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_2 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SExp = gs_41 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure TextIO = gs_0 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 sexp-printer.sml in structure gs_44 = SExpPrinter end local open l89 in structure gs_45 = TextIOPP end local structure Atom = gs_1 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure Format = gs_43 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_2 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SExp = gs_41 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure TextIOPP = gs_45 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 sexp-pp.sml in structure gs_46 = SExpPP end in structure SExp = gs_41 structure SExpPP = gs_46 structure SExpParser = gs_42 structure SExpPrinter = gs_44 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-parser.sml000066400000000000000000000061341416264345000242230ustar00rootroot00000000000000(* sexp-parser.sml * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) *) structure SExpParser : sig val parse : TextIO.instream -> SExp.value list val parseFile : string -> SExp.value list end = struct structure Lex = SExpLexer structure T = SExpTokens structure S = SExp fun parse' (srcMap, inStrm) = let fun error (pos, msg, tok) = raise Fail(concat[ "error ", AntlrStreamPos.spanToString srcMap pos, ": ", msg, ", found '", T.toString tok, "'" ]) val lexer = Lex.lex srcMap (* returns (tok, pos, nextStrm, strm) where the difference between * nextStrm and strm is that tok is the next token in strm * whereas the token _after_ tok is the next up in nextStrm. * * In other words, strm has had all leading whitespace consumed. *) fun lexNWS (strm : Lex.strm) = (case lexer strm of (T.WHITE, _, strm) => lexNWS strm | (tok, pos, nextStrm) => (tok, pos, nextStrm, strm) (* end case *)) fun parseValue (strm : Lex.strm) = let val (tok, pos, strm) = lexer strm in case tok of T.DELIM(delim, T.OPEN) => parseList (delim, strm) | T.QUOTE => let val (strm', value) = parseValue strm in (strm, S.QUOTE value) end | T.KW_true => (strm, S.BOOL true) | T.KW_false => (strm, S.BOOL false) | T.INT n => (strm, S.INT n) | T.FLOAT f => (strm, S.FLOAT f) | T.STRING s => (strm, S.STRING s) | T.SYMBOL s => (strm, S.SYMBOL (Atom.atom s)) | _ => error (pos, "parsing value", tok) (* end case *) end (* parse a list, where delim is the type of delimiter enclosing the list *) and parseList (delim : T.delim_type, strm : Lex.strm) = let fun matchDelim (T.DELIM(dType, T.CLOSE)) = (dType = delim) | matchDelim tok = false val (tok, _, nextStrm, strm) = lexNWS strm in if matchDelim tok then (nextStrm, S.LIST []) else let fun loop (strm, items) = let val (strm, v) = parseValue strm (* expect either a separator (whitespace) or a delimiter *) val (tok, pos, nextStrm, strm) = lexNWS strm in if matchDelim tok then (nextStrm, v::items) else (loop(strm, v::items) handle (Fail msg) => error(pos, "parsing list gave '" ^ msg ^ "'" , tok)) end val (strm, items) = loop (strm, []) in (strm, S.LIST (List.rev items)) end end (* parse top-level s-expressions until EOF *) fun parseSExps (strm, sexps) = let val (strm, sexp) = parseValue strm val (tok, pos, nextStrm, strm) = lexNWS strm in case tok of T.EOF => List.rev(sexp::sexps) | _ => parseSExps (strm, sexp::sexps) (* end case *) end in parseSExps (Lex.streamifyInstream inStrm, []) end fun parse inStrm = parse' (AntlrStreamPos.mkSourcemap (), inStrm) fun parseFile fileName = let val inStrm = TextIO.openIn fileName val v = parse' (AntlrStreamPos.mkSourcemap' fileName, inStrm) handle ex => (TextIO.closeIn inStrm; raise ex) in TextIO.closeIn inStrm; v end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-pp.sml000066400000000000000000000024601416264345000233440ustar00rootroot00000000000000(* sexp-pp.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A pretty printer for SExp values. *) structure SExpPP : sig val output : TextIOPP.stream * SExp.value -> unit end = struct structure S = SExp structure PP = TextIOPP structure F = Format fun output (strm, sexp) = let val str = PP.string strm fun sp () = PP.space strm 1 fun ppList [] = str "()" | ppList [v] = ( PP.openHBox strm; str "("; ppVal v; str ")"; PP.closeBox strm) | ppList (v1::v2::vr) = ( PP.openHBox strm; str "("; ppVal v1; sp(); PP.openHOVBox strm (PP.Rel 0); ppVal v2; List.app (fn v => (sp(); ppVal v)) vr; str ")"; PP.closeBox strm; PP.closeBox strm) and ppVal (S.SYMBOL value) = str (Atom.toString value) | ppVal (S.BOOL value) = str (if value then "#t" else "#f") | ppVal (S.INT value) = str (F.format "%d" [F.LINT value]) | ppVal (S.FLOAT value) = str (F.format "%g" [F.REAL value]) | ppVal (S.STRING value) = str (concat ["\"", String.toString value, "\""]) | ppVal (S.QUOTE value) = (str "'"; ppVal value) | ppVal (S.LIST values) = ppList values in PP.openVBox strm (PP.Abs 0); ppVal sexp; PP.newline strm; PP.closeBox strm end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-printer.sml000066400000000000000000000022311416264345000244040ustar00rootroot00000000000000(* sexp-printer.sml * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) * * A printer for SExp values. This printer does not introduce any line * breaks. For output that is more readable, use the SExpPP module. *) structure SExpPrinter : sig val print : TextIO.outstream * SExp.value -> unit end = struct structure S = SExp structure F = Format fun print (strm, sexp) = let fun pr s = TextIO.output(strm, s) fun prList [] = pr ("()") | prList [v] = (pr "("; prVal v; pr ")") | prList (v::vs) = ( pr "("; prVal v; List.app (fn v => (pr " "; prVal v)) vs; pr ")") and prVal (S.SYMBOL value) = pr (Atom.toString value) | prVal (S.BOOL value) = pr (if value then "#t" else "#f") | prVal (S.INT value) = pr (F.format "%d" [F.LINT value]) | prVal (S.FLOAT value) = pr (F.format "%g" [F.REAL value]) | prVal (S.STRING value) = pr (concat ["\"", String.toString value, "\""]) | prVal (S.QUOTE value) = (pr "'"; prVal value) | prVal (S.LIST values) = prList values in prVal sexp end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-tests.cm000066400000000000000000000006271416264345000236760ustar00rootroot00000000000000(* sexp-tests.cm * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) *) Library structure SExp structure SExpParser structure SExpPrinter structure SExpTests structure TestPP is $/basis.cm $/smlnj-lib.cm $/pp-lib.cm $/ml-lpt-lib.cm sexp-lib.cm sexp-tests.sml test-pp.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-tests.sml000066400000000000000000000240521416264345000240700ustar00rootroot00000000000000(* sexp-tests.sml * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) * * Some test cases for the SExp library 11 May 2011 by Damon Wang *) structure TEST : sig exception ERROR of string option (* an error message *) datatype outcome = PASS of string (* test name *) | FAIL of (string * exn) (* test name, FAIL instance *) | PARTIAL of (string * outcome list) (* name, results *) datatype testcase = CASE of { name : string, test : unit -> unit } | SUITE of { name : string, tests : testcase list } val run : testcase -> outcome val count : outcome -> (int * int) (* number passed, number run *) val summary : outcome -> string (* args: (msg, cond) where * msg is a description to be printed on failure * cond is a boolean---false means failure *) val assert : (string * bool) -> unit (* args: (cond) *) val assert' : bool -> unit (* args: (msg, name, func) where * msg is a description to be printed on failure * name is the exnName of the exception to expect * func is the function which should raise the exception *) val throws : (string * string * (unit -> unit)) -> unit (* args: (name, func) *) val throws' : (string * (unit -> unit )) -> unit end = struct exception ERROR of string option (* an error message *) datatype outcome = PASS of string (* test name *) | FAIL of (string * exn) (* test name, FAIL instance *) | PARTIAL of (string * outcome list) (* name, results *) datatype testcase = CASE of { name : string, test : unit -> unit } | SUITE of { name : string, tests : testcase list } fun run (SUITE {name, tests}) = PARTIAL(name, List.map run tests) | run (CASE {name, test}) = (test(); PASS(name)) handle e => FAIL(name, e) fun addVec ((a, b), (c, d)) = (a + c, b + d) fun count (PASS _) = (1, 1) | count (FAIL _) = (0, 1) | count (PARTIAL (_, results)) = let in List.foldl addVec (0,0) (List.map count results) end fun assert (msg, cond) = if not cond then raise ERROR (SOME msg) else () fun assert' cond = if not cond then raise ERROR NONE else () fun throws (msg, name, func) = let fun wrongExn e = raise ERROR (SOME (String.concat [msg, "---expected exception '", name, "' but got '", exnName e, "' with msg\n", exnMessage e])) fun noExn () = raise ERROR (SOME (String.concat [msg, "---expected exception '", name, "' but got nothing"])) in if (func (); true) handle e => if exnName e = name then false else (wrongExn e; false) then noExn () else () end fun throws' (name, func) = throws ("", name, func) local fun splitMsg msg = String.fields (fn c => EQUAL = Char.compare (#"\n", c)) msg fun indent lines = List.map (fn s => "\t" ^ s) lines fun summary' (PASS name) : (string list * (int * int)) = ([ String.concat [" ", name, "\n"] ], (1, 1)) | summary' (FAIL (name, ERROR msg)) = (List.concat [ [ String.concat ["FAIL ", name ] ], (case msg of SOME msg => indent (List.concat [["\n"], (splitMsg msg), ["\n"] ]) | NONE => ["\n"]) ], (0, 1)) | summary' (FAIL (name, e)) = (List.concat [ [ String.concat ["FAIL ", name, " with external error ", exnName e, "\n" ] ], indent (splitMsg (exnMessage e)), [ "\n"] ], (0, 1)) | summary' (PARTIAL (name, results)) = let val (lines, counts) = ListPair.unzip (List.map summary' results) val indented = indent (List.concat lines) val (n_passed, n_run) = List.foldl addVec (0, 0) counts in (String.concat [ "[ ", Int.toString n_passed, " / ", Int.toString n_run, " ] ", name, "\n"] :: indented, (n_passed, n_run)) end in fun summary results = String.concat (#1 (summary' results)) end end structure SExpTests : sig val run : unit -> unit end = struct structure P = SExpParser structure S = SExp val assert = TEST.assert val assert' = TEST.assert' val throws' = TEST.throws' fun pS str = hd (P.parse (TextIO.openString str)) val tests = TEST.SUITE{name="parsing", tests=[ TEST.SUITE{name="bool", tests=[ TEST.CASE{name="true", test=fn () => assert' (S.same(pS "#t", S.BOOL true)) }, TEST.CASE{name="false", test=fn () => assert' (S.same(pS "#f", S.BOOL false))} ] }, TEST.SUITE{name="int", tests=[ TEST.CASE{name="negative", test=fn () => assert' (S.same(pS "-1", S.INT ~1)) }, TEST.CASE{name="zero", test=fn () => assert' (S.same(pS "0", S.INT 0)) }, TEST.CASE{name="positive", test=fn () => assert' (S.same(pS "1", S.INT 1)) }, TEST.CASE{name="32-bit signed max", test=fn () => assert' (S.same(pS "2147483647", S.INT 2147483647)) }, TEST.CASE{name="32-bit signed min", test=fn () => assert' (S.same(pS "-2147483648", S.INT ~2147483648)) }, TEST.CASE{name="bigger than 32-bit", test=fn () => assert' (S.same(pS "3147483647", S.INT 3147483647)) }, TEST.CASE{name="leading plus", test=fn () => assert' (S.same(pS "+1", S.INT 1)) }, TEST.CASE{name="hex", test=fn () => assert' (S.same(pS "0xdeadbeef", S.INT 0xdeadbeef)) }, TEST.CASE{name="positive hex", test=fn () => assert' (S.same(pS "+0xdeadbeef", S.INT 0xdeadbeef)) }, TEST.CASE{name="negative hex", test=fn () => assert' (S.same(pS "-0xdeadbeef", S.INT ~0xdeadbeef)) } ]}, TEST.SUITE{name="float", tests=[ TEST.CASE{name="decimal", test=fn () => assert' (S.same(pS "1.0", S.FLOAT 1.0))}, TEST.CASE{name="exponent", test=fn () => assert' (S.same(pS "1e2", S.FLOAT 100.0))}, TEST.CASE{name="decimal and exponent", test=fn () => assert' (S.same(pS "1.2e2", S.FLOAT 120.0))}, TEST.CASE{name="negative", test=fn () => assert' (S.same(pS "-1.0", S.FLOAT ~1.0))}, TEST.CASE{name="negative exponent", test=fn () => assert' (S.same(pS "1.0e-2", S.FLOAT 0.01))}, TEST.CASE{name="zero first digit", test=fn () => assert' (S.same(pS "0.1", S.FLOAT 0.1))} ]}, TEST.SUITE{name="string", tests=[ TEST.CASE{name="empty", test=fn () => assert' (S.same(pS "\"\"", S.STRING "")) }, TEST.CASE{name="characters", test=fn () => assert' (S.same(pS "\"foo\"", S.STRING "foo")) }, TEST.CASE{name="escapes", test=fn () => assert' (S.same(pS "\" \\\\ \\\" \\/ \\b \\f \\n \\r \\t \"", S.STRING " \\ \" / \b \f \n \r \t ")) } ]}, TEST.SUITE{name="comments", tests=[ TEST.CASE{name="empty", test=fn () => assert' (S.same(pS "/* */1", S.INT 1))}, TEST.CASE{name="with text", test=fn () => assert' (S.same(pS "/* 1 */1", S.INT 1))}, TEST.CASE{name="multiline allowed", test=fn () => assert' (S.same(pS "/* 1 \n 1 */1", S.INT 1))}, TEST.CASE{name="cannot be nested", test=fn ()=> throws' ("Fail", fn () => (pS "/* 0 /* 1 */ 2 */ 3"; ())) } ]}, TEST.SUITE{name="lists", tests=[ TEST.CASE{name="empty", test=fn () => assert' (S.same(pS "()", S.LIST []))}, TEST.CASE{name="empty with spaces", test=fn () => assert' (S.same(pS "( )", S.LIST []))}, TEST.CASE{name="one int", test=fn () => assert' (S.same(pS "(1)", S.LIST [ (S.INT 1) ]))}, TEST.CASE{name="one int with space", test=fn () => assert' (S.same(pS "( 1)", S.LIST [ (S.INT 1) ]))}, TEST.CASE{name="one int with spaces", test=fn () => assert' (S.same(pS "( 1 )", S.LIST [ (S.INT 1) ]))}, TEST.CASE{name="with empty list ", test=fn () => assert' (S.same(pS "( () )", S.LIST [ (S.LIST []) ]))}, TEST.CASE{name="nested", test=fn () => assert' (S.same(pS "( ( 1 ) )", S.LIST [ S.LIST [ S.INT 1 ] ]))}, TEST.CASE{name="two elements", test=fn () => assert' (S.same(pS "( 1 2 )", S.LIST [ S.INT 1, S.INT 2]))}, TEST.CASE{name="three elements", test=fn () => assert' (S.same(pS "( 1 2 3 )", S.LIST [ S.INT 1, S.INT 2]))}, TEST.CASE{name="mixed elements", test=fn () => assert' (S.same(pS "( 1 2.5 \"foo\" (2))", S.LIST [ S.INT 1, S.FLOAT 2.5, S.STRING "foo", S.LIST [ S.INT 2 ] ]))}, TEST.CASE{name="brackets", test=fn () => assert' (S.same(pS "[ 1 2 3 ]", S.LIST [ S.INT 1, S.INT 2]))}, TEST.CASE{name="braces", test=fn () => assert' (S.same(pS "{ 1 2 3 }", S.LIST [ S.INT 1, S.INT 2]))}, TEST.CASE{name="mixed delimiters", test=fn () => assert' (S.same(pS "{ [ ( ) ] }", S.LIST [ S.LIST [ S.LIST [] ] ]))}, TEST.CASE{name="delimiters must match", test=fn () => throws' ("Fail", fn () => (pS "(]"; ())) }, TEST.CASE{name="alternative separaters", test=fn () => assert' (S.same(pS "(1;2,3)", S.LIST [ S.INT 1, S.INT 2, S.INT 3])) } ]}, TEST.SUITE{name="symbols", tests=[ TEST.CASE{name="characters", test=fn () => assert' (S.same(pS "ab", S.SYMBOL (Atom.atom "ab")))}, TEST.CASE{name="trailing digits", test=fn () => assert' (S.same(pS "x0", S.SYMBOL (Atom.atom "x0")))}, TEST.CASE{name="quoted", test=fn ()=> assert' (S.same(pS "'0", S.SYMBOL (Atom.atom "0")))} ]}, TEST.SUITE{name="bugs", tests=[ TEST.CASE{name="bug01", test= fn () => assert' (S.same( pS "(set pi 3.141592653589793 :documentation \"The value of $\\pi$.\")", S.LIST[ S.SYMBOL(Atom.atom "set"), S.SYMBOL(Atom.atom "pi"), S.FLOAT 3.141592653589793, S.SYMBOL(Atom.atom ":documentation"), S.STRING "The value of $\\pi$." ])) } ]} ]} fun run () = TextIO.print (TEST.summary (TEST.run tests)) end (* SExpTests.run (); *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp-tokens.sml000066400000000000000000000031321416264345000242250ustar00rootroot00000000000000(* sexp-tokens.sml * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) s * * The tokens returned by the SExp lexer. *) structure SExpTokens = struct datatype delim_type = PAREN | BRACKET | BRACE datatype delim_open = OPEN | CLOSE datatype token = EOF (* end-of-file *) | DELIM of (delim_type * delim_open) | QUOTE (* "'" *) | KW_true (* "#t" *) | KW_false (* "#f" *) | INT of IntInf.int | FLOAT of real | STRING of string | WHITE (* whitespace, which separates list items *) | SYMBOL of string (* TODO: add a HEX constructor for encoding non-printable characters in * some human-readable way *) fun toString EOF = "" | toString (DELIM(PAREN, OPEN)) = "(" | toString (DELIM(PAREN, CLOSE)) = ")" | toString (DELIM(BRACKET, OPEN)) = "[" | toString (DELIM(BRACKET, CLOSE)) = "]" | toString (DELIM(BRACE, OPEN)) = "{" | toString (DELIM(BRACE, CLOSE)) = "}" | toString QUOTE = "'" | toString KW_true = "#t" | toString KW_false = "#f" | toString (INT i) = if (i < 0) then "-" ^ IntInf.toString(~i) else IntInf.toString i | toString (FLOAT f) = if (f < 0.0) then "-" ^ Real.toString(~f) else Real.toString f | toString (STRING s) = let fun f (wchr, l) = UTF8.toString wchr :: l in String.concat("\"" :: (List.foldr f ["\""] (UTF8.explode s))) end | toString (SYMBOL str) = str | toString WHITE = " " end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp.lex000066400000000000000000000070051416264345000227240ustar00rootroot00000000000000(* sexp.lex * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) * * Lexer for Sexp files. * * TODO: * EOF rules for strings * newlines in strings * error messages for unknown characters *) %name SExpLexer; %defs ( structure T = SExpTokens type lex_result = T.token fun eof () = T.EOF fun int s = T.INT(valOf(IntInf.fromString s)) fun float s = T.FLOAT(valOf(LargeReal.fromString s)) (* support for incremental construction of strings *) val sbuf : string list ref = ref [] fun addStr s = (sbuf := s :: !sbuf) fun addUChr lit = let (* trim the "\u" prefix *) val digits = Substring.triml 2 (Substring.full lit) val SOME(w, _) = Word.scan StringCvt.HEX Substring.getc digits in addStr(UTF8.encode w) end fun finishString () = (T.STRING(String.concat(List.rev(!sbuf))) before sbuf := []) ); %let digit1_9 = [1-9]; %let digit = [0-9]; %let digits = {digit}+; %let int = [+-]?({digit} | {digit1_9}{digits}+); %let frac = "."{digits}; %let exp = [eE][+-]?{digits}; %let xdigit = {digit}|[a-fA-F]; %let alpha = ([a-zA-Z]); %let initial = {alpha} | "^" | [-+.@!$%&*/:<=>?_~]; %let subsequent = {initial} | {digit}; %let ident = {initial} {subsequent}*; %states S; [ \t\n\r]+ => ( T.WHITE ); ";"[^\n\r]*[\n\r]+ => ( skip() (* comment *)); {ident} => ( T.SYMBOL (yytext) ); "'" => ( T.QUOTE ); "(" => ( T.DELIM (T.PAREN, T.OPEN) ); ")" => ( T.DELIM (T.PAREN, T.CLOSE) ); "[" => ( T.DELIM (T.BRACKET, T.OPEN) ); "]" => ( T.DELIM (T.BRACKET, T.CLOSE) ); "{" => ( T.DELIM (T.BRACE, T.OPEN) ); "}" => ( T.DELIM (T.BRACE, T.CLOSE) ); "#t" => ( T.KW_true ); "#f" => ( T.KW_false ); (* takes a string of form "0xdeadbeef", strips the leading "0x", and returns * an IntInf with hex value deadbeef. Note that the hex value is unsigned; to * get negatives, write "-0xdeadbeef". This means that the string from C's * `printf("%x", -1)` will be parsed as INT_MAX. TODO is this a good idea? *) [+-]?"0x"{xdigit}+ => ( let (* TODO Doesn't StringCvt.HEX handle stripping the "0x" prefix? *) val digits = if String.isPrefix "+" yytext (* "+0xdeadbeef" *) then String.extract(yytext, 3, NONE) else if String.isPrefix "-" yytext (* "-0xdeadbeef" *) then "-" ^ String.extract(yytext, 3, NONE) else String.extract(yytext, 2, NONE) (* "0xdeadbeef" *) val SOME(value) = StringCvt.scanString (IntInf.scan StringCvt.HEX) digits in T.INT(value) end ); {int} => ( T.INT(valOf(IntInf.fromString yytext)) ); {int}{frac} => ( float yytext ); {int}{exp} => ( float yytext ); {int}{frac}{exp} => ( float yytext ); "\"" => ( YYBEGIN S; continue() ); (* TODO backport this to the JSON parser, which hangs if it sees a \\ in a * string. *) "\\" => ( addStr "\\"; continue() ); "\\\"" => ( addStr "\""; continue() ); "\\b" => ( addStr "\b"; continue() ); "\\f" => ( addStr "\f"; continue() ); "\\n" => ( addStr "\n"; continue() ); "\\r" => ( addStr "\r"; continue() ); "\\t" => ( addStr "\t"; continue() ); "\\u"{xdigit}{4} => ( addUChr yytext; continue() ); [^\\"]+ => ( addStr yytext; continue() ); "\"" => ( YYBEGIN INITIAL; finishString() ); (* FIXME: add some error reporting *) . => ( skip() ); mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp.lex.sml000066400000000000000000002276141416264345000235300ustar00rootroot00000000000000structure SExpLexer = struct datatype yystart_state = S | INITIAL local structure UserDeclarations = struct structure T = SExpTokens type lex_result = T.token fun eof () = T.EOF fun int s = T.INT(valOf(IntInf.fromString s)) fun float s = T.FLOAT(valOf(LargeReal.fromString s)) (* support for incremental construction of strings *) val sbuf : string list ref = ref [] fun addStr s = (sbuf := s :: !sbuf) fun addUChr lit = let (* trim the "\u" prefix *) val digits = Substring.triml 2 (Substring.full lit) val SOME(w, _) = Word.scan StringCvt.HEX Substring.getc digits in addStr(UTF8.encode w) end fun finishString () = (T.STRING(String.concat(List.rev(!sbuf))) before sbuf := []) end datatype yymatch = yyNO_MATCH | yyMATCH of ULexBuffer.stream * action * yymatch withtype action = ULexBuffer.stream * yymatch -> UserDeclarations.lex_result val yytable : ((UTF8.wchar * UTF8.wchar * int) list * int list) Vector.vector = Vector.fromList [] fun yystreamify' p input = ULexBuffer.mkStream (p, input) fun yystreamifyReader' p readFn strm = let val s = ref strm fun iter(strm, n, accum) = if n > 1024 then (String.implode (rev accum), strm) else (case readFn strm of NONE => (String.implode (rev accum), strm) | SOME(c, strm') => iter (strm', n+1, c::accum)) fun input() = let val (data, strm) = iter(!s, 0, []) in s := strm; data end in yystreamify' p input end fun yystreamifyInstream' p strm = yystreamify' p (fn ()=>TextIO.input strm) fun innerLex (yystrm_, yyss_, yysm) = let (* current start state *) val yyss = ref yyss_ fun YYBEGIN ss = (yyss := ss) (* current input stream *) val yystrm = ref yystrm_ fun yysetStrm strm = yystrm := strm fun yygetPos() = ULexBuffer.getpos (!yystrm) fun yystreamify input = yystreamify' (yygetPos()) input fun yystreamifyReader readFn strm = yystreamifyReader' (yygetPos()) readFn strm fun yystreamifyInstream strm = yystreamifyInstream' (yygetPos()) strm (* start position of token -- can be updated via skip() *) val yystartPos = ref (yygetPos()) (* get one char of input *) fun yygetc strm = (case ULexBuffer.getu strm of (SOME (0w10, s')) => (AntlrStreamPos.markNewLine yysm (ULexBuffer.getpos strm); SOME (0w10, s')) | x => x) fun yygetList getc strm = let val get1 = UTF8.getu getc fun iter (strm, accum) = (case get1 strm of NONE => rev accum | SOME (w, strm') => iter (strm', w::accum) (* end case *)) in iter (strm, []) end (* create yytext *) fun yymksubstr(strm) = ULexBuffer.subtract (strm, !yystrm) fun yymktext(strm) = Substring.string (yymksubstr strm) fun yymkunicode(strm) = yygetList Substring.getc (yymksubstr strm) open UserDeclarations fun lex () = let fun yystuck (yyNO_MATCH) = raise Fail "lexer reached a stuck state" | yystuck (yyMATCH (strm, action, old)) = action (strm, old) val yypos = yygetPos() fun yygetlineNo strm = AntlrStreamPos.lineNo yysm (ULexBuffer.getpos strm) fun yygetcolNo strm = AntlrStreamPos.colNo yysm (ULexBuffer.getpos strm) fun yyactsToMatches (strm, [], oldMatches) = oldMatches | yyactsToMatches (strm, act::acts, oldMatches) = yyMATCH (strm, act, yyactsToMatches (strm, acts, oldMatches)) fun yygo actTable = (fn (~1, _, oldMatches) => yystuck oldMatches | (curState, strm, oldMatches) => let val (transitions, finals') = Vector.sub (yytable, curState) val finals = List.map (fn i => Vector.sub (actTable, i)) finals' fun tryfinal() = yystuck (yyactsToMatches (strm, finals, oldMatches)) fun find (c, []) = NONE | find (c, (c1, c2, s)::ts) = if c1 <= c andalso c <= c2 then SOME s else find (c, ts) in case yygetc strm of SOME(c, strm') => (case find (c, transitions) of NONE => tryfinal() | SOME n => yygo actTable (n, strm', yyactsToMatches (strm, finals, oldMatches))) | NONE => tryfinal() end) val yylastwasnref = ref (ULexBuffer.lastWasNL (!yystrm)) fun continue() = let val yylastwasn = !yylastwasnref in let fun yyAction0 (strm, lastMatch : yymatch) = (yystrm := strm; T.WHITE ) fun yyAction1 (strm, lastMatch : yymatch) = (yystrm := strm; skip() (* comment *)) fun yyAction2 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.SYMBOL (yytext) end fun yyAction3 (strm, lastMatch : yymatch) = (yystrm := strm; T.QUOTE ) fun yyAction4 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.PAREN, T.OPEN) ) fun yyAction5 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.PAREN, T.CLOSE) ) fun yyAction6 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.BRACKET, T.OPEN) ) fun yyAction7 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.BRACKET, T.CLOSE) ) fun yyAction8 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.BRACE, T.OPEN) ) fun yyAction9 (strm, lastMatch : yymatch) = (yystrm := strm; T.DELIM (T.BRACE, T.CLOSE) ) fun yyAction10 (strm, lastMatch : yymatch) = (yystrm := strm; T.KW_true ) fun yyAction11 (strm, lastMatch : yymatch) = (yystrm := strm; T.KW_false ) fun yyAction12 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; let (* TODO Doesn't StringCvt.HEX handle stripping the "0x" prefix? *) val digits = if String.isPrefix "+" yytext (* "+0xdeadbeef" *) then String.extract(yytext, 3, NONE) else if String.isPrefix "-" yytext (* "-0xdeadbeef" *) then "-" ^ String.extract(yytext, 3, NONE) else String.extract(yytext, 2, NONE) (* "0xdeadbeef" *) val SOME(value) = StringCvt.scanString (IntInf.scan StringCvt.HEX) digits in T.INT(value) end end fun yyAction13 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.INT(valOf(IntInf.fromString yytext)) end fun yyAction14 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; float yytext end fun yyAction15 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; float yytext end fun yyAction16 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; float yytext end fun yyAction17 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN S; continue() ) fun yyAction18 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\\"; continue() ) fun yyAction19 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\""; continue() ) fun yyAction20 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\b"; continue() ) fun yyAction21 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\f"; continue() ) fun yyAction22 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\n"; continue() ) fun yyAction23 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\r"; continue() ) fun yyAction24 (strm, lastMatch : yymatch) = (yystrm := strm; addStr "\t"; continue() ) fun yyAction25 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addUChr yytext; continue() end fun yyAction26 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addStr yytext; continue() end fun yyAction27 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN INITIAL; finishString() ) fun yyAction28 (strm, lastMatch : yymatch) = (yystrm := strm; skip() ) fun yyQ31 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction9(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction9(strm, yyNO_MATCH) (* end case *)) fun yyQ30 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction8(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction8(strm, yyNO_MATCH) (* end case *)) fun yyQ29 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction7(strm, yyNO_MATCH) (* end case *)) fun yyQ28 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction6(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction6(strm, yyNO_MATCH) (* end case *)) fun yyQ33 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction1(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxB then yyAction1(strm, yyNO_MATCH) else if inp < 0wxB then if inp = 0wxA then yyQ33(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else yyAction1(strm, yyNO_MATCH) else if inp = 0wxD then yyQ33(strm', yyMATCH(strm, yyAction1, yyNO_MATCH)) else yyAction1(strm, yyNO_MATCH) (* end case *)) fun yyQ32 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wxB then yyQ32(strm', lastMatch) else if inp < 0wxB then if inp = 0wxA then yyQ33(strm', lastMatch) else yyQ32(strm', lastMatch) else if inp = 0wxD then yyQ33(strm', lastMatch) else yyQ32(strm', lastMatch) (* end case *)) fun yyQ27 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction28(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxB then yyQ32(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else if inp < 0wxB then if inp = 0wxA then yyQ33(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else yyQ32(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else if inp = 0wxD then yyQ33(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else yyQ32(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) (* end case *)) fun yyQ38 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction15(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ38(strm', yyMATCH(strm, yyAction15, yyNO_MATCH)) else if inp < 0wx30 then yyAction15(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ38(strm', yyMATCH(strm, yyAction15, yyNO_MATCH)) else yyAction15(strm, yyNO_MATCH) (* end case *)) fun yyQ37 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx30 then yyQ38(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ38(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ36 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx2D then yyQ37(strm', lastMatch) else if inp < 0wx2D then if inp = 0wx2B then yyQ37(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx30 then yyQ38(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ38(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ42 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction16(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ42(strm', yyMATCH(strm, yyAction16, yyNO_MATCH)) else if inp < 0wx30 then yyAction16(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ42(strm', yyMATCH(strm, yyAction16, yyNO_MATCH)) else yyAction16(strm, yyNO_MATCH) (* end case *)) fun yyQ41 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx30 then yyQ42(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ42(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ40 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx2D then yyQ41(strm', lastMatch) else if inp < 0wx2D then if inp = 0wx2B then yyQ41(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx30 then yyQ42(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ42(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ39 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction14(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx45 then yyQ40(strm', yyMATCH(strm, yyAction14, yyNO_MATCH)) else if inp < 0wx45 then if inp = 0wx30 then yyQ39(strm', yyMATCH(strm, yyAction14, yyNO_MATCH)) else if inp < 0wx30 then yyAction14(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ39(strm', yyMATCH(strm, yyAction14, yyNO_MATCH)) else yyAction14(strm, yyNO_MATCH) else if inp = 0wx65 then yyQ40(strm', yyMATCH(strm, yyAction14, yyNO_MATCH)) else yyAction14(strm, yyNO_MATCH) (* end case *)) fun yyQ34 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx30 then yyQ39(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ39(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ35 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyAction13(strm, yyNO_MATCH) else if inp < 0wx3A then if inp = 0wx2F then yyAction13(strm, yyNO_MATCH) else if inp < 0wx2F then if inp = 0wx2E then yyQ34(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else yyQ35(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else if inp = 0wx46 then yyAction13(strm, yyNO_MATCH) else if inp < 0wx46 then if inp = 0wx45 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else if inp = 0wx65 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ26 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyAction13(strm, yyNO_MATCH) else if inp < 0wx3A then if inp = 0wx2F then yyAction13(strm, yyNO_MATCH) else if inp < 0wx2F then if inp = 0wx2E then yyQ34(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else yyQ35(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else if inp = 0wx46 then yyAction13(strm, yyNO_MATCH) else if inp < 0wx46 then if inp = 0wx45 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else if inp = 0wx65 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ44 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction12(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx30 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp < 0wx30 then yyAction12(strm, yyNO_MATCH) else if inp <= 0wx39 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) else if inp = 0wx61 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp < 0wx61 then if inp <= 0wx46 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) else if inp <= 0wx66 then yyQ44(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) (* end case *)) fun yyQ43 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ44(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ44(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ44(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ44(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ44(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ44(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ25 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx46 then yyAction13(strm, yyNO_MATCH) else if inp < 0wx46 then if inp = 0wx2F then yyAction13(strm, yyNO_MATCH) else if inp < 0wx2F then if inp = 0wx2E then yyQ34(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else if inp = 0wx45 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else if inp = 0wx66 then yyAction13(strm, yyNO_MATCH) else if inp < 0wx66 then if inp = 0wx65 then yyQ36(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) else if inp = 0wx78 then yyQ43(strm', yyMATCH(strm, yyAction13, yyNO_MATCH)) else yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ45 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx61 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then if inp <= 0wx5A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ52 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ52(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ51 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ52(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ50 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ52(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx2D then yyQ51(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2D then if inp = 0wx2B then yyQ51(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ52(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ56 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ56(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ55 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ56(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ54 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx30 then yyQ56(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx2D then yyQ55(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2D then if inp = 0wx2B then yyQ55(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ56(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ53 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3C then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx30 then yyQ53(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ53(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx61 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx45 then yyQ54(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then yyAction2(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx65 then yyQ54(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ48 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ53(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ49 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2F then if inp = 0wx2D then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ48(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ49(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx61 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx45 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then yyAction2(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx65 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ47 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2F then if inp = 0wx2D then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ48(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ49(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx61 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx45 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then yyAction2(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx65 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ58 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3C then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx30 then yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx47 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx47 then if inp <= 0wx40 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp <= 0wx66 then yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ57 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3C then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx30 then yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx47 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx47 then if inp <= 0wx40 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp <= 0wx66 then yyQ58(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ46 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx45 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx45 then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2F then if inp = 0wx2D then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ48(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx66 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx66 then if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx65 then yyQ50(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx7B then if inp = 0wx78 then yyQ57(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ24 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx3A then if inp = 0wx2A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2A then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx24 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx24 then yyAction2(strm, yyNO_MATCH) else if inp <= 0wx26 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx2D then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx2D then if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx30 then yyQ46(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx2F then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ47(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx5B then if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp <= 0wx5D then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ23 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction5(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction5(strm, yyNO_MATCH) (* end case *)) fun yyQ22 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction4(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction4(strm, yyNO_MATCH) (* end case *)) fun yyQ21 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction3(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction3(strm, yyNO_MATCH) (* end case *)) fun yyQ60 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction10(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction10(strm, yyNO_MATCH) (* end case *)) fun yyQ59 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction11(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction11(strm, yyNO_MATCH) (* end case *)) fun yyQ20 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction28(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx67 then yyAction28(strm, yyNO_MATCH) else if inp < 0wx67 then if inp = 0wx66 then yyQ59(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else yyAction28(strm, yyNO_MATCH) else if inp = 0wx74 then yyQ60(strm', yyMATCH(strm, yyAction28, yyNO_MATCH)) else yyAction28(strm, yyNO_MATCH) (* end case *)) fun yyQ19 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ18 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3B then yyAction2(strm, yyNO_MATCH) else if inp < 0wx3B then if inp = 0wx27 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx27 then if inp = 0wx22 then yyAction2(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wx21 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp <= 0wx23 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx2C then yyAction2(strm, yyNO_MATCH) else if inp < 0wx2C then if inp <= 0wx29 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx61 then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx5E then if inp <= 0wx5A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction2(strm, yyNO_MATCH) else yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp = 0wx7E then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else if inp < 0wx7E then if inp <= 0wx7A then yyQ45(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ61 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxD then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wxD then if inp = 0wx9 then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wx9 then yyAction0(strm, yyNO_MATCH) else if inp <= 0wxA then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) else if inp = 0wx20 then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ17 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxD then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wxD then if inp = 0wx9 then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else if inp < 0wx9 then yyAction0(strm, yyNO_MATCH) else if inp <= 0wxA then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) else if inp = 0wx20 then yyQ61(strm', yyMATCH(strm, yyAction0, yyNO_MATCH)) else yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ16 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction28(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction28(strm, yyNO_MATCH) (* end case *)) fun yyQ1 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx2E then yyQ18(strm', lastMatch) else if inp < 0wx2E then if inp = 0wx23 then yyQ20(strm', lastMatch) else if inp < 0wx23 then if inp = 0wxE then yyQ16(strm', lastMatch) else if inp < 0wxE then if inp = 0wxB then yyQ16(strm', lastMatch) else if inp < 0wxB then if inp <= 0wx8 then yyQ16(strm', lastMatch) else yyQ17(strm', lastMatch) else if inp = 0wxD then yyQ17(strm', lastMatch) else yyQ16(strm', lastMatch) else if inp = 0wx21 then yyQ18(strm', lastMatch) else if inp < 0wx21 then if inp = 0wx20 then yyQ17(strm', lastMatch) else yyQ16(strm', lastMatch) else yyQ19(strm', lastMatch) else if inp = 0wx2A then yyQ18(strm', lastMatch) else if inp < 0wx2A then if inp = 0wx28 then yyQ22(strm', lastMatch) else if inp < 0wx28 then if inp = 0wx27 then yyQ21(strm', lastMatch) else yyQ18(strm', lastMatch) else yyQ23(strm', lastMatch) else if inp = 0wx2C then yyQ16(strm', lastMatch) else yyQ24(strm', lastMatch) else if inp = 0wx5D then yyQ29(strm', lastMatch) else if inp < 0wx5D then if inp = 0wx3B then yyQ27(strm', lastMatch) else if inp < 0wx3B then if inp = 0wx31 then yyQ26(strm', lastMatch) else if inp < 0wx31 then if inp = 0wx30 then yyQ25(strm', lastMatch) else yyQ18(strm', lastMatch) else if inp = 0wx3A then yyQ18(strm', lastMatch) else yyQ26(strm', lastMatch) else if inp = 0wx5B then yyQ28(strm', lastMatch) else if inp = 0wx5C then yyQ16(strm', lastMatch) else yyQ18(strm', lastMatch) else if inp = 0wx7C then yyQ16(strm', lastMatch) else if inp < 0wx7C then if inp = 0wx61 then yyQ18(strm', lastMatch) else if inp < 0wx61 then if inp = 0wx60 then yyQ16(strm', lastMatch) else yyQ18(strm', lastMatch) else if inp = 0wx7B then yyQ30(strm', lastMatch) else yyQ18(strm', lastMatch) else if inp = 0wx7E then yyQ18(strm', lastMatch) else if inp = 0wx7D then yyQ31(strm', lastMatch) else yyQ16(strm', lastMatch) (* end case *)) fun yyQ15 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction25(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction25(strm, yyNO_MATCH) (* end case *)) fun yyQ14 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ15(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ15(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ15(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ15(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ15(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ15(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ13 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ14(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ14(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ14(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ14(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ14(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ12 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ13(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ13(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ13(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ13(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ13(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ13(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ11 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ12(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ12(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ12(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ12(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ12(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ12(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ10 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction24(strm, yyNO_MATCH) (* end case *)) fun yyQ9 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction23(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction23(strm, yyNO_MATCH) (* end case *)) fun yyQ8 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction22(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction22(strm, yyNO_MATCH) (* end case *)) fun yyQ7 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction21(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction21(strm, yyNO_MATCH) (* end case *)) fun yyQ6 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction20(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction20(strm, yyNO_MATCH) (* end case *)) fun yyQ5 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction19(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction19(strm, yyNO_MATCH) (* end case *)) fun yyQ4 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction18(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx6E then yyQ8(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else if inp < 0wx6E then if inp = 0wx62 then yyQ6(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else if inp < 0wx62 then if inp = 0wx22 then yyQ5(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else yyAction18(strm, yyNO_MATCH) else if inp = 0wx66 then yyQ7(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else yyAction18(strm, yyNO_MATCH) else if inp = 0wx74 then yyQ10(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else if inp < 0wx74 then if inp = 0wx72 then yyQ9(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else yyAction18(strm, yyNO_MATCH) else if inp = 0wx75 then yyQ11(strm', yyMATCH(strm, yyAction18, yyNO_MATCH)) else yyAction18(strm, yyNO_MATCH) (* end case *)) fun yyQ3 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction27(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction27(strm, yyNO_MATCH) (* end case *)) fun yyQ2 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction26(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx23 then yyQ2(strm', yyMATCH(strm, yyAction26, yyNO_MATCH)) else if inp < 0wx23 then if inp = 0wx22 then yyAction26(strm, yyNO_MATCH) else yyQ2(strm', yyMATCH(strm, yyAction26, yyNO_MATCH)) else if inp = 0wx5C then yyAction26(strm, yyNO_MATCH) else yyQ2(strm', yyMATCH(strm, yyAction26, yyNO_MATCH)) (* end case *)) fun yyQ0 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx23 then yyQ2(strm', lastMatch) else if inp < 0wx23 then if inp = 0wx22 then yyQ3(strm', lastMatch) else yyQ2(strm', lastMatch) else if inp = 0wx5C then yyQ4(strm', lastMatch) else yyQ2(strm', lastMatch) (* end case *)) in (case (!(yyss)) of S => yyQ0(!(yystrm), yyNO_MATCH) | INITIAL => yyQ1(!(yystrm), yyNO_MATCH) (* end case *)) end end and skip() = (yystartPos := yygetPos(); yylastwasnref := ULexBuffer.lastWasNL (!yystrm); continue()) in (continue(), (!yystartPos, yygetPos()), !yystrm, !yyss) end in lex() end in type pos = AntlrStreamPos.pos type span = AntlrStreamPos.span type tok = UserDeclarations.lex_result datatype prestrm = STRM of ULexBuffer.stream * (yystart_state * tok * span * prestrm * yystart_state) option ref type strm = (prestrm * yystart_state) fun lex sm (STRM (yystrm, memo), ss) = (case !memo of NONE => let val (tok, span, yystrm', ss') = innerLex (yystrm, ss, sm) val strm' = STRM (yystrm', ref NONE); in memo := SOME (ss, tok, span, strm', ss'); (tok, span, (strm', ss')) end | SOME (ss', tok, span, strm', ss'') => if ss = ss' then (tok, span, (strm', ss'')) else ( memo := NONE; lex sm (STRM (yystrm, memo), ss)) (* end case *)) fun streamify input = (STRM (yystreamify' 0 input, ref NONE), INITIAL) fun streamifyReader readFn strm = (STRM (yystreamifyReader' 0 readFn strm, ref NONE), INITIAL) fun streamifyInstream strm = (STRM (yystreamifyInstream' 0 strm, ref NONE), INITIAL) fun getPos (STRM (strm, _), _) = ULexBuffer.getpos strm end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/sexp.sml000066400000000000000000000031661416264345000227330ustar00rootroot00000000000000(* sexp.sml * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Author: Damon Wang (with modifications by John Reppy) * * This is the tree representation of a SExp data as produced/consumed * by the tree parser. *) structure SExp = struct datatype value = SYMBOL of Atom.atom | BOOL of bool | INT of IntInf.int | FLOAT of real | STRING of string | QUOTE of value | LIST of value list fun same (SYMBOL a, SYMBOL b) = Atom.same (a, b) | same (BOOL a, BOOL b) = (a = b) | same (INT a, INT b) = (a = b) | same (FLOAT a, FLOAT b) = Real.==(a, b) | same (STRING a, STRING b) = (a = b) | same (QUOTE a, QUOTE b) = same(a, b) | same (LIST a, LIST b) = ListPair.allEq same (a, b) | same _ = false fun compare (a, b) = (case (a, b) of (SYMBOL a, SYMBOL b) => Atom.compare(a, b) | (SYMBOL _, _) => LESS | (_, SYMBOL _) => GREATER | (BOOL a, BOOL b) => if (a = b) then EQUAL else if a then LESS else GREATER | (BOOL _, _) => LESS | (_, BOOL _) => GREATER | (INT a, INT b) => IntInf.compare (a, b) | (INT _, _) => LESS | (_, INT _) => GREATER | (FLOAT a, FLOAT b) => Real.compare(a, b) | (FLOAT _, _) => LESS | (_, FLOAT _) => GREATER | (STRING a, STRING b) => String.compare(a, b) | (STRING _, _) => LESS | (_, STRING _) => GREATER | (QUOTE a, QUOTE b) => compare(a, b) | (QUOTE _, _) => LESS | (_, QUOTE _) => GREATER | (LIST a, LIST b) => List.collate compare (a, b) (* end case *)) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/SExp/test-pp.sml000066400000000000000000000015011416264345000233370ustar00rootroot00000000000000(* test-pp.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Test the pretty printing of S-Expressions. *) structure TestPP = struct local structure S = SExp structure PP = TextIOPP fun pr wid sexp = let val ppStrm = PP.openOut{dst = TextIO.stdOut, wid=wid} in SExpPP.output (ppStrm, sexp); PP.closeStream ppStrm end fun list items = S.LIST(S.SYMBOL(Atom.atom "list") :: items) in (* a large list *) fun prList wid = pr wid (list (List.tabulate(100, fn i => S.INT(IntInf.fromInt i)))) (* list of lists *) fun prListOfLists wid = let fun mkList n = list (List.tabulate(n, fn i => S.INT(IntInf.fromInt i))) in pr wid (list (List.tabulate(50, mkList))) end end (* local *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/TODO000066400000000000000000000023661416264345000210510ustar00rootroot00000000000000Utility library --------------- Polymorphic version of dynamic arrays. New hash table implementation/API. HTML Library ------------ Rewrite parser as recursive descent (the ML-Yacc version doesn't handle whitespace in the HEAD element very well). PP Library ---------- Add support for tabular layout. RegExp library -------------- Add support for Interval REs to the DFA and Thompson engines Add support for "$" to the Thompson engine Add support for POSIX character classes to the AWK syntax. These are [:alnum:] Alphanumeric characters. [:alpha:] Alphabetic characters. [:blank:] Space and TAB characters. [:cntrl:] Control characters. [:digit:] Decimal digits. [:graph:] Characters that are both printable and visible. (A space is printable but not visible, whereas an ‘a’ is both.) [:lower:] Lowercase alphabetic characters. [:print:] Printable characters (characters that are not control characters). [:punct:] Punctuation characters (characters that are not letters, digits, control characters, or space characters). [:space:] Space characters (such as space, TAB, and formfeed, etc). [:upper:] Uppercase alphabetic characters. [:xdigit:] Hexadecimal digits. New libraries ------------- CGI scripting mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/000077500000000000000000000000001416264345000211205ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/README000066400000000000000000000005331416264345000220010ustar00rootroot00000000000000This is a library for generating "Universally Unique IDentifiers" (UUIDs). It currently only supports generating Variant 1, Type 4 UUIDs, which are random bit strings (these are the UUIDs generated by the `NewGuid` function on Microsoft Windows). See https://en.wikipedia.org/wiki/Universally_unique_identifier for more information about GUIDs. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/gen-uuid.sml000066400000000000000000000030551416264345000233550ustar00rootroot00000000000000(* gen-uuid.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure GenUUID : sig (* generate a new Variant 1, Type 4 UUID. *) val new : unit -> UUID.t end = struct structure W8V = Word8Vector (* maximum `int` value plus 1 *) val maxInt = IntInf.fromInt (valOf Int.maxInt) + 1 (* get the current time as (seconds, useconds) *) fun getTime () = IntInf.divMod (Time.toMicroseconds(Time.now()), 1000000) fun seedRand () = let val (secs, usecs) = getTime () (* initial random seed *) val r = Random.rand (Int.fromLarge(secs mod maxInt), Int.fromLarge usecs) (* run the random number generator a few steps *) val r = let val n = let val (s, us) = getTime() in IntInf.andb(IntInf.xorb(secs, usecs), 0x1F) end fun lp 0 = r | lp i = (ignore (Random.randInt r); lp (i-1)) in lp n end in r end fun randByte r () = let val w = LargeWord.fromInt(Random.randInt r) in Word8.fromLargeWord(LargeWord.>>(w, 0w7)) end (* generate a Variant 1, Type 4 UUID. *) fun new () = let val randByte = randByte (seedRand()) fun gen 6 = let (* byte 6 has the version (0b0100) in the upper 4 bits *) val b = randByte() in Word8.orb(0wx40, Word8.andb(b, 0wxF)) end | gen 8 = let (* byte 8 has the variant (0b10) in the upper 2 bits *) val b = randByte() in Word8.orb(0wx80, Word8.andb(b, 0wx3F)) end | gen _ = randByte() in UUID.fromBytes (W8V.tabulate(16, gen)) end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/uuid-lib.cm000066400000000000000000000004061416264345000231530ustar00rootroot00000000000000(* uuid-lib.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Sources file for UUID library. *) Library structure UUID structure GenUUID is $/basis.cm $/smlnj-lib.cm gen-uuid.sml uuid.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/uuid-lib.mlb000066400000000000000000000100261416264345000233250ustar00rootroot00000000000000 ann "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l4 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l8 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in structure gs_0 = Word8Vector end local open l8 in structure gs_1 = Random end local open l4 in structure gs_2 = Char structure gs_3 = CharArray structure gs_4 = CharVector structure gs_5 = FixedInt structure gs_6 = General structure gs_7 = Int structure gs_8 = Int32 structure gs_9 = Int64 structure gs_10 = IntInf structure gs_11 = LargeInt structure gs_12 = LargeReal structure gs_13 = LargeWord structure gs_14 = OS structure gs_15 = Position structure gs_16 = Real structure gs_17 = Real64 structure gs_18 = RealArray structure gs_19 = RealArraySlice structure gs_20 = RealVector structure gs_21 = RealVectorSlice structure gs_22 = SMLofNJ structure gs_23 = Socket structure gs_24 = String structure gs_25 = Substring structure gs_26 = SysWord structure gs_27 = Time structure gs_28 = Word structure gs_29 = Word32 structure gs_30 = Word64 structure gs_31 = Word8 end local open l4 in structure gs_32 = Word8VectorSlice end local open l4 in structure gs_33 = List end local open l4 in structure gs_34 = StringCvt end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_33 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure StringCvt = gs_34 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 structure Word8Vector = gs_0 structure Word8VectorSlice = gs_32 uuid.sml in structure gs_35 = UUID end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure OS = gs_14 structure Position = gs_15 structure Random = gs_1 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure UUID = gs_35 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 structure Word8Vector = gs_0 gen-uuid.sml in structure gs_36 = GenUUID end in structure GenUUID = gs_36 structure UUID = gs_35 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/UUID/uuid.sml000066400000000000000000000076211416264345000226110ustar00rootroot00000000000000(* uuid.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * An implementation of Universally Unique IDs (UUIDs). To generate * UUIDs, use the GenUUID structure. *) structure UUID :> sig type t (* the all-zeros UUID *) val null : t (* compare two UUIDs *) val compare : t * t -> order (* are two UUIDs the same *) val same : t * t -> bool (* hash a UUID; we use the 64-bit FNV-1a hash function for this purpose *) val hash : t -> word (* format the UUID as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" where each "x" is * a lower-case hexadecimal digit. *) val toString : t -> string (* convert a string of the form produced by `toString` to a UUID value; leading whitespace * is ignored. *) val fromString : string -> t option (* return the UUID as a big-endian sequence of bytes *) val toBytes : t -> Word8Vector.vector (* convert a 16-element byte vector to a UUID. The Size exception is raised * if the length of the vector is not exactly 16 bytes. Otherwise, there is * no validity chechking of the UUID (i.e., the variant and type are not checked). *) val fromBytes : Word8Vector.vector -> t end = struct structure W8V = Word8Vector structure W8VS = Word8VectorSlice structure SS = Substring type t = W8V.vector val null : t = W8V.tabulate(16, fn _ => 0w0) (* compare two UUIDs *) val compare = W8V.collate Word8.compare fun same (uuid1 : t, uuid2 : t) = (uuid1 = uuid2) (* NOTE: For 110.98, we can switch to using the new FNVHash module in the Util library *) (* hash a UUID; we use the 64-bit FNV-1a hash function for this purpose *) fun hash uuid = let val offsetBasis : Word64.word = 0wxcbf29ce484222325 val prime : Word64.word = 0wx00000100000001B3 fun hashByte (b, h) = Word64.xorb (Word64.fromLargeWord(Word8.toLargeWord b), h) * prime in Word.fromLarge(W8V.foldl hashByte offsetBasis uuid) end fun toString (uuid : t) = let fun n2c b = String.sub("0123456789abcdef", Word8.toInt b) fun b2list (b, l) = n2c(Word8.>>(b, 0w4)) :: n2c(Word8.andb(b, 0wxf)) :: l fun slice2list (start, len, l) = W8VS.foldr b2list l (W8VS.slice(uuid, start, SOME len)) val chrs = slice2list (10, 6, []) val chrs = slice2list (8, 2, #"-" :: chrs) val chrs = slice2list (6, 2, #"-" :: chrs) val chrs = slice2list (4, 2, #"-" :: chrs) val chrs = slice2list (0, 4, #"-" :: chrs) in String.implode chrs end local (* the lengths of the fields *) val fieldLens = [8, 4, 4, 4, 12] val scan8 = Word8.scan StringCvt.HEX SS.getc (* converts a list of fields to a list of bytes. If there is the wrong number of * fields, or an incorrect length field, or a invalid digit, then `NONE` is * returned. *) fun fields2bytes flds = let fun toBytes ([], [], bytes) = SOME(List.rev bytes) | toBytes (fld::flds, len::lens, bytes) = if SS.size fld <> len then NONE else let fun lp (ss, bytes) = if SS.isEmpty ss then toBytes (flds, lens, bytes) else let val (b, rest) = SS.splitAt (ss, 2) in case scan8 b of SOME(b, _) => lp (rest, b::bytes) | NONE => NONE end in lp (fld, bytes) end | toBytes _ = NONE in toBytes (flds, fieldLens, []) end val splitFields = SS.fields (fn #"-" => true | _ => false) in fun fromString s = let val ss = StringCvt.skipWS SS.getc (SS.full s) in (* the length of the UUID should be 36 characters (32 digits plus four "-"s) *) if (SS.size ss >= 36) then (case fields2bytes(splitFields (SS.slice(ss, 0, SOME 36))) of SOME bytes => SOME(W8V.fromList bytes) | _ => NONE (* end case *)) else NONE end end (* local *) fun toBytes uuid = uuid fun fromBytes v = if (W8V.length v <> 16) then raise Size else v end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/000077500000000000000000000000001416264345000212755ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-env-sig.sml000066400000000000000000000023531416264345000243460ustar00rootroot00000000000000(* unix-env-sig.sml * * COPYRIGHT (c) 2007 The Fellowship of SML/NJ (http://smlnj.org) * All rights reserved. * * A UNIX environment is a list of strings of the form "name=value", where * the "=" character does not appear in name. * NOTE: binding the user's environment as an ML value and then exporting the * ML image can result in incorrect behavior, since the environment bound in the * heap image may differ from the user's environment when the exported image * is used. *) signature UNIX_ENV = sig val getFromEnv : (string * string list) -> string option (* return the value, if any, bound to the name. *) val getValue : {name : string, default : string, env : string list} -> string (* return the value bound to the name, or a default value *) val removeFromEnv : (string * string list) -> string list (* remove a binding from an environment *) val addToEnv : (string * string list) -> string list (* add a binding to an environment, replacing an existing binding * if necessary. *) val environ : unit -> string list (* return the user's environment *) val getEnv : string -> string option (* return the binding of an environment variable in the * user's environment. *) end; (* UNIX_ENV *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-env.sml000066400000000000000000000040661416264345000235710ustar00rootroot00000000000000(* unix-env.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * A UNIX environment is a list of strings of the form "name=value", where * the "=" character does not appear in name. * NOTE: binding the user's environment as an ML value and then exporting the * ML image can result in incorrect behavior, since the environment bound in the * heap image may differ from the user's environment when the exported image * is used. *) structure UnixEnv : UNIX_ENV = struct structure SS = Substring local fun notEqual #"=" = false | notEqual _ = true val split = SS.splitl notEqual in fun splitBinding s = let val (a, b) = split(SS.full s) in if SS.isEmpty b then (s, "") else (SS.string a, SS.string(SS.triml 1 b)) end end (* return the value, if any, bound to the name. *) fun getFromEnv (name, env) = let fun look [] = NONE | look (s::r) = let val (n, v) = splitBinding s in if (n = name) then (SOME v) else look r end in look env end (* return the value bound to the name, or a default value *) fun getValue {name, default, env} = (case getFromEnv(name, env) of (SOME s) => s | NONE => default (* end case *)) (* remove a binding from an environment *) fun removeFromEnv (name, env) = let fun look [] = [] | look (s::r) = let val (n, v) = splitBinding s in if (n = name) then r else (s :: look r) end in look env end (* add a binding to an environment, replacing an existing binding * if necessary. *) fun addToEnv (nameValue, env) = let val (name, _) = splitBinding nameValue fun look [] = [nameValue] | look (s::r) = let val (n, v) = splitBinding s in if (n = name) then r else (s :: look r) end in look env end (* return the user's environment *) val environ = Posix.ProcEnv.environ (* return the binding of an environment variable in the * user's environment. *) fun getEnv name = getFromEnv(name, environ()) end; (* UnixEnv *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-lib.cm000066400000000000000000000007021416264345000233440ustar00rootroot00000000000000(* unix-lib.cm * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Sources file for Unix utility library; part of the SML/NJ library suite. *) Library signature UNIX_ENV signature UNIX_PATH structure UnixEnv structure UnixPath is #if defined(NEW_CM) $/basis.cm $/smlnj-lib.cm #else ../Util/smlnj-lib.cm #endif unix-env-sig.sml unix-env.sml unix-path-sig.sml unix-path.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-lib.mlb000066400000000000000000000116631416264345000235270ustar00rootroot00000000000000 ann "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l8 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l4 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in structure gs_0 = PathUtil end local open l8 in structure gs_1 = Posix end local open l8 in structure gs_2 = Char structure gs_3 = CharArray structure gs_4 = CharVector structure gs_5 = FixedInt structure gs_6 = General structure gs_7 = Int structure gs_8 = Int32 structure gs_9 = Int64 structure gs_10 = IntInf structure gs_11 = LargeInt structure gs_12 = LargeReal structure gs_13 = LargeWord structure gs_14 = OS structure gs_15 = Position structure gs_16 = Real structure gs_17 = Real64 structure gs_18 = RealArray structure gs_19 = RealArraySlice structure gs_20 = RealVector structure gs_21 = RealVectorSlice structure gs_22 = SMLofNJ structure gs_23 = Socket structure gs_24 = String structure gs_25 = Substring structure gs_26 = SysWord structure gs_27 = Time structure gs_28 = Word structure gs_29 = Word32 structure gs_30 = Word64 structure gs_31 = Word8 end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 unix-path-sig.sml in signature gs_32 = UNIX_PATH end local unix-env-sig.sml in signature gs_33 = UNIX_ENV end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure OS = gs_14 structure Position = gs_15 structure Posix = gs_1 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 signature UNIX_ENV = gs_33 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 unix-env.sml in structure gs_34 = UnixEnv end local structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure OS = gs_14 structure PathUtil = gs_0 structure Position = gs_15 structure Posix = gs_1 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 signature UNIX_PATH = gs_32 structure UnixEnv = gs_34 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 unix-path.sml in structure gs_35 = UnixPath end in signature UNIX_ENV = gs_33 signature UNIX_PATH = gs_32 structure UnixEnv = gs_34 structure UnixPath = gs_35 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-path-sig.sml000066400000000000000000000027251416264345000245150ustar00rootroot00000000000000(* unix-path-sig.sml * * COPYRIGHT (c) 2007 The Fellowship of SML/NJ (http://smlnj.org) * All rights reserved. * * Note that this module is largely superseded by the `PathUtil` module * in the *Util Library*. *) signature UNIX_PATH = sig type path_list = string list (* get the user's PATH environment variable. *) val getPath : unit -> path_list datatype access_mode = datatype OS.FileSys.access_mode datatype file_type = F_REGULAR | F_DIR | F_SYMLINK | F_SOCK | F_CHR | F_BLK (* findFile (paths, mode) name * returns the p/name, where p is the first path in paths such that p/name * has the given access modes. *) val findFile : (path_list * access_mode list) -> string -> string option (* findFiles (paths, mode) name * returns a list of p/name, where p is in paths and p/name has the given access modes. *) val findFiles : (path_list * access_mode list) -> string -> string list (* findFileOfType (paths, ftype, mode) name * returns the p/name, where p is the first path in paths such that p/name * has the given file type and access mode. *) val findFileOfType : (path_list * file_type * access_mode list) -> string -> string option (* findFileOfTypes (paths, ftype, mode) name * returns a list of p/name, where p is in paths and p/name has the given file type * and access mode. *) val findFilesOfType : (path_list * file_type * access_mode list) -> string -> string list end (* UNIX_PATH *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Unix/unix-path.sml000066400000000000000000000030611416264345000237270ustar00rootroot00000000000000(* unix-path.sml * * COPYRIGHT (c) 2007 The Fellowship of SML/NJ (http://smlnj.org) * All rights reserved. * * Note that this module is largely superseded by the `PathUtil` module * in the *Util Library*. *) structure UnixPath : UNIX_PATH = struct datatype access_mode = datatype OS.FileSys.access_mode datatype file_type = F_REGULAR | F_DIR | F_SYMLINK | F_SOCK | F_CHR | F_BLK (** Path lists **) type path_list = string list fun getPath () = let val path = (case (UnixEnv.getEnv "PATH") of (SOME p) => p | _ => "") in String.fields (fn #":" => true | _ => false) path end (* getPath *) local structure ST = Posix.FileSys.ST fun isFileTy (path, ty) = let val st = Posix.FileSys.stat path in case ty of F_REGULAR => ST.isReg st | F_DIR => ST.isDir st | F_SYMLINK => ST.isLink st | F_SOCK => ST.isSock st | F_CHR => ST.isChr st | F_BLK => ST.isBlk st (* end case *) end fun access mode pathname = (OS.FileSys.access(pathname, mode)) fun accessAndType (mode, ftype) pathname = ( OS.FileSys.access(pathname, mode) andalso isFileTy(pathname, ftype)) handle _ => false in fun findFile (pl, mode) = PathUtil.existsFile (access mode) pl fun findFiles (pl, mode) = PathUtil.allFiles (access mode) pl fun findFileOfType (pl, ftype, mode) = PathUtil.existsFile (accessAndType(mode, ftype)) pl fun findFilesOfType (pl, ftype, mode) = PathUtil.allFiles (accessAndType(mode, ftype)) pl end (* local *) end (* UnixPath *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/000077500000000000000000000000001416264345000212675ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/NEW-UTIL-NOTES000066400000000000000000000016771416264345000233170ustar00rootroot00000000000000The **Util Library** has code that is over 30 years old and many of the interfaces could do with a redesign. Since such a change would break lots of existing code, we will instead create a new library called the **SML/NJ Util Library** with CM file `smlnj-util-lib.cm`. This file contains notes about things that should be fixed/changed in that redesign. The HASH_KEY and ORD_KEY signatures should be changed to match newer conventions. The MONO_ARRAY_SORT should have a fixed comparison function and should also contain the Binary Search function from the `BSearchFn` functor. Eliminate currying from the hash-table modules Eliminate the SplayTree and BinaryTree implementations of maps and sets; the RedBlackTree implementation is more performant across the board. We'll keep the sorted-list based versions too for a lightweight implementation. The logical bit-sequence operations in BitArray need rethinking. Specifically w.r.t. padding lengths. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/README000066400000000000000000000005131416264345000221460ustar00rootroot00000000000000This is the utility library of the SML/NJ Library. The services provided can be grouped as follows: - Data structures - Hash tables - Finite maps of ordered keys - Finite sets of ordered elements - Queues - Arrays - Searching and sorting - String conversions - Some miscellaneous utility modules. mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/TODO000066400000000000000000000001661416264345000217620ustar00rootroot00000000000000Improve implementation of unionWith/intersectWith in BinaryMapFn, IntBinaryMap, and SplayMapFn. New iterator module mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/ansi-term.sml000066400000000000000000000054571416264345000237160ustar00rootroot00000000000000(* ansi-term.sml * * COPYRIGHT (c) 2020 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * Support for ANSI terminal control codes. Currently, this support * is just for display attributes. *) structure ANSITerm : sig datatype color = Black | Red | Green | Yellow | Blue | Magenta | Cyan | White | Default datatype style = FG of color (* foreground color *) | BG of color (* background color *) | BF (* bold/bright *) | DIM (* dim *) | NORMAL (* normal intensity/brightness *) | UL (* underline *) | UL_OFF (* underline off *) | BLINK (* blinking text *) | BLINK_OFF (* blinking off *) | REV (* reverse video *) | REV_OFF (* reverse video off *) | INVIS (* invisible *) | INVIS_OFF (* invisible off *) | RESET (* return the command string for the given styles; the empty list is "normal" *) val toString : style list -> string (* output commands to set the given styles; the empty list is "normal" *) val setStyle : (TextIO.outstream * style list) -> unit end = struct datatype color = Black | Red | Green | Yellow | Blue | Magenta | Cyan | White | Default datatype style = FG of color (* foreground color *) | BG of color (* background color *) | BF (* bold/bright *) | DIM (* dim *) | NORMAL (* normal intensity/brightness *) | UL (* underline *) | UL_OFF (* underline off *) | BLINK (* blinking text *) | BLINK_OFF (* blinking off *) | REV (* reverse video *) | REV_OFF (* reverse video off *) | INVIS (* invisible *) | INVIS_OFF (* invisible off *) | RESET (* basic color codes *) fun colorToCmd Black = 0 | colorToCmd Red = 1 | colorToCmd Green = 2 | colorToCmd Yellow = 3 | colorToCmd Blue = 4 | colorToCmd Magenta = 5 | colorToCmd Cyan = 6 | colorToCmd White = 7 | colorToCmd Default = 9 (* convert style to integer command *) fun styleToCmd (FG c) = 30 + colorToCmd c | styleToCmd (BG c) = 40 + colorToCmd c | styleToCmd BF = 1 | styleToCmd DIM = 2 | styleToCmd NORMAL = 22 | styleToCmd UL = 4 | styleToCmd UL_OFF = 24 | styleToCmd BLINK = 5 | styleToCmd BLINK_OFF = 25 | styleToCmd REV = 7 | styleToCmd REV_OFF = 27 | styleToCmd INVIS = 8 | styleToCmd INVIS_OFF = 28 | styleToCmd RESET = 0 fun cmdStr [] = "" | cmdStr (cmd :: r) = let fun f (cmd, l) = ";" :: Int.toString cmd :: l in concat ("\027[" :: Int.toString cmd :: List.foldr f ["m"] r) end fun toString [] = cmdStr[0, 30] | toString stys = cmdStr(List.map styleToCmd stys) fun setStyle (outStrm, stys) = TextIO.output(outStrm, toString stys) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/array-qsort-fn.sml000066400000000000000000000134621416264345000246770ustar00rootroot00000000000000(* array-qsort-fn.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Functor for in-place sorting of abstract arrays. * Uses an engineered version of quicksort due to * Bentley and McIlroy. * *) functor ArrayQSortFn (A : MONO_ARRAY) : MONO_ARRAY_SORT = struct structure A = A fun isort (array, start, n, cmp) = let fun item i = A.sub(array,i) fun swap (i,j) = let val tmp = A.sub(array,i) in A.update(array,i,A.sub(array,j)); A.update(array,j,tmp) end fun vecswap (i,j,0) = () | vecswap (i,j,n) = (swap(i,j);vecswap(i+1,j+1,n-1)) fun insertSort (start, n) = let val limit = start+n fun outer i = if i >= limit then () else let fun inner j = if j = start then outer(i+1) else let val j' = j - 1 in if cmp(item j',item j) = GREATER then (swap(j,j'); inner j') else outer(i+1) end in inner i end in outer (start+1) end in insertSort (start, n); array end fun sortRange (array, start, n, cmp) = let fun item i = A.sub(array,i) fun swap (i,j) = let val tmp = A.sub(array,i) in A.update(array,i,A.sub(array,j)); A.update(array,j,tmp) end fun vecswap (i,j,0) = () | vecswap (i,j,n) = (swap(i,j);vecswap(i+1,j+1,n-1)) fun insertSort (start, n) = let val limit = start+n fun outer i = if i >= limit then () else let fun inner j = if j = start then outer(i+1) else let val j' = j - 1 in if cmp(item j',item j) = GREATER then (swap(j,j'); inner j') else outer(i+1) end in inner i end in outer (start+1) end fun med3(a,b,c) = let val a' = item a and b' = item b and c' = item c in case (cmp(a', b'),cmp(b', c')) of (LESS, LESS) => b | (LESS, _) => ( case cmp(a', c') of LESS => c | _ => a) | (_, GREATER) => b | _ => (case cmp(a', c') of LESS => a | _ => c) (* end case *) end fun getPivot (a,n) = if n <= 7 then a + n div 2 else let val p1 = a val pm = a + n div 2 val pn = a + n - 1 in if n <= 40 then med3(p1,pm,pn) else let val d = n div 8 val p1 = med3(p1,p1+d,p1+2*d) val pm = med3(pm-d,pm,pm+d) val pn = med3(pn-2*d,pn-d,pn) in med3(p1,pm,pn) end end fun quickSort (arg as (a, n)) = let fun bottom limit = let fun loop (arg as (pa,pb)) = if pb > limit then arg else case cmp(item pb,item a) of GREATER => arg | LESS => loop (pa,pb+1) | _ => (swap arg; loop (pa+1,pb+1)) in loop end fun top limit = let fun loop (arg as (pc,pd)) = if limit > pc then arg else case cmp(item pc,item a) of LESS => arg | GREATER => loop (pc-1,pd) | _ => (swap arg; loop (pc-1,pd-1)) in loop end fun split (pa,pb,pc,pd) = let val (pa,pb) = bottom pc (pa,pb) val (pc,pd) = top pb (pc,pd) in if pb > pc then (pa,pb,pc,pd) else (swap(pb,pc); split(pa,pb+1,pc-1,pd)) end val pm = getPivot arg val _ = swap(a,pm) val pa = a + 1 val pc = a + (n-1) val (pa,pb,pc,pd) = split(pa,pa,pc,pc) val pn = a + n val r = Int.min(pa - a, pb - pa) val _ = vecswap(a, pb-r, r) val r = Int.min(pd - pc, pn - pd - 1) val _ = vecswap(pb, pn-r, r) val n' = pb - pa val _ = if n' > 1 then sort(a,n') else () val n' = pd - pc val _ = if n' > 1 then sort(pn-n',n') else () in () end and sort (arg as (_, n)) = if n < 7 then insertSort arg else quickSort arg in sort (start,n) end fun sort cmp array = sortRange(array,0,A.length array, cmp) fun sorted cmp array = let val len = A.length array fun s (v,i) = let val v' = A.sub(array,i) in case cmp(v,v') of GREATER => false | _ => if i+1 = len then true else s(v',i+1) end in if len = 0 orelse len = 1 then true else s(A.sub(array,0),1) end end (* ArraySortFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/array-qsort.sml000066400000000000000000000135211416264345000242720ustar00rootroot00000000000000(* array-qsort.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Structure for in-place sorting of polymorphic arrays. * Uses an engineered version of quicksort due to * Bentley and McIlroy. * *) structure ArrayQSort : ARRAY_SORT = struct structure A = Array type 'a array = 'a A.array val sub = Unsafe.Array.sub val update = Unsafe.Array.update fun isort (array, start, n, cmp) = let fun item i = sub(array,i) fun swap (i,j) = let val tmp = sub(array,i) in update(array,i,sub(array,j)); update(array,j,tmp) end fun vecswap (i,j,0) = () | vecswap (i,j,n) = (swap(i,j);vecswap(i+1,j+1,n-1)) fun insertSort (start, n) = let val limit = start+n fun outer i = if i >= limit then () else let fun inner j = if j = start then outer(i+1) else let val j' = j - 1 in if cmp(item j',item j) = GREATER then (swap(j,j'); inner j') else outer(i+1) end in inner i end in outer (start+1) end in insertSort (start, n); array end fun sortRange (array, start, n, cmp) = let fun item i = sub(array,i) fun swap (i,j) = let val tmp = sub(array,i) in update(array,i,sub(array,j)); update(array,j,tmp) end fun vecswap (i,j,0) = () | vecswap (i,j,n) = (swap(i,j);vecswap(i+1,j+1,n-1)) fun insertSort (start, n) = let val limit = start+n fun outer i = if i >= limit then () else let fun inner j = if j = start then outer(i+1) else let val j' = j - 1 in if cmp(item j',item j) = GREATER then (swap(j,j'); inner j') else outer(i+1) end in inner i end in outer (start+1) end fun med3(a,b,c) = let val a' = item a and b' = item b and c' = item c in case (cmp(a', b'),cmp(b', c')) of (LESS, LESS) => b | (LESS, _) => ( case cmp(a', c') of LESS => c | _ => a) | (_, GREATER) => b | _ => (case cmp(a', c') of LESS => a | _ => c) (* end case *) end fun getPivot (a,n) = if n <= 7 then a + n div 2 else let val p1 = a val pm = a + n div 2 val pn = a + n - 1 in if n <= 40 then med3(p1,pm,pn) else let val d = n div 8 val p1 = med3(p1,p1+d,p1+2*d) val pm = med3(pm-d,pm,pm+d) val pn = med3(pn-2*d,pn-d,pn) in med3(p1,pm,pn) end end fun quickSort (arg as (a, n)) = let fun bottom limit = let fun loop (arg as (pa,pb)) = if pb > limit then arg else case cmp(item pb,item a) of GREATER => arg | LESS => loop (pa,pb+1) | _ => (swap arg; loop (pa+1,pb+1)) in loop end fun top limit = let fun loop (arg as (pc,pd)) = if limit > pc then arg else case cmp(item pc,item a) of LESS => arg | GREATER => loop (pc-1,pd) | _ => (swap arg; loop (pc-1,pd-1)) in loop end fun split (pa,pb,pc,pd) = let val (pa,pb) = bottom pc (pa,pb) val (pc,pd) = top pb (pc,pd) in if pb > pc then (pa,pb,pc,pd) else (swap(pb,pc); split(pa,pb+1,pc-1,pd)) end val pm = getPivot arg val _ = swap(a,pm) val pa = a + 1 val pc = a + (n-1) val (pa,pb,pc,pd) = split(pa,pa,pc,pc) val pn = a + n val r = Int.min(pa - a, pb - pa) val _ = vecswap(a, pb-r, r) val r = Int.min(pd - pc, pn - pd - 1) val _ = vecswap(pb, pn-r, r) val n' = pb - pa val _ = if n' > 1 then sort(a,n') else () val n' = pd - pc val _ = if n' > 1 then sort(pn-n',n') else () in () end and sort (arg as (_, n)) = if n < 7 then insertSort arg else quickSort arg in sort (start,n) end fun sort cmp array = sortRange(array, 0, A.length array, cmp) fun sorted cmp array = let val len = A.length array fun chk (v, i) = let val v' = sub(array,i) in case cmp(v,v') of GREATER => false | _ => if i+1 = len then true else chk(v',i+1) (* end case *) end in len <= 1 orelse chk(sub(array,0), 1) end end (* ArraySort *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/array-sort-sig.sml000066400000000000000000000005361416264345000246730ustar00rootroot00000000000000(* array-sort-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for in-place sorting of polymorphic arrays *) signature ARRAY_SORT = sig val sort : ('a * 'a -> order) -> 'a array -> unit val sorted : ('a * 'a -> order) -> 'a array -> bool end (* ARRAY_SORT *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-binary-map.sml000066400000000000000000000004001416264345000247730ustar00rootroot00000000000000(* atom-binary-map.sml * * COPYRIGHT (c) 1997 Bell Labs, Lucent Technologies. * * Functional finite maps with atom keys. *) structure AtomBinaryMap = BinaryMapFn ( struct type ord_key = Atom.atom val compare = Atom.compare end) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-binary-set.sml000066400000000000000000000003631416264345000250210ustar00rootroot00000000000000(* atom-binary-map.sml * * COPYRIGHT (c) 1997 Bell Labs, Lucent Technologies. * * Functional sets of atoms. *) structure AtomBinarySet = BinarySetFn ( struct type ord_key = Atom.atom val compare = Atom.compare end) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-map.sml000066400000000000000000000002371416264345000235210ustar00rootroot00000000000000(* atom-map.sml * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * Functional finite maps with atom keys. *) structure AtomMap = AtomRedBlackMap mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-redblack-map.sml000066400000000000000000000004061416264345000252640ustar00rootroot00000000000000(* atom-redblack-map.sml * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * Functional finite maps with atom keys. *) structure AtomRedBlackMap = RedBlackMapFn ( struct type ord_key = Atom.atom val compare = Atom.compare end) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-redblack-set.sml000066400000000000000000000003711416264345000253030ustar00rootroot00000000000000(* atom-redblack-set.sml * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * Functional sets of atoms. *) structure AtomRedBlackSet = RedBlackSetFn ( struct type ord_key = Atom.atom val compare = Atom.compare end) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-set.sml000066400000000000000000000002221416264345000235310ustar00rootroot00000000000000(* atom-map.sml * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * Functional sets of atoms. *) structure AtomSet = AtomRedBlackSet mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-sig.sml000066400000000000000000000021461416264345000235270ustar00rootroot00000000000000(* atom-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1996 by AT&T Research * * AUTHOR: John Reppy * AT&T Bell Laboratories * Murray Hill, NJ 07974 * jhr@research.att.com * * TODO: add a gensym operation? *) signature ATOM = sig type atom (* Atoms are hashed strings that support fast equality testing. *) val atom : string -> atom val atom' : substring -> atom (* Map a string/substring to the corresponding unique atom. *) val toString : atom -> string (* return the string representation of the atom *) val same : (atom * atom) -> bool val sameAtom : (atom * atom) -> bool (* return true if the atoms are the same; we provide "sameAtom" for * backward compatibility. *) val compare : (atom * atom) -> order (* compare two atoms for their relative order; note that this is * not lexical order! *) val lexCompare : (atom * atom) -> order (* compare two atoms for their lexical order *) val hash : atom -> word (* return a hash key for the atom *) end (* signature ATOM *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom-table.sml000066400000000000000000000003541416264345000240330ustar00rootroot00000000000000(* atom-table.sml * * COPYRIGHT (c) 1996 AT&T Research. * * Hash tables of atoms. *) structure AtomTable = HashTableFn (struct type hash_key = Atom.atom val hashVal = Atom.hash val sameKey = Atom.same end); mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/atom.sml000066400000000000000000000052261416264345000227510ustar00rootroot00000000000000(* atom.sml * * COPYRIGHT (c) 1996 by AT&T Research * * AUTHOR: John Reppy * AT&T Bell Laboratories * Murray Hill, NJ 07974 * jhr@research.att.com * * TODO: add a gensym operation? *) structure Atom :> ATOM = struct (* Atoms are hashed strings that support fast equality testing. *) datatype atom = ATOM of { hash : word, id : string } (* return the string representation of the atom *) fun toString (ATOM{id, ...}) = id (* return a hash key for the atom *) fun hash (ATOM{hash, ...}) = hash (* return true if the atoms are the same *) fun same (ATOM{hash=h1, id=id1}, ATOM{hash=h2, id=id2}) = (h1 = h2) andalso (id1 = id2) (* for backward compatibility *) val sameAtom = same (* compare two names for their relative order; note that this is * not lexical order! *) fun compare (ATOM{hash=h1, id=id1}, ATOM{hash=h2, id=id2}) = if h1 = h2 then String.compare (id1, id2) else if h1 < h2 then LESS else GREATER (* compare two atoms for their lexical order *) fun lexCompare (ATOM{id=id1, ...}, ATOM{id=id2, ...}) = String.compare(id1, id2) (* the unique name hash table *) val tableSz = 64 val table = ref(Array.array(tableSz, [] : atom list)) val numItems = ref 0 infix % fun h % m = Word.toIntX (Word.andb (h, m)) (* Map a string or substring s to the corresponding unique atom. *) fun atom0 (toString, hashString, sameString) s = let val h = hashString s val tbl = !table val sz = Array.length tbl val indx = h % (Word.fromInt sz - 0w1) fun look ((a as ATOM{hash, id}) :: rest) = if (hash = h) andalso sameString(s, id) then a else look rest | look [] = let fun new (tbl, indx) = let val a = ATOM {hash = h, id = toString s} in Array.update (tbl, indx, a :: Array.sub (tbl, indx)); a end in if !numItems < sz then new (tbl, indx) else let val newSz = sz + sz val newMask = Word.fromInt newSz - 0w1 val newTbl = Array.array (newSz, []) fun ins (item as ATOM{hash, ...}) = let val indx = hash % newMask in Array.update (newTbl, indx, item :: Array.sub (newTbl, indx)) end in Array.app (app ins) tbl; table := newTbl; new (newTbl, h % newMask) end end in look (Array.sub (tbl, indx)) end (* instantiate atom0 for the string case *) val atom = atom0 (fn s => s, FNVHash.hashString, op = ) (* instantiate atom0 for the substring case *) val atom' = atom0 ( Substring.string, FNVHash.hashSubstring, fn (ss, s) => (Substring.compare(ss, Substring.full s) = EQUAL)) end (* structure Atom *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/base64-sig.sml000066400000000000000000000022071416264345000236510ustar00rootroot00000000000000(* base64-sig.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Support for Base64 encoding/decoding as specified by RFC 4648. * * http://www.ietf.org/rfc/rfc4648.txt *) signature BASE64 = sig (* return true if a character is in the base64 alphabet *) val isBase64 : char -> bool val encode : Word8Vector.vector -> string val encodeSlice : Word8VectorSlice.slice -> string (* raised if a Base64 string does not end in a complete encoding quantum (i.e., 4 * characters including padding characters). *) exception Incomplete (* raised if an invalid Base64 character is encountered during decode. The int * is the position of the character and the char is the invalid character. *) exception Invalid of (int * char) (* decode functions that ignore whitespace *) val decode : string -> Word8Vector.vector val decodeSlice : substring -> Word8Vector.vector (* strict decode functions that only accept the base64 characters *) val decodeStrict : string -> Word8Vector.vector val decodeSliceStrict : substring -> Word8Vector.vector end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/base64.sml000066400000000000000000000163551416264345000231020ustar00rootroot00000000000000(* base64.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Support for Base64 encoding/decoding as specified by RFC 4648. * * http://www.ietf.org/rfc/rfc4648.txt *) structure Base64 : BASE64 = struct structure CA = CharArray structure W8 = Word8 structure W8V = Word8Vector structure W8A = Word8Array structure UCA = Unsafe.CharArray structure UCV = Unsafe.CharVector structure UW8V = Unsafe.Word8Vector (* encoding table *) val encTbl = "\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ\ \abcdefghijklmnopqrstuvwxyz\ \0123456789+/\ \" val padChar = #"=" fun incByte b = UCV.sub(encTbl, Word8.toIntX b) (* return true if a character is in the base64 alphabet *) val isBase64 = Char.contains encTbl (* encode a triple of bytes into four base-64 characters *) fun encode3 (b1, b2, b3) = let val c1 = W8.>>(b1, 0w2) val c2 = W8.orb(W8.<<(W8.andb(b1, 0wx3), 0w4), W8.>>(b2, 0w4)) val c3 = W8.orb(W8.<<(W8.andb(0wxF, b2), 0w2), W8.>>(b3, 0w6)) val c4 = W8.andb(0wx3f, b3) in (incByte c1, incByte c2, incByte c3, incByte c4) end (* encode a pair of bytes into three base-64 characters plus a padding character *) fun encode2 (b1, b2) = let val c1 = W8.>>(b1, 0w2) val c2 = W8.orb(W8.<<(W8.andb(b1, 0wx3), 0w4), W8.>>(b2, 0w4)) val c3 = W8.<<(W8.andb(0wxF, b2), 0w2) in (incByte c1, incByte c2, incByte c3, padChar) end (* encode a byte into two base-64 characters plus two padding characters *) fun encode1 b1 = let val c1 = W8.>>(b1, 0w2) val c2 = W8.<<(W8.andb(b1, 0wx3), 0w4) in (incByte c1, incByte c2, padChar, padChar) end local fun encode64 (vec, start, len) = let val outLen = 4 * Int.quot(len + 2, 3) val outBuf = UCA.create outLen val nTriples = Int.quot(len, 3) val extra = Int.rem(len, 3) fun insBuf (i, (c1, c2, c3, c4)) = let val idx = 4*i in UCA.update(outBuf, idx, c1); UCA.update(outBuf, idx+1, c2); UCA.update(outBuf, idx+2, c3); UCA.update(outBuf, idx+3, c4) end fun loop (i, idx) = if (i < nTriples) then ( insBuf(i, encode3(UW8V.sub(vec, idx), UW8V.sub(vec, idx+1), UW8V.sub(vec, idx+2))); loop (i+1, idx+3)) else (case extra of 1 => insBuf(i, encode1(UW8V.sub(vec, idx))) | 2 => insBuf(i, encode2(UW8V.sub(vec, idx), UW8V.sub(vec, idx+1))) | _ => () (* end case *)) in loop (0, start); CA.vector outBuf end in fun encode vec = encode64 (vec, 0, W8V.length vec) fun encodeSlice slice = encode64 (Word8VectorSlice.base slice) end (* local *) (* raised if a Base64 string does not end in a complete encoding quantum (i.e., 4 * characters including padding characters). *) exception Incomplete (* raised if an invalid Base64 character is encountered during decode. The int * is the position of the character and the char is the invalid character. *) exception Invalid of (int * char) (* decoding tags *) val errCode : W8.word = 0w255 val spCode : W8.word = 0w65 val padCode : W8.word = 0w66 val decTbl = let val tbl = W8A.array(256, errCode) fun ins (w, c) = W8A.update(tbl, Char.ord c, w) in (* add space codes *) ins(spCode, #"\t"); ins(spCode, #"\n"); ins(spCode, #"\r"); ins(spCode, #" "); (* add decoding codes *) CharVector.appi (fn (i, c) => ins(Word8.fromInt i, c)) encTbl; (* convert to vector *) W8V.tabulate (256, fn i => W8A.sub(tbl, i)) end val strictDecTbl = let val tbl = W8A.array(256, errCode) fun ins (w, c) = W8A.update(tbl, Char.ord c, w) in (* add decoding codes *) CharVector.appi (fn (i, c) => ins(Word8.fromInt i, c)) encTbl; (* convert to vector *) W8V.tabulate (256, fn i => W8A.sub(tbl, i)) end fun decode64 decTbl (s, start, len) = let fun decodeChr c = W8V.sub(decTbl, Char.ord c) fun getc i = if (i < len) then let val c = String.sub(s, start+i) val b = decodeChr c in if (b = errCode) then raise Invalid(i, c) else if (b = spCode) then getc (i+1) else (b, i+1) end else raise Incomplete (* first we deal with possible padding. There are three possible situations: * 1. the final quantum is 24 bits, so there is no padding * 2. the final quantum is 16 bits, so there are three code characters and * one pad character. * 3. the final quantum is 8 bits, so there are two code characters and * two pad characters. *) val (lastQ, len, tailLen) = let fun getTail (i, n, chrs) = if (i < 0) then raise Incomplete else if (n < 4) then (case String.sub(s, start+i) of #"=" => getTail (i-1, n+1, (#"=", i)::chrs) | c => let val b = decodeChr c in if (b = spCode) then getTail (i-1, n, chrs) (* skip whitespace *) else if (b = errCode) then raise Invalid(i, c) else getTail (i-1, n+1, (c, i)::chrs) end (* end case *)) else (i, chrs) fun cvt (c, i) = let val b = decodeChr c in if (b < 0w64) then b else raise Invalid(i, c) end in case getTail (len-1, 0, []) of (len, [ci0, ci1, (#"=", _), (#"=", _)]) => let val c0 = cvt ci0 val c1 = cvt ci1 val b0 = W8.orb(W8.<<(c0, 0w2), W8.>>(c1, 0w4)) in ([b0], len, 1) end | (len, [ci0, ci1, ci2, (#"=", _)]) => let val c0 = cvt ci0 val c1 = cvt ci1 val c2 = cvt ci2 val b0 = W8.orb(W8.<<(c0, 0w2), W8.>>(c1, 0w4)) val b1 = W8.orb(W8.<<(c1, 0w4), W8.>>(c2, 0w2)) in ([b0, b1], len, 2) end | (_, [_, _, _, _]) => ([], len, 0) (* fallback to regular path below *) | (_, []) => ([], len, 0) | _ => raise Incomplete (* end case *) end (* compute upper bound on number of output bytes *) val nBytes = 3 * Word.toIntX(Word.>>(Word.fromInt len + 0w3, 0w2)) + tailLen val buffer = W8A.array(nBytes, 0w0) fun cvt (inIdx, outIdx) = if (inIdx < len) then let val (c0, i) = getc inIdx val (c1, i) = getc i val (c2, i) = getc i val (c3, i) = getc i val b0 = W8.orb(W8.<<(c0, 0w2), W8.>>(c1, 0w4)) val b1 = W8.orb(W8.<<(c1, 0w4), W8.>>(c2, 0w2)) val b2 = W8.orb(W8.<<(c2, 0w6), c3) in W8A.update(buffer, outIdx, b0); W8A.update(buffer, outIdx+1, b1); W8A.update(buffer, outIdx+2, b2); cvt (i, outIdx+3) end else outIdx val outLen = cvt (0, 0) (*handle Subscript => raise Incomplete*) (* deal with the last quantum *) val outLen = (case lastQ of [b0, b1] => ( W8A.update(buffer, outLen, b0); W8A.update(buffer, outLen+1, b1); outLen+2) | [b0] => ( W8A.update(buffer, outLen, b0); outLen+1) | _ => outLen (* end case *)) in Word8ArraySlice.vector(Word8ArraySlice.slice(buffer, 0, SOME outLen)) end fun decode s = decode64 decTbl (s, 0, size s) fun decodeSlice ss = decode64 decTbl (Substring.base ss) fun decodeStrict s = decode64 strictDecTbl (s, 0, size s) fun decodeSliceStrict ss = decode64 strictDecTbl (Substring.base ss) end (* simple test code val v = Word8Vector.tabulate(256, fn i => Word8.fromInt i); val enc = Base64.encode v val v' = Base64.decode enc val ok = (v = v') *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/binary-map-fn.sml000066400000000000000000000354711416264345000244560ustar00rootroot00000000000000(* binary-map-fn.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * *) functor BinaryMapFn (K : ORD_KEY) :> ORD_MAP where type Key.ord_key = K.ord_key = struct structure Key = K (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i datatype 'a map = E | T of { key : K.ord_key, value : 'a, cnt : int, left : 'a map, right : 'a map } val empty = E fun isEmpty E = true | isEmpty _ = false fun numItems E = 0 | numItems (T{cnt,...}) = cnt (* return the first item in the map (or NONE if it is empty) *) fun first E = NONE | first (T{value, left=E, ...}) = SOME value | first (T{left, ...}) = first left (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti E = NONE | firsti (T{key, value, left=E, ...}) = SOME(key, value) | firsti (T{left, ...}) = firsti left local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv,left=T{key=b,value=bv,left=x,right=y,...},right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w,right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in fun mkDict () = E fun singleton (x,v) = T{key=x,value=v,cnt=1,left=E,right=E} fun insert (E,x,v) = T{key=x,value=v,cnt=1,left=E,right=E} | insert (T(set as {key,left,right,value,...}),x,v) = case K.compare (key,x) of GREATER => T'(key,value,insert(left,x,v),right) | LESS => T'(key,value,left,insert(right,x,v)) | _ => T{key=x,value=v,left=left,right=right,cnt= #cnt set} fun insert' ((k, x), m) = insert(m, k, x) fun insertWithi comb (m, x, v) = let fun insert E = T{key=x,value=v,cnt=1,left=E,right=E} | insert (T{key,left,right,value,cnt}) = ( case K.compare (key,x) of GREATER => T'(key, value, insert left, right) | LESS => T'(key, value, left, insert right) | EQUAL => let val v' = comb(x, value, v) in T{key=x,value=v',left=left,right=right,cnt=cnt} end (* end case *)) in insert m end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) fun inDomain (set, x) = let fun mem E = false | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => true | LESS => mem left (* end case *)) in mem set end fun find (set, x) = let fun mem E = NONE | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => SOME(#value n) | LESS => mem left (* end case *)) in mem set end fun lookup (set, x) = let fun mem E = raise LibBase.NotFound | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => #value n | LESS => mem left (* end case *)) in mem set end fun remove (E,x) = raise LibBase.NotFound | remove (set as T{key,left,right,value,...},x) = ( case K.compare (key,x) of GREATER => let val (left', v) = remove(left, x) in (T'(key, value, left', right), v) end | LESS => let val (right', v) = remove (right, x) in (T'(key, value, left, right'), v) end | _ => (delete'(left,right),value) (* end case *)) fun listItems d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, value::(d2l(right,l))) in d2l (d,[]) end fun listItemsi d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, (key,value)::(d2l(right,l))) in d2l (d,[]) end fun listKeys d = let fun d2l (E, l) = l | d2l (T{key,left,right,...}, l) = d2l(left, key::(d2l(right,l))) in d2l (d,[]) end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun collate cmpRng (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{key=x1, value=y1, ...}, r1), (T{key=x2, value=y2, ...}, r2)) => ( case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end (* local *) fun appi f d = let fun app' E = () | app' (T{key,value,left,right,...}) = ( app' left; f(key, value); app' right) in app' d end fun app f d = let fun app' E = () | app' (T{value,left,right,...}) = ( app' left; f value; app' right) in app' d end fun mapi f d = let fun map' E = E | map' (T{key,value,left,right,cnt}) = let val left' = map' left val value' = f(key, value) val right' = map' right in T{cnt=cnt, key=key, value=value', left = left', right = right'} end in map' d end fun map f d = mapi (fn (_, x) => f x) d fun foldli f init d = let fun fold (E, v) = v | fold (T{key,value,left,right,...}, v) = fold (right, f(key, value, fold(left, v))) in fold (d, init) end fun foldl f init d = foldli (fn (_, v, accum) => f (v, accum)) init d fun foldri f init d = let fun fold (E,v) = v | fold (T{key,value,left,right,...},v) = fold (left, f(key, value, fold(right, v))) in fold (d, init) end fun foldr f init d = foldri (fn (_, v, accum) => f (v, accum)) init d (** To be implemented ** val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map **) end (* local *) (* the following are generic implementations of the unionWith, intersectWith, * and mergeWith operetions. These should be specialized for the internal * representations at some point. *) fun unionWith f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (a, b) => f (b, a))) m1 m2 else foldli (ins f) m2 m1 end fun unionWithi f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (k, a, b) => f (k, b, a))) m1 m2 else foldli (ins f) m2 m1 end fun intersectWith f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (a, b) => f(b, a)) (m2, m1) end fun intersectWithi f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (k, a, b) => f(k, b, a)) (m2, m1) end fun mergeWith f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, m) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, m) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end fun mergeWithi f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, m) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, m) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (k, x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end (* this is a generic implementation of filter. It should * be specialized to the data-structure at some point. *) fun filter predFn m = let fun f (key, item, m) = if predFn item then insert(m, key, item) else m in foldli f empty m end fun filteri predFn m = let fun f (key, item, m) = if predFn(key, item) then insert(m, key, item) else m in foldli f empty m end (* this is a generic implementation of mapPartial. It should * be specialized to the data-structure at some point. *) fun mapPartial f m = let fun g (key, item, m) = (case f item of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end fun mapPartiali f m = let fun g (key, item, m) = (case f(key, item) of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' E = false | exists' (T{value, left, right, ...}) = exists' left orelse pred value orelse exists' right in exists' end fun existsi pred = let fun exists' E = false | exists' (T{key, value, left, right, ...}) = exists' left orelse pred(key, value) orelse exists' right in exists' end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' E = true | all' (T{value, left, right, ...}) = all' left andalso pred value andalso all' right in all' end fun alli pred = let fun all' E = true | all' (T{key, value, left, right, ...}) = all' left andalso pred(key, value) andalso all' right in all' end end (* functor BinaryMapFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/binary-set-fn.sml000066400000000000000000000355541416264345000244760ustar00rootroot00000000000000(* binary-set-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * * 3. There are two implementations of union. The default, * hedge_union, is much more complex and usually 20% faster. I * am not sure that the performance increase warrants the * complexity (and time it took to write), but I am leaving it * in for the competition. It is derived from the original * union by replacing the split_lt(gt) operations with a lazy * version. The `obvious' version is called old_union. * * 4. Most time is spent in T', the rebalancing constructor. If my * understanding of the output of * in the sml batch * compiler is correct then the code produced by NJSML 0.75 * (sparc) for the final case is very disappointing. Most * invocations fall through to this case and most of these cases * fall to the else part, i.e. the plain contructor, * T(v,ln+rn+1,l,r). The poor code allocates a 16 word vector * and saves lots of registers into it. In the common case it * then retrieves a few of the registers and allocates the 5 * word T node. The values that it retrieves were live in * registers before the massive save. * * Modified to functor to support general ordered values *) functor BinarySetFn (K : ORD_KEY) :> ORD_SET where type Key.ord_key = K.ord_key = struct structure Key = K type item = K.ord_key datatype set = E | T of { elt : item, cnt : int, left : set, right : set } fun numItems E = 0 | numItems (T{cnt,...}) = cnt fun isEmpty E = true | isEmpty _ = false fun minItem E = raise Empty | minItem (T{elt, left=E, ...}) = elt | minItem (T{left, ...}) = minItem left fun maxItem E = raise Empty | maxItem (T{elt, right=E, ...}) = elt | maxItem (T{right, ...}) = maxItem right fun mkT(v,n,l,r) = T{elt=v,cnt=n,left=l,right=r} (* N(v,l,r) = T(v,1+numItems(l)+numItems(r),l,r) *) fun N(v,E,E) = mkT(v,1,E,E) | N(v,E,r as T{cnt=n,...}) = mkT(v,n+1,E,r) | N(v,l as T{cnt=n,...}, E) = mkT(v,n+1,l,E) | N(v,l as T{cnt=n,...}, r as T{cnt=m,...}) = mkT(v,n+m+1,l,r) fun single_L (a,x,T{elt=b,left=y,right=z,...}) = N(b,N(a,x,y),z) | single_L _ = raise Match fun single_R (b,T{elt=a,left=x,right=y,...},z) = N(a,x,N(b,y,z)) | single_R _ = raise Match fun double_L (a,w,T{elt=c,left=T{elt=b,left=x,right=y,...},right=z,...}) = N(b,N(a,w,x),N(c,y,z)) | double_L _ = raise Match fun double_R (c,T{elt=a,left=w,right=T{elt=b,left=x,right=y,...},...},z) = N(b,N(a,w,x),N(c,y,z)) | double_R _ = raise Match (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i fun T' (v,E,E) = mkT(v,1,E,E) | T' (v,E,r as T{left=E,right=E,...}) = mkT(v,2,E,r) | T' (v,l as T{left=E,right=E,...},E) = mkT(v,2,l,E) | T' (p as (_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if lnrn then single_R p else double_R p | T' (p as (_,E,T{left=E,...})) = single_L p | T' (p as (_,T{right=E,...},E)) = single_R p | T' (p as (v,l as T{elt=lv,cnt=ln,left=ll,right=lr}, r as T{elt=rv,cnt=rn,left=rl,right=rr})) = if rn >= wt ln (*right is too big*) then let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn (*left is too big*) then let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else mkT(v,ln+rn+1,l,r) fun add (E,x) = mkT(x,1,E,E) | add (set as T{elt=v,left=l,right=r,cnt},x) = case K.compare(x,v) of LESS => T'(v,add(l,x),r) | GREATER => T'(v,l,add(r,x)) | EQUAL => mkT(x,cnt,l,r) fun add' (s, x) = add(x, s) fun concat3 (E,v,r) = add(r,v) | concat3 (l,v,E) = add(l,v) | concat3 (l as T{elt=v1,cnt=n1,left=l1,right=r1}, v, r as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat3(l,v,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat3(r1,v,r)) else N(v,l,r) fun split_lt (E,x) = E | split_lt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of GREATER => split_lt(l,x) | LESS => concat3(l,v,split_lt(r,x)) | _ => l fun split_gt (E,x) = E | split_gt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of LESS => split_gt(r,x) | GREATER => concat3(split_gt(l,x),v,r) | _ => r fun min (T{elt=v,left=E,...}) = v | min (T{left=l,...}) = min l | min _ = raise Match fun delmin (T{left=E,right=r,...}) = r | delmin (T{elt=v,left=l,right=r,...}) = T'(v,delmin l,r) | delmin _ = raise Match fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = T'(min r,l,delmin r) fun concat (E, s) = s | concat (s, E) = s | concat (t1 as T{elt=v1,cnt=n1,left=l1,right=r1}, t2 as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat(t1,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat(r1,t2)) else T'(min t2,t1, delmin t2) local fun trim (lo,hi,E) = E | trim (lo,hi,s as T{elt=v,left=l,right=r,...}) = if K.compare(v,lo) = GREATER then if K.compare(v,hi) = LESS then s else trim(lo,hi,l) else trim(lo,hi,r) fun uni_bd (s,E,_,_) = s | uni_bd (E,T{elt=v,left=l,right=r,...},lo,hi) = concat3(split_gt(l,lo),v,split_lt(r,hi)) | uni_bd (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo,hi) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v), v, uni_bd(r1,trim(v,hi,s2),v,hi)) (* inv: lo < v < hi *) (* all the other versions of uni and trim are * specializations of the above two functions with * lo=-infinity and/or hi=+infinity *) fun trim_lo (_, E) = E | trim_lo (lo,s as T{elt=v,right=r,...}) = case K.compare(v,lo) of GREATER => s | _ => trim_lo(lo,r) fun trim_hi (_, E) = E | trim_hi (hi,s as T{elt=v,left=l,...}) = case K.compare(v,hi) of LESS => s | _ => trim_hi(hi,l) fun uni_hi (s,E,_) = s | uni_hi (E,T{elt=v,left=l,right=r,...},hi) = concat3(l,v,split_lt(r,hi)) | uni_hi (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},hi) = concat3(uni_hi(l1,trim_hi(v,s2),v),v,uni_bd(r1,trim(v,hi,s2),v,hi)) fun uni_lo (s,E,_) = s | uni_lo (E,T{elt=v,left=l,right=r,...},lo) = concat3(split_gt(l,lo),v,r) | uni_lo (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v),v,uni_lo(r1,trim_lo(v,s2),v)) fun uni (s,E) = s | uni (E,s) = s | uni (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...}) = concat3(uni_hi(l1,trim_hi(v,s2),v), v, uni_lo(r1,trim_lo(v,s2),v)) in val hedge_union = uni end (* The old_union version is about 20% slower than * hedge_union in most cases *) fun old_union (E,s2) = s2 | old_union (s1,E) = s1 | old_union (T{elt=v,left=l,right=r,...},s2) = let val l2 = split_lt(s2,v) val r2 = split_gt(s2,v) in concat3(old_union(l,l2),v,old_union(r,r2)) end val empty = E fun singleton x = T{elt=x,cnt=1,left=E,right=E} fun addList (s,l) = List.foldl (fn (i,s) => add(s,i)) s l fun fromList l = addList (E, l) val add = add fun member (set, x) = let fun pk E = false | pk (T{elt=v, left=l, right=r, ...}) = ( case K.compare(x,v) of LESS => pk l | EQUAL => true | GREATER => pk r (* end case *)) in pk set end local (* true if every item in t is in t' *) fun treeIn (t,t') = let fun isIn E = true | isIn (T{elt,left=E,right=E,...}) = member(t',elt) | isIn (T{elt,left,right=E,...}) = member(t',elt) andalso isIn left | isIn (T{elt,left=E,right,...}) = member(t',elt) andalso isIn right | isIn (T{elt,left,right,...}) = member(t',elt) andalso isIn left andalso isIn right in isIn t end in fun isSubset (E,_) = true | isSubset (_,E) = false | isSubset (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n<=n') andalso treeIn (t,t') fun equal (E,E) = true | equal (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n=n') andalso treeIn (t,t') | equal _ = false end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun compare (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ( case Key.compare(e1, e2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end fun disjoint (s1, s2) = let fun walk (t1, t2) = (case (next t1, next t2) of ((E, _), _) => true | (_, (E, _)) => true | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ( case Key.compare(e1, e2) of LESS => walk (r1, t2) | EQUAL => false | GREATER => walk (t1, r2) (* end case *)) (* end case *)) in walk (left(s1, []), left(s2, [])) end end fun delete (E,x) = raise LibBase.NotFound | delete (set as T{elt=v,left=l,right=r,...},x) = case K.compare(x,v) of LESS => T'(v,delete(l,x),r) | GREATER => T'(v,l,delete(r,x)) | _ => delete'(l,r) val union = hedge_union fun intersection (E, _) = E | intersection (_, E) = E | intersection (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in if member(s,v) then concat3(intersection(l2,l),v,intersection(r2,r)) else concat(intersection(l2,l),intersection(r2,r)) end fun difference (E,s) = E | difference (s,E) = s | difference (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in concat(difference(l2,l),difference(r2,r)) end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) E items in difference (l, items') end fun map f set = let fun map'(acc, E) = acc | map'(acc, T{elt,left,right,...}) = map' (add (map' (acc, left), f elt), right) in map' (E, set) end fun mapPartial f set = let fun map' (acc, E) = acc | map' (acc, T{elt, left, right, ...}) = let val acc = map' (acc, left) in case f elt of NONE => map' (acc, right) | SOME elt' => map' (add (acc, elt'), right) (* end case *) end in map' (E, set) end fun app apf = let fun apply E = () | apply (T{elt,left,right,...}) = (apply left;apf elt; apply right) in apply end fun foldl f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (right, f(elt, foldf (left, b))) in foldf (set, b) end fun foldr f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (left, f(elt, foldf (right, b))) in foldf (set, b) end fun toList set = foldr (op::) [] set fun filter pred set = foldl (fn (item, s) => if (pred item) then add(s, item) else s) empty set fun partition pred set = foldl (fn (item, (s1, s2)) => if (pred item) then (add(s1, item), s2) else (s1, add(s2, item)) ) (empty, empty) set fun exists p E = false | exists p (T{elt, left, right,...}) = (exists p left) orelse (p elt) orelse (exists p right) fun all p E = true | all p (T{elt, left, right,...}) = (all p left) andalso (p elt) andalso (all p right) fun find p E = NONE | find p (T{elt,left,right,...}) = (case find p left of NONE => if (p elt) then SOME elt else find p right | a => a (* end case *)) (* deprecated *) val listItems = toList end (* BinarySetFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/bit-array-sig.sml000066400000000000000000000072101416264345000244560ustar00rootroot00000000000000(* bit-array-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for mutable bit array. The model here treats bit array as an * array of bools. *) signature BIT_ARRAY = sig include MONO_ARRAY val fromString : string -> array option (* The string argument gives a hexadecimal * representation of the bits set in the * array. Characters 0-9, a-f and A-F are * allowed. For example, * fromString "1af8" = 0001101011111000 * (by convention, 0 corresponds to false and 1 corresponds * to true, bit 0 appears on the right, * and indices increase to the left) * The length of the array will be 4*(size string). * Returns NONE if a non-hexadecimal character * appears in the string. *) val bits : (int * int list) -> array (* Create array of the given length with the indices of its set bits * given by the list argument. * Raises Subscript if a list item is < 0 or >= length. *) val getBits : array -> int list (* Returns list of bits set in bit array, in increasing * order of indices. *) val toString : array -> string (* Inverse of stringToBits. * The bit array is zero-padded to the next * length that is a multiple of 4. *) val isZero : array -> bool (* Returns true if and only if no bits are set. *) val extend0 : (array * int) -> array val extend1 : (array * int) -> array (* Extend bit array by 0's or 1's to given length. * If bit array is already >= argument length, return a copy * of the bit array. * Raises Size if length < 0. *) val eqBits : (array * array) -> bool (* true if set bits are identical *) val equal : (array * array) -> bool (* true if same length and same set bits *) val andb : (array * array * int) -> array val orb : (array * array * int) -> array val xorb : (array * array * int) -> array (* Create new array of the given length * by logically combining bits of original * array using and, or and xor, respectively. * If necessary, the array are * implicitly extended by 0 to be the same length * as the new array. *) val notb : array -> array (* Create new array with all bits of original * array inverted. *) val >> : (array * word) -> array val << : (array * word) -> array (* shift operations *) val lshift : (array * int) -> array (* DEPRECATED *) (* lshift(ba,n) creates a new array by * inserting n 0's on the right of ba. * The new array has length n + length ba. *) val rshift : (array * int) -> array (* DEPRECATED *) (* rshift(ba,n) creates a new array of * of length max(0,length ba - n) consisting * of bits n,n+1,...,length ba - 1 of ba. * If n >= length ba, the new array has length 0. *) (* mutable operations for array *) val setBit : (array * int) -> unit val clrBit : (array * int) -> unit (* Update value at given index to new value. * Raises Subscript if index < 0 or >= length. * setBit(ba,i) = update(ba,i,true) * clrBit(ba,i) = update(ba,i,false) *) val union : array -> array -> unit val intersection : array -> array -> unit (* Or (and) second bitarray into the first. Second is * implicitly truncated or extended by 0's to match * the length of the first. *) val complement : array -> unit (* Invert all bits. *) end (* BIT_ARRAY *) where type elem = bool mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/bit-array.sml000066400000000000000000000724661416264345000237150ustar00rootroot00000000000000(* bit-array.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure BitArray :> BIT_ARRAY = struct structure Vector = struct local structure W8A = Word8Array structure W8V = Word8Vector val sub = W8A.sub val << = Word8.<< val >> = Word8.>> val ++ = Word8.orb val & = Word8.andb infix sub << >> ++ & fun badArg(f,msg) = LibBase.failure{module="BitArray",func=f,msg=msg} val hexs = Byte.stringToBytes "0123456789abcdef" val lomask = W8V.fromList [0wx00, 0wx01, 0wx03, 0wx07, 0wx0f, 0wx1f, 0wx3f, 0wx7f, 0wxff] val himask = W8V.fromList [0wxff, 0wxfe, 0wxfc, 0wxf8, 0wxf0, 0wxe0, 0wxc0, 0wx80, 0wx00] fun hibits i = W8V.sub(himask,i) fun lobits i = W8V.sub(lomask,i) fun wmask7 i = Word.andb(Word.fromInt i, 0w7) val mask7 = Word.toIntX o wmask7 (* return the number of bytes needed to represent the given number of bits *) fun sizeOf n = ((n + 7) div 8) (* return the index of byte that holds bit i *) fun byteOf i = (i div 8) (* return the mask for bit i in a byte *) fun bit i : Word8.word = (0w1 << Word.andb(Word.fromInt i, 0w7)) in (* A bitvector is stored in a Word8Array.array. * Bit n is stored in bit (n mod 8) of word (n div 8). * We maintain the invariant that all bits >= nbits are 0. *) type elem = bool datatype vector = BA of {nbits : int, bits : W8A.array} val maxLen = 8*Word8Array.maxLen handle Overflow => Word8Array.maxLen (* would valOf Int.maxInt be better? *) fun array (0, init) = BA{nbits=0,bits=W8A.array(0, 0w0)} | array (len, false) = BA{nbits=len,bits=W8A.array(sizeOf len, 0w0)} | array (len, true) = let val sz = sizeOf len val bits = W8A.array (sz, 0wxff) in case len mod 8 of 0 => () | idx => W8A.update(bits,sz-1,lobits idx); BA{nbits = len, bits = bits} end val char0 = Byte.charToByte #"0" val char9 = Byte.charToByte #"9" val charA = Byte.charToByte #"A" val charF = Byte.charToByte #"F" val chara = Byte.charToByte #"a" val charf = Byte.charToByte #"f" fun fromString s = let val len = 4*(size s) (* 4 bits per hex digit *) val (bv as BA{bits, ...}) = array (len, false) fun nibble x = let val d = Byte.charToByte x in if (char0 <= d) andalso (d <= char9) then d - char0 else if (charA <= d) andalso (d <= charF) then d - charA + 0w10 else if (chara <= d) andalso (d <= charf) then d - chara + 0w10 else raise Domain end fun init ([], _) = SOME bv | init ([x], i) = (W8A.update(bits, i, nibble x); SOME bv) | init (x1::x2::r, i) = ( W8A.update(bits, i, ((nibble x2) << 0w4) ++ (nibble x1)); init (r, i+1)) in init (rev(explode s), 0) end handle _ => NONE fun toString (BA{nbits=0,...}) = "" | toString (BA{nbits,bits}) = let val len = (nbits + 3) div 4 val buf = W8A.array (len, 0w0) fun put (i,j) = let val v = bits sub i in W8A.update (buf, j, W8V.sub(hexs, Word8.toInt(v & 0wx0f))); W8A.update (buf, j-1, W8V.sub(hexs, Word8.toInt(v >> 0w4))); put (i+1, j-2) end in (put(0,len-1)) handle _ => (); Byte.bytesToString (W8A.vector buf) end fun bits (len,l) = let val (bv as BA{bits, ...}) = array (len, false) fun init i = let val idx = byteOf i val b = 0w1 << Word.andb(Word.fromInt i, 0w7) in W8A.update (bits, idx, ((bits sub idx) ++ b)) end in List.app init l; bv end fun fromList [] = array (0, false) | fromList l = let val len = length l val ba as BA{bits,...} = array (len, false) fun getbyte ([],_,b) = ([],b) | getbyte (l,0w0,b) = (l,b) | getbyte (false::r,bit,b) = getbyte(r,bit << 0w1,b) | getbyte (true::r,bit,b) = getbyte(r,bit << 0w1,b ++ bit) fun fill ([],_) = () | fill (l,idx) = let val (l',byte) = getbyte (l,0w1,0w0) in if byte <> 0w0 then W8A.update(bits,idx,byte) else (); fill (l',idx+1) end in fill (l,0); ba end fun tabulate (len, genf) = let val ba as BA{bits,...} = array (len, false) fun getbyte (cnt,0w0,b) = (cnt,b) | getbyte (cnt,bit,b) = if cnt = len then (cnt,b) else case genf cnt of false => getbyte(cnt+1,bit << 0w1,b) | true => getbyte(cnt+1,bit << 0w1,b ++ bit) fun fill (cnt,idx) = if cnt = len then () else let val (cnt',byte) = getbyte (cnt,0w1,0w0) in if byte <> 0w0 then W8A.update(bits,idx,byte) else (); fill (cnt',idx+1) end in fill (0,0); ba end fun getBits (BA{nbits = 0, ...}) = [] | getBits (BA{nbits, bits}) = let fun extractBits (_, 0w0, l) = l | extractBits (bit, data, l) = let val l' = if (data & 0wx80) = 0w0 then l else bit :: l in extractBits (bit-1, data<<0w1, l') end fun extract (~1, _, l) = l | extract (i, bitnum, l) = extract (i-1,bitnum-8,extractBits (bitnum, bits sub i, l)) val maxbit = nbits-1 val hiByte = byteOf maxbit val delta = Word.andb(Word.fromInt maxbit, 0w7) in extract (hiByte-1, maxbit - (Word.toIntX delta) - 1, extractBits(maxbit,(bits sub hiByte) << (0w7-delta),[])) end fun bitOf (BA{nbits, bits}, i) = if i >= nbits then raise Subscript else ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 fun isZero (BA{bits,...}) = let fun isz i = (bits sub i) = 0w0 andalso (isz (i+1)) in isz 0 end handle _ => true fun copybits (bits, newbits) = let fun cpy i = (W8A.update(newbits, i, bits sub i); cpy(i+1)) in (cpy 0) handle _ => () end fun mkCopy (BA{nbits, bits}) = let val ba as BA{bits=newbits,...} = array (nbits, false) in copybits(bits, newbits); ba end fun eqBits arg = let fun order (arg as (ba as BA{nbits,...},ba' as BA{nbits=nbits',...})) = if nbits >= nbits' then arg else (ba',ba) val (BA{nbits,bits}, BA{bits=bits',nbits=nbits'}) = order arg val minlen = W8A.length bits' fun iszero i = (bits sub i) = 0w0 andalso (iszero (i+1)) fun cmp i = if i = minlen then iszero i else (bits sub i) = (bits' sub i) andalso cmp(i+1) in (cmp 0) handle _ => true end fun equal (arg as (BA{nbits,...},BA{nbits=nbits',...})) = nbits = nbits' andalso eqBits arg fun extend0 (ba as BA{nbits, bits}, n) = if (nbits >= n) then mkCopy ba else let val newbits = W8A.array(sizeOf n, 0w0) fun cpy i = (W8A.update(newbits, i, bits sub i); cpy(i+1)) in (cpy 0) handle _ => (); BA{nbits=n, bits=newbits} end fun extend1 (ba as BA{nbits, bits}, n) = if (nbits >= n) then mkCopy ba else let val len = sizeOf n val newbits = W8A.array(len, 0wxff) val nbytes = byteOf nbits val left = mask7 nbits fun last () = (case mask7 n of 0 => () | lft => W8A.update(newbits, len-1, (newbits sub (len-1)) & (lobits lft)) (* end case *)) fun adjust j = ( if left = 0 then () else W8A.update(newbits, j, (bits sub j) ++ (hibits left)); last ()) fun cpy i = if i = nbytes then adjust i else (W8A.update(newbits, i, bits sub i); cpy(i+1)) in cpy 0; BA{nbits=n, bits=newbits} end fun fit(lb,rb,rbits) = (rb & (lobits rbits)) ++ (lb & (hibits rbits)) fun simpleCopy (src,dest,lastbyte,len) arg = let fun last (s,d) = (case mask7 len of 0 => W8A.update(dest,d,src sub s) | lft => W8A.update(dest,d,fit(dest sub d,src sub s,lft)) (* end case *)) fun cpy (arg as (s,d)) = if d = lastbyte then last arg else (W8A.update(dest,d,src sub s);cpy(s+1,d+1)) in cpy arg end (* rightblt copies bits [shft,shft+len-1] of src to * bits [0,len-1] in target. * Assume all parameters and lengths are okay. *) fun rightblt (src,dest,shft,len) = let val byte = byteOf shft and bitshift = wmask7 shft fun copy lastbyte = let val lshift = 0w8 - bitshift fun finish (sb,s,d) = let val left = mask7 (len - 1) + 1 in if Word.fromInt left <= lshift (* enough bits in sb *) then W8A.update(dest,d,fit(dest sub d,sb >> bitshift,left)) else let val sb' = (sb >> bitshift) ++ ((src sub s) << lshift) in W8A.update(dest,d,fit(dest sub d,sb',left)) end end fun loop (arg as (sb, s, d)) = if d = lastbyte then finish arg else let val sb' = src sub s in W8A.update(dest,d,(sb >> bitshift) ++ ((sb' << lshift) & 0wxFF)); loop(sb',s+1,d+1) end in loop (src sub byte, byte+1, 0) end in if bitshift = 0w0 then simpleCopy (src,dest,byteOf(len-1),len) (byte,0) else copy (byteOf (len-1)) end (* leftblt copies bits [0,len-1] of src to * bits [shft,shft+len-1] in target. * Assume all parameters and lengths are okay. *) fun leftblt (_,_,_,0) = () | leftblt (src,dest,shft,len) = let val byte = byteOf shft and bitshift = wmask7 shft val lastbyte = byteOf (shft+len-1) fun sliceCopy (s,d,len) = let val mask = (lobits len) << bitshift val sb = ((src sub s) << bitshift) & mask val db = (dest sub d) & (Word8.notb mask) in W8A.update(dest,d,sb ++ db) end fun copy () = let val sb = src sub 0 val rshift = 0w8 - bitshift fun finish (sb,s,d) = let val left = mask7(shft + len - 1) + 1 in if Word.fromInt left <= bitshift (* enough bits in sb *) then W8A.update(dest,d,fit(dest sub d,sb >> rshift,left)) else let val sb' = (sb >> rshift) ++ ((src sub s) << bitshift) in W8A.update(dest,d,fit(dest sub d,sb',left)) end end fun loop (arg as (sb, s, d)) = if d = lastbyte then finish arg else let val sb' = src sub s in W8A.update(dest,d,(sb >> rshift) ++ ((sb' << bitshift) & 0wxFF)); loop(sb',s+1,d+1) end in W8A.update(dest,byte,fit(sb << bitshift, dest sub byte, Word.toIntX bitshift)); loop (sb, 1, byte+1) end in if bitshift = 0w0 then simpleCopy (src,dest,lastbyte,len) (0,byte) else if lastbyte = byte then sliceCopy (0,byte,len) else copy () end fun lshift_w (ba, 0w0) = mkCopy ba | lshift_w (BA{nbits, bits}, n) = let val shft = Word.toIntX n val newlen = nbits + shft val newbits = W8A.array(sizeOf newlen, 0w0) in leftblt(bits,newbits,shft,nbits); BA{nbits=newlen,bits=newbits} end fun lshift (ba, shft) = if shft < 0 then badArg("lshift", "negative shift") else lshift_w(ba, Word.fromInt shft) fun op @ (BA{nbits,bits},BA{nbits=nbits',bits=bits'}) = let val newlen = nbits + nbits' val newbits = W8A.array(sizeOf newlen, 0w0) in copybits(bits',newbits); leftblt(bits,newbits,nbits',nbits); BA{nbits=newlen,bits=newbits} end fun concat [] = array (0, false) | concat [ba] = mkCopy ba | concat (l as (BA{bits,nbits}::tl)) = let val newlen = (foldl (fn (BA{nbits,...},a) => a+nbits) 0 l) handle Overflow => raise Size val newbits = W8A.array(sizeOf newlen,0w0) fun cpy (BA{bits,nbits}, shft) = ( leftblt(bits,newbits,shft,nbits); shft+nbits ) in copybits(bits,newbits); foldl cpy nbits tl; BA{nbits=newlen,bits=newbits} end fun slice (ba as BA{nbits,bits},sbit,0) = array (0, false) | slice (ba as BA{nbits,bits},sbit,len) = let val newbits = W8A.array(sizeOf len,0w0) in rightblt(bits,newbits,sbit,len); BA{nbits=len,bits=newbits} end fun extract (ba as BA{nbits,bits},sbit,SOME len) = if sbit < 0 orelse len < 0 orelse sbit > nbits - len then raise Subscript else slice (ba,sbit,len) | extract (ba as BA{nbits,bits},sbit,NONE) = if sbit < 0 orelse sbit > nbits then raise Subscript else slice (ba,sbit,nbits-sbit) fun rshift_w (ba, 0w0) = mkCopy ba | rshift_w (BA{nbits, bits}, n) = let val shft = Word.toIntX n in if shft >= nbits then array (0, false) else let val newlen = nbits - shft val newbits = W8A.array(sizeOf newlen,0w0) in rightblt (bits, newbits, shft, newlen); BA{nbits=newlen, bits=newbits} end end fun rshift (ba, shft) = if shft < 0 then badArg("rshift", "negative shift") else rshift_w(ba, Word.fromInt shft) fun trim (tgt,len) = case mask7 len of 0 => () | lft => let val n = (W8A.length tgt) - 1 in W8A.update(tgt, n, (tgt sub n) & (lobits lft)) end fun andBlend (BA{nbits,bits},BA{bits=bits',nbits=nbits'},tgt,len) = let fun copy i = (W8A.update(tgt,i,(bits sub i)&(bits' sub i));copy(i+1)) in (copy 0) handle _ => (); trim (tgt,len) end fun orBlend f (ba,ba',tgt,len) = let fun order (arg as (ba as BA{nbits,...},ba' as BA{nbits=nbits',...})) = if nbits >= nbits' then arg else (ba',ba) val (BA{nbits,bits},BA{bits=bits',nbits=nbits'}) = order (ba,ba') val bnd = W8A.length bits' (* number of bytes in smaller array *) fun copy2 i = (W8A.update(tgt,i,bits sub i);copy2(i+1)) fun copy1 i = if i = bnd then copy2 bnd else (W8A.update(tgt,i,f(bits sub i, bits' sub i));copy1(i+1)) in (copy1 0) handle _ => (); trim (tgt,len) end fun newblend blendf (ba,ba',len) = let val nb as BA{bits,...} = array (len, false) in blendf(ba,ba',bits,len); nb end val orb = newblend (orBlend Word8.orb) val xorb = newblend (orBlend Word8.xorb) val andb = newblend andBlend fun union ba ba' = let val BA{bits,nbits} = ba val BA{bits=bits',nbits=nbits'} = ba' val nbytes = W8A.length bits val nbytes' = W8A.length bits' fun copy bnd = let fun loop i = if i = bnd then () else (W8A.update(bits,i,(bits sub i) ++ (bits' sub i));loop(i+1)) in loop 0 end in if nbytes <= nbytes' then (copy nbytes; trim (bits,nbits)) else copy nbytes' end fun intersection ba ba' = let val BA{bits,nbits} = ba val BA{bits=bits',nbits=nbits'} = ba' val nbytes = W8A.length bits val nbytes' = W8A.length bits' fun zeroFrom(b,j) = let fun loop i = (W8A.update(b,i,0w0);loop(i+1)) in (loop j) handle _ => () end in if nbytes <= nbytes' then andBlend(ba,ba',bits,nbytes * 8) else ( andBlend(ba,ba',bits,nbytes' * 8); zeroFrom (bits,nbytes') ) end fun flip (nbits, src, tgt) = let val nbytes = byteOf nbits and left = mask7 nbits fun last j = W8A.update(tgt,j,(Word8.notb(src sub j)) & (lobits left)) fun flp i = if i = nbytes then if left = 0 then () else last i else (W8A.update(tgt,i,Word8.notb(src sub i) & 0wxff); flp(i+1)) in flp 0 end fun notb (BA{nbits, bits}) = let val ba as BA{bits=newbits,...} = array (nbits, false) in flip (nbits,bits,newbits); ba end fun setBit (BA{nbits, bits}, i) = let val j = byteOf i and b = bit i in if i >= nbits then raise Subscript else W8A.update (bits, j, ((bits sub j) ++ b)) end fun clrBit (BA{nbits, bits}, i) = let val j = byteOf i and b = Word8.notb(bit i) in if i >= nbits then raise Subscript else W8A.update (bits, j, ((bits sub j) & b)) end fun complement (BA{bits,nbits}) = flip(nbits, bits, bits) fun update (ba,i,true) = setBit (ba,i) | update (ba,i,_) = clrBit (ba,i) fun op sub arg = bitOf arg fun length (BA{nbits, ...}) = nbits fun app f (BA{nbits=0,bits}) = () | app f (BA{nbits,bits}) = let val last = byteOf (nbits-1) fun loop (0,_) = () | loop (n,byte) = (f ((byte&0w1) = 0w1); loop (n-1,byte >> 0w1)) fun f' (i,byte) = if i < last then loop (8,byte) else loop (mask7 (nbits - 1) + 1, byte) in W8A.appi f' bits end (* FIX: Reimplement using W8A.foldi *) fun foldl f a (BA{nbits,bits}) = let fun loop (i,a) = if i = nbits then a else let val b = ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 in loop (i+1, f(b,a)) end in loop (0,a) end (* FIX: Reimplement using W8A.foldr *) fun foldr f a (BA{nbits,bits}) = let fun loop (~1,a) = a | loop (i,a) = let val b = ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 in loop (i-1, f(b,a)) end in loop (nbits-1,a) end fun valid (nbits,sbit,NONE) = if sbit < 0 orelse sbit > nbits then raise Subscript else nbits - sbit | valid (nbits,sbit,SOME len) = if sbit < 0 orelse len < 0 orelse sbit > nbits - len then raise Subscript else len (* FIX: Reimplement using W8A.appi *) fun appi' f (BA{nbits=0,bits},_,_) = () | appi' f (BA{nbits,bits},sbit,l) = let val len = valid (nbits, sbit, l) fun loop (_, 0) = () | loop (i, n) = let val b = ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 in f(i,b); loop (i+1,n-1) end in loop (sbit,len) end (* FIX: Reimplement using W8A.foldi *) fun foldli' f a (BA{nbits,bits},sbit,l) = let val len = valid (nbits, sbit, l) val last = sbit+len fun loop (i,a) = if i = last then a else let val b = ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 in loop (i+1, f(i,b,a)) end in loop (sbit,a) end (* FIX: Reimplement using W8A.foldr *) fun foldri' f a (BA{nbits,bits},sbit,l) = let val len = valid (nbits, sbit, l) fun loop (i,a) = if i < sbit then a else let val b = ((W8A.sub (bits,byteOf i)) & (bit i)) <> 0w0 in loop (i-1, f(i,b,a)) end in loop (sbit+len-1,a) end (* FIX: Reimplement using general-purpose copy *) fun copy' {src = src as BA{nbits,bits},si,len,dst,di} = let val l = valid (nbits, si, len) val BA{nbits=nbits',bits=bits'} = dst val _ = if di < 0 orelse nbits' - di < l then raise Subscript else () val last = si + l fun loop (si,di) = if si = last then () else ( if bitOf (src, si) then setBit(dst,di) else clrBit(dst,di); loop (si+1,di+1) ) in loop (si,di) end fun modify f (BA{nbits=0,bits}) = () | modify f (BA{nbits,bits}) = let val last = byteOf (nbits-1) fun loop (0,_,a,_) = a | loop (n,byte,a,mask) = if f ((byte&mask) = mask) then loop (n-1,byte, a&mask, mask << 0w1) else loop (n-1,byte, a, mask << 0w1) fun f' (i,byte) = if i < last then loop (8,byte,0w0,0w1) else loop (mask7 (nbits - 1) + 1, byte,0w0,0w1) in W8A.modifyi f' bits end (* FIX: Reimplement using W8A.modifyi *) fun modifyi' f (BA{nbits=0,bits},sbit,l) = () | modifyi' f (BA{nbits,bits},sbit,l) = let val len = valid (nbits, sbit, l) val last = sbit+len fun loop i = if i = last then () else let val index = byteOf i val biti = bit i val byte = W8A.sub (bits,index) val b = (byte & biti) <> 0w0 val b' = f(i,b) in if b = b' then () else if b' then W8A.update(bits,index,byte ++ biti) else W8A.update(bits,index,byte & (Word8.notb biti)); loop (i+1) end in loop sbit end (* additional operation from Basis Library proposal 2015-003 *) fun toList (BA{nbits, bits}) = let fun loop (~1, a) = a | loop (i, a) = let val b = ((Word8Array.sub (bits,byteOf i)) & (bit i)) <> 0w0 in loop (i-1, b :: a) end in loop (nbits-1, []) end end (* local *) val << = lshift_w val >> = rshift_w end (* structure Vector *) open Vector type array = vector fun vector a = a fun copy { src, dst, di } = copy' { src = src, dst = dst, di = di, si = 0, len = NONE } val copyVec = copy fun appi f a = appi' f (a, 0, NONE) fun modifyi f a = modifyi' f (a, 0, NONE) fun foldli f init a = foldli' f init (a, 0, NONE) fun foldri f init a = foldri' f init (a, 0, NONE) (* These are slow, pedestrian implementations.... *) fun findi p a = let val len = length a fun fnd i = if i >= len then NONE else let val x = sub (a, i) in if p (i, x) then SOME (i, x) else fnd (i + 1) end in fnd 0 end fun find p a = let val len = length a fun fnd i = if i >= len then NONE else let val x = sub (a, i) in if p x then SOME x else fnd (i + 1) end in fnd 0 end fun exists p a = let val len = length a fun ex i = i < len andalso (p (sub (a, i)) orelse ex (i + 1)) in ex 0 end fun all p a = let val len = length a fun al i = i >= len orelse (p (sub (a, i)) andalso al (i + 1)) in al 0 end fun collate c (a1, a2) = let val l1 = length a1 val l2 = length a2 val l12 = Int.min (l1, l2) fun col i = if i >= l12 then Int.compare (l1, l2) else case c (sub (a1, i), sub (a2, i)) of EQUAL => col (i + 1) | unequal => unequal in col 0 end (* additional operations from Basis Library proposal 2015-003 *) fun fromVector (Vector.BA{nbits, bits}) = let val newBits = Unsafe.Word8Array.create(Word8Array.length bits) in Word8Array.copy{di = 0, dst = newBits, src = bits}; BA{nbits = nbits, bits = newBits} end val toVector = fromVector end (* structure BitArray *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/bsearch-fn.sml000066400000000000000000000021141416264345000240120ustar00rootroot00000000000000(* bsearch-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Binary searching on sorted monomorphic arrays. *) functor BSearchFn (A : MONO_ARRAY) : sig structure A : MONO_ARRAY val bsearch : (('a * A.elem) -> order) -> ('a * A.array) -> (int * A.elem) option (* binary search on ordered monomorphic arrays. The comparison function * cmp embeds a projection function from the element type to the key * type. *) end = struct structure A = A (* binary search on ordered monomorphic arrays. The comparison function * cmp embeds a projection function from the element type to the key * type. *) fun bsearch cmp (key, arr) = let fun look (lo, hi) = if hi >= lo then let val m = lo + (hi - lo) div 2 val x = A.sub(arr, m) in case cmp(key, x) of LESS => look(lo, m-1) | EQUAL => (SOME(m, x)) | GREATER => look(m+1, hi) (* end case *) end else NONE in look (0, A.length arr - 1) end end; (* BSearch *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/char-map-sig.sml000066400000000000000000000013061416264345000242540ustar00rootroot00000000000000(* char-map-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Fast, read-only, maps from characters to values. *) signature CHAR_MAP = sig type 'a char_map (* a finite map from characters to 'a *) val mkCharMap : {default : 'a, bindings : (string * 'a) list} -> 'a char_map (* make a character map which maps the bound characters to their * bindings and maps everything else to the default value. *) val mapChr : 'a char_map -> char -> 'a (* map the given character *) val mapStrChr : 'a char_map -> (string * int) -> 'a (* (mapStrChr c (s, i)) is equivalent to (mapChr c (String.sub(s, i))) *) end (* CHAR_MAP *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/char-map.sml000066400000000000000000000021521416264345000234740ustar00rootroot00000000000000(* char-map.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Fast, read-only, maps from characters to values. *) structure CharMap :> CHAR_MAP = struct (* we can use unchecked array operations, since the indices are always * in range. *) val sub = Unsafe.Array.sub val update = Unsafe.Array.update (* a finite map from characters to 'a *) type 'a char_map = 'a Array.array (* make a character map which maps the bound characters to their * bindings and maps everything else to the default value. *) fun mkCharMap {default, bindings} = let (* this array maps characters to indices in the valMap *) val arr = Array.array (Char.maxOrd, default) fun doBinding (s, v) = CharVector.app (fn c => update(arr, Char.ord c, v)) s in List.map doBinding bindings; arr end (* map the given character ordinal *) fun mapChr cm i = sub(cm, Char.ord i) (* (mapStrChr c (s, i)) is equivalent to (mapChr c (String.sub(s, i))) *) fun mapStrChr cm (s, i) = sub(cm, Char.ord(String.sub(s, i))) end (* CharMap *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/dynamic-array-fn.sml000066400000000000000000000063401416264345000251500ustar00rootroot00000000000000(* dynamic-array-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Monomorphic arrays of unbounded length * * TODO: add the missing operations that the DynamicArray structure * provides. Adding these will require uncluding the MONO_ARRAY_SLICE * structure as a functor parameter. *) functor DynamicArrayFn (A : MONO_ARRAY) : MONO_DYNAMIC_ARRAY = struct type elem = A.elem (* BLOCK(arr, dflt, bnd): * arr - current data store; is at least !bnd+1 elements * dflt - default value * bnd - values at !bnd and above are default for reading *) datatype array = BLOCK of A.array ref * elem * int ref exception Subscript = General.Subscript exception Size = General.Size fun array (sz, dflt) = BLOCK(ref (A.array (sz, dflt)), dflt, ref (~1)) (* fromList (l, v) creates an array using the list of values l * plus the default value v. *) fun fromList (initList, dflt) = let val arr = A.fromList initList in BLOCK(ref arr, dflt, ref(A.length arr - 1)) end fun toList (BLOCK(ref arr, _, bnd)) = let val len = !bnd + 1 in List.tabulate (len, fn i => A.sub(arr, i)) end (* tabulate (sz,fill,dflt) acts like Array.tabulate, plus * stores default value dflt. Raises Size if sz < 0. *) fun tabulate (sz, fillFn, dflt) = BLOCK(ref(A.tabulate(sz, fillFn)), dflt, ref(sz-1)) fun subArray (BLOCK(arr, dflt, bnd), lo, hi) = let val arrval = !arr val bnd = !bnd fun copy i = A.sub(arrval, i+lo) in if hi <= bnd then BLOCK(ref(A.tabulate(hi-lo, copy)), dflt, ref(hi-lo)) else if lo <= bnd then BLOCK(ref(A.tabulate(bnd-lo, copy)), dflt, ref(bnd-lo)) else array(0,dflt) end fun default (BLOCK(_, dflt, _)) = dflt fun sub (BLOCK(arr, dflt, _), idx) = (A.sub(!arr, idx)) handle Subscript => if idx < 0 then raise Subscript else dflt fun bound (BLOCK(_, _, bnd)) = (!bnd) fun expand (arr,oldlen,newlen,dflt) = let fun fillfn i = if i < oldlen then A.sub(arr,i) else dflt in A.tabulate(newlen, fillfn) end fun update (BLOCK(arr, dflt, bnd), idx, v) = let val len = A.length (!arr) in if idx >= len then arr := expand(!arr, len, Int.max(len+len, idx+1), dflt) else (); A.update(!arr,idx,v); if idx > !bnd then bnd := idx else () end fun truncate (a as BLOCK(arr, dflt, bndref), sz) = let val bnd = !bndref val newbnd = sz - 1 val arr_val = !arr val array_sz = A.length arr_val fun fillDflt (i,stop) = if i = stop then () else (A.update(arr_val,i,dflt);fillDflt(i-1,stop)) in if newbnd < 0 then (bndref := ~1;arr := A.array(0,dflt)) else if newbnd >= bnd then () else if 3 * sz < array_sz then let val BLOCK(arr',_,bnd') = subArray(a,0,newbnd) in (bndref := !bnd'; arr := !arr') end else fillDflt(bnd,newbnd) end end (* DynamicArrayFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/dynamic-array-sig.sml000066400000000000000000000065061416264345000253330ustar00rootroot00000000000000(* dynamic-array-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for unbounded polymorphic arrays. *) signature DYNAMIC_ARRAY = sig type 'a array val array : (int * 'a) -> 'a array (* array (sz, e) creates an unbounded array all of whose elements * are initialized to e. sz (>= 0) is used as a * hint of the potential range of indices. Raises Size if a * negative hint is given. *) val subArray : ('a array * int * int) -> 'a array (* `subArray (a,lo,hi)` creates a new array with the same default * as `a`, and whose values in the range [0,hi-lo] are equal to * the values in `a` in the range [lo, hi]. * Raises Size if lo > hi *) val fromList : 'a list * 'a -> 'a array (* fromList (l, v) creates an array using the list of values l * plus the default value v. *) val fromVector : 'a Vector.vector * 'a -> 'a array (* fromVector (vec, dflt) creates an array using the vector of values vec * plus the default value dflt. *) val toList : 'a array -> 'a list (* return the array's contents as a list *) val toVector : 'a array -> 'a vector (* return the array's contents as a vector *) val tabulate: (int * (int -> 'a) * 'a) -> 'a array (* tabulate (sz,fill,dflt) acts like Array.tabulate, plus * stores default value dflt. Raises Size if sz < 0. *) val default : 'a array -> 'a (* default returns array's default value *) val sub : ('a array * int) -> 'a (* sub (a,idx) returns value of the array at index idx. * If that value has not been set by update, it returns the default value. * Raises Subscript if idx < 0 *) val update : ('a array * int * 'a) -> unit (* update (a,idx,v) sets the value at index idx of the array to v. * Raises Subscript if idx < 0 *) val bound : 'a array -> int (* bound returns an upper bound on the index of values that have been * changed; i.e., values at indices above the bound are the default. *) val truncate : ('a array * int) -> unit (* truncate (a,sz) makes every entry with index > sz the default value *) (* standard array iterators *) val appi : (int * 'a -> unit) -> 'a array -> unit val app : ('a -> unit) -> 'a array -> unit val modifyi : (int * 'a -> 'a) -> 'a array -> unit val modify : ('a -> 'a) -> 'a array -> unit val foldli : (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldri : (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldl : ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val findi : (int * 'a -> bool) -> 'a array -> (int * 'a) option val find : ('a -> bool) -> 'a array -> 'a option val exists : ('a -> bool) -> 'a array -> bool val all : ('a -> bool) -> 'a array -> bool val collate : ('a * 'a -> order) -> 'a array * 'a array -> order (* TODO val copy : {di:int, dst:'a array, src:'a array} -> unit val copyVec : {di:int, dst:'a array, src:'a vector} -> unit *) val vector : 'a array -> 'a vector (* return the array's contents as a vector. * Note: this function is DEPRECATED in favor of toVector. *) end (* DYNAMIC_ARRAY *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/dynamic-array.sml000066400000000000000000000110301416264345000245370ustar00rootroot00000000000000(* dynamic-array.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Polymorhic arrays of unbounded length *) structure DynamicArray :> DYNAMIC_ARRAY = struct structure A = Array (* BLOCK(arr, dflt, bnd): * arr - current data store; is at least !bnd+1 elements * dflt - default value * bnd - values at indices above !bnd are default for reading *) datatype 'a array = BLOCK of ('a A.array ref * 'a * int ref) exception Subscript = General.Subscript exception Size = General.Size fun array (sz, dflt) = BLOCK(ref(A.array(sz, dflt)), dflt, ref(~1)) (* fromList (l, v) creates an array using the list of values l * plus the default value v. *) fun fromList (initList, dflt) = let val arr = A.fromList initList in BLOCK(ref arr, dflt, ref(A.length arr - 1)) end fun toList (BLOCK(ref arr, _, bnd)) = let val len = !bnd + 1 in List.tabulate (len, fn i => Array.sub(arr, i)) end fun fromVector (vec, dflt) = let val arr = A.tabulate (Vector.length vec, fn i => Vector.sub(vec, i)) in BLOCK(ref arr, dflt, ref(Vector.length vec - 1)) end fun toVector (BLOCK(ref arr, _, bnd)) = let val len = !bnd + 1 in ArraySlice.vector (ArraySlice.slice(arr, 0, SOME len)) end (* tabulate (sz,fill,dflt) acts like Array.tabulate, plus * stores default value dflt. Raises Size if sz < 0. *) fun tabulate (sz, fillFn, dflt) = BLOCK(ref(A.tabulate(sz, fillFn)), dflt, ref(sz-1)) fun subArray (BLOCK(arr, dflt, bnd), lo, hi) = let val arrval = !arr val bnd = !bnd fun copy i = A.sub(arrval, i+lo) in if hi <= bnd then BLOCK(ref(A.tabulate(hi-lo, copy)), dflt, ref(hi-lo)) else if lo <= bnd then BLOCK(ref(A.tabulate(bnd-lo, copy)), dflt, ref(bnd-lo)) else array(0, dflt) end fun default (BLOCK(_, dflt, _)) = dflt fun sub (BLOCK(arr, dflt, _), idx) = (A.sub(!arr, idx)) handle Subscript => if idx < 0 then raise Subscript else dflt fun bound (BLOCK(_, _, bnd)) = (!bnd) fun expand(arr, oldlen, newlen, dflt) = let fun fillfn i = if i < oldlen then A.sub(arr,i) else dflt in A.tabulate(newlen, fillfn) end fun update (BLOCK(arr, dflt, bnd), idx, v) = let val len = A.length (!arr) in if idx >= len then arr := expand(!arr, len, Int.max(len+len,idx+1), dflt) else (); A.update(!arr,idx,v); if idx > !bnd then bnd := idx else () end fun truncate (a as BLOCK(arr, dflt, bndref), sz) = let val bnd = !bndref val newbnd = sz - 1 val arr_val = !arr val array_sz = A.length arr_val fun fillDflt (i,stop) = if i = stop then () else (A.update(arr_val,i,dflt); fillDflt(i-1, stop)) in if newbnd < 0 then (bndref := ~1;arr := A.array(0, dflt)) else if newbnd >= bnd then () else if 3 * sz < array_sz then let val BLOCK(arr',_,bnd') = subArray(a, 0, newbnd) in (bndref := !bnd'; arr := !arr') end else fillDflt(bnd, newbnd) end (* get the array slice that covers the defined portion of the array *) fun slice (BLOCK(arr, _, bnd)) = ArraySlice.slice(!arr, 0, SOME(!bnd + 1)) (* we implement the iterators by using the array slice operations *) fun vector arr = ArraySlice.vector (slice arr) fun appi f arr = ArraySlice.appi f (slice arr) fun app f arr = ArraySlice.app f (slice arr) fun modifyi f arr = ArraySlice.modifyi f (slice arr) fun modify f arr = ArraySlice.modify f (slice arr) fun foldli f init arr = ArraySlice.foldli f init (slice arr) fun foldri f init arr = ArraySlice.foldri f init (slice arr) fun foldl f init arr = ArraySlice.foldl f init (slice arr) fun foldr f init arr = ArraySlice.foldr f init (slice arr) fun findi pred arr = ArraySlice.findi pred (slice arr) fun find pred arr = ArraySlice.find pred (slice arr) fun exists pred arr = ArraySlice.exists pred (slice arr) fun all pred arr = ArraySlice.all pred (slice arr) fun collate cmp (arr1, arr2) = ArraySlice.collate cmp (slice arr1, slice arr2) (* TODO val copy : {di:int, dst:'a array, src:'a array} -> unit val copyVec : {di:int, dst:'a array, src:'a vector} -> unit *) end (* DynamicArrayFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/engine.mlton.sml000066400000000000000000000044511416264345000244050ustar00rootroot00000000000000(* Copyright (C) 1999-2004 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under the GNU General Public License (GPL). * Please see the file MLton-LICENSE for license information. *) signature ENGINE = sig type 'a t datatype 'a res = Done of 'a | Raise of exn | TimeOut of 'a t val new: (unit -> 'a) -> 'a t val repeat: {thunk: unit -> 'a, limit: Time.time, tries: int} -> 'a option val run: 'a t * Time.time -> 'a res val timeLimit: Time.time * (unit -> 'a) -> 'a option end structure Engine: ENGINE = struct open MLton datatype 'a t = T of {return: 'a res Thread.t option ref, thread: Thread.Runnable.t} and 'a res = Done of 'a | Raise of exn | TimeOut of 'a t val which = Itimer.Real val signal = Itimer.signal which fun done (return): unit = (return := NONE ; Itimer.set (which, {value = Time.zeroTime, interval = Time.zeroTime}) ; Signal.setHandler (signal, Signal.Handler.default)) fun new (f: unit -> 'a): 'a t = let val return = ref NONE val thread = Thread.new (fn () => let val res = Done (f ()) handle e => Raise e val ret = valOf (!return) val _ = done return in Thread.switch (fn _ => Thread.prepare (ret, res)) end) val thread = Thread.prepare (thread, ()) in T {return = return, thread = thread} end fun run (T {return, thread}, time: Time.time): 'a res = Thread.switch (fn cur: 'a res Thread.t => let val _ = return := SOME cur fun handler (me: Thread.Runnable.t): Thread.Runnable.t = Thread.prepare (Thread.prepend (cur, fn () => (done return ; TimeOut (T {return = return, thread = me}))), ()) val _ = Signal.setHandler (signal, Signal.Handler.handler handler) val _ = Itimer.set (which, {value = time, interval = Time.zeroTime}) in thread end) fun timeLimit (t: Time.time, f: unit -> 'a): 'a option = case run (new f, t) of Done a => SOME a | Raise e => raise e | TimeOut _ => NONE fun repeat {thunk, limit, tries} = let fun loop (n: int) = if n <= 0 then NONE else (case timeLimit (limit, thunk) of NONE => loop (n - 1) | SOME a => SOME a) in loop tries end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/fifo-sig.sml000066400000000000000000000014341416264345000235110ustar00rootroot00000000000000(* fifo-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Applicative fifos * *) signature FIFO = sig type 'a fifo exception Dequeue val empty : 'a fifo val isEmpty : 'a fifo -> bool val enqueue : 'a fifo * 'a -> 'a fifo val dequeue : 'a fifo -> 'a fifo * 'a val next : 'a fifo -> ('a * 'a fifo) option val delete : ('a fifo * ('a -> bool)) -> 'a fifo val head : 'a fifo -> 'a val peek : 'a fifo -> 'a option val length : 'a fifo -> int val contents : 'a fifo -> 'a list val app : ('a -> unit) -> 'a fifo -> unit val map : ('a -> 'b) -> 'a fifo -> 'b fifo val foldl : ('a * 'b -> 'b) -> 'b -> 'a fifo -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a fifo -> 'b end (* FIFO *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/fifo.sml000066400000000000000000000035601416264345000227330ustar00rootroot00000000000000(* fifo.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Applicative fifos * *) structure Fifo : FIFO = struct datatype 'a fifo = Q of {front: 'a list, rear: 'a list} exception Dequeue val empty = Q{front=[],rear=[]} fun isEmpty (Q{front=[],rear=[]}) = true | isEmpty _ = false fun enqueue (Q{front,rear},x) = Q{front=front,rear=(x::rear)} fun dequeue (Q{front=(hd::tl),rear}) = (Q{front=tl,rear=rear},hd) | dequeue (Q{rear=[],...}) = raise Dequeue | dequeue (Q{rear,...}) = dequeue(Q{front=rev rear,rear=[]}) fun next (Q{front=(hd::tl),rear}) = SOME(hd, Q{front=tl,rear=rear}) | next (Q{rear=[],...}) = NONE | next (Q{rear,...}) = next(Q{front=rev rear,rear=[]}) fun delete (Q{front, rear}, pred) = let fun doFront [] = {front = doRear(rev rear), rear = []} | doFront (x::r) = if (pred x) then {front = r, rear = rear} else let val {front, rear} = doFront r in {front = x :: front, rear = rear} end and doRear [] = [] | doRear (x::r) = if (pred x) then r else x :: (doRear r) in Q(doFront front) end fun peek (Q{front=(hd::_), ...}) = SOME hd | peek (Q{rear=[], ...}) = NONE | peek (Q{rear, ...}) = SOME(hd(rev rear)) fun head (Q{front=(hd::_),...}) = hd | head (Q{rear=[],...}) = raise Dequeue | head (Q{rear,...}) = hd(rev rear) fun length (Q {rear,front}) = (List.length rear) + (List.length front) fun contents (Q {rear, front}) = (front @ (rev rear)) fun app f (Q{front,rear}) = (List.app f front; List.app f (List.rev rear)) fun map f (Q{front,rear}) = Q{front = List.map f front, rear = rev(List.map f(rev rear))} fun foldl f b (Q{front,rear}) = List.foldr f (List.foldl f b front) rear fun foldr f b (Q{front,rear}) = List.foldr f (List.foldl f b rear) front end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/fmt-fields.sml000066400000000000000000000165111416264345000240420ustar00rootroot00000000000000(* fmt-fields.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This module defines types and routines that are common to both * the Format and Scan structures. *) structure FmtFields : sig (* precompiled format specifiers *) datatype sign = DfltSign (* default: put a sign on negative numbers *) | AlwaysSign (* "+" always has sign (+ or -) *) | BlankSign (* " " put a blank in the sign field for positive numbers *) datatype neg_sign = MinusSign (* default: use "-" for negative numbers *) | TildeSign (* "~" use "~" for negative numbers *) type field_flags = { sign : sign, neg_char : neg_sign, zero_pad : bool, base : bool, large : bool } datatype field_wid = NoPad | Wid of int datatype real_format = F_Format (* "%f" *) | E_Format of bool (* "%e" or "%E" *) | G_Format of bool (* "%g" or "%G" *) datatype field_type = OctalField | IntField | HexField | CapHexField | CharField | BoolField | StrField of int option | RealField of {prec : int, format : real_format} datatype fmt_spec = Raw of substring | CharSet of char -> bool | Field of (field_flags * field_wid * field_type) datatype fmt_item = ATOM of Atom.atom | LINT of LargeInt.int | INT of Int.int | LWORD of LargeWord.word | WORD of Word.word | WORD8 of Word8.word | BOOL of bool | CHR of char | STR of string | REAL of Real.real | LREAL of LargeReal.real | LEFT of (int * fmt_item) (* left justify in field of given width *) | RIGHT of (int * fmt_item) (* right justify in field of given width *) exception BadFormat (* bad format string *) val scanFieldSpec : substring -> (fmt_spec * substring) val scanField : substring -> (fmt_spec * substring) end = struct structure SS = Substring structure SC = StringCvt (* precompiled format specifiers *) datatype sign = DfltSign (* default: put a sign on negative numbers *) | AlwaysSign (* "+" always has sign (+ or -) *) | BlankSign (* " " put a blank in the sign field for positive numbers *) datatype neg_sign = MinusSign (* default: use "-" for negative numbers *) | TildeSign (* "~" use "~" for negative numbers *) type field_flags = { sign : sign, neg_char : neg_sign, zero_pad : bool, base : bool, large : bool } datatype field_wid = NoPad | Wid of int datatype real_format = F_Format (* "%f" *) | E_Format of bool (* "%e" or "%E" *) | G_Format of bool (* "%g" or "%G" *) datatype field_type = OctalField | IntField | HexField | CapHexField | CharField | BoolField | StrField of int option | RealField of {prec : int, format : real_format} datatype fmt_spec = Raw of substring | CharSet of char -> bool | Field of (field_flags * field_wid * field_type) datatype fmt_item = ATOM of Atom.atom | LINT of LargeInt.int | INT of Int.int | LWORD of LargeWord.word | WORD of Word.word | WORD8 of Word8.word | BOOL of bool | CHR of char | STR of string | REAL of Real.real | LREAL of LargeReal.real | LEFT of (int * fmt_item) (* left justify in field of given width *) | RIGHT of (int * fmt_item) (* right justify in field of given width *) exception BadFormat (* bad format string *) (* string to int conversions *) val decToInt : (char, substring) SC.reader -> (Int.int, substring) SC.reader = Int.scan SC.DEC (* scan a field specification. Assume that the previous character in the * base string was "%" and that the first character in the substring fmtStr * is not "%". *) fun scanFieldSpec fmtStr = let val (fmtStr, flags) = let fun doFlags (ss, flags : field_flags) = ( case (SS.getc ss, flags) of (SOME(#" ", _), {sign=AlwaysSign, ...}) => raise BadFormat | (SOME(#" ", ss'), _) => doFlags (ss', { sign = BlankSign, neg_char = #neg_char flags, zero_pad = #zero_pad flags, base = #base flags, large = #large flags }) | (SOME(#"+", _), {sign=BlankSign, ...}) => raise BadFormat | (SOME(#"+", ss'), _) => doFlags (ss', { sign = AlwaysSign, neg_char = #neg_char flags, zero_pad = #zero_pad flags, base = #base flags, large = #large flags }) | (SOME(#"~", ss'), _) => doFlags (ss', { sign = #sign flags, neg_char = TildeSign, zero_pad = #zero_pad flags, base = #base flags, large = #large flags }) | (SOME(#"-", _), {neg_char = TildeSign, ...}) => raise BadFormat | (SOME(#"-", ss'), _) => doFlags (ss', { sign = #sign flags, neg_char = MinusSign, zero_pad = #zero_pad flags, base = #base flags, large = #large flags }) | (SOME(#"#", ss'), _) => doFlags (ss', { sign = #sign flags, neg_char = #neg_char flags, zero_pad = #zero_pad flags, base = true, large = #large flags }) | (SOME(#"0", ss'), _) => doFlags (ss', { sign = #sign flags, neg_char = #neg_char flags, zero_pad = true, base = #base flags, large = #large flags }) | _ => (ss, flags) (* end case *)) in doFlags (fmtStr, { sign = DfltSign, neg_char = MinusSign, zero_pad = false, base = false, large = false }) end val (wid, fmtStr) = if (Char.isDigit(valOf(SS.first fmtStr))) then let val (n, fmtStr) = valOf (decToInt SS.getc fmtStr) in (Wid n, fmtStr) end else (NoPad, fmtStr) val (ty, fmtStr) = (case SS.getc fmtStr of (SOME(#"d", ss)) => (IntField, ss) | (SOME(#"X", ss)) => (CapHexField, ss) | (SOME(#"x", ss)) => (HexField, ss) | (SOME(#"o", ss)) => (OctalField, ss) | (SOME(#"c", ss)) => (CharField, ss) | (SOME(#"s", ss)) => (StrField NONE, ss) | (SOME(#"b", ss)) => (BoolField, ss) | (SOME(#".", ss)) => let (* NOTE: "." ought to be allowed for d,X,x,o and s formats as it is in ANSI C *) val (n, ss) = (case decToInt SS.getc ss of SOME(n, ss') => (n, ss') | NONE => (0, ss) (* end case *)) fun real (format, ss) = (RealField{prec = n, format = format}, ss) in case SS.getc ss of (SOME(#"E" , ss))=> real(E_Format true, ss) | (SOME(#"e" , ss))=> real(E_Format false, ss) | (SOME(#"f" , ss))=> real(F_Format, ss) | (SOME(#"G" , ss))=> real(G_Format true, ss) | (SOME(#"g", ss)) => real(G_Format false, ss) | (SOME(#"s", ss)) => (StrField(SOME n), ss) | _ => raise BadFormat (* end case *) end | (SOME(#"E", ss)) => (RealField{prec=6, format=E_Format true}, ss) | (SOME(#"e", ss)) => (RealField{prec=6, format=E_Format false}, ss) | (SOME(#"f", ss)) => (RealField{prec=6, format=F_Format}, ss) | (SOME(#"G", ss)) => (RealField{prec=6, format=G_Format true}, ss) | (SOME(#"g", ss)) => (RealField{prec=6, format=G_Format false}, ss) | _ => raise BadFormat (* end case *)) in (Field(flags, wid, ty), fmtStr) end (* scanFieldSpec *) fun scanField fmtStr = (case SS.getc fmtStr of (SOME(#"%", fmtStr')) => (Raw(SS.slice(fmtStr, 0, SOME 1)), fmtStr') | _ => scanFieldSpec fmtStr (* end case *)) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/fnv-hash.sml000066400000000000000000000022161416264345000235170ustar00rootroot00000000000000(* fnv-hash.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The interface to an implementation of the Fowler–Noll–Vo (FNV) hashing * algorithm. We use the 64-bit FNV-1a algorithm. * * See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function for details. *) structure FNVHash : sig val offsetBasis : Word64.word val hashByte : Word8.word * Word64.word -> Word64.word val hashChar : char * Word64.word -> Word64.word val hashString : string -> word val hashSubstring : substring -> word end = struct (* values from https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function *) val offsetBasis : Word64.word = 0wxcbf29ce484222325 val prime : Word64.word = 0wx00000100000001B3 fun hashOne (b, h) = Word64.xorb(b, h) * prime fun hashByte (b, h) = hashOne (Word64.fromLargeWord(Word8.toLargeWord b), h) fun hashChar (c, h) = hashOne (Word64.fromInt(Char.ord c), h) fun hashString s = Word.fromLarge (CharVector.foldl hashChar offsetBasis s) fun hashSubstring ss = Word.fromLarge (Substring.foldl hashChar offsetBasis ss) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/format-comb-sig.sml000066400000000000000000000166151416264345000250030ustar00rootroot00000000000000(* format-comb-sig.sml * * COPYRIGHT (c) 2007 The Fellowship of SML/NJ * * Well-typed "printf" for SML, aka "Unparsing Combinators". * This code was written by Matthias Blume (2002). Inspiration * obtained from Olivier Danvy's "Functional Unparsing" work. * * Description: * * The idea is to use combinators for constructing something akin to * the format string of C's printf function. The difference is, however, * that our formats aren't strings. Instead, format( fragment)s have * meaningful types, and passing them to function "format" results * in a curried function whose arguments have precisely the types that * correspond to argument-consuming parts of the format. (Such * argument-consuming parts are similar to the %-specifications of printf.) * * Here is how the typing works: There is an underlying notion of * "abstract formats" of type 'a format. However, the user operates * at the level of "format fragments" which have type ('a, 'b) * fragment and are typically polymorphic in 'a (where 'b is * instantiated to some type containing 'a). Fragments are * functions from formats to formats and can be composed freely using * the function composition operator 'o'. This form of format * composition translates to a corresponding concatenation of the * resulting output. * * Fragments are composed from two kids of primitve fragments called * "elements" and "glue", respectively. An "element" is a fragment that * consumes some argument (which thanks to the typing magic appears as a * curried argument when the format gets executed). As "glue" we refer * to fragments that do not consume arguments but merely insert fixed * text (fixed at format construction time) into the output. * * There are also adjustment operations that pad, trim, or fit the output * of entire fragments (primitive or not) to a given size. * * A number of elements and some glue has been predefined. Here are * examples on how to use this facility: * * open FormatComb * * format nothing ==> "" * * format int ==> fn: int -> string * format int 1234 ==> "1234" * * format (text "The square of " o int o text " is " o int o text ".") * ==> fn: int -> int -> string * format (text "The square of " o int o text " is " o int o text ".") 2 4 * ==> "The square of 2 is 4." * * format (int o bool o char) ==> fn : int -> bool -> char -> string * format (int o bool o char) 1 true #"x" * ==> "1truex" * * format (glue string "glue vs. " o string o glue int 42 o sp 5 o int) * "ordinary text " 17 * ==> "glue vs. ordinary text 42 17" * * Fragments can be padded, trimmed, or fitted to generate text pieces of * specified sizes. Padding/trimming/fitting may be nested. * The operations are parameterized by a place (left, center, right) and * a width. Padding never shrinks strings, trimming never extends * strings, and fitting is done as necessary by either padding or trimming. * Examples: * * format (pad left 6 int) 1234 ==> " 1234" * format (pad center 6 int) 1234 ==> " 1234 " * format (pad right 6 int) 1234 ==> "1234 " * format (trim left 2 int) 1234 ==> "34" * format (trim center 2 int) 1234 ==> "23" * format (trim right 2 int) 1234 ==> "12" * format (fit left 3 int) 12 ==> " 12" * format (fit left 3 int) 123 ==> "123" * format (fit left 3 int) 1234 ==> "234" * * Nesting: * * format (pad right 20 (int o pad left 10 real) o text "x") 12 22.3 * ==> "12 22.3 x" *) signature FORMAT_COMB = sig (* We reveal "fragments" to be functions from abstract formats * to abstract formats. This is to make sure we can use function * composition on them. *) type 'a format type ('a, 'b) fragment = 'a format -> 'b format (* Two primitive kinds of fragments: Glue inserts some text * into the output without consuming an argument. Elements * insert text corresponding to some (curried) argument into * the output: *) type 'a glue = ('a, 'a) fragment type ('a, 't) element = ('a, 't -> 'a) fragment type 'a gg (* abstract helper type *) (* Format execution... *) (* 1. Simple version, produce final result as a string: *) val format : (string, 'a) fragment -> 'a (* 2. Complex version, take a receiver function that will * be invoked with the final result. The result is * still in non-concatenated form at this time. * (Internally, the combinators avoid string concatenation * as long as there is no padding/trimming/fitting going on.) *) val format' : (string list -> 'b) -> ('b, 'a) fragment -> 'a (* Make a type-specific element given a toString function for this type *) val using : ('t -> string) -> ('a, 't) element (* Instantiate 'using' for a few types... *) val int : ('a, int) element (* using Int.toString *) val real : ('a, real) element (* using Real.toString *) val bool : ('a, bool) element (* using Bool.toString *) val string : ('a, string) element (* using (fn x => x) *) val string' : ('a, string) element (* using String.toString *) val char : ('a, char) element (* using String.str *) val char' : ('a, char) element (* using Char.toString *) (* Parameterized elements... *) val int' : StringCvt.radix -> ('a, int) element (* using (Int.fmt r) *) val real' : StringCvt.realfmt -> ('a, real) element (* using(Real.fmt f) *) (* "polymorphic" elements *) val list : ('a, 'x) element -> ('a, 'x list) element (* "[", ", ", "]" *) val option : ('a, 'x) element -> ('a, 'x option) element val seq : (('x * 'a gg -> 'a gg) -> 'a gg -> 's -> 'a gg) -> (* foldr *) 'a glue -> (* separator *) ('a, 'x) element -> ('a, 's) element (* Generic "gluifier". *) val glue : ('a, 't) element -> 't -> 'a glue (* Inverse -- useful for writing extensions *) val elem : ('t -> 'a glue) -> ('a, 't) element (* Other glue... *) val nothing : 'a glue (* null glue *) val text : string -> 'a glue (* constant text glue *) val sp : int -> 'a glue (* n spaces glue *) val nl : 'a glue (* newline glue *) val tab : 'a glue (* tabulator glue *) (* glue generator constructors *) val listg : ('t -> 'a glue) -> ('t list -> 'a glue) val optiong : ('t -> 'a glue) -> ('t option -> 'a glue) val seqg : (('x * 'a gg -> 'a gg) -> 'a gg -> 's -> 'a gg) -> (* foldr *) 'a glue -> (* separator *) ('x -> 'a glue) -> (* glue maker *) 's -> 'a glue (* glue maker for container *) (* "Places" say which side of a string to pad or trim... *) type place val left : place val center : place val right : place (* Pad, trim, or fit to size n the output corresponding to * a format fragment: *) val pad : place -> int -> ('a, 't) fragment -> ('a, 't) fragment val trim : place -> int -> ('a, 't) fragment -> ('a, 't) fragment val fit : place -> int -> ('a, 't) fragment -> ('a, 't) fragment (* specialized padding (left and right) *) val padl : int -> ('a, 't) fragment -> ('a, 't) fragment val padr : int -> ('a, 't) fragment -> ('a, 't) fragment end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/format-comb.sml000066400000000000000000000061551416264345000242210ustar00rootroot00000000000000(* format-comb.sml * * COPYRIGHT (c) 2002 Bell Labs, Lucent Technologies * * Well-typed "printf" for SML, aka "Unparsing Combinators". * This code was written by Matthias Blume (2002). Inspiration * obtained from Olivier Danvy's "Functional Unparsing" work. * * See format-comb-sig.sml for details. *) structure FormatComb :> FORMAT_COMB = struct type 'a format = string list -> 'a type ('a, 'b) fragment = 'a format -> 'b format type 'a glue = ('a, 'a) fragment type ('a, 't) element = ('a, 't -> 'a) fragment type 'a gg = 'a glue * 'a glue type place = int * int -> int fun left (a, i) = a - i fun center (a, i) = Int.quot (a - i, 2) fun right (a, i) = 0 local (* Generic padding, trimming, and fitting. Nestability * is achieved by remembering the current state s, passing * a new empty one to the fragment, adjusting the output * from that, and fitting the result back into the remembered * state. ("States" are string lists and correspond to * output coming from fragments to the left of the current point.) *) fun ptf adj pl n fr fm s = let fun work s' = let val x' = concat (rev s') val sz = size x' in adj (x', sz, n, pl (sz, n)) :: s end in (fr (fm o work)) [] end val padRight = StringCvt.padRight #" " val padLeft = StringCvt.padLeft #" " fun pad0 (s, sz, n, off) = padRight n (padLeft (sz - off) s) fun trim0 (s, _, n, off) = String.substring (s, off, n) fun pad1 (arg as (s, sz, n, _)) = if n < sz then s else pad0 arg fun trim1 (arg as (s, sz, n, _)) = if n > sz then s else trim0 arg fun fit1 (arg as (_, sz, n, _)) = (if n < sz then trim0 else pad0) arg in fun format' rcv fr = fr (rcv o rev) [] fun format fr = format' concat fr fun using cvt fm x a = fm (cvt a :: x) fun int fm = using Int.toString fm fun real fm = using Real.toString fm fun bool fm = using Bool.toString fm fun string fm = using (fn x => x) fm fun string' fm = using String.toString fm fun char fm = using String.str fm fun char' fm = using Char.toString fm fun int' rdx fm = using (Int.fmt rdx) fm fun real' rfmt fm = using (Real.fmt rfmt) fm fun pad place = ptf pad1 place fun trim place = ptf trim1 place fun fit place = ptf fit1 place end fun padl n = pad left n fun padr n = pad right n fun glue e a fm x = e fm x a fun elem gm fm x a = gm a fm x fun nothing fm = fm fun text s = glue string s fun sp n = pad left n nothing fun nl fm = text "\n" fm fun tab fm = text "\t" fm fun seqg (foldr : ('x * 'a gg -> 'a gg) -> 'a gg -> 'c -> 'a gg) sep g s = #2 (foldr (fn (x, (f, r)) => (sep, g x o f o r)) (nothing, nothing) s) fun listg g l = text "[" o seqg List.foldr (text ", ") g l o text "]" fun optiong g NONE = text "NONE" | optiong g (SOME a) = text "SOME(" o g a o text ")" fun seq foldr sep e = elem (seqg foldr sep (glue e)) fun list e = elem (listg (glue e)) fun option e = elem (optiong (glue e)) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/format-sig.sml000066400000000000000000000017751416264345000240660ustar00rootroot00000000000000(* format-sig.sml * * COPYRIGHT (c) 1992 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Formatted conversion to and from strings. * * AUTHOR: John Reppy * AT&T Bell Laboratories * Murray Hill, NJ 07974 * jhr@research.att.com *) signature FORMAT = sig datatype fmt_item = ATOM of Atom.atom | LINT of LargeInt.int | INT of Int.int | LWORD of LargeWord.word | WORD of Word.word | WORD8 of Word8.word | BOOL of bool | CHR of char | STR of string | REAL of Real.real | LREAL of LargeReal.real | LEFT of (int * fmt_item) (* left justify in field of given width *) | RIGHT of (int * fmt_item) (* right justify in field of given width *) exception BadFormat (* bad format string *) exception BadFmtList (* raised on specifier/item type mismatch *) val format : string -> fmt_item list -> string val formatf : string -> (string -> unit) -> fmt_item list -> unit end (* FORMAT *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/format.sml000066400000000000000000000227461416264345000233070ustar00rootroot00000000000000(* format.sml * * COPYRIGHT (c) 1992 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * AUTHOR: John Reppy * AT&T Bell Laboratories * Murray Hill, NJ 07974 * jhr@research.att.com * * TODO * - field widths in scan * - add PREC of (int * fmt_item) constructor to allow dynamic control of * precision. * - precision in %d, %s, ... * - * flag in scan (checks, but doesn't scan input) * - %n specifier in scan *) structure Format : FORMAT = struct structure SS = Substring structure SC = StringCvt open FmtFields exception BadFmtList fun padLeft (str, pad) = SC.padLeft #" " pad str fun padRight (str, pad) = SC.padRight #" " pad str fun zeroLPad (str, pad) = SC.padLeft #"0" pad str fun zeroRPad (str, pad) = SC.padRight #"0" pad str (* int to string conversions (for positive integers only) *) local val (maxInt8, maxInt10, maxInt16) = (case LargeInt.maxInt of (SOME n) => let val maxP1 = LargeWord.fromLargeInt n + 0w1 in ( LargeWord.fmt SC.OCT maxP1, LargeWord.fmt SC.DEC maxP1, LargeWord.fmt SC.HEX maxP1 ) end | NONE => ("", "", "") (* end case *)) in (* MaxInt is used to represent the absolute value of the largest negative * representable integer. *) datatype posint = PosInt of LargeInt.int | MaxInt fun intToOctal MaxInt = maxInt8 | intToOctal (PosInt i) = LargeInt.fmt SC.OCT i fun intToStr MaxInt = maxInt10 | intToStr (PosInt i) = LargeInt.toString i fun intToHex MaxInt = maxInt16 | intToHex (PosInt i) = LargeInt.fmt SC.HEX i fun intToHeX i = String.map Char.toUpper (intToHex i) end (* local *) (* word to string conversions *) val wordToOctal = LargeWord.fmt SC.OCT val wordToStr = LargeWord.fmt SC.DEC val wordToHex = LargeWord.fmt SC.HEX fun wordToHeX i = String.map Char.toUpper (wordToHex i) fun compileFormat str = let val split = SS.splitl (fn #"%" => false | _ => true) fun scan (ss, l) = if (SS.isEmpty ss) then rev l else let val (ss1, ss2) = split ss in case (SS.getc ss2) of (SOME(#"%", ss')) => let val (field, ss3) = scanField ss' in scan(ss3, field::(Raw ss1)::l) end | _ => rev((Raw ss1)::l) (* end case *) end in scan (SS.full str, []) end fun format s = let val fmts = compileFormat s fun doField (flags : field_flags, wid, ty, arg) = let fun padFn s = (case wid of NoPad => s | Wid i => padLeft(s, i) (* end case *)) fun zeroPadFn (sign, s) = (case wid of NoPad => raise BadFormat | (Wid i) => zeroLPad(s, i - (String.size sign)) (* end case *)) fun trimFn (NONE, s) = padFn s | trimFn (SOME maxWid, s) = let val s = if (size s > maxWid) then String.substring(s, 0, maxWid) else s in padFn s end fun negate i = ((PosInt(~i)) handle _ => MaxInt) fun doSign i = (case (i < 0, #sign flags, #neg_char flags) of (false, AlwaysSign, _) => ("+", PosInt i) | (false, BlankSign, _) => (" ", PosInt i) | (false, _, _) => ("", PosInt i) | (true, _, TildeSign) => ("~", negate i) | (true, _, _) => ("-", negate i) (* end case *)) fun doRealSign sign = (case (sign, #sign flags, #neg_char flags) of (false, AlwaysSign, _) => "+" | (false, BlankSign, _) => " " | (false, _, _) => "" | (true, _, TildeSign) => "~" | (true, _, _) => "-" (* end case *)) fun doExpSign (exp, isCap) = let val e = if isCap then "E" else "e" fun mkExp e = zeroLPad(Int.toString e, 2) in case (exp < 0, #neg_char flags) of (false, _) => [e, mkExp exp] | (true, TildeSign) => [e, "~", mkExp(~exp)] | (true, _) => [e, "-", mkExp(~exp)] (* end case *) end fun octal i = let val (sign, i) = doSign i val sign = if (#base flags) then sign^"0" else sign val s = intToOctal i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun decimal i = let val (sign, i) = doSign i val s = intToStr i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun hexidecimal i = let val (sign, i) = doSign i val sign = if (#base flags) then sign^"0x" else sign val s = intToHex i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun capHexidecimal i = let val (sign, i) = doSign i val sign = if (#base flags) then sign^"0X" else sign val s = intToHeX i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end (* word formatting *) fun doWordSign () = (case (#sign flags) of AlwaysSign => "+" | BlankSign => " " | _ => "" (* end case *)) fun octalW i = let val sign = doWordSign () val sign = if (#base flags) then sign^"0" else sign val s = wordToOctal i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun decimalW i = let val sign = doWordSign () val s = wordToStr i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun hexidecimalW i = let val sign = doWordSign () val sign = if (#base flags) then sign^"0x" else sign val s = wordToHex i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end fun capHexidecimalW i = let val sign = doWordSign () val sign = if (#base flags) then sign^"0X" else sign val s = wordToHeX i in if (#zero_pad flags) then sign ^ zeroPadFn(sign, s) else padFn (sign ^ s) end in case (ty, arg) of (OctalField, LINT i) => octal i | (OctalField, INT i) => octal(Int.toLarge i) | (OctalField, WORD w) => octalW (Word.toLargeWord w) | (OctalField, LWORD w) => octalW w | (OctalField, WORD8 w) => octalW (Word8.toLargeWord w) | (IntField, LINT i) => decimal i | (IntField, INT i) => decimal(Int.toLarge i) | (IntField, WORD w) => decimalW (Word.toLargeWord w) | (IntField, LWORD w) => decimalW w | (IntField, WORD8 w) => decimalW (Word8.toLargeWord w) | (HexField, LINT i) => hexidecimal i | (HexField, INT i) => hexidecimal(Int.toLarge i) | (HexField, WORD w) => hexidecimalW (Word.toLargeWord w) | (HexField, LWORD w) => hexidecimalW w | (HexField, WORD8 w) => hexidecimalW (Word8.toLargeWord w) | (CapHexField, LINT i) => capHexidecimal i | (CapHexField, INT i) => capHexidecimal(Int.toLarge i) | (CapHexField, WORD w) => capHexidecimalW (Word.toLargeWord w) | (CapHexField, LWORD w) => capHexidecimalW w | (CapHexField, WORD8 w) => capHexidecimalW (Word8.toLargeWord w) | (CharField, CHR c) => padFn(String.str c) | (BoolField, BOOL false) => padFn "false" | (BoolField, BOOL true) => padFn "true" | (StrField prec, ATOM s) => trimFn(prec, Atom.toString s) | (StrField prec, STR s) => trimFn(prec, s) | (RealField{prec, format}, REAL r) => if (Real.isFinite r) then (case format of F_Format => let val {sign, mantissa} = RealFormat.realFFormat(r, prec) val sign = doRealSign sign in if ((prec = 0) andalso (#base flags)) then padFn(concat[sign, mantissa, "."]) else padFn(sign ^ mantissa) end | E_Format isCap => let val {sign, mantissa, exp} = RealFormat.realEFormat(r, prec) val sign = doRealSign sign val expStr = doExpSign(exp, isCap) in if ((prec = 0) andalso (#base flags)) then padFn(concat(sign :: mantissa :: "." :: expStr)) else padFn(concat(sign :: mantissa :: expStr)) end | G_Format isCap => let val prec = if (prec = 0) then 1 else prec val {sign, whole, frac, exp} = RealFormat.realGFormat(r, prec) val sign = doRealSign sign val expStr = (case exp of SOME e => doExpSign(e, isCap) | NONE => [] (* end csae *)) val num = if (#base flags) then let val diff = prec - ((size whole) + (size frac)) in if (diff > 0) then zeroRPad(frac, (size frac)+diff) else frac end else if (frac = "") then "" else ("." ^ frac) in padFn(concat(sign::whole::num::expStr)) end (* end case *)) else if Real.==(Real.negInf, r) then doRealSign true ^ "inf" else if Real.==(Real.posInf, r) then doRealSign false ^ "inf" else "nan" | (_, LEFT(w, arg)) => StringCvt.padLeft #" " w (doField (flags, wid, ty, arg)) | (_, RIGHT(w, arg)) => StringCvt.padRight #" " w (doField (flags, Wid w, ty, arg)) | _ => raise BadFmtList (* end case *) end fun doArgs ([], [], l) = SS.concat(rev l) | doArgs ((Raw s)::rf, args, l) = doArgs(rf, args, s::l) | doArgs (Field(flags, wid, ty)::rf, arg::ra, l) = doArgs (rf, ra, SS.full (doField (flags, wid, ty, arg)) :: l) | doArgs _ = raise BadFmtList in fn args => doArgs (fmts, args, []) end (* format *) fun formatf fmt = let val f = format fmt in fn consumer => fn args => consumer(f args) end end (* Format *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/getopt-sig.sml000066400000000000000000000056211416264345000240720ustar00rootroot00000000000000(* getopt-sig.sml * * COPYRIGHT (c) 2016 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A SML port of GNU's getopt library. * * This port is derived from Sven Panne's * * implementation of the getopt library in Haskell * * The following comments are lifted from Sven's code: * * Two rather obscure features are missing: The Bash 2.0 non-option hack (if * you don't already know it, you probably don't want to hear about it...) * and the recognition of long options with a single dash (e.g. '-help' is * recognised as '--help', as long as there is no short option 'h'). * * Other differences between GNU's getopt and this implementation: * * To enforce a coherent description of options and arguments, there are * explanation fields in the option/argument descriptor. * * Error messages are now more informative, but no longer POSIX * compliant... :-( * * A difference with Sven's port: errors now invoke an error callback, rather * than returning error strings while continuing processing options. * The full generality of the latter does not seem justified. *) signature GET_OPT = sig datatype 'a arg_order = RequireOrder | Permute | ReturnInOrder of string -> 'a (* What to do with options following non-options: * RequireOrder: no option processing after first non-option * Permute: freely intersperse options and non-options * ReturnInOrder: wrap non-options into options *) datatype 'a arg_descr = NoArg of unit -> 'a | ReqArg of (string -> 'a) * string | OptArg of (string option -> 'a) * string (* Description of an argument option: * NoArg: no argument required * ReqArg: option requires an argument; the string is the argument name * OptArg: optional argument; the string is the argument name *) type 'a opt_descr = { short : string, long : string list, desc : 'a arg_descr, help : string } (* Description of a single option *) val usageInfo : { header : string, options : 'a opt_descr list } -> string (* takes a header string and a list of option descriptions and * returns a string explaining the usage information. A newline will * be added following the header, so it should not be newline terminated. *) val getOpt : { argOrder : 'a arg_order, options : 'a opt_descr list, errFn : string -> unit } -> string list -> ('a list * string list) (* takes as argument an arg_order to specify the non-options * handling, a list of option descriptions, an error callback, * and a command line containing the options and arguments, * and returns a list of (options, non-options) *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/getopt.sml000066400000000000000000000171761416264345000233220ustar00rootroot00000000000000(* getopt.sml * * COPYRIGHT (c) 2016 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure GetOpt :> GET_OPT = struct datatype 'a arg_order = RequireOrder | Permute | ReturnInOrder of string -> 'a datatype 'a arg_descr = NoArg of unit -> 'a | ReqArg of (string -> 'a) * string | OptArg of (string option -> 'a) * string type 'a opt_descr = { short : string, long : string list, desc : 'a arg_descr, help : string } datatype 'a opt_kind = Opt of 'a | NonOpt structure SS = Substring structure S = String (* helper functions *) fun sepBy (sep, []) = "" | sepBy (sep, x::xs) = concat (x::foldr (fn (elem,l) => sep::elem::l) [] xs) val breakAtEq = SS.splitl (fn #"=" => false | _ => true) (* formatting of options *) fun fmtShort (NoArg _) so = concat ["-", str so] | fmtShort (ReqArg (_,ad)) so = concat ["-", str so," ",ad] | fmtShort (OptArg (_,ad)) so = concat ["-", str so,"[",ad,"]"] fun fmtLong (NoArg _) lo = concat ["--",lo] | fmtLong (ReqArg (_,ad)) lo = concat ["--",lo,"=",ad] | fmtLong (OptArg (_,ad)) lo = concat ["--",lo,"[=",ad,"]"] fun fmtOpt {short=sos, long=los, desc=ad, help=descr} = ( String.concatWith ", " (map (fmtShort ad) (S.explode sos)), String.concatWith ", " (map (fmtLong ad) los), descr) (* Usage information *) fun usageInfo {header, options} = let fun unlines l = sepBy ("\n", l) val fmtOptions = List.map fmtOpt options val (ms1, ms2) = foldl (fn ((e1,e2,_), (m1,m2)) => ( Int.max (size e1, m1), Int.max (size e2, m2) )) (0,0) fmtOptions val indent = StringCvt.padLeft #" " (ms1 + ms2 + 6) val pad = StringCvt.padRight #" " fun doEntry ((e1, e2, e3), l) = ( case String.fields (fn #"\n" => true | _ => false) e3 of [] => concat[" ", pad ms1 e1, " ", pad ms2 e2] :: l | [e3] => concat[" ", pad ms1 e1, " ", pad ms2 e2, " ", e3] :: l | fst::rest => concat[" ", pad ms1 e1, " ", pad ms2 e2, " ", fst] :: List.foldr (fn (s, l) => (indent "" ^ s) :: l) l rest (* end case *)) val table = List.foldr doEntry [""] fmtOptions in String.concatWith "\n" (header::table) end (* entry point of the library *) fun getOpt {argOrder, options : 'a opt_descr list, errFn} = let (* Some error handling functions *) fun errAmbig optStr = errFn(usageInfo{ header = concat[ "option `", optStr, "' is ambiguous; could be one of:" ], options = options }) fun errReq (d, optStr) = errFn(concat[ "option `", optStr, "' requires an argument ", d ]) fun errUnrec optStr = errFn(concat[ "unrecognized option `", optStr, "'" ]) fun errNoArg optStr = errFn(concat[ "option `", optStr, "' does not allow an argument" ]) (* handle long option; `subs` is the command-line flag (minus the "--" prefix) * and `rest` are the rest of the command-line arguments. *) fun longOpt (subs, rest) = let val (opt, arg) = breakAtEq subs val opt' = SS.string opt val optStr = "--"^opt' (* handle the selected options *) fun handleLong argDesc = (case (argDesc, rest) of (NoArg act, _) => if (SS.isEmpty arg) then (Opt(act()), rest) else if (SS.isPrefix "=" arg) then (errNoArg optStr; (NonOpt, rest)) else raise Fail "longOpt: impossible" | (ReqArg(act, argName), []) => if (SS.isEmpty arg) then (errReq(argName, optStr); (NonOpt, [])) else if (SS.isPrefix "=" arg) then (Opt(act (SS.string (SS.triml 1 arg))), []) else raise Fail "longOpt: impossible" | (ReqArg(act, _), r::rs) => if (SS.isEmpty arg) then (Opt(act r), rs) else if (SS.isPrefix "=" arg) then (Opt(act (SS.string (SS.triml 1 arg))), rest) else raise Fail "longOpt: impossible" | (OptArg(act, _), _) => if (SS.isEmpty arg) then (Opt(act NONE), rest) else if (SS.isPrefix "=" arg) then (Opt(act (SOME (SS.string (SS.triml 1 arg)))), rest) else raise Fail "longOpt: impossible" (* end case *)) (* search the long options for a match; we allow a unique prefix of an * option, but an exact match will take precedence. E.g., if the long options * are "--foo", "--foobar", and "--foobaz", then "--foo" will match the first, * but "--foob" will be flagged as ambiguous. *) fun findOption ([], [], NONE) = (errUnrec optStr; (NonOpt, rest)) | findOption ([], _, SOME argDesc) = handleLong argDesc | findOption ([], [argDesc], NONE) = handleLong argDesc | findOption ([], _::_::_, NONE) = (errAmbig optStr; (NonOpt, rest)) | findOption ((descr : 'a opt_descr)::descrs, prefixMatches, exactMatch) = ( case List.filter (S.isPrefix opt') (#long descr) of [] => findOption (descrs, prefixMatches, exactMatch) | flgs => if List.exists (fn flg => (flg = opt')) flgs then if Option.isSome exactMatch then (errAmbig optStr; (NonOpt, rest)) else findOption (descrs, prefixMatches, SOME(#desc descr)) else findOption (descrs, #desc descr :: prefixMatches, exactMatch) (* end case *)) in findOption (options, [], NONE) end (* handle short option. x is the option character, subs is the * rest of the option string, rest is the rest of the command-line * options. *) fun shortOpt (x, subs, rest) = let val options = List.filter (fn {short,...} => Char.contains short x) options val ads = map #desc options val optStr = "-"^(str x) in case (ads, rest) of (_::_::_, rest1) => (errAmbig optStr; (NonOpt, rest1)) | ((NoArg a)::_, rest') => if (SS.isEmpty subs) then (Opt(a()), rest') else (Opt(a()), ("-"^(SS.string subs))::rest') | ((ReqArg(f,d))::_, []) => if (SS.isEmpty subs) then (errReq(d, optStr); (NonOpt, [])) else (Opt(f (SS.string subs)), []) | ((ReqArg(f,_))::_, rest' as (r::rs)) => if (SS.isEmpty subs) then (Opt(f r), rs) else (Opt(f (SS.string subs)), rest') | ((OptArg(f,_))::_, rest') => if (SS.isEmpty subs) then (Opt(f NONE), rest') else (Opt(f (SOME(SS.string subs))), rest') | ([], rest') => (errUnrec optStr; (NonOpt, rest')) (* end case *) end fun get ([], opts, nonOpts) = (List.rev opts, List.rev nonOpts) | get ("--"::rest, opts, nonOpts) = let val nonOpts = List.revAppend(nonOpts, "--" :: rest) in case argOrder of ReturnInOrder f => (List.revAppend(opts, List.map f nonOpts), []) | _ => (List.rev opts, nonOpts) (* end case *) end | get (arg::rest, opts, nonOpts) = let val arg' = SS.full arg fun addOpt (Opt opt, rest) = get(rest, opt::opts, nonOpts) | addOpt (NonOpt, rest) = get(rest, opts, arg::nonOpts) in if (SS.isPrefix "--" arg') then addOpt(longOpt (SS.triml 2 arg', rest)) else if (SS.isPrefix "-" arg') then addOpt(shortOpt (SS.sub(arg', 1), SS.triml 2 arg', rest)) else (case argOrder of RequireOrder => (List.rev opts, List.revAppend(nonOpts, arg::rest)) | Permute => get(rest, opts, arg::nonOpts) | ReturnInOrder f => get(rest, f arg :: opts, nonOpts) (* end case *)) end in fn args => get(args, [], []) end (* getOpt *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/graph-scc-fn.sml000066400000000000000000000077711416264345000242700ustar00rootroot00000000000000(* graph-scc-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Calculate strongly-connected components of directed graph. * The graph can have nodes with self-loops. * * author: Matthias Blume *) functor GraphSCCFn (Nd: ORD_KEY) :> GRAPH_SCC where type Nd.ord_key = Nd.ord_key = struct structure Nd = Nd type node = Nd.ord_key structure Map = RedBlackMapFn (Nd) datatype component = SIMPLE of node | RECURSIVE of node list fun eq x y = (Nd.compare(x, y) = EQUAL) fun topOrder' { roots, follow } = let fun getNode (n, nm as (npre, m)) = ( case Map.find (m, n) of NONE => let val r = { pre = npre, low = ref npre } val m' = Map.insert (m, n, r) in ((npre + 1, m'), r) end | SOME r => (nm, r) (* end case *)) fun component (x, []) = if List.exists (eq x) (follow x) then RECURSIVE [x] else SIMPLE x | component (x, xl) = RECURSIVE (x :: xl) (* depth-first search in continuation-passing, state-passing style *) fun dfs args = let (* the nodemap represents the mapping from nodes to * pre-order numbers and low-numbers. The latter are ref-cells. * nodemap also remembers the next available pre-order number. * The current node itself is not given as an argument. * Instead, it is represented by grab_cont -- a function * that "grabs" a component from the current stack and then * continues with the regular continuation. We do it this * way to be able to handle the topmost virtual component -- * the one whose sole element is the virtual root node. *) val { follow_nodes, grab_cont, node_pre, node_low, parent_low, nodemap, stack, sccl, nograb_cont } = args (* loop over the follow-set of a node *) fun loop (tn :: tnl) (nodemap as (npre, theMap), stack, sccl) = let val is_tn = eq tn in case Map.find (theMap, tn) of SOME{ pre = tn_pre, low = tn_low } => let val tl = !tn_low in if tl < (!node_low) andalso List.exists is_tn stack then node_low := tl else (); loop tnl (nodemap, stack, sccl) end | NONE =>let (* lookup failed -> tn is a new node *) val tn_pre = npre val tn_low = ref npre val npre = npre + 1 val theMap = Map.insert (theMap, tn, { pre = tn_pre, low = tn_low }) val nodemap = (npre, theMap) val tn_nograb_cont = loop tnl fun tn_grab_cont (nodemap, sccl) = let fun grab (top :: stack, scc) = if eq tn top then tn_nograb_cont (nodemap, stack, component (top, scc) :: sccl) else grab (stack, top :: scc) | grab _ = raise Fail "scc:grab: empty stack" in grab end in dfs { follow_nodes = follow tn, grab_cont = tn_grab_cont, node_pre = tn_pre, node_low = tn_low, parent_low = node_low, nodemap = nodemap, stack = tn :: stack, sccl = sccl, nograb_cont = tn_nograb_cont } end end | loop [] (nodemap, stack, sccl) = let val nl = !node_low in if nl = node_pre then grab_cont (nodemap, sccl) (stack, []) else ((* propagate node_low up *) if nl < (!parent_low) then parent_low := nl else (); (* `return' *) nograb_cont (nodemap, stack, sccl)) end in loop (rev follow_nodes) (nodemap, stack, sccl) end fun top_grab_cont (nodemap, sccl) ([], []) = sccl | top_grab_cont _ _ = raise Fail "scc:top_grab: stack not empty" in dfs { follow_nodes = roots, grab_cont = top_grab_cont, node_pre = 0, node_low = ref 0, (* low of virtual root *) parent_low = ref 0, (* low of virtual parent of virtual root *) nodemap = (1, Map.empty), stack = [], sccl = [], nograb_cont = fn (_, _, _) => raise Fail "scc:top_nograb_cont" } end fun topOrder { root, follow } = topOrder' { roots = [root], follow = follow } end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/graph-scc-sig.sml000066400000000000000000000016771416264345000244460ustar00rootroot00000000000000(* graph-scc-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Calculate strongly-connected components of directed graph. * The graph can have nodes with self-loops. * * author: Matthias Blume *) signature GRAPH_SCC = sig structure Nd : ORD_KEY type node = Nd.ord_key datatype component = SIMPLE of node (* singleton, no self-loop *) | RECURSIVE of node list val topOrder': { roots: node list, follow: node -> node list } -> component list (* take root node(s) and follow function and return * list of topologically sorted strongly-connected components; * the component that contains the first of the given "roots" * goes first *) val topOrder : { root: node, follow: node -> node list } -> component list (* for backward compatibility; * AXIOM: topOrder{root,follow}==topOrder'{roots=[root],follow=follow} *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-key-sig.sml000066400000000000000000000012721416264345000242770ustar00rootroot00000000000000(* hash-key-sig.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Abstract hash table keys. This is the argument signature for the hash table * functor (see hash-table-sig.sml and hash-table.sml). * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) signature HASH_KEY = sig type hash_key val hashVal : hash_key -> word (* Compute an unsigned integer key from a hash key. *) val sameKey : (hash_key * hash_key) -> bool (* Return true if two keys are the same. * NOTE: if sameKey(h1, h2), then it must be the * case that (hashVal h1 = hashVal h2). *) end (* HASH_KEY *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-set-fn.sml000066400000000000000000000222161416264345000241240ustar00rootroot00000000000000(* hash-set-fn.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) functor HashSetFn (Key : HASH_KEY) : MONO_HASH_SET = struct structure Key = Key (* NOTE: someday we will change the HASH_KEY signature to follow the naming conventions of * the SML basis, so we use those names internally to ease future porting. *) type item = Key.hash_key val hash = Key.hashVal val same = Key.sameKey datatype bucket = NIL | B of (word * item * bucket) datatype set = SET of { table : bucket array ref, nItems : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* minimum and maximum hash table sizes. We use powers of two for hash table * sizes, since that give efficient indexing, and assume a minimum size of 32. *) val minSize = 32 val maxSize = let fun f i = let val i' = i+i in if i' < Array.maxLen then f i' else i end in f 0x10000 end (* round up `n` to the next hash-table size *) fun roundUp n = if (n >= maxSize) then maxSize else let fun f i = if (i >= n) then i else f(i + i) in f minSize end (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun alloc sizeHint = Array.array(roundUp sizeHint, NIL) (* grow a table to the specified size *) fun growTable (table, newSz) = let val newArr = Array.array (newSz, NIL) fun copy NIL = () | copy (B(h, key, rest)) = let val indx = index (h, newSz) in Array.update (newArr, indx, B(h, key, Array.sub(newArr, indx))); copy rest end in Array.app copy table; newArr end (* conditionally grow a table; return true if it grew. *) fun growTableIfNeeded (table, nItems) = let val arr = !table val sz = Array.length arr in if (nItems >= sz) then (table := growTable (arr, sz+sz); true) else false end (* reverse-append for buckets *) fun revAppend (NIL, b) = b | revAppend (B(h, x, r), b) = revAppend(r, B(h, x, b)) fun addWithHash (tbl as SET{table, nItems}, h, item) = let val arr = !table val sz = Array.length arr val indx = index (h, sz) fun look NIL = ( Array.update(arr, indx, B(h, item, Array.sub(arr, indx))); nItems := !nItems + 1; growTableIfNeeded (table, !nItems); NIL) | look (B(h', item', r)) = if ((h = h') andalso same(item, item')) then NIL (* item already present *) else (case (look r) of NIL => NIL | rest => B(h', item', rest) (* end case *)) in case (look (Array.sub (arr, indx))) of NIL => () | b => Array.update(arr, indx, b) (* end case *) end (* Add an item to a set *) fun add (tbl, item) = addWithHash(tbl, hash item, item) fun addc set item = add(set, item) (* The empty set *) fun mkEmpty sizeHint = SET{ table = ref (alloc sizeHint), nItems = ref 0 } (* Create a singleton set *) fun mkSingleton item = let val set = mkEmpty minSize in add (set, item); set end (* create a set from a list of items *) fun mkFromList items = let val set = mkEmpty(List.length items) in List.app (addc set) items; set end fun copy (SET{table=ref tbl, nItems}) = SET{ table = ref(Array.tabulate(Array.length tbl, fn i => Array.sub(tbl, i))), nItems = ref(!nItems) } (* Return a list of the items in the set *) fun toList (SET{table, nItems}) = if (!nItems = 0) then [] else let fun f (NIL, l) = l | f (B(_, x, r), l) = f(r, x::l) in Array.foldl f [] (!table) end (* Insert items from list. *) fun addList (set, items) = List.app (addc set) items (* Remove an item. Raise NotFound if not found. *) fun delete (SET{table, nItems}, item) = let val arr = !table val sz = Array.length arr val h = hash item val indx = index (h, sz) fun look (_, NIL) = false | look (prefix, B(h', item', r)) = if ((h = h') andalso same(item, item')) then ( Array.update(arr, indx, revAppend(prefix, r)); nItems := !nItems - 1; true) else look (B(h', item', prefix), r) in look (NIL, Array.sub(arr, indx)) end (* Remove the item, if it is in the set. Otherwise the set is unchanged. *) fun subtract (set, item) = ignore(delete (set, item)) fun subtractc set item = subtract(set, item) fun subtractList (set, items) = List.app (subtractc set) items (* Return true if and only if item is an element in the set *) fun member (SET{table, ...}, item) = let val arr = !table val sz = Array.length arr val h = hash item val indx = index (h, sz) fun look NIL = false | look (B(h', item', r)) = ((h = h') andalso same(item, item')) orelse look r in look (Array.sub(arr, indx)) end (* Return true if and only if the set is empty *) fun isEmpty (SET{nItems, ...}) = (!nItems = 0) (* Return true if and only if the first set is a subset of the second *) fun isSubset (SET{table=tbl1, nItems=n1}, s2 as SET{table=tbl2, nItems=n2}) = if (!n1 <= !n2) then let val arr1 = !tbl1 and arr2 = !tbl2 val sz1 = Array.length arr1 and sz2 = Array.length arr2 fun lp i = if (i <= sz1) then let (* iterate over the items in bucket i *) fun look1 NIL = lp(i+1) | look1 (B(h, item, r)) = let (* search s2 for the item *) fun look2 NIL = false | look2 (B(h', item', r')) = if ((h = h') andalso same(item, item')) then look1 r else look2 r' in look2 (Array.sub(arr2, index (h, sz2))) end in look1 (Array.sub(arr1, i)) end else true in lp 0 end else false (* Return the number of items in the table *) fun numItems (SET{nItems, ...}) = !nItems (* Create a new set by applying a map function to the elements * of the set. *) fun map f (SET{nItems, table}) = let val s = mkEmpty (!nItems) fun mapf NIL = () | mapf (B(_, x, r)) = (add(s, f x); mapf r) in Array.app mapf (!table); s end fun mapPartial f (SET{nItems, table}) = let val s = mkEmpty (!nItems) fun mapf NIL = () | mapf (B(_, x, r)) = (case f x of SOME x' => (add(s, x'); mapf r) | NONE => mapf r (* end case *)) in Array.app mapf (!table); s end (* Apply a function to the entries of the set. *) fun app f (SET{nItems, table}) = let fun appf NIL = () | appf (B(_, x, r)) = (f x; appf r) in Array.app appf (!table) end (* Apply a folding function to the entries of the set. *) fun fold f init (SET{nItems, table}) = let fun foldf (NIL, acc) = acc | foldf (B(_, x, r), acc) = foldf (r, f(x, acc)) in Array.foldl foldf init (!table) end fun partition pred (SET{table, nItems}) = let val n = (!nItems div 2) + 1 val ts = mkEmpty n val fs = mkEmpty n fun part NIL = () | part (B(h, x, r)) = if pred x then (addWithHash(ts, h, x); part r) else (addWithHash(fs, h, x); part r) in Array.app part (!table); (ts, fs) end fun filter pred (SET{table=ref tbl, nItems}) = let val len = Array.length tbl fun remove (_, 0) = () | remove (i, n) = if (i < len) then (case Array.sub(tbl, i) of NIL => remove(i+1, n) | bucket => let fun rmv (NIL, items, n) = ( Array.update(tbl, i, items); remove (i+1, n)) | rmv (B(h, x, r), items, n) = if pred x then rmv(r, B(h, x, items), n) else rmv(r, items, n-1) in rmv (bucket, NIL, n) end (* end case *)) else nItems := n in remove (0, !nItems) end fun exists pred (SET{table, ...}) = let fun chk NIL = false | chk (B(_, x, r)) = pred x orelse chk r in Array.exists chk (!table) end fun all pred (SET{table, ...}) = let fun chk NIL = true | chk (B(_, x, r)) = pred x andalso chk r in Array.all chk (!table) end fun find pred (SET{table=ref tbl, ...}) = let val len = Array.length tbl fun find' i = if (i < len) then let fun chk NIL = find' (i+1) | chk (B(_, x, r)) = if pred x then SOME x else chk r in chk (Array.sub(tbl, i)) end else NONE in find' 0 end (* DEPRECATED FUNCTIONS *) val listItems = toList val without = subtract end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-string.sml000066400000000000000000000003071416264345000242330ustar00rootroot00000000000000(* hash-string.sml * * COPYRIGHT (c) 2020 * All rights reserved. *) structure HashString : sig val hashString : string -> word val hashSubstring : substring -> word end = FNVHash mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-table-fn.sml000066400000000000000000000127271416264345000244260ustar00rootroot00000000000000(* hash-table-fn.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A hash table functor. It takes a key type with two operations: sameKey and * hashVal as arguments (see hash-key-sig.sml). * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) functor HashTableFn (Key : HASH_KEY) : MONO_HASH_TABLE = struct structure Key = Key open Key structure HTRep = HashTableRep datatype 'a hash_table = HT of { not_found : exn, table : (hash_key, 'a) HTRep.table ref, n_items : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun mkTable (sizeHint, notFound) = HT{ not_found = notFound, table = ref (HTRep.alloc sizeHint), n_items = ref 0 } (* remove all elements from the table *) fun clear (HT{table, n_items, ...}) = (HTRep.clear(!table); n_items := 0) (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) fun insert (tbl as HT{table, n_items, ...}) (key, item) = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = ( Array.update(arr, indx, HTRep.B(hash, key, item, Array.sub(arr, indx))); n_items := !n_items + 1; HTRep.growTableIfNeeded (table, !n_items); HTRep.NIL) | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then HTRep.B(hash, key, item, r) else (case (look r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h, k, v, rest) (* end case *)) in case (look (Array.sub (arr, indx))) of HTRep.NIL => () | b => Array.update(arr, indx, b) (* end case *) end (* return true, if the key is in the domain of the table *) fun inDomain (HT{table, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = false | look (HTRep.B(h, k, v, r)) = ((hash = h) andalso sameKey(key, k)) orelse look r in look (Array.sub (arr, indx)) end (* find an item, the table's exception is raised if the item doesn't exist *) fun lookup (HT{table, not_found, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then v else look r in look (Array.sub (arr, indx)) end (* look for an item, return NONE if the item doesn't exist *) fun find (HT{table, ...}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = NONE | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then SOME v else look r in look (Array.sub (arr, indx)) end (* Remove an item. The table's exception is raised if * the item doesn't exist. *) fun remove (HT{not_found, table, n_items}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then (v, r) else let val (item, r') = look r in (item, HTRep.B(h, k, v, r')) end val (item, bucket) = look (Array.sub (arr, indx)) in Array.update (arr, indx, bucket); n_items := !n_items - 1; item end (* remove *) (* Return the number of items in the table *) fun numItems (HT{n_items, ...}) = !n_items (* return a list of the items in the table *) fun listItems (HT{table = ref arr, n_items, ...}) = HTRep.listItems (arr, n_items) fun listItemsi (HT{table = ref arr, n_items, ...}) = HTRep.listItemsi (arr, n_items) (* Apply a function to the entries of the table *) fun appi f (HT{table, ...}) = HTRep.appi f (! table) fun app f (HT{table, ...}) = HTRep.app f (! table) (* Map a table to a new table that has the same keys and exception *) fun mapi f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.mapi f (! table)), n_items = ref(!n_items), not_found = not_found } fun map f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.map f (! table)), n_items = ref(!n_items), not_found = not_found } (* Fold a function over the entries of the table *) fun foldi f init (HT{table, ...}) = HTRep.foldi f init (! table) fun fold f init (HT{table, ...}) = HTRep.fold f init (! table) (* modify the hash-table items in place *) fun modifyi f (HT{table, ...}) = HTRep.modifyi f (!table) fun modify f (HT{table, ...}) = HTRep.modify f (!table) (* remove any hash table items that do not satisfy the given * predicate. *) fun filteri pred (HT{table, n_items, ...}) = n_items := HTRep.filteri pred (! table) fun filter pred (HT{table, n_items, ...}) = n_items := HTRep.filter pred (! table) (* Create a copy of a hash table *) fun copy (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.copy(! table)), n_items = ref(!n_items), not_found = not_found } (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes (HT{table, ...}) = HTRep.bucketSizes (! table) end (* HashTableFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-table-rep.sml000066400000000000000000000160071416264345000246040ustar00rootroot00000000000000(* hash-table-rep.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This is the internal representation of hash tables, along with some * utility functions. It is used in both the polymorphic and functor * hash table implementations. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) structure HashTableRep : sig datatype ('a, 'b) bucket = NIL | B of (word * 'a * 'b * ('a, 'b) bucket) type ('a, 'b) table = ('a, 'b) bucket array val alloc : int -> ('a, 'b) table (* allocate a table of at least the given size *) val growTable : (('a, 'b) table * int) -> ('a, 'b) table (* grow a table to the specified size *) val growTableIfNeeded : (('a, 'b) table ref * int) -> bool (* conditionally grow a table; the second argument is the number * of items currently in the table. *) val clear : ('a, 'b) table -> unit (* remove all items *) val listItems : (('a, 'b) table * int ref) -> 'b list val listItemsi : (('a, 'b) table * int ref) -> ('a * 'b) list val appi : ('a * 'b -> 'c) -> ('a, 'b) table -> unit val app : ('a -> 'b) -> ('c, 'a) table -> unit val mapi : ('a * 'b -> 'c) -> ('a, 'b) table -> ('a, 'c) table val map : ('a -> 'b) -> ('c, 'a) table -> ('c, 'b) table val foldi : ('a * 'b * 'c -> 'c) -> 'c -> ('a, 'b) table -> 'c val fold : ('a * 'b -> 'b) -> 'b -> ('c, 'a) table -> 'b val modify : ('b -> 'b) -> ('a, 'b) table -> unit val modifyi : (('a * 'b) -> 'b) -> ('a, 'b) table -> unit val filteri : ('a * 'b -> bool) -> ('a, 'b) table -> int val filter : ('a -> bool) -> ('b,'a) table -> int val copy : ('a, 'b) table -> ('a, 'b) table val bucketSizes : ('a, 'b) table -> int list end = struct datatype ('a, 'b) bucket = NIL | B of (word * 'a * 'b * ('a, 'b) bucket) type ('a, 'b) table = ('a, 'b) bucket array fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* minimum and maximum hash table sizes. We use powers of two for hash table * sizes, since that give efficient indexing, and assume a minimum size of 32. *) val minSize = 32 val maxSize = let fun f i = let val i' = i+i in if i' < Array.maxLen then f i' else i end handle Overflow => i in f 0x10000 end (* round up `n` to the next hash-table size *) fun roundUp n = if (n >= maxSize) then maxSize else let fun f i = if (i >= n) then i else f(i + i) in f minSize end (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun alloc sizeHint = Array.array(roundUp sizeHint, NIL) (* grow a table to the specified size *) fun growTable (table, newSz) = let val newArr = Array.array (newSz, NIL) fun copy NIL = () | copy (B(h, key, v, rest)) = let val indx = index (h, newSz) in Array.update (newArr, indx, B(h, key, v, Array.sub(newArr, indx))); copy rest end in Array.app copy table; newArr end (* conditionally grow a table; return true if it grew. *) fun growTableIfNeeded (table, nItems) = let val arr = !table val sz = Array.length arr in if (nItems >= sz) then (table := growTable (arr, sz+sz); true) else false end (* remove all items *) fun clear table = Array.modify (fn _ => NIL) table (* return a list of the items in the table *) fun listItems (table, nItems) = let fun f (_, l, 0) = l | f (~1, l, _) = l | f (i, l, n) = let fun g (NIL, l, n) = f (i-1, l, n) | g (B(_, k, v, r), l, n) = g(r, v::l, n-1) in g (Array.sub(table, i), l, n) end in f ((Array.length table) - 1, [], !nItems) end (* listItems *) fun listItemsi (table, nItems) = let fun f (_, l, 0) = l | f (~1, l, _) = l | f (i, l, n) = let fun g (NIL, l, n) = f (i-1, l, n) | g (B(_, k, v, r), l, n) = g(r, (k, v)::l, n-1) in g (Array.sub(table, i), l, n) end in f ((Array.length table) - 1, [], !nItems) end (* listItems *) (* Apply a function to the entries of the table *) fun appi f table = let fun appF NIL = () | appF (B(_, key, item, rest)) = (f (key, item); appF rest) in Array.app appF table end (* appi *) fun app f table = let fun appF NIL = () | appF (B(_, key, item, rest)) = (f item; appF rest) in Array.app appF table end (* app *) (* Map a table to a new table that has the same keys *) fun mapi f table = let fun mapF NIL = NIL | mapF (B(hash, key, item, rest)) = B(hash, key, f (key, item), mapF rest) val newTbl = Array.tabulate ( Array.length table, fn i => mapF (Array.sub(table, i))) in newTbl end (* transform *) (* Map a table to a new table that has the same keys *) fun map f table = let fun mapF NIL = NIL | mapF (B(hash, key, item, rest)) = B(hash, key, f item, mapF rest) val newTbl = Array.tabulate ( Array.length table, fn i => mapF (Array.sub(table, i))) in newTbl end (* map *) fun foldi f init table = let fun foldF (NIL, accum) = accum | foldF (B(hash, key, item, rest), accum) = foldF(rest, f(key, item, accum)) in Array.foldl foldF init table end fun fold f init table = let fun foldF (NIL, accum) = accum | foldF (B(hash, key, item, rest), accum) = foldF(rest, f(item, accum)) in Array.foldl foldF init table end (* modify the hash-table items in place *) fun modify f table = let fun modifyF NIL = NIL | modifyF (B(hash, key, item, rest)) = B(hash, key, f item, modifyF rest) in Array.modify modifyF table end fun modifyi f table = let fun modifyF NIL = NIL | modifyF (B(hash, key, item, rest)) = B(hash, key, f(key, item), modifyF rest) in Array.modify modifyF table end (* remove any hash table items that do not satisfy the given * predicate. Return the number of items left in the table. *) fun filteri pred table = let val nItems = ref 0 fun filterP NIL = NIL | filterP (B(hash, key, item, rest)) = if (pred(key, item)) then ( nItems := !nItems+1; B(hash, key, item, filterP rest)) else filterP rest in Array.modify filterP table; !nItems end (* filteri *) fun filter pred table = let val nItems = ref 0 fun filterP NIL = NIL | filterP (B(hash, key, item, rest)) = if (pred item) then ( nItems := !nItems+1; B(hash, key, item, filterP rest)) else filterP rest in Array.modify filterP table; !nItems end (* filter *) (* Create a copy of a hash table *) fun copy table = Array.tabulate (Array.length table, fn i => Array.sub(table, i)); (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes table = let fun len (NIL, n) = n | len (B(_, _, _, r), n) = len(r, n+1) in Array.foldr (fn (b, l) => len(b, 0) :: l) [] table end end (* HashTableRep *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-table-sig.sml000066400000000000000000000056141416264345000246020ustar00rootroot00000000000000(* hash-table-sig.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The signature of the polymorphic hash table structure. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) signature HASH_TABLE = sig type ('a, 'b) hash_table (* type of hash table mapping 'a to 'b *) val mkTable : (('a -> word) * (('a * 'a) -> bool)) -> (int * exn) -> ('a,'b) hash_table (* Given a hashing function and an equality predicate, create a new table; * the int is a size hint and the exception is to be raised by find. *) val clear : ('a, 'b) hash_table -> unit (* remove all elements from the table *) val insert : ('a, 'b) hash_table -> ('a * 'b) -> unit (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) val inDomain : ('a, 'b) hash_table -> 'a -> bool (* return true, if the key is in the domain of the table *) val lookup : ('a, 'b) hash_table -> 'a -> 'b (* Find an item, the table's exception is raised if the item doesn't exist *) val find : ('a, 'b) hash_table -> 'a -> 'b option (* Look for an item, return NONE if the item doesn't exist *) val remove : ('a, 'b) hash_table -> 'a -> 'b (* Remove an item, returning the item. The table's exception is raised if * the item doesn't exist. *) val numItems : ('a, 'b) hash_table -> int (* Return the number of items in the table *) val listItems : ('a, 'b) hash_table -> 'b list val listItemsi : ('a, 'b) hash_table -> ('a * 'b) list (* Return a list of the items (and their keys) in the table *) val app : ('b -> unit) -> ('a, 'b) hash_table -> unit val appi : (('a * 'b) -> unit) -> ('a, 'b) hash_table -> unit (* Apply a function to the entries of the table *) val map : ('b -> 'c) -> ('a, 'b) hash_table -> ('a, 'c) hash_table val mapi : (('a * 'b) -> 'c) -> ('a, 'b) hash_table -> ('a, 'c) hash_table (* Map a table to a new table that has the same keys *) val fold : (('b *'c) -> 'c) -> 'c -> ('a, 'b) hash_table -> 'c val foldi : (('a * 'b * 'c) -> 'c) -> 'c -> ('a, 'b) hash_table -> 'c (* Fold a function over the elements of a table *) val modify : ('b -> 'b) -> ('a, 'b) hash_table -> unit val modifyi : (('a * 'b) -> 'b) -> ('a, 'b) hash_table -> unit (* modify the hash-table items in place *) val filter : ('b -> bool) -> ('a, 'b) hash_table -> unit val filteri : (('a * 'b) -> bool) -> ('a, 'b) hash_table -> unit (* remove any hash table items that do not satisfy the given * predicate. *) val copy : ('a, 'b) hash_table -> ('a, 'b) hash_table (* Create a copy of a hash table *) val bucketSizes : ('a, 'b) hash_table -> int list (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) end (* HASH_TABLE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash-table.sml000066400000000000000000000136021416264345000240160ustar00rootroot00000000000000(* hash-table.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Polymorphic hash tables. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) structure HashTable : HASH_TABLE = struct structure HTRep = HashTableRep datatype ('a, 'b) hash_table = HT of { hash_fn : 'a -> word, eq_pred : ('a * 'a) -> bool, not_found : exn, table : ('a, 'b) HTRep.table ref, n_items : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* find smallest power of 2 (>= 32) that is >= n *) fun roundUp n = let fun f i = if (i >= n) then i else f(i * 2) in f 32 end (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun mkTable (hash, eq) (sizeHint, notFound) = HT{ hash_fn = hash, eq_pred = eq, not_found = notFound, table = ref (HTRep.alloc sizeHint), n_items = ref 0 } (* remove all elements from the table *) fun clear (HT{table, n_items, ...}) = (HTRep.clear(!table); n_items := 0) (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) fun insert (tbl as HT{hash_fn, eq_pred, table, n_items, ...}) (key, item) = let val arr = !table val sz = Array.length arr val hash = hash_fn key val indx = index (hash, sz) fun look HTRep.NIL = ( Array.update(arr, indx, HTRep.B(hash, key, item, Array.sub(arr, indx))); n_items := !n_items + 1; HTRep.growTableIfNeeded (table, !n_items); HTRep.NIL) | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso eq_pred(key, k)) then HTRep.B(hash, key, item, r) else (case (look r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h, k, v, rest) (* end case *)) in case (look (Array.sub (arr, indx))) of HTRep.NIL => () | b => Array.update(arr, indx, b) end (* return true, if the key is in the domain of the table *) fun inDomain (HT{hash_fn, eq_pred, table, ...}) key = let val arr = !table val hash = hash_fn key val indx = index (hash, Array.length arr) fun look HTRep.NIL = false | look (HTRep.B(h, k, v, r)) = ((hash = h) andalso eq_pred(key, k)) orelse look r in look (Array.sub (arr, indx)) end (* find an item, the table's exception is raised if the item doesn't exist *) fun lookup (HT{hash_fn, eq_pred, table, not_found, ...}) key = let val arr = !table val sz = Array.length arr val hash = hash_fn key val indx = index (hash, sz) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso eq_pred(key, k)) then v else look r in look (Array.sub (arr, indx)) end (* look for an item, return NONE if the item doesn't exist *) fun find (HT{hash_fn, eq_pred, table, ...}) key = let val arr = !table val sz = Array.length arr val hash = hash_fn key val indx = index (hash, sz) fun look HTRep.NIL = NONE | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso eq_pred(key, k)) then SOME v else look r in look (Array.sub (arr, indx)) end (* Remove an item. The table's exception is raised if * the item doesn't exist. *) fun remove (HT{hash_fn, eq_pred, not_found, table, n_items}) key = let val arr = !table val sz = Array.length arr val hash = hash_fn key val indx = index (hash, sz) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso eq_pred(key, k)) then (v, r) else let val (item, r') = look r in (item, HTRep.B(h, k, v, r')) end val (item, bucket) = look (Array.sub (arr, indx)) in Array.update (arr, indx, bucket); n_items := !n_items - 1; item end (* remove *) (* Return the number of items in the table *) fun numItems (HT{n_items, ...}) = !n_items (* return a list of the items in the table *) fun listItems (HT{table = ref arr, n_items, ...}) = HTRep.listItems (arr, n_items) fun listItemsi (HT{table = ref arr, n_items, ...}) = HTRep.listItemsi (arr, n_items) (* Apply a function to the entries of the table *) fun appi f (HT{table, ...}) = HTRep.appi f (! table) fun app f (HT{table, ...}) = HTRep.app f (! table) (* Map a table to a new table that has the same keys and exception *) fun mapi f (HT{hash_fn, eq_pred, table, n_items, not_found}) = HT{ hash_fn = hash_fn, eq_pred = eq_pred, table = ref(HTRep.mapi f (! table)), n_items = ref(!n_items), not_found = not_found } (* Map a table to a new table that has the same keys and exception *) fun map f (HT{hash_fn, eq_pred, table, n_items, not_found}) = HT{ hash_fn = hash_fn, eq_pred = eq_pred, table = ref(HTRep.map f (! table)), n_items = ref(!n_items), not_found = not_found } (* Fold a function over the entries of the table *) fun foldi f init (HT{table, ...}) = HTRep.foldi f init (! table) fun fold f init (HT{table, ...}) = HTRep.fold f init (! table) (* modify the hash-table items in place *) fun modifyi f (HT{table, ...}) = HTRep.modifyi f (!table) fun modify f (HT{table, ...}) = HTRep.modify f (!table) (* remove any hash table items that do not satisfy the given * predicate. *) fun filteri pred (HT{table, n_items, ...}) = n_items := HTRep.filteri pred (! table) fun filter pred (HT{table, n_items, ...}) = n_items := HTRep.filter pred (! table) (* Create a copy of a hash table *) fun copy (HT{hash_fn, eq_pred, table, n_items, not_found}) =HT{ hash_fn = hash_fn, eq_pred = eq_pred, table = ref(HTRep.copy (! table)), n_items = ref(!n_items), not_found = not_found } (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes (HT{table, ...}) = HTRep.bucketSizes(! table) end (* HashTable *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/hash2-table-fn.sml000066400000000000000000000214521416264345000245030ustar00rootroot00000000000000(* hash2-table-fn.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Hash tables that are keyed by two keys (in different domains). * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) functor Hash2TableFn ( structure Key1 : HASH_KEY structure Key2 : HASH_KEY ) : MONO_HASH2_TABLE = struct structure Key1 = Key1 structure Key2 = Key2 structure HTRep = HashTableRep (* the representation of a double-keyed hash table is two tables * that will always hold the same number of items and be the same * size. *) datatype 'a hash_table = TBL of { not_found : exn, tbl1 : (Key1.hash_key, Key2.hash_key * 'a) HTRep.table ref, tbl2 : (Key2.hash_key, Key1.hash_key * 'a) HTRep.table ref, n_items : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun mkTable (n, exn) = TBL{ not_found = exn, tbl1 = ref(HTRep.alloc n), tbl2 = ref(HTRep.alloc n), n_items = ref 0 } (* remove all elements from the table *) fun clear (TBL{tbl1, tbl2, n_items, ...}) = ( HTRep.clear(!tbl1); HTRep.clear(!tbl2); n_items := 0) (* Remove an item, returning the item. The table's exception is raised if * the item doesn't exist. *) fun remove (hashVal, sameKey) (arr, not_found, key) = let val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then (v, r) else let val (item, r') = look r in (item, HTRep.B(h, k, v, r')) end val (item, bucket) = look (Array.sub (arr, indx)) in Array.update (arr, indx, bucket); item end (* remove *) fun delete1 (tbl, not_found, k) = remove (Key1.hashVal, Key1.sameKey) (tbl, not_found, k) fun delete2 (tbl, not_found, k) = remove (Key2.hashVal, Key2.sameKey) (tbl, not_found, k) fun remove1 (TBL{tbl1, tbl2, n_items, not_found, ...}) k1 = let val (k2, item) = delete1 (!tbl1, not_found, k1) in delete2 (!tbl2, not_found, k2); n_items := !n_items - 1; item end fun remove2 (TBL{tbl1, tbl2, n_items, not_found, ...}) k2 = let val (k1, item) = delete2 (!tbl2, not_found, k2) in delete1 (!tbl1, not_found, k1); n_items := !n_items - 1; item end (* Insert an item. If there is already an item that has either of the two keys, * then the old item is discarded (from both tables) *) fun insert (TBL{tbl1, tbl2, n_items, ...}) (k1, k2, item) = let val arr1 = !tbl1 and arr2 = !tbl2 val sz = Array.length arr1 val h1 = Key1.hashVal k1 and h2 = Key2.hashVal k2 val i1 = index(h1, sz) and i2 = index(h2, sz) fun look1 HTRep.NIL = ( Array.update(arr1, i1, HTRep.B(h1, k1, (k2, item), Array.sub(arr1, i1))); (* we increment the number of items and grow the tables here, * but not when inserting into tbl2. *) n_items := !n_items + 1; if (HTRep.growTableIfNeeded (tbl1, !n_items)) then tbl2 := HTRep.growTable (arr2, Array.length(! tbl1)) else (); HTRep.NIL) | look1 (HTRep.B(h1', k1', (k2', v), r)) = if ((h1' = h1) andalso Key1.sameKey(k1', k1)) then ( if not(Key2.sameKey(k2, k2')) then ignore(delete2 (arr2, Fail "insert.look1", k2')) else (); HTRep.B(h1, k1, (k2, item), r)) else (case (look1 r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h1', k1', (k2', v), rest) (* end case *)) fun look2 HTRep.NIL = ( Array.update(arr2, i2, HTRep.B(h2, k2, (k1, item), Array.sub(arr2, i2))); HTRep.NIL) | look2 (HTRep.B(h2', k2', (k1', v), r)) = if ((h2' = h2) andalso Key2.sameKey(k2', k2)) then ( if not(Key1.sameKey(k1, k1')) then ignore(delete1 (arr1, Fail "insert.look2", k1')) else (); HTRep.B(h2, k2, (k1, item), r)) else (case (look2 r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h2, k2, (k1, v), rest) (* end case *)) in case (look1 (Array.sub (arr1, i1)), look2 (Array.sub (arr2, i2))) of (HTRep.NIL, HTRep.NIL) => () | (b1, b2) => ( (* NOTE: both b1 and b2 should be non-nil, since we should * have replaced an item in both tables. *) Array.update(arr1, i1, b1); Array.update(arr2, i2, b2)) (* end case *) end (* return true, if the key is in the domain of the table *) fun inDomain (hashVal, sameKey) tbl key = let val arr = !tbl val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = false | look (HTRep.B(h, k, v, r)) = ((hash = h) andalso sameKey(key, k)) orelse look r in look (Array.sub (arr, indx)) end fun inDomain1 (TBL{tbl1, ...}) = inDomain (Key1.hashVal, Key1.sameKey) tbl1 fun inDomain2 (TBL{tbl2, ...}) = inDomain (Key2.hashVal, Key2.sameKey) tbl2 (* Look for an item, the table's exception is raised if the item doesn't exist *) fun lookup (hashVal, sameKey) (tbl, not_found) key = let val arr = !tbl val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, (_, v), r)) = if ((hash = h) andalso sameKey(key, k)) then v else look r in look (Array.sub (arr, indx)) end fun lookup1 (TBL{tbl1, not_found, ...}) = lookup (Key1.hashVal, Key1.sameKey) (tbl1, not_found) fun lookup2 (TBL{tbl2, not_found, ...}) = lookup (Key2.hashVal, Key2.sameKey) (tbl2, not_found) (* Look for an item, return NONE if the item doesn't exist *) fun find (hashVal, sameKey) table key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = NONE | look (HTRep.B(h, k, (_, v), r)) = if ((hash = h) andalso sameKey(key, k)) then SOME v else look r in look (Array.sub (arr, indx)) end fun find1 (TBL{tbl1, ...}) = find (Key1.hashVal, Key1.sameKey) tbl1 fun find2 (TBL{tbl2, ...}) = find (Key2.hashVal, Key2.sameKey) tbl2 (* Return the number of items in the table *) fun numItems (TBL{n_items, ...}) = !n_items (* Return a list of the items (and their keys) in the table *) fun listItems (TBL{tbl1, ...}) = HTRep.fold (fn ((_, item), l) => item::l) [] (! tbl1) fun listItemsi (TBL{tbl1, ...}) = HTRep.foldi (fn (k1, (k2, item), l) => (k1, k2, item)::l) [] (! tbl1) (* Apply a function to the entries of the table *) fun app f (TBL{tbl1, ...}) = HTRep.app (fn (_, v) => f v) (! tbl1) fun appi f (TBL{tbl1, ...}) = HTRep.appi (fn (k1, (k2, v)) => f(k1, k2, v)) (! tbl1) (* Map a table to a new table that has the same keys *) fun map f (TBL{tbl1, tbl2, n_items, not_found}) = let val sz = Array.length (! tbl1) val newTbl = TBL{ tbl1 = ref (HTRep.alloc sz), tbl2 = ref (HTRep.alloc sz), n_items = ref 0, not_found = not_found } fun ins (k1, (k2, v)) = insert newTbl (k1, k2, f v) in HTRep.appi ins (! tbl1); newTbl end fun mapi f (TBL{tbl1, tbl2, n_items, not_found}) = let val sz = Array.length (! tbl1) val newTbl = TBL{ tbl1 = ref (HTRep.alloc sz), tbl2 = ref (HTRep.alloc sz), n_items = ref 0, not_found = not_found } fun ins (k1, (k2, v)) = insert newTbl (k1, k2, f(k1, k2, v)) in HTRep.appi ins (! tbl1); newTbl end (* TODO: add mapPartial and mapPartiali *) fun fold f init (TBL{tbl1, ...}) = HTRep.fold (fn ((_, v), accum) => f(v, accum)) init (! tbl1) fun foldi f init (TBL{tbl1, ...}) = HTRep.foldi (fn (k1, (k2, v), accum) => f(k1, k2, v, accum)) init (! tbl1) (* TODO: add modify and modifyi *) (* remove any hash table items that do not satisfy the given * predicate. *) fun filter pred (TBL{tbl1, tbl2, n_items, ...}) = let fun ins (k1, (k2, v)) = if (pred v) then () else ( delete1 (!tbl1, Fail "filter", k1); delete2 (!tbl2, Fail "filter", k2); n_items := !n_items-1) in HTRep.appi ins (! tbl1) end fun filteri pred (TBL{tbl1, tbl2, n_items, not_found}) = let fun ins (k1, (k2, v)) = if (pred(k1, k2, v)) then () else ( delete1 (!tbl1, Fail "filteri", k1); delete2 (!tbl2, Fail "filteri", k2); n_items := !n_items-1) in HTRep.appi ins (! tbl1) end (* Create a copy of a hash table *) fun copy (TBL{tbl1, tbl2, n_items, not_found}) = TBL{ tbl1 = ref(HTRep.copy (! tbl1)), tbl2 = ref(HTRep.copy (! tbl2)), n_items = ref(! n_items), not_found = not_found } (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes (TBL{tbl1, tbl2, ...}) = (HTRep.bucketSizes(! tbl1), HTRep.bucketSizes(! tbl2)) end (* MONO_HASH2_TABLE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-binary-map.sml000066400000000000000000000347431416264345000246460ustar00rootroot00000000000000(* int-binary-map.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * * Altered to work as a geneal intmap - Emden Gansner *) structure IntBinaryMap :> ORD_MAP where type Key.ord_key = Int.int = struct structure Key = struct type ord_key = Int.int val compare = Int.compare end (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i datatype 'a map = E | T of { key : int, value : 'a, cnt : int, left : 'a map, right : 'a map } fun isEmpty E = true | isEmpty _ = false fun numItems E = 0 | numItems (T{cnt,...}) = cnt (* return the first item in the map (or NONE if it is empty) *) fun first E = NONE | first (T{value, left=E, ...}) = SOME value | first (T{left, ...}) = first left (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti E = NONE | firsti (T{key, value, left=E, ...}) = SOME(key, value) | firsti (T{left, ...}) = firsti left local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv,left=T{key=b,value=bv,left=x,right=y,...},right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w,right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in val empty = E fun singleton (x,v) = T{key=x,value=v,cnt=1,left=E,right=E} fun insert (E,x,v) = T{key=x,value=v,cnt=1,left=E,right=E} | insert (T(set as {key,left,right,value,...}),x,v) = if key > x then T'(key,value,insert(left,x,v),right) else if key < x then T'(key,value,left,insert(right,x,v)) else T{key=x,value=v,left=left,right=right,cnt= #cnt set} fun insert' ((k, x), m) = insert(m, k, x) fun insertWithi comb (m, x, v) = let fun insert E = T{key=x, value=v, cnt=1, left=E, right=E} | insert (T{key, left, right, value, cnt}) = if key > x then T'(key, value, insert left,right) else if key < x then T'(key, value, left, insert right) else let val v' = comb(x, value, v) in T{key=x,value=v,left=left,right=right,cnt=cnt} end in insert m end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) fun inDomain (set, x) = let fun mem E = false | mem (T(n as {key,left,right,...})) = if x > key then mem right else if x < key then mem left else true in mem set end fun find (set, x) = let fun mem E = NONE | mem (T(n as {key,left,right,...})) = if x > key then mem right else if x < key then mem left else SOME(#value n) in mem set end fun lookup (set, x) = let fun mem E = raise LibBase.NotFound | mem (T(n as {key,left,right,...})) = if x > key then mem right else if x < key then mem left else #value n in mem set end fun remove (E,x) = raise LibBase.NotFound | remove (set as T{key,left,right,value,...},x) = if key > x then let val (left',v) = remove(left,x) in (T'(key,value,left',right),v) end else if key < x then let val (right',v) = remove(right,x) in (T'(key,value,left,right'),v) end else (delete'(left,right),value) fun listItems d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, value::(d2l(right,l))) in d2l (d,[]) end fun listItemsi d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, (key,value)::(d2l(right,l))) in d2l (d,[]) end fun listKeys d = let fun d2l (E, l) = l | d2l (T{key,left,right,...}, l) = d2l(left, key::(d2l(right,l))) in d2l (d,[]) end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun collate cmpRng (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{key=x1, value=y1, ...}, r1), (T{key=x2, value=y2, ...}, r2)) => ( case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end (* local *) fun appi f d = let fun appf E = () | appf (T{key,value,left,right,...}) = ( appf left; f(key,value); appf right) in appf d end fun app f d = appi (fn (_, v) => f v) d fun mapi f d = let fun mapf E = E | mapf (T{key,value,left,right,cnt}) = let val left' = mapf left val value' = f(key, value) val right' = mapf right in T{cnt=cnt, key=key, value=value', left = left', right = right'} end in mapf d end fun map f d = mapi (fn (_, x) => f x) d fun foldli f init d = let fun fold (E,v) = v | fold (T{key,value,left,right,...},v) = fold (right, f(key, value, fold(left, v))) in fold (d, init) end fun foldl f init d = foldli (fn (_, v, accum) => f (v, accum)) init d fun foldri f init d = let fun fold (E,v) = v | fold (T{key,value,left,right,...},v) = fold (left, f(key, value, fold(right, v))) in fold (d, init) end fun foldr f init d = foldri (fn (_, v, accum) => f (v, accum)) init d end (* local *) (* the following are generic implementations of the unionWith, intersectWith, * and mergeWith operetions. These should be specialized for the internal * representations at some point. *) fun unionWith f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (a, b) => f (b, a))) m1 m2 else foldli (ins f) m2 m1 end fun unionWithi f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (k, a, b) => f (k, b, a))) m1 m2 else foldli (ins f) m2 m1 end fun intersectWith f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (a, b) => f(b, a)) (m2, m1) end fun intersectWithi f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (k, a, b) => f(k, b, a)) (m2, m1) end fun mergeWith f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( if (k1 < k2) then mergef (k1, SOME x1, NONE, r1, m2, m) else if (k1 = k2) then mergef (k1, SOME x1, SOME x2, r1, r2, m) else mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end fun mergeWithi f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( if (k1 < k2) then mergef (k1, SOME x1, NONE, r1, m2, m) else if (k1 = k2) then mergef (k1, SOME x1, SOME x2, r1, r2, m) else mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (k, x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end (* this is a generic implementation of filter. It should * be specialized to the data-structure at some point. *) fun filter predFn m = let fun f (key, item, m) = if predFn item then insert(m, key, item) else m in foldli f empty m end fun filteri predFn m = let fun f (key, item, m) = if predFn(key, item) then insert(m, key, item) else m in foldli f empty m end (* this is a generic implementation of mapPartial. It should * be specialized to the data-structure at some point. *) fun mapPartial f m = let fun g (key, item, m) = (case f item of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end fun mapPartiali f m = let fun g (key, item, m) = (case f(key, item) of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' E = false | exists' (T{value, left, right, ...}) = exists' left orelse pred value orelse exists' right in exists' end fun existsi pred = let fun exists' E = false | exists' (T{key, value, left, right, ...}) = exists' left orelse pred(key, value) orelse exists' right in exists' end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' E = true | all' (T{value, left, right, ...}) = all' left andalso pred value andalso all' right in all' end fun alli pred = let fun all' E = true | all' (T{key, value, left, right, ...}) = all' left andalso pred(key, value) andalso all' right in all' end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-binary-set.sml000066400000000000000000000354251416264345000246620ustar00rootroot00000000000000(* int-binary-set.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * Altered to conform to SML library interface - Emden Gansner * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * * 3. There are two implementations of union. The default, * hedge_union, is much more complex and usually 20% faster. I * am not sure that the performance increase warrants the * complexity (and time it took to write), but I am leaving it * in for the competition. It is derived from the original * union by replacing the split_lt(gt) operations with a lazy * version. The `obvious' version is called old_union. * * 4. Most time is spent in T', the rebalancing constructor. If my * understanding of the output of * in the sml batch * compiler is correct then the code produced by NJSML 0.75 * (sparc) for the final case is very disappointing. Most * invocations fall through to this case and most of these cases * fall to the else part, i.e. the plain contructor, * T(v,ln+rn+1,l,r). The poor code allocates a 16 word vector * and saves lots of registers into it. In the common case it * then retrieves a few of the registers and allocates the 5 * word T node. The values that it retrieves were live in * registers before the massive save. *) structure IntBinarySet :> ORD_SET where type Key.ord_key = Int.int = struct structure Key = struct type ord_key = Int.int val compare = Int.compare end type item = Key.ord_key datatype set = E | T of { elt : item, cnt : int, left : set, right : set } fun numItems E = 0 | numItems (T{cnt,...}) = cnt fun isEmpty E = true | isEmpty _ = false fun minItem E = raise Empty | minItem (T{elt, left=E, ...}) = elt | minItem (T{left, ...}) = minItem left fun maxItem E = raise Empty | maxItem (T{elt, right=E, ...}) = elt | maxItem (T{right, ...}) = maxItem right fun mkT(v,n,l,r) = T{elt=v,cnt=n,left=l,right=r} (* N(v,l,r) = T(v,1+numItems(l)+numItems(r),l,r) *) fun N(v,E,E) = mkT(v,1,E,E) | N(v,E,r as T{cnt=n,...}) = mkT(v,n+1,E,r) | N(v,l as T{cnt=n,...}, E) = mkT(v,n+1,l,E) | N(v,l as T{cnt=n,...}, r as T{cnt=m,...}) = mkT(v,n+m+1,l,r) fun single_L (a,x,T{elt=b,left=y,right=z,...}) = N(b,N(a,x,y),z) | single_L _ = raise Match fun single_R (b,T{elt=a,left=x,right=y,...},z) = N(a,x,N(b,y,z)) | single_R _ = raise Match fun double_L (a,w,T{elt=c,left=T{elt=b,left=x,right=y,...},right=z,...}) = N(b,N(a,w,x),N(c,y,z)) | double_L _ = raise Match fun double_R (c,T{elt=a,left=w,right=T{elt=b,left=x,right=y,...},...},z) = N(b,N(a,w,x),N(c,y,z)) | double_R _ = raise Match (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i fun T' (v,E,E) = mkT(v,1,E,E) | T' (v,E,r as T{left=E,right=E,...}) = mkT(v,2,E,r) | T' (v,l as T{left=E,right=E,...},E) = mkT(v,2,l,E) | T' (p as (_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if lnrn then single_R p else double_R p | T' (p as (_,E,T{left=E,...})) = single_L p | T' (p as (_,T{right=E,...},E)) = single_R p | T' (p as (v,l as T{elt=lv,cnt=ln,left=ll,right=lr}, r as T{elt=rv,cnt=rn,left=rl,right=rr})) = if rn >= wt ln (*right is too big*) then let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn (*left is too big*) then let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else mkT(v,ln+rn+1,l,r) fun add (E,x) = mkT(x,1,E,E) | add (set as T{elt=v,left=l,right=r,cnt},x) = ( case Key.compare(x,v) of LESS => T'(v,add(l,x),r) | GREATER => T'(v,l,add(r,x)) | EQUAL => mkT(x,cnt,l,r) (* end case *)) fun add' (s, x) = add(x, s) fun concat3 (E,v,r) = add(r,v) | concat3 (l,v,E) = add(l,v) | concat3 (l as T{elt=v1,cnt=n1,left=l1,right=r1}, v, r as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat3(l,v,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat3(r1,v,r)) else N(v,l,r) fun split_lt (E,x) = E | split_lt (T{elt=v,left=l,right=r,...},x) = case Key.compare(v,x) of GREATER => split_lt(l,x) | LESS => concat3(l,v,split_lt(r,x)) | _ => l fun split_gt (E,x) = E | split_gt (T{elt=v,left=l,right=r,...},x) = case Key.compare(v,x) of LESS => split_gt(r,x) | GREATER => concat3(split_gt(l,x),v,r) | _ => r fun min (T{elt=v,left=E,...}) = v | min (T{left=l,...}) = min l | min _ = raise Match fun delmin (T{left=E,right=r,...}) = r | delmin (T{elt=v,left=l,right=r,...}) = T'(v,delmin l,r) | delmin _ = raise Match fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = T'(min r,l,delmin r) fun concat (E, s) = s | concat (s, E) = s | concat (t1 as T{elt=v1,cnt=n1,left=l1,right=r1}, t2 as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat(t1,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat(r1,t2)) else T'(min t2,t1, delmin t2) local fun trim (lo,hi,E) = E | trim (lo,hi,s as T{elt=v,left=l,right=r,...}) = if (v > lo) then if (v < hi) then s else trim(lo,hi,l) else trim(lo,hi,r) fun uni_bd (s,E,_,_) = s | uni_bd (E,T{elt=v,left=l,right=r,...},lo,hi) = concat3(split_gt(l,lo),v,split_lt(r,hi)) | uni_bd (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo,hi) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v), v, uni_bd(r1,trim(v,hi,s2),v,hi)) (* inv: lo < v < hi *) (* all the other versions of uni and trim are * specializations of the above two functions with * lo=-infinity and/or hi=+infinity *) fun trim_lo (_, E) = E | trim_lo (lo,s as T{elt=v,right=r,...}) = case Key.compare(v,lo) of GREATER => s | _ => trim_lo(lo,r) fun trim_hi (_, E) = E | trim_hi (hi,s as T{elt=v,left=l,...}) = case Key.compare(v,hi) of LESS => s | _ => trim_hi(hi,l) fun uni_hi (s,E,_) = s | uni_hi (E,T{elt=v,left=l,right=r,...},hi) = concat3(l,v,split_lt(r,hi)) | uni_hi (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},hi) = concat3(uni_hi(l1,trim_hi(v,s2),v),v,uni_bd(r1,trim(v,hi,s2),v,hi)) fun uni_lo (s,E,_) = s | uni_lo (E,T{elt=v,left=l,right=r,...},lo) = concat3(split_gt(l,lo),v,r) | uni_lo (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v),v,uni_lo(r1,trim_lo(v,s2),v)) fun uni (s,E) = s | uni (E,s) = s | uni (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...}) = concat3(uni_hi(l1,trim_hi(v,s2),v), v, uni_lo(r1,trim_lo(v,s2),v)) in val hedge_union = uni end (* The old_union version is about 20% slower than * hedge_union in most cases *) fun old_union (E,s2) = s2 | old_union (s1,E) = s1 | old_union (T{elt=v,left=l,right=r,...},s2) = let val l2 = split_lt(s2,v) val r2 = split_gt(s2,v) in concat3(old_union(l,l2),v,old_union(r,r2)) end val empty = E fun singleton x = T{elt=x,cnt=1,left=E,right=E} fun addList (s,l) = List.foldl (fn (i,s) => add(s,i)) s l fun fromList l = addList (E, l) val add = add fun member (set, x) = let fun pk E = false | pk (T{elt=v, left=l, right=r, ...}) = ( case Key.compare(x,v) of LESS => pk l | EQUAL => true | GREATER => pk r (* end case *)) in pk set end local (* true if every item in t is in t' *) fun treeIn (t,t') = let fun isIn E = true | isIn (T{elt,left=E,right=E,...}) = member(t',elt) | isIn (T{elt,left,right=E,...}) = member(t',elt) andalso isIn left | isIn (T{elt,left=E,right,...}) = member(t',elt) andalso isIn right | isIn (T{elt,left,right,...}) = member(t',elt) andalso isIn left andalso isIn right in isIn t end in fun isSubset (E,_) = true | isSubset (_,E) = false | isSubset (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n<=n') andalso treeIn (t,t') fun equal (E,E) = true | equal (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n=n') andalso treeIn (t,t') | equal _ = false end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun compare (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ( case Key.compare(e1, e2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end fun disjoint (s1, s2) = let fun walk (t1, t2) = (case (next t1, next t2) of ((E, _), _) => true | (_, (E, _)) => true | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ((e1 < e2) andalso walk (r1, t2)) orelse ((e1 > e2) andalso walk (t1, r2)) (* end case *)) in walk (left(s1, []), left(s2, [])) end end fun delete (E,x) = raise LibBase.NotFound | delete (set as T{elt=v,left=l,right=r,...},x) = case Key.compare(x,v) of LESS => T'(v,delete(l,x),r) | GREATER => T'(v,l,delete(r,x)) | _ => delete'(l,r) val union = hedge_union fun intersection (E, _) = E | intersection (_, E) = E | intersection (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in if member(s,v) then concat3(intersection(l2,l),v,intersection(r2,r)) else concat(intersection(l2,l),intersection(r2,r)) end fun difference (E,s) = E | difference (s,E) = s | difference (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in concat(difference(l2,l),difference(r2,r)) end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) E items in difference (l, items') end fun map f set = let fun map'(acc, E) = acc | map'(acc, T{elt,left,right,...}) = map' (add (map' (acc, left), f elt), right) in map' (E, set) end fun mapPartial f set = let fun map' (acc, E) = acc | map' (acc, T{elt, left, right, ...}) = let val acc = map' (acc, left) in case f elt of NONE => map' (acc, right) | SOME elt' => map' (add (acc, elt'), right) (* end case *) end in map' (E, set) end fun app apf = let fun apply E = () | apply (T{elt,left,right,...}) = (apply left;apf elt; apply right) in apply end fun foldl f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (right, f(elt, foldf (left, b))) in foldf (set, b) end fun foldr f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (left, f(elt, foldf (right, b))) in foldf (set, b) end fun toList set = foldr (op::) [] set fun filter pred set = foldl (fn (item, s) => if (pred item) then add(s, item) else s) empty set fun partition pred set = foldl (fn (item, (s1, s2)) => if (pred item) then (add(s1, item), s2) else (s1, add(s2, item)) ) (empty, empty) set fun exists p E = false | exists p (T{elt, left, right,...}) = (exists p left) orelse (p elt) orelse (exists p right) fun all p E = true | all p (T{elt, left, right,...}) = (all p left) andalso (p elt) andalso (all p right) fun find p E = NONE | find p (T{elt,left,right,...}) = (case find p left of NONE => if (p elt) then SOME elt else find p right | a => a (* end case *)) (* deprecated *) val listItems = toList end (* IntBinarySet *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-hash-table.sml000066400000000000000000000130261416264345000246060ustar00rootroot00000000000000(* int-hash-table.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A specialization of the hash table functor to integer keys. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) structure IntHashTable :> MONO_HASH_TABLE where type Key.hash_key = int = struct structure Key = struct type hash_key = int fun sameKey (a : int, b) = (a = b) fun hashVal a = Word.fromInt a end open Key structure HTRep = HashTableRep datatype 'a hash_table = HT of { not_found : exn, table : (hash_key, 'a) HTRep.table ref, n_items : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun mkTable (sizeHint, notFound) = HT{ not_found = notFound, table = ref (HTRep.alloc sizeHint), n_items = ref 0 } (* remove all elements from the table *) fun clear (HT{table, n_items, ...}) = (HTRep.clear(!table); n_items := 0) (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) fun insert (tbl as HT{table, n_items, ...}) (key, item) = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = ( Array.update(arr, indx, HTRep.B(hash, key, item, Array.sub(arr, indx))); n_items := !n_items + 1; HTRep.growTableIfNeeded (table, !n_items); HTRep.NIL) | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then HTRep.B(hash, key, item, r) else (case (look r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h, k, v, rest) (* end case *)) in case (look (Array.sub (arr, indx))) of HTRep.NIL => () | b => Array.update(arr, indx, b) (* end case *) end (* return true, if the key is in the domain of the table *) fun inDomain (HT{table, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = false | look (HTRep.B(h, k, v, r)) = ((hash = h) andalso sameKey(key, k)) orelse look r in look (Array.sub (arr, indx)) end (* find an item, the table's exception is raised if the item doesn't exist *) fun lookup (HT{table, not_found, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then v else look r in look (Array.sub (arr, indx)) end (* look for an item, return NONE if the item doesn't exist *) fun find (HT{table, ...}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = NONE | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then SOME v else look r in look (Array.sub (arr, indx)) end (* Remove an item. The table's exception is raised if * the item doesn't exist. *) fun remove (HT{not_found, table, n_items}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then (v, r) else let val (item, r') = look r in (item, HTRep.B(h, k, v, r')) end val (item, bucket) = look (Array.sub (arr, indx)) in Array.update (arr, indx, bucket); n_items := !n_items - 1; item end (* remove *) (* Return the number of items in the table *) fun numItems (HT{n_items, ...}) = !n_items (* return a list of the items in the table *) fun listItems (HT{table = ref arr, n_items, ...}) = HTRep.listItems (arr, n_items) fun listItemsi (HT{table = ref arr, n_items, ...}) = HTRep.listItemsi (arr, n_items) (* Apply a function to the entries of the table *) fun appi f (HT{table, ...}) = HTRep.appi f (! table) fun app f (HT{table, ...}) = HTRep.app f (! table) (* Map a table to a new table that has the same keys and exception *) fun mapi f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.mapi f (! table)), n_items = ref(!n_items), not_found = not_found } fun map f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.map f (! table)), n_items = ref(!n_items), not_found = not_found } (* Fold a function over the entries of the table *) fun foldi f init (HT{table, ...}) = HTRep.foldi f init (! table) fun fold f init (HT{table, ...}) = HTRep.fold f init (! table) (* modify the hash-table items in place *) fun modifyi f (HT{table, ...}) = HTRep.modifyi f (!table) fun modify f (HT{table, ...}) = HTRep.modify f (!table) (* remove any hash table items that do not satisfy the given * predicate. *) fun filteri pred (HT{table, n_items, ...}) = n_items := HTRep.filteri pred (! table) fun filter pred (HT{table, n_items, ...}) = n_items := HTRep.filter pred (! table) (* Create a copy of a hash table *) fun copy (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.copy(! table)), n_items = ref(!n_items), not_found = not_found } (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes (HT{table, ...}) = HTRep.bucketSizes (! table) end (* HashTableFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-list-map.sml000066400000000000000000000213001416264345000243160ustar00rootroot00000000000000(* int-list-map.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * An implementation of finite maps on integer keys, which uses a sorted list * representation. *) structure IntListMap :> ORD_MAP where type Key.ord_key = Int.int = struct structure Key = struct type ord_key = int val compare = Int.compare end type 'a map = (int * 'a) list val empty = [] fun isEmpty [] = true | isEmpty _ = false (* return the first item in the map (or NONE if it is empty) *) fun first [] = NONE | first ((_, value)::_) = SOME value (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti [] = NONE | firsti ((key, value)::_) = SOME(key, value) fun singleton (key, item) = [(key, item)] fun insert (l, key, item) = let fun f [] = [(key, item)] | f ((elem as (key', _))::r) = (case Key.compare(key, key') of LESS => (key, item) :: elem :: r | EQUAL => (key, item) :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun insert' ((k, x), m) = insert(m, k, x) fun insertWithi comb (l, key, item) = let fun f [] = [(key, item)] | f ((elem as (key', item'))::r) = (case Key.compare(key, key') of LESS => (key, item) :: elem :: r | EQUAL => (key, comb(key, item', item)) :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) (* return true if the key is in the map's domain *) fun inDomain (l, key) = let fun f [] = false | f ((key', x) :: r) = (key' <= key) andalso ((key' = key) orelse f r) in f l end (* Look for an item, return NONE if the item doesn't exist *) fun find (l, key) = let fun f [] = NONE | f ((key', x) :: r) = if (key < key') then NONE else if (key = key') then SOME x else f r in f l end (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (l, key) = let fun f [] = raise LibBase.NotFound | f ((key', x) :: r) = if (key < key') then raise LibBase.NotFound else if (key = key') then x else f r in f l end (* Remove an item, returning new map and value removed. * Raise LibBase.NotFound if not found. *) fun remove (l, key) = let fun f (_, []) = raise LibBase.NotFound | f (prefix, (elem as (key', x)) :: r) = (case Key.compare(key, key') of LESS => raise LibBase.NotFound | EQUAL => (List.revAppend(prefix, r), x) | GREATER => f(elem :: prefix, r) (* end case *)) in f ([], l) end (* Return the number of items in the map *) fun numItems l = List.length l (* Return a list of the items (and their keys) in the map *) fun listItems (l : 'a map) = List.map #2 l fun listItemsi l = l fun listKeys (l : 'a map) = List.map #1 l fun collate cmpRng = let fun cmp ([], []) = EQUAL | cmp ([], _) = LESS | cmp (_, []) = GREATER | cmp ((x1, y1)::r1, (x2, y2)::r2) = (case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) in cmp end (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) fun unionWith f (m1 : 'a map, m2 : 'a map) = let fun merge ([], [], l) = List.rev l | merge ([], m2, l) = List.revAppend(l, m2) | merge (m1, [], l) = List.revAppend(l, m1) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, (k1, x1)::l) | EQUAL => merge (r1, r2, (k1, f(x1, x2)) :: l) | GREATER => merge (m1, r2, (k2, x2)::l) (* end case *)) in merge (m1, m2, []) end fun unionWithi f (m1 : 'a map, m2 : 'a map) = let fun merge ([], [], l) = List.rev l | merge ([], m2, l) = List.revAppend(l, m2) | merge (m1, [], l) = List.revAppend(l, m1) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, (k1, x1)::l) | EQUAL => merge (r1, r2, (k1, f(k1, x1, x2)) :: l) | GREATER => merge (m1, r2, (k2, x2)::l) (* end case *)) in merge (m1, m2, []) end (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) fun intersectWith f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, l) | EQUAL => merge (r1, r2, (k1, f(x1, x2)) :: l) | GREATER => merge (m1, r2, l) (* end case *)) | merge (_, _, l) = List.rev l in merge (m1, m2, []) end fun intersectWithi f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, l) | EQUAL => merge (r1, r2, (k1, f(k1, x1, x2)) :: l) | GREATER => merge (m1, r2, l) (* end case *)) | merge (_, _, l) = List.rev l in merge (m1, m2, []) end fun mergeWith f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = if (k1 < k2) then mergef (k1, SOME x1, NONE, r1, m2, l) else if (k1 = k2) then mergef (k1, SOME x1, SOME x2, r1, r2, l) else mergef (k2, NONE, SOME x2, m1, r2, l) | merge ([], [], l) = List.rev l | merge ((k1, x1)::r1, [], l) = mergef (k1, SOME x1, NONE, r1, [], l) | merge ([], (k2, x2)::r2, l) = mergef (k2, NONE, SOME x2, [], r2, l) and mergef (k, x1, x2, r1, r2, l) = (case f (x1, x2) of NONE => merge (r1, r2, l) | SOME y => merge (r1, r2, (k, y)::l) (* end case *)) in merge (m1, m2, []) end fun mergeWithi f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = if (k1 < k2) then mergef (k1, SOME x1, NONE, r1, m2, l) else if (k1 = k2) then mergef (k1, SOME x1, SOME x2, r1, r2, l) else mergef (k2, NONE, SOME x2, m1, r2, l) | merge ([], [], l) = List.rev l | merge ((k1, x1)::r1, [], l) = mergef (k1, SOME x1, NONE, r1, [], l) | merge ([], (k2, x2)::r2, l) = mergef (k2, NONE, SOME x2, [], r2, l) and mergef (k, x1, x2, r1, r2, l) = (case f (k, x1, x2) of NONE => merge (r1, r2, l) | SOME y => merge (r1, r2, (k, y)::l) (* end case *)) in merge (m1, m2, []) end (* Apply a function to the entries of the map in map order. *) val appi = List.app fun app f l = appi (fn (_, item) => f item) l (* Create a new table by applying a map function to the * name/value pairs in the table. *) fun mapi f l = List.map (fn (key, item) => (key, f(key, item))) l fun map f l = List.map (fn (key, item) => (key, f item)) l (* Apply a folding function to the entries of the map * in increasing map order. *) fun foldli f init l = List.foldl (fn ((key, item), accum) => f(key, item, accum)) init l fun foldl f init l = List.foldl (fn ((_, item), accum) => f(item, accum)) init l (* Apply a folding function to the entries of the map * in decreasing map order. *) fun foldri f init l = List.foldr (fn ((key, item), accum) => f(key, item, accum)) init l fun foldr f init l = List.foldr (fn ((_, item), accum) => f(item, accum)) init l fun filter pred l = List.filter (fn (_, item) => pred item) l fun filteri pred l = List.filter pred l fun mapPartiali f l = let fun f' (key, item) = (case f (key, item) of NONE => NONE | SOME y => SOME(key, y) (* end case *)) in List.mapPartial f' l end fun mapPartial f l = mapPartiali (fn (_, item) => f item) l (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' [] = false | exists' ((_, x)::r) = pred x orelse exists' r in exists' end fun existsi pred = let fun exists' [] = false | exists' (arg::r) = pred arg orelse exists' r in exists' end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' [] = false | all' ((_, x)::r) = pred x andalso all' r in all' end fun alli pred = let fun all' [] = false | all' (arg::r) = pred arg andalso all' r in all' end end (* IntListMap *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-list-set.sml000066400000000000000000000116351416264345000243460ustar00rootroot00000000000000(* int-list-set.sml * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * An implementation of finite sets of integers, which uses a sorted list * representation. *) structure IntListSet :> ORD_SET where type Key.ord_key = Int.int = struct structure Key = struct type ord_key = int val compare = Int.compare end (* sets are represented as ordered lists of integers *) type item = Key.ord_key type set = item list val empty = [] fun singleton x = [x] fun add (l, item) = let fun f [] = [item] | f (elem::r) = (case Key.compare(item, elem) of LESS => item :: elem :: r | EQUAL => item :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun add' (s, x) = add(x, s) fun union (s1, s2) = let fun merge ([], l2) = l2 | merge (l1, []) = l1 | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => x :: merge(r1, y::r2) | EQUAL => x :: merge(r1, r2) | GREATER => y :: merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun intersection (s1, s2) = let fun merge ([], l2) = [] | merge (l1, []) = [] | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => merge(r1, y::r2) | EQUAL => x :: merge(r1, r2) | GREATER => merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun difference (s1, s2) = let fun merge ([], l2) = [] | merge (l1, []) = l1 | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => x :: merge(r1, y::r2) | EQUAL => merge(r1, r2) | GREATER => merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun addList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) [] items in union (l, items') end fun subtract (l, item) = let fun f ([], _) = l | f (elem::r, prefix) = (case Key.compare(item, elem) of LESS => l | EQUAL => List.revAppend(prefix, r) | GREATER => f (r, elem::prefix) (* end case *)) in f (l, []) end fun subtract' (item, l) = subtract (l, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) [] items in difference (l, items') end (* create a set from a list of items; this function works in linear time if the list * is in increasing order. *) fun fromList [] = [] | fromList (first::rest) = let fun add (prev, x::xs, s) = (case Key.compare(prev, x) of LESS => add (x, xs, x::s) | _ => (* not ordered, so fallback to addList *) addList (List.rev s, x::xs) (* end case *)) | add (_, [], s) = List.rev s in add (first, rest, [first]) end (* Remove an item, returning new map and value removed. * Raise LibBase.NotFound if not found. *) fun delete (l, elem) = let fun f (_, []) = raise LibBase.NotFound | f (prefix, elem' :: r) = (case Key.compare(elem, elem') of LESS => raise LibBase.NotFound | EQUAL => List.revAppend(prefix, r) | GREATER => f(elem' :: prefix, r) (* end case *)) in f ([], l) end fun member (l, item) = let fun f [] = false | f (elem :: r) = (case Key.compare(item, elem) of LESS => false | EQUAL => true | GREATER => f r (* end case *)) in f l end fun isEmpty [] = true | isEmpty _ = false fun minItem [] = raise Empty | minItem (x::_) = x fun maxItem xs = List.last xs fun equal (s1, s2) = let fun f ([], []) = true | f ((x : int)::r1, y::r2) = (x = y) andalso f (r1, r2) | f _ = false in f (s1, s2) end fun compare ([], []) = EQUAL | compare ([], _) = LESS | compare (_, []) = GREATER | compare (x1::r1, x2::r2) = (case Key.compare(x1, x2) of EQUAL => compare (r1, r2) | order => order (* end case *)) (* Return true if and only if the first set is a subset of the second *) fun isSubset (s1, s2) = let fun f ([], _) = true | f (_, []) = false | f (x::r1, y::r2) = ((x = y) andalso f (r1, r2)) orelse ((x > y) andalso f (x::r1, r2)) in f (s1, s2) end fun disjoint ([], _) = true | disjoint (_, []) = true | disjoint (x::r1, y::r2) = ((x < y) andalso disjoint (r1, y::r2)) orelse ((x > y) andalso disjoint (x::r1, r2)) (* Return the number of items in the set *) fun numItems l = List.length l (* Return a list of the items in the set *) fun toList l = l val app = List.app fun map f s1 = List.foldl (fn (x, s) => add(s, f x)) [] s1 fun mapPartial f s = let fun f' (x, acc) = (case f x of SOME x' => add(acc, x') | NONE => acc) in List.foldl f' [] s end val foldr = List.foldr val foldl = List.foldl val filter = List.filter val partition = List.partition val exists = List.exists val all = List.all val find = List.find (* deprecated *) val listItems = toList end (* IntListMap *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-redblack-map.sml000066400000000000000000000523201416264345000251200ustar00rootroot00000000000000(* int-redblack-map.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) structure IntRedBlackMap :> ORD_MAP where type Key.ord_key = int = struct structure Key = struct type ord_key = int val compare = Int.compare end datatype color = R | B datatype 'a tree = E | T of (color * 'a tree * Key.ord_key * 'a * 'a tree) datatype 'a map = MAP of (int * 'a tree) fun isEmpty (MAP(_, E)) = true | isEmpty _ = false val empty = MAP(0, E) fun singleton (xk, x) = MAP(1, T(B, E, xk, x, E)) fun insert (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = if (xk < yk) then (case a of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk,w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) else if (xk = zk) then T(color, T(R, c, xk, x, d), yk, y, b) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) else if (xk = yk) then T(color, a, xk, x, b) else (case b of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) else if (xk = zk) then T(color, a, yk, y, T(R, c, xk, x, d)) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insert' ((xk, x), m) = insert (m, xk, x) fun insertWithi comb (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = if (xk < yk) then (case a of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk,w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) else if (xk = zk) then T(color, T(R, c, xk, comb(xk, z, x), d), yk, y, b) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) else if (xk = yk) then T(color, a, xk, comb(xk, y, x), b) else (case b of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) else if (xk = zk) then T(color, a, yk, y, T(R, c, xk, comb(xk, z, x), d)) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) (* Is a key in the domain of the map? *) fun inDomain (MAP(_, t), k) = let fun find' E = false | find' (T(_, a, yk, y, b)) = (k = yk) orelse ((k < yk) andalso find' a) orelse (find' b) in find' t end (* Look for an item, return NONE if the item doesn't exist *) fun find (MAP(_, t), k) = let fun find' E = NONE | find' (T(_, a, yk, y, b)) = if (k < yk) then find' a else if (k = yk) then SOME y else find' b in find' t end (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (MAP(_, t), k) = let fun look E = raise LibBase.NotFound | look (T(_, a, yk, y, b)) = if (k < yk) then look a else if (k = yk) then y else look b in look t end (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) local datatype 'a zipper = TOP | LEFT of (color * Key.ord_key * 'a * 'a tree * 'a zipper) | RIGHT of (color * 'a tree * Key.ord_key * 'a * 'a zipper) in fun remove (MAP(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, xk, x, b, z), a) = zip(z, T(color, a, xk, x, b)) | zip (RIGHT(color, a, xk, x, z), b) = zip(z, T(color, a, xk, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, xk, x, T(R, a, yk, y, b), p), t) = (case a of T(_, T(R, a11, wk, w, a12), zk, z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a11), wk, w, T(B, a12, zk, z, a2)), yk, y, b))) | T(_, a1, zk, z, T(R, a21, wk, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a1), zk, z, T(B, a21, wk, w, t22)), yk, y, b))) | T(_, a1, zk, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, xk, x, T(R, a1, zk, z, a2)), yk, y, b))) | _ => fixupZip (LEFT(R, xk, x, a, LEFT(B, yk, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, xk, x, b), yk, y, p), t) = (case b of T(_, b1, zk, z, T(R, b21, wk, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b1, zk, z, b21), wk, w, T(B, b22, yk, y, t))))) | T(_, T(R, b11, wk, w, b12), zk, z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b11, wk, w, b12), zk, z, T(B, b2, yk, y, t))))) | T(_, b1, zk, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, xk, x, T(B, T(R, b1, zk, z, b2), yk, y, t)))) | _ => fixupZip (RIGHT(R, b, yk, y, RIGHT(B, a, xk, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, T(R, a1, yk, y, a2), zk, z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, xk, x, a1), yk, y, T(B, a2, zk, z, b)))) | fixupZip (RIGHT(color, T(B, a, xk, x, T(R, b1, yk, y, b2)), zk, z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, xk, x, b1), yk, y, T(B, b2, zk, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, a, yk, y, T(R, b1, zk, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, xk, x, a), yk, y, T(B, b1, zk, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, zk, z, a2), xk, x, b), yk, y, p), t) = (false, zip (p, T(color, T(B, a1, zk, z, a2), xk, x, T(B, b, yk, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, xk, x, T(B, a, yk, y, b), p), t) = (false, zip (p, T(B, t, xk, x, T(R, a, yk, y, b)))) | fixupZip (LEFT(B, xk, x, T(B, a, yk, y, b), p), t) = fixupZip (p, T(B, t, xk, x, T(R, a, yk, y, b))) | fixupZip (RIGHT(R, T(B, a, xk, x, b), yk, y, p), t) = (false, zip (p, T(B, T(R, a, xk, x, b), yk, y, t))) | fixupZip (RIGHT(B, T(B, a, xk, x, b), yk, y, p), t) = fixupZip (p, T(B, T(R, a, xk, x, b), yk, y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, yk, y, E, p), t) = fixupZip (p, T(R, t, yk, y, E)) | fixupZip (RIGHT(_, E, yk, y, p), t) = fixupZip (p, T(R, E, yk, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a 4-tuple * (key, elem, bd, tr), where key is the minimum key, elem is the element * named by key, tr is the residual tree with elem removed, and bd is true * if tr has a black-depth that is less than the original tree. *) fun delMin (T(R, E, yk, y, b), p) = (* replace the node by its right subtree (which must be E) *) (yk, y, false, zip(p, b)) | delMin (T(B, E, yk, y, T(R, a', yk', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (yk, y, false, zip (p, T(B, a', yk', y', b'))) | delMin (T(B, E, yk, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (yk, y, blkDeficit, t) end | delMin (T(color, a, yk, y, b), z) = delMin(a, LEFT(color, yk, y, b, z)) | delMin (E, _) = raise Match fun del (E, p) = raise LibBase.NotFound | del (T(color, a, yk, y, b), p) = if (k < yk) then del (a, LEFT(color, yk, y, b, p)) else if (k = yk) then (case (color, a, b) of (R, E, E) => (y, zip(p, E)) | (B, E, E) => (y, #2 (fixupZip (p, E))) | (_, T(_, a', yk', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | (_, E, T(_, a', yk', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | _ => let val (minKey, minElem, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then (y, #2 (fixupZip (RIGHT(color, a, minKey, minElem, p), b))) else (y, zip (p, T(color, a, minKey, minElem, b))) end (* end case *)) else del (b, RIGHT(color, a, yk, y, p)) val (item, t) = del(t, TOP) in case t of T(R, a, xk, x, b) => (MAP(nItems-1, T(B, a, xk, x, b)), item) | t => (MAP(nItems-1, t), item) (* end case *) end end (* local *) (* return the first item in the map (or NONE if it is empty) *) fun first (MAP(_, t)) = let fun f E = NONE | f (T(_, E, _, x, _)) = SOME x | f (T(_, a, _, _, _)) = f a in f t end fun firsti (MAP(_, t)) = let fun f E = NONE | f (T(_, E, xk, x, _)) = SOME(xk, x) | f (T(_, a, _, _, _)) = f a in f t end (* Return the number of items in the map *) fun numItems (MAP(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldli f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(b, f(xk, x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldri f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(a, f(xk, x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun listItems m = foldr (op ::) [] m fun listItemsi m = foldri (fn (xk, x, l) => (xk, x)::l) [] m (* return an ordered list of the keys in the map. *) fun listKeys m = foldri (fn (k, _, l) => k::l) [] m (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* given an ordering on the map's range, return an ordering * on the map. *) fun collate cmpRng = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk = yk) then (case cmpRng(x, y) of EQUAL => cmp (r1, r2) | order => order (* end case *)) else if (xk < yk) then LESS else GREATER (* end case *)) in fn (MAP(_, m1), MAP(_, m2)) => cmp (start m1, start m2) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype 'a digit = ZERO | ONE of (Key.ord_key * 'a * 'a tree * 'a digit) | TWO of (Key.ord_key * 'a * 'a tree * Key.ord_key * 'a * 'a tree * 'a digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (ak, a, l) = let fun incr (ak, a, t, ZERO) = ONE(ak, a, t, ZERO) | incr (ak1, a1, t1, ONE(ak2, a2, t2, r)) = TWO(ak1, a1, t1, ak2, a2, t2, r) | incr (ak1, a1, t1, TWO(ak2, a2, t2, ak3, a3, t3, r)) = ONE(ak1, a1, t1, incr(ak2, a2, T(B, t3, ak3, a3, t2), r)) in incr(ak, a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(ak, a, t2, r)) = link(T(B, t2, ak, a, t1), r) | link (t, TWO(ak1, a1, t1, ak2, a2, t2, r)) = link(T(B, T(R, t2, ak2, a2, t1), ak1, a1, t), r) in link (E, t) end local fun wrap f (MAP(_, m1), MAP(_, m2)) = let val (n, result) = f (start m1, start m2, 0, ZERO) in MAP(n, linkAll result) end fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, xk, x, _), r), n, result) = ins(next r, n+1, addItem(xk, x, result)) in (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) fun unionWith mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then union (r1, t2, n+1, addItem(xk, x, result)) else if (xk = yk) then union (r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) else union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) in wrap union end fun unionWithi mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then union (r1, t2, n+1, addItem(xk, x, result)) else if (xk = yk) then union (r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) else union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) in wrap union end (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) fun intersectWith mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then intersect (r1, t2, n, result) else if (xk = yk) then intersect ( r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) in wrap intersect end fun intersectWithi mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then intersect (r1, t2, n, result) else if (xk = yk) then intersect (r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) in wrap intersect end fun mergeWith mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then mergef(xk, SOME x, NONE, r1, t2, n, result) else if (xk = yk) then mergef(xk, SOME x, SOME y, r1, r2, n, result) else mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end fun mergeWithi mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then mergef(xk, SOME x, NONE, r1, t2, n, result) else if (xk = yk) then mergef(xk, SOME x, SOME y, r1, r2, n, result) else mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(k, x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end end (* local *) fun app f = let fun appf E = () | appf (T(_, a, _, x, b)) = (appf a; f x; appf b) in fn (MAP(_, m)) => appf m end fun appi f = let fun appf E = () | appf (T(_, a, xk, x, b)) = (appf a; f(xk, x); appf b) in fn (MAP(_, m)) => appf m end fun map f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f x, mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end fun mapi f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f(xk, x), mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end fun filteri pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred(xk, x)) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end (* map a partial function over the elements of a map in increasing * map order. *) fun mapPartial f = let fun f' (xk, x, m) = (case f x of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end fun mapPartiali f = let fun f' (xk, x, m) = (case f(xk, x) of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' E = false | exists' (T(_, a, _, x, b)) = exists' a orelse pred x orelse exists' b in fn (MAP(_, m)) => exists' m end fun existsi pred = let fun exists' E = false | exists' (T(_, a, k, x, b)) = exists' a orelse pred(k, x) orelse exists' b in fn (MAP(_, m)) => exists' m end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' E = true | all' (T(_, a, _, x, b)) = all' a andalso pred x andalso all' b in fn (MAP(_, m)) => all' m end fun alli pred = let fun all' E = true | all' (T(_, a, k, x, b)) = all' a andalso pred(k, x) andalso all' b in fn (MAP(_, m)) => all' m end end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/int-redblack-set.sml000066400000000000000000000407031416264345000251400ustar00rootroot00000000000000(* int-redblack-set.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) structure IntRedBlackSet :> ORD_SET where type Key.ord_key = int = struct structure Key = struct type ord_key = int val compare = Int.compare end type item = Key.ord_key datatype color = R | B datatype tree = E | T of (color * tree * item * tree) datatype set = SET of (int * tree) fun isEmpty (SET(_, E)) = true | isEmpty _ = false val empty = SET(0, E) fun minItem (SET(_, tr)) = let fun min E = raise Empty | min (T(_, E, item, _)) = item | min (T(_, tr, _, _)) = min tr in min tr end fun maxItem (SET(_, tr)) = let fun max E = raise Empty | max (T(_, _, item, E)) = item | max (T(_, _, _, tr)) = max tr in max tr end fun singleton x = SET(1, T(B, E, x, E)) fun add (SET(nItems, m), x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, x, E)) | ins (s as T(color, a, y, b)) = if (x < y) then (case a of T(R, c, z, d) => if (x < z) then (case ins c of T(R, e, w, f) => T(R, T(B,e,w,f), z, T(B,d,y,b)) | c => T(B, T(R,c,z,d), y, b) (* end case *)) else if (x = z) then T(color, T(R, c, x, d), y, b) else (case ins d of T(R, e, w, f) => T(R, T(B,c,z,e), w, T(B,f,y,b)) | d => T(B, T(R,c,z,d), y, b) (* end case *)) | _ => T(B, ins a, y, b) (* end case *)) else if (x = y) then T(color, a, x, b) else (case b of T(R, c, z, d) => if (x < z) then (case ins c of T(R, e, w, f) => T(R, T(B,a,y,e), w, T(B,f,z,d)) | c => T(B, a, y, T(R,c,z,d)) (* end case *)) else if (x = z) then T(color, a, y, T(R, c, x, d)) else (case ins d of T(R, e, w, f) => T(R, T(B,a,y,c), z, T(B,e,w,f)) | d => T(B, a, y, T(R,c,z,d)) (* end case *)) | _ => T(B, a, y, ins b) (* end case *)) val T(_, a, y, b) = ins m in SET(!nItems', T(B, a, y, b)) end fun add' (x, m) = add (m, x) fun addList (s, []) = s | addList (s, x::r) = addList(add(s, x), r) (* Remove an item. Raises LibBase.NotFound if not found. *) local datatype zipper = TOP | LEFT of (color * item * tree * zipper) | RIGHT of (color * tree * item * zipper) in fun delete (SET(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, x, b, p), a) = zip(p, T(color, a, x, b)) | zip (RIGHT(color, a, x, p), b) = zip(p, T(color, a, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, x, T(R, a, y, b), p), t) = (case a of T(_, T(R, a11, w, a12), z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a11), w, T(B, a12, z, a2)), y, b))) | T(_, a1, z, T(R, a21, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a1), z, T(B, a21, w, t22)), y, b))) | T(_, a1, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, x, T(R, a1, z, a2)), y, b))) | _ => fixupZip (LEFT(R, x, a, LEFT(B, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, x, b), y, p), t) = (case b of T(_, b1, z, T(R, b21, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b1, z, b21), w, T(B, b22, y, t))))) | T(_, T(R, b11, w, b12), z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b11, w, b12), z, T(B, b2, y, t))))) | T(_, b1, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, x, T(B, T(R, b1, z, b2), y, t)))) | _ => fixupZip (RIGHT(R, b, y, RIGHT(B, a, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, x, T(B, T(R, a1, y, a2), z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, x, a1), y, T(B, a2, z, b)))) | fixupZip (RIGHT(color, T(B, a, x, T(R, b1, y, b2)), z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, x, b1), y, T(B, b2, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, x, T(B, a, y, T(R, b1, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, x, a), y, T(B, b1, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, z, a2), x, b), y, p), t) = (false, zip (p, T(color, T(B, a1, z, a2), x, T(B, b, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, x, T(B, a, y, b), p), t) = (false, zip (p, T(B, t, x, T(R, a, y, b)))) | fixupZip (LEFT(B, x, T(B, a, y, b), p), t) = fixupZip (p, T(B, t, x, T(R, a, y, b))) | fixupZip (RIGHT(R, T(B, a, x, b), y, p), t) = (false, zip (p, T(B, T(R, a, x, b), y, t))) | fixupZip (RIGHT(B, T(B, a, x, b), y, p), t) = fixupZip (p, T(B, T(R, a, x, b), y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, y, E, p), t) = fixupZip (p, T(R, t, y, E)) | fixupZip (RIGHT(_, E, y, p), t) = fixupZip (p, T(R, E, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a triple * (elem, bd, tr), where elem is the minimum element, tr is the residual * tree with elem removed, and bd is true if tr has a black-depth that is * less than the original tree. *) fun delMin (T(R, E, y, b), p) = (* replace the node by its right subtree (which must be E) *) (y, false, zip(p, b)) | delMin (T(B, E, y, T(R, a', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (y, false, zip (p, T(B, a', y', b'))) | delMin (T(B, E, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (y, blkDeficit, t) end | delMin (T(color, a, y, b), z) = delMin(a, LEFT(color, y, b, z)) | delMin (E, _) = raise Match fun del (E, z) = raise LibBase.NotFound | del (T(color, a, y, b), p) = if (k < y) then del (a, LEFT(color, y, b, p)) else if (k = y) then (case (color, a, b) of (R, E, E) => zip(p, E) | (B, E, E) => #2 (fixupZip (p, E)) | (_, T(_, a', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) zip(p, T(B, a', y', b')) | (_, E, T(_, a', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) zip(p, T(B, a', y', b')) | _ => let val (minSucc, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then #2 (fixupZip (RIGHT(color, a, minSucc, p), b)) else zip (p, T(color, a, minSucc, b)) end (* end case *)) else del (b, RIGHT(color, a, y, p)) in case del(t, TOP) of T(R, a, x, b) => SET(nItems-1, T(B, a, x, b)) | t => SET(nItems-1, t) (* end case *) end end (* local *) (* Return true if and only if item is an element in the set *) fun member (SET(_, t), k) = let fun find' E = false | find' (T(_, a, y, b)) = (k = y) orelse ((k < y) andalso find' a) orelse find' b in find' t end (* Return the number of items in the map *) fun numItems (SET(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end (* return an ordered list of the items in the set. *) fun toList s = foldr (fn (x, l) => x::l) [] s (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* Return true if and only if the two sets are equal *) fun equal (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => false | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => (x = y) andalso cmp (r1, r2) (* end case *)) in cmp (start s1, start s2) end (* Return the lexical order of two sets *) fun compare (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x = y) then cmp (r1, r2) else if (x < y) then LESS else GREATER (* end case *)) in cmp (start s1, start s2) end (* Return true if and only if the first set is a subset of the second *) fun isSubset (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => true | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ((x = y) andalso cmp (r1, r2)) orelse ((x > y) andalso cmp (t1, r2)) (* end case *)) in cmp (start s1, start s2) end (* Return true if the two sets are disjoint *) fun disjoint (SET(0, _), _) = true | disjoint (_, SET(0, _)) = true | disjoint (SET(_, s1), SET(_, s2)) = let fun walk ((E, _), _) = true | walk (_, (E, _)) = true | walk (t1 as (T(_, _, x, _), r1), t2 as (T(_, _, y, _), r2)) = ((x < y) andalso walk (next r1, t2)) orelse ((x > y) andalso walk (t1, next r2)) in walk (next (start s1), next (start s2)) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype digit = ZERO | ONE of (item * tree * digit) | TWO of (item * tree * item * tree * digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (a, l) = let fun incr (a, t, ZERO) = ONE(a, t, ZERO) | incr (a1, t1, ONE(a2, t2, r)) = TWO(a1, t1, a2, t2, r) | incr (a1, t1, TWO(a2, t2, a3, t3, r)) = ONE(a1, t1, incr(a2, T(B, t3, a3, t2), r)) in incr(a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(a, t2, r)) = link(T(B, t2, a, t1), r) | link (t, TWO(a1, t1, a2, t2, r)) = link(T(B, T(R, t2, a2, t1), a1, t), r) in link (E, t) end (* create a set from a list of items; this function works in linear time if the list * is in increasing order. *) fun fromList [] = empty | fromList (first::rest) = let fun add (prev, x::xs, n, accum) = if (prev < x) then add(x, xs, n+1, addItem(x, accum)) else (* list not in order, so fall back to addList code *) addList(SET(n, linkAll accum), x::xs) | add (_, [], n, accum) = SET(n, linkAll accum) in add (first, rest, 1, addItem(first, ZERO)) end (* return the union of the two sets *) fun union (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun union' (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then union' (r1, t2, n+1, addItem(x, result)) else if (x = y) then union' (r1, r2, n+1, addItem(x, result)) else union' (t1, r2, n+1, addItem(y, result)) (* end case *)) val (n, result) = union' (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the intersection of the two sets *) fun intersection (SET(_, s1), SET(_, s2)) = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then intersect (r1, t2, n, result) else if (x = y) then intersect (r1, r2, n+1, addItem(x, result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) val (n, result) = intersect (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the set difference *) fun difference (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun diff (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), _) => (n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then diff (r1, t2, n+1, addItem(x, result)) else if (x = y) then diff (r1, r2, n, result) else diff (t1, r2, n, result) (* end case *)) val (n, result) = diff (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) (SET(0, E)) items in difference (l, items') end fun app f = let fun appf E = () | appf (T(_, a, x, b)) = (appf a; f x; appf b) in fn (SET(_, m)) => appf m end fun map f = let fun addf (x, m) = add(m, f x) in foldl addf empty end fun mapPartial f = let fun f' (x, acc) = (case f x of SOME x' => add(acc, x') | NONE => acc) in foldl f' empty end (* Filter out those elements of the set that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (SET(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in SET(n, linkAll result) end fun partition pred (SET(_, t)) = let fun walk (E, n1, result1, n2, result2) = (n1, result1, n2, result2) | walk (T(_, a, x, b), n1, result1, n2, result2) = let val (n1, result1, n2, result2) = walk(a, n1, result1, n2, result2) in if (pred x) then walk(b, n1+1, addItem(x, result1), n2, result2) else walk(b, n1, result1, n2+1, addItem(x, result2)) end val (n1, result1, n2, result2) = walk (t, 0, ZERO, 0, ZERO) in (SET(n1, linkAll result1), SET(n2, linkAll result2)) end fun exists pred = let fun test E = false | test (T(_, a, x, b)) = test a orelse pred x orelse test b in fn (SET(_, t)) => test t end fun all pred = let fun test E = true | test (T(_, a, x, b)) = test a andalso pred x andalso test b in fn (SET(_, t)) => test t end fun find pred = let fun test E = NONE | test (T(_, a, x, b)) = (case test a of NONE => if pred x then SOME x else test b | someItem => someItem (* end case *)) in fn (SET(_, t)) => test t end (* deprecated *) val listItems = toList end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/interval-domain-sig.sml000066400000000000000000000013631416264345000256600ustar00rootroot00000000000000(* interval-domain-sig.sml * * COPYRIGHT (c) 2005 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * The domain over which we define interval sets. *) signature INTERVAL_DOMAIN = sig (* the abstract type of elements in the domain *) type point (* compare the order of two points *) val compare : (point * point) -> order (* successor and predecessor functions on the domain *) val succ : point -> point val pred : point -> point (* isSucc(a, b) ==> (succ a) = b and a = (pred b). *) val isSucc : (point * point) -> bool (* the minimum and maximum bounds of the domain; we require that * pred minPt = minPt and succ maxPt = maxPt. *) val minPt : point val maxPt : point end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/interval-set-fn.sml000066400000000000000000000231641416264345000250300ustar00rootroot00000000000000(* interfun-set-fn.sml * * COPYRIGHT (c) 2005 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * An implementation of sets over a discrete ordered domain, where the * sets are represented by intervals. It is meant for representing * dense sets (e.g., unicode character classes). *) functor IntervalSetFn (D : INTERVAL_DOMAIN) : INTERVAL_SET = struct structure D = D type item = D.point type interval = (D.point * D.point) fun min (a, b) = (case D.compare(a, b) of LESS => a | _ => b (* end case *)) (* the set is represented by an ordered list of disjoint, non-adjacent intervals *) datatype set = SET of interval list val empty = SET[] val universe = SET[(D.minPt, D.maxPt)] fun isEmpty (SET []) = true | isEmpty _ = false fun isUniverse (SET[(a, b)]) = (D.compare(a, D.minPt) = EQUAL) andalso (D.compare(b, D.maxPt) = EQUAL) | isUniverse _ = false fun singleton x = SET[(x, x)] fun interval (a, b) = (case D.compare(a, b) of GREATER => raise Domain | _ => SET[(a, b)] (* end case *)) fun addInt (SET l, (a, b)) = let fun ins (a, b, []) = [(a, b)] | ins (a, b, (x, y)::r) = (case D.compare(b, x) of LESS => if (D.isSucc(b, x)) then (a, y)::r else (a, b)::(x, y)::r | EQUAL => (a, y)::r | GREATER => (case D.compare(a, y) of GREATER => if (D.isSucc(y, a)) then (x, b) :: r else (x, y) :: ins(a, b, r) | EQUAL => ins(x, b, r) | LESS => (case D.compare(b, y) of GREATER => ins (min(a, x), b, r) | _ => ins (min(a, x), y, r) (* end case *)) (* end case *)) (* end case *)) in case D.compare(a, b) of GREATER => raise Domain | _ => SET(ins (a, b, l)) (* end case *) end fun addInt' (x, m) = addInt (m, x) fun add (SET l, a) = let fun ins (a, []) = [(a, a)] | ins (a, (x, y)::r) = (case D.compare(a, x) of LESS => if (D.isSucc(a, x)) then (a, y)::r else (a, a)::(x, y)::r | EQUAL => (a, y)::r | GREATER => (case D.compare(a, y) of GREATER => if (D.isSucc(y, a)) then (x, a) :: r else (x, y) :: ins(a, r) | _ => (x, y)::r (* end case *)) (* end case *)) in SET(ins (a, l)) end fun add' (x, m) = add (m, x) fun fromList items = List.foldl add' empty items (* is a point in any of the intervals in the set *) fun member (SET l, pt) = let fun look [] = false | look ((a, b) :: r) = (case D.compare(a, pt) of LESS => (case D.compare(pt, b) of GREATER => look r | _ => true (* end case *)) | EQUAL => true | GREATER => false (* end case *)) in look l end fun complement (SET[]) = universe | complement (SET((a, b)::r)) = let fun comp (start, (a, b)::r, l) = comp(D.succ b, r, (start, D.pred a)::l) | comp (start, [], l) = (case D.compare(start, D.maxPt) of LESS => SET(List.rev((start, D.maxPt)::l)) | _ => SET(List.rev l) (* end case *)) in case D.compare(D.minPt, a) of LESS => comp(D.succ b, r, [(D.minPt, D.pred a)]) | _ => comp(D.succ b, r, []) (* end case *) end fun union (SET l1, SET l2) = let fun join ([], l2) = l2 | join (l1, []) = l1 | join ((a1, b1)::r1, (a2, b2)::r2) = (case D.compare(a1, a2) of LESS => (case D.compare(b1, b2) of LESS => if D.isSucc(b1, a2) then join(r1, (a1, b2)::r2) else (a1, b1) :: join(r1, (a2, b2)::r2) | EQUAL => (a1, b1) :: join(r1, r2) | GREATER => join ((a1, b1)::r1, r2) (* end case *)) | EQUAL => (case D.compare(b1, b2) of LESS => join(r1, (a2, b2)::r2) | EQUAL => (a1, b1) :: join(r1, r2) | GREATER => join ((a1, b1)::r1, r2) (* end case *)) | GREATER => (case D.compare(a1, b2) of LESS => (case D.compare(b1, b2) of LESS => join (r1, (a2, b2)::r2) | EQUAL => (a2, b2) :: join(r1, r2) | GREATER => join ((a2, b1)::r1, r2) (* end case *)) | EQUAL => (* a2 < a1 = b2 <= b1 *) join ((a2, b1)::r1, r2) | GREATER => if D.isSucc(b2, a1) then join ((a2, b1)::r1, r2) else (a2, b2) :: join ((a1, b1)::r1, r2) (* end case *)) (* end case *)) in SET(join(l1, l2)) end fun intersect (SET l1, SET l2) = let (* cons a possibly empty interval onto the front of l *) fun cons (a, b, l) = (case D.compare(a, b) of GREATER => l | _ => (a, b) :: l (* end case *)) fun meet ([], _) = [] | meet (_, []) = [] | meet ((a1, b1)::r1, (a2, b2)::r2) = (case D.compare(a1, a2) of LESS => (case D.compare(b1, a2) of LESS => (* a1 <= b1 < a2 <= b2 *) meet (r1, (a2, b2)::r2) | EQUAL => (* a1 <= b1 = a2 <= b2 *) (b1, b1) :: meet (r1, cons(D.succ b1, b2, r2)) | GREATER => (case D.compare (b1, b2) of LESS => (* a1 < a2 < b1 < b2 *) (a2, b1) :: meet (r1, cons(D.succ b1, b2, r2)) | EQUAL => (* a1 < a2 < b1 = b2 *) (a2, b1) :: meet (r1, r2) | GREATER => (* a1 < a2 < b1 & b2 < b1 *) (a2, b2) :: meet (cons(D.succ b2, b1, r1), r2) (* end case *)) (* end case *)) | EQUAL => (case D.compare(b1, b2) of LESS => (a1, b1) :: meet (r1, cons(D.succ b1, b2, r2)) | EQUAL => (a1, b1) :: meet (r1, r2) | GREATER => (a1, b2) :: meet ((D.succ b2, b1)::r1, r2) (* end case *)) | GREATER => (case D.compare(b2, a1) of LESS => (* a2 <= b2 < a1 <= b1 *) meet ((a1, b1)::r1, r2) | EQUAL => (* a2 < b2 = a1 <= b1 *) (b2, b2) :: meet (cons(D.succ b2, b1, r1), r2) | GREATER => (case D.compare(b1, b2) of LESS => (* a2 < a1 <= b1 < b2 *) (a1, b1) :: meet (r1, cons(D.succ b1, b2, r2)) | EQUAL => (* a2 < a1 <= b1 = b2 *) (a1, b1) :: meet (r1, r2) | GREATER => (* a2 < a1 < b2 < b1 *) (a1, b2) :: meet (cons(D.succ b2, b1, r1), r2) (* end case *)) (* end case *)) (* end case *)) in SET(meet(l1, l2)) end (* FIXME: replace the following with a direct implementation *) fun difference (s1, s2) = intersect(s1, complement s2) (***** iterators on elements *****) local fun next [] = NONE | next ((a, b)::r) = if D.compare(a, b) = EQUAL then SOME(a, r) else SOME(a, (D.succ a, b)::r) in fun toList (SET l) = let fun list (l, items) = (case next l of NONE => List.rev items | SOME(x, r) => list(r, x::items) (* end case *)) in list (l, []) end fun app f (SET l) = let fun appf l = (case next l of NONE => () | SOME(x, r) => (f x; appf r) (* end case *)) in appf l end fun foldl f = let fun foldf (l, acc) = (case next l of NONE => acc | SOME(x, r) => foldf(r, f(x, acc)) (* end case *)) in fn init => fn (SET l) => foldf(l, init) end fun foldr f init (SET l) = let fun foldf l = (case next l of NONE => init | SOME(x, r) => f (x, foldf r) (* end case *)) in foldf l end fun filter pred (SET l) = let (* given an interval [a, b], filter its elements and add the subintervals that pass * the predicate to the list l. *) fun filterInt ((a, b), l) = let fun lp (start, item, last, l) = let val next = D.succ item in if pred next then if (D.compare(next, last) = EQUAL) then (start, next)::l else lp(start, next, last, l) else scan(D.succ next, last, (start, item)::l) end and scan (next, last, l) = if pred next then lp (next, next, last, l) else if (D.compare(next, last) = EQUAL) then l else scan(D.succ next, last, l) in scan (a, b, l) end (* filter the intervals *) fun filter' ([], l) = SET(List.rev l) | filter' (i::r, l) = filter' (r, filterInt (i, l)) in filter' (l, []) end fun all pred (SET l) = let fun all' l = (case next l of NONE => true | SOME(x, r) => (pred x andalso all' r) (* end case *)) in all' l end fun exists pred (SET l) = let fun exists' l = (case next l of NONE => false | SOME(x, r) => (pred x orelse exists' r) (* end case *)) in exists' l end end (* local *) (***** Iterators on interfuns *****) fun intervals (SET l) = l fun appInt f (SET l) = List.app f l fun foldlInt f init (SET l) = List.foldl f init l fun foldrInt f init (SET l) = List.foldl f init l fun filterInt pred (SET l) = let fun f' ([], l) = SET(List.rev l) | f' (i::r, l) = if pred i then f'(r, i::l) else f'(r, l) in f' (l, []) end fun existsInt pred (SET l) = List.exists pred l fun allInt pred (SET l) = List.all pred l fun compare (SET l1, SET l2) = let fun comp ([], []) = EQUAL | comp ((a1, b1)::r1, (a2, b2)::r2) = (case D.compare(a1, a2) of EQUAL => (case D.compare(b1, b2) of EQUAL => comp (r1, r2) | someOrder => someOrder (* end case *)) | someOrder => someOrder (* end case *)) | comp ([], _) = LESS | comp (_, []) = GREATER in comp(l1, l2) end fun isSubset (SET l1, SET l2) = let (* is the interval [a, b] covered by [x, y]? *) fun isCovered (a, b, x, y) = (case D.compare(a, x) of LESS => false | _ => (case D.compare(y, b) of LESS => false | _ => true (* end case *)) (* end case *)) fun test ([], _) = true | test (_, []) = false | test ((a1, b1)::r1, (a2, b2)::r2) = if isCovered (a1, b1, a2, b2) then test (r1, (a2, b2)::r2) else (case D.compare(b2, a1) of LESS => test ((a1, b1)::r1, r2) | _ => false (* end case *)) in test (l1, l2) end (* DEPRECATED FUNCTIONS *) val listItems = toList end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/interval-set-sig.sml000066400000000000000000000043571416264345000252120ustar00rootroot00000000000000(* interval-set-sig.sml * * COPYRIGHT (c) 2005 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * This signature is the interface to sets over a discrete ordered domain, where the * sets are represented by intervals. It is meant for representing dense sets (e.g., * unicode character classes). *) signature INTERVAL_SET = sig structure D : INTERVAL_DOMAIN type item = D.point type interval = (item * item) type set (* the empty set and the set of all elements *) val empty : set val universe : set (* a set of a single element *) val singleton : item -> set val fromList : item list -> set (* set that covers the given interval *) val interval : item * item -> set val isEmpty : set -> bool val isUniverse : set -> bool val member : set * item -> bool (* return the list of items in the set *) val toList : set -> item list (* return a list of intervals that represents the set *) val intervals : set -> interval list (* add a single element to the set *) val add : set * item -> set val add' : item * set -> set (* add an interval to the set *) val addInt : set * interval -> set val addInt' : interval * set -> set (* set operations *) val complement : set -> set val union : (set * set) -> set val intersect : (set * set) -> set val difference : (set * set) -> set (* iterators on elements *) val app : (item -> unit) -> set -> unit val foldl : (item * 'a -> 'a) -> 'a -> set -> 'a val foldr : (item * 'a -> 'a) -> 'a -> set -> 'a val filter : (item -> bool) -> set -> set val all : (item -> bool) -> set -> bool val exists : (item -> bool) -> set -> bool (* iterators on intervals *) val appInt : (interval -> unit) -> set -> unit val foldlInt : (interval * 'a -> 'a) -> 'a -> set -> 'a val foldrInt : (interval * 'a -> 'a) -> 'a -> set -> 'a val filterInt : (interval -> bool) -> set -> set val allInt : (interval -> bool) -> set -> bool val existsInt : (interval -> bool) -> set -> bool (* ordering on sets *) val compare : set * set -> order val isSubset : set * set -> bool (* DEPRECATED FUNCTIONS *) val listItems : set -> item list end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/io-util-sig.sml000066400000000000000000000007461416264345000241550ustar00rootroot00000000000000(* io-util-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Support for redirecting stdIn/stdOut. *) signature IO_UTIL = sig (* rebind stdIn *) val withInputFile : string * ('a -> 'b) -> 'a -> 'b val withInstream : TextIO.instream * ('a -> 'b) -> 'a -> 'b (* rebind stdOut *) val withOutputFile : string * ('a -> 'b) -> 'a -> 'b val withOutstream : TextIO.outstream * ('a -> 'b) -> 'a -> 'b end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/io-util.sml000066400000000000000000000031231416264345000233650ustar00rootroot00000000000000(* io-util.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * *) structure IOUtil : IO_UTIL = struct type instream = TextIO.instream type outstream = TextIO.outstream fun swapInstrm (s, s') = TextIO.getInstream s before TextIO.setInstream(s, s') fun withInputFile (s, f) x = let val oldStrm = swapInstrm(TextIO.stdIn, TextIO.getInstream(TextIO.openIn s)) fun cleanUp () = TextIO.StreamIO.closeIn(swapInstrm(TextIO.stdIn, oldStrm)) val res = (f x) handle ex => (cleanUp(); raise ex) in cleanUp(); res end fun withInstream (strm, f) x = let val oldStrm = swapInstrm(TextIO.stdIn, TextIO.getInstream strm) fun cleanUp () = TextIO.setInstream(strm, swapInstrm(TextIO.stdIn, oldStrm)) val res = (f x) handle ex => (cleanUp(); raise ex) in cleanUp(); res end fun swapOutstrm (s, s') = TextIO.getOutstream s before TextIO.setOutstream(s, s') fun withOutputFile (s, f) x = let val oldStrm = swapOutstrm(TextIO.stdOut, TextIO.getOutstream(TextIO.openOut s)) fun cleanUp () = TextIO.StreamIO.closeOut(swapOutstrm(TextIO.stdOut, oldStrm)) val res = (f x) handle ex => (cleanUp(); raise ex) in cleanUp(); res end fun withOutstream (strm, f) x = let val oldStrm = swapOutstrm(TextIO.stdOut, TextIO.getOutstream strm) fun cleanUp () = TextIO.setOutstream(strm, swapOutstrm(TextIO.stdOut, oldStrm)) val res = (f x) handle ex => (cleanUp(); raise ex) in cleanUp(); res end end (* IOUtil *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/iterate-sig.sml000066400000000000000000000016351416264345000242260ustar00rootroot00000000000000(* iterate-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * *) signature ITERATE = sig val iterate : ('a -> 'a) -> int -> 'a -> 'a (* iterate f cnt init = f(f(...f(f(init))...)) (cnt times) * iterate f 0 init = init * raises BadArg if cnt < 0 *) val repeat : (int * 'a -> 'a) -> int -> 'a -> 'a (* repeat f cnt init * = #2(iterate (fn (i,v) => (i+1,f(i,v))) cnt (0,init)) *) val for : (int * 'a -> 'a) -> (int * int * int) -> 'a -> 'a (* for f (start,stop,inc) init * "for loop" * implements f(...f(start+2*inc,f(start+inc,f(start,init)))...) * until the first argument of f > stop if inc > 0 * or the first argument of f < stop if inc < 0 * raises BadArg if inc <= 0 and start < stop or if inc >=0 and * start > stop. *) end (* ITERATE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/iterate.sml000066400000000000000000000023711416264345000234440ustar00rootroot00000000000000(* iterate.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * *) structure Iterate : ITERATE = struct fun badArg (f,msg) = LibBase.failure {module="Iterate",func=f,msg=msg} fun iterate f cnt init = let fun iter (0,v) = v | iter (n,v) = iter(n-1,f v) in if cnt < 0 then badArg ("iterate","count < 0") else iter (cnt,init) end fun repeat f cnt init = let fun iter (n,v) = if n = cnt then v else iter(n+1,f(n,v)) in if cnt < 0 then badArg ("repeat","count < 0") else iter (0,init) end fun for f (start,stop,inc) = let fun up (n,v) = if n > stop then v else up(n+inc,f(n,v)) fun down (n,v) = if n < stop then v else down(n+inc,f(n,v)) in if start < stop then if inc <= 0 then badArg ("for","inc <= 0 with start < stop") else fn v => up(start,v) else if stop < start then if inc >= 0 then badArg ("for","inc >= 0 with start > stop") else fn v => down(start,v) else fn v => f(start,v) end end (* Iterate *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/keyword-fn.sml000066400000000000000000000023131416264345000240700ustar00rootroot00000000000000(* keyword-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This functor is meant to be used as part of a scanner, where identifiers * and keywords are scanned using the same lexical rules and are then * further analyzed. *) functor KeywordFn (KW : sig type token type pos val ident : (Atom.atom * pos * pos) -> token val keywords : (string * ((pos * pos) -> token)) list end) : sig type token type pos val keyword : (string * pos * pos) -> token end = struct structure A = Atom structure Tbl = AtomTable type token = KW.token type pos = KW.pos (* the keyword hash table *) exception Keyword val kwTbl : ((pos * pos) -> token) Tbl.hash_table = Tbl.mkTable(List.length KW.keywords, Keyword) (* insert the reserved words into the keyword hash table *) val _ = let val insert = Tbl.insert kwTbl fun ins (s, item) = insert (A.atom s, item) in app ins KW.keywords end fun keyword (s, p1, p2) = let val name = A.atom s in case (Tbl.find kwTbl name) of (SOME tokFn) => tokFn(p1, p2) | NONE => KW.ident(name, p1, p2) (* end case *) end end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/left-priorityq-fn.sml000066400000000000000000000052341416264345000254030ustar00rootroot00000000000000(* left-priorityq-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * An implementation of priority queues based on leaftist heaps (see * Purely Functional Data Structures by Chris Okasaki). *) functor LeftPriorityQFn (P : PRIORITY) : MONO_PRIORITYQ = struct type item = P.item datatype queue = Q of (int * heap) and heap = EMPTY | ND of (int * item * heap * heap) val empty = Q(0, EMPTY) fun singletonHeap x = ND(1, x, EMPTY, EMPTY) fun singleton x = Q(1, singletonHeap x) fun rank EMPTY = 0 | rank (ND(r, _, _, _)) = r fun mkNode (x, a, b) = if (rank a >= rank b) then ND(rank b + 1, x, a, b) else ND(rank a + 1, x, b, a) fun mergeHeap (h, EMPTY) = h | mergeHeap (EMPTY, h) = h | mergeHeap (h1 as ND(_, x, h11, h12), h2 as ND(_, y, h21, h22)) = ( case P.compare(P.priority x, P.priority y) of GREATER => mkNode(x, h11, mergeHeap(h12, h2)) | _ => mkNode(y, h21, mergeHeap(h1, h22)) (* end case *)) fun insertHeap (h, x) = mergeHeap(singletonHeap x, h) fun insert (x, Q(n, h)) = Q(n+1, insertHeap (h, x)) fun next (Q(_, EMPTY)) = NONE | next (Q(n, ND(_, x, h1, h2))) = SOME(x, Q(n-1, mergeHeap(h1, h2))) fun remove (Q(_, EMPTY)) = raise List.Empty | remove (Q(n, ND(_, x, h1, h2))) = (x, Q(n-1, mergeHeap(h1, h2))) (* this is a somewhat brute force implementation that probably could be improved *) fun findAndRemove (Q(n, heap), pred) = let fun find (EMPTY, rejects) = NONE | find (ND(_, x, h1, h2), rejects) = if pred x then SOME(x, Q(n-1, mergeHeap(rejects, mergeHeap(h1, h2)))) else find (mergeHeap(h1, h2), insertHeap (rejects, x)) in find (heap, EMPTY) end fun delete (Q(n, heap), pred) = let fun filter (EMPTY, (n, residual)) = (n, residual) | filter (ND(_, x, h1, h2), (n, residual)) = if pred x then filter (h2, filter (h1, (n-1, residual))) else filter (h2, filter (h1, (n, insertHeap (residual, x)))) in Q (filter (heap, (n, EMPTY))) end fun merge (Q(n1, h1), Q(n2, h2)) = Q(n1+n2, mergeHeap(h1, h2)) fun numItems (Q(n, _)) = n fun isEmpty (Q(_, EMPTY)) = true | isEmpty _ = false fun fromList [] = empty | fromList [x] = Q(1, singletonHeap x) | fromList l = let fun init ([], n, items) = (n, items) | init (x::r, n, items) = init (r, n+1, singletonHeap x :: items) fun merge ([], [h]) = h | merge ([], hl) = merge (hl, []) | merge ([h], hl) = merge (h::hl, []) | merge (h1::h2::r, l) = merge (r, mergeHeap(h1, h2) :: l) val (len, hs) = init (l, 0, []) in Q(len, merge (hs, [])) end end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/lib-base-sig.sml000066400000000000000000000010221416264345000242350ustar00rootroot00000000000000(* lib-base-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) signature LIB_BASE = sig exception Unimplemented of string (* raised to report unimplemented features *) exception Impossible of string (* raised to report internal errors *) exception NotFound (* raised by searching operations *) val failure : {module : string, func : string, msg : string} -> 'a (* raise the exception Fail with a standard format message. *) end (* LIB_BASE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/lib-base.sml000066400000000000000000000010641416264345000234630ustar00rootroot00000000000000(* lib-base.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure LibBase : LIB_BASE = struct (* raised to report unimplemented features *) exception Unimplemented of string (* raised to report internal errors *) exception Impossible of string (* raised by searching operations *) exception NotFound (* raise the exception Fail with a standard format message. *) fun failure {module, func, msg} = raise (Fail(concat[module, ".", func, ": ", msg])) end (* LibBase *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-format-sig.sml000066400000000000000000000023101416264345000250210ustar00rootroot00000000000000(* list-format-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) signature LIST_FORMAT = sig val fmt : { init : string, sep : string, final : string, fmt : 'a -> string } -> 'a list -> string (* given an initial string (init), a separator (sep), a terminating * string (final), and an item formating function (fmt), return a list * formatting function. The list ``[a, b, ..., c]'' gets formated as * ``init ^ (fmt a) ^ sep ^ (fmt b) ^ sep ^ ... ^ sep ^ (fmt c) ^ final.'' *) val listToString : ('a -> string) -> 'a list -> string (* formats a list in SML style (i.e., init="[", sep=",", final="]"). *) val scan : { init : string, sep : string, final : string, scan : (char, 'b) StringCvt.reader -> ('a, 'b) StringCvt.reader } -> (char, 'b) StringCvt.reader -> ('a list, 'b) StringCvt.reader (* given an expected initial string, a separator, a terminating * string, and an item scanning function, return a function that * scans a string for a list of items. Whitespace is ignored. * If the input string has the incorrect syntax, then NONE is returned. *) end; (* LIST_FORMAT *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-format.sml000066400000000000000000000050041416264345000242440ustar00rootroot00000000000000(* list-format.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure ListFormat : LIST_FORMAT = struct (* given an initial string (init), a separator (sep), a terminating * string (final), and an item formating function (fmt), return a list * formatting function. The list ``[a, b, ..., c]'' gets formated as * ``init ^ (fmt a) ^ sep ^ (fmt b) ^ sep ^ ... ^ sep ^ (fmt c) ^ final.'' *) fun fmt {init, sep, final, fmt} = let fun format [] = init ^ final | format [x] = concat[init, fmt x, final] | format (x::r) = let fun f ([], l) = concat(rev(final::l)) | f (x::r, l) = f (r, (fmt x) :: sep :: l) in f (r, [fmt x, init]) end in format end (* formatList *) fun listToString f = fmt {init="[", sep=",", final="]", fmt=f} (* given an expected initial string, a separator, a terminating * string, and an item scanning function, return a function that * scans a string for a list of items. Whitespace is ignored. * If the input string has the incorrect syntax, then the exception * ScanList is raised with the position of the first error. *) fun scan {init, sep, final, scan} getc strm = let val skipWS = StringCvt.skipWS getc val scanItem = scan getc fun eat "" = (fn strm => (true, skipWS strm)) | eat s = let val n = size s fun isPrefix (i, strm) = if (i = n) then SOME strm else (case getc strm of (SOME(c, strm)) => if (String.sub(s, i) = c) then isPrefix(i+1, strm) else NONE | NONE => NONE (* end case *)) fun eat' strm = ( case isPrefix (0, skipWS strm) of (SOME strm) => (true, strm) | NONE => (false, strm) (* end case *)) in eat' end val isInit = eat init val isSep = eat sep val isFinal = eat final fun scan (strm, l) = (case (isFinal strm) of (true, strm) => SOME(rev l, strm) | (false, strm) => (case isSep strm of (true, strm) => (case scanItem (skipWS strm) of (SOME(x, strm)) => scan (strm, x::l) | NONE => NONE (* end case *)) | _ => NONE (* end case *)) (* end case *)) in case (isInit strm) of (true, strm) => (case (isFinal strm) of (true, strm) => SOME([], strm) | (false, strm) => (case scanItem (skipWS strm) of (SOME(x, strm)) => scan (strm, [x]) | NONE => NONE (* end case *)) (* end case *)) | (false, i) => NONE (* end case *) end (* scan *) end; (* ListFormat *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-map-fn.sml000066400000000000000000000215571416264345000241450ustar00rootroot00000000000000(* list-map-fn.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * An implementation of finite maps on ordered keys, which uses a sorted list * representation. *) functor ListMapFn (K : ORD_KEY) :> ORD_MAP where type Key.ord_key = K.ord_key = struct structure Key = K type 'a map = (K.ord_key * 'a) list val empty = [] fun isEmpty [] = true | isEmpty _ = false (* return the first item in the map (or NONE if it is empty) *) fun first [] = NONE | first ((_, value)::_) = SOME value (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti [] = NONE | firsti ((key, value)::_) = SOME(key, value) fun singleton (key, item) = [(key, item)] fun insert (l, key, item) = let fun f [] = [(key, item)] | f ((elem as (key', _))::r) = (case Key.compare(key, key') of LESS => (key, item) :: elem :: r | EQUAL => (key, item) :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun insert' ((k, x), m) = insert(m, k, x) fun insertWithi comb (l, key, item) = let fun f [] = [(key, item)] | f ((elem as (key', item'))::r) = (case Key.compare(key, key') of LESS => (key, item) :: elem :: r | EQUAL => (key, comb(key, item', item)) :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) (* return true if the key is in the map's domain *) fun inDomain (l, key) = let fun f [] = false | f ((key', x) :: r) = (case Key.compare(key, key') of LESS => false | EQUAL => true | GREATER => f r (* end case *)) in f l end (* Look for an item, return NONE if the item doesn't exist *) fun find (l, key) = let fun f [] = NONE | f ((key', x) :: r) = (case Key.compare(key, key') of LESS => NONE | EQUAL => SOME x | GREATER => f r (* end case *)) in f l end (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (l, key) = let fun f [] = raise LibBase.NotFound | f ((key', x) :: r) = (case Key.compare(key, key') of LESS => raise LibBase.NotFound | EQUAL => x | GREATER => f r (* end case *)) in f l end (* Remove an item, returning new map and value removed. * Raise LibBase.NotFound if not found. *) fun remove (l, key) = let fun f (_, []) = raise LibBase.NotFound | f (prefix, (elem as (key', x)) :: r) = (case Key.compare(key, key') of LESS => raise LibBase.NotFound | EQUAL => (List.revAppend(prefix, r), x) | GREATER => f(elem :: prefix, r) (* end case *)) in f ([], l) end (* Return the number of items in the map *) fun numItems l = List.length l (* Return a list of the items (and their keys) in the map *) fun listItems (l : 'a map) = List.map #2 l fun listItemsi l = l fun listKeys (l : 'a map) = List.map #1 l fun collate cmpRng = let fun cmp ([], []) = EQUAL | cmp ([], _) = LESS | cmp (_, []) = GREATER | cmp ((x1, y1)::r1, (x2, y2)::r2) = (case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) in cmp end (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) fun unionWith f (m1 : 'a map, m2 : 'a map) = let fun merge ([], [], l) = List.rev l | merge ([], m2, l) = List.revAppend(l, m2) | merge (m1, [], l) = List.revAppend(l, m1) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, (k1, x1)::l) | EQUAL => merge (r1, r2, (k1, f(x1, x2)) :: l) | GREATER => merge (m1, r2, (k2, x2)::l) (* end case *)) in merge (m1, m2, []) end fun unionWithi f (m1 : 'a map, m2 : 'a map) = let fun merge ([], [], l) = List.rev l | merge ([], m2, l) = List.revAppend(l, m2) | merge (m1, [], l) = List.revAppend(l, m1) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, (k1, x1)::l) | EQUAL => merge (r1, r2, (k1, f(k1, x1, x2)) :: l) | GREATER => merge (m1, r2, (k2, x2)::l) (* end case *)) in merge (m1, m2, []) end (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) fun intersectWith f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, l) | EQUAL => merge (r1, r2, (k1, f(x1, x2)) :: l) | GREATER => merge (m1, r2, l) (* end case *)) | merge (_, _, l) = List.rev l in merge (m1, m2, []) end fun intersectWithi f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => merge (r1, m2, l) | EQUAL => merge (r1, r2, (k1, f(k1, x1, x2)) :: l) | GREATER => merge (m1, r2, l) (* end case *)) | merge (_, _, l) = List.rev l in merge (m1, m2, []) end fun mergeWith f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, l) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, l) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, l) (* end case *)) | merge ([], [], l) = List.rev l | merge ((k1, x1)::r1, [], l) = mergef (k1, SOME x1, NONE, r1, [], l) | merge ([], (k2, x2)::r2, l) = mergef (k2, NONE, SOME x2, [], r2, l) and mergef (k, x1, x2, r1, r2, l) = (case f (x1, x2) of NONE => merge (r1, r2, l) | SOME y => merge (r1, r2, (k, y)::l) (* end case *)) in merge (m1, m2, []) end fun mergeWithi f (m1 : 'a map, m2 : 'b map) = let fun merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), l) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, l) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, l) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, l) (* end case *)) | merge ([], [], l) = List.rev l | merge ((k1, x1)::r1, [], l) = mergef (k1, SOME x1, NONE, r1, [], l) | merge ([], (k2, x2)::r2, l) = mergef (k2, NONE, SOME x2, [], r2, l) and mergef (k, x1, x2, r1, r2, l) = (case f (k, x1, x2) of NONE => merge (r1, r2, l) | SOME y => merge (r1, r2, (k, y)::l) (* end case *)) in merge (m1, m2, []) end (* Apply a function to the entries of the map in map order. *) val appi = List.app fun app f l = appi (fn (_, item) => f item) l (* Create a new table by applying a map function to the * name/value pairs in the table. *) fun mapi f l = List.map (fn (key, item) => (key, f(key, item))) l fun map f l = List.map (fn (key, item) => (key, f item)) l (* Apply a folding function to the entries of the map * in increasing map order. *) fun foldli f init l = List.foldl (fn ((key, item), accum) => f(key, item, accum)) init l fun foldl f init l = List.foldl (fn ((_, item), accum) => f(item, accum)) init l (* Apply a folding function to the entries of the map * in decreasing map order. *) fun foldri f init l = List.foldr (fn ((key, item), accum) => f(key, item, accum)) init l fun foldr f init l = List.foldr (fn ((_, item), accum) => f(item, accum)) init l fun filter pred l = List.filter (fn (_, item) => pred item) l fun filteri pred l = List.filter pred l fun mapPartiali f l = let fun f' (key, item) = (case f (key, item) of NONE => NONE | SOME y => SOME(key, y) (* end case *)) in List.mapPartial f' l end fun mapPartial f l = mapPartiali (fn (_, item) => f item) l (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' [] = false | exists' ((_, x)::r) = pred x orelse exists' r in exists' end fun existsi pred = let fun exists' [] = false | exists' (arg::r) = pred arg orelse exists' r in exists' end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' [] = false | all' ((_, x)::r) = pred x andalso all' r in all' end fun alli pred = let fun all' [] = false | all' (arg::r) = pred arg andalso all' r in all' end end (* functor ListMapFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-mergesort.sml000066400000000000000000000074631416264345000247760ustar00rootroot00000000000000(* list-mergesort.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure ListMergeSort : LIST_SORT = struct (* Given a ">" relation, sort the list into increasing order. This sort * detects initial increasing and decreasing runs and thus is linear * time on ordered input. *) fun sort gt = let fun revAppend ([], ys) = ys | revAppend (x::xs, ys) = revAppend(xs, x::ys) fun merge ([], ys, acc) = revAppend(acc, ys) | merge (xs, [], acc) = revAppend(acc, xs) | merge (xs as (x::xr), ys as (y::yr), acc) = if gt(x, y) then merge (xs, yr, y::acc) else merge (xr, ys, x::acc) fun mergeNeighbors ([], yss) = finishPass yss | mergeNeighbors ([xs], yss) = finishPass (xs::yss) | mergeNeighbors (xs1::xs2::xss, yss) = mergeNeighbors (xss, merge(xs1, xs2, [])::yss) and finishPass [] = [] | finishPass [xs] = xs | finishPass xss = mergeNeighbors (xss, []) fun init (prev, [], yss) = mergeNeighbors ([prev]::yss, []) | init (prev, x::xs, yss) = if gt(prev, x) then runDn (x, xs, [prev], yss) else runUp (x, xs, [prev], yss) and runUp (prev, [], run, yss) = mergeNeighbors (revAppend(prev::run, [])::yss, []) | runUp (prev, x::xr, run, yss) = if gt(prev, x) then init (x, xr, revAppend(prev::run, [])::yss) else runUp (x, xr, prev::run, yss) and runDn (prev, [], run, yss) = mergeNeighbors ((prev::run)::yss, []) | runDn (prev, x::xr, run, yss) = if gt(x, prev) then init (x, xr, (prev::run)::yss) else runDn (x, xr, prev::run, yss) in fn [] => [] | (x::xs) => init(x, xs, []) end (* Given a comparison function, sort the sequence in ascending order while eliminating * duplicates. This sort detects initial increasing and decreasing runs and thus is linear * time on ordered input. *) fun uniqueSort cmp = let fun revAppend ([], ys) = ys | revAppend (x::xs, ys) = revAppend(xs, x::ys) fun merge ([], ys, acc) = revAppend(acc, ys) | merge (xs, [], acc) = revAppend(acc, xs) | merge (xs as (x::xr), ys as (y::yr), acc) = ( case cmp (x, y) of LESS => merge (xr, ys, x::acc) | EQUAL => merge (xr, yr, x::acc) (* discard duplicate *) | GREATER => merge (xs, yr, y::acc) (* end case *)) fun mergeNeighbors ([], yss) = finishPass yss | mergeNeighbors ([xs], yss) = finishPass (xs::yss) | mergeNeighbors (xs1::xs2::xss, yss) = mergeNeighbors (xss, merge(xs1, xs2, [])::yss) and finishPass [] = [] | finishPass [xs] = xs | finishPass xss = mergeNeighbors (xss, []) fun init (prev, [], yss) = mergeNeighbors ([prev]::yss, []) | init (prev, x::xs, yss) = (case cmp(prev, x) of LESS => runUp (x, xs, [prev], yss) | EQUAL => init (prev, xs, yss) (* discard duplicate *) | GREATER => runDn (x, xs, [prev], yss) (* end case *)) and runUp (prev, [], run, yss) = mergeNeighbors (revAppend(prev::run, [])::yss, []) | runUp (prev, x::xr, run, yss) = (case cmp (prev, x) of LESS => runUp (x, xr, prev::run, yss) | EQUAL => runUp (prev, xr, run, yss) (* discard duplicate *) | GREATER => init (x, xr, revAppend(prev::run, [])::yss) (* end case *)) and runDn (prev, [], run, yss) = mergeNeighbors ((prev::run)::yss, []) | runDn (prev, x::xr, run, yss) = (case cmp (prev, x) of LESS => init (x, xr, (prev::run)::yss) | EQUAL => runDn (prev, xr, run, yss) (* discard duplicate *) | GREATER => runDn (x, xr, prev::run, yss) (* end case *)) in fn [] => [] | (x::xs) => init(x, xs, []) end (* is the list sorted in ascending order according to the given ">" relation? *) fun sorted (op >) = let fun chk (_, []) = true | chk (x1, x2::xs) = not(x1>x2) andalso chk(x2, xs) in fn [] => true | (x::xs) => chk(x, xs) end end (* ListMergeSort *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-set-fn.sml000066400000000000000000000117671416264345000241650ustar00rootroot00000000000000(* list-set-fn.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * An implementation of finite sets of ordered values, which uses a sorted list * representation. *) functor ListSetFn (K : ORD_KEY) :> ORD_SET where type Key.ord_key = K.ord_key = struct structure Key = K (* sets are represented as ordered lists of key values *) type item = Key.ord_key type set = item list val empty = [] fun singleton x = [x] fun add (l, item) = let fun f [] = [item] | f (elem::r) = (case Key.compare(item, elem) of LESS => item :: elem :: r | EQUAL => item :: r | GREATER => elem :: (f r) (* end case *)) in f l end fun add' (s, x) = add(x, s) fun union (s1, s2) = let fun merge ([], l2) = l2 | merge (l1, []) = l1 | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => x :: merge(r1, y::r2) | EQUAL => x :: merge(r1, r2) | GREATER => y :: merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun intersection (s1, s2) = let fun merge ([], l2) = [] | merge (l1, []) = [] | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => merge(r1, y::r2) | EQUAL => x :: merge(r1, r2) | GREATER => merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun difference (s1, s2) = let fun merge ([], l2) = [] | merge (l1, []) = l1 | merge (x::r1, y::r2) = (case Key.compare(x, y) of LESS => x :: merge(r1, y::r2) | EQUAL => merge(r1, r2) | GREATER => merge(x::r1, r2) (* end case *)) in merge (s1, s2) end fun addList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) [] items in union (l, items') end fun subtract (l, item) = let fun f ([], _) = l | f (elem::r, prefix) = (case Key.compare(item, elem) of LESS => l | EQUAL => List.revAppend(prefix, r) | GREATER => f (r, elem::prefix) (* end case *)) in f (l, []) end fun subtract' (item, l) = subtract (l, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) [] items in difference (l, items') end (* create a set from a list of items; this function works in linear time if the list * is in increasing order. *) fun fromList [] = [] | fromList (first::rest) = let fun add (prev, x::xs, s) = (case Key.compare(prev, x) of LESS => add (x, xs, x::s) | _ => (* not ordered, so fallback to addList *) addList (List.rev s, x::xs) (* end case *)) | add (_, [], s) = List.rev s in add (first, rest, [first]) end (* Remove an item, returning new map and value removed. * Raise LibBase.NotFound if not found. *) fun delete (l, elem) = let fun f (_, []) = raise LibBase.NotFound | f (prefix, elem' :: r) = (case Key.compare(elem, elem') of LESS => raise LibBase.NotFound | EQUAL => List.revAppend(prefix, r) | GREATER => f(elem' :: prefix, r) (* end case *)) in f ([], l) end fun member (l, item) = let fun f [] = false | f (elem :: r) = (case Key.compare(item, elem) of LESS => false | EQUAL => true | GREATER => f r (* end case *)) in f l end fun isEmpty [] = true | isEmpty _ = false fun minItem [] = raise Empty | minItem (x::_) = x fun maxItem xs = List.last xs fun equal (s1, s2) = let fun f ([], []) = true | f (x::r1, y::r2) = (Key.compare(x, y) = EQUAL) andalso f (r1, r2) | f _ = false in f (s1, s2) end fun compare ([], []) = EQUAL | compare ([], _) = LESS | compare (_, []) = GREATER | compare (x1::r1, x2::r2) = (case Key.compare(x1, x2) of EQUAL => compare (r1, r2) | order => order (* end case *)) (* Return true if and only if the first set is a subset of the second *) fun isSubset (s1, s2) = let fun f ([], _) = true | f (_, []) = false | f (x::r1, y::r2) = (case Key.compare(x, y) of LESS => false | EQUAL => f (r1, r2) | GREATER => f (x::r1, r2) (* end case *)) in f (s1, s2) end fun disjoint ([], _) = true | disjoint (_, []) = true | disjoint (x::r1, y::r2) = (case Key.compare(x, y) of LESS => disjoint (r1, y::r2) | EQUAL => false | GREATER => disjoint (x::r1, r2) (* end case *)) (* Return the number of items in the set *) fun numItems l = List.length l (* Return a list of the items in the set *) fun toList l = l val app = List.app fun map f s1 = List.foldl (fn (x, s) => add(s, f x)) [] s1 fun mapPartial f s = let fun f' (x, acc) = (case f x of SOME x' => add(acc, x') | NONE => acc) in List.foldl f' [] s end val foldr = List.foldr val foldl = List.foldl val filter = List.filter val partition = List.partition val exists = List.exists val all = List.all val find = List.find (* deprecated *) val listItems = toList end (* IntListMap *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-xprod-sig.sml000066400000000000000000000015651416264345000247000ustar00rootroot00000000000000(* list-xprod-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Functions for computing with the Cartesian product of two lists. *) signature LIST_XPROD = sig val app : (('a * 'b) -> unit) -> ('a list * 'b list) -> unit (* apply a function to the Cartesian product of two lists *) val map : (('a * 'b) -> 'c) -> ('a list * 'b list) -> 'c list (* map a function across the Cartesian product of two lists *) val fold : (('a * 'b * 'c) -> 'c) -> 'c -> ('a list * 'b list) -> 'c (* fold a function across the Cartesian product of two lists *) (* DEPRECATED FUNCTIONS *) val appX : (('a * 'b) -> unit) -> ('a list * 'b list) -> unit val mapX : (('a * 'b) -> 'c) -> ('a list * 'b list) -> 'c list val foldX : (('a * 'b * 'c) -> 'c) -> ('a list * 'b list) -> 'c -> 'c end; (* LIST_XPROD *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/list-xprod.sml000066400000000000000000000023221416264345000241100ustar00rootroot00000000000000(* list-xprod.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Functions for computing with the Cartesian product of two lists. *) structure ListXProd : LIST_XPROD = struct (* apply a function to the Cartesian product of two lists *) fun app f (l1, l2) = let fun lp1 [] = () | lp1 (x::r) = let fun lp2 [] = lp1 r | lp2 (y::r) = (f(x, y); lp2 r) in lp2 l2 end in lp1 l1 end (* map a function across the Cartesian product of two lists *) fun map f (l1, l2) = let fun lp1 ([], resL) = rev resL | lp1 (x::r, resL) = let fun lp2 ([], resL) = lp1 (r, resL) | lp2 (y::r, resL) = lp2 (r, f(x, y) :: resL) in lp2 (l2, resL) end in lp1 (l1, []) end (* fold a function across the Cartesian product of two lists *) fun fold f init (l1, l2) = let fun lp1 ([], accum) = accum | lp1 (x::r, accum) = let fun lp2 ([], accum) = lp1 (r, accum) | lp2 (y::r, accum) = lp2 (r, f(x, y, accum)) in lp2 (l2, accum) end in lp1 (l1, init) end (* DEPRECATED FUNCTIONS *) val appX = app val mapX = map fun foldX f arg init = fold f init arg end; (* ListXProd *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/listsort-sig.sml000066400000000000000000000013671416264345000244560ustar00rootroot00000000000000(* listsort-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The generic list sorting interface. Taken from the SML/NJ compiler. *) signature LIST_SORT = sig val sort : ('a * 'a -> bool) -> 'a list -> 'a list (* (sort gt l) sorts the list l in ascending order using the * ``greater-than'' relationship defined by gt. *) val uniqueSort : ('a * 'a -> order) -> 'a list -> 'a list (* uniquesort produces an increasing list, removing equal * elements *) val sorted : ('a * 'a -> bool) -> 'a list -> bool (* (sorted gt l) returns true if the list is sorted in ascending * order under the ``greater-than'' predicate gt. *) end; (* LIST_SORT *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-array-fn.sml000066400000000000000000000006301416264345000244700ustar00rootroot00000000000000(* mono-array-fn.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This simple functor allows easy construction of new monomorphic array * structures. *) functor MonoArrayFn (type elem) :> MONO_ARRAY where type elem = elem = struct open Array type elem = elem type array = elem Array.array type vector = elem Vector.vector end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-array-sort-sig.sml000066400000000000000000000006201416264345000256330ustar00rootroot00000000000000(* mono-array-sort-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for in-place sorting of monomorphic arrays * *) signature MONO_ARRAY_SORT = sig structure A : MONO_ARRAY val sort : (A.elem * A.elem -> order) -> A.array -> unit val sorted : (A.elem * A.elem -> order) -> A.array -> bool end; (* MONO_ARRAY_SORT *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-dynamic-array-sig.sml000066400000000000000000000056171416264345000263030ustar00rootroot00000000000000(* mono-dynamic-array-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for monomorphic unbounded arrays. * * TODO: add the missing operations that the DynamicArray structure * provides. *) signature MONO_DYNAMIC_ARRAY = sig type elem type array val array : (int * elem) -> array (* array (sz, e) creates an unbounded array all of whose elements * are initialized to e. sz (>= 0) is used as a * hint of the potential range of indices. Raises Size if a * negative hint is given. *) val subArray : array * int * int -> array (* subArray (a,lo,hi) creates a new array with the same default * as a, and whose values in the range [0,hi-lo] are equal to * the values in b in the range [lo, hi]. * Raises Size if lo > hi *) val fromList : elem list * elem -> array (* arrayoflist (l, v) creates an array using the list of values l * plus the default value v. *) val toList : array -> elem list (* return the array's contents as a list *) val tabulate: int * (int -> elem) * elem -> array (* tabulate (sz,fill,dflt) acts like Array.tabulate, plus * stores default value dflt. Raises Size if sz < 0. *) val default : array -> elem (* default returns array's default value *) val sub : array * int -> elem (* sub (a,idx) returns value of the array at index idx. * If that value has not been set by update, it returns the default value. * Raises Subscript if idx < 0 *) val update : array * int * elem -> unit (* update (a,idx,v) sets the value at index idx of the array to v. * Raises Subscript if idx < 0 *) val bound : array -> int (* bound returns an upper bound on the index of values that have been * changed. *) val truncate : array * int -> unit (* truncate (a,sz) makes every entry with index > sz the default value *) (** what about iterators??? **) (* val vector : array -> 'a vector val copy : {di:int, dst:array, src:array} -> unit val copyVec : {di:int, dst:array, src:'a vector} -> unit val appi : (int * 'a -> unit) -> array -> unit val app : ('a -> unit) -> array -> unit val modifyi : (int * 'a -> 'a) -> array -> unit val modify : ('a -> 'a) -> array -> unit val foldli : (int * 'a * 'b -> 'b) -> 'b -> array -> 'b val foldri : (int * 'a * 'b -> 'b) -> 'b -> array -> 'b val foldl : ('a * 'b -> 'b) -> 'b -> array -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> array -> 'b val findi : (int * 'a -> bool) -> array -> (int * 'a) option val find : ('a -> bool) -> array -> 'a option val exists : ('a -> bool) -> array -> bool val all : ('a -> bool) -> array -> bool val collate : ('a * 'a -> order) -> array * array -> order *) end (* MONO_DYNAMIC_ARRAY *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-hash-set-sig.sml000066400000000000000000000062631416264345000252550ustar00rootroot00000000000000(* mono-hash-set-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) signature MONO_HASH_SET = sig structure Key : HASH_KEY type item = Key.hash_key type set val mkEmpty : int -> set (* The empty set; argument specifies initial table size *) val mkSingleton : item -> set (* Create a singleton set *) val mkFromList : item list -> set (* create a set from a list of items *) val copy : set -> set (* returns a copy of the set *) val toList : set -> item list (* Return a list of the items in the set *) val add : set * item -> unit val addc : set -> item -> unit (* Insert an item. *) val addList : set * item list -> unit (* Insert items from list. *) val subtract : set * item -> unit val subtractc : set -> item -> unit (* Remove the item, if it is in the set. Otherwise the set is unchanged. * The `without` function is deprecated in favor of `subtract`, whose name * is consistent with the other set-like APIs. *) val subtractList : set * item list -> unit (* Subtract a list of items from the set. *) val delete : set * item -> bool (* Remove an item. Return false if the item was not present. *) val member : set * item -> bool (* Return true if and only if item is an element in the set *) val isEmpty : set -> bool (* Return true if and only if the set is empty *) val isSubset : (set * set) -> bool (* Return true if and only if the first set is a subset of the second *) val numItems : set -> int (* Return the number of items in the table *) val map : (item -> item) -> set -> set (* Create a new set by applying a map function to the elements * of the set. *) val mapPartial : (item -> item option) -> set -> set (* Create a new set by mapping a partial function over the * items in the set. *) val app : (item -> unit) -> set -> unit (* Apply a function to the entries of the set. *) val fold : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set. *) val partition : (item -> bool) -> set -> (set * set) (* partition a set into two based using the given predicate. Returns two * sets, where the first contains those elements for which the predicate is * true and the second contains those elements for which the predicate is * false. *) val filter : (item -> bool) -> set -> unit (* filter a set by removing those elements for which the predicate * is false. *) val exists : (item -> bool) -> set -> bool (* check the elements of a set with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) val all : (item -> bool) -> set -> bool (* check the elements of a set with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) val find : (item -> bool) -> set -> item option (* find an element in the set for which the predicate is true *) (* DEPRECATED FUNCTIONS *) val listItems : set -> item list val without : set * item -> unit end (* MONO_HASH_SET *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-hash-table-sig.sml000066400000000000000000000053661416264345000255540ustar00rootroot00000000000000(* mono-hash-table-sig.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The result signature of the hash table functor (see hash-table.sml). * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) signature MONO_HASH_TABLE = sig structure Key : HASH_KEY type 'a hash_table val mkTable : (int * exn) -> 'a hash_table (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) val clear : 'a hash_table -> unit (* remove all elements from the table *) val insert : 'a hash_table -> (Key.hash_key * 'a) -> unit (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) val inDomain : 'a hash_table -> Key.hash_key -> bool (* return true, if the key is in the domain of the table *) val lookup : 'a hash_table -> Key.hash_key -> 'a (* Find an item, the table's exception is raised if the item doesn't exist *) val find : 'a hash_table -> Key.hash_key -> 'a option (* Look for an item, return NONE if the item doesn't exist *) val remove : 'a hash_table -> Key.hash_key -> 'a (* Remove an item, returning the item. The table's exception is raised if * the item doesn't exist. *) val numItems : 'a hash_table -> int (* Return the number of items in the table *) val listItems : 'a hash_table -> 'a list val listItemsi : 'a hash_table -> (Key.hash_key * 'a) list (* Return a list of the items (and their keys) in the table *) val app : ('a -> unit) -> 'a hash_table -> unit val appi : ((Key.hash_key * 'a) -> unit) -> 'a hash_table -> unit (* Apply a function to the entries of the table *) val map : ('a -> 'b) -> 'a hash_table -> 'b hash_table val mapi : ((Key.hash_key * 'a) -> 'b) -> 'a hash_table -> 'b hash_table (* Map a table to a new table that has the same keys *) val fold : (('a * 'b) -> 'b) -> 'b -> 'a hash_table -> 'b val foldi : ((Key.hash_key * 'a * 'b) -> 'b) -> 'b -> 'a hash_table -> 'b val modify : ('a -> 'a) -> 'a hash_table -> unit val modifyi : ((Key.hash_key * 'a) -> 'a) -> 'a hash_table -> unit (* modify the hash-table items in place *) (** Also mapPartial?? *) val filter : ('a -> bool) -> 'a hash_table -> unit val filteri : ((Key.hash_key * 'a) -> bool) -> 'a hash_table -> unit (* remove any hash table items that do not satisfy the given * predicate. *) val copy : 'a hash_table -> 'a hash_table (* Create a copy of a hash table *) val bucketSizes : 'a hash_table -> int list (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) end (* MONO_HASH_TABLE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-hash2-table-sig.sml000066400000000000000000000060071416264345000256270ustar00rootroot00000000000000(* mono-hash2-table-sig.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Hash tables that are keyed by two keys (in different domains). * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) signature MONO_HASH2_TABLE = sig structure Key1 : HASH_KEY structure Key2 : HASH_KEY type 'a hash_table val mkTable : (int * exn) -> 'a hash_table (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) val clear : 'a hash_table -> unit (* remove all elements from the table *) val insert : 'a hash_table -> (Key1.hash_key * Key2.hash_key * 'a) -> unit (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) val inDomain1 : 'a hash_table -> Key1.hash_key -> bool val inDomain2 : 'a hash_table -> Key2.hash_key -> bool (* return true, if the key is in the domain of the table *) val lookup1 : 'a hash_table -> Key1.hash_key -> 'a val lookup2 : 'a hash_table -> Key2.hash_key -> 'a (* Find an item, the table's exception is raised if the item doesn't exist *) val find1 : 'a hash_table -> Key1.hash_key -> 'a option val find2 : 'a hash_table -> Key2.hash_key -> 'a option (* Look for an item, return NONE if the item doesn't exist *) val remove1 : 'a hash_table -> Key1.hash_key -> 'a val remove2 : 'a hash_table -> Key2.hash_key -> 'a (* Remove an item, returning the item. The table's exception is raised if * the item doesn't exist. *) val numItems : 'a hash_table -> int (* Return the number of items in the table *) val listItems : 'a hash_table -> 'a list val listItemsi : 'a hash_table -> (Key1.hash_key * Key2.hash_key * 'a) list (* Return a list of the items (and their keys) in the table *) val app : ('a -> unit) -> 'a hash_table -> unit val appi : ((Key1.hash_key * Key2.hash_key * 'a) -> unit) -> 'a hash_table -> unit (* Apply a function to the entries of the table *) val map : ('a -> 'b) -> 'a hash_table -> 'b hash_table val mapi : ((Key1.hash_key * Key2.hash_key * 'a) -> 'b) -> 'a hash_table -> 'b hash_table (* Map a table to a new table that has the same keys *) (* TODO: add mapPartial and mapPartiali *) val fold : (('a * 'b) -> 'b) -> 'b -> 'a hash_table -> 'b val foldi : ((Key1.hash_key * Key2.hash_key * 'a * 'b) -> 'b) -> 'b -> 'a hash_table -> 'b (* TODO: add modify and modifyi *) val filter : ('a -> bool) -> 'a hash_table -> unit val filteri : ((Key1.hash_key * Key2.hash_key * 'a) -> bool) -> 'a hash_table -> unit (* remove any hash table items that do not satisfy the given * predicate. *) val copy : 'a hash_table -> 'a hash_table (* Create a copy of a hash table *) val bucketSizes : 'a hash_table -> (int list * int list) (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) end (* MONO_HASH2_TABLE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/mono-priorityq-sig.sml000066400000000000000000000024261416264345000256000ustar00rootroot00000000000000(* mono-priorityq-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This signature describes the interface to monomorphic functional * priority queues. *) signature MONO_PRIORITYQ = sig type item type queue val empty : queue val singleton : item -> queue (* create a queue from a single item *) val fromList : item list -> queue (* build a queue from a list of items *) val insert : (item * queue) -> queue (* insert an item *) val remove : queue -> (item * queue) (* remove the highest priority item from the queue; raise List.Empty * if the queue is empty. *) val next : queue -> (item * queue) option (* remove the highest priority item from the queue; return NONE * if the queue is empty. *) val findAndRemove : queue * (item -> bool) -> (item * queue) option (* find the item with the highest priority that satisfies the predicate *) val delete : queue * (item -> bool) -> queue (* delete all elements satisfying the given predicate *) val merge : (queue * queue) -> queue (* Merge two queues. *) val numItems : queue -> int (* return the number of items in the queue *) val isEmpty : queue -> bool (* return true, if the queue is empty *) end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/ord-key-sig.sml000066400000000000000000000005341416264345000241400ustar00rootroot00000000000000(* ord-key-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Abstract linearly ordered keys. *) signature ORD_KEY = sig (* the type of keys *) type ord_key (* defines a total ordering on the ord_key type *) val compare : ord_key * ord_key -> order end (* ORD_KEY *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/ord-map-sig.sml000066400000000000000000000125171416264345000241310ustar00rootroot00000000000000(* ord-map-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * Abstract signature of an applicative-style finite maps (dictionaries) * structure over ordered monomorphic keys. *) signature ORD_MAP = sig structure Key : ORD_KEY (* the map's domain and its comparison function *) type 'a map val empty : 'a map (* The empty map *) val isEmpty : 'a map -> bool (* Return true if and only if the map is empty *) val singleton : (Key.ord_key * 'a) -> 'a map (* return the specified singleton map *) val insert : 'a map * Key.ord_key * 'a -> 'a map val insert' : ((Key.ord_key * 'a) * 'a map) -> 'a map (* Insert an item. *) val insertWith : ('a * 'a -> 'a) -> 'a map * Key.ord_key * 'a -> 'a map (* Insert an item with a combining function to resolve collisions. * The first argument to the combining function is the existing value, * and the second argument is the value being inserted into the map. *) val insertWithi : (Key.ord_key * 'a * 'a -> 'a) -> 'a map * Key.ord_key * 'a -> 'a map (* Like insertWith, except that the combining function also takes the * key as an argument. *) val find : 'a map * Key.ord_key -> 'a option (* Look for an item, return NONE if the item doesn't exist *) val lookup : 'a map * Key.ord_key -> 'a (* look for an item, raise the NotFound exception if it doesn't exist *) val inDomain : ('a map * Key.ord_key) -> bool (* return true, if the key is in the domain of the map *) val remove : 'a map * Key.ord_key -> 'a map * 'a (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) val first : 'a map -> 'a option val firsti : 'a map -> (Key.ord_key * 'a) option (* return the first item in the map (or NONE if it is empty) *) val numItems : 'a map -> int (* Return the number of items in the map *) val listItems : 'a map -> 'a list val listItemsi : 'a map -> (Key.ord_key * 'a) list (* Return an ordered list of the items (and their keys) in the map. *) val listKeys : 'a map -> Key.ord_key list (* return an ordered list of the keys in the map. *) val collate : ('a * 'a -> order) -> ('a map * 'a map) -> order (* given an ordering on the map's range, return an ordering * on the map. *) val unionWith : ('a * 'a -> 'a) -> ('a map * 'a map) -> 'a map val unionWithi : (Key.ord_key * 'a * 'a -> 'a) -> ('a map * 'a map) -> 'a map (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) val intersectWith : ('a * 'b -> 'c) -> ('a map * 'b map) -> 'c map val intersectWithi : (Key.ord_key * 'a * 'b -> 'c) -> ('a map * 'b map) -> 'c map (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) val mergeWith : ('a option * 'b option -> 'c option) -> ('a map * 'b map) -> 'c map val mergeWithi : (Key.ord_key * 'a option * 'b option -> 'c option) -> ('a map * 'b map) -> 'c map (* merge two maps using the given function to control the merge. For * each key k in the union of the two maps domains, the function * is applied to the image of the key under the map. If the function * returns SOME y, then (k, y) is added to the resulting map. *) val app : ('a -> unit) -> 'a map -> unit val appi : ((Key.ord_key * 'a) -> unit) -> 'a map -> unit (* Apply a function to the entries of the map in map order. *) val map : ('a -> 'b) -> 'a map -> 'b map val mapi : (Key.ord_key * 'a -> 'b) -> 'a map -> 'b map (* Create a new map by applying a map function to the * name/value pairs in the map. *) val foldl : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldli : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in increasing map order. *) val foldr : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldri : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in decreasing map order. *) val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) val mapPartial : ('a -> 'b option) -> 'a map -> 'b map val mapPartiali : (Key.ord_key * 'a -> 'b option) -> 'a map -> 'b map (* map a partial function over the elements of a map in increasing * map order. *) val exists : ('a -> bool) -> 'a map -> bool val existsi : (Key.ord_key * 'a -> bool) -> 'a map -> bool (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) val all : ('a -> bool) -> 'a map -> bool val alli : (Key.ord_key * 'a -> bool) -> 'a map -> bool (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) end (* ORD_MAP *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/ord-set-sig.sml000066400000000000000000000077731416264345000241570ustar00rootroot00000000000000(* ordset-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for a set of values with an order relation. *) signature ORD_SET = sig structure Key : ORD_KEY (* the set elements and their comparison function *) type item = Key.ord_key type set val empty : set (* The empty set *) val singleton : item -> set (* Create a singleton set *) val fromList : item list -> set (* create a set from a list of items *) val toList : set -> item list (* Return an ordered list of the items in the set. * Added in SML/NJ 110.80. *) val add : set * item -> set val add' : (item * set) -> set (* Add an item. *) val addList : set * item list -> set (* Add a list of items. *) val subtract : set * item -> set val subtract' : (item * set) -> set (* Subtract an item from a set; has no effect if the item is not in the set *) val subtractList : set * item list -> set (* Subtract a list of items from the set. *) val delete : set * item -> set (* Remove an item. Raise NotFound if not found. *) val member : set * item -> bool (* Return true if and only if item is an element in the set *) val isEmpty : set -> bool (* Return true if and only if the set is empty *) val minItem : set -> item (* return the smallest element of the set (raises Empty if the set is empty). * Added in SML/NJ 110.80. *) val maxItem : set -> item (* return the largest element of the set (raises Empty if the set is empty). * Added in SML/NJ 110.80. *) val equal : (set * set) -> bool (* Return true if and only if the two sets are equal *) val compare : (set * set) -> order (* does a lexical comparison of two sets *) val isSubset : (set * set) -> bool (* Return true if and only if the first set is a subset of the second *) val disjoint : set * set -> bool (* are the two sets disjoint? *) val numItems : set -> int (* Return the number of items in the table *) val union : set * set -> set (* Union *) val intersection : set * set -> set (* Intersection *) val difference : set * set -> set (* Difference *) val map : (item -> item) -> set -> set (* Create a new set by applying a map function to the elements * of the set. *) val mapPartial : (item -> item option) -> set -> set (* Create a new set by mapping a partial function over the * items in the set. *) val app : (item -> unit) -> set -> unit (* Apply a function to the entries of the set * in increasing order *) val foldl : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in increasing order *) val foldr : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in decreasing order *) val partition : (item -> bool) -> set -> (set * set) (* partition a set into two based using the given predicate. Returns two * sets, where the first contains those elements for which the predicate is * true and the second contains those elements for which the predicate is * false. *) val filter : (item -> bool) -> set -> set (* filter a set by the given predicate returning only those elements for * which the predicate is true. *) val exists : (item -> bool) -> set -> bool (* check the elements of a set with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) val all : (item -> bool) -> set -> bool (* check the elements of a set with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) val find : (item -> bool) -> set -> item option (* find an element in the set for which the predicate is true *) (* DEPRECATED FUNCTIONS *) val listItems : set -> item list end (* ORD_SET *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/parser-comb-sig.sml000066400000000000000000000040431416264345000247770ustar00rootroot00000000000000(* parser-comb-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1996 AT&T Research. * * Parser combinators over readers. These are modeled after the Haskell * combinators of Hutton and Meijer. The main difference is that they * return a single result, instead of a list of results. This means that * "or" is a committed choice; once one branch succeeds, the others will not * be enabled. While this is somewhat limiting, for many applications it * will not be a problem. For more substantial parsing problems, one should * use ML-Yacc and/or ML-Lex. *) signature PARSER_COMB = sig type ('a, 'strm) parser = (char, 'strm) StringCvt.reader -> ('a, 'strm) StringCvt.reader val result : 'a -> ('a, 'strm) parser val failure : ('a, 'strm) parser val wrap : (('a, 'strm) parser * ('a -> 'b)) -> ('b, 'strm) parser val seq : (('a, 'strm) parser * ('b, 'strm) parser) -> (('a * 'b), 'strm) parser val seqWith : (('a * 'b) -> 'c) -> (('a, 'strm) parser * ('b, 'strm) parser) -> ('c, 'strm) parser val bind : (('a, 'strm) parser * ('a -> ('b, 'strm) parser)) -> ('b, 'strm) parser val eatChar : (char -> bool) -> (char, 'strm) parser val char : char -> (char, 'strm) parser val string : string -> (string, 'strm) parser val skipBefore : (char -> bool) -> ('a, 'strm) parser -> ('a, 'strm) parser val or : (('a, 'strm) parser * ('a, 'strm) parser) -> ('a, 'strm) parser val or' : ('a, 'strm) parser list -> ('a, 'strm) parser val zeroOrMore : ('a, 'strm) parser -> ('a list, 'strm) parser val oneOrMore : ('a, 'strm) parser -> ('a list, 'strm) parser val option : ('a, 'strm) parser -> ('a option, 'strm) parser val join : ('a option, 'strm) parser -> ('a, 'strm) parser val token : (char -> bool) -> (string, 'strm) parser (* parse a token consisting of characters satisfying the predicate. * If this succeeds, then the resulting string is guaranteed to be * non-empty. *) end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/parser-comb.sml000066400000000000000000000065721416264345000242300ustar00rootroot00000000000000(* parser-comb.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Parser combinators over readers. These are modeled after the Haskell * combinators of Hutton and Meijer. The main difference is that they * return a single result, instead of a list of results. This means that * "or" is a committed choice; once one branch succeeds, the others will not * be enabled. While this is somewhat limiting, for many applications it * will not be a problem. For more substantial parsing problems, one should * use a parser generator like ML-Antlr, ML-Yacc and/or ML-Lex. *) structure ParserComb : PARSER_COMB = struct structure SC = StringCvt type ('a, 'strm) parser = (char, 'strm) SC.reader -> ('a, 'strm) SC.reader fun result v getc strm = SOME(v, strm) fun failure getc strm = NONE fun wrap (p, f) getc strm = (case (p getc strm) of NONE => NONE | (SOME(x, strm)) => SOME(f x, strm) (* end case *)) fun seqWith f (p1, p2) getc strm = (case (p1 getc strm) of SOME(t1, strm1) => (case (p2 getc strm1) of SOME(t2, strm2) => SOME(f(t1, t2), strm2) | NONE => NONE (* end case *)) | NONE => NONE (* end case *)) fun seq (p1, p2) = seqWith (fn x => x) (p1, p2) fun bind (p1, p2') getc strm = (case (p1 getc strm) of SOME(t1, strm1) => p2' t1 getc strm1 | NONE => NONE (* end case *)) fun eatChar pred getc strm = (case getc strm of (res as SOME(c, strm')) => if (pred c) then res else NONE | _ => NONE (* end case *)) fun char (c: char) = eatChar (fn c' => (c = c')) fun string s getc strm = let fun eat (ss, strm) = (case (Substring.getc ss, getc strm) of (SOME(c1, ss'), SOME(c2, strm')) => if (c1 = c2) then eat(ss', strm') else NONE | (NONE, _) => SOME(s, strm) | _ => NONE (* end case *)) in eat (Substring.full s, strm) end fun skipBefore pred p getc strm = let fun skip' strm = (case getc strm of NONE => NONE | SOME(c, strm') => if (pred c) then skip' strm' else p getc strm (* end case *)) in skip' strm end fun or (p1, p2) getc strm = (case (p1 getc strm) of NONE => (case (p2 getc strm) of NONE => NONE | res => res (* end case *)) | res => res (* end case *)) fun or' l getc strm = let fun tryNext [] = NONE | tryNext (p::r) = (case (p getc strm) of NONE => tryNext r | res => res (* end case *)) in tryNext l end fun zeroOrMore p getc strm = let val p = p getc fun parse (l, strm) = (case (p strm) of (SOME(item, strm)) => parse (item::l, strm) | NONE => SOME(rev l, strm) (* end case *)) in parse ([], strm) end fun oneOrMore p getc strm = (case (zeroOrMore p getc strm) of (res as (SOME(_::_, _))) => res | _ => NONE (* end case *)) fun option p getc strm = (case (p getc strm) of SOME(x, strm) => SOME(SOME x, strm) | NONE => SOME(NONE, strm) (* end case *)) fun join p = bind (p, fn (SOME x) => result x | NONE => failure) (* parse a token consisting of characters satisfying the predicate. * If this succeeds, then the resulting string is guaranteed to be * non-empty. *) fun token pred getc strm = (case (zeroOrMore (eatChar pred) getc strm) of (SOME(res as _::_, strm)) => SOME(implode res, strm) | _ => NONE (* end case *)) end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/path-util-sig.sml000066400000000000000000000034701416264345000244770ustar00rootroot00000000000000(* path-util-sig.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Various higher-level pathname and searching utilities. *) signature PATH_UTIL = sig (* findFile paths name * returns SOME(p/name), where p is the first path in paths such that p/name exists. * If no such file exists, then NONE is returned. If name is an absolute path, then * SOME name is returned if it exists. *) val findFile : string list -> string -> string option (* findFiles (paths, mode) name * returns a list of p/name values, where p is in paths and p/name exists. If name is an * absolute path, then [name] is returned if it exists. *) val findFiles : string list -> string -> string list (* existsFile pred paths name * returns SOME(p/name), where p is the first path in paths such that p/name satisfies * the given predicate. If no such file exists, then NONE is returned. If name is an * absolute path, then SOME name is returned if it satisfies the predicate. *) val existsFile : (string -> bool) -> string list -> string -> string option (* allFiles pred paths name * returns a list of all p/name values, such that p is in paths and p/name satisfies * the given predicate. The order of the path list is preserved in the result. If name * is an absolute path, then [name] is returned if it satisfies the predicate. *) val allFiles : (string -> bool) -> string list -> string -> string list (* findExe paths name * returns SOME(p/name), where p is the first path in paths such that p/name exists and * is executable. If no such file exists, then NONE is returned. If name is an * absolute path, then SOME name is returned if it is executable. *) val findExe : string list -> string -> string option end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/path-util.sml000066400000000000000000000023341416264345000237150ustar00rootroot00000000000000(* path-util.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Various higher-level pathname and searching utilities. *) structure PathUtil : PATH_UTIL = struct structure P = OS.Path structure F = OS.FileSys fun existsFile pred pathList fileName = let fun chk s = if (pred s) then SOME s else NONE fun iter [] = NONE | iter (p::r) = (case chk(P.joinDirFile{dir=p, file=fileName}) of NONE => iter r | res => res (* end case *)) in if P.isAbsolute fileName then chk fileName else iter pathList end fun allFiles pred pathList fileName = let fun chk s = if (pred s) then SOME s else NONE fun iter ([], l) = rev l | iter (p::r, l) = (case chk(P.joinDirFile{dir=p, file=fileName}) of NONE => iter(r, l) | (SOME s) => iter(r, s::l) (* end case *)) in if not(P.isAbsolute fileName) then iter (pathList, []) else if (pred fileName) then [fileName] else [] end fun fileExists s = F.access(s, []) val findFile = existsFile fileExists val findFiles = allFiles fileExists val findExe = existsFile (fn p => OS.FileSys.access(p, [OS.FileSys.A_EXEC])) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/plist-sig.sml000066400000000000000000000027431416264345000237250ustar00rootroot00000000000000(* plist-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Property lists using Stephen Weeks's implementation. *) signature PROP_LIST = sig type holder val newHolder : unit -> holder val hasProps : holder -> bool (* return true if the holder has any properties. *) val clearHolder : holder -> unit (* remove all properties and flags from the holder *) val sameHolder : (holder * holder) -> bool (* returns true, if two holders are the same *) (* newProp (selHolder, init) * creates a new property for objects of type 'a and returns * functions to get the property, set it, and clear it. The function * selHolder is used to select the holder field from an object * and init is used to create the initial property value. * Typically, properties are reference cells, so that they can * be modified. The difference between peekFn and getFn is that * peekFn returns NONE when the property has not yet been created, * whereas getFn will allocate and initialize the property. The * setFn function can either be used to initialize an undefined property * or to override a property's current value. *) val newProp : (('a -> holder) * ('a -> 'b)) -> { peekFn : 'a -> 'b option, getFn : 'a -> 'b, setFn : ('a * 'b) -> unit, clrFn : 'a -> unit } val newFlag : ('a -> holder) -> { getFn : 'a -> bool, setFn : ('a * bool) -> unit } end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/plist.sml000066400000000000000000000036061416264345000231440ustar00rootroot00000000000000(* plist.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Property lists using Stephen Weeks's implementation. *) structure PropList :> PROP_LIST = struct type holder = exn list ref fun newHolder() : holder = ref [] fun hasProps (ref []) = false | hasProps _ = true fun clearHolder r = (r := []) fun sameHolder (r1 : holder, r2) = (r1 = r2) fun mkProp () = let exception E of 'a fun cons (a, l) = E a :: l fun peek [] = NONE | peek (E a :: _) = SOME a | peek (_ :: l) = peek l fun delete [] = [] | delete (E a :: r) = r | delete (x :: r) = x :: delete r in { cons = cons, peek = peek, delete = delete } end fun mkFlag () = let exception E fun peek [] = false | peek (E :: _) = true | peek (_ :: l) = peek l fun set (l, flg) = let fun set ([], _) = if flg then E::l else l | set (E::r, xs) = if flg then l else List.revAppend(xs, r) | set (x::r, xs) = set (r, x::xs) in set (l, []) end in { set = set, peek = peek } end fun newProp (selHolder : 'a -> holder, init : 'a -> 'b) = let val {peek, cons, delete} = mkProp() fun peekFn a = peek(!(selHolder a)) fun getF a = let val h = selHolder a in case peek(!h) of NONE => let val b = init a in h := cons(b, !h); b end | (SOME b) => b (* end case *) end fun clrF a = let val h = selHolder a in h := delete(!h) end fun setFn (a, x) = let val h = selHolder a in h := cons(x, delete(!h)) end in {peekFn = peekFn, getFn = getF, clrFn = clrF, setFn = setFn} end fun newFlag (selHolder : 'a -> holder) = let val {peek, set} = mkFlag() fun getF a = peek(!(selHolder a)) fun setF (a, flg) = let val h = selHolder a in h := set(!h, flg) end in {getFn = getF, setFn = setF} end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/priority-sig.sml000066400000000000000000000005271416264345000244510ustar00rootroot00000000000000(* priority-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Argument signature for functors that implement priority queues. *) signature PRIORITY = sig type priority val compare : (priority * priority) -> order type item val priority : item -> priority end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/queue-sig.sml000066400000000000000000000023211416264345000237060ustar00rootroot00000000000000(* queue-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Imperative fifos * *) signature QUEUE = sig type 'a queue exception Dequeue val mkQueue : unit -> 'a queue (* make a new queue *) val clear : 'a queue -> unit (* remove all elements *) val isEmpty : 'a queue -> bool (* test for empty queue *) val enqueue : 'a queue * 'a -> unit (* enqueue an element at the rear *) val dequeue : 'a queue -> 'a (* remove the front element (raise Dequeue if empty) *) val next : 'a queue -> 'a option (* remove the first element; return NONE if the queue is empty *) val delete : ('a queue * ('a -> bool)) -> unit (* delete all elements satisfying the given predicate *) val head : 'a queue -> 'a (* return the first queue element without removing it *) val peek : 'a queue -> 'a option (* peek at the first queue element without removing it *) val length : 'a queue -> int val contents : 'a queue -> 'a list val app : ('a -> unit) -> 'a queue -> unit val map : ('a -> 'b) -> 'a queue -> 'b queue val foldl : ('a * 'b -> 'b) -> 'b -> 'a queue -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a queue -> 'b end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/queue.sml000066400000000000000000000020131416264345000231240ustar00rootroot00000000000000(* queue.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Imperative fifos * *) structure Queue :> QUEUE = struct type 'a queue = 'a Fifo.fifo ref exception Dequeue = Fifo.Dequeue fun mkQueue () = ref Fifo.empty fun clear q = (q := Fifo.empty) fun enqueue (q,x) = q := (Fifo.enqueue (!q, x)) fun dequeue q = let val (newq, x) = Fifo.dequeue (!q) in q := newq; x end fun next q = (case Fifo.next (!q) of SOME(x, newq) => (q := newq; SOME x) | NONE => NONE (* end case *)) fun delete (q, pred) = (q := Fifo.delete (!q, pred)) fun head q = Fifo.head (!q) fun peek q = Fifo.peek (!q) fun isEmpty q = Fifo.isEmpty (!q) fun length q = Fifo.length (!q) fun contents q = Fifo.contents (!q) fun app f q = Fifo.app f (!q) fun map f q = ref(Fifo.map f (!q)) fun foldl f b q = Fifo.foldl f b (!q) fun foldr f b q = Fifo.foldr f b (!q) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/rand-sig.sml000066400000000000000000000017021416264345000235100ustar00rootroot00000000000000(* rand-sig.sml * * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for a simple random number generator. * *) signature RAND = sig type rand = Word.word val randMin : rand val randMax : rand val random : rand -> rand (* Given seed, return value randMin <= v <= randMax * Iteratively using the value returned by random as the * next seed to random will produce a sequence of pseudo-random * numbers. *) val mkRandom : rand -> unit -> rand (* Given seed, return function generating a sequence of * random numbers randMin <= v <= randMax *) val norm : rand -> real (* Map values in the range [randMin,randMax] to (0.0,1.0) *) val range : (int * int) -> rand -> int (* Map v, randMin <= v <= randMax, to integer range [i,j] * Exception - * Fail if j < i *) end (* RAND *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/rand.sml000066400000000000000000000037531416264345000227400ustar00rootroot00000000000000(* rand.sml * * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Random number generator taken from Paulson, pp. 170-171. * Recommended by Stephen K. Park and Keith W. Miller, * Random number generators: good ones are hard to find, * CACM 31 (1988), 1192-1201 * Updated to include the new preferred multiplier of 48271 * CACM 36 (1993), 105-110 * Updated to use on Word31. * * Note: The Random structure provides a better generator. * * TODO: provide a proper 64-bit implementation. *) structure Rand : RAND = struct type rand = Word.word type rand' = Int32.int (* internal representation *) val a : rand' = 48271 val m : rand' = 2147483647 (* 2^31 - 1 *) val m_1 = m - 1 val q = m div a val r = m mod a val extToInt = Int32.fromLarge o Word.toLargeInt val intToExt = Word.fromLargeInt o Int32.toLarge val randMin : rand = 0w1 val randMax : rand = intToExt m_1 fun chk 0w0 = 1 | chk 0wx7fffffff = m_1 | chk seed = extToInt seed fun random' seed = let val hi = seed div q val lo = seed mod q val test = a * lo - r * hi in if test > 0 then test else test + m end val random = intToExt o random' o chk fun mkRandom seed = let val seed = ref (chk seed) in fn () => (seed := random' (!seed); intToExt (!seed)) end val real_m = Real.fromLargeInt (Int32.toLarge m) fun norm s = (Real.fromLargeInt (Word.toLargeInt s)) / real_m fun range (i,j) = if j < i then LibBase.failure{module="Rand",func="range",msg="hi < lo"} else if j = i then fn _ => i else let val R = Int32.fromInt j - Int32.fromInt i val cvt = Word.toIntX o Word.fromLargeInt o Int32.toLarge in if R = m then Word.toIntX else fn s => i + cvt ((extToInt s) mod (R+1)) end end (* Rand *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/random-sig.sml000066400000000000000000000016111416264345000240430ustar00rootroot00000000000000(* random-sig.sml * * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) signature RANDOM = sig type rand (* the internal state of a random number generator *) val rand : (int * int) -> rand (* create rand from initial seed *) val toString : rand -> string val fromString : string -> rand (* convert state to and from string * fromString raises Fail if its argument * does not have the proper form. *) val randInt : rand -> int (* generate ints uniformly in [minInt,maxInt] *) val randNat : rand -> int (* generate ints uniformly in [0,maxInt] *) val randReal : rand -> real (* generate reals uniformly in [0.0,1.0) *) val randRange : (int * int) -> rand -> int (* randRange (lo,hi) generates integers uniformly [lo,hi]. * Raises Fail if hi < lo. *) end; (* RANDOM *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/random.sml000066400000000000000000000172251416264345000232730ustar00rootroot00000000000000(* random.sml * * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This package implements a random number generator using a subtract-with-borrow * (SWB) generator as described in Marsaglia and Zaman, "A New Class of Random Number * Generators," Ann. Applied Prob. 1(3), 1991, pp. 462-480. * * The SWB generator is a 31-bit generator with lags 48 and 8. It has period * (2^1487 - 2^247)/105 or about 10^445. In general, these generators are * excellent. However, they act locally like a lagged Fibonacci generator * and thus have troubles with the birthday test. Thus, we combine this SWB * generator with the linear congruential generator (48271*a)mod(2^31-1). * * Although the interface is fairly abstract, the implementation uses * 31-bit ML words. At some point, it might be good to use 32-bit words. *) structure Random : RANDOM = struct structure A = Array structure LW = LargeWord structure W8A = Word8Array structure W8V = Word8Vector structure P = PackWord32Big val << = Word.<< val >> = Word.>> val & = Word.andb val ++ = Word.orb val xorb = Word.xorb infix << >> & ++ val nbits = 31 (* bits per word *) val maxWord : Word.word = 0wx7FFFFFFF (* largest word *) val bit30 : Word.word = 0wx40000000 val lo30 : Word.word = 0wx3FFFFFFF val N = 48 val lag = 8 val offset = N-lag fun error (f,msg) = LibBase.failure {module="Random",func=f, msg=msg} val two2neg30 = 1.0/((real 0x8000)*(real 0x8000)) (* 2^~30 *) fun minus(x,y,false) = (x - y, y > x) | minus(x,y,true) = (x - y - 0w1, y >= x) datatype rand = RND of { vals : Word.word A.array,(* seed array *) borrow : bool ref, (* last borrow *) congx : Word.word ref, (* congruential seed *) index : int ref (* index of next available value in vals *) } (* We represent state as a string, starting with an initial * word acting as an magic cookie (with bit 0 determining the * value of borrow), followed by a word containing index and a word * containing congx, followed by the seed array. *) val numWords = 3 + N val magic : LW.word = 0wx72646e64 fun toString (RND{vals, borrow, congx, index}) = let val arr = W8A.array (4*numWords, 0w0) val word0 = if !borrow then LW.orb (magic, 0w1) else magic fun fill (src,dst) = if src = N then () else ( P.update (arr, dst, Word.toLargeWord (A.sub (vals, src))); fill (src+1,dst+1) ) in P.update (arr, 0, word0); P.update (arr, 1, LW.fromInt (!index)); P.update (arr, 2, Word.toLargeWord (!congx)); fill (0,3); Byte.bytesToString (W8A.vector arr) end fun fromString s = let val bytes = Byte.stringToBytes s val _ = if W8V.length bytes = 4 * numWords then () else error ("fromString","invalid state string") val word0 = P.subVec (bytes, 0) val _ = if LW.andb(word0, 0wxFFFFFFFE) = magic then () else error ("fromString","invalid state string") fun subVec i = P.subVec (bytes, i) val borrow = ref (LW.andb(word0,0w1) = 0w1) val index = ref (LW.toInt (subVec 1)) val congx = ref (Word.fromLargeWord (subVec 2)) val arr = A.array (N, 0w0 : Word.word) fun fill (src,dst) = if dst = N then () else ( A.update (arr, dst, Word.fromLargeWord (subVec src)); fill (src+1,dst+1) ) in fill (3, 0); RND{vals = arr, index = index, congx = congx, borrow = borrow} end (* linear congruential generator: * multiplication by 48271 mod (2^31 - 1) *) val a : Word.word = 0w48271 val m : Word.word = 0w2147483647 val q = m div a val r = m mod a fun lcg seed = let val left = a * (seed mod q) val right = r * (seed div q) in if left > right then left - right else (m - right) + left end (* Fill seed array using subtract-with-borrow generator: * x[n] = x[n-lag] - x[n-N] - borrow * Sets index to 1 and returns 0th value. *) fun fill (RND{vals,index,congx,borrow}) = let fun update (ix,iy,b) = let val (z,b') = minus(A.sub(vals,ix), A.sub(vals,iy),b) in A.update(vals,iy,z); b' end fun fillup (i,b) = if i = lag then b else fillup(i+1, update(i+offset,i,b)) fun fillup' (i,b) = if i = N then b else fillup'(i+1, update(i-lag,i,b)) in borrow := fillup' (lag, fillup (0,!borrow)); index := 1; A.sub(vals,0) end (* Create initial seed array and state of generator. * Fills the seed array one bit at a time by taking the leading * bit of the xor of a shift register and a congruential sequence. * The congruential generator is (c*48271) mod (2^31 - 1). * The shift register generator is c(I + L18)(I + R13). * The same congruential generator continues to be used as a * mixing generator with the SWB generator. *) fun rand (congy, shrgx) = let fun mki (i,c,s) = let val c' = lcg c val s' = xorb(s, s << 0w18) val s'' = xorb(s', s' >> 0w13) val i' = (lo30 & (i >> 0w1)) ++ (bit30 & xorb(c',s'')) in (i',c',s'') end fun iterate (0, v) = v | iterate (n, v) = iterate(n-1, mki v) fun mkseed (congx,shrgx) = iterate (nbits, (0w0,congx,shrgx)) fun genseed (0,seeds,congx,_) = (seeds,congx) | genseed (n,seeds,congx,shrgx) = let val (seed,congx',shrgx') = mkseed (congx,shrgx) in genseed(n-1,seed::seeds,congx',shrgx') end val congx = ((Word.fromInt congy & maxWord) << 0w1)+0w1 val (seeds,congx) = genseed(N,[],congx, Word.fromInt shrgx) in RND{vals = A.fromList seeds, index = ref 0, congx = ref congx, borrow = ref false} end (* Get next random number. The tweak function combines * the number from the SWB generator with a number from * the linear congruential generator. *) fun randWord (r as RND{vals, index,congx,...}) = let val idx = !index fun tweak i = let val c = lcg (!congx) in congx := c; xorb(i, c) end in if idx = N then tweak(fill r) else tweak(A.sub(vals,idx)) before index := idx+1 end fun randInt state = Word.toIntX(randWord state) fun randNat state = Word.toIntX(randWord state & lo30) fun randReal state = (real(randNat state) + real(randNat state) * two2neg30) * two2neg30 fun randRange (i,j) = if j < i then error ("randRange", "hi < lo") else let val R = two2neg30*real(j - i + 1) in fn s => i + trunc(R*real(randNat s)) end handle _ => let val ri = real i val R = (real j)-ri+1.0 in fn s => trunc(ri + R*(randReal s)) end end; (* Random *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/real-format.sml000066400000000000000000000134261416264345000242230ustar00rootroot00000000000000(* real-format.sml * * COPYRIGHT (c) 1992 by AT&T Bell Laboratories. * * Basic real to string conversions. This module is use internally, but is * not part of the exported library interface. It duplicates code in the * SML/NJ boot directory, but it is more portable not to rely on it. * * AUTHOR: Emden Gansner & John Reppy * AT&T Bell Laboratories * Murray Hill, NJ 07974 * erg@ulysses.att.com & jhr@research.att.com *) structure RealFormat : sig (* Low-level real to string conversion routines. For F and E format, the precision * specifies the number of fractional digits with 0's appended if necessary. * For G format, precision specifies the number of significant digits, but * trailing 0's in the fractional part are dropped. *) val realFFormat : (real * int) -> {sign : bool, mantissa : string} val realEFormat : (real * int) -> {sign : bool, mantissa : string, exp : int} val realGFormat : (real * int) -> {sign : bool, whole : string, frac : string, exp : int option} end = struct exception BadPrecision (* raised by real to string conversions, if the precision is < 0. *) fun zeroLPad (s, w) = StringCvt.padLeft #"0" w s fun zeroRPad (s, w) = StringCvt.padRight #"0" w s (* convert an integer between 0..9 to a single digit *) fun mkDigit (i : int) = String.sub("0123456789", i) (* decompose a non-zero real into a list of at most maxPrec significant digits * (the first digit non-zero), and integer exponent. The return value * (a::b::c..., exp) * is produced from real argument * a.bc... * (10 ^^ exp) * If the list would consist of all 9's, the list consisting of 1 followed by * all 0's is returned instead. *) val maxPrec = 15 fun decompose (f, e, precisionFn) = let fun scaleUp (x, e) = if (x < 1.0) then scaleUp(10.0*x, e-1) else (x, e) fun scaleDn (x, e) = if (x >= 10.0) then scaleDn(0.1*x, e+1) else (x, e) fun mkdigits (f, 0) = ([], if f < 5.0 then 0 else 1) | mkdigits (f, i) = let val d = floor f val (digits, carry) = mkdigits (10.0 * (f - real d), i - 1) val (digit, c) = (case (d, carry) of (9, 1) => (0, 1) | _ => (d + carry, 0) (* end case *)) in (digit::digits, c) end val (f, e) = if (f < 1.0) then scaleUp (f, e) else if (f >= 10.0) then scaleDn (f, e) else (f, e) val (digits, carry) = mkdigits(f, Int.max(0, Int.min(precisionFn e, maxPrec))) in case carry of 0 => (digits, e) | _ => (1::digits, e+1) end fun realFFormat (r, prec) = let fun pf e = e + prec + 1 fun rtoa (digits, e) = let fun doFrac (_, 0, l) = implode(rev l) | doFrac ([], p, l) = doFrac([], p-1, #"0"::l) | doFrac (hd::tl, p, l) = doFrac(tl, p-1, (mkDigit hd) :: l) fun doWhole ([], e, l) = if e >= 0 then doWhole ([], e-1, #"0" :: l) else if prec = 0 then implode(rev l) else doFrac ([], prec, #"." :: l) | doWhole (arg as (hd::tl), e, l) = if e >= 0 then doWhole(tl, e-1, (mkDigit hd) :: l) else if prec = 0 then implode(rev l) else doFrac(arg, prec, #"." :: l) fun doZeros (n, 0, l) = implode(rev l) | doZeros (1, p, l) = doFrac(digits, p, l) | doZeros (n, p, l) = doZeros(n-1, p-1, #"0" :: l) in if (e >= 0) then doWhole(digits, e, []) else if (prec = 0) then "0" else doZeros (~e, prec, [#".", #"0"]) end in if (prec < 0) then raise BadPrecision else (); if (r < 0.0) then {sign = true, mantissa = rtoa(decompose(~r, 0, pf))} else if (r > 0.0) then {sign=false, mantissa = rtoa(decompose(r, 0, pf))} else if (prec = 0) then {sign=false, mantissa = "0"} else {sign=false, mantissa = zeroRPad("0.", prec+2)} end (* realFFormat *) fun realEFormat (r, prec) = let fun pf _ = prec + 1 fun rtoa (sign, (digits, e)) = let fun mkRes (m, e) = {sign = sign, mantissa = m, exp = e} fun doFrac (_, 0, l) = implode(rev l) | doFrac ([], n, l) = zeroRPad(implode(rev l), n) | doFrac (hd::tl, n, l) = doFrac (tl, n-1, (mkDigit hd) :: l) in if (prec = 0) then mkRes(String.str(mkDigit(hd digits)), e) else mkRes(doFrac(tl digits, prec, [#".", mkDigit(hd digits)]), e) end in if (prec < 0) then raise BadPrecision else (); if (r < 0.0) then rtoa (true, decompose(~r, 0, pf)) else if (r > 0.0) then rtoa (false, decompose(r, 0, pf)) else if (prec = 0) then {sign = false, mantissa = "0", exp = 0} else {sign = false, mantissa = zeroRPad("0.", prec+2), exp=0} end (* realEFormat *) fun realGFormat (r, prec) = let fun pf _ = prec fun rtoa (sign, (digits, e)) = let fun mkRes (w, f, e) = {sign = sign, whole = w, frac = f, exp = e} fun doFrac [] = [] | doFrac (0::tl) = (case doFrac tl of [] => [] | rest => #"0" :: rest (* end case *)) | doFrac (hd::tl) = (mkDigit hd) :: (doFrac tl) fun doWhole ([], e, wh) = if e >= 0 then doWhole([], e-1, #"0"::wh) else mkRes(implode(rev wh), "", NONE) | doWhole (arg as (hd::tl), e, wh) = if e >= 0 then doWhole(tl, e-1, (mkDigit hd)::wh) else mkRes(implode(rev wh), implode(doFrac arg), NONE) in if (e < ~4) orelse (e >= prec) then mkRes( String.str(mkDigit(hd digits)), implode(doFrac(tl digits)), SOME e) else if e >= 0 then doWhole(digits, e, []) else let val frac = implode(doFrac digits) in mkRes("0", zeroLPad(frac, (size frac) + (~1 - e)), NONE) end end in if (prec < 1) then raise BadPrecision else (); if (r < 0.0) then rtoa(true, decompose(~r, 0, pf)) else if (r > 0.0) then rtoa(false, decompose(r, 0, pf)) else {sign=false, whole="0", frac="", exp=NONE} end (* realGFormat *) end (* RealFormat *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/real-order-stats.sml000066400000000000000000000047071416264345000252040ustar00rootroot00000000000000(* real-order-stats.sml * * Randomized linear-time selection from an unordered sample. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure RealOrderStats : sig (* WARNING: Each of the functions exported from this module * modifies its argument array by (partially) sorting it. *) (* select the i-th order statistic *) val select : real array * int -> real val select' : real ArraySlice.slice * int -> real (* calculate the median: * if N is odd, then this is the (floor(N/2))th order statistic * otherwise it is the average of (N/2-1)th and (N/2)th *) val median : real array -> real val median' : real ArraySlice.slice -> real end = struct infix 8 $ val op $ = Unsafe.Array.sub infix 3 <- fun (a, i) <- x = Unsafe.Array.update (a, i, x) (* initialize random number generator *) val rand = Random.rand (123, 73256) (* select i-th order statistic from unsorted array with * starting point p and ending point r (inclusive): *) fun select0 (a: real array, p, r, i) = let fun x + y = Word.toIntX (Word.+ (Word.fromInt x, Word.fromInt y)) fun x - y = Word.toIntX (Word.- (Word.fromInt x, Word.fromInt y)) (* random partition: *) fun rp (p, r) = let fun sw(i,j) = let val t=a$i in (a,i)<-a$j; (a,j)<-t end val q = Random.randRange (p, r) rand val qv = a$q val _ = if q<>p then ((a,q)<-a$p; (a,p)<-qv) else () fun up i = if i>r orelse qv < a$i then i else up(i+1) fun dn i = if i>=p andalso qv < a$i then dn(i-1) else i fun lp (i, j) = let val (i, j) = (up i, dn j) in if i>j then let val q' = i-1 in sw(p,q'); (q',qv) end else (sw(i,j); lp (i+1, j-1)) end in lp (p+1, r) end (* random select: *) fun rs (p, r) = if p=r then a$r else let val (q, qv) = rp (p, r) in if i=q then qv else if i=mid then m else l(i+1, Real.max(a$i,m)) in if len mod 2 = 1 then m0 else (l(p+1,a$p) + m0) / 2.0 end fun median a = median0 (a, 0, Array.length a) fun median' s = median0 (ArraySlice.base s) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/redblack-map-fn.sml000066400000000000000000000534211416264345000247340ustar00rootroot00000000000000(* redblack-map-fn.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) functor RedBlackMapFn (K : ORD_KEY) :> ORD_MAP where type Key.ord_key = K.ord_key = struct structure Key = K datatype color = R | B datatype 'a tree = E | T of (color * 'a tree * K.ord_key * 'a * 'a tree) datatype 'a map = MAP of (int * 'a tree) fun isEmpty (MAP(_, E)) = true | isEmpty _ = false val empty = MAP(0, E) fun singleton (xk, x) = MAP(1, T(B, E, xk, x, E)) fun insert (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = (case K.compare(xk, yk) of LESS => (case a of T(R, c, zk, z, d) => (case K.compare(xk, zk) of LESS => (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk, w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | EQUAL => T(color, T(R, c, xk, x, d), yk, y, b) | GREATER => (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) | EQUAL => T(color, a, xk, x, b) | GREATER => (case b of T(R, c, zk, z, d) => (case K.compare(xk, zk) of LESS => (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | EQUAL => T(color, a, yk, y, T(R, c, xk, x, d)) | GREATER => (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insert' ((xk, x), m) = insert (m, xk, x) fun insertWithi comb (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = (case K.compare(xk, yk) of LESS => (case a of T(R, c, zk, z, d) => (case K.compare(xk, zk) of LESS => (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk, w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | EQUAL => let val x' = comb(xk, z, x) in T(color, T(R, c, xk, x', d), yk, y, b) end | GREATER => (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) | EQUAL => T(color, a, xk, comb(xk, y, x), b) | GREATER => (case b of T(R, c, zk, z, d) => (case K.compare(xk, zk) of LESS => (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | EQUAL => let val x' = comb(xk, z, x) in T(color, a, yk, y, T(R, c, xk, x', d)) end | GREATER => (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) (* Is a key in the domain of the map? *) fun inDomain (MAP(_, t), k) = let fun find' E = false | find' (T(_, a, yk, y, b)) = (case K.compare(k, yk) of LESS => find' a | EQUAL => true | GREATER => find' b (* end case *)) in find' t end (* Look for an item, return NONE if the item doesn't exist *) fun find (MAP(_, t), k) = let fun find' E = NONE | find' (T(_, a, yk, y, b)) = (case K.compare(k, yk) of LESS => find' a | EQUAL => SOME y | GREATER => find' b (* end case *)) in find' t end (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (MAP(_, t), k) = let fun look E = raise LibBase.NotFound | look (T(_, a, yk, y, b)) = (case K.compare(k, yk) of LESS => look a | EQUAL => y | GREATER => look b (* end case *)) in look t end (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) local datatype 'a zipper = TOP | LEFT of (color * K.ord_key * 'a * 'a tree * 'a zipper) | RIGHT of (color * 'a tree * K.ord_key * 'a * 'a zipper) in fun remove (MAP(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, xk, x, b, z), a) = zip(z, T(color, a, xk, x, b)) | zip (RIGHT(color, a, xk, x, z), b) = zip(z, T(color, a, xk, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, xk, x, T(R, a, yk, y, b), p), t) = (case a of T(_, T(R, a11, wk, w, a12), zk, z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a11), wk, w, T(B, a12, zk, z, a2)), yk, y, b))) | T(_, a1, zk, z, T(R, a21, wk, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a1), zk, z, T(B, a21, wk, w, t22)), yk, y, b))) | T(_, a1, zk, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, xk, x, T(R, a1, zk, z, a2)), yk, y, b))) | _ => fixupZip (LEFT(R, xk, x, a, LEFT(B, yk, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, xk, x, b), yk, y, p), t) = (case b of T(_, b1, zk, z, T(R, b21, wk, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b1, zk, z, b21), wk, w, T(B, b22, yk, y, t))))) | T(_, T(R, b11, wk, w, b12), zk, z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b11, wk, w, b12), zk, z, T(B, b2, yk, y, t))))) | T(_, b1, zk, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, xk, x, T(B, T(R, b1, zk, z, b2), yk, y, t)))) | _ => fixupZip (RIGHT(R, b, yk, y, RIGHT(B, a, xk, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, T(R, a1, yk, y, a2), zk, z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, xk, x, a1), yk, y, T(B, a2, zk, z, b)))) | fixupZip (RIGHT(color, T(B, a, xk, x, T(R, b1, yk, y, b2)), zk, z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, xk, x, b1), yk, y, T(B, b2, zk, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, a, yk, y, T(R, b1, zk, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, xk, x, a), yk, y, T(B, b1, zk, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, zk, z, a2), xk, x, b), yk, y, p), t) = (false, zip (p, T(color, T(B, a1, zk, z, a2), xk, x, T(B, b, yk, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, xk, x, T(B, a, yk, y, b), p), t) = (false, zip (p, T(B, t, xk, x, T(R, a, yk, y, b)))) | fixupZip (LEFT(B, xk, x, T(B, a, yk, y, b), p), t) = fixupZip (p, T(B, t, xk, x, T(R, a, yk, y, b))) | fixupZip (RIGHT(R, T(B, a, xk, x, b), yk, y, p), t) = (false, zip (p, T(B, T(R, a, xk, x, b), yk, y, t))) | fixupZip (RIGHT(B, T(B, a, xk, x, b), yk, y, p), t) = fixupZip (p, T(B, T(R, a, xk, x, b), yk, y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, yk, y, E, p), t) = fixupZip (p, T(R, t, yk, y, E)) | fixupZip (RIGHT(_, E, yk, y, p), t) = fixupZip (p, T(R, E, yk, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a 4-tuple * (key, elem, bd, tr), where key is the minimum key, elem is the element * named by key, tr is the residual tree with elem removed, and bd is true * if tr has a black-depth that is less than the original tree. *) fun delMin (T(R, E, yk, y, b), p) = (* replace the node by its right subtree (which must be E) *) (yk, y, false, zip(p, b)) | delMin (T(B, E, yk, y, T(R, a', yk', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (yk, y, false, zip (p, T(B, a', yk', y', b'))) | delMin (T(B, E, yk, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (yk, y, blkDeficit, t) end | delMin (T(color, a, yk, y, b), z) = delMin(a, LEFT(color, yk, y, b, z)) | delMin (E, _) = raise Match fun del (E, p) = raise LibBase.NotFound | del (T(color, a, yk, y, b), p) = (case K.compare(k, yk) of LESS => del (a, LEFT(color, yk, y, b, p)) | EQUAL => (case (color, a, b) of (R, E, E) => (y, zip(p, E)) | (B, E, E) => (y, #2 (fixupZip (p, E))) | (_, T(_, a', yk', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | (_, E, T(_, a', yk', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | _ => let val (minKey, minElem, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then (y, #2 (fixupZip (RIGHT(color, a, minKey, minElem, p), b))) else (y, zip (p, T(color, a, minKey, minElem, b))) end (* end case *)) | GREATER => del (b, RIGHT(color, a, yk, y, p)) (* end case *)) val (item, t) = del(t, TOP) in case t of T(R, a, xk, x, b) => (MAP(nItems-1, T(B, a, xk, x, b)), item) | t => (MAP(nItems-1, t), item) (* end case *) end end (* local *) (* return the first item in the map (or NONE if it is empty) *) fun first (MAP(_, t)) = let fun f E = NONE | f (T(_, E, _, x, _)) = SOME x | f (T(_, a, _, _, _)) = f a in f t end fun firsti (MAP(_, t)) = let fun f E = NONE | f (T(_, E, xk, x, _)) = SOME(xk, x) | f (T(_, a, _, _, _)) = f a in f t end (* Return the number of items in the map *) fun numItems (MAP(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldli f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(b, f(xk, x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldri f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(a, f(xk, x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun listItems m = foldr (op ::) [] m fun listItemsi m = foldri (fn (xk, x, l) => (xk, x)::l) [] m (* return an ordered list of the keys in the map. *) fun listKeys m = foldri (fn (k, _, l) => k::l) [] m (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* given an ordering on the map's range, return an ordering * on the map. *) fun collate cmpRng = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of EQUAL => (case cmpRng(x, y) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in fn (MAP(_, m1), MAP(_, m2)) => cmp (start m1, start m2) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype 'a digit = ZERO | ONE of (K.ord_key * 'a * 'a tree * 'a digit) | TWO of (K.ord_key * 'a * 'a tree * K.ord_key * 'a * 'a tree * 'a digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (ak, a, l) = let fun incr (ak, a, t, ZERO) = ONE(ak, a, t, ZERO) | incr (ak1, a1, t1, ONE(ak2, a2, t2, r)) = TWO(ak1, a1, t1, ak2, a2, t2, r) | incr (ak1, a1, t1, TWO(ak2, a2, t2, ak3, a3, t3, r)) = ONE(ak1, a1, t1, incr(ak2, a2, T(B, t3, ak3, a3, t2), r)) in incr(ak, a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(ak, a, t2, r)) = link(T(B, t2, ak, a, t1), r) | link (t, TWO(ak1, a1, t1, ak2, a2, t2, r)) = link(T(B, T(R, t2, ak2, a2, t1), ak1, a1, t), r) in link (E, t) end local fun wrap f (MAP(_, m1), MAP(_, m2)) = let val (n, result) = f (start m1, start m2, 0, ZERO) in MAP(n, linkAll result) end fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, xk, x, _), r), n, result) = ins(next r, n+1, addItem(xk, x, result)) in (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) fun unionWith mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => union (r1, t2, n+1, addItem(xk, x, result)) | EQUAL => union (r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) | GREATER => union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) (* end case *)) in wrap union end fun unionWithi mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => union (r1, t2, n+1, addItem(xk, x, result)) | EQUAL => union ( r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) | GREATER => union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) (* end case *)) in wrap union end (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) fun intersectWith mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => intersect (r1, t2, n, result) | EQUAL => intersect (r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) | GREATER => intersect (t1, r2, n, result) (* end case *)) | _ => (n, result) (* end case *)) in wrap intersect end fun intersectWithi mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => intersect (r1, t2, n, result) | EQUAL => intersect (r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) | GREATER => intersect (t1, r2, n, result) (* end case *)) | _ => (n, result) (* end case *)) in wrap intersect end fun mergeWith mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => mergef(xk, SOME x, NONE, r1, t2, n, result) | EQUAL => mergef(xk, SOME x, SOME y, r1, r2, n, result) | GREATER => mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end fun mergeWithi mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => ( case Key.compare(xk, yk) of LESS => mergef(xk, SOME x, NONE, r1, t2, n, result) | EQUAL => mergef(xk, SOME x, SOME y, r1, r2, n, result) | GREATER => mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(k, x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end end (* local *) fun app f = let fun appf E = () | appf (T(_, a, _, x, b)) = (appf a; f x; appf b) in fn (MAP(_, m)) => appf m end fun appi f = let fun appf E = () | appf (T(_, a, xk, x, b)) = (appf a; f(xk, x); appf b) in fn (MAP(_, m)) => appf m end fun map f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f x, mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end fun mapi f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f(xk, x), mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end fun filteri pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred(xk, x)) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end (* map a partial function over the elements of a map in increasing * map order. *) fun mapPartial f = let fun f' (xk, x, m) = (case f x of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end fun mapPartiali f = let fun f' (xk, x, m) = (case f(xk, x) of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' E = false | exists' (T(_, a, _, x, b)) = exists' a orelse pred x orelse exists' b in fn (MAP(_, m)) => exists' m end fun existsi pred = let fun exists' E = false | exists' (T(_, a, k, x, b)) = exists' a orelse pred(k, x) orelse exists' b in fn (MAP(_, m)) => exists' m end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' E = true | all' (T(_, a, _, x, b)) = all' a andalso pred x andalso all' b in fn (MAP(_, m)) => all' m end fun alli pred = let fun all' E = true | all' (T(_, a, k, x, b)) = all' a andalso pred(k, x) andalso all' b in fn (MAP(_, m)) => all' m end end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/redblack-set-fn.sml000066400000000000000000000415411416264345000247520ustar00rootroot00000000000000(* redblack-set-fn.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) functor RedBlackSetFn (K : ORD_KEY) :> ORD_SET where type Key.ord_key = K.ord_key = struct structure Key = K type item = K.ord_key datatype color = R | B datatype tree = E | T of (color * tree * item * tree) datatype set = SET of (int * tree) fun isEmpty (SET(_, E)) = true | isEmpty _ = false val empty = SET(0, E) fun minItem (SET(_, tr)) = let fun min E = raise Empty | min (T(_, E, item, _)) = item | min (T(_, tr, _, _)) = min tr in min tr end fun maxItem (SET(_, tr)) = let fun max E = raise Empty | max (T(_, _, item, E)) = item | max (T(_, _, _, tr)) = max tr in max tr end fun singleton x = SET(1, T(B, E, x, E)) fun add (SET(nItems, m), x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, x, E)) | ins (s as T(color, a, y, b)) = (case K.compare(x, y) of LESS => (case a of T(R, c, z, d) => (case K.compare(x, z) of LESS => (case ins c of T(R, e, w, f) => T(R, T(B,e,w,f), z, T(B,d,y,b)) | c => T(B, T(R,c,z,d), y, b) (* end case *)) | EQUAL => T(color, T(R, c, x, d), y, b) | GREATER => (case ins d of T(R, e, w, f) => T(R, T(B,c,z,e), w, T(B,f,y,b)) | d => T(B, T(R,c,z,d), y, b) (* end case *)) (* end case *)) | _ => T(B, ins a, y, b) (* end case *)) | EQUAL => T(color, a, x, b) | GREATER => (case b of T(R, c, z, d) => (case K.compare(x, z) of LESS => (case ins c of T(R, e, w, f) => T(R, T(B,a,y,e), w, T(B,f,z,d)) | c => T(B, a, y, T(R,c,z,d)) (* end case *)) | EQUAL => T(color, a, y, T(R, c, x, d)) | GREATER => (case ins d of T(R, e, w, f) => T(R, T(B,a,y,c), z, T(B,e,w,f)) | d => T(B, a, y, T(R,c,z,d)) (* end case *)) (* end case *)) | _ => T(B, a, y, ins b) (* end case *)) (* end case *)) val T(_, a, y, b) = ins m in SET(!nItems', T(B, a, y, b)) end fun add' (x, m) = add (m, x) fun addList (s, []) = s | addList (s, x::r) = addList(add(s, x), r) (* Remove an item. Raises LibBase.NotFound if not found. *) local datatype zipper = TOP | LEFT of (color * item * tree * zipper) | RIGHT of (color * tree * item * zipper) in fun delete (SET(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, x, b, p), a) = zip(p, T(color, a, x, b)) | zip (RIGHT(color, a, x, p), b) = zip(p, T(color, a, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, x, T(R, a, y, b), p), t) = (case a of T(_, T(R, a11, w, a12), z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a11), w, T(B, a12, z, a2)), y, b))) | T(_, a1, z, T(R, a21, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a1), z, T(B, a21, w, t22)), y, b))) | T(_, a1, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, x, T(R, a1, z, a2)), y, b))) | _ => fixupZip (LEFT(R, x, a, LEFT(B, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, x, b), y, p), t) = (case b of T(_, b1, z, T(R, b21, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b1, z, b21), w, T(B, b22, y, t))))) | T(_, T(R, b11, w, b12), z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b11, w, b12), z, T(B, b2, y, t))))) | T(_, b1, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, x, T(B, T(R, b1, z, b2), y, t)))) | _ => fixupZip (RIGHT(R, b, y, RIGHT(B, a, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, x, T(B, T(R, a1, y, a2), z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, x, a1), y, T(B, a2, z, b)))) | fixupZip (RIGHT(color, T(B, a, x, T(R, b1, y, b2)), z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, x, b1), y, T(B, b2, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, x, T(B, a, y, T(R, b1, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, x, a), y, T(B, b1, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, z, a2), x, b), y, p), t) = (false, zip (p, T(color, T(B, a1, z, a2), x, T(B, b, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, x, T(B, a, y, b), p), t) = (false, zip (p, T(B, t, x, T(R, a, y, b)))) | fixupZip (LEFT(B, x, T(B, a, y, b), p), t) = fixupZip (p, T(B, t, x, T(R, a, y, b))) | fixupZip (RIGHT(R, T(B, a, x, b), y, p), t) = (false, zip (p, T(B, T(R, a, x, b), y, t))) | fixupZip (RIGHT(B, T(B, a, x, b), y, p), t) = fixupZip (p, T(B, T(R, a, x, b), y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, y, E, p), t) = fixupZip (p, T(R, t, y, E)) | fixupZip (RIGHT(_, E, y, p), t) = fixupZip (p, T(R, E, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a triple * (elem, bd, tr), where elem is the minimum element, tr is the residual * tree with elem removed, and bd is true if tr has a black-depth that is * less than the original tree. *) fun delMin (T(R, E, y, b), p) = (* replace the node by its right subtree (which must be E) *) (y, false, zip(p, b)) | delMin (T(B, E, y, T(R, a', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (y, false, zip (p, T(B, a', y', b'))) | delMin (T(B, E, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (y, blkDeficit, t) end | delMin (T(color, a, y, b), z) = delMin(a, LEFT(color, y, b, z)) | delMin (E, _) = raise Match fun del (E, z) = raise LibBase.NotFound | del (T(color, a, y, b), p) = (case K.compare(k, y) of LESS => del (a, LEFT(color, y, b, p)) | EQUAL => (case (color, a, b) of (R, E, E) => zip(p, E) | (B, E, E) => #2 (fixupZip (p, E)) | (_, T(_, a', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) zip(p, T(B, a', y', b')) | (_, E, T(_, a', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) zip(p, T(B, a', y', b')) | _ => let val (minSucc, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then #2 (fixupZip (RIGHT(color, a, minSucc, p), b)) else zip (p, T(color, a, minSucc, b)) end (* end case *)) | GREATER => del (b, RIGHT(color, a, y, p)) (* end case *)) in case del(t, TOP) of T(R, a, x, b) => SET(nItems-1, T(B, a, x, b)) | t => SET(nItems-1, t) (* end case *) end end (* local *) (* Return true if and only if item is an element in the set *) fun member (SET(_, t), k) = let fun find' E = false | find' (T(_, a, y, b)) = (case K.compare(k, y) of LESS => find' a | EQUAL => true | GREATER => find' b (* end case *)) in find' t end (* Return the number of items in the map *) fun numItems (SET(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end (* return an ordered list of the items in the set. *) fun toList s = foldr (fn (x, l) => x::l) [] s (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* Return true if and only if the two sets are equal *) fun equal (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => false | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of EQUAL => cmp (r1, r2) | _ => false (* end case *)) (* end case *)) in cmp (start s1, start s2) end (* Return the lexical order of two sets *) fun compare (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (start s1, start s2) end (* Return true if and only if the first set is a subset of the second *) fun isSubset (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => true | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of LESS => false | EQUAL => cmp (r1, r2) | GREATER => cmp (t1, r2) (* end case *)) (* end case *)) in cmp (start s1, start s2) end (* Return true if the two sets are disjoint *) fun disjoint (SET(0, _), _) = true | disjoint (_, SET(0, _)) = true | disjoint (SET(_, s1), SET(_, s2)) = let fun walk ((E, _), _) = true | walk (_, (E, _)) = true | walk (t1 as (T(_, _, x, _), r1), t2 as (T(_, _, y, _), r2)) = ( case Key.compare(x, y) of LESS => walk (next r1, t2) | EQUAL => false | GREATER => walk (t1, next r2) (* end case *)) in walk (next (start s1), next (start s2)) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype digit = ZERO | ONE of (item * tree * digit) | TWO of (item * tree * item * tree * digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (a, l) = let fun incr (a, t, ZERO) = ONE(a, t, ZERO) | incr (a1, t1, ONE(a2, t2, r)) = TWO(a1, t1, a2, t2, r) | incr (a1, t1, TWO(a2, t2, a3, t3, r)) = ONE(a1, t1, incr(a2, T(B, t3, a3, t2), r)) in incr(a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(a, t2, r)) = link(T(B, t2, a, t1), r) | link (t, TWO(a1, t1, a2, t2, r)) = link(T(B, T(R, t2, a2, t1), a1, t), r) in link (E, t) end (* create a set from a list of items; this function works in linear time if the list * is in increasing order. *) fun fromList [] = empty | fromList (first::rest) = let fun add (prev, x::xs, n, accum) = (case Key.compare(prev, x) of LESS => add(x, xs, n+1, addItem(x, accum)) | _ => (* list not in order, so fall back to addList code *) addList(SET(n, linkAll accum), x::xs) (* end case *)) | add (_, [], n, accum) = SET(n, linkAll accum) in add (first, rest, 1, addItem(first, ZERO)) end (* return the union of the two sets *) fun union (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun union' (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of LESS => union' (r1, t2, n+1, addItem(x, result)) | EQUAL => union' (r1, r2, n+1, addItem(x, result)) | GREATER => union' (t1, r2, n+1, addItem(y, result)) (* end case *)) (* end case *)) val (n, result) = union' (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the intersection of the two sets *) fun intersection (SET(_, s1), SET(_, s2)) = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of LESS => intersect (r1, t2, n, result) | EQUAL => intersect (r1, r2, n+1, addItem(x, result)) | GREATER => intersect (t1, r2, n, result) (* end case *)) | _ => (n, result) (* end case *)) val (n, result) = intersect (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the set difference *) fun difference (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun diff (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), _) => (n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ( case Key.compare(x, y) of LESS => diff (r1, t2, n+1, addItem(x, result)) | EQUAL => diff (r1, r2, n, result) | GREATER => diff (t1, r2, n, result) (* end case *)) (* end case *)) val (n, result) = diff (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) (SET(0, E)) items in difference (l, items') end fun app f = let fun appf E = () | appf (T(_, a, x, b)) = (appf a; f x; appf b) in fn (SET(_, m)) => appf m end fun map f = let fun addf (x, m) = add(m, f x) in foldl addf empty end fun mapPartial f = let fun f' (x, acc) = (case f x of SOME x' => add(acc, x') | NONE => acc) in foldl f' empty end (* Filter out those elements of the set that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (SET(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in SET(n, linkAll result) end fun partition pred (SET(_, t)) = let fun walk (E, n1, result1, n2, result2) = (n1, result1, n2, result2) | walk (T(_, a, x, b), n1, result1, n2, result2) = let val (n1, result1, n2, result2) = walk(a, n1, result1, n2, result2) in if (pred x) then walk(b, n1+1, addItem(x, result1), n2, result2) else walk(b, n1, result1, n2+1, addItem(x, result2)) end val (n1, result1, n2, result2) = walk (t, 0, ZERO, 0, ZERO) in (SET(n1, linkAll result1), SET(n2, linkAll result2)) end fun exists pred = let fun test E = false | test (T(_, a, x, b)) = test a orelse pred x orelse test b in fn (SET(_, t)) => test t end fun all pred = let fun test E = true | test (T(_, a, x, b)) = test a andalso pred x andalso test b in fn (SET(_, t)) => test t end fun find pred = let fun test E = NONE | test (T(_, a, x, b)) = (case test a of NONE => if pred x then SOME x else test b | someItem => someItem (* end case *)) in fn (SET(_, t)) => test t end (* DEPRECATED FUNCTIONS *) val listItems = toList end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/scan-sig.sml000066400000000000000000000021321416264345000235060ustar00rootroot00000000000000(* scan-sig.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * C-style conversions from string representations. * * TODO: replace the fmt_item type with a datatype that reflects the more * limited set of possible results. Also replace the shared implementation * of format-string processing with processing that is specific to scanning. *) signature SCAN = sig datatype fmt_item = ATOM of Atom.atom | LINT of LargeInt.int | INT of Int.int | LWORD of LargeWord.word | WORD of Word.word | WORD8 of Word8.word | BOOL of bool | CHR of char | STR of string | REAL of Real.real | LREAL of LargeReal.real | LEFT of (int * fmt_item) (* left justify in field of given width *) | RIGHT of (int * fmt_item) (* right justify in field of given width *) exception BadFormat (* bad format string *) val sscanf : string -> string -> fmt_item list option val scanf : string -> (char, 'a) StringCvt.reader -> (fmt_item list, 'a) StringCvt.reader end (* SCAN *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/scan.sml000066400000000000000000000115251416264345000227340ustar00rootroot00000000000000(* scan.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * C-style conversions from string representations. * * TODO: replace the fmt_item type with a datatype that reflects the more * limited set of possible results. Also replace the shared implementation * of format-string processing with processing that is specific to scanning. *) structure Scan : SCAN = struct structure SS = Substring structure SC = StringCvt open FmtFields (* character sets *) abstype charset = CS of Word8Array.array with fun mkCharSet () = CS(Word8Array.array(Char.maxOrd+1, 0w0)) fun addChar (CS ba, c) = Word8Array.update(ba, Char.ord c, 0w1) fun addRange (CS ba, c1, c2) = let val ord_c2 = Char.ord c2 fun add i = if (i <= ord_c2) then (Word8Array.update(ba, i, 0w1); add(i+1)) else () in if (c1 <= c2) then (add(Char.ord c1)) else raise BadFormat end fun inSet (CS ba) arg = (Word8Array.sub(ba, Char.ord arg) = 0w1) fun notInSet (CS ba) arg = (Word8Array.sub(ba, Char.ord arg) = 0w0) end fun scanCharSet fmtStr = let val cset = mkCharSet() val (isNot, fmtStr) = (case SS.getc fmtStr of (SOME(#"^", ss)) => (true, ss) | _ => (false, fmtStr) (* end case *)) fun scan (nextChar, ss) = (case (SS.getc ss) of (SOME(#"-", ss)) => (case (SS.getc ss) of (SOME(#"]", ss)) => ( addChar(cset, nextChar); addChar(cset, #"-"); ss) | (SOME(c, ss)) => ( addRange(cset, nextChar, c); scanNext ss) | NONE => raise BadFormat (* end case *)) | (SOME(#"]", ss)) => (addChar(cset, nextChar); ss) | (SOME(c, ss)) => (addChar(cset, nextChar); scan(c, ss)) | NONE => raise BadFormat (* end case *)) and scanNext ss = (case (SS.getc ss) of (SOME(#"-", ss)) => raise BadFormat | (SOME(#"]", ss)) => ss | (SOME(c, ss)) => scan(c, ss) | NONE => raise BadFormat (* end case *)) and scanChar (SOME arg) = scan arg | scanChar NONE = raise BadFormat val fmtStr = scanChar (SS.getc fmtStr) in if isNot then (CharSet(notInSet cset), fmtStr) else (CharSet(inSet cset), fmtStr) end fun compileScanFormat str = let val split = SS.splitl (Char.notContains "\n\t %[") fun scan (ss, l) = if (SS.isEmpty ss) then rev l else let val (ss1, ss2) = split ss in case (SS.getc ss2) of (SOME(#"%", ss')) => let val (field, ss3) = scanField ss' in scan(ss3, field :: (Raw ss1) :: l) end | (SOME(#"[", ss')) => let val (cs, ss3) = scanCharSet ss' in scan (ss3, cs :: (Raw ss1) :: l) end | (SOME(_, ss')) => scan (SS.dropl Char.isSpace ss', (Raw ss1) :: l) | NONE => rev((Raw ss1)::l) (* end case *) end in scan (SS.full str, []) end (** NOTE: for the time being, this function ignores flags and field width **) fun scanf fmt getc strm = let val fmts = compileScanFormat fmt val skipWS = SC.dropl Char.isSpace getc fun scan (strm, [], items) = SOME(rev items, strm) | scan (strm, (Raw ss)::rf, items) = let fun match (strm, ss) = (case (getc strm, SS.getc ss) of (SOME(c', strm'), SOME(c, ss)) => if (c' = c) then match (strm', ss) else NONE | (_, NONE) => scan (strm, rf, items) | _ => NONE (* end case *)) in match (skipWS strm, ss) end | scan (strm, (CharSet pred)::rf, items) = let fun scanSet strm = (case (getc strm) of (SOME(c, strm')) => if (pred c) then scanSet strm' else strm | NONE => strm (* end case *)) in scan (scanSet strm, rf, items) end | scan (strm, Field(flags, wid, ty)::rf, items) = let val strm = skipWS strm fun next (con, SOME(x, strm')) = scan (strm', rf, con(x)::items) | next _ = NONE fun getInt fmt = if (#large flags) then next(LINT, LargeInt.scan fmt getc strm) else next(INT, Int.scan fmt getc strm) in case ty of OctalField => getInt SC.OCT | IntField => getInt SC.DEC | HexField => getInt SC.HEX | CapHexField => getInt SC.HEX | CharField => next(CHR, getc strm) | BoolField => next(BOOL, Bool.scan getc strm) (* QUESTION: should we use the precision? *) | StrField prec => let val notSpace = not o Char.isSpace val pred = (case wid of NoPad => notSpace | (Wid n) => let val cnt = ref n in fn c => (case !cnt of 0 => false | n => (cnt := n-1; notSpace c) (* end case *)) end (* end case *)) val (s, strm) = SC.splitl pred getc strm in scan (strm, rf, STR s :: items) end | (RealField _) => next(REAL, LargeReal.scan getc strm) (* end case *) end in scan(strm, fmts, []) end (* scanf *) fun sscanf fmt = SC.scanString (scanf fmt) end (* Scan *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/simple-uref.sml000066400000000000000000000020061416264345000242320ustar00rootroot00000000000000(* simple-uref.sml * * UNIONFIND DATA STRUCTURE WITH PATH COMPRESSION * * Author: * Fritz Henglein * DIKU, University of Copenhagen * henglein@diku.dk *) structure SimpleURef : UREF = struct exception UnionFind of string datatype 'a urefC = ECR of 'a | PTR of 'a uref withtype 'a uref = 'a urefC ref fun find (p as ref(ECR _)) = p | find (p as ref(PTR p')) = let val p'' = find p' in p := PTR p''; p'' end fun uRef x = ref (ECR x) fun !! p = (case !(find p) of ECR x => x | _ => raise Match (* end case *)) fun equal (p, p') = (find p = find p') fun update (p, x) = let val p' = find p in p' := ECR x end fun link (p, q) = let val p' = find p val q' = find q in if p' = q' then false else (p' := PTR q'; true) end val union = link fun unify f (p, q) = let val v = f(!!p, !!q) in union (p, q) before update (q, v) end end (* SimpleURef *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/smlnj-lib.cm000066400000000000000000000106251416264345000235030ustar00rootroot00000000000000(* smlnj-lib.cm * * COPYRIGHT (c) 2011 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * The sources specification for the SML/NJ Utility library; part of the * SML/NJ Library suite. *) Library signature ARRAY_SORT signature ATOM signature BASE64 signature BIT_ARRAY signature CHAR_MAP signature DYNAMIC_ARRAY signature FIFO signature FORMAT signature FORMAT_COMB signature GRAPH_SCC signature HASH_KEY signature HASH_TABLE signature INTERVAL_DOMAIN signature INTERVAL_SET signature IO_UTIL signature GET_OPT signature LIB_BASE signature LIST_FORMAT signature LIST_SORT signature LIST_XPROD signature MONO_ARRAY_SORT signature MONO_DYNAMIC_ARRAY signature MONO_HASH_SET signature MONO_HASH_TABLE signature MONO_HASH2_TABLE signature MONO_PRIORITYQ signature ORD_KEY signature ORD_MAP signature ORD_SET signature PARSER_COMB signature PATH_UTIL signature PRIORITY signature PROP_LIST signature QUEUE signature RAND signature RANDOM signature SCAN signature SPLAY_TREE signature UREF signature UTF8 structure ANSITerm structure ArrayQSort structure Atom structure AtomBinaryMap (* to be removed *) structure AtomBinarySet (* to be removed *) structure AtomRedBlackMap structure AtomRedBlackSet structure AtomMap structure AtomSet structure AtomTable structure Base64 structure BitArray structure CharMap structure DynamicArray structure Fifo structure FNVHash structure Format structure FormatComb structure HashString structure HashTable structure IntBinaryMap (* to be removed *) structure IntBinarySet (* to be removed *) structure IntHashTable structure IntListMap structure IntListSet structure IntRedBlackMap structure IntRedBlackSet structure IOUtil structure GetOpt structure LibBase structure ListFormat structure ListMergeSort structure ListXProd structure ParserComb structure PathUtil structure PrimeSizes structure PropList structure Queue structure Rand structure Random structure Scan structure SimpleURef structure TimeLimit structure URef structure WordHashTable structure WordRedBlackMap structure WordRedBlackSet structure RealOrderStats structure UnivariateStats structure UTF8 functor ArrayQSortFn functor BSearchFn functor BinaryMapFn functor BinarySetFn functor DynamicArrayFn functor GraphSCCFn functor HashSetFn functor HashTableFn functor Hash2TableFn functor IntervalSetFn functor KeywordFn functor LeftPriorityQFn functor ListMapFn functor ListSetFn functor MonoArrayFn functor RedBlackMapFn functor RedBlackSetFn functor SplayMapFn functor SplaySetFn is $/basis.cm ansi-term.sml array-qsort-fn.sml array-qsort.sml array-sort-sig.sml atom-sig.sml atom-binary-map.sml atom-binary-set.sml atom-redblack-map.sml atom-redblack-set.sml atom-map.sml atom-set.sml atom-table.sml atom.sml base64-sig.sml base64.sml binary-map-fn.sml binary-set-fn.sml bit-array-sig.sml bit-array.sml bsearch-fn.sml char-map-sig.sml char-map.sml dynamic-array-sig.sml dynamic-array.sml dynamic-array-fn.sml fifo-sig.sml fifo.sml fmt-fields.sml fnv-hash.sml format-sig.sml format.sml format-comb-sig.sml format-comb.sml graph-scc-sig.sml graph-scc-fn.sml hash-key-sig.sml hash-string.sml hash-set-fn.sml hash-table-rep.sml hash-table-sig.sml hash-table.sml hash-table-fn.sml hash2-table-fn.sml keyword-fn.sml int-binary-map.sml int-binary-set.sml int-hash-table.sml int-list-map.sml int-list-set.sml int-redblack-map.sml int-redblack-set.sml interval-domain-sig.sml interval-set-fn.sml interval-set-sig.sml io-util-sig.sml io-util.sml getopt-sig.sml getopt.sml left-priorityq-fn.sml lib-base-sig.sml lib-base.sml list-format-sig.sml list-format.sml list-map-fn.sml list-mergesort.sml list-set-fn.sml list-xprod-sig.sml list-xprod.sml listsort-sig.sml mono-array-fn.sml mono-array-sort-sig.sml mono-dynamic-array-sig.sml mono-hash-set-sig.sml mono-hash-table-sig.sml mono-hash2-table-sig.sml mono-priorityq-sig.sml ord-key-sig.sml ord-map-sig.sml ord-set-sig.sml parser-comb-sig.sml parser-comb.sml path-util-sig.sml path-util.sml plist-sig.sml plist.sml #if defined(SIZE_32) target32-prime-sizes.sml #else target64-prime-sizes.sml #endif priority-sig.sml queue-sig.sml queue.sml rand-sig.sml rand.sml random-sig.sml random.sml real-format.sml redblack-map-fn.sml redblack-set-fn.sml scan-sig.sml scan.sml simple-uref.sml splay-map-fn.sml splay-set-fn.sml splaytree-sig.sml splaytree.sml time-limit.sml uref-sig.sml uref.sml word-hash-table.sml word-redblack-map.sml word-redblack-set.sml real-order-stats.sml univariate-stats.sml utf8-sig.sml utf8.sml mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/smlnj-lib.mlb000066400000000000000000001674401416264345000236660ustar00rootroot00000000000000 ann "nonexhaustiveBind ignore" "nonexhaustiveMatch warn" "redundantBind ignore" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l4 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb $(SML_LIB)/basis/unsafe.mlb end in local $(SML_LIB)/basis/pervasive.mlb local open l4 in structure gs_0 = StringCvt end local structure StringCvt = gs_0 list-format-sig.sml in signature gs_1 = LIST_FORMAT end local open l4 in structure gs_2 = Vector end local open l4 in structure gs_3 = Array end local open l4 in structure gs_4 = Char structure gs_5 = CharArray structure gs_6 = CharVector structure gs_7 = FixedInt structure gs_8 = General structure gs_9 = Int structure gs_10 = Int32 structure gs_11 = Int64 structure gs_12 = IntInf structure gs_13 = LargeInt structure gs_14 = LargeReal structure gs_15 = LargeWord structure gs_16 = OS structure gs_17 = Position structure gs_18 = Real structure gs_19 = Real64 structure gs_20 = RealArray structure gs_21 = RealArraySlice structure gs_22 = RealVector structure gs_23 = RealVectorSlice structure gs_24 = SMLofNJ structure gs_25 = Socket structure gs_26 = String structure gs_27 = Substring structure gs_28 = SysWord structure gs_29 = Time structure gs_30 = Word structure gs_31 = Word32 structure gs_32 = Word64 structure gs_33 = Word8 end local open l4 in structure gs_34 = List end local open l4 in structure gs_35 = ArraySlice end local structure Vector = gs_2 dynamic-array-sig.sml in signature gs_36 = DYNAMIC_ARRAY end local structure Array = gs_3 structure ArraySlice = gs_35 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 signature DYNAMIC_ARRAY = gs_36 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Vector = gs_2 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 dynamic-array.sml in structure gs_37 = DynamicArray end local mono-priorityq-sig.sml in signature gs_38 = MONO_PRIORITYQ end local priority-sig.sml in signature gs_39 = PRIORITY end local structure List = gs_34 signature MONO_PRIORITYQ = gs_38 signature PRIORITY = gs_39 left-priorityq-fn.sml in functor gs_40 = LeftPriorityQFn end local ord-key-sig.sml in signature gs_41 = ORD_KEY end local signature ORD_KEY = gs_41 ord-map-sig.sml in signature gs_42 = ORD_MAP end local lib-base-sig.sml in signature gs_43 = LIB_BASE end local signature LIB_BASE = gs_43 lib-base.sml in structure gs_44 = LibBase end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 signature ORD_MAP = gs_42 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-redblack-map.sml in structure gs_45 = IntRedBlackMap end local uref-sig.sml in signature gs_46 = UREF end local signature UREF = gs_46 simple-uref.sml in structure gs_47 = SimpleURef end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 signature ORD_MAP = gs_42 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-binary-map.sml in structure gs_48 = IntBinaryMap end local list-xprod-sig.sml in signature gs_49 = LIST_XPROD end local signature LIST_XPROD = gs_49 list-xprod.sml in structure gs_50 = ListXProd end local path-util-sig.sml in signature gs_51 = PATH_UTIL end local open l4 in structure gs_52 = Unsafe end local open l4 in structure gs_53 = Word8Vector end local open l4 in structure gs_54 = Word8Array end local open l4 in structure gs_55 = Byte end local open l4 in signature gs_56 = MONO_ARRAY end local signature MONO_ARRAY = gs_56 bit-array-sig.sml in signature gs_57 = BIT_ARRAY end local signature BIT_ARRAY = gs_57 structure Byte = gs_55 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Unsafe = gs_52 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 structure Word8Array = gs_54 structure Word8Vector = gs_53 bit-array.sml in structure gs_58 = BitArray end local signature ORD_KEY = gs_41 ord-set-sig.sml in signature gs_59 = ORD_SET end local structure LibBase = gs_44 structure List = gs_34 signature ORD_KEY = gs_41 signature ORD_SET = gs_59 redblack-set-fn.sml in functor gs_60 = RedBlackSetFn end local mono-dynamic-array-sig.sml in signature gs_61 = MONO_DYNAMIC_ARRAY end local signature MONO_ARRAY = gs_56 bsearch-fn.sml in functor gs_62 = BSearchFn end local open l4 in structure gs_63 = PackWord32Big end local random-sig.sml in signature gs_64 = RANDOM end local structure Array = gs_3 structure Byte = gs_55 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure OS = gs_16 structure PackWord32Big = gs_63 structure Position = gs_17 signature RANDOM = gs_64 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 structure Word8Array = gs_54 structure Word8Vector = gs_53 random.sml in structure gs_65 = Random end local structure Array = gs_3 structure ArraySlice = gs_35 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Random = gs_65 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Unsafe = gs_52 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 real-order-stats.sml in structure gs_66 = RealOrderStats end local atom-sig.sml in signature gs_67 = ATOM end local open l4 in structure gs_68 = TextIO end local structure TextIO = gs_68 io-util-sig.sml in signature gs_69 = IO_UTIL end local signature IO_UTIL = gs_69 structure TextIO = gs_68 io-util.sml in structure gs_70 = IOUtil end local fifo-sig.sml in signature gs_71 = FIFO end local hash-key-sig.sml in signature gs_72 = HASH_KEY end local signature HASH_KEY = gs_72 mono-hash-table-sig.sml in signature gs_73 = MONO_HASH_TABLE end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 hash-table-rep.sml in structure gs_74 = HashTableRep end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure HashTableRep = gs_74 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 signature MONO_HASH_TABLE = gs_73 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-hash-table.sml in structure gs_75 = IntHashTable end local structure LibBase = gs_44 structure List = gs_34 signature ORD_KEY = gs_41 signature ORD_SET = gs_59 list-set-fn.sml in functor gs_76 = ListSetFn end local open l4 in structure gs_77 = Option end local getopt-sig.sml in signature gs_78 = GET_OPT end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 signature GET_OPT = gs_78 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Option = gs_77 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 getopt.sml in structure gs_79 = GetOpt end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 signature ORD_SET = gs_59 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-redblack-set.sml in structure gs_80 = IntRedBlackSet end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 signature PATH_UTIL = gs_51 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 path-util.sml in structure gs_81 = PathUtil end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 signature ORD_SET = gs_59 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-list-set.sml in structure gs_82 = IntListSet end local structure LibBase = gs_44 structure List = gs_34 signature ORD_KEY = gs_41 signature ORD_MAP = gs_42 list-map-fn.sml in functor gs_83 = ListMapFn end local splaytree-sig.sml in signature gs_84 = SPLAY_TREE end local signature MONO_ARRAY = gs_56 mono-array-sort-sig.sml in signature gs_85 = MONO_ARRAY_SORT end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 signature MONO_ARRAY = gs_56 signature MONO_ARRAY_SORT = gs_85 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 array-qsort-fn.sml in functor gs_86 = ArrayQSortFn end local signature HASH_KEY = gs_72 mono-hash-set-sig.sml in signature gs_87 = MONO_HASH_SET end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 signature HASH_KEY = gs_72 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 signature MONO_HASH_SET = gs_87 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 hash-set-fn.sml in functor gs_88 = HashSetFn end local signature ORD_KEY = gs_41 graph-scc-sig.sml in signature gs_89 = GRAPH_SCC end local structure LibBase = gs_44 signature ORD_KEY = gs_41 signature ORD_MAP = gs_42 redblack-map-fn.sml in functor gs_90 = RedBlackMapFn end local signature GRAPH_SCC = gs_89 structure List = gs_34 signature ORD_KEY = gs_41 functor RedBlackMapFn = gs_90 graph-scc-fn.sml in functor gs_91 = GraphSCCFn end local open l4 in structure gs_92 = Word8VectorSlice end local structure Word8Vector = gs_53 structure Word8VectorSlice = gs_92 base64-sig.sml in signature gs_93 = BASE64 end local interval-domain-sig.sml in signature gs_94 = INTERVAL_DOMAIN end local signature INTERVAL_DOMAIN = gs_94 interval-set-sig.sml in signature gs_95 = INTERVAL_SET end local signature HASH_KEY = gs_72 mono-hash2-table-sig.sml in signature gs_96 = MONO_HASH2_TABLE end local open l4 in structure gs_97 = Bool end local structure StringCvt = gs_0 format-comb-sig.sml in signature gs_98 = FORMAT_COMB end local structure Bool = gs_97 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 signature FORMAT_COMB = gs_98 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 format-comb.sml in structure gs_99 = FormatComb end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 fnv-hash.sml in structure gs_100 = FNVHash end local signature ATOM = gs_67 structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FNVHash = gs_100 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 atom.sml in structure gs_101 = Atom end local structure LibBase = gs_44 signature ORD_KEY = gs_41 signature ORD_MAP = gs_42 binary-map-fn.sml in functor gs_102 = BinaryMapFn end local signature FIFO = gs_71 structure List = gs_34 fifo.sml in structure gs_103 = Fifo end local structure StringCvt = gs_0 parser-comb-sig.sml in signature gs_104 = PARSER_COMB end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 signature PARSER_COMB = gs_104 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 parser-comb.sml in structure gs_105 = ParserComb end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 signature ORD_SET = gs_59 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-binary-set.sml in structure gs_106 = IntBinarySet end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 signature HASH_KEY = gs_72 structure HashTableRep = gs_74 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 signature MONO_HASH_TABLE = gs_73 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 hash-table-fn.sml in functor gs_107 = HashTableFn end local array-sort-sig.sml in signature gs_108 = ARRAY_SORT end local signature ARRAY_SORT = gs_108 structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Unsafe = gs_52 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 array-qsort.sml in structure gs_109 = ArrayQSort end local structure Atom = gs_101 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 format-sig.sml in signature gs_110 = FORMAT end local hash-table-sig.sml in signature gs_111 = HASH_TABLE end local structure Atom = gs_101 functor HashTableFn = gs_107 atom-table.sml in structure gs_112 = AtomTable end local char-map-sig.sml in signature gs_113 = CHAR_MAP end local structure Atom = gs_101 functor RedBlackSetFn = gs_60 atom-redblack-set.sml in structure gs_114 = AtomRedBlackSet end local structure AtomRedBlackSet = gs_114 atom-set.sml in structure gs_115 = AtomSet end local queue-sig.sml in signature gs_116 = QUEUE end local structure Fifo = gs_103 signature QUEUE = gs_116 queue.sml in structure gs_117 = Queue end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 signature ORD_MAP = gs_42 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 word-redblack-map.sml in structure gs_118 = WordRedBlackMap end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 signature HASH_TABLE = gs_111 structure HashTableRep = gs_74 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 hash-table.sml in structure gs_119 = HashTable end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 signature ORD_MAP = gs_42 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 int-list-map.sml in structure gs_120 = IntListMap end local signature SPLAY_TREE = gs_84 splaytree.sml in structure gs_121 = SplayTree end local structure LibBase = gs_44 structure List = gs_34 signature ORD_KEY = gs_41 signature ORD_SET = gs_59 structure SplayTree = gs_121 splay-set-fn.sml in functor gs_122 = SplaySetFn end local open l4 in structure gs_123 = Word8ArraySlice end local signature BASE64 = gs_93 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Unsafe = gs_52 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 structure Word8Array = gs_54 structure Word8ArraySlice = gs_123 structure Word8Vector = gs_53 structure Word8VectorSlice = gs_92 base64.sml in structure gs_124 = Base64 end local plist-sig.sml in signature gs_125 = PROP_LIST end local structure List = gs_34 signature PROP_LIST = gs_125 plist.sml in structure gs_126 = PropList end local structure Atom = gs_101 structure AtomTable = gs_112 structure List = gs_34 keyword-fn.sml in functor gs_127 = KeywordFn end local open l4 in structure gs_128 = Math end local structure Array = gs_3 structure ArraySlice = gs_35 structure Math = gs_128 structure RealOrderStats = gs_66 structure Unsafe = gs_52 univariate-stats.sml in structure gs_129 = UnivariateStats end local structure LibBase = gs_44 structure List = gs_34 signature ORD_KEY = gs_41 signature ORD_SET = gs_59 binary-set-fn.sml in functor gs_130 = BinarySetFn end local structure Atom = gs_101 functor BinarySetFn = gs_130 atom-binary-set.sml in structure gs_131 = AtomBinarySet end local structure Atom = gs_101 functor BinaryMapFn = gs_102 atom-binary-map.sml in structure gs_132 = AtomBinaryMap end local target64-prime-sizes.sml in structure gs_133 = PrimeSizes end local structure Atom = gs_101 functor RedBlackMapFn = gs_90 atom-redblack-map.sml in structure gs_134 = AtomRedBlackMap end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 rand-sig.sml in signature gs_135 = RAND end local structure Array = gs_3 signature CHAR_MAP = gs_113 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Unsafe = gs_52 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 char-map.sml in structure gs_136 = CharMap end local structure Array = gs_3 signature MONO_ARRAY = gs_56 structure Vector = gs_2 mono-array-fn.sml in functor gs_137 = MonoArrayFn end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 real-format.sml in structure gs_138 = RealFormat end local structure Atom = gs_101 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 fmt-fields.sml in structure gs_139 = FmtFields end local structure Atom = gs_101 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 signature FORMAT = gs_110 structure FixedInt = gs_7 structure FmtFields = gs_139 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealFormat = gs_138 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 format.sml in structure gs_140 = Format end local structure Atom = gs_101 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 scan-sig.sml in signature gs_141 = SCAN end local structure Bool = gs_97 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure FmtFields = gs_139 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 signature SCAN = gs_141 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 structure Word8Array = gs_54 scan.sml in structure gs_142 = Scan end local structure AtomRedBlackMap = gs_134 atom-map.sml in structure gs_143 = AtomMap end local signature INTERVAL_DOMAIN = gs_94 signature INTERVAL_SET = gs_95 structure List = gs_34 interval-set-fn.sml in functor gs_144 = IntervalSetFn end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 signature HASH_KEY = gs_72 structure HashTableRep = gs_74 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 signature MONO_HASH2_TABLE = gs_96 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 hash2-table-fn.sml in functor gs_145 = Hash2TableFn end local structure LibBase = gs_44 signature ORD_KEY = gs_41 signature ORD_MAP = gs_42 structure SplayTree = gs_121 splay-map-fn.sml in functor gs_146 = SplayMapFn end local structure Array = gs_3 structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure HashTableRep = gs_74 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 signature MONO_HASH_TABLE = gs_73 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 word-hash-table.sml in structure gs_147 = WordHashTable end local structure StringCvt = gs_0 utf8-sig.sml in signature gs_148 = UTF8 end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 signature UTF8 = gs_148 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 utf8.sml in structure gs_149 = UTF8 end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure OS = gs_16 structure Position = gs_17 signature RAND = gs_135 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 rand.sml in structure gs_150 = Rand end local structure FNVHash = gs_100 hash-string.sml in structure gs_151 = HashString end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 signature LIST_FORMAT = gs_1 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure StringCvt = gs_0 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 list-format.sml in structure gs_152 = ListFormat end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 signature MONO_ARRAY = gs_56 signature MONO_DYNAMIC_ARRAY = gs_61 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 dynamic-array-fn.sml in functor gs_153 = DynamicArrayFn end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure LibBase = gs_44 structure List = gs_34 signature ORD_SET = gs_59 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 word-redblack-set.sml in structure gs_154 = WordRedBlackSet end local listsort-sig.sml in signature gs_155 = LIST_SORT end local signature LIST_SORT = gs_155 list-mergesort.sml in structure gs_156 = ListMergeSort end local signature UREF = gs_46 uref.sml in structure gs_157 = URef end local structure Char = gs_4 structure CharArray = gs_5 structure CharVector = gs_6 structure FixedInt = gs_7 structure General = gs_8 structure Int = gs_9 structure Int32 = gs_10 structure Int64 = gs_11 structure IntInf = gs_12 structure LargeInt = gs_13 structure LargeReal = gs_14 structure LargeWord = gs_15 structure List = gs_34 structure OS = gs_16 structure Position = gs_17 structure Real = gs_18 structure Real64 = gs_19 structure RealArray = gs_20 structure RealArraySlice = gs_21 structure RealVector = gs_22 structure RealVectorSlice = gs_23 structure SMLofNJ = gs_24 structure Socket = gs_25 structure String = gs_26 structure Substring = gs_27 structure SysWord = gs_28 structure TextIO = gs_68 structure Time = gs_29 structure Word = gs_30 structure Word32 = gs_31 structure Word64 = gs_32 structure Word8 = gs_33 ansi-term.sml in structure gs_158 = ANSITerm end in structure ANSITerm = gs_158 signature ARRAY_SORT = gs_108 signature ATOM = gs_67 structure ArrayQSort = gs_109 functor ArrayQSortFn = gs_86 structure Atom = gs_101 structure AtomBinaryMap = gs_132 structure AtomBinarySet = gs_131 structure AtomMap = gs_143 structure AtomRedBlackMap = gs_134 structure AtomRedBlackSet = gs_114 structure AtomSet = gs_115 structure AtomTable = gs_112 signature BASE64 = gs_93 signature BIT_ARRAY = gs_57 functor BSearchFn = gs_62 structure Base64 = gs_124 functor BinaryMapFn = gs_102 functor BinarySetFn = gs_130 structure BitArray = gs_58 signature CHAR_MAP = gs_113 structure CharMap = gs_136 signature DYNAMIC_ARRAY = gs_36 structure DynamicArray = gs_37 functor DynamicArrayFn = gs_153 signature FIFO = gs_71 structure FNVHash = gs_100 signature FORMAT = gs_110 signature FORMAT_COMB = gs_98 structure Fifo = gs_103 structure Format = gs_140 structure FormatComb = gs_99 signature GET_OPT = gs_78 signature GRAPH_SCC = gs_89 structure GetOpt = gs_79 functor GraphSCCFn = gs_91 signature HASH_KEY = gs_72 signature HASH_TABLE = gs_111 functor Hash2TableFn = gs_145 functor HashSetFn = gs_88 structure HashString = gs_151 structure HashTable = gs_119 functor HashTableFn = gs_107 signature INTERVAL_DOMAIN = gs_94 signature INTERVAL_SET = gs_95 structure IOUtil = gs_70 signature IO_UTIL = gs_69 structure IntBinaryMap = gs_48 structure IntBinarySet = gs_106 structure IntHashTable = gs_75 structure IntListMap = gs_120 structure IntListSet = gs_82 structure IntRedBlackMap = gs_45 structure IntRedBlackSet = gs_80 functor IntervalSetFn = gs_144 functor KeywordFn = gs_127 signature LIB_BASE = gs_43 signature LIST_FORMAT = gs_1 signature LIST_SORT = gs_155 signature LIST_XPROD = gs_49 functor LeftPriorityQFn = gs_40 structure LibBase = gs_44 structure ListFormat = gs_152 functor ListMapFn = gs_83 structure ListMergeSort = gs_156 functor ListSetFn = gs_76 structure ListXProd = gs_50 signature MONO_ARRAY_SORT = gs_85 signature MONO_DYNAMIC_ARRAY = gs_61 signature MONO_HASH2_TABLE = gs_96 signature MONO_HASH_SET = gs_87 signature MONO_HASH_TABLE = gs_73 signature MONO_PRIORITYQ = gs_38 functor MonoArrayFn = gs_137 signature ORD_KEY = gs_41 signature ORD_MAP = gs_42 signature ORD_SET = gs_59 signature PARSER_COMB = gs_104 signature PATH_UTIL = gs_51 signature PRIORITY = gs_39 signature PROP_LIST = gs_125 structure ParserComb = gs_105 structure PathUtil = gs_81 structure PrimeSizes = gs_133 structure PropList = gs_126 signature QUEUE = gs_116 structure Queue = gs_117 signature RAND = gs_135 signature RANDOM = gs_64 structure Rand = gs_150 structure Random = gs_65 structure RealOrderStats = gs_66 functor RedBlackMapFn = gs_90 functor RedBlackSetFn = gs_60 signature SCAN = gs_141 signature SPLAY_TREE = gs_84 structure Scan = gs_142 structure SimpleURef = gs_47 functor SplayMapFn = gs_146 functor SplaySetFn = gs_122 signature UREF = gs_46 structure URef = gs_157 signature UTF8 = gs_148 structure UTF8 = gs_149 structure UnivariateStats = gs_129 structure WordHashTable = gs_147 structure WordRedBlackMap = gs_118 structure WordRedBlackSet = gs_154 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/splay-map-fn.sml000066400000000000000000000356461416264345000243260ustar00rootroot00000000000000(* splay-map-fn.sml * * COPYRIGHT (c) 2012 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Functor implementing dictionaries using splay trees. * *) functor SplayMapFn (K : ORD_KEY) :> ORD_MAP where type Key.ord_key = K.ord_key = struct structure Key = K open SplayTree datatype 'a map = EMPTY | MAP of { root : (K.ord_key * 'a) splay ref, nobj : int } fun cmpf k (k', _) = K.compare(k',k) val empty = EMPTY fun isEmpty EMPTY = true | isEmpty _ = false (* return the first item in the map (or NONE if it is empty) *) fun first EMPTY = NONE | first (MAP{root, ...}) = let fun f (SplayObj{value=(_, value), left=SplayNil, ...}) = SOME value | f (SplayObj{left, ...}) = f left | f SplayNil = raise Fail "SplayMapFn.first" in f (!root) end (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti EMPTY = NONE | firsti (MAP{root, ...}) = let fun f (SplayObj{value=(key, value), left=SplayNil, ...}) = SOME(key, value) | f (SplayObj{left, ...}) = f left | f SplayNil = raise Fail "SplayMapFn.firsti" in f (!root) end fun singleton (key, v) = MAP{nobj=1,root=ref(SplayObj{value=(key,v),left=SplayNil,right=SplayNil})} (* Insert an item. *) fun insert (EMPTY,key,v) = MAP{nobj=1,root=ref(SplayObj{value=(key,v),left=SplayNil,right=SplayNil})} | insert (MAP{root,nobj},key,v) = case splay (cmpf key, !root) of (EQUAL,SplayObj{value,left,right}) => MAP{nobj=nobj,root=ref(SplayObj{value=(key,v),left=left,right=right})} | (LESS,SplayObj{value,left,right}) => MAP{ nobj=nobj+1, root=ref(SplayObj{value=(key,v),left=SplayObj{value=value,left=left,right=SplayNil},right=right}) } | (GREATER,SplayObj{value,left,right}) => MAP{ nobj=nobj+1, root=ref(SplayObj{ value=(key,v), left=left, right=SplayObj{value=value,left=SplayNil,right=right} }) } | (_,SplayNil) => raise LibBase.Impossible "SplayMapFn.insert SplayNil" fun insert' ((k, x), m) = insert(m, k, x) fun insertWithi comb (m, key, v) = let fun insert EMPTY = MAP{nobj=1,root=ref(SplayObj{value=(key,v),left=SplayNil,right=SplayNil})} | insert (MAP{root,nobj}) = (case splay (cmpf key, !root) of (EQUAL, SplayObj{value,left,right}) => let val v' = (key, comb(key, #2 value, v)) in MAP{ nobj=nobj, root=ref(SplayObj{value=v', left=left, right=right}) } end | (LESS,SplayObj{value,left,right}) => MAP{ nobj=nobj+1, root=ref(SplayObj{value=(key,v),left=SplayObj{value=value,left=left,right=SplayNil},right=right}) } | (GREATER,SplayObj{value,left,right}) => MAP{ nobj=nobj+1, root=ref(SplayObj{ value=(key,v), left=left, right=SplayObj{value=value,left=SplayNil,right=right} }) } | (_,SplayNil) => raise LibBase.Impossible "SplayMapFn.insert SplayNil" (* end case *)) in insert m end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) fun inDomain (EMPTY, _) = false | inDomain (MAP{root,nobj}, key) = (case splay (cmpf key, !root) of (EQUAL, r as SplayObj{value,...}) => (root := r; true) | (_, r) => (root := r; false) (* end case *)) (* Look for an item, return NONE if the item doesn't exist *) fun find (EMPTY,_) = NONE | find (MAP{root,nobj},key) = (case splay (cmpf key, !root) of (EQUAL, r as SplayObj{value,...}) => (root := r; SOME(#2 value)) | (_, r) => (root := r; NONE) (* end case *)) (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (EMPTY,_) = raise LibBase.NotFound | lookup (MAP{root,nobj},key) = (case splay (cmpf key, !root) of (EQUAL, r as SplayObj{value,...}) => (root := r; #2 value) | (_, r) => (root := r; raise LibBase.NotFound) (* end case *)) (* Remove an item. * Raise LibBase.NotFound if not found *) fun remove (EMPTY, _) = raise LibBase.NotFound | remove (MAP{root,nobj}, key) = (case (splay (cmpf key, !root)) of (EQUAL, SplayObj{value, left, right}) => if nobj = 1 then (EMPTY, #2 value) else (MAP{root=ref(join(left,right)),nobj=nobj-1}, #2 value) | (_,r) => (root := r; raise LibBase.NotFound) (* end case *)) (* Return the number of items in the table *) fun numItems EMPTY = 0 | numItems (MAP{nobj,...}) = nobj (* Return a list of the items (and their keys) in the dictionary *) fun listItems EMPTY = [] | listItems (MAP{root,...}) = let fun apply (SplayNil, l) = l | apply (SplayObj{value=(_, v), left, right}, l) = apply(left, v::(apply (right,l))) in apply (!root, []) end fun listItemsi EMPTY = [] | listItemsi (MAP{root,...}) = let fun apply (SplayNil,l) = l | apply (SplayObj{value,left,right},l) = apply(left, value::(apply (right,l))) in apply (!root,[]) end fun listKeys EMPTY = [] | listKeys (MAP{root,...}) = let fun apply (SplayNil, l) = l | apply (SplayObj{value=(key, _),left,right},l) = apply(left, key::(apply (right,l))) in apply (!root, []) end local fun next ((t as SplayObj{right, ...})::rest) = (t, left(right, rest)) | next _ = (SplayNil, []) and left (SplayNil, rest) = rest | left (t as SplayObj{left=l, ...}, rest) = left(l, t::rest) in fun collate cmpRng (EMPTY, EMPTY) = EQUAL | collate cmpRng (EMPTY, _) = LESS | collate cmpRng (_, EMPTY) = GREATER | collate cmpRng (MAP{root=s1, ...}, MAP{root=s2, ...}) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((SplayNil, _), (SplayNil, _)) => EQUAL | ((SplayNil, _), _) => LESS | (_, (SplayNil, _)) => GREATER | ((SplayObj{value=(x1, y1), ...}, r1), (SplayObj{value=(x2, y2), ...}, r2) ) => ( case Key.compare(x1, x2) of EQUAL => (case cmpRng (y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in cmp (left(!s1, []), left(!s2, [])) end end (* local *) (* Apply a function to the entries of the dictionary *) fun appi af EMPTY = () | appi af (MAP{root,...}) = let fun apply SplayNil = () | apply (SplayObj{value,left,right}) = (apply left; af value; apply right) in apply (!root) end fun app af EMPTY = () | app af (MAP{root,...}) = let fun apply SplayNil = () | apply (SplayObj{value=(_,value),left,right}) = (apply left; af value; apply right) in apply (!root) end (* fun revapp af (MAP{root,...}) = let fun apply SplayNil = () | apply (SplayObj{value,left,right}) = (apply right; af value; apply left) in apply (!root) end *) (* Fold function *) fun foldri (abf : K.ord_key * 'a * 'b -> 'b) b EMPTY = b | foldri (abf : K.ord_key * 'a * 'b -> 'b) b (MAP{root,...}) = let fun apply (SplayNil : (K.ord_key * 'a) splay, b) = b | apply (SplayObj{value,left,right},b) = apply(left,abf(#1 value,#2 value,apply(right,b))) in apply (!root,b) end fun foldr (abf : 'a * 'b -> 'b) b EMPTY = b | foldr (abf : 'a * 'b -> 'b) b (MAP{root,...}) = let fun apply (SplayNil : (K.ord_key * 'a) splay, b) = b | apply (SplayObj{value=(_,value),left,right},b) = apply(left,abf(value,apply(right,b))) in apply (!root,b) end fun foldli (abf : K.ord_key * 'a * 'b -> 'b) b EMPTY = b | foldli (abf : K.ord_key * 'a * 'b -> 'b) b (MAP{root,...}) = let fun apply (SplayNil : (K.ord_key * 'a) splay, b) = b | apply (SplayObj{value,left,right},b) = apply(right,abf(#1 value,#2 value,apply(left,b))) in apply (!root,b) end fun foldl (abf : 'a * 'b -> 'b) b EMPTY = b | foldl (abf : 'a * 'b -> 'b) b (MAP{root,...}) = let fun apply (SplayNil : (K.ord_key * 'a) splay, b) = b | apply (SplayObj{value=(_,value),left,right},b) = apply(right,abf(value,apply(left,b))) in apply (!root,b) end (* Map a table to a new table that has the same keys*) fun mapi (af : K.ord_key * 'a -> 'b) EMPTY = EMPTY | mapi (af : K.ord_key * 'a -> 'b) (MAP{root,nobj}) = let fun ap (SplayNil : (K.ord_key * 'a) splay) = SplayNil | ap (SplayObj{value,left,right}) = let val left' = ap left val value' = (#1 value, af value) in SplayObj{value = value', left = left', right = ap right} end in MAP{root = ref(ap (!root)), nobj = nobj} end fun map (af : 'a -> 'b) EMPTY = EMPTY | map (af : 'a -> 'b) (MAP{root,nobj}) = let fun ap (SplayNil : (K.ord_key * 'a) splay) = SplayNil | ap (SplayObj{value,left,right}) = let val left' = ap left val value' = (#1 value, af (#2 value)) in SplayObj{value = value', left = left', right = ap right} end in MAP{root = ref(ap (!root)), nobj = nobj} end (* the following are generic implementations of the unionWith, intersectWith, * and mergeWith operetions. These should be specialized for the internal * representations at some point. *) fun unionWith f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (a, b) => f(b, a))) m1 m2 else foldli (ins f) m2 m1 end fun unionWithi f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (k, a, b) => f(k, b, a))) m1 m2 else foldli (ins f) m2 m1 end fun intersectWith f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (a, b) => f(b, a)) (m2, m1) end fun intersectWithi f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (k, a, b) => f(k, b, a)) (m2, m1) end fun mergeWith f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, m) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, m) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end fun mergeWithi f (m1, m2) = let fun merge ([], [], m) = m | merge ((k1, x1)::r1, [], m) = mergef (k1, SOME x1, NONE, r1, [], m) | merge ([], (k2, x2)::r2, m) = mergef (k2, NONE, SOME x2, [], r2, m) | merge (m1 as ((k1, x1)::r1), m2 as ((k2, x2)::r2), m) = ( case Key.compare (k1, k2) of LESS => mergef (k1, SOME x1, NONE, r1, m2, m) | EQUAL => mergef (k1, SOME x1, SOME x2, r1, r2, m) | GREATER => mergef (k2, NONE, SOME x2, m1, r2, m) (* end case *)) and mergef (k, x1, x2, r1, r2, m) = (case f (k, x1, x2) of NONE => merge (r1, r2, m) | SOME y => merge (r1, r2, insert(m, k, y)) (* end case *)) in merge (listItemsi m1, listItemsi m2, empty) end (* this is a generic implementation of mapPartial. It should * be specialized to the data-structure at some point. *) fun mapPartial f m = let fun g (key, item, m) = (case f item of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end fun mapPartiali f m = let fun g (key, item, m) = (case f(key, item) of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end (* this is a generic implementation of filter. It should * be specialized to the data-structure at some point. *) fun filter predFn m = let fun f (key, item, m) = if predFn item then insert(m, key, item) else m in foldli f empty m end fun filteri predFn m = let fun f (key, item, m) = if predFn(key, item) then insert(m, key, item) else m in foldli f empty m end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' SplayNil = false | exists' (SplayObj{value=(_, x), left, right}) = exists' left orelse pred x orelse exists' right in fn EMPTY => false | (MAP{root, ...}) => exists' (!root) end fun existsi pred = let fun exists' SplayNil = false | exists' (SplayObj{value, left, right}) = exists' left orelse pred value orelse exists' right in fn EMPTY => false | (MAP{root, ...}) => exists' (!root) end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' SplayNil = true | all' (SplayObj{value=(_, x), left, right}) = all' left andalso pred x andalso all' right in fn EMPTY => true | (MAP{root, ...}) => all' (!root) end fun alli pred = let fun all' SplayNil = true | all' (SplayObj{value, left, right}) = all' left andalso pred value andalso all' right in fn EMPTY => true | (MAP{root, ...}) => all' (!root) end end (* SplayDictFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/splay-set-fn.sml000066400000000000000000000314431416264345000243330ustar00rootroot00000000000000(* splay-set-fn.sml * * COPYRIGHT (c) 2015 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Functor implementing ordered sets using splay trees. * *) functor SplaySetFn (K : ORD_KEY) :> ORD_SET where type Key.ord_key = K.ord_key = struct structure Key = K open SplayTree type item = K.ord_key datatype set = EMPTY | SET of { root : item splay ref, nobj : int } fun cmpf k = fn k' => K.compare(k',k) val empty = EMPTY fun singleton v = SET{root = ref(SplayObj{value=v,left=SplayNil,right=SplayNil}),nobj=1} (* Primitive insertion. *) fun insert (v,(nobj,root)) = case splay (cmpf v, root) of (EQUAL,SplayObj{value,left,right}) => (nobj,SplayObj{value=v,left=left,right=right}) | (LESS,SplayObj{value,left,right}) => (nobj+1, SplayObj{ value=v, left=SplayObj{value=value,left=left,right=SplayNil}, right=right}) | (GREATER,SplayObj{value,left,right}) => (nobj+1, SplayObj{ value=v, left=left, right=SplayObj{value=value,left=SplayNil,right=right}}) | (_,SplayNil) => (1,SplayObj{value=v,left=SplayNil,right=SplayNil}) (* Add an item. *) fun add (EMPTY,v) = singleton v | add (SET{root,nobj},v) = let val (cnt,t) = insert(v,(nobj,!root)) in SET{nobj=cnt,root=ref t} end fun add' (s, x) = add(x, s) (* Insert a list of items. *) fun addList (set,[]) = set | addList (set,l) = let val arg = case set of EMPTY => (0,SplayNil) | SET{root,nobj} => (nobj,!root) val (cnt,t) = List.foldl insert arg l in SET{nobj=cnt,root=ref t} end fun fromList l = addList (empty, l) (* Remove an item. * Raise LibBase.NotFound if not found *) fun delete (EMPTY,_) = raise LibBase.NotFound | delete (SET{root,nobj},key) = case splay (cmpf key, !root) of (EQUAL,SplayObj{value,left,right}) => if nobj = 1 then EMPTY else SET{root=ref(join(left,right)),nobj=nobj-1} | (_,r) => (root := r; raise LibBase.NotFound) (* return true if the item is in the set *) fun member (EMPTY, key) = false | member (SET{root,nobj}, key) = (case splay (cmpf key, !root) of (EQUAL, r) => (root := r; true) | (_, r) => (root := r; false) (* end case *)) fun isEmpty EMPTY = true | isEmpty _ = false fun minItem EMPTY = raise Empty | minItem (SET{root, ...}) = let fun min (SplayObj{value, left=SplayNil, ...}) = value | min (SplayObj{left, ...}) = min left | min SplayNil = raise Fail "impossible" in min (!root) end fun maxItem EMPTY = raise Empty | maxItem (SET{root, ...}) = let fun max (SplayObj{value, right=SplayNil, ...}) = value | max (SplayObj{right, ...}) = max right | max SplayNil = raise Fail "impossible" in max (!root) end local fun member (x,tree) = let fun mbr SplayNil = false | mbr (SplayObj{value,left,right}) = case K.compare(x,value) of LESS => mbr left | GREATER => mbr right | _ => true in mbr tree end (* true if every item in t is in t' *) fun treeIn (t,t') = let fun isIn SplayNil = true | isIn (SplayObj{value,left=SplayNil,right=SplayNil}) = member(value, t') | isIn (SplayObj{value,left,right=SplayNil}) = member(value, t') andalso isIn left | isIn (SplayObj{value,left=SplayNil,right}) = member(value, t') andalso isIn right | isIn (SplayObj{value,left,right}) = member(value, t') andalso isIn left andalso isIn right in isIn t end in fun equal (SET{root=rt,nobj=n},SET{root=rt',nobj=n'}) = (n=n') andalso treeIn (!rt,!rt') | equal (EMPTY, EMPTY) = true | equal _ = false fun isSubset (SET{root=rt,nobj=n},SET{root=rt',nobj=n'}) = (n<=n') andalso treeIn (!rt,!rt') | isSubset (EMPTY,_) = true | isSubset _ = false end local fun next ((t as SplayObj{right, ...})::rest) = (t, left(right, rest)) | next _ = (SplayNil, []) and left (SplayNil, rest) = rest | left (t as SplayObj{left=l, ...}, rest) = left(l, t::rest) in fun compare (EMPTY, EMPTY) = EQUAL | compare (EMPTY, _) = LESS | compare (_, EMPTY) = GREATER | compare (SET{root=s1, ...}, SET{root=s2, ...}) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((SplayNil, _), (SplayNil, _)) => EQUAL | ((SplayNil, _), _) => LESS | (_, (SplayNil, _)) => GREATER | ((SplayObj{value=e1, ...}, r1), (SplayObj{value=e2, ...}, r2)) => ( case Key.compare(e1, e2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (left(!s1, []), left(!s2, [])) end fun disjoint (EMPTY, _) = true | disjoint (_, EMPTY) = true | disjoint (SET{root=rt, ...}, SET{root=rt', ...}) = let fun walk (t1, t2) = (case (next t1, next t2) of ((SplayNil, _), _) => true | (_, (SplayNil, _)) => true | ((SplayObj{value=e1, ...}, r1), (SplayObj{value=e2, ...}, r2)) => ( case Key.compare(e1, e2) of LESS => walk(r1, t2) | EQUAL => false | GREATER => walk(t1, r2) (* end case *)) (* end case *)) in walk (left(!rt, []), left(!rt', [])) end end (* local *) (* Return the number of items in the table *) fun numItems EMPTY = 0 | numItems (SET{nobj,...}) = nobj fun toList EMPTY = [] | toList (SET{root,...}) = let fun apply (SplayNil,l) = l | apply (SplayObj{value,left,right},l) = apply(left, value::(apply (right,l))) in apply (!root,[]) end fun split (value,s) = case splay(cmpf value, s) of (EQUAL,SplayObj{value,left,right}) => (SOME value, left, right) | (LESS,SplayObj{value,left,right}) => (NONE, SplayObj{value=value,left=left,right=SplayNil},right) | (GREATER,SplayObj{value,left,right}) => (NONE, left, SplayObj{value=value,right=right,left=SplayNil}) | (_,SplayNil) => (NONE, SplayNil, SplayNil) fun intersection (EMPTY,_) = EMPTY | intersection (_,EMPTY) = EMPTY | intersection (SET{root,...},SET{root=root',...}) = let fun inter(SplayNil,_) = (SplayNil,0) | inter(_,SplayNil) = (SplayNil,0) | inter(s, SplayObj{value,left,right}) = case split(value,s) of (SOME v, l, r) => let val (l',lcnt) = inter(l,left) val (r',rcnt) = inter(r,right) in (SplayObj{value=v,left=l',right=r'},lcnt+rcnt+1) end | (_,l,r) => let val (l',lcnt) = inter(l,left) val (r',rcnt) = inter(r,right) in (join(l',r'),lcnt+rcnt) end in case inter(!root,!root') of (_,0) => EMPTY | (root,cnt) => SET{root = ref root, nobj = cnt} end fun count st = let fun cnt(SplayNil,n) = n | cnt(SplayObj{left,right,...},n) = cnt(left,cnt(right,n+1)) in cnt(st,0) end fun difference (EMPTY,_) = EMPTY | difference (s,EMPTY) = s | difference (SET{root,...}, SET{root=root',...}) = let fun diff(SplayNil,_) = (SplayNil,0) | diff(s,SplayNil) = (s, count s) | diff(s,SplayObj{value,right,left}) = let val (_,l,r) = split(value,s) val (l',lcnt) = diff(l,left) val (r',rcnt) = diff(r,right) in (join(l',r'),lcnt+rcnt) end in case diff(!root,!root') of (_,0) => EMPTY | (root,cnt) => SET{root = ref root, nobj = cnt} end fun union (EMPTY,s) = s | union (s,EMPTY) = s | union (SET{root,...}, SET{root=root',...}) = let fun uni(SplayNil,s) = (s,count s) | uni(s,SplayNil) = (s, count s) | uni(s,SplayObj{value,right,left}) = let val (_,l,r) = split(value,s) val (l',lcnt) = uni(l,left) val (r',rcnt) = uni(r,right) in (SplayObj{value=value,right=r',left=l'},lcnt+rcnt+1) end val (root,cnt) = uni(!root,!root') in SET{root = ref root, nobj = cnt} end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) EMPTY items in difference (l, items') end fun map f EMPTY = EMPTY | map f (SET{root, ...}) = let fun mapf (acc, SplayNil) = acc | mapf (acc, SplayObj{value,left,right}) = mapf (add (mapf (acc, left), f value), right) in mapf (EMPTY, !root) end fun mapPartial f EMPTY = EMPTY | mapPartial f (SET{root, ...}) = let fun mapf (acc, SplayNil) = acc | mapf (acc, SplayObj{value,left,right}) = let val acc = mapf (acc, left) in case f value of SOME value' => mapf (add(acc, value'), right) | NONE => mapf (acc, right) (* end case *) end in mapf (EMPTY, !root) end fun app af EMPTY = () | app af (SET{root,...}) = let fun apply SplayNil = () | apply (SplayObj{value,left,right}) = (apply left; af value; apply right) in apply (!root) end (* fun revapp af (SET{root,...}) = let fun apply SplayNil = () | apply (SplayObj{value,left,right}) = (apply right; af value; apply left) in apply (!root) end *) (* Fold function *) fun foldr abf b EMPTY = b | foldr abf b (SET{root,...}) = let fun apply (SplayNil, b) = b | apply (SplayObj{value,left,right},b) = apply(left,abf(value,apply(right,b))) in apply (!root,b) end fun foldl abf b EMPTY = b | foldl abf b (SET{root,...}) = let fun apply (SplayNil, b) = b | apply (SplayObj{value,left,right},b) = apply(right,abf(value,apply(left,b))) in apply (!root,b) end fun filter p EMPTY = EMPTY | filter p (SET{root,...}) = let fun filt (SplayNil,tree) = tree | filt (SplayObj{value,left,right},tree) = let val t' = filt(right,filt(left,tree)) in if p value then insert(value,t') else t' end in case filt(!root,(0,SplayNil)) of (0,_) => EMPTY | (cnt,t) => SET{nobj=cnt,root=ref t} end fun partition p EMPTY = (EMPTY, EMPTY) | partition p (SET{root,...}) = let fun filt (SplayNil, tree1, tree2) = (tree1, tree2) | filt (SplayObj{value,left,right}, tree1, tree2) = let val (t1, t2) = filt(left, tree1, tree2) val (t1', t2') = filt(right, t1, t2) in if p value then (insert(value, t1'), t2') else (t1', insert(value, t2')) end fun mk (0, _) = EMPTY | mk (cnt, t) = SET{nobj=cnt, root=ref t} val (t1, t2) = filt (!root, (0, SplayNil), (0, SplayNil)) in (mk t1, mk t2) end fun exists p EMPTY = false | exists p (SET{root,...}) = let fun ex SplayNil = false | ex (SplayObj{value=v, left=l, right=r}) = p v orelse ex l orelse ex r in ex (!root) end fun all p EMPTY = true | all p (SET{root,...}) = let fun all' SplayNil = true | all' (SplayObj{value=v, left=l, right=r}) = p v andalso all' l andalso all' r in all' (!root) end fun find p EMPTY = NONE | find p (SET{root,...}) = let fun ex SplayNil = NONE | ex (SplayObj{value=v,left=l,right=r}) = if p v then SOME v else (case ex l of NONE => ex r | a => a (* end case *)) in ex (!root) end (* deprecated *) val listItems = toList end (* SplaySet *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/splaytree-sig.sml000066400000000000000000000014331416264345000245750ustar00rootroot00000000000000(* splaytree-sig.sml * * COPYRIGHT (c) 2015 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Signature for a splay tree data structure. * *) signature SPLAY_TREE = sig datatype 'a splay = SplayObj of { value : 'a, right : 'a splay, left : 'a splay } | SplayNil val splay : (('a -> order) * 'a splay) -> (order * 'a splay) (* (r,tree') = splay (cmp,tree) * where tree' is tree adjusted using the comparison function cmp * and, if tree' = SplayObj{value,...}, r = cmp value. * tree' = SplayNil iff tree = SplayNil, in which case r is undefined. *) val join : 'a splay * 'a splay -> 'a splay (* join(t,t') returns a new splay tree formed of t and t' *) end (* SPLAY_TREE *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/splaytree.sml000066400000000000000000000107571416264345000240260ustar00rootroot00000000000000(* splaytree.sml * * COPYRIGHT (c) 2015 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Splay tree structure. * *) structure SplayTree : SPLAY_TREE = struct datatype 'a splay = SplayObj of { value : 'a, right : 'a splay, left : 'a splay } | SplayNil datatype 'a ans_t = No | Eq of 'a | Lt of 'a | Gt of 'a fun splay (compf, root) = let fun adj SplayNil = (No,SplayNil,SplayNil) | adj (arg as SplayObj{value,left,right}) = (case compf value of EQUAL => (Eq value, left, right) | GREATER => (case left of SplayNil => (Gt value,SplayNil,right) | SplayObj{value=value',left=left',right=right'} => (case compf value' of EQUAL => (Eq value',left', SplayObj{value=value,left=right',right=right}) | GREATER => (case left' of SplayNil => (Gt value',left',SplayObj{value=value,left=right',right=right}) | _ => let val (V,L,R) = adj left' val rchild = SplayObj{value=value,left=right',right=right} in (V,L,SplayObj{value=value',left=R,right=rchild}) end ) (* end case *) | _ => (case right' of SplayNil => (Lt value',left',SplayObj{value=value,left=right',right=right}) | _ => let val (V,L,R) = adj right' val rchild = SplayObj{value=value,left=R,right=right} val lchild = SplayObj{value=value',left=left',right=L} in (V,lchild,rchild) end ) (* end case *) ) (* end case *) ) (* end case *) | _ => (case right of SplayNil => (Lt value,left,SplayNil) | SplayObj{value=value',left=left',right=right'} => (case compf value' of EQUAL => (Eq value',SplayObj{value=value,left=left,right=left'},right') | LESS => (case right' of SplayNil => (Lt value',SplayObj{value=value,left=left,right=left'},right') | _ => let val (V,L,R) = adj right' val lchild = SplayObj{value=value,left=left,right=left'} in (V,SplayObj{value=value',left=lchild,right=L},R) end ) (* end case *) | _ => (case left' of SplayNil => (Gt value',SplayObj{value=value,left=left,right=left'},right') | _ => let val (V,L,R) = adj left' val rchild = SplayObj{value=value',left=R,right=right'} val lchild = SplayObj{value=value,left=left,right=L} in (V,lchild,rchild) end ) (* end case *) ) (* end case *) ) (* end case *) ) (* end case *) in case adj root of (No,_,_) => (GREATER,SplayNil) | (Eq v,l,r) => (EQUAL,SplayObj{value=v,left=l,right=r}) | (Lt v,l,r) => (LESS,SplayObj{value=v,left=l,right=r}) | (Gt v,l,r) => (GREATER,SplayObj{value=v,left=l,right=r}) end fun lrotate SplayNil = SplayNil | lrotate (arg as SplayObj{value,left,right=SplayNil}) = arg | lrotate (SplayObj{value,left,right=SplayObj{value=v,left=l,right=r}}) = lrotate (SplayObj{value=v,left=SplayObj{value=value,left=left,right=l},right=r}) fun join (SplayNil,SplayNil) = SplayNil | join (SplayNil,t) = t | join (t,SplayNil) = t | join (l,r) = case lrotate l of SplayNil => r (* impossible as l is not SplayNil *) | SplayObj{value,left,right} => SplayObj{value=value,left=left,right=r} end (* SplayTree *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/target32-prime-sizes.sml000066400000000000000000000022101416264345000256770ustar00rootroot00000000000000(* target32-prim-sizes.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A list of prime numbers for sizing hash tables, etc. on 32-bit targets. *) structure PrimeSizes : sig val pick : int -> int end = struct (* This is a sequence of prime numbers; each number is approx. sqrt(2) * larger than the previous one in the series. The list is organized * into sublists to make searches faster. *) val primes = [ (47, [11, 13, 17, 23, 37, 47]), (367, [67, 97, 131, 191, 257, 367]), (2897, [521, 727, 1031, 1451, 2053, 2897]), (23173, [4099, 5801, 8209, 11587, 16411, 23173]), (185369, [32771, 46349, 65537, 92683, 131101, 185369]), (1482919, [262147, 370759, 524309, 741457, 1048583, 1482919]), (2097169, [2097169]) ] fun pick i = let fun f [] = raise Fail "PrimeSizes.pick: out of sequences" | f [(p, _)] = p | f ((hi, l)::r) = if (i < hi) then g l else f r and g [] = raise Fail "PrimeSizes.pick: out of primes in sequence" | g [p] = p | g (p::r) = if (i < p) then p else g r in f primes end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/target64-prime-sizes.sml000066400000000000000000000022101416264345000257040ustar00rootroot00000000000000(* target64-prim-sizes.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A list of prime numbers for sizing hash tables, etc. on 64-bit targets. *) structure PrimeSizes : sig val pick : int -> int end = struct (* This is a sequence of prime numbers; each number is approx. sqrt(2) * larger than the previous one in the series. The list is organized * into sublists to make searches faster. *) val primes = [ (47, [11, 13, 17, 23, 37, 47]), (367, [67, 97, 131, 191, 257, 367]), (2897, [521, 727, 1031, 1451, 2053, 2897]), (23173, [4099, 5801, 8209, 11587, 16411, 23173]), (185369, [32771, 46349, 65537, 92683, 131101, 185369]), (1482919, [262147, 370759, 524309, 741457, 1048583, 1482919]), (2097169, [2097169]) ] fun pick i = let fun f [] = raise Fail "PrimeSizes.pick: out of sequences" | f [(p, _)] = p | f ((hi, l)::r) = if (i < hi) then g l else f r and g [] = raise Fail "PrimeSizes.pick: out of primes in sequence" | g [p] = p | g (p::r) = if (i < p) then p else g r in f primes end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/time-limit.mlb000066400000000000000000000004141416264345000240340ustar00rootroot00000000000000ann "nonexhaustiveMatch warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused false" "forceUsed" in local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb engine.mlton.sml time-limit.mlton.sml in structure TimeLimit = TimeLimit end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/time-limit.mlton.sml000066400000000000000000000011221416264345000252020ustar00rootroot00000000000000(* time-limit.mlton.sml * * Copyright (C) 1999-2004 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under the GNU General Public License (GPL). * Please see the file MLton-LICENSE for license information. * *) structure TimeLimit: sig exception TimeOut val timeLimit : Time.time -> ('a -> 'b) -> 'a -> 'b end = struct exception TimeOut fun timeLimit t f x = case Engine.run (Engine.new (fn () => f x), t) of Engine.Done res => res | Engine.Raise exn => raise exn | Engine.TimeOut _ => raise TimeOut end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/time-limit.sml000066400000000000000000000015311416264345000240560ustar00rootroot00000000000000(* time-limit.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Limit the execution time of a computation. *) structure TimeLimit : sig exception TimeOut val timeLimit : Time.time -> ('a -> 'b) -> 'a -> 'b end = struct exception TimeOut fun timeLimit t f x = let val setitimer = SMLofNJ.IntervalTimer.setIntTimer fun timerOn () = ignore(setitimer (SOME t)) fun timerOff () = ignore(setitimer NONE) val escapeCont = SMLofNJ.Cont.callcc (fn k => ( SMLofNJ.Cont.callcc (fn k' => (SMLofNJ.Cont.throw k k')); timerOff(); raise TimeOut)) fun handler _ = escapeCont in Signals.setHandler (Signals.sigALRM, Signals.HANDLER handler); timerOn(); ((f x) handle ex => (timerOff(); raise ex)) before timerOff() end end; (* TimeLimit *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/univariate-stats.sml000066400000000000000000000104421416264345000253100ustar00rootroot00000000000000(* univariate-stats.sml * * Some statistical functions on unweighted univariate samples. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure UnivariateStats :> sig (* We distinguish between two kinds of samples. Only the "heavy" * kind permits calculation of average deviation and median. * It is also considerably more expensive because it keeps an * array of all points while the "light" variety is constant-size. *) type light type heavy type 'a sample (* light or heavy *) type 'a evaluation (* light or heavy *) (* Samples are built incrementally by adding points to an initially * empty sample: *) val lempty : light sample val hempty : unit -> heavy sample val ladd : real * light sample -> light sample (* constant *) val hadd : real * heavy sample -> heavy sample (* amortized constant *) (* Evaluate the sample; this completes all the expensive work except * for things that depend on "heavy" samples: *) val evaluate : 'a sample -> 'a evaluation (* constant *) (* extracting of "cheap" information (constant-time): *) val N : 'a evaluation -> int val n : 'a evaluation -> real (* N as real *) val mean : 'a evaluation -> real val variance : 'a evaluation -> real val standardDeviation : 'a evaluation -> real val skew : 'a evaluation -> real val kurtosis : 'a evaluation -> real (* extracting of "expensive" information: *) val median : heavy evaluation -> real (* randomized linear *) val averageDeviation : heavy evaluation -> real (* linear *) end = struct infix 8 $ val op $ = Unsafe.Array.sub infix 3 <- fun (a, i) <- x = Unsafe.Array.update (a, i, x) (* two kinds of "extra info" *) type light = unit (* nothing *) type heavy = real array * int (* rubber array of points, size *) (* a sample : extra info * N * sum x^4 * sum x^3 * sum x^2 * sum x : *) type 'a sample = 'a * int * real * real * real * real (* an evaluation: extra info * N * N as real * * mean * variance * standard deviation * * skew * kurtosis : *) datatype 'a evaluation = E of { ext_info: 'a, (* extra info *) ni: int, (* number of points *) nr: real, (* number of points (as real) *) mean: real, sd2: real, (* sd*sd = variance *) sd: real, (* standard deviation *) skew: real, kurtosis: real } val SZ = 1024 (* minimum allocated size of heavy array *) val lempty = ((), 0, 0.0, 0.0, 0.0, 0.0) fun hempty () = ((Array.array (SZ, 0.0), SZ), 0, 0.0, 0.0, 0.0, 0.0) fun ladd (x:real, ((), n, sx4, sx3, sx2, sx1)) = let val x2 = x*x val (x3, x4) = (x2*x, x2*x2) in ((), n+1, sx4+x4, sx3+x3, sx2+x2, sx1+x) end fun hadd (x:real, ((a, sz), n, sx4, sx3, sx2, sx1)) = let val x2 = x*x val (x3, x4) = (x2*x, x2*x2) val (a, sz) = if n < sz then (a, sz) else let val sz = sz+sz val b = Array.tabulate (sz, fn i => if i=ni then ds/nr else ad (i+1, ds + abs(a$i-m)) in ad (0, 0.0) end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/uref-sig.sml000066400000000000000000000071521416264345000235320ustar00rootroot00000000000000(* uref-sig.sml * * Interface to UnionFind package. * * Author: * Fritz Henglein * DIKU, University of Copenhagen * henglein@diku.dk * * DESCRIPTION * * Union/Find data type with ref-like interface. A Union/Find structure * consists of a type constructor 'a uref with operations for * making an element of 'a uref (make), getting the contents of * an element (!!), checking for equality of two elements (equal), and * for joining two elements (union). uref is analogous to ref as * expressed in the following table: * * ------------------------------------------------------------------- * type 'a ref 'a uref * ------------------------------------------------------------------- * introduction ref uref * elimination ! !! * equality = equal * updating := update * unioning link, union, unify * ------------------------------------------------------------------- * * The main difference between 'a ref and 'a uref is in the union * operation. Without union 'a ref and 'a uref can be used * interchangebly. An assignment to a reference changes only the * contents of the reference, but not the reference itself. In * particular, any two pointers that were different (in the sense of the * equality predicate = returning false) before an assignment will still * be so. Their contents may or may not be equal after the assignment, * though. In contrast, applying the union operations (link, union, * unify) to two uref elements makes the two elements themselves * equal (in the sense of the predicate equal returning true). As a * consequence their contents will also be identical: in the case of link * and union it will be the contents of one of the two unioned elements, * in the case of unify the contents is determined by a binary * function parameter. The link, union, and unify functions return true * when the elements were previously NOT equal. *) signature UREF = sig type 'a uref (* type of uref-elements with contents of type 'a *) val uRef: 'a -> 'a uref (* uref x creates a new element with contents x *) val equal: 'a uref * 'a uref -> bool (* equal (e, e') returns true if and only if e and e' are either made by * the same call to uref or if they have been unioned (see below). *) val !! : 'a uref -> 'a (* !!e returns the contents of e. * Note: if 'a is an equality type then !!(uref x) = x, and * equal(uref (!!x), x) = false. *) val update : 'a uref * 'a -> unit (* update(e, x) updates the contents of e to be x *) val unify : ('a * 'a -> 'a) -> 'a uref * 'a uref -> bool (* unify f (e, e') makes e and e' equal; if v and v' are the * contents of e and e', respectively, before unioning them, * then the contents of the unioned element is f(v,v'). Returns * true, when elements were not equal prior to the call. *) val union : 'a uref * 'a uref -> bool (* union (e, e') makes e and e' equal; the contents of the unioned * element is the contents of one of e and e' before the union operation. * After union(e, e') elements e and e' will be congruent in the * sense that they are interchangeable in any context.. Returns * true, when elements were not equal prior to the call. *) val link : 'a uref * 'a uref -> bool (* link (e, e') makes e and e' equal; the contents of the linked * element is the contents of e' before the link operation. Returns * true, when elements were not equal prior to the call. *) end; (* UREF *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/uref.sml000066400000000000000000000035031416264345000227460ustar00rootroot00000000000000(* uref.sml * * COPYRIGHT (c) 2020 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * UNIONFIND DATA STRUCTURE WITH PATH COMPRESSION AND RANKED UNION * * Author: * Fritz Henglein * DIKU, University of Copenhagen * henglein@diku.dk *) structure URef : UREF = struct datatype 'a urefC = ECR of 'a * int | PTR of 'a uref withtype 'a uref = 'a urefC ref fun find (p as ref (ECR _)) = p | find (p as ref (PTR p')) = let val p'' = find p' in p := PTR p''; p'' end fun uRef x = ref (ECR(x, 0)) fun !! p = (case !(find p) of ECR (x, _) => x | _ => raise Match (* end case *)) fun equal (p, p') = (find p = find p') fun update (p, x) = (case find p of (p' as ref(ECR(_, r))) => p' := ECR(x, r) | _ => raise Match (* end case *)) fun link (p, q) = let val p' = find p val q' = find q in if (p' = q') then false else (p' := PTR q; true) end fun unify f (p, q) = (case (find p, find q) of (p' as ref(ECR(pc, pr)), q' as ref(ECR(qc, qr))) => let val newC = f (pc, qc) in if p' = q' then (p' := ECR(newC, pr); false) else ( if pr = qr then (q' := ECR(newC, qr+1); p' := PTR q') else if pr < qr then (q' := ECR(newC, qr); p' := PTR q') else ((* pr > qr *) p' := ECR(newC, pr); q':= PTR p'); true) end | _ => raise Match (* end case *)) fun union (p, q) = let val p' = find p val q' = find q in if (p' = q') then false else (case (!p', !q') of (ECR(pc, pr), ECR(qc, qr)) => ( if pr = qr then (q' := ECR(qc, qr+1); p' := PTR q') else if pr < qr then p' := PTR q' else q':= PTR p'; true) | _ => raise Match (* end case *)) end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/utf8-sig.sml000066400000000000000000000032251416264345000234540ustar00rootroot00000000000000(* utf8-sig.sml * * COPYRIGHT (c) 2020 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * Routines for working with UTF8 encoded strings. *) signature UTF8 = sig type wchar = word val maxCodePoint : wchar (* = 0wx0010FFFF *) exception Incomplete (* raised by some operations when applied to incomplete strings. *) (** Character operations **) val getu : (char, 'strm) StringCvt.reader -> (wchar, 'strm) StringCvt.reader (* convert a character reader to a wide-character reader *) val encode : wchar -> string (* return the UTF8 encoding of a wide character *) val isAscii : wchar -> bool val toAscii : wchar -> char (* truncates to 7-bits *) val fromAscii : char -> wchar (* truncates to 7-bits *) val toString : wchar -> string (* return a printable string representation of a wide character *) (** String operations **) val size : string -> int (* return the number of Unicode characters *) val explode : string -> wchar list (* return the list of wide characters that are encoded by a string *) val implode : wchar list -> string (* return the UTF-8 encoded string that represents the list of * Unicode code points. *) val map : (wchar -> wchar) -> string -> string (* map a function over the Unicode characters in the string *) val app : (wchar -> unit) -> string -> unit (* apply a function to the Unicode characters in the string *) val fold : ((wchar * 'a) -> 'a) -> 'a -> string -> 'a (* fold a function over the Unicode characters in the string *) val all : (wchar -> bool) -> string -> bool val exists : (wchar -> bool) -> string -> bool end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/utf8.sml000066400000000000000000000135121416264345000226740ustar00rootroot00000000000000(* utf8.sml * * COPYRIGHT (c) 2020 John Reppy (http://www.cs.uchicago.edu/~jhr) * All rights reserved. * * Routines for working with UTF8 encoded strings. * * Unicode value 1st byte 2nd byte 3rd byte 4th byte * ----------------------- -------- -------- -------- -------- * 00000 00000000 0xxxxxxx 0xxxxxxx * 00000 00000yyy yyxxxxxx 110yyyyy 10xxxxxx * 00000 zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx * wwwzz zzzzyyyy yyxxxxxx 11110www 10zzzzzz 10yyyyyy 10xxxxxx * *) structure UTF8 :> UTF8 = struct structure W = Word structure SS = Substring type wchar = W.word fun w2c w = Char.chr(W.toInt w) val maxCodePoint : wchar = 0wx0010FFFF (* maximum values for the first byte for each encoding length *) val max1Byte : W.word = 0wx7f (* 0xxx xxxx *) val max2Byte : W.word = 0wxdf (* 110x xxxx *) val max3Byte : W.word = 0wxef (* 1110 xxxx *) val max4Byte : W.word = 0wxf7 (* 1111 0xxx *) (* bit masks for the first byte for each encoding length *) val mask2Byte : W.word = 0wx1f val mask3Byte : W.word = 0wx0f val mask4Byte : W.word = 0wx07 exception Incomplete (* raised by some operations when applied to incomplete strings. *) (* add a continuation byte to the end of wc. Continuation bytes have * the form 0b10xxxxxx. *) fun getContByte getc (wc, ss) = (case (getc ss) of NONE => raise Incomplete | SOME(c, ss') => let val b = W.fromInt(Char.ord c) in if (W.andb(0wxc0, b) = 0wx80) then (W.orb(W.<<(wc, 0w6), W.andb(0wx3f, b)), ss') else raise Incomplete end (* end case *)) (* convert a character reader to a wide-character reader *) fun getu getc = let val getContByte = getContByte getc fun get strm = (case getc strm of NONE => NONE | SOME(c, ss) => let val w = W.fromInt(Char.ord c) val (wc, ss) = if (w <= max1Byte) then (w, ss) else if (w <= max2Byte) then getContByte (W.andb(mask2Byte, w), ss) else if (w <= max3Byte) then getContByte(getContByte(W.andb(mask3Byte, w), ss)) else if (w <= max4Byte) then getContByte(getContByte(getContByte(W.andb(mask4Byte, w), ss))) else raise Incomplete in SOME(wc, ss) end (* end case *)) in get end fun isAscii (wc : wchar) = (wc <= max1Byte) fun toAscii (wc : wchar) = w2c(W.andb(0wx7f, wc)) fun fromAscii c = W.andb(0wx7f, W.fromInt(Char.ord c)) (* return a printable string representation of a wide character *) fun toString wc = if isAscii wc then Char.toCString(toAscii wc) else if (wc <= max2Byte) then "\\u" ^ (StringCvt.padLeft #"0" 4 (W.toString wc)) (* NOTE: the following is not really SML syntax *) else "\\u" ^ (StringCvt.padLeft #"0" 8 (W.toString wc)) (* return a list of characters that is the UTF8 encoding of a wide character *) fun encode' (wc, chrs) = if (wc <= 0wx7f) then w2c wc :: chrs else if (wc <= 0wx7ff) then w2c(W.orb(0wxc0, W.>>(wc, 0w6))) :: w2c(W.orb(0wx80, W.andb(wc, 0wx3f))) :: chrs else if (wc <= 0wxffff) then w2c(W.orb(0wxe0, W.>>(wc, 0w12))) :: w2c(W.orb(0wx80, W.andb(W.>>(wc, 0w6), 0wx3f))) :: w2c(W.orb(0wx80, W.andb(wc, 0wx3f))) :: chrs else if (wc <= maxCodePoint) then w2c(W.orb(0wxf0, W.>>(wc, 0w18))) :: w2c(W.orb(0wx80, W.andb(W.>>(wc, 0w12), 0wx3f))) :: w2c(W.orb(0wx80, W.andb(W.>>(wc, 0w6), 0wx3f))) :: w2c(W.orb(0wx80, W.andb(wc, 0wx3f))) :: chrs else raise Domain fun encode wc = String.implode(encode'(wc, [])) val getContByte = getContByte SS.getc fun getWC (c1, ss) = let val w = W.fromInt(Char.ord c1) val (wc, ss) = if (w <= max1Byte) then (w, ss) else if (w <= max2Byte) then getContByte (W.andb(mask2Byte, w), ss) else if (w <= max3Byte) then getContByte(getContByte(W.andb(mask3Byte, w), ss)) else if (w <= max4Byte) then getContByte(getContByte(getContByte(W.andb(mask4Byte, w), ss))) else raise Incomplete in (wc, ss) end (* return the number of Unicode characters *) fun size s = let fun len (ss, n) = (case SS.getc ss of NONE => n | SOME arg => let val (_, ss) = getWC arg in len (ss, n+1) end (* end case *)) in len (SS.full s, 0) end fun map f s = let fun mapf (ss, chrs) = (case SS.getc ss of NONE => String.implode (List.rev chrs) | SOME arg => let val (wc, ss) = getWC arg in mapf (ss, List.revAppend(encode'(wc, []), chrs)) end (* end case *)) in mapf (SS.full s, []) end fun app f s = let fun appf ss = (case SS.getc ss of NONE => () | SOME arg => let val (wc, ss) = getWC arg in f wc; appf ss end (* end case *)) in appf (SS.full s) end (* fold a function over the Unicode characters in the string *) fun fold f = let fun foldf (ss, acc) = (case SS.getc ss of NONE => acc | SOME arg => let val (wc, ss) = getWC arg in foldf (ss, f (wc, acc)) end (* end case *)) in fn init => fn s => foldf (SS.full s, init) end fun all pred s = let fun allf ss = (case SS.getc ss of NONE => true | SOME arg => let val (wc, ss) = getWC arg in pred wc andalso allf ss end (* end case *)) in allf (SS.full s) end fun exists pred s = let fun existsf ss = (case SS.getc ss of NONE => true | SOME arg => let val (wc, ss) = getWC arg in pred wc orelse existsf ss end (* end case *)) in existsf (SS.full s) end (* return the list of wide characters that are encoded by a string *) fun explode s = List.rev(fold (op ::) [] s) fun implode wcs = String.implode(List.foldr encode' [] wcs) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/word-hash-table.sml000066400000000000000000000130131416264345000247630ustar00rootroot00000000000000(* word-hash-table.sml * * COPYRIGHT (c) 2018 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A specialization of the hash table functor to word keys. * * AUTHOR: John Reppy * University of Chicago * https://cs.uchicago.edu/~jhr *) structure WordHashTable :> MONO_HASH_TABLE where type Key.hash_key = word = struct structure Key = struct type hash_key = word fun sameKey (a : word, b) = (a = b) fun hashVal a = a end open Key structure HTRep = HashTableRep datatype 'a hash_table = HT of { not_found : exn, table : (hash_key, 'a) HTRep.table ref, n_items : int ref } fun index (i, sz) = Word.toIntX(Word.andb(i, Word.fromInt sz - 0w1)) (* Create a new table; the int is a size hint and the exception * is to be raised by find. *) fun mkTable (sizeHint, notFound) = HT{ not_found = notFound, table = ref (HTRep.alloc sizeHint), n_items = ref 0 } (* remove all elements from the table *) fun clear (HT{table, n_items, ...}) = (HTRep.clear(!table); n_items := 0) (* Insert an item. If the key already has an item associated with it, * then the old item is discarded. *) fun insert (tbl as HT{table, n_items, ...}) (key, item) = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = ( Array.update(arr, indx, HTRep.B(hash, key, item, Array.sub(arr, indx))); n_items := !n_items + 1; HTRep.growTableIfNeeded (table, !n_items); HTRep.NIL) | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then HTRep.B(hash, key, item, r) else (case (look r) of HTRep.NIL => HTRep.NIL | rest => HTRep.B(h, k, v, rest) (* end case *)) in case (look (Array.sub (arr, indx))) of HTRep.NIL => () | b => Array.update(arr, indx, b) (* end case *) end (* return true, if the key is in the domain of the table *) fun inDomain (HT{table, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = false | look (HTRep.B(h, k, v, r)) = ((hash = h) andalso sameKey(key, k)) orelse look r in look (Array.sub (arr, indx)) end (* find an item, the table's exception is raised if the item doesn't exist *) fun lookup (HT{table, not_found, ...}) key = let val arr = !table val hash = hashVal key val indx = index (hash, Array.length arr) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then v else look r in look (Array.sub (arr, indx)) end (* look for an item, return NONE if the item doesn't exist *) fun find (HT{table, ...}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = NONE | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then SOME v else look r in look (Array.sub (arr, indx)) end (* Remove an item. The table's exception is raised if * the item doesn't exist. *) fun remove (HT{not_found, table, n_items}) key = let val arr = !table val sz = Array.length arr val hash = hashVal key val indx = index (hash, sz) fun look HTRep.NIL = raise not_found | look (HTRep.B(h, k, v, r)) = if ((hash = h) andalso sameKey(key, k)) then (v, r) else let val (item, r') = look r in (item, HTRep.B(h, k, v, r')) end val (item, bucket) = look (Array.sub (arr, indx)) in Array.update (arr, indx, bucket); n_items := !n_items - 1; item end (* remove *) (* Return the number of items in the table *) fun numItems (HT{n_items, ...}) = !n_items (* return a list of the items in the table *) fun listItems (HT{table = ref arr, n_items, ...}) = HTRep.listItems (arr, n_items) fun listItemsi (HT{table = ref arr, n_items, ...}) = HTRep.listItemsi (arr, n_items) (* Apply a function to the entries of the table *) fun appi f (HT{table, ...}) = HTRep.appi f (! table) fun app f (HT{table, ...}) = HTRep.app f (! table) (* Map a table to a new table that has the same keys and exception *) fun mapi f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.mapi f (! table)), n_items = ref(!n_items), not_found = not_found } fun map f (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.map f (! table)), n_items = ref(!n_items), not_found = not_found } (* Fold a function over the entries of the table *) fun foldi f init (HT{table, ...}) = HTRep.foldi f init (! table) fun fold f init (HT{table, ...}) = HTRep.fold f init (! table) (* modify the hash-table items in place *) fun modifyi f (HT{table, ...}) = HTRep.modifyi f (!table) fun modify f (HT{table, ...}) = HTRep.modify f (!table) (* remove any hash table items that do not satisfy the given * predicate. *) fun filteri pred (HT{table, n_items, ...}) = n_items := HTRep.filteri pred (! table) fun filter pred (HT{table, n_items, ...}) = n_items := HTRep.filter pred (! table) (* Create a copy of a hash table *) fun copy (HT{table, n_items, not_found}) = HT{ table = ref(HTRep.copy(! table)), n_items = ref(!n_items), not_found = not_found } (* returns a list of the sizes of the various buckets. This is to * allow users to gauge the quality of their hashing function. *) fun bucketSizes (HT{table, ...}) = HTRep.bucketSizes (! table) end (* HashTableFn *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/word-redblack-map.sml000066400000000000000000000523641416264345000253110ustar00rootroot00000000000000(* word-redblack-map.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 2000 Bell Labs, Lucent Technologies. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) structure WordRedBlackMap :> ORD_MAP where type Key.ord_key = word = struct structure Key = struct type ord_key = word val compare = Word.compare end datatype color = R | B datatype 'a tree = E | T of (color * 'a tree * Key.ord_key * 'a * 'a tree) datatype 'a map = MAP of (int * 'a tree) fun isEmpty (MAP(_, E)) = true | isEmpty _ = false val empty = MAP(0, E) fun singleton (xk, x) = MAP(1, T(B, E, xk, x, E)) fun insert (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = if (xk < yk) then (case a of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk,w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) else if (xk = zk) then T(color, T(R, c, xk, x, d), yk, y, b) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) else if (xk = yk) then T(color, a, xk, x, b) else (case b of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) else if (xk = zk) then T(color, a, yk, y, T(R, c, xk, x, d)) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insert' ((xk, x), m) = insert (m, xk, x) fun insertWithi comb (MAP(nItems, m), xk, x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, xk, x, E)) | ins (s as T(color, a, yk, y, b)) = if (xk < yk) then (case a of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,e,wk,w,f), zk, z, T(B,d,yk,y,b)) | c => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) else if (xk = zk) then T(color, T(R, c, xk, comb(xk, z, x), d), yk, y, b) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,c,zk,z,e), wk, w, T(B,f,yk,y,b)) | d => T(B, T(R,c,zk,z,d), yk, y, b) (* end case *)) | _ => T(B, ins a, yk, y, b) (* end case *)) else if (xk = yk) then T(color, a, xk, comb(xk, y, x), b) else (case b of T(R, c, zk, z, d) => if (xk < zk) then (case ins c of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,e), wk, w, T(B,f,zk,z,d)) | c => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) else if (xk = zk) then T(color, a, yk, y, T(R, c, xk, comb(xk, z, x), d)) else (case ins d of T(R, e, wk, w, f) => T(R, T(B,a,yk,y,c), zk, z, T(B,e,wk,w,f)) | d => T(B, a, yk, y, T(R,c,zk,z,d)) (* end case *)) | _ => T(B, a, yk, y, ins b) (* end case *)) val T(_, a, yk, y, b) = ins m in MAP(!nItems', T(B, a, yk, y, b)) end fun insertWith comb = insertWithi (fn (_, x1, x2) => comb(x1, x2)) (* Is a key in the domain of the map? *) fun inDomain (MAP(_, t), k) = let fun find' E = false | find' (T(_, a, yk, y, b)) = (k = yk) orelse ((k < yk) andalso find' a) orelse (find' b) in find' t end (* Look for an item, return NONE if the item doesn't exist *) fun find (MAP(_, t), k) = let fun find' E = NONE | find' (T(_, a, yk, y, b)) = if (k < yk) then find' a else if (k = yk) then SOME y else find' b in find' t end (* Look for an item, raise NotFound if the item doesn't exist *) fun lookup (MAP(_, t), k) = let fun look E = raise LibBase.NotFound | look (T(_, a, yk, y, b)) = if (k < yk) then look a else if (k = yk) then y else look b in look t end (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) local datatype 'a zipper = TOP | LEFT of (color * Key.ord_key * 'a * 'a tree * 'a zipper) | RIGHT of (color * 'a tree * Key.ord_key * 'a * 'a zipper) in fun remove (MAP(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, xk, x, b, z), a) = zip(z, T(color, a, xk, x, b)) | zip (RIGHT(color, a, xk, x, z), b) = zip(z, T(color, a, xk, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, xk, x, T(R, a, yk, y, b), p), t) = (case a of T(_, T(R, a11, wk, w, a12), zk, z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a11), wk, w, T(B, a12, zk, z, a2)), yk, y, b))) | T(_, a1, zk, z, T(R, a21, wk, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, xk, x, a1), zk, z, T(B, a21, wk, w, t22)), yk, y, b))) | T(_, a1, zk, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, xk, x, T(R, a1, zk, z, a2)), yk, y, b))) | _ => fixupZip (LEFT(R, xk, x, a, LEFT(B, yk, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, xk, x, b), yk, y, p), t) = (case b of T(_, b1, zk, z, T(R, b21, wk, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b1, zk, z, b21), wk, w, T(B, b22, yk, y, t))))) | T(_, T(R, b11, wk, w, b12), zk, z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, xk, x, T(R, T(B, b11, wk, w, b12), zk, z, T(B, b2, yk, y, t))))) | T(_, b1, zk, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, xk, x, T(B, T(R, b1, zk, z, b2), yk, y, t)))) | _ => fixupZip (RIGHT(R, b, yk, y, RIGHT(B, a, xk, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, T(R, a1, yk, y, a2), zk, z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, xk, x, a1), yk, y, T(B, a2, zk, z, b)))) | fixupZip (RIGHT(color, T(B, a, xk, x, T(R, b1, yk, y, b2)), zk, z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, xk, x, b1), yk, y, T(B, b2, zk, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, xk, x, T(B, a, yk, y, T(R, b1, zk, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, xk, x, a), yk, y, T(B, b1, zk, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, zk, z, a2), xk, x, b), yk, y, p), t) = (false, zip (p, T(color, T(B, a1, zk, z, a2), xk, x, T(B, b, yk, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, xk, x, T(B, a, yk, y, b), p), t) = (false, zip (p, T(B, t, xk, x, T(R, a, yk, y, b)))) | fixupZip (LEFT(B, xk, x, T(B, a, yk, y, b), p), t) = fixupZip (p, T(B, t, xk, x, T(R, a, yk, y, b))) | fixupZip (RIGHT(R, T(B, a, xk, x, b), yk, y, p), t) = (false, zip (p, T(B, T(R, a, xk, x, b), yk, y, t))) | fixupZip (RIGHT(B, T(B, a, xk, x, b), yk, y, p), t) = fixupZip (p, T(B, T(R, a, xk, x, b), yk, y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, yk, y, E, p), t) = fixupZip (p, T(R, t, yk, y, E)) | fixupZip (RIGHT(_, E, yk, y, p), t) = fixupZip (p, T(R, E, yk, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a 4-tuple * (key, elem, bd, tr), where key is the minimum key, elem is the element * named by key, tr is the residual tree with elem removed, and bd is true * if tr has a black-depth that is less than the original tree. *) fun delMin (T(R, E, yk, y, b), p) = (* replace the node by its right subtree (which must be E) *) (yk, y, false, zip(p, b)) | delMin (T(B, E, yk, y, T(R, a', yk', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (yk, y, false, zip (p, T(B, a', yk', y', b'))) | delMin (T(B, E, yk, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (yk, y, blkDeficit, t) end | delMin (T(color, a, yk, y, b), z) = delMin(a, LEFT(color, yk, y, b, z)) | delMin (E, _) = raise Match fun del (E, p) = raise LibBase.NotFound | del (T(color, a, yk, y, b), p) = if (k < yk) then del (a, LEFT(color, yk, y, b, p)) else if (k = yk) then (case (color, a, b) of (R, E, E) => (y, zip(p, E)) | (B, E, E) => (y, #2 (fixupZip (p, E))) | (_, T(_, a', yk', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | (_, E, T(_, a', yk', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) (y, zip(p, T(B, a', yk', y', b'))) | _ => let val (minKey, minElem, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then (y, #2 (fixupZip (RIGHT(color, a, minKey, minElem, p), b))) else (y, zip (p, T(color, a, minKey, minElem, b))) end (* end case *)) else del (b, RIGHT(color, a, yk, y, p)) val (item, t) = del(t, TOP) in case t of T(R, a, xk, x, b) => (MAP(nItems-1, T(B, a, xk, x, b)), item) | t => (MAP(nItems-1, t), item) (* end case *) end end (* local *) (* return the first item in the map (or NONE if it is empty) *) fun first (MAP(_, t)) = let fun f E = NONE | f (T(_, E, _, x, _)) = SOME x | f (T(_, a, _, _, _)) = f a in f t end fun firsti (MAP(_, t)) = let fun f E = NONE | f (T(_, E, xk, x, _)) = SOME(xk, x) | f (T(_, a, _, _, _)) = f a in f t end (* Return the number of items in the map *) fun numItems (MAP(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldli f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(b, f(xk, x, foldf(a, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, _, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun foldri f = let fun foldf (E, accum) = accum | foldf (T(_, a, xk, x, b), accum) = foldf(a, f(xk, x, foldf(b, accum))) in fn init => fn (MAP(_, m)) => foldf(m, init) end fun listItems m = foldr (op ::) [] m fun listItemsi m = foldri (fn (xk, x, l) => (xk, x)::l) [] m (* return an ordered list of the keys in the map. *) fun listKeys m = foldri (fn (k, _, l) => k::l) [] m (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* given an ordering on the map's range, return an ordering * on the map. *) fun collate cmpRng = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk = yk) then (case cmpRng(x, y) of EQUAL => cmp (r1, r2) | order => order (* end case *)) else if (xk < yk) then LESS else GREATER (* end case *)) in fn (MAP(_, m1), MAP(_, m2)) => cmp (start m1, start m2) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype 'a digit = ZERO | ONE of (Key.ord_key * 'a * 'a tree * 'a digit) | TWO of (Key.ord_key * 'a * 'a tree * Key.ord_key * 'a * 'a tree * 'a digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (ak, a, l) = let fun incr (ak, a, t, ZERO) = ONE(ak, a, t, ZERO) | incr (ak1, a1, t1, ONE(ak2, a2, t2, r)) = TWO(ak1, a1, t1, ak2, a2, t2, r) | incr (ak1, a1, t1, TWO(ak2, a2, t2, ak3, a3, t3, r)) = ONE(ak1, a1, t1, incr(ak2, a2, T(B, t3, ak3, a3, t2), r)) in incr(ak, a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(ak, a, t2, r)) = link(T(B, t2, ak, a, t1), r) | link (t, TWO(ak1, a1, t1, ak2, a2, t2, r)) = link(T(B, T(R, t2, ak2, a2, t1), ak1, a1, t), r) in link (E, t) end local fun wrap f (MAP(_, m1), MAP(_, m2)) = let val (n, result) = f (start m1, start m2, 0, ZERO) in MAP(n, linkAll result) end fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, xk, x, _), r), n, result) = ins(next r, n+1, addItem(xk, x, result)) in (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) fun unionWith mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then union (r1, t2, n+1, addItem(xk, x, result)) else if (xk = yk) then union (r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) else union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) in wrap union end fun unionWithi mergeFn = let fun union (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then union (r1, t2, n+1, addItem(xk, x, result)) else if (xk = yk) then union (r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) else union (t1, r2, n+1, addItem(yk, y, result)) (* end case *)) in wrap union end (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) fun intersectWith mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then intersect (r1, t2, n, result) else if (xk = yk) then intersect ( r1, r2, n+1, addItem(xk, mergeFn(x, y), result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) in wrap intersect end fun intersectWithi mergeFn = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then intersect (r1, t2, n, result) else if (xk = yk) then intersect (r1, r2, n+1, addItem(xk, mergeFn(xk, x, y), result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) in wrap intersect end fun mergeWith mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then mergef(xk, SOME x, NONE, r1, t2, n, result) else if (xk = yk) then mergef(xk, SOME x, SOME y, r1, r2, n, result) else mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end fun mergeWithi mergeFn = let fun merge (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), (T(_, _, yk, y, _), r2)) => mergef(yk, NONE, SOME y, t1, r2, n, result) | ((T(_, _, xk, x, _), r1), (E, _)) => mergef(xk, SOME x, NONE, r1, t2, n, result) | ((T(_, _, xk, x, _), r1), (T(_, _, yk, y, _), r2)) => if (xk < yk) then mergef(xk, SOME x, NONE, r1, t2, n, result) else if (xk = yk) then mergef(xk, SOME x, SOME y, r1, r2, n, result) else mergef(yk, NONE, SOME y, t1, r2, n, result) (* end case *)) and mergef (k, x1, x2, r1, r2, n, result) = (case mergeFn(k, x1, x2) of NONE => merge (r1, r2, n, result) | SOME y => merge (r1, r2, n+1, addItem(k, y, result)) (* end case *)) in wrap merge end end (* local *) fun app f = let fun appf E = () | appf (T(_, a, _, x, b)) = (appf a; f x; appf b) in fn (MAP(_, m)) => appf m end fun appi f = let fun appf E = () | appf (T(_, a, xk, x, b)) = (appf a; f(xk, x); appf b) in fn (MAP(_, m)) => appf m end fun map f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f x, mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end fun mapi f = let fun mapf E = E | mapf (T(color, a, xk, x, b)) = T(color, mapf a, xk, f(xk, x), mapf b) in fn (MAP(n, m)) => MAP(n, mapf m) end (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end fun filteri pred (MAP(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, xk, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred(xk, x)) then walk(b, n+1, addItem(xk, x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in MAP(n, linkAll result) end (* map a partial function over the elements of a map in increasing * map order. *) fun mapPartial f = let fun f' (xk, x, m) = (case f x of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end fun mapPartiali f = let fun f' (xk, x, m) = (case f(xk, x) of NONE => m | (SOME y) => insert(m, xk, y) (* end case *)) in foldli f' empty end (* check the elements of a map with a predicate and return true if * any element satisfies the predicate. Return false otherwise. * Elements are checked in key order. *) fun exists pred = let fun exists' E = false | exists' (T(_, a, _, x, b)) = exists' a orelse pred x orelse exists' b in fn (MAP(_, m)) => exists' m end fun existsi pred = let fun exists' E = false | exists' (T(_, a, k, x, b)) = exists' a orelse pred(k, x) orelse exists' b in fn (MAP(_, m)) => exists' m end (* check the elements of a map with a predicate and return true if * they all satisfy the predicate. Return false otherwise. Elements * are checked in key order. *) fun all pred = let fun all' E = true | all' (T(_, a, _, x, b)) = all' a andalso pred x andalso all' b in fn (MAP(_, m)) => all' m end fun alli pred = let fun all' E = true | all' (T(_, a, k, x, b)) = all' a andalso pred(k, x) andalso all' b in fn (MAP(_, m)) => all' m end end (* structure WordRedBlackMap *) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/Util/word-redblack-set.sml000066400000000000000000000407101416264345000253170ustar00rootroot00000000000000(* word-redblack-set.sml * * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * COPYRIGHT (c) 1999 Bell Labs, Lucent Technologies. * * This code is based on Chris Okasaki's implementation of * red-black trees. The linear-time tree construction code is * based on the paper "Constructing red-black trees" by Hinze, * and the delete function is based on the description in Cormen, * Leiserson, and Rivest. * * A red-black tree should satisfy the following two invariants: * * Red Invariant: each red node has black children (empty nodes are * considered black). * * Black Invariant: each path from the root to an empty node has the * same number of black nodes (the tree's black height). * * The Black invariant implies that any node with only one child * will be black and its child will be a red leaf. *) structure WordRedBlackSet :> ORD_SET where type Key.ord_key = word = struct structure Key = struct type ord_key = word val compare = Word.compare end type item = Key.ord_key datatype color = R | B datatype tree = E | T of (color * tree * item * tree) datatype set = SET of (int * tree) fun isEmpty (SET(_, E)) = true | isEmpty _ = false val empty = SET(0, E) fun minItem (SET(_, tr)) = let fun min E = raise Empty | min (T(_, E, item, _)) = item | min (T(_, tr, _, _)) = min tr in min tr end fun maxItem (SET(_, tr)) = let fun max E = raise Empty | max (T(_, _, item, E)) = item | max (T(_, _, _, tr)) = max tr in max tr end fun singleton x = SET(1, T(B, E, x, E)) fun add (SET(nItems, m), x) = let val nItems' = ref nItems fun ins E = (nItems' := nItems+1; T(R, E, x, E)) | ins (s as T(color, a, y, b)) = if (x < y) then (case a of T(R, c, z, d) => if (x < z) then (case ins c of T(R, e, w, f) => T(R, T(B,e,w,f), z, T(B,d,y,b)) | c => T(B, T(R,c,z,d), y, b) (* end case *)) else if (x = z) then T(color, T(R, c, x, d), y, b) else (case ins d of T(R, e, w, f) => T(R, T(B,c,z,e), w, T(B,f,y,b)) | d => T(B, T(R,c,z,d), y, b) (* end case *)) | _ => T(B, ins a, y, b) (* end case *)) else if (x = y) then T(color, a, x, b) else (case b of T(R, c, z, d) => if (x < z) then (case ins c of T(R, e, w, f) => T(R, T(B,a,y,e), w, T(B,f,z,d)) | c => T(B, a, y, T(R,c,z,d)) (* end case *)) else if (x = z) then T(color, a, y, T(R, c, x, d)) else (case ins d of T(R, e, w, f) => T(R, T(B,a,y,c), z, T(B,e,w,f)) | d => T(B, a, y, T(R,c,z,d)) (* end case *)) | _ => T(B, a, y, ins b) (* end case *)) val T(_, a, y, b) = ins m in SET(!nItems', T(B, a, y, b)) end fun add' (x, m) = add (m, x) fun addList (s, []) = s | addList (s, x::r) = addList(add(s, x), r) (* Remove an item. Raises LibBase.NotFound if not found. *) local datatype zipper = TOP | LEFT of (color * item * tree * zipper) | RIGHT of (color * tree * item * zipper) in fun delete (SET(nItems, t), k) = let (* zip the zipper *) fun zip (TOP, t) = t | zip (LEFT(color, x, b, p), a) = zip(p, T(color, a, x, b)) | zip (RIGHT(color, a, x, p), b) = zip(p, T(color, a, x, b)) (* zip the zipper while resolving a black deficit *) fun fixupZip (TOP, t) = (true, t) (* case 1 from CLR *) | fixupZip (LEFT(B, x, T(R, a, y, b), p), t) = (case a of T(_, T(R, a11, w, a12), z, a2) => (* case 1L ==> case 3L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a11), w, T(B, a12, z, a2)), y, b))) | T(_, a1, z, T(R, a21, w, t22)) => (* case 1L ==> case 4L *) (false, zip (p, T(B, T(R, T(B, t, x, a1), z, T(B, a21, w, t22)), y, b))) | T(_, a1, z, a2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, T(B, t, x, T(R, a1, z, a2)), y, b))) | _ => fixupZip (LEFT(R, x, a, LEFT(B, y, b, p)), t) (* end case *)) | fixupZip (RIGHT(B, T(R, a, x, b), y, p), t) = (case b of T(_, b1, z, T(R, b21, w, b22)) => (* case 1R ==> case 3R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b1, z, b21), w, T(B, b22, y, t))))) | T(_, T(R, b11, w, b12), z, b2) => (* case 1R ==> case 4R *) (false, zip (p, T(B, a, x, T(R, T(B, b11, w, b12), z, T(B, b2, y, t))))) | T(_, b1, z, b2) => (* case 1L ==> case 2L; rotate + recolor fixes deficit *) (false, zip (p, T(B, a, x, T(B, T(R, b1, z, b2), y, t)))) | _ => fixupZip (RIGHT(R, b, y, RIGHT(B, a, x, p)), t) (* end case *)) (* case 3 from CLR *) | fixupZip (LEFT(color, x, T(B, T(R, a1, y, a2), z, b), p), t) = (* case 3L ==> case 4L *) (false, zip (p, T(color, T(B, t, x, a1), y, T(B, a2, z, b)))) | fixupZip (RIGHT(color, T(B, a, x, T(R, b1, y, b2)), z, p), t) = (* case 3R ==> case 4R; rotate, recolor, plus rotate fixes deficit *) (false, zip (p, T(color, T(B, a, x, b1), y, T(B, b2, z, t)))) (* case 4 from CLR *) | fixupZip (LEFT(color, x, T(B, a, y, T(R, b1, z, b2)), p), t) = (false, zip (p, T(color, T(B, t, x, a), y, T(B, b1, z, b2)))) | fixupZip (RIGHT(color, T(B, T(R, a1, z, a2), x, b), y, p), t) = (false, zip (p, T(color, T(B, a1, z, a2), x, T(B, b, y, t)))) (* case 2 from CLR; note that "a" and "b" are guaranteed to be black, since we did * not match cases 3 or 4. *) | fixupZip (LEFT(R, x, T(B, a, y, b), p), t) = (false, zip (p, T(B, t, x, T(R, a, y, b)))) | fixupZip (LEFT(B, x, T(B, a, y, b), p), t) = fixupZip (p, T(B, t, x, T(R, a, y, b))) | fixupZip (RIGHT(R, T(B, a, x, b), y, p), t) = (false, zip (p, T(B, T(R, a, x, b), y, t))) | fixupZip (RIGHT(B, T(B, a, x, b), y, p), t) = fixupZip (p, T(B, T(R, a, x, b), y, t)) (* push deficit up the tree by recoloring a black node as red *) | fixupZip (LEFT(_, y, E, p), t) = fixupZip (p, T(R, t, y, E)) | fixupZip (RIGHT(_, E, y, p), t) = fixupZip (p, T(R, E, y, t)) (* impossible cases that violate the red invariant *) | fixupZip _ = raise Fail "Red invariant violation" (* delete the minimum value from a non-empty tree, returning a triple * (elem, bd, tr), where elem is the minimum element, tr is the residual * tree with elem removed, and bd is true if tr has a black-depth that is * less than the original tree. *) fun delMin (T(R, E, y, b), p) = (* replace the node by its right subtree (which must be E) *) (y, false, zip(p, b)) | delMin (T(B, E, y, T(R, a', y', b')), p) = (* replace the node with its right child, while recoloring the child black to * preserve the black invariant. *) (y, false, zip (p, T(B, a', y', b'))) | delMin (T(B, E, y, E), p) = let (* delete the node, which reduces the black-depth by one, so we attempt to fix * the deficit on the path back. *) val (blkDeficit, t) = fixupZip (p, E) in (y, blkDeficit, t) end | delMin (T(color, a, y, b), z) = delMin(a, LEFT(color, y, b, z)) | delMin (E, _) = raise Match fun del (E, z) = raise LibBase.NotFound | del (T(color, a, y, b), p) = if (k < y) then del (a, LEFT(color, y, b, p)) else if (k = y) then (case (color, a, b) of (R, E, E) => zip(p, E) | (B, E, E) => #2 (fixupZip (p, E)) | (_, T(_, a', y', b'), E) => (* node is black and left child is red; we replace the node with its * left child recolored to black. *) zip(p, T(B, a', y', b')) | (_, E, T(_, a', y', b')) => (* node is black and right child is red; we replace the node with its * right child recolored to black. *) zip(p, T(B, a', y', b')) | _ => let val (minSucc, blkDeficit, b) = delMin (b, TOP) in if blkDeficit then #2 (fixupZip (RIGHT(color, a, minSucc, p), b)) else zip (p, T(color, a, minSucc, b)) end (* end case *)) else del (b, RIGHT(color, a, y, p)) in case del(t, TOP) of T(R, a, x, b) => SET(nItems-1, T(B, a, x, b)) | t => SET(nItems-1, t) (* end case *) end end (* local *) (* Return true if and only if item is an element in the set *) fun member (SET(_, t), k) = let fun find' E = false | find' (T(_, a, y, b)) = (k = y) orelse ((k < y) andalso find' a) orelse find' b in find' t end (* Return the number of items in the map *) fun numItems (SET(n, _)) = n fun foldl f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(b, f(x, foldf(a, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end fun foldr f = let fun foldf (E, accum) = accum | foldf (T(_, a, x, b), accum) = foldf(a, f(x, foldf(b, accum))) in fn init => fn (SET(_, m)) => foldf(m, init) end (* return an ordered list of the items in the set. *) fun toList s = foldr (fn (x, l) => x::l) [] s (* functions for walking the tree while keeping a stack of parents * to be visited. *) fun next ((t as T(_, _, _, b))::rest) = (t, left(b, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T(_, a, _, _), rest) = left(a, t::rest) fun start m = left(m, []) (* Return true if and only if the two sets are equal *) fun equal (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => false | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => (x = y) andalso cmp (r1, r2) (* end case *)) in cmp (start s1, start s2) end (* Return the lexical order of two sets *) fun compare (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x = y) then cmp (r1, r2) else if (x < y) then LESS else GREATER (* end case *)) in cmp (start s1, start s2) end (* Return true if and only if the first set is a subset of the second *) fun isSubset (SET(_, s1), SET(_, s2)) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => true | ((E, _), _) => true | (_, (E, _)) => false | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => ((x = y) andalso cmp (r1, r2)) orelse ((x > y) andalso cmp (t1, r2)) (* end case *)) in cmp (start s1, start s2) end (* Return true if the two sets are disjoint *) fun disjoint (SET(0, _), _) = true | disjoint (_, SET(0, _)) = true | disjoint (SET(_, s1), SET(_, s2)) = let fun walk ((E, _), _) = true | walk (_, (E, _)) = true | walk (t1 as (T(_, _, x, _), r1), t2 as (T(_, _, y, _), r2)) = ((x < y) andalso walk (next r1, t2)) orelse ((x > y) andalso walk (t1, next r2)) in walk (next (start s1), next (start s2)) end (* support for constructing red-black trees in linear time from increasing * ordered sequences (based on a description by R. Hinze). Note that the * elements in the digits are ordered with the largest on the left, whereas * the elements of the trees are ordered with the largest on the right. *) datatype digit = ZERO | ONE of (item * tree * digit) | TWO of (item * tree * item * tree * digit) (* add an item that is guaranteed to be larger than any in l *) fun addItem (a, l) = let fun incr (a, t, ZERO) = ONE(a, t, ZERO) | incr (a1, t1, ONE(a2, t2, r)) = TWO(a1, t1, a2, t2, r) | incr (a1, t1, TWO(a2, t2, a3, t3, r)) = ONE(a1, t1, incr(a2, T(B, t3, a3, t2), r)) in incr(a, E, l) end (* link the digits into a tree *) fun linkAll t = let fun link (t, ZERO) = t | link (t1, ONE(a, t2, r)) = link(T(B, t2, a, t1), r) | link (t, TWO(a1, t1, a2, t2, r)) = link(T(B, T(R, t2, a2, t1), a1, t), r) in link (E, t) end (* create a set from a list of items; this function works in linear time if the list * is in increasing order. *) fun fromList [] = empty | fromList (first::rest) = let fun add (prev, x::xs, n, accum) = if (prev < x) then add(x, xs, n+1, addItem(x, accum)) else (* list not in order, so fall back to addList code *) addList(SET(n, linkAll accum), x::xs) | add (_, [], n, accum) = SET(n, linkAll accum) in add (first, rest, 1, addItem(first, ZERO)) end (* return the union of the two sets *) fun union (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun union' (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), (E, _)) => (n, result) | ((E, _), t2) => ins(t2, n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then union' (r1, t2, n+1, addItem(x, result)) else if (x = y) then union' (r1, r2, n+1, addItem(x, result)) else union' (t1, r2, n+1, addItem(y, result)) (* end case *)) val (n, result) = union' (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the intersection of the two sets *) fun intersection (SET(_, s1), SET(_, s2)) = let fun intersect (t1, t2, n, result) = (case (next t1, next t2) of ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then intersect (r1, t2, n, result) else if (x = y) then intersect (r1, r2, n+1, addItem(x, result)) else intersect (t1, r2, n, result) | _ => (n, result) (* end case *)) val (n, result) = intersect (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end (* return the set difference *) fun difference (SET(_, s1), SET(_, s2)) = let fun ins ((E, _), n, result) = (n, result) | ins ((T(_, _, x, _), r), n, result) = ins(next r, n+1, addItem(x, result)) fun diff (t1, t2, n, result) = (case (next t1, next t2) of ((E, _), _) => (n, result) | (t1, (E, _)) => ins(t1, n, result) | ((T(_, _, x, _), r1), (T(_, _, y, _), r2)) => if (x < y) then diff (r1, t2, n+1, addItem(x, result)) else if (x = y) then diff (r1, r2, n, result) else diff (t1, r2, n, result) (* end case *)) val (n, result) = diff (start s1, start s2, 0, ZERO) in SET(n, linkAll result) end fun subtract (s, item) = difference (s, singleton item) fun subtract' (item, s) = subtract (s, item) fun subtractList (l, items) = let val items' = List.foldl (fn (x, set) => add(set, x)) (SET(0, E)) items in difference (l, items') end fun app f = let fun appf E = () | appf (T(_, a, x, b)) = (appf a; f x; appf b) in fn (SET(_, m)) => appf m end fun map f = let fun addf (x, m) = add(m, f x) in foldl addf empty end fun mapPartial f = let fun f' (x, acc) = (case f x of SOME x' => add(acc, x') | NONE => acc) in foldl f' empty end (* Filter out those elements of the set that do not satisfy the * predicate. The filtering is done in increasing map order. *) fun filter pred (SET(_, t)) = let fun walk (E, n, result) = (n, result) | walk (T(_, a, x, b), n, result) = let val (n, result) = walk(a, n, result) in if (pred x) then walk(b, n+1, addItem(x, result)) else walk(b, n, result) end val (n, result) = walk (t, 0, ZERO) in SET(n, linkAll result) end fun partition pred (SET(_, t)) = let fun walk (E, n1, result1, n2, result2) = (n1, result1, n2, result2) | walk (T(_, a, x, b), n1, result1, n2, result2) = let val (n1, result1, n2, result2) = walk(a, n1, result1, n2, result2) in if (pred x) then walk(b, n1+1, addItem(x, result1), n2, result2) else walk(b, n1, result1, n2+1, addItem(x, result2)) end val (n1, result1, n2, result2) = walk (t, 0, ZERO, 0, ZERO) in (SET(n1, linkAll result1), SET(n2, linkAll result2)) end fun exists pred = let fun test E = false | test (T(_, a, x, b)) = test a orelse pred x orelse test b in fn (SET(_, t)) => test t end fun all pred = let fun test E = true | test (T(_, a, x, b)) = test a andalso pred x andalso test b in fn (SET(_, t)) => test t end fun find pred = let fun test E = NONE | test (T(_, a, x, b)) = (case test a of NONE => if pred x then SOME x else test b | someItem => someItem (* end case *)) in fn (SET(_, t)) => test t end (* deprecated *) val listItems = toList end; mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/000077500000000000000000000000001416264345000210125ustar00rootroot00000000000000mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/README000066400000000000000000000015151416264345000216740ustar00rootroot00000000000000This directory contains a small library for parsing XML files. It does not support validation (e.g., against a DTD or Schema). The basic idea is that the user supplies a "schema" module that describes the elements and attribute representation of an XML document. From this, one builds an XML tree representation structure MyXMLTree = XMLTreeFn (MyXMLSchema); and an XML parser structure MyXMLParser = XMLParserFn (MyXMLTree); A generic XML schema (that allows any element name) is provided. For a more complete library for XML processing, use the fxp library. TODO: handle internal subsets in "" definitions handle processing markup ("") support a SAX-type parsing interface support a DOM API a la TinyXML (http://www.grinninglizard.com/tinyxml) or TinyXML-2 (http://www.grinninglizard.com/tinyxml2/) mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/generic-xml-tree.sml000066400000000000000000000022011416264345000246710ustar00rootroot00000000000000(* generic-xml-tree.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * This is a generic instantiation of the XMLTreeFn with a representation of * elements and attributes as Atom.atom values. It does not preserve whitespace. *) structure GenericXMLTree : XML_TREE where type Schema.element = Atom.atom where type Schema.attribute = Atom.atom * string = struct local structure Schema = struct type element = Atom.atom type attribute = (Atom.atom * string) (* create an element; returns NONE if the element name is unrecognized *) fun element s = SOME(Atom.atom(CharVector.map Char.toUpper s)) (* should leading and trailing whitespace be preserved in the content of this element? *) fun preserveWS _ = false (* should comments be preserved *) fun preserveComment _ = false (* equality test *) val same = Atom.same val toString = Atom.toString (* create an attribute from a name/value pair *) fun attribute (id, value) = (Atom.atom id, value) end structure Tree = XMLTreeFn (Schema) in open Tree end (* local *) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-lexer.lex000066400000000000000000000106531416264345000234460ustar00rootroot00000000000000(* xml-lexer.lex * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * An ML-ULex parser for parsing XML files. * * TODO: line ending normalization? *) %name XMLLexer; %arg (lexErr); %defs ( structure T = XMLTokens type lex_result = T.token fun eof () = T.EOF (* list of strings to build attribute values *) val text : string list ref = ref [] fun addText s = (text := s :: !text) fun addDecimalEscape s = addText(UTF8.encode(Word.fromInt(Option.valOf(Int.fromString s)))) fun addHexEscape s = addText(UTF8.encode(Option.valOf(Word.fromString s))) fun textToString () = let val s = String.concat(List.rev(!text)) in text := []; s end (* trim m characters from the left and n characters from the right *) fun trim (m, ss, n) = Substring.string(Substring.triml m (Substring.trimr n ss)) ); %let ws = [ \t\n\v\f\r]; %let digit = [0-9]; %let alpha = [a-zA-Z]; %let idstartchr = [a-zA-Z_:]; %let idchr = ({idstartchr}|[-.0-9]); %let pubidchr1 = [ \n\n\t] | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]; %let pubidchr2 = [ \n\n\t] | [a-zA-Z0-9] | [-()+,./:=?;!*#@$_%]; (* without ' *) (* the lexer states: * INITIAL * COM scanning inside "" => (addText yytext; YYBEGIN INITIAL; T.COM(textToString())); . => (addText yytext; continue()); "<" => (YYBEGIN TAG; T.OPEN_START_TAG); " (YYBEGIN TAG; T.OPEN_END_TAG); " (YYBEGIN TAG; T.OPEN_XML_TAG); " (YYBEGIN DOCTYPE; T.OPEN_DOCTYPE); [pP][uU][bB][lL][iI][cC] => (T.PUBLIC); [sS][yY][sS][tT][eE][mM] => (T.SYSTEM); "\""{pubidchr1}*"\"" => (T.LIT(String.substring(yytext, 1, size yytext - 2))); "'"{pubidchr2}*"'" => (T.LIT(String.substring(yytext, 1, size yytext - 2))); ">" => (YYBEGIN INITIAL; T.CLOSE_TAG); {ws}+ => (skip()); "?>" => (YYBEGIN INITIAL; T.CLOSE_PI_TAG); ">" => (YYBEGIN INITIAL; T.CLOSE_TAG); "/>" => (YYBEGIN INITIAL; T.CLOSE_EMPTY_TAG); "=" => (T.SYM_EQ); {idstartchr}{idchr}* => (T.ID yytext); "\"" => (YYBEGIN LIT1; continue()); "'" => (YYBEGIN LIT2; continue()); "\"" => (YYBEGIN TAG; T.LIT(textToString())); "\'" => (YYBEGIN TAG; T.LIT(textToString())); """ => (addText ("\""); continue()); "<" => (addText ("<"); continue()); ">" => (addText (">"); continue()); "&" => (addText ("&"); continue()); "'" => (addText ("'"); continue()); "&#"[0-9]+";" => (addDecimalEscape(trim(2, yysubstr, 1)); continue()); "&#x"[a-fA-F0-9]+";" => (addHexEscape(trim(3, yysubstr, 1)); continue()); [^"<>&]+ => (addText yytext; continue()); [^'<>&]+ => (addText yytext; continue()); (* we handle whitespace specially, so that initial/trailing whitespace can be preserved * when necessary. *) {ws}+ => (T.WS yytext); [^ \n\t\r<&]+ => (T.TEXT yytext); """ => (T.TEXT "\""); "<" => (T.TEXT "<"); ">" => (T.TEXT ">"); "&" => (T.TEXT "&"); "'" => (T.TEXT "'"); "" => (T.CDATA(trim (9, yysubstr, 3))); . => (lexErr(yypos, [ "bad character `", String.toString yytext, "'" ]); continue()); . => (lexErr(yypos, [ "bad character `", String.toString yytext, "' in DOCTYPE" ]); continue()); . => (lexErr(yypos, [ "bad character `", String.toString yytext, "' in tag" ]); continue()); . => (lexErr(yypos, [ "bad character `", String.toString yytext, "' in attribute value" ]); continue()); mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-lexer.lex.sml000066400000000000000000002777321416264345000242550ustar00rootroot00000000000000structure XMLLexer = struct datatype yystart_state = DOCTYPE | COM | LIT2 | LIT1 | INITIAL | TAG local structure UserDeclarations = struct structure T = XMLTokens type lex_result = T.token fun eof () = T.EOF (* list of strings to build attribute values *) val text : string list ref = ref [] fun addText s = (text := s :: !text) fun addDecimalEscape s = addText(UTF8.encode(Word.fromInt(Option.valOf(Int.fromString s)))) fun addHexEscape s = addText(UTF8.encode(Option.valOf(Word.fromString s))) fun textToString () = let val s = String.concat(List.rev(!text)) in text := []; s end (* trim m characters from the left and n characters from the right *) fun trim (m, ss, n) = Substring.string(Substring.triml m (Substring.trimr n ss)) end datatype yymatch = yyNO_MATCH | yyMATCH of ULexBuffer.stream * action * yymatch withtype action = ULexBuffer.stream * yymatch -> UserDeclarations.lex_result val yytable : ((UTF8.wchar * UTF8.wchar * int) list * int list) Vector.vector = Vector.fromList [] fun yystreamify' p input = ULexBuffer.mkStream (p, input) fun yystreamifyReader' p readFn strm = let val s = ref strm fun iter(strm, n, accum) = if n > 1024 then (String.implode (rev accum), strm) else (case readFn strm of NONE => (String.implode (rev accum), strm) | SOME(c, strm') => iter (strm', n+1, c::accum)) fun input() = let val (data, strm) = iter(!s, 0, []) in s := strm; data end in yystreamify' p input end fun yystreamifyInstream' p strm = yystreamify' p (fn ()=>TextIO.input strm) fun innerLex (yyarg as lexErr)(yystrm_, yyss_, yysm) = let (* current start state *) val yyss = ref yyss_ fun YYBEGIN ss = (yyss := ss) (* current input stream *) val yystrm = ref yystrm_ fun yysetStrm strm = yystrm := strm fun yygetPos() = ULexBuffer.getpos (!yystrm) fun yystreamify input = yystreamify' (yygetPos()) input fun yystreamifyReader readFn strm = yystreamifyReader' (yygetPos()) readFn strm fun yystreamifyInstream strm = yystreamifyInstream' (yygetPos()) strm (* start position of token -- can be updated via skip() *) val yystartPos = ref (yygetPos()) (* get one char of input *) fun yygetc strm = (case ULexBuffer.getu strm of (SOME (0w10, s')) => (AntlrStreamPos.markNewLine yysm (ULexBuffer.getpos strm); SOME (0w10, s')) | x => x) fun yygetList getc strm = let val get1 = UTF8.getu getc fun iter (strm, accum) = (case get1 strm of NONE => rev accum | SOME (w, strm') => iter (strm', w::accum) (* end case *)) in iter (strm, []) end (* create yytext *) fun yymksubstr(strm) = ULexBuffer.subtract (strm, !yystrm) fun yymktext(strm) = Substring.string (yymksubstr strm) fun yymkunicode(strm) = yygetList Substring.getc (yymksubstr strm) open UserDeclarations fun lex () = let fun yystuck (yyNO_MATCH) = raise Fail "lexer reached a stuck state" | yystuck (yyMATCH (strm, action, old)) = action (strm, old) val yypos = yygetPos() fun yygetlineNo strm = AntlrStreamPos.lineNo yysm (ULexBuffer.getpos strm) fun yygetcolNo strm = AntlrStreamPos.colNo yysm (ULexBuffer.getpos strm) fun yyactsToMatches (strm, [], oldMatches) = oldMatches | yyactsToMatches (strm, act::acts, oldMatches) = yyMATCH (strm, act, yyactsToMatches (strm, acts, oldMatches)) fun yygo actTable = (fn (~1, _, oldMatches) => yystuck oldMatches | (curState, strm, oldMatches) => let val (transitions, finals') = Vector.sub (yytable, curState) val finals = List.map (fn i => Vector.sub (actTable, i)) finals' fun tryfinal() = yystuck (yyactsToMatches (strm, finals, oldMatches)) fun find (c, []) = NONE | find (c, (c1, c2, s)::ts) = if c1 <= c andalso c <= c2 then SOME s else find (c, ts) in case yygetc strm of SOME(c, strm') => (case find (c, transitions) of NONE => tryfinal() | SOME n => yygo actTable (n, strm', yyactsToMatches (strm, finals, oldMatches))) | NONE => tryfinal() end) val yylastwasnref = ref (ULexBuffer.lastWasNL (!yystrm)) fun continue() = let val yylastwasn = !yylastwasnref in let fun yyAction0 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addText yytext; YYBEGIN COM; continue() end fun yyAction1 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addText yytext; YYBEGIN INITIAL; T.COM(textToString()) end fun yyAction2 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addText yytext; continue() end fun yyAction3 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN TAG; T.OPEN_START_TAG) fun yyAction4 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN TAG; T.OPEN_END_TAG) fun yyAction5 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN TAG; T.OPEN_XML_TAG) fun yyAction6 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN DOCTYPE; T.OPEN_DOCTYPE) fun yyAction7 (strm, lastMatch : yymatch) = (yystrm := strm; T.PUBLIC) fun yyAction8 (strm, lastMatch : yymatch) = (yystrm := strm; T.SYSTEM) fun yyAction9 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.LIT(String.substring(yytext, 1, size yytext - 2)) end fun yyAction10 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.LIT(String.substring(yytext, 1, size yytext - 2)) end fun yyAction11 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN INITIAL; T.CLOSE_TAG) fun yyAction12 (strm, lastMatch : yymatch) = (yystrm := strm; skip()) fun yyAction13 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN INITIAL; T.CLOSE_PI_TAG) fun yyAction14 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN INITIAL; T.CLOSE_TAG) fun yyAction15 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN INITIAL; T.CLOSE_EMPTY_TAG) fun yyAction16 (strm, lastMatch : yymatch) = (yystrm := strm; T.SYM_EQ) fun yyAction17 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.ID yytext end fun yyAction18 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN LIT1; continue()) fun yyAction19 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN LIT2; continue()) fun yyAction20 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN TAG; T.LIT(textToString())) fun yyAction21 (strm, lastMatch : yymatch) = (yystrm := strm; YYBEGIN TAG; T.LIT(textToString())) fun yyAction22 (strm, lastMatch : yymatch) = (yystrm := strm; addText ("\""); continue()) fun yyAction23 (strm, lastMatch : yymatch) = (yystrm := strm; addText ("<"); continue()) fun yyAction24 (strm, lastMatch : yymatch) = (yystrm := strm; addText (">"); continue()) fun yyAction25 (strm, lastMatch : yymatch) = (yystrm := strm; addText ("&"); continue()) fun yyAction26 (strm, lastMatch : yymatch) = (yystrm := strm; addText ("'"); continue()) fun yyAction27 (strm, lastMatch : yymatch) = let val yysubstr = yymksubstr(strm) in yystrm := strm; addDecimalEscape(trim(2, yysubstr, 1)); continue() end fun yyAction28 (strm, lastMatch : yymatch) = let val yysubstr = yymksubstr(strm) in yystrm := strm; addHexEscape(trim(3, yysubstr, 1)); continue() end fun yyAction29 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addText yytext; continue() end fun yyAction30 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; addText yytext; continue() end fun yyAction31 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.WS yytext end fun yyAction32 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; T.TEXT yytext end fun yyAction33 (strm, lastMatch : yymatch) = (yystrm := strm; T.TEXT "\"") fun yyAction34 (strm, lastMatch : yymatch) = (yystrm := strm; T.TEXT "<") fun yyAction35 (strm, lastMatch : yymatch) = (yystrm := strm; T.TEXT ">") fun yyAction36 (strm, lastMatch : yymatch) = (yystrm := strm; T.TEXT "&") fun yyAction37 (strm, lastMatch : yymatch) = (yystrm := strm; T.TEXT "'") fun yyAction38 (strm, lastMatch : yymatch) = let val yysubstr = yymksubstr(strm) in yystrm := strm; T.CDATA(trim (9, yysubstr, 3)) end fun yyAction39 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; lexErr(yypos, [ "bad character `", String.toString yytext, "'" ]); continue() end fun yyAction40 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; lexErr(yypos, [ "bad character `", String.toString yytext, "' in DOCTYPE" ]); continue() end fun yyAction41 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; lexErr(yypos, [ "bad character `", String.toString yytext, "' in tag" ]); continue() end fun yyAction42 (strm, lastMatch : yymatch) = let val yytext = yymktext(strm) in yystrm := strm; lexErr(yypos, [ "bad character `", String.toString yytext, "' in attribute value" ]); continue() end fun yyQ128 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction13(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction13(strm, yyNO_MATCH) (* end case *)) fun yyQ127 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction41(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3E then yyQ128(strm', yyMATCH(strm, yyAction41, yyNO_MATCH)) else yyAction41(strm, yyNO_MATCH) (* end case *)) fun yyQ126 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction14(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction14(strm, yyNO_MATCH) (* end case *)) fun yyQ125 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction16(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction16(strm, yyNO_MATCH) (* end case *)) fun yyQ14 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction17(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction17(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ124 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction17(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction17(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ129 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction15(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction15(strm, yyNO_MATCH) (* end case *)) fun yyQ123 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction41(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3E then yyQ129(strm', yyMATCH(strm, yyAction41, yyNO_MATCH)) else yyAction41(strm, yyNO_MATCH) (* end case *)) fun yyQ122 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction19(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction19(strm, yyNO_MATCH) (* end case *)) fun yyQ121 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction18(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction18(strm, yyNO_MATCH) (* end case *)) fun yyQ29 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction12(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxE then yyAction12(strm, yyNO_MATCH) else if inp < 0wxE then if inp <= 0wx8 then yyAction12(strm, yyNO_MATCH) else yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp = 0wx20 then yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) (* end case *)) fun yyQ120 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction12(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxE then yyAction12(strm, yyNO_MATCH) else if inp < 0wxE then if inp <= 0wx8 then yyAction12(strm, yyNO_MATCH) else yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp = 0wx20 then yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) (* end case *)) fun yyQ119 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction41(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction41(strm, yyNO_MATCH) (* end case *)) fun yyQ5 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3A then yyQ124(strm', lastMatch) else if inp < 0wx3A then if inp = 0wx22 then yyQ121(strm', lastMatch) else if inp < 0wx22 then if inp = 0wxE then yyQ119(strm', lastMatch) else if inp < 0wxE then if inp <= 0wx8 then yyQ119(strm', lastMatch) else yyQ120(strm', lastMatch) else if inp = 0wx20 then yyQ120(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp = 0wx28 then yyQ119(strm', lastMatch) else if inp < 0wx28 then if inp = 0wx27 then yyQ122(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp = 0wx2F then yyQ123(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp = 0wx41 then yyQ124(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx3E then yyQ126(strm', lastMatch) else if inp < 0wx3E then if inp = 0wx3D then yyQ125(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp = 0wx3F then yyQ127(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp = 0wx60 then yyQ119(strm', lastMatch) else if inp < 0wx60 then if inp = 0wx5B then yyQ119(strm', lastMatch) else if inp < 0wx5B then yyQ124(strm', lastMatch) else if inp = 0wx5F then yyQ124(strm', lastMatch) else yyQ119(strm', lastMatch) else if inp <= 0wx7A then yyQ124(strm', lastMatch) else yyQ119(strm', lastMatch) (* end case *)) fun yyQ77 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction5(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction5(strm, yyNO_MATCH) (* end case *)) fun yyQ76 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx4D then yystuck(lastMatch) else if inp < 0wx4D then if inp = 0wx4C then yyQ77(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx6C then yyQ77(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ75 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx4E then yystuck(lastMatch) else if inp < 0wx4E then if inp = 0wx4D then yyQ76(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx6D then yyQ76(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ74 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx59 then yystuck(lastMatch) else if inp < 0wx59 then if inp = 0wx58 then yyQ75(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx78 then yyQ75(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ73 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction4(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction4(strm, yyNO_MATCH) (* end case *)) fun yyQ86 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx5D then yyQ87(strm', lastMatch) else yyQ86(strm', lastMatch) (* end case *)) and yyQ87 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx5D then yyQ88(strm', lastMatch) else yyQ86(strm', lastMatch) (* end case *)) and yyQ88 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3F then yyQ86(strm', lastMatch) else if inp < 0wx3F then if inp = 0wx3E then yyQ89(strm', lastMatch) else yyQ86(strm', lastMatch) else if inp = 0wx5D then yyQ88(strm', lastMatch) else yyQ86(strm', lastMatch) (* end case *)) and yyQ89 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction38(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx5D then yyQ87(strm', yyMATCH(strm, yyAction38, yyNO_MATCH)) else yyQ86(strm', yyMATCH(strm, yyAction38, yyNO_MATCH)) (* end case *)) fun yyQ85 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx5B then yyQ86(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ84 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ85(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ83 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx54 then yyQ84(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ82 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ83(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ81 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx44 then yyQ82(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ80 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx43 then yyQ81(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ95 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction6(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction6(strm, yyNO_MATCH) (* end case *)) fun yyQ94 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx45 then yyQ95(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ93 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx50 then yyQ94(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ92 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx59 then yyQ93(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ91 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx54 then yyQ92(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ90 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx43 then yyQ91(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ79 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx4F then yyQ90(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ96 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction0(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction0(strm, yyNO_MATCH) (* end case *)) fun yyQ78 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx2D then yyQ96(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ72 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx44 then yyQ79(strm', lastMatch) else if inp < 0wx44 then if inp = 0wx2D then yyQ78(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx5B then yyQ80(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ71 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction3(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx2F then yyQ73(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else if inp < 0wx2F then if inp = 0wx21 then yyQ72(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) else if inp = 0wx3F then yyQ74(strm', yyMATCH(strm, yyAction3, yyNO_MATCH)) else yyAction3(strm, yyNO_MATCH) (* end case *)) fun yyQ104 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction33(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction33(strm, yyNO_MATCH) (* end case *)) fun yyQ103 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ104(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ102 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ103(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ101 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6F then yyQ102(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ100 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx75 then yyQ101(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ106 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction34(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction34(strm, yyNO_MATCH) (* end case *)) fun yyQ105 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ106(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ99 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ105(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ108 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction35(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction35(strm, yyNO_MATCH) (* end case *)) fun yyQ107 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ108(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ98 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ107(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ113 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction37(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction37(strm, yyNO_MATCH) (* end case *)) fun yyQ112 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ113(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ111 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx73 then yyQ112(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ110 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6F then yyQ111(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ115 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction36(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction36(strm, yyNO_MATCH) (* end case *)) fun yyQ114 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ115(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ109 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx70 then yyQ114(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ97 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6E then yystuck(lastMatch) else if inp < 0wx6E then if inp = 0wx6D then yyQ109(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx70 then yyQ110(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ70 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction39(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx68 then yyAction39(strm, yyNO_MATCH) else if inp < 0wx68 then if inp = 0wx62 then yyAction39(strm, yyNO_MATCH) else if inp < 0wx62 then if inp = 0wx61 then yyQ97(strm', yyMATCH(strm, yyAction39, yyNO_MATCH)) else yyAction39(strm, yyNO_MATCH) else if inp = 0wx67 then yyQ98(strm', yyMATCH(strm, yyAction39, yyNO_MATCH)) else yyAction39(strm, yyNO_MATCH) else if inp = 0wx6D then yyAction39(strm, yyNO_MATCH) else if inp < 0wx6D then if inp = 0wx6C then yyQ99(strm', yyMATCH(strm, yyAction39, yyNO_MATCH)) else yyAction39(strm, yyNO_MATCH) else if inp = 0wx71 then yyQ100(strm', yyMATCH(strm, yyAction39, yyNO_MATCH)) else yyAction39(strm, yyNO_MATCH) (* end case *)) fun yyQ117 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction31(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxE then yyAction31(strm, yyNO_MATCH) else if inp < 0wxE then if inp <= 0wx8 then yyAction31(strm, yyNO_MATCH) else yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx20 then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyAction31(strm, yyNO_MATCH) (* end case *)) fun yyQ116 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction32(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx20 then yyAction32(strm, yyNO_MATCH) else if inp < 0wx20 then if inp = 0wxB then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp < 0wxB then if inp <= 0wx8 then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else yyAction32(strm, yyNO_MATCH) else if inp = 0wxD then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp = 0wx27 then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx26 then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp = 0wx3C then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) (* end case *)) fun yyQ118 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction31(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx20 then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wx20 then if inp = 0wxB then yyQ118(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wxB then if inp <= 0wx8 then yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wxD then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp <= 0wxC then yyQ118(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx27 then yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx26 then yyAction31(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx3C then yyAction31(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) (* end case *)) fun yyQ69 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction31(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx20 then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wx20 then if inp = 0wxB then yyQ118(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wxB then if inp <= 0wx8 then yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wxD then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp <= 0wxC then yyQ118(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx27 then yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx26 then yyAction31(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx3C then yyAction31(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) (* end case *)) fun yyQ68 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction31(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxE then yyAction31(strm, yyNO_MATCH) else if inp < 0wxE then if inp <= 0wx8 then yyAction31(strm, yyNO_MATCH) else yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else if inp = 0wx20 then yyQ117(strm', yyMATCH(strm, yyAction31, yyNO_MATCH)) else yyAction31(strm, yyNO_MATCH) (* end case *)) fun yyQ67 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction32(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx20 then yyAction32(strm, yyNO_MATCH) else if inp < 0wx20 then if inp = 0wxB then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp < 0wxB then if inp <= 0wx8 then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else yyAction32(strm, yyNO_MATCH) else if inp = 0wxD then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp = 0wx27 then yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx26 then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) else if inp = 0wx3C then yyAction32(strm, yyNO_MATCH) else yyQ116(strm', yyMATCH(strm, yyAction32, yyNO_MATCH)) (* end case *)) fun yyQ4 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx20 then yyQ68(strm', lastMatch) else if inp < 0wx20 then if inp = 0wxB then yyQ69(strm', lastMatch) else if inp < 0wxB then if inp <= 0wx8 then yyQ67(strm', lastMatch) else yyQ68(strm', lastMatch) else if inp = 0wxD then yyQ68(strm', lastMatch) else if inp <= 0wxC then yyQ69(strm', lastMatch) else yyQ67(strm', lastMatch) else if inp = 0wx27 then yyQ67(strm', lastMatch) else if inp < 0wx27 then if inp = 0wx26 then yyQ70(strm', lastMatch) else yyQ67(strm', lastMatch) else if inp = 0wx3C then yyQ71(strm', lastMatch) else yyQ67(strm', lastMatch) (* end case *)) fun yyQ37 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction42(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction42(strm, yyNO_MATCH) (* end case *)) fun yyQ46 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction22(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction22(strm, yyNO_MATCH) (* end case *)) fun yyQ45 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ46(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ44 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ45(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ43 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6F then yyQ44(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ42 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx75 then yyQ43(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ48 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction23(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction23(strm, yyNO_MATCH) (* end case *)) fun yyQ47 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ48(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ41 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ47(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ50 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction24(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction24(strm, yyNO_MATCH) (* end case *)) fun yyQ49 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ50(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ40 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx74 then yyQ49(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ55 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction26(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction26(strm, yyNO_MATCH) (* end case *)) fun yyQ54 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ55(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ53 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx73 then yyQ54(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ52 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6F then yyQ53(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ57 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction25(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction25(strm, yyNO_MATCH) (* end case *)) fun yyQ56 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3B then yyQ57(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ51 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx70 then yyQ56(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ39 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx6E then yystuck(lastMatch) else if inp < 0wx6E then if inp = 0wx6D then yyQ51(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx70 then yyQ52(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ61 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction28(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction28(strm, yyNO_MATCH) (* end case *)) fun yyQ60 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3C then yystuck(lastMatch) else if inp < 0wx3C then if inp = 0wx3A then yystuck(lastMatch) else if inp < 0wx3A then if inp <= 0wx2F then yystuck(lastMatch) else yyQ60(strm', lastMatch) else yyQ61(strm', lastMatch) else if inp = 0wx47 then yystuck(lastMatch) else if inp < 0wx47 then if inp <= 0wx40 then yystuck(lastMatch) else yyQ60(strm', lastMatch) else if inp = 0wx61 then yyQ60(strm', lastMatch) else if inp < 0wx61 then yystuck(lastMatch) else if inp <= 0wx66 then yyQ60(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ59 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ60(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx30 then yyQ60(strm', lastMatch) else if inp < 0wx30 then yystuck(lastMatch) else if inp <= 0wx39 then yyQ60(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ60(strm', lastMatch) else if inp < 0wx61 then if inp <= 0wx46 then yyQ60(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx66 then yyQ60(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ62 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction27(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction27(strm, yyNO_MATCH) (* end case *)) fun yyQ58 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3A then yystuck(lastMatch) else if inp < 0wx3A then if inp <= 0wx2F then yystuck(lastMatch) else yyQ58(strm', lastMatch) else if inp = 0wx3B then yyQ62(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ38 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3A then yystuck(lastMatch) else if inp < 0wx3A then if inp <= 0wx2F then yystuck(lastMatch) else yyQ58(strm', lastMatch) else if inp = 0wx78 then yyQ59(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ35 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction42(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx67 then yyQ40(strm', yyMATCH(strm, yyAction42, yyNO_MATCH)) else if inp < 0wx67 then if inp = 0wx24 then yyAction42(strm, yyNO_MATCH) else if inp < 0wx24 then if inp = 0wx23 then yyQ38(strm', yyMATCH(strm, yyAction42, yyNO_MATCH)) else yyAction42(strm, yyNO_MATCH) else if inp = 0wx61 then yyQ39(strm', yyMATCH(strm, yyAction42, yyNO_MATCH)) else yyAction42(strm, yyNO_MATCH) else if inp = 0wx6D then yyAction42(strm, yyNO_MATCH) else if inp < 0wx6D then if inp = 0wx6C then yyQ41(strm', yyMATCH(strm, yyAction42, yyNO_MATCH)) else yyAction42(strm, yyNO_MATCH) else if inp = 0wx71 then yyQ42(strm', yyMATCH(strm, yyAction42, yyNO_MATCH)) else yyAction42(strm, yyNO_MATCH) (* end case *)) fun yyQ65 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction20(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction20(strm, yyNO_MATCH) (* end case *)) fun yyQ66 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction29(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx27 then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx23 then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx23 then if inp = 0wx22 then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx26 then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx3D then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx3D then if inp = 0wx3C then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx3E then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) (* end case *)) fun yyQ64 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction29(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx27 then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx23 then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx23 then if inp = 0wx22 then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx26 then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx3D then yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp < 0wx3D then if inp = 0wx3C then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) else if inp = 0wx3E then yyAction29(strm, yyNO_MATCH) else yyQ66(strm', yyMATCH(strm, yyAction29, yyNO_MATCH)) (* end case *)) fun yyQ3 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx27 then yyQ64(strm', lastMatch) else if inp < 0wx27 then if inp = 0wx23 then yyQ64(strm', lastMatch) else if inp < 0wx23 then if inp = 0wx22 then yyQ65(strm', lastMatch) else yyQ64(strm', lastMatch) else if inp = 0wx26 then yyQ35(strm', lastMatch) else yyQ64(strm', lastMatch) else if inp = 0wx3D then yyQ64(strm', lastMatch) else if inp < 0wx3D then if inp = 0wx3C then yyQ37(strm', lastMatch) else yyQ64(strm', lastMatch) else if inp = 0wx3E then yyQ37(strm', lastMatch) else yyQ64(strm', lastMatch) (* end case *)) fun yyQ36 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction21(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction21(strm, yyNO_MATCH) (* end case *)) fun yyQ63 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction30(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyAction30(strm, yyNO_MATCH) else if inp < 0wx3C then if inp = 0wx26 then yyAction30(strm, yyNO_MATCH) else if inp < 0wx26 then yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) else if inp <= 0wx27 then yyAction30(strm, yyNO_MATCH) else yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) else if inp = 0wx3E then yyAction30(strm, yyNO_MATCH) else yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) (* end case *)) fun yyQ34 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction30(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyAction30(strm, yyNO_MATCH) else if inp < 0wx3C then if inp = 0wx26 then yyAction30(strm, yyNO_MATCH) else if inp < 0wx26 then yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) else if inp <= 0wx27 then yyAction30(strm, yyNO_MATCH) else yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) else if inp = 0wx3E then yyAction30(strm, yyNO_MATCH) else yyQ63(strm', yyMATCH(strm, yyAction30, yyNO_MATCH)) (* end case *)) fun yyQ2 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3C then yyQ37(strm', lastMatch) else if inp < 0wx3C then if inp = 0wx27 then yyQ36(strm', lastMatch) else if inp < 0wx27 then if inp = 0wx26 then yyQ35(strm', lastMatch) else yyQ34(strm', lastMatch) else yyQ34(strm', lastMatch) else if inp = 0wx3E then yyQ37(strm', lastMatch) else yyQ34(strm', lastMatch) (* end case *)) fun yyQ33 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction1(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction1(strm, yyNO_MATCH) (* end case *)) fun yyQ32 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3E then yyQ33(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ31 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx2D then yyQ32(strm', yyMATCH(strm, yyAction2, yyNO_MATCH)) else yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ30 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction2(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction2(strm, yyNO_MATCH) (* end case *)) fun yyQ1 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx2D then yyQ31(strm', lastMatch) else yyQ30(strm', lastMatch) (* end case *)) fun yyQ19 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction8(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx2F then yyAction8(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction8(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else yyAction8(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction8(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction8(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else yyAction8(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction8, yyNO_MATCH)) else yyAction8(strm, yyNO_MATCH) (* end case *)) fun yyQ18 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx4E then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx4E then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx4D then yyQ19(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx6E then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx6E then if inp = 0wx6D then yyQ19(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ17 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx46 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx46 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx45 then yyQ18(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx66 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx66 then if inp = 0wx65 then yyQ18(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ16 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx55 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx55 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx54 then yyQ17(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx75 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx75 then if inp = 0wx74 then yyQ17(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ15 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx54 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx54 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx53 then yyQ16(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx74 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx74 then if inp = 0wx73 then yyQ16(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ13 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5A then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx59 then yyQ15(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx7A then if inp = 0wx79 then yyQ15(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ24 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction7(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx2F then yyAction7(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction7(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else yyAction7(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction7(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction7(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else yyAction7(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction7, yyNO_MATCH)) else yyAction7(strm, yyNO_MATCH) (* end case *)) fun yyQ23 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx44 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx44 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx43 then yyQ24(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx64 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx64 then if inp = 0wx63 then yyQ24(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ22 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx4A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx4A then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx49 then yyQ23(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx6A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx6A then if inp = 0wx69 then yyQ23(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ21 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx4D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx4D then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx4C then yyQ22(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx6D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx6D then if inp = 0wx6C then yyQ22(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ20 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx43 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx43 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyQ21(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx63 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx63 then yyQ21(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ12 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx56 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx56 then if inp = 0wx30 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx30 then if inp = 0wx2D then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx2D then yyAction17(strm, yyNO_MATCH) else if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx55 then yyQ20(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx61 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx61 then if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx5F then if inp <= 0wx5A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx76 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx76 then if inp = 0wx75 then yyQ20(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ11 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction11(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction11(strm, yyNO_MATCH) (* end case *)) fun yyQ10 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction17(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx41 then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp < 0wx41 then if inp = 0wx2F then yyAction17(strm, yyNO_MATCH) else if inp < 0wx2F then if inp <= 0wx2C then yyAction17(strm, yyNO_MATCH) else yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp <= 0wx3A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp = 0wx60 then yyAction17(strm, yyNO_MATCH) else if inp < 0wx60 then if inp = 0wx5B then yyAction17(strm, yyNO_MATCH) else if inp < 0wx5B then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else if inp = 0wx5F then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ14(strm', yyMATCH(strm, yyAction17, yyNO_MATCH)) else yyAction17(strm, yyNO_MATCH) (* end case *)) fun yyQ26 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction10(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction10(strm, yyNO_MATCH) (* end case *)) fun yyQ25 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3C then yystuck(lastMatch) else if inp < 0wx3C then if inp = 0wx22 then yystuck(lastMatch) else if inp < 0wx22 then if inp = 0wxB then yystuck(lastMatch) else if inp < 0wxB then if inp <= 0wx8 then yystuck(lastMatch) else yyQ25(strm', lastMatch) else if inp <= 0wx1F then yystuck(lastMatch) else yyQ25(strm', lastMatch) else if inp = 0wx27 then yyQ26(strm', lastMatch) else if inp < 0wx27 then if inp = 0wx26 then yystuck(lastMatch) else yyQ25(strm', lastMatch) else yyQ25(strm', lastMatch) else if inp = 0wx5F then yyQ25(strm', lastMatch) else if inp < 0wx5F then if inp = 0wx3F then yyQ25(strm', lastMatch) else if inp < 0wx3F then if inp = 0wx3D then yyQ25(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx5A then yyQ25(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ25(strm', lastMatch) else if inp < 0wx61 then yystuck(lastMatch) else if inp <= 0wx7A then yyQ25(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ9 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction40(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyAction40(strm, yyNO_MATCH) else if inp < 0wx3C then if inp = 0wx22 then yyAction40(strm, yyNO_MATCH) else if inp < 0wx22 then if inp = 0wxB then yyAction40(strm, yyNO_MATCH) else if inp < 0wxB then if inp <= 0wx8 then yyAction40(strm, yyNO_MATCH) else yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp <= 0wx1F then yyAction40(strm, yyNO_MATCH) else yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp = 0wx27 then yyQ26(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx27 then if inp = 0wx26 then yyAction40(strm, yyNO_MATCH) else yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp = 0wx5F then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx5F then if inp = 0wx3F then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx3F then if inp = 0wx3D then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) else if inp <= 0wx5A then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) else if inp = 0wx61 then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx61 then yyAction40(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ25(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) (* end case *)) fun yyQ28 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction9(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction9(strm, yyNO_MATCH) (* end case *)) fun yyQ27 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx3C then yystuck(lastMatch) else if inp < 0wx3C then if inp = 0wx22 then yyQ28(strm', lastMatch) else if inp < 0wx22 then if inp = 0wxB then yystuck(lastMatch) else if inp < 0wxB then if inp <= 0wx8 then yystuck(lastMatch) else yyQ27(strm', lastMatch) else if inp <= 0wx1F then yystuck(lastMatch) else yyQ27(strm', lastMatch) else if inp = 0wx26 then yystuck(lastMatch) else yyQ27(strm', lastMatch) else if inp = 0wx5F then yyQ27(strm', lastMatch) else if inp < 0wx5F then if inp = 0wx3F then yyQ27(strm', lastMatch) else if inp < 0wx3F then if inp = 0wx3D then yyQ27(strm', lastMatch) else yystuck(lastMatch) else if inp <= 0wx5A then yyQ27(strm', lastMatch) else yystuck(lastMatch) else if inp = 0wx61 then yyQ27(strm', lastMatch) else if inp < 0wx61 then yystuck(lastMatch) else if inp <= 0wx7A then yyQ27(strm', lastMatch) else yystuck(lastMatch) (* end case *)) fun yyQ8 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction40(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wx3C then yyAction40(strm, yyNO_MATCH) else if inp < 0wx3C then if inp = 0wx22 then yyQ28(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx22 then if inp = 0wxB then yyAction40(strm, yyNO_MATCH) else if inp < 0wxB then if inp <= 0wx8 then yyAction40(strm, yyNO_MATCH) else yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp <= 0wx1F then yyAction40(strm, yyNO_MATCH) else yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp = 0wx26 then yyAction40(strm, yyNO_MATCH) else yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp = 0wx5F then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx5F then if inp = 0wx3F then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx3F then if inp = 0wx3D then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) else if inp <= 0wx5A then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) else if inp = 0wx61 then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else if inp < 0wx61 then yyAction40(strm, yyNO_MATCH) else if inp <= 0wx7A then yyQ27(strm', yyMATCH(strm, yyAction40, yyNO_MATCH)) else yyAction40(strm, yyNO_MATCH) (* end case *)) fun yyQ7 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction12(strm, yyNO_MATCH) | SOME(inp, strm') => if inp = 0wxE then yyAction12(strm, yyNO_MATCH) else if inp < 0wxE then if inp <= 0wx8 then yyAction12(strm, yyNO_MATCH) else yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else if inp = 0wx20 then yyQ29(strm', yyMATCH(strm, yyAction12, yyNO_MATCH)) else yyAction12(strm, yyNO_MATCH) (* end case *)) fun yyQ6 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => yyAction40(strm, yyNO_MATCH) | SOME(inp, strm') => yyAction40(strm, yyNO_MATCH) (* end case *)) fun yyQ0 (strm, lastMatch : yymatch) = (case (yygetc(strm)) of NONE => if ULexBuffer.eof(!(yystrm)) then let val yycolno = ref(yygetcolNo(!(yystrm))) val yylineno = ref(yygetlineNo(!(yystrm))) in (case (!(yyss)) of _ => (UserDeclarations.eof()) (* end case *)) end else yystuck(lastMatch) | SOME(inp, strm') => if inp = 0wx41 then yyQ10(strm', lastMatch) else if inp < 0wx41 then if inp = 0wx23 then yyQ6(strm', lastMatch) else if inp < 0wx23 then if inp = 0wx20 then yyQ7(strm', lastMatch) else if inp < 0wx20 then if inp = 0wx9 then yyQ7(strm', lastMatch) else if inp < 0wx9 then yyQ6(strm', lastMatch) else if inp <= 0wxD then yyQ7(strm', lastMatch) else yyQ6(strm', lastMatch) else if inp = 0wx21 then yyQ6(strm', lastMatch) else yyQ8(strm', lastMatch) else if inp = 0wx3A then yyQ10(strm', lastMatch) else if inp < 0wx3A then if inp = 0wx27 then yyQ9(strm', lastMatch) else yyQ6(strm', lastMatch) else if inp = 0wx3E then yyQ11(strm', lastMatch) else yyQ6(strm', lastMatch) else if inp = 0wx60 then yyQ6(strm', lastMatch) else if inp < 0wx60 then if inp = 0wx53 then yyQ13(strm', lastMatch) else if inp < 0wx53 then if inp = 0wx50 then yyQ12(strm', lastMatch) else yyQ10(strm', lastMatch) else if inp = 0wx5B then yyQ6(strm', lastMatch) else if inp < 0wx5B then yyQ10(strm', lastMatch) else if inp = 0wx5F then yyQ10(strm', lastMatch) else yyQ6(strm', lastMatch) else if inp = 0wx73 then yyQ13(strm', lastMatch) else if inp < 0wx73 then if inp = 0wx70 then yyQ12(strm', lastMatch) else yyQ10(strm', lastMatch) else if inp <= 0wx7A then yyQ10(strm', lastMatch) else yyQ6(strm', lastMatch) (* end case *)) in (case (!(yyss)) of DOCTYPE => yyQ0(!(yystrm), yyNO_MATCH) | COM => yyQ1(!(yystrm), yyNO_MATCH) | LIT2 => yyQ2(!(yystrm), yyNO_MATCH) | LIT1 => yyQ3(!(yystrm), yyNO_MATCH) | INITIAL => yyQ4(!(yystrm), yyNO_MATCH) | TAG => yyQ5(!(yystrm), yyNO_MATCH) (* end case *)) end end and skip() = (yystartPos := yygetPos(); yylastwasnref := ULexBuffer.lastWasNL (!yystrm); continue()) in (continue(), (!yystartPos, yygetPos()), !yystrm, !yyss) end in lex() end in type pos = AntlrStreamPos.pos type span = AntlrStreamPos.span type tok = UserDeclarations.lex_result datatype prestrm = STRM of ULexBuffer.stream * (yystart_state * tok * span * prestrm * yystart_state) option ref type strm = (prestrm * yystart_state) fun lex sm (yyarg as lexErr)(STRM (yystrm, memo), ss) = (case !memo of NONE => let val (tok, span, yystrm', ss') = innerLex yyarg(yystrm, ss, sm) val strm' = STRM (yystrm', ref NONE); in memo := SOME (ss, tok, span, strm', ss'); (tok, span, (strm', ss')) end | SOME (ss', tok, span, strm', ss'') => if ss = ss' then (tok, span, (strm', ss'')) else ( memo := NONE; lex sm yyarg(STRM (yystrm, memo), ss)) (* end case *)) fun streamify input = (STRM (yystreamify' 0 input, ref NONE), INITIAL) fun streamifyReader readFn strm = (STRM (yystreamifyReader' 0 readFn strm, ref NONE), INITIAL) fun streamifyInstream strm = (STRM (yystreamifyInstream' 0 strm, ref NONE), INITIAL) fun getPos (STRM (strm, _), _) = ULexBuffer.getpos strm end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-lib.cm000066400000000000000000000007171416264345000227040ustar00rootroot00000000000000(* xml-lib.cm * * COPYRIGHT (c) 2010 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) Library signature XML_SCHEMA signature XML_TREE signature XML_PARSER functor XMLTreeFn functor XMLParserFn structure GenericXMLTree is $/basis.cm $/smlnj-lib.cm $/ml-lpt-lib.cm generic-xml-tree.sml xml-parser-fn.sml xml-schema-sig.sml xml-tokens.sml xml-tree-fn.sml xml-tree-sig.sml xml-lexer.lex : ml-ulex mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-lib.mlb000066400000000000000000000143461416264345000230620ustar00rootroot00000000000000 ann "nonexhaustiveBind warn" "nonexhaustiveMatch warn" "redundantBind warn" "redundantMatch warn" "sequenceNonUnit ignore" "warnUnused false" "forceUsed" in local basis l8 = bas (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/sml-nj.mlb end basis l78 = bas (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis l47 = bas (* $/ml-lpt-lib.cm ====> *) $(SML_LIB)/mllpt-lib/mllpt-lib.mlb end in local $(SML_LIB)/basis/pervasive.mlb local xml-schema-sig.sml in signature gs_0 = XML_SCHEMA end local open l8 in structure gs_1 = TextIO end local open l8 in structure gs_2 = Char structure gs_3 = CharArray structure gs_4 = CharVector structure gs_5 = FixedInt structure gs_6 = General structure gs_7 = Int structure gs_8 = Int32 structure gs_9 = Int64 structure gs_10 = IntInf structure gs_11 = LargeInt structure gs_12 = LargeReal structure gs_13 = LargeWord structure gs_14 = OS structure gs_15 = Position structure gs_16 = Real structure gs_17 = Real64 structure gs_18 = RealArray structure gs_19 = RealArraySlice structure gs_20 = RealVector structure gs_21 = RealVectorSlice structure gs_22 = SMLofNJ structure gs_23 = Socket structure gs_24 = String structure gs_25 = Substring structure gs_26 = SysWord structure gs_27 = Time structure gs_28 = Word structure gs_29 = Word32 structure gs_30 = Word64 structure gs_31 = Word8 end local open l8 in structure gs_32 = List end local open l47 in structure gs_33 = AntlrStreamPos end local xml-tokens.sml in structure gs_34 = XMLTokens end local open l8 in structure gs_35 = Vector end local open l8 in structure gs_36 = Option end local open l47 in structure gs_37 = UTF8 end local open l47 in structure gs_38 = ULexBuffer end local structure AntlrStreamPos = gs_33 structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Option = gs_36 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure TextIO = gs_1 structure Time = gs_27 structure ULexBuffer = gs_38 structure UTF8 = gs_37 structure Vector = gs_35 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 structure XMLTokens = gs_34 xml-lexer.lex.sml in structure gs_39 = XMLLexer end local signature XML_SCHEMA = gs_0 xml-tree-sig.sml in signature gs_40 = XML_TREE end local structure AntlrStreamPos = gs_33 structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure List = gs_32 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure TextIO = gs_1 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 structure XMLLexer = gs_39 structure XMLTokens = gs_34 signature XML_TREE = gs_40 xml-parser-fn.sml in functor gs_41 = XMLParserFn signature gs_42 = XML_PARSER end local open l78 in structure gs_43 = Atom end local signature XML_SCHEMA = gs_0 signature XML_TREE = gs_40 xml-tree-fn.sml in functor gs_44 = XMLTreeFn end local structure Atom = gs_43 structure Char = gs_2 structure CharArray = gs_3 structure CharVector = gs_4 structure FixedInt = gs_5 structure General = gs_6 structure Int = gs_7 structure Int32 = gs_8 structure Int64 = gs_9 structure IntInf = gs_10 structure LargeInt = gs_11 structure LargeReal = gs_12 structure LargeWord = gs_13 structure OS = gs_14 structure Position = gs_15 structure Real = gs_16 structure Real64 = gs_17 structure RealArray = gs_18 structure RealArraySlice = gs_19 structure RealVector = gs_20 structure RealVectorSlice = gs_21 structure SMLofNJ = gs_22 structure Socket = gs_23 structure String = gs_24 structure Substring = gs_25 structure SysWord = gs_26 structure Time = gs_27 structure Word = gs_28 structure Word32 = gs_29 structure Word64 = gs_30 structure Word8 = gs_31 functor XMLTreeFn = gs_44 signature XML_TREE = gs_40 generic-xml-tree.sml in structure gs_45 = GenericXMLTree end in structure GenericXMLTree = gs_45 functor XMLParserFn = gs_41 functor XMLTreeFn = gs_44 signature XML_PARSER = gs_42 signature XML_SCHEMA = gs_0 signature XML_TREE = gs_40 end end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-parser-fn.sml000066400000000000000000000242701416264345000242270ustar00rootroot00000000000000(* xml-parser-fn.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ http://www.smlnj.org) * All rights reserved. *) signature XML_PARSER = sig structure XMLTree : XML_TREE val parseFile : string -> XMLTree.tree exception ParseError of string end functor XMLParserFn (XT : XML_TREE) : XML_PARSER = struct structure XMLTree = XT structure XS = XT.Schema structure Tok = XMLTokens (***** Error messages *****) exception ParseError of string datatype error_tag = S of string | TK of Tok.token | E of XT.Schema.element fun error msg = let fun cvt (S s, l) = s :: l | cvt (TK tok, l) = XMLTokens.toString tok :: l | cvt (E elem, l) = XS.toString elem :: l in raise ParseError(String.concat(List.foldr cvt [] msg)) end (***** Token streams wrap the ML-ULex generated lexer ***** * * We cache tokens to avoid rescanning the source. *) type lexer_state = XMLLexer.prestrm * XMLLexer.yystart_state datatype token_strm_rep = TOK of {tok : Tok.token, span : XMLLexer.span, more : token_strm} | MORE of { state : lexer_state, get : lexer_state -> Tok.token * XMLLexer.span * lexer_state } withtype token_strm = token_strm_rep ref fun newTokenStrm (initialState, lexFn) = ref(MORE{state = initialState, get=lexFn}) fun nextTok (ref(TOK{tok, span, more})) = (tok, span, more) | nextTok (strm as ref(MORE{state, get})) = let val (tok, span, state) = get state val more = ref(MORE{state=state, get=get}) val rep = TOK{tok=tok, span=span, more=more} in strm := rep; (* cache lexer result *) (tok, span, more) end (* skip whitespace and comments *) fun skipWS tokStrm = (case nextTok tokStrm of (Tok.WS _, _, tokStrm) => skipWS tokStrm | (Tok.COM _, _, tokStrm) => skipWS tokStrm | _ => tokStrm (* end case *)) (****** Tracking the content of an element *****) type content = XT.content list type state = { content : content, (* parsed content in reverse order *) preWS : string option (* preceeding WS when we are not preserving whitespace *) } (* FIXME: this function doesn't seem right *) fun mergeWS (NONE, content) = content | mergeWS (SOME ws, XT.TEXT txt :: content) = XT.TEXT(txt ^ ws) :: content | mergeWS (SOME s, content) = XT.TEXT s :: content fun addElem ({content, preWS}, elem) = {content = elem :: mergeWS (preWS, content), preWS = NONE} fun addWS ({content, preWS}, ws) = (case preWS of SOME ws' => {content = content, preWS = SOME(ws' ^ ws)} | NONE => {content = content, preWS = SOME ws} (* end case *)) fun addCom (state, com) = state (* FIXME*) fun addText ({content, preWS}, txt) = let val content = (case (preWS, content) of (NONE, XT.TEXT txt' :: content) => XT.TEXT(txt' ^ txt) :: content | (NONE, content) => XT.TEXT txt :: content | (SOME ws, XT.TEXT txt' :: content) => XT.TEXT(concat[txt', ws, txt]) :: content | (SOME ws, content) => XT.TEXT(txt ^ ws) :: content (* end case *)) in {content = content, preWS = NONE} end fun addCData ({content, preWS}, cdata) = {content = XT.CDATA cdata :: mergeWS (preWS, content), preWS = NONE} fun finish ({content, preWS} : state) = List.rev content (***** Parsing *****) fun parser (name, inStrm) = let val srcMap = AntlrStreamPos.mkSourcemap' name fun err (span, msg) = error(S "Error [" :: S(AntlrStreamPos.spanToString srcMap span) :: S "]: " :: msg) (* scan an element identifier *) fun getElementId tokStrm = (case nextTok tokStrm of (Tok.ID id, span, tokStrm) => (case XS.element id of SOME elem => (elem, tokStrm) | NONE => err(span, [S "unrecognized element ", S id]) (* end case *)) | (tok, span, _) => err(span, [S "expected identifier, but found ", TK tok]) (* end case *)) (* parse the attributes of a start tag. We expect: (ID "=" LIT)* *) fun parseAttributes tokStrm = let fun parseAttr (tokStrm, attrs) = (case nextTok tokStrm of (Tok.ID id, _, tokStrm) => (case nextTok tokStrm of (Tok.SYM_EQ, _, tokStrm) => (case nextTok tokStrm of (Tok.LIT v, _, tokStrm) => parseAttr (tokStrm, XS.attribute(id, v)::attrs) | (tok, span, _) => err(span, [S "expected attribute value, but found ", TK tok]) (* end case *)) | (tok, span, _) => err(span, [S "expected \"=\", but found ", TK tok]) (* end case *)) | _ => (List.rev attrs, tokStrm) (* end case *)) in parseAttr (tokStrm, []) end (* parse an element. We assume that the initial "<" has been consumed. *) fun parseElement (tokStrm, preserveWS) = let val (elem, tokStrm) = getElementId tokStrm val (attrs, tokStrm) = parseAttributes tokStrm in case (nextTok tokStrm) of (Tok.CLOSE_TAG, _, tokStrm) => let val preserveWS = preserveWS orelse XS.preserveWS elem val (content, tokStrm) = parseContent (tokStrm, preserveWS, XS.preserveComment elem) in (* here we expect to see the matching close tag for the element *) case nextTok tokStrm of (Tok.OPEN_END_TAG, span, tokStrm) => let val (elem', tokStrm) = getElementId tokStrm in if XS.same(elem, elem') then (case nextTok tokStrm of (Tok.CLOSE_TAG, _, tokStrm) => (XT.ELEMENT{name=elem, attrs=attrs, content=content}, tokStrm) | (tok, span, _) => err (span, [ S "expected \">\", but found ", TK tok ]) (* end case *)) else err (span, [ S "mismatched close tag: expected ", E elem, S ", but found ", E elem' ]) end | (tok, span, _) => err(span, [ S "impossible: unexpected ", TK tok, S " when expected" ]) (* end case *) end | (Tok.CLOSE_EMPTY_TAG, _, tokStrm) => (XT.ELEMENT{name=elem, attrs=attrs, content=[]}, tokStrm) | (tok, span, _) => err(span, [S "expected \">\" or \"/>\", but found ", TK tok]) (* end case *) end (* parse the content of an element; we return when we *) and parseContent (tokStrm, preserveWS, preserveCom) : (XT.content list * token_strm) = let fun parse (tokStrm, state) = (case nextTok tokStrm of (Tok.EOF, _, _) => (finish state, tokStrm) | (Tok.OPEN_START_TAG, _, tokStrm) => let val (elem, tokStrm) = parseElement (tokStrm, preserveWS) in parse (tokStrm, addElem(state, elem)) end | (Tok.OPEN_END_TAG, _, _) => (finish state, tokStrm) | (Tok.WS s, _, tokStrm) => if preserveWS then parse (tokStrm, addText(state, s)) else parse (tokStrm, addWS(state, s)) | (Tok.TEXT s, _, tokStrm) => parse (tokStrm, addText(state, s)) | (Tok.COM s, _, tokStrm) => if preserveCom then parse (tokStrm, addCom(state, s)) else parse (tokStrm, state) | (Tok.CDATA s, _, tokStrm) => parse (tokStrm, addCData(state, s)) | (tok, span, _) => err(span, [S "impossible: unexpected ", TK tok]) (* end case *)) in parse (tokStrm, {preWS=NONE, content=[]}) end (* expect: Attributes "?>" *) and parseXMLDecl tokStrm = let val (attrs, tokStrm) = parseAttributes tokStrm in case nextTok tokStrm of (Tok.CLOSE_PI_TAG, _, tokStrm) => (SOME attrs, tokStrm) | (tok, span, _) => err(span, [S "expected \"?>\", but found ", TK tok]) (* end case *) end (* expect: ID (S ExternalID)? S? '>' * where * ExternalID ::= 'SYSTEM' LIT * | 'PUBLIC' LIT LIT *) fun parseDOCTYPE tokStrm = let val (id, tokStrm) = (case nextTok tokStrm of (Tok.ID id, _, tokStrm) => (id, tokStrm) | (tok, span, _) => err(span, [S "expected identifier, but found ", TK tok]) (* end case *)) fun getLiteral tokStrm = (case nextTok tokStrm of (Tok.LIT lit, _, tokStrm) => (lit, tokStrm) | (tok, span, _) => err (span, [S "expected literal, but found ", TK tok]) (* end case *)) val (external, tokStrm) = (case nextTok tokStrm of (Tok.SYSTEM, _, tokStrm) => let val (lit, tokStrm) = getLiteral tokStrm in (SOME(XT.SYSTEM lit), tokStrm) end | (Tok.PUBLIC, _, tokStrm) => let val (lit1, tokStrm) = getLiteral tokStrm val (lit2, tokStrm) = getLiteral tokStrm in (SOME(XT.PUBLIC(lit1, lit2)), tokStrm) end | _ => (NONE, tokStrm) (* end case *)) in (* expect ">" *) case nextTok tokStrm of (Tok.CLOSE_TAG, _, tokStrm) => (SOME(XT.DOCTYPE(id, external)), tokStrm) | (tok, span, tokStrm) => err(span, [S "expected \">\", but found ", TK tok]) (* end case *) end (* initialize the token stream *) val tokStrm = newTokenStrm ( XMLLexer.streamifyInstream inStrm, XMLLexer.lex srcMap (fn (pos, msg) => err((pos, pos), List.map S msg))) (* parse the XML Decl (if any) *) val (xmlDecl, tokStrm) = (case nextTok (skipWS tokStrm) of (Tok.OPEN_XML_TAG, _, tokStrm) => parseXMLDecl tokStrm | _ => (NONE, tokStrm) (* end case *)) (* parse the DOCTYPE (if any) *) val (doctype, tokStrm) = (case nextTok (skipWS tokStrm) of (Tok.OPEN_DOCTYPE, _, tokStrm) => parseDOCTYPE tokStrm | _ => (NONE, tokStrm) (* end case *)) (* QUESTION: should we preserve comments at top-level by default? *) val (body, _) = parseContent (skipWS tokStrm, false, false) in case body of [] => error [S "empty document"] | [elem as XT.ELEMENT _] => { xmlDecl = xmlDecl, doctype = doctype, content = elem } | _ => error [S "body of document is not a single element"] (* end case *) end (* parser *) (* (* parse XMLDecl? Content *) and parse tokStrm = let fun parse tokStrm = (case nextTok tokStrm of (EOF, _) => {xmlDecl = xmlDecl, content = TEXT ""} | (Tok.OPEN_START_TAG, tokStrm) => let val finalState = parseStartTag (tokStrm, content, stk) in {xmlDecl = xmlDecl, content = ??} end | Tok.WS _ => parse tokStrm | tok, _) => err(?, [S "impossible: unexpected ", TK tok]) (* end case *)) in parse tokStrm before close tokStrm end *) fun parseFile file = let val inStrm = TextIO.openIn file val tree = parser (file, inStrm) handle ex => (TextIO.closeIn inStrm; raise ex) in TextIO.closeIn inStrm; tree end end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-schema-sig.sml000066400000000000000000000020621416264345000243450ustar00rootroot00000000000000(* xml-schema-sig.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * Information about an XML schema (or DTD) that is used in the implementation of * a parser. *) signature XML_SCHEMA = sig type element type attribute (* create an element; returns NONE if the element name is unrecognized *) val element : string -> element option (* If this function returns true for an element, then all whitespace in the * element's content is preserved. Otherwise, whitespace between tags is * not preserved. Note that if true, this property is inherited by any * nested elements. *) val preserveWS : element -> bool (* should comments be preserved *) val preserveComment : element -> bool (* equality test *) val same : element * element -> bool (* the string representation of the element (w/o the "<" and ">" brackets) *) val toString : element -> string (* create an attribute from a name/value pair *) val attribute : (string * string) -> attribute end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-tokens.sml000066400000000000000000000030171416264345000236310ustar00rootroot00000000000000(* xml-tokens.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) structure XMLTokens = struct datatype token = EOF | OPEN_START_TAG (* "<" *) | OPEN_END_TAG (* "" *) | CLOSE_EMPTY_TAG (* "/>" *) | CLOSE_PI_TAG (* "?>" also closes XML tags *) | SYM_EQ (* "=" inside a tag *) | ID of string (* element or attribute name *) | LIT of string (* quoted attribute value *) (* the following tags are content *) | TEXT of string (* non-whitespace/non-comment text *) | WS of string (* whitespace *) | COM of string (* XML comment; string does not include "" *) | CDATA of string (* CDATA text; string does not include "" *) | PUBLIC (* "PUBLIC" in *) | SYSTEM (* "SYSTEM" in *) fun toString tok = (case tok of EOF => "EOF" | OPEN_START_TAG => "<" | OPEN_END_TAG => " " " " ">" | CLOSE_EMPTY_TAG => "/>" | CLOSE_PI_TAG => "?>" | SYM_EQ => "=" | ID s => s | LIT _ => "LIT" | TEXT _ => "TEXT" | WS _ => "WS" | COM _=> "COM" | CDATA _ => "CDATA" | PUBLIC => "PUBLIC" | SYSTEM => "SYSTEM" (* end case *)) end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-tree-fn.sml000066400000000000000000000015021416264345000236630ustar00rootroot00000000000000(* xml-tree-fn.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. *) functor XMLTreeFn (Schema : XML_SCHEMA) : XML_TREE = struct structure Schema = Schema (* limited support for declarations. Internal subsets are not * current supported. *) datatype doctype = DOCTYPE of string * external_id option and external_id = SYSTEM of string | PUBLIC of string * string datatype content = TEXT of string | CDATA of string | ELEMENT of { name : Schema.element, attrs : Schema.attribute list, content : content list } type tree = { xmlDecl : Schema.attribute list option, (* NONE if there is no decl *) doctype : doctype option, content : content (* will be an ELEMENT *) } end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/XML/xml-tree-sig.sml000066400000000000000000000013421416264345000240440ustar00rootroot00000000000000(* xml-tree-sig.sml * * COPYRIGHT (c) 2013 The Fellowship of SML/NJ (http://www.smlnj.org) * All rights reserved. * * A tree representation of an XML file. *) signature XML_TREE = sig structure Schema : XML_SCHEMA datatype doctype = DOCTYPE of string * external_id option and external_id = SYSTEM of string | PUBLIC of string * string datatype content = TEXT of string | CDATA of string | ELEMENT of { name : Schema.element, attrs : Schema.attribute list, content : content list } type tree = { xmlDecl : Schema.attribute list option, (* NONE if there is no decl *) doctype : doctype option, content : content (* will be an ELEMENT *) } end mlton-20210117+dfsg/lib/smlnj-lib/smlnj-lib/smlnj-lib.mlb000066400000000000000000000005441416264345000227400ustar00rootroot00000000000000local Controls/controls-lib.mlb HTML/html-lib.mlb HTML4/html4-lib.mlb HashCons/hash-cons-lib.mlb INet/inet-lib.mlb JSON/json-lib.mlb PP/pp-lib.mlb Reactive/reactive-lib.mlb RegExp/regexp-lib.mlb SExp/sexp-lib.mlb Unix/unix-lib.mlb Util/smlnj-lib.mlb Util/time-limit.mlb UUID/uuid-lib.mlb XML/xml-lib.mlb in end mlton-20210117+dfsg/lib/stubs/000077500000000000000000000000001416264345000157345ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/Makefile000066400000000000000000000002651416264345000173770ustar00rootroot00000000000000## Copyright (C) 2009 Matthew Fluet. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean mlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/000077500000000000000000000000001416264345000222715ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/int.sml000066400000000000000000000002371416264345000236020ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Int64 = Int mlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/real.sml000066400000000000000000000044251416264345000237360ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Real64 = Real structure Real32 = Real (* Dummy implementation that will not be used at run-time. *) structure PackReal32Big : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Big.toBytes" fun fromBytes _ = raise Fail "PackReal32Big.fromBytes" fun subVec _ = raise Fail "PackReal32Big.subVec" fun subArr _ = raise Fail "PackReal32Big.subArr" fun update _ = raise Fail "PackReal32Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal32Little : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Little.toBytes" fun fromBytes _ = raise Fail "PackReal32Little.fromBytes" fun subVec _ = raise Fail "PackReal32Little.subVec" fun subArr _ = raise Fail "PackReal32Little.subArr" fun update _ = raise Fail "PackReal32Little.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Big : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Big.toBytes" fun fromBytes _ = raise Fail "PackReal64Big.fromBytes" fun subVec _ = raise Fail "PackReal64Big.subVec" fun subArr _ = raise Fail "PackReal64Big.subArr" fun update _ = raise Fail "PackReal64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Little : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Little.toBytes" fun fromBytes _ = raise Fail "PackReal64Little.fromBytes" fun subVec _ = raise Fail "PackReal64Little.subVec" fun subArr _ = raise Fail "PackReal64Little.subArr" fun update _ = raise Fail "PackReal64Little.update" end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/sources.use000066400000000000000000000001231416264345000244660ustar00rootroot00000000000000use "int.sml"; use "real.sml"; use "unsafe.sig"; use "unsafe.sml"; use "word.sml"; mlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/unsafe.sig000066400000000000000000000006251416264345000242610ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature UNSAFE = sig structure Array: sig val sub: 'a array * int -> 'a val update: 'a array * int * 'a -> unit end structure Vector: sig val sub: 'a vector * int -> 'a end endmlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/unsafe.sml000066400000000000000000000005171416264345000242720ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Unsafe : UNSAFE = struct structure Array = struct open Array end structure Vector = struct open Vector end endmlton-20210117+dfsg/lib/stubs/basis-stubs-for-polyml/word.sml000066400000000000000000000022451416264345000237640ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Word64 = Word (* Dummy implementation that will not be used at run-time. *) structure PackWord64Big : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = true fun subVec _ = raise Fail "PackWord64Big.subVec" fun subVecX _ = raise Fail "PackWord64Big.subVecX" fun subArr _ = raise Fail "PackWord64Big.subArr" fun subArrX _ = raise Fail "PackWord64Big.subArrX" fun update _ = raise Fail "PackWord64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackWord64Little : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = false fun subVec _ = raise Fail "PackWord64Little.subVec" fun subVecX _ = raise Fail "PackWord64Little.subVecX" fun subArr _ = raise Fail "PackWord64Little.subArr" fun subArrX _ = raise Fail "PackWord64Little.subArrX" fun update _ = raise Fail "PackWord64Little.update" end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/000077500000000000000000000000001416264345000221005ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/Makefile000066400000000000000000000005121416264345000235360ustar00rootroot00000000000000## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/char.sml000066400000000000000000000010411416264345000235260ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Char : CHAR = struct open Pervasive.Char (* SML/NJ doesn't escape #"\000" to three octal digits. *) (* Fixed in SML/NJ 110.83. *) val toCString = fn #"\000" => "\\000" | c => toCString c end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/ieee-real.sml000066400000000000000000000040751416264345000244530ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* SML/NJ uses an old version of datatype IEEEReal.float_class. *) signature IEEE_REAL = sig exception Unordered datatype real_order = EQUAL | GREATER | LESS | UNORDERED datatype float_class = INF | NAN | NORMAL | SUBNORMAL | ZERO datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO val setRoundingMode : rounding_mode -> unit val getRoundingMode : unit -> rounding_mode type decimal_approx = {digits:int list, exp:int, kind:float_class, sign:bool} val toString : decimal_approx -> string val fromString : string -> decimal_approx option val scan : (char,'a) StringCvt.reader -> (decimal_approx,'a) StringCvt.reader end structure IEEEReal : IEEE_REAL = struct open IEEEReal datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL type decimal_approx = {digits:int list, exp:int, kind:float_class, sign:bool} local structure P = Pervasive.IEEEReal fun toGoodFC c = case c of P.NAN _ => NAN | P.INF => INF | P.ZERO => ZERO | P.NORMAL => NORMAL | P.SUBNORMAL => SUBNORMAL fun toBadFC c = case c of NAN => P.NAN P.QUIET | INF => P.INF | ZERO => P.ZERO | NORMAL => P.NORMAL | SUBNORMAL => P.SUBNORMAL fun toGoodDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toGoodFC kind, sign = sign} fun toBadDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toBadFC kind, sign = sign} in val toString = P.toString o toBadDA val fromString = (Option.map toGoodDA) o P.fromString fun scan r s = Option.map (fn (da,x) => (toGoodDA da,x)) (P.scan r s) end end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/int-inf.sml000066400000000000000000000012771416264345000241700ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor FixIntInf(PIntInf: sig include INT_INF end) : INT_INF = struct open PIntInf local (* SML/NJ uses lower instead of upper case. *) val toUpper = String.translate (Char.toString o Char.toUpper) in fun fmt r w = toUpper (PIntInf.fmt r w) end end structure IntInf = FixIntInf(struct open Pervasive.IntInf end) structure LargeInt: INTEGER = IntInf mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/pack-real32.sml000066400000000000000000000024051416264345000246220ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Dummy implementation that will not be used at run-time. *) structure PackReal32Big : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 4 val isBigEndian = true fun toBytes _ = raise Fail "PackReal32Big.toBytes" fun fromBytes _ = raise Fail "PackReal32Big.fromBytes" fun subVec _ = raise Fail "PackReal32Big.subVec" fun subArr _ = raise Fail "PackReal32Big.subArr" fun update _ = raise Fail "PackReal32Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal32Little : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 4 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Little.toBytes" fun fromBytes _ = raise Fail "PackReal32Little.fromBytes" fun subVec _ = raise Fail "PackReal32Little.subVec" fun subArr _ = raise Fail "PackReal32Little.subArr" fun update _ = raise Fail "PackReal32Little.update" end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/pack-real64.sml000066400000000000000000000024071416264345000246310ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Dummy implementation that will not be used at run-time. *) structure PackReal64Big : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 8 val isBigEndian = true fun toBytes _ = raise Fail "PackReal64Big.toBytes" fun fromBytes _ = raise Fail "PackReal64Big.fromBytes" fun subVec _ = raise Fail "PackReal64Big.subVec" fun subArr _ = raise Fail "PackReal64Big.subArr" fun update _ = raise Fail "PackReal64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Little : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 8 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Little.toBytes" fun fromBytes _ = raise Fail "PackReal64Little.fromBytes" fun subVec _ = raise Fail "PackReal64Little.subVec" fun subArr _ = raise Fail "PackReal64Little.subArr" fun update _ = raise Fail "PackReal64Little.update" end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/pack-word64.sml000066400000000000000000000022211416264345000246530ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Dummy implementation that will not be used at run-time. *) structure PackWord64Big : PACK_WORD = struct val bytesPerElem = 8 val isBigEndian = true fun subVec _ = raise Fail "PackWord64Big.subVec" fun subVecX _ = raise Fail "PackWord64Big.subVecX" fun subArr _ = raise Fail "PackWord64Big.subArr" fun subArrX _ = raise Fail "PackWord64Big.subArrX" fun update _ = raise Fail "PackWord64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackWord64Little : PACK_WORD = struct val bytesPerElem = 8 val isBigEndian = false fun subVec _ = raise Fail "PackWord64Little.subVec" fun subVecX _ = raise Fail "PackWord64Little.subVecX" fun subArr _ = raise Fail "PackWord64Little.subArr" fun subArrX _ = raise Fail "PackWord64Little.subArrX" fun update _ = raise Fail "PackWord64Little.update" end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/pervasive.cm000066400000000000000000000004021416264345000244210ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature PERVASIVE_REAL structure Pervasive is #if (defined (SMLNJ_VERSION)) $/basis.cm #endif pervasive.sml mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/pervasive.sml000066400000000000000000000017231416264345000246240ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PERVASIVE_REAL = REAL structure Pervasive = struct structure Char = Char structure FixedInt = FixedInt structure IEEEReal = IEEEReal structure Int = Int structure Int32 = Int32 structure Int64 = Int64 structure IntInf = IntInf structure LargeInt = LargeInt structure LargeReal = LargeReal structure LargeWord = LargeWord structure Position = Position structure Real = Real structure Real64 = Real64 structure Word = Word structure Word8 = Word8 structure Word32 = Word32 structure Word64 = Word64 structure String = String structure SysWord = SysWord end mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/real.sml000066400000000000000000000142741416264345000235500ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* SML/NJ uses an old version of datatype IEEEReal.float_class. *) signature REAL = sig type real structure Math: MATH where type real = real val != : real * real -> bool val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val abs: real -> real val checkFloat: real -> real val class: real -> IEEEReal.float_class val compare: real * real -> order val compareReal: real * real -> IEEEReal.real_order val copySign: real * real -> real val fmt: StringCvt.realfmt -> real -> string val fromDecimal: IEEEReal.decimal_approx -> real option val fromInt: int -> real val fromLarge: IEEEReal.rounding_mode -> LargeReal.real -> real val fromLargeInt: LargeInt.int -> real val fromManExp: {man: real, exp: int} -> real val fromString: string -> real option val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val max: real * real -> real val maxFinite: real val min: real * real -> real val minNormalPos: real val minPos: real val negInf: real val nextAfter: real * real -> real val posInf: real val precision: int val radix: int val realCeil: real -> real val realFloor: real -> real val realMod: real -> real val realRound: real -> real val realTrunc: real -> real val rem: real * real -> real val round: real -> Int.int val sameSign: real * real -> bool val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val sign: real -> int val signBit: real -> bool val split: real -> {whole: real, frac: real} val toDecimal: real -> IEEEReal.decimal_approx val toInt: IEEEReal.rounding_mode -> real -> int val toLarge: real -> LargeReal.real val toLargeInt: IEEEReal.rounding_mode -> real -> LargeInt.int val toManExp: real -> {man: real, exp: int} val toString: real -> string val unordered: real * real -> bool val ~ : real -> real val ceil: real -> Int.int val floor: real -> Int.int val trunc: real -> Int.int end functor FixReal(PReal: sig include PERVASIVE_REAL val zero : real end) : REAL = struct open PReal (* SML/NJ uses an old version of datatype IEEEReal.float_class. *) local datatype z = datatype IEEEReal.float_class structure P = Pervasive.IEEEReal fun toGoodFC c = case c of P.NAN _ => NAN | P.INF => INF | P.ZERO => ZERO | P.NORMAL => NORMAL | P.SUBNORMAL => SUBNORMAL fun toBadFC c = case c of NAN => P.NAN P.QUIET | INF => P.INF | ZERO => P.ZERO | NORMAL => P.NORMAL | SUBNORMAL => P.SUBNORMAL fun toGoodDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toGoodFC kind, sign = sign} fun toBadDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toBadFC kind, sign = sign} in val class = toGoodFC o class val fromDecimal = SOME o fromDecimal o toBadDA val toDecimal = toGoodDA o toDecimal end (* SML/NJ doesn't support EXACT. *) fun fmt f = PReal.fmt (let datatype z = datatype StringCvt.realfmt in case f of EXACT => StringCvt.GEN NONE | FIX io => StringCvt.FIX io | GEN io => StringCvt.GEN io | SCI io => StringCvt.SCI io end) val fromString = PReal.fromString (* SML/NJ raises Overflow on large exponents. *) (* Fixed in SML/NJ 110.83. *) val fromString = fn s => (case SOME (fromString s) handle Overflow => NONE of NONE => let val manexp = String.tokens (fn c => c = #"e" orelse c = #"E") s fun isNeg s = String.sub (s, 0) = #"~" orelse String.sub (s, 0) = #"+" fun isNonzero s = CharVector.exists (fn c => Char.<= (#"1", c) andalso Char.<= (c, #"9")) s in case manexp of [man,exp] => if isNeg exp then SOME zero else if isNonzero man then SOME posInf else SOME zero | _ => NONE end | SOME ro => ro) (* SML/NJ doesn't handle "[+~-]?(inf|infinity|nan)". *) val fromString = fn s => case s of "inf" => SOME posInf | "infinity" => SOME posInf | "+inf" => SOME posInf | "+infinity" => SOME posInf | "~inf" => SOME negInf | "~infinity" => SOME negInf | "-inf" => SOME negInf | "-infinity" => SOME negInf | "nan" => SOME (negInf + posInf) | "+nan" => SOME (negInf + posInf) | "~nan" => SOME (negInf + posInf) | "-nan" => SOME (negInf + posInf) | _ => fromString s end structure LargeReal = FixReal(struct open Pervasive.LargeReal val zero : real = 0.0 end) structure Real = FixReal(struct open Pervasive.Real val zero : real = 0.0 end) structure Real64 = FixReal(struct open Pervasive.Real64 val zero : real = 0.0 end) structure Real32 = Real64 mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/sources.cm000066400000000000000000000047061416264345000241130ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library library($/basis.cm) - ( signature IEEE_REAL signature REAL #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 83) structure Char #endif structure IEEEReal structure IntInf structure LargeInt structure LargeReal structure PackReal32Big structure PackReal32Little #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 79) structure PackReal64Big structure PackReal64Little #endif #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 91) structure PackWord64Big structure PackWord64Little #endif structure Real structure Real32 structure Real64 #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 83) structure String #endif ) signature IEEE_REAL signature REAL #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 83) structure Char structure String #endif structure IEEEReal structure IntInf structure LargeInt structure LargeReal structure PackReal32Big structure PackReal32Little #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 79) structure PackReal64Big structure PackReal64Little #endif #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 91) structure PackWord64Big structure PackWord64Little #endif structure Real structure Real32 structure Real64 is $/basis.cm pervasive.cm #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 79) pack-real64.sml #endif #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 83) char.sml string.sml #endif #if SMLNJ_VERSION < 110 orelse (SMLNJ_VERSION = 110 andalso SMLNJ_MINOR_VERSION < 91) pack-word64.sml #endif int-inf.sml ieee-real.sml real.sml pack-real32.sml mlton-20210117+dfsg/lib/stubs/basis-stubs-for-smlnj/string.sml000066400000000000000000000010041416264345000241160ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure String : STRING = struct open Pervasive.String (* SML/NJ doesn't escape #"\000" to three octal digits. *) (* Fixed in SML/NJ 110.83. *) val toCString = translate Char.toCString end mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-polyml/000077500000000000000000000000001416264345000223215ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-polyml/mlton.sml000066400000000000000000000040151416264345000241670ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLton = struct val isMLton = false structure Exn = struct val history : exn -> string list = fn _ => [] end structure GC = struct fun collect () = PolyML.fullGC () fun setMessages (b : bool) = () fun pack () = collect () end structure Platform = struct local fun mkHost cmd = let fun findCmd dir = let val cmd = dir ^ "/bin/" ^ cmd val upDir = OS.FileSys.realPath (dir ^ "/..") in if OS.FileSys.access (cmd, [OS.FileSys.A_EXEC]) then SOME cmd else if dir <> upDir then findCmd upDir else NONE end val proc = Unix.execute (valOf (findCmd "."), []) val ins = Unix.textInstreamOf proc val hostString = TextIO.inputAll ins val status = Unix.reap proc in String.extract (hostString, 0, SOME (String.size hostString - 1)) end in structure Arch = struct type t = string val toString = fn s => s val host = mkHost "host-arch" end structure OS = struct type t = string val toString = fn s => s val host = mkHost "host-os" end end end end mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-polyml/sources.use000066400000000000000000000000211416264345000245130ustar00rootroot00000000000000use "mlton.sml"; mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-smlnj/000077500000000000000000000000001416264345000221305ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-smlnj/Makefile000066400000000000000000000005121416264345000235660ustar00rootroot00000000000000## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-smlnj/mlton.sml000066400000000000000000000040371416264345000240020ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLton = struct val isMLton = false structure Exn = struct val history = SMLofNJ.exnHistory end structure GC = struct fun collect () = SMLofNJ.Internals.GC.doGC 8 fun setMessages b = SMLofNJ.Internals.GC.messages b fun pack () = collect () end structure Platform = struct local fun mkHost cmd = let fun findCmd dir = let val cmd = dir ^ "/bin/" ^ cmd val upDir = OS.FileSys.realPath (dir ^ "/..") in if OS.FileSys.access (cmd, [OS.FileSys.A_EXEC]) then SOME cmd else if dir <> upDir then findCmd upDir else NONE end val proc = Unix.execute (valOf (findCmd "."), []) val ins = Unix.textInstreamOf proc val hostString = TextIO.inputAll ins val status = Unix.reap proc in String.extract (hostString, 0, SOME (String.size hostString - 1)) end in structure Arch = struct type t = string val toString = fn s => s val host = mkHost "host-arch" end structure OS = struct type t = string val toString = fn s => s val host = mkHost "host-os" end end end end mlton-20210117+dfsg/lib/stubs/mlton-stubs-for-smlnj/sources.cm000066400000000000000000000002751416264345000241400ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library structure MLton is $/basis.cm mlton.sml mlton-20210117+dfsg/lib/stubs/mlton-stubs/000077500000000000000000000000001416264345000202235ustar00rootroot00000000000000mlton-20210117+dfsg/lib/stubs/mlton-stubs/Makefile000066400000000000000000000005121416264345000216610ustar00rootroot00000000000000## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20210117+dfsg/lib/stubs/mlton-stubs/README000066400000000000000000000003261416264345000211040ustar00rootroot00000000000000The files in this directory define the MLton structure within the context of the Standard ML Basis Library. Many things are defined to raise exceptions, but enough is emulated so that we can compile MLton itself. mlton-20210117+dfsg/lib/stubs/mlton-stubs/array.sig000066400000000000000000000006141416264345000220460ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ARRAY = sig val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b end mlton-20210117+dfsg/lib/stubs/mlton-stubs/bin-io.sig000066400000000000000000000003541416264345000221060ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_BIN_IO = MLTON_IO mlton-20210117+dfsg/lib/stubs/mlton-stubs/cont.sig000066400000000000000000000006361416264345000216770ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CONT = sig type 'a t val callcc: ('a t -> 'a) -> 'a val prepend: 'a t * ('b -> 'a) -> 'b t val throw: 'a t * 'a -> 'b val throw': 'a t * (unit -> 'a) -> 'b end mlton-20210117+dfsg/lib/stubs/mlton-stubs/exn.sig000066400000000000000000000011271416264345000215220ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_EXN = sig val addExnMessager: (exn -> string option) -> unit val history: exn -> string list val defaultTopLevelHandler: exn -> 'a (* does not return *) val getTopLevelHandler: unit -> (exn -> unit) val setTopLevelHandler: (exn -> unit) -> unit val topLevelHandler: exn -> 'a (* does not return *) end mlton-20210117+dfsg/lib/stubs/mlton-stubs/finalizable.sig000066400000000000000000000007151416264345000232120ustar00rootroot00000000000000(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FINALIZABLE = sig type 'a t val addFinalizer: 'a t * ('a -> unit) -> unit val finalizeBefore: 'a t * 'b t -> unit val new: 'a -> 'a t val touch: 'a t -> unit val withValue: 'a t * ('a -> 'b) -> 'b end mlton-20210117+dfsg/lib/stubs/mlton-stubs/gc.sig000066400000000000000000000016101416264345000213160ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_GC = sig val collect: unit -> unit val pack: unit -> unit val setMessages: bool -> unit val setSummary: bool -> unit val unpack: unit -> unit (* Most meaningful immediately after 'collect()'. *) structure Statistics : sig val bytesAllocated: unit -> IntInf.int val lastBytesLive: unit -> IntInf.int val numCopyingGCs: unit -> IntInf.int val numMarkCompactGCs: unit -> IntInf.int val numMinorGCs: unit -> IntInf.int val maxBytesLive: unit -> IntInf.int end end mlton-20210117+dfsg/lib/stubs/mlton-stubs/io.sig000066400000000000000000000020131416264345000213320ustar00rootroot00000000000000(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_IO_ARG = sig type instream type outstream val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end signature MLTON_IO = sig include MLTON_IO_ARG (* mkstemp s creates and opens a new temp file with prefix s, returning * the name of the temp file and the outstream to write to it. *) val mkstemp: string -> string * outstream (* mkstemps is like mkstemp, except it has both a prefix and suffix. *) val mkstemps: {prefix: string, suffix: string} -> string * outstream (* adds a suitable system or user specific prefix (dir) for temp files *) val tempPrefix: string -> string end mlton-20210117+dfsg/lib/stubs/mlton-stubs/itimer.sig000066400000000000000000000007221416264345000222210ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ITIMER = sig datatype t = Prof | Real | Virtual val set: t * {interval: Time.time, value: Time.time} -> unit val signal: t -> Posix.Signal.signal end mlton-20210117+dfsg/lib/stubs/mlton-stubs/mlton.sig000066400000000000000000000033221416264345000220600ustar00rootroot00000000000000(* Copyright (C) 2009,2013,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON = sig val debug: bool (* Pointer equality. The usual caveats about lack of a well-defined * semantics. *) val eq: 'a * 'a -> bool (* Structural equality. Equivalent to SML's polymorphic * equality on equality types and a conservative approximation * of equivalence other types. *) val equal: 'a * 'a -> bool (* Structural hash. *) val hash: 'a -> Word32.word val isMLton: bool val safe: bool val share: 'a -> unit val shareAll: unit -> unit val size: 'a -> IntInf.int val sizeAll: 'a -> IntInf.int structure Array: MLTON_ARRAY (* structure BinIO: MLTON_BIN_IO *) (* structure Cont: MLTON_CONT *) structure Exn: MLTON_EXN (* structure Finalizable: MLTON_FINALIZABLE *) structure GC: MLTON_GC structure Itimer: MLTON_ITIMER structure Platform: MLTON_PLATFORM structure ProcEnv: MLTON_PROC_ENV structure Process: MLTON_PROCESS structure Profile: MLTON_PROFILE structure Random: MLTON_RANDOM structure Rusage: MLTON_RUSAGE structure Signal: MLTON_SIGNAL structure TextIO: MLTON_TEXT_IO structure Thread: MLTON_THREAD structure Vector: MLTON_VECTOR (* structure Weak: MLTON_WEAK *) (* structure Word: MLTON_WORD *) (* structure Word8: MLTON_WORD *) (* structure World: MLTON_WORLD *) end mlton-20210117+dfsg/lib/stubs/mlton-stubs/mlton.sml000066400000000000000000000404701416264345000220760ustar00rootroot00000000000000(* Copyright (C) 2013,2019 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MkIO (S : sig type instream type outstream val openOut: string -> outstream end) = struct open S fun inFd _ = raise Fail "IO.inFd" fun mkstemps {prefix, suffix} = let val name = concat [prefix, MLtonRandom.alphaNumString 6, suffix] in (* Make sure the temporary file name doesn't already exist. *) if OS.FileSys.access (name, []) then mkstemps {prefix = prefix, suffix = suffix} else (name, openOut name) end fun mkstemp s = mkstemps {prefix = s, suffix = ""} fun newIn _ = raise Fail "IO.newIn" fun newOut _ = raise Fail "IO.newOut" fun outFd _ = raise Fail "IO.outFd" fun setIn _ = raise Fail "IO.setIn" fun tempPrefix _ = raise Fail "IO.tempPrefix" end functor MkWord(W : WORD) : MLTON_WORD = struct open W type t = word val wordSize = Word.fromInt wordSize val bswap = fn _ => raise Fail "Word.bswap" fun rol (w: word, w': Word.word): word = let val w' = Word.mod (w', wordSize) in orb (>> (w, Word.- (wordSize, w')), << (w, w')) end fun ror (w: word, w': Word.word): word = let val w' = Word.mod (w', wordSize) in orb (>> (w, w'), << (w, Word.- (wordSize, w'))) end end (* This file is just a dummy provided in place of the structure that MLton * supplies so that we can compile under SML/NJ. *) structure MLton: MLTON = struct val debug = false val eq = fn _ => raise Fail "eq" val equal = fn _ => raise Fail "equal" val hash = fn _ => raise Fail "hash" val isMLton = MLton.isMLton val safe = true val share = fn _ => raise Fail "share" val shareAll = fn _ => raise Fail "shareAll" val size: 'a -> IntInf.int = fn _ => ~1 val sizeAll: 'a -> IntInf.int = fn _ => ~1 structure Array = struct open Array fun unfoldi (n, a, f) = let val r = ref a val a = tabulate (n, fn i => let val (b, a') = f (i, !r) val _ = r := a' in b end) in (a, !r) end end structure BinIO = MkIO (BinIO) structure Exn = struct val addExnMessager = fn _ => raise Fail "Exn.addExnMessager" val history = MLton.Exn.history val defaultTopLevelHandler = fn _ => raise Fail "Exn.defaultTopLevelHandler" val getTopLevelHandler = fn _ => raise Fail "Exn.getTopLevelHandler" val setTopLevelHandler = fn _ => raise Fail "Exn.setTopLevelHandler" val topLevelHandler = fn _ => raise Fail "Exn.topLevelHandler" end structure Finalizable = struct type 'a t = 'a fun addFinalizer _ = () fun finalizeBefore _ = () fun new x = x fun touch _ = () fun withValue (x, f) = f x end structure GC = struct val collect = MLton.GC.collect val pack = MLton.GC.pack val setMessages = MLton.GC.setMessages fun setSummary _ = () fun unpack _ = () structure Statistics = struct val bytesAllocated = fn _ => raise Fail "GC.Statistics.bytesAllocated" val lastBytesLive = fn _ => raise Fail "GC.Statistics.lastBytesLive" val numCopyingGCs = fn _ => raise Fail "GC.Statistics.numCopyingGCs" val numMarkCompactGCs = fn _ => raise Fail "GC.Statistics.numMarkCompactGCs" val numMinorGCs = fn _ => raise Fail "GC.Statistics.numMinorGCs" val maxBytesLive = fn _ => raise Fail "GC.Statistics.maxBytesLive" end end structure Itimer = struct datatype t = Prof | Real | Virtual fun signal _ = Posix.Signal.alrm fun set _ = raise Fail "Itimer.set" end structure Platform = struct fun peek (l, f) = List.find f l fun omap (opt, f) = Option.map f opt structure String = struct open String val toLower = CharVector.map Char.toLower end structure Arch = struct datatype t = Alpha | AMD64 | ARM | ARM64 | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | RISCV | S390 | Sparc | X86 val all = [(Alpha, "Alpha"), (AMD64, "AMD64"), (ARM, "ARM"), (ARM64, "ARM64"), (HPPA, "HPPA"), (IA64, "IA64"), (m68k, "m68k"), (MIPS, "MIPS"), (PowerPC, "PowerPC"), (PowerPC64, "PowerPC64"), (RISCV, "RISCV"), (S390, "S390"), (Sparc, "Sparc"), (X86, "X86")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) val host: t = case fromString (MLton.Platform.Arch.toString MLton.Platform.Arch.host) of NONE => raise Fail "MLton.Platform.Arch.host: strange arch" | SOME host => host end structure OS = struct datatype t = AIX | Cygwin | Darwin | FreeBSD | HPUX | Hurd | Linux | MinGW | NetBSD | OpenBSD | Solaris val all = [(AIX, "AIX"), (Cygwin, "Cygwin"), (Darwin, "Darwin"), (FreeBSD, "FreeBSD"), (HPUX, "HPUX"), (Hurd, "Hurd"), (Linux, "Linux"), (MinGW, "MinGW"), (NetBSD, "NetBSD"), (OpenBSD, "OpenBSD"), (Solaris, "Solaris")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) val host: t = case fromString (MLton.Platform.OS.toString MLton.Platform.OS.host) of NONE => raise Fail "MLton.Platform.OS.host: strange os" | SOME os => os end end structure ProcEnv = struct type gid = Posix.ProcEnv.gid fun setenv _ = raise Fail "setenv" fun setgroups _ = raise Fail "setgroups" end structure Process = struct type ('stdin, 'stdout, 'stderr) t = unit type input = unit type output = unit type none = unit type chain = unit type any = unit exception MisuseOfForget exception DoublyRedirected structure Child = struct type ('use, 'dir) t = unit val binIn = fn _ => raise Fail "Child.binIn" val binOut = fn _ => raise Fail "Child.binOut" val fd = fn _ => raise Fail "Child.fd" val remember = fn _ => raise Fail "Child.remember" val textIn = fn _ => raise Fail "Child.textIn" val textOut = fn _ => raise Fail "Child.textOut" end structure Param = struct type ('use, 'dir) t = unit val child = fn _ => raise Fail "Param.child" val fd = fn _ => raise Fail "Param.fd" val file = fn _ => raise Fail "Param.file" val forget = fn _ => raise Fail "Param.forget" val null = () val pipe = () val self = () end val create = fn _ => raise Fail "Process.create" val getStderr = fn _ => raise Fail "Process.getStderr" val getStdin = fn _ => raise Fail "Process.getStdin" val getStdout = fn _ => raise Fail "Process.getStdout" val kill = fn _ => raise Fail "Process.kill" val reap = fn _ => raise Fail "Process.reap" type pid = Posix.Process.pid val atExit = OS.Process.atExit fun exit n = let open OS.Process in exit (if n = 0 then success else failure) end fun spawne {path, args, env} = case Posix.Process.fork () of NONE => Posix.Process.exece (path, args, env) | SOME pid => pid fun spawn {path, args} = spawne {path = path, args = args, env = Posix.ProcEnv.environ ()} fun spawnp {file, args} = case Posix.Process.fork () of NONE => Posix.Process.execp (file, args) | SOME pid => pid end structure Profile = struct structure Data = struct type t = unit val equals = fn _ => raise Fail "Profile.Data.equals" val free = fn _ => raise Fail "Profile.Data.free" val malloc = fn _ => raise Fail "Profile.Data.malloc" val write = fn _ => raise Fail "Profile.Data.write" end val isOn = false val withData = fn _ => raise Fail "Profile.withData" end structure Random = MLtonRandom structure Rusage = struct type t = {stime: Time.time, utime: Time.time} fun measureGC _ = () (* Fake it with Posix.ProcEnv.times * and Timer.totalCPUTimer and Timer.checkCPUTimes. *) fun rusage () = let val zero = {utime = Time.zeroTime, stime = Time.zeroTime} in let val {gc = {usr = gcutime, sys = gcstime}, ...} = Timer.checkCPUTimes (Timer.totalCPUTimer ()) val {utime, stime, cutime, cstime, ...} = Posix.ProcEnv.times () in {self = {utime = utime, stime = stime}, children = {utime = cutime, stime = cstime}, gc = {utime = gcutime, stime = gcstime}} end handle Time => {children = zero, gc = zero, self = zero} (* The handle Time is there because of a bug in SML/NJ that * causes a Time exception to be raised on machines with a * large uptime (enough that the number of clock ticks is * >= 2^31). *) end end structure Signal = struct open Posix.Signal type t = signal val prof = alrm val vtalrm = alrm structure Handler = struct type t = unit val default = () val handler = fn _ => () val ignore = () val isDefault = fn _ => raise Fail "Signal.Handler.isDefault" val isIgnore = fn _ => raise Fail "Signal.Handler.isIgnore" fun simple _ = () end structure Mask = struct type t = unit val all = () fun allBut _ = () fun block _ = raise Fail "Signal.Mask.block" fun getBlocked _ = () fun isMember _ = raise Fail "Signal.Mask.isMember" val none = () fun setBlocked _ = raise Fail "Signal.Mask.setBlocked" fun some _ = () fun unblock _ = raise Fail "Signal.Mask.unblock" end fun getHandler _ = raise Fail "Signal.getHandler" fun handled _ = raise Fail "Signal.handled" val restart = ref true fun setHandler _ = raise Fail "Signal.setHandler" fun suspend _ = raise Fail "Signal.suspend" end structure TextIO = MkIO (TextIO) structure Thread = MLtonThread structure Vector = struct open Vector fun create n = let val r = ref (Array.fromList []) val subLim = ref 0 fun sub i = if 0 <= i andalso i < !subLim then Array.sub (!r, i) else raise Subscript val updateLim = ref 0 fun update (i, x) = if 0 <= i andalso i < !updateLim then if i = !updateLim andalso i < n then (r := (Array.tabulate (i + 1, fn j => if i = j then x else Array.sub (!r, j))); subLim := i + 1; updateLim := i + 1) else raise Subscript else Array.update (!r, i, x) val gotIt = ref false fun done () = if !gotIt then raise Fail "already got vector" else if n = !updateLim then (gotIt := true; updateLim := 0; Array.vector (!r)) else raise Fail "vector not full" in {done = done, sub = sub, update = update} end fun unfoldi (n, a, f) = let val r = ref a val v = tabulate (n, fn i => let val (b, a') = f (i, !r) val _ = r := a' in b end) in (v, !r) end end structure Weak = struct type 'a t = 'a val get = SOME fun new x = x end structure World = struct datatype status = Clone | Original fun load _ = raise Fail "World.load" fun save _ = raise Fail "World.save" fun saveThread _ = raise Fail "World.saveThread" end structure Word = MkWord(Word) structure Word8 = MkWord(Word8) end mlton-20210117+dfsg/lib/stubs/mlton-stubs/platform.sig000066400000000000000000000015251416264345000225560ustar00rootroot00000000000000(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PLATFORM = sig structure Arch: sig datatype t = Alpha | AMD64 | ARM | ARM64 | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | RISCV | S390 | Sparc | X86 val fromString: string -> t option val host: t val toString: t -> string end structure OS: sig datatype t = AIX | Cygwin | Darwin | FreeBSD | HPUX | Hurd | Linux | MinGW | NetBSD | OpenBSD | Solaris val fromString: string -> t option val host: t val toString: t -> string end end mlton-20210117+dfsg/lib/stubs/mlton-stubs/proc-env.sig000066400000000000000000000006701416264345000224630ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROC_ENV = sig type gid val setenv: {name: string, value: string} -> unit val setgroups: gid list -> unit end mlton-20210117+dfsg/lib/stubs/mlton-stubs/process.sig000066400000000000000000000056361416264345000224170ustar00rootroot00000000000000(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROCESS = sig type pid (* Process handle *) type ('stdin, 'stdout, 'stderr) t (* is the io 'dir input or output *) type input type output (* to what use can the stdio channel be put *) type none (* it's not connected to a pipe *) type chain (* connect one child to another *) type any (* any use is allowed -- dangerous *) exception MisuseOfForget (* you avoided the type safety and broke it *) exception DoublyRedirected (* you tried to reuse a Param.child *) structure Child: sig type ('use, 'dir) t val binIn: (BinIO.instream, input) t -> BinIO.instream val binOut: (BinIO.outstream, output) t -> BinIO.outstream (* not necessarily available on all systems; may raise an exception *) val fd: (Posix.FileSys.file_desc, 'dir) t -> Posix.FileSys.file_desc (* used for situations where 'forget' was needed for arbitrary redir *) val remember: (any, 'dir) t -> ('use, 'dir) t val textIn: (TextIO.instream, input) t -> TextIO.instream val textOut: (TextIO.outstream, output) t -> TextIO.outstream end structure Param: sig type ('use, 'dir) t (* {child,fd} close their parameter when create is called. * therefore they may only be used once! *) val child: (chain, 'dir) Child.t -> (none, 'dir) t (* Not necessarily available on all systems; may raise an exception *) val fd: Posix.FileSys.file_desc -> (none, 'dir) t val file: string -> (none, 'dir) t (* used if you want to return two posibilities; use with care *) val forget: ('use, 'dir) t -> (any, 'dir) t val null: (none, 'dir) t val pipe: ('use, 'dir) t val self: (none, 'dir) t end val create: {args: string list, env: string list option, path: string, stderr: ('stderr, output) Param.t, stdin: ('stdin, input) Param.t, stdout: ('stdout, output) Param.t} -> ('stdin, 'stdout, 'stderr) t val getStderr: ('stdin, 'stdout, 'stderr) t -> ('stderr, input) Child.t val getStdin: ('stdin, 'stdout, 'stderr) t -> ('stdin, output) Child.t val getStdout: ('stdin, 'stdout, 'stderr) t -> ('stdout, input) Child.t val kill: ('stdin, 'stdout, 'stderr) t * Posix.Signal.signal -> unit val reap: ('stdin, 'stdout, 'stderr) t -> Posix.Process.exit_status val spawn: {args: string list, path: string} -> pid val spawne: {args: string list, env: string list, path: string} -> pid val spawnp: {file: string, args: string list} -> pid end mlton-20210117+dfsg/lib/stubs/mlton-stubs/profile.sig000066400000000000000000000010531416264345000223660ustar00rootroot00000000000000(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROFILE = sig structure Data: sig type t val equals: t * t -> bool val free: t -> unit val malloc: unit -> t val write: t * string -> unit end val isOn: bool (* a compile-time constant *) val withData: Data.t * (unit -> 'a) -> 'a end mlton-20210117+dfsg/lib/stubs/mlton-stubs/random.sig000066400000000000000000000020061416264345000222050ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RANDOM = sig (* Return a random alphanumeric character. *) val alphaNumChar: unit -> char (* Return a string of random alphanumeric characters of specified * length. *) val alphaNumString: int -> string (* Get the next pseudrandom. *) val rand: unit -> word (* Use /dev/random to get a word. Useful as an arg to srand. * Return NONE if /dev/random can't be read. *) val seed: unit -> word option (* Set the seed used by rand. *) val srand: word -> unit (* Use /dev/urandom to get a word. Useful as an arg to srand. * Return NONE if /dev/urandom can't be read. *) val useed: unit -> word option end mlton-20210117+dfsg/lib/stubs/mlton-stubs/random.sml000066400000000000000000000066421416264345000222300ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonRandom: MLTON_RANDOM = struct (* Uses /dev/random and /dev/urandom to get a random word. * If they can't be read from, return NONE. *) local fun make (file, name) = let val buf = Word8Array.array (4, 0w0) in fn () => (let val fd = let open Posix.FileSys in openf (file, O_RDONLY, O.flags []) end fun loop rem = let val n = Posix.IO.readArr (fd, Word8ArraySlice.slice (buf, 4 - rem, SOME rem)) val _ = if n = 0 then (Posix.IO.close fd; raise Fail name) else () val rem = rem - n in if rem = 0 then () else loop rem end val _ = loop 4 val _ = Posix.IO.close fd in SOME (Word.fromLarge (PackWord32Little.subArr (buf, 0))) end handle OS.SysErr _ => NONE) end in val seed = make ("/dev/random", "Random.seed") val useed = make ("/dev/urandom", "Random.useed") end local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end fun srand (w: word): unit = seed := w end local val chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" val numChars = String.size chars val refresh = let val numChars = IntInf.fromInt numChars fun loop (i: IntInf.int, c: int): int = if IntInf.< (i, numChars) then c else loop (IntInf.div (i, numChars), c + 1) in loop (IntInf.pow (2, Word.wordSize), 0) end val r: word ref = ref 0w0 val count: int ref = ref refresh val numChars = Word.fromInt numChars in fun alphaNumChar (): char = let val n = !count val _ = if n = refresh then (r := rand () ; count := 1) else (count := n + 1) val w = !r val c = String.sub (chars, Word.toInt (Word.mod (w, numChars))) val _ = r := Word.div (w, numChars) in c end end fun alphaNumString (length: int): string = CharVector.tabulate (length, fn _ => alphaNumChar ()) end mlton-20210117+dfsg/lib/stubs/mlton-stubs/rusage.sig000066400000000000000000000010121416264345000222070ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RUSAGE = sig type t = {utime: Time.time, (* user time *) stime: Time.time} (* system time *) val measureGC: bool -> unit val rusage: unit -> {children: t, gc: t, self: t} end mlton-20210117+dfsg/lib/stubs/mlton-stubs/signal.sig000066400000000000000000000026541416264345000222130ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SIGNAL = sig type t type signal = t structure Handler: sig type t val default: t val handler: (MLtonThread.Runnable.t -> MLtonThread.Runnable.t) -> t val ignore: t val isDefault: t -> bool val isIgnore: t -> bool val simple: (unit -> unit) -> t end structure Mask: sig type t val all: t val allBut: signal list -> t val block: t -> unit val getBlocked: unit -> t val isMember: t * signal -> bool val none: t val setBlocked: t -> unit val some: signal list -> t val unblock: t -> unit end val getHandler: t -> Handler.t val handled: unit -> Mask.t val prof: t val restart: bool ref val setHandler: t * Handler.t -> unit (* suspend m temporarily sets the signal mask to m and suspends until an * unmasked signal is received and handled, and then resets the mask. *) val suspend: Mask.t -> unit val vtalrm: t end mlton-20210117+dfsg/lib/stubs/mlton-stubs/sources.cm000066400000000000000000000012441416264345000222300ustar00rootroot00000000000000(* Copyright (C) 2009,2013 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature MLTON_THREAD structure MLton is #if (defined (SMLNJ_VERSION)) ../basis-stubs-for-smlnj/sources.cm ../mlton-stubs-for-smlnj/sources.cm #endif io.sig thread.sig thread.sml array.sig bin-io.sig cont.sig exn.sig finalizable.sig gc.sig itimer.sig platform.sig proc-env.sig process.sig profile.sig random.sig rusage.sig signal.sig text-io.sig vector.sig weak.sig word.sig world.sig random.sml mlton.sig mlton.sml mlton-20210117+dfsg/lib/stubs/mlton-stubs/sources.mlb000066400000000000000000000012151416264345000224010ustar00rootroot00000000000000(* Copyright (C) 2009,2013 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local $(SML_LIB)/basis/basis.mlb local $(SML_LIB)/basis/mlton.mlb in structure MLton end io.sig thread.sig thread.sml array.sig bin-io.sig cont.sig exn.sig finalizable.sig gc.sig itimer.sig platform.sig proc-env.sig process.sig profile.sig random.sig rusage.sig signal.sig text-io.sig vector.sig weak.sig word.sig world.sig random.sml mlton.sig mlton.sml in signature MLTON_THREAD structure MLton end mlton-20210117+dfsg/lib/stubs/mlton-stubs/text-io.sig000066400000000000000000000004371416264345000223240ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_TEXT_IO = MLTON_IO mlton-20210117+dfsg/lib/stubs/mlton-stubs/thread.sig000066400000000000000000000034561416264345000222060ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_THREAD = sig structure AtomicState : sig datatype t = NonAtomic | Atomic of int end val atomically: (unit -> 'a) -> 'a val atomicBegin: unit -> unit val atomicEnd: unit -> unit val atomicState: unit -> AtomicState.t structure Runnable : sig type t end type 'a t (* atomicSwitch f * as switch, but assumes an atomic calling context. Upon * switch-ing back to the current thread, an implicit atomicEnd is * performed. *) val atomicSwitch: ('a t -> Runnable.t) -> 'a (* new f * create a new thread that, when run, applies f to * the value given to the thread. f must terminate by * switch-ing to another thread or exiting the process. *) val new: ('a -> unit) -> 'a t (* prepend(t, f) * create a new thread (destroying t in the process) that first * applies f to the value given to the thread and then continues * with t. This is a constant time operation. *) val prepend: 'a t * ('b -> 'a) -> 'b t (* prepare(t, v) * create a new runnable thread (destroying t in the process) * that will evaluate t on v. *) val prepare: 'a t * 'a -> Runnable.t (* switch f * apply f to the current thread to get rt, and then start * running thread rt. It is an error for f to * perform another switch. f is guaranteed to run * atomically. *) val switch: ('a t -> Runnable.t) -> 'a end mlton-20210117+dfsg/lib/stubs/mlton-stubs/thread.sml000066400000000000000000000020011416264345000222000ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure MLtonThread = struct structure AtomicState = struct datatype t = NonAtomic | Atomic of int end val atomicBegin = fn _ => raise Fail "Thread.atomicBegin" val atomicEnd = fn _ => raise Fail "Thread.atomicEnd" val atomically = fn _ => raise Fail "Thread.atomically" val atomicState = fn _ => raise Fail "Thread.atomicState" type 'a t = exn structure Runnable = struct type t = exn end val atomicSwitch = fn _ => raise Fail "Thread.atomicSwitch" val new = fn _ => raise Fail "Thread.new" val prepare = fn _ => raise Fail "Thread.prepare" val prepend = fn _ => raise Fail "Thread.prepend" val switch = fn _ => raise Fail "Thread.switch" end mlton-20210117+dfsg/lib/stubs/mlton-stubs/vector.sig000066400000000000000000000010371416264345000222320ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_VECTOR = sig val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b end mlton-20210117+dfsg/lib/stubs/mlton-stubs/weak.sig000066400000000000000000000004721416264345000216610ustar00rootroot00000000000000(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WEAK = sig type 'a t val get: 'a t -> 'a option val new: 'a -> 'a t end mlton-20210117+dfsg/lib/stubs/mlton-stubs/word.sig000066400000000000000000000006461416264345000217100ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORD = sig type t val bswap: t -> t val rol: t * word -> t val ror: t * word -> t end mlton-20210117+dfsg/lib/stubs/mlton-stubs/world.sig000066400000000000000000000011471416264345000220610ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORLD = sig datatype status = Clone | Original val load: string -> 'a (* Save the world to resume with the current thread. *) val save: string -> status (* Save the world to resume with the given thread. *) val saveThread: string * MLtonThread.Runnable.t -> unit end mlton-20210117+dfsg/man/000077500000000000000000000000001416264345000146015ustar00rootroot00000000000000mlton-20210117+dfsg/man/.gitignore000066400000000000000000000000151416264345000165650ustar00rootroot00000000000000/*.pdf /*.ps mlton-20210117+dfsg/man/Makefile000066400000000000000000000006051416264345000162420ustar00rootroot00000000000000## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: ps ps: mllex.ps mlprof.ps mlton.ps %.pdf: %.ps ps2pdf $< %.ps: %.1 man -t ./$< >$@ .PHONY: clean clean: ../bin/clean mlton-20210117+dfsg/man/mllex.1000066400000000000000000000007401416264345000160050ustar00rootroot00000000000000.TH mllex 1 "January 17, 2021" .SH NAME \fBmllex\fP \- lexer generator for use with Standard ML and MLton .SH SYNOPSIS \fBmllex foo.lex\fR .SH DESCRIPTION .PP \fBmllex\fP takes as input a lexer specification \fBfoo.lex\fP and produces as output in \fBfoo.lex.sml\fP a lexer written in SML. For details on the lexer specification, see \fBA Lexical Analyzer Generator for Standard ML\fP, which is in \fB/usr/share/doc/mlton/mllex.pdf\fP. .SH "SEE ALSO" .BR mlton (1), mlyacc (1) mlton-20210117+dfsg/man/mlnlffigen.1000066400000000000000000000007311416264345000170050ustar00rootroot00000000000000.TH mlnlffigen 1 "January 17, 2021" .SH NAME \fBmlnlffigen\fP \- glue-code generator for use with the new "NLFFI" foreign function interface for Standard ML and MLton .SH SYNOPSIS \fBmlnlffigen [option ...] C-file ...\fR .SH DESCRIPTION .PP \fBmlnlffigen\fP takes as input a C source file and produces as output in \fBNLFFI-Generated\fP the glue-code for Standard ML and in \fBNLFFI-Generated\\nlffi-generated.mlb\fP a ML Basis system file. .SH "SEE ALSO" .BR mlton (1) mlton-20210117+dfsg/man/mlprof.1000066400000000000000000000044271416264345000161710ustar00rootroot00000000000000.TH mlprof 1 "January 17, 2021" .SH NAME \fBmlprof\fP \- display profiling information for a MLton-compiled executable .SH SYNOPSIS \fBmlprof \fI[option ...] a.out [mlmon.out ...]\fR .SH DESCRIPTION .PP \fBmlprof\fP extracts information from an executable compiled by \fBMLton\fP with \fB-profile alloc\fP or \fB-profile time\fP and the resulting \fBmlmon.out\fP file produced by running the executable. The output of \fBmlprof\fP consists of an initial line indicating the total amount of CPU time or bytes allocated. After this, source functions are listed along with the percentage of this total that they used, in decreasing order. If the program was compiled with \fB-profile-stack true\fP, \fBmlprof\fP will display the time spent or bytes allocated while the function was on the stack and in GC in addition to the time or bytes that the function is directly responsible for. With multiple \fBmlmon.out\fP files, \fBmlprof\fP will sum the profiling information. .SH OPTIONS .TP \fB-call-graph \fIfile\fP Write a call graph containing the table data to a dot file. See the \fBMLton User Guide\fP for details. .TP \fB-graph-title \fIstring\fP Set the call-graph title. .TP \fB-gray \fI{\fBfalse\fP|\fBtrue\fP}\fP Gray call-graph nodes according to stack %. This only makes sense if the executable was compiled \fB-profile-stack true\fP. .TP \fB-keep \fIexp\fP Only show functions specified by \fIexp\fP. For details on the allowed expressions, see the \fBMLton User Guide\fP. Multiple \fB-keep\fP expressions are not allowed. .TP \fB-mlmon \fIfile\fP Process the list of whitespace-separated \fBmlmon.out\fP files found in the specified file. .TP \fB-raw \fI{\fBfalse\fP|\fBtrue\fP}\fP Show the raw counts in addition to the percentages. .TP \fB-show-line \fI{\fBfalse\fP|\fBtrue\fP}\fP Show the file and line for each function. .TP \fB-split \fIregexp\fP Treat duplicates of functions whose name matches \fIregexp\fP as different functions. .TP \fB-thresh \fIx\fP An abbreviation for \fB-keep '(thresh x)'\fP, which only prints information about functions whose percentage is greater than or equal to \fBx\fP, where 0 <= \fBx\fP <= 100.0. .TP \fB-tolerant \fI{\fBfalse\fP|\fBtrue\fP}\fP Print a warning about broken \fBmlmon.out\fP files, but do not exit. .SH "SEE ALSO" .BR mlton (1) and the \fBMLton Guide\fP. mlton-20210117+dfsg/man/mlton.1000066400000000000000000000344031416264345000160200ustar00rootroot00000000000000.TH mlton 1 "January 17, 2021" .SH NAME \fBmlton\fP \- whole-program compiler for the Standard ML (SML) programming language .SH SYNOPSIS \fBmlton\fP \fI[option ...] file\fB.\fP{\fBc\fP|\fBmlb\fP|\fBo\fP|\fBsml\fP} [file\fB.\fP{\fBc\fP|\fBo\fP|\fBs\fP|\fBS\fP} ...]\fR .SH DESCRIPTION .PP \fBMLton\fP is run from the command line with a collection of options followed by a file name and a list of files with which to compile, assemble, and link with. The simplest case is to run \fBmlton foo.sml\fP, where \fBfoo.sml\fP contains a valid SML program, in which case MLton compiles the program to produce an executable \fBfoo\fP. Since \fBMLton\fP does not support separate compilation, the program must be the entire program you wish to compile. However, the program may refer to signatures and structures defined in the Basis Library. Larger programs, spanning many files, may be compiled with the ML Basis system. In this case, \fBmlton foo.mlb\fP will compile the complete SML program described by the basis \fBfoo.mlb\fP, which may specify both SML files and additional bases. See the \fBMLton Guide\fP for details. \fBMLton\fP's compile-time options control the name of the output file, the verbosity of compile-time messages, and whether or not certain optimizations are performed. They also can specify which intermediate files are saved and can stop the compilation process early, at some intermediate pass, in which case compilation can be resumed by passing the generated files to \fBMLton\fP. \fBMLton\fP uses the input file suffix to determine the type of input program. The possibilities are \fB.c\fP, \fB.mlb\fP, \fB.o\fP, \fB.s\fP, and \fB.sml\fP. With no arguments, \fBMLton\fP prints the version number and exits. For a usage message, run \fBMLton\fP with an invalid switch, e.g. \fBmlton \-z\fP. In the explanation below and in the usage message, for flags that take a number of choices (e.g. \fI{\fBtrue\fP|\fBfalse\fP}\fR), the first value listed is the default. .SH Compile-time options .TP \fB\-align \fIn\fP\fR Aligns objects in memory by the specified alignment (\fB4\fP or \fB8\fP). The default varies depending on architecture. .TP \fB\-as\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when compiling assembler code. If you wish to pass an option to the assembler, you must use \fBgcc\fP's \fB\-Wa,\fP syntax. .TP \fB\-cc\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when compiling C code. .TP \fB\-codegen \fI{\fBnative\fP|\fBx86\fP|\fBamd64\fP|\fBc\fP|\fBllvm\fP}\fP\fR Generate native object code via amd64 assembly, C code, LLVM code, or x86 assembly. With \fB\-codegen native\fP (\fB\-codegen amd64\fP or \fB\-codegen x86\fP), \fBMLton\fP typically compiles more quickly and generates better code. .TP \fB\-const '\fIname value\fP'\fR Set the value of a compile-time constant. Here is a list of available constants, their default values, and what they control. \fBExn.keepHistory \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR .in +.5i Enable \fBMLton.Exn.history\fP. There is a performance cost to setting this to \fBtrue\fP, both in memory usage of exceptions and in run time, because of additional work that must be performed at each exception construction, raise, and handle. .in -.5i .TP \fB\-default\-ann \fIann\fP\fR Specify default ML Basis annotations. For example, \fB\-default\-ann 'warnUnused true'\fP causes unused variable warnings to be enabled by default. Defaults may be overridden by an annotation in an ML Basis file. .TP \fB\-default\-type \fItype\fP\fR Specify the default binding for a primitive type. For example, \fB\-default\-type word64\fP causes the top-level type \fBword\fP and the top-level structure \fBWord\fP in the Basis Library to be equal to \fBWord64.word\fP and \fBWord64:WORD\fP, respectively. Similarly, \fB\-default\-type intinf\fP causes the top-level type \fBint\fP and the top-level structure \fBInt\fP in the Basis Library to be equal to \fBIntInf.int\fP and \fBIntInf:INTEGER\fP, respectively. .TP \fB\-disable\-ann \fIann\fP\fR Ignore the specified ML Basis annotation in every ML Basis File. For example, to see \fIall\fP match and unused warnings, compile with \fB\-default\-ann 'warnUnused true'\fP, \fB\-disable\-ann forceUsed\fP, \fB\-disable\-ann nonexhaustiveMatch\fP, \fB\-disable\-ann redundantMatch\fP, and \fB\-disable\-ann warnUnused\fP. .TP \fB\-export\-header \fIfile\fP\fR Write C prototypes to \fIfile\fP for all of the functions in the program exported from SML to C. .TP \fB\-ieee\-fp \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR Cause the x86 native code generator to be pedantic about following the IEEE floating point standard. By default, it is not, because of the performance cost. This only has an effect with \fB\-codegen x86\fP. .TP \fB\-inline \fIn\fP\fR Set the inlining threshold used in the optimizer. The threshold is an approximate measure of code size of a procedure. The default is 320. .TP \fB\-keep \fI{\fBg\fP|\fBo\fP}\fP\fR Save intermediate files. If no \fB\-keep\fP argument is given, then only the output file is saved. .in +.5i \fBg\fP generated \fB.c\fP and \fB.s\fP files passed to \fBgcc\fP and generated \fB.ll\fP files passed to \fBllvm-as\fP .br \fBo\fP object (\fB.o\fP) files .in -.5i .TP \fB\-link\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when linking. You can use this to specify library search paths, e.g. \fB\-link\-opt \-Lpath\fP, and libraries to link with, e.g. \fB\-link\-opt \-lfoo\fP, or even both at the same time, e.g. \fB\-link\-opt '\-Lpath \-lfoo'\fP. If you wish to pass an option to the linker, you must use \fBgcc\fP's \fB\-Wl,\fP syntax, e.g., \fB\-link\-opt '\-Wl,\-\-export\-dynamic'\fP. .TP \fB\-llvm\-as\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBllvm-as\fP when assembling (\fB.ll\fP to \fB.bc\fP) LLVM code. .TP \fB\-llvm\-llc\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBllc\fP when compiling (\fB.bc\fP to \fB.o\fP) LLVM code. .TP \fB\-llvm\-opt\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBopt\fP when optimizing (\fB.bc\fP to \fB.bc\fP) LLVM code. .TP \fB\-mlb\-path\-map \fIfile\fP\fR Use \fIfile\fP as an ML Basis path map to define additional MLB path variables. Multiple uses of \fB\-mlb\-path\-map\fP and \fB\-mlb\-path\-var\fP are allowed, with variable definitions in later path maps taking precedence over earlier ones. .TP \fB\-mlb\-path\-var '\fIname value\fP'\fR Define an additional MLB path variable. Multiple uses of \fB\-mlb\-path\-map\fP and \fB\-mlb\-path\-var\fP are allowed, with variable definitions in later path maps taking precedence over earlier ones. .TP \fB\-output \fIfile\fP\fR Specify the name of the final output file. The default name is the input file name with its suffix removed and an appropriate, possibly empty, suffix added. .TP \fB\-profile \fI{\fBno\fP|\fBalloc\fP|\fBcount\fP|\fBtime\fP}\fP\fR Produce an executable that gathers profiling data. When such an executable is run, it will produce an \fBmlmon.out\fP file. The man page on \fBmlprof\fP describes how to extract information from this file. .TP \fB\-profile\-branch \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will separately gather profiling data for each branch of a function definition, \fBcase\fP expression, and \fBif\fP expression. .TP \fB\-profile\-stack \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will gather profiling data for all functions on the stack, not just the currently executing function. .TP \fB\-profile\-val \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will separately gather profiling data for each (expansive) \fBval\fP declaration. .TP \fB\-runtime \fIarg\fP\fR Pass argument to the runtime system via \fB@MLton\fP. The argument will be processed before other \fB@MLton\fP command line switches. Multiple uses of \fB\-runtime\fP are allowed, and will pass all the arguments in order. If the same runtime switch occurs more than once, then the last setting will take effect. There is no need to supply the leading \fB@MLton\fP or the trailing \fB\-\-\fP; these will be supplied automatically. An argument to \fB\-runtime\fP may contain spaces, which will cause the argument to be treated as a sequence of words by the runtime. For example, the command line: .in +.5i \fBmlton \-runtime 'ram\-slop 0.4' foo.sml\fP .in -.5i will cause foo to run as if it had been called like .in +.5i \fBfoo @MLton ram\-slop 0.4 \-\-\fP .in -.5i An executable created with \fB\-runtime stop\fP doesn't process any \fB@MLton\fP arguments. This is useful to create an executable, e.g. \fBecho\fP, that must treat \fB@MLton\fP like any other command-line argument. .in +.5i \fB% mlton \-runtime stop echo.sml\fP .in -.5i .in +.5i \fB% echo @MLton \-\-\fP .in -.5i .in +.5i \fB@MLton \-\-\fP .in -.5i .TP \fB\-show\-basis \fIfile\fP\fR Pretty print to \fIfile\fP the basis defined by the input program. .TP \fB\-show\-def\-use \fIfile\fP\fR Output def-use information to \fIfile\fP. Each identifier that is defined appears on a line, followed on subsequent lines by the position of each use. .TP \fB\-stop \fI{\fBf\fP|\fBg\fP|\fBo\fP|\fBtc\fP}\fP\fR Specify when to stop. .in +.5i \fBf\fP list of files on stdout (only makes sense when input is \fBfoo.mlb\fP) .br \fBg\fP generated \fB.c\fP and \fB.s\fP files .br \fBo\fP object (\fB.o\fP) files .br \fBtc\fP after type checking .in -.5i If you compile \fB\-stop g\fP or \fB\-stop o\fP, you can resume compilation by running \fBMLton\fP on the generated \fB.c\fP and \fB.s\fP or \fB.o\fP files. .TP \fB\-target \fI{\fBself\fP|...}\fP\fR Generate an executable that runs on the specified platform. The default is \fBself\fP, which means to compile for the machine that \fBMLton\fP is running on. To use any other target, you must first install a cross compiler. See the \fBMLton Guide\fP for details. .TP \fB\-target\-as\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-as\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when assembling, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. .TP \fB\-target\-cc\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-cc\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when compiling C code, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. .TP \fB\-target\-link\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-link\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when linking, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. .TP \fB\-verbose \fI{\fB0\fP|\fB1\fP|\fB2\fP|\fB3\fP}\fP\fR How verbose to be about what passes are running. The default is 0. .in +.5i \fB0\fP silent .br \fB1\fP calls to compiler, assembler, and linker .br \fB2\fP 1, plus intermediate compiler passes .br \fB3\fP 2, plus some data structure sizes .in -.5i .SH Runtime system options Executables produced by \fBMLton\fP take command line arguments that control the runtime system. These arguments are optional, and occur before the executable's usual arguments. To use these options, the first argument to the executable must be \fB@MLton\fP. The optional arguments then follow, must be terminated by \fB\-\-\fP, and are followed by any arguments to the program. The optional arguments are \fInot\fP made available to the SML program via \fBCommandLine.arguments\fP. For example, a valid call to \fBhello-world\fP is: .in +.5i \fBhello-world @MLton gc\-summary fixed\-heap 10k \-\- a b c\fP .in -.5i In the above example, \fBCommandLine.arguments () = ["a", "b", "c"]\fP. It is allowed to have a sequence of \fB@MLton\fP arguments, as in: .in +.5i \fBhello-world @MLton gc\-summary \-\- @MLton fixed\-heap 10k \-\- a b c\fP .in -.5i Run-time options can also control \fBMLton\fP, as in .in +.5i \fBmlton @MLton fixed\-heap 0.5g \-\- foo.sml\fP .in -.5i .TP \fBfixed\-heap \fIx{\fBk\fP|\fBK\fP|\fBm\fP|\fBM\fP|\fBg\fP|\fBG\fP}\fP\fR Use a fixed size heap of size \fIx\fP, where \fIx\fP is a real number and the trailing letter indicates its units. .in +.5i \fBk\fP or \fBK\fP 1024 .br \fPm\fP or \fBM\fP 1,048,576 .br \fBg\fP or \fBG\fP 1,073,741,824 .in -.5i A value of \fB0\fP means to use almost all the RAM present on the machine. The heap size used by \fBfixed\-heap\fP includes all memory allocated by SML code, including memory for the stack (or stacks, if there are multiple threads). It does not, however, include any memory used for code itself or memory used by C globals, the C stack, or malloc. .TP \fBgc\-messages\fP Print a message at the start and end of every garbage collection. .TP \fBgc\-summary\fP Print a summary of garbage collection statistics upon program termination. .TP \fBgc\-summary\-file \fIfile\fP\fP Print a summary of garbage collection statistics upon program termination to the file specified by \fIfile\fP. .TP \fBload\-world \fIworld\fP\fR Restart the computation with the file specified by \fIworld\fP, which must have been created by a call to \fBMLton.World.save\fP by the same executable. See the \fBMLton Guide\fP for details. .TP \fBmax\-heap \fIx{\fBk\fP|\fBK\fP|\fBm\fP|\fBM\fP|\fBg\fP|\fBG\fP}\fP\fR Run the computation with an automatically resized heap that is never larger than \fIx\fP, where \fIx\fP is a real number and the trailing letter indicates the units as with \fBfixed\-heap\fP. The heap size for \fBmax\-heap\fP is accounted for as with \fBfixed\-heap\fP. .TP \fBmay\-page\-heap \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR Enable paging the heap to disk when unable to grow the heap to a desired size. .TP \fBno\-load\-world\fP Disable \fBload\-world\fP. This can be used as an argument to the compiler via \fB\-runtime no\-load\-world\fP to create executables that will not load a world. This may be useful to ensure that set-uid executables do not load some strange world. .TP \fBram\-slop \fIx\fP\fR Multiply \fBx\fP by the amount of RAM on the machine to obtain what the runtime views as the amount of RAM it can use. Typically \fBx\fP is less than 1, and is used to account for space used by other programs running on the same machine. .TP \fBstop\fP Causes the runtime to stop processing \fB@MLton\fP arguments once the next \fB\-\-\fP is reached. This can be used as an argument to the compiler via \fB\-runtime stop\fP to create executables that don't process any \fB@MLton\fP arguments. .SH DIAGNOSTICS MLton's type error messages are not in a form suitable for processing by Emacs. For details on how to fix this, see http://mlton.org/Emacs. .SH "SEE ALSO" .BR mlprof (1) and the \fBMLton Guide\fP. mlton-20210117+dfsg/man/mlyacc.1000066400000000000000000000007531416264345000161400ustar00rootroot00000000000000.TH mlyacc 1 "January 17, 2021" .SH NAME \fBmlyacc\fP \- parser generator for use with Standard ML and MLton .SH SYNOPSIS \fBmlyacc foo.grm\fR .SH DESCRIPTION .PP \fBmlyacc\fP takes as input a parser specification \fBfoo.grm\fP and produces as output in \fBfoo.grm.sig\fP and \fBfoo.grm.sml\fP a parser written in SML. For details on the parser specification, see the \fBML-Yacc User's Manual\fP, which is in \fB/usr/share/doc/mlton/mlyacc.pdf\fP. .SH "SEE ALSO" .BR mllex (1), mlton (1) mlton-20210117+dfsg/mllex/000077500000000000000000000000001416264345000151475ustar00rootroot00000000000000mlton-20210117+dfsg/mllex/.gitignore000066400000000000000000000000731416264345000171370ustar00rootroot00000000000000/ml.lex /ml.lex.sml /mllex /mllex.exe /mllex.pdf /mllex.ps mlton-20210117+dfsg/mllex/Makefile000066400000000000000000000021101416264345000166010ustar00rootroot00000000000000## Copyright (C) 2009,2013,2018-2020 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### NAME := mllex all: $(NAME) $(NAME): $(NAME).mlb $(shell "$(RUN_MLTON_DEPS)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(RUN_MLTON)" @MLton $(RUN_MLTON_RUNTIME_ARGS) -- $(RUN_MLTON_COMPILE_ARGS) -target $(TARGET) $(NAME).mlb .PHONY: clean clean: $(SRC)/bin/clean PDFLATEX := pdflatex doc/mllex.pdf: $(MAKE) -C doc mllex.pdf mllex.pdf: doc/mllex.pdf $(CP) doc/mllex.pdf mllex.pdf DOCS := ifneq ($(shell which $(PDFLATEX) 2> /dev/null),) DOCS += mllex.pdf endif .PHONY: docs docs: $(DOCS) .PHONY: test test: $(NAME) $(CP) ../mlton/front-end/ml.lex . \ $(NAME) ml.lex && \ $(DIFF) ml.lex.sml ../mlton/front-end/ml.lex.sml \ $(RM) ml.lex ml.lex.sml mlton-20210117+dfsg/mllex/README000066400000000000000000000020671416264345000160340ustar00rootroot00000000000000 Lexical analyzer generator for Standard ML. Version 1.6, October 1994 Copyright (c) 1989-92 by Andrew W. Appel, James S. Mattson, David R. Tarditi This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Files of interest: lexgen.doc - User's manual for ML-Lex lexgen.sml - ML version of Lex export-lex.sml - implements an exportable (via SMLofNJ.exportFn) toplevel driver for ML-Lex; the resulting stand-alone program takes the specification file name as a command line argument ml-lex.cm - CM description file for ML-Lex build - script that invokes ../../bin/ml-build in order to construct the stand-alone version of ML-Lex mlton-20210117+dfsg/mllex/README.MLton000066400000000000000000000006301416264345000170560ustar00rootroot00000000000000This is a modified version of the ml-lex directory that comes with SML/NJ. Files from SML/NJ: INSTALL -- deleted README build -- deleted build.bat -- deleted export-lex.sml -- deleted lexgen.doc lexgen.sml -- modified lexgen.tex -- modified ml-lex.cm -- deleted mlex_int.doc tool/* -- deleted Files added: Makefile README.MLton call-main.sml macros.hva main.sml mllex.mlb mlton-20210117+dfsg/mllex/call-main.sml000066400000000000000000000004201416264345000175150ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20210117+dfsg/mllex/doc/000077500000000000000000000000001416264345000157145ustar00rootroot00000000000000mlton-20210117+dfsg/mllex/doc/.gitignore000066400000000000000000000002101416264345000176750ustar00rootroot00000000000000/ml-lex.aux /ml-lex.dvi /ml-lex.log /ml-lex.pdf /ml-lex.ps /ml-lex.toc /mllex.aux /mllex.dvi /mllex.log /mllex.pdf /mllex.ps /mllex.toc mlton-20210117+dfsg/mllex/doc/Makefile000066400000000000000000000004441416264345000173560ustar00rootroot00000000000000## Copyright (C) 2020 Matthew Fluet # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## PDFLATEX := pdflatex ml-lex.pdf: ml-lex.tex $(PDFLATEX) ml-lex.tex $(PDFLATEX) ml-lex.tex $(PDFLATEX) ml-lex.tex .PHONY: clean clean: ../../bin/clean mlton-20210117+dfsg/mllex/doc/lexgen.doc000066400000000000000000000516761416264345000177040ustar00rootroot00000000000000 A lexical analyzer generator for Standard ML. THIS TEXT FILE IS OBSOLETE and IS NOT MAINTAINED. The current (maintained) documentation is in lexgen.tex. Andrew W. Appel James S. Mattson David R. Tarditi Princeton University Version 1.6, October 1994 Copyright (c) 1989-1992 by Andrew W. Appel, James S. Mattson, David R. Tarditi This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. I. General Description Computer programs often need to divide their input into words and distinguish between different kinds of words. Compilers, for example, need to distinguish between integers, reserved words, and identifiers. Applications programs often need to be able to recognize components of typed commands from users. The problem of segmenting input into words and recognizing classes of words is known as lexical analysis. Small cases of this problem, such as reading text strings separated by spaces, can be solved by using hand-written programs. Larger cases of this problem, such as tokenizing an input stream for a compiler, can also be solved using hand-written programs. A hand-written program for a large lexical analysis problem, however, suffers from two major problems. First, the program requires a fair amount of programmer time to create. Second, the description of classes of words is not explicit in the program. It must be inferred from the program code. This makes it difficult to verify if the program recognizes the correct words for each class. It also makes future maintenance of the program difficult. Lex, a programming tool for the Unix system, is a successful solution to the general problem of lexical analysis. It uses regular expressions to describe classes of words. A program fragment is associated with each class of words. This information is given to Lex as a specification (a Lex program). Lex produces a program for a function that can be used to perform lexical analysis. The function operates as follows. It finds the longest word starting from the current position in the input stream that is in one of the word classes. It executes the program fragment associated with the class, and sets the current position in the input stream to be the character after the word. The program fragment has the actual text of the word available to it, and may be any piece of code. For many applications it returns some kind of value. Lex allows the programmer to make the language description explicit, and to concentrate on what to do with the recognized words, not how to recognize the words. It saves programmer time and increases program maintainability. Unfortunately, Lex is targeted only C. It also places artificial limits on the size of strings that can be recognized. ML-Lex is a variant of Lex for the ML programming language. ML-Lex has a syntax similar to Lex, and produces an ML program instead of a C program. ML-Lex produces a program that runs very efficiently. Typically the program will be as fast or even faster than a hand-coded lexer implemented in Standard ML. The program typically uses only a small amount of space. ML-Lex thus allows ML programmers the same benefits that Lex allows C programmers. It also does not place artificial limits on the size of recognized strings. II. ML-Lex specifications An ML-Lex specification has the general format: {user declarations} %% {ML-Lex definitions} %% {rules} Each section is separated from the others by a '%%' delimiter. The rules are used to define the lexical analysis function. Each rule has two parts - a regular expression and an action. The regular expression defines the word class that a rule matches. The action is a program fragment to be executed when a rule matches the input. The actions are used to compute values, and must all return values of the same type. The user can define values available to all rule actions in the user declarations section. The user must define two values in this section - a type lexresult and a function eof. Lexresult defines the type of values returned by the rule actions. The function "eof" is called by the lexer when the end of the input stream is reached. It will typically return a value signalling eof or raise an exception. It is called with the same argument as lex (see %arg, below), and must return a value of type lexresult. In the definitions section, the user can define named regular expressions, a set of start states, and specify which of the various bells and whistles of ML-Lex are desired. The start states allow the user to control when certain rules are matched. Rules may be defined to match only when the lexer is in specific start states. The user may change the lexer's start state in a rule action. This allows the user to specify special handling of lexical objects. This feature is typically used to handle quoted strings with escapes to denote special characters. The rules to recognize the inside contents of a string are defined for only one start state. This start state is entered when the beginning of a string is recognized, and exited when the end of the string is recognized. III. Regular expressions. Regular expressions are a simple language for denoting classes of strings. A regular expression is defined inductively over an alphabet with a set of basic operations. The alphabet for ML-Lex is the Ascii character set (character codes 0-127; or if %full is used, 0-255). The syntax and semantics of regular expressions will be described in order of decreasing precedence (from the most tightly-binding operators to the most weakly-binding): An individual character stands for itself, except for the reserved characters ? * + | ( ) ^ $ / ; . = < > [ { " \ A backslash followed by one of the reserved characters stands for that character. A set of characters enclosed in square brackets [ ] stands for any one of those characters. Inside the brackets, only the symbols \ - ^ are reserved. An initial up-arrow ^ stands for the complement of the characters listed, e.g. [^abc] stands any character except a, b, or c. The hyphen - denotes a range of characters, e.g. [a-z] stands for any lower-case alphabetic character, and [0-9a-fA-F] stands for any hexadecimal digit. To include ^ literally in a bracketed set, put it anywhere but first; to include - literally in a set, put it first or last. The dot . character stands for any character except newline, i.e. the same as [^\n] The following special escape sequences are available, inside or outside of square-brackets: \b - backspace \n - newline \t - tab \h - stands for all characters with codes >127, when 7-bit characters are used. \ddd - where ddd is a 3 digit decimal escape. A sequence of characters will stand for itself (reserved characters will be taken literally) if it is enclosed in double quotes " ". A named regular expression (defined in the "definitions" section) may be referred to by enclosing its name in braces { }. Any regular expression may be enclosed in parentheses ( ) for syntactic (but, as usual, not semantic) effect. The postfix operator * stands for Kleene closure: zero or more repetitions of the preceding expression. The postfix operator + stands for one or more repetitions of the preceding expression. The postfix operator ? stands for zero or one occurrence of the preceding expression. A postfix repetition range {n1,n2} where n1 and n2 are small integers stands for any number of repetitions between n1 and n2 of the preceding expression. The notation {n1} stands for exactly n1 repetitions. Concatenation of expressions denotes concatenation of strings. The expression e1 e2 stands for any string that results from the concatenation of one string that matches e1 with another string that matches e2. The infix operator | stands for alternation. The expression e1 | e2 stands for anything that either e1 or e2 stands for. The infix operator / denotes lookahead. Lookahead is not implemented and cannot be used, because there is a bug in the algorithm for generating lexers with lookahead. If it could be used, the expression e1 / e2 would match any string that e1 stands for, but only when that string is followed by a string that matches e2. When the up-arrow ^ occurs at the beginning of an expression, that expression will only match strings that occur at the beginning of a line (right after a newline character). The dollar sign $ is not implemented, since it is an abbreviation for lookahead involving the newline character (that is, it is an abbreviation /\n). If it could be used, when the dollar sign $ occurred at the end of an expression, that expression would only match strings that occur at the end of a line (right before a newline character). Here are some examples of regular expressions, and descriptions of the set of strings they denote: 0 | 1 | 2 | 3 A single digit between 0 and 3 [0123] A single digit between 0 and 3 0123 The string "0123" 0* All strings of 0 or more 0's 00* All strings of 1 or more 0's 0+ All strings of 1 or more 0's [0-9]{3} Any three-digit decimal number. \\[ntb] The strings "\n" "\t" "\b" (00)* Any string with an even number of 0's. IV. ML-Lex syntax summary A. User declarations Anything up to the first %% is in the user declarations section. The user should note that no symbolic identifier containing '%%' can be used in this section. B. ML-Lex definitions Start states can be defined with %s {identifier list} ; or %S {identifier list} ; An identifier list consists of one or more identifiers. An identifier consists of one or more letters, digits, underscores, or primes. It must begin with a letter. Named expressions can be defined with {identifier} = {regular expression} ; Regular expressions are defined below. The following % commands are also available: %reject - create REJECT() function %count - count newlines using yylineno %full - create lexer for the full 8-bit character set, with characters in the range 0-255 permitted as input. %structure {identifier} - name the structure in the output program {identifier} instead of Mlex %header - use code following it to create header for lexer structure %arg - extra (curried) formal parameter argument to be passed to the lex functions, and to be passed to the eof function in place of () These functions are discussed below, under values available to actions. C. Rules Each rule has the format: {regular expression} => ( ... code ... ); All parentheses in ... code ... must be balanced, including those used in strings and comments. The start state list is optional. It consists of a list of identifiers separated by commas, and is delimited by triangle brackets < >. Each identifier must be a start state defined in the %s section above. The regular expression is only recognized when the lexer is in one of the start states in the start state list. If no start state list is given, the expression is recognized in all start states. The lexer begins in a pre-defined start state called INITIAL. The lexer resolves conflicts among rules by choosing the rule with the longest match, and in the case two rules match the same string, choosing the rule listed first in the specification. The rules should match all possible input. If some input occurs that does not match any rule, the lexer created by ML-Lex will raise an exception LexError. Note that this differs from C Lex, which prints any unmatched input on the standard output. V. Values available inside the code associated with a rule. Mlex places the value of the string matched by a regular expression in yytext, a string variable. The user may recursively call the lexing function with lex(). (If %arg is used, the lexing function may be re-invoked with the same argument by using continue().) This is convenient for ignoring white space or comments silently: [\ \t\n]+ => ( lex()); To switch start states, the user may call YYBEGIN with the name of a start state. The following values will be available only if the corresponding % command is in the ML-Lex definitions sections: value %command description ----- -------- ----------- REJECT %reject REJECT() causes the current rule to be "rejected." The lexer behaves as if the current rule had not matched; another rule that matches this string, or that matches the longest possible prefix of this string, is used instead. yypos Current character position from beginning of file. yylineno %count Current line number These values should be used only if necessary. Adding REJECT to a lexer will slow it down by 20%; adding yylineno will slow it down by another 20%, or more. (It is much more efficient to recognize \n and have an action that increments the line-number variable.) The use of the lookahead operator / will also slow down the entire lexer. The character-position, yypos, is not costly to maintain, however. VI. Running ML-Lex From the Unix shell, run sml-lex myfile.lex The output file will be myfile.lex.sml. The extension ".lex" is not required but is recommended. Within an interactive system [not the preferred method]: Use "lexgen.sml"; this will create a structure LexGen. The function LexGen.lexGen creates a program for a lexer from an input specification. It takes a string argument -- the name of the file containing the input specification. The output file name is determined by appending ".sml" to the input file name. VII. Using the program produced by ML-Lex. When the output file is loaded, it will create a structure Mlex that contains the function makeLexer. makeLexer takes a function from int -> string and returns a lexing function. For example, val lexer = Mlex.makeLexer (inputc (open_in "f")) creates a lexer that operates on the file whose name is f. The function from int -> string should read a string of characters from the input stream. It should return a null string to indicate that the end of the stream has been reached. The integer is the number of characters that the lexer wishes to read; the function may return any non-zero number of characters. For example, val lexer = let val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end in Mlex.makeLexer (fn n => input_line std_in) end is appropriate for interactive streams where prompting, etc. occurs; the lexer won't care that input_line might return a string of more than or less than n characters. The lexer tries to read a large number of characters from the input function at once, and it is desirable that the input function return as many as possible. Reading many characters at once makes the lexer more efficient. Fewer input calls and buffering operations are needed, and input is more efficient in large block reads. For interactive streams this is less of a concern, as the limiting factor is the speed at which the user can type. To obtain a value, invoke the lexer by passing it a unit: val nextToken = lexer() If one wanted to restart the lexer, one would just discard "lexer" and create a new lexer on the same stream with another call to makeLexer. This is the best way to discard any characters buffered internally by the lexer. All code in the user declarations section is placed inside a structure UserDeclarations. To access this structure, use the path name Mlex.UserDeclarations. If any input cannot be matched, the program will raise the exception Mlex.LexError. An internal error (i.e. bug) will cause the exception Internal.LexerError to be raised. If %structure is used, remember that the structure name will no longer be Mlex, but the one specified in the command. VIII. Sample Here is a sample lexer for a calculator program: datatype lexresult= DIV | EOF | EOS | ID of string | LPAREN | NUM of int | PLUS | PRINT | RPAREN | SUB | TIMES val linenum = ref 1 val error = fn x => output(std_out,x ^ "\n") val eof = fn () => EOF %% %structure CalcLex alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (inc linenum; lex()); {ws}+ => (lex()); "/" => (DIV); ";" => (EOS); "(" => (LPAREN); {digit}+ => (NUM (revfold (fn(a,r)=>ord(a)-ord("0")+10*r) (explode yytext) 0)); ")" => (RPAREN); "+" => (PLUS); {alpha}+ => (if yytext="print" then PRINT else ID yytext); "-" => (SUB); "*" => (TIMES); . => (error ("calc: ignoring bad character "^yytext); lex()); Here is the parser for the calculator: (* Sample interactive calculator to demonstrate use of lexer produced by ML-Lex The original grammar was stmt_list -> stmt_list stmt stmt -> print exp ; | exp ; exp -> exp + t | exp - t | t t -> t * f | t/f | f f -> (exp) | id | num The function parse takes a stream and parses it for the calculator program. If a syntax error occurs, parse prints an error message and calls itself on the stream. On this system that has the effect of ignoring all input to the end of a line. *) structure Calc = struct open CalcLex open UserDeclarations exception Error fun parse strm = let val say = fn s => output(std_out,s) val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end val lexer = makeLexer (fn n => input_line strm) val nexttok = ref (lexer()) val advance = fn () => (nexttok := lexer(); !nexttok) val error = fn () => (say ("calc: syntax error on line" ^ (makestring(!linenum)) ^ "\n"); raise Error) val lookup = fn i => if i = "ONE" then 1 else if i = "TWO" then 2 else (say ("calc: unknown identifier '" ^ i ^ "'\n"); raise Error) fun STMT_LIST () = case !nexttok of EOF => () | _ => (STMT(); STMT_LIST()) and STMT() = (case !nexttok of EOS => () | PRINT => (advance(); say ((makestring (E():int)) ^ "\n"); ()) | _ => (E(); ()); case !nexttok of EOS => (advance()) | _ => error()) and E () = E' (T()) and E' (i : int ) = case !nexttok of PLUS => (advance (); E'(i+T())) | SUB => (advance (); E'(i-T())) | RPAREN => i | EOF => i | EOS => i | _ => error() and T () = T'(F()) and T' i = case !nexttok of PLUS => i | SUB => i | TIMES => (advance(); T'(i*F())) | DIV => (advance (); T'(i div F())) | EOF => i | EOS => i | RPAREN => i | _ => error() and F () = case !nexttok of ID i => (advance(); lookup i) | LPAREN => let val v = (advance(); E()) in if !nexttok = RPAREN then (advance (); v) else error() end | NUM i => (advance(); i) | _ => error() in STMT_LIST () handle Error => parse strm end end mlton-20210117+dfsg/mllex/doc/ml-lex.tex000066400000000000000000000565371416264345000176540ustar00rootroot00000000000000% Modified by Matthew Fluet on 2007-11-07. % Add %posint command. % % Modified by Matthew Fluet on 2007-10-31. % Add \r escape sequence (from Florian Weimer). % Fix TeX formatting bug (from Florian Weimer). % \documentstyle{article} \title{ A lexical analyzer generator for Standard ML.\\ Version 1.6.0, October 1994 } \author{ Andrew W. Appel$^1$\\ James S. Mattson\\ David R. Tarditi$^2$\\ \\ \small $^1$Department of Computer Science, Princeton University \\ \small $^2$School of Computer Science, Carnegie Mellon University } \date{} \begin{document} \maketitle \begin{center} (c) 1989-94 Andrew W. Appel, James S. Mattson, David R. Tarditi \end{center} {\bf This software comes with ABSOLUTELY NO WARRANTY. It is subject only to the terms of the ML-Yacc NOTICE, LICENSE, and DISCLAIMER (in the file COPYRIGHT distributed with this software). } \vspace{1in} New in this version: \begin{itemize} \item REJECT is much less costly than before. \item Lexical analyzers with more than 255 states can now compile in your lifetime. \end{itemize} \newpage \tableofcontents \newpage \section{General Description} Computer programs often need to divide their input into words and distinguish between different kinds of words. Compilers, for example, need to distinguish between integers, reserved words, and identifiers. Applications programs often need to be able to recognize components of typed commands from users. The problem of segmenting input into words and recognizing classes of words is known as lexical analysis. Small cases of this problem, such as reading text strings separated by spaces, can be solved by using hand-written programs. Larger cases of this problem, such as tokenizing an input stream for a compiler, can also be solved using hand-written programs. A hand-written program for a large lexical analysis problem, however, suffers from two major problems. First, the program requires a fair amount of programmer time to create. Second, the description of classes of words is not explicit in the program. It must be inferred from the program code. This makes it difficult to verify if the program recognizes the correct words for each class. It also makes future maintenance of the program difficult. Lex, a programming tool for the Unix system, is a successful solution to the general problem of lexical analysis. It uses regular expressions to describe classes of words. A program fragment is associated with each class of words. This information is given to Lex as a specification (a Lex program). Lex produces a program for a function that can be used to perform lexical analysis. The function operates as follows. It finds the longest word starting from the current position in the input stream that is in one of the word classes. It executes the program fragment associated with the class, and sets the current position in the input stream to be the character after the word. The program fragment has the actual text of the word available to it, and may be any piece of code. For many applications it returns some kind of value. Lex allows the programmer to make the language description explicit, and to concentrate on what to do with the recognized words, not how to recognize the words. It saves programmer time and increases program maintainability. Unfortunately, Lex is targeted only C. It also places artificial limits on the size of strings that can be recognized. ML-Lex is a variant of Lex for the ML programming language. ML-Lex has a syntax similar to Lex, and produces an ML program instead of a C program. ML-Lex produces a program that runs very efficiently. Typically the program will be as fast or even faster than a hand-coded lexer implemented in Standard ML. The program typically uses only a small amount of space. ML-Lex thus allows ML programmers the same benefits that Lex allows C programmers. It also does not place artificial limits on the size of recognized strings. \section{ML-Lex specifications} An ML-Lex specification has the general format: \begin{quote} {user declarations} \verb|%%| {ML-Lex definitions} \verb|%%| {rules} \end{quote} Each section is separated from the others by a \verb|%%| delimiter. The rules are used to define the lexical analysis function. Each rule has two parts---a regular expression and an action. The regular expression defines the word class that a rule matches. The action is a program fragment to be executed when a rule matches the input. The actions are used to compute values, and must all return values of the same type. The user can define values available to all rule actions in the user declarations section. The user must define two values in this section---a type lexresult and a function eof. Lexresult defines the type of values returned by the rule actions. The function "eof" is called by the lexer when the end of the input stream is reached. It will typically return a value signalling eof or raise an exception. It is called with the same argument as lex (see \verb|%arg|, below), and must return a value of type lexresult. In the definitions section, the user can define named regular expressions, a set of start states, and specify which of the various bells and whistles of ML-Lex are desired. The start states allow the user to control when certain rules are matched. Rules may be defined to match only when the lexer is in specific start states. The user may change the lexer's start state in a rule action. This allows the user to specify special handling of lexical objects. This feature is typically used to handle quoted strings with escapes to denote special characters. The rules to recognize the inside contents of a string are defined for only one start state. This start state is entered when the beginning of a string is recognized, and exited when the end of the string is recognized. \section{Regular expressions} Regular expressions are a simple language for denoting classes of strings. A regular expression is defined inductively over an alphabet with a set of basic operations. The alphabet for ML-Lex is the Ascii character set (character codes 0--127; or if \verb|%full| is used, 0--255). The syntax and semantics of regular expressions will be described in order of decreasing precedence (from the most tightly binding operators to the most weakly binding): \begin{itemize} \item An individual character stands for itself, except for the reserved characters \verb@? * + | ( ) ^ $ / ; . = < > [ { " \@ \item[\\] A backslash followed by one of the reserved characters stands for that character. \item A set of characters enclosed in square brackets [ ] stands for any one of those characters. Inside the brackets, only the symbols \verb|\ - ^| are reserved. An initial up-arrow \verb|^| stands for the complement of the characters listed, e.g. \verb|[^abc]| stands any character except a, b, or c. The hyphen - denotes a range of characters, e.g. \verb|[a-z]| stands for any lower-case alphabetic character, and \verb|[0-9a-fA-F]| stands for any hexadecimal digit. To include \verb|^| literally in a bracketed set, put it anywhere but first; to include \verb|-| literally in a set, put it first or last. \item[\verb|.|] The dot \verb|.| character stands for any character except newline, i.e. the same as \verb|[^\n]| \item The following special escape sequences are available, inside or outside of square-brackets: \begin{tabular}{ll} \verb|\b|& backspace\\ \verb|\n|& newline\\ \verb|\r|& carriage return\\ \verb|\t|& tab\\ \verb|\h|& stands for all characters with codes $>127$,\\ &~~~~ when 7-bit characters are used.\\ \verb|\ddd|& where \verb|ddd| is a 3 digit decimal escape.\\ \end{tabular} \item[\verb|"|] A sequence of characters will stand for itself (reserved characters will be taken literally) if it is enclosed in double quotes \verb|" "|. \item[\{\}] A named regular expression (defined in the ``definitions" section) may be referred to by enclosing its name in braces \verb|{ }|. \item[()] Any regular expression may be enclosed in parentheses \verb|( )| for syntactic (but, as usual, not semantic) effect. \item[\verb|*|] The postfix operator \verb|*| stands for Kleene closure: zero or more repetitions of the preceding expression. \item[\verb|+|] The postfix operator \verb|+| stands for one or more repetitions of the preceding expression. \item[\verb|?|] The postfix operator \verb|?| stands for zero or one occurrence of the preceding expression. \item A postfix repetition range $\{n_1,n_2\}$ where $n_1$ and $n_2$ are small integers stands for any number of repetitions between $n_1$ and $n_2$ of the preceding expression. The notation $\{n_1\}$ stands for exactly $n_1$ repetitions. \item Concatenation of expressions denotes concatenation of strings. The expression $e_1 e_2$ stands for any string that results from the concatenation of one string that matches $e_1$ with another string that matches $e_2$. \item\verb-|- The infix operator \verb-|- stands for alternation. The expression $e_1$~\verb"|"~$e_2$ stands for anything that either $e_1$ or $e_2$ stands for. \item[\verb|/|] The infix operator \verb|/| denotes lookahead. Lookahead is not implemented and cannot be used, because there is a bug in the algorithm for generating lexers with lookahead. If it could be used, the expression $e_1 / e_2$ would match any string that $e_1$ stands for, but only when that string is followed by a string that matches $e_2$. \item When the up-arrow \verb|^| occurs at the beginning of an expression, that expression will only match strings that occur at the beginning of a line (right after a newline character). \item[\$] The dollar sign of C Lex \$ is not implemented, since it is an abbreviation for lookahead involving the newline character (that is, it is an abbreviation for \verb|/\n|). \end{itemize} Here are some examples of regular expressions, and descriptions of the set of strings they denote: \begin{tabular}{ll} \verb~0 | 1 | 2 | 3~& A single digit between 0 and 3\\ \verb|[0123]|& A single digit between 0 and 3\\ \verb|0123|& The string ``0123"\\ \verb|0*|& All strings of 0 or more 0's\\ \verb|00*|& All strings of 1 or more 0's\\ \verb|0+|& All strings of 1 or more 0's\\ \verb|[0-9]{3}|& Any three-digit decimal number.\\ \verb|\\[ntb]|& A newline, tab, or backspace.\\ \verb|(00)*|& Any string with an even number of 0's. \end{tabular} \section{ML-Lex syntax summary} \subsection{User declarations} Anything up to the first \verb|%%| is in the user declarations section. The user should note that no symbolic identifier containing \verb|%%| can be used in this section. \subsection{ML-Lex definitions} Start states can be defined with \begin{quote} \verb|%s| {identifier list} \verb|;| \end{quote} An identifier list consists of one or more identifiers. An identifier consists of one or more letters, digits, underscores, or primes, and must begin with a letter. Named expressions can be defined with \begin{quote} {identifier} = {regular expression} ; \end{quote} Regular expressions are defined below. The following \% commands are also available: \begin{description} \item[\tt \%reject] create REJECT() function \item[\tt \%count] count newlines using yylineno \item[\tt \%posarg] pass initial-position argument to makeLexer \item[\tt \%full] create lexer for the full 8-bit character set, with characters in the range 0--255 permitted as input. \item[\tt \%structure \{identifier\}] name the structure in the output program {identifier} instead of Mlex \item[\tt \%header] use code following it to create header for lexer structure \item[\tt \%arg] extra (curried) formal parameter argument to be passed to the lex functions, and to be passed to the eof function in place of () \item[\tt \%posint \{identifier\}] use the {\tt INTEGER} structure for the type of {\tt yypos}; use {\tt Int64} or {\tt Position} to allow lexing of multi-gigabyte input files \end{description} These functions are discussed in section~\ref{avail}. \subsection{Rules} Each rule has the format: \begin{quote} \verb|<|{\it start state list}\verb|>| {\it regular expression} \verb|=> (| {\it code} \verb|);| \end{quote} All parentheses in {\it code} must be balanced, including those used in strings and comments. The {\it start state list} is optional. It consists of a list of identifiers separated by commas, and is delimited by triangle brackets \verb|< >|. Each identifier must be a start state defined in the \verb|%s| section above. The regular expression is only recognized when the lexer is in one of the start states in the start state list. If no start state list is given, the expression is recognized in all start states. The lexer begins in a pre-defined start state called \verb|INITIAL|. The lexer resolves conflicts among rules by choosing the rule with the longest match, and in the case two rules match the same string, choosing the rule listed first in the specification. The rules should match all possible input. If some input occurs that does not match any rule, the lexer created by ML-Lex will raise an exception LexError. Note that this differs from C Lex, which prints any unmatched input on the standard output. \section{Values available inside the code associated with a rule.} \label{avail} ML-Lex places the value of the string matched by a regular expression in \verb|yytext|, a string variable. The user may recursively call the lexing function with \verb|lex()|. (If \verb|%arg| is used, the lexing function may be re-invoked with the same argument by using continue().) This is convenient for ignoring white space or comments silently: \begin{verbatim} [\ \t\n]+ => ( lex()); \end{verbatim} To switch start states, the user may call \verb|YYBEGIN| with the name of a start state. The following values will be available only if the corresponding \verb|%| command is in the ML-Lex definitions sections: \begin{tabular}{lll} \\ {\bf Value}&{\bf \% command}&{\bf description}\\ \hline {\tt REJECT} &{\tt\%reject}&\parbox[t]{2.6in}{{\tt REJECT()} causes the current rule to be ``rejected.'' The lexer behaves as if the current rule had not matched; another rule that matches this string, or that matches the longest possible prefix of this string, is used instead.} \\ {\tt yypos} & & \parbox[t]{2.6in}{The position of the first character of {\tt yytext}, relative to the beginning of the file.}\\ {\tt yylineno } & {\tt \%count} & Current line number\\ \\ \end{tabular} These values should be used only if necessary. Adding {\tt REJECT} to a lexer will slow it down by 20\%; adding {\tt yylineno} will slow it down by another 20\%, or more. (It is much more efficient to recognize \verb|\n| and have an action that increments the line-number variable.) The use of the lookahead operator {\tt /} will also slow down the entire lexer. The character-position, {\tt yypos}, is not costly to maintain, however. \paragraph{Bug.} The position of the first character in the file is reported as 2 (unless the {\tt \%posarg} feature is used). To preserve compatibility, this bug has not been fixed. \section{Running ML-Lex} From the Unix shell, run {\tt sml-lex~myfile.lex} The output file will be myfile.lex.sml. The extension {\tt .lex} is not required but is recommended. Within an interactive system [not the preferred method]: Use {\tt lexgen.sml}; this will create a structure LexGen. The function LexGen.lexGen creates a program for a lexer from an input specification. It takes a string argument -- the name of the file containing the input specification. The output file name is determined by appending ``{\tt .sml}'' to the input file name. \section{Using the program produced by ML-Lex} When the output file is loaded, it will create a structure Mlex that contains the function {\tt makeLexer} which takes a function from ${\it int} \rightarrow {\it string}$ and returns a lexing function: \begin{verbatim} val makeLexer : (int->string) -> yyarg -> lexresult \end{verbatim} where {\tt yyarg} is the type given in the {\tt \%yyarg} directive, or {\tt unit} if there is no {\tt \%yyarg} directive. For example, \begin{verbatim} val lexer = Mlex.makeLexer (inputc (open_in "f")) \end{verbatim} creates a lexer that operates on the file whose name is f. When the {\tt \%posarg} directive is used, the type of {\tt makeLexer} is \begin{verbatim} val makeLexer : ((int->string)*int) -> yyarg -> lexresult \end{verbatim} where the extra {\tt int} argument is one less than the {\tt yypos} of the first character in the input. The value $k$ would be used, for example, when creating a lexer to start in the middle of a file, when $k$ characters have already been read. At the beginning of the file, $k=0$ should be used. The ${\it int} \rightarrow {\it string}$ function should read a string of characters from the input stream. It should return a null string to indicate that the end of the stream has been reached. The integer is the number of characters that the lexer wishes to read; the function may return any non-zero number of characters. For example, \begin{verbatim} val lexer = let val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end in Mlex.makeLexer (fn n => input_line std_in) end \end{verbatim} is appropriate for interactive streams where prompting, etc. occurs; the lexer won't care that \verb|input_line| might return a string of more than or less than $n$ characters. The lexer tries to read a large number of characters from the input function at once, and it is desirable that the input function return as many as possible. Reading many characters at once makes the lexer more efficient. Fewer input calls and buffering operations are needed, and input is more efficient in large block reads. For interactive streams this is less of a concern, as the limiting factor is the speed at which the user can type. To obtain a value, invoke the lexer by passing it a unit: \begin{verbatim} val nextToken = lexer() \end{verbatim} If one wanted to restart the lexer, one would just discard {\tt lexer} and create a new lexer on the same stream with another call to {\tt makeLexer}. This is the best way to discard any characters buffered internally by the lexer. All code in the user declarations section is placed inside a structure UserDeclarations. To access this structure, use the path name {\tt Mlex.UserDeclarations}. If any input cannot be matched, the program will raise the exception {\tt Mlex.LexError}. An internal error (i.e. bug) will cause the exception {\tt Internal.LexerError} to be raised. If {\tt \%structure} is used, remember that the structure name will no longer be Mlex, but the one specified in the command. \section{Sample} Here is a sample lexer for a calculator program: \small \begin{verbatim} datatype lexresult= DIV | EOF | EOS | ID of string | LPAREN | NUM of int | PLUS | PRINT | RPAREN | SUB | TIMES val linenum = ref 1 val error = fn x => output(std_out,x ^ "\n") val eof = fn () => EOF %% %structure CalcLex alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (inc linenum; lex()); {ws}+ => (lex()); "/" => (DIV); ";" => (EOS); "(" => (LPAREN); {digit}+ => (NUM (revfold (fn(a,r)=>ord(a)-ord("0")+10*r) (explode yytext) 0)); ")" => (RPAREN); "+" => (PLUS); {alpha}+ => (if yytext="print" then PRINT else ID yytext); "-" => (SUB); "*" => (TIMES); . => (error ("calc: ignoring bad character "^yytext); lex()); \end{verbatim} Here is the parser for the calculator: \begin{verbatim} (* Sample interactive calculator to demonstrate use of lexer The original grammar was stmt_list -> stmt_list stmt stmt -> print exp ; | exp ; exp -> exp + t | exp - t | t t -> t * f | t/f | f f -> (exp) | id | num The function parse takes a stream and parses it for the calculator program. If a syntax error occurs, parse prints an error message and calls itself on the stream. On this system that has the effect of ignoring all input to the end of a line. *) structure Calc = struct open CalcLex open UserDeclarations exception Error fun parse strm = let val say = fn s => output(std_out,s) val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end val lexer = makeLexer (fn n => input_line strm) val nexttok = ref (lexer()) val advance = fn () => (nexttok := lexer(); !nexttok) val error = fn () => (say ("calc: syntax error on line" ^ (makestring(!linenum)) ^ "\n"); raise Error) val lookup = fn i => if i = "ONE" then 1 else if i = "TWO" then 2 else (say ("calc: unknown identifier '" ^ i ^ "'\n"); raise Error) fun STMT_LIST () = case !nexttok of EOF => () | _ => (STMT(); STMT_LIST()) and STMT() = (case !nexttok of EOS => () | PRINT => (advance(); say ((makestring (E():int)) ^ "\n"); ()) | _ => (E(); ()); case !nexttok of EOS => (advance()) | _ => error()) and E () = E' (T()) and E' (i : int ) = case !nexttok of PLUS => (advance (); E'(i+T())) | SUB => (advance (); E'(i-T())) | RPAREN => i | EOF => i | EOS => i | _ => error() and T () = T'(F()) and T' i = case !nexttok of PLUS => i | SUB => i | TIMES => (advance(); T'(i*F())) | DIV => (advance (); T'(i div F())) | EOF => i | EOS => i | RPAREN => i | _ => error() and F () = case !nexttok of ID i => (advance(); lookup i) | LPAREN => let val v = (advance(); E()) in if !nexttok = RPAREN then (advance (); v) else error() end | NUM i => (advance(); i) | _ => error() in STMT_LIST () handle Error => parse strm end end \end{verbatim} \end{document} mlton-20210117+dfsg/mllex/doc/mllex.tex000066400000000000000000000000171416264345000175550ustar00rootroot00000000000000\input{ml-lex} mlton-20210117+dfsg/mllex/lexgen.sml000066400000000000000000001660271416264345000171620ustar00rootroot00000000000000(* Modified by Matthew Fluet on 2011-06-17. * Use simple file name (rather than absolute paths) in line directives in output. *) (* Modified by Vesa Karvonen on 2007-12-19. * Create line directives in output. *) (* Modified by Matthew Fluet on 2007-11-07. * Add %posint command. *) (* Modified by StephenWeeks on 2005-08-18. * Fix file starting position *) (* Modified by Stephen Weeks on 2004-10-19. * Do not create references to Unsafe structure. *) (* Lexical analyzer generator for Standard ML. Version 1.7.0, June 1998 Copyright (c) 1989-1992 by Andrew W. Appel, David R. Tarditi, James S. Mattson This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Changes: 07/25/89 (drt): added %header declaration, code to place user declarations at same level as makeLexer, etc. This is needed for the parser generator. /10/89 (appel): added %arg declaration (see lexgen.doc). /04/90 (drt): fixed following bug: couldn't use the lexer after an error occurred -- NextTok and inquote weren't being reset 10/22/91 (drt): disabled use of lookahead 10/23/92 (drt): disabled use of $ operator (which involves lookahead), added handlers for dictionary lookup routine 11/02/92 (drt): changed handler for exception Reject in generated lexer to Internal.Reject 02/01/94 (appel): Moved the exception handler for Reject in such a way as to allow tail-recursion (improves performance wonderfully!). 02/01/94 (appel): Fixed a bug in parsing of state names. 05/19/94 (Mikael Pettersson, mpe@ida.liu.se): Transition tables are usually represented as strings, but when the range is too large, int vectors constructed by code like "Vector.vector[1,2,3,...]" are used instead. The problem with this isn't that the vector itself takes a lot of space, but that the code generated by SML/NJ to construct the intermediate list at run-time is *HUGE*. My fix is to encode an int vector as a string literal (using two bytes per int) and emit code to decode the string to a vector at run-time. SML/NJ compiles string literals into substrings in the code, so this uses much less space. 06/02/94 (jhr): Modified export-lex.sml to conform to new installation scheme. Also removed tab characters from string literals. 10/05/94 (jhr): Changed generator to produce code that uses the new basis style strings and characters. 10/06/94 (jhr) Modified code to compile under new basis style strings and characters. 02/08/95 (jhr) Modified to use new List module interface. 05/18/95 (jhr) changed Vector.vector to Vector.fromList 04/07/20 (jhr) Switch to using RedBlackMapFn from SML/NJ Library 04/07/20 (jhr) Replaced uses of polymorphic equality with pattern matching. * Revision 1.9 1998/01/06 19:23:53 appel * added %posarg feature to permit position-within-file to be passed * as a parameter to makeLexer * # Revision 1.8 1998/01/06 19:01:48 appel # repaired error messages like "cannot have both %structure and %header" # # Revision 1.7 1998/01/06 18:55:49 appel # permit %% to be unescaped within regular expressions # # Revision 1.6 1998/01/06 18:46:13 appel # removed undocumented feature that permitted extra %% at end of rules # # Revision 1.5 1998/01/06 18:29:23 appel # put yylineno variable inside makeLexer function # # Revision 1.4 1998/01/06 18:19:59 appel # check for newline inside quoted string # # Revision 1.3 1997/10/04 03:52:13 dbm # Fix to remove output file if ml-lex fails. # 10/17/02 (jhr) changed bad character error message to properly print the bad character. 10/17/02 (jhr) fixed skipws to use Char.isSpace test. 07/27/05 (jhr) add \r as a recognized escape sequence. *) (* Subject: lookahead in sml-lex Reply-to: david.tarditi@CS.CMU.EDU Date: Mon, 21 Oct 91 14:13:26 -0400 There is a serious bug in the implementation of lookahead, as done in sml-lex, and described in Aho, Sethi, and Ullman, p. 134 "Implementing the Lookahead Operator" We have disallowed the use of lookahead for now because of this bug. As a counter-example to the implementation described in ASU, consider the following specification with the input string "aba" (this example is taken from a comp.compilers message from Dec. 1989, I think): type lexresult=unit val linenum = ref 1 fun error x = TextIO.output(TextIO.stdErr, x ^ "\n") val eof = fn () => () %% %structure Lex %% (a|ab)/ba => (print yytext; print "\n"; ()); The ASU proposal works as follows. Suppose that we are using NFA's to represent our regular expressions. Then to build an NFA for e1 / e2, we build an NFA n1 for e1 and an NFA n2 for e2, and add an epsilon transition from e1 to e2. When lexing, when we encounter the end state of e1e2, we take as the end of the string the position in the string that was the last occurrence of the state of the NFA having a transition on the epsilon introduced for /. Using the example we have above, we'll have an NFA with the following states: 1 -- a --> 2 -- b --> 3 | | | epsilon | epsilon | | |------------> 4 -- b --> 5 -- a --> 6 On our example, we get the following list of transitions: a : 2, 4 (make an epsilon transition from 2 to 4) ab : 3, 4, 5 (make an epsilon transition from 3 to 4) aba : 6 If we chose the last state in which we made an epsilon transition, we'll chose the transition from 3 to 4, and end up with "ab" as our token, when we should have "a" as our token. *) (* functor RedBlack(B : sig type key val > : key*key->bool end): sig type tree type key val empty : tree val insert : key * tree -> tree val lookup : key * tree -> key exception notfound of key end = struct open B datatype color = RED | BLACK datatype tree = empty | tree of key * color * tree * tree exception notfound of key fun insert (key,t) = let fun f empty = tree(key,RED,empty,empty) | f (tree(k,BLACK,l,r)) = if key>k then case f r of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rlk,BLACK,tree(k,RED,l,rll), tree(rk,RED,rlr,rr))) | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr)) | r => tree(k,BLACK,l,r) else if k>key then case f l of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl), tree(k,RED,lrr,r))) | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r))) | l => tree(k,BLACK,l,r) else tree(key,BLACK,l,r) | f (tree(k,RED,l,r)) = if key>k then tree(k,RED,l, f r) else if k>key then tree(k,RED, f l, r) else tree(key,RED,l,r) in case f t of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r) | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r) | t => t end fun lookup (key,t) = let fun look empty = raise (notfound key) | look (tree(k,_,l,r)) = if k>key then look l else if key>k then look r else k in look t end end *) signature LEXGEN = sig val lexGen: string -> unit end structure LexGen: LEXGEN = struct val sub = Array.sub infix 9 sub type pos = {line : int, col : int} datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR | LP | RP | CARAT | DOLLAR | SLASH | STATE of string list | REPS of int * int | ID of string | ACTION of pos * string | BOF | EOF | ASSIGN | SEMI | ARROW | LEXMARK | LEXSTATES | COUNT | REJECT | FULLCHARSET | STRUCT | HEADER | ARG | POSARG | POSINT datatype exp = EPS | CLASS of bool array * int | CLOSURE of exp | ALT of exp * exp | CAT of exp * exp | TRAIL of int | END of int (* flags describing input Lex spec. - unnecessary code is omitted *) (* if possible *) val CharFormat = ref false; val UsesTrailingContext = ref false; val UsesPrevNewLine = ref false; (* flags for various bells & whistles that Lex has. These slow the lexer down and should be omitted from production lexers (if you really want speed) *) val CountNewLines = ref false; val PosArg = ref false; val HaveReject = ref false; (* Can increase size of character set *) val CharSetSize = ref 129; (* Can name structure or declare header code *) val StrName = ref "Mlex" val HeaderCode = ref "" val HeaderPos = ref {line = 0, col = 0} val HeaderDecl = ref false val ArgCode = ref (NONE: (pos * string) option) val StrDecl = ref false (* Can define INTEGER structure for yypos variable. *) val PosIntName = ref "Int" val PosIntDecl = ref false val ResetFlags = fn () => (CountNewLines := false; HaveReject := false; PosArg := false; UsesTrailingContext := false; CharSetSize := 129; StrName := "Mlex"; HeaderCode := ""; HeaderDecl:= false; ArgCode := NONE; StrDecl := false; PosIntName := "Int"; PosIntDecl := false) val LexOut = ref(TextIO.stdOut) val LexOutLine = ref 1 fun setLexOut s = (LexOut := s; LexOutLine := 1) fun say x = (TextIO.output (!LexOut, x) ; CharVector.app (fn #"\n" => LexOutLine := !LexOutLine + 1 | _ => ()) x) val InFile = ref "" val OutFile = ref "" fun fmtLineDir {line, col} file = String.concat ["(*#line ", Int.toString line, ".", Int.toString (col+1), " \"", file, "\"*)"] val sayPos = fn SOME pos => say (fmtLineDir pos (!InFile)) | NONE => (say (fmtLineDir {line = !LexOutLine, col = 0} (!OutFile)); say "\n") (* Union: merge two sorted lists of integers *) fun union(a,b) = let val rec merge = fn (nil,nil,z) => z | (nil,el::more,z) => merge(nil,more,el::z) | (el::more,nil,z) => merge(more,nil,el::z) | (x::morex,y::morey,z) => if (x:int)=(y:int) then merge(morex,morey,x::z) else if x>y then merge(morex,y::morey,x::z) else merge(x::morex,morey,y::z) in merge(rev a,rev b,nil) end (* Nullable: compute if a important expression parse tree node is nullable *) val rec nullable = fn EPS => true | CLASS(_) => false | CLOSURE(_) => true | ALT(n1,n2) => nullable(n1) orelse nullable(n2) | CAT(n1,n2) => nullable(n1) andalso nullable(n2) | TRAIL(_) => true | END(_) => false (* FIRSTPOS: firstpos function for parse tree expressions *) and firstpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => firstpos(n) | ALT(n1,n2) => union(firstpos(n1),firstpos(n2)) | CAT(n1,n2) => if nullable(n1) then union(firstpos(n1),firstpos(n2)) else firstpos(n1) | TRAIL(i) => [i] | END(i) => [i] (* LASTPOS: Lastpos function for parse tree expressions *) and lastpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => lastpos(n) | ALT(n1,n2) => union(lastpos(n1),lastpos(n2)) | CAT(n1,n2) => if nullable(n2) then union(lastpos(n1),lastpos(n2)) else lastpos(n2) | TRAIL(i) => [i] | END(i) => [i] ; (* ++: Increment an integer reference *) fun ++(x) : int = (x := !x + 1; !x); structure dict = struct type 'a relation = 'a * 'a -> bool abstype ('b,'a) dictionary = DATA of { Table : ('b * 'a) list, Leq : 'b * 'b -> bool } with exception LOOKUP fun create Leqfunc = DATA { Table = nil, Leq = Leqfunc } fun lookup (DATA { Table = entrylist, Leq = leq }) key = let fun search [] = raise LOOKUP | search((k,item)::entries) = if leq(key,k) then if leq(k,key) then item else raise LOOKUP else search entries in search entrylist end fun enter (DATA { Table = entrylist, Leq = leq }) (newentry as (key : 'b,item :'a)) : ('b,'a) dictionary = let val gt = fn a => fn b => not (leq(a,b)) val eq = fn k => fn k' => (leq(k,k')) andalso (leq(k',k)) fun update nil = [ newentry ] | update ((entry as (k,_))::entries) = if (eq key k) then newentry::entries else if gt k key then newentry::(entry::entries) else entry::(update entries) in DATA { Table = update entrylist, Leq = leq } end fun listofdict (DATA { Table = entrylist,Leq = leq}) = let fun f (nil,r) = rev r | f (a::b,r) = f (b,a::r) in f(entrylist,nil) end end end open dict; (* INPUT.ML : Input w/ one character push back capability *) val LineNum = ref 1; abstype ibuf = BUF of TextIO.instream * {b : string ref, p : int ref} with local val pos = ref 0 val linePos = ref 0 (* incorrect after ungetch newline, non fatal *) in fun resetLexPos () = (LineNum := 1; pos := 0; linePos :=0) fun getLexPos () = {line = !LineNum, col = !pos - !linePos} fun make_ibuf(s) = BUF (s, {b=ref"", p = ref 0}) fun close_ibuf (BUF (s,_)) = TextIO.closeIn(s) exception eof fun getch (a as (BUF(s,{b,p}))) = if (!p = (size (!b))) then (b := TextIO.inputN(s, 1024); p := 0; if (size (!b))=0 then raise eof else getch a) else (let val ch = String.sub(!b,!p) in (pos := !pos + 1; if ch = #"\n" then (LineNum := !LineNum + 1; linePos := !pos) else (); p := !p + 1; ch) end) fun ungetch(BUF(s,{b,p})) = ( pos := !pos - 1; p := !p - 1; if String.sub(!b,!p) = #"\n" then LineNum := !LineNum - 1 else ()) end end; exception Error fun prErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) fun prSynErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: syntax error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) exception SyntaxError; (* error in user's input file *) exception LexError; (* unexpected error in lexer *) val LexBuf = ref(make_ibuf(TextIO.stdIn)); val LexState = ref 0; val NextTok = ref BOF; val inquote = ref false; fun AdvanceTok () : unit = let fun isLetter c = ((c >= #"a") andalso (c <= #"z")) orelse ((c >= #"A") andalso (c <= #"Z")) fun isDigit c = (c >= #"0") andalso (c <= #"9") (* check for valid (non-leading) identifier character (added by JHR) *) fun isIdentChr c = ((isLetter c) orelse (isDigit c) orelse (c = #"_") orelse (c = #"'")) fun atoi s = let fun num (c::r, n) = if isDigit c then num (r, 10*n + (Char.ord c - Char.ord #"0")) else n | num ([], n) = n in num (explode s, 0) end fun skipws () = let val ch = nextch() in if Char.isSpace ch then skipws() else ch end and nextch () = getch(!LexBuf) and escaped () = (case nextch() of #"b" => #"\008" | #"n" => #"\n" | #"r" => #"\r" | #"t" => #"\t" | #"h" => #"\128" | x => let fun err t = prErr("illegal ascii escape '"^(implode(rev t))^"'") fun cvt c = (Char.ord c - Char.ord #"0") fun f (n, c, t) = if c=3 then if n >= (!CharSetSize) then err t else Char.chr n else let val ch=nextch() in if isDigit ch then f(n*10+(cvt ch), c+1, ch::t) else err t end in if isDigit x then f(cvt x, 1, [x]) else x end (* end case *)) and onechar x = let val c = Array.array(!CharSetSize, false) in Array.update(c, Char.ord(x), true); CHARS(c) end in case !LexState of 0 => let val makeTok = fn () => case skipws() (* Lex % operators *) of #"%" => (case nextch() of #"%" => LEXMARK | a => let fun f s = let val a = nextch() in if isLetter a then f(a::s) else (ungetch(!LexBuf); implode(rev s)) end in case f [a] of "reject" => REJECT | "count" => COUNT | "full" => FULLCHARSET | "s" => LEXSTATES | "S" => LEXSTATES | "structure" => STRUCT | "header" => HEADER | "arg" => ARG | "posarg" => POSARG | "posint" => POSINT | _ => prErr "unknown % operator " end ) (* semicolon (for end of LEXSTATES) *) | #";" => SEMI (* anything else *) | ch => if isLetter(ch) then let fun getID matched = let val x = nextch() (**** fix by JHR in if isLetter(x) orelse isDigit(x) orelse x = "_" orelse x = "'" ****) in if (isIdentChr x) then getID (x::matched) else (ungetch(!LexBuf); implode(rev matched)) end in ID(getID [ch]) end else prSynErr (String.concat[ "bad character: \"", Char.toString ch, "\"" ]) in NextTok := makeTok() end | 1 => let val rec makeTok = fn () => if !inquote then case nextch() of (* inside quoted string *) #"\\" => onechar(escaped()) | #"\"" => (inquote := false; makeTok()) | #"\n" => (prSynErr "end-of-line inside quoted string"; inquote := false; makeTok()) | x => onechar(x) else case skipws() of (* single character operators *) #"?" => QMARK | #"*" => STAR | #"+" => PLUS | #"|" => BAR | #"(" => LP | #")" => RP | #"^" => CARAT | #"$" => DOLLAR | #"/" => SLASH | #";" => SEMI | #"." => let val c = Array.array(!CharSetSize,true) in Array.update(c,10,false); CHARS(c) end (* assign and arrow *) | #"=" => let val c = nextch() in if c = #">" then ARROW else (ungetch(!LexBuf); ASSIGN) end (* character set *) | #"[" => let val rec classch = fn () => let val x = skipws() in if x = #"\\" then escaped() else x end; val first = classch(); val flag = (first <> #"^"); val c = Array.array(!CharSetSize,not flag); fun add NONE = () | add (SOME x) = Array.update(c, Char.ord(x), flag) and range (x, y) = if x>y then (prErr "bad char. range") else let val i = ref(Char.ord(x)) and j = Char.ord(y) in while !i<=j do ( add (SOME(Char.chr(!i))); i := !i + 1) end and getClass last = (case classch() of #"]" => (add(last); c) | #"-" => (case last of NONE => getClass(SOME #"-") | (SOME last') => let val x = classch() in if x = #"]" then (add(last); add(SOME #"-"); c) else (range(last',x); getClass(NONE)) end (* end case *)) | x => (add(last); getClass(SOME x)) (* end case *)) in CHARS(getClass(if first = #"^" then NONE else SOME first)) end (* Start States specification *) | #"<" => let val rec get_state = fn (prev,matched) => case nextch() of #">" => matched::prev | #"," => get_state(matched::prev,"") | x => if isIdentChr(x) then get_state(prev,matched ^ String.str x) else (prSynErr "bad start state list") in STATE(get_state(nil,"")) end (* {id} or repititions *) | #"{" => let val ch = nextch() in if isLetter(ch) then let fun getID matched = (case nextch() of #"}" => matched | x => if (isIdentChr x) then getID(matched ^ String.str x) else (prErr "invalid char. class name") (* end case *)) in ID(getID(String.str ch)) end else if isDigit(ch) then let fun get_r (matched, r1) = (case nextch() of #"}" => let val n = atoi(matched) in if r1 = ~1 then (n,n) else (r1,n) end | #"," => if r1 = ~1 then get_r("",atoi(matched)) else (prErr "invalid repetitions spec.") | x => if isDigit(x) then get_r(matched ^ String.str x,r1) else (prErr "invalid char in repetitions spec") (* end case *)) in REPS(get_r(String.str ch,~1)) end else (prErr "bad repetitions spec") end (* Lex % operators *) | #"\\" => onechar(escaped()) (* start quoted string *) | #"\"" => (inquote := true; makeTok()) (* anything else *) | ch => onechar(ch) in NextTok := makeTok() end | 2 => NextTok := (case skipws() of #"(" => let fun loop_to_end (backslash, x) = let val c = getch (! LexBuf) val notb = not backslash val nstr = c :: x in case c of #"\"" => if notb then nstr else loop_to_end (false, nstr) | _ => loop_to_end (c = #"\\" andalso notb, nstr) end fun GetAct (lpct, x) = let val c = getch (! LexBuf) val nstr = c :: x in case c of #"\"" => GetAct (lpct, loop_to_end (false, nstr)) | #"(" => GetAct (lpct + 1, nstr) | #")" => if lpct = 0 then implode (rev x) else GetAct(lpct - 1, nstr) | _ => GetAct(lpct, nstr) end in ACTION (getLexPos (), GetAct (0,nil)) end | #";" => SEMI | c => (prSynErr ("invalid character " ^ String.str c))) | _ => raise LexError end handle eof => NextTok := EOF ; fun GetTok (_:unit) : token = let val t = !NextTok in AdvanceTok(); t end; val SymTab = ref (create String.<=) : (string,exp) dictionary ref fun GetExp () : exp = let val rec optional = fn e => ALT(EPS,e) and lookup' = fn name => lookup(!SymTab) name handle LOOKUP => prErr ("bad regular expression name: "^ name) and newline = fn () => let val c = Array.array(!CharSetSize,false) in Array.update(c,10,true); c end and endline = fn e => trail(e,CLASS(newline(),0)) and trail = fn (e1,e2) => CAT(CAT(e1,TRAIL(0)),e2) and closure1 = fn e => CAT(e,CLOSURE(e)) and repeat = fn (min,max,e) => let val rec rep = fn (0,0) => EPS | (0,1) => ALT(e,EPS) | (0,i) => CAT(rep(0,1),rep(0,i-1)) | (i,j) => CAT(e,rep(i-1,j-1)) in rep(min,max) end and exp0 = fn () => case GetTok() of CHARS(c) => exp1(CLASS(c,0)) | LP => let val e = exp0() in case !NextTok of RP => (AdvanceTok(); exp1(e)) | _ => (prSynErr "missing ')'") end | ID(name) => exp1(lookup' name) | _ => raise SyntaxError and exp1 = fn (e) => case !NextTok of SEMI => e | ARROW => e | EOF => e | LP => exp2(e,exp0()) | RP => e | t => (AdvanceTok(); case t of QMARK => exp1(optional(e)) | STAR => exp1(CLOSURE(e)) | PLUS => exp1(closure1(e)) | CHARS(c) => exp2(e,CLASS(c,0)) | BAR => ALT(e,exp0()) | DOLLAR => (UsesTrailingContext := true; endline(e)) | SLASH => (UsesTrailingContext := true; trail(e,exp0())) | REPS(i,j) => exp1(repeat(i,j,e)) | ID(name) => exp2(e,lookup' name) | _ => raise SyntaxError) and exp2 = fn (e1,e2) => case !NextTok of SEMI => CAT(e1,e2) | ARROW => CAT(e1,e2) | EOF => CAT(e1,e2) | LP => exp2(CAT(e1,e2),exp0()) | RP => CAT(e1,e2) | t => (AdvanceTok(); case t of QMARK => exp1(CAT(e1,optional(e2))) | STAR => exp1(CAT(e1,CLOSURE(e2))) | PLUS => exp1(CAT(e1,closure1(e2))) | CHARS(c) => exp2(CAT(e1,e2),CLASS(c,0)) | BAR => ALT(CAT(e1,e2),exp0()) | DOLLAR => (UsesTrailingContext := true; endline(CAT(e1,e2))) | SLASH => (UsesTrailingContext := true; trail(CAT(e1,e2),exp0())) | REPS(i,j) => exp1(CAT(e1,repeat(i,j,e2))) | ID(name) => exp2(CAT(e1,e2),lookup' name) | _ => raise SyntaxError) in exp0() end; val StateTab = ref(create(String.<=)) : (string,int) dictionary ref val StateNum = ref 0; fun GetStates () : int list = let fun add nil sl = sl | add (x::y) sl = add y (union ([lookup (!StateTab)(x) handle LOOKUP => prErr ("bad state name: "^x) ],sl)) fun addall i sl = if i <= !StateNum then addall (i+2) (union ([i],sl)) else sl fun incall (x::y) = (x+1)::incall y | incall nil = nil fun addincs nil = nil | addincs (x::y) = x::(x+1)::addincs y val state_list = case !NextTok of STATE s => (AdvanceTok(); LexState := 1; add s nil) | _ => addall 1 nil in case !NextTok of CARAT => (LexState := 1; AdvanceTok(); UsesPrevNewLine := true; incall state_list) | _ => addincs state_list end val LeafNum = ref ~1; fun renum(e : exp) : exp = let val rec label = fn EPS => EPS | CLASS(x,_) => CLASS(x,++LeafNum) | CLOSURE(e) => CLOSURE(label(e)) | ALT(e1,e2) => ALT(label(e1),label(e2)) | CAT(e1,e2) => CAT(label(e1),label(e2)) | TRAIL(i) => TRAIL(++LeafNum) | END(i) => END(++LeafNum) in label(e) end; exception ParseError; fun parse() : (string * (int list * exp) list * ((string,pos*string) dictionary)) = let fun isSEMI SEMI = true | isSEMI _ = false val Accept = ref (create String.<=) : (string,pos*string) dictionary ref val rec ParseRtns = fn l => case getch(!LexBuf) of #"%" => let val c = getch(!LexBuf) in if c = #"%" then (implode (rev l)) else ParseRtns(c :: #"%" :: l) end | c => ParseRtns(c::l) and ParseDefs = fn () => (LexState:=0; AdvanceTok(); case !NextTok of LEXMARK => () | LEXSTATES => let fun f () = (case !NextTok of (ID i) => (StateTab := enter(!StateTab)(i,++StateNum); ++StateNum; AdvanceTok(); f()) | _ => ()) in AdvanceTok(); f (); if isSEMI (!NextTok) then ParseDefs() else (prSynErr "expected ';'") end | ID x => ( LexState:=1; AdvanceTok(); case GetTok() of ASSIGN => ( SymTab := enter(!SymTab)(x,GetExp()); if isSEMI (!NextTok) then ParseDefs() else (prSynErr "expected ';'")) | _ => raise SyntaxError) | REJECT => (HaveReject := true; ParseDefs()) | COUNT => (CountNewLines := true; ParseDefs()) | FULLCHARSET => (CharSetSize := 256; ParseDefs()) | HEADER => (LexState := 2; AdvanceTok(); case GetTok() of ACTION (p, s) => if (!StrDecl) then (prErr "cannot have both %structure and %header \ \declarations") else if (!HeaderDecl) then (prErr "duplicate %header declarations") else (HeaderCode := s; LexState := 0; HeaderPos := p; HeaderDecl := true; ParseDefs()) | _ => raise SyntaxError) | POSARG => (PosArg := true; ParseDefs()) | POSINT => (AdvanceTok(); case !NextTok of (ID i) => if (!PosIntDecl) then (prErr "duplicate %posint declarations") else (PosIntName := i; PosIntDecl := true) | _ => (prErr "expected ID"); ParseDefs()) | ARG => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => (case !ArgCode of SOME _ => prErr "duplicate %arg declarations" | NONE => ArgCode := SOME s; LexState := 0; ParseDefs()) | _ => raise SyntaxError) | STRUCT => (AdvanceTok(); case !NextTok of (ID i) => if (!HeaderDecl) then (prErr "cannot have both %structure and %header \ \declarations") else if (!StrDecl) then (prErr "duplicate %structure declarations") else (StrName := i; StrDecl := true) | _ => (prErr "expected ID"); ParseDefs()) | _ => raise SyntaxError) and ParseRules = fn rules => (LexState:=1; AdvanceTok(); case !NextTok of EOF => rules | _ => let val s = GetStates() val e = renum(CAT(GetExp(),END(0))) in case !NextTok of ARROW => (LexState:=2; AdvanceTok(); case GetTok() of ACTION(act) => if isSEMI (!NextTok) then (Accept:=enter(!Accept) (Int.toString (!LeafNum),act); ParseRules((s,e)::rules)) else (prSynErr "expected ';'") | _ => raise SyntaxError) | _ => (prSynErr "expected '=>'") end) in let val usercode = ParseRtns nil in (ParseDefs(); (usercode,ParseRules(nil),!Accept)) end end handle SyntaxError => (prSynErr "") fun makebegin () : unit = let fun make nil = () | make ((x,n:int)::y)=(say "val "; say x; say " = " ; say "STARTSTATE "; say (Int.toString n); say ";\n"; make y) in say "\n(* start state definitions *)\n\n"; make(listofdict(!StateTab)) end (* structure L = struct nonfix > type key = int list * string fun > ((key,item:string),(key',item')) = let fun f ((a:int)::a') (b::b') = if Int.> (a,b) then true else if a=b then f a' b' else false | f _ _ = false in f key key' end end structure RB = RedBlack(L) *) (* a finite map implementation that replaces the original version, but * keeps the same interface. *) structure RB : sig type tree type key val empty : tree val insert : key * tree -> tree val lookup : key * tree -> key exception notfound of key end = struct structure Map = RedBlackMapFn ( struct type ord_key = int list val compare = List.collate Int.compare end) type key = (int list * string) type tree = string Map.map val empty = Map.empty val insert = Map.insert' exception notfound of key fun lookup (arg as (key, _), t) = (case Map.find(t, key) of SOME item => (key, item) | NONE => raise notfound arg (* end case *)) end fun maketable (fins:(int * (int list)) list, tcs :(int * (int list)) list, tcpairs: (int * int) list, trans : (int*(int list)) list) : unit = (* Fins = (state #, list of final leaves for the state) list tcs = (state #, list of trailing context leaves which begin in this state) list tcpairs = (trailing context leaf, end leaf) list trans = (state #,list of transitions for state) list *) let datatype elem = N of int | T of int | D of int val count = ref 0 val _ = (if length(trans)<256 then CharFormat := true else CharFormat := false; if !UsesTrailingContext then (say "\ndatatype yyfinstate = N of int | \ \ T of int | D of int\n") else say "\ndatatype yyfinstate = N of int"; say "\ntype statedata = {fin : yyfinstate list, trans: "; case !CharFormat of true => say "string}" | false => say "int Vector.vector}"; say "\n(* transition & final state table *)\nval tab = let\n"; case !CharFormat of true => () | false => (say "fun decode s k =\n"; say " let val k' = k + k\n"; say " val hi = Char.ord(String.sub(s, k'))\n"; say " val lo = Char.ord(String.sub(s, k' + 1))\n"; say " in hi * 256 + lo end\n")) val newfins = let fun IsEndLeaf t = let fun f ((l,e)::r) = if (e=t) then true else f r | f nil = false in f tcpairs end fun GetEndLeaf t = let fun f ((tl,el)::r) = if (tl=t) then el else f r | f _ = raise Match in f tcpairs end fun GetTrConLeaves s = let fun f ((s',l)::r) = if (s = s') then l else f r | f nil = nil in f tcs end fun sort_leaves s = let fun insert (x:int) (a::b) = if (x <= a) then x::(a::b) else a::(insert x b) | insert x nil = [x] in List.foldr (fn (x,r) => insert x r) [] s end fun conv a = if (IsEndLeaf a) then (D a) else (N a) fun merge (a::a',b::b') = if (a <= b) then (conv a)::merge(a',b::b') else (T b)::(merge(a::a',b')) | merge (a::a',nil) = (conv a)::(merge (a',nil)) | merge (nil,b::b') = (T b)::(merge (b',nil)) | merge (nil,nil) = nil in map (fn (x,l) => rev (merge (l, sort_leaves (map (fn x => GetEndLeaf x) (GetTrConLeaves x))))) fins end val rs = let open RB fun makeItems x = let fun emit8(x, pos) = let val s = StringCvt.padLeft #"0" 3 (Int.toString x) in case pos of 16 => (say "\\\n\\\\"; say s; 1) | _ => (say "\\"; say s; pos+1) end fun emit16(x, pos) = let val hi8 = x div 256 val lo8 = x - hi8 * 256 (* x rem 256 *) in emit8(lo8, emit8(hi8, pos)) end fun MakeString([], _, _) = () | MakeString(x::xs, emitter, pos) = MakeString(xs, emitter, emitter(x, pos)) in case !CharFormat of true => (say " \n\""; MakeString(x,emit8,0); say "\"\n") | false => (say (Int.toString(length x)); say ", \n\""; MakeString(x,emit16,0); say "\"\n") end fun makeEntry(nil,rs,t) = rev rs | makeEntry(((l:int,x)::y),rs,t) = let val name = (Int.toString l) in let val (r,n) = lookup ((x,name),t) in makeEntry(y,(n::rs),t) end handle notfound _ => (count := !count+1; say " ("; say name; say ","; makeItems x; say "),\n"; makeEntry(y,(name::rs),(insert ((x,name),t)))) end val _ = say "val s = [ \n" val res = makeEntry(trans,nil,empty) val _ = case !CharFormat of true => (say "(0, \"\")]\n"; say "fun f x = x \n") | false => (say "(0, 0, \"\")]\n"; say "fun f(n, i, x) = (n, Vector.tabulate(i, decode x)) \n") val _ = say "val s = List.map f (List.rev (tl (List.rev s))) \n" val _ = say "exception LexHackingError \n" val _ = say "fun look ((j,x)::r, i: int) = if i = j then x else look(r, i) \n" val _ = say " | look ([], i) = raise LexHackingError\n" val _ = say "fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} \n" in res end fun makeTable args = let fun makeOne (a, b) = let fun item (N i) = ("N", i) | item (T i) = ("T", i) | item (D i) = ("D", i) fun makeItem x = let val (t, n) = item x in app say ["(", t, " ", Int.toString n, ")"] end fun makeItems [] = () | makeItems [x] = makeItem x | makeItems (hd :: tl) = (makeItem hd; say ","; makeItems tl) in say "{fin = ["; makeItems b; app say ["], trans = ", a, "}"] end fun mt ([], []) = () | mt ([a], [b]) = makeOne (a, b) | mt (a :: a', b :: b') = (makeOne (a, b); say ",\n"; mt (a', b')) | mt _ = raise Match in mt args end (* fun makeTable(nil,nil) = () | makeTable(a::a',b::b') = let fun makeItems nil = () | makeItems (hd::tl) = let val (t,n) = case hd of (N i) => ("(N ",i) | (T i) => ("(T ",i) | (D i) => ("(D ",i) in (say t; say (Int.toString n); say ")"; if null tl then () else (say ","; makeItems tl)) end in (say "{fin = ["; makeItems b; say "], trans = "; say a; say "}"; if null a' then () else (say ",\n"; makeTable(a',b'))) end *) fun msg x = TextIO.output(TextIO.stdOut, x) in (say "in Vector.fromList(List.map g \n["; makeTable(rs,newfins); say "])\nend\n"; msg ("\nNumber of states = " ^ (Int.toString (length trans))); msg ("\nNumber of distinct rows = " ^ (Int.toString (!count))); msg ("\nApprox. memory size of trans. table = " ^ (Int.toString (!count*(!CharSetSize)*(if !CharFormat then 1 else 8)))); msg " bytes\n") end (* makeaccept: Takes a (string,string) dictionary, prints case statement for accepting leaf actions. The key strings are the leaf #'s, the data strings are the actions *) fun makeaccept ends = let fun startline f = if f then say " " else say "| " fun make(nil,f) = (startline f; say "_ => raise Internal.LexerError\n") | make((x,(p,a))::y,f) = (startline f; say x; say " => "; if Substring.size(#2 (Substring.position "yytext" (Substring.full a))) = 0 then (say "("; sayPos (SOME p); say a; sayPos NONE; say ")") else (say "let val yytext=yymktext() in "; sayPos (SOME p); say a; sayPos NONE; say " end"); say "\n"; make(y,false)) in make (listofdict(ends),true) end fun leafdata(e:(int list * exp) list) = let val fp = Array.array(!LeafNum + 1,nil) and leaf = Array.array(!LeafNum + 1,EPS) and tcpairs = ref nil and trailmark = ref ~1; val rec add = fn (nil,x) => () | (hd::tl,x) => (Array.update(fp,hd,union(fp sub hd,x)); add(tl,x)) and moredata = fn CLOSURE(e1) => (moredata(e1); add(lastpos(e1),firstpos(e1))) | ALT(e1,e2) => (moredata(e1); moredata(e2)) | CAT(e1,e2) => (moredata(e1); moredata(e2); add(lastpos(e1),firstpos(e2))) | CLASS(x,i) => Array.update(leaf,i,CLASS(x,i)) | TRAIL(i) => (Array.update(leaf,i,TRAIL(i)); if !trailmark = ~1 then trailmark := i else ()) | END(i) => (Array.update(leaf,i,END(i)); if !trailmark <> ~1 then (tcpairs := (!trailmark,i)::(!tcpairs); trailmark := ~1) else ()) | _ => () and makedata = fn nil => () | (_,x)::tl => (moredata(x);makedata(tl)) in trailmark := ~1; makedata(e); (fp,leaf,!tcpairs) end; fun makedfa(rules) = let val StateTab = ref (create(String.<=)) : (string,int) dictionary ref val fintab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val transtab = ref (create(Int.<=)) : (int,int list) dictionary ref val tctab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val (fp, leaf, tcpairs) = leafdata(rules); fun visit (state,statenum) = let val transitions = gettrans(state) in fintab := enter(!fintab)(statenum,getfin(state)); tctab := enter(!tctab)(statenum,gettc(state)); transtab := enter(!transtab)(statenum,transitions) end and visitstarts (states) = let fun vs nil i = () | vs (hd::tl) i = (visit (hd,i); vs tl (i+1)) in vs states 0 end and hashstate(s: int list) = let val rec hs = fn (nil,z) => z | ((x:int)::y,z) => hs(y,z ^ " " ^ (Int.toString x)) in hs(s,"") end and find(s) = lookup(!StateTab)(hashstate(s)) and add(s,n) = StateTab := enter(!StateTab)(hashstate(s),n) and getstate (state) = find(state) handle LOOKUP => let val n = ++StateNum in add(state,n); visit(state,n); n end and getfin state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of END _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettc state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of TRAIL _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettrans (state) = let fun loop c tlist = let fun cktrans nil r = r | cktrans (hd::tl) r = case (leaf sub hd) of CLASS(i,_)=> (if (i sub c) then cktrans tl (union(r,fp sub hd)) else cktrans tl r handle Subscript => cktrans tl r ) | _ => cktrans tl r in if c >= 0 then let val v=cktrans state nil in loop (c-1) (if v=nil then 0::tlist else (getstate v)::tlist) end else tlist end in loop ((!CharSetSize) - 1) nil end and startstates() = let val startarray = Array.array(!StateNum + 1, nil); fun listofarray(a,n) = let fun f i l = if i >= 0 then f (i-1) ((a sub i)::l) else l in f (n-1) nil end val rec makess = fn nil => () | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl)) and fix = fn (nil,_) => () | (s::tl,firsts) => (Array.update(startarray,s, union(firsts,startarray sub s)); fix(tl,firsts)) in makess(rules);listofarray(startarray, !StateNum + 1) end in visitstarts(startstates()); (listofdict(!fintab),listofdict(!transtab),listofdict(!tctab),tcpairs) end val skel_hd = " struct\n\ \ structure UserDeclarations =\n\ \ struct\n\ \" val skel_mid2 = " | Internal.D k => action (i,(acts::l),k::rs)\n\ \ | Internal.T k =>\n\ \ let fun f (a::b,r) =\n\ \ if a=k\n\ \ then action(i,(((Internal.N a)::acts)::l),(b@r))\n\ \ else f (b,a::r)\n\ \ | f (nil,r) = action(i,(acts::l),rs)\n\ \ in f (rs,nil)\n\ \ end\n\ \" fun lexGen(infile) = let val outfile = infile ^ ".sml" val () = (InFile := OS.Path.file infile; OutFile := OS.Path.file outfile) fun PrintLexer (ends) = let val sayln = fn x => (say x; say "\n") in case !ArgCode of NONE => (sayln "fun lex () : Internal.result ="; sayln "let fun continue() = lex() in") | SOME (p,s) => (say "fun lex "; say "(yyarg as ("; sayPos (SOME p); say s; sayPos NONE; sayln ")) ="; sayln "let fun continue() : Internal.result = "); say " let fun scan (s,AcceptingLeaves : Internal.yyfinstate"; sayln " list list,l,i0) ="; if !UsesTrailingContext then say "\tlet fun action (i,nil,rs)" else say "\tlet fun action (i,nil)"; sayln " = raise LexError"; if !UsesTrailingContext then sayln "\t| action (i,nil::l,rs) = action(i-1,l,rs)" else sayln "\t| action (i,nil::l) = action (i-1,l)"; if !UsesTrailingContext then sayln "\t| action (i,(node::acts)::l,rs) =" else sayln "\t| action (i,(node::acts)::l) ="; sayln "\t\tcase node of"; sayln "\t\t Internal.N yyk => "; sayln "\t\t\t(let fun yymktext() = String.substring(!yyb,i0,i-i0)\n\ \\t\t\t val yypos = YYPosInt.+(YYPosInt.fromInt i0, !yygone)"; if !CountNewLines then (sayln "\t\t\tval _ = yylineno := CharVectorSlice.foldli"; sayln "\t\t\t\t(fn (_,#\"\\n\", n) => n+1 | (_,_, n) => n) (!yylineno) (CharVectorSlice.slice (!yyb,i0,SOME(i-i0)))") else (); if !HaveReject then (say "\t\t\tfun REJECT() = action(i,acts::l"; if !UsesTrailingContext then sayln ",rs)" else sayln ")") else (); sayln "\t\t\topen UserDeclarations Internal.StartStates"; sayln " in (yybufpos := i; case yyk of "; sayln ""; sayln "\t\t\t(* Application actions *)\n"; makeaccept(ends); say "\n\t\t) end "; say ")\n\n"; if (!UsesTrailingContext) then say skel_mid2 else (); sayln "\tval {fin,trans} = Vector.sub(Internal.tab, s)"; sayln "\tval NewAcceptingLeaves = fin::AcceptingLeaves"; sayln "\tin if l = !yybl then"; sayln "\t if trans = #trans(Vector.sub(Internal.tab,0))"; sayln "\t then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then say ",nil" else (); say ") else"; sayln "\t let val newchars= if !yydone then \"\" else yyinput 1024"; sayln "\t in if (String.size newchars)=0"; sayln "\t\t then (yydone := true;"; say "\t\t if (l=i0) then UserDeclarations.eof "; sayln (case !ArgCode of NONE => "()" | SOME _ => "yyarg"); say "\t\t else action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil))" else sayln "))"; sayln "\t\t else (if i0=l then yyb := newchars"; sayln "\t\t else yyb := String.substring(!yyb,i0,l-i0)^newchars;"; sayln "\t\t yygone := YYPosInt.+(!yygone, YYPosInt.fromInt i0);"; sayln "\t\t yybl := String.size (!yyb);"; sayln "\t\t scan (s,AcceptingLeaves,l-i0,0))"; sayln "\t end"; sayln "\t else let val NewChar = Char.ord(CharVector.sub(!yyb,l))"; if !CharSetSize=129 then sayln "\t\tval NewChar = if NewChar<128 then NewChar else 128" else (); say "\t\tval NewState = "; sayln (if !CharFormat then "Char.ord(CharVector.sub(trans,NewChar))" else "Vector.sub(trans, NewChar)"); say "\t\tin if NewState=0 then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil)" else sayln ")"; sayln "\t\telse scan(NewState,NewAcceptingLeaves,l+1,i0)"; sayln "\tend"; sayln "\tend"; if !UsesPrevNewLine then () else sayln "(*"; sayln "\tval start= if String.substring(!yyb,!yybufpos-1,1)=\"\\n\""; sayln "then !yybegin+1 else !yybegin"; if !UsesPrevNewLine then () else sayln "*)"; say "\tin scan("; if !UsesPrevNewLine then say "start" else say "!yybegin (* start *)"; sayln ",nil,!yybufpos,!yybufpos)"; sayln " end"; sayln (case !ArgCode of NONE => "end" | SOME _ => "in continue end"); sayln " in lex"; sayln " end"; sayln "end" end in (UsesPrevNewLine := false; ResetFlags(); LexBuf := make_ibuf(TextIO.openIn infile); NextTok := BOF; inquote := false; setLexOut (TextIO.openOut(outfile)); StateNum := 2; resetLexPos (); StateTab := enter(create(String.<=))("INITIAL",1); LeafNum := ~1; let val (user_code,rules,ends) = parse() handle x => (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); OS.FileSys.remove outfile; raise x) val (fins,trans,tctab,tcpairs) = makedfa(rules) val _ = if !UsesTrailingContext then (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); OS.FileSys.remove outfile; prErr "lookahead is unimplemented") else () in if (!HeaderDecl) then (sayPos (SOME (!HeaderPos)) ; say (!HeaderCode) ; sayPos NONE) else say ("structure " ^ (!StrName)); say "=\n"; say skel_hd; sayPos (SOME {line = 1, col = 0}); say user_code; sayPos NONE; say "end (* end of user routines *)\n"; say "exception LexError (* raised if illegal leaf "; say "action tried *)\n"; say "structure Internal =\n\tstruct\n"; maketable(fins,tctab,tcpairs,trans); say "structure StartStates =\n\tstruct\n"; say "\tdatatype yystartstate = STARTSTATE of int\n"; makebegin(); say "\nend\n"; say "type result = UserDeclarations.lexresult\n"; say "\texception LexerError (* raised if illegal leaf "; say "action tried *)\n"; say "end\n\n"; say ("structure YYPosInt : INTEGER = " ^ (!PosIntName) ^ "\n"); say (if (!PosArg) then "fun makeLexer (yyinput,yygone0:YYPosInt.int) =\nlet\n" else "fun makeLexer yyinput =\nlet\tval yygone0= YYPosInt.fromInt ~1\n"); if !CountNewLines then say "\tval yylineno = ref 0\n\n" else (); say "\tval yyb = ref \"\\n\" \t\t(* buffer *)\n\ \\tval yybl = ref 1\t\t(*buffer length *)\n\ \\tval yybufpos = ref 1\t\t(* location of next character to use *)\n\ \\tval yygone = ref yygone0\t(* position in file of beginning of buffer *)\n\ \\tval yydone = ref false\t\t(* eof found yet? *)\n\ \\tval yybegin = ref 1\t\t(*Current 'start state' for lexer *)\n\ \\n\tval YYBEGIN = fn (Internal.StartStates.STARTSTATE x) =>\n\ \\t\t yybegin := x\n\n"; PrintLexer(ends); close_ibuf(!LexBuf); TextIO.closeOut(!LexOut) end) end end mlton-20210117+dfsg/mllex/main.sml000066400000000000000000000012731416264345000166130ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main = struct fun usage s = Process.usage {usage = "file.lex ...", msg = s} fun main args = let val rest = let open Popt in parse {switches = args, opts = []} end in case rest of Result.No msg => usage msg | Result.Yes [] => usage "no files" | Result.Yes files => List.foreach (files, LexGen.lexGen) end val main = Process.makeMain main end mlton-20210117+dfsg/mllex/mlex_int.doc000066400000000000000000000113251416264345000174570ustar00rootroot00000000000000This is minimal documentation for the lexer driver produced by ml-lex. Main data structures: The transition table is stored in tab. Tab is an array of records, indexed by state number. The first field of the record, fin, is a list of final leaves assocated with it. The second field of the record, trans, is a transition table for the state indexed by character number. It gives the next state for a given input character. The usual initial start state is state #1. State 0 is a dead state, which has transitions only to itself. The field yyfin has type yyfinstate list. yyfinstate consists of the following three constructors: * N of int - indicates normal end leaf. * D of int - dummy end leaf - for indicating when an end state for a trailing context regular expression has been reached. These are stored and propagated backwards when action is executed. * T of int - indicates an actual end leaf for a trailing context reg. expression, which should be executed only if D i was encountered after this end leaf while scanning forward. The dummy end leaf is removed from the backward propagating list after this node is encountered. The function scan inside the function lex operates as a transition function, scanning the input until it is no longer possible to take any more transitions. It accumulates a list of the accepting leaf list associated with each accepting state passed through. Scan operates as follows: Input: * s - current state * AcceptingLeaves - list of accepting leave lists. Each state has a list of accepting leaves associated with it. This list may be nil if the state is not a final state. * l - position of the next character in the buffer b to read * i0 - starting position in the buffer. Output: If no match is found, it raises the exception LexError. Otherwise, it returns a value of type lexresult. It operates as a transtion function: It (1) adds the list of accepting leaves for the current state to the list of accepting leave lists (2) tries to make a transition on the current input character to the next state. If it can't make a transition, it executes the action function. (a) - if it is past the end of the buffer, it (1) checks if it as at end eof. If it is then: It checks to see if it has made any transitions since it was first called - (l>i0 when this is true.) If it hasn't this implies that scan was called at the end of file. It thus executes eof function declared by the user. Otherwise it must execute action w/ the current accepting state list. (2) otherwise it reads a block of up to 1024 characters, and appends this block to the useful suffix of characters left in the buffer (those character which have been scanned in this call to lex()). The buffer operation should be altered if one intends to process reg. expressions whose lexemes' length will be >> 1024. For most normal applications, the buffer update operation will be fine. This buffer update operation requires O(n^2/1024) char. copies for lexemes > 1024 characters in length, and O(n) char. copies for lexemes <= 1024 characters in length. It can be made O(n) using linked list buffers & a Byte.array of size n (not the ^operator!) for concatenating the buffers to return a value for yytext when a lexeme is longer than the typical buffer length. (3) If the transition is to a dead state (0 is used for the dead state), action is executed instead. mlton-20210117+dfsg/mllex/mllex.mlb000066400000000000000000000011111416264345000167560ustar00rootroot00000000000000(* Copyright (C) 2009,2020 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local local local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb lexgen.sml in structure LexGen end local ../lib/mlton/sources.mlb main.sml in structure Main end in structure Main end in call-main.sml end mlton-20210117+dfsg/mlnlffigen/000077500000000000000000000000001416264345000161475ustar00rootroot00000000000000mlton-20210117+dfsg/mlnlffigen/.gitignore000066400000000000000000000000501416264345000201320ustar00rootroot00000000000000/cppcmd.sml /mlnlffigen /mlnlffigen.exe mlton-20210117+dfsg/mlnlffigen/Makefile000066400000000000000000000012521416264345000176070ustar00rootroot00000000000000## Copyright (C) 2018-2020 Matthew Fluet # Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### NAME := mlnlffigen all: $(NAME) $(NAME): $(NAME).mlb $(shell "$(RUN_MLTON_DEPS)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(RUN_MLTON)" @MLton $(RUN_MLTON_RUNTIME_ARGS) -- $(RUN_MLTON_COMPILE_ARGS) -target $(TARGET) $(NAME).mlb .PHONY: clean clean: $(SRC)/bin/clean cppcmd.sml : gen-cppcmd ./gen-cppcmd > $@ mlton-20210117+dfsg/mlnlffigen/README000066400000000000000000000432711416264345000170360ustar00rootroot00000000000000Copyright (c) 2001, 2002, Lucent Technologies, Bell Laboratories author: Matthias Blume (blume@research.bell-labs.com) This directory contains ML-NLFFI-Gen, a glue-code generator for the new "NLFFI" foreign function interface. The generator reads C source code and emits ML code along with a description file for CM. Compiling this generator requires the C-Kit ($/ckit-lib.cm) to be installed. --------------------------------------------------------------------- February 21, 2002: Major changes: I reworked the glue code generator in a way that lets generated code scale better -- at the expense of some (mostly academic) generality. Changes involve the following: 1. The functorization is gone. 2. Every top-level C declaration results in a separate top-level ML equivalent (implemented by its own ML source file). 3. Incomplete pointer types are treated just like their complete versions -- the only difference being that no RTTI will be available for them. In the "light" interface, this rules out precisely those operations over them that C would disallow. 4. All related C sources must be supplied to ml-nlffigen together. Types incomplete in one source but complete in another get automatically completed in a cross-file fashion. 5. The handle for the shared library to link to is now abstracted as a function closure. Moreover, it must be supplied as a top-level variable (by the programmer). For this purpose, ml-nlffigen has corresponding command-line options. These changes mean that even very large (in number of exported definitions) libraries such as, e.g., GTK can now be handled gracefully without reaching the limits of the ML compiler's abilities. [The example of GTK -- for which ml-nlffigen creates several thousands (!) of separate ML source files -- puts an unusal burden on CM, though. However, aside from running a bit longer than usual, CM handles loads of this magnitute just fine. Stabilizing the resulting library solves the problem entirely as far as later clients are concerned.] Sketch of translation- (and naming-) scheme: struct foo { ... } --> structure ST_foo in st-foo.sml (not exported) basic type info (name, size) & structure S_foo in s-foo.sml abstract interface to the type field accessors f_xxx (unless -light) and f_xxx' (unless -heavy) field types t_f_xxx field RTTI typ_f_xxx & (unless "-nosucvt" was set) structures IS_foo in /is-foo.sml (see discussion of struct *foo below) union foo { ... } --> structure UT_foo in ut-foo.sml (not exported) basic type info (name, size) & structure U_foo in u-foo.sml abstract interface to the type field accessors f_xxx (unless -light) and f_xxx' (unless -heavy) field types t_f_xxx field RTTI typ_f_xxx & (unless "-nosucvt" was set) structures IU_foo in /iu-foo.sml (see discussion of union *foo below) struct { ... } like struct { ... }, where is a fresh integer or 'bar if 'struct { ... }' occurs in the context of a 'typedef struct { ... } bar' union { ... } like union { ... }, where is a fresh integer or 'bar if 'union { ... }' occurs in the context of a 'typedef union { ... } bar' enum foo { ... } --> structure E_foo in e-foo.sml external type mlrep with enum constants e_xxx conversion functions between tag enum and mlrep between mlrep and sint access functions (get/set) that operate on mlrep (as an alternative to C.Get.enum/C.Set.enum which operate on sint) If the command-line optino "-ec" ("-enum-constructors") was set and the values of all enum constants are different from each other, then mlrep will be a datatype (thus making it possible to pattern-match). enum { ... } If this construct appears in the context of a surrounding (non-anonymous) struct or union or typedef, the enumeration gets assigned an artificial tag (just like similar structs and unions, see above). Unless the command-line option "-nocollect" was specified, then all constants in other (truly) unnamed enumerations will be collected into a single enumeration represented by structure E_'. This single enumeration is then treated like a regular enumeration (including handling of "-ec" -- see above). The default behavior ("collect") is to assign a fresh integer tag (again, just like in the struct/union case). T foo (T, ..., T) (global function/function prototype) --> structure F_foo in f-foo.sml containing three/four members: typ : RTTI fptr: thunkified fptr representing the C function maybe f' : light-weight function wrapper around fptr Turned off by -heavy (see below). maybe f : heavy-weight function wrapper around fptr Turned off by -light (see below). T foo; (global variable) --> structure G_foo in g-foo.sml containing three members: t : type typ : RTTI obj : thunkified object representing the C variable struct foo * (without existing definition of struct foo; incomplete type) --> an internal structure ST_foo with a type "tag" (just like in the struct foo { ... } case) The difference is that no structure S_foo will be generated, so there is no field-access interface and no RTTI (size or typ) for this. All "light-weight" functions referring to this pointer type will be generated, heavy-weight functions will be generated only if they do not require access to RTTI. If "-heavy" was specified but a heavy interface function cannot be generated because of incomplete types, then its light counterpart will be issued generated anyway. union foo * Same as with struct foo *, but replace S_foo with U_foo and ST_foo with UT_foo. Additional files for implementing function entry sequences are created and used internally. They do not contribute exports, though. Command-line options for ml-nlffigen: General syntax: ml-nlffigen output directory where all generated files are placed -d default: "NLFFI-Generated" -allSU instructs ml-nlffigen to include all structs and unions, even those that are defined in included files (as opposed to files explicitly listed as arguments) default: off -width sets output line width (just a guess) to -w default: 75 -smloption instructs ml-nlffigen to include into the list of options to annotate .sml entries in the generated .cm file with. By default, the list consists just of "noguid". -guid Removes the default "noguid" from the list of sml options. (This re-enables strict handling of type- and object-identity but can have negative impact on CM cutoff recompilation performance if the programmer routinely removes the entire tree of ml-nlffigen-generated files during development.) (* -lambdasplit instructs ml-nlffigen to generate "lambdasplit" -ls options for all ML files (see CM manual for what this means; it does not currently work anyway because cross-module inlining is broken). default: nothing *) -target Sets the target to (which must be one of "sparc-unix", -t "x86-unix", or "x86-win32"). default: current architecture -light suppress "heavy" versions of function wrappers and -l field accessors; also resets any earlier -heavy to default default: not suppressed -heavy suppress "light" versions of function wrappers and -h field accessors; also resets any earlier -light to default default: not suppressed -namedargs instruct ml-nlffigen to generated function wrappers that -na use named arguments (ML records) instead of tuples if there is enough information for this in the C source; (this is not always very useful) default: off -nocollect Do not do the following: Collect enum constants from truly unnamed enumerations (those without tags that occur at toplevel or in an unnamed context, i.e., not in a typedef or another named struct or union) into a single artificial enumeration tagged by ' (single apostrohe). The corresponding ML-side representative will be a structure named E_'. -enum-constructors -ec When possible (i.e., if all values of a given enumeration are different from each other), make the ML representation type of the enumeration a datatype. The default (and fallback) is to make that type the same as MLRep.Signed.int. -libhandle Use the variable to refer to the handle to the -lh shared library object. Given the constraints of CM, must have the form of a long ML identifier, e.g., MyLibrary.libhandle. default: Library.libh -include Mention file in the generated .cm file. This option -add is necessary at least once for providing the library handle. It can be used arbitrarily many times, resulting in more than one such programmer-supplied file to be mentioned. If is relative, then it must be relative to the directory specified in the -dir option. -cmfile Specify name of the generated .cm file, relative to -cm the directory specified by the -dir option. default: nlffi-generated.cm -cppopt The string gets added to the list of options to be passed to cpp (the C preprocessor). The list of options gets substituted for %o in the cpp command line template. -U The string -U gets added to the list of cpp options. -D The string -D gets added to the list of cpp options. -I The string -I gets added to the list of cpp options. -version Just write the version number of ml-nlffigen to standard output and then quit. -match Normally ml-nlffigen will include ML definitions for a C -m declaration if the C declaration textually appears in one of the files specified at the command line. Definitions in #include-d files will normally not appear (unless their absence would lead to inconsistencies). By specifying -match , ml-nlffigen will also include definitions that occur in recursively #include-d files for which the AWK-style regular expression matches their names. -prefix

    Generated ML structure names will all have prefix

    -p

    (in addition to the usual "S_" or "U_" or "F_" ...) -gensym Names "gensym-ed" by ml-nlffigen (for anonymous struct/union/ -g enums) will get an additional suffix _. (This should be used if output from several indepdendent runs of ml-nlffigen are to coexist in the same ML program.) -- Terminate processing of options, remaining arguments are taken to be C sources. ---------------------------------------------------------------------- Sample usage: Suppose we have a C interface defined in foo.h. 1. Running ml-nlffigen: It is best to let a tool such as Unix' "make" handle the invocation of ml-nlffigen. The following "Makefile" can be used as a template for other projects: +---------------------------------------------------------- |FILES = foo.h |H = FooH.libh |D = FFI |HF = ../foo-h.sml |CF = foo.cm | |$(D)/$(CF): $(FILES) | ml-nlffigen -include $(HF) -libhandle $(H) -dir $(D) -cmfile $(CF) $^ +---------------------------------------------------------- Suppose the above file is stored as "foo.make". Running $ make -f foo.make will generate a subdirectory "FFI" full of ML files corresponding to the definitions in foo.h. Access to the generated ML code is gained by refering to the CM library FFI/foo.cm; the .cm-file (foo.cm) is also produced by ml-nlffigen. 2. The ML code uses the library handle specified in the command line (here: FooH.libh) for dynamic linking. The type of FooH.libh must be: FooH.libh : string -> unit -> CMemory.addr That is, FooH.libh takes the name of a symbol and produces that symbol's suspended address. The code that implements FooH.libh must be provided by the programmer. In the above example, we assume that it is stored in file foo-h.sml. The name of that file must appear in the generated .cm-file, hence the "-include" command-line argument. Notice that the name provided to ml-nlffigen must be relative to the output directory. Therefore, in our case it is "../foo-h.sml" and not just foo-h.sml (because the full path would be FFI/../foo-h.sml). 3. To actually implement FooH.libh, use the "DynLinkage" module. Suppose the shared library's name is "/usr/lib/foo.so". Here is the corresponding contents of foo-h.sml: +------------------------------------------------------------- |structure FooH = struct | local | val lh = DynLinkage.open_lib | { name = "/usr/lib/foo.so", global = true, lazy = true } | in | fun libh s = let | val sh = DynLinkage.lib_symbol (lh, s) | in | fn () => DynLinkage.addr sh | end | end |end +------------------------------------------------------------- If all the symbols you are linking to are already available within the ML runtime system, then you don't need to open a new shared object. As a result, your FooH implementation would look like this: +------------------------------------------------------------- |structure FooH = struct | fun libh s = let | val sh = DynLinkage.lib_symbol (DynLinkage.main_lib, s) | in | fn () => DynLinkage.addr sh | end |end +------------------------------------------------------------- If the symbols your are accessing are strewn across several separate shared objects, then there are two possible solutions: a) Open several shared libraries and perform a trial-and-error search for every symbol you are looking up. (The DynLinkage module raises an exception (DynLinkError of string) if the lookup fails. This could be used to daisy-chain lookup operations.) [Be careful: Sometimes there are non-obvious inter-dependencies between shared libraries. Consider using DynLinkage.open_lib' to express those.] b) A simpler and more robust way of accessing several shared libraries is to create a new "summary" library object at the OS level. Supposed you are trying to access /usr/lib/foo.so and /usr/lib/bar.so. The solution is to make a "foobar.so" object by saying: $ ld -shared -o foobar.so /usr/lib/foo.so /usr/lib/bar.so The ML code then referes to foobar.so and the Linux dynamic loader does the rest. 4. To put it all together, let's wrap it up in a .cm-file. For example, if we simply want to directly make the ml-nlffigen-generated definitions available to the "end user", we could write this wrapper .cm-file (let's call it foo.cm): +------------------------------------------------------------- |library | library(FFI/foo.cm) |is | $/basis.cm | $/c.cm | FFI/foo.cm : make (-f foo.make) +------------------------------------------------------------- Now, saying $ sml -m foo.cm is all one need's to do in order to compile. (CM will automatically invoke "make", so you don't have to run "make" separately.) If the goal is not to export the "raw" ml-nlffigen-generated stuff but rather something more nicely "wrapped", consider writing wrapper ML code. Suppose you have wrapper definitions for structure Foo_a and structure Foo_b with code for those in wrap-foo-a.sml and wrap-foo-b.sml. In this case the corresponding .cm-file would look like the following: +------------------------------------------------------------- |library | structure Foo_a | structure Foo_b |is | $/basis.cm | $/c.cm | FFI/foo.cm : make (-f foo.make) | wrapper-foo-a.sml | wrapper-foo-b.sml +------------------------------------------------------------- mlton-20210117+dfsg/mlnlffigen/README.mlton000066400000000000000000000005041416264345000201560ustar00rootroot00000000000000This is a (heavily) modified version of the ml-nlffigen directory that comes with SML/NJ version 110.52. The sources have been modified to generate MLNLFFI Library clients that are compatible with MLton's native FFI. At the current time, functions with struct/union arguments are not supported. mfluet@acm.org 2005-02-12 mlton-20210117+dfsg/mlnlffigen/ast-to-spec.sml000066400000000000000000000530021416264345000210230ustar00rootroot00000000000000(* ast-to-spec.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * ast-to-spec.sml - Conversion from CKIT "ast" to a "spec" (see spec.sml). * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure AstToSpec = struct structure A = Ast structure B = Bindings structure SS = StringSet structure SM = StringMap datatype context = CONTEXT of { gensym: unit -> string, anon: bool } exception VoidType exception Ellipsis exception Duplicate of string exception SkipFunction of string fun bug m = raise Fail ("AstToSpec: bug: " ^ m) fun err m = raise Fail ("AstToSpec: error: " ^ m) fun warn m = TextIO.output (TextIO.stdErr, "AstToSpec: warning: " ^ m) fun build { bundle, sizes: Sizes.sizes, collect_enums, cfiles, match, allSU, eshift, gensym_suffix } = let val curLoc = ref "?" fun warnLoc m = warn (concat [!curLoc, ": ", m]) val { ast, tidtab, errorCount, warningCount, auxiliaryInfo = { aidtab, implicits, env } } = bundle fun realFunctionDefComing sy = let fun isTheDef (A.DECL (A.FunctionDef (id, _, _), _, _)) = Symbol.equal (#name id, sy) | isTheDef _ = false in List.exists isTheDef ast end val srcOf = SourceMap.locToString fun isThisFile SourceMap.UNKNOWN = false | isThisFile (SourceMap.LOC { srcFile, ... }) = List.exists (fn f => f = srcFile) cfiles orelse match srcFile fun includedSU (tag, loc) = (allSU orelse isThisFile loc) fun includedEnum (tag, loc) = isThisFile loc fun includedTy (n, loc) = isThisFile loc fun isFunction t = TypeUtil.isFunction tidtab t fun getFunction t = TypeUtil.getFunction tidtab t fun getCoreType t = TypeUtil.getCoreType tidtab t fun constness t = if TypeUtil.isConst tidtab t then Spec.RO else case getCoreType t of A.Array (_, t) => constness t | _ => Spec.RW val sizerec = { sizes = sizes, err = err, warn = warn, bug = bug } fun sizeOf t = #bytes (Sizeof.byteSizeOf sizerec tidtab t) val bytebits = #bits (#char sizes) val intbits = #bits (#int sizes) val intalign = #align (#int sizes) fun getField (m, l) = Sizeof.getField sizerec (m, l) fun fieldOffsets t = case Sizeof.fieldOffsets sizerec tidtab t of NONE => bug "no field offsets" | SOME l => l val structs = ref [] val unions = ref [] val gtys = ref SM.empty val gvars = ref SM.empty val gfuns = ref SM.empty val named_enums = ref SM.empty val anon_enums = ref SM.empty val seen_structs = ref SS.empty val seen_unions = ref SS.empty val nexttag = ref 0 val tags = Tidtab.uidtab () : (string * bool) Tidtab.uidtab fun mk_context_td tdname = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; concat ["'", if n = 0 then "" else Int.toString n, tdname] end, anon = false } end fun mk_context_su (parent_tag, anon) = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; concat [parent_tag, "'", Int.toString n] end, anon = anon } end val tl_context = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; Int.toString n end, anon = true } end fun tagname (SOME t, _, _) = (t, false) | tagname (NONE, CONTEXT { gensym, anon }, tid) = (case Tidtab.find (tags, tid) of SOME ta => ta | NONE => let val t = gensym () in Tidtab.insert (tags, tid, (t, anon)); (t, anon) end) fun reported_tagname (t, false) = t | reported_tagname (t, true) = t ^ gensym_suffix fun valty C A.Void = raise VoidType | valty C A.Ellipses = raise Ellipsis | valty C (A.Qual (q, t)) = valty C t | valty C (A.Numeric (_, _, A.SIGNED, A.CHAR, _)) = Spec.BASIC Spec.SCHAR | valty C (A.Numeric (_, _, A.UNSIGNED, A.CHAR, _)) = Spec.BASIC Spec.UCHAR | valty C (A.Numeric (_, _, A.SIGNED, A.SHORT, _)) = Spec.BASIC Spec.SSHORT | valty C (A.Numeric (_, _, A.UNSIGNED, A.SHORT, _)) = Spec.BASIC Spec.USHORT | valty C (A.Numeric (_, _, A.SIGNED, A.INT, _)) = Spec.BASIC Spec.SINT | valty C (A.Numeric (_, _, A.UNSIGNED, A.INT, _)) = Spec.BASIC Spec.UINT | valty C (A.Numeric (_, _, A.SIGNED, A.LONG, _)) = Spec.BASIC Spec.SLONG | valty C (A.Numeric (_, _, A.UNSIGNED, A.LONG, _)) = Spec.BASIC Spec.ULONG | valty C (A.Numeric (_, _, A.SIGNED, A.LONGLONG, _)) = Spec.BASIC Spec.SLONGLONG | valty C (A.Numeric (_, _, A.UNSIGNED, A.LONGLONG, _)) = Spec.BASIC Spec.ULONGLONG | valty C (A.Numeric (_, _, _, A.FLOAT, _)) = Spec.BASIC Spec.FLOAT | valty C (A.Numeric (_, _, _, A.DOUBLE, _)) = Spec.BASIC Spec.DOUBLE | valty C (A.Numeric (_, _, _, A.LONGDOUBLE, _)) = Spec.UNIMPLEMENTED "long double" | valty C (A.Array (NONE, t)) = valty C (A.Pointer t) | valty C (A.Array (SOME (n, _), t)) = let val d = Int.fromLarge n in if d < 0 then err "negative dimension" else Spec.ARR { t = valty C t, d = d, esz = sizeOf t } end | valty C (A.Pointer t) = (case getCoreType t of A.Void => Spec.VOIDPTR | A.Function f => fptrty C f | _ => Spec.PTR (cobj C t)) | valty C (A.Function f) = fptrty C f | valty C (A.StructRef tid) = typeref (tid, Spec.STRUCT, C) | valty C (A.UnionRef tid) = typeref (tid, Spec.UNION, C) | valty C (A.EnumRef tid) = typeref (tid, fn t => Spec.ENUM (t, false), C) | valty C (A.TypeRef tid) = typeref (tid, fn _ => bug "missing typedef info", C) | valty C A.Error = err "Error type" and valty_nonvoid C t = valty C t handle VoidType => err "void variable type" and fun_valty_nonvoid C t = case valty_nonvoid C t of Spec.STRUCT tag => raise SkipFunction "struct argument not supported" | Spec.UNION tag => raise SkipFunction "union argument not supported" | ty => ty and typeref (tid, otherwise, C) = case Tidtab.find (tidtab, tid) of NONE => bug "tid not bound in tidtab" | SOME { name = SOME n, ntype = NONE, ... } => otherwise n | SOME { name = NONE, ntype = NONE, ... } => bug "both name and ntype missing in tidtab binding" | SOME { name, ntype = SOME nct, location, ... } => (case nct of B.Struct (tid, members) => structty (tid, name, C, members, location) | B.Union (tid, members) => unionty (tid, name, C, members, location) | B.Enum (tid, edefs) => enumty (tid, name, C, edefs, location) | B.Typedef (_, t) => let val n = case name of NONE => bug "missing name in typedef" | SOME n => n val C' = mk_context_td n val res = valty C' t fun sameName { src, name, spec } = name = n in if includedTy (n, location) andalso not (SM.inDomain (!gtys, n)) then gtys := SM.insert (!gtys, n, { src = srcOf location, name = n, spec = res }) else (); res end) and enumty (tid, name, C, edefs, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) fun one ({ name, uid, location, ctype, kind }, i) = { name = Symbol.name name, spec = i } val enums = if anon then anon_enums else named_enums in enums := SM.insert (!enums, tag, { src = srcOf location, tag = tag, anon = anon, descr = tag, exclude = not (includedEnum (tag, location)), spec = map one edefs }); Spec.ENUM (tag, anon) end and structty (tid, name, C, members, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) val ty = Spec.STRUCT tag val C' = mk_context_su (tag_stem, anon) in if SS.member (!seen_structs, tag) then () else let val _ = seen_structs := SS.add (!seen_structs, tag) val fol = fieldOffsets (A.StructRef tid) val ssize = sizeOf (A.StructRef tid) fun bfspec (offset, bits, shift, (c, t)) = let val offset = offset val bits = Word.fromLargeInt bits val shift = eshift (shift, intbits, bits) val r = { offset = offset, constness = c, bits = bits, shift = shift } in case t of Spec.BASIC Spec.UINT => Spec.UBF r | Spec.BASIC Spec.SINT => Spec.SBF r | _ => err "non-int bitfield" end fun synthetic (synth, (_, false), _) = ([], synth) | synthetic (synth, (endp, true), startp) = if endp = startp then ([], synth) else ([{ name = Int.toString synth, spec = Spec.OFIELD { offset = endp, spec = (Spec.RW, Spec.ARR { t = Spec.BASIC Spec.UCHAR, d = startp - endp, esz = 1 }), synthetic = true } }], synth+1) fun build ([], synth, gap) = #1 (synthetic (synth, gap, ssize)) | build ((t, SOME m, NONE) :: rest, synth, gap) = let val bitoff = #bitOffset (getField (m, fol)) val bytoff = bitoff div bytebits val (filler, synth) = synthetic (synth, gap, bytoff) val endp = bytoff + sizeOf t in if bitoff mod bytebits <> 0 then bug "non-bitfield not on byte boundary" else filler @ { name = Symbol.name (#name m), spec = Spec.OFIELD { offset = bytoff, spec = cobj C' t, synthetic = false } } :: build (rest, synth, (endp, false)) end | build ((t, SOME m, SOME b) :: rest, synth, gap) = let val bitoff = #bitOffset (getField (m, fol)) val bytoff = (intalign * (bitoff div intalign)) div bytebits val gap = (#1 gap, true) in { name = Symbol.name (#name m), spec = bfspec (bytoff, b, bitoff mod intalign, cobj C' t) } :: build (rest, synth, gap) end | build ((t, NONE, SOME _) :: rest, synth, gap) = build (rest, synth, (#1 gap, true)) | build ((_, NONE, NONE) :: _, _, _) = bug "unnamed struct member (not bitfield)" val fields = build (members, 0, (0, false)) in structs := { src = srcOf location, tag = tag, anon = anon, size = Word.fromInt ssize, exclude = not (includedSU (tag, location)), fields = fields } :: !structs end; ty end and unionty (tid, name, C, members, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) val C' = mk_context_su (tag_stem, anon) val ty = Spec.UNION tag val lsz = ref 0 fun mkField (t, m: A.member) = let val sz = sizeOf t in { name = Symbol.name (#name m), spec = Spec.OFIELD { offset = 0, spec = cobj C' t, synthetic = false } } end in if SS.member (!seen_unions, tag) then () else let val _ = seen_unions := SS.add (!seen_unions, tag) val all = map mkField members in unions := { src = srcOf location, tag = tag, anon = anon, size = Word.fromInt (sizeOf (A.UnionRef tid)), exclude = not (includedSU (tag, location)), all = all } :: !unions end; ty end and cobj C t = (constness t, valty_nonvoid C t) and fptrty C f = Spec.FPTR (cft C f) and cft C (res, args) = { res = case getCoreType res of A.Void => NONE | _ => SOME (valty_nonvoid C res), args = case args of [(arg, _)] => (case getCoreType arg of A.Void => [] | _ => [fun_valty_nonvoid C arg]) | _ => let fun build [] = [] | build [(x, _)] = ([fun_valty_nonvoid C x] handle Ellipsis => (warnLoc ("varargs not supported; \ \ignoring the ellipsis\n"); [])) | build ((x, _) :: xs) = fun_valty_nonvoid C x :: build xs in build args end } fun ft_argnames (res, args) = let val optids = map (fn (_, optid) => optid) args in if List.exists (not o isSome) optids then NONE else SOME (map valOf optids) end fun functionName (f: A.id, ailo: A.id list option) = let val n = Symbol.name (#name f) val anlo = Option.map (map (Symbol.name o #name)) ailo in if n = "_init" orelse n = "_fini" orelse SM.inDomain (!gfuns, n) then () else let fun doit () = (case getFunction (#ctype f) of SOME fs => gfuns := SM.insert (!gfuns, n, { src = !curLoc, name = n, spec = cft tl_context fs, argnames = anlo }) | NONE => bug "function without function type") handle SkipFunction reason => warnLoc (reason ^ "; skipping function\n") in case #stClass f of A.EXTERN => doit () | A.DEFAULT => doit () | A.AUTO => () | A.REGISTER => () | A.STATIC => () end end fun varDecl (v: A.id) = let fun doit () = (case getFunction (#ctype v) of SOME fs => if realFunctionDefComing (#name v) then () else functionName (v, ft_argnames fs) | NONE => let val n = Symbol.name (#name v) in if SM.inDomain (!gvars, n) then () else gvars := SM.insert (!gvars, n, { src = !curLoc, name = n, spec = cobj tl_context (#ctype v) }) end) in case #stClass v of A.EXTERN => doit () | A.DEFAULT => doit () | A.AUTO => () | A.REGISTER => () | A.STATIC => () end fun dotid tid = (* Spec.SINT is an arbitrary choice; the value gets * ignored anyway *) (ignore (typeref (tid, fn _ => Spec.BASIC Spec.SINT, tl_context)) handle VoidType => ()) (* ignore type aliases for void *) fun declaration (A.TypeDecl { tid, ... }) = dotid tid | declaration (A.VarDecl (v, _)) = varDecl v fun coreExternalDecl (A.ExternalDecl d) = declaration d | coreExternalDecl (A.FunctionDef (f, argids, _)) = functionName (f, SOME argids) | coreExternalDecl (A.ExternalDeclExt _) = () fun externalDecl (A.DECL (d, _, l)) = if isThisFile l then (curLoc := SourceMap.locToString l; coreExternalDecl d) else () fun doast l = app externalDecl l fun gen_enums () = let val ael = SM.listItems (!anon_enums) val nel = SM.listItems (!named_enums) infix $ fun x $ [] = [x] | x $ y = x :: ", " :: y fun onev (v as { name, spec }, m) = if SM.inDomain (m, name) then raise Duplicate name else SM.insert (m, name, v) fun onee ({ src, tag, anon, spec, descr, exclude }, (m, sl)) = (foldl onev m spec, src $ sl) in if collect_enums then let val (m, sl) = foldl onee (SM.empty, []) ael in if SM.isEmpty m then nel else { src = concat (rev sl), tag = "'", anon = false, descr = "collected from unnamed enumerations", exclude = false, spec = SM.listItems m } :: nel end handle Duplicate name => (warn (concat ["constant ", name, " defined more than once;\ \ disabling `-collect'\n"]); ael @ nel) else ael @ nel end in doast ast; app (dotid o #1) (Tidtab.listItemsi tidtab); { structs = !structs, unions = !unions, gtys = SM.listItems (!gtys), gvars = SM.listItems (!gvars), gfuns = SM.listItems (!gfuns), enums = gen_enums () } : Spec.spec end end mlton-20210117+dfsg/mlnlffigen/call-main.sml000066400000000000000000000004201416264345000205150ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20210117+dfsg/mlnlffigen/control.sig000066400000000000000000000026631416264345000203420ustar00rootroot00000000000000(* Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CONTROL = sig (* set all flags to their default values *) val defaults: unit -> unit (*------------------------------------*) (* Begin Flags *) (*------------------------------------*) val debug : bool ref val allSU : bool ref val collect_enums : bool ref val cppopts : string list ref val dir : string ref val enum_cons : bool ref val extramembers : string list ref val gensym : string ref val libhandle : string ref structure Linkage : sig datatype t = Archive | Dynamic | Shared end val linkage : Linkage.t ref val match : (string -> bool) ref val mlbfile : string ref val namedargs : bool ref val prefix : string ref structure Target : sig type t val fromString : string -> t option val make: t -> {name: string, sizes: Sizes.sizes, endianShift: Endian.shift} option end val target: {name: string, sizes: Sizes.sizes, endianShift: Endian.shift} option ref val weight: {heavy: bool, light: bool} ref val width : int ref end mlton-20210117+dfsg/mlnlffigen/control.sml000066400000000000000000000117051416264345000203500ustar00rootroot00000000000000(* Copyright (C) 2004-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Control: CONTROL = struct structure C = Control () open C val debug = control {name = "debug", default = false, toString = Bool.toString} val allSU = control {name = "allSU", default = false, toString = Bool.toString} val collect_enums = control {name = "collect_enums", default = true, toString = Bool.toString} val cppopts = control {name = "cppopts", default = [], toString = List.toString (fn s => s)} val dir = control {name = "dir", default = "NLFFI-Generated", toString = fn s => s} val enum_cons = control {name = "enum_cons", default = false, toString = Bool.toString} val extramembers = control {name = "extramembers", default = [], toString = List.toString (fn s => s)} val gensym = control {name = "gensym", default = "", toString = fn s => s} val libhandle = control {name = "libhandle", default = "Library.libh", toString = fn s => s} structure Linkage = struct datatype t = Archive | Dynamic | Shared val toString = fn Archive => "archive" | Dynamic => "dynamic" | Shared => "shared" end val linkage = control {name = "linkage", default = Linkage.Dynamic, toString = Linkage.toString} val match = control {name = "match", default = fn _ => false, toString = fn _ => ""} val mlbfile = control {name = "mlbfile", default = "nlffi-generated.mlb", toString = fn s => s} val namedargs = control {name = "namedargs", default = false, toString = Bool.toString} val prefix = control {name = "prefix", default = "", toString = fn s => s} structure Target = struct open MLton.Platform datatype arch = datatype Arch.t datatype os = datatype OS.t datatype t = T of {arch: arch, os: os} val host = T {arch = Arch.host, os = OS.host} fun toString (T {arch, os}) = concat [Arch.toString arch, "-", OS.toString os] fun fromString s = case String.split (s, #"-") of [arch, os] => (case (Arch.fromString arch, OS.fromString os) of (SOME arch, SOME os) => SOME (T {arch = arch, os = os}) | _ => NONE) | _ => NONE fun make (t as T {arch, os}) = case (arch, os) of (AMD64, _) => SOME {name = toString t, sizes = SizesAMD64.sizes, endianShift = EndianLittle.shift} | (HPPA, _) => SOME {name = toString t, sizes = SizesHPPA.sizes, endianShift = EndianBig.shift} | (IA64, Hurd) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianBig.shift} | (IA64, HPUX) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianBig.shift} | (IA64, Linux) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianLittle.shift} | (Sparc, _) => SOME {name = toString t, sizes = SizesSparc.sizes, endianShift = EndianBig.shift} | (PowerPC, _) => SOME {name = toString t, sizes = SizesPPC.sizes, endianShift = EndianLittle.shift} | (PowerPC64, _) => SOME {name = toString t, sizes = SizesPowerPC64.sizes, endianShift = EndianLittle.shift} | (X86, _) => SOME {name = toString t, sizes = SizesX86.sizes, endianShift = EndianLittle.shift} | _ => NONE end val target = control {name = "target", default = Target.make Target.host, toString = Option.toString (fn {name, ...} => name)} val weight = control {name = "weight", default = {heavy = true, light = true}, toString = fn {heavy, light} => concat ["{heavy = ", Bool.toString heavy, ", light = ", Bool.toString light, "}"]} val width = control {name = "width", default = 75, toString = Int.toString} val defaults = setDefaults val _ = defaults () end mlton-20210117+dfsg/mlnlffigen/cpif-dev.sml000066400000000000000000000047031416264345000203650ustar00rootroot00000000000000(* cpif-dev.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* cpif-dev.sml * A simple pretty-printing device that eventually writes to a * text file unless the current contents of that file coincides * with what's being written. * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure CPIFDev : sig include PP_DEVICE val openOut : string * int -> device val closeOut : device -> unit end = struct datatype device = DEV of { filename: string, buffer : string list ref, wid : int option ref } (* no style support *) type style = unit fun sameStyle _ = true fun pushStyle _ = () fun popStyle _ = () fun defaultStyle _ = () (* Allocate an empty buffer and remember the file name. *) fun openOut (f, w) = DEV { filename = f, buffer = ref [], wid = ref (SOME w) } (* Calculate the final output and compare it with the current * contents of the file. If they do not coincide, write the file. *) fun closeOut (DEV { buffer = ref l, filename, ... }) = let val s = concat (rev l) fun write () = let val f = TextIO.openOut filename in TextIO.output (f, s); TextIO.closeOut f end in let val f = TextIO.openIn filename val s' = TextIO.inputAll f in TextIO.closeIn f; if s = s' then () else write () end handle _ => write () end (* placeholders for the unsupported property functions *) fun maxDepth _ = NONE fun depth _ = NONE (* DEPRECATED *) fun setMaxDepth _ = () fun ellipses _ = ("", 0) fun setEllipses _ = () fun setEllipsesWithSz _ = () fun maxIndent _ = NONE fun setMaxIndent _ = () fun textWidth _ = NONE fun setTextWidth _ = () (* the width of the device *) fun lineWidth (DEV{wid, ...}) = !wid fun setLineWidth (DEV{wid, ...}, w) = wid := w (* output a string/character in the current style to the device *) fun string (DEV { buffer, ... }, s) = buffer := s :: !buffer (* output some number of spaces to the device *) fun space (d, n) = string (d, StringCvt.padLeft #" " n "") val indent = space (* output a new-line to the device *) fun newline d = string (d, "\n") fun char (d, c) = string (d, String.str c) (* nothing to flush *) fun flush d = () end mlton-20210117+dfsg/mlnlffigen/endian-big.sml000066400000000000000000000004271416264345000206640ustar00rootroot00000000000000(* * endian-big.sml - How to get at a bit field on a "big endian" machine. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure EndianBig = struct fun shift (s: int, ib: int, b: word) = Word.fromInt s end mlton-20210117+dfsg/mlnlffigen/endian-little.sml000066400000000000000000000004531416264345000214170ustar00rootroot00000000000000(* * endian-little.sml - How to get at a bit field on a "little endian" machine. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure EndianLittle = struct fun shift (s: int, ib: int, b: word) = Word.fromInt (ib - s) - b end mlton-20210117+dfsg/mlnlffigen/endian.sml000066400000000000000000000001201416264345000201130ustar00rootroot00000000000000structure Endian = struct type shift = int * int * word -> word end mlton-20210117+dfsg/mlnlffigen/gen-cppcmd000077500000000000000000000010161416264345000201100ustar00rootroot00000000000000#!/usr/bin/env bash set -e dir=`dirname "$0"` src=`cd "$dir/.." && pwd` eval `"$src/bin/platform"` output () { echo "val defaultCppCmd = \"gcc $1 -E -U__GNUC__ %o %s > %t\"" } # The flags here should match the flags used by mlton. At least the # 64 vs 32 bit flags have an effect on what the system headers look # like. case "$HOST_OS-$HOST_ARCH" in aix-*) output "-maix64" ;; *-ia64) output "-mlp64" ;; *-amd64) output "-m64" ;; *-x86) output "-m32" ;; *-sparc) output "-m32" ;; *) output "" ;; esac mlton-20210117+dfsg/mlnlffigen/gen.sml000066400000000000000000001631761416264345000174530ustar00rootroot00000000000000(* gen.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. (* Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) *) (* * gen.sml - Generating and pretty-printing ML code implementing a * typed interface to a C program. * * (C) 2004 The Fellowship of SML/NJ * * author: Matthias Blume (blume@tti-c.org) *) structure Gen : sig val gen : {cfiles: string list} -> unit end = struct structure Linkage = Control.Linkage structure P = PrettyPrint structure PP = P.PP structure S = Spec structure IM = IntMap structure LIS = LargeIntSet structure SM = StringMap structure SS = StringSet exception Incomplete val Tuple = P.TUPLE fun Record [] = P.Unit | Record l = P.RECORD l val Con = P.CON val Arrow = P.ARROW val Type = P.Type val Unit = P.Unit val ETuple = P.ETUPLE val EUnit = ETuple [] fun ERecord [] = P.ETUPLE [] | ERecord l = P.ERECORD l val EVar = P.EVAR val EApp = P.EAPP val EConstr = P.ECONSTR val ESeq = P.ESEQ val EPrim = P.EPRIM val ELet = P.ELET fun EWord w = EVar ("0wx" ^ Word.toString w) fun EInt i = EVar (Int.toString i) fun ELInt i = EVar (LargeInt.toString i) fun EString s = EVar (concat ["\"", String.toString s, "\""]) fun warn m = Out.output (Out.error, "warning: " ^ m) fun err m = raise Fail (concat ("gen: " :: m)) fun unimp what = raise Fail ("unimplemented type: " ^ what) fun unimp_arg what = raise Fail ("unimplemented argument type: " ^ what) fun unimp_res what = raise Fail ("unimplemented result type: " ^ what) val writeto = "write'to" fun gen args = let val {cfiles} = args val allSU = !Control.allSU val collect_enums = !Control.collect_enums val dir = !Control.dir val enum_cons = !Control.enum_cons val extramembers = !Control.extramembers val gensym = !Control.gensym val libhandle = !Control.libhandle val linkage = !Control.linkage val match = !Control.match val mlbfile = !Control.mlbfile val namedargs = !Control.namedargs val prefix = !Control.prefix val target = valOf (!Control.target) val weight = !Control.weight val width = !Control.width val gensym_suffix = if gensym = "" then "" else "_" ^ gensym val {name = targetName, sizes = targetSizes, endianShift = targetEndianShift} = target val targetName = String.toLower targetName val {heavy = doheavy, light = dolight} = weight val hash_cft = Hash.mkFHasher () val hash_mltype = Hash.mkTHasher () val $? = SM.find val %? = IM.find local val program = "ml-nlffigen" val version = "0.9.1" val author = "Matthias Blume" val email = "blume@tti-c.org" val modifications = [{author = "Matthew Fluet", email = "mfluet@acm.org", note = "Adapted for MLton."}] val credits = concat (["(* [by ", author, "'s ", program, " (version ", version, ") for ", targetName, "] *)"] @ (map (fn {author, email, note} => concat ["\n(* [modified by ", author, " (", email, ") <", note, ">] *)"])) modifications) val commentsto = concat ["(* Send comments and suggestions to ", email, ". Thanks! *)"] val dontedit = "(* This file has been generated automatically. DO NOT EDIT! *)" in fun openPP (f, src) = let val device = CPIFDev.openOut (f, width) val stream = PP.openStream device fun nl () = PP.newline stream fun str s = PP.string stream s fun sp () = PP.space stream 1 fun nsp () = PP.nbSpace stream 1 fun Box a = PP.openBox stream (PP.Abs a) fun HBox () = PP.openHBox stream fun HVBox x = PP.openHVBox stream x fun HOVBox a = PP.openHOVBox stream (PP.Abs a) fun VBox a = PP.openVBox stream (PP.Abs a) fun endBox () = PP.closeBox stream fun ppty t = P.ppType stream t fun ppExp e = P.ppExp stream e fun ppFun x = P.ppFun stream x fun line s = (nl (); str s) fun pr_vdef (v, e) = (nl (); HOVBox 4 ; str "val"; nsp (); str v; nsp (); str "=" ; sp (); ppExp e ; endBox ()) fun pr_fdef (f, args, res) = (nl (); ppFun (f, args, res)) fun pr_decl (keyword, connector) (v, t) = (nl (); HOVBox 4 ; str keyword; nsp (); str v; nsp (); str connector; sp (); ppty t ; endBox ()) val pr_tdef = pr_decl ("type", "=") val pr_vdecl = pr_decl ("val", ":") fun closePP () = (PP.closeStream stream; CPIFDev.closeOut device) in str dontedit; case src of NONE => () | SOME s => (nl (); str (concat ["(* [from code at ", s, "] *)"])); line credits; line commentsto; nl (); {stream = stream, line = line, nl = nl, str = str, sp = sp, nsp = nsp, Box = Box, endBox = endBox, HVBox = HVBox, HBox = HBox, HOVBox = HOVBox, VBox = VBox, ppty = ppty, ppExp = ppExp, ppFun = ppFun, pr_vdef = pr_vdef, pr_fdef = pr_fdef, pr_tdef = pr_tdef, pr_vdecl = pr_vdecl, closePP = closePP} end end local val cpp_tmpl = Option.fold (Process.getEnv "FFIGEN_CPP", defaultCppCmd, fn (cpp_tmpl,_) => cpp_tmpl) val cpp_tmpl = String.substituteFirst (cpp_tmpl, {substring = "%o", replacement = String.concatWith (List.rev (!Control.cppopts), " ")}) fun mkidlsource (cfile,ifile) = let val cpp = List.fold ([{substring = "%s", replacement = cfile}, {substring = "%t", replacement = ifile}], cpp_tmpl, fn (s, subst) => String.substituteFirst (subst, s)) in Process.system cpp end fun getSpec (cfile, s) = File.withTemp (fn ifile => let val () = mkidlsource (cfile, ifile) val astbundle = ParseToAst.fileToAst' Out.error (targetSizes, State.INITIAL) ifile val s' = AstToSpec.build {bundle = astbundle, sizes = targetSizes, collect_enums = collect_enums, cfiles = cfiles, match = match, allSU = allSU, eshift = targetEndianShift, gensym_suffix = gensym_suffix} in S.join (s', s) end) in val spec = List.fold (cfiles, S.empty, getSpec) end val {structs, unions, gvars, gfuns, gtys, enums} = spec val (structs, unions, enums) = let val structs = List.fold (structs, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val unions = List.fold (unions, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val enums = List.fold (enums, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val sdone = ref SS.empty val udone = ref SS.empty val edone = ref SS.empty val smap = ref SM.empty val umap = ref SM.empty val emap = ref SM.empty val ty_queue = ref [] fun ty_sched ty = List.push (ty_queue, ty) fun fs_sched (S.OFIELD { spec = (_, ty), ... }) = ty_sched ty | fs_sched _ = () fun f_sched { name, spec } = fs_sched spec fun xenter (xdone, xall, xmap, xfields) t = if SS.member (!xdone, t) then () else (xdone := SS.add (!xdone, t); case $? (xall, t) of SOME x => (xmap := SM.insert (!xmap, t, x); app f_sched (xfields x)) | NONE => ()) val senter = xenter (sdone, structs, smap, #fields) val uenter = xenter (udone, unions, umap, #all) val eenter = xenter (edone, enums, emap, fn _ => []) fun sinclude (s: S.s) = if #exclude s then () else senter (#tag s) fun uinclude (u: S.u) = if #exclude u then () else uenter (#tag u) fun einclude (e: S.enum) = if #exclude e then () else eenter (#tag e) fun gty {src, name, spec} = ty_sched spec fun gvar {src, name, spec = (_, t)} = ty_sched t fun gfun {src, name, spec, argnames} = ty_sched (S.FPTR spec) fun loop tys = let fun do_ty ty = case ty of S.BASIC _ => () | S.STRUCT t => senter t | S.UNION t => uenter t | S.ENUM (t, anon) => if collect_enums andalso anon then eenter "'" else eenter t | S.VOIDPTR => () | S.FPTR {args, res} => (List.foreach (args, do_ty); Option.app (res, do_ty)) | S.PTR (_, S.STRUCT t) => () | S.PTR (_, S.UNION t) => () | S.PTR (_, t) => do_ty t | S.ARR {t, ... } => do_ty t | S.UNIMPLEMENTED _ => () fun ty_loop tys = case tys of [] => nextround () | ty :: tys => (do_ty ty; ty_loop tys) in case tys of [] => () | _ => (ty_queue := []; ty_loop tys) end and nextround () = loop (!ty_queue) in SM.app sinclude structs; SM.app uinclude unions; SM.app einclude enums; app gty gtys; app gvar gvars; app gfun gfuns; nextround (); (!smap, !umap, !emap) end val (fptr_types,incomplete_structs, incomplete_unions, incomplete_enums) = let fun taginsert (t, ss) = if SS.member (ss, t) then ss else SS.add (ss, t) fun sinsert (t, (f, s, u, e)) = (f, taginsert (t, s), u, e) fun uinsert (t, (f, s, u, e)) = (f, s, taginsert (t, u), e) fun einsert (t, (f, s, u, e)) = (f, s, u, taginsert (t, e)) fun maybe_insert (t, ss, acc, insert) = case $? (ss, t) of SOME _ => acc | NONE => insert (t, acc) fun do_ty (ty, acc) = case ty of S.BASIC _ => acc | S.STRUCT t => maybe_insert (t, structs, acc, sinsert) | S.UNION t => maybe_insert (t, unions, acc, uinsert) | S.ENUM (t, anon) => if collect_enums andalso anon then acc else maybe_insert (t, enums, acc, einsert) | S.VOIDPTR => acc | S.FPTR (cft as {args, res}) => let val acc as (f, s, u, e) = Option.fold (res, List.fold (args, acc, do_ty), do_ty) val cfth = hash_cft cft val i = IM.numItems f in if IM.inDomain (f, cfth) then acc else (IM.insert (f, cfth, (cft, i)), s, u, e) end | S.PTR (_, ty) => do_ty (ty, acc) | S.ARR {t = ty, ...} => do_ty (ty, acc) | S.UNIMPLEMENTED _ => acc fun fs (S.OFIELD {spec = (_, ty), ...}, acc) = do_ty (ty, acc) | fs (_, acc) = acc fun f ({name, spec}, acc) = fs (spec, acc) fun s ({src, tag, size, anon, fields, exclude}, acc) = List.fold (fields, acc, f) fun u ({src, tag, size, anon, all, exclude}, acc) = List.fold (all, acc, f) fun gvar ({src, name, spec = (_, ty)}, acc) = do_ty (ty, acc) fun gfun ({src, name, spec, argnames}, acc) = do_ty (S.FPTR spec, acc) fun gty ({src, name, spec}, acc) = do_ty (spec, acc) fun lfold (l, f, b) = List.fold (l, b, f) fun mfold (m, f, b) = SM.foldl f b m in lfold (gvars, gvar, lfold (gfuns, gfun, lfold (gtys, gty, mfold (structs, s, mfold (unions, u, (IM.empty, SS.empty, SS.empty, SS.empty)))))) end fun s_inc t = SS.member (incomplete_structs, t) fun u_inc t = SS.member (incomplete_unions, t) fun Gstruct n = concat [prefix, "G_", n] fun Fstruct n = concat [prefix, "F_", n] fun fptr_rtti_struct_id i = "FPtrRTTI_" ^ Int.toString i fun Tstruct n = concat [prefix, "T_", n] fun SUETstruct K t = concat [K, "T_", t] val STstruct = SUETstruct "S" val UTstruct = SUETstruct "U" fun Suobj'rw p sut = Con ("su_obj" ^ p, [sut, Type "rw"]) fun Suobj'ro sut = Con ("su_obj'", [sut, Type "ro"]) fun SUEstruct K t = concat [prefix, K, "_", t] val Sstruct = SUEstruct "S" val Ustruct = SUEstruct "U" val Estruct = SUEstruct "E" fun Estruct' (n, anon) = Estruct (if anon andalso collect_enums then "'" else n) fun fieldtype_id n = "t_f_" ^ n fun fieldrtti_id n = "typ_f_" ^ n fun field_id (n, p) = concat ["f_", n, p] fun enum_id n = "e_" ^ n val pending = ref [] val exports = ref [] val files = ref [] local val dir_exists = ref false val checkDir = fn () => if !dir_exists then () else (dir_exists := true; if OS.FileSys.isDir dir handle _ => false then () else OS.FileSys.mkDir dir) in fun smlFileAndExport (file,export,do_export) = let (* We don't want apostrophes in file names -> turn them into minuses. * We also want to use only lowercase characters as some file systems * are case insensitive. *) val base = Vector.map (file, fn #"'" => #"-" | c => Char.toLower c) fun pick i = let val file = OS.Path.joinBaseExt {base = if i=0 then base else concat [base, "-", Int.toString i], ext = SOME "sml"} in if List.exists (!files, fn f => f = file) then pick (i+1) else file end val file = pick 0 val result = OS.Path.joinDirFile {dir = dir, file = file} in checkDir () ; List.push (pending, export) ; (result, fn () => (List.push (files, file) ; if do_export then List.push (exports, export) else () ; ignore (List.pop pending))) end fun descrFile file = let val result = OS.Path.joinDirFile {dir = dir, file = file} in checkDir () ; result end end fun rwro_str S.RW = "rw" | rwro_str S.RO = "ro" fun rwro_type c = Type (rwro_str c) fun rwro_c_type S.RW = Type "'c" | rwro_c_type S.RO = Type "ro" fun dim_ty 0 = Type "dec" | dim_ty n = Con ("dg" ^ Int.toString (n mod 10), [dim_ty (n div 10)]) val dim_ty = fn n => if n < 0 then raise Fail "negative dimension" else dim_ty n fun dim_val n = let fun build 0 = EVar "dec" | build n = EApp (build (n div 10), EVar ("dg" ^ Int.toString (n mod 10))) in EApp (build n, EVar "dim") end fun stem basic_t = case basic_t of S.SCHAR => "schar" | S.UCHAR => "uchar" | S.SSHORT => "sshort" | S.USHORT => "ushort" | S.SINT => "sint" | S.UINT => "uint" | S.SLONG => "slong" | S.ULONG => "ulong" | S.SLONGLONG => "slonglong" | S.ULONGLONG => "ulonglong" | S.FLOAT => "float" | S.DOUBLE => "double" val bytebits = #bits (#char targetSizes) fun sizeof_basic basic_t = case basic_t of S.SCHAR => #bits (#char targetSizes) | S.UCHAR => #bits (#char targetSizes) | S.SSHORT => #bits (#short targetSizes) | S.USHORT => #bits (#short targetSizes) | S.SINT => #bits (#int targetSizes) | S.UINT => #bits (#int targetSizes) | S.SLONG => #bits (#long targetSizes) | S.ULONG => #bits (#long targetSizes) | S.SLONGLONG => #bits (#longlong targetSizes) | S.ULONGLONG => #bits (#longlong targetSizes) | S.FLOAT => #bits (#float targetSizes) | S.DOUBLE => #bits (#double targetSizes) and sizeof t = case t of S.BASIC basic_t => Word.fromInt ((sizeof_basic basic_t) div bytebits) | S.STRUCT t => (case $? (structs, t) of SOME {size, ...} => size | NONE => err ["incomplete struct argument: struct ", t]) | S.UNION t => (case $? (unions, t) of SOME {size, ...} => size | NONE => err ["incomplete union argument: union ", t]) | S.ENUM _ => Word.fromInt ((#bits (#int targetSizes)) div bytebits) | S.VOIDPTR => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.FPTR _ => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.PTR _ => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.ARR {d, esz, ...} => Word.fromInt (d * esz) | S.UNIMPLEMENTED what => unimp what val genStructTable : (String.t * unit Promise.t) HashSet.t = HashSet.new {hash = fn (structname, _) => String.hash structname} fun fillGenStructTable (app, coll, pr_promise) = app (coll, fn elem => let val (structname, promise) = pr_promise elem in (ignore o HashSet.lookupOrInsert) (genStructTable, String.hash structname, fn (s,_) => String.equals (structname, s), fn () => (structname, promise)) end) fun fillGenStructTable' (app, coll, pr_promise) = fillGenStructTable (fn (c, f) => app f c, coll, pr_promise) fun forceGenStruct structname = case HashSet.peek (genStructTable, String.hash structname, fn (s,_) => String.equals (structname, s)) of SOME (_,promise) => (Promise.force promise; structname) | NONE => err ["missing structure: ", structname] fun SUEtag K tag = Type ((forceGenStruct (SUETstruct K tag)) ^ ".tag") val Stag = SUEtag "S" val Utag = SUEtag "U" fun Etag (tag, anon) = SUEtag "E" (if collect_enums andalso anon then "'" else tag) fun SUEtyp K tag = EVar ((forceGenStruct (SUETstruct K tag)) ^ ".typ") val Styp = SUEtyp "S" val Utyp = SUEtyp "U" fun fptr_rtti_qid i = (forceGenStruct (fptr_rtti_struct_id i)) ^ ".typ" fun fptr_mkcall_qid i = (forceGenStruct (fptr_rtti_struct_id i)) ^ ".mkcall" fun witness_fptr_type_p prime {args, res} = let fun top_type ty = case ty of S.STRUCT t => Suobj'ro (Stag t) | S.UNION t => Suobj'ro (Utag t) | ty => witness_type' ty val (res_t, extra_arg_t) = case res of NONE => (Unit, []) | SOME (S.STRUCT t) => let val ot = Suobj'rw "'" (Stag t) in (ot, [ot]) end | SOME (S.UNION t) => let val ot = Suobj'rw "'" (Utag t) in (ot, [ot]) end | SOME ty => (top_type ty, []) val arg_tl = extra_arg_t @ (List.map (args, top_type)) val dom_t = Tuple arg_tl val fct_t = Arrow (dom_t, res_t) in Con ("fptr" ^ prime, [fct_t]) end and witness_type_p prime ty = (case ty of S.BASIC basic_t => Type (stem basic_t) | S.STRUCT t => Con ("su", [Stag t]) | S.UNION t => Con ("su", [Utag t]) | S.ENUM t => Con ("enum", [Etag t]) | S.VOIDPTR => Type "voidptr" | S.FPTR spec => witness_fptr_type_p prime spec | S.PTR (c, ty) => Con ("ptr" ^ prime, [Con ("obj", [witness_type ty, rwro_type c])]) | S.ARR {t = ty, d, ...} => Con ("arr", [witness_type ty, dim_ty d]) | S.UNIMPLEMENTED what => unimp what) and witness_type ty = witness_type_p "" ty and witness_type' ty = witness_type_p "'" ty fun topfunc_type prime ({args, res}, argnames) = let fun top_type ty = case ty of S.BASIC S.SCHAR => Type "MLRep.Char.Signed.int" | S.BASIC S.UCHAR => Type "MLRep.Char.Unsigned.word" | S.BASIC S.SSHORT => Type "MLRep.Short.Signed.int" | S.BASIC S.USHORT => Type "MLRep.Short.Unsigned.word" | S.BASIC S.SINT => Type "MLRep.Int.Signed.int" | S.BASIC S.UINT => Type "MLRep.Int.Unsigned.word" | S.BASIC S.SLONG => Type "MLRep.Long.Signed.int" | S.BASIC S.ULONG => Type "MLRep.Long.Unsigned.word" | S.BASIC S.SLONGLONG => Type "MLRep.LongLong.Signed.int" | S.BASIC S.ULONGLONG => Type "MLRep.LongLong.Unsigned.word" | S.BASIC S.FLOAT => Type "MLRep.Float.real" | S.BASIC S.DOUBLE => Type "MLRep.Double.real" | S.STRUCT t => Con ("su_obj" ^ prime, [Stag t, Type "'c"]) | S.UNION t => Con ("su_obj" ^ prime, [Utag t, Type "'c"]) | S.ENUM _ => Type "MLRep.Int.Signed.int" | ty => witness_type_p prime ty val (res_t, extra_arg_t, extra_argname) = case res of NONE => (Unit, [], []) | SOME (S.STRUCT t) => let val ot = Suobj'rw prime (Stag t) in (ot, [ot], [writeto]) end | SOME (S.UNION t) => let val ot = Suobj'rw prime (Utag t) in (ot, [ot], [writeto]) end | SOME ty => (top_type ty, [], []) val arg_tl = List.map (args, top_type) val arg_t = case (namedargs, argnames) of (true, SOME nl) => (Record o List.zip) (extra_argname @ nl, extra_arg_t @ arg_tl) | _ => Tuple (extra_arg_t @ arg_tl) in Arrow (arg_t, res_t) end fun rtti_type ty = Con ("T.typ", [witness_type ty]) local fun simple v = EVar ("T." ^ v) in fun rtti_val ty = case ty of S.BASIC basic_t => simple (stem basic_t) | S.STRUCT t => if s_inc t then raise Incomplete else Styp t | S.UNION t => if u_inc t then raise Incomplete else Utyp t | S.ENUM t => EConstr (EVar "T.enum", Con ("T.typ", [Con ("enum", [Etag t])])) | S.VOIDPTR => simple "voidptr" | S.FPTR cft => let val cfth = hash_cft cft in case %? (fptr_types, cfth) of SOME (_, i) => EVar (fptr_rtti_qid i) | NONE => raise Fail "fptr type missing" end | S.PTR (S.RW, ty) => EApp (EVar "T.pointer", rtti_val ty) | S.PTR (S.RO, ty) => EApp (EVar "T.ro", EApp (EVar "T.pointer", rtti_val ty)) | S.ARR {t = ty, d, ...} => EApp (EVar "T.arr", ETuple [rtti_val ty, dim_val d]) | S.UNIMPLEMENTED what => raise Incomplete end fun fptr_mkcall spec = let val h = hash_cft spec in case %? (fptr_types, h) of SOME (_, i) => fptr_mkcall_qid i | NONE => raise Fail "missing fptr_type (mkcall)" end fun pr_addr_import (pr_fdef, name, attrs) = pr_fdef ("h", [EUnit], EPrim ("_address \"" ^ name ^ "\" " ^ attrs, Type "CMemory.addr")) fun pr_gvar_promise x = let val {src, name, spec = (c, t)} = x val gstruct = Gstruct name val gstruct_export = "structure " ^ gstruct in (gstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("g-" ^ name, gstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun doit () = let val () = pr_tdef ("t", witness_type t) val incomplete = (pr_vdef ("typ", EConstr (rtti_val t, Con ("T.typ", [Type "t"]))) ; false) handle Incomplee => true val obj' = EConstr (EApp (EVar "mk_obj'", EApp (EVar "h", EUnit)), Con ("obj'", [Type "t", rwro_type c])) val dolight = dolight orelse incomplete in if dolight then pr_fdef ("obj'", [EUnit], obj') else (); if doheavy andalso not incomplete then pr_fdef ("obj", [EUnit], EApp (EApp (EVar "Heavy.obj", EVar "typ"), if dolight then EApp (EVar "obj'", EUnit) else obj')) else () end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; case linkage of Control.Linkage.Archive => pr_addr_import (pr_fdef, name, "public") | Control.Linkage.Dynamic => pr_vdef ("h", EApp (EVar libhandle, EString name)) | Control.Linkage.Shared => pr_addr_import (pr_fdef, name, "external"); endBox (); nl (); str "in"; VBox 4; nl (); str (gstruct_export ^ " = struct"); Box 4; doit (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gvars, pr_gvar_promise) fun pr_gfun_promise x = let val {src, name, spec as {args, res}, argnames} = x val fstruct = Fstruct name val fstruct_export = "structure " ^ fstruct in (fstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("f-" ^ name, fstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_vdecl, ...} = openPP (file, SOME src) fun doit is_light = let val ml_vars = List.mapi (args, fn (i, _) => EVar ("x" ^ Int.toString (i + 1))) fun app0 (what, e) = if is_light then e else EApp (EVar what, e) fun light (what, e) = app0 ("Light." ^ what, e) fun heavy (what, t, e) = if is_light then e else EApp (EApp (EVar ("Heavy." ^ what), rtti_val t), e) fun oneArg (e, t) = case t of S.BASIC basic_t => EApp (EVar ("Cvt.c_" ^ stem basic_t), e) | S.STRUCT _ => EApp (EVar "ro'", light ("obj", e)) | S.UNION _ => EApp (EVar "ro'", light ("obj", e)) | S.ENUM _ => EApp (EVar "Cvt.i2c_enum", e) | S.PTR _ => light ("ptr", e) | S.FPTR _ => light ("fptr", e) | S.VOIDPTR => e | S.UNIMPLEMENTED what => unimp_arg what | S.ARR _ => raise Fail "array argument type" val c_exps = List.map2 (ml_vars, args, oneArg) val (ml_vars, c_exps, extra_argname) = let fun do_su () = let val x0 = EVar "x0" in (x0 :: ml_vars, light ("obj", x0) :: c_exps, [writeto]) end in case res of SOME (S.STRUCT _) => do_su () | SOME (S.UNION _) => do_su () | _ => (ml_vars, c_exps, []) end val call = EApp (EVar "call", ETuple [EApp (EVar "fptr", EUnit), ETuple c_exps]) val ml_res = case res of NONE => call | SOME t => (case t of S.BASIC basic_t => EApp (EVar ("Cvt.ml_" ^ stem basic_t), call) | S.STRUCT _ => heavy ("obj", t, call) | S.UNION _ => heavy ("obj", t, call) | S.ENUM _ => EApp (EVar "Cvt.c2i_enum", call) | S.PTR _ => heavy ("ptr", t, call) | S.FPTR _ => heavy ("fptr", t, call) | S.VOIDPTR => call | S.UNIMPLEMENTED what => unimp_res what | S.ARR _ => raise Fail "array result type") in fn () => pr_fdef (if is_light then "f'" else "f", [ETuple ml_vars], ml_res) end fun do_fsig is_light = let val prime = if is_light then "'" else "" in pr_vdecl ("f" ^ prime, topfunc_type prime (spec, argnames)) end val (do_f_heavy, incomplete) = (if doheavy then doit false else (fn () => ()), false) handle Incomplete => (fn () => (), true) val do_f_light = if dolight orelse incomplete then doit true else (fn () => ()) in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; case linkage of Control.Linkage.Archive => pr_addr_import (pr_fdef, name, "public") | Control.Linkage.Dynamic => pr_vdef ("h", EApp (EVar libhandle, EString name)) | Control.Linkage.Shared => pr_addr_import (pr_fdef, name, "external"); endBox (); nl (); str "in"; VBox 4; nl (); str (fstruct_export ^ " : sig"); Box 4; pr_vdecl ("typ", rtti_type (S.FPTR spec)); pr_vdecl ("fptr", Arrow (Unit, witness_type (S.FPTR spec))); if doheavy andalso not incomplete then do_fsig false else (); if dolight orelse incomplete then do_fsig true else (); endBox (); nl (); str "end = struct"; Box 4; pr_vdef ("typ", rtti_val (S.FPTR spec)); pr_fdef ("fptr", [EUnit], EApp (EVar "mk_fptr", ETuple [EVar (fptr_mkcall spec), EApp (EVar "h", EUnit)])); do_f_heavy (); do_f_light (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gfuns, pr_gfun_promise) val get_callop = let val ncallops = ref 0 val callops = ref IM.empty fun callop_sid i = "Callop_" ^ Int.toString i fun callop_qid i = callop_sid i ^ ".callop" fun get (ml_args_t, ml_res_t) = let val e_proto_hash = hash_mltype (Arrow (ml_args_t, ml_res_t)) in case %? (!callops, e_proto_hash) of SOME i => callop_qid i | NONE => let val i = !ncallops val sn = callop_sid i val sn_export = "structure " ^ sn val (file, done) = smlFileAndExport ("callop-" ^ Int.toString i, sn_export, false) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, NONE) in ncallops := i + 1; callops := IM.insert (!callops, e_proto_hash, i); str (sn_export ^ " = struct"); Box 4; pr_vdef ("callop", EPrim ("_import *", Arrow (Type "CMemory.addr", Arrow (ml_args_t, ml_res_t)))); endBox (); nl (); str "end"; nl (); closePP (); done (); callop_qid i end end in get end fun pr_fptr_rtti_promise x = let val ({args, res}, i) = x val fstruct = fptr_rtti_struct_id i val fstruct_export = "structure " ^ fstruct in (fstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("fptr-rtti-" ^ (Int.toString i), fstruct_export, false) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, NONE) fun mlty ty = case ty of S.BASIC basic_t => Type ("CMemory.cc_" ^ stem basic_t) | S.STRUCT _ => Type "CMemory.cc_addr" | S.UNION _ => Type "CMemory.cc_addr" | S.ENUM _ => Type "CMemory.cc_sint" | S.VOIDPTR => Type "CMemory.cc_addr" | S.FPTR _ => Type "CMemory.cc_addr" | S.PTR _ => Type "CMemory.cc_addr" | S.ARR _ => raise Fail "unexpected type" | S.UNIMPLEMENTED what => unimp what fun wrap (e, n) = EApp (EVar ("CMemory.wrap_" ^ n), EApp (EVar ("Cvt.ml_" ^ n), e)) fun fldwrap (e, n, alt) = EApp (EVar ("CMemory.wrap_" ^ n), EApp (EVar ("Get." ^ n ^ alt), e)) fun vwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", e)) fun fwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "freveal", e)) fun pwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar "Ptr.inject'", e))) fun fldvwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar ("Get.voidptr" ^ alt), e))) fun fldfwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "freveal", if alt = "'" then EApp (EVar "Get.fptr'", e) else EApp (EVar "Light.fptr", EApp (EVar "Get.fptr", e)))) fun fldpwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar ("Ptr.inject" ^ alt), EApp (EVar ("Get.ptr" ^ alt), e)))) fun suwrap e = pwrap (EApp (EVar "Ptr.|&!", e)) fun ewrap e = EApp (EVar "CMemory.wrap_sint", EApp (EVar "Cvt.c2i_enum", e)) fun fldewrap (e, alt) = EApp (EVar "CMemory.wrap_sint", EApp (EVar ("Get.enum" ^ alt), e)) val (ml_res_t, extra_arg_v, extra_arg_e, extra_ml_arg_t, res_wrap) = case res of NONE => (Unit, [], [], [], fn r => r) | SOME (S.STRUCT _) => (Unit, [EVar "x0"], [suwrap (EVar "x0")], [Type "CMemory.cc_addr"], fn r => ESeq (r, EVar "x0")) | SOME (S.UNION _) => (Unit, [EVar "x0"], [suwrap (EVar "x0")], [Type "CMemory.cc_addr"], fn r => ESeq (r, EVar "x0")) | SOME t => let fun unwrap n r = EApp (EVar ("Cvt.c_" ^ n), EApp (EVar ("CMemory.unwrap_" ^ n), r)) fun punwrap cast r = EApp (EVar cast, EApp (EVar "CMemory.unwrap_addr", r)) fun eunwrap r = EApp (EVar "Cvt.i2c_enum", EApp (EVar "CMemory.unwrap_sint", r)) val res_wrap = case t of S.BASIC basic_t => unwrap (stem basic_t) | S.STRUCT _ => raise Fail "unexpected result type" | S.UNION _ => raise Fail "unexpected result type" | S.ENUM _ => eunwrap | S.VOIDPTR => punwrap "vcast" | S.FPTR _ => punwrap "fcast" | S.PTR _ => punwrap "pcast" | S.ARR _ => raise Fail "unexpected result type" | S.UNIMPLEMENTED what => unimp_res what in (mlty t, [], [], [], res_wrap) end fun doarg (h, p) = let fun sel e = ([mlty h], [e], []) in case h of S.BASIC basic_t => sel (wrap (p, stem basic_t)) | S.STRUCT t => (* sel (suwrap p) *) raise Fail "struct argument not (yet) supported" | S.UNION t => (* sel (suwrap p) *) raise Fail "union argument not (yet) supported" | S.ENUM _ => sel (ewrap p) | S.VOIDPTR => sel (vwrap p) | S.FPTR _ => sel (fwrap p) | S.PTR _ => sel (pwrap p) | S.ARR _ => raise Fail "unexpected array argument" | S.UNIMPLEMENTED what => unimp_arg what end and arglist ([], _) = ([], [], []) | arglist (h :: tl, i) = let val p = EVar ("x" ^ Int.toString i) val (ta, ea, bnds) = arglist (tl, i + 1) val (ta', ea', bnds') = doarg (h, p) in (ta' @ ta, ea' @ ea, bnds' @ bnds) end val (ml_args_tl, args_el, bnds) = arglist (args, 1) val ml_args_t = Tuple (extra_ml_arg_t @ ml_args_tl) val arg_vl = List.mapi (args, fn (i, _) => EVar ("x" ^ Int.toString (i + 1))) val arg_e = ETuple (extra_arg_e @ args_el) val callop_n = get_callop (ml_args_t, ml_res_t) in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (fstruct_export ^ " = struct"); Box 4; pr_fdef ("mkcall", [EVar "a", ETuple (extra_arg_v @ arg_vl)], res_wrap (ELet (bnds, EApp (EApp (EVar callop_n, EVar "a"), arg_e)))); pr_vdef ("typ", EConstr (EApp (EVar "mk_fptr_typ", EVar "mkcall"), rtti_type (S.FPTR {args = args, res = res}))); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable' (IM.app, fptr_types, pr_fptr_rtti_promise) fun pr_gty_promise x = let val {src, name, spec} = x val tstruct = Tstruct name val tstruct_export = "structure " ^ tstruct in (tstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("t-" ^ name, tstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) val rtti_val_opt = (SOME (rtti_val spec)) handle Incomplete => NONE in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (tstruct_export ^ " = struct"); Box 4; pr_tdef ("t", witness_type spec); Option.app (rtti_val_opt, fn rtti_val => pr_vdef ("typ", EConstr (rtti_val, Con ("T.typ", [Type "t"])))); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gtys, pr_gty_promise) datatype sue_szinfo = T_INC (* generate no RTTI *) | T_SU of word (* generate struct/union RTTI *) | T_E (* generate enum RTTI *) fun pr_suet_promise x = let val (src, tag, anon, tinfo, k, K) = x val suetstruct = SUETstruct K tag val suetstruct_export = "structure " ^ suetstruct in (suetstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport (k ^ "t-" ^ tag, suetstruct_export, tinfo = T_INC) val {closePP, str, nl, Box, VBox, endBox, pr_vdef, pr_tdef, ...} = openPP (file, src) val (utildef, tag_t) = if anon then ("structure X :> sig type t end \ \= struct type t = unit end", Type "X.t") else ("open Tag", Vector.foldr (tag, Type k, fn (c, tag_t) => Con ("t_" ^ String.fromChar c, [tag_t]))) fun do_susize size = let in pr_vdef ("size", EConstr (EApp (EVar "mk_su_size", EWord size), Con ("S.size", [Con ("su", [Type "tag"])]))); pr_vdef ("typ", EApp (EVar "mk_su_typ", EVar "size")) end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; nl (); str (concat ["structure ", SUEstruct K tag, " = struct"]); Box 4; nl (); str "local"; VBox 4; nl (); str utildef; endBox (); nl (); str "in"; VBox 4; pr_tdef ("tag", tag_t); endBox (); nl (); str "end"; case tinfo of T_INC => () | T_SU size => do_susize size | T_E => (); endBox (); nl (); str "end"; endBox (); nl (); str "in"; VBox 4; nl (); str (concat [suetstruct_export, " = ", SUEstruct K tag]); endBox (); nl (); str "end"; nl (); closePP (); done () end)) end local fun pr_st_promise {src, tag, anon, size, fields, exclude} = pr_suet_promise (SOME src, tag, anon, T_SU size, "s", "S") fun pr_ut_promise {src, tag, anon, size, all, exclude} = pr_suet_promise (SOME src, tag, anon, T_SU size, "u", "U") fun pr_et_promise {src, tag, anon, descr, spec, exclude} = pr_suet_promise (SOME src, tag, anon, T_E, "e", "E") in val () = fillGenStructTable' (SM.app, structs, pr_st_promise) val () = fillGenStructTable' (SM.app, unions, pr_ut_promise) val () = fillGenStructTable' (SM.app, enums, pr_et_promise) end local fun pr_i_suet_promise (tag, k, K) = pr_suet_promise (NONE, tag, false, T_INC, k, K) fun pr_i_st_promise tag = pr_i_suet_promise (tag, "s", "S") fun pr_i_ut_promise tag = pr_i_suet_promise (tag, "u", "U") fun pr_i_et_promise tag = pr_i_suet_promise (tag, "e", "E") in val () = fillGenStructTable' (SS.app, incomplete_structs, pr_i_st_promise) val () = fillGenStructTable' (SS.app, incomplete_unions, pr_i_ut_promise) val () = fillGenStructTable' (SS.app, incomplete_enums, pr_i_et_promise) end fun pr_su_promise x = let val (src, tag, fields, k, K) = x val sustruct = SUEstruct K tag val sustruct_export = "structure " ^ sustruct in (sustruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport (k ^ "-" ^ tag, sustruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun pr_field_type {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic = false, offset} => pr_tdef (fieldtype_id name, witness_type ty) | _ => () fun pr_field_rtti {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic = false, offset} => pr_vdef (fieldrtti_id name, EConstr (rtti_val ty, Con ("T.typ", [Type (fieldtype_id name)]))) | _ => () fun arg_x prime = EConstr (EVar "x", Con ("su_obj" ^ prime, [Type "tag", Type "'c"])) fun pr_bf_acc (name, prime, sign, {offset, constness, bits, shift}) = let val maker = concat ["mk_", rwro_str constness, "_", sign, "bf", prime] in pr_fdef (field_id (name, prime), [arg_x prime], EApp (EApp (EVar maker, ETuple [EInt offset, EWord bits, EWord shift]), EVar "x")) end fun pr_field_acc' {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic, offset} => if synthetic then () else pr_fdef (field_id (name, "'"), [arg_x "'"], EConstr (EApp (EVar "mk_field'", ETuple [EInt offset, EVar "x"]), Con ("obj'", [Type (fieldtype_id name), rwro_c_type c]))) | S.SBF bf => pr_bf_acc (name, "'", "s", bf) | S.UBF bf => pr_bf_acc (name, "'", "u", bf) fun pr_field_acc {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic, offset} => if synthetic then () else let val maker = concat ["mk_", rwro_str c, "_field"] in pr_fdef (field_id (name, ""), [arg_x ""], EApp (EVar maker, ETuple [EVar (fieldrtti_id name), EInt offset, EVar "x"])) end | S.SBF bf => pr_bf_acc (name, "", "s", bf) | S.UBF bf => pr_bf_acc (name, "", "u", bf) fun pr_one_field f = let val _ = pr_field_type f val incomplete = (pr_field_rtti f; false) handle Incomplete => true in if dolight orelse incomplete then pr_field_acc' f else (); if doheavy andalso not incomplete then pr_field_acc f else () end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (sustruct_export ^ " = struct"); Box 4; nl (); str ("open " ^ (forceGenStruct (SUETstruct K tag))); List.foreach (fields, pr_one_field); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end local fun pr_s_promise { src, tag, anon, size, fields, exclude } = pr_su_promise (src, tag, fields, "s", "S") fun pr_u_promise { src, tag, anon, size, all, exclude } = pr_su_promise (src, tag, all, "u", "U") in val () = fillGenStructTable' (SM.app, structs, pr_s_promise) val () = fillGenStructTable' (SM.app, unions, pr_u_promise) end fun pr_e_promise x = let val {src, tag, anon, descr, spec, exclude} = x val estruct = Estruct' (tag, anon) val estruct_export = "structure " ^ estruct in (estruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("e-" ^ tag, estruct_export, true) val {closePP, str, line, nl, sp, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun no_duplicate_values () = let fun loop (l, s) = case l of [] => true | {name, spec} :: l => if LIS.member (s, spec) then (warn (concat ["enum ", descr, " has duplicate values;\ \ using sing,\ \ not generating constructors\n"]); false) else loop (l, LIS.add (s, spec)) in loop (spec, LIS.empty) end val dodt = enum_cons andalso no_duplicate_values () fun dt_mlrep () = let fun pcl () = let fun loop (c, l) = case l of [] => () | {name, spec} :: l => (str (c ^ enum_id name); nextround l) and nextround [] = () | nextround l = (sp (); loop ("| ", l)) in Box 2; nl (); loop (" ", spec); endBox () end fun pfl (fname, arg, res, fini: unit -> unit) = let fun loop (pfx, l) = case l of [] => () | v :: l => (line (concat [pfx, " ", arg v, " => ", res v]); loop (" |", l)) in line (concat ["fun ", fname, " x ="]); Box 4; line ("case x of"); loop (" ", spec); fini (); endBox () end fun cstr {name, spec} = enum_id name fun vstr {name, spec} = LargeInt.toString spec ^ " : MLRep.Int.Signed.int" in line "datatype mlrep ="; pcl (); pfl ("m2i", cstr, vstr, fn () => ()); pfl ("i2m", vstr, cstr, fn () => line " | _ => raise General.Domain") end fun int_mlrep () = let fun v {name, spec} = pr_vdef (enum_id name, EConstr (ELInt spec, Type "mlrep")) val mlx = EConstr (EVar "x", Type "mlrep") val ty = Type "MLRep.Int.Signed.int" val ix = EConstr (EVar "x", ty) in pr_tdef ("mlrep", ty); List.foreach (spec, v); pr_fdef ("m2i", [mlx], ix); pr_fdef ("i2m", [ix], mlx) end fun getset p = let fun constr c = Con ("enum_obj" ^ p, [Type "tag", Type c]) in pr_fdef ("get" ^ p, [EConstr (EVar "x", constr "'c")], EApp (EVar "i2m", EApp (EVar ("Get.enum" ^ p), EVar "x"))); pr_fdef ("set" ^ p, [ETuple [EConstr (EVar "x", constr "rw"), EVar "v"]], EApp (EVar ("Set.enum" ^ p), ETuple [EVar "x", EApp (EVar "m2i", EVar "v")])) end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (estruct_export ^ " = struct"); Box 4; nl (); str ("open " ^ (forceGenStruct (SUETstruct "E" tag))); if dodt then dt_mlrep () else int_mlrep (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable' (SM.app, enums, pr_e_promise) fun do_mlbfile () = let val file = descrFile mlbfile val () = File.remove file val {closePP, line, str, nl, VBox, endBox, ... } = openPP (file, NONE) in line "local ann \"allowFFI true\" in"; VBox 4; app line ["$(SML_LIB)/basis/basis.mlb", "$(SML_LIB)/mlnlffi-lib/internals/c-int.mlb"]; app line (rev extramembers); app line (rev (!files)); endBox (); nl (); str "end in"; VBox 4; app line (rev (!exports)); endBox (); nl (); str "end"; nl (); closePP () end in (HashSet.foreach (genStructTable, fn (_, promise) => Promise.force promise) ; do_mlbfile ()) handle Promise.Force => warn ("cyclic dependency: " ^ (String.concatWith (!pending, " "))) end end mlton-20210117+dfsg/mlnlffigen/hash.sml000066400000000000000000000052051416264345000176110ustar00rootroot00000000000000(* hash.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * hash.sml - Generating unique hash codes for C function types and * for ML types. * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure Hash : sig val mkFHasher : unit -> Spec.cft -> int val mkTHasher : unit -> PrettyPrint.mltype -> int end = struct structure S = Spec structure PP = PrettyPrint structure SM = StringMap structure LM = IntListMap fun tyConId S.SCHAR = 0 | tyConId S.UCHAR = 1 | tyConId S.SSHORT = 2 | tyConId S.USHORT = 3 | tyConId S.SINT = 4 | tyConId S.UINT = 5 | tyConId S.SLONG = 6 | tyConId S.ULONG = 7 | tyConId S.SLONGLONG = 8 | tyConId S.ULONGLONG = 9 | tyConId S.FLOAT = 10 | tyConId S.DOUBLE = 11 fun conConId S.RW = 0 | conConId S.RO = 1 fun look (next, find, insert) tab k = case find (!tab, k) of SOME i => i | NONE => let val i = !next in next := i + 1; tab := insert (!tab, k, i); i end fun mkFHasher () = let val stab = ref SM.empty val utab = ref SM.empty val etab = ref SM.empty val ltab = ref LM.empty val next = ref 13 val tlook = look (next, SM.find, SM.insert) val llook = look (next, LM.find, LM.insert) ltab fun hash (S.STRUCT t) = tlook stab t | hash (S.UNION t) = tlook utab t | hash (S.ENUM (t, _)) = tlook etab t | hash (S.FPTR x) = cfthash x | hash (S.PTR (c, ty)) = llook [1, conConId c, hash ty] | hash (S.ARR { t, d, esz }) = llook [2, hash t, d, esz] | hash (S.BASIC ty) = tyConId ty | hash (S.VOIDPTR) = 12 | hash _ = raise Fail "hash" and cfthash { args, res } = llook (0 :: opthash res :: map hash args) and opthash NONE = 0 | opthash (SOME ty) = 1 + hash ty in cfthash end fun mkTHasher () = let val stab = ref SM.empty val ltab = ref LM.empty val next = ref 0 val slook = look (next, SM.find, SM.insert) stab val llook = look (next, LM.find, LM.insert) ltab fun hash (PP.ARROW (t, t')) = llook [0, hash t, hash t'] | hash (PP.TUPLE tl) = llook (1 :: map hash tl) | hash (PP.CON (c, tl)) = llook (2 :: slook c :: map hash tl) | hash (PP.RECORD pl) = llook (3 :: map phash pl) and phash (n, t) = llook [4, slook n, hash t] in hash end end mlton-20210117+dfsg/mlnlffigen/main.sml000066400000000000000000000133061416264345000176130ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main : sig val main : unit -> unit end = struct structure RE = RegExpFn (structure P = AwkSyntax structure E = DfaEngine) fun makeOptions {usage} = let open Popt Control in List.map ([(Expert, "debug", " {false|true}", "", boolRef debug), (Normal, "allSU", " {false|true}", "generate ML definitions for all #include-d struct and union definitions", boolRef allSU), (Normal, "collect", " {true|false}", "collect enum constants from unnamed enumerateions", boolRef collect_enums), (Normal, "cppopt", " ", "pass option to preprocessor", SpaceString (fn s => List.push (cppopts, s))), (Normal, "dir", "

    ", "output directory for generated files", SpaceString (fn s => dir := s)), (Normal, "enum-constructors", " {false|true}", "when possible, make the ML representation type of enumerations a datatype", boolRef enum_cons), (Normal, "gensym", " ", "suffix for \"gensym-ed\" generated ML structure names", SpaceString (fn s => gensym := s)), (Normal, "heavy", "", "suppress 'light' versions of function wrappers and field accessors", None (fn () => weight := {heavy = true, light = false})), (Normal, "include", " ", "include file in the generated .mlb file", SpaceString (fn s => List.push (extramembers, s))), (Normal, "libhandle", " ", "Use the to refer to the handle to the shared library", SpaceString (fn s => libhandle := s)), (Normal, "light", "", "suppress 'heavy' versions of function wrappers and field accessors", None (fn () => weight := {heavy = false, light = true})), (Normal, "linkage", " {archive|dynamic|shared}", "how to link C objects", SpaceString (fn s => if s = "archive" orelse s = "static" then linkage := Linkage.Archive else if s = "dynamic" then linkage := Linkage.Dynamic else if s = "shared" then linkage := Linkage.Shared else usage (concat ["invalid -linkage arg: ", s]))), (Normal, "match", " ", "generate ML definitions for #include-d definitions matching ", SpaceString (fn re => let val regexp = SOME (RE.compileString re) handle RegExpSyntax.CannotCompile => NONE in case regexp of SOME regexp => let val scanFn = RE.prefix regexp fun matchFn s = let val n = String.length s fun getc i = if (i < n) then SOME (String.sub (s, i), i + 1) else NONE in case scanFn getc 0 of NONE => false | SOME (x, k) => k = n end in match := matchFn end | NONE => usage (concat ["invalid -match arg: ", re]) end)), (Normal, "mlbfile", " ", "name of the generated .mlb file", SpaceString (fn s => mlbfile := s)), (Normal, "namedargs", " {false|true}", "generate function wrappers with named arguments", boolRef namedargs), (Normal, "prefix", " ", "prefix for generated ML structure names", SpaceString (fn s => prefix := s)), (Normal, "target", " -", "platform that executable will run on", SpaceString (fn s => (case Target.fromString s of NONE => usage (concat ["invalid -target arg: ", s]) | SOME t => (case Target.make t of NONE => usage (concat ["unsupported -target arg: ", s]) | SOME z => target := SOME z)))), (Normal, "width", " 75", "output line width for pretty-printing", intRef width)], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlnlffigen [option ...] C-file ..." val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => !Control.debug} val die = Process.fail fun commandLine args = let val rest = parse args val () = if Option.isNone (!Control.target) then usage "no -target specified" else () in case rest of Result.No msg => usage msg | Result.Yes [] => usage "no C-file(s)" | Result.Yes cfiles => Gen.gen {cfiles = cfiles} end val main = Process.makeMain commandLine end mlton-20210117+dfsg/mlnlffigen/mlnlffigen.mlb000066400000000000000000000003661416264345000207710ustar00rootroot00000000000000(* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20210117+dfsg/mlnlffigen/pp.sml000066400000000000000000000263731416264345000173160ustar00rootroot00000000000000(* pp.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * pp.sml - Some simple pretty-printing infrastructure for the ml-ffigen * program. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure PrettyPrint = struct structure PP = PPStreamFn (structure Token = StringToken structure Device = CPIFDev) datatype mltype = ARROW of mltype * mltype | TUPLE of mltype list | CON of string * mltype list | RECORD of (string * mltype) list val Unit = TUPLE [] fun Type t = CON (t, []) fun St tag = Type (concat ["ST_", tag, ".tag"]) fun Un tag = Type (concat ["UT_", tag, ".tag"]) fun En tag = Type (concat ["ET_", tag, ".tag"]) datatype tcontext = C_STAR | C_ARROW | C_COMMA | C_CON fun simplify (CON ("unit", [])) = Unit | simplify (TUPLE [t]) = simplify t | simplify (CON (k, tl)) = let fun doDefault () = CON (k, map simplify tl) fun doObj obj = case tl of [CON (k, tl), c] => if List.exists (fn k' => k = k') ["schar","uchar","sshort","ushort", "sint","uint","slong","ulong", "slonglong","ulonglong","float","double", "voidptr"] then CON (concat [k, "_", obj], [simplify c]) else if k = "fptr" then case tl of [f] => CON ("fptr_" ^ obj, [simplify f, simplify c]) | _ => doDefault () else if k = "su" then case tl of [su] => CON ("su_" ^ obj, [simplify su, simplify c]) | _ => doDefault () else doDefault () | _ => doDefault () fun doDim d = if d = "dim" then case tl of [n, CON (k', [])] => if k' = "Dim.nonzero" orelse k' = "nonzero" then CON ("dim", [simplify n]) else doDefault () | _ => doDefault () else if d = "dec" then case tl of [] => CON ("dec", []) | _ => doDefault () else if List.exists (fn d' => d = d') ["dg0","dg1","dg2","dg3","dg4", "dg5","dg6","dg7","dg8","dg9"] then case tl of [n] => CON (d, [simplify n]) | _ => doDefault () else doDefault () in if k = "obj" orelse k = "obj'" then doObj k else if String.isPrefix "Dim." k then doDim (String.extract(k,4,NONE)) else doDefault () end | simplify (ARROW (t1, t2)) = ARROW (simplify t1, simplify t2) | simplify (TUPLE tl) = TUPLE (map simplify tl) | simplify (RECORD ml) = RECORD (map (fn (n, t) => (n, simplify t)) ml) fun ppType0 s (t as ARROW _, c) = let fun loop (ARROW (x, y)) = (ppType0 s (x, C_ARROW); PP.string s " ->"; PP.space s 1; loop y) | loop t = ppType0 s (t, C_ARROW) val paren = not (c = C_COMMA) val indent = if paren then 5 else 4 in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); loop t; if paren then PP.string s ")" else (); PP.closeBox s end | ppType0 s (TUPLE [], _) = PP.string s "unit" | ppType0 s (TUPLE [t], c) = ppType0 s (t, c) | ppType0 s (TUPLE tl, c) = let fun loop [] = () (* cannot happen *) | loop [t] = ppType0 s (t, C_STAR) | loop (h :: tl) = (ppType0 s (h, C_STAR); PP.string s " *"; PP.space s 1; loop tl) val paren = case c of (C_STAR) => true | (C_CON) => true | (C_ARROW) => false | (C_COMMA) => false val indent = if paren then 1 else 0 in PP.openHVBox s (PP.Rel indent); if paren then PP.string s "(" else (); loop tl; if paren then PP.string s ")" else (); PP.closeBox s end | ppType0 s (RECORD [], _) = PP.string s "{}" | ppType0 s (RECORD tl, _) = let fun loop [] = () (* cannot happen *) | loop [(n, t)] = (PP.string s (n ^ " : "); ppType0 s (t, C_COMMA)) | loop ((n, t) :: tl) = (PP.string s (n ^ " : "); ppType0 s (t, C_COMMA); PP.string s ","; PP.space s 1; loop tl) in PP.openHVBox s (PP.Rel 2); PP.string s "{ "; loop tl; PP.string s " }"; PP.closeBox s end | ppType0 s (CON (k, []), _) = PP.string s k | ppType0 s (CON (k, [t]), _) = (PP.openHBox s; ppType0 s (t, C_CON); PP.space s 1; PP.string s k; PP.closeBox s) | ppType0 s (CON (k, tl), _) = let fun loop [] = () (* cannot happen *) | loop [t] = ppType0 s (t, C_COMMA) | loop (h :: tl) = (ppType0 s (h, C_COMMA); PP.string s ","; PP.space s 1; loop tl) in PP.openHBox s; PP.openHVBox s (PP.Rel 1); PP.string s "("; loop tl; PP.string s ")"; PP.closeBox s; PP.space s 1; PP.string s k; PP.closeBox s end (* start with comma context *) fun ppType s t = ppType0 s (simplify t, C_COMMA) fun ppType' s (t, c) = ppType0 s (simplify t, c) datatype mlexp = ETUPLE of mlexp list | ERECORD of (string * mlexp) list | EVAR of string | EAPP of mlexp * mlexp | ECONSTR of mlexp * mltype | ESEQ of mlexp * mlexp | EPRIM of string * mltype | ELET of (string * mlexp) list * mlexp datatype econtext = EC_APP | EC_COMMA fun ppExp0 s (ETUPLE [], _) = PP.string s "()" | ppExp0 s (ETUPLE [x], c) = ppExp0 s (x, c) | ppExp0 s (ETUPLE xl, _) = let fun loop [] = () | loop [x] = ppExp0 s (x, EC_COMMA) | loop (x :: xl) = (ppExp0 s (x, EC_COMMA); PP.string s ","; PP.space s 1; loop xl) in PP.openHVBox s (PP.Rel 1); PP.string s "("; loop xl; PP.string s ")"; PP.closeBox s end | ppExp0 s (ERECORD [], _) = PP.string s "{}" | ppExp0 s (ERECORD xl, _) = let fun loop [] = () | loop [(n, x)] = (PP.string s (n ^ " ="); PP.space s 1; ppExp0 s (x, EC_COMMA)) | loop ((n, x) :: xl) = (PP.string s (n ^ " ="); PP.space s 1; ppExp0 s (x, EC_COMMA); PP.string s ","; PP.space s 1; loop xl) in PP.openHVBox s (PP.Rel 2); PP.string s "{ "; loop xl; PP.string s " }"; PP.closeBox s end | ppExp0 s (EVAR v, _) = PP.string s v | ppExp0 s (EAPP (x, y), c) = let fun loop (EAPP (x, y)) = (loop x; ppExp0 s (y, EC_APP); PP.space s 1) | loop x = (ppExp0 s (x, EC_APP); PP.space s 1; PP.openHOVBox s (PP.Rel 0)) val paren = c = EC_APP in PP.openHOVBox s (PP.Abs 4); if paren then PP.string s "(" else (); loop x; ppExp0 s (y, EC_APP); if paren then PP.string s ")" else (); PP.closeBox s; PP.closeBox s end | ppExp0 s (ECONSTR (x, t), c) = let val paren = c = EC_APP val indent = if paren then 5 else 4 val tc = if paren then C_CON else C_COMMA in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); ppExp0 s (x, c); PP.nbSpace s 1; PP.string s ":"; PP.space s 1; ppType' s (t, tc); if paren then PP.string s ")" else (); PP.closeBox s end | ppExp0 s (ESEQ (x, y), c) = let in PP.string s "("; PP.openHVBox s (PP.Rel 0); ppExp0 s (x, EC_COMMA); PP.string s ";"; PP.space s 1; ppExp0 s (y, EC_COMMA); PP.string s ")"; PP.closeBox s end | ppExp0 s (EPRIM (p, t), c) = let val paren = c = EC_APP val indent = if paren then 5 else 4 val tc = if paren then C_CON else C_COMMA in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); PP.string s p; PP.nbSpace s 1; PP.string s ":"; PP.space s 1; ppType' s (t, tc); PP.string s ";"; if paren then PP.string s ")" else (); PP.closeBox s end | ppExp0 s (ELET ([], e), c) = ppExp0 s (e, c) | ppExp0 s (ELET (bnds, e), c) = let fun loop [] = () | loop ((v, e) :: bnds) = (PP.newline s; PP.openHOVBox s (PP.Abs 4); PP.string s "val"; PP.nbSpace s 1; PP.string s v; PP.nbSpace s 1; PP.string s "="; PP.space s 1; ppExp0 s (e, EC_COMMA); PP.closeBox s; loop bnds) in PP.string s "let"; PP.openVBox s (PP.Abs 4); loop bnds; PP.closeBox s; PP.newline s; PP.string s "in"; PP.openVBox s (PP.Abs 4); PP.newline s; ppExp0 s (e, EC_COMMA); PP.closeBox s; PP.newline s; PP.string s "end" end fun ppExp s x = ppExp0 s (x, EC_COMMA) fun ppExp' s x = ppExp0 s (x, EC_APP) fun ppFun s (name, args, body) = (PP.openHOVBox s (PP.Rel 4); PP.string s ("fun " ^ name); PP.nbSpace s 1; app (fn a => (ppExp' s a; PP.space s 1)) args; PP.string s "="; PP.nbSpace s 1; PP.openBox s (PP.Rel 0); ppExp s body; PP.closeBox s; PP.closeBox s) end mlton-20210117+dfsg/mlnlffigen/sets-and-maps.sml000066400000000000000000000031321416264345000213370ustar00rootroot00000000000000(*************************************************************************) (* string-key.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringKey = struct type ord_key = string val compare = String.compare end (*************************************************************************) (* string-set.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringSet = RedBlackSetFn (StringKey) (*************************************************************************) (* string-map.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringMap = RedBlackMapFn (StringKey) (*************************************************************************) structure IntListKey = struct type ord_key = int list val compare = List.collate Int.compare end (*************************************************************************) (* intlist-map.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure IntListMap = RedBlackMapFn (IntListKey) (*************************************************************************) structure LargeIntKey = struct type ord_key = LargeInt.int val compare = LargeInt.compare end (*************************************************************************) structure LargeIntSet = RedBlackSetFn (LargeIntKey) (*************************************************************************) mlton-20210117+dfsg/mlnlffigen/sizes-amd64.sml000066400000000000000000000014251416264345000207340ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesAMD64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 128}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-hppa.sml000066400000000000000000000014231416264345000207470ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesHPPA = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 64}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-ia64.sml000066400000000000000000000014241416264345000205630ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesIA64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 128}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-powerpc64.sml000066400000000000000000000014301416264345000216460ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesPowerPC64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 64, align = 32}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-ppc.sml000066400000000000000000000014211416264345000205770ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesPPC = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 32}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 64, align = 32}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-sparc.sml000066400000000000000000000014241416264345000211300ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesSparc = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 64}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes-x86.sml000066400000000000000000000014211416264345000204420ustar00rootroot00000000000000(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesX86 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 32}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 96, align = 32}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20210117+dfsg/mlnlffigen/sizes.sml000066400000000000000000000011431416264345000200200ustar00rootroot00000000000000structure Sizes = struct type t = {char: {bits: int, align: int}, short: {bits: int, align: int}, int: {bits: int, align: int}, long: {bits: int, align: int}, longlong: {bits: int, align: int}, float: {bits: int, align: int}, double: {bits: int, align: int}, longdouble: {bits: int, align: int}, pointer: {bits: int, align: int}, min_struct: {bits: int, align: int}, min_union: {bits: int, align: int}, onlyPackBitFields: bool, ignoreUnnamedBitFieldAlignment: bool} endmlton-20210117+dfsg/mlnlffigen/sources.mlb000066400000000000000000000034641416264345000203350ustar00rootroot00000000000000(* Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local basis basis_lib = bas $(SML_LIB)/basis/basis.mlb end basis mlton_lib = bas local ../lib/mlton/sources.mlb in structure File structure List structure HashSet structure MLton structure Out structure Option structure Process structure Popt structure Promise structure Result structure String structure Vector functor Control end end basis smlnj_lib = bas $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis pp_lib = bas $(SML_LIB)/smlnj-lib/PP/pp-lib.mlb end basis regexp_lib = bas $(SML_LIB)/smlnj-lib/RegExp/regexp-lib.mlb end basis ckit_lib = bas $(SML_LIB)/ckit-lib/ckit-lib.mlb end local open basis_lib in endian.sml endian-big.sml endian-little.sml sizes-amd64.sml sizes-hppa.sml sizes-ia64.sml sizes-ppc.sml sizes-powerpc64.sml sizes-sparc.sml sizes-x86.sml end cppcmd.sml local open basis_lib pp_lib in cpif-dev.sml pp.sml end local open basis_lib mlton_lib ckit_lib in control.sig control.sml end local open basis_lib in spec.sml end local open basis_lib smlnj_lib sets-and-maps.sml in structure IntListMap structure IntMap = IntRedBlackMap structure LargeIntSet structure StringMap structure StringSet end local open basis_lib ckit_lib in ast-to-spec.sml hash.sml end local open basis_lib mlton_lib ckit_lib in gen.sml end local open basis_lib mlton_lib regexp_lib in main.sml end in structure Main end mlton-20210117+dfsg/mlnlffigen/spec.sml000066400000000000000000000061051416264345000176200ustar00rootroot00000000000000(* spec.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * spec.sml - A data structure describing the export interface of a * C program. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure Spec = struct datatype constness = RO | RW type tag = string datatype basic_ctype = SCHAR | UCHAR | SSHORT | USHORT | SINT | UINT | SLONG | ULONG | SLONGLONG | ULONGLONG | FLOAT | DOUBLE datatype ctype = BASIC of basic_ctype | VOIDPTR | STRUCT of tag | UNION of tag | ENUM of tag * bool | FPTR of cft | PTR of cobj | ARR of { t: ctype, d: int, esz: int } | UNIMPLEMENTED of string withtype cft = { args: ctype list, res: ctype option } and cobj = constness * ctype datatype fieldspec = OFIELD of { offset: int, spec: cobj, synthetic: bool } | SBF of { offset: int, constness: constness, bits: word, shift: word } | UBF of { offset: int, constness: constness, bits: word, shift: word } type field = { name: string, spec: fieldspec } type s = { src: string, tag: tag, anon: bool, size: word, fields: field list, exclude: bool } type u = { src: string, tag: tag, anon: bool, size: word, all: field list, exclude: bool } type gty = { src: string, name: string, spec: ctype } type gvar = { src: string, name: string, spec: cobj } type gfun = { src: string, name: string, spec: cft, argnames: string list option } type enumval = { name: string, spec: LargeInt.int } type enum = { src: string, tag: tag, anon: bool, descr: string, spec: enumval list, exclude: bool } type spec = { structs: s list, unions: u list, gtys: gty list, gvars: gvar list, gfuns: gfun list, enums: enum list } fun join (x: spec, y: spec) = let fun uniq sel = let fun loop ([], a) = rev a | loop (h :: t, a) = loop (t, if List.exists (fn x => (sel x : string) = sel h) a then a else h :: a) in loop end in { structs = uniq #tag (#structs x, #structs y), unions = uniq #tag (#unions x, #unions y), gtys = uniq #name (#gtys x, #gtys y), gvars = uniq #name (#gvars x, #gvars y), gfuns = uniq #name (#gfuns x, #gfuns y), enums = uniq #tag (#enums x, #enums y) } : spec end val empty : spec = { structs = [], unions = [], gtys = [], gvars = [], gfuns = [], enums = [] } end mlton-20210117+dfsg/mlprof/000077500000000000000000000000001416264345000153255ustar00rootroot00000000000000mlton-20210117+dfsg/mlprof/.gitignore000066400000000000000000000000641416264345000173150ustar00rootroot00000000000000*.call-graph.dot *.ssa mlprof mlprof.exe mlprof.sml mlton-20210117+dfsg/mlprof/Makefile000066400000000000000000000012621416264345000167660ustar00rootroot00000000000000## Copyright (C) 2009,2018-2020 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### NAME := mlprof all: $(NAME) $(NAME): $(NAME).mlb $(shell "$(RUN_MLTON_DEPS)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(RUN_MLTON)" @MLton $(RUN_MLTON_RUNTIME_ARGS) -- $(RUN_MLTON_COMPILE_ARGS) -target $(TARGET) $(NAME).mlb .PHONY: clean clean: $(SRC)/bin/clean mlton-20210117+dfsg/mlprof/call-main.sml000066400000000000000000000004201416264345000176730ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20210117+dfsg/mlprof/main.sml000066400000000000000000001203201416264345000167640ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main : sig val main : unit -> unit end = struct type int = Int.t type word = Word.t val debug = false val callGraphFile: File.t option ref = ref NONE val gray: bool ref = ref false val longName: bool ref = ref true val mlmonFiles: string list ref = ref [] val raw = ref false val showLine = ref false val splitReg: Regexp.t ref = ref Regexp.none val title: string option ref = ref NONE val tolerant: bool ref = ref false structure Source = struct datatype t = NamePos of {name: string, pos: string} | Simple of string fun toString n = case n of NamePos {name, pos} => concat [name, " ", pos] | Simple s => s fun toStringMaybeLine n = case n of NamePos {name, pos} => if !showLine then concat [name, " ", pos] else name | Simple s => s val layout = Layout.str o toString fun fromString s = case String.tokens (s, fn c => Char.equals (c, #"\t")) of [s] => Simple s | [name, pos] => let val name = if !longName then name else List.last (String.tokens (name, fn c => Char.equals (c, #"."))) in NamePos {name = name, pos = pos} end | _ => Error.bug "strange source" fun toDotLabel s = case s of NamePos {name, pos} => if !showLine then [(name, Dot.Center), (pos, Dot.Center)] else [(name, Dot.Center)] | Simple s => [(s, Dot.Center)] end structure Graph = DirectedGraph local open Graph in structure Edge = Edge structure Node = Node end local open Dot in structure EdgeOption = EdgeOption structure NodeOption = NodeOption end structure AFile = struct datatype t = T of {callGraph: unit Graph.t, magic: word, master: {isSplit: bool, source: Source.t} vector, name: string, split: {masterIndex: int, node: unit Node.t} vector} fun layout (T {magic, name, master, ...}) = Layout.record [("name", String.layout name), ("magic", Word.layout magic), ("master", Vector.layout (fn {isSplit, source} => Layout.record [("isSplit", Bool.layout isSplit), ("source", Source.layout source)]) master)] fun new {afile: File.t}: t = let fun userBug m = Error.bug (concat ["Error: executable '", afile, "' ", m, "."]) in if not (File.doesExist afile) then userBug "does not exist" else if not (File.canRun afile) then userBug "does not run" else Process.callWithIn (OS.Path.mkAbsolute {path = afile, relativeTo = OS.FileSys.getDir ()}, ["@MLton", "show-sources"], fn ins => let fun line () = case In.inputLine ins of NONE => Error.bug "unexpected end of show-sources data" | SOME l => l val magic = case Word.fromString (line ()) of NONE => Error.bug "expected magic" | SOME w => w fun vector (f: string -> 'a): 'a vector = Vector.tabulate (valOf (Int.fromString (line ())), fn _ => f (line ())) val rc = Regexp.compileNFA (!splitReg) val master = vector (fn s => let val source = Source.fromString (String.dropSuffix (s, 1)) val isSplit = Regexp.Compiled.matchesPrefix (rc, Source.toString source) in {isSplit = isSplit, source = source} end) val _ = if 0 = Vector.length master then userBug "is not compiled for profiling" else () val sources = vector (fn s => case String.tokens (s, Char.isSpace) of [masterIndex, successorsIndex] => {masterIndex = valOf (Int.fromString masterIndex), successorsIndex = valOf (Int.fromString successorsIndex)} | _ => Error.bug "AFile.new") val sourceSeqs = vector (fn s => Vector.fromListMap (String.tokens (s, Char.isSpace), fn s => valOf (Int.fromString s))) val graph = Graph.new () val split = Vector.map (sources, fn {masterIndex, ...} => let val n = Graph.newNode graph in {masterIndex = masterIndex, node = n} end) val _ = Vector.foreach2 (sources, split, fn ({successorsIndex, ...}, {node = from, ...}) => Vector.foreach (Vector.sub (sourceSeqs, successorsIndex), fn to => (ignore o Graph.addEdge) (graph, {from = from, to = #node (Vector.sub (split, to))}))) val _ = case In.inputLine ins of NONE => () | SOME _ => Error.bug "expected end of file" in T {callGraph = graph, magic = magic, master = master, name = afile, split = split} end) end end structure Kind = struct datatype t = Alloc | Count | Empty | Time val toString = fn Alloc => "Alloc" | Count => "Count" | Empty => "Empty" | Time => "Time" val layout = Layout.str o toString val merge: t * t -> t = fn (k, k') => case (k, k') of (Alloc, Alloc) => Alloc | (Count, Count) => Count | (_, Empty) => k | (Empty, _) => k' | (Time, Time) => Time | _ => Error.bug "Kind.merge" end structure Style = struct datatype t = Current | Stack (* val toString = fn Current => "Current" | Stack => "Stack" *) (* val layout = Layout.str o toString *) end structure Counts = struct datatype t = Current of {master: IntInf.t vector, split: IntInf.t vector} | Empty | Stack of {master: {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t} vector, split: {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t} vector} val layout = fn Current {master, split} => Layout.record [("master", Vector.layout IntInf.layout master), ("split", Vector.layout IntInf.layout split)] | Empty => Layout.str "empty" | Stack {master, split} => let fun lay v = Vector.layout (fn {current, stack, stackGC} => Layout.record [("current", IntInf.layout current), ("stack", IntInf.layout stack), ("stackGC", IntInf.layout stackGC)]) v in Layout.record [("master", lay master), ("split", lay split)] end fun merge (c: t, c': t): t = case (c, c') of (Current {master = m, split = s}, Current {master = m', split = s'}) => let fun merge (v, v') = Vector.map2 (v, v', op +) in Current {master = merge (m, m'), split = merge (s, s')} end | (Empty, _) => c' | (_, Empty) => c | (Stack {master = m, split = s}, Stack {master = m', split = s'}) => let fun merge (v, v') = Vector.map2 (v, v', fn ({current = c, stack = s, stackGC = g}, {current = c', stack = s', stackGC = g'}) => {current = c + c', stack = s + s', stackGC = g + g'}) in Stack {master = merge (m, m'), split = merge (s, s')} end | _ => Error.bug "cannot merge -profile-stack false with -profile-stack true" end structure ProfFile = struct datatype t = T of {counts: Counts.t, kind: Kind.t, magic: word, total: IntInf.t, totalGC: IntInf.t} fun empty (AFile.T {magic, ...}) = T {counts = Counts.Empty, kind = Kind.Empty, magic = magic, total = 0, totalGC = 0} fun layout (T {counts, kind, magic, total, totalGC}) = Layout.record [("kind", Kind.layout kind), ("magic", Word.layout magic), ("total", IntInf.layout total), ("totalGC", IntInf.layout totalGC), ("counts", Counts.layout counts)] fun new {mlmonfile: File.t}: t = File.withIn (mlmonfile, fn ins => let fun line () = case In.inputLine ins of NONE => Error.bug "unexpected end of mlmon file" | SOME s => String.dropSuffix (s, 1) val _ = if "MLton prof" = line () then () else Error.bug "bad header" val kind = case line () of "alloc" => Kind.Alloc | "count" => Kind.Count | "time" => Kind.Time | _ => Error.bug "invalid profile kind" val style = case line () of "current" => Style.Current | "stack" => Style.Stack | _ => Error.bug "invalid profile style" val magic = case Word.fromString (line ()) of NONE => Error.bug "invalid magic" | SOME w => w fun s2i s = case IntInf.fromString s of NONE => Error.bug "invalid count" | SOME i => i val (total, totalGC) = case String.tokens (line (), Char.isSpace) of [total, totalGC] => (s2i total, s2i totalGC) | _ => Error.bug "invalid totals" fun getCounts (f: string -> 'a): {master: 'a vector, split: 'a vector} = let fun vector () = Vector.tabulate (valOf (Int.fromString (line ())), fn _ => f (line ())) val split = vector () val master = vector () in {master = master, split = split} end val counts = case style of Style.Current => Counts.Current (getCounts s2i) | Style.Stack => Counts.Stack (getCounts (fn s => case String.tokens (s, Char.isSpace) of [c, s, sGC] => {current = s2i c, stack = s2i s, stackGC = s2i sGC} | _ => Error.bug (concat ["strange line: ", String.dropSuffix (s, 1)]))) in T {counts = counts, kind = kind, magic = magic, total = total, totalGC = totalGC} end) fun merge (T {counts = c, kind = k, magic = m, total = t, totalGC = g}, T {counts = c', kind = k', magic = m', total = t', totalGC = g'}): t = if m <> m' then Error.bug "wrong magic number" else T {counts = Counts.merge (c, c'), kind = Kind.merge (k, k'), magic = m, total = t + t', totalGC = g + g'} end structure Atomic = struct datatype t = Name of string * Regexp.Compiled.t | Thresh of real | ThreshGC of real | ThreshStack of real val toSexp: t -> Sexp.t = fn a => let datatype z = datatype Sexp.t in case a of Name (s, _) => String s | Thresh x => List [Atom "thresh", Atom (Real.toString x)] | ThreshGC x => List [Atom "thresh-gc", Atom (Real.toString x)] | ThreshStack x => List [Atom "thresh-stack", Atom (Real.toString x)] end end structure NodePred = struct datatype t = All | And of t vector | Atomic of Atomic.t | Not of t | Or of t vector | PathFrom of t | PathTo of t | Pred of t | Succ of t val rec toSexp: t -> Sexp.t = fn p => let datatype z = datatype Sexp.t fun nAry (name, ps) = List (Atom name :: Vector.toListMap (ps, toSexp)) fun unary (name, p) = List [Atom name, toSexp p] in case p of All => Sexp.Atom "all" | And ps => nAry ("and", ps) | Atomic a => Atomic.toSexp a | Not p => unary ("not", p) | Or ps => nAry ("or", ps) | PathFrom p => unary ("from", p) | PathTo p => unary ("to", p) | Pred p => unary ("pred", p) | Succ p => unary ("succ", p) end (* val layout = Sexp.layout o toSexp *) val fromString: string -> t = fn s => case Sexp.fromString s of Sexp.Eof => Error.bug "empty" | Sexp.Error s => Error.bug s | Sexp.Sexp s => let fun parse (s: Sexp.t): t = let fun err () = Error.bug (Sexp.toString s) in case s of Sexp.Atom s => (case s of "all" => All | _ => err ()) | Sexp.List ss => (case ss of [] => err () | s :: ss => let fun nAry f = f (Vector.fromListMap (ss, parse)) fun unary f = case ss of [s] => f (parse s) | _ => err () fun thresh f = case ss of [Sexp.Atom x] => (case Real.fromString x of NONE => err () | SOME x => if 0.0 <= x andalso x <= 100.0 then Atomic (f x) else err ()) | _ => err () datatype z = datatype Atomic.t in case s of Sexp.Atom s => (case s of "and" => nAry And | "from" => unary PathFrom | "not" => unary Not | "or" => nAry Or | "pred" => unary Pred | "succ" => unary Succ | "thresh" => thresh Thresh | "thresh-gc" => thresh ThreshGC | "thresh-stack" => thresh ThreshStack | "to" => unary PathTo | _ => err ()) | _ => err () end) | Sexp.String s => (case Regexp.fromString s of NONE => err () | SOME (r, _) => Atomic (Atomic.Name (s, Regexp.compileNFA r))) end in parse s end fun nodes (p: t, g: 'a Graph.t, atomic: 'a Node.t * Atomic.t -> bool): 'a Node.t vector = let val {get = nodeIndex: 'a Node.t -> int, set = setNodeIndex, ...} = Property.getSet (Node.plist, Property.initRaise ("index", Node.layout)) val nodes = Vector.fromList (Graph.nodes g) val numNodes = Vector.length nodes val _ = Vector.foreachi (nodes, fn (i, n) => setNodeIndex (n, i)) val transpose = Promise.lazy (fn () => let val {get = nodeIndex': 'a Graph.u Node.t -> int, set = setNodeIndex, ...} = Property.getSet (Node.plist, Property.initRaise ("index", Node.layout)) val (transpose, {newNode, ...}) = Graph.transpose g val _ = Graph.foreachNode (g, fn n => setNodeIndex (newNode n, nodeIndex n)) in (transpose, newNode, nodeIndex') end) fun vectorToNodes (v: bool vector): 'a Node.t vector = Vector.keepAllMapi (v, fn (i, b) => if b then SOME (Vector.sub (nodes, i)) else NONE) val all = Promise.lazy (fn () => Vector.tabulate (numNodes, fn _ => true)) val none = Promise.lazy (fn () => Vector.tabulate (numNodes, fn _ => false)) fun path (v: bool vector, (g: 'b Graph.t, getNode: 'a Node.t -> 'b Node.t, nodeIndex: 'b Node.t -> int)): bool vector = let val roots = vectorToNodes v val a = Array.array (numNodes, false) val _ = Graph.dfsNodes (g, Vector.toListMap (roots, getNode), Graph.DfsParam.startNode (fn n => Array.update (a, nodeIndex n, true))) in Vector.fromArray a end fun loop (p: t): bool vector = case p of All => all () | And ps => Vector.fold (ps, all (), fn (p, v) => Vector.map2 (v, loop p, fn (b, b') => b andalso b')) | Atomic a => Vector.map (nodes, fn n => atomic (n, a)) | Not p => Vector.map (loop p, not) | Or ps => Vector.fold (ps, none (), fn (p, v) => Vector.map2 (v, loop p, fn (b, b') => b orelse b')) | PathFrom p => path (loop p, (g, fn n => n, nodeIndex)) | PathTo p => path (loop p, transpose ()) | Pred p => let val ns = vectorToNodes (loop p) val {destroy, get, set, ...} = Property.destGetSetOnce (Node.plist, Property.initConst false) val _ = Vector.foreach (ns, fn n => set (n, true)) val v = Vector.map (nodes, fn n => get n orelse List.exists (Node.successors n, get o Edge.to)) val _ = destroy () in v end | Succ p => let val a = Array.array (numNodes, false) fun yes n = Array.update (a, nodeIndex n, true) val _ = Vector.foreach (vectorToNodes (loop p), fn n => (yes n ; List.foreach (Node.successors n, yes o Edge.to))) in Vector.fromArray a end val v = loop p in vectorToNodes v end end val keep: NodePred.t ref = ref NodePred.All val ticksPerSecond = 100.0 fun display (AFile.T {callGraph, master, name = aname, split, ...}, ProfFile.T {counts, kind, total, totalGC, ...}): unit = let val {get = nodeInfo: (unit Node.t -> {index: int, keep: bool ref, mayKeep: (Atomic.t -> bool) ref}), set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreachi (split, fn (i, {node, ...}) => setNodeInfo (node, {index = i, keep = ref false, mayKeep = ref (fn _ => false)})) val profileStack = case counts of Counts.Current _ => false | Counts.Empty => false | Counts.Stack _ => true val totalReal = Real.fromIntInf (total + totalGC) val per: IntInf.t -> real = if Real.equals (0.0, totalReal) then fn _ => 0.0 else fn ticks => 100.0 * Real.fromIntInf ticks / totalReal fun doit ({master = masterCount: 'a vector, split = splitCount: 'a vector}, f: 'a -> {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t}) = let val _ = Vector.foreachi (split, fn (i, {masterIndex, node, ...}) => let val {mayKeep, ...} = nodeInfo node val {isSplit, source, ...} = Vector.sub (master, masterIndex) val name = Source.toString source in mayKeep := (fn a => let fun thresh (x: real, sel) = let val (v, i) = if isSplit then (splitCount, i) else (masterCount, masterIndex) in per (sel (f (Vector.sub (v, i)))) >= x end datatype z = datatype Atomic.t in case a of Name (_, rc) => Regexp.Compiled.matchesPrefix (rc, name) | Thresh x => thresh (x, #current) | ThreshGC x => thresh (x, #stackGC) | ThreshStack x => thresh (x, #stack) end) end) fun row (ticks: IntInf.t): string list = (concat [Real.format (per ticks, Real.Format.fix (SOME 1)), "%"]) :: (if !raw then [concat (case kind of Kind.Alloc => ["(", IntInf.toCommaString ticks, ")"] | Kind.Count => ["(", IntInf.toCommaString ticks, ")"] | Kind.Empty => [] | Kind.Time => ["(", Real.format (Real.fromIntInf ticks / ticksPerSecond, Real.Format.fix (SOME 2)), "s)"])] else []) fun info (source: Source.t, a: 'a) = let val {current, stack, stackGC} = f a val row = row current @ (if profileStack then row stack @ row stackGC else []) val pc = per current val isNonZero = current > 0 orelse stack > 0 orelse stackGC > 0 val tableInfo = if isNonZero orelse (kind = Kind.Count andalso (case source of Source.NamePos _ => true | _ => false)) then SOME {per = pc, row = Source.toStringMaybeLine source :: row} else NONE val nodeOptions = [Dot.NodeOption.Shape Dot.Box, Dot.NodeOption.Label (Source.toDotLabel source @ (if isNonZero then [(concat (List.separate (row, " ")), Dot.Center)] else [])), Dot.NodeOption.Color (if !gray then DotColor.gray (100 - Real.round (per stack)) else DotColor.Black)] in {nodeOptions = nodeOptions, tableInfo = tableInfo} end val masterOptions = Vector.map2 (master, masterCount, fn ({source, ...}, a) => info (source, a)) val splitOptions = Vector.map2 (split, splitCount, fn ({masterIndex, ...}, a) => info (#source (Vector.sub (master, masterIndex)), a)) in (masterOptions, splitOptions) end val (masterInfo, splitInfo) = case counts of Counts.Current ms => doit (ms, fn z => {current = z, stack = 0, stackGC = 0}) | Counts.Empty => doit ({master = Vector.new (Vector.length master, ()), split = Vector.new (Vector.length split, ())}, fn () => {current = 0, stack = 0, stackGC = 0}) | Counts.Stack ms => doit (ms, fn z => z) val keep = !keep val keepNodes = NodePred.nodes (keep, callGraph, fn (n, a) => (! (#mayKeep (nodeInfo n))) a) val _ = Vector.foreach (keepNodes, fn n => #keep (nodeInfo n) := true) (* keep a master node if it is not split and some copy of it is kept. *) val keepMaster = Array.new (Vector.length master, false) val _ = Vector.foreach (split, fn {masterIndex, node, ...} => let val {keep, ...} = nodeInfo node val {isSplit, ...} = Vector.sub (master, masterIndex) in if !keep andalso not isSplit then Array.update (keepMaster, masterIndex, true) else () end) datatype keep = T val keepGraph: keep Graph.t = Graph.new () val {get = nodeOptions: keep Node.t -> NodeOption.t list, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val tableInfos = ref [] fun newNode {nodeOptions: NodeOption.t list, tableInfo} = let val _ = Option.app (tableInfo, fn z => List.push (tableInfos, z)) val n = Graph.newNode keepGraph val _ = setNodeOptions (n, nodeOptions) in n end val masterNodes = Vector.tabulate (Vector.length master, fn i => if Array.sub (keepMaster, i) then SOME (newNode (Vector.sub (masterInfo, i))) else NONE) val splitNodes = Vector.mapi (split, fn (i, {masterIndex, node, ...}) => let val {keep, ...} = nodeInfo node val {isSplit, ...} = Vector.sub (master, masterIndex) in if isSplit then if !keep then SOME (newNode (Vector.sub (splitInfo, i))) else NONE else Vector.sub (masterNodes, masterIndex) end) val _ = Graph.foreachEdge (callGraph, fn (from, e) => let val to = Edge.to e fun f n = Vector.sub (splitNodes, #index (nodeInfo n)) in case (f from, f to) of (SOME from, SOME to) => (ignore o Graph.addEdge) (keepGraph, {from = from, to = to}) | _ => () end) val {get = edgeOptions: keep Edge.t -> EdgeOption.t list ref, ...} = Property.get (Edge.plist, Property.initFun (fn _ => ref [])) (* Add a dashed edge from A to B if there is path from A to B of length * >= 2 going through only ignored nodes. *) fun newNode (n: unit Node.t): keep Node.t option = Vector.sub (splitNodes, #index (nodeInfo n)) fun reach (root: unit Node.t, f: keep Node.t -> unit): unit = let val {get = isKept: keep Node.t -> bool ref, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref false)) val {get = isSeen: unit Node.t -> bool ref, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref false)) fun loop n = List.foreach (Node.successors n, fn e => let val n = Edge.to e val s = isSeen n in if !s then () else let val _ = s := true in case newNode n of NONE => loop n | SOME keepN => let val r = isKept keepN in if !r then () else (r := true; f keepN) end end end) val _ = List.foreach (Node.successors root, fn e => let val n = Edge.to e in if Option.isNone (newNode n) then loop n else () end) in () end val _ = Vector.foreach2 (split, splitNodes, fn ({node = from, ...}, z) => Option.app (z, fn from' => (reach (from, fn to => let val e = Graph.addEdge (keepGraph, {from = from', to = to}) val _ = List.push (edgeOptions e, EdgeOption.Style Dot.Dashed) in () end)))) val _ = Graph.removeDuplicateEdges keepGraph val title = case !title of NONE => concat [aname, " call-stack graph"] | SOME s => s val _ = Option.app (!callGraphFile, fn f => File.withOut (f, fn out => Layout.output (Graph.layoutDot (keepGraph, fn _ => {edgeOptions = ! o edgeOptions, nodeOptions = nodeOptions, options = [], title = title}), out))) (* Display the table. *) val tableRows = QuickSort.sortVector (Vector.fromList (!tableInfos), fn (z, z') => #per z >= #per z') val _ = print (concat (case kind of Kind.Alloc => [IntInf.toCommaString total, " bytes allocated (", IntInf.toCommaString totalGC, " bytes by GC)\n"] | Kind.Count => [IntInf.toCommaString total, " ticks\n"] | Kind.Empty => [] | Kind.Time => let fun t2s i = Real.format (Real.fromIntInf i / ticksPerSecond, Real.Format.fix (SOME 2)) in [t2s total, " seconds of CPU time (", t2s totalGC, " seconds GC)\n"] end)) val columnHeads = "function" :: let val pers = if profileStack then ["cur", "stack", "GC"] else ["cur"] in if !raw then List.concatMap (pers, fn p => [p, "raw"]) else pers end val cols = (if profileStack then 3 else 1) * (if !raw then 2 else 1) val _ = let open Justify in outputTable (table {columnHeads = SOME columnHeads, justs = Left :: List.duplicate (cols, fn () => Right), rows = Vector.toListMap (tableRows, #row)}, Out.standard) end in () end fun makeOptions {usage} = let open Popt in List.map ([(Normal, "call-graph", " ", "write call graph to dot file", SpaceString (fn s => callGraphFile := SOME s)), (Normal, "graph-title", " ", "set call-graph title", SpaceString (fn s => title := SOME s)), (Normal, "gray", " {false|true}", "gray nodes according to stack %", boolRef gray), (Normal, "keep", " ", "which functions to display", SpaceString (fn s => keep := NodePred.fromString s handle e => usage (concat ["invalid -keep arg: ", Exn.toString e]))), (Expert, "long-name", " {true|false}", " show long names of functions", boolRef longName), (Normal, "mlmon", " ", "process mlmon files listed in ", SpaceString (fn s => mlmonFiles := List.concat [String.tokens (File.contents s, Char.isSpace), !mlmonFiles])), (Normal, "raw", " {false|true}", "show raw counts", boolRef raw), (Normal, "show-line", " {false|true}", "show line numbers", boolRef showLine), (Normal, "split", " ", "split matching functions", SpaceString (fn s => case Regexp.fromString s of NONE => usage (concat ["invalid -split regexp: ", s]) | SOME (r, _) => splitReg := Regexp.or [r, !splitReg])), (Normal, "thresh", " [0.0,100.0]", "-keep (thresh x)", Real (fn x => if x < 0.0 orelse x > 100.0 then usage "invalid -thresh" else keep := NodePred.Atomic (Atomic.Thresh x))), (Normal, "tolerant", " {false|true}", "ignore broken mlmon files", boolRef tolerant)], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlprof [option ...] a.out [mlmon.out ...]" val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => false} val die = Process.fail fun commandLine args = let val rest = parse args in case rest of Result.No msg => usage msg | Result.Yes (afile :: files) => let val mlmonFiles = files @ !mlmonFiles val aInfo = AFile.new {afile = afile} val _ = if debug then (print "AFile:\n" ; Layout.outputl (AFile.layout aInfo, Out.standard)) else () val profFile = List.fold (mlmonFiles, ProfFile.empty aInfo, fn (mlmonfile, profFile) => ProfFile.merge (profFile, ProfFile.new {mlmonfile = mlmonfile}) handle e => let val msg = concat ["Error loading mlmon file '", mlmonfile, "': ", Exn.toString e] in if !tolerant then (Out.outputl (Out.error, msg) ; profFile) else die msg end) val _ = if debug then (print "ProfFile:\n" ; Layout.outputl (ProfFile.layout profFile, Out.standard)) else () val _ = display (aInfo, profFile) in () end | Result.Yes _ => usage "wrong number of args" end val main = Process.makeMain commandLine end mlton-20210117+dfsg/mlprof/mlprof.mlb000066400000000000000000000003661416264345000173250ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20210117+dfsg/mlprof/sources.mlb000066400000000000000000000004211416264345000175010ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../lib/mlton/sources.mlb main.sml in structure Main end mlton-20210117+dfsg/mlton/000077500000000000000000000000001416264345000151575ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/.gitignore000066400000000000000000000007601416264345000171520ustar00rootroot00000000000000## Ignore all .cm directories .cm/ ## Ignore all .basis files *.basis /mlton*-compile /mlton*-compile.exe /mlton*-compile.debug /mlton*-compile.debug.exe /mlton*-compile.alloc /mlton*-compile.alloc.exe /mlton*-compile.count /mlton*-compile.count.exe /mlton*-compile.time /mlton*-compile.time.exe /mlton*-compile.trace /mlton*-compile.trace.exe /mlton*-compile-polyml /mlton*-compile-polyml.exe /mlton-polyml.use /mlton*-compile-smlnj.*-* /mlton-stubs.mlb /mlton.def-use /mlton-bootstrap-*.tgz mlton-20210117+dfsg/mlton/Makefile000066400000000000000000000200311416264345000166130ustar00rootroot00000000000000## Copyright (C) 2010,2013,2016,2018-2020 Matthew Fluet. # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### RUN_MLTON_RUNTIME_XARGS := ram-slop 0.7 RUN_MLTON_COMPILE_XARGS := ifeq (true, $(SELF_COMPILE)) # Older versions of `mlton` may not support `sequenceNonUnit` or `warnUnused`. RUN_MLTON_COMPILE_XARGS += -default-ann 'sequenceNonUnit warn' RUN_MLTON_COMPILE_XARGS += -default-ann 'warnUnused true' # RUN_MLTON_COMPILE_XARGS += -type-check true # We're self-compiling, so don't use any stubs. MLTON_MLB := mlton.mlb else ifneq (, $(findstring $(HOST_OS),cygwin mingw)) # We're bootstrapping on Cygwin or MinGW; stubs define `spawn` in terms of # `fork` and `fork` doesn't work on Cygwin or MinGW, so don't use any stubs. MLTON_MLB := mlton.mlb else # We're bootstrapping, so use stubs. MLTON_MLB := mlton-stubs.mlb endif endif ## When self-compiling the current MLton sources with `Zone` enabled, ## the resulting compiler exhibits a space leak; see MLton/mlton#334 ifeq ($(RUN_MLTON_VERSION), $(firstword $(sort $(RUN_MLTON_VERSION) 20170629))) RUN_MLTON_COMPILE_XARGS += -drop-pass zone else ifeq ($(RUN_MLTON_VERSION), $(firstword $(sort $(RUN_MLTON_VERSION) 20191003))) RUN_MLTON_COMPILE_XARGS += -disable-pass zone endif FRONT_END_SOURCES := \ front-end/ml.lex.sml \ front-end/ml.grm.sig \ front-end/ml.grm.sml \ front-end/mlb.lex.sml \ front-end/mlb.grm.sig \ front-end/mlb.grm.sml SOURCES := \ $(MLTON_MLB) \ $(FRONT_END_SOURCES) \ control/version.sml \ $(shell if [ -e $(MLTON_MLB) ]; then "$(RUN_MLTON_DEPS)" -stop f $(MLTON_MLB); fi) .PHONY: all all: $(MLTON_OUTPUT) .PHONY: clean clean: $(SRC)/bin/clean SHOW_VARS += MLTON_MLB $(eval $(MK_SHOW_CONFIG)) ###################################################################### $(MLTON_OUTPUT): $(SOURCES) @echo 'Compiling mlton' "$(RUN_MLTON)" \ @MLton $(RUN_MLTON_RUNTIME_XARGS) $(RUN_MLTON_RUNTIME_ARGS) gc-summary -- \ $(RUN_MLTON_COMPILE_XARGS) -verbose 2 $(RUN_MLTON_COMPILE_ARGS) \ -target $(TARGET) -output $(MLTON_OUTPUT) \ $(MLTON_MLB) ifeq ($(shell (cat control/version_sml.src; echo '$(MLTON_NAME)' '$(MLTON_VERSION)'; if [ -e control/version.sml ]; then cat control/version.sml; fi) | $(SHA1DGST)),$(shell if [ -e control/version_sml.chk ]; then cat control/version_sml.chk; fi)) control/version.sml: control/version_sml.src touch control/version.sml else $(shell $(RM) control/version.sml) control/version.sml: control/version_sml.src $(SED) \ -e "s/MLTON_NAME/$(MLTON_NAME)/" \ -e "s/MLTON_VERSION/$(MLTON_VERSION)/" \ < control/version_sml.src \ > control/version.sml (cat control/version_sml.src; echo '$(MLTON_NAME)' '$(MLTON_VERSION)'; cat control/version.sml) | $(SHA1DGST) > control/version_sml.chk endif front-end/%.lex.sml: front-end/%.lex $(RM) $<.* $(RUN_MLLEX) $< $(MV) $<.sml $<.sml.in $(SED) -e 's/val s = List.map f (List.rev (tl (List.rev s)))/val s = Pervasive.List.map f (Pervasive.List.rev (tl (Pervasive.List.rev s)))/' $<.sml.in > $<.sml $(MV) $<.sml $<.sml.in $(SED) -e 's/in Vector.fromList(List.map g/in Vector.fromList(Pervasive.List.map g/' $<.sml.in > $<.sml $(RM) $<.sml.in $(CHMOD) -w $<.* front-end/%.grm.sig front-end/%.grm.sml: front-end/%.grm $(RM) $<.* $(RUN_MLYACC) $< $(MV) $<.sml $<.sml.in $(SED) -e 's/in f 0 handle General.Subscript => ()/in f 0 handle Pervasive.General.Subscript => ()/' $<.sml.in > $<.sml $(MV) $<.sml $<.sml.in $(SED) -e 's/in Array.fromList(List.map actionRowLookUp actionRowNumbers)/in Array.fromList(Pervasive.List.map actionRowLookUp actionRowNumbers)/' $<.sml.in > $<.sml $(RM) $<.sml.in $(CHMOD) -w $<.* mlton-stubs.mlb: $(shell "$(RUN_MLTON_DEPS)" -stop f ../lib/stubs/mlton-stubs/sources.mlb | $(GREP) 'mlb$$') $(shell "$(RUN_MLTON_DEPS)" -stop f mlton.mlb | $(GREP) 'mlb$$') ( \ echo '$$(SML_LIB)/basis/unsafe.mlb'; \ echo '$$(SML_LIB)/basis/sml-nj.mlb'; \ echo '$$(SML_LIB)/basis/mlton.mlb'; \ echo '$$(SML_LIB)/basis/basis.mlb'; \ $(RUN_MLTON) -stop f mlton.mlb | \ $(GREP) -v 'mlb$$' | \ $(GREP) 'mlyacc'; \ $(RUN_MLTON) -stop f ../lib/stubs/mlton-stubs/sources.mlb | \ $(GREP) -v 'mlb$$' | \ $(GREP) 'mlton-stubs'; \ $(RUN_MLTON) -stop f mlton.mlb | \ $(GREP) -v 'mlb$$' | \ $(GREP) -v 'sml/basis' | \ $(GREP) -v 'targets' | \ $(GREP) -v 'mlyacc'; \ ) > mlton-stubs.mlb ###################################################################### .PHONY: def-use def-use: mlton.def-use mlton.def-use: $(SOURCES) "$(RUN_MLTON)" \ @MLton $(RUN_MLTON_RUNTIME_XARGS) $(RUN_MLTON_RUNTIME_ARGS) -- \ $(RUN_MLTON_COMPILE_XARGS) -verbose 0 $(RUN_MLTON_COMPILE_ARGS) \ -stop tc -prefer-abs-paths true -show-def-use mlton.def-use \ $(MLTON_MLB) ###################################################################### ifneq (,$(REMOTE_TARGET)) mlton-bootstrap-$(REMOTE_TARGET).tgz: $(SOURCES) "$(RUN_MLTON)" \ @MLton $(RUN_MLTON_RUNTIME_XARGS) $(RUN_MLTON_RUNTIME_ARGS) gc-summary -- \ $(RUN_MLTON_COMPILE_XARGS) -verbose 2 $(RUN_MLTON_COMPILE_ARGS) \ -target $(REMOTE_TARGET) -output $(MLTON_OUTPUT) \ -codegen c -stop g \ $(MLTON_MLB) $(TAR) czf $@ $(MLTON_OUTPUT).*.c $(RM) $(MLTON_OUTPUT).*.c endif ###################################################################### # # The following rebuilds the heap file for the SML/NJ compiled version of MLton. # SMLNJ := sml SMLNJ_CM_SERVERS_NUM := 0 .PHONY: smlnj-mlton smlnj-mlton: mlton-smlnj.cm control/version.sml $(FRONT_END_SOURCES) ( \ echo 'SMLofNJ.Internals.GC.messages false;'; \ echo '#set CM.Control.verbose false;'; \ echo '#set CM.Control.warn_obsolete true;'; \ echo 'Control.polyEqWarn := false;'; \ echo 'local'; \ echo 'fun loop 0 = () | loop n = (CM.Server.start {cmd = (CommandLine.name (), ["@CMslave"]), name = "server" ^ (Int.toString n), pathtrans = NONE, pref = 0}; loop (n - 1));'; \ echo 'in'; \ echo 'val _ = loop $(SMLNJ_CM_SERVERS_NUM);'; \ echo 'end;'; \ echo 'if (CM.make "mlton-smlnj.cm") handle _ => false'; \ echo ' then ()'; \ echo ' else OS.Process.exit OS.Process.failure;'; \ echo 'SMLofNJ.exportFn("$(MLTON_OUTPUT)-smlnj",Main.main);' \ ) | "$(SMLNJ)" ###################################################################### # # The following rebuilds the executable file for the Poly/ML compiled version of # MLton. # POLYML := poly .PHONY: polyml-mlton polyml-mlton: mlton-polyml.use $(shell [ -e mlton-polyml.use ] && cat mlton-polyml.use | $(SED) 's/use "\(.*\)";/\1/') control/version.sml $(FRONT_END_SOURCES) ( \ echo 'use "mlton-polyml.use";'; \ echo 'PolyML.export("$(MLTON_OUTPUT)-polyml", Main.mainWrapped);'; \ ) | "$(POLYML)" $(CC) -o $(MLTON_OUTPUT)-polyml $(MLTON_OUTPUT)-polyml.o -lpolymain -lpolyml $(RM) $(MLTON_OUTPUT)-polyml.o mlton-polyml.use: ../lib/stubs/basis-stubs-for-polyml/sources.use ../lib/stubs/mlton-stubs-for-polyml/sources.use $(shell "$(RUN_MLTON_DEPS)" -stop f ../lib/stubs/mlton-stubs/sources.mlb | $(GREP) 'mlb$$') $(shell "$(RUN_MLTON_DEPS)" -stop f mlton.mlb | $(GREP) 'mlb$$') ( \ cat ../lib/stubs/basis-stubs-for-polyml/sources.use | \ $(SED) 's|use "\(.*\)";|../lib/stubs/basis-stubs-for-polyml/\1|'; \ "$(RUN_MLTON)" -stop f mlton.mlb | $(GREP) -v 'mlb$$' | $(GREP) 'mlyacc'; \ cat ../lib/stubs/mlton-stubs-for-polyml/sources.use | \ $(SED) 's|use "\(.*\)";|../lib/stubs/mlton-stubs-for-polyml/\1|'; \ "$(RUN_MLTON)" -stop f ../lib/stubs/mlton-stubs/sources.mlb | \ $(GREP) -v 'mlb$$' | \ $(GREP) 'mlton-stubs'; \ "$(RUN_MLTON)" -stop f mlton.mlb | \ $(GREP) -v 'mlb$$' | \ $(GREP) -v 'sml/basis' | \ $(GREP) -v 'targets' | \ $(GREP) -v 'mlton-stubs' | \ $(GREP) -v 'mlyacc' | \ $(GREP) -v 'call-main.sml'; \ ) | $(SED) 's|\(.*\)|use "\1";|' > mlton-polyml.use mlton-20210117+dfsg/mlton/ast/000077500000000000000000000000001416264345000157465ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/ast/ast-atoms.fun000066400000000000000000000460351416264345000204000ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstAtoms (S: AST_ATOMS_STRUCTS): AST_ATOMS = struct open S structure Wrap = Region.Wrap structure Field = Record.Field structure Const = AstConst () structure Tyvar = struct structure Id = AstId (structure Symbol = Symbol) open Id fun isEquality t = let val s = toString t in String.length s > 1 andalso String.sub (s, 1) = #"'" end end structure Tycon = struct structure Id = AstId (structure Symbol = Symbol) open Id structure P = PrimTycons (structure AdmitsEquality = AdmitsEquality structure CharSize = CharSize structure IntSize = IntSize structure Kind = TyconKind structure RealSize = RealSize structure WordSize = WordSize open Id fun fromString s = Id.fromSymbol (Symbol.fromString s, Region.bogus)) open P end structure Var = AstId (structure Symbol = Symbol) structure Con = struct structure Id = AstId (structure Symbol = Symbol) open Id structure P = PrimCons (open Id fun fromString s = fromSymbol (Symbol.fromString s, Region.bogus)) open P val special = [cons, falsee, nill, reff, truee] end structure Basid = AstId (structure Symbol = Symbol) structure Sigid = AstId (structure Symbol = Symbol) structure Strid = AstId (structure Symbol = Symbol) structure Strid = struct open Strid local fun make s = fromSymbol (Symbol.fromString s, Region.bogus) in val uArg = fn s => make ("_arg_" ^ s) val uRes = fn s => make ("_res_" ^ s) val uStr = make "_str" val uSig = make "_sig" end end structure Fctid = AstId (structure Symbol = Symbol) structure Vid = struct structure I = AstId (structure Symbol = Symbol) open I fun fromCon c = fromSymbol (Con.toSymbol c, Con.region c) fun fromVar x = fromSymbol (Var.toSymbol x, Var.region x) local fun make f v = f (toSymbol v, region v) in val toCon = make Con.fromSymbol val toVar = make Var.fromSymbol end val it = fromSymbol (Symbol.itt, Region.bogus) val equal = fromSymbol (Symbol.equal, Region.bogus) val specialCons = List.map (Con.special, fromCon) fun checkSpecial (oper, ctrl) (vid, {allowIt, ctxt, keyword}) = if not (Control.Elaborate.current ctrl) andalso ((not allowIt andalso equals (vid, it)) orelse equals (vid, equal) orelse List.exists (specialCons, fn vid' => equals (vid, vid'))) then let open Layout in Control.error (region vid, seq [str "special identifier cannot be ", str oper, str " by ", str keyword, str ": ", layout vid], ctxt ()) end else () val checkRedefineSpecial = checkSpecial ("redefined", Control.Elaborate.allowRedefineSpecialIds) val checkSpecifySpecial = checkSpecial ("specified", Control.Elaborate.allowSpecifySpecialIds) end structure Longtycon = struct structure T = Longid (structure Id = Tycon structure Strid = Strid structure Symbol = Symbol) open T val arrow = short Tycon.arrow end structure Longvar = Longid (structure Id = Var structure Strid = Strid structure Symbol = Symbol) structure Longcon = struct structure L = Longid (structure Id = Con structure Strid = Strid structure Symbol = Symbol) open L end structure Longstrid = Longid (structure Id = Strid structure Strid = Strid structure Symbol = Symbol) structure Longvid = struct structure L = Longid (structure Id = Vid structure Strid = Strid structure Symbol = Symbol) open L local fun to (make,node, conv) x = let val (T {strids, id}, region) = dest x in make (node {strids = strids, id = conv id}, region) end in val toLongcon = to (Longcon.makeRegion, Longcon.T, Vid.toCon) end end open Layout fun mkCtxt (x, lay) () = seq [str "in: ", lay x] fun reportDuplicates (v: 'a vector, {ctxt: unit -> Layout.t, equals: 'a * 'a -> bool, layout: 'a -> Layout.t, name: string, region: 'a -> Region.t}) = Vector.foreachi (v, fn (i, a) => let fun loop i' = if i = i' then () else if not (equals (a, Vector.sub (v, i'))) then loop (i' + 1) else let open Layout in Control.error (region a, seq [str (concat ["duplicate ", name, ": "]), layout a], ctxt ()) end in loop 0 end) fun reportDuplicateFields (v: (Field.t * (Region.t * 'a)) vector, {ctxt: unit -> Layout.t}): unit = reportDuplicates (v, {ctxt = ctxt, equals = fn ((f, _), (f', _)) => Field.equals (f, f'), layout = Field.layout o #1, name = "label", region = #1 o #2}) fun reportDuplicateTyvars (v: Tyvar.t vector, {ctxt: unit -> Layout.t}): unit = reportDuplicates (v, {ctxt = ctxt, equals = Tyvar.equals, layout = Tyvar.layout, name = "type variable", region = Tyvar.region}) structure Type = struct open Wrap datatype node = Con of Longtycon.t * t vector | Paren of t | Record of (Region.t * t) Record.t | Var of Tyvar.t withtype t = node Wrap.t type node' = node type obj = t fun make n = makeRegion (n, Region.bogus) val var = make o Var val record = make o Record val tuple = record o Record.tuple o (fn tys => Vector.map (tys, fn ty => (Region.bogus, ty))) val unit = tuple (Vector.new0 ()) fun con (c: Tycon.t, ts: t vector): t = if Tycon.equals (c, Tycon.tuple) then tuple ts else make (Con (Longtycon.short c, ts)) fun arrow (t1, t2) = con (Tycon.arrow, Vector.new2 (t1, t2)) fun layoutApp (tycon, args: 'a vector, layoutArg) = case Vector.length args of 0 => tycon | 1 => seq [layoutArg (Vector.first args), str " ", tycon] | _ => seq [Vector.layout layoutArg args, str " ", tycon] fun layout ty = case node ty of Var v => Tyvar.layout v | Con (c, tys) => if Longtycon.equals (c, Longtycon.arrow) then if 2 = Vector.length tys then paren (mayAlign [layout (Vector.first tys), seq [str "-> ", layout (Vector.sub (tys, 1))]]) else Error.bug "AstAtoms.Type.layout: non-binary -> tyc" else layoutApp (Longtycon.layout c, tys, layout) | Paren t => layout t | Record r => Record.layout {record = r, separator = ": ", extra = "", layoutElt = layout o #2, layoutTuple = fn rtys => layoutTupleTy (Vector.map (rtys, #2))} and layoutTupleTy tys = case Vector.length tys of 0 => str "unit" | 1 => layout (Vector.first tys) | _ => paren (mayAlign (separateLeft (Vector.toListMap (tys, layout), "* "))) fun layoutOption ty = case ty of NONE => empty | SOME ty => seq [str " of ", layout ty] fun checkSyntax (t: t): unit = case node t of Con (_, ts) => Vector.foreach (ts, checkSyntax) | Paren t => checkSyntax t | Record r => (reportDuplicateFields (Record.toVector r, {ctxt = mkCtxt (t, layout)}) ; Record.foreach (r, checkSyntax o #2)) | Var _ => () end fun bind (x, y) = mayAlign [seq [x, str " ="], y] fun 'a layoutAndsSusp (prefix: string, xs: 'a vector, layoutX: bool * Layout.t * 'a -> Layout.t): (unit -> Layout.t) vector = Vector.mapi (xs, fn (i, x) => fn () => layoutX (i = 0, if i = 0 then str (concat [prefix, " "]) else str "and ", x)) fun 'a layoutAnds (prefix: string, xs: 'a vector, layoutX: Layout.t * 'a -> Layout.t): Layout.t = align (Vector.toListMap (layoutAndsSusp (prefix, xs, fn (_, prefix, x) => layoutX (prefix, x)), fn th => th ())) datatype bindStyle = OneLine | Split of int fun 'a layoutBind (bind: string, layout: 'a -> bindStyle * Layout.t * Layout.t) (prefix: Layout.t, x: 'a): Layout.t = let val (style, lhs, rhs) = layout x val lhs = seq [prefix, lhs, str " " , str bind] in case style of OneLine => seq [lhs, str " ", rhs] | Split indentation => align [lhs, indent (rhs, indentation)] end fun layoutAndsBind (prefix, bind, xs, layout) = layoutAnds (prefix, xs, layoutBind (bind, layout)) (*---------------------------------------------------*) (* TypBind *) (*---------------------------------------------------*) structure TypBind = struct datatype node = T of {tycon: Tycon.t, def: Type.t, tyvars: Tyvar.t vector} vector open Wrap type t = node Wrap.t type node' = node type obj = t fun layout t = let val T ds = node t in layoutAndsBind ("type", "=", ds, fn {tycon, def, tyvars} => (OneLine, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), Type.layout def)) end val empty = makeRegion (T (Vector.new0 ()), Region.bogus) fun isEmpty (b: t) = let val T ds = node b in Vector.isEmpty ds end fun checkSyntax (b: t, kind: string): unit = let val T v = node b val () = Vector.foreach (v, fn {tyvars, tycon, def} => (reportDuplicateTyvars (tyvars, {ctxt = fn () => seq [str "in: ", Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]}) ; Type.checkSyntax def)) in reportDuplicates (v, {ctxt = mkCtxt (b, layout), equals = (fn ({tycon = t, ...}, {tycon = t', ...}) => Tycon.equals (t, t')), layout = Tycon.layout o #tycon, name = "type " ^ kind, region = Tycon.region o #tycon}) end fun checkSyntaxDef b = checkSyntax (b, "definition") fun checkSyntaxSpec b = checkSyntax (b, "specification") end (*---------------------------------------------------*) (* DatBind *) (*---------------------------------------------------*) structure DatBind = struct datatype node = T of {datatypes: {cons: (Con.t * Type.t option) vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector, withtypes: TypBind.t} open Wrap type t = node Wrap.t type node' = node type obj = t fun layout (prefix, d) = let val T {datatypes, withtypes} = node d in align [layoutAndsBind (prefix, "=", datatypes, fn {tyvars, tycon, cons} => (OneLine, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), alignPrefix (Vector.toListMap (cons, fn (c, to) => seq [Con.layout c, Type.layoutOption to]), "| "))), case TypBind.node withtypes of TypBind.T v => if Vector.isEmpty v then empty else seq [str "with", TypBind.layout withtypes]] end fun checkSyntax (b: t, kind: string, vidCheckSpecial: Vid.t * {allowIt: bool, ctxt: unit -> Layout.t, keyword: string} -> unit): unit = let val T {datatypes, withtypes} = node b val TypBind.T withtypes = TypBind.node withtypes val ctxt = mkCtxt ((), fn () => layout ("datatype", b)) val () = Vector.foreach (datatypes, fn {tyvars, tycon, cons} => (reportDuplicateTyvars (tyvars, {ctxt = fn () => seq [str "in: ", Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]}) ; Vector.foreach (cons, fn (c, to) => (vidCheckSpecial (Vid.fromCon c, {allowIt = false, ctxt = ctxt, keyword = "datatype"}) ; Option.app (to, Type.checkSyntax))))) val () = reportDuplicates (Vector.concatV (Vector.map (datatypes, #cons)), {ctxt = ctxt, equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "constructor " ^ kind, region = Con.region o #1}) val () = Vector.foreach (withtypes, fn {tyvars, tycon, def} => (reportDuplicateTyvars (tyvars, {ctxt = fn () => seq [str "in: ", Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]}) ; Type.checkSyntax def)) val () = reportDuplicates (Vector.concat [Vector.map (datatypes, #tycon), Vector.map (withtypes, #tycon)], {ctxt = ctxt, equals = Tycon.equals, layout = Tycon.layout, name = "type " ^ kind, region = Tycon.region}) in () end fun checkSyntaxDef b = checkSyntax (b, "definition", Vid.checkRedefineSpecial) fun checkSyntaxSpec b = checkSyntax (b, "specification", Vid.checkSpecifySpecial) end structure DatatypeRhs = struct datatype node = DatBind of DatBind.t | Repl of {lhs: Tycon.t, rhs: Longtycon.t} open Wrap type t = node Wrap.t type node' = node type obj = t fun layout d = case node d of DatBind d => DatBind.layout ("datatype", d) | Repl {lhs, rhs} => seq [str "datatype ", Tycon.layout lhs, str " = datatype ", Longtycon.layout rhs] fun checkSyntax (rhs: t, datBindCheckSyntax) = case node rhs of DatBind b => datBindCheckSyntax b | Repl _ => () fun checkSyntaxDef rhs = checkSyntax (rhs, DatBind.checkSyntaxDef) fun checkSyntaxSpec rhs = checkSyntax (rhs, DatBind.checkSyntaxSpec) end (*---------------------------------------------------*) (* ModIdBind *) (*---------------------------------------------------*) structure ModIdBind = struct datatype node = Fct of {lhs: Fctid.t, rhs: Fctid.t} vector | Sig of {lhs: Sigid.t, rhs: Sigid.t} vector | Str of {lhs: Strid.t, rhs: Strid.t} vector open Wrap type t = node Wrap.t type node' = node type obj = t fun layout d = let fun doit (prefix, l, bds) = layoutAndsBind (prefix, "=", bds, fn {lhs, rhs} => (OneLine, l lhs, l rhs)) in case node d of Fct bds => doit ("functor", Fctid.layout, bds) | Sig bds => doit ("signature", Sigid.layout, bds) | Str bds => doit ("structure", Strid.layout, bds) end fun checkSyntax d = let fun doit (bds : {lhs: 'a, rhs: 'a} Vector.t, {equalsId, layoutId, regionId, name}) = reportDuplicates (bds, {ctxt = mkCtxt (d, layout), equals = (fn ({lhs = id, ...}, {lhs = id', ...}) => equalsId (id, id')), layout = layoutId o #lhs, name = concat [name, " definition"], region = regionId o #lhs}) in case node d of Fct bds => doit (bds, {equalsId = Fctid.equals, layoutId = Fctid.layout, regionId = Fctid.region, name = "functor"}) | Sig bds => doit (bds, {equalsId = Sigid.equals, layoutId = Sigid.layout, regionId = Sigid.region, name = "signature"}) | Str bds => doit (bds, {equalsId = Strid.equals, layoutId = Strid.layout, regionId = Strid.region, name = "structure"}) end end end mlton-20210117+dfsg/mlton/ast/ast-atoms.sig000066400000000000000000000151321416264345000203640ustar00rootroot00000000000000(* Copyright (C) 2009,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_ATOMS_STRUCTS = sig structure AdmitsEquality: ADMITS_EQUALITY structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure RealSize: REAL_SIZE structure Record: RECORD structure SortedRecord: RECORD structure Symbol: SYMBOL structure TyconKind: TYCON_KIND structure WordSize: WORD_SIZE sharing Record.Field = SortedRecord.Field sharing Symbol = Record.Field.Symbol end signature AST_ATOMS = sig include AST_ATOMS_STRUCTS structure Const: AST_CONST structure Tyvar: sig include AST_ID val isEquality: t -> bool end structure Tycon: sig include AST_ID include PRIM_TYCONS sharing type tycon = t end structure Con: sig include AST_ID include PRIM_CONS sharing type con = t end structure Var: AST_ID structure Vid: sig include AST_ID (* conversions to and from variables and constructors *) val fromVar: Var.t -> t val fromCon: Con.t -> t val toVar: t -> Var.t val toCon: t -> Con.t (* check special ids *) val checkRedefineSpecial: t * {allowIt: bool, ctxt: unit -> Layout.t, keyword: string} -> unit val checkSpecifySpecial: t * {allowIt: bool, ctxt: unit -> Layout.t, keyword: string} -> unit end structure Strid: sig include AST_ID val uArg: string -> t val uRes: string -> t val uSig: t val uStr: t end structure Sigid: AST_ID structure Fctid: AST_ID structure Basid: AST_ID structure Longtycon: sig include LONGID val arrow: t end sharing Longtycon.Id = Tycon structure Longcon: LONGID sharing Longcon.Id = Con structure Longvar: LONGID sharing Longvar.Id = Var structure Longvid: sig include LONGID val toLongcon: t -> Longcon.t end sharing Longvid.Id = Vid structure Longstrid: LONGID sharing Longstrid.Id = Strid sharing Strid = Longtycon.Strid = Longvar.Strid = Longcon.Strid = Longvid.Strid = Longstrid.Strid sharing Symbol = Basid.Symbol = Con.Symbol = Fctid.Symbol = Longcon.Symbol = Longstrid.Symbol = Longtycon.Symbol = Longvar.Symbol = Longvid.Symbol = Sigid.Symbol = Strid.Symbol = Tycon.Symbol = Tyvar.Symbol = Vid.Symbol = Var.Symbol structure Type: sig type t datatype node = Con of Longtycon.t * t vector | Paren of t | Record of (Region.t * t) Record.t | Var of Tyvar.t include WRAPPED sharing type node' = node sharing type obj = t val arrow: t * t -> t val checkSyntax: t -> unit val con: Tycon.t * t vector -> t val layout: t -> Layout.t val layoutApp: Layout.t * 'a vector * ('a -> Layout.t) -> Layout.t val layoutOption: t option -> Layout.t val record: (Region.t * t) Record.t -> t val tuple: t vector -> t val unit: t val var: Tyvar.t -> t end structure TypBind: sig type t datatype node = T of {def: Type.t, tycon: Tycon.t, tyvars: Tyvar.t vector} vector include WRAPPED sharing type node' = node sharing type obj = t val checkSyntaxDef: t -> unit val checkSyntaxSpec: t -> unit val empty: t val isEmpty: t -> bool val layout: t -> Layout.t end structure DatBind: sig type t datatype node = T of {datatypes: {cons: (Con.t * Type.t option) vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector, withtypes: TypBind.t} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntaxDef: t -> unit val checkSyntaxSpec: t -> unit val layout: string * t -> Layout.t end structure DatatypeRhs: sig type t datatype node = DatBind of DatBind.t | Repl of {lhs: Tycon.t, rhs: Longtycon.t} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntaxDef: t -> unit val checkSyntaxSpec: t -> unit val layout: t -> Layout.t end structure ModIdBind: sig type t datatype node = Fct of {lhs: Fctid.t, rhs: Fctid.t} vector | Sig of {lhs: Sigid.t, rhs: Sigid.t} vector | Str of {lhs: Strid.t, rhs: Strid.t} vector include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val layout: t -> Layout.t end val bind: Layout.t * Layout.t -> Layout.t val layoutAnds: string * 'a vector * (Layout.t * 'a -> Layout.t) -> Layout.t datatype bindStyle = OneLine | Split of int val layoutAndsBind: string * string * 'a vector * ('a -> bindStyle * Layout.t * Layout.t) -> Layout.t val layoutAndsSusp: string * 'a vector * (bool * Layout.t * 'a -> Layout.t) -> (unit -> Layout.t) vector val reportDuplicates: 'a vector * {ctxt: unit -> Layout.t, equals: 'a * 'a -> bool, layout: 'a -> Layout.t, name: string, region: 'a -> Region.t} -> unit val reportDuplicateFields: (Record.Field.t * (Region.t * 'a)) vector * {ctxt: unit -> Layout.t} -> unit val reportDuplicateTyvars: Tyvar.t vector * {ctxt: unit -> Layout.t} -> unit end mlton-20210117+dfsg/mlton/ast/ast-const.fun000066400000000000000000000031021416264345000203670ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstConst (S: AST_CONST_STRUCTS): AST_CONST = struct open S Region.Wrap datatype node = Bool of bool | Char of IntInf.t | Int of IntInf.t | Real of string | String of IntInf.t vector | Word of IntInf.t type t = node Region.Wrap.t type node' = node type obj = t fun ordToString (c: IntInf.t): string = let fun loop (n: int, c: IntInf.t, ac: char list) = if n = 0 then implode ac else let val (q, r) = IntInf.quotRem (c, 0x10) in loop (n - 1, q, Char.fromHexDigit (Int.fromIntInf r) :: ac) end fun doit (n, esc) = concat ["\\", esc, loop (n, c, [])] in if c <= 0xFF then Char.escapeSML (Char.fromInt (Int.fromIntInf c)) else if c <= 0xFFFF then doit (4, "u") else doit (8, "U") end local open Layout in fun layout c = case node c of Bool b => if b then str "true" else str "false" | Char c => str (concat ["#\"", ordToString c, "\""]) | Int s => str (IntInf.toString s) | Real l => String.layout l | String s => str (concat ["\"", concat (Vector.toListMap (s, ordToString)), "\""]) | Word w => str (concat ["0wx", IntInf.format (w, StringCvt.HEX)]) end end mlton-20210117+dfsg/mlton/ast/ast-const.sig000066400000000000000000000013251416264345000203660ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_CONST_STRUCTS = sig end signature AST_CONST = sig include AST_CONST_STRUCTS type t datatype node = Bool of bool | Char of IntInf.t | Int of IntInf.t | Real of string | String of IntInf.t vector | Word of IntInf.t include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t val ordToString: IntInf.t -> string end mlton-20210117+dfsg/mlton/ast/ast-core.fun000066400000000000000000000612661416264345000202100ustar00rootroot00000000000000(* Copyright (C) 2009,2012,2015,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstCore (S: AST_CORE_STRUCTS): AST_CORE = struct open S Layout structure Field = Record.Field structure Wrap = Region.Wrap structure Fixity = struct datatype t = Infix of int option | Infixr of int option | Nonfix val toString = fn Infix NONE => "infix" | Infix (SOME n) => "infix " ^ Int.toString n | Infixr NONE => "infixr" | Infixr (SOME n) => "infixr " ^ Int.toString n | Nonfix => "nonfix" val layout = Layout.str o toString end structure Fixop = struct datatype t = Op | None val layout = fn Op => str "op " | None => empty end fun mkCtxt (x, lay) () = seq [str "in: ", lay x] fun layoutConstraint (t, ty) = mayAlign [seq [t, str ":"], Type.layout ty] fun maybeConstrain (e, tyo) = case tyo of NONE => e | SOME ty => layoutConstraint (e, ty) fun layoutLongvid x = str (let val s = Longvid.toString x in if s = "*" then " * " else if String.hasSuffix (s, {suffix = "*"}) then s ^ " " else s end) (*---------------------------------------------------*) (* Patterns *) (*---------------------------------------------------*) structure Pat = struct open Wrap datatype node = App of Longcon.t * t | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Layered of {fixop: Fixop.t, var: Var.t, constraint: Type.t option, pat: t} | List of t vector | Or of t vector | Paren of t | Record of {flexible: bool, items: (Record.Field.t * Region.t * item) vector} | Tuple of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | Vector of t vector | Wild and item = Field of t | Vid of Vid.t * Type.t option * t option withtype t = node Wrap.t type node' = node type obj = t structure Item = struct type pat = t datatype t = datatype item end fun make n = makeRegion (n, Region.bogus) val wild = make Wild val constraint = make o Constraint val layered = make o Layered fun longvid x = make (Var {name = x, fixop = Fixop.None}) val var = longvid o Longvid.short o Vid.fromVar fun tuple ps = if 1 = Vector.length ps then Vector.first ps else makeRegion (Tuple ps, Region.append (region (Vector.first ps), region (Vector.last ps))) fun layout (p, isDelimited) = let fun delimit t = if isDelimited then t else paren t in case node p of App (c, p) => delimit (mayAlign [Longcon.layout c, layoutF p]) | Const c => Const.layout c | Constraint (p, t) => delimit (layoutConstraint (layoutF p, t)) | FlatApp ps => if Vector.length ps = 1 then layout (Vector.first ps, isDelimited) else delimit (layoutFlatApp ps) | Layered {fixop, var, constraint, pat} => delimit (mayAlign [maybeConstrain (seq [Fixop.layout fixop, Var.layout var], constraint), seq [str "as ", layoutT pat]]) | List ps => list (Vector.toListMap (ps, layoutT)) | Or ps => delimit (mayAlign (separateLeft (Vector.toListMap (ps, layoutT), "| "))) | Paren p => layout (p, isDelimited) | Record {items, flexible} => seq [str "{", mayAlign (separateRight (Vector.toListMap (items, layoutItem), ",")), if flexible then str (if Vector.isEmpty items then "..." else ", ...") else empty, str "}"] | Tuple ps => Layout.tuple (Vector.toListMap (ps, layoutT)) | Var {name, fixop} => seq [Fixop.layout fixop, layoutLongvid name] | Vector ps => vector (Vector.map (ps, layoutT)) | Wild => str "_" end and layoutF p = layout (p, false) and layoutT p = layout (p, true) and layoutFlatApp ps = seq (separate (Vector.toListMap (ps, layoutF), " ")) and layoutItem (f, _, i) = seq [Field.layout f, case i of Field p => seq [str " = ", layoutT p] | Vid (_, tyo, po) => seq [case tyo of NONE => empty | SOME ty => seq [str ": ", Type.layout ty], case po of NONE => empty | SOME p => seq [str " as ", layoutT p]]] val layout = layoutT fun checkSyntax (p: t): unit = let val c = checkSyntax in case node p of App (_, p) => c p | Const _ => () | Constraint (p, t) => (c p; Type.checkSyntax t) | FlatApp ps => Vector.foreach (ps, c) | Layered {constraint, pat, ...} => (c pat; Option.app (constraint, Type.checkSyntax)) | List ps => Vector.foreach (ps, c) | Paren p => c p | Or ps => Vector.foreach (ps, c) | Record {items, ...} => (reportDuplicateFields (Vector.map (items, fn (f, r, i) => (f, (r, i))), {ctxt = mkCtxt (p, layout)}) ; Vector.foreach (items, fn (_, _, i) => case i of Item.Field p => c p | Item.Vid (_, to, po) => (Option.app (to, Type.checkSyntax) ; Option.app (po, c)))) | Tuple ps => Vector.foreach (ps, c) | Var _ => () | Vector ps => Vector.foreach (ps, c) | Wild => () end end structure Eb = struct structure Rhs = struct open Wrap datatype node = Def of Longcon.t | Gen of Type.t option type t = node Wrap.t type node' = node type obj = t fun layout rhs = case node rhs of Def c => seq [str " = ", Longcon.layout c] | Gen to => Type.layoutOption to fun checkSyntax (e: t): unit = case node e of Def _ => () | Gen to => Option.app (to, Type.checkSyntax) end type t = Con.t * Rhs.t fun layout (exn, rhs) = seq [Con.layout exn, Rhs.layout rhs] end structure EbRhs = Eb.Rhs structure PrimKind = struct structure ImportExportAttribute = struct datatype t = Cdecl | External | Impure | Inline | Private | Public | Pure | Reentrant | Runtime | Stdcall val toString: t -> string = fn Cdecl => "cdecl" | External => "external" | Impure => "impure" | Inline => "inline" | Private => "private" | Public => "public" | Pure => "pure" | Reentrant => "reentrant" | Runtime => "runtime" | Stdcall => "stdcall" val layout = Layout.str o toString end structure SymbolAttribute = struct datatype t = Alloc | External | Private | Public val toString: t -> string = fn Alloc => "alloc" | External => "external" | Private => "private" | Public => "public" val layout = Layout.str o toString end datatype t = Address of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} | BuildConst of {name: string, ty: Type.t} | CommandLineConst of {name: string, ty: Type.t, value: Const.t} | Const of {name: string, ty: Type.t} | Export of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | IImport of {attributes: ImportExportAttribute.t list, ty: Type.t} | Import of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | ISymbol of {ty: Type.t} | Prim of {name: string, ty: Type.t} | Symbol of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} fun name pk = case pk of Address {name, ...} => name | BuildConst {name, ...} => name | CommandLineConst {name, ...} => name | Const {name, ...} => name | Export {name, ...} => name | IImport {...} => "" | Import {name, ...} => name | ISymbol {...} => "" | Prim {name, ...} => name | Symbol {name, ...} => name end structure Priority = struct datatype t = T of int option val op <= = fn (T x, T y) => case (x, y) of (NONE, NONE) => true | (NONE, _) => true | (_, NONE) => false | (SOME x, SOME y) => Int.<= (x, y) val default = T NONE fun layout (T x) = case x of NONE => Layout.empty | SOME x => Int.layout x end datatype expNode = Andalso of exp * exp | App of exp * exp | Case of exp * match | Const of Const.t | Constraint of exp * Type.t | FlatApp of exp vector | Fn of match | Handle of exp * match | If of exp * exp * exp | Let of dec * exp | List of exp vector | Orelse of exp * exp | Paren of exp | Prim of PrimKind.t | Raise of exp | Record of (Region.t * exp) Record.t | Selector of Field.t | Seq of exp vector | Var of {name: Longvid.t, fixop: Fixop.t} | Vector of exp vector | While of {test: exp, expr: exp} and decNode = Abstype of {body: dec, datBind: DatBind.t} | Datatype of DatatypeRhs.t | DoDec of exp | Exception of Eb.t vector | Fix of {fixity: Fixity.t, ops: Vid.t vector} | Fun of {tyvars: Tyvar.t vector, fbs: {body: exp, pats: Pat.t vector, resultType: Type.t option} vector vector} | Local of dec * dec | Open of Longstrid.t vector | Overload of Priority.t * Var.t * Tyvar.t vector * Type.t * Longvid.t vector | SeqDec of dec vector | Type of TypBind.t | Val of {tyvars: Tyvar.t vector, vbs: {exp: exp, pat: Pat.t} vector, rvbs: {match: match, pat: Pat.t} vector} and matchNode = T of (Pat.t * exp) vector withtype dec = decNode Wrap.t and exp = expNode Wrap.t and match = matchNode Wrap.t open Wrap structure Match = struct open Wrap type t = match datatype node = datatype matchNode type node' = node type obj = t end fun layoutTyvarsAndsSusp (prefix, (tyvars, xs), layoutX) = layoutAndsSusp (prefix, xs, fn (first, prefix, x) => if first andalso not (Vector.isEmpty tyvars) then seq [prefix, case Vector.length tyvars of 1 => Tyvar.layout (Vector.sub (tyvars, 0)) | _ => Layout.tuple (Vector.toListMap (tyvars, Tyvar.layout)), str " ", layoutX x] else seq [prefix, layoutX x]) fun expNodeName e = case node e of Andalso _ => "Andalso" | App _ => "App" | Case _ => "Case" | Const _ => "Const" | Constraint _ => "Constraint" | FlatApp _ => "FlatApp" | Fn _ => "Fn" | Handle _ => "Handle" | If _ => "If" | Let _ => "Let" | List _ => "List" | Orelse _ => "Orelse" | Paren _ => "Paren" | Prim _ => "Prim" | Raise _ => "Raise" | Record _ => "Record" | Selector _ => "Selector" | Seq _ => "Seq" | Var _ => "Var" | Vector _ => "Vector" | While _ => "While" val traceLayoutExp = Trace.traceInfo' (Trace.info "AstCore.layoutExp", fn (e, _: bool) => Layout.str (expNodeName e), Layout.ignore: Layout.t -> Layout.t) fun layoutExp arg = traceLayoutExp (fn (e, isDelimited) => let fun delimit t = if isDelimited then t else paren t in case node e of Andalso (e, e') => delimit (mayAlign [layoutExpF e, seq [str "andalso ", layoutExpF e']]) | App (function, argument) => delimit (mayAlign [layoutExpF function, layoutExpF argument]) | Case (expr, match) => delimit (align [seq [str "case ", layoutExpT expr, str " of"], indent (layoutMatch match, 2)]) | Const c => Const.layout c | Constraint (expr, constraint) => delimit (layoutConstraint (layoutExpF expr, constraint)) | FlatApp es => if Vector.length es = 1 then layoutExp (Vector.first es, isDelimited) else delimit (seq (separate (Vector.toListMap (es, layoutExpF), " "))) | Fn m => delimit (seq [str "fn ", layoutMatch m]) | Handle (try, match) => delimit (align [layoutExpF try, seq [str "handle ", layoutMatch match]]) | If (test, thenCase, elseCase) => delimit (mayAlign [seq [str "if ", layoutExpT test], seq [str "then ", layoutExpT thenCase], seq [str "else ", layoutExpT elseCase]]) | Let (dec, expr) => Pretty.lett (layoutDec dec, layoutExpT expr) | List es => list (Vector.toListMap (es, layoutExpT)) | Orelse (e, e') => delimit (mayAlign [layoutExpF e, seq [str "orelse ", layoutExpF e']]) | Paren e => layoutExp (e, isDelimited) | Prim kind => str (PrimKind.name kind) | Raise exn => delimit (seq [str "raise ", layoutExpF exn]) | Record r => let fun layoutTuple es = if 1 = Vector.length es then layoutExp (Vector.first es, isDelimited) else tuple (layoutExpsT es) in Record.layout {record = r, separator = " = ", extra = "", layoutTuple = fn res => layoutTuple (Vector.map (res, #2)), layoutElt = layoutExpT o #2} end | Selector f => seq [str "#", Field.layout f] | Seq es => paren (align (separateRight (layoutExpsT es, " ;"))) | Var {name, fixop} => seq [Fixop.layout fixop, layoutLongvid name] | Vector es => vector (Vector.map (es, layoutExpT)) | While {test, expr} => delimit (align [seq [str "while ", layoutExpT test], seq [str "do ", layoutExpT expr]]) end) arg and layoutExpsT es = Vector.toListMap (es, layoutExpT) and layoutExpT e = layoutExp (e, true) and layoutExpF e = layoutExp (e, false) and layoutMatch m = let val Match.T rules = node m in alignPrefix (Vector.toListMap (rules, layoutRule), "| ") end and layoutRule (pat, exp) = mayAlign [seq [Pat.layoutT pat, str " =>"], layoutExpF exp] and layoutDec d = case node d of Abstype {datBind, body} => align [DatBind.layout ("abstype", datBind), seq [str "with ", layoutDec body], str "end"] | Datatype rhs => DatatypeRhs.layout rhs | DoDec exp => seq [str "do ", layoutExpT exp] | Exception ebs => layoutAnds ("exception", ebs, fn (prefix, eb) => seq [prefix, Eb.layout eb]) | Fix {fixity, ops} => seq [Fixity.layout fixity, str " ", seq (separate (Vector.toListMap (ops, Vid.layout), " "))] | Fun {tyvars, fbs} => let val fbs = layoutFun {tyvars = tyvars, fbs = fbs} in align (Vector.toListMap (fbs, fn th => th ())) end | Local (d, d') => Pretty.locall (layoutDec d, layoutDec d') | Open ss => seq [str "open ", seq (separate (Vector.toListMap (ss, Longstrid.layout), " "))] | Overload (p, x, _, t, xs) => seq [str "_overload ", Priority.layout p, str " ", align [layoutConstraint (Var.layout x, t), layoutAnds ("as", xs, fn (prefix, x) => seq [prefix, Longvid.layout x])]] | SeqDec ds => align (Vector.toListMap (ds, layoutDec)) | Type typBind => TypBind.layout typBind | Val {tyvars, vbs, rvbs} => let val {vbs, rvbs} = layoutVal {tyvars = tyvars, vbs = vbs, rvbs = rvbs} in align [align (Vector.toListMap (vbs, fn th => th ())), align (Vector.toListMap (rvbs, fn th => th ()))] end and layoutFun {tyvars, fbs} = layoutTyvarsAndsSusp ("fun", (tyvars, fbs), layoutFb) and layoutFb clauses = alignPrefix (Vector.toListMap (clauses, layoutClause), "| ") and layoutClause ({pats, resultType, body}) = mayAlign [seq [maybeConstrain (Pat.layoutFlatApp pats, resultType), str " ="], layoutExpF body] (* this has to be layoutExpF in case body is a case expression *) and layoutVal {tyvars, vbs, rvbs} = if Vector.isEmpty rvbs then {vbs = layoutTyvarsAndsSusp ("val", (tyvars, vbs), layoutVb), rvbs = Vector.new0 ()} else if Vector.isEmpty vbs then {vbs = Vector.new0 (), rvbs = layoutTyvarsAndsSusp ("val rec", (tyvars, rvbs), layoutRvb)} else {vbs = layoutTyvarsAndsSusp ("val", (tyvars, vbs), layoutVb), rvbs = layoutTyvarsAndsSusp ("and rec", (Vector.new0 (), rvbs), layoutRvb)} and layoutVb {pat, exp} = bind (Pat.layoutT pat, layoutExpT exp) and layoutRvb {pat, match, ...} = bind (Pat.layout pat, seq [str "fn ", layoutMatch match]) fun checkSyntaxExp (e: exp): unit = let val c = checkSyntaxExp in case node e of Andalso (e1, e2) => (c e1; c e2) | App (e1, e2) => (c e1; c e2) | Case (e, m) => (c e; checkSyntaxMatch m) | Const _ => () | Constraint (e, t) => (c e; Type.checkSyntax t) | FlatApp es => Vector.foreach (es, c) | Fn m => checkSyntaxMatch m | Handle (e, m) => (c e; checkSyntaxMatch m) | If (e1, e2, e3) => (c e1; c e2; c e3) | Let (d, e) => (checkSyntaxDec d; c e) | List es => Vector.foreach (es, c) | Orelse (e1, e2) => (c e1; c e2) | Paren e => c e | Prim _ => () | Raise e => c e | Record r => (reportDuplicateFields (Record.toVector r, {ctxt = mkCtxt (e, layoutExpT)}) ; Record.foreach (r, c o #2)) | Selector _ => () | Seq es => Vector.foreach (es, c) | Var _ => () | Vector es => Vector.foreach (es, c) | While {expr, test} => (c expr; c test) end and checkSyntaxMatch (m: match): unit = let val T v = node m in Vector.foreach (v, fn (p, e) => (Pat.checkSyntax p; checkSyntaxExp e)) end and checkSyntaxDec (d: dec): unit = case node d of Abstype {datBind, body} => (DatBind.checkSyntaxDef datBind ; checkSyntaxDec body) | Datatype rhs => DatatypeRhs.checkSyntaxDef rhs | DoDec exp => checkSyntaxExp exp | Exception v => (Vector.foreach (v, fn (con, ebrhs) => (Vid.checkRedefineSpecial (Vid.fromCon con, {allowIt = false, ctxt = mkCtxt (d, layoutDec), keyword = "exception"}) ; EbRhs.checkSyntax ebrhs)) ; (reportDuplicates (v, {ctxt = mkCtxt (d, layoutDec), equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "exception definition", region = Con.region o #1}))) | Fix _ => () (* The Definition allows, e.g., "infix + +". *) | Fun {tyvars, fbs, ...} => (reportDuplicateTyvars (tyvars, {ctxt = mkCtxt (d, layoutDec)}) ; Vector.foreach (fbs, fn clauses => Vector.foreach (clauses, fn {body, pats, resultType} => (checkSyntaxExp body ; Vector.foreach (pats, Pat.checkSyntax) ; Option.app (resultType, Type.checkSyntax))))) | Local (d, d') => (checkSyntaxDec d; checkSyntaxDec d') | Open _ => () | Overload (_, _, _, ty, _) => Type.checkSyntax ty | SeqDec v => Vector.foreach (v, checkSyntaxDec) | Type b => TypBind.checkSyntaxDef b | Val {tyvars, rvbs, vbs, ...} => (reportDuplicateTyvars (tyvars, {ctxt = mkCtxt (d, layoutDec)}) ; Vector.foreach (rvbs, fn {match, pat} => (checkSyntaxMatch match ; Pat.checkSyntax pat)) ; Vector.foreach (vbs, fn {exp, pat} => (checkSyntaxExp exp ; Pat.checkSyntax pat))) structure Exp = struct open Wrap type dec = dec type match = match type t = exp datatype node = datatype expNode type node' = node type obj = t fun const c = makeRegion (Const c, Const.region c) fun constraint (e, t) = makeRegion (Constraint (e, t), region e) fun fnn rs = let val r = if Vector.isEmpty rs then Region.bogus else Region.append (Pat.region (#1 (Vector.first rs)), region (#2 (Vector.last rs))) in makeRegion (Fn (Match.makeRegion (Match.T rs, r)), r) end fun longvid name = makeRegion (Var {name = name, fixop = Fixop.None}, Longvid.region name) val var = longvid o Longvid.short o Vid.fromVar fun app (e1: t, e2: t): t = makeRegion (App (e1, e2), Region.append (region e1, region e2)) fun lett (ds: dec vector, e: t, r: Region.t): t = makeRegion (Let (makeRegion (SeqDec ds, r), e), r) fun tuple (es: t vector): t = if 1 = Vector.length es then Vector.first es else let val r = if Vector.isEmpty es then Region.bogus else Region.append (region (Vector.first es), region (Vector.last es)) val res = Vector.map (es, fn e => (Region.bogus, e)) in makeRegion (Record (Record.tuple res), r) end val unit: t = tuple (Vector.new0 ()) val layout = layoutExpT end structure Match = struct open Match val layout = layoutMatch val layoutRule = layoutRule end structure Dec = struct open Wrap type t = dec datatype node = datatype decNode type node' = node type obj = t val checkSyntax = checkSyntaxDec fun make n = makeRegion (n, Region.bogus) val openn = make o Open fun vall (tyvars, var, exp): t = make (Val {tyvars = tyvars, vbs = Vector.new1 {exp = exp, pat = Pat.var var}, rvbs = Vector.new0 ()}) local val it = Var.fromSymbol (Symbol.fromString "it", Region.bogus) in fun fromExp (e: Exp.t): t = vall (Vector.new0 (), it, e) end val layout = layoutDec val layoutFun = layoutFun val layoutVal = layoutVal end end mlton-20210117+dfsg/mlton/ast/ast-core.sig000066400000000000000000000201651416264345000201730ustar00rootroot00000000000000(* Copyright (C) 2009,2012,2015,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_CORE_STRUCTS = sig include AST_ATOMS end signature AST_CORE = sig include AST_CORE_STRUCTS structure Fixity: sig datatype t = Infix of int option | Infixr of int option | Nonfix val layout: t -> Layout.t end structure Fixop: sig datatype t = Op | None end structure Pat: sig type t structure Item: sig type pat datatype t = Field of pat | Vid of Vid.t * Type.t option * pat option (* vid <:ty> *) end sharing type Item.pat = t datatype node = App of Longcon.t * t | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Layered of {constraint: Type.t option, fixop: Fixop.t, pat: t, var: Var.t} | List of t vector | Paren of t | Or of t vector | Record of {flexible: bool, items: (Record.Field.t * Region.t * Item.t) vector} | Tuple of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | Vector of t vector | Wild include WRAPPED sharing type node' = node sharing type obj = t val constraint: t * Type.t -> t val layered: {fixop: Fixop.t, var: Var.t, constraint: Type.t option, pat: t} -> t val layout: t -> Layout.t val layoutFlatApp: t vector -> Layout.t val longvid: Longvid.t -> t val tuple: t vector -> t val var: Var.t -> t val wild: t end structure PrimKind: sig structure ImportExportAttribute: sig datatype t = Cdecl | External | Impure | Inline | Private | Public | Pure | Reentrant | Runtime | Stdcall val layout: t -> Layout.t end structure SymbolAttribute: sig datatype t = Alloc | External | Private | Public val layout: t -> Layout.t end datatype t = Address of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} | BuildConst of {name: string, ty: Type.t} | CommandLineConst of {name: string, ty: Type.t, value: Const.t} | Const of {name: string, ty: Type.t} | Export of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | IImport of {attributes: ImportExportAttribute.t list, ty: Type.t} | Import of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | ISymbol of {ty: Type.t} | Prim of {name: string, ty: Type.t} | Symbol of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} end structure Priority: sig datatype t = T of int option val <= : t * t -> bool val default: t val layout: t -> Layout.t end structure Exp: sig type dec type match type t datatype node = Andalso of t * t | App of t * t | Case of t * match | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Fn of match | Handle of t * match | If of t * t * t | Let of dec * t | List of t vector | Orelse of t * t | Paren of t | Prim of PrimKind.t | Raise of t | Record of (Region.t * t) Record.t | Selector of Record.Field.t | Seq of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | Vector of t vector | While of {expr: t, test: t} include WRAPPED sharing type node' = node sharing type obj = t val app: t * t -> t val const: Const.t -> t val constraint: t * Type.t -> t val fnn: (Pat.t * t) vector -> t val layout: t -> Layout.t val lett: dec vector * t * Region.t -> t val longvid: Longvid.t -> t val tuple: t vector -> t val unit: t val var: Var.t -> t end structure Match: sig type t datatype node = T of (Pat.t * Exp.t) vector include WRAPPED sharing type node' = node sharing type obj = t val layout : t -> Layout.t val layoutRule : Pat.t * Exp.t -> Layout.t end sharing type Exp.match = Match.t structure EbRhs: sig type t datatype node = Def of Longcon.t | Gen of Type.t option include WRAPPED sharing type node' = node sharing type obj = t end structure Dec: sig type t datatype node = Abstype of {datBind: DatBind.t, body: t} | Datatype of DatatypeRhs.t | DoDec of Exp.t | Exception of (Con.t * EbRhs.t) vector | Fix of {fixity: Fixity.t, ops: Vid.t vector} | Fun of {tyvars: Tyvar.t vector, fbs: {body: Exp.t, pats: Pat.t vector, resultType: Type.t option} vector vector} | Local of t * t | Open of Longstrid.t vector | Overload of Priority.t * Var.t * Tyvar.t vector * Type.t * Longvid.t vector | SeqDec of t vector | Type of TypBind.t | Val of {rvbs: {match: Match.t, pat: Pat.t} vector, tyvars: Tyvar.t vector, vbs: {exp: Exp.t, pat: Pat.t} vector} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val fromExp: Exp.t -> t val layout: t -> Layout.t val layoutFun: {tyvars: Tyvar.t vector, fbs: {body: Exp.t, pats: Pat.t vector, resultType: Type.t option} vector vector} -> (unit -> Layout.t) vector val layoutVal: {rvbs: {match: Match.t, pat: Pat.t} vector, tyvars: Tyvar.t vector, vbs: {exp: Exp.t, pat: Pat.t} vector} -> {rvbs: (unit -> Layout.t) vector, vbs: (unit -> Layout.t) vector} val openn: Longstrid.t vector -> t val vall: Tyvar.t vector * Var.t * Exp.t -> t end sharing type Dec.t = Exp.dec end mlton-20210117+dfsg/mlton/ast/ast-id.fun000066400000000000000000000030671416264345000176470ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstId (S: AST_ID_STRUCTS): AST_ID = struct open S datatype t = T of {name: Symbol.t, region: Region.t} type obj = t type node' = Symbol.t local fun make f (T r) = f r in val name = make #name val region = make #region end val node = name (* quell unused warning *) val _ = node val toSymbol = name fun makeRegion (s, r) = T {name = s, region = r} val fromSymbol = makeRegion fun makeRegion' (s, x, y) = makeRegion (s, Region.make {left = x, right = y}) (* quell unused warning *) val _ = makeRegion' fun dest (T {name, region, ...}) = (name, region) (* quell unused warning *) val _ = dest val bogus = makeRegion (Symbol.bogus, Region.bogus) fun isAlphaNumeric id = let val c = String.sub (Symbol.toString (name id), 0) in Char.isAlphaNum c orelse c = #"'" end val isSymbolic = not o isAlphaNumeric val toString = Symbol.toString o name val layout = String.layout o toString (* val left = Region.left o region *) (* val right = Region.left o region *) local fun binary (f: string * string -> 'a) (x :t, y: t): 'a = f (toString x, toString y) in val compare = binary String.compare end fun equals (x, x') = Symbol.equals (name x, name x') val equals = Trace.trace2 ("AstId.equals", layout, layout, Bool.layout) equals end mlton-20210117+dfsg/mlton/ast/ast-id.sig000066400000000000000000000013161416264345000176340ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_ID_STRUCTS = sig structure Symbol: SYMBOL end signature AST_ID = sig include AST_ID_STRUCTS include WRAPPED type t sharing type obj = t val bogus: t val compare: t * t -> Relation.t val equals: t * t -> bool val fromSymbol: Symbol.t * Region.t -> t val isSymbolic: t -> bool val layout: t -> Layout.t val toString: t -> string val toSymbol: t -> Symbol.t end mlton-20210117+dfsg/mlton/ast/ast-mlbs.fun000066400000000000000000000131641416264345000202070ustar00rootroot00000000000000(* Copyright (C) 2017-2018 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstMLBs (S: AST_MLBS_STRUCTS): AST_MLBS = struct open S structure AstPrograms = AstPrograms (S) open AstPrograms Layout fun mkCtxt (x, lay) () = seq [str "in: ", lay x] val layouts = List.map structure Wrap = Region.Wrap val node = Wrap.node (*---------------------------------------------------*) (* Basdecs and Basexps *) (*---------------------------------------------------*) datatype basexpNode = Bas of basdec | Let of basdec * basexp | Var of Basid.t and basdecNode = Ann of string * Region.t * basdec | Basis of {name: Basid.t, def: basexp} vector | Defs of ModIdBind.t | Local of basdec * basdec | MLB of {fileAbs: File.t, fileUse: File.t} * basdec Promise.t | Open of Basid.t vector | Prim | Prog of {fileAbs: File.t, fileUse: File.t} * Program.t Promise.t | Seq of basdec list withtype basexp = basexpNode Wrap.t and basdec = basdecNode Wrap.t fun layoutBasexp exp = case node exp of Bas dec => align [str "bas", indent (layoutBasdec dec, 3), str "end"] | Let (dec, exp) => Pretty.lett (layoutBasdec dec, layoutBasexp exp) | Var basid => Basid.layout basid and layoutBasdec dec = case node dec of Ann (anns,_, dec) => align [str "ann", indent (seq [str String.dquote, str anns, str String.dquote], 3), str "in", indent (layoutBasdec dec, 3), str "end"] | Basis basbnds => layoutAndsBind ("basis", "=", basbnds, fn {name, def} => (case node def of Var _ => OneLine | _ => Split 3, Basid.layout name, layoutBasexp def)) | Defs def => ModIdBind.layout def | Local (dec1, dec2) => Pretty.locall (layoutBasdec dec1, layoutBasdec dec2) | MLB ({fileUse, ...}, _) => File.layout fileUse | Open bs => seq [str "open ", seq (separate (Vector.toListMap (bs, Basid.layout), " "))] | Prim => str "_prim" | Prog ({fileUse, ...}, _) => File.layout fileUse | Seq decs => align (layoutBasdecs decs) and layoutBasdecs decs = layouts (decs, layoutBasdec) fun checkSyntaxBasexp (e: basexp): unit = case node e of Bas dec => checkSyntaxBasdec dec | Let (dec, exp) => (checkSyntaxBasdec dec ; checkSyntaxBasexp exp) | Var _ => () and checkSyntaxBasdec (d: basdec): unit = case node d of Ann (_, _, dec) => checkSyntaxBasdec dec | Basis basbnds => reportDuplicates (basbnds, {ctxt = mkCtxt (d, layoutBasdec), equals = (fn ({name = id, ...}, {name = id', ...}) => Basid.equals (id, id')), layout = Basid.layout o #name, name = "basis definition", region = Basid.region o #name}) | Defs def => ModIdBind.checkSyntax def | Local (dec1, dec2) => (checkSyntaxBasdec dec1 ; checkSyntaxBasdec dec2) | MLB _ => () | Open _ => () | Prim => () | Prog _ => () | Seq decs => List.foreach (decs, checkSyntaxBasdec) fun sourceFiles (d: basdec): File.t vector = let val sourceFiles : File.t Buffer.t = Buffer.new {dummy = ""} val psi : File.t -> bool ref = String.memoize (fn _ => ref false) fun sourceFilesBasexp (e: basexp): unit = case node e of Bas dec => sourceFilesBasdec dec | Let (dec, exp) => (sourceFilesBasdec dec ; sourceFilesBasexp exp) | Var _ => () and sourceFilesBasdec (d: basdec): unit = case node d of Ann (_, _, dec) => sourceFilesBasdec dec | Basis basbnds => Vector.foreach (basbnds, fn {def, ...} => sourceFilesBasexp def) | Defs _ => () | Local (dec1, dec2) => (sourceFilesBasdec dec1 ; sourceFilesBasdec dec2) | MLB ({fileAbs, fileUse, ...}, dec) => let val b = psi fileAbs in if !b then () else let val () = b := true in Buffer.add (sourceFiles, fileUse) ; sourceFilesBasdec (Promise.force dec) end end | Open _ => () | Prim => () | Prog ({fileUse, ...}, _) => Buffer.add (sourceFiles, fileUse) | Seq decs => List.foreach (decs, sourceFilesBasdec) val () = sourceFilesBasdec d in Buffer.toVector sourceFiles end val sourceFiles = Trace.trace ("AstMLBs.sourceFiles", Layout.ignore, Vector.layout File.layout) sourceFiles structure Basexp = struct open Wrap type basdec = basdec type t = basexp datatype node = datatype basexpNode type node' = node type obj = t val layout = layoutBasexp end structure Basdec = struct open Wrap type t = basdec datatype node = datatype basdecNode type node' = node type obj = t fun make n = makeRegion (n, Region.bogus) val seq = make o Seq val empty = seq [] val checkSyntax = checkSyntaxBasdec val layout = layoutBasdec val sourceFiles = sourceFiles end end mlton-20210117+dfsg/mlton/ast/ast-mlbs.sig000066400000000000000000000030641416264345000201770ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_MLBS_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_MLBS = sig include AST_PROGRAMS structure Basexp: sig type basdec type t datatype node = Bas of basdec | Let of basdec * t | Var of Basid.t include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t end structure Basdec: sig type t datatype node = Ann of string * Region.t * t | Basis of {name: Basid.t, def: Basexp.t} vector | Defs of ModIdBind.t | Local of t * t | MLB of {fileAbs: File.t, fileUse: File.t} * t Promise.t | Open of Basid.t vector | Prim | Prog of {fileAbs: File.t, fileUse: File.t} * Program.t Promise.t | Seq of t list include WRAPPED sharing type node' = node sharing type obj = t val empty: t val seq: t list -> t val checkSyntax: t -> unit val layout: t -> Layout.t val sourceFiles: t -> File.t vector end sharing type Basdec.t = Basexp.basdec end mlton-20210117+dfsg/mlton/ast/ast-modules.fun000066400000000000000000000453711416264345000207270ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstModules (S: AST_MODULES_STRUCTS): AST_MODULES = struct open S structure AstCore = AstCore (AstAtoms (S)) open AstCore Layout fun mkCtxt (x, lay) () = seq [str "in: ", lay x] val layouts = List.map structure Wrap = Region.Wrap val node = Wrap.node structure WhereEquation = struct open Wrap datatype node = Type of {tyvars: Tyvar.t vector, longtycon: Longtycon.t, ty: Type.t} type t = node Wrap.t type node' = node type obj = t fun layout eq = case node eq of Type {tyvars, longtycon, ty} => seq [str "where type ", Type.layoutApp (Longtycon.layout longtycon, tyvars, Tyvar.layout), str " = ", Type.layout ty] fun checkSyntax eq = case node eq of Type {tyvars, longtycon, ty} => (reportDuplicateTyvars (tyvars, {ctxt = fn () => seq [str "in: ", Type.layoutApp (Longtycon.layout longtycon, tyvars, Tyvar.layout)]}) ; Type.checkSyntax ty) end structure SharingEquation = struct open Wrap datatype node = Type of Longtycon.t list | Structure of Longstrid.t list type t = node Wrap.t type node' = node type obj = t fun layout eq = case node eq of Type longtycons => seq (str "sharing type " :: separate (List.map (longtycons, Longtycon.layout), " = ")) | Structure longstrids => seq (str "sharing " :: separate (List.map (longstrids, Longstrid.layout), " = ")) end type typedescs = {tyvars: Tyvar.t vector, tycon: Tycon.t} vector datatype sigexpNode = Var of Sigid.t | Where of {equations: WhereEquation.t vector, sigexp: sigexp} | Spec of spec and sigConst = None | Transparent of sigexp | Opaque of sigexp and specNode = Datatype of DatatypeRhs.t | Empty | Eqtype of typedescs | Exception of (Con.t * Type.t option) vector | IncludeSigexp of sigexp | IncludeSigids of Sigid.t vector | Seq of spec * spec | Sharing of {equation: SharingEquation.t, spec: spec} | Structure of (Strid.t * sigexp) vector | Type of typedescs | TypeDefs of TypBind.t | Val of (Var.t * Type.t) vector withtype spec = specNode Wrap.t and sigexp = sigexpNode Wrap.t fun layoutTypedescs (prefix, typedescs) = layoutAnds (prefix, typedescs, fn (prefix, {tyvars, tycon}) => seq [prefix, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]) fun layoutTypedefs (prefix, typBind) = let val TypBind.T ds = TypBind.node typBind in layoutAnds (prefix, ds, fn (prefix, {def, tycon, tyvars}) => seq [prefix, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), str " = ", Type.layout def]) end fun layoutSigexp (e: sigexp): Layout.t = case node e of Var s => Sigid.layout s | Where {sigexp, equations} => let val sigexp = layoutSigexp sigexp in if Vector.isEmpty equations then sigexp else mayAlign [sigexp, align (Vector.toListMap (equations, WhereEquation.layout))] end | Spec s => align [str "sig", indent (layoutSpec s, 3), str "end"] and layoutSigConst sigConst = case sigConst of None => empty | Transparent s => seq [str ": ", layoutSigexp s] | Opaque s => seq [str " :> ", layoutSigexp s] and layoutSpec (s: spec): t = case node s of Datatype rhs => DatatypeRhs.layout rhs | Empty => empty | Eqtype typedescs => layoutTypedescs ("eqtype", typedescs) | Exception sts => layoutAnds ("exception", sts, fn (prefix, (c, to)) => seq [prefix, Con.layout c, Type.layoutOption to]) | IncludeSigexp s => seq [str "include ", layoutSigexp s] | IncludeSigids sigids => seq (str "include " :: separate (Vector.toListMap (sigids, Sigid.layout), " ")) | Seq (s, s') => align [layoutSpec s, layoutSpec s'] | Sharing {spec, equation} => align [layoutSpec spec, SharingEquation.layout equation] | Structure l => layoutAndsBind ("structure", ":", l, fn (strid, sigexp) => (case node sigexp of Var _ => OneLine | _ => Split 3, Strid.layout strid, layoutSigexp sigexp)) | Type typedescs => layoutTypedescs ("type", typedescs) | TypeDefs typedefs => layoutTypedefs ("type", typedefs) | Val sts => layoutAndsBind ("val", ":", sts, fn (x, t) => (OneLine, Var.layout x, Type.layout t)) fun checkSyntaxSigexp (e: sigexp): unit = case node e of Spec s => checkSyntaxSpec s | Var _ => () | Where {sigexp, equations} => (checkSyntaxSigexp sigexp ; Vector.foreach (equations, WhereEquation.checkSyntax)) and checkSyntaxSigConst (s: sigConst): unit = case s of None => () | Opaque e => checkSyntaxSigexp e | Transparent e => checkSyntaxSigexp e and checkSyntaxTypedescs (typedescs, {ctxt}) = (Vector.foreach (typedescs, fn {tyvars, tycon, ...} => reportDuplicateTyvars (tyvars, {ctxt = fn () => seq [str "in: ", Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]})) ; reportDuplicates (typedescs, {ctxt = ctxt, equals = (fn ({tycon = c, ...}, {tycon = c', ...}) => Tycon.equals (c, c')), layout = Tycon.layout o #tycon, name = "type specification", region = Tycon.region o #tycon})) and checkSyntaxSpec (s: spec): unit = let val ctxt = mkCtxt (s, layoutSpec) in case node s of Datatype d => DatatypeRhs.checkSyntaxSpec d | Eqtype typedescs => checkSyntaxTypedescs (typedescs, {ctxt = ctxt}) | Empty => () | Exception v => (Vector.foreach (v, fn (con, to) => (Vid.checkSpecifySpecial (Vid.fromCon con, {allowIt = false, ctxt = ctxt, keyword = "exception"}) ; Option.app (to, Type.checkSyntax))) ; (reportDuplicates (v, {ctxt = ctxt, equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "exception specification", region = Con.region o #1}))) | IncludeSigexp e => checkSyntaxSigexp e | IncludeSigids _ => () | Seq (s, s') => (checkSyntaxSpec s; checkSyntaxSpec s') | Sharing {spec, ...} => checkSyntaxSpec spec | Structure v => (Vector.foreach (v, checkSyntaxSigexp o #2) ; (reportDuplicates (v, {ctxt = ctxt, equals = fn ((s, _), (s', _)) => Strid.equals (s, s'), layout = Strid.layout o #1, name = "structure specification", region = Strid.region o #1}))) | Type typedescs => checkSyntaxTypedescs (typedescs, {ctxt = ctxt}) | TypeDefs b => TypBind.checkSyntaxSpec b | Val v => (Vector.foreach (v, fn (v, t) => (Vid.checkSpecifySpecial (Vid.fromVar v, {allowIt = true, ctxt = ctxt, keyword = "val"}) ; Type.checkSyntax t)) ; (reportDuplicates (v, {ctxt = ctxt, equals = fn ((x, _), (x', _)) => Var.equals (x, x'), layout = Var.layout o #1, name = "value specification", region = Var.region o #1}))) end structure Sigexp = struct open Wrap type spec = spec type t = sigexp datatype node = datatype sigexpNode type node' = node type obj = t val checkSyntax = checkSyntaxSigexp fun wheree (sigexp: t, equations): t = if Vector.isEmpty equations then sigexp else makeRegion (Where {sigexp = sigexp, equations = equations}, Region.append (region sigexp, WhereEquation.region (Vector.last equations))) fun make n = makeRegion (n, Region.bogus) val spec = make o Spec val layout = layoutSigexp end structure SigConst = struct datatype t = datatype sigConst val checkSyntax = checkSyntaxSigConst val layout = layoutSigConst end structure Spec = struct open Wrap datatype node = datatype specNode type t = spec type node' = node type obj = t val checkSyntax = checkSyntaxSpec val layout = layoutSpec end (*---------------------------------------------------*) (* Strdecs and Strexps *) (*---------------------------------------------------*) datatype strdecNode = Core of Dec.t | Local of strdec * strdec | Seq of strdec list | ShowBasis of File.t | Structure of {constraint: SigConst.t, def: strexp, name: Strid.t} vector and strexpNode = App of Fctid.t * strexp | Constrained of strexp * SigConst.t | Let of strdec * strexp | Struct of strdec | Var of Longstrid.t withtype strexp = strexpNode Wrap.t and strdec = strdecNode Wrap.t fun layoutStrdec d = case node d of Core d => Dec.layout d | Local (d, d') => Pretty.locall (layoutStrdec d, layoutStrdec d') | Seq ds => align (layoutStrdecs ds) | ShowBasis file => seq [str "(*#showBasis \"", File.layout file, str "\"*)"] | Structure strbs => layoutAndsBind ("structure", "=", strbs, fn {name, def, constraint} => (case node def of Var _ => OneLine | _ => Split 3, seq [Strid.layout name, SigConst.layout constraint], layoutStrexp def)) and layoutStrdecs ds = layouts (ds, layoutStrdec) and layoutStrexp exp = case node exp of App (f, e) => seq [Fctid.layout f, str " ", paren (layoutStrexp e)] | Constrained (e, c) => mayAlign [layoutStrexp e, SigConst.layout c] | Let (dec, strexp) => Pretty.lett (layoutStrdec dec, layoutStrexp strexp) | Struct d => align [str "struct", indent (layoutStrdec d, 3), str "end"] | Var s => Longstrid.layout s fun checkSyntaxStrdec (d: strdec): unit = case node d of Core d => Dec.checkSyntax d | Local (d, d') => (checkSyntaxStrdec d; checkSyntaxStrdec d') | Seq ds => List.foreach (ds, checkSyntaxStrdec) | ShowBasis _ => () | Structure v => (Vector.foreach (v, fn {constraint, def, ...} => (SigConst.checkSyntax constraint ; checkSyntaxStrexp def)) ; (reportDuplicates (v, {ctxt = mkCtxt (d, layoutStrdec), equals = (fn ({name = n, ...}, {name = n', ...}) => Strid.equals (n, n')), layout = Strid.layout o #name, name = "structure definition", region = Strid.region o #name}))) and checkSyntaxStrexp (e: strexp): unit = case node e of App (_, e) => checkSyntaxStrexp e | Constrained (e, c) => (checkSyntaxStrexp e ; SigConst.checkSyntax c) | Let (d, e) => (checkSyntaxStrdec d ; checkSyntaxStrexp e) | Struct d => checkSyntaxStrdec d | Var _ => () structure Strexp = struct open Wrap type strdec = strdec type t = strexp datatype node = datatype strexpNode type node' = node type obj = t val checkSyntax = checkSyntaxStrexp fun make n = makeRegion (n, Region.bogus) val constrained = make o Constrained val lett = make o Let val var = make o Var val layout = layoutStrexp end structure Strdec = struct open Wrap type t = strdec datatype node = datatype strdecNode type node' = node type obj = t val checkSyntax = checkSyntaxStrdec fun make n = makeRegion (n, Region.bogus) val core = make o Core val openn = core o Dec.openn val structuree = make o Structure o Vector.new1 val layout = layoutStrdec val fromExp = core o Dec.fromExp val trace = Trace.trace ("AstModules.Strdec.coalesce", layout, layout) fun coalesce (d: t): t = trace (fn d => case node d of Core _ => d | Local (d1, d2) => let val d1 = coalesce d1 val d2 = coalesce d2 val node = case (node d1, node d2) of (Core d1', Core d2') => Core (Dec.makeRegion (Dec.Local (d1', d2'), Region.append (region d1, region d2))) | _ => Local (d1, d2) in makeRegion (node, region d) end | Seq ds => let fun finish (ds: Dec.t list, ac: t list): t list = case ds of [] => ac | _ => let val d = makeRegion (Core (Dec.makeRegion (Dec.SeqDec (Vector.fromListRev ds), Region.bogus)), Region.bogus) in d :: ac end fun loop (ds, cores, ac) = case ds of [] => finish (cores, ac) | d :: ds => let val d = coalesce d in case node d of Core d => loop (ds, d :: cores, ac) | Seq ds' => loop (ds' @ ds, cores, ac) | _ => loop (ds, [], d :: finish (cores, ac)) end val r = region d in case loop (ds, [], []) of [] => makeRegion (Core (Dec.makeRegion (Dec.SeqDec (Vector.new0 ()), r)), r) | [d] => d | ds => makeRegion (Seq (rev ds), r) end | ShowBasis _ => d | Structure _ => d) d end structure FctArg = struct open Wrap datatype node = Structure of Strid.t * Sigexp.t | Spec of Spec.t type t = node Wrap.t type node' = node type obj = t fun layout a = case node a of Structure (strid, sigexp) => seq [Strid.layout strid, str ": ", Sigexp.layout sigexp] | Spec spec => Spec.layout spec fun checkSyntax (fa: t): unit = case node fa of Structure (_, e) => Sigexp.checkSyntax e | Spec s => Spec.checkSyntax s end structure Topdec = struct open Wrap datatype node = Functor of {arg: FctArg.t, body: Strexp.t, name: Fctid.t, result: SigConst.t} vector | Signature of (Sigid.t * Sigexp.t) vector | Strdec of Strdec.t type t = node Wrap.t type node' = node type obj = t fun layout d = case node d of Functor fctbs => layoutAndsBind ("functor", "=", fctbs, fn {name, arg, result, body} => (Split 3, seq [Fctid.layout name, str " ", paren (FctArg.layout arg), layoutSigConst result], layoutStrexp body)) | Signature sigbs => layoutAndsBind ("signature", "=", sigbs, fn (name, def) => (case Sigexp.node def of Sigexp.Var _ => OneLine | _ => Split 3, Sigid.layout name, Sigexp.layout def)) | Strdec d => Strdec.layout d fun make n = makeRegion (n, Region.bogus) val fromExp = make o Strdec o Strdec.fromExp fun checkSyntax (d: t): unit = case node d of Functor v => (Vector.foreach (v, fn {arg, body, result, ...} => (FctArg.checkSyntax arg ; Strexp.checkSyntax body ; SigConst.checkSyntax result)) ; (reportDuplicates (v, {ctxt = mkCtxt (d, layout), equals = (fn ({name = n, ...}, {name = n', ...}) => Fctid.equals (n, n')), layout = Fctid.layout o #name, name = "functor definition", region = Fctid.region o #name}))) | Signature bs => (Vector.foreach (bs, Sigexp.checkSyntax o #2) ; (reportDuplicates (bs, {ctxt = mkCtxt (d, layout), equals = fn ((s, _), (s', _)) => Sigid.equals (s, s'), layout = Sigid.layout o #1, name = "signature definition", region = Sigid.region o #1}))) | Strdec d => Strdec.checkSyntax d end end mlton-20210117+dfsg/mlton/ast/ast-modules.sig000066400000000000000000000115051416264345000207110ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_MODULES_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_MODULES = sig include AST_CORE structure WhereEquation: sig type t datatype node = Type of {longtycon: Longtycon.t, tyvars: Tyvar.t vector, ty: Type.t} include WRAPPED sharing type node' = node sharing type obj = t end structure Sigexp: sig type spec type t datatype node = Spec of spec | Var of Sigid.t | Where of {equations: WhereEquation.t vector, sigexp: t} include WRAPPED sharing type node' = node sharing type obj = t val wheree: t * WhereEquation.t vector -> t val spec: spec -> t val layout: t -> Layout.t end structure SigConst: sig datatype t = None | Opaque of Sigexp.t | Transparent of Sigexp.t end structure SharingEquation: sig type t datatype node = Structure of Longstrid.t list | Type of Longtycon.t list include WRAPPED sharing type node' = node sharing type obj = t end structure Spec: sig type t datatype node = Datatype of DatatypeRhs.t | Eqtype of {tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Empty | Exception of (Con.t * Type.t option) vector | IncludeSigexp of Sigexp.t | IncludeSigids of Sigid.t vector | Seq of t * t | Sharing of {equation: SharingEquation.t, spec: t} | Structure of (Strid.t * Sigexp.t) vector | Type of {tycon: Tycon.t, tyvars: Tyvar.t vector} vector | TypeDefs of TypBind.t | Val of (Var.t * Type.t) vector include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t end sharing type Spec.t = Sigexp.spec structure Strexp: sig type strdec type t datatype node = App of Fctid.t * t | Constrained of t * SigConst.t | Let of strdec * t | Struct of strdec | Var of Longstrid.t include WRAPPED sharing type node' = node sharing type obj = t val constrained: t * SigConst.t -> t val lett: strdec * t -> t val var: Longstrid.t -> t val layout: t -> Layout.t end structure Strdec: sig type t datatype node = Core of Dec.t | Local of t * t | Seq of t list | ShowBasis of File.t | Structure of {constraint: SigConst.t, def: Strexp.t, name: Strid.t} vector include WRAPPED sharing type node' = node sharing type obj = t val coalesce: t -> t val core: Dec.t -> t val layout: t -> Layout.t val openn: Longstrid.t vector -> t val structuree: {constraint: SigConst.t, def: Strexp.t, name: Strid.t} -> t end sharing type Strdec.t = Strexp.strdec structure FctArg: sig type t datatype node = Structure of Strid.t * Sigexp.t | Spec of Spec.t include WRAPPED sharing type node' = node sharing type obj = t end structure Topdec: sig type t datatype node = Functor of {arg: FctArg.t, body: Strexp.t, name: Fctid.t, result: SigConst.t} vector | Signature of (Sigid.t * Sigexp.t) vector | Strdec of Strdec.t include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val fromExp: Exp.t -> t val layout: t -> Layout.t end end mlton-20210117+dfsg/mlton/ast/ast-programs.fun000066400000000000000000000125001416264345000210750ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AstPrograms (S: AST_PROGRAMS_STRUCTS): AST_PROGRAMS = struct open S structure AstModules = AstModules (S) open AstModules Layout structure Program = struct datatype t = T of Topdec.t list list val empty = T [] fun layout (T dss) = Layout.align (List.map (dss, fn ds => Layout.paren (Layout.align (List.map (ds, Topdec.layout))))) fun checkSyntax (T dss) = List.foreach (dss, fn ds => List.foreach (ds, Topdec.checkSyntax)) fun coalesce (T dss): t = let fun finish (sds, ac) = case sds of [] => ac | _ => let val t = Topdec.makeRegion (Topdec.Strdec (Strdec.makeRegion (Strdec.Seq (rev sds), Region.bogus)), Region.bogus) in t :: ac end fun loop (ds, sds, ac) = case ds of [] => finish (sds, ac) | d :: ds => case Topdec.node d of Topdec.Strdec d => loop (ds, d :: sds, ac) | _ => loop (ds, [], d :: finish (sds, ac)) in T (List.map (dss, fn ds => rev (loop (ds, [], [])))) end val coalesce = Trace.trace ("AstPrograms.Program.coalesce", layout, layout) coalesce fun size (T dss): int = let val n = ref 0 fun inc () = n := 1 + !n fun dec (d: Dec.t): unit = let datatype z = datatype Dec.node in case Dec.node d of Abstype {body, ...} => dec body | Exception cs => Vector.foreach (cs, fn _ => inc ()) | Fun {fbs, ...} => Vector.foreach (fbs, fn clauses => Vector.foreach (clauses, exp o #body)) | Local (d, d') => (dec d; dec d') | SeqDec ds => Vector.foreach (ds, dec) | Val {vbs, rvbs, ...} => (Vector.foreach (vbs, exp o #exp) ; Vector.foreach (rvbs, match o #match)) | _ => () end and exp (e: Exp.t): unit = let val _ = inc () datatype z = datatype Exp.node in case Exp.node e of Andalso (e1, e2) => (exp e1; exp e2) | App (e, e') => (exp e; exp e') | Case (e, m) => (exp e; match m) | Constraint (e, _) => exp e | FlatApp es => exps es | Fn m => match m | Handle (e, m) => (exp e; match m) | If (e1, e2, e3) => (exp e1; exp e2; exp e3) | Let (d, e) => (dec d; exp e) | List es => Vector.foreach (es, exp) | Orelse (e1, e2) => (exp e1; exp e2) | Raise exn => exp exn | Record r => Record.foreach (r, exp o #2) | Seq es => exps es | While {test, expr} => (exp test; exp expr) | _ => () end and exps es = Vector.foreach (es, exp) and match m = let val Match.T rules = Match.node m in Vector.foreach (rules, exp o #2) end fun strdec d = let datatype z = datatype Strdec.node in case Strdec.node d of Core d => dec d | Local (d, d') => (strdec d; strdec d') | Seq ds => List.foreach (ds, strdec) | ShowBasis _ => () | Structure ds => Vector.foreach (ds, fn {def, ...} => strexp def) end and strexp e = let datatype z = datatype Strexp.node in case Strexp.node e of Struct d => strdec d | Constrained (e, _) => strexp e | App (_, e) => strexp e | Let (d, e) => (strdec d; strexp e) | _ => () end fun topdec d = let datatype z = datatype Topdec.node in case Topdec.node d of Functor ds => Vector.foreach (ds, fn {body, ...} => strexp body) | Strdec d => strdec d | _ => () end val _ = List.foreach (dss, fn ds => List.foreach (ds, topdec)) in !n end (* quell unused warning *) val _ = size end end mlton-20210117+dfsg/mlton/ast/ast-programs.sig000066400000000000000000000012311416264345000210660ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_PROGRAMS_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_PROGRAMS = sig include AST_MODULES structure Program: sig datatype t = T of Topdec.t list list val checkSyntax: t -> unit val coalesce: t -> t val empty: t val size: t -> int val layout: t -> Layout.t end end mlton-20210117+dfsg/mlton/ast/ast.fun000066400000000000000000000005431416264345000172510ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Ast (S: AST_STRUCTS): AST = struct open S structure AstMLBs = AstMLBs (S) open AstMLBs end mlton-20210117+dfsg/mlton/ast/ast.sig000066400000000000000000000005701416264345000172430ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AST_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST = sig include AST_MLBS end mlton-20210117+dfsg/mlton/ast/longid.fun000066400000000000000000000052231416264345000177360ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Longid (S: LONGID_STRUCTS): LONGID = struct open S datatype node = T of {strids: Strid.t list, id: Id.t} type node' = node structure Wrap = Region.Wrap open Wrap type t = node Wrap.t type obj = t fun split id = let val T {strids, id, ...} = node id in (strids, id) end val equals = fn (id, id') => let val T {strids=ss, id=i} = node id val T {strids=ss', id=i'} = node id' in List.equals (ss, ss', Strid.equals) andalso Id.equals (i, i') end fun long (strids, id) = makeRegion (T {strids = strids, id = id}, case strids of [] => Id.region id | s :: _ => Region.append (Strid.region s, Id.region id)) fun short id = long ([], id) fun layout id = let val T {strids, id} = node id open Layout in seq [case strids of [] => empty | _ => seq [seq (separate (List.map (strids, Strid.layout), ".")), str "."], Id.layout id] end val toString = Layout.toString o layout fun fromSymbols (ss: Symbol.t list, region: Region.t): t = let val srs = case Region.left region of NONE => List.map (ss, fn s => (s, region)) | SOME p => let val file = SourcePos.file p val line = SourcePos.line p in List.unfold ((ss, SourcePos.column p), fn (s::ss, cl) => let val cr = cl + String.length (Symbol.toString s) - 1 in SOME ((s, Region.make {left = SourcePos.make {column = cl, file = file, line = line}, right = SourcePos.make {column = cr, file = file, line = line}}), (ss, cr + 2)) end | ([], _) => NONE) end val (strids, id) = List.splitLast srs in makeRegion (T {strids = List.map (strids, Strid.fromSymbol), id = Id.fromSymbol id}, region) end end mlton-20210117+dfsg/mlton/ast/longid.sig000066400000000000000000000015651416264345000177350ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature LONGID_STRUCTS = sig structure Id: AST_ID structure Strid: AST_ID structure Symbol: SYMBOL sharing Symbol = Id.Symbol = Strid.Symbol end signature LONGID = sig include LONGID_STRUCTS include T datatype node = T of {strids: Strid.t list, id: Id.t} include WRAPPED sharing type node' = node sharing type obj = t val fromSymbols: Symbol.t list * Region.t -> t val long: Strid.t list * Id.t -> t val short: Id.t -> t val split: t -> Strid.t list * Id.t val toString: t -> string end mlton-20210117+dfsg/mlton/ast/sources.cm000066400000000000000000000011251416264345000177510ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature AST functor Ast is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm ast-const.sig ast-const.fun ast-id.sig ast-id.fun longid.sig longid.fun ast-atoms.sig ast-atoms.fun ast-core.sig ast-core.fun ast-modules.sig ast-modules.fun ast-programs.sig ast-programs.fun ast-mlbs.sig ast-mlbs.fun ast.sig ast.fun mlton-20210117+dfsg/mlton/ast/sources.mlb000066400000000000000000000012341416264345000201250ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ast-const.sig ast-const.fun ast-id.sig ast-id.fun longid.sig longid.fun ast-atoms.sig ast-atoms.fun ast-core.sig ast-core.fun ast-modules.sig ast-modules.fun ast-programs.sig ast-programs.fun ast-mlbs.sig ast-mlbs.fun ast.sig ast.fun in signature AST functor Ast end mlton-20210117+dfsg/mlton/atoms/000077500000000000000000000000001416264345000163025ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/atoms/admits-equality.fun000066400000000000000000000015371416264345000221360ustar00rootroot00000000000000(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AdmitsEquality (S: ADMITS_EQUALITY_STRUCTS): ADMITS_EQUALITY = struct open S datatype t = Always | Never | Sometimes val toString = fn Always => "Always" | Never => "Never" | Sometimes => "Sometimes" val layout = Layout.str o toString val op <= = fn (Never, _) => true | (Sometimes, Never) => false | (Sometimes, _) => true | (Always, Always) => true | (Always, _) => false val op <= = Trace.trace2 ("AdmitsEquality.<=", layout, layout, Bool.layout) (op <=) val or = fn (Always, _) => Always | (_, Always) => Always | (Sometimes, _) => Sometimes | (_, Sometimes) => Sometimes | _ => Never end mlton-20210117+dfsg/mlton/atoms/admits-equality.sig000066400000000000000000000007641416264345000221310ustar00rootroot00000000000000(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ADMITS_EQUALITY_STRUCTS = sig end signature ADMITS_EQUALITY = sig include ADMITS_EQUALITY_STRUCTS datatype t = Always | Never | Sometimes val <= : t * t -> bool val layout: t -> Layout.t val or: t * t -> t val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/atoms.fun000066400000000000000000000072041416264345000201420ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Atoms (S: ATOMS_STRUCTS): ATOMS = struct structure Atoms = struct open S structure CharSize = CharSize () structure IntSize = IntSize () structure RealSize = RealSize () structure WordSize = WordSize () structure WordX = WordX (structure WordSize = WordSize) structure WordXVector = WordXVector (structure WordSize = WordSize structure WordX = WordX) structure RealX = RealX (structure RealSize = RealSize structure WordX = WordX) structure CSymbolScope = CSymbolScope () structure CType = CType (structure RealSize = RealSize structure WordSize = WordSize) structure CFunction = CFunction (structure SymbolScope = CSymbolScope structure CType = CType) structure CSymbol = CSymbol (structure CSymbolScope = CSymbolScope structure CType = CType) structure Const = Const (structure CSymbol = CSymbol structure RealX = RealX structure WordX = WordX structure WordXVector = WordXVector) structure Symbol = Symbol () structure Field = Field (structure Symbol = Symbol) structure Record = Record (val isSorted = false structure Field = Field) structure SortedRecord = Record (val isSorted = true structure Field = Field) structure Tyvar = Tyvar () structure AdmitsEquality = AdmitsEquality () structure TyconKind = TyconKind () structure Tycon = Tycon (structure AdmitsEquality = AdmitsEquality structure CharSize = CharSize structure IntSize = IntSize structure Kind = TyconKind structure RealSize = RealSize structure WordSize = WordSize) structure Con = Con () structure Var = Var () structure Func = struct open Var fun newNoname () = newString "F" end structure Label = struct open Func fun newNoname () = newString "L" end structure Ffi = Ffi (structure CFunction = CFunction structure CType = CType) structure Cases = Cases (structure WordSize = WordSize structure WordX = WordX) structure Prim = Prim (structure CFunction = CFunction structure CType = CType structure Con = Con structure Const = Const structure RealSize = RealSize structure WordSize = WordSize) structure Prod = Prod () structure Handler = Handler (structure Label = Label) structure Return = Return (structure Label = Label structure Handler = Handler) structure SourceInfo = SourceInfo () structure ProfileExp = ProfileExp (structure SourceInfo = SourceInfo) structure ProfileLabel = ProfileLabel () structure SourceMaps = SourceMaps (structure ProfileLabel = ProfileLabel) end open Atoms end mlton-20210117+dfsg/mlton/atoms/atoms.sig000066400000000000000000000104631416264345000201350ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ATOMS_STRUCTS = sig end signature ATOMS' = sig include ATOMS_STRUCTS structure AdmitsEquality: ADMITS_EQUALITY structure Cases: CASES structure CFunction: C_FUNCTION structure CSymbol: C_SYMBOL structure CSymbolScope: C_SYMBOL_SCOPE structure CType: C_TYPE structure CharSize: CHAR_SIZE structure Con: CON structure Const: CONST structure Ffi: FFI structure Field: FIELD structure Func: FUNC structure Handler: HANDLER structure IntSize: INT_SIZE structure Label: LABEL structure Prim: PRIM structure Prod: PROD structure ProfileExp: PROFILE_EXP structure ProfileLabel: PROFILE_LABEL structure RealSize: REAL_SIZE structure RealX: REAL_X structure Record: RECORD structure Return: RETURN structure SortedRecord: RECORD structure SourceInfo: SOURCE_INFO structure SourceMaps: SOURCE_MAPS structure Symbol: SYMBOL structure Tycon: TYCON structure TyconKind: TYCON_KIND structure Tyvar: TYVAR structure Var: VAR structure WordSize: WORD_SIZE structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing AdmitsEquality = Tycon.AdmitsEquality sharing CFunction = Ffi.CFunction = Prim.CFunction sharing CSymbol = Const.CSymbol sharing CSymbolScope = CFunction.SymbolScope = CSymbol.CSymbolScope sharing CType = CFunction.CType = CSymbol.CType = Ffi.CType = Prim.CType sharing CharSize = Tycon.CharSize sharing Con = Prim.Con sharing Const = Prim.Const sharing Field = Record.Field = SortedRecord.Field sharing Handler = Return.Handler sharing IntSize = Tycon.IntSize sharing Label = Handler.Label = Return.Label sharing ProfileLabel = SourceMaps.ProfileLabel sharing RealSize = CType.RealSize = Prim.RealSize = RealX.RealSize = Tycon.RealSize sharing RealX = Const.RealX sharing SourceInfo = ProfileExp.SourceInfo sharing TyconKind = Tycon.Kind sharing WordSize = Cases.WordSize = CType.WordSize = Prim.WordSize = Tycon.WordSize = WordX.WordSize sharing WordX = Cases.WordX = Const.WordX = WordXVector.WordX sharing WordXVector = Const.WordXVector end signature ATOMS = sig structure Atoms: ATOMS' include ATOMS' (* For each structure, like CFunction, I would like to write two sharing * constraints * sharing Atoms = CFunction * sharing CFunction = Atoms.CFunction * but I can't because of a bug in SML/NJ that reports "Sharing structure * with a descendent substructure". So, I am forced to write out lots * of individual sharing constraints. Blech. *) sharing AdmitsEquality = Atoms.AdmitsEquality sharing CFunction = Atoms.CFunction sharing CSymbol = Atoms.CSymbol sharing CSymbolScope = Atoms.CSymbolScope sharing CType = Atoms.CType sharing CharSize = Atoms.CharSize sharing Cases = Atoms.Cases sharing Con = Atoms.Con sharing Const = Atoms.Const sharing Ffi = Atoms.Ffi sharing Field = Atoms.Field sharing Func = Atoms.Func sharing Handler = Atoms.Handler sharing IntSize = Atoms.IntSize sharing Label = Atoms.Label sharing Prim = Atoms.Prim sharing Prod = Atoms.Prod sharing ProfileExp = Atoms.ProfileExp sharing ProfileLabel = Atoms.ProfileLabel sharing RealSize = Atoms.RealSize sharing RealX = Atoms.RealX sharing Record = Atoms.Record sharing Return = Atoms.Return sharing SortedRecord = Atoms.SortedRecord sharing SourceInfo = Atoms.SourceInfo sharing SourceMaps = Atoms.SourceMaps sharing Symbol = Atoms.Symbol sharing Tycon = Atoms.Tycon sharing TyconKind = Atoms.TyconKind sharing Tyvar = Atoms.Tyvar sharing Var = Atoms.Var sharing WordSize = Atoms.WordSize sharing WordX = Atoms.WordX sharing WordXVector = Atoms.WordXVector end mlton-20210117+dfsg/mlton/atoms/c-function.fun000066400000000000000000000266201416264345000210670ustar00rootroot00000000000000(* Copyright (C) 2015,2019 Matthew Fluet. * Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CFunction (S: C_FUNCTION_STRUCTS): C_FUNCTION = struct open S (* infix declarations for Parse.Ops *) infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> structure Convention = struct datatype t = Cdecl | Stdcall val all = [Cdecl, Stdcall] val toString = fn Cdecl => "cdecl" | Stdcall => "stdcall" val layout = Layout.str o toString val parse = let open Parse in any (List.map (all, fn t => kw (toString t) *> pure t)) end end structure Kind = struct datatype t = Impure | Pure | Runtime of {bytesNeeded: int option, ensuresBytesFree:int option, mayGC: bool, maySwitchThreadsFrom: bool, maySwitchThreadsTo: bool, modifiesFrontier: bool, readsStackTop: bool, writesStackTop: bool} val runtimeDefault = Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true} val pure = Pure val impure = Impure val reentrant = runtimeDefault fun layout k = case k of Impure => Layout.str "Impure" | Pure => Layout.str "Pure" | Runtime {bytesNeeded, ensuresBytesFree, mayGC, maySwitchThreadsFrom, maySwitchThreadsTo, modifiesFrontier, readsStackTop, writesStackTop} => Layout.namedRecord ("Runtime", [("bytesNeeded", Option.layout Int.layout bytesNeeded), ("ensuresBytesFree", Option.layout Int.layout ensuresBytesFree), ("mayGC", Bool.layout mayGC), ("maySwitchThreadsFrom", Bool.layout maySwitchThreadsFrom), ("maySwitchThreadsTo", Bool.layout maySwitchThreadsTo), ("modifiesFrontier", Bool.layout modifiesFrontier), ("readsStackTop", Bool.layout readsStackTop), ("writesStackTop", Bool.layout writesStackTop)]) val toString = Layout.toString o layout val parse = let open Parse in any [kw "Impure" *> pure Impure, kw "Pure" *> pure Pure, kw "Runtime" *> cbrack (ffield ("bytesNeeded", option int) >>= (fn bytesNeeded => nfield ("ensuresBytesFree", option int) >>= (fn ensuresBytesFree => nfield ("mayGC", bool) >>= (fn mayGC => nfield ("maySwitchThreadsFrom", bool) >>= (fn maySwitchThreadsFrom => nfield ("maySwitchThreadsTo", bool) >>= (fn maySwitchThreadsTo => nfield ("modifiesFrontier", bool) >>= (fn modifiesFrontier => nfield ("readsStackTop", bool) >>= (fn readsStackTop => nfield ("writesStackTop", bool) >>= (fn writesStackTop => pure {bytesNeeded = bytesNeeded, ensuresBytesFree = ensuresBytesFree, mayGC = mayGC, maySwitchThreadsFrom = maySwitchThreadsFrom, maySwitchThreadsTo = maySwitchThreadsTo, modifiesFrontier = modifiesFrontier, readsStackTop = readsStackTop, writesStackTop = writesStackTop}))))))))) >>= (fn args => pure (Runtime args))] end local fun make (sel, default) k = case k of Impure => default | Pure => default | Runtime r => sel r fun makeBool sel = make (sel, false) fun makeOpt sel = make (sel, NONE) in val bytesNeeded = makeOpt #bytesNeeded val ensuresBytesFree = makeOpt #ensuresBytesFree val mayGC = makeBool #mayGC val maySwitchThreadsFrom = makeBool #maySwitchThreadsFrom val maySwitchThreadsTo = makeBool #maySwitchThreadsTo val modifiesFrontier = makeBool #modifiesFrontier val readsStackTop = makeBool #readsStackTop val writesStackTop = makeBool #writesStackTop end end structure Target = struct datatype t = Direct of string | Indirect val toString = fn Direct name => name | Indirect => "<*>" val layout = Layout.str o toString val parse = let open Parse in (Direct <$> (spaces *> ((String.implode o op ::) <$$> (nextSat (fn c => Char.isAlpha c orelse c = #"_"), many (nextSat (fn c => Char.isAlphaNum c orelse c = #"_")))))) <|> (sym "<*>" *> pure Indirect) end val equals = fn (Direct name, Direct name') => name = name' | (Indirect, Indirect) => true | _ => false end datatype z = datatype Target.t datatype 'a t = T of {args: 'a vector, convention: Convention.t, kind: Kind.t, inline: bool, prototype: CType.t vector * CType.t option, return: 'a, symbolScope: SymbolScope.t, target: Target.t} fun layout (T {args, convention, inline, kind, prototype, return, symbolScope, target, ...}, layoutType) = Layout.record [("args", Vector.layout layoutType args), ("convention", Convention.layout convention), ("inline", Bool.layout inline), ("kind", Kind.layout kind), ("prototype", (fn (args,ret) => Layout.record [("args", Vector.layout CType.layout args), ("res", Option.layout CType.layout ret)]) prototype), ("return", layoutType return), ("symbolScope", SymbolScope.layout symbolScope), ("target", Target.layout target)] fun parse parseType = let open Parse in T <$> cbrack (ffield ("args", vector parseType) >>= (fn args => nfield ("convention", Convention.parse) >>= (fn convention => nfield ("inline", bool) >>= (fn inline => nfield ("kind", Kind.parse) >>= (fn kind => nfield ("prototype", cbrack (ffield ("args", vector CType.parse) >>= (fn args => nfield ("res", option CType.parse) >>= (fn res => pure (args, res))))) >>= (fn prototype => nfield ("return", parseType) >>= (fn return => nfield ("symbolScope", SymbolScope.parse) >>= (fn symbolScope => nfield ("target", Target.parse) >>= (fn target => pure {args = args, convention = convention, inline = inline, kind = kind, prototype = prototype, return = return, symbolScope = symbolScope, target = target}))))))))) end local fun make f (T r) = f r fun makeKind f (T r) = f (#kind r) in fun args z = make #args z fun bytesNeeded z = makeKind Kind.bytesNeeded z fun convention z = make #convention z fun ensuresBytesFree z = makeKind Kind.ensuresBytesFree z fun mayGC z = makeKind Kind.mayGC z fun maySwitchThreadsFrom z = makeKind Kind.maySwitchThreadsFrom z fun maySwitchThreadsTo z = makeKind Kind.maySwitchThreadsTo z fun modifiesFrontier z = makeKind Kind.modifiesFrontier z fun prototype z = make #prototype z fun readsStackTop z = makeKind Kind.readsStackTop z fun return z = make #return z fun symbolScope z = make #symbolScope z fun target z = make #target z fun writesStackTop z = makeKind Kind.writesStackTop z end (* quell unused warnings *) val _ = (modifiesFrontier, readsStackTop, writesStackTop) fun equals (f, f') = Target.equals (target f, target f') fun map (T {args, convention, inline, kind, prototype, return, symbolScope, target}, f) = T {args = Vector.map (args, f), convention = convention, inline = inline, kind = kind, prototype = prototype, return = f return, symbolScope = symbolScope, target = target} fun isOk (T {kind, return, ...}, {isUnit}): bool = (if Kind.maySwitchThreadsFrom kind then Kind.maySwitchThreadsTo kind else true) andalso (if Kind.maySwitchThreadsTo kind then (Kind.mayGC kind andalso isUnit return) else true) andalso (if Option.isSome (Kind.ensuresBytesFree kind) then Kind.mayGC kind else true) andalso (if Kind.mayGC kind then (Kind.modifiesFrontier kind andalso Kind.readsStackTop kind andalso Kind.writesStackTop kind) else true) andalso (if Kind.writesStackTop kind then Kind.readsStackTop kind else true) fun vanilla {args, name, prototype, return} = T {args = args, convention = Convention.Cdecl, inline = false, kind = Kind.Impure, prototype = prototype, return = return, symbolScope = SymbolScope.Private, target = Direct name} fun cPrototype (T {convention, inline, prototype = (args, return), symbolScope, target, ...}) = let val convention = if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " " val symbolScope = case symbolScope of SymbolScope.External => "EXTERNAL " | SymbolScope.Private => "PRIVATE " | SymbolScope.Public => "PUBLIC " val inline = if inline then "inline " else "" val name = case target of Direct name => name | Indirect => Error.bug "CFunction.cPrototype: Indirect" val c = Counter.generator 0 fun arg t = concat [CType.toString t, " x", Int.toString (c ())] val return = case return of NONE => "void" | SOME t => CType.toString t in concat [symbolScope, inline, return, convention, name, " (", concat (List.separate (Vector.toListMap (args, arg), ", ")), ")"] end fun cPointerType (T {convention, prototype = (args, return), ...}) = let val attributes = if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " " fun arg t = CType.toString t val return = case return of NONE => "void" | SOME t => CType.toString t in concat ["(", return, attributes, "(*)(", concat (List.separate (Vector.toListMap (args, arg), ", ")), "))"] end end mlton-20210117+dfsg/mlton/atoms/c-function.sig000066400000000000000000000110201416264345000210450ustar00rootroot00000000000000(* Copyright (C) 2009,2015,2019 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_FUNCTION_STRUCTS = sig structure CType: C_TYPE structure SymbolScope: C_SYMBOL_SCOPE end signature C_FUNCTION = sig include C_FUNCTION_STRUCTS structure Convention: sig datatype t = Cdecl | Stdcall val layout: t -> Layout.t val toString: t -> string end structure Kind: sig datatype t = Impure | Pure | Runtime of {(* bytesNeeded = SOME i means that the i'th * argument to the function is a word that * specifies the number of bytes that must be * free in order for the C function to succeed. * Limit check insertion is responsible for * making sure that the bytesNeeded is available. *) bytesNeeded: int option, (* ensuresBytesFree = SOME i means that the * i'th argument to the function is a word * that specifies a number of bytes that * must be free when the C function (which * must have mayGC = true) returns. * Limit check insertion is responsible for * setting the ensuresBytesFree argument to * cover the allocation(s) in the return * block(s). *) ensuresBytesFree: int option, mayGC: bool, maySwitchThreadsFrom: bool, maySwitchThreadsTo: bool, modifiesFrontier: bool, readsStackTop: bool, writesStackTop: bool} val impure: t val pure: t val reentrant: t val runtimeDefault: t val layout: t -> Layout.t val toString: t -> string val bytesNeeded: t -> int option val ensuresBytesFree: t -> int option val mayGC: t -> bool val maySwitchThreadsFrom: t -> bool val maySwitchThreadsTo: t -> bool val modifiesFrontier: t -> bool val readsStackTop: t -> bool val writesStackTop: t -> bool end structure Target: sig datatype t = Direct of string | Indirect val layout: t -> Layout.t val toString: t -> string end datatype 'a t = T of {args: 'a vector, convention: Convention.t, inline: bool, kind: Kind.t, prototype: CType.t vector * CType.t option, return: 'a, symbolScope: SymbolScope.t, (* target = Indirect means that the 0'th * argument to the function is a word * that specifies the target. *) target: Target.t} val args: 'a t -> 'a vector val bytesNeeded: 'a t -> int option val convention: 'a t -> Convention.t val ensuresBytesFree: 'a t -> int option val equals: 'a t * 'a t -> bool val cPointerType: 'a t -> string val cPrototype: 'a t -> string val isOk: 'a t * {isUnit: 'a -> bool} -> bool val layout: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val mayGC: 'a t -> bool val maySwitchThreadsFrom: 'a t -> bool val maySwitchThreadsTo: 'a t -> bool val modifiesFrontier: 'a t -> bool val parse: 'a Parse.t -> 'a t Parse.t val prototype: 'a t -> CType.t vector * CType.t option val readsStackTop: 'a t -> bool val return: 'a t -> 'a val symbolScope: 'a t -> SymbolScope.t val target: 'a t -> Target.t val writesStackTop: 'a t -> bool val vanilla: {args: 'a vector, name: string, prototype: CType.t vector * CType.t option, return: 'a} -> 'a t end mlton-20210117+dfsg/mlton/atoms/c-symbol-scope.fun000066400000000000000000000013011416264345000216430ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CSymbolScope (S: C_SYMBOL_SCOPE_STRUCTS): C_SYMBOL_SCOPE = struct open S datatype t = External | Private | Public val equals = fn (External, External) => true | (Private, Private) => true | (Public, Public) => true | _ => false val all = [External, Private, Public] val toString = fn External => "external" | Private => "private" | Public => "public" val layout = Layout.str o toString val parse = let open Parse infix 3 *> in any (List.map (all, fn ss => kw (toString ss) *> pure ss)) end end mlton-20210117+dfsg/mlton/atoms/c-symbol-scope.sig000066400000000000000000000006651416264345000216510ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_SYMBOL_SCOPE_STRUCTS = sig end signature C_SYMBOL_SCOPE = sig include C_SYMBOL_SCOPE_STRUCTS datatype t = External | Private | Public val equals: t * t -> bool val layout: t -> Layout.t val toString: t -> string val parse: t Parse.t end mlton-20210117+dfsg/mlton/atoms/c-symbol.fun000066400000000000000000000027471416264345000205530ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CSymbol (S: C_SYMBOL_STRUCTS): C_SYMBOL = struct open S datatype t = T of {cty: CType.t option, name: string, symbolScope: CSymbolScope.t} fun equals (T {cty = cty1, name = name1, symbolScope = symbolScope1}, T {cty = cty2, name = name2, symbolScope = symbolScope2}) = Option.equals (cty1, cty2, CType.equals) andalso String.equals (name1, name2) andalso CSymbolScope.equals (symbolScope1, symbolScope2) fun hash (T {name, ...}) = String.hash name fun layout (T {cty, name, symbolScope}) = Layout.record [("name", Layout.str name), ("cty", Option.layout CType.layout cty), ("symbolScope", CSymbolScope.layout symbolScope)] val toString = Layout.toString o layout val parse = let open Parse infix 1 >>= infix 3 *> infixr 4 <$$> val name = spaces *> (fn (c, cs) => String.implode (c::cs)) <$$> (nextSat (fn c => Char.isAlpha c orelse c = #"_"), many (nextSat (fn c => Char.isAlphaNum c orelse c = #"_"))) in cbrack (ffield ("cty", option CType.parse) >>= (fn cty => nfield ("name", name) >>= (fn name => nfield ("symbolScope", CSymbolScope.parse) >>= (fn symbolScope => pure (T {cty = cty, name = name, symbolScope = symbolScope}))))) end end mlton-20210117+dfsg/mlton/atoms/c-symbol.sig000066400000000000000000000011441416264345000205330ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_SYMBOL_STRUCTS = sig structure CSymbolScope: C_SYMBOL_SCOPE structure CType: C_TYPE end signature C_SYMBOL = sig include C_SYMBOL_STRUCTS datatype t = T of {cty: CType.t option, name: string, symbolScope: CSymbolScope.t} val equals: t * t -> bool val hash: t -> word val layout: t -> Layout.t val toString: t -> string val parse: t Parse.t end mlton-20210117+dfsg/mlton/atoms/c-type.fun000066400000000000000000000077321416264345000202260ustar00rootroot00000000000000(* Copyright (C) 2014,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CType (S: C_TYPE_STRUCTS): C_TYPE = struct open S datatype t = CPointer | Int8 | Int16 | Int32 | Int64 | Objptr | Real32 | Real64 | Word8 | Word16 | Word32 | Word64 val all = [CPointer, Int8, Int16, Int32, Int64, Objptr, Real32, Real64, Word8, Word16, Word32, Word64] val cpointer = CPointer val objptr = Objptr val thread = objptr val equals: t * t -> bool = op = fun memo (f: t -> 'a): t -> 'a = let val cpointer = f CPointer val int8 = f Int8 val int16 = f Int16 val int32 = f Int32 val int64 = f Int64 val objptr = f Objptr val real32 = f Real32 val real64 = f Real64 val word8 = f Word8 val word16 = f Word16 val word32 = f Word32 val word64 = f Word64 in fn CPointer => cpointer | Int8 => int8 | Int16 => int16 | Int32 => int32 | Int64 => int64 | Objptr => objptr | Real32 => real32 | Real64 => real64 | Word8 => word8 | Word16 => word16 | Word32 => word32 | Word64 => word64 end val toString = fn CPointer => "CPointer" | Int8 => "Int8" | Int16 => "Int16" | Int32 => "Int32" | Int64 => "Int64" | Objptr => "Objptr" (* CHECK *) | Real32 => "Real32" | Real64 => "Real64" | Word8 => "Word8" | Word16 => "Word16" | Word32 => "Word32" | Word64 => "Word64" val layout = Layout.str o toString val parse = let open Parse infix 3 *> fun kw s = spaces *> str s *> failing (nextSat (fn c => Char.isAlphaNum c orelse c = #"_")) in any (List.map (all, fn t => kw (toString t) *> pure t)) end fun size (t: t): Bytes.t = case t of CPointer => Bits.toBytes (Control.Target.Size.cpointer ()) | Int8 => Bytes.fromInt 1 | Int16 => Bytes.fromInt 2 | Int32 => Bytes.fromInt 4 | Int64 => Bytes.fromInt 8 | Objptr => Bits.toBytes (Control.Target.Size.objptr ()) | Real32 => Bytes.fromInt 4 | Real64 => Bytes.fromInt 8 | Word8 => Bytes.fromInt 1 | Word16 => Bytes.fromInt 2 | Word32 => Bytes.fromInt 4 | Word64 => Bytes.fromInt 8 fun name t = case t of CPointer => "Q" (* CHECK *) | Int8 => "I8" | Int16 => "I16" | Int32 => "I32" | Int64 => "I64" | Objptr => "P" (* CHECK *) | Real32 => "R32" | Real64 => "R64" | Word8 => "W8" | Word16 => "W16" | Word32 => "W32" | Word64 => "W64" fun align (t: t, b: Bytes.t): Bytes.t = Bytes.align (b, {alignment = size t}) fun real (s: RealSize.t): t = case Bits.toInt (RealSize.bits s) of 32 => Real32 | 64 => Real64 | _ => Error.bug "CType.real" fun word' (b: Bits.t, {signed: bool}): t = case (signed, Bits.toInt b) of (false, 8) => Word8 | (true, 8) => Int8 | (false, 16) => Word16 | (true, 16) => Int16 | (false, 32) => Word32 | (true, 32) => Int32 | (false, 64) => Word64 | (true, 64) => Int64 | _ => Error.bug "CType.word'" fun word (s: WordSize.t, {signed: bool}): t = word' (WordSize.bits s, {signed = signed}) val cint = Promise.lazy (fn () => word' (Control.Target.Size.cint (), {signed = true})) val csize = Promise.lazy (fn () => word' (Control.Target.Size.csize (), {signed = false})) val seqIndex = Promise.lazy (fn () => word' (Control.Target.Size.seqIndex (), {signed = false})) val objptrHeader = Promise.lazy (fn () => word' (Control.Target.Size.header (), {signed = false})) val bool = word (WordSize.bool, {signed = true}) val compareRes = word (WordSize.compareRes, {signed = true}) val shiftArg = word (WordSize.shiftArg, {signed = false}) end mlton-20210117+dfsg/mlton/atoms/c-type.sig000066400000000000000000000024101416264345000202040ustar00rootroot00000000000000(* Copyright (C) 2014,2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_TYPE_STRUCTS = sig structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature C_TYPE = sig include C_TYPE_STRUCTS datatype t = CPointer | Int8 | Int16 | Int32 | Int64 | Objptr | Real32 | Real64 | Word8 | Word16 | Word32 | Word64 val align: t * Bytes.t -> Bytes.t val all: t list val bool: t val cpointer: t val cint: unit -> t val csize: unit -> t val compareRes: t val equals: t * t -> bool val objptrHeader: unit -> t val memo: (t -> 'a) -> t -> 'a (* name: I{8,16,32,64} R{32,64} W{8,16,32,64} *) val name: t -> string val layout: t -> Layout.t val objptr: t val parse: t Parse.t val real: RealSize.t -> t val seqIndex: unit -> t val shiftArg: t val size: t -> Bytes.t val thread: t val toString: t -> string val word: WordSize.t * {signed: bool} -> t end mlton-20210117+dfsg/mlton/atoms/cases.fun000066400000000000000000000057761416264345000201310ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Cases (S: CASES_STRUCTS): CASES = struct open S datatype ('con, 'a) t = Con of ('con * 'a) vector | Word of WordSize.t * (WordX.t * 'a) vector fun equals (c1: ('con, 'a) t, c2: ('con, 'a) t, eqCon: 'con * 'con -> bool, eqA: 'a * 'a -> bool): bool = let fun doit (l1, l2, eq') = Vector.equals (l1, l2, fn ((x1, a1), (x2, a2)) => eq' (x1, x2) andalso eqA (a1, a2)) in case (c1, c2) of (Con l1, Con l2) => doit (l1, l2, eqCon) | (Word (_, l1), Word (_, l2)) => doit (l1, l2, WordX.equals) | _ => false end fun hd (c: ('con, 'a) t): 'a = let fun doit v = if Vector.length v >= 1 then let val (_, a) = Vector.first v in a end else Error.bug "Cases.hd" in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun isEmpty (c: ('con, 'a) t): bool = let fun doit v = Vector.isEmpty v in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun fold' (c: ('con, 'a) t, b, fc, fw) = let fun doit (l, f) = Vector.fold (l, b, fn ((x, a), b) => f (x, a, b)) in case c of Con l => doit (l, fc) | Word (_, l) => doit (l, fw) end fun fold (c: ('con, 'a) t, b, f) = let val f = fn (_, a, b) => f (a, b) in fold' (c, b, f, f) end fun map (c: ('con, 'a) t, f): ('con, 'b) t = let fun doit l = Vector.map (l, fn (i, x) => (i, f x)) in case c of Con l => Con (doit l) | Word (s, l) => Word (s, doit l) end fun forall (c: ('con, 'a) t, f: 'a -> bool): bool = let fun doit l = Vector.forall (l, fn (_, x) => f x) in case c of Con l => doit l | Word (_, l) => doit l end fun exists (c: ('con, 'a) t, f: 'a -> bool): bool = let fun doit l = Vector.exists (l, fn (_, x) => f x) in case c of Con l => doit l | Word (_, l) => doit l end fun length (c: ('con, 'a) t): int = fold (c, 0, fn (_, i) => i + 1) fun foreach (c, f) = fold (c, (), fn (x, ()) => f x) fun foreach' (c, f, fc: 'con -> unit) = fold' (c, (), fn (c, a, ()) => (fc c; f a), fn (_, a, ()) => f a) end mlton-20210117+dfsg/mlton/atoms/cases.sig000066400000000000000000000022411416264345000201030ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CASES_STRUCTS = sig structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordSize = WordX.WordSize end signature CASES = sig include CASES_STRUCTS datatype ('con, 'a) t = Con of ('con * 'a) vector | Word of WordSize.t * (WordX.t * 'a) vector val equals: ('con, 'a) t * ('con, 'a) t * ('con * 'con -> bool) * ('a * 'a -> bool) -> bool val exists: ('con, 'a) t * ('a -> bool) -> bool val fold: ('con, 'a) t * 'b * ('a * 'b -> 'b) -> 'b val forall: ('con, 'a) t * ('a -> bool) -> bool val foreach': ('con, 'a) t * ('a -> unit) * ('con -> unit) -> unit val foreach: ('con, 'a) t * ('a -> unit) -> unit val hd: ('con, 'a) t -> 'a val isEmpty: ('con, 'a) t -> bool val length: ('con, 'a) t -> int val map: ('con, 'a) t * ('a -> 'b) -> ('con, 'b) t end mlton-20210117+dfsg/mlton/atoms/char-size.fun000066400000000000000000000015461416264345000207070ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CharSize (S: CHAR_SIZE_STRUCTS): CHAR_SIZE = struct open S datatype t = C8 | C16 | C32 val all = [C8, C16, C32] fun bits s = Bits.fromInt (case s of C8 => 8 | C16 => 16 | C32 => 32) val equals = op = fun fromBits b = case Bits.toInt b of 8 => C8 | 16 => C16 | 32 => C32 | _ => Error.bug "CharSize.frombits" val memoize = fn f => let val c8 = f C8 val c16 = f C16 val c32 = f C32 in fn C8 => c8 | C16 => c16 | C32 => c32 end val cardinality = memoize (fn s => IntInf.pow (2, Bits.toInt (bits s))) fun isInRange (s, i) = 0 <= i andalso i < cardinality s end mlton-20210117+dfsg/mlton/atoms/char-size.sig000066400000000000000000000010441416264345000206720ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHAR_SIZE_STRUCTS = sig end signature CHAR_SIZE = sig include CHAR_SIZE_STRUCTS datatype t = C8 | C16 | C32 val all: t list val bits: t -> Bits.t val equals: t * t -> bool val fromBits: Bits.t -> t val isInRange: t * IntInf.t -> bool val memoize: (t -> 'a) -> t -> 'a end mlton-20210117+dfsg/mlton/atoms/con-.fun000066400000000000000000000015621416264345000176540ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Con (S: CON_STRUCTS): CON = struct open S structure C = Id (val noname = "C") open C structure P = PrimCons (C) open P val all = [cons, falsee, nill, reff, truee, bind, match] fun stats () = let open Layout in align (List.map (all, fn c => seq [layout c, str " size is ", IntInf.layout (MLton.size c), str " plist length is ", Int.layout (PropertyList.length (plist c))])) end (* quell unused warning *) val _ = stats fun fromBool b = if b then truee else falsee end mlton-20210117+dfsg/mlton/atoms/con-.sig000066400000000000000000000007161416264345000176460ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CON_STRUCTS = sig end signature CON = sig include ID include PRIM_CONS sharing type t = con val fromBool: bool -> t val stats: unit -> Layout.t end mlton-20210117+dfsg/mlton/atoms/const.fun000066400000000000000000000121331416264345000201420ustar00rootroot00000000000000(* Copyright (C) 2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Const (S: CONST_STRUCTS): CONST = struct open S structure IntInfRep = struct structure WordSize = WordX.WordSize datatype t = Big of WordXVector.t | Small of WordX.t fun fromIntInf (i: IntInf.t) : t = let val sws = WordSize.smallIntInfWord () val sws' = WordSize.fromBits (Bits.- (WordSize.bits sws, Bits.one)) in if WordSize.isInRange (sws', i, {signed = true}) then Small (WordX.orb (WordX.one sws, WordX.lshift (WordX.fromIntInf (i, sws), WordX.one sws))) else let val bws = WordSize.bigIntInfWord () val bbws = Bits.toWord (WordSize.bits bws) val mask = IntInf.- (WordSize.cardinality bws, IntInf.one) fun loop (i, acc) = if IntInf.isZero i then Big (WordXVector.fromListRev ({elementSize = bws}, acc)) else let val quot = IntInf.~>> (i, bbws) val rem = IntInf.andb (i, mask) in loop (quot, (WordX.fromIntInf (rem, bws)) :: acc) end in loop (if IntInf.>= (i, IntInf.zero) then (i, [WordX.zero bws]) else (IntInf.~ i, [WordX.one bws])) end end fun smallToIntInf (w: WordX.t): IntInf.t option = let val sws = WordSize.smallIntInfWord () val one = WordX.one sws in if WordSize.equals (WordX.size w, sws) andalso WordX.isOne (WordX.andb (w, one)) then SOME (WordX.toIntInfX (WordX.rshift (w, one, {signed = true}))) else NONE end fun bigToIntInf (v: WordXVector.t): IntInf.t option = let val bws = WordSize.bigIntInfWord () val bbws = Bits.toWord (WordSize.bits bws) in if WordSize.equals (WordXVector.elementSize v, bws) andalso WordXVector.length v >= 2 then let val v0 = WordXVector.sub (v, 0) fun mag () = WordXVector.foldFrom (v, 1, IntInf.zero, fn (w, i) => IntInf.andb (IntInf.<< (i, bbws), WordX.toIntInf w)) in if WordX.isZero v0 then SOME (mag ()) else if WordX.isOne v0 then SOME (IntInf.~ (mag ())) else NONE end else NONE end end datatype t = CSymbol of CSymbol.t | IntInf of IntInf.t | Null | Real of RealX.t | Word of WordX.t | WordVector of WordXVector.t val csymbol = CSymbol val intInf = IntInf val null = Null val real = Real val word = Word val wordVector = WordVector local fun make (s, deOpt : t -> 'a option) = let fun de (t: t): 'a = case deOpt t of SOME z => z | NONE => Error.bug ("Const.de" ^ s) val is: t -> bool = isSome o deOpt in (deOpt, de, is) end in val (deWordOpt,deWord,_) = make ("Word", fn Word ws => SOME ws | _ => NONE) end val string = wordVector o WordXVector.fromString fun layout c = case c of CSymbol s => Layout.seq [Layout.str "CSymbol ", CSymbol.layout s] | IntInf i => Layout.seq [IntInf.layout i, Layout.str ":ii"] | Null => Layout.str "NULL" | Real r => RealX.layout (r, {suffix = true}) | Word w => WordX.layout (w, {suffix = true}) | WordVector v => WordXVector.layout v val toString = Layout.toString o layout val parse = let open Parse infix 3 <* *> infixr 4 <$> <$ in any [CSymbol <$> (kw "CSymbol" *> CSymbol.parse), IntInf <$> (fromScan (Function.curry IntInf.scan StringCvt.DEC) <* str ":ii"), Null <$ kw "NULL", Real <$> RealX.parse, Word <$> WordX.parse, WordVector <$> WordXVector.parse] end fun hash (c: t): word = case c of CSymbol s => CSymbol.hash s | IntInf i => IntInf.hash i | Null => 0wx0 | Real r => RealX.hash r | Word w => WordX.hash w | WordVector v => WordXVector.hash v fun equals (c, c') = case (c, c') of (CSymbol s, CSymbol s') => CSymbol.equals (s, s') | (IntInf i, IntInf i') => IntInf.equals (i, i') | (Null, Null) => true | (Real r, Real r') => RealX.equals (r, r') | (Word w, Word w') => WordX.equals (w, w') | (WordVector v, WordVector v') => WordXVector.equals (v, v') | _ => false val equals = Trace.trace2 ("Const.equals", layout, layout, Bool.layout) equals end mlton-20210117+dfsg/mlton/atoms/const.sig000066400000000000000000000027321416264345000201400ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CONST_STRUCTS = sig structure CSymbol: C_SYMBOL structure RealX: REAL_X structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing WordX = RealX.WordX = WordXVector.WordX end signature CONST = sig include CONST_STRUCTS structure IntInfRep: sig datatype t = Big of WordXVector.t | Small of WordX.t val bigToIntInf: WordXVector.t -> IntInf.t option val fromIntInf: IntInf.t -> t val smallToIntInf: WordX.t -> IntInf.t option end datatype t = CSymbol of CSymbol.t | IntInf of IntInf.t | Null | Real of RealX.t | Word of WordX.t | WordVector of WordXVector.t val csymbol: CSymbol.t -> t val deWord: t -> WordX.t val deWordOpt: t -> WordX.t option val equals: t * t -> bool val intInf: IntInf.t -> t val hash: t -> word val layout: t -> Layout.t val null: t val parse: t Parse.t val real: RealX.t -> t val string: string -> t val toString: t -> string val word: WordX.t -> t val wordVector: WordXVector.t -> t end mlton-20210117+dfsg/mlton/atoms/ffi.fun000066400000000000000000000175571416264345000175770ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Ffi (S: FFI_STRUCTS): FFI = struct open S structure Convention = CFunction.Convention structure SymbolScope = CFunction.SymbolScope local val scopes: (String.t, SymbolScope.t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} in fun checkScope {name, symbolScope} = HashTable.lookupOrInsert (scopes, name, fn () => symbolScope) end val exports: {args: CType.t vector, convention: Convention.t, id: int, name: string, res: CType.t option, symbolScope: SymbolScope.t} list ref = ref [] val symbols: {name: string, ty: CType.t, symbolScope: SymbolScope.t} list ref = ref [] local val nextId = Counter.generator 0 in fun addExport {args, convention, name, res, symbolScope} = let val id = nextId () val _ = Int.inc Control.numExports val _ = List.push (exports, {args = args, convention = convention, id = id, name = name, res = res, symbolScope = symbolScope}) in id end fun addSymbol {name, ty, symbolScope} = ignore (List.push (symbols, {name = name, ty = ty, symbolScope = symbolScope})) end val headers: string list ref = ref [] fun declareExports {print} = (List.foreach (!symbols, fn {name, ty, symbolScope} => let val (headerSymbolScope, symbolScope) = case symbolScope of SymbolScope.External => Error.bug "Ffi.declareExports.symbols: External" | SymbolScope.Private => ("MLLIB_PRIVATE", "PRIVATE") | SymbolScope.Public => ("MLLIB_PUBLIC", "PUBLIC") val headerDecl = concat [headerSymbolScope, "(extern ", CType.toString ty, " ", name, ";)"] val decl = concat [symbolScope, " ", CType.toString ty, " ", name] in List.push (headers, headerDecl); print (decl ^ ";\n") end); if List.isEmpty (!exports) then () else print "MLtonCallFromC ()\n"; List.foreach (!exports, fn {args, convention, id, name, res, symbolScope} => let val args = Vector.mapi (args, fn (i,t) => let val x = concat ["x", Int.toString i] val t = CType.toString t in (concat [t, " ", x], concat ["\tlocalOpArgsRes[", Int.toString (i + 1), "] = ", "(CPointer)(&", x, ");\n"]) end) val (headerSymbolScope, symbolScope) = case symbolScope of SymbolScope.External => Error.bug "Ffi.declareExports.exports: External" | SymbolScope.Private => ("MLLIB_PRIVATE","PRIVATE") | SymbolScope.Public => ("MLLIB_PUBLIC","PUBLIC") val prototype = concat [case res of NONE => "void" | SOME t => CType.toString t, if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " ", name, " (", concat (List.separate (Vector.toListMap (args, #1), ", ")), ")"] val n = 1 + (Vector.length args) + (case res of NONE => 0 | SOME _ => 1) in List.push (headers, concat [headerSymbolScope, "(", prototype, ";)"]) ; print (concat [symbolScope, " ", prototype, " {\n"]) ; print (concat ["\tCPointer localOpArgsRes[", Int.toString n,"];\n"]) ; print (concat ["\tInt32 localOp = ", Int.toString id, ";\n", "\tlocalOpArgsRes[0] = (CPointer)(&localOp);\n"]) ; Vector.foreach (args, fn (_, set) => print set) ; (case res of NONE => () | SOME t => print (concat ["\t", CType.toString t, " localRes;\n", "\tlocalOpArgsRes[", Int.toString (Vector.length args + 1), "] = ", "(CPointer)(&localRes);\n"])) ; print ("\tMLton_callFromC (localOpArgsRes);\n") ; (case res of NONE => () | SOME _ => print "\treturn localRes;\n") ; print "}\n" end)) fun exportHeader f = File.withOut (f, fn out => let fun print s = Out.output (out, s) val libname = !Control.libname val libcap = CharVector.map Char.toUpper libname val _ = print ("#ifndef __" ^ libcap ^ "_ML_H__\n") val _ = print ("#define __" ^ libcap ^ "_ML_H__\n") val _ = print "\n" val _ = File.outputContents (concat [!Control.libDir, "/include/ml-types.h"], out) val _ = print "\n" val _ = File.outputContents (concat [!Control.libDir, "/include/export.h"], out) val _ = print "\n" (* How do programs link against this library by default *) val defaultLinkage = case !Control.format of Control.Archive => "STATIC_LINK" | Control.Executable => "PART_OF" | Control.LibArchive => "NO_DEFAULT_LINK" | Control.Library => "DYNAMIC_LINK" val _ = print ("#if !defined(PART_OF_" ^ libcap ^ ") && \\\n\ \ !defined(STATIC_LINK_" ^ libcap ^ ") && \\\n\ \ !defined(DYNAMIC_LINK_" ^ libcap ^ ")\n") val _ = print ("#define " ^ defaultLinkage ^ "_" ^ libcap ^ "\n") val _ = print "#endif\n" val _ = print "\n" val _ = print ("#if defined(PART_OF_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x) PRIVATE x\n" val _ = print "#define MLLIB_PUBLIC(x) PUBLIC x\n" val _ = print ("#elif defined(STATIC_LINK_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x) PUBLIC x\n" val _ = print ("#elif defined(DYNAMIC_LINK_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x) EXTERNAL x\n" val _ = print "#else\n" val _ = print ("#error Must specify linkage for " ^ libname ^ "\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x)\n" val _ = print "#endif\n" val _ = print "\n" val _ = print "#ifdef __cplusplus\n" val _ = print "extern \"C\" {\n" val _ = print "#endif\n" val _ = print "\n" val _ = if !Control.format = Control.Executable then () else (print ("MLLIB_PUBLIC(void " ^ libname ^ "_open(int argc, const char** argv);)\n") ;print ("MLLIB_PUBLIC(void " ^ libname ^ "_close();)\n")) val _ = declareExports {print = fn _ => ()} val _ = List.foreach (!headers, fn s => (print s; print "\n")) val _ = print "\n" val _ = print "#undef MLLIB_PRIVATE\n" val _ = print "#undef MLLIB_PUBLIC\n" val _ = print "\n" val _ = print "#ifdef __cplusplus\n" val _ = print "}\n" val _ = print "#endif\n" val _ = print "\n" val _ = print ("#endif /* __" ^ libcap ^ "_ML_H__ */\n") in () end) val exportHeader = Control.trace (Control.Detail, "exportHeader") exportHeader end mlton-20210117+dfsg/mlton/atoms/ffi.sig000066400000000000000000000020251416264345000175510ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature FFI_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE end signature FFI = sig include FFI_STRUCTS val addExport: {args: CType.t vector, convention: CFunction.Convention.t, name: string, res: CType.t option, symbolScope: CFunction.SymbolScope.t} -> int val addSymbol: {ty: CType.t, name: string, symbolScope: CFunction.SymbolScope.t} -> unit val checkScope: {name: string, symbolScope: CFunction.SymbolScope.t} -> CFunction.SymbolScope.t val declareExports: {print: string -> unit} -> unit val exportHeader: File.t -> unit end mlton-20210117+dfsg/mlton/atoms/field.fun000066400000000000000000000014201416264345000200740ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Field (S: FIELD_STRUCTS): FIELD = struct open S datatype t = Int of int | Symbol of Symbol.t val equals = fn (Int n, Int n') => Int.equals (n, n') | (Symbol s, Symbol s') => Symbol.equals (s, s') | _ => false val toString = fn Int n => Int.toString (n + 1) | Symbol s => Symbol.toString s val layout = Layout.str o toString val op <= = fn (Int n, Int n') => Int.<= (n, n') | (Symbol s, Symbol s') => Symbol.<= (s, s') | (Symbol _, Int _) => false | (Int _, Symbol _) => true end mlton-20210117+dfsg/mlton/atoms/field.sig000066400000000000000000000012111416264345000200640ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature FIELD_STRUCTS = sig structure Symbol: SYMBOL end signature FIELD = sig include FIELD_STRUCTS datatype t = Int of int | Symbol of Symbol.t val <= : t * t -> bool (* ordering used for sorting *) val equals: t * t -> bool val layout: t -> Layout.t val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/func.sig000066400000000000000000000003351416264345000177420ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature FUNC = ID mlton-20210117+dfsg/mlton/atoms/generic-scheme.fun000066400000000000000000000023231416264345000216720ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor GenericScheme (S: GENERIC_SCHEME_STRUCTS): GENERIC_SCHEME = struct open S type ty = Type.t type tyvar = Tyvar.t datatype t = T of {tyvars: tyvar vector, ty: ty} local fun make f (T r) = f r in val ty = make #ty end fun layout (T {tyvars, ty}) = let open Layout val ty = Type.layout ty in if Vector.isEmpty tyvars then ty else align [seq [str "Forall ", Vector.layout Tyvar.layout tyvars, str "."], ty] end fun apply (T {tyvars, ty}, args) = if Vector.isEmpty tyvars andalso Vector.isEmpty args then ty (* Must special case this, since don't want to substitute * in monotypes. *) else Type.substitute (ty, Vector.zip (tyvars, args)) val apply = Trace.trace ("GenericScheme.apply", Layout.tuple2 (layout, Vector.layout Type.layout), Type.layout) apply end mlton-20210117+dfsg/mlton/atoms/generic-scheme.sig000066400000000000000000000015041416264345000216640ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature GENERIC_SCHEME_STRUCTS = sig structure Tyvar: TYVAR structure Type: sig type t val var: Tyvar.t -> t val substitute: t * (Tyvar.t * t) vector -> t val layout: t -> Layout.t end end signature GENERIC_SCHEME = sig type tyvar type ty datatype t = T of {tyvars: tyvar vector, ty: ty} val apply: t * ty vector -> ty val layout: t -> Layout.t val ty: t -> ty end mlton-20210117+dfsg/mlton/atoms/handler.fun000066400000000000000000000030541416264345000204330ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Handler (S: HANDLER_STRUCTS): HANDLER = struct open S datatype t = Caller | Dead | Handle of Label.t fun layout (h: t): Layout.t = let open Layout in case h of Caller => str "Caller" | Dead => str "Dead" | Handle l => seq [str "Handle ", Label.layout l] end val equals = fn (Caller, Caller) => true | (Dead, Dead) => true | (Handle l, Handle l') => Label.equals (l, l') | _ => false fun foldLabel (h: t, a: 'a, f: Label.t * 'a -> 'a): 'a = case h of Caller => a | Dead => a | Handle l => f (l, a) fun foreachLabel (h, f) = foldLabel (h, (), f o #1) fun map (h, f) = case h of Caller => Caller | Dead => Dead | Handle l => Handle (f l) local val newHash = Random.word val caller = newHash () val dead = newHash () val handlee = newHash () in fun hash (h: t): word = case h of Caller => caller | Dead => dead | Handle l => Hash.combine (handlee, Label.hash l) end end mlton-20210117+dfsg/mlton/atoms/handler.sig000066400000000000000000000013671416264345000204320ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature HANDLER_STRUCTS = sig structure Label: LABEL end signature HANDLER = sig include HANDLER_STRUCTS datatype t = Caller | Dead | Handle of Label.t val equals: t * t -> bool val foldLabel: t * 'a * (Label.t * 'a -> 'a) -> 'a val foreachLabel: t * (Label.t -> unit) -> unit val hash: t -> word val layout: t -> Layout.t val map: t * (Label.t -> Label.t) -> t end mlton-20210117+dfsg/mlton/atoms/hash-type.fun000066400000000000000000000153061416264345000207230ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor HashType (S: HASH_TYPE_STRUCTS): HASH_TYPE = struct open S structure Type = struct datatype t = T of { hash: Word.t, plist: PropertyList.t, tree: tree } and tree = Var of Tyvar.t | Con of Tycon.t * t vector local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end local open Layout in val rec layoutTree = fn Var a => Tyvar.layout a | Con (c, ts) => seq [Tycon.layout c, Vector.layout (layoutTree o tree) ts] end structure Dest = struct datatype dest = datatype tree val dest = tree end open Dest fun deConOpt t = case dest t of Con x => SOME x | _ => NONE fun makeHom {con, var} = let val {get, destroy, ...} = Property.destGet (plist, Property.initRec (fn (t, get) => case dest t of Var a => var (t, a) | Con (c, ts) => con (t, c, Vector.map (ts, get)))) in {hom = get, destroy = destroy} end fun hom {ty, var, con} = let val {hom, destroy} = makeHom {var = var o #2, con = fn (_, c, xs) => con (c, xs)} val res = hom ty val _ = destroy () in res end fun makeMonoHom {con} = makeHom {var = fn _ => Error.bug "HashType.Type.makeMonoHom: type variable", con = con} fun equals (t, t'): bool = PropertyList.equals (plist t, plist t') fun layoutPretty (ty: t): Layout.t = #1 (hom {con = fn (c, ts) => (Tycon.layoutAppPretty (c, ts, {layoutPretty = Tycon.layout})), ty = ty, var = fn a => LayoutPretty.simple (Tyvar.layout a)}) fun layout (ty: t): Layout.t = hom {con = Tycon.layoutApp, ty = ty, var = Tyvar.layout} local val same: tree * tree -> bool = fn (Var a, Var a') => Tyvar.equals (a, a') | (Con (c, ts), Con (c', ts')) => Tycon.equals (c, c') andalso Vector.equals (ts, ts', equals) | _ => false val same = Trace.trace2 ("HashType.Type.same", layoutTree, layoutTree, Bool.layout) same val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", lookup)] end end fun var a = lookup (Tyvar.hash a, Var a) fun con (c, ts) = lookup (Hash.combine (Tycon.hash c, Hash.vectorMap (ts, hash)), Con (c, ts)) val con = Trace.trace2 ("HashType.Type.con", Tycon.layout, Vector.layout layout, layout) con end structure Ops = TypeOps (structure Tycon = Tycon open Type) open Type Ops val string = word8Vector fun ofConst c = let datatype z = datatype Const.t in case c of CSymbol _ => cpointer | IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector (word (WordXVector.elementSize v)) end fun isUnit t = case dest t of Con (c, ts) => Vector.isEmpty ts andalso Tycon.equals (c, Tycon.tuple) | _ => false fun substitute (ty, v) = if Vector.isEmpty v then ty (* This optimization is important so that monotypes * are not substituted inside of. *) else hom {ty = ty, var = fn a => (case Vector.peek (v, fn (a', _) => Tyvar.equals (a, a')) of NONE => var a | SOME (_, ty) => ty), con = con} val substitute = Trace.trace2 ("HashType.substitute", layout, Vector.layout (Layout.tuple2 (Tyvar.layout, Type.layout)), layout) substitute (* fun equalss (ts: t list): t option = * case ts of * t :: ts => * let fun loop [] = SOME t * | loop (t' :: ts) = if equals (t, t') then loop ts else NONE * in loop ts * end * | [] => Error.bug "HashType.equals" *) local val out = Out.error val print = Out.outputc out exception TypeError in fun error (msg, lay) = (print (concat ["Type error: ", msg, "\n"]) ; Layout.output (lay, out) ; print "\n" ; raise TypeError) end fun tycon t = case dest t of Con (c, _) => c | _ => Error.bug "HashType.tycon: type variable" fun containsTycon (ty, tycon) = hom {ty = ty, var = fn _ => false, con = fn (tycon', bs) => (Tycon.equals (tycon, tycon') orelse Vector.exists (bs, fn b => b))} fun checkPrimApp {args, prim, result, targs}: bool = Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array, arrow = arrow, bool = bool, cpointer = cpointer, equals = equals, exn = exn, intInf = intInf, real = real, reff = reff, thread = thread, unit = unit, vector = vector, weak = weak, word = word}}) end mlton-20210117+dfsg/mlton/atoms/hash-type.sig000066400000000000000000000040011416264345000207030ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature HASH_TYPE_STRUCTS = sig include ATOMS end signature HASH_TYPE = sig include HASH_TYPE_STRUCTS include TYPE_OPS sharing type realSize = RealSize.t sharing type tycon = Tycon.t sharing type wordSize = WordSize.t structure Dest: sig datatype dest = Con of Tycon.t * t vector | Var of Tyvar.t val dest: t -> dest end val checkPrimApp: {args: t vector, prim: t Prim.t, result: t, targs: t vector} -> bool val containsTycon: t * Tycon.t -> bool (* O(1) time *) val equals: t * t -> bool (* for reporting type errors *) val error: string * Layout.t -> 'a val hash: t -> Word.t val hom: {ty: t, var: Tyvar.t -> 'a, con: Tycon.t * 'a vector -> 'a} -> 'a val isUnit: t -> bool val layout: t -> Layout.t val layoutPretty: t -> Layout.t val makeHom: {var: t * Tyvar.t -> 'a, con: t * Tycon.t * 'a vector -> 'a} -> {hom: t -> 'a, destroy: unit -> unit} val makeMonoHom: {con: t * Tycon.t * 'a vector -> 'a} -> {hom: t -> 'a, destroy: unit -> unit} val ofConst: Const.t -> t val plist: t -> PropertyList.t val stats: unit -> Layout.t val string: t (* synonym for word8Vector *) (* substitute (t, [(a1, t1), ..., (an, tn)]) performs simultaneous * substitution of the ti for ai in t. * The ai's are not required to contain every free variable in t *) val substitute: t * (Tyvar.t * t) vector -> t val tycon: t -> Tycon.t val var: Tyvar.t -> t end mlton-20210117+dfsg/mlton/atoms/id.fun000066400000000000000000000124611416264345000174140ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure UniqueString: sig val unique: string -> string end = struct val counters: (string, Counter.t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} fun unique (original: string): string = let val c = HashTable.lookupOrInsert (counters, original, fn () => Counter.new 0) in concat [original, "_", Int.toString (Counter.next c)] end end functor Id (S: ID_STRUCTS): ID = struct open S structure Plist = PropertyList datatype t = T of {hash: word, originalName: string, printName: string option ref, plist: Plist.t} type id = t local fun make f (T r) = f r in val hash = make #hash val originalName = make #originalName val plist = make #plist end fun isAlphaNum (s: string): bool = String.forall (s, fn c => Char.isAlphaNum c orelse c = #"_") fun clearPrintName (T {originalName, printName, ...}): unit = if isAlphaNum originalName then () else printName := NONE val printNameAlphaNumeric: bool ref = ref false fun toString (T {originalName, printName, ...}) = case !printName of NONE => let val s = if not (!printNameAlphaNumeric) orelse isAlphaNum originalName then originalName else String.translate (originalName, fn #"!" => "Bang" | #"#" => "Hash" | #"$" => "Dollar" | #"%" => "Percent" | #"&" => "Ampersand" | #"'" => "Prime" | #"*" => "Star" | #"+" => "Plus" | #"-" => "Minus" | #"." => "Dot" | #"/" => "Divide" | #":" => "Colon" | #"<" => "Lt" | #"=" => "Eq" | #">" => "Gt" | #"?" => "Ques" | #"@" => "At" | #"\\" => "Slash" | #"^" => "Caret" | #"`" => "Quote" | #"|" => "Pipe" | #"~" => "Tilde" | c => str c) val s = UniqueString.unique s val _ = printName := SOME s in s end | SOME s => s val layout = String.layout o toString fun equals (id, id') = Plist.equals (plist id, plist id') local fun make (originalName, printName) = T {hash = Random.word (), originalName = originalName, printName = ref printName, plist = Plist.new ()} in fun fromString s = make (s, SOME s) fun newString s = make (s, NONE) end local open Parse infix 1 <|> >>= infix 3 *> infixr 4 <$> <$$> <$$$> val cache = HashTable.new {hash = String.hash, equals = String.equals} fun insert id = (ignore o HashTable.lookupOrInsert) (cache, toString id, fn () => id) val alphanum = named ("alphanum", nextSat (fn c => Char.isAlphaNum c orelse c = #"_" orelse c = #"'")) val sym = named ("sym", nextSat (fn c => String.contains ("!%&$#+-/:<=>?@\\~`^|*", c))) val alphanumId = (op ::) <$$> (named ("alpha", nextSat Char.isAlpha), many alphanum) val symId = (fn (c,cs,suf) => (c::(cs@suf))) <$$$> (sym, many sym, (op ::) <$$> (char #"_", many (nextSat Char.isDigit)) <|> pure []) val tyvarId = (op ::) <$$> (nextSat (fn c => c = #"'"), many alphanum) fun parseGen (alts: (string * 'a Parse.t) vector, fromId: id -> 'a Parse.t) : 'a Parse.t = mlSpaces *> (String.implode <$> (if String.sub (noname, 0) = #"'" then tyvarId else alphanumId <|> symId)) >>= (fn printName => let fun make () = let fun loop (i, b) = if Char.isDigit (String.sub (printName, i)) then loop (i - 1, true) else if b andalso String.sub (printName, i) = #"_" then newString (String.substring (printName, 0, i)) else fromString printName in loop (String.size printName - 1, false) end in case Vector.peek (alts, fn (s, _) => String.equals (printName, s)) of SOME (_, res) => res | NONE => fromId (HashTable.lookupOrInsert (cache, printName, make)) end) in fun parseAs (alts, fromId) = parseGen (Vector.map (alts, fn (s, r) => (s, pure r)), pure o fromId) fun parseExcept ss = parseGen (Vector.map (ss, fn s => (s, fail "fail")), pure) val parse = parseExcept (Vector.new0 ()) fun parseReset {prims} = (HashTable.removeAll (cache, fn _ => true); Vector.foreach (prims, insert)) end val new = newString o originalName fun newNoname () = newString noname val bogus = newString "bogus" val clear = Plist.clear o plist end mlton-20210117+dfsg/mlton/atoms/id.sig000066400000000000000000000023021416264345000173770ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ID_STRUCTS = sig val noname: string end signature ID = sig include ID_STRUCTS type t val bogus: t val clear: t -> unit val clearPrintName: t -> unit val equals: t * t -> bool val layout: t -> Layout.t val fromString: string -> t (* doesn't add uniquefying suffix *) val hash: t -> word val new: t -> t (* new id with the same originalName *) val newNoname: unit -> t (* prefix is noname *) val newString: string -> t (* new id with printName not set *) val originalName: t -> string (* raw destructor *) val parse: t Parse.t val parseAs: (string * 'a) vector * (t -> 'a) -> 'a Parse.t val parseExcept: string vector -> t Parse.t val parseReset: {prims: t vector} -> unit val plist: t -> PropertyList.t val printNameAlphaNumeric: bool ref val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/int-size.fun000066400000000000000000000026711416264345000205640ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor IntSize (S: INT_SIZE_STRUCTS): INT_SIZE = struct open S datatype t = T of {bits: Bits.t} fun bits (T {bits, ...}) = bits fun compare (s, s') = Bits.compare (bits s, bits s') val {equals, ...} = Relation.compare compare fun isValidSize (i: int) = (1 <= i andalso i <= 32) orelse i = 64 val sizes: Bits.t list = Vector.toListKeepAllMap (Vector.tabulate (65, fn i => if isValidSize i then SOME (Bits.fromInt i) else NONE), fn i => i) fun make i = T {bits = i} val allVector = Vector.tabulate (65, fn i => if isValidSize i then SOME (make (Bits.fromInt i)) else NONE) fun fromBits (b: Bits.t): t = case Vector.sub (allVector, Bits.toInt b) handle Subscript => NONE of NONE => Error.bug (concat ["IntSize.fromBits: strange int size: ", Bits.toString b]) | SOME s => s val all = List.map (sizes, fromBits) val memoize: (t -> 'a) -> t -> 'a = fn f => let val v = Vector.map (allVector, fn opt => Option.map (opt, f)) in fn T {bits = b, ...} => valOf (Vector.sub (v, Bits.toInt b)) end end mlton-20210117+dfsg/mlton/atoms/int-size.sig000066400000000000000000000007411416264345000205520ustar00rootroot00000000000000(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature INT_SIZE_STRUCTS = sig end signature INT_SIZE = sig include INT_SIZE_STRUCTS type t val all: t list val bits: t -> Bits.t val equals: t * t -> bool val fromBits : Bits.t -> t val memoize: (t -> 'a) -> t -> 'a end mlton-20210117+dfsg/mlton/atoms/label.sig000066400000000000000000000003361416264345000200670ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature LABEL = ID mlton-20210117+dfsg/mlton/atoms/layout-pretty.sml000066400000000000000000000014421416264345000216620ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure BindingStrength = struct datatype t = Arrow | Tuple | Unit end structure LayoutPretty = struct type t = Layout.t * ({isChar: bool} * BindingStrength.t) fun simple (l: Layout.t): t = (l, ({isChar = false}, BindingStrength.Unit)) val dontCare: t = simple (Layout.str "_") fun bracket ((l, ({isChar}, _)): t): t = (Layout.seq [Layout.str "[", l, Layout.str "]"], ({isChar = isChar}, BindingStrength.Unit)) end mlton-20210117+dfsg/mlton/atoms/prim-cons.fun000066400000000000000000000010771416264345000207300ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PrimCons (S: PRIM_CONS_STRUCTS): PRIM_CONS = struct open S type con = t val cons = fromString "::" val falsee = fromString "false" val nill = fromString "nil" val reff = fromString "ref" val truee = fromString "true" (* exception constructors *) val bind = fromString "Bind" val match = fromString "Match" end mlton-20210117+dfsg/mlton/atoms/prim-cons.sig000066400000000000000000000010741416264345000207170ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_CONS_STRUCTS = sig type t val equals: t * t -> bool val fromString: string -> t end signature PRIM_CONS = sig type con val bind: con val cons: con val falsee: con val match: con val nill: con val reff: con val truee: con end mlton-20210117+dfsg/mlton/atoms/prim-tycons.fun000066400000000000000000000174421416264345000213100ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PrimTycons (S: PRIM_TYCONS_STRUCTS): PRIM_TYCONS = struct open S datatype z = datatype RealSize.t type tycon = t local fun make s = (s, fromString s) in val array = make "array" val arrow = make "arrow" val bool = make "bool" val cpointer = make "cpointer" val exn = make "exn" val intInf = make "intInf" val list = make "list" val reff = make "ref" val thread = make "thread" val tuple = make "tuple" val vector = make "vector" val weak = make "weak" end datatype z = datatype Kind.t datatype z = datatype AdmitsEquality.t local fun 'a make (prefix: string, all: 'a list, bits: 'a -> Bits.t, equalsA: 'a * 'a -> bool, memo: ('a -> t) -> ('a -> t), admitsEquality: AdmitsEquality.t) = let val all = Vector.fromListMap (all, fn s => let val name = concat [prefix, Bits.toString (bits s)] in {name = name, size = s, tycon = fromString name} end) val fromSize = memo (fn s => case Vector.peek (all, fn {size = s', ...} => equalsA (s, s')) of NONE => Error.bug "PrimTycons.make.fromSize" | SOME {tycon, ...} => tycon) fun is t = Vector.exists (all, fn {tycon = t', ...} => equals (t, t')) fun de t = case Vector.peek (all, fn {tycon = t', ...} => equals (t, t')) of NONE => Error.bug "PrimTycons.make.de" | SOME {size, ...} => size val prims = Vector.toListMap (all, fn {name, tycon, ...} => {admitsEquality = admitsEquality, kind = Arity 0, name = name, tycon = tycon}) val all = Vector.map (all, fn {tycon, size, ...} => (tycon, size)) in (fromSize, all, is, de, prims) end in val (char, _, isCharX, deCharX, primChars) = let open CharSize in make ("char", all, bits, equals, memoize, Sometimes) end val (int, ints, isIntX, deIntX, primInts) = let open IntSize in make ("int", all, bits, equals, memoize, Sometimes) end val (real, reals, isRealX, deRealX, primReals) = let open RealSize in make ("real", all, bits, equals, memoize, Never) end val (word, words, isWordX, deWordX, primWords) = let open WordSize in make ("word", all, bits, equals, memoize, Sometimes) end end val prims = List.map ([(array, Arity 1, Always), (arrow, Arity 2, Never), (bool, Arity 0, Sometimes), (cpointer, Arity 0, Always), (exn, Arity 0, Never), (intInf, Arity 0, Sometimes), (list, Arity 1, Sometimes), (reff, Arity 1, Always), (thread, Arity 0, Never), (tuple, Nary, Sometimes), (vector, Arity 1, Sometimes), (weak, Arity 1, Never)], fn ((name, tycon), kind, admitsEquality) => {admitsEquality = admitsEquality, kind = kind, name = name, tycon = tycon}) @ primChars @ primInts @ primReals @ primWords val array = #2 array val arrow = #2 arrow val bool = #2 bool val cpointer = #2 cpointer val exn = #2 exn val intInf = #2 intInf val list = #2 list val reff = #2 reff val thread = #2 thread val tuple = #2 tuple val vector = #2 vector val weak = #2 weak val defaultChar = fn () => case !Control.defaultChar of "char8" => char CharSize.C8 | _ => Error.bug "PrimTycons.defaultChar" val defaultInt = fn () => case !Control.defaultInt of "int8" => int (IntSize.fromBits (Bits.fromInt 8)) | "int16" => int (IntSize.fromBits (Bits.fromInt 16)) | "int32" => int (IntSize.fromBits (Bits.fromInt 32)) | "int64" => int (IntSize.fromBits (Bits.fromInt 64)) | "intinf" => intInf | _ => Error.bug "PrimTycons.defaultInt" val defaultReal = fn () => case !Control.defaultReal of "real32" => real RealSize.R32 | "real64" => real RealSize.R64 | _ => Error.bug "PrimTycons.defaultReal" val defaultWord = fn () => case !Control.defaultWord of "word8" => word (WordSize.fromBits (Bits.fromInt 8)) | "word16" => word (WordSize.fromBits (Bits.fromInt 16)) | "word32" => word (WordSize.fromBits (Bits.fromInt 32)) | "word64" => word (WordSize.fromBits (Bits.fromInt 64)) | _ => Error.bug "PrimTycons.defaultWord" val isBool = fn c => equals (c, bool) val isCPointer = fn c => equals (c, cpointer) val isIntX = fn c => equals (c, intInf) orelse isIntX c val deIntX = fn c => if equals (c, intInf) then NONE else SOME (deIntX c) local local open Layout in val mayAlign = mayAlign val seq = seq val str = str end datatype z = datatype BindingStrength.t datatype binding_context = ArrowLhs | ArrowRhs | TupleElem | Tyseq1 | TyseqN fun maybe bindingContext (l, ({isChar = _}, bindingStrength)) = case (bindingStrength, bindingContext) of (Unit, _) => l | (Tuple, ArrowLhs) => l | (Tuple, ArrowRhs) => l | (Tuple, TyseqN) => l | (Arrow, ArrowRhs) => l | (Arrow, TyseqN) => l | _ => Layout.paren l fun normal (c: Layout.t, args: LayoutPretty.t vector, {isChar}) = let val lay = case Vector.length args of 0 => c | 1 => seq [maybe Tyseq1 (Vector.first args), str " ", c] | _ => seq [Layout.tuple (Vector.toListMap (args, maybe TyseqN)), str " ", c] in (lay, ({isChar = isChar}, Unit)) end in fun layoutAppPrettyNormal (c: Layout.t, args: LayoutPretty.t vector) = normal (c, args, {isChar = false}) fun layoutAppPretty (c: t, args: LayoutPretty.t vector, {layoutPretty}) = if equals (c, arrow) then (mayAlign [maybe ArrowLhs (Vector.first args), seq [str "-> ", maybe ArrowRhs (Vector.sub (args, 1))]], ({isChar = false}, Arrow)) else if equals (c, tuple) then if Vector.isEmpty args then LayoutPretty.simple (str "unit") else (mayAlign (Layout.separateLeft (Vector.toListMap (args, maybe TupleElem), "* ")), ({isChar = false}, Tuple)) else if equals (c, vector) then if #isChar (#1 (#2 (Vector.first args))) then LayoutPretty.simple (str "string") else normal (layoutPretty c, args, {isChar = false}) else normal (layoutPretty c, args, {isChar = equals (c, defaultChar ())}) end fun layoutApp (c: t, args: Layout.t vector) = let local open Layout in val empty = empty val seq = seq val str = str end val con = if equals (c, tuple) andalso Vector.isEmpty args then str "unit" else (case List.peekMap (prims, fn {name, tycon, ...} => if equals (c, tycon) then SOME name else NONE) of SOME name => str name | _ => layout c) val args = if Vector.isEmpty args then empty else seq [Layout.tuple (Vector.toList args), str " "] in seq [args, con] end end mlton-20210117+dfsg/mlton/atoms/prim-tycons.sig000066400000000000000000000045131416264345000212750ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_TYCONS_SUBSTRUCTS = sig structure AdmitsEquality: ADMITS_EQUALITY structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure Kind: TYCON_KIND structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature PRIM_TYCONS_STRUCTS = sig include PRIM_TYCONS_SUBSTRUCTS type t val fromString: string -> t val equals: t * t -> bool val layout: t -> Layout.t end signature PRIM_TYCONS = sig include PRIM_TYCONS_SUBSTRUCTS type tycon val array: tycon val arrow: tycon val bool: tycon val char: CharSize.t -> tycon val cpointer: tycon val deCharX: tycon -> CharSize.t val defaultChar: unit -> tycon val defaultInt: unit -> tycon val defaultReal: unit -> tycon val defaultWord: unit -> tycon val deIntX: tycon -> IntSize.t option val deRealX: tycon -> RealSize.t val deWordX: tycon -> WordSize.t val exn: tycon val int: IntSize.t -> tycon val ints: (tycon * IntSize.t) vector val intInf: tycon val isBool: tycon -> bool val isCharX: tycon -> bool val isCPointer: tycon -> bool val isIntX: tycon -> bool val isRealX: tycon -> bool val isWordX: tycon -> bool val layoutApp: tycon * Layout.t vector -> Layout.t val list: tycon val layoutAppPretty: tycon * LayoutPretty.t vector * {layoutPretty: tycon -> Layout.t} -> LayoutPretty.t val layoutAppPrettyNormal: Layout.t * LayoutPretty.t vector -> LayoutPretty.t val prims: {admitsEquality: AdmitsEquality.t, kind: Kind.t, name: string, tycon: tycon} list val real: RealSize.t -> tycon val reals: (tycon * RealSize.t) vector val reff: tycon val thread: tycon val tuple: tycon val vector: tycon val weak: tycon val word: WordSize.t -> tycon val words: (tycon * WordSize.t) vector end mlton-20210117+dfsg/mlton/atoms/prim.fun000066400000000000000000002567621416264345000200050ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2014,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * If you add new polymorphic primitives, you must modify extractTargs. *) functor Prim (S: PRIM_STRUCTS): PRIM = struct open S local open Const in structure RealX = RealX structure WordX = WordX structure WordXVector = WordXVector end structure Kind = struct datatype t = DependsOnState | Functional | Moveable | SideEffect end datatype 'a t = Array_alloc of {raw: bool} (* to rssa (as runtime C fn) *) | Array_array (* to ssa2 *) | Array_copyArray (* to rssa (as runtime C fn) *) | Array_copyVector (* to rssa (as runtime C fn) *) | Array_length (* to rssa *) | Array_sub (* to ssa2 *) | Array_toArray (* to rssa *) | Array_toVector (* to rssa *) | Array_uninit (* to rssa *) | Array_uninitIsNop (* to rssa *) | Array_update (* to ssa2 *) | CFunction of 'a CFunction.t (* to rssa *) | CPointer_add (* codegen *) | CPointer_diff (* codegen *) | CPointer_equal (* codegen *) | CPointer_fromWord (* codegen *) | CPointer_getCPointer (* to rssa *) | CPointer_getObjptr (* to rssa *) | CPointer_getReal of RealSize.t (* to rssa *) | CPointer_getWord of WordSize.t (* to rssa *) | CPointer_lt (* codegen *) | CPointer_setCPointer (* to rssa *) | CPointer_setObjptr (* to rssa *) | CPointer_setReal of RealSize.t (* to rssa *) | CPointer_setWord of WordSize.t (* to rssa *) | CPointer_sub (* codegen *) | CPointer_toWord (* codegen *) | Exn_extra (* implement exceptions *) | Exn_name (* implement exceptions *) | Exn_setExtendExtra (* implement exceptions *) | GC_collect (* to rssa (as runtime C fn) *) | GC_state (* to rssa (as operand) *) | IntInf_add (* to rssa (as runtime C fn) *) | IntInf_andb (* to rssa (as runtime C fn) *) | IntInf_arshift (* to rssa (as runtime C fn) *) | IntInf_compare (* to rssa (as runtime C fn) *) | IntInf_gcd (* to rssa (as runtime C fn) *) | IntInf_lshift (* to rssa (as runtime C fn) *) | IntInf_mul (* to rssa (as runtime C fn) *) | IntInf_neg (* to rssa (as runtime C fn) *) | IntInf_notb (* to rssa (as runtime C fn) *) | IntInf_orb (* to rssa (as runtime C fn) *) | IntInf_quot (* to rssa (as runtime C fn) *) | IntInf_rem (* to rssa (as runtime C fn) *) | IntInf_sub (* to rssa (as runtime C fn) *) | IntInf_toString (* to rssa (as runtime C fn) *) | IntInf_toVector (* to rssa *) | IntInf_toWord (* to rssa *) | IntInf_xorb (* to rssa (as runtime C fn) *) (* of type unit -> 'a. * Makes a bogus value of any type. *) | MLton_bogus (* to rssa *) | MLton_bug (* to rssa (as impure C fn) *) | MLton_deserialize (* unused *) | MLton_eq (* to rssa (as Word_equal) *) | MLton_equal (* polymorphic equality *) | MLton_halt (* to rssa (as runtime C fn) *) | MLton_hash (* polymorphic hash *) (* MLton_handlesSignals and MLton_installSignalHandler work together * to inform the optimizer and basis library whether or not the * program uses signal handlers. * * MLton_installSignalHandler is called by MLton.Signal.setHandler, * and is effectively a noop, but is left in the program until, so * that the optimizer can test whether or not the program installs * signal handlers. * * MLton_handlesSignals is translated by closure conversion into * a boolean, and is true iff MLton_installsSignalHandler is called. *) | MLton_handlesSignals (* closure conversion *) | MLton_installSignalHandler (* to rssa (as nop) *) | MLton_serialize (* unused *) | MLton_share (* to rssa (as nop or runtime C fn) *) | MLton_size (* to rssa (as runtime C fn) *) | MLton_touch (* to rssa (as nop) or backend (as nop) *) | Real_Math_acos of RealSize.t (* codegen *) | Real_Math_asin of RealSize.t (* codegen *) | Real_Math_atan of RealSize.t (* codegen *) | Real_Math_atan2 of RealSize.t (* codegen *) | Real_Math_cos of RealSize.t (* codegen *) | Real_Math_exp of RealSize.t (* codegen *) | Real_Math_ln of RealSize.t (* codegen *) | Real_Math_log10 of RealSize.t (* codegen *) | Real_Math_sin of RealSize.t (* codegen *) | Real_Math_sqrt of RealSize.t (* codegen *) | Real_Math_tan of RealSize.t (* codegen *) | Real_abs of RealSize.t (* codegen *) | Real_add of RealSize.t (* codegen *) | Real_castToWord of RealSize.t * WordSize.t (* codegen *) | Real_div of RealSize.t (* codegen *) | Real_equal of RealSize.t (* codegen *) | Real_ldexp of RealSize.t (* codegen *) | Real_le of RealSize.t (* codegen *) | Real_lt of RealSize.t (* codegen *) | Real_mul of RealSize.t (* codegen *) | Real_muladd of RealSize.t (* codegen *) | Real_mulsub of RealSize.t (* codegen *) | Real_neg of RealSize.t (* codegen *) | Real_qequal of RealSize.t (* codegen *) | Real_rndToReal of RealSize.t * RealSize.t (* codegen *) | Real_rndToWord of RealSize.t * WordSize.t * {signed: bool} (* codegen *) | Real_round of RealSize.t (* codegen *) | Real_sub of RealSize.t (* codegen *) | Ref_assign (* to ssa2 *) | Ref_deref (* to ssa2 *) | Ref_ref (* to ssa2 *) | String_toWord8Vector (* defunctorize *) | Thread_atomicBegin (* to rssa *) | Thread_atomicEnd (* to rssa *) | Thread_atomicState (* to rssa *) | Thread_copy (* to rssa (as runtime C fn) *) | Thread_copyCurrent (* to rssa (as runtime C fn) *) | Thread_returnToC (* codegen *) (* switchTo has to be a _prim because we have to know that it * enters the runtime -- because everything must be saved * on the stack. *) | Thread_switchTo (* to rssa (as runtime C fn) *) | TopLevel_getHandler (* implement exceptions *) | TopLevel_getSuffix (* implement suffix *) | TopLevel_setHandler (* implement exceptions *) | TopLevel_setSuffix (* implement suffix *) | Vector_length (* to ssa2 *) | Vector_sub (* to ssa2 *) | Vector_vector (* to ssa2 *) | Weak_canGet (* to rssa (as runtime C fn) *) | Weak_get (* to rssa (as runtime C fn) *) | Weak_new (* to rssa (as runtime C fn) *) | Word_add of WordSize.t (* codegen *) | Word_addCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_andb of WordSize.t (* codegen *) | Word_castToReal of WordSize.t * RealSize.t (* codegen *) | Word_equal of WordSize.t (* codegen *) | Word_extdToWord of WordSize.t * WordSize.t * {signed: bool} (* codegen *) | Word_lshift of WordSize.t (* codegen *) | Word_lt of WordSize.t * {signed: bool} (* codegen *) | Word_mul of WordSize.t * {signed: bool} (* codegen *) | Word_mulCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_neg of WordSize.t (* codegen *) | Word_negCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_notb of WordSize.t (* codegen *) | Word_orb of WordSize.t (* codegen *) | Word_quot of WordSize.t * {signed: bool} (* codegen *) | Word_rem of WordSize.t * {signed: bool} (* codegen *) | Word_rndToReal of WordSize.t * RealSize.t * {signed: bool} (* codegen *) | Word_rol of WordSize.t (* codegen *) | Word_ror of WordSize.t (* codegen *) | Word_rshift of WordSize.t * {signed: bool} (* codegen *) | Word_sub of WordSize.t (* codegen *) | Word_subCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_toIntInf (* to rssa *) | Word_xorb of WordSize.t (* codegen *) | WordVector_toIntInf (* to rssa *) | WordArray_subWord of {seqSize:WordSize.t, eleSize:WordSize.t} (* to rssa *) | WordArray_updateWord of {seqSize: WordSize.t, eleSize: WordSize.t} (* to rssa *) | WordVector_subWord of {seqSize: WordSize.t, eleSize: WordSize.t} (* to rssa *) | Word8Vector_toString (* defunctorize *) | World_save (* to rssa (as runtime C fn) *) (* The values of these strings are important since they are referred to * in the basis library code. See basis-library/misc/primitive.sml. *) fun toString (n: 'a t): string = let fun real (s: RealSize.t, str: string): string = concat ["Real", RealSize.toString s, "_", str] fun sign {signed} = if signed then "WordS" else "WordU" fun word (s: WordSize.t, str: string): string = concat ["Word", WordSize.toString s, "_", str] fun wordSeq (seqSize: WordSize.t, seqKind: string, oper: string, eleSize: WordSize.t): string = concat ["Word", WordSize.toString seqSize, seqKind, "_", oper, "Word", WordSize.toString eleSize] fun wordS (s: WordSize.t, sg, str: string): string = concat [sign sg, WordSize.toString s, "_", str] val realC = ("Real", RealSize.toString) val wordC = ("Word", WordSize.toString) fun wordCS sg = (sign sg, WordSize.toString) fun coerce (k, (n, sizeToString), (n', sizeToString'), s, s'): string = concat [n, sizeToString s, "_", k ,"To", n', sizeToString' s'] fun cast (c, c', s, s') = coerce ("cast", c, c', s, s') fun extd (c, c', s, s') = coerce ("extd", c, c', s, s') fun rnd (c, c', s, s') = coerce ("rnd", c, c', s, s') fun cpointerGet (ty, s) = concat ["CPointer_get", ty, s] fun cpointerSet (ty, s) = concat ["CPointer_set", ty, s] in case n of Array_alloc {raw} => if raw then "Array_allocRaw" else "Array_alloc" | Array_array => "Array_array" | Array_copyArray => "Array_copyArray" | Array_copyVector => "Array_copyVector" | Array_length => "Array_length" | Array_sub => "Array_sub" | Array_toArray => "Array_toArray" | Array_toVector => "Array_toVector" | Array_uninit => "Array_uninit" | Array_uninitIsNop => "Array_uninitIsNop" | Array_update => "Array_update" | CFunction f => (CFunction.Target.toString o CFunction.target) f | CPointer_add => "CPointer_add" | CPointer_diff => "CPointer_diff" | CPointer_equal => "CPointer_equal" | CPointer_fromWord => "CPointer_fromWord" | CPointer_getCPointer => "CPointer_getCPointer" | CPointer_getObjptr => "CPointer_getObjptr" | CPointer_getReal s => cpointerGet ("Real", RealSize.toString s) | CPointer_getWord s => cpointerGet ("Word", WordSize.toString s) | CPointer_lt => "CPointer_lt" | CPointer_setCPointer => "CPointer_setCPointer" | CPointer_setObjptr => "CPointer_setObjptr" | CPointer_setReal s => cpointerSet ("Real", RealSize.toString s) | CPointer_setWord s => cpointerSet ("Word", WordSize.toString s) | CPointer_sub => "CPointer_sub" | CPointer_toWord => "CPointer_toWord" | Exn_extra => "Exn_extra" | Exn_name => "Exn_name" | Exn_setExtendExtra => "Exn_setExtendExtra" | GC_collect => "GC_collect" | GC_state => "GC_state" | IntInf_add => "IntInf_add" | IntInf_andb => "IntInf_andb" | IntInf_arshift => "IntInf_arshift" | IntInf_compare => "IntInf_compare" | IntInf_gcd => "IntInf_gcd" | IntInf_lshift => "IntInf_lshift" | IntInf_mul => "IntInf_mul" | IntInf_neg => "IntInf_neg" | IntInf_notb => "IntInf_notb" | IntInf_orb => "IntInf_orb" | IntInf_quot => "IntInf_quot" | IntInf_rem => "IntInf_rem" | IntInf_sub => "IntInf_sub" | IntInf_toString => "IntInf_toString" | IntInf_toVector => "IntInf_toVector" | IntInf_toWord => "IntInf_toWord" | IntInf_xorb => "IntInf_xorb" | MLton_bogus => "MLton_bogus" | MLton_bug => "MLton_bug" | MLton_deserialize => "MLton_deserialize" | MLton_eq => "MLton_eq" | MLton_equal => "MLton_equal" | MLton_halt => "MLton_halt" | MLton_hash => "MLton_hash" | MLton_handlesSignals => "MLton_handlesSignals" | MLton_installSignalHandler => "MLton_installSignalHandler" | MLton_serialize => "MLton_serialize" | MLton_share => "MLton_share" | MLton_size => "MLton_size" | MLton_touch => "MLton_touch" | Real_Math_acos s => real (s, "Math_acos") | Real_Math_asin s => real (s, "Math_asin") | Real_Math_atan s => real (s, "Math_atan") | Real_Math_atan2 s => real (s, "Math_atan2") | Real_Math_cos s => real (s, "Math_cos") | Real_Math_exp s => real (s, "Math_exp") | Real_Math_ln s => real (s, "Math_ln") | Real_Math_log10 s => real (s, "Math_log10") | Real_Math_sin s => real (s, "Math_sin") | Real_Math_sqrt s => real (s, "Math_sqrt") | Real_Math_tan s => real (s, "Math_tan") | Real_abs s => real (s, "abs") | Real_add s => real (s, "add") | Real_castToWord (s1, s2) => cast (realC, wordC, s1, s2) | Real_div s => real (s, "div") | Real_equal s => real (s, "equal") | Real_ldexp s => real (s, "ldexp") | Real_le s => real (s, "le") | Real_lt s => real (s, "lt") | Real_mul s => real (s, "mul") | Real_muladd s => real (s, "muladd") | Real_mulsub s => real (s, "mulsub") | Real_neg s => real (s, "neg") | Real_qequal s => real (s, "qequal") | Real_rndToReal (s1, s2) => rnd (realC, realC, s1, s2) | Real_rndToWord (s1, s2, sg) => rnd (realC, wordCS sg, s1, s2) | Real_round s => real (s, "round") | Real_sub s => real (s, "sub") | Ref_assign => "Ref_assign" | Ref_deref => "Ref_deref" | Ref_ref => "Ref_ref" | String_toWord8Vector => "String_toWord8Vector" | Thread_atomicBegin => "Thread_atomicBegin" | Thread_atomicEnd => "Thread_atomicEnd" | Thread_atomicState => "Thread_atomicState" | Thread_copy => "Thread_copy" | Thread_copyCurrent => "Thread_copyCurrent" | Thread_returnToC => "Thread_returnToC" | Thread_switchTo => "Thread_switchTo" | TopLevel_getHandler => "TopLevel_getHandler" | TopLevel_getSuffix => "TopLevel_getSuffix" | TopLevel_setHandler => "TopLevel_setHandler" | TopLevel_setSuffix => "TopLevel_setSuffix" | Vector_length => "Vector_length" | Vector_sub => "Vector_sub" | Vector_vector => "Vector_vector" | Weak_canGet => "Weak_canGet" | Weak_get => "Weak_get" | Weak_new => "Weak_new" | WordArray_subWord {seqSize, eleSize} => wordSeq (seqSize, "Array", "sub", eleSize) | WordArray_updateWord {seqSize, eleSize} => wordSeq (seqSize, "Array", "update", eleSize) | WordVector_subWord {seqSize, eleSize} => wordSeq (seqSize, "Vector", "sub", eleSize) | Word8Vector_toString => "Word8Vector_toString" | WordVector_toIntInf => "WordVector_toIntInf" | Word_add s => word (s, "add") | Word_addCheckP (s, sg) => wordS (s, sg, "addCheckP") | Word_andb s => word (s, "andb") | Word_castToReal (s1, s2) => cast (wordC, realC, s1, s2) | Word_equal s => word (s, "equal") | Word_extdToWord (s1, s2, sg) => extd (wordCS sg, wordC, s1, s2) | Word_lshift s => word (s, "lshift") | Word_lt (s, sg) => wordS (s, sg, "lt") | Word_mul (s, sg) => wordS (s, sg, "mul") | Word_mulCheckP (s, sg) => wordS (s, sg, "mulCheckP") | Word_neg s => word (s, "neg") | Word_negCheckP (s, sg) => wordS (s, sg, "negCheckP") | Word_notb s => word (s, "notb") | Word_orb s => word (s, "orb") | Word_quot (s, sg) => wordS (s, sg, "quot") | Word_rem (s, sg) => wordS (s, sg, "rem") | Word_rndToReal (s1, s2, sg) => rnd (wordCS sg, realC, s1, s2) | Word_rol s => word (s, "rol") | Word_ror s => word (s, "ror") | Word_rshift (s, sg) => wordS (s, sg, "rshift") | Word_sub s => word (s, "sub") | Word_subCheckP (s, sg) => wordS (s, sg, "subCheckP") | Word_toIntInf => "Word_toIntInf" | Word_xorb s => word (s, "xorb") | World_save => "World_save" end fun layout p = Layout.str (toString p) fun layoutFull (p, layoutX) = case p of CFunction f => Layout.seq [Layout.str "CFunction ", CFunction.layout (f, layoutX)] | p => layout p val equals: 'a t * 'a t -> bool = fn (Array_alloc {raw = r}, Array_alloc {raw = r'}) => Bool.equals (r, r') | (Array_array, Array_array) => true | (Array_copyArray, Array_copyArray) => true | (Array_copyVector, Array_copyVector) => true | (Array_length, Array_length) => true | (Array_sub, Array_sub) => true | (Array_toArray, Array_toArray) => true | (Array_toVector, Array_toVector) => true | (Array_uninit, Array_uninit) => true | (Array_uninitIsNop, Array_uninitIsNop) => true | (Array_update, Array_update) => true | (CFunction f, CFunction f') => CFunction.equals (f, f') | (CPointer_add, CPointer_add) => true | (CPointer_diff, CPointer_diff) => true | (CPointer_equal, CPointer_equal) => true | (CPointer_fromWord, CPointer_fromWord) => true | (CPointer_getCPointer, CPointer_getCPointer) => true | (CPointer_getObjptr, CPointer_getObjptr) => true | (CPointer_getReal s, CPointer_getReal s') => RealSize.equals (s, s') | (CPointer_getWord s, CPointer_getWord s') => WordSize.equals (s, s') | (CPointer_lt, CPointer_lt) => true | (CPointer_setCPointer, CPointer_setCPointer) => true | (CPointer_setObjptr, CPointer_setObjptr) => true | (CPointer_setReal s, CPointer_setReal s') => RealSize.equals (s, s') | (CPointer_setWord s, CPointer_setWord s') => WordSize.equals (s, s') | (CPointer_sub, CPointer_sub) => true | (CPointer_toWord, CPointer_toWord) => true | (Exn_extra, Exn_extra) => true | (Exn_name, Exn_name) => true | (Exn_setExtendExtra, Exn_setExtendExtra) => true | (GC_collect, GC_collect) => true | (GC_state, GC_state) => true | (IntInf_add, IntInf_add) => true | (IntInf_andb, IntInf_andb) => true | (IntInf_arshift, IntInf_arshift) => true | (IntInf_compare, IntInf_compare) => true | (IntInf_gcd, IntInf_gcd) => true | (IntInf_lshift, IntInf_lshift) => true | (IntInf_mul, IntInf_mul) => true | (IntInf_neg, IntInf_neg) => true | (IntInf_notb, IntInf_notb) => true | (IntInf_orb, IntInf_orb) => true | (IntInf_quot, IntInf_quot) => true | (IntInf_rem, IntInf_rem) => true | (IntInf_sub, IntInf_sub) => true | (IntInf_toString, IntInf_toString) => true | (IntInf_toVector, IntInf_toVector) => true | (IntInf_toWord, IntInf_toWord) => true | (IntInf_xorb, IntInf_xorb) => true | (MLton_bogus, MLton_bogus) => true | (MLton_bug, MLton_bug) => true | (MLton_deserialize, MLton_deserialize) => true | (MLton_eq, MLton_eq) => true | (MLton_equal, MLton_equal) => true | (MLton_halt, MLton_halt) => true | (MLton_hash, MLton_hash) => true | (MLton_handlesSignals, MLton_handlesSignals) => true | (MLton_installSignalHandler, MLton_installSignalHandler) => true | (MLton_serialize, MLton_serialize) => true | (MLton_share, MLton_share) => true | (MLton_size, MLton_size) => true | (MLton_touch, MLton_touch) => true | (Real_Math_acos s, Real_Math_acos s') => RealSize.equals (s, s') | (Real_Math_asin s, Real_Math_asin s') => RealSize.equals (s, s') | (Real_Math_atan s, Real_Math_atan s') => RealSize.equals (s, s') | (Real_Math_atan2 s, Real_Math_atan2 s') => RealSize.equals (s, s') | (Real_Math_cos s, Real_Math_cos s') => RealSize.equals (s, s') | (Real_Math_exp s, Real_Math_exp s') => RealSize.equals (s, s') | (Real_Math_ln s, Real_Math_ln s') => RealSize.equals (s, s') | (Real_Math_log10 s, Real_Math_log10 s') => RealSize.equals (s, s') | (Real_Math_sin s, Real_Math_sin s') => RealSize.equals (s, s') | (Real_Math_sqrt s, Real_Math_sqrt s') => RealSize.equals (s, s') | (Real_Math_tan s, Real_Math_tan s') => RealSize.equals (s, s') | (Real_abs s, Real_abs s') => RealSize.equals (s, s') | (Real_add s, Real_add s') => RealSize.equals (s, s') | (Real_castToWord (s1, s2), Real_castToWord (s1', s2')) => RealSize.equals (s1, s1') andalso WordSize.equals (s2, s2') | (Real_div s, Real_div s') => RealSize.equals (s, s') | (Real_equal s, Real_equal s') => RealSize.equals (s, s') | (Real_ldexp s, Real_ldexp s') => RealSize.equals (s, s') | (Real_le s, Real_le s') => RealSize.equals (s, s') | (Real_lt s, Real_lt s') => RealSize.equals (s, s') | (Real_mul s, Real_mul s') => RealSize.equals (s, s') | (Real_muladd s, Real_muladd s') => RealSize.equals (s, s') | (Real_mulsub s, Real_mulsub s') => RealSize.equals (s, s') | (Real_neg s, Real_neg s') => RealSize.equals (s, s') | (Real_qequal s, Real_qequal s') => RealSize.equals (s, s') | (Real_rndToReal (s1, s2), Real_rndToReal (s1', s2')) => RealSize.equals (s1, s1') andalso RealSize.equals (s2, s2') | (Real_rndToWord (s1, s2, sg), Real_rndToWord (s1', s2', sg')) => RealSize.equals (s1, s1') andalso WordSize.equals (s2, s2') andalso sg = sg' | (Real_round s, Real_round s') => RealSize.equals (s, s') | (Real_sub s, Real_sub s') => RealSize.equals (s, s') | (Ref_assign, Ref_assign) => true | (Ref_deref, Ref_deref) => true | (Ref_ref, Ref_ref) => true | (String_toWord8Vector, String_toWord8Vector) => true | (Thread_atomicBegin, Thread_atomicBegin) => true | (Thread_atomicEnd, Thread_atomicEnd) => true | (Thread_atomicState, Thread_atomicState) => true | (Thread_copy, Thread_copy) => true | (Thread_copyCurrent, Thread_copyCurrent) => true | (Thread_returnToC, Thread_returnToC) => true | (Thread_switchTo, Thread_switchTo) => true | (TopLevel_getHandler, TopLevel_getHandler) => true | (TopLevel_getSuffix, TopLevel_getSuffix) => true | (TopLevel_setHandler, TopLevel_setHandler) => true | (TopLevel_setSuffix, TopLevel_setSuffix) => true | (Vector_length, Vector_length) => true | (Vector_sub, Vector_sub) => true | (Vector_vector, Vector_vector) => true | (Weak_canGet, Weak_canGet) => true | (Weak_get, Weak_get) => true | (Weak_new, Weak_new) => true | (Word_add s, Word_add s') => WordSize.equals (s, s') | (Word_addCheckP (s, sg), Word_addCheckP (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_andb s, Word_andb s') => WordSize.equals (s, s') | (Word_castToReal (s1, s2), Word_castToReal (s1', s2')) => WordSize.equals (s1, s1') andalso RealSize.equals (s2, s2') | (Word_extdToWord (s1, s2, sg), Word_extdToWord (s1', s2', sg')) => WordSize.equals (s1, s1') andalso WordSize.equals (s2, s2') andalso sg = sg' | (Word_equal s, Word_equal s') => WordSize.equals (s, s') | (Word_lshift s, Word_lshift s') => WordSize.equals (s, s') | (Word_lt (s, sg), Word_lt (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_mul (s, sg), Word_mul (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_mulCheckP (s, sg), Word_mulCheckP (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_neg s, Word_neg s') => WordSize.equals (s, s') | (Word_negCheckP (s, sg), Word_negCheckP (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_notb s, Word_notb s') => WordSize.equals (s, s') | (Word_orb s, Word_orb s') => WordSize.equals (s, s') | (Word_quot (s, sg), Word_quot (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_rem (s, sg), Word_rem (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_rndToReal (s1, s2, sg), Word_rndToReal (s1', s2', sg')) => WordSize.equals (s1, s1') andalso RealSize.equals (s2, s2') andalso sg = sg' | (Word_rol s, Word_rol s') => WordSize.equals (s, s') | (Word_ror s, Word_ror s') => WordSize.equals (s, s') | (Word_rshift (s, sg), Word_rshift (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_sub s, Word_sub s') => WordSize.equals (s, s') | (Word_subCheckP (s, sg), Word_subCheckP (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_toIntInf, Word_toIntInf) => true | (Word_xorb s, Word_xorb s') => WordSize.equals (s, s') | (WordVector_toIntInf, WordVector_toIntInf) => true | (WordArray_subWord {seqSize = seqSize, eleSize = eleSize}, WordArray_subWord {seqSize = seqSize', eleSize = eleSize'}) => WordSize.equals (seqSize, seqSize') andalso WordSize.equals (eleSize, eleSize') | (WordArray_updateWord {seqSize = seqSize, eleSize = eleSize}, WordArray_updateWord {seqSize = seqSize', eleSize = eleSize'}) => WordSize.equals (seqSize, seqSize') andalso WordSize.equals (eleSize, eleSize') | (WordVector_subWord {seqSize = seqSize, eleSize = eleSize}, WordVector_subWord {seqSize = seqSize', eleSize = eleSize'}) => WordSize.equals (seqSize, seqSize') andalso WordSize.equals (eleSize, eleSize') | (Word8Vector_toString, Word8Vector_toString) => true | (World_save, World_save) => true | _ => false val map: 'a t * ('a -> 'b) -> 'b t = fn (p, f) => case p of Array_alloc {raw} => Array_alloc {raw = raw} | Array_array => Array_array | Array_copyArray => Array_copyArray | Array_copyVector => Array_copyVector | Array_length => Array_length | Array_sub => Array_sub | Array_toArray => Array_toArray | Array_toVector => Array_toVector | Array_uninit => Array_uninit | Array_uninitIsNop => Array_uninitIsNop | Array_update => Array_update | CFunction func => CFunction (CFunction.map (func, f)) | CPointer_add => CPointer_add | CPointer_diff => CPointer_diff | CPointer_equal => CPointer_equal | CPointer_fromWord => CPointer_fromWord | CPointer_getCPointer => CPointer_getCPointer | CPointer_getObjptr => CPointer_getObjptr | CPointer_getReal z => CPointer_getReal z | CPointer_getWord z => CPointer_getWord z | CPointer_lt => CPointer_lt | CPointer_setCPointer => CPointer_setCPointer | CPointer_setObjptr => CPointer_setObjptr | CPointer_setReal z => CPointer_setReal z | CPointer_setWord z => CPointer_setWord z | CPointer_sub => CPointer_sub | CPointer_toWord => CPointer_toWord | Exn_extra => Exn_extra | Exn_name => Exn_name | Exn_setExtendExtra => Exn_setExtendExtra | GC_collect => GC_collect | GC_state => GC_state | IntInf_add => IntInf_add | IntInf_andb => IntInf_andb | IntInf_arshift => IntInf_arshift | IntInf_compare => IntInf_compare | IntInf_gcd => IntInf_gcd | IntInf_lshift => IntInf_lshift | IntInf_mul => IntInf_mul | IntInf_neg => IntInf_neg | IntInf_notb => IntInf_notb | IntInf_orb => IntInf_orb | IntInf_quot => IntInf_quot | IntInf_rem => IntInf_rem | IntInf_sub => IntInf_sub | IntInf_toString => IntInf_toString | IntInf_toVector => IntInf_toVector | IntInf_toWord => IntInf_toWord | IntInf_xorb => IntInf_xorb | MLton_bogus => MLton_bogus | MLton_bug => MLton_bug | MLton_deserialize => MLton_deserialize | MLton_eq => MLton_eq | MLton_equal => MLton_equal | MLton_halt => MLton_halt | MLton_hash => MLton_hash | MLton_handlesSignals => MLton_handlesSignals | MLton_installSignalHandler => MLton_installSignalHandler | MLton_serialize => MLton_serialize | MLton_share => MLton_share | MLton_size => MLton_size | MLton_touch => MLton_touch | Real_Math_acos z => Real_Math_acos z | Real_Math_asin z => Real_Math_asin z | Real_Math_atan z => Real_Math_atan z | Real_Math_atan2 z => Real_Math_atan2 z | Real_Math_cos z => Real_Math_cos z | Real_Math_exp z => Real_Math_exp z | Real_Math_ln z => Real_Math_ln z | Real_Math_log10 z => Real_Math_log10 z | Real_Math_sin z => Real_Math_sin z | Real_Math_sqrt z => Real_Math_sqrt z | Real_Math_tan z => Real_Math_tan z | Real_abs z => Real_abs z | Real_add z => Real_add z | Real_castToWord z => Real_castToWord z | Real_div z => Real_div z | Real_equal z => Real_equal z | Real_ldexp z => Real_ldexp z | Real_le z => Real_le z | Real_lt z => Real_lt z | Real_mul z => Real_mul z | Real_muladd z => Real_muladd z | Real_mulsub z => Real_mulsub z | Real_neg z => Real_neg z | Real_qequal z => Real_qequal z | Real_rndToReal z => Real_rndToReal z | Real_rndToWord z => Real_rndToWord z | Real_round z => Real_round z | Real_sub z => Real_sub z | Ref_assign => Ref_assign | Ref_deref => Ref_deref | Ref_ref => Ref_ref | String_toWord8Vector => String_toWord8Vector | Thread_atomicBegin => Thread_atomicBegin | Thread_atomicEnd => Thread_atomicEnd | Thread_atomicState => Thread_atomicState | Thread_copy => Thread_copy | Thread_copyCurrent => Thread_copyCurrent | Thread_returnToC => Thread_returnToC | Thread_switchTo => Thread_switchTo | TopLevel_getHandler => TopLevel_getHandler | TopLevel_getSuffix => TopLevel_getSuffix | TopLevel_setHandler => TopLevel_setHandler | TopLevel_setSuffix => TopLevel_setSuffix | Vector_length => Vector_length | Vector_sub => Vector_sub | Vector_vector => Vector_vector | Weak_canGet => Weak_canGet | Weak_get => Weak_get | Weak_new => Weak_new | Word_add z => Word_add z | Word_addCheckP z => Word_addCheckP z | Word_andb z => Word_andb z | Word_castToReal z => Word_castToReal z | Word_equal z => Word_equal z | Word_extdToWord z => Word_extdToWord z | Word_lshift z => Word_lshift z | Word_lt z => Word_lt z | Word_mul z => Word_mul z | Word_mulCheckP z => Word_mulCheckP z | Word_neg z => Word_neg z | Word_negCheckP z => Word_negCheckP z | Word_notb z => Word_notb z | Word_orb z => Word_orb z | Word_quot z => Word_quot z | Word_rem z => Word_rem z | Word_rndToReal z => Word_rndToReal z | Word_rol z => Word_rol z | Word_ror z => Word_ror z | Word_rshift z => Word_rshift z | Word_sub z => Word_sub z | Word_subCheckP z => Word_subCheckP z | Word_toIntInf => Word_toIntInf | Word_xorb z => Word_xorb z | WordVector_toIntInf => WordVector_toIntInf | WordArray_subWord z => WordArray_subWord z | WordArray_updateWord z => WordArray_updateWord z | WordVector_subWord z => WordVector_subWord z | Word8Vector_toString => Word8Vector_toString | World_save => World_save val cast: 'a t -> 'b t = fn p => map (p, fn _ => Error.bug "Prim.cast") fun cpointerGet ctype = let datatype z = datatype CType.t in case ctype of CPointer => CPointer_getCPointer | Int8 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 8)) | Int16 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 16)) | Int32 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 32)) | Int64 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 64)) | Objptr => CPointer_getObjptr | Real32 => CPointer_getReal RealSize.R32 | Real64 => CPointer_getReal RealSize.R64 | Word8 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 8)) | Word16 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 16)) | Word32 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 32)) | Word64 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 64)) end fun cpointerSet ctype = let datatype z = datatype CType.t in case ctype of CPointer => CPointer_setCPointer | Int8 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 8)) | Int16 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 16)) | Int32 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 32)) | Int64 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 64)) | Objptr => CPointer_setObjptr | Real32 => CPointer_setReal RealSize.R32 | Real64 => CPointer_setReal RealSize.R64 | Word8 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 8)) | Word16 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 16)) | Word32 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 32)) | Word64 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 64)) end val isCommutative = fn MLton_eq => true | MLton_equal => true | Real_add _ => true | Real_mul _ => true | Real_equal _ => true | Real_qequal _ => true | Word_add _ => true | Word_addCheckP _ => true | Word_andb _ => true | Word_equal _ => true | Word_mul _ => true | Word_mulCheckP _ => true | Word_orb _ => true | Word_xorb _ => true | _ => false val kind: 'a t -> Kind.t = fn p => let datatype z = datatype Kind.t in case p of Array_alloc _ => Moveable | Array_array => Moveable | Array_copyArray => SideEffect | Array_copyVector => SideEffect | Array_length => Functional | Array_sub => DependsOnState | Array_toArray => DependsOnState | Array_toVector => DependsOnState | Array_uninit => SideEffect | Array_uninitIsNop => Functional | Array_update => SideEffect | CFunction (CFunction.T {kind, ...}) => (case kind of CFunction.Kind.Impure => SideEffect | CFunction.Kind.Pure => Functional | CFunction.Kind.Runtime _ => SideEffect) | CPointer_add => Functional | CPointer_diff => Functional | CPointer_equal => Functional | CPointer_fromWord => Functional | CPointer_getCPointer => DependsOnState | CPointer_getObjptr => DependsOnState | CPointer_getReal _ => DependsOnState | CPointer_getWord _ => DependsOnState | CPointer_lt => Functional | CPointer_setCPointer => SideEffect | CPointer_setObjptr => SideEffect | CPointer_setReal _ => SideEffect | CPointer_setWord _ => SideEffect | CPointer_sub => Functional | CPointer_toWord => Functional | Exn_extra => Functional | Exn_name => Functional | Exn_setExtendExtra => SideEffect | GC_collect => SideEffect | GC_state => DependsOnState | IntInf_add => Functional | IntInf_andb => Functional | IntInf_arshift => Functional | IntInf_compare => Functional | IntInf_gcd => Functional | IntInf_lshift => Functional | IntInf_mul => Functional | IntInf_neg => Functional | IntInf_notb => Functional | IntInf_orb => Functional | IntInf_quot => Functional | IntInf_rem => Functional | IntInf_sub => Functional | IntInf_toString => Functional | IntInf_toVector => Functional | IntInf_toWord => Functional | IntInf_xorb => Functional | MLton_bogus => Functional | MLton_bug => SideEffect | MLton_deserialize => Moveable | MLton_eq => Functional | MLton_equal => Functional | MLton_halt => SideEffect | MLton_hash => Functional | MLton_handlesSignals => Functional | MLton_installSignalHandler => SideEffect | MLton_serialize => DependsOnState | MLton_share => SideEffect | MLton_size => DependsOnState | MLton_touch => SideEffect | Real_Math_acos _ => DependsOnState (* depends on rounding mode *) | Real_Math_asin _ => DependsOnState (* depends on rounding mode *) | Real_Math_atan _ => DependsOnState (* depends on rounding mode *) | Real_Math_atan2 _ => DependsOnState (* depends on rounding mode *) | Real_Math_cos _ => DependsOnState (* depends on rounding mode *) | Real_Math_exp _ => DependsOnState (* depends on rounding mode *) | Real_Math_ln _ => DependsOnState (* depends on rounding mode *) | Real_Math_log10 _ => DependsOnState (* depends on rounding mode *) | Real_Math_sin _ => DependsOnState (* depends on rounding mode *) | Real_Math_sqrt _ => DependsOnState (* depends on rounding mode *) | Real_Math_tan _ => DependsOnState (* depends on rounding mode *) | Real_abs _ => Functional | Real_add _ => DependsOnState (* depends on rounding mode *) | Real_castToWord _ => Functional | Real_div _ => DependsOnState (* depends on rounding mode *) | Real_equal _ => Functional | Real_ldexp _ => DependsOnState (* depends on rounding mode *) | Real_le _ => Functional | Real_lt _ => Functional | Real_mul _ => DependsOnState (* depends on rounding mode *) | Real_muladd _ => DependsOnState (* depends on rounding mode *) | Real_mulsub _ => DependsOnState (* depends on rounding mode *) | Real_neg _ => Functional | Real_qequal _ => Functional | Real_rndToReal _ => DependsOnState (* depends on rounding mode *) | Real_rndToWord _ => Functional | Real_round _ => DependsOnState (* depends on rounding mode *) | Real_sub _ => DependsOnState (* depends on rounding mode *) | Ref_assign => SideEffect | Ref_deref => DependsOnState | Ref_ref => Moveable | String_toWord8Vector => Functional | Thread_atomicBegin => SideEffect | Thread_atomicEnd => SideEffect | Thread_atomicState => DependsOnState | Thread_copy => Moveable | Thread_copyCurrent => SideEffect | Thread_returnToC => SideEffect | Thread_switchTo => SideEffect | TopLevel_getHandler => DependsOnState | TopLevel_getSuffix => DependsOnState | TopLevel_setHandler => SideEffect | TopLevel_setSuffix => SideEffect | Vector_length => Functional | Vector_sub => Functional | Vector_vector => Functional | Weak_canGet => DependsOnState | Weak_get => DependsOnState | Weak_new => Moveable | WordArray_subWord _ => DependsOnState | WordArray_updateWord _ => SideEffect | WordVector_subWord _ => Functional | Word8Vector_toString => Functional | WordVector_toIntInf => Functional | Word_add _ => Functional | Word_addCheckP _ => Functional | Word_andb _ => Functional | Word_castToReal _ => Functional | Word_equal _ => Functional | Word_extdToWord _ => Functional | Word_lshift _ => Functional | Word_lt _ => Functional | Word_mul _ => Functional | Word_mulCheckP _ => Functional | Word_neg _ => Functional | Word_negCheckP _ => Functional | Word_notb _ => Functional | Word_orb _ => Functional | Word_quot _ => Functional | Word_rem _ => Functional | Word_rndToReal _ => DependsOnState (* depends on rounding mode *) | Word_rol _ => Functional | Word_ror _ => Functional | Word_rshift _ => Functional | Word_sub _ => Functional | Word_subCheckP _ => Functional | Word_toIntInf => Functional | Word_xorb _ => Functional | World_save => SideEffect end fun isFunctional p = Kind.Functional = kind p fun maySideEffect p = Kind.SideEffect = kind p local fun reals (s: RealSize.t) = [(Real_Math_acos s), (Real_Math_asin s), (Real_Math_atan s), (Real_Math_atan2 s), (Real_Math_cos s), (Real_Math_exp s), (Real_Math_ln s), (Real_Math_log10 s), (Real_Math_sin s), (Real_Math_sqrt s), (Real_Math_tan s), (Real_abs s), (Real_add s), (Real_div s), (Real_equal s), (Real_ldexp s), (Real_le s), (Real_lt s), (Real_mul s), (Real_muladd s), (Real_mulsub s), (Real_neg s), (Real_qequal s), (Real_round s), (Real_sub s)] fun wordSigns (s: WordSize.t, signed: bool) = let val sg = {signed = signed} in List.map ([Word_addCheckP, Word_lt, Word_mul, Word_mulCheckP, Word_negCheckP, Word_quot, Word_rem, Word_rshift, Word_subCheckP], fn p => p (s, sg)) end fun words (s: WordSize.t) = [(Word_add s), (Word_andb s), (Word_equal s), (Word_lshift s), (Word_neg s), (Word_notb s), (Word_orb s), (Word_rol s), (Word_ror s), (Word_sub s), (Word_xorb s)] @ wordSigns (s, true) @ wordSigns (s, false) in val all: unit t list = [Array_alloc {raw = false}, Array_alloc {raw = true}, Array_array, Array_copyArray, Array_copyVector, Array_length, Array_sub, Array_toArray, Array_toVector, Array_uninit, Array_uninitIsNop, Array_update, CPointer_add, CPointer_diff, CPointer_equal, CPointer_fromWord, CPointer_getCPointer, CPointer_getObjptr, CPointer_lt, CPointer_setCPointer, CPointer_setObjptr, CPointer_sub, CPointer_toWord, Exn_extra, Exn_name, Exn_setExtendExtra, GC_collect, GC_state, IntInf_add, IntInf_andb, IntInf_arshift, IntInf_compare, IntInf_gcd, IntInf_lshift, IntInf_mul, IntInf_notb, IntInf_neg, IntInf_orb, IntInf_quot, IntInf_rem, IntInf_sub, IntInf_toString, IntInf_toVector, IntInf_toWord, IntInf_xorb, MLton_bogus, MLton_bug, MLton_deserialize, MLton_eq, MLton_equal, MLton_halt, MLton_hash, MLton_handlesSignals, MLton_installSignalHandler, MLton_serialize, MLton_share, MLton_size, MLton_touch, Ref_assign, Ref_deref, Ref_ref, String_toWord8Vector, Thread_atomicBegin, Thread_atomicEnd, Thread_atomicState, Thread_copy, Thread_copyCurrent, Thread_returnToC, Thread_switchTo, TopLevel_getHandler, TopLevel_getSuffix, TopLevel_setHandler, TopLevel_setSuffix, Vector_length, Vector_sub, Vector_vector, Weak_canGet, Weak_get, Weak_new, Word_toIntInf, WordVector_toIntInf, Word8Vector_toString, World_save] @ List.concat [List.concatMap (RealSize.all, reals), List.concatMap (WordSize.prims, words)] @ let val real = RealSize.all val word = WordSize.prims val wordNonPrim = List.keepAll (WordSize.all, fn s => not (List.contains (word, s, WordSize.equals))) fun coerces (name, sizes, sizes', ac) = List.fold (sizes, ac, fn (s, ac) => List.fold (sizes', ac, fn (s', ac) => name (s, s') :: ac)) fun coercesS (name, sizes, sizes', ac) = List.fold ([false, true], ac, fn (signed, ac) => coerces (fn (s, s') => name (s, s', {signed = signed}), sizes, sizes', ac)) fun casts (name, sizes, ac) = List.fold (sizes, ac, fn (s, ac) => name s :: ac) fun castsS (name, sizes, ac) = List.fold ([false, true], ac, fn (signed, ac) => casts (fn s => name (s, {signed = signed}), sizes, ac)) in casts (fn rs => Real_castToWord (rs, WordSize.fromBits (RealSize.bits rs)), real, coerces (Real_rndToReal, real, real, coercesS (Real_rndToWord, real, word, casts (fn rs => Word_castToReal (WordSize.fromBits (RealSize.bits rs), rs), real, coercesS (Word_extdToWord, word, word, castsS (fn (s, signed) => Word_extdToWord (s, WordSize.roundUpToPrim s, signed), wordNonPrim, castsS (fn (s, signed) => Word_extdToWord (WordSize.roundUpToPrim s, s, signed), wordNonPrim, coercesS (Word_rndToReal, word, real, [])))))))) end @ List.concatMap (WordSize.prims, fn seqSize => List.concatMap (WordSize.prims, fn eleSize => List.map ([WordArray_subWord, WordArray_updateWord, WordVector_subWord], fn p => p {seqSize = seqSize, eleSize = eleSize}))) @ let fun doit (all, get, set) = List.concatMap (all, fn s => [get s, set s]) in List.concat [doit (RealSize.all, CPointer_getReal, CPointer_setReal), doit (WordSize.prims, CPointer_getWord, CPointer_setWord)] end end local val table : (string, unit t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} val () = List.foreach (all, fn prim => let val string = toString prim in (ignore o HashTable.lookupOrInsert) (table, string, fn () => prim) end) in val fromString: string -> 'a t option = fn name => Option.map (HashTable.peek (table, name), cast) end local open Parse infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> val name = spaces *> (fn (c, cs) => String.implode (c::cs)) <$$> (nextSat (fn c => Char.isAlpha c orelse c = #"_"), many (nextSat (fn c => Char.isAlphaNum c orelse c = #"_"))) in fun parse () = fromString <$?> (spaces *> name) fun parseFull parseX = name >>= (fn pname => case pname of "CFunction" => CFunction <$> CFunction.parse parseX | _ => (case fromString pname of NONE => fail "prim" | SOME p => pure p)) end fun 'a checkApp (prim: 'a t, {args: 'a vector, result: 'a, targs: 'a vector, typeOps = {array: 'a -> 'a, arrow: 'a * 'a -> 'a, bool: 'a, cpointer: 'a, equals: 'a * 'a -> bool, exn: 'a, intInf: 'a, real: RealSize.t -> 'a, reff: 'a -> 'a, thread: 'a, unit: 'a, vector: 'a -> 'a, weak: 'a -> 'a, word: WordSize.t -> 'a}}): bool = let fun arg i = Vector.sub (args, i) fun noArgs () = 0 = Vector.length args fun oneArg arg0' () = 1 = Vector.length args andalso equals (arg0', arg 0) fun twoArgs (arg0', arg1') () = 2 = Vector.length args andalso equals (arg0', arg 0) andalso equals (arg1', arg 1) fun threeArgs (arg0', arg1', arg2') () = 3 = Vector.length args andalso equals (arg0', arg 0) andalso equals (arg1', arg 1) andalso equals (arg2', arg 2) fun fiveArgs (arg0', arg1', arg2', arg3', arg4') () = 5 = Vector.length args andalso equals (arg0', arg 0) andalso equals (arg1', arg 1) andalso equals (arg2', arg 2) andalso equals (arg3', arg 3) andalso equals (arg4', arg 4) fun nArgs args' () = Vector.equals (args', args, equals) fun done (args, result') = args () andalso equals (result', result) fun targ i = Vector.sub (targs, i) fun noTargs f = 0 = Vector.length targs andalso done (f ()) fun oneTarg f = 1 = Vector.length targs andalso done (f (targ 0)) local fun make f s = let val t = f s in noTargs (fn () => (oneArg t, t)) end in val realUnary = make real val wordUnary = make word end local fun make f s = let val t = f s in noTargs (fn () => (oneArg t, bool)) end in val wordUnaryP = make word end local fun make f s = let val t = f s in noTargs (fn () => (twoArgs (t, t), t)) end in val realBinary = make real val wordBinary = make word end local fun make f s = let val t = f s in noTargs (fn () => (twoArgs (t, t), bool)) end in val realCompare = make real val wordCompare = make word val wordBinaryP = make word end val cint = word (WordSize.cint ()) val compareRes = word WordSize.compareRes val csize = word (WordSize.csize ()) val cptrdiff = word (WordSize.cptrdiff ()) val seqIndex = word (WordSize.seqIndex ()) val shiftArg = word WordSize.shiftArg val bigIntInfWord = word (WordSize.bigIntInfWord ()) val smallIntInfWord = word (WordSize.smallIntInfWord ()) val word8 = word WordSize.word8 val word32 = word WordSize.word32 fun intInfBinary () = noTargs (fn () => (threeArgs (intInf, intInf, csize), intInf)) fun intInfShift () = noTargs (fn () => (threeArgs (intInf, shiftArg, csize), intInf)) fun intInfUnary () = noTargs (fn () => (twoArgs (intInf, csize), intInf)) fun realTernary s = noTargs (fn () => (threeArgs (real s, real s, real s), real s)) fun wordArray seqSize = array (word seqSize) fun wordShift s = noTargs (fn () => (twoArgs (word s, shiftArg), word s)) val word8Vector = vector word8 fun wordVector seqSize = vector (word seqSize) val string = word8Vector in case prim of Array_alloc _ => oneTarg (fn targ => (oneArg seqIndex, array targ)) | Array_array => oneTarg (fn targ => (nArgs (Vector.map (args, fn _ => targ)), array targ)) | Array_copyArray => oneTarg (fn t => (fiveArgs (array t, seqIndex, array t, seqIndex, seqIndex), unit)) | Array_copyVector => oneTarg (fn t => (fiveArgs (array t, seqIndex, vector t, seqIndex, seqIndex), unit)) | Array_length => oneTarg (fn t => (oneArg (array t), seqIndex)) | Array_sub => oneTarg (fn t => (twoArgs (array t, seqIndex), t)) | Array_toArray => oneTarg (fn t => (oneArg (array t), array t)) | Array_toVector => oneTarg (fn t => (oneArg (array t), vector t)) | Array_uninit => oneTarg (fn t => (twoArgs (array t, seqIndex), unit)) | Array_uninitIsNop => oneTarg (fn t => (oneArg (array t), bool)) | Array_update => oneTarg (fn t => (threeArgs (array t, seqIndex, t), unit)) | CFunction f => noTargs (fn () => (nArgs (CFunction.args f), CFunction.return f)) | CPointer_add => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_diff => noTargs (fn () => (twoArgs (cpointer, cpointer), cptrdiff)) | CPointer_equal => noTargs (fn () => (twoArgs (cpointer, cpointer), bool)) | CPointer_fromWord => noTargs (fn () => (oneArg (csize), cpointer)) | CPointer_getCPointer => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_getObjptr => oneTarg (fn t => (twoArgs (cpointer, cptrdiff), t)) | CPointer_getReal s => noTargs (fn () => (twoArgs (cpointer, cptrdiff), real s)) | CPointer_getWord s => noTargs (fn () => (twoArgs (cpointer, cptrdiff), word s)) | CPointer_lt => noTargs (fn () => (twoArgs (cpointer, cpointer), bool)) | CPointer_setCPointer => noTargs (fn () => (threeArgs (cpointer, cptrdiff, cpointer), unit)) | CPointer_setObjptr => oneTarg (fn t => (threeArgs (cpointer, cptrdiff, t), unit)) | CPointer_setReal s => noTargs (fn () => (threeArgs (cpointer, cptrdiff, real s), unit)) | CPointer_setWord s => noTargs (fn () => (threeArgs (cpointer, cptrdiff, word s), unit)) | CPointer_sub => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_toWord => noTargs (fn () => (oneArg cpointer, csize)) | Exn_extra => oneTarg (fn t => (oneArg exn, t)) | Exn_name => noTargs (fn () => (oneArg exn, string)) | Exn_setExtendExtra => oneTarg (fn t => (oneArg (arrow (t, t)), unit)) | GC_collect => noTargs (fn () => (noArgs, unit)) | GC_state => noTargs (fn () => (noArgs, cpointer)) | IntInf_add => intInfBinary () | IntInf_andb => intInfBinary () | IntInf_arshift => intInfShift () | IntInf_compare => noTargs (fn () => (twoArgs (intInf, intInf), compareRes)) | IntInf_gcd => intInfBinary () | IntInf_lshift => intInfShift () | IntInf_mul => intInfBinary () | IntInf_neg => intInfUnary () | IntInf_notb => intInfUnary () | IntInf_orb => intInfBinary () | IntInf_quot => intInfBinary () | IntInf_rem => intInfBinary () | IntInf_sub => intInfBinary () | IntInf_toString => noTargs (fn () => (threeArgs (intInf, word32, csize), string)) | IntInf_toVector => noTargs (fn () => (oneArg intInf, vector bigIntInfWord)) | IntInf_toWord => noTargs (fn () => (oneArg intInf, smallIntInfWord)) | IntInf_xorb => intInfBinary () | MLton_bogus => oneTarg (fn t => (noArgs, t)) | MLton_bug => noTargs (fn () => (oneArg string, unit)) | MLton_deserialize => oneTarg (fn t => (oneArg word8Vector, t)) | MLton_eq => oneTarg (fn t => (twoArgs (t, t), bool)) | MLton_equal => oneTarg (fn t => (twoArgs (t, t), bool)) | MLton_halt => noTargs (fn () => (oneArg cint, unit)) | MLton_hash => oneTarg (fn t => (oneArg t, word32)) | MLton_handlesSignals => noTargs (fn () => (noArgs, bool)) | MLton_installSignalHandler => noTargs (fn () => (noArgs, unit)) | MLton_serialize => oneTarg (fn t => (oneArg t, word8Vector)) | MLton_share => oneTarg (fn t => (oneArg t, unit)) | MLton_size => oneTarg (fn t => (oneArg t, csize)) | MLton_touch => oneTarg (fn t => (oneArg t, unit)) | Real_Math_acos s => realUnary s | Real_Math_asin s => realUnary s | Real_Math_atan s => realUnary s | Real_Math_atan2 s => realBinary s | Real_Math_cos s => realUnary s | Real_Math_exp s => realUnary s | Real_Math_ln s => realUnary s | Real_Math_log10 s => realUnary s | Real_Math_sin s => realUnary s | Real_Math_sqrt s => realUnary s | Real_Math_tan s => realUnary s | Real_abs s => realUnary s | Real_add s => realBinary s | Real_castToWord (s, s') => noTargs (fn () => (oneArg (real s), word s')) | Real_div s => realBinary s | Real_equal s => realCompare s | Real_ldexp s => noTargs (fn () => (twoArgs (real s, cint), real s)) | Real_le s => realCompare s | Real_lt s => realCompare s | Real_mul s => realBinary s | Real_muladd s => realTernary s | Real_mulsub s => realTernary s | Real_neg s => realUnary s | Real_qequal s => realCompare s | Real_rndToReal (s, s') => noTargs (fn () => (oneArg (real s), real s')) | Real_rndToWord (s, s', _) => noTargs (fn () => (oneArg (real s), word s')) | Real_round s => realUnary s | Real_sub s => realBinary s | Ref_assign => oneTarg (fn t => (twoArgs (reff t, t), unit)) | Ref_deref => oneTarg (fn t => (oneArg (reff t), t)) | Ref_ref => oneTarg (fn t => (oneArg t, reff t)) | Thread_atomicBegin => noTargs (fn () => (noArgs, unit)) | Thread_atomicEnd => noTargs (fn () => (noArgs, unit)) | Thread_atomicState => noTargs (fn () => (noArgs, word32)) | Thread_copy => noTargs (fn () => (oneArg thread, thread)) | Thread_copyCurrent => noTargs (fn () => (noArgs, unit)) | Thread_returnToC => noTargs (fn () => (noArgs, unit)) | Thread_switchTo => noTargs (fn () => (oneArg thread, unit)) | TopLevel_getHandler => noTargs (fn () => (noArgs, arrow (exn, unit))) | TopLevel_getSuffix => noTargs (fn () => (noArgs, arrow (unit, unit))) | TopLevel_setHandler => noTargs (fn () => (oneArg (arrow (exn, unit)), unit)) | TopLevel_setSuffix => noTargs (fn () => (oneArg (arrow (unit, unit)), unit)) | String_toWord8Vector => noTargs (fn () => (oneArg string, word8Vector)) | Vector_length => oneTarg (fn t => (oneArg (vector t), seqIndex)) | Vector_sub => oneTarg (fn t => (twoArgs (vector t, seqIndex), t)) | Vector_vector => oneTarg (fn targ => (nArgs (Vector.map (args, fn _ => targ)), vector targ)) | Weak_canGet => oneTarg (fn t => (oneArg (weak t), bool)) | Weak_get => oneTarg (fn t => (oneArg (weak t), t)) | Weak_new => oneTarg (fn t => (oneArg t, weak t)) | WordArray_subWord {seqSize, eleSize} => noTargs (fn () => (twoArgs (wordArray seqSize, seqIndex), word eleSize)) | WordArray_updateWord {seqSize, eleSize} => noTargs (fn () => (threeArgs (wordArray seqSize, seqIndex, word eleSize), unit)) | WordVector_subWord {seqSize, eleSize} => noTargs (fn () => (twoArgs (wordVector seqSize, seqIndex), word eleSize)) | Word8Vector_toString => noTargs (fn () => (oneArg (word8Vector), string)) | WordVector_toIntInf => noTargs (fn () => (oneArg (vector bigIntInfWord), intInf)) | Word_add s => wordBinary s | Word_addCheckP (s, _) => wordBinaryP s | Word_andb s => wordBinary s | Word_castToReal (s, s') => noTargs (fn () => (oneArg (word s), real s')) | Word_equal s => wordCompare s | Word_extdToWord (s, s', _) => noTargs (fn () => (oneArg (word s), word s')) | Word_lshift s => wordShift s | Word_lt (s, _) => wordCompare s | Word_mul (s, _) => wordBinary s | Word_mulCheckP (s, _) => wordBinaryP s | Word_neg s => wordUnary s | Word_negCheckP (s, _) => wordUnaryP s | Word_notb s => wordUnary s | Word_orb s => wordBinary s | Word_quot (s, _) => wordBinary s | Word_rem (s, _) => wordBinary s | Word_rndToReal (s, s', _) => noTargs (fn () => (oneArg (word s), real s')) | Word_rol s => wordShift s | Word_ror s => wordShift s | Word_rshift (s, _) => wordShift s | Word_sub s => wordBinary s | Word_subCheckP (s, _) => wordBinaryP s | Word_toIntInf => noTargs (fn () => (oneArg smallIntInfWord, intInf)) | Word_xorb s => wordBinary s | World_save => noTargs (fn () => (oneArg string, unit)) end val checkApp = fn z => Trace.trace ("Prim.check", layout o #1, Layout.ignore) checkApp z fun ('a, 'b) extractTargs (prim: 'b t, {args: 'a vector, result: 'a, typeOps = {deArray: 'a -> 'a, deArrow: 'a -> 'a * 'a, deRef: 'a -> 'a, deVector: 'a -> 'a, deWeak: 'a -> 'a}}) = let val one = Vector.new1 fun arg i = Vector.sub (args, i) datatype z = datatype t in case prim of Array_alloc _ => one (deArray result) | Array_array => one (deArray result) | Array_copyArray => one (deArray (arg 0)) | Array_copyVector => one (deArray (arg 0)) | Array_length => one (deArray (arg 0)) | Array_sub => one (deArray (arg 0)) | Array_toArray => one (deArray (arg 0)) | Array_toVector => one (deArray (arg 0)) | Array_uninit => one (deArray (arg 0)) | Array_uninitIsNop => one (deArray (arg 0)) | Array_update => one (deArray (arg 0)) | CPointer_getObjptr => one result | CPointer_setObjptr => one (arg 2) | Exn_extra => one result | Exn_setExtendExtra => one (#2 (deArrow (arg 0))) | MLton_bogus => one result | MLton_deserialize => one result | MLton_eq => one (arg 0) | MLton_equal => one (arg 0) | MLton_hash => one (arg 0) | MLton_serialize => one (arg 0) | MLton_share => one (arg 0) | MLton_size => one (arg 0) | MLton_touch => one (arg 0) | Ref_assign => one (deRef (arg 0)) | Ref_deref => one (deRef (arg 0)) | Ref_ref => one (deRef result) | Vector_length => one (deVector (arg 0)) | Vector_sub => one (deVector (arg 0)) | Vector_vector => one (deVector result) | Weak_canGet => one (deWeak (arg 0)) | Weak_get => one result | Weak_new => one (arg 0) | _ => Vector.new0 () end val extractTargs = fn z => Trace.trace ("Prim.extractTargs", layout o #1, Layout.ignore) extractTargs z structure IntInfRep = Const.IntInfRep structure ApplyArg = struct datatype 'a t = Con of {con: Con.t, hasArg: bool} | Const of Const.t | Var of 'a fun layout layoutX = fn Con {con, hasArg} => Layout.record [("con", Con.layout con), ("hasArg", Bool.layout hasArg)] | Const c => Const.layout c | Var x => layoutX x end structure ApplyResult = struct type 'a prim = 'a t val layoutPrim = layout datatype ('a, 'b) t = Apply of 'a prim * 'b list | Bool of bool | Const of Const.t | Unknown | Var of 'b fun layout layoutX ar = let open Layout in case ar of Apply (p, args) => seq [layoutPrim p, List.layout layoutX args] | Bool b => Bool.layout b | Const c => Const.layout c | Unknown => str "Unknown" | Var x => layoutX x end end (* * In addition to constant folding, here are the algebraic identities currently * handled. * * x * 1 = 1 * x = x * x * ~1 = ~1 * x = ~x * x * 0 = 0 * x = 0 * x + 0 = 0 + x = x * x mod x = x rem x = 0 * x mod 1 = x rem 1 = x mod ~1 = x rem ~1 = 0 * x div x = x quot x = 1 * x div 1 = x quot 1 = x * andb (x, x) = orb (x, x) = x * xorb (x, x) = 0 * x - 0 = x * 0 - x = ~x * x - x = 0 * x > x = x < x = false * x >= x = x <= x = true * x = x --> true * * Also, simple equality tests on constructors are handled. * A = A --> true * A = B --> false * A x = B y --> false *) fun ('a, 'b) apply (p: 'a t, args: 'b ApplyArg.t list, varEquals: 'b * 'b -> bool): ('a, 'b) ApplyResult.t = let datatype z = datatype t datatype z = datatype Const.t val bool = ApplyResult.Bool val boolOpt = fn NONE => ApplyResult.Unknown | SOME b => bool b val f = bool false val t = bool true fun seqIndexConst i = ApplyResult.Const (Const.word (WordX.fromIntInf (i, WordSize.seqIndex ()))) local val maxIntInf = IntInf.<< (1, 0w128) val minIntInf = IntInf.~ maxIntInf in fun intInfTooBig ii = IntInf.< (ii, minIntInf) orelse IntInf.> (ii, maxIntInf) end val intInfTooBig = Trace.trace ("Prim.intInfTooBig", IntInf.layout, Bool.layout) intInfTooBig fun intInf (ii: IntInf.t): ('a, 'b) ApplyResult.t = if intInfTooBig ii then ApplyResult.Unknown else ApplyResult.Const (Const.intInf ii) val intInfConst = intInf o IntInf.fromInt val null = ApplyResult.Const Const.null fun real (r: RealX.t): ('a, 'b) ApplyResult.t = ApplyResult.Const (Const.real r) val realOpt = fn NONE => ApplyResult.Unknown | SOME r => real r fun realNeg (s, x): ('a, 'b) ApplyResult.t = ApplyResult.Apply (Real_neg s, [x]) fun realAdd (s, x, y): ('a, 'b) ApplyResult.t = ApplyResult.Apply (Real_add s, [x, y]) fun word (w: WordX.t): ('a, 'b) ApplyResult.t = ApplyResult.Const (Const.word w) val wordOpt = fn NONE => ApplyResult.Unknown | SOME w => word w fun wordVector (v: WordXVector.t): ('a, 'b) ApplyResult.t = ApplyResult.Const (Const.wordVector v) fun wordChk (s, w, sg) = bool (not (WordSize.isInRange (s, w, sg))) val eq = fn (Word w1, Word w2) => bool (WordX.equals (w1, w2)) | _ => ApplyResult.Unknown val equal = fn (IntInf ii1, IntInf ii2) => bool (IntInf.equals (ii1, ii2)) | (Word w1, Word w2) => bool (WordX.equals (w1, w2)) | (WordVector v1, WordVector v2) => bool (WordXVector.equals (v1, v2)) | _ => ApplyResult.Unknown fun intInfBinary (i1, i2) = if intInfTooBig i1 orelse intInfTooBig i2 then ApplyResult.Unknown else case p of IntInf_add => intInf (IntInf.+ (i1, i2)) | IntInf_andb => intInf (IntInf.andb (i1, i2)) | IntInf_gcd => intInf (IntInf.gcd (i1, i2)) | IntInf_mul => intInf (IntInf.* (i1, i2)) | IntInf_orb => intInf (IntInf.orb (i1, i2)) | IntInf_quot => intInf (IntInf.quot (i1, i2)) | IntInf_rem => intInf (IntInf.rem (i1, i2)) | IntInf_sub => intInf (IntInf.- (i1, i2)) | IntInf_xorb => intInf (IntInf.xorb (i1, i2)) | _ => ApplyResult.Unknown fun intInfUnary (i1) = if intInfTooBig i1 then ApplyResult.Unknown else case p of IntInf_neg => intInf (IntInf.~ i1) | IntInf_notb => intInf (IntInf.notb i1) | _ => ApplyResult.Unknown fun intInfShiftOrToString (i1, w2) = if intInfTooBig i1 then ApplyResult.Unknown else case p of IntInf_arshift => intInf (IntInf.~>> (i1, Word.fromIntInf (WordX.toIntInf w2))) | IntInf_lshift => let val maxShift = WordX.fromIntInf (128, WordSize.shiftArg) in if WordX.lt (w2, maxShift, {signed = false}) then intInf (IntInf.<< (i1, Word.fromIntInf (WordX.toIntInf w2))) else ApplyResult.Unknown end | IntInf_toString => let val base = case WordX.toInt w2 of 2 => StringCvt.BIN | 8 => StringCvt.OCT | 10 => StringCvt.DEC | 16 => StringCvt.HEX | _ => Error.bug "Prim.apply: strange base for IntInf_toString" in ApplyResult.Const (Const.string (IntInf.format (i1, base))) end | _ => ApplyResult.Unknown fun allConsts (cs: Const.t list) = (case (p, cs) of (MLton_eq, [c1, c2]) => eq (c1, c2) | (MLton_equal, [c1, c2]) => equal (c1, c2) | (CPointer_equal, [Null, Null]) => bool true | (CPointer_fromWord, [Word w]) => if WordX.isZero w then null else ApplyResult.Unknown | (CPointer_toWord, [Null]) => word (WordX.zero (WordSize.cpointer ())) | (IntInf_compare, [IntInf i1, IntInf i2]) => let val i = case IntInf.compare (i1, i2) of Relation.LESS => ~1 | Relation.EQUAL => 0 | Relation.GREATER => 1 in word (WordX.fromIntInf (i, WordSize.compareRes)) end | (IntInf_toWord, [IntInf i]) => (case IntInfRep.fromIntInf i of IntInfRep.Big _ => ApplyResult.Unknown | IntInfRep.Small w => word w) | (IntInf_toVector, [IntInf i]) => (case IntInfRep.fromIntInf i of IntInfRep.Big v => wordVector v | IntInfRep.Small _ => ApplyResult.Unknown) | (_, [IntInf i1, IntInf i2, _]) => intInfBinary (i1, i2) | (_, [IntInf i1, Word w2, _]) => intInfShiftOrToString (i1, w2) | (_, [IntInf i1, _]) => intInfUnary (i1) | (Vector_length, [WordVector v]) => seqIndexConst (IntInf.fromInt (WordXVector.length v)) | (Vector_sub, [WordVector v, Word i]) => word (WordXVector.sub (v, WordX.toInt i)) | (Real_neg _, [Real r]) => realOpt (RealX.neg r) | (Real_abs _, [Real r]) => realOpt (RealX.abs r) | (Real_Math_acos _, [Real r]) => realOpt (RealX.acos r) | (Real_Math_asin _, [Real r]) => realOpt (RealX.asin r) | (Real_Math_atan _, [Real r]) => realOpt (RealX.atan r) | (Real_Math_atan2 _, [Real r1, Real r2]) => realOpt (RealX.atan2 (r1, r2)) | (Real_Math_cos _, [Real r]) => realOpt (RealX.cos r) | (Real_Math_exp _, [Real r]) => realOpt (RealX.exp r) | (Real_Math_ln _, [Real r]) => realOpt (RealX.ln r) | (Real_Math_log10 _, [Real r]) => realOpt (RealX.log10 r) | (Real_Math_sin _, [Real r]) => realOpt (RealX.sin r) | (Real_Math_sqrt _, [Real r]) => realOpt (RealX.sqrt r) | (Real_Math_tan _, [Real r]) => realOpt (RealX.tan r) | (Real_add _, [Real r1, Real r2]) => realOpt (RealX.add (r1, r2)) | (Real_div _, [Real r1, Real r2]) => realOpt (RealX.div (r1, r2)) | (Real_mul _, [Real r1, Real r2]) => realOpt (RealX.mul (r1, r2)) | (Real_sub _, [Real r1, Real r2]) => realOpt (RealX.sub (r1, r2)) | (Real_muladd _, [Real r1, Real r2, Real r3]) => realOpt (RealX.muladd (r1, r2, r3)) | (Real_mulsub _, [Real r1, Real r2, Real r3]) => realOpt (RealX.mulsub (r1, r2, r3)) | (Real_equal _, [Real r1, Real r2]) => boolOpt (RealX.equal (r1, r2)) | (Real_le _, [Real r1, Real r2]) => boolOpt (RealX.le (r1, r2)) | (Real_lt _, [Real r1, Real r2]) => boolOpt (RealX.lt (r1, r2)) | (Real_qequal _, [Real r1, Real r2]) => boolOpt (RealX.qequal (r1, r2)) | (Real_castToWord _, [Real r]) => wordOpt (RealX.castToWord r) | (Vector_vector, (Word w)::_) => (wordVector o WordXVector.fromList) ({elementSize = WordX.size w}, List.map (cs, Const.deWord)) | (Word_castToReal _, [Word w]) => realOpt (RealX.castFromWord w) | (Word_rndToReal (_, s, {signed}), [Word w]) => realOpt (RealX.fromIntInf (if signed then WordX.toIntInfX w else WordX.toIntInf w, s)) | (Word_add _, [Word w1, Word w2]) => word (WordX.add (w1, w2)) | (Word_addCheckP (s, sg), [Word w1, Word w2]) => wordChk (s, IntInf.+ (WordX.toIntInfSg (w1, sg), WordX.toIntInfSg (w2, sg)), sg) | (Word_andb _, [Word w1, Word w2]) => word (WordX.andb (w1, w2)) | (Word_equal _, [Word w1, Word w2]) => bool (WordX.equals (w1, w2)) | (Word_lshift _, [Word w1, Word w2]) => word (WordX.lshift (w1, w2)) | (Word_lt (_, sg), [Word w1, Word w2]) => bool (WordX.lt (w1, w2, sg)) | (Word_mul (_, sg), [Word w1, Word w2]) => word (WordX.mul (w1, w2, sg)) | (Word_mulCheckP (s, sg), [Word w1, Word w2]) => wordChk (s, IntInf.* (WordX.toIntInfSg (w1, sg), WordX.toIntInfSg (w2, sg)), sg) | (Word_neg _, [Word w]) => word (WordX.neg w) | (Word_negCheckP (s, sg), [Word w]) => wordChk (s, IntInf.~ (WordX.toIntInfSg (w, sg)), sg) | (Word_notb _, [Word w]) => word (WordX.notb w) | (Word_orb _, [Word w1, Word w2]) => word (WordX.orb (w1, w2)) | (Word_quot (_, sg), [Word w1, Word w2]) => if WordX.isZero w2 then ApplyResult.Unknown else word (WordX.quot (w1, w2, sg)) | (Word_rem (_, sg), [Word w1, Word w2]) => if WordX.isZero w2 then ApplyResult.Unknown else word (WordX.rem (w1, w2, sg)) | (Word_rol _, [Word w1, Word w2]) => word (WordX.rol (w1, w2)) | (Word_ror _, [Word w1, Word w2]) => word (WordX.ror (w1, w2)) | (Word_rshift (_, sg), [Word w1, Word w2]) => word (WordX.rshift (w1, w2, sg)) | (Word_sub _, [Word w1, Word w2]) => word (WordX.sub (w1, w2)) | (Word_subCheckP (s, sg), [Word w1, Word w2]) => wordChk (s, IntInf.- (WordX.toIntInfSg (w1, sg), WordX.toIntInfSg (w2, sg)), sg) | (Word_toIntInf, [Word w]) => (case IntInfRep.smallToIntInf w of NONE => ApplyResult.Unknown | SOME i => intInf i) | (Word_extdToWord (_, s, sg), [Word w]) => word (WordX.resizeSg (w, s, sg)) | (Word_xorb _, [Word w1, Word w2]) => word (WordX.xorb (w1, w2)) | (WordVector_toIntInf, [WordVector v]) => (case IntInfRep.bigToIntInf v of NONE => ApplyResult.Unknown | SOME i => intInf i) | _ => ApplyResult.Unknown) handle Chr => ApplyResult.Unknown | Div => ApplyResult.Unknown | Overflow => ApplyResult.Unknown | Subscript => ApplyResult.Unknown fun someVars () = let datatype z = datatype ApplyResult.t fun varIntInf (x, i: IntInf.t, space, inOrder) = let fun neg () = Apply (IntInf_neg, [x, space]) fun notb () = Apply (IntInf_notb, [x, space]) val i = IntInf.toInt i in case p of IntInf_add => if i = 0 then Var x else Unknown | IntInf_andb => if i = 0 then intInfConst 0 else if i = ~1 then Var x else Unknown | IntInf_arshift => if i = 0 then intInfConst 0 else if i = ~1 then intInfConst ~1 else Unknown | IntInf_gcd => if (i = ~1 orelse i = 1) then intInfConst 1 else Unknown | IntInf_lshift => if i = 0 then intInfConst 0 else Unknown | IntInf_mul => (case i of 0 => intInfConst 0 | 1 => Var x | ~1 => neg () | _ => Unknown) | IntInf_orb => if i = 0 then Var x else if i = ~1 then intInfConst ~1 else Unknown | IntInf_quot => if inOrder then (case i of 1 => Var x | ~1 => neg () | _ => Unknown) else Unknown | IntInf_rem => if inOrder andalso (i = ~1 orelse i = 1) then intInfConst 0 else Unknown | IntInf_sub => if i = 0 then if inOrder then Var x else neg () else Unknown | IntInf_xorb => if i = 0 then Var x else if i = ~1 then notb () else Unknown | _ => Unknown end handle Exn.Overflow => Unknown fun varReal (x, r, inOrder) = let datatype z = datatype RealX.decon datatype z = datatype ApplyResult.t fun negIf (s, signBit) = if signBit then realNeg (s, x) else Var x (* The SML Basis library does not distinguish between different NaN values, so optimizations that may only produce a different NaN value can be considered safe. For example, SNaN*1.0 = SNaN/1.0 = QNaN, so it is safe to optimize x*1.0 and x/1.0 to x. *) in case RealX.decon r of NONE => Unknown | SOME d => case d of ZERO _ => Unknown | ONE {signBit} => (case p of Real_mul s => negIf (s, signBit) | Real_div s => if inOrder then negIf (s, signBit) else Unknown | _ => Unknown) | NAN => (case p of Real_Math_atan2 _ => real r | Real_add _ => real r | Real_div _ => real r | Real_mul _ => real r | Real_sub _ => real r | Real_equal _ => bool false | Real_qequal _ => bool true | Real_le _ => bool false | Real_lt _ => bool false | _ => Unknown) | POW2 {signBit, exp} => (case p of Real_mul s => if not signBit andalso exp = 2 then realAdd (s, x, x) else Unknown | Real_div s => if inOrder andalso not signBit andalso exp = 0 then realAdd (s, x, x) else Unknown | _ => Unknown) | INF _ => Unknown | FIN _ => Unknown end fun varWord (x, w, inOrder) = let val zero = word o WordX.zero fun ro s = if inOrder then if WordX.isZero (WordX.rem (w, WordX.fromBits (WordSize.bits s, WordX.size w), {signed = false})) then Var x else Unknown else if WordX.isZero w orelse WordX.isAllOnes w then word w else Unknown fun shift s = if inOrder then if WordX.isZero w then Var x else if (WordX.ge (w, WordX.fromBits (WordSize.bits s, WordSize.shiftArg), {signed = false})) then zero s else Unknown else if WordX.isZero w then zero s else Unknown in case p of CPointer_add => if WordX.isZero w then Var x else Unknown | CPointer_sub => if WordX.isZero w andalso inOrder then Var x else Unknown | Word_add _ => if WordX.isZero w then Var x else Unknown | Word_addCheckP _ => if WordX.isZero w then f else Unknown | Word_andb s => if WordX.isZero w then zero s else if WordX.isAllOnes w then Var x else Unknown | Word_lshift s => shift s | Word_lt (_, sg) => if inOrder then if WordX.isMin (w, sg) then f else Unknown else if WordX.isMax (w, sg) then f else Unknown | Word_mul (s, {signed}) => if WordX.isZero w then zero s else if WordX.isOne w then Var x else if signed andalso WordX.isNegOne w then Apply (Word_neg s, [x]) else Unknown | Word_mulCheckP _ => if WordX.isZero w orelse WordX.isOne w then f else Unknown | Word_orb _ => if WordX.isZero w then Var x else if WordX.isAllOnes w then word w else Unknown | Word_quot (s, {signed}) => if inOrder then if WordX.isOne w then Var x else if signed andalso WordX.isNegOne w then Apply (Word_neg s, [x]) else Unknown else Unknown | Word_rem (s, {signed}) => if inOrder andalso (WordX.isOne w orelse signed andalso WordX.isNegOne w) then zero s else Unknown | Word_rol s => ro s | Word_ror s => ro s | Word_rshift (s, {signed}) => if signed then if WordX.isZero w then if inOrder then Var x else zero s else if WordX.isAllOnes w andalso not inOrder then word w else Unknown else shift s | Word_sub s => if WordX.isZero w then if inOrder then Var x else Apply (Word_neg s, [x]) else Unknown | Word_subCheckP _ => if WordX.isZero w andalso inOrder then f else Unknown | Word_xorb s => if WordX.isZero w then Var x else if WordX.isAllOnes w then Apply (Word_notb s, [x]) else Unknown | _ => Unknown end datatype z = datatype ApplyArg.t in case (p, args) of (_, [Con {con = c, hasArg = h}, Con {con = c', ...}]) => if (case p of MLton_eq => true | MLton_equal => true | _ => false) then if Con.equals (c, c') then if h then Unknown else t else f else Unknown | (_, [Var x, Const (Real r)]) => varReal (x, r, true) | (_, [Const (Real r), Var x]) => varReal (x, r, false) | (_, [Var x, Const (Word i)]) => varWord (x, i, true) | (_, [Const (Word i), Var x]) => varWord (x, i, false) | (_, [Const (IntInf i1), Const (IntInf i2), _]) => intInfBinary (i1, i2) | (_, [Const (IntInf i1), Const (Word w2), _]) => intInfShiftOrToString (i1, w2) | (_, [Const (IntInf i1), _]) => intInfUnary (i1) | (_, [Var x, Const (IntInf i), Var space]) => varIntInf (x, i, space, true) | (_, [Const (IntInf i), Var x, Var space]) => varIntInf (x, i, space, false) | (_, [Var x, Const (Word w), _]) => if WordX.isZero w then let datatype z = datatype ApplyResult.t in case p of IntInf_arshift => Var x | IntInf_lshift => Var x | _ => Unknown end else Unknown | (_, [Var x, Var y, _]) => if varEquals (x, y) then let datatype z = datatype ApplyResult.t in case p of IntInf_andb => Var x | IntInf_orb => Var x | IntInf_quot => intInfConst 1 | IntInf_rem => intInfConst 0 | IntInf_sub => intInfConst 0 | IntInf_xorb => intInfConst 0 | _ => Unknown end else Unknown | (_, [Var x, Var y]) => if varEquals (x, y) then let datatype z = datatype ApplyResult.t in case p of CPointer_diff => word (WordX.zero (WordSize.cptrdiff ())) | CPointer_equal => t | CPointer_lt => f | IntInf_compare => word (WordX.zero WordSize.compareRes) | MLton_eq => t | MLton_equal => t | Real_lt _ => f | Real_qequal _ => t | Word_andb _ => Var x | Word_equal _ => t | Word_lt _ => f | Word_orb _ => Var x | Word_quot (s, _) => word (WordX.one s) | Word_rem (s, _) => word (WordX.zero s) | Word_sub s => word (WordX.zero s) | Word_subCheckP _ => f | Word_xorb s => word (WordX.zero s) | _ => Unknown end else Unknown | _ => Unknown end in if List.forall (args, fn ApplyArg.Const _ => true | _ => false) then allConsts (List.map (args, fn ApplyArg.Const c => c | _ => Error.bug "Prim.apply")) else someVars () end end mlton-20210117+dfsg/mlton/atoms/prim.sig000066400000000000000000000266371416264345000177730ustar00rootroot00000000000000(* Copyright (C) 2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRIM_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Con: CON structure Const: CONST structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE sharing RealSize = Const.RealX.RealSize sharing WordSize = Const.WordX.WordSize end signature PRIM = sig include PRIM_STRUCTS datatype 'a t = Array_alloc of {raw: bool} (* to rssa (as runtime C fn) *) | Array_array (* to ssa2 *) | Array_copyArray (* to rssa (as runtime C fn) *) | Array_copyVector (* to rssa (as runtime C fn) *) | Array_length (* to rssa *) | Array_sub (* to ssa2 *) | Array_toArray (* to rssa *) | Array_toVector (* to rssa *) | Array_uninit (* to rssa *) | Array_uninitIsNop (* to rssa *) | Array_update (* to ssa2 *) | CFunction of 'a CFunction.t (* to rssa *) | CPointer_add (* codegen *) | CPointer_diff (* codegen *) | CPointer_equal (* codegen *) | CPointer_fromWord (* codegen *) | CPointer_getCPointer (* to rssa *) | CPointer_getObjptr (* to rssa *) | CPointer_getReal of RealSize.t (* to rssa *) | CPointer_getWord of WordSize.t (* to rssa *) | CPointer_lt (* codegen *) | CPointer_setCPointer (* to rssa *) | CPointer_setObjptr (* to rssa *) | CPointer_setReal of RealSize.t (* to rssa *) | CPointer_setWord of WordSize.t (* to rssa *) | CPointer_sub (* codegen *) | CPointer_toWord (* codegen *) | Exn_extra (* implement exceptions *) | Exn_name (* implement exceptions *) | Exn_setExtendExtra (* implement exceptions *) | GC_collect (* to rssa (as runtime C fn) *) | GC_state (* to rssa (as operand) *) | IntInf_add (* to rssa (as runtime C fn) *) | IntInf_andb (* to rssa (as runtime C fn) *) | IntInf_arshift (* to rssa (as runtime C fn) *) | IntInf_compare (* to rssa (as runtime C fn) *) | IntInf_gcd (* to rssa (as runtime C fn) *) | IntInf_lshift (* to rssa (as runtime C fn) *) | IntInf_mul (* to rssa (as runtime C fn) *) | IntInf_neg (* to rssa (as runtime C fn) *) | IntInf_notb (* to rssa (as runtime C fn) *) | IntInf_orb (* to rssa (as runtime C fn) *) | IntInf_quot (* to rssa (as runtime C fn) *) | IntInf_rem (* to rssa (as runtime C fn) *) | IntInf_sub (* to rssa (as runtime C fn) *) | IntInf_toString (* to rssa (as runtime C fn) *) | IntInf_toVector (* to rssa *) | IntInf_toWord (* to rssa *) | IntInf_xorb (* to rssa (as runtime C fn) *) (* of type unit -> 'a. * Makes a bogus value of any type. *) | MLton_bogus (* to rssa *) | MLton_bug (* to rssa (as impure C fn) *) | MLton_deserialize (* unused *) | MLton_eq (* to rssa (as Word_equal) *) | MLton_equal (* polymorphic equality *) | MLton_halt (* to rssa (as runtime C fn) *) | MLton_hash (* polymorphic hash *) (* MLton_handlesSignals and MLton_installSignalHandler work together * to inform the optimizer and basis library whether or not the * program uses signal handlers. * * MLton_installSignalHandler is called by MLton.Signal.setHandler, * and is effectively a noop, but is left in the program until, so * that the optimizer can test whether or not the program installs * signal handlers. * * MLton_handlesSignals is translated by closure conversion into * a boolean, and is true iff MLton_installsSignalHandler is called. *) | MLton_handlesSignals (* closure conversion *) | MLton_installSignalHandler (* to rssa (as nop) *) | MLton_serialize (* unused *) | MLton_share (* to rssa (as nop or runtime C fn) *) | MLton_size (* to rssa (as runtime C fn) *) | MLton_touch (* to rssa (as nop) or backend (as nop) *) | Real_Math_acos of RealSize.t (* codegen *) | Real_Math_asin of RealSize.t (* codegen *) | Real_Math_atan of RealSize.t (* codegen *) | Real_Math_atan2 of RealSize.t (* codegen *) | Real_Math_cos of RealSize.t (* codegen *) | Real_Math_exp of RealSize.t (* codegen *) | Real_Math_ln of RealSize.t (* codegen *) | Real_Math_log10 of RealSize.t (* codegen *) | Real_Math_sin of RealSize.t (* codegen *) | Real_Math_sqrt of RealSize.t (* codegen *) | Real_Math_tan of RealSize.t (* codegen *) | Real_abs of RealSize.t (* codegen *) | Real_add of RealSize.t (* codegen *) | Real_castToWord of RealSize.t * WordSize.t (* codegen *) | Real_div of RealSize.t (* codegen *) | Real_equal of RealSize.t (* codegen *) | Real_ldexp of RealSize.t (* codegen *) | Real_le of RealSize.t (* codegen *) | Real_lt of RealSize.t (* codegen *) | Real_mul of RealSize.t (* codegen *) | Real_muladd of RealSize.t (* codegen *) | Real_mulsub of RealSize.t (* codegen *) | Real_neg of RealSize.t (* codegen *) | Real_qequal of RealSize.t (* codegen *) | Real_rndToReal of RealSize.t * RealSize.t (* codegen *) | Real_rndToWord of RealSize.t * WordSize.t * {signed: bool} (* codegen *) | Real_round of RealSize.t (* codegen *) | Real_sub of RealSize.t (* codegen *) | Ref_assign (* to ssa2 *) | Ref_deref (* to ssa2 *) | Ref_ref (* to ssa2 *) | String_toWord8Vector (* defunctorize *) | Thread_atomicBegin (* to rssa *) | Thread_atomicEnd (* to rssa *) | Thread_atomicState (* to rssa *) | Thread_copy (* to rssa (as runtime C fn) *) | Thread_copyCurrent (* to rssa (as runtime C fn) *) | Thread_returnToC (* codegen *) (* switchTo has to be a _prim because we have to know that it * enters the runtime -- because everything must be saved * on the stack. *) | Thread_switchTo (* to rssa (as runtime C fn) *) | TopLevel_getHandler (* implement exceptions *) | TopLevel_getSuffix (* implement suffix *) | TopLevel_setHandler (* implement exceptions *) | TopLevel_setSuffix (* implement suffix *) | Vector_length (* to ssa2 *) | Vector_sub (* to ssa2 *) | Vector_vector (* to ssa2 *) | Weak_canGet (* to rssa (as runtime C fn) *) | Weak_get (* to rssa (as runtime C fn) *) | Weak_new (* to rssa (as runtime C fn) *) | Word_add of WordSize.t (* codegen *) | Word_addCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_andb of WordSize.t (* codegen *) | Word_castToReal of WordSize.t * RealSize.t (* codegen *) | Word_equal of WordSize.t (* codegen *) | Word_extdToWord of WordSize.t * WordSize.t * {signed: bool} (* codegen *) | Word_lshift of WordSize.t (* codegen *) | Word_lt of WordSize.t * {signed: bool} (* codegen *) | Word_mul of WordSize.t * {signed: bool} (* codegen *) | Word_mulCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_neg of WordSize.t (* codegen *) | Word_negCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_notb of WordSize.t (* codegen *) | Word_orb of WordSize.t (* codegen *) | Word_quot of WordSize.t * {signed: bool} (* codegen *) | Word_rem of WordSize.t * {signed: bool} (* codegen *) | Word_rndToReal of WordSize.t * RealSize.t * {signed: bool} (* codegen *) | Word_rol of WordSize.t (* codegen *) | Word_ror of WordSize.t (* codegen *) | Word_rshift of WordSize.t * {signed: bool} (* codegen *) | Word_sub of WordSize.t (* codegen *) | Word_subCheckP of WordSize.t * {signed: bool} (* codegen *) | Word_toIntInf (* to rssa *) | Word_xorb of WordSize.t (* codegen *) | WordVector_toIntInf (* to rssa *) | WordArray_subWord of {seqSize:WordSize.t, eleSize:WordSize.t} (* to rssa *) | WordArray_updateWord of {seqSize: WordSize.t, eleSize: WordSize.t} (* to rssa *) | WordVector_subWord of {seqSize: WordSize.t, eleSize: WordSize.t} (* to rssa *) | Word8Vector_toString (* defunctorize *) | World_save (* to rssa (as runtime C fn) *) structure ApplyArg: sig datatype 'a t = Con of {con: Con.t, hasArg: bool} | Const of Const.t | Var of 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t end structure ApplyResult: sig type 'a prim = 'a t datatype ('a, 'b) t = Apply of 'a prim * 'b list | Bool of bool | Const of Const.t | Unknown | Var of 'b val layout: ('b -> Layout.t) -> ('a, 'b) t -> Layout.t end val apply: 'a t * 'b ApplyArg.t list * ('b * 'b -> bool) -> ('a, 'b) ApplyResult.t val checkApp: 'a t * {args: 'a vector, result: 'a, targs: 'a vector, typeOps: {array: 'a -> 'a, arrow: 'a * 'a -> 'a, bool: 'a, cpointer: 'a, equals: 'a * 'a -> bool, exn: 'a, intInf: 'a, real: RealSize.t -> 'a, reff: 'a -> 'a, thread: 'a, unit: 'a, vector: 'a -> 'a, weak: 'a -> 'a, word: WordSize.t -> 'a}} -> bool val cpointerGet: CType.t -> 'a t val cpointerSet: CType.t -> 'a t val equals: 'a t * 'a t -> bool val extractTargs: 'a t * {args: 'b vector, result: 'b, typeOps: {deArray: 'b -> 'b, deArrow: 'b -> 'b * 'b, deRef: 'b -> 'b, deVector: 'b -> 'b, deWeak: 'b -> 'b}} -> 'b vector val fromString: string -> 'a t option val isCommutative: 'a t -> bool (* * isFunctional p = true iff p always returns same result when given * same args and has no side effects. * isFuntional implies not maySideEffect. * examples: Array_length, MLton_equal, Vector_vector, Word_add * not examples: Array_alloc, Array_sub, Ref_deref, Ref_ref *) val isFunctional: 'a t -> bool val layout: 'a t -> Layout.t val layoutFull: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t (* examples: Array_update, Ref_assign * not examples: Array_sub, Array_uninit, Ref_deref, Ref_ref *) val maySideEffect: 'a t -> bool val parse: unit -> 'a t Parse.t val parseFull: 'a Parse.t -> 'a t Parse.t val toString: 'a t -> string end mlton-20210117+dfsg/mlton/atoms/prod.fun000066400000000000000000000056731416264345000177730ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2017-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Prod (S: PROD_STRUCTS): PROD = struct open S datatype 'a t = T of {elt: 'a, isMutable: bool} vector fun dest (T p) = p val make = T fun empty () = T (Vector.new0 ()) local fun new1 {elt, isMutable} = T (Vector.new1 {elt = elt, isMutable = isMutable}) in fun new1Immutable elt = new1 {elt = elt, isMutable = false} fun new1Mutable elt = new1 {elt = elt, isMutable = true} end fun fold (p, b, f) = Vector.fold (dest p, b, fn ({elt, ...}, b) => f (elt, b)) fun foreach (p, f) = Vector.foreach (dest p, f o #elt) fun isEmpty p = Vector.isEmpty (dest p) fun allAreImmutable (T v) = Vector.forall (v, not o #isMutable) fun allAreMutable (T v) = Vector.forall (v, #isMutable) fun someIsImmutable (T v) = Vector.exists (v, not o #isMutable) fun someIsMutable (T v) = Vector.exists (v, #isMutable) fun first (T p) = Vector.first p fun sub (T p, i) = Vector.sub (p, i) fun elt (p, i) = #elt (sub (p, i)) fun length p = Vector.length (dest p) val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool = fn (p1, p2, equals) => Vector.equals (dest p1, dest p2, fn ({elt = e1, isMutable = m1}, {elt = e2, isMutable = m2}) => m1 = m2 andalso equals (e1, e2)) val hash: 'a t * ('a -> word) -> word = fn (p, hash) => Hash.vectorMap (dest p, fn {elt = e, isMutable = m} => Hash.combine (Bool.hash m, hash e)) fun layout (p, layoutElt) = let open Layout in seq [str "(", (mayAlign o separateRight) (Vector.toListMap (dest p, fn {elt, isMutable} => if isMutable then seq [layoutElt elt, str " mut"] else layoutElt elt), ","), str ")"] end fun parse (parseElt: 'a Parse.t): 'a t Parse.t = let open Parse (* infix declarations for Parse.Ops *) infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> in make <$> vector (parseElt >>= (fn elt => optional (kw "mut") >>= (fn isMutable => pure {elt = elt, isMutable = Option.isSome isMutable}))) end val map: 'a t * ('a -> 'b) -> 'b t = fn (p, f) => make (Vector.map (dest p, fn {elt, isMutable} => {elt = f elt, isMutable = isMutable})) val keepAllMap: 'a t * ('a -> 'b option) -> 'b t = fn (p, f) => make (Vector.keepAllMap (dest p, fn {elt, isMutable} => Option.map (f elt, fn elt => {elt = elt, isMutable = isMutable}))) end mlton-20210117+dfsg/mlton/atoms/prod.sig000066400000000000000000000025171416264345000177570ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PROD_STRUCTS = sig end signature PROD = sig type 'a t val allAreImmutable: 'a t -> bool val allAreMutable: 'a t -> bool val dest: 'a t -> {elt: 'a, isMutable: bool} vector val elt: 'a t * int -> 'a val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool val empty: unit -> 'a t val first: 'a t -> {elt: 'a, isMutable: bool} val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreach: 'a t * ('a -> unit) -> unit val hash: 'a t * ('a -> word) -> word val isEmpty: 'a t -> bool val keepAllMap: 'a t * ('a -> 'b option) -> 'b t val layout: 'a t * ('a -> Layout.t) -> Layout.t val length: 'a t -> int val make: {elt: 'a, isMutable: bool} vector -> 'a t val map: 'a t * ('a -> 'b) -> 'b t val new1Immutable: 'a -> 'a t val new1Mutable: 'a -> 'a t val parse: 'a Parse.t -> 'a t Parse.t val someIsImmutable: 'a t -> bool val someIsMutable: 'a t -> bool val sub: 'a t * int -> {elt: 'a, isMutable: bool} end mlton-20210117+dfsg/mlton/atoms/profile-exp.fun000066400000000000000000000016031416264345000212460ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ProfileExp (S: PROFILE_EXP_STRUCTS): PROFILE_EXP = struct open S datatype t = Enter of SourceInfo.t | Leave of SourceInfo.t val toString = fn Enter si => concat ["Enter ", SourceInfo.toString si] | Leave si => concat ["Leave " , SourceInfo.toString si] val layout = Layout.str o toString val equals = fn (Enter si, Enter si') => SourceInfo.equals (si, si') | (Leave si, Leave si') => SourceInfo.equals (si, si') | _ => false local val newHash = Random.word val enter = newHash () val leave = newHash () in val hash = fn Enter si => Hash.combine (enter, SourceInfo.hash si) | Leave si => Hash.combine (leave, SourceInfo.hash si) end end mlton-20210117+dfsg/mlton/atoms/profile-exp.sig000066400000000000000000000011321416264345000212350ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_EXP_STRUCTS = sig structure SourceInfo: SOURCE_INFO end signature PROFILE_EXP = sig include PROFILE_EXP_STRUCTS datatype t = Enter of SourceInfo.t | Leave of SourceInfo.t val equals: t * t -> bool val hash: t -> word val layout: t -> Layout.t val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/profile-label.fun000066400000000000000000000016741416264345000215410ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ProfileLabel (S: PROFILE_LABEL_STRUCTS): PROFILE_LABEL = struct open S datatype t = T of {plist: PropertyList.t, uniq: int} local fun make f (T r) = f r in val plist = make #plist val uniq = make #uniq end fun equals (pl1, pl2) = PropertyList.equals (plist pl1, plist pl2) local val c = Counter.generator 0 in fun new () = T {plist = PropertyList.new (), uniq = c ()} end fun toString pl = concat ["MLtonProfile", Int.toString (uniq pl)] val layout = Layout.str o toString val clear = PropertyList.clear o plist end mlton-20210117+dfsg/mlton/atoms/profile-label.sig000066400000000000000000000010161416264345000215210ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_LABEL_STRUCTS = sig end signature PROFILE_LABEL = sig type t val clear: t -> unit val equals: t * t -> bool val layout: t -> Layout.t val new: unit -> t val plist: t -> PropertyList.t val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/real-size.fun000066400000000000000000000017151416264345000207130ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RealSize (S: REAL_SIZE_STRUCTS): REAL_SIZE = struct open S datatype t = R32 | R64 val all = [R32, R64] val equals: t * t -> bool = op = local val r32 = Random.word () val r64 = Random.word () in val hash: t -> word = fn R32 => r32 | R64 => r64 end val memoize: (t -> 'a) -> t -> 'a = fn f => let val r32 = f R32 val r64 = f R64 in fn R32 => r32 | R64 => r64 end val toString = fn R32 => "32" | R64 => "64" val bytes: t -> Bytes.t = fn R32 => Bytes.fromInt 4 | R64 => Bytes.fromInt 8 val bits: t -> Bits.t = Bytes.toBits o bytes val compare = fn (R32, R32) => EQUAL | (R32, R64) => LESS | (R64, R32) => GREATER | (R64, R64) => EQUAL end mlton-20210117+dfsg/mlton/atoms/real-size.sig000066400000000000000000000011711416264345000207010ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature REAL_SIZE_STRUCTS = sig end signature REAL_SIZE = sig include REAL_SIZE_STRUCTS datatype t = R32 | R64 val all: t list val bits: t -> Bits.t val bytes: t -> Bytes.t val compare: t * t -> Relation.t val equals: t * t -> bool val hash: t -> word val memoize: (t -> 'a) -> t -> 'a val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/real-x.fun000066400000000000000000000234341416264345000202120ustar00rootroot00000000000000(* Copyright (C) 2009,2011-2012,2018-2020 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RealX (S: REAL_X_STRUCTS): REAL_X = struct open S structure P = Pervasive structure PR32 = P.Real32 structure PR64 = P.Real64 structure PIR = P.IEEEReal datatype z = datatype RealSize.t datatype t = Real32 of Real32.t | Real64 of Real64.t fun zero s = case s of R32 => Real32 0.0 | R64 => Real64 0.0 fun negInf s = case s of R32 => Real32 PR32.negInf | R64 => Real64 PR64.negInf fun posInf s = case s of R32 => Real32 PR32.posInf | R64 => Real64 PR64.posInf fun size r = case r of Real32 _ => R32 | Real64 _ => R64 fun make (r: string, s: RealSize.t): t option = let fun doit (fromString, isFinite, con): t option = case fromString r of NONE => Error.bug "RealX.make: unexpected real constant" | SOME r => if isFinite r then SOME (con r) else NONE in case s of R32 => doit (Real32.fromString, Real32.isFinite, Real32) | R64 => doit (Real64.fromString, Real64.isFinite, Real64) end (* RealX.equals determines if two floating-point constants are equal. * Must check the sign bit, since Real{32,64}.== ignores the sign of * zeros; the difference between 0.0 and ~0.0 is observable by * programs that examine the sign bit. * Should check for nan, since Real{32,64}.== returns false for any * comparison with nan values. Ideally, should use bit-wise equality * since there are multiple representations for nan. However, SML/NJ * doesn't support the PackReal structures that would be required to * compare real values as bit patterns. Conservatively return * 'false'; constant-propagation and common-subexpression elimination * will not combine nan values. *) fun equals (r, r') = case (r, r') of (Real32 r, Real32 r') => let open Real32 in equals (r, r') andalso signBit r = signBit r' end | (Real64 r, Real64 r') => let open Real64 in equals (r, r') andalso signBit r = signBit r' end | _ => false fun toString (r, {suffix}) = let val doit = if suffix then fn (r, s) => r ^ s else fn (r, _) => r in case r of Real32 r => doit (Real32.format (r, Real32.Format.exact), ":r32") | Real64 r => doit (Real64.format (r, Real64.Format.exact), ":r64") end val layout = Layout.str o toString val parse = let open Parse infix 1 <|> infix 3 <* infixr 4 <$> in (Real64 <$> (fromScan Real64.scan <* str ":r64")) <|> (Real32 <$> (fromScan Real32.scan <* str ":r32")) end fun hash r = String.hash (toString (r, {suffix = true})) (* Disable constant folding when it might change the results. *) fun disableCF () = PR32.precision = PR64.precision orelse !Control.target <> Control.Self local fun make (o32, o64) arg = if disableCF () then NONE else SOME (case arg of Real32 x => Real32 (o32 x) | Real64 x => Real64 (o64 x)) in val neg = make (Real32.~, Real64.~) val abs = make (Real32.abs, Real64.abs) end datatype 'r r = R of {zero: 'r, half: 'r, one: 'r, inf: 'r, abs: 'r -> 'r, signBit: 'r -> bool, isNan: 'r -> bool, toManExp: 'r -> {exp: int, man: 'r}, compareReal: 'r * 'r -> PIR.real_order, bits: Bits.t, subVec: P.Word8Vector.vector * int -> P.LargeWord.word, update: P.Word8Array.array * int * P.LargeWord.word -> unit, toBytes: 'r -> P.Word8Vector.vector, subArr: P.Word8Array.array * int -> 'r, tag: 'r -> t} val r32 = R {zero = 0.0, half = 0.5, one = 1.0, inf = PR32.posInf, abs = PR32.abs, signBit = PR32.signBit, isNan = PR32.isNan, toManExp = PR32.toManExp, compareReal = PR32.compareReal, bits = Bits.inWord32, subVec = P.PackWord32Little.subVec, update = P.PackWord32Little.update, toBytes = P.PackReal32Little.toBytes, subArr = P.PackReal32Little.subArr, tag = Real32} val r64 = R {zero = 0.0, half = 0.5, one = 1.0, inf = PR64.posInf, abs = PR64.abs, signBit = PR64.signBit, isNan = PR64.isNan, toManExp = PR64.toManExp, compareReal = PR64.compareReal, bits = Bits.inWord64, subVec = P.PackWord64Little.subVec, update = P.PackWord64Little.update, toBytes = P.PackReal64Little.toBytes, subArr = P.PackReal64Little.subArr, tag = Real64} local fun doit (R {compareReal, signBit, tag, ...}) (f, arg) = if disableCF () then NONE else let val old = PIR.getRoundingMode () in (* According to the Basis Library specification, * setRoundingMode can fail (raise an exception). *) let val () = PIR.setRoundingMode PIR.TO_NEGINF val min = f arg val () = PIR.setRoundingMode PIR.TO_POSINF val max = f arg val () = PIR.setRoundingMode old in if (PIR.EQUAL = compareReal (min, max) andalso signBit min = signBit max) then SOME (tag min) else NONE end handle _ => (if PIR.getRoundingMode () = old then () else PIR.setRoundingMode old ; NONE) end fun make1 (o32, o64) = fn Real32 x => doit r32 (o32, x) | Real64 x => doit r64 (o64, x) fun make2 (o32, o64) = fn (Real32 x, Real32 y) => doit r32 (o32, (x, y)) | (Real64 x, Real64 y) => doit r64 (o64, (x, y)) | _ => Error.bug "impossible" fun make3 (o32, o64) = fn (Real32 x, Real32 y, Real32 z) => doit r32 (o32, (x, y, z)) | (Real64 x, Real64 y, Real64 z) => doit r64 (o64, (x, y, z)) | _ => Error.bug "impossible" in val acos = make1 (PR32.Math.acos, PR64.Math.acos) val asin = make1 (PR32.Math.asin, PR64.Math.asin) val atan = make1 (PR32.Math.atan, PR64.Math.atan) val atan2 = make2 (PR32.Math.atan2, PR64.Math.atan2) val cos = make1 (PR32.Math.cos, PR64.Math.cos) val exp = make1 (PR32.Math.exp, PR64.Math.exp) val ln = make1 (PR32.Math.ln, PR64.Math.ln) val log10 = make1 (PR32.Math.log10, PR64.Math.log10) val sin = make1 (PR32.Math.sin, PR64.Math.sin) val sqrt = make1 (PR32.Math.sqrt, PR64.Math.sqrt) val tan = make1 (PR32.Math.tan, PR64.Math.tan) val add = make2 (PR32.+, PR64.+) val op div = make2 (PR32./, PR64./) val mul = make2 (PR32.*, PR64.* ) val sub = make2 (PR32.-, PR64.-) val muladd = make3 (PR32.*+, PR64.*+) val mulsub = make3 (PR32.*-, PR64.*-) fun fromIntInf (i, s) = case s of R32 => doit r32 (Real32.fromIntInf, i) | R64 => doit r64 (Real64.fromIntInf, i) end local fun make (o32, o64) args = if disableCF () then NONE else SOME (case args of (Real32 r1, Real32 r2) => o32 (r1, r2) | (Real64 r1, Real64 r2) => o64 (r1, r2) | _ => Error.bug "impossible") in val equal = make (PR32.==, PR64.==) val le = make (PR32.<=, PR64.<=) val lt = make (PR32.<, PR64.<) val qequal = make (PR32.?=, PR64.?=) end datatype decon = NAN | ZERO of {signBit: bool} | ONE of {signBit: bool} | POW2 of {signBit: bool, exp: Int.t} (* man = 0.5 *) | FIN of {signBit: bool, exp: Int.t, man: t} | INF of {signBit: bool} local fun doit (R {zero, half, one, inf, abs, signBit, isNan, toManExp, compareReal, tag, ...}) value = if isNan value then NAN else let val signBit = signBit value val absValue = abs value in if PIR.EQUAL = compareReal (zero, absValue) then ZERO {signBit = signBit} else if PIR.EQUAL = compareReal (one, absValue) then ONE {signBit = signBit} else if PIR.EQUAL = compareReal (inf, absValue) then INF {signBit = signBit} else let val {man, exp} = toManExp absValue in if PIR.EQUAL = compareReal (half, man) then POW2 {signBit = signBit, exp = exp} else FIN {signBit = signBit, exp = exp, man = tag man} end end in fun decon x = if disableCF () then NONE else SOME (case x of Real32 x => doit r32 x | Real64 x => doit r64 x) end local fun doit (R {bits, toBytes, subVec, ...}) x = ((SOME o WordX.fromIntInf) (P.LargeWord.toLargeInt (subVec (toBytes x, 0)), WordX.WordSize.fromBits bits)) handle _ => NONE in fun castToWord x = if disableCF () then NONE else (case x of Real32 x => doit r32 x | Real64 x => doit r64 x) end local fun doit (R {bits, update, subArr, tag, isNan, ...}) w = let val a = P.Word8Array.array (Bytes.toInt (Bits.toBytes bits), 0w0) val () = update (a, 0, P.LargeWord.fromLargeInt (WordX.toIntInf w)) val r = subArr (a, 0) in if isNan r then NONE else SOME (tag r) end handle _ => NONE in fun castFromWord w = if disableCF () then NONE else if WordX.WordSize.bits (WordX.size w) = Bits.inWord32 then doit r32 w else if WordX.WordSize.bits (WordX.size w) = Bits.inWord64 then doit r64 w else Error.bug "Invalid word size" end end mlton-20210117+dfsg/mlton/atoms/real-x.sig000066400000000000000000000037301416264345000202010ustar00rootroot00000000000000(* Copyright (C) 2009,2018-2019 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature REAL_X_STRUCTS = sig structure RealSize: REAL_SIZE structure WordX: WORD_X end signature REAL_X = sig include REAL_X_STRUCTS (* reals of all RealSize.t sizes. *) type t datatype decon = NAN | ZERO of {signBit: bool} | ONE of {signBit: bool} | POW2 of {signBit: bool, exp: int} (* man = 0.5 *) | FIN of {signBit: bool, exp: int, man: t} | INF of {signBit: bool} val abs: t -> t option val acos: t -> t option val add: t * t -> t option val asin: t -> t option val atan2: t * t -> t option val atan: t -> t option val castFromWord: WordX.t -> t option val castToWord: t -> WordX.t option val cos: t -> t option val decon: t -> decon option val div: t * t -> t option val equal: t * t -> bool option val equals: t * t -> bool val exp: t -> t option val fromIntInf: IntInf.t * RealSize.t -> t option val hash: t -> word val layout: t * {suffix: bool} -> Layout.t val le: t * t -> bool option val ln: t -> t option val log10: t -> t option val lt: t * t -> bool option val make: string * RealSize.t -> t option val mul: t * t -> t option val muladd: t * t * t -> t option val mulsub: t * t * t -> t option val neg: t -> t option val negInf: RealSize.t -> t val parse: t Parse.t val posInf: RealSize.t -> t val qequal: t * t -> bool option val sin: t -> t option val size: t -> RealSize.t val sqrt: t -> t option val sub: t * t -> t option val tan: t -> t option val toString: t * {suffix: bool} -> string val zero: RealSize.t -> t end mlton-20210117+dfsg/mlton/atoms/record.fun000066400000000000000000000071061416264345000202760ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* empty tuple is also a record *) functor Record (S: RECORD_STRUCTS): RECORD = struct open S datatype 'a t = Tuple of 'a vector | Record of (Field.t * 'a) vector val tuple = Tuple fun toVector r = case r of Tuple v => Vector.mapi (v, fn (i, x) => (Field.Int i, x)) | Record r => r fun detupleOpt (r: 'a t): 'a vector option = case r of Tuple t => SOME t | Record _ => NONE fun sort v = QuickSort.sortVector (v, fn ((s, _), (s', _)) => Field.<= (s, s')) fun fromVector v = let fun isTuple v : bool = Vector.foralli (v, fn (i, (f, _)) => case f of Field.Int i' => Int.equals (i, i') | _ => false) val v = if isSorted then sort v else v in if isTuple v andalso Vector.length v <> 1 then Tuple (Vector.map (v, #2)) else Record v end fun unzip r = Vector.unzip (toVector r) fun zip z = fromVector (Vector.zip z) val peek: 'a t * Field.t -> 'a option = fn (r, f) => case r of Record r => (case Vector.peek (r, fn (f', _) => Field.equals (f, f')) of NONE => NONE | SOME (_, x) => SOME x) | Tuple t => if Vector.isEmpty t then NONE else (case f of Field.Int i => if 0 <= i andalso i < Vector.length t then SOME (Vector.sub (t, i)) else NONE | Field.Symbol _ => NONE) fun domain r = case r of Tuple v => Vector.mapi (v, fn (i, _) => Field.Int i) | Record r => Vector.map (r, #1) fun range r = case r of Tuple t => t | Record r => Vector.map (r, #2) fun exists (r, p) = case r of Tuple xs => Vector.exists (xs, p) | Record r => Vector.exists (r, fn (_, x) => p x) fun forall (r, p) = not (exists (r, not o p)) fun fold (r: 'a t, b: 'b, f: 'a * 'b -> 'b): 'b = case r of Tuple xs => Vector.fold (xs, b, f) | Record r => Vector.fold (r, b, fn ((_, x), b) => f (x, b)) fun map (r: 'a t, f: 'a -> 'b): 'b t = case r of Tuple xs => Tuple (Vector.map (xs, f)) | Record r => Record (Vector.map (r, fn (field, a) => (field, f a))) fun foreach (r: 'a t, f: 'a -> unit): unit = case r of Tuple xs => Vector.foreach (xs, f) | Record r => Vector.foreach (r, f o #2) fun change (r: 'a t, f: 'a vector -> 'b vector * 'c): 'b t * 'c = case r of Tuple xs => let val (ys, c) = f xs in (Tuple ys, c) end | Record r => let val (fs, xs) = Vector.unzip r val (ys, c) = f xs in (Record (Vector.zip (fs, ys)), c) end fun layout {record, layoutTuple, separator, extra, layoutElt} = case (record, extra) of (Tuple xs, "") => layoutTuple xs | _ => let val r = toVector record open Layout in seq [str "{", mayAlign (separateRight (Vector.toListMap (r, fn (f, x) => seq [Field.layout f, str separator, layoutElt x]), ",")), str extra, str "}"] end end mlton-20210117+dfsg/mlton/atoms/record.sig000066400000000000000000000032231416264345000202640ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RECORD_STRUCTS = sig val isSorted: bool structure Field: FIELD end signature RECORD = sig include RECORD_STRUCTS type 'a t (* Create a record with the same fields but a new range. * Also return some additional info. *) val change: 'a t * ('a vector -> 'b vector * 'c) -> 'b t * 'c (* detuple r returns the components, if r is a tuple *) val detupleOpt: 'a t -> 'a vector option val domain: 'a t -> Field.t vector val exists: 'a t * ('a -> bool) -> bool val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val fromVector: (Field.t * 'a) vector -> 'a t val layout: {record: 'a t, separator: string, extra: string, layoutTuple: 'a vector -> Layout.t, layoutElt: 'a -> Layout.t} -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val peek: 'a t * Field.t -> 'a option (* range {1 = a, 2 = b, 3 = c} returns [a, b, c] *) val range: 'a t -> 'a vector val toVector: 'a t -> (Field.t * 'a) vector (* tuple [a, b, c] creates {1 = a, 2 = b, 3 = c} *) val tuple: 'a vector -> 'a t val unzip: 'a t -> Field.t vector * 'a vector val zip: Field.t vector * 'a vector -> 'a t end mlton-20210117+dfsg/mlton/atoms/return.fun000066400000000000000000000055151416264345000203410ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Return (S: RETURN_STRUCTS): RETURN = struct open S datatype t = Dead | NonTail of {cont: Label.t, handler: Handler.t} | Tail fun layout r = let open Layout in case r of Dead => str "Dead" | NonTail {cont, handler} => seq [str "NonTail ", Layout.record [("cont", Label.layout cont), ("handler", Handler.layout handler)]] | Tail => str "Tail" end fun equals (r, r'): bool = case (r, r') of (Dead, Dead) => true | (NonTail {cont = c, handler = h}, NonTail {cont = c', handler = h'}) => Label.equals (c, c') andalso Handler.equals (h, h') | (Tail, Tail) => true | _ => false fun foldLabel (r: t, a, f) = case r of Dead => a | NonTail {cont, handler} => Handler.foldLabel (handler, f (cont, a), f) | Tail => a fun foreachLabel (r, f) = foldLabel (r, (), f o #1) fun foreachHandler (r, f) = case r of Dead => () | NonTail {handler, ...} => Handler.foreachLabel (handler, f) | Tail => () fun map (r, f) = case r of Dead => Dead | NonTail {cont, handler} => NonTail {cont = f cont, handler = Handler.map (handler, f)} | Tail => Tail fun compose (r, r') = case r' of Dead => Dead | NonTail {cont, handler} => NonTail {cont = cont, handler = (case handler of Handler.Caller => (case r of Dead => Handler.Caller | NonTail {handler, ...} => handler | Tail => Handler.Caller) | Handler.Dead => handler | Handler.Handle _ => handler)} | Tail => r local val newHash = Random.word val dead = newHash () val nonTail = newHash () val tail = newHash () in fun hash r = case r of Dead => dead | NonTail {cont, handler} => Hash.combine3 (nonTail, Label.hash cont, Handler.hash handler) | Tail => tail end end mlton-20210117+dfsg/mlton/atoms/return.sig000066400000000000000000000016771416264345000203400ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RETURN_STRUCTS = sig structure Label: LABEL structure Handler: HANDLER sharing Label = Handler.Label end signature RETURN = sig include RETURN_STRUCTS datatype t = Dead | NonTail of {cont: Label.t, handler: Handler.t} | Tail val compose: t * t -> t val equals: t * t -> bool val foldLabel: t * 'a * (Label.t * 'a -> 'a) -> 'a val foreachHandler: t * (Label.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val hash: t -> word val layout: t -> Layout.t val map: t * (Label.t -> Label.t) -> t end mlton-20210117+dfsg/mlton/atoms/source-info.fun000066400000000000000000000055651416264345000212600ustar00rootroot00000000000000(* Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SourceInfo (S: SOURCE_INFO_STRUCTS): SOURCE_INFO = struct open S structure Pos = struct datatype t = Known of SourcePos.t | Unknown fun toString p = case p of Known p => if !Control.profile = Control.ProfileCallStack then SourcePos.toString p else concat [SourcePos.file p, ": ", Int.toString (SourcePos.line p)] | Unknown => "" fun fromRegion r = case Region.left r of NONE => Unknown | SOME p => Known p fun file p = case p of Known p => SOME (SourcePos.file p) | Unknown => NONE end datatype info = Anonymous of Pos.t | C of string | Function of {name: string list, pos: Pos.t} datatype t = T of {hash: word, info: info, plist: PropertyList.t} local val r: t list ref = ref [] in fun new info = let val res = T {hash = Random.word (), info = info, plist = PropertyList.new ()} val () = if !Control.profile = Control.ProfileCount then List.push (r, res) else () in res end fun all () = !r end local fun make f (T r) = f r in val hash = make #hash val info = make #info val plist = make #plist end local val table: (string, t) HashTable.t = HashTable.new {equals = String.equals, hash = String.hash} in fun fromC (name: string) = HashTable.lookupOrInsert (table, name, fn () => new (C name)) end fun function {name, region} = new (Function {name = name, pos = Pos.fromRegion region}) fun toString' (si, sep) = case info si of Anonymous pos => Pos.toString pos | C s => concat ["<", s, ">"] | Function {name, pos} => concat [concat (List.separate (List.rev name, ".")), sep, Pos.toString pos] fun toString si = toString' (si, " ") val layout = Layout.str o toString val equals: t * t -> bool = fn (s, s') => PropertyList.equals (plist s, plist s') val equals = Trace.trace2 ("SourceInfo.equals", layout, layout, Bool.layout) equals fun file (s: t): File.t option = case info s of Anonymous pos => Pos.file pos | C _ => NONE | Function {pos, ...} => Pos.file pos fun isC (s: t): bool = case info s of C _ => true | _ => false val gc = fromC "gc" val gcSequenceAllocate = fromC "GC_sequenceAllocate" val main = fromC "main" val polyEqual = fromC "poly-equal" val polyHash = fromC "poly-hash" val unknown = fromC "unknown" end mlton-20210117+dfsg/mlton/atoms/source-info.sig000066400000000000000000000016141416264345000212410ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SOURCE_INFO_STRUCTS = sig end signature SOURCE_INFO = sig include SOURCE_INFO_STRUCTS type t val all: unit -> t list val equals: t * t -> bool val file: t -> File.t option val gc: t val gcSequenceAllocate: t val hash: t -> word val fromC: string -> t val function: {name: string list, region: Region.t} -> t val isC: t -> bool val layout: t -> Layout.t val main: t val plist: t -> PropertyList.t val polyEqual: t val polyHash: t val toString: t -> string val toString': t * string -> string val unknown: t end mlton-20210117+dfsg/mlton/atoms/source-maps.fun000066400000000000000000000141001416264345000212460ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2016-2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SourceMaps (S: SOURCE_MAPS_STRUCTS): SOURCE_MAPS = struct open S datatype t = T of {profileLabelInfos: {profileLabel: ProfileLabel.t, sourceSeqIndex: int} vector, sourceNames: string vector, sourceSeqs: {sourceIndex: int} vector vector, sources: {sourceNameIndex: int, successorSourceSeqIndex: int} vector} val empty = T {profileLabelInfos = Vector.new0 (), sourceNames = Vector.new0 (), sourceSeqs = Vector.new0 (), sources = Vector.new0 ()} fun clear (T {profileLabelInfos, ...}) = Vector.foreach (profileLabelInfos, ProfileLabel.clear o #profileLabel) fun layout (T {profileLabelInfos, sourceNames, sourceSeqs, sources}) = Layout.record [("profileLabelInfos", Vector.layout (fn {profileLabel, sourceSeqIndex} => Layout.record [("profileLabel", ProfileLabel.layout profileLabel), ("sourceSeqIndex", Int.layout sourceSeqIndex)]) profileLabelInfos), ("sourceNames", Vector.layout String.layout sourceNames), ("sourceSeqs", Vector.layout (Vector.layout (fn {sourceIndex} => Layout.record [("sourceIndex", Int.layout sourceIndex)])) sourceSeqs), ("sources", Vector.layout (fn {sourceNameIndex, successorSourceSeqIndex} => Layout.record [("sourceNameIndex", Int.layout sourceNameIndex), ("successorSourceSeqIndex", Int.layout successorSourceSeqIndex)]) sources)] fun layouts (pi, output) = output (layout pi) fun check (T {profileLabelInfos, sourceNames, sourceSeqs, sources}): bool = if !Control.profile = Control.ProfileNone then Vector.isEmpty profileLabelInfos andalso Vector.isEmpty sourceNames andalso Vector.isEmpty sourceSeqs andalso Vector.isEmpty sources else let val sourceNamesLength = Vector.length sourceNames val sourceSeqsLength = Vector.length sourceSeqs val sourcesLength = Vector.length sources val {get = getSeen, destroy = destSeen, ...} = Property.destGet (ProfileLabel.plist, Property.initFun (fn _ => ref false)) in (Vector.forall (profileLabelInfos, fn {profileLabel, sourceSeqIndex, ...} => let val seen = getSeen profileLabel in not (!seen) before (seen := true) andalso 0 <= sourceSeqIndex andalso sourceSeqIndex < sourceSeqsLength end) before destSeen ()) andalso (Vector.forall (sourceSeqs, fn v => Vector.forall (v, fn {sourceIndex} => 0 <= sourceIndex andalso sourceIndex < sourcesLength))) andalso (Vector.forall (sources, fn {sourceNameIndex, successorSourceSeqIndex} => 0 <= sourceNameIndex andalso sourceNameIndex < sourceNamesLength andalso 0 <= successorSourceSeqIndex andalso successorSourceSeqIndex < sourceSeqsLength)) end fun checkSourceSeqIndex (T {sourceSeqs, ...}, sourceSeqIndex) = 0 <= sourceSeqIndex andalso sourceSeqIndex < Vector.length sourceSeqs fun checkProfileLabel (T {profileLabelInfos, ...}) = let val {get = getSeen, destroy = destSeen, ...} = Property.destGet (ProfileLabel.plist, Property.initFun (fn _ => ref false)) in (fn profileLabel => let val seen = getSeen profileLabel in not (!seen) before (seen := true) andalso Vector.exists (profileLabelInfos, fn {profileLabel = profileLabel', ...} => ProfileLabel.equals (profileLabel, profileLabel')) end, fn () => let in Vector.forall (profileLabelInfos, ! o getSeen o #profileLabel) before destSeen () end) end fun modify (T {profileLabelInfos, sourceNames, sourceSeqs, sources}) : {newProfileLabel: ProfileLabel.t -> ProfileLabel.t, delProfileLabel: ProfileLabel.t -> unit, getSourceMaps: unit -> t} = let val {get: ProfileLabel.t -> int, set, ...} = Property.getSet (ProfileLabel.plist, Property.initRaise ("SourceMaps.extend", ProfileLabel.layout)) val _ = Vector.foreach (profileLabelInfos, fn {profileLabel, sourceSeqIndex} => set (profileLabel, sourceSeqIndex)) val new = ref [] fun newProfileLabel pl = let val sourceSeqIndex = get pl val pl' = ProfileLabel.new () val _ = set (pl', sourceSeqIndex) val _ = List.push (new, {profileLabel = pl', sourceSeqIndex = sourceSeqIndex}) in pl' end fun delProfileLabel pl = set (pl, ~1) fun getSourceMaps () = let val profileLabelInfos = Vector.concat [profileLabelInfos, Vector.fromList (!new)] val profileLabelInfos = Vector.keepAll (profileLabelInfos, fn {profileLabel, ...} => get profileLabel <> ~1) val pi = T {profileLabelInfos = profileLabelInfos, sourceNames = sourceNames, sourceSeqs = sourceSeqs, sources = sources} in Assert.assert ("SourceMaps.getSourceMaps", fn () => check pi); pi end in {newProfileLabel = newProfileLabel, delProfileLabel = delProfileLabel, getSourceMaps = getSourceMaps} end end mlton-20210117+dfsg/mlton/atoms/source-maps.sig000066400000000000000000000036501416264345000212500ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SOURCE_MAPS_STRUCTS = sig structure ProfileLabel: PROFILE_LABEL end signature SOURCE_MAPS = sig include SOURCE_MAPS_STRUCTS datatype t = T of {(* the collection of profile labels embedded in output program * paired with an index into sourceSeqs of the sequence of source * names corresponding to the code pointer; only used with * ProfileTimeLabel. *) profileLabelInfos: {profileLabel: ProfileLabel.t, sourceSeqIndex: int} vector, (* the collection of source names from the program. *) sourceNames: string vector, (* each entry describes a sequence of source names as a sequence * of indices into sources. *) sourceSeqs: {sourceIndex: int} vector vector, (* each entry describes a source name and successor sources as * the pair of an index into sourceNames and an index into * sourceSeqs. *) sources: {sourceNameIndex: int, successorSourceSeqIndex: int} vector} val empty: t val check: t -> bool val checkSourceSeqIndex: t * int -> bool val checkProfileLabel: t -> (ProfileLabel.t -> bool) * (unit -> bool) val clear: t -> unit val layouts: t * (Layout.t -> unit) -> unit val layout: t -> Layout.t val modify: t -> {newProfileLabel: ProfileLabel.t -> ProfileLabel.t, delProfileLabel: ProfileLabel.t -> unit, getSourceMaps: unit -> t} end mlton-20210117+dfsg/mlton/atoms/sources.cm000066400000000000000000000040141416264345000203050ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature ADMITS_EQUALITY signature ATOMS signature CHAR_SIZE signature CONST signature C_FUNCTION signature C_TYPE signature HASH_TYPE signature ID signature INT_SIZE signature LABEL signature PRIM signature PRIM_CONS signature PRIM_TYCONS signature PROD signature PROFILE_LABEL signature REAL_SIZE signature REAL_X signature RECORD signature SYMBOL signature TYCON signature TYCON_KIND signature TYPE_OPS signature TYVAR signature WORD_SIZE signature WORD_X signature WORD_X_VECTOR structure LayoutPretty functor PrimCons functor PrimTycons functor Atoms functor Id functor GenericScheme functor HashType functor TypeOps is ../../lib/mlton/sources.cm ../control/sources.cm layout-pretty.sml char-size.sig char-size.fun int-size.sig int-size.fun real-size.sig real-size.fun word-size.sig word-size.fun word-x.sig word-x.fun word-x-vector.sig word-x-vector.fun real-x.sig real-x.fun c-symbol-scope.sig c-symbol-scope.fun c-type.sig c-type.fun c-symbol.sig c-symbol.fun c-function.sig c-function.fun const.sig const.fun symbol.sig symbol.fun field.sig field.fun record.sig record.fun id.sig id.fun tyvar.sig tyvar.fun admits-equality.sig admits-equality.fun tycon-kind.sig tycon-kind.fun prim-tycons.sig prim-tycons.fun tycon.sig tycon.fun prim-cons.sig prim-cons.fun (* Windows doesn't like files named con, so use con- instead. *) con-.sig con-.fun var.sig var.fun func.sig label.sig ffi.sig ffi.fun cases.sig cases.fun prim.sig prim.fun prod.sig prod.fun handler.sig handler.fun return.sig return.fun source-info.sig source-info.fun profile-label.sig profile-label.fun profile-exp.sig profile-exp.fun source-maps.sig source-maps.fun atoms.sig atoms.fun generic-scheme.sig generic-scheme.fun type-ops.sig type-ops.fun hash-type.sig hash-type.fun mlton-20210117+dfsg/mlton/atoms/sources.mlb000066400000000000000000000045531416264345000204700ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../control/sources.mlb layout-pretty.sml char-size.sig char-size.fun int-size.sig int-size.fun real-size.sig real-size.fun word-size.sig word-size.fun word-x.sig word-x.fun word-x-vector.sig word-x-vector.fun real-x.sig real-x.fun c-symbol-scope.sig c-symbol-scope.fun c-type.sig c-type.fun c-symbol.sig c-symbol.fun c-function.sig c-function.fun const.sig const.fun symbol.sig symbol.fun field.sig field.fun record.sig record.fun id.sig id.fun tyvar.sig tyvar.fun admits-equality.sig admits-equality.fun tycon-kind.sig tycon-kind.fun prim-tycons.sig prim-tycons.fun tycon.sig tycon.fun prim-cons.sig prim-cons.fun (* Windows doesn't like files named con, so use con- instead. *) con-.sig con-.fun var.sig var.fun func.sig label.sig ffi.sig ffi.fun cases.sig cases.fun prim.sig prim.fun prod.sig prod.fun handler.sig handler.fun return.sig return.fun source-info.sig source-info.fun profile-label.sig profile-label.fun profile-exp.sig profile-exp.fun source-maps.sig source-maps.fun atoms.sig atoms.fun generic-scheme.sig generic-scheme.fun type-ops.sig type-ops.fun hash-type.sig hash-type.fun in signature ADMITS_EQUALITY signature ATOMS signature CHAR_SIZE signature CONST signature C_FUNCTION signature C_TYPE signature HASH_TYPE signature ID signature INT_SIZE signature LABEL signature PRIM signature PRIM_CONS signature PRIM_TYCONS signature PROD signature PROFILE_LABEL signature REAL_SIZE signature REAL_X signature RECORD signature SYMBOL signature TYCON signature TYCON_KIND signature TYPE_OPS signature TYVAR signature WORD_SIZE signature WORD_X signature WORD_X_VECTOR structure LayoutPretty functor PrimCons functor PrimTycons functor Atoms functor Id functor GenericScheme functor HashType functor TypeOps end mlton-20210117+dfsg/mlton/atoms/symbol.fun000066400000000000000000000021111416264345000203140ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Symbol (S: SYMBOL_STRUCTS): SYMBOL = struct open S datatype t = T of {name: string, plist: PropertyList.t} local fun make f (T r) = f r in val plist = make #plist val name = make #name end val table: (string, t) HashTable.t = HashTable.new {equals = String.equals, hash = String.hash} fun fromString s = HashTable.lookupOrInsert (table, s, fn () => T {name = s, plist = PropertyList.new ()}) fun foreach f = HashTable.foreach (table, f) val toString = name val layout = Layout.str o toString fun equals (s, s') = PropertyList.equals (plist s, plist s') local fun make f (s, s') = f (name s, name s') in val op <= = make String.<= val compare = make String.compare end val asterisk = fromString "*" val bogus = fromString "" val equal = fromString "=" val itt = fromString "it" val unit = fromString "unit" end mlton-20210117+dfsg/mlton/atoms/symbol.sig000066400000000000000000000013751416264345000203210ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SYMBOL_STRUCTS = sig end signature SYMBOL = sig include SYMBOL_STRUCTS type t (* <= is alphabetical order *) val <= : t * t -> bool val asterisk: t val bogus: t val compare: t * t -> Relation.t val equal: t val equals: t * t -> bool val foreach: (t -> unit) -> unit val fromString: string -> t val itt: t val layout: t -> Layout.t val plist: t -> PropertyList.t val toString: t -> string val unit: t end mlton-20210117+dfsg/mlton/atoms/tycon-kind.fun000066400000000000000000000011011416264345000210640ustar00rootroot00000000000000(* Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TyconKind (S: TYCON_KIND_STRUCTS): TYCON_KIND = struct open S datatype t = Arity of int | Nary val layout = fn Arity n => Int.layout n | Nary => Layout.str "n-ary" val equals = fn (Arity n, Arity n') => n = n' | (Nary, Nary) => true | _ => false val equals = Trace.trace2 ("TyconKind.equals", layout, layout, Bool.layout) equals end mlton-20210117+dfsg/mlton/atoms/tycon-kind.sig000066400000000000000000000007351416264345000210720ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYCON_KIND_STRUCTS = sig end signature TYCON_KIND = sig include TYCON_KIND_STRUCTS datatype t = Arity of int | Nary val equals: t * t -> bool val layout: t -> Layout.t end mlton-20210117+dfsg/mlton/atoms/tycon.fun000066400000000000000000000022021416264345000201440ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Tycon (S: TYCON_STRUCTS): TYCON = struct open S structure Id = Id (val noname = "t") open Id structure P = PrimTycons (structure AdmitsEquality = AdmitsEquality structure CharSize = CharSize structure IntSize = IntSize structure Kind = Kind structure RealSize = RealSize structure WordSize = WordSize open Id) open P fun stats () = let open Layout in align (List.map (prims, fn {tycon = c, ...} => seq [layout c, str " size is ", IntInf.layout (MLton.size c), str " plist length is ", Int.layout (PropertyList.length (plist c))])) end (* quell unused warning *) val _ = stats end mlton-20210117+dfsg/mlton/atoms/tycon.sig000066400000000000000000000012751416264345000201470ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYCON_STRUCTS = sig structure AdmitsEquality: ADMITS_EQUALITY structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure Kind: TYCON_KIND structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature TYCON = sig include ID include PRIM_TYCONS sharing type t = tycon val stats: unit -> Layout.t end mlton-20210117+dfsg/mlton/atoms/type-ops.fun000066400000000000000000000052371416264345000206030ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TypeOps (S: TYPE_OPS_STRUCTS): TYPE_OPS = struct open S local open Tycon in structure RealSize = RealSize structure WordSize = WordSize end type realSize = RealSize.t type tycon = Tycon.t type wordSize = WordSize.t local fun nullary tycon = con (tycon, Vector.new0 ()) in val bool = nullary Tycon.bool val cpointer = nullary Tycon.cpointer val exn = nullary Tycon.exn val intInf = nullary Tycon.intInf val real = RealSize.memoize (fn s => nullary (Tycon.real s)) val thread = nullary Tycon.thread val word = WordSize.memoize (fn s => nullary (Tycon.word s)) end local fun unary tycon t = con (tycon, Vector.new1 t) in val array = unary Tycon.array val list = unary Tycon.list val reff = unary Tycon.reff val vector = unary Tycon.vector val weak = unary Tycon.weak end val word8 = word WordSize.word8 val word8Vector = vector word8 val word32 = word WordSize.word32 local fun binary tycon (t1, t2) = con (tycon, Vector.new2 (t1, t2)) in val arrow = binary Tycon.arrow end val arrow = Trace.trace ("TypeOps.arrow", Layout.tuple2 (layout, layout), layout) arrow fun deUnaryOpt tycon t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, tycon) then SOME (Vector.first ts) else NONE | _ => NONE fun deUnary tycon t = case deUnaryOpt tycon t of SOME t => t | NONE => Error.bug "TypeOps.deUnary" val deArray = deUnary Tycon.array val deRef = deUnary Tycon.reff val deVector = deUnary Tycon.vector val deWeak = deUnary Tycon.weak fun tuple ts = if 1 = Vector.length ts then Vector.first ts else con (Tycon.tuple, ts) val unit = tuple (Vector.new0 ()) fun deTupleOpt t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, Tycon.tuple) then SOME ts else NONE | NONE => NONE val isTuple = Option.isSome o deTupleOpt fun deTuple t = case deTupleOpt t of SOME t => t | NONE => Error.bug "TypeOps.deTuple" val unitRef = reff unit fun deArrowOpt t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, Tycon.arrow) then SOME (Vector.sub (ts, 0), Vector.sub (ts, 1)) else NONE | _ => NONE fun deArrow t = case deArrowOpt t of SOME x => x | NONE => Error.bug "TypeOps.deArrow" val deArrow = Trace.trace ("TypeOps.deArrow", layout, Layout.tuple2 (layout, layout)) deArrow end mlton-20210117+dfsg/mlton/atoms/type-ops.sig000066400000000000000000000030231416264345000205640ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYPE_OPS_STRUCTS = sig structure Tycon: TYCON type t val con: Tycon.t * t vector -> t val deConOpt: t -> (Tycon.t * t vector) option val layout: t -> Layout.t end signature TYPE_OPS = sig (* Don't want to include TYPE_OPS_STRUCTS because don't want to propagate * the Tycon structure, which will cause duplicate specifications later * on. *) type realSize type tycon type wordSize type t val array: t -> t val arrow: t * t -> t val bool: t val con: tycon * t vector -> t val cpointer: t val deArray: t -> t val deArrow: t -> t * t val deArrowOpt: t -> (t * t) option val deConOpt: t -> (tycon * t vector) option val deRef: t -> t val deTuple: t -> t vector val deTupleOpt: t -> t vector option val deVector: t -> t val deWeak: t -> t val exn: t val intInf: t val isTuple: t -> bool val list: t -> t val real: realSize -> t val reff: t -> t val thread: t val tuple: t vector -> t val unit: t val unitRef: t val vector: t -> t val weak: t -> t val word: wordSize -> t val word8: t val word8Vector: t val word32: t end mlton-20210117+dfsg/mlton/atoms/tyvar.fun000066400000000000000000000006221416264345000201610ustar00rootroot00000000000000(* Copyright (C) 2012,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Tyvar (S: TYVAR_STRUCTS): TYVAR = struct open S structure V = Id (val noname = "'a") open V end mlton-20210117+dfsg/mlton/atoms/tyvar.sig000066400000000000000000000005461416264345000201600ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYVAR_STRUCTS = sig end signature TYVAR = ID mlton-20210117+dfsg/mlton/atoms/unary-tycon.fun000066400000000000000000000011461416264345000213060ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor UnaryTycon(S: UNARY_TYCON_STRUCTS): UNARY_TYCON = struct open S datatype t = Ref | Array | Vector val toTycon = fn Ref => Tycon.reff | Array => Tycon.array | Vector => Tycon.vector val toString = fn Ref => "Ref" | Array => "Array" | Vector => "Vector" val equals: t * t -> bool = op = val layout = Layout.str o toString end mlton-20210117+dfsg/mlton/atoms/unary-tycon.sig000066400000000000000000000010741416264345000213000ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature UNARY_TYCON_STRUCTS = sig structure Tycon: TYCON end signature UNARY_TYCON = sig include UNARY_TYCON_STRUCTS datatype t = Ref | Array | Vector val toTycon: t -> Tycon.t val toString: t -> string val equals: t * t -> bool val layout: t -> Layout.t end mlton-20210117+dfsg/mlton/atoms/var.fun000066400000000000000000000005411416264345000176040ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Var (S: VAR_STRUCTS): VAR = struct open S structure V = Id (val noname = "x") open V end mlton-20210117+dfsg/mlton/atoms/var.sig000066400000000000000000000004661416264345000176040ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature VAR_STRUCTS = sig end signature VAR = ID mlton-20210117+dfsg/mlton/atoms/word-size.fun000066400000000000000000000071431416264345000207440ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor WordSize (S: WORD_SIZE_STRUCTS): WORD_SIZE = struct open S datatype t = T of Bits.t fun bits (T b) = b val toString = Bits.toString o bits val parse = let open Parse infix 1 >>= infix 3 *> in (peek (nextSat Char.isDigit) *> fromScan (Function.curry IntInf.scan StringCvt.DEC)) >>= (fn ii => pure (T (Bits.fromIntInf ii))) end fun compare (s, s') = Bits.compare (bits s, bits s') val {equals, ...} = Relation.compare compare fun fromBits (b: Bits.t): t = if Bits.>= (b, Bits.zero) then T b else Error.bug (concat ["WordSize.fromBits: strange word size: ", Bits.toString b]) fun isValidSize (i: int) = (1 <= i andalso i <= 32) orelse i = 64 val byte = fromBits (Bits.inByte) fun bigIntInfWord () = fromBits (Control.Target.Size.mplimb ()) fun cint () = fromBits (Control.Target.Size.cint ()) fun cpointer () = fromBits (Control.Target.Size.cpointer ()) fun cptrdiff () = fromBits (Control.Target.Size.cptrdiff ()) fun csize () = fromBits (Control.Target.Size.csize ()) fun objptr () = fromBits (Control.Target.Size.objptr ()) fun objptrHeader () = fromBits (Control.Target.Size.header ()) fun seqIndex () = fromBits (Control.Target.Size.seqIndex ()) fun smallIntInfWord () = objptr () val bool = fromBits (Bits.fromInt 32) val compareRes = fromBits (Bits.fromInt 32) val shiftArg = fromBits (Bits.fromInt 32) val word8 = fromBits (Bits.fromInt 8) val word16 = fromBits (Bits.fromInt 16) val word32 = fromBits (Bits.fromInt 32) val word64 = fromBits (Bits.fromInt 64) val allVector = Vector.tabulate (65, fn i => if isValidSize i then SOME (fromBits (Bits.fromInt i)) else NONE) val all: t list = Vector.toListKeepAllMap (allVector, fn so => so) val prims = List.map ([8, 16, 32, 64], fromBits o Bits.fromInt) fun hash (T b) = Hash.permute (Bits.hash b) val memoize: (t -> 'a) -> t -> 'a = fn f => let val v = Vector.map (allVector, fn opt => Option.map (opt, f)) in fn s => valOf (Vector.sub (v, Bits.toInt (bits s))) end fun roundUpToPrim s = let val bits = Bits.toInt (bits s) val bits = if bits <= 8 then 8 else if bits <= 16 then 16 else if bits <= 32 then 32 else if bits = 64 then 64 else Error.bug "WordSize.roundUpToPrim" in fromBits (Bits.fromInt bits) end val bytes: t -> Bytes.t = Bits.toBytes o bits fun cardinality s = IntInf.<< (1, Bits.toWord (bits s)) fun range (s, {signed}) = if signed then let val pow = IntInf.<< (1, Bits.toWord (bits s) - 0w1) in (~ pow, pow - 1) end else (0, cardinality s - 1) val min = #1 o range val max = #2 o range fun isInRange (s, i, sg) = let val (min, max) = range (s, sg) in min <= i andalso i <= max end datatype prim = W8 | W16 | W32 | W64 fun fromPrim p = case p of W8 => word8 | W16 => word16 | W32 => word32 | W64 => word64 fun primOpt (s: t): prim option = case Bits.toInt (bits s) of 8 => SOME W8 | 16 => SOME W16 | 32 => SOME W32 | 64 => SOME W64 | _ => NONE fun prim s = case primOpt s of NONE => Error.bug "WordSize.prim" | SOME p => p end mlton-20210117+dfsg/mlton/atoms/word-size.sig000066400000000000000000000027361416264345000207410ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature WORD_SIZE_STRUCTS = sig end signature WORD_SIZE = sig include WORD_SIZE_STRUCTS type t datatype prim = W8 | W16 | W32 | W64 val all: t list val bits: t -> Bits.t val bigIntInfWord: unit -> t val bool: t val bytes: t -> Bytes.t val byte: t val cardinality: t -> IntInf.t val cint: unit -> t val compare: t * t -> Relation.t val compareRes: t val cpointer: unit -> t val cptrdiff: unit -> t val csize: unit -> t val equals: t * t -> bool val fromBits: Bits.t -> t val fromPrim: prim -> t val hash: t -> word val isInRange: t * IntInf.t * {signed: bool} -> bool val max: t * {signed: bool} -> IntInf.t val min: t * {signed: bool} -> IntInf.t val memoize: (t -> 'a) -> t -> 'a val objptr: unit -> t val objptrHeader: unit -> t val parse: t Parse.t val primOpt: t -> prim option val prim: t -> prim val prims: t list val roundUpToPrim: t -> t val seqIndex: unit -> t val shiftArg: t val smallIntInfWord: unit -> t val toString: t -> string val word8: t val word16: t val word32: t val word64: t end mlton-20210117+dfsg/mlton/atoms/word-x-vector.fun000066400000000000000000000077121416264345000215430ustar00rootroot00000000000000(* Copyright (C) 2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor WordXVector (S: WORD_X_VECTOR_STRUCTS): WORD_X_VECTOR = struct open S datatype t = T of {elementSize: WordSize.t, elements: WordX.t vector} local fun make f (T r) = f r in val elementSize = make #elementSize val elements = make #elements end fun layout (T {elements, elementSize}) = let fun vector () = Layout.seq [Layout.str "#[", Layout.fill (Layout.separateRight (Vector.toListMap (elements, fn w => WordX.layout (w, {suffix = true})), ",")), Layout.str "]", Layout.str (":w" ^ WordSize.toString elementSize ^ "v")] fun string cs = Layout.seq [Layout.str "\"", Layout.str (String.escapeSML (String.implodeV cs)), Layout.str "\""] in if WordSize.equals (elementSize, WordSize.word8) then let val cs = Vector.map (elements, WordX.toChar) val l = Vector.length cs val n = Vector.fold (cs, 0, fn (c, n) => if Char.isGraph c orelse Char.isSpace c then n + 1 else n) in if l = 0 orelse (10 * n) div l > 9 then string cs else vector () end else vector () end val toString = Layout.toString o layout val parse = let open Parse infix 1 <|> >>= infix 3 *> in (spaces *> char Char.dquote *> many (fromScan Char.scan) >>= (fn cs => char Char.dquote *> pure (T {elements = Vector.fromListMap (cs, WordX.fromChar), elementSize = WordSize.byte}))) <|> (spaces *> str "#[" *> sepBy (WordX.parse, spaces *> str ",") >>= (fn ws => spaces *> str "]" *> str ":w" *> WordSize.parse >>= (fn s => str "v" *> pure (T {elements = Vector.fromList ws, elementSize = s})))) end val hash = String.hash o toString fun equals (v, v') = WordSize.equals (elementSize v, elementSize v') andalso Vector.equals (elements v, elements v', WordX.equals) fun compare (v, v') = if WordSize.equals (elementSize v, elementSize v') then case Int.compare (Vector.length (elements v), Vector.length (elements v')) of LESS => LESS | EQUAL => Vector.compare (elements v, elements v', fn (w, w') => WordX.compare (w, w', {signed = false})) | GREATER => GREATER else Error.bug "WordXVector.compare" fun le (v, v') = case compare (v, v') of LESS => true | EQUAL => true | GREATER => false fun foldFrom (v, start, b, f) = Vector.foldFrom (elements v, start, b, f) fun forall (v, f) = Vector.forall (elements v, f) fun fromVector ({elementSize}, v) = T {elementSize = elementSize, elements = v} fun fromList ({elementSize}, l) = T {elementSize = elementSize, elements = Vector.fromList l} fun fromListRev ({elementSize}, l) = T {elementSize = elementSize, elements = Vector.fromListRev l} fun fromString s = T {elementSize = WordSize.byte, elements = Vector.tabulate (String.size s, fn i => WordX.fromChar (String.sub (s, i)))} fun length v = Vector.length (elements v) fun sub (v, i) = Vector.sub (elements v, i) fun tabulate ({elementSize}, n, f) = T {elementSize = elementSize, elements = Vector.tabulate (n, f)} fun toListMap (v, f) = Vector.toListMap (elements v, f) fun toVectorMap (v, f) = Vector.map (elements v, f) end mlton-20210117+dfsg/mlton/atoms/word-x-vector.sig000066400000000000000000000025011416264345000215240ustar00rootroot00000000000000(* Copyright (C) 2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature WORD_X_VECTOR_STRUCTS = sig structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordSize = WordX.WordSize end signature WORD_X_VECTOR = sig include WORD_X_VECTOR_STRUCTS type t val compare: t * t -> order val elementSize: t -> WordSize.t val equals: t * t -> bool val foldFrom: t * int * 'b * (WordX.t * 'b -> 'b) -> 'b val forall: t * (WordX.t -> bool) -> bool val fromList: {elementSize: WordSize.t} * WordX.t list -> t val fromListRev: {elementSize: WordSize.t} * WordX.t list -> t val fromString: string -> t val fromVector: {elementSize: WordSize.t} * WordX.t vector -> t val hash : t -> word val layout: t -> Layout.t val le : t * t -> bool val length: t -> int val parse: t Parse.t val sub: t * int -> WordX.t val tabulate: {elementSize: WordSize.t} * int * (int -> WordX.t) -> t val toListMap: t * (WordX.t -> 'a) -> 'a list val toVectorMap: t * (WordX.t -> 'a) -> 'a vector val toString: t -> string end mlton-20210117+dfsg/mlton/atoms/word-x.fun000066400000000000000000000131401416264345000202330ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor WordX (S: WORD_X_STRUCTS): WORD_X = struct open S val modulus: WordSize.t -> IntInf.t = fn s => IntInf.<< (1, Bits.toWord (WordSize.bits s)) local datatype t = T of {size: WordSize.t, value: IntInf.t} in type t = t fun make (i: IntInf.t, s: WordSize.t) = T {size = s, value = i mod modulus s} fun dest (T r) = r end local fun make f = f o dest in val size = make #size val value = make #value end val toIntInf = value fun toIntInfX w = let val v = value w val m = modulus (size w) in if v >= m div 2 then v - m else v end fun toIntInfSg (w, {signed}) = if signed then toIntInfX w else toIntInf w val toInt = IntInf.toInt o toIntInf fun toString (w, {suffix}) = let val doit = if suffix then fn (w, s) => w ^ s () else fn (w, _) => w in doit ("0x" ^ IntInf.format (toIntInf w, StringCvt.HEX), fn () => ":w" ^ WordSize.toString (size w)) end val layout = Layout.str o toString val parse = let open Parse infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> in spaces *> str "0x" *> (peek (nextSat Char.isHexDigit) *> fromScan (Function.curry IntInf.scan StringCvt.HEX)) >>= (fn i => str ":w" *> WordSize.parse >>= (fn s => pure (make (i, s)))) end fun zero s = make (0, s) val hash = IntInf.hash o toIntInf local val make: (IntInf.t * Word.t -> IntInf.t) -> t * t -> t = fn f => fn (w, w') => let val s = size w val v' = value w' in if v' >= Bits.toIntInf (WordSize.bits s) then zero s else make (f (value w, Word.fromIntInf v'), s) end in val lshift = make IntInf.<< val >> = make IntInf.~>> (* OK because we know the value is positive. *) end fun equals (w, w') = WordSize.equals (size w, size w') andalso value w = value w' val fromIntInf = make fun fromBits (b, ws) = make (Bits.toIntInf b, ws) fun fromBytes (b, ws) = make (Bytes.toIntInf b, ws) fun fromInt (i, ws) = make (Int.toIntInf i, ws) fun fromChar (c: Char.t) = fromInt (Char.toInt c, WordSize.byte) fun fromWord (w, ws) = make (Word.toIntInf w, ws) fun isAllOnes w = value w = modulus (size w) - 1 fun isOne w = 1 = value w fun isZero w = 0 = value w fun isNegOne w = ~1 = toIntInfX w local fun make f (s, sg) = fromIntInf (f (s, sg), s) in val max = make WordSize.max val min = make WordSize.min end fun allOnes s = max (s, {signed = false}) local fun make f (w, sg) = equals (w, f (size w, sg)) in val isMax = make max val isMin = make min end fun notb w = make (IntInf.notb (value w), size w) fun one s = make (1, s) fun resize (w, s) = make (toIntInf w, s) fun resizeX (w, s) = make (toIntInfX w, s) fun resizeSg (w, s, {signed}) = if signed then resizeX (w, s) else resize (w, s) fun toChar (w: t): char = Char.fromInt (Int.fromIntInf (value w)) fun ~>> (w, w') = let val shift = value w' val s = size w val b = WordSize.bits s val shift = if shift > Bits.toIntInf b then Bits.toWord b else Word.fromIntInf shift in make (IntInf.~>> (toIntInfX w, shift), s) end fun rshift (w, w', {signed}) = if signed then ~>> (w, w') else >> (w, w') fun swap (i: IntInf.t, {hi: word, lo: word}) = let open IntInf in orb (~>> (i, lo), << (i mod << (1, lo), hi)) end fun rol (w, w') = let val s = size w val b = WordSize.bits s val shift = Word.fromIntInf (value w' mod Bits.toIntInf b) in make (swap (value w, {hi = shift, lo = Bits.toWord b - shift}), s) end fun ror (w, w') = let val s = size w val b = WordSize.bits s val shift = Word.fromIntInf (value w' mod Bits.toIntInf b) in make (swap (value w, {hi = Bits.toWord b - shift, lo = shift}), s) end local val make: ((IntInf.t * IntInf.t -> IntInf.t) * string) -> t * t -> t = fn (f,name) => fn (w, w') => if WordSize.equals (size w, size w') then make (f (value w, value w'), size w) else Error.bug (concat ["WordX.", name]) in val add = make (IntInf.+, "add") val sub = make (IntInf.-, "sub") val andb = make (IntInf.andb, "andb") val orb = make (IntInf.orb, "orb") val xorb = make (IntInf.xorb, "xorb") end fun neg w = make (~ (toIntInfX w), size w) local val make: ((IntInf.t * IntInf.t -> IntInf.t) * string) -> t * t * {signed: bool}-> t = fn (f,name) => fn (w, w', s) => if WordSize.equals (size w, size w') then make (f (toIntInfSg (w, s), toIntInfSg (w', s)), size w) else Error.bug (concat ["WordX.", name]) in val op div = make (IntInf.div, "div") val op mod = make (IntInf.mod, "mod") val mul = make (IntInf.*, "mul") val quot = make (IntInf.quot, "quot") val rem = make (IntInf.rem, "rem") end local val make: ((IntInf.t * IntInf.t -> 'a) * string) -> t * t * {signed: bool} -> 'a = fn (f,name) => fn (w, w', sg) => if WordSize.equals (size w, size w') then f (toIntInfSg (w, sg), toIntInfSg (w', sg)) else Error.bug (concat ["WordX.", name]) in val compare = make (IntInf.compare, "compare") val lt = make (IntInf.<, "lt") val le = make (IntInf.<=, "le") val gt = make (IntInf.>, "gt") val ge = make (IntInf.>=, "ge") end end mlton-20210117+dfsg/mlton/atoms/word-x.sig000066400000000000000000000045511416264345000202330ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature WORD_X_STRUCTS = sig structure WordSize: WORD_SIZE end signature WORD_X = sig include WORD_X_STRUCTS (* Words of all WordSize.t sizes. *) type t val add: t * t -> t val allOnes: WordSize.t -> t val andb: t * t -> t val compare: t * t * {signed: bool} -> order val div: t * t * {signed: bool} -> t val equals: t * t -> bool val fromBits: Bits.t * WordSize.t -> t val fromBytes: Bytes.t * WordSize.t -> t val fromChar: char -> t (* returns a word of size 8 *) val fromInt: int * WordSize.t -> t val fromIntInf: IntInf.t * WordSize.t -> t val fromWord: word * WordSize.t -> t val ge: t * t * {signed: bool} -> bool val gt: t * t * {signed: bool} -> bool val hash: t -> word val isAllOnes: t -> bool val isOne: t -> bool val isMax: t * {signed: bool} -> bool val isMin: t * {signed: bool} -> bool val isNegOne: t -> bool val isZero: t -> bool val layout: t * {suffix: bool} -> Layout.t val le: t * t * {signed: bool} -> bool val lshift: t * t -> t val lt: t * t * {signed: bool} -> bool val max: WordSize.t * {signed: bool} -> t val min: WordSize.t * {signed: bool} -> t val mod: t * t * {signed: bool} -> t val mul: t * t * {signed: bool} -> t val neg: t -> t val notb: t -> t val one: WordSize.t -> t val orb: t * t -> t val parse: t Parse.t val quot: t * t * {signed: bool} -> t val rem: t * t * {signed: bool} -> t val resizeSg: t * WordSize.t * {signed: bool} -> t val resize: t * WordSize.t -> t val resizeX: t * WordSize.t -> t val rol: t * t -> t val ror: t * t -> t val rshift : t * t * {signed: bool} -> t val size: t -> WordSize.t val sub: t * t -> t val toChar: t -> char val toInt: t -> int val toIntInfSg: t * {signed: bool} -> IntInf.t val toIntInf: t -> IntInf.t val toIntInfX: t -> IntInf.t val toString: t * {suffix: bool} -> string val xorb: t * t -> t val zero: WordSize.t -> t end mlton-20210117+dfsg/mlton/backend/000077500000000000000000000000001416264345000165465ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/backend/allocate-variables.fun000066400000000000000000000615641416264345000230260ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AllocateVariables (S: ALLOCATE_VARIABLES_STRUCTS): ALLOCATE_VARIABLES = struct open S structure R = Rssa local open Rssa in structure Func = Func structure Function = Function structure Kind = Kind structure Label = Label structure Live = Live structure Type = Type structure Var = Var end local open Machine in structure CType = CType structure Operand = Operand structure Runtime = Runtime structure StackOffset = StackOffset structure Temporary = Temporary end structure Allocation: sig structure Temporaries: sig type t val get: t * Type.t -> Temporary.t val empty: unit -> t end structure Stack: sig type t val get: t * Type.t -> t * {offset: Bytes.t} val layout: t -> Layout.t val new: StackOffset.t list -> t val size: t -> Bytes.t end type t val getTemporary: t * Type.t -> Temporary.t val getStack: t * Type.t -> {offset: Bytes.t} val layout: t -> Layout.t val new: StackOffset.t list * Temporary.t list -> t val stack: t -> Stack.t val stackSize: t -> Bytes.t end = struct structure Stack = struct (* Keep a list of allocated slots sorted in increasing order of offset. *) datatype t = T of {offset: Bytes.t, size: Bytes.t} list fun layout (T alloc) = List.layout (fn {offset, size} => Layout.record [("offset", Bytes.layout offset), ("size", Bytes.layout size)]) alloc fun size (T alloc) = case alloc of [] => Bytes.zero | _ => let val {offset, size} = List.last alloc in Bytes.+ (offset, size) end fun new (alloc): t = let val a = Array.fromListMap (alloc, fn StackOffset.T {offset, ty} => {offset = offset, size = Type.bytes ty}) val () = QuickSort.sortArray (a, fn (t, t') => Bytes.<= (#offset t, #offset t')) fun loop (alloc, ac) = case alloc of [] => List.rev ac | [a] => List.rev (a::ac) | (a1 as {offset = offset1, size = size1})::(a2 as {offset = offset2, size = size2})::alloc => if Bytes.equals (Bytes.+ (offset1, size1), offset2) then loop ({offset = offset1, size = Bytes.+ (size1, size2)}::alloc, ac) else loop (a2::alloc, a1::ac) in T (loop (Array.toList a, [])) end fun get (T alloc, ty) = let val slotSize = Type.bytes ty fun loop (alloc, a as {offset, size}, ac) = let val prevEnd = Bytes.+ (offset, size) val begin = Type.align (ty, prevEnd) fun coalesce () = if Bytes.equals (prevEnd, begin) then ({offset = offset, size = Bytes.+ (size, slotSize)}, ac) else ({offset = begin, size = slotSize}, a :: ac) in case alloc of [] => let val (a, ac) = coalesce () in (T (rev (a :: ac)), {offset = begin}) end | (a' as {offset, size}) :: alloc => if Bytes.> (Bytes.+ (begin, slotSize), offset) then loop (alloc, a', if Bytes.isZero offset andalso Bytes.isZero size then ac else a :: ac) else let val (a'' as {offset = o', size = s'}, ac) = coalesce () val alloc = List.appendRev (ac, if Bytes.equals (Bytes.+ (o', s'), offset) then {offset = o', size = Bytes.+ (size, s')} :: alloc else a'' :: a' :: alloc) in (T alloc, {offset = begin}) end end in loop (alloc, {offset = Bytes.zero, size = Bytes.zero}, []) end val get = Trace.trace2 ("AllocateVariables.Allocation.Stack.get", layout, Type.layout, Layout.tuple2 (layout, fn {offset} => Layout.record [("offset", Bytes.layout offset)])) get end structure Temporaries = struct (* A temporary allocation keeps track of the temporaries that have * already been allocated, for each runtime type. The reason that * we associate them with runtime types rather than Rssa types is * that the temporary indices that the codegens use are based on * runtime types. *) datatype t = T of CType.t -> {alloc: Temporary.t list, next: int} ref fun layout (T f) = List.layout (fn t => let val {alloc, next} = ! (f t) in Layout.record [("ty", CType.layout t), ("next", Int.layout next), ("alloc", List.layout Temporary.layout alloc)] end) CType.all fun compress {next, alloc} = let fun loop (next, alloc) = let fun done () = {alloc = alloc, next = next} in case alloc of [] => done () | t :: alloc => if next = Temporary.index t then loop (next + 1, alloc) else done () end in loop (next, alloc) end fun new (ts: Temporary.t list): t = let fun sameType (t, t') = CType.equals (Type.toCType (Temporary.ty t), Type.toCType (Temporary.ty t')) val tss = List.equivalence (ts, sameType) in T (CType.memo (fn ty => case List.peek (tss, fn ts => case ts of [] => false | t :: _ => CType.equals (ty, Type.toCType (Temporary.ty t))) of NONE => ref {alloc = [], next = 0} | SOME ts => ref (compress {next = 0, alloc = QuickSort.sortList (ts, fn (t, t') => Temporary.index t <= Temporary.index t')}))) end fun empty () = new [] fun get (T f, ty: Type.t) = let val t = Type.toCType ty val r = f t val {alloc, next} = !r val temp = Temporary.new (ty, SOME next) val _ = r := compress {alloc = alloc, next = next + 1} in temp end end datatype t = T of {temporaries: Temporaries.t, stack: Stack.t ref} local fun make s (T x) = s x in val stack = ! o (make #stack) val stackSize = Stack.size o stack end fun layout (T {temporaries, stack}) = Layout.record [("stack", Stack.layout (!stack)), ("temporaries", Temporaries.layout temporaries)] fun getStack (T {stack, ...}, ty) = let val (s, offset) = Stack.get (!stack, ty) val _ = stack := s in offset end fun getTemporary (T {temporaries, ...}, ty) = Temporaries.get (temporaries, ty) fun new (stack, temporaries) = T {temporaries = Temporaries.new temporaries, stack = ref (Stack.new stack)} end structure Info = struct type t = {live: Operand.t vector, liveNoFormals: Operand.t vector, size: Bytes.t} fun layout ({live, liveNoFormals, size, ...}: t) = Layout.record [("live", Vector.layout Operand.layout live), ("liveNoFormals", Vector.layout Operand.layout liveNoFormals), ("size", Bytes.layout size)] end (* ------------------------------------------------- *) (* allocate *) (* ------------------------------------------------- *) fun allocate {function = f: Rssa.Function.t, paramOffsets, varInfo: Var.t -> {operand: Machine.Operand.t option ref option, ty: Type.t}} = let fun diagnostics f = Control.diagnostics (fn display => let open Layout fun diagVar (x: Var.t): unit = display (seq [Var.layout x, str " ", Option.layout (fn r => Option.layout Operand.layout (!r)) (#operand (varInfo x))]) fun diagStatement (s: R.Statement.t): unit = R.Statement.foreachDef (s, diagVar o #1) in f (display, diagVar, diagStatement) end) val _ = Control.diagnostic (fn () => let open Layout in seq [str "Function allocs for ", Func.layout (Function.name f)] end) val {labelLive, remLabelLive} = Live.live (f, {shouldConsider = isSome o #operand o varInfo}) val {args, blocks, name, ...} = Function.dest f (* * Decide which variables will live in stack slots and which * will live in temporaries. * Initially, * - all variables are put in a temporary. * Variables get moved to the stack if they are * - live at the beginning of a Cont block; such variables are * live while the frame is suspended during a non-tail call * and must be stack allocated to be traced during a GC * - live at the beginning of a CReturn block that mayGC; such * variables are live while the frame is suspended during a * C call and must be stack allocated to be traced during * the potential GC * Both of the above are indiced by * Kind.frameStyle kind = Kind.OffsetsAndSize *) datatype place = Stack | Temporary val {get = place: Var.t -> place ref, rem = removePlace, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref Temporary)) (* The arguments for each Handler block in the function. *) val handlersArgs: (Var.t * Type.t) vector list ref = ref [] fun forceStack (x: Var.t): unit = place x := Stack val _ = Vector.foreach (blocks, fn R.Block.T {args, kind, label, ...} => let val {beginNoFormals, ...} = labelLive label val _ = case Kind.frameStyle kind of Kind.None => () | Kind.OffsetsAndSize => Vector.foreach (beginNoFormals, forceStack) | Kind.SizeOnly => () val _ = case kind of Kind.Handler => List.push (handlersArgs, args) | _ => () in () end) fun allocateVar (x: Var.t, a: Allocation.t): unit = let val {operand, ty} = varInfo x in if isSome operand then let val oper = case ! (place x) of Stack => let val {offset} = Allocation.getStack (a, ty) in Operand.StackOffset (StackOffset.T {offset = offset, ty = ty}) end | Temporary => Operand.Temporary (Allocation.getTemporary (a, ty)) val () = removePlace x val _ = case operand of NONE => () | SOME r => r := SOME oper in () end else () end val allocateVar = Trace.trace2 ("AllocateVariables.allocateVar", Var.layout, Allocation.layout, Unit.layout) allocateVar fun getOperand (x: Var.t): Operand.t = case #operand (varInfo x) of NONE => Error.bug (concat ["AllocateVariables.getOperand: ", "#operand (varInfo ", Var.toString x, ") = NONE"]) | SOME r => (case !r of NONE => Error.bug (concat ["AllocateVariables.getOperand: ", "! (valOf (#operand (varInfo ", Var.toString x, "))) = NONE"]) | SOME oper => oper) val getOperand = Trace.trace ("AllocateVariables.getOperand", Var.layout, Operand.layout) getOperand fun getOperands (xs: Var.t vector): Operand.t vector = Vector.map (xs, getOperand) val getOperands = Trace.trace ("AllocateVariables.getOperands", Vector.layout Var.layout, Vector.layout Operand.layout) getOperands val {get = labelInfo: R.Label.t -> Info.t, set = setLabelInfo, ...} = Property.getSetOnce (R.Label.plist, Property.initRaise ("labelInfo", R.Label.layout)) val setLabelInfo = Trace.trace2 ("AllocateVariables.setLabelInfo", R.Label.layout, Info.layout, Unit.layout) setLabelInfo (* Allocate stacks slots and/or temporaries for the formals. * Don't use `allocateVar`, because a stack formal * should use the stack slot of the incoming actual. *) val () = let val temps = Allocation.Temporaries.empty () in Vector.foreach2 (args, paramOffsets args, fn ((x, ty), so) => let val oper = case ! (place x) of Stack => Operand.StackOffset (StackOffset.T so) | Temporary => Operand.Temporary (Allocation.Temporaries.get (temps, ty)) val () = removePlace x val () = valOf (#operand (varInfo x)) := SOME oper in () end) end (* Also, create a stack allocation that includes all incoming actuals; * if link, handler label, and handler args stack slots are required, * then they will be allocated against this stack. *) val stack = Allocation.Stack.new (Vector.toListMap (paramOffsets args, StackOffset.T)) val handlersInfo = case !handlersArgs of [] => NONE | handlersArgs => let (* Choose fixed and permanently allocated stack slots * that do not conflict with incoming actuals. *) val (stack, {offset = linkOffset, ...}) = Allocation.Stack.get (stack, Type.exnStack ()) val (_, {offset = handlerOffset, ...}) = Allocation.Stack.get (stack, Type.label (Label.newNoname ())) val handlerArgsOffset = Bytes.align (Bytes.+ (handlerOffset, Runtime.labelSize ()), {alignment = (case !Control.align of Control.Align4 => Bytes.inWord32 | Control.Align8 => Bytes.inWord64)}) val handlerArgsSize = List.fold (handlersArgs, Bytes.zero, fn (args, maxSize) => Vector.fold (paramOffsets args, maxSize, fn ({offset, ty}, maxSize) => Bytes.max (maxSize, Bytes.+ (offset, Type.bytes ty)))) val handlerOffset = Bytes.- (handlerArgsOffset, Runtime.labelSize ()) in SOME {handlerArgsOffset = handlerArgsOffset, handlerArgsSize = handlerArgsSize, handlerOffset = handlerOffset, linkOffset = linkOffset} end (* Do a DFS of the control-flow graph. *) val () = Function.dfs (f, fn R.Block.T {args, label, kind, statements, ...} => let val {begin, beginNoFormals, handler = handlerLive, link = linkLive} = labelLive label val () = remLabelLive label fun addHS (ops: Operand.t vector): Operand.t vector = case handlersInfo of NONE => ops | SOME {handlerOffset, linkOffset, ...} => let val extra = [] val extra = case handlerLive of NONE => extra | SOME h => Operand.stackOffset {offset = handlerOffset, ty = Type.label h} :: extra val extra = if linkLive then Operand.stackOffset {offset = linkOffset, ty = Type.exnStack ()} :: extra else extra in Vector.concat [Vector.fromList extra, ops] end val liveNoFormals = getOperands beginNoFormals val (stackInit, temporariesInit) = Vector.fold (liveNoFormals, ([],[]), fn (oper, (stack, temporaries)) => case oper of Operand.StackOffset s => (s::stack, temporaries) | Operand.Temporary t => (stack, t::temporaries) | _ => (stack, temporaries)) val stackInit = case handlersInfo of NONE => stackInit | SOME {handlerArgsOffset, handlerArgsSize, handlerOffset, linkOffset, ...} => StackOffset.T {offset = linkOffset, ty = Type.exnStack ()} :: StackOffset.T {offset = handlerOffset, ty = Type.label (Label.newNoname ())} :: (if (Bytes.> (handlerArgsSize, Bytes.zero)) then StackOffset.T {offset = handlerArgsOffset, ty = Type.bits (Bytes.toBits handlerArgsSize)} :: stackInit else stackInit) val a = Allocation.new (stackInit, temporariesInit) val size = case kind of Kind.Handler => (case handlersInfo of NONE => Error.bug "AllocateVariables.allocate: Handler with no handler offset" | SOME {handlerOffset, ...} => Bytes.+ (handlerOffset, Runtime.labelSize ())) | _ => Bytes.align (Bytes.+ (Allocation.stackSize a, Runtime.labelSize ()), {alignment = (case !Control.align of Control.Align4 => Bytes.inWord32 | Control.Align8 => Bytes.inWord64)}) val _ = if Bytes.isAligned (size, {alignment = (case !Control.align of Control.Align4 => Bytes.inWord32 | Control.Align8 => Bytes.inWord64)}) then () else Error.bug (concat ["AllocateVariables.allocate: ", "bad size ", Bytes.toString size, " in ", Label.toString label]) val _ = Vector.foreach (args, fn (x, _) => if Vector.exists (begin, fn y => Var.equals (x, y)) then allocateVar (x, a) else ()) (* Must compute live after allocateVar'ing the args, since that * sets the operands for the args. *) val live = getOperands begin fun one (var, _) = allocateVar (var, a) val _ = Vector.foreach (statements, fn statement => R.Statement.foreachDef (statement, one)) val _ = setLabelInfo (label, {live = addHS live, liveNoFormals = addHS liveNoFormals, size = size}) in fn () => () end) val () = diagnostics (fn (display, diagVar, diagStatement) => let open Layout val _ = display (seq [str "function ", Func.layout name, str " handlersInfo ", Option.layout (fn {handlerArgsOffset, handlerArgsSize, handlerOffset, linkOffset, ...} => record [("handlerArgsOffset", Bytes.layout handlerArgsOffset), ("handlerArgsSize", Bytes.layout handlerArgsSize), ("handlerOffset", Bytes.layout handlerOffset), ("linkOffset", Bytes.layout linkOffset)]) handlersInfo]) val _ = Vector.foreach (args, diagVar o #1) val _ = Vector.foreach (blocks, fn R.Block.T {label, args, statements, ...} => let val {live, ...} = labelInfo label val () = display (R.Label.layout label) val () = display (seq [str "live: ", Vector.layout Operand.layout live]) val () = Vector.foreach (args, diagVar o #1) val () = Vector.foreach (statements, diagStatement) in () end) in () end) in {handlersInfo = Option.map (handlersInfo, fn {handlerOffset, linkOffset, ...} => {handlerOffset = handlerOffset, linkOffset = linkOffset}), labelInfo = labelInfo} end val allocate = Trace.trace ("AllocateVariables.allocate", fn {function, ...} => Func.layout (Function.name function), Layout.ignore) allocate end mlton-20210117+dfsg/mlton/backend/allocate-variables.sig000066400000000000000000000036721416264345000230140ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ALLOCATE_VARIABLES_STRUCTS = sig structure Rssa: RSSA structure Machine: MACHINE sharing Rssa.BackendAtoms = Machine.BackendAtoms end signature ALLOCATE_VARIABLES = sig include ALLOCATE_VARIABLES_STRUCTS val allocate: {function: Rssa.Function.t, paramOffsets: (Rssa.Var.t * Rssa.Type.t) vector -> {offset: Bytes.t, ty: Rssa.Type.t} vector, varInfo: Rssa.Var.t -> { (* If (isSome operand) then a stack slot or * temporary needs to be allocated for the * variable. *) operand: Machine.Operand.t option ref option, ty: Machine.Type.t } } -> {(* If handlers are used, handlersInfo gives the stack offsets * where the handler and link (old exnStack) should be stored. *) handlersInfo: {handlerOffset: Bytes.t, linkOffset: Bytes.t} option, labelInfo: Rssa.Label.t -> {(* Live operands at the beginning of the block. *) live: Machine.Operand.t vector, (* Live operands at the beginning of the block, * excepting its formals. *) liveNoFormals: Machine.Operand.t vector, (* Size of frame including return address. *) size: Bytes.t}} end mlton-20210117+dfsg/mlton/backend/backend-atoms.fun000066400000000000000000000027451416264345000220000ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor BackendAtoms (S: BACKEND_ATOMS_STRUCTS): BACKEND_ATOMS = struct structure BackendAtoms = struct open S structure Runtime = Runtime () structure ObjptrTycon = ObjptrTycon (structure RealSize = RealSize structure Runtime = Runtime structure WordSize = WordSize structure WordX = WordX) structure RepType = RepType (structure CFunction = CFunction structure CType = CType structure Const = Const structure Label = Label structure ObjptrTycon = ObjptrTycon structure Prim = Prim structure Prod = Prod structure RealSize = RealSize structure RealX = RealX structure Runtime = Runtime structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector) structure ObjectType = RepType.ObjectType structure Type = RepType end open BackendAtoms end mlton-20210117+dfsg/mlton/backend/backend-atoms.sig000066400000000000000000000034141416264345000217640ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature BACKEND_ATOMS_STRUCTS = sig include ATOMS end signature BACKEND_ATOMS' = sig include BACKEND_ATOMS_STRUCTS structure ObjectType: OBJECT_TYPE structure ObjptrTycon: OBJPTR_TYCON structure Runtime: RUNTIME structure Type: REP_TYPE sharing ObjectType = Type.ObjectType sharing ObjptrTycon = ObjectType.ObjptrTycon = Type.ObjptrTycon sharing Runtime = ObjectType.Runtime = Type.Runtime (* SML/NJ bug: * * `sharing Atoms = Type` * * should suffice, instead of the following enumeration, * but leads to `implied type sharing violation` errors; * the sharing of `Atoms` and `Type` seems to "forget" * the components of `Atoms` not present in `Type`. *) (* sharing Atoms = Type *) sharing CFunction = Type.CFunction sharing CType = Type.CType sharing Const = Type.Const sharing Label = Type.Label sharing Prim = Type.Prim sharing Prod = Type.Prod sharing RealSize = ObjptrTycon.RealSize = RealX.RealSize = Type.RealSize sharing RealX = Type.RealX sharing WordSize = ObjptrTycon.WordSize = Type.WordSize = WordX.WordSize sharing WordX = ObjptrTycon.WordX = Type.WordX sharing WordXVector = Type.WordXVector end signature BACKEND_ATOMS = sig structure BackendAtoms: BACKEND_ATOMS' include BACKEND_ATOMS' sharing Atoms = BackendAtoms.Atoms sharing ObjectType = BackendAtoms.ObjectType sharing ObjptrTycon = BackendAtoms.ObjptrTycon sharing Runtime = BackendAtoms.Runtime sharing Type = BackendAtoms.Type end mlton-20210117+dfsg/mlton/backend/backend.fun000066400000000000000000001653641416264345000206660ustar00rootroot00000000000000(* Copyright (C) 2009,2013-2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Backend (S: BACKEND_STRUCTS): BACKEND = struct open S structure M = Machine local open Machine in structure CFunction = CFunction structure Label = Label structure Live = Live structure ObjptrTycon = ObjptrTycon structure RealX = RealX structure Runtime = Runtime structure StackOffset = StackOffset structure StaticHeap = StaticHeap structure Temporary = Temporary structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector end local open Runtime in structure GCField = GCField end structure R = Rssa local open Rssa in structure CType = CType structure Const = Const structure Func = Func structure Function = Function structure Object = Object structure ObjectType = ObjectType structure Prim = Prim structure Prod = Prod structure Type = Type structure Var = Var end structure AllocateVariables = AllocateVariables (structure Machine = Machine structure Rssa = Rssa) structure Chunkify = Chunkify (Rssa) structure ParallelMove = ParallelMove () structure VarOperand = struct datatype t = Allocate of {operand: M.Operand.t option ref} | Const of M.Operand.t fun layout i = let open Layout in case i of Allocate {operand, ...} => seq [str "Allocate ", record [("operand", Option.layout M.Operand.layout (!operand))]] | Const oper => seq [str "Const ", M.Operand.layout oper] end val operand: t -> M.Operand.t option = fn Allocate {operand, ...} => !operand | Const oper => SOME oper end structure ByteSet = UniqueSet (val cacheSize: int = 1 val bits: int = 14 structure Element = struct open Bytes end) structure Chunk = struct datatype t = T of {blocks: M.Block.t list ref, chunkLabel: M.ChunkLabel.t} fun label (T {chunkLabel, ...}) = chunkLabel fun new (): t = T {blocks = ref [], chunkLabel = M.ChunkLabel.newNoname ()} fun newBlock (T {blocks, ...}, z) = List.push (blocks, M.Block.T z) end val traceGenBlock = Trace.trace ("Backend.genBlock", Label.layout o R.Block.label, Unit.layout) fun eliminateDeadCode (f: R.Function.t): R.Function.t = let val {args, blocks, name, returns, raises, start} = R.Function.dest f val {get, rem, set, ...} = Property.getSetOnce (Label.plist, Property.initConst false) val get = Trace.trace ("Backend.labelIsReachable", Label.layout, Bool.layout) get val _ = R.Function.dfs (f, fn R.Block.T {label, ...} => (set (label, true) ; fn () => ())) val blocks = Vector.keepAll (blocks, fn R.Block.T {label, ...} => let val res = get label val () = rem label in res end) in R.Function.new {args = args, blocks = blocks, name = name, returns = returns, raises = raises, start = start} end fun toMachine (rssa: Rssa.Program.t) = let val R.Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics} = rssa (* tyconTy *) fun tyconTy tycon = Vector.sub (objectTypes, ObjptrTycon.index tycon) (* returnsTo and raisesTo info *) val rflow = R.Program.rflow rssa (* Chunk info *) val {get = labelChunk, set = setLabelChunk, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelChunk", Label.layout)) val {get = funcChunk: Func.t -> Chunk.t, set = setFuncChunk, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcChunk", Func.layout)) val chunks = ref [] fun newChunk () = let val c = Chunk.new () val _ = List.push (chunks, c) in c end (* Set funcChunk and labelChunk. *) val _ = Vector.foreach (Chunkify.chunkify rssa, fn {funcs, labels} => let val c = newChunk () val _ = Vector.foreach (funcs, fn f => setFuncChunk (f, c)) val _ = Vector.foreach (labels, fn l => setLabelChunk (l, c)) in () end) (* Profile info *) val (sourceMaps, getFrameSourceSeqIndex) = case profileInfo of NONE => (NONE, fn _ => NONE) | SOME {sourceMaps, getFrameSourceSeqIndex} => (SOME sourceMaps, getFrameSourceSeqIndex) (* Frame info *) local val frameInfos: M.FrameInfo.t list ref = ref [] val nextFrameInfo = Counter.generator 0 val _ = ByteSet.reset () val table = let fun equals ({kind = k1, frameOffsets = fo1, size = s1, sourceSeqIndex = ssi1}, {kind = k2, frameOffsets = fo2, size = s2, sourceSeqIndex = ssi2}) = M.FrameInfo.Kind.equals (k1, k2) andalso M.FrameOffsets.equals (fo1, fo2) andalso Bytes.equals (s1, s2) andalso Option.equals (ssi1, ssi2, Int.equals) fun hash {kind, frameOffsets, size, sourceSeqIndex} = Hash.list [M.FrameInfo.Kind.hash kind, M.FrameOffsets.hash frameOffsets, Bytes.hash size, Hash.optionMap (sourceSeqIndex, Word.fromInt)] in HashTable.new {equals = equals, hash = hash} end val frameOffsets: M.FrameOffsets.t list ref = ref [] val nextFrameOffset = Counter.generator 0 val {get = getFrameOffsets: ByteSet.t -> M.FrameOffsets.t, ...} = Property.get (ByteSet.plist, Property.initFun (fn offsets => let val index = nextFrameOffset () val offsets = QuickSort.sortVector (Vector.fromList (ByteSet.toList offsets), Bytes.<=) val fo = M.FrameOffsets.new {index = index, offsets = offsets} val _ = List.push (frameOffsets, fo) in fo end)) in fun allFrameInfo chunks = let (* Reverse lists because the index is from back of list. *) val frameInfos = Vector.fromListRev (!frameInfos) val frameOffsets = Vector.fromListRev (!frameOffsets) (* If we are using the C or LLVM codegens, then we reindex the * frameInfos so that the indices of the entry frames of a chunk * are consecutive integers so that gcc will use a jump table. *) val frameInfos = if !Control.codegen = Control.CCodegen orelse !Control.codegen = Control.LLVMCodegen then let val done = Array.array (Vector.length frameInfos, false) val newFrameInfos = ref [] fun newFrameInfo fi = if Array.sub (done, M.FrameInfo.index fi) then () else (Array.update (done, M.FrameInfo.index fi, true) ; List.push (newFrameInfos, fi)) val () = List.foreach (chunks, fn M.Chunk.T {blocks, ...} => Vector.foreach (blocks, fn M.Block.T {kind, ...} => case M.Kind.frameInfoOpt kind of NONE => () | SOME fi => if M.Kind.isEntry kind then newFrameInfo fi else ())) val () = Vector.foreach (frameInfos, newFrameInfo) val frameInfos = Vector.fromListRev (!newFrameInfos) val () = Vector.foreachi (frameInfos, fn (i, fi) => M.FrameInfo.setIndex (fi, i)) in frameInfos end else frameInfos in (frameInfos, frameOffsets) end fun getFrameInfo {entry: bool, kind: M.FrameInfo.Kind.t, offsets: Bytes.t list, size: Bytes.t, sourceSeqIndex: int option}: M.FrameInfo.t = let val frameOffsets = getFrameOffsets (ByteSet.fromList offsets) fun new () = let val index = nextFrameInfo () val frameInfo = M.FrameInfo.new {frameOffsets = frameOffsets, index = index, kind = kind, size = size, sourceSeqIndex = sourceSeqIndex} val _ = List.push (frameInfos, frameInfo) in frameInfo end in (* If we are using the C or LLVM codegens, then we want * each entry frame to have a different index, because * the index will be used for the trampoline * (nextChunks mapping and ChunkSwitch); moreover, we * want the indices of entry frames of a chunk to be * consecutive integers so that gcc will use a jump * table. *) if entry andalso (!Control.codegen = Control.CCodegen orelse !Control.codegen = Control.LLVMCodegen) then new () else HashTable.lookupOrInsert (table, {frameOffsets = frameOffsets, kind = kind, size = size, sourceSeqIndex = sourceSeqIndex}, fn () => new ()) end end val {get = frameInfo: Label.t -> M.FrameInfo.t option, set = setFrameInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) val setFrameInfo = Trace.trace2 ("Backend.setFrameInfo", Label.layout, Option.layout M.FrameInfo.layout, Unit.layout) setFrameInfo val {get = varInfo: Var.t -> {operand: VarOperand.t, ty: Type.t}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("Backend.info", Var.layout)) val setVarInfo = Trace.trace2 ("Backend.setVarInfo", Var.layout, VarOperand.layout o #operand, Unit.layout) setVarInfo val varInfo = Trace.trace ("Backend.varInfo", Var.layout, fn {operand, ...} => Layout.record [("operand", VarOperand.layout operand)]) varInfo val varOperandOpt: Var.t -> M.Operand.t option = VarOperand.operand o #operand o varInfo val varOperand: Var.t -> M.Operand.t = valOf o varOperandOpt val varOperand = Trace.trace ("Backend.varOperand", Var.layout, M.Operand.layout) varOperand val (addToStaticHeaps, finishStaticHeaps, allGlobalObjptrs) = let open StaticHeap val allGlobalObjptrs = ref [] fun varElem (x: Var.t): Elem.t * bool = case varOperand x of M.Operand.Const c => (Elem.Const c, false) | M.Operand.Global g => (case List.peek (!allGlobalObjptrs, fn (_, g') => M.Global.equals (g, g')) of SOME (r, _) => (Elem.Ref r, true) | NONE => Error.bug "Backend.staticHeaps.varElem: invalid operand,Global") | M.Operand.StaticHeapRef r => (Elem.Ref r, Kind.isDynamic (Ref.kind r)) | _ => Error.bug "Backend.staticHeaps.varElem: invalid operand" fun translateOperand (oper: R.Operand.t): Elem.t * bool = case oper of R.Operand.Cast (z, ty) => let val (z, hasDynamic) = translateOperand z in (Elem.Cast (z, ty), hasDynamic) end | R.Operand.Const c => (Elem.Const c, false) | R.Operand.Var {var, ...} => varElem var | _ => Error.bug "Backend.staticHeaps.translateOperand: invalid operand" fun translateInit init = Vector.mapAndFold (init, false, fn ({offset, src}, hasDynamic') => let val (src, hasDynamic) = translateOperand src in ({offset = offset, src = src}, hasDynamic' orelse hasDynamic) end) fun translateObject obj = case obj of R.Object.Normal {init, tycon} => let val {components, ...} = ObjectType.deNormal (tyconTy tycon) val (init, hasDynamic) = translateInit init val kind = if hasDynamic then Kind.Dynamic else if Prod.someIsMutable components then if Vector.exists (Prod.dest components, fn {elt, isMutable} => isMutable andalso Type.isObjptr elt) then (* Reference to root static heap * won't map to valid card slot. *) if !Control.markCards then Kind.Dynamic else Kind.Root else Kind.Mutable else Kind.Immutable in {kind = kind, obj = Object.Normal {init = init, tycon = tycon}, offset = Runtime.normalMetaDataSize (), size = R.Object.size (obj, {tyconTy = tyconTy}), tycon = tycon} end | R.Object.Sequence {init, tycon} => let val {components, hasIdentity} = ObjectType.deSequence (tyconTy tycon) val (init, hasDynamic) = Vector.mapAndFold (init, false, fn (init, hasDynamic') => let val (init, hasDynamic) = translateInit init in (init, hasDynamic' orelse hasDynamic) end) val kind = if hasDynamic then Kind.Dynamic else if hasIdentity then if Vector.isEmpty init then (* An empty sequence; * elements will never be updated, * but header may be updated. *) Kind.Mutable else if Vector.exists (Prod.dest components, fn {elt, isMutable} => isMutable andalso Type.isObjptr elt) then (* Reference to root static heap * won't map to valid card slot. *) if !Control.markCards then Kind.Dynamic else Kind.Root else Kind.Mutable else Kind.Immutable in {kind = kind, obj = Object.Sequence {init = init, tycon = tycon}, offset = Runtime.sequenceMetaDataSize (), size = R.Object.size (obj, {tyconTy = tyconTy}), tycon = tycon} end val kindAcc = Kind.memoize (fn _ => {objs = ref [], nextIndex = Counter.generator 0, nextOffset = ref Bytes.zero}) fun add obj = let val {kind, obj, offset, size, tycon} = translateObject obj val {objs, nextIndex, nextOffset} = kindAcc kind val r = Ref.T {index = nextIndex (), kind = kind, offset = Bytes.+ (!nextOffset, offset), ty = Type.objptr tycon} val oper = case kind of Kind.Dynamic => let val g = M.Global.new (Type.objptr tycon) in List.push (allGlobalObjptrs, (r, g)) ; M.Operand.Global g end | _ => M.Operand.StaticHeapRef r in List.push (objs, obj) ; nextOffset := Bytes.+ (!nextOffset, size) ; oper end fun finish () = Kind.memoize (Vector.fromListRev o ! o #objs o kindAcc) in (add, finish, fn () => !allGlobalObjptrs) end val () = Vector.foreach (statics, fn {dst = (dstVar, dstTy), obj} => let val oper = addToStaticHeaps obj in setVarInfo (dstVar, {operand = VarOperand.Const oper, ty = dstTy}) end) (* Hash tables for uniquifying globals. *) local fun 'a make {equals: 'a * 'a -> bool, hash: 'a -> word, oper: 'a -> M.Operand.t} = let val table: ('a, M.Operand.t) HashTable.t = HashTable.new {equals = equals, hash = hash} fun get (value: 'a): M.Operand.t = HashTable.lookupOrInsert (table, value, fn () => oper value) in get end in local val allGlobalReals = ref [] in val globalReal = make {equals = RealX.equals, hash = RealX.hash, oper = fn r => let val g = M.Global.new (Type.real (RealX.size r)) in List.push (allGlobalReals, (r, g)) ; M.Operand.Global g end} val allGlobalReals = fn () => !allGlobalReals end val globalWordVector = make {equals = WordXVector.equals, hash = WordXVector.hash, oper = addToStaticHeaps o R.Object.fromWordXVector} end fun constOperand (c: Const.t): M.Operand.t = let datatype z = datatype Const.t in case c of IntInf _ => Error.bug "Backend.constOperand: IntInf" | Real r => globalReal r | WordVector v => globalWordVector v | _ => M.Operand.Const c end fun parallelMove {dsts: M.Operand.t vector, srcs: M.Operand.t vector}: M.Statement.t vector = let val moves = Vector.fold2 (srcs, dsts, [], fn (src, dst, ac) => {src = src, dst = dst} :: ac) fun temp t = M.Operand.Temporary (Temporary.new (M.Operand.ty t, NONE)) in Vector.fromList (ParallelMove.move { equals = M.Operand.equals, move = M.Statement.move, moves = moves, interfere = M.Operand.interfere, temp = temp }) end fun runtimeOp (field: GCField.t): M.Operand.t = case field of GCField.Frontier => M.Operand.Frontier | GCField.StackTop => M.Operand.StackTop | _ => M.Operand.gcField field val exnStackOp = runtimeOp GCField.ExnStack val stackBottomOp = runtimeOp GCField.StackBottom val stackTopOp = runtimeOp GCField.StackTop val rec isWord = fn M.Operand.Const (Const.Word _) => true | M.Operand.Cast (z, _) => isWord z | _ => false fun bogusOp (t: Type.t): M.Operand.t = case Type.deReal t of NONE => let val bogusWord = M.Operand.word (WordX.zero (WordSize.fromBits (Type.width t))) in case Type.deWord t of NONE => M.Operand.Cast (bogusWord, t) | SOME _ => bogusWord end | SOME s => globalReal (RealX.zero s) fun translateOperand (oper: R.Operand.t): M.Operand.t = let datatype z = datatype R.Operand.t in case oper of Cast (z, t) => M.Operand.Cast (translateOperand z, t) | Const c => constOperand c | GCState => M.Operand.GCState | Offset {base, offset, ty} => let val base = translateOperand base in (* Native codegens can't handle this; * Dead code may treat small constant * intInfs as large and take offsets *) if isWord base then bogusOp ty else M.Operand.Offset {base = base, offset = offset, ty = ty} end | ObjptrTycon opt => M.Operand.word (ObjptrTycon.toHeader opt) | Runtime f => runtimeOp f | SequenceOffset {base, index, offset, scale, ty} => let val base = translateOperand base in if isWord base then bogusOp ty else M.Operand.SequenceOffset {base = base, index = translateOperand index, offset = offset, scale = scale, ty = ty} end | Var {var, ...} => varOperand var end fun translateOperands ops = Vector.map (ops, translateOperand) fun genStatement (s: R.Statement.t, handlersInfo: {handlerOffset: Bytes.t, linkOffset: Bytes.t} option) : M.Statement.t vector = let fun handlerOffset () = #handlerOffset (valOf handlersInfo) fun linkOffset () = #linkOffset (valOf handlersInfo) datatype z = datatype R.Statement.t fun move arg = case M.Statement.move arg of NONE => Vector.new0 () | SOME move => Vector.new1 move fun mkInit (init, mkDst) = Vector.toListMap (init, fn {src, offset} => move {dst = mkDst {offset = offset, ty = R.Operand.ty src}, src = translateOperand src}) in case s of Bind {dst = (var, _), src, ...} => (* CHECK *) let val oper = varOperand var in if M.Operand.isDestination oper then move {dst = oper, src = translateOperand src} else Vector.new0 () (* Destination already propagated *) end | Move {dst, src} => move {dst = translateOperand dst, src = translateOperand src} | Object {dst = (dst, _), obj as Object.Normal {init, tycon}} => let val dst = varOperand dst val header = ObjptrTycon.toHeader tycon fun mkDst {offset, ty} = M.Operand.Offset {base = dst, offset = offset, ty = ty} in Vector.concat (M.Statement.object {dst = dst, header = header, size = Object.size (obj, {tyconTy = tyconTy})} :: mkInit (init, mkDst)) end | Object {dst = (dst, _), obj as Object.Sequence {init, tycon}} => let val dst = varOperand dst val header = ObjptrTycon.toHeader tycon val elt = ObjectType.componentsSize (tyconTy tycon) val (scale, mkIndex) = case Scale.fromBytes elt of NONE => (Scale.One, fn index => M.Operand.word (WordX.mul (WordX.fromInt (index, WordSize.seqIndex ()), WordX.fromBytes (elt, WordSize.seqIndex ()), {signed = false}))) | SOME s => (s, fn index => M.Operand.word (WordX.fromInt (index, WordSize.seqIndex ()))) in Vector.concat (M.Statement.sequence {dst = dst, header = header, length = Vector.length init, size = Object.size (obj, {tyconTy = tyconTy})} :: (List.concat o Vector.toListMapi) (init, fn (index, init) => let fun mkDst {offset, ty} = M.Operand.SequenceOffset {base = dst, index = mkIndex index, offset = offset, scale = scale, ty = ty} in mkInit (init, mkDst) end)) end | PrimApp {dst, prim, args} => (case prim of Prim.MLton_touch => Vector.new0 () | _ => Vector.new1 (M.Statement.PrimApp {args = translateOperands args, dst = Option.map (dst, varOperand o #1), prim = prim})) | ProfileLabel s => Vector.new1 (M.Statement.ProfileLabel s) | SetExnStackLocal => (* ExnStack = stackTop + (handlerOffset + LABEL_SIZE) - StackBottom; *) let val tmp = M.Operand.Temporary (Temporary.new (Type.cpointer (), NONE)) in Vector.new2 (M.Statement.PrimApp {args = (Vector.new2 (stackTopOp, M.Operand.word (WordX.fromBytes (Bytes.+ (handlerOffset (), Runtime.labelSize ()), WordSize.cptrdiff ())))), dst = SOME tmp, prim = Prim.CPointer_add}, M.Statement.PrimApp {args = Vector.new2 (tmp, stackBottomOp), dst = SOME exnStackOp, prim = Prim.CPointer_diff}) end | SetExnStackSlot => (* ExnStack = *(ptrdiff_t* )(stackTop + linkOffset); *) move {dst = exnStackOp, src = M.Operand.stackOffset {offset = linkOffset (), ty = Type.exnStack ()}} | SetHandler h => (* *(uintptr_t)(stackTop + handlerOffset) = h; *) move {dst = M.Operand.stackOffset {offset = handlerOffset (), ty = Type.label h}, src = M.Operand.Label h} | SetSlotExnStack => (* *(ptrdiff_t* )(stackTop + linkOffset) = ExnStack; *) move {dst = M.Operand.stackOffset {offset = linkOffset (), ty = Type.exnStack ()}, src = exnStackOp} | _ => Error.bug (concat ["Backend.genStatement: strange statement: ", R.Statement.toString s]) end val genStatement = Trace.trace ("Backend.genStatement", R.Statement.layout o #1, Vector.layout M.Statement.layout) genStatement val bugTransfer = fn () => M.Transfer.CCall {args = (Vector.new1 (globalWordVector (WordXVector.fromString "backend thought control shouldn't reach here"))), func = Type.BuiltInCFunction.bug (), return = NONE} val {get = labelInfo: Label.t -> {args: (Var.t * Type.t) vector}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelInfo", Label.layout)) val setLabelInfo = Trace.trace2 ("Backend.setLabelInfo", Label.layout, Layout.ignore, Unit.layout) setLabelInfo fun paramOffsets (xs: 'a vector, ty: 'a -> Type.t, mk: {offset: Bytes.t, ty: Type.t} -> 'b): 'b vector = #1 (Vector.mapAndFold (xs, Bytes.zero, fn (x, offset) => let val ty = ty x val offset = Type.align (ty, offset) in (mk {offset = offset, ty = ty}, Bytes.+ (offset, Type.bytes ty)) end)) fun paramStackOffsets (xs: 'a vector, ty: 'a -> Type.t, shift: Bytes.t): StackOffset.t vector = paramOffsets (xs, ty, fn {offset, ty} => StackOffset.T {offset = Bytes.+ (offset, shift), ty = ty}) val operandLive: M.Operand.t -> M.Live.t = valOf o M.Live.fromOperand val operandsLive: M.Operand.t vector -> M.Live.t vector = fn ops => Vector.map (ops, operandLive) val isGlobal = let val {get: Var.t -> bool, set, rem, ...} = Property.getSet (Var.plist, Property.initRaise ("Backend.toMachine.isGlobal", Var.layout)) val _ = Function.foreachDef (main, fn (x, _) => set (x, false)) val _ = List.foreach (functions, fn f => (Function.foreachUse (f, fn x => set (x, true)) ; Function.foreachDef (f, fn (x, _) => rem x))) in get end fun genFunc (f: Function.t, isMain: bool): unit = let val f = eliminateDeadCode f val {args, blocks, name, raises, returns, start, ...} = Function.dest f val {raisesTo, returnsTo} = rflow name val (returnLives, returnOperands) = case returns of NONE => (NONE, NONE) | SOME returns => let val returnStackOffsets = paramStackOffsets (returns, fn t => t, Bytes.zero) in (SOME (Vector.map (returnStackOffsets, M.Live.StackOffset)), SOME (Vector.map (returnStackOffsets, M.Operand.StackOffset))) end val raiseLives = case raises of NONE => NONE | SOME _ => SOME (Vector.new0 ()) fun newVarInfo (x, ty: Type.t) = let val operand = if isMain andalso isGlobal x then let val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "Global: ", R.Var.layout x, str ": ", R.Type.layout ty]) end) in VarOperand.Const (M.Operand.Global (M.Global.new ty)) end else VarOperand.Allocate {operand = ref NONE} in setVarInfo (x, {operand = operand, ty = ty}) end fun newVarInfos xts = Vector.foreach (xts, newVarInfo) (* Set the constant operands, labelInfo, and varInfo. *) val _ = newVarInfos args val _ = Rssa.Function.dfs (f, fn R.Block.T {args, label, statements, ...} => let val _ = setLabelInfo (label, {args = args}) val _ = newVarInfos args val _ = Vector.foreach (statements, fn s => let fun normal () = R.Statement.foreachDef (s, newVarInfo) in case s of R.Statement.Bind {dst = (var, _), src, ...} => let fun set (z: M.Operand.t, casts: Type.t list) = let val z = List.fold (casts, z, fn (t, z) => M.Operand.Cast (z, t)) in setVarInfo (var, {operand = VarOperand.Const z, ty = M.Operand.ty z}) end fun loop (z: R.Operand.t, casts) = case z of R.Operand.Cast (z, t) => loop (z, t :: casts) | R.Operand.Const c => set (constOperand c, casts) | R.Operand.Var {var = var', ...} => (case #operand (varInfo var') of VarOperand.Const z => set (z, casts) | VarOperand.Allocate _ => normal ()) | _ => normal () in loop (src, []) end | _ => normal () end) in fn () => () end) (* Allocate stack slots. *) local val varInfo = fn x => let val {operand, ty, ...} = varInfo x in {operand = (case operand of VarOperand.Allocate {operand, ...} => SOME operand | _ => NONE), ty = ty} end in val {handlersInfo, labelInfo = labelRegInfo, ...} = let val paramOffsets = fn args => paramOffsets (args, fn (_, ty) => ty, fn so => so) in AllocateVariables.allocate {function = f, paramOffsets = paramOffsets, varInfo = varInfo} end end (* Set the frameInfo for blocks in this function. *) val _ = Vector.foreach (blocks, fn R.Block.T {kind, label, ...} => let fun doit (useOffsets: bool): unit = let val {liveNoFormals, size, ...} = labelRegInfo label val offsets = if useOffsets then Vector.fold (liveNoFormals, [], fn (oper, ac) => case oper of M.Operand.StackOffset (StackOffset.T {offset, ty}) => if Type.isObjptr ty then offset :: ac else ac | _ => ac) else [] val (entry, kind) = case kind of R.Kind.Cont _=> (true, M.FrameInfo.Kind.ML_FRAME) | R.Kind.CReturn {func} => (CFunction.maySwitchThreadsTo func, M.FrameInfo.Kind.C_FRAME) | R.Kind.Handler => (true, M.FrameInfo.Kind.ML_FRAME) | R.Kind.Jump => (false, M.FrameInfo.Kind.ML_FRAME) val frameInfo = getFrameInfo {entry = entry, kind = kind, offsets = offsets, size = size, sourceSeqIndex = getFrameSourceSeqIndex label} in setFrameInfo (label, SOME frameInfo) end in case R.Kind.frameStyle kind of R.Kind.None => () | R.Kind.OffsetsAndSize => doit true | R.Kind.SizeOnly => doit false end) (* ------------------------------------------------- *) (* genTransfer *) (* ------------------------------------------------- *) fun genTransfer (t: R.Transfer.t) : M.Statement.t vector * M.Transfer.t = let fun simple t = (Vector.new0 (), t) in case t of R.Transfer.CCall {args, func, return} => let val return = case return of NONE => NONE | SOME return => let val fio = frameInfo return val {size, ...} = labelRegInfo return in SOME {return = return, size = Option.map (fio, fn _ => size)} end in simple (M.Transfer.CCall {args = translateOperands args, func = func, return = return}) end | R.Transfer.Call {func, args, return} => let datatype z = datatype R.Return.t val (contLive, frameSize, return) = case return of Dead => (Vector.new0 (), Bytes.zero, NONE) | Tail => (Vector.new0 (), Bytes.zero, NONE) | NonTail {cont, handler} => let val {liveNoFormals, size, ...} = labelRegInfo cont datatype z = datatype R.Handler.t val handler = case handler of Caller => NONE | Dead => NONE | Handle h => SOME h in (liveNoFormals, size, SOME {return = cont, handler = handler, size = size}) end val dsts = paramStackOffsets (args, R.Operand.ty, frameSize) val setupArgs = parallelMove {dsts = Vector.map (dsts, M.Operand.StackOffset), srcs = translateOperands args} val live = Vector.concat [operandsLive contLive, Vector.map (dsts, Live.StackOffset)] val transfer = M.Transfer.Call {label = funcToLabel func, live = live, return = return} in (setupArgs, transfer) end | R.Transfer.Goto {dst, args} => let val (dsts', srcs') = Vector.unzip (Vector.keepAllMap2 (#args (labelInfo dst), args, fn ((dst, _), src) => case varOperandOpt dst of NONE => NONE | SOME dst => SOME (dst, translateOperand src))) in (parallelMove {dsts = dsts', srcs = srcs'}, M.Transfer.Goto dst) end | R.Transfer.Raise srcs => let val handlerStackTop = M.Operand.Temporary (Temporary.new (Type.cpointer (), NONE)) val dsts = paramOffsets (srcs, R.Operand.ty, fn {offset, ty} => M.Operand.Offset {base = handlerStackTop, offset = offset, ty = ty}) in if Vector.isEmpty srcs then (Vector.new0 (), M.Transfer.Raise {raisesTo = raisesTo}) else (Vector.concat [Vector.new1 (M.Statement.PrimApp {args = Vector.new2 (stackBottomOp, exnStackOp), dst = SOME handlerStackTop, prim = Prim.CPointer_add}), parallelMove {dsts = dsts, srcs = translateOperands srcs}], M.Transfer.Raise {raisesTo = raisesTo}) end | R.Transfer.Return xs => (parallelMove {dsts = valOf returnOperands, srcs = translateOperands xs}, M.Transfer.Return {returnsTo = returnsTo}) | R.Transfer.Switch switch => let val R.Switch.T {cases, default, expect, size, test} = switch in simple (case (Vector.length cases, default) of (0, NONE) => bugTransfer () | (1, NONE) => M.Transfer.Goto (#2 (Vector.sub (cases, 0))) | (0, SOME dst) => M.Transfer.Goto dst | _ => M.Transfer.Switch (M.Switch.T {cases = cases, default = default, expect = expect, size = size, test = translateOperand test})) end end val genTransfer = Trace.trace ("Backend.genTransfer", R.Transfer.layout, Layout.tuple2 (Vector.layout M.Statement.layout, M.Transfer.layout)) genTransfer fun genBlock (R.Block.T {args, kind, label, statements, transfer, ...}) : unit = let val {live, liveNoFormals, size, ...} = labelRegInfo label val statements = Vector.concatV (Vector.map (statements, fn s => genStatement (s, handlersInfo))) val (preTransfer, transfer) = genTransfer transfer fun doContHandler mkMachineKind = let val srcs = paramStackOffsets (args, #2, size) val (dsts', srcs') = Vector.unzip (Vector.keepAllMap2 (args, srcs, fn ((dst, _), src) => case varOperandOpt dst of NONE => NONE | SOME dst => SOME (dst, M.Operand.StackOffset src))) in (mkMachineKind {args = Vector.map (srcs, Live.StackOffset), frameInfo = valOf (frameInfo label)}, liveNoFormals, parallelMove {dsts = dsts', srcs = srcs'}) end val (kind, live, pre) = case kind of R.Kind.Cont _ => doContHandler M.Kind.Cont | R.Kind.CReturn {func, ...} => let val dst = case Vector.length args of 0 => NONE | 1 => Option.map (varOperandOpt (#1 (Vector.first args)), operandLive) | _ => Error.bug "Backend.genBlock: CReturn" in (M.Kind.CReturn {dst = dst, frameInfo = frameInfo label, func = func}, liveNoFormals, Vector.new0 ()) end | R.Kind.Handler => doContHandler M.Kind.Handler | R.Kind.Jump => (M.Kind.Jump, live, Vector.new0 ()) val (first, statements) = if !Control.profile = Control.ProfileTimeLabel then case (if Vector.isEmpty statements then NONE else (case Vector.first statements of s as M.Statement.ProfileLabel _ => SOME s | _ => NONE)) of NONE => Error.bug (concat ["Backend.genBlock: ", "missing ProfileLabel in ", Label.toString label]) | SOME s => (Vector.new1 s, Vector.dropPrefix (statements, 1)) else (Vector.new0 (), statements) val statements = Vector.concat [first, pre, statements, preTransfer] in Chunk.newBlock (labelChunk label, {kind = kind, label = label, live = operandsLive live, raises = raiseLives, returns = returnLives, statements = statements, transfer = transfer}) end val genBlock = traceGenBlock genBlock val _ = Vector.foreach (blocks, genBlock) val _ = let val frameInfo = getFrameInfo {entry = true, kind = M.FrameInfo.Kind.ML_FRAME, offsets = [], size = Bytes.zero, sourceSeqIndex = NONE} val srcs = paramStackOffsets (args, #2, Bytes.zero) val srcs = Vector.map (srcs, M.Operand.StackOffset) val statements = parallelMove {dsts = Vector.map (args, varOperand o #1), srcs = srcs} in Chunk.newBlock (funcChunk name, {label = funcToLabel name, kind = M.Kind.Func {frameInfo = frameInfo}, live = operandsLive srcs, raises = raiseLives, returns = returnLives, statements = statements, transfer = M.Transfer.Goto start}) end val _ = if isMain then () else Vector.foreach (blocks, R.Block.clear) in () end val genFunc = Trace.trace2 ("Backend.genFunc", Func.layout o Function.name, Bool.layout, Unit.layout) genFunc (* Generate the main function first. * Need to do this in order to set globals. *) val _ = genFunc (main, true) val _ = List.foreach (functions, fn f => genFunc (f, false)) val chunks = !chunks fun chunkToMachine (Chunk.T {chunkLabel, blocks}) = let val blocks = Vector.fromList (!blocks) val tempsMax = CType.memo (fn _ => ref ~1) val tempsNeedingIndex = Vector.fold (blocks, [], fn (b, ac) => M.Block.foldDefs (b, ac, fn (z, ac) => case z of M.Operand.Temporary t => (case Temporary.indexOpt t of NONE => t :: ac | SOME i => let val z = tempsMax (Type.toCType (Temporary.ty t)) val _ = if i > !z then z := i else () in ac end) | _ => ac)) val _ = List.foreach (tempsNeedingIndex, fn t => let val z = tempsMax (Type.toCType (Temporary.ty t)) val i = 1 + !z val _ = z := i val _ = Temporary.setIndex (t, i) in () end) in M.Chunk.T {chunkLabel = chunkLabel, blocks = blocks, tempsMax = ! o tempsMax} end val mainName = R.Function.name main val main = {chunkLabel = Chunk.label (funcChunk mainName), label = funcToLabel mainName} val chunks = List.revMap (chunks, chunkToMachine) (* The clear is necessary because properties have been attached to Funcs * and Labels, and they appear as labels in the resulting program. *) val _ = List.foreach (chunks, fn M.Chunk.T {blocks, ...} => Vector.foreach (blocks, Label.clear o M.Block.label)) val (frameInfos, frameOffsets) = allFrameInfo chunks val maxFrameSize: Bytes.t = List.fold (chunks, Bytes.zero, fn (M.Chunk.T {blocks, ...}, max) => Vector.fold (blocks, max, fn (M.Block.T {kind, statements, transfer, ...}, max) => let fun doOperand (z: M.Operand.t, max: Bytes.t): Bytes.t = let datatype z = datatype M.Operand.t in case z of SequenceOffset {base, index, ...} => doOperand (base, doOperand (index, max)) | Cast (z, _) => doOperand (z, max) | Offset {base, ...} => doOperand (base, max) | StackOffset (StackOffset.T {offset, ty}) => Bytes.max (Bytes.+ (offset, Type.bytes ty), max) | _ => max end val max = case M.Kind.frameInfoOpt kind of NONE => max | SOME fi => Bytes.max (max, M.FrameInfo.size fi) val max = Vector.fold (statements, max, fn (s, max) => M.Statement.foldOperands (s, max, doOperand)) val max = M.Transfer.foldOperands (transfer, max, doOperand) in max end)) val maxFrameSize = Bytes.alignWord32 maxFrameSize val machine = M.Program.T {chunks = chunks, frameInfos = frameInfos, frameOffsets = frameOffsets, globals = {objptrs = allGlobalObjptrs (), reals = allGlobalReals ()}, handlesSignals = handlesSignals, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, sourceMaps = sourceMaps, staticHeaps = finishStaticHeaps ()} in machine end end mlton-20210117+dfsg/mlton/backend/backend.sig000066400000000000000000000011671416264345000206460ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature BACKEND_STRUCTS = sig structure Machine: MACHINE structure Rssa: RSSA sharing Machine.BackendAtoms = Rssa.BackendAtoms val funcToLabel: Rssa.Func.t -> Machine.Label.t end signature BACKEND = sig include BACKEND_STRUCTS val toMachine: Rssa.Program.t -> Machine.Program.t end mlton-20210117+dfsg/mlton/backend/bounce-vars.fun000066400000000000000000000423411416264345000215100ustar00rootroot00000000000000(* Copyright (C) 2019 Jason Carr * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. * * This pass copies some variables into new locations * so that the relatively naïve AllocateVars can give one location * to each variable. * * Although this is pretty tightly coupled to the AllocateVars, it saves * us a lot of complexity in both, since the latter does not need to do any * contortions to try to return multiple variables * * Mechanically, what we do is find the loops in the program, and try our best * to split up variables so that no variable that would have to be on the * stack appears in any loop. So while we might end up with some extra copies, * by construction we don't really do so in any loop where we wouldn't have to * already do something similar in practice. * * This must be run before implement-handlers, as it uses restore *) functor BounceVars(S: RSSA_TRANSFORM_STRUCTS): RSSA_TRANSFORM = struct open S fun shouldAvoid (Block.T {kind, ...}) = (* this definition is important; * we assume that no edge has even * one side inside a loop; * this is true because calls etc * must be unconditional; * i.e. not be able to get back * into the loop without necessarily * going over a bad edge *) case kind of Kind.Jump => true | _ => false fun shouldBounceAt (Block.T {kind, ...}) = (* This is based on the choice * made by AllocateVariables of * which variables go to the stack, * and similarly to above, * cannot be frivolously changed *) case Kind.frameStyle kind of Kind.OffsetsAndSize => true | _ => false structure Weight = struct (* t is a positive rational weight: count/loopSize *) datatype t = T of {count: IntInf.t, size: IntInf.t} val op + = fn (T {count=count1, size=size1}, T {count=count2, size=size2}) => let open IntInf val l = lcm (size1, size2) in T {count= count1 * (l div size2) + count2 * (l div size1), size=l} end fun count (T {count, ...}) = count fun inc size t = t + T {count=IntInf.fromInt 1, size=IntInf.fromInt size} val new = T {count=IntInf.fromInt 0, size=IntInf.fromInt 1} val op < = fn (T {count=count1, size=size1}, T {count=count2, size=size2}) => let open IntInf in count1 * size2 < count2 * size1 end end datatype varinfo = Ignore (* No consideration *) | UsedInLoop (* Used in loop, haven't checked bouncing *) | Consider of Weight.t (* Should be considered for bouncing *) | Rewrite of Weight.t (* Will be bounced *) fun loopForeach ({headers, child}, f) = let val _ = Vector.foreach (headers, f) val {loops, notInLoop} = DirectedGraph.LoopForest.dest child val _ = Vector.foreach (notInLoop, f) in Vector.foreach (loops, fn loop => loopForeach (loop, f)) end fun transform p = let val {get=varTy, set=setVarTy, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("BounceVars.varTy", Var.layout)) val {get=varInfo, set=setVarInfo, rem = remVarInfo, ...} = Property.getSet (Var.plist, Property.initConst Ignore) fun transformFunc func = let val {args, blocks, name, raises, returns, start} = Function.dest func val liveInfo = Live.live (func, {shouldConsider = fn _ => true}) fun beginNoFormals label = #beginNoFormals ((#labelLive liveInfo) label) val {loops, ...} = DirectedGraph.LoopForest.dest (Function.loopForest (func, fn (b, _) => shouldAvoid b)) val _ = Function.foreachDef (func, setVarTy) datatype InLoop = InLoop of {header: bool} | NotInLoop val {get=labelInfo, ...} = Property.get (Label.plist, Property.initFun (fn _ => {inLoop=ref NotInLoop, block=ref NONE})) val numRewritten = ref 0 fun setRewrite (v, weight) = (case varInfo v of Consider _ => (if Control.optFuelAvailAndUse () then ( Int.inc numRewritten ; setVarInfo (v, Rewrite weight)) else ()) | _ => ()) fun checkLoopSize sizeref = case !Control.bounceRssaLoopCutoff of SOME n => !sizeref < n | NONE => true (* For each loop, we'll set used variables in that loop * to be considered for bouncing, so that we can eliminate some bounce * points based on number of variables considered. * * We can also set some label info at this point *) val _ = let fun setConsiderVars (block as Block.T {label, ...}) = (let val _ = Block.foreachUse (block, fn v => setVarInfo (v, UsedInLoop)) val _ = (#inLoop o labelInfo) label := InLoop {header=false} in () end) fun setHeader (Block.T {label, ...}) = let val inLoop = (#inLoop o labelInfo) label in case !inLoop of InLoop {...} => inLoop := InLoop {header=true} | _ => () end fun processLoop (loop as {headers,...}) = let fun count reff _ = Int.inc reff val size = ref 0 val _ = loopForeach (loop, count size) val _ = if checkLoopSize size then loopForeach (loop, setConsiderVars) else () val _ = Vector.foreach (headers, setHeader) in () end in Vector.foreach (loops, processLoop) end (* Now check each bounce point, * if it doesn't make the cutoff, set the vars * to actually be considered for rewriting *) val cutoff = case !Control.bounceRssaLiveCutoff of SOME n => n | NONE => ~1 val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => let val live = beginNoFormals label in if shouldBounceAt b andalso (cutoff < 0 orelse (Vector.length (Vector.keepAll (live, fn v => UsedInLoop = varInfo v))) < cutoff) then Vector.foreach (live, fn v => setVarInfo (v, Consider Weight.new)) else () end) (* foreach arg, set Consider, since they may need *) val _ = Vector.foreach (args, fn (x, _) => case varInfo x of UsedInLoop => setVarInfo (x, Consider Weight.new) | _ => ()) (* Finally, vars with Consider are actually worth checking, * so set their weights accurately *) val _ = let fun setVarWeights size (block as Block.T {label, ...}) = let fun modVarInfo (v, f) = let val newInfo = case varInfo v of Ignore => Ignore | UsedInLoop => UsedInLoop | Consider w => Consider (f w) | Rewrite w => Rewrite (f w) val _ = setVarInfo (v, newInfo) in () end val _ = Block.foreachDef (block, fn (v, _) => modVarInfo (v, Weight.inc size)) val _ = Block.foreachUse (block, fn v => case !Control.bounceRssaLimit of NONE => setRewrite (v, Weight.new) | SOME _ => modVarInfo (v, Weight.inc size)) val _ = (#inLoop o labelInfo) label := InLoop {header=false} in () end fun processLoop loop = let val size = ref 0 val _ = loopForeach (loop, fn Block.T {...} => Int.inc size) val _ = (* this bound is a conservative bound * backed up by data showing no improvements at * all over this size, so we'll save the overhead *) if checkLoopSize size then loopForeach (loop, setVarWeights (!size)) else () in () end in Vector.foreach (loops, processLoop) end (* Process the choices for each loop in a separate pass, * each loop chooses independently which variables to bounce, * then those variables are bounced over all loops they're * a part of, so they're not inadvertently stack allocated. *) fun chooseBouncedVariables n loop = let (* assume n is small *) val heap = Array.new (n, (NONE, Weight.new)) fun insert (i, x, xw) = if i >= n orelse (case !Control.bounceRssaUsageCutoff of SOME n => IntInf.>= (Weight.count xw, IntInf.fromInt n) | NONE => false) (* Variables with lots of uses are usually worse * candidates than shorter lived variables used once or * twice since they have much longer lifespans, * 15 is a conservative bound backed by some data *) then () else let val (y, yw) = Array.sub (heap, i) val (x, xw) = (* maximize weight *) if (Weight.< (yw, xw)) then (Array.update (heap, i, (x, xw)) ; (y, yw)) else (x, xw) in insert (i + 1, x, xw) end fun insertVar x = case varInfo x of Consider w => insert (0, SOME x, w) (* May overlap *) | Rewrite w => insert (0, SOME x, w) | _ => () fun insertVars block = Block.foreachUse (block, insertVar) val _ = loopForeach (loop, insertVars) val _ = Array.foreach (heap, fn (x, xw) => case x of SOME x => setRewrite (x, xw) | NONE => ()) in () end val _ = case !Control.bounceRssaLimit of SOME n => Vector.foreach (loops, chooseBouncedVariables n) | NONE => () (* Already chosen when seen *) val _ = Control.diagnostics (fn show => let open Layout in show (seq [str "Function ", Func.layout name]) ; show (seq [str "Number of loops: ", (str o Int.toString o Vector.length) loops ]) ; show (seq [str "Number of variables rewritten:: ", (str o Int.toString o !) numRewritten ]) end) datatype direction = EnterLoop | LeaveLoop val newBlocks = ref [] val _ = Vector.foreach (blocks, fn (b as Block.T {label, ...}) => (#block o labelInfo) label := SOME b) fun insertRewriteBlock (destLabel, direction) = let val {block, ...} = labelInfo destLabel val Block.T {label=destLabel, args=destArgs, ...} = (valOf o !) block val args = Vector.map (destArgs, fn (v, ty) => (Var.new v, ty)) val live = beginNoFormals destLabel val rewrites = Vector.keepAll (live, fn v => case varInfo v of Rewrite _ => true | _ => false) val _ = Control.diagnostics (fn show => let open Layout val _ = show (seq [str "Dest Label ", Label.layout destLabel, str " (", str (case direction of EnterLoop => "entrance" | LeaveLoop => "exit"), str ")"]) in Vector.foreach (rewrites, fn v => show (seq [str "Rewriting ", Var.layout v])) end) val statements = Vector.map (rewrites, fn v => let val ty = varTy v val (src, dst) = case direction of EnterLoop => (v, v) | LeaveLoop => (v, v) val src = Operand.Var {var=src, ty=ty} val dst = (dst, ty) in Statement.Bind {dst=dst, pinned=true, src=src} end) (* Due to the loop forest construction, (i.e. shouldAvoid) * The kind of a block on the edge is always Kind.Jump * since every non-Jump must be followed by a case * transfer to exit the loop conditionally. *) val kind = Kind.Jump val label = Label.new destLabel val jumpArgs = Vector.map (args, fn (v, ty) => Operand.Var {var=v, ty=ty}) val transfer = Transfer.Goto {dst=destLabel, args=jumpArgs} val block = Block.T {args=args, kind=kind, label=label, statements=statements, transfer=transfer} val _ = List.push (newBlocks, block) in label end fun handleBlock (b as Block.T {args, kind, label, statements, transfer}) = let val {inLoop, ...} = labelInfo label val inLoop = !inLoop fun test l = let val {inLoop=inLoop', ...} = labelInfo l val inLoop' = !inLoop' in case (inLoop, inLoop') of (NotInLoop, InLoop _) => SOME EnterLoop | (InLoop _, NotInLoop) => SOME LeaveLoop | _ => NONE end val needsRewrite = ref false fun rewrite destLabel = case test destLabel of NONE => destLabel | SOME dir => ( needsRewrite := true ; insertRewriteBlock (destLabel, dir)) val newTransfer = Transfer.replaceLabels(transfer, rewrite) in if !needsRewrite then Block.T {args=args, kind=kind, label=label, statements=statements, transfer=newTransfer} else b end val _ = Vector.foreach (blocks, fn b => List.push (newBlocks, handleBlock b)) val newBlocks = Vector.fromListRev (!newBlocks) in Function.new {args=args, blocks=newBlocks, name=name, raises=raises, returns=returns, start=start} end val Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics} = p val main = transformFunc main val {main, restore} = restoreFunction {main = main, statics = statics} val () = Function.foreachDef (main, remVarInfo o #1) val {main, shrink} = shrinkFunction {main = main, statics = statics} val functions = List.revMap (functions, shrink o restore o transformFunc) val main = main () in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end mlton-20210117+dfsg/mlton/backend/chunkify.fun000066400000000000000000000424011416264345000211010ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Chunkify (S: CHUNKIFY_STRUCTS): CHUNKIFY = struct open S datatype z = datatype Transfer.t (* A simple chunkifier that puts all code in the same chunk. *) fun one (Program.T {functions, main, ...}) = let val functions = main :: functions in Vector.new1 {funcs = Vector.fromListMap (functions, Function.name), labels = Vector.concatV (Vector.fromListMap (functions, fn f => Vector.map (Function.blocks f, Block.label)))} end (* A chunkifier that puts each function in its own chunk. *) fun func (Program.T {functions, main, ...}) = Vector.fromListMap (main :: functions, fn f => let val {name, blocks, ...} = Function.dest f in {funcs = Vector.new1 name, labels = Vector.map (blocks, Block.label)} end) fun blockSize (Block.T {statements, transfer, ...}): int = let val transferSize = case transfer of Switch (Switch.T {cases, ...}) => 1 + Vector.length cases | _ => 1 val statementsSize = if !Control.profile = Control.ProfileNone then Vector.length statements else Vector.fold (statements, 0, fn (s, ac) => case s of Statement.ProfileLabel _ => ac | _ => 1 + ac) in statementsSize + transferSize end structure Graph = EquivalenceGraph structure Class = Graph.Class fun coalesce (program as Program.T {functions, main, ...}, limit) = let val functions = main :: functions val graph = Graph.new () val {get = funcClass: Func.t -> Class.t, set = setFuncClass, rem = remFuncClass, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("class", Func.layout)) val {get = labelClass: Label.t -> Class.t, set = setLabelClass, rem = remLabelClass, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("class", Label.layout)) (* Build the initial partition. * Ensure that all Ssa labels that jump to one another are in the same * equivalence class. *) val _ = List.foreach (functions, fn f => let val {name, blocks, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelClass (label, Graph.newClass (graph, {size = blockSize b}))) val _ = setFuncClass (name, labelClass start) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val c = labelClass label fun same (j: Label.t): unit = Graph.== (graph, c, labelClass j) in case transfer of CCall {return, ...} => Option.app (return, same) | Goto {dst, ...} => same dst | Switch s => Switch.foreachLabel (s, same) | _ => () end) in () end) val rflow = Program.rflow program val returnsTo = #returnsTo o rflow (* Add edges, and then coalesce the graph. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val returnsTo = List.revMap (returnsTo name, labelClass) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => case transfer of Call {func, ...} => Graph.addEdge (graph, labelClass label, funcClass func) | Return _ => let val from = labelClass label in List.foreach (returnsTo, fn c => Graph.addEdge (graph, from, c)) end | _ => ()) in () end) val _ = if limit = 0 then () else Graph.coarsen (graph, {maxClassSize = limit}) type chunk = {funcs: Func.t list ref, labels: Label.t list ref} val chunks: chunk list ref = ref [] val {get = classChunk: Class.t -> chunk, ...} = Property.get (Class.plist, Property.initFun (fn _ => let val c = {funcs = ref [], labels = ref []} val _ = List.push (chunks, c) in c end)) val _ = let fun 'a new (l: 'a, get: 'a -> Class.t, sel: chunk -> 'a list ref): unit = List.push (sel (classChunk (get l)), l) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val _ = new (name, funcClass, #funcs) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => new (label, labelClass, #labels)) in () end) in () end val _ = List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f val _ = remFuncClass name val _ = Vector.foreach (blocks, remLabelClass o Block.label) in () end) in Vector.fromListMap (!chunks, fn {funcs, labels} => {funcs = Vector.fromList (!funcs), labels = Vector.fromList (!labels)}) end structure Class = struct type t = PropertyList.t DisjointSet.t val new = DisjointSet.singleton o PropertyList.new val plist = DisjointSet.! val == = DisjointSet.union val equals = DisjointSet.equals end structure Graph = DirectedGraph structure Node = Graph.Node fun simple (program as Program.T {functions, main, ...}, {mainFns, sccC, sccR, singC, singR}) = let val functions = main :: functions val mainFns = if mainFns then let val {name, blocks, ...} = Function.dest main in Vector.fold (blocks, [name], fn (Block.T {transfer, ...}, mainFns) => case transfer of Call {func, ...} => func::mainFns | _ => mainFns) end else [] fun isMain f = List.exists (mainFns, fn f' => Func.equals (f, f')) val {get = funcInfo: Func.t -> {callSites: Label.t list ref, class: Class.t, function: Function.t, node: unit Node.t}, set = setFuncInfo, rem = remFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Chunkify.simple.funcInfo", Func.layout)) val funcCallSites = #callSites o funcInfo val funcClass = #class o funcInfo val funcFunction = #function o funcInfo val funcNode = #node o funcInfo val {get = labelInfo: Label.t -> {class: Class.t, func: Func.t}, set = setLabelInfo, rem = remLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Chunkify.simple.labelInfo", Label.layout)) val labelClass = #class o labelInfo val labelFunc = #func o labelInfo val {get = nodeInfo: unit Node.t -> {func: Func.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("Chunkify.simple.nodeInfo", Node.layout)) val nodeFunc = #func o nodeInfo val cgraph = Graph.new () val _ = List.foreach (functions, fn f => let val {name, blocks, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setLabelInfo (label, {class = Class.new (), func = name})) val node = Graph.newNode cgraph val _ = setNodeInfo (node, {func = name}) val _ = setFuncInfo (name, {callSites = ref [], class = labelClass start, function = f, node = node}) in () end) (* Place src and dst blocks of intraprocedural transfers in same chunks. *) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {label, transfer, ...} => let val c = labelClass label fun same (j: Label.t): unit = Class.== (c, labelClass j) in case transfer of CCall {return, ...} => Option.app (return, same) | Goto {dst, ...} => same dst | Switch s => Switch.foreachLabel (s, same) | _ => () end)) (* Build interprocedural call graph. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val node = funcNode name in Vector.foreach (blocks, fn Block.T {label, transfer, ...} => case transfer of Call {func, ...} => (List.push (funcCallSites func, label) ; ignore (Graph.addEdge (cgraph, {from = node, to = funcNode func}))) | _ => ()) end) (* Compute rflow. *) val rflow = Program.rflow program val returnsTo = #returnsTo o rflow val raisesTo = #raisesTo o rflow (* Place src and dst blocks of SCC calls/raises/returns in same chunks. *) val _ = List.foreach (Graph.stronglyConnectedComponents cgraph, fn nodes => let val funcs = List.map (nodes, nodeFunc) fun funcInSCC f = List.exists (funcs, fn f' => Func.equals (f, f')) fun labelInSCC l = funcInSCC (labelFunc l) in List.foreach (funcs, fn f => let val {name, blocks, ...} = Function.dest (funcFunction f) fun mkRTo rTo = List.revKeepAllMap (rTo name, fn l => if labelInSCC l then SOME (labelClass l) else NONE) val returnsTo = mkRTo returnsTo val raisesTo = mkRTo raisesTo fun eqRTo (l, rTo) = if sccR then let val lc = labelClass l in List.foreach (rTo, fn rlc => Class.== (lc, rlc)) end else () in Vector.foreach (blocks, fn Block.T {label, transfer, ...} => case transfer of Call {func, ...} => if sccC andalso funcInSCC func then Class.== (labelClass label, funcClass func) else () | Raise _ => eqRTo (label, raisesTo) | Return _ => eqRTo (label, returnsTo) | _ => ()) end) end) (* If all of a function's call sites are in the same (non-main) chunk, * then place the function's entry block in the chunk. * If all of a function's raise/return points are in the same (non-main) chunk, * then place the function's raise/return blocks in the chunk. *) val _ = let val changed = ref false fun loop () = (List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {callSites, class = funcClass, ...} = funcInfo name fun oneClass ls = case ls of [] => NONE | l::ls => let val c = labelClass l in if not (isMain (labelFunc l)) andalso List.forall (ls, fn l => not (isMain (labelFunc l)) andalso Class.equals (c, labelClass l)) then SOME (fn c' => if not (Class.equals (c, c')) then (Class.== (c, c') ; changed := true) else ()) else NONE end fun doSingC () = Option.app (oneClass (!callSites), fn f => f funcClass) val () = if singC then doSingC () else () fun doSingR () = Option.app (oneClass (returnsTo name @ raisesTo name), fn f => Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val f = fn () => f (labelClass label) in case transfer of Raise _ => f () | Return _ => f() | _ => () end)) val () = if singR then doSingR () else () in () end) ; if !changed then (changed := false; loop ()) else ()) in loop () end type chunk = {funcs: Func.t list ref, labels: Label.t list ref} val chunks: chunk list ref = ref [] val {get = classChunk: Class.t -> chunk, ...} = Property.get (Class.plist, Property.initFun (fn _ => let val c = {funcs = ref [], labels = ref []} val _ = List.push (chunks, c) in c end)) val _ = let fun 'a add (l: 'a, get: 'a -> Class.t, sel: chunk -> 'a list ref): unit = List.push (sel (classChunk (get l)), l) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val _ = add (name, funcClass, #funcs) val _ = remFuncInfo name val _ = Vector.foreach (blocks, fn Block.T {label, ...} => (add (label, labelClass, #labels) ; remLabelInfo label)) in () end) in () end in Vector.fromListMap (!chunks, fn {funcs, labels} => {funcs = Vector.fromList (!funcs), labels = Vector.fromList (!labels)}) end fun chunkify p = case !Control.chunkify of Control.Chunkify.Coalesce {limit} => coalesce (p, limit) | Control.Chunkify.One => one p | Control.Chunkify.Func => func p | Control.Chunkify.Simple opts => simple (p, opts) val chunkify = fn p => let val chunks = chunkify p val _ = Control.diagnostics (fn display => let open Layout val _ = display (str "Chunkification:") val _ = Vector.foreach (chunks, fn {funcs, labels} => display (record ([("funcs", Vector.layout Func.layout funcs), ("labels", Vector.layout Label.layout labels)]))) in () end) in chunks end end mlton-20210117+dfsg/mlton/backend/chunkify.sig000066400000000000000000000014711416264345000210750ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CHUNKIFY_STRUCTS = sig include RSSA end signature CHUNKIFY = sig include CHUNKIFY_STRUCTS (* Partitions all the labels declared into disjoint sets, referred * to as chunks. Returns the collection of chunks. * All funcs, conts, and handlers are assumed to be entry points. * All conts and handlers are assumed to be return points. *) val chunkify: Program.t -> {funcs: Func.t vector, labels: Label.t vector} vector end mlton-20210117+dfsg/mlton/backend/collect-statics.fun000066400000000000000000000236741416264345000223710ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CollectStatics (S: RSSA_TRANSFORM_STRUCTS): sig structure Globals: RSSA_TRANSFORM structure RealConsts: RSSA_TRANSFORM structure WordXVectorConsts: RSSA_TRANSFORM end = struct open S structure Block = struct open Block fun replace (T {args, kind, label, statements, transfer}, {const: Const.t -> Operand.t}): t = T {args = args, kind = kind, label = label, statements = Vector.map (statements, fn s => Statement.replace (s, {const = const, var = Operand.Var})), transfer = Transfer.replace (transfer, {const = const, label = fn l => l, var = Operand.Var})} end structure Function = struct open Function fun replace (f, {const: Const.t -> Operand.t}) = let val {args, blocks, name, raises, returns, start} = Function.dest f in Function.new {args = args, blocks = Vector.map (blocks, fn b => Block.replace (b, {const = const})), name = name, raises = raises, returns = returns, start = start} end end fun collectConsts (p, {const, newStatics}) = let val Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics} = p val main = Function.replace (main, {const = const}) val functions = List.map (functions, fn f => Function.replace (f, {const = const})) val statics = Vector.concat [statics, newStatics ()] in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end structure WordXVectorConsts = struct open S fun transform p = let val newStatics = ref [] val table = HashTable.new {equals = WordXVector.equals, hash = WordXVector.hash} fun const c = case c of Const.WordVector wv => HashTable.lookupOrInsert (table, wv, fn () => let val var = Var.newNoname () val ty = Type.wordVector (WordXVector.elementSize wv) val obj = Object.fromWordXVector wv in List.push (newStatics, {dst = (var, ty), obj = obj}) ; Operand.Var {var = var, ty = ty} end) | _ => Operand.Const c in collectConsts (p, {const = const, newStatics = fn () => Vector.fromListRev (!newStatics)}) end end structure RealConsts = struct open S fun transform p = let local fun make rsz = let val vecVar = Var.newString (concat ["real", RealSize.toString rsz, "Consts"]) val vecTycon = ObjptrTycon.realVector rsz val vecTy = Type.objptr vecTycon val vecBase = Operand.Var {ty = vecTy, var = vecVar} val elt = Type.real rsz val scale = (case rsz of RealSize.R32 => Scale.Four | RealSize.R64 => Scale.Eight) val next = Counter.generator 0 val rs = ref [] fun add r = (List.push (rs, r) ; Operand.SequenceOffset {base = vecBase, index = Operand.word (WordX.fromInt (next (), WordSize.seqIndex ())), offset = Bytes.zero, scale = scale, ty = elt}) fun newStatic () = if List.isEmpty (!rs) then NONE else let val init = Vector.fromListMap (List.rev (!rs), fn r => Vector.new1 {offset = Bytes.zero, src = Operand.Const (Const.Real r)}) val obj = Object.Sequence {init = init, tycon = vecTycon} in SOME {dst = (vecVar, vecTy), obj = obj} end in (add, newStatic) end val (add32, newStatic32) = make RealSize.R32 val (add64, newStatic64) = make RealSize.R64 in fun add r = case RealX.size r of RealSize.R32 => add32 r | RealSize.R64 => add64 r fun newStatics () = Vector.fromListRev (List.fold ([newStatic32, newStatic64], [], fn (newStatic, newStatics) => Option.fold (newStatic (), newStatics, op ::))) end val table = HashTable.new {equals = RealX.equals, hash = RealX.hash} fun const c = case c of Const.Real r => HashTable.lookupOrInsert (table, r, fn () => add r) | _ => Operand.Const c in collectConsts (p, {const = const, newStatics = newStatics}) end end structure Globals = struct open S fun transform p = let val Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics} = p val {get = varIsStatic, set = setVarIsStatic, destroy = destroyVarIsStatic} = Property.destGetSet (Var.plist, Property.initConst false) fun operandIsStatic oper = case oper of Operand.Cast (oper, _) => operandIsStatic oper | Operand.Const _ => true | Operand.Var {var, ...} => varIsStatic var | _ => false val newStatics = ref [] fun objectIsStatic obj = let fun initIsStatic init = Vector.forall (init, fn {offset = _, src} => operandIsStatic src) in case obj of Object.Normal {init, ...} => initIsStatic init | Object.Sequence {init, ...} => Vector.forall (init, initIsStatic) end fun statementIsStatic stmt = case stmt of Statement.Object {dst as (dstVar, _), obj} => if objectIsStatic obj then (List.push (newStatics, {dst = dst, obj = obj}) ; setVarIsStatic (dstVar, true) ; true) else false | _ => false val () = Vector.foreach (statics, fn {dst = (dstVar, _), ...} => setVarIsStatic (dstVar, true)) val main = let val {args, name, raises, returns, start, ...} = Function.dest main val blocks = ref [] val () = Function.dfs (main, fn Block.T {args, kind, label, statements, transfer} => let val statements = Vector.keepAll (statements, not o statementIsStatic) val block = Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer} in List.push (blocks, block) ; fn () => () end) in Function.new {args = args, blocks = Vector.fromList (!blocks), name = name, raises = raises, returns = returns, start = start} end val statics = Vector.concat [statics, Vector.fromListRev (!newStatics)] val () = destroyVarIsStatic () in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end end mlton-20210117+dfsg/mlton/backend/equivalence-graph.fun000066400000000000000000000037551416264345000226720ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor EquivalenceGraph (S: EQUIVALENCE_GRAPH_STRUCTS): EQUIVALENCE_GRAPH = struct open S structure Set = DisjointSet structure Plist = PropertyList structure Class = struct datatype t = T of {plist: Plist.t, size: int ref} Set.t local fun make sel (T s) = sel (Set.! s) in val plist = make #plist val size = make (! o #size) end fun setSize (T s, n) = #size (Set.! s) := n fun new (size: int): t = T (Set.singleton {plist = Plist.new (), size = ref size}) fun == (c as T s, T s') = if Set.equals (s, s') then () else let val {size = ref n, ...} = Set.! s val {size = ref n', ...} = Set.! s' in Set.union (s, s') ; setSize (c, n + n') end end datatype t = T of {classes: Class.t list ref, edges: (Class.t * Class.t) list ref} fun new () = T {classes = ref [], edges = ref []} fun newClass (T {classes, ...}, {size}) = let val c = Class.new size val _ = List.push (classes, c) in c end fun addEdge (T {edges, ...}, c, c') = List.push (edges, (c, c')) fun == (_, c, c') = Class.== (c, c') fun coarsen (T {edges, ...}, {maxClassSize}) = let (* Combine classes with an edge between them where possible. *) val _ = List.foreach (!edges, fn (c, c') => if Class.size c + Class.size c' <= maxClassSize then Class.== (c, c') else ()) in () end end structure EquivalenceGraph = EquivalenceGraph () mlton-20210117+dfsg/mlton/backend/equivalence-graph.sig000066400000000000000000000036121416264345000226540ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature EQUIVALENCE_GRAPH_STRUCTS = sig end (* An equivalence graph is an equivalence relation with a weight function on * classes and an edge relation between classes. * * The main operation is coarsen, which takes an equivalence graph and coarsens * the equivalence relation so that the class weights are as large as possible * subject to a constraint. *) signature EQUIVALENCE_GRAPH = sig include EQUIVALENCE_GRAPH_STRUCTS structure Class: sig (* The type of equivalence classes. *) type t val plist: t -> PropertyList.t end (* The type of equivalence graphs. *) type t (* Make two classes equivalent. * The size of the resulting class is the sum of the sizes of the original * two classes. This is a no-op if the classes are already equivalent. *) val == : t * Class.t * Class.t -> unit (* Add a new edge between two classes. *) val addEdge: t * Class.t * Class.t -> unit (* Make the equivalence relation as coarse as possible so that the * number of edges between classes is minimized, subject to the constraint * that the sum of the node sizes in an equivalence class is * <= maxClassSize. Classes for which this constraint was violated by * previous calls to == should not be made coarser. *) val coarsen: t * {maxClassSize: int} -> unit (* Return a new relation. *) val new: unit -> t (* newClass (g, {classSize}) adds a new class to the equivalence graph. *) val newClass: t * {size: int} -> Class.t end mlton-20210117+dfsg/mlton/backend/err.sml000066400000000000000000000025041416264345000200540ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Err = struct datatype t = T of {inner: t option, name: string, obj: Layout.t} fun layout (T {inner, name, obj}): Layout.t = let open Layout in align [case inner of NONE => empty | SOME e => layout e, seq [str (concat ["invalid ", name, ": "]), obj]] end exception E of t fun check' (name: string, ok: unit -> 'a option, layout: unit -> Layout.t): 'a = case ok () handle E e => raise E (T {inner = SOME e, name = name, obj = layout ()}) of NONE => raise E (T {inner = NONE, name = name, obj = layout ()}) | SOME a => a fun boolToUnitOpt b = if b then SOME () else NONE fun check (name, ok, layout) = check' (name, boolToUnitOpt o ok, layout) end mlton-20210117+dfsg/mlton/backend/implement-handlers.fun000066400000000000000000000176331416264345000230620ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ImplementHandlers (S: RSSA_TRANSFORM_STRUCTS): RSSA_TRANSFORM = struct open S datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Function = struct open Function fun hasHandler (f: t): bool = let val {blocks, ...} = dest f in Vector.exists (blocks, fn Block.T {transfer, ...} => case transfer of Transfer.Call {return = (Return.NonTail {handler = Handler.Handle _, ...}), ...} => true | _ => false) end end structure HandlerLat = FlatLattice (structure Point = Label) structure ExnStack = struct local structure ZPoint = struct datatype t = Local | Slot val equals: t * t -> bool = op = val toString = fn Local => "Local" | Slot => "Slot" val layout = Layout.str o toString end structure L = FlatLattice (structure Point = ZPoint) in open L structure Point = ZPoint val locall = point Point.Local val slot = point Point.Slot end end fun flow (f: Function.t): Function.t = if not (Function.hasHandler f) then f else let val debug = false val {args, blocks, name, raises, returns, start} = Function.dest f val {get = labelInfo: Label.t -> {global: ExnStack.t, handler: HandlerLat.t}, rem, ...} = Property.get (Label.plist, Property.initFun (fn _ => {global = ExnStack.new (), handler = HandlerLat.new ()})) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val {global, handler} = labelInfo label val _ = if Label.equals (label, start) then let val _ = ExnStack.<= (ExnStack.slot, global) val _ = HandlerLat.forceTop handler in () end else () fun goto' {global = g, handler = h}: unit = let val _ = ExnStack.<= (global, g) val _ = HandlerLat.<= (handler, h) in () end val goto = goto' o labelInfo in case transfer of Call {return, ...} => (case return of Return.Dead => () | Return.NonTail {cont, handler = h} => let val li as {global = g', handler = h'} = labelInfo cont in case h of Handler.Caller => let val _ = ExnStack.<= (ExnStack.slot, g') val _ = HandlerLat.<= (handler, h') in () end | Handler.Dead => goto' li | Handler.Handle l => let fun doit {global = g'', handler = h''} = let val _ = ExnStack.<= (ExnStack.locall, g'') val _ = HandlerLat.<= (HandlerLat.point l, h'') in () end in doit (labelInfo l) ; doit li end end | Return.Tail => ()) | _ => Transfer.foreachLabel (transfer, goto) end) val _ = if debug then Layout.outputl (Vector.layout (fn Block.T {label, ...} => let val {global, handler} = labelInfo label in Layout.record [("label", Label.layout label), ("global", ExnStack.layout global), ("handler", HandlerLat.layout handler)] end) blocks, Out.error) else () val blocks = Vector.map (blocks, fn Block.T {args, kind, label, statements, transfer} => let val {global, handler} = labelInfo label fun setExnStackSlot () = if ExnStack.isPointEq (global, ExnStack.Point.Slot) then Vector.new0 () else Vector.new1 SetExnStackSlot fun setExnStackLocal () = if ExnStack.isPointEq (global, ExnStack.Point.Local) then Vector.new0 () else Vector.new1 SetExnStackLocal fun setHandler (l: Label.t) = if HandlerLat.isPointEq (handler, l) then Vector.new0 () else Vector.new1 (SetHandler l) val post = case transfer of Call {return, ...} => (case return of Return.Dead => Vector.new0 () | Return.NonTail {handler, ...} => (case handler of Handler.Caller => setExnStackSlot () | Handler.Dead => Vector.new0 () | Handler.Handle l => Vector.concat [setHandler l, setExnStackLocal ()]) | Return.Tail => setExnStackSlot ()) | Raise _ => setExnStackSlot () | Return _ => setExnStackSlot () | _ => Vector.new0 () val statements = Vector.concat [statements, post] in Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer} end) val newStart = Label.newNoname () val startBlock = Block.T {args = Vector.new0 (), kind = Kind.Jump, label = newStart, statements = Vector.new1 SetSlotExnStack, transfer = Goto {args = Vector.new0 (), dst = start}} val blocks = Vector.concat [blocks, Vector.new1 startBlock] val () = Vector.foreach (blocks, rem o Block.label) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = newStart} end fun transform (Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics}) = Program.T {functions = List.revMap (functions, flow), handlesSignals = handlesSignals, main = flow main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end mlton-20210117+dfsg/mlton/backend/implement-profiling.fun000066400000000000000000001250531416264345000232470ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ImplementProfiling (S: RSSA_TRANSFORM_STRUCTS): RSSA_TRANSFORM = struct open S structure CFunction = struct open CFunction structure CType = struct open CType val gcState = cpointer end local fun make {args, name, prototype} = T {args = args, convention = Convention.Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = true, writesStackTop = false}, prototype = (prototype, NONE), return = Type.unit, symbolScope = SymbolScope.Private, target = Target.Direct name} in val profileEnter = fn () => make {args = Vector.new1 (Type.gcState ()), name = "GC_profileEnter", prototype = Vector.new1 CType.gcState} val profileInc = fn () => make {args = Vector.new2 (Type.gcState (), Type.csize ()), name = "GC_profileInc", prototype = Vector.new2 (CType.gcState, CType.csize ())} val profileLeave = fn () => make {args = Vector.new1 (Type.gcState ()), name = "GC_profileLeave", prototype = Vector.new1 CType.gcState} end end type sourceSeq = {sourceIndex: int} list structure InfoNode = struct datatype t = T of {info: SourceInfo.t, sourceNameIndex: int, sourceIndex: int, successors: t list ref} local fun make f (T r) = f r in val info = make #info val sourceIndex = make #sourceIndex end fun layout (T {info, ...}) = Layout.record [("info", SourceInfo.layout info)] fun equals (n: t, n': t): bool = SourceInfo.equals (info n, info n') fun call {from = T {successors, ...}, to as T {info = i', ...}} = if let open SourceInfo in equals (i', gc) orelse equals (i', main) orelse equals (i', unknown) end orelse List.exists (!successors, fn n => equals (n, to)) then () else List.push (successors, to) val call = Trace.trace ("Profile.InfoNode.call", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) call end structure FuncInfo = struct datatype t = T of {callers: InfoNode.t list ref, enters: InfoNode.t list ref, seen: bool ref, tailCalls: t list ref} fun new () = T {callers = ref [], enters = ref [], seen = ref false, tailCalls = ref []} end structure Push = struct datatype t = Enter of InfoNode.t | Skip of SourceInfo.t fun layout z = let open Layout in case z of Enter n => seq [str "Enter ", InfoNode.layout n] | Skip i => seq [str "Skip ", SourceInfo.layout i] end fun toSourceSeq (ps: t list): sourceSeq = List.fold (rev ps, [], fn (p, ac) => case p of Enter (InfoNode.T {sourceIndex, ...}) => {sourceIndex = sourceIndex} :: ac | Skip _ => ac) end val traceEnter = Trace.trace2 ("Profile.enter", List.layout Push.layout, SourceInfo.layout, Layout.tuple2 (List.layout Push.layout, Bool.layout)) fun transform program = if !Control.profile = Control.ProfileNone then program else let val Program.T {functions, handlesSignals, main, objectTypes, statics, ...} = program fun tyconTy tycon = Vector.sub (objectTypes, ObjptrTycon.index tycon) val debug = false datatype z = datatype Control.profile val profile = !Control.profile val profileStack: bool = !Control.profileStack val needProfileLabels: bool = profile = ProfileTimeLabel orelse profile = ProfileLabel val needCodeCoverage: bool = needProfileLabels orelse (profile = ProfileTimeField) val infoNodes: InfoNode.t list ref = ref [] val sourceNames: string list ref = ref [] local val nextSourceName = Counter.generator 0 val sep = if profile = ProfileCallStack then " " else "\t" val {get = sourceNameIndex, ...} = Property.get (SourceInfo.plist, Property.initFun (fn si => (List.push (sourceNames, SourceInfo.toString' (si, sep)) ; nextSourceName ()))) val nextSource = Counter.generator 0 in fun sourceInfoNode (si: SourceInfo.t) = let val infoNode = InfoNode.T {info = si, sourceNameIndex = sourceNameIndex si, sourceIndex = nextSource (), successors = ref []} val _ = List.push (infoNodes, infoNode) in infoNode end end fun firstEnter (ps: Push.t list): InfoNode.t option = List.peekMap (ps, fn p => case p of Push.Enter n => SOME n | _ => NONE) (* unknown must be 0, which == SOURCES_INDEX_UNKNOWN from sources.h *) val unknownInfoNode = sourceInfoNode SourceInfo.unknown (* gc must be 1 which == SOURCES_INDEX_GC from sources.h *) val gcInfoNode = sourceInfoNode SourceInfo.gc val mainInfoNode = sourceInfoNode SourceInfo.main fun wantedSource (si: SourceInfo.t): bool = if SourceInfo.isC si then List.length (!Control.profileC) > 0 else (case SourceInfo.file si of NONE => true | SOME file => List.foldr (!Control.profileInclExcl, true, fn ((re, keep), b) => if Regexp.Compiled.matchesAll (re, file) then keep else b)) val wantedSource = Trace.trace ("Profile.wantedSource", SourceInfo.layout, Bool.layout) wantedSource fun wantedCSource (si: SourceInfo.t): bool = wantedSource si andalso if SourceInfo.isC si then false else (case SourceInfo.file si of NONE => false | SOME file => List.foldr (!Control.profileC, false, fn (re, b) => if Regexp.Compiled.matchesAll (re, file) then true else b)) val wantedCSource = Trace.trace ("Profile.wantedCSource", SourceInfo.layout, Bool.layout) wantedCSource fun keepSource (si: SourceInfo.t): bool = profile <> ProfileCount orelse wantedSource si val keepSource = Trace.trace ("Profile.keepSource", SourceInfo.layout, Bool.layout) keepSource (* With -profile count, we want to get zero counts for all functions, * whether or not they made it into the final executable. *) val () = case profile of ProfileCount => List.foreach (SourceInfo.all (), fn si => if wantedSource si then ignore (sourceInfoNode si) else ()) | _ => () val sourceInfoNode = fn si => let open SourceInfo in if equals (si, unknown) then unknownInfoNode else if equals (si, gc) then gcInfoNode else if equals (si, main) then mainInfoNode else sourceInfoNode si end val sourceInfoNode = Trace.trace ("Profile.sourceInfoNode", SourceInfo.layout, InfoNode.layout) sourceInfoNode val sourceSeqs: {sourceIndex: int} vector list ref = ref [] local val table: ({sourceIndex: int} vector, int) HashTable.t = let fun equals (sourceSeq1, sourceSeq2) = Vector.equals (sourceSeq1, sourceSeq2, fn ({sourceIndex = si1}, {sourceIndex = si2}) => si1 = si2) fun hash sourceSeq = Hash.vectorMap (sourceSeq, fn {sourceIndex} => Word.fromInt sourceIndex) in HashTable.new {equals = equals, hash = hash} end val nextSourceSeqIndex = Counter.generator 0 in fun sourceSeqIndex (s: sourceSeq): int = let val s = Vector.fromListRev s in HashTable.lookupOrInsert (table, s, fn () => (List.push (sourceSeqs, s) ; nextSourceSeqIndex ())) end end (* Ensure that [SourceInfo.unknown] is index 0. *) val _ = sourceSeqIndex [{sourceIndex = InfoNode.sourceIndex unknownInfoNode}] (* Ensure that [SourceInfo.gc] is index 1. *) val _ = sourceSeqIndex [{sourceIndex = InfoNode.sourceIndex gcInfoNode}] local (* Cannot use Label.plist, because RSSA Labels are cleared * between ImplementProfiling and conversion to Machine. *) val frameSourceSeqIndex: (Label.t, int) HashTable.t = HashTable.new {equals = Label.equals, hash = Label.hash} in fun addFrameSourceSeqIndex (label: Label.t, sourceSeqIndex: int): unit = (ignore o HashTable.insertIfNew) (frameSourceSeqIndex, label, fn () => sourceSeqIndex, fn _ => Error.bug ("ImplementProfiling.addFrameSourceSeqIndex: " ^ Label.toString label)) fun getFrameSourceSeqIndex (label: Label.t) : int option = HashTable.peek (frameSourceSeqIndex, label) end fun addFramePushes (label: Label.t, pushes: Push.t list): unit = addFrameSourceSeqIndex (label, sourceSeqIndex (Push.toSourceSeq pushes)) val {get = labelInfo: Label.t -> {block: Block.t, visited1: bool ref, visited2: bool ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val profileLabelInfos = ref [] fun profileLabelFromIndex (sourceSeqIndex: int): Statement.t = let val pl = ProfileLabel.new () val _ = List.push (profileLabelInfos, {profileLabel = pl, sourceSeqIndex = sourceSeqIndex}) in Statement.ProfileLabel pl end fun setCurSourceSeqIndexFromIndex (sourceSeqIndex: int): Statement.t = let val curSourceSeqIndex = Operand.Runtime Runtime.GCField.CurSourceSeqIndex in Statement.Move {dst = curSourceSeqIndex, src = Operand.word (WordX.fromInt (sourceSeqIndex, WordSize.word32))} end fun codeCoverageStatementFromSourceSeqIndex (sourceSeqIndex: int): Statement.t = if needProfileLabels then profileLabelFromIndex sourceSeqIndex else if profile = ProfileTimeField then setCurSourceSeqIndexFromIndex sourceSeqIndex else Error.bug "Profile.codeCoverageStatement" fun codeCoverageStatement (sourceSeq: sourceSeq): Statement.t = codeCoverageStatementFromSourceSeqIndex (sourceSeqIndex sourceSeq) local val {get: Func.t -> FuncInfo.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncInfo.new ())) in val funcInfo = get fun addFuncEdges () = (* Don't need to add edges for main because no one calls it. *) List.foreach (functions, fn f => let val allSeen: bool ref list ref = ref [] val func = Function.name f val fi as FuncInfo.T {callers, ...} = get func (* Add edges from all the callers to the enters in f and all * functions that f tail calls. *) fun call (FuncInfo.T {enters, seen, tailCalls, ...}): unit = if !seen then () else let val _ = seen := true val _ = List.push (allSeen, seen) val _ = List.foreach (!callers, fn from => List.foreach (!enters, fn to => InfoNode.call {from = from, to = to})) in List.foreach (!tailCalls, call) end val _ = call fi val _ = List.foreach (!allSeen, fn r => r := false) in () end) end fun doFunction (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val _ = if not debug then () else print (concat ["doFunction ", Func.toString name, "\n"]) val FuncInfo.T {enters, tailCalls, ...} = funcInfo name fun enter (ps: Push.t list, si: SourceInfo.t): Push.t list * bool = let val node = Promise.lazy (fn () => sourceInfoNode si) fun yes () = (Push.Enter (node ()) :: ps, true) fun no () = (Push.Skip si :: ps, false) in if SourceInfo.equals (si, SourceInfo.unknown) then no () else case firstEnter ps of NONE => if keepSource si then (List.push (enters, node ()) ; yes ()) else no () | SOME (node' as InfoNode.T {info = si', ...}) => (* * si : callee * si' : caller *) if keepSource si andalso let open SourceInfo in equals (si', unknown) orelse (wantedSource si andalso not (equals (si, gcSequenceAllocate)) andalso (not (isC si) orelse (wantedCSource si' andalso not (equals (si', main))))) end then (InfoNode.call {from = node', to = node ()} ; yes ()) else no () end val enter = traceEnter enter val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, {block = block, visited1 = ref false, visited2 = ref false})) (* Find the first Enter statement and (conceptually) move it to the * front of the function. *) local exception Yes of Label.t * Statement.t fun goto l = let val {block, visited1, ...} = labelInfo l in if !visited1 then () else let val () = visited1 := true val Block.T {statements, transfer, ...} = block val () = Vector.foreach (statements, fn s => case s of Statement.Profile (ProfileExp.Enter _) => raise Yes (l, s) | _ => ()) val () = Transfer.foreachLabel (transfer, goto) in () end end in val first = (goto start; NONE) handle Yes z => SOME z end val blocks = ref [] datatype z = datatype Statement.t datatype z = datatype ProfileExp.t fun backward {args, kind, label, leaves, sourceSeq: sourceSeq, statements: Statement.t list, transfer: Transfer.t}: unit = let val (_, ncc, sourceSeq, statements) = List.fold (statements, (leaves, true, sourceSeq, []), fn (s, (leaves, ncc, sourceSeq, ss)) => case s of Profile ps => let val (ncc, ss) = if needCodeCoverage then if ncc andalso not (List.isEmpty sourceSeq) then (false, codeCoverageStatement sourceSeq :: ss) else (true, ss) else (false, ss) val (leaves, sourceSeq) = case ps of Enter _ => (case sourceSeq of [] => Error.bug "Profile.backward: unmatched Enter" | _ :: sis => (leaves, sis)) | Leave _ => (case leaves of [] => Error.bug "Profile.backward: missing Leave" | infoNode :: leaves => (leaves, {sourceIndex = InfoNode.sourceIndex infoNode} :: sourceSeq)) in (leaves, ncc, sourceSeq, ss) end | _ => (leaves, true, sourceSeq, s :: ss)) val statements = if needCodeCoverage andalso ncc then codeCoverageStatement sourceSeq :: statements else statements val {args, kind, label} = if profileStack andalso (case kind of Kind.Cont _ => true | Kind.Handler => true | _ => false) then let val func = CFunction.profileLeave () val newLabel = Label.newNoname () val _ = addFrameSourceSeqIndex (newLabel, sourceSeqIndex sourceSeq) val statements = if needCodeCoverage then (Vector.new1 (codeCoverageStatement sourceSeq)) else Vector.new0 () val _ = List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = Transfer.CCall {args = Vector.new1 Operand.GCState, func = func, return = SOME newLabel}}) in {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = newLabel} end else {args = args, kind = kind, label = label} in List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = Vector.fromList statements, transfer = transfer}) end val backward = Trace.trace ("Profile.backward", fn {leaves, statements, sourceSeq, ...} => let open Layout in record [("leaves", List.layout InfoNode.layout leaves), ("sourceSeq", List.layout (fn {sourceIndex} => record [("sourceIndex", Int.layout sourceIndex)]) sourceSeq), ("statements", List.layout Statement.layout statements)] end, Unit.layout) backward fun profileEnter (pushes: Push.t list, transfer: Transfer.t): Transfer.t = let val func = CFunction.profileEnter () val newLabel = Label.newNoname () val sourceSeqIndex = sourceSeqIndex (Push.toSourceSeq pushes) val _ = addFrameSourceSeqIndex (newLabel, sourceSeqIndex) val statements = if needCodeCoverage then Vector.new1 (codeCoverageStatementFromSourceSeqIndex sourceSeqIndex) else Vector.new0 () val _ = List.push (blocks, Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = newLabel, statements = statements, transfer = transfer}) in Transfer.CCall {args = Vector.new1 Operand.GCState, func = func, return = SOME newLabel} end fun goto (l: Label.t, pushes: Push.t list): unit = let val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout Push.layout pushes, str ")"], Out.error) end val {block, visited2, ...} = labelInfo l in if !visited2 then () else let val _ = visited2 := true val Block.T {args, kind, label, statements, transfer, ...} = block val statements = case first of NONE => statements | SOME (firstLabel, firstEnter) => if Label.equals (label, firstLabel) then Vector.removeFirst (statements, fn s => case s of Profile (Enter _) => true | _ => false) else if Label.equals (label, start) then Vector.concat [Vector.new1 firstEnter, statements] else statements val _ = let fun add pushes = addFramePushes (label, pushes) datatype z = datatype Kind.t in case kind of Cont _ => add pushes | CReturn {func, ...} => let datatype z = datatype CFunction.Target.t val target = CFunction.target func fun doit si = add (#1 (enter (pushes, si))) in case target of Direct "GC_collect" => doit SourceInfo.gc | Direct "GC_sequenceAllocate" => doit SourceInfo.gcSequenceAllocate | Direct "MLton_bug" => add pushes | Direct name => doit (SourceInfo.fromC name) | Indirect => doit (SourceInfo.fromC "") end | Handler => add pushes | Jump => () end fun maybeSplit {args, bytesAllocated: Bytes.t, kind, label, leaves, pushes: Push.t list, shouldSplit: bool, statements} = if not shouldSplit then {args = args, bytesAllocated = Bytes.zero, kind = kind, label = label, leaves = leaves, statements = statements} else let val newLabel = Label.newNoname () val _ = addFramePushes (newLabel, pushes) val func = CFunction.profileInc () val amount = case profile of ProfileAlloc => Bytes.toInt bytesAllocated | ProfileCount => 1 | _ => Error.bug "Profile.maybeSplit: amount" val transfer = Transfer.CCall {args = (Vector.new2 (Operand.GCState, Operand.word (WordX.fromInt (amount, WordSize.csize ())))), func = func, return = SOME newLabel} val sourceSeq = Push.toSourceSeq pushes val _ = backward {args = args, kind = kind, label = label, leaves = leaves, sourceSeq = sourceSeq, statements = statements, transfer = transfer} in {args = Vector.new0 (), bytesAllocated = Bytes.zero, kind = Kind.CReturn {func = func}, label = newLabel, leaves = [], statements = []} end val {args, bytesAllocated, kind, label, leaves, pushes, statements} = Vector.fold (statements, {args = args, bytesAllocated = Bytes.zero, kind = kind, label = label, leaves = [], pushes = pushes, statements = []}, fn (s, {args, bytesAllocated, kind, label, leaves, pushes: Push.t list, statements}) => (if not debug then () else let open Layout in outputl (seq [List.layout Push.layout pushes, str " ", Statement.layout s], Out.error) end ; case s of Object {obj, ...} => {args = args, bytesAllocated = Bytes.+ (bytesAllocated, Object.size (obj, {tyconTy = tyconTy})), kind = kind, label = label, leaves = leaves, pushes = pushes, statements = s :: statements} | Profile ps => let val shouldSplit = profile = ProfileAlloc andalso Bytes.> (bytesAllocated, Bytes.zero) val {args, bytesAllocated, kind, label, leaves, statements} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} datatype z = datatype ProfileExp.t val (pushes, keep, leaves) = case ps of Enter si => let val (pushes, keep) = enter (pushes, si) in (pushes, keep, leaves) end | Leave si => (case pushes of [] => Error.bug "Profile.goto: unmatched Leave" | p :: pushes => let val (keep, si', leaves) = case p of Push.Enter (infoNode as InfoNode.T {info, ...}) => (true, info, infoNode :: leaves) | Push.Skip si' => (false, si', leaves) in if SourceInfo.equals (si, si') then (pushes, keep, leaves) else Error.bug "Profile.goto: mismatched Leave" end) val shouldSplit = profile = ProfileCount andalso (case ps of Enter _ => keep | _ => false) val {args, bytesAllocated, kind, label, leaves, statements} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} val statements = if keep then s :: statements else statements in {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, statements = statements} end | _ => {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, statements = s :: statements}) ) val shouldSplit = profile = ProfileAlloc andalso Bytes.> (bytesAllocated, Bytes.zero) val {args, kind, label, leaves, statements, ...} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} val _ = Transfer.foreachLabel (transfer, fn l => goto (l, pushes)) val transfer = case transfer of Transfer.Call {func, return, ...} => let val fi as FuncInfo.T {callers, ...} = funcInfo func in case return of Return.NonTail _ => let val _ = case firstEnter pushes of NONE => List.push (tailCalls, fi) | SOME n => List.push (callers, n) in if profileStack then profileEnter (pushes, transfer) else transfer end | _ => (List.push (tailCalls, fi) ; transfer) end | _ => transfer in backward {args = args, kind = kind, label = label, leaves = leaves, sourceSeq = Push.toSourceSeq pushes, statements = statements, transfer = transfer} end end val _ = goto (start, []) val blocks = Vector.fromList (!blocks) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end val (main, functions) = (doFunction main, List.map (functions, doFunction)) val _ = addFuncEdges () val profileLabelInfos = Vector.fromList (!profileLabelInfos) val sourceNames = Vector.fromListRev (!sourceNames) val sources = Vector.map (Vector.fromListRev (!infoNodes), fn InfoNode.T {sourceNameIndex, successors, ...} => {sourceNameIndex = sourceNameIndex, successorSourceSeqIndex = (sourceSeqIndex (List.revMap (!successors, fn infoNode => {sourceIndex = InfoNode.sourceIndex infoNode})))}) (* Making sourceSeqs must happen after making sources, * since making sources creates new sourceSeqs. *) val sourceSeqs = Vector.fromListRev (!sourceSeqs) val sourceMaps = SourceMaps.T {profileLabelInfos = profileLabelInfos, sourceNames = sourceNames, sourceSeqs = sourceSeqs, sources = sources} in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = SOME {sourceMaps = sourceMaps, getFrameSourceSeqIndex = getFrameSourceSeqIndex}, statics = statics} end end mlton-20210117+dfsg/mlton/backend/limit-check.fun000066400000000000000000001120011416264345000214440ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * The goal of limit check insertion is to ensure that * 1. At any allocation of b bytes, frontier + b <= base + heapSize * 2. At entry to each function, stackTop <= stackLimit * * It assumes that runtime provides several operands to help with this. * Frontier * Limit * LimitPlusSlop * StackLimit * StackTop * * There are three different kinds of checks inserted, depending on the * amount being allocated and whether or not the program uses signal * handlers. * * 1. If b <= LIMIT_SLOP, then continue (don't GC) if * * frontier <= limit * * The reason this works is that if frontier <= limit and b <= * LIMIT_SLOP, then * frontier + b <= limit + LIMIT_SLOP * = limitPlusSlop * = base + heapSize * This works even if the program uses signal handlers, which set * limit to zero, since frontier <= 0 will always be false. * * 2. If b > LIMIT_SLOP and if the program doesn't use signal handlers, * then continue (don't GC) if * * b <= limitPlusSlop - frontier * * The reason this works is that the condition is equivalent to * * b + frontier <= limitPlusSlop = base + heapSize * * We write the condition the way we do instead of the more obvious way * because "b + frontier" may overflow, while limitPlusSlop - frontier * can not, unless the program uses signal handlers. * * 3. If b > LIMIT_SLOP and if the program uses signal handlers, then * continue (don't GC) if * * limit > 0 * and b <= limitPlusSlop - frontier * * This is like case (2), except that because the program uses signal * handlers, the runtime may have set limit to zero to indicate that a * signal needs to be handled. So, we first check that this is not * the case before continuing as in case (2). * * Stack limit checks are completely orthogonal to heap checks, and are simply * inserted at the start of each function. *) functor LimitCheck (S: RSSA_TRANSFORM_STRUCTS): RSSA_TRANSFORM = struct open S structure LimitCheck = struct datatype t = PerBlock | ExtBasicBlocks | LoopHeaders of {fullCFG: bool, loopExits: bool} end structure Control = struct open Control datatype limitCheck = datatype LimitCheck.t val limitCheck = ref (LoopHeaders {fullCFG = false, loopExits = true}) end datatype z = datatype Transfer.t structure CFunction = struct open CFunction Type.BuiltInCFunction end structure Statement = struct open Statement fun bytesAllocated (s: t, {tyconTy}): Bytes.t = case s of Object {obj, ...} => Object.size (obj, {tyconTy = tyconTy}) | _ => Bytes.zero end structure Transfer = struct open Transfer datatype bytesAllocated = Big of Operand.t | Small of Bytes.t fun bytesAllocated (t: t): bytesAllocated = case t of CCall {args, func, ...} => (case CFunction.bytesNeeded func of NONE => Small Bytes.zero | SOME i => let val z = Vector.sub (args, i) in case z of Operand.Const c => (case c of Const.Word w => let val w = WordX.toIntInf w in (* 512 is small and arbitrary *) if w <= 512 then Small (Bytes.fromIntInf w) else Big z end | _ => Error.bug "LimitCheck.Transfer.bytesAllocated: strange numBytes") | _ => Big z end) | _ => Small Bytes.zero end structure Block = struct open Block fun objectBytesAllocated (T {statements, transfer, ...}, {tyconTy}): Bytes.t = Bytes.+ (Vector.fold (statements, Bytes.zero, fn (s, ac) => let val b = Statement.bytesAllocated (s, {tyconTy = tyconTy}) in Bytes.+ (ac, b) end), case Transfer.bytesAllocated transfer of Transfer.Big _ => Bytes.zero | Transfer.Small b => b) end fun insertFunction (f: Function.t, handlesSignals: bool, newFlag: unit -> Operand.t, blockCheckAmount: {blockIndex: int} -> Bytes.t, ensureFree: Label.t -> Bytes.t) = let val {args, blocks, name, raises, returns, start} = Function.dest f val lessThan = Prim.Word_lt (WordSize.csize (), {signed = false}) val newBlocks = ref [] local val r: Label.t option ref = ref NONE in fun heapCheckTooLarge () = case !r of SOME l => l | NONE => let val l = Label.newNoname () val _ = r := SOME l val cfunc = CFunction.T {args = Vector.new0 (), convention = CFunction.Convention.Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = false, writesStackTop = false}, prototype = (Vector.new0 (), NONE), return = Type.unit, symbolScope = CFunction.SymbolScope.Private, target = CFunction.Target.Direct "MLton_heapCheckTooLarge"} val _ = newBlocks := Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = Vector.new0 (), transfer = Transfer.CCall {args = Vector.new0 (), func = cfunc, return = NONE}} :: !newBlocks in l end end val _ = Vector.foreachi (blocks, fn (i, Block.T {args, kind, label, statements, transfer}) => let val transfer = case transfer of Transfer.CCall {args, func, return} => (case CFunction.ensuresBytesFree func of NONE => transfer | SOME i => Transfer.CCall {args = Vector.mapi (args, fn (j, arg) => if i = j then Operand.word (WordX.fromBytes (ensureFree (valOf return), WordSize.csize ())) else arg), func = func, return = return}) | _ => transfer val stack = Label.equals (start, label) fun insert (amount: Operand.t (* of type word *)) = let val collect = Label.newNoname () val collectReturn = Label.newNoname () val dontCollect = Label.newNoname () val (dontCollect', collectReturnStatements, force) = case !Control.gcCheck of Control.First => let val flag = newFlag () val dontCollect' = Label.newNoname () val _ = List.push (newBlocks, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect', statements = Vector.new0 (), transfer = Transfer.ifBoolE (flag, !Control.gcExpect, {falsee = dontCollect, truee = collect})}) in (dontCollect', Vector.new1 (Statement.Move {dst = flag, src = Operand.bool false}), flag) end | Control.Limit => (dontCollect, Vector.new0 (), Operand.bool false) | Control.Every => (collect, Vector.new0 (), Operand.bool true) val func = CFunction.gc {maySwitchThreads = handlesSignals} val _ = newBlocks := Block.T {args = Vector.new0 (), kind = Kind.Jump, label = collect, statements = Vector.new0 (), transfer = (Transfer.CCall {args = Vector.new3 (Operand.GCState, amount, force), func = func, return = SOME collectReturn})} :: (Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = collectReturn, statements = collectReturnStatements, transfer = Transfer.Goto {dst = dontCollect, args = Vector.new0 ()}}) :: Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect, statements = statements, transfer = transfer} :: !newBlocks in {collect = collect, dontCollect = dontCollect'} end fun newBlock (isFirst, statements, transfer) = let val (args, kind, label) = if isFirst then (args, kind, label) else (Vector.new0 (), Kind.Jump, Label.newNoname ()) val _ = List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) in label end fun gotoHeapCheckTooLarge () = newBlock (true, Vector.new0 (), Transfer.Goto {args = Vector.new0 (), dst = heapCheckTooLarge ()}) fun primApp (prim, op1, op2, {collect, dontCollect}) = let val res = Var.newNoname () val s = Statement.PrimApp {args = Vector.new2 (op1, op2), dst = SOME (res, Type.bool), prim = prim} val transfer = Transfer.ifBoolE (Operand.Var {var = res, ty = Type.bool}, !Control.gcExpect, {falsee = dontCollect, truee = collect}) in (Vector.new1 s, transfer) end datatype z = datatype Runtime.GCField.t fun stackCheck (maybeFirst, z): Label.t = let val (statements, transfer) = primApp (Prim.CPointer_lt, Operand.Runtime StackLimit, Operand.Runtime StackTop, z) in newBlock (maybeFirst, statements, transfer) end fun maybeStack (): unit = if stack then ignore (stackCheck (true, insert (Operand.zero (WordSize.csize ())))) else (* No limit check, just keep the block around. *) List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) fun frontierCheck (isFirst, prim, op1, op2, z as {collect, dontCollect = _}): Label.t = let val (statements, transfer) = primApp (prim, op1, op2, z) val l = newBlock (isFirst andalso not stack, statements, transfer) in if stack then stackCheck (isFirst, {collect = collect, dontCollect = l}) else l end fun heapCheck (isFirst: bool, amount: Operand.t (* of type word *)): Label.t = let val z as {collect, ...} = insert amount val res = Var.newNoname () val s = (* Can't do Limit - Frontier, because don't know that * Frontier < Limit. *) Statement.PrimApp {args = Vector.new2 (Operand.Runtime LimitPlusSlop, Operand.Runtime Frontier), dst = SOME (res, Type.csize ()), prim = Prim.CPointer_diff} val (statements, transfer) = primApp (lessThan, Operand.Var {var = res, ty = Type.csize ()}, amount, z) val statements = Vector.concat [Vector.new1 s, statements] in if handlesSignals then frontierCheck (isFirst, Prim.CPointer_equal, Operand.Runtime Limit, Operand.null, {collect = collect, dontCollect = newBlock (false, statements, transfer)}) else if stack then stackCheck (isFirst, {collect = collect, dontCollect = newBlock (false, statements, transfer)}) else newBlock (isFirst, statements, transfer) end fun heapCheckNonZero (bytes: Bytes.t): unit = ignore (if Bytes.<= (bytes, Runtime.limitSlop) then frontierCheck (true, Prim.CPointer_lt, Operand.Runtime Limit, Operand.Runtime Frontier, insert (Operand.zero (WordSize.csize ()))) else let val bytes = SOME (WordX.fromBytes (bytes, WordSize.csize ())) handle Overflow => NONE in case bytes of NONE => gotoHeapCheckTooLarge () | SOME bytes => heapCheck (true, Operand.word bytes) end) fun smallAllocation (): unit = let val b = blockCheckAmount {blockIndex = i} in if Bytes.isZero b then maybeStack () else heapCheckNonZero b end fun bigAllocation (bytesNeeded: Operand.t): unit = let val extraBytes = blockCheckAmount {blockIndex = i} in case bytesNeeded of Operand.Const c => (case c of Const.Word w => heapCheckNonZero (Bytes.+ (Bytes.fromIntInf (WordX.toIntInf w), extraBytes)) | _ => Error.bug "LimitCheck.bigAllocation: strange constant bytesNeeded") | _ => let val bytes = Var.newNoname () val test = Var.newNoname () val extraBytes = let val extraBytes = WordX.fromBytes (extraBytes, WordSize.csize ()) in SOME extraBytes end handle Overflow => NONE in case extraBytes of NONE => ignore (gotoHeapCheckTooLarge ()) | SOME extraBytes => (ignore o newBlock) (true, Vector.new2 (Statement.PrimApp {args = Vector.new2 (Operand.word extraBytes, bytesNeeded), dst = SOME (bytes, Type.csize ()), prim = Prim.Word_add (WordSize.csize ())}, Statement.PrimApp {args = Vector.new2 (Operand.word extraBytes, bytesNeeded), dst = SOME (test, Type.bool), prim = Prim.Word_addCheckP (WordSize.csize (), {signed = false})}), Transfer.ifBoolE (Operand.Var {var = test, ty = Type.bool}, !Control.gcExpect, {falsee = heapCheck (false, Operand.Var {var = bytes, ty = Type.csize ()}), truee = heapCheckTooLarge ()})) end end in case Transfer.bytesAllocated transfer of Transfer.Big z => bigAllocation z | Transfer.Small _ => smallAllocation () end) in Function.new {args = args, blocks = Vector.fromList (!newBlocks), name = name, raises = raises, returns = returns, start = start} end fun insertPerBlock (f: Function.t, handlesSignals, newFlag, tyconTy) = let val {blocks, ...} = Function.dest f fun blockCheckAmount {blockIndex} = Block.objectBytesAllocated (Vector.sub (blocks, blockIndex), {tyconTy = tyconTy}) in insertFunction (f, handlesSignals, newFlag, blockCheckAmount, fn _ => Bytes.zero) end structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge structure Forest = Graph.LoopForest val traceMaxPath = Trace.trace ("LimitCheck.maxPath", Int.layout, Bytes.layout) fun isolateBigTransfers (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val newBlocks = ref [] val () = Vector.foreach (blocks, fn block as Block.T {args, kind, label, statements, transfer} => case Transfer.bytesAllocated transfer of Transfer.Big _ => let val l = Label.newNoname () in List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = Goto {args = Vector.new0 (), dst = l}}) ; List.push (newBlocks, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = Vector.new0 (), transfer = transfer}) end | Transfer.Small _ => List.push (newBlocks, block)) val blocks = Vector.fromListRev (!newBlocks) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end fun insertCoalesce (f: Function.t, handlesSignals, newFlag, tyconTy) = let val f = isolateBigTransfers f val {blocks, start, ...} = Function.dest f val n = Vector.length blocks val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("LimitCheck.labelIndex", Label.layout)) val {get = nodeIndex, set = setNodeIndex, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("LimitCheck.nodeIndex", Node.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) (* Build the graph. *) val g = Graph.new () val nodes = Vector.tabulate (n, fn i => let val n = Graph.newNode g val _ = setNodeIndex (n, i) in n end) fun indexNode i = Vector.sub (nodes, i) val labelNode = indexNode o labelIndex val root = Graph.newNode g (* mayHaveCheck == E U D * E = set of entry nodes * = start, Cont, Handler, * or CReturn that doesn't ensure bytesFree * Jump that calls a cfunction with bytesneeded * D = set of decycling nodes *) val mayHaveCheck = Array.tabulate (n, fn i => let val Block.T {kind, transfer, ...} = Vector.sub (blocks, i) datatype z = datatype Kind.t val isBigAlloc = case Transfer.bytesAllocated transfer of Transfer.Big _ => true | Transfer.Small _ => false val b = case kind of Cont _ => true | CReturn {func, ...} => CFunction.mayGC func andalso not (Option.isSome (CFunction.ensuresBytesFree func)) | Handler => true | Jump => (case transfer of Transfer.CCall {args, func, ...} => (case CFunction.bytesNeeded func of NONE => true | SOME i => (case Vector.sub (args, i) of Operand.Const _ => false | _ => true)) | _ => false) in b orelse isBigAlloc end) val _ = Array.update (mayHaveCheck, labelIndex start, true) (* Build cfg. *) val _ = Graph.addEdge (g, {from = root, to = labelNode start}) datatype z = datatype Control.limitCheck val fullCFG = case !Control.limitCheck of ExtBasicBlocks => true | LoopHeaders {fullCFG, ...} => fullCFG | _ => Error.bug "LimitCheck.insertCoalesce: fullCFG" val _ = Vector.foreachi (blocks, fn (i, Block.T {transfer, ...}) => let val from = indexNode i in Transfer.foreachLabel (transfer, fn l => let val i' = labelIndex l val to = indexNode i' fun addEdge from = (ignore o Graph.addEdge) (g, {from = from, to = to}) in if fullCFG then addEdge from else if Array.sub (mayHaveCheck, i') then addEdge root else addEdge from end) end) val objectBytesAllocated = Vector.map (blocks, fn b => Block.objectBytesAllocated (b, {tyconTy = tyconTy})) fun insertCoalesceExtBasicBlocks () = let val preds = Array.new (n, 0) fun incPred i = Array.update (preds, i, 1 + (Array.sub (preds, i))) val _ = Vector.foreach (nodes, fn node => List.foreach (Node.successors node, incPred o nodeIndex o Edge.to)) val _ = Array.foreachi (preds, fn (i, n) => if n > 1 then Array.update (mayHaveCheck, i, true) else ()) in () end fun insertCoalesceLoopHeaders loopExits = let (* Set equivalence classes, where two nodes are equivalent if they * are in the same loop in the loop forest. * Also mark loop headers as mayHaveCheck. *) val classes = Array.array (n, ~1) fun indexClass i = Array.sub (classes, i) val c = Counter.new 0 fun setClass (f: unit Node.t Forest.t) = let val {loops, notInLoop} = Forest.dest f val class = Counter.next c val _ = Vector.foreach (notInLoop, fn n => if Node.equals (n, root) then () else Array.update (classes, nodeIndex n, class)) val _ = Vector.foreach (loops, fn {headers, child} => (Vector.foreach (headers, fn n => Array.update (mayHaveCheck, nodeIndex n, true)) ; setClass child)) in () end val _ = setClass (Graph.loopForestSteensgaard (g, {root = root, nodeValue = fn x => x})) val numClasses = Counter.value c datatype z = datatype Control.limitCheck val _ = if loopExits then let (* Determine which classes allocate. *) val classDoesAllocate = Array.array (numClasses, false) val _ = List.foreach (Graph.nodes g, fn n => if Node.equals (n, root) then () else let val i = nodeIndex n in if (Bytes.< (Bytes.zero, Vector.sub (objectBytesAllocated, i))) then Array.update (classDoesAllocate, indexClass i, true) else () end) (* Mark nodes that are post-exits of non-allocating * loops as mayHaveCheck. *) val _ = List.foreach (Graph.nodes g, fn n => if Node.equals (n, root) then () else let val i = nodeIndex n val c = indexClass i in if Array.sub (classDoesAllocate, c) then () else List.foreach (Node.successors n, fn e => let val i' = nodeIndex (Edge.to e) in if c <> indexClass i' then Array.update (mayHaveCheck, i', true) else () end) end) in () end else () in () end datatype z = datatype Control.limitCheck val _ = case !Control.limitCheck of ExtBasicBlocks => insertCoalesceExtBasicBlocks () | LoopHeaders {loopExits, ...} => insertCoalesceLoopHeaders loopExits | _ => Error.bug "LimitCheck.insertCoalesce" (* If we remove edges into nodes that are mayHaveCheck, we have an * acyclic graph. * So, we can compute a function, maxPath, inductively that for each node * tells the maximum amount allocated along any path that passes only * through nodes that are not mayHaveCheck. *) local val a = Array.array (n, NONE) in fun maxPath arg : Bytes.t = (* i is a node index *) traceMaxPath (fn (i: int) => case Array.sub (a, i) of SOME x => x | NONE => let val x = Vector.sub (objectBytesAllocated, i) val max = List.fold (Node.successors (indexNode i), Bytes.zero, fn (e, max) => let val i' = nodeIndex (Edge.to e) in if Array.sub (mayHaveCheck, i') then max else Bytes.max (max, maxPath i') end) val x = Bytes.+ (x, max) val _ = Array.update (a, i, SOME x) in x end ) arg end fun blockCheckAmount {blockIndex} = if Array.sub (mayHaveCheck, blockIndex) then maxPath blockIndex else Bytes.zero val f = insertFunction (f, handlesSignals, newFlag, blockCheckAmount, maxPath o labelIndex) val _ = Control.diagnostics (fn display => Vector.foreach (blocks, fn Block.T {label, ...} => display (let open Layout in seq [Label.layout label, str " ", Bytes.layout (maxPath (labelIndex label))] end))) val _ = Function.clear f in f end fun transform (Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics}) = let fun tyconTy tycon = Vector.sub (objectTypes, ObjptrTycon.index tycon) val _ = Control.diagnostic (fn () => Layout.str "Limit Check maxPaths") val (newFlag, finishFlags) = let val flagsTycon = ObjptrTycon.new () val flagsVar = Var.newString "flags" val flagsTy = Type.objptr flagsTycon val flags = Operand.Var {ty = flagsTy, var = flagsVar} val flagWS = WordSize.bool val flagScale = valOf (Scale.fromBytes (WordSize.bytes flagWS)) val flagTy = Type.word flagWS val c = Counter.new 0 in (fn () => Operand.SequenceOffset {base = flags, index = Operand.word (WordX.fromInt (Counter.next c, WordSize.seqIndex ())), offset = Bytes.zero, scale = flagScale, ty = flagTy}, fn () => if Counter.value c > 0 then (ObjptrTycon.setIndex (flagsTycon, Vector.length objectTypes) ; (Vector.concat [objectTypes, Vector.new1 (ObjectType.Sequence {components = Prod.new1Mutable flagTy, hasIdentity = true})], Vector.concat [statics, Vector.new1 {dst = (flagsVar, flagsTy), obj = Object.Sequence {init = Vector.tabulate (Counter.value c, fn _ => Vector.new1 {offset = Bytes.zero, src = Operand.one flagWS}), tycon = flagsTycon}}])) else (objectTypes, statics)) end datatype z = datatype Control.limitCheck fun insert f = case !Control.limitCheck of PerBlock => insertPerBlock (f, handlesSignals, newFlag, tyconTy) | _ => insertCoalesce (f, handlesSignals, newFlag, tyconTy) val main = insert main val functions = List.revMap (functions, insert) val (objectTypes, statics) = finishFlags () in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end mlton-20210117+dfsg/mlton/backend/machine.fun000066400000000000000000002126331416264345000206730ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Machine (S: MACHINE_STRUCTS): MACHINE = struct open S structure ChunkLabel = Id (val noname = "Chunk") structure Global = struct datatype t = T of {index: int, ty: Type.t} fun layout (T {index, ty, ...}) = let open Layout in seq [str (concat ["G", Type.name ty]), paren (Int.layout index), str ": ", Type.layout ty] end local fun make f (T r) = f r in val index = make #index val ty = make #ty end val memo = CType.memo (fn _ => Counter.new 0) fun numberOfType t = Counter.value (memo t) fun new ty = T {index = Counter.next (memo (Type.toCType ty)), ty = ty} fun equals (T {index = i, ty}, T {index = i', ty = ty'}) = i = i' andalso Type.equals (ty, ty') val isSubtype: t * t -> bool = fn (T {index = i, ty}, T {index = i', ty = ty'}) => i = i' andalso Type.isSubtype (ty, ty') andalso CType.equals (Type.toCType ty, Type.toCType ty') end structure StackOffset = struct datatype t = T of {offset: Bytes.t, ty: Type.t} local fun make f (T r) = f r in val ty = make #ty end fun layout (T {offset, ty}): Layout.t = let open Layout in seq [str (concat ["S", Type.name ty]), paren (Bytes.layout offset), str ": ", Type.layout ty] end val equals: t * t -> bool = fn (T {offset = b, ty}, T {offset = b', ty = ty'}) => Bytes.equals (b, b') andalso Type.equals (ty, ty') val isSubtype: t * t -> bool = fn (T {offset = b, ty = t}, T {offset = b', ty = t'}) => Bytes.equals (b, b') andalso Type.isSubtype (t, t') val interfere: t * t -> bool = fn (T {offset = b, ty = ty}, T {offset = b', ty = ty'}) => let val max = Bytes.+ (b, Type.bytes ty) val max' = Bytes.+ (b', Type.bytes ty') in Bytes.> (max, b') andalso Bytes.> (max', b) end fun shift (T {offset, ty}, size): t = T {offset = Bytes.- (offset, size), ty = ty} end structure StaticHeap = struct structure Kind = struct datatype t = Dynamic | Immutable | Mutable | Root val all = [Immutable, Mutable, Root, Dynamic] val isDynamic = fn Dynamic => true | _ => false fun equals (k1, k2) = case (k1, k2) of (Dynamic, Dynamic) => true | (Immutable, Immutable) => true | (Mutable, Mutable) => true | (Root, Root) => true | _ => false fun toString k = case k of Dynamic => "dynamic" | Immutable => "immutable" | Mutable => "mutable" | Root => "root" val layout = Layout.str o toString fun name k = case k of Dynamic => "D" | Immutable => "I" | Mutable => "M" | Root => "R" fun memoize f = let val dyn = f Dynamic val imm = f Immutable val mut = f Mutable val root = f Root in fn Dynamic => dyn | Immutable => imm | Mutable => mut | Root => root end val label = memoize (fn k => Label.fromString (concat ["staticHeap", name k])) end structure Ref = struct datatype t = T of {index: int, kind: Kind.t, offset: Bytes.t, ty: Type.t} local fun mk sel (T r) = sel r in val index = mk #index val kind = mk #kind val offset = mk #offset val ty = mk #ty end fun equals (T {index = index1, kind = kind1, offset = offset1, ...}, T {index = index2, kind = kind2, offset = offset2, ...}) = Int.equals (index1, index2) andalso Kind.equals (kind1, kind2) andalso Bytes.equals (offset1, offset2) fun layout (T {index, kind, offset, ty}) = let open Layout in seq [str (concat ["H", Kind.name kind]), tuple [Int.layout index, Bytes.layout offset], str ": ", Type.layout ty] end end structure Elem = struct datatype t = Cast of t * Type.t | Const of Const.t | Ref of Ref.t fun ty e = case e of Cast (_, ty) => ty | Const c => Type.ofConst c | Ref r => Ref.ty r fun layout e = let open Layout in case e of Cast (z, ty) => seq [str "Cast ", tuple [layout z, Type.layout ty]] | Const c => Const.layout c | Ref r => Ref.layout r end val word = Const o Const.word val deWord = fn Const (Const.Word w) => SOME w | _ => NONE end structure Object = Object (open S structure Use = Elem) end structure Temporary = struct datatype t = T of {index: int option ref, ty: Type.t} local fun make f (T r) = f r in val indexOpt = ! o (make #index) val ty = make #ty end fun layout (T {index, ty, ...}) = let open Layout in seq [str (concat ["T", Type.name ty]), paren (case !index of NONE => str "NONE" | SOME i => Int.layout i), str ": ", Type.layout ty] end val toString = Layout.toString o layout fun index (r as T {index, ...}) = case !index of NONE => Error.bug (concat ["Machine.Temporary: temporary ", toString r, " missing index"]) | SOME i => i fun setIndex (r as T {index, ...}, i) = case !index of NONE => index := SOME i | SOME _ => Error.bug (concat ["Machine.Temporary: temporary ", toString r, " index already set"]) fun new (ty, i) = T {index = ref i, ty = ty} fun equals (r, r') = (case (indexOpt r, indexOpt r') of (SOME i, SOME i') => i = i' | _ => false) andalso CType.equals (Type.toCType (ty r), Type.toCType (ty r')) val equals = Trace.trace2 ("Machine.Temporary.equals", layout, layout, Bool.layout) equals val isSubtype: t * t -> bool = fn (T {index = i, ty = t}, T {index = i', ty = t'}) => (case (!i, !i') of (SOME i, SOME i') => i = i' | _ => false) andalso Type.isSubtype (t, t') andalso CType.equals (Type.toCType t, Type.toCType t') end structure Operand = struct datatype t = Cast of t * Type.t | Const of Const.t | Frontier | GCState | Global of Global.t | Label of Label.t | Offset of {base: t, offset: Bytes.t, ty: Type.t} | SequenceOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | StackOffset of StackOffset.t | StackTop | StaticHeapRef of StaticHeap.Ref.t | Temporary of Temporary.t val word = Const o Const.Word val zero = word o WordX.zero val ty = fn Cast (_, ty) => ty | Const c => Type.ofConst c | Frontier => Type.cpointer () | GCState => Type.gcState () | Global g => Global.ty g | Label l => Type.label l | Offset {ty, ...} => ty | SequenceOffset {ty, ...} => ty | StackOffset s => StackOffset.ty s | StackTop => Type.cpointer () | StaticHeapRef h => StaticHeap.Ref.ty h | Temporary t => Temporary.ty t fun layout (z: t): Layout.t = let open Layout fun constrain (ty: Type.t): Layout.t = if !Control.showTypes then seq [str ": ", Type.layout ty] else empty in case z of Cast (z, ty) => seq [str "Cast ", tuple [layout z, Type.layout ty]] | Const c => Const.layout c | Frontier => str "" | GCState => str "" | Global g => Global.layout g | Label l => Label.layout l | Offset {base, offset, ty} => seq [str (concat ["O", Type.name ty, " "]), tuple [layout base, Bytes.layout offset], constrain ty] | SequenceOffset {base, index, offset, scale, ty} => seq [str (concat ["X", Type.name ty, " "]), tuple [layout base, layout index, Scale.layout scale, Bytes.layout offset], constrain ty] | StackOffset so => StackOffset.layout so | StackTop => str "" | StaticHeapRef h => StaticHeap.Ref.layout h | Temporary t => Temporary.layout t end val toString = Layout.toString o layout val rec equals = fn (Cast (z, t), Cast (z', t')) => Type.equals (t, t') andalso equals (z, z') | (Const c, Const c') => Const.equals (c, c') | (GCState, GCState) => true | (Global g, Global g') => Global.equals (g, g') | (Label l, Label l') => Label.equals (l, l') | (Offset {base = b, offset = i, ...}, Offset {base = b', offset = i', ...}) => equals (b, b') andalso Bytes.equals (i, i') | (SequenceOffset {base = b, index = i, ...}, SequenceOffset {base = b', index = i', ...}) => equals (b, b') andalso equals (i, i') | (StackOffset so, StackOffset so') => StackOffset.equals (so, so') | (StaticHeapRef h1, StaticHeapRef h2) => StaticHeap.Ref.equals (h1, h2) | (Temporary t, Temporary t') => Temporary.equals (t, t') | _ => false fun gcField field = Offset {base = GCState, offset = Runtime.GCField.offset field, ty = Type.ofGCField field} val stackOffset = StackOffset o StackOffset.T fun interfere (write: t, read: t): bool = let fun inter read = interfere (write, read) in case (read, write) of (Cast (z, _), _) => interfere (write, z) | (_, Cast (z, _)) => interfere (z, read) | (Global g, Global g') => Global.equals (g, g') | (Offset {base, ...}, _) => inter base | (SequenceOffset {base, index, ...}, _) => inter base orelse inter index | (StackOffset so, StackOffset so') => StackOffset.interfere (so, so') | (Temporary t, Temporary t') => Temporary.equals (t, t') | (StaticHeapRef h1, StaticHeapRef h2) => StaticHeap.Ref.equals (h1, h2) | _ => false end val rec isDestination = fn Cast (z, _) => isDestination z | Global _ => true | Offset _ => true | SequenceOffset _ => true | StackOffset _ => true | Temporary _ => true | _ => false end structure Switch = Switch (open S structure Use = Operand) structure Statement = struct datatype t = Move of {dst: Operand.t, src: Operand.t} | PrimApp of {args: Operand.t vector, dst: Operand.t option, prim: Type.t Prim.t} | ProfileLabel of ProfileLabel.t val layout = let open Layout in fn Move {dst, src} => mayAlign [seq [Operand.layout dst, str " ="], indent (Operand.layout src, 2)] | PrimApp {args, dst, prim, ...} => let val rest = seq [Prim.layout prim, str " ", Vector.layout Operand.layout args] in case dst of NONE => rest | SOME z => mayAlign [seq [Operand.layout z, str " ="], indent (rest, 2)] end | ProfileLabel l => seq [str "ProfileLabel ", ProfileLabel.layout l] end fun move (arg as {dst, src}) = if Operand.equals (dst, src) then NONE else SOME (Move arg) val move = Trace.trace ("Machine.Statement.move", fn {dst, src} => Layout.record [("dst", Operand.layout dst), ("src", Operand.layout src)], Option.layout layout) move fun object {dst, header, size} = let datatype z = datatype Operand.t fun bytes (b: Bytes.t): Operand.t = Operand.word (WordX.fromBytes (b, WordSize.csize ())) val metaDataSize = Runtime.normalMetaDataSize () val headerOffset = Runtime.headerOffset () val header = Operand.word header val temp = Temporary (Temporary.new (Type.cpointer (), NONE)) in Vector.new4 ((* tmp = Frontier + GC_NORMAL_METADATA_SIZE; *) PrimApp {args = Vector.new2 (Frontier, bytes metaDataSize), dst = SOME temp, prim = Prim.CPointer_add}, (* CHECK; if objptr <> cpointer, need non-trivial coercion here. *) (* dst = pointerToObjptr(tmp); *) Move {dst = dst, src = Cast (temp, Operand.ty dst)}, (* OW(dst, -GC_HEADER_SIZE) = header; *) Move {dst = Offset {base = dst, offset = headerOffset, ty = Type.objptrHeader ()}, src = header}, (* Frontier += size; *) PrimApp {args = Vector.new2 (Frontier, bytes size), dst = SOME Frontier, prim = Prim.CPointer_add}) end fun sequence {dst, header, length, size} = let datatype z = datatype Operand.t fun bytes (b: Bytes.t): Operand.t = Operand.word (WordX.fromBytes (b, WordSize.csize ())) val metaDataSize = Runtime.sequenceMetaDataSize () val headerOffset = Runtime.headerOffset () val lengthOffset = Runtime.sequenceLengthOffset () val counterOffset = Runtime.sequenceCounterOffset () val header = Operand.word header val length = Operand.word (WordX.fromInt (length, WordSize.seqIndex ())) val counter = Operand.zero (WordSize.seqIndex ()) val temp = Temporary (Temporary.new (Type.cpointer (), NONE)) in Vector.new6 ((* tmp = Frontier + GC_SEQUENCE_METADATA_SIZE; *) PrimApp {args = Vector.new2 (Frontier, bytes metaDataSize), dst = SOME temp, prim = Prim.CPointer_add}, (* CHECK; if objptr <> cpointer, need non-trivial coercion here. *) (* dst = pointerToObjptr(tmp); *) Move {dst = dst, src = Cast (temp, Operand.ty dst)}, (* OW(dst, -(GC_HEADER_SIZE + GC_SEQUENCE_LENGTH_SIZE + GC_SEQUENCE_COUNTER_SIZE)) = 0x0; *) Move {dst = Offset {base = dst, offset = counterOffset, ty = Type.seqIndex ()}, src = counter}, (* OW(dst, -(GC_HEADER_SIZE + GC_SEQUENCE_LENGTH_SIZE)) = length; *) Move {dst = Offset {base = dst, offset = lengthOffset, ty = Type.seqIndex ()}, src = length}, (* OW(dst, -GC_HEADER_SIZE) = header; *) Move {dst = Offset {base = dst, offset = headerOffset, ty = Type.objptrHeader ()}, src = header}, (* Frontier += size; *) PrimApp {args = Vector.new2 (Frontier, bytes size), dst = SOME Frontier, prim = Prim.CPointer_add}) end fun foldOperands (s, ac, f) = case s of Move {dst, src} => f (dst, f (src, ac)) | PrimApp {args, dst, ...} => Vector.fold (args, Option.fold (dst, ac, f), f) | _ => ac fun foldDefs (s, a, f) = case s of Move {dst, ...} => f (dst, a) | PrimApp {dst, ...} => (case dst of NONE => a | SOME z => f (z, a)) | _ => a end structure Live = struct datatype t = Global of Global.t | StackOffset of StackOffset.t | Temporary of Temporary.t val layout: t -> Layout.t = fn Global g => Global.layout g | StackOffset s => StackOffset.layout s | Temporary t => Temporary.layout t val equals: t * t -> bool = fn (Global g, Global g') => Global.equals (g, g') | (StackOffset s, StackOffset s') => StackOffset.equals (s, s') | (Temporary t, Temporary t') => Temporary.equals (t, t') | _ => false val ty = fn Global g => Global.ty g | StackOffset s => StackOffset.ty s | Temporary t => Temporary.ty t val isSubtype: t * t -> bool = fn (Global g, Global g') => Global.isSubtype (g, g') | (StackOffset s, StackOffset s') => StackOffset.isSubtype (s, s') | (Temporary t, Temporary t') => Temporary.isSubtype (t, t') | _ => false val interfere: t * t -> bool = fn (l, l') => equals (l, l') orelse (case (l, l') of (StackOffset s, StackOffset s') => StackOffset.interfere (s, s') | _ => false) val fromOperand: Operand.t -> t option = fn Operand.Global g => SOME (Global g) | Operand.StackOffset s => SOME (StackOffset s) | Operand.Temporary t => SOME (Temporary t) | _ => NONE val toOperand: t -> Operand.t = fn Global g => Operand.Global g | StackOffset s => Operand.StackOffset s | Temporary t => Operand.Temporary t end structure Transfer = struct datatype t = CCall of {args: Operand.t vector, func: Type.t CFunction.t, return: {return: Label.t, size: Bytes.t option} option} | Call of {label: Label.t, live: Live.t vector, return: {return: Label.t, handler: Label.t option, size: Bytes.t} option} | Goto of Label.t | Raise of {raisesTo: Label.t list} | Return of {returnsTo: Label.t list} | Switch of Switch.t fun layout t = let open Layout in case t of CCall {args, func, return} => seq [str "CCall ", record [("args", Vector.layout Operand.layout args), ("func", CFunction.layout (func, Type.layout)), ("return", Option.layout (fn {return, size} => record [("return", Label.layout return), ("size", Option.layout Bytes.layout size)]) return)]] | Call {label, live, return} => seq [str "Call ", record [("label", Label.layout label), ("live", Vector.layout Live.layout live), ("return", Option.layout (fn {return, handler, size} => record [("return", Label.layout return), ("handler", Option.layout Label.layout handler), ("size", Bytes.layout size)]) return)]] | Goto l => seq [str "Goto ", Label.layout l] | Raise {raisesTo} => seq [str "Raise ", record [("raisesTo", List.layout Label.layout raisesTo)]] | Return {returnsTo} => seq [str "Return ", record [("returnsTo", List.layout Label.layout returnsTo)]] | Switch s => Switch.layout s end fun foldOperands (t, ac, f) = case t of CCall {args, ...} => Vector.fold (args, ac, f) | Switch s => Switch.foldLabelUse (s, ac, {label = fn (_, a) => a, use = f}) | _ => ac end structure FrameOffsets = struct datatype t = T of {index: int, offsets: Bytes.t vector} local fun make f (T r) = f r in val index = make #index val offsets = make #offsets end fun new {index, offsets} = T {index = index, offsets = offsets} fun equals (fo1, fo2) = Int.equals (index fo1, index fo2) andalso Vector.equals (offsets fo1, offsets fo2, Bytes.equals) fun layout (T {index, offsets}) = let open Layout in record [("index", Int.layout index), ("offsets", Vector.layout Bytes.layout offsets)] end fun hash (T {index, offsets}) = Hash.combine (Word.fromInt index, Hash.vectorMap (offsets, Bytes.hash)) end structure FrameInfo = struct structure Kind = struct datatype t = C_FRAME | ML_FRAME fun equals (k1, k2) = case (k1, k2) of (C_FRAME, C_FRAME) => true | (ML_FRAME, ML_FRAME) => true | _ => false local val newHash = Random.word val c = newHash () val ml = newHash () in fun hash k = case k of C_FRAME => c | ML_FRAME => ml end fun toString k = case k of C_FRAME => "C_FRAME" | ML_FRAME => "ML_FRAME" val layout = Layout.str o toString end datatype t = T of {frameOffsets: FrameOffsets.t, index: int ref, kind: Kind.t, size: Bytes.t, sourceSeqIndex: int option} local fun make f (T r) = f r in val frameOffsets = make #frameOffsets val indexRef = make #index val kind = make #kind val size = make #size val sourceSeqIndex = make #sourceSeqIndex end val index = ! o indexRef fun setIndex (fi, i) = indexRef fi := i val offsets = FrameOffsets.offsets o frameOffsets fun new {frameOffsets, index, kind, size, sourceSeqIndex} = T {frameOffsets = frameOffsets, index = ref index, kind = kind, size = size, sourceSeqIndex = sourceSeqIndex} fun equals (fi1, fi2) = FrameOffsets.equals (frameOffsets fi1, frameOffsets fi2) andalso Ref.equals (indexRef fi1, indexRef fi2) andalso Kind.equals (kind fi1, kind fi2) andalso Bytes.equals (size fi1, size fi2) andalso Option.equals (sourceSeqIndex fi1, sourceSeqIndex fi2, Int.equals) fun layout (T {frameOffsets, index, kind, size, sourceSeqIndex}) = let open Layout in record [("frameOffsets", FrameOffsets.layout frameOffsets), ("index", Ref.layout Int.layout index), ("kind", Kind.layout kind), ("size", Bytes.layout size), ("sourceSeqIndex", Option.layout Int.layout sourceSeqIndex)] end end structure Kind = struct datatype t = Cont of {args: Live.t vector, frameInfo: FrameInfo.t} | CReturn of {dst: Live.t option, frameInfo: FrameInfo.t option, func: Type.t CFunction.t} | Func of {frameInfo: FrameInfo.t} | Handler of {args: Live.t vector, frameInfo: FrameInfo.t} | Jump fun layout k = let open Layout in case k of Cont {args, frameInfo} => seq [str "Cont ", record [("args", Vector.layout Live.layout args), ("frameInfo", FrameInfo.layout frameInfo)]] | CReturn {dst, frameInfo, func} => seq [str "CReturn ", record [("dst", Option.layout Live.layout dst), ("frameInfo", Option.layout FrameInfo.layout frameInfo), ("func", CFunction.layout (func, Type.layout))]] | Func {frameInfo} => seq [str "Func ", record [("frameInfo", FrameInfo.layout frameInfo)]] | Handler {args, frameInfo} => seq [str "Handler ", record [("args", Vector.layout Live.layout args), ("frameInfo", FrameInfo.layout frameInfo)]] | Jump => str "Jump" end fun isEntry (k: t): bool = case k of Cont _ => true | CReturn {func, ...} => CFunction.maySwitchThreadsTo func | Func _ => true | Handler _ => true | _ => false val frameInfoOpt = fn Cont {frameInfo, ...} => SOME frameInfo | CReturn {frameInfo, ...} => frameInfo | Func {frameInfo, ...} => SOME frameInfo | Handler {frameInfo, ...} => SOME frameInfo | Jump => NONE end structure Block = struct datatype t = T of {kind: Kind.t, label: Label.t, live: Live.t vector, raises: Live.t vector option, returns: Live.t vector option, statements: Statement.t vector, transfer: Transfer.t} fun clear (T {label, ...}) = Label.clear label local fun make g (T r) = g r in val kind = make #kind val label = make #label end fun layoutHeader (T {kind, label, live, raises, returns, ...}) = let open Layout in seq [Label.layout label, str ": ", record [("kind", Kind.layout kind), ("live", Vector.layout Live.layout live), ("raises", Option.layout (Vector.layout Live.layout) raises), ("returns", Option.layout (Vector.layout Live.layout) returns)]] end fun layout (b as T {statements, transfer, ...}) = let open Layout in align [layoutHeader b, indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 2)] end fun layouts (block, output' : Layout.t -> unit) = output' (layout block) fun foldDefs (T {kind, statements, ...}, a, f) = let val a = case kind of Kind.CReturn {dst, ...} => (case dst of NONE => a | SOME z => f (Live.toOperand z, a)) | _ => a val a = Vector.fold (statements, a, fn (s, a) => Statement.foldDefs (s, a, f)) in a end end structure Chunk = struct datatype t = T of {blocks: Block.t vector, chunkLabel: ChunkLabel.t, tempsMax: CType.t -> int} local fun make sel (T r) = sel r in val chunkLabel = make #chunkLabel end fun layouts (T {blocks, chunkLabel, ...}, output' : Layout.t -> unit) = let open Layout in ((output' o seq) [str "Chunk ", ChunkLabel.layout chunkLabel]) ; Vector.foreach (blocks, fn block => Block.layouts (block, output')) end fun clear (T {blocks, ...}) = Vector.foreach (blocks, Block.clear) end structure Program = struct datatype t = T of {chunks: Chunk.t list, frameInfos: FrameInfo.t vector, frameOffsets: FrameOffsets.t vector, globals: {objptrs: (StaticHeap.Ref.t * Global.t) list, reals: (RealX.t * Global.t) list}, handlesSignals: bool, main: {chunkLabel: ChunkLabel.t, label: Label.t}, maxFrameSize: Bytes.t, objectTypes: ObjectType.t vector, sourceMaps: SourceMaps.t option, staticHeaps: StaticHeap.Kind.t -> StaticHeap.Object.t vector} fun clear (T {chunks, sourceMaps, ...}) = (List.foreach (chunks, Chunk.clear) ; Option.app (sourceMaps, SourceMaps.clear)) fun layouts (T {chunks, frameInfos, frameOffsets, handlesSignals, main = {label, ...}, maxFrameSize, objectTypes, sourceMaps, staticHeaps, ...}, output': Layout.t -> unit) = let open Layout val output = output' in output (record [("handlesSignals", Bool.layout handlesSignals), ("main", Label.layout label), ("maxFrameSize", Bytes.layout maxFrameSize), ("frameOffsets", Vector.layout FrameOffsets.layout frameOffsets), ("frameInfos", Vector.layout FrameInfo.layout frameInfos)]) ; Option.app (sourceMaps, fn pi => (output (str "\nSourceMaps:") ; SourceMaps.layouts (pi, output))) ; output (str "\nObjectTypes:") ; Vector.foreachi (objectTypes, fn (i, ty) => output (seq [str "opt_", Int.layout i, str " = ", ObjectType.layout ty])) ; output (str "\n") ; List.foreach (StaticHeap.Kind.all, fn k => (output (seq [Label.layout (StaticHeap.Kind.label k), str ":"]) ; output (Vector.layout StaticHeap.Object.layout (staticHeaps k)))) ; output (str "\n") ; List.foreach (chunks, fn chunk => Chunk.layouts (chunk, output)) end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "machine"} fun layoutStats (program as T {chunks, objectTypes, ...}) = let val numChunks = ref 0 val numBlocks = ref 0 val numStatements = ref 0 val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => (Int.inc numChunks ; Vector.foreach (blocks, fn Block.T {statements, ...} => (Int.inc numBlocks ; numStatements := !numStatements + Vector.length statements)))) val numObjectTypes = Vector.length objectTypes open Layout in align [seq [Control.sizeMessage ("machine program", program)], seq [str "num chunks in program = ", Int.layout (!numChunks)], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num object types in program = ", Int.layout (numObjectTypes)]] end fun shuffle (T {chunks, frameInfos, frameOffsets, globals, handlesSignals, main, maxFrameSize, objectTypes, sourceMaps, staticHeaps}) = let fun shuffle v = let val a = Array.fromVector v val () = Array.shuffle a in Array.toVector a end val chunks = Vector.fromList chunks val chunks = shuffle chunks val chunks = Vector.map (chunks, fn Chunk.T {blocks, chunkLabel, tempsMax} => Chunk.T {blocks = shuffle blocks, chunkLabel = chunkLabel, tempsMax = tempsMax}) val chunks = Vector.toList chunks in T {chunks = chunks, frameInfos = frameInfos, frameOffsets = frameOffsets, globals = globals, handlesSignals = handlesSignals, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, sourceMaps = sourceMaps, staticHeaps = staticHeaps} end structure Alloc = struct datatype t = T of Live.t list fun layout (T ds) = List.layout Live.layout ds fun forall (T ds, f) = List.forall (ds, f o Live.toOperand) fun defineLive (T ls, l) = T (l :: ls) fun define (T ds, z) = case Live.fromOperand z of NONE => T ds | SOME d => T (d :: ds) val new: Live.t list -> t = T fun doesDefine (T ls, l': Live.t): bool = let val oper' = Live.toOperand l' in case List.peek (ls, fn l => Operand.interfere (Live.toOperand l, oper')) of NONE => false | SOME l => Live.isSubtype (l, l') end val doesDefine = Trace.trace2 ("Machine.Program.Alloc.doesDefine", layout, Live.layout, Bool.layout) doesDefine end fun typeCheck (program as T {chunks, frameInfos, frameOffsets, globals = {objptrs, reals, ...}, maxFrameSize, objectTypes, sourceMaps, staticHeaps, ...}) = let val (checkProfileLabel, finishCheckProfileLabel) = Err.check' ("sourceMaps", fn () => (case (!Control.profile, sourceMaps) of (Control.ProfileNone, NONE) => SOME (fn _ => false, fn () => ()) | (_, NONE) => NONE | (Control.ProfileNone, SOME _) => NONE | (_, SOME sourceMaps) => let val (checkProfileLabel, finishCheckProfileLabel) = SourceMaps.checkProfileLabel sourceMaps in if SourceMaps.check sourceMaps then SOME (checkProfileLabel, fn () => Err.check ("sourceMaps (finishCheckProfileLabel)", finishCheckProfileLabel, fn () => SourceMaps.layout sourceMaps)) else NONE end), fn () => Option.layout SourceMaps.layout sourceMaps) val _ = if !Control.profile = Control.ProfileTimeLabel then List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {kind, label, statements, ...} => if (case kind of Kind.Func _ => true | _ => false) orelse (0 < Vector.length statements andalso (case Vector.first statements of Statement.ProfileLabel _ => true | _ => false)) then () else print (concat ["missing profile info: ", Label.toString label, "\n"]))) else () val _ = Vector.foreachi (frameOffsets, fn (i, fo) => let val index = FrameOffsets.index fo val offsets = FrameOffsets.offsets fo in Err.check ("frameOffsets", fn () => (Int.equals (i, index) andalso Vector.forall (offsets, fn offset => Bytes.< (offset, maxFrameSize))), fn () => FrameOffsets.layout fo) end) fun checkFrameOffsets fo = let val index = FrameOffsets.index fo in FrameOffsets.equals (Vector.sub (frameOffsets, index), fo) handle Subscript => false end val _ = Vector.foreachi (frameInfos, fn (i, fi) => let val index = FrameInfo.index fi val frameOffsets = FrameInfo.frameOffsets fi val size = FrameInfo.size fi in Err.check ("frameInfos", fn () => (Int.equals (i, index) andalso checkFrameOffsets frameOffsets andalso Bytes.<= (size, maxFrameSize) andalso Bytes.<= (size, Runtime.maxFrameSize) andalso (Bytes.isAligned (size, {alignment = (case !Control.align of Control.Align4 => Bytes.inWord32 | Control.Align8 => Bytes.inWord64)}))), fn () => FrameInfo.layout fi) end) fun checkFrameInfo fi = let val index = FrameInfo.index fi in FrameInfo.equals (Vector.sub (frameInfos, index), fi) handle Subscript => false end val _ = Vector.foreach (objectTypes, fn ty => Err.check ("objectType", fn () => ObjectType.isOk ty, fn () => ObjectType.layout ty)) fun tyconTy (opt: ObjptrTycon.t): ObjectType.t = Vector.sub (objectTypes, ObjptrTycon.index opt) open Layout val staticHeaps = let open StaticHeap in Kind.memoize (fn k => (#1 o Vector.mapAndFold) (staticHeaps k, Bytes.zero, fn (obj, next) => ((Bytes.+ (next, Object.metaDataSize obj), obj), Bytes.+ (next, Object.size (obj, {tyconTy = tyconTy}))))) end fun checkGlobal (name, global, isOk, layoutVal) = let val ty = Global.ty global open Layout in Err.check (name, fn () => isOk ty, fn () => seq [layoutVal (), str ": ", Type.layout ty]) end val _ = List.foreach (objptrs, fn (r, g) => checkGlobal ("global objptr", g, fn t => Type.equals (t, StaticHeap.Ref.ty r), fn () => StaticHeap.Ref.layout r)) val _ = List.foreach (reals, fn (r, g) => checkGlobal ("global real", g, fn t => Type.equals (t, Type.real (RealX.size r)), fn () => RealX.layout (r, {suffix=true}))) (* Check for no duplicate labels. *) local val {get, ...} = Property.get (Label.plist, Property.initFun (fn _ => ref false)) in val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {label, ...} => let val r = get label in if !r then Error.bug "Machine.Program.typeCheck: duplicate label" else r := true end)) end val {get = labelBlock: Label.t -> Block.t, set = setLabelBlock, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelBlock (label, b))) fun checkStaticHeapRef (StaticHeap.Ref.T {index, kind, offset, ty}) = let val (dataOffset, obj) = Vector.sub (staticHeaps kind, index) in Bytes.equals (dataOffset, offset) andalso Type.equals (StaticHeap.Object.ty obj, ty) end fun checkOperand (x: Operand.t, alloc: Alloc.t): unit = let datatype z = datatype Operand.t fun ok () = case x of Cast (z, t) => (checkOperand (z, alloc) ; (Type.castIsOk {from = Operand.ty z, to = t, tyconTy = tyconTy})) | Const _ => true | Frontier => true | GCState => true | Global _ => (* We don't check that globals are defined because * they aren't captured by liveness info. It would * be nice to fix this. *) true | Label l => (let val _ = labelBlock l in true end handle _ => false) | Offset {base, offset, ty} => (checkOperand (base, alloc) ; (Type.offsetIsOk {base = Operand.ty base, (* MachineIR doesn't distinguish * initialization of object field * from update of object field; * only the latter requires * the field to be mutable. *) mustBeMutable = false, offset = offset, tyconTy = tyconTy, result = ty})) | StackOffset (so as StackOffset.T {offset, ty, ...}) => Bytes.<= (Bytes.+ (offset, Type.bytes ty), maxFrameSize) andalso Alloc.doesDefine (alloc, Live.StackOffset so) andalso (case Type.deLabel ty of NONE => true | SOME l => let val Block.T {kind, ...} = labelBlock l fun doit fi = let val size = FrameInfo.size fi in Bytes.equals (size, Bytes.+ (offset, Runtime.labelSize ())) end in case kind of Kind.Cont {frameInfo, ...} => doit frameInfo | Kind.CReturn {frameInfo, ...} => (case frameInfo of NONE => true | SOME fi => doit fi) | Kind.Func {frameInfo, ...} => doit frameInfo | Kind.Handler {frameInfo, ...} => doit frameInfo | Kind.Jump => true end) | SequenceOffset {base, index, offset, scale, ty} => (checkOperand (base, alloc) ; checkOperand (index, alloc) ; (Type.sequenceOffsetIsOk {base = Operand.ty base, index = Operand.ty index, (* MachineIR doesn't distinguish * initialization of object field * from update of object field; * only the latter requires * the field to be mutable. *) mustBeMutable = false, offset = offset, tyconTy = tyconTy, result = ty, scale = scale})) | StaticHeapRef r => checkStaticHeapRef r | StackTop => true | Temporary t => Alloc.doesDefine (alloc, Live.Temporary t) in Err.check ("operand", ok, fn () => Operand.layout x) end fun checkOperands (v, a) = Vector.foreach (v, fn z => checkOperand (z, a)) fun check' (x, name, isOk, layout) = Err.check (name, fn () => isOk x, fn () => layout x) val labelKind = Block.kind o labelBlock fun checkKind (k: Kind.t, alloc: Alloc.t): Alloc.t option = let datatype z = datatype Kind.t exception No fun frame (frameInfo, useSlots: bool, kind: FrameInfo.Kind.t): bool = checkFrameInfo frameInfo andalso FrameInfo.Kind.equals (kind, FrameInfo.kind frameInfo) andalso (not useSlots orelse let val Alloc.T zs = alloc val liveOffsets = List.fold (zs, [], fn (z, liveOffsets) => case z of Live.StackOffset (StackOffset.T {offset, ty}) => if Type.isObjptr ty then offset :: liveOffsets else liveOffsets | _ => raise No) val liveOffsets = Array.fromList liveOffsets val () = QuickSort.sortArray (liveOffsets, Bytes.<=) val liveOffsets = Vector.fromArray liveOffsets in Vector.equals (liveOffsets, FrameInfo.offsets frameInfo, Bytes.equals) end) handle No => false fun slotsAreInFrame (fi: FrameInfo.t): bool = let val size = FrameInfo.size fi in Alloc.forall (alloc, fn z => case z of Operand.StackOffset (StackOffset.T {offset, ty}) => Bytes.<= (Bytes.+ (offset, Type.bytes ty), size) | _ => false) end in case k of Cont {args, frameInfo} => if frame (frameInfo, true, FrameInfo.Kind.ML_FRAME) andalso slotsAreInFrame frameInfo then SOME (Vector.fold (args, alloc, fn (z, alloc) => Alloc.defineLive (alloc, z))) else NONE | CReturn {dst, frameInfo, func, ...} => let val ok = (case dst of NONE => true | SOME z => Type.isSubtype (CFunction.return func, Live.ty z)) andalso (if CFunction.mayGC func then (case frameInfo of NONE => false | SOME fi => (frame (fi, true, FrameInfo.Kind.C_FRAME) andalso slotsAreInFrame fi)) else if !Control.profile = Control.ProfileNone then true else (case frameInfo of NONE => false | SOME fi => frame (fi, false, FrameInfo.Kind.C_FRAME))) in if ok then SOME (case dst of NONE => alloc | SOME z => Alloc.defineLive (alloc, z)) else NONE end | Func {frameInfo, ...} => if frame (frameInfo, false, FrameInfo.Kind.ML_FRAME) then SOME alloc else NONE | Handler {args, frameInfo} => if frame (frameInfo, false, FrameInfo.Kind.ML_FRAME) then SOME (Vector.fold (args, alloc, fn (z, alloc) => Alloc.defineLive (alloc, z))) else NONE | Jump => SOME alloc end fun checkStatement (s: Statement.t, alloc: Alloc.t) : Alloc.t option = let datatype z = datatype Statement.t in case s of Move {dst, src} => let val _ = checkOperand (src, alloc) val alloc = Alloc.define (alloc, dst) val _ = checkOperand (dst, alloc) in if Type.isSubtype (Operand.ty src, Operand.ty dst) andalso Operand.isDestination dst then SOME alloc else NONE end | PrimApp {args, dst, prim, ...} => let val _ = checkOperands (args, alloc) val alloc = case dst of NONE => SOME alloc | SOME z => let val alloc = Alloc.define (alloc, z) val _ = checkOperand (z, alloc) in SOME alloc end val ok = Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = Option.map (dst, Operand.ty)} in if ok then alloc else NONE end | ProfileLabel pl => if checkProfileLabel pl then SOME alloc else NONE end fun liveIsOk (live: Live.t vector, a: Alloc.t): bool = Vector.forall (live, fn z => Alloc.doesDefine (a, z)) val liveIsOk = Trace.trace ("Machine.Program.typeCheck.liveIsOk", fn (live, a) => Layout.tuple [Vector.layout Live.layout live, Alloc.layout a], Bool.layout) liveIsOk fun liveSubset (live: Live.t vector, live': Live.t vector): bool = Vector.forall (live, fn z => Vector.exists (live', fn z' => Live.equals (z, z'))) fun goto (Block.T {live, raises = raises', returns = returns', ...}, raises: Live.t vector option, returns: Live.t vector option, alloc: Alloc.t): bool = liveIsOk (live, alloc) andalso (case (raises, raises') of (_, NONE) => true | (SOME gs, SOME gs') => Vector.equals (gs', gs, Live.isSubtype) | _ => false) andalso (case (returns, returns') of (_, NONE) => true | (SOME os, SOME os') => Vector.equals (os', os, Live.isSubtype) | _ => false) val goto = Trace.trace ("Machine.Program.typeCheck.goto", fn (b, raises, returns, a) => Layout.tuple [Block.layoutHeader b, Option.layout (Vector.layout Live.layout) raises, Option.layout (Vector.layout Live.layout) returns, Alloc.layout a], Bool.layout) goto fun checkCont (cont: Label.t, size: Bytes.t, alloc: Alloc.t) = let val Block.T {kind, live, ...} = labelBlock cont in if liveIsOk (live, alloc) then (case kind of Kind.Cont {args, frameInfo, ...} => (if Bytes.equals (FrameInfo.size frameInfo, size) then SOME (live, SOME (Vector.map (args, fn z => case z of Live.StackOffset s => Live.StackOffset (StackOffset.shift (s, size)) | _ => z))) else NONE) | _ => NONE) else NONE end fun callIsOk {alloc: Alloc.t, dst: Label.t, live: Live.t vector, raises: Live.t vector option, return, returns: Live.t vector option} = let val {raises, returns, size} = case return of NONE => {raises = raises, returns = returns, size = Bytes.zero} | SOME {handler, return, size} => let val (contLive, returns) = Err.check' ("cont", fn () => checkCont (return, size, alloc), fn () => Label.layout return) fun checkHandler () = case handler of NONE => SOME raises | SOME h => let val Block.T {kind, live = handlerLive, ...} = labelBlock h in if liveSubset (handlerLive, contLive) then (case kind of Kind.Handler {frameInfo, ...} => if Bytes.< (FrameInfo.size frameInfo, size) then SOME (SOME (Vector.new0 ())) else NONE | _ => NONE) else NONE end val raises = Err.check' ("handler", checkHandler, fn () => Option.layout Label.layout handler) in {raises = raises, returns = returns, size = size} end val b = labelBlock dst val alloc = Alloc.T (Vector.fold (live, [], fn (z, ac) => case z of Live.StackOffset (StackOffset.T {offset, ty}) => if Bytes.< (offset, size) then ac else (Live.StackOffset (StackOffset.T {offset = Bytes.- (offset, size), ty = ty})) :: ac | _ => ac)) in goto (b, raises, returns, alloc) end fun transferOk (t: Transfer.t, raises: Live.t vector option, returns: Live.t vector option, alloc: Alloc.t): bool = let fun jump (l: Label.t) = let val b as Block.T {kind, ...} = labelBlock l in (case kind of Kind.Jump => true | _ => false) andalso goto (b, raises, returns, alloc) end datatype z = datatype Transfer.t in case t of CCall {args, func, return} => let val _ = checkOperands (args, alloc) in CFunction.isOk (func, {isUnit = Type.isUnit}) andalso Vector.equals (args, CFunction.args func, fn (z, t) => Type.isSubtype (Operand.ty z, t)) andalso case return of NONE => true | SOME {return, size} => let val Block.T {live, ...} = labelBlock return in liveIsOk (live, alloc) andalso case labelKind return of Kind.CReturn {frameInfo = fi, func = f, ...} => CFunction.equals (func, f) andalso (Option.equals (size, Option.map (fi, FrameInfo.size), Bytes.equals)) | _ => false end end | Call {label, live, return} => liveIsOk (live, alloc) andalso callIsOk {alloc = alloc, dst = label, live = live, raises = raises, return = return, returns = returns} | Goto l => jump l | Raise _ => (case raises of NONE => false | SOME live => liveIsOk (live, alloc)) | Return _ => (case returns of NONE => false | SOME live => liveIsOk (live, alloc)) | Switch s => Switch.isOk (s, {checkUse = fn z => checkOperand (z, alloc), labelIsOk = jump}) end val transferOk = Trace.trace ("Machine.Program.typeCheck.transferOk", fn (t, raises, returns, a) => Layout.tuple [Transfer.layout t, Option.layout (Vector.layout Live.layout) raises, Option.layout (Vector.layout Live.layout) returns, Alloc.layout a], Bool.layout) transferOk fun blockOk (Block.T {kind, live, raises, returns, statements, transfer, ...}): bool = let val live = Vector.toList live val _ = Err.check ("live", fn () => let fun loop zs = case zs of [] => true | z :: zs => List.forall (zs, fn z' => not (Live.interfere (z, z'))) in loop live end, fn () => List.layout Live.layout live) val alloc = Alloc.new live val alloc = Err.check' ("kind", fn () => checkKind (kind, alloc), fn () => Kind.layout kind) val alloc = Vector.fold (statements, alloc, fn (s, alloc) => Err.check' ("statement", fn () => checkStatement (s, alloc), fn () => Statement.layout s)) val _ = Err.check ("transfer", fn () => transferOk (transfer, raises, returns, alloc), fn () => Transfer.layout transfer) in true end fun checkStaticHeapElem (e: StaticHeap.Elem.t): unit = let datatype z = datatype StaticHeap.Elem.t fun ok () = case e of Cast (z, t) => (checkStaticHeapElem z ; Type.castIsOk {from = StaticHeap.Elem.ty e, to = t, tyconTy = tyconTy}) | Const _ => true | Ref r => checkStaticHeapRef r in Err.check ("elem", ok, fn () => StaticHeap.Elem.layout e) end val _ = List.foreach (StaticHeap.Kind.all, fn kind => Err.check ("staticHeap", fn () => (Vector.foreach (staticHeaps kind, fn (_, obj) => Err.check ("object", fn () => StaticHeap.Object.isOk (obj, {checkUse = checkStaticHeapElem, tyconTy = tyconTy}), fn () => StaticHeap.Object.layout obj)) ; true), fn () => Label.layout (StaticHeap.Kind.label kind))) val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => let in Vector.foreach (blocks, fn b => check' (b, "block", blockOk, Block.layout)) end) val _ = finishCheckProfileLabel () val _ = clear program in () end handle Err.E e => (Layout.outputl (Err.layout e, Out.error) ; Error.bug "Machine.typeCheck") fun clearLabelNames (T {chunks, ...}): unit = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {label, ...} => Label.clearPrintName label)) end fun simplify p = let val machinePasses = {name = "machineShuffle", doit = Program.shuffle, execute = false} :: nil (* Machine type check is too slow to run by default. *) (* val () = Control.trace (Control.Pass, "machineTypeCheck") Program.typeCheck p *) val p = Control.simplifyPasses {arg = p, passes = machinePasses, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = Program.typeCheck} (* val () = Control.trace (Control.Pass, "machineTypeCheck") Program.typeCheck p *) in p end end mlton-20210117+dfsg/mlton/backend/machine.sig000066400000000000000000000236051416264345000206640ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MACHINE_STRUCTS = sig include BACKEND_ATOMS end signature MACHINE = sig include MACHINE_STRUCTS structure ChunkLabel: ID structure Global: sig type t val equals: t * t -> bool val index: t -> int val layout: t -> Layout.t val new: Type.t -> t val numberOfType: CType.t -> int val ty: t -> Type.t end structure StackOffset: sig datatype t = T of {offset: Bytes.t, ty: Type.t} val ty: t -> Type.t end structure StaticHeap: sig structure Kind: sig datatype t = Dynamic | Immutable | Mutable | Root val all: t list val isDynamic: t -> bool val label: t -> Label.t val layout: t -> Layout.t val memoize: (t -> 'a) -> t -> 'a val name: t -> string end structure Ref: sig datatype t = T of {index: int, kind: Kind.t, offset: Bytes.t, ty: Type.t} val index: t -> int val kind: t -> Kind.t val layout: t -> Layout.t val offset: t -> Bytes.t val ty: t -> Type.t end structure Elem: sig datatype t = Cast of t * Type.t | Const of Const.t | Ref of Ref.t val layout: t -> Layout.t val ty: t -> Type.t end structure Object: OBJECT (* sharing Object = BackendAtoms *) sharing Object.Use = Elem end sharing StaticHeap.Object = BackendAtoms structure Temporary: sig type t val equals: t * t -> bool val index: t -> int val indexOpt: t -> int option val layout: t -> Layout.t val new: Type.t * int option -> t val setIndex: t * int -> unit val toString: t -> string val ty: t -> Type.t end structure Operand: sig datatype t = Cast of t * Type.t | Const of Const.t | Frontier | GCState | Global of Global.t | Label of Label.t | Offset of {base: t, offset: Bytes.t, ty: Type.t} | SequenceOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | StackOffset of StackOffset.t | StackTop | StaticHeapRef of StaticHeap.Ref.t | Temporary of Temporary.t val equals: t * t -> bool val interfere: t * t -> bool val isDestination: t -> bool val layout: t -> Layout.t val stackOffset: {offset: Bytes.t, ty: Type.t} -> t val gcField: Runtime.GCField.t -> t val toString: t -> string val ty: t -> Type.t val word: WordX.t -> t end structure Live: sig datatype t = Global of Global.t | StackOffset of StackOffset.t | Temporary of Temporary.t val equals: t * t -> bool val fromOperand: Operand.t -> t option val layout: t -> Layout.t val toOperand: t -> Operand.t val ty: t -> Type.t end structure Statement: sig datatype t = (* When temporaries or offsets appear in operands, there is an * implicit contents of. * When they appear as locations, there is not. *) Move of {dst: Operand.t, src: Operand.t} | PrimApp of {args: Operand.t vector, dst: Operand.t option, prim: Type.t Prim.t} | ProfileLabel of ProfileLabel.t val foldOperands: t * 'a * (Operand.t * 'a -> 'a) -> 'a val layout: t -> Layout.t val move: {dst: Operand.t, src: Operand.t} -> t option val object: {dst: Operand.t, header: WordX.t, size: Bytes.t} -> t vector val sequence: {dst: Operand.t, header: WordX.t, length: int, size: Bytes.t} -> t vector end structure Switch: SWITCH sharing Switch = Atoms sharing Switch.Use = Operand structure Transfer: sig datatype t = CCall of {args: Operand.t vector, func: Type.t CFunction.t, return: {return: Label.t (* must be CReturn *), size: Bytes.t option} option} | Call of {label: Label.t, (* must be kind Func *) live: Live.t vector, return: {return: Label.t (* must be kind Cont *), handler: Label.t option (* must be kind Handler*), size: Bytes.t} option} | Goto of Label.t (* must be kind Jump *) | Raise of {raisesTo: Label.t list} | Return of {returnsTo: Label.t list} | Switch of Switch.t val foldOperands: t * 'a * (Operand.t * 'a -> 'a) -> 'a val layout: t -> Layout.t end structure FrameOffsets: sig type t val equals: t * t -> bool val hash: t -> word val index: t -> int val layout: t -> Layout.t val new: {index: int, offsets: Bytes.t vector} -> t val offsets: t -> Bytes.t vector end structure FrameInfo: sig structure Kind: sig datatype t = C_FRAME | ML_FRAME val equals: t * t -> bool val hash: t -> word val layout: t -> Layout.t val toString: t -> string end type t val equals: t * t -> bool val frameOffsets: t -> FrameOffsets.t val index: t -> int val kind: t -> Kind.t val layout: t -> Layout.t val new: {frameOffsets: FrameOffsets.t, index: int, kind: Kind.t, size: Bytes.t, sourceSeqIndex: int option} -> t val offsets: t -> Bytes.t vector val setIndex: t * int -> unit val size: t -> Bytes.t val sourceSeqIndex: t -> int option end structure Kind: sig datatype t = Cont of {args: Live.t vector, frameInfo: FrameInfo.t} | CReturn of {dst: Live.t option, frameInfo: FrameInfo.t option, func: Type.t CFunction.t} | Func of {frameInfo: FrameInfo.t} | Handler of {args: Live.t vector, frameInfo: FrameInfo.t} | Jump val isEntry: t -> bool val frameInfoOpt: t -> FrameInfo.t option end structure Block: sig datatype t = T of {kind: Kind.t, label: Label.t, (* Live temporaries and stack offsets at start of block. *) live: Live.t vector, raises: Live.t vector option, returns: Live.t vector option, statements: Statement.t vector, transfer: Transfer.t} val foldDefs: t * 'a * (Operand.t * 'a -> 'a) -> 'a val label: t -> Label.t end structure Chunk: sig datatype t = T of {blocks: Block.t vector, chunkLabel: ChunkLabel.t, (* Temporary.index r * <= tempsMax (Type.toCType (Temporary.ty r)) * for all temporaries in the chunk. *) tempsMax: CType.t -> int} val chunkLabel: t -> ChunkLabel.t end structure Program: sig datatype t = T of {chunks: Chunk.t list, frameInfos: FrameInfo.t vector, frameOffsets: FrameOffsets.t vector, globals: {objptrs: (StaticHeap.Ref.t * Global.t) list, reals: (RealX.t * Global.t) list}, handlesSignals: bool, main: {chunkLabel: ChunkLabel.t, label: Label.t}, maxFrameSize: Bytes.t, objectTypes: Type.ObjectType.t vector, sourceMaps: SourceMaps.t option, staticHeaps: StaticHeap.Kind.t -> StaticHeap.Object.t vector} val clearLabelNames: t -> unit val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val toFile: {display: t Control.display, style: Control.style, suffix: string} val typeCheck: t -> unit end val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/backend/object-type.sig000066400000000000000000000020241416264345000214750ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature OBJECT_TYPE = sig structure Prod: PROD structure ObjptrTycon: OBJPTR_TYCON structure Runtime: RUNTIME type ty datatype t = Normal of {components: ty Prod.t, hasIdentity: bool} | Sequence of {components: ty Prod.t, hasIdentity: bool} | Stack | Weak of ty option (* in Weak (SOME t), must have Type.isObjptr t *) val basic: unit -> (ObjptrTycon.t * t) vector val components: t -> ty Prod.t val componentsSize: t -> Bytes.t val deNormal: t -> {components: ty Prod.t, hasIdentity: bool} val deSequence: t -> {components: ty Prod.t, hasIdentity: bool} val isOk: t -> bool val layout: t -> Layout.t val toRuntime: t -> Runtime.RObjectType.t end mlton-20210117+dfsg/mlton/backend/object.fun000066400000000000000000000144521416264345000205340ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Object (S: OBJECT_STRUCTS): OBJECT = struct open S datatype t = Normal of {init: {offset: Bytes.t, src: Use.t} vector, tycon: ObjptrTycon.t} | Sequence of {init: {offset: Bytes.t, src: Use.t} vector vector, tycon: ObjptrTycon.t} fun tycon obj = case obj of Normal {tycon, ...} => tycon | Sequence {tycon, ...} => tycon val ty = Type.objptr o tycon fun metaDataSize obj = case obj of Normal _ => Runtime.normalMetaDataSize () | Sequence _ => Runtime.sequenceMetaDataSize () fun size (obj, {tyconTy: ObjptrTycon.t -> ObjectType.t}) = case obj of Normal {tycon, ...} => Bytes.+ (Runtime.normalMetaDataSize (), ObjectType.componentsSize (tyconTy tycon)) | Sequence {init, tycon} => let val size = Bytes.+ (Runtime.sequenceMetaDataSize (), Bytes.* (ObjectType.componentsSize (tyconTy tycon), IntInf.fromInt (Vector.length init))) in case !Control.align of Control.Align4 => Bytes.alignWord32 size | Control.Align8 => Bytes.alignWord64 size end fun fromWordXVector wv = let val ws = WordXVector.elementSize wv val init = WordXVector.toVectorMap (wv, fn w => Vector.new1 {offset = Bytes.zero, src = Use.word w}) in Sequence {init = init, tycon = ObjptrTycon.wordVector ws} end fun 'a foldUse (s, a: 'a, use: Use.t * 'a -> 'a): 'a = let fun useInit (init, a) = Vector.fold (init, a, fn ({offset = _, src}, a) => use (src, a)) in case s of Normal {init, ...} => useInit (init, a) | Sequence {init, ...} => Vector.fold (init, a, useInit) end fun foreachUse (s, f) = foldUse (s, (), f o #1) fun replace (s:t, {use: Use.t -> Use.t}): t = let fun replaceInit init = Vector.map (init, fn {offset, src} => {offset = offset, src = use src}) in case s of Normal {init, tycon} => Normal {init = replaceInit init, tycon = tycon} | Sequence {init, tycon} => Sequence {init = Vector.map (init, replaceInit), tycon = tycon} end fun deString {init: {offset: Bytes.t, src: Use.t} vector vector, tycon: ObjptrTycon.t} = if ObjptrTycon.equals (tycon, ObjptrTycon.wordVector WordSize.word8) then Exn.withEscape (fn escape => SOME (String.implodeV (Vector.map (init, fn init => case Use.deWord (#src (Vector.first init)) of SOME w => WordX.toChar w | _ => escape NONE)))) else NONE fun layout obj = let open Layout val initLayout = Vector.layout (fn {offset, src} => record [("offset", Bytes.layout offset), ("src", Use.layout src)]) in case obj of Normal {init, tycon} => seq [str "NormalObject ", record [("init", initLayout init), ("tycon", ObjptrTycon.layout tycon)]] | Sequence (arg as {init, tycon}) => seq [str "SequenceObject ", record [("init", (case deString arg of NONE => Vector.layout initLayout init | SOME s => seq [str String.dquote, str (String.escapeSML s), str String.dquote])), ("tycon", ObjptrTycon.layout tycon)]] end val toString = Layout.toString o layout fun isOk (obj: t, {checkUse: Use.t -> unit, tyconTy: ObjptrTycon.t -> ObjectType.t}): bool = let fun initOk (init, offsetIsOk) = Exn.withEscape (fn esc => let val _ = Vector.fold (init, Bytes.zero, fn ({offset, src}, next) => if Bytes.>= (offset, next) andalso (checkUse src ; offsetIsOk {offset = offset, result = Use.ty src}) then Bytes.+ (offset, Type.bytes (Use.ty src)) else esc false) in true end) in case obj of Normal {init, tycon} => let val base = Type.objptr tycon fun offsetIsOk {offset, result} = Type.offsetIsOk {base = base, (* initialization of object field * does not require the field to be mutable. *) mustBeMutable = false, offset = offset, tyconTy = tyconTy, result = result} in initOk (init, offsetIsOk) end | Sequence {init, tycon} => let val base = Type.objptr tycon val index = Type.seqIndex () val scale = case Scale.fromBytes (ObjectType.componentsSize (tyconTy tycon)) of NONE => Scale.One | SOME s => s in Vector.forall (init, fn init => let fun offsetIsOk {offset, result} = Type.sequenceOffsetIsOk {base = base, index = index, (* initialization of object field * does not require the field to be mutable. *) mustBeMutable = false, offset = offset, result = result, scale = scale, tyconTy = tyconTy} in initOk (init, offsetIsOk) end) end end end mlton-20210117+dfsg/mlton/backend/object.sig000066400000000000000000000041621416264345000205230ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature OBJECT_STRUCTS = sig structure ObjptrTycon: OBJPTR_TYCON structure ObjectType: OBJECT_TYPE structure Runtime: RUNTIME structure Type: REP_TYPE structure WordSize: WORD_SIZE structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing ObjptrTycon = ObjectType.ObjptrTycon = Type.ObjptrTycon sharing ObjectType = Type.ObjectType sharing Runtime = ObjectType.Runtime = ObjptrTycon.Runtime = Type.Runtime sharing WordSize = ObjptrTycon.WordSize = Type.WordSize = WordX.WordSize = WordXVector.WordSize sharing WordX = ObjptrTycon.WordX = Type.WordX = WordXVector.WordX sharing WordXVector = Type.WordXVector structure Use: sig type t val deWord: t -> WordX.t option val layout: t -> Layout.t val ty: t -> Type.t val word: WordX.t -> t end end signature OBJECT = sig include OBJECT_STRUCTS datatype t = Normal of {init: {offset: Bytes.t, src: Use.t} vector, tycon: ObjptrTycon.t} | Sequence of {init: {offset: Bytes.t, src: Use.t} vector vector, tycon: ObjptrTycon.t} val deString: {init: {offset: Bytes.t, src: Use.t} vector vector, tycon: ObjptrTycon.t} -> string option val foldUse: t * 'a * (Use.t * 'a -> 'a) -> 'a val foreachUse: t * (Use.t -> unit) -> unit val fromWordXVector: WordXVector.t -> t val isOk: t * {checkUse: Use.t -> unit, tyconTy: ObjptrTycon.t -> ObjectType.t} -> bool val layout: t -> Layout.t val metaDataSize: t -> Bytes.t val replace: t * {use: Use.t -> Use.t} -> t val size: t * {tyconTy: ObjptrTycon.t -> ObjectType.t} -> Bytes.t val toString: t -> string val ty: t -> Type.t end mlton-20210117+dfsg/mlton/backend/objptr-tycon.fun000066400000000000000000000033321416264345000217130ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ObjptrTycon (S: OBJPTR_TYCON_STRUCTS): OBJPTR_TYCON = struct open S datatype t = T of {index: int ref} local fun make f (T r) = f r in val index = ! o (make #index) end local val c = Counter.generator 0 in fun new () = T {index = ref (c ())} end fun setIndex (T {index = r}, i) = r := i fun fromIndex i = T {index = ref i} fun compare (opt, opt') = Int.compare (index opt, index opt') fun equals (opt, opt') = index opt = index opt' val op <= = fn (opt, opt') => index opt <= index opt' fun toString (opt: t): string = concat ["opt_", Int.toString (index opt)] val layout = Layout.str o toString fun toHeader (opt: t): WordX.t = WordX.fromWord (Runtime.typeIndexToHeader (index opt), WordSize.objptrHeader ()) val stack = new () val thread = new () val weakGone = new () local val real32Vector = new () val real64Vector = new () in fun realVector (rs: RealSize.t): t = case rs of RealSize.R32 => real32Vector | RealSize.R64 => real64Vector end local val word8Vector = new () val word16Vector = new () val word32Vector = new () val word64Vector = new () in fun wordVector (ws: WordSize.t): t = case WordSize.primOpt ws of SOME WordSize.W8 => word8Vector | SOME WordSize.W16 => word16Vector | SOME WordSize.W32 => word32Vector | SOME WordSize.W64 => word64Vector | _ => Error.bug "ObjptrTycon.wordVector" end fun hash (T {index}) = (Hash.permute o Word.fromInt o !) index end mlton-20210117+dfsg/mlton/backend/objptr-tycon.sig000066400000000000000000000022071416264345000217050ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature OBJPTR_TYCON_STRUCTS = sig structure RealSize: REAL_SIZE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordSize = WordX.WordSize end signature OBJPTR_TYCON = sig include OBJPTR_TYCON_STRUCTS type t val <= : t * t -> bool val compare: t * t -> Relation.t val equals: t * t -> bool (* This hash may change if setIndex is called *) val hash: t -> word val fromIndex: int -> t val index: t -> int (* index into objectTypes array *) val layout: t -> Layout.t val new: unit -> t val setIndex: t * int -> unit val toHeader: t -> WordX.t val toString: t -> string (* See gc/object.h. *) val stack: t val thread: t val weakGone: t val realVector: RealSize.t -> t val wordVector: WordSize.t -> t end mlton-20210117+dfsg/mlton/backend/packed-representation.fun000066400000000000000000003460421416264345000235600ustar00rootroot00000000000000(* Copyright (C) 2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Has a special case to make sure that true is represented as 1 * and false is represented as 0. *) functor PackedRepresentation (S: REPRESENTATION_STRUCTS): REPRESENTATION = struct open S local open Rssa in structure Block = Block structure Kind = Kind structure Label = Label structure Object = Object structure ObjectType = ObjectType structure Operand = Operand structure ObjptrTycon = ObjptrTycon structure Prim = Prim structure RealSize = RealSize structure Runtime = Runtime structure Scale = Scale structure Statement = Statement structure Switch = Switch structure Transfer = Transfer structure Type = Type structure Var = Var structure WordSize = WordSize structure WordX = WordX end structure S = Ssa2 local open Ssa2 in structure Base = Base structure Con = Con structure ObjectCon = ObjectCon structure Prod = Prod structure Tycon = Tycon end datatype z = datatype Operand.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Type = struct open Type local fun mkPadToCheck (t: t, mk): (Bits.t * (unit -> t) -> t) = let val b = width t fun check (b', continue) = if Bits.< (b, b') then let val pad = zero (Bits.- (b', b)) in mk (t, pad) end else if Bits.equals (b, b') then t else continue () in check end fun mkPadToPrim (t: t, mk): t = let val check = mkPadToCheck (t, mk) in check (Bits.zero, fn () => check (Bits.inWord8, fn () => check (Bits.inWord16, fn () => check (Bits.inWord32, fn () => check (Bits.inWord64, fn () => Error.bug "PackedRepresentation.Type.mkPadToPrim"))))) end fun mkPadToWidth (t: t, b': Bits.t, mk): t = let val check = mkPadToCheck (t, mk) in check (b', fn () => Error.bug "PackedRepresentation.Type.mkPadToWidth") end fun mk (t, pad) = seq (Vector.new2 (t, pad)) in fun padToPrim (t: t): t = mkPadToPrim (t, mk) fun padToWidth (t: t, b: Bits.t): t = mkPadToWidth (t, b, mk) end val padToPrim = Trace.trace ("PackedRepresentation.Type.padToPrim", layout, layout) padToPrim val padToWidth = Trace.trace2 ("PackedRepresentation.Type.padToWidth", layout, Bits.layout, layout) padToWidth end structure Rep = struct datatype rep = NonObjptr | Objptr of {endsIn00: bool} datatype t = T of {rep: rep, ty: Type.t} fun layout (T {rep, ty}) = let open Layout in record [("rep", case rep of NonObjptr => str "NonObjptr" | Objptr {endsIn00} => seq [str "Objptr ", record [("endsIn00", Bool.layout endsIn00)]]), ("ty", Type.layout ty)] end local fun make f (T r) = f r in val ty = make #ty val rep = make #rep end fun equals (r, r') = Type.equals (ty r, ty r') val equals = Trace.trace2 ("PackedRepresentation.Rep.equals", layout, layout, Bool.layout) equals fun nonObjptr ty = T {rep = NonObjptr, ty = ty} val bool = nonObjptr Type.bool val width = Type.width o ty val unit = T {rep = NonObjptr, ty = Type.unit} fun isObjptr (T {rep, ...}) = case rep of Objptr _ => true | _ => false fun isObjptrEndingIn00 (T {rep, ...}) = case rep of Objptr {endsIn00} => endsIn00 | _ => false fun padToWidth (r as T {rep, ty}, width: Bits.t) = if Bits.equals (Type.width ty, width) then r else case rep of NonObjptr => T {rep = NonObjptr, ty = Type.padToWidth (ty, width)} | Objptr _ => Error.bug "PackedRepresentation.Rep.padToWidth" end structure Statement = struct open Statement local fun make prim (z1: Operand.t, z2: Operand.t) = let val ty = Operand.ty z1 val tmp = Var.newNoname () in (PrimApp {args = Vector.new2 (z1, z2), dst = SOME (tmp, ty), prim = prim (WordSize.fromBits (Type.width ty))}, Var {ty = ty, var = tmp}) end in val andb = make Prim.Word_andb val lshift = make Prim.Word_lshift val orb = make Prim.Word_orb val rshift = make (fn s => Prim.Word_rshift (s, {signed = false})) end end structure WordComponent = struct (* WordComponent describes the representation of (some of) the * components in a tuple as a word. * Components are stored from lowest to highest, just like in Type.seq. * The width of the rep must be less than the width of an objptr. * The sum of the widths of the component reps must be equal to the * width of the rep. *) datatype t = T of {components: {isMutable: bool, index: int, rep: Rep.t} vector, isMutable: bool, rep: Rep.t} fun layout (T {components, isMutable, rep}) = let open Layout in record [("components", Vector.layout (fn {index, isMutable, rep} => record [("index", Int.layout index), ("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep)]) components), ("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep)] end local fun make f (T r) = f r in val isMutable = make #isMutable val rep = make #rep end val unit = T {components = Vector.new0 (), isMutable = false, rep = Rep.unit} fun equals (wr, wr') = Rep.equals (rep wr, rep wr') fun make components = let val repTy = Type.seq (Vector.map (components, Rep.ty o #rep)) val rep = Rep.T {rep = Rep.NonObjptr, ty = repTy} in if Bits.<= (Rep.width rep, Control.Target.Size.objptr ()) then T {components = components, isMutable = Vector.exists (components, #isMutable), rep = rep} else Error.bug "PackedRepresentation.WordComponent.make" end val make = Trace.trace ("PackedRepresentation.WordComponent.make", fn components => let open Layout in Vector.layout (fn {index, isMutable, rep} => record [("index", Int.layout index), ("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep)]) components end, layout) make local fun mkPadToWidth (wc as T {components, rep, ...}, b: Bits.t, mk): t = let val padBits = Bits.- (b, Rep.width rep) in if Bits.isZero padBits then wc else let val pad = {index = ~1, isMutable = false, rep = Rep.nonObjptr (Type.bits padBits)} in make (mk (components, Vector.new1 pad)) end end fun mk (cs, pad) = Vector.concat [cs, pad] in fun padToWidth (c, b) = mkPadToWidth (c, b, mk) end fun tuple (T {components, ...}, {dst = (dstVar, dstTy): Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = let val bits = Type.width dstTy val (accOpt,_,statements) = Vector.fold (components, (NONE,Bits.zero,[]), fn ({index, rep, ...}, (accOpt,shift,statements)) => if index < 0 then (accOpt, Bits.+ (shift, Rep.width rep), statements) else let val (src, ss) = Statement.resize (src {index = index}, Type.bits bits) val ss = List.rev ss val (src, ss) = if Bits.equals (shift, Bits.zero) then (src, ss) else let val (s, src) = Statement.lshift (src, Operand.word (WordX.fromBits (shift, WordSize.shiftArg))) in (src, s :: ss) end val (acc, ss) = case accOpt of NONE => (src, ss) | SOME acc => let val (s, acc) = Statement.orb (src, acc) in (acc, s :: ss) end in (SOME acc, Bits.+ (shift, Rep.width rep), ss :: statements) end) val statements = case accOpt of NONE => [] | SOME src => [Bind {dst = (dstVar, dstTy), pinned = false, src = src}] :: statements in List.fold (statements, [], fn (ss, ac) => List.fold (ss, ac, op ::)) end val tuple = Trace.trace ("PackedRepresentation.WordComponent.tuple", layout o #1, List.layout Statement.layout) tuple end structure Component = struct datatype t = Direct of {index: int, isMutable: bool, rep: Rep.t} | Word of WordComponent.t fun layout c = let open Layout in case c of Direct {index, isMutable, rep} => seq [str "Direct ", record [("index", Int.layout index), ("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep)]] | Word wc => seq [str "Word ", WordComponent.layout wc] end val rep: t -> Rep.t = fn Direct {rep, ...} => rep | Word wc => WordComponent.rep wc val ty = Rep.ty o rep val size = Type.bytes o ty val isMutable: t -> bool = fn Direct {isMutable, ...} => isMutable | Word wc => WordComponent.isMutable wc val unit = Word WordComponent.unit val equals: t * t -> bool = fn z => case z of (Direct {rep = r, ...}, Direct {rep = r', ...}) => Rep.equals (r, r') | (Word wc, Word wc') => WordComponent.equals (wc, wc') | _ => false local fun mkPadToWidth (c: t, b: Bits.t, repPadToWidth, wordRepPadToWidth): t = case c of Direct {index, isMutable, rep} => Direct {index = index, isMutable = isMutable, rep = repPadToWidth (rep, b)} | Word wc => Word (wordRepPadToWidth (wc, b)) in fun padToWidth (c, b) = mkPadToWidth (c, b, Rep.padToWidth, WordComponent.padToWidth) end local fun mkPadToPrim (c: t, typePadToPrim, padToWidth) = let val ty = ty c val ty' = typePadToPrim ty in if Type.equals (ty, ty') then c else padToWidth (c, Type.width ty') end in fun padToPrim c = mkPadToPrim (c, Type.padToPrim, padToWidth) end fun tuple (c: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}) : Statement.t list = case c of Direct {index, ...} => let val (src, ss) = Statement.resize (src {index = index}, #2 dst) in ss @ [Bind {dst = dst, pinned = false, src = src}] end | Word wc => WordComponent.tuple (wc, {dst = dst, src = src}) val tuple = Trace.trace2 ("PackedRepresentation.Component.tuple", layout, fn {dst = (dst, _), ...} => Var.layout dst, List.layout Statement.layout) tuple end structure Unpack = struct datatype t = T of {shift: Bits.t, ty: Type.t} fun layout (T {shift, ty}) = let open Layout in record [("shift", Bits.layout shift), ("ty", Type.layout ty)] end val lshift: t * Bits.t -> t = fn (T {shift, ty}, b) => T {shift = Bits.+ (shift, b), ty = ty} fun select (T {shift, ty}, {dst = (dst, dstTy), src: Operand.t}): Statement.t list = let val (src, ss1) = if Bits.isZero shift then (src, []) else let val shift = WordX.fromBits (shift, WordSize.shiftArg) val (s, tmp) = Statement.rshift (src, Operand.word shift) in (tmp, [s]) end val w = Type.width ty val sz = WordSize.fromBits w val w' = Type.width dstTy val sz' = WordSize.fromBits w' val (src, ss2) = Statement.resize (src, dstTy) val (src, ss3) = if Bits.equals (w, w') (* orelse Type.isZero (Type.dropPrefix (Operand.ty src, * WordSize.bits sz)) *) then (src, []) else let val mask = WordX.resize (WordX.max (sz, {signed = false}), sz') val (s, src) = Statement.andb (src, Operand.word mask) in (src, [s]) end in ss1 @ ss2 @ ss3 @ [Bind {dst = (dst, dstTy), pinned = false, src = src}] end val select = Trace.trace2 ("PackedRepresentation.Unpack.select", layout, fn {dst = (dst, _), src} => Layout.record [("dst", Var.layout dst), ("src", Operand.layout src)], List.layout Statement.layout) select fun update (T {shift, ty}, {chunk: Operand.t, component: Operand.t}): Operand.t * Statement.t list = let val shift = WordX.fromBits (shift, WordSize.shiftArg) val chunkTy = Operand.ty chunk val chunkWidth = Type.width chunkTy val mask = Operand.word (WordX.notb (WordX.lshift (WordX.resize (WordX.allOnes (WordSize.fromBits (Type.width ty)), WordSize.fromBits chunkWidth), shift))) val (s1, chunk) = Statement.andb (chunk, mask) val (component, s2) = Statement.resize (component, chunkTy) val (s3, component) = Statement.lshift (component, Operand.word shift) val (s4, result) = Statement.orb (chunk, component) in (result, [s1] @ s2 @ [s3, s4]) end val update = Trace.trace2 ("PackedRepresentation.Unpack.update", layout, fn {chunk, component} => Layout.record [("chunk", Operand.layout chunk), ("component", Operand.layout component)], Layout.tuple2 (Operand.layout, List.layout Statement.layout)) update end structure Base = struct open Base fun toOperand {base: Operand.t t, eltWidth: Bytes.t option, offset: Bytes.t, ty: Type.t}: Operand.t * Statement.t list = case base of Object base => (Offset {base = base, offset = offset, ty = ty}, []) | SequenceSub {index, sequence} => let val eltWidth = case eltWidth of NONE => Error.bug "PackedRepresentation.Base.toOperand: eltWidth" | SOME w => w in case Scale.fromBytes eltWidth of NONE => let val seqIndexSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexSize val prod = Var.newNoname () val s = PrimApp {args = (Vector.new2 (index, Operand.word (WordX.fromBytes (eltWidth, seqIndexSize)))), dst = SOME (prod, seqIndexTy), prim = (Prim.Word_mul (seqIndexSize, {signed = false}))} in (SequenceOffset {base = sequence, index = Var {var = prod, ty = seqIndexTy}, offset = offset, scale = Scale.One, ty = ty}, [s]) end | SOME s => (SequenceOffset {base = sequence, index = index, offset = offset, scale = s, ty = ty}, []) end end structure Select = struct datatype t = None | Direct of {ty: Type.t} | Indirect of {offset: Bytes.t, ty: Type.t} | IndirectUnpack of {offset: Bytes.t, rest: Unpack.t, ty: Type.t} | Unpack of Unpack.t fun layout s = let open Layout in case s of None => str "None" | Direct {ty} => seq [str "Direct ", record [("ty", Type.layout ty)]] | Indirect {offset, ty} => seq [str "Indirect ", record [("offset", Bytes.layout offset), ("ty", Type.layout ty)]] | IndirectUnpack {offset, rest, ty} => seq [str "IndirectUnpack ", record [("offset", Bytes.layout offset), ("rest", Unpack.layout rest), ("ty", Type.layout ty)]] | Unpack u => seq [str "Unpack ", Unpack.layout u] end val lshift: t * Bits.t -> t = fn (s, b) => case s of None => None | Direct {ty} => Unpack (Unpack.T {shift = b, ty = ty}) | Unpack u => Unpack (Unpack.lshift (u, b)) | _ => Error.bug "PackedRepresentation.Select.lshift" fun select (s: t, {base: Operand.t Base.t, dst: Var.t * Type.t, eltWidth: Bytes.t option}): Statement.t list = let fun move (src, ss) = let val (dst, dstTy) = dst val (src, ss') = Statement.resize (src, dstTy) in ss @ ss' @ [Bind {dst = (dst, dstTy), pinned = false, src = src}] end in case s of None => [] | Direct _ => move (Base.object base, []) | Indirect {offset, ty} => move (Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty}) | IndirectUnpack {offset, rest, ty} => let val tmpVar = Var.newNoname () val tmpOp = Var {ty = ty, var = tmpVar} val (src, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} in ss @ (Bind {dst = (tmpVar, ty), pinned = false, src = src} :: Unpack.select (rest, {dst = dst, src = tmpOp})) end | Unpack u => Unpack.select (u, {dst = dst, src = Base.object base}) end val select = Trace.trace ("PackedRepresentation.Select.select", layout o #1, List.layout Statement.layout) select fun update (s: t, {base: Operand.t Base.t, eltWidth: Bytes.t option, value: Operand.t}): Statement.t list = case s of Indirect {offset, ty} => let val (dst, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} in ss @ [Move {dst = dst, src = value}] end | IndirectUnpack {offset, rest, ty} => let val (chunk, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} val (newChunk, ss') = Unpack.update (rest, {chunk = chunk, component = value}) in ss @ ss' @ [Move {dst = chunk, src = newChunk}] end | _ => Error.bug "PackedRepresentation.Select.update: non-indirect" val update = Trace.trace ("PackedRepresentation.Select.update", layout o #1, List.layout Statement.layout) update end structure Selects = struct datatype t = T of {orig: S.Type.t, select: Select.t} vector fun layout (T v) = Vector.layout (Select.layout o #select) v val empty = T (Vector.new0 ()) fun map (T v, f) = T (Vector.map (v, fn {orig, select} => {orig = orig, select = f select})) fun select (T v, {base: Operand.t Base.t, dst: Var.t * Type.t, eltWidth: Bytes.t option, offset: int}): Statement.t list = Select.select (#select (Vector.sub (v, offset)), {base = base, eltWidth = eltWidth, dst = dst}) fun update (T v, {base, eltWidth, offset, value}) = Select.update (#select (Vector.sub (v, offset)), {base = base, eltWidth = eltWidth, value = value}) fun lshift (T v, b: Bits.t) = T (Vector.map (v, fn {orig, select} => {orig = orig, select = Select.lshift (select, b)})) end structure ObjptrRep = struct datatype t = T of {components: {component: Component.t, offset: Bytes.t} vector, selects: Selects.t, ty: Type.t, tycon: ObjptrTycon.t} fun layout (T {components, selects, ty, tycon}) = let open Layout in record [("components", Vector.layout (fn {component, offset} => record [("component", Component.layout component), ("offset", Bytes.layout offset)]) components), ("selects", Selects.layout selects), ("ty", Type.layout ty), ("tycon", ObjptrTycon.layout tycon)] end local fun make f (T r) = f r in val ty = make #ty end fun mkObjectTypeComponents (T {components, ...}) = (Prod.make o Vector.map) (components, fn {component, ...} => {elt = Component.ty component, isMutable = Component.isMutable component}) fun componentsSize (T {components, ...}) = Vector.fold (components, Bytes.zero, fn ({component, ...}, b) => Bytes.+ (Component.size component, b)) fun equals (T {tycon = c, ...}, T {tycon = c', ...}) = ObjptrTycon.equals (c, c') fun rep (T {ty, ...}) = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = ty} fun make {components, isSequence, selects, tycon} = let val width = Vector.fold (components, Bytes.zero, fn ({component = c, ...}, ac) => Bytes.+ (ac, Component.size c)) val padBytes: Bytes.t = if isSequence then let val alignWidth = case !Control.align of Control.Align4 => width | Control.Align8 => if (Vector.exists (components, fn {component = c, ...} => (case Type.deReal (Component.ty c) of NONE => false | SOME s => RealSize.equals (s, RealSize.R64)) orelse (case Type.deWord (Component.ty c) of NONE => false | SOME s => WordSize.equals (s, WordSize.word64)) orelse (Type.isObjptr (Component.ty c) andalso WordSize.equals (WordSize.objptr (), WordSize.word64)))) then Bytes.alignWord64 width else width in Bytes.- (alignWidth, width) end else let (* Note that with Align8 and objptrSize == 64bits, * the following ensures that objptrs will be * mod 8 aligned. *) val width' = Bytes.+ (width, Runtime.normalMetaDataSize ()) val alignWidth' = case !Control.align of Control.Align4 => Bytes.alignWord32 width' | Control.Align8 => Bytes.alignWord64 width' val alignWidth = Bytes.- (alignWidth', Runtime.normalMetaDataSize ()) in Bytes.- (alignWidth, width) end val (components, selects) = if Bytes.isZero padBytes then (components, selects) else (* Need to insert a pad before the first objptr. *) let val {no = nonObjptrs, yes = objptrs} = Vector.partition (components, fn {component = c, ...} => Rep.isObjptr (Component.rep c)) val padOffset = if Vector.isEmpty objptrs then width else #offset (Vector.first objptrs) fun mkPad (padBytes, padOffset, pads) = if Bytes.isZero padBytes then Vector.fromList pads else let fun try (b, k) () = if Bytes.<= (b, padBytes) then mkPad (Bytes.- (padBytes, b), Bytes.+ (padOffset, b), {component = (Component.padToWidth (Component.unit, Bytes.toBits b)), offset = padOffset}::pads) else k () fun bug () = Error.bug "PackedRepresentation.ObjptrRep.make: mkPad" in List.fold (Bytes.prims, bug, try) () end val pad = mkPad (padBytes, padOffset, []) val objptrs = Vector.map (objptrs, fn {component = c, offset} => {component = c, offset = Bytes.+ (offset, padBytes)}) val components = Vector.concat [nonObjptrs, pad, objptrs] val selects = Selects.map (selects, fn s => case s of Select.Indirect {offset, ty} => if Bytes.>= (offset, padOffset) then Select.Indirect {offset = Bytes.+ (offset, padBytes), ty = ty} else s | _ => s) in (components, selects) end in T {components = components, selects = selects, ty = Type.objptr tycon, tycon = tycon} end val make = let open Layout in Trace.trace ("PackedRepresentation.ObjptrRep.make", fn {components, isSequence, selects, tycon} => record [("components", Vector.layout (fn {component, offset} => record [("component", Component.layout component), ("offset", Bytes.layout offset)]) components), ("isSequence", Bool.layout isSequence), ("selects", Selects.layout selects), ("tycon", ObjptrTycon.layout tycon)], layout) end make fun box (component: Component.t, opt: ObjptrTycon.t, selects: Selects.t) = let val selects = Selects.map (selects, fn s => let datatype z = datatype Select.t in case s of None => None | Direct {ty} => Indirect {offset = Bytes.zero, ty = ty} | Unpack u => IndirectUnpack {offset = Bytes.zero, rest = u, ty = Component.ty component} | _ => Error.bug "PackedRepresentation.ObjptrRep.box: cannot lift selects" end) in make {components = Vector.new1 {component = component, offset = Bytes.zero}, isSequence = false, selects = selects, tycon = opt} end fun tuple (T {components, ty, tycon, ...}, {dst = dst: Var.t, src: {index: int} -> Operand.t}) = let val (pre, init) = Vector.fold (components, ([], []), fn ({component, offset}, (pre, init)) => let val tmpVar = Var.newNoname () val tmpTy = Component.ty component val statements = Component.tuple (component, {dst = (tmpVar, tmpTy), src = src}) in if List.isEmpty statements then (pre, init) else (statements :: pre, {offset = offset, src = Var {ty = tmpTy, var = tmpVar}} :: init) end) in List.concatRev ([Object {dst = (dst, ty), obj = Object.Normal {init = Vector.fromListRev init, tycon = tycon}}] :: pre) end val tuple = Trace.trace2 ("PackedRepresentation.ObjptrRep.tuple", layout, Var.layout o #dst, List.layout Statement.layout) tuple fun sequence (T {components, ty, tycon, ...}, {dst = dst: Var.t, src: ({index: int} -> Operand.t) vector}) = let val (pre, init) = Vector.fold (src, ([], []), fn (src, (pre, init')) => let val (pre, init) = Vector.fold (components, (pre, []), fn ({component, offset}, (pre, init)) => let val tmpVar = Var.newNoname () val tmpTy = Component.ty component val statements = Component.tuple (component, {dst = (tmpVar, tmpTy), src = src}) in if List.isEmpty statements then (pre, init) else (statements :: pre, {offset = offset, src = Var {ty = tmpTy, var = tmpVar}} :: init) end) in (pre, Vector.fromListRev init :: init') end) in List.concatRev ([Object {dst = (dst, ty), obj = Object.Sequence {init = Vector.fromListRev init, tycon = tycon}}] :: pre) end val sequence = Trace.trace2 ("PackedRepresentation.ObjptrRep.sequence", layout, Var.layout o #dst, List.layout Statement.layout) sequence end structure TupleRep = struct datatype t = Direct of {component: Component.t, selects: Selects.t} | Indirect of ObjptrRep.t fun layout tr = let open Layout in case tr of Direct {component, selects} => seq [str "Direct ", record [("component", Component.layout component), ("selects", Selects.layout selects)]] | Indirect pr => seq [str "Indirect ", ObjptrRep.layout pr] end val unit = Direct {component = Component.unit, selects = Selects.empty} val equals: t * t -> bool = fn z => case z of (Direct {component = c, ...}, Direct {component = c', ...}) => Component.equals (c, c') | (Indirect pr, Indirect pr') => ObjptrRep.equals (pr, pr') | _ => false fun rep (tr: t): Rep.t = case tr of Direct {component, ...} => Component.rep component | Indirect p => ObjptrRep.rep p val ty = Rep.ty o rep fun selects (tr: t): Selects.t = case tr of Direct {selects, ...} => selects | Indirect (ObjptrRep.T {selects, ...}) => selects fun tuple (tr: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = case tr of Direct {component = c, ...} => Component.tuple (c, {dst = dst, src = src}) | Indirect pr => ObjptrRep.tuple (pr, {dst = #1 dst, src = src}) val tuple = Trace.trace2 ("PackedRepresentation.TupleRep.tuple", layout, Var.layout o #1 o #dst, List.layout Statement.layout) tuple (* TupleRep.make decides how to layout a series of types in an object, * or in the case of a sequence, in a sequence element. * Sequences are treated slightly specially because we don't require element * widths to be a multiple of the word32 size. * At the front of the object, we place all the word64s, followed by * all the word32s. Then, we pack in all the types that are smaller than a * word32. This is done by packing in a series of words, greedily, * starting with the largest type and moving to the smallest. We pad to * ensure that a value never crosses a word32 boundary. Finally, if there * are any objptrs, they go at the end of the object. * * There is some extra logic here to specially represent (boxed) * tuples that are entirely comprised of primitive types. The * primary motivation is that "word8 ref" and "word16 ref" are * FFI types, and must have representations that are compatible * with C. In particular, on a big-endian platform, such * sub-word32 components must be at the low byte offset (but * high bit offset) of the containing word32. *) fun make (objptrTycon: ObjptrTycon.t, rs: {isMutable: bool, rep: Rep.t, ty: S.Type.t} vector, {forceBox: bool, isSequence: bool}): t = let val objptrs = ref [] val numObjptrs = ref 0 val word64s = ref [] val numWord64s = ref 0 val word32s = ref [] val numWord32s = ref 0 val subWord32s = Array.array (Bits.toInt Bits.inWord32, []) val widthSubWord32s = ref 0 val hasNonPrim = ref false val () = Vector.foreachi (rs, fn (i, {isMutable, rep, ...}) => let fun addDirect (l, n) = (List.push (l, {component = Component.Direct {index = i, isMutable = isMutable, rep = rep}, index = i}) ; Int.inc n) fun addSubWord32 b = (Array.update (subWord32s, b, {index = i, isMutable = isMutable, rep = rep} :: Array.sub (subWord32s, b)) ; widthSubWord32s := !widthSubWord32s + b) in case Rep.rep rep of Rep.NonObjptr => let val b = Bits.toInt (Rep.width rep) in case b of 0 => () | 8 => addSubWord32 b | 16 => addSubWord32 b | 32 => addDirect (word32s, numWord32s) | 64 => addDirect (word64s, numWord64s) | _ => (addSubWord32 b ; hasNonPrim := true) end | Rep.Objptr _ => addDirect (objptrs, numObjptrs) end) val selects = Array.array (Vector.length rs, Select.None) val hasNonPrim = !hasNonPrim val numComponents = !numObjptrs + !numWord64s + !numWord32s + (let val widthSubWord32s = !widthSubWord32s in Int.quot (widthSubWord32s, 32) + Int.min (1, Int.rem (widthSubWord32s, 32)) end) val needsBox = forceBox orelse Vector.exists (rs, #isMutable) orelse numComponents > 1 val padToPrim = isSequence andalso 1 = numComponents val isBigEndian = Control.Target.bigEndian () fun byteShiftToByteOffset (compSz: Bytes.t, tySz: Bytes.t, shift: Bytes.t) = if not isBigEndian then shift else Bytes.- (compSz, Bytes.+ (tySz, shift)) fun simple (l, tyWidth: Bytes.t, offset: Bytes.t, components) = List.fold (l, (offset, components), fn ({component, index}, (offset, ac)) => (Bytes.+ (offset, tyWidth), let val ty = Component.ty component val () = Array.update (selects, index, if needsBox then Select.Indirect {offset = offset, ty = ty} else Select.Direct {ty = ty}) in {component = component, offset = offset} :: ac end)) val offset = Bytes.zero val components = [] val (offset, components) = simple (!word64s, Bytes.inWord64, offset, components) val (offset, components) = simple (!word32s, Bytes.inWord32, offset, components) (* j is the maximum index <= remainingWidth at which an * element of subWord32s may be nonempty. *) fun getSubWord32Components (j: int, remainingWidth: Bits.t, components) = if 0 = j then Vector.fromListRev components else let val elts = Array.sub (subWord32s, j) in case elts of [] => getSubWord32Components (j - 1, remainingWidth, components) | {index, isMutable, rep} :: elts => let val () = Array.update (subWord32s, j, elts) val remainingWidth = Bits.- (remainingWidth, Rep.width rep) in getSubWord32Components (Bits.toInt remainingWidth, remainingWidth, {index = index, isMutable = isMutable, rep = rep} :: components) end end (* max is the maximum index at which an element of * subWord32s may be nonempty. *) fun makeSubWord32s (max: int, offset: Bytes.t, ac) = if 0 = max then (offset, ac) else if List.isEmpty (Array.sub (subWord32s, max)) then makeSubWord32s (max - 1, offset, ac) else let val components = getSubWord32Components (max, Bits.inWord32, []) val component = Component.Word (WordComponent.make components) val component = if needsBox then if padToPrim then Component.padToPrim component else Component.padToWidth (component, Bits.inWord32) else component val componentTy = Component.ty component val _ = Vector.fold (components, Bits.zero, fn ({index, rep, ...}, shift) => let val repTy = Rep.ty rep val repTyWidth = Type.width repTy val repWidth = Rep.width rep val unpack = Unpack.T {shift = shift, ty = repTy} fun getByteOffset () = Bytes.+ (offset, byteShiftToByteOffset (Type.bytes componentTy, Bits.toBytes repTyWidth, Bits.toBytes shift)) val select = if needsBox then if ((Bits.isWord8Aligned shift andalso (Bits.equals (repTyWidth, Bits.inWord8))) orelse (Bits.isWord16Aligned shift andalso (Bits.equals (repTyWidth, Bits.inWord16)))) then (Select.Indirect {offset = getByteOffset (), ty = repTy}) else (Select.IndirectUnpack {offset = offset, rest = unpack, ty = componentTy}) else Select.Unpack unpack val () = Array.update (selects, index, select) in Bits.+ (shift, repWidth) end) val ac = {component = component, offset = offset} :: ac in makeSubWord32s (max, (* Either the width of the word rep component * is 32 bits, or this is the only * component, so offset doesn't matter. *) Bytes.+ (offset, Bytes.inWord32), ac) end fun makeSubWord32sAllPrims (_, offset: Bytes.t, components) = let fun doit (b, offset, components) = simple (List.map (Array.sub (subWord32s, b), fn {index, isMutable, rep} => {component = Component.Direct {index = index, isMutable = isMutable, rep = rep}, index = index}), Bits.toBytes (Bits.fromInt b), offset, components) val (offset, components) = doit (16, offset, components) val (offset, components) = doit (8, offset, components) in (offset, components) end val (offset, components) = if (not hasNonPrim) andalso needsBox then makeSubWord32sAllPrims (Array.length subWord32s - 1, offset, components) else makeSubWord32s (Array.length subWord32s - 1, offset, components) val (_, components) = simple (!objptrs, Runtime.objptrSize (), offset, components) val components = Vector.fromListRev components (* val () = Assert.assert ("PackedRepresentation.TupleRep.make", fn () => numComponents = Vector.length components) *) val getSelects = Selects.T (Vector.tabulate (Array.length selects, fn i => {orig = #ty (Vector.sub (rs, i)), select = Array.sub (selects, i)})) in if needsBox then Indirect (ObjptrRep.make {components = components, isSequence = isSequence, selects = getSelects, tycon = objptrTycon}) else if numComponents = 0 then unit else Direct {component = #component (Vector.first components), selects = getSelects} end val make = Trace.trace3 ("PackedRepresentation.TupleRep.make", ObjptrTycon.layout, Vector.layout (fn {isMutable, rep, ty} => Layout.record [("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep), ("ty", S.Type.layout ty)]), fn {forceBox, isSequence} => Layout.record [("forceBox", Bool.layout forceBox), ("isSequence", Bool.layout isSequence)], layout) make end structure ConRep = struct datatype t = ShiftAndTag of {component: Component.t, selects: Selects.t, tag: WordX.t, ty: Type.t (* alread padded to prim *)} | Tag of {tag: WordX.t, ty: Type.t} | Tuple of TupleRep.t val layout = let open Layout in fn ShiftAndTag {component, selects, tag, ty} => seq [str "ShiftAndTag ", record [("component", Component.layout component), ("selects", Selects.layout selects), ("tag", WordX.layout (tag, {suffix = true})), ("ty", Type.layout ty)]] | Tag {tag, ...} => seq [str "Tag ", WordX.layout (tag, {suffix = true})] | Tuple tr => TupleRep.layout tr end val equals: t * t -> bool = fn (ShiftAndTag {component = c1, tag = t1, ...}, ShiftAndTag {component = c2, tag = t2, ...}) => Component.equals (c1, c2) andalso WordX.equals (t1, t2) | (Tag {tag = t1, ty = ty1}, Tag {tag = t2, ty = ty2}) => WordX.equals (t1, t2) andalso Type.equals (ty1, ty2) | (Tuple tr1, Tuple tr2) => TupleRep.equals (tr1, tr2) | _ => false val rep: t -> Rep.t = fn ShiftAndTag {ty, ...} => Rep.nonObjptr ty | Tag {ty, ...} => Rep.nonObjptr ty | Tuple tr => TupleRep.rep tr val box = Tuple o TupleRep.Indirect local fun make i = let val tag = WordX.fromIntInf (i, WordSize.bool) in Tag {tag = tag, ty = Type.ofWordX tag} end in val falsee = make 0 val truee = make 1 end val unit = Tuple TupleRep.unit fun conApp (r: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = case r of ShiftAndTag {component, tag, ...} => let val (dstVar, dstTy) = dst val shift = Operand.word (WordX.fromBits (WordSize.bits (WordX.size tag), WordSize.shiftArg)) val tmpVar = Var.newNoname () val tmpTy = Type.padToWidth (Component.ty component, Type.width dstTy) val tmp = Var {ty = tmpTy, var = tmpVar} val component = Component.tuple (component, {dst = (tmpVar, tmpTy), src = src}) val (s1, tmp) = Statement.lshift (tmp, shift) val mask = Operand.word (WordX.resize (tag, WordSize.fromBits (Type.width (Operand.ty tmp)))) val (s2, tmp) = Statement.orb (tmp, mask) val s3 = Bind {dst = (dstVar, dstTy), pinned = false, src = tmp} in component @ [s1, s2, s3] end | Tag {tag, ...} => let val (dstVar, dstTy) = dst val src = Operand.word (WordX.resize (tag, WordSize.fromBits (Type.width dstTy))) in [Bind {dst = (dstVar, dstTy), pinned = false, src = src}] end | Tuple tr => TupleRep.tuple (tr, {dst = dst, src = src}) val conApp = Trace.trace ("PackedRepresentation.ConRep.conApp", layout o #1, List.layout Statement.layout) conApp end structure Block = struct open Block val extra: t list ref = ref [] fun getExtra () = !extra before extra := [] fun new {statements: Statement.t vector, transfer: Transfer.t}: Label.t = let val l = Label.newNoname () val _ = List.push (extra, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = statements, transfer = transfer}) in l end end structure Cases = struct type t = {con: Con.t, dst: Label.t, dstHasArg: bool} vector fun layout (v: t): Layout.t = Vector.layout (fn {con, dst, dstHasArg} => Layout.record [("con", Con.layout con), ("dst", Label.layout dst), ("dstHasArg", Bool.layout dstHasArg)]) v end structure Objptrs = struct (* 1 < Vector.length variants *) datatype t = T of {rep: Rep.t, variants: {con: Con.t, objptr: ObjptrRep.t} vector} fun layout (T {rep, variants}) = let open Layout in record [("rep", Rep.layout rep), ("variants", Vector.layout (fn {con, objptr} => record [("con", Con.layout con), ("objptr", ObjptrRep.layout objptr)]) variants)] end local fun make f (T r) = f r in val rep = make #rep end val ty = Rep.ty o rep fun make {rep, variants}: t = T {rep = rep, variants = variants} fun genCase (T {variants, ...}, {cases: Cases.t, conRep: Con.t -> ConRep.t, default: Label.t option, test: Operand.t}) : Statement.t list * Transfer.t = let val cases = Vector.keepAllMap (cases, fn {con, dst, dstHasArg} => case conRep con of ConRep.Tuple (TupleRep.Indirect (ObjptrRep.T {ty, tycon, ...})) => SOME (WordX.fromInt (ObjptrTycon.index tycon, WordSize.objptrHeader ()), Block.new {statements = Vector.new0 (), transfer = Goto {args = if dstHasArg then (Vector.new1 (Operand.cast (test, ty))) else Vector.new0 (), dst = dst}}) | _ => NONE) in if Vector.isEmpty cases then case default of NONE => ([], Transfer.bug ()) | SOME default => ([], Goto {args = Vector.new0 (), dst = default}) else let val default = if Vector.length variants = Vector.length cases then NONE else default val cases = QuickSort.sortVector (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) val shift = Operand.word (WordX.one WordSize.shiftArg) val (s, tag) = Statement.rshift (Offset {base = test, offset = Runtime.headerOffset (), ty = Type.objptrHeader ()}, shift) in ([s], Switch (Switch.T {cases = cases, default = default, expect = NONE, size = WordSize.objptrHeader (), test = tag})) end end end structure Small = struct datatype t = T of {isEnum: bool, rep: Rep.t, tagBits: Bits.t, variants: Con.t vector} fun layout (T {isEnum, rep, tagBits, variants}) = let open Layout in record [("isEnum", Bool.layout isEnum), ("rep", Rep.layout rep), ("tagBits", Bits.layout tagBits), ("variants", Vector.layout Con.layout variants)] end local fun make f (T r) = f r in val rep = make #rep end val bool = T {isEnum = true, rep = Rep.bool, tagBits = Bits.one, variants = Vector.new2 (Con.falsee, Con.truee)} fun genCase (T {isEnum, tagBits, variants, ...}, {cases: Cases.t, conRep: Con.t -> ConRep.t, isObjptr: bool, notSmall: Label.t option, smallDefault: Label.t option, test: Operand.t}) : Statement.t list * Transfer.t = let val tagSize = WordSize.fromBits tagBits val testBits = Type.width (Operand.ty test) val testSize = WordSize.fromBits testBits val cases = Vector.keepAllMap (cases, fn {con, dst, dstHasArg} => case conRep con of ConRep.ShiftAndTag {tag, ty, ...} => let val test = Operand.cast (test, Type.padToWidth (ty, testBits)) val (test, ss) = Statement.resize (test, ty) val transfer = Goto {args = if dstHasArg then Vector.new1 test else Vector.new0 (), dst = dst} in SOME (WordX.resize (tag, testSize), Block.new {statements = Vector.fromList ss, transfer = transfer}) end | ConRep.Tag {tag, ...} => let val transfer = Goto {args = if dstHasArg then Vector.new1 test else Vector.new0 (), dst = dst} in SOME (WordX.resize (tag, testSize), Block.new {statements = Vector.new0 (), transfer = transfer}) end | _ => NONE) val cases = QuickSort.sortVector (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) val default = if Vector.length variants = Vector.length cases then notSmall else case (notSmall, smallDefault) of (NONE, _) => smallDefault | (_, NONE) => notSmall | (SOME notSmall, SOME smallDefault) => let val (s, test) = Statement.andb (Operand.cast (test, Type.bits testBits), Operand.word (WordX.fromIntInf (3, testSize))) val t = Switch (Switch.T {cases = Vector.new1 (WordX.zero testSize, notSmall), default = SOME smallDefault, expect = NONE, size = testSize, test = test}) in SOME (Block.new {statements = Vector.new1 s, transfer = t}) end in if Vector.isEmpty cases then (case default of NONE => ([], Transfer.bug ()) | SOME default => ([], Goto {args = Vector.new0 (), dst = default})) else let val tagOp = if isObjptr then Operand.cast (test, Type.bits testBits) else test val (tagOp, ss) = if isEnum then (tagOp, []) else let val mask = Operand.word (WordX.resize (WordX.max (tagSize, {signed = false}), testSize)) val (s, tagOp) = Statement.andb (tagOp, mask) in (tagOp, [s]) end val transfer = Switch (Switch.T {cases = cases, default = default, expect = NONE, size = testSize, test = tagOp}) in (ss, transfer) end end val genCase = Trace.trace ("PackedRepresentation.Small.genCase", fn (s, {test, ...}) => Layout.tuple [layout s, Layout.record [("test", Operand.layout test)]], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) genCase end structure TyconRep = struct datatype t = One of {con: Con.t, tupleRep: TupleRep.t} | Objptrs of Objptrs.t | Small of Small.t | SmallAndBox of {box: {con: Con.t, objptr: ObjptrRep.t}, rep: Rep.t, small: Small.t} | SmallAndObjptr of {objptr: {component: Component.t, con: Con.t}, rep: Rep.t, small: Small.t} | SmallAndObjptrs of {objptrs: Objptrs.t, rep: Rep.t, small: Small.t} | Unit fun layout (r: t): Layout.t = let open Layout in case r of One {con, tupleRep} => seq [str "One ", record [("con", Con.layout con), ("tupleRep", TupleRep.layout tupleRep)]] | Objptrs ps => seq [str "Objptrs ", Objptrs.layout ps] | Small s => seq [str "Small ", Small.layout s] | SmallAndBox {box = {con, objptr}, rep, small} => seq [str "SmallAndBox ", record [("box", record [("con", Con.layout con), ("objptr", ObjptrRep.layout objptr)]), ("rep", Rep.layout rep), ("small", Small.layout small)]] | SmallAndObjptr {objptr = {component, con}, rep, small} => seq [str "SmallAndObjptr ", record [("objptr", record [("component", Component.layout component), ("con", Con.layout con)]), ("rep", Rep.layout rep), ("small", Small.layout small)]] | SmallAndObjptrs {objptrs, rep, small} => seq [str "SmallAndObjptrs ", record [("objptrs", Objptrs.layout objptrs), ("rep", Rep.layout rep), ("small", Small.layout small)]] | Unit => str "Unit" end val bool = Small Small.bool val unit = Unit val rep: t -> Rep.t = fn One {tupleRep, ...} => TupleRep.rep tupleRep | Objptrs p => Objptrs.rep p | Small s => Small.rep s | SmallAndBox {rep, ...} => rep | SmallAndObjptr {rep, ...} => rep | SmallAndObjptrs {rep, ...} => rep | Unit => Rep.unit fun equals (r, r') = Rep.equals (rep r, rep r') val objptrBytes = Runtime.objptrSize val objptrBits = Promise.lazy (fn () => Bytes.toBits (objptrBytes ())) val objptrBitsAsInt = Promise.lazy (fn () => Bits.toInt (objptrBits ())) local val aWithout = Promise.lazy (fn () => Array.tabulate (objptrBitsAsInt () + 1, fn i => IntInf.pow (2, i))) (* If there is an objptr, then multiply the number of tags by * 3/4 to remove all the tags that have 00 as their low bits. *) val aWith = Promise.lazy (fn () => Array.tabulate (objptrBitsAsInt () + 1, fn i => (Array.sub (aWithout (), i) * 3) div 4)) in fun numTagsAvailable {tagBits: int, withObjptr: bool} = let val a = if withObjptr then aWith () else aWithout () in Array.sub (a, tagBits) end val numTagsAvailable = Trace.trace ("PackedRepresentation.TyconRep.numTagsAvailable", fn {tagBits, withObjptr} => Layout.record [("tagBits", Int.layout tagBits), ("withObjptr", Bool.layout withObjptr)], IntInf.layout) numTagsAvailable fun tagBitsNeeded {numVariants: int, withObjptr: bool}: Bits.t = let val numVariants = Int.toIntInf numVariants val a = if withObjptr then aWith () else aWithout () in case (BinarySearch.smallest (a, fn numTags => numVariants <= numTags)) of NONE => Error.bug "PackedRepresentation.TyconRep.tagBitsNeeded" | SOME i => Bits.fromInt i end val tagBitsNeeded = Trace.trace ("PackedRepresentation.TyconRep.tagBitsNeeded", fn {numVariants, withObjptr} => Layout.record [("numVariants", Int.layout numVariants), ("withObjptr", Bool.layout withObjptr)], Bits.layout) tagBitsNeeded end fun make (variants: {args: {isMutable: bool, rep: Rep.t, ty: S.Type.t} vector, con: Con.t, objptrTycon: ObjptrTycon.t} vector) : t * {con: Con.t, rep: ConRep.t} vector = if 0 = Vector.length variants then (Unit, Vector.new0 ()) else if 1 = Vector.length variants then let val {args, con, objptrTycon} = Vector.sub (variants, 0) val tupleRep = TupleRep.make (objptrTycon, args, {forceBox = false, isSequence = false}) val conRep = ConRep.Tuple tupleRep in (One {con = con, tupleRep = tupleRep}, Vector.new1 {con = con, rep = conRep}) end else if (2 = Vector.length variants andalso let val c = #con (Vector.first variants) in Con.equals (c, Con.falsee) orelse Con.equals (c, Con.truee) end) then (bool, Vector.new2 ({con = Con.falsee, rep = ConRep.falsee}, {con = Con.truee, rep = ConRep.truee})) else let val numSmall : IntInf.t ref = ref 0 val small = Array.array (objptrBitsAsInt (), []) val big = ref [] val () = Vector.foreach (variants, fn {args, con, objptrTycon} => let val tr = TupleRep.make (objptrTycon, args, {forceBox = false, isSequence = false}) fun makeBig () = List.push (big, {con = con, objptrTycon = objptrTycon, tupleRep = tr}) val Rep.T {rep, ty} = TupleRep.rep tr in case rep of Rep.NonObjptr => let val i = Bits.toInt (Type.width ty) in if i >= objptrBitsAsInt () then makeBig () else let val {component, selects} = case tr of TupleRep.Direct z => z | TupleRep.Indirect _ => Error.bug "PackedRepresentation.TyconRep.make: small Indirect" val () = IntInf.inc numSmall val () = Array.update (small, i, {component = component, con = con, objptrTycon = objptrTycon, selects = selects} :: Array.sub (small, i)) in () end end | Rep.Objptr _ => makeBig () end) val big = !big val numSmall = !numSmall fun noLargerThan (i, ac) = if i < 0 then ac else (noLargerThan (i - 1, List.fold (Array.sub (small, i), ac, op ::))) (* Box as few things as possible so that the number of tags available * is >= the number of unboxed variants. *) fun loop (maxSmallWidth: int, forced, withObjptr: bool, numSmall: IntInf.t) = if 0 = numSmall then (maxSmallWidth, forced, []) else let val vs = Array.sub (small, maxSmallWidth) in if List.isEmpty vs then loop (maxSmallWidth - 1, forced, withObjptr, numSmall) else let val numTags = numTagsAvailable {tagBits = objptrBitsAsInt () - maxSmallWidth, withObjptr = withObjptr} in if numSmall <= numTags then (* There are enough tag bits available. *) (maxSmallWidth, forced, noLargerThan (maxSmallWidth - 1, vs)) else let val z = Int.toIntInf (List.length vs) val remaining = numSmall - z in if remaining <= numTags then let val (front, back) = List.splitAt (vs, IntInf.toInt (numSmall - numTags)) in (maxSmallWidth, List.append (front, forced), noLargerThan (maxSmallWidth - 1, back)) end else loop (maxSmallWidth - 1, vs @ forced, true, remaining) end end end val (maxSmallWidth, forced, small) = loop (objptrBitsAsInt () - 1, [], not (List.isEmpty big), numSmall) val maxSmallWidth = Bits.fromInt maxSmallWidth val withObjptr = not (List.isEmpty big andalso List.isEmpty forced) (* ShiftAndTag all the small. *) val (small: Small.t option, smallReps) = let val numSmall = List.length small in if 0 = numSmall then (NONE, Vector.new0 ()) else let val tagBits = tagBitsNeeded {numVariants = numSmall, withObjptr = withObjptr} val r = ref 0w0 fun getTag (): IntInf.t = let val w = !r val w = if withObjptr andalso 0w0 = Word.andb (w, 0w3) then w + 0w1 else w val () = r := w + 0w1 in Word.toIntInf w end val small = Vector.fromListMap (small, fn {component, con, selects, ...} => let val tag = WordX.fromIntInf (getTag (), WordSize.fromBits tagBits) val isUnit = Type.isUnit (Component.ty component) val component = Component.padToWidth (component, maxSmallWidth) val selects = Selects.lshift (selects, tagBits) val ty = Type.seq (Vector.new2 (Type.ofWordX tag, Component.ty component)) val ty = if withObjptr then Type.resize (ty, objptrBits ()) else Type.padToPrim ty in {component = component, con = con, isUnit = isUnit, selects = selects, tag = tag, ty = ty} end) val ty = Type.sum (Vector.map (small, #ty)) val rep = Rep.T {rep = Rep.NonObjptr, ty = ty} val reps = Vector.map (small, fn {component, con, isUnit, selects, tag, ty, ...} => {con = con, rep = if isUnit then ConRep.Tag {tag = tag, ty = ty} else (ConRep.ShiftAndTag {component = component, selects = selects, tag = tag, ty = ty})}) val isEnum = Vector.forall (reps, fn {rep, ...} => case rep of ConRep.Tag _ => true | _ => false) in (SOME (Small.T {isEnum = isEnum, rep = rep, tagBits = tagBits, variants = Vector.map (reps, #con)}), reps) end end fun makeSmallObjptr {component, con, objptrTycon, selects} = {con = con, objptr = (ObjptrRep.box (Component.padToWidth (component, objptrBits ()), objptrTycon, selects))} fun makeBigObjptr {con, objptrTycon, tupleRep} = let val objptr = case tupleRep of TupleRep.Direct {component, selects} => ObjptrRep.box (component, objptrTycon, selects) | TupleRep.Indirect p => p in {con = con, objptr = objptr} end fun sumWithSmall (r: Rep.t): Rep.t = Rep.T {rep = Rep.Objptr {endsIn00 = false}, ty = Type.sum (Vector.new2 (Rep.ty r, Rep.ty (Small.rep (valOf small))))} fun box () = let val objptrs = Vector.concat [Vector.fromListMap (forced, makeSmallObjptr), Vector.fromListMap (big, makeBigObjptr)] val sumRep = if 1 = Vector.length objptrs then let val objptr = Vector.first objptrs val small = valOf small val rep = sumWithSmall (ObjptrRep.rep (#objptr objptr)) in SmallAndBox {box = objptr, rep = rep, small = small} end else let val ty = Type.sum (Vector.map (objptrs, ObjptrRep.ty o #objptr)) val objptrs = Objptrs.make {rep = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = ty}, variants = objptrs} in case small of NONE => Objptrs objptrs | SOME small => SmallAndObjptrs {objptrs = objptrs, rep = sumWithSmall (Objptrs.rep objptrs), small = small} end in (sumRep, Vector.map (objptrs, fn {con, objptr} => {con = con, rep = ConRep.box objptr})) end val (sumRep, objptrReps) = case (forced, big) of ([], []) => (Small (valOf small), Vector.new0 ()) | ([], [{con, tupleRep, ...}]) => (* If there is only one big and it is an objptr that * ends in 00, then there is no need to box it. *) (case tupleRep of TupleRep.Direct {component, ...} => let val rep = TupleRep.rep tupleRep in if Rep.isObjptrEndingIn00 rep then let val small = valOf small in (SmallAndObjptr {objptr = {component = component, con = con}, rep = sumWithSmall rep, small = small}, Vector.new1 {con = con, rep = ConRep.Tuple tupleRep}) end else box () end | _ => box ()) | _ => box () in (sumRep, Vector.concat [smallReps, objptrReps]) end val make = Trace.trace ("PackedRepresentation.TyconRep.make", Vector.layout (fn {args, con, ...} => Layout.record [("args", Vector.layout (Rep.layout o #rep) args), ("con", Con.layout con)]), Layout.tuple2 (layout, Vector.layout (fn {con, rep} => Layout.record [("con", Con.layout con), ("rep", ConRep.layout rep)]))) make fun genCase (r: t, {cases: Cases.t, conRep: Con.t -> ConRep.t, default: Label.t option, test: unit -> Operand.t}) : Statement.t list * Transfer.t * Block.t list = let val (statements, transfer) = case r of One {con, ...} => (case (Vector.length cases, default) of (1, _) => (* Use _ instead of NONE for the default becuase * there may be an unreachable default case. *) let val {con = c, dst, dstHasArg} = Vector.first cases in if not (Con.equals (c, con)) then Error.bug "PackedRepresentation.genCase: One" else ([], Goto {args = (if dstHasArg then Vector.new1 (test ()) else Vector.new0 ()), dst = dst}) end | (0, SOME l) => ([], Goto {dst = l, args = Vector.new0 ()}) | _ => Error.bug "PackedRepresentation.genCase: One,prim datatype with more than one case") | Objptrs ps => Objptrs.genCase (ps, {cases = cases, conRep = conRep, default = default, test = test ()}) | Small s => Small.genCase (s, {cases = cases, conRep = conRep, isObjptr = false, notSmall = NONE, smallDefault = default, test = test ()}) | SmallAndBox {box = {con, objptr}, small, ...} => let val notSmall = case Vector.peek (cases, fn {con = c, ...} => Con.equals (c, con)) of NONE => default | SOME {dst, dstHasArg, ...} => let val test = Operand.cast (test (), ObjptrRep.ty objptr) in SOME (Block.new {statements = Vector.new0 (), transfer = Goto {args = (if dstHasArg then Vector.new1 test else Vector.new0 ()), dst = dst}}) end in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = notSmall, smallDefault = default, test = test ()}) end | SmallAndObjptr {objptr = {component, con}, small, ...} => let val notSmall = case Vector.peek (cases, fn {con = c, ...} => Con.equals (c, con)) of NONE => default | SOME {dst, dstHasArg, ...} => let val args = if dstHasArg then (Vector.new1 (Operand.cast (test (), Component.ty component))) else Vector.new0 () in SOME (Block.new {statements = Vector.new0 (), transfer = Goto {args = args, dst = dst}}) end in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = notSmall, smallDefault = default, test = test ()}) end | SmallAndObjptrs {objptrs, small, ...} => let val test = test () val (ss, t) = Objptrs.genCase (objptrs, {cases = cases, conRep = conRep, default = default, test = (Operand.cast (test, Objptrs.ty objptrs))}) val objptr = Block.new {statements = Vector.fromList ss, transfer = t} in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = SOME objptr, smallDefault = default, test = test}) end | Unit => Error.bug "PackedRepresentation.TyconRep.genCase: Unit" in (statements, transfer, Block.getExtra ()) end val genCase = Trace.trace ("PackedRepresentation.TyconRep.genCase", fn (r, {cases, default, ...}) => Layout.tuple [layout r, Layout.record [("cases", Cases.layout cases), ("default", Option.layout Label.layout default)]], Layout.tuple3 (List.layout Statement.layout, Transfer.layout, List.layout Block.layout)) genCase end structure Value: sig type 'a t val affect: 'a t * 'b t -> unit val constant: 'a -> 'a t val fixedPoint: unit -> unit val get: 'a t -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t val new: {compute: unit -> 'a, equals: 'a * 'a -> bool, init: 'a} -> 'a t end = struct structure Dep = struct datatype t = T of {affects: t list ref, compute: unit -> {change: bool}, needToCompute: bool ref} (* A list of all ts such that !needToCompute = true. *) val todo: t list ref = ref [] fun recompute (me as T {needToCompute, ...}) = if !needToCompute then () else (List.push (todo, me) ; needToCompute := true) fun fixedPoint () = case !todo of [] => () | T {affects, compute, needToCompute, ...} :: l => let val () = todo := l val () = needToCompute := false val {change} = compute () val () = if change then List.foreach (!affects, recompute) else () in fixedPoint () end fun affect (T {affects, ...}, z) = List.push (affects, z) fun new {compute: unit -> 'a, equals: 'a * 'a -> bool, init: 'a}: t * 'a ref = let val r: 'a ref = ref init val affects = ref [] val compute = fn () => let val old = !r val new = compute () val () = r := new in {change = not (equals (old, new))} end val me = T {affects = affects, compute = compute, needToCompute = ref false} val () = recompute me in (me, r) end end datatype 'a t = Constant of 'a | Variable of Dep.t * 'a ref val get = fn Constant a => a | Variable (_, r) => !r fun layout l v = l (get v) val constant = Constant fun new z = Variable (Dep.new z) val affect = fn (Variable (d, _), Variable (d', _)) => Dep.affect (d, d') | (Constant _, _) => () | (_, Constant _) => Error.bug "PackedRepresentation.Value.affect: Constant" val fixedPoint = Dep.fixedPoint end fun compute (program as Ssa2.Program.T {datatypes, ...}) = let type tyconRepAndCons = (TyconRep.t * {con: Con.t, rep: ConRep.t} vector) Value.t val {get = conInfo: Con.t -> {rep: ConRep.t ref, tyconRep: tyconRepAndCons}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("info", Con.layout)) val {get = tupleRep: S.Type.t -> TupleRep.t Value.t, set = setTupleRep, ...} = Property.getSetOnce (S.Type.plist, Property.initRaise ("tupleRep", S.Type.layout)) val setTupleRep = Trace.trace ("PackedRepresentation.setTupleRep", S.Type.layout o #1, Layout.ignore) setTupleRep fun sequenceRep (t: S.Type.t): TupleRep.t = Value.get (tupleRep t) fun setSequenceRep (t: S.Type.t, tr: TupleRep.t): unit = setTupleRep (t, Value.new {compute = fn () => tr, equals = TupleRep.equals, init = tr}) val setSequenceRep = Trace.trace2 ("PackedRepresentation.setSequenceRep", S.Type.layout, TupleRep.layout, Unit.layout) setSequenceRep val {get = tyconRep: Tycon.t -> tyconRepAndCons, set = setTyconRep, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconRep", Tycon.layout)) (* Initialize the datatypes. *) val typeRepRef = ref (fn _ => Error.bug "PackedRepresentation.typeRep") fun typeRep t = !typeRepRef t val datatypes = Vector.map (datatypes, fn S.Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {args, con} => {args = args, con = con, objptrTycon = ObjptrTycon.new ()}) fun compute () = let val (tr, cons) = TyconRep.make (Vector.map (cons, fn {args, con, objptrTycon} => {args = Vector.map (Prod.dest args, fn {elt, isMutable} => {isMutable = isMutable, rep = Value.get (typeRep elt), ty = elt}), con = con, objptrTycon = objptrTycon})) val () = Vector.foreach (cons, fn {con, rep} => #rep (conInfo con) := rep) in (tr, cons) end fun equals ((r, v), (r', v')) = TyconRep.equals (r, r') andalso Vector.equals (v, v', fn ({con = c, rep = r}, {con = c', rep = r'}) => Con.equals (c, c') andalso ConRep.equals (r, r')) val rep = Value.new {compute = compute, equals = equals, init = (TyconRep.unit, Vector.new0 ())} val () = setTyconRep (tycon, rep) val () = Vector.foreach (cons, fn {con, ...} => setConInfo (con, {rep = ref ConRep.unit, tyconRep = rep})) in {cons = cons, rep = rep, tycon = tycon} end) val delayedObjectTypes : (unit -> (ObjptrTycon.t * ObjectType.t) option) list ref = ref [] val {get = typeRep: S.Type.t -> Rep.t Value.t, ...} = Property.get (S.Type.plist, Property.initRec (fn (t, typeRep: S.Type.t -> Rep.t Value.t) => let val constant = Value.constant val nonObjptr = constant o Rep.nonObjptr datatype z = datatype S.Type.dest in case S.Type.dest t of CPointer => nonObjptr (Type.cpointer ()) | Datatype tycon => let val r = tyconRep tycon fun compute () = TyconRep.rep (#1 (Value.get r)) val r' = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (r, r') in r' end | IntInf => constant (Rep.T {rep = Rep.Objptr {endsIn00 = false}, ty = Type.intInf ()}) | Object {args, con} => (case con of ObjectCon.Con con => let val {rep, tyconRep} = conInfo con fun compute () = ConRep.rep (!rep) val r = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (tyconRep, r) in r end | ObjectCon.Sequence => let val hasIdentity = Prod.someIsMutable args val args = Prod.dest args fun tupleRep opt = let val tr = TupleRep.make (opt, Vector.map (args, fn {elt, isMutable} => {isMutable = isMutable, rep = Value.get (typeRep elt), ty = elt}), {forceBox = true, isSequence = true}) val () = setSequenceRep (t, tr) in tr end fun now opt = (ignore (tupleRep opt); opt) fun delay () = let val opt = ObjptrTycon.new () val () = List.push (delayedObjectTypes, fn () => let (* Delay computing tupleRep until the * delayedObjectTypes are computed * because the sequence component types * may not be known yet. *) val tr = tupleRep opt val components = case tr of TupleRep.Direct _ => Prod.new1Mutable (TupleRep.ty tr) | TupleRep.Indirect opr => ObjptrRep.mkObjectTypeComponents opr in SOME (opt, ObjectType.Sequence {components = components, hasIdentity = hasIdentity}) end) in opt end val opt = if 1 <> Vector.length args then delay () else let val {elt, isMutable, ...} = Vector.sub (args, 0) in if isMutable then delay () else (case S.Type.dest elt of S.Type.Word s => if isSome (WordSize.primOpt s) then now (ObjptrTycon.wordVector s) else delay () | S.Type.Real s => now (ObjptrTycon.realVector s) | _ => delay ()) end in constant (Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.objptr opt}) end | ObjectCon.Tuple => let val opt = ObjptrTycon.new () val rs = Vector.map (Prod.dest args, typeRep o #elt) fun compute () = TupleRep.make (opt, Vector.map2 (rs, Prod.dest args, fn (r, {elt, isMutable}) => {isMutable = isMutable, rep = Value.get r, ty = elt}), {forceBox = false, isSequence = false}) val tr = Value.new {compute = compute, equals = TupleRep.equals, init = TupleRep.unit} val () = Vector.foreach (rs, fn r => Value.affect (r, tr)) val hasIdentity = Prod.someIsMutable args val () = List.push (delayedObjectTypes, fn () => case Value.get tr of TupleRep.Indirect opr => SOME (opt, (ObjectType.Normal {components = ObjptrRep.mkObjectTypeComponents opr, hasIdentity = hasIdentity})) | _ => NONE) val () = setTupleRep (t, tr) fun compute () = TupleRep.rep (Value.get tr) val r = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (tr, r) in r end) | Real s => nonObjptr (Type.real s) | Thread => constant (Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.thread ()}) | Weak t => let val opt = ObjptrTycon.new () val rep = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.objptr opt} val r = typeRep t fun compute () = if Rep.isObjptr (Value.get r) then rep else Rep.unit val r' = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (r, r') val () = List.push (delayedObjectTypes, fn () => let val r = Value.get r in if Rep.isObjptr r then SOME (opt, ObjectType.Weak (SOME (Rep.ty r))) else NONE end) in r' end | Word s => nonObjptr (Type.word s) end)) val () = typeRepRef := typeRep val _ = typeRep (S.Type.vector1 (S.Type.word WordSize.byte)) (* Establish dependence between constructor argument type representations * and tycon representations. *) val () = Vector.foreach (datatypes, fn {cons, rep, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (Prod.dest args, fn {elt, ...} => Value.affect (typeRep elt, rep)))) val typeRep = Trace.trace ("PackedRepresentation.typeRep", S.Type.layout, Value.layout Rep.layout) typeRep val () = S.Program.foreachVar (program, fn (_, t) => ignore (typeRep t)) val () = Value.fixedPoint () val conRep = ! o #rep o conInfo val tyconRep = #1 o Value.get o tyconRep val objectTypes = Vector.fold (datatypes, [], fn ({cons, ...}, ac) => Vector.fold (cons, ac, fn ({args, con, objptrTycon, ...}, ac) => case conRep con of ConRep.Tuple (TupleRep.Indirect opr) => (objptrTycon, ObjectType.Normal {components = ObjptrRep.mkObjectTypeComponents opr, hasIdentity = Prod.someIsMutable args}) :: ac | _ => ac)) val objectTypes = ref objectTypes val () = List.foreach (!delayedObjectTypes, fn f => Option.app (f (), fn z => List.push (objectTypes, z))) val objectTypes = Vector.fromList (!objectTypes) fun diagnostic () = Control.diagnostics (fn display => (display (Layout.str "Representations:") ; (Vector.foreach (datatypes, fn {cons, tycon, ...} => let open Layout in display (seq [Tycon.layout tycon, str " ", TyconRep.layout (tyconRep tycon)]) ; display (indent (Vector.layout (fn {con, ...} => record [("con", Con.layout con), ("rep", ConRep.layout (conRep con))]) cons, 2)) end)))) fun toRtype (t: S.Type.t): Type.t option = let val ty = Rep.ty (Value.get (typeRep t)) in if Type.isUnit ty then NONE else SOME (Type.padToPrim ty) end fun makeSrc (v, oper) {index} = oper (Vector.sub (v, index)) fun genCase {cases, default, test, tycon} = TyconRep.genCase (tyconRep tycon, {cases = cases, conRep = conRep, default = default, test = test}) val tupleRep = Value.get o tupleRep val tupleRep = Trace.trace ("PackedRepresentation.tupleRep", S.Type.layout, TupleRep.layout) tupleRep fun object {args, con, dst, objectTy, oper} = let val src = makeSrc (args, oper) in case con of NONE => TupleRep.tuple (tupleRep objectTy, {dst = dst, src = src}) | SOME con => ConRep.conApp (conRep con, {dst = dst, src = src}) end fun sequence {args, dst = (dst, _), sequenceTy, oper} = let val src = Vector.map (args, fn args => makeSrc (args, oper)) in case sequenceRep sequenceTy of TupleRep.Indirect pr => ObjptrRep.sequence (pr, {dst = dst, src = src}) | _ => Error.bug "PackedRepresentation.sequence: non-Indirect" end fun getSelects (con, objectTy) = let datatype z = datatype ObjectCon.t in case con of Con con => (case conRep con of ConRep.ShiftAndTag {selects, ...} => (selects, NONE) | ConRep.Tuple tr => (TupleRep.selects tr, NONE) | _ => Error.bug "PackedRepresentation.getSelects: Con,non-select") | Sequence => (case sequenceRep objectTy of tr as TupleRep.Indirect pr => (TupleRep.selects tr, SOME (ObjptrRep.componentsSize pr)) | _ => Error.bug "PackedRepresentation.getSelects: Sequence,non-Indirect") | Tuple => (TupleRep.selects (tupleRep objectTy), NONE) end fun select {base, baseTy, dst, offset} = case S.Type.dest baseTy of S.Type.Object {con, ...} => let val (ss, eltWidth) = getSelects (con, baseTy) in Selects.select (ss, {base = base, eltWidth = eltWidth, dst = dst, offset = offset}) end | _ => Error.bug "PackedRepresentation.select: non-object" fun update {base, baseTy, offset, value} = case S.Type.dest baseTy of S.Type.Object {con, ...} => let val (ss, eltWidth) = getSelects (con, baseTy) in Selects.update (ss, {base = base, eltWidth = eltWidth, offset = offset, value = value}) end | _ => Error.bug "PackedRepresentation.update: non-object" in {diagnostic = diagnostic, genCase = genCase, object = object, objectTypes = objectTypes, select = select, sequence = sequence, toRtype = toRtype, update = update} end end mlton-20210117+dfsg/mlton/backend/parallel-move.fun000066400000000000000000000052161416264345000220240ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ParallelMove (S: PARALLEL_MOVE_STRUCTS): PARALLEL_MOVE = struct open S fun ('temporary, 'statement) move {moves, equals, move, interfere, temp} : 'statement list = let val mvs = List.fold (moves, [], fn (mv as {src, dst}, mvs) => if equals (src, dst) then mvs else mv :: mvs) fun loopTop (mvs, moves) = loop (mvs, [], moves, false) and loop (mvs, hard, moves, changed) = case mvs of [] => (case hard of [] => List.rev moves | {src, dst} :: hard' => if changed then loopTop (hard, moves) else let val (hard, moves) = List.fold (hard', ([], moves), fn (mv as {src = s, dst = d}, (hard, moves)) => if interfere (dst, s) then let val temp = temp s in ({src = temp, dst = d} :: hard, case move {dst = temp, src = s} of NONE => moves | SOME move => move :: moves) end else (mv :: hard, moves)) val moves = case move {src = src, dst = dst} of NONE => moves | SOME move => move :: moves in loopTop (hard, moves) end) | (mv as {src, dst}) :: mvs => let fun isHard l = List.exists (l, fn {src, dst = _} => interfere (dst, src)) in if isHard mvs orelse isHard hard then loop (mvs, mv :: hard, moves, changed) else loop (mvs, hard, case move {src = src, dst = dst} of NONE => moves | SOME move => move :: moves, true) end in loopTop (mvs, []) end end mlton-20210117+dfsg/mlton/backend/parallel-move.sig000066400000000000000000000021621416264345000220130ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PARALLEL_MOVE_STRUCTS = sig end signature PARALLEL_MOVE = sig include PARALLEL_MOVE_STRUCTS (* Allows overlapping froms and tos. * Hence, has to be careful to use * additional working temporaries . *) val move: { (* Are two temporaries the same. *) equals: 'temporary * 'temporary -> bool, (* How to create a move statement. *) move: {src: 'temporary, dst: 'temporary} -> 'statement option, (* The moves to occur. *) moves: {src: 'temporary, dst: 'temporary} list, (* Would writing the write invalidate the read? *) interfere: 'temporary * 'temporary -> bool, (* Return a new temporary like input temporary. *) temp: 'temporary -> 'temporary } -> 'statement list end mlton-20210117+dfsg/mlton/backend/rep-type.fun000066400000000000000000001124511416264345000210310ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2014,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RepType (S: REP_TYPE_STRUCTS): REP_TYPE = struct open S structure CFunction = CFunction structure Type = struct datatype t = T of {node: node, width: Bits.t} and node = Bits | CPointer | Label of Label.t | Objptr of ObjptrTycon.t vector | Real of RealSize.t | Seq of t vector | Word of WordSize.t local fun make f (T r) = f r in val node = make #node val width = make #width end val bytes: t -> Bytes.t = Bits.toBytes o width val rec layout: t -> Layout.t = fn t => let open Layout in case node t of Bits => str (concat ["Bits", Bits.toString (width t)]) | CPointer => str "CPointer" | Label l => seq [str "Label ", Label.layout l] | Objptr opts => seq [str "Objptr ", tuple (Vector.toListMap (opts, ObjptrTycon.layout))] | Real s => str (concat ["Real", RealSize.toString s]) | Seq ts => List.layout layout (Vector.toList ts) | Word s => str (concat ["Word", WordSize.toString s]) end val rec equals: t * t -> bool = fn (t, t') => Bits.equals (width t, width t') andalso (case (node t, node t') of (Bits, Bits) => true | (CPointer, CPointer) => true | (Label l, Label l') => Label.equals (l, l') | (Objptr opts, Objptr opts') => Vector.equals (opts, opts', ObjptrTycon.equals) | (Real s, Real s') => RealSize.equals (s, s') | (Seq ts, Seq ts') => Vector.equals (ts, ts', equals) | (Word s, Word s') => WordSize.equals (s, s') | _ => false) val sameWidth: t * t -> bool = fn (t, t') => Bits.equals (width t, width t') val bits: Bits.t -> t = fn width => T {node = Bits, width = width} val cpointer: unit -> t = fn () => T {node = CPointer, width = WordSize.bits (WordSize.cpointer ())} val label: Label.t -> t = fn l => T {node = Label l, width = WordSize.bits (WordSize.cpointer ())} val objptr: ObjptrTycon.t -> t = fn opt => T {node = Objptr (Vector.new1 opt), width = WordSize.bits (WordSize.objptr ())} val real: RealSize.t -> t = fn s => T {node = Real s, width = RealSize.bits s} val word: WordSize.t -> t = fn s => T {node = Word s, width = WordSize.bits s} val bool: t = word WordSize.bool val cint: unit -> t = word o WordSize.cint val compareRes = word WordSize.compareRes val cptrdiff: unit -> t = word o WordSize.cptrdiff val csize: unit -> t = word o WordSize.csize val exnStack: unit -> t = cptrdiff val gcState: unit -> t = cpointer local val b = Random.word () val cpointer = Random.word () val label = Random.word () val objptr = Random.word () in fun hash (T {node, width}) = case node of Bits => Hash.combine (b, Bits.toWord width) | CPointer => cpointer | Label l => Hash.combine (label, Label.hash l) | Objptr os => Hash.combine (objptr, Hash.vectorMap (os, ObjptrTycon.hash)) | Real rs => RealSize.hash rs | Seq ts => Hash.vectorMap (ts, hash) | Word ws => WordSize.hash ws end val objptrHeader: unit -> t = word o WordSize.objptrHeader val seqIndex: unit -> t = word o WordSize.seqIndex val shiftArg: t = word WordSize.shiftArg val stack : unit -> t = fn () => objptr ObjptrTycon.stack val thread : unit -> t = fn () => objptr ObjptrTycon.thread val word0: t = bits Bits.zero val word8: t = word WordSize.word8 val word32: t = word WordSize.word32 val wordVector: WordSize.t -> t = objptr o ObjptrTycon.wordVector val word8Vector: unit -> t = fn () => wordVector WordSize.word8 val string: unit -> t = word8Vector val unit: t = bits Bits.zero val zero: Bits.t -> t = bits val ofRealX: RealX.t -> t = fn r => real (RealX.size r) val ofWordX: WordX.t -> t = fn w => word (WordX.size w) fun ofWordXVector (v: WordXVector.t): t = wordVector (WordXVector.elementSize v) val seq: t vector -> t = fn ts => if Vector.isEmpty ts then unit else let fun seqOnto (ts, ac) = Vector.foldr (ts, ac, fn (t, ac) => if Bits.equals (width t, Bits.zero) then ac else (case node t of Seq ts => seqOnto (ts, ac) | _ => (case ac of [] => [t] | t' :: ac' => (case (node t, node t') of (Bits, Bits) => bits (Bits.+ (width t, width t')) :: ac' | _ => t :: ac)))) in case seqOnto (ts, []) of [] => word0 | [t] => t | ts => let val ts = Vector.fromList ts in T {node = Seq ts, width = Vector.fold (ts, Bits.zero, fn (t, ac) => Bits.+ (ac, width t))} end end val seq = Trace.trace ("RepType.Type.seq", Vector.layout layout, layout) seq val sum: t vector -> t = fn ts => if Vector.isEmpty ts then Error.bug "RepType.Type.sum: empty" else let val opts = Vector.concatV (Vector.keepAllMap (ts, fn t => case node t of Objptr opts => SOME opts | _ => NONE)) in if Vector.isEmpty opts then Vector.first ts else T {node = (Objptr (QuickSort.sortVector (opts, ObjptrTycon.<=))), width = WordSize.bits (WordSize.objptr ())} end val sum = Trace.trace ("RepType.Type.sum", Vector.layout layout, layout) sum val intInf: unit -> t = fn () => sum (Vector.new2 (wordVector (WordSize.bigIntInfWord ()), seq (Vector.new2 (bits Bits.one, word (WordSize.fromBits (Bits.- (WordSize.bits (WordSize.smallIntInfWord ()), Bits.one))))))) fun ofConst (c: Const.t): t = let datatype z = datatype Const.t in case c of CSymbol _ => cpointer () | IntInf _ => intInf () | Null => cpointer () | Real r => ofRealX r | Word w => ofWordX w | WordVector v => ofWordXVector v end val deLabel: t -> Label.t option = fn t => case node t of Label l => SOME l | _ => NONE val deObjptr: t -> ObjptrTycon.t option = fn t => case node t of Objptr opts => if 1 = Vector.length opts then SOME (Vector.first opts) else NONE | _ => NONE val deObjptrs: t -> ObjptrTycon.t vector option = fn t => case node t of Objptr opts => SOME opts | _ => NONE val deReal: t -> RealSize.t option = fn t => case node t of Real s => SOME s | _ => NONE val deSeq: t -> t vector option = fn t => case node t of Seq v => SOME v | _ => NONE val deWord: t -> WordSize.t option = fn t => case node t of Word s => SOME s | _ => NONE val isCPointer: t -> bool = fn t => case node t of CPointer => true | _ => false val isObjptr: t -> bool = fn t => case node t of Objptr _ => true | _ => false val isUnit: t -> bool = fn t => Bits.equals (Bits.zero, width t) val isSubtype: t * t -> bool = fn (t, t') => if not (sameWidth (t, t')) then false (* Error.bug "RepType.Type.isSubtype" *) else (equals (t, t') orelse case (node t, node t') of (Objptr opts, Objptr opts') => Vector.isSubsequence (opts, opts', ObjptrTycon.equals) | (Real _, _) => false | (Bits, Objptr _) => true | (Word _, Objptr _) => true | (Seq ts, Objptr _) => Vector.forall (ts, (fn Bits => true | Real _ => true | Word _ => true | _ => false) o node) | (_, Bits) => true | (_, Word _) => true | (_, Seq ts) => Vector.forall (ts, (fn Bits => true | Real _ => true | Word _ => true | _ => false) o node) | _ => false) val isSubtype = Trace.trace2 ("RepType.Type.isSubtype", layout, layout, Bool.layout) isSubtype fun exists (t, p) = if p t then true else (case node t of Seq ts => Vector.exists (ts, fn t => exists (t, p)) | _ => false) val resize: t * Bits.t -> t = fn (_, b) => bits b val bogusWord: t -> WordX.t = fn t => WordX.one (WordSize.fromBits (width t)) local structure C = struct open CType fun fromBits (b: Bits.t): t = case Bits.toInt b of 8 => Word8 | 16 => Word16 | 32 => Word32 | 64 => Word64 | _ => Error.bug (concat ["RepType.Type.CType.fromBits: ", Bits.toString b]) end in val toCType: t -> CType.t = fn t => if isObjptr t then C.Objptr else case node t of CPointer => C.CPointer | Label _ => (case !Control.codegen of Control.Codegen.AMD64Codegen => C.CPointer | Control.Codegen.CCodegen => C.fromBits (width t) | Control.Codegen.LLVMCodegen => C.fromBits (width t) | Control.Codegen.X86Codegen => C.CPointer) | Real s => (case s of RealSize.R32 => C.Real32 | RealSize.R64 => C.Real64) | _ => C.fromBits (width t) val name = C.name o toCType val align: t * Bytes.t -> Bytes.t = fn (t, n) => C.align (toCType t, n) end end structure ObjectType = struct structure Prod = Prod structure ObjptrTycon = ObjptrTycon structure Runtime = Runtime type ty = Type.t datatype t = Normal of {components: ty Prod.t, hasIdentity: bool} | Sequence of {components: ty Prod.t, hasIdentity: bool} | Stack | Weak of Type.t option fun deNormal t = case t of Normal {components, hasIdentity} => {components = components, hasIdentity = hasIdentity} | _ => Error.bug "ObjectType.deNormal" fun deSequence t = case t of Sequence {components, hasIdentity} => {components = components, hasIdentity = hasIdentity} | _ => Error.bug "ObjectType.deSequence" fun components t = case t of Normal {components, ...} => components | Sequence {components, ...} => components | _ => Error.bug "ObjectType.components" fun componentsSize t = Prod.fold (components t, Bytes.zero, fn (ty, b) => Bytes.+ (b, Type.bytes ty)) fun layout (t: t) = let open Layout in case t of Normal {components, hasIdentity} => seq [str "Normal ", record [("components", Prod.layout (components, Type.layout)), ("hasIdentity", Bool.layout hasIdentity)]] | Sequence {components, hasIdentity} => seq [str "Sequence ", record [("components", Prod.layout (components, Type.layout)), ("hasIdentity", Bool.layout hasIdentity)]] | Stack => str "Stack" | Weak t => seq [str "Weak ", Option.layout Type.layout t] end fun isOk (t: t): bool = let fun componentsOk components = Exn.withEscape (fn escape => ((ignore o Prod.fold) (components, false, fn (ty, hasObjptr) => if Bits.isPrim (Type.width ty) then if Type.isObjptr ty then true else if hasObjptr then escape false else false else escape false) ; true)) in case t of Normal {components, ...} => componentsOk components andalso let val b = Prod.fold (components, Type.width (Type.objptrHeader ()), fn (ty, b) => Bits.+ (b, Type.width ty)) in case !Control.align of Control.Align4 => Bits.isWord32Aligned b | Control.Align8 => Bits.isWord64Aligned b end | Sequence {components, ...} => componentsOk components | Stack => true | Weak to => Option.fold (to, true, fn (t,_) => Type.isObjptr t) end val stack = Stack val thread = fn () => let val padding = let val align = case !Control.align of Control.Align4 => Bytes.fromInt 4 | Control.Align8 => Bytes.fromInt 8 val bytesMetaData = Bits.toBytes (Control.Target.Size.normalMetaData ()) val bytesCSize = Bits.toBytes (Control.Target.Size.csize ()) val bytesExnStack = Bits.toBytes (Type.width (Type.exnStack ())) val bytesStack = Bits.toBytes (Type.width (Type.stack ())) val bytesObject = Bytes.+ (bytesMetaData, Bytes.+ (bytesCSize, Bytes.+ (bytesExnStack, bytesStack))) val bytesTotal = Bytes.align (bytesObject, {alignment = align}) val bytesPad = Bytes.- (bytesTotal, bytesObject) in Type.bits (Bytes.toBits bytesPad) end val components = Vector.new3 (Type.csize (), Type.exnStack (), Type.stack ()) val components = Vector.map (components, fn ty => {elt = ty, isMutable = true}) val components = if Type.isUnit padding then components else Vector.concat [Vector.new1 {elt = padding, isMutable = false}, components] in Normal {components = Prod.make components, hasIdentity = true} end (* Order in the following vector matters. The basic pointer tycons must * correspond to the constants in gc/object.h. * STACK_TYPE_INDEX, * THREAD_TYPE_INDEX, * WEAK_GONE_TYPE_INDEX, * REAL32_VECTOR_TYPE_INDEX, * REAL64_VECTOR_TYPE_INDEX, * WORD8_VECTOR_TYPE_INDEX, * WORD16_VECTOR_TYPE_INDEX, * WORD32_VECTOR_TYPE_INDEX. * WORD64_VECTOR_TYPE_INDEX. *) val basic = fn () => let fun realVec rs = (ObjptrTycon.realVector rs, Sequence {components = Prod.new1Immutable (Type.real rs), hasIdentity = false}) fun wordVec ws = (ObjptrTycon.wordVector ws, Sequence {components = Prod.new1Immutable (Type.word ws), hasIdentity = false}) in Vector.fromList [(ObjptrTycon.stack, stack), (ObjptrTycon.thread, thread ()), (ObjptrTycon.weakGone, Weak NONE), realVec RealSize.R32, realVec RealSize.R64, wordVec WordSize.word8, wordVec WordSize.word32, wordVec WordSize.word16, wordVec WordSize.word64] end local structure R = Runtime.RObjectType fun componentsToBytes components = Vector.fold (components, Bytes.zero, fn ({elt = ty, isMutable = _}, b) => Bytes.+ (Type.bytes ty, b)) fun componentsToRuntime components = let val components = Prod.dest components in case Vector.peeki (components, Type.isObjptr o #elt o #2) of NONE => {bytesNonObjptrs = componentsToBytes components, numObjptrs = 0} | SOME (i, _) => {bytesNonObjptrs = componentsToBytes (Vector.prefix (components, i)), numObjptrs = Vector.length components - i} end in fun toRuntime (t: t): R.t = case t of Normal {components, hasIdentity} => let val {bytesNonObjptrs, numObjptrs} = componentsToRuntime components in R.Normal {hasIdentity = hasIdentity, bytesNonObjptrs = bytesNonObjptrs, numObjptrs = numObjptrs} end | Sequence {components, hasIdentity} => let val {bytesNonObjptrs, numObjptrs} = componentsToRuntime components in R.Sequence {hasIdentity = hasIdentity, bytesNonObjptrs = bytesNonObjptrs, numObjptrs = numObjptrs} end | Stack => R.Stack | Weak to => R.Weak {gone = Option.isNone to} end end open Type structure GCField = Runtime.GCField fun ofGCField (f: GCField.t): t = let datatype z = datatype GCField.t in case f of AtomicState => word32 | CardMapAbsolute => cpointer () | CurSourceSeqIndex => word32 | ExnStack => exnStack () | Frontier => cpointer () | Limit => cpointer () | LimitPlusSlop => cpointer () | SignalIsPending => word32 | StackBottom => cpointer () | StackLimit => cpointer () | StackTop => cpointer () end fun castIsOk {from, to, tyconTy = _} = Bits.equals (width from, width to) fun checkPrimApp {args, prim, result} = let fun done (argsP, resultP) = let val argsP = Vector.fromList argsP in (Vector.length args = Vector.length argsP) andalso (Vector.forall2 (args, argsP, fn (arg, argP) => argP arg)) andalso (case (result, resultP) of (NONE, NONE) => true | (SOME result, SOME resultP) => resultP result | _ => false) end val bits = fn s => fn t => equals (t, bits s) val bool = fn t => equals (t, bool) val cpointer = fn t => equals (t, cpointer ()) val objptr = fn t => (case node t of Objptr _ => true | _ => false) val real = fn s => fn t => equals (t, real s) val seq = fn s => fn t => (case node t of Seq _ => Bits.equals (width t, WordSize.bits s) | _ => false) val word = fn s => fn t => equals (t, word s) val cint = word (WordSize.cint ()) val csize = word (WordSize.csize ()) val cptrdiff = word (WordSize.cptrdiff ()) val shiftArg = word WordSize.shiftArg val or = fn (p1, p2) => fn t => p1 t orelse p2 t val bitsOrSeq = fn s => or (bits (WordSize.bits s), seq s) val wordOrBitsOrSeq = fn s => or (word s, bitsOrSeq s) local fun make f s = let val t = f s in done ([t], SOME t) end in val realUnary = make real val wordUnary = make wordOrBitsOrSeq end local fun make f s = let val t = f s in done ([t], SOME bool) end in val wordUnaryP = make wordOrBitsOrSeq end local fun make f s = let val t = f s in done ([t, t], SOME t) end in val realBinary = make real val wordBinary = make wordOrBitsOrSeq end local fun make f s = let val t = f s in done ([t, t], SOME bool) end in val realCompare = make real val wordBinaryP = make wordOrBitsOrSeq val wordCompare = make wordOrBitsOrSeq val objptrCompare = make (fn _ => objptr) () end fun realTernary s = done ([real s, real s, real s], SOME (real s)) fun wordShift s = done ([wordOrBitsOrSeq s, shiftArg], SOME (wordOrBitsOrSeq s)) in case prim of Prim.CFunction f => done (Vector.toListMap (CFunction.args f, fn t' => fn t => equals (t', t)), SOME (fn t => equals (t, CFunction.return f))) | Prim.CPointer_add => done ([cpointer, cptrdiff], SOME cpointer) | Prim.CPointer_diff => done ([cpointer, cpointer], SOME cptrdiff) | Prim.CPointer_equal => done ([cpointer, cpointer], SOME bool) | Prim.CPointer_fromWord => done ([csize], SOME cpointer) | Prim.CPointer_lt => done ([cpointer, cpointer], SOME bool) | Prim.CPointer_sub => done ([cpointer, cptrdiff], SOME cpointer) | Prim.CPointer_toWord => done ([cpointer], SOME csize) | Prim.MLton_touch => done ([objptr], NONE) | Prim.Real_Math_acos s => realUnary s | Prim.Real_Math_asin s => realUnary s | Prim.Real_Math_atan s => realUnary s | Prim.Real_Math_atan2 s => realBinary s | Prim.Real_Math_cos s => realUnary s | Prim.Real_Math_exp s => realUnary s | Prim.Real_Math_ln s => realUnary s | Prim.Real_Math_log10 s => realUnary s | Prim.Real_Math_sin s => realUnary s | Prim.Real_Math_sqrt s => realUnary s | Prim.Real_Math_tan s => realUnary s | Prim.Real_abs s => realUnary s | Prim.Real_add s => realBinary s | Prim.Real_castToWord (s, s') => done ([real s], SOME (word s')) | Prim.Real_div s => realBinary s | Prim.Real_equal s => realCompare s | Prim.Real_ldexp s => done ([real s, cint], SOME (real s)) | Prim.Real_le s => realCompare s | Prim.Real_lt s => realCompare s | Prim.Real_mul s => realBinary s | Prim.Real_muladd s => realTernary s | Prim.Real_mulsub s => realTernary s | Prim.Real_neg s => realUnary s | Prim.Real_qequal s => realCompare s | Prim.Real_rndToReal (s, s') => done ([real s], SOME (real s')) | Prim.Real_rndToWord (s, s', _) => done ([real s], SOME (word s')) | Prim.Real_round s => realUnary s | Prim.Real_sub s => realBinary s | Prim.Thread_returnToC => done ([], NONE) | Prim.Word_add s => wordBinary s | Prim.Word_addCheckP (s, _) => wordBinaryP s | Prim.Word_andb s => wordBinary s | Prim.Word_castToReal (s, s') => done ([word s], SOME (real s')) | Prim.Word_equal s => (wordCompare s) orelse objptrCompare | Prim.Word_extdToWord (s, s', _) => done ([wordOrBitsOrSeq s], SOME (wordOrBitsOrSeq s')) | Prim.Word_lshift s => wordShift s | Prim.Word_lt (s, _) => wordCompare s | Prim.Word_mul (s, _) => wordBinary s | Prim.Word_mulCheckP (s, _) => wordBinaryP s | Prim.Word_neg s => wordUnary s | Prim.Word_negCheckP (s, _) => wordUnaryP s | Prim.Word_notb s => wordUnary s | Prim.Word_orb s => wordBinary s | Prim.Word_quot (s, _) => wordBinary s | Prim.Word_rem (s, _) => wordBinary s | Prim.Word_rndToReal (s, s', _) => done ([word s], SOME (real s')) | Prim.Word_rol s => wordShift s | Prim.Word_ror s => wordShift s | Prim.Word_rshift (s, _) => wordShift s | Prim.Word_sub s => wordBinary s | Prim.Word_subCheckP (s, _) => wordBinaryP s | Prim.Word_xorb s => wordBinary s | _ => Error.bug (concat ["RepType.checkPrimApp got strange prim: ", Prim.toString prim]) end local fun extractTys (tys, dropBits, takeBits) = Exn.withEscape (fn escape => let fun dropTys (tys, bits) = let fun loop (tys, bits) = if Bits.equals (bits, Bits.zero) then tys else (case tys of [] => escape NONE | ty::tys => let val b = width ty in if Bits.>= (bits, b) then loop (tys, Bits.- (bits, b)) else (case node ty of Bits => (Type.bits (Bits.- (b, bits))) :: tys | _ => escape NONE) end) in if Bits.< (bits, Bits.zero) then escape NONE else loop (tys, bits) end val dropTys = Trace.trace2 ("RepType.checkOffset.dropTys", List.layout Type.layout, Bits.layout, List.layout Type.layout) dropTys fun takeTys (tys, bits) = let fun loop (tys, bits, acc) = if Bits.equals (bits, Bits.zero) then acc else (case tys of [] => escape NONE | ty::tys => let val b = width ty in if Bits.>= (bits, b) then loop (tys, Bits.- (bits, b), ty :: acc) else (case node ty of Bits => (Type.bits bits) :: acc | _ => escape NONE) end) in if Bits.< (bits, Bits.zero) then escape NONE else List.rev (loop (tys, bits, [])) end val takeTys = Trace.trace2 ("RepType.checkOffset.takeTys", List.layout Type.layout, Bits.layout, List.layout Type.layout) takeTys in SOME (takeTys (dropTys (tys, dropBits), takeBits)) end) val extractTys = Trace.trace3 ("RepType.checkOffset.extractTys", List.layout Type.layout, Bits.layout, Bits.layout, Option.layout (List.layout Type.layout)) extractTys fun getTys ty = case node ty of Seq tys => Vector.toList tys | _ => [ty] in fun checkOffset {components, isSequence, mustBeMutable, offset, result} = Exn.withEscape (fn escape0 => let val ({elt = componentTy, isMutable = componentIsMutable, ...}, componentOffset) = Exn.withEscape (fn escape1 => let val _ = Vector.fold (Prod.dest components, Bytes.zero, fn (comp as {elt = compTy, ...}, compOffset) => let val compOffset' = Bytes.+ (compOffset, Type.bytes compTy) in if Bytes.< (offset, compOffset') then escape1 (comp, compOffset) else compOffset' end) in escape0 false end) val componentBits = Type.width componentTy val componentTys = getTys componentTy val offsetBytes = Bytes.- (offset, componentOffset) val offsetBits = Bytes.toBits offsetBytes val resultBits = Type.width result val resultTys = getTys result val alignBits = case !Control.align of Control.Align4 => Bits.inWord32 | Control.Align8 => Bits.inWord64 val adjOffsetBits = if Control.Target.bigEndian () andalso Bits.< (resultBits, Bits.inWord32) andalso Bits.> (componentBits, resultBits) then let val paddedComponentBits = if isSequence then Bits.min (componentBits, Bits.inWord32) else Bits.inWord32 val paddedComponentOffsetBits = Bits.alignDown (offsetBits, {alignment = paddedComponentBits}) in Bits.+ (paddedComponentOffsetBits, Bits.- (paddedComponentBits, Bits.- (Bits.+ (resultBits, offsetBits), paddedComponentOffsetBits))) end else offsetBits in List.exists (Bits.prims, fn primBits => Bits.equals (resultBits, primBits) andalso Bits.isAligned (offsetBits, {alignment = Bits.min (primBits, alignBits)})) andalso (case extractTys (componentTys, adjOffsetBits, resultBits) of NONE => false | SOME tys => List.equals (resultTys, tys, Type.equals)) andalso (not mustBeMutable orelse componentIsMutable) end) (* Check that offset/result exactly corresponds to a component; * Doesn't work with something like: * components = ([Word10, Word14, Word8]) * offset = 3 * result = Word8 * because while the Word10 and Word14 sub-components are accessed with * `Select.IndirectUnpack` (by reading/writing the whole `Word32` with * shifting/masking), the `Word8` sub-component is accessed with * `Select.Indirect` (because the packing results in the `Word8` sub-component * ending up with an 8-bit aligned offset); see `makeSubword32s` in * `PackedRepresentation`. *) fun checkOffsetAlt {components, isSequence = _, mustBeMutable, offset, result} = Exn.withEscape (fn escape => (ignore (Vector.fold (Prod.dest components, Bytes.zero, fn ({elt = compTy, isMutable = compIsMutable}, compOffset) => if Bytes.equals (compOffset, offset) then escape (equals (compTy, result) andalso (not mustBeMutable orelse compIsMutable)) else Bytes.+ (compOffset, Type.bytes compTy))) ; false)) val _ = checkOffsetAlt end val checkOffset = Trace.trace ("RepType.checkOffset", fn {components, isSequence, mustBeMutable, offset, result} => let open Layout in record [("components", Prod.layout (components, Type.layout)), ("isSequence", Bool.layout isSequence), ("mustBeMutable", Bool.layout mustBeMutable), ("offset", Bytes.layout offset), ("result", Type.layout result)] end, Bool.layout) checkOffset fun offsetIsOk {base, mustBeMutable, offset, tyconTy, result} = case node base of CPointer => true | Objptr opts => if Bytes.equals (offset, Runtime.headerOffset ()) then equals (result, objptrHeader ()) else if Bytes.equals (offset, Runtime.sequenceLengthOffset ()) then (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Sequence _ => true | _ => false) andalso (equals (result, seqIndex ())) else if Bytes.equals (offset, Runtime.sequenceCounterOffset ()) then (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Sequence _ => true | _ => false) andalso (equals (result, seqIndex ())) else (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Normal {components, ...} => checkOffset {components = components, isSequence = false, mustBeMutable = mustBeMutable, offset = offset, result = result} | _ => false) | _ => false fun sequenceOffsetIsOk {base, mustBeMutable, index, offset, tyconTy, result, scale} = case node base of CPointer => (equals (index, csize ())) andalso (case node result of CPointer => true | Objptr _ => true (* for FFI export of indirect types *) | Real _ => true | Word _ => true | _ => false) andalso (case Scale.fromBytes (bytes result) of NONE => false | SOME s => scale = s) andalso (Bytes.equals (offset, Bytes.zero)) | Objptr opts => (equals (index, seqIndex ())) andalso (1 = Vector.length opts) andalso (case tyconTy (Vector.first opts) of ObjectType.Sequence {components, ...} => let val elt = Type.seq (Vector.map (Prod.dest components, #elt)) in if equals (elt, word8) then (* special case for PackWord operations *) (case node result of Word wsRes => (case Scale.fromBytes (WordSize.bytes wsRes) of NONE => false | SOME s => scale = s) andalso (Bytes.equals (offset, Bytes.zero)) | _ => false) else (case Scale.fromBytes (bytes elt) of NONE => scale = Scale.One | SOME s => scale = s) andalso (checkOffset {components = components, isSequence = true, mustBeMutable = mustBeMutable, offset = offset, result = result}) end | _ => false) | _ => false structure BuiltInCFunction = struct open CFunction datatype z = datatype Convention.t datatype z = datatype Target.t fun bug () = vanilla {args = Vector.new1 (string ()), name = "MLton_bug", prototype = (Vector.new1 CType.objptr, NONE), return = unit} local fun make b = fn () => T {args = Vector.new3 (Type.gcState (), Type.csize (), Type.bool), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = SOME 1, mayGC = true, maySwitchThreadsFrom = b, maySwitchThreadsTo = b, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new3 (CType.cpointer, CType.csize (), CType.bool), NONE), return = Type.unit, symbolScope = SymbolScope.Private, target = Direct "GC_collect"} val t = make true val f = make false in fun gc {maySwitchThreads = b} = if b then t () else f () end end end mlton-20210117+dfsg/mlton/backend/rep-type.sig000066400000000000000000000077031416264345000210260ustar00rootroot00000000000000(* Copyright (C) 2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature REP_TYPE_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Const: CONST structure Label: LABEL structure ObjptrTycon: OBJPTR_TYCON structure Prim: PRIM structure Prod: PROD structure RealSize: REAL_SIZE structure RealX: REAL_X structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing CFunction = Prim.CFunction sharing RealSize = ObjptrTycon.RealSize = Prim.RealSize = RealX.RealSize sharing RealX = Const.RealX sharing Runtime = ObjptrTycon.Runtime sharing WordSize = ObjptrTycon.WordSize = Prim.WordSize = WordX.WordSize sharing WordX = Const.WordX = RealX.WordX = WordXVector.WordX sharing WordXVector = Const.WordXVector end signature REP_TYPE = sig include REP_TYPE_STRUCTS type t structure ObjectType: OBJECT_TYPE sharing type ObjectType.ty = t sharing ObjectType.Prod = Prod (* sharing ObjectType.ObjptrTycon = ObjptrTycon *) (* sharing ObjectType.Runtime = Runtime *) val bogusWord: t -> WordX.t val align: t * Bytes.t -> Bytes.t val bits: Bits.t -> t val bool: t val bytes: t -> Bytes.t val castIsOk: {from: t, to: t, tyconTy: ObjptrTycon.t -> ObjectType.t} -> bool val checkPrimApp: {args: t vector, prim: t Prim.t, result: t option} -> bool val cpointer: unit -> t val csize: unit -> t val cint: unit -> t val compareRes: t val deLabel: t -> Label.t option val deObjptr: t -> ObjptrTycon.t option val deObjptrs: t -> ObjptrTycon.t vector option val deReal: t -> RealSize.t option val deSeq: t -> t vector option val deWord: t -> WordSize.t option val equals: t * t -> bool val exnStack: unit -> t val gcState: unit -> t val hash: t -> word val exists: t * (t -> bool) -> bool val intInf: unit -> t val isCPointer: t -> bool val isObjptr: t -> bool val isUnit: t -> bool val isSubtype: t * t -> bool val label: Label.t -> t val layout: t -> Layout.t val name: t -> string (* simple one letter abbreviation *) val ofConst: Const.t -> t val ofGCField: Runtime.GCField.t -> t val ofRealX: RealX.t -> t val ofWordXVector: WordXVector.t -> t val ofWordX: WordX.t -> t val offsetIsOk: {base: t, mustBeMutable: bool, offset: Bytes.t, tyconTy: ObjptrTycon.t -> ObjectType.t, result: t} -> bool val objptr: ObjptrTycon.t -> t val objptrHeader: unit -> t val real: RealSize.t -> t val resize: t * Bits.t -> t val seq: t vector -> t val seqIndex: unit -> t val sequenceOffsetIsOk: {base: t, index: t, mustBeMutable: bool, offset: Bytes.t, tyconTy: ObjptrTycon.t -> ObjectType.t, result: t, scale: Scale.t} -> bool val shiftArg: t val string: unit -> t val sum: t vector -> t val thread: unit -> t val toCType: t -> CType.t val unit: t val width: t -> Bits.t val word: WordSize.t -> t val wordVector: WordSize.t -> t val zero: Bits.t -> t structure BuiltInCFunction: sig val bug: unit -> t CFunction.t val gc: {maySwitchThreads: bool} -> t CFunction.t end end mlton-20210117+dfsg/mlton/backend/representation.sig000066400000000000000000000042631416264345000223210ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature REPRESENTATION_STRUCTS = sig structure Rssa: RSSA structure Ssa2: SSA2 sharing Rssa.Prod = Ssa2.Prod sharing Rssa.RealSize = Ssa2.RealSize sharing Rssa.WordSize = Ssa2.WordSize end signature REPRESENTATION = sig include REPRESENTATION_STRUCTS val compute: Ssa2.Program.t -> {diagnostic: unit -> unit, genCase: {cases: {con: Ssa2.Con.t, dst: Rssa.Label.t, dstHasArg: bool} vector, default: Rssa.Label.t option, test: unit -> Rssa.Operand.t, tycon: Ssa2.Tycon.t} -> (Rssa.Statement.t list * Rssa.Transfer.t * Rssa.Block.t list), object: {args: Ssa2.Var.t vector, con: Ssa2.Con.t option, dst: Rssa.Var.t * Rssa.Type.t, objectTy: Ssa2.Type.t, oper: Ssa2.Var.t -> Rssa.Operand.t} -> Rssa.Statement.t list, objectTypes: (Rssa.ObjptrTycon.t * Rssa.ObjectType.t) vector, select: {base: Rssa.Operand.t Ssa2.Base.t, baseTy: Ssa2.Type.t, dst: Rssa.Var.t * Rssa.Type.t, offset: int} -> Rssa.Statement.t list, sequence: {args: Ssa2.Var.t vector vector, dst: Rssa.Var.t * Rssa.Type.t, sequenceTy: Ssa2.Type.t, oper: Ssa2.Var.t -> Rssa.Operand.t} -> Rssa.Statement.t list, toRtype: Ssa2.Type.t -> Rssa.Type.t option, update: {base: Rssa.Operand.t Ssa2.Base.t, baseTy: Ssa2.Type.t, offset: int, value: Rssa.Operand.t} -> Rssa.Statement.t list} end mlton-20210117+dfsg/mlton/backend/rssa-live.fun000066400000000000000000000344011416264345000211670ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. * * This pass is based on the liveness algorithm described in section 4.13, * page 132, of Morgan's "Building an Optimizing Compiler". BTW, the Dragon * book and Muchnick's book provided no help at all on speeding up liveness. * They suggest using bit-vectors, which is infeasible for MLton due to the * large size of and number of variables in SSA functions. * * Here is a description of the algorithm. * * Walk over the whole program and * 1. Build the predecessor graph of basic blocks. Each basic block records the * set of its predecessors and the set of variables live at the beginning of * the block. * 2. For each variable record the block in which is defined and the list of * blocks where it is used. * * Now, for each variable, propagate the liveness information backwards from uses * along basic blocks until the definition block is reached. * * That's it. The reason why it's so fast is that it processes one variable at a * time, and hence the operation to determine if that variable is in the live * list for a particular block is constant time -- the variable is either at the * head of the list or it's not there. *) functor RssaLive (S: RSSA_LIVE_STRUCTS): RSSA_LIVE = struct open S datatype z = datatype Statement.t datatype z = datatype Transfer.t structure LiveInfo = struct datatype t = T of {live: Var.t Buffer.t, liveHS: {handler: Label.t option ref, link: unit option ref}, name: string, preds: t list ref} fun layout (T {name, ...}) = Layout.str name fun new (name: string) = T {live = Buffer.new {dummy = Var.bogus}, liveHS = {handler = ref NONE, link = ref NONE}, name = name, preds = ref []} fun live (T {live, ...}) = Buffer.toVector live fun liveHS (T {liveHS = {handler, link}, ...}) = {handler = !handler, link = isSome (!link)} fun equals (T {preds = r, ...}, T {preds = r', ...}) = r = r' fun addEdge (b, T {preds, ...}) = if List.exists (!preds, fn b' => equals (b, b')) then () else List.push (preds, b) val addEdge = Trace.trace2 ("Live.LiveInfo.addEdge", layout, layout, Unit.layout) addEdge end val traceConsider = Trace.trace ("Live.consider", LiveInfo.layout, Bool.layout) fun live (function, {shouldConsider: Var.t -> bool}) = let val shouldConsider = Trace.trace ("Live.shouldConsider", Var.layout, Bool.layout) shouldConsider val {args, blocks, ...} = Function.dest function val _ = Control.diagnostic (fn () => let val numVars = ref 0 fun loopVar (x, _) = if shouldConsider x then Int.inc numVars else () fun loopFormals v = Vector.foreach (v, loopVar) val () = Vector.foreach (blocks, fn Block.T {args, statements, ...} => (loopFormals args ; Vector.foreach (statements, fn s => Statement.foreachDef (s, loopVar)))) open Layout in align [seq [str "Live info for ", Func.layout (Function.name function)], seq [str " num blocks ", Int.layout (Vector.length blocks)], seq [str " num vars ", Int.layout (!numVars)]] end) val {get = labelInfo: Label.t -> {argInfo: LiveInfo.t, block: Block.t, bodyInfo: LiveInfo.t}, rem = removeLabelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live info", Label.layout)) val {get = varInfo: Var.t -> {defined: LiveInfo.t option ref, used: LiveInfo.t list ref}, destroy = destroyVarInfo, ...} = Property.destGet (Var.plist, Property.initFun (fn _ => {defined = ref NONE, used = ref []})) datatype 'a defuse = Def of LiveInfo.t | Use of 'a * LiveInfo.t val handlerCodeDefUses: Label.t defuse list ref = ref [] val handlerLinkDefUses: unit defuse list ref = ref [] val allVars: Var.t list ref = ref [] fun setDefined (x: Var.t, defined): unit = if shouldConsider x then (List.push (allVars, x) ; #defined (varInfo x) := SOME defined) else () val setDefined = Trace.trace2 ("Live.setDefined", Var.layout, LiveInfo.layout, Unit.layout) setDefined (* Set the labelInfo for each block. *) val _ = Vector.foreach (blocks, fn block as Block.T {args, label, ...} => let val name = Label.toString label val (argInfo, bodyInfo) = case Vector.length args of 0 => let val b = LiveInfo.new (name ^ "a") in (b, b) end | _ => let val b = LiveInfo.new (name ^ "b") val b' = LiveInfo.new (name ^ "c") val _ = LiveInfo.addEdge (b, b') in (b, b') end in setLabelInfo (label, {argInfo = argInfo, block = block, bodyInfo = bodyInfo}) end) (* Add the control-flow edges and set the defines and uses for each * variable. *) val head = LiveInfo.new "main" val _ = Vector.foreach (args, fn (x, _) => setDefined (x, head)) val _ = Vector.foreach (blocks, fn Block.T {args, kind, label, statements, transfer, ...} => let val {argInfo, bodyInfo = b, ...} = labelInfo label val _ = Vector.foreach (args, fn (x, _) => setDefined (x, argInfo)) fun goto l = LiveInfo.addEdge (b, #argInfo (labelInfo l)) (* Make sure that a cont's live vars includes variables live in its * handler. *) val _ = case kind of Kind.Cont {handler, ...} => Handler.foreachLabel (handler, goto) | _ => () fun define (x: Var.t): unit = setDefined (x, b) fun use (x: Var.t): unit = if shouldConsider x then let val {used, ...} = varInfo x in if (case !used of [] => false | b' :: _ => LiveInfo.equals (b, b')) then () else List.push (used, b) end else () val use = Trace.trace ("Live.use", Var.layout, Unit.layout) use val _ = Vector.foreach (statements, fn s => let val _ = Statement.foreachDefUse (s, {def = define o #1, use = use}) val _ = case s of SetExnStackSlot => List.push (handlerLinkDefUses, Use ((), b)) | SetHandler _ => List.push (handlerCodeDefUses, Def b) | SetSlotExnStack => List.push (handlerLinkDefUses, Def b) | _ => () in () end) fun label l = let val {block = Block.T {kind, ...}, ...} = labelInfo l in case kind of Kind.Handler => List.push (handlerCodeDefUses, Use (l, b)) | _ => goto l end val _ = Transfer.foreachLabelUse (transfer, {label = label, use = use}) in () end) (* Back-propagate every variable from uses to define point. *) fun processVar (x: Var.t): unit = if not (shouldConsider x) then () else let val {defined, used, ...} = varInfo x val defined = valOf (!defined) val todo: LiveInfo.t list ref = ref [] fun consider (b as LiveInfo.T {live, ...}) = if LiveInfo.equals (b, defined) orelse (case Buffer.last live of NONE => false | SOME x' => Var.equals (x, x')) then false else (Buffer.add (live, x) ; List.push (todo, b) ; true) val consider = traceConsider consider val consider = ignore o consider val _ = List.foreach (!used, consider) fun loop () = case !todo of [] => () | LiveInfo.T {preds, ...} :: bs => (todo := bs ; List.foreach (!preds, consider) ; loop ()) val _ = loop () in () end val processVar = Trace.trace ("Live.processVar", Var.layout, Unit.layout) processVar val _ = List.foreach (!allVars, processVar) val () = destroyVarInfo () (* handler code and link slots are harder; in particular, they don't * satisfy the SSA invariant -- there are multiple definitions; * furthermore, a def and use in a block does not mean that the def * occurs before the use. But, a back propagated use will always * come after a def in the same block *) fun handlerLink (defuse: 'a defuse list ref, sel: {handler: Label.t option ref, link: unit option ref} -> 'a option ref) = let val todo: ('a * LiveInfo.t) list ref = ref [] (* The foldr is important because the statements in each block were * visited in order, meaning that the earlier statements appear * later in !defuse. Hence, with the foldr, the defs and uses are * visited in order for each block. *) val defs = List.foldr (!defuse, [], fn (du, defs) => case du of Def b => b::defs | Use (a, b as LiveInfo.T {liveHS, ...}) => let val _ = if (* Since we are visiting all of the statements * in the block together, in order, we are * guaranteed that if there is a prior definition * then it will be first on defs. *) (case defs of [] => false | b' :: _ => LiveInfo.equals (b, b')) then () else (sel liveHS := SOME a ; List.push (todo, (a, b))) in defs end) fun consider (b as LiveInfo.T {liveHS, ...}, a: 'a) = if List.exists (defs, fn b' => LiveInfo.equals (b, b')) orelse isSome (!(sel liveHS)) then () else (sel liveHS := SOME a ; List.push (todo, (a, b))) fun loop () = case !todo of [] => () | (a, LiveInfo.T {preds, ...}) :: bs => (todo := bs ; List.foreach (!preds, fn b => consider (b, a)) ; loop ()) val _ = loop () in () end val _ = handlerLink (handlerCodeDefUses, #handler) val _ = handlerLink (handlerLinkDefUses, #link) val {get = labelLive, rem = remLabelLive, ...} = Property.get (Label.plist, Property.initFun (fn l => let val {bodyInfo, argInfo, ...} = labelInfo l val () = removeLabelInfo l val {handler, link} = LiveInfo.liveHS bodyInfo in {begin = LiveInfo.live bodyInfo, beginNoFormals = LiveInfo.live argInfo, handler = handler, link = link} end)) val () = Vector.foreach (blocks, fn b => ignore (labelLive (Block.label b))) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (blocks, fn b => let val l = Block.label b val {begin, beginNoFormals, handler, link} = labelLive l in display (seq [Label.layout l, str " ", record [("begin", Vector.layout Var.layout begin), ("beginNoFormals", Vector.layout Var.layout beginNoFormals), ("handler", Option.layout Label.layout handler), ("link", Bool.layout link)]]) end) end) in {labelLive = labelLive, remLabelLive = remLabelLive} end val live = Trace.trace2 ("Live.live", Func.layout o Function.name, Layout.ignore, Layout.ignore) live structure Live = struct val live = live end end mlton-20210117+dfsg/mlton/backend/rssa-live.sig000066400000000000000000000020731416264345000211610ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_LIVE_STRUCTS = sig include RSSA_SHRINK end signature RSSA_LIVE = sig include RSSA_LIVE_STRUCTS structure Live: sig val live: Function.t * {shouldConsider: Var.t -> bool} -> {labelLive: Label.t -> {(* live at beginning of block. *) begin: Var.t vector, (* live at the beginning of a block, except formals. *) beginNoFormals: Var.t vector, (* live handler slots at beginning of block. *) handler: Label.t option, link: bool}, remLabelLive: Label.t -> unit} end end mlton-20210117+dfsg/mlton/backend/rssa-restore.fun000066400000000000000000000703731416264345000217230ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Jason Carr, Matthew Fluet. * Copyright (C) 2009,2017 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Restore RSSA (based on ssa/restore2.fun) * * Based primarily on Section 19.1 of Appel's "Modern Compiler Implementation in ML", * (but see the caveats in the comments below). * The main deviation is the calculation of liveness of the violating variables, * which is used to predicate the insertion of phi arguments. This is due to * the algorithm's bias towards imperative languages, for which it makes the * assumption that all variables are defined in the start block and all variables * are "used" at exit. * This is "optimized" for restoration of functions with small numbers of violating * variables -- use bool vectors to represent sets of violating variables. * Also, we use a Promise.t to suspend part of the dominance frontier computation. * * For RSSA, this pass must be run before implement-handlers, as we don't currently deal with * handler labels correctly. * The issue may be that the handler needs to be mapped to two different labels in * different places, but SetHandler statements may be missing if they were deemed unnecessary. *) functor RssaRestore (S: RSSA_RESTORE_STRUCTS): RSSA_RESTORE = struct open S open Transfer structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector ref, preds: Label.t list ref, defs: bool vector ref, uses: bool vector ref, live: bool array ref, dtindex: int ref, df: Label.t vector Promise.t ref, phi: Var.t list ref, phiArgs: Var.t vector ref, kind: Kind.t ref, queued: bool ref} fun layout (T {preds, defs, uses, live, dtindex, df, phiArgs, ...}) = let open Layout in record [("preds", List.layout Label.layout (!preds)), ("defs", Vector.layout Bool.layout (!defs)), ("uses", Vector.layout Bool.layout (!uses)), ("live", Array.layout Bool.layout (!live)), ("dtindex", Int.layout (!dtindex)), ("df", Promise.layout (Vector.layout Label.layout) (!df)), ("phiArgs", Vector.layout Var.layout (!phiArgs))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (args, args') = make' #args val (preds, preds') = make' #preds val (defs, defs') = make' #defs val (uses, uses') = make' #uses val (live, live') = make' #live val (dtindex, dtindex') = make' #dtindex val (df, df') = make' #df val (phi, _) = make' #phi val (phiArgs, phiArgs') = make' #phiArgs val (queued, _) = make' #queued val (kind, kind') = make' #kind end fun new (): t = T {args = ref (Vector.new0 ()), preds = ref [], defs = ref (Vector.new0 ()), uses = ref (Vector.new0 ()), live = ref (Array.new0 ()), dtindex = ref ~1, df = ref (Promise.delay (fn () => Vector.new0 ())), phi = ref [], phiArgs = ref (Vector.new0 ()), kind = ref Kind.Jump, queued = ref false} end structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val isOne = isMid val makeOne = makeMid val isMany = isTop val makeMany = makeTop val whenMany = whenTop val inc: t -> unit = fn c => if isZero c then makeOne c else if isOne c then makeMany c else () end structure VarInfo = struct datatype t = T of {defs: Cardinality.t, ty: Type.t ref, index: int ref, defSites: Label.t list ref, useSites: Label.t list ref, vars: Var.t list ref} fun layout (T {defs, index, defSites, useSites, vars, ...}) = let open Layout in record [("defs", Cardinality.layout defs), ("index", Int.layout (!index)), ("defSites", List.layout Label.layout (!defSites)), ("useSites", List.layout Label.layout (!useSites)), ("vars", List.layout Var.layout (!vars))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val defs = make #defs val (index,index') = make' #index val (_,defSites') = make' #defSites val (_,useSites') = make' #useSites val (ty,ty') = make' #ty end fun addDef (T {defs, ...}) = Cardinality.inc defs fun addDefSite (T {defSites, ...}, l) = List.push(defSites, l) fun addUseSite (T {useSites, ...}, l) = List.push(useSites, l) val violates = Cardinality.isMany o defs fun whenViolates (T {defs, ...}, th) = Cardinality.whenMany (defs, th) fun new (): t = T {defs = Cardinality.new (), index = ref ~1, defSites = ref [], useSites = ref [], ty = ref Type.unit, vars = ref []} fun pushVar (T {vars, ...}, var) = List.push (vars, var) fun popVar (T {vars, ...}) = ignore (List.pop vars) fun peekVar (T {vars, ...}) = case !vars of [] => NONE | h::_ => SOME h end fun restoreFunction {main: Function.t, statics: {dst: Var.t * Type.t, obj: Object.t} vector} = let exception NoViolations val {get = varInfo: Var.t -> VarInfo.t, rem = remVarInfo, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) fun mkQueue () = let val todo = ref [] in {enque = fn (l, li) => let val queued = LabelInfo.queued li in if !queued then () else (queued := true ; List.push (todo, (l,li))) end, deque = fn () => case !todo of [] => NONE | (l,li)::todo' => (todo := todo'; LabelInfo.queued li := false; SOME (l,li))} end fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end val restore = fn (f: Function.t) => let val {args, blocks, name, returns, raises, start} = Function.dest f (* check for violations *) val violations = ref [] fun addDef (x, ty) = let val vi = varInfo x in if VarInfo.violates vi then () else (VarInfo.ty vi := ty ; VarInfo.addDef vi ; if VarInfo.violates vi then List.push (violations, x) else ()) end val _ = Function.foreachDef (f, addDef) (* escape early *) val _ = if List.isEmpty (!violations) then (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoViolations"]) end); raise NoViolations) else () (* init violations *) val index = Counter.new 0 val violations = Vector.fromListMap (!violations, fn x => let val vi = varInfo x val i = Counter.next index val _ = VarInfo.index vi := i in x end) val numViolations = Counter.value index (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " Violations: ", Vector.layout Var.layout violations]) end) (* init entryBlock *) val entry = Label.newNoname () val entryBlock = Block.T {label = entry, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}, kind = Kind.Jump} (* compute dominator tree *) val dt = Function.dominatorTree f val dt' = Tree.T (entryBlock, Vector.new1 dt) (* compute df (dominance frontier) *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" *) (* also computes defSites and useSites of violating variables *) (* also computes preds, defs, and uses *) val dtindex = ref 0 fun doitTree (Tree.T (Block.T {label, args, statements, transfer, kind}, children)) = let val li = labelInfo label val _ = LabelInfo.args li := args val _ = LabelInfo.kind li := kind val _ = Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) val defs = Array.new (numViolations, false) val uses = Array.new (numViolations, false) fun addDef x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addDefSite (varInfo x, label); Array.update (defs, index, true); Array.update (uses, index, false) end else () end fun addUse x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addUseSite (varInfo x, label); Array.update (uses, index, true) end else () end val _ = Transfer.foreachLabelUse (transfer, {label=fn _ => (), use=addUse}) val _ = Vector.foreachr (statements, fn s => Statement.foreachDefUse (s, {def=addDef o #1, use=addUse})) val _ = Vector.foreach (args, addDef o #1) val _ = LabelInfo.defs li := Array.toVector defs val _ = LabelInfo.uses li := Array.toVector uses val _ = LabelInfo.live li := Array.new (numViolations, false) val _ = Int.inc dtindex val dtindexMin = !dtindex val _ = LabelInfo.dtindex li := dtindexMin val _ = Vector.foreach(children, doitTree) val dtindexMax = !dtindex fun dominates l = let val dtindex = LabelInfo.dtindex' (labelInfo l) in dtindexMin < dtindex andalso dtindex <= dtindexMax end fun promise () = let val df = ref [] fun addDF l = if List.contains(!df, l, Label.equals) then () else List.push(df,l) val _ = Transfer.foreachLabel (transfer, fn l => if Vector.exists (children, fn Tree.T (b, _) => Label.equals (Block.label b, l)) then () else addDF l) val _ = Vector.foreach (children, fn Tree.T (Block.T {label, ...}, _) => let val li = labelInfo label in Vector.foreach (Promise.force (LabelInfo.df' li), fn l => if dominates l then () else addDF l) end) in Vector.fromList (!df) end val _ = LabelInfo.df li := Promise.delay promise in () end val _ = doitTree dt' (* compute liveness *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val enque = fn l => enque (l, labelInfo l) val vi = varInfo x val index = VarInfo.index' vi val useSites = VarInfo.useSites' vi val _ = List.foreach (useSites, enque) fun doit (_,li) = let val uses = LabelInfo.uses' li val defs = LabelInfo.defs' li val live = LabelInfo.live' li in if Array.sub (live, index) orelse (Vector.sub(defs, index) andalso not (Vector.sub (uses, index))) then () else (Array.update(live, index, true) ; List.foreach (LabelInfo.preds' li, enque)) end fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* insert phi-functions *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" * (beware: Alg. 19.6 (both in the book and as corrected by the * errata) has numerous typos; and this implementation computes sets of * variables that must have phi-functions at a node, which is close to * the algorithm in the book, but the reverse of the algorithm as * corrected by the errata, which computes sets of nodes that must have * a phi-functions for a variable.) *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val vi = varInfo x val index = VarInfo.index' vi val defSites = VarInfo.defSites' vi val _ = List.foreach (defSites, fn l => enque (l, labelInfo l)) fun doit (_,li) = Vector.foreach (Promise.force (LabelInfo.df' li), fn l => let val li = labelInfo l val live = LabelInfo.live' li val phi = LabelInfo.phi li in if Array.sub(live, index) andalso not (List.contains(!phi, x, Var.equals)) then (List.push(phi, x); enque (l, li)) else () end) fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* finalize phi args *) fun visitBlock (Block.T {label, ...}) = let val li = labelInfo label val phi = LabelInfo.phi li val phiArgs = LabelInfo.phiArgs li in phiArgs := Vector.fromList (!phi) ; phi := [] end val _ = visitBlock entryBlock val _ = Vector.foreach (blocks, visitBlock) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (violations, fn x => display (seq [Var.layout x, str " ", VarInfo.layout (varInfo x)])); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", LabelInfo.layout (labelInfo label)])) end) (* rewrite *) val blocks = ref [] fun rewriteVar (var: Var.t) = let val vi as VarInfo.T {ty, ...} = varInfo var val var = case VarInfo.peekVar vi of NONE => var | SOME var' => var' in Operand.Var {ty=(!ty), var=var} end fun rewriteVarDef addPost var = let val vi = varInfo var val ty = VarInfo.ty' vi in if VarInfo.violates vi then let val var' = Var.new var val _ = addPost (fn _ => VarInfo.popVar vi) ; val _ = VarInfo.pushVar (vi, var'); in {ty=ty, var=var', isNew=true} end else {ty=ty, var=var, isNew=false} end fun replaceDstOperand (st, dst as {ty=dstTy, var=dstVar})= let val tupleDst = (dstVar, dstTy) in case st of Statement.Bind {src, pinned, ...} => Statement.Bind {dst=tupleDst, pinned=pinned, src=src} | Statement.Move {src, ...} => Statement.Move {dst=Operand.Var dst, src=src} | Statement.Object {obj, ...} => Statement.Object {dst=tupleDst, obj = obj} | Statement.PrimApp {args, prim, ...} => Statement.PrimApp {args=args, dst=SOME tupleDst, prim=prim} | _ => st end local val routeTable : (Label.t * Var.t vector, Label.t) HashTable.t = HashTable.new { equals=fn ((l1, vs1), (l2, vs2)) => Label.equals (l1, l2) andalso Vector.equals (vs1, vs2, Var.equals), hash=fn (l, vs) => Hash.combine (Label.hash l, Hash.vectorMap (vs, Var.hash))} in fun route force dst = let val li = labelInfo dst val phiArgs = LabelInfo.phiArgs' li val kind = LabelInfo.kind' li in if Vector.isEmpty phiArgs andalso not force then dst else let val phiArgs = Vector.map (phiArgs, fn v => let val vi = varInfo v val newOpt = VarInfo.peekVar vi val newVar = case newOpt of SOME v' => v' | NONE => Var.fromString (let open Layout in toString (seq [ str "errnopeek_", Var.layout v]) end) in (newVar, VarInfo.ty' vi) end) fun mkRoute () = let val label = Label.new dst val args = Vector.map (LabelInfo.args' li, fn (x,ty) => (Var.new x, ty)) val args' = Vector.map (Vector.concat [args, phiArgs], fn (x, ty) => Operand.Var {ty=ty, var=x}) val kind = case kind of Kind.Cont {handler} => Kind.Cont {handler=Handler.map (handler, route false)} | _ => kind val block = Block.T {label = label, args = args, statements = Vector.new0 (), transfer = Goto {dst = dst, args = args'}, kind = kind} val _ = List.push (blocks, block) in label end val route = if force then mkRoute () else HashTable.lookupOrInsert (routeTable, (dst, Vector.map (phiArgs, #1)), mkRoute) in route end end end fun rewriteStatement addPost st = let val st = Statement.replace (st, {const = Operand.Const, var = rewriteVar o #var}) val st = case st of Statement.SetHandler l => Statement.SetHandler (route false l) | _ => st in Statement.foldDef (st, st, fn (var, _, st) => let val {isNew, ty, var} = rewriteVarDef addPost var in if isNew then replaceDstOperand (st, {ty=ty, var=var}) else st end) end fun rewriteTransfer (t: Transfer.t) = let val t = case t of Call {args, func, return=Return.NonTail {cont, handler=Handler.Handle h}} => let val args = Vector.map (args, fn arg => Operand.replace (arg, {const = Operand.Const, var = rewriteVar o #var})) val h' = route false h val cont = route true cont in Call {args=args, func=func, return=Return.NonTail {cont=cont, handler=Handler.Handle h'}} end | _ => Transfer.replace (t, {const = Operand.Const, label = route false, var = rewriteVar o #var}) in t end fun visitBlock' (Block.T {label, args, statements, transfer, kind}) = let val {addPost, post} = mkPost () val li = labelInfo label fun doit var = case rewriteVarDef addPost var of {var, ty, ...} => (var, ty) val args = Vector.map (args, fn (x, _) => doit x) val phiArgs = Vector.map (LabelInfo.phiArgs' li, fn x => doit x) val args = Vector.concat [args, phiArgs] val statements = Vector.map (statements, rewriteStatement addPost) val transfer = rewriteTransfer transfer val kind = case kind of Kind.Cont {handler=Handler.Handle _} => Kind.Jump | _ => kind val kind = if Vector.isEmpty phiArgs then kind else Kind.Jump val block = Block.T {label = label, args = args, statements = statements, transfer = transfer, kind = kind} in (block, post) end fun visitBlock block = let val (block, post) = visitBlock' block in List.push (blocks, block) ; post end fun rewrite () = let local val (Block.T {label, args, statements, transfer, kind}, post) = visitBlock' entryBlock val entryBlock = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer, kind = kind} val _ = List.push (blocks, entryBlock) in val args = args val post = post end val _ = Tree.traverse (dt, visitBlock) val _ = post () in Function.new {args = args, blocks = Vector.fromList (!blocks), name = name, raises = raises, returns = returns, start = entry} end val f = rewrite () in f end handle NoViolations => f val main = restore main (* check for violations in statics/main *) fun addDef msg (x, ty) = let val () = remVarInfo x val vi = varInfo x in VarInfo.ty vi := ty ; VarInfo.addDef vi ; VarInfo.whenViolates (vi, fn () => Error.bug ("RssaRestore.restore: violation in " ^ msg)) end val _ = Vector.foreach (statics, addDef "statics" o #dst) val _ = Function.foreachDef (main, addDef "main") in {main = main, restore = restore} end val traceRestoreFunction = Trace.trace ("RssaRestore.restoreFunction", Func.layout o Function.name, Func.layout o Function.name) val restoreFunction = fn {main, statics} => let val {main, restore} = restoreFunction {main = main, statics = statics} in {main = main, restore = fn f => traceRestoreFunction restore f} end fun restore (Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics}) = let val {main, restore} = restoreFunction {main = main, statics = statics} in Program.T {handlesSignals = handlesSignals, functions = List.revMap (functions, restore), main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end mlton-20210117+dfsg/mlton/backend/rssa-restore.sig000066400000000000000000000012361416264345000217050ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Jason Carr, Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_RESTORE_STRUCTS = sig include RSSA_LIVE end signature RSSA_RESTORE = sig include RSSA_RESTORE_STRUCTS val restoreFunction: {main: Function.t, statics: {dst: Var.t * Type.t, obj: Object.t} vector} -> {main: Function.t, restore: Function.t -> Function.t} val restore: Program.t -> Program.t end mlton-20210117+dfsg/mlton/backend/rssa-shrink.fun000066400000000000000000000321061416264345000215260ustar00rootroot00000000000000(* Copyright (C) 2009,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RssaShrink (S: RSSA_SHRINK_STRUCTS): RSSA_SHRINK = struct open S local open Prim in structure ApplyArg = ApplyArg structure ApplyResult = ApplyResult end fun shrinkFunction {main: Function.t, statics: {dst: Var.t * Type.t, obj: Object.t} vector}: {main: unit -> Function.t, shrink: Function.t -> Function.t} = let val {get = varInfo: Var.t -> {occurrences: int ref, replace: Operand.t option ref}, ...} = Property.get (Var.plist, Property.initFun (fn _ => {occurrences = ref 0, replace = ref NONE})) fun visitVar x = Int.inc (#occurrences (varInfo x)) fun replaceVar x = case !(#replace (varInfo x)) of NONE => Error.bug (concat ["RssaShrink.replaceVar ", Var.toString x]) | SOME oper => oper fun setReplaceVar (x, oper) = #replace (varInfo x) := SOME oper fun dontReplaceVar (x: Var.t, t: Type.t): unit = setReplaceVar (x, Operand.Var {var = x, ty = t}) val setReplaceVar = fn (x: Var.t, t: Type.t, z: Operand.t) => let val z = if Type.equals (Operand.ty z, t) then z else Operand.Cast (z, t) in setReplaceVar (x, z) end val {get = labelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("RssaShrink.labelInfo", Label.layout)) fun visitLabel l = Int.inc (#occurrences (labelInfo l)) fun replaceLabel l = case (! o #replace o labelInfo) l of SOME l' => l' | NONE => l fun elimBlock l = let val {inline, occurrences, replace, ...} = labelInfo l in !inline orelse 0 = !occurrences orelse isSome (!replace) end fun shrink (f: Function.t, clear): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val () = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, {block = block, inline = ref false, replace = ref NONE, occurrences = ref 0})) val () = visitLabel start val () = Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, fn stmt => Statement.foreachUse (stmt, visitVar)) ; Transfer.foreachLabelUse (transfer, {label = visitLabel, use = visitVar}))) val () = Vector.foreach (blocks, fn Block.T {args, kind, label, statements, transfer} => case transfer of Transfer.Goto {args = gotoArgs, dst, ...} => let val {replace, ...} = labelInfo label val {inline = dstInline, occurrences = dstOccurrences, ...} = labelInfo dst in if Vector.isEmpty statements andalso Kind.isJump kind andalso Vector.equals (args, gotoArgs, fn ((x, _), oper) => !(#occurrences (varInfo x)) = 1 andalso (case oper of Operand.Var {var = x', ...} => Var.equals (x, x') | _ => false)) then replace := SOME dst else if 1 = !dstOccurrences then dstInline := true else () end | _ => ()) val () = Vector.foreach (blocks, fn Block.T {label, ...} => let val {replace, ...} = labelInfo label fun loop (l, seen) = case (! o #replace o labelInfo) l of SOME l' => if List.exists (seen, fn l'' => Label.equals (l'', l')) then (replace := SOME l' ; #replace (labelInfo l') := NONE) else loop (l', l'::seen) | NONE => replace := (case seen of nil => NONE | _::nil => NONE | l'::_ => SOME l') in loop (label, [label]) end) fun loopFormals args = Vector.foreach (args, dontReplaceVar) fun loopStatement (s: Statement.t): Statement.t option = let datatype z = datatype Statement.t val s = Statement.replace (s, {const = Operand.Const, var = replaceVar o #var}) fun keep () = (Statement.foreachDef (s, dontReplaceVar) ; SOME s) in case s of Bind {dst = (dst, dstTy), pinned, src} => if pinned then keep () else let datatype z = datatype Operand.t fun getSrc src = case src of Cast (src, _) => getSrc src | Const _ => SOME src | Var _ => SOME src | _ => NONE in case getSrc src of NONE => keep () | SOME src => (setReplaceVar (dst, dstTy, src) ; NONE) end | PrimApp {args, dst, prim} => let fun replace (z: Operand.t): Statement.t option = (Option.app (dst, fn (x, t) => setReplaceVar (x, t, z)) ; NONE) datatype z = datatype Operand.t fun getArg arg = case arg of Cast (arg, _) => getArg arg | Const c => SOME (ApplyArg.Const c) | Var x => SOME (ApplyArg.Var x) | _ => NONE val applyArgs = Vector.toListKeepAllMap (args, getArg) datatype z = datatype ApplyResult.t in if Vector.length args <> List.length applyArgs then keep () else case (Prim.apply (prim, applyArgs, fn ({var = x, ...}, {var = y, ...}) => Var.equals (x, y))) of Apply (prim, args) => let val args = Vector.fromListMap (args, Operand.Var) val () = Option.app (dst, dontReplaceVar) in SOME (PrimApp {args = args, dst = dst, prim = prim}) end | Bool b => replace (Operand.bool b) | Const c => replace (Operand.Const c) | Unknown => keep () | Var x => replace (Operand.Var x) end | _ => keep () end fun loopStatementsTransfer (statements: Statement.t vector, transfer: Transfer.t) = let val stmts = ref [] fun loop (ss, t) = let val () = List.push (stmts, Vector.keepAllMap (ss, loopStatement)) val t = Transfer.replace (t, {const = Operand.Const, label = replaceLabel, var = replaceVar o #var}) fun done () = (Vector.concat (List.rev (!stmts)), t) in case t of Transfer.Goto {args, dst} => let val {block, inline, ...} = labelInfo dst in if !inline then let val Block.T {args = formals, statements, transfer, ...} = block val binds = Vector.map2 (formals, args, fn (dst, src) => Statement.Bind {dst = dst, pinned = false, src = src}) val () = List.push (stmts, Vector.keepAllMap (binds, loopStatement)) in loop (statements, transfer) end else done () end | _ => done () end in loop (statements, transfer) end val start = replaceLabel start val () = loopFormals args val blocks = ref [] val () = Function.dfs (f, fn Block.T {args, kind, label, statements, transfer} => let val () = if elimBlock label then () else let val () = loopFormals args val (statements, transfer) = loopStatementsTransfer (statements, transfer) in List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) end in fn () => () end) val blocks = Vector.fromList (!blocks) val f = Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} val _ = if clear then Function.clear f else () in f end val () = Vector.foreach (statics, dontReplaceVar o #dst) val main = shrink (main, false) in {main = fn () => (Function.clear main; main), shrink = fn f => shrink (f, true)} end fun shrink (Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics}): Program.t = let val {main, shrink} = shrinkFunction {main = main, statics = statics} val functions = List.revMap (functions, shrink) val main = main () in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end mlton-20210117+dfsg/mlton/backend/rssa-shrink.sig000066400000000000000000000012441416264345000215170ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_SHRINK_STRUCTS = sig include RSSA_TYPE_CHECK end signature RSSA_SHRINK = sig include RSSA_SHRINK_STRUCTS val shrinkFunction: {main: Function.t, statics: {dst: Var.t * Type.t, obj: Object.t} vector} -> {main: unit -> Function.t, shrink: Function.t -> Function.t} val shrink: Program.t -> Program.t end mlton-20210117+dfsg/mlton/backend/rssa-simplify.fun000066400000000000000000000040521416264345000220630ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RssaSimplify (S: RSSA_SIMPLIFY_STRUCTS): RSSA_SIMPLIFY = struct open S structure BounceVars = BounceVars (S) structure CollectStatics = CollectStatics (S) structure ImplementHandlers = ImplementHandlers (S) structure ImplementProfiling = ImplementProfiling (S) structure LimitCheck = LimitCheck (S) structure SignalCheck = SignalCheck(S) val rssaPasses = {name = "rssaShrink1", doit = S.shrink, execute = true} :: {name = "collectStatics.WordXVectorConsts", doit = CollectStatics.WordXVectorConsts.transform, execute = true} :: {name = "collectStatics.Globals", doit = CollectStatics.Globals.transform, execute = true} :: {name = "collectStatics.RealConsts", doit = CollectStatics.RealConsts.transform, execute = true} :: {name = "insertLimitChecks", doit = LimitCheck.transform, execute = true} :: {name = "insertSignalChecks", doit = SignalCheck.transform, execute = true} :: (* must be before implementHandlers *) {name = "bounceVars", doit = BounceVars.transform, execute = true} :: {name = "implementHandlers", doit = ImplementHandlers.transform, execute = true} :: {name = "rssaShrink2", doit = S.shrink, execute = true} :: {name = "implementProfiling", doit = ImplementProfiling.transform, execute = true} :: {name = "rssaOrderFunctions", doit = Program.orderFunctions, execute = true} :: {name = "rssaShuffle", doit = Program.shuffle, execute = false} :: nil fun simplify p = let val rssaPasses = rssaPasses (* RSSA type check is too slow to run by default. *) (* val () = Control.trace (Control.Pass, "rssaTypeCheck") typeCheck p *) val p = Control.simplifyPasses {arg = p, passes = rssaPasses, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} (* val () = Control.trace (Control.Pass, "rssaTypeCheck") typeCheck p *) in p end end mlton-20210117+dfsg/mlton/backend/rssa-simplify.sig000066400000000000000000000005151416264345000220550ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_SIMPLIFY_STRUCTS = sig include RSSA_RESTORE end signature RSSA_SIMPLIFY = sig include RSSA_SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/backend/rssa-transform.sig000066400000000000000000000007531416264345000222400ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_TRANSFORM_STRUCTS = sig include RSSA_RESTORE end signature RSSA_TRANSFORM = sig include RSSA_TRANSFORM_STRUCTS val transform: Program.t -> Program.t end mlton-20210117+dfsg/mlton/backend/rssa-tree.fun000066400000000000000000001105431416264345000211710ustar00rootroot00000000000000(* Copyright (C) 2009,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RssaTree (S: RSSA_TREE_STRUCTS): RSSA_TREE = struct open S local open Runtime in structure CFunction = CFunction structure GCField = GCField end fun constrain (ty: Type.t): Layout.t = let open Layout in if !Control.showTypes then seq [str ": ", Type.layout ty] else empty end structure Operand = struct datatype t = Cast of t * Type.t | Const of Const.t | GCState | Offset of {base: t, offset: Bytes.t, ty: Type.t} | ObjptrTycon of ObjptrTycon.t | Runtime of GCField.t | SequenceOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Var of {var: Var.t, ty: Type.t} val null = Const Const.null val word = Const o Const.word val deWord = fn Const (Const.Word w) => SOME w | _ => NONE val one = word o WordX.one val zero = word o WordX.zero fun bool b = (if b then one else zero) WordSize.bool val ty = fn Cast (_, ty) => ty | Const c => Type.ofConst c | GCState => Type.gcState () | Offset {ty, ...} => ty | ObjptrTycon _ => Type.objptrHeader () | Runtime z => Type.ofGCField z | SequenceOffset {ty, ...} => ty | Var {ty, ...} => ty fun layout (z: t): Layout.t = let open Layout in case z of Cast (z, ty) => seq [str "Cast ", tuple [layout z, Type.layout ty]] | Const c => seq [Const.layout c, constrain (ty z)] | GCState => str "" | Offset {base, offset, ty} => seq [str (concat ["O", Type.name ty, " "]), tuple [layout base, Bytes.layout offset], constrain ty] | ObjptrTycon opt => ObjptrTycon.layout opt | Runtime r => GCField.layout r | SequenceOffset {base, index, offset, scale, ty} => seq [str (concat ["X", Type.name ty, " "]), tuple [layout base, layout index, Scale.layout scale, Bytes.layout offset]] | Var {var, ...} => Var.layout var end fun cast (z: t, t: Type.t): t = if Type.equals (t, ty z) then z else Cast (z, t) val cast = Trace.trace2 ("Rssa.Operand.cast", layout, Type.layout, layout) cast fun 'a foldVars (z: t, a: 'a, f: Var.t * 'a -> 'a): 'a = case z of Cast (z, _) => foldVars (z, a, f) | Offset {base, ...} => foldVars (base, a, f) | SequenceOffset {base, index, ...} => foldVars (index, foldVars (base, a, f), f) | Var {var, ...} => f (var, a) | _ => a fun replace (z: t, {const: Const.t -> t, var: {ty: Type.t, var: Var.t} -> t}): t = let fun loop (z: t): t = case z of Cast (t, ty) => Cast (loop t, ty) | Const c => const c | Offset {base, offset, ty} => Offset {base = loop base, offset = offset, ty = ty} | SequenceOffset {base, index, offset, scale, ty} => SequenceOffset {base = loop base, index = loop index, offset = offset, scale = scale, ty = ty} | Var x_ty => var x_ty | _ => z in loop z end end structure Object = struct local structure S = Object (open S structure Use = Operand) in open S end fun replace' (s, {const, var}) = replace (s, {use = fn oper => Operand.replace (oper, {const = const, var = var})}) end structure Statement = struct datatype t = Bind of {dst: Var.t * Type.t, pinned: bool, src: Operand.t} | Move of {dst: Operand.t, src: Operand.t} | Object of {dst: Var.t * Type.t, obj: Object.t} | PrimApp of {args: Operand.t vector, dst: (Var.t * Type.t) option, prim: Type.t Prim.t} | Profile of ProfileExp.t | ProfileLabel of ProfileLabel.t | SetExnStackLocal | SetExnStackSlot | SetHandler of Label.t | SetSlotExnStack fun 'a foldDefUse (s, a: 'a, {def: Var.t * Type.t * 'a -> 'a, use: Var.t * 'a -> 'a}): 'a = let fun useOperand (z: Operand.t, a) = Operand.foldVars (z, a, use) in case s of Bind {dst = (x, t), src, ...} => def (x, t, useOperand (src, a)) | Move {dst, src} => useOperand (src, useOperand (dst, a)) | Object {dst = (x, t), obj} => def (x, t, Object.foldUse (obj, a, useOperand)) | PrimApp {dst, args, ...} => Vector.fold (args, Option.fold (dst, a, fn ((x, t), a) => def (x, t, a)), useOperand) | Profile _ => a | ProfileLabel _ => a | SetExnStackLocal => a | SetExnStackSlot => a | SetHandler _ => a | SetSlotExnStack => a end fun foreachDefUse (s: t, {def, use}) = foldDefUse (s, (), {def = fn (x, t, ()) => def (x, t), use = use o #1}) fun 'a foldDef (s: t, a: 'a, f: Var.t * Type.t * 'a -> 'a): 'a = foldDefUse (s, a, {def = f, use = #2}) fun foreachDef (s:t , f: Var.t * Type.t -> unit) = foldDef (s, (), fn (x, t, ()) => f (x, t)) fun 'a foldUse (s: t, a: 'a, f: Var.t * 'a -> 'a) = foldDefUse (s, a, {def = #3, use = f}) fun foreachUse (s, f) = foldUse (s, (), f o #1) fun replace (s: t, fs as {const: Const.t -> Operand.t, var: {ty: Type.t, var: Var.t} -> Operand.t}): t = let fun oper (z: Operand.t): Operand.t = Operand.replace (z, {const = const, var = var}) in case s of Bind {dst, pinned, src} => Bind {dst = dst, pinned = pinned, src = oper src} | Move {dst, src} => Move {dst = oper dst, src = oper src} | Object {dst, obj} => Object {dst = dst, obj = Object.replace' (obj, fs)} | PrimApp {args, dst, prim} => PrimApp {args = Vector.map (args, oper), dst = dst, prim = prim} | Profile _ => s | ProfileLabel _ => s | SetExnStackLocal => s | SetExnStackSlot => s | SetHandler _ => s | SetSlotExnStack => s end val layout = let open Layout in fn Bind {dst = (x, t), src, ...} => mayAlign [seq [Var.layout x, constrain t], indent (seq [str "= ", Operand.layout src], 2)] | Move {dst, src} => mayAlign [Operand.layout dst, indent (seq [str ":= ", Operand.layout src], 2)] | Object {dst = (x, t), obj} => mayAlign [seq [Var.layout x, constrain t], indent (seq [str "= ", Object.layout obj], 2)] | PrimApp {dst, prim, args, ...} => mayAlign [case dst of NONE => seq [str "_", constrain (Type.unit)] | SOME (x, t) => seq [Var.layout x, constrain t], indent (seq [str "= ", Prim.layout prim, str " ", Vector.layout Operand.layout args], 2)] | Profile e => ProfileExp.layout e | ProfileLabel p => seq [str "ProfileLabel ", ProfileLabel.layout p] | SetExnStackLocal => str "SetExnStackLocal" | SetExnStackSlot => str "SetExnStackSlot " | SetHandler l => seq [str "SetHandler ", Label.layout l] | SetSlotExnStack => str "SetSlotExnStack " end val toString = Layout.toString o layout fun clear (s: t) = foreachDef (s, Var.clear o #1) fun resize (src: Operand.t, dstTy: Type.t): Operand.t * t list = let val srcTy = Operand.ty src val (src, srcTy, ssSrc, dstTy, finishDst) = case (Type.deReal srcTy, Type.deReal dstTy) of (NONE, NONE) => (src, srcTy, [], dstTy, fn dst => (dst, [])) | (SOME rs, NONE) => let val ws = WordSize.fromBits (RealSize.bits rs) val tmp = Var.newNoname () val tmpTy = Type.word ws in (Operand.Var {ty = tmpTy, var = tmp}, tmpTy, [PrimApp {args = Vector.new1 src, dst = SOME (tmp, tmpTy), prim = Prim.Real_castToWord (rs, ws)}], dstTy, fn dst => (dst, [])) end | (NONE, SOME rs) => let val ws = WordSize.fromBits (RealSize.bits rs) val tmp = Var.newNoname () val tmpTy = Type.real rs in (src, srcTy, [], Type.word ws, fn dst => (Operand.Var {ty = tmpTy, var = tmp}, [PrimApp {args = Vector.new1 dst, dst = SOME (tmp, tmpTy), prim = Prim.Word_castToReal (ws, rs)}])) end | (SOME _, SOME _) => (src, srcTy, [], dstTy, fn dst => (dst, [])) val srcW = Type.width srcTy val dstW = Type.width dstTy val (dst, ssConv) = if Bits.equals (srcW, dstW) then (Operand.cast (src, dstTy), []) else let val tmp = Var.newNoname () val tmpTy = dstTy in (Operand.Var {ty = tmpTy, var = tmp}, [PrimApp {args = Vector.new1 src, dst = SOME (tmp, tmpTy), prim = (Prim.Word_extdToWord (WordSize.fromBits srcW, WordSize.fromBits dstW, {signed = false}))}]) end val (dst, ssDst) = finishDst dst in (dst, ssSrc @ ssConv @ ssDst) end end structure Switch = struct local structure S = Switch (open S structure Use = Operand) in open S end fun replace' (s, {const, label, var}) = replace (s, {label = label, use = fn oper => Operand.replace (oper, {const = const, var = var})}) end structure Transfer = struct datatype t = CCall of {args: Operand.t vector, func: Type.t CFunction.t, return: Label.t option} | Call of {args: Operand.t vector, func: Func.t, return: Return.t} | Goto of {args: Operand.t vector, dst: Label.t} | Raise of Operand.t vector | Return of Operand.t vector | Switch of Switch.t fun layout t = let open Layout in case t of CCall {args, func, return} => seq [str "CCall ", record [("args", Vector.layout Operand.layout args), ("func", CFunction.layout (func, Type.layout)), ("return", Option.layout Label.layout return)]] | Call {args, func, return} => seq [Func.layout func, str " ", Vector.layout Operand.layout args, str " ", Return.layout return] | Goto {dst, args} => seq [Label.layout dst, str " ", Vector.layout Operand.layout args] | Raise xs => seq [str "raise ", Vector.layout Operand.layout xs] | Return xs => seq [str "return ", Vector.layout Operand.layout xs] | Switch s => Switch.layout s end fun bug () = CCall {args = (Vector.new1 (Operand.Const (Const.string "control shouldn't reach here"))), func = Type.BuiltInCFunction.bug (), return = NONE} fun foreachFunc (t, f : Func.t -> unit) : unit = case t of Call {func, ...} => f func | _ => () fun 'a foldLabelUse (t, a: 'a, {label: Label.t * 'a -> 'a, use: Var.t * 'a -> 'a}): 'a = let fun useOperand (z, a) = Operand.foldVars (z, a, use) fun useOperands (zs: Operand.t vector, a) = Vector.fold (zs, a, useOperand) in case t of CCall {args, return, ...} => useOperands (args, case return of NONE => a | SOME l => label (l, a)) | Call {args, return, ...} => useOperands (args, Return.foldLabel (return, a, label)) | Goto {args, dst, ...} => label (dst, useOperands (args, a)) | Raise zs => useOperands (zs, a) | Return zs => useOperands (zs, a) | Switch s => Switch.foldLabelUse (s, a, {label = label, use = useOperand}) end fun foreachLabelUse (t, {label, use}) = foldLabelUse (t, (), {label = label o #1, use = use o #1}) fun foldLabel (t, a, f) = foldLabelUse (t, a, {label = f, use = #2}) fun foreachLabel (t, f) = foldLabel (t, (), f o #1) fun foldUse (t, a, f) = foldLabelUse (t, a, {label = #2, use = f}) fun foreachUse (t, f) = foldUse (t, (), f o #1) local fun make i = WordX.fromIntInf (i, WordSize.bool) in fun ifBoolE (test, expect, {falsee, truee}) = Switch (Switch.T {cases = Vector.new2 ((make 0, falsee), (make 1, truee)), default = NONE, expect = Option.map (expect, fn expect => if expect then make 1 else make 0), size = WordSize.bool, test = test}) fun ifBool (test, branches) = ifBoolE (test, NONE, branches) fun ifZero (test, {falsee, truee}) = Switch (Switch.T {cases = Vector.new1 (make 0, truee), default = SOME falsee, expect = NONE, size = WordSize.bool, test = test}) end fun replace (t: t, fs as {const: Const.t -> Operand.t, label: Label.t -> Label.t, var: {ty: Type.t, var: Var.t} -> Operand.t}): t = let fun oper z = Operand.replace (z, {const = const, var = var}) fun opers zs = Vector.map (zs, oper) in case t of CCall {args, func, return} => CCall {args = opers args, func = func, return = Option.map (return, label)} | Call {args, func, return} => Call {args = opers args, func = func, return = Return.map (return, label)} | Goto {args, dst} => Goto {args = opers args, dst = label dst} | Raise zs => Raise (opers zs) | Return zs => Return (opers zs) | Switch s => Switch (Switch.replace' (s, fs)) end fun replaceLabels (s, label) = replace (s, {const = Operand.Const, label = label, var = Operand.Var}) end structure Kind = struct datatype t = Cont of {handler: Handler.t} | CReturn of {func: Type.t CFunction.t} | Handler | Jump fun isJump k = case k of Jump => true | _ => false fun layout k = let open Layout in case k of Cont {handler} => seq [str "Cont ", record [("handler", Handler.layout handler)]] | CReturn {func} => seq [str "CReturn ", record [("func", CFunction.layout (func, Type.layout))]] | Handler => str "Handler" | Jump => str "Jump" end datatype frameStyle = None | OffsetsAndSize | SizeOnly fun frameStyle (k: t): frameStyle = case k of Cont _ => OffsetsAndSize | CReturn {func, ...} => if CFunction.mayGC func then OffsetsAndSize else if !Control.profile = Control.ProfileNone then None else SizeOnly | Handler => SizeOnly | Jump => None end local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => seq [Var.layout x, if !Control.showTypes then seq [str ": ", Type.layout t] else empty]) xts end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, kind: Kind.t, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val kind = make #kind val label = make #label end fun clear (T {args, label, statements, ...}) = (Vector.foreach (args, Var.clear o #1) ; Label.clear label ; Vector.foreach (statements, Statement.clear)) fun layout (T {args, kind, label, statements, transfer, ...}) = let open Layout in align [seq [Label.layout label, str " ", Vector.layout (fn (x, t) => if !Control.showTypes then seq [Var.layout x, str ": ", Type.layout t] else Var.layout x) args, str " ", Kind.layout kind, str " = "], indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 2)] end fun foreachDef (T {args, statements, ...}, f) = (Vector.foreach (args, f) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, f))) fun foreachUse (T {statements, transfer, ...}, f) = (Vector.foreach (statements, fn s => Statement.foreachUse (s, f)) ; Transfer.foreachUse (transfer, f)) end structure Function = struct datatype t = T of {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} local fun make f (T r) = f r in val blocks = make #blocks val name = make #name end fun dest (T r) = r val new = T fun clear (T {name, args, blocks, ...}) = (Func.clear name ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) fun layoutHeader (T {args, name, raises, returns, start, ...}): Layout.t = let open Layout in seq [str "fun ", Func.layout name, str " ", layoutFormals args, if !Control.showTypes then seq [str ": ", record [("raises", Option.layout (Vector.layout Type.layout) raises), ("returns", Option.layout (Vector.layout Type.layout) returns)]] else empty, str " = ", Label.layout start, str " ()"] end fun layouts (f as T {blocks, ...}, output) = (output (layoutHeader f) ; Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout b, 2)))) fun layout (f as T {blocks, ...}) = let open Layout in align [layoutHeader f, indent (align (Vector.toListMap (blocks, Block.layout)), 2)] end fun foreachDef (T {args, blocks, ...}, f) = (Vector.foreach (args, f) ; (Vector.foreach (blocks, fn b => Block.foreachDef (b, f)))) fun foreachUse (T {blocks, ...}, f) = Vector.foreach (blocks, fn b => Block.foreachUse (b, f)) fun dfs (T {blocks, start, ...}, v) = let val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end structure Graph = DirectedGraph structure Node = Graph.Node fun overlayGraph (T {blocks, ...}) = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, rem = remLabelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> Block.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val () = Vector.foreach (blocks, fn b as Block.T {label, ...}=> setNodeInfo (labelNode label, b)) fun destroyLabelNode () = Vector.foreach (blocks, remLabelNode o Block.label) in (g, {labelNode = labelNode, destroyLabelNode = destroyLabelNode, nodeInfo = nodeInfo}) end fun dominatorTree (t as T {blocks, start, ...}): Block.t Tree.t = let val (g, {labelNode, destroyLabelNode, nodeInfo}) = overlayGraph t val _ = Vector.foreach (blocks, fn Block.T {transfer, label = from, ...} => Transfer.foreachLabel (transfer, fn to => ignore (Graph.addEdge (g, {from = labelNode from, to = labelNode to})))) in Graph.dominatorTree (g, {root = labelNode start, nodeValue = nodeInfo}) before destroyLabelNode () end fun loopForest (t as T {blocks, start, ...}, predicate) = let val (g, {labelNode, destroyLabelNode, nodeInfo}) = overlayGraph t val _ = Vector.foreach (blocks, fn from as Block.T {transfer, label, ...} => Transfer.foreachLabel (transfer, fn to => if predicate (from, (nodeInfo o labelNode) to) then ignore (Graph.addEdge (g, {from = labelNode label, to = labelNode to})) else ignore (Graph.addEdge (g, {from = labelNode start, to = labelNode to})))) in Graph.loopForestSteensgaard (g, {root = labelNode start, nodeValue = nodeInfo}) before destroyLabelNode () end fun dropProfile (f: t): t = let val {args, blocks, name, raises, returns, start} = dest f val blocks = Vector.map (blocks, fn Block.T {args, kind, label, statements, transfer} => Block.T {args = args, kind = kind, label = label, statements = Vector.keepAll (statements, fn Statement.Profile _ => false | Statement.ProfileLabel _ => false | _ => true), transfer = transfer}) in new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end fun shuffle (f: t): t = let val {args, blocks, name, raises, returns, start} = dest f val blocks = Array.fromVector blocks val () = Array.shuffle blocks in new {args = args, blocks = Array.toVector blocks, name = name, raises = raises, returns = returns, start = start} end end structure Program = struct datatype t = T of {functions: Function.t list, handlesSignals: bool, main: Function.t, objectTypes: ObjectType.t vector, profileInfo: {sourceMaps: SourceMaps.t, getFrameSourceSeqIndex: Label.t -> int option} option, statics: {dst: Var.t * Type.t, obj: Object.t} vector} fun clear (T {functions, main, statics, ...}) = (List.foreach (functions, Function.clear) ; Function.clear main ; Vector.foreach (statics, Statement.clear o Statement.Object)) fun layouts (T {functions, main, objectTypes, statics, ...}, output': Layout.t -> unit): unit = let open Layout val output = output' in output (str "\nObjectTypes:") ; Vector.foreachi (objectTypes, fn (i, ty) => output (seq [str "opt_", Int.layout i, str " = ", ObjectType.layout ty])) ; output (str "\nStatics:") ; Vector.foreach (statics, output o Statement.layout o Statement.Object) ; output (str "\nMain:") ; Function.layouts (main, output) ; output (str "\nFunctions:") ; List.foreach (functions, fn f => Function.layouts (f, output)) end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "rssa"} fun layoutStats (program as T {functions, main, objectTypes, statics, ...}) = let val numStatements = ref 0 val numBlocks = ref 0 val _ = List.foreach (main::functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, ...} => (Int.inc numBlocks ; numStatements := !numStatements + Vector.length statements)) end) val numFunctions = 1 + List.length functions val numObjectTypes = Vector.length objectTypes val numStatics = Vector.length statics open Layout in align [seq [Control.sizeMessage ("rssa program", program)], seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num object types in program = ", Int.layout (numObjectTypes)], seq [str "num statics in program = ", Int.layout numStatics]] end fun dropProfile (T {functions, handlesSignals, main, objectTypes, statics, ...}) = (Control.profile := Control.ProfileNone ; T {functions = List.map (functions, Function.dropProfile), handlesSignals = handlesSignals, main = Function.dropProfile main, objectTypes = objectTypes, profileInfo = NONE, statics = statics}) (* quell unused warning *) val _ = dropProfile fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList (main::functions) val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit (Function.name main) val _ = Vector.foreach (functions, rem o Function.name) in () end structure Labels = PowerSetLattice_ListSet(structure Element = Label) fun rflow (T {functions, main, ...}) = let val functions = main :: functions val table = HashTable.new {equals = Func.equals, hash = Func.hash} fun get f = HashTable.lookupOrInsert (table, f, fn () => {raisesTo = Labels.empty (), returnsTo = Labels.empty ()}) val raisesTo = #raisesTo o get val returnsTo = #returnsTo o get val empty = Labels.empty () val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Transfer.Call {func, return, ...} => let val (returns, raises) = case return of Return.Dead => (empty, empty) | Return.NonTail {cont, handler, ...} => (Labels.singleton cont, case handler of Handler.Caller => raisesTo name | Handler.Dead => empty | Handler.Handle hand => Labels.singleton hand) | Return.Tail => (returnsTo name, raisesTo name) in Labels.<= (returns, returnsTo func) ; Labels.<= (raises, raisesTo func) end | _ => ()) end) in fn f => let val {raisesTo, returnsTo} = get f in {raisesTo = Labels.getElements raisesTo, returnsTo = Labels.getElements returnsTo} end end fun orderFunctions (p as T {handlesSignals, objectTypes, profileInfo, statics, ...}) = let val functions = ref [] val () = dfs (p, fn f => let val {args, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) val (main, functions) = case List.rev (!functions) of main::functions => (main, functions) | _ => Error.bug "Rssa.orderFunctions: main/functions" in T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end fun shuffle (T {functions, handlesSignals, main, objectTypes, profileInfo, statics}) = let val functions = Array.fromListMap (functions, Function.shuffle) val () = Array.shuffle functions val p = T {functions = Array.toList functions, handlesSignals = handlesSignals, main = Function.shuffle main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} in p end end end mlton-20210117+dfsg/mlton/backend/rssa-tree.sig000066400000000000000000000217071416264345000211660ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_TREE_STRUCTS = sig include BACKEND_ATOMS end signature RSSA_TREE = sig include RSSA_TREE_STRUCTS structure Operand: sig datatype t = Cast of t * Type.t | Const of Const.t | GCState | Offset of {base: t, offset: Bytes.t, ty: Type.t} | ObjptrTycon of ObjptrTycon.t | Runtime of Runtime.GCField.t | SequenceOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Var of {ty: Type.t, var: Var.t} val bool: bool -> t val cast: t * Type.t -> t val layout: t -> Layout.t val one: WordSize.t -> t val null: t val replace: t * {const: Const.t -> t, var: {ty: Type.t, var: Var.t} -> t} -> t val ty: t -> Type.t val word: WordX.t -> t val zero: WordSize.t -> t end structure Object: OBJECT sharing Object = BackendAtoms sharing Object.Use = Operand structure Statement: sig datatype t = Bind of {dst: Var.t * Type.t, pinned: bool, src: Operand.t} | Move of {dst: Operand.t, src: Operand.t} | Object of {dst: Var.t * Type.t, obj: Object.t} | PrimApp of {args: Operand.t vector, dst: (Var.t * Type.t) option, prim: Type.t Prim.t} | Profile of ProfileExp.t | ProfileLabel of ProfileLabel.t | SetExnStackLocal | SetExnStackSlot | SetHandler of Label.t (* label must be of Handler kind. *) | SetSlotExnStack (* foldDef (s, a, f) * If s defines a variable x, then return f (x, a), else return a. *) val foldDef: t * 'a * (Var.t * Type.t * 'a -> 'a) -> 'a (* foreachDef (s, f) = foldDef (s, (), fn (x, ()) => f x) *) val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachDefUse: t * {def: (Var.t * Type.t) -> unit, use: Var.t -> unit} -> unit val foldUse: t * 'a * (Var.t * 'a -> 'a) -> 'a val foreachUse: t * (Var.t -> unit) -> unit val layout: t -> Layout.t val replace: t * {const: Const.t -> Operand.t, var: {var: Var.t, ty: Type.t} -> Operand.t} -> t val resize: Operand.t * Type.t -> Operand.t * t list val toString: t -> string end structure Switch: SWITCH sharing Switch = Atoms sharing Switch.Use = Operand structure Transfer: sig datatype t = CCall of {args: Operand.t vector, func: Type.t CFunction.t, (* return is NONE iff the CFunction doesn't return. * Else, return must be SOME l, where l is of kind * CReturn. The return should be nullary if the C * function returns void. Else, it should be unary with * a var of the appropriate type to accept the result. *) return: Label.t option} | Call of {args: Operand.t vector, func: Func.t, return: Return.t} | Goto of {args: Operand.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Operand.t vector | Return of Operand.t vector | Switch of Switch.t val bug: unit -> t val foreachLabelUse: t * {label: Label.t -> unit, use: Var.t -> unit} -> unit val foreachFunc: t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val ifBool: Operand.t * {falsee: Label.t, truee: Label.t} -> t val ifBoolE: Operand.t * bool option * {falsee: Label.t, truee: Label.t} -> t (* in ifZero, the operand should be of type defaultWord *) val ifZero: Operand.t * {falsee: Label.t, truee: Label.t} -> t val layout: t -> Layout.t val replace: t * {const: Const.t -> Operand.t, label: Label.t -> Label.t, var: {var: Var.t, ty: Type.t} -> Operand.t} -> t val replaceLabels: t * (Label.t -> Label.t) -> t end structure Kind: sig datatype t = Cont of {handler: Handler.t} | CReturn of {func: Type.t CFunction.t} | Handler | Jump datatype frameStyle = None | OffsetsAndSize | SizeOnly val frameStyle: t -> frameStyle val isJump: t -> bool val layout: t -> Layout.t end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, kind: Kind.t, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val clear: t -> unit val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val kind: t -> Kind.t val label: t -> Label.t val layout: t -> Layout.t end structure Function: sig type t val blocks: t -> Block.t vector val clear: t -> unit val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val dominatorTree: t -> Block.t Tree.t val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val layout: t -> Layout.t val layoutHeader: t -> Layout.t (* Produce a loop forest, with an optional predicate; * the start node will be connected when * the predicate fails, to maintain connectedness *) val loopForest: t * (Block.t * Block.t -> bool) -> Block.t DirectedGraph.LoopForest.t val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t end structure Program: sig datatype t = T of {functions: Function.t list, handlesSignals: bool, main: Function.t, objectTypes: ObjectType.t vector, profileInfo: {sourceMaps: SourceMaps.t, getFrameSourceSeqIndex: Label.t -> int option} option, statics: {dst: Var.t * Type.t, obj: Object.t} vector} val clear: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val dropProfile: t -> t val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val orderFunctions: t -> t val rflow: t -> (Func.t -> {raisesTo: Label.t list, returnsTo: Label.t list}) val shuffle: t -> t val toFile: {display: t Control.display, style: Control.style, suffix: string} end end mlton-20210117+dfsg/mlton/backend/rssa-type-check.fun000066400000000000000000000745661416264345000223040ustar00rootroot00000000000000(* Copyright (C) 2009,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RssaTypeCheck (S: RSSA_TYPE_CHECK_STRUCTS): RSSA_TYPE_CHECK = struct open S structure Operand = struct open Operand val rec isLocation = fn Cast (z, _) => isLocation z | Offset _ => true | Runtime _ => true | SequenceOffset _ => true | _ => false end structure ExnStack = struct structure ZPoint = struct datatype t = Caller | Me val equals: t * t -> bool = op = val toString = fn Caller => "Caller" | Me => "Me" val layout = Layout.str o toString end structure L = FlatLattice (structure Point = ZPoint) open L structure Point = ZPoint val me = point Point.Me end structure HandlerLat = FlatLattice (structure Point = Label) structure HandlerInfo = struct datatype t = T of {block: Block.t, global: ExnStack.t, handler: HandlerLat.t, slot: ExnStack.t, visited: bool ref} fun new (b: Block.t): t = T {block = b, global = ExnStack.new (), handler = HandlerLat.new (), slot = ExnStack.new (), visited = ref false} fun layout (T {global, handler, slot, ...}) = Layout.record [("global", ExnStack.layout global), ("slot", ExnStack.layout slot), ("handler", HandlerLat.layout handler)] end val traceGoto = Trace.trace ("Rssa.checkHandlers.goto", Label.layout, Unit.layout) fun checkHandlers (Program.T {functions, ...}) = let val debug = false fun checkFunction (f: Function.t): unit = let val {name, start, blocks, ...} = Function.dest f val {get = labelInfo: Label.t -> HandlerInfo.t, rem = remLabelInfo, set = setLabelInfo} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b => setLabelInfo (Block.label b, HandlerInfo.new b)) (* Do a DFS of the control-flow graph. *) fun visitLabel l = visitInfo (labelInfo l) and visitInfo (hi as HandlerInfo.T {block, global, handler, slot, visited, ...}): unit = if !visited then () else let val _ = visited := true val Block.T {label, statements, transfer, ...} = block val _ = if debug then let open Layout in outputl (seq [str "visiting ", Label.layout label], Out.error) end else () datatype z = datatype Statement.t val {global, handler, slot} = Vector.fold (statements, {global = global, handler = handler, slot = slot}, fn (s, {global, handler, slot}) => case s of SetExnStackLocal => {global = ExnStack.me, handler = handler, slot = slot} | SetExnStackSlot => {global = slot, handler = handler, slot = slot} | SetSlotExnStack => {global = global, handler = handler, slot = global} | SetHandler l => {global = global, handler = HandlerLat.point l, slot = slot} | _ => {global = global, handler = handler, slot = slot}) fun fail msg = (Control.message (Control.Silent, fn () => let open Layout in align [str "before: ", HandlerInfo.layout hi, str "block: ", Block.layout block, seq [str "after: ", Layout.record [("global", ExnStack.layout global), ("slot", ExnStack.layout slot), ("handler", HandlerLat.layout handler)]], Vector.layout (fn Block.T {label, ...} => seq [Label.layout label, str " ", HandlerInfo.layout (labelInfo label)]) blocks] end) ; Error.bug (concat ["Rssa.checkHandlers: handler mismatch at ", msg])) fun assert (msg, f) = if f then () else fail msg fun goto (l: Label.t): unit = let val HandlerInfo.T {global = g, handler = h, slot = s, ...} = labelInfo l val _ = assert ("goto", ExnStack.<= (global, g) andalso ExnStack.<= (slot, s) andalso HandlerLat.<= (handler, h)) in visitLabel l end val goto = traceGoto goto fun tail name = assert (name, ExnStack.forcePoint (global, ExnStack.Point.Caller)) datatype z = datatype Transfer.t in case transfer of CCall {return, ...} => Option.app (return, goto) | Call {return, ...} => assert ("return", let datatype z = datatype Return.t in case return of Dead => true | NonTail {handler = h, ...} => (case h of Handler.Caller => ExnStack.forcePoint (global, ExnStack.Point.Caller) | Handler.Dead => true | Handler.Handle l => let val res = ExnStack.forcePoint (global, ExnStack.Point.Me) andalso HandlerLat.forcePoint (handler, l) val _ = goto l in res end) | Tail => true end) | Goto {dst, ...} => goto dst | Raise _ => tail "raise" | Return _ => tail "return" | Switch s => Switch.foreachLabel (s, goto) end val info as HandlerInfo.T {global, ...} = labelInfo start val _ = ExnStack.forcePoint (global, ExnStack.Point.Caller) val _ = visitInfo info val _ = Control.diagnostics (fn display => let open Layout val _ = display (seq [str "checkHandlers ", Func.layout name]) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", HandlerInfo.layout (labelInfo label)])) in () end) val _ = Vector.foreach (blocks, fn b => remLabelInfo (Block.label b)) in () end val _ = List.foreach (functions, checkFunction) in () end fun checkScopes (program as Program.T {functions, main, statics, ...}): unit = let datatype status = Defined | Global | InScope | Undefined fun make (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, isGlobal) = case get x of Global => () | Undefined => set (x, if isGlobal then Global else InScope) | _ => Error.bug ("Rssa.checkScopes: duplicate definition of " ^ (Layout.toString (layout x))) fun reference x = case get x of Global => () | InScope => () | _ => Error.bug (concat ["Rssa.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = case get x of Global => () | _ => set (x, Defined) in (bind, reference, unbind) end val (bindVar, getVar, unbindVar) = make (Var.layout, Var.plist) val bindVar = Trace.trace2 ("Rssa.bindVar", Var.layout, Bool.layout, Unit.layout) bindVar val getVar = Trace.trace ("Rssa.getVar", Var.layout, Unit.layout) getVar val unbindVar = Trace.trace ("Rssa.unbindVar", Var.layout, Unit.layout) unbindVar val (bindFunc, _, _) = make (Func.layout, Func.plist) val bindFunc = fn f => bindFunc (f, false) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) val bindLabel = fn l => bindLabel (l, false) fun loopStmt (s: Statement.t, isMain: bool): unit = (Statement.foreachUse (s, getVar) ; Statement.foreachDef (s, fn (x, _) => bindVar (x, isMain))) fun loopFunc (f: Function.t, isMain: bool): unit = let val bindVar = fn x => bindVar (x, isMain) val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, bindVar o #1) val _ = Vector.foreach (blocks, bindLabel o Block.label) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) (* Descend the dominator tree, verifying that variable * definitions dominate variable uses. *) val _ = Tree.traverse (Function.dominatorTree f, fn Block.T {args, statements, transfer, ...} => let val _ = Vector.foreach (args, bindVar o #1) val _ = Vector.foreach (statements, fn s => loopStmt (s, isMain)) val _ = Transfer.foreachUse (transfer, getVar) in fn () => if isMain then () else let val _ = Vector.foreach (statements, fn s => Statement.foreachDef (s, unbindVar o #1)) val _ = Vector.foreach (args, unbindVar o #1) in () end end) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = Vector.foreach (statics, fn {dst, obj} => loopStmt (Statement.Object {dst = dst, obj = obj}, true)) val _ = List.foreach (functions, bindFunc o Function.name) val _ = loopFunc (main, true) val _ = List.foreach (functions, fn f => loopFunc (f, false)) val _ = Program.clear program in () end val checkScopes = Control.trace (Control.Detail, "checkScopes") checkScopes fun typeCheck (p as Program.T {functions, main, objectTypes, profileInfo, statics, ...}) = let val _ = Vector.foreach (objectTypes, fn ty => Err.check ("objectType", fn () => ObjectType.isOk ty, fn () => ObjectType.layout ty)) fun tyconTy (opt: ObjptrTycon.t): ObjectType.t = Vector.sub (objectTypes, ObjptrTycon.index opt) val () = checkScopes p val (checkProfileLabel, finishCheckProfileLabel, checkFrameSourceSeqIndex) = case profileInfo of NONE => (fn _ => false, fn () => (), fn _ => ()) | SOME {sourceMaps, getFrameSourceSeqIndex} => let val _ = Err.check ("sourceMaps", fn () => SourceMaps.check sourceMaps, fn () => SourceMaps.layout sourceMaps) val (checkProfileLabel, finishCheckProfileLabel) = SourceMaps.checkProfileLabel sourceMaps in (checkProfileLabel, fn () => Err.check ("finishCheckProfileLabel", finishCheckProfileLabel, fn () => SourceMaps.layout sourceMaps), fn (l, k) => let fun chk b = Err.check ("getFrameSourceSeqIndex", fn () => (case (b, getFrameSourceSeqIndex l) of (true, SOME ssi) => SourceMaps.checkSourceSeqIndex (sourceMaps, ssi) | (false, NONE) => true | _ => false), fn () => Label.layout l) in case k of Kind.Cont _ => chk true | Kind.CReturn _ => chk true | Kind.Handler => chk true | Kind.Jump => chk false end) end val {get = labelBlock: Label.t -> Block.t, set = setLabelBlock, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val {get = funcInfo, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("info", Func.layout)) val {get = varType: Var.t -> Type.t, set = setVarType, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("type", Var.layout)) val setVarType = Trace.trace2 ("Rssa.setVarType", Var.layout, Type.layout, Unit.layout) setVarType fun checkOperandAux (x: Operand.t, isLHS): unit = let datatype z = datatype Operand.t fun ok () = case x of Cast (z, ty) => (checkOperandAux (z, isLHS) ; Type.castIsOk {from = Operand.ty z, to = ty, tyconTy = tyconTy}) | Const _ => true | GCState => true | Offset {base, offset, ty} => (checkOperandAux (base, false) ; Type.offsetIsOk {base = Operand.ty base, mustBeMutable = isLHS, offset = offset, tyconTy = tyconTy, result = ty}) | ObjptrTycon _ => true | Runtime _ => true | SequenceOffset {base, index, offset, scale, ty} => (checkOperandAux (base, false) ; checkOperandAux (index, false) ; Type.sequenceOffsetIsOk {base = Operand.ty base, index = Operand.ty index, mustBeMutable = isLHS, offset = offset, tyconTy = tyconTy, result = ty, scale = scale}) | Var {ty, var} => Type.isSubtype (varType var, ty) in Err.check ("operand", ok, fn () => Operand.layout x) end val checkOperandAux = Trace.trace2 ("Rssa.checkOperandAux", Operand.layout, Bool.layout, Unit.layout) checkOperandAux fun checkLhsOperand z = checkOperandAux (z, true) fun checkOperand z = checkOperandAux (z, false) fun checkOperands v = Vector.foreach (v, checkOperand) fun check' (x, name, isOk, layout) = Err.check (name, fn () => isOk x, fn () => layout x) val handlersImplemented = ref false val labelKind = Block.kind o labelBlock fun statementOk (s: Statement.t): bool = let datatype z = datatype Statement.t in case s of Bind {src, dst = (_, dstTy), ...} => (checkOperand src ; Type.isSubtype (Operand.ty src, dstTy)) | Move {dst, src} => (checkLhsOperand dst ; checkOperand src ; (Type.isSubtype (Operand.ty src, Operand.ty dst) andalso Operand.isLocation dst)) | Object {dst = (_, dstTy), obj} => (Object.isOk (obj, {checkUse = checkOperand, tyconTy = tyconTy}) andalso Type.isSubtype (Object.ty obj, dstTy)) | PrimApp {args, dst, prim} => (Vector.foreach (args, checkOperand) ; (Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = Option.map (dst, #2)})) | Profile _ => true | ProfileLabel pl => checkProfileLabel pl | SetExnStackLocal => (handlersImplemented := true; true) | SetExnStackSlot => (handlersImplemented := true; true) | SetHandler l => (handlersImplemented := true; case labelKind l of Kind.Handler => true | _ => false) | SetSlotExnStack => (handlersImplemented := true; true) end val statementOk = Trace.trace ("Rssa.statementOk", Statement.layout, Bool.layout) statementOk fun gotoOk {args: Type.t vector, dst: Label.t}: bool = let val Block.T {args = formals, kind, ...} = labelBlock dst in Vector.equals (args, formals, fn (t, (_, t')) => Type.isSubtype (t, t')) andalso (case kind of Kind.Jump => true | _ => false) end fun labelIsNullaryJump l = gotoOk {dst = l, args = Vector.new0 ()} fun tailIsOk (caller: Type.t vector option, callee: Type.t vector option): bool = case (caller, callee) of (_, NONE) => true | (SOME caller, SOME callee) => Vector.equals (callee, caller, Type.isSubtype) | _ => false fun nonTailIsOk (formals: (Var.t * Type.t) vector, returns: Type.t vector option): bool = case returns of NONE => true | SOME ts => Vector.equals (formals, ts, fn ((_, t), t') => Type.isSubtype (t', t)) fun callIsOk {args, func, raises, return, returns} = let val {args = formals, raises = raises', returns = returns', ...} = Function.dest (funcInfo func) in Vector.equals (args, formals, fn (z, (_, t)) => Type.isSubtype (Operand.ty z, t)) andalso (case return of Return.Dead => Option.isNone raises' andalso Option.isNone returns' | Return.NonTail {cont, handler} => let val Block.T {args = cArgs, kind = cKind, ...} = labelBlock cont in nonTailIsOk (cArgs, returns') andalso (case cKind of Kind.Cont {handler = h} => Handler.equals (handler, h) andalso (case h of Handler.Caller => tailIsOk (raises, raises') | Handler.Dead => true | Handler.Handle l => let val Block.T {args = hArgs, kind = hKind, ...} = labelBlock l in nonTailIsOk (hArgs, raises') andalso (case hKind of Kind.Handler => true | _ => false) end) | _ => false) end | Return.Tail => tailIsOk (raises, raises') andalso tailIsOk (returns, returns')) end fun checkFunction f = let val {args, blocks, raises, returns, start, ...} = Function.dest f val _ = Vector.foreach (args, setVarType) val _ = Vector.foreach (blocks, fn b as Block.T {args, kind, label, statements, ...} => (setLabelBlock (label, b) ; checkFrameSourceSeqIndex (label, kind) ; Vector.foreach (args, setVarType) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, setVarType)))) val _ = labelIsNullaryJump start fun transferOk (t: Transfer.t): bool = let datatype z = datatype Transfer.t in case t of CCall {args, func, return} => let val _ = checkOperands args in CFunction.isOk (func, {isUnit = Type.isUnit}) andalso Vector.equals (args, CFunction.args func, fn (z, t) => Type.isSubtype (Operand.ty z, t)) andalso case return of NONE => true | SOME l => case labelKind l of Kind.CReturn {func = f} => CFunction.equals (func, f) | _ => false end | Call {args, func, return} => let val _ = checkOperands args in callIsOk {args = args, func = func, raises = raises, return = return, returns = returns} end | Goto {args, dst} => (checkOperands args ; gotoOk {args = Vector.map (args, Operand.ty), dst = dst}) | Raise zs => (checkOperands zs ; (case raises of NONE => false | SOME ts => Vector.equals (zs, ts, fn (z, t) => Type.isSubtype (Operand.ty z, t)))) | Return zs => (checkOperands zs ; (case returns of NONE => false | SOME ts => Vector.equals (zs, ts, fn (z, t) => Type.isSubtype (Operand.ty z, t)))) | Switch s => Switch.isOk (s, {checkUse = checkOperand, labelIsOk = labelIsNullaryJump}) end val transferOk = Trace.trace ("Rssa.transferOk", Transfer.layout, Bool.layout) transferOk fun blockOk (Block.T {args, kind, statements, transfer, ...}) : bool = let fun kindOk (k: Kind.t): bool = let datatype z = datatype Kind.t in case k of Cont _ => true | CReturn {func} => let val return = CFunction.return func in 0 = Vector.length args orelse (1 = Vector.length args andalso let val expects = #2 (Vector.first args) in Type.isSubtype (return, expects) andalso CType.equals (Type.toCType return, Type.toCType expects) end) end | Handler => true | Jump => true end val _ = check' (kind, "kind", kindOk, Kind.layout) val _ = Vector.foreach (statements, fn s => check' (s, "statement", statementOk, Statement.layout)) val _ = check' (transfer, "transfer", transferOk, Transfer.layout) in true end val blockOk = Trace.trace ("Rssa.blockOk", Block.layout, Bool.layout) blockOk val _ = Vector.foreach (blocks, fn b => check' (b, "block", blockOk, Block.layout)) in () end val _ = Vector.foreach (statics, fn stmt as {dst, ...} => (setVarType dst ; check' (Statement.Object stmt, "static", statementOk, Statement.layout))) val _ = List.foreach (functions, fn f => setFuncInfo (Function.name f, f)) val _ = checkFunction main val _ = List.foreach (functions, checkFunction) val _ = check' (main, "main function", fn f => let val {args, ...} = Function.dest f in Vector.isEmpty args end, Function.layout) val _ = Program.clear p val _ = finishCheckProfileLabel () val _ = if !handlersImplemented then checkHandlers p else () in () end handle Err.E e => (Layout.outputl (Err.layout e, Out.error) ; Error.bug "Rssa.typeCheck") end mlton-20210117+dfsg/mlton/backend/rssa-type-check.sig000066400000000000000000000007561416264345000222640ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_TYPE_CHECK_STRUCTS = sig include RSSA_TREE end signature RSSA_TYPE_CHECK = sig include RSSA_TYPE_CHECK_STRUCTS val typeCheck: Program.t -> unit end mlton-20210117+dfsg/mlton/backend/rssa.fun000066400000000000000000000004051416264345000202270ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Rssa (S: RSSA_STRUCTS): RSSA = RssaSimplify (RssaRestore (RssaLive (RssaShrink (RssaTypeCheck (RssaTree (S)))))) mlton-20210117+dfsg/mlton/backend/rssa.sig000066400000000000000000000003601416264345000202210ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RSSA_STRUCTS = RSSA_TREE_STRUCTS signature RSSA = sig include RSSA_SIMPLIFY end mlton-20210117+dfsg/mlton/backend/runtime.fun000066400000000000000000000121261416264345000207450ustar00rootroot00000000000000(* Copyright (C) 2009,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Runtime (S: RUNTIME_STRUCTS): RUNTIME = struct open S structure GCField = struct datatype t = AtomicState | CardMapAbsolute | CurSourceSeqIndex | ExnStack | Frontier | Limit | LimitPlusSlop | SignalIsPending | StackBottom | StackLimit | StackTop local fun make name = Bytes.fromIntInf (Control.StrMap.lookupIntInf (Promise.force Control.Target.consts, "offset::gcState." ^ name)) in val offset = fn AtomicState => make "atomicState" | CardMapAbsolute => make "generationalMaps.cardMapAbsolute" | CurSourceSeqIndex => make "sourceMaps.curSourceSeqIndex" | ExnStack => make "exnStack" | Frontier => make "frontier" | Limit => make "limit" | LimitPlusSlop => make "limitPlusSlop" | SignalIsPending => make "signalsInfo.signalIsPending" | StackBottom => make "stackBottom" | StackLimit => make "stackLimit" | StackTop => make "stackTop" end val toString = fn AtomicState => "AtomicState" | CardMapAbsolute => "CardMapAbsolute" | CurSourceSeqIndex => "CurSourceSeqIndex" | ExnStack => "ExnStack" | Frontier => "Frontier" | Limit => "Limit" | LimitPlusSlop => "LimitPlusSlop" | SignalIsPending => "SignalIsPending" | StackBottom => "StackBottom" | StackLimit => "StackLimit" | StackTop => "StackTop" val layout = Layout.str o toString end structure RObjectType = struct datatype t = Normal of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Sequence of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Stack | Weak of {gone: bool} fun layout (t: t): Layout.t = let open Layout in case t of Normal {hasIdentity, bytesNonObjptrs, numObjptrs} => seq [str "Normal ", record [("hasIdentity", Bool.layout hasIdentity), ("bytesNonObjptrs", Bytes.layout bytesNonObjptrs), ("numObjptrs", Int.layout numObjptrs)]] | Sequence {hasIdentity, bytesNonObjptrs, numObjptrs} => seq [str "Sequence ", record [("hasIdentity", Bool.layout hasIdentity), ("bytesNonObjptrs", Bytes.layout bytesNonObjptrs), ("numObjptrs", Int.layout numObjptrs)]] | Stack => str "Stack" | Weak {gone} => seq [str "Weak", record [("gone", Bool.layout gone)]] end val _ = layout (* quell unused warning *) end (* see gc/object.h *) local val maxTypeIndex = Int.pow (2, 19) in (* see gc/object.c:buildHeaderFromTypeIndex *) fun typeIndexToHeader typeIndex = (Assert.assert ("Runtime.header", fn () => 0 <= typeIndex andalso typeIndex < maxTypeIndex) ; Word.orb (0w1, Word.<< (Word.fromInt typeIndex, 0w1))) end (* see gc/object.h *) val objptrSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.objptr) (* see gc/object.h *) val headerSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.header) val headerOffset : unit -> Bytes.t = Promise.lazy (Bytes.~ o headerSize) (* see gc/sequence.h *) val sequenceLengthSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.seqIndex) val sequenceLengthOffset : unit -> Bytes.t = Promise.lazy (fn () => Bytes.~ (Bytes.+ (headerSize (), sequenceLengthSize ()))) (* see gc/sequence.h *) val sequenceCounterSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.seqIndex) val sequenceCounterOffset : unit -> Bytes.t = Promise.lazy (fn () => Bytes.~ (Bytes.+ (Bytes.+ (headerSize (), sequenceLengthSize ()), sequenceCounterSize ()))) (* see gc/object.h and gc/sequence.h *) val sequenceMetaDataSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.sequenceMetaData) val normalMetaDataSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.normalMetaData) val cpointerSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.cpointer) val labelSize = cpointerSize (* See gc/heap.h. *) val limitSlop = Bytes.fromInt 512 (* See gc/frame.h. *) val maxFrameSize = Bytes.fromInt (Int.pow (2, 16)) end mlton-20210117+dfsg/mlton/backend/runtime.sig000066400000000000000000000041541416264345000207410ustar00rootroot00000000000000(* Copyright (C) 2009,2016-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RUNTIME_STRUCTS = sig end signature RUNTIME = sig include RUNTIME_STRUCTS structure GCField: sig datatype t = AtomicState | CardMapAbsolute | CurSourceSeqIndex | ExnStack | Frontier (* The place where the next object is allocated. *) | Limit (* frontier + heapSize - LIMIT_SLOP *) | LimitPlusSlop (* frontier + heapSize *) | SignalIsPending | StackBottom | StackLimit (* Must have StackTop <= StackLimit *) | StackTop (* Points at the next available byte on the stack. *) val layout: t -> Layout.t val offset: t -> Bytes.t (* Field offset in struct GC_state. *) val toString: t -> string end structure RObjectType: sig datatype t = Normal of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Sequence of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Stack | Weak of {gone: bool} end val cpointerSize: unit -> Bytes.t val headerOffset: unit -> Bytes.t val headerSize: unit -> Bytes.t val labelSize: unit -> Bytes.t val limitSlop: Bytes.t val maxFrameSize: Bytes.t val normalMetaDataSize: unit -> Bytes.t val objptrSize: unit -> Bytes.t val sequenceCounterOffset: unit -> Bytes.t val sequenceCounterSize: unit -> Bytes.t val sequenceLengthOffset: unit -> Bytes.t val sequenceLengthSize: unit -> Bytes.t val sequenceMetaDataSize: unit -> Bytes.t val typeIndexToHeader: int -> word end mlton-20210117+dfsg/mlton/backend/signal-check.fun000066400000000000000000000154121416264345000216130ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SignalCheck (S: RSSA_TRANSFORM_STRUCTS): RSSA_TRANSFORM = struct open S structure CFunction = struct open CFunction Type.BuiltInCFunction end structure Graph = DirectedGraph local open Graph in structure Node = Node structure Forest = LoopForest end fun insertInFunction (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val {get = labelIndex: Label.t -> int, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val g = Graph.new () val n = Vector.length blocks val {get = nodeIndex: unit Node.t -> int, set = setNodeIndex, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("index", Node.layout)) val nodes = Vector.tabulate (n, fn i => let val n = Graph.newNode g val _ = setNodeIndex (n, i) in n end) val isHeader = Array.new (n, false) fun indexNode i = Vector.sub (nodes, i) val labelNode = indexNode o labelIndex val _ = Vector.foreachi (blocks, fn (i, Block.T {transfer, ...}) => let val from = indexNode i in if (case transfer of Transfer.CCall {func, ...} => CFunction.maySwitchThreadsFrom func | _ => false) then () else Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) end) val extra: Block.t list ref = ref [] fun addSignalCheck (Block.T {args, kind, label, statements, transfer}) : unit = let val collect = Label.newNoname () val collectReturn = Label.newNoname () val dontCollect = Label.newNoname () val res = Var.newNoname () val compare = Vector.new1 (Statement.PrimApp {args = (Vector.new2 (Operand.Runtime Runtime.GCField.Limit, Operand.null)), dst = SOME (res, Type.bool), prim = Prim.CPointer_equal}) val compareTransfer = Transfer.ifBool (Operand.Var {var = res, ty = Type.bool}, {falsee = dontCollect, truee = collect}) val func = CFunction.gc {maySwitchThreads = true} val _ = extra := Block.T {args = args, kind = kind, label = label, statements = compare, transfer = compareTransfer} :: (Block.T {args = Vector.new0 (), kind = Kind.Jump, label = collect, statements = Vector.new0 (), transfer = Transfer.CCall {args = Vector.new3 (Operand.GCState, Operand.zero (WordSize.csize ()), Operand.bool false), func = func, return = SOME collectReturn}}) :: (Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = collectReturn, statements = Vector.new0 (), transfer = Transfer.Goto {dst = dontCollect, args = Vector.new0 ()}}) :: Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect, statements = statements, transfer = transfer} :: !extra in () end (* Create extra blocks with signal checks for all blocks that are * loop headers. *) fun loop (f: int Forest.t) = let val {loops, ...} = Forest.dest f in Vector.foreach (loops, fn {headers, child} => let val _ = Vector.foreach (headers, fn i => let val _ = Array.update (isHeader, i, true) in addSignalCheck (Vector.sub (blocks, i)) end) val _ = loop child in () end) end (* Add a signal check at the function entry. *) val newStart = Label.newNoname () val _ = addSignalCheck (Block.T {args = Vector.new0 (), kind = Kind.Jump, label = newStart, statements = Vector.new0 (), transfer = Transfer.Goto {args = Vector.new0 (), dst = start}}) val () = loop (Graph.loopForestSteensgaard (g, {root = labelNode start, nodeValue = nodeIndex})) val blocks = Vector.keepAllMap (blocks, fn b as Block.T {label, ...} => if Array.sub (isHeader, labelIndex label) then NONE else SOME b) val blocks = Vector.concat [blocks, Vector.fromList (!extra)] val f = Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = newStart} val _ = Function.clear f in f end fun transform p = let val Program.T {functions, handlesSignals, main, objectTypes, profileInfo, statics} = p in if not handlesSignals then p else Program.T {functions = List.revMap (functions, insertInFunction), handlesSignals = handlesSignals, main = main, objectTypes = objectTypes, profileInfo = profileInfo, statics = statics} end end mlton-20210117+dfsg/mlton/backend/sources.cm000066400000000000000000000025231416264345000205540ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature MACHINE signature REP_TYPE signature RUNTIME functor Backend functor BackendAtoms functor Machine functor Rssa functor Ssa2ToRssa is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm ../ssa/sources.cm runtime.sig runtime.fun objptr-tycon.sig objptr-tycon.fun object-type.sig rep-type.sig rep-type.fun backend-atoms.sig backend-atoms.fun err.sml object.sig object.fun switch.sig switch.fun rssa-tree.sig rssa-tree.fun rssa-type-check.sig rssa-type-check.fun rssa-shrink.sig rssa-shrink.fun rssa-live.sig rssa-live.fun rssa-restore.sig rssa-restore.fun rssa-transform.sig bounce-vars.fun collect-statics.fun implement-handlers.fun implement-profiling.fun limit-check.fun signal-check.fun rssa-simplify.sig rssa-simplify.fun rssa.sig rssa.fun representation.sig packed-representation.fun ssa2-to-rssa.sig ssa2-to-rssa.fun machine.sig machine.fun allocate-variables.sig allocate-variables.fun equivalence-graph.sig equivalence-graph.fun chunkify.sig chunkify.fun parallel-move.sig parallel-move.fun backend.sig backend.fun mlton-20210117+dfsg/mlton/backend/sources.mlb000066400000000000000000000030231416264345000207230ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../ssa/sources.mlb runtime.sig runtime.fun objptr-tycon.sig objptr-tycon.fun object-type.sig rep-type.sig rep-type.fun backend-atoms.sig backend-atoms.fun err.sml object.sig object.fun switch.sig switch.fun rssa-tree.sig rssa-tree.fun rssa-type-check.sig rssa-type-check.fun rssa-shrink.sig rssa-shrink.fun rssa-live.sig rssa-live.fun rssa-restore.sig rssa-restore.fun rssa-transform.sig bounce-vars.fun collect-statics.fun implement-handlers.fun implement-profiling.fun limit-check.fun signal-check.fun rssa-simplify.sig rssa-simplify.fun rssa.sig rssa.fun representation.sig packed-representation.fun ssa2-to-rssa.sig ssa2-to-rssa.fun machine.sig machine.fun allocate-variables.sig allocate-variables.fun equivalence-graph.sig equivalence-graph.fun chunkify.sig chunkify.fun parallel-move.sig parallel-move.fun backend.sig backend.fun in signature MACHINE signature REP_TYPE signature RUNTIME functor Backend functor BackendAtoms functor Machine functor Rssa functor Ssa2ToRssa end mlton-20210117+dfsg/mlton/backend/ssa2-to-rssa.fun000066400000000000000000002510521416264345000215230ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2014,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Ssa2ToRssa (S: SSA2_TO_RSSA_STRUCTS): SSA2_TO_RSSA = struct open S open Rssa datatype z = datatype WordSize.prim structure S = Ssa2 local open Ssa2 in structure Base = Base end local open Runtime in structure GCField = GCField end structure CFunction = struct open CFunction open Type.BuiltInCFunction type t = Type.t CFunction.t structure CType = struct open CType val gcState = CPointer val intInf = Objptr val string = Objptr val thread = CPointer (* CHECK; thread (= objptr) would be better? *) end datatype z = datatype Convention.t datatype z = datatype SymbolScope.t datatype z = datatype Target.t val copyCurrentThread = fn () => T {args = Vector.new1 (Type.gcState ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = true, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new1 CType.gcState, NONE), return = Type.unit, symbolScope = Private, target = Direct "GC_copyCurrentThread"} (* CHECK; thread as objptr *) val copyThread = fn () => T {args = Vector.new2 (Type.gcState (), Type.thread ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = let open CType in (Vector.new2 (CPointer, CPointer), SOME CPointer) end, return = Type.thread (), symbolScope = Private, target = Direct "GC_copyThread"} val halt = fn () => T {args = Vector.new2 (Type.gcState (), Type.cint ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new2 (CType.gcState, CType.cint ()), NONE), return = Type.unit, symbolScope = Private, target = Direct "MLton_halt"} fun gcSequenceAllocate {return} = T {args = Vector.new4 (Type.gcState (), Type.csize (), Type.seqIndex (), Type.objptrHeader ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = SOME 1, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new4 (CType.gcState, CType.csize (), CType.seqIndex (), CType.objptrHeader ()), SOME CType.objptr), return = return, symbolScope = Private, target = Direct "GC_sequenceAllocate"} fun gcSequenceCopy (dt, st) = T {args = Vector.new6 (Type.gcState (), dt, Type.seqIndex (), st, Type.seqIndex (), Type.seqIndex ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = false, writesStackTop = false}, prototype = (Vector.new6 (CType.gcState, CType.Objptr, CType.seqIndex (), CType.Objptr, CType.seqIndex (), CType.seqIndex ()), NONE), return = Type.unit, symbolScope = Private, target = Direct "GC_sequenceCopy"} val returnToC = fn () => T {args = Vector.new0 (), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = true, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new0 (), NONE), return = Type.unit, symbolScope = Private, target = Direct "Thread_returnToC"} (* CHECK; thread as objptr *) val threadSwitchTo = fn () => T {args = Vector.new3 (Type.gcState (), Type.thread (), Type.csize ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = SOME 2, mayGC = true, maySwitchThreadsFrom = true, maySwitchThreadsTo = true, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new3 (CType.gcState, CType.thread, CType.csize ()), NONE), return = Type.unit, symbolScope = Private, target = Direct "GC_switchToThread"} (* CHECK; weak as objptr *) fun weakCanGet {arg} = T {args = Vector.new2 (Type.gcState (), arg), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = false, writesStackTop = false}, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME CType.bool), return = Type.bool, symbolScope = Private, target = Direct "GC_weakCanGet"} (* CHECK; weak as objptr *) fun weakGet {arg, return} = T {args = Vector.new2 (Type.gcState (), arg), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = false, writesStackTop = false}, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME CType.cpointer), return = return, symbolScope = Private, target = Direct "GC_weakGet"} (* CHECK; weak as objptr *) fun weakNew {arg, return} = T {args = Vector.new3 (Type.gcState (), Type.objptrHeader (), arg), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new3 (CType.gcState, CType.objptrHeader (), CType.cpointer), SOME (CType.cpointer)), return = return, symbolScope = Private, target = Direct "GC_weakNew"} val worldSave = fn () => T {args = Vector.new2 (Type.gcState (), Type.string ()), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, maySwitchThreadsFrom = false, maySwitchThreadsTo = true, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new2 (CType.gcState, CType.cpointer), NONE), return = Type.unit, symbolScope = Private, target = Direct "GC_saveWorld"} (* CHECK; share with objptr *) fun share t = T {args = Vector.new2 (Type.gcState (), t), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, (* MLton.share works by tracing an object. * Make sure all the GC invariants are true, * because tracing might encounter the current * stack in the heap. *) maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, (* actually, just readsFrontier *) readsStackTop = true, writesStackTop = true}, prototype = (Vector.new2 (CType.gcState, CType.cpointer), NONE), return = Type.unit, symbolScope = Private, target = Direct "GC_share"} (* CHECK; size with objptr *) fun size t = T {args = Vector.new2 (Type.gcState (), t), convention = Cdecl, inline = false, kind = Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = true, (* MLton.size works by tracing an object. * Make sure all the GC invariants are true, * because tracing might encounter the current * stack in the heap. *) maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = true, writesStackTop = true}, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME (CType.csize ())), return = Type.csize (), symbolScope = Private, target = Direct "GC_size"} fun amAllocationProfiling () = Control.ProfileAlloc = !Control.profile val intInfBinary = fn name => CFunction.T {args = Vector.new4 (Type.gcState (), Type.intInf (), Type.intInf (), Type.csize ()), convention = Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = SOME 3, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = amAllocationProfiling (), writesStackTop = false}, prototype = (Vector.new4 (CType.gcState, CType.intInf, CType.intInf, CType.csize ()), SOME CType.intInf), return = Type.intInf (), symbolScope = Private, target = Direct (Prim.toString name)} val intInfCompare = fn name => (* CHECK; cint would be better? *) CFunction.T {args = Vector.new3 (Type.gcState (), Type.intInf (), Type.intInf ()), convention = Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = NONE, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = false, readsStackTop = false, writesStackTop = false}, prototype = (Vector.new3 (CType.gcState, CType.intInf, CType.intInf), SOME CType.compareRes), return = Type.compareRes, symbolScope = Private, target = Direct (Prim.toString name)} val intInfShift = fn name => CFunction.T {args = Vector.new4 (Type.gcState (), Type.intInf (), Type.shiftArg, Type.csize ()), convention = Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = SOME 3, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = amAllocationProfiling (), writesStackTop = false}, prototype = (Vector.new4 (CType.gcState, CType.intInf, CType.shiftArg, CType.csize ()), SOME CType.intInf), return = Type.intInf (), symbolScope = Private, target = Direct (Prim.toString name)} val intInfToString = fn name => (* CHECK; cint would be better? *) CFunction.T {args = Vector.new4 (Type.gcState (), Type.intInf (), Type.word WordSize.word32, Type.csize ()), convention = Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = SOME 3, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = amAllocationProfiling (), writesStackTop = false}, prototype = (Vector.new4 (CType.gcState, CType.intInf, CType.Int32, CType.csize ()), SOME CType.string), return = Type.string (), symbolScope = Private, target = Direct (Prim.toString name)} val intInfUnary = fn name => CFunction.T {args = Vector.new3 (Type.gcState (), Type.intInf (), Type.csize ()), convention = Cdecl, inline = false, kind = CFunction.Kind.Runtime {bytesNeeded = SOME 2, ensuresBytesFree = NONE, mayGC = false, maySwitchThreadsFrom = false, maySwitchThreadsTo = false, modifiesFrontier = true, readsStackTop = amAllocationProfiling (), writesStackTop = false}, prototype = (Vector.new3 (CType.gcState, CType.intInf, CType.csize ()), SOME CType.intInf), return = Type.intInf (), symbolScope = Private, target = Direct (Prim.toString name)} end structure Prim = struct local structure CFunction' = CFunction in open Prim structure CFunction = CFunction' end datatype u = datatype t type t = Type.t t fun cFunctionRaise (p: t): CFunction.t = let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val name = toString p val real = Type.real val word = Type.word val vanilla = CFunction.vanilla fun wordCType (s, sg) = CType.word (s, sg) fun realCType s = CType.real s fun coerce (t1, ct1, t2, ct2) = vanilla {args = Vector.new1 t1, name = name, prototype = (Vector.new1 ct1, SOME ct2), return = t2} local fun make n s = let val t = real s val ct = CType.real s in vanilla {args = Vector.new (n, t), name = name, prototype = (Vector.new (n, ct), SOME ct), return = t} end in val realBinary = make 2 val realTernary = make 3 val realUnary = make 1 end fun realCompare s = let val t = real s in vanilla {args = Vector.new2 (t, t), name = name, prototype = let val t = CType.real s in (Vector.new2 (t, t), SOME CType.bool) end, return = Type.bool} end local fun make n (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new (n, t), name = name, prototype = (Vector.new (n, ct), SOME ct), return = t} end fun makeCheckP n (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new (n, t), name = name, prototype = (Vector.new (n, ct), SOME CType.bool), return = Type.bool} end in val wordBinary = make 2 val wordBinaryCheckP = makeCheckP 2 val wordUnary = make 1 val wordUnaryCheckP = makeCheckP 1 end fun wordCompare (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new2 (t, t), name = name, prototype = (Vector.new2 (ct, ct), SOME CType.bool), return = Type.bool} end fun wordShift (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new2 (t, Type.shiftArg), name = name, prototype = (Vector.new2 (ct, CType.shiftArg), SOME ct), return = t} end in case p of Real_Math_acos s => realUnary s | Real_Math_asin s => realUnary s | Real_Math_atan s => realUnary s | Real_Math_atan2 s => realBinary s | Real_Math_cos s => realUnary s | Real_Math_exp s => realUnary s | Real_Math_ln s => realUnary s | Real_Math_log10 s => realUnary s | Real_Math_sin s => realUnary s | Real_Math_sqrt s => realUnary s | Real_Math_tan s => realUnary s | Real_abs s => realUnary s | Real_add s => realBinary s | Real_castToWord (s1, s2) => coerce (real s1, realCType s1, word s2, wordCType (s2, {signed = false})) | Real_div s => realBinary s | Real_equal s => realCompare s | Real_ldexp s => let val t = real s val ct = CType.real s in vanilla {args = Vector.new2 (t, Type.cint ()), name = name, prototype = (Vector.new2 (ct, CType.cint ()), SOME ct), return = t} end | Real_le s => realCompare s | Real_lt s => realCompare s | Real_mul s => realBinary s | Real_muladd s => realTernary s | Real_mulsub s => realTernary s | Real_neg s => realUnary s | Real_qequal s => realCompare s | Real_rndToReal (s1, s2) => coerce (real s1, realCType s1, real s2, realCType s2) | Real_rndToWord (s1, s2, sg) => coerce (real s1, realCType s1, word s2, wordCType (s2, sg)) | Real_round s => realUnary s | Real_sub s => realBinary s | Thread_returnToC => CFunction.returnToC () | Word_add s => wordBinary (s, {signed = false}) | Word_addCheckP (s, sg) => wordBinaryCheckP (s, sg) | Word_andb s => wordBinary (s, {signed = false}) | Word_castToReal (s1, s2) => coerce (word s1, wordCType (s1, {signed = false}), real s2, realCType s2) | Word_equal s => wordCompare (s, {signed = false}) | Word_extdToWord (s1, s2, sg) => coerce (word s1, wordCType (s1, sg), word s2, wordCType (s2, {signed = false})) | Word_lshift s => wordShift (s, {signed = false}) | Word_lt z => wordCompare z | Word_mul z => wordBinary z | Word_mulCheckP (s, sg) => wordBinaryCheckP (s, sg) | Word_neg s => wordUnary (s, {signed = false}) | Word_negCheckP (s, sg) => wordUnaryCheckP (s, sg) | Word_notb s => wordUnary (s, {signed = false}) | Word_orb s => wordBinary (s, {signed = false}) | Word_quot z => wordBinary z | Word_rem z => wordBinary z | Word_rndToReal (s1, s2, sg) => coerce (word s1, wordCType (s1, sg), real s2, realCType s2) | Word_xorb s => wordBinary (s, {signed = false}) | Word_rol s => wordShift (s, {signed = false}) | Word_ror s => wordShift (s, {signed = false}) | Word_rshift z => wordShift z | Word_sub s => wordBinary (s, {signed = false}) | Word_subCheckP (s, sg) => wordBinaryCheckP (s, sg) | _ => Error.bug "SsaToRssa.Name.cFunctionRaise" end fun cFunction p = SOME (cFunctionRaise p) handle _ => NONE end datatype z = datatype Operand.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure PackedRepresentation = PackedRepresentation (structure Rssa = Rssa structure Ssa2 = Ssa2) structure Type = struct open Type fun scale (ty: t): Scale.t = case Scale.fromBytes (bytes ty) of NONE => Error.bug "SsaToRssa.Type.scale" | SOME s => s end val cardSizeLog2 : IntInf.t = 8 (* must agree with CARD_SIZE_LOG2 in gc.c *) fun updateCard (addr: Operand.t): Statement.t list = let val index = Var.newNoname () (* CHECK; WordSize.objptr or WordSize.cpointer? *) val sz = WordSize.objptr () val indexTy = Type.word sz val cardElemSize = WordSize.fromBits Bits.inByte in [PrimApp {args = (Vector.new2 (Operand.cast (addr, Type.bits (WordSize.bits sz)), Operand.word (WordX.fromIntInf (cardSizeLog2, WordSize.shiftArg)))), dst = SOME (index, indexTy), prim = Prim.Word_rshift (sz, {signed = false})}, Move {dst = (SequenceOffset {base = Runtime GCField.CardMapAbsolute, index = Var {ty = indexTy, var = index}, offset = Bytes.zero, scale = Scale.One, ty = Type.word cardElemSize}), src = Operand.word (WordX.one cardElemSize)}] end fun convertWordSize (ws: WordSize.t): WordSize.t = WordSize.roundUpToPrim ws fun convertWordX (w: WordX.t): WordX.t = WordX.resize (w, convertWordSize (WordX.size w)) fun convert (program as S.Program.T {functions, globals, main, ...}, {codegenImplementsPrim: Rssa.Type.t Rssa.Prim.t -> bool}): Rssa.Program.t = let val {diagnostic, genCase, object, objectTypes, select, sequence, toRtype, update} = PackedRepresentation.compute program val objectTypes = Vector.concat [ObjectType.basic (), objectTypes] val () = Vector.foreachi (objectTypes, fn (i, (opt, _)) => ObjptrTycon.setIndex (opt, i)) val objectTypes = Vector.map (objectTypes, #2) val () = diagnostic () val newObjectTypes = ref [] local fun componentsHash cs = Prod.hash (cs, Type.hash) fun componentsEquals (cs1, cs2) = Prod.equals (cs1, cs2, Type.equals) val h = HashTable.new {hash = componentsHash, equals = componentsEquals} in fun allocRawOpt components = HashTable.lookupOrInsert (h, components, fn () => let val rawComponents = Prod.map (components, fn ty => if Type.isObjptr ty then Type.bits (Type.width ty) else ty) val rawTy = ObjectType.Sequence {components = rawComponents, hasIdentity = true} val rawOpt = ObjptrTycon.new () val () = ObjptrTycon.setIndex (rawOpt, Vector.length objectTypes + HashTable.size h) val () = List.push (newObjectTypes, rawTy) in rawOpt end) end val {get = varInfo: Var.t -> {ty: S.Type.t}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("varInfo", Var.layout)) val setVarInfo = Trace.trace2 ("SsaToRssa.setVarInfo", Var.layout, S.Type.layout o #ty, Unit.layout) setVarInfo val varType = #ty o varInfo fun varOp (x: Var.t): Operand.t = Var {var = x, ty = valOf (toRtype (varType x))} val varOp = Trace.trace ("SsaToRssa.varOp", Var.layout, Operand.layout) varOp fun varOps xs = Vector.map (xs, varOp) val extraBlocks = ref [] fun newBlock {args, kind, statements: Statement.t vector, transfer: Transfer.t}: Label.t = let val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = args, kind = kind, label = l, statements = statements, transfer = transfer}) in l end val {get = labelInfo: (Label.t -> {args: (Var.t * S.Type.t) vector, cont: (Handler.t * Label.t) list ref, handler: Label.t option ref}), set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("label info", Label.layout)) fun translateCase ({test: Var.t, cases: (Con.t, Label.t) S.Cases.t, default: Label.t option}) : Statement.t list * Transfer.t = case cases of S.Cases.Con cases => (case (Vector.length cases, default) of (0, NONE) => ([], Transfer.bug ()) | _ => (case S.Type.dest (varType test) of S.Type.Datatype tycon => let val test = fn () => varOp test val cases = Vector.map (cases, fn (con, dst) => {con = con, dst = dst, dstHasArg = Vector.fold (#args (labelInfo dst), false, fn ((_,ty),b) => b orelse isSome (toRtype ty))}) val (ss, t, blocks) = genCase {cases = cases, default = default, test = test, tycon = tycon} val () = extraBlocks := blocks @ !extraBlocks in (ss, t) end | _ => Error.bug "SsaToRssa.translateCase: strange type")) | S.Cases.Word (s, cases) => let val cases = QuickSort.sortVector (Vector.map (cases, fn (w, l) => (convertWordX w, l)), fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) in ([], Switch (Switch.T {cases = cases, default = default, expect = NONE, size = convertWordSize s, test = varOp test})) end fun eta (l: Label.t, kind: Kind.t): Label.t = let val {args, ...} = labelInfo l val args = Vector.keepAllMap (args, fn (x, t) => Option.map (toRtype t, fn t => (Var.new x, t))) val l' = Label.new l val _ = List.push (extraBlocks, Block.T {args = args, kind = kind, label = l', statements = Vector.new0 (), transfer = (Transfer.Goto {dst = l, args = Vector.map (args, fn (var, ty) => Var {var = var, ty = ty})})}) in l' end fun labelHandler (l: Label.t): Label.t = let val {handler, ...} = labelInfo l in case !handler of NONE => let val l' = eta (l, Kind.Handler) val _ = handler := SOME l' in l' end | SOME l => l end fun labelCont (l: Label.t, h: Handler.t): Label.t = let val {cont, ...} = labelInfo l datatype z = datatype Handler.t in case List.peek (!cont, fn (h', _) => Handler.equals (h, h')) of SOME (_, l) => l | NONE => let val l' = eta (l, Kind.Cont {handler = h}) val _ = List.push (cont, (h, l')) in l' end end val labelCont = Trace.trace2 ("SsaToRssa.labelCont", Label.layout, Handler.layout, Label.layout) labelCont fun vos (xs: Var.t vector) = Vector.keepAllMap (xs, fn x => Option.map (toRtype (varType x), fn _ => varOp x)) fun bogus (t: Type.t): Operand.t = case Type.deReal t of NONE => Operand.cast (Operand.word (Type.bogusWord t), t) | SOME s => Operand.Const (Const.real (RealX.zero s)) val handlesSignals = S.Program.hasPrim (program, fn p => case p of Prim.MLton_installSignalHandler => true | _ => false) fun translateFormals v = Vector.keepAllMap (v, fn (x, t) => Option.map (toRtype t, fn t => (x, t))) fun translatePrim p = Prim.map (p, fn t => case toRtype t of NONE => Type.unit | SOME t => t) fun translateTransfer (t: S.Transfer.t): (Statement.t list * Transfer.t) = case t of S.Transfer.Bug => ([], Transfer.bug ()) | S.Transfer.Call {func, args, return} => let datatype z = datatype S.Return.t val return = case return of Dead => Return.Dead | NonTail {cont, handler} => let datatype z = datatype S.Handler.t val handler = case handler of Caller => Handler.Caller | Dead => Handler.Dead | Handle l => Handler.Handle (labelHandler l) in Return.NonTail {cont = labelCont (cont, handler), handler = handler} end | Tail => Return.Tail in ([], Transfer.Call {func = func, args = vos args, return = return}) end | S.Transfer.Case r => translateCase r | S.Transfer.Goto {dst, args} => ([], Transfer.Goto {dst = dst, args = vos args}) | S.Transfer.Raise xs => ([], Transfer.Raise (vos xs)) | S.Transfer.Return xs => ([], Transfer.Return (vos xs)) | S.Transfer.Runtime {args, prim, return} => (case prim of Prim.Thread_copyCurrent => let val func = CFunction.copyCurrentThread () val l = newBlock {args = Vector.new0 (), kind = Kind.CReturn {func = func}, statements = Vector.new0 (), transfer = (Goto {args = Vector.new0 (), dst = return})} in ([], Transfer.CCall {args = Vector.concat [Vector.new1 GCState, vos args], func = func, return = SOME l}) end | _ => Error.bug (concat ["SsaToRssa.translateTransfer: ", "strange Runtime prim: ", Prim.toString prim])) fun translateStatementsTransfer (statements, ss, transfer) = let fun loop (i, ss, t): Statement.t vector * Transfer.t = if i < 0 then (Vector.fromList ss, t) else let fun none () = loop (i - 1, ss, t) fun add s = loop (i - 1, s :: ss, t) fun add2 (s1, s2) = loop (i - 1, s1 :: s2 :: ss, t) fun adds ss' = loop (i - 1, ss' @ ss, t) val s = Vector.sub (statements, i) in case s of S.Statement.Profile e => add (Statement.Profile e) | S.Statement.Update {base, offset, value} => (case toRtype (varType value) of NONE => none () | SOME t => let val baseOp = Base.map (base, varOp) val ss = update {base = baseOp, baseTy = varType (Base.object base), offset = offset, value = varOp value} val ss = if !Control.markCards andalso Type.isObjptr t then updateCard (Base.object baseOp) @ ss else ss in adds ss end) | S.Statement.Bind {exp, ty, var} => let fun split (args, kind, ss: Statement.t list, make: Label.t -> Statement.t list * Transfer.t) = let val l = newBlock {args = args, kind = kind, statements = Vector.fromList ss, transfer = t} val (ss, t) = make l in loop (i - 1, ss, t) end fun maybeMove (f: Type.t -> Operand.t) = case toRtype ty of NONE => none () | SOME ty => add (Bind {dst = (valOf var, ty), pinned = false, src = f ty}) fun move (src: Operand.t) = maybeMove (fn _ => src) in case exp of S.Exp.Const c => (case c of Const.IntInf i => let fun doit c = maybeMove (fn ty => Operand.cast (Const c, ty)) in case Const.IntInfRep.fromIntInf i of Const.IntInfRep.Big v => doit (Const.WordVector v) | Const.IntInfRep.Small w => doit (Const.Word w) end | Const.Word w => move (Const (Const.Word (convertWordX w))) | _ => move (Const c)) | S.Exp.Inject {variant, ...} => if isSome (toRtype ty) then move (varOp variant) else none () | S.Exp.Object {args, con} => (case toRtype ty of NONE => none () | SOME dstTy => adds (object {args = args, con = con, dst = (valOf var, dstTy), objectTy = ty, oper = varOp})) | S.Exp.PrimApp {args, prim} => let val prim = translatePrim prim fun arg i = Vector.sub (args, i) fun a i = varOp (arg i) fun cast () = move (Operand.cast (a 0, valOf (toRtype ty))) fun ifIsWeakPointer (ty: S.Type.t, yes, no) = case S.Type.dest ty of S.Type.Weak ty => (case toRtype ty of NONE => no () | SOME t => if Type.isObjptr t then yes t else no ()) | _ => Error.bug "SsaToRssa.ifIsWeakPointer" fun arrayOrVectorLength () = move (Offset {base = a 0, offset = Runtime.sequenceLengthOffset (), ty = Type.seqIndex ()}) fun subWord s = let val ty = Type.word s in move (SequenceOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}) end fun dst () = case var of SOME x => Option.map (toRtype (varType x), fn t => (x, t)) | NONE => NONE fun primApp (prim, args) = add (PrimApp {dst = dst (), prim = prim, args = args}) fun bumpAtomicState n = let val atomicState = Runtime GCField.AtomicState val res = Var.newNoname () val resTy = Operand.ty atomicState in [Statement.PrimApp {args = (Vector.new2 (atomicState, (Operand.word (WordX.fromInt (n, WordSize.word32))))), dst = SOME (res, resTy), prim = Prim.Word_add WordSize.word32}, Statement.Move {dst = atomicState, src = Var {ty = resTy, var = res}}] end fun ccall {args: Operand.t vector, func: CFunction.t} = let val formals = case dst () of NONE => Vector.new0 () | SOME (x, t) => Vector.new1 (x, t) in split (formals, Kind.CReturn {func = func}, ss, fn l => ([], Transfer.CCall {args = args, func = func, return = SOME l})) end fun simpleCCall (f: CFunction.t) = ccall {args = vos args, func = f} fun simpleCCallWithGCState (f: CFunction.t) = ccall {args = Vector.concat [Vector.new1 GCState, vos args], func = f} fun sequenceAlloc (numElts: Operand.t, opt) = let val result = valOf (toRtype ty) val args = Vector.new4 (GCState, Operand.zero (WordSize.csize ()), numElts, ObjptrTycon opt) val func = CFunction.gcSequenceAllocate {return = result} in ccall {args = args, func = func} end fun cpointerGet () = maybeMove (fn ty => SequenceOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}) fun cpointerSet () = let val src = a 2 val ty = Operand.ty src in add (Move {dst = SequenceOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}, src = a 2}) end fun codegenOrC (p: Prim.t, args) = if codegenImplementsPrim p then primApp (p, args) else (case Prim.cFunction p of NONE => Error.bug (concat ["SsaToRssa.codegenOrC: ", "unimplemented prim:", Prim.toString p]) | SOME func => ccall {args = args, func = func}) fun simpleCodegenOrC (p: Prim.t) = codegenOrC (p, varOps args) in case prim of Prim.Array_alloc {raw} => let val allocOpt = fn () => let val result = valOf (toRtype ty) val opt = case Type.deObjptr result of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_alloc" | SOME opt => opt in opt end val allocRawOpt = fn () => let val result = valOf (toRtype ty) val arrOpt = case Type.deObjptr result of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_allocRaw" | SOME arrOpt => arrOpt val arrTy = Vector.sub (objectTypes, ObjptrTycon.index arrOpt) val arrComponents = case arrTy of ObjectType.Sequence {components, ...} => components | _ => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_allocRaw" val rawOpt = allocRawOpt arrComponents in rawOpt end in sequenceAlloc (a 0, if raw then allocRawOpt () else allocOpt ()) end | Prim.Array_copyArray => simpleCCallWithGCState (CFunction.gcSequenceCopy (Operand.ty (a 0), Operand.ty (a 2))) | Prim.Array_copyVector => simpleCCallWithGCState (CFunction.gcSequenceCopy (Operand.ty (a 0), Operand.ty (a 2))) | Prim.Array_length => arrayOrVectorLength () | Prim.Array_toArray => let val rawarr = a 0 val arrTy = valOf (toRtype ty) val arrOpt = case Type.deObjptr arrTy of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_toArray" | SOME arrOpt => arrOpt in add2 (Move {dst = (Offset {base = rawarr, offset = Runtime.headerOffset (), ty = Type.objptrHeader ()}), src = ObjptrTycon arrOpt}, Bind {dst = (valOf var, arrTy), pinned = false, src = Operand.cast (rawarr, arrTy)}) end | Prim.Array_toVector => let val sequence = a 0 val vecTy = valOf (toRtype ty) val vecOpt = case Type.deObjptr vecTy of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_toVector" | SOME vecOpt => vecOpt in add2 (Move {dst = (Offset {base = sequence, offset = Runtime.headerOffset (), ty = Type.objptrHeader ()}), src = ObjptrTycon vecOpt}, Bind {dst = (valOf var, vecTy), pinned = false, src = Operand.cast (sequence, vecTy)}) end | Prim.Array_uninit => let val sequence = a 0 val sequenceTy = varType (arg 0) val index = a 1 val eltTys = case S.Type.deSequenceOpt sequenceTy of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_uninit" | SOME eltTys => eltTys val sss = Vector.toListKeepAllMapi (S.Prod.dest eltTys, fn (offset, {elt, ...}) => case toRtype elt of NONE => NONE | SOME elt => if not (Type.isObjptr elt) then NONE else (SOME o update) {base = Base.SequenceSub {index = index, sequence = sequence}, baseTy = sequenceTy, offset = offset, value = bogus elt}) in adds (List.concat sss) end | Prim.Array_uninitIsNop => let val sequenceTy = varType (arg 0) val eltTys = case S.Type.deSequenceOpt sequenceTy of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_uninitIsNop" | SOME eltTys => eltTys val isNop = Vector.forall (S.Prod.dest eltTys, fn {elt, ...} => case toRtype elt of NONE => true | SOME elt => not (Type.isObjptr elt)) in move (Operand.bool isNop) end | Prim.CFunction f => simpleCCall f | Prim.CPointer_getCPointer => cpointerGet () | Prim.CPointer_getObjptr => cpointerGet () | Prim.CPointer_getReal _ => cpointerGet () | Prim.CPointer_getWord _ => cpointerGet () | Prim.CPointer_setCPointer => cpointerSet () | Prim.CPointer_setObjptr => cpointerSet () | Prim.CPointer_setReal _ => cpointerSet () | Prim.CPointer_setWord _ => cpointerSet () | Prim.GC_collect => ccall {args = (Vector.new3 (GCState, Operand.zero (WordSize.csize ()), Operand.bool true)), func = (CFunction.gc {maySwitchThreads = handlesSignals})} | Prim.GC_state => move GCState | Prim.IntInf_add => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_andb => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_arshift => simpleCCallWithGCState (CFunction.intInfShift prim) | Prim.IntInf_compare => simpleCCallWithGCState (CFunction.intInfCompare prim) | Prim.IntInf_gcd => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_lshift => simpleCCallWithGCState (CFunction.intInfShift prim) | Prim.IntInf_mul => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_neg => simpleCCallWithGCState (CFunction.intInfUnary prim) | Prim.IntInf_notb => simpleCCallWithGCState (CFunction.intInfUnary prim) | Prim.IntInf_orb => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_quot => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_rem => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_sub => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.IntInf_toString => simpleCCallWithGCState (CFunction.intInfToString prim) | Prim.IntInf_toVector => cast () | Prim.IntInf_toWord => cast () | Prim.IntInf_xorb => simpleCCallWithGCState (CFunction.intInfBinary prim) | Prim.MLton_bug => loop (i - 1, [], Transfer.CCall {args = vos args, func = CFunction.bug (), return = NONE}) | Prim.MLton_bogus => (case toRtype ty of NONE => none () | SOME t => move (bogus t)) | Prim.MLton_eq => (case toRtype (varType (arg 0)) of NONE => move (Operand.bool true) | SOME t => let val ws = WordSize.fromBits (Type.width t) val wordEqual = Prim.Word_equal ws val args = varOps args val (prim, args) = case Type.toCType t of CType.CPointer => (Prim.CPointer_equal, args) | CType.Objptr => (wordEqual, Vector.map (args, fn arg => Operand.cast (arg, Type.word ws))) | CType.Word8 => (wordEqual, args) | CType.Word16 => (wordEqual, args) | CType.Word32 => (wordEqual, args) | CType.Word64 => (wordEqual, args) | _ => Error.bug (concat ["SsaToRssa.translateStatementsTransfer: PrimApp,MLton_eq,", Layout.toString (Type.layout t)]) in codegenOrC (prim, args) end) | Prim.MLton_halt => simpleCCallWithGCState (CFunction.halt ()) | Prim.MLton_installSignalHandler => none () | Prim.MLton_share => (case toRtype (varType (arg 0)) of NONE => none () | SOME t => if not (Type.isObjptr t) then none () else simpleCCallWithGCState (CFunction.share (Operand.ty (a 0)))) | Prim.MLton_size => (case toRtype (varType (arg 0)) of NONE => move (Operand.word (WordX.zero (WordSize.csize ()))) | SOME t => if not (Type.isObjptr t) then move (Operand.word (WordX.zero (WordSize.csize ()))) else simpleCCallWithGCState (CFunction.size (Operand.ty (a 0)))) | Prim.MLton_touch => let val a = arg 0 in if isSome (toRtype (varType a)) then primApp (prim, Vector.new1 (varOp a)) else none () end | Prim.Thread_atomicBegin => (* gcState.atomicState++; * if (gcState.signalsInfo.signalIsPending) * gcState.limit = gcState.limitPlusSlop - LIMIT_SLOP; *) split (Vector.new0 (), Kind.Jump, ss, fn continue => let datatype z = datatype GCField.t val tmp = Var.newNoname () val size = WordSize.cpointer () val ty = Type.cpointer () val statements = Vector.new2 (Statement.PrimApp {args = (Vector.new2 (Runtime LimitPlusSlop, Operand.word (WordX.fromBytes (Runtime.limitSlop, size)))), dst = SOME (tmp, ty), prim = Prim.CPointer_sub}, Statement.Move {dst = Runtime Limit, src = Var {ty = ty, var = tmp}}) val signalIsPending = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = statements, transfer = (Transfer.Goto {args = Vector.new0 (), dst = continue})} in (bumpAtomicState 1, if handlesSignals then Transfer.ifBool (Runtime SignalIsPending, {falsee = continue, truee = signalIsPending}) else Transfer.Goto {args = Vector.new0 (), dst = continue}) end) | Prim.Thread_atomicEnd => (* gcState.atomicState--; * if (gcState.signalsInfo.signalIsPending * and 0 == gcState.atomicState) * gc; *) split (Vector.new0 (), Kind.Jump, ss, fn continue => let datatype z = datatype GCField.t val func = CFunction.gc {maySwitchThreads = true} val returnFromHandler = newBlock {args = Vector.new0 (), kind = Kind.CReturn {func = func}, statements = Vector.new0 (), transfer = Goto {args = Vector.new0 (), dst = continue}} val args = Vector.new3 (GCState, Operand.zero (WordSize.csize ()), Operand.bool false) val switchToHandler = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = Vector.new0 (), transfer = Transfer.CCall {args = args, func = func, return = SOME returnFromHandler}} val testAtomicState = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = Vector.new0 (), transfer = Transfer.ifZero (Runtime AtomicState, {falsee = continue, truee = switchToHandler})} in (bumpAtomicState ~1, if handlesSignals then Transfer.ifBool (Runtime SignalIsPending, {falsee = continue, truee = testAtomicState}) else Transfer.Goto {args = Vector.new0 (), dst = continue}) end) | Prim.Thread_atomicState => move (Runtime GCField.AtomicState) | Prim.Thread_copy => simpleCCallWithGCState (CFunction.copyThread ()) | Prim.Thread_switchTo => ccall {args = (Vector.new3 (GCState, a 0, Operand.zero (WordSize.csize ()))), func = CFunction.threadSwitchTo ()} | Prim.Vector_length => arrayOrVectorLength () | Prim.Weak_canGet => ifIsWeakPointer (varType (arg 0), fn _ => simpleCCallWithGCState (CFunction.weakCanGet {arg = Operand.ty (a 0)}), fn () => move (Operand.bool false)) | Prim.Weak_get => ifIsWeakPointer (varType (arg 0), fn t => simpleCCallWithGCState (CFunction.weakGet {arg = Operand.ty (a 0), return = t}), fn () => (case toRtype ty of NONE => none () | SOME t => move (bogus t))) | Prim.Weak_new => ifIsWeakPointer (ty, fn t => let val result = valOf (toRtype ty) val header = ObjptrTycon (case Type.deObjptr result of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Weak_new" | SOME opt => opt) val func = CFunction.weakNew {arg = t, return = result} in ccall {args = (Vector.concat [Vector.new2 (GCState, header), vos args]), func = func} end, none) | Prim.Word_equal s => simpleCodegenOrC (Prim.Word_equal (WordSize.roundUpToPrim s)) | Prim.Word_toIntInf => cast () | Prim.Word_extdToWord (s1, s2, {signed}) => if WordSize.equals (s1, s2) then move (a 0) else let val signed = signed andalso Bits.< (WordSize.bits s1, WordSize.bits s2) val s1 = WordSize.roundUpToPrim s1 val s2 = WordSize.roundUpToPrim s2 in if WordSize.equals (s1, s2) then cast () else simpleCodegenOrC (Prim.Word_extdToWord (s1, s2, {signed = signed})) end | Prim.WordVector_toIntInf => cast () | Prim.WordArray_subWord {eleSize, ...} => subWord eleSize | Prim.WordArray_updateWord {eleSize, ...} => let val ty = Type.word eleSize in add (Move {dst = (SequenceOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}), src = a 2}) end | Prim.WordVector_subWord {eleSize, ...} => subWord eleSize | Prim.World_save => simpleCCallWithGCState (CFunction.worldSave ()) | _ => simpleCodegenOrC prim end | S.Exp.Select {base, offset} => (case var of NONE => none () | SOME var => (case toRtype ty of NONE => none () | SOME ty => adds (select {base = Base.map (base, varOp), baseTy = varType (Base.object base), dst = (var, ty), offset = offset}))) | S.Exp.Sequence {args} => (case toRtype ty of NONE => none () | SOME dstTy => adds (sequence {args = args, dst = (valOf var, dstTy), sequenceTy = ty, oper = varOp})) | S.Exp.Var y => (case toRtype ty of NONE => none () | SOME _ => move (varOp y)) end end in loop (Vector.length statements - 1, ss, transfer) end fun translateBlock (S.Block.T {label, args, statements, transfer}) = let val (ss, t) = translateTransfer transfer val (ss, t) = translateStatementsTransfer (statements, ss, t) in Block.T {args = translateFormals args, kind = Kind.Jump, label = label, statements = ss, transfer = t} end fun translateFunction (f: S.Function.t): Function.t = let val _ = S.Function.foreachVar (f, fn (x, t) => setVarInfo (x, {ty = t})) val {args, blocks, name, raises, returns, start, ...} = S.Function.dest f val _ = Vector.foreach (blocks, fn S.Block.T {label, args, ...} => setLabelInfo (label, {args = args, cont = ref [], handler = ref NONE})) val blocks = Vector.map (blocks, translateBlock) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val _ = extraBlocks := [] fun transTypes (ts : S.Type.t vector option) : Type.t vector option = Option.map (ts, fn ts => Vector.keepAllMap (ts, toRtype)) in Function.new {args = translateFormals args, blocks = blocks, name = name, raises = transTypes raises, returns = transTypes returns, start = start} end val main = let val start = Label.newNoname () in translateFunction (S.Function.profile (S.Function.new {args = Vector.new0 (), blocks = (Vector.new1 (S.Block.T {label = start, args = Vector.new0 (), statements = globals, transfer = (S.Transfer.Call {args = Vector.new0 (), func = main, return = S.Return.Tail})})), mayInline = false, (* doesn't matter *) name = Func.newString "initGlobals", raises = NONE, returns = NONE, start = start}, S.SourceInfo.main)) end val functions = List.revMap (functions, translateFunction) val p = Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = Vector.concat [objectTypes, Vector.fromListRev (!newObjectTypes)], profileInfo = NONE, statics = Vector.new0 ()} val _ = Program.clear p in p end end mlton-20210117+dfsg/mlton/backend/ssa2-to-rssa.sig000066400000000000000000000012101416264345000215020ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA2_TO_RSSA_STRUCTS = sig structure Rssa: RSSA structure Ssa2: SSA2 sharing Rssa.Atoms = Ssa2.Atoms end signature SSA2_TO_RSSA = sig include SSA2_TO_RSSA_STRUCTS val convert: Ssa2.Program.t * {codegenImplementsPrim: Rssa.Type.t Rssa.Prim.t -> bool} -> Rssa.Program.t end mlton-20210117+dfsg/mlton/backend/switch.fun000066400000000000000000000061561416264345000205710ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Switch (S: SWITCH_STRUCTS): SWITCH = struct open S fun isRedundant {cases: 'a vector, equals: 'a * 'a -> bool}: bool = let val nCases = Vector.length cases in 0 < nCases andalso let fun loop (i: int, prev: 'a): bool = i < nCases andalso let val cur = Vector.sub (cases, i) in equals (cur, prev) orelse loop (i + 1, cur) end in loop (1, Vector.first cases) end end datatype t = T of {cases: (WordX.t * Label.t) vector, default: Label.t option, expect: WordX.t option, size: WordSize.t, test: Use.t} fun layout (T {cases, default, expect, test, ...})= let open Layout in seq [str "switch ", record [("test", Use.layout test), ("default", Option.layout Label.layout default), ("expect", Option.layout (fn w => WordX.layout (w, {suffix = true})) expect), ("cases", Vector.layout (Layout.tuple2 (fn w => WordX.layout (w, {suffix = true}), Label.layout)) cases)]] end fun isOk (T {cases, default, test, ...}, {checkUse, labelIsOk}): bool = let val () = checkUse test val ty = Use.ty test in Vector.forall (cases, labelIsOk o #2) andalso (case default of NONE => true | SOME l => labelIsOk l) andalso Vector.isSorted (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) andalso not (isRedundant {cases = cases, equals = fn ((w, _), (w', _)) => WordX.equals (w, w')}) andalso if Vector.isEmpty cases then isSome default else let val casesTy = Type.sum (Vector.map (cases, fn (w, _) => Type.ofWordX w)) in Bits.equals (Type.width ty, Type.width casesTy) andalso not (Type.isObjptr ty) andalso (isSome default orelse Type.isSubtype (ty, casesTy)) end end fun foldLabelUse (T {cases, default, test, ...}, a: 'a, {label, use}): 'a = let val a = use (test, a) val a = Option.fold (default, a, label) val a = Vector.fold (cases, a, fn ((_, l), a) => label (l, a)) in a end fun foreachLabel (s, f) = foldLabelUse (s, (), {label = f o #1, use = fn _ => ()}) fun replace (T {cases, default, expect, size, test}, {label, use}): t = T {cases = Vector.map (cases, (fn (w, l) => (w, label l))), default = Option.map (default, label), expect = expect, size = size, test = use test} end mlton-20210117+dfsg/mlton/backend/switch.sig000066400000000000000000000025131416264345000205540ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SWITCH_STRUCTS = sig structure Label: LABEL structure Type: REP_TYPE structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordX = Type.WordX structure Use: sig type t val layout: t -> Layout.t val ty: t -> Type.t end end signature SWITCH = sig include SWITCH_STRUCTS datatype t = T of {(* Cases are in increasing order of word. *) cases: (WordX.t * Label.t) vector, default: Label.t option, expect: WordX.t option, size: WordSize.t, test: Use.t} val foldLabelUse: t * 'a * {label: Label.t * 'a -> 'a, use: Use.t * 'a -> 'a} -> 'a val foreachLabel: t * (Label.t -> unit) -> unit val isOk: t * {checkUse: Use.t -> unit, labelIsOk: Label.t -> bool} -> bool val layout: t -> Layout.t val replace: t * {label: Label.t -> Label.t, use: Use.t -> Use.t} -> t end mlton-20210117+dfsg/mlton/call-main.sml000066400000000000000000000004751416264345000175370ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.mainWrapped () mlton-20210117+dfsg/mlton/closure-convert/000077500000000000000000000000001416264345000203115ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/closure-convert/abstract-value.fun000066400000000000000000000442461416264345000237520ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor AbstractValue (S: ABSTRACT_VALUE_STRUCTS): ABSTRACT_VALUE = struct open S open Sxml structure Dset = DisjointSet structure Lambda = struct datatype t = Lambda of {lambda: Sxml.Lambda.t, hash: Word.t} val newHash = Random.word fun new lambda = Lambda {lambda = lambda, hash = newHash ()} fun hash (Lambda {hash, ...}) = hash fun dest (Lambda {lambda, ...}) = lambda fun equals (Lambda r, Lambda r') = #hash r = #hash r' andalso Sxml.Lambda.equals (#lambda r, #lambda r') fun layout (Lambda {lambda, ...}) = let open Layout in seq [str "lambda ", Sxml.Var.layout (Sxml.Lambda.arg lambda)] end end structure Lambdas = UniqueSet (structure Element = Lambda val cacheSize: int = 5 val bits: int = 13) structure LambdaNode: sig type t val addHandler: t * (Lambda.t -> unit) -> unit val coerce: {from: t, to: t} -> unit val lambda: Sxml.Lambda.t -> t val layout: t -> Layout.t val new: unit -> t val toSet: t -> Lambdas.t val unify: t * t -> unit end = struct datatype t = LambdaNode of {me: Lambdas.t ref, handlers: (Lambda.t -> unit) list ref, coercedTo: t list ref} Dset.t fun toSet (LambdaNode d) = !(#me (Dset.! d)) val layout = Lambdas.layout o toSet fun newSet s = LambdaNode (Dset.singleton {me = ref s, handlers = ref [], coercedTo = ref []}) fun new () = newSet Lambdas.empty fun lambda l = newSet (Lambdas.singleton (Lambda.new l)) fun handles (h: Lambda.t -> unit, s: Lambdas.t): unit = Lambdas.foreach (s, fn l => h l) fun handless (hs: (Lambda.t -> unit) list, s: Lambdas.t): unit = List.foreach (hs, fn h => handles (h, s)) fun addHandler (LambdaNode d, h: Lambda.t -> unit) = let val {me, handlers, ...} = Dset.! d in List.push (handlers, h) ; handles (h, !me) end fun send (LambdaNode d, s): unit = let val {me, coercedTo, handlers, ...} = Dset.! d val diff = Lambdas.- (s, !me) in if Lambdas.isEmpty diff then () else (me := Lambdas.+ (diff, !me) ; List.foreach (!coercedTo, fn to => send (to, diff)) ; handless (!handlers, diff)) end val send = Trace.trace2 ("AbstractValue.LambdaNode.send", layout, Lambdas.layout, Unit.layout) send fun equals (LambdaNode d, LambdaNode d') = Dset.equals (d, d') fun coerce {from = from as LambdaNode d, to: t}: unit = if equals (from, to) then () else let val {me, coercedTo, ...} = Dset.! d in if List.exists (!coercedTo, fn ls => equals (ls, to)) then () else (List.push (coercedTo, to) ; send (to, !me)) end fun update (c, h, diff) = if Lambdas.isEmpty diff then () else (List.foreach (c, fn to => send (to, diff)) ; handless (h, diff)) fun unify (LambdaNode d, LambdaNode d'): unit = if Dset.equals (d, d') then () else let val {me = ref m, coercedTo = ref c, handlers = ref h, ...} = Dset.! d val {me = ref m', coercedTo = ref c', handlers = ref h', ...} = Dset.! d' val diff = Lambdas.- (m, m') val diff' = Lambdas.- (m', m) in Dset.union (d, d') ; (Dset.:= (d, {me = ref (if Lambdas.isEmpty diff then m' else Lambdas.+ (m', diff)), coercedTo = ref (List.fold (c', c, fn (n', ac) => if List.exists (c, fn n => equals (n, n')) then ac else n' :: ac)), handlers = ref (List.appendRev (h, h'))})) ; update (c, h, diff') ; update (c', h', diff) end (* val unify = Trace.trace2 ("AbstractValue.LambdaNode.unify", layout, layout, Unit.layout) unify *) end structure UnaryTycon = struct datatype t = Array | Ref | Vector | Weak val toString = fn Array => "Array" | Ref => "Ref" | Vector => "Vector" | Weak => "Weak" val equals: t * t -> bool = op = val layout = Layout.str o toString end datatype tree = Lambdas of LambdaNode.t | Tuple of t vector | Type of Type.t | Unify of UnaryTycon.t * t withtype t = {tree: tree, ty: Type.t, ssaType: Ssa.Type.t option ref} Dset.t fun new (tree: tree, ty: Type.t): t = Dset.singleton {ssaType = ref NONE, tree = tree, ty = ty} local fun make sel : t -> 'a = sel o Dset.! in val ssaType = make #ssaType val tree = make #tree val ty = make #ty end fun layout v = let open Layout in case tree v of Type t => seq [str "Type ", Type.layout t] | Unify (t, v) => paren (seq [UnaryTycon.layout t, str " ", layout v]) | Tuple vs => Vector.layout layout vs | Lambdas l => LambdaNode.layout l end fun isEmpty v = case tree v of Lambdas n => Lambdas.isEmpty (LambdaNode.toSet n) | Tuple vs => Vector.exists (vs, isEmpty) | Unify (UnaryTycon.Ref, v) => isEmpty v | _ => false (* used in closure converter *) fun equals (v, v') = Dset.equals (v, v') orelse (case (tree v, tree v') of (Type t, Type t') => if Type.equals (t, t') then true else Error.bug "AbstractValue.equals: different types" | (Unify (t, v), Unify (t', v')) => UnaryTycon.equals (t, t') andalso equals (v, v') | (Tuple vs, Tuple vs') => Vector.forall2 (vs, vs', equals) | (Lambdas n, Lambdas n') => Lambdas.equals (LambdaNode.toSet n, LambdaNode.toSet n') | _ => Error.bug "AbstractValue.equals: different values") fun addHandler (v, h) = case tree v of Lambdas n => LambdaNode.addHandler (n, h) | _ => Error.bug "AbstractValue.addHandler: non-lambda" local val {hom, destroy} = Type.makeMonoHom {con = fn (t, tycon, vs) => let val new = fn tree => new (tree, t) in if Tycon.equals (tycon, Tycon.arrow) then {isFirstOrder = false, make = fn () => new (Lambdas (LambdaNode.new ()))} else if Vector.forall (vs, #isFirstOrder) then {isFirstOrder = true, make = let val v = new (Type t) in fn () => v end} else {isFirstOrder = false, make = let fun mutable mt = let val make = #make (Vector.first vs) in fn () => new (Unify (mt, make ())) end in if Tycon.equals (tycon, Tycon.reff) then mutable UnaryTycon.Ref else if Tycon.equals (tycon, Tycon.array) then mutable UnaryTycon.Array else if Tycon.equals (tycon, Tycon.vector) then mutable UnaryTycon.Vector else if Tycon.equals (tycon, Tycon.weak) then mutable UnaryTycon.Weak else if Tycon.equals (tycon, Tycon.tuple) then (fn () => new (Tuple (Vector.map (vs, fn {make, ...} => make ())))) else Error.bug "AbstractValue.fromType: non-arrow" end} end} in val destroy = destroy val typeIsFirstOrder = #isFirstOrder o hom fun fromType t = #make (hom t) () end val fromType = Trace.trace ("AbstractValue.fromType", Type.layout, layout) fromType fun tuple (vs: t vector): t = new (Tuple vs, Type.tuple (Vector.map (vs, ty))) fun select (v, i) = case tree v of Type t => fromType (Vector.sub (Type.deTuple t, i)) | Tuple vs => Vector.sub (vs, i) | _ => Error.bug "AbstractValue.select: expected tuple" fun deRef v = case tree v of Type t => fromType (Type.deRef t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deRef" val deRef = Trace.trace ("AbstractValue.deRef", layout, layout) deRef fun deWeak v = case tree v of Type t => fromType (Type.deWeak t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deWeak" fun deArray v = case tree v of Type t => fromType (Type.deArray t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deArray" fun deVector v = case tree v of Type t => fromType (Type.deVector t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deVector" fun lambda (l: Sxml.Lambda.t, t: Type.t): t = new (Lambdas (LambdaNode.lambda l), t) fun unify (v, v') = if Dset.equals (v, v') then () else let val t = tree v val t' = tree v' in Dset.union (v, v') ; (case (t, t') of (Type t, Type t') => if Type.equals (t, t') then () else Error.bug "AbstractValue.unify: different types" | (Unify (_, v), Unify (_, v')) => unify (v, v') | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unify) | (Lambdas l, Lambdas l') => LambdaNode.unify (l, l') | _ => Error.bug "AbstractValue.unify: different values") end val unify = Trace.trace2 ("AbstractValue.unify", layout, layout, Unit.layout) unify fun coerce {from: t, to: t}: unit = if Dset.equals (from, to) then () else (case (tree from, tree to) of (Type t, Type t') => if Type.equals (t, t') then () else Error.bug "coerce" | (Unify _, Unify _) => (* Can't do a coercion for vectors, since that would imply * walking over the entire vector and coercing each element *) unify (from, to) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', fn (v, v') => coerce {from = v, to = v'}) | (Lambdas l, Lambdas l') => LambdaNode.coerce {from = l, to = l'} | _ => Error.bug "AbstractValue.coerce: different values") val coerce = Trace.trace ("AbstractValue.coerce", fn {from, to} => let open Layout in record [("from", layout from), ("to" , layout to)] end, Unit.layout) coerce structure Dest = struct datatype dest = Array of t | Lambdas of Lambdas.t | Ref of t | Tuple of t vector | Type of Type.t | Vector of t | Weak of t end fun dest v = case tree v of Type t => Dest.Type t | Unify (mt, v) => (case mt of UnaryTycon.Array => Dest.Array v | UnaryTycon.Ref => Dest.Ref v | UnaryTycon.Vector => Dest.Vector v | UnaryTycon.Weak => Dest.Weak v) | Tuple vs => Dest.Tuple vs | Lambdas l => Dest.Lambdas (LambdaNode.toSet l) open Dest (*---------------------------------------------------*) (* primApply *) (*---------------------------------------------------*) val {get = serialValue: Type.t -> t, ...} = Property.get (Type.plist, Property.initFun fromType) fun primApply {prim: Type.t Prim.t, args: t vector, resultTy: Type.t}: t = let fun result () = fromType resultTy fun typeError () = (Control.message (Control.Silent, fn () => let open Layout in align [seq [str "prim: ", Prim.layout prim], seq [str "args: ", Vector.layout layout args]] end) ; Error.bug "AbstractValue.primApply: type error") fun arg i = Vector.sub (args, i) val n = Vector.length args fun oneArg () = if n = 1 then arg 0 else Error.bug "AbstractValue.primApply.oneArg" fun twoArgs () = if n = 2 then (arg 0, arg 1) else Error.bug "AbstractValue.primApply.twoArgs" fun threeArgs () = if n = 3 then (arg 0, arg 1, arg 2) else Error.bug "AbstractValue.primApply.threeArgs" fun fiveArgs () = if n = 5 then (arg 0, arg 1, arg 2, arg 3, arg 4) else Error.bug "AbstractValue.primApply.fiveArgs" in case prim of Prim.Array_array => let val r = result () val _ = case dest r of Array x => Vector.foreach (args, fn arg => coerce {from = arg, to = x}) | Type _ => () | _ => typeError () in r end | Prim.Array_copyArray => let val (da, _, sa, _, _) = fiveArgs () in (case (dest da, dest sa) of (Array dx, Array sx) => unify (dx, sx) | (Type _, Type _) => () | _ => typeError () ; result ()) end | Prim.Array_copyVector => let val (da, _, sa, _, _) = fiveArgs () in (case (dest da, dest sa) of (Array dx, Vector sx) => unify (dx, sx) | (Type _, Type _) => () | _ => typeError () ; result ()) end | Prim.Array_toArray => let val r = result () in (case (dest (oneArg ()), dest r) of (Type _, Type _) => () | (Array x, Array y) => (* Can't do a coercion here because that would imply * walking over each element of the array and coercing it. *) unify (x, y) | _ => typeError ()) ; r end | Prim.Array_toVector => let val r = result () in (case (dest (oneArg ()), dest r) of (Type _, Type _) => () | (Array x, Vector y) => (* Can't do a coercion here because that would imply * walking over each element of the array and coercing it. *) unify (x, y) | _ => typeError ()) ; r end | Prim.Array_sub => (case dest (#1 (twoArgs ())) of Array x => x | Type _ => result () | _ => typeError ()) | Prim.Array_update => let val (a, _, x) = threeArgs () in (case dest a of Array x' => coerce {from = x, to = x'} (* unify (x, x') *) | Type _ => () | _ => typeError ()) ; result () end | Prim.MLton_deserialize => serialValue resultTy | Prim.MLton_serialize => let val arg = oneArg () in coerce {from = arg, to = serialValue (ty arg)} ; result () end | Prim.Ref_assign => let val (r, x) = twoArgs () in (case dest r of Ref x' => coerce {from = x, to = x'} (* unify (x, x') *) | Type _ => () | _ => typeError ()) ; result () end | Prim.Ref_deref => (case dest (oneArg ()) of Ref v => v | Type _ => result () | _ => typeError ()) | Prim.Ref_ref => let val r = result () val _ = case dest r of Ref x => coerce {from = oneArg (), to = x} (* unify (oneArg (), x) *) | Type _ => () | _ => typeError () in r end | Prim.Vector_sub => (case dest (#1 (twoArgs ())) of Vector x => x | Type _ => result () | _ => typeError ()) | Prim.Vector_vector => let val r = result () val _ = case dest r of Vector x => Vector.foreach (args, fn arg => coerce {from = arg, to = x}) | Type _ => () | _ => typeError () in r end | Prim.Weak_get => (case dest (oneArg ()) of Weak v => v | Type _ => result () | _ => typeError ()) | Prim.Weak_new => let val r = result () val _ = case dest r of Type _ => () | Weak x => coerce {from = oneArg (), to = x} | _ => typeError () in r end | _ => result () end end mlton-20210117+dfsg/mlton/closure-convert/abstract-value.sig000066400000000000000000000041101416264345000237260ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ABSTRACT_VALUE_STRUCTS = sig structure Sxml: SXML structure Ssa: SSA end signature ABSTRACT_VALUE = sig include ABSTRACT_VALUE_STRUCTS structure Lambda: sig type t val dest: t -> Sxml.Lambda.t val layout: t -> Layout.t end structure Lambdas: sig type t val equals: t * t -> bool val plist: t -> PropertyList.t val toList: t -> Lambda.t list end type t datatype dest = Array of t | Lambdas of Lambdas.t | Ref of t | Tuple of t vector | Type of Sxml.Type.t (* type doesn't contain any arrows *) | Vector of t | Weak of t val addHandler: t * (Lambda.t -> unit) -> unit val coerce: {from: t, to: t} -> unit val ssaType: t -> Ssa.Type.t option ref val deArray: t -> t val deRef: t -> t val deVector: t -> t val deWeak: t -> t val dest: t -> dest (* Destroy info associated with Sxml.Type used to keep track of arrows. *) val destroy: unit -> unit val equals: t * t -> bool val fromType: Sxml.Type.t -> t val isEmpty: t -> bool (* no possible values correspond to me *) val lambda: Sxml.Lambda.t * Sxml.Type.t (* The type of the lambda. *) -> t val layout: t -> Layout.t val primApply: {prim: Sxml.Type.t Sxml.Prim.t, args: t vector, resultTy: Sxml.Type.t} -> t val select: t * int -> t val serialValue: Sxml.Type.t -> t (* In tuple vs, there must be one argument that is not Type _. *) val tuple: t vector -> t val ty: t -> Sxml.Type.t val typeIsFirstOrder: Sxml.Type.t -> bool val unify: t * t -> unit end mlton-20210117+dfsg/mlton/closure-convert/closure-convert.fun000066400000000000000000001442761416264345000241730ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * All local variables in the Sxml are renamed to new variables in Ssa, * unless they are global, as determined by the Globalization pass. * Renaming must happen because an Sxml variable will be bound in the Ssa * once for each lambda it occurs in. The main trickiness is caused because a * property is used to implement the renamer map. Hence, a variable binding * must always be visited with "newVar" or "newScope" before it is looked up * with "getNewVar". "newScope" also handles resetting the variable to its * old value once the processing of the lambda is done. *) functor ClosureConvert (S: CLOSURE_CONVERT_STRUCTS): CLOSURE_CONVERT = struct open S structure Globalize = Globalize (open Sxml) local open Sxml in structure Scases = Cases structure Sexp = Exp structure Sdec = Dec structure Slambda = Lambda structure Spat = Pat structure SprimExp = PrimExp structure SvarExp = VarExp structure Stype = Type open Atoms end local open Ssa in structure Block = Block structure Datatype = Datatype structure Dexp = DirectExp structure Func = Func structure Function = Function structure SourceInfo = SourceInfo structure Type = Type end structure Value = AbstractValue (structure Ssa = Ssa structure Sxml = Sxml) local open Value in structure Lambdas = Lambdas end (* Accum.t is one of the results returned internally by the converter -- an * accumulation of toplevel Ssa globals and function declarations. *) structure Accum = struct structure AL = AppendList datatype t = T of {globals: {var: Var.t, ty: Type.t, exp: Dexp.t} AL.t, functions: Function.t list} val empty = T {globals = AL.empty, functions = []} fun addGlobals (T {globals, functions}, gs) = T {globals = AL.append (globals, AL.fromList gs), functions = functions} fun addGlobal (ac, g) = addGlobals (ac, [g]) fun addFunc (T {globals, functions}, f) = T {globals = globals, functions = f :: functions} fun done (T {globals, functions}) = {functions = functions, globals = let (* Must shrink because coercions may be inserted at constructor * applications. I'm pretty sure the shrinking will eliminate * any case expressions/local functions. * We must rebind eliminated variables because the shrinker is * just processing globals and hence cannot safely delete a * variable that has no occurrences, since there may still be * occurrences in functions. *) val globals = AL.toList globals val vars = Vector.fromListMap (globals, #var) val tys = Vector.fromListMap (globals, #ty) val (start, blocks) = Dexp.linearize (Dexp.lett {decs = List.map (globals, fn {var, exp, ...} => {var = var, exp = exp}), body = Dexp.tuple {exps = (Vector.fromListMap (globals, fn {var, ty, ...} => Dexp.var (var, ty))), ty = Type.tuple tys}}, Ssa.Handler.Caller) val {blocks, ...} = Function.dest (Ssa.shrinkFunction {globals = Vector.new0 ()} (Function.new {args = Vector.new0 (), blocks = Vector.fromList blocks, mayInline = false, (* doesn't matter *) name = Func.newNoname (), raises = NONE, returns = SOME (Vector.new1 (Type.tuple tys)), start = start})) in if 1 <> Vector.length blocks then Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't completely simplify"]) else let val ss = Block.statements (Vector.first blocks) val vs = case Ssa.Statement.exp (Vector.last ss) of Ssa.Exp.Tuple vs => if Vector.length vars = Vector.length vs then vs else Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't simplify right"]) | _ => Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't produce tuple"]) val ss = Vector.dropSuffix (ss, 1) val rebinds = Vector.keepAllMapi (vs, fn (i, v) => if Var.equals (v, Vector.sub (vars, i)) then NONE else SOME (Ssa.Statement.T {exp = Ssa.Exp.Var v, ty = Vector.sub (tys, i), var = SOME (Vector.sub (vars, i))})) in Vector.concat [ss, rebinds] end end} end (* val traceConvertExp = Trace.trace2 ("ClosureConvert.convertExp", Sexp.layout, Instance.layout, Dexp.layout) *) val convertPrimExpInfo = Trace.info "ClosureConvert.convertPrimExp" val valueTypeInfo = Trace.info "ClosureConvert.valueType" structure LambdaFree = LambdaFree (Sxml) local open LambdaFree in structure Status = Status end structure LambdaInfo = struct datatype t = T of { con: Con.t ref, frees: Var.t vector ref, (* name is the original name in the source (i.e. SXML) program, * so the closure conversion output has some readability. *) name: Func.t, recs: Var.t vector ref, (* The type of its environment record. *) ty: Type.t option ref } local fun mk sel (T r) = sel r in val frees = ! o mk #frees val name = mk #name end end structure VarInfo = struct type t = {frees: Var.t list ref ref, isGlobal: bool ref, lambda: Slambda.t option, replacement: Var.t ref, status: Status.t ref, value: Value.t} local fun make sel (r: t) = sel r in val lambda = valOf o make #lambda val value = make #value end end val traceLoopBind = Trace.trace ("ClosureConvert.loopBind", fn {exp, ty = _: Stype.t, var} => Layout.record [("var", Var.layout var), ("exp", SprimExp.layout exp)], Unit.layout) fun closureConvert (program as Sxml.Program.T {datatypes, body}): Ssa.Program.t = let val {get = conArg: Con.t -> Value.t option, set = setConArg, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conArg", Con.layout)) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("closure convert info", Var.layout)) val varInfo = Trace.trace ("ClosureConvert.varInfo", Var.layout, Layout.ignore) varInfo val varExpInfo = varInfo o SvarExp.var val isGlobal = ! o #isGlobal o varInfo val isGlobal = Trace.trace ("ClosureConvert.isGlobal", Var.layout, Bool.layout) isGlobal val value = #value o varInfo val varExp = value o SvarExp.var val expValue = varExp o Sexp.result (* ---------------------------------- *) (* lambdaInfo *) (* ---------------------------------- *) val {get = lambdaInfo: Slambda.t -> LambdaInfo.t, set = setLambdaInfo, ...} = Property.getSetOnce (Slambda.plist, Property.initRaise ("closure convert info", Layout.ignore)) val allLambdas: Slambda.t list ref = ref [] (* Do the flow analysis. * Initialize lambdaInfo and varInfo. *) val _ = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, fn {con, arg} => setConArg (con, (case arg of NONE => NONE | SOME t => SOME (Value.fromType t))))) val _ = let open Sxml val bogusFrees = ref [] fun newVar' (x, v, lambda) = setVarInfo (x, {frees = ref bogusFrees, isGlobal = ref false, lambda = lambda, replacement = ref x, status = ref Status.init, value = v}) fun newVar (x, v) = newVar' (x, v, NONE) val newVar = Trace.trace2 ("ClosureConvert.newVar", Var.layout, Layout.ignore, Unit.layout) newVar fun varExps xs = Vector.map (xs, varExp) fun loopExp (e: Exp.t): Value.t = let val {decs, result} = Exp.dest e val () = List.foreach (decs, loopDec) in varExp result end and loopDec (d: Dec.t): unit = let datatype z = datatype Dec.t in case d of Fun {decs, ...} => (Vector.foreach (decs, fn {var, lambda, ty, ...} => newVar' (var, Value.fromType ty, SOME lambda)) ; (Vector.foreach (decs, fn {var, lambda, ...} => Value.unify (value var, loopLambda (lambda, var))))) | MonoVal b => loopBind b | _ => Error.bug "ClosureConvert.loopDec: strange dec" end and loopBind arg = traceLoopBind (fn {var, ty, exp} => let fun set v = newVar (var, v) fun new () = let val v = Value.fromType ty in set v; v end val new' = ignore o new datatype z = datatype PrimExp.t in case exp of App {func, arg} => let val arg = varExp arg val result = new () in Value.addHandler (varExp func, fn l => let val lambda = Value.Lambda.dest l val {arg = formal, body, ...} = Lambda.dest lambda in Value.coerce {from = arg, to = value formal} ; Value.coerce {from = expValue body, to = result} end) end | Case {cases, default, ...} => let val result = new () fun branch e = Value.coerce {from = loopExp e, to = result} fun handlePat (Pat.T {con, arg, ...}) = case (arg, conArg con) of (NONE, NONE) => () | (SOME (x, _), SOME v) => newVar (x, v) | _ => Error.bug "ClosureConvert.loopBind: Case" val _ = Cases.foreach' (cases, branch, handlePat) val _ = Option.app (default, branch) in () end | ConApp {con, arg, ...} => (case (arg, conArg con) of (NONE, NONE) => () | (SOME x, SOME v) => Value.coerce {from = varExp x, to = v} | _ => Error.bug "ClosureConvert.loopBind: ConApp" ; new' ()) | Const _ => new' () | Handle {try, catch = (x, t), handler} => let val result = new () in Value.coerce {from = loopExp try, to = result} ; newVar (x, Value.fromType t) ; Value.coerce {from = loopExp handler, to = result} end | Lambda l => set (loopLambda (l, var)) | PrimApp {prim, args, ...} => set (Value.primApply {prim = prim, args = varExps args, resultTy = ty}) | Profile _ => new' () | Raise _ => new' () | Select {tuple, offset} => set (Value.select (varExp tuple, offset)) | Tuple xs => if Value.typeIsFirstOrder ty then new' () else set (Value.tuple (Vector.map (xs, varExp))) | Var x => set (varExp x) end) arg and loopLambda (lambda: Lambda.t, x: Var.t): Value.t = let val _ = List.push (allLambdas, lambda) val {arg, argType, body, ...} = Lambda.dest lambda val _ = setLambdaInfo (lambda, LambdaInfo.T {con = ref Con.bogus, frees = ref (Vector.new0 ()), name = Func.newString (Var.originalName x), recs = ref (Vector.new0 ()), ty = ref NONE}) val _ = newVar (arg, Value.fromType argType) in Value.lambda (lambda, Type.arrow (argType, Value.ty (loopExp body))) end val _ = Control.trace (Control.Pass, "flow analysis") loopExp body in () end val _ = Control.diagnostics (fn display => Sexp.foreachBoundVar (body, fn (x, _, _) => display (let open Layout in seq [Var.layout x, str " ", Value.layout (value x)] end))) val _ = Control.trace (Control.Pass, "free variables") LambdaFree.lambdaFree {program = program, varInfo = fn x => let val {frees, status, ...} = varInfo x in {frees = frees, status = status} end, lambdaInfo = fn l => let val LambdaInfo.T {frees, recs, ...} = lambdaInfo l in {frees = frees, recs = recs} end} val _ = if !Control.closureConvertGlobalize then Control.trace (Control.Pass, "globalize") Globalize.globalize {program = program, lambdaFree = LambdaInfo.frees o lambdaInfo, varGlobal = #isGlobal o varInfo} else () local fun removeGlobal v = Vector.keepAll (v, not o isGlobal) val _ = List.foreach (!allLambdas, fn l => let val LambdaInfo.T {frees, recs, ...} = lambdaInfo l in frees := removeGlobal (!frees) ; recs := removeGlobal (!recs) end) in end val {get = lambdasInfoOpt, ...} = Property.get (Lambdas.plist, Property.initFun (fn _ => ref NONE)) val (convertType, destroyConvertType) = let val {get, set, destroy, ...} = Property.destGetSetOnce (Tycon.plist, Property.initConst NONE) fun nullary c v = if Vector.isEmpty v then c else Error.bug "ClosureConvert.convertType.nullary: bogus application of nullary tycon" fun unary make v = if 1 = Vector.length v then make (Vector.first v) else Error.bug "ClosureConvert.convertType.unary: bogus application of unary tycon" val tycons = [(Tycon.arrow, fn _ => Error.bug "ClosureConvert.convertType.array"), (Tycon.array, unary Type.array), (Tycon.cpointer, nullary Type.cpointer), (Tycon.intInf, nullary Type.intInf), (Tycon.reff, unary Type.reff), (Tycon.thread, nullary Type.thread), (Tycon.tuple, Type.tuple), (Tycon.vector, unary Type.vector), (Tycon.weak, unary Type.weak)] @ Vector.toListMap (Tycon.reals, fn (t, s) => (t, nullary (Type.real s))) @ Vector.toListMap (Tycon.words, fn (t, s) => (t, nullary (Type.word s))) val _ = List.foreach (tycons, fn (tycon, f) => set (tycon, SOME f)) val {hom = convertType, destroy = destroyConvertType} = Stype.makeMonoHom {con = fn (_, tycon, ts) => case get tycon of NONE => nullary (Type.datatypee tycon) ts | SOME f => f ts} in (convertType, fn () => (destroy () ; destroyConvertType ())) end (* newDatatypes accumulates the new datatypes built for sets of lambdas. *) val newDatatypes: Datatype.t list ref = ref [] fun valueType arg: Type.t = Trace.traceInfo (valueTypeInfo, Layout.ignore, Type.layout, Trace.assertTrue) (fn (v: Value.t) => let val r = Value.ssaType v in case !r of SOME t => t | NONE => let val t = case Value.dest v of Value.Array v => Type.array (valueType v) | Value.Lambdas ls => #ty (lambdasInfo ls) | Value.Ref v => Type.reff (valueType v) | Value.Type t => convertType t | Value.Tuple vs => Type.tuple (Vector.map (vs, valueType)) | Value.Vector v => Type.vector (valueType v) | Value.Weak v => Type.weak (valueType v) in r := SOME t; t end end) arg and lambdasInfo (ls: Lambdas.t): {cons: {lambda: Slambda.t, con: Con.t} vector, ty: Type.t} = let val r = lambdasInfoOpt ls in case !r of SOME info => info | NONE => let val tycon = Tycon.newString "lambdas" val cons = Vector.fromListMap (Lambdas.toList ls, fn l => let val lambda = Value.Lambda.dest l val name = LambdaInfo.name (lambdaInfo lambda) val con = Con.newString (Func.originalName name ^ "Env") in {lambda = lambda, con = con} end) val ty = Type.datatypee tycon val info = {ty = ty, cons = cons} val _ = r := SOME info (* r must be set before the following, because calls to * lambdaInfoType may refer to the type of this lambdasInfo. *) val cons = Vector.map (cons, fn {con, lambda} => {con = con, args = Vector.new1 (lambdaInfoType (lambdaInfo lambda))}) val _ = List.push (newDatatypes, Datatype.T {tycon = tycon, cons = cons}) in info end end and varInfoType ({value, ...}: VarInfo.t) = valueType value and lambdaInfoType (LambdaInfo.T {frees, ty, ...}): Type.t = case !ty of NONE => let val t = Type.tuple (Vector.map (!frees, varInfoType o varInfo)) in ty := SOME t; t end | SOME t => t fun valueLambdasInfo v = case Value.dest v of Value.Lambdas l => lambdasInfo l | _ => Error.bug "ClosureConvert.valueLambdasInfo: non-lambda" val varLambdasInfo = valueLambdasInfo o value val emptyTypes = Vector.new0 () val datatypes = Vector.map (datatypes, fn {tycon, cons, ...} => Datatype.T {tycon = tycon, cons = (Vector.map (cons, fn {con, ...} => {con = con, args = (case conArg con of NONE => emptyTypes | SOME v => Vector.new1 (valueType v))}))}) (* Variable renaming *) fun newVarInfo (x: Var.t, {isGlobal, replacement, ...}: VarInfo.t): Var.t = if !isGlobal then x else let val x' = Var.new x in replacement := x'; x' end fun newVar x = newVarInfo (x, varInfo x) val newVar = Trace.trace ("ClosureConvert.newVar", Var.layout, Var.layout) newVar fun newScope (xs: Var.t vector, f: Var.t vector -> 'a): 'a = let val old = Vector.map (xs, ! o #replacement o varInfo) val res = f (Vector.map (xs, newVar)) val _ = Vector.foreach2 (xs, old, fn (x, x') => #replacement (varInfo x) := x') in res end (*------------------------------------*) (* coerce *) (*------------------------------------*) val traceCoerce = Trace.trace3 ("ClosureConvert.coerce", Dexp.layout, Value.layout, Value.layout, Dexp.layout) (* val traceCoerceTuple = * let val layoutValues = List.layout (", ", Value.layout) * in Trace.trace3 ("ClosureConvert.coerceTuple", Dexp.layout, * layoutValues, layoutValues, Dexp.layout) * end *) fun coerce arg: Dexp.t = traceCoerce (fn (e: Dexp.t, from: Value.t, to: Value.t) => if Value.equals (from, to) then e else case (Value.dest from, Value.dest to) of (Value.Tuple vs, Value.Tuple vs') => coerceTuple (e, valueType from, vs, valueType to, vs') | (Value.Lambdas ls, Value.Lambdas ls') => if Lambdas.equals (ls, ls') then e else let val {cons, ...} = lambdasInfo ls val {cons = cons', ty, ...} = lambdasInfo ls' val _ = Vector.foreach (cons', fn {lambda, con, ...} => let val LambdaInfo.T {con = r, ...} = lambdaInfo lambda in r := con end) val exp = Dexp.casee {test = e, default = NONE, ty = ty, cases = Dexp.Con (Vector.map (cons, fn {lambda, con} => let val info as LambdaInfo.T {con = r, ...} = lambdaInfo lambda val tuple = (Var.newNoname (), lambdaInfoType info) in {con = con, args = Vector.new1 tuple, body = (Dexp.conApp {con = !r, ty = ty, args = Vector.new1 (Dexp.var tuple)})} end))} in exp end | _ => Error.bug "ClosureConvert.coerce") arg and coerceTuple arg = (* traceCoerceTuple *) (fn (e: Dexp.t, ty: Type.t, vs: Value.t vector, ty': Type.t, vs': Value.t vector) => if Type.equals (ty, ty') then e else Dexp.detuple {tuple = e, length = Vector.length vs, body = fn components => Dexp.tuple {exps = Vector.map3 (components, vs, vs', fn (x, v, v') => coerce (Dexp.var (x, valueType v), v, v')), ty = ty'}}) arg fun convertVarInfo (info as {replacement, ...}: VarInfo.t) = Dexp.var (!replacement, varInfoType info) val convertVar = convertVarInfo o varInfo val convertVarExp = convertVar o SvarExp.var val handlesSignals = Sexp.hasPrim (body, fn p => case p of Prim.MLton_installSignalHandler => true | _ => false) (*------------------------------------*) (* apply *) (*------------------------------------*) fun apply {func, arg, resultVal}: Dexp.t = let val func = varExpInfo func val arg = varExpInfo arg val funcVal = VarInfo.value func val argVal = VarInfo.value arg val argExp = convertVarInfo arg val ty = valueType resultVal val {cons, ...} = valueLambdasInfo funcVal in Dexp.casee {test = convertVarInfo func, ty = ty, default = NONE, cases = Dexp.Con (Vector.map (cons, fn {lambda, con} => let val {arg = param, body, ...} = Slambda.dest lambda val info as LambdaInfo.T {name, ...} = lambdaInfo lambda val result = expValue body val env = (Var.newString "env", lambdaInfoType info) in {con = con, args = Vector.new1 env, body = coerce (Dexp.call {func = name, args = Vector.new2 (Dexp.var env, coerce (argExp, argVal, value param)), ty = valueType result}, result, resultVal)} end))} end (*------------------------------------*) (* convertExp *) (*------------------------------------*) fun lambdaInfoTuple (info as LambdaInfo.T {frees, ...}): Dexp.t = Dexp.tuple {exps = Vector.map (!frees, convertVar), ty = lambdaInfoType info} fun recursives (old: Var.t vector, new: Var.t vector, env) = Vector.fold2 (old, new, [], fn (old, new, ac) => let val {cons, ty, ...} = varLambdasInfo old val l = VarInfo.lambda (varInfo old) in case Vector.peek (cons, fn {lambda = l', ...} => Slambda.equals (l, l')) of NONE => Error.bug "ClosureConvert.recursives: lambda must exist in its own set" | SOME {con, ...} => {var = new, ty = ty, exp = Dexp.conApp {con = con, ty = ty, args = Vector.new1 (Dexp.var env)}} :: ac end) val recursives = Trace.trace ("ClosureConvert.recursives", fn (a, b, _) => Layout.tuple [Vector.layout Var.layout a, Vector.layout Var.layout b], Layout.ignore) recursives val raises: Type.t vector option = let exception Yes of Type.t vector in (Sexp.foreachPrimExp (body, fn (_, _, e) => case e of SprimExp.Handle {catch = (x, _), ...} => raise (Yes (Vector.new1 (varInfoType (varInfo x)))) | _ => ()) ; NONE) handle Yes ts => SOME ts end val shrinkFunction = if !Control.closureConvertShrink then Ssa.shrinkFunction {globals = Vector.new0 ()} else fn f => f fun addFunc (ac, {args, body, isMain, mayInline, name, returns}) = let val (start, blocks) = Dexp.linearize (body, Ssa.Handler.Caller) val f = shrinkFunction (Function.new {args = args, blocks = Vector.fromList blocks, mayInline = mayInline, name = name, raises = if isMain then NONE else raises, returns = SOME returns, start = start}) val f = if isMain then Function.profile (f, SourceInfo.main) else f in Accum.addFunc (ac, f) end (* Closure convert an expression, returning: * - the target ssa expression * - a list of global declarations (in order) * - a list of function declarations * Accumulate the globals onto the end of the given ones. *) fun convertExp (e: Sexp.t, ac: Accum.t): Dexp.t * Accum.t = let val {decs, result} = Sexp.dest e (* Process decs left to right, since bindings of variables * must be visited before uses. *) val (decs, ac) = List.fold (decs, ([], ac), fn (d, (binds, ac)) => case d of Sdec.MonoVal {exp, var, ...} => let val info as {isGlobal, value, ...} = varInfo var val (exp, ac) = convertPrimExp (exp, value, ac) val bind = {var = newVarInfo (var, info), ty = valueType value, exp = exp} in if !isGlobal then (binds, Accum.addGlobal (ac, bind)) else (bind :: binds, ac) end | Sdec.Fun {decs, ...} => if Vector.isEmpty decs then (binds, ac) else let val {lambda, var, ...} = Vector.first decs val info = lambdaInfo lambda val tupleVar = Var.newString "tuple" val tupleTy = lambdaInfoType info val binds' = {var = tupleVar, ty = tupleTy, exp = lambdaInfoTuple info} :: (recursives (Vector.map (decs, #var), Vector.map (decs, newVar o #var), (tupleVar, tupleTy))) val (binds, ac) = if isGlobal var then (binds, Accum.addGlobals (ac, binds')) else (List.fold (binds', binds, op ::), ac) in (binds, Vector.fold (decs, ac, fn ({lambda, ...}, ac) => convertLambda (lambda, lambdaInfo lambda, ac))) end | _ => Error.bug "ClosureConvert.convertExp: strange dec") in (Dexp.lett {decs = List.fold (decs, [], fn ({var, exp, ...}, ac) => {var = var, exp = exp} :: ac), body = convertVarExp result}, ac) end and convertPrimExp arg : Dexp.t * Accum.t = Trace.traceInfo (convertPrimExpInfo, SprimExp.layout o #1, Layout.ignore, Trace.assertTrue) (fn (e: SprimExp.t, v: Value.t, ac: Accum.t) => let val ty = valueType v fun convertJoin (e, ac) = let val (e', ac) = convertExp (e, ac) in (coerce (e', expValue e, v), ac) end fun simple e = (e, ac) in case e of SprimExp.App {func, arg} => (apply {func = func, arg = arg, resultVal = v}, ac) | SprimExp.Case {test, cases, default} => let val (default, ac) = case default of NONE => (NONE, ac) | SOME e => let val (e, ac) = convertJoin (e, ac) in (SOME e, ac) end fun doCases (cases, finish, make) = let val (cases, ac) = Vector.mapAndFold (cases, ac, fn ((x, e), ac) => let val make = make x val (body, ac) = convertJoin (e, ac) in (make body, ac) end) in (finish cases, ac) end val (cases, ac) = case cases of Scases.Con cases => doCases (cases, Dexp.Con, fn Spat.T {con, arg, ...} => let val args = case (conArg con, arg) of (NONE, NONE) => Vector.new0 () | (SOME v, SOME (arg, _)) => Vector.new1 (newVar arg, valueType v) | _ => Error.bug "ClosureConvert.convertPrimExp: Case,constructor mismatch" in fn body => {args = args, body = body, con = con} end) | Scases.Word (s, cs) => doCases (cs, fn cs => Dexp.Word (s, cs), fn i => fn e => (i, e)) in (Dexp.casee {test = convertVarExp test, ty = ty, cases = cases, default = default}, ac) end | SprimExp.ConApp {con = con, arg, ...} => simple (Dexp.conApp {con = con, ty = ty, args = (case (arg, conArg con) of (NONE, NONE) => Vector.new0 () | (SOME arg, SOME conArg) => let val arg = varExpInfo arg val argVal = VarInfo.value arg val arg = convertVarInfo arg in if Value.equals (argVal, conArg) then Vector.new1 arg else Vector.new1 (coerce (arg, argVal, conArg)) end | _ => Error.bug "ClosureConvert.convertPrimExp: ConApp,constructor mismatch")}) | SprimExp.Const c => simple (Dexp.const c) | SprimExp.Handle {try, catch = (catch, _), handler} => let val catchInfo = varInfo catch val (try, ac) = convertJoin (try, ac) val catch = (newVarInfo (catch, catchInfo), varInfoType catchInfo) val (handler, ac) = convertJoin (handler, ac) in (Dexp.handlee {try = try, ty = ty, catch = catch, handler = handler}, ac) end | SprimExp.Lambda l => let val info = lambdaInfo l val ac = convertLambda (l, info, ac) val {cons, ...} = valueLambdasInfo v in case Vector.peek (cons, fn {lambda = l', ...} => Slambda.equals (l, l')) of NONE => Error.bug "ClosureConvert.convertPrimExp: Lambda,lambda must exist in its own set" | SOME {con, ...} => (Dexp.conApp {con = con, ty = ty, args = Vector.new1 (lambdaInfoTuple info)}, ac) end | SprimExp.PrimApp {prim, targs, args} => let val prim = Prim.map (prim, convertType) fun arg i = Vector.sub (args, i) val v1 = Vector.new1 val v2 = Vector.new2 val v3 = Vector.new3 fun primApp (targs, args) = Dexp.primApp {args = args, prim = prim, targs = targs, ty = ty} in simple (case prim of Prim.Array_array => let val ys = Vector.map (args, varExpInfo) val v = Value.deArray v in primApp (v1 (valueType v), Vector.map (ys, fn y => coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.Array_update => let val a = varExpInfo (arg 0) val y = varExpInfo (arg 2) val v = Value.deArray (VarInfo.value a) in primApp (v1 (valueType v), v3 (convertVarInfo a, convertVarExp (arg 1), coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.MLton_eq => let val a0 = varExpInfo (arg 0) val a1 = varExpInfo (arg 1) fun doit () = primApp (v1 (valueType (VarInfo.value a0)), v2 (convertVarInfo a0, convertVarInfo a1)) in case (Value.dest (VarInfo.value a0), Value.dest (VarInfo.value a1)) of (Value.Lambdas l, Value.Lambdas l') => if Lambdas.equals (l, l') then doit () else Dexp.falsee | _ => doit () end | Prim.MLton_equal => let val a0 = varExpInfo (arg 0) val a1 = varExpInfo (arg 1) fun doit () = primApp (v1 (valueType (VarInfo.value a0)), v2 (convertVarInfo a0, convertVarInfo a1)) in case (Value.dest (VarInfo.value a0), Value.dest (VarInfo.value a1)) of (Value.Lambdas l, Value.Lambdas l') => if Lambdas.equals (l, l') then doit () else Dexp.falsee | _ => doit () end | Prim.MLton_handlesSignals => if handlesSignals then Dexp.truee else Dexp.falsee | Prim.Ref_assign => let val r = varExpInfo (arg 0) val y = varExpInfo (arg 1) val v = Value.deRef (VarInfo.value r) in primApp (v1 (valueType v), v2 (convertVarInfo r, coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.Ref_ref => let val y = varExpInfo (arg 0) val v = Value.deRef v in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.MLton_serialize => let val y = varExpInfo (arg 0) val v = Value.serialValue (Vector.first targs) in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.Vector_vector => let val ys = Vector.map (args, varExpInfo) val v = Value.deVector v in primApp (v1 (valueType v), Vector.map (ys, fn y => coerce (convertVarInfo y, VarInfo.value y, v))) end | Prim.Weak_new => let val y = varExpInfo (arg 0) val v = Value.deWeak v in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | _ => let val args = Vector.map (args, varExpInfo) in primApp (Prim.extractTargs (prim, {args = Vector.map (args, varInfoType), result = ty, typeOps = {deArray = Type.deArray, deArrow = fn _ => Error.bug "ClosureConvert.convertPrimExp: deArrow", deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}), Vector.map (args, convertVarInfo)) end) end | SprimExp.Profile e => simple (Dexp.profile e) | SprimExp.Raise {exn, ...} => simple (Dexp.raisee (convertVarExp exn)) | SprimExp.Select {offset, tuple} => simple (Dexp.select {offset = offset, tuple = convertVarExp tuple, ty = ty}) | SprimExp.Tuple xs => simple (Dexp.tuple {exps = Vector.map (xs, convertVarExp), ty = ty}) | SprimExp.Var y => simple (convertVarExp y) end) arg and convertLambda (lambda: Slambda.t, info as LambdaInfo.T {frees, name, recs, ...}, ac: Accum.t): Accum.t = let val {arg = argVar, body, mayInline, ...} = Slambda.dest lambda val argVarInfo = varInfo argVar val env = Var.newString "env" val envType = lambdaInfoType info val args = Vector.new2 ((env, envType), (newVarInfo (argVar, argVarInfo), varInfoType argVarInfo)) val returns = Vector.new1 (valueType (expValue body)) val recs = !recs in newScope (!frees, fn components => newScope (recs, fn recs' => let val decs = recursives (recs, recs', (env, envType)) val (body, ac) = convertExp (body, ac) val body = Dexp.lett {decs = List.fold (decs, [], fn ({var, exp, ...}, ac) => {var = var, exp = exp} :: ac), body = Dexp.detupleBind {tuple = env, tupleTy = envType, components = components, body = body}} in addFunc (ac, {args = args, body = body, isMain = false, mayInline = mayInline, name = name, returns = returns}) end)) end (*------------------------------------*) (* main body of closure convert *) (*------------------------------------*) val main = Func.newString "main" val {functions, globals} = Control.trace (Control.Pass, "convert") (fn () => let val (body, ac) = convertExp (body, Accum.empty) val ac = addFunc (ac, {args = Vector.new0 (), body = body, mayInline = false, isMain = true, name = main, returns = Vector.new1 Type.unit}) in Accum.done ac end) () val datatypes = Vector.concat [datatypes, Vector.fromList (!newDatatypes)] val program = Ssa.Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroyConvertType () val _ = Value.destroy () val _ = Ssa.Program.clear program in program end end mlton-20210117+dfsg/mlton/closure-convert/closure-convert.sig000066400000000000000000000010251416264345000241450ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CLOSURE_CONVERT_STRUCTS = sig structure Ssa: SSA structure Sxml: SXML sharing Sxml.Atoms = Ssa.Atoms end signature CLOSURE_CONVERT = sig include CLOSURE_CONVERT_STRUCTS val closureConvert: Sxml.Program.t -> Ssa.Program.t end mlton-20210117+dfsg/mlton/closure-convert/globalize.fun000066400000000000000000000153201416264345000227740ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Globalize (S: GLOBALIZE_STRUCTS): GLOBALIZE = struct open S open Dec PrimExp fun globalize {program = Program.T {datatypes, body, ...}, lambdaFree, varGlobal: Var.t -> bool ref} = let val noConts = not (Exp.hasPrim (body, fn p => case p of Prim.Thread_switchTo => true | _ => false)) local val {get: Tycon.t -> bool, set, destroy} = Property.destGetSetOnce (Tycon.plist, Property.initConst false) fun makeBig tycon = set (tycon, true) val _ = (Vector.foreach (datatypes, makeBig o #tycon) ; makeBig Tycon.array ; makeBig Tycon.arrow ; makeBig Tycon.vector) in val tyconIsBig = get val destroyTycon = destroy end fun typeIsSmall t = let open Type in case dest t of Con (c, ts) => not (tyconIsBig c) andalso if (Tycon.equals (c, Tycon.tuple) orelse Tycon.equals (c, Tycon.reff)) then Vector.forall (ts, typeIsSmall) else true | _ => Error.bug "Globalize.typeIsSmall: type variable" end val typeIsSmall = Trace.trace ("Globalize.typeIsSmall", Type.layout, Bool.layout) typeIsSmall val varIsGlobal = ! o varGlobal val isGlobal = varIsGlobal o VarExp.var fun areGlobal xs = Vector.forall (xs, isGlobal) fun makeGlobal x = varGlobal x := true val traceLoopExp = Trace.trace2 ("Globalize.loopExp", Exp.layout, Bool.layout, Bool.layout) val traceLoopDec = Trace.trace2 ("Globalize.loopDec", Dec.layout, Bool.layout, Bool.layout) fun loopExp arg = traceLoopExp (fn (e: Exp.t, once: bool) => List.fold (Exp.decs e, once, loopDec)) arg and loopDec arg = traceLoopDec (fn (d, once) => case d of MonoVal {var, ty, exp} => let val (global, once) = case exp of App _ => (* If conts are used, then the application might * call Thread_copyCurrent, in which case, * subsequent stuff might run many times. *) (false, once andalso noConts) | Case {cases, default, ...} => let val once' = Cases.fold (cases, once, fn (e, b) => loopExp (e, once) andalso b) val once' = Option.fold (default, once', fn (e, b) => loopExp (e, once) andalso b) in (false, once') end | ConApp {arg, ...} => (case arg of NONE => true | SOME x => isGlobal x, once) | Const _ => (true, once) | Handle {try, handler, ...} => (false, loopExp (handler, loopExp (try, once))) | Lambda l => (loopLambda l ; (Vector.forall (lambdaFree l, varIsGlobal), once)) | PrimApp {prim, args, ...} => let val global = areGlobal args andalso ((Prim.isFunctional prim (* Don't want to move MLton_equal or MLton_hash * into the globals because polymorphic * equality and hasing isn't implemented * there. *) andalso (case prim of Prim.MLton_equal => false | Prim.MLton_hash => false | _ => true)) orelse (once andalso (case prim of Prim.Ref_ref => typeIsSmall ty | _ => false))) val once = once andalso (case prim of Prim.Thread_copyCurrent => false | _ => true) in (global, once) end | Profile _ => (false, once) | Raise _ => (false, once) | Select {tuple, ...} => (isGlobal tuple, once) | Tuple xs => (areGlobal xs, once) | Var x => (isGlobal x, once) val _ = if global then makeGlobal var else () in once end | Fun {decs, ...} => (if Vector.isEmpty decs then () else let val {lambda, ...} = Vector.first decs in if Vector.forall (lambdaFree lambda, varIsGlobal) then Vector.foreach (decs, makeGlobal o #var) else () end ; Vector.foreach (decs, loopLambda o #lambda) ; once) | _ => Error.bug "Globalize.loopDec: strange dec") arg and loopLambda (l: Lambda.t): unit = ignore (loopExp (Lambda.body l, false)) val _ = loopExp (body, true) val _ = destroyTycon () in () end end mlton-20210117+dfsg/mlton/closure-convert/globalize.sig000066400000000000000000000011221416264345000227610ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature GLOBALIZE_STRUCTS = sig include SXML end signature GLOBALIZE = sig include GLOBALIZE_STRUCTS val globalize: { program: Program.t, lambdaFree: Lambda.t -> Var.t vector, varGlobal: Var.t -> bool ref } -> unit end mlton-20210117+dfsg/mlton/closure-convert/lambda-free.fun000066400000000000000000000173001416264345000231630ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor LambdaFree (S: LAMBDA_FREE_STRUCTS): LAMBDA_FREE = struct open S open Dec PrimExp structure Status = struct datatype t = Unseen | Free | Bound val init = Unseen end datatype status = datatype Status.t fun lambdaFree {program = Program.T {body, ...}, varInfo: Var.t -> {frees: Var.t list ref ref, status: Status.t ref}, lambdaInfo: Lambda.t -> {frees: Var.t vector ref, recs: Var.t vector ref}} = let fun setFree (l: Lambda.t, xs: Var.t vector): unit = #frees (lambdaInfo l) := xs fun setRec (l: Lambda.t, xs: Var.t vector): unit = #recs (lambdaInfo l) := xs type scope = {frees: Var.t list ref, get: Var.t -> Status.t, set: Var.t * Status.t -> unit} fun bind (x: Var.t, {set, ...}: scope) = set (x, Bound) fun var (x: Var.t, {get, set, frees}: scope) = case get x of Unseen => (set (x, Free); List.push (frees, x)) | _ => () fun vars (xs, s) = Vector.foreach (xs, fn x => var (x, s)) fun varExp (x: VarExp.t, s: scope) = var (VarExp.var x, s) fun varExpOpt (x, s) = case x of NONE => () | SOME x => varExp (x, s) fun varExps (xs, s) = Vector.foreach (xs, fn x => varExp (x, s)) (* newScope is invoked whenever there is a need to consider a new scope while looking for free variables. Its only parameter is a function taking a record that represents a scope supporting "setting" and "getting" variable statuses. The intent is that `th` will continue traversing the program in the current scope while aggregating variable statuses. Initially, newScope creates a reference to a list of variables (`frees`) Its purpose is twofold: - It is a unique identifier for every encountered scope. - It is utilized by `th` to aggregate all variabes Since each variable has an associated status, updating every single status in the program would be unreasonably slow. Thus, we delay updating the status by associating each variable with the last scope for which that variable was seen. If the variable has been unmentioned until this point in the current scope, then we save its last scope and status, and "initialize" it to be Unseen. This is achieved by having `get` and `set` use the `statusRef` function. After setting up these operations, we perform `th`, and then recover every variable's previous status and scope so that we may continue traversing the program. *) fun newScope (th: {frees: Var.t list ref, get: Var.t -> Status.t, set: Var.t * Status.t -> unit } -> unit) : Var.t vector = let val frees = ref [] val all = ref [] fun statusRef x = let val {frees = frees', status, ...} = varInfo x in if frees = !frees' then () else (List.push (all, (frees', !frees', status, !status)) ; frees' := frees; status := Unseen) ; status end fun get x = !(statusRef x) fun set (x, s) = statusRef x := s val _ = th {frees = frees, get = get, set = set} val _ = List.foreach (!all, fn (r, v, r', v') => (r := v; r' := v')) in Vector.fromList (!frees) end fun exp (e, s) = let val {decs, result} = Exp.dest e in List.foreach (decs, fn Exception _ => () | MonoVal {var, exp, ...} => (primExp (exp, s); bind (var, s)) | PolyVal {var, exp = e, ...} => (exp (e, s); bind (var, s)) | Fun {decs, ...} => let val {get = isBound, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initConst false) (* Consider each of the functions in this function group to be bound according to a property list. *) val _ = Vector.foreach (decs, fn {var, ...} => set (var, true)) (* Consider this recursive function group to be part of a new scope. Then accumulate all free variables from each function (`lambda l`) and if it is a mutually recursive function from this group (i.e. it was marked as bound), then treat it as such; otherwise, delegate the responsibility of checking/setting the variable to the var function *) val xs = newScope (fn s => Vector.foreach (decs, fn {lambda = l, ...} => setRec (l, Vector.keepAll (lambda l, fn x => if isBound x then true else (var (x, s); false))))) (* Get rid of the list of mutually recursive functions *) val _ = destroy () (* Each function in this function group will have the same associated free variables. Its name will then be bound to the current scope. *) val _ = Vector.foreach (decs, fn {var, lambda, ...} => (setFree (lambda, xs) ; bind (var, s))) in vars (xs, s) end) ; varExp (result, s) end and primExp (e, s) = case e of App {func, arg} => (varExp (func, s); varExp (arg, s)) | Case {test, cases, default} => (varExp (test, s) ; Option.app (default, fn e => exp (e, s)) ; Cases.foreach' (cases, fn e => exp (e, s), fn Pat.T {arg, ...} => Option.app (arg, fn (x, _) => bind (x, s)))) | ConApp {arg, ...} => varExpOpt (arg, s) | Const _ => () | Handle {try, catch, handler} => (exp (try, s); bind (#1 catch, s); exp (handler, s)) | Lambda l => let val xs = lambda l in setFree (l, xs); vars (xs, s) end | PrimApp {args, ...} => varExps (args, s) | Profile _ => () | Raise {exn, ...} => varExp (exn, s) | Select {tuple, ...} => varExp (tuple, s) | Tuple xs => varExps (xs, s) | Var x => varExp (x, s) and lambda (l: Lambda.t) : Var.t vector = let val {arg, body, ...} = Lambda.dest l in newScope (fn s => (bind (arg, s); exp (body, s))) end val frees = newScope (fn s => exp (body, s)) val _ = if Vector.isEmpty frees then () else Error.bug ("LambdaFree.lambdaFree: program has free variables: " ^ (Layout.toString (Vector.layout Var.layout frees))) in () end end mlton-20210117+dfsg/mlton/closure-convert/lambda-free.sig000066400000000000000000000031711416264345000231560ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature LAMBDA_FREE_STRUCTS = sig include SXML end signature LAMBDA_FREE = sig include LAMBDA_FREE_STRUCTS structure Status: sig type t val init: t end (* * When called, descends the entire program and attaches a property * to each lambda primExp in the program. Then, you can use * lambdaFree to get free variables of that lambda. * For lambdas bound in a Fun dec, lambdaFree gives the union of the * frees of the entire group of mutually recursive functions. Hence, * lambdaFree for every lambda in a single Fun dec is the same. * Furthermore, for a lambda bound in a Fun dec, lambdaRec gives * the list of other funs bound in the same dec that the lambda refers * to. For example: * * val rec f = fn x => ... y ... g ... f ... * and g = fn z => ... f ... w ... * * lambdaFree(fn x =>) = [y, w] * lambdaFree(fn z =>) = [y, w] * lambdaRec(fn x =>) = [g, f] * lambdaRec(fn z =>) = [f] *) val lambdaFree: {program: Program.t, varInfo: Var.t -> {frees: Var.t list ref ref, status: Status.t ref}, lambdaInfo: Lambda.t -> {frees: Var.t vector ref, recs: Var.t vector ref}} -> unit end mlton-20210117+dfsg/mlton/closure-convert/sources.cm000066400000000000000000000010251416264345000223130ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor ClosureConvert is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm ../ssa/sources.cm ../xml/sources.cm abstract-value.sig abstract-value.fun globalize.sig globalize.fun lambda-free.sig lambda-free.fun closure-convert.sig closure-convert.fun mlton-20210117+dfsg/mlton/closure-convert/sources.mlb000066400000000000000000000011031416264345000224630ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../ssa/sources.mlb ../xml/sources.mlb abstract-value.sig abstract-value.fun globalize.sig globalize.fun lambda-free.sig lambda-free.fun closure-convert.sig closure-convert.fun in functor ClosureConvert end mlton-20210117+dfsg/mlton/codegen/000077500000000000000000000000001416264345000165635ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/codegen/amd64-codegen/000077500000000000000000000000001416264345000211005ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-allocate-registers.fun000066400000000000000000017066331416264345000263340ustar00rootroot00000000000000(* Copyright (C) 2010,2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64AllocateRegisters(S: AMD64_ALLOCATE_REGISTERS_STRUCTS) : AMD64_ALLOCATE_REGISTERS = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop fun track memloc = let val trackClasses = ClassSet.+(ClassSet.+ (!amd64MLton.Classes.livenessClasses, !amd64MLton.Classes.holdClasses), ClassSet.fromList [amd64MLton.Classes.StaticNonTemp, amd64MLton.Classes.CArg]) in ClassSet.contains(trackClasses, MemLoc.class memloc) end fun volatile memloc = let val volatileClasses = !amd64MLton.Classes.volatileClasses in ClassSet.contains(volatileClasses, MemLoc.class memloc) end fun partition(l, p) = let val rec partition' = fn ([],PS) => PS | (h::t,PS) => let val rec partition'' = fn [] => [[h]] | P::PS => if List.exists(P,fn x => p(h, x)) then (h::P)::PS else P::(partition'' PS) in partition'(t,partition'' PS) end in partition'(l,[]) end fun totalOrder (l, plt) = let val rec totalOrder' = fn ([],l) => l | (h::t,l) => let val rec split = fn (lt,t) => case List.splitPrefix (t, fn x => plt(x,h)) of (nil,t) => lt@[h]@t | (lt',t) => split(lt@lt',t) in totalOrder'(t,split([],l)) end in totalOrder'(l,[]) end val bool_lt = fn (false, true) => true | _ => false val bool_gt = fn (true, false) => true | _ => false fun option_lt lt = fn (SOME x, SOME y) => lt (x,y) | (NONE, SOME _) => true | _ => false structure Liveness = struct datatype futureMemlocTag = FLIVE | FCOMMIT | FREMOVE | FDEAD | FUSE | FUSEDEF | FDEF val futureMemlocTag_toString = fn FLIVE => "FLIVE" | FCOMMIT => "FCOMMIT" | FREMOVE => "FREMOVE" | FDEAD => "FDEAD" | FUSE => "FUSE" | FUSEDEF => "FUSEDEF" | FDEF => "FDEF" type futureMemloc = futureMemlocTag * MemLoc.t datatype futureMemlocPredTag = FCOMMITP | FREMOVEP | FDEADP | FMCOMMITP | FMREMOVEP val futureMemlocPredTag_toString = fn FCOMMITP => "FCOMMITP" | FREMOVEP => "FREMOVEP" | FDEADP => "FDEADP" | FMCOMMITP => "FMCOMMITP" | FMREMOVEP => "FMREMOVEP" type futureMemlocPred = futureMemlocPredTag * (MemLoc.t -> bool) datatype future = M of futureMemloc | MP of futureMemlocPred val future_toString = fn (M (tag, memloc)) => concat [futureMemlocTag_toString tag, " ", MemLoc.toString memloc] | (MP (tag, _)) => concat [futureMemlocPredTag_toString tag] type hint = Register.t * MemLoc.t list * MemLocSet.t type xmmhint = XmmRegister.t * MemLoc.t list * MemLocSet.t val hint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", Register.toString register] val xmmhint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", XmmRegister.toString register] type t = {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, futures: {pre: future list, post: future list}, hint: hint list, xmmhint: xmmhint list} (* fun toString {dead, commit, remove, futures = {pre, post}, hint, xmmhint} = let fun doit (name, l, toString, s) = List.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) fun doit' (name, l, toString, s) = MemLocSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, doit("xmmhint: ", xmmhint, xmmhint_toString, ""))))))) end *) fun toComments {dead, commit, remove, futures = {pre, post}, hint, xmmhint} = let fun doit (name, l, toString, ac) = List.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) fun doit' (name, l, toString, ac) = MemLocSet.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, doit("xmmhint: ", xmmhint, xmmhint_toString, []))))))) end datatype commit = NO | COMMIT | REMOVE | DEAD fun predict(future, memloc) = let val rec sawNothing = fn [] => if track memloc then DEAD else REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawCommit future | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => sawUse future | FUSEDEF => NO | FDEF => DEAD else if ((tag' = FUSEDEF) orelse (tag' = FDEF)) andalso List.exists (MemLoc.utilized memloc, fn memloc'' => MemLoc.mayAlias(memloc'', memloc')) then REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawNothing future else sawNothing future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => sawRemove future | FDEADP => DEAD | FMCOMMITP => sawCommit future | FMREMOVEP => sawRemove future else sawNothing future and sawCommit = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawCommit future | FREMOVE => REMOVE | FDEAD => REMOVE | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawCommit future else sawCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => REMOVE | FDEADP => REMOVE | FMCOMMITP => sawCommit future | FMREMOVEP => REMOVE else sawCommit future and sawRemove = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => REMOVE | FCOMMIT => REMOVE | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => DEAD else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawRemove future else sawRemove future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => REMOVE | FREMOVEP => REMOVE | FDEADP => DEAD | FMCOMMITP => REMOVE | FMREMOVEP => sawRemove future else sawRemove future and sawUse = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => sawUse future | FUSEDEF => NO | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUse future else sawUse future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUse future and sawUseCommit = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUseCommit future else sawUseCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUseCommit future fun check commit = if List.exists (MemLoc.utilized memloc, fn memloc' => case predict (future, memloc') of REMOVE => true | DEAD => true | _ => false) then REMOVE else commit val default = case sawNothing future of REMOVE => REMOVE | DEAD => DEAD | commit => check commit in default end val split = fn (set, p) => MemLocSet.fold (set, (MemLocSet.empty,MemLocSet.empty,MemLocSet.empty,MemLocSet.empty), fn (memloc, (no, commit, remove, dead)) => let val add = fn set => MemLocSet.add(set, memloc) in case p memloc of NO => (add no, commit, remove, dead) | COMMIT => (no, add commit, remove, dead) | REMOVE => (no, commit, add remove, dead) | DEAD => (no, commit, remove, add dead) end) fun liveness {uses: MemLocSet.t, defs: MemLocSet.t, future: future list} : {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, future: future list} = let local fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) in val allUses = doit'(defs, doit'(uses, uses)) val allDefs = defs end val current = MemLocSet.+(allUses, allDefs) val current_usedef = MemLocSet.intersect(allUses, allDefs) val current_use = MemLocSet.-(allUses, current_usedef) val current_def = MemLocSet.-(allDefs, current_usedef) val (_,commit,remove,dead) = split(current, fn memloc => predict(future, memloc)) val future = let fun doit(memlocs, tag, future) = MemLocSet.fold (memlocs, future, fn (memloc,future) => (M (tag, memloc))::future) in doit(current_use, FUSE, doit(current_usedef, FUSEDEF, doit(current_def, FDEF, future))) end val info = {dead = dead, commit = commit, remove = remove, future = future} in info end fun livenessInstruction {instruction: Instruction.t, future: future list} = let val future_post = future val {uses, defs, ...} = Instruction.uses_defs_kills instruction local fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand, memlocs) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(memlocs, memloc) | NONE => memlocs) in val uses = doit uses val defs = doit defs end val {dead,commit,remove,future} = liveness {uses = uses, defs = defs, future = future_post} val future_pre = future val info = {dead = dead, commit = commit, remove = remove, futures = {pre = future_pre, post = future_post}} in info end fun livenessDirective {directive: Directive.t, future: future list} = let val future_post = future fun addLive (memlocsX, f) = List.fold (memlocsX, future, fn (X, future) => (M (FLIVE, f X))::future) fun addLive' (memlocs) = MemLocSet.fold (memlocs, future, fn (memloc, future) => (M (FLIVE, memloc))::future) val future_pre = case directive of Directive.Reset => [] | Directive.Cache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.XmmCache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes, ...} => MemLocSet.fold (commit_memlocs, MemLocSet.fold (remove_memlocs, MemLocSet.fold (dead_memlocs, (MP (FCOMMITP, fn memloc => ClassSet.contains(commit_classes, MemLoc.class memloc))):: (MP (FREMOVEP, fn memloc => ClassSet.contains(remove_classes, MemLoc.class memloc))):: (MP (FDEADP, fn memloc => ClassSet.contains(dead_classes, MemLoc.class memloc))):: future, fn (memloc,future) => (M (FDEAD, memloc))::future), fn (memloc,future) => (M (FREMOVE, memloc))::future), fn (memloc,future) => (M (FCOMMIT, memloc))::future) | Directive.CCall => (MP (FCOMMITP, fn memloc => MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))):: (MP (FMREMOVEP, fn memloc => (not (MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))) andalso (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.Return {returns} => (List.map(returns, fn {dst, ...} => M (FDEF, dst))) @ future | Directive.SaveRegAlloc {live, ...} => addLive'(live) | _ => future val info = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future_pre, post = future_post}} in info end fun livenessAssembly {assembly: Assembly.t, future: future list, hint: hint list, xmmhint: xmmhint list} : t = let fun default () = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future, post = future}} val {dead, commit, remove, futures} = case assembly of Assembly.Comment _ => default () | Assembly.Directive d => livenessDirective {directive = d, future = future} | Assembly.Instruction i => livenessInstruction {instruction = i, future = future} | Assembly.Label _ => default () | Assembly.PseudoOp _ => default () val hint' = Assembly.hints assembly val hint = List.fold (case assembly of Assembly.Directive Directive.Reset => [] | _ => hint, List.revMap (hint', fn (memloc, register) => (register, [memloc], MemLocSet.empty)), fn ((hint_register,hint_memlocs,hint_ignore),hint) => if List.exists (hint, fn (hint_register',_,_) => Register.coincide(hint_register, hint_register')) then hint else let val hint_memloc = hd hint_memlocs in if List.fold (hint, false, fn ((_,hint_memlocs',_),b) => b orelse List.contains (hint_memlocs', hint_memloc, MemLoc.eq)) then hint else (hint_register, [hint_memloc], MemLocSet.union(dead, hint_ignore))::hint end) val hint = case assembly of (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (hint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => hint val xmmhint = case assembly of (Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (xmmhint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => xmmhint val info = {dead = dead, commit = commit, remove = remove, futures = futures, hint = hint, xmmhint = xmmhint} in info end fun toLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = let val {assembly,...} = List.foldr (assembly, {assembly = [], future = [], hint = [], xmmhint = []}, fn (asm, {assembly,future,hint,xmmhint}) => let val info as {futures = {pre, ...}, hint, xmmhint, ...} = livenessAssembly {assembly = asm, future = future, hint = hint, xmmhint = xmmhint} in {assembly = (asm,info)::assembly, future = pre, hint = hint, xmmhint = xmmhint} end) in assembly end val (toLiveness,toLiveness_msg) = tracer "toLiveness" toLiveness fun toNoLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = List.map(assembly, fn asm => (asm,{dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = [], post = []}, hint = [], xmmhint = []})) val (toNoLiveness,toNoLiveness_msg) = tracer "toNoLiveness" toNoLiveness end structure RegisterAllocation = struct exception Spill val spill : Int.t ref = ref 0 val spillLabel = Label.fromString "spill" val depth : Int.t ref = ref 0 datatype commit = NO | COMMIT of int | REMOVE of int | TRYCOMMIT of int | TRYREMOVE of int val commit_toString = fn NO => "NO" | COMMIT i => "COMMIT " ^ (Int.toString i) | REMOVE i => "REMOVE " ^ (Int.toString i) | TRYCOMMIT i => "TRYCOMMIT " ^ (Int.toString i) | TRYREMOVE i => "TRYREMOVE " ^ (Int.toString i) type value = {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun value_toString {register, memloc, weight, sync, commit} = concat [Register.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type xmmvalue = {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun xmmvalue_toString {register, memloc, weight, sync, commit} = concat [XmmRegister.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type t = {entries: value list, reserved: Register.t list, xmmentries: xmmvalue list, xmmreserved: XmmRegister.t list} fun toString ({entries, reserved, xmmentries, xmmreserved}: t) = let fun doit (name, l, toString, ac) = (name ^ "\n") ^ (List.fold(l, ac, fn (x, ac) => (toString x) ^ "\n" ^ ac)) in doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("xmmentries:", xmmentries, xmmvalue_toString, doit("xmmreserved:", xmmreserved, XmmRegister.toString, "")))) end fun toComments ({entries, reserved, xmmentries, xmmreserved}: t) = let fun doit (name, l, toString, ac) = (Assembly.comment name):: (List.fold(l, ac, fn (x, ac) => (Assembly.comment (toString x)):: ac)) in AppendList.fromList (doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("xmmentries:", xmmentries, xmmvalue_toString, doit("xmmreserved:", xmmreserved, XmmRegister.toString, []))))) end val {get = getRA : Directive.Id.t -> {registerAllocation: t}, set = setRA, ...} = Property.getSetOnce (Directive.Id.plist, Property.initRaise ("getRA", fn _ => Layout.empty)) fun empty () : t = {entries = [], reserved = [], xmmentries = [], xmmreserved = []} fun reserve' {register: Register.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = register::reserved, xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmreserve' {register: XmmRegister.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = register::xmmreserved}} fun reserve {registers: Register.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = registers @ reserved, xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmreserve {registers: XmmRegister.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = registers @ xmmreserved}} fun unreserve' {register: Register.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => Register.eq (register', register)), xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmunreserve' {register: XmmRegister.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = List.revRemoveAll (xmmreserved, fn register' => XmmRegister.eq (register', register))}} fun unreserve {registers: Register.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => List.contains (registers, register', Register.eq)), xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmunreserve {registers: XmmRegister.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = List.revRemoveAll (xmmreserved, fn register' => List.contains (registers, register', XmmRegister.eq))}} fun valueMap {map, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = List.revMap(entries, map), reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmvalueMap {map, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = List.revMap(xmmentries, map), xmmreserved = xmmreserved} fun valueFilter {filter, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, filter) fun xmmvalueFilter {filter, registerAllocation = {xmmentries, ...}: t} = List.revKeepAll(xmmentries, filter) fun valueRegister {register, registerAllocation} = case valueFilter {filter = fn {register = register', ...} => Register.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.valueRegister" (* fun xmmvalueRegister {register, registerAllocation} = case xmmvalueFilter {filter = fn {register = register', ...} => XmmRegister.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.xmmvalueRegister" *) fun valuesRegister {register = Register.T {reg, ...}, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, fn {register = Register.T {reg = reg', ...}, ...} => reg = reg') fun xmmvaluesXmmRegister {register = XmmRegister.T {reg, ...}, registerAllocation = {xmmentries, ...}: t} = List.revKeepAll(xmmentries, fn {register = XmmRegister.T {reg = reg', ...}, ...} => reg = reg') fun update {value as {register,...}, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = let val entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register,register')) in value::entries end, reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmupdate {value as {register,...}, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = let val xmmentries = List.revRemoveAll(xmmentries, fn {register = register',...} => XmmRegister.eq(register,register')) in value::xmmentries end, xmmreserved = xmmreserved} fun delete {register, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register, register')), reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmdelete {register, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = List.revRemoveAll(xmmentries, fn {register = register',...} => XmmRegister.eq(register, register')), xmmreserved = xmmreserved} fun deletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => delete {register = register, registerAllocation = registerAllocation}) fun xmmdeletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => xmmdelete {register = register, registerAllocation = registerAllocation}) fun allocated {memloc, registerAllocation: t} = case valueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocated" fun xmmallocated {memloc, registerAllocation: t} = case xmmvalueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.xmmallocated" fun remove {memloc, registerAllocation: t} = case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => delete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun xmmremove {memloc, registerAllocation: t} = case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => xmmdelete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun removes {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => remove {memloc = memloc, registerAllocation = registerAllocation}) fun xmmremoves {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => xmmremove {memloc = memloc, registerAllocation = registerAllocation}) local val commitPush' = fn NO => NO | COMMIT i => COMMIT (i + 1) | REMOVE i => REMOVE (i + 1) | TRYCOMMIT i => TRYCOMMIT (i + 1) | TRYREMOVE i => TRYREMOVE (i + 1) val commitPop' = fn NO => NO | COMMIT i => COMMIT (i - 1) | REMOVE i => REMOVE (i - 1) | TRYCOMMIT i => TRYCOMMIT (i - 1) | TRYREMOVE i => TRYREMOVE (i - 1) in fun commitPush {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun xmmcommitPush {registerAllocation: t} = xmmvalueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun commitPop {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} fun xmmcommitPop {registerAllocation: t} = xmmvalueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} end fun savedRegisters {saves: Operand.t list, registerAllocation: t} : Register.t list = List.concatMap (saves, fn Operand.MemLoc m => (case allocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.Register r => [r] | Operand.Address (Address.T {base, index, ...}) => (case (base, index) of (NONE, NONE ) => [] | (SOME rb, NONE ) => [rb] | (NONE, SOME ro) => [ro] | (SOME rb, SOME ro) => [rb,ro]) | _ => []) fun savedXmmRegisters {saves: Operand.t list, registerAllocation: t} : XmmRegister.t list = List.concatMap (saves, fn Operand.MemLoc m => (case xmmallocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.XmmRegister r => [r] | _ => []) fun supportedRegisters {supports: Operand.t list, registerAllocation: t} : Register.t list = let fun supportedRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME {register, ...}, _) => [register] | (_, SOME _) => [] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedRegisters' m | _ => []) end fun supportedXmmRegisters {supports: Operand.t list, registerAllocation: t} : XmmRegister.t list = let fun supportedXmmRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [] | (_, SOME {register, ...}) => [register] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedXmmRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedXmmRegisters' m | _ => []) end fun supportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = let fun supportedMemLocs' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [memloc] | (_, SOME _) => [memloc] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedMemLocs') in List.concatMap (supports, fn Operand.MemLoc m => supportedMemLocs' m | _ => []) end fun 'a spillAndReissue {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t, spiller : {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} -> {assembly: Assembly.t AppendList.t, registerAllocation: t}, msg : string, reissue : {assembly: Assembly.t AppendList.t, registerAllocation: t} -> 'a} : 'a = (Int.dec depth; if !depth = 0 then let val _ = Int.inc depth val {assembly, registerAllocation} = spiller {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val return = reissue {assembly = assembly, registerAllocation = registerAllocation} handle Spill => (Error.bug (concat [msg, ":reSpill"])) val _ = Int.dec depth in return end else raise Spill) fun potentialRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: Register.t list, registerAllocation: t}): Register.t list = case force of [] => Register.registers size | registers => List.revKeepAll(Register.registers size, fn register => List.contains(registers, register, Register.eq)) fun potentialXmmRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t}): XmmRegister.t list = case force of [] => XmmRegister.registers size | registers => List.revKeepAll(XmmRegister.registers size, fn register => List.contains(registers, register, XmmRegister.eq)) fun chooseRegister {info = {futures = {pre = future, ...}, hint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation as {reserved,...}: t} : {register: Register.t, coincide_values: value list} = let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, Register.eq) then preserved else register::preserved) in doit(saved, doit(reserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => Register.coincide(register',register''))) val supported = supportedRegisters {supports = supports, registerAllocation = registerAllocation} val values = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (hint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if Register.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if Register.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = valuesRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if Register.coincide(register,register') then let val support_cost' = List.contains(supported, register, Register.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,Register.toString)) val reserved = listToString(List.map(reserved,Register.toString)) val msg = concat["\n", "chooseRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "reserved = ", reserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseRegister\n"; raise Spill end | register::_ => register val values = valuesRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => Register.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun chooseXmmRegister {info = {futures = {pre = future, ...}, xmmhint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation as {xmmreserved,...}: t} : {register: XmmRegister.t, coincide_values: xmmvalue list} = let val registers = potentialXmmRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedXmmRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, XmmRegister.eq) then preserved else register::preserved) in doit(saved, doit(xmmreserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => XmmRegister.coincide(register',register''))) val supported = supportedXmmRegisters {supports = supports, registerAllocation = registerAllocation} val values = xmmvalueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (xmmhint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if XmmRegister.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if XmmRegister.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = xmmvaluesXmmRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if XmmRegister.coincide(register,register') then let val support_cost' = List.contains(supported, register, XmmRegister.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,XmmRegister.toString)) val xmmreserved = listToString(List.map(xmmreserved,XmmRegister.toString)) val msg = concat["\n", "chooseXmmRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "xmmreserved = ", xmmreserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseXmmRegister\n"; raise Spill end | register::_ => register val values = xmmvaluesXmmRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => XmmRegister.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun freeRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t}) : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (Register.registers (MemLoc.size memloc), fn register' => Register.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.register final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if Register.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and freeXmmRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t}) : {register: XmmRegister.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseXmmRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (XmmRegister.registers (MemLoc.size memloc), fn register' => XmmRegister.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.xmmregister final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if XmmRegister.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeXmmRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeXmmRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {reserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = valueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.commitRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitXmmRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {xmmreserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = xmmvalueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.xmmregister register)::saves, Operand.eq) val size = XmmRegister.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.Address address, src = Operand.XmmRegister register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.xmmregister register)::saves, Operand.eq) val size = XmmRegister.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (xmmreserved, register, XmmRegister.eq) then registerAllocation else xmmremove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.Address address, src = Operand.XmmRegister register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (xmmreserved, register, XmmRegister.eq) then registerAllocation else xmmremove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.commitXmmRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitXmmRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and spillRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val spillStart = !spill val {reserved, ...} = registerAllocation val {assembly = assembly_unreserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val saved = List.fold (reserved, saved, fn (register,saved) => if List.contains(saved,register,Register.eq) then saved else register::saved) val saves = valueFilter {filter = fn {register, ...} => List.contains(saved, register, Register.eq), registerAllocation = registerAllocation} val all = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} (* partition the values in the register file * by their base register. *) val groups = partition (all, fn ({register = Register.T {reg = reg1, ...},...}, {register = Register.T {reg = reg2, ...},...}) => reg1 = reg2) (* order the groups by number of registers used *) val groups = List.insertionSort (groups, fn (g1,g2) => (List.length g1) < (List.length g2)) (* choose four registers to spill *) val spills = case groups of g1::g2::g3::g4::_ => List.concat [g1,g2,g3,g4] | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.spillRegisters" (* totally order the spills by utilization *) val spills = totalOrder (spills, fn ({memloc = memloc1, ...}, {memloc = memloc2, ...}) => List.contains(MemLoc.utilized memloc2, memloc1, MemLoc.eq)) fun mkReplacer (spillMap : (value * MemLoc.t) list) = fn memloc' => case List.peek(spillMap, fn ({memloc,...},_) => MemLoc.eq(memloc,memloc')) of SOME (_,spillMemloc) => spillMemloc | NONE => memloc' (* associate each spilled value with a spill slot *) val (spillMap, spillEnd) = List.fold (spills, ([], spillStart), fn (value as {memloc, ...}, (spillMap, spillEnd)) => let val spillMemLoc = MemLoc.imm {base = Immediate.label spillLabel, index = Immediate.int spillEnd, scale = amd64MLton.wordScale, size = MemLoc.size memloc, class = amd64MLton.Classes.Temp} in ((value,spillMemLoc)::spillMap, spillEnd + 1) end) val replacer = mkReplacer spillMap (* commit everything in the register file; * also replace all memlocs that are spilled with their spill slot *) val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => if List.exists (spillMap, fn ({memloc = memloc',...},_) => MemLoc.eq(memloc,memloc')) then {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = false, commit = NO} else {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} (* update next available spill slot for cascading spills *) val _ = spill := spillEnd (* commit everything; * since the spilt memlocs look like they are spill slots, * they can all be committed to memory without any additional * registers. *) val {assembly = assembly_commit1, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} (* unspill; as we pull values in, we update the memloc to what it * looks under the pending unspills, and then replace any occurences * of the spill slot with the updated memloc; * by the time we are done, everything should be mapped back to * its original form. *) val {assembly = assembly_unspill, registerAllocation = registerAllocation} = let val rec doit = fn ([],{assembly,registerAllocation}) => {assembly = assembly, registerAllocation = registerAllocation} | (({memloc, weight, sync, commit, ...}, spillMemLoc)::spillMap, {assembly, registerAllocation}) => let val replacer = mkReplacer spillMap val memloc' = MemLoc.replace replacer memloc val {register, assembly = assembly_unspill, registerAllocation} = toRegisterMemLoc {memloc = spillMemLoc, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => {register = register, memloc = MemLoc.replace (fn memloc'' => if MemLoc.eq (memloc'', spillMemLoc) then memloc' else memloc'') memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in doit(spillMap, {assembly = AppendList.append (assembly, assembly_unspill), registerAllocation = registerAllocation}) end in doit(spillMap, {assembly = AppendList.empty, registerAllocation = registerAllocation}) end (* everything is unspilled *) val _ = spill := spillStart (* commit all the memlocs that got spilled. *) val {assembly = assembly_commit2, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val _ = spill := spillStart (* restore the saved operands to their previous locations. *) val {assembly = assembly_restore, registerAllocation} = List.fold (saves, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, commit, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = Register.size register, move = true, supports = supports, saves = [], force = [register], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve', registerAllocation} = List.fold (saved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve', registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve'), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val _ = Int.dec depth in {assembly = AppendList.appends [assembly_unreserve, assembly_commit1, assembly_unspill, assembly_commit2, assembly_restore, assembly_unreserve', assembly_reserve], registerAllocation = registerAllocation} end and toRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, Register.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.register final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = delete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | [{register = register', memloc = memloc', weight = weight', sync = sync', commit = commit'}] => if Register.eq(register',final_register) then let val registerAllocation = delete {register = register', registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight', sync = sync', commit = commit'}, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_xchg {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register final_register, dst = Operand.register register, size = size}), registerAllocation = registerAllocation} end end else let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then case MemLoc.size memloc of Size.BYTE => let val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = (Operand.memloc memloc):: supports, saves = saves, force = [], registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = (Operand.register register'):: saves, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_register, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end | _ => let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toXmmRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t} : {register: XmmRegister.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialXmmRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, XmmRegister.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.xmmregister register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.xmmregister final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = xmmdelete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_sse_movs {src = Operand.xmmregister register, dst = Operand.xmmregister final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.xmmregister register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_sse_movs {src = Operand.xmmregister register, dst = Operand.xmmregister final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = xmmupdate {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.xmmregister register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toXmmRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toAddressMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {address: Address.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (let val MemLoc.U {immBase, memBase, immIndex, memIndex, scale, ...} = MemLoc.destruct memloc (* Whenever possible, find labels with RIP-relative addressing. * It's smaller code and faster even for position dependent code. * However, RIP-relative addressing cannot be used with an index * register. For PIC code we will thus break the access down * into a leal for the symbol and a toRegister for the memIndex. *) (* Combine all immediate offsets into one *) val disp = case (immBase, immIndex) of (NONE, NONE) => Immediate.zero | (SOME immBase, NONE) => immBase | (NONE, SOME immIndex) => (case Immediate.destruct immIndex of Immediate.Word _ => immIndex | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:indexLabel") | (SOME immBase, SOME immIndex) => (case (Immediate.destruct immBase, Immediate.destruct immIndex) of (Immediate.Label l1, Immediate.Word w2) => Immediate.labelPlusWord (l1, w2) | (Immediate.LabelPlusWord (l1, w1), Immediate.Word w2) => Immediate.labelPlusWord (l1, WordX.add (w1, w2)) | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:disp") (* The base register gets supplied by three distinct cases: * 1 - memBase (which means that there is no label) * 2 - RIP (which means there is no index) * 3 - lea (which means this is PIC) * else nothing *) val {disp, register = register_base, assembly = assembly_base, registerAllocation} = case (Immediate.destruct disp, memBase, memIndex) of (Immediate.Word _, NONE, _) => {disp = SOME disp, register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | (Immediate.Word _, SOME memBase, _) (* no label, no rip *) => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memBase, info = info, size = MemLoc.size memBase, move = true, supports = case memIndex of NONE => supports | SOME memIndex => (Operand.memloc memIndex):: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {disp = SOME disp, register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end | (_, SOME _, _) (* label & memBase? bad input *) => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:base*2" | (_, NONE, NONE) (* no index => safe to use RIP-relative *) => {disp = SOME disp, register = SOME Register.rip, assembly = AppendList.empty, registerAllocation = registerAllocation} | (_, NONE, SOME memIndex) (* label + index => use lea if PIC *) => if not (!Control.Native.pic) then {disp = SOME disp, register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = disp, info = info, size = MemLoc.size memIndex, supports = Operand.memloc memIndex :: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in { disp = NONE, register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end val {register = register_index, assembly = assembly_index, registerAllocation} = case memIndex of NONE => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | SOME memIndex => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memIndex, info = info, size = MemLoc.size memIndex, move = true, supports = supports, saves = case (memBase, register_base) of (NONE, NONE) => saves | (NONE, SOME register_base) => if register_base = Register.rip then saves else Operand.register register_base :: saves | (SOME memBase, SOME register_base) => (Operand.memloc memBase):: (Operand.register register_base):: saves | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc", force = Register.indexRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end in {address = Address.T {disp = disp, base = register_base, index = register_index, scale = case memIndex of SOME _ => SOME scale | NONE => NONE}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) (* (case MemLoc.destruct memloc of MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Imm index, scale, size, ...} => let val disp' = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val disp = case disp' of NONE => SOME base | SOME disp' => SOME (Immediate.binexp {oper = Immediate.Addition, exp1 = base, exp2 = disp'}) in {address = Address.T {disp = disp, base = NONE, index = NONE, scale = NONE}, assembly = AppendList.empty, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Mem index, scale, size, ...} => let val disp = SOME base val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = NONE, index = SOME register_index, scale = SOME scale}, assembly = assembly_index, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Imm index, scale, size, ...} => let val disp = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = SOME register_base, index = NONE, scale = NONE}, assembly = assembly_base, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Mem index, scale, size, ...} => let val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = (Operand.memloc index)::supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = (Operand.memloc base):: (Operand.register register_base):: saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = NONE, base = SOME register_base, index = SOME register_index, scale = SOME scale}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) *) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toAddressMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {address = address, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toRegisterImmediate {immediate: Immediate.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, assembly, registerAllocation} = freeRegister {info = info, memloc = NONE, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val _ = Int.dec depth val instruction = case Immediate.destruct immediate of Immediate.Word x => if size = Size.QUAD andalso WordX.equals (x, WordX.resize (WordX.resize (x, WordSize.word32), WordSize.word64)) then (* use the implicit zero-extend of 32 bit ops *) Assembly.instruction_mov {dst = Operand.Register (Register.lowPartOf (final_register, Size.LONG)), src = Operand.immediate_word (WordX.resize (x, WordSize.word32)), size = Size.LONG} else Assembly.instruction_mov {dst = Operand.Register final_register, src = Operand.Immediate immediate, size = size} | _ => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME immediate, base = SOME Register.rip, index = NONE, scale = NONE }), size = size} in {register = final_register, assembly = AppendList.appends [assembly, AppendList.single instruction], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterImmediate", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = immediate, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} fun pre {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list, info as {dead, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val dead_memlocs = dead val remove_memlocs = remove val (allUses, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val allKeep = MemLocSet.unions [allUses, allDefs, allKills] val registerAllocation = xmmvalueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if MemLocSet.contains(allDefs, memloc) then if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "pre begin:"), (toComments ra)) else AppendList.empty, assembly_commit_xmmregisters, assembly_commit_registers, if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "pre end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (pre, pre_msg) = tracer "pre" pre fun post {uses: Operand.t list, final_uses: Operand.t list, defs: Operand.t list, final_defs: Operand.t list, kills: Operand.t list, info as {dead, commit, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val (final_uses_registers, final_defs_registers, final_uses_xmmregisters, final_defs_xmmregisters) = let fun doit(operands, (final_registers, final_xmmregisters)) = List.fold (operands, (final_registers, final_xmmregisters), fn (operand, (final_registers, final_xmmregisters)) => case (Operand.deRegister operand, Operand.deXmmregister operand) of (SOME register, _) => if List.contains(final_registers, register, Register.eq) then (final_registers, final_xmmregisters) else (register::final_registers, final_xmmregisters) | (_, SOME register) => if List.contains(final_xmmregisters, register, XmmRegister.eq) then (final_registers, final_xmmregisters) else (final_registers, register::final_xmmregisters) | _ => (final_registers, final_xmmregisters)) val (final_uses_registers, final_uses_xmmregisters) = doit(final_uses, ([], [])) val (final_defs_registers, final_defs_xmmregisters) = doit(final_defs, ([], [])) in (final_uses_registers, final_defs_registers, final_uses_xmmregisters, final_defs_xmmregisters) end val dead_memlocs = dead val commit_memlocs = commit val remove_memlocs = remove val (_, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val registerAllocation = xmmvalueMap {map = fn {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_xmmregisters, register, XmmRegister.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight - 500, commit = TRYREMOVE 0} else let val isSrc = List.contains (final_uses_xmmregisters, register, XmmRegister.eq) val isDst = List.contains (final_defs_xmmregisters, register, XmmRegister.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then value else let val isSrc = List.contains (final_uses_registers, register, Register.eq) val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, ...} => if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "post begin:"), (toComments ra)) else AppendList.empty, assembly_commit_xmmregisters, assembly_commit_registers, assembly_dead_registers, if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "post end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (post, post_msg) = tracer "post" post fun allocateOperand {operand: Operand.t, options = {register: bool, immediate: WordSize.t option, label: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.Immediate i => if Option.isSome immediate andalso (case Immediate.destruct i of Immediate.Word w => let val dstSize = Option.valOf immediate val srcSize = WordX.size w in case WordSize.compare (srcSize, dstSize) of LESS => true | EQUAL => true | GREATER => WordX.equals (w, WordX.resizeX (WordX.resizeX (w, dstSize), srcSize)) end | _ => false) then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = i, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else if address then let val address = Address.T {disp = SOME (Immediate.label (Label.fromString "raTemp1")), base = NONE, index = NONE, scale = NONE} in {operand = Operand.address address, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.immediate i, dst = Operand.address address, size = size}), registerAllocation = registerAllocation} end else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:Immediate" | Operand.Label l => if label then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if Option.isSome immediate andalso (* FIXME: could use RIP relative with 32bit immediate. *) (let val dstSize = Option.valOf immediate in case WordSize.compare (WordSize.word64, dstSize) of LESS => true | EQUAL => true | GREATER => false end) then {operand = Operand.immediate_label l, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = Immediate.label l, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:Label" | Operand.MemLoc m => let fun toRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.Register register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if register andalso address then case allocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toRegisterMemLoc' () | SOME _ => toRegisterMemLoc' () else if register then toRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:MemLoc" end | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand" val (allocateOperand, allocateOperand_msg) = tracer "allocateOperand" allocateOperand fun allocateXmmOperand {operand: Operand.t, options = {xmmregister: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.MemLoc m => let fun toXmmRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toXmmRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.XmmRegister register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if xmmregister andalso address then case xmmallocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toXmmRegisterMemLoc' () | SOME _ => toXmmRegisterMemLoc' () else if xmmregister then toXmmRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateXmmOperand: operand:MemLoc" end | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateXmmOperand: operand" val (allocateXmmOperand, allocateXmmOperand_msg) = tracer "allocateXmmOperand" allocateXmmOperand (* Implementation of directives. *) fun assume {assumes : {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun xmmassume {assumes : {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then xmmreserve' {register = register, registerAllocation = registerAllocation} else xmmunreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun cache {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | Reg of Register.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (Register.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => Register.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (Reg register, SOME memloc)) val to = case valueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => Reg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (Register.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (Reg rf, _, r, Reg rt) => Register.eq(rf, r) andalso Register.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.register r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((Reg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((Reg _, SOME m, r, Reg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end (* fun xmmcache {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | XmmReg of XmmRegister.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (XmmRegister.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => XmmRegister.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (XmmReg register, SOME memloc)) val to = case xmmvalueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => XmmReg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (XmmRegister.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (XmmReg rf, _, r, XmmReg rt) => XmmRegister.eq(rf, r) andalso XmmRegister.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.xmmregister r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((XmmReg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((XmmReg _, SOME m, r, XmmReg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = xmmreserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end *) fun xmmcache {caches : {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.map (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn ({register, memloc, reserve}, {assembly, registerAllocation, saves}) => let val {register, assembly = assembly_register, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, force = [register], registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then xmmreserve' {register = register, registerAllocation = registerAllocation} else {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun reset ({...}: {registerAllocation: t}) = {assembly = AppendList.empty, registerAllocation = empty ()} fun force {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t, info: Liveness.t, registerAllocation: t} = let val toCommit = fn TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 val toRemove = fn _ => REMOVE 0 val shouldCommit = fn memloc => (MemLocSet.contains(commit_memlocs, memloc) orelse ClassSet.contains(commit_classes, MemLoc.class memloc)) val shouldRemove = fn memloc => (MemLocSet.contains(remove_memlocs, memloc) orelse ClassSet.contains(remove_classes, MemLoc.class memloc)) val shouldDead = fn memloc => (MemLocSet.contains(dead_memlocs, memloc) orelse ClassSet.contains(dead_classes, MemLoc.class memloc)) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => value | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, commit, ...} => if shouldDead memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_commit_xmmregisters, assembly_commit_registers, assembly_dead_registers], registerAllocation = registerAllocation} end fun ccall {info: Liveness.t, registerAllocation: t} = let val cargClasses = !amd64MLton.Classes.cargClasses val cstaticClasses = !amd64MLton.Classes.cstaticClasses val {reserved = reservedStart, xmmreserved = xmmreservedStart, ...} = registerAllocation val {assembly = assembly_xmmreserve, registerAllocation} = List.fold (XmmRegister.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = xmmreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (Register.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val availCalleeSaveXmmRegisters = List.keepAll (XmmRegister.calleeSaveRegisters, fn calleeSaveReg => List.forall (#xmmreserved registerAllocation, fn reservedReg => not (XmmRegister.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_xmmshuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (xmmvalueFilter {filter = fn {register, memloc, ...} => (List.contains (XmmRegister.callerSaveRegisters, register, XmmRegister.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) andalso List.exists (availCalleeSaveXmmRegisters, fn calleeSaveReg => Size.eq (XmmRegister.size register, XmmRegister.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateXmmOperand {operand = Operand.memloc memloc, options = {xmmregister = true, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = XmmRegister.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val availCalleeSaveRegisters = List.keepAll (Register.calleeSaveRegisters, fn calleeSaveReg => List.forall (#reserved registerAllocation, fn reservedReg => not (Register.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_shuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (valueFilter {filter = fn {register, memloc, ...} => (List.contains (Register.callerSaveRegisters, register, Register.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) andalso List.exists (availCalleeSaveRegisters, fn calleeSaveReg => Size.eq (Register.size register, Register.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateOperand {operand = Operand.memloc memloc, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = Register.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if (List.contains (XmmRegister.callerSaveRegisters, register, XmmRegister.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if (List.contains (Register.callerSaveRegisters, register, Register.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_xmmunreserve, registerAllocation} = List.fold (List.removeAll (XmmRegister.callerSaveRegisters, fn register => List.contains(xmmreservedStart, register, XmmRegister.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = xmmunreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve, registerAllocation} = List.fold (List.removeAll (Register.callerSaveRegisters, fn register => List.contains(reservedStart, register, Register.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val registerAllocation = xmmdeletes {registers = XmmRegister.callerSaveRegisters, registerAllocation = registerAllocation} val registerAllocation = deletes {registers = Register.callerSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_xmmreserve, assembly_reserve, assembly_xmmshuffle, assembly_shuffle, assembly_commit_xmmregisters, assembly_commit_registers, assembly_xmmunreserve, assembly_unreserve], registerAllocation = registerAllocation} end fun return {returns: {src: Operand.t, dst: MemLoc.t} list, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn {memloc, ...} => List.exists (returns, fn {dst = return_memloc, ...} => List.exists(MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc)), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = xmmremoves {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = List.fold (returns, registerAllocation, fn ({src = operand, dst = return_memloc}, registerAllocation) => case operand of Operand.Register return_register => update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | Operand.XmmRegister return_register => xmmupdate {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.return") val (final_defs, defs) = List.fold (returns, ([],[]), fn ({src,dst},(final_defs,defs)) => (src::final_defs,(Operand.memloc dst)::defs)) val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = defs, final_defs = final_defs, kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end (* fun return {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn value as {memloc,...} => List.exists (MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val return_register = Register.return (MemLoc.size return_memloc) val registerAllocation = update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.register return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end fun fltreturn {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val return_register = FltRegister.return val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.fltregister return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end *) fun saveregalloc ({id, registerAllocation, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val _ = setRA(id, {registerAllocation = registerAllocation}) in {assembly = if !Control.codegenComments > 2 then (toComments registerAllocation) else AppendList.empty, registerAllocation = registerAllocation} end fun restoreregalloc ({live, id, info, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val {registerAllocation} = getRA id fun dump memloc = (track memloc) andalso not (MemLocSet.contains(live,memloc)) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation, ...} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_commit_xmmregisters, assembly_commit_registers), registerAllocation = registerAllocation} end end structure Instruction = struct structure RA = RegisterAllocation open Instruction (* * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) fun allocateSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val options_src = case final_dst of Operand.Register _ => {register = true, immediate = NONE, label = false, address = true} | _ => {register = true, immediate = NONE, label = false, address = false} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options_src, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.allocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.delete {register = register, registerAllocation = registerAllocation} in RA.allocateOperand {operand = dst, options = {register = false, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateSrcDst" (* * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) fun allocateSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val options_src2 = case final_src1 of Operand.Register _ => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | _ => {register = true, immediate = SOME WordSize.word32, label = false, address = false} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateOperand {operand = src2, options = options_src2, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add ? *) fun allocateXmmSrcDstAux {src: Operand.t, address_src: bool, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = address_src}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = address_src}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.xmmallocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.xmmdelete {register = register, registerAllocation = registerAllocation} in RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateXmmSrcDstAux" (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) fun allocateXmmSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = allocateXmmSrcDstAux {src = src, address_src = true, dst = dst, move_dst = move_dst, size = size, info = info, registerAllocation = registerAllocation} (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add *) fun allocateXmmSrcDstReg {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = allocateXmmSrcDstAux {src = src, address_src = false, dst = dst, move_dst = move_dst, size = size, info = info, registerAllocation = registerAllocation} (* * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X *) fun allocateXmmSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateXmmOperand {operand = src1, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateXmmOperand {operand = src1, options = {xmmregister = true, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateXmmOperand {operand = src2, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end fun allocateRegisters {instruction: t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = case instruction of NOP (* No operation *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.NOP val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | HLT (* Halt *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.HLT val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | BinAL {oper, src, dst, size} (* Integer binary arithmetic(w/o mult & div)/logic instructions. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.BinAL {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | pMD {oper, dst, src, size} (* Integer multiplication and division. * Require src operand as follows: * * src * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: pMD, size" val {assembly = assembly_clear, registerAllocation, ...} = RA.freeRegister {info = info, memloc = NONE, size = size, supports = [src,dst], saves = [], force = [hi], registerAllocation = registerAllocation} val registerAllocation = RA.delete {register = hi, registerAllocation = registerAllocation} val {final_src, assembly_src_dst, registerAllocation, ...} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} val force_src = List.revKeepAll (Register.registers size, fn r => not (Register.eq(r, hi) orelse Register.eq(r, lo))) val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi, dst,final_dst], force = force_src, registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val oper' = case oper of Instruction.IMUL => Instruction.IMUL | Instruction.MUL => Instruction.MUL | Instruction.IDIV => Instruction.IDIV | Instruction.DIV => Instruction.DIV | Instruction.IMOD => Instruction.IDIV | Instruction.MOD => Instruction.DIV val registerAllocation = if oper = Instruction.IMOD orelse oper = Instruction.MOD then case RA.valuesRegister {register = lo, registerAllocation = registerAllocation} of [{memloc, weight, sync, commit, ...}] => let val registerAllocation = RA.delete {register = lo, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = hi, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in registerAllocation end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: pMD, lo" else registerAllocation val instruction = Instruction.MD {oper = oper', src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_clear, assembly_src_dst, (if oper = Instruction.IDIV orelse oper = Instruction.IMOD then AppendList.single (Assembly.instruction_cx {size = size}) else if oper = Instruction.DIV orelse oper = Instruction.MOD then AppendList.single (Assembly.instruction_binal {oper = Instruction.XOR, dst = Operand.register hi, src = Operand.register hi, size = size}) else AppendList.empty), AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | IMUL2 {src, dst, size} (* Integer signed/unsigned multiplication (two operand form). * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val instruction = Instruction.IMUL2 {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | UnAL {oper, dst, size} (* Integer unary arithmetic/logic instructions. * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.UnAL {oper = oper, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SRAL {oper, count, dst, size} (* Integer shift/rotate arithmetic/logic instructions. * Require count operand as follows: * * count * reg imm lab add * * X * * only register %cl * * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_count, assembly_count, final_dst, assembly_dst, registerAllocation} = if Operand.eq(count,dst) then let val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [Register.T {reg = Register.RCX, part = Register.L}, Register.T {reg = Register.RCX, part = Register.X}, Register.T {reg = Register.RCX, part = Register.E}, Register.T {reg = Register.RCX, part = Register.R}], registerAllocation = registerAllocation} val final_dst = final_count val assembly_dst = AppendList.empty in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end else let val count_size = case Operand.size count of NONE => Size.BYTE | SOME size => size val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = SOME WordSize.word8, label = false, address = false}, info = info, size = count_size, move = true, supports = [dst], saves = [], force = [Register.T {reg = Register.RCX, part = Register.L}, Register.T {reg = Register.RCX, part = Register.X}, Register.T {reg = Register.RCX, part = Register.E}, Register.T {reg = Register.RCX, part = Register.R}], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [count,final_count], force = [], registerAllocation = registerAllocation} in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end val final_count = case final_count of Operand.Register _ => Operand.register (Register.T {reg = Register.RCX, part = Register.L}) | _ => final_count val instruction = Instruction.SRAL {oper = oper, count = final_count, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_count, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CMP {src2, src1, size} (* Arithmetic compare * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.CMP {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | TEST {src2, src1, size} (* Logical compare * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.TEST {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SETcc {condition, dst, size} (* Set byte on condition * Require dst operand as follows: * * dst * reg imm lab add * * X * * only byte registers *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [], force = if Size.lt (Size.BYTE, size) then Register.withLowPart (size, Size.BYTE) else Register.registers Size.BYTE, registerAllocation = registerAllocation} val temp_dst = case final_dst of Operand.Register r => let val register = Register.lowPartOf (r, Size.BYTE) in Operand.register register end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SETcc, temp_reg" val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.SETcc {condition = condition, dst = final_dst, size = size}) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction_setcc {condition = condition, dst = temp_dst, size = Size.BYTE}), if size = Size.BYTE then if Operand.eq (final_dst, temp_dst) then AppendList.empty else AppendList.single (Assembly.instruction_mov {dst = final_dst, src = temp_dst, size = Size.BYTE}) else AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, dst = final_dst, src = temp_dst, dstsize = size, srcsize = Size.BYTE}), assembly_post], registerAllocation = registerAllocation} end | JMP {target, absolute} (* Jump * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = SOME WordSize.word64, label = true, address = true}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.JMP {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | Jcc {condition, target} (* Jump if condition is met * Require target operand as follows: * * target * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = SOME WordSize.word64, label = true, address = false}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.Jcc {condition = condition, target = final_target} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CALL {target, absolute} (* Call procedure * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = true, immediate = SOME WordSize.word64, label = true, address = true}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CALL {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = SOME src} (* Return from procedure * Require optional src operand as follows: * * src * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation = registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.RET {src = SOME final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = NONE} => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.RET {src = NONE} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOV {src, dst, size} (* Move * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val isConst0 = Immediate.isZero (* special case moving 0 to a register *) val instruction = case (final_src, final_dst) of (Operand.Immediate immediate, Operand.Register _) => if isConst0 immediate then Instruction.BinAL {oper = XOR, src = final_dst, dst = final_dst, size = size} else Instruction.MOV {src = final_src, dst = final_dst, size = size} | _ => Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.value, memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.register register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.allocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | CMOVcc {condition, src, dst, size} (* Conditional move * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CMOVcc {condition = condition, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XCHG {src, dst, size} (* Exchange register/memory with register * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.XCHG {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPUSH {src, base, size} (* Pseudo push a value onto the stack * Require src operand as follows: * * src * reg imm lab add * * X X * * only word or long registers * * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = Size.QUAD, move = true, supports = [src], saves = [], force = [Register.rsp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = SOME WordSize.word16, label = false, address = true} | Size.LONG => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | Size.QUAD => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | _ => {register = false, immediate = SOME WordSize.word32, label = false, address = true} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.PUSH {src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPOP {dst, base, size} (* Pseudo pop a value from the stack * Require dst operand as follows: * * dst * reg imm lab add * * X * * only word or long registers * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = Size.QUAD, move = true, supports = [dst], saves = [], force = [Register.rsp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = NONE, label = false, address = true} | Size.LONG => {register = true, immediate = NONE, label = false, address = true} | Size.QUAD => {register = true, immediate = NONE, label = false, address = true} | _ => {register = false, immediate = NONE, label = false, address = true} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = options, info = info, size = size, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.POP {dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOVX {oper, src, dst, srcsize, dstsize} (* Move with extention. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.MOVX {oper = oper, src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XVOM {src, dst, srcsize, dstsize} (* Move with contraction. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = Register.withLowPart (srcsize, dstsize), registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.XVOM {src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize}) val temp_reg = case final_src of Operand.Register r => Register.lowPartOf (r, dstsize) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: XVOM, temp_reg" val instruction = Instruction.MOV {src = Operand.register temp_reg, dst = final_dst, size = dstsize} val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | LEA {src, dst, size} (* Load effective address * Require src/dst operands as follows: * * dst * reg imm lab add * reg * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.LEA {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_BinAS {oper, src, dst, size} (* SSE scalar binary arithmetic instructions. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_BinAS {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_UnAS {oper, src, dst, size} (* SSE scalar unary arithmetic instructions. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_UnAS {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_BinLP {oper, src, dst, size} (* Packed SSE binary logical instructions (used as scalar). * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add (x) * * Disallow address for src, since it would be a 128-bit load. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDstReg {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_BinLP {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_MOVS {src, dst, size} (* Scalar SSE move instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_MOVS {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.xmmvalue, memloc_dst) = let val registerAllocation = RA.xmmremove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.xmmupdate {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.xmmregister register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.xmmremove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_MOVS {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.xmmallocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | SSE_COMIS {src1, src2, size} (* Scalar SSE compare instruction. * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateXmmSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_COMIS {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_UCOMIS {src1, src2, size} (* Scalar SSE unordered compare instruction. * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateXmmSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_UCOMIS {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/floating-point convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: FLT != FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSFP2SFP {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSFP2SI {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/signed-integer convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: FLT/INT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSFP2SI {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSI2SFP {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/signed-integer convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg X * xmm * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: INT/FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSI2SFP {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_MOVD {src, srcsize, dst, dstsize, ...} (* Scalar SSE move data instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg X * xmm X X * src imm * lab * add X * * Require size modifier class as follows: FLT/INT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = let fun doitINT () = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun doitFLT () = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} in case src of Operand.MemLoc memloc => (case Size.class (MemLoc.size memloc) of Size.INT => doitINT () | Size.FLT => doitFLT ()) | Operand.Immediate _ => doitINT () | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SSE_MOVD, src" end val {operand = final_dst, assembly = assembly_dst, registerAllocation} = let fun doitINT () = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} fun doitFLT () = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} in case dst of Operand.MemLoc memloc => (case Size.class (MemLoc.size memloc) of Size.INT => doitINT () | Size.FLT => doitFLT ()) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SSE_MOVD, dst" end val instruction = Instruction.SSE_MOVD {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | _ => Error.bug (concat ["amd64AllocateRegisters.Instruction.allocateRegisters: unimplemented: ", Instruction.toString instruction]) val (allocateRegisters, allocateRegisters_msg) = tracer "Instruction.allocateRegisters" allocateRegisters end structure Directive = struct open Directive fun allocateRegisters {directive, info, registerAllocation} = let val {assembly, registerAllocation} = case directive of Assume {assumes} => RegisterAllocation.assume {assumes = assumes, info = info, registerAllocation = registerAllocation} | XmmAssume {assumes} => RegisterAllocation.xmmassume {assumes = assumes, info = info, registerAllocation = registerAllocation} | Cache {caches} => RegisterAllocation.cache {caches = caches, info = info, registerAllocation = registerAllocation} | XmmCache {caches} => RegisterAllocation.xmmcache {caches = caches, info = info, registerAllocation = registerAllocation} | Reset => RegisterAllocation.reset {registerAllocation = registerAllocation} | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => RegisterAllocation.force {commit_memlocs = commit_memlocs, commit_classes = commit_classes, remove_memlocs = remove_memlocs, remove_classes = remove_classes, dead_memlocs = dead_memlocs, dead_classes = dead_classes, info = info, registerAllocation = registerAllocation} | CCall => RegisterAllocation.ccall {info = info, registerAllocation = registerAllocation} | Return {returns} => RegisterAllocation.return {returns = returns, info = info, registerAllocation = registerAllocation} | Reserve {registers} => RegisterAllocation.reserve {registers = registers, registerAllocation = registerAllocation} | XmmReserve {registers} => RegisterAllocation.xmmreserve {registers = registers, registerAllocation = registerAllocation} | Unreserve {registers} => RegisterAllocation.unreserve {registers = registers, registerAllocation = registerAllocation} | XmmUnreserve {registers} => RegisterAllocation.xmmunreserve {registers = registers, registerAllocation = registerAllocation} | SaveRegAlloc {live, id} => RegisterAllocation.saveregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} | RestoreRegAlloc {live, id} => RegisterAllocation.restoreregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Directive.allocateRegisters" allocateRegisters end structure Assembly = struct open Assembly fun allocateRegisters {assembly: (t * Liveness.t) list, registerAllocation: RegisterAllocation.t} = let val {assembly, registerAllocation} = List.fold (assembly, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ((Comment s,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Comment s), registerAllocation = registerAllocation} | ((Directive d,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Directive.allocateRegisters {directive = d, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.codegenComments > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Directive.toString d))] else AppendList.empty, if !Control.codegenComments > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.codegenComments > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end | ((PseudoOp p,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, PseudoOp p), registerAllocation = registerAllocation} | ((Label l,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Label l), registerAllocation = registerAllocation} | ((Instruction i,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Instruction.allocateRegisters {instruction = i, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.codegenComments > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Instruction.toString i))] else AppendList.empty, if !Control.codegenComments > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.codegenComments > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end) val assembly = AppendList.toList assembly val assembly = if !Control.codegenComments > 1 then (Assembly.comment (String.make (60, #"&")):: Assembly.comment (String.make (60, #"&")):: assembly) else assembly in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Assembly.allocateRegisters" allocateRegisters end fun allocateRegisters {assembly : Assembly.t list list, liveness : bool} : Assembly.t list list = let val {get = getInfo : Label.t -> Label.t option, set = setInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) fun unroll label = case getInfo label of NONE => label | SOME label' => unroll label' val assembly = List.fold (assembly, [], fn (assembly,assembly') => let val assembly = if liveness then Liveness.toLiveness assembly else Liveness.toNoLiveness assembly val {assembly, ...} = Assembly.allocateRegisters {assembly = assembly, registerAllocation = RegisterAllocation.empty ()} val rec doit = fn (Assembly.Comment _)::assembly => doit assembly | (Assembly.PseudoOp (PseudoOp.P2align _))::assembly => doit' (assembly, []) | _ => false and doit' = fn ((Assembly.Comment _)::assembly, labels) => doit' (assembly, labels) | ((Assembly.PseudoOp (PseudoOp.Local _))::assembly, labels) => doit' (assembly, labels) | ((Assembly.Label l)::assembly, labels) => doit' (assembly, l::labels) | (assembly, labels) => doit'' (assembly, labels) and doit'' = fn ((Assembly.Comment _)::assembly, labels) => doit'' (assembly, labels) | ((Assembly.Instruction (Instruction.JMP {target = Operand.Label label, absolute = false}))::assembly, labels) => doit''' (assembly, labels, label) | _ => false and doit''' = fn ([], labels, label) => let val label' = unroll label in if List.contains(labels, label', Label.equals) then false else (List.foreach (labels, fn label'' => setInfo(label'', SOME label')); true) end | ((Assembly.Comment _)::assembly, labels, label) => doit''' (assembly, labels, label) | _ => false in if doit assembly then assembly' else assembly::assembly' end) fun replacer _ oper = (case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => Operand.immediate_label (unroll label) | NONE => oper) | (_, SOME label) => Operand.label (unroll label) | _ => oper) val assembly = List.fold (assembly, [], fn (assembly,assembly') => (List.map(assembly, Assembly.replace replacer))::assembly') in assembly end val (allocateRegisters, allocateRegisters_msg) = tracerTop "allocateRegisters" allocateRegisters fun allocateRegisters_totals () = (allocateRegisters_msg (); Control.indent (); Liveness.toLiveness_msg (); Liveness.toNoLiveness_msg (); Assembly.allocateRegisters_msg (); Control.indent (); Instruction.allocateRegisters_msg (); Control.indent (); RegisterAllocation.pre_msg (); RegisterAllocation.post_msg (); RegisterAllocation.allocateOperand_msg (); RegisterAllocation.allocateXmmOperand_msg (); Control.unindent (); Directive.allocateRegisters_msg (); Control.unindent (); Control.unindent()) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-allocate-registers.sig000066400000000000000000000013761416264345000263150ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_ALLOCATE_REGISTERS_STRUCTS = sig structure amd64 : AMD64 structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 end signature AMD64_ALLOCATE_REGISTERS = sig include AMD64_ALLOCATE_REGISTERS_STRUCTS val allocateRegisters : {assembly: amd64.Assembly.t list list, liveness: bool} -> amd64.Assembly.t list list val allocateRegisters_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-codegen.fun000066400000000000000000000507501416264345000241360ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2014,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64Codegen (S: AMD64_CODEGEN_STRUCTS): AMD64_CODEGEN = struct open S structure amd64 = amd64 (open Machine structure RepType = Type) structure amd64Pseudo = amd64PseudoCheck (structure S = amd64) structure amd64MLtonBasic = amd64MLtonBasic (structure amd64 = amd64Pseudo structure Machine = Machine) structure amd64Liveness = amd64Liveness (structure amd64 = amd64 structure amd64MLtonBasic = amd64MLtonBasic) structure amd64JumpInfo = amd64JumpInfo (structure amd64 = amd64) structure amd64LoopInfo = amd64LoopInfo (structure amd64 = amd64) structure amd64EntryTransfer = amd64EntryTransfer (structure amd64 = amd64) structure amd64MLton = amd64MLton (structure amd64MLtonBasic = amd64MLtonBasic structure amd64Liveness = amd64Liveness) val implementsPrim = amd64MLton.implementsPrim structure amd64Translate = amd64Translate (structure amd64 = amd64 structure amd64MLton = amd64MLton structure amd64Liveness = amd64Liveness) structure amd64Simplify = amd64Simplify (structure amd64 = amd64 structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64EntryTransfer = amd64EntryTransfer) structure amd64GenerateTransfers = amd64GenerateTransfers (structure amd64 = amd64 structure amd64MLton = amd64MLton structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64LoopInfo = amd64LoopInfo structure amd64EntryTransfer = amd64EntryTransfer) structure amd64AllocateRegisters = amd64AllocateRegisters (structure amd64 = amd64 structure amd64MLton = amd64MLton) open amd64 fun output {program as Machine.Program.T {chunks, handlesSignals, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}}: unit = let val reserveRsp = (* There is no sigaltstack on cygwin, we need to reserve %rsp to * hold the C stack pointer. We only need to do this in programs * that handle signals. *) let open Control.Target in !os = OpenBSD orelse (handlesSignals andalso !os = Cygwin) end val makeC = outputC val makeS = outputS val (newProfileLabel, delProfileLabel, getSourceMaps) = let val Machine.Program.T {sourceMaps, ...} = program in case sourceMaps of NONE => (fn _ => Error.bug "amd64Codegen.newProfileLabel", fn _ => Error.bug "amd64Codegen.delProfileLabel", fn () => NONE) | SOME sm => let val {newProfileLabel, delProfileLabel, getSourceMaps} = Machine.SourceMaps.modify sm in (newProfileLabel, delProfileLabel, SOME o getSourceMaps) end end (* C specific *) fun outputC () = let local val Machine.Program.T {chunks, frameInfos, frameOffsets, globals, handlesSignals, main, maxFrameSize, objectTypes, staticHeaps, ...} = program in val program = Machine.Program.T {chunks = chunks, frameInfos = frameInfos, frameOffsets = frameOffsets, globals = globals, handlesSignals = handlesSignals, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, sourceMaps = getSourceMaps (), staticHeaps = staticHeaps} end val {print, done, ...} = makeC () val additionalMainArgs = let val mainLabel = Label.toString (#label main) (* Drop the leading _, because gcc will add it. *) val mainLabel = if !Control.labelsHaveExtra_ then String.dropPrefix (mainLabel, 1) else mainLabel in [mainLabel] end fun declareLocals () = List.foreach (CType.all, fn t => let val m = List.fold (chunks, ~1, fn (Machine.Chunk.T {tempsMax, ...}, max) => Int.max (max, tempsMax t)) val m = m + 1 in print (concat ["PRIVATE ", CType.toString t, " local", CType.toString t, "[", Int.toString m, "];\n"]) end) fun rest () = declareLocals () in CCodegen.outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["amd64-main.h"], print = print, program = program, rest = rest} ; done () end val outputC = Control.trace (Control.Pass, "outputC") outputC (* Assembly specific *) val _ = amd64MLtonBasic.init () fun outputJumpToSML print = let val win64 = case !Control.Target.os of MLton.Platform.OS.Cygwin => true | MLton.Platform.OS.MinGW => true | _ => false val jumpToSML = amd64.Label.fromString "MLton_jumpToSML" val returnToC = amd64.Label.fromString "Thread_returnToC" val {frontierReg, stackTopReg} = {frontierReg = amd64.Register.r12, stackTopReg = amd64.Register.rbp} val asm = [ amd64.Assembly.pseudoop_text (), amd64.Assembly.pseudoop_p2align (amd64.Immediate.int 4, NONE, NONE), amd64.Assembly.pseudoop_global jumpToSML, amd64.Assembly.pseudoop_hidden jumpToSML, amd64.Assembly.label jumpToSML, amd64.Assembly.instruction_binal {oper = amd64.Instruction.SUB, src = amd64.Operand.immediate_int 72, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbp, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 64), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 56), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r12, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 48), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r13, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 40), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r14, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 32), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r15, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 24), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 16), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rsp, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = (SOME o amd64.Immediate.labelPlusInt) (amd64MLton.gcState_label, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.StackTop)), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register stackTopReg, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = (SOME o amd64.Immediate.labelPlusInt) (amd64MLton.gcState_label, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.Frontier)), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register frontierReg, size = amd64.Size.QUAD}, amd64.Assembly.instruction_jmp {target = amd64.Operand.register (if win64 then amd64.Register.rcx else amd64.Register.rdi), absolute = true}, amd64.Assembly.pseudoop_p2align (amd64.Immediate.int 4, NONE, NONE), amd64.Assembly.pseudoop_global returnToC, amd64.Assembly.pseudoop_hidden returnToC, amd64.Assembly.label returnToC, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 16), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 24), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r15, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 32), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r14, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 40), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r13, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 48), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r12, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 56), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 64), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, src = amd64.Operand.immediate_int 72, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_ret {src = NONE} ] in List.foreach (asm, fn asm => (Layout.print(Assembly.layout asm, print); print "\n")) end val liveInfo = amd64Liveness.LiveInfo.newLiveInfo () val jumpInfo = amd64JumpInfo.newJumpInfo () fun outputChunk (chunk as Machine.Chunk.T {blocks, chunkLabel, ...}, print) = let val isMain = Machine.ChunkLabel.equals(#chunkLabel main, chunkLabel) val () = if isMain then outputJumpToSML print else () val {chunk} = amd64Translate.translateChunk {chunk = chunk, liveInfo = liveInfo} val chunk : amd64.Chunk.t = amd64Simplify.simplify {chunk = chunk, (* don't perform optimizations on * the main function (initGlobals) *) optimize = if isMain then 0 else !Control.Native.optimize, delProfileLabel = delProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo} val unallocated_assembly : amd64.Assembly.t list list = (amd64GenerateTransfers.generateTransfers {chunk = chunk, optimize = !Control.Native.optimize, newProfileLabel = newProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo, reserveRsp = reserveRsp}) val allocated_assembly : Assembly.t list list = amd64AllocateRegisters.allocateRegisters {assembly = unallocated_assembly, (* don't calculate liveness info * on the main function (initGlobals) *) liveness = not isMain} val _ = Vector.foreach (blocks, Label.clear o Machine.Block.label) val _ = amd64.Immediate.clearAll () val _ = amd64.MemLoc.clearAll () in List.fold (allocated_assembly, if isMain then 30 else 0, fn (block, n) => List.fold (block, n, fn (asm, n) => (Layout.print (Assembly.layout asm, print); print "\n"; n + 1))) end fun outputAssembly () = let val split = !Control.Native.split fun loop chunks = let val {print, done, ...} = makeS() fun loop' (chunks, size) = case chunks of [] => done () | chunk::chunks => if (case split of NONE => false | SOME maxSize => size > maxSize) then (done (); loop (chunk::chunks)) else loop'(chunks, size + outputChunk (chunk, print)) in loop' (chunks, 0) end in loop chunks ; amd64Translate.translateChunk_totals () ; amd64Simplify.simplify_totals () ; amd64GenerateTransfers.generateTransfers_totals () ; amd64AllocateRegisters.allocateRegisters_totals () end val outputAssembly = Control.trace (Control.Pass, "outputAssembly") outputAssembly in outputAssembly() ; outputC() end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-codegen.sig000066400000000000000000000016611416264345000241250ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_CODEGEN_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature AMD64_CODEGEN = sig include AMD64_CODEGEN_STRUCTS val implementsPrim: Machine.Type.t Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-entry-transfer.fun000066400000000000000000000063771416264345000255230ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64EntryTransfer(S: AMD64_ENTRY_TRANSFER_STRUCTS) : AMD64_ENTRY_TRANSFER = struct open S open amd64 val tracer = amd64.tracer fun verifyEntryTransfer {chunk = Chunk.T {blocks, ...}} = let val {get : Label.t -> Block.t option, set, destroy} = Property.destGetSetOnce(Label.plist, Property.initConst NONE) val _ = List.foreach (blocks, fn block as Block.T {entry,...} => set(Entry.label entry, SOME block)) fun isJump l = case get l of SOME (Block.T {entry = Entry.Jump _, ...}) => true | _ => false fun isFunc l = case get l of SOME (Block.T {entry = Entry.Func _, ...}) => true | NONE => true | _ => false fun isCont l = case get l of SOME (Block.T {entry = Entry.Cont _, ...}) => true | _ => false fun isHandler l = case get l of SOME (Block.T {entry = Entry.Handler _, ...}) => true | _ => false fun isCReturn l f = case get l of SOME (Block.T {entry = Entry.CReturn {func, ...}, ...}) => CFunction.equals (f, func) | _ => false val b = List.forall (blocks, fn Block.T {transfer, ...} => (case transfer of Transfer.Goto {target, ...} => isJump target | Transfer.Iff {truee, falsee, ...} => isJump truee andalso isJump falsee | Transfer.Switch {cases, default, ...} => isJump default andalso Transfer.Cases.forall(cases, isJump o #2) | Transfer.Tail {target, ...} => isFunc target | Transfer.NonTail {target, return, handler, ...} => isFunc target andalso isCont return andalso (case handler of SOME handler => isHandler handler | NONE => true) | Transfer.Return {...} => true | Transfer.Raise {...} => true | Transfer.CCall {return, func, ...} => (case return of NONE => true | SOME {return, ...} => isCReturn return func))) val _ = destroy () val _ = if b then () else List.foreach(blocks, Block.printBlock) in b end val (verifyEntryTransfer, verifyEntryTransfer_msg) = tracer "verifyEntryTransfer" verifyEntryTransfer end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-entry-transfer.sig000066400000000000000000000010211416264345000254720ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_ENTRY_TRANSFER_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_ENTRY_TRANSFER = sig include AMD64_ENTRY_TRANSFER_STRUCTS val verifyEntryTransfer : {chunk: amd64.Chunk.t} -> bool val verifyEntryTransfer_msg : unit -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-generate-transfers.fun000066400000000000000000003400421416264345000263250ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64GenerateTransfers(S: AMD64_GENERATE_TRANSFERS_STRUCTS): AMD64_GENERATE_TRANSFERS = struct open S open amd64 open amd64JumpInfo open amd64LoopInfo open amd64Liveness open LiveInfo open Liveness local open Runtime in structure CFunction = CFunction end val ones : int * WordSize.t -> WordX.t = fn (i, ws) => (WordX.notb o WordX.lshift) (WordX.allOnes ws, WordX.fromInt (i, ws)) val tracerTop = amd64.tracerTop structure amd64LiveTransfers = amd64LiveTransfers(structure amd64 = amd64 structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64LoopInfo = amd64LoopInfo) val pointerSize = amd64MLton.pointerSize val wordSize = amd64MLton.wordSize val normalRegs = let val transferRegs = (* Register.rax:: Register.eax:: Register.al:: *) Register.rbx:: Register.ebx:: Register.bl:: Register.rcx:: Register.ecx:: Register.cl:: Register.rdx:: Register.edx:: Register.dl:: Register.rdi:: Register.rsi:: (* Register.rsp:: Register.rbp:: *) Register.r8:: Register.r8w:: Register.r9:: Register.r9w:: Register.r10:: Register.r10w:: Register.r11:: Register.r11w:: (* Register.r12:: Register.r12w:: *) Register.r13:: Register.r13w:: Register.r14:: Register.r14w:: Register.r15:: Register.r15w:: nil val transferXmmRegs = XmmRegister.xmm1D:: XmmRegister.xmm1S:: XmmRegister.xmm2D:: XmmRegister.xmm2S:: XmmRegister.xmm3D:: XmmRegister.xmm3S:: XmmRegister.xmm4D:: XmmRegister.xmm4S:: XmmRegister.xmm5D:: XmmRegister.xmm5S:: XmmRegister.xmm6D:: XmmRegister.xmm6S:: XmmRegister.xmm7D:: XmmRegister.xmm7S:: nil in {frontierReg = Register.r12, stackTopReg = Register.rbp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.rax::Register.eax::Register.al::transferRegs | _ => [], transferXmmRegs = fn Entry.Jump _ => transferXmmRegs | Entry.CReturn _ => XmmRegister.xmm0D::XmmRegister.xmm0S::transferXmmRegs | _ => []} end val reserveRspRegs = let val transferRegs = (* Register.rax:: Register.eax:: Register.al:: *) Register.rbx:: Register.ebx:: Register.bl:: Register.rcx:: Register.ecx:: Register.cl:: Register.rdx:: Register.edx:: Register.dl:: Register.rdi:: Register.rsi:: (* Register.rsp:: Register.rbp:: *) Register.r8:: Register.r8w:: Register.r9:: Register.r9w:: Register.r10:: Register.r10w:: Register.r11:: Register.r11w:: (* Register.r12:: Register.r12w:: *) Register.r13:: Register.r13w:: Register.r14:: Register.r14w:: Register.r15:: Register.r15w:: nil val transferXmmRegs = XmmRegister.xmm8D:: XmmRegister.xmm8S:: XmmRegister.xmm9D:: XmmRegister.xmm9S:: XmmRegister.xmm10D:: XmmRegister.xmm10S:: XmmRegister.xmm11D:: XmmRegister.xmm11S:: XmmRegister.xmm12D:: XmmRegister.xmm12S:: XmmRegister.xmm13D:: XmmRegister.xmm13S:: XmmRegister.xmm14D:: XmmRegister.xmm14S:: nil in {frontierReg = Register.r12, stackTopReg = Register.rbp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.rax::Register.eax::Register.al::transferRegs | _ => [], transferXmmRegs = fn Entry.Jump _ => transferXmmRegs | Entry.CReturn _ => XmmRegister.xmm0D::XmmRegister.xmm0S::transferXmmRegs | _ => []} end val indexReg = amd64.Register.rax val stackTop = amd64MLton.gcState_stackTopContents val frontier = amd64MLton.gcState_frontierContents datatype gef = GEF of {generate : gef -> {label : Label.t, falling : bool, unique : bool} -> Assembly.t AppendList.t, effect : gef -> {label : Label.t, transfer : Transfer.t} -> Assembly.t AppendList.t, fall : gef -> {label : Label.t, live : LiveSet.t} -> Assembly.t AppendList.t} fun generateTransfers {chunk as Chunk.T {data, blocks, ...}, optimize: int, newProfileLabel: amd64.ProfileLabel.t -> amd64.ProfileLabel.t, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, reserveRsp: bool} = let val {frontierReg, stackTopReg, transferRegs, transferXmmRegs} = if reserveRsp then reserveRspRegs else normalRegs val allClasses = !amd64MLton.Classes.allClasses val livenessClasses = !amd64MLton.Classes.livenessClasses val livenessClasses = ClassSet.+(livenessClasses, ClassSet.fromList [amd64MLton.Classes.StaticNonTemp, amd64MLton.Classes.CArg]) val nonlivenessClasses = ClassSet.-(allClasses, livenessClasses) val holdClasses = !amd64MLton.Classes.holdClasses val farflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val nearflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val runtimeClasses = !amd64MLton.Classes.runtimeClasses val cstaticClasses = !amd64MLton.Classes.cstaticClasses val heapClasses = !amd64MLton.Classes.heapClasses val ccallflushClasses = ClassSet.+(cstaticClasses, heapClasses) fun removeHoldMemLocs memlocs = MemLocSet.subset (memlocs, fn m => not (ClassSet.contains(holdClasses, MemLoc.class m))) val stackAssume = {register = stackTopReg, memloc = stackTop (), weight = 1024, sync = false, reserve = false} val frontierAssume = {register = frontierReg, memloc = frontier (), weight = 2048, sync = false, reserve = false} val cStackAssume = {register = Register.rsp, memloc = amd64MLton.c_stackPContents, weight = 2048, (* ??? *) sync = false, reserve = true} fun blockAssumes l = let val l = frontierAssume :: stackAssume :: l in Assembly.directive_assume {assumes = if reserveRsp then cStackAssume :: l else l} end fun runtimeTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] fun farEntry l = AppendList.cons (blockAssumes [], l) fun farTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_xmmcache {caches = []}), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] val profileStackTopCommit' = amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton (stackTop ()), commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty} val profileStackTopCommit = if !Control.profile <> Control.ProfileNone then AppendList.single profileStackTopCommit' else AppendList.empty val _ = Assert.assert ("amd64GenerateTransfers.verifyLiveInfo", fn () => amd64Liveness.LiveInfo.verifyLiveInfo {chunk = chunk, liveInfo = liveInfo}) val _ = Assert.assert ("amd64GenerateTransfers.verifyJumpInfo", fn () => amd64JumpInfo.verifyJumpInfo {chunk = chunk, jumpInfo = jumpInfo}) val _ = Assert.assert ("amd64GenerateTransfers.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk}) local val {get: Label.t -> {block:Block.t}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val labels = List.fold (blocks, [], fn (block as Block.T {entry, ...}, labels) => let val label = Entry.label entry in set(label, {block = block}) ; label::labels end) fun loop labels = let val (labels, b) = List.fold (labels, ([], false), fn (label, (labels, b)) => case amd64JumpInfo.getNear (jumpInfo, label) of amd64JumpInfo.Count 0 => let val {block = Block.T {transfer, ...}} = get label in List.foreach (Transfer.nearTargets transfer, fn label => amd64JumpInfo.decNear (jumpInfo, label)); (labels, true) end | _ => (label::labels, b)) in if b then loop labels else List.map (labels, #block o get) end val blocks = loop labels val _ = destroy () in val chunk = Chunk.T {data = data, blocks = blocks} end val loopInfo = amd64LoopInfo.createLoopInfo {chunk = chunk, farLoops = false} val isLoopHeader = fn label => isLoopHeader(loopInfo, label) handle _ => false val liveTransfers = amd64LiveTransfers.computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferXmmRegs = transferXmmRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} val getLiveRegsTransfers = #1 o amd64LiveTransfers.getLiveTransfers val getLiveXmmRegsTransfers = #2 o amd64LiveTransfers.getLiveTransfers val {get = getLayoutInfo : Label.t -> Block.t option, set = setLayoutInfo, destroy = destLayoutInfo} = Property.destGetSet(Label.plist, Property.initRaise ("layoutInfo", Label.layout)) val _ = List.foreach (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry in setLayoutInfo(label, SOME block) end) val {get = getProfileLabel : Label.t -> ProfileLabel.t option, set = setProfileLabel, destroy = destProfileLabel} = Property.destGetSetOnce (Label.plist, Property.initRaise ("profileLabel", Label.layout)) val _ = List.foreach (blocks, fn Block.T {entry, profileLabel, ...} => let val label = Entry.label entry in setProfileLabel(label, profileLabel) end) local val stack = ref [] val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun push x = stack := x::(!stack) fun deque () = (case (!stack) of [] => (case Queue.deque(!queue) of NONE => NONE | SOME(queue', x) => (queue := queue'; SOME x)) | x::stack' => (stack := stack'; SOME x)) end fun pushCompensationBlock {label, id} = let val label' = Label.new label val live = getLive(liveInfo, label) val profileLabel = getProfileLabel label val profileLabel' = Option.map (profileLabel, newProfileLabel) val block = Block.T {entry = Entry.jump {label = label'}, profileLabel = profileLabel', statements = (Assembly.directive_restoreregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ()), id = id}):: nil, transfer = Transfer.goto {target = label}} in setLive(liveInfo, label', live); setProfileLabel(label', profileLabel'); incNear(jumpInfo, label'); Assert.assert("amd64GenerateTransfers.pushCompensationBlock", fn () => getNear(jumpInfo, label') = Count 1); amd64LiveTransfers.setLiveTransfersEmpty(liveTransfers, label'); setLayoutInfo(label', SOME block); push label'; label' end val c_stackP = amd64MLton.c_stackPContentsOperand fun cacheRsp () = if reserveRsp then AppendList.empty else AppendList.single ((* explicit cache in case there are no args *) Assembly.directive_cache {caches = [{register = Register.rsp, memloc = valOf (Operand.deMemloc c_stackP), reserve = true}]}) fun unreserveRsp () = if reserveRsp then AppendList.empty else AppendList.single (Assembly.directive_unreserve {registers = [Register.rsp]}) datatype z = datatype Entry.t datatype z = datatype Transfer.t fun generateAll (gef as GEF {effect,...}) {label, falling, unique} : Assembly.t AppendList.t = (case getLayoutInfo label of NONE => AppendList.empty | SOME (Block.T {entry, profileLabel, statements, transfer}) => let val _ = setLayoutInfo(label, NONE) (* val isLoopHeader = fn _ => false *) fun near label = let val align = if isLoopHeader label handle _ => false then AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, SOME (Immediate.int 7))) else if falling then AppendList.empty else AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE)) val assumes = if falling andalso unique then AppendList.empty else (* near entry & live transfer assumptions *) AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_xmmassume {assumes = (List.map (getLiveXmmRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))})] in AppendList.appends [align, AppendList.single (Assembly.label label), AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), assumes] end val pre = case entry of Jump {label} => near label | CReturn {dsts, frameInfo, func, label} => let fun getReturn () = if Vector.isEmpty dsts then AppendList.empty else let val srcs = Vector.fromList (List.map (Operand.cReturnTemps (CFunction.return func), #dst)) in (AppendList.fromList o Vector.fold2) (dsts, srcs, [], fn ((dst,dstsize),src,stmts) => case Size.class dstsize of Size.INT => (amd64.Assembly.instruction_mov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | Size.FLT => (amd64.Assembly.instruction_sse_movs {dst = dst, src = Operand.memloc src, size = dstsize})::stmts) end in case frameInfo of SOME fi => let val FrameInfo.T {size, frameInfosIndex} = fi val finish = AppendList.appends [let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end, (* assignTo dst *) getReturn ()] in AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), if CFunction.maySwitchThreadsTo func then (* entry from far assumptions *) farEntry finish else (* near entry & live transfer assumptions *) AppendList.append (AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_xmmassume {assumes = (List.map (getLiveXmmRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))})], finish)] end | NONE => AppendList.append (near label, getReturn ()) end | Func {label,...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry AppendList.empty)] | Cont {label, frameInfo = FrameInfo.T {size, frameInfosIndex}, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] | Handler {frameInfo = (FrameInfo.T {frameInfosIndex, size}), label, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] val pre = AppendList.appends [if !Control.codegenComments > 1 then AppendList.single (Assembly.comment (Entry.toString entry)) else AppendList.empty, if !Control.codegenComments > 2 then AppendList.single (Assembly.comment (LiveSet.fold (getLive(liveInfo, label), "", fn (memloc, s) => concat [s, MemLoc.toString memloc, " "]))) else AppendList.empty, pre] val (statements,_) = List.foldr (statements, ([], Liveness.liveIn (livenessTransfer {transfer = transfer, liveInfo = liveInfo})), fn (assembly,(statements,live)) => let val Liveness.T {liveIn,dead, ...} = livenessAssembly {assembly = assembly, live = live} in (if LiveSet.isEmpty dead then assembly::statements else assembly:: (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}):: statements, liveIn) end) val statements = AppendList.fromList statements val transfer = effect gef {label = label, transfer = transfer} in AppendList.appends [pre, statements, transfer] end) and effectDefault (gef as GEF {fall,...}) {label, transfer} : Assembly.t AppendList.t = AppendList.append (if !Control.codegenComments > 1 then AppendList.single (Assembly.comment (Transfer.toString transfer)) else AppendList.empty, case transfer of Goto {target} => fall gef {label = target, live = getLive(liveInfo, target)} | Iff {condition, truee, falsee} => let val condition_neg = Instruction.condition_negate condition val truee_live = getLive(liveInfo, truee) val truee_live_length = LiveSet.size truee_live val falsee_live = getLive(liveInfo, falsee) val falsee_live_length = LiveSet.size falsee_live fun fall_truee () = let val id = Directive.Id.new () val falsee' = pushCompensationBlock {label = falsee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition_neg, target = Operand.label falsee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet falsee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = truee, live = truee_live})) end fun fall_falsee () = let val id = Directive.Id.new () val truee' = pushCompensationBlock {label = truee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition, target = Operand.label truee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet truee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = falsee, live = falsee_live})) end in case (getLayoutInfo truee, getLayoutInfo falsee) of (NONE, SOME _) => fall_falsee () | (SOME _, NONE) => fall_truee () | _ => let fun default' () = if truee_live_length <= falsee_live_length then fall_falsee () else fall_truee () fun default () = case (getNear(jumpInfo, truee), getNear(jumpInfo, falsee)) of (Count 1, Count 1) => default' () | (Count 1, _) => fall_truee () | (_, Count 1) => fall_falsee () | _ => default' () in case (getLoopDistance(loopInfo, label, truee), getLoopDistance(loopInfo, label, falsee)) of (NONE, NONE) => default () | (SOME _, NONE) => fall_truee () | (NONE, SOME _) => fall_falsee () | (SOME dtruee, SOME dfalsee) => (case Int.compare(dtruee, dfalsee) of EQUAL => default () | LESS => fall_falsee () | GREATER => fall_truee ()) end end | Switch {test, cases, default} => let val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val size = case Operand.size test of SOME size => size | NONE => Size.QUAD val default_live = getLive(liveInfo, default) val cases = Transfer.Cases.mapToList (cases, fn (k, target) => let val target_live = getLive(liveInfo, target) val id = Directive.Id.new () val target' = pushCompensationBlock {label = target, id = id} in AppendList.fromList [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate_word k, size = size}, Assembly.instruction_jcc {condition = Instruction.E, target = Operand.label target'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet target_live, stackTop ()), frontier ()), id = id}] end) in AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), AppendList.appends cases, if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), (fall gef {label = default, live = default_live})] end | Tail {target, live} => (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) | NonTail {target, live, return, handler, size} => let val _ = enque return val _ = case handler of SOME handler => enque handler | NONE => () val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = amd64MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = amd64MLton.stackTopTempMinusWordDerefOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = amd64MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val bytes = amd64.Operand.immediate_int size val liveReturn = amd64Liveness.LiveInfo.getLive(liveInfo, return) val liveHandler = case handler of SOME handler => amd64Liveness.LiveInfo.getLive(liveInfo, handler) | _ => LiveSet.empty val live = MemLocSet.unions [live, LiveSet.toMemLocSet liveReturn, LiveSet.toMemLocSet liveHandler] in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopTempMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) end | Return {live} => let val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () in (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) end | Raise {live} => let val exnStack = amd64MLton.gcState_exnStackContentsOperand () val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackBottom = amd64MLton.gcState_stackBottomContentsOperand () in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackBottom + exnStack *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackBottom, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = exnStack, size = pointerSize}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop = stackBottom + exnStack *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackBottom, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = exnStack, size = pointerSize}])) (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = amd64MLton.gcState_stackTopMinusWordDerefOperand (), absolute = true}))) end | CCall {args, func, return} => let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val CFunction.T {convention=_, return = returnTy, symbolScope, target, ...} = func val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val c_stackP = amd64MLton.c_stackPContentsOperand val c_stackPDerefWord = amd64MLton.c_stackPDerefWordOperand val c_stackPDerefFloat = amd64MLton.c_stackPDerefFloatOperand val c_stackPDerefDouble = amd64MLton.c_stackPDerefDoubleOperand val applyFFTempFun = amd64MLton.applyFFTempFunContentsOperand val applyFFTempRegArg = amd64MLton.applyFFTempRegArgContents val applyFFTempXmmRegArg = amd64MLton.applyFFTempXmmRegArgContents val (fptrArg, args) = case target of Direct _ => (AppendList.empty, args) | Indirect => let val (fptrArg, args) = case args of fptrArg::args => (fptrArg, args) | _ => Error.bug "amd64GenerateTransfers.generateAll: CCall" in (AppendList.single (Assembly.instruction_mov {src = #1 fptrArg, dst = applyFFTempFun, size = #2 fptrArg}), args) end val win64 = case !Control.Target.os of MLton.Platform.OS.Cygwin => true | MLton.Platform.OS.MinGW => true | _ => false val (setup_args, (reg_args, xmmreg_args), size_stack_args, _) = List.fold (args, (AppendList.empty, ([],[]),0, (if win64 then [Register.rcx,Register.rdx, Register.r8,Register.r9] else [Register.rdi,Register.rsi,Register.rdx, Register.rcx,Register.r8,Register.r9], if win64 then [(XmmRegister.xmm0D,XmmRegister.xmm0S), (XmmRegister.xmm1D,XmmRegister.xmm1S), (XmmRegister.xmm2D,XmmRegister.xmm2S), (XmmRegister.xmm3D,XmmRegister.xmm3S)] else [(XmmRegister.xmm0D,XmmRegister.xmm0S), (XmmRegister.xmm1D,XmmRegister.xmm1S), (XmmRegister.xmm2D,XmmRegister.xmm2S), (XmmRegister.xmm3D,XmmRegister.xmm3S), (XmmRegister.xmm4D,XmmRegister.xmm4S), (XmmRegister.xmm5D,XmmRegister.xmm5S), (XmmRegister.xmm6D,XmmRegister.xmm6S), (XmmRegister.xmm7D,XmmRegister.xmm7S)])), fn ((arg, size), (setup_args, (reg_args, xmmreg_args), size_stack_args, (regs, xmmregs))) => let fun prune [] = [] | prune (x::r) = if win64 then r else (x::r) val (setup_arg, (reg_args, xmmreg_args), size_stack_arg, (regs, xmmregs)) = if Size.eq (size, Size.DBLE) orelse Size.eq (size, Size.SNGL) then (case xmmregs of xmmreg::xmmregs => let val i = List.length xmmregs val mem = applyFFTempXmmRegArg (size, i) val xmmreg = if Size.eq (size, Size.DBLE) then #1 xmmreg else #2 xmmreg in (AppendList.fromList [Assembly.instruction_sse_movs {src = arg, dst = Operand.memloc mem, size = size}, Assembly.directive_xmmcache {caches = [{register = xmmreg, memloc = mem, reserve = true}]}], (reg_args, (mem, xmmreg)::xmmreg_args), 0, (prune regs, xmmregs)) end | [] => (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, Assembly.instruction_sse_movs {src = arg, dst = if Size.eq (size, Size.DBLE) then c_stackPDerefDouble else c_stackPDerefFloat, size = size}], (reg_args, xmmreg_args), 8, (regs, xmmregs))) else if Size.eq (size, Size.BYTE) orelse Size.eq (size, Size.WORD) orelse Size.eq (size, Size.LONG) orelse Size.eq (size, Size.QUAD) then (case regs of reg::regs => let val i = List.length regs val mem = applyFFTempRegArg i in (AppendList.fromList [if Size.lt (size, Size.QUAD) then Assembly.instruction_movx {oper = Instruction.MOVZX, src = arg, dst = Operand.memloc mem, srcsize = size, dstsize = wordSize} else Assembly.instruction_mov {src = arg, dst = Operand.memloc mem, size = size}, Assembly.directive_cache {caches = [{register = reg, memloc = mem, reserve = true}]}], ((mem,reg)::reg_args, xmmreg_args), 0, (regs, prune xmmregs)) end | [] => (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, if Size.lt (size, Size.QUAD) then Assembly.instruction_movx {oper = Instruction.MOVZX, src = arg, dst = c_stackPDerefWord, srcsize = size, dstsize = wordSize} else Assembly.instruction_mov {src = arg, dst = c_stackPDerefWord, size = size}], (reg_args, xmmreg_args), 8, (regs, xmmregs))) else Error.bug "amd64GenerateTransfers.generateAll: CCall" in (AppendList.append (setup_arg, setup_args), (reg_args, xmmreg_args), size_stack_arg + size_stack_args, (regs, xmmregs)) end) val (setup_args, size_stack_args) = let val space = 16 - (size_stack_args mod 16) in if space = 16 then (setup_args, size_stack_args) else (AppendList.append (AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int space, size = pointerSize}), setup_args), size_stack_args + space) end (* Allocate shadow space *) val (setup_args, size_stack_args) = if win64 then (AppendList.append (setup_args, AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 32, size = pointerSize})), size_stack_args + 32) else (setup_args, size_stack_args) (* SysV ABI AMD64 requires %rax set to the number * of xmms registers passed for varags functions; * since %rax is caller-save, we conservatively * set %rax for all functions (not just varargs). *) val (reg_args, setup_args) = if not win64 then let val mem = applyFFTempRegArg 8 val reg = Register.rax in ((mem,reg) :: reg_args, AppendList.append (setup_args, AppendList.fromList [Assembly.instruction_mov {src = Operand.immediate_int (List.length xmmreg_args), dst = Operand.memloc mem, size = Size.QUAD}, Assembly.directive_cache {caches = [{register = reg, memloc = mem, reserve = true}]}])) end else (reg_args, setup_args) (* val reserve_args = AppendList.fromList [amd64.Assembly.directive_xmmcache {caches = List.map (xmmreg_args, fn (mem,reg) => {register = reg, memloc = mem, reserve = true})}, amd64.Assembly.directive_cache {caches = List.map (reg_args, fn (mem,reg) => {register = reg, memloc = mem, reserve = true})}] *) val flush = case return of SOME {return, size = SOME size} => (* Entering runtime *) let val _ = enque return val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = amd64MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = amd64MLton.stackTopTempMinusWordDerefOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = amd64MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val bytes = amd64.Operand.immediate_int size val live = amd64Liveness.LiveInfo.getLive(liveInfo, return) val {defs, ...} = Transfer.uses_defs_kills transfer val live = List.fold (defs, live, fn (oper,live) => case Operand.deMemloc oper of SOME memloc => LiveSet.remove (live, memloc) | NONE => live) in (runtimeTransfer (LiveSet.toMemLocSet live) (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopTempMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = runtimeClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}))) end | _ => AppendList.single (Assembly.directive_force {commit_memlocs = let val s = MemLocSet.empty val s = if CFunction.modifiesFrontier func then MemLocSet.add (s, frontier ()) else s val s = if CFunction.readsStackTop func then MemLocSet.add (s, stackTop ()) else s in s end, commit_classes = ccallflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}) val call = case target of Direct name => let datatype z = datatype MLton.Platform.OS.t datatype z = datatype Control.Format.t val label = fn () => Label.fromString name (* how to access imported functions: *) (* Windows rewrites the symbol __imp__name *) val coff_cygwin = fn () => Label.fromString ("_imp__" ^ name) val coff_mingw = fn () => Label.fromString ("__imp_" ^ name) val macho = fn () => label () (* @PLT is implicit *) val elf = fn () => Label.fromString (name ^ "@PLT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff_cygwin () | Darwin => macho () | MinGW => coff_mingw () | _ => elf () val direct = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (label ()), absolute = false}] val plt = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (importLabel ()), absolute = false}] val indirect = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.memloc_label (importLabel ()), absolute = true}] in case (symbolScope, !Control.Target.os, !Control.Native.pic) of (* Private functions can be easily reached * with a direct (rip-relative) call. *) (Private, _, _) => direct () (* Call at the point of definition. *) | (Public, MinGW, _) => direct () | (Public, Cygwin, _) => direct () | (Public, Darwin, _) => direct () (* ELF requires PLT even for public fns. *) | (Public, _, true) => plt () | (Public, _, false) => direct () (* Windows always does indirect calls to * imported functions. The importLabel has * the function address written to it. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () | (External, Darwin, _) => plt () (* ELF systems (and darwin too) create * procedure lookup tables (PLT) which * proxy the call to libraries. The PLT * does not contain an address, but instead * a stub function. Often the PLT is auto- * matically created. This applies to all * darwin-x86_64 function calls and calls * made from an ELF executable. *) | (External, _, true) => plt () | (External, _, false) => direct () end | Indirect => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = applyFFTempFun, absolute = true}] val unreserve_args = AppendList.fromList [amd64.Assembly.directive_xmmunreserve {registers = List.map (xmmreg_args, #2)}, amd64.Assembly.directive_unreserve {registers = List.map (reg_args, #2)}] val kill = if (case return of SOME {size = SOME _, ...} => true | _ => false) then AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = runtimeClasses}) else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = let val s = MemLocSet.empty val s = if CFunction.modifiesFrontier func then MemLocSet.add (s, frontier ()) else s val s = if CFunction.writesStackTop func then MemLocSet.add (s, stackTop ()) else s in s end, dead_classes = ccallflushClasses}) val getResult = AppendList.single (Assembly.directive_return {returns = Operand.cReturnTemps returnTy}) val fixCStack = if size_stack_args > 0 then (AppendList.single (Assembly.instruction_binal {oper = Instruction.ADD, dst = c_stackP, src = Operand.immediate_int size_stack_args, size = pointerSize})) else AppendList.empty val continue = if CFunction.maySwitchThreadsFrom func then (* Returning from runtime *) (farTransfer MemLocSet.empty AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) else case return of NONE => AppendList.empty | SOME {return, size} => (if isSome size then (* Don't need to trampoline, * since didn't switch threads, * but can't fall because * frame layout data is prefixed * to l's code; use fallNone * to force a jmp with near * jump assumptions. *) fallNone else fall) gef {label = return, live = getLive (liveInfo, return)} in AppendList.appends [cacheRsp (), fptrArg, setup_args, (*reserve_args,*) flush, call, unreserve_args, kill, getResult, fixCStack, unreserveRsp (), continue] end) and effectJumpTable (gef as GEF {...}) {label, transfer} : Assembly.t AppendList.t = case transfer of Switch {test, cases, default} => let val ws = case Operand.size test of SOME Size.BYTE => WordSize.word8 | SOME Size.WORD => WordSize.word16 | SOME Size.LONG => WordSize.word32 | SOME Size.QUAD => WordSize.word64 | _ => Error.bug "amd64GenerateTransfers.effectJumpTable: Switch" val zero = WordX.zero ws val one = WordX.one ws val two = WordX.add (one, one) fun even w = WordX.isZero (WordX.mod (w, two, {signed = false})) fun incFn w = WordX.add (w, one) fun decFn w = WordX.sub (w, one) fun halfFn w = WordX.div (w, two, {signed = false}) fun ltFn (w1, w2) = WordX.lt (w1, w2, {signed = false}) val min = WordX.min (ws, {signed = false}) fun minFn (w1, w2) = if WordX.lt (w1, w2, {signed = false}) then w1 else w2 val max = WordX.max (ws, {signed = false}) fun maxFn (w1, w2) = if WordX.gt (w1, w2, {signed = false}) then w1 else w2 fun range (w1, w2) = WordX.sub (w2, w1) val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} fun reduce(cases) = let fun reduce' cases = let val (minK,maxK,length, allEven,allOdd) = List.fold (cases, (max, min, 0, true, true), fn ((k,_), (minK,maxK,length, allEven,allOdd)) => let val isEven = even k in (minFn(k,minK), maxFn(k,maxK), length + 1, allEven andalso isEven, allOdd andalso not isEven) end) in if length > 1 andalso (allEven orelse allOdd) then let val f = if allOdd then halfFn o decFn else halfFn val cases' = List.map (cases, fn (k,target) => (f k, target)) val (cases'', minK'', maxK'', length'', shift'', mask'') = reduce' cases' val shift' = 1 + shift'' val mask' = WordX.orb (WordX.lshift(mask'', WordX.one WordSize.word64), if allOdd then WordX.one WordSize.word64 else WordX.zero WordSize.word64) in (cases'', minK'', maxK'', length'', shift', mask') end else (cases, minK, maxK, length, 0, WordX.zero WordSize.word64) end in reduce' cases end fun doitTable(cases, minK, _, rangeK, shift, mask) = let val jump_table_label = Label.newString "jumpTable" val idT = Directive.Id.new () val defaultT = Promise.delay (fn () => let val _ = incNear(jumpInfo, default) in pushCompensationBlock {label = default, id = idT} end) val rec filler = fn ([],_) => [] | (cases as (i,target)::cases',j) => if WordX.equals (i, j) then let val target' = pushCompensationBlock {label = target, id = idT} in (Immediate.label target'):: (filler(cases', incFn j)) end else (Immediate.label (Promise.force defaultT)):: (filler(cases, incFn j)) val jump_table = filler (cases, minK) val idD = Directive.Id.new () val defaultD = pushCompensationBlock {label = default, id = idD} val default_live = getLive(liveInfo, default) val live = List.fold (cases, default_live, fn ((_,target), live) => LiveSet.+(live, getLive(liveInfo, target))) val indexTemp = MemLoc.imm {base = Immediate.label (Label.fromString "indexTemp"), index = Immediate.zero, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Temp} val checkTemp = MemLoc.imm {base = Immediate.label (Label.fromString "checkTemp"), index = Immediate.zero, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Temp} val address = MemLoc.basic {base = Immediate.label jump_table_label, index = indexTemp, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Code} val size = case Operand.size test of SOME size => size | NONE => Size.QUAD val indexTemp' = indexTemp val indexTemp = Operand.memloc indexTemp val checkTemp' = checkTemp val checkTemp = Operand.memloc checkTemp val address = Operand.memloc address in AppendList.appends [if Size.lt(size, Size.QUAD) then AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, src = test, srcsize = size, dst = indexTemp, dstsize = Size.QUAD}) else AppendList.single (Assembly.instruction_mov {src = test, dst = indexTemp, size = Size.QUAD}), if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), if shift > 0 then let val idC = Directive.Id.new () val defaultC = pushCompensationBlock {label = default, id = idC} val _ = incNear(jumpInfo, default) in AppendList.appends [AppendList.fromList [Assembly.instruction_mov {src = indexTemp, dst = checkTemp, size = Size.QUAD}, Assembly.instruction_binal {oper = Instruction.AND, src = Operand.immediate_word (ones (shift, WordSize.word64)), dst = checkTemp, size = Size.QUAD}], if WordX.isZero mask then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word mask, dst = checkTemp, size = Size.QUAD}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton checkTemp', dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = Instruction.NZ, target = Operand.label defaultC}, Assembly.directive_saveregalloc {id = idC, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int shift, dst = indexTemp, size = Size.QUAD}]] end else AppendList.empty, if WordX.equals (minK, zero) then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word minK, dst = indexTemp, size = Size.QUAD}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.directive_cache {caches = [{register = indexReg, memloc = indexTemp', reserve = false}]}, Assembly.instruction_cmp {src1 = indexTemp, src2 = Operand.immediate_word rangeK, size = Size.QUAD}, Assembly.instruction_jcc {condition = Instruction.A, target = Operand.label defaultD}, Assembly.directive_saveregalloc {id = idD, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_jmp {target = address, absolute = true}, Assembly.directive_saveregalloc {id = idT, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ())}, Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton indexTemp', dead_classes = ClassSet.empty}], AppendList.fromList [Assembly.pseudoop_data (), Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.label jump_table_label, Assembly.pseudoop_quad jump_table, Assembly.pseudoop_text ()]] end fun doit(cases) = let val (cases, minK, maxK, length, shift, mask) = reduce(cases) val rangeK = range(minK,maxK) in if length >= 8 andalso WordX.lt (WordX.div(rangeK,two,{signed=false}), WordX.fromInt (length, ws), {signed = false}) then let val cases = List.insertionSort (cases, fn ((k,_),(k',_)) => ltFn(k,k')) in doitTable(cases, minK, maxK, rangeK, shift, mask) end else effectDefault gef {label = label, transfer = transfer} end in case cases of Transfer.Cases.Word cases => doit cases end | _ => effectDefault gef {label = label, transfer = transfer} and fallNone (GEF {...}) {label, live} : Assembly.t AppendList.t = let val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveXmmRegsTransfer = getLiveXmmRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveXmmRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) fun default () = AppendList.fromList ((* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}):: (Assembly.directive_xmmcache {caches = List.map (liveXmmRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}):: (Assembly.instruction_jmp {target = Operand.label label, absolute = false}):: (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}):: (Assembly.directive_xmmunreserve {registers = (List.map (liveXmmRegsTransfer, fn (_,register,_) => register))}):: nil) in case getLayoutInfo label of NONE => default () | SOME (Block.T {...}) => (push label; default ()) end and fallDefault (gef as GEF {generate,...}) {label, live} : Assembly.t AppendList.t = let datatype z = datatype amd64JumpInfo.status val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveXmmRegsTransfer = getLiveXmmRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveXmmRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) fun default jmp = AppendList.appends [AppendList.fromList [(* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_xmmcache {caches = List.map (liveXmmRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], if jmp then AppendList.single (Assembly.instruction_jmp {target = Operand.label label, absolute = false}) else AppendList.empty, AppendList.fromList [(Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}), (Assembly.directive_xmmunreserve {registers = (List.map (liveXmmRegsTransfer, fn (_,register,_) => register))})]] in case getLayoutInfo label of NONE => default true | SOME (Block.T {...}) => (case getNear(jumpInfo, label) of Count 1 => generate gef {label = label, falling = true, unique = true} | _ => AppendList.append (default false, AppendList.cons (Assembly.directive_reset (), (generate gef {label = label, falling = true, unique = false})))) end fun make {generate, effect, fall} = generate (GEF {generate = generate, effect = effect, fall = fall}) val generate = case optimize of 0 => make {generate = generateAll, effect = effectDefault, fall = fallNone} | _ => make {generate = generateAll, effect = effectJumpTable, fall = fallDefault} val _ = List.foreach (blocks, fn Block.T {entry, ...} => (case entry of Func {label, ...} => enque label | _ => ())) fun doit () : Assembly.t list list = (case deque () of NONE => [] | SOME label => (case AppendList.toList (generate {label = label, falling = false, unique = false}) of [] => doit () | block => block::(doit ()))) val assembly = doit () val _ = destLayoutInfo () val _ = destProfileLabel () val assembly = [Assembly.pseudoop_text ()]::assembly val assembly = if List.isEmpty data then assembly else data::assembly in assembly end val (generateTransfers, generateTransfers_msg) = tracerTop "generateTransfers" generateTransfers fun generateTransfers_totals () = (generateTransfers_msg (); Control.indent (); amd64Liveness.LiveInfo.verifyLiveInfo_msg (); amd64JumpInfo.verifyJumpInfo_msg (); amd64EntryTransfer.verifyEntryTransfer_msg (); amd64LoopInfo.createLoopInfo_msg (); amd64LiveTransfers.computeLiveTransfers_totals (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-generate-transfers.sig000066400000000000000000000023261416264345000263170ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_GENERATE_TRANSFERS_STRUCTS = sig structure amd64 : AMD64 structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64LoopInfo : AMD64_LOOP_INFO sharing amd64 = amd64LoopInfo.amd64 structure amd64EntryTransfer : AMD64_ENTRY_TRANSFER sharing amd64 = amd64EntryTransfer.amd64 end signature AMD64_GENERATE_TRANSFERS = sig include AMD64_GENERATE_TRANSFERS_STRUCTS val generateTransfers: {chunk: amd64.Chunk.t, optimize: int, newProfileLabel: amd64.ProfileLabel.t -> amd64.ProfileLabel.t, liveInfo: amd64Liveness.LiveInfo.t, jumpInfo: amd64JumpInfo.t, reserveRsp: bool} -> amd64.Assembly.t list list val generateTransfers_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-jump-info.fun000066400000000000000000000073501416264345000244340ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64JumpInfo(S: AMD64_JUMP_INFO_STRUCTS) : AMD64_JUMP_INFO = struct open S open amd64 val tracer = amd64.tracer datatype status = Count of int | None val status_eq = fn (None , None ) => true | (Count i1, Count i2) => i1 = i2 | _ => false val status_toString = fn None => "None" | Count i => concat ["Count ", Int.toString i] datatype t = T of {get: Label.t -> status ref} fun newJumpInfo () = let val {get : Label.t -> status ref, ...} = Property.get(Label.plist, Property.initFun (fn _ => ref (Count 0))) in T {get = get} end local fun doit (status_ref, maybe_fn) = case !status_ref of None => () | Count i => status_ref := (maybe_fn i) in fun incNear (T {get}, label) = doit (get label, fn i => Count (i+1)) fun decNear (T {get}, label) = doit (get label, fn i => Count (i-1)) fun forceNear (T {get}, label) = doit (get label, fn _ => None) end fun getNear (T {get}, label) = !(get label) fun completeJumpInfo {chunk = Chunk.T {blocks, ...}, jumpInfo: t} = List.foreach (blocks, fn Block.T {entry, transfer,...} => (case entry of Entry.Jump _ => () | Entry.Func {label, ...} => forceNear (jumpInfo, label) | Entry.Cont {label, ...} => forceNear (jumpInfo, label) | Entry.Handler {label, ...} => forceNear (jumpInfo, label) | Entry.CReturn {label, func, ...} => if CFunction.maySwitchThreadsTo func then forceNear (jumpInfo, label) else (); List.foreach (Transfer.nearTargets transfer, fn label => incNear (jumpInfo, label)))) val (completeJumpInfo, completeJumpInfo_msg) = tracer "completeJumpInfo" completeJumpInfo fun verifyJumpInfo {chunk as Chunk.T {blocks, ...}, jumpInfo: t} = let local val {get : Label.t -> status ref, destroy} = Property.destGet(Label.plist, Property.initFun (fn _ => ref (Count 0))) in val jumpInfo' = T {get = get} val destroy = destroy end val _ = completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo'} val verified = List.forall (blocks, fn Block.T {entry,...} => let val label = Entry.label entry in if status_eq(getNear(jumpInfo, label), getNear(jumpInfo', label)) then true else (print "verifyJumpInfo: "; print (Label.toString label); print "\n"; print "jumpInfo: "; print (status_toString (getNear(jumpInfo, label))); print "\n"; print "jumpInfo': "; print (status_toString (getNear(jumpInfo', label))); print "\n"; false) end) val _ = destroy () in verified end val (verifyJumpInfo, verifyJumpInfo_msg) = tracer "verifyJumpInfo" verifyJumpInfo end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-jump-info.sig000066400000000000000000000016611416264345000244250ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_JUMP_INFO_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_JUMP_INFO = sig include AMD64_JUMP_INFO_STRUCTS datatype status = Count of int | None type t val newJumpInfo : unit -> t val completeJumpInfo : {chunk: amd64.Chunk.t, jumpInfo: t} -> unit val completeJumpInfo_msg : unit -> unit val verifyJumpInfo : {chunk: amd64.Chunk.t, jumpInfo: t} -> bool val verifyJumpInfo_msg : unit -> unit val incNear : t * amd64.Label.t -> unit val decNear : t * amd64.Label.t -> unit val getNear : t * amd64.Label.t -> status end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-live-transfers.fun000066400000000000000000001524771416264345000255070ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Some of this doesn't make sense if we track the liveness of the GCHold class. * Need to update the enque'' of returns, handlers of NonTail and Runtime * so they reflect what happens at these transfers; (i.e., stackTop and frontier * are defed on return from NonTail). *) functor amd64LiveTransfers(S: AMD64_LIVE_TRANSFERS_STRUCTS) : AMD64_LIVE_TRANSFERS = struct open S open amd64 local open Runtime in structure CFunction = CFunction end structure LiveSet = amd64Liveness.LiveSet structure LiveInfo = amd64Liveness.LiveInfo open amd64JumpInfo open amd64LoopInfo val track = amd64Liveness.track val tracerTop = amd64.tracerTop fun temp_uses_defs {uses : Operand.t list, defs : Operand.t list} = let val baseUses = List.fold (uses, MemLocSet.empty, fn (operand, baseUses) => case Operand.deMemloc operand of SOME memloc => if amd64Liveness.track memloc then MemLocSet.add(baseUses, memloc) else baseUses | NONE => baseUses) val tempUses = let fun doit (operands, tempUses) = List.fold (operands, tempUses, fn (operand, tempUses) => case Operand.deMemloc operand of SOME memloc => List.fold(MemLoc.utilized memloc, tempUses, fn (memloc, tempUses) => if amd64Liveness.track memloc then MemLocSet.add(tempUses, memloc) else tempUses) | NONE => tempUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = List.fold (defs, MemLocSet.empty, fn (operand, baseDefs) => case Operand.deMemloc operand of SOME memloc => if amd64Liveness.track memloc then MemLocSet.add(baseDefs, memloc) else baseDefs | NONE => baseDefs) val tempDefs = baseDefs in {uses = tempUses, defs = tempDefs} end datatype t = T of {get: Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list), set: Label.t * ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list) -> unit} local in structure I' = struct open Int fun sign x = if x = 0 then 0 else if x > 0 then 1 else ~1 end structure I = struct datatype t = NegInfinity | Finite of I'.t | PosInfinity val toString = fn NegInfinity => "-inf" | Finite n => I'.toString n | PosInfinity => "+inf" val zero = Finite (I'.zero) fun NegInfinity < NegInfinity = false | NegInfinity < _ = true | (Finite _) < NegInfinity = false | (Finite x) < (Finite y) = I'.<(x,y) | (Finite _) < PosInfinity = true | PosInfinity < _ = false fun NegInfinity + PosInfinity = zero | NegInfinity + _ = NegInfinity | (Finite _) + NegInfinity = NegInfinity | (Finite x) + (Finite y) = ((Finite (I'.+(x,y))) handle Overflow => if x > 0 then PosInfinity else NegInfinity) | (Finite _) + PosInfinity = PosInfinity | PosInfinity + NegInfinity = zero | PosInfinity + _ = PosInfinity fun NegInfinity * NegInfinity = PosInfinity | NegInfinity * (Finite x) = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | NegInfinity * PosInfinity = NegInfinity | (Finite x) * NegInfinity = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | (Finite x) * (Finite y) = ((Finite (I'.*(x, y))) handle Overflow => (case (I'.sign x, I'.sign y) of (~1, ~1) => PosInfinity | (1, ~1) => NegInfinity | (~1, 1) => NegInfinity | _ => PosInfinity)) | (Finite x) * PosInfinity = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * NegInfinity = NegInfinity | PosInfinity * (Finite x) = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * PosInfinity = PosInfinity end end fun computeLiveTransfers {chunk = Chunk.T {blocks,...}, transferRegs : Entry.t -> Register.t list, transferXmmRegs : Entry.t -> XmmRegister.t list, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} = let val (useLF, useB, sync) = case !Control.Native.liveTransfer of 1 => (false, false, false) | 2 => (false, false, true) | 3 => (false, true, false) | 4 => (false, true, true) | 5 => (true, false, false) | 6 => (true, false, true) | 7 => (true, true, false) | _ => (true, true, true) val cutoff = !Control.Native.cutoff datatype u = Position of I.t | Length of I'.t val {get = getInfo : Label.t -> {block: Block.t, pred: Label.t list ref, succ: Label.t list ref, live: {memloc: MemLoc.t, distanceF': u option ref, distanceF: (I.t * Label.t option) option ref, distanceB': u option ref, distanceB: (I.t * Label.t option) option ref} vector, liveTransfers: ((MemLoc.t * Register.t * bool ref) list * (MemLoc.t * XmmRegister.t * bool ref) list) option ref, defed: MemLocSet.t option ref}, set = setInfo, destroy = destInfo} = Property.destGetSetOnce (Label.plist, Property.initRaise ("amd64LiveTransfers:getInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, transfer, ...}, (labels, funcs)) => let val label = Entry.label entry val succ = Transfer.nearTargets transfer val live = LiveInfo.getLive(liveInfo, label) val live = List.fold (succ, live, fn (label, live) => LiveSet.+(live, LiveInfo.getLive(liveInfo, label))) val live = LiveSet.toList live val _ = setInfo(label, {block = block, pred = ref [], succ = ref succ, live = Vector.fromListMap (live, fn memloc => {memloc = memloc, distanceF' = ref NONE, distanceF = ref NONE, distanceB' = ref NONE, distanceB = ref NONE}), liveTransfers = ref NONE, defed = ref NONE}) val labels = label::labels val funcs = case entry of Entry.Func _ => label::funcs | _ => funcs in (labels, funcs) end) val labels = Vector.fromList labels val funcs = Vector.fromList funcs val _ = Vector.foreach (labels, fn label => let val {block, ...} = getInfo label fun doit target = let val {pred = pred', ...} = getInfo target in List.push (pred', label) end val Block.T {transfer, ...} = block datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => doit target | Iff {truee, falsee, ...} => (doit truee; doit falsee) | Switch {cases, default, ...} => (doit default; Transfer.Cases.foreach(cases, doit o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit return; case handler of SOME handler => doit handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, ...} => Option.app (return, doit o #return) end) val _ = Vector.foreach (labels, fn label => let val {block, live, ...} = getInfo label val Block.T {entry, statements, transfer, ...} = block val l = List.fold (statements, I'.two, fn (Assembly.Comment _, l) => l | (_, l) => I'.+(l, I'.one)) fun pos ([], n, m) = let val {uses, defs, ...} = Transfer.uses_defs_kills transfer val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else distanceF' := SOME (Length l) | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()) end | pos ((Assembly.Comment _)::assembly,n,m) = pos (assembly,n,m) | pos (asm::assembly,n,m) = let val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()); pos(assembly, I'.+(n, I'.one), I'.-(m, I'.one)) end in let val n = I'.zero val m = I'.-(l, I'.one) val {uses,defs,...} = Entry.uses_defs_kills entry val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else distanceB' := SOME (Length l)); pos(statements, I'.+(n, I'.one), I'.-(m, I'.one)) end end) fun get_distanceF {temp: MemLoc.t, label: Label.t} = let val {block, succ, live, ...} = getInfo label val Block.T {transfer, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceF = ref (SOME (df, dfl)), ...} => (df, dfl) | SOME {distanceF', distanceF, ...} => (case valOf (!distanceF') of Position n => (distanceF := SOME (n, SOME label); (n, SOME label)) | Length n => let val loopLabels = getLoopLabels (loopInfo, label) val _ = distanceF := SOME (I.PosInfinity, NONE) fun default () = let val n = I.Finite n val (min, minl) = List.fold (!succ, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val (n', l') = get_distanceF {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) in (min, minl) end datatype z = datatype Transfer.t val (n, l) = case transfer of Tail _ => (I.PosInfinity, NONE) | NonTail _ => (I.PosInfinity, NONE) | Return _ => (I.PosInfinity, NONE) | Raise _ => (I.PosInfinity, NONE) | CCall {func, ...} => if CFunction.maySwitchThreadsFrom func orelse Size.class (MemLoc.size temp) <> Size.INT then (I.PosInfinity, NONE) else default () | _ => default () in distanceF := SOME (n, l) ; (n, l) end) | _ => (I.PosInfinity, NONE) end fun get_distanceB {temp: MemLoc.t, label: Label.t} = let val {block, pred, live, ...} = getInfo label val Block.T {entry, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB = ref (SOME (db, dbl)), ...} => (db, dbl) | SOME {distanceB, ...} => let val loopLabels = getLoopLabels(loopInfo, label) val _ = distanceB := SOME (I.PosInfinity, NONE) fun default () = List.fold (!pred, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val {live, ...} = getInfo label in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB', ...} => (case valOf(!distanceB') of Position n => if I.<(n, min) then (n, SOME label) else (min, minl) | Length n => let val n = I.Finite n val (n', l') = get_distanceB {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) | _ => (min, minl) end) datatype z = datatype Entry.t val (n, l) = case entry of Func {...} => (I.PosInfinity, NONE) | Cont {...} => (I.PosInfinity, NONE) | Handler {...} => (I.PosInfinity, NONE) | CReturn {func, ...} => if (CFunction.maySwitchThreadsTo func orelse Size.class (MemLoc.size temp) <> Size.INT) then (I.PosInfinity, NONE) else default () | _ => default () in distanceB := SOME (n, l) ; (n, l) end | _ => (I.PosInfinity, NONE) end local val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun deque () = case Queue.deque (!queue) of NONE => NONE | SOME (queue', x) => (queue := queue'; SOME x) end fun doit {label, hints} = let val {block as Block.T {entry, ...}, live = liveData, liveTransfers, ...} = getInfo label in case !liveTransfers of SOME _ => () | NONE => let val loopLabels = getLoopLabels(loopInfo, label) val Block.T {transfer, ...} = block val (regHints, xmmregHints) = hints val live = LiveSet.toList(LiveInfo.getLive(liveInfo, label)) val _ = if true then () else (print (Label.toString label); print "\nloopLabels: "; print (List.toString Label.toString loopLabels); print "\nliveData:\n"; Vector.foreach (liveData, fn {memloc, distanceF', distanceB', ...} => (print (MemLoc.toString memloc); print ": "; case !distanceF' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print " "; case !distanceB' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print "\n")); print "regHints:\n"; List.foreach (regHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "xmmregHints:\n"; List.foreach (xmmregHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (XmmRegister.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "live:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print "\n")); print "distance_F:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceF {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n")); print "distance_B:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceB {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n"))) val live = if not useB then List.keepAllMap (live, fn memloc => case get_distanceF {temp = memloc, label = label} of (I.Finite n, SOME l) => if n < cutoff then if useLF then if List.contains (loopLabels, l, Label.equals) then SOME (memloc, n) else SOME (memloc, n * 5) else SOME (memloc, n) else NONE | (I.PosInfinity, _) => NONE | _ => Error.bug "amd64LiveTransfers.computeLiveTransfers.live: get_distanceF") else List.keepAllMap (live, fn memloc => case (get_distanceB {temp = memloc, label = label}, get_distanceF {temp = memloc, label = label}) of ((I.PosInfinity, _), _) => NONE | (_, (I.PosInfinity, _)) => NONE | ((I.Finite n, SOME nl), (I.Finite m, SOME ml)) => if (n + m) < cutoff then if useLF then case (List.contains (loopLabels, nl, Label.equals), List.contains (loopLabels, ml, Label.equals)) of (true, true) => SOME (memloc, n + m) | (true, false) => SOME (memloc, n + 5 * m) | (false, true) => SOME (memloc, 5 * n + m) | (false, false) => SOME (memloc, 5 * n + 5 * m) else SOME (memloc, n + m) else NONE | _ => Error.bug "amd64LiveTransfers.computeLiveTransfers.live: get_distanceB") (* List.partition will reverse the lists. * So sort in increasing order. *) val live = List.insertionSort (live, fn ((_,n1),(_,n2)) => I'.>(n1, n2)) val _ = if true then () else (print "live:\n"; List.foreach (live, fn (memloc,n) => (print (MemLoc.toString memloc); print ": "; print (I'.toString n); print "\n"))) val {yes = liveRegs, no = liveXmmRegs} = List.partition (live, fn (memloc,_) => Size.class (MemLoc.size memloc) = Size.INT) val liveRegs = List.map (liveRegs, fn (memloc,weight) => case List.peek (regHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferRegs = List.removeAll (transferRegs, fn register' => Register.coincide(register, register')) in doitRegs (transferRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferRegs' = List.keepAllMap (transferRegs, fn register => if Size.eq (size, Register.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => Register.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferRegs' = List.insertionSort (transferRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferRegs' of nil => doitRegs (transferRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferRegs, register, Register.eq) then finish register else default () | NONE => default () end val liveRegsTransfers = doitRegs(transferRegs entry, liveRegs, []) val liveXmmRegs = List.map (liveXmmRegs, fn (memloc,weight) => case List.peek (xmmregHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitXmmRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferXmmRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferXmmRegs = List.removeAll (transferXmmRegs, fn register' => XmmRegister.coincide(register, register')) in doitXmmRegs (transferXmmRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferXmmRegs' = List.keepAllMap (transferXmmRegs, fn register => if Size.eq (size, XmmRegister.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => XmmRegister.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferXmmRegs' = List.insertionSort (transferXmmRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferXmmRegs' of nil => doitXmmRegs (transferXmmRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferXmmRegs, register, XmmRegister.eq) then finish register else default () | NONE => default () end val liveXmmRegsTransfers = doitXmmRegs(transferXmmRegs entry, liveXmmRegs, []) val _ = liveTransfers := SOME (liveRegsTransfers, liveXmmRegsTransfers) (* val _ = (print "liveRegsTransfers:\n"; List.foreach (liveRegsTransfers, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "liveFltRegsTransfers:\n"; List.foreach (liveFltRegsTransfers, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "") *) fun doit' label = enque {label = label, hints = (liveRegsTransfers, liveXmmRegsTransfers)} fun doit'' label = enque {label = label, hints = ([],[])} fun doit''' func label = let val hints = List.fold (Operand.cReturnTemps (CFunction.return func), ([],[]), fn ({src, dst}, (regHints, xmmregHints)) => case src of Operand.Register reg => ((dst, reg, ref true) :: regHints, xmmregHints) | Operand.XmmRegister reg => (regHints, (dst, reg, ref true) :: xmmregHints) | _ => (regHints, xmmregHints)) in enque {hints = hints, label = label} end datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreadsFrom func then Option.app (return, doit'' o #return) else Option.app (return, doit''' func o #return) end end val _ = Vector.foreach (funcs, fn label => enque {label = label, hints = ([],[])}) fun loop () = (case deque () of NONE => () | SOME {label, hints} => (doit {label = label, hints = hints}; loop ())) val _ = loop () fun doit {label, defed = defed'} = let val {block, liveTransfers, defed, ...} = getInfo label val (liveRegs, liveXmmRegs) = valOf (!liveTransfers) val defed' = case getNear(jumpInfo, label) of None => MemLocSet.empty | Count 0 => MemLocSet.empty | Count 1 => defed' | Count _ => MemLocSet.subset (defed', fn memloc => List.exists (liveRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc)) orelse List.exists (liveXmmRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc))) fun default defed'' = let val Block.T {entry, statements, transfer, ...} = block val _ = List.foreach (liveRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val _ = List.foreach (liveXmmRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val defed' = MemLocSet.+(defed'', defed') val _ = defed := SOME defed' fun doit' (defed', defs) = List.fold (defs, defed', fn (def,defed') => case Operand.deMemloc def of SOME def => if track def then MemLocSet.add(defed', def) else defed' | NONE => defed') val {defs, ...} = Entry.uses_defs_kills entry val defed' = doit' (defed', defs) val defed' = List.fold (statements, defed', fn (asm,defed') => let val {defs, ...} = Assembly.uses_defs_kills asm in doit' (defed', defs) end) val {defs, ...} = Transfer.uses_defs_kills transfer val defed' = doit' (defed', defs) fun doit' label = doit {label = label, defed = defed'} fun doit'' label = doit {label = label, defed = MemLocSet.empty} datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (Transfer.Cases.foreach(cases, doit' o #2); doit' default) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreadsFrom func then Option.app (return, doit'' o #return) else Option.app (return, doit' o #return) end in case !defed of NONE => default MemLocSet.empty | SOME defed => if MemLocSet.<=(defed',defed) then () else default defed end val _ = Vector.foreach (funcs, fn label => doit {label = label, defed = MemLocSet.empty}) val {get = getLiveTransfers : Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list), set = setLiveTransfers, ...} = Property.getSet (Label.plist, Property.initRaise ("amd64LiveTransfers:getLiveTransfers", Label.layout)) val _ = Vector.foreach (labels, fn label => let val {liveTransfers, ...} = getInfo label val (liveRegs, liveXmmRegs) = valOf (!liveTransfers) val (liveRegs, liveXmmRegs) = if sync then (List.map (liveRegs, fn (memloc,reg, sync) => (memloc, reg, !sync)), List.map (liveXmmRegs, fn (memloc,reg, sync) => (memloc, reg, !sync))) else (List.map (liveRegs, fn (memloc,reg, _) => (memloc, reg, false)), List.map (liveXmmRegs, fn (memloc,reg, _) => (memloc, reg, false))) in setLiveTransfers(label, (liveRegs, liveXmmRegs)) end) val _ = destInfo () in T {get = getLiveTransfers, set = setLiveTransfers} end val computeLiveTransfers = fn {chunk, transferRegs, transferXmmRegs, liveInfo, jumpInfo, loopInfo} => if !Control.Native.liveTransfer > 0 then computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferXmmRegs = transferXmmRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} else let val {get = getLiveTransfers, set = setLiveTransfers, ...} = Property.getSetOnce(Label.plist, Property.initConst ([], [])) in T {get = getLiveTransfers, set = setLiveTransfers} end val (computeLiveTransfers : {chunk : Chunk.t, transferRegs : Entry.t -> Register.t list, transferXmmRegs : Entry.t -> XmmRegister.t list, liveInfo : LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} -> t, computeLiveTransfers_msg) = tracerTop "computeLiveTransfers" computeLiveTransfers fun computeLiveTransfers_totals () = (computeLiveTransfers_msg ()) fun getLiveTransfers (T {get, ...}, label) = get label fun setLiveTransfersEmpty (T {set, ...}, label) = set(label, ([], [])) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-live-transfers.sig000066400000000000000000000026361416264345000254700ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LIVE_TRANSFERS_STRUCTS = sig structure amd64 : AMD64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64LoopInfo : AMD64_LOOP_INFO sharing amd64 = amd64LoopInfo.amd64 end signature AMD64_LIVE_TRANSFERS = sig include AMD64_LIVE_TRANSFERS_STRUCTS type t val computeLiveTransfers : {chunk : amd64.Chunk.t, transferRegs : amd64.Entry.t -> amd64.Register.t list, transferXmmRegs : amd64.Entry.t -> amd64.XmmRegister.t list, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} -> t val computeLiveTransfers_totals : unit -> unit val getLiveTransfers : t * amd64.Label.t -> ((amd64.MemLoc.t * amd64.Register.t * bool) list * (amd64.MemLoc.t * amd64.XmmRegister.t * bool) list) val setLiveTransfersEmpty : t * amd64.Label.t -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-liveness.fun000066400000000000000000000636711416264345000243700ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64Liveness(S: AMD64_LIVENESS_STRUCTS) : AMD64_LIVENESS = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop structure LiveSet = struct open MemLocSet fun toMemLocSet s = s end fun track memloc = ClassSet.contains(!amd64MLtonBasic.Classes.livenessClasses, MemLoc.class memloc) fun livenessOperands live = List.fold (live, LiveSet.empty, fn (operand, live) => (case Operand.deMemloc operand of NONE => live | SOME memloc => if track memloc then LiveSet.add(live, memloc) else live)) structure LiveInfo = struct datatype t = T of {get: Label.t -> LiveSet.t, set: Label.t * LiveSet.t -> unit} fun newLiveInfo () = let val {get : Label.t -> LiveSet.t, set : Label.t * LiveSet.t -> unit, ...} = Property.getSet (Label.plist, Property.initRaise ("liveInfo", Label.layout)) in T {get = get, set = set} end fun setLiveOperands (T {set, ...}, label, live) = set(label, livenessOperands live) fun setLive (T {set, ...}, label, live) = set(label, live) fun getLive (T {get, ...}, label) = get label end fun liveness_uses_defs {uses : Operand.t list, defs : Operand.t list} : {uses : LiveSet.t, defs : LiveSet.t} = let val baseUses = livenessOperands uses val livenessUses = let fun doit (operands, livenessUses) = List.fold (operands, livenessUses, fn (operand, livenessUses) => case Operand.deMemloc operand of SOME memloc => List.fold (MemLoc.utilized memloc, livenessUses, fn (memloc, livenessUses) => if track memloc then LiveSet.add(livenessUses, memloc) else livenessUses) | NONE => livenessUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = livenessOperands defs val livenessDefs = baseDefs in {uses = livenessUses, defs = livenessDefs} end structure Liveness = struct datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} local fun make f (T r) = f r in val dead = make #dead val liveIn = make #liveIn end fun toString (T {liveIn, liveOut, dead}) = let fun doit (name, l, toString, s) = LiveSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit("liveIn: ", liveIn, MemLoc.toString, doit("liveOut: ", liveOut, MemLoc.toString, doit("dead: ", dead, MemLoc.toString, ""))) end fun eq (T {liveIn = liveIn1, liveOut = liveOut1, dead = dead1}, T {liveIn = liveIn2, liveOut = liveOut2, dead = dead2}) = LiveSet.equals(liveIn1, liveIn2) andalso LiveSet.equals(liveOut1, liveOut2) andalso LiveSet.equals(dead1, dead2) fun liveness ({uses : LiveSet.t, defs : LiveSet.t, live : LiveSet.t}) : t = let val liveOut = live (* liveIn = uses \/ (liveOut - defs) *) val liveIn = LiveSet.+(uses, LiveSet.-(live, defs)) (* dead = (liveIn \/ defs) - liveOut *) val dead = LiveSet.-(LiveSet.+(liveIn, defs), liveOut) in T {liveIn = liveIn, liveOut = liveOut, dead = dead} end fun livenessEntry {entry : Entry.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Entry.uses_defs_kills entry val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} val defs = MemLocSet.fold (Entry.live entry, defs, fn (memloc, defs) => if track memloc then LiveSet.add(defs, memloc) else defs) in liveness {uses = uses, defs = defs, live = live} end fun livenessAssembly {assembly : Assembly.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Assembly.uses_defs_kills assembly val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer' {transfer: Transfer.t, live : LiveSet.t} : t = let val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses,defs} = liveness_uses_defs {uses = uses, defs = defs} (* Transfer.live transfer could be considered uses, * but the Liveness.t of a transfer should have * Transfer.live transfer as liveOut. *) val live = MemLocSet.fold (Transfer.live transfer, live, fn (memloc, live) => if track memloc then LiveSet.add(live, memloc) else live) in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer {transfer: Transfer.t, liveInfo: LiveInfo.t} : t = let val targets = Transfer.nearTargets transfer val live = List.fold (targets, LiveSet.empty, fn (target, live) => LiveSet.union(LiveInfo.getLive(liveInfo, target), live)) in livenessTransfer' {transfer = transfer, live = live} end fun livenessBlock {block = Block.T {entry, statements, transfer, ...}, liveInfo : LiveInfo.t} = let val T {liveIn = live, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val live = List.foldr (statements, live, fn (asm,live) => let val T {liveIn = live, ...} = livenessAssembly {assembly = asm, live = live} in live end) val T {liveIn = live, ...} = livenessEntry {entry = entry, live = live} in live end end structure LiveInfo = struct open LiveInfo fun completeLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : LiveInfo.t, pass: string} = let val {get = getBlockInfo : Label.t -> {pred: Label.t list ref, block: Block.t option ref, topo: int ref}, destroy = destBlockInfo} = Property.destGet (Label.plist, Property.initFun (fn _ => {pred = ref [], block = ref NONE, topo = ref ~1})) val get_pred = (#pred o getBlockInfo) val get_topo = (#topo o getBlockInfo) val get_pred' = (! o #pred o getBlockInfo) val get_block' = (! o #block o getBlockInfo) val get_topo' = (! o #topo o getBlockInfo) val labels = List.map (blocks, fn block' as Block.T {entry, transfer,...} => let val label = Entry.label entry val {block,topo,...} = getBlockInfo label val targets = Transfer.nearTargets transfer in block := SOME block'; topo := 0; List.foreach (targets, fn target => List.push(get_pred target, label)); label end) local val todo = ref [] fun topo_order(x,y) = Int.compare(get_topo' x, get_topo' y) fun insert (l, x, compare) = let val rec insert' = fn ([],acc) => List.appendRev(acc, [x]) | (l as h::t,acc) => (case compare(h,x) of LESS => insert' (t, h::acc) | EQUAL => List.appendRev(acc, l) | GREATER => List.appendRev(acc, x::l)) in insert' (l,[]) end in fun add_todo x = todo := insert(!todo, x, topo_order) fun push_todo x = todo := x::(!todo) fun rev_todo () = todo := List.rev (!todo) fun get_todo () = (case !todo of [] => NONE | (x::todo') => (todo := todo'; SOME x)) end local val nextNum = Counter.generator 1 in fun topo_sort label = let val {topo, pred, ...} = getBlockInfo label in if !topo = 0 then (topo := nextNum (); push_todo label; List.foreach(!pred, topo_sort)) else () end fun topo_root label = (get_topo label := nextNum (); push_todo label) end fun loop (labels, n) = if List.isEmpty labels then () else let val {yes = exits, no = labels} = List.partition (labels, fn label => let val Block.T {transfer, ...} = valOf (get_block' label) val targets = Transfer.nearTargets transfer val targets' = List.fold(targets, 0, fn (target,targets') => if get_topo' target = ~1 then targets' else targets' + 1) in targets' = n end) val exits = List.removeAll (exits, fn label => get_topo' label <> 0) val _ = (List.foreach (exits, fn label => topo_root label); List.foreach (exits, fn label => List.foreach(get_pred' label, topo_sort))) in loop(labels, n + 1) end val _ = loop(labels, 0) val _ = rev_todo () val changed = ref false fun doit () = (case get_todo () of NONE => () | SOME label => let val {pred, block, ...} = getBlockInfo label val block = valOf (!block) val live = Liveness.livenessBlock {block = block, liveInfo = liveInfo} val live' = LiveInfo.getLive(liveInfo, label) in if LiveSet.equals(live, live') then () else (LiveInfo.setLive(liveInfo, label, live); List.foreach(!pred, add_todo); if true then () else (print "completeLiveInfo:"; print pass; print ": "; print (Label.toString label); print ": "; if LiveSet.<(live, live') then print "new < old" else if LiveSet.<(live', live) then print "old < new" else print "?"; print "\n"; if true then (print "old: "; LiveSet.foreach (live', fn m => (print (MemLoc.toString m); print " ")); print "\n"; print "new: "; LiveSet.foreach (live, fn m => (print (MemLoc.toString m); print " ")); print "\n") else ()); changed := true); doit () end) val _ = doit () val _ = destBlockInfo () in () end val (completeLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t, pass: string} -> unit, completeLiveInfo_msg) = tracerTop "completeLiveInfo" completeLiveInfo fun verifyLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : t} = List.forall (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry val live = LiveInfo.getLive(liveInfo, label) val live' = Liveness.livenessBlock {block = block, liveInfo = liveInfo} in LiveSet.equals(live, live') end) val (verifyLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t} -> bool, verifyLiveInfo_msg) = tracer "verifyLiveInfo" verifyLiveInfo end structure LivenessBlock = struct datatype t = T of {entry: (Entry.t * Liveness.t), profileLabel: ProfileLabel.t option, statements: (Assembly.t * Liveness.t) list, transfer: Transfer.t * Liveness.t} fun printBlock (T {entry, statements, transfer, ...}) = (let val (entry,info) = entry in print (Entry.toString entry); print "\n"; print (Liveness.toString info) end; List.foreach (statements, fn (asm,info) => (print (Assembly.toString asm); print "\n"; print (Liveness.toString info))); let val (trans,info) = transfer in print (Transfer.toString trans); print "\n"; print (Liveness.toString info); print "\n" end) fun toLivenessEntry {entry, live} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun reLivenessEntry {entry, live} = let val (entry,_) = entry val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun toLivenessStatements {statements, live} = let val {statements,live} = List.foldr(statements, {statements = [], live = live}, fn (asm,{statements,live}) => let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info)::statements, live = live} end) in {statements = statements, live = live} end fun reLivenessStatements {statements: (Assembly.t * Liveness.t) list, live} = let val {statements,live,...} = List.foldr(statements, {statements = [], live = live, continue = false}, fn ((asm,info),{statements,live,continue}) => if continue then {statements = (asm,info)::statements, live = Liveness.liveIn info, continue = continue} else let val info' as Liveness.T {liveIn = live',...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info')::statements, live = live', continue = Liveness.eq(info,info')} end) in {statements = statements, live = live} end fun toLivenessTransfer {transfer, liveInfo} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {transfer = (transfer,info), live = live} end fun reLivenessTransfer {transfer: Transfer.t * Liveness.t} = let val (transfer, Liveness.T {liveOut,...}) = transfer val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer' {transfer = transfer, live = liveOut} in {transfer = (transfer, info), live = live} end fun toLivenessBlock {block = Block.T {entry, profileLabel, statements, transfer}, liveInfo : LiveInfo.t} = let val {transfer, live} = toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, live} = toLivenessStatements {statements =statements, live = live} val {entry, ...} = toLivenessEntry {entry = entry, live = live} val liveness_block = T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in liveness_block end val (toLivenessBlock: {block: Block.t, liveInfo: LiveInfo.t} -> t, toLivenessBlock_msg) = tracer "toLivenessBlock" toLivenessBlock fun verifyLivenessEntry {entry = (entry,info), live} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessEntry {entry = entry, live = live} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessStatements {statements, live} = List.foldr(statements, {verified = true, live = live}, fn ((asm,info),{verified, live}) => let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessAssembly {assembly = asm, live = live} val eq = Liveness.eq(info, info') val () = if eq then () else (print "asm ::\n"; print (Assembly.toString asm); print "\n"; print "info ::\n"; print (Liveness.toString info); print "\n"; print "info' ::\n"; print (Liveness.toString info'); print "\n") in {verified = verified andalso Liveness.eq(info, info'), live = live'} end) fun verifyLivenessTransfer {transfer = (transfer,info), liveInfo} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessBlock {block = T {entry, statements, transfer, ...}, liveInfo: LiveInfo.t} = let val {verified = verified_transfer, live} = verifyLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {verified = verified_statements, live} = verifyLivenessStatements {statements =statements, live = live} val {verified = verified_entry, ...} = verifyLivenessEntry {entry = entry, live = live} (* FIXME -- the live-in set changed because of dead code elimination. val live' = get label val verified_live = List.equalsAsSet(live, live', MemLoc.eq) *) val verified_live = true in verified_transfer andalso verified_statements andalso verified_entry andalso verified_live end val (verifyLivenessBlock: {block: t, liveInfo: LiveInfo.t} -> bool, verifyLivenessBlock_msg) = tracer "verifyLivenessBlock" verifyLivenessBlock fun toBlock {block = T {entry, profileLabel, statements, transfer}} = let val (entry,_) = entry val statements = List.map(statements, fn (asm,_) => asm) val (transfer,_) = transfer in Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} end val (toBlock: {block: t} -> Block.t, toBlock_msg) = tracer "toBlock" toBlock end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-liveness.sig000066400000000000000000000077641416264345000243630ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LIVENESS_STRUCTS = sig structure amd64: AMD64 structure amd64MLtonBasic: AMD64_MLTON_BASIC sharing amd64 = amd64MLtonBasic.amd64 end signature AMD64_LIVENESS = sig include AMD64_LIVENESS_STRUCTS structure LiveSet: sig include SET val toMemLocSet: t -> amd64.MemLocSet.t end sharing type LiveSet.Element.t = amd64.MemLoc.t val track : amd64.MemLoc.t -> bool structure LiveInfo: sig type t val newLiveInfo : unit -> t val setLiveOperands : t * amd64.Label.t * amd64.Operand.t list -> unit val setLive : t * amd64.Label.t * LiveSet.t -> unit val getLive : t * amd64.Label.t -> LiveSet.t val completeLiveInfo : {chunk: amd64.Chunk.t, liveInfo: t, pass: string} -> unit val completeLiveInfo_msg : unit -> unit val verifyLiveInfo : {chunk: amd64.Chunk.t, liveInfo: t} -> bool val verifyLiveInfo_msg : unit -> unit end structure Liveness: sig datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} val dead: t -> LiveSet.t val liveIn: t -> LiveSet.t val livenessAssembly : {assembly : amd64.Assembly.t, live : LiveSet.t} -> t val livenessEntry : {entry : amd64.Entry.t, live : LiveSet.t} -> t val livenessTransfer : {transfer: amd64.Transfer.t, liveInfo: LiveInfo.t} -> t end structure LivenessBlock: sig datatype t = T of {entry: (amd64.Entry.t * Liveness.t), profileLabel: amd64.ProfileLabel.t option, statements: (amd64.Assembly.t * Liveness.t) list, transfer: (amd64.Transfer.t * Liveness.t)} val printBlock : t -> unit val toLivenessEntry : {entry: amd64.Entry.t, live: LiveSet.t} -> {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} val reLivenessEntry : {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} -> {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} val toLivenessStatements : {statements: amd64.Assembly.t list, live: LiveSet.t} -> {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} val reLivenessStatements : {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} -> {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} val toLivenessTransfer : {transfer: amd64.Transfer.t, liveInfo: LiveInfo.t} -> {transfer: (amd64.Transfer.t * Liveness.t), live: LiveSet.t} val reLivenessTransfer : {transfer: (amd64.Transfer.t * Liveness.t)} -> {transfer: (amd64.Transfer.t * Liveness.t), live: LiveSet.t} val toLivenessBlock : {block: amd64.Block.t, liveInfo: LiveInfo.t} -> t val toLivenessBlock_msg : unit -> unit val verifyLivenessBlock : {block: t, liveInfo: LiveInfo.t} -> bool val verifyLivenessBlock_msg : unit -> unit val toBlock : {block: t} -> amd64.Block.t val toBlock_msg : unit -> unit end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-loop-info.fun000066400000000000000000000134261416264345000244330ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64LoopInfo(S: AMD64_LOOP_INFO_STRUCTS) : AMD64_LOOP_INFO = struct open S open amd64 structure Graph = DirectedGraph structure Node = Graph.Node structure LoopForest = Graph.LoopForest val tracer = amd64.tracer datatype t = T of {getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}} fun createLoopInfo {chunk = Chunk.T {blocks, ...}, farLoops} = let val G = Graph.new () val {get = getNodeInfo : unit Node.t -> Label.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("amd64LoopInfo:getNodeInfo", Node.layout)) val {get = getInfo : Label.t -> unit Node.t, destroy = destInfo} = Property.destGet (Label.plist, Property.initFun (fn l => let val n = Graph.newNode G val _ = setNodeInfo(n, l) in n end)) val {get = getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}, set = setLoopInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("amd64LoopInfo:getLoopInfo", Label.layout)) val rootLabel = Label.newString "root" val root = getInfo rootLabel fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (blocks, fn Block.T {entry, transfer, ...} => let val label = Entry.label entry val node = getInfo label fun doit' target = let val node' = getInfo target in addEdge {from = node, to = node'} end fun doit'' target = let val node' = getInfo target in if farLoops then addEdge {from = node, to = node'} else addEdge {from = root, to = node'} end datatype z = datatype Transfer.t in if Entry.isFunc entry then addEdge {from = root, to = node} else () ; case transfer of Goto {target, ...} => doit' target | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, func, ...} => Option.app (return, if CFunction.mayGC func then doit'' o #return else doit' o #return) end) val _ = destInfo () val lf = Graph.loopForestSteensgaard (G, {root = root, nodeValue = getNodeInfo}) fun doit (f: Label.t LoopForest.t, headers, path) = let val {loops, notInLoop} = LoopForest.dest f val notInLoop = Vector.toList notInLoop val path' = List.rev path in List.foreach (notInLoop, fn l => setLoopInfo (l, {loopHeader = Vector.contains (headers, l, Label.equals), loopLabels = notInLoop, loopPath = path'})) ; Vector.foreachi (loops, fn (i,{headers, child}) => doit (child, headers, i::path)) end val _ = doit (lf, Vector.new0 (), []) in T {getLoopInfo = getLoopInfo} end val (createLoopInfo, createLoopInfo_msg) = tracer "createLoopInfo" createLoopInfo fun getLoopDistance (T {getLoopInfo, ...}, from, to) = (case (#loopPath (getLoopInfo from), #loopPath (getLoopInfo to)) of ([], _) => NONE | (_, []) => NONE | (pfrom, pto) => let val rec check = fn ([], pto) => SOME (List.length pto) | (pfrom, []) => SOME (~(List.length pfrom)) | (f::pfrom,t::pto) => if f = t then check (pfrom, pto) else NONE in check (pfrom, pto) end) fun getLoopLabels (T {getLoopInfo, ...}, label) = #loopLabels (getLoopInfo label) fun isLoopHeader (T {getLoopInfo, ...}, l) = #loopHeader (getLoopInfo l) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-loop-info.sig000066400000000000000000000013621416264345000244210ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LOOP_INFO_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_LOOP_INFO = sig include AMD64_LOOP_INFO_STRUCTS type t val createLoopInfo : {chunk: amd64.Chunk.t, farLoops: bool} -> t val createLoopInfo_msg : unit -> unit val getLoopDistance : t * amd64.Label.t * amd64.Label.t -> int option val getLoopLabels : t * amd64.Label.t -> amd64.Label.t list val isLoopHeader : t * amd64.Label.t -> bool end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-mlton-basic.fun000066400000000000000000000275531416264345000247470ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64MLtonBasic (S: AMD64_MLTON_BASIC_STRUCTS): AMD64_MLTON_BASIC = struct open S open amd64 local open Machine in structure CType = CType structure Runtime = Runtime end (* * amd64.Size.t equivalents *) val wordBytes = Bytes.toInt Bytes.inWord64 val wordSize = Size.fromBytes wordBytes val wordScale = Scale.fromBytes wordBytes val pointerBytes = Bytes.toInt Bytes.inWord64 val pointerSize = Size.fromBytes pointerBytes (* * Memory classes *) structure Classes = struct local fun new s = MemLoc.Class.new {name = s} in val Heap = new "Heap" val Stack = new "Stack" val Locals = new "Locals" val Globals = new "Globals" val Temp = MemLoc.Class.Temp val StaticTemp = MemLoc.Class.StaticTemp val CArg = MemLoc.Class.CArg val CStack = MemLoc.Class.CStack val Code = MemLoc.Class.Code val CStatic = new "CStatic" val StaticNonTemp = new "StaticNonTemp" val GCState = new "GCState" val GCStateHold = new "GCStateHold" val GCStateVolatile = new "GCStateVolatile" end val allClasses = ref amd64.ClassSet.empty val livenessClasses = ref amd64.ClassSet.empty val holdClasses = ref amd64.ClassSet.empty val volatileClasses = ref amd64.ClassSet.empty val runtimeClasses = ref amd64.ClassSet.empty val heapClasses = ref amd64.ClassSet.empty val cargClasses = ref amd64.ClassSet.empty val cstaticClasses = ref amd64.ClassSet.empty fun initClasses () = let val _ = allClasses := amd64.ClassSet.fromList ( Heap:: Stack:: Locals:: Globals:: Temp:: StaticTemp:: CArg:: CStack:: Code:: CStatic:: StaticNonTemp:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = livenessClasses := (if !Control.Native.liveStack then amd64.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: Stack:: nil) else amd64.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: nil)) val _ = holdClasses := amd64.ClassSet.fromList ( GCStateHold:: (* GCStateVolatile:: *) nil) val _ = volatileClasses := amd64.ClassSet.fromList ( GCStateVolatile:: nil) val _ = runtimeClasses := amd64.ClassSet.fromList ( Heap:: Stack:: Globals:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = heapClasses := amd64.ClassSet.fromList ( Heap:: nil) val _ = cstaticClasses := amd64.ClassSet.fromList ( CStatic:: nil) val _ = cargClasses := amd64.ClassSet.fromList ( CArg:: nil) in () end end val makeContents = amd64.MemLoc.makeContents val c_stackP = Label.fromString "c_stackP" val c_stackPContents = makeContents {base = Immediate.label c_stackP, size = pointerSize, class = Classes.StaticNonTemp} val c_stackPContentsOperand = Operand.memloc c_stackPContents val c_stackPDerefWord = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.QUAD, class = Classes.CStack} val c_stackPDerefWordOperand = Operand.memloc c_stackPDerefWord val c_stackPDerefDouble = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.DBLE, class = Classes.CStack} val c_stackPDerefDoubleOperand = Operand.memloc c_stackPDerefDouble val c_stackPDerefFloat = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.SNGL, class = Classes.CStack} val c_stackPDerefFloatOperand = Operand.memloc c_stackPDerefFloat val applyFFTempFun = Label.fromString "applyFFTempFun" val applyFFTempFunContents = makeContents {base = Immediate.label applyFFTempFun, size = wordSize, class = Classes.CStatic} val applyFFTempFunContentsOperand = Operand.memloc applyFFTempFunContents val applyFFTempRegArg = Label.fromString "applyFFTempRegArg" fun applyFFTempRegArgContents i = MemLoc.imm {base = Immediate.label applyFFTempRegArg, index = Immediate.int i, scale = Scale.Eight, size = wordSize, class = Classes.CArg} val applyFFTempXmmRegArgS = Label.fromString "applyFFTempXmmRegArgS" fun applyFFTempXmmRegArgSContents i = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgS, index = Immediate.int i, scale = Scale.Four, size = Size.SNGL, class = Classes.CArg} val applyFFTempXmmRegArgD = Label.fromString "applyFFTempXmmRegArgD" fun applyFFTempXmmRegArgDContents i = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgD, index = Immediate.int i, scale = Scale.Eight, size = Size.DBLE, class = Classes.CArg} fun applyFFTempXmmRegArgContents (floatSize, i) = case floatSize of Size.DBLE => applyFFTempXmmRegArgDContents i | Size.SNGL => applyFFTempXmmRegArgSContents i | _ => Error.bug "amd64MLtonBasic.applyFFTempXmmRegArgContents" val fpcvtTemp = Label.fromString "fpcvtTemp" val fpcvtTempContents = makeContents {base = Immediate.label fpcvtTemp, size = wordSize, class = Classes.StaticTemp} val fpcvtTempContentsOperand = Operand.memloc fpcvtTempContents val fpeqTemp = Label.fromString "fpeqTemp" fun fpeqTempContents size = makeContents {base = Immediate.label fpeqTemp, size = size, class = Classes.StaticTemp} fun fpeqTempContentsOperand size = Operand.memloc (fpeqTempContents size) val overflowCheckTemp = Label.fromString "overflowCheckTemp" fun overflowCheckTempContents size = makeContents {base = Immediate.label overflowCheckTemp, size = size, class = Classes.StaticTemp} fun overflowCheckTempContentsOperand size = Operand.memloc (overflowCheckTempContents size) local fun make prefix = let fun make name size = Label.fromString (concat [prefix, name, size]) val r = make "Real" val w = make "Word" datatype z = datatype CType.t in CType.memo (fn t => case t of CPointer => Label.fromString (concat [prefix, "CPointer"]) | Int8 => w "8" | Int16 => w "16" | Int32 => w "32" | Int64 => w "64" | Objptr => Label.fromString (concat [prefix, "Objptr"]) | Real32 => r "32" | Real64 => r "64" | Word8 => w "8" | Word16 => w "16" | Word32 => w "32" | Word64 => w "64") end in val local_base = make "local" val global_base = make "global" end val gcState_label = Label.fromString "gcState" local val static_labels = HashTable.new {hash=Hash.permute o Word.fromInt, equals=Int.equals} fun make i = Label.fromString ("static_" ^ Int.toString i) in fun static_label i = HashTable.lookupOrInsert (static_labels, i, fn () => make i) end structure Field = Runtime.GCField fun make' (offset: int, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, offset) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end fun make (f: Field.t, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, Bytes.toInt (Field.offset f)) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end val (_, gcState_exnStackContents, gcState_exnStackContentsOperand) = make (Field.ExnStack, wordSize, Classes.GCState) val (_, gcState_frontierContents, gcState_frontierContentsOperand) = make (Field.Frontier, pointerSize, Classes.GCStateHold) val (_, gcState_stackBottomContents, gcState_stackBottomContentsOperand) = make (Field.StackBottom, pointerSize, Classes.GCState) val (_, gcState_stackTopContents, gcState_stackTopContentsOperand) = make (Field.StackTop, pointerSize, Classes.GCStateHold) local val stackTopTemp = Immediate.label (Label.fromString "stackTopTemp") val stackTopTempContents = makeContents {base = stackTopTemp, size = wordSize, class = Classes.StaticTemp} val stackTopTempContentsOperand = Operand.memloc (stackTopTempContents) in val stackTopTempContents = fn () => stackTopTempContents val stackTopTempContentsOperand = fn () => stackTopTempContentsOperand end fun gcState_stackTopMinusWordDeref () = MemLoc.simple {base = gcState_stackTopContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun gcState_stackTopMinusWordDerefOperand () = Operand.memloc (gcState_stackTopMinusWordDeref ()) fun stackTopTempMinusWordDeref () = MemLoc.simple {base = stackTopTempContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun stackTopTempMinusWordDerefOperand () = Operand.memloc (stackTopTempMinusWordDeref ()) fun gcState_offset {offset, ty} = let val (_,_,operand) = make' (offset, Vector.sub(amd64.Size.fromCType ty, 0), Classes.GCState) in operand () end (* init *) fun init () = let val _ = Classes.initClasses () in () end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-mlton-basic.sig000066400000000000000000000103371416264345000247310ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_MLTON_BASIC_STRUCTS = sig structure Machine: MACHINE structure amd64: AMD64_PSEUDO sharing amd64.CFunction = Machine.CFunction sharing amd64.CType = Machine.CType sharing amd64.Label = Machine.Label sharing amd64.ProfileLabel = Machine.ProfileLabel sharing amd64.RepType = Machine.Type sharing amd64.Runtime = Machine.Runtime sharing amd64.WordSize = Machine.WordSize sharing amd64.WordX = Machine.WordX end signature AMD64_MLTON_BASIC = sig include AMD64_MLTON_BASIC_STRUCTS structure CFunction: C_FUNCTION structure CType: C_TYPE structure RepType: REP_TYPE sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing RepType = Machine.Type val init : unit -> unit (* * amd64.Size.t equivalents *) val wordBytes : int val wordSize : amd64.Size.t val wordScale : amd64.Scale.t val pointerBytes : int val pointerSize : amd64.Size.t (* * Memory classes *) structure Classes : sig val Heap : amd64.MemLoc.Class.t val Stack : amd64.MemLoc.Class.t val Locals : amd64.MemLoc.Class.t val Globals : amd64.MemLoc.Class.t val Temp : amd64.MemLoc.Class.t val StaticTemp : amd64.MemLoc.Class.t val CArg : amd64.MemLoc.Class.t val CStack : amd64.MemLoc.Class.t val Code : amd64.MemLoc.Class.t val CStatic : amd64.MemLoc.Class.t val StaticNonTemp : amd64.MemLoc.Class.t val GCState : amd64.MemLoc.Class.t val GCStateHold : amd64.MemLoc.Class.t val GCStateVolatile : amd64.MemLoc.Class.t val allClasses : amd64.ClassSet.t ref val livenessClasses : amd64.ClassSet.t ref val holdClasses : amd64.ClassSet.t ref val volatileClasses : amd64.ClassSet.t ref val runtimeClasses : amd64.ClassSet.t ref val heapClasses : amd64.ClassSet.t ref val cstaticClasses : amd64.ClassSet.t ref val cargClasses : amd64.ClassSet.t ref end (* CStack locations *) val c_stackP : amd64.Label.t val c_stackPContents : amd64.MemLoc.t val c_stackPContentsOperand : amd64.Operand.t val c_stackPDerefWordOperand : amd64.Operand.t val c_stackPDerefDoubleOperand : amd64.Operand.t val c_stackPDerefFloatOperand : amd64.Operand.t (* Static temps defined in amd64-main.h *) val applyFFTempFunContentsOperand : amd64.Operand.t val applyFFTempRegArgContents : int -> amd64.MemLoc.t val applyFFTempXmmRegArgContents : amd64.Size.t * int -> amd64.MemLoc.t val fpcvtTempContentsOperand : amd64.Operand.t val fpeqTempContentsOperand : amd64.Size.t -> amd64.Operand.t val overflowCheckTempContentsOperand : amd64.Size.t -> amd64.Operand.t (* Static arrays defined in main.h and amd64-main.h *) val local_base : amd64.CType.t -> amd64.Label.t val global_base : amd64.CType.t -> amd64.Label.t (* Machine statics *) val static_label: int -> amd64.Label.t (* gcState relative locations defined in gc.h *) val gcState_label: amd64.Label.t val gcState_offset: {offset: int, ty: amd64.CType.t} -> amd64.Operand.t val gcState_exnStackContents: unit -> amd64.MemLoc.t val gcState_exnStackContentsOperand: unit -> amd64.Operand.t val gcState_frontierContents: unit -> amd64.MemLoc.t val gcState_frontierContentsOperand: unit -> amd64.Operand.t val gcState_stackBottomContents: unit -> amd64.MemLoc.t val gcState_stackBottomContentsOperand: unit -> amd64.Operand.t val gcState_stackTopContents: unit -> amd64.MemLoc.t val gcState_stackTopContentsOperand: unit -> amd64.Operand.t val gcState_stackTopMinusWordDeref: unit -> amd64.MemLoc.t val gcState_stackTopMinusWordDerefOperand: unit -> amd64.Operand.t val stackTopTempContentsOperand: unit -> amd64.Operand.t val stackTopTempMinusWordDeref: unit -> amd64.MemLoc.t val stackTopTempMinusWordDerefOperand: unit -> amd64.Operand.t end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-mlton.fun000066400000000000000000001354701416264345000236660ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64MLton (S: AMD64_MLTON_STRUCTS): AMD64_MLTON = struct open S open amd64MLtonBasic open amd64 local open Machine in structure CFunction = CFunction structure RealSize = RealSize structure Prim = Prim structure WordSize = WordSize datatype z = datatype RealSize.t datatype z = datatype WordSize.prim end type transInfo = {addData : amd64.Assembly.t list -> unit, live: amd64.Label.t -> amd64.Operand.t list, liveInfo: amd64Liveness.LiveInfo.t} fun implementsPrim (p: 'a Prim.t) = let datatype z = datatype WordSize.prim fun w32168 s = case WordSize.prim s of W8 => true | W16 => true | W32 => true | W64 => false datatype z = datatype Prim.t in case p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | Real_Math_acos _ => false | Real_Math_asin _ => false | Real_Math_atan _ => false | Real_Math_atan2 _ => false | Real_Math_cos _ => false | Real_Math_exp _ => false | Real_Math_ln _ => false | Real_Math_log10 _ => false | Real_Math_sin _ => false | Real_Math_sqrt _ => true | Real_Math_tan _ => false | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => true | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => false | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_neg _ => true | Real_qequal _ => true | Real_rndToReal _ => true | Real_rndToWord (_, s2, {signed}) => signed orelse w32168 s2 | Real_round _ => false | Real_sub _ => true | Thread_returnToC => false | Word_add _ => true | Word_addCheckP _ => true | Word_andb _ => true | Word_castToReal _ => true | Word_equal _ => true | Word_extdToWord _ => true | Word_lshift _ => true | Word_lt _ => true | Word_mul _ => true | Word_mulCheckP _ => true | Word_neg _ => true | Word_negCheckP _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot _ => true | Word_rem _ => true | Word_rndToReal (s1, _, {signed}) => signed orelse w32168 s1 | Word_rol _ => true | Word_ror _ => true | Word_rshift _ => true | Word_sub _ => true | Word_subCheckP _ => true | Word_xorb _ => true | _ => false end val implementsPrim: Machine.Type.t Prim.t -> bool = Trace.trace ("amd64MLton.implementsPrim", Prim.layout, Bool.layout) implementsPrim fun prim {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, transInfo = {...} : transInfo} = let val primName = Prim.toString prim fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "amd64MLton.prim: getDst1" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "amd64MLton.prim: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "amd64MLton.prim: getSrc2" fun mov () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: mov, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}], transfer = NONE}] end fun movx oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: movx, dstsize/srcsize", fn () => Size.lt(srcsize,dstsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = oper, dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun xvom () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: xvom, dstsize/srcsize", fn () => Size.lt(dstsize,srcsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_xvom {dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun binal oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun binalcc (oper, condition) = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("amd64MLton.prim: binalcc, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun pmd oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun pmdcc (oper, condition) = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("amd64MLton.prim: pmdcc, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun imul2 () = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun imul2cc condition = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("amd64MLton.prim: imul2cc, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {dst = dst, condition = condition, size = dstsize}], transfer = NONE}] end fun unal oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun unalcc (oper, condition) = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = tmp, size = srcsize}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun sral oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: sral, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("amd64MLton.prim: sral, src2size", fn () => src2size = Size.LONG) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_sral {oper = oper, dst = dst, count = src2, size = dstsize}], transfer = NONE}] end fun cmp condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in (* Can't have an immediate in src1 position, * so reverse the srcs and reverse the condition. * * This won't fix an immediate in both positions. * Either constant folding eliminated it * or the register allocator will raise an error. *) case Operand.deImmediate src1 of SOME _ => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.condition_reverse condition, dst = dst, size = dstsize}], transfer = NONE}] | NONE => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun compare ({signed}, s, u) = let val f = if signed then s else u in cmp f end fun sse_movs () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_movs, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movs {dst = dst, src = src, size = srcsize}], transfer = NONE}] end (* fun sse_ucomis condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end *) fun sse_cvtsfp2sfp () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_cvtsfp2sfp, dstsize/srcsize", fn () => srcsize <> dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2sfp {dst = dst, dstsize = dstsize, src = src, srcsize = srcsize}], transfer = NONE}] end fun sse_movd () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_movd, dstsize/srcsize", fn () => srcsize <> dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = src, srcsize = srcsize}], transfer = NONE}] end fun sse_binas oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.SSE_ADDS) orelse (oper = Instruction.SSE_MULS) orelse (oper = Instruction.SSE_MAXS) orelse (oper = Instruction.SSE_MINS) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movs {dst = dst, src = src1, size = src1size}, Assembly.instruction_sse_binas {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun sse_unas oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_unas {oper = oper, src = src, dst = dst, size = dstsize}], transfer = NONE}] end val (comment_begin, comment_end) = if !Control.codegenComments > 0 then let val comment = primName in (AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("begin prim: " ^ comment)], transfer = NONE}), AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("end prim: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun flag {signed} = if signed then amd64.Instruction.O else amd64.Instruction.C datatype z = datatype Prim.t in AppendList.appends [comment_begin, (case prim of CPointer_add => binal Instruction.ADD | CPointer_diff => binal Instruction.SUB | CPointer_equal => cmp Instruction.E | CPointer_fromWord => mov () | CPointer_lt => cmp Instruction.B | CPointer_sub => binal Instruction.SUB | CPointer_toWord => mov () | Real_Math_sqrt _ => sse_unas Instruction.SSE_SQRTS | Real_abs s => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: Real_abs, dstsize/srcsize", fn () => srcsize = dstsize) fun mkConst wordSize = WordX.rshift (WordX.allOnes wordSize, WordX.one wordSize, {signed = false}) val (const,constsize) = case s of R32 => (mkConst WordSize.word32, Size.LONG) | R64 => (mkConst WordSize.word64, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = Operand.immediate_word const, srcsize = constsize}, Assembly.instruction_sse_binlp {oper = Instruction.SSE_ANDP, src = src, dst = dst, size = dstsize}], transfer = NONE}] end | Real_add _ => sse_binas Instruction.SSE_ADDS | Real_castToWord _ => sse_movd () | Real_div _ => sse_binas Instruction.SSE_DIVS | Real_equal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_lt _ => (* sse_ucomis Instruction.A *) let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.C, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_le _ => (* sse_ucomis Instruction.AE *) let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.NA, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_mul _ => sse_binas Instruction.SSE_MULS | Real_neg s => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: Real_neg, dstsize/srcsize", fn () => srcsize = dstsize) fun mkConst wordSize = (WordX.notb o WordX.rshift) (WordX.allOnes wordSize, WordX.one wordSize, {signed = false}) val (const,constsize) = case s of R32 => (mkConst WordSize.word32, Size.LONG) | R64 => (mkConst WordSize.word64, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = Operand.immediate_word const, srcsize = constsize}, Assembly.instruction_sse_binlp {oper = Instruction.SSE_XORP, src = src, dst = dst, size = dstsize}], transfer = NONE}] end | Real_qequal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_qequal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = Instruction.P, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.E, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.OR, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_rndToReal (s, s') => let val b = RealSize.bits s val b' = RealSize.bits s' in if Bits.equals (b, b') then sse_movs () else sse_cvtsfp2sfp () end | Real_rndToWord (_, s', {signed}) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2si {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fpcvtTempContentsOperand, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2si {src = src, dst = tmp, srcsize = srcsize, dstsize = tmpsize}, Assembly.instruction_xvom {src = tmp, dst = dst, dstsize = dstsize, srcsize = tmpsize}], transfer = NONE}] end in case (WordSize.prim s', signed) of (W8, _) => default' () | (W16, _) => default' () | (W32, false) => default' () | (W32, true) => default () | (W64, true) => default () | _ => Error.bug "amd64MLton.prim: Real_rndToWord, W64, false" end | Real_sub _ => sse_binas Instruction.SSE_SUBS | Word_add _ => binal Instruction.ADD | Word_addCheckP (_, sg) => binalcc (Instruction.ADD, flag sg) | Word_andb _ => binal Instruction.AND | Word_castToReal _ => sse_movd () | Word_equal _ => cmp Instruction.E | Word_lshift _ => sral Instruction.SHL | Word_lt (_, sg) => compare (sg, Instruction.L, Instruction.B) | Word_mul (s, {signed}) => (case WordSize.prim s of W8 => pmd (if signed then Instruction.IMUL else Instruction.MUL) | W16 => imul2 () | W32 => imul2 () | W64 => imul2 ()) | Word_mulCheckP (s, {signed}) => if signed then (case WordSize.prim s of W8 => pmdcc (Instruction.IMUL, amd64.Instruction.O) | W16 => imul2cc amd64.Instruction.O | W32 => imul2cc amd64.Instruction.O | W64 => imul2cc amd64.Instruction.O) else pmdcc (Instruction.MUL, amd64.Instruction.C) | Word_neg _ => unal Instruction.NEG | Word_negCheckP (_, sg) => unalcc (Instruction.NEG, flag sg) | Word_notb _ => unal Instruction.NOT | Word_orb _ => binal Instruction.OR | Word_quot (_, {signed}) => pmd (if signed then Instruction.IDIV else Instruction.DIV) | Word_rem (_, {signed}) => pmd (if signed then Instruction.IMOD else Instruction.MOD) | Word_rndToReal (s, _, {signed}) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsi2sfp {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fpcvtTempContentsOperand, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = if signed then Instruction.MOVSX else Instruction.MOVZX, src = src, dst = tmp, dstsize = tmpsize, srcsize = srcsize}, Assembly.instruction_sse_cvtsi2sfp {src = tmp, dst = dst, srcsize = tmpsize, dstsize = dstsize}], transfer = NONE}] end in case (WordSize.prim s, signed) of (W8, _) => default' () | (W16, _) => default' () | (W32, false) => default' () | (W32, true) => default () | (W64, true) => default () | _ => Error.bug "amd64MLton.prim: Word_rndToReal, W64, false" end | Word_rol _ => sral Instruction.ROL | Word_ror _ => sral Instruction.ROR | Word_rshift (_, {signed}) => sral (if signed then Instruction.SAR else Instruction.SHR) | Word_sub _ => binal Instruction.SUB | Word_subCheckP (_, sg) => binalcc (Instruction.SUB, flag sg) | Word_extdToWord (s, s', {signed}) => let val b = WordSize.bits s val b' = WordSize.bits s' in if Bits.< (b, b') then movx (if signed then Instruction.MOVSX else Instruction.MOVZX) else if Bits.equals (b, b') then mov () else xvom () end | Word_xorb _ => binal Instruction.XOR | _ => Error.bug ("amd64MLton.prim: strange Prim.Name.t: " ^ primName)), comment_end] end fun ccall {args: (amd64.Operand.t * amd64.Size.t) vector, func, return: {return: amd64.Label.t, size: int option} option, transInfo = {...}: transInfo} = let val CFunction.T {convention, target, ...} = func val comment_begin = if !Control.codegenComments > 0 then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin ccall: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [comment_begin, AppendList.single (Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (Transfer.ccall {args = Vector.toList args, func = func, return = return})})] end fun creturn {dsts: (amd64.Operand.t * amd64.Size.t) vector, frameInfo: amd64.FrameInfo.t option, func: RepType.t CFunction.t, label: amd64.Label.t, transInfo = {live, liveInfo, ...}: transInfo} = let val CFunction.T {convention, target, ...} = func fun default () = let val _ = amd64Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (Entry.creturn {dsts = dsts, frameInfo = frameInfo, func = func, label = label}), statements = [], transfer = NONE}) end val comment_end = if !Control.codegenComments > 0 then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin creturn: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [default (), comment_end] end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-mlton.sig000066400000000000000000000034531416264345000236530ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_MLTON_STRUCTS = sig structure amd64MLtonBasic : AMD64_MLTON_BASIC structure amd64Liveness : AMD64_LIVENESS sharing amd64MLtonBasic.amd64 = amd64Liveness.amd64 end signature AMD64_MLTON = sig include AMD64_MLTON_STRUCTS include AMD64_MLTON_BASIC sharing amd64 = amd64MLtonBasic.amd64 sharing amd64 = amd64Liveness.amd64 sharing amd64.Label = Machine.Label sharing Machine = amd64MLtonBasic.Machine type transInfo = {addData : amd64.Assembly.t list -> unit, live: amd64.Label.t -> amd64.Operand.t list, liveInfo: amd64Liveness.LiveInfo.t} (* c call, and primitive assembly sequences. *) val ccall: {args: (amd64.Operand.t * amd64.Size.t) vector, func: RepType.t Machine.CFunction.t, return: {return: amd64.Label.t, size: int option} option, transInfo: transInfo} -> amd64.Block.t' AppendList.t val creturn: {dsts: (amd64.Operand.t * amd64.Size.t) vector, frameInfo: amd64.FrameInfo.t option, func: RepType.t Machine.CFunction.t, label: amd64.Label.t, transInfo: transInfo} -> amd64.Block.t' AppendList.t val implementsPrim: RepType.t Machine.Prim.t -> bool val prim: {prim: RepType.t Machine.Prim.t, args: (amd64.Operand.t * amd64.Size.t) vector, dsts: (amd64.Operand.t * amd64.Size.t) vector, transInfo: transInfo} -> amd64.Block.t' AppendList.t end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-pseudo.sig000066400000000000000000000410551416264345000240210ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_PSEUDO = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool val toString : t -> string end structure Immediate : sig type t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t end structure Scale : sig datatype t = One | Two | Four | Eight val fromBytes : int -> t val fromCType : CType.t -> t end structure MemLoc : sig structure Class : sig type t val new : {name: string} -> t val Temp : t val StaticTemp : t val CArg : t val CStack : t val Code : t val eq : t * t -> bool end type t val layout : t -> Layout.t val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val class : t -> Class.t val compare : t * t -> order (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig type t val layout : t -> Layout.t val toString : t -> string val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val memloc : MemLoc.t -> t val memloc_label: Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) type t end structure PseudoOp : sig type t val toString : t -> string val data : unit -> t val text : unit -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val quad : Immediate.t list -> t end structure Assembly : sig type t val toString : t -> string val comment : string -> t val isComment : t -> bool val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_global: Label.t -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_quad : Immediate.t list -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binas : {oper: Instruction.sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_unas : {oper: Instruction.sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binlp : {oper: Instruction.sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_movs : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_comis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_ucomis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_cvtsfp2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsfp2si : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsi2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_movd : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameInfosIndex: int} end structure Entry: sig type t val cont: {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func: {label: Label.t, live: MemLocSet.t} -> t val handler: {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val jump: {label: Label.t} -> t val label: t -> Label.t end structure Transfer : sig structure Cases : sig type 'a t val word : (WordX.t * 'a) list -> 'a t end type t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall : {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} -> t end structure ProfileLabel : sig type t end structure Block : sig type t' val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit type t val printBlock : t -> unit val compress: t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end functor amd64PseudoCheck(structure S : AMD64) : AMD64_PSEUDO = S mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-simplify.fun000066400000000000000000006165541416264345000244000ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64Simplify(S: AMD64_SIMPLIFY_STRUCTS): AMD64_SIMPLIFY = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop structure PeepholeBlock = struct structure Peephole = Peephole(type entry_type = Entry.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t type transfer_type = Transfer.t datatype block = datatype Block.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn Assembly.Comment _ => true | _ => false local val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionBinALMD : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.pMD _) => true | Assembly.Instruction (Instruction.IMUL2 _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionBinALMD], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: elimBinALMDDouble" val (callback,elimBinALMDDouble_msg) = make_callback_msg "elimBinALMDDouble" in val elimBinALMDDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimBinALMDDouble_msg = elimBinALMDDouble_msg end local val isInstructionSSEMOVS : statement_type -> bool = fn Assembly.Instruction (Instruction.SSE_MOVS _) => true | _ => false val isInstructionSSEBinAS : statement_type -> bool = fn Assembly.Instruction (Instruction.SSE_BinAS _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS, All isComment, One isInstructionSSEBinAS], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.SSE_BinAS {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_sse_movs {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_sse_binas {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: elimSSEBinASDouble" val (callback,elimSSEBinASDouble_msg) = make_callback_msg "elimSSEBinASDouble" in val elimSSEBinASDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSEBinASDouble_msg = elimSSEBinASDouble_msg end local val isInstructionMOV_srcImmediate : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV {src = Operand.Immediate _, ...}) => true | _ => false val isInstructionBinALMD_operCommute : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src, dst, ...}) => ((oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.pMD {oper, src, dst, ...}) => ((oper = Instruction.IMUL) orelse (oper = Instruction.MUL)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.IMUL2 {src, dst, ...}) => (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_srcImmediate, All isComment, One isInstructionBinALMD_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val getImmediate1 = fn Immediate.Word w => if WordX.isOne w then SOME false else if WordX.isNegOne w then SOME true else NONE | _ => NONE val isInstructionADDorSUB_srcImmediate1 : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.ADD => true | Instruction.SUB => true | _ => false) andalso isSome (getImmediate1 (Immediate.destruct immediate)) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionADDorSUB_srcImmediate1], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, dst, size})]], finish, transfer} => if (case List.fold (finish, (false, false), fn (asm, (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.MOV _) => (b, b') | Assembly.Instruction (Instruction.SETcc {condition = Instruction.C, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.NC, ...}) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case transfer of Transfer.Iff {condition = Instruction.C, ...} => true | Transfer.Iff {condition = Instruction.NC, ...} => true | _ => false) | _ => false) then NONE else let val oper = case (oper, getImmediate1 (Immediate.destruct immediate)) of (Instruction.ADD, SOME false) => Instruction.INC | (Instruction.ADD, SOME true ) => Instruction.DEC | (Instruction.SUB, SOME false) => Instruction.DEC | (Instruction.SUB, SOME true ) => Instruction.INC | _ => Error.bug "amd64Simplify.PeeholeBlock: elimAddSub1:oper" val statements = (Assembly.instruction_unal {oper = oper, dst = dst, size = size}):: finish val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimAddSub1" val (callback,elimAddSub1_msg) = make_callback_msg "elimAddSub1" in val elimAddSub1: optimization = {template = template, rewriter = rewriter, callback = callback} val elimAddSub1_msg = elimAddSub1_msg end local val rec log2' = fn (w : WordX.t, i : int) => if WordX.isZero w then NONE else if WordX.isOne (WordX.andb (w, WordX.one (WordX.size w))) then if WordX.isOne w then SOME (i, false) else if WordX.isNegOne w then SOME (i, true) else NONE else log2' (WordX.rshift (w, WordX.one (WordX.size w), {signed = true}), i + 1) fun log2 w = log2' (w, 0 : int) fun divTemp size = MemLoc.imm {base = Immediate.label (Label.fromString "divTemp"), index = Immediate.zero, scale = Scale.Four, size = size, class = MemLoc.Class.Temp} val isImmediatePow2 = fn Immediate.Word w => isSome (log2 w) | _ => false val getImmediateLog2 = fn Immediate.Word w => log2 w | _ => NONE val isInstructionMULorDIV_srcImmediatePow2 : statement_type -> bool = fn Assembly.Instruction (Instruction.pMD {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.IMUL => true | Instruction.MUL => true | Instruction.IDIV => true | Instruction.DIV => true | _ => false) andalso isImmediatePow2 (Immediate.destruct immediate) | Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, ...}) => isImmediatePow2 (Immediate.destruct immediate) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMULorDIV_srcImmediatePow2, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.MUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IDIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val divTemp = Operand.MemLoc (divTemp size) val width = 8 * Size.toBytes size val statements = ((fn l => (Assembly.instruction_mov {src = dst, dst = divTemp, size = size}):: l) o (fn l => if i > 1 then (Assembly.instruction_sral {oper = Instruction.SAR, dst = divTemp, count = Operand.immediate_int (i - 1), size = size}):: l else l) o (fn l => if i < width then (Assembly.instruction_sral {oper = Instruction.SHR, dst = divTemp, count = Operand.immediate_int (width - i), size = size}):: l else l) o (fn l => (Assembly.instruction_binal {oper = Instruction.ADD, src = divTemp, dst = dst, size = size}):: (Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int i, dst = dst, size = size}):: l) o (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.DIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SHR, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2" val (callback,elimMDPow2_msg) = make_callback_msg "elimMDPow2" in val elimMDPow2 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimMDPow2_msg = elimMDPow2_msg end local val isInstructionCMPorTEST : statement_type -> bool = fn Assembly.Instruction (Instruction.CMP _) => true | Assembly.Instruction (Instruction.TEST _) => true | _ => false val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionSETcc : statement_type -> bool = fn Assembly.Instruction (Instruction.SETcc _) => true | _ => false val isInstruction : statement_type -> bool = fn Assembly.Instruction _ => true | _ => false val isTransfer_Iff : transfer_type -> bool = fn Transfer.Iff _ => true | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMPorTEST, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction _], comments], finish, transfer} => let val rec scan = fn [] => not (isTransfer_Iff transfer) | asm::statements => if isComment asm orelse isInstructionMOV asm then scan statements else if isInstructionSETcc asm then false else if isInstruction asm then true else false in if scan finish then let val statements = List.fold(start, List.concat [comments, finish], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMPTEST" val (callback,elimCMPTEST_msg) = make_callback_msg "elimCMPTEST" in val elimCMPTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMPTEST_msg = elimCMPTEST_msg end local val isInstructionCMP_srcImmediate0 = fn Assembly.Instruction (Instruction.CMP {src1 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | Assembly.Instruction (Instruction.CMP {src2 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | _ => false val isTransfer_Iff_E_NE = fn Transfer.Iff {condition, ...} => condition = Instruction.E orelse condition = Instruction.NE | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMP_srcImmediate0, All isComment], finish = Empty, transfer = isTransfer_Iff_E_NE} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.CMP {src1, src2, size})], comments], finish = [], transfer = Transfer.Iff {condition, truee, falsee}} => let val condition = case condition of Instruction.E => Instruction.Z | Instruction.NE => Instruction.NZ | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0:condition" val src = case (Operand.deImmediate src1, Operand.deImmediate src2) of (SOME _, NONE) => src2 | (NONE, SOME _) => src1 | (SOME immediate1, SOME _) => if Immediate.isZero immediate1 then src2 else src1 | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0:src" val statements = List.fold(start, (Assembly.instruction_test {src1 = src, src2 = src, size = size}):: comments, op ::) val transfer = Transfer.Iff {condition = condition, truee = truee, falsee = falsee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0" val (callback,elimCMP0_msg) = make_callback_msg "elimCMP0" in val elimCMP0 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMP0_msg = elimCMP0_msg end local val isInstructionAL_setZF = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.UnAL {oper, ...}) => (case oper of Instruction.NOT => false | _ => true) | Assembly.Instruction (Instruction.SRAL {oper, ...}) => (case oper of Instruction.ROL => false | Instruction.RCL => false | Instruction.ROR => false | Instruction.RCR => false | _ => true) | _ => false val isInstructionTEST_eqSrcs = fn Assembly.Instruction (Instruction.TEST {src1, src2, ...}) => Operand.eq(src1, src2) | _ => false val isTransfer_Iff_Z_NZ = fn Transfer.Iff {condition, ...} => condition = Instruction.Z orelse condition = Instruction.NZ | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionAL_setZF, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isTransfer_Iff_Z_NZ} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction instruction], comments1, [Assembly.Instruction (Instruction.TEST {src1, ...})], comments2], finish = [], transfer as Transfer.Iff {...}} => let val dst = case instruction of Instruction.BinAL {dst, ...} => dst | Instruction.UnAL {dst, ...} => dst | Instruction.SRAL {dst, ...} => dst | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALTEST:dst" in if Operand.eq(dst,src1) then let val statements = List.fold (start, (Assembly.instruction instruction):: (List.concat [comments1, comments2]), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALTEST" val (callback,elimALTEST_msg) = make_callback_msg "elimALTEST" in val elimALTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALTEST_msg = elimALTEST_msg end local val optimizations_pre = commuteBinALMD:: (* elimBinAL0L:: *) (* elimBinAL0R:: *) elimAddSub1:: (* elimMDPow2:: *) elimCMPTEST:: nil val optimizations_pre_msg = commuteBinALMD_msg:: (* elimBinAL0L_msg:: *) (* elimBinAL0R_msg:: *) elimAddSub1_msg:: (* elimMDPow2_msg:: *) nil val optimizations_post = elimMDPow2:: elimBinALMDDouble:: elimSSEBinASDouble:: elimCMPTEST:: elimCMP0:: elimALTEST:: nil val optimizations_post_msg = elimMDPow2_msg:: elimBinALMDDouble_msg:: elimSSEBinASDouble_msg:: elimCMPTEST_msg:: elimCMP0_msg:: elimALTEST_msg:: nil in val peepholeBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeBlock_pre, peepholeBlock_pre_msg) = tracer "peepholeBlock_pre" peepholeBlock_pre val peepholeBlock_pre_msg = fn () => (peepholeBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeBlock_post = fn block => (peepholeBlock {optimizations = optimizations_post, block = block}) val (peepholeBlock_post, peepholeBlock_post_msg) = tracer "peepholeBlock_post" peepholeBlock_post val peepholeBlock_post_msg = fn () => (peepholeBlock_post_msg (); Control.indent (); List.foreach(optimizations_post_msg, fn msg => msg ()); Control.unindent ()) end val (callback_elimIff,elimIff_msg) = make_callback_msg "elimIff" fun makeElimIff {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferIff_eqTargets = fn Transfer.Iff {truee, falsee, ...} => Label.equals(truee, falsee) | _ => false val template = {start = EmptyOrNonEmpty, statements = [], finish = Empty, transfer = isTransferIff_eqTargets} val rewriter = fn {entry, profileLabel, start, statements = [], finish = [], transfer = Transfer.Iff {truee, falsee, ...}} => let val _ = amd64JumpInfo.decNear(jumpInfo, falsee) val statements = List.fold(start, [], op ::) val transfer = Transfer.goto {target = truee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimIff" in {template = template, rewriter = rewriter, callback = callback_elimIff} end val (callback_elimSwitchTest,elimSwitchTest_msg) = make_callback_msg "elimSwitchTest" fun makeElimSwitchTest {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferSwitch_testImmediateEval = fn Transfer.Switch {test = Operand.Immediate immediate, ...} => isSome (Immediate.eval immediate) | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_testImmediateEval} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test = Operand.Immediate immediate, cases, default}} => let val statements = statements' val test = valOf (Immediate.eval immediate) val cases = Transfer.Cases.keepAll (cases, fn (w,target) => (amd64JumpInfo.decNear(jumpInfo, target); WordX.equals (w, test))) val transfer = if Transfer.Cases.isEmpty cases then Transfer.goto {target = default} else if Transfer.Cases.isSingle cases then let val _ = amd64JumpInfo.decNear (jumpInfo, default) val target = Transfer.Cases.extract (cases, #2) val _ = amd64JumpInfo.incNear (jumpInfo, target) in Transfer.goto {target = target} end else Error.bug "amd64Simplify.PeeholeBlock: elimSwitchTest:transfer" in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSwitchTest" in {template = template, rewriter = rewriter, callback = callback_elimSwitchTest} end val (callback_elimSwitchCases,elimSwitchCases_msg) = make_callback_msg "elimSwitchCases" fun makeElimSwitchCases {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferSwitch_casesDefault = fn Transfer.Switch {cases, default, ...} => let val n = Transfer.Cases.count (cases, fn target => Label.equals(target, default)) in n > 0 end | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_casesDefault} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test, cases, default}} => let val statements = statements' val cases = Transfer.Cases.keepAll (cases, fn (_,target) => if Label.equals(target, default) then (amd64JumpInfo.decNear (jumpInfo, target); false) else true) val (statements, transfer) = if Transfer.Cases.isEmpty cases then (statements, Transfer.goto {target = default}) else if Transfer.Cases.isSingle cases then let val (k,target) = Transfer.Cases.extract (cases, fn (w,target) => (Immediate.word w, target)) val size = case Operand.size test of SOME size => size | NONE => Size.QUAD in (List.concat [statements, [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate k, size = size}]], Transfer.iff {condition = Instruction.E, truee = target, falsee = default}) end else (statements, Transfer.switch {test = test, cases = cases, default = default}) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSwitchCases" in {template = template, rewriter = rewriter, callback = callback_elimSwitchCases} end end structure ElimGoto = struct fun elimSimpleGoto {chunk = Chunk.T {data, blocks, ...}, delProfileLabel : amd64.ProfileLabel.t -> unit, jumpInfo : amd64JumpInfo.t} = let val {get: Label.t -> Label.t option, set: Label.t * Label.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val changed = ref false val labels = List.keepAllMap (blocks, fn Block.T {entry = Entry.Jump {label}, profileLabel, statements, transfer = Transfer.Goto {target}} => if List.forall(statements, fn Assembly.Comment _ => true | _ => false) (* andalso not (Label.equals(label, target)) *) then (Option.app(profileLabel, delProfileLabel); set(label, SOME target); SOME label) else NONE | _ => NONE) fun loop () = if List.fold(labels, false, fn (label,b) => case get label of NONE => b | SOME target => (case get target of NONE => b | SOME target' => if Label.equals(label, target') then (set(label, NONE); b) else (set(label, SOME target'); true))) then loop () else () val _ = loop () fun update target = case get target of SOME target' => (changed := true; amd64JumpInfo.decNear(jumpInfo, target); amd64JumpInfo.incNear(jumpInfo, target'); target') | NONE => target val elimSimpleGoto' = fn Transfer.Goto {target} => Transfer.Goto {target = update target} | Transfer.Iff {condition, truee, falsee} => Transfer.Iff {condition = condition, truee = update truee, falsee = update falsee} | Transfer.Switch {test, cases, default} => Transfer.Switch {test = test, cases = Transfer.Cases.map (cases, update o #2), default = update default} | transfer => transfer val blocks = List.map (blocks, fn Block.T {entry, profileLabel, statements, transfer} => Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = elimSimpleGoto' transfer}) val blocks = List.removeAll (blocks, fn Block.T {entry,...} => (case get (Entry.label entry) of SOME label' => (changed := true; amd64JumpInfo.decNear(jumpInfo, label'); true) | NONE => false)) val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimSimpleGoto,elimSimpleGoto_msg) = tracer "elimSimpleGoto" elimSimpleGoto fun elimComplexGoto {chunk = Chunk.T {data, blocks, ...}, jumpInfo : amd64JumpInfo.t} = let datatype z = datatype amd64JumpInfo.status val {get: Label.t -> Block.t option, set: Label.t * Block.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val labels = List.keepAllMap (blocks, fn block as Block.T {entry = Entry.Jump {label},...} => if amd64JumpInfo.getNear(jumpInfo, label) = Count 1 then (set(label, SOME block); SOME label) else NONE | _ => NONE) fun loop () = if List.fold (labels, false, fn (label,b) => case get label of SOME (Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}}) => (if Label.equals(label,target) then b else (case get target of NONE => b | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => (set(label, SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.Label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'})); true))) | _ => b) then loop () else () val _ = loop () val changed = ref false val elimComplexGoto' = fn block as Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}} => if Label.equals(Entry.label entry,target) then block else (case get target of NONE => block | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => let val _ = changed := true val _ = amd64JumpInfo.decNear (jumpInfo, Entry.label entry') val _ = List.foreach (Transfer.nearTargets transfer', fn target => amd64JumpInfo.incNear (jumpInfo, target)) val block = Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'} in block end) | block => block val blocks = List.map(blocks, elimComplexGoto') val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimComplexGoto, elimComplexGoto_msg) = tracer "elimComplexGoto" elimComplexGoto fun elimBlocks {chunk = Chunk.T {data, blocks, ...}, jumpInfo : amd64JumpInfo.t} = let val {get = getIsBlock, set = setIsBlock, destroy = destroyIsBlock} = Property.destGetSetOnce (Label.plist, Property.initConst false) val {get: Label.t -> {block: Block.t, reach: bool ref}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, ...}, (labels, funcs)) => let val label = Entry.label entry in setIsBlock(label, true); set(label, {block = block, reach = ref false}) ; case entry of Entry.Func _ => (label::labels, label::funcs) | _ => (label::labels, funcs) end) fun loop label = let val {block = Block.T {transfer, ...}, reach} = get label in if !reach then () else (reach := true ; List.foreach (Transfer.nearTargets transfer, loop)) end val _ = List.foreach (funcs, loop) fun check oper = case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => if getIsBlock label then ! (#reach (get label)) else true | NONE => true) | (_, SOME label) => if getIsBlock label then ! (#reach (get label)) else true | _ => true val changed = ref false val blocks = List.keepAllMap (labels, fn label => let val {block = Block.T {entry, profileLabel, statements, transfer}, reach} = get label in if !reach then SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.keepAll (statements, fn Assembly.Instruction i => (case #srcs (Instruction.srcs_dsts i) of NONE => true | SOME srcs => List.forall(srcs, check)) | _ => true), transfer = transfer}) else (changed := true ; List.foreach (Transfer.nearTargets transfer, fn label => amd64JumpInfo.decNear (jumpInfo, label)); NONE) end) val _ = destroy () val _ = destroyIsBlock () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimBlocks, elimBlocks_msg) = tracer "elimBlocks" elimBlocks fun elimGoto {chunk : Chunk.t, delProfileLabel: amd64.ProfileLabel.t -> unit, jumpInfo : amd64JumpInfo.t} = let val elimIff = PeepholeBlock.makeElimIff {jumpInfo = jumpInfo} val elimSwitchTest = PeepholeBlock.makeElimSwitchTest {jumpInfo = jumpInfo} val elimSwitchCases = PeepholeBlock.makeElimSwitchCases {jumpInfo = jumpInfo} fun loop {chunk, changed} = let val {chunk, changed = changed_elimSimpleGoto} = elimSimpleGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val Chunk.T {data, blocks, ...} = chunk val {blocks, changed = changed_peepholeBlocks} = PeepholeBlock.peepholeBlocks {blocks = blocks, optimizations = [elimIff, elimSwitchTest, elimSwitchCases]} val chunk = Chunk.T {data = data, blocks = blocks} in if changed_elimSimpleGoto orelse changed_peepholeBlocks then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed = changed_loop} = loop {chunk = chunk, changed = false} val {chunk, changed = changed_elimComplexGoto} = elimComplexGoto {chunk = chunk, jumpInfo = jumpInfo} val {chunk, changed = changed_elimBlocks} = elimBlocks {chunk = chunk, jumpInfo = jumpInfo} in {chunk = chunk, changed = changed_loop orelse changed_elimComplexGoto orelse changed_elimBlocks} end val (elimGoto, elimGoto_msg) = tracer "elimGoto" elimGoto val elimGoto_msg = fn () => (elimGoto_msg (); Control.indent (); PeepholeBlock.elimIff_msg (); PeepholeBlock.elimSwitchTest_msg (); PeepholeBlock.elimSwitchCases_msg (); elimSimpleGoto_msg (); elimComplexGoto_msg (); elimBlocks_msg (); Control.unindent ()) end structure MoveHoistLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock fun moveHoist {block = LivenessBlock.T {entry, profileLabel, statements, transfer}} = let val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val {statements, changed, moves, live} = List.foldr (statements, {statements = [], changed = false, moves = [], live = live}, fn ((asm: Assembly.t, Liveness.T {dead,...}), {statements: (Assembly.t * Liveness.t) list, changed : bool, moves, live: amd64Liveness.LiveSet.t}) => let fun default () = let val {uses,defs,...} = Assembly.uses_defs_kills asm val baseUses = List.fold (uses, [], fn (operand,baseUses) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseUses, memloc, MemLoc.eq) then baseUses else memloc::baseUses | NONE => baseUses) val baseDefs = List.fold (defs, [], fn (operand,baseDefs) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseDefs, memloc, MemLoc.eq) then baseDefs else memloc::baseDefs | NONE => baseDefs) val allUses = let fun doit(memlocs,allUses) = List.fold (memlocs, allUses, fn (memloc,allUses) => List.fold (MemLoc.utilized memloc, allUses, fn (memloc,allUses) => if List.contains (allUses, memloc, MemLoc.eq) then allUses else memloc::allUses)) in doit(baseDefs, doit(baseUses, baseUses)) end val allDefs = baseDefs val {forces, moves, ...} = List.fold (moves, {forces = [], moves = [], allUses = allUses, allDefs = allDefs}, fn (move as {src,dst,...}, {forces, moves, allUses, allDefs}) => let val utilized_src = MemLoc.utilized src val utilized_dst = MemLoc.utilized dst in if List.exists (allDefs, fn memloc' => List.exists (src::utilized_src, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allDefs, fn memloc' => List.exists (dst::utilized_dst, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allUses, fn memloc' => MemLoc.mayAlias (memloc',dst) orelse MemLoc.mayAlias (memloc',src)) then {forces = move::forces, moves = moves, allUses = src::(List.concat [utilized_src, utilized_dst, allUses]), allDefs = dst::allDefs} else {forces = forces, moves = move::moves, allUses = allUses, allDefs = allDefs} end) val moves = List.revMap (moves, fn {src,dst,size,age} => {src = src, dst = dst, size = size, age = age + 1}) val statements_forces = List.revMap (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | Size.FLT => Assembly.instruction_sse_movs {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_asm_forces, live} = LivenessBlock.toLivenessStatements {statements = asm::statements_forces, live = live} in {statements = List.concat [statements_asm_forces, statements], changed = changed orelse List.exists(forces, fn {age,...} => age <> 0), moves = moves, live = live} end in case asm of Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | _ => default () end) val forces = moves val statements_forces = List.map (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | Size.FLT => Assembly.instruction_sse_movs {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_forces, ...} = LivenessBlock.toLivenessStatements {statements = statements_forces, live = live} val statements = List.concat [statements_forces, statements] val changed = changed orelse List.exists(forces, fn {age,...} => age <> 0) val block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in {block = block, changed = changed} end val moveHoist = fn {block} => (moveHoist {block = block}) val (moveHoist: {block: LivenessBlock.t} -> {block: LivenessBlock.t, changed: bool}, moveHoist_msg) = tracer "moveHoist" moveHoist end structure CopyPropagateLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure LiveInfo = amd64Liveness.LiveInfo structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock fun copyPropagate' {src, dst as Operand.MemLoc memloc_dst, pblock = {statements, transfer}, liveInfo} = let val changed = ref 0 val (all,replacer) = case src of Operand.MemLoc memloc_src => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), doit(memloc_src::(MemLoc.utilized memloc_src), [])) end fun replacer' memloc = if MemLoc.eq(memloc,memloc_dst) then (changed := !changed + 1; memloc_src) else memloc val replacer = fn {use,def} => fn operand => case Operand.deMemloc operand of SOME memloc => if (use andalso not def) orelse (not (MemLoc.eq(memloc, memloc_dst))) then Operand.memloc (MemLoc.replace replacer' memloc) else operand | _ => operand in (all, replacer) end | _ => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), []) end val replacer = fn {use,def} => fn operand => if use andalso not def then if Operand.eq(operand,dst) then (changed := !changed + 1; src) else operand else operand in (all, replacer) end val (transfer,_) = transfer fun doit (statements : (Assembly.t * Liveness.t) list) = let fun uses_defs {uses, defs} = let local fun doit operands = List.fold (operands, [], fn (operand,memlocs) => case Operand.deMemloc operand of SOME memloc => if List.contains(memlocs, memloc, MemLoc.eq) then memlocs else memloc::memlocs | NONE => memlocs) fun doit'(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => if List.contains(uses, memloc, MemLoc.eq) then uses else memloc::uses) fun doit''(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => doit'(MemLoc.utilized memloc, uses)) in val uses = doit uses val defs = doit defs val uses = doit''(defs, doit''(uses, uses)) end in {uses = uses, defs = defs} end in case statements of [] => let val transfer = Transfer.replace replacer transfer val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) andalso not (MemLocSet.contains(Transfer.live transfer, memloc_dst)) then if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then SOME {statements = [], transfer = transfer} else NONE else NONE end | (asm, Liveness.T {dead, ...}) :: statements => let val asm = Assembly.replace replacer asm val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) then if LiveSet.contains(dead,memloc_dst) then let val statements = List.map (statements, #1) in SOME {statements = asm::statements, transfer = transfer} end else if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then case doit statements of NONE => NONE | SOME {statements, transfer} => SOME {statements = asm::statements, transfer = transfer} else NONE else NONE end end in case doit statements of NONE => NONE | SOME {statements, transfer} => let val {transfer, live} = LivenessBlock.toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} in SOME {pblock = {statements = statements, transfer = transfer}, changed = !changed > 0} end end | copyPropagate' _ = Error.bug "amd64Simplify.PeeholeBlock: copyPropagate'" fun copyPropagate {block = LivenessBlock.T {entry, profileLabel, statements, transfer}, liveInfo} = let val {pblock = {statements,transfer},changed} = List.foldr (statements, {pblock = {statements = [], transfer = transfer}, changed = false}, fn ((asm as Assembly.Instruction (Instruction.MOV {src, dst as Operand.MemLoc memloc_dst, ...}), info: Liveness.t), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if amd64Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead(#2(transfer)),memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm as Assembly.Instruction (Instruction.SSE_MOVS {src, dst as Operand.MemLoc memloc_dst, ...}), info), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if amd64Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead (#2 transfer), memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm,info), {pblock = {statements, transfer}, changed}) => {pblock = {statements = (asm,info)::statements, transfer = transfer}, changed = changed}) in {block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}, changed = changed} end val copyPropagate = fn {block, liveInfo} => (copyPropagate {block = block, liveInfo = liveInfo}) val (copyPropagate : {block: LivenessBlock.t, liveInfo: LiveInfo.t} -> {block: LivenessBlock.t, changed: bool}, copyPropagate_msg) = tracer "copyPropagate" copyPropagate val copyPropagate = fn arg as {block as LivenessBlock.T {statements, ...}, ...} => if List.length statements <= !Control.Native.copyPropCutoff then copyPropagate arg else {block = block, changed = false} end structure PeepholeLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock structure Peephole = Peephole(type entry_type = Entry.t * Liveness.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t * Liveness.t type transfer_type = Transfer.t * Liveness.t datatype block = datatype LivenessBlock.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn (Assembly.Comment _, _) => true | _ => false local val isInstruction_dstsTemp_dstsDead : statement_type -> bool = fn (Assembly.Instruction instruction, Liveness.T {dead,...}) => let val {dsts,...} = Instruction.srcs_dsts instruction in case dsts of NONE => false | SOME dsts => List.forall (dsts, fn Operand.MemLoc memloc => amd64Liveness.track memloc andalso LiveSet.contains(dead,memloc) | _ => false) end | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstruction_dstsTemp_dstsDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction _, Liveness.T {liveOut,...})]], finish, transfer} => if (case List.fold (finish, (false, false), fn ((asm, _), (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.MOV _) => (b, b') | Assembly.Instruction (Instruction.SETcc _) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case #1 transfer of Transfer.Iff _ => true | _ => false) | _ => false) then NONE else let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimDeadDsts" val (callback,elimDeadDsts_msg) = make_callback_msg "elimDeadDsts" in val elimDeadDsts : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_msg = elimDeadDsts_msg end local val isInstructionMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionAL_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => amd64Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionAL_dstTemp asm)), One isInstructionMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.BinAL {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pMD {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.IMUL2 {src, dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.SRAL {count, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (count,dst2) of (Operand.MemLoc memloc_count, Operand.MemLoc memloc_dst2) => List.forall (memloc_count::(MemLoc.utilized memloc_count), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_mov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALCopy" val (callback,elimALCopy_msg) = make_callback_msg "elimALCopy" in val elimALCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALCopy_msg = elimALCopy_msg end local fun isInstructionMOV_aux (check) : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => check memloc | _ => false val isInstructionMOV : statement_type -> bool = isInstructionMOV_aux (fn _ => true) val isInstructionMOV_dstTemp : statement_type -> bool = isInstructionMOV_aux amd64Liveness.track fun isInstructionAL_aux (check) : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | _ => false val isInstructionAL : statement_type -> bool = isInstructionAL_aux (fn _ => true) fun isDeadTemp dead memloc = amd64Liveness.track memloc andalso LiveSet.contains (dead, memloc) val isInstructionAL_dstDeadTemp : statement_type -> bool = fn (instr, liveness as Liveness.T {dead, ...}) => isInstructionAL_aux (isDeadTemp dead) (instr, liveness) val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionAL, All isComment, One isInstructionMOV_dstTemp, All isComment, One isInstructionAL_dstDeadTemp], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(stmtMov as Assembly.Instruction (Instruction.MOV {src = src1x, dst = dst1z, ...}), _)], comments1, [(stmtAL as Assembly.Instruction instrAL1, _)], comments2, [(Assembly.Instruction (Instruction.MOV {src = src2x, dst = dst2z, ...}), _)], comments3, [(Assembly.Instruction instrAL2, Liveness.T {liveOut = liveOut2, ...})]], finish, transfer} => if !Control.Native.elimALRedundant andalso Operand.eq (src1x, src2x) andalso (let fun checkUn (oper1, dst1, oper2, dst2) = oper1 = oper2 andalso Operand.eq(dst1z, dst1) andalso Operand.eq(dst2z, dst2) fun checkBin (oper1, src1, dst1, oper2, src2, dst2) = oper1 = oper2 andalso Operand.eq(src1, src2) andalso Operand.eq(dst1z, dst1) andalso Operand.eq(dst2z, dst2) in case (instrAL1, instrAL2) of (Instruction.BinAL {oper = oper1, src = src1, dst = dst1, ...}, Instruction.BinAL {oper = oper2, src = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | (Instruction.pMD {oper = oper1, src = src1, dst = dst1, ...}, Instruction.pMD {oper = oper2, src = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | (Instruction.IMUL2 {src = src1, dst = dst1, ...}, Instruction.IMUL2 {src = src2, dst = dst2, ...}) => checkBin (Instruction.IMUL, src1, dst1, Instruction.IMUL, src2, dst2) | (Instruction.UnAL {oper = oper1, dst = dst1, ...}, Instruction.UnAL {oper = oper2, dst = dst2, ...}) => checkUn (oper1, dst1, oper2, dst2) | (Instruction.SRAL {oper = oper1, count = src1, dst = dst1, ...}, Instruction.SRAL {oper = oper2, count = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | _ => false end) then let val excomm = fn comm => List.map (comm, fn (c, _) => c) val comments1 = excomm comments1 val comments2 = excomm comments2 val comments3 = excomm comments3 val statements = stmtMov::(comments1 @ (stmtAL::(comments2 @ comments3))) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold (start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: elimALRedundant" val (callback,elimALRedundant_msg) = make_callback_msg "elimALRedundant" in (* Fusing of adjacent `Word_` and `Word{S,U}_CheckP` * primitives depends on the relative order of `!a` and `?a` * in /basis-library/primitive/prim1.sml:mkOverflow *) val elimALRedundant : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALRedundant_msg = elimALRedundant_msg end local val isInstructionSSEMOVS_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionSSEAS_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_BinAS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.SSE_UnAS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionSSEMOVS_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => amd64Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionSSEAS_dstTemp asm)), One isInstructionSSEMOVS_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.SSE_BinAS {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | _ => false) | (Assembly.Instruction (Instruction.SSE_UnAS {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSEASCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_sse_movs {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSEASCopy" val (callback,elimSSEASCopy_msg) = make_callback_msg "elimSSEASCopy" in val elimSSEASCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSEASCopy_msg = elimSSEASCopy_msg end local val isInstructionMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, amd64Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSelfMove" val (callback,elimSelfMove_msg) = make_callback_msg "elimSelfMove" in val elimSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_msg = elimSelfMove_msg end local val isInstructionSSEMOVS_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, amd64Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSESSelfMove" val (callback,elimSSESSelfMove_msg) = make_callback_msg "elimSSESSelfMove" in val elimSSESSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSESSelfMove_msg = elimSSESSelfMove_msg end local val isInstructionMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionBinALMD_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) | (Assembly.Instruction (Instruction.pMD {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstMemloc, All isComment, One isInstructionBinALMD_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val isInstructionSSEMOVS_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionSSEBinAS_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_BinAS {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.SSE_ADDS) orelse (oper = Instruction.SSE_MULS) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_dstMemloc, All isComment, One isInstructionSSEBinAS_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.SSE_BinAS {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_sse_movs {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_sse_binas {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: commuteSSEBinAS" val (callback,commuteSSEBinAS_msg) = make_callback_msg "commuteSSEBinAS" in val commuteSSEBinAS : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteSSEBinAS_msg = commuteSSEBinAS_msg end local val isInstructionSETcc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SETcc {...}), _) => true | _ => false val isInstructionTEST_eqSrcs : statement_type -> bool = fn (Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc1, src2 = Operand.MemLoc memloc2,...}), Liveness.T {...}) => MemLoc.eq(memloc1, memloc2) | _ => false val isIff_conditionZorNZ : transfer_type -> bool = fn (Transfer.Iff {condition,...}, _) => (case condition of Instruction.Z => true | Instruction.NZ => true | _ => false) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSETcc, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isIff_conditionZorNZ} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(statement as Assembly.Instruction (Instruction.SETcc {condition = condition1, dst = Operand.MemLoc memloc1, ...}), _)], comments1, [(Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc12, ...}), Liveness.T {dead, ...})], comments2], finish = [], transfer = (Transfer.Iff {condition, truee, falsee}, infoT as _)} => if MemLoc.eq(memloc1,memloc12) then let val condition = case condition of Instruction.Z => Instruction.condition_negate condition1 | Instruction.NZ => condition1 | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump:condition" val transfer = (Transfer.iff {condition = condition, truee = truee, falsee = falsee}, infoT) val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val statements = List.concat [List.map(comments1, #1), List.map(comments2, #1)] val statements = if amd64Liveness.track memloc1 andalso LiveSet.contains(dead, memloc1) then statements else statement::statements val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} val statements = List.fold(start, statements, op ::) val live = case statements of (_, Liveness.T {liveIn,...})::_ => liveIn | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump:live" val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump" val (callback,conditionalJump_msg) = make_callback_msg "conditionalJump" in val conditionalJump : optimization = {template = template, rewriter = rewriter, callback = callback} val conditionalJump_msg = conditionalJump_msg end local val {template, rewriter, ...} = elimDeadDsts val (callback,elimDeadDsts_minor_msg) = make_callback_msg "elimDeadDsts_minor" in val elimDeadDsts_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_minor_msg = elimDeadDsts_minor_msg end local val {template, rewriter, ...} = elimSelfMove val (callback,elimSelfMove_minor_msg) = make_callback_msg "elimSelfMove_minor" in val elimSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_minor_msg = elimSelfMove_minor_msg end local val {template, rewriter, ...} = elimSSESSelfMove val (callback,elimSSESSelfMove_minor_msg) = make_callback_msg "elimSSESSelfMove_minor" in val elimSSESSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSESSelfMove_minor_msg = elimSSESSelfMove_minor_msg end local val optimizations_pre = elimALRedundant:: nil val optimizations_pre_msg = elimALRedundant_msg:: nil val optimizations = elimALCopy:: elimSSEASCopy:: elimDeadDsts:: elimSelfMove:: elimSSESSelfMove:: commuteBinALMD:: commuteSSEBinAS:: conditionalJump:: nil val optimizations_msg = elimALCopy_msg:: elimSSEASCopy_msg:: elimDeadDsts_msg:: elimSelfMove_msg:: elimSSESSelfMove_msg:: commuteBinALMD_msg:: commuteSSEBinAS_msg:: conditionalJump_msg:: nil val optimizations_minor = elimDeadDsts_minor:: elimSelfMove_minor:: elimSSESSelfMove_minor:: nil val optimizations_minor_msg = elimDeadDsts_minor_msg:: elimSelfMove_minor_msg:: elimSSESSelfMove_minor_msg:: nil in val peepholeLivenessBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeLivenessBlock_pre, peepholeLivenessBlock_pre_msg) = tracer "peepholeLivenessBlock_pre" peepholeLivenessBlock_pre val peepholeLivenessBlock_pre_msg = fn () => (peepholeLivenessBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock = fn block => (peepholeBlock {optimizations = optimizations, block = block}) val (peepholeLivenessBlock, peepholeLivenessBlock_msg) = tracer "peepholeLivenessBlock" peepholeLivenessBlock val peepholeLivenessBlock_msg = fn () => (peepholeLivenessBlock_msg (); Control.indent (); List.foreach(optimizations_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock_minor = fn block => (peepholeBlock {optimizations = optimizations_minor, block = block}) val (peepholeLivenessBlock_minor, peepholeLivenessBlock_minor_msg) = tracer "peepholeLivenessBlock_minor" peepholeLivenessBlock_minor val peepholeLivenessBlock_minor_msg = fn () => (peepholeLivenessBlock_minor_msg (); Control.indent (); List.foreach(optimizations_minor_msg, fn msg => msg ()); Control.unindent ()) end end fun simplify {chunk : Chunk.t, optimize : int, delProfileLabel : amd64.ProfileLabel.t -> unit, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t} : Chunk.t = let (* fun changedChunk_msg {chunk as Chunk.T {blocks, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedLivenessBlock_msg {block as amd64Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if changed then (print ("finished " ^ msg ^ "\n")) else () *) fun changedChunk_msg {chunk = Chunk.T {blocks, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; List.foreach(blocks, fn b as Block.T {entry, ...} => (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64.Block.printBlock b))) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64.Block.printBlock block)) fun changedLivenessBlock_msg {block as amd64Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label (#1 entry))), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64Liveness.LivenessBlock.printBlock block)) val debug = false val changedChunk_msg : {chunk : Chunk.t, changed: bool, msg: string} -> unit = if debug then changedChunk_msg else (fn _ => ()) val changedBlock_msg : {block : Block.t, changed: bool, msg: string} -> unit = if debug then changedBlock_msg else (fn _ => ()) val changedLivenessBlock_msg : {block : amd64Liveness.LivenessBlock.t, changed: bool, msg: string} -> unit = if debug then changedLivenessBlock_msg else (fn _ => ()) fun checkLivenessBlock {block, block', msg} = Assert.assert ("amd64Simplify.checkLivenessBlock: " ^ msg, fn () => if amd64Liveness.LivenessBlock.verifyLivenessBlock {block = block, liveInfo = liveInfo} then true else (print ("pre: " ^ msg); amd64Liveness.LivenessBlock.printBlock block; print (String.make(60, #"*")); print ("\n"); print ("post: " ^ msg); amd64Liveness.LivenessBlock.printBlock block'; print (String.make(60, #"*")); print ("\n"); false)) (*********************************************************************) (* simplify *) (*********************************************************************) val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "simplify:"} (*********************************************************************) (* completeLiveInfo *) (*********************************************************************) val _ = amd64Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "pre"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (pre):"} (*********************************************************************) (* completeJumpInfo *) (*********************************************************************) val _ = amd64JumpInfo.completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo} val _ = Assert.assert ("amd64Simplify.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk}) (*********************************************************************) (* optimizer *) (*********************************************************************) fun optimizer chunk = let val chunk = chunk val changed = false (**************************************************************) (* elimGoto *) (**************************************************************) val {chunk = chunk', changed = changed'} = ElimGoto.elimGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val _ = Assert.assert ("amd64Simplify.verifyJumpInfo", fn () => amd64JumpInfo.verifyJumpInfo {chunk = chunk', jumpInfo = jumpInfo}) val _ = Assert.assert ("amd64Simplify.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk'}) val _ = changedChunk_msg {chunk = chunk, changed = changed', msg = "ElimGoto.elimGoto:"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate*) (**************************************************************) val Chunk.T {data, blocks} = chunk val {blocks = blocks', changed = changed'} = List.fold (blocks, {blocks = [], changed = false}, fn (block, {blocks, changed}) => let val _ = changedBlock_msg {block = block, changed = false, msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} (***************************************************) (* peepholeBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_pre block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* toLivenessBlock *) (***************************************************) val block' = amd64Liveness.LivenessBlock.toLivenessBlock {block = block, liveInfo = liveInfo} val block = block' val _ = changedLivenessBlock_msg {block = block', changed = false, msg = "amd64Liveness.LivenessBlock.toLivenessBlock"} (***************************************************) (* peepholeLivenessBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_pre block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_pre"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* moveHoist *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.moveHoist then MoveHoistLivenessBlock.moveHoist {block = block} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "MoveHoistLivenessBlock.moveHoist"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "MoveHoistLivenessBlock.moveHoist"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val block = block' val changed = changed orelse changed' (***************************************************) (* copyPropagate *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.copyProp then CopyPropagateLivenessBlock.copyPropagate {block = block, liveInfo = liveInfo} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "CopyPropagateLivenessBlock.copyPropagate"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "CopyPropagateLivenessBlock.copyPropagate"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock_minor *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_minor block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val block = block' val changed = changed orelse changed' (***************************************************) (* toBlock *) (***************************************************) val block' = amd64Liveness.LivenessBlock.toBlock {block = block} val _ = changedBlock_msg {block = block', changed = false, msg = "amd64Liveness.LivenessBlock.toBlock"} val block = block' (***************************************************) (* peepholeBlock_post *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_post block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_post"} val block = block' val changed = changed orelse changed' in {blocks = block::blocks, changed = changed} end) val chunk' = Chunk.T {data = data, blocks = blocks'} val _ = changedChunk_msg {chunk = chunk', changed = changed', msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* completeLiveInfo *) (**************************************************************) val _ = amd64Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "post"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (post):"} in {chunk = chunk, changed = changed} end (*********************************************************************) (* optimizer_loop *) (*********************************************************************) fun optimizer_loop chunk = let fun loop {chunk, changed} = let val {chunk, changed = changed'} = optimizer chunk in if changed' then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed} = loop {chunk = chunk, changed = false} in {chunk = chunk, changed = changed} end (*********************************************************************) (* chunk *) (*********************************************************************) val {chunk, ...} = case optimize of 0 => {chunk = chunk, changed = false} | 1 => optimizer chunk | _ => optimizer_loop chunk in chunk end val (simplify, simplify_msg) = tracerTop "simplify" simplify fun simplify_totals () = (simplify_msg (); Control.indent (); amd64Liveness.LiveInfo.completeLiveInfo_msg (); amd64JumpInfo.completeJumpInfo_msg (); ElimGoto.elimGoto_msg (); amd64JumpInfo.verifyJumpInfo_msg (); amd64EntryTransfer.verifyEntryTransfer_msg (); PeepholeBlock.peepholeBlock_pre_msg (); amd64Liveness.LivenessBlock.toLivenessBlock_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_pre_msg (); MoveHoistLivenessBlock.moveHoist_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_msg (); CopyPropagateLivenessBlock.copyPropagate_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_minor_msg (); amd64Liveness.LivenessBlock.verifyLivenessBlock_msg (); amd64Liveness.LivenessBlock.toBlock_msg (); PeepholeBlock.peepholeBlock_post_msg (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-simplify.sig000066400000000000000000000017751416264345000243630ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_SIMPLIFY_STRUCTS = sig structure amd64 : AMD64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64EntryTransfer : AMD64_ENTRY_TRANSFER sharing amd64 = amd64EntryTransfer.amd64 end signature AMD64_SIMPLIFY = sig include AMD64_SIMPLIFY_STRUCTS val simplify : {chunk : amd64.Chunk.t, optimize : int, delProfileLabel : amd64.ProfileLabel.t -> unit, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t} -> amd64.Chunk.t val simplify_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-translate.fun000066400000000000000000001107061416264345000245250ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64Translate(S: AMD64_TRANSLATE_STRUCTS): AMD64_TRANSLATE = struct open S val tracerTop = amd64.tracerTop fun argsToString(ss: string list): string = "(" ^ (concat (List.separate(ss, ", "))) ^ ")" structure Machine = amd64MLton.Machine local open Machine in structure CSymbol = CSymbol structure CSymbolScope = CSymbolScope structure Const = Const structure Label = Label structure Live = Live structure Scale = Scale structure StackOffset = StackOffset structure Temporary = Temporary structure Type = Type structure WordSize = WordSize structure WordX = WordX end datatype z = datatype WordSize.prim structure Global = struct open Machine.Global fun toAMD64Operand (g: t) : (amd64.Operand.t * amd64.Size.t) vector = let val ty = Machine.Type.toCType (ty g) val index = index g val base = amd64.Immediate.label (amd64MLton.global_base ty) val origin = amd64.MemLoc.imm {base = base, index = amd64.Immediate.int index, scale = amd64.Scale.fromCType ty, size = amd64.Size.BYTE, class = amd64MLton.Classes.Globals} val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end end structure Operand = struct open Machine.Operand fun get (f: ('a * 'b) -> 'c) (i: int) (v: ('a * 'b) vector) = f (Vector.sub (v, i)) fun getOp0 v = get #1 0 v local fun fromSizes (sizes, origin) = (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) in val rec toAMD64Operand : t -> (amd64.Operand.t * amd64.Size.t) vector = fn SequenceOffset {base, index, offset, scale, ty} => let val base = toAMD64Operand base val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: SequenceOffset/base", fn () => Vector.length base = 1) val base = getOp0 base val index = toAMD64Operand index val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: SequenceOffset/index", fn () => Vector.length index = 1) val index = getOp0 index val scale = case scale of Scale.One => amd64.Scale.One | Scale.Two => amd64.Scale.Two | Scale.Four => amd64.Scale.Four | Scale.Eight => amd64.Scale.Eight val ty = Type.toCType ty val origin = case (amd64.Operand.deImmediate base, amd64.Operand.deMemloc base, amd64.Operand.deImmediate index, amd64.Operand.deMemloc index) of (SOME base, _, SOME index, _) => amd64.MemLoc.imm {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | (SOME base, _, _, SOME index) => amd64.MemLoc.basic {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | (_, SOME base, SOME index, _) => amd64.MemLoc.simple {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | (_, SOME base, _, SOME index) => amd64.MemLoc.complex {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | _ => Error.bug (concat ["amd64Translate.Operand.toAMD64Operand: ", "strange SequenceOffset: base: ", amd64.Operand.toString base, " index: ", amd64.Operand.toString index]) val origin = if Bytes.isZero offset then origin else amd64.MemLoc.shift {origin = origin, disp = amd64.Immediate.int (Bytes.toInt offset), scale = amd64.Scale.One, size = amd64.Size.BYTE} val sizes = amd64.Size.fromCType ty in fromSizes (sizes, origin) end | Cast (z, _) => toAMD64Operand z | Const (Const.CSymbol (CSymbol.T {name, symbolScope, ...})) => let datatype z = datatype CSymbolScope.t datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t val label = fn () => Label.fromString name (* how to access an imported label's address *) (* windows coff will add another leading _ to label *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => Label.fromString (name ^ "@GOTPCREL") val elf = fn () => Label.fromString (name ^ "@GOTPCREL") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => Vector.new1 (amd64.Operand.immediate_label (label ()), amd64.Size.QUAD) val indirect = fn () => Vector.new1 (amd64.Operand.memloc_label (importLabel ()), amd64.Size.QUAD) in case (symbolScope, !Control.Target.os, !Control.Native.pic) of (* As long as the symbol is private (this means it is not * exported to code outside this text segment), then * RIP-relative addressing works on every OS/format. *) (Private, _, _) => direct () (* When linking an executable, ELF and darwin-x86_64 use * a special trick to "simplify" the code. All exported * functions and symbols have pointers that correspond to * to the executable. Function pointers point to the * automatically created PLT entry in the executable. * Variables are copied/relocated into the executable bss. * This means that direct access is fine for executable * and archive formats. (It also means direct access is * NOT fine for a library, even if it defines the symbol) * * On ELF&darwin, a public symbol must be accessed via * the GOT. This is because the final value may not be * in this text segment. If the executable uses it, then * the unique C address resides in the executable's * text segment. The loader does this by creating a PLT * proxy or copying values to the executable text segment. *) | (Public, _, true) => indirect () | (Public, _, false) => direct () (* On windows, the address is the point of definition. So * we must use an indirect lookup even in executables. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* When compiling to a library, we need to access external * symbols via some address that is updated by the loader. * That address resides within our data segment, and can * be easily referenced using RIP-relative addressing. * This trick is used on every platform MLton supports. * Windows rewrites __imp__name symbols in our segment. * ELF and darwin-x86_64 rewrite name@GOTPCREL. *) | (External, _, true) => indirect () | (External, _, false) => direct () end | Const Const.Null => Vector.new1 (amd64.Operand.immediate_zero, amd64MLton.wordSize) | Const (Const.Word w) => let fun single size = Vector.new1 (amd64.Operand.immediate_word w, size) in case WordSize.prim (WordX.size w) of W8 => single amd64.Size.BYTE | W16 => single amd64.Size.WORD | W32 => single amd64.Size.LONG | W64 => single amd64.Size.QUAD end | Const _ => Error.bug "amd64Translate.Operand.toAMD64Operand: Const" | Frontier => let val frontier = amd64MLton.gcState_frontierContentsOperand () in Vector.new1 (frontier, valOf (amd64.Operand.size frontier)) end | GCState => Vector.new1 (amd64.Operand.label amd64MLton.gcState_label, amd64MLton.pointerSize) | Global g => Global.toAMD64Operand g | Label l => Vector.new1 (amd64.Operand.immediate_label l, amd64MLton.pointerSize) | Offset {base = GCState, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val offset = amd64MLton.gcState_offset {offset = offset, ty = ty} in Vector.new1 (offset, valOf (amd64.Operand.size offset)) end | Offset {base, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val base = toAMD64Operand base val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: Offset/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case (amd64.Operand.deImmediate base, amd64.Operand.deMemloc base) of (SOME base, _) => amd64.MemLoc.imm {base = base, index = amd64.Immediate.int offset, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | (_, SOME base) => amd64.MemLoc.simple {base = base, index = amd64.Immediate.int offset, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | _ => Error.bug (concat ["amd64Translate.Operand.toAMD64Operand: ", "strange Offset: base: ", amd64.Operand.toString base]) val sizes = amd64.Size.fromCType ty in fromSizes (sizes, origin) end | StackOffset (StackOffset.T {offset, ty}) => let val offset = Bytes.toInt offset val ty = Type.toCType ty val origin = amd64.MemLoc.simple {base = amd64MLton.gcState_stackTopContents (), index = amd64.Immediate.int offset, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Stack} val sizes = amd64.Size.fromCType ty in fromSizes (sizes, origin) end | StaticHeapRef (Machine.StaticHeap.Ref.T {kind, offset, ...}) => let val offset = Bytes.toInt offset val base = amd64.Immediate.labelPlusInt (Machine.StaticHeap.Kind.label kind, offset) in Vector.new1 (amd64.Operand.immediate base, amd64MLton.pointerSize) end | StackTop => let val stackTop = amd64MLton.gcState_stackTopContentsOperand () in Vector.new1 (stackTop, valOf (amd64.Operand.size stackTop)) end | Temporary t => let val ty = Machine.Type.toCType (Temporary.ty t) val index = Machine.Temporary.index t val base = amd64.Immediate.label (amd64MLton.local_base ty) val origin = amd64.MemLoc.imm {base = base, index = amd64.Immediate.int index, scale = amd64.Scale.fromCType ty, size = amd64.Size.BYTE, class = amd64MLton.Classes.Locals} val sizes = amd64.Size.fromCType ty in fromSizes (sizes, origin) end end end type transInfo = amd64MLton.transInfo structure Entry = struct structure Kind = Machine.Kind fun frameInfoToAMD64 fi = amd64.FrameInfo.T {frameInfosIndex = Machine.FrameInfo.index fi, size = Bytes.toInt (Machine.FrameInfo.size fi)} fun toAMD64Blocks {label, kind, transInfo as {live, liveInfo, ...}: transInfo} = ( amd64Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label); case kind of Kind.Jump => let in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.jump {label = label}), statements = [], transfer = NONE}) end | Kind.Func _ => let val args = List.fold (live label, amd64.MemLocSet.empty, fn (operand, args) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(args, memloc) | NONE => args) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.func {label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Cont {args, frameInfo, ...} => let val frameInfo = frameInfoToAMD64 frameInfo val args = Vector.fold (args, amd64.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toAMD64Operand (Live.toOperand operand), args, fn ((operand,_),args) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.cont {frameInfo = frameInfo, label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Handler {args, frameInfo, ...} => let val frameInfo = frameInfoToAMD64 frameInfo val args = Vector.fold (args, amd64.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toAMD64Operand (Live.toOperand operand), args, fn ((operand,_),args) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.handler {frameInfo = frameInfo, label = label, live = args}), statements = [], transfer = NONE}) end | Kind.CReturn {dst, frameInfo, func} => let val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toAMD64Operand (Live.toOperand dst) in amd64MLton.creturn {dsts = dsts, frameInfo = Option.map (frameInfo, frameInfoToAMD64), func = func, label = label, transInfo = transInfo} end) end structure Statement = struct open Machine.Statement fun comments statement = if !Control.codegenComments > 0 then let val comment = (Layout.toString o layout) statement in (AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin: ", comment])], transfer = NONE}), AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["end: ", comment])], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun toAMD64Blocks {statement, transInfo as {...} : transInfo} = (case statement of Move {src, dst} => let val (comment_begin, comment_end) = comments statement val dsts = Operand.toAMD64Operand dst val srcs = Operand.toAMD64Operand src (* Operand.toAMD64Operand returns multi-word * operands in and they will be moved in order, * so it suffices to check for aliasing between * the first dst and second src. *) val (dsts,srcs) = if Vector.length srcs > 1 andalso amd64.Operand.mayAlias (#1 (Vector.sub (dsts, 0)), #1 (Vector.sub (srcs, 1))) then (Vector.rev dsts, Vector.rev srcs) else (dsts,srcs) in AppendList.appends [comment_begin, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = (Vector.toList o Vector.map2) (dsts,srcs,fn ((dst,_),(src,srcsize)) => (* dst = src *) case amd64.Size.class srcsize of amd64.Size.INT => amd64.Assembly.instruction_mov {dst = dst, src = src, size = srcsize} | amd64.Size.FLT => amd64.Assembly.instruction_sse_movs {dst = dst, src = src, size = srcsize}), transfer = NONE}), comment_end] end | PrimApp {dst, prim, args} => let val (comment_begin, comment_end) = comments statement val args = (Vector.concatV o Vector.map) (args, Operand.toAMD64Operand) val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toAMD64Operand dst in AppendList.appends [comment_begin, (amd64MLton.prim {prim = prim, args = args, dsts = dsts, transInfo = transInfo}), comment_end] end | ProfileLabel l => AppendList.single (amd64.Block.mkProfileBlock' {profileLabel = l})) end structure Transfer = struct open Machine.Transfer fun goto l = AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = l})}) fun iff (test, a, b) = let val (test,testsize) = Vector.sub (Operand.toAMD64Operand test, 0) in if Label.equals(a, b) then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = a})}) else AppendList.single ((* if (test) goto a * goto b *) amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.instruction_test {src1 = test, src2 = test, size = testsize}], transfer = SOME (amd64.Transfer.iff {condition = amd64.Instruction.NZ, truee = a, falsee = b})}) end fun cmp (test, k, a, b) = let val (test,testsize) = Vector.sub (Operand.toAMD64Operand test, 0) in if Label.equals(a, b) then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = a})}) else AppendList.single ((* if (test = k) goto a * goto b *) amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.instruction_cmp {src1 = test, src2 = amd64.Operand.immediate k, size = testsize}], transfer = SOME (amd64.Transfer.iff {condition = amd64.Instruction.E, truee = a, falsee = b})}) end fun switch(test, cases, default) = let val test = Operand.toAMD64Operand test val (test,_) = Vector.sub(test, 0) in AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.switch {test = test, cases = cases, default = default})}) end fun doSwitchWord (test, cases, default) = (case (cases, default) of ([], NONE) => Error.bug "amd64Translate.Transfer.doSwitchWord" | ([(_,l)], NONE) => goto l | ([], SOME l) => goto l | ([(w1,l1),(w2,l2)], NONE) => if WordX.isZero w1 andalso WordX.isOne w2 then iff(test,l2,l1) else if WordX.isZero w2 andalso WordX.isOne w1 then iff(test,l1,l2) else cmp(test,amd64.Immediate.word w1,l1,l2) | ([(k',l')], SOME l) => cmp(test,amd64.Immediate.word k',l',l) | ((_,l)::cases, NONE) => switch(test, amd64.Transfer.Cases.word cases, l) | (cases, SOME l) => switch(test, amd64.Transfer.Cases.word cases, l)) fun comments transfer = if !Control.codegenComments > 0 then let val comment = (Layout.toString o layout) transfer in AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment comment], transfer = NONE}) end else AppendList.empty fun toAMD64Blocks {returns, transfer, transInfo: transInfo} = (case transfer of CCall {args, func, return} => let val args = (Vector.concatV o Vector.map) (args, Operand.toAMD64Operand) in AppendList.append (comments transfer, amd64MLton.ccall {args = args, func = func, return = Option.map (return, fn {return, size} => {return = return, size = Option.map (size, Bytes.toInt)}), transInfo = transInfo}) end | Return _ => AppendList.append (comments transfer, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.return {live = Vector.fold ((case returns of NONE => Error.bug "amd64Translate.Transfer.toAMD64Blocsk: Return" | SOME zs => zs), amd64.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toAMD64Operand operand, live, fn ((operand,_),live) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(live, memloc) | NONE => live))})})) | Raise _ => AppendList.append (comments transfer, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.raisee {live = amd64.MemLocSet.add (amd64.MemLocSet.add (amd64.MemLocSet.empty, amd64MLton.gcState_stackBottomContents ()), amd64MLton.gcState_exnStackContents ())})})) | Switch (Machine.Switch.T {cases, default, test, ...}) => AppendList.append (comments transfer, doSwitchWord (test, Vector.toList cases, default)) | Goto label => (AppendList.append (comments transfer, AppendList.single ((* goto label *) amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = label})}))) | Call {label, live, return, ...} => let val live = Vector.fold (live, amd64.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toAMD64Operand (Live.toOperand operand), live, fn ((operand, _), live) => case amd64.Operand.deMemloc operand of NONE => live | SOME memloc => amd64.MemLocSet.add (live, memloc))) val com = comments transfer val transfer = case return of NONE => amd64.Transfer.tail {target = label, live = live} | SOME {return, handler, size} => amd64.Transfer.nontail {target = label, live = live, return = return, handler = handler, size = Bytes.toInt size} in AppendList.append (com, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME transfer})) end) end structure Block = struct open Machine.Block fun toAMD64Blocks {block = T {label, live, kind, returns, statements, transfer, ...}, transInfo as {...} : transInfo} = let val pseudo_blocks = AppendList.append (AppendList.snoc (Entry.toAMD64Blocks {label = label, kind = kind, transInfo = transInfo}, amd64.Block.mkBlock' {entry = NONE, statements = if !Control.codegenComments > 0 then let val comment = concat ["Live: ", argsToString (Vector.toListMap (live, fn l => Operand.toString (Live.toOperand l)))] in [amd64.Assembly.comment comment] end else [], transfer = NONE}), Vector.foldr(statements, (Transfer.toAMD64Blocks {returns = (Option.map (returns, fn v => Vector.map (v, Live.toOperand))), transfer = transfer, transInfo = transInfo}), fn (statement,l) => AppendList.append (Statement.toAMD64Blocks {statement = statement, transInfo = transInfo}, l))) val pseudo_blocks = AppendList.toList pseudo_blocks val blocks = amd64.Block.compress pseudo_blocks in blocks end end structure Chunk = struct open Machine.Chunk fun toAMD64Chunk {chunk = T {blocks, ...}, liveInfo} = let val data = ref [] val addData = fn l => List.push (data, l) val {get = live : Label.t -> amd64.Operand.t list, set = setLive, rem = remLive, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live", Label.layout)) val _ = Vector.foreach (blocks, fn Block.T {label, live, ...} => setLive (label, (Vector.toList o #1 o Vector.unzip o Vector.concatV o Vector.map) (live, Operand.toAMD64Operand o Live.toOperand))) val transInfo = {addData = addData, live = live, liveInfo = liveInfo} val amd64Blocks = List.concat (Vector.toListMap (blocks, fn block => Block.toAMD64Blocks {block = block, transInfo = transInfo})) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => remLive label) val data = List.concatRev (!data) val data = if List.isEmpty data then [] else (amd64.Assembly.pseudoop_data())::data in amd64.Chunk.T {data = data, blocks = amd64Blocks} end end fun translateChunk {chunk: amd64MLton.Machine.Chunk.t, liveInfo: amd64Liveness.LiveInfo.t}: {chunk: amd64.Chunk.t} = {chunk = Chunk.toAMD64Chunk {chunk = chunk, liveInfo = liveInfo}} val (translateChunk, translateChunk_msg) = tracerTop "translateChunk" translateChunk fun translateChunk_totals () = (translateChunk_msg (); Control.indent (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64-translate.sig000066400000000000000000000015711416264345000245160ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_TRANSLATE_STRUCTS = sig structure amd64: AMD64_PSEUDO structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 sharing amd64MLton.amd64Liveness = amd64Liveness end signature AMD64_TRANSLATE = sig include AMD64_TRANSLATE_STRUCTS val translateChunk : {chunk: amd64MLton.Machine.Chunk.t, liveInfo: amd64Liveness.LiveInfo.t} -> {chunk: amd64.Chunk.t} val translateChunk_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64.fun000066400000000000000000004542271416264345000225430ustar00rootroot00000000000000(* Copyright (C) 2012,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor amd64 (S: AMD64_STRUCTS): AMD64 = struct val tracerTop = fn s => Control.traceBatch (Control.Pass, s) (* = fn s => fn f => (Control.trace (Control.Pass, s) f, fn () => ()) *) val tracer = fn s => Control.traceBatch (Control.Detail, s) (* = fn s => fn f => (Control.trace (Control.Detail, s) f, fn () => ()) *) (* compensate for differences between * C-escape sequences and ASM-escape sequences *) val Char_escapeASM = fn #"\000" => "\\000" | #"\^G" => "\\007" | #"\^K" => "\\013" | #"?" => "?" | #"'" => "'" | c => Char.escapeC c fun String_escapeASM s = String.translate(s, Char_escapeASM) val rec lexical = fn [] => EQUAL | thunk::tl => let val ord = thunk () in if Relation.equals(ord, EQUAL) then lexical tl else ord end open S structure Label = struct open Label fun toString l = if !Control.labelsHaveExtra_ then concat ["_", Label.toString l] else Label.toString l val layout = Layout.str o toString end structure Size = struct datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val layout = let open Layout in fn BYTE => str "b" | WORD => str "w" | LONG => str "l" | QUAD => str "q" | SNGL => str "s" | DBLE => str "d" end val toString = Layout.toString o layout val fromBytes : int -> t = fn 1 => BYTE | 2 => WORD | 4 => LONG | 8 => QUAD | _ => Error.bug "amd64.Size.fromBytes" val toBytes : t -> int = fn BYTE => 1 | WORD => 2 | LONG => 4 | QUAD => 8 | SNGL => 4 | DBLE => 8 local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Vector.new1 QUAD | Int8 => Vector.new1 BYTE | Int16 => Vector.new1 WORD | Int32 => Vector.new1 LONG | Int64 => Vector.new1 QUAD | Objptr => Vector.new1 QUAD | Real32 => Vector.new1 SNGL | Real64 => Vector.new1 DBLE | Word8 => Vector.new1 BYTE | Word16 => Vector.new1 WORD | Word32 => Vector.new1 LONG | Word64 => Vector.new1 QUAD end val class = fn BYTE => INT | WORD => INT | LONG => INT | QUAD => INT | SNGL => FLT | DBLE => FLT val eq = fn (s1, s2) => s1 = s2 val lt = fn (s1, s2) => (toBytes s1) < (toBytes s2) end structure Register = struct datatype reg = RAX | RBX | RCX | RDX | RDI | RSI | RBP | RSP | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15 | RIP val allReg = [RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8, R9, R10, R11, R12, R13, R14, R15] datatype part = R | E | X | L datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of R => Size.QUAD | E => Size.LONG | X => Size.WORD | L => Size.BYTE fun layout (T {reg, part}) = let open Layout fun doit1 base = let val {prefix, suffix} = case part of R => {prefix = "%r", suffix = "x"} | E => {prefix = "%e", suffix = "x"} | X => {prefix = "%", suffix = "x"} | L => {prefix = "%", suffix = "l"} in str (String.concat [prefix, base, suffix]) end fun doit2 base = let val {prefix, suffix} = case part of R => {prefix = "%r", suffix = ""} | E => {prefix = "%e", suffix = ""} | X => {prefix = "%", suffix = ""} | L => {prefix = "%", suffix = "l"} in str (String.concat [prefix, base, suffix]) end fun doit3 base = let val {suffix} = case part of R => {suffix = ""} | E => {suffix = "d"} | X => {suffix = "w"} | L => {suffix = "b"} in str (String.concat ["%", base, suffix]) end in case reg of RAX => doit1 "a" | RBX => doit1 "b" | RCX => doit1 "c" | RDX => doit1 "d" | RDI => doit2 "di" | RSI => doit2 "si" | RBP => doit2 "bp" | RSP => doit2 "sp" | R8 => doit3 "r8" | R9 => doit3 "r9" | R10 => doit3 "r10" | R11 => doit3 "r11" | R12 => doit3 "r12" | R13 => doit3 "r13" | R14 => doit3 "r14" | R15 => doit3 "r15" | RIP => doit3 "rip" end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val rax = T {reg = RAX, part = R} val eax = T {reg = RAX, part = E} val ax = T {reg = RAX, part = X} val al = T {reg = RAX, part = L} val rbx = T {reg = RBX, part = R} val ebx = T {reg = RBX, part = E} val bl = T {reg = RBX, part = L} val rcx = T {reg = RCX, part = R} val ecx = T {reg = RCX, part = E} val cl = T {reg = RCX, part = L} val rdx = T {reg = RDX, part = R} val edx = T {reg = RCX, part = E} val dl = T {reg = RDX, part = L} val rdi = T {reg = RDI, part = R} val rsi = T {reg = RSI, part = R} val rsp = T {reg = RSP, part = R} val rbp = T {reg = RBP, part = R} val r8 = T {reg = R8, part = R} val r8w = T {reg = R8, part = X} val r9 = T {reg = R9, part = R} val r9w = T {reg = R9, part = X} val r10 = T {reg = R10, part = R} val r10w = T {reg = R10, part = X} val r11 = T {reg = R11, part = R} val r11w = T {reg = R11, part = X} val r12 = T {reg = R12, part = R} val r12w = T {reg = R12, part = X} val r13 = T {reg = R13, part = R} val r13w = T {reg = R13, part = X} val r14 = T {reg = R14, part = R} val r14w = T {reg = R14, part = X} val r15 = T {reg = R15, part = R} val r15w = T {reg = R15, part = X} val rip = T {reg = RIP, part = R} local fun make part = List.rev [T {reg = RAX, part = part}, T {reg = RBX, part = part}, T {reg = RCX, part = part}, T {reg = RDX, part = part}, T {reg = RDI, part = part}, T {reg = RSI, part = part}, T {reg = RBP, part = part}, T {reg = RSP, part = part}, T {reg = R8, part = part}, T {reg = R9, part = part}, T {reg = R10, part = part}, T {reg = R11, part = part}, T {reg = R12, part = part}, T {reg = R13, part = part}, T {reg = R14, part = part}, T {reg = R15, part = part}] in val byteRegisters = make L val wordRegisters = make X val longRegisters = make E val quadRegisters = make R end val all = List.concat [byteRegisters, wordRegisters, longRegisters, quadRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (R, R) => true | (R, E) => true | (R, X) => true | (R, L) => true | (E, E) => true | (E, X) => true | (E, L) => true | (X, X) => true | (X, L) => true | (L, L) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([R, E, X, L], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = E}, register') then SOME register' else NONE end) val registers = fn Size.BYTE => byteRegisters | Size.WORD => wordRegisters | Size.LONG => longRegisters | Size.QUAD => quadRegisters | _ => Error.bug "amd64.Register.registers" val baseRegisters = quadRegisters val indexRegisters = [T {reg = RAX, part = R}, T {reg = RBX, part = R}, T {reg = RCX, part = R}, T {reg = RDX, part = R}, T {reg = RDI, part = R}, T {reg = RSI, part = R}, T {reg = RBP, part = R}, T {reg = R8, part = R}, T {reg = R9, part = R}, T {reg = R10, part = R}, T {reg = R11, part = R}, T {reg = R12, part = R}, T {reg = R13, part = R}, T {reg = R14, part = R}, T {reg = R15, part = R}] local fun make reg = [T {reg = reg, part = R}, T {reg = reg, part = E}, T {reg = reg, part = X}, T {reg = reg, part = L}] in val callerSaveRegisters = List.concatMap ([RAX, RCX, RDX, RDI, RSI, R8, R9, R10, R11], make) val calleeSaveRegisters = List.concatMap ([RBX, R12, R13, R14, R15], make) end val withLowPart (* (fullsize,lowsize) *) = fn (Size.WORD,Size.BYTE) => wordRegisters | (Size.LONG,Size.BYTE) => longRegisters | (Size.QUAD,Size.BYTE) => quadRegisters | (Size.LONG,Size.WORD) => longRegisters | (Size.QUAD,Size.WORD) => quadRegisters | (Size.QUAD,Size.LONG) => quadRegisters | _ => Error.bug "amd64.Register.withLowPart: fullsize,lowsize" val lowPartOf (* (register,lowsize) *) = fn (T {reg, ...},Size.BYTE) => T {reg = reg, part = L} | (T {reg, ...},Size.WORD) => T {reg = reg, part = X} | (T {reg, ...},Size.LONG) => T {reg = reg, part = E} | _ => Error.bug "amd64.Register.lowPartOf: register,lowsize" end structure XmmRegister = struct datatype reg = XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7 | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15 val allReg = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15] datatype part = D | S datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of D => Size.DBLE | S => Size.SNGL fun layout (T {reg, ...}) = let open Layout in case reg of XMM0 => str "%xmm0" | XMM1 => str "%xmm1" | XMM2 => str "%xmm2" | XMM3 => str "%xmm3" | XMM4 => str "%xmm4" | XMM5 => str "%xmm5" | XMM6 => str "%xmm6" | XMM7 => str "%xmm7" | XMM8 => str "%xmm8" | XMM9 => str "%xmm9" | XMM10 => str "%xmm10" | XMM11 => str "%xmm11" | XMM12 => str "%xmm12" | XMM13 => str "%xmm13" | XMM14 => str "%xmm14" | XMM15 => str "%xmm15" end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val xmm0S = T {reg = XMM0, part = S} val xmm0D = T {reg = XMM0, part = D} val xmm1S = T {reg = XMM1, part = S} val xmm1D = T {reg = XMM1, part = D} val xmm2S = T {reg = XMM2, part = S} val xmm2D = T {reg = XMM2, part = D} val xmm3S = T {reg = XMM3, part = S} val xmm3D = T {reg = XMM3, part = D} val xmm4S = T {reg = XMM4, part = S} val xmm4D = T {reg = XMM4, part = D} val xmm5S = T {reg = XMM5, part = S} val xmm5D = T {reg = XMM5, part = D} val xmm6S = T {reg = XMM6, part = S} val xmm6D = T {reg = XMM6, part = D} val xmm7S = T {reg = XMM7, part = S} val xmm7D = T {reg = XMM7, part = D} val xmm8S = T {reg = XMM8, part = S} val xmm8D = T {reg = XMM8, part = D} val xmm9S = T {reg = XMM9, part = S} val xmm9D = T {reg = XMM9, part = D} val xmm10S = T {reg = XMM10, part = S} val xmm10D = T {reg = XMM10, part = D} val xmm11S = T {reg = XMM11, part = S} val xmm11D = T {reg = XMM11, part = D} val xmm12S = T {reg = XMM12, part = S} val xmm12D = T {reg = XMM12, part = D} val xmm13S = T {reg = XMM13, part = S} val xmm13D = T {reg = XMM13, part = D} val xmm14S = T {reg = XMM14, part = S} val xmm14D = T {reg = XMM14, part = D} val xmm15S = T {reg = XMM15, part = S} val xmm15D = T {reg = XMM15, part = D} local fun make part = List.rev [T {reg = XMM0, part = part}, T {reg = XMM1, part = part}, T {reg = XMM2, part = part}, T {reg = XMM3, part = part}, T {reg = XMM4, part = part}, T {reg = XMM5, part = part}, T {reg = XMM6, part = part}, T {reg = XMM7, part = part}, T {reg = XMM8, part = part}, T {reg = XMM9, part = part}, T {reg = XMM10, part = part}, T {reg = XMM11, part = part}, T {reg = XMM12, part = part}, T {reg = XMM13, part = part}, T {reg = XMM14, part = part}, T {reg = XMM15, part = part}] in val singleRegisters = make S val doubleRegisters = make D end val all = List.concat [singleRegisters, doubleRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (D, D) => true | (D, S) => true | (S, S) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([D, S], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = D}, register') then SOME register' else NONE end) fun coincident (T {reg, ...}) = coincident' reg (* quell unused warning *) val _ = coincident val registers = fn Size.SNGL => singleRegisters | Size.DBLE => doubleRegisters | _ => Error.bug "amd64.XmmRegister.registers" val callerSaveRegisters = all val calleeSaveRegisters = [] end structure Immediate = struct datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t and t = T of {immediate: u, plist: PropertyList.t, hash: Word.t} local open Layout in val rec layoutU = fn Word w => WordX.layout (w, {suffix = false}) | Label l => Label.layout l | LabelPlusWord (l, w) => paren (seq [Label.layout l, str "+", WordX.layout (w, {suffix = false})]) and layout = fn T {immediate, ...} => layoutU immediate end val rec eqU = fn (Word w1, Word w2) => WordX.equals (w1, w2) | (Label l1, Label l2) => Label.equals(l1, l2) | (LabelPlusWord (l1, w1), LabelPlusWord (l2,w2)) => Label.equals(l1,l2) andalso WordX.equals(w1, w2) | _ => false and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) local open WordX in val rec evalU = fn Word w => SOME w | Label _ => NONE | LabelPlusWord _ => NONE and eval = fn T {immediate, ...} => evalU immediate end val isZero = fn i => case eval i of SOME w => WordX.isZero w | _ => false local open Word in val rec hashU = fn Word w => WordX.hash w | Label l => Label.hash l | LabelPlusWord (l,w) => Word.xorb(0wx5555 * (Label.hash l), WordX.hash w) and hash = fn T {hash, ...} => hash end local val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn immediate => let val hash = hashU immediate in HashSet.lookupOrInsert (!table, hash, fn T {immediate = immediate', ...} => eqU(immediate', immediate), fn () => T {immediate = immediate, hash = hash, plist = PropertyList.new ()}) end val destruct = fn T {immediate, ...} => immediate fun clearAll () = HashSet.foreach (!table, fn T {immediate, plist, ...} => let in PropertyList.clear plist; case immediate of Word _ => () | Label l => Label.clear l | LabelPlusWord (l, _) => Label.clear l end) end val word = construct o Word val label = construct o Label val labelPlusWord = fn (l, w) => if WordSize.equals (WordX.size w, WordSize.word64) then construct (LabelPlusWord (l, w)) else Error.bug "amd64.Immediate.labelPlusWord" val int' = fn (i, ws) => word (WordX.fromInt (i, ws)) val int = fn i => int' (i, WordSize.word64) val zero = int 0 val labelPlusInt = fn (l, i) => labelPlusWord (l, WordX.fromInt (i, WordSize.word64)) val deLabel = fn T {immediate = Label l, ...} => SOME l | _ => NONE end structure Scale = struct datatype t = One | Two | Four | Eight val layout = let open Layout in fn One => str "1" | Two => str "2" | Four => str "4" | Eight => str "8" end val fromBytes : int -> t = fn 1 => One | 2 => Two | 4 => Four | 8 => Eight | _ => Error.bug "amd64.Scale.fromBytes" local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Eight | Int8 => One | Int16 => Two | Int32 => Four | Int64 => Eight | Objptr => Eight | Real32 => Four | Real64 => Eight | Word8 => One | Word16 => Two | Word32 => Four | Word64 => Eight end fun eq(s1, s2) = s1 = s2 val toWordX = fn One => WordX.fromIntInf (1, WordSize.word64) | Two => WordX.fromIntInf (2, WordSize.word64) | Four => WordX.fromIntInf (4, WordSize.word64) | Eight => WordX.fromIntInf (8, WordSize.word64) val toImmediate = Immediate.word o toWordX end structure Address = struct datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} fun layout (T {disp, base, index, scale}) = let open Layout in seq [case disp of NONE => empty | SOME disp => Immediate.layout disp, if (isSome base orelse isSome index) then paren (seq [case base of NONE => empty | SOME base => Register.layout base, case index of NONE => empty | SOME index => seq [str ",", Register.layout index], case scale of NONE => empty | SOME scale => seq [str ",", Scale.layout scale]]) else empty] end fun eq(T {disp = disp, base = base, index = index, scale = scale}, T {disp = disp', base = base', index = index', scale = scale'}) = (case (disp, disp') of (NONE, NONE) => true | (SOME disp, SOME disp') => Immediate.eq(disp, disp') | _ => false) andalso base = base' andalso index = index' andalso scale = scale' end structure MemLoc = struct structure Class = struct val nextCounter = Counter.generator 0 datatype t = T of {counter: int, name: string} fun layout (T {name, ...}) = let open Layout in str name end val toString = Layout.toString o layout fun new {name} = let val class = T {counter = nextCounter (), name = name} in class end val eq = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => counter1 = counter2 val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare (counter1, counter2) val counter = fn (T {counter, ...}) => counter val mayAlias = eq val Temp = new {name = "Temp"} val StaticTemp = new {name = "StaticTemp"} val CArg = new {name = "CArg"} val CStack = new {name = "CStack"} val Code = new {name = "Code"} end datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} and t = T of {memloc: u, hash: Word.t, plist: PropertyList.t, counter: Int.t, utilized: t list} local open Layout in val rec layoutImmMem = fn (NONE, NONE) => str "0" | (SOME imm, NONE) => Immediate.layout imm | (NONE, SOME mem) => layout mem | (SOME imm, SOME mem) => seq [Immediate.layout imm, str "+", layout mem] and layoutImmMemScale = fn (NONE, NONE, _) => str "0" | (SOME imm, NONE, _) => Immediate.layout imm | (NONE, SOME mem, scale) => seq [layout mem, str "*", Scale.layout scale] | (SOME imm, SOME mem, scale) => seq [Immediate.layout imm, str "+(", layout mem, str "*", Scale.layout scale, str ")"] and layoutU = fn U {immBase, memBase, immIndex, memIndex, scale, size, class} => seq [str "MEM<", Size.layout size, str ">{", Class.layout class, str "}[(", layoutImmMem (immBase, memBase), str ")+(", layoutImmMemScale (immIndex, memIndex, scale), str ")]"] and layout = fn T {memloc, ...} => layoutU memloc end val toString = Layout.toString o layout val rec hashImmMem = fn (NONE, NONE) => 0wx55555555 | (SOME imm, NONE) => Immediate.hash imm | (NONE, SOME mem) => hash mem | (SOME imm, SOME mem) => Word.xorb(0wx5555 * (Immediate.hash imm), hash mem) and hashU = fn U {immBase, memBase, immIndex, memIndex, ...} => let val hashBase = hashImmMem(immBase, memBase) val hashIndex = hashImmMem(immIndex, memIndex) in Word.xorb(0wx5555 * hashBase, hashIndex) end and hash = fn T {hash, ...} => hash val rec eqImm = fn (NONE, NONE) => true | (SOME imm1, SOME imm2) => Immediate.eq(imm1, imm2) | _ => false and eqMem = fn (NONE, NONE) => true | (SOME mem1, SOME mem2) => eq(mem1, mem2) | _ => false and eqU = fn (U {immBase = immBase1, memBase = memBase1, immIndex = immIndex1, memIndex = memIndex1, scale = scale1, size = size1, class = class1}, U {immBase = immBase2, memBase = memBase2, immIndex = immIndex2, memIndex = memIndex2, scale = scale2, size = size2, class = class2}) => Class.eq(class1, class2) andalso eqImm(immBase1, immBase2) andalso eqMem(memBase1, memBase2) andalso eqImm(immIndex1, immIndex2) andalso eqMem(memIndex1, memIndex2) andalso Scale.eq(scale1, scale2) andalso Size.eq(size1, size2) and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) val rec utilizedMem = fn NONE => [] | SOME m => m::(utilized m) and utilizedU = fn U {memBase, memIndex, ...} => (utilizedMem memBase) @ (utilizedMem memIndex) and utilized = fn T {utilized, ...} => utilized local val nextCounter = Counter.generator 0 val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn memloc => let val hash = hashU memloc in HashSet.lookupOrInsert (!table, hash, fn T {memloc = memloc', ...} => eqU(memloc', memloc), fn () => T {memloc = memloc, hash = hash, plist = PropertyList.new (), counter = nextCounter (), utilized = utilizedU memloc}) end val destruct = fn T {memloc, ...} => memloc fun clearAll () = HashSet.foreach (!table, fn T {plist, ...} => let in PropertyList.clear plist end) end val rec mayAliasImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then pos2 < (pos1 + size1) else pos1 < (pos2 + size2) end handle Overflow => false) | _ => true end and mayAliasU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => Immediate.eq(immBase1, immBase2) andalso mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (Immediate.eq(immBase1, immBase2)) andalso (not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2})) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => true and mayAlias = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => Class.mayAlias(class1, class2) andalso mayAliasU(memloc1, memloc2) val rec mayAliasOrdImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then if pos2 < (pos1 + size1) then SOME LESS else NONE else if pos1 < (pos2 + size2) then SOME GREATER else NONE end handle Overflow => NONE) | _ => SOME EQUAL end and mayAliasOrdU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then if not (eq(memIndex1, memIndex2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if not (eq(memBase1, memBase2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if (not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2))) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => SOME EQUAL and mayAliasOrd = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => if Class.mayAlias(class1, class2) then mayAliasOrdU(memloc1, memloc2) else NONE val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare(counter1, counter2) fun replaceMem replacer = fn NONE => NONE | SOME mem => SOME (replace replacer mem) and replaceU replacer = fn memloc as T {memloc = U {immBase, memBase, immIndex, memIndex, scale, size, class}, ...} => let val memBase' = replaceMem replacer memBase val memIndex' = replaceMem replacer memIndex in if eqMem(memBase, memBase') andalso eqMem(memIndex, memIndex') then memloc else construct (U {immBase = immBase, memBase = memBase', immIndex = immIndex, memIndex = memIndex', scale = scale, size = size, class = class}) end and replace replacer = fn memloc => let val memloc' = replacer memloc in if eq(memloc', memloc) then replaceU replacer memloc else memloc' end val rec sizeU = fn U {size, ...} => size and size = fn T {memloc, ...} => sizeU memloc val rec classU = fn U {class, ...} => class and class = fn T {memloc, ...} => classU memloc fun scaleImmediate (imm, scale) = case Immediate.destruct imm of Immediate.Word w => Immediate.word (WordX.mul (w, Scale.toWordX scale, {signed = true})) | _ => Error.bug "amd64.MemLoc.scaleImmediate" fun addImmediate (imm1, imm2) = case (Immediate.destruct imm1, Immediate.destruct imm2) of (Immediate.Word w1, Immediate.Word w2) => Immediate.word (WordX.add (w1, w2)) | _ => Error.bug "amd64.MemLoc.scaleImmediate" val imm = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val basic = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val simple = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val complex = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val shift = fn {origin, disp, scale, size} => let val disp = scaleImmediate (disp, scale) val U {immBase, memBase, immIndex, memIndex, scale, class, ...} = destruct origin in construct (U {immBase = immBase, memBase = memBase, immIndex = case immIndex of NONE => SOME disp | SOME immIndex => SOME (addImmediate (immIndex, disp)), memIndex = memIndex, scale = scale, size = size, class = class}) end local val nextNum = Counter.generator 0 in val temp = fn {size} => imm {base = Immediate.zero, index = Immediate.int (nextNum ()), scale = Scale.One, size = size, class = Class.Temp} end (* * Static memory locations *) fun makeContents {base, size, class} = imm {base = base, index = Immediate.zero, scale = Scale.Eight, size = size, class = class} (* local datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTempContents sizes = (List.rev o #1) (List.fold (sizes, ([],0), fn (size, (contents, index)) => ((cReturnTempContent (index, size))::contents, index + Size.toBytes size))) fun cReturnTempContent size = List.first(cReturnTempContents [size]) val cReturnTempContents = fn size => cReturnTempContents ( case size of Int s => let datatype z = datatype IntSize.t in case s of I8 => [BYTE] | I16 => [WORD] | I32 => [LONG] | I64 => [LONG, LONG] end | Pointer => [LONG] | Real s => let datatype z = datatype RealSize.t in case s of R32 => [SNGL] | R64 => [DBLE] end | Word s => let datatype z = datatype WordSize.t in case s of W8 => [BYTE] | W16 => [WORD] | W32 => [LONG] end) end *) end local structure ClassElement = struct type t = MemLoc.Class.t val compare = MemLoc.Class.compare local fun make f = fn (a, b) => f (MemLoc.Class.counter a, MemLoc.Class.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.Class.counter a, MemLoc.Class.counter b) then a else b val max = fn (a, b) => min (b, a) val equals = MemLoc.Class.eq val layout = MemLoc.Class.layout end in structure ClassSet = OrderedUniqueSet(open ClassElement) end local structure MemLocElement = struct type t = MemLoc.t val equals = MemLoc.eq val layout = MemLoc.layout (* val compare = MemLoc.compare local fun make f = fn (a, b) => f (MemLoc.counter a, MemLoc.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.counter a, MemLoc.counter b) then a else b val max = fn (a, b) => min (b, a) val hash = MemLoc.hash *) end in structure MemLocSet = UnorderedSet(open MemLocElement) (* structure MemLocSet = OrderedUniqueSet(open MemLocElement) *) (* structure MemLocSet' = UnorderedSet(open MemLocElement) structure MemLocSet = HashedUniqueSet(structure Set = MemLocSet' structure Element = MemLocElement) *) end structure Operand = struct datatype t = Register of Register.t | XmmRegister of XmmRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val size = fn Register r => SOME (Register.size r) | XmmRegister x => SOME (XmmRegister.size x) | Immediate _ => NONE | Label _ => NONE | Address _ => NONE | MemLoc m => SOME (MemLoc.size m) val layout = let open Layout in fn Register r => Register.layout r | XmmRegister x => XmmRegister.layout x | Immediate i => seq [str "$", Immediate.layout i] | Label l => Label.layout l | Address a => Address.layout a | MemLoc m => MemLoc.layout m end val toString = Layout.toString o layout val eq = fn (Register r1, Register r2) => Register.eq(r1, r2) | (XmmRegister x1, XmmRegister x2) => XmmRegister.eq(x1, x2) | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Label l1, Label l2) => Label.equals(l1, l2) | (Address a1, Address a2) => Address.eq(a1, a2) | (MemLoc m1, MemLoc m2) => MemLoc.eq(m1, m2) | _ => false val mayAlias = fn (Register r1, Register r2) => Register.eq(r1, r2) | (Register _, _) => false | (XmmRegister x1, XmmRegister x2) => XmmRegister.eq(x1, x2) | (XmmRegister _, _) => false | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Immediate _, _) => false | (Label l1, Label l2) => Label.equals(l1, l2) | (Label _, _) => false | (Address _, Address _) => true | (Address _, MemLoc _) => true | (Address _, _) => false | (MemLoc m1, MemLoc m2) => MemLoc.mayAlias(m1, m2) | (MemLoc _, Address _) => true | (MemLoc _, _) => false val register = Register val deRegister = fn Register x => SOME x | _ => NONE val xmmregister = XmmRegister val deXmmregister = fn XmmRegister x => SOME x | _ => NONE val immediate = Immediate val deImmediate = fn Immediate x => SOME x | _ => NONE val immediate_word = immediate o Immediate.word val immediate_int' = immediate o Immediate.int' val immediate_int = immediate o Immediate.int val immediate_zero = immediate Immediate.zero val immediate_label = immediate o Immediate.label val label = Label val deLabel = fn Label x => SOME x | _ => NONE val address = Address val memloc = MemLoc fun memloc_label l = memloc (MemLoc.makeContents { base = Immediate.label l, size = Size.QUAD, class = MemLoc.Class.Code }) val deMemloc = fn MemLoc x => SOME x | _ => NONE local val cReturnTemp = Label.fromString "cReturnTemp" fun cReturnTempContent (index, size) = MemLoc.imm {base = Immediate.label cReturnTemp, index = Immediate.int index, scale = Scale.One, size = size, class = MemLoc.Class.StaticTemp} datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTemps ty = if RepType.isUnit ty then [] else let fun w (r, s) = [{src = register r, dst = cReturnTempContent (0, s)}] val w8 = w (Register.al, BYTE) val w16 = w (Register.ax, WORD) val w32 = w (Register.eax, LONG) val w64 = w (Register.rax, QUAD) fun x (x, s) = [{src = xmmregister x, dst = cReturnTempContent (0, s)}] val x32 = x (XmmRegister.xmm0S, SNGL) val x64 = x (XmmRegister.xmm0D, DBLE) in case RepType.toCType ty of CPointer => w64 | Int8 => w8 | Int16 => w16 | Int32 => w32 | Int64 => w64 | Objptr => w64 | Real32 => x32 | Real64 => x64 | Word8 => w8 | Word16 => w16 | Word32 => w32 | Word64 => w64 end end end structure Instruction = struct (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) val binal_layout = let open Layout in fn ADD => str "add" | ADC => str "adc" | SUB => str "sub" | SBB => str "sbb" | AND => str "and" | OR => str "or" | XOR => str "xor" end (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) val md_layout = let open Layout in fn IMUL => str "imul" | MUL => str "mul" | IDIV => str "idiv" | DIV => str "div" | IMOD => str "imod" | MOD => str "mod" end (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) val unal_layout = let open Layout in fn INC => str "inc" | DEC => str "dec" | NEG => str "neg" | NOT => str "not" end (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) val sral_layout = let open Layout in fn SAL => str "sal" | SHL => str "shl" | SAR => str "sar" | SHR => str "shr" | ROL => str "rol" | RCL => str "rcl" | ROR => str "ror" | RCR => str "rcr" end (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) val movx_layout = let open Layout in fn MOVSX => str "movs" | MOVZX => str "movz" end (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate = fn O => NO | NO => O | B => NB | NB => B | AE => NAE | NAE => AE | C => NC | NC => C | E => NE | NE => E | Z => NZ | NZ => Z | BE => NBE | NBE => BE | A => NA | NA => A | S => NS | NS => S | P => NP | NP => P | PE => PO | PO => PE | L => NL | NL => L | LE => NLE | NLE => LE | G => NG | NG => G | GE => NGE | NGE => GE val condition_reverse = fn B => A | NB => NA | AE => BE | NAE => NBE | E => E | NE => NE | BE => AE | NBE => NAE | A => B | NA => NB | L => G | NL => NG | LE => GE | NLE => NGE | G => L | NG => NL | GE => LE | NGE => NLE | c => c local open Layout in val rec condition_layout = fn O => str "o" | B => str "b" | AE => str "ae" | C => str "c" | E => str "e" | Z => str "z" | BE => str "be" | A => str "a" | S => str "s" | P => str "p" | PE => str "pe" | PO => str "po" | L => str "l" | LE => str "le" | G => str "g" | GE => str "ge" | c => seq [str "n", condition_layout (condition_negate c)] end val condition_toString = Layout.toString o condition_layout (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) val sse_binas_layout = let open Layout in fn SSE_ADDS => str "adds" | SSE_SUBS => str "subs" | SSE_MULS => str "muls" | SSE_DIVS => str "divs" | SSE_MAXS => str "maxs" | SSE_MINS => str "mins" end (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) val sse_unas_layout = let open Layout in fn SSE_SQRTS => str "sqrts" end (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) val sse_binlp_layout = let open Layout in fn SSE_ANDNP => str "andnp" | SSE_ANDP => str "andp" | SSE_ORP => str "orp" | SSE_XORP => str "xorp" end (* amd64 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump. *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo-push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo-pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE binary arithmetic instructions. *) | SSE_BinAS of {oper: sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE unary arithmetic instructions. *) | SSE_UnAS of {oper: sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} (* Packed SSE binary logical instructions (used as scalar). *) | SSE_BinLP of {oper: sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE move instruction. *) | SSE_MOVS of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE compare instruction. *) | SSE_COMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE unordered compare instruction. *) | SSE_UCOMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE floating-point/floating-point convert instruction. *) | SSE_CVTSFP2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE floating-point/signed-integer convert instruction. *) | SSE_CVTSFP2SI of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} | SSE_CVTSI2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE move data instruction. *) | SSE_MOVD of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} val layout = let open Layout fun bin (oper, size, oper1, oper2) = seq [oper, size, str " ", oper1, str ",", oper2] fun un (oper, size, oper1) = seq [oper, size, str " ", oper1] in fn NOP => str "nop" | HLT => str "hlt" | BinAL {oper, src, dst, size} => bin (binal_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pMD {oper, src, dst, size} => bin (md_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | MD {oper, src, size} => let val s = un (md_layout oper, Size.layout size, Operand.layout src) in case size of Size.BYTE => seq [str "movb %dl,%ah", str ";", s, str ";", str "movb %ah,%dl"] | _ => s end | IMUL2 {src, dst, size} => bin (str "imul", Size.layout size, Operand.layout src, Operand.layout dst) | UnAL {oper, dst, size} => un (unal_layout oper, Size.layout size, Operand.layout dst) | SRAL {oper, count, dst, size} => bin (sral_layout oper, Size.layout size, Operand.layout count, Operand.layout dst) | CMP {src1, src2, size} => bin (str "cmp", Size.layout size, Operand.layout src2, Operand.layout src1) | TEST {src1, src2, size} => bin (str "test", Size.layout size, Operand.layout src2, Operand.layout src1) | SETcc {condition, dst, ...} => seq [str "set", condition_layout condition, str " ", Operand.layout dst] | JMP {target, absolute} => seq [str "jmp ", if absolute then str "*" else empty, Operand.layout target] | Jcc {condition, target} => seq [str "j", condition_layout condition, str " ", Operand.layout target] | CALL {target, absolute} => seq [str "call ", if absolute then str "*" else empty, Operand.layout target] | RET {src} => seq [str "ret", case src of NONE => empty | SOME src => seq [str " ", Operand.layout src]] | MOV {src, dst, size} => bin (str "mov", Size.layout size, Operand.layout src, Operand.layout dst) | CMOVcc {condition, src, dst, size} => seq [str "cmov", condition_layout condition, Size.layout size, str " ", Operand.layout src, str ",", Operand.layout dst] | XCHG {src, dst, size} => bin (str "xchg", Size.layout size, Operand.layout src, Operand.layout dst) | pPUSH {src, base, size} => seq [str "ppush", Size.layout size, str " [", Operand.layout base, str "] ", Operand.layout src] | pPOP {dst, base, size} => seq [str "ppop", Size.layout size, str " [", Operand.layout base, str " ]", Operand.layout dst] | PUSH {src, size} => seq [str "push", Size.layout size, str " ", Operand.layout src] | POP {dst, size} => seq [str "pop", Size.layout size, str " ", Operand.layout dst] | CX {size} => (case size of Size.BYTE => str "cbtw ; movb %ah,%dl" | Size.WORD => str "cwtd" | Size.LONG => str "cltd" | Size.QUAD => str "cqto" | _ => Error.bug "amd64.Instruction.layout: CX,unsupported conversion") | MOVX {oper, src, srcsize, dst, dstsize} => let val (oper, suffix, src, dst) = case (oper, src, srcsize, dst, dstsize) of (MOVZX, _, Size.LONG, Operand.Register (Register.T {reg, ...}), Size.QUAD) => (str "mov", str "l", src, Operand.Register (Register.T {reg = reg, part = Register.E})) | _ => (movx_layout oper, seq [Size.layout srcsize, Size.layout dstsize], src, dst) in bin (oper, suffix, Operand.layout src, Operand.layout dst) end | XVOM {src, srcsize, dst, dstsize} => bin (str "xvom", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | LEA {src, dst, size} => bin (str "lea", Size.layout size, Operand.layout src, Operand.layout dst) | SSE_BinAS {oper, src, dst, size} => bin (sse_binas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_UnAS {oper, src, dst, size} => bin (sse_unas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_BinLP {oper, src, dst, size} => bin (sse_binlp_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_MOVS {src, dst, size} => bin (str "movs", Size.layout size, Operand.layout src, Operand.layout dst) | SSE_COMIS {src1, src2, size} => bin (str "comis", Size.layout size, Operand.layout src1, Operand.layout src2) | SSE_UCOMIS {src1, src2, size} => bin (str "ucomis", Size.layout size, Operand.layout src1, Operand.layout src2) | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize} => bin (str "cvt", seq [str "s", Size.layout srcsize, str "2", str "s", Size.layout dstsize], Operand.layout src, Operand.layout dst) | SSE_CVTSFP2SI {src, srcsize, dst, dstsize, ...} => bin (str "cvt", seq [str "s", Size.layout srcsize, str "2", str "si", case dstsize of Size.LONG => empty | Size.QUAD => Size.layout dstsize | _ => Error.bug "amd64.Instruction.layout: SSE_CVTSFP2SI,unsupported conversion"], Operand.layout src, Operand.layout dst) | SSE_CVTSI2SFP {src, srcsize, dst, dstsize, ...} => bin (str "cvt", seq [str "si", str "2", str "s", Size.layout dstsize, case srcsize of Size.LONG => empty | Size.QUAD => Size.layout srcsize | _ => Error.bug "amd64.Instruction.layout: SSE_CVTSI2SFP,unsupported conversion"], Operand.layout src, Operand.layout dst) | SSE_MOVD {src, dst, ...} => bin (str "movd", empty, Operand.layout src, Operand.layout dst) end val toString = Layout.toString o layout val uses_defs_kills = fn NOP => {uses = [], defs = [], kills = []} | HLT => {uses = [], defs = [], kills = []} | BinAL {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pMD {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | MD {oper, src, size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.uses_defs: MD, size" in if oper = IMUL orelse oper = MUL then {uses = [src, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} else {uses = [src, Operand.register hi, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | IMUL2 {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | UnAL {dst, ...} => {uses = [dst], defs = [dst], kills = []} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.uses_defs: SRAL, size" in {uses = [count, dst, Operand.register reg], defs = [dst], kills = []} end else {uses = [count, dst], defs = [dst], kills = []} | CMP {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | TEST {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SETcc {dst, ...} => {uses = [], defs = [dst], kills = []} | JMP {target, ...} => {uses = [target], defs = [], kills = []} | Jcc {target, ...} => {uses = [target], defs = [], kills = []} | CALL {target, ...} => {uses = [target], defs = [], kills = []} | RET {src} => {uses = case src of NONE => [] | SOME src => [src], defs = [], kills = []} | MOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | CMOVcc {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XCHG {src, dst, ...} => {uses = [src,dst], defs = [src,dst], kills = []} | pPUSH {src, base, size, ...} => {uses = [src,base], defs = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), kills = []} | pPOP {dst, base, size, ...} => {uses = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), defs = [dst,base], kills = []} | PUSH {src, ...} => {uses = [src, Operand.register Register.rsp], defs = [Operand.register Register.rsp, Operand.address (Address.T {disp = NONE, base = SOME Register.rsp, index = NONE, scale = NONE})], kills = []} | POP {dst, ...} => {uses = [Operand.register Register.rsp, Operand.address (Address.T {disp = NONE, base = SOME Register.rsp, index = NONE, scale = NONE})], defs = [dst, Operand.register Register.rsp], kills = []} | CX {size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.uses_defs: CX, size" in {uses = [Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | MOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | LEA {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_BinAS {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | SSE_UnAS {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_BinLP {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | SSE_MOVS {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_COMIS {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SSE_UCOMIS {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SSE_CVTSFP2SFP {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_CVTSFP2SI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_CVTSI2SFP {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_MOVD {src, dst, ...} => {uses = [src], defs = [dst], kills = []} val hints = fn pMD {dst, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc dst of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | MD {src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc src of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | SRAL {count, size, ...} => (case Operand.deMemloc count of SOME memloc => let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.hints: SRAL, size" in [(memloc, reg)] end | NONE => []) | pPUSH {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.rsp)] | NONE => []) | pPOP {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.rsp)] | NONE => []) | PUSH {...} => let val temp = MemLoc.temp {size = Size.QUAD} in [(temp,Register.rsp)] end | POP {...} => let val temp = MemLoc.temp {size = Size.QUAD} in [(temp,Register.rsp)] end | _ => [] val srcs_dsts = fn NOP => {srcs = NONE, dsts = NONE} | HLT => {srcs = NONE, dsts = NONE} | BinAL {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pMD {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | MD {oper, src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.srcs_dsts: MD, size" in if oper = IMUL orelse oper = MUL then {srcs = SOME [src, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} else {srcs = SOME [src, Operand.register hi, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | IMUL2 {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | UnAL {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.srcs_dsts: SRAL, size" in {srcs = SOME [count, dst, Operand.register reg], dsts = SOME [dst]} end else {srcs = SOME [count, dst], dsts = SOME [dst]} | CMP {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | TEST {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SETcc {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | JMP {target, ...} => {srcs = SOME [target], dsts = NONE} | Jcc {target, ...} => {srcs = SOME [target], dsts = NONE} | CALL {target, ...} => {srcs = SOME [target], dsts = NONE} | RET {src} => {srcs = case src of NONE => NONE | SOME src => SOME [src], dsts = NONE} | MOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | CMOVcc {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XCHG {src, dst, ...} => {srcs = SOME [src,dst], dsts = SOME [src,dst]} | pPUSH {src, base, ...} => {srcs = SOME [src,base], dsts = SOME [base]} | pPOP {dst, base, ...} => {srcs = SOME [base], dsts = SOME [dst,base]} | PUSH {src, ...} => {srcs = SOME [src, Operand.register Register.rsp], dsts = SOME [Operand.register Register.rsp]} | POP {dst, ...} => {srcs = SOME [Operand.register Register.rsp], dsts = SOME [dst, Operand.register Register.rsp]} | CX {size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.srcs_dsts: CX, size" in {srcs = SOME [Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | MOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | LEA {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_BinAS {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | SSE_UnAS {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_BinLP {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | SSE_MOVS {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_COMIS {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SSE_UCOMIS {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SSE_CVTSFP2SFP {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_CVTSFP2SI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_CVTSI2SFP {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_MOVD {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} fun replace replacer = fn NOP => NOP | HLT => HLT | BinAL {oper, src, dst, size} => BinAL {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pMD {oper, src, dst, size} => pMD {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | MD {oper, src, size} => MD {oper = oper, src = replacer {use = true, def = false} src, size = size} | IMUL2 {src, dst, size} => IMUL2 {src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | UnAL {oper, dst, size} => UnAL {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | SRAL {oper, count, dst, size} => SRAL {oper = oper, count = replacer {use = true, def = false} count, dst = replacer {use = true, def = true} dst, size = size} | CMP {src1, src2, size} => CMP {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | TEST {src1, src2, size} => TEST {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SETcc {condition, dst, size} => SETcc {condition = condition, dst = replacer {use = false, def = true} dst, size = size} | JMP {target, absolute} => JMP {target = replacer {use = true, def = false} target, absolute = absolute} | Jcc {condition, target} => Jcc {condition = condition, target = replacer {use = true, def = false} target} | CALL {target, absolute} => CALL {target = replacer {use = true, def = false} target, absolute = absolute} | RET {src} => (case src of NONE => RET {src = NONE} | SOME src => RET {src = SOME (replacer {use = true, def = false} src)}) | MOV {src, dst, size} => MOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | CMOVcc {condition, src, dst, size} => CMOVcc {condition = condition, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | XCHG {src, dst, size} => XCHG {src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | pPUSH {src, base, size} => pPUSH {src = replacer {use = true, def = false} src, base = replacer {use = true, def = true} base, size = size} | pPOP {dst, base, size} => pPOP {dst = replacer {use = false, def = true} dst, base = replacer {use = true, def = true} base, size = size} | PUSH {src, size} => PUSH {src = replacer {use = true, def = false} src, size = size} | POP {dst, size} => POP {dst = replacer {use = false, def = true} dst, size = size} | CX {size} => CX {size = size} | MOVX {oper, src, srcsize, dst, dstsize} => MOVX {oper = oper, src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | XVOM {src, srcsize, dst, dstsize} => XVOM {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | LEA {src, dst, size} => LEA {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_BinAS {oper, src, dst, size} => SSE_BinAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | SSE_UnAS {oper, src, dst, size} => SSE_UnAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_BinLP {oper, src, dst, size} => SSE_BinLP {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | SSE_MOVS {src, dst, size} => SSE_MOVS {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_COMIS {src1, src2, size} => SSE_COMIS {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SSE_UCOMIS {src1, src2, size} => SSE_UCOMIS {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize} => SSE_CVTSFP2SFP {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_CVTSFP2SI {src, srcsize, dst, dstsize} => SSE_CVTSFP2SI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_CVTSI2SFP {src, srcsize, dst, dstsize} => SSE_CVTSI2SFP {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_MOVD {src, srcsize, dst, dstsize} => SSE_MOVD {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} val nop = fn () => NOP val hlt = fn () => HLT val binal = BinAL val pmd = pMD val md = MD val imul2 = IMUL2 val unal = UnAL val sral = SRAL val cmp = CMP val test = TEST val setcc = SETcc val jmp = JMP val jcc = Jcc val call = CALL val ret = RET val mov = MOV val cmovcc = CMOVcc val xchg = XCHG val ppush = pPUSH val ppop = pPOP val push = PUSH val pop = POP val cx = CX val movx = MOVX val xvom = XVOM val lea = LEA val sse_binas = SSE_BinAS val sse_unas = SSE_UnAS val sse_binlp = SSE_BinLP val sse_movs = SSE_MOVS val sse_comis = SSE_COMIS val sse_ucomis = SSE_UCOMIS val sse_cvtsfp2sfp = SSE_CVTSFP2SFP val sse_cvtsfp2si = SSE_CVTSFP2SI val sse_cvtsi2sfp = SSE_CVTSI2SFP val sse_movd = SSE_MOVD end structure Directive = struct structure Id = struct val nextNum = Counter.generator 0 datatype t = T of {num : int, plist: PropertyList.t} fun new () = T {num = nextNum (), plist = PropertyList.new ()} val plist = fn T {plist, ...} => plist val layout = let open Layout in fn T {num, ...} => seq [str "RegAlloc", Int.layout num] end val toString = Layout.toString o layout end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | XmmAssume of {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %rsp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | XmmCache of {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src: Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} | XmmReserve of {registers: XmmRegister.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %rsp. *) | Unreserve of {registers : Register.t list} | XmmUnreserve of {registers : XmmRegister.t list} (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString = fn Assume {assumes} => concat["Assume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | XmmAssume {assumes} => concat["XmmAssume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", XmmRegister.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | Cache {caches} => concat["Cache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", " ", s])] | XmmCache {caches} => concat["XmmCache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", XmmRegister.toString register, if reserve then " (reserved)" else "", " ", s])] | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => concat["Force: ", "commit_memlocs: ", MemLocSet.fold (commit_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "commit_classes: ", ClassSet.fold (commit_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "remove_memlocs: ", MemLocSet.fold (remove_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "remove_classes: ", ClassSet.fold (remove_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "dead_memlocs: ", MemLocSet.fold (dead_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "dead_classes: ", ClassSet.fold (dead_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s])] | Reset => concat["Reset"] | CCall => concat["CCall"] | Return {returns} => concat["Return: ", List.toString (fn {src,dst} => concat ["(", Operand.toString src, ",", MemLoc.toString dst, ")"]) returns] | Reserve {registers} => concat["Reserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | XmmReserve {registers} => concat["XmmReserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[XmmRegister.toString register, " ", s])] | Unreserve {registers} => concat["Unreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | XmmUnreserve {registers} => concat["XmmUnreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[XmmRegister.toString register, " ", s])] | SaveRegAlloc {live, id} => concat["SaveRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] | RestoreRegAlloc {live, id} => concat["RestoreRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] val layout = Layout.str o toString val uses_defs_kills = fn Assume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | XmmAssume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.xmmregister register)::defs, kills = []}) | Cache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | XmmCache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.xmmregister register)::defs, kills = []}) | Reset => {uses = [], defs = [], kills = []} | Force {commit_memlocs, remove_memlocs, ...} => {uses = List.map(MemLocSet.toList commit_memlocs, Operand.memloc) @ List.map(MemLocSet.toList remove_memlocs, Operand.memloc), defs = [], kills = []} | CCall => {uses = [], defs = [], kills = []} | Return {returns} => let val uses = List.map(returns, fn {src, ...} => src) val defs = List.map(returns, fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = defs, kills = []} end | Reserve {...} => {uses = [], defs = [], kills = []} | XmmReserve {...} => {uses = [], defs = [], kills = []} | Unreserve {...} => {uses = [], defs = [], kills = []} | XmmUnreserve {...} => {uses = [], defs = [], kills = []} | SaveRegAlloc {live, ...} => {uses = List.map(MemLocSet.toList live, Operand.memloc), defs = [], kills = []} | RestoreRegAlloc {...} => {uses = [], defs = [], kills = []} val hints = fn Cache {caches} => List.map (caches, fn {register, memloc, ...} => (memloc, register)) | _ => [] fun replace replacer = fn Assume {assumes} => Assume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | XmmAssume {assumes} => XmmAssume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | Cache {caches} => Cache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.register register) of Operand.Register register => register | _ => Error.bug "amd64.Directive.replace: Cache, register", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Cache, memloc", reserve = reserve})} | XmmCache {caches} => XmmCache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.xmmregister register) of Operand.XmmRegister register => register | _ => Error.bug "amd64.Directive.replace: XmmCache, xmmregister", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: XmmCache, memloc", reserve = reserve})} | Reset => Reset | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => Force {commit_memlocs = MemLocSet.map (commit_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, commit_memlocs"), commit_classes = commit_classes, remove_memlocs = MemLocSet.map (remove_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, remove_memlocs"), remove_classes = remove_classes, dead_memlocs = MemLocSet.map (dead_memlocs, fn memloc => case replacer {use = false, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, dead_memlocs"), dead_classes = dead_classes} | CCall => CCall | Return {returns} => Return {returns = List.map (returns, fn {src,dst} => {src = src, dst = case replacer {use = true, def = false} (Operand.memloc dst) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Return, returns"})} | Reserve {registers} => Reserve {registers = registers} | XmmReserve {registers} => XmmReserve {registers = registers} | Unreserve {registers} => Unreserve {registers = registers} | XmmUnreserve {registers} => XmmUnreserve {registers = registers} | SaveRegAlloc {live, id} => SaveRegAlloc {live = live, id = id} | RestoreRegAlloc {live, id} => RestoreRegAlloc {live = live, id = id} val assume = Assume val xmmassume = XmmAssume val cache = Cache val xmmcache = XmmCache val reset = fn () => Reset val force = Force val ccall = fn () => CCall val return = Return val reserve = Reserve val xmmreserve = XmmReserve val unreserve = Unreserve val xmmunreserve = XmmUnreserve val saveregalloc = SaveRegAlloc val restoreregalloc = RestoreRegAlloc end structure PseudoOp = struct datatype t = Data | Text | SymbolStub | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | Quad of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val layout = let open Layout in fn Data => str ".data" | Text => str ".text" | SymbolStub => str ".section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5" | Balign (i,fill,max) => seq [str ".balign ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | P2align (i,fill,max) => seq [str ".p2align ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | Space (i,f) => seq [str ".space ", Immediate.layout i, str ",", Immediate.layout f] | Byte bs => seq [str ".byte ", seq (separate(List.map (bs, Immediate.layout), ","))] | Word ws => seq [str ".word ", seq (separate(List.map (ws, Immediate.layout), ","))] | Long ls => seq [str ".long ", seq (separate(List.map (ls, Immediate.layout), ","))] | Quad ls => seq [str ".quad ", seq (separate(List.map (ls, Immediate.layout), ","))] | String ss => seq [str ".ascii ", seq (separate(List.map (ss, fn s => seq [str "\"", str (String_escapeASM s), str "\""]), ","))] | Global l => seq [str ".globl ", Label.layout l] | Hidden l => (* visibility directive depends on target object file *) let val elf = seq [str ".hidden ", Label.layout l] val macho = seq [str ".private_extern ", Label.layout l] val coff = seq [str "/* ", str ".hidden ", Label.layout l, str " */"] in case !Control.Target.os of MLton.Platform.OS.Cygwin => coff | MLton.Platform.OS.Darwin => macho | MLton.Platform.OS.MinGW => coff | _ => elf end | IndirectSymbol l => seq [str ".indirect_symbol ", Label.layout l] | Local l => seq [str ".local ", Label.layout l] | Comm (l, i, a) => seq [str ".comm ", Label.layout l, str ",", Immediate.layout i, case a of NONE => empty | SOME i => seq [str ",", Immediate.layout i]] end val toString = Layout.toString o layout fun replace replacer = let val replacerLabel = fn label => case Operand.deLabel (replacer {use = true, def = false} (Operand.label label)) of SOME label => label | NONE => Error.bug "amd64.PseudoOp.replace.replacerLabel" val replacerImmediate = fn immediate => case Operand.deImmediate (replacer {use = true, def = false} (Operand.immediate immediate)) of SOME immediate => immediate | NONE => Error.bug "amd64.PseudoOp.replace.replacerImmediate" in fn Data => Data | Text => Text | SymbolStub => SymbolStub | Balign (i,fill,max) => Balign (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | P2align (i,fill,max) => P2align (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | Space (i,f) => Space (replacerImmediate i, replacerImmediate f) | Byte bs => Byte (List.map(bs, replacerImmediate)) | Word ws => Word (List.map(ws, replacerImmediate)) | Long ls => Long (List.map(ls, replacerImmediate)) | Quad ls => Quad (List.map(ls, replacerImmediate)) | String ss => String ss | Global l => Global (replacerLabel l) | Hidden l => Hidden (replacerLabel l) | IndirectSymbol l => IndirectSymbol (replacerLabel l) | Local l => Local (replacerLabel l) | Comm (l, i, a) => Comm (replacerLabel l, replacerImmediate i, Option.map(a, replacerImmediate)) end val data = fn () => Data val text = fn () => Text val symbol_stub = fn () => SymbolStub val balign = Balign val p2align = P2align val space = Space val byte = Byte val word = Word val long = Long val quad = Quad val string = String val global = Global val hidden = Hidden val indirect_symbol = IndirectSymbol val locall = Local val comm = Comm end structure Assembly = struct datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout = let open Layout in fn Comment s => seq [str "/* ", str s, str " */"] | Directive d => seq [str "# directive: ", Directive.layout d] | PseudoOp p => seq [PseudoOp.layout p] | Label l => seq [Label.layout l, str ":"] | Instruction i => seq [str "\t", Instruction.layout i] end val toString = Layout.toString o layout val uses_defs_kills = fn Comment _ => {uses = [], defs = [], kills = []} | Directive d => Directive.uses_defs_kills d | PseudoOp _ => {uses = [], defs = [], kills = []} | Label _ => {uses = [], defs = [], kills = []} | Instruction i => Instruction.uses_defs_kills i val hints = fn Comment _ => [] | Directive d => Directive.hints d | PseudoOp _ => [] | Label _ => [] | Instruction i => Instruction.hints i fun replace replacer = fn Comment s => Comment s | Directive d => Directive (Directive.replace replacer d) | PseudoOp p => PseudoOp (PseudoOp.replace replacer p) | Label l => Label (case Operand.deLabel (replacer {use = false, def = true} (Operand.label l)) of SOME l => l | NONE => Error.bug "amd64.Assembly.replace, Label") | Instruction i => Instruction (Instruction.replace replacer i) val comment = Comment val isComment = fn Comment _ => true | _ => false val directive = Directive val directive_assume = Directive o Directive.assume val directive_xmmassume = Directive o Directive.xmmassume val directive_cache = Directive o Directive.cache val directive_xmmcache = Directive o Directive.xmmcache val directive_reset = Directive o Directive.reset val directive_force = Directive o Directive.force val directive_ccall = Directive o Directive.ccall val directive_return = Directive o Directive.return val directive_reserve = Directive o Directive.reserve val directive_xmmreserve = Directive o Directive.xmmreserve val directive_unreserve = Directive o Directive.unreserve val directive_xmmunreserve = Directive o Directive.xmmunreserve val directive_saveregalloc = Directive o Directive.saveregalloc val directive_restoreregalloc = Directive o Directive.restoreregalloc val pseudoop = PseudoOp val pseudoop_data = PseudoOp o PseudoOp.data val pseudoop_text = PseudoOp o PseudoOp.text val pseudoop_symbol_stub = PseudoOp o PseudoOp.symbol_stub val pseudoop_balign = PseudoOp o PseudoOp.balign val pseudoop_p2align = PseudoOp o PseudoOp.p2align val pseudoop_space = PseudoOp o PseudoOp.space val pseudoop_byte = PseudoOp o PseudoOp.byte val pseudoop_word = PseudoOp o PseudoOp.word val pseudoop_long = PseudoOp o PseudoOp.long val pseudoop_quad = PseudoOp o PseudoOp.quad val pseudoop_string = PseudoOp o PseudoOp.string val pseudoop_global = PseudoOp o PseudoOp.global val pseudoop_hidden = PseudoOp o PseudoOp.hidden val pseudoop_indirect_symbol = PseudoOp o PseudoOp.indirect_symbol val pseudoop_local = PseudoOp o PseudoOp.locall val pseudoop_comm = PseudoOp o PseudoOp.comm val label = Label val instruction = Instruction val instruction_nop = Instruction o Instruction.nop val instruction_hlt = Instruction o Instruction.hlt val instruction_binal = Instruction o Instruction.binal val instruction_pmd = Instruction o Instruction.pmd val instruction_md = Instruction o Instruction.md val instruction_imul2 = Instruction o Instruction.imul2 val instruction_unal = Instruction o Instruction.unal val instruction_sral = Instruction o Instruction.sral val instruction_cmp = Instruction o Instruction.cmp val instruction_test = Instruction o Instruction.test val instruction_setcc = Instruction o Instruction.setcc val instruction_jmp = Instruction o Instruction.jmp val instruction_jcc = Instruction o Instruction.jcc val instruction_call = Instruction o Instruction.call val instruction_ret = Instruction o Instruction.ret val instruction_mov = Instruction o Instruction.mov val instruction_cmovcc = Instruction o Instruction.cmovcc val instruction_xchg = Instruction o Instruction.xchg val instruction_ppush = Instruction o Instruction.ppush val instruction_ppop = Instruction o Instruction.ppop val instruction_push = Instruction o Instruction.push val instruction_pop = Instruction o Instruction.pop val instruction_cx = Instruction o Instruction.cx val instruction_movx = Instruction o Instruction.movx val instruction_xvom = Instruction o Instruction.xvom val instruction_lea = Instruction o Instruction.lea val instruction_sse_binas = Instruction o Instruction.sse_binas val instruction_sse_unas = Instruction o Instruction.sse_unas val instruction_sse_binlp = Instruction o Instruction.sse_binlp val instruction_sse_movs = Instruction o Instruction.sse_movs val instruction_sse_comis = Instruction o Instruction.sse_comis val instruction_sse_ucomis = Instruction o Instruction.sse_ucomis val instruction_sse_cvtsfp2sfp = Instruction o Instruction.sse_cvtsfp2sfp val instruction_sse_cvtsfp2si = Instruction o Instruction.sse_cvtsfp2si val instruction_sse_cvtsi2sfp = Instruction o Instruction.sse_cvtsi2sfp val instruction_sse_movd = Instruction o Instruction.sse_movd end structure FrameInfo = struct datatype t = T of {size: int, frameInfosIndex: int} fun toString (T {size, frameInfosIndex}) = concat ["{", "size = ", Int.toString size, ", ", "frameInfosIndex = ", Int.toString frameInfosIndex, "}"] end structure Entry = struct datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val toString = fn Jump {label} => concat ["Jump::", Label.toString label] | Func {label, live} => concat ["Func::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Cont {label, live, frameInfo} => concat ["Cont::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] ", FrameInfo.toString frameInfo] | Handler {frameInfo, label, live} => concat ["Handler::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] (", FrameInfo.toString frameInfo, ")"] | CReturn {dsts, frameInfo, func, label} => concat ["CReturn::", Label.toString label, " ", Vector.toString (fn (dst,_) => Operand.toString dst) dsts, " ", (CFunction.Target.toString o CFunction.target) func, " ", case frameInfo of NONE => "" | SOME f => FrameInfo.toString f] val layout = Layout.str o toString val uses_defs_kills = fn CReturn {dsts, func, ...} => let val uses = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = Vector.toListMap(dsts, fn (dst, _) => dst), kills = []} end | _ => {uses = [], defs = [], kills = []} val label = fn Jump {label, ...} => label | Func {label, ...} => label | Cont {label, ...} => label | Handler {label, ...} => label | CReturn {label, ...} => label val live = fn Func {live, ...} => live | Cont {live, ...} => live | Handler {live, ...} => live | _ => MemLocSet.empty val jump = Jump val func = Func val isFunc = fn Func _ => true | _ => false val cont = Cont val handler = Handler val creturn = CReturn end structure Transfer = struct structure Cases = struct datatype 'a t = Word of (WordX.t * 'a) list val word = Word fun isEmpty cases = case cases of Word [] => true | _ => false fun isSingle cases = case cases of Word [_] => true | _ => false fun extract(cases,f) = let fun doit [(k,target)] = f (k, target) | doit _ = Error.bug "amd64.Transfer.Cases.extract" in case cases of Word cases => doit cases end fun count(cases, p) = let fun doit [] = (0 : int) | doit ((_,target)::cases) = let val n = doit cases in if p target then 1 + n else n end in case cases of Word cases => doit cases end fun keepAll(cases, p) = let fun doit l = List.keepAll(l, fn (k,target) => p (k,target)) in case cases of Word cases => Word(doit cases) end fun forall(cases, f) = let fun doit l = List.forall(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun foreach(cases, f) = let fun doit l = List.foreach(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun map(cases, f) = let fun doit l = List.map(l, fn (k,target) => (k, f (k, target))) in case cases of Word cases => Word(doit cases) end fun mapToList(cases, f) = let fun doit l = List.map(l, fn (k,target) => f (k, target)) in case cases of Word cases => doit cases end end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} val toString = fn Goto {target} => concat ["GOTO ", Label.toString target] | Iff {condition, truee, falsee} => concat["IF ", Instruction.condition_toString condition, " THEN GOTO ", Label.toString truee, " ELSE GOTO ", Label.toString falsee] | Switch {test, cases, default} => (concat["SWITCH ", Operand.toString test]) ^ (concat o Cases.mapToList) (cases, fn (w, target) => concat[" (", WordX.toString (w, {suffix = true}), " -> GOTO ", Label.toString target, ")"]) ^ (concat[" GOTO ", Label.toString default]) | Tail {target, live} => concat ["TAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | NonTail {target, live, return, handler, size} => concat ["NONTAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] <", Label.toString return, " ", Int.toString size, "> {", case handler of SOME handler => Label.toString handler | NONE => "", "}"] | Return {live} => concat ["RETURN", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Raise {live} => concat ["RAISE", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | CCall {args, func, return, ...} => concat ["CCALL ", (CFunction.Convention.toString o CFunction.convention) func, " ", (CFunction.Target.toString o CFunction.target) func, "(", (concat o List.separate) (List.map(args, fn (oper,_) => Operand.toString oper), ", "), ") <", Option.toString (fn {return, size} => concat ["(", Label.toString return, ", ", Option.toString Int.toString size, ")"]) return, ">"] val layout = Layout.str o toString val uses_defs_kills = fn Switch {test, ...} => {uses = [test], defs = [], kills = []} | CCall {args, func, ...} => let val defs = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = List.map(args, fn (oper,_) => oper), defs = defs, kills = []} end | _ => {uses = [], defs = [], kills = []} val nearTargets = fn Goto {target} => [target] | Iff {truee,falsee,...} => [truee,falsee] | Switch {cases,default,...} => default::(Cases.mapToList (cases, fn (_,target) => target)) | NonTail {return,handler,...} => return::(case handler of NONE => nil | SOME handler => [handler]) | CCall {return, ...} => (case return of NONE => [] | SOME {return, ...} => [return]) | _ => [] val live = fn Tail {live,...} => live | NonTail {live,...} => live | Return {live,...} => live | Raise {live,...} => live | _ => MemLocSet.empty fun replace replacer = fn Switch {test, cases, default} => Switch {test = replacer {use = true, def = false} test, cases = cases, default = default} | CCall {args, func, return} => CCall {args = List.map(args, fn (oper,size) => (replacer {use = true, def = false} oper, size)), func = func, return = return} | transfer => transfer val goto = Goto val iff = Iff val switch = Switch val tail = Tail val nontail = NonTail val return = Return val raisee = Raise val ccall = CCall end structure ProfileLabel = struct open ProfileLabel fun toAssembly pl = let val label = Label.fromString (toString pl) in [Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label] end fun toAssemblyOpt pl = case pl of NONE => [] | SOME pl => toAssembly pl end structure Block = struct datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} fun mkBlock' {entry, statements, transfer} = T' {entry = entry, profileLabel = NONE, statements = statements, transfer = transfer} fun mkProfileBlock' {profileLabel} = T' {entry = NONE, profileLabel = SOME profileLabel, statements = [], transfer = NONE} datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} fun printBlock (T {entry, profileLabel, statements, transfer, ...}) = (print (Entry.toString entry); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (Transfer.toString transfer); print "\n") fun printBlock' (T' {entry, profileLabel, statements, transfer, ...}) = (print (if isSome entry then Entry.toString (valOf entry) else "---"); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (if isSome transfer then Transfer.toString (valOf transfer) else "NONE"); print "\n") fun layout (T {entry, profileLabel, statements, transfer, ...}) = let open Layout in align [seq [Entry.layout entry, str ": ", record [("profileLabel", Option.layout ProfileLabel.layout profileLabel)], str "\n"], indent (align [align (List.map (statements, fn s => seq [Assembly.layout s, str "\n"])), Transfer.layout transfer], 4)] end fun layouts (block, output' : Layout.t -> unit) = output' (layout block) val compress': t' list -> t' list = fn l => List.fold (rev l, [], fn (b' as T' {entry, profileLabel, statements, transfer}, ac) => case transfer of SOME _ => b' :: ac | NONE => case ac of [] => Error.bug "amd64.Block.compress': dangling transfer" | b2' :: ac => let val T' {entry = entry2, profileLabel = profileLabel2, statements = statements2, transfer = transfer2} = b2' in case entry2 of SOME _ => Error.bug "amd64.Block.compress': mismatched transfer" | NONE => let val (pl, ss) = case (profileLabel, statements) of (NONE, []) => (profileLabel2, statements2) | _ => (profileLabel, statements @ (ProfileLabel.toAssemblyOpt profileLabel2) @ statements2) in T' {entry = entry, profileLabel = pl, statements = ss, transfer = transfer2} :: ac end end) val compress: t' list -> t list = fn l => List.map (compress' l, fn T' {entry, profileLabel, statements, transfer} => case (entry, transfer) of (SOME e, SOME t) => T {entry = e, profileLabel = profileLabel, statements = statements, transfer = t} | _ => Error.bug "amd64.Block.compress") end structure Chunk = struct datatype t = T of {data: Assembly.t list, blocks: Block.t list} fun layouts (T {blocks, ...}, output: Layout.t -> unit) = List.foreach (blocks, fn block => Block.layouts (block, output)) end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/amd64.sig000066400000000000000000001237571416264345000225360ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature AMD64_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure ProfileLabel: PROFILE_LABEL structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize end signature AMD64 = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val toString : t -> string val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool end structure Register : sig datatype reg = RAX | RBX | RCX | RDX | RDI | RSI | RBP | RSP | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15 | RIP val allReg : reg list datatype part = R | E | X | L datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list (* val return : Size.t -> t *) val rax : t val eax : t val al : t val rbx : t val ebx : t val bl : t val rcx : t val ecx : t val cl : t val rdx : t val edx : t val dl : t val rdi : t val rsi : t val rsp : t val rbp : t val r8 : t val r8w : t val r9 : t val r9w : t val r10 : t val r10w : t val r11 : t val r11w : t val r12 : t val r12w : t val r13 : t val r13w : t val r14 : t val r14w : t val r15 : t val r15w : t val rip : t val registers : Size.t -> t list val baseRegisters : t list val indexRegisters : t list val callerSaveRegisters : t list val calleeSaveRegisters : t list val withLowPart : Size.t * Size.t -> t list val lowPartOf : t * Size.t -> t end structure XmmRegister : sig datatype reg = XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7 | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15 val allReg : reg list datatype part = D | S datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list val coincident : t -> t list (* val return : Size.t -> t *) val xmm0D : t val xmm0S : t val xmm1D : t val xmm1S : t val xmm2D : t val xmm2S : t val xmm3D : t val xmm3S : t val xmm4D : t val xmm4S : t val xmm5D : t val xmm5S : t val xmm6D : t val xmm6S : t val xmm7D : t val xmm7S : t val xmm8D : t val xmm8S : t val xmm9D : t val xmm9S : t val xmm10D : t val xmm10S : t val xmm11D : t val xmm11S : t val xmm12D : t val xmm12S : t val xmm13D : t val xmm13S : t val xmm14D : t val xmm14S : t val xmm15D : t val xmm15S : t val registers : Size.t -> t list val callerSaveRegisters : t list val calleeSaveRegisters : t list end structure Immediate : sig type t datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t val deLabel : t -> Label.t option val destruct : t -> u val clearAll : unit -> unit val eval : t -> WordX.t option val isZero : t -> bool val eq : t * t -> bool end structure Scale : sig datatype t = One | Two | Four | Eight val eq : t * t -> bool val toWordX : t -> WordX.t val toImmediate : t -> Immediate.t val fromBytes : int -> t val fromCType : CType.t -> t end structure Address : sig datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} end structure MemLoc : sig structure Class : sig type t val toString : t -> string val new : {name: string} -> t val Temp : t val StaticTemp : t val CArg : t val CStack : t val Code : t val eq : t * t -> bool val compare : t * t -> order end type t datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} val layout : t -> Layout.t val toString : t -> string val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val destruct : t -> u val clearAll : unit -> unit val size : t -> Size.t val class : t -> Class.t val eq : t * t -> bool val compare : t * t -> order val utilized : t -> t list val mayAlias : t * t -> bool val mayAliasOrd : t * t -> order option val replace : (t -> t) -> t -> t (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t (* CReturn locations *) (* val cReturnTempContent : Size.t -> t val cReturnTempContents : CFunction.CType.t -> t list *) end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig datatype t = Register of Register.t | XmmRegister of XmmRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val layout : t -> Layout.t val toString : t -> string val register : Register.t -> t val deRegister : t -> Register.t option val xmmregister : XmmRegister.t -> t val deXmmregister : t -> XmmRegister.t option val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val address : Address.t -> t val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool val cReturnTemps: RepType.t -> {src: t, dst: MemLoc.t} list end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) (* amd64 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 114 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump; p. 373 *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE binary arithmetic instructions. *) | SSE_BinAS of {oper: sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE unary arithmetic instructions. *) | SSE_UnAS of {oper: sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} (* Packed SSE binary logic instructions (used as scalar). *) | SSE_BinLP of {oper: sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE move instruction. *) | SSE_MOVS of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE compare instruction. *) | SSE_COMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE unordered compare instruction. *) | SSE_UCOMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE floating-point/floating-point convert instruction. *) | SSE_CVTSFP2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE floating-point/signed-integer convert instruction. *) | SSE_CVTSFP2SI of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} | SSE_CVTSI2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE move data instruction. *) | SSE_MOVD of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val srcs_dsts : t -> {srcs: Operand.t list option, dsts: Operand.t list option} val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t end structure Directive : sig structure Id : sig type t val new : unit -> t val plist : t -> PropertyList.t end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | XmmAssume of {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | XmmCache of {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src:Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} | XmmReserve of {registers: XmmRegister.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers: Register.t list} | XmmUnreserve of {registers: XmmRegister.t list} (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val xmmassume : {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val xmmcache : {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} -> t val reset : unit -> t val force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val ccall : unit -> t val return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val reserve : {registers: Register.t list} -> t val xmmreserve : {registers: XmmRegister.t list} -> t val unreserve : {registers: Register.t list} -> t val xmmunreserve : {registers: XmmRegister.t list} -> t val saveregalloc : {live: MemLocSet.t, id: Id.t} -> t val restoreregalloc : {live: MemLocSet.t, id: Id.t} -> t end structure PseudoOp : sig datatype t = Data | Text | SymbolStub | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | Quad of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val toString : t -> string val data : unit -> t val text : unit -> t val symbol_stub : unit -> t val balign : Immediate.t * Immediate.t option * Immediate.t option -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val space : Immediate.t * Immediate.t -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val quad : Immediate.t list -> t val string : string list -> t val global : Label.t -> t val hidden : Label.t -> t val indirect_symbol : Label.t -> t val locall : Label.t -> t val comm : Label.t * Immediate.t * Immediate.t option -> t end structure Assembly : sig datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout : t -> Layout.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val comment : string -> t val isComment : t -> bool val directive : Directive.t -> t val directive_assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_xmmassume : {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_xmmcache : {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_reset : unit -> t val directive_force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val directive_ccall : unit -> t val directive_return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val directive_reserve : {registers: Register.t list} -> t val directive_xmmreserve : {registers: XmmRegister.t list} -> t val directive_unreserve : {registers: Register.t list} -> t val directive_xmmunreserve : {registers: XmmRegister.t list} -> t val directive_saveregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_restoreregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_balign : Immediate.t * Immediate.t option * Immediate.t option ->t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_space : Immediate.t * Immediate.t -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_quad : Immediate.t list -> t val pseudoop_string : string list -> t val pseudoop_global : Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_local : Label.t -> t val pseudoop_comm : Label.t * Immediate.t * Immediate.t option -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_hlt : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_md : {oper: Instruction.md, src: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_push : {src: Operand.t, size: Size.t} -> t val instruction_pop : {dst: Operand.t, size: Size.t} -> t val instruction_cx : {size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binas : {oper: Instruction.sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_unas : {oper: Instruction.sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binlp : {oper: Instruction.sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_movs : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_comis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_ucomis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_cvtsfp2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsfp2si : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsi2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_movd : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameInfosIndex: int} end structure Entry: sig datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val cont : {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func : {label: Label.t, live: MemLocSet.t} -> t val handler : {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val isFunc : t -> bool val jump : {label: Label.t} -> t val label : t -> Label.t val live : t -> MemLocSet.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} end structure Transfer : sig structure Cases : sig datatype 'a t = Word of (WordX.t * 'a) list val word : (WordX.t * 'a) list -> 'a t val isEmpty : 'a t -> bool val isSingle : 'a t -> bool val extract : 'a t * (WordX.t * 'a -> 'b) -> 'b val count : 'a t * ('a -> bool) -> int val keepAll : 'a t * (WordX.t * 'a -> bool) -> 'a t val forall : 'a t * (WordX.t * 'a -> bool) -> bool val foreach : 'a t * (WordX.t * 'a -> unit) -> unit val map : 'a t * (WordX.t * 'a -> 'b) -> 'b t val mapToList : 'a t * (WordX.t * 'a -> 'b) -> 'b list end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val nearTargets : t -> Label.t list val live : t -> MemLocSet.t val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall: {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} -> t end structure ProfileLabel : sig include PROFILE_LABEL val toAssembly : t -> Assembly.t list val toAssemblyOpt : t option -> Assembly.t list end structure Block : sig datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} val printBlock : t -> unit val layouts: t * (Layout.t -> unit) -> unit val compress : t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} val layouts: t * (Layout.t -> unit) -> unit end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/peephole.fun000066400000000000000000000351611416264345000234210ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Peephole(T : PEEPHOLE_TYPES): PEEPHOLE = struct open T datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element = fn p => ((1, SOME 1), p) val All : (statement_type -> bool) -> statement_element = fn p => ((0, NONE), p) type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} datatype match_state = Start of {block: block} | Continue of {remaining: optimization list, match: match} | Done of {block: block} type find_state = {remaining: optimization list, state: {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, finish: statement_type list, transfer: transfer_type}} fun split (l, p) = case l of [] => ([],[]) | l as h::t => if p h then let val (tt,ff) = split (t, p) in (h::tt,ff) end else ([],l) val rec matcher' : {template_statement: statement_element, statement: statement_type list, finish: statement_type list} -> {statement: statement_type list, finish: statement_type list} option = fn (* Zero *) {template_statement = ((0, SOME 0), _), statement, finish} => SOME {statement = List.rev statement, finish = finish} | (* ZeroOrOne *) {template_statement = ((0, SOME 1), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* One *) {template_statement = ((1, SOME 1), p), statement, finish} => (case finish of [] => NONE | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else NONE) | (* *) {template_statement = ((0, SOME i), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then matcher' {template_statement = ((0, SOME (i-1)), p), statement = statement'::statement, finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* All *) {template_statement = ((0, NONE), p), statement, finish} => let val (statement',finish') = split (finish, p) in SOME {statement = List.fold(statement, statement', op ::), finish = finish'} end | {template_statement = ((min, max), p), statement, finish = (statement'::finish')} => if p statement' then matcher' {template_statement = ((Int.max(min-1,0), Option.map(max,fn i => i - 1)), p), statement = statement'::statement, finish = finish'} else NONE | _ => NONE val rec matcher : {template_statements: statement_element list, statements: statement_type list list, finish: statement_type list} -> {statements: statement_type list list, finish: statement_type list} option = fn {template_statements = [], statements, finish} => SOME {statements = List.rev statements, finish = finish} | {template_statements = (template_statement::template_statements), statements, finish} => (case matcher' {template_statement = template_statement, statement = [], finish = finish} of NONE => NONE | SOME {statement, finish} => matcher {template_statements = template_statements, statements = statement::statements, finish = finish}) fun peepholeBlock' {optimizations: optimization list, match_state: match_state} = let fun next {remaining: optimization list, state as {entry, profileLabel, start, finish, transfer}} : find_state option = (case remaining of [] => NONE | _::nil => (case finish of [] => NONE | statement::finish => SOME {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = statement::start, finish = finish, transfer = transfer}}) | _::remaining => SOME {remaining = remaining, state = state}) fun findMatch' (find_state as {remaining as {template = {start = template_start, statements = template_statements, finish = template_finish, transfer = template_transfer}, ...}::_, state = {entry, profileLabel, start, finish, transfer}}) : match_state = let fun loop () = (case next find_state of SOME find_state => findMatch' find_state | NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}}) in if not (template_transfer transfer) then loop () else if template_start = Empty andalso not (List.isEmpty start) then loop () else case matcher {template_statements = template_statements, statements = [], finish = finish} of NONE => loop () | SOME {statements, finish} => if template_finish = Empty andalso not (List.isEmpty finish) then loop () else Continue {remaining = remaining, match = {entry = entry, profileLabel = profileLabel, start = start, statements = statements, finish = finish, transfer = transfer}} end | findMatch' _ = Error.bug "Peephole.peepholeBlock'.findMatch'" fun findMatch (match_state: match_state) : match_state = case match_state of Start {block = T {entry, profileLabel, statements, transfer}} => let val find_state = {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = [], finish = statements, transfer = transfer}} in findMatch' find_state end | Continue {remaining, match = {entry, profileLabel, start, statements, finish, transfer}, ...} => let val finish = List.foldr(statements, finish, op @) val find_state = {remaining = remaining, state = {entry = entry, profileLabel = profileLabel, start = start, finish = finish, transfer = transfer}} in case next find_state of NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}} | SOME find_state => findMatch' find_state end | Done _ => match_state fun peepholeBlock'' {match_state: match_state, changed: bool} = case findMatch match_state of match_state as Continue {remaining = {rewriter, callback, ...}::_, match} => (case rewriter match of SOME block => (callback true; peepholeBlock'' {match_state = Start {block = block}, changed = true}) | NONE => (callback false; peepholeBlock'' {match_state = match_state, changed = changed})) | Done {block} => {block = block, changed = changed} | _ => Error.bug "Peephole.peepholeBlock''" in case optimizations of [] => (case match_state of Start {block = block} => {block = block, changed = false} | _ => Error.bug "Peephole.peepholeBlock'") | _ => peepholeBlock'' {match_state = match_state, changed = false} end fun peepholeBlock {block: block, optimizations: optimization list} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} fun peepholeBlocks {blocks: block list, optimizations: optimization list} = let val {blocks, changed} = List.foldr (blocks, {blocks = [], changed = false}, fn (block,{blocks,changed}) => let val {block = block', changed = changed'} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} in {blocks = block'::blocks, changed = changed orelse changed'} end) in {blocks = blocks, changed = changed} end end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/peephole.sig000066400000000000000000000040731416264345000234110ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PEEPHOLE_TYPES = sig type entry_type type profileLabel_type type statement_type type transfer_type datatype block = T of {entry: entry_type, profileLabel: profileLabel_type, statements: statement_type list, transfer: transfer_type} end signature PEEPHOLE = sig include PEEPHOLE_TYPES datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element val All : (statement_type -> bool) -> statement_element type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} val peepholeBlock : {block: block, optimizations: optimization list} -> {block: block, changed: bool} val peepholeBlocks : {blocks: block list, optimizations: optimization list} -> {blocks: block list, changed: bool} end mlton-20210117+dfsg/mlton/codegen/amd64-codegen/sources.cm000066400000000000000000000020171416264345000231040ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor amd64Codegen is ../../../lib/mlton/sources.cm ../../atoms/sources.cm ../../backend/sources.cm ../../control/sources.cm ../c-codegen/sources.cm peephole.sig peephole.fun amd64.sig amd64.fun amd64-pseudo.sig amd64-mlton-basic.sig amd64-mlton-basic.fun amd64-liveness.sig amd64-liveness.fun amd64-mlton.sig amd64-mlton.fun amd64-allocate-registers.sig amd64-allocate-registers.fun amd64-entry-transfer.sig amd64-entry-transfer.fun amd64-jump-info.sig amd64-jump-info.fun amd64-loop-info.sig amd64-loop-info.fun amd64-live-transfers.sig amd64-live-transfers.fun amd64-generate-transfers.sig amd64-generate-transfers.fun amd64-simplify.sig amd64-simplify.fun amd64-translate.sig amd64-translate.fun amd64-codegen.sig amd64-codegen.fun mlton-20210117+dfsg/mlton/codegen/amd64-codegen/sources.mlb000066400000000000000000000021741416264345000232630ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../atoms/sources.mlb ../../backend/sources.mlb ../../control/sources.mlb ../c-codegen/sources.mlb peephole.sig peephole.fun amd64.sig amd64.fun amd64-pseudo.sig amd64-mlton-basic.sig amd64-mlton-basic.fun amd64-liveness.sig amd64-liveness.fun amd64-mlton.sig amd64-mlton.fun amd64-allocate-registers.sig amd64-allocate-registers.fun amd64-entry-transfer.sig amd64-entry-transfer.fun amd64-jump-info.sig amd64-jump-info.fun amd64-loop-info.sig amd64-loop-info.fun amd64-live-transfers.sig amd64-live-transfers.fun amd64-generate-transfers.sig amd64-generate-transfers.fun amd64-simplify.sig amd64-simplify.fun amd64-translate.sig amd64-translate.fun amd64-codegen.sig amd64-codegen.fun in functor amd64Codegen end mlton-20210117+dfsg/mlton/codegen/c-codegen/000077500000000000000000000000001416264345000204075ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/codegen/c-codegen/c-codegen.fun000066400000000000000000002407031416264345000227530ustar00rootroot00000000000000(* Copyright (C) 2009,2014-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CCodegen (S: C_CODEGEN_STRUCTS): C_CODEGEN = struct open S open Machine datatype z = datatype RealSize.t datatype z = datatype WordSize.prim local open Runtime in structure GCField = GCField end structure C = struct val truee = "TRUE" val falsee = "FALSE" fun bool b = if b then truee else falsee fun args (ss: string list): string = concat ("(" :: List.separate (ss, ", ") @ [")"]) fun callNoSemi (f: string, xs: string list): string = concat [f, " ", args xs] fun call (f, xs) = concat [f, " ", args xs, ";\n"] fun int (i: int) = if i >= 0 then Int.toString i else concat ["-", Int.toString (~ i)] val bytes = int o Bytes.toInt fun string s = let val quote = "\"" (* " *) in concat [quote, String.escapeC s, quote] end end structure RealX = struct open RealX fun toCType r = CType.real (size r) fun toC (r: t): string = (* SML uses "inf" and "nan", C uses "INFINITY" and "NAN" *) case toString (r, {suffix = false}) of "~inf" => "-INFINITY" | "inf" => "INFINITY" | "nan" => "NAN" | s => concat ["(", CType.toString (toCType r), ")(", (* SML uses "~", C uses "-" *) String.translate (s, fn #"~" => "-" | c => String.fromChar c), ")"] end structure WordX = struct open WordX fun toCType w = CType.word (size w, {signed = false}) fun toC (w: t): string = concat ["(", CType.toString (toCType w), ")(", toString (w, {suffix = false}), "ull)"] end structure Const = struct local structure RealX' = RealX structure WordX' = WordX in open Const structure RealX = RealX' structure WordX = WordX' end fun toC (c: t): string = case c of CSymbol (CSymbol.T {name, ...}) => concat ["((", CType.toString CType.cpointer, ")(&", name, "))"] | Null => "NULL" | Real r => RealX.toC r | Word w => WordX.toC w | _ => Error.bug "CCodegen.Const.toC" end structure Type = struct open Type fun toC (t: t): string = CType.toString (Type.toCType t) end structure StaticHeap = struct open StaticHeap structure Ref = struct open Ref fun toC (T {kind, index, ty, ...}) = concat ["(", CType.toString (Type.toCType ty), ")(&", Label.toString (Kind.label kind), ".obj", C.int index, ".data)"] end structure Elem = struct open Elem fun toC e = case e of Cast (z, ty) => concat ["(", Type.toC ty, ")", toC z] | Const c => Const.toC c | Ref r => Ref.toC r end end structure Operand = struct open Operand fun isMem (z: t): bool = case z of Cast (z, _) => isMem z | Offset _ => true | SequenceOffset _ => true | StackOffset _ => true | _ => false end fun implementsPrim (p: 'a Prim.t): bool = let datatype z = datatype Prim.t in case p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | Real_Math_acos _ => true | Real_Math_asin _ => true | Real_Math_atan _ => true | Real_Math_atan2 _ => true | Real_Math_cos _ => true | Real_Math_exp _ => true | Real_Math_ln _ => true | Real_Math_log10 _ => true | Real_Math_sin _ => true | Real_Math_sqrt _ => true | Real_Math_tan _ => true | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => true | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => true | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_muladd _ => true | Real_mulsub _ => true | Real_neg _ => true | Real_qequal _ => true | Real_rndToReal _ => true | Real_rndToWord _ => true | Real_round _ => true | Real_sub _ => true | Thread_returnToC => false | Word_add _ => true | Word_addCheckP _ => true | Word_andb _ => true | Word_castToReal _ => true | Word_equal _ => true | Word_extdToWord _ => true | Word_lshift _ => true | Word_lt _ => true | Word_mul _ => true | Word_mulCheckP _ => true | Word_neg _ => true | Word_negCheckP _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot _ => true | Word_rem _ => true | Word_rndToReal _ => (* Real coercions depend on rounding mode and can't be * inlined where gcc might constant-fold them. *) false | Word_rol _ => true | Word_ror _ => true | Word_rshift _ => true | Word_sub _ => true | Word_subCheckP _ => true | Word_xorb _ => true | _ => Error.bug ("CCodegen.implementsPrim: " ^ Prim.toString p) end fun outputIncludes (includes, print) = List.foreach (includes, fn i => (print "#include <"; print i; print ">\n")) fun declareGlobals (prefix: string, print) = let fun prints ss = List.foreach (ss, print) val _ = List.foreach (CType.all, fn t => let val n = Global.numberOfType t in if n > 0 then let val s = CType.toString t in prints [prefix, s, " global", s, " [", C.int n, "];\n"] end else () end) in () end fun outputDeclarations {additionalMainArgs: string list, includes: string list, print: string -> unit, program = (Program.T {frameInfos, frameOffsets, globals, maxFrameSize, objectTypes, sourceMaps, staticHeaps, ...}), rest: unit -> unit }: unit = let fun prints ss = List.foreach (ss, print) fun declareExports () = Ffi.declareExports {print = print} fun tyconTy tycon = Vector.sub (objectTypes, ObjptrTycon.index tycon) fun declareGlobals () = List.foreach (CType.all, fn t => let val n = Global.numberOfType t fun doit init = let val s = CType.toString t in prints ["PRIVATE ", s, " global", s, "[", C.int n, "]"] ; Option.app (init, fn vs => (print " = {" ; List.foreachi (vs, fn (i,v) => (if i > 0 then print ", " else () ; print v)) ; print "}")) ; print ";\n" end fun doit' (sel, check, default, toC) = (doit o SOME o List.tabulate) (n, fn i => case List.peek (sel globals, fn (v, g) => Int.equals (i, Global.index g) andalso check v) of NONE => default | SOME (v, _) => toC v) fun doitReal rs = doit' (#reals, fn r => RealSize.equals (rs, RealX.size r), RealX.toC (RealX.zero rs), RealX.toC) fun doitObjptr () = doit' (#objptrs, fn _ => true, concat ["(", CType.toString CType.Objptr, ")", WordX.toC (WordX.one (WordSize.objptr ()))], StaticHeap.Ref.toC) in case (n > 0, t) of (_, CType.Objptr) => doitObjptr () | (true, CType.Real32) => doitReal RealSize.R32 | (true, CType.Real64) => doitReal RealSize.R64 | (true, _) => doit NONE | _ => () end) fun declareLoadSaveGlobals () = let val unused = List.forall (CType.all, fn t => Global.numberOfType t = 0) val _ = (print "static int saveGlobals (" ; if unused then print "__attribute__ ((unused))" else () ; print " FILE *f) {\n" ; (List.foreach (CType.all, fn t => if Global.numberOfType t > 0 then prints ["\tSaveArray (global", CType.toString t, ", f);\n"] else ())) ; print "\treturn 0;\n}\n") val _ = (print "static int loadGlobals (" ; if unused then print "__attribute__ ((unused))" else () ; print " FILE *f) {\n" ; (List.foreach (CType.all, fn t => if Global.numberOfType t > 0 then prints ["\tLoadArray (global", CType.toString t, ", f);\n"] else ())) ; print "\treturn 0;\n}\n") in () end fun declareStaticHeaps () = let open StaticHeap val declareCSymbol = let val seen = String.memoize (fn _ => ref false) in fn CSymbol.T {name, cty, symbolScope} => let fun doit () = (print o concat) [case symbolScope of CSymbolScope.External => "EXTERNAL " | CSymbolScope.Private => "PRIVATE " | CSymbolScope.Public => "PUBLIC ", "extern ", CType.toString (Option.fold (cty, CType.Word8, #1)), " ", name, ";\n"] val seen = seen name in if !seen then () else (seen := true; doit ()) end end fun sym k = Label.toString (Kind.label k) fun ty k = concat [sym k, "Ty"] fun mkPadTy (next, offset) = if Bytes.equals (next, offset) then NONE else let val psize = Bytes.- (offset, next) val pad = concat [CType.toString CType.Word8, " pad", Bytes.toString next, "[", Bytes.toString psize, "]"] in SOME pad end fun mkFieldTys (init, size) = let fun maybePad (next, offset, fieldTys) = Option.fold (mkPadTy (next, offset), fieldTys, op ::) val (fieldTys, next) = Vector.fold (init, ([], Bytes.zero), fn ({offset, src}, (fieldTys, next)) => let val fieldTys = maybePad (next, offset, fieldTys) val fldCType = Type.toCType (Elem.ty src) val fld = concat [CType.toString fldCType, " fld", Bytes.toString offset] in (fld::fieldTys, Bytes.+ (offset, CType.size fldCType)) end) val fieldTys = maybePad (next, size, fieldTys) in List.rev fieldTys end val headerTy = CType.objptrHeader () val counterTy = CType.seqIndex () val lengthTy = CType.seqIndex () fun mkPad (next, offset) = if Bytes.equals (next, offset) then NONE else let val psize = Bytes.- (offset, next) val pad = (C.string o String.tabulate) (Bytes.toInt psize, fn _ => #"\000") in SOME pad end fun mkFields (init, size) = let fun maybePad (next, offset, fields) = Option.fold (mkPad (next, offset), fields, op ::) val (fields, next) = Vector.fold (init, ([], Bytes.zero), fn ({offset, src}, (fields, next)) => let val fields = maybePad (next, offset, fields) val fldCType = Type.toCType (Elem.ty src) val fld = Elem.toC src in (fld::fields, Bytes.+ (offset, CType.size fldCType)) end) val fields = maybePad (next, size, fields) in List.rev fields end fun mkHeader tycon = WordX.toC (ObjptrTycon.toHeader tycon) val counter = WordX.toC (WordX.zero (WordSize.seqIndex ())) fun mkLength length = WordX.toC (WordX.fromInt (length, WordSize.seqIndex ())) val _ = List.foreach (Kind.all, fn k => (print "typedef " ; (case k of Kind.Dynamic => print "const " | Kind.Immutable => print "const " | _ => ()) ; print "struct __attribute__ ((aligned(16), packed)) {\n" ; (Vector.foreachi (staticHeaps k, fn (i, obj) => (print "struct __attribute__ ((packed)) {" ; (case obj of Object.Normal {init, tycon} => let val size = ObjectType.componentsSize (tyconTy tycon) in print "struct __attribute__ ((packed)) {" ; print (CType.toString headerTy) ; print " header;" ; print "} metadata;" ; print " " ; print "struct __attribute__ ((packed)) {" ; List.foreachi (mkFieldTys (init, size), fn (i, fldTy) => (if i > 0 then print " " else () ; print fldTy ; print ";")) ; print "} data;" end | Object.Sequence {init, tycon} => let val {components, ...} = ObjectType.deSequence (tyconTy tycon) val size = ObjectType.componentsSize (tyconTy tycon) val length = Vector.length init in print "struct __attribute__ ((packed)) {" ; print (CType.toString counterTy) ; print " counter;" ; print " " ; print (CType.toString lengthTy) ; print " length;" ; print " " ; print (CType.toString headerTy) ; print " header;" ; print "} metadata;" ; print " " ; if Prod.length components = 1 andalso Type.equals (#elt (Prod.first components), Type.word WordSize.word8) then print (CType.toString CType.Word8) else (print "struct __attribute__ ((packed)) {" ; if length > 0 then List.foreachi (mkFieldTys (Vector.first init, size), fn (i, fldTy) => (if i > 0 then print " " else () ; print fldTy ; print ";")) else () ; print "}") ; print " data[" ; print (C.int length) ; print "];" ; let val next = Bytes.+ (Runtime.sequenceMetaDataSize (), Bytes.* (size, IntInf.fromInt length)) val size = case !Control.align of Control.Align4 => Bytes.alignWord32 next | Control.Align8 => Bytes.alignWord64 next in Option.app (mkPadTy (next, size), fn pad => (print " " ; print pad ; print ";")) end end) ; print "} obj" ; print (C.int i) ; print ";\n"))) ; print "struct __attribute__ ((packed)) {} end;\n" ; print "} " ; print (ty k) ; print ";\n")) val _ = List.foreach (Kind.all, fn k => (print "PRIVATE " ; print (ty k) ; print " " ; print (sym k) ; print ";\n")) val _ = List.foreach (Kind.all, fn k => Vector.foreach (staticHeaps k, fn obj => let datatype z = datatype Elem.t fun loopElem e = case e of Cast (e, _) => loopElem e | Const (Const.CSymbol s) => declareCSymbol s | Const _ => () | Ref _ => () fun loopInit init = Vector.foreach (init, fn {offset = _, src} => loopElem src) in case obj of Object.Normal {init, ...} => loopInit init | Object.Sequence {init, ...} => Vector.foreach (init, loopInit) end)) val _ = List.foreach (Kind.all, fn k => (print "PRIVATE " ; print (ty k) ; print " " ; print (sym k) ; print " = {\n" ; (Vector.foreach (staticHeaps k, fn obj => (print "{" ; (case obj of Object.Normal {init, tycon} => let val size = ObjectType.componentsSize (tyconTy tycon) in print "{" ; print (mkHeader tycon) ; print "," ; print "}," ; print "{" ; List.foreach (mkFields (init, size), fn fld => (print fld; print ",")) ; print "}," end | Object.Sequence (arg as {init, tycon}) => let val size = ObjectType.componentsSize (tyconTy tycon) val length = Vector.length init in print "{" ; print counter ; print "," ; print (mkLength length) ; print "," ; print (mkHeader tycon) ; print "," ; print "}," ; (case (Object.deString arg, length > 0) of (SOME s, true) => print (C.string s) | _ => (print "{" ; Vector.foreach (init, fn init => (print "{" ; List.foreach (mkFields (init, size), fn fld => (print fld; print ",")) ; print "},")) ; print "}")) ; print "," ; let val next = Bytes.+ (Runtime.sequenceMetaDataSize (), Bytes.* (size, IntInf.fromInt length)) val size = case !Control.align of Control.Align4 => Bytes.alignWord32 next | Control.Align8 => Bytes.alignWord64 next in Option.app (mkPad (next, size), fn pad => (print pad ; print ",")) end end) ; print "},\n"))) ; print "{},\n" ; print "};\n")) in () end fun declareArray (ty: string, name: string, {firstElemLen: bool, oneline: bool}, data: 'a vector, elemToString: int * 'a -> string) = (print "static "; print ty; print " "; print name; print "[" ; print (C.int (if firstElemLen then 1 + Vector.length data else Vector.length data)) ; print "] = {" ; if oneline then () else print "\n" ; if firstElemLen then (print (C.int (Vector.length data)) ; print ",") else () ; Vector.foreachi (data, fn (i, x) => (if oneline then () else (print "\t /* "; print (C.int i); print ": */ ") ; print (elemToString (i, x)); print "," ; if oneline then () else print "\n")) ; print "};\n") fun declareFrameInfos () = (Vector.foreachi (frameOffsets, fn (i, fo) => declareArray ("const uint16_t", concat ["frameOffsets", C.int i], {firstElemLen = true, oneline = true}, FrameOffsets.offsets fo, fn (_, offset) => C.bytes offset)) ; declareArray ("const struct GC_frameInfo", "frameInfos", {firstElemLen = false, oneline = false}, frameInfos, fn (_, fi) => concat ["{", FrameInfo.Kind.toString (FrameInfo.kind fi), ", frameOffsets", C.int (FrameOffsets.index (FrameInfo.frameOffsets fi)), ", ", C.bytes (FrameInfo.size fi), ", ", (case FrameInfo.sourceSeqIndex fi of NONE => C.int 0 | SOME ssi => C.int ssi), "}"])) fun declareAtMLtons () = declareArray ("char *", "atMLtons", {firstElemLen = false, oneline = true}, !Control.atMLtons, fn (_, s) => C.string s) fun declareObjectTypes () = declareArray ("const struct GC_objectType", "objectTypes", {firstElemLen = false, oneline = false}, objectTypes, fn (_, ty) => let datatype z = datatype Runtime.RObjectType.t val (tag, hasIdentity, bytesNonObjptrs, numObjptrs) = case ObjectType.toRuntime ty of Normal {hasIdentity, bytesNonObjptrs, numObjptrs} => ("NORMAL_TAG", hasIdentity, Bytes.toInt bytesNonObjptrs, numObjptrs) | Sequence {hasIdentity, bytesNonObjptrs, numObjptrs} => ("SEQUENCE_TAG", hasIdentity, Bytes.toInt bytesNonObjptrs, numObjptrs) | Stack => ("STACK_TAG", false, 0, 0) | Weak {gone} => let val bytesObjptr = Bits.toBytes (Control.Target.Size.objptr ()) val bytesNonObjptrs = let val align = case !Control.align of Control.Align4 => Bytes.fromInt 4 | Control.Align8 => Bytes.fromInt 8 val bytesMetaData = Bits.toBytes (Control.Target.Size.normalMetaData ()) val bytesCPointer = Bits.toBytes (Control.Target.Size.cpointer ()) val bytesObject = Bytes.+ (bytesMetaData, Bytes.+ (bytesCPointer, bytesObjptr)) val bytesTotal = Bytes.align (bytesObject, {alignment = align}) val bytesPad = Bytes.- (bytesTotal, bytesObject) in Bytes.+ (bytesPad, bytesCPointer) end val (bytesNonObjptrs, bytesObjptr) = (Bytes.toInt bytesNonObjptrs, Bytes.toInt bytesObjptr) val (bytesNonObjptrs, numObjptrs) = if gone then (bytesNonObjptrs + bytesObjptr, 0) else (bytesNonObjptrs, 1) in ("WEAK_TAG", false, bytesNonObjptrs, numObjptrs) end in concat ["{", tag, ", ", C.bool hasIdentity, ", ", C.int bytesNonObjptrs, ", ", C.int numObjptrs, "}"] end) fun declareMLtonMain () = let val align = case !Control.align of Control.Align4 => 4 | Control.Align8 => 8 val magic = let val version = String.hash Version.version val random = Random.word () val magic = Word.orb (Word.<< (version, Word.fromInt (Word.wordSize - 8)), Word.>> (random, Word.fromInt 8)) in WordX.fromWord (magic, WordSize.word32) end val profile = case !Control.profile of Control.ProfileNone => "PROFILE_NONE" | Control.ProfileAlloc => "PROFILE_ALLOC" | Control.ProfileCallStack => "PROFILE_NONE" | Control.ProfileCount => "PROFILE_COUNT" | Control.ProfileDrop => "PROFILE_NONE" | Control.ProfileLabel => "PROFILE_NONE" | Control.ProfileTimeField => "PROFILE_TIME_FIELD" | Control.ProfileTimeLabel => "PROFILE_TIME_LABEL" in print (C.callNoSemi (case !Control.format of Control.Archive => "MLtonLibrary" | Control.Executable => "MLtonMain" | Control.LibArchive => "MLtonLibrary" | Control.Library => "MLtonLibrary", [C.int align, WordX.toC magic, C.bytes maxFrameSize, C.bool (!Control.markCards), profile, C.bool (!Control.profileStack)] @ additionalMainArgs)) ; print "\n" end fun declareMain () = if !Control.emitMain andalso !Control.format = Control.Executable then print "int main (int argc, char* argv[]) { return (MLton_main (argc, argv)); }\n" else () fun declareSourceMaps () = let fun declareProfileLabel (l, print) = print (C.call ("DeclareProfileLabel", [ProfileLabel.toString l])) fun doit (SourceMaps.T {profileLabelInfos, sourceNames, sourceSeqs, sources}) = (Vector.foreach (profileLabelInfos, fn {profileLabel, ...} => declareProfileLabel (profileLabel, print)) ; declareArray ("struct GC_profileLabelInfo", "profileLabelInfos", {firstElemLen = false, oneline = false}, profileLabelInfos, fn (_, {profileLabel, sourceSeqIndex}) => concat ["{(pointer)&", ProfileLabel.toString profileLabel, ", ", C.int sourceSeqIndex, "}"]) ; declareArray ("const char * const", "sourceNames", {firstElemLen = false, oneline = false}, sourceNames, fn (_, s) => C.string s) ; Vector.foreachi (sourceSeqs, fn (i, ss) => declareArray ("const GC_sourceIndex", concat ["sourceSeq", C.int i], {firstElemLen = true, oneline = true}, ss, fn (_, {sourceIndex}) => C.int sourceIndex)) ; declareArray ("const uint32_t * const", "sourceSeqs", {firstElemLen = false, oneline = false}, sourceSeqs, fn (i, _) => concat ["sourceSeq", Int.toString i]) ; declareArray ("const struct GC_source", "sources", {firstElemLen = false, oneline = false}, sources, fn (_, {sourceNameIndex, successorSourceSeqIndex}) => concat ["{ ", Int.toString sourceNameIndex, ", ", Int.toString successorSourceSeqIndex, " }"])) in case sourceMaps of NONE => doit SourceMaps.empty | SOME z => doit z end in outputIncludes (includes, print); print "\n" ; declareStaticHeaps (); print "\n" ; declareGlobals (); print "\n" ; declareLoadSaveGlobals (); print "\n" ; declareFrameInfos (); print "\n" ; declareObjectTypes (); print "\n" ; declareSourceMaps (); print "\n" ; declareAtMLtons (); print "\n" ; rest (); print "\n" ; declareMLtonMain (); declareMain (); print "\n" ; declareExports () end structure StackOffset = struct open StackOffset fun toString (T {offset, ty}): string = concat ["S", C.args [Type.toC ty, C.bytes offset]] end fun declareFFI (chunks, print) = let val empty = ref true val seen = String.memoize (fn _ => ref false) fun doit (name: string, declare: unit -> string): unit = let val r = seen name in if !r then () else (r := true; empty := false; print (declare ())) end fun doitCSymbol (CSymbol.T {cty, name, symbolScope}) = let datatype z = datatype CSymbolScope.t val cty = Option.fold (cty, CType.Word8, #1) in doit (name, fn () => concat [case symbolScope of External => "EXTERNAL " | Private => "PRIVATE " | Public => "PUBLIC ", "extern ", CType.toString cty, " ", name, ";\n"]) end fun doitOperand z = case z of Operand.Cast (z, _) => doitOperand z | Operand.Const (Const.CSymbol sym) => doitCSymbol sym | Operand.Offset {base, ...} => doitOperand base | Operand.SequenceOffset {base, index, ...} => (doitOperand base; doitOperand index) | _ => () in List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => let val _ = Vector.foreach (statements, fn s => Statement.foldOperands (s, (), doitOperand o #1)) val _ = case transfer of Transfer.CCall {func, ...} => let datatype z = datatype CFunction.Target.t val CFunction.T {target, ...} = func in case target of Direct "Thread_returnToC" => () | Direct name => doit (name, fn () => concat [CFunction.cPrototype func, ";\n"]) | Indirect => () end | _ => () val () = Transfer.foldOperands (transfer, (), doitOperand o #1) in () end)) ; if !empty then () else print "\n" end fun output {program as Machine.Program.T {chunks, frameInfos, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} = let val {get = labelInfo: Label.t -> {block: Block.t, chunkLabel: ChunkLabel.t, index: int option, marked: bool ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CCodeGen.labelInfo", Label.layout)) val nextChunks = Array.new (Vector.length frameInfos, NONE) val _ = List.foreach (chunks, fn Chunk.T {blocks, chunkLabel, ...} => Vector.foreach (blocks, fn block as Block.T {kind, label, ...} => let val index = case Kind.frameInfoOpt kind of NONE => NONE | SOME fi => let val index = FrameInfo.index fi in if Kind.isEntry kind then Array.update (nextChunks, index, SOME label) else () ; SOME index end in setLabelInfo (label, {block = block, chunkLabel = chunkLabel, index = index, marked = ref false}) end)) val nextChunks = Vector.keepAllMap (Vector.fromArray nextChunks, fn lo => lo) val labelChunk = #chunkLabel o labelInfo val labelIndex = valOf o #index o labelInfo fun labelIndexAsString (l, {pretty}) = let val s = C.int (labelIndex l) in if pretty then concat ["/* ", Label.toString l, " */ ", s] else s end val amTimeProfiling = !Control.profile = Control.ProfileTimeField orelse !Control.profile = Control.ProfileTimeLabel fun declareChunk (chunkLabel, print: string -> unit) = (print "PRIVATE extern ChunkFn_t " ; print (ChunkLabel.toString chunkLabel) ; print ";\n") fun declareNextChunks (chunks, print) = let val {destroy, get} = Property.destGet (ChunkLabel.plist, Property.initFun (fn _ => ref false)) val declareChunk = fn chunkLabel => let val seen = get chunkLabel in if !seen then () else (seen := true ; declareChunk (chunkLabel, print)) end in List.foreach (chunks, fn Chunk.T {chunkLabel, blocks, ...} => (declareChunk chunkLabel ; Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Transfer.Call {label, ...} => declareChunk (labelChunk label) | Transfer.Raise {raisesTo, ...} => List.foreach (raisesTo, declareChunk o labelChunk) | Transfer.Return {returnsTo, ...} => List.foreach (returnsTo, declareChunk o labelChunk) | _ => ()))) ; destroy () ; print "PRIVATE extern const ChunkFnPtr_t nextChunks[];\n" end val handleMisaligned = let open Control in !align = Align4 andalso (case !Control.Target.arch of Target.HPPA => true | Target.Sparc => true | _ => false) end val handleMisaligned = fn ty => handleMisaligned andalso (Type.equals (ty, Type.real R64) orelse Type.equals (ty, Type.word WordSize.word64)) fun addr z = concat ["&(", z, ")"] fun fetch (z, ty) = concat [CType.toString (Type.toCType ty), "_fetch(", addr z, ")"] fun move' ({dst, src}, ty) = concat [CType.toString (Type.toCType ty), "_move(", addr dst, ", ", addr src, ");\n"] fun store ({dst, src}, ty) = concat [CType.toString (Type.toCType ty), "_store(", addr dst, ", ", src, ");\n"] fun move {dst: string, dstIsMem: bool, src: string, srcIsMem: bool, ty: Type.t}: string = if handleMisaligned ty then (case (dstIsMem, srcIsMem) of (false, false) => concat [dst, " = ", src, ";\n"] | (false, true) => concat [dst, " = ", fetch (src, ty), ";\n"] | (true, false) => store ({dst = dst, src = src}, ty) | (true, true) => move' ({dst = dst, src = src}, ty)) else concat [dst, " = ", src, ";\n"] fun creturnName (ct: CType.t): string = concat ["CReturn", CType.name ct] fun temporaryName (ct, i) = concat ["T", C.args [CType.name ct, Int.toString i]] local datatype z = datatype Operand.t fun toString (z: Operand.t): string = case z of Cast (z, ty) => concat ["(", Type.toC ty, ")", toString z] | Const c => Const.toC c | Frontier => "Frontier" | GCState => "GCState" | Global g => concat ["G", C.args [Type.toC (Global.ty g), Int.toString (Global.index g)]] | Label l => labelIndexAsString (l, {pretty = true}) | Offset {base, offset, ty} => concat ["O", C.args [Type.toC ty, toString base, C.bytes offset]] | SequenceOffset {base, index, offset, scale, ty} => concat ["X", C.args [Type.toC ty, toString base, toString index, Scale.toString scale, C.bytes offset]] | StackOffset s => StackOffset.toString s | StackTop => "StackTop" | StaticHeapRef h => concat ["H", C.args [Type.toC (StaticHeap.Ref.ty h), StaticHeap.Kind.name (StaticHeap.Ref.kind h), C.bytes (StaticHeap.Ref.offset h)]] | Temporary t => temporaryName (Type.toCType (Temporary.ty t), Temporary.index t) in val operandToString = toString end val chunkArgs = [Operand.GCState, Operand.StackTop, Operand.Frontier] fun fetchOperand (z: Operand.t): string = if handleMisaligned (Operand.ty z) andalso Operand.isMem z then fetch (operandToString z, Operand.ty z) else operandToString z fun outputChunkFn (Chunk.T {chunkLabel, blocks, tempsMax, ...}, print) = let val selfChunk = chunkLabel fun prints ss = List.foreach (ss, print) fun declareVar' (name, ty, unused, init) = (print "\t" ; if unused then print "UNUSED " else () ; print ty ; print " " ; print name ; case init of NONE => () | SOME v => (print " = "; print v) ; print ";\n") fun declareVar (name, ct, unused, init) = declareVar' (name, CType.toString ct, unused, init) fun outputStatement s = let datatype z = datatype Statement.t in case s of Move {dst, src} => (print "\t" ; print (move {dst = operandToString dst, dstIsMem = Operand.isMem dst, src = operandToString src, srcIsMem = Operand.isMem src, ty = Operand.ty dst})) | PrimApp {args, dst, prim} => let fun call (): string = C.callNoSemi (Prim.toString prim, Vector.toListMap (args, fetchOperand)) val _ = print "\t" in case dst of NONE => (print (call ()) ; print ";\n") | SOME dst => print (move {dst = operandToString dst, dstIsMem = Operand.isMem dst, src = call (), srcIsMem = false, ty = Operand.ty dst}) end | ProfileLabel _ => Error.bug "CCodegen.outputStatement: ProfileLabel" end local fun mk (dst, src) () = outputStatement (Statement.Move {dst = dst, src = src}) val stackTop = Operand.StackTop val gcStateStackTop = Operand.gcField GCField.StackTop val frontier = Operand.Frontier val gcStateFrontier = Operand.gcField GCField.Frontier in val cacheStackTop = mk (stackTop, gcStateStackTop) val flushStackTop = mk (gcStateStackTop, stackTop) val cacheFrontier = mk (frontier, gcStateFrontier) val flushFrontier = mk (gcStateFrontier, frontier) end (* StackTop += size *) fun adjStackTop (size: Bytes.t) = (outputStatement (Statement.PrimApp {args = Vector.new2 (Operand.StackTop, Operand.word (WordX.fromBytes (size, WordSize.cptrdiff ()))), dst = SOME Operand.StackTop, prim = Prim.CPointer_add}) ; if amTimeProfiling then flushStackTop () else ()) fun pop (fi: FrameInfo.t) = adjStackTop (Bytes.~ (FrameInfo.size fi)) fun push (return: Label.t, size: Bytes.t) = (outputStatement (Statement.Move {dst = Operand.stackOffset {offset = Bytes.- (size, Runtime.labelSize ()), ty = Type.label return}, src = Operand.Label return}) ; adjStackTop size) fun copyArgs (args: Operand.t vector): string list * (unit -> unit) = let fun usesStack z = case z of Operand.Cast (z, _) => (usesStack z) | Operand.Offset {base, ...} => (usesStack base) | Operand.SequenceOffset {base, index, ...} => (usesStack base) orelse (usesStack index) | Operand.StackOffset _ => true | _ => false in if Vector.exists (args, usesStack) then let val _ = print "\t{\n" val nextTmp = Counter.generator 0 val args = Vector.toListMap (args, fn arg => if usesStack arg then let val ty = Operand.ty arg val tmp = concat ["tmp", Int.toString (nextTmp ())] val _ = declareVar (tmp, Type.toCType ty, false, SOME (fetchOperand arg)) in tmp end else fetchOperand arg) in (args, fn () => print "\t}\n") end else (Vector.toListMap (args, fetchOperand), fn () => ()) end fun gotoLabel (l, {tab}) = prints [if tab then "\tgoto " else "goto ", Label.toString l, ";\n"] (* LeaveChunk(nextChunk, nextBlock) if (TailCall) { return nextChunk(gcState, stackTop, frontier, nextBlock); } else { flushFrontier(); flushStackTop(); return nextBlock; } *) fun leaveChunk (nextChunk, nextBlock) = if !Control.chunkTailCall then (print "\treturn " ; print (C.call (nextChunk, List.map (chunkArgs, operandToString) @ [nextBlock]))) else (flushFrontier () ; flushStackTop () ; print "\treturn " ; print nextBlock ; print ";\n") (* IndJump(mustReturnToSelf, mayReturnToSelf, mustReturnToOther) nextBlock = *(uintptr_t* )(StackTop - sizeof(uintptr_t)); if (mustReturnToSelf) { goto doSwitchNextBlock; } else { ChunkFnPtr_t nextChunk = nextChunks[nextBlock]; if (mayReturnToSelf && (nextChunk == selfChunk)) { goto doSwitchNextBlock; } if (mustReturnToOther != NULL) { LeaveChunk( *mustReturnToOther, nextBlock); } else { LeaveChunk( *nextChunk, nextBlock); } } *) fun indJump (mustReturnToSelf, mayReturnToSelf, mustReturnToOther) = let val _ = print "\tnextBlock = " val _ = print (operandToString (Operand.stackOffset {offset = Bytes.~ (Runtime.labelSize ()), ty = Type.label (Label.newNoname ())})) val _ = print ";\n" in if mustReturnToSelf then print "\tgoto doSwitchNextBlock;\n" else let val doNextChunk = Promise.delay (fn () => print "\tnextChunk = nextChunks[nextBlock];\n") val _ = if mayReturnToSelf then (Promise.force doNextChunk ; print "\tif (nextChunk == &" ; print (ChunkLabel.toString selfChunk) ; print ") { goto doSwitchNextBlock; }\n") else () val _ = case mustReturnToOther of NONE => (Promise.force doNextChunk; leaveChunk ("(*nextChunk)", "nextBlock")) | SOME dstChunk => leaveChunk (ChunkLabel.toString dstChunk, "nextBlock") in () end end fun outputTransfer t = let datatype z = datatype Transfer.t fun jump label = let val dstChunk = labelChunk label in if ChunkLabel.equals (dstChunk, selfChunk) then gotoLabel (label, {tab = true}) else leaveChunk (ChunkLabel.toString dstChunk, labelIndexAsString (label, {pretty = true})) end fun rtrans rsTo = let val mustRToOne = case rsTo of [] => NONE | l::rsTo => if List.forall (rsTo, fn l' => Label.equals (l, l')) then SOME l else NONE fun isSelf c = ChunkLabel.equals (selfChunk, c) val rsTo = List.fold (rsTo, [], fn (l, cs) => let val c = labelChunk l in if List.contains (cs, c, ChunkLabel.equals) then cs else c::cs end) val mayRToSelf = List.exists (rsTo, isSelf) val (mustRToSelf, mustRToOther) = case List.revKeepAll (rsTo, not o isSelf) of [] => (true, NONE) | c::rsTo => (false, if List.forall (rsTo, fn c' => ChunkLabel.equals (c, c')) then SOME c else NONE) in case (!Control.chunkMustRToSingOpt, mustRToOne) of (true, SOME dst) => jump dst | _ => indJump (!Control.chunkMustRToSelfOpt andalso mustRToSelf, !Control.chunkMayRToSelfOpt andalso mayRToSelf, if (!Control.chunkMustRToOtherOpt andalso (!Control.chunkMayRToSelfOpt orelse not mayRToSelf)) then mustRToOther else NONE) end val _ = if !Control.codegenComments > 0 then (print "\t/* " ; print (Layout.toString (Transfer.layout t)) ; print " */\n") else () in case t of CCall {func = CFunction.T {target = CFunction.Target.Direct "Thread_returnToC", ...}, return = SOME {return, size = SOME size}, ...} => (push (return, size); flushFrontier (); flushStackTop (); print "\treturn "; print (C.call ("Thread_returnToC", []))) | CCall {args, func, return} => let val CFunction.T {return = returnTy, target, ...} = func val (args, afterCall) = case return of NONE => (Vector.toListMap (args, fetchOperand), fn () => ()) | SOME {size = NONE, ...} => (Vector.toListMap (args, fetchOperand), fn () => ()) | SOME {return, size = SOME size} => let val res = copyArgs args val _ = push (return, size) in res end val _ = if CFunction.modifiesFrontier func then flushFrontier () else () val _ = if CFunction.readsStackTop func then flushStackTop () else () val _ = print "\t" val _ = if Type.isUnit returnTy then () else prints [creturnName (Type.toCType returnTy), " = "] datatype z = datatype CFunction.Target.t val _ = case target of Direct name => print (C.call (name, args)) | Indirect => let val (fptr,args) = case args of (fptr::args) => (fptr, args) | _ => Error.bug "CCodegen.outputTransfer: CCall,Indirect" val name = concat ["(*(", CFunction.cPointerType func, " ", fptr, "))"] in print (C.call (name, args)) end val _ = afterCall () val _ = if CFunction.modifiesFrontier func then cacheFrontier () else () val _ = if CFunction.writesStackTop func then cacheStackTop () else () val _ = if CFunction.maySwitchThreadsFrom func then indJump (false, true, NONE) else (case return of NONE => (print "\treturn " ; print (C.call ("MLton_unreachable", []))) | SOME {return, ...} => gotoLabel (return, {tab = true})) in () end | Call {label, return, ...} => (Option.app (return, fn {return, size, ...} => push (return, size)) ; jump label) | Goto dst => gotoLabel (dst, {tab = true}) | Raise {raisesTo} => (outputStatement (Statement.PrimApp {args = Vector.new2 (Operand.gcField GCField.StackBottom, Operand.gcField GCField.ExnStack), dst = SOME Operand.StackTop, prim = Prim.CPointer_add}) ; rtrans raisesTo) | Return {returnsTo} => rtrans returnsTo | Switch (Switch.T {cases, default, expect, test, ...}) => let val test = operandToString test val test = case expect of NONE => test | SOME w => concat ["Expect (", test, ", ", WordX.toC w, ")"] fun bnz (lnz, lz) = (print "\tif (" ; print test ; print ") goto " ; print (Label.toString lnz) ; print "; else goto " ; print (Label.toString lz) ; print ";\n") fun switch () = (print "\tswitch (" ; print test ; print ") {\n" ; Vector.foreach (cases, fn (w, l) => (print "\tcase " ; print (WordX.toC w) ; print ": " ; gotoLabel (l, {tab = false}))) ; print "\tdefault: " ; (case default of NONE => print (C.call ("Unreachable", [])) | SOME default => gotoLabel (default, {tab = false})) ; print "\t}\n") in case (Vector.length cases, default) of (0, NONE) => Error.bug "CCodegen.outputTransfer: Switch" | (0, SOME ld) => gotoLabel (ld, {tab = true}) | (1, NONE) => gotoLabel (#2 (Vector.sub (cases, 0)), {tab = true}) | (1, SOME ld) => let val (w, l) = Vector.sub (cases, 0) in if WordX.isZero w then bnz (ld, l) else switch () end | (2, NONE) => let val (wa, la) = Vector.sub (cases, 0) val (wb, lb) = Vector.sub (cases, 1) in if WordX.isZero wa then bnz (lb, la) else if WordX.isZero wb then bnz (la, lb) else switch () end | _ => switch () end end val outputStatement = fn s => let val _ = if !Control.codegenComments > 1 then (print "\t/* " ; print (Layout.toString (Statement.layout s)) ; print " */\n") else () in outputStatement s end (* Fusing of adjacent `Word_` and `Word{S,U}_CheckP` * primitives *does not* depend on the relative order of `!a` and `?a` * in /basis-library/primitive/prim1.sml:mkOverflow *) fun outputStatementsFuseOpAndChk statements = (ignore o Vector.foldi) (statements, false, fn (i, s1, skip) => let fun default () = (outputStatement s1; false) in if skip then false else case s1 of Statement.PrimApp {args = args1, dst = SOME dst1, prim = prim1} => let fun fuse chk = (case Vector.sub (statements, i + 1) of s2 as Statement.PrimApp {args = args2, dst = SOME dst2, prim = prim2} => if Vector.equals (args1, args2, Operand.equals) then (case chk prim2 of NONE => default () | SOME (prim, (ws, {signed})) => let val name = String.substituteFirst (Prim.toString prim, {substring = "CheckP", replacement = "AndCheck"}) val _ = if !Control.codegenComments > 1 then (print "\t/* " ; print (Layout.toString (Statement.layout s1)) ; print " */\n" ; print "\t/* " ; print (Layout.toString (Statement.layout s2)) ; print " */\n") else () val _ = print "\t{\n" val _ = print "\tWord" val _ = print (if signed then "S" else "U") val _ = print (WordSize.toString ws) val _ = print " w;\n" val _ = print "\tBool b;\n" val _ = print "\t" val _ = print (C.call (name, Vector.toListMap (args1, fetchOperand) @ ["&w", "&b"])) val _ = print "\t" val _ = print (move {dst = operandToString dst1, dstIsMem = Operand.isMem dst1, src = "w", srcIsMem = false, ty = Operand.ty dst1}) val _ = print "\t" val _ = print (move {dst = operandToString dst2, dstIsMem = Operand.isMem dst2, src = "b", srcIsMem = false, ty = Operand.ty dst2}) val _ = print "\t}\n" in true end) else default () | _ => default ()) handle Subscript => default () in case prim1 of Prim.Word_add ws1 => fuse (fn prim2 => case prim2 of Prim.Word_addCheckP (z as (ws2, _)) => if WordSize.equals (ws1, ws2) then SOME (prim2, z) else NONE | _ => NONE) | Prim.Word_addCheckP (z as (ws1, _)) => fuse (fn prim2 => case prim2 of Prim.Word_add ws2 => if WordSize.equals (ws1, ws2) then SOME (prim1, z) else NONE | _ => NONE) | Prim.Word_mul (ws1, {signed = signed1}) => fuse (fn prim2 => case prim2 of Prim.Word_mulCheckP (z as (ws2, {signed = signed2})) => if WordSize.equals (ws1, ws2) andalso Bool.equals (signed1, signed2) then SOME (prim2, z) else NONE | _ => NONE) | Prim.Word_mulCheckP (z as (ws1, {signed = signed1})) => fuse (fn prim2 => case prim2 of Prim.Word_mul (ws2, {signed = signed2}) => if WordSize.equals (ws1, ws2) andalso Bool.equals (signed1, signed2) then SOME (prim1, z) else NONE | _ => NONE) | Prim.Word_neg ws1 => fuse (fn prim2 => case prim2 of Prim.Word_negCheckP (z as (ws2, _)) => if WordSize.equals (ws1, ws2) then SOME (prim2, z) else NONE | _ => NONE) | Prim.Word_negCheckP (z as (ws1, _)) => fuse (fn prim2 => case prim2 of Prim.Word_neg ws2 => if WordSize.equals (ws1, ws2) then SOME (prim1, z) else NONE | _ => NONE) | Prim.Word_sub ws1 => fuse (fn prim2 => case prim2 of Prim.Word_subCheckP (z as (ws2, _)) => if WordSize.equals (ws1, ws2) then SOME (prim2, z) else NONE | _ => NONE) | Prim.Word_subCheckP (z as (ws1, _)) => fuse (fn prim2 => case prim2 of Prim.Word_sub ws2 => if WordSize.equals (ws1, ws2) then SOME (prim1, z) else NONE | _ => NONE) | _ => default () end | _ => default () end) fun outputBlock (Block.T {kind, label, statements, transfer, ...}) = let val _ = prints [Label.toString label, ":\n"] val _ = case kind of Kind.Cont {frameInfo, ...} => pop frameInfo | Kind.CReturn {dst, frameInfo, ...} => (Option.app (frameInfo, pop) ; (Option.app (dst, fn x => let val x = Live.toOperand x val ty = Operand.ty x in print "\t" ; (print o move) {dst = operandToString x, dstIsMem = Operand.isMem x, src = creturnName (Type.toCType ty), srcIsMem = false, ty = ty} end))) | Kind.Func _ => () | Kind.Handler {frameInfo, ...} => pop frameInfo | Kind.Jump => () val _ = if !Control.codegenFuseOpAndChk then outputStatementsFuseOpAndChk statements else Vector.foreach (statements, outputStatement) val _ = outputTransfer transfer val _ = print "\n" in () end val dfsBlocks = ref [] fun visit label = let val {block as Block.T {transfer, ...}, marked, ...} = labelInfo label datatype z = datatype Transfer.t in if !marked then () else (marked := true; List.push (dfsBlocks, block); case transfer of CCall {return, ...} => Option.app (return, visit o #return) | Call _ => () | Goto dst => visit dst | Raise _ => () | Return _ => () | Switch (Switch.T {cases, default, ...}) => (Vector.foreach (cases, visit o #2); Option.app (default, visit))) end val entries = let val entries = ref [] val _ = Vector.foreach (blocks, fn Block.T {kind, label, ...} => if Kind.isEntry kind then (List.push (entries, (label, labelIndex label)) ; visit label) else ()) in List.insertionSort (!entries, fn ((_, i1), (_, i2)) => i1 <= i2) end val _ = print "PRIVATE uintptr_t " val _ = print (C.callNoSemi (ChunkLabel.toString chunkLabel, List.map (chunkArgs, fn oper => concat ["UNUSED ", CType.toString (Type.toCType (Operand.ty oper)), " ", operandToString oper]) @ ["uintptr_t nextBlock"])) val _ = print " {\n\n" val _ = declareVar' ("nextChunk", "ChunkFnPtr_t", true, NONE) val _ = List.foreach (CType.all, fn t => declareVar (creturnName t, t, true, NONE)) val _ = List.foreach (CType.all, fn t => Int.for (0, 1 + tempsMax t, fn i => declareVar (temporaryName (t, i), t, false, NONE))) val _ = print "\n" val _ = print "doSwitchNextBlock: UNUSED;\n" val _ = if !Control.chunkJumpTable then (print "\tstatic void* const nextLabels[" ; print (C.int (List.length entries)) ; print "] = {\n" ; List.foreach (entries, fn (label, index) => (print "\t/* " ; print (C.int index) ; print " */ &&" ; print (Label.toString label) ; print ",\n")) ; print "\t};\n" ; print "\tgoto *nextLabels[nextBlock - " ; print (C.int (#2 (List.first entries))) ; print "];\n\n") else (print "\tswitch (nextBlock) {\n" ; List.foreach (entries, fn (label, index) => (print "\tcase " ; print (C.int index) ; print ": goto " ; print (Label.toString label) ; print ";\n")) ; print "\tdefault: Unreachable();\n" ; print "\t}\n\n") val _ = List.foreach (List.rev (!dfsBlocks), outputBlock) val _ = print "} /* " val _ = print (ChunkLabel.toString chunkLabel) val _ = print " */\n\n" in () end fun declareStaticHeaps (prefix: string, print) = List.foreach (StaticHeap.Kind.all, fn k => print (concat [prefix, "PointerAux ", Label.toString (StaticHeap.Kind.label k), ";\n"])) fun outputChunks chunks = let val {done, print, ...} = outputC () in outputIncludes (["c-chunk.h"], print); print "\n" ; declareGlobals ("PRIVATE extern ", print); print "\n" ; declareStaticHeaps ("PRIVATE extern ", print); print "\n" ; declareNextChunks (chunks, print); print "\n" ; declareFFI (chunks, print) ; List.foreach (chunks, fn chunk => outputChunkFn (chunk, print)) ; done () end val chunksWithSizes = List.revMap (chunks, fn chunk as Chunk.T {blocks, ...} => (chunk, Vector.fold (blocks, 0, fn (Block.T {statements, ...}, n) => n + Vector.length statements + 1))) fun batch (chunksWithSizes, acc, n) = case chunksWithSizes of [] => outputChunks acc | (chunk, s)::chunksWithSizes' => let val m = n + s in if List.isEmpty acc orelse m <= !Control.chunkBatch then batch (chunksWithSizes', chunk::acc, m) else (outputChunks acc; batch (chunksWithSizes, [], 0)) end val () = batch (chunksWithSizes, [], 0) val {print, done, ...} = outputC () fun defineNextChunks () = (List.foreach (chunks, fn Chunk.T {chunkLabel, ...} => declareChunk (chunkLabel, print)) ; print "PRIVATE const ChunkFnPtr_t nextChunks[" ; print (C.int (Vector.length nextChunks)) ; print "] = {\n" ; Vector.foreachi (nextChunks, fn (i, label) => (print "\t" ; print "/* " ; print (C.int i) ; print ": */ " ; print "/* " ; print (Label.toString label) ; print " */ &(" ; print (ChunkLabel.toString (labelChunk label)) ; print "),\n")) ; print "};\n") val _ = outputDeclarations {additionalMainArgs = [labelIndexAsString (#label main, {pretty = true})], includes = ["c-main.h"], program = program, print = print, rest = defineNextChunks} val _ = done () in () end end mlton-20210117+dfsg/mlton/codegen/c-codegen/c-codegen.sig000066400000000000000000000021571416264345000227440ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature C_CODEGEN_STRUCTS = sig structure Machine: MACHINE end signature C_CODEGEN = sig include C_CODEGEN_STRUCTS structure C: sig val int: int -> string end val implementsPrim: 'a Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit} } -> unit val outputDeclarations: {additionalMainArgs: string list, includes: string list, print: string -> unit, program: Machine.Program.t, rest: unit -> unit } -> unit end mlton-20210117+dfsg/mlton/codegen/c-codegen/sources.cm000066400000000000000000000006631416264345000224200ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature C_CODEGEN functor CCodegen is ../../../lib/mlton/sources.cm ../../atoms/sources.cm ../../backend/sources.cm ../../control/sources.cm c-codegen.sig c-codegen.fun mlton-20210117+dfsg/mlton/codegen/c-codegen/sources.mlb000066400000000000000000000007161416264345000225720ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../atoms/sources.mlb ../../control/sources.mlb ../../backend/sources.mlb c-codegen.sig c-codegen.fun in signature C_CODEGEN functor CCodegen end mlton-20210117+dfsg/mlton/codegen/llvm-codegen/000077500000000000000000000000001416264345000211375ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/codegen/llvm-codegen/llvm-codegen.fun000066400000000000000000002766071416264345000242470ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 2013-2014 Matthew Fluet, Brian Leibig. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor LLVMCodegen(S: LLVM_CODEGEN_STRUCTS): LLVM_CODEGEN = struct structure AList = AppendList open S open Machine structure LLVM = struct fun escape s = let fun needsEscape c = Char.isCntrl c orelse Char.equals (c, #"\\") orelse Char.equals (c, Char.dquote) in if String.exists (s, needsEscape) then String.translate (s, fn c => if needsEscape c then let val hex = Int.format (Char.ord c, StringCvt.HEX) in if String.length hex < 2 then "\\0" ^ hex else "\\" ^ hex end else Char.toString c) else s end structure Type = struct datatype t = Array of int * t | Function of t list * t | Label | Pointer of t | Real of RealSize.t | Struct of bool * t list | Void | Word of WordSize.t fun equals (ty1, ty2) = case (ty1, ty2) of (Array (n1, ty1), Array (n2, ty2)) => Int.equals (n1, n2) andalso equals (ty1, ty2) | (Function (atys1, rty1), Function (atys2, rty2)) => equalss (atys1, atys2) andalso equals (rty1, rty2) | (Label, Label) => true | (Pointer ty1, Pointer ty2) => equals (ty1, ty2) | (Real rs1, Real rs2) => RealSize.equals (rs1, rs2) | (Struct (b1, tys1), Struct (b2, tys2)) => Bool.equals (b1, b2) andalso equalss (tys1, tys2) | (Void, Void) => true | (Word ws1, Word ws2) => WordSize.equals (ws1, ws2) | _ => false and equalss (tys1, tys2) = List.equals (tys1, tys2, equals) local val array = Random.word () val function = Random.word () val label = Random.word () val pointer = Random.word () val real = Random.word () val str = Random.word () val void = Random.word () val word = Random.word () in fun hash ty = case ty of Array (n, ty) => Hash.combine3 (array, Word.fromInt n, hash ty) | Function (atys, rty) => Hash.combine3 (function, Hash.listMap (atys, hash), hash rty) | Label => label | Pointer ty => Hash.combine (pointer, hash ty) | Real rs => Hash.combine (real, RealSize.hash rs) | Struct (b, tys) => Hash.combine3 (str, Bool.hash b, Hash.listMap (tys, hash)) | Void => void | Word ws => Hash.combine (word, WordSize.hash ws) end val bool = Word (WordSize.fromBits Bits.one) val word8 = Word WordSize.word8 val word16 = Word WordSize.word16 val word32 = Word WordSize.word32 val word64 = Word WordSize.word64 fun toString ty = case ty of Array (n, ty) => concat ["[", Int.toString n, " x ", toString ty, "]"] | Function (args, res) => concat [toString res, "(", String.concatWith (List.map (args, toString), ","), ")"] | Label => "label" | Pointer ty => concat [toString ty, "*"] | Struct (packed, tys) => let val (l,r) = if packed then ("<{", "}>") else ("{","}") in concat [l, String.concatWith (List.map (tys, toString), ","), r] end | Real rs => (case rs of RealSize.R32 => "float" | RealSize.R64 => "double") | Word ws => concat ["i", WordSize.toString ws] | Void => "void" fun dePointer ty = case ty of Pointer ty => ty | _ => Error.bug ("LLVMCodegen.LLVM.Type.dePointer: " ^ toString ty) fun fromCType ct = case ct of CType.CPointer => Pointer word8 | CType.Int8 => word8 | CType.Int16 => word16 | CType.Int32 => word32 | CType.Int64 => word64 | CType.Objptr => Pointer (Word WordSize.word8) | CType.Real32 => Real RealSize.R32 | CType.Real64 => Real RealSize.R64 | CType.Word8 => word8 | CType.Word16 => word16 | CType.Word32 => word32 | CType.Word64 => word64 val cpointer = fromCType CType.CPointer val blockaddress = Pointer word8 val uintptr = Promise.lazy (Word o WordSize.cpointer) end structure Value = struct type t = string * Type.t fun equals ((s1, ty1), (s2, ty2)) = String.equals (s1, s2) andalso Type.equals (ty1, ty2) fun hash (s, ty) = Hash.combine (String.hash s, Type.hash ty) fun toString (s, ty) = concat [Type.toString ty, " ", s] fun fnptr (s, args, res) = (s, Type.Pointer (Type.Function (args, res))) fun globptr (s, ty) = (s, Type.Pointer ty) fun label' s = ("%" ^ s, Type.Label) fun label l = label' (Label.toString l) val null = ("null", Type.Pointer Type.word8) fun real r = let val s = RealX.toString (r, {suffix = false}) val s = case s of "~inf" => "0xFFF0000000000000" | "inf" => "0x7FF0000000000000" | "nan" => "0xFFF8000000000000" | _ => String.translate (s, fn #"~" => "-" | c => String.fromChar c) in (s, Type.Real (RealX.size r)) end fun fnegZero rs = ("-0.0", Type.Real rs) (* fun undef ty = ("undef", ty) *) fun word w = (IntInf.toString (WordX.toIntInf w), Type.Word (WordX.size w)) fun zero ws = word (WordX.zero ws) fun negOne ws = word (WordX.fromIntInf (~1, ws)) end structure Instr = struct type t = string AList.t (* terminator *) fun br {test = (test, testTy), truee = (truee, trueeTy), falsee = (falsee, falseeTy)} = AList.fromList ["br ", Type.toString testTy, " ", test, ", ", Type.toString trueeTy, " ", truee, ", ", Type.toString falseeTy, " ", falsee] fun indirectbr {addr = (addr, addrTy), labels} = AList.append (AList.fromList ["indirectbr ", Type.toString addrTy, " ", addr, ", ["], if List.length labels > 3 then AList.append ((AList.appends o List.mapi) (labels, fn (i, (label, labelTy)) => AList.fromList [if i > 0 then ",\n\t\t" else "\n\t\t", Type.toString labelTy, " ", label]), AList.single "\n\t]") else AList.append ((AList.appends o List.mapi) (labels, fn (i, (label, labelTy)) => AList.fromList [if i > 0 then ", " else "", Type.toString labelTy, " ", label]), AList.single "]")) fun jmp (label, labelTy) = AList.fromList ["br ", Type.toString labelTy, " ", label] fun ret (res, resTy) = AList.fromList ["ret ", Type.toString resTy, " ", res] fun unreachable () = AList.single "unreachable" fun switch {value = (value, valueTy), default = (default, defaultTy), table} = AList.append (AList.fromList ["switch ", Type.toString valueTy, " ", value, ", ", Type.toString defaultTy, " ", default, " ["], if List.length table > 2 then AList.appends [AList.single "\n", (AList.appends o List.map) (table, fn ((index, indexTy), (label, labelTy)) => AList.fromList ["\t\t", Type.toString indexTy, " ", index, ", ", Type.toString labelTy, " ", label, "\n"]), AList.single "\t]"] else AList.append ((AList.appends o List.map) (table, fn ((index, indexTy), (label, labelTy)) => AList.fromList [" ", Type.toString indexTy, " ", index, ", ", Type.toString labelTy, " ", label, " "]), AList.single "]")) (* nary *) fun naryop {dst = (dst, _), oper = (oper, operTy), args} = AList.append (AList.fromList [dst, " = ", oper, " ", Type.toString operTy, " "], (AList.appends o List.mapi) (args, fn (i, (arg, _)) => AList.fromList [if i > 0 then ", " else "", arg])) (* aggregate *) fun xval {dst = (dst, _), src = (src, srcTy), args} = AList.append (AList.fromList [dst, " = extractvalue ", Type.toString srcTy, " ", src], (AList.appends o List.map) (args, fn arg => AList.fromList [", ", arg])) (* memory *) fun alloca {dst = (dst, dstTy)} = AList.fromList [dst, " = alloca ", Type.toString (Type.dePointer dstTy)] fun gep {dst = (dst, _), src = (src, srcTy), args} = AList.append (AList.fromList [dst, " = getelementptr inbounds ", Type.toString (Type.dePointer srcTy), ", ", Type.toString srcTy, " ", src], (AList.appends o List.map) (args, fn (arg, argTy) => AList.fromList [", ", Type.toString argTy, " ", arg])) fun load {dst = (dst, dstTy), src = (src, srcTy)} = AList.fromList [dst, " = load ", Type.toString dstTy, ", ", Type.toString srcTy, " ", src] fun store {dst = (dst, dstTy), src = (src, srcTy)} = AList.fromList ["store ", Type.toString srcTy, " ", src, ", ", Type.toString dstTy, " ", dst] (* conversion *) fun convop {dst = (dst, dstTy), oper, src = (src, srcTy)} = AList.fromList [dst, " = ", oper, " ", Type.toString srcTy, " ", src, " to ", Type.toString dstTy] local fun mk oper {dst, src} = convop {dst = dst, oper = oper, src = src} in val trunc = mk "trunc" val zext = mk "zext" val sext = mk "sext" val fptrunc = mk "fptrunc" val fpext = mk "fpext" val fptoui = mk "fptoui" val fptosi = mk "fptosi" val uitofp = mk "uitofp" val sitofp = mk "sitofp" val ptrtoint = mk "ptrtoint" val inttoptr = mk "inttoptr" val bitcast = mk "bitcast" end fun resize {dst as (_, dstTy), src as (_, srcTy), signed} = case (srcTy, dstTy) of (Type.Word ws, Type.Word wd) => (case WordSize.compare (ws, wd) of LESS => if signed then sext else zext | EQUAL => bitcast | GREATER => trunc) {dst = dst, src = src} | _ => Error.bug "LLVMCodegen.LLVM.Instr.resize" fun fpresize {dst as (_, dstTy), src as (_, srcTy)} = case (srcTy, dstTy) of (Type.Real rs, Type.Real rd) => (case RealSize.compare (rs, rd) of LESS => fpext | EQUAL => bitcast | GREATER => fptrunc) {dst = dst, src = src} | _ => Error.bug "LLVMCodegen.LLVM.Instr.fpresize" fun cast (arg as {dst = (_, dstTy), src = (_, srcTy)}) = (case (srcTy, dstTy) of (Type.Pointer _, Type.Word _) => ptrtoint | (Type.Word _, Type.Pointer _) => inttoptr | _ => bitcast) arg (* other *) fun call {dst = (dst, dstTy), tail, cconv, fnptr = (fnptr, _), args} = AList.appends [case dstTy of Type.Void => AList.empty | _ => AList.fromList [dst, " = "], case tail of NONE => AList.empty | SOME tail => AList.fromList [tail, " "], AList.single "call ", case cconv of NONE => AList.empty | SOME cconv => AList.fromList [cconv, " "], AList.fromList [Type.toString dstTy, " ", fnptr, "("], (AList.appends o List.mapi) (args, fn (i, (arg, argTy)) => AList.fromList [if i > 0 then ", " else "", Type.toString argTy, " ", arg]), AList.single ")"] fun addMetaData (i, md) = case md of NONE => i | SOME md => AList.append (i, AList.fromList [", ", md]) end structure MetaData = struct structure Id = struct type t = string val equals = String.equals val hash = String.hash fun toString id = id end structure Value = struct datatype t = Id of Id.t | Node of t list | String of String.t | Value of Value.t fun equals (v1, v2) = case (v1, v2) of (Id i1, Id i2) => Id.equals (i1, i2) | (Node vs1, Node vs2) => List.equals (vs1, vs2, equals) | (String s1, String s2) => String.equals (s1, s2) | (Value v1, Value v2) => Value.equals (v1, v2) | _ => false local val id = Random.word () val node = Random.word () val string = Random.word () val value = Random.word () in fun hash v = case v of Id i => Hash.combine (id, Id.hash i) | Node vs => Hash.combine (node, Hash.listMap (vs, hash)) | String s => Hash.combine (string, String.hash s) | Value v => Hash.combine (value, Value.hash v) end fun toString v = case v of Id i => Id.toString i | Node vs => concat ["!{", String.concatWith (List.map (vs, toString), ", "), "}"] | String s => concat ["!\"", escape s, "\""] | Value v => Value.toString v end val id = Value.Id val string = Value.String val value = Value.Value datatype t = T of unit ref option * Value.t fun node vs = T (NONE, Value.Node vs) fun equals (T (xo1, v1), T (xo2, v2)) = Option.equals (xo1, xo2, Ref.equals) andalso Value.equals (v1, v2) local val none = Random.word () val some = Random.word () in fun hash (T (xo, v)) = Hash.combine (case xo of NONE => none | SOME _ => some, Value.hash v) end fun toString (T (xo, v)) = case xo of NONE => Value.toString v | SOME _ => concat ["distinct ", Value.toString v] end structure ModuleContext = struct datatype t = T of {fnDecls: (string, {argTys: Type.t list, resTy: Type.t, vis: string option}) HashTable.t, fnDefns: (string, unit) HashTable.t, globDecls: (string, {const: bool, ty: Type.t, vis: string option}) HashTable.t, metaData: (MetaData.t, MetaData.Id.t) HashTable.t} fun new () = T {fnDecls = HashTable.new {equals = String.equals, hash = String.hash}, fnDefns = HashTable.new {equals = String.equals, hash = String.hash}, globDecls = HashTable.new {equals = String.equals, hash = String.hash}, metaData = HashTable.new {equals = MetaData.equals, hash = MetaData.hash}} fun emit (T {fnDecls, fnDefns, globDecls, metaData}, print) = let val empty = ref true val _ = HashTable.foreachi (globDecls, fn (name, {const, ty, vis}) => (empty := false ; print name ; print " = external " ; Option.app (vis, fn vis => (print vis; print " ")) ; print (if const then "constant " else "global ") ; print (Type.toString ty) ; print "\n")) val _ = if !empty then () else print "\n" val empty = ref true val _ = HashTable.foreachi (fnDecls, fn (name, {argTys, resTy, vis}) => case HashTable.peek (fnDefns, name) of NONE => (empty := false ; print "declare " ; Option.app (vis, fn vis => (print vis; print " ")) ; print (Type.toString resTy) ; print " " ; print name ; print "(" ; List.foreachi (argTys, fn (i, argTy) => (if i > 0 then print ", " else () ; print (Type.toString argTy))) ; print ")\n") | SOME _ => ()) val _ = if !empty then () else print "\n" val empty = ref true val _ = HashTable.foreachi (metaData, fn (md, id) => (empty := false ; print (MetaData.Id.toString id) ; print " = " ; print (MetaData.toString md) ; print "\n")) val _ = if !empty then () else print "\n" in () end fun addFnDecl (T {fnDecls, ...}, name, argTys_resTy_vis as {argTys, resTy, ...}) = ((ignore o HashTable.insertIfNew) (fnDecls, name, fn () => argTys_resTy_vis, ignore) ; Value.fnptr (name, argTys, resTy)) fun addFnDefn (T {fnDefns, ...}, name) = (ignore o HashTable.insertIfNew) (fnDefns, name, fn () => (), ignore) fun addGlobDecl (T {globDecls, ...}, name, const_ty_vis as {ty, ...}) = ((ignore o HashTable.insertIfNew) (globDecls, name, fn () => const_ty_vis, ignore) ; Value.globptr (name, ty)) fun addMetaData (T {metaData, ...}, md) = HashTable.lookupOrInsert (metaData, md, fn () => "!" ^ Int.toString (HashTable.size metaData)) fun intrinsic (mc, name, {argTys, resTy}) = addFnDecl (mc, "@llvm." ^ name, {argTys = argTys, resTy = resTy, vis = NONE}) end end structure ChunkLabel = struct open ChunkLabel val toStringForC = toString fun toStringXForC cl = "X" ^ toStringForC cl fun toString cl = "@" ^ toStringForC cl fun toStringX cl = "@" ^ toStringXForC cl fun toString' cl = if !Control.llvmCC10 then toStringX cl else toString cl end local open Runtime in structure GCField = GCField end structure Type = struct open Type val toLLVMType = LLVM.Type.fromCType o toCType end fun primApp (prim: 'a Prim.t): ({args: LLVM.Value.t list, mc: LLVM.ModuleContext.t, newTemp: LLVM.Type.t -> LLVM.Value.t, $ : LLVM.Instr.t -> unit} -> LLVM.Value.t) option = let open LLVM.Instr val nth = List.nth fun compare oper {args, mc = _, newTemp, $} = let val tmp = newTemp LLVM.Type.bool val res = newTemp (LLVM.Type.Word WordSize.bool) val _ = $(naryop {dst = tmp, oper = oper, args = args}) val _ = $(zext {dst = res, src = tmp}) in res end fun conv (instr, ty) {args, mc = _, newTemp, $} = let val res = newTemp ty val _ = $(instr {dst = res, src = nth (args, 0)}) in res end fun cpointerAdd {args, mc = _, newTemp, $} = let val res = newTemp LLVM.Type.cpointer val _ = $(gep {dst = res, src = nth (args, 0), args = [nth (args, 1)]}) in res end fun cpointerCompare cond = compare ("icmp " ^ cond, LLVM.Type.cpointer) fun realCompare (cond, rs) = compare ("fcmp " ^ cond, LLVM.Type.Real rs) fun realMath' (oper, rs, fargs) {args, mc, newTemp, $} = let val args = fargs args val atys = List.map (args, #2) val rty = LLVM.Type.Real rs val name = concat [oper, ".f", RealSize.toString rs] val fnptr = LLVM.ModuleContext.intrinsic (mc, name, {argTys = atys, resTy = rty}) val res = newTemp rty val _ = $(call {dst = res, tail = NONE, cconv = NONE, fnptr = fnptr, args = args}) in res end fun realMath (oper, rs) = realMath' (oper, rs, fn args => args) fun realNary' (oper, rs, fargs) {args, mc = _, newTemp, $} = let val args = fargs args val ty = LLVM.Type.Real rs val res = newTemp ty val _ = $(naryop {dst = res, oper = (oper, ty), args = args}) in res end fun realNary (oper, rs) = realNary' (oper, rs, fn args => args) fun wordCompare (cond, ws) = compare ("icmp " ^ cond, LLVM.Type.Word ws) fun wordCheckP' (oper, ws, fargs) {args, mc, newTemp, $} = let val args = fargs args val atys = List.map (args, #2) val wty = LLVM.Type.Word ws val sty = LLVM.Type.Struct (false, [wty, LLVM.Type.bool]) val name = concat [oper, ".with.overflow.i", WordSize.toString ws] val fnptr = LLVM.ModuleContext.intrinsic (mc, name, {argTys = atys, resTy = sty}) val tmps = newTemp sty val tmpb = newTemp LLVM.Type.bool val res = newTemp (LLVM.Type.Word WordSize.bool) val _ = $(call {dst = tmps, tail = NONE, cconv = NONE, fnptr = fnptr, args = args}) val _ = $(xval {dst = tmpb, src = tmps, args = ["1"]}) val _ = $(zext {dst = res, src = tmpb}) in res end fun wordCheckP (oper, ws) = wordCheckP' (oper, ws, fn args => args) fun wordNary' (oper, ws, fargs) {args, mc = _, newTemp, $} = let val args = fargs args val ty = LLVM.Type.Word ws val res = newTemp ty val _ = $(naryop {dst = res, oper = (oper, ty), args = args}) in res end fun wordNary (oper, ws) = wordNary' (oper, ws, fn args => args) fun wordRotate (oper, ws) {args, mc, newTemp, $} = let val wty = LLVM.Type.Word ws val atys = [wty, wty, wty] val rty = wty val name = concat [oper, ".i", WordSize.toString ws] val fnptr = LLVM.ModuleContext.intrinsic (mc, name, {argTys = atys, resTy = rty}) val arg1 = newTemp wty val res = newTemp wty val _ = $(resize {dst = arg1, src = nth (args, 1), signed = false}) val _ = $(call {dst = res, tail = NONE, cconv = NONE, fnptr = fnptr, args = [nth (args, 0), nth (args, 0), arg1]}) in res end fun wordShift (oper, ws) {args, mc = _, newTemp, $} = let val ty = LLVM.Type.Word ws val arg1 = newTemp ty val res = newTemp ty val _ = $(resize {dst = arg1, src = nth (args, 1), signed = false}) val _ = $(naryop {dst = res, oper = (oper, ty), args = [nth (args, 0), arg1]}) in res end datatype z = datatype Prim.t in case prim of CPointer_add => SOME cpointerAdd | CPointer_diff => SOME (fn {args, mc = _, newTemp, $} => let val wptr = LLVM.Type.uintptr () val arg0 = newTemp wptr val arg1 = newTemp wptr val res = newTemp wptr val _ = $(ptrtoint {dst = arg0, src = nth (args, 0)}) val _ = $(ptrtoint {dst = arg1, src = nth (args, 1)}) val _ = $(naryop {dst = res, oper = ("sub", wptr), args = [arg0, arg1]}) in res end) | CPointer_equal => SOME (cpointerCompare "eq") | CPointer_fromWord => SOME (conv (inttoptr, LLVM.Type.cpointer)) | CPointer_lt => SOME (cpointerCompare "ult") | CPointer_sub => SOME (fn {args, mc, newTemp, $} => let fun mk args = {args = args, mc = mc, newTemp = newTemp, $ = $} val ws = WordSize.cpointer () val tmp = wordNary ("sub", ws) (mk [LLVM.Value.zero ws, nth (args, 1)]) val res = cpointerAdd (mk [nth (args, 0), tmp]) in res end) | CPointer_toWord => SOME (conv (ptrtoint, LLVM.Type.uintptr ())) | Real_Math_acos _ => NONE | Real_Math_asin _ => NONE | Real_Math_atan _ => NONE | Real_Math_atan2 _ => NONE | Real_Math_cos rs => SOME (realMath ("cos", rs)) | Real_Math_exp rs => SOME (realMath ("exp", rs)) | Real_Math_ln rs => SOME (realMath ("log", rs)) | Real_Math_log10 rs => SOME (realMath ("log10", rs)) | Real_Math_sin rs => SOME (realMath ("sin", rs)) | Real_Math_sqrt rs => SOME (realMath ("sqrt", rs)) | Real_Math_tan _ => NONE | Real_abs rs => SOME (realMath ("fabs", rs)) | Real_add rs => SOME (realNary ("fadd", rs)) | Real_castToWord (_, ws) => SOME (conv (bitcast, LLVM.Type.Word ws)) | Real_div rs => SOME (realNary ("fdiv", rs)) | Real_equal rs => SOME (realCompare ("oeq", rs)) | Real_ldexp _ => NONE | Real_le rs => SOME (realCompare ("ole", rs)) | Real_lt rs => SOME (realCompare ("olt", rs)) | Real_mul rs => SOME (realNary ("fmul", rs)) | Real_muladd rs => SOME (realMath ("fma", rs)) | Real_mulsub rs => SOME (fn {args, mc, newTemp, $} => let fun mk args = {args = args, mc = mc, newTemp = newTemp, $ = $} val tmp = if false then realNary ("fneg", rs) (mk [nth (args, 2)]) else realNary ("fsub", rs) (mk [LLVM.Value.fnegZero rs, nth (args, 2)]) val res = realMath ("fma", rs) (mk [nth (args, 0), nth (args, 1), tmp]) in res end) | Real_neg rs => SOME (fn {args, mc, newTemp, $} => let fun mk args = {args = args, mc = mc, newTemp = newTemp, $ = $} val res = if false then realNary ("fneg", rs) (mk [nth (args, 0)]) else realNary ("fsub", rs) (mk [LLVM.Value.fnegZero rs, nth (args, 0)]) in res end) | Real_qequal rs => SOME (realCompare ("ueq", rs)) | Real_rndToReal (_, rs) => SOME (conv (fpresize, LLVM.Type.Real rs)) | Real_rndToWord (_, ws, {signed}) => SOME (conv (if signed then fptosi else fptoui, LLVM.Type.Word ws)) | Real_round rs => SOME (realMath ("rint", rs)) | Real_sub rs => SOME (realNary ("fsub", rs)) | Thread_returnToC => NONE | Word_add ws => SOME (wordNary ("add", ws)) | Word_addCheckP (ws, {signed}) => SOME (wordCheckP (if signed then "sadd" else "uadd", ws)) | Word_andb ws => SOME (wordNary ("and", ws)) | Word_castToReal (_, rs) => SOME (conv (bitcast, LLVM.Type.Real rs)) | Word_equal ws => SOME (wordCompare ("eq", ws)) | Word_extdToWord (_, ws, {signed}) => SOME (conv (fn {dst, src} => resize {dst = dst, src = src, signed = signed}, LLVM.Type.Word ws)) | Word_lshift ws => SOME (wordShift ("shl", ws)) | Word_lt (ws, {signed}) => SOME (wordCompare (if signed then "slt" else "ult", ws)) | Word_mul (ws, _) => SOME (wordNary ("mul", ws)) | Word_mulCheckP (ws, {signed}) => SOME (wordCheckP (if signed then "smul" else "umul", ws)) | Word_neg ws => SOME (wordNary' ("sub", ws, fn args => (LLVM.Value.zero ws)::args)) | Word_negCheckP (ws, {signed}) => SOME (wordCheckP' (if signed then "ssub" else "usub", ws, fn args => (LLVM.Value.zero ws)::args)) | Word_notb ws => SOME (wordNary' ("xor", ws, fn args =>(LLVM.Value.negOne ws)::args)) | Word_orb ws => SOME (wordNary ("or", ws)) | Word_quot (ws, {signed}) => SOME (wordNary (if signed then "sdiv" else "udiv", ws)) | Word_rem (ws, {signed}) => SOME (wordNary (if signed then "srem" else "urem", ws)) | Word_rndToReal (_, rs, {signed}) => SOME (conv (if signed then sitofp else uitofp, LLVM.Type.Real rs)) | Word_rol ws => SOME (wordRotate ("fshl", ws)) | Word_ror ws => SOME (wordRotate ("fshr", ws)) | Word_rshift (ws, {signed}) => SOME (wordShift (if signed then "ashr" else "lshr", ws)) | Word_sub ws => SOME (wordNary ("sub", ws)) | Word_subCheckP (ws, {signed}) => SOME (wordCheckP (if signed then "ssub" else "usub", ws)) | Word_xorb ws => SOME (wordNary ("xor", ws)) | _ => NONE end fun implementsPrim (p: 'a Prim.t): bool = Option.isSome (primApp p) fun primAppOpAndCheck {args: LLVM.Value.t list, prim: 'a Prim.t, mc: LLVM.ModuleContext.t, newTemp: LLVM.Type.t -> LLVM.Value.t, $ : LLVM.Instr.t -> unit}: LLVM.Value.t * LLVM.Value.t = let open LLVM.Instr fun doit' (oper, ws, fargs) = let val args = fargs args val atys = List.map (args, #2) val wty = LLVM.Type.Word ws val sty = LLVM.Type.Struct (false, [wty, LLVM.Type.bool]) val name = concat [oper, ".with.overflow.i", WordSize.toString ws] val fnptr = LLVM.ModuleContext.intrinsic (mc, name, {argTys = atys, resTy = sty}) val tmps = newTemp sty val res1 = newTemp wty val tmpb = newTemp LLVM.Type.bool val res2 = newTemp (LLVM.Type.Word WordSize.bool) val _ = $(call {dst = tmps, tail = NONE, cconv = NONE, fnptr = fnptr, args = args}) val _ = $(xval {dst = res1, src = tmps, args = ["0"]}) val _ = $(xval {dst = tmpb, src = tmps, args = ["1"]}) val _ = $(zext {dst = res2, src = tmpb}) in (res1, res2) end fun doit (oper, ws) = doit' (oper, ws, fn args => args) datatype z = datatype Prim.t in case prim of Word_addCheckP (ws, {signed}) => doit (if signed then "sadd" else "uadd", ws) | Word_mulCheckP (ws, {signed}) => doit (if signed then "smul" else "umul", ws) | Word_negCheckP (ws, {signed}) => doit' (if signed then "ssub" else "usub", ws, fn args => (LLVM.Value.zero ws)::args) | Word_subCheckP (ws, {signed}) => doit (if signed then "ssub" else "usub", ws) | _ => Error.bug "LLVMCodegen.primAppOpAndChk" end fun aamd (oper, mc) = case !Control.llvmAAMD of Control.LLVMAliasAnalysisMetaData.None => NONE | Control.LLVMAliasAnalysisMetaData.Scope => let val domain = LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node [LLVM.MetaData.string "MLton Scope Domain"]) fun scope s = LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node [LLVM.MetaData.string s, LLVM.MetaData.id domain]) val (gcstate,global,heap,other,stack) = (scope "GCState", scope "Global", scope "Heap", scope "Other", scope "Stack") val scopes = [global,gcstate,heap,other,stack] fun scope s = let fun scopeSet ss = LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node (List.map (ss, LLVM.MetaData.id))) val noalias = scopeSet (List.remove (scopes, fn s' => LLVM.MetaData.Id.equals (s, s'))) val alias = scopeSet [s] in SOME (concat ["!noalias ", LLVM.MetaData.Id.toString noalias, ", !alias.scope ", LLVM.MetaData.Id.toString alias]) end in case oper of Operand.Frontier => NONE (* alloca *) | Operand.Global _ => scope global | Operand.Offset {base = Operand.GCState, ...} => scope gcstate | Operand.Offset {base, ...} => if Type.isObjptr (Operand.ty base) then scope heap else scope other | Operand.SequenceOffset {base, ...} => if Type.isObjptr (Operand.ty base) then scope heap else scope other | Operand.StackOffset _ => (* Unsound: At raise, exception results are written to the stack via an * `Offset` with `base` corresponding to `StackBottom + exnStack` and * then read from the stack via a `StackOffset` by the handler. *) scope stack | Operand.StackTop => NONE (* alloca *) | Operand.Temporary _ => NONE (* alloca *) | _ => NONE (* not lvalue *) end | Control.LLVMAliasAnalysisMetaData.TBAA {gcstate, global, heap, other, stack} => let fun tbaa path = let val root = LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node [LLVM.MetaData.string "MLton TBAA Root"]) val (desc, _) = List.foldr (path, (root, ""), fn (node,(desc,name)) => let val name = if String.isEmpty name then node else concat [name, " ", node] in (LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node [LLVM.MetaData.string name, LLVM.MetaData.id desc]), name) end) val acc = LLVM.ModuleContext.addMetaData (mc, LLVM.MetaData.node [LLVM.MetaData.id desc, LLVM.MetaData.id desc, LLVM.MetaData.value (LLVM.Value.zero WordSize.word32)]) in SOME (concat ["!tbaa ", LLVM.MetaData.Id.toString acc]) end val other = fn () => if other then tbaa ["Other"] else NONE in case oper of Operand.Frontier => NONE (* alloca *) | Operand.Global g => (case global of NONE => NONE | SOME {cty = doCTy, index = doIndex} => let val path = ["Global"] val path = if doCTy then (CType.name (Type.toCType (Global.ty g)))::path else path val path = if doIndex then (Int.toString (Global.index g))::path else path in tbaa path end) | Operand.Offset {base = Operand.GCState, offset, ...} => (case gcstate of NONE => NONE | SOME {offset = doOffset} => let val path = ["GCState"] val path = if doOffset then (Bytes.toString offset)::path else path in tbaa path end) | Operand.Offset {base, offset, ty, ...} => (if Type.isObjptr (Operand.ty base) then (case heap of NONE => NONE | SOME {cty = doCTy, kind = doKind, offset = doOffset, tycon = doTycon} => let val path = ["Heap"] val path = if doKind then "Normal"::path else path val path = if doTycon then (case Type.deObjptr (Operand.ty base) of NONE => path | SOME tyc => (ObjptrTycon.toString tyc)::path) else path val path = if doCTy then (CType.name (Type.toCType ty))::path else path val path = if doOffset then (Bytes.toString offset)::path else path in tbaa path end) else other ()) | Operand.SequenceOffset {base, offset, ty, ...} => (if Type.isObjptr (Operand.ty base) then (case heap of NONE => NONE | SOME {cty = doCTy, kind = doKind, offset = doOffset, tycon = doTycon} => let val path = ["Heap"] val path = if doKind then "Sequence"::path else path (* Unsound: Around a `Array_toVector` primitive, a sequence may * be written to at one `ObjptrTycon.t` (corresponding to an * `array`) and then read from at a distinct `ObjptrTycon.t` * (corresponding to a `vector`). *) val path = if doTycon then (case Type.deObjptr (Operand.ty base) of NONE => path | SOME tyc => (ObjptrTycon.toString tyc)::path) else path (* Unsound: `WordArray_{sub,update}Word {seqSize, elemSize}` * and `WordVector_subWord {seqSize, elemSize}` primitives (for * `signature PACK_WORD`) are translated to `SequenceOffset` * with `base` corresponding to a sequence of `seqSize`, * `offset = Bytes.zero`, `scale` corresponding to `elemSize`, * and `ty` corresponding to the `elemSize`; thus, the same * address can be accessed for `Word8` and `Word64` elements. *) val path = if doCTy then (CType.name (Type.toCType ty))::path else path val path = if doOffset then (Bytes.toString offset)::path else path in tbaa path end) else other ()) | Operand.StackOffset (StackOffset.T {offset, ...}) => (case stack of NONE => NONE | SOME {offset = doOffset} => let (* Unsound: At raise, exception results are written to the stack via an * `Offset` with `base` corresponding to `StackBottom + exnStack` and * then read from the stack via a `StackOffset` by the handler. *) val path = ["StackOffset"] (* Unsound: At non-tail call/return, arguments/results are written to * the stack relative to the callee/caller stack frame and then read * from the stack relative to the caller/callee stack frame. In * general, around a stack push/pop, distinct offsets correspond to the * same location. *) val path = if doOffset then (Bytes.toString offset)::path else path in tbaa path end) | Operand.StackTop => NONE (* alloca *) | Operand.Temporary _ => NONE (* alloca *) | _ => NONE (* not lvalue *) end fun output {program as Machine.Program.T {chunks, frameInfos, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputLL: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} = let val {get = labelInfo: Label.t -> {block: Block.t, chunkLabel: ChunkLabel.t, index: int option}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("LLVMCodeGen.labelInfo", Label.layout)) val nextChunks = Array.new (Vector.length frameInfos, NONE) val _ = List.foreach (chunks, fn Chunk.T {blocks, chunkLabel, ...} => Vector.foreach (blocks, fn block as Block.T {kind, label, ...} => let val index = case Kind.frameInfoOpt kind of NONE => NONE | SOME fi => let val index = FrameInfo.index fi in if Kind.isEntry kind then Array.update (nextChunks, index, SOME label) else () ; SOME index end in setLabelInfo (label, {block = block, chunkLabel = chunkLabel, index = index}) end)) val nextChunks = Vector.keepAllMap (Vector.fromArray nextChunks, fn lo => lo) val labelChunk = #chunkLabel o labelInfo val labelIndex = valOf o #index o labelInfo fun labelIndexValue l = (LLVM.Value.word o WordX.fromInt) (labelIndex l, WordSize.cpointer ()) val amTimeProfiling = !Control.profile = Control.ProfileTimeField orelse !Control.profile = Control.ProfileTimeLabel fun creturnName (ct: CType.t): string = concat ["%CReturn", CType.name ct] fun creturnVarC (ct: CType.t): LLVM.Value.t = (creturnName ct, LLVM.Type.Pointer (LLVM.Type.fromCType ct)) fun creturnVar t = creturnVarC (Type.toCType t) fun globalName (ct: CType.t): string = concat ["@global", CType.toString ct] fun globalValC (ct: CType.t, mc): LLVM.Value.t = let val name = globalName ct val ty = LLVM.Type.Array (Global.numberOfType ct, LLVM.Type.fromCType ct) in LLVM.ModuleContext.addGlobDecl (mc, name, {const = false, ty = ty, vis = SOME "hidden"}) end fun globalVal (c, mc) = globalValC (Type.toCType c, mc) fun temporaryName (ct: CType.t, index: int): string = concat ["%T", CType.name ct, "_", Int.toString index] fun temporaryVarC (ct: CType.t, index: int): LLVM.Value.t = (temporaryName (ct, index), LLVM.Type.Pointer (LLVM.Type.fromCType ct)) fun temporaryVar (t, index) = temporaryVarC (Type.toCType t, index) fun staticHeapVal (kind, mc): LLVM.Value.t = let val name = concat ["@", Label.toString (StaticHeap.Kind.label kind)] val ty = LLVM.Type.word8 val const = case kind of StaticHeap.Kind.Immutable => true | _ => false in LLVM.ModuleContext.addGlobDecl (mc, name, {const = const, ty = ty, vis = SOME "hidden"}) end val gcState = ("%gcState", LLVM.Type.cpointer) local fun mk (name, lty) = ((name ^ "Arg", lty), (name, LLVM.Type.Pointer lty)) in val (stackTopArg, stackTopVar) = mk ("%stackTop", LLVM.Type.cpointer) val (frontierArg, frontierVar) = mk ("%frontier", LLVM.Type.cpointer) val (nextBlockArg, nextBlockVar) = mk ("%nextBlock", LLVM.Type.uintptr ()) end val chunkFnArgs = [gcState, stackTopArg, frontierArg, nextBlockArg] val chunkFnArgTys = List.map (chunkFnArgs, #2) val chunkFnResTy = LLVM.Type.uintptr () val chunkFnTy = LLVM.Type.Function (chunkFnArgTys, chunkFnResTy) val chunkFnPtrTy = LLVM.Type.Pointer chunkFnTy local fun mk tos (cl: ChunkLabel.t, mc): LLVM.Value.t = LLVM.ModuleContext.addFnDecl (mc, tos cl, {argTys = chunkFnArgTys, resTy = chunkFnResTy, vis = SOME "hidden"}) in val chunkFnValX = mk ChunkLabel.toStringX val chunkFnVal' = mk ChunkLabel.toString' end fun nextChunksVar mc = let val name = if !Control.llvmCC10 then "@nextXChunks" else "@nextChunks" val ty = LLVM.Type.Array (Vector.length nextChunks, chunkFnPtrTy) in LLVM.ModuleContext.addGlobDecl (mc, name, {const = true, ty = ty, vis = SOME "hidden"}) end val doSwitchNextBlock = LLVM.Value.label' "doSwitchNextBlock" fun outputChunkFn (Chunk.T {chunkLabel, blocks, tempsMax, ...}, mc, print) = let val selfChunk = chunkLabel local fun tb () = print "\t" fun ln () = print "\n" in fun prints ss = List.foreach (ss, print) fun println s = (print s; ln ()) fun printsln ss = (prints ss; ln ()) fun tbprintsln ss = (tb (); prints ss; ln ()) end local val next = Counter.generator 0 in fun newTemp ty = (concat ["%t", Int.toString (next ())], ty) end open LLVM.Instr fun $ i = (print "\t"; AList.foreach (i, print); print "\n") fun operandToLValue oper = let val addr = case oper of Operand.Frontier => frontierVar | Operand.Global g => let val ty = Global.ty g val index = LLVM.Value.word (WordX.fromInt (Global.index g, WordSize.word32)) val res = newTemp (LLVM.Type.Pointer (Type.toLLVMType ty)) val _ = $(gep {dst = res, src = globalVal (ty, mc), args = [LLVM.Value.zero WordSize.word32, index]}) in res end | Operand.Offset {base, offset, ty} => let val base = operandToRValue base val offset = LLVM.Value.word (WordX.fromBytes (offset, WordSize.word32)) val tmp = newTemp LLVM.Type.cpointer val res = newTemp (LLVM.Type.Pointer (Type.toLLVMType ty)) val _ = $(gep {dst = tmp, src = base, args = [offset]}) val _ = $(cast {dst = res, src = tmp}) in res end | Operand.SequenceOffset {base, index, offset, scale, ty} => let val base = operandToRValue base val index as (_, indexTy) = operandToRValue index val scale = LLVM.Value.word (WordX.fromBytes (Scale.toBytes scale, WordSize.cptrdiff ())) val offset = LLVM.Value.word (WordX.fromBytes (offset, WordSize.word32)) val tmp1 = newTemp indexTy val tmp2 = newTemp LLVM.Type.cpointer val tmp3 = newTemp LLVM.Type.cpointer val res = newTemp (LLVM.Type.Pointer (Type.toLLVMType ty)) val _ = $(naryop {dst = tmp1, oper = ("mul nsw", indexTy), args = [index, scale]}) val _ = $(gep {dst = tmp2, src = base, args = [tmp1]}) val _ = $(gep {dst = tmp3, src = tmp2, args = [offset]}) val _ = $(cast {dst = res, src = tmp3}) in res end | Operand.StackOffset (StackOffset.T {offset, ty}) => let val stackTop = newTemp LLVM.Type.cpointer val addr = newTemp LLVM.Type.cpointer val res = newTemp (LLVM.Type.Pointer (Type.toLLVMType ty)) val _ = $(load {dst = stackTop, src = stackTopVar}) val _ = $(gep {dst = addr, src = stackTop, args = [LLVM.Value.word (WordX.fromBytes (offset, WordSize.word32))]}) val _ = $(cast {dst = res, src = addr}) in res end | Operand.StackTop => stackTopVar | Operand.Temporary t => temporaryVar (Temporary.ty t, Temporary.index t) | _ => Error.bug ("LLVMCodegen.operandToLValue: " ^ Operand.toString oper) val aamd = aamd (oper, mc) in (fn {dst} => addMetaData (load {dst = dst, src = addr}, aamd), fn {src} => addMetaData (store {dst = addr, src = src}, aamd)) end and operandToRValue oper = let val load = fn () => let val (loadOper, _) = operandToLValue oper val res = newTemp (Type.toLLVMType (Operand.ty oper)) val _ = $(loadOper {dst = res}) in res end in case oper of Operand.Cast (oper, ty) => let val oper = operandToRValue oper val res = newTemp (Type.toLLVMType ty) val _ = $(cast {dst = res, src = oper}) in res end | Operand.Const (Const.CSymbol (CSymbol.T {name, cty, symbolScope})) => let val name = "@" ^ name val ty = case cty of NONE => LLVM.Type.Word WordSize.word8 | SOME ty => LLVM.Type.fromCType ty val vis = case symbolScope of CSymbolScope.External => "default" | CSymbolScope.Private => "hidden" | CSymbolScope.Public => "default" val globptr = LLVM.ModuleContext.addGlobDecl (mc, name, {const = false, ty = ty, vis = SOME vis}) val res = newTemp LLVM.Type.cpointer val _ = $(bitcast {dst = res, src = globptr}) in res end | Operand.Const Const.Null => LLVM.Value.null | Operand.Const (Const.Real r) => LLVM.Value.real r | Operand.Const (Const.Word w) => LLVM.Value.word w | Operand.Const _ => Error.bug "LLVMCodegen.operandToRValue: Const" | Operand.Frontier => load () | Operand.GCState => gcState | Operand.Global _ => load () | Operand.Label label => labelIndexValue label | Operand.Offset _ => load () | Operand.SequenceOffset _ => load () | Operand.StackOffset _ => load () | Operand.StackTop => load () | Operand.StaticHeapRef (StaticHeap.Ref.T {kind, offset, ty, ...}) => let val tmp = newTemp LLVM.Type.cpointer val res = newTemp (Type.toLLVMType ty) val _ = $(gep {dst = tmp, src = staticHeapVal (kind, mc), args = [LLVM.Value.word (WordX.fromBytes (offset, WordSize.word32))]}) val _ = $(cast {dst = res, src = tmp}) in res end | Operand.Temporary _ => load () end fun operandsToRValues opers = (List.rev o Vector.fold) (opers, [], fn (oper, opers) => (operandToRValue oper)::opers) fun outputStatement (s: Statement.t): unit = let in case s of Statement.Move {dst, src} => let val (_, storeDst) = operandToLValue dst val src = operandToRValue src val _ = $(storeDst {src = src}) in () end | Statement.PrimApp {args, dst, prim} => let val args = operandsToRValues args val res = (valOf (primApp prim)) {args = args, mc = mc, newTemp = newTemp, $ = $} val _ = case dst of NONE => () | SOME dst => let val (_, storeDst) = operandToLValue dst val _ = $(storeDst {src = res}) in () end in () end | Statement.ProfileLabel _ => Error.bug "LLVMCodegen.outputStatement: ProfileLabel" end local fun mk (dst, src) () = outputStatement (Statement.Move {dst = dst, src = src}) val stackTop = Operand.StackTop val gcStateStackTop = Operand.gcField GCField.StackTop val frontier = Operand.Frontier val gcStateFrontier = Operand.gcField GCField.Frontier in val cacheStackTop = mk (stackTop, gcStateStackTop) val flushStackTop = mk (gcStateStackTop, stackTop) val cacheFrontier = mk (frontier, gcStateFrontier) val flushFrontier = mk (gcStateFrontier, frontier) end (* StackTop += size *) fun adjStackTop (size: Bytes.t) = (outputStatement (Statement.PrimApp {args = Vector.new2 (Operand.StackTop, Operand.word (WordX.fromBytes (size, WordSize.cptrdiff ()))), dst = SOME Operand.StackTop, prim = Prim.CPointer_add}) ; if amTimeProfiling then flushStackTop () else ()) fun pop (fi: FrameInfo.t) = adjStackTop (Bytes.~ (FrameInfo.size fi)) fun push (return: Label.t, size: Bytes.t) = (outputStatement (Statement.Move {dst = Operand.stackOffset {offset = Bytes.- (size, Runtime.labelSize ()), ty = Type.label return}, src = Operand.Label return}) ; adjStackTop size) (* LeaveChunk(nextChunk, nextBlock) if (TailCall) { return nextChunk(gcState, stackTop, frontier, nextBlock); } else { flushFrontier(); flushStackTop(); return nextBlock; } *) fun leaveChunk (nextChunk, nextBlock) = if !Control.chunkTailCall then let val stackTop = newTemp LLVM.Type.cpointer val frontier = newTemp LLVM.Type.cpointer val res = newTemp chunkFnResTy in $(load {dst = stackTop, src = stackTopVar}) ; $(load {dst = frontier, src = frontierVar}) ; $(call {dst = res, tail = SOME "musttail", cconv = if !Control.llvmCC10 then SOME "cc10" else NONE, fnptr = nextChunk, args = [gcState, stackTop, frontier, nextBlock]}) ; $(ret res) end else (flushFrontier () ; flushStackTop () ; $(ret nextBlock)) (* IndJump(mustReturnToSelf, mayReturnToSelf, mustReturnToOther) nextBlock = *(uintptr_t* )(StackTop - sizeof(uintptr_t)); if (mustReturnToSelf) { goto doSwitchNextBlock; } else { ChunkFnPtr_t nextChunk = nextChunks[nextBlock]; if (mayReturnToSelf && (nextChunk == selfChunk)) { goto doSwitchNextBlock; } if (mustReturnToOther != NULL) { LeaveChunk( *mustReturnToOther, nextBlock); } else { LeaveChunk( *nextChunk, nextBlock); } } *) fun indJump (mustReturnToSelf, mayReturnToSelf, mustReturnToOther) = let val nextBlock = operandToRValue (Operand.stackOffset {offset = Bytes.~ (Runtime.labelSize ()), ty = Type.label (Label.newNoname ())}) val _ = $(store {dst = nextBlockVar, src = nextBlock}) in if mustReturnToSelf then $(jmp doSwitchNextBlock) else let val nextChunkAddr = newTemp (LLVM.Type.Pointer chunkFnPtrTy) val nextChunk = newTemp chunkFnPtrTy val doNextChunk = Promise.delay (fn () => ($(gep {dst = nextChunkAddr, src = nextChunksVar mc, args = [LLVM.Value.zero WordSize.word32, nextBlock]}) ; $(load {dst = nextChunk, src = nextChunkAddr}))) val _ = if mayReturnToSelf then let val _ = Promise.force doNextChunk val rToSelf = Label.newNoname () val rToOther = Label.newNoname () val test = newTemp LLVM.Type.bool val _ = $(naryop {dst = test, oper = ("icmp eq", chunkFnPtrTy), args = [nextChunk, chunkFnVal' (selfChunk, mc)]}) val _ = $(br {test = test, truee = LLVM.Value.label rToSelf, falsee = LLVM.Value.label rToOther}) val _ = printsln [Label.toString rToSelf, ":"] val _ = $(jmp doSwitchNextBlock) val _ = printsln [Label.toString rToOther, ":"] in () end else () val _ = case mustReturnToOther of NONE => (Promise.force doNextChunk; leaveChunk (nextChunk, nextBlock)) | SOME dstChunk => leaveChunk (chunkFnVal' (dstChunk, mc), nextBlock) in () end end fun outputTransfer (t: Transfer.t): unit = let fun jump label = let val dstChunk = labelChunk label in if ChunkLabel.equals (dstChunk, selfChunk) then $(jmp (LLVM.Value.label label)) else leaveChunk (chunkFnVal' (dstChunk, mc), labelIndexValue label) end fun rtrans rsTo = let val mustRToOne = case rsTo of [] => NONE | l::rsTo => if List.forall (rsTo, fn l' => Label.equals (l, l')) then SOME l else NONE fun isSelf c = ChunkLabel.equals (selfChunk, c) val rsTo = List.fold (rsTo, [], fn (l, cs) => let val c = labelChunk l in if List.contains (cs, c, ChunkLabel.equals) then cs else c::cs end) val mayRToSelf = List.exists (rsTo, isSelf) val (mustRToSelf, mustRToOther) = case List.revKeepAll (rsTo, not o isSelf) of [] => (true, NONE) | c::rsTo => (false, if List.forall (rsTo, fn c' => ChunkLabel.equals (c, c')) then SOME c else NONE) in case (!Control.chunkMustRToSingOpt, mustRToOne) of (true, SOME dst) => jump dst | _ => indJump (!Control.chunkMustRToSelfOpt andalso mustRToSelf, !Control.chunkMayRToSelfOpt andalso mayRToSelf, if (!Control.chunkMustRToOtherOpt andalso (!Control.chunkMayRToSelfOpt orelse not mayRToSelf)) then mustRToOther else NONE) end val _ = if !Control.codegenComments > 0 then tbprintsln ["; ", Layout.toString (Transfer.layout t)] else () in case t of Transfer.CCall {func = CFunction.T {target = CFunction.Target.Direct "Thread_returnToC", ...}, return = SOME {return, size = SOME size}, ...} => let val _ = push (return, size) val _ = flushFrontier (); val _ = flushStackTop (); val tmp = newTemp (LLVM.Type.uintptr ()) val fnptr = LLVM.ModuleContext.addFnDecl (mc, "@Thread_returnToC", {argTys = [], resTy = LLVM.Type.uintptr (), vis = SOME "hidden"}) val _ = $(call {dst = tmp, tail = NONE, cconv = NONE, fnptr = fnptr, args = []}) val _ = $(ret tmp) in () end | Transfer.CCall {args, func, return} => let val CFunction.T {return = returnTy, target, symbolScope, ...} = func val args = operandsToRValues args val _ = Option.app (return, fn {return, size} => Option.app (size, fn size => push (return, size))) val _ = if CFunction.modifiesFrontier func then flushFrontier () else () val _ = if CFunction.readsStackTop func then flushStackTop () else () val resTy = if Type.isUnit returnTy then LLVM.Type.Void else Type.toLLVMType returnTy val res = newTemp resTy val (fnptr, args) = case target of CFunction.Target.Direct name => let val name = "@" ^ name val argTys = List.map (args, #2) val vis = case symbolScope of CFunction.SymbolScope.External => "default" | CFunction.SymbolScope.Private => "hidden" | CFunction.SymbolScope.Public => "default" val _ = LLVM.ModuleContext.addFnDecl (mc, name, {argTys = argTys, resTy = resTy, vis = SOME vis}) in (LLVM.Value.fnptr (name, argTys, resTy), args) end | CFunction.Target.Indirect => let val (cptr, args) = case args of cptr::args => (cptr, args) | _ => Error.bug "LLVMCodegen.outputTransfer: CCall,Indirect" val argTys = List.map (args, #2) val fnty = LLVM.Type.Function (argTys, resTy) val fnptr = newTemp (LLVM.Type.Pointer fnty) val _ = $(cast {dst = fnptr, src = cptr}) in (fnptr, args) end val _ = $(call {dst = res, tail = NONE, cconv = NONE, fnptr = fnptr, args = args}) val _ = case return of NONE => let val tmp = newTemp (LLVM.Type.uintptr ()) val fnptr = LLVM.ModuleContext.addFnDecl (mc, "@MLton_unreachable", {argTys = [], resTy = LLVM.Type.uintptr (), vis = SOME "hidden"}) val _ = $(call {dst = tmp, tail = NONE, cconv = NONE, fnptr = fnptr, args = []}) val _ = $(ret tmp) in () end | SOME {return, ...} => let val _ = if CFunction.modifiesFrontier func then cacheFrontier () else () val _ = if CFunction.writesStackTop func then cacheStackTop () else () val _ = if Type.isUnit returnTy then () else $(store {dst = creturnVar returnTy, src = res}) val _ = if CFunction.maySwitchThreadsFrom func then indJump (false, true, NONE) else $(jmp (LLVM.Value.label return)) in () end in () end | Transfer.Call {label, return, ...} => (Option.app (return, fn {return, size, ...} => push (return, size)) ; jump label) | Transfer.Goto dst => $(jmp (LLVM.Value.label dst)) | Transfer.Raise {raisesTo} => (outputStatement (Statement.PrimApp {args = Vector.new2 (Operand.gcField GCField.StackBottom, Operand.gcField GCField.ExnStack), dst = SOME Operand.StackTop, prim = Prim.CPointer_add}) ; rtrans raisesTo) | Transfer.Return {returnsTo} => rtrans returnsTo | Transfer.Switch (Switch.T {cases, default, expect, test, ...}) => let val test = operandToRValue test val test = case expect of NONE => test | SOME w => let val ws = WordX.size w val wty = LLVM.Type.Word ws val name = concat ["expect.i", WordSize.toString ws] val fnptr = LLVM.ModuleContext.intrinsic (mc, name, {argTys = [wty, wty], resTy = wty}) val tmp = newTemp wty val args = [test, LLVM.Value.word w] val _ = $(call {dst = tmp, tail = NONE, cconv = NONE, fnptr = fnptr, args = args}) in tmp end val (default, extra) = case default of SOME d => (d, fn () => ()) | NONE => let val d = Label.newNoname () in (d, fn () => (printsln [Label.toString d, ":"] ; $(unreachable ()))) end val _ = $(switch {value = test, default = LLVM.Value.label default, table = Vector.toListMap (cases, fn (w, l) => (LLVM.Value.word w, LLVM.Value.label l))}) val _ = extra () in () end end val outputStatement = fn s => let val _ = if !Control.codegenComments > 1 then tbprintsln ["; ", Layout.toString (Statement.layout s)] else () in outputStatement s end (* Fusing of adjacent `Word_` and `Word{S,U}_CheckP` * primitives *does not* depends on the relative order of `!a` and `?a` * in /basis-library/primitive/prim1.sml:mkOverflow *) fun outputStatementsFuseOpAndChk statements = (ignore o Vector.foldi) (statements, false, fn (i, s1, skip) => let fun default () = (outputStatement s1; false) in if skip then false else case s1 of Statement.PrimApp {args = args1, dst = SOME dst1, prim = prim1} => let fun fuse chk = (case Vector.sub (statements, i + 1) of s2 as Statement.PrimApp {args = args2, dst = SOME dst2, prim = prim2} => if Vector.equals (args1, args2, Operand.equals) then (case chk prim2 of NONE=> default () | SOME prim => let val _ = if !Control.codegenComments > 1 then (tbprintsln ["; ", Layout.toString (Statement.layout s1)] ; tbprintsln ["; ", Layout.toString (Statement.layout s2)]) else () val args = operandsToRValues args1 val (res1, res2) = primAppOpAndCheck {args = args, prim = prim, mc = mc, newTemp = newTemp, $ = $} val (_, storeDst1) = operandToLValue dst1 val _ = $(storeDst1 {src = res1}) val (_, storeDst2) = operandToLValue dst2 val _ = $(storeDst2 {src = res2}) in true end) else default () | _ => default ()) handle Subscript => default () in case prim1 of Prim.Word_add ws1 => fuse (fn prim2 => case prim2 of Prim.Word_addCheckP (ws2, _) => if WordSize.equals (ws1, ws2) then SOME prim2 else NONE | _ => NONE) | Prim.Word_addCheckP (ws1, _) => fuse (fn prim2 => case prim2 of Prim.Word_add ws2 => if WordSize.equals (ws1, ws2) then SOME prim1 else NONE | _ => NONE) | Prim.Word_mul (ws1, {signed = signed1}) => fuse (fn prim2 => case prim2 of Prim.Word_mulCheckP (ws2, {signed = signed2}) => if WordSize.equals (ws1, ws2) andalso Bool.equals (signed1, signed2) then SOME prim2 else NONE | _ => NONE) | Prim.Word_mulCheckP (ws1, {signed = signed1}) => fuse (fn prim2 => case prim2 of Prim.Word_mul (ws2, {signed = signed2}) => if WordSize.equals (ws1, ws2) andalso Bool.equals (signed1, signed2) then SOME prim1 else NONE | _ => NONE) | Prim.Word_neg ws1 => fuse (fn prim2 => case prim2 of Prim.Word_negCheckP (ws2, _) => if WordSize.equals (ws1, ws2) then SOME prim2 else NONE | _ => NONE) | Prim.Word_negCheckP (ws1, _) => fuse (fn prim2 => case prim2 of Prim.Word_neg ws2 => if WordSize.equals (ws1, ws2) then SOME prim1 else NONE | _ => NONE) | Prim.Word_sub ws1 => fuse (fn prim2 => case prim2 of Prim.Word_subCheckP (ws2, _) => if WordSize.equals (ws1, ws2) then SOME prim2 else NONE | _ => NONE) | Prim.Word_subCheckP (ws1, _) => fuse (fn prim2 => case prim2 of Prim.Word_sub ws2 => if WordSize.equals (ws1, ws2) then SOME prim1 else NONE | _ => NONE) | _ => default () end | _ => default () end) fun outputBlock (Block.T {kind, label, statements, transfer, ...}) = let val _ = printsln [Label.toString label, ":"] val _ = case kind of Kind.Cont {frameInfo, ...} => pop frameInfo | Kind.CReturn {dst, frameInfo, ...} => (Option.app (frameInfo, pop) ; (Option.app (dst, fn dst => let val dst = Live.toOperand dst val ty = Operand.ty dst val creturn = newTemp (Type.toLLVMType ty) val _ = $(load {dst = creturn, src = creturnVar ty}) val (_, storeDst) = operandToLValue dst val _ = $(storeDst {src = creturn}) in () end)) ; ()) | Kind.Func _ => () | Kind.Handler {frameInfo, ...} => pop frameInfo | Kind.Jump => () val _ = if !Control.codegenFuseOpAndChk then outputStatementsFuseOpAndChk statements else Vector.foreach (statements, outputStatement) val _ = outputTransfer transfer val _ = print "\n" in () end val entries = let val entries = ref [] val _ = Vector.foreach (blocks, fn Block.T {kind, label, ...} => if Kind.isEntry kind then List.push (entries, (label, labelIndex label)) else ()) in List.insertionSort (!entries, fn ((_, i1), (_, i2)) => i1 <= i2) end val numEntries = List.length entries val nextLabels = (concat [ChunkLabel.toString' chunkLabel, ".nextLabels"], LLVM.Type.Pointer (LLVM.Type.Array (numEntries, LLVM.Type.blockaddress))) val _ = if !Control.chunkJumpTable then let val _ = prints [#1 nextLabels, " = internal constant ", LLVM.Type.toString (LLVM.Type.dePointer (#2 nextLabels)), " ["] val _ = List.foreachi (entries, fn (i, (label, _)) => (if i > 0 then print "," else () ; prints ["\n\ti8* blockaddress(", ChunkLabel.toString' chunkLabel, ", ", "%", Label.toString label, ")"])) val _ = print " ]\n" in () end else () val chunkArgs = concat ["(", String.concatWith (List.map (chunkFnArgs, fn (arg, argTy) => concat [LLVM.Type.toString argTy, " ", arg]), ", "), ")"] val _ = LLVM.ModuleContext.addFnDefn (mc, ChunkLabel.toString chunkLabel) val _ = printsln ["define hidden ", LLVM.Type.toString chunkFnResTy, " ", ChunkLabel.toString chunkLabel, chunkArgs, " {"] val _ = if !Control.llvmCC10 then let val res = ("%res", chunkFnResTy) val _ = $(call {dst = res, tail = NONE, cconv = SOME "cc10", fnptr = chunkFnValX (chunkLabel, mc), args = chunkFnArgs}) val _ = $(ret res) val _ = println "}" val _ = LLVM.ModuleContext.addFnDefn (mc, ChunkLabel.toStringX chunkLabel) val _ = printsln ["define hidden cc10 ", LLVM.Type.toString chunkFnResTy, " ", ChunkLabel.toStringX chunkLabel, chunkArgs, " {"] in () end else () val _ = print "start:\n" val _ = List.foreach (CType.all, fn ct => $(alloca {dst = creturnVarC ct})) val _ = List.foreach (CType.all, fn ct => Int.for (0, 1 + tempsMax ct, fn i => $(alloca {dst = temporaryVarC (ct, i)}))) val _ = $(alloca {dst = stackTopVar}) val _ = $(store {dst = stackTopVar, src = stackTopArg}) val _ = $(alloca {dst = frontierVar}) val _ = $(store {dst = frontierVar, src = frontierArg}) val _ = $(alloca {dst = nextBlockVar}) val _ = $(store {dst = nextBlockVar, src = nextBlockArg}) val _ = $(jmp doSwitchNextBlock) val _ = print "\n" val _ = print "doSwitchNextBlock:\n" val nextBlock = newTemp (LLVM.Type.uintptr ()) val _ = $(load {dst = nextBlock, src = nextBlockVar}) val _ = if !Control.chunkJumpTable then let val index = newTemp (LLVM.Type.uintptr ()) val nextLabelAddr = newTemp (LLVM.Type.Pointer LLVM.Type.blockaddress) val nextLabel = newTemp LLVM.Type.blockaddress val bias = LLVM.Value.word (WordX.fromInt (#2 (List.first entries), WordSize.cpointer ())) val _ = $(naryop {dst = index, oper = ("sub nuw nsw", LLVM.Type.uintptr ()), args = [nextBlock, bias]}) val _ = $(gep {dst = nextLabelAddr, src = nextLabels, args = [LLVM.Value.zero WordSize.word32, index]}) val _ = $(load {dst = nextLabel, src = nextLabelAddr}) val _ = $(indirectbr {addr = nextLabel, labels = List.map (entries, LLVM.Value.label o #1)}) in () end else let val _ = $(switch {value = nextBlock, default = LLVM.Value.label' "switchNextBlockDefault", table = List.map (entries, fn (label, index) => (LLVM.Value.word (WordX.fromInt (index, WordSize.cpointer ())), LLVM.Value.label label))}) val _ = print "switchNextBlockDefault:\n" val _ = $(unreachable ()) in () end val _ = print "\n" val _ = Vector.foreach (blocks, outputBlock) val _ = print "}\n\n" in () end fun outputChunks chunks = let val {done, print, ...} = outputLL () val mc = LLVM.ModuleContext.new () in print "\n" ; List.foreach (chunks, fn chunk => outputChunkFn (chunk, mc, print)) ; LLVM.ModuleContext.emit (mc, print) ; done () end val chunksWithSizes = List.revMap (chunks, fn chunk as Chunk.T {blocks, ...} => (chunk, Vector.fold (blocks, 0, fn (Block.T {statements, ...}, n) => n + Vector.length statements + 1))) fun batch (chunksWithSizes, acc, n) = case chunksWithSizes of [] => outputChunks acc | (chunk, s)::chunksWithSizes' => let val m = n + s in if List.isEmpty acc orelse m <= !Control.chunkBatch then batch (chunksWithSizes', chunk::acc, m) else (outputChunks acc; batch (chunksWithSizes, [], 0)) end val _ = batch (chunksWithSizes, [], 0) val {print, done, ...} = outputC () fun defineNextChunks (nextChunksName, chunkName) = (List.foreach (chunks, fn Chunk.T {chunkLabel, ...} => (print "PRIVATE extern ChunkFn_t " ; print (chunkName chunkLabel) ; print ";\n")) ; print "PRIVATE ChunkFnPtr_t const " ; print nextChunksName ; print "[" ; print (Int.toString (Vector.length nextChunks)) ; print "] = {\n" ; Vector.foreachi (nextChunks, fn (i, label) => (print "\t" ; print "/* " ; print (Int.toString i) ; print ": */ " ; print "/* " ; print (Label.toString label) ; print " */ &(" ; print (chunkName (labelChunk label)) ; print "),\n")) ; print "};\n") val defineNextChunks = fn () => (defineNextChunks ("nextChunks", ChunkLabel.toStringForC) ; if !Control.llvmCC10 then defineNextChunks ("nextXChunks", ChunkLabel.toStringXForC) else ()) val additionalMainArgs = let val mainLabel = #label main in [concat [Int.toString (labelIndex mainLabel), " /* ", Label.toString mainLabel, " */"]] end val _ = CCodegen.outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["c-main.h"], program = program, print = print, rest = defineNextChunks} val _ = done () in () end end mlton-20210117+dfsg/mlton/codegen/llvm-codegen/llvm-codegen.sig000066400000000000000000000015451416264345000242240ustar00rootroot00000000000000(* Copyright (C) 2013-2014 Matthew Fluet, Brian Leibig. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature LLVM_CODEGEN_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature LLVM_CODEGEN = sig include LLVM_CODEGEN_STRUCTS val implementsPrim: 'a Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputLL: unit -> {file: File.t, print: string -> unit, done: unit -> unit} } -> unit end mlton-20210117+dfsg/mlton/codegen/llvm-codegen/sources.cm000066400000000000000000000005371416264345000231500ustar00rootroot00000000000000(* Copyright (C) 2013-2014 Matthew Fluet, Brian Leibig * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor LLVMCodegen is ../../../lib/mlton/sources.cm ../../atoms/sources.cm ../../backend/sources.cm ../../control/sources.cm ../c-codegen/sources.cm llvm-codegen.sig llvm-codegen.fun mlton-20210117+dfsg/mlton/codegen/llvm-codegen/sources.mlb000066400000000000000000000005731416264345000233230ustar00rootroot00000000000000(* Copyright (C) 2013-2014 Matthew Fluet, Brian Leibig * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../atoms/sources.mlb ../../backend/sources.mlb ../../control/sources.mlb ../c-codegen/sources.mlb llvm-codegen.sig llvm-codegen.fun in functor LLVMCodegen end mlton-20210117+dfsg/mlton/codegen/sources.cm000066400000000000000000000007311416264345000205700ustar00rootroot00000000000000(* Copyright (C) 2011 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor amd64Codegen functor CCodegen functor LLVMCodegen functor x86Codegen is amd64-codegen/sources.cm c-codegen/sources.cm llvm-codegen/sources.cm x86-codegen/sources.cm mlton-20210117+dfsg/mlton/codegen/sources.mlb000066400000000000000000000007641416264345000207510ustar00rootroot00000000000000(* Copyright (C) 2011 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local amd64-codegen/sources.mlb c-codegen/sources.mlb llvm-codegen/sources.mlb x86-codegen/sources.mlb in functor amd64Codegen functor CCodegen functor LLVMCodegen functor x86Codegen end mlton-20210117+dfsg/mlton/codegen/x86-codegen/000077500000000000000000000000001416264345000206125ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/codegen/x86-codegen/peephole.fun000066400000000000000000000351611416264345000231330ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Peephole(T : PEEPHOLE_TYPES): PEEPHOLE = struct open T datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element = fn p => ((1, SOME 1), p) val All : (statement_type -> bool) -> statement_element = fn p => ((0, NONE), p) type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} datatype match_state = Start of {block: block} | Continue of {remaining: optimization list, match: match} | Done of {block: block} type find_state = {remaining: optimization list, state: {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, finish: statement_type list, transfer: transfer_type}} fun split (l, p) = case l of [] => ([],[]) | l as h::t => if p h then let val (tt,ff) = split (t, p) in (h::tt,ff) end else ([],l) val rec matcher' : {template_statement: statement_element, statement: statement_type list, finish: statement_type list} -> {statement: statement_type list, finish: statement_type list} option = fn (* Zero *) {template_statement = ((0, SOME 0), _), statement, finish} => SOME {statement = List.rev statement, finish = finish} | (* ZeroOrOne *) {template_statement = ((0, SOME 1), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* One *) {template_statement = ((1, SOME 1), p), statement, finish} => (case finish of [] => NONE | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else NONE) | (* *) {template_statement = ((0, SOME i), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then matcher' {template_statement = ((0, SOME (i-1)), p), statement = statement'::statement, finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* All *) {template_statement = ((0, NONE), p), statement, finish} => let val (statement',finish') = split (finish, p) in SOME {statement = List.fold(statement, statement', op ::), finish = finish'} end | {template_statement = ((min, max), p), statement, finish = (statement'::finish')} => if p statement' then matcher' {template_statement = ((Int.max(min-1,0), Option.map(max,fn i => i - 1)), p), statement = statement'::statement, finish = finish'} else NONE | _ => NONE val rec matcher : {template_statements: statement_element list, statements: statement_type list list, finish: statement_type list} -> {statements: statement_type list list, finish: statement_type list} option = fn {template_statements = [], statements, finish} => SOME {statements = List.rev statements, finish = finish} | {template_statements = (template_statement::template_statements), statements, finish} => (case matcher' {template_statement = template_statement, statement = [], finish = finish} of NONE => NONE | SOME {statement, finish} => matcher {template_statements = template_statements, statements = statement::statements, finish = finish}) fun peepholeBlock' {optimizations: optimization list, match_state: match_state} = let fun next {remaining: optimization list, state as {entry, profileLabel, start, finish, transfer}} : find_state option = (case remaining of [] => NONE | _::nil => (case finish of [] => NONE | statement::finish => SOME {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = statement::start, finish = finish, transfer = transfer}}) | _::remaining => SOME {remaining = remaining, state = state}) fun findMatch' (find_state as {remaining as {template = {start = template_start, statements = template_statements, finish = template_finish, transfer = template_transfer}, ...}::_, state = {entry, profileLabel, start, finish, transfer}}) : match_state = let fun loop () = (case next find_state of SOME find_state => findMatch' find_state | NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}}) in if not (template_transfer transfer) then loop () else if template_start = Empty andalso not (List.isEmpty start) then loop () else case matcher {template_statements = template_statements, statements = [], finish = finish} of NONE => loop () | SOME {statements, finish} => if template_finish = Empty andalso not (List.isEmpty finish) then loop () else Continue {remaining = remaining, match = {entry = entry, profileLabel = profileLabel, start = start, statements = statements, finish = finish, transfer = transfer}} end | findMatch' _ = Error.bug "Peephole.peepholeBlock'.findMatch'" fun findMatch (match_state: match_state) : match_state = case match_state of Start {block = T {entry, profileLabel, statements, transfer}} => let val find_state = {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = [], finish = statements, transfer = transfer}} in findMatch' find_state end | Continue {remaining, match = {entry, profileLabel, start, statements, finish, transfer}, ...} => let val finish = List.foldr(statements, finish, op @) val find_state = {remaining = remaining, state = {entry = entry, profileLabel = profileLabel, start = start, finish = finish, transfer = transfer}} in case next find_state of NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}} | SOME find_state => findMatch' find_state end | Done _ => match_state fun peepholeBlock'' {match_state: match_state, changed: bool} = case findMatch match_state of match_state as Continue {remaining = {rewriter, callback, ...}::_, match} => (case rewriter match of SOME block => (callback true; peepholeBlock'' {match_state = Start {block = block}, changed = true}) | NONE => (callback false; peepholeBlock'' {match_state = match_state, changed = changed})) | Done {block} => {block = block, changed = changed} | _ => Error.bug "Peephole.peepholeBlock''" in case optimizations of [] => (case match_state of Start {block = block} => {block = block, changed = false} | _ => Error.bug "Peephole.peepholeBlock'") | _ => peepholeBlock'' {match_state = match_state, changed = false} end fun peepholeBlock {block: block, optimizations: optimization list} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} fun peepholeBlocks {blocks: block list, optimizations: optimization list} = let val {blocks, changed} = List.foldr (blocks, {blocks = [], changed = false}, fn (block,{blocks,changed}) => let val {block = block', changed = changed'} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} in {blocks = block'::blocks, changed = changed orelse changed'} end) in {blocks = blocks, changed = changed} end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/peephole.sig000066400000000000000000000040731416264345000231230ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PEEPHOLE_TYPES = sig type entry_type type profileLabel_type type statement_type type transfer_type datatype block = T of {entry: entry_type, profileLabel: profileLabel_type, statements: statement_type list, transfer: transfer_type} end signature PEEPHOLE = sig include PEEPHOLE_TYPES datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element val All : (statement_type -> bool) -> statement_element type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} val peepholeBlock : {block: block, optimizations: optimization list} -> {block: block, changed: bool} val peepholeBlocks : {blocks: block list, optimizations: optimization list} -> {blocks: block list, changed: bool} end mlton-20210117+dfsg/mlton/codegen/x86-codegen/sources.cm000066400000000000000000000017271416264345000226250ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor x86Codegen is ../../../lib/mlton/sources.cm ../../atoms/sources.cm ../../backend/sources.cm ../../control/sources.cm ../c-codegen/sources.cm peephole.sig peephole.fun x86.sig x86.fun x86-pseudo.sig x86-mlton-basic.sig x86-mlton-basic.fun x86-liveness.sig x86-liveness.fun x86-mlton.sig x86-mlton.fun x86-allocate-registers.sig x86-allocate-registers.fun x86-entry-transfer.sig x86-entry-transfer.fun x86-jump-info.sig x86-jump-info.fun x86-loop-info.sig x86-loop-info.fun x86-live-transfers.sig x86-live-transfers.fun x86-generate-transfers.sig x86-generate-transfers.fun x86-simplify.sig x86-simplify.fun x86-translate.sig x86-translate.fun x86-codegen.sig x86-codegen.fun mlton-20210117+dfsg/mlton/codegen/x86-codegen/sources.mlb000066400000000000000000000021041416264345000227660ustar00rootroot00000000000000(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../atoms/sources.mlb ../../backend/sources.mlb ../../control/sources.mlb ../c-codegen/sources.mlb peephole.sig peephole.fun x86.sig x86.fun x86-pseudo.sig x86-mlton-basic.sig x86-mlton-basic.fun x86-liveness.sig x86-liveness.fun x86-mlton.sig x86-mlton.fun x86-allocate-registers.sig x86-allocate-registers.fun x86-entry-transfer.sig x86-entry-transfer.fun x86-jump-info.sig x86-jump-info.fun x86-loop-info.sig x86-loop-info.fun x86-live-transfers.sig x86-live-transfers.fun x86-generate-transfers.sig x86-generate-transfers.fun x86-simplify.sig x86-simplify.fun x86-translate.sig x86-translate.fun x86-codegen.sig x86-codegen.fun in functor x86Codegen end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-allocate-registers.fun000066400000000000000000020105021416264345000255400ustar00rootroot00000000000000(* Copyright (C) 2010,2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86AllocateRegisters(S: X86_ALLOCATE_REGISTERS_STRUCTS) : X86_ALLOCATE_REGISTERS = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop fun picRelative () = (* When outputing position-independent-code (PIC), we need to keep * one register pointing at a known local address. Addresses are * then computed relative to this register. *) let datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t (* If the ELF symbol is external, we already setup an indirect * mov to load the address. Don't munge the symbol more. *) fun mungeLabelELF l = case Label.toString l of s => if String.hasSuffix (s, { suffix = "@GOT" }) then l else Label.fromString (s ^ "@GOTOFF") (* !!! PIC on darwin not done yet !!! *) (* It will work using %esp -> MLtonLocalBaseSymbol *) fun mungeLabelDarwin l = Label.fromString (Label.toString l ^ "-MLtonLocalBaseSymbol") in case (!Control.Target.os, !Control.Native.pic) of (* Only darwin and ELF might be using PIC *) (Darwin, true) => (mungeLabelDarwin, SOME Register.esp) | (_, true) => (mungeLabelELF, SOME Register.ebx) | (_, false) => (fn l => l, NONE) end fun track memloc = let val trackClasses = ClassSet.add(ClassSet.+ (!x86MLton.Classes.livenessClasses, !x86MLton.Classes.holdClasses), x86MLton.Classes.StaticNonTemp) in ClassSet.contains(trackClasses, MemLoc.class memloc) end fun volatile memloc = let val volatileClasses = !x86MLton.Classes.volatileClasses in ClassSet.contains(volatileClasses, MemLoc.class memloc) end fun partition(l, p) = let val rec partition' = fn ([],PS) => PS | (h::t,PS) => let val rec partition'' = fn [] => [[h]] | P::PS => if List.exists(P,fn x => p(h, x)) then (h::P)::PS else P::(partition'' PS) in partition'(t,partition'' PS) end in partition'(l,[]) end fun totalOrder (l, plt) = let val rec totalOrder' = fn ([],l) => l | (h::t,l) => let val rec split = fn (lt,t) => case List.splitPrefix (t, fn x => plt(x,h)) of (nil,t) => lt@[h]@t | (lt',t) => split(lt@lt',t) in totalOrder'(t,split([],l)) end in totalOrder'(l,[]) end val bool_lt = fn (false, true) => true | _ => false val bool_gt = fn (true, false) => true | _ => false fun option_lt lt = fn (SOME x, SOME y) => lt (x,y) | (NONE, SOME _) => true | _ => false structure Liveness = struct datatype futureMemlocTag = FLIVE | FCOMMIT | FREMOVE | FDEAD | FUSE | FUSEDEF | FDEF val futureMemlocTag_toString = fn FLIVE => "FLIVE" | FCOMMIT => "FCOMMIT" | FREMOVE => "FREMOVE" | FDEAD => "FDEAD" | FUSE => "FUSE" | FUSEDEF => "FUSEDEF" | FDEF => "FDEF" type futureMemloc = futureMemlocTag * MemLoc.t datatype futureMemlocPredTag = FCOMMITP | FREMOVEP | FDEADP | FMCOMMITP | FMREMOVEP val futureMemlocPredTag_toString = fn FCOMMITP => "FCOMMITP" | FREMOVEP => "FREMOVEP" | FDEADP => "FDEADP" | FMCOMMITP => "FMCOMMITP" | FMREMOVEP => "FMREMOVEP" type futureMemlocPred = futureMemlocPredTag * (MemLoc.t -> bool) datatype future = M of futureMemloc | MP of futureMemlocPred val future_toString = fn (M (tag, memloc)) => concat [futureMemlocTag_toString tag, " ", MemLoc.toString memloc] | (MP (tag, _)) => concat [futureMemlocPredTag_toString tag] type hint = Register.t * MemLoc.t list * MemLocSet.t val hint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", Register.toString register] type t = {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, futures: {pre: future list, post: future list}, hint: hint list} (* fun toString {dead, commit, remove, futures = {pre, post}, hint} = let fun doit (name, l, toString, s) = List.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) fun doit' (name, l, toString, s) = MemLocSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, "")))))) end *) fun toComments {dead, commit, remove, futures = {pre, post}, hint} = let fun doit (name, l, toString, ac) = List.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) fun doit' (name, l, toString, ac) = MemLocSet.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, [])))))) end datatype commit = NO | COMMIT | REMOVE | DEAD fun predict(future, memloc) = let val rec sawNothing = fn [] => if track memloc then DEAD else REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawCommit future | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => sawUse future | FUSEDEF => NO | FDEF => DEAD else if ((tag' = FUSEDEF) orelse (tag' = FDEF)) andalso List.exists (MemLoc.utilized memloc, fn memloc'' => MemLoc.mayAlias(memloc'', memloc')) then REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawNothing future else sawNothing future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => sawRemove future | FDEADP => DEAD | FMCOMMITP => sawCommit future | FMREMOVEP => sawRemove future else sawNothing future and sawCommit = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawCommit future | FREMOVE => REMOVE | FDEAD => REMOVE | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawCommit future else sawCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => REMOVE | FDEADP => REMOVE | FMCOMMITP => sawCommit future | FMREMOVEP => REMOVE else sawCommit future and sawRemove = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => REMOVE | FCOMMIT => REMOVE | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => DEAD else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawRemove future else sawRemove future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => REMOVE | FREMOVEP => REMOVE | FDEADP => DEAD | FMCOMMITP => REMOVE | FMREMOVEP => sawRemove future else sawRemove future and sawUse = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => sawUse future | FUSEDEF => NO | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUse future else sawUse future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUse future and sawUseCommit = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUseCommit future else sawUseCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUseCommit future fun check commit = if List.exists (MemLoc.utilized memloc, fn memloc' => case predict (future, memloc') of REMOVE => true | DEAD => true | _ => false) then REMOVE else commit val default = case sawNothing future of REMOVE => REMOVE | DEAD => DEAD | commit => check commit in default end val split = fn (set, p) => MemLocSet.fold (set, (MemLocSet.empty,MemLocSet.empty,MemLocSet.empty,MemLocSet.empty), fn (memloc, (no, commit, remove, dead)) => let val add = fn set => MemLocSet.add(set, memloc) in case p memloc of NO => (add no, commit, remove, dead) | COMMIT => (no, add commit, remove, dead) | REMOVE => (no, commit, add remove, dead) | DEAD => (no, commit, remove, add dead) end) fun liveness {uses: MemLocSet.t, defs: MemLocSet.t, future: future list} : {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, future: future list} = let local fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) in val allUses = doit'(defs, doit'(uses, uses)) val allDefs = defs end val current = MemLocSet.+(allUses, allDefs) val current_usedef = MemLocSet.intersect(allUses, allDefs) val current_use = MemLocSet.-(allUses, current_usedef) val current_def = MemLocSet.-(allDefs, current_usedef) val (_,commit,remove,dead) = split(current, fn memloc => predict(future, memloc)) val future = let fun doit(memlocs, tag, future) = MemLocSet.fold (memlocs, future, fn (memloc,future) => (M (tag, memloc))::future) in doit(current_use, FUSE, doit(current_usedef, FUSEDEF, doit(current_def, FDEF, future))) end val info = {dead = dead, commit = commit, remove = remove, future = future} in info end fun livenessInstruction {instruction: Instruction.t, future: future list} = let val future_post = future val {uses, defs, ...} = Instruction.uses_defs_kills instruction local fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand, memlocs) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(memlocs, memloc) | NONE => memlocs) in val uses = doit uses val defs = doit defs end val {dead,commit,remove,future} = liveness {uses = uses, defs = defs, future = future_post} val future_pre = future val info = {dead = dead, commit = commit, remove = remove, futures = {pre = future_pre, post = future_post}} in info end fun livenessDirective {directive: Directive.t, future: future list} = let val future_post = future fun addLive (memlocsX, f) = List.fold (memlocsX, future, fn (X, future) => (M (FLIVE, f X))::future) fun addLive' (memlocs) = MemLocSet.fold (memlocs, future, fn (memloc, future) => (M (FLIVE, memloc))::future) val future_pre = case directive of Directive.Reset => [] | Directive.Cache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.FltCache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes, ...} => MemLocSet.fold (commit_memlocs, MemLocSet.fold (remove_memlocs, MemLocSet.fold (dead_memlocs, (MP (FCOMMITP, fn memloc => ClassSet.contains(commit_classes, MemLoc.class memloc))):: (MP (FREMOVEP, fn memloc => ClassSet.contains(remove_classes, MemLoc.class memloc))):: (MP (FDEADP, fn memloc => ClassSet.contains(dead_classes, MemLoc.class memloc))):: future, fn (memloc,future) => (M (FDEAD, memloc))::future), fn (memloc,future) => (M (FREMOVE, memloc))::future), fn (memloc,future) => (M (FCOMMIT, memloc))::future) | Directive.CCall => (MP (FCOMMITP, fn memloc => MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))):: (MP (FMREMOVEP, fn memloc => (not (MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))) andalso (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.Return {returns} => (List.map(returns, fn {dst, ...} => M (FDEF, dst))) @ future | Directive.ClearFlt => (MP (FMREMOVEP, fn memloc => (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.SaveRegAlloc {live, ...} => addLive'(live) | _ => future val info = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future_pre, post = future_post}} in info end fun livenessAssembly {assembly: Assembly.t, future: future list, hint: hint list} : t = let fun default () = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future, post = future}} val {dead, commit, remove, futures} = case assembly of Assembly.Comment _ => default () | Assembly.Directive d => livenessDirective {directive = d, future = future} | Assembly.Instruction i => livenessInstruction {instruction = i, future = future} | Assembly.Label _ => default () | Assembly.PseudoOp _ => default () val hint' = Assembly.hints assembly val hint = List.fold (case assembly of Assembly.Directive Directive.Reset => [] | _ => hint, List.revMap (hint', fn (memloc, register) => (register, [memloc], MemLocSet.empty)), fn ((hint_register,hint_memlocs,hint_ignore),hint) => if List.exists (hint, fn (hint_register',_,_) => Register.coincide(hint_register, hint_register')) then hint else let val hint_memloc = hd hint_memlocs in if List.fold (hint, false, fn ((_,hint_memlocs',_),b) => b orelse List.contains (hint_memlocs', hint_memloc, MemLoc.eq)) then hint else (hint_register, [hint_memloc], MemLocSet.union(dead, hint_ignore))::hint end) val hint = case assembly of (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (hint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => hint val info = {dead = dead, commit = commit, remove = remove, futures = futures, hint = hint} in info end fun toLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = let val {assembly,...} = List.foldr (assembly, {assembly = [], future = [], hint = []}, fn (asm, {assembly,future,hint}) => let val info as {futures = {pre, ...}, hint, ...} = livenessAssembly {assembly = asm, future = future, hint = hint} in {assembly = (asm,info)::assembly, future = pre, hint = hint} end) in assembly end val (toLiveness,toLiveness_msg) = tracer "toLiveness" toLiveness fun toNoLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = List.map(assembly, fn asm => (asm,{dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = [], post = []}, hint = []})) val (toNoLiveness,toNoLiveness_msg) = tracer "toNoLiveness" toNoLiveness end structure RegisterAllocation = struct exception Spill val spill : Int.t ref = ref 0 val spillLabel = Label.fromString "spill" val depth : Int.t ref = ref 0 datatype commit = NO | COMMIT of int | REMOVE of int | TRYCOMMIT of int | TRYREMOVE of int val commit_toString = fn NO => "NO" | COMMIT i => "COMMIT " ^ (Int.toString i) | REMOVE i => "REMOVE " ^ (Int.toString i) | TRYCOMMIT i => "TRYCOMMIT " ^ (Int.toString i) | TRYREMOVE i => "TRYREMOVE " ^ (Int.toString i) type value = {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun value_toString {register, memloc, weight, sync, commit} = concat [Register.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type fltvalue = {fltregister: FltRegister.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun fltvalue_toString {fltregister, memloc, weight, sync, commit} = concat [FltRegister.toString fltregister, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type t = {entries: value list, reserved: Register.t list, fltstack: fltvalue list} (* fun unique ({entries, fltstack, ...}: t) = let fun check_entries (entries: value list, res) = case entries of [] => res | ({register, memloc, ...})::entries => check_entries (entries, List.foldr (entries, res, fn ({register = register', memloc = memloc', ...}, res) => res andalso (not (Register.coincide (register, register'))) andalso (not (MemLoc.eq (memloc, memloc'))))) fun check_fltstack (fltstack: fltvalue list, res) = case fltstack of [] => res | ({fltregister, memloc, ...})::fltstack => check_fltstack (fltstack, List.foldr (fltstack, res, fn ({fltregister = fltregister', memloc = memloc', ...}, res) => res andalso (not (FltRegister.eq (fltregister, fltregister'))) andalso (not (MemLoc.eq (memloc, memloc'))))) in check_entries(entries, true) andalso check_fltstack(fltstack, true) end *) fun toString ({entries, reserved, fltstack}: t) = let fun doit (name, l, toString, ac) = (name ^ "\n") ^ (List.fold(l, ac, fn (x, ac) => (toString x) ^ "\n" ^ ac)) in doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("fltstack:", fltstack, fltvalue_toString, ""))) end fun toComments ({entries, reserved, fltstack}: t) = let fun doit (name, l, toString, ac) = (Assembly.comment name):: (List.fold(l, ac, fn (x, ac) => (Assembly.comment (toString x)):: ac)) in AppendList.fromList (doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("fltstack:", fltstack, fltvalue_toString, [])))) end val {get = getRA : Directive.Id.t -> {registerAllocation: t}, set = setRA, ...} = Property.getSetOnce (Directive.Id.plist, Property.initRaise ("getRA", fn _ => Layout.empty)) fun empty () : t = {entries = [], reserved = [], fltstack = []} fun reserve' {register: Register.t, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = register::reserved, fltstack = fltstack}} fun reserve {registers: Register.t list, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = registers @ reserved, fltstack = fltstack}} fun unreserve' {register: Register.t, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => Register.eq (register', register)), fltstack = fltstack}} fun unreserve {registers: Register.t list, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => List.contains (registers, register', Register.eq)), fltstack = fltstack}} fun valueMap {map, registerAllocation = {entries, reserved, fltstack}: t} = {entries = List.revMap(entries, map), reserved = reserved, fltstack = fltstack} fun valueFilter {filter, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, filter) fun valueRegister {register, registerAllocation} = case valueFilter {filter = fn {register = register', ...} => Register.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.valueRegister" fun valuesRegister {register = Register.T {reg, ...}, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, fn {register = Register.T {reg = reg', ...}, ...} => reg = reg') fun fltvalueMap {map, registerAllocation = {entries, reserved, fltstack}: t} = {entries = entries, reserved = reserved, fltstack = List.map(fltstack, map)} fun fltvalueFilter {filter, registerAllocation = {fltstack, ...} :t} = List.keepAll(fltstack, filter) fun update {value as {register,...}, registerAllocation = {entries, reserved, fltstack}: t} = {entries = let val entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register,register')) in value::entries end, reserved = reserved, fltstack = fltstack} fun fltupdate {value as {fltregister, ...}, registerAllocation = {entries, reserved, fltstack}: t} = {entries = entries, reserved = reserved, fltstack = let val rec fltupdate' = fn [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltupdate" | (value' as {fltregister = fltregister', ...})::l => if FltRegister.eq(fltregister, fltregister') then value::l else value'::(fltupdate' l) in fltupdate' fltstack end} fun delete {register, registerAllocation = {entries, reserved, fltstack}: t} = {entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register, register')), reserved = reserved, fltstack = fltstack} fun deletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => delete {register = register, registerAllocation = registerAllocation}) fun fltpush {value, registerAllocation = {entries, reserved, fltstack}: t} = {fltrename = FltRegister.push, registerAllocation = {entries = entries, reserved = reserved, fltstack = case #fltregister value of FltRegister.T 0 => value::(List.map(fltstack, fn {fltregister = FltRegister.T i, memloc, weight, sync, commit} => {fltregister = FltRegister.T (i + 1), memloc = memloc, weight = weight, sync = sync, commit = commit})) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.fltpush"}} fun fltpop {registerAllocation = {entries, reserved, fltstack}: t} = {fltrename = FltRegister.pop, registerAllocation = {entries = entries, reserved = reserved, fltstack = case fltstack of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltpop" | _::fltstack => List.map(fltstack, fn {fltregister = FltRegister.T i, memloc, weight, sync, commit} => {fltregister = FltRegister.T (i - 1), memloc = memloc, weight = weight, sync = sync, commit = commit})}} fun fltxch' {fltregister: FltRegister.t, registerAllocation = {entries, reserved, fltstack}: t} = let val rec split = fn (_ : fltvalue list, []) => Error.bug "x86AllocateRegisters.RegisterAllocation.fltxch'.split" | (fltstack_pre,value::fltstack_post) => if FltRegister.eq(fltregister, #fltregister value) then (List.rev fltstack_pre, value, fltstack_post) else split (value::fltstack_pre, fltstack_post) val (fltstack_pre, {fltregister = fltregister', memloc = memloc', weight = weight', sync = sync', commit = commit'}, fltstack_post) = split ([], fltstack) in {fltrename = fn fltregister => if FltRegister.eq(fltregister, fltregister') then FltRegister.top else if FltRegister.eq(fltregister, FltRegister.top) then fltregister' else fltregister, registerAllocation = {entries = entries, reserved = reserved, fltstack = case fltstack_pre of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltxch'" | ({fltregister, memloc, weight, sync, commit})::fltstack_pre => ({fltregister = fltregister, memloc = memloc', weight = weight', sync = sync', commit = commit'}):: (List.concat [fltstack_pre, ({fltregister = fltregister', memloc = memloc, weight = weight, sync = sync, commit = commit}):: fltstack_post])}} end fun fltxch {value: fltvalue, registerAllocation: t} = fltxch' {fltregister = #fltregister value, registerAllocation = registerAllocation} fun fltxch1 {registerAllocation: t} = fltxch' {fltregister = FltRegister.one, registerAllocation = registerAllocation} fun allocated {memloc, registerAllocation: t} = case valueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocated" fun fltallocated {memloc, registerAllocation: t} = case fltvalueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.fltallocated" fun remove {memloc, registerAllocation: t} = case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => delete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun removes {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => remove {memloc = memloc, registerAllocation = registerAllocation}) local val commitPush' = fn NO => NO | COMMIT i => COMMIT (i + 1) | REMOVE i => REMOVE (i + 1) | TRYCOMMIT i => TRYCOMMIT (i + 1) | TRYREMOVE i => TRYREMOVE (i + 1) val commitPop' = fn NO => NO | COMMIT i => COMMIT (i - 1) | REMOVE i => REMOVE (i - 1) | TRYCOMMIT i => TRYCOMMIT (i - 1) | TRYREMOVE i => TRYREMOVE (i - 1) in fun commitPush {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun commitPop {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} end fun savedRegisters {saves: Operand.t list, registerAllocation: t} : Register.t list = List.concatMap (saves, fn Operand.MemLoc m => (case allocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.Register r => [r] | Operand.Address (Address.T {base, index, ...}) => (case (base, index) of (NONE, NONE ) => [] | (SOME rb, NONE ) => [rb] | (NONE, SOME ro) => [ro] | (SOME rb, SOME ro) => [rb,ro]) | _ => []) fun supportedRegisters {supports: Operand.t list, registerAllocation: t} : Register.t list = let fun supportedRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, fltallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME {register, ...}, _) => [register] | (_, SOME _) => [] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedRegisters' m | _ => []) end fun supportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = let fun supportedMemLocs' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, fltallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [memloc] | (_, SOME _) => [memloc] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedMemLocs') in List.concatMap (supports, fn Operand.MemLoc m => supportedMemLocs' m | _ => []) end fun fltsavedMemLocs {saves: Operand.t list, registerAllocation: t} : MemLoc.t list = List.revKeepAllMap (saves, fn Operand.MemLoc m => (case fltallocated {memloc = m, registerAllocation = registerAllocation} of SOME _ => SOME m | NONE => NONE) | _ => NONE) fun fltsupportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = List.revKeepAllMap (supports, fn Operand.MemLoc m => (case fltallocated {memloc = m, registerAllocation = registerAllocation} of SOME _ => SOME m | NONE => NONE) | _ => NONE) fun 'a spillAndReissue {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t, spiller : {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} -> {assembly: Assembly.t AppendList.t, registerAllocation: t}, msg : string, reissue : {assembly: Assembly.t AppendList.t, registerAllocation: t} -> 'a} : 'a = (Int.dec depth; if !depth = 0 then let val _ = Int.inc depth val {assembly, registerAllocation} = spiller {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val return = reissue {assembly = assembly, registerAllocation = registerAllocation} handle Spill => (Error.bug (concat [msg, ":reSpill"])) val _ = Int.dec depth in return end else raise Spill) fun potentialRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: Register.t list, registerAllocation: t}): Register.t list = case force of [] => Register.registers size | registers => List.revKeepAll(Register.registers size, fn register => List.contains(registers, register, Register.eq)) fun chooseRegister {info = {futures = {pre = future, ...}, hint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation as {reserved,...}: t} : {register: Register.t, coincide_values: value list} = let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, Register.eq) then preserved else register::preserved) in doit(saved, doit(reserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => Register.coincide(register',register''))) val supported = supportedRegisters {supports = supports, registerAllocation = registerAllocation} val values = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (hint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if Register.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if Register.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = valuesRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if Register.coincide(register,register') then let val support_cost' = List.contains(supported, register, Register.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,Register.toString)) val reserved = listToString(List.map(reserved,Register.toString)) val msg = concat["\n", "chooseRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "reserved = ", reserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseRegister\n"; raise Spill end | register::_ => register val values = valuesRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => Register.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun freeRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t}) : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (Register.registers (MemLoc.size memloc), fn register' => Register.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.register final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if Register.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and freeFltRegister {info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = let val info as {futures = {pre = future, ...},...} = info val values = fltvalueFilter {filter = fn _ => true, registerAllocation = registerAllocation} in if List.length values >= FltRegister.total then let val saved = fltsavedMemLocs {saves = saves, registerAllocation = registerAllocation} val supported = fltsupportedMemLocs {supports = supports, registerAllocation = registerAllocation} val values = List.revRemoveAll(values, fn {memloc,...} => List.contains(saved, memloc, MemLoc.eq)) val values_costs = List.revMap (values, fn value as {memloc,weight,sync,commit,...} => let val support_cost = List.contains(supported, memloc, MemLoc.eq) val commit_cost = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val sync_cost = sync val weight_cost = weight in (value, (support_cost, commit_cost, future_cost, sync_cost, weight_cost)) end) val values_costs_sorted = List.insertionSort (values_costs, fn ((_,(support_c1, commit_c1, future_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))) val values = List.map(values_costs_sorted, #1) in case values of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.freeFltRegister" | {fltregister, memloc, weight, sync, ...}::_ => let val registerAllocation = fltupdate {value = {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation = registerAllocation} end end else {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeFltRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, fltrename, registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and commitRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {reserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = valueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitFltRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = fltvalueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = List.fold (commit_values, {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation}, fn ({fltregister, memloc, weight, sync, commit}, {assembly, fltrename, registerAllocation}) => let fun doCommitFalse () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val size = MemLoc.size memloc val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val registerAllocation = fltupdate {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_xch, assembly_address, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.Address address, size = size, pop = false}) | Size.FPI => AppendList.single (Assembly.instruction_fist {dst = Operand.Address address, size = size, pop = false}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doCommitTrue () = let val fltregister = fltrename fltregister val registerAllocation = fltupdate {value = {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val size = MemLoc.size memloc val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_xch, assembly_address, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.Address address, size = size, pop = true}) | Size.FPI => AppendList.single (Assembly.instruction_fist {dst = Operand.Address address, size = size, pop = true}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_pop o fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doRemoveTrue () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val size = MemLoc.size memloc in {assembly = AppendList.appends [assembly, assembly_xch, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) | Size.FPI => AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = Size.DBLE, pop = true}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_pop o fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doNothing () = {assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doCommitFalse () else doNothing () | (TRYCOMMIT 0, true) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doCommitTrue () else doNothing () | (TRYREMOVE 0, false) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doRemoveFalse () else doNothing () | (TRYREMOVE 0, true) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doRemoveTrue () else doNothing () | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters" end) val _ = Int.dec depth in {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitFltRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, fltrename, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and spillRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val spillStart = !spill val {reserved, ...} = registerAllocation val {assembly = assembly_unreserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val saved = List.fold (reserved, saved, fn (register,saved) => if List.contains(saved,register,Register.eq) then saved else register::saved) val saves = valueFilter {filter = fn {register, ...} => List.contains(saved, register, Register.eq), registerAllocation = registerAllocation} val all = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} (* partition the values in the register file * by their base register. *) val groups = partition (all, fn ({register = Register.T {reg = reg1, ...},...}, {register = Register.T {reg = reg2, ...},...}) => reg1 = reg2) (* order the groups by number of registers used *) val groups = List.insertionSort (groups, fn (g1,g2) => (List.length g1) < (List.length g2)) (* choose four registers to spill *) val spills = case groups of g1::g2::g3::g4::_ => List.concat [g1,g2,g3,g4] | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.spillRegisters" (* totally order the spills by utilization *) val spills = totalOrder (spills, fn ({memloc = memloc1, ...}, {memloc = memloc2, ...}) => List.contains(MemLoc.utilized memloc2, memloc1, MemLoc.eq)) fun mkReplacer (spillMap : (value * MemLoc.t) list) = fn memloc' => case List.peek(spillMap, fn ({memloc,...},_) => MemLoc.eq(memloc,memloc')) of SOME (_,spillMemloc) => spillMemloc | NONE => memloc' (* associate each spilled value with a spill slot *) val (spillMap, spillEnd) = List.fold (spills, ([], spillStart), fn (value as {memloc, ...}, (spillMap, spillEnd)) => let val spillMemLoc = MemLoc.imm {base = Immediate.label spillLabel, index = Immediate.int spillEnd, scale = x86MLton.wordScale, size = MemLoc.size memloc, class = x86MLton.Classes.Temp} in ((value,spillMemLoc)::spillMap, spillEnd + 1) end) val replacer = mkReplacer spillMap (* commit everything in the register file; * also replace all memlocs that are spilled with their spill slot *) val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => if List.exists (spillMap, fn ({memloc = memloc',...},_) => MemLoc.eq(memloc,memloc')) then {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = false, commit = NO} else {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} (* update next available spill slot for cascading spills *) val _ = spill := spillEnd (* commit everything; * since the spilt memlocs look like they are spill slots, * they can all be committed to memory without any additional * registers. *) val {assembly = assembly_commit1, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} (* unspill; as we pull values in, we update the memloc to what it * looks under the pending unspills, and then replace any occurences * of the spill slot with the updated memloc; * by the time we are done, everything should be mapped back to * its original form. *) val {assembly = assembly_unspill, registerAllocation = registerAllocation} = let val rec doit = fn ([],{assembly,registerAllocation}) => {assembly = assembly, registerAllocation = registerAllocation} | (({memloc, weight, sync, commit, ...}, spillMemLoc)::spillMap, {assembly, registerAllocation}) => let val replacer = mkReplacer spillMap val memloc' = MemLoc.replace replacer memloc val {register, assembly = assembly_unspill, registerAllocation} = toRegisterMemLoc {memloc = spillMemLoc, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => {register = register, memloc = MemLoc.replace (fn memloc'' => if MemLoc.eq (memloc'', spillMemLoc) then memloc' else memloc'') memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in doit(spillMap, {assembly = AppendList.append (assembly, assembly_unspill), registerAllocation = registerAllocation}) end in doit(spillMap, {assembly = AppendList.empty, registerAllocation = registerAllocation}) end (* everything is unspilled *) val _ = spill := spillStart (* commit all the memlocs that got spilled. *) val {assembly = assembly_commit2, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val _ = spill := spillStart (* restore the saved operands to their previous locations. *) val {assembly = assembly_restore, registerAllocation} = List.fold (saves, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, commit, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = Register.size register, move = true, supports = supports, saves = [], force = [register], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve', registerAllocation} = List.fold (saved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve', registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve'), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val _ = Int.dec depth in {assembly = AppendList.appends [assembly_unreserve, assembly_commit1, assembly_unspill, assembly_commit2, assembly_restore, assembly_unreserve', assembly_reserve], registerAllocation = registerAllocation} end and toRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, Register.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.register final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = delete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | [{register = register', memloc = memloc', weight = weight', sync = sync', commit = commit'}] => if Register.eq(register',final_register) then let val registerAllocation = delete {register = register', registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight', sync = sync', commit = commit'}, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_xchg {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register final_register, dst = Operand.register register, size = size}), registerAllocation = registerAllocation} end end else let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then case MemLoc.size memloc of Size.BYTE => let val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = (Operand.memloc memloc):: supports, saves = saves, force = [], registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = (Operand.register register'):: saves, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_register, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end | _ => let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toFltRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, top: bool option, registerAllocation: t} : {fltregister: FltRegister.t, assembly: Assembly.t AppendList.t, fltrename : FltRegister.t -> FltRegister.t, registerAllocation: t} = (Int.inc depth; (case fltallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME (value as {fltregister,memloc,weight,sync,commit}) => (case (FltRegister.eq(fltregister, FltRegister.top), top) of (true, NONE) => let val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val assembly_pop = AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = assembly_pop, fltrename = fltrename_pop, registerAllocation = registerAllocation} end | (false, NONE) => let val {fltrename = fltrename_xch, registerAllocation} = fltxch {value = value, registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}) val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val assembly_pop = AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = AppendList.append (assembly_xch, assembly_pop), fltrename = fltrename_pop o fltrename_xch, registerAllocation = registerAllocation} end | (false, SOME true) => let val {fltrename = fltrename_xch, registerAllocation} = fltxch {value = value, registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}) in {fltregister = FltRegister.top, assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation = registerAllocation} end | (_, SOME _) => {fltregister = fltregister, assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation}) | NONE => (case (top, move) of (NONE, _) => let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} end | (SOME _, true) => let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val assembly_load = case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fld {src = Operand.address address, size = size}) | Size.FPI => AppendList.single (Assembly.instruction_fild {src = Operand.address address, size = size}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toFltRegisterMemLoc: size" in {fltregister = FltRegister.top, assembly = AppendList.appends [assembly_free, assembly_address, assembly_load], fltrename = fltrename_push o fltrename_free, registerAllocation = registerAllocation} end | (SOME _, false) => Error.bug "x86AllocateRegisters.RegisterAllocation.toFltRegisterMemLoc: (top, move)")) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toFltRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {fltregister = fltregister, assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and toAddressMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {address: Address.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (let val MemLoc.U {immBase, memBase, immIndex, memIndex, scale, ...} = MemLoc.destruct memloc (* If PIC, find labels with RBX-relative addressing. * It's bigger and slower, so only use it if we must. *) val (mungeLabel, base) = picRelative () val disp = case (immBase, immIndex) of (NONE, NONE) => Immediate.zero | (SOME immBase, NONE) => (case Immediate.destruct immBase of Immediate.Word _ => immBase | Immediate.Label l => Immediate.label (mungeLabel l) | Immediate.LabelPlusWord (l, w) => Immediate.labelPlusWord (mungeLabel l, w)) | (NONE, SOME immIndex) => (case Immediate.destruct immIndex of Immediate.Word _ => immIndex | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:indexLabel") | (SOME immBase, SOME immIndex) => (case (Immediate.destruct immBase, Immediate.destruct immIndex) of (Immediate.Label l1, Immediate.Word w2) => Immediate.labelPlusWord (mungeLabel l1, w2) | (Immediate.LabelPlusWord (l1, w1), Immediate.Word w2) => Immediate.labelPlusWord (mungeLabel l1, WordX.add (w1, w2)) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:disp") val {register = register_base, assembly = assembly_base, registerAllocation} = case (Immediate.destruct disp, memBase) of (Immediate.Word _, NONE) => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | (Immediate.Word _, SOME memBase) (* no label, no PIC *) => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memBase, info = info, size = MemLoc.size memBase, move = true, supports = case memIndex of NONE => supports | SOME memIndex => (Operand.memloc memIndex):: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end | (_, SOME _) (* label & memBase? bad input *) => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:base*2" | (_, NONE) (* label only -> use PIC if needed *) => {register = base, assembly = AppendList.empty, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = case memIndex of NONE => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | SOME memIndex => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memIndex, info = info, size = MemLoc.size memIndex, move = true, supports = supports, saves = case (memBase, register_base) of (NONE, _) => saves | (SOME memBase, SOME register_base) => (Operand.memloc memBase):: (Operand.register register_base):: saves | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc", force = Register.indexRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end in {address = Address.T {disp = SOME disp, base = register_base, index = register_index, scale = case memIndex of SOME _ => SOME scale | NONE => NONE}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) (* (case MemLoc.destruct memloc of MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Imm index, scale, size, ...} => let val disp' = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val disp = case disp' of NONE => SOME base | SOME disp' => SOME (Immediate.binexp {oper = Immediate.Addition, exp1 = base, exp2 = disp'}) in {address = Address.T {disp = disp, base = NONE, index = NONE, scale = NONE}, assembly = AppendList.empty, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Mem index, scale, size, ...} => let val disp = SOME base val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = NONE, index = SOME register_index, scale = SOME scale}, assembly = assembly_index, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Imm index, scale, size, ...} => let val disp = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = SOME register_base, index = NONE, scale = NONE}, assembly = assembly_base, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Mem index, scale, size, ...} => let val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = (Operand.memloc index)::supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = (Operand.memloc base):: (Operand.register register_base):: saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = NONE, base = SOME register_base, index = SOME register_index, scale = SOME scale}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) *) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toAddressMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {address = address, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toRegisterImmediate {immediate: Immediate.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, assembly, registerAllocation} = freeRegister {info = info, memloc = NONE, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val _ = Int.dec depth val (mungeLabel, base) = picRelative () val instruction = case Immediate.destruct immediate of Immediate.Word _ => Assembly.instruction_mov {dst = Operand.Register final_register, src = Operand.Immediate immediate, size = size} | Immediate.Label l => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME (Immediate.label (mungeLabel l)), base = base, index = NONE, scale = NONE }), size = size} | Immediate.LabelPlusWord (l, w) => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME (Immediate.labelPlusWord (mungeLabel l, w)), base = base, index = NONE, scale = NONE }), size = size} in {register = final_register, assembly = AppendList.appends [assembly, AppendList.single instruction], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterImmediate", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = immediate, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} fun pre {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list, info as {dead, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val dead_memlocs = dead val remove_memlocs = remove val (allUses, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val allKeep = MemLocSet.unions [allUses, allDefs, allKills] val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if MemLocSet.contains(allDefs, memloc) then if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "pre begin:"), (toComments ra)) else AppendList.empty, assembly_commit_fltregisters, assembly_commit_registers, if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "pre end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (pre, pre_msg) = tracer "pre" pre fun post {uses: Operand.t list, final_uses: Operand.t list, defs: Operand.t list, final_defs: Operand.t list, kills: Operand.t list, info as {dead, commit, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val (final_uses_registers, final_defs_registers, final_uses_fltregisters, final_defs_fltregisters) = let fun doit(operands, (final_registers, final_fltregisters)) = List.fold (operands, (final_registers, final_fltregisters), fn (operand, (final_registers, final_fltregisters)) => case (Operand.deRegister operand, Operand.deFltregister operand) of (SOME register, _) => if List.contains(final_registers, register, Register.eq) then (final_registers, final_fltregisters) else (register::final_registers, final_fltregisters) | (_, SOME fltregister) => if List.contains(final_fltregisters, fltregister, FltRegister.eq) then (final_registers, final_fltregisters) else (final_registers, fltregister::final_fltregisters) | _ => (final_registers, final_fltregisters)) val (final_uses_registers, final_uses_fltregisters) = doit(final_uses, ([], [])) val (final_defs_registers, final_defs_fltregisters) = doit(final_defs, ([], [])) in (final_uses_registers, final_defs_registers, final_uses_fltregisters, final_defs_fltregisters) end val dead_memlocs = dead val commit_memlocs = commit val remove_memlocs = remove val (_, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_fltregisters, fltregister, FltRegister.eq) val isDef = isDst in {fltregister = fltregister, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then {fltregister = fltregister, memloc = memloc, sync = true, weight = weight - 500, commit = TRYREMOVE 0} else let val isSrc = List.contains (final_uses_fltregisters, fltregister, FltRegister.eq) val isDst = List.contains (final_defs_fltregisters, fltregister, FltRegister.eq) val isDef = isDst in {fltregister = fltregister, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if !Control.Native.IEEEFP andalso not (sync andalso (not isDef)) then REMOVE 0 else if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then value else let val isSrc = List.contains (final_uses_registers, register, Register.eq) val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, ...} => if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "post begin:"), (toComments ra)) else AppendList.empty, assembly_commit_fltregisters, assembly_commit_registers, assembly_dead_registers, if !Control.codegenComments > 3 then AppendList.cons ((Assembly.comment "post end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (post, post_msg) = tracer "post" post fun allocateOperand {operand: Operand.t, options = {register: bool, immediate: bool, label: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.Immediate i => if immediate andalso (let val (_, picBase) = picRelative () val pic = picBase <> NONE val hasLabel = case Immediate.destruct i of Immediate.Word _ => false | _ => true in not (pic andalso hasLabel) end) then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = i, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else if address then let val (mungeLabel, picBase) = picRelative () val label = mungeLabel (Label.fromString "raTemp1") val address = Address.T {disp = SOME (Immediate.label label), base = picBase, index = NONE, scale = NONE} in {operand = Operand.address address, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.immediate i, dst = Operand.address address, size = size}), registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:Immediate" | Operand.Label l => if label then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if immediate then {operand = Operand.immediate_label l, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = Immediate.label l, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:Label" | Operand.MemLoc m => let fun toRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.Register register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if register andalso address then case allocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toRegisterMemLoc' () | SOME _ => toRegisterMemLoc' () else if register then toRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:MemLoc" end | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand" val (allocateOperand, allocateOperand_msg) = tracer "allocateOperand" allocateOperand fun allocateFltOperand {operand: Operand.t, options = {fltregister: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, top: bool option, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = case operand of Operand.MemLoc m => if fltregister andalso address then case fltallocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, fltrename = FltRegister.id, registerAllocation = registerAllocation} end else let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end | SOME _ => let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end else if fltregister then let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end else if address then let val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly_address), fltrename = fltrename_commit, registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltOperand: operand:MemLoc" | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltOperand: operand" val (allocateFltOperand, allocateFltOperand_msg) = tracer "allocateFltOperand" allocateFltOperand local fun allocateFltStackOperands' {fltregister_top: FltRegister.t, fltregister_one: FltRegister.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = case (fltregister_top, fltregister_one) of (FltRegister.T 0, FltRegister.T 1) => {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | (FltRegister.T 1, FltRegister.T 0) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}), fltrename = fltrename, registerAllocation = registerAllocation} end | (FltRegister.T 0, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename'', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}], fltrename = fltrename'' o fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T 1, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}], fltrename = fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T 1) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}), fltrename = fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T 0) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}], fltrename = fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename'', registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}], fltrename = fltrename'' o fltrename' o fltrename, registerAllocation = registerAllocation} end in fun allocateFltStackOperands {operand_top: Operand.t, size_top: Size.t, move_top: bool, operand_one: Operand.t, move_one: bool, size_one: Size.t, info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {operand_top: Operand.t, operand_one: Operand.t, assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = if Operand.eq(operand_top, operand_one) then let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation} = freeFltRegister {info = info, size = size_top, supports = operand_top::supports, saves = saves, registerAllocation = registerAllocation} val {assembly = assembly_allocate_top_one, fltrename = fltrename_allocate_top_one, registerAllocation, ...} = allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = saves, top = SOME true, registerAllocation = registerAllocation} val temp = MemLoc.imm {base = Immediate.label (Label.fromString "raTemp2"), index = Immediate.zero, scale = Scale.Eight, size = Size.DBLE, class = MemLoc.Class.Temp} val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = FltRegister.top, memloc = temp, weight = 0, sync = true, commit = NO}, registerAllocation = registerAllocation} in {operand_top = Operand.FltRegister FltRegister.top, operand_one = Operand.FltRegister FltRegister.one, assembly = AppendList.appends [assembly_free, assembly_allocate_top_one, AppendList.single (Assembly.instruction_fld {src = Operand.FltRegister FltRegister.top, size = size_top})], fltrename = fltrename_push o fltrename_allocate_top_one o fltrename_free, registerAllocation = registerAllocation} end else let val {operand = operand_allocate_one, assembly = assembly_allocate_one, fltrename = fltrename_allocate_one, registerAllocation} = case operand_one of (Operand.MemLoc memloc_one) => (case fltallocated {memloc = memloc_one, registerAllocation = registerAllocation} of SOME value_one => {operand = Operand.FltRegister (#fltregister value_one), assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | NONE => allocateFltOperand {operand = operand_one, options = {fltregister = true, address = false}, info = info, size = size_one, move = move_one, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation}) | _ => allocateFltOperand {operand = operand_one, options = {fltregister = true, address = false}, info = info, size = size_one, move = move_one, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation} val {operand = operand_allocate_top, assembly = assembly_allocate_top, fltrename = fltrename_allocate_top, registerAllocation} = case operand_top of (Operand.MemLoc memloc_top) => (case fltallocated {memloc = memloc_top, registerAllocation = registerAllocation} of SOME value_top => {operand = Operand.FltRegister (#fltregister value_top), assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | NONE => allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation}) | _ => allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation} val fltregister_one = case operand_allocate_one of Operand.FltRegister f => f | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltStackOperand: one" val fltregister_one = fltrename_allocate_top fltregister_one val fltregister_top = case operand_allocate_top of Operand.FltRegister f => f | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltStackOperand: top" val {assembly, fltrename, registerAllocation} = allocateFltStackOperands' {fltregister_top = fltregister_top, fltregister_one = fltregister_one, registerAllocation = registerAllocation} in {operand_top = Operand.FltRegister FltRegister.top, operand_one = Operand.FltRegister FltRegister.one, assembly = AppendList.appends [assembly_allocate_one, assembly_allocate_top, assembly], fltrename = fltrename o fltrename_allocate_top o fltrename_allocate_one, registerAllocation = registerAllocation} end end val (allocateFltStackOperands, allocateFltStackOperands_msg) = tracer "allocateFltStackOperands" allocateFltStackOperands fun fltrenameLift fltrename = fn Operand.FltRegister f => Operand.FltRegister (fltrename f) | operand => operand (* Implementation of directives. *) fun assume {assumes : {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun fltassume {assumes : {memloc: MemLoc.t, weight: int, sync: bool} list, info = _, registerAllocation = {entries, reserved, ...} : t} = let val registerAllocation = {entries = entries, reserved = reserved, fltstack = []} val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, weight, sync}, {assembly, registerAllocation}) => let val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun cache {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | Reg of Register.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (Register.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => Register.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (Reg register, SOME memloc)) val to = case valueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => Reg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (Register.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (Reg rf, _, r, Reg rt) => Register.eq(rf, r) andalso Register.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.register r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((Reg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((Reg _, SOME m, r, Reg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end (* fun cache {caches : {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.map (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn (cache as {register, memloc, reserve}, {assembly, registerAllocation, saves}) => let val {register, assembly = assembly_register, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, force = [register], registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) in {assembly = assembly, registerAllocation = registerAllocation} end *) fun fltcache {caches : {memloc: MemLoc.t} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly = assembly_load, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn ({memloc: MemLoc.t}, {assembly, registerAllocation, saves}) => let val {assembly = assembly_fltregister, registerAllocation, ...} = toFltRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, top = SOME false, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_fltregister), registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) val (num_caches, dest_caches) = List.fold (caches, (0,[]), fn ({memloc}, (num_caches, dest_caches)) => (num_caches + 1, {memloc = memloc, fltregister = FltRegister.T num_caches}::dest_caches)) fun check {assembly, registerAllocation} = let val {fltstack, ...} = registerAllocation val disp = (List.length fltstack) - num_caches val dest = fn (FltRegister.T i) => FltRegister.T (i + disp) val rec check' = fn [] => {assembly = assembly, registerAllocation = registerAllocation} | ({fltregister, memloc, ...}: fltvalue)::fltstack => (case List.peek (dest_caches, fn {memloc = memloc', ...} => MemLoc.eq(memloc, memloc')) of SOME {fltregister = fltregister', ...} => let val fltregister' = dest fltregister' in if FltRegister.eq (fltregister, fltregister') then check' fltstack else let val fltregister'' = if FltRegister.eq (fltregister, FltRegister.top) then fltregister' else fltregister val {registerAllocation, ...} = fltxch' {fltregister = fltregister'', registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister''}) in check {assembly = AppendList.append (assembly, assembly_xch), registerAllocation = registerAllocation} end end | NONE => let val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if FltRegister.eq (fltregister, FltRegister.top) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation, ...} = commitFltRegisters {info = info, supports = supports, saves = [], registerAllocation = registerAllocation} in check {assembly = AppendList.append (assembly, assembly_commit), registerAllocation = registerAllocation} end) in check' fltstack end val {assembly = assembly_shuffle, registerAllocation} = check {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_load, assembly_shuffle], registerAllocation = registerAllocation} end fun reset ({...}: {registerAllocation: t}) = {assembly = AppendList.empty, registerAllocation = empty ()} fun force {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t, info: Liveness.t, registerAllocation: t} = let val toCommit = fn TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 val toRemove = fn _ => REMOVE 0 val shouldCommit = fn memloc => (MemLocSet.contains(commit_memlocs, memloc) orelse ClassSet.contains(commit_classes, MemLoc.class memloc)) val shouldRemove = fn memloc => (MemLocSet.contains(remove_memlocs, memloc) orelse ClassSet.contains(remove_classes, MemLoc.class memloc)) val shouldDead = fn memloc => (MemLocSet.contains(dead_memlocs, memloc) orelse ClassSet.contains(dead_classes, MemLoc.class memloc)) val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => value | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, commit, ...} => if shouldDead memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_commit_fltregisters, assembly_commit_registers, assembly_dead_registers], registerAllocation = registerAllocation} end fun ccall {info: Liveness.t, registerAllocation: t} = let val cstaticClasses = !x86MLton.Classes.cstaticClasses val {reserved = reservedStart, ...} = registerAllocation val {assembly = assembly_reserve, registerAllocation} = List.fold (Register.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val availCalleeSaveRegisters = List.keepAll (Register.calleeSaveRegisters, fn calleeSaveReg => List.forall (#reserved registerAllocation, fn reservedReg => not (Register.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_shuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (valueFilter {filter = fn {register, ...} => List.contains (Register.callerSaveRegisters, register, Register.eq) andalso List.exists (availCalleeSaveRegisters, fn calleeSaveReg => Size.eq (Register.size register, Register.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateOperand {operand = Operand.memloc memloc, options = {register = true, immediate = false, label = false, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = Register.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if List.contains (Register.callerSaveRegisters, register, Register.eq) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, ...} => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_unreserve, registerAllocation} = List.fold (List.removeAll (Register.callerSaveRegisters, fn register => List.contains(reservedStart, register, Register.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val registerAllocation = deletes {registers = Register.callerSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_reserve, assembly_shuffle, assembly_commit_fltregisters, assembly_commit_registers, assembly_unreserve], registerAllocation = registerAllocation} end fun return {returns: {src: Operand.t, dst: MemLoc.t} list, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn {memloc, ...} => List.exists (returns, fn {dst = return_memloc, ...} => List.exists(MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc)), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = List.fold (returns, registerAllocation, fn ({src = operand, dst = return_memloc}, registerAllocation) => case operand of Operand.Register return_register => update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | Operand.FltRegister return_register => #registerAllocation (fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.return") val (final_defs, defs) = List.fold (returns, ([],[]), fn ({src,dst},(final_defs,defs)) => (src::final_defs,(Operand.memloc dst)::defs)) val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = defs, final_defs = final_defs, kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end (* fun return {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn value as {memloc,...} => List.exists (MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val return_register = Register.return (MemLoc.size return_memloc) val registerAllocation = update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.register return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end fun fltreturn {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val return_register = FltRegister.return val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.fltregister return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end *) fun clearflt {info: Liveness.t, registerAllocation: t} = let val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, ...} => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = assembly_commit_fltregisters, registerAllocation = registerAllocation} end fun saveregalloc ({id, registerAllocation, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val _ = setRA(id, {registerAllocation = registerAllocation}) in {assembly = if !Control.codegenComments > 2 then (toComments registerAllocation) else AppendList.empty, registerAllocation = registerAllocation} end fun restoreregalloc ({live, id, info, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val {registerAllocation} = getRA id fun dump memloc = (track memloc) andalso not (MemLocSet.contains(live,memloc)) val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if dump memloc then {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation, ...} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_commit_fltregisters, assembly_commit_registers), registerAllocation = registerAllocation} end end structure Instruction = struct structure RA = RegisterAllocation open Instruction (* * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) fun allocateSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val options_src = case final_dst of Operand.Register _ => {register = true, immediate = true, label = false, address = true} | _ => {register = true, immediate = true, label = false, address = false} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options_src, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.allocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.delete {register = register, registerAllocation = registerAllocation} in RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateSrcDst" (* * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) fun allocateSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val options_src2 = case final_src1 of Operand.Register _ => {register = true, immediate = true, label = false, address = true} | _ => {register = true, immediate = true, label = false, address = false} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateOperand {operand = src2, options = options_src2, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end fun pfmov {instruction, info as {dead, remove, ...}, registerAllocation, src, dst, srcsize, dstsize} = let fun default () = let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME false, registerAllocation = registerAllocation} val {assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = NONE, registerAllocation = registerAllocation} val final_src = (RA.fltrenameLift fltrename_dst) final_src val instruction = Instruction.FLD {src = final_src, size = srcsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' () = let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} val instruction = Instruction.FST {dst = final_dst, size = dstsize, pop = true} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in case (src,dst) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst) => (case (RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation}, RA.fltallocated {memloc = memloc_dst, registerAllocation = registerAllocation}) of (SOME {fltregister = fltregister_src, sync = sync_src, commit = commit_src, ...}, NONE) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then if MemLocSet.contains(remove, memloc_dst) then default' () else let val registerAllocation = RA.fltupdate {value = {fltregister = fltregister_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.fltregister fltregister_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end else default () | _ => default ()) | _ => default () end fun removable {memloc, info = {dead, remove, ...}: Liveness.t, registerAllocation} = MemLocSet.contains(dead, memloc) orelse (MemLocSet.contains(remove, memloc) andalso (case RA.fltallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {sync,...} => sync | NONE => true)) fun allocateRegisters {instruction: t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = case instruction of NOP (* No operation; p. 496 *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.NOP val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | HLT (* Halt; p. 331 *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.HLT val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | BinAL {oper, src, dst, size} (* Integer binary arithmetic(w/o mult & div)/logic instructions. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.BinAL {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | pMD {oper, dst, src, size} (* Integer multiplication and division. * Require src operand as follows: * * src * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pMD, size" val {assembly = assembly_clear, registerAllocation, ...} = RA.freeRegister {info = info, memloc = NONE, size = size, supports = [src,dst], saves = [], force = [hi], registerAllocation = registerAllocation} val registerAllocation = RA.delete {register = hi, registerAllocation = registerAllocation} val {final_src, assembly_src_dst, registerAllocation, ...} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} val force_src = List.revKeepAll (Register.registers size, fn r => not (Register.eq(r, hi) orelse Register.eq(r, lo))) val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi, dst,final_dst], force = force_src, registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val oper' = case oper of Instruction.IMUL => Instruction.IMUL | Instruction.MUL => Instruction.MUL | Instruction.IDIV => Instruction.IDIV | Instruction.DIV => Instruction.DIV | Instruction.IMOD => Instruction.IDIV | Instruction.MOD => Instruction.DIV val registerAllocation = if oper = Instruction.IMOD orelse oper = Instruction.MOD then case RA.valuesRegister {register = lo, registerAllocation = registerAllocation} of [{memloc, weight, sync, commit, ...}] => let val registerAllocation = RA.delete {register = lo, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = hi, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in registerAllocation end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pMD, lo" else registerAllocation val instruction = Instruction.MD {oper = oper', src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_clear, assembly_src_dst, (if oper = Instruction.IDIV orelse oper = Instruction.IMOD then AppendList.single (Assembly.instruction_cx {size = size}) else if oper = Instruction.DIV orelse oper = Instruction.MOD then AppendList.single (Assembly.instruction_binal {oper = Instruction.XOR, dst = Operand.register hi, src = Operand.register hi, size = size}) else AppendList.empty), AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | IMUL2 {src, dst, size} (* Integer signed/unsigned multiplication (two operand form). * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val instruction = Instruction.IMUL2 {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | UnAL {oper, dst, size} (* Integer unary arithmetic/logic instructions. * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.UnAL {oper = oper, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SRAL {oper, count, dst, size} (* Integer shift/rotate arithmetic/logic instructions. * Require count operand as follows: * * count * reg imm lab add * * X * * only register %cl * * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_count, assembly_count, final_dst, assembly_dst, registerAllocation} = if Operand.eq(count,dst) then let val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [Register.T {reg = Register.ECX, part = Register.L}, Register.T {reg = Register.ECX, part = Register.X}, Register.T {reg = Register.ECX, part = Register.E}], registerAllocation = registerAllocation} val final_dst = final_count val assembly_dst = AppendList.empty in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end else let val count_size = case Operand.size count of NONE => Size.BYTE | SOME size => size val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = true, label = false, address = false}, info = info, size = count_size, move = true, supports = [dst], saves = [], force = [Register.T {reg = Register.ECX, part = Register.L}, Register.T {reg = Register.ECX, part = Register.X}, Register.T {reg = Register.ECX, part = Register.E}], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [count,final_count], force = [], registerAllocation = registerAllocation} in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end val final_count = case final_count of Operand.Register _ => Operand.register (Register.T {reg = Register.ECX, part = Register.L}) | _ => final_count val instruction = Instruction.SRAL {oper = oper, count = final_count, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_count, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CMP {src2, src1, size} (* Arithmetic compare; p. 116 * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.CMP {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | TEST {src2, src1, size} (* Logical compare; p. 728 * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.TEST {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SETcc {condition, dst, size} (* Set byte on condition; p. 672 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only byte registers *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [], force = Register.withLowPart (size, Size.BYTE), registerAllocation = registerAllocation} val temp_dst = case final_dst of Operand.Register r => let val register = Register.lowPartOf (r, Size.BYTE) in Operand.register register end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: SETcc, temp_reg" val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.SETcc {condition = condition, dst = final_dst, size = size}) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction_setcc {condition = condition, dst = temp_dst, size = Size.BYTE}), if size = Size.BYTE then if Operand.eq (final_dst, temp_dst) then AppendList.empty else AppendList.single (Assembly.instruction_mov {dst = final_dst, src = temp_dst, size = Size.BYTE}) else AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, dst = final_dst, src = temp_dst, dstsize = size, srcsize = Size.BYTE}), assembly_post], registerAllocation = registerAllocation} end | JMP {target, absolute} (* Jump; p. 373 * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = true, label = true, address = true}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.JMP {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | Jcc {condition, target} (* Jump if condition is met; p. 369 * Require target operand as follows: * * target * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = true, label = true, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.Jcc {condition = condition, target = final_target} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CALL {target, absolute} (* Call procedure; p. 93 * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = true, immediate = true, label = true, address = true}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CALL {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = SOME src} (* Return from procedure; p. 648 * Require optional src operand as follows: * * src * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation = registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = true, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.RET {src = SOME final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = NONE} => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.RET {src = NONE} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOV {src, dst, size} (* Move; p. 442 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val isConst0 = Immediate.isZero (* special case moving 0 to a register *) val instruction = case (final_src, final_dst) of (Operand.Immediate immediate, Operand.Register _) => if isConst0 immediate then Instruction.BinAL {oper = XOR, src = final_dst, dst = final_dst, size = size} else Instruction.MOV {src = final_src, dst = final_dst, size = size} | _ => Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.value, memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.register register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.allocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | CMOVcc {condition, src, dst, size} (* Conditional move; p. 112 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CMOVcc {condition = condition, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XCHG {src, dst, size} (* Exchange register/memory with register; p. 754 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.XCHG {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPUSH {src, base, size} (* Pseudo push a value onto the stack; p. 621 * Require src operand as follows: * * src * reg imm lab add * * X X * * only word or long registers * * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [src], saves = [], force = [Register.esp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = true, label = false, address = true} | Size.LONG => {register = true, immediate = true, label = false, address = true} | _ => {register = false, immediate = true, label = false, address = true} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.PUSH {src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPOP {dst, base, size} (* Pseudo pop a value from the stack; p. 571 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only word or long registers * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [dst], saves = [], force = [Register.esp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = false, label = false, address = true} | Size.LONG => {register = true, immediate = false, label = false, address = true} | _ => {register = false, immediate = false, label = false, address = true} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = options, info = info, size = size, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.POP {dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOVX {oper, src, dst, srcsize, dstsize} (* Move with extention. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.MOVX {oper = oper, src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XVOM {src, dst, srcsize, dstsize} (* Move with contraction. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = Register.withLowPart (srcsize, dstsize), registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.XVOM {src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize}) val temp_reg = case final_src of Operand.Register r => Register.lowPartOf (r, dstsize) | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: XVOM, temp_reg" val instruction = Instruction.MOV {src = Operand.register temp_reg, dst = final_dst, size = dstsize} val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | LEA {src, dst, size} (* Load effective address; p. 393 * Require src/dst operands as follows: * * dst * reg imm lab add * reg * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.LEA {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOV {src, dst, size} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = size, dstsize = size} | pFMOVX {src, dst, srcsize, dstsize} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = srcsize, dstsize = dstsize} | pFXVOM {src, dst, srcsize, dstsize} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = srcsize, dstsize = dstsize} | pFLDC {oper, dst, size} (* Pseudo floating-point load constant. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = false, supports = [], saves = [], top = NONE, registerAllocation = registerAllocation} val instruction = Instruction.FLDC {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOVFI {src, dst, srcsize, dstsize} (* Pseudo floating-point from integer. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = NONE, registerAllocation = registerAllocation} val instruction = Instruction.FILD {src = final_src, size = Size.toFPI srcsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOVTI {src, dst, srcsize, dstsize} (* Pseudo floating-point to integer. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FIST {dst = final_dst, size = Size.toFPI dstsize, pop = false} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' () = let val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} val instruction = Instruction.FIST {dst = final_dst, size = Size.toFPI dstsize, pop = true} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in case src of Operand.MemLoc memloc_src => if removable {memloc = memloc_src, info = info, registerAllocation = registerAllocation} then default' () else default () | _ => default () end | pFCOM {src1, src2, size} (* Floating-point compare real; p. 220 * Require src operand as follows: * * src * fltreg add * * X * * only st(1) if pop and pop' * * Require size modifier class as follows: FLT(SNGL,DBLE) *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src2, assembly_src1_src2, pop, pop', registerAllocation, ...} = if Operand.eq(src1,src2) then let fun default b = let val {operand = final_src1_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case src1 of Operand.MemLoc memloc_src1 => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end else let fun default b = let val {operand = final_src2, assembly = assembly_src2, fltrename = fltrename_src2, registerAllocation} = RA.allocateFltOperand {operand = src2, options = {fltregister = true, address = true}, info = info, size = size, move = true, supports = [src1], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src1, assembly = assembly_src1, fltrename = fltrename_src1, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src2,final_src2], top = SOME true, registerAllocation = registerAllocation} val final_src2 = (RA.fltrenameLift fltrename_src1) final_src2 in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src2, assembly_src1], fltrename_src1_src2 = fltrename_src1 o fltrename_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end fun default' () = let val {operand_top = final_src1, operand_one = final_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltStackOperands {operand_top = src1, move_top = true, size_top = size, operand_one = src2, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = true, pop' = true, registerAllocation = registerAllocation} end in case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then if removable {memloc = memloc_src2, info = info, registerAllocation = registerAllocation} then default' () else default true else default false | (Operand.MemLoc memloc_src1, _) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end val instruction = Instruction.FCOM {src = final_src2, size = size, pop = pop, pop' = pop'} val {fltrename = fltrename_pop, registerAllocation} = if pop then if pop' then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_pop', registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop' o fltrename_pop, registerAllocation= registerAllocation} end else let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFUCOM {src1, src2, size} (* Floating-point unordered compare real; p. 307 * Require src operand as follows: * * src * fltreg add * * * * only st(1) if pop and pop' *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src2, assembly_src1_src2, pop, pop', registerAllocation, ...} = if Operand.eq(src1,src2) then let fun default b = let val {operand = final_src1_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case src1 of Operand.MemLoc memloc_src1 => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end else let fun default b = let val {operand = final_src2, assembly = assembly_src2, fltrename = fltrename_src2, registerAllocation} = RA.allocateFltOperand {operand = src2, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src1], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src1, assembly = assembly_src1, fltrename = fltrename_src1, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src2,final_src2], top = SOME true, registerAllocation = registerAllocation} val final_src2 = (RA.fltrenameLift fltrename_src1) final_src2 in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src2, assembly_src1], fltrename_src1_src2 = fltrename_src1 o fltrename_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => let fun default' () = case RA.fltallocated {memloc = memloc_src2, registerAllocation = registerAllocation} of SOME _ => let val {operand_top = final_src1, operand_one = final_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltStackOperands {operand_top = src1, move_top = true, size_top = size, operand_one = src2, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = true, pop' = true, registerAllocation = registerAllocation} end | NONE => default true in if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then if removable {memloc = memloc_src2, info = info, registerAllocation = registerAllocation} then default' () else default true else default false end | (Operand.MemLoc memloc_src1, _) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end val instruction = Instruction.FUCOM {src = final_src2, pop = pop, pop' = pop'} val {fltrename = fltrename_pop, registerAllocation} = if pop then if pop' then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_pop', registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop' o fltrename_pop, registerAllocation= registerAllocation} end else let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFBinA {oper, src, dst, size} (* Floating-point binary arithmetic instructions. * Require src operand as follows: * * src * fltreg add * * X * * only st(0) if pop * * Require dst operand as follows: * * dst * fltreg add * * * * only st(0) if src add * * * one of src,dst must be st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, oper, pop, registerAllocation, ...} = if Operand.eq(src,dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, fltrename = fltrename_src_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, fltrename_src_dst = fltrename_src_dst, oper = oper, pop = false, registerAllocation = registerAllocation} end else let fun default () = let val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = case final_src of Operand.Address _ => RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME true, registerAllocation = registerAllocation} | Operand.FltRegister f => if FltRegister.eq (f, FltRegister.top) then RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} else RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME true, registerAllocation = registerAllocation} | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pFBinA, final_src" val final_src = (RA.fltrenameLift fltrename_dst) final_src in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], fltrename_src_dst = fltrename_dst o fltrename_src, oper = oper, pop = false, registerAllocation = registerAllocation} end fun default' () = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME true, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_src o fltrename_dst, oper = oper, pop = true, registerAllocation = registerAllocation} end fun default'' value_dst = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME false, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst val {memloc = memloc_dst, weight = weight_dst, sync = sync_dst, commit = commit_dst, ...} : RegisterAllocation.fltvalue = value_dst val fltregister_src = case Operand.deFltregister final_src of SOME fltregister => fltregister | NONE => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pFBinA, final_src" val registerAllocation = RA.fltupdate {value = {fltregister = fltregister_src, memloc = memloc_dst, weight = weight_dst, sync = sync_dst, commit = commit_dst}, registerAllocation = registerAllocation} in {final_src = final_dst, final_dst = final_src, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_src o fltrename_dst, oper = Instruction.fbina_reverse oper, pop = true, registerAllocation = registerAllocation} end fun default''' memloc_dst = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME true, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_push, registerAllocation} = RA.fltpush {value = {fltregister = FltRegister.top, memloc = memloc_dst, weight = 1024, sync = false, commit = RA.NO}, registerAllocation = registerAllocation} in {final_src = final_dst, final_dst = final_src, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_push o fltrename_pop o fltrename_src o fltrename_dst, oper = Instruction.fbina_reverse oper, pop = false, registerAllocation = registerAllocation} end in case (src,dst) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst) => (case (RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation}, RA.fltallocated {memloc = memloc_dst, registerAllocation = registerAllocation}) of (SOME ({sync = sync_src, ...}), SOME (value_dst as {fltregister = fltregister_dst, ...})) => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then if FltRegister.eq (fltregister_dst, FltRegister.top) then default'' value_dst else default' () else default () | (SOME {sync = sync_src,...}, NONE) => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then default''' memloc_dst else default () | _ => default ()) | (Operand.MemLoc memloc_src, _) => (case RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation} of SOME {sync = sync_src,...} => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then default' () else default () | _ => default ()) | _ => default () end val oper = if Operand.eq(final_src, Operand.fltregister FltRegister.top) andalso isSome (Operand.deFltregister final_dst) then fbina_reverse oper else oper val instruction = Instruction.FBinA {oper = oper, src = final_src, dst = final_dst, size = size, pop = pop} val {fltrename = fltrename_pop, registerAllocation} = if pop then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFUnA {oper, dst, size} (* Floating-point unary arithmetic instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} val instruction = Instruction.FUnA {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFPTAN {dst, size} (* Floating-point partial tangent instruction. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT * Automatically pushes 1.0 onto stack. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_free, registerAllocation, ...} = RA.freeFltRegister {info = info, size = Size.DBLE, supports = [dst], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} val instruction = Instruction.FPTAN val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_free, assembly_dst, AppendList.single (Assembly.instruction instruction), AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = Size.DBLE, pop = true}), assembly_post], registerAllocation = registerAllocation} end | pFBinAS {oper, src, dst, size} (* Floating-point binary arithmetic stack instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(1) * * Require dst operand as follows: * * dst * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst_src, registerAllocation, ...} = RA.allocateFltStackOperands {operand_top = dst, move_top = true, size_top = size, operand_one = src, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} val instruction = Instruction.FBinAS {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFBinASP {oper, src, dst, size} (* Floating-point binary arithmetic stack pop instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require dst operand as follows: * * dst * fltreg add * * * * only st(1) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_src_dst, registerAllocation, ...} = RA.allocateFltStackOperands {operand_top = src, move_top = true, size_top = size, operand_one = dst, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} val instruction = Instruction.FBinASP {oper = oper} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FLDCW {src} (* Floating-point load control word; p. 252 * Require src operand as follows: * * dst * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FLDCW {src = final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FSTCW {dst, check} (* Floating-point store control word; p. 289 * Require dst operand as follows: * * dst * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FSTCW {dst = final_dst, check = check} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FSTSW {dst, check} (* Floating-point store status word; p. 294 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only register %ax *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [Register.T {reg = Register.EAX, part = Register.X}], registerAllocation = registerAllocation} val instruction = Instruction.FSTSW {dst = final_dst, check = check} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: unimplemented" val (allocateRegisters, allocateRegisters_msg) = tracer "Instruction.allocateRegisters" allocateRegisters end structure Directive = struct open Directive fun allocateRegisters {directive, info, registerAllocation} = let val {assembly, registerAllocation} = case directive of Assume {assumes} => RegisterAllocation.assume {assumes = assumes, info = info, registerAllocation = registerAllocation} | FltAssume {assumes} => RegisterAllocation.fltassume {assumes = assumes, info = info, registerAllocation = registerAllocation} | Cache {caches} => RegisterAllocation.cache {caches = caches, info = info, registerAllocation = registerAllocation} | FltCache {caches} => RegisterAllocation.fltcache {caches = caches, info = info, registerAllocation = registerAllocation} | Reset => RegisterAllocation.reset {registerAllocation = registerAllocation} | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => RegisterAllocation.force {commit_memlocs = commit_memlocs, commit_classes = commit_classes, remove_memlocs = remove_memlocs, remove_classes = remove_classes, dead_memlocs = dead_memlocs, dead_classes = dead_classes, info = info, registerAllocation = registerAllocation} | CCall => RegisterAllocation.ccall {info = info, registerAllocation = registerAllocation} | Return {returns} => RegisterAllocation.return {returns = returns, info = info, registerAllocation = registerAllocation} | Reserve {registers} => RegisterAllocation.reserve {registers = registers, registerAllocation = registerAllocation} | Unreserve {registers} => RegisterAllocation.unreserve {registers = registers, registerAllocation = registerAllocation} | ClearFlt => RegisterAllocation.clearflt {info = info, registerAllocation = registerAllocation} | SaveRegAlloc {live, id} => RegisterAllocation.saveregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} | RestoreRegAlloc {live, id} => RegisterAllocation.restoreregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Directive.allocateRegisters" allocateRegisters end structure Assembly = struct open Assembly fun allocateRegisters {assembly: (t * Liveness.t) list, registerAllocation: RegisterAllocation.t} = let val {assembly, registerAllocation} = List.fold (assembly, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ((Comment s,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Comment s), registerAllocation = registerAllocation} | ((Directive d,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Directive.allocateRegisters {directive = d, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.codegenComments > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Directive.toString d))] else AppendList.empty, if !Control.codegenComments > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.codegenComments > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end | ((PseudoOp p,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, PseudoOp p), registerAllocation = registerAllocation} | ((Label l,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Label l), registerAllocation = registerAllocation} | ((Instruction i,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Instruction.allocateRegisters {instruction = i, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.codegenComments > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Instruction.toString i))] else AppendList.empty, if !Control.codegenComments > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.codegenComments > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end) val assembly = AppendList.toList assembly val assembly = if !Control.codegenComments > 1 then (Assembly.comment (String.make (60, #"&")):: Assembly.comment (String.make (60, #"&")):: assembly) else assembly in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Assembly.allocateRegisters" allocateRegisters end fun allocateRegisters {assembly : Assembly.t list list, liveness : bool} : Assembly.t list list = let val {get = getInfo : Label.t -> Label.t option, set = setInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) fun unroll label = case getInfo label of NONE => label | SOME label' => unroll label' val assembly = List.fold (assembly, [], fn (assembly,assembly') => let val assembly = if liveness then Liveness.toLiveness assembly else Liveness.toNoLiveness assembly val {assembly, ...} = Assembly.allocateRegisters {assembly = assembly, registerAllocation = RegisterAllocation.empty ()} val rec doit = fn (Assembly.Comment _)::assembly => doit assembly | (Assembly.PseudoOp (PseudoOp.P2align _))::assembly => doit' (assembly, []) | _ => false and doit' = fn ((Assembly.Comment _)::assembly, labels) => doit' (assembly, labels) | ((Assembly.PseudoOp (PseudoOp.Local _))::assembly, labels) => doit' (assembly, labels) | ((Assembly.Label l)::assembly, labels) => doit' (assembly, l::labels) | (assembly, labels) => doit'' (assembly, labels) and doit'' = fn ((Assembly.Comment _)::assembly, labels) => doit'' (assembly, labels) | ((Assembly.Instruction (Instruction.JMP {target = Operand.Label label, absolute = false}))::assembly, labels) => doit''' (assembly, labels, label) | _ => false and doit''' = fn ([], labels, label) => let val label' = unroll label in if List.contains(labels, label', Label.equals) then false else (List.foreach (labels, fn label'' => setInfo(label'', SOME label')); true) end | ((Assembly.Comment _)::assembly, labels, label) => doit''' (assembly, labels, label) | _ => false in if doit assembly then assembly' else assembly::assembly' end) fun replacer _ oper = (case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => Operand.immediate_label (unroll label) | NONE => oper) | (_, SOME label) => Operand.label (unroll label) | _ => oper) val assembly = List.fold (assembly, [], fn (assembly,assembly') => (List.map(assembly, Assembly.replace replacer))::assembly') in assembly end val (allocateRegisters, allocateRegisters_msg) = tracerTop "allocateRegisters" allocateRegisters fun allocateRegisters_totals () = (allocateRegisters_msg (); Control.indent (); Liveness.toLiveness_msg (); Liveness.toNoLiveness_msg (); Assembly.allocateRegisters_msg (); Control.indent (); Instruction.allocateRegisters_msg (); Control.indent (); RegisterAllocation.pre_msg (); RegisterAllocation.post_msg (); RegisterAllocation.allocateOperand_msg (); RegisterAllocation.allocateFltOperand_msg (); RegisterAllocation.allocateFltStackOperands_msg (); Control.unindent (); Directive.allocateRegisters_msg (); Control.unindent (); Control.unindent()) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-allocate-registers.sig000066400000000000000000000015351416264345000255360ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_ALLOCATE_REGISTERS_STRUCTS = sig structure x86 : X86 structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 end signature X86_ALLOCATE_REGISTERS = sig include X86_ALLOCATE_REGISTERS_STRUCTS val allocateRegisters : {assembly: x86.Assembly.t list list, liveness: bool} -> x86.Assembly.t list list val allocateRegisters_totals : unit -> unit val picRelative : unit -> (x86.Label.t -> x86.Label.t) * x86.Register.t option end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-codegen.fun000066400000000000000000000507351416264345000233650ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2014,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86Codegen (S: X86_CODEGEN_STRUCTS): X86_CODEGEN = struct open S structure x86 = x86 (open Machine structure RepType = Type) structure x86Pseudo = x86PseudoCheck (structure S = x86) structure x86MLtonBasic = x86MLtonBasic (structure x86 = x86Pseudo structure Machine = Machine) structure x86Liveness = x86Liveness (structure x86 = x86 structure x86MLtonBasic = x86MLtonBasic) structure x86JumpInfo = x86JumpInfo (structure x86 = x86) structure x86LoopInfo = x86LoopInfo (structure x86 = x86) structure x86EntryTransfer = x86EntryTransfer (structure x86 = x86) structure x86MLton = x86MLton (structure x86MLtonBasic = x86MLtonBasic structure x86Liveness = x86Liveness) val implementsPrim = x86MLton.implementsPrim structure x86Translate = x86Translate (structure x86 = x86 structure x86MLton = x86MLton structure x86Liveness = x86Liveness) structure x86Simplify = x86Simplify (structure x86 = x86 structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86EntryTransfer = x86EntryTransfer) structure x86GenerateTransfers = x86GenerateTransfers (structure x86 = x86 structure x86MLton = x86MLton structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86LoopInfo = x86LoopInfo structure x86EntryTransfer = x86EntryTransfer) structure x86AllocateRegisters = x86AllocateRegisters (structure x86 = x86 structure x86MLton = x86MLton) open x86 fun output {program as Machine.Program.T {chunks, handlesSignals, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}}: unit = let val reserveEsp = (* There is no sigaltstack on cygwin, we need to reserve %esp to * hold the C stack pointer. We only need to do this in programs * that handle signals. *) let open Control.Target in !os = OpenBSD orelse (handlesSignals andalso !os = Cygwin) end val (picMungeLabel, picBase) = x86AllocateRegisters.picRelative () val makeC = outputC val makeS = outputS val (newProfileLabel, delProfileLabel, getSourceMaps) = let val Machine.Program.T {sourceMaps, ...} = program in case sourceMaps of NONE => (fn _ => Error.bug "x86Codegen.newProfileLabel", fn _ => Error.bug "x86Codegen.delProfileLabel", fn () => NONE) | SOME sm => let val {newProfileLabel, delProfileLabel, getSourceMaps} = Machine.SourceMaps.modify sm in (newProfileLabel, delProfileLabel, SOME o getSourceMaps) end end (* C specific *) fun outputC () = let local val Machine.Program.T {chunks, frameInfos, frameOffsets, globals, handlesSignals, main, maxFrameSize, objectTypes, staticHeaps, ...} = program in val program = Machine.Program.T {chunks = chunks, frameInfos = frameInfos, frameOffsets = frameOffsets, globals = globals, handlesSignals = handlesSignals, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, sourceMaps = getSourceMaps (), staticHeaps = staticHeaps} end val {print, done, ...} = makeC () val additionalMainArgs = let val mainLabel = Label.toString (#label main) (* Drop the leading _, because gcc will add it. *) val mainLabel = if !Control.labelsHaveExtra_ then String.dropPrefix (mainLabel, 1) else mainLabel in [mainLabel] end fun declareLocals () = List.foreach (CType.all, fn t => let val m = List.fold (chunks, ~1, fn (Machine.Chunk.T {tempsMax, ...}, max) => Int.max (max, tempsMax t)) val m = m + 1 in print (concat ["PRIVATE ", CType.toString t, " local", CType.toString t, "[", Int.toString m, "];\n"]) end) fun rest () = declareLocals () in CCodegen.outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["x86-main.h"], print = print, program = program, rest = rest} ; done () end val outputC = Control.trace (Control.Pass, "outputC") outputC (* Assembly specific *) val _ = x86MLtonBasic.init () fun outputJumpToSML print = let val jumpToSML = x86.Label.fromString "MLton_jumpToSML" val findEIP = x86.Label.fromString "MLton_findEIP" val returnToC = x86.Label.fromString "Thread_returnToC" val c_stackP = picMungeLabel x86MLton.c_stackP val gcState = picMungeLabel x86MLton.gcState_label val {frontierReg, stackTopReg} = if reserveEsp then {frontierReg = x86.Register.edi, stackTopReg = x86.Register.ebp} else {frontierReg = x86.Register.esp, stackTopReg = x86.Register.ebp} val prefixJumpToSML = [ x86.Assembly.pseudoop_text (), x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global jumpToSML, x86.Assembly.pseudoop_hidden jumpToSML, x86.Assembly.label jumpToSML, x86.Assembly.instruction_binal {oper = x86.Instruction.SUB, src = x86.Operand.immediate_int 28, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 32), base = SOME x86.Register.esp, index= NONE, scale = NONE}, dst = x86.Operand.register x86.Register.eax, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 24), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebx, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 20), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.edi, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 16), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.esi, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 12), base = SOME x86.Register.esp, index = NONE, scale = NONE}, size = x86.Size.LONG} ] (* This is only included if PIC *) val loadGOT = [ x86.Assembly.instruction_call {target = x86.Operand.label findEIP, absolute = false}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, src = x86.Operand.immediate_label x86MLton.globalOffsetTable, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG} ] val suffixJumpToSML = [ x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 8), base = SOME x86.Register.esp, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.esp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = (SOME o x86.Immediate.labelPlusInt) (gcState, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.StackTop)), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register stackTopReg, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = (SOME o x86.Immediate.labelPlusInt) (gcState, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.Frontier)), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register frontierReg, size = x86.Size.LONG}, x86.Assembly.instruction_jmp {target = x86.Operand.register x86.Register.eax, absolute = true} ] val bodyReturnToC = [ x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global returnToC, x86.Assembly.pseudoop_hidden returnToC, x86.Assembly.label returnToC, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 8), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 12), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.esi, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 16), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.edi, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 20), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 24), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, src = x86.Operand.immediate_int 28, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_ret {src = NONE} ] (* This is only included if PIC *) val bodyFindEIP = [ x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global findEIP, x86.Assembly.pseudoop_hidden findEIP, x86.Assembly.label findEIP, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {base = SOME x86.Register.esp, disp = NONE, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG}, x86.Assembly.instruction_ret {src = NONE} ] val asm = List.concat (if picBase <> NONE then [prefixJumpToSML, loadGOT, suffixJumpToSML, bodyReturnToC, bodyFindEIP] else [prefixJumpToSML, suffixJumpToSML, bodyReturnToC]) in List.foreach (asm, fn asm => (Layout.print(Assembly.layout asm, print); print "\n")) end val liveInfo = x86Liveness.LiveInfo.newLiveInfo () val jumpInfo = x86JumpInfo.newJumpInfo () fun outputChunk (chunk as Machine.Chunk.T {blocks, chunkLabel, ...}, print) = let val isMain = Machine.ChunkLabel.equals(#chunkLabel main, chunkLabel) val () = if isMain then outputJumpToSML print else () val {chunk} = x86Translate.translateChunk {chunk = chunk, liveInfo = liveInfo} val chunk : x86.Chunk.t = x86Simplify.simplify {chunk = chunk, (* don't perform optimizations on * the main function (initGlobals) *) optimize = if isMain then 0 else !Control.Native.optimize, delProfileLabel = delProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo} val unallocated_assembly : x86.Assembly.t list list = (x86GenerateTransfers.generateTransfers {chunk = chunk, optimize = !Control.Native.optimize, newProfileLabel = newProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo, reserveEsp = reserveEsp, picUsesEbx = picBase <> NONE}) val allocated_assembly : Assembly.t list list = x86AllocateRegisters.allocateRegisters {assembly = unallocated_assembly, (* don't calculate liveness info * on the main function (initGlobals) *) liveness = not isMain} val _ = Vector.foreach (blocks, Label.clear o Machine.Block.label) val _ = x86.Immediate.clearAll () val _ = x86.MemLoc.clearAll () in List.fold (allocated_assembly, if isMain then 30 else 0, fn (block, n) => List.fold (block, n, fn (asm, n) => (Layout.print (Assembly.layout asm, print); print "\n"; n + 1))) end fun outputAssembly () = let val split = !Control.Native.split fun loop chunks = let val {print, done, ...} = makeS() fun loop' (chunks, size) = case chunks of [] => done () | chunk::chunks => if (case split of NONE => false | SOME maxSize => size > maxSize) then (done (); loop (chunk::chunks)) else loop'(chunks, size + outputChunk (chunk, print)) in loop' (chunks, 0) end in loop chunks ; x86Translate.translateChunk_totals () ; x86Simplify.simplify_totals () ; x86GenerateTransfers.generateTransfers_totals () ; x86AllocateRegisters.allocateRegisters_totals () end val outputAssembly = Control.trace (Control.Pass, "outputAssembly") outputAssembly in outputAssembly() ; outputC() end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-codegen.sig000066400000000000000000000016611416264345000233510ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_CODEGEN_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature X86_CODEGEN = sig include X86_CODEGEN_STRUCTS val implementsPrim: Machine.Type.t Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-entry-transfer.fun000066400000000000000000000063651416264345000247440ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86EntryTransfer(S: X86_ENTRY_TRANSFER_STRUCTS) : X86_ENTRY_TRANSFER = struct open S open x86 val tracer = x86.tracer fun verifyEntryTransfer {chunk = Chunk.T {blocks, ...}} = let val {get : Label.t -> Block.t option, set, destroy} = Property.destGetSetOnce(Label.plist, Property.initConst NONE) val _ = List.foreach (blocks, fn block as Block.T {entry,...} => set(Entry.label entry, SOME block)) fun isJump l = case get l of SOME (Block.T {entry = Entry.Jump _, ...}) => true | _ => false fun isFunc l = case get l of SOME (Block.T {entry = Entry.Func _, ...}) => true | NONE => true | _ => false fun isCont l = case get l of SOME (Block.T {entry = Entry.Cont _, ...}) => true | _ => false fun isHandler l = case get l of SOME (Block.T {entry = Entry.Handler _, ...}) => true | _ => false fun isCReturn l f = case get l of SOME (Block.T {entry = Entry.CReturn {func, ...}, ...}) => CFunction.equals (f, func) | _ => false val b = List.forall (blocks, fn Block.T {transfer, ...} => (case transfer of Transfer.Goto {target, ...} => isJump target | Transfer.Iff {truee, falsee, ...} => isJump truee andalso isJump falsee | Transfer.Switch {cases, default, ...} => isJump default andalso Transfer.Cases.forall(cases, isJump o #2) | Transfer.Tail {target, ...} => isFunc target | Transfer.NonTail {target, return, handler, ...} => isFunc target andalso isCont return andalso (case handler of SOME handler => isHandler handler | NONE => true) | Transfer.Return {...} => true | Transfer.Raise {...} => true | Transfer.CCall {return, func, ...} => (case return of NONE => true | SOME {return, ...} => isCReturn return func))) val _ = destroy () val _ = if b then () else List.foreach(blocks, Block.printBlock) in b end val (verifyEntryTransfer, verifyEntryTransfer_msg) = tracer "verifyEntryTransfer" verifyEntryTransfer end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-entry-transfer.sig000066400000000000000000000010051416264345000247200ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_ENTRY_TRANSFER_STRUCTS = sig structure x86 : X86 end signature X86_ENTRY_TRANSFER = sig include X86_ENTRY_TRANSFER_STRUCTS val verifyEntryTransfer : {chunk: x86.Chunk.t} -> bool val verifyEntryTransfer_msg : unit -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-generate-transfers.fun000066400000000000000000003121621416264345000255530ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86GenerateTransfers(S: X86_GENERATE_TRANSFERS_STRUCTS): X86_GENERATE_TRANSFERS = struct open S open x86 open x86JumpInfo open x86LoopInfo open x86Liveness open LiveInfo open Liveness local open Runtime in structure CFunction = CFunction end val ones : int * WordSize.t -> WordX.t = fn (i, ws) => (WordX.notb o WordX.lshift) (WordX.allOnes ws, WordX.fromInt (i, ws)) val tracerTop = x86.tracerTop structure x86LiveTransfers = x86LiveTransfers(structure x86 = x86 structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86LoopInfo = x86LoopInfo) val pointerSize = x86MLton.pointerSize val wordSize = x86MLton.wordSize val normalRegs = let val transferRegs = (* Register.eax:: Register.al:: *) Register.ebx:: Register.bl:: Register.ecx:: Register.cl:: Register.edx:: Register.dl:: Register.edi:: Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.esp, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val reserveEspRegs = let val transferRegs = (* Register.eax:: Register.al:: *) Register.ebx:: Register.bl:: Register.ecx:: Register.cl:: Register.edx:: Register.dl:: (* Register.edi:: *) Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.edi, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val picUsesEbxRegs = let val transferRegs = (* Register.eax:: Register.al:: *) (* Register.ebx:: Register.bl:: *) Register.ecx:: Register.cl:: Register.edx:: Register.dl:: Register.edi:: Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.esp, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val transferFltRegs : Entry.t -> Int.t = fn Entry.Jump _ => 6 | Entry.CReturn _ => 6 | _ => 0 val indexReg = x86.Register.eax val stackTop = x86MLton.gcState_stackTopContents val frontier = x86MLton.gcState_frontierContents datatype gef = GEF of {generate : gef -> {label : Label.t, falling : bool, unique : bool} -> Assembly.t AppendList.t, effect : gef -> {label : Label.t, transfer : Transfer.t} -> Assembly.t AppendList.t, fall : gef -> {label : Label.t, live : LiveSet.t} -> Assembly.t AppendList.t} fun generateTransfers {chunk as Chunk.T {data, blocks, ...}, optimize: int, newProfileLabel: x86.ProfileLabel.t -> x86.ProfileLabel.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, reserveEsp: bool, picUsesEbx: bool} = let val {frontierReg, stackTopReg, transferRegs} = if reserveEsp then reserveEspRegs else if picUsesEbx then picUsesEbxRegs else normalRegs val allClasses = !x86MLton.Classes.allClasses val livenessClasses = !x86MLton.Classes.livenessClasses val livenessClasses = ClassSet.add(livenessClasses, x86MLton.Classes.StaticNonTemp) val nonlivenessClasses = ClassSet.-(allClasses, livenessClasses) val holdClasses = !x86MLton.Classes.holdClasses val farflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val nearflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val runtimeClasses = !x86MLton.Classes.runtimeClasses val cstaticClasses = !x86MLton.Classes.cstaticClasses val heapClasses = !x86MLton.Classes.heapClasses val ccallflushClasses = ClassSet.+(cstaticClasses, heapClasses) fun removeHoldMemLocs memlocs = MemLocSet.subset (memlocs, fn m => not (ClassSet.contains(holdClasses, MemLoc.class m))) val stackAssume = {register = stackTopReg, memloc = stackTop (), weight = 1024, sync = false, reserve = false} val frontierAssume = {register = frontierReg, memloc = frontier (), weight = 2048, sync = false, reserve = false} val cStackAssume = {register = Register.esp, memloc = x86MLton.c_stackPContents, weight = 2048, (* ??? *) sync = false, reserve = true} val picUsesEbxAssume = {register = Register.ebx, memloc = x86MLton.globalOffsetTableContents, weight = 2048, (* ??? *) sync = false, reserve = true} fun blockAssumes l = let val l = frontierAssume :: stackAssume :: l val l = if reserveEsp then cStackAssume :: l else l val l = if picUsesEbx then picUsesEbxAssume :: l else l in Assembly.directive_assume {assumes = l } end fun runtimeTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_clearflt ()), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] fun farEntry l = AppendList.cons (blockAssumes [], l) fun farTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_clearflt ()), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] val profileStackTopCommit' = x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton (stackTop ()), commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty} val profileStackTopCommit = if !Control.profile <> Control.ProfileNone then AppendList.single profileStackTopCommit' else AppendList.empty val _ = Assert.assert ("x86GenerateTransfers.verifyLiveInfo", fn () => x86Liveness.LiveInfo.verifyLiveInfo {chunk = chunk, liveInfo = liveInfo}) val _ = Assert.assert ("x86GenerateTransfers.verifyJumpInfo", fn () => x86JumpInfo.verifyJumpInfo {chunk = chunk, jumpInfo = jumpInfo}) val _ = Assert.assert ("x86GenerateTransfers.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk}) local val {get: Label.t -> {block:Block.t}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val labels = List.fold (blocks, [], fn (block as Block.T {entry, ...}, labels) => let val label = Entry.label entry in set(label, {block = block}) ; label::labels end) fun loop labels = let val (labels, b) = List.fold (labels, ([], false), fn (label, (labels, b)) => case x86JumpInfo.getNear (jumpInfo, label) of x86JumpInfo.Count 0 => let val {block = Block.T {transfer, ...}} = get label in List.foreach (Transfer.nearTargets transfer, fn label => x86JumpInfo.decNear (jumpInfo, label)); (labels, true) end | _ => (label::labels, b)) in if b then loop labels else List.map (labels, #block o get) end val blocks = loop labels val _ = destroy () in val chunk = Chunk.T {data = data, blocks = blocks} end val loopInfo = x86LoopInfo.createLoopInfo {chunk = chunk, farLoops = false} val isLoopHeader = fn label => isLoopHeader(loopInfo, label) handle _ => false val liveTransfers = x86LiveTransfers.computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferFltRegs = transferFltRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} val getLiveRegsTransfers = #1 o x86LiveTransfers.getLiveTransfers val getLiveFltRegsTransfers = #2 o x86LiveTransfers.getLiveTransfers val {get = getLayoutInfo : Label.t -> Block.t option, set = setLayoutInfo, destroy = destLayoutInfo} = Property.destGetSet(Label.plist, Property.initRaise ("layoutInfo", Label.layout)) val _ = List.foreach (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry in setLayoutInfo(label, SOME block) end) val {get = getProfileLabel : Label.t -> ProfileLabel.t option, set = setProfileLabel, destroy = destProfileLabel} = Property.destGetSetOnce (Label.plist, Property.initRaise ("profileLabel", Label.layout)) val _ = List.foreach (blocks, fn Block.T {entry, profileLabel, ...} => let val label = Entry.label entry in setProfileLabel(label, profileLabel) end) local val stack = ref [] val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun push x = stack := x::(!stack) fun deque () = (case (!stack) of [] => (case Queue.deque(!queue) of NONE => NONE | SOME(queue', x) => (queue := queue'; SOME x)) | x::stack' => (stack := stack'; SOME x)) end fun pushCompensationBlock {label, id} = let val label' = Label.new label val live = getLive(liveInfo, label) val profileLabel = getProfileLabel label val profileLabel' = Option.map (profileLabel, newProfileLabel) val block = Block.T {entry = Entry.jump {label = label'}, profileLabel = profileLabel', statements = (Assembly.directive_restoreregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ()), id = id}):: nil, transfer = Transfer.goto {target = label}} in setLive(liveInfo, label', live); setProfileLabel(label', profileLabel'); incNear(jumpInfo, label'); Assert.assert("x86GenerateTransfers.pushCompensationBlock", fn () => getNear(jumpInfo, label') = Count 1); x86LiveTransfers.setLiveTransfersEmpty(liveTransfers, label'); setLayoutInfo(label', SOME block); push label'; label' end val c_stackP = x86MLton.c_stackPContentsOperand fun cacheEsp () = if reserveEsp then AppendList.empty else AppendList.single ((* explicit cache in case there are no args *) Assembly.directive_cache {caches = [{register = Register.esp, memloc = valOf (Operand.deMemloc c_stackP), reserve = true}]}) fun unreserveEsp () = if reserveEsp then AppendList.empty else AppendList.single (Assembly.directive_unreserve {registers = [Register.esp]}) local val set: (String.t, Label.t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} in fun makeDarwinSymbolStubLabel name = (HashTable.lookupOrInsert) (set, name, fn () => Label.newString (concat ["L_", name, "_stub"])) fun makeDarwinSymbolStubs () = HashTable.foldi (set, [], fn (name, label, assembly) => (Assembly.pseudoop_symbol_stub ()) :: (Assembly.label label) :: (Assembly.pseudoop_indirect_symbol (Label.fromString name)) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: assembly) end datatype z = datatype Entry.t datatype z = datatype Transfer.t fun generateAll (gef as GEF {effect,...}) {label, falling, unique} : Assembly.t AppendList.t = (case getLayoutInfo label of NONE => AppendList.empty | SOME (Block.T {entry, profileLabel, statements, transfer}) => let val _ = setLayoutInfo(label, NONE) (* val isLoopHeader = fn _ => false *) fun near label = let val align = if isLoopHeader label handle _ => false then AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, SOME (Immediate.int 7))) else if falling then AppendList.empty else AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE)) val assumes = if falling andalso unique then AppendList.empty else (* near entry & live transfer assumptions *) AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_fltassume {assumes = (List.map (getLiveFltRegsTransfers (liveTransfers, label), fn (memloc,sync) => {memloc = memloc, sync = sync, weight = 1024}))})] in AppendList.appends [align, AppendList.single (Assembly.label label), AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), assumes] end val pre = case entry of Jump {label} => near label | CReturn {dsts, frameInfo, func, label} => let fun getReturn () = if Vector.isEmpty dsts then AppendList.empty else let val srcs = Vector.fromList (List.map (Operand.cReturnTemps (CFunction.return func), #dst)) in (AppendList.fromList o Vector.fold2) (dsts, srcs, [], fn ((dst,dstsize),src,stmts) => case Size.class dstsize of Size.INT => (x86.Assembly.instruction_mov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | Size.FLT => (x86.Assembly.instruction_pfmov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | _ => Error.bug "x86GenerateTransfers.generateAll: CReturn") end in case frameInfo of SOME fi => let val FrameInfo.T {size, frameInfosIndex} = fi val finish = AppendList.appends [let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end, (* assignTo dst *) getReturn ()] in AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), if CFunction.maySwitchThreadsTo func then (* entry from far assumptions *) farEntry finish else (* near entry & live transfer assumptions *) AppendList.append (AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_fltassume {assumes = (List.map (getLiveFltRegsTransfers (liveTransfers, label), fn (memloc,sync) => {memloc = memloc, sync = sync, weight = 1024}))})], finish)] end | NONE => AppendList.append (near label, getReturn ()) end | Func {label,...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry AppendList.empty)] | Cont {label, frameInfo = FrameInfo.T {size, frameInfosIndex}, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] | Handler {frameInfo = (FrameInfo.T {frameInfosIndex, size}), label, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameInfosIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] val pre = AppendList.appends [if !Control.codegenComments > 1 then AppendList.single (Assembly.comment (Entry.toString entry)) else AppendList.empty, if !Control.codegenComments > 2 then AppendList.single (Assembly.comment (LiveSet.fold (getLive(liveInfo, label), "", fn (memloc, s) => concat [s, MemLoc.toString memloc, " "]))) else AppendList.empty, pre] val (statements,_) = List.foldr (statements, ([], Liveness.liveIn (livenessTransfer {transfer = transfer, liveInfo = liveInfo})), fn (assembly,(statements,live)) => let val Liveness.T {liveIn,dead, ...} = livenessAssembly {assembly = assembly, live = live} in (if LiveSet.isEmpty dead then assembly::statements else assembly:: (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}):: statements, liveIn) end) val statements = AppendList.fromList statements val transfer = effect gef {label = label, transfer = transfer} in AppendList.appends [pre, statements, transfer] end) and effectDefault (gef as GEF {fall,...}) {label, transfer} : Assembly.t AppendList.t = AppendList.append (if !Control.codegenComments > 1 then AppendList.single (Assembly.comment (Transfer.toString transfer)) else AppendList.empty, case transfer of Goto {target} => fall gef {label = target, live = getLive(liveInfo, target)} | Iff {condition, truee, falsee} => let val condition_neg = Instruction.condition_negate condition val truee_live = getLive(liveInfo, truee) val truee_live_length = LiveSet.size truee_live val falsee_live = getLive(liveInfo, falsee) val falsee_live_length = LiveSet.size falsee_live fun fall_truee () = let val id = Directive.Id.new () val falsee' = pushCompensationBlock {label = falsee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition_neg, target = Operand.label falsee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet falsee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = truee, live = truee_live})) end fun fall_falsee () = let val id = Directive.Id.new () val truee' = pushCompensationBlock {label = truee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition, target = Operand.label truee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet truee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = falsee, live = falsee_live})) end in case (getLayoutInfo truee, getLayoutInfo falsee) of (NONE, SOME _) => fall_falsee () | (SOME _, NONE) => fall_truee () | _ => let fun default' () = if truee_live_length <= falsee_live_length then fall_falsee () else fall_truee () fun default () = case (getNear(jumpInfo, truee), getNear(jumpInfo, falsee)) of (Count 1, Count 1) => default' () | (Count 1, _) => fall_truee () | (_, Count 1) => fall_falsee () | _ => default' () in case (getLoopDistance(loopInfo, label, truee), getLoopDistance(loopInfo, label, falsee)) of (NONE, NONE) => default () | (SOME _, NONE) => fall_truee () | (NONE, SOME _) => fall_falsee () | (SOME dtruee, SOME dfalsee) => (case Int.compare(dtruee, dfalsee) of EQUAL => default () | LESS => fall_falsee () | GREATER => fall_truee ()) end end | Switch {test, cases, default} => let val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val size = case Operand.size test of SOME size => size | NONE => Size.LONG val default_live = getLive(liveInfo, default) val cases = Transfer.Cases.mapToList (cases, fn (k, target) => let val target_live = getLive(liveInfo, target) val id = Directive.Id.new () val target' = pushCompensationBlock {label = target, id = id} in AppendList.fromList [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate_word k, size = size}, Assembly.instruction_jcc {condition = Instruction.E, target = Operand.label target'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet target_live, stackTop ()), frontier ()), id = id}] end) in AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), AppendList.appends cases, if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), (fall gef {label = default, live = default_live})] end | Tail {target, live} => (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) | NonTail {target, live, return, handler, size} => let val _ = enque return val _ = case handler of SOME handler => enque handler | NONE => () val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = x86MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = x86MLton.stackTopTempMinusWordDerefOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = x86MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val bytes = x86.Operand.immediate_int size val liveReturn = x86Liveness.LiveInfo.getLive(liveInfo, return) val liveHandler = case handler of SOME handler => x86Liveness.LiveInfo.getLive(liveInfo, handler) | _ => LiveSet.empty val live = MemLocSet.unions [live, LiveSet.toMemLocSet liveReturn, LiveSet.toMemLocSet liveHandler] in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopTempMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) end | Return {live} => let val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () in (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) end | Raise {live} => let val exnStack = x86MLton.gcState_exnStackContentsOperand () val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackBottom = x86MLton.gcState_stackBottomContentsOperand () in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackBottom + exnStack *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackBottom, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = exnStack, size = pointerSize}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop = stackBottom + exnStack *) x86.Assembly.instruction_mov {dst = stackTop, src = stackBottom, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = exnStack, size = pointerSize}])) (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = x86MLton.gcState_stackTopMinusWordDerefOperand (), absolute = true}))) end | CCall {args, func, return} => let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val CFunction.T {convention, return = returnTy, symbolScope, target, ...} = func val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val c_stackP = x86MLton.c_stackPContentsOperand val c_stackPDerefFloat = x86MLton.c_stackPDerefFloatOperand val c_stackPDerefDouble = x86MLton.c_stackPDerefDoubleOperand val applyFFTempFun = x86MLton.applyFFTempFunContentsOperand val applyFFTempArg = x86MLton.applyFFTempArgContentsOperand val (fptrArg, args) = case target of Direct _ => (AppendList.empty, args) | Indirect => let val (fptrArg, args) = case args of fptrArg::args => (fptrArg, args) | _ => Error.bug "x86GenerateTransfers.generateAll: CCall" in (AppendList.single (Assembly.instruction_mov {src = #1 fptrArg, dst = applyFFTempFun, size = #2 fptrArg}), args) end val (pushArgs, size_args) = List.fold (args, (AppendList.empty, 0), fn ((arg, size), (assembly_args, size_args)) => let val (assembly_arg, size_arg) = if Size.eq (size, Size.DBLE) then (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, Assembly.instruction_pfmov {src = arg, dst = c_stackPDerefDouble, size = size}], Size.toBytes size) else if Size.eq (size, Size.SNGL) then (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 4, size = pointerSize}, Assembly.instruction_pfmov {src = arg, dst = c_stackPDerefFloat, size = size}], Size.toBytes size) else if Size.eq (size, Size.BYTE) orelse Size.eq (size, Size.WORD) then (AppendList.fromList [Assembly.instruction_movx {oper = Instruction.MOVZX, dst = applyFFTempArg, src = arg, dstsize = wordSize, srcsize = size}, Assembly.instruction_ppush {src = applyFFTempArg, base = c_stackP, size = wordSize}], Size.toBytes wordSize) else (AppendList.single (Assembly.instruction_ppush {src = arg, base = c_stackP, size = size}), Size.toBytes size) in (AppendList.append (assembly_arg, assembly_args), size_arg + size_args) end) val (pushArgs, aligned_size_args) = let val space = 16 - (size_args mod 16) in if space = 16 then (pushArgs, size_args) else (AppendList.append (AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int space, size = pointerSize}), pushArgs), size_args + space) end val flush = case return of SOME {return, size = SOME size} => (* Entering runtime *) let val _ = enque return val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = x86MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = x86MLton.stackTopTempMinusWordDerefOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = x86MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val bytes = x86.Operand.immediate_int size val live = x86Liveness.LiveInfo.getLive(liveInfo, return) val {defs, ...} = Transfer.uses_defs_kills transfer val live = List.fold (defs, live, fn (oper,live) => case Operand.deMemloc oper of SOME memloc => LiveSet.remove (live, memloc) | NONE => live) in (runtimeTransfer (LiveSet.toMemLocSet live) (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopTempMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = runtimeClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}))) end | _ => AppendList.single (Assembly.directive_force {commit_memlocs = let val s = MemLocSet.empty val s = if CFunction.modifiesFrontier func then MemLocSet.add (s, frontier ()) else s val s = if CFunction.readsStackTop func then MemLocSet.add (s, stackTop ()) else s in s end, commit_classes = ccallflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}) val call = case target of Direct name => let datatype z = datatype MLton.Platform.OS.t datatype z = datatype Control.Format.t val name = case convention of Cdecl => name | Stdcall => concat [name, "@", Int.toString size_args] val label = fn () => Label.fromString name (* how to access imported functions: *) (* Windows rewrites the symbol __imp__name *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => makeDarwinSymbolStubLabel name val elf = fn () => Label.fromString (name ^ "@PLT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (label ()), absolute = false}] val plt = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (importLabel ()), absolute = false}] val indirect = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.memloc_label (importLabel ()), absolute = true}] in case (symbolScope, !Control.Target.os, !Control.Native.pic) of (* Private functions can be easily reached * with a direct (eip-relative) call. *) (Private, _, _) => direct () (* Call at the point of definition. *) | (Public, MinGW, _) => direct () | (Public, Cygwin, _) => direct () | (Public, Darwin, _) => direct () (* ELF requires PLT even for public fns. *) | (Public, _, true) => plt () | (Public, _, false) => direct () (* Windows always does indirect calls to * imported functions. The importLabel has * the function address written to it. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* Darwin needs to generate special stubs * that are filled in by the dynamic linker. * This is needed even for non-PIC. *) | (External, Darwin, _) => plt () (* ELF systems create procedure lookup * tables (PLT) which proxy the call to * libraries. The PLT does not contain an * address, but instead a stub function. *) | (External, _, true) => plt () | (External, _, false) => direct () end | Indirect => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = applyFFTempFun, absolute = true}] val kill = if (case return of SOME {size = SOME _, ...} => true | _ => false) then AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = runtimeClasses}) else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = let val s = MemLocSet.empty val s = if CFunction.modifiesFrontier func then MemLocSet.add (s, frontier ()) else s val s = if CFunction.writesStackTop func then MemLocSet.add (s, stackTop ()) else s in s end, dead_classes = ccallflushClasses}) val getResult = AppendList.single (Assembly.directive_return {returns = Operand.cReturnTemps returnTy}) val fixCStack = if aligned_size_args > 0 andalso convention = CFunction.Convention.Cdecl then (AppendList.single (Assembly.instruction_binal {oper = Instruction.ADD, dst = c_stackP, src = Operand.immediate_int aligned_size_args, size = pointerSize})) else AppendList.empty val continue = if CFunction.maySwitchThreadsFrom func then (* Returning from runtime *) (farTransfer MemLocSet.empty AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) else case return of NONE => AppendList.empty | SOME {return, size} => (if isSome size then (* Don't need to trampoline, * since didn't switch threads, * but can't fall because * frame layout data is prefixed * to l's code; use fallNone * to force a jmp with near * jump assumptions. *) fallNone else fall) gef {label = return, live = getLive (liveInfo, return)} in AppendList.appends [cacheEsp (), fptrArg, pushArgs, flush, call, kill, getResult, fixCStack, unreserveEsp (), continue] end) and effectJumpTable (gef as GEF {...}) {label, transfer} : Assembly.t AppendList.t = case transfer of Switch {test, cases, default} => let val ws = case Operand.size test of SOME Size.BYTE => WordSize.word8 | SOME Size.WORD => WordSize.word16 | SOME Size.LONG => WordSize.word32 | _ => Error.bug "x86GenerateTransfers.effectJumpTable: Switch" val zero = WordX.zero ws val one = WordX.one ws val two = WordX.add (one, one) fun even w = WordX.isZero (WordX.mod (w, two, {signed = false})) fun incFn w = WordX.add (w, one) fun decFn w = WordX.sub (w, one) fun halfFn w = WordX.div (w, two, {signed = false}) fun ltFn (w1, w2) = WordX.lt (w1, w2, {signed = false}) val min = WordX.min (ws, {signed = false}) fun minFn (w1, w2) = if WordX.lt (w1, w2, {signed = false}) then w1 else w2 val max = WordX.max (ws, {signed = false}) fun maxFn (w1, w2) = if WordX.gt (w1, w2, {signed = false}) then w1 else w2 fun range (w1, w2) = WordX.sub (w2, w1) val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} fun reduce(cases) = let fun reduce' cases = let val (minK,maxK,length, allEven,allOdd) = List.fold (cases, (max, min, 0, true, true), fn ((k,_), (minK,maxK,length, allEven,allOdd)) => let val isEven = even k in (minFn(k,minK), maxFn(k,maxK), length + 1, allEven andalso isEven, allOdd andalso not isEven) end) in if length > 1 andalso (allEven orelse allOdd) then let val f = if allOdd then halfFn o decFn else halfFn val cases' = List.map (cases, fn (k,target) => (f k, target)) val (cases'', minK'', maxK'', length'', shift'', mask'') = reduce' cases' val shift' = 1 + shift'' val mask' = WordX.orb (WordX.lshift(mask'', WordX.one WordSize.word32), if allOdd then WordX.one WordSize.word32 else WordX.zero WordSize.word32) in (cases'', minK'', maxK'', length'', shift', mask') end else (cases, minK, maxK, length, 0, WordX.zero WordSize.word32) end in reduce' cases end fun doitTable(cases, minK, _, rangeK, shift, mask) = let val jump_table_label = Label.newString "jumpTable" val idT = Directive.Id.new () val defaultT = Promise.delay (fn () => let val _ = incNear(jumpInfo, default) in pushCompensationBlock {label = default, id = idT} end) val rec filler = fn ([],_) => [] | (cases as (i,target)::cases',j) => if WordX.equals (i, j) then let val target' = pushCompensationBlock {label = target, id = idT} in (Immediate.label target'):: (filler(cases', incFn j)) end else (Immediate.label (Promise.force defaultT)):: (filler(cases, incFn j)) val jump_table = filler (cases, minK) val idD = Directive.Id.new () val defaultD = pushCompensationBlock {label = default, id = idD} val default_live = getLive(liveInfo, default) val live = List.fold (cases, default_live, fn ((_,target), live) => LiveSet.+(live, getLive(liveInfo, target))) val indexTemp = MemLoc.imm {base = Immediate.label (Label.fromString "indexTemp"), index = Immediate.zero, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Temp} val checkTemp = MemLoc.imm {base = Immediate.label (Label.fromString "checkTemp"), index = Immediate.zero, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Temp} val address = MemLoc.basic {base = Immediate.label jump_table_label, index = indexTemp, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Code} val size = case Operand.size test of SOME size => size | NONE => Size.LONG val indexTemp' = indexTemp val indexTemp = Operand.memloc indexTemp val checkTemp' = checkTemp val checkTemp = Operand.memloc checkTemp val address = Operand.memloc address in AppendList.appends [if Size.lt(size, Size.LONG) then AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, src = test, srcsize = size, dst = indexTemp, dstsize = Size.LONG}) else AppendList.single (Assembly.instruction_mov {src = test, dst = indexTemp, size = Size.LONG}), if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), if shift > 0 then let val idC = Directive.Id.new () val defaultC = pushCompensationBlock {label = default, id = idC} val _ = incNear(jumpInfo, default) in AppendList.appends [AppendList.fromList [Assembly.instruction_mov {src = indexTemp, dst = checkTemp, size = Size.LONG}, Assembly.instruction_binal {oper = Instruction.AND, src = Operand.immediate_word (ones (shift, WordSize.word32)), dst = checkTemp, size = Size.LONG}], if WordX.isZero mask then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word mask, dst = checkTemp, size = Size.LONG}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton checkTemp', dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = Instruction.NZ, target = Operand.label defaultC}, Assembly.directive_saveregalloc {id = idC, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int shift, dst = indexTemp, size = Size.LONG}]] end else AppendList.empty, if WordX.equals (minK, zero) then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word minK, dst = indexTemp, size = Size.LONG}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.directive_cache {caches = [{register = indexReg, memloc = indexTemp', reserve = false}]}, Assembly.instruction_cmp {src1 = indexTemp, src2 = Operand.immediate_word rangeK, size = Size.LONG}, Assembly.instruction_jcc {condition = Instruction.A, target = Operand.label defaultD}, Assembly.directive_saveregalloc {id = idD, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_jmp {target = address, absolute = true}, Assembly.directive_saveregalloc {id = idT, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ())}, Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton indexTemp', dead_classes = ClassSet.empty}], AppendList.fromList [Assembly.pseudoop_data (), Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.label jump_table_label, Assembly.pseudoop_long jump_table, Assembly.pseudoop_text ()]] end fun doit(cases) = let val (cases, minK, maxK, length, shift, mask) = reduce(cases) val rangeK = range(minK,maxK) in if length >= 8 andalso WordX.lt (WordX.div(rangeK,two,{signed=false}), WordX.fromInt (length, ws), {signed = false}) then let val cases = List.insertionSort (cases, fn ((k,_),(k',_)) => ltFn(k,k')) in doitTable(cases, minK, maxK, rangeK, shift, mask) end else effectDefault gef {label = label, transfer = transfer} end in case cases of Transfer.Cases.Word cases => doit cases end | _ => effectDefault gef {label = label, transfer = transfer} and fallNone (GEF {...}) {label, live} : Assembly.t AppendList.t = let val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveFltRegsTransfer = getLiveFltRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveFltRegsTransfer, live, fn ((memloc,_),live) => LiveSet.remove(live,memloc)) fun default () = AppendList.fromList ((* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}):: (Assembly.directive_fltcache {caches = List.map (liveFltRegsTransfer, fn (memloc,_) => {memloc = memloc})}):: (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}):: (Assembly.instruction_jmp {target = Operand.label label, absolute = false}):: (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}):: nil) in case getLayoutInfo label of NONE => default () | SOME (Block.T {...}) => (push label; default ()) end and fallDefault (gef as GEF {generate,...}) {label, live} : Assembly.t AppendList.t = let datatype z = datatype x86JumpInfo.status val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveFltRegsTransfer = getLiveFltRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveFltRegsTransfer, live, fn ((memloc,_),live) => LiveSet.remove(live,memloc)) fun default jmp = AppendList.appends [AppendList.fromList [(* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_fltcache {caches = List.map (liveFltRegsTransfer, fn (memloc,_) => {memloc = memloc})}), (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], if jmp then AppendList.single (Assembly.instruction_jmp {target = Operand.label label, absolute = false}) else AppendList.empty, AppendList.single (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))})] in case getLayoutInfo label of NONE => default true | SOME (Block.T {...}) => (case getNear(jumpInfo, label) of Count 1 => generate gef {label = label, falling = true, unique = true} | _ => AppendList.append (default false, AppendList.cons (Assembly.directive_reset (), (generate gef {label = label, falling = true, unique = false})))) end fun make {generate, effect, fall} = generate (GEF {generate = generate, effect = effect, fall = fall}) val generate = case optimize of 0 => make {generate = generateAll, effect = effectDefault, fall = fallNone} | _ => make {generate = generateAll, effect = effectJumpTable, fall = fallDefault} val _ = List.foreach (blocks, fn Block.T {entry, ...} => (case entry of Func {label, ...} => enque label | _ => ())) fun doit () : Assembly.t list list = (case deque () of NONE => [] | SOME label => (case AppendList.toList (generate {label = label, falling = false, unique = false}) of [] => doit () | block => block::(doit ()))) val assembly = doit () val symbol_stubs = makeDarwinSymbolStubs () val _ = destLayoutInfo () val _ = destProfileLabel () val assembly = [Assembly.pseudoop_text ()]::assembly val assembly = if List.isEmpty symbol_stubs then assembly else symbol_stubs :: assembly val assembly = if List.isEmpty data then assembly else data::assembly in assembly end val (generateTransfers, generateTransfers_msg) = tracerTop "generateTransfers" generateTransfers fun generateTransfers_totals () = (generateTransfers_msg (); Control.indent (); x86Liveness.LiveInfo.verifyLiveInfo_msg (); x86JumpInfo.verifyJumpInfo_msg (); x86EntryTransfer.verifyEntryTransfer_msg (); x86LoopInfo.createLoopInfo_msg (); x86LiveTransfers.computeLiveTransfers_totals (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-generate-transfers.sig000066400000000000000000000022501416264345000255370ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_GENERATE_TRANSFERS_STRUCTS = sig structure x86 : X86 structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86LoopInfo : X86_LOOP_INFO sharing x86 = x86LoopInfo.x86 structure x86EntryTransfer : X86_ENTRY_TRANSFER sharing x86 = x86EntryTransfer.x86 end signature X86_GENERATE_TRANSFERS = sig include X86_GENERATE_TRANSFERS_STRUCTS val generateTransfers: {chunk: x86.Chunk.t, optimize: int, newProfileLabel: x86.ProfileLabel.t -> x86.ProfileLabel.t, liveInfo: x86Liveness.LiveInfo.t, jumpInfo: x86JumpInfo.t, reserveEsp: bool, picUsesEbx: bool} -> x86.Assembly.t list list val generateTransfers_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-jump-info.fun000066400000000000000000000073441416264345000236630ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86JumpInfo(S: X86_JUMP_INFO_STRUCTS) : X86_JUMP_INFO = struct open S open x86 val tracer = x86.tracer datatype status = Count of int | None val status_eq = fn (None , None ) => true | (Count i1, Count i2) => i1 = i2 | _ => false val status_toString = fn None => "None" | Count i => concat ["Count ", Int.toString i] datatype t = T of {get: Label.t -> status ref} fun newJumpInfo () = let val {get : Label.t -> status ref, ...} = Property.get(Label.plist, Property.initFun (fn _ => ref (Count 0))) in T {get = get} end local fun doit (status_ref, maybe_fn) = case !status_ref of None => () | Count i => status_ref := (maybe_fn i) in fun incNear (T {get}, label) = doit (get label, fn i => Count (i+1)) fun decNear (T {get}, label) = doit (get label, fn i => Count (i-1)) fun forceNear (T {get}, label) = doit (get label, fn _ => None) end fun getNear (T {get}, label) = !(get label) fun completeJumpInfo {chunk = Chunk.T {blocks, ...}, jumpInfo: t} = List.foreach (blocks, fn Block.T {entry, transfer,...} => (case entry of Entry.Jump _ => () | Entry.Func {label, ...} => forceNear (jumpInfo, label) | Entry.Cont {label, ...} => forceNear (jumpInfo, label) | Entry.Handler {label, ...} => forceNear (jumpInfo, label) | Entry.CReturn {label, func, ...} => if CFunction.maySwitchThreadsTo func then forceNear (jumpInfo, label) else (); List.foreach (Transfer.nearTargets transfer, fn label => incNear (jumpInfo, label)))) val (completeJumpInfo, completeJumpInfo_msg) = tracer "completeJumpInfo" completeJumpInfo fun verifyJumpInfo {chunk as Chunk.T {blocks, ...}, jumpInfo: t} = let local val {get : Label.t -> status ref, destroy} = Property.destGet(Label.plist, Property.initFun (fn _ => ref (Count 0))) in val jumpInfo' = T {get = get} val destroy = destroy end val _ = completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo'} val verified = List.forall (blocks, fn Block.T {entry,...} => let val label = Entry.label entry in if status_eq(getNear(jumpInfo, label), getNear(jumpInfo', label)) then true else (print "verifyJumpInfo: "; print (Label.toString label); print "\n"; print "jumpInfo: "; print (status_toString (getNear(jumpInfo, label))); print "\n"; print "jumpInfo': "; print (status_toString (getNear(jumpInfo', label))); print "\n"; false) end) val _ = destroy () in verified end val (verifyJumpInfo, verifyJumpInfo_msg) = tracer "verifyJumpInfo" verifyJumpInfo end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-jump-info.sig000066400000000000000000000016351416264345000236520ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_JUMP_INFO_STRUCTS = sig structure x86 : X86 end signature X86_JUMP_INFO = sig include X86_JUMP_INFO_STRUCTS datatype status = Count of int | None type t val newJumpInfo : unit -> t val completeJumpInfo : {chunk: x86.Chunk.t, jumpInfo: t} -> unit val completeJumpInfo_msg : unit -> unit val verifyJumpInfo : {chunk: x86.Chunk.t, jumpInfo: t} -> bool val verifyJumpInfo_msg : unit -> unit val incNear : t * x86.Label.t -> unit val decNear : t * x86.Label.t -> unit val getNear : t * x86.Label.t -> status end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-live-transfers.fun000066400000000000000000001415451416264345000247250ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Some of this doesn't make sense if we track the liveness of the GCHold class. * Need to update the enque'' of returns, handlers of NonTail and Runtime * so they reflect what happens at these transfers; (i.e., stackTop and frontier * are defed on return from NonTail). *) functor x86LiveTransfers(S: X86_LIVE_TRANSFERS_STRUCTS) : X86_LIVE_TRANSFERS = struct open S open x86 local open Runtime in structure CFunction = CFunction end structure LiveSet = x86Liveness.LiveSet structure LiveInfo = x86Liveness.LiveInfo open x86JumpInfo open x86LoopInfo fun take (l, n) = let val rec take' = fn ([], _, ac) => List.rev ac | (_, 0 : Int.t, ac) => List.rev ac | (h::t, i, ac) => take' (t, i - 1, h::ac) in take' (l, n, []) end val track = x86Liveness.track val tracerTop = x86.tracerTop fun temp_uses_defs {uses : Operand.t list, defs : Operand.t list} = let val baseUses = List.fold (uses, MemLocSet.empty, fn (operand, baseUses) => case Operand.deMemloc operand of SOME memloc => if x86Liveness.track memloc then MemLocSet.add(baseUses, memloc) else baseUses | NONE => baseUses) val tempUses = let fun doit (operands, tempUses) = List.fold (operands, tempUses, fn (operand, tempUses) => case Operand.deMemloc operand of SOME memloc => List.fold(MemLoc.utilized memloc, tempUses, fn (memloc, tempUses) => if x86Liveness.track memloc then MemLocSet.add(tempUses, memloc) else tempUses) | NONE => tempUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = List.fold (defs, MemLocSet.empty, fn (operand, baseDefs) => case Operand.deMemloc operand of SOME memloc => if x86Liveness.track memloc then MemLocSet.add(baseDefs, memloc) else baseDefs | NONE => baseDefs) val tempDefs = baseDefs in {uses = tempUses, defs = tempDefs} end datatype t = T of {get: Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list), set: Label.t * ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list) -> unit} local in structure I' = struct open Int fun sign x = if x = 0 then 0 else if x > 0 then 1 else ~1 end structure I = struct datatype t = NegInfinity | Finite of I'.t | PosInfinity val toString = fn NegInfinity => "-inf" | Finite n => I'.toString n | PosInfinity => "+inf" val zero = Finite (I'.zero) fun NegInfinity < NegInfinity = false | NegInfinity < _ = true | (Finite _) < NegInfinity = false | (Finite x) < (Finite y) = I'.<(x,y) | (Finite _) < PosInfinity = true | PosInfinity < _ = false fun NegInfinity + PosInfinity = zero | NegInfinity + _ = NegInfinity | (Finite _) + NegInfinity = NegInfinity | (Finite x) + (Finite y) = ((Finite (I'.+(x,y))) handle Overflow => if x > 0 then PosInfinity else NegInfinity) | (Finite _) + PosInfinity = PosInfinity | PosInfinity + NegInfinity = zero | PosInfinity + _ = PosInfinity fun NegInfinity * NegInfinity = PosInfinity | NegInfinity * (Finite x) = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | NegInfinity * PosInfinity = NegInfinity | (Finite x) * NegInfinity = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | (Finite x) * (Finite y) = ((Finite (I'.*(x, y))) handle Overflow => (case (I'.sign x, I'.sign y) of (~1, ~1) => PosInfinity | (1, ~1) => NegInfinity | (~1, 1) => NegInfinity | _ => PosInfinity)) | (Finite x) * PosInfinity = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * NegInfinity = NegInfinity | PosInfinity * (Finite x) = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * PosInfinity = PosInfinity end end fun computeLiveTransfers {chunk = Chunk.T {blocks,...}, transferRegs : Entry.t -> Register.t list, transferFltRegs : Entry.t -> Int.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} = let val (useLF, useB, sync) = case !Control.Native.liveTransfer of 1 => (false, false, false) | 2 => (false, false, true) | 3 => (false, true, false) | 4 => (false, true, true) | 5 => (true, false, false) | 6 => (true, false, true) | 7 => (true, true, false) | _ => (true, true, true) val cutoff = !Control.Native.cutoff datatype u = Position of I.t | Length of I'.t val {get = getInfo : Label.t -> {block: Block.t, pred: Label.t list ref, succ: Label.t list ref, live: {memloc: MemLoc.t, distanceF': u option ref, distanceF: (I.t * Label.t option) option ref, distanceB': u option ref, distanceB: (I.t * Label.t option) option ref} vector, liveTransfers: ((MemLoc.t * Register.t * bool ref) list * (MemLoc.t * bool ref) list) option ref, defed: MemLocSet.t option ref}, set = setInfo, destroy = destInfo} = Property.destGetSetOnce (Label.plist, Property.initRaise ("x86LiveTransfers:getInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, transfer, ...}, (labels, funcs)) => let val label = Entry.label entry val succ = Transfer.nearTargets transfer val live = LiveInfo.getLive(liveInfo, label) val live = List.fold (succ, live, fn (label, live) => LiveSet.+(live, LiveInfo.getLive(liveInfo, label))) val live = LiveSet.toList live val _ = setInfo(label, {block = block, pred = ref [], succ = ref succ, live = Vector.fromListMap (live, fn memloc => {memloc = memloc, distanceF' = ref NONE, distanceF = ref NONE, distanceB' = ref NONE, distanceB = ref NONE}), liveTransfers = ref NONE, defed = ref NONE}) val labels = label::labels val funcs = case entry of Entry.Func _ => label::funcs | _ => funcs in (labels, funcs) end) val labels = Vector.fromList labels val funcs = Vector.fromList funcs val _ = Vector.foreach (labels, fn label => let val {block, ...} = getInfo label fun doit target = let val {pred = pred', ...} = getInfo target in List.push (pred', label) end val Block.T {transfer, ...} = block datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => doit target | Iff {truee, falsee, ...} => (doit truee; doit falsee) | Switch {cases, default, ...} => (doit default; Transfer.Cases.foreach(cases, doit o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit return; case handler of SOME handler => doit handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, ...} => Option.app (return, doit o #return) end) val _ = Vector.foreach (labels, fn label => let val {block, live, ...} = getInfo label val Block.T {entry, statements, transfer, ...} = block val l = List.fold (statements, I'.two, fn (Assembly.Comment _, l) => l | (_, l) => I'.+(l, I'.one)) fun pos ([], n, m) = let val {uses, defs, ...} = Transfer.uses_defs_kills transfer val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else distanceF' := SOME (Length l) | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()) end | pos ((Assembly.Comment _)::assembly,n,m) = pos (assembly,n,m) | pos (asm::assembly,n,m) = let val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()); pos(assembly, I'.+(n, I'.one), I'.-(m, I'.one)) end in let val n = I'.zero val m = I'.-(l, I'.one) val {uses,defs,...} = Entry.uses_defs_kills entry val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else distanceB' := SOME (Length l)); pos(statements, I'.+(n, I'.one), I'.-(m, I'.one)) end end) fun get_distanceF {temp: MemLoc.t, label: Label.t} = let val {block, succ, live, ...} = getInfo label val Block.T {transfer, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceF = ref (SOME (df, dfl)), ...} => (df, dfl) | SOME {distanceF', distanceF, ...} => (case valOf (!distanceF') of Position n => (distanceF := SOME (n, SOME label); (n, SOME label)) | Length n => let val loopLabels = getLoopLabels (loopInfo, label) val _ = distanceF := SOME (I.PosInfinity, NONE) fun default () = let val n = I.Finite n val (min, minl) = List.fold (!succ, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val (n', l') = get_distanceF {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) in (min, minl) end datatype z = datatype Transfer.t val (n, l) = case transfer of Tail _ => (I.PosInfinity, NONE) | NonTail _ => (I.PosInfinity, NONE) | Return _ => (I.PosInfinity, NONE) | Raise _ => (I.PosInfinity, NONE) | CCall {func, ...} => if CFunction.maySwitchThreadsFrom func orelse Size.class (MemLoc.size temp) <> Size.INT then (I.PosInfinity, NONE) else default () | _ => default () in distanceF := SOME (n, l) ; (n, l) end) | _ => (I.PosInfinity, NONE) end fun get_distanceB {temp: MemLoc.t, label: Label.t} = let val {block, pred, live, ...} = getInfo label val Block.T {entry, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB = ref (SOME (db, dbl)), ...} => (db, dbl) | SOME {distanceB, ...} => let val loopLabels = getLoopLabels(loopInfo, label) val _ = distanceB := SOME (I.PosInfinity, NONE) fun default () = List.fold (!pred, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val {live, ...} = getInfo label in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB', ...} => (case valOf(!distanceB') of Position n => if I.<(n, min) then (n, SOME label) else (min, minl) | Length n => let val n = I.Finite n val (n', l') = get_distanceB {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) | _ => (min, minl) end) datatype z = datatype Entry.t val (n, l) = case entry of Func {...} => (I.PosInfinity, NONE) | Cont {...} => (I.PosInfinity, NONE) | Handler {...} => (I.PosInfinity, NONE) | CReturn {func, ...} => if (CFunction.maySwitchThreadsTo func orelse Size.class (MemLoc.size temp) <> Size.INT) then (I.PosInfinity, NONE) else default () | _ => default () in distanceB := SOME (n, l) ; (n, l) end | _ => (I.PosInfinity, NONE) end local val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun deque () = case Queue.deque (!queue) of NONE => NONE | SOME (queue', x) => (queue := queue'; SOME x) end fun doit {label, hints} = let val {block as Block.T {entry, ...}, live = liveData, liveTransfers, ...} = getInfo label in case !liveTransfers of SOME _ => () | NONE => let val loopLabels = getLoopLabels(loopInfo, label) val Block.T {transfer, ...} = block val (regHints, fltregHints) = hints val live = LiveSet.toList(LiveInfo.getLive(liveInfo, label)) val _ = if true then () else (print (Label.toString label); print "\nloopLabels: "; print (List.toString Label.toString loopLabels); print "\nliveData:\n"; Vector.foreach (liveData, fn {memloc, distanceF', distanceB', ...} => (print (MemLoc.toString memloc); print ": "; case !distanceF' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print " "; case !distanceB' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print "\n")); print "regHints:\n"; List.foreach (regHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "fltregHints:\n"; List.foreach (fltregHints, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "live:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print "\n")); print "distance_F:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceF {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n")); print "distance_B:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceB {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n"))) val live = if not useB then List.keepAllMap (live, fn memloc => case get_distanceF {temp = memloc, label = label} of (I.Finite n, SOME l) => if n < cutoff then if useLF then if List.contains (loopLabels, l, Label.equals) then SOME (memloc, n) else SOME (memloc, n * 5) else SOME (memloc, n) else NONE | (I.PosInfinity, _) => NONE | _ => Error.bug "x86LiveTransfers.computeLiveTransfers.live: get_distanceF") else List.keepAllMap (live, fn memloc => case (get_distanceB {temp = memloc, label = label}, get_distanceF {temp = memloc, label = label}) of ((I.PosInfinity, _), _) => NONE | (_, (I.PosInfinity, _)) => NONE | ((I.Finite n, SOME nl), (I.Finite m, SOME ml)) => if (n + m) < cutoff then if useLF then case (List.contains (loopLabels, nl, Label.equals), List.contains (loopLabels, ml, Label.equals)) of (true, true) => SOME (memloc, n + m) | (true, false) => SOME (memloc, n + 5 * m) | (false, true) => SOME (memloc, 5 * n + m) | (false, false) => SOME (memloc, 5 * n + 5 * m) else SOME (memloc, n + m) else NONE | _ => Error.bug "x86LiveTransfers.computeLiveTransfers.live: get_distanceB") (* List.partition will reverse the lists. * So sort in increasing order. *) val live = List.insertionSort (live, fn ((_,n1),(_,n2)) => I'.>(n1, n2)) val _ = if true then () else (print "live:\n"; List.foreach (live, fn (memloc,n) => (print (MemLoc.toString memloc); print ": "; print (I'.toString n); print "\n"))) val {yes = liveRegs, no = liveFltRegs} = List.partition (live, fn (memloc,_) => Size.class (MemLoc.size memloc) = Size.INT) val liveRegs = List.map (liveRegs, fn (memloc,weight) => case List.peek (regHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferRegs = List.removeAll (transferRegs, fn register' => Register.coincide(register, register')) in doitRegs (transferRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferRegs' = List.keepAllMap (transferRegs, fn register => if Size.eq (size, Register.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => Register.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferRegs' = List.insertionSort (transferRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferRegs' of nil => doitRegs (transferRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferRegs, register, Register.eq) then finish register else default () | NONE => default () end val liveRegsTransfers = doitRegs(transferRegs entry, liveRegs, []) val liveFltRegs = take(liveFltRegs, transferFltRegs entry) val liveFltRegsTransfers = List.map(liveFltRegs, fn (memloc, _) => (memloc, ref true)) val _ = liveTransfers := SOME (liveRegsTransfers, liveFltRegsTransfers) (* val _ = (print "liveRegsTransfers:\n"; List.foreach (liveRegsTransfers, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "liveFltRegsTransfers:\n"; List.foreach (liveFltRegsTransfers, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "") *) fun doit' label = enque {label = label, hints = (liveRegsTransfers, liveFltRegsTransfers)} fun doit'' label = enque {label = label, hints = ([],[])} fun doit''' func label = let val hints = List.fold (Operand.cReturnTemps (CFunction.return func), ([],[]), fn ({src, dst}, (regHints, fltregHints)) => case src of Operand.Register reg => ((dst, reg, ref true) :: regHints, fltregHints) | Operand.FltRegister _ => (regHints, (dst, ref true) :: fltregHints) | _ => (regHints, fltregHints)) in enque {hints = hints, label = label} end datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreadsFrom func then Option.app (return, doit'' o #return) else Option.app (return, doit''' func o #return) end end val _ = Vector.foreach (funcs, fn label => enque {label = label, hints = ([],[])}) fun loop () = (case deque () of NONE => () | SOME {label, hints} => (doit {label = label, hints = hints}; loop ())) val _ = loop () fun doit {label, defed = defed'} = let val {block, liveTransfers, defed, ...} = getInfo label val (liveRegs, liveFltRegs) = valOf (!liveTransfers) val defed' = case getNear(jumpInfo, label) of None => MemLocSet.empty | Count 0 => MemLocSet.empty | Count 1 => defed' | Count _ => MemLocSet.subset (defed', fn memloc => List.exists (liveRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc)) orelse List.exists (liveFltRegs, fn (memloc',_) => MemLoc.eq(memloc', memloc))) fun default defed'' = let val Block.T {entry, statements, transfer, ...} = block val _ = List.foreach (liveRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val _ = List.foreach (liveFltRegs, fn (memloc,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val defed' = MemLocSet.+(defed'', defed') val _ = defed := SOME defed' fun doit' (defed', defs) = List.fold (defs, defed', fn (def,defed') => case Operand.deMemloc def of SOME def => if track def then MemLocSet.add(defed', def) else defed' | NONE => defed') val {defs, ...} = Entry.uses_defs_kills entry val defed' = doit' (defed', defs) val defed' = List.fold (statements, defed', fn (asm,defed') => let val {defs, ...} = Assembly.uses_defs_kills asm in doit' (defed', defs) end) val {defs, ...} = Transfer.uses_defs_kills transfer val defed' = doit' (defed', defs) fun doit' label = doit {label = label, defed = defed'} fun doit'' label = doit {label = label, defed = MemLocSet.empty} datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (Transfer.Cases.foreach(cases, doit' o #2); doit' default) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreadsFrom func then Option.app (return, doit'' o #return) else Option.app (return, doit' o #return) end in case !defed of NONE => default MemLocSet.empty | SOME defed => if MemLocSet.<=(defed',defed) then () else default defed end val _ = Vector.foreach (funcs, fn label => doit {label = label, defed = MemLocSet.empty}) val {get = getLiveTransfers : Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list), set = setLiveTransfers, ...} = Property.getSet (Label.plist, Property.initRaise ("x86LiveTransfers:getLiveTransfers", Label.layout)) val _ = Vector.foreach (labels, fn label => let val {liveTransfers, ...} = getInfo label val (liveRegs, liveFltRegs) = valOf (!liveTransfers) val (liveRegs, liveFltRegs) = if sync then (List.map (liveRegs, fn (memloc,reg, sync) => (memloc, reg, !sync)), List.map (liveFltRegs, fn (memloc, sync) => (memloc, !sync))) else (List.map (liveRegs, fn (memloc,reg, _) => (memloc, reg, false)), List.map (liveFltRegs, fn (memloc, _) => (memloc, false))) in setLiveTransfers(label, (liveRegs, liveFltRegs)) end) val _ = destInfo () in T {get = getLiveTransfers, set = setLiveTransfers} end val computeLiveTransfers = fn {chunk, transferRegs, transferFltRegs, liveInfo, jumpInfo, loopInfo} => if !Control.Native.liveTransfer > 0 then computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferFltRegs = transferFltRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} else let val {get = getLiveTransfers, set = setLiveTransfers, ...} = Property.getSetOnce(Label.plist, Property.initConst ([], [])) in T {get = getLiveTransfers, set = setLiveTransfers} end val (computeLiveTransfers : {chunk : Chunk.t, transferRegs : Entry.t -> Register.t list, transferFltRegs : Entry.t -> Int.t, liveInfo : LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} -> t, computeLiveTransfers_msg) = tracerTop "computeLiveTransfers" computeLiveTransfers fun computeLiveTransfers_totals () = (computeLiveTransfers_msg ()) fun getLiveTransfers (T {get, ...}, label) = get label fun setLiveTransfersEmpty (T {set, ...}, label) = set(label, ([], [])) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-live-transfers.sig000066400000000000000000000024651416264345000247140ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_LIVE_TRANSFERS_STRUCTS = sig structure x86 : X86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86LoopInfo : X86_LOOP_INFO sharing x86 = x86LoopInfo.x86 end signature X86_LIVE_TRANSFERS = sig include X86_LIVE_TRANSFERS_STRUCTS type t val computeLiveTransfers : {chunk : x86.Chunk.t, transferRegs : x86.Entry.t -> x86.Register.t list, transferFltRegs : x86.Entry.t -> Int.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} -> t val computeLiveTransfers_totals : unit -> unit val getLiveTransfers : t * x86.Label.t -> ((x86.MemLoc.t * x86.Register.t * bool) list * (x86.MemLoc.t * bool) list) val setLiveTransfersEmpty : t * x86.Label.t -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-liveness.fun000066400000000000000000000636531416264345000236140ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86Liveness(S: X86_LIVENESS_STRUCTS) : X86_LIVENESS = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop structure LiveSet = struct open MemLocSet fun toMemLocSet s = s end fun track memloc = ClassSet.contains(!x86MLtonBasic.Classes.livenessClasses, MemLoc.class memloc) fun livenessOperands live = List.fold (live, LiveSet.empty, fn (operand, live) => (case Operand.deMemloc operand of NONE => live | SOME memloc => if track memloc then LiveSet.add(live, memloc) else live)) structure LiveInfo = struct datatype t = T of {get: Label.t -> LiveSet.t, set: Label.t * LiveSet.t -> unit} fun newLiveInfo () = let val {get : Label.t -> LiveSet.t, set : Label.t * LiveSet.t -> unit, ...} = Property.getSet (Label.plist, Property.initRaise ("liveInfo", Label.layout)) in T {get = get, set = set} end fun setLiveOperands (T {set, ...}, label, live) = set(label, livenessOperands live) fun setLive (T {set, ...}, label, live) = set(label, live) fun getLive (T {get, ...}, label) = get label end fun liveness_uses_defs {uses : Operand.t list, defs : Operand.t list} : {uses : LiveSet.t, defs : LiveSet.t} = let val baseUses = livenessOperands uses val livenessUses = let fun doit (operands, livenessUses) = List.fold (operands, livenessUses, fn (operand, livenessUses) => case Operand.deMemloc operand of SOME memloc => List.fold (MemLoc.utilized memloc, livenessUses, fn (memloc, livenessUses) => if track memloc then LiveSet.add(livenessUses, memloc) else livenessUses) | NONE => livenessUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = livenessOperands defs val livenessDefs = baseDefs in {uses = livenessUses, defs = livenessDefs} end structure Liveness = struct datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} local fun make f (T r) = f r in val dead = make #dead val liveIn = make #liveIn end fun toString (T {liveIn, liveOut, dead}) = let fun doit (name, l, toString, s) = LiveSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit("liveIn: ", liveIn, MemLoc.toString, doit("liveOut: ", liveOut, MemLoc.toString, doit("dead: ", dead, MemLoc.toString, ""))) end fun eq (T {liveIn = liveIn1, liveOut = liveOut1, dead = dead1}, T {liveIn = liveIn2, liveOut = liveOut2, dead = dead2}) = LiveSet.equals(liveIn1, liveIn2) andalso LiveSet.equals(liveOut1, liveOut2) andalso LiveSet.equals(dead1, dead2) fun liveness ({uses : LiveSet.t, defs : LiveSet.t, live : LiveSet.t}) : t = let val liveOut = live (* liveIn = uses \/ (liveOut - defs) *) val liveIn = LiveSet.+(uses, LiveSet.-(live, defs)) (* dead = (liveIn \/ defs) - liveOut *) val dead = LiveSet.-(LiveSet.+(liveIn, defs), liveOut) in T {liveIn = liveIn, liveOut = liveOut, dead = dead} end fun livenessEntry {entry : Entry.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Entry.uses_defs_kills entry val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} val defs = MemLocSet.fold (Entry.live entry, defs, fn (memloc, defs) => if track memloc then LiveSet.add(defs, memloc) else defs) in liveness {uses = uses, defs = defs, live = live} end fun livenessAssembly {assembly : Assembly.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Assembly.uses_defs_kills assembly val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer' {transfer: Transfer.t, live : LiveSet.t} : t = let val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses,defs} = liveness_uses_defs {uses = uses, defs = defs} (* Transfer.live transfer could be considered uses, * but the Liveness.t of a transfer should have * Transfer.live transfer as liveOut. *) val live = MemLocSet.fold (Transfer.live transfer, live, fn (memloc, live) => if track memloc then LiveSet.add(live, memloc) else live) in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer {transfer: Transfer.t, liveInfo: LiveInfo.t} : t = let val targets = Transfer.nearTargets transfer val live = List.fold (targets, LiveSet.empty, fn (target, live) => LiveSet.union(LiveInfo.getLive(liveInfo, target), live)) in livenessTransfer' {transfer = transfer, live = live} end fun livenessBlock {block = Block.T {entry, statements, transfer, ...}, liveInfo : LiveInfo.t} = let val T {liveIn = live, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val live = List.foldr (statements, live, fn (asm,live) => let val T {liveIn = live, ...} = livenessAssembly {assembly = asm, live = live} in live end) val T {liveIn = live, ...} = livenessEntry {entry = entry, live = live} in live end end structure LiveInfo = struct open LiveInfo fun completeLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : LiveInfo.t, pass: string} = let val {get = getBlockInfo : Label.t -> {pred: Label.t list ref, block: Block.t option ref, topo: int ref}, destroy = destBlockInfo} = Property.destGet (Label.plist, Property.initFun (fn _ => {pred = ref [], block = ref NONE, topo = ref ~1})) val get_pred = (#pred o getBlockInfo) val get_topo = (#topo o getBlockInfo) val get_pred' = (! o #pred o getBlockInfo) val get_block' = (! o #block o getBlockInfo) val get_topo' = (! o #topo o getBlockInfo) val labels = List.map (blocks, fn block' as Block.T {entry, transfer,...} => let val label = Entry.label entry val {block,topo,...} = getBlockInfo label val targets = Transfer.nearTargets transfer in block := SOME block'; topo := 0; List.foreach (targets, fn target => List.push(get_pred target, label)); label end) local val todo = ref [] fun topo_order(x,y) = Int.compare(get_topo' x, get_topo' y) fun insert (l, x, compare) = let val rec insert' = fn ([],acc) => List.appendRev(acc, [x]) | (l as h::t,acc) => (case compare(h,x) of LESS => insert' (t, h::acc) | EQUAL => List.appendRev(acc, l) | GREATER => List.appendRev(acc, x::l)) in insert' (l,[]) end in fun add_todo x = todo := insert(!todo, x, topo_order) fun push_todo x = todo := x::(!todo) fun rev_todo () = todo := List.rev (!todo) fun get_todo () = (case !todo of [] => NONE | (x::todo') => (todo := todo'; SOME x)) end local val nextNum = Counter.generator 1 in fun topo_sort label = let val {topo, pred, ...} = getBlockInfo label in if !topo = 0 then (topo := nextNum (); push_todo label; List.foreach(!pred, topo_sort)) else () end fun topo_root label = (get_topo label := nextNum (); push_todo label) end fun loop (labels, n) = if List.isEmpty labels then () else let val {yes = exits, no = labels} = List.partition (labels, fn label => let val Block.T {transfer, ...} = valOf (get_block' label) val targets = Transfer.nearTargets transfer val targets' = List.fold(targets, 0, fn (target,targets') => if get_topo' target = ~1 then targets' else targets' + 1) in targets' = n end) val exits = List.removeAll (exits, fn label => get_topo' label <> 0) val _ = (List.foreach (exits, fn label => topo_root label); List.foreach (exits, fn label => List.foreach(get_pred' label, topo_sort))) in loop(labels, n + 1) end val _ = loop(labels, 0) val _ = rev_todo () val changed = ref false fun doit () = (case get_todo () of NONE => () | SOME label => let val {pred, block, ...} = getBlockInfo label val block = valOf (!block) val live = Liveness.livenessBlock {block = block, liveInfo = liveInfo} val live' = LiveInfo.getLive(liveInfo, label) in if LiveSet.equals(live, live') then () else (LiveInfo.setLive(liveInfo, label, live); List.foreach(!pred, add_todo); if true then () else (print "completeLiveInfo:"; print pass; print ": "; print (Label.toString label); print ": "; if LiveSet.<(live, live') then print "new < old" else if LiveSet.<(live', live) then print "old < new" else print "?"; print "\n"; if true then (print "old: "; LiveSet.foreach (live', fn m => (print (MemLoc.toString m); print " ")); print "\n"; print "new: "; LiveSet.foreach (live, fn m => (print (MemLoc.toString m); print " ")); print "\n") else ()); changed := true); doit () end) val _ = doit () val _ = destBlockInfo () in () end val (completeLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t, pass: string} -> unit, completeLiveInfo_msg) = tracerTop "completeLiveInfo" completeLiveInfo fun verifyLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : t} = List.forall (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry val live = LiveInfo.getLive(liveInfo, label) val live' = Liveness.livenessBlock {block = block, liveInfo = liveInfo} in LiveSet.equals(live, live') end) val (verifyLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t} -> bool, verifyLiveInfo_msg) = tracer "verifyLiveInfo" verifyLiveInfo end structure LivenessBlock = struct datatype t = T of {entry: (Entry.t * Liveness.t), profileLabel: ProfileLabel.t option, statements: (Assembly.t * Liveness.t) list, transfer: Transfer.t * Liveness.t} fun printBlock (T {entry, statements, transfer, ...}) = (let val (entry,info) = entry in print (Entry.toString entry); print "\n"; print (Liveness.toString info) end; List.foreach (statements, fn (asm,info) => (print (Assembly.toString asm); print "\n"; print (Liveness.toString info))); let val (trans,info) = transfer in print (Transfer.toString trans); print "\n"; print (Liveness.toString info); print "\n" end) fun toLivenessEntry {entry, live} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun reLivenessEntry {entry, live} = let val (entry,_) = entry val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun toLivenessStatements {statements, live} = let val {statements,live} = List.foldr(statements, {statements = [], live = live}, fn (asm,{statements,live}) => let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info)::statements, live = live} end) in {statements = statements, live = live} end fun reLivenessStatements {statements: (Assembly.t * Liveness.t) list, live} = let val {statements,live,...} = List.foldr(statements, {statements = [], live = live, continue = false}, fn ((asm,info),{statements,live,continue}) => if continue then {statements = (asm,info)::statements, live = Liveness.liveIn info, continue = continue} else let val info' as Liveness.T {liveIn = live',...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info')::statements, live = live', continue = Liveness.eq(info,info')} end) in {statements = statements, live = live} end fun toLivenessTransfer {transfer, liveInfo} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {transfer = (transfer,info), live = live} end fun reLivenessTransfer {transfer: Transfer.t * Liveness.t} = let val (transfer, Liveness.T {liveOut,...}) = transfer val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer' {transfer = transfer, live = liveOut} in {transfer = (transfer, info), live = live} end fun toLivenessBlock {block = Block.T {entry, profileLabel, statements, transfer}, liveInfo : LiveInfo.t} = let val {transfer, live} = toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, live} = toLivenessStatements {statements =statements, live = live} val {entry, ...} = toLivenessEntry {entry = entry, live = live} val liveness_block = T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in liveness_block end val (toLivenessBlock: {block: Block.t, liveInfo: LiveInfo.t} -> t, toLivenessBlock_msg) = tracer "toLivenessBlock" toLivenessBlock fun verifyLivenessEntry {entry = (entry,info), live} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessEntry {entry = entry, live = live} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessStatements {statements, live} = List.foldr(statements, {verified = true, live = live}, fn ((asm,info),{verified, live}) => let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessAssembly {assembly = asm, live = live} val eq = Liveness.eq(info, info') val () = if eq then () else (print "asm ::\n"; print (Assembly.toString asm); print "\n"; print "info ::\n"; print (Liveness.toString info); print "\n"; print "info' ::\n"; print (Liveness.toString info'); print "\n") in {verified = verified andalso Liveness.eq(info, info'), live = live'} end) fun verifyLivenessTransfer {transfer = (transfer,info), liveInfo} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessBlock {block = T {entry, statements, transfer, ...}, liveInfo: LiveInfo.t} = let val {verified = verified_transfer, live} = verifyLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {verified = verified_statements, live} = verifyLivenessStatements {statements =statements, live = live} val {verified = verified_entry, ...} = verifyLivenessEntry {entry = entry, live = live} (* FIXME -- the live-in set changed because of dead code elimination. val live' = get label val verified_live = List.equalsAsSet(live, live', MemLoc.eq) *) val verified_live = true in verified_transfer andalso verified_statements andalso verified_entry andalso verified_live end val (verifyLivenessBlock: {block: t, liveInfo: LiveInfo.t} -> bool, verifyLivenessBlock_msg) = tracer "verifyLivenessBlock" verifyLivenessBlock fun toBlock {block = T {entry, profileLabel, statements, transfer}} = let val (entry,_) = entry val statements = List.map(statements, fn (asm,_) => asm) val (transfer,_) = transfer in Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} end val (toBlock: {block: t} -> Block.t, toBlock_msg) = tracer "toBlock" toBlock end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-liveness.sig000066400000000000000000000076441416264345000236040ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_LIVENESS_STRUCTS = sig structure x86: X86 structure x86MLtonBasic: X86_MLTON_BASIC sharing x86 = x86MLtonBasic.x86 end signature X86_LIVENESS = sig include X86_LIVENESS_STRUCTS structure LiveSet: sig include SET val toMemLocSet: t -> x86.MemLocSet.t end sharing type LiveSet.Element.t = x86.MemLoc.t val track : x86.MemLoc.t -> bool structure LiveInfo: sig type t val newLiveInfo : unit -> t val setLiveOperands : t * x86.Label.t * x86.Operand.t list -> unit val setLive : t * x86.Label.t * LiveSet.t -> unit val getLive : t * x86.Label.t -> LiveSet.t val completeLiveInfo : {chunk: x86.Chunk.t, liveInfo: t, pass: string} -> unit val completeLiveInfo_msg : unit -> unit val verifyLiveInfo : {chunk: x86.Chunk.t, liveInfo: t} -> bool val verifyLiveInfo_msg : unit -> unit end structure Liveness: sig datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} val dead: t -> LiveSet.t val liveIn: t -> LiveSet.t val livenessAssembly : {assembly : x86.Assembly.t, live : LiveSet.t} -> t val livenessEntry : {entry : x86.Entry.t, live : LiveSet.t} -> t val livenessTransfer : {transfer: x86.Transfer.t, liveInfo: LiveInfo.t} -> t end structure LivenessBlock: sig datatype t = T of {entry: (x86.Entry.t * Liveness.t), profileLabel: x86.ProfileLabel.t option, statements: (x86.Assembly.t * Liveness.t) list, transfer: (x86.Transfer.t * Liveness.t)} val printBlock : t -> unit val toLivenessEntry : {entry: x86.Entry.t, live: LiveSet.t} -> {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} val reLivenessEntry : {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} -> {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} val toLivenessStatements : {statements: x86.Assembly.t list, live: LiveSet.t} -> {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} val reLivenessStatements : {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} -> {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} val toLivenessTransfer : {transfer: x86.Transfer.t, liveInfo: LiveInfo.t} -> {transfer: (x86.Transfer.t * Liveness.t), live: LiveSet.t} val reLivenessTransfer : {transfer: (x86.Transfer.t * Liveness.t)} -> {transfer: (x86.Transfer.t * Liveness.t), live: LiveSet.t} val toLivenessBlock : {block: x86.Block.t, liveInfo: LiveInfo.t} -> t val toLivenessBlock_msg : unit -> unit val verifyLivenessBlock : {block: t, liveInfo: LiveInfo.t} -> bool val verifyLivenessBlock_msg : unit -> unit val toBlock : {block: t} -> x86.Block.t val toBlock_msg : unit -> unit end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-loop-info.fun000066400000000000000000000134101416264345000236500ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86LoopInfo(S: X86_LOOP_INFO_STRUCTS) : X86_LOOP_INFO = struct open S open x86 structure Graph = DirectedGraph structure Node = Graph.Node structure LoopForest = Graph.LoopForest val tracer = x86.tracer datatype t = T of {getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}} fun createLoopInfo {chunk = Chunk.T {blocks, ...}, farLoops} = let val G = Graph.new () val {get = getNodeInfo : unit Node.t -> Label.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("x86LoopInfo:getNodeInfo", Node.layout)) val {get = getInfo : Label.t -> unit Node.t, destroy = destInfo} = Property.destGet (Label.plist, Property.initFun (fn l => let val n = Graph.newNode G val _ = setNodeInfo(n, l) in n end)) val {get = getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}, set = setLoopInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("x86LoopInfo:getLoopInfo", Label.layout)) val rootLabel = Label.newString "root" val root = getInfo rootLabel fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (blocks, fn Block.T {entry, transfer, ...} => let val label = Entry.label entry val node = getInfo label fun doit' target = let val node' = getInfo target in addEdge {from = node, to = node'} end fun doit'' target = let val node' = getInfo target in if farLoops then addEdge {from = node, to = node'} else addEdge {from = root, to = node'} end datatype z = datatype Transfer.t in if Entry.isFunc entry then addEdge {from = root, to = node} else () ; case transfer of Goto {target, ...} => doit' target | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, func, ...} => Option.app (return, if CFunction.mayGC func then doit'' o #return else doit' o #return) end) val _ = destInfo () val lf = Graph.loopForestSteensgaard (G, {root = root, nodeValue = getNodeInfo}) fun doit (f: Label.t LoopForest.t, headers, path) = let val {loops, notInLoop} = LoopForest.dest f val notInLoop = Vector.toList notInLoop val path' = List.rev path in List.foreach (notInLoop, fn l => setLoopInfo (l, {loopHeader = Vector.contains (headers, l, Label.equals), loopLabels = notInLoop, loopPath = path'})) ; Vector.foreachi (loops, fn (i,{headers, child}) => doit (child, headers, i::path)) end val _ = doit (lf, Vector.new0 (), []) in T {getLoopInfo = getLoopInfo} end val (createLoopInfo, createLoopInfo_msg) = tracer "createLoopInfo" createLoopInfo fun getLoopDistance (T {getLoopInfo, ...}, from, to) = (case (#loopPath (getLoopInfo from), #loopPath (getLoopInfo to)) of ([], _) => NONE | (_, []) => NONE | (pfrom, pto) => let val rec check = fn ([], pto) => SOME (List.length pto) | (pfrom, []) => SOME (~(List.length pfrom)) | (f::pfrom,t::pto) => if f = t then check (pfrom, pto) else NONE in check (pfrom, pto) end) fun getLoopLabels (T {getLoopInfo, ...}, label) = #loopLabels (getLoopInfo label) fun isLoopHeader (T {getLoopInfo, ...}, l) = #loopHeader (getLoopInfo l) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-loop-info.sig000066400000000000000000000013341416264345000236440ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_LOOP_INFO_STRUCTS = sig structure x86 : X86 end signature X86_LOOP_INFO = sig include X86_LOOP_INFO_STRUCTS type t val createLoopInfo : {chunk: x86.Chunk.t, farLoops: bool} -> t val createLoopInfo_msg : unit -> unit val getLoopDistance : t * x86.Label.t * x86.Label.t -> int option val getLoopLabels : t * x86.Label.t -> x86.Label.t list val isLoopHeader : t * x86.Label.t -> bool end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-mlton-basic.fun000066400000000000000000000343221416264345000241630ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86MLtonBasic (S: X86_MLTON_BASIC_STRUCTS): X86_MLTON_BASIC = struct open S open x86 local open Machine in structure CType = CType structure Runtime = Runtime end (* * x86.Size.t equivalents *) val wordBytes = Bytes.toInt Bytes.inWord32 val wordSize = Size.fromBytes wordBytes val wordScale = Scale.fromBytes wordBytes val pointerBytes = Bytes.toInt Bytes.inWord32 val pointerSize = Size.fromBytes pointerBytes (* * Memory classes *) structure Classes = struct local fun new s = MemLoc.Class.new {name = s} in val Heap = new "Heap" val Stack = new "Stack" val Locals = new "Locals" val Globals = new "Globals" val Temp = MemLoc.Class.Temp val StaticTemp = MemLoc.Class.StaticTemp val CStack = MemLoc.Class.CStack val Code = MemLoc.Class.Code val CStatic = new "CStatic" val StaticNonTemp = new "StaticNonTemp" val GCState = new "GCState" val GCStateHold = new "GCStateHold" val GCStateVolatile = new "GCStateVolatile" end val allClasses = ref x86.ClassSet.empty val livenessClasses = ref x86.ClassSet.empty val holdClasses = ref x86.ClassSet.empty val volatileClasses = ref x86.ClassSet.empty val runtimeClasses = ref x86.ClassSet.empty val heapClasses = ref x86.ClassSet.empty val cstaticClasses = ref x86.ClassSet.empty fun initClasses () = let val _ = allClasses := x86.ClassSet.fromList ( Heap:: Stack:: Locals:: Globals:: Temp:: StaticTemp:: CStack:: Code:: CStatic:: StaticNonTemp:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = livenessClasses := (if !Control.Native.liveStack then x86.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: Stack:: nil) else x86.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: nil)) val _ = holdClasses := x86.ClassSet.fromList ( GCStateHold:: (* GCStateVolatile:: *) nil) val _ = volatileClasses := x86.ClassSet.fromList ( GCStateVolatile:: nil) val _ = runtimeClasses := x86.ClassSet.fromList ( Heap:: Stack:: Globals:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = heapClasses := x86.ClassSet.fromList ( Heap:: nil) val _ = cstaticClasses := x86.ClassSet.fromList ( CStatic:: nil) in () end end val makeContents = x86.MemLoc.makeContents val c_stackP = Label.fromString "c_stackP" val c_stackPContents = makeContents {base = Immediate.label c_stackP, size = pointerSize, class = Classes.StaticNonTemp} val c_stackPContentsOperand = Operand.memloc c_stackPContents val c_stackPDerefDouble = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.DBLE, class = Classes.CStack} val c_stackPDerefDoubleOperand = Operand.memloc c_stackPDerefDouble val c_stackPDerefFloat = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.SNGL, class = Classes.CStack} val c_stackPDerefFloatOperand = Operand.memloc c_stackPDerefFloat (* This is more a pseudo-location. The GOT is special and cannot * be simply loaded. Similarly, we don't really read the contents. *) val globalOffsetTable = Label.fromString "_GLOBAL_OFFSET_TABLE_" val globalOffsetTableContents = makeContents {base = Immediate.label globalOffsetTable, size = pointerSize, class = Classes.StaticNonTemp} val applyFFTempFun = Label.fromString "applyFFTempFun" val applyFFTempFunContents = makeContents {base = Immediate.label applyFFTempFun, size = wordSize, class = Classes.StaticTemp} val applyFFTempFunContentsOperand = Operand.memloc applyFFTempFunContents val applyFFTempArg = Label.fromString "applyFFTempArg" val applyFFTempArgContents = makeContents {base = Immediate.label applyFFTempArg, size = wordSize, class = Classes.StaticTemp} val applyFFTempArgContentsOperand = Operand.memloc applyFFTempArgContents val overflowCheckTemp = Label.fromString "overflowCheckTemp" fun overflowCheckTempContents size = makeContents {base = Immediate.label overflowCheckTemp, size = size, class = Classes.StaticTemp} fun overflowCheckTempContentsOperand size = Operand.memloc (overflowCheckTempContents size) val realTemp1D = Label.fromString "realTemp1D" val realTemp1ContentsD = makeContents {base = Immediate.label realTemp1D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp1ContentsOperandD = Operand.memloc realTemp1ContentsD val realTemp1S = Label.fromString "realTemp1S" val realTemp1ContentsS = makeContents {base = Immediate.label realTemp1S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp1ContentsOperandS = Operand.memloc realTemp1ContentsS fun realTemp1ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp1ContentsOperandD | Size.SNGL => realTemp1ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp1ContentsOperand: floatSize" val realTemp2D = Label.fromString "realTemp2D" val realTemp2ContentsD = makeContents {base = Immediate.label realTemp2D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp2ContentsOperandD = Operand.memloc realTemp2ContentsD val realTemp2S = Label.fromString "realTemp2S" val realTemp2ContentsS = makeContents {base = Immediate.label realTemp2S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp2ContentsOperandS = Operand.memloc realTemp2ContentsS fun realTemp2ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp2ContentsOperandD | Size.SNGL => realTemp2ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp2ContentsOperand: floatSize" val realTemp3D = Label.fromString "realTemp3D" val realTemp3ContentsD = makeContents {base = Immediate.label realTemp3D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp3ContentsOperandD = Operand.memloc realTemp3ContentsD val realTemp3S = Label.fromString "realTemp3S" val realTemp3ContentsS = makeContents {base = Immediate.label realTemp3S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp3ContentsOperandS = Operand.memloc realTemp3ContentsS fun realTemp3ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp3ContentsOperandD | Size.SNGL => realTemp3ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp3ContentsOperand: floatSize" val fpswTemp = Label.fromString "fpswTemp" val fpswTempContents = makeContents {base = Immediate.label fpswTemp, size = Size.WORD, class = Classes.StaticTemp} val fpswTempContentsOperand = Operand.memloc fpswTempContents val fildTemp = Label.fromString "fildTemp" val fildTempContents = makeContents {base = Immediate.label fildTemp, size = Size.WORD, class = Classes.StaticTemp} val fildTempContentsOperand = Operand.memloc fildTempContents val wordTemp1B = Label.fromString "wordTemp1B" val wordTemp1ContentsB = makeContents {base = Immediate.label wordTemp1B, size = Size.BYTE, class = Classes.StaticTemp} val wordTemp1ContentsOperandB = Operand.memloc wordTemp1ContentsB val wordTemp1W = Label.fromString "wordTemp1W" val wordTemp1ContentsW = makeContents {base = Immediate.label wordTemp1W, size = Size.WORD, class = Classes.StaticTemp} val wordTemp1ContentsOperandW = Operand.memloc wordTemp1ContentsW val wordTemp1L = Label.fromString "wordTemp1L" val wordTemp1ContentsL = makeContents {base = Immediate.label wordTemp1L, size = Size.LONG, class = Classes.StaticTemp} val wordTemp1ContentsOperandL = Operand.memloc wordTemp1ContentsL fun wordTemp1ContentsOperand wordSize = case wordSize of Size.BYTE => wordTemp1ContentsOperandB | Size.WORD => wordTemp1ContentsOperandW | Size.LONG => wordTemp1ContentsOperandL | _ => Error.bug "x86MLtonBasic.wordTemp1ContentsOperand: wordSize" local fun make prefix = let fun make name size = Label.fromString (concat [prefix, name, size]) val r = make "Real" val w = make "Word" datatype z = datatype CType.t in CType.memo (fn t => case t of CPointer => Label.fromString (concat [prefix, "CPointer"]) | Int8 => w "8" | Int16 => w "16" | Int32 => w "32" | Int64 => w "64" | Objptr => Label.fromString (concat [prefix, "Objptr"]) | Real32 => r "32" | Real64 => r "64" | Word8 => w "8" | Word16 => w "16" | Word32 => w "32" | Word64 => w "64") end in val local_base = make "local" val global_base = make "global" end val gcState_label = Label.fromString "gcState" local val static_labels = HashTable.new {hash=Hash.permute o Word.fromInt, equals=Int.equals} fun make i = Label.fromString ("static_" ^ Int.toString i) in fun static_label i = HashTable.lookupOrInsert (static_labels, i, fn () => make i) end structure Field = Runtime.GCField fun make' (offset: int, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, offset) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end fun make (f: Field.t, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, Bytes.toInt (Field.offset f)) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end val (_, gcState_exnStackContents, gcState_exnStackContentsOperand) = make (Field.ExnStack, wordSize, Classes.GCState) val (_, gcState_frontierContents, gcState_frontierContentsOperand) = make (Field.Frontier, pointerSize, Classes.GCStateHold) val (_, gcState_stackBottomContents, gcState_stackBottomContentsOperand) = make (Field.StackBottom, pointerSize, Classes.GCState) val (_, gcState_stackTopContents, gcState_stackTopContentsOperand) = make (Field.StackTop, pointerSize, Classes.GCStateHold) local val stackTopTemp = Immediate.label (Label.fromString "stackTopTemp") val stackTopTempContents = makeContents {base = stackTopTemp, size = wordSize, class = Classes.StaticTemp} val stackTopTempContentsOperand = Operand.memloc (stackTopTempContents) in val stackTopTempContents = fn () => stackTopTempContents val stackTopTempContentsOperand = fn () => stackTopTempContentsOperand end fun gcState_stackTopMinusWordDeref () = MemLoc.simple {base = gcState_stackTopContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun gcState_stackTopMinusWordDerefOperand () = Operand.memloc (gcState_stackTopMinusWordDeref ()) fun stackTopTempMinusWordDeref () = MemLoc.simple {base = stackTopTempContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun stackTopTempMinusWordDerefOperand () = Operand.memloc (stackTopTempMinusWordDeref ()) fun gcState_offset {offset, ty} = let val (_,_,operand) = make' (offset, Vector.sub(x86.Size.fromCType ty, 0), Classes.GCState) in operand () end (* init *) fun init () = let val _ = Classes.initClasses () in () end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-mlton-basic.sig000066400000000000000000000103461416264345000241550ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_MLTON_BASIC_STRUCTS = sig structure Machine: MACHINE structure x86: X86_PSEUDO sharing x86.CFunction = Machine.CFunction sharing x86.CType = Machine.CType sharing x86.Label = Machine.Label sharing x86.ProfileLabel = Machine.ProfileLabel sharing x86.RepType = Machine.Type sharing x86.Runtime = Machine.Runtime sharing x86.WordSize = Machine.WordSize sharing x86.WordX = Machine.WordX end signature X86_MLTON_BASIC = sig include X86_MLTON_BASIC_STRUCTS structure CFunction: C_FUNCTION structure CType: C_TYPE structure RepType: REP_TYPE sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing RepType = Machine.Type val init : unit -> unit (* * x86.Size.t equivalents *) val wordBytes : int val wordSize : x86.Size.t val wordScale : x86.Scale.t val pointerBytes : int val pointerSize : x86.Size.t (* * Memory classes *) structure Classes : sig val Heap : x86.MemLoc.Class.t val Stack : x86.MemLoc.Class.t val Locals : x86.MemLoc.Class.t val Globals : x86.MemLoc.Class.t val Temp : x86.MemLoc.Class.t val StaticTemp : x86.MemLoc.Class.t val CStack : x86.MemLoc.Class.t val Code : x86.MemLoc.Class.t val CStatic : x86.MemLoc.Class.t val StaticNonTemp : x86.MemLoc.Class.t val GCState : x86.MemLoc.Class.t val GCStateHold : x86.MemLoc.Class.t val GCStateVolatile : x86.MemLoc.Class.t val allClasses : x86.ClassSet.t ref val livenessClasses : x86.ClassSet.t ref val holdClasses : x86.ClassSet.t ref val volatileClasses : x86.ClassSet.t ref val runtimeClasses : x86.ClassSet.t ref val heapClasses : x86.ClassSet.t ref val cstaticClasses : x86.ClassSet.t ref end (* CStack locations *) val c_stackP : x86.Label.t val c_stackPContents : x86.MemLoc.t val c_stackPContentsOperand : x86.Operand.t val c_stackPDerefDoubleOperand : x86.Operand.t val c_stackPDerefFloatOperand : x86.Operand.t (* Global offset table (GOT) *) val globalOffsetTable : x86.Label.t val globalOffsetTableContents : x86.MemLoc.t (* Static temps defined in x86-main.h *) val applyFFTempFunContentsOperand : x86.Operand.t val applyFFTempArgContentsOperand : x86.Operand.t val overflowCheckTempContentsOperand : x86.Size.t -> x86.Operand.t val realTemp1ContentsOperand : x86.Size.t -> x86.Operand.t val realTemp2ContentsOperand : x86.Size.t -> x86.Operand.t val realTemp3ContentsOperand : x86.Size.t -> x86.Operand.t val fildTempContentsOperand : x86.Operand.t val fpswTempContentsOperand : x86.Operand.t val wordTemp1ContentsOperand : x86.Size.t -> x86.Operand.t (* Static arrays defined in main.h and x86-main.h *) val local_base : x86.CType.t -> x86.Label.t val global_base : x86.CType.t -> x86.Label.t (* Machine statics *) val static_label: int -> x86.Label.t (* gcState relative locations defined in gc.h *) val gcState_label: x86.Label.t val gcState_offset: {offset: int, ty: x86.CType.t} -> x86.Operand.t val gcState_exnStackContents: unit -> x86.MemLoc.t val gcState_exnStackContentsOperand: unit -> x86.Operand.t val gcState_frontierContents: unit -> x86.MemLoc.t val gcState_frontierContentsOperand: unit -> x86.Operand.t val gcState_stackBottomContents: unit -> x86.MemLoc.t val gcState_stackBottomContentsOperand: unit -> x86.Operand.t val gcState_stackTopContents: unit -> x86.MemLoc.t val gcState_stackTopContentsOperand: unit -> x86.Operand.t val gcState_stackTopMinusWordDeref: unit -> x86.MemLoc.t val gcState_stackTopMinusWordDerefOperand: unit -> x86.Operand.t val stackTopTempContentsOperand: unit -> x86.Operand.t val stackTopTempMinusWordDeref: unit -> x86.MemLoc.t val stackTopTempMinusWordDerefOperand: unit -> x86.Operand.t end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-mlton.fun000066400000000000000000002012531416264345000231030ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86MLton (S: X86_MLTON_STRUCTS): X86_MLTON = struct open S open x86MLtonBasic open x86 local open Machine in structure CFunction = CFunction structure RealSize = RealSize structure Prim = Prim structure WordSize = WordSize datatype z = datatype RealSize.t datatype z = datatype WordSize.prim end type transInfo = {addData : x86.Assembly.t list -> unit, live: x86.Label.t -> x86.Operand.t list, liveInfo: x86Liveness.LiveInfo.t} fun implementsPrim (p: 'a Prim.t) = let datatype z = datatype WordSize.prim fun w32168 s = case WordSize.prim s of W8 => true | W16 => true | W32 => true | W64 => false datatype z = datatype Prim.t in case p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | Real_Math_acos _ => true | Real_Math_asin _ => true | Real_Math_atan _ => true | Real_Math_atan2 _ => true | Real_Math_cos _ => true | Real_Math_exp _ => true | Real_Math_ln _ => true | Real_Math_log10 _ => true | Real_Math_sin _ => true | Real_Math_sqrt _ => true | Real_Math_tan _ => true | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => false (* !! *) | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => true | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_neg _ => true | Real_qequal _ => true | Real_rndToReal _ => true | Real_rndToWord (_, s2, {signed}) => signed andalso w32168 s2 | Real_round _ => true | Real_sub _ => true | Thread_returnToC => false | Word_add _ => true | Word_addCheckP _ => true | Word_andb _ => true | Word_castToReal _ => false (* !! *) | Word_equal s => w32168 s | Word_extdToWord (s1, s2, _) => w32168 s1 andalso w32168 s2 | Word_lshift s => w32168 s | Word_lt (s, _) => w32168 s | Word_mul (s, _) => w32168 s | Word_mulCheckP (s, _) => w32168 s | Word_neg _ => true | Word_negCheckP _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot (s, _) => w32168 s | Word_rem (s, _) => w32168 s | Word_rndToReal (s1, _, {signed}) => signed andalso w32168 s1 | Word_rol s => w32168 s | Word_ror s => w32168 s | Word_rshift (s, _) => w32168 s | Word_sub _ => true | Word_subCheckP _ => true | Word_xorb _ => true | _ => false end val implementsPrim: Machine.Type.t Prim.t -> bool = Trace.trace ("x86MLton.implementsPrim", Prim.layout, Bool.layout) implementsPrim fun prim {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, transInfo = {...} : transInfo} = let val primName = Prim.toString prim fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "x86MLton.prim: getDst1" fun getDst2 () = (Vector.sub (dsts, 0), Vector.sub (dsts, 1)) handle _ => Error.bug "x86MLton.prim: getDst2" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "x86MLton.prim: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "x86MLton.prim: getSrc2" fun getSrc4 () = (Vector.sub (args, 0), Vector.sub (args, 1), Vector.sub (args, 2), Vector.sub (args, 3)) handle _ => Error.bug "x86MLton.prim: getSrc4" fun mov () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: mov, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}], transfer = NONE}] end fun movx oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: movx, dstsize/srcsize", fn () => Size.lt(srcsize,dstsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = oper, dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun xvom () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: xvom, dstsize/srcsize", fn () => Size.lt(dstsize,srcsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_xvom {dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun binal oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun binalcc (oper, condition) = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("x86MLton.prim: binal, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun binal64 (oper1, oper2) = let val ((src1,src1size), (src2,src2size), (src3,src3size), (src4,src4size)) = getSrc4 () val ((dst1,dst1size), (dst2,dst2size)) = getDst2 () val _ = Assert.assert ("x86MLton.prim: binal64, dst1size/dst2size/src1size/src2size/src3size/src4size", fn () => src1size = dst1size andalso src3size = dst1size andalso src2size = dst2size andalso src4size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2,src3,src4], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 val tdst2 = if List.exists ([src3,src4], fn src => Operand.mayAlias (dst2, src)) then wordTemp1ContentsOperand dst2size else dst2 in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tdst1, src = src1, size = src1size}, Assembly.instruction_mov {dst = tdst2, src = src2, size = src2size}, Assembly.instruction_binal {oper = oper1, dst = tdst1, src = src3, size = dst1size}, Assembly.instruction_binal {oper = oper2, dst = tdst2, src = src4, size = dst2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_mov {dst = dst2, src = tdst2, size = dst2size}], transfer = NONE}] end fun binal64cc (oper1, oper2, condition) = let val ((src1,src1size), (src2,src2size), (src3,src3size), (src4,src4size)) = getSrc4 () val (dst,dstsize) = getDst1 () val tmp1 = overflowCheckTempContentsOperand src1size val tmp2 = wordTemp1ContentsOperand src2size val _ = Assert.assert ("x86MLton.prim: binal64cc, src1size/src2size/src3size/src4size", fn () => src1size = src3size andalso src2size = src4size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp1, src = src1, size = src1size}, Assembly.instruction_mov {dst = tmp2, src = src2, size = src2size}, Assembly.instruction_binal {oper = oper1, dst = tmp1, src = src3, size = src1size}, Assembly.instruction_binal {oper = oper2, dst = tmp2, src = src4, size = src2size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun pmd oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun pmdcc (oper, condition) = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("x86MLton.prim: pmdcc, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun imul2 () = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun imul2cc condition = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand src1size val _ = Assert.assert ("x86MLton.prim: imul2, src1size/src2size", fn () => src1size = src2size) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = tmp, src = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun neg64cc cond = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: neg64cc, src1size/src2size", fn () => src1size = src2size) val tmp1 = overflowCheckTempContentsOperand src1size val tmp2 = wordTemp1ContentsOperand src2size in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp1, src = Operand.immediate_zero, size = src1size}, Assembly.instruction_mov {dst = tmp2, src = Operand.immediate_zero, size = src2size}, Assembly.instruction_binal {oper = Instruction.SUB, dst = tmp1, src = src1, size = src1size}, Assembly.instruction_binal {oper = Instruction.SBB, dst = tmp2, src = src2, size = src2size}, Assembly.instruction_setcc {condition = cond, dst = dst, size = dstsize}], transfer = NONE}] end fun unal oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun unalcc (oper, condition) = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val tmp = overflowCheckTempContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tmp, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = tmp, size = srcsize}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun unal64 (oper, mk) = let val ((src1,src1size),(src2,src2size)) = getSrc2 () val ((dst1,dst1size),(dst2,dst2size)) = getDst2 () val _ = Assert.assert ("x86MLton.prim: unal64, dst1size/dst2size/src1size/src2size", fn () => src1size = dst1size andalso src2size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tdst1, src = src1, size = src1size}, Assembly.instruction_mov {dst = dst2, src = src2, size = src2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_unal {oper = oper, dst = dst1, size = dst1size}] @ (mk (dst2,dst2size)) @ [Assembly.instruction_unal {oper = oper, dst = dst2, size = dst2size}], transfer = NONE}] end fun sral oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: sral, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("x86MLton.prim: sral, src2size", fn () => src2size = wordSize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_sral {oper = oper, dst = dst, count = src2, size = dstsize}], transfer = NONE}] end fun cmp condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in (* Can't have an immediate in src1 position, * so reverse the srcs and reverse the condition. * * This won't fix an immediate in both positions. * Either constant folding eliminated it * or the register allocator will raise an error. *) case Operand.deImmediate src1 of SOME _ => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.condition_reverse condition, dst = dst, size = dstsize}], transfer = NONE}] | NONE => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun fbina oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: fbina, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries. *) val (oper,src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (Instruction.fbina_reverse oper,src2,src1) else (oper,src1,src2) | _ => (oper,src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pfbina {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun funa oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: funa, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfuna {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun flogarithm oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: flogarithm, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfldc {oper = oper, dst = dst, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FYL2X, src = src, dst = dst, size = dstsize}], transfer = NONE}] end val (comment_begin, comment_end) = if !Control.codegenComments > 0 then let val comment = primName in (AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("begin prim: " ^ comment)], transfer = NONE}), AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("end prim: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun bitop (size, i) = case WordSize.prim size of W8 => binal i | W16 => binal i | W32 => binal i | W64 => binal64 (i, i) fun compare (size, {signed}, s, u) = let val f = if signed then s else u in case WordSize.prim size of W8 => cmp f | W16 => cmp f | W32 => cmp f | W64 => Error.bug "x86MLton.prim: compare, W64" end fun shift (size, i) = case WordSize.prim size of W8 => sral i | W16 => sral i | W32 => sral i | W64 => Error.bug "x86MLton.prim: shift, W64" fun flag {signed} = if signed then x86.Instruction.O else x86.Instruction.C datatype z = datatype Prim.t in AppendList.appends [comment_begin, (case prim of CPointer_add => binal Instruction.ADD | CPointer_diff => binal Instruction.SUB | CPointer_equal => cmp Instruction.E | CPointer_fromWord => mov () | CPointer_lt => cmp Instruction.B | CPointer_sub => binal Instruction.SUB | CPointer_toWord => mov () | Real_Math_acos _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_acos, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize val realTemp3ContentsOperand = realTemp3ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = realTemp1ContentsOperand, src = src, size = srcsize}, Assembly.instruction_pfmov {dst = realTemp2ContentsOperand, src = realTemp1ContentsOperand, size = srcsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, dst = realTemp2ContentsOperand, src = realTemp2ContentsOperand, size = srcsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp3ContentsOperand, size = srcsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, dst = realTemp3ContentsOperand, src = realTemp2ContentsOperand, size = srcsize}, Assembly.instruction_pfuna {oper = Instruction.FSQRT, dst = realTemp3ContentsOperand, size = srcsize}, Assembly.instruction_pfmov {dst = dst, src = realTemp3ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_asin _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_asin, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfmov {dst = realTemp1ContentsOperand, src = dst, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, dst = realTemp1ContentsOperand, src = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, dst = realTemp2ContentsOperand, src = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.FSQRT, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp2ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_atan _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_atan, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_atan2 _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_Math_atan2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = src2, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_cos _ => funa Instruction.FCOS | Real_Math_exp _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_exp, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfldc {oper = Instruction.L2E, dst = dst, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, src = src, dst = dst, size = dstsize}, Assembly.instruction_pfmov {src = dst, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.FRNDINT, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, src = realTemp1ContentsOperand, dst = dst, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.F2XM1, dst = dst, size = dstsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FADD, src = realTemp2ContentsOperand, dst = dst, size = dstsize}, Assembly.instruction_pfbinas {oper = Instruction.FSCALE, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_ln _ => flogarithm Instruction.LN2 | Real_Math_log10 _ => flogarithm Instruction.LG2 | Real_Math_sin _ => funa Instruction.FSIN | Real_Math_sqrt _ => funa Instruction.FSQRT | Real_Math_tan _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_tan, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {src = src, dst = dst, size = dstsize}, Assembly.instruction_pfptan {dst = dst, size = dstsize}], transfer = NONE}] end | Real_mul _ => fbina Instruction.FMUL | Real_add _ => fbina Instruction.FADD | Real_sub _ => fbina Instruction.FSUB | Real_div _ => fbina Instruction.FDIV | Real_lt _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_lt, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfcom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4500, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}], transfer = NONE}] end | Real_le _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_le, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfcom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x500, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}], transfer = NONE}] end | Real_equal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfucom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_binal {oper = Instruction.AND, dst = fpswTempContentsOperand, src = Operand.immediate_int' (0x4500, WordSize.word16), size = Size.WORD}, Assembly.instruction_cmp {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4000, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.E, dst = dst, size = dstsize}], transfer = NONE}] end | Real_qequal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_qequal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfucom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4400, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.NE, dst = dst, size = dstsize}], transfer = NONE}] end | Real_abs _ => funa Instruction.FABS | Real_rndToReal (s, s') => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () fun mov () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}], transfer = NONE}] fun movx () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovx {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] fun xvom () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfxvom {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] in case (s, s') of (R64, R64) => mov () | (R64, R32) => xvom () | (R32, R64) => movx () | (R32, R32) => mov () end | Real_rndToWord (s, s', _) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovti {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fildTempContentsOperand, Size.WORD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovti {dst = tmp, src = src, srcsize = srcsize, dstsize = tmpsize}, Assembly.instruction_xvom {src = tmp, dst = dst, dstsize = dstsize, srcsize = tmpsize}], transfer = NONE}] end in case (s, WordSize.prim s') of (R64, W64) => Error.bug "x86MLton.prim: Real_toWord, W64" | (R64, W32) => default () | (R64, W16) => default () | (R64, W8) => default' () | (R32, W64) => Error.bug "x86MLton.prim: Real_toWord, W64" | (R32, W32) => default () | (R32, W16) => default () | (R32, W8) => default' () end | Real_ldexp _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_ldexp, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("x86MLton.prim: Real_ldexp, src2size", fn () => src2size = Size.LONG) val realTemp1ContentsOperand = realTemp1ContentsOperand src1size in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovfi {dst = realTemp1ContentsOperand, src = src2, srcsize = src2size, dstsize = dstsize}, Assembly.instruction_pfmov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_pfbinas {oper = Instruction.FSCALE, dst = dst, src = realTemp1ContentsOperand, size = dstsize}], transfer = NONE}] end | Real_neg _ => funa Instruction.FCHS | Real_round _ => funa Instruction.FRNDINT | Word_add s => (case WordSize.prim s of W8 => binal Instruction.ADD | W16 => binal Instruction.ADD | W32 => binal Instruction.ADD | W64 => binal64 (Instruction.ADD, Instruction.ADC)) | Word_addCheckP (s, sg) => let val cond = flag sg in case WordSize.prim s of W8 => binalcc (Instruction.ADD, cond) | W16 => binalcc (Instruction.ADD, cond) | W32 => binalcc (Instruction.ADD, cond) | W64 => binal64cc (Instruction.ADD, Instruction.ADC, cond) end | Word_andb s => bitop (s, Instruction.AND) | Word_equal _ => cmp Instruction.E | Word_lshift s => shift (s, Instruction.SHL) | Word_lt (s, sg) => compare (s, sg, Instruction.L, Instruction.B) | Word_mul (s, {signed}) => (case WordSize.prim s of W8 => pmd (if signed then Instruction.IMUL else Instruction.MUL) | W16 => imul2 () | W32 => imul2 () | W64 => Error.bug "x86MLton.prim: Word_mul, W64") | Word_mulCheckP (s, {signed}) => if signed then (case WordSize.prim s of W8 => pmdcc (x86.Instruction.IMUL, x86.Instruction.O) | W16 => imul2cc x86.Instruction.O | W32 => imul2cc x86.Instruction.O | W64 => Error.bug "x86MLton.arith: Word_mulCheckP, W64") else (case WordSize.prim s of W8 => pmdcc (x86.Instruction.MUL, x86.Instruction.C) | W16 => pmdcc (x86.Instruction.MUL, x86.Instruction.C) | W32 => pmdcc (x86.Instruction.MUL, x86.Instruction.C) | W64 => Error.bug "x86MLton.arith: Word_mulCheckP, W64") | Word_neg s => (case WordSize.prim s of W8 => unal Instruction.NEG | W16 => unal Instruction.NEG | W32 => unal Instruction.NEG | W64 => unal64 (Instruction.NEG, fn (dst,dstsize) => [Assembly.instruction_binal {dst = dst, oper = Instruction.ADC, src = Operand.immediate_zero, size = dstsize}])) | Word_negCheckP (s, sg) => let val cond = flag sg in case WordSize.prim s of W8 => unalcc (Instruction.NEG, cond) | W16 => unalcc (Instruction.NEG, cond) | W32 => unalcc (Instruction.NEG, cond) | W64 => neg64cc cond end | Word_notb s => (case WordSize.prim s of W8 => unal Instruction.NOT | W16 => unal Instruction.NOT | W32 => unal Instruction.NOT | W64 => unal64 (Instruction.NOT, fn _ => [])) | Word_orb s => bitop (s, Instruction.OR) | Word_quot (_, {signed}) => pmd (if signed then Instruction.IDIV else Instruction.DIV) | Word_rem (_, {signed}) => pmd (if signed then Instruction.IMOD else Instruction.MOD) | Word_rol s => shift (s, Instruction.ROL) | Word_ror s => shift (s, Instruction.ROR) | Word_rshift (s, {signed}) => shift (s, if signed then Instruction.SAR else Instruction.SHR) | Word_sub s => (case WordSize.prim s of W8 => binal Instruction.SUB | W16 => binal Instruction.SUB | W32 => binal Instruction.SUB | W64 => binal64 (Instruction.SUB, Instruction.SBB)) | Word_subCheckP (s, sg) => let val cond = flag sg in case WordSize.prim s of W8 => binalcc (Instruction.SUB, cond) | W16 => binalcc (Instruction.SUB, cond) | W32 => binalcc (Instruction.SUB, cond) | W64 => binal64cc (Instruction.SUB, Instruction.SBB, cond) end | Word_rndToReal (s, s', _) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovfi {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fildTempContentsOperand, Size.WORD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = Instruction.MOVSX, src = src, dst = tmp, dstsize = tmpsize, srcsize = srcsize}, Assembly.instruction_pfmovfi {src = tmp, dst = dst, srcsize = tmpsize, dstsize = dstsize}], transfer = NONE}] end in case (WordSize.prim s, s') of (W32, R64) => default () | (W32, R32) => default () | (W16, R64) => default () | (W16, R32) => default () | (W8, R64) => default' () | (W8, R32) => default' () | _ => Error.bug "x86MLton.prim: Word_toReal, W64" end | Word_extdToWord (s, s', {signed}) => let val b = WordSize.bits s val b' = WordSize.bits s' in if Bits.< (b, b') then movx (if signed then Instruction.MOVSX else Instruction.MOVZX) else if Bits.equals (b, b') then mov () else xvom () end | Word_xorb s => bitop (s, Instruction.XOR) | _ => Error.bug ("x86MLton.prim: strange Prim.Name.t: " ^ primName)), comment_end] end fun ccall {args: (x86.Operand.t * x86.Size.t) vector, func, return: {return: x86.Label.t, size: int option} option, transInfo = {...}: transInfo} = let val CFunction.T {convention, target, ...} = func val comment_begin = if !Control.codegenComments > 0 then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin ccall: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [comment_begin, AppendList.single (Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (Transfer.ccall {args = Vector.toList args, func = func, return = return})})] end fun creturn {dsts: (x86.Operand.t * x86.Size.t) vector, frameInfo: x86.FrameInfo.t option, func: RepType.t CFunction.t, label: x86.Label.t, transInfo = {live, liveInfo, ...}: transInfo} = let val CFunction.T {convention, target, ...} = func fun default () = let val _ = x86Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label) in AppendList.single (x86.Block.mkBlock' {entry = SOME (Entry.creturn {dsts = dsts, frameInfo = frameInfo, func = func, label = label}), statements = [], transfer = NONE}) end val comment_end = if !Control.codegenComments > 0 then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin creturn: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [default (), comment_end] end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-mlton.sig000066400000000000000000000033701416264345000230750ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_MLTON_STRUCTS = sig structure x86MLtonBasic : X86_MLTON_BASIC structure x86Liveness : X86_LIVENESS sharing x86MLtonBasic.x86 = x86Liveness.x86 end signature X86_MLTON = sig include X86_MLTON_STRUCTS include X86_MLTON_BASIC sharing x86 = x86MLtonBasic.x86 sharing x86 = x86Liveness.x86 sharing x86.Label = Machine.Label sharing Machine = x86MLtonBasic.Machine type transInfo = {addData : x86.Assembly.t list -> unit, live: x86.Label.t -> x86.Operand.t list, liveInfo: x86Liveness.LiveInfo.t} (* c call, and primitive assembly sequences. *) val ccall: {args: (x86.Operand.t * x86.Size.t) vector, func: RepType.t Machine.CFunction.t, return: {return: x86.Label.t, size: int option} option, transInfo: transInfo} -> x86.Block.t' AppendList.t val creturn: {dsts: (x86.Operand.t * x86.Size.t) vector, frameInfo: x86.FrameInfo.t option, func: RepType.t Machine.CFunction.t, label: x86.Label.t, transInfo: transInfo} -> x86.Block.t' AppendList.t val implementsPrim: RepType.t Machine.Prim.t -> bool val prim: {prim: RepType.t Machine.Prim.t, args: (x86.Operand.t * x86.Size.t) vector, dsts: (x86.Operand.t * x86.Size.t) vector, transInfo: transInfo} -> x86.Block.t' AppendList.t end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-pseudo.sig000066400000000000000000000436371416264345000232550ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_PSEUDO = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool end structure Immediate : sig type t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t end structure Scale : sig datatype t = One | Two | Four | Eight val fromBytes : int -> t val fromCType : CType.t -> t end structure MemLoc : sig structure Class : sig type t val new : {name: string} -> t val Temp : t val StaticTemp : t val CStack : t val Code : t val eq : t * t -> bool end type t val layout : t -> Layout.t val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val class : t -> Class.t val compare : t * t -> order (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig type t val layout : t -> Layout.t val toString : t -> string val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_reverse : fbina -> fbina (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) type t end structure PseudoOp : sig type t val toString : t -> string val data : unit -> t val text : unit -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t end structure Assembly : sig type t val toString : t -> string val comment : string -> t val isComment : t -> bool val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_non_lazy_symbol_pointer : unit -> t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_global: Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmovx : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfxvom : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfldc : {oper: Instruction.fldc, dst: Operand.t, size: Size.t} -> t val instruction_pfmovfi : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfmovti : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfcom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfucom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfuna : {oper: Instruction.funa, dst: Operand.t, size: Size.t} -> t val instruction_pfptan : {dst: Operand.t, size: Size.t} -> t val instruction_pfbinas : {oper: Instruction.fbinas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfbinasp : {oper: Instruction.fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_fldcw : {src: Operand.t} -> t val instruction_fstcw : {dst: Operand.t, check: bool} -> t val instruction_fstsw : {dst: Operand.t, check: bool} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameInfosIndex: int} end structure Entry: sig type t val cont: {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func: {label: Label.t, live: MemLocSet.t} -> t val handler: {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val jump: {label: Label.t} -> t val label: t -> Label.t end structure Transfer : sig structure Cases : sig type 'a t val word : (WordX.t * 'a) list -> 'a t end type t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall : {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} -> t end structure ProfileLabel : sig type t end structure Block : sig type t' val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit type t val printBlock : t -> unit val compress: t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end functor x86PseudoCheck(structure S : X86) : X86_PSEUDO = S mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-simplify.fun000066400000000000000000006307331416264345000236170ustar00rootroot00000000000000(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86Simplify(S: X86_SIMPLIFY_STRUCTS): X86_SIMPLIFY = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop structure PeepholeBlock = struct structure Peephole = Peephole(type entry_type = Entry.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t type transfer_type = Transfer.t datatype block = datatype Block.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn Assembly.Comment _ => true | _ => false local val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionBinALMD : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.pMD _) => true | Assembly.Instruction (Instruction.IMUL2 _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionBinALMD], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: elimBinALMDDouble" val (callback,elimBinALMDDouble_msg) = make_callback_msg "elimBinALMDDouble" in val elimBinALMDDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimBinALMDDouble_msg = elimBinALMDDouble_msg end local val isInstructionFMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.pFMOV _) => true | _ => false val isInstructionFBinA : statement_type -> bool = fn Assembly.Instruction (Instruction.pFBinA _) => true | Assembly.Instruction (Instruction.pFBinAS _) => true | Assembly.Instruction (Instruction.pFBinASP _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV, All isComment, One isInstructionFBinA], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinA {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbina {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinAS {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbinas {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinASP {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbinasp {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: elimFltBinADouble" val (callback,elimFltBinADouble_msg) = make_callback_msg "elimFltBinADouble" in val elimFltBinADouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltBinADouble_msg = elimFltBinADouble_msg end local val isInstructionMOV_srcImmediate : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV {src = Operand.Immediate _, ...}) => true | _ => false val isInstructionBinALMD_operCommute : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src, dst, ...}) => ((oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.pMD {oper, src, dst, ...}) => ((oper = Instruction.IMUL) orelse (oper = Instruction.MUL)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.IMUL2 {src, dst, ...}) => (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_srcImmediate, All isComment, One isInstructionBinALMD_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val getImmediate1 = fn Immediate.Word w => if WordX.isOne w then SOME false else if WordX.isNegOne w then SOME true else NONE | _ => NONE val isInstructionADDorSUB_srcImmediate1 : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.ADD => true | Instruction.SUB => true | _ => false) andalso isSome (getImmediate1 (Immediate.destruct immediate)) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionADDorSUB_srcImmediate1], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, dst, size})]], finish, transfer} => if (case List.fold (finish, (false, false), fn (asm, (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.MOV _) => (b, b') | Assembly.Instruction (Instruction.SETcc {condition = Instruction.C, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.NC, ...}) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case transfer of Transfer.Iff {condition = Instruction.C, ...} => true | Transfer.Iff {condition = Instruction.NC, ...} => true | _ => false) | _ => false) then NONE else let val oper = case (oper, getImmediate1 (Immediate.destruct immediate)) of (Instruction.ADD, SOME false) => Instruction.INC | (Instruction.ADD, SOME true ) => Instruction.DEC | (Instruction.SUB, SOME false) => Instruction.DEC | (Instruction.SUB, SOME true ) => Instruction.INC | _ => Error.bug "x86Simplify.PeeholeBlock: elimAddSub1:oper" val statements = (Assembly.instruction_unal {oper = oper, dst = dst, size = size}):: finish val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimAddSub1" val (callback,elimAddSub1_msg) = make_callback_msg "elimAddSub1" in val elimAddSub1: optimization = {template = template, rewriter = rewriter, callback = callback} val elimAddSub1_msg = elimAddSub1_msg end local val rec log2' = fn (w : WordX.t, i : int) => if WordX.isZero w then NONE else if WordX.isOne (WordX.andb (w, WordX.one (WordX.size w))) then if WordX.isOne w then SOME (i, false) else if WordX.isNegOne w then SOME (i, true) else NONE else log2' (WordX.rshift (w, WordX.one (WordX.size w), {signed = true}), i + 1) fun log2 w = log2' (w, 0 : int) fun divTemp size = MemLoc.imm {base = Immediate.label (Label.fromString "divTemp"), index = Immediate.zero, scale = Scale.Four, size = size, class = MemLoc.Class.Temp} val isImmediatePow2 = fn Immediate.Word w => isSome (log2 w) | _ => false val getImmediateLog2 = fn Immediate.Word w => log2 w | _ => NONE val isInstructionMULorDIV_srcImmediatePow2 : statement_type -> bool = fn Assembly.Instruction (Instruction.pMD {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.IMUL => true | Instruction.MUL => true | Instruction.IDIV => true | Instruction.DIV => true | _ => false) andalso isImmediatePow2 (Immediate.destruct immediate) | Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, ...}) => isImmediatePow2 (Immediate.destruct immediate) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMULorDIV_srcImmediatePow2, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.MUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IDIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val divTemp = Operand.MemLoc (divTemp size) val width = 8 * Size.toBytes size val statements = ((fn l => (Assembly.instruction_mov {src = dst, dst = divTemp, size = size}):: l) o (fn l => if i > 1 then (Assembly.instruction_sral {oper = Instruction.SAR, dst = divTemp, count = Operand.immediate_int (i - 1), size = size}):: l else l) o (fn l => if i < width then (Assembly.instruction_sral {oper = Instruction.SHR, dst = divTemp, count = Operand.immediate_int (width - i), size = size}):: l else l) o (fn l => (Assembly.instruction_binal {oper = Instruction.ADD, src = divTemp, dst = dst, size = size}):: (Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int i, dst = dst, size = size}):: l) o (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.DIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SHR, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2" val (callback,elimMDPow2_msg) = make_callback_msg "elimMDPow2" in val elimMDPow2 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimMDPow2_msg = elimMDPow2_msg end local val isInstructionCMPorTEST : statement_type -> bool = fn Assembly.Instruction (Instruction.CMP _) => true | Assembly.Instruction (Instruction.TEST _) => true | _ => false val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionSETcc : statement_type -> bool = fn Assembly.Instruction (Instruction.SETcc _) => true | _ => false val isInstruction : statement_type -> bool = fn Assembly.Instruction _ => true | _ => false val isTransfer_Iff : transfer_type -> bool = fn Transfer.Iff _ => true | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMPorTEST, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction _], comments], finish, transfer} => let val rec scan = fn [] => not (isTransfer_Iff transfer) | asm::statements => if isComment asm orelse isInstructionMOV asm then scan statements else if isInstructionSETcc asm then false else if isInstruction asm then true else false in if scan finish then let val statements = List.fold(start, List.concat [comments, finish], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMPTEST" val (callback,elimCMPTEST_msg) = make_callback_msg "elimCMPTEST" in val elimCMPTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMPTEST_msg = elimCMPTEST_msg end local val isInstructionCMP_srcImmediate0 = fn Assembly.Instruction (Instruction.CMP {src1 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | Assembly.Instruction (Instruction.CMP {src2 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | _ => false val isTransfer_Iff_E_NE = fn Transfer.Iff {condition, ...} => condition = Instruction.E orelse condition = Instruction.NE | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMP_srcImmediate0, All isComment], finish = Empty, transfer = isTransfer_Iff_E_NE} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.CMP {src1, src2, size})], comments], finish = [], transfer = Transfer.Iff {condition, truee, falsee}} => let val condition = case condition of Instruction.E => Instruction.Z | Instruction.NE => Instruction.NZ | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0:condition" val src = case (Operand.deImmediate src1, Operand.deImmediate src2) of (SOME _, NONE) => src2 | (NONE, SOME _) => src1 | (SOME immediate1, SOME _) => if Immediate.isZero immediate1 then src2 else src1 | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0:src" val statements = List.fold(start, (Assembly.instruction_test {src1 = src, src2 = src, size = size}):: comments, op ::) val transfer = Transfer.Iff {condition = condition, truee = truee, falsee = falsee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0" val (callback,elimCMP0_msg) = make_callback_msg "elimCMP0" in val elimCMP0 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMP0_msg = elimCMP0_msg end local val isInstructionAL_setZF = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.UnAL {oper, ...}) => (case oper of Instruction.NOT => false | _ => true) | Assembly.Instruction (Instruction.SRAL {oper, ...}) => (case oper of Instruction.ROL => false | Instruction.RCL => false | Instruction.ROR => false | Instruction.RCR => false | _ => true) | _ => false val isInstructionTEST_eqSrcs = fn Assembly.Instruction (Instruction.TEST {src1, src2, ...}) => Operand.eq(src1, src2) | _ => false val isTransfer_Iff_Z_NZ = fn Transfer.Iff {condition, ...} => condition = Instruction.Z orelse condition = Instruction.NZ | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionAL_setZF, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isTransfer_Iff_Z_NZ} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction instruction], comments1, [Assembly.Instruction (Instruction.TEST {src1, ...})], comments2], finish = [], transfer as Transfer.Iff {...}} => let val dst = case instruction of Instruction.BinAL {dst, ...} => dst | Instruction.UnAL {dst, ...} => dst | Instruction.SRAL {dst, ...} => dst | _ => Error.bug "x86Simplify.PeeholeBlock: elimALTEST:dst" in if Operand.eq(dst,src1) then let val statements = List.fold (start, (Assembly.instruction instruction):: (List.concat [comments1, comments2]), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "x86Simplify.PeeholeBlock: elimALTEST" val (callback,elimALTEST_msg) = make_callback_msg "elimALTEST" in val elimALTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALTEST_msg = elimALTEST_msg end local val optimizations_pre = commuteBinALMD:: (* elimBinAL0L:: *) (* elimBinAL0R:: *) elimAddSub1:: (* elimMDPow2:: *) elimCMPTEST:: nil val optimizations_pre_msg = commuteBinALMD_msg:: (* elimBinAL0L_msg:: *) (* elimBinAL0R_msg:: *) elimAddSub1_msg:: (* elimMDPow2_msg:: *) nil val optimizations_post = elimMDPow2:: elimBinALMDDouble:: elimFltBinADouble:: elimCMPTEST:: elimCMP0:: elimALTEST:: nil val optimizations_post_msg = elimMDPow2_msg:: elimBinALMDDouble_msg:: elimFltBinADouble_msg:: elimCMPTEST_msg:: elimCMP0_msg:: elimALTEST_msg:: nil in val peepholeBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeBlock_pre, peepholeBlock_pre_msg) = tracer "peepholeBlock_pre" peepholeBlock_pre val peepholeBlock_pre_msg = fn () => (peepholeBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeBlock_post = fn block => (peepholeBlock {optimizations = optimizations_post, block = block}) val (peepholeBlock_post, peepholeBlock_post_msg) = tracer "peepholeBlock_post" peepholeBlock_post val peepholeBlock_post_msg = fn () => (peepholeBlock_post_msg (); Control.indent (); List.foreach(optimizations_post_msg, fn msg => msg ()); Control.unindent ()) end val (callback_elimIff,elimIff_msg) = make_callback_msg "elimIff" fun makeElimIff {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferIff_eqTargets = fn Transfer.Iff {truee, falsee, ...} => Label.equals(truee, falsee) | _ => false val template = {start = EmptyOrNonEmpty, statements = [], finish = Empty, transfer = isTransferIff_eqTargets} val rewriter = fn {entry, profileLabel, start, statements = [], finish = [], transfer = Transfer.Iff {truee, falsee, ...}} => let val _ = x86JumpInfo.decNear(jumpInfo, falsee) val statements = List.fold(start, [], op ::) val transfer = Transfer.goto {target = truee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimIff" in {template = template, rewriter = rewriter, callback = callback_elimIff} end val (callback_elimSwitchTest,elimSwitchTest_msg) = make_callback_msg "elimSwitchTest" fun makeElimSwitchTest {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferSwitch_testImmediateEval = fn Transfer.Switch {test = Operand.Immediate immediate, ...} => isSome (Immediate.eval immediate) | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_testImmediateEval} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test = Operand.Immediate immediate, cases, default}} => let val statements = statements' val test = valOf (Immediate.eval immediate) val cases = Transfer.Cases.keepAll (cases, fn (w,target) => (x86JumpInfo.decNear(jumpInfo, target); WordX.equals (w, test))) val transfer = if Transfer.Cases.isEmpty cases then Transfer.goto {target = default} else if Transfer.Cases.isSingle cases then let val _ = x86JumpInfo.decNear (jumpInfo, default) val target = Transfer.Cases.extract (cases, #2) val _ = x86JumpInfo.incNear (jumpInfo, target) in Transfer.goto {target = target} end else Error.bug "x86Simplify.PeeholeBlock: elimSwitchTest:transfer" in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSwitchTest" in {template = template, rewriter = rewriter, callback = callback_elimSwitchTest} end val (callback_elimSwitchCases,elimSwitchCases_msg) = make_callback_msg "elimSwitchCases" fun makeElimSwitchCases {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferSwitch_casesDefault = fn Transfer.Switch {cases, default, ...} => let val n = Transfer.Cases.count (cases, fn target => Label.equals(target, default)) in n > 0 end | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_casesDefault} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test, cases, default}} => let val statements = statements' val cases = Transfer.Cases.keepAll (cases, fn (_,target) => if Label.equals(target, default) then (x86JumpInfo.decNear (jumpInfo, target); false) else true) val (statements, transfer) = if Transfer.Cases.isEmpty cases then (statements, Transfer.goto {target = default}) else if Transfer.Cases.isSingle cases then let val (k,target) = Transfer.Cases.extract (cases, fn (w,target) => (Immediate.word w, target)) val size = case Operand.size test of SOME size => size | NONE => Size.LONG in (List.concat [statements, [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate k, size = size}]], Transfer.iff {condition = Instruction.E, truee = target, falsee = default}) end else (statements, Transfer.switch {test = test, cases = cases, default = default}) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSwitchCases" in {template = template, rewriter = rewriter, callback = callback_elimSwitchCases} end end structure ElimGoto = struct fun elimSimpleGoto {chunk = Chunk.T {data, blocks, ...}, delProfileLabel : x86.ProfileLabel.t -> unit, jumpInfo : x86JumpInfo.t} = let val {get: Label.t -> Label.t option, set: Label.t * Label.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val changed = ref false val labels = List.keepAllMap (blocks, fn Block.T {entry = Entry.Jump {label}, profileLabel, statements, transfer = Transfer.Goto {target}} => if List.forall(statements, fn Assembly.Comment _ => true | _ => false) (* andalso not (Label.equals(label, target)) *) then (Option.app(profileLabel, delProfileLabel); set(label, SOME target); SOME label) else NONE | _ => NONE) fun loop () = if List.fold(labels, false, fn (label,b) => case get label of NONE => b | SOME target => (case get target of NONE => b | SOME target' => if Label.equals(label, target') then (set(label, NONE); b) else (set(label, SOME target'); true))) then loop () else () val _ = loop () fun update target = case get target of SOME target' => (changed := true; x86JumpInfo.decNear(jumpInfo, target); x86JumpInfo.incNear(jumpInfo, target'); target') | NONE => target val elimSimpleGoto' = fn Transfer.Goto {target} => Transfer.Goto {target = update target} | Transfer.Iff {condition, truee, falsee} => Transfer.Iff {condition = condition, truee = update truee, falsee = update falsee} | Transfer.Switch {test, cases, default} => Transfer.Switch {test = test, cases = Transfer.Cases.map (cases, update o #2), default = update default} | transfer => transfer val blocks = List.map (blocks, fn Block.T {entry, profileLabel, statements, transfer} => Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = elimSimpleGoto' transfer}) val blocks = List.removeAll (blocks, fn Block.T {entry,...} => (case get (Entry.label entry) of SOME label' => (changed := true; x86JumpInfo.decNear(jumpInfo, label'); true) | NONE => false)) val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimSimpleGoto,elimSimpleGoto_msg) = tracer "elimSimpleGoto" elimSimpleGoto fun elimComplexGoto {chunk = Chunk.T {data, blocks, ...}, jumpInfo : x86JumpInfo.t} = let datatype z = datatype x86JumpInfo.status val {get: Label.t -> Block.t option, set: Label.t * Block.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val labels = List.keepAllMap (blocks, fn block as Block.T {entry = Entry.Jump {label},...} => if x86JumpInfo.getNear(jumpInfo, label) = Count 1 then (set(label, SOME block); SOME label) else NONE | _ => NONE) fun loop () = if List.fold (labels, false, fn (label,b) => case get label of SOME (Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}}) => (if Label.equals(label,target) then b else (case get target of NONE => b | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => (set(label, SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.Label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'})); true))) | _ => b) then loop () else () val _ = loop () val changed = ref false val elimComplexGoto' = fn block as Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}} => if Label.equals(Entry.label entry,target) then block else (case get target of NONE => block | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => let val _ = changed := true val _ = x86JumpInfo.decNear (jumpInfo, Entry.label entry') val _ = List.foreach (Transfer.nearTargets transfer', fn target => x86JumpInfo.incNear (jumpInfo, target)) val block = Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'} in block end) | block => block val blocks = List.map(blocks, elimComplexGoto') val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimComplexGoto, elimComplexGoto_msg) = tracer "elimComplexGoto" elimComplexGoto fun elimBlocks {chunk = Chunk.T {data, blocks, ...}, jumpInfo : x86JumpInfo.t} = let val {get = getIsBlock, set = setIsBlock, destroy = destroyIsBlock} = Property.destGetSetOnce (Label.plist, Property.initConst false) val {get: Label.t -> {block: Block.t, reach: bool ref}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, ...}, (labels, funcs)) => let val label = Entry.label entry in setIsBlock(label, true); set(label, {block = block, reach = ref false}) ; case entry of Entry.Func _ => (label::labels, label::funcs) | _ => (label::labels, funcs) end) fun loop label = let val {block = Block.T {transfer, ...}, reach} = get label in if !reach then () else (reach := true ; List.foreach (Transfer.nearTargets transfer, loop)) end val _ = List.foreach (funcs, loop) fun check oper = case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => if getIsBlock label then ! (#reach (get label)) else true | NONE => true) | (_, SOME label) => if getIsBlock label then ! (#reach (get label)) else true | _ => true val changed = ref false val blocks = List.keepAllMap (labels, fn label => let val {block = Block.T {entry, profileLabel, statements, transfer}, reach} = get label in if !reach then SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.keepAll (statements, fn Assembly.Instruction i => (case #srcs (Instruction.srcs_dsts i) of NONE => true | SOME srcs => List.forall(srcs, check)) | _ => true), transfer = transfer}) else (changed := true ; List.foreach (Transfer.nearTargets transfer, fn label => x86JumpInfo.decNear (jumpInfo, label)); NONE) end) val _ = destroy () val _ = destroyIsBlock () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimBlocks, elimBlocks_msg) = tracer "elimBlocks" elimBlocks fun elimGoto {chunk : Chunk.t, delProfileLabel: x86.ProfileLabel.t -> unit, jumpInfo : x86JumpInfo.t} = let val elimIff = PeepholeBlock.makeElimIff {jumpInfo = jumpInfo} val elimSwitchTest = PeepholeBlock.makeElimSwitchTest {jumpInfo = jumpInfo} val elimSwitchCases = PeepholeBlock.makeElimSwitchCases {jumpInfo = jumpInfo} fun loop {chunk, changed} = let val {chunk, changed = changed_elimSimpleGoto} = elimSimpleGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val Chunk.T {data, blocks, ...} = chunk val {blocks, changed = changed_peepholeBlocks} = PeepholeBlock.peepholeBlocks {blocks = blocks, optimizations = [elimIff, elimSwitchTest, elimSwitchCases]} val chunk = Chunk.T {data = data, blocks = blocks} in if changed_elimSimpleGoto orelse changed_peepholeBlocks then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed = changed_loop} = loop {chunk = chunk, changed = false} val {chunk, changed = changed_elimComplexGoto} = elimComplexGoto {chunk = chunk, jumpInfo = jumpInfo} val {chunk, changed = changed_elimBlocks} = elimBlocks {chunk = chunk, jumpInfo = jumpInfo} in {chunk = chunk, changed = changed_loop orelse changed_elimComplexGoto orelse changed_elimBlocks} end val (elimGoto, elimGoto_msg) = tracer "elimGoto" elimGoto val elimGoto_msg = fn () => (elimGoto_msg (); Control.indent (); PeepholeBlock.elimIff_msg (); PeepholeBlock.elimSwitchTest_msg (); PeepholeBlock.elimSwitchCases_msg (); elimSimpleGoto_msg (); elimComplexGoto_msg (); elimBlocks_msg (); Control.unindent ()) end structure MoveHoistLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock fun moveHoist {block = LivenessBlock.T {entry, profileLabel, statements, transfer}} = let val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val {statements, changed, moves, live} = List.foldr (statements, {statements = [], changed = false, moves = [], live = live}, fn ((asm: Assembly.t, Liveness.T {dead,...}), {statements: (Assembly.t * Liveness.t) list, changed : bool, moves, live: x86Liveness.LiveSet.t}) => let fun default () = let val {uses,defs,...} = Assembly.uses_defs_kills asm val baseUses = List.fold (uses, [], fn (operand,baseUses) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseUses, memloc, MemLoc.eq) then baseUses else memloc::baseUses | NONE => baseUses) val baseDefs = List.fold (defs, [], fn (operand,baseDefs) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseDefs, memloc, MemLoc.eq) then baseDefs else memloc::baseDefs | NONE => baseDefs) val allUses = let fun doit(memlocs,allUses) = List.fold (memlocs, allUses, fn (memloc,allUses) => List.fold (MemLoc.utilized memloc, allUses, fn (memloc,allUses) => if List.contains (allUses, memloc, MemLoc.eq) then allUses else memloc::allUses)) in doit(baseDefs, doit(baseUses, baseUses)) end val allDefs = baseDefs val {forces, moves, ...} = List.fold (moves, {forces = [], moves = [], allUses = allUses, allDefs = allDefs}, fn (move as {src,dst,...}, {forces, moves, allUses, allDefs}) => let val utilized_src = MemLoc.utilized src val utilized_dst = MemLoc.utilized dst in if List.exists (allDefs, fn memloc' => List.exists (src::utilized_src, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allDefs, fn memloc' => List.exists (dst::utilized_dst, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allUses, fn memloc' => MemLoc.mayAlias (memloc',dst) orelse MemLoc.mayAlias (memloc',src)) then {forces = move::forces, moves = moves, allUses = src::(List.concat [utilized_src, utilized_dst, allUses]), allDefs = dst::allDefs} else {forces = forces, moves = move::moves, allUses = allUses, allDefs = allDefs} end) val moves = List.revMap (moves, fn {src,dst,size,age} => {src = src, dst = dst, size = size, age = age + 1}) val statements_forces = List.revMap (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | _ => Assembly.instruction_pfmov {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_asm_forces, live} = LivenessBlock.toLivenessStatements {statements = asm::statements_forces, live = live} in {statements = List.concat [statements_asm_forces, statements], changed = changed orelse List.exists(forces, fn {age,...} => age <> 0), moves = moves, live = live} end in case asm of Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | _ => default () end) val forces = moves val statements_forces = List.map (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | _ => Assembly.instruction_pfmov {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_forces, ...} = LivenessBlock.toLivenessStatements {statements = statements_forces, live = live} val statements = List.concat [statements_forces, statements] val changed = changed orelse List.exists(forces, fn {age,...} => age <> 0) val block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in {block = block, changed = changed} end val moveHoist = fn {block} => (moveHoist {block = block}) val (moveHoist: {block: LivenessBlock.t} -> {block: LivenessBlock.t, changed: bool}, moveHoist_msg) = tracer "moveHoist" moveHoist end structure CopyPropagateLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure LiveInfo = x86Liveness.LiveInfo structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock fun copyPropagate' {src, dst as Operand.MemLoc memloc_dst, pblock = {statements, transfer}, liveInfo} = let val changed = ref 0 val (all,replacer) = case src of Operand.MemLoc memloc_src => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), doit(memloc_src::(MemLoc.utilized memloc_src), [])) end fun replacer' memloc = if MemLoc.eq(memloc,memloc_dst) then (changed := !changed + 1; memloc_src) else memloc val replacer = fn {use,def} => fn operand => case Operand.deMemloc operand of SOME memloc => if (use andalso not def) orelse (not (MemLoc.eq(memloc, memloc_dst))) then Operand.memloc (MemLoc.replace replacer' memloc) else operand | _ => operand in (all, replacer) end | _ => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), []) end val replacer = fn {use,def} => fn operand => if use andalso not def then if Operand.eq(operand,dst) then (changed := !changed + 1; src) else operand else operand in (all, replacer) end val (transfer,_) = transfer fun doit (statements : (Assembly.t * Liveness.t) list) = let fun uses_defs {uses, defs} = let local fun doit operands = List.fold (operands, [], fn (operand,memlocs) => case Operand.deMemloc operand of SOME memloc => if List.contains(memlocs, memloc, MemLoc.eq) then memlocs else memloc::memlocs | NONE => memlocs) fun doit'(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => if List.contains(uses, memloc, MemLoc.eq) then uses else memloc::uses) fun doit''(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => doit'(MemLoc.utilized memloc, uses)) in val uses = doit uses val defs = doit defs val uses = doit''(defs, doit''(uses, uses)) end in {uses = uses, defs = defs} end in case statements of [] => let val transfer = Transfer.replace replacer transfer val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) andalso not (MemLocSet.contains(Transfer.live transfer, memloc_dst)) then if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then SOME {statements = [], transfer = transfer} else NONE else NONE end | (asm, Liveness.T {dead, ...}) :: statements => let val asm = Assembly.replace replacer asm val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) then if LiveSet.contains(dead,memloc_dst) then let val statements = List.map (statements, #1) in SOME {statements = asm::statements, transfer = transfer} end else if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then case doit statements of NONE => NONE | SOME {statements, transfer} => SOME {statements = asm::statements, transfer = transfer} else NONE else NONE end end in case doit statements of NONE => NONE | SOME {statements, transfer} => let val {transfer, live} = LivenessBlock.toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} in SOME {pblock = {statements = statements, transfer = transfer}, changed = !changed > 0} end end | copyPropagate' _ = Error.bug "x86Simplify.PeeholeBlock: copyPropagate'" fun copyPropagate {block = LivenessBlock.T {entry, profileLabel, statements, transfer}, liveInfo} = let val {pblock = {statements,transfer},changed} = List.foldr (statements, {pblock = {statements = [], transfer = transfer}, changed = false}, fn ((asm as Assembly.Instruction (Instruction.MOV {src, dst as Operand.MemLoc memloc_dst, ...}), info: Liveness.t), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if x86Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead(#2(transfer)),memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm as Assembly.Instruction (Instruction.pFMOV {src, dst as Operand.MemLoc memloc_dst, ...}), info), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if x86Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead (#2 transfer), memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm,info), {pblock = {statements, transfer}, changed}) => {pblock = {statements = (asm,info)::statements, transfer = transfer}, changed = changed}) in {block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}, changed = changed} end val copyPropagate = fn {block, liveInfo} => (copyPropagate {block = block, liveInfo = liveInfo}) val (copyPropagate : {block: LivenessBlock.t, liveInfo: LiveInfo.t} -> {block: LivenessBlock.t, changed: bool}, copyPropagate_msg) = tracer "copyPropagate" copyPropagate val copyPropagate = fn arg as {block as LivenessBlock.T {statements, ...}, ...} => if List.length statements <= !Control.Native.copyPropCutoff then copyPropagate arg else {block = block, changed = false} end structure PeepholeLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock structure Peephole = Peephole(type entry_type = Entry.t * Liveness.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t * Liveness.t type transfer_type = Transfer.t * Liveness.t datatype block = datatype LivenessBlock.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn (Assembly.Comment _, _) => true | _ => false local val isInstruction_dstsTemp_dstsDead : statement_type -> bool = fn (Assembly.Instruction instruction, Liveness.T {dead,...}) => let val {dsts,...} = Instruction.srcs_dsts instruction in case dsts of NONE => false | SOME dsts => List.forall (dsts, fn Operand.MemLoc memloc => x86Liveness.track memloc andalso LiveSet.contains(dead,memloc) | _ => false) end | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstruction_dstsTemp_dstsDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction _, Liveness.T {liveOut,...})]], finish, transfer} => if (case List.fold (finish, (false, false), fn ((asm, _), (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.MOV _) => (b, b') | Assembly.Instruction (Instruction.SETcc _) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case #1 transfer of Transfer.Iff _ => true | _ => false) | _ => false) then NONE else let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimDeadDsts" val (callback,elimDeadDsts_msg) = make_callback_msg "elimDeadDsts" in val elimDeadDsts : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_msg = elimDeadDsts_msg end local val isInstructionMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionAL_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => x86Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionAL_dstTemp asm)), One isInstructionMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.BinAL {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pMD {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.IMUL2 {src, dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.SRAL {count, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (count,dst2) of (Operand.MemLoc memloc_count, Operand.MemLoc memloc_dst2) => List.forall (memloc_count::(MemLoc.utilized memloc_count), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "x86Simplify.PeeholeBlock: elimALCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_mov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: elimALCopy" val (callback,elimALCopy_msg) = make_callback_msg "elimALCopy" in val elimALCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALCopy_msg = elimALCopy_msg end local fun isInstructionMOV_aux (check) : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => check memloc | _ => false val isInstructionMOV = isInstructionMOV_aux (fn _ => true) val isInstructionMOV_dstTemp = isInstructionMOV_aux x86Liveness.track fun isInstructionAL_aux (check) : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => check memloc | _ => false val isInstructionAL = isInstructionAL_aux (fn _ => true) fun isDeadTemp dead memloc = x86Liveness.track memloc andalso LiveSet.contains (dead, memloc) val isInstructionAL_dstDeadTemp : statement_type -> bool = fn (instr, liveness as Liveness.T {dead, ...}) => isInstructionAL_aux (isDeadTemp dead) (instr, liveness) val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionAL, All isComment, One isInstructionMOV_dstTemp, All isComment, One isInstructionAL_dstDeadTemp], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(stmtMov as Assembly.Instruction (Instruction.MOV {src = src1x, dst = dst1z, ...}), _)], comments1, [(stmtAL as Assembly.Instruction instrAL1, _)], comments2, [(Assembly.Instruction (Instruction.MOV {src = src2x, dst = dst2z, ...}), _)], comments3, [(Assembly.Instruction instrAL2, Liveness.T {liveOut = liveOut2, ...})]], finish, transfer} => if !Control.Native.elimALRedundant andalso Operand.eq (src1x, src2x) andalso (let fun checkUn (oper1, dst1, oper2, dst2) = oper1 = oper2 andalso Operand.eq(dst1z, dst1) andalso Operand.eq(dst2z, dst2) fun checkBin (oper1, src1, dst1, oper2, src2, dst2) = oper1 = oper2 andalso Operand.eq(src1, src2) andalso Operand.eq(dst1z, dst1) andalso Operand.eq(dst2z, dst2) in case (instrAL1, instrAL2) of (Instruction.BinAL {oper = oper1, src = src1, dst = dst1, ...}, Instruction.BinAL {oper = oper2, src = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | (Instruction.pMD {oper = oper1, src = src1, dst = dst1, ...}, Instruction.pMD {oper = oper2, src = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | (Instruction.IMUL2 {src = src1, dst = dst1, ...}, Instruction.IMUL2 {src = src2, dst = dst2, ...}) => checkBin (Instruction.IMUL, src1, dst1, Instruction.IMUL, src2, dst2) | (Instruction.UnAL {oper = oper1, dst = dst1, ...}, Instruction.UnAL {oper = oper2, dst = dst2, ...}) => checkUn (oper1, dst1, oper2, dst2) | (Instruction.SRAL {oper = oper1, count = src1, dst = dst1, ...}, Instruction.SRAL {oper = oper2, count = src2, dst = dst2, ...}) => checkBin (oper1, src1, dst1, oper2, src2, dst2) | _ => false end) then let val excomm = fn comm => List.map (comm, fn (c, _) => c) val comments1 = excomm comments1 val comments2 = excomm comments2 val comments3 = excomm comments3 val statements = stmtMov::(comments1 @ (stmtAL::(comments2 @ comments3))) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold (start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: elimALRedundant" val (callback,elimALRedundant_msg) = make_callback_msg "elimALRedundant" in (* Fusing of adjacent `Word_` and `Word{S,U}_CheckP` * primitives depends on the relative order of `!a` and `?a` * in /basis-library/primitive/prim1.sml:mkOverflow *) val elimALRedundant : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALRedundant_msg = elimALRedundant_msg end local val isInstructionMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, x86Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSelfMove" val (callback,elimSelfMove_msg) = make_callback_msg "elimSelfMove" in val elimSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_msg = elimSelfMove_msg end local val isInstructionMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionBinALMD_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) | (Assembly.Instruction (Instruction.pMD {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstMemloc, All isComment, One isInstructionBinALMD_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val isInstructionFMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionFltA_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFBinA {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFUnA {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFPTAN {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFBinAS {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFBinASP {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionFMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => x86Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionFltA_dstTemp asm)), One isInstructionFMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.pFBinA {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pFUnA {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.pFPTAN {dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.pFBinAS {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pFBinASP {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltACopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_pfmov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltACopy" val (callback,elimFltACopy_msg) = make_callback_msg "elimFltACopy" in val elimFltACopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltACopy_msg = elimFltACopy_msg end local val isInstructionFMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {...}), _)]], finish, transfer} => let val statements = List.fold (start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltSelfMove" val (callback,elimFltSelfMove_msg) = make_callback_msg "elimFltSelfMove" in val elimFltSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltSelfMove_msg = elimFltSelfMove_msg end local val isInstructionFMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionFltBinA_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFBinA {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_dstMemloc, All isComment, One isInstructionFltBinA_dstMemloc], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pFBinA {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1, src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_pfmov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pfbina {oper = Instruction.fbina_reverse oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: commuteFltBinA" val (callback,commuteFltBinA_msg) = make_callback_msg "commuteFltBinA" in val commuteFltBinA : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteFltBinA_msg = commuteFltBinA_msg end local val isInstructionSETcc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SETcc {...}), _) => true | _ => false val isInstructionTEST_eqSrcs : statement_type -> bool = fn (Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc1, src2 = Operand.MemLoc memloc2,...}), Liveness.T {...}) => MemLoc.eq(memloc1, memloc2) | _ => false val isIff_conditionZorNZ : transfer_type -> bool = fn (Transfer.Iff {condition,...}, _) => (case condition of Instruction.Z => true | Instruction.NZ => true | _ => false) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSETcc, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isIff_conditionZorNZ} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(statement as Assembly.Instruction (Instruction.SETcc {condition = condition1, dst = Operand.MemLoc memloc1, ...}), _)], comments1, [(Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc12, ...}), Liveness.T {dead, ...})], comments2], finish = [], transfer = (Transfer.Iff {condition, truee, falsee}, infoT as _)} => if MemLoc.eq(memloc1,memloc12) then let val condition = case condition of Instruction.Z => Instruction.condition_negate condition1 | Instruction.NZ => condition1 | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump:condition" val transfer = (Transfer.iff {condition = condition, truee = truee, falsee = falsee}, infoT) val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val statements = List.concat [List.map(comments1, #1), List.map(comments2, #1)] val statements = if x86Liveness.track memloc1 andalso LiveSet.contains(dead, memloc1) then statements else statement::statements val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} val statements = List.fold(start, statements, op ::) val live = case statements of (_, Liveness.T {liveIn,...})::_ => liveIn | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump:live" val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump" val (callback,conditionalJump_msg) = make_callback_msg "conditionalJump" in val conditionalJump : optimization = {template = template, rewriter = rewriter, callback = callback} val conditionalJump_msg = conditionalJump_msg end local val {template, rewriter, ...} = elimDeadDsts val (callback,elimDeadDsts_minor_msg) = make_callback_msg "elimDeadDsts_minor" in val elimDeadDsts_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_minor_msg = elimDeadDsts_minor_msg end local val {template, rewriter, ...} = elimSelfMove val (callback,elimSelfMove_minor_msg) = make_callback_msg "elimSelfMove_minor" in val elimSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_minor_msg = elimSelfMove_minor_msg end local val {template, rewriter, ...} = elimFltSelfMove val (callback,elimFltSelfMove_minor_msg) = make_callback_msg "elimFltSelfMove_minor" in val elimFltSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltSelfMove_minor_msg = elimFltSelfMove_minor_msg end local val optimizations_pre = elimALRedundant:: nil val optimizations_pre_msg = elimALRedundant_msg:: nil val optimizations = elimALCopy:: elimFltACopy:: elimDeadDsts:: elimSelfMove:: elimFltSelfMove:: commuteBinALMD:: commuteFltBinA:: conditionalJump:: nil val optimizations_msg = elimALCopy_msg:: elimFltACopy_msg:: elimDeadDsts_msg:: elimSelfMove_msg:: elimFltSelfMove_msg:: commuteBinALMD_msg:: commuteFltBinA_msg:: conditionalJump_msg:: nil val optimizations_minor = elimDeadDsts_minor:: elimSelfMove_minor:: elimFltSelfMove_minor:: nil val optimizations_minor_msg = elimDeadDsts_minor_msg:: elimSelfMove_minor_msg:: elimFltSelfMove_minor_msg:: nil in val peepholeLivenessBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeLivenessBlock_pre, peepholeLivenessBlock_pre_msg) = tracer "peepholeLivenessBlock_pre" peepholeLivenessBlock_pre val peepholeLivenessBlock_pre_msg = fn () => (peepholeLivenessBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock = fn block => (peepholeBlock {optimizations = optimizations, block = block}) val (peepholeLivenessBlock, peepholeLivenessBlock_msg) = tracer "peepholeLivenessBlock" peepholeLivenessBlock val peepholeLivenessBlock_msg = fn () => (peepholeLivenessBlock_msg (); Control.indent (); List.foreach(optimizations_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock_minor = fn block => (peepholeBlock {optimizations = optimizations_minor, block = block}) val (peepholeLivenessBlock_minor, peepholeLivenessBlock_minor_msg) = tracer "peepholeLivenessBlock_minor" peepholeLivenessBlock_minor val peepholeLivenessBlock_minor_msg = fn () => (peepholeLivenessBlock_minor_msg (); Control.indent (); List.foreach(optimizations_minor_msg, fn msg => msg ()); Control.unindent ()) end end fun simplify {chunk : Chunk.t, optimize : int, delProfileLabel : x86.ProfileLabel.t -> unit, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t} : Chunk.t = let (* fun changedChunk_msg {chunk as Chunk.T {blocks, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedLivenessBlock_msg {block as x86Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if changed then (print ("finished " ^ msg ^ "\n")) else () *) fun changedChunk_msg {chunk = Chunk.T {blocks, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; List.foreach(blocks, fn b as Block.T {entry, ...} => (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86.Block.printBlock b))) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86.Block.printBlock block)) fun changedLivenessBlock_msg {block as x86Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label (#1 entry))), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86Liveness.LivenessBlock.printBlock block)) val debug = false val changedChunk_msg : {chunk : Chunk.t, changed: bool, msg: string} -> unit = if debug then changedChunk_msg else (fn _ => ()) val changedBlock_msg : {block : Block.t, changed: bool, msg: string} -> unit = if debug then changedBlock_msg else (fn _ => ()) val changedLivenessBlock_msg : {block : x86Liveness.LivenessBlock.t, changed: bool, msg: string} -> unit = if debug then changedLivenessBlock_msg else (fn _ => ()) fun checkLivenessBlock {block, block', msg} = Assert.assert ("x86Simplify.checkLivenessBlock: " ^ msg, fn () => if x86Liveness.LivenessBlock.verifyLivenessBlock {block = block, liveInfo = liveInfo} then true else (print ("pre: " ^ msg); x86Liveness.LivenessBlock.printBlock block; print (String.make(60, #"*")); print ("\n"); print ("post: " ^ msg); x86Liveness.LivenessBlock.printBlock block'; print (String.make(60, #"*")); print ("\n"); false)) (*********************************************************************) (* simplify *) (*********************************************************************) val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "simplify:"} (*********************************************************************) (* completeLiveInfo *) (*********************************************************************) val _ = x86Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "pre"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (pre):"} (*********************************************************************) (* completeJumpInfo *) (*********************************************************************) val _ = x86JumpInfo.completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo} val _ = Assert.assert ("x86Simplify.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk}) (*********************************************************************) (* optimizer *) (*********************************************************************) fun optimizer chunk = let val chunk = chunk val changed = false (**************************************************************) (* elimGoto *) (**************************************************************) val {chunk = chunk', changed = changed'} = ElimGoto.elimGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val _ = Assert.assert ("x86Simplify.verifyJumpInfo", fn () => x86JumpInfo.verifyJumpInfo {chunk = chunk', jumpInfo = jumpInfo}) val _ = Assert.assert ("x86Simplify.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk'}) val _ = changedChunk_msg {chunk = chunk, changed = changed', msg = "ElimGoto.elimGoto:"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate*) (**************************************************************) val Chunk.T {data, blocks} = chunk val {blocks = blocks', changed = changed'} = List.fold (blocks, {blocks = [], changed = false}, fn (block, {blocks, changed}) => let val _ = changedBlock_msg {block = block, changed = false, msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} (***************************************************) (* peepholeBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_pre block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* toLivenessBlock *) (***************************************************) val block' = x86Liveness.LivenessBlock.toLivenessBlock {block = block, liveInfo = liveInfo} val block = block' val _ = changedLivenessBlock_msg {block = block', changed = false, msg = "x86Liveness.LivenessBlock.toLivenessBlock"} (***************************************************) (* peepholeLivenessBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_pre block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_pre"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* moveHoist *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.moveHoist then MoveHoistLivenessBlock.moveHoist {block = block} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "MoveHoistLivenessBlock.moveHoist"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "MoveHoistLivenessBlock.moveHoist"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val block = block' val changed = changed orelse changed' (***************************************************) (* copyPropagate *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.copyProp then CopyPropagateLivenessBlock.copyPropagate {block = block, liveInfo = liveInfo} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "CopyPropagateLivenessBlock.copyPropagate"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "CopyPropagateLivenessBlock.copyPropagate"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock_minor *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_minor block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val block = block' val changed = changed orelse changed' (***************************************************) (* toBlock *) (***************************************************) val block' = x86Liveness.LivenessBlock.toBlock {block = block} val _ = changedBlock_msg {block = block', changed = false, msg = "x86Liveness.LivenessBlock.toBlock"} val block = block' (***************************************************) (* peepholeBlock_post *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_post block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_post"} val block = block' val changed = changed orelse changed' in {blocks = block::blocks, changed = changed} end) val chunk' = Chunk.T {data = data, blocks = blocks'} val _ = changedChunk_msg {chunk = chunk', changed = changed', msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* completeLiveInfo *) (**************************************************************) val _ = x86Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "post"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (post):"} in {chunk = chunk, changed = changed} end (*********************************************************************) (* optimizer_loop *) (*********************************************************************) fun optimizer_loop chunk = let fun loop {chunk, changed} = let val {chunk, changed = changed'} = optimizer chunk in if changed' then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed} = loop {chunk = chunk, changed = false} in {chunk = chunk, changed = changed} end (*********************************************************************) (* chunk *) (*********************************************************************) val {chunk, ...} = case optimize of 0 => {chunk = chunk, changed = false} | 1 => optimizer chunk | _ => optimizer_loop chunk in chunk end val (simplify, simplify_msg) = tracerTop "simplify" simplify fun simplify_totals () = (simplify_msg (); Control.indent (); x86Liveness.LiveInfo.completeLiveInfo_msg (); x86JumpInfo.completeJumpInfo_msg (); ElimGoto.elimGoto_msg (); x86JumpInfo.verifyJumpInfo_msg (); x86EntryTransfer.verifyEntryTransfer_msg (); PeepholeBlock.peepholeBlock_pre_msg (); x86Liveness.LivenessBlock.toLivenessBlock_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_pre_msg (); MoveHoistLivenessBlock.moveHoist_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_msg (); CopyPropagateLivenessBlock.copyPropagate_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_minor_msg (); x86Liveness.LivenessBlock.verifyLivenessBlock_msg (); x86Liveness.LivenessBlock.toBlock_msg (); PeepholeBlock.peepholeBlock_post_msg (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-simplify.sig000066400000000000000000000017131416264345000235770ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_SIMPLIFY_STRUCTS = sig structure x86 : X86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86EntryTransfer : X86_ENTRY_TRANSFER sharing x86 = x86EntryTransfer.x86 end signature X86_SIMPLIFY = sig include X86_SIMPLIFY_STRUCTS val simplify : {chunk : x86.Chunk.t, optimize : int, delProfileLabel : x86.ProfileLabel.t -> unit, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t} -> x86.Chunk.t val simplify_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-translate.fun000066400000000000000000001163561416264345000237600ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86Translate(S: X86_TRANSLATE_STRUCTS): X86_TRANSLATE = struct open S val tracerTop = x86.tracerTop fun argsToString(ss: string list): string = "(" ^ (concat (List.separate(ss, ", "))) ^ ")" structure Machine = x86MLton.Machine local open Machine in structure CSymbol = CSymbol structure CSymbolScope = CSymbolScope structure Const = Const structure Label = Label structure Live = Live structure Scale = Scale structure StackOffset = StackOffset structure Temporary = Temporary structure Type = Type structure WordSize = WordSize structure WordX = WordX end datatype z = datatype WordSize.prim structure Global = struct open Machine.Global fun toX86Operand (g: t) : (x86.Operand.t * x86.Size.t) vector = let val ty = Machine.Type.toCType (ty g) val index = index g val base = x86.Immediate.label (x86MLton.global_base ty) val origin = x86.MemLoc.imm {base = base, index = x86.Immediate.int index, scale = x86.Scale.fromCType ty, size = x86.Size.BYTE, class = x86MLton.Classes.Globals} val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end end type transInfo = x86MLton.transInfo structure Operand = struct open Machine.Operand fun get (f: ('a * 'b) -> 'c) (i: int) (v: ('a * 'b) vector) = f (Vector.sub (v, i)) fun getOp0 v = get #1 0 v fun toX86Operand {operand, transInfo = {addData, ...}: transInfo} = let local fun fromSizes (sizes, origin) = (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) in val rec toX86Operand : t -> (x86.Operand.t * x86.Size.t) vector = fn SequenceOffset {base, index, offset, scale, ty} => let val base = toX86Operand base val _ = Assert.assert("x86Translate.Operand.toX86Operand: SequenceOffset/base", fn () => Vector.length base = 1) val base = getOp0 base val index = toX86Operand index val _ = Assert.assert("x86Translate.Operand.toX86Operand: SequenceOffset/index", fn () => Vector.length index = 1) val index = getOp0 index val scale = case scale of Scale.One => x86.Scale.One | Scale.Two => x86.Scale.Two | Scale.Four => x86.Scale.Four | Scale.Eight => x86.Scale.Eight val ty = Type.toCType ty val origin = case (x86.Operand.deImmediate base, x86.Operand.deMemloc base, x86.Operand.deImmediate index, x86.Operand.deMemloc index) of (SOME base, _, SOME index, _) => x86.MemLoc.imm {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | (SOME base, _, _, SOME index) => x86.MemLoc.basic {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | (_, SOME base, SOME index, _) => x86.MemLoc.simple {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | (_, SOME base, _, SOME index) => x86.MemLoc.complex {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | _ => Error.bug (concat ["x86Translate.Operand.toX86Operand: ", "strange SequenceOffset: base: ", x86.Operand.toString base, " index: ", x86.Operand.toString index]) val origin = if Bytes.isZero offset then origin else x86.MemLoc.shift {origin = origin, disp = x86.Immediate.int (Bytes.toInt offset), scale = x86.Scale.One, size = x86.Size.BYTE} val sizes = x86.Size.fromCType ty in fromSizes (sizes, origin) end | Cast (z, _) => toX86Operand z | Const (Const.CSymbol (CSymbol.T {name, symbolScope, ...})) => let datatype z = datatype CSymbolScope.t datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t val label = fn () => Label.fromString name (* how to access an imported label's address *) (* windows coff will add another leading _ to label *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => let val label = Label.newString (concat ["L_", name, "_non_lazy_ptr"]) val () = addData [x86.Assembly.pseudoop_non_lazy_symbol_pointer (), x86.Assembly.label label, x86.Assembly.pseudoop_indirect_symbol (Label.fromString name), x86.Assembly.pseudoop_long [x86.Immediate.zero]] in label end val elf = fn () => Label.fromString (name ^ "@GOT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => Vector.new1 (x86.Operand.immediate_label (label ()), x86.Size.LONG) val indirect = fn () => Vector.new1 (x86.Operand.memloc_label (importLabel ()), x86.Size.LONG) in case (symbolScope, !Control.Target.os, !Control.Native.pic) of (* Even private PIC symbols on darwin need indirection. *) (Private, Darwin, true) => indirect () (* As long as the symbol is private (thus it is not * exported to code outside this text segment), then * use normal addressing. If PIC is needed, then the * memloc_label is updated to relative access in the * allocate-registers pass. *) | (Private, _, _) => direct () (* On darwin, even executables use the defintion address. * Therefore we don't need to do indirection. *) | (Public, Darwin, _) => direct () (* On ELF, a public symbol must be accessed via * the GOT. This is because the final value may not be * in this text segment. If the executable uses it, then * the unique C address resides in the executable's * text segment. The loader does this by creating a PLT * proxy or copying values to the executable text segment. * When linking an executable, ELF uses a special trick * to "simplify" the code. All exported functions and * symbols have pointers that correspond to the * executable. Function pointers point to the * automatically created PLT entry in the executable. * Variables are copied/relocated into the executable bss. * * This means that direct access is fine for executable * and archive formats. (It also means direct access is * NOT fine for a library, even if it defines the symbol.) * *) | (Public, _, true) => indirect () | (Public, _, false) => direct () (* On darwin, the address is the point of definition. So * indirection is needed. We also need to make a stub! *) | (External, Darwin, _) => indirect () (* On windows, the address is the point of definition. So * we must always use an indirect lookup to the symbols * windows rewrites (__imp__name) in our segment. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* When compiling ELF to a library, we access external * symbols via some address that is updated by the loader. * That address resides within our data segment, and can * be easily referenced using RBX-relative addressing. * This trick is used on every platform MLton supports. * ELF rewrites symbols of form name@GOT. *) | (External, _, true) => indirect () | (External, _, false) => direct () end | Const Const.Null => Vector.new1 (x86.Operand.immediate_zero, x86MLton.wordSize) | Const (Const.Word w) => let fun single size = Vector.new1 (x86.Operand.immediate_word w, size) in case WordSize.prim (WordX.size w) of W8 => single x86.Size.BYTE | W16 => single x86.Size.WORD | W32 => single x86.Size.LONG | W64 => let val lo = WordX.resize (w, WordSize.word32) val w = WordX.rshift (w, WordX.fromIntInf (32, WordSize.word64), {signed = true}) val hi = WordX.resize (w, WordSize.word32) in Vector.new2 ((x86.Operand.immediate_word lo, x86.Size.LONG), (x86.Operand.immediate_word hi, x86.Size.LONG)) end end | Const _ => Error.bug "x86Translate.Operand.toX86Operand: Const" | Frontier => let val frontier = x86MLton.gcState_frontierContentsOperand () in Vector.new1 (frontier, valOf (x86.Operand.size frontier)) end | GCState => Vector.new1 (x86.Operand.immediate_label x86MLton.gcState_label, x86MLton.pointerSize) | Global g => Global.toX86Operand g | Label l => Vector.new1 (x86.Operand.immediate_label l, x86MLton.pointerSize) | Offset {base = GCState, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val offset = x86MLton.gcState_offset {offset = offset, ty = ty} in Vector.new1 (offset, valOf (x86.Operand.size offset)) end | Offset {base, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val base = toX86Operand base val _ = Assert.assert("x86Translate.Operand.toX86Operand: Offset/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case (x86.Operand.deImmediate base, x86.Operand.deMemloc base) of (SOME base, _) => x86.MemLoc.imm {base = base, index = x86.Immediate.int offset, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | (_, SOME base) => x86.MemLoc.simple {base = base, index = x86.Immediate.int offset, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | _ => Error.bug (concat ["x86Translate.Operand.toX86Operand: ", "strange Offset: base: ", x86.Operand.toString base]) val sizes = x86.Size.fromCType ty in fromSizes (sizes, origin) end | StackOffset (StackOffset.T {offset, ty}) => let val offset = Bytes.toInt offset val ty = Type.toCType ty val origin = x86.MemLoc.simple {base = x86MLton.gcState_stackTopContents (), index = x86.Immediate.int offset, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Stack} val sizes = x86.Size.fromCType ty in fromSizes (sizes, origin) end | StaticHeapRef (Machine.StaticHeap.Ref.T {kind, offset, ...}) => let val offset = Bytes.toInt offset val base = x86.Immediate.labelPlusInt (Machine.StaticHeap.Kind.label kind, offset) in Vector.new1 (x86.Operand.immediate base, x86MLton.pointerSize) end | StackTop => let val stackTop = x86MLton.gcState_stackTopContentsOperand () in Vector.new1 (stackTop, valOf (x86.Operand.size stackTop)) end | Temporary t => let val ty = Machine.Type.toCType (Temporary.ty t) val index = Machine.Temporary.index t val base = x86.Immediate.label (x86MLton.local_base ty) val origin = x86.MemLoc.imm {base = base, index = x86.Immediate.int index, scale = x86.Scale.fromCType ty, size = x86.Size.BYTE, class = x86MLton.Classes.Locals} val sizes = x86.Size.fromCType ty in fromSizes (sizes, origin) end end in toX86Operand operand end end structure Entry = struct structure Kind = Machine.Kind fun frameInfoToX86 fi = x86.FrameInfo.T {frameInfosIndex = Machine.FrameInfo.index fi, size = Bytes.toInt (Machine.FrameInfo.size fi)} fun toX86Blocks {label, kind, transInfo as {live, liveInfo, ...}: transInfo} = ( x86Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label); case kind of Kind.Jump => let in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.jump {label = label}), statements = [], transfer = NONE}) end | Kind.Func _ => let val args = List.fold (live label, x86.MemLocSet.empty, fn (operand, args) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(args, memloc) | NONE => args) in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.func {label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Cont {args, frameInfo, ...} => let val frameInfo = frameInfoToX86 frameInfo val args = Vector.fold (args, x86.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toX86Operand {operand = Live.toOperand operand, transInfo = transInfo}, args, fn ((operand,_),args) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.cont {frameInfo = frameInfo, label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Handler {args, frameInfo, ...} => let val frameInfo = frameInfoToX86 frameInfo val args = Vector.fold (args, x86.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toX86Operand {operand = Live.toOperand operand, transInfo = transInfo}, args, fn ((operand,_),args) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.handler {frameInfo = frameInfo, label = label, live = args}), statements = [], transfer = NONE}) end | Kind.CReturn {dst, frameInfo, func} => let val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toX86Operand {operand = Live.toOperand dst, transInfo = transInfo} in x86MLton.creturn {dsts = dsts, frameInfo = Option.map (frameInfo, frameInfoToX86), func = func, label = label, transInfo = transInfo} end) end structure Statement = struct open Machine.Statement fun comments statement = if !Control.codegenComments > 0 then let val comment = (Layout.toString o layout) statement in (AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin: ", comment])], transfer = NONE}), AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["end: ", comment])], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun toX86Blocks {statement, transInfo as {...} : transInfo} = (case statement of Move {src, dst} => let val (comment_begin, comment_end) = comments statement val dsts = Operand.toX86Operand {operand = dst, transInfo = transInfo} val srcs = Operand.toX86Operand {operand = src, transInfo = transInfo} (* Operand.toX86Operand returns multi-word * operands in and they will be moved in order, * so it suffices to check for aliasing between * the first dst and second src. *) val (dsts,srcs) = if Vector.length srcs > 1 andalso x86.Operand.mayAlias (#1 (Vector.sub (dsts, 0)), #1 (Vector.sub (srcs, 1))) then (Vector.rev dsts, Vector.rev srcs) else (dsts,srcs) in AppendList.appends [comment_begin, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = (Vector.toList o Vector.map2) (dsts,srcs,fn ((dst,_),(src,srcsize)) => (* dst = src *) case x86.Size.class srcsize of x86.Size.INT => x86.Assembly.instruction_mov {dst = dst, src = src, size = srcsize} | x86.Size.FLT => x86.Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize} | _ => Error.bug "x86Translate.Statement.toX86Blocks: Move"), transfer = NONE}), comment_end] end | PrimApp {dst, prim, args} => let val (comment_begin, comment_end) = comments statement val args = (Vector.concatV o Vector.map) (args, fn operand => Operand.toX86Operand {operand = operand, transInfo = transInfo}) val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toX86Operand {operand = dst, transInfo = transInfo} in AppendList.appends [comment_begin, (x86MLton.prim {prim = prim, args = args, dsts = dsts, transInfo = transInfo}), comment_end] end | ProfileLabel l => AppendList.single (x86.Block.mkProfileBlock' {profileLabel = l})) end structure Transfer = struct open Machine.Transfer fun goto l = AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = l})}) fun iff (test, a, b, transInfo) = let val (test,testsize) = Vector.sub (Operand.toX86Operand {operand = test, transInfo = transInfo}, 0) in if Label.equals(a, b) then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = a})}) else AppendList.single ((* if (test) goto a * goto b *) x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.instruction_test {src1 = test, src2 = test, size = testsize}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.NZ, truee = a, falsee = b})}) end fun cmp (test, k, a, b, transInfo) = let val (test,testsize) = Vector.sub (Operand.toX86Operand {operand = test, transInfo = transInfo}, 0) in if Label.equals(a, b) then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = a})}) else AppendList.single ((* if (test = k) goto a * goto b *) x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.instruction_cmp {src1 = test, src2 = x86.Operand.immediate k, size = testsize}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.E, truee = a, falsee = b})}) end fun switch(test, cases, default, transInfo) = let val test = Operand.toX86Operand {operand = test, transInfo = transInfo} val (test,_) = Vector.sub(test, 0) in AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.switch {test = test, cases = cases, default = default})}) end fun doSwitchWord (test, cases, default, transInfo) = (case (cases, default) of ([], NONE) => Error.bug "x86Translate.Transfer.doSwitchWord" | ([(_,l)], NONE) => goto l | ([], SOME l) => goto l | ([(w1,l1),(w2,l2)], NONE) => if WordX.isZero w1 andalso WordX.isOne w2 then iff(test,l2,l1,transInfo) else if WordX.isZero w2 andalso WordX.isOne w1 then iff(test,l1,l2,transInfo) else cmp(test,x86.Immediate.word w1,l1,l2,transInfo) | ([(k',l')], SOME l) => cmp(test,x86.Immediate.word k',l',l,transInfo) | ((_,l)::cases, NONE) => switch(test, x86.Transfer.Cases.word cases, l, transInfo) | (cases, SOME l) => switch(test, x86.Transfer.Cases.word cases, l, transInfo)) fun comments transfer = if !Control.codegenComments > 0 then let val comment = (Layout.toString o layout) transfer in AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment comment], transfer = NONE}) end else AppendList.empty fun toX86Blocks {returns, transfer, transInfo: transInfo} = (case transfer of CCall {args, func, return} => let val args = (Vector.concatV o Vector.map) (args, fn operand => Operand.toX86Operand {operand = operand, transInfo = transInfo}) in AppendList.append (comments transfer, x86MLton.ccall {args = args, func = func, return = Option.map (return, fn {return, size} => {return = return, size = Option.map (size, Bytes.toInt)}), transInfo = transInfo}) end | Return _ => AppendList.append (comments transfer, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.return {live = Vector.fold ((case returns of NONE => Error.bug "x86Translate.Transfer.toX86Blocsk: Return" | SOME zs => zs), x86.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toX86Operand {operand = operand, transInfo = transInfo}, live, fn ((operand,_),live) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(live, memloc) | NONE => live))})})) | Raise _ => AppendList.append (comments transfer, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.raisee {live = x86.MemLocSet.add (x86.MemLocSet.add (x86.MemLocSet.empty, x86MLton.gcState_stackBottomContents ()), x86MLton.gcState_exnStackContents ())})})) | Switch (Machine.Switch.T {cases, default, test, ...}) => AppendList.append (comments transfer, doSwitchWord (test, Vector.toList cases, default, transInfo)) | Goto label => (AppendList.append (comments transfer, AppendList.single ((* goto label *) x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = label})}))) | Call {label, live, return, ...} => let val live = Vector.fold (live, x86.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toX86Operand {operand = Live.toOperand operand, transInfo = transInfo}, live, fn ((operand, _), live) => case x86.Operand.deMemloc operand of NONE => live | SOME memloc => x86.MemLocSet.add (live, memloc))) val com = comments transfer val transfer = case return of NONE => x86.Transfer.tail {target = label, live = live} | SOME {return, handler, size} => x86.Transfer.nontail {target = label, live = live, return = return, handler = handler, size = Bytes.toInt size} in AppendList.append (com, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME transfer})) end) end structure Block = struct open Machine.Block fun toX86Blocks {block = T {label, live, kind, returns, statements, transfer, ...}, transInfo as {...} : transInfo} = let val pseudo_blocks = AppendList.append (AppendList.snoc (Entry.toX86Blocks {label = label, kind = kind, transInfo = transInfo}, x86.Block.mkBlock' {entry = NONE, statements = if !Control.codegenComments > 0 then let val comment = concat ["Live: ", argsToString (Vector.toListMap (live, fn l => Operand.toString (Live.toOperand l)))] in [x86.Assembly.comment comment] end else [], transfer = NONE}), Vector.foldr(statements, (Transfer.toX86Blocks {returns = (Option.map (returns, fn v => Vector.map (v, Live.toOperand))), transfer = transfer, transInfo = transInfo}), fn (statement,l) => AppendList.append (Statement.toX86Blocks {statement = statement, transInfo = transInfo}, l))) val pseudo_blocks = AppendList.toList pseudo_blocks val blocks = x86.Block.compress pseudo_blocks in blocks end end structure Chunk = struct open Machine.Chunk fun toX86Chunk {chunk = T {blocks, ...}, liveInfo} = let val data = ref [] val addData = fn l => List.push (data, l) val {get = live : Label.t -> x86.Operand.t list, set = setLive, rem = remLive, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live", Label.layout)) val transInfo = {addData = addData, live = live, liveInfo = liveInfo} val _ = Vector.foreach (blocks, fn Block.T {label, live, ...} => setLive (label, (Vector.toList o #1 o Vector.unzip o Vector.concatV o Vector.map) (live, fn operand => Operand.toX86Operand {operand = Live.toOperand operand, transInfo = transInfo}))) val x86Blocks = List.concat (Vector.toListMap (blocks, fn block => Block.toX86Blocks {block = block, transInfo = transInfo})) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => remLive label) val data = List.concatRev (!data) val data = if List.isEmpty data then [] else (x86.Assembly.pseudoop_data())::data in x86.Chunk.T {data = data, blocks = x86Blocks} end end fun translateChunk {chunk: x86MLton.Machine.Chunk.t, liveInfo: x86Liveness.LiveInfo.t}: {chunk: x86.Chunk.t} = {chunk = Chunk.toX86Chunk {chunk = chunk, liveInfo = liveInfo}} val (translateChunk, translateChunk_msg) = tracerTop "translateChunk" translateChunk fun translateChunk_totals () = (translateChunk_msg (); Control.indent (); Control.unindent ()) end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86-translate.sig000066400000000000000000000015171416264345000237420ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_TRANSLATE_STRUCTS = sig structure x86: X86_PSEUDO structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 sharing x86MLton.x86Liveness = x86Liveness end signature X86_TRANSLATE = sig include X86_TRANSLATE_STRUCTS val translateChunk : {chunk: x86MLton.Machine.Chunk.t, liveInfo: x86Liveness.LiveInfo.t} -> {chunk: x86.Chunk.t} val translateChunk_totals : unit -> unit end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86.fun000066400000000000000000004705321416264345000217640ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor x86 (S: X86_STRUCTS): X86 = struct val tracerTop = fn s => Control.traceBatch (Control.Pass, s) (* = fn s => fn f => (Control.trace (Control.Pass, s) f, fn () => ()) *) val tracer = fn s => Control.traceBatch (Control.Detail, s) (* = fn s => fn f => (Control.trace (Control.Detail, s) f, fn () => ()) *) (* compensate for differences between * C-escape sequences and ASM-escape sequences *) val Char_escapeASM = fn #"\000" => "\\000" | #"\^G" => "\\007" | #"\^K" => "\\013" | #"?" => "?" | #"'" => "'" | c => Char.escapeC c fun String_escapeASM s = String.translate(s, Char_escapeASM) val rec lexical = fn [] => EQUAL | thunk::tl => let val ord = thunk () in if Relation.equals(ord, EQUAL) then lexical tl else ord end open S structure Label = struct open Label fun toString l = if !Control.labelsHaveExtra_ then concat ["_", Label.toString l] else Label.toString l val layout = Layout.str o toString end structure Size = struct datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val layout = let open Layout in fn BYTE => str "b" | WORD => str "w" | LONG => str "l" | SNGL => str "S" | DBLE => str "L" | EXTD => str "T" | FPIS => str "s" | FPIL => str "l" | FPIQ => str "q" end val toString = Layout.toString o layout val fromBytes : int -> t = fn 1 => BYTE | 2 => WORD | 4 => LONG | _ => Error.bug "x86.Size.fromBytes" val toBytes : t -> int = fn BYTE => 1 | WORD => 2 | LONG => 4 | SNGL => 4 | DBLE => 8 | EXTD => 10 | FPIS => 2 | FPIL => 4 | FPIQ => 8 local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Vector.new1 LONG | Int8 => Vector.new1 BYTE | Int16 => Vector.new1 WORD | Int32 => Vector.new1 LONG | Int64 => Vector.new2 (LONG, LONG) | Objptr => Vector.new1 LONG | Real32 => Vector.new1 SNGL | Real64 => Vector.new1 DBLE | Word8 => Vector.new1 BYTE | Word16 => Vector.new1 WORD | Word32 => Vector.new1 LONG | Word64 => Vector.new2 (LONG, LONG) end val class = fn BYTE => INT | WORD => INT | LONG => INT | SNGL => FLT | DBLE => FLT | EXTD => FLT | FPIS => FPI | FPIL => FPI | FPIQ => FPI val toFPI = fn WORD => FPIS | LONG => FPIL | FPIS => FPIS | FPIL => FPIL | FPIQ => FPIQ | _ => Error.bug "x86.Size.toFPI" val eq = fn (s1, s2) => s1 = s2 val lt = fn (s1, s2) => (toBytes s1) < (toBytes s2) end structure Register = struct datatype reg = EAX | EBX | ECX | EDX | EDI | ESI | EBP | ESP val allReg = [EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP] datatype part = E | X | L | H datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of E => Size.LONG | X => Size.WORD | L => Size.BYTE | H => Size.BYTE fun layout (T {reg, part}) = let open Layout val {prefix, suffix} = case part of E => {prefix = str "%e", suffix = str "x"} | X => {prefix = str "%", suffix = str "x"} | L => {prefix = str "%", suffix = str "l"} | H => {prefix = str "%", suffix = str "h"} in case reg of EAX => seq [prefix, str "a", suffix] | EBX => seq [prefix, str "b", suffix] | ECX => seq [prefix, str "c", suffix] | EDX => seq [prefix, str "d", suffix] | EDI => seq [prefix, str "di"] | ESI => seq [prefix, str "si"] | EBP => seq [prefix, str "bp"] | ESP => seq [prefix, str "sp"] end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val eax = T {reg = EAX, part = E} val ebx = T {reg = EBX, part = E} val ecx = T {reg = ECX, part = E} val edx = T {reg = EDX, part = E} val ax = T {reg= EAX, part = X} val al = T {reg = EAX, part = L} val bl = T {reg = EBX, part = L} val cl = T {reg = ECX, part = L} val dl = T {reg = EDX, part = L} val edi = T {reg = EDI, part = E} val esi = T {reg = ESI, part = E} val esp = T {reg = ESP, part = E} val ebp = T {reg = EBP, part = E} val byteRegisters = [T {reg = EAX, part = L}, T {reg = EAX, part = H}, T {reg = EBX, part = L}, T {reg = EBX, part = H}, T {reg = ECX, part = L}, T {reg = ECX, part = H}, T {reg = EDX, part = L}, T {reg = EDX, part = H}] val byteRegisters = List.rev byteRegisters val wordRegisters = [T {reg = EAX, part = X}, T {reg = EBX, part = X}, T {reg = ECX, part = X}, T {reg = EDX, part = X}, T {reg = EDI, part = X}, T {reg = ESI, part = X}, T {reg = EBP, part = X}, T {reg = ESP, part = X}] val wordRegisters = List.rev wordRegisters val longRegisters = [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}, T {reg = EDI, part = E}, T {reg = ESI, part = E}, T {reg = EBP, part = E}, T {reg = ESP, part = E}] val longRegisters = List.rev longRegisters val all = List.concat [byteRegisters, wordRegisters, longRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (E, E) => true | (E, X) => true | (E, L) => true | (E, H) => true | (X, X) => true | (X, L) => true | (X, H) => true | (L, L) => true | (H, H) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([E, X, L, H], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = E}, register') then SOME register' else NONE end) val registers = fn Size.BYTE => byteRegisters | Size.WORD => wordRegisters | Size.LONG => longRegisters | _ => Error.bug "x86.Register.registers" val baseRegisters = longRegisters val indexRegisters = [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}, T {reg = EDI, part = E}, T {reg = ESI, part = E}, T {reg = EBP, part = E}] val callerSaveRegisters = [T {reg = EAX, part = E}, T {reg = EAX, part = X}, T {reg = EAX, part = L}, T {reg = EAX, part = H}, T {reg = ECX, part = E}, T {reg = ECX, part = X}, T {reg = ECX, part = L}, T {reg = ECX, part = H}, T {reg = EDX, part = E}, T {reg = EDX, part = X}, T {reg = EDX, part = L}, T {reg = EDX, part = H}] val calleeSaveRegisters = [T {reg = EBX, part = E}, T {reg = EBX, part = X}, T {reg = EBX, part = L}, T {reg = EBX, part = H}, T {reg = EDI, part = E}, T {reg = EDI, part = X}, T {reg = ESI, part = E}, T {reg = ESI, part = X}] val withLowPart (* (fullsize,lowsize) *) = fn (Size.WORD,Size.BYTE) => [T {reg = EAX, part = X}, T {reg = EBX, part = X}, T {reg = ECX, part = X}, T {reg = EDX, part = X}] | (Size.LONG,Size.BYTE) => [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}] | (Size.LONG,Size.WORD) => longRegisters | _ => Error.bug "x86.Register.withLowPart: fullsize,lowsize" val lowPartOf (* (register,lowsize) *) = fn (T {reg, part = L},Size.BYTE) => T {reg = reg, part = L} | (T {reg, part = H},Size.BYTE) => T {reg = reg, part = H} | (T {reg = EAX, ...}, Size.BYTE) => T {reg = EAX, part = L} | (T {reg = EBX, ...}, Size.BYTE) => T {reg = EBX, part = L} | (T {reg = ECX, ...}, Size.BYTE) => T {reg = ECX, part = L} | (T {reg = EDX, ...}, Size.BYTE) => T {reg = EDX, part = L} | (T {reg, part = X},Size.WORD) => T {reg = reg, part = X} | (T {reg, ...}, Size.WORD) => T {reg = reg, part = X} | _ => Error.bug "x86.Register.lowPartOf: register,lowsize" end structure FltRegister = struct datatype t = T of int fun layout (T i) = let open Layout in if i = 0 then str "%st" else seq [str "%st", paren (Int.layout i)] end val toString = Layout.toString o layout fun eq (T f1, T f2) = f1 = f2 fun push (T i) = T (i + 1) fun pop (T i) = T (i - 1) fun id (T i) = T i (* val return = T 0 *) val top = T 0 val one = T 1 val total = 8 : int end structure Immediate = struct datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t and t = T of {immediate: u, plist: PropertyList.t, hash: Word.t} local open Layout in val rec layoutU = fn Word w => WordX.layout (w, {suffix = false}) | Label l => Label.layout l | LabelPlusWord (l, w) => paren (seq [Label.layout l, str "+", WordX.layout (w, {suffix = false})]) and layout = fn T {immediate, ...} => layoutU immediate end val rec eqU = fn (Word w1, Word w2) => WordX.equals (w1, w2) | (Label l1, Label l2) => Label.equals(l1, l2) | (LabelPlusWord (l1, w1), LabelPlusWord (l2,w2)) => Label.equals(l1,l2) andalso WordX.equals(w1, w2) | _ => false and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) local open WordX in val rec evalU = fn Word w => SOME w | Label _ => NONE | LabelPlusWord _ => NONE and eval = fn T {immediate, ...} => evalU immediate end val isZero = fn i => case eval i of SOME w => WordX.isZero w | _ => false local open Word in val rec hashU = fn Word w => WordX.hash w | Label l => Label.hash l | LabelPlusWord (l,w) => Word.xorb(0wx5555 * (Label.hash l), WordX.hash w) and hash = fn T {hash, ...} => hash end local val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn immediate => let val hash = hashU immediate in HashSet.lookupOrInsert (!table, hash, fn T {immediate = immediate', ...} => eqU(immediate', immediate), fn () => T {immediate = immediate, hash = hash, plist = PropertyList.new ()}) end val destruct = fn T {immediate, ...} => immediate fun clearAll () = HashSet.foreach (!table, fn T {immediate, plist, ...} => let in PropertyList.clear plist; case immediate of Word _ => () | Label l => Label.clear l | LabelPlusWord (l, _) => Label.clear l end) end val word = construct o Word val label = construct o Label val labelPlusWord = fn (l, w) => if WordSize.equals (WordX.size w, WordSize.word32) then construct (LabelPlusWord (l, w)) else Error.bug "x86.Immediate.labelPlusWord" val int' = fn (i, ws) => word (WordX.fromInt (i, ws)) val int = fn i => int' (i, WordSize.word32) val zero = int 0 val labelPlusInt = fn (l, i) => labelPlusWord (l, WordX.fromInt (i, WordSize.word32)) val deLabel = fn T {immediate = Label l, ...} => SOME l | _ => NONE end structure Scale = struct datatype t = One | Two | Four | Eight val layout = let open Layout in fn One => str "1" | Two => str "2" | Four => str "4" | Eight => str "8" end val fromBytes : int -> t = fn 1 => One | 2 => Two | 4 => Four | 8 => Eight | _ => Error.bug "x86.Scale.fromBytes" local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Four | Int8 => One | Int16 => Two | Int32 => Four | Int64 => Eight | Objptr => Four | Real32 => Four | Real64 => Eight | Word8 => One | Word16 => Two | Word32 => Four | Word64 => Eight end fun eq(s1, s2) = s1 = s2 val toWordX = fn One => WordX.fromIntInf (1, WordSize.word32) | Two => WordX.fromIntInf (2, WordSize.word32) | Four => WordX.fromIntInf (4, WordSize.word32) | Eight => WordX.fromIntInf (8, WordSize.word32) val toImmediate = Immediate.word o toWordX end structure Address = struct datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} fun layout (T {disp, base, index, scale}) = let open Layout in seq [case disp of NONE => empty | SOME disp => Immediate.layout disp, if (isSome base orelse isSome index) then paren (seq [case base of NONE => empty | SOME base => Register.layout base, case index of NONE => empty | SOME index => seq [str ",", Register.layout index], case scale of NONE => empty | SOME scale => seq [str ",", Scale.layout scale]]) else empty] end fun eq(T {disp = disp, base = base, index = index, scale = scale}, T {disp = disp', base = base', index = index', scale = scale'}) = (case (disp, disp') of (NONE, NONE) => true | (SOME disp, SOME disp') => Immediate.eq(disp, disp') | _ => false) andalso base = base' andalso index = index' andalso scale = scale' end structure MemLoc = struct structure Class = struct val nextCounter = Counter.generator 0 datatype t = T of {counter: int, name: string} fun layout (T {name, ...}) = let open Layout in str name end val toString = Layout.toString o layout fun new {name} = let val class = T {counter = nextCounter (), name = name} in class end val eq = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => counter1 = counter2 val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare (counter1, counter2) val counter = fn (T {counter, ...}) => counter val mayAlias = eq val Temp = new {name = "Temp"} val StaticTemp = new {name = "StaticTemp"} val CStack = new {name = "CStack"} val Code = new {name = "Code"} end datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} and t = T of {memloc: u, hash: Word.t, plist: PropertyList.t, counter: Int.t, utilized: t list} local open Layout in val rec layoutImmMem = fn (NONE, NONE) => str "0" | (SOME imm, NONE) => Immediate.layout imm | (NONE, SOME mem) => layout mem | (SOME imm, SOME mem) => seq [Immediate.layout imm, str "+", layout mem] and layoutImmMemScale = fn (NONE, NONE, _) => str "0" | (SOME imm, NONE, _) => Immediate.layout imm | (NONE, SOME mem, scale) => seq [layout mem, str "*", Scale.layout scale] | (SOME imm, SOME mem, scale) => seq [Immediate.layout imm, str "+(", layout mem, str "*", Scale.layout scale, str ")"] and layoutU = fn U {immBase, memBase, immIndex, memIndex, scale, size, class} => seq [str "MEM<", Size.layout size, str ">{", Class.layout class, str "}[(", layoutImmMem (immBase, memBase), str ")+(", layoutImmMemScale (immIndex, memIndex, scale), str ")]"] and layout = fn T {memloc, ...} => layoutU memloc end val toString = Layout.toString o layout val rec hashImmMem = fn (NONE, NONE) => 0wx55555555 | (SOME imm, NONE) => Immediate.hash imm | (NONE, SOME mem) => hash mem | (SOME imm, SOME mem) => Word.xorb(0wx5555 * (Immediate.hash imm), hash mem) and hashU = fn U {immBase, memBase, immIndex, memIndex, ...} => let val hashBase = hashImmMem(immBase, memBase) val hashIndex = hashImmMem(immIndex, memIndex) in Word.xorb(0wx5555 * hashBase, hashIndex) end and hash = fn T {hash, ...} => hash val rec eqImm = fn (NONE, NONE) => true | (SOME imm1, SOME imm2) => Immediate.eq(imm1, imm2) | _ => false and eqMem = fn (NONE, NONE) => true | (SOME mem1, SOME mem2) => eq(mem1, mem2) | _ => false and eqU = fn (U {immBase = immBase1, memBase = memBase1, immIndex = immIndex1, memIndex = memIndex1, scale = scale1, size = size1, class = class1}, U {immBase = immBase2, memBase = memBase2, immIndex = immIndex2, memIndex = memIndex2, scale = scale2, size = size2, class = class2}) => Class.eq(class1, class2) andalso eqImm(immBase1, immBase2) andalso eqMem(memBase1, memBase2) andalso eqImm(immIndex1, immIndex2) andalso eqMem(memIndex1, memIndex2) andalso Scale.eq(scale1, scale2) andalso Size.eq(size1, size2) and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) val rec utilizedMem = fn NONE => [] | SOME m => m::(utilized m) and utilizedU = fn U {memBase, memIndex, ...} => (utilizedMem memBase) @ (utilizedMem memIndex) and utilized = fn T {utilized, ...} => utilized local val nextCounter = Counter.generator 0 val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn memloc => let val hash = hashU memloc in HashSet.lookupOrInsert (!table, hash, fn T {memloc = memloc', ...} => eqU(memloc', memloc), fn () => T {memloc = memloc, hash = hash, plist = PropertyList.new (), counter = nextCounter (), utilized = utilizedU memloc}) end val destruct = fn T {memloc, ...} => memloc fun clearAll () = HashSet.foreach (!table, fn T {plist, ...} => let in PropertyList.clear plist end) end val rec mayAliasImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then pos2 < (pos1 + size1) else pos1 < (pos2 + size2) end handle Overflow => false) | _ => true end and mayAliasU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => Immediate.eq(immBase1, immBase2) andalso mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (Immediate.eq(immBase1, immBase2)) andalso (not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2})) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => true and mayAlias = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => Class.mayAlias(class1, class2) andalso mayAliasU(memloc1, memloc2) val rec mayAliasOrdImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then if pos2 < (pos1 + size1) then SOME LESS else NONE else if pos1 < (pos2 + size2) then SOME GREATER else NONE end handle Overflow => NONE) | _ => SOME EQUAL end and mayAliasOrdU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then if not (eq(memIndex1, memIndex2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if not (eq(memBase1, memBase2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if (not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2))) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => SOME EQUAL and mayAliasOrd = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => if Class.mayAlias(class1, class2) then mayAliasOrdU(memloc1, memloc2) else NONE val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare(counter1, counter2) fun replaceMem replacer = fn NONE => NONE | SOME mem => SOME (replace replacer mem) and replaceU replacer = fn memloc as T {memloc = U {immBase, memBase, immIndex, memIndex, scale, size, class}, ...} => let val memBase' = replaceMem replacer memBase val memIndex' = replaceMem replacer memIndex in if eqMem(memBase, memBase') andalso eqMem(memIndex, memIndex') then memloc else construct (U {immBase = immBase, memBase = memBase', immIndex = immIndex, memIndex = memIndex', scale = scale, size = size, class = class}) end and replace replacer = fn memloc => let val memloc' = replacer memloc in if eq(memloc', memloc) then replaceU replacer memloc else memloc' end val rec sizeU = fn U {size, ...} => size and size = fn T {memloc, ...} => sizeU memloc val rec classU = fn U {class, ...} => class and class = fn T {memloc, ...} => classU memloc fun scaleImmediate (imm, scale) = case Immediate.destruct imm of Immediate.Word w => Immediate.word (WordX.mul (w, Scale.toWordX scale, {signed = true})) | _ => Error.bug "x86.MemLoc.scaleImmediate" fun addImmediate (imm1, imm2) = case (Immediate.destruct imm1, Immediate.destruct imm2) of (Immediate.Word w1, Immediate.Word w2) => Immediate.word (WordX.add (w1, w2)) | _ => Error.bug "x86.MemLoc.scaleImmediate" val imm = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val basic = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val simple = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val complex = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val shift = fn {origin, disp, scale, size} => let val disp = scaleImmediate (disp, scale) val U {immBase, memBase, immIndex, memIndex, scale, class, ...} = destruct origin in construct (U {immBase = immBase, memBase = memBase, immIndex = case immIndex of NONE => SOME disp | SOME immIndex => SOME (addImmediate (immIndex, disp)), memIndex = memIndex, scale = scale, size = size, class = class}) end local val nextNum = Counter.generator 0 in val temp = fn {size} => imm {base = Immediate.zero, index = Immediate.int (nextNum ()), scale = Scale.One, size = size, class = Class.Temp} end (* * Static memory locations *) fun makeContents {base, size, class} = imm {base = base, index = Immediate.zero, scale = Scale.Four, size = size, class = class} (* local datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTempContents sizes = (List.rev o #1) (List.fold (sizes, ([],0), fn (size, (contents, index)) => ((cReturnTempContent (index, size))::contents, index + Size.toBytes size))) fun cReturnTempContent size = List.first(cReturnTempContents [size]) val cReturnTempContents = fn size => cReturnTempContents ( case size of Int s => let datatype z = datatype IntSize.t in case s of I8 => [BYTE] | I16 => [WORD] | I32 => [LONG] | I64 => [LONG, LONG] end | Pointer => [LONG] | Real s => let datatype z = datatype RealSize.t in case s of R32 => [SNGL] | R64 => [DBLE] end | Word s => let datatype z = datatype WordSize.t in case s of W8 => [BYTE] | W16 => [WORD] | W32 => [LONG] end) end *) end local structure ClassElement = struct type t = MemLoc.Class.t val compare = MemLoc.Class.compare local fun make f = fn (a, b) => f (MemLoc.Class.counter a, MemLoc.Class.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.Class.counter a, MemLoc.Class.counter b) then a else b val max = fn (a, b) => min (b, a) val equals = MemLoc.Class.eq val layout = MemLoc.Class.layout end in structure ClassSet = OrderedUniqueSet(open ClassElement) end local structure MemLocElement = struct type t = MemLoc.t val equals = MemLoc.eq val layout = MemLoc.layout (* val compare = MemLoc.compare local fun make f = fn (a, b) => f (MemLoc.counter a, MemLoc.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.counter a, MemLoc.counter b) then a else b val max = fn (a, b) => min (b, a) val hash = MemLoc.hash *) end in structure MemLocSet = UnorderedSet(open MemLocElement) (* structure MemLocSet = OrderedUniqueSet(open MemLocElement) *) (* structure MemLocSet' = UnorderedSet(open MemLocElement) structure MemLocSet = HashedUniqueSet(structure Set = MemLocSet' structure Element = MemLocElement) *) end structure Operand = struct datatype t = Register of Register.t | FltRegister of FltRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val size = fn Register r => SOME (Register.size r) | FltRegister _ => SOME Size.EXTD | Immediate _ => NONE | Label _ => NONE | Address _ => NONE | MemLoc m => SOME (MemLoc.size m) val layout = let open Layout in fn Register r => Register.layout r | FltRegister f => FltRegister.layout f | Immediate i => seq [str "$", Immediate.layout i] | Label l => Label.layout l | Address a => Address.layout a | MemLoc m => MemLoc.layout m end val toString = Layout.toString o layout val eq = fn (Register r1, Register r2) => Register.eq(r1, r2) | (FltRegister f1, FltRegister f2) => FltRegister.eq(f1, f2) | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Label l1, Label l2) => Label.equals(l1, l2) | (Address a1, Address a2) => Address.eq(a1, a2) | (MemLoc m1, MemLoc m2) => MemLoc.eq(m1, m2) | _ => false val mayAlias = fn (Register r1, Register r2) => Register.eq(r1, r2) | (Register _, _) => false | (FltRegister f1, FltRegister f2) => FltRegister.eq(f1, f2) | (FltRegister _, _) => false | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Immediate _, _) => false | (Label l1, Label l2) => Label.equals(l1, l2) | (Label _, _) => false | (Address _, Address _) => true | (Address _, MemLoc _) => true | (Address _, _) => false | (MemLoc m1, MemLoc m2) => MemLoc.mayAlias(m1, m2) | (MemLoc _, Address _) => true | (MemLoc _, _) => false val register = Register val deRegister = fn Register x => SOME x | _ => NONE val fltregister = FltRegister val deFltregister = fn FltRegister x => SOME x | _ => NONE val immediate = Immediate val deImmediate = fn Immediate x => SOME x | _ => NONE val immediate_word = immediate o Immediate.word val immediate_int' = immediate o Immediate.int' val immediate_int = immediate o Immediate.int val immediate_zero = immediate Immediate.zero val immediate_label = immediate o Immediate.label val label = Label val deLabel = fn Label x => SOME x | _ => NONE val address = Address val memloc = MemLoc fun memloc_label l = memloc (MemLoc.makeContents { base = Immediate.label l, size = Size.LONG, class = MemLoc.Class.Code }) val deMemloc = fn MemLoc x => SOME x | _ => NONE local val cReturnTemp = Label.fromString "cReturnTemp" fun cReturnTempContent (index, size) = MemLoc.imm {base = Immediate.label cReturnTemp, index = Immediate.int index, scale = Scale.One, size = size, class = MemLoc.Class.StaticTemp} datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTemps ty = if RepType.isUnit ty then [] else let fun w (r, s) = [{src = register r, dst = cReturnTempContent (0, s)}] val w8 = w (Register.al, BYTE) val w16 = w (Register.ax, WORD) val w32 = w (Register.eax, LONG) val w64 =[{src = register Register.eax, dst = cReturnTempContent (0, LONG)}, {src = register Register.edx, dst = cReturnTempContent (4, LONG)}] in case RepType.toCType ty of CPointer => w32 | Int8 => w8 | Int16 => w16 | Int32 => w32 | Int64 => w64 | Objptr => w32 | Real32 => [{src = fltregister FltRegister.top, dst = cReturnTempContent (0, SNGL)}] | Real64 => [{src = fltregister FltRegister.top, dst = cReturnTempContent (0, DBLE)}] | Word8 => w8 | Word16 => w16 | Word32 => w32 | Word64 => w64 end end end structure Instruction = struct (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) val binal_layout = let open Layout in fn ADD => str "add" | ADC => str "adc" | SUB => str "sub" | SBB => str "sbb" | AND => str "and" | OR => str "or" | XOR => str "xor" end (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) val md_layout = let open Layout in fn IMUL => str "imul" | MUL => str "mul" | IDIV => str "idiv" | DIV => str "div" | IMOD => str "imod" | MOD => str "mod" end (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) val unal_layout = let open Layout in fn INC => str "inc" | DEC => str "dec" | NEG => str "neg" | NOT => str "not" end (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) val sral_layout = let open Layout in fn SAL => str "sal" | SHL => str "shl" | SAR => str "sar" | SHR => str "shr" | ROL => str "rol" | RCL => str "rcl" | ROR => str "ror" | RCR => str "rcr" end (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) val movx_layout = let open Layout in fn MOVSX => str "movs" | MOVZX => str "movz" end (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate = fn O => NO | NO => O | B => NB | NB => B | AE => NAE | NAE => AE | C => NC | NC => C | E => NE | NE => E | Z => NZ | NZ => Z | BE => NBE | NBE => BE | A => NA | NA => A | S => NS | NS => S | P => NP | NP => P | PE => PO | PO => PE | L => NL | NL => L | LE => NLE | NLE => LE | G => NG | NG => G | GE => NGE | NGE => GE val condition_reverse = fn B => A | NB => NA | AE => BE | NAE => NBE | E => E | NE => NE | BE => AE | NBE => NAE | A => B | NA => NB | L => G | NL => NG | LE => GE | NLE => NGE | G => L | NG => NL | GE => LE | NGE => NLE | c => c local open Layout in val rec condition_layout = fn O => str "o" | B => str "b" | AE => str "ae" | C => str "c" | E => str "e" | Z => str "z" | BE => str "be" | A => str "a" | S => str "s" | P => str "p" | PE => str "pe" | PO => str "po" | L => str "l" | LE => str "le" | G => str "g" | GE => str "ge" | c => seq [str "n", condition_layout (condition_negate c)] end val condition_toString = Layout.toString o condition_layout (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_layout = let open Layout in fn FADD => str "fadd" | FSUB => str "fsub" | FSUBR => str "fsubr" | FMUL => str "fmul" | FDIV => str "fdiv" | FDIVR => str "fdivr" end val fbina_reverse = fn FADD => FADD | FSUB => FSUBR | FSUBR => FSUB | FMUL => FMUL | FDIV => FDIVR | FDIVR => FDIV (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) val funa_layout = let open Layout in fn F2XM1 => str "f2xm1" | FABS => str "fabs" | FCHS => str "fchs" | FSQRT => str "fsqrt" | FSIN => str "fsin" | FCOS => str "fcos" | FRNDINT => str "frndint" end (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) val fbinas_layout = let open Layout in fn FSCALE => str "fscale" | FPREM=> str "fprem" | FPREM1 => str "fprem1" end (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) val fbinasp_layout = let open Layout in fn FYL2X => str "fyl2x" | FYL2XP1 => str "fyl2xp1" | FPATAN => str "fpatan" end (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) val fldc_layout = let open Layout in fn ONE => str "fld1" | ZERO => str "fldz" | PI => str "fldpi" | L2E => str "fldl2e" | LN2 => str "fldln2" | L2T => str "fldl2t" | LG2 => str "fldlg2" end (* x86 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump. *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo-push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo-pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move. *) | pFMOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move with extension. *) | pFMOVX of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move with contraction. *) | pFXVOM of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point load constant. *) | pFLDC of {oper: fldc, dst: Operand.t, size: Size.t} (* Pseudo floating-point move from integer. *) | pFMOVFI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move to integer. *) | pFMOVTI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point compare. *) | pFCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point unordered compare. *) | pFUCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic instructions. *) | pFBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point unary arithmetic instructions. *) | pFUnA of {oper: funa, dst: Operand.t, size: Size.t} (* Pseudo floating-point partial tangent instruction. *) | pFPTAN of {dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack instructions. *) | pFBinAS of {oper: fbinas, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack pop instructions. *) | pFBinASP of {oper: fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} (* Floating-point load real. *) | FLD of {src: Operand.t, size: Size.t} (* Floating-point store real. *) | FST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point load integer. *) | FILD of {src: Operand.t, size: Size.t} (* Floating-point store integer. *) | FIST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point exchange. *) | FXCH of {src: Operand.t} (* Floating-point load constant. *) | FLDC of {oper: fldc} (* Floating-point load control word. *) | FLDCW of {src: Operand.t} (* Floating-point store control word. *) | FSTCW of {dst: Operand.t, check: bool} (* Floating-point store status word. *) | FSTSW of {dst: Operand.t, check: bool} (* Floating-point compare. *) | FCOM of {src: Operand.t, size: Size.t, pop: bool, pop': bool} (* Floating-point unordered compare. *) | FUCOM of {src: Operand.t, pop: bool, pop': bool} (* Floating-point binary arithmetic instructions. *) | FBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} (* Floating-point unary arithmetic instructions. *) | FUnA of {oper: funa} (* Floating-point partial tangent instruction. *) | FPTAN (* Floating-point binary arithmetic stack instructions. *) | FBinAS of {oper: fbinas} (* Floating-point binary arithmetic stack pop instructions. *) | FBinASP of {oper: fbinasp} val layout = let open Layout fun bin (oper, size, oper1, oper2) = seq [oper, size, str " ", oper1, str ",", oper2] fun un (oper, size, oper1) = seq [oper, size, str " ", oper1] in fn NOP => str "nop" | HLT => str "hlt" | BinAL {oper, src, dst, size} => bin (binal_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pMD {oper, src, dst, size} => bin (md_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | MD {oper, src, size} => un (md_layout oper, Size.layout size, Operand.layout src) | IMUL2 {src, dst, size} => bin (str "imul", Size.layout size, Operand.layout src, Operand.layout dst) | UnAL {oper, dst, size} => un (unal_layout oper, Size.layout size, Operand.layout dst) | SRAL {oper, count, dst, size} => bin (sral_layout oper, Size.layout size, Operand.layout count, Operand.layout dst) | CMP {src1, src2, size} => bin (str "cmp", Size.layout size, Operand.layout src2, Operand.layout src1) | TEST {src1, src2, size} => bin (str "test", Size.layout size, Operand.layout src2, Operand.layout src1) | SETcc {condition, dst, ...} => seq [str "set", condition_layout condition, str " ", Operand.layout dst] | JMP {target, absolute} => seq [str "jmp ", if absolute then str "*" else empty, Operand.layout target] | Jcc {condition, target} => seq [str "j", condition_layout condition, str " ", Operand.layout target] | CALL {target, absolute} => seq [str "call ", if absolute then str "*" else empty, Operand.layout target] | RET {src} => seq [str "ret", case src of NONE => empty | SOME src => seq [str " ", Operand.layout src]] | MOV {src, dst, size} => bin (str "mov", Size.layout size, Operand.layout src, Operand.layout dst) | CMOVcc {condition, src, dst, size} => seq [str "cmov", condition_layout condition, Size.layout size, str " ", Operand.layout src, str ",", Operand.layout dst] | XCHG {src, dst, size} => bin (str "xchg", Size.layout size, Operand.layout src, Operand.layout dst) | pPUSH {src, base, size} => seq [str "ppush", Size.layout size, str " [", Operand.layout base, str "] ", Operand.layout src] | pPOP {dst, base, size} => seq [str "ppop", Size.layout size, str " [", Operand.layout base, str " ]", Operand.layout dst] | PUSH {src, size} => seq [str "push", Size.layout size, str " ", Operand.layout src] | POP {dst, size} => seq [str "pop", Size.layout size, str " ", Operand.layout dst] | CX {size} => (case size of Size.BYTE => str "cbtw" | Size.WORD => str "cwtd" | Size.LONG => str "cltd" | _ => Error.bug "x86.Instruction.layout: CX,unsupported conversion") | MOVX {oper, src, srcsize, dst, dstsize} => bin (movx_layout oper, seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | XVOM {src, srcsize, dst, dstsize} => bin (str "xvom", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | LEA {src, dst, size} => bin (str "lea", Size.layout size, Operand.layout src, Operand.layout dst) | pFMOV {src, dst, size} => bin (str "fmov", Size.layout size, Operand.layout src, Operand.layout dst) | pFMOVX {src, dst, srcsize, dstsize} => bin (str "fmovx", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFXVOM {src, dst, srcsize, dstsize} => bin (str "fmov", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFLDC {oper, dst, size} => un (fldc_layout oper, Size.layout size, Operand.layout dst) | pFMOVFI {src, dst, srcsize, dstsize} => bin (str "fmovfi", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFMOVTI {src, dst, srcsize, dstsize} => bin (str "fmovti", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFCOM {src1, src2, size} => bin (str "fcom", Size.layout size, Operand.layout src1, Operand.layout src2) | pFUCOM {src1, src2, size} => bin (str "fucom", Size.layout size, Operand.layout src1, Operand.layout src2) | pFBinA {oper, src, dst, size} => bin (fbina_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pFUnA {oper, dst, size} => un (funa_layout oper, Size.layout size, Operand.layout dst) | pFPTAN {dst, size} => un (str "fptan", Size.layout size, Operand.layout dst) | pFBinAS {oper, src, dst, size} => bin (fbinas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pFBinASP {oper, src, dst, size} => bin (fbinasp_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | FLD {src, size} => un (str "fld", case src of Operand.FltRegister _ => empty | _ => Size.layout size, Operand.layout src) | FST {dst, size, pop} => un (str "fst", seq [if pop then str "p" else empty, case dst of Operand.FltRegister _ => empty | _ => Size.layout size], Operand.layout dst) | FILD {src, size} => un (str "fild", Size.layout size, Operand.layout src) | FIST {dst, size, pop} => un (str "fist", seq [if pop then str "p" else empty, Size.layout size], Operand.layout dst) | FXCH {src} => seq [str "fxch ", Operand.layout src] | FLDC {oper} => seq [fldc_layout oper] | FLDCW {src} => seq [str "fldcw ", Operand.layout src] | FSTCW {dst, check} => seq [if check then str "fstcw " else str "fnstcw ", Operand.layout dst] | FSTSW {dst, check} => seq [if check then str "fstsw " else str "fnstsw ", Operand.layout dst] | FCOM {src, size, pop, pop'} => seq [str "fcom", if pop andalso pop' then str "pp" else seq [if pop then str "p" else empty, case src of Operand.FltRegister _ => empty | _ => Size.layout size, str " ", Operand.layout src]] | FUCOM {src, pop, pop'} => seq [str "fucom", if pop andalso pop' then str "pp" else seq [if pop then str "p " else str " ", Operand.layout src]] | FBinA {oper, src, dst, size, pop} => seq [fbina_layout oper, case src of Operand.FltRegister _ => seq [if pop then str "p " else str " ", Operand.layout src, str ", ", Operand.layout dst] | _ => seq [Size.layout size, str " ", Operand.layout src]] | FUnA {oper} => seq [funa_layout oper] | FPTAN => seq [str "fptan"] | FBinAS {oper} => seq [fbinas_layout oper] | FBinASP {oper} => seq [fbinasp_layout oper] end val toString = Layout.toString o layout val uses_defs_kills = fn NOP => {uses = [], defs = [], kills = []} | HLT => {uses = [], defs = [], kills = []} | BinAL {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pMD {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | MD {oper, src, size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.uses_defs: MD, size" in if oper = IMUL orelse oper = MUL then {uses = [src, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} else {uses = [src, Operand.register hi, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | IMUL2 {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | UnAL {dst, ...} => {uses = [dst], defs = [dst], kills = []} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.uses_defs: SRAL, size" in {uses = [count, dst, Operand.register reg], defs = [dst], kills = []} end else {uses = [count, dst], defs = [dst], kills = []} | CMP {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | TEST {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SETcc {dst, ...} => {uses = [], defs = [dst], kills = []} | JMP {target, ...} => {uses = [target], defs = [], kills = []} | Jcc {target, ...} => {uses = [target], defs = [], kills = []} | CALL {target, ...} => {uses = [target], defs = [], kills = []} | RET {src} => {uses = case src of NONE => [] | SOME src => [src], defs = [], kills = []} | MOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | CMOVcc {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XCHG {src, dst, ...} => {uses = [src,dst], defs = [src,dst], kills = []} | pPUSH {src, base, size, ...} => {uses = [src,base], defs = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), kills = []} | pPOP {dst, base, size, ...} => {uses = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), defs = [dst,base], kills = []} | PUSH {src, ...} => {uses = [src, Operand.register Register.esp], defs = [Operand.register Register.esp, Operand.address (Address.T {disp = NONE, base = SOME Register.esp, index = NONE, scale = NONE})], kills = []} | POP {dst, ...} => {uses = [Operand.register Register.esp, Operand.address (Address.T {disp = NONE, base = SOME Register.esp, index = NONE, scale = NONE})], defs = [dst, Operand.register Register.esp], kills = []} | CX {size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.uses_defs: CX, size" in {uses = [Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | MOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | LEA {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFXVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFLDC {dst, ...} => {uses = [], defs = [dst], kills = []} | pFMOVFI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOVTI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFCOM {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | pFUCOM {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | pFBinA {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pFUnA {dst, ...} => {uses = [dst], defs = [dst], kills = []} | pFPTAN {dst, ...} => {uses = [dst], defs = [dst], kills = []} | pFBinAS {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pFBinASP {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = if Operand.eq(src,dst) then [] else [src]} | FLD {src, ...} => {uses = [src], defs = [Operand.fltregister FltRegister.top], kills = []} | FST {dst, pop, ...} => {uses = [Operand.fltregister FltRegister.top], defs = [dst], kills = if pop then [Operand.fltregister FltRegister.top] else []} | FILD {src, ...} => {uses = [src], defs = [Operand.fltregister FltRegister.top], kills = []} | FIST {dst, pop, ...} => {uses = [Operand.fltregister FltRegister.top], defs = [dst], kills = if pop then [Operand.fltregister FltRegister.top] else []} | FXCH {src} => {uses = [src, Operand.fltregister FltRegister.top], defs = [src, Operand.fltregister FltRegister.top], kills = []} | FLDC {...} => {uses = [], defs = [Operand.fltregister FltRegister.top], kills = []} | FLDCW {src} => {uses = [src], defs = [], kills = []} | FSTCW {dst, ...} => {uses = [], defs = [dst], kills = []} | FSTSW {dst, ...} => {uses = [], defs = [dst], kills = []} | FCOM {src, pop, pop', ...} => {uses = [src, Operand.fltregister FltRegister.top], defs = [], kills = if pop andalso pop' then [Operand.fltregister FltRegister.top, src] else if pop then [Operand.fltregister FltRegister.top] else []} | FUCOM {src, pop, pop'} => {uses = [src, Operand.fltregister FltRegister.top], defs = [], kills = if pop andalso pop' then [Operand.fltregister FltRegister.top, src] else if pop then [Operand.fltregister FltRegister.top] else []} | FBinA {src, dst, pop, ...} => {uses = [src, dst], defs = [dst], kills = if pop then [src] else []} | FUnA {...} => {uses = [Operand.fltregister FltRegister.top], defs = [Operand.fltregister FltRegister.top], kills = []} | FPTAN => {uses = [Operand.fltregister FltRegister.top], defs = [Operand.fltregister FltRegister.top], kills = []} | FBinAS {...} => {uses = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], defs = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], kills = []} | FBinASP {...} => {uses = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], defs = [Operand.fltregister FltRegister.one], kills = [Operand.fltregister FltRegister.top]} val hints = fn pMD {dst, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc dst of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | MD {src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc src of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | SRAL {count, size, ...} => (case Operand.deMemloc count of SOME memloc => let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.hints: SRAL, size" in [(memloc, reg)] end | NONE => []) | pPUSH {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.esp)] | NONE => []) | pPOP {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.esp)] | NONE => []) | PUSH {...} => let val temp = MemLoc.temp {size = Size.LONG} in [(temp,Register.esp)] end | POP {...} => let val temp = MemLoc.temp {size = Size.LONG} in [(temp,Register.esp)] end | _ => [] val srcs_dsts = fn NOP => {srcs = NONE, dsts = NONE} | HLT => {srcs = NONE, dsts = NONE} | BinAL {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pMD {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | MD {oper, src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.srcs_dsts: MD, size" in if oper = IMUL orelse oper = MUL then {srcs = SOME [src, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} else {srcs = SOME [src, Operand.register hi, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | IMUL2 {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | UnAL {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.srcs_dsts: SRAL, size" in {srcs = SOME [count, dst, Operand.register reg], dsts = SOME [dst]} end else {srcs = SOME [count, dst], dsts = SOME [dst]} | CMP {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | TEST {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SETcc {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | JMP {target, ...} => {srcs = SOME [target], dsts = NONE} | Jcc {target, ...} => {srcs = SOME [target], dsts = NONE} | CALL {target, ...} => {srcs = SOME [target], dsts = NONE} | RET {src} => {srcs = case src of NONE => NONE | SOME src => SOME [src], dsts = NONE} | MOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | CMOVcc {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XCHG {src, dst, ...} => {srcs = SOME [src,dst], dsts = SOME [src,dst]} | pPUSH {src, base, ...} => {srcs = SOME [src,base], dsts = SOME [base]} | pPOP {dst, base, ...} => {srcs = SOME [base], dsts = SOME [dst,base]} | PUSH {src, ...} => {srcs = SOME [src, Operand.register Register.esp], dsts = SOME [Operand.register Register.esp]} | POP {dst, ...} => {srcs = SOME [Operand.register Register.esp], dsts = SOME [dst, Operand.register Register.esp]} | CX {size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.srcs_dsts: CX, size" in {srcs = SOME [Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | MOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | LEA {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFXVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFLDC {dst, ...} => {srcs = SOME [], dsts = SOME [dst]} | pFMOVFI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOVTI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFCOM {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | pFUCOM {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | pFBinA {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pFUnA {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | pFPTAN {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | pFBinAS {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pFBinASP {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | FLD {src, ...} => {srcs = SOME [src], dsts = SOME [Operand.fltregister FltRegister.top]} | FST {dst, ...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [dst]} | FILD {src, ...} => {srcs = SOME [src], dsts = SOME [Operand.fltregister FltRegister.top]} | FIST {dst, ...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [dst]} | FXCH {src} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = SOME [src, Operand.fltregister FltRegister.top]} | FLDC {...} => {srcs = NONE, dsts = SOME [Operand.fltregister FltRegister.top]} | FLDCW {src} => {srcs = SOME [src], dsts = NONE} | FSTCW {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | FSTSW {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | FCOM {src, ...} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = NONE} | FUCOM {src, ...} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = NONE} | FBinA {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | FUnA {...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [Operand.fltregister FltRegister.top]} | FPTAN => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [Operand.fltregister FltRegister.top]} | FBinAS {...} => {srcs = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], dsts = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one]} | FBinASP {...} => {srcs = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], dsts = SOME [Operand.fltregister FltRegister.one]} fun replace replacer = fn NOP => NOP | HLT => HLT | BinAL {oper, src, dst, size} => BinAL {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pMD {oper, src, dst, size} => pMD {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | MD {oper, src, size} => MD {oper = oper, src = replacer {use = true, def = false} src, size = size} | IMUL2 {src, dst, size} => IMUL2 {src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | UnAL {oper, dst, size} => UnAL {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | SRAL {oper, count, dst, size} => SRAL {oper = oper, count = replacer {use = true, def = false} count, dst = replacer {use = true, def = true} dst, size = size} | CMP {src1, src2, size} => CMP {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | TEST {src1, src2, size} => TEST {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SETcc {condition, dst, size} => SETcc {condition = condition, dst = replacer {use = false, def = true} dst, size = size} | JMP {target, absolute} => JMP {target = replacer {use = true, def = false} target, absolute = absolute} | Jcc {condition, target} => Jcc {condition = condition, target = replacer {use = true, def = false} target} | CALL {target, absolute} => CALL {target = replacer {use = true, def = false} target, absolute = absolute} | RET {src} => (case src of NONE => RET {src = NONE} | SOME src => RET {src = SOME (replacer {use = true, def = false} src)}) | MOV {src, dst, size} => MOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | CMOVcc {condition, src, dst, size} => CMOVcc {condition = condition, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | XCHG {src, dst, size} => XCHG {src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | pPUSH {src, base, size} => pPUSH {src = replacer {use = true, def = false} src, base = replacer {use = true, def = true} base, size = size} | pPOP {dst, base, size} => pPOP {dst = replacer {use = false, def = true} dst, base = replacer {use = true, def = true} base, size = size} | PUSH {src, size} => PUSH {src = replacer {use = true, def = false} src, size = size} | POP {dst, size} => POP {dst = replacer {use = false, def = true} dst, size = size} | CX {size} => CX {size = size} | MOVX {oper, src, srcsize, dst, dstsize} => MOVX {oper = oper, src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | XVOM {src, srcsize, dst, dstsize} => XVOM {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | LEA {src, dst, size} => LEA {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | pFMOV {src, dst, size} => pFMOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | pFMOVX {src, dst, srcsize, dstsize} => pFMOVX {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, srcsize = srcsize, dstsize = dstsize} | pFXVOM {src, dst, srcsize, dstsize} => pFXVOM {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, srcsize = srcsize, dstsize = dstsize} | pFLDC {oper, dst, size} => pFLDC {oper = oper, dst = replacer {use = false, def = true} dst, size = size} | pFMOVFI {src, srcsize, dst, dstsize} => pFMOVFI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | pFMOVTI {src, dst, srcsize, dstsize} => pFMOVTI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | pFCOM {src1, src2, size} => pFCOM {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | pFUCOM {src1, src2, size} => pFUCOM {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | pFBinA {oper, src, dst, size} => pFBinA {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pFUnA {oper, dst, size} => pFUnA {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | pFPTAN {dst, size} => pFPTAN {dst = replacer {use = true, def = true} dst, size = size} | pFBinAS {oper, src, dst, size} => pFBinAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pFBinASP {oper, src, dst, size} => pFBinASP {oper = oper, src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | FLD {src, size} => FLD {src = replacer {use = true, def = false} src, size = size} | FST {dst, size, pop} => FST {dst = replacer {use = false, def = true} dst, size = size, pop = pop} | FILD {src, size} => FILD {src = replacer {use = true, def = false} src, size = size} | FIST {dst, size, pop} => FIST {dst = replacer {use = false, def = true} dst, size = size, pop = pop} | FXCH {src} => FXCH {src = replacer {use = true, def = true} src} | FLDC {oper} => FLDC {oper = oper} | FLDCW {src} => FLDCW {src = replacer {use = true, def = false} src} | FSTCW {dst, check} => FSTCW {dst = replacer {use = false, def = true} dst, check = check} | FSTSW {dst, check} => FSTSW {dst = replacer {use = false, def = true} dst, check = check} | FCOM {src, size, pop, pop'} => FCOM {src = replacer {use = true, def = false} src, size = size, pop = pop, pop' = pop'} | FUCOM {src, pop, pop'} => FUCOM {src = replacer {use = true, def = false} src, pop = pop, pop' = pop'} | FBinA {oper, src, dst, size, pop} => FBinA {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size, pop = pop} | FUnA {oper} => FUnA {oper = oper} | FPTAN => FPTAN | FBinAS {oper} => FBinAS {oper = oper} | FBinASP {oper} => FBinASP {oper = oper} val nop = fn () => NOP val hlt = fn () => HLT val binal = BinAL val pmd = pMD val md = MD val imul2 = IMUL2 val unal = UnAL val sral = SRAL val cmp = CMP val test = TEST val setcc = SETcc val jmp = JMP val jcc = Jcc val call = CALL val ret = RET val mov = MOV val cmovcc = CMOVcc val xchg = XCHG val ppush = pPUSH val ppop = pPOP val push = PUSH val pop = POP val cx = CX val movx = MOVX val xvom = XVOM val lea = LEA val pfmov = pFMOV val pfmovx = pFMOVX val pfxvom = pFXVOM val pfldc = pFLDC val pfmovfi = pFMOVFI val pfmovti = pFMOVTI val pfcom = pFCOM val pfucom = pFUCOM val pfbina = pFBinA val pfuna = pFUnA val pfptan = pFPTAN val pfbinas = pFBinAS val pfbinasp = pFBinASP val fld = FLD val fst = FST val fild = FILD val fist = FIST val fxch = FXCH val fldc = FLDC val fldcw = FLDCW val fstcw = FSTCW val fstsw = FSTSW val fcom = FCOM val fucom = FUCOM val fbina = FBinA val funa = FUnA val fptan = fn () => FPTAN val fbinas = FBinAS val fbinasp = FBinASP end structure Directive = struct structure Id = struct val nextNum = Counter.generator 0 datatype t = T of {num : int, plist: PropertyList.t} fun new () = T {num = nextNum (), plist = PropertyList.new ()} val plist = fn T {plist, ...} => plist val layout = let open Layout in fn T {num, ...} => seq [str "RegAlloc", Int.layout num] end val toString = Layout.toString o layout end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | FltAssume of {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} (* Ensure that memloc is in the register, possibly reserverd; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | FltCache of {caches: {memloc: MemLoc.t} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * also, clear the flt. register stack; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src: Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers : Register.t list} (* Clear the floating point stack; * used at bot of basic blocks to establish passing convention *) | ClearFlt (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString = fn Assume {assumes} => concat["Assume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | FltAssume {assumes} => concat["FltAssume: ", "assumes: ", List.fold (assumes, "", fn ({memloc, sync, ...}, s) => concat[MemLoc.toString memloc, if sync then " (sync)" else "", " ", s])] | Cache {caches} => concat["Cache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", " ", s])] | FltCache {caches} => concat["FltCache: ", "caches: ", List.fold (caches, "", fn ({memloc}, s) => concat[MemLoc.toString memloc, " ", s])] | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => concat["Force: ", "commit_memlocs: ", MemLocSet.fold (commit_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "commit_classes: ", ClassSet.fold (commit_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "remove_memlocs: ", MemLocSet.fold (remove_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "remove_classes: ", ClassSet.fold (remove_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "dead_memlocs: ", MemLocSet.fold (dead_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "dead_classes: ", ClassSet.fold (dead_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s])] | Reset => concat["Reset"] | CCall => concat["CCall"] | Return {returns} => concat["Return: ", List.toString (fn {src,dst} => concat ["(", Operand.toString src, ",", MemLoc.toString dst, ")"]) returns] | Reserve {registers} => concat["Reserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | Unreserve {registers} => concat["Unreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | ClearFlt => concat["ClearFlt"] | SaveRegAlloc {live, id} => concat["SaveRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] | RestoreRegAlloc {live, id} => concat["RestoreRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] val layout = Layout.str o toString val uses_defs_kills = fn Assume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | FltAssume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = defs, kills = []}) | Cache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | FltCache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = defs, kills = []}) | Reset => {uses = [], defs = [], kills = []} | Force {commit_memlocs, remove_memlocs, ...} => {uses = List.map(MemLocSet.toList commit_memlocs, Operand.memloc) @ List.map(MemLocSet.toList remove_memlocs, Operand.memloc), defs = [], kills = []} | CCall => {uses = [], defs = [], kills = []} | Return {returns} => let val uses = List.map(returns, fn {src, ...} => src) val defs = List.map(returns, fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = defs, kills = []} end | Reserve {...} => {uses = [], defs = [], kills = []} | Unreserve {...} => {uses = [], defs = [], kills = []} | ClearFlt => {uses = [], defs = [], kills = []} | SaveRegAlloc {live, ...} => {uses = List.map(MemLocSet.toList live, Operand.memloc), defs = [], kills = []} | RestoreRegAlloc {...} => {uses = [], defs = [], kills = []} val hints = fn Cache {caches} => List.map (caches, fn {register, memloc, ...} => (memloc, register)) | _ => [] fun replace replacer = fn Assume {assumes} => Assume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | FltAssume {assumes} => FltAssume {assumes = List.map (assumes, fn {memloc, weight, sync} => {memloc = memloc, weight = weight, sync = sync})} | Cache {caches} => Cache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.register register) of Operand.Register register => register | _ => Error.bug "x86.Directive.replace: Cache, register", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Cache, memloc", reserve = reserve})} | FltCache {caches} => FltCache {caches = List.map (caches, fn {memloc} => {memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: FltCache, memloc"})} | Reset => Reset | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => Force {commit_memlocs = MemLocSet.map (commit_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, commit_memlocs"), commit_classes = commit_classes, remove_memlocs = MemLocSet.map (remove_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, remove_memlocs"), remove_classes = remove_classes, dead_memlocs = MemLocSet.map (dead_memlocs, fn memloc => case replacer {use = false, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, dead_memlocs"), dead_classes = dead_classes} | CCall => CCall | Return {returns} => Return {returns = List.map (returns, fn {src,dst} => {src = src, dst = case replacer {use = true, def = false} (Operand.memloc dst) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Return, returns"})} | Reserve {registers} => Reserve {registers = registers} | Unreserve {registers} => Unreserve {registers = registers} | ClearFlt => ClearFlt | SaveRegAlloc {live, id} => SaveRegAlloc {live = live, id = id} | RestoreRegAlloc {live, id} => RestoreRegAlloc {live = live, id = id} val assume = Assume val fltassume = FltAssume val cache = Cache val fltcache = FltCache val reset = fn () => Reset val force = Force val ccall = fn () => CCall val return = Return val reserve = Reserve val unreserve = Unreserve val saveregalloc = SaveRegAlloc val restoreregalloc = RestoreRegAlloc val clearflt = fn () => ClearFlt end structure PseudoOp = struct datatype t = Data | Text | SymbolStub | NonLazySymbolPointer | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val layout = let open Layout in fn Data => str ".data" | Text => str ".text" | SymbolStub => str ".section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5" | NonLazySymbolPointer => str ".section __IMPORT,__pointers,non_lazy_symbol_pointers" | Balign (i,fill,max) => seq [str ".balign ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | P2align (i,fill,max) => seq [str ".p2align ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | Space (i,f) => seq [str ".space ", Immediate.layout i, str ",", Immediate.layout f] | Byte bs => seq [str ".byte ", seq (separate(List.map (bs, Immediate.layout), ","))] | Word ws => seq [str ".word ", seq (separate(List.map (ws, Immediate.layout), ","))] | Long ls => seq [str ".long ", seq (separate(List.map (ls, Immediate.layout), ","))] | String ss => seq [str ".ascii ", seq (separate(List.map (ss, fn s => seq [str "\"", str (String_escapeASM s), str "\""]), ","))] | Global l => seq [str ".globl ", Label.layout l] | Hidden l => (* visibility directive depends on target object file *) let val elf = seq [str ".hidden ", Label.layout l] val macho = seq [str ".private_extern ", Label.layout l] val coff = seq [str "/* ", str ".hidden ", Label.layout l, str " */"] in case !Control.Target.os of MLton.Platform.OS.Cygwin => coff | MLton.Platform.OS.Darwin => macho | MLton.Platform.OS.MinGW => coff | _ => elf end | IndirectSymbol l => seq [str ".indirect_symbol ", Label.layout l] | Local l => seq [str ".local ", Label.layout l] | Comm (l, i, a) => seq [str ".comm ", Label.layout l, str ",", Immediate.layout i, case a of NONE => empty | SOME i => seq [str ",", Immediate.layout i]] end val toString = Layout.toString o layout fun replace replacer = let val replacerLabel = fn label => case Operand.deLabel (replacer {use = true, def = false} (Operand.label label)) of SOME label => label | NONE => Error.bug "x86.PseudoOp.replace.replacerLabel" val replacerImmediate = fn immediate => case Operand.deImmediate (replacer {use = true, def = false} (Operand.immediate immediate)) of SOME immediate => immediate | NONE => Error.bug "x86.PseudoOp.replace.replacerImmediate" in fn Data => Data | Text => Text | SymbolStub => SymbolStub | NonLazySymbolPointer => NonLazySymbolPointer | Balign (i,fill,max) => Balign (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | P2align (i,fill,max) => P2align (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | Space (i,f) => Space (replacerImmediate i, replacerImmediate f) | Byte bs => Byte (List.map(bs, replacerImmediate)) | Word ws => Word (List.map(ws, replacerImmediate)) | Long ls => Long (List.map(ls, replacerImmediate)) | String ss => String ss | Global l => Global (replacerLabel l) | Hidden l => Hidden (replacerLabel l) | IndirectSymbol l => IndirectSymbol (replacerLabel l) | Local l => Local (replacerLabel l) | Comm (l, i, a) => Comm (replacerLabel l, replacerImmediate i, Option.map(a, replacerImmediate)) end val data = fn () => Data val text = fn () => Text val symbol_stub = fn () => SymbolStub val non_lazy_symbol_pointer = fn () => NonLazySymbolPointer val balign = Balign val p2align = P2align val space = Space val byte = Byte val word = Word val long = Long val string = String val global = Global val hidden = Hidden val indirect_symbol = IndirectSymbol val locall = Local val comm = Comm end structure Assembly = struct datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout = let open Layout in fn Comment s => seq [str "/* ", str s, str " */"] | Directive d => seq [str "# directive: ", Directive.layout d] | PseudoOp p => seq [PseudoOp.layout p] | Label l => seq [Label.layout l, str ":"] | Instruction i => seq [str "\t", Instruction.layout i] end val toString = Layout.toString o layout val uses_defs_kills = fn Comment _ => {uses = [], defs = [], kills = []} | Directive d => Directive.uses_defs_kills d | PseudoOp _ => {uses = [], defs = [], kills = []} | Label _ => {uses = [], defs = [], kills = []} | Instruction i => Instruction.uses_defs_kills i val hints = fn Comment _ => [] | Directive d => Directive.hints d | PseudoOp _ => [] | Label _ => [] | Instruction i => Instruction.hints i fun replace replacer = fn Comment s => Comment s | Directive d => Directive (Directive.replace replacer d) | PseudoOp p => PseudoOp (PseudoOp.replace replacer p) | Label l => Label (case Operand.deLabel (replacer {use = false, def = true} (Operand.label l)) of SOME l => l | NONE => Error.bug "x86.Assembly.replace, Label") | Instruction i => Instruction (Instruction.replace replacer i) val comment = Comment val isComment = fn Comment _ => true | _ => false val directive = Directive val directive_assume = Directive o Directive.assume val directive_fltassume = Directive o Directive.fltassume val directive_cache = Directive o Directive.cache val directive_fltcache = Directive o Directive.fltcache val directive_reset = Directive o Directive.reset val directive_force = Directive o Directive.force val directive_ccall = Directive o Directive.ccall val directive_return = Directive o Directive.return val directive_reserve = Directive o Directive.reserve val directive_unreserve = Directive o Directive.unreserve val directive_saveregalloc = Directive o Directive.saveregalloc val directive_restoreregalloc = Directive o Directive.restoreregalloc val directive_clearflt = Directive o Directive.clearflt val pseudoop = PseudoOp val pseudoop_data = PseudoOp o PseudoOp.data val pseudoop_text = PseudoOp o PseudoOp.text val pseudoop_symbol_stub = PseudoOp o PseudoOp.symbol_stub val pseudoop_non_lazy_symbol_pointer = PseudoOp o PseudoOp.non_lazy_symbol_pointer val pseudoop_balign = PseudoOp o PseudoOp.balign val pseudoop_p2align = PseudoOp o PseudoOp.p2align val pseudoop_space = PseudoOp o PseudoOp.space val pseudoop_byte = PseudoOp o PseudoOp.byte val pseudoop_word = PseudoOp o PseudoOp.word val pseudoop_long = PseudoOp o PseudoOp.long val pseudoop_string = PseudoOp o PseudoOp.string val pseudoop_global = PseudoOp o PseudoOp.global val pseudoop_hidden = PseudoOp o PseudoOp.hidden val pseudoop_indirect_symbol = PseudoOp o PseudoOp.indirect_symbol val pseudoop_local = PseudoOp o PseudoOp.locall val pseudoop_comm = PseudoOp o PseudoOp.comm val label = Label val instruction = Instruction val instruction_nop = Instruction o Instruction.nop val instruction_hlt = Instruction o Instruction.hlt val instruction_binal = Instruction o Instruction.binal val instruction_pmd = Instruction o Instruction.pmd val instruction_md = Instruction o Instruction.md val instruction_imul2 = Instruction o Instruction.imul2 val instruction_unal = Instruction o Instruction.unal val instruction_sral = Instruction o Instruction.sral val instruction_cmp = Instruction o Instruction.cmp val instruction_test = Instruction o Instruction.test val instruction_setcc = Instruction o Instruction.setcc val instruction_jmp = Instruction o Instruction.jmp val instruction_jcc = Instruction o Instruction.jcc val instruction_call = Instruction o Instruction.call val instruction_ret = Instruction o Instruction.ret val instruction_mov = Instruction o Instruction.mov val instruction_cmovcc = Instruction o Instruction.cmovcc val instruction_xchg = Instruction o Instruction.xchg val instruction_ppush = Instruction o Instruction.ppush val instruction_ppop = Instruction o Instruction.ppop val instruction_push = Instruction o Instruction.push val instruction_pop = Instruction o Instruction.pop val instruction_cx = Instruction o Instruction.cx val instruction_movx = Instruction o Instruction.movx val instruction_xvom = Instruction o Instruction.xvom val instruction_lea = Instruction o Instruction.lea val instruction_pfmov = Instruction o Instruction.pfmov val instruction_pfmovx = Instruction o Instruction.pfmovx val instruction_pfxvom = Instruction o Instruction.pfxvom val instruction_pfldc = Instruction o Instruction.pfldc val instruction_pfmovfi = Instruction o Instruction.pfmovfi val instruction_pfmovti = Instruction o Instruction.pfmovti val instruction_pfcom = Instruction o Instruction.pfcom val instruction_pfucom = Instruction o Instruction.pfucom val instruction_pfbina = Instruction o Instruction.pfbina val instruction_pfuna = Instruction o Instruction.pfuna val instruction_pfptan = Instruction o Instruction.pfptan val instruction_pfbinas = Instruction o Instruction.pfbinas val instruction_pfbinasp = Instruction o Instruction.pfbinasp val instruction_fld = Instruction o Instruction.fld val instruction_fst = Instruction o Instruction.fst val instruction_fild = Instruction o Instruction.fild val instruction_fist = Instruction o Instruction.fist val instruction_fxch = Instruction o Instruction.fxch val instruction_fldc = Instruction o Instruction.fldc val instruction_fldcw = Instruction o Instruction.fldcw val instruction_fstcw = Instruction o Instruction.fstcw val instruction_fstsw = Instruction o Instruction.fstsw val instruction_fcom = Instruction o Instruction.fcom val instruction_fucom = Instruction o Instruction.fucom val instruction_fbina = Instruction o Instruction.fbina val instruction_funa = Instruction o Instruction.funa val instruction_fptan = Instruction o Instruction.fptan val instruction_fbinas = Instruction o Instruction.fbinas val instruction_fbinasp = Instruction o Instruction.fbinasp end structure FrameInfo = struct datatype t = T of {size: int, frameInfosIndex: int} fun toString (T {size, frameInfosIndex}) = concat ["{", "size = ", Int.toString size, ", ", "frameInfosIndex = ", Int.toString frameInfosIndex, "}"] end structure Entry = struct datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val toString = fn Jump {label} => concat ["Jump::", Label.toString label] | Func {label, live} => concat ["Func::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Cont {label, live, frameInfo} => concat ["Cont::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] ", FrameInfo.toString frameInfo] | Handler {frameInfo, label, live} => concat ["Handler::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] (", FrameInfo.toString frameInfo, ")"] | CReturn {dsts, frameInfo, func, label} => concat ["CReturn::", Label.toString label, " ", Vector.toString (fn (dst,_) => Operand.toString dst) dsts, " ", (CFunction.Target.toString o CFunction.target) func, " ", case frameInfo of NONE => "" | SOME f => FrameInfo.toString f] val uses_defs_kills = fn CReturn {dsts, func, ...} => let val uses = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = Vector.toListMap(dsts, fn (dst, _) => dst), kills = []} end | _ => {uses = [], defs = [], kills = []} val label = fn Jump {label, ...} => label | Func {label, ...} => label | Cont {label, ...} => label | Handler {label, ...} => label | CReturn {label, ...} => label val live = fn Func {live, ...} => live | Cont {live, ...} => live | Handler {live, ...} => live | _ => MemLocSet.empty val jump = Jump val func = Func val isFunc = fn Func _ => true | _ => false val cont = Cont val handler = Handler val creturn = CReturn end structure Transfer = struct structure Cases = struct datatype 'a t = Word of (WordX.t * 'a) list val word = Word fun isEmpty cases = case cases of Word [] => true | _ => false fun isSingle cases = case cases of Word [_] => true | _ => false fun extract(cases,f) = let fun doit [(k,target)] = f (k, target) | doit _ = Error.bug "x86.Transfer.Cases.extract" in case cases of Word cases => doit cases end fun count(cases, p) = let fun doit [] = (0 : int) | doit ((_,target)::cases) = let val n = doit cases in if p target then 1 + n else n end in case cases of Word cases => doit cases end fun keepAll(cases, p) = let fun doit l = List.keepAll(l, fn (k,target) => p (k,target)) in case cases of Word cases => Word(doit cases) end fun forall(cases, f) = let fun doit l = List.forall(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun foreach(cases, f) = let fun doit l = List.foreach(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun map(cases, f) = let fun doit l = List.map(l, fn (k,target) => (k, f (k, target))) in case cases of Word cases => Word(doit cases) end fun mapToList(cases, f) = let fun doit l = List.map(l, fn (k,target) => f (k, target)) in case cases of Word cases => doit cases end end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} val toString = fn Goto {target} => concat ["GOTO ", Label.toString target] | Iff {condition, truee, falsee} => concat["IF ", Instruction.condition_toString condition, " THEN GOTO ", Label.toString truee, " ELSE GOTO ", Label.toString falsee] | Switch {test, cases, default} => (concat["SWITCH ", Operand.toString test]) ^ (concat o Cases.mapToList) (cases, fn (w, target) => concat[" (", WordX.toString (w, {suffix = true}), " -> GOTO ", Label.toString target, ")"]) ^ (concat[" GOTO ", Label.toString default]) | Tail {target, live} => concat ["TAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | NonTail {target, live, return, handler, size} => concat ["NONTAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] <", Label.toString return, " ", Int.toString size, "> {", case handler of SOME handler => Label.toString handler | NONE => "", "}"] | Return {live} => concat ["RETURN", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Raise {live} => concat ["RAISE", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | CCall {args, func, return, ...} => concat ["CCALL ", (CFunction.Convention.toString o CFunction.convention) func, " ", (CFunction.Target.toString o CFunction.target) func, "(", (concat o List.separate) (List.map(args, fn (oper,_) => Operand.toString oper), ", "), ") <", Option.toString (fn {return, size} => concat ["(", Label.toString return, ", ", Option.toString Int.toString size, ")"]) return, ">"] val uses_defs_kills = fn Switch {test, ...} => {uses = [test], defs = [], kills = []} | CCall {args, func, ...} => let val defs = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = List.map(args, fn (oper,_) => oper), defs = defs, kills = []} end | _ => {uses = [], defs = [], kills = []} val nearTargets = fn Goto {target} => [target] | Iff {truee,falsee,...} => [truee,falsee] | Switch {cases,default,...} => default::(Cases.mapToList (cases, fn (_,target) => target)) | NonTail {return,handler,...} => return::(case handler of NONE => nil | SOME handler => [handler]) | CCall {return, ...} => (case return of NONE => [] | SOME {return, ...} => [return]) | _ => [] val live = fn Tail {live,...} => live | NonTail {live,...} => live | Return {live,...} => live | Raise {live,...} => live | _ => MemLocSet.empty fun replace replacer = fn Switch {test, cases, default} => Switch {test = replacer {use = true, def = false} test, cases = cases, default = default} | CCall {args, func, return} => CCall {args = List.map(args, fn (oper,size) => (replacer {use = true, def = false} oper, size)), func = func, return = return} | transfer => transfer val goto = Goto val iff = Iff val switch = Switch val tail = Tail val nontail = NonTail val return = Return val raisee = Raise val ccall = CCall end structure ProfileLabel = struct open ProfileLabel fun toAssembly pl = let val label = Label.fromString (toString pl) in [Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label] end fun toAssemblyOpt pl = case pl of NONE => [] | SOME pl => toAssembly pl end structure Block = struct datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} fun mkBlock' {entry, statements, transfer} = T' {entry = entry, profileLabel = NONE, statements = statements, transfer = transfer} fun mkProfileBlock' {profileLabel} = T' {entry = NONE, profileLabel = SOME profileLabel, statements = [], transfer = NONE} datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} fun printBlock (T {entry, profileLabel, statements, transfer, ...}) = (print (Entry.toString entry); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (Transfer.toString transfer); print "\n") fun printBlock' (T' {entry, profileLabel, statements, transfer, ...}) = (print (if isSome entry then Entry.toString (valOf entry) else "---"); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (if isSome transfer then Transfer.toString (valOf transfer) else "NONE"); print "\n") val compress': t' list -> t' list = fn l => List.fold (rev l, [], fn (b' as T' {entry, profileLabel, statements, transfer}, ac) => case transfer of SOME _ => b' :: ac | NONE => case ac of [] => Error.bug "x86.Block.compress': dangling transfer" | b2' :: ac => let val T' {entry = entry2, profileLabel = profileLabel2, statements = statements2, transfer = transfer2} = b2' in case entry2 of SOME _ => Error.bug "x86.Block.compress': mismatched transfer" | NONE => let val (pl, ss) = case (profileLabel, statements) of (NONE, []) => (profileLabel2, statements2) | _ => (profileLabel, statements @ (ProfileLabel.toAssemblyOpt profileLabel2) @ statements2) in T' {entry = entry, profileLabel = pl, statements = ss, transfer = transfer2} :: ac end end) val compress: t' list -> t list = fn l => List.map (compress' l, fn T' {entry, profileLabel, statements, transfer} => case (entry, transfer) of (SOME e, SOME t) => T {entry = e, profileLabel = profileLabel, statements = statements, transfer = t} | _ => Error.bug "x86.Block.compress") end structure Chunk = struct datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20210117+dfsg/mlton/codegen/x86-codegen/x86.sig000066400000000000000000001314171416264345000217520ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature X86_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure ProfileLabel: PROFILE_LABEL structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize end signature X86 = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val toString : t -> string val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val toFPI : t -> t val eq : t * t -> bool val lt : t * t -> bool end structure Register : sig datatype reg = EAX | EBX | ECX | EDX | EDI | ESI | EBP | ESP val allReg : reg list datatype part = E | X | L | H datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list (* val return : Size.t -> t *) val eax : t val ebx : t val ecx : t val edx : t val al : t val bl : t val cl : t val dl : t val edi : t val esi : t val esp : t val ebp : t val registers : Size.t -> t list val baseRegisters : t list val indexRegisters : t list val callerSaveRegisters : t list val calleeSaveRegisters : t list val withLowPart : Size.t * Size.t -> t list val lowPartOf : t * Size.t -> t end structure FltRegister : sig datatype t = T of int val toString : t -> string val eq: t * t -> bool (* val return : t *) val top : t val one : t val total : int val push : t -> t val pop : t -> t val id : t -> t end structure Immediate : sig type t datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t val deLabel : t -> Label.t option val destruct : t -> u val clearAll : unit -> unit val eval : t -> WordX.t option val isZero : t -> bool val eq : t * t -> bool end structure Scale : sig datatype t = One | Two | Four | Eight val eq : t * t -> bool val toWordX : t -> WordX.t val toImmediate : t -> Immediate.t val fromBytes : int -> t val fromCType : CType.t -> t end structure Address : sig datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} end structure MemLoc : sig structure Class : sig type t val toString : t -> string val new : {name: string} -> t val Temp : t val StaticTemp : t val CStack : t val Code : t val eq : t * t -> bool val compare : t * t -> order end type t datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} val layout : t -> Layout.t val toString : t -> string val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val destruct : t -> u val clearAll : unit -> unit val size : t -> Size.t val class : t -> Class.t val eq : t * t -> bool val compare : t * t -> order val utilized : t -> t list val mayAlias : t * t -> bool val mayAliasOrd : t * t -> order option val replace : (t -> t) -> t -> t (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t (* CReturn locations *) (* val cReturnTempContent : Size.t -> t val cReturnTempContents : CFunction.CType.t -> t list *) end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig datatype t = Register of Register.t | FltRegister of FltRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val layout : t -> Layout.t val toString : t -> string val register : Register.t -> t val deRegister : t -> Register.t option val fltregister : FltRegister.t -> t val deFltregister : t -> FltRegister.t option val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val address : Address.t -> t val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool val cReturnTemps: RepType.t -> {src: t, dst: MemLoc.t} list end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_reverse : fbina -> fbina (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) (* x86 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump; p. 373 *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move. *) | pFMOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move with extension. *) | pFMOVX of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move with contraction. *) | pFXVOM of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point load constant. *) | pFLDC of {oper: fldc, dst: Operand.t, size: Size.t} (* Pseudo floating-point move from integer. *) | pFMOVFI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move to integer. *) | pFMOVTI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point compare. *) | pFCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point unordered compare. *) | pFUCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic instructions. *) | pFBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point unary arithmetic instructions. *) | pFUnA of {oper: funa, dst: Operand.t, size: Size.t} (* Pseudo floating-point partial tangetn instruction. *) | pFPTAN of {dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack instructions. *) | pFBinAS of {oper: fbinas, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack pop instructions. *) | pFBinASP of {oper: fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} (* Floating-point load real. *) | FLD of {src: Operand.t, size: Size.t} (* Floating-point store real. *) | FST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point load integer. *) | FILD of {src: Operand.t, size: Size.t} (* Floating-point store integer. *) | FIST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point exchange. *) | FXCH of {src: Operand.t} (* Floating-point load constant. *) | FLDC of {oper: fldc} (* Floating-point load control word. *) | FLDCW of {src: Operand.t} (* Floating-point store control word. *) | FSTCW of {dst: Operand.t, check: bool} (* Floating-point store status word. *) | FSTSW of {dst: Operand.t, check: bool} (* Floating-point compare. *) | FCOM of {src: Operand.t, size: Size.t, pop: bool, pop': bool} (* Floating-point unordered compare. *) | FUCOM of {src: Operand.t, pop: bool, pop': bool} (* Floating-point binary arithmetic instructions. *) | FBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} (* Floating-point unary arithmetic instructions. *) | FUnA of {oper: funa} (* Floating-point partial tangent instruction. *) | FPTAN (* Floating-point binary arithmetic stack instructions. *) | FBinAS of {oper: fbinas} (* Floating-point binary arithmetic stack pop instructions. *) | FBinASP of {oper: fbinasp} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val srcs_dsts : t -> {srcs: Operand.t list option, dsts: Operand.t list option} val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t end structure Directive : sig structure Id : sig type t val new : unit -> t val plist : t -> PropertyList.t end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | FltAssume of {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | FltCache of {caches: {memloc: MemLoc.t} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * also, clear the flt. register stack; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src:Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers: Register.t list} (* Clear the floating point stack; * used at bot of basic blocks to establish passing convention, *) | ClearFlt (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val fltassume : {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} -> t val cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val fltcache : {caches: {memloc: MemLoc.t} list} -> t val reset : unit -> t val force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val ccall : unit -> t val return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val reserve : {registers: Register.t list} -> t val unreserve : {registers: Register.t list} -> t val clearflt : unit -> t val saveregalloc : {live: MemLocSet.t, id: Id.t} -> t val restoreregalloc : {live: MemLocSet.t, id: Id.t} -> t end structure PseudoOp : sig datatype t = Data | Text | SymbolStub | NonLazySymbolPointer | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val toString : t -> string val data : unit -> t val text : unit -> t val symbol_stub : unit -> t val non_lazy_symbol_pointer : unit -> t val balign : Immediate.t * Immediate.t option * Immediate.t option -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val space : Immediate.t * Immediate.t -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val string : string list -> t val global : Label.t -> t val hidden : Label.t -> t val indirect_symbol : Label.t -> t val locall : Label.t -> t val comm : Label.t * Immediate.t * Immediate.t option -> t end structure Assembly : sig datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout : t -> Layout.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val comment : string -> t val isComment : t -> bool val directive : Directive.t -> t val directive_assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_fltassume : {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} -> t val directive_cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_fltcache : {caches: {memloc: MemLoc.t} list} -> t val directive_reset : unit -> t val directive_force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val directive_ccall : unit -> t val directive_return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val directive_reserve : {registers: Register.t list} -> t val directive_unreserve : {registers: Register.t list} -> t val directive_saveregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_restoreregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_clearflt : unit -> t val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_non_lazy_symbol_pointer : unit -> t val pseudoop_balign : Immediate.t * Immediate.t option * Immediate.t option ->t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_space : Immediate.t * Immediate.t -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_string : string list -> t val pseudoop_global : Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_local : Label.t -> t val pseudoop_comm : Label.t * Immediate.t * Immediate.t option -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_hlt : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_md : {oper: Instruction.md, src: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_push : {src: Operand.t, size: Size.t} -> t val instruction_pop : {dst: Operand.t, size: Size.t} -> t val instruction_cx : {size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmovx : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfxvom : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfldc : {oper: Instruction.fldc, dst: Operand.t, size: Size.t} -> t val instruction_pfmovfi : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfmovti : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfcom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfucom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfuna : {oper: Instruction.funa, dst: Operand.t, size: Size.t} -> t val instruction_pfptan : {dst: Operand.t, size: Size.t} -> t val instruction_pfbinas : {oper: Instruction.fbinas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfbinasp : {oper: Instruction.fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_fld : {src: Operand.t, size: Size.t} -> t val instruction_fst : {dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_fild : {src: Operand.t, size: Size.t} -> t val instruction_fist : {dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_fxch : {src: Operand.t} -> t val instruction_fldc : {oper: Instruction.fldc} -> t val instruction_fldcw : {src: Operand.t} -> t val instruction_fstcw : {dst: Operand.t, check: bool} -> t val instruction_fstsw : {dst: Operand.t, check: bool} -> t val instruction_fcom : {src: Operand.t, size: Size.t, pop: bool, pop': bool} -> t val instruction_fucom : {src: Operand.t, pop: bool, pop': bool} -> t val instruction_fbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_funa : {oper: Instruction.funa} -> t val instruction_fptan : unit -> t val instruction_fbinas : {oper: Instruction.fbinas} -> t val instruction_fbinasp : {oper: Instruction.fbinasp} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameInfosIndex: int} end structure Entry: sig datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val cont : {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func : {label: Label.t, live: MemLocSet.t} -> t val handler : {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val isFunc : t -> bool val jump : {label: Label.t} -> t val label : t -> Label.t val live : t -> MemLocSet.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} end structure Transfer : sig structure Cases : sig datatype 'a t = Word of (WordX.t * 'a) list val word : (WordX.t * 'a) list -> 'a t val isEmpty : 'a t -> bool val isSingle : 'a t -> bool val extract : 'a t * (WordX.t * 'a -> 'b) -> 'b val count : 'a t * ('a -> bool) -> int val keepAll : 'a t * (WordX.t * 'a -> bool) -> 'a t val forall : 'a t * (WordX.t * 'a -> bool) -> bool val foreach : 'a t * (WordX.t * 'a -> unit) -> unit val map : 'a t * (WordX.t * 'a -> 'b) -> 'b t val mapToList : 'a t * (WordX.t * 'a -> 'b) -> 'b list end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val nearTargets : t -> Label.t list val live : t -> MemLocSet.t val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall: {args: (Operand.t * Size.t) list, func: RepType.t CFunction.t, return: {return: Label.t, size: int option} option} -> t end structure ProfileLabel : sig include PROFILE_LABEL val toAssembly : t -> Assembly.t list val toAssemblyOpt : t option -> Assembly.t list end structure Block : sig datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} val printBlock : t -> unit val compress : t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20210117+dfsg/mlton/control/000077500000000000000000000000001416264345000166375ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/control/.gitignore000066400000000000000000000000361416264345000206260ustar00rootroot00000000000000/version.sml /version_sml.chk mlton-20210117+dfsg/mlton/control/bits.sml000066400000000000000000000145021416264345000203170ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local structure All:> sig type bits type bytes structure Bits: sig eqtype t val + : t * t -> t val - : t * t -> t val ~ : t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool (* val align: t * {alignment: t} -> t *) val alignDown: t * {alignment: t} -> t (* val alignWord32: t -> t *) (* val alignWord64: t -> t *) val compare: t * t -> Relation.t val equals: t * t -> bool val fromInt: int -> t val fromIntInf: IntInf.t -> t val hash: t -> word val inByte: t val inWord8: t val inWord16: t val inWord32: t val inWord64: t val isAligned: t * {alignment: t} -> bool val isByteAligned: t -> bool val isPrim: t -> bool val isWord8Aligned: t -> bool val isWord16Aligned: t -> bool val isWord32Aligned: t -> bool val isWord64Aligned: t -> bool val isZero: t -> bool val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val one: t val prims: t list val toBytes: t -> bytes val toInt: t -> int val toIntInf: t -> IntInf.t val toString: t -> string val toWord: t -> word val zero: t end structure Bytes: sig type t val * : t * IntInf.int -> t val + : t * t -> t val - : t * t -> t val ~ : t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val align: t * {alignment: t} -> t (* val alignDown: t * {alignment: t} -> t *) (* val alignWord8: t -> t *) (* val alignWord16: t -> t *) val alignWord32: t -> t val alignWord64: t -> t val compare: t * t -> Relation.t val equals: t * t -> bool val fromInt: int -> t val fromIntInf: IntInf.t -> t val hash: t -> word val inWord8: t val inWord16: t val inWord32: t val inWord64: t val isAligned: t * {alignment: t} -> bool (* val isWord32Aligned: t -> bool *) (* val isWord64Aligned: t -> bool *) val isZero: t -> bool val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val one: t val prims: t list val toBits: t -> Bits.t val toInt: t -> int val toIntInf: t -> IntInf.t val toString: t -> string val zero: t end sharing type bits = Bits.t sharing type bytes = Bytes.t end = struct type bits = IntInf.t type bytes = IntInf.t val rem = IntInf.rem fun align (b, {alignment = a}) = let val b = b + (a - 1) in b - rem (b, a) end fun alignDown (b, {alignment = a}) = let in b - rem (b, a) end structure Bits = struct open IntInf val inByte: bits = 8 val inWord8: bits = 8 val inWord16: bits = 16 val inWord32: bits = 32 val inWord64: bits = 64 val prims = [inWord8, inWord16, inWord32, inWord64] fun isPrim b = List.contains (prims, b, equals) fun isAligned (b, {alignment = a}) = 0 = rem (b, a) fun isByteAligned b = isAligned (b, {alignment = inByte}) fun isWord8Aligned b = isAligned (b, {alignment = inWord8}) fun isWord16Aligned b = isAligned (b, {alignment = inWord16}) fun isWord32Aligned b = isAligned (b, {alignment = inWord32}) fun isWord64Aligned b = isAligned (b, {alignment = inWord64}) fun toBytes b = if isByteAligned b then quot (b, inByte) else Error.bug "Bits.toBytes" val toWord = Word.fromIntInf (* val align = align *) val alignDown = alignDown (* fun alignWord32 b = align (b, {alignment = inWord32}) *) (* fun alignWord64 b = align (b, {alignment = inWord64}) *) end structure Bytes = struct open IntInf val inWord8: bytes = 1 val inWord16: bytes = 2 val inWord32: bytes = 4 val inWord64: bytes = 8 val prims = [inWord8, inWord16, inWord32, inWord64] fun isAligned (b, {alignment = a}) = 0 = rem (b, a) (* fun isWord8Aligned b = isAligned (b, {alignment = inWord8}) *) (* fun isWord16Aligned b = isAligned (b, {alignment = inWord16}) *) (* fun isWord32Aligned b = isAligned (b, {alignment = inWord32}) *) (* fun isWord64Aligned b = isAligned (b, {alignment = inWord64}) *) fun toBits b = b * Bits.inByte val align = align (* val alignDown = alignDown *) (* fun alignWord8 b = align (b, {alignment = inWord8}) *) (* fun alignWord16 b = align (b, {alignment = inWord16}) *) fun alignWord32 b = align (b, {alignment = inWord32}) fun alignWord64 b = align (b, {alignment = inWord64}) end end open All in structure Bits = Bits structure Bytes = Bytes end mlton-20210117+dfsg/mlton/control/control-flags.sig000066400000000000000000000367301416264345000221260ustar00rootroot00000000000000(* Copyright (C) 2009-2012,2014-2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CONTROL_FLAGS = sig (* set all flags to their default values *) val defaults: unit -> unit val all : unit -> {name: string, value: string} list val layout': {pre: string, suf: string} -> Layout.t val layout: unit -> Layout.t structure StrMap: sig type t val load: File.t -> t val lookup: t * string -> string val lookupIntInf: t * string -> IntInf.t val peek: t * string -> string option end (*------------------------------------*) (* Begin Flags *) (*------------------------------------*) datatype align = Align4 | Align8 val align: align ref val atMLtons: string vector ref val bounceRssaLimit: int option ref val bounceRssaLiveCutoff: int option ref val bounceRssaLoopCutoff: int option ref val bounceRssaUsageCutoff: int option ref val buildConsts: StrMap.t Promise.t val chunkBatch: int ref structure Chunkify: sig datatype t = Coalesce of {limit: int} | Func | One | Simple of {mainFns: bool, sccC: bool, sccR: bool, singC: bool, singR: bool} val toString: t -> string val fromString: string -> t option end val chunkify: Chunkify.t ref val chunkJumpTable: bool ref val chunkMayRToSelfOpt: bool ref val chunkMustRToOtherOpt: bool ref val chunkMustRToSelfOpt: bool ref val chunkMustRToSingOpt: bool ref val chunkTailCall: bool ref val closureConvertGlobalize: bool ref val closureConvertShrink: bool ref structure Codegen: sig datatype t = AMD64Codegen | CCodegen | LLVMCodegen | X86Codegen val all: t list val toString: t -> string end datatype codegen = datatype Codegen.t val codegen: Codegen.t ref (* whether or not to use comments in codegen *) val codegenComments: int ref (* whether or not to fuse `op` and `opCheckP` primitives in codegen *) val codegenFuseOpAndChk: bool ref val commandLineConsts: StrMap.t val setCommandLineConst: {name: string, value: string} -> unit val contifyIntoMain: bool ref (* Generate an executable with debugging info. *) val debug: bool ref val defaultChar: string ref val defaultWideChar: string ref val defaultInt: string ref val defaultReal: string ref val defaultWord: string ref (* List of pass names to keep diagnostic info on. *) val diagPasses: Regexp.Compiled.t list ref (* List of optimization passes to disable/enable. *) val executePasses: (Regexp.Compiled.t * bool) list ref structure Elaborate: sig structure DiagEIW : sig datatype t = Error | Ignore | Warn end structure DiagDI : sig datatype t = Default | Ignore end structure ResolveScope : sig datatype t = Dec | Strdec | Topdec | Program end type ('args, 'st) t val document: {expert: bool} -> Layout.t val allowConstant: (bool,bool) t val allowFFI: (bool,bool) t val allowOverload: (bool,bool) t val allowPrim: (bool,bool) t val allowRedefineSpecialIds: (bool,bool) t val allowSpecifySpecialIds: (bool,bool) t val deadCode: (bool,bool) t val forceUsed: (unit,bool) t val ffiStr: (string,string option) t val nonexhaustiveBind: (DiagEIW.t,DiagEIW.t) t val nonexhaustiveExnBind: (DiagDI.t,DiagDI.t) t val redundantBind: (DiagEIW.t,DiagEIW.t) t val nonexhaustiveMatch: (DiagEIW.t,DiagEIW.t) t val nonexhaustiveExnMatch: (DiagDI.t,DiagDI.t) t val redundantMatch: (DiagEIW.t,DiagEIW.t) t val nonexhaustiveRaise: (DiagEIW.t,DiagEIW.t) t val nonexhaustiveExnRaise: (DiagDI.t,DiagDI.t) t val redundantRaise: (DiagEIW.t,DiagEIW.t) t val resolveScope: (ResolveScope.t,ResolveScope.t) t val sequenceNonUnit: (DiagEIW.t,DiagEIW.t) t val valrecConstr: (DiagEIW.t,DiagEIW.t) t val warnUnused: (bool,bool) t (* Successor ML *) val allowDoDecls: (bool,bool) t val allowExtendedNumConsts: (bool,bool) t val allowExtendedTextConsts: (bool,bool) t val allowLineComments: (bool,bool) t val allowOptBar: (bool,bool) t val allowOptSemicolon: (bool,bool) t val allowOrPats: (bool,bool) t val allowRecordPunExps: (bool,bool) t val allowSigWithtype: (bool,bool) t val allowVectorExps: (bool,bool) t val allowVectorPats: (bool,bool) t val current: ('args, 'st) t -> 'st val default: ('args, 'st) t -> 'st val enabled: ('args, 'st) t -> bool val expert: ('args, 'st) t -> bool val name: ('args, 'st) t -> string datatype 'a parseResult = Bad | Good of 'a | Other | Proxy of 'a list * {deprecated: bool} structure Id : sig type t val name: t -> string end val equalsId: ('args, 'st) t * Id.t -> bool val parseId: string -> Id.t parseResult structure Args : sig type t val processAnn: t -> (unit -> unit) end val parseIdAndArgs: string -> (Id.t * Args.t) parseResult val processDefault: string -> Id.t parseResult val processEnabled: string * bool -> Id.t parseResult val withDef: (unit -> 'a) -> 'a val snapshot: unit -> (unit -> 'a) -> 'a end val emitMain: bool ref val exportHeader: File.t option ref val exnHistory: bool ref structure Format: sig datatype t = Archive | Executable | LibArchive | Library val all: t list val toString: t -> string end datatype format = datatype Format.t val format: Format.t ref (* *) datatype gcCheck = Limit | First | Every val gcCheck: gcCheck ref val gcExpect: bool option ref val globalizeArrays: bool ref val globalizeRefs: bool ref val globalizeSmallIntInf: bool ref val globalizeSmallType: int ref (* Indentation used in laying out ILs. *) val indentation: int ref val inlineIntoMain: bool ref val inlineLeafA: {loops: bool, repeat: bool, size: int option} ref val inlineLeafB: {loops: bool, repeat: bool, size: int option} ref val inlineNonRec: {small: int, product: int} ref (* The input file on the command line, minus path and extension. *) val inputFile: File.t ref (* Whether or not the elaborator keeps def-use information. *) val keepDefUse: bool ref (* Keep dot files for whatever SSA files are produced. *) val keepDot: bool ref (* List of pass names to save the input/output. *) val keepPasses: Regexp.Compiled.t list ref (* Save the AST to a file. *) val keepAST: bool ref (* Save the final CoreML to a file. *) val keepCoreML: bool ref (* Save the final Machine to a file. *) val keepMachine: bool ref (* Save the final RSSA to a file. *) val keepRSSA: bool ref (* Save the final SSA to a file. *) val keepSSA: bool ref (* Save the final SSA2 to a file. *) val keepSSA2: bool ref (* Save the final SXML to a file. *) val keepSXML: bool ref (* Save the final XML to a file. *) val keepXML: bool ref (* For the codegen -- do labels for gcc and assembler need an extra leading * underscore. *) val labelsHaveExtra_: bool ref (* lib/mlton directory *) val libDir: Dir.t ref (* lib/mlton/target directory *) val libTargetDir: Dir.t ref (* name of the output library *) val libname : string ref structure LLVMAliasAnalysisMetaData: sig datatype t = None | Scope | TBAA of {gcstate: {offset: bool} option, global: {cty: bool, index: bool} option, heap: {cty: bool, kind: bool, offset: bool, tycon: bool} option, other: bool, stack: {offset: bool} option} val toString: t -> string val fromString: string -> t option end val llvmAAMD: LLVMAliasAnalysisMetaData.t ref val llvmCC10: bool ref (* Limit the code growth loop unrolling/unswitching will allow. *) val loopUnrollLimit: int ref val loopUnswitchLimit: int ref (* Should the mutator mark cards? *) val markCards: bool ref val maxFunctionSize: int ref val mlbPathVars: {var: string, path: string} list ref val mlbPathMap: unit -> {var: string, path: string} list structure Native: sig (* whether to eliminate redundant AL ops in native codegen *) val elimALRedundant: bool ref (* whether or not to track liveness of stack slots *) val liveStack: bool ref (* level of optimization to use in native codegen *) val optimize: int ref (* whether or not to use move hoisting in native codegen *) val moveHoist: bool ref (* whether or not to use copy propagation in native codegen *) val copyProp: bool ref (* Don't use copy propagation on blocks larger than this. *) val copyPropCutoff: int ref (* live transfer cutoff distance *) val cutoff: int ref (* whether or not to use live transfer in native codegen *) val liveTransfer: int ref (* whether or not to shuffle registers around C-calls *) val shuffle: bool ref (* whether or not to use strict IEEE floating-point in native codegen *) val IEEEFP: bool ref (* whether or not to split assembly file in native codegen *) val split: int option ref (* whether or not to use position-independent code in native codegen *) val pic: bool ref end val numExports: int ref val optFuel: int option ref val optFuelAvailAndUse: unit -> bool (* Control IL-specific optimization passes *) structure OptimizationPasses: sig val register: {il: string, set: string -> unit Result.t} -> unit val set: {il: string, passes: string} -> unit Result.t val setAll: string -> unit Result.t end (* Only duplicate big functions when * (size - small) * (number of occurrences - 1) <= product *) val polyvariance: { hofo: bool, rounds: int, small: int, product: int } option ref structure PositionIndependentStyle: sig datatype t = NPI | PIC | PIE val ccOpts: t option -> string list val fromString: string -> t option val linkOpts: t option -> string list val llvm_llcOpts: t option * {targetDefault: t} -> string list val toString: t -> string val toSuffix: t option -> string end val positionIndependentStyle: PositionIndependentStyle.t option ref val preferAbsPaths: bool ref (* List of pass names to keep profiling info on. *) val profPasses: Regexp.Compiled.t list ref (* Insert profiling information. *) datatype profile = ProfileNone | ProfileAlloc | ProfileCallStack | ProfileCount | ProfileDrop | ProfileLabel | ProfileTimeField | ProfileTimeLabel val profile: profile ref val profileBlock: bool ref val profileBranch: bool ref val profileC: Regexp.Compiled.t list ref datatype profileIL = ProfileSource | ProfileSSA | ProfileSSA2 val profileIL: profileIL ref val profileInclExcl: (Regexp.Compiled.t * bool) list ref val profileRaise: bool ref val profileStack: bool ref val profileVal: bool ref (* Show the basis library. *) val showBasis: File.t option ref val showBasisCompact: bool ref val showBasisDef: bool ref val showBasisFlat: bool ref (* Show def-use information. *) val showDefUse: File.t option ref (* Should types be printed in ILs. *) val showTypes: bool ref datatype splitTypesBool = Never | Smart (* split only when smaller than two, default *) | Always val splitTypesBool: splitTypesBool ref (* List of pass names to stop at. *) val stopPasses: Regexp.Compiled.t list ref datatype target = Cross of string | Self val target: target ref structure Target: sig datatype arch = datatype MLton.Platform.Arch.t val arch: arch ref val bigEndian: unit -> bool datatype os = datatype MLton.Platform.OS.t val os: os ref val consts: StrMap.t Promise.t structure Size: sig val cint: unit -> Bits.t val cpointer: unit -> Bits.t val cptrdiff: unit -> Bits.t val csize: unit -> Bits.t val header: unit -> Bits.t val mplimb: unit -> Bits.t val normalMetaData: unit -> Bits.t val objptr: unit -> Bits.t val seqIndex: unit -> Bits.t val sequenceMetaData: unit -> Bits.t end end (* Type check ILs. *) val typeCheck: bool ref structure Verbosity: sig datatype t = Silent | Top | Pass | Detail val < : t * t -> bool val <= : t * t -> bool end datatype verbosity = datatype Verbosity.t val verbosity: verbosity ref val warnAnn: bool ref val warnDeprecated: bool ref val zoneCutDepth: int ref (*------------------------------------*) (* End Flags *) (*------------------------------------*) end mlton-20210117+dfsg/mlton/control/control-flags.sml000066400000000000000000002012131416264345000221250ustar00rootroot00000000000000(* Copyright (C) 2009-2012,2014-2017,2019-2021 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure ControlFlags: CONTROL_FLAGS = struct structure StrMap = struct type t = (string, string) HashTable.t fun new (): t = HashTable.new {hash = String.hash, equals = String.equals} fun add (table, name, value) = (ignore o HashTable.lookupOrInsert) (table, name, fn () => value) fun load (f: File.t): t = let val table = new () val () = File.withIn (f, fn ins => In.foreachLine (ins, fn l => let fun err () = Error.bug (concat ["Control.StrMap.load: strange line: ", l]) in case String.peeki (l, fn (_, c) => c = #"=") of NONE => err () | SOME (i, _) => let val name = String.prefix (l, i) val name = String.deleteSurroundingWhitespace name val value = String.dropPrefix (l, i + 1) val value = String.deleteSurroundingWhitespace value in add (table, name, value) end end)) in table end fun peek (table, name) = HashTable.peek (table, name) fun lookup (table, name) = case peek (table, name) of NONE => Error.bug (concat ["Control.StrMap.lookup: ", name]) | SOME value => value fun lookupIntInf (table, name) = let val value = lookup (table, name) in case IntInf.fromString value of NONE => Error.bug (concat ["Control.StrMap.lookupIntInf: ", name, ", ", value]) | SOME ii => ii end fun lookupBool (table, name) = let val value = lookup (table, name) in case Bool.fromString value of NONE => Error.bug (concat ["Control.StrMap.lookupBool: ", name, ", ", value]) | SOME b => b end end structure C = Control () open C fun layout' {pre, suf} = let open Layout val (pre, suf) = (str pre, str suf) in align ((seq [pre, str "control flags:", suf]) :: (List.map (all (), fn {name, value} => seq [pre, str " ", str name, str ": ", str value, suf]))) end fun layout () = layout' {pre = "", suf = ""} structure Align = struct datatype t = Align4 | Align8 val toString = fn Align4 => "4" | Align8 => "8" end datatype align = datatype Align.t val align = control {name = "align", default = Align4, toString = Align.toString} val atMLtons = control {name = "atMLtons", default = Vector.new0 (), toString = fn v => Layout.toString (Vector.layout String.layout v)} val bounceRssaLimit = control {name = "bounceRssaLimit", default = SOME 8, toString = Option.toString Int.toString} val bounceRssaLiveCutoff = control {name = "bounceRssaLiveCutoff", default = SOME 12, toString = Option.toString Int.toString} val bounceRssaLoopCutoff = control {name = "bounceRssaLoopCutoff", default = SOME 40, toString = Option.toString Int.toString} val bounceRssaUsageCutoff = control {name = "bounceRssaUsageCutoff", default = SOME 15, toString = Option.toString Int.toString} val chunkBatch = control {name = "chunkBatch", default = Int.pow(2,15), toString = Int.toString} structure Chunkify = struct datatype t = Coalesce of {limit: int} | Func | One | Simple of {mainFns: bool, sccC: bool, sccR: bool, singC: bool, singR: bool} val simpleDefault = Simple {mainFns = true, sccC = true, sccR = true, singC = true, singR = true} fun toString c = case c of Coalesce {limit} => concat ["coalesce", Int.toString limit] | Func => "func" | One => "one" | Simple {mainFns, sccC, sccR, singC, singR} => let open Layout in toString (namedRecord ("simple", [("mainFns", Bool.layout mainFns), ("sccC", Bool.layout sccC), ("sccR", Bool.layout sccR), ("singC", Bool.layout singC), ("singR", Bool.layout singR)])) end fun fromString s = let open Parse infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> val p = any [str "coalesce" *> (peek (nextSat Char.isDigit) *> fromScan (Function.curry Int.scan StringCvt.DEC)) >>= (fn limit => pure (Coalesce {limit = limit})), str "func" *> pure Func, str "one" *> pure One, str "simple" *> (cbrack (ffield ("mainFns", bool) >>= (fn mainFns => nfield ("sccC", bool) >>= (fn sccC => nfield ("sccR", bool) >>= (fn sccR => nfield ("singC", bool) >>= (fn singC => nfield ("singR", bool) >>= (fn singR => pure (Simple {mainFns = mainFns, sccC = sccC, sccR = sccR, singC = singC, singR = singR}))))))) <|> pure simpleDefault)] <* failing next in case parseString (p, s) of No _ => NONE | Yes c => SOME c end end val chunkify = control {name = "chunkify", default = Chunkify.Coalesce {limit = 4096}, toString = Chunkify.toString} val chunkJumpTable = control {name = "chunkJumpTable", default = false, toString = Bool.toString} val chunkMayRToSelfOpt = control {name = "chunkMayRToSelfOpt", default = true, toString = Bool.toString} val chunkMustRToOtherOpt = control {name = "chunkMustRToOtherOpt", default = true, toString = Bool.toString} val chunkMustRToSelfOpt = control {name = "chunkMustRToSelfOpt", default = true, toString = Bool.toString} val chunkMustRToSingOpt = control {name = "chunkMustRToSingOpt", default = true, toString = Bool.toString} val chunkTailCall = control {name = "chunkTailCall", default = false, toString = Bool.toString} val closureConvertGlobalize = control {name = "closureConvertGlobalize", default = true, toString = Bool.toString} val closureConvertShrink = control {name = "closureConvertShrink", default = true, toString = Bool.toString} structure Codegen = struct datatype t = AMD64Codegen | CCodegen | LLVMCodegen | X86Codegen val all = [X86Codegen,AMD64Codegen,CCodegen,LLVMCodegen] val toString: t -> string = fn AMD64Codegen => "amd64" | CCodegen => "c" | LLVMCodegen => "llvm" | X86Codegen => "x86" end datatype codegen = datatype Codegen.t val codegen = control {name = "codegen", default = Codegen.X86Codegen, toString = Codegen.toString} val codegenComments = control {name = "codegen comments", default = 0, toString = Int.toString} val codegenFuseOpAndChk = control {name = "fuse `op` and `opCheckP` primitives in codegen", default = false, toString = Bool.toString} val contifyIntoMain = control {name = "contifyIntoMain", default = false, toString = Bool.toString} val debug = control {name = "debug", default = false, toString = Bool.toString} val defaultChar = control {name = "defaultChar", default = "char8", toString = fn s => s} val defaultWideChar = control {name = "defaultWideChar", default = "widechar32", toString = fn s => s} val defaultInt = control {name = "defaultInt", default = "int32", toString = fn s => s} val defaultReal = control {name = "defaultReal", default = "real64", toString = fn s => s} val defaultWord = control {name = "defaultWord", default = "word32", toString = fn s => s} val diagPasses = control {name = "diag passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} val executePasses = control {name = "execute passes", default = [], toString = List.toString (Layout.toString o (Layout.tuple2 (Regexp.Compiled.layout, Bool.layout)))} structure Elaborate = struct structure DiagEIW = struct datatype t = Error | Ignore | Warn val fromString: string -> t option = fn "error" => SOME Error | "ignore" => SOME Ignore | "warn" => SOME Warn | _ => NONE val toString: t -> string = fn Error => "error" | Ignore => "ignore" | Warn => "warn" end structure DiagDI = struct datatype t = Default | Ignore val fromString: string -> t option = fn "default" => SOME Default | "ignore" => SOME Ignore | _ => NONE val toString: t -> string = fn Default => "default" | Ignore => "ignore" end structure ResolveScope = struct datatype t = Dec | Strdec | Topdec | Program val fromString: string -> t option = fn "dec" => SOME Dec | "strdec" => SOME Strdec | "topdec" => SOME Topdec | "program" => SOME Program | _ => NONE val toString: t -> string = fn Dec => "dec" | Strdec => "strdec" | Topdec => "topdec" | Program => "program" end structure Id = struct datatype t = T of {enabled: bool ref, expert: bool, name: string} fun equals (T {enabled = enabled1, ...}, T {enabled = enabled2, ...}) = enabled1 = enabled2 val enabled = fn (T {enabled, ...}) => !enabled val setEnabled = fn (T {enabled, ...}, b) => (enabled := b; true) val expert = fn (T {expert, ...}) => expert val name = fn (T {name, ...}) => name end structure Args = struct datatype t = T of {fillArgs: unit -> (unit -> unit), processAnn: unit -> (unit -> unit), processDef: unit -> bool} local fun make sel (T r) = sel r in fun processAnn args = (make #processAnn args) () fun processDef args = (make #processDef args) () end end datatype ('args, 'st) t = T of {args: 'args option ref, cur: 'st ref, def: 'st ref, id: Id.t} fun current (T {cur, ...}) = !cur fun default (T {def, ...}) = !def fun id (T {id, ...}) = id fun enabled ctrl = Id.enabled (id ctrl) fun expert ctrl = Id.expert (id ctrl) fun name ctrl = Id.name (id ctrl) fun equalsId (ctrl, id') = Id.equals (id ctrl, id') datatype 'a parseResult = Bad | Good of 'a | Other | Proxy of 'a list * {deprecated: bool} val deGood = fn Good z => z | _ => Error.bug "Control.Elaborate.deGood" val documentation: {choices: string list option, expert: bool, name: string} list ref = ref [] fun document {expert} = let val all = !documentation val all = if expert then all else List.keepAll (all, not o #expert) val all = List.insertionSort (all, fn ({name = n, ...}, {name = n', ...}) => n <= n') open Layout in align (List.map (all, fn {choices, name, ...} => str (concat [name, case choices of NONE => "" | SOME cs => concat [" {", concat (List.separate (cs, "|")), "}"]]))) end local fun make ({choices: 'st list option, default: 'st, expert: bool, toString: 'st -> string, name: string, newCur: 'st * 'args -> 'st, newDef: 'st * 'args -> 'st, parseArgs: string list -> 'args option}, {parseId: string -> Id.t parseResult, parseIdAndArgs: string list -> (Id.t * Args.t) parseResult, withDef: unit -> (unit -> unit), snapshot: unit -> unit -> (unit -> unit)}) = let val () = List.push (documentation, {choices = Option.map (choices, fn cs => List.map (cs, toString)), expert = expert, name = name}) val ctrl as T {args = argsRef, cur, def, id as Id.T {enabled, ...}, ...} = T {args = ref NONE, cur = ref default, def = control {name = concat ["elaborate ", name, " (default)"], default = default, toString = toString}, id = Id.T {enabled = control {name = concat ["elaborate ", name, " (enabled)"], default = true, toString = Bool.toString}, expert = expert, name = name}} val parseId = fn name' => if String.equals (name', name) then Good id else parseId name' val parseIdAndArgs = fn ss => case ss of name'::args' => if String.equals (name', name) then case parseArgs args' of SOME v => let fun fillArgs () = (argsRef := SOME v ; fn () => argsRef := NONE) fun processAnn () = if !enabled then let val old = !cur val new = newCur (old, v) in cur := new ; fn () => cur := old end else fn () => () fun processDef () = let val old = !def val new = newDef (old, v) in def := new ; true end val args = Args.T {fillArgs = fillArgs, processAnn = processAnn, processDef = processDef} in Good (id, args) end | NONE => Bad else parseIdAndArgs ss | _ => Bad val withDef : unit -> (unit -> unit) = fn () => let val restore = withDef () val old = !cur in cur := !def ; fn () => (cur := old ; restore ()) end val snapshot : unit -> unit -> (unit -> unit) = fn () => let val withSaved = snapshot () val saved = !cur in fn () => let val restore = withSaved () val old = !cur in cur := saved ; fn () => (cur := old ; restore ()) end end in (ctrl, {parseId = parseId, parseIdAndArgs = parseIdAndArgs, withDef = withDef, snapshot = snapshot}) end fun makeBool ({default: bool, expert: bool, name: string}, ac) = make ({choices = SOME (if default then [true, false] else [false, true]), default = default, expert = expert, toString = Bool.toString, name = name, newCur = fn (_,b) => b, newDef = fn (_,b) => b, parseArgs = fn args' => case args' of [arg'] => Bool.fromString arg' | _ => NONE}, ac) fun makeDiagnostic ({choices, default, diagToString, diagFromString, expert: bool, name: string}, ac) = make ({choices = choices, default = default, expert = expert, toString = diagToString, name = name, newCur = fn (_,d) => d, newDef = fn (_,d) => d, parseArgs = fn args' => case args' of [arg'] => diagFromString arg' | _ => NONE}, ac) fun makeDiagEIW ({default: DiagEIW.t, expert: bool, name: string}, ac) = makeDiagnostic ({choices = (SOME (let datatype z = datatype DiagEIW.t in case default of Error => [Error, Ignore, Warn] | Ignore => [Ignore, Error, Warn] | Warn => [Warn, Ignore, Error] end)), default = default, diagToString = DiagEIW.toString, diagFromString = DiagEIW.fromString, expert = expert, name = name}, ac) fun makeDiagDI ({default: DiagDI.t, expert: bool, name: string}, ac) = makeDiagnostic ({choices = (SOME (let datatype z = datatype DiagDI.t in case default of Default => [Default, Ignore] | Ignore => [Ignore, Default] end)), default = default, diagToString = DiagDI.toString, diagFromString = DiagDI.fromString, expert = expert, name = name}, ac) in val ac = {parseId = fn _ => Bad, parseIdAndArgs = fn _ => Bad, withDef = fn () => (fn () => ()), snapshot = fn () => fn () => (fn () => ())} val (allowConstant, ac) = makeBool ({name = "allowConstant", default = false, expert = true}, ac) val (allowFFI, ac) = makeBool ({name = "allowFFI", default = false, expert = false}, ac) val (allowPrim, ac) = makeBool ({name = "allowPrim", default = false, expert = true}, ac) val (allowOverload, ac) = makeBool ({name = "allowOverload", default = false, expert = true}, ac) val (allowRedefineSpecialIds, ac) = makeBool ({name = "allowRedefineSpecialIds", default = false, expert = true}, ac) val (allowSpecifySpecialIds, ac) = makeBool ({name = "allowSpecifySpecialIds", default = false, expert = true}, ac) val (deadCode, ac) = makeBool ({name = "deadCode", default = false, expert = true}, ac) val (forceUsed, ac) = make ({choices = NONE, default = false, expert = false, toString = Bool.toString, name = "forceUsed", newCur = fn (b,()) => b, newDef = fn (_,()) => true, parseArgs = fn args' => case args' of [] => SOME () | _ => NONE}, ac) val (ffiStr, ac) = make ({choices = SOME [SOME ""], default = NONE, expert = true, toString = fn NONE => "" | SOME s => s, name = "ffiStr", newCur = fn (_,s) => SOME s, newDef = fn _ => NONE, parseArgs = fn args' => case args' of [s] => SOME s | _ => NONE}, ac) val (nonexhaustiveBind, ac) = makeDiagEIW ({name = "nonexhaustiveBind", default = DiagEIW.Warn, expert = false}, ac) val (nonexhaustiveExnBind, ac) = makeDiagDI ({name = "nonexhaustiveExnBind", default = DiagDI.Default, expert = false}, ac) val (redundantBind, ac) = makeDiagEIW ({name = "redundantBind", default = DiagEIW.Warn, expert = false}, ac) val (nonexhaustiveMatch, ac) = makeDiagEIW ({name = "nonexhaustiveMatch", default = DiagEIW.Warn, expert = false}, ac) val (nonexhaustiveExnMatch, ac) = makeDiagDI ({name = "nonexhaustiveExnMatch", default = DiagDI.Default, expert = false}, ac) val (redundantMatch, ac) = makeDiagEIW ({name = "redundantMatch", default = DiagEIW.Warn, expert = false}, ac) val (nonexhaustiveRaise, ac) = makeDiagEIW ({name = "nonexhaustiveRaise", default = DiagEIW.Ignore, expert = false}, ac) val (nonexhaustiveExnRaise, ac) = makeDiagDI ({name = "nonexhaustiveExnRaise", default = DiagDI.Ignore, expert = false}, ac) val (redundantRaise, ac) = makeDiagEIW ({name = "redundantRaise", default = DiagEIW.Warn, expert = false}, ac) val (resolveScope, ac) = make ({choices = SOME [ResolveScope.Dec, ResolveScope.Strdec, ResolveScope.Topdec, ResolveScope.Program], default = ResolveScope.Strdec, expert = true, toString = ResolveScope.toString, name = "resolveScope", newCur = fn (_,rs) => rs, newDef = fn (_,rs) => rs, parseArgs = fn args' => case args' of [arg'] => ResolveScope.fromString arg' | _ => NONE}, ac) val (sequenceNonUnit, ac) = makeDiagEIW ({name = "sequenceNonUnit", default = DiagEIW.Ignore, expert = false}, ac) val (valrecConstr, ac) = makeDiagEIW ({name = "valrecConstr", default = DiagEIW.Warn, expert = false}, ac) val (warnUnused, ac) = makeBool ({name = "warnUnused", default = false, expert = false}, ac) (* Successor ML *) val (allowDoDecls, ac) = makeBool ({name = "allowDoDecls", default = false, expert = false}, ac) val (allowExtendedNumConsts, ac) = makeBool ({name = "allowExtendedNumConsts", default = false, expert = false}, ac) val (allowExtendedTextConsts, ac) = makeBool ({name = "allowExtendedTextConsts", default = false, expert = false}, ac) val (allowLineComments, ac) = makeBool ({name = "allowLineComments", default = false, expert = false}, ac) val (allowOptBar, ac) = makeBool ({name = "allowOptBar", default = false, expert = false}, ac) val (allowOptSemicolon, ac) = makeBool ({name = "allowOptSemicolon", default = false, expert = false}, ac) val (allowOrPats, ac) = makeBool ({name = "allowOrPats", default = false, expert = false}, ac) val (allowRecordPunExps, ac) = makeBool ({name = "allowRecordPunExps", default = false, expert = false}, ac) val (allowSigWithtype, ac) = makeBool ({name = "allowSigWithtype", default = false, expert = false}, ac) val (allowVectorExps, ac) = makeBool ({name = "allowVectorExps", default = false, expert = false}, ac) val (allowVectorPats, ac) = makeBool ({name = "allowVectorPats", default = false, expert = false}, ac) val extendedConstsCtrls = [allowExtendedNumConsts, allowExtendedTextConsts] val vectorCtrls = [allowVectorExps, allowVectorPats] val successorMLCtrls = [allowDoDecls, allowExtendedNumConsts, allowExtendedTextConsts, allowLineComments, allowOptBar, allowOptSemicolon, allowOrPats, allowRecordPunExps, allowSigWithtype, allowVectorExps, allowVectorPats] val {parseId, parseIdAndArgs, withDef, snapshot} = ac end local fun makeProxy ({alts: (Id.t * ('args -> string list option)) list, choices: 'args list option, deprecated: bool, expert: bool, toString: 'args -> string, name: string, parseArgs: string list -> 'args option}, {parseId: string -> Id.t parseResult, parseIdAndArgs: string list -> (Id.t * Args.t) parseResult}) = let val () = if deprecated then () else List.push (documentation, {choices = Option.map (choices, fn cs => List.map (cs, toString)), expert = expert, name = name}) val parseId = fn name' => if String.equals (name', name) then Proxy (List.map (alts, fn (id, _) => id), {deprecated = deprecated}) else parseId name' val parseIdAndArgs = fn ss => case ss of name'::args' => if String.equals (name', name) then case parseArgs args' of SOME v => let val alts = List.keepAllMap (alts, fn (id, mkArgs) => Option.map (mkArgs v, fn ss => deGood (parseIdAndArgs ((Id.name id)::ss)))) in Proxy (alts, {deprecated = deprecated}) end | NONE => Bad else parseIdAndArgs ss | _ => Bad in {parseId = parseId, parseIdAndArgs = parseIdAndArgs} end fun makeProxyBoolSimple ({alts: Id.t list, default: bool, deprecated: bool, expert: bool, name: string}, ac) = makeProxy ({alts = List.map (alts, fn id => (id, fn b => SOME [Bool.toString b])), choices = SOME (if default then [true, false] else [false, true]), deprecated = deprecated, expert = expert, toString = Bool.toString, name = name, parseArgs = fn args' => case args' of [arg'] => Bool.fromString arg' | _ => NONE}, ac) in val ac = {parseId = parseId, parseIdAndArgs = parseIdAndArgs} (* Successor ML *) val ac = makeProxyBoolSimple ({alts = List.map (extendedConstsCtrls, id), default = false, deprecated = false, expert = false, name = "allowExtendedConsts"}, ac) val ac = makeProxyBoolSimple ({alts = List.map (vectorCtrls, id), default = false, deprecated = false, expert = false, name = "allowVectorExpsAndPats"}, ac) val ac = makeProxyBoolSimple ({alts = List.map (successorMLCtrls, id), default = false, deprecated = false, expert = false, name = "allowSuccessorML"}, ac) val {parseId, parseIdAndArgs} = ac end local fun checkPrefix (s, f) = case String.peeki (s, fn (_, c) => c = #":") of NONE => f s | SOME (i, _) => let val comp = String.prefix (s, i) val comp = String.deleteSurroundingWhitespace comp val s = String.dropPrefix (s, i + 1) in if String.equals (comp, "mlton") then f s else Other end in val parseId = fn s => checkPrefix (s, parseId) val parseIdAndArgs = fn s => checkPrefix (s, fn s => parseIdAndArgs (String.tokens (s, Char.isSpace))) end val processDefault = fn s => case parseIdAndArgs s of Bad => Bad | Good (id, args) => if Args.processDef args then Good id else Bad | Proxy (alts, {deprecated}) => List.fold (alts, Proxy (List.map (alts, #1), {deprecated = deprecated}), fn ((_,args),res) => if Args.processDef args then res else Bad) | Other => Bad val processEnabled = fn (s, b) => case parseId s of Bad => Bad | Proxy (alts, {deprecated}) => List.fold (alts, Proxy (alts, {deprecated = deprecated}), fn (id, res) => if Id.setEnabled (id, b) then res else Bad) | Good id => if Id.setEnabled (id, b) then Good id else Bad | Other => Bad val withDef : (unit -> 'a) -> 'a = fn f => let val restore = withDef () in Exn.finally (f, restore) end val snapshot : unit -> (unit -> 'a) -> 'a = fn () => let val withSaved = snapshot () in fn f => let val restore = withSaved () in Exn.finally (f, restore) end end end val emitMain = control {name = "emit main", default = true, toString = Bool.toString} val exportHeader = control {name = "export header", default = NONE, toString = Option.toString File.toString} val exnHistory = control {name = "exn history", default = false, toString = Bool.toString} structure Format = struct datatype t = Archive | Executable | LibArchive | Library (* Default option first for usage message. *) val all = [Executable, Archive, LibArchive, Library] val toString: t -> string = fn Archive => "archive" | Executable => "executable" | LibArchive => "libarchive" | Library => "library" end datatype format = datatype Format.t val format = control {name = "generated output format", default = Format.Executable, toString = Format.toString} structure GcCheck = struct datatype t = Limit | First | Every local open Layout in val layout = fn Limit => str "Limit" | First => str "First" | Every => str "Every" end val toString = Layout.toString o layout end datatype gcCheck = datatype GcCheck.t val gcCheck = control {name = "gc check", default = Limit, toString = GcCheck.toString} val gcExpect = control {name = "gc check expect", default = NONE, toString = Option.toString Bool.toString} val globalizeArrays = control {name = "globalize arrays", default = false, toString = Bool.toString} val globalizeRefs = control {name = "globalize refs", default = true, toString = Bool.toString} val globalizeSmallIntInf = control {name = "globalize int-inf as small type)", default = true, toString = Bool.toString} val globalizeSmallType = control {name = "globalize small type", default = 1, toString = Int.toString} val indentation = control {name = "indentation", default = 3, toString = Int.toString} val inlineIntoMain = control {name = "inlineIntoMain", default = true, toString = Bool.toString} val inlineLeafA = control {name = "inlineLeafA", default = {loops = true, repeat = true, size = SOME 20}, toString = fn {loops, repeat, size} => Layout.toString (Layout.record [("loops", Bool.layout loops), ("repeat", Bool.layout repeat), ("size", Option.layout Int.layout size)])} val inlineLeafB = control {name = "inlineLeafB", default = {loops = true, repeat = true, size = SOME 40}, toString = fn {loops, repeat, size} => Layout.toString (Layout.record [("loops", Bool.layout loops), ("repeat", Bool.layout repeat), ("size", Option.layout Int.layout size)])} val inlineNonRec = control {name = "inlineNonRec", default = {small = 60, product = 320}, toString = fn {small, product} => Layout.toString (Layout.record [("small", Int.layout small), ("product", Int.layout product)])} val inputFile = control {name = "input file", default = "", toString = File.toString} val keepAST = control {name = "keep AST", default = false, toString = Bool.toString} val keepCoreML = control {name = "keep CoreML", default = false, toString = Bool.toString} val keepDefUse = control {name = "keep def use", default = true, toString = Bool.toString} val keepDot = control {name = "keep dot", default = false, toString = Bool.toString} val keepMachine = control {name = "keep Machine", default = false, toString = Bool.toString} val keepPasses = control {name = "keep passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} val keepRSSA = control {name = "keep RSSA", default = false, toString = Bool.toString} val keepSSA = control {name = "keep SSA", default = false, toString = Bool.toString} val keepSSA2 = control {name = "keep SSA2", default = false, toString = Bool.toString} val keepSXML = control {name = "keep SXML", default = false, toString = Bool.toString} val keepXML = control {name = "keep XML", default = false, toString = Bool.toString} val labelsHaveExtra_ = control {name = "extra_", default = false, toString = Bool.toString} val libDir = control {name = "lib dir", default = "", toString = fn s => s} val libTargetDir = control {name = "lib target dir", default = "", toString = fn s => s} val libname = ref "" structure LLVMAliasAnalysisMetaData = struct datatype t = None | Scope | TBAA of {gcstate: {offset: bool} option, global: {cty: bool, index: bool} option, heap: {cty: bool, kind: bool, offset: bool, tycon: bool} option, other: bool, stack: {offset: bool} option} val tbaaDefault = TBAA {gcstate = SOME {offset = false}, global = SOME {cty = false, index = false}, heap = SOME {cty = false, kind = false, offset = false, tycon = false}, other = true, stack = SOME {offset = false}} fun toString aamd = case aamd of None => "none" | Scope => "scope" | TBAA {gcstate, global, heap, other, stack} => let open Layout in toString (namedRecord ("tbaa", [("gcstate", Option.layout (fn {offset} => record [("offset", Bool.layout offset)]) gcstate), ("global", Option.layout (fn {cty, index} => record [("cty", Bool.layout cty), ("index", Bool.layout index)]) global), ("heap", Option.layout (fn {cty, kind, offset, tycon} => record [("cty", Bool.layout cty), ("kind", Bool.layout kind), ("offset", Bool.layout offset), ("tycon", Bool.layout tycon)]) heap), ("other", Bool.layout other), ("stack", Option.layout (fn {offset} => record [("offset", Bool.layout offset)]) stack)])) end fun fromString s = let open Parse infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> val p = any [kw "none" *> pure None, kw "scope" *> pure Scope, kw "tbaa" *> (cbrack (ffield ("gcstate", option (cbrack (ffield ("offset", bool) >>= (fn offset => pure {offset = offset})))) >>= (fn gcstate => nfield ("global", option (cbrack (ffield ("cty", bool) >>= (fn cty => nfield ("index", bool) >>= (fn index => pure {cty = cty, index = index}))))) >>= (fn global => nfield ("heap", option (cbrack (ffield ("cty", bool) >>= (fn cty => nfield ("kind", bool) >>= (fn kind => nfield ("offset", bool) >>= (fn offset => nfield ("tycon", bool) >>= (fn tycon => pure {cty = cty, kind = kind, offset = offset, tycon = tycon}))))))) >>= (fn heap => nfield ("other", bool) >>= (fn other => nfield ("stack", option (cbrack (ffield ("offset", bool) >>= (fn offset => pure {offset = offset})))) >>= (fn stack => pure (TBAA {gcstate = gcstate, global = global, heap = heap, other = other, stack = stack}))))))) <|> pure tbaaDefault)] <* failing next in case parseString (p, s) of No _ => NONE | Yes c => SOME c end end val llvmAAMD = control {name = "llvmAAMD", default = LLVMAliasAnalysisMetaData.None, toString = LLVMAliasAnalysisMetaData.toString} val llvmCC10 = control {name = "llvm 'cc10'", default = false, toString = Bool.toString} val loopUnrollLimit = control {name = "loop unrolling limit", default = 150, toString = Int.toString} val loopUnswitchLimit = control {name = "loop unswitching limit", default = 300, toString = Int.toString} val markCards = control {name = "mark cards", default = true, toString = Bool.toString} val maxFunctionSize = control {name = "max function size", default = 10000, toString = Int.toString} val mlbPathVars = control {name = "mlb path vars", default = [], toString = List.toString (fn {var, path} => concat ["{var = ", var, ", path = ", path, "}"])} structure Native = struct val elimALRedundant = control {name = "elim AL redundant", default = true, toString = Bool.toString} val liveStack = control {name = "native live stack", default = false, toString = Bool.toString} val optimize = control {name = "native optimize", default = 1, toString = Int.toString} val moveHoist = control {name = "native move hoist", default = true, toString = Bool.toString} val copyProp = control {name = "native copy prop", default = true, toString = Bool.toString} val copyPropCutoff = control {name = "native copy prop cutoff", default = 1000, toString = Int.toString} val cutoff = control {name = "native cutoff", default = 100, toString = Int.toString} val liveTransfer = control {name = "native live transfer", default = 8, toString = Int.toString} val shuffle = control {name = "native shuffle", default = true, toString = Bool.toString} val IEEEFP = control {name = "native ieee fp", default = false, toString = Bool.toString} val split = control {name = "native split", default = SOME 20000, toString = Option.toString Int.toString} val pic = control {name = "native pic", default = false, toString = Bool.toString} end val numExports: int ref = ref 0 val optFuel = control {name = "optFuel", default = NONE, toString = Option.toString Int.toString} fun optFuelAvailAndUse () = case !optFuel of NONE => true | SOME i => if i > 0 then (optFuel := SOME (i - 1); true) else false (* Suppress unused variable warning * This variable is purposefully unused in production, * but is retained to make it easy to use in development of new * optimization passes. *) val _ = optFuelAvailAndUse (* Control IL-specific optimization passes *) structure OptimizationPasses = struct val optPasses: {il: string, passes: string} list ref = control {name = "optimizationPasses", default = [], toString = List.toString (fn {il, passes} => concat ["<",il,"::",passes,">"])} val optPassesSets: {il: string, set: string -> unit Result.t} list ref = ref [] fun register {il, set} = let val set = fn passes => (optPasses := List.map (!optPasses, fn z => if String.equals (il, #il z) then {il = il, passes = passes} else z) ; set passes) in List.push (optPassesSets, {il = il, set = set}) end fun set {il, passes} = case List.peek (!optPassesSets, fn z => String.equals (il, #il z)) of NONE => Error.bug (concat ["Control.OptimizationPasses.set: ", il, " not found"]) | SOME {set, ...} => set passes fun setAll passes = List.foldr (!optPassesSets, Result.Yes (), fn ({il, set}, res) => case res of Result.No s => Result.No s | Result.Yes () => (case set passes of Result.No s => Result.No (concat [s, " (for ", il, ")"]) | Result.Yes () => Result.Yes ())) end val polyvariance = control {name = "polyvariance", default = SOME {hofo = true, rounds = 2, small = 30, product = 300}, toString = fn p => Layout.toString (Option.layout (fn {hofo, rounds, small, product} => Layout.record [("hofo", Bool.layout hofo), ("rounds", Int.layout rounds), ("small", Int.layout small), ("product", Int.layout product)]) p)} structure PositionIndependentStyle = struct datatype t = NPI | PIC | PIE fun fromString s = case s of "npi" => SOME NPI | "pic" => SOME PIC | "pie" => SOME PIE | _ => NONE fun toString pis = case pis of NPI => "npi" | PIC => "pic" | PIE => "pie" fun toSuffix pis = case pis of NONE => "" | SOME NPI => "-npi" | SOME PIC => "-pic" | SOME PIE => "-pie" fun ccOpts pis = case pis of NONE => [] | SOME NPI => ["-fno-pic", "-fno-pie"] | SOME PIC => ["-fPIC"] | SOME PIE => ["-fPIE"] fun llvm_llcOpts (pis, {targetDefault}) = let fun llcOpts pis = case pis of NPI => [] (* ["--relocation-model=static"] *) | PIC => ["--relocation-model=pic"] | PIE => ["--relocation-model=pic"] in case pis of NONE => llcOpts targetDefault | SOME pis => llcOpts pis end fun linkOpts pis = case pis of NONE => [] | SOME NPI => ["-fno-pic", "-fno-pie", "-no-pie"] | SOME PIC => ["-fno-pie", "-no-pie"] | SOME PIE => ["-fPIE -pie"] end val positionIndependentStyle = control {name = "position independent style", default = NONE, toString = Option.toString PositionIndependentStyle.toString} val preferAbsPaths = control {name = "prefer abs paths", default = false, toString = Bool.toString} val profPasses = control {name = "prof passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure Profile = struct datatype t = ProfileNone | ProfileAlloc | ProfileCallStack | ProfileCount | ProfileDrop | ProfileLabel | ProfileTimeField | ProfileTimeLabel val toString = fn ProfileNone => "None" | ProfileAlloc => "Alloc" | ProfileCallStack => "CallStack" | ProfileCount => "Count" | ProfileDrop => "Drop" | ProfileLabel => "Label" | ProfileTimeField => "TimeField" | ProfileTimeLabel => "TimeLabel" end datatype profile = datatype Profile.t val profile = control {name = "profile", default = ProfileNone, toString = Profile.toString} val profileBlock = control {name = "profile block", default = false, toString = Bool.toString} val profileBranch = control {name = "profile branch", default = false, toString = Bool.toString} val profileC = control {name = "profile C", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure ProfileIL = struct datatype t = ProfileSource | ProfileSSA | ProfileSSA2 val toString = fn ProfileSource => "ProfileSource" | ProfileSSA => "ProfileSSA" | ProfileSSA2 => "ProfileSSA2" end datatype profileIL = datatype ProfileIL.t val profileIL = control {name = "profile IL", default = ProfileSource, toString = ProfileIL.toString} val profileInclExcl = control {name = "profile include/exclude", default = [], toString = List.toString (Layout.toString o (Layout.tuple2 (Regexp.Compiled.layout, Bool.layout)))} val profileRaise = control {name = "profile raise", default = false, toString = Bool.toString} val profileStack = control {name = "profile stack", default = false, toString = Bool.toString} val profileVal = control {name = "profile val", default = false, toString = Bool.toString} val showBasis = control {name = "show basis", default = NONE, toString = Option.toString File.toString} val showBasisCompact = control {name = "show basis compact", default = false, toString = Bool.toString} val showBasisDef = control {name = "show basis def", default = true, toString = Bool.toString} val showBasisFlat = control {name = "show basis flat", default = true, toString = Bool.toString} val showDefUse = control {name = "show def-use", default = NONE, toString = Option.toString File.toString} val showTypes = control {name = "show types", default = true, toString = Bool.toString} structure SplitTypesBool = struct datatype t = Always | Never | Smart (* split only when smaller than two, default *) val toString = fn Always => "always" | Never => "never" | Smart => "smart" end datatype splitTypesBool = datatype SplitTypesBool.t val splitTypesBool = control {name = "bool type splitting method", default = Smart, toString = SplitTypesBool.toString} val stopPasses = control {name = "stop passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure Target = struct datatype t = Cross of string | Self val toString = fn Cross s => s | Self => "self" end datatype target = datatype Target.t val target = control {name = "target", default = Self, toString = Target.toString} structure Target = struct open Target val consts = Promise.delay (fn () => StrMap.load (OS.Path.joinDirFile {dir = !libTargetDir, file = "constants"})) datatype arch = datatype MLton.Platform.Arch.t val arch = control {name = "target arch", default = X86, toString = MLton.Platform.Arch.toString} datatype os = datatype MLton.Platform.OS.t val os = control {name = "target OS", default = Linux, toString = MLton.Platform.OS.toString} val bigEndian = Promise.lazy (fn () => StrMap.lookupBool (Promise.force consts, "const::MLton_Platform_Arch_bigendian")) structure Size = struct fun make name = Promise.lazy (fn () => (Bytes.toBits o Bytes.fromIntInf) (StrMap.lookupIntInf (Promise.force consts, "size::" ^ name))) val cint = make "cint" val cpointer = make "cpointer" val cptrdiff = make "cptrdiff" val csize = make "csize" val header = make "header" val mplimb = make "mplimb" val normalMetaData = make "normalMetaData" val objptr = make "objptr" val seqIndex = make "seqIndex" val sequenceMetaData = make "sequenceMetaData" end end fun mlbPathMap () = List.rev (List.concat [[{var = "LIB_MLTON_DIR", path = !libDir}, {var = "TARGET", path = Target.toString (!target)}, {var = "TARGET_ARCH", path = String.toLower (MLton.Platform.Arch.toString (!Target.arch))}, {var = "TARGET_OS", path = String.toLower (MLton.Platform.OS.toString (!Target.os))}, {var = "OBJPTR_REP", path = "rep" ^ Bits.toString (Target.Size.objptr ())}, {var = "SEQUENCE_METADATA_SIZE", path = "size" ^ Bits.toString (Target.Size.sequenceMetaData ())}, {var = "NORMAL_METADATA_SIZE", path = "size" ^ Bits.toString (Target.Size.normalMetaData ())}, {var = "SEQINDEX_INT", path = "int" ^ Bits.toString (Target.Size.seqIndex ())}, {var = "DEFAULT_CHAR", path = !defaultChar}, {var = "DEFAULT_WIDECHAR", path = !defaultWideChar}, {var = "DEFAULT_INT", path = !defaultInt}, {var = "DEFAULT_REAL", path = !defaultReal}, {var = "DEFAULT_WORD", path = !defaultWord}], !mlbPathVars]) val typeCheck = control {name = "type check", default = false, toString = Bool.toString} structure Verbosity = struct datatype t = Silent | Top | Pass | Detail val toString = fn Silent => "Silent" | Top => "Top" | Pass => "Pass" | Detail => "Detail" fun compare (v1, v2) = case (v1, v2) of (Silent, Silent) => EQUAL | (Silent, _) => LESS | (_, Silent) => GREATER | (Top, Top) => EQUAL | (Top, _) => LESS | (_, Top) => GREATER | (Pass, Pass) => EQUAL | (Pass, _) => LESS | (_, Pass) => GREATER | (Detail, Detail) => EQUAL val {<, <=, ...} = Relation.compare compare end datatype verbosity = datatype Verbosity.t val verbosity = control {name = "verbosity", default = Silent, toString = Verbosity.toString} val warnAnn = control {name = "warn unrecognized annotation", default = true, toString = Bool.toString} val warnDeprecated = control {name = "warn deprecated features", default = true, toString = Bool.toString} val zoneCutDepth: int ref = control {name = "zone cut depth", default = 100, toString = Int.toString} val defaults = setDefaults val _ = defaults () val commandLineConsts = StrMap.new () fun setCommandLineConst {name, value} = let fun make (fromString, control) = let fun set () = case fromString value of NONE => Error.bug (concat ["bad value for ", name]) | SOME v => control := v in set end val () = case List.peek ([("Exn.keepHistory", make (Bool.fromString, exnHistory))], fn (s, _) => s = name) of NONE => () | SOME (_,set) => set () in StrMap.add (commandLineConsts, "cmdLineConst::" ^ name, value) end val buildConsts = Promise.delay (fn () => let val bool = Bool.toString val int = Int.toString val buildConsts = [("MLton_Align_align", int (case !align of Align4 => 4 | Align8 => 8)), ("MLton_Codegen_codegen", int (case !codegen of CCodegen => 0 | X86Codegen => 1 | AMD64Codegen => 2 | LLVMCodegen => 3)), ("MLton_FFI_numExports", int (!numExports)), ("MLton_Platform_Format", (case !format of Archive => "archive" | Executable => "executable" | LibArchive => "libarchive" | Library => "library")), ("MLton_Profile_isOn", bool (case !profile of ProfileNone => false | ProfileCallStack => false | ProfileDrop => false | ProfileLabel => false | _ => true))] val table = StrMap.new () val () = List.foreach (buildConsts, fn (name, value) => StrMap.add (table, "buildConst::" ^ name, value)) in table end) end mlton-20210117+dfsg/mlton/control/control.sig000066400000000000000000000071441416264345000210310ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CONTROL = sig include CONTROL_FLAGS (* Tracing and other informative messages. * Some take a verbosity argument that specifies the verbosity level at * which messages should be printed. *) val message: verbosity * (unit -> Layout.t) -> unit val messageStr: verbosity * string -> unit val sizeMessage: string * 'a -> Layout.t val trace: verbosity * string -> ('a -> 'b) -> 'a -> 'b type traceAccum val traceAccum: verbosity * string -> (traceAccum * (unit -> unit)) val traceAdd: traceAccum * string -> ('a -> 'b) -> 'a -> 'b val traceBatch: verbosity * string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val traceTop: string -> ('a -> unit) -> 'a -> unit val indent: unit -> unit val unindent: unit -> unit val getDepth: unit -> int (*------------------------------------*) (* Error Reporting *) (*------------------------------------*) val checkFile: File.t * {fail: string -> 'a, name: string, ok: unit -> 'a} -> 'a val checkForErrors: unit -> unit val error: Region.t * Layout.t * Layout.t -> unit val errorStr: Region.t * string -> unit (* abort compilation once this many errors reached *) val errorThreshhold: int ref val numErrors: int ref val warning: Region.t * Layout.t * Layout.t -> unit (*------------------------------------*) (* Compiler Passes *) (*------------------------------------*) datatype style = No | Assembly | C | Dot | LLVM | ML datatype 'a display = Layout of 'a -> Layout.t | Layouts of 'a * (Layout.t -> unit) -> unit val diagnostic: (unit -> Layout.t) -> unit val diagnostics: ((Layout.t -> unit) -> unit) -> unit val saveToFile: {arg: 'a, name: string option, toFile: {display: 'a display, style: style, suffix: string}, verb: Verbosity.t} -> unit val outputHeader: style * (Layout.t -> unit) -> unit val outputHeader': style * Out.t -> unit val simplifyPass: {arg: 'a, doit: 'a -> 'a, execute: bool, keepIL: bool, name: string, stats: 'a -> Layout.t, toFile: {display: 'a display, style: style, suffix: string}, typeCheck: 'a -> unit} -> 'a val simplifyPasses: {arg: 'a, passes: {doit: 'a -> 'a, execute: bool, name: string} list, stats: 'a -> Layout.t, toFile: {display: 'a display, style: style, suffix: string}, typeCheck: 'a -> unit} -> 'a val translatePass: {arg: 'a, doit: 'a -> 'b, keepIL: bool, name: string, srcToFile: {display: 'a display, style: style, suffix: string} option, tgtStats: ('b -> Layout.t) option, tgtToFile: {display: 'b display, style: style, suffix: string} option, tgtTypeCheck: ('b -> unit) option} -> 'b end mlton-20210117+dfsg/mlton/control/control.sml000066400000000000000000000401431416264345000210360ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Control: CONTROL = struct open ControlFlags structure CommentStyle = struct datatype t = No | Assembly | C | Dot | LLVM | ML val preSuf = fn No => ("", "") | Assembly => ("/* ", " */") | C => ("/* ", " */") | Dot => ("// ", "") | LLVM => ("; ", "") | ML => ("(* ", " *)") end datatype style = datatype CommentStyle.t fun outputHeader (style: style, output: Layout.t -> unit) = let val (pre, suf) = CommentStyle.preSuf style in output (Layout.str (concat [pre, Version.banner, suf])); if Verbosity.< (!verbosity, Verbosity.Detail) then () else output (ControlFlags.layout' {pre = pre, suf = suf}) end fun outputHeader' (style, out: Out.t) = outputHeader (style, fn l => Layout.outputl (l, out)) val depth: int ref = ref 0 fun getDepth () = !depth fun indent () = depth := !depth + 3 fun unindent () = depth := !depth - 3 fun message (verb: Verbosity.t, th: unit -> Layout.t): unit = if Verbosity.<= (verb, !verbosity) then let val out = Out.error val lay = th () in if Layout.isEmpty lay then () else (Layout.output (Layout.indent (lay, !depth), out) ; Out.newline out) end else () fun messageStr (verb, s: string): unit = message (verb, fn () => Layout.str s) fun time () = let open Time val {children, self, gc, ...} = times () fun add {utime, stime} = utime + stime in (add self + add children, add gc) end fun timeToString {total, gc} = let fun fmt (x, n) = Real.format (x, Real.Format.fix (SOME n)) val toReal = Real.fromIntInf o Time.toMilliseconds val per = if Time.equals (total, Time.zero) then "0" else fmt (100.0 * (toReal gc / toReal total), 0) fun t2s t = fmt (Real./ (toReal t, 1000.0), 2) in concat [t2s (Time.- (total, gc)), " + ", t2s gc, " (", per, "% GC)"] end exception CompileError exception Stopped exception Raised fun trace (verb, name: string) (f: 'a -> 'b) (a: 'a): 'b = if Verbosity.<= (verb, !verbosity) then let val _ = messageStr (verb, concat [name, " starting"]) val (t, gc) = time () val _ = indent () fun done () = let val _ = unindent () val (t', gc') = time () in timeToString {total = Time.- (t', t), gc = Time.- (gc', gc)} end in (f a before messageStr (verb, concat [name, " finished in ", done ()])) handle exn => (case exn of CompileError => (messageStr (verb, concat [name, " reported errors in ", done ()]) ; raise exn) | Stopped => (messageStr (verb, concat [name, " finished in ", done ()]) ; raise exn) | Raised => (messageStr (verb, concat [name, " raised in ", done ()]) ; raise exn) | _ => (messageStr (verb, concat [name, " raised: ", Exn.toString exn]) ; (case Exn.history exn of [] => () | history => (indent () ; List.foreach (history, fn s => messageStr (verb, s)) ; unindent ())) ; messageStr (verb, concat [name, " raised in ", done ()]) ; raise Raised)) end else f a fun traceTop (name: string) (f: 'a -> unit) (a: 'a) = trace (Top, name) f a handle CompileError => OS.Process.exit OS.Process.failure | Stopped => () | Raised => OS.Process.exit OS.Process.failure | exn => (verbosity := Top ; messageStr (Top, concat [name, " raised: ", Exn.toString exn]) ; (case Exn.history exn of [] => () | history => (indent () ; List.foreach (history, fn s => messageStr (Top, s)) ; unindent ())) ; OS.Process.exit OS.Process.failure) type traceAccum = {verb: verbosity, total: Time.t ref, totalGC: Time.t ref} val traceAccum: (verbosity * string) -> (traceAccum * (unit -> unit)) = fn (verb, name) => let val total = ref Time.zero val totalGC = ref Time.zero in ({verb = verb, total = total, totalGC = totalGC}, fn () => messageStr (verb, concat [name, " totals ", timeToString {total = !total, gc = !totalGC}])) end val ('a, 'b) traceAdd: (traceAccum * string) -> ('a -> 'b) -> 'a -> 'b = fn ({verb, total, totalGC}, name) => fn f => fn a => if Verbosity.<= (verb, !verbosity) then let val (t, gc) = time () fun done () = let val (t', gc') = time () in total := Time.+ (!total, Time.- (t', t)) ; totalGC := Time.+ (!totalGC, Time.- (gc', gc)) end in (f a before done ()) handle exn => (case exn of CompileError => raise exn | Stopped => raise exn | Raised => raise exn | _ => (messageStr (verb, concat [name, " raised: ", Exn.toString exn]) ; (case Exn.history exn of [] => () | history => (indent () ; List.foreach (history, fn s => messageStr (verb, s)) ; unindent ())) ; raise Raised)) end else f a val ('a, 'b) traceBatch: (verbosity * string) -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) = fn (verb, name) => let val (ta,taMsg) = traceAccum (verb, name) in fn f => (traceAdd (ta,name) f, taMsg) end (*------------------------------------*) (* Errors *) (*------------------------------------*) val numErrors: int ref = ref 0 val errorThreshhold: int ref = ref 20 local fun msg (kind: string, r: Region.t, msg: Layout.t, extra: Layout.t): unit = let open Layout val r = Region.toString r val msg = Layout.toString msg val msg = Layout.str (concat [String.fromChar (Char.toUpper (String.sub (msg, 0))), String.dropPrefix (msg, 1), "."]) in outputl (align [seq [str (concat [kind, ": "]), str r, str "."], indent (align [msg, indent (extra, 2)], 2)], Out.error) end in fun warning (r, m, e) = msg ("Warning", r, m, e) fun error (r, m, e) = let val _ = Int.inc numErrors val _ = msg ("Error", r, m, e) in if !numErrors = !errorThreshhold then raise CompileError else () end end fun errorStr (r, msg) = error (r, Layout.str msg, Layout.empty) fun checkForErrors () = if !numErrors > 0 then raise CompileError else () fun checkFile (f: File.t, {fail: string -> 'a, name, ok: unit -> 'a}): 'a = let fun check (test, msg, k) = if test f then k () else fail (concat ["File ", name, " ", msg]) in check (File.doesExist, "does not exist", fn () => check (File.canRead, "cannot be read", ok)) end (*---------------------------------------------------*) (* Compiler Passes *) (*---------------------------------------------------*) datatype 'a display = Layout of 'a -> Layout.t | Layouts of 'a * (Layout.t -> unit) -> unit fun 'a sizeMessage (name: string, a: 'a): Layout.t = let open Layout in str (concat [name, " size = ", IntInf.toCommaString (MLton.size a), " bytes"]) end val diagnosticWriter: (Layout.t -> unit) option ref = ref NONE fun diagnostics f = case !diagnosticWriter of NONE => () | SOME w => f w fun diagnostic f = diagnostics (fn disp => disp (f ())) fun saveToFile {arg: 'a, name: string option, toFile = {display: 'a display, style: style, suffix: string}, verb: Verbosity.t}: unit = let val name = case name of NONE => concat [!inputFile, ".", suffix] | SOME name => concat [!inputFile, ".", name, ".", suffix] fun doit f = trace (verb, concat ["save ", name]) Ref.fluidLet (inputFile, name, fn () => File.withOut (!inputFile, fn out => f (fn l => (Layout.outputl (l, out))))) in case display of Layout layout => doit (fn output => (outputHeader (style, output) ; output (layout arg))) | Layouts layout => doit (fn output => (outputHeader (style, output) ; layout (arg, output))) end fun maybeSaveToFile {arg: 'a, name: string, suffix: string, toFile}: unit = let val fullName = concat [name, ".", suffix] val keep = List.exists ([name, fullName], fn name => (List.exists (!keepPasses, fn re => Regexp.Compiled.matchesAll (re, name)))) in if keep then saveToFile {arg = arg, name = SOME fullName, toFile = toFile, verb = Pass} else () end (* Code for diagnosing a pass. *) val wrapDiagnosing = fn {name: string, thunk: unit -> 'a} => if not (List.exists (!diagPasses, fn re => Regexp.Compiled.matchesAll (re, name))) then thunk else fn () => let val result = ref NONE val display = Layouts (fn ((), output) => (diagnosticWriter := SOME output ; result := SOME (thunk ()) ; diagnosticWriter := NONE)) val _ = saveToFile {arg = (), name = SOME name, toFile = {display = display, style = No, suffix = "diagnostic"}, verb = Pass} in valOf (!result) end (* Code for profiling a pass. *) val wrapProfiling = fn {name: string, thunk: unit -> 'a} => if MLton.Profile.isOn then if not (List.exists (!profPasses, fn re => Regexp.Compiled.matchesAll (re, name))) then thunk else fn () => let open MLton.Profile val d = Data.malloc () in Exn.finally (fn () => withData (d, thunk), fn () => (Data.write (d, concat [!inputFile, ".", name, ".mlmon"]) ; Data.free d)) end else thunk fun translatePass {arg: 'a, doit: 'a -> 'b, keepIL: bool, name: string, srcToFile: {display: 'a display, style: style, suffix: string} option, tgtStats: ('b -> Layout.t) option, tgtToFile: {display: 'b display, style: style, suffix: string} option, tgtTypeCheck: ('b -> unit) option}: 'b = let val thunk = fn () => doit arg val thunk = wrapDiagnosing {name = name, thunk = thunk} val thunk = wrapProfiling {name = name, thunk = thunk} val thunk = fn () => let val () = Option.app (srcToFile, fn srcToFile => maybeSaveToFile {arg = arg, name = name, suffix = "pre", toFile = srcToFile}) val res = thunk () val () = Option.app (tgtToFile, fn tgtToFile => maybeSaveToFile {arg = res, name = name, suffix = "post", toFile = tgtToFile}) val () = if !ControlFlags.typeCheck then Option.app (tgtTypeCheck, fn tgtTypeCheck => trace (Pass, concat ["typeCheck ", name, ".post"]) tgtTypeCheck res) else () local val verb = Detail in val _ = message (verb, fn () => Layout.str (concat [name, ".post stats"])) val _ = indent () val _ = Option.app (tgtStats, fn tgtStats => message (verb, fn () => tgtStats res)) val _ = message (verb, PropertyList.stats) val _ = message (verb, HashSet.stats) val _ = message (verb, fn () => Layout.str (concat ["live data = ", IntInf.toCommaString (MLton.sizeAll ()), " bytes"])) val _ = unindent () end in res end val res = trace (Pass, name) thunk () val () = if keepIL then Option.app (tgtToFile, fn tgtToFile => saveToFile {arg = res, name = NONE, toFile = tgtToFile, verb = Pass}) else () val () = if List.exists (!stopPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then raise Stopped else () in res end fun simplifyPass {arg: 'a, doit: 'a -> 'a, execute: bool, keepIL: bool, name: string, stats: 'a -> Layout.t, toFile: {display: 'a display, style: style, suffix: string}, typeCheck: 'a -> unit}: 'a = if List.foldr (!executePasses, execute, fn ((re, new), old) => if Regexp.Compiled.matchesAll (re, name) then new else old) then translatePass {arg = arg, doit = doit, keepIL = keepIL, name = name, srcToFile = SOME toFile, tgtStats = SOME stats, tgtToFile = SOME toFile, tgtTypeCheck = SOME typeCheck} else let val _ = messageStr (Pass, name ^ " skipped") val () = if keepIL then saveToFile {arg = arg, name = NONE, toFile = toFile, verb = Pass} else () val () = if List.exists (!stopPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then raise Stopped else () in arg end fun simplifyPasses {arg, passes, stats, toFile, typeCheck} = List.fold (passes, arg, fn ({doit, execute, name}, arg) => simplifyPass {arg = arg, doit = doit, execute = execute, keepIL = false, name = name, stats = stats, toFile = toFile, typeCheck = typeCheck}) end mlton-20210117+dfsg/mlton/control/pretty.sig000066400000000000000000000015021416264345000206700ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRETTY = sig type t = Layout.t val casee: {default: t option, rules: (t * t) vector, test: t} -> t val conApp: {arg: t option, con: Layout.t, targs: Layout.t vector} -> t val handlee: {catch: t, handler: t, try: t} -> t val lett: t * t -> t val locall: t * t -> t val primApp: {args: t vector, prim: t, targs: t vector} -> t val raisee: t -> t val seq: t vector -> t end mlton-20210117+dfsg/mlton/control/pretty.sml000066400000000000000000000032041416264345000207020ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Pretty: PRETTY = struct open Layout fun casee {default, rules, test} = let val rules = case default of NONE => rules | SOME l => Vector.concat [rules, Vector.new1 (str "_", l)] in align [seq [str "case ", test, str " of"], indent (alignPrefix (Vector.toListMap (rules, fn (lhs, rhs) => mayAlign [seq [lhs, str " =>"], rhs]), "| "), 2)] end fun conApp {arg, con, targs} = seq [con, if !Control.showTypes then tuple (Vector.toList targs) else empty, case arg of NONE => empty | SOME x => seq [str " ", x]] fun handlee {catch, handler, try} = align [try, seq [str "handle ", catch, str " => ", handler]] fun nest (prefix, x, y) = align [seq [str prefix, x], str "in", indent (y, 3), str "end"] fun lett (d, e) = nest ("let ", d, e) fun locall (d, d') = nest ("local ", d, d') fun primApp {args, prim, targs} = seq [prim, if !Control.showTypes andalso 0 < Vector.length targs then list (Vector.toList targs) else empty, str " ", tuple (Vector.toList args)] fun raisee exn = seq [str "raise ", exn] fun seq es = mayAlign (separateLeft (Vector.toList es, ";")) end mlton-20210117+dfsg/mlton/control/region.sig000066400000000000000000000023331416264345000206270ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature REGION_STRUCTS = sig end signature REGION = sig include REGION_STRUCTS type t val <= : t * t -> bool val append: t * t -> t val bogus: t val compare: t * t -> Relation.t val equals: t * t -> bool val extendRight: t * SourcePos.t -> t val left: t -> SourcePos.t option val layout: t -> Layout.t val make: {left: SourcePos.t, right: SourcePos.t} -> t val right: t -> SourcePos.t option val toString: t -> string structure Wrap: sig type region type 'a t val region: 'a t -> region val node: 'a t -> 'a val makeRegion: 'a * region -> 'a t val makeRegion': 'a * SourcePos.t * SourcePos.t -> 'a t (* val make: 'a -> 'a t *) val dest: 'a t -> 'a * region (* val left: 'a t -> int *) (* val right: 'a t -> int *) end sharing type Wrap.region = t end mlton-20210117+dfsg/mlton/control/region.sml000066400000000000000000000042731416264345000206450ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Region: REGION = struct datatype t = Bogus | T of {left: SourcePos.t, right: SourcePos.t} val bogus = Bogus local fun make f r = case r of Bogus => NONE | T r => SOME (f r) in val left = make #left val right = make #right end val extendRight = fn (Bogus, _) => Bogus | (T {left, ...}, right) => T {left = left, right = right} val toString = fn Bogus => SourcePos.toString (SourcePos.bogus) | T {left, right} => if SourcePos.isBogus left orelse SourcePos.isBogus right orelse not (SourcePos.fileEquals (left, right)) then SourcePos.toString left else concat [SourcePos.toString left, "-", SourcePos.posToString right] val layout = Layout.str o toString val make = T val append = fn (Bogus, r) => r | (r, Bogus) => r | (T {left, ...}, T {right, ...}) => T {left = left, right = right} fun compare (r, r') = case (left r, left r') of (NONE, NONE) => EQUAL | (NONE, _) => LESS | (_, NONE) => GREATER | (SOME p, SOME p') => SourcePos.compare (p, p') val compare = Trace.trace2 ("Region.compare", layout, layout, Relation.layout) compare fun equals (r, r') = compare (r, r') = EQUAL fun r <= r' = case compare (r, r') of EQUAL => true | GREATER => false | LESS => true structure Wrap = struct type region = t datatype 'a t = T of {node: 'a, region: region} fun node (T {node, ...}) = node fun region (T {region, ...}) = region fun makeRegion (node, region) = T {node = node, region = region} fun makeRegion' (node, left, right) = T {node = node, region = make {left = left, right = right}} fun dest (T {node, region}) = (node, region) end end mlton-20210117+dfsg/mlton/control/scale.sml000066400000000000000000000017421416264345000204470ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SCALE = sig datatype t = One | Two | Four | Eight val fromBytes: Bytes.t -> t option val layout: t -> Layout.t val toBytes: t -> Bytes.t val toString: t -> string end structure Scale: SCALE = struct datatype t = One | Two | Four | Eight val toString = fn One => "1" | Two => "2" | Four => "4" | Eight => "8" val layout = Layout.str o toString val fromInt: int -> t option = fn 1 => SOME One | 2 => SOME Two | 4 => SOME Four | 8 => SOME Eight | _ => NONE val fromBytes: Bytes.t -> t option = fromInt o Bytes.toInt val toBytes: t -> Bytes.t = fn One => Bytes.fromInt 1 | Two => Bytes.fromInt 2 | Four => Bytes.fromInt 4 | Eight => Bytes.fromInt 8 end mlton-20210117+dfsg/mlton/control/source-pos.sig000066400000000000000000000014671416264345000214520ustar00rootroot00000000000000(* Copyright (C) 2009,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SOURCE_POS_STRUCTS = sig end signature SOURCE_POS = sig include SOURCE_POS_STRUCTS type t val bogus: t val column: t -> int val compare: t * t -> Relation.t val equals: t * t -> bool val file: t -> File.t val fileEquals: t * t -> bool val isBogus: t -> bool val line: t -> int val make: {column: int, file: File.t, line: int} -> t val posToString: t -> string val toString: t -> string end mlton-20210117+dfsg/mlton/control/source-pos.sml000066400000000000000000000032761416264345000214630ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure SourcePos: SOURCE_POS = struct datatype t = T of {column: int, file: File.t, line: int} local fun f g (T r) = g r in val column = f #column val line = f #line end fun compare (T {column = c, file = f, line = l}, T {column = c', file = f', line = l'}) = case String.compare (f, f') of EQUAL => (case Int.compare (l, l') of EQUAL => Int.compare (c, c') | r => r) | r => r fun equals (T r, T r') = r = r' fun fileEquals (T {file = f, ...}, T {file = f', ...}) = String.equals (f, f') fun make {column, file, line} = T {column = column, file = file, line = line} fun getLib (T {file, ...}) = let val libDir = concat [!ControlFlags.libDir, "/sml"] in if String.hasPrefix (file, {prefix = libDir}) then SOME (String.size libDir) else NONE end fun file (p as T {file, ...}) = if !ControlFlags.preferAbsPaths then file else case getLib p of NONE => file | SOME i => concat ["$(SML_LIB)", String.dropPrefix (file, i)] val bogus = T {column = ~1, file = "", line = ~1} fun isBogus p = equals (p, bogus) fun posToString (T {line, column, ...}) = concat [Int.toString line, ".", Int.toString column] fun toString p = concat [file p, " ", posToString p] end mlton-20210117+dfsg/mlton/control/source.sig000066400000000000000000000012621416264345000206440ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SOURCE = sig type t (* The pos in the following specs is a file position (e.g. yypos of mllex). *) val getPos: t * int -> SourcePos.t val lineDirective: t * File.t option * {lineNum: int, lineStart: int} -> unit val lineStart: t -> SourcePos.t val new: File.t -> t val newline: t * int -> unit val name: t -> string end mlton-20210117+dfsg/mlton/control/source.sml000066400000000000000000000033411416264345000206550ustar00rootroot00000000000000(* Copyright (C) 2011,2015 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Source: SOURCE = struct datatype t = T of {file: File.t ref, lineNum: int ref, lineStart: int ref, origDir: Dir.t} fun getPos (T {file, lineNum, lineStart, ...}, n) = SourcePos.make {column = n - !lineStart, file = !file, line = !lineNum} fun lineStart (s as T {lineStart, ...}) = getPos (s, !lineStart) fun lineDirective (T {file, lineNum, lineStart, origDir}, f, {lineNum = n, lineStart = s}) = (Option.app (f, fn f => let val f = if OS.Path.isAbsolute f then f else OS.Path.mkCanonical (OS.Path.concat (origDir, f)) in file := f end) ; lineNum := n ; lineStart := s) fun new file = T {file = ref file, lineNum = ref 1, (* mllex file positions start at zero, while we report errors * starting in column 1, so we need to pretend the first line * starts at position ~1, which will translate position 0 to * column 1. *) lineStart = ref ~1, origDir = File.dirOf file} fun newline (T {lineStart, lineNum, ...}, n) = (Int.inc lineNum ; lineStart := n) fun name (T {file, ...}) = !file end mlton-20210117+dfsg/mlton/control/sources.cm000066400000000000000000000013521416264345000206440ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library structure Bits structure Bytes structure Control structure Pretty structure Region structure Scale structure Source structure SourcePos structure System structure Version signature WRAPPED is ../../lib/mlton/sources.cm bits.sml scale.sml control-flags.sig control-flags.sml source-pos.sig source-pos.sml region.sig region.sml wrapped.sig source.sig source.sml version.sml control.sig control.sml system.sig system.sml pretty.sig pretty.sml mlton-20210117+dfsg/mlton/control/sources.mlb000066400000000000000000000015041416264345000210160ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb bits.sml scale.sml control-flags.sig control-flags.sml source-pos.sig source-pos.sml region.sig region.sml wrapped.sig source.sig source.sml version.sml control.sig control.sml system.sig system.sml pretty.sig pretty.sml in structure Bits structure Bytes structure Control structure Pretty structure Region structure Scale structure Source structure SourcePos structure System structure Version signature WRAPPED end mlton-20210117+dfsg/mlton/control/system.sig000066400000000000000000000005611416264345000206710ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SYSTEM = sig val system: string * string list -> unit end mlton-20210117+dfsg/mlton/control/system.sml000066400000000000000000000053421416264345000207040ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure System: SYSTEM = struct fun insertBackslashes (ss: string list, width: int, indent: int): string list = let val indentation = String.make (indent, #" ") fun loop (ss, pos, line, lines) = (* pos + 2 < width (so the backslash can be inserted) *) case ss of [] => rev (concat (rev line) :: lines) | s :: ss => let val n = String.size s val (pos, line') = case line of [] => (pos + n, [s]) | _ => (pos + n + 1, s :: " " :: line) fun newLine () = loop (ss, indent + n, [s, indentation], concat (rev (" \\" :: line)) :: lines) in if pos <= width then case ss of [] => rev (concat (rev line') :: lines) | _ => if pos + 2 <= width then loop (ss, pos, line', lines) else newLine () else newLine () end in loop (ss, 0, [], []) end fun system (com: string, args: string list): unit = let (* Many terminal emulators do the line folding one character early, * so we use 79 instead of 80 columns. *) val width = 79 val indentAmount = 4 val s = concat (List.separate (com :: args, " ")) val _ = let open Control in message (Top, fn () => Layout.align (List.map (insertBackslashes (com :: args, width - getDepth (), indentAmount), Layout.str))) end in Process.wait (MLton.Process.spawnp {file = com, args = com :: args}) handle e => Error.bug (concat ["call to system failed with ", Exn.toString e, ":\n", s]) end end mlton-20210117+dfsg/mlton/control/version_sml.src000066400000000000000000000004641416264345000217140ustar00rootroot00000000000000(* Copyright (C) 2009,2013,2016,2018-2019 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Version = struct val name = "MLTON_NAME" val version = "MLTON_VERSION" val banner = concat [name, " ", version] end mlton-20210117+dfsg/mlton/control/wrapped.sig000066400000000000000000000010241416264345000210020ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature WRAPPED = sig type node' type obj val dest: obj -> node' * Region.t val makeRegion': node' * SourcePos.t * SourcePos.t -> obj val makeRegion: node' * Region.t -> obj val node: obj -> node' val region: obj -> Region.t end mlton-20210117+dfsg/mlton/core-ml/000077500000000000000000000000001416264345000165155ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/core-ml/core-ml.fun000066400000000000000000000556371416264345000206050ustar00rootroot00000000000000(* Copyright (C) 2015,2017,2019 Matthew Fluet * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CoreML (S: CORE_ML_STRUCTS): CORE_ML = struct open S structure Field = Record.Field fun maybeConstrain (x, t) = let open Layout in if !Control.showTypes then seq [x, str ": ", Type.layout t] else x end fun layoutTargs (ts: Type.t vector) = let open Layout in if !Control.showTypes andalso 0 < Vector.length ts then list (Vector.toListMap (ts, Type.layout)) else empty end structure Pat = struct datatype t = T of {node: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of unit -> Const.t | Layered of Var.t * t | List of t vector | Or of t vector | Record of t Record.t | Var of Var.t | Vector of t vector | Wild local fun make f (T r) = f r in val dest = make (fn {node, ty} => (node, ty)) val node = make #node val ty = make #ty end fun make (n, t) = T {node = n, ty = t} fun layout p = let val t = ty p open Layout in case node p of Con {arg, con, targs} => seq [Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME p => seq [str " ", layout p]] | Const f => Const.layout (f ()) | Layered (x, p) => seq [maybeConstrain (Var.layout x, t), str " as ", layout p] | List ps => list (Vector.toListMap (ps, layout)) | Or ps => list (Vector.toListMap (ps, layout)) | Record r => let val extra = Vector.exists (Type.deRecord t, fn (f, _) => Option.isNone (Record.peek (r, f))) in Record.layout {extra = if extra then ", ..." else "", layoutElt = layout, layoutTuple = fn ps => tuple (Vector.toListMap (ps, layout)), record = r, separator = " = "} end | Var x => maybeConstrain (Var.layout x, t) | Vector ps => vector (Vector.map (ps, layout)) | Wild => str "_" end fun wild t = make (Wild, t) fun var (x, t) = make (Var x, t) fun tuple ps = if 1 = Vector.length ps then Vector.first ps else make (Record (Record.tuple ps), Type.tuple (Vector.map (ps, ty))) local fun bool c = make (Con {arg = NONE, con = c, targs = Vector.new0 ()}, Type.bool) in val falsee: t = bool Con.falsee val truee: t = bool Con.truee end fun isUnit (p: t): bool = case node p of Record r => Record.forall (r, fn _ => false) | _ => false fun isWild (p: t): bool = case node p of Wild => true | _ => false fun isRefutable (p: t): bool = case node p of Con _ => true | Const _ => true | Layered (_, p) => isRefutable p | List _ => true | Or ps => Vector.exists (ps, isRefutable) | Record r => Record.exists (r, isRefutable) | Var _ => false | Vector _ => true | Wild => false fun foreachVar (p: t, f: Var.t -> unit): unit = let fun loop (p: t): unit = case node p of Con _ => () | Const _ => () | Layered (x, p) => (f x; loop p) | List ps => Vector.foreach (ps, loop) | Or ps => Vector.foreach (ps, loop) | Record r => Record.foreach (r, loop) | Var x => f x | Vector ps => Vector.foreach (ps, loop) | Wild => () in loop p end end structure NoMatch = struct datatype t = Impossible | RaiseAgain | RaiseBind | RaiseMatch end datatype noMatch = datatype NoMatch.t datatype dec = Datatype of {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: lambda, var: Var.t} vector, tyvars: unit -> Tyvar.t vector} | Val of {matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, rvbs: {lambda: lambda, var: Var.t} vector, tyvars: unit -> Tyvar.t vector, vbs: {ctxt: unit -> Layout.t, exp: exp, layPat: unit -> Layout.t, nest: string list, pat: Pat.t, regionPat: Region.t} vector} and exp = Exp of {node: expNode, ty: Type.t} and expNode = App of exp * exp | Case of {ctxt: unit -> Layout.t, kind: string * string, nest: string list, matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, noMatch: noMatch, region: Region.t, rules: {exp: exp, layPat: (unit -> Layout.t) option, pat: Pat.t, regionPat: Region.t} vector, test: exp} | Con of Con.t * Type.t vector | Const of unit -> Const.t | EnterLeave of exp * SourceInfo.t | Handle of {catch: Var.t * Type.t, handler: exp, try: exp} | Lambda of lambda | Let of dec vector * exp | List of exp vector | PrimApp of {args: exp vector, prim: Type.t Prim.t, targs: Type.t vector} | Raise of exp | Record of exp Record.t | Seq of exp vector | Var of (unit -> Var.t) * (unit -> Type.t vector) | Vector of exp vector and lambda = Lam of {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} local open Layout in fun layoutTyvars (ts: Tyvar.t vector) = case Vector.length ts of 0 => empty | 1 => seq [str " ", Tyvar.layout (Vector.sub (ts, 0))] | _ => seq [str " ", tuple (Vector.toListMap (ts, Tyvar.layout))] fun layoutConArg {arg, con} = seq [Con.layout con, case arg of NONE => empty | SOME t => seq [str " of ", Type.layout t]] fun layoutDec d = case d of Datatype v => seq [str "datatype", align (Vector.toListMap (v, fn {cons, tycon, tyvars} => seq [layoutTyvars tyvars, str " ", Tycon.layout tycon, str " = ", align (separateLeft (Vector.toListMap (cons, layoutConArg), "| "))]))] | Exception ca => seq [str "exception ", layoutConArg ca] | Fun {decs, tyvars, ...} => layoutFuns (tyvars, decs) | Val {rvbs, tyvars, vbs, ...} => align [layoutFuns (tyvars, rvbs), align (Vector.toListMap (vbs, fn {exp, pat, ...} => seq [str "val", mayAlign [seq [layoutTyvars (tyvars ()), str " ", Pat.layout pat, str " ="], layoutExp exp]]))] and layoutExp (Exp {node, ...}) = case node of App (e1, e2) => paren (seq [layoutExp e1, str " ", layoutExp e2]) | Case {rules, test, ...} => Pretty.casee {default = NONE, rules = Vector.map (rules, fn {exp, pat, ...} => (Pat.layout pat, layoutExp exp)), test = layoutExp test} | Con (c, targs) => seq [Con.layout c, layoutTargs targs] | Const f => Const.layout (f ()) | EnterLeave (e, si) => seq [str "EnterLeave ", tuple [layoutExp e, SourceInfo.layout si]] | Handle {catch, handler, try} => Pretty.handlee {catch = Var.layout (#1 catch), handler = layoutExp handler, try = layoutExp try} | Lambda l => layoutLambda l | Let (ds, e) => Pretty.lett (align (Vector.toListMap (ds, layoutDec)), layoutExp e) | List es => list (Vector.toListMap (es, layoutExp)) | PrimApp {args, prim, targs} => Pretty.primApp {args = Vector.map (args, layoutExp), prim = Prim.layout prim, targs = Vector.map (targs, Type.layout)} | Raise e => Pretty.raisee (layoutExp e) | Record r => Record.layout {extra = "", layoutElt = layoutExp, layoutTuple = fn es => tuple (Vector.toListMap (es, layoutExp)), record = r, separator = " = "} | Seq es => Pretty.seq (Vector.map (es, layoutExp)) | Var (var, targs) => if !Control.showTypes then let open Layout val targs = targs () in if Vector.isEmpty targs then Var.layout (var ()) else seq [Var.layout (var ()), str " ", Vector.layout Type.layout targs] end else Var.layout (var ()) | Vector es => vector (Vector.map (es, layoutExp)) and layoutFuns (tyvars, decs) = if Vector.isEmpty decs then empty else align [seq [str "val rec", layoutTyvars (tyvars ())], indent (align (Vector.toListMap (decs, fn {lambda as Lam {argType, body = Exp {ty = bodyType, ...}, ...}, var} => align [seq [maybeConstrain (Var.layout var, Type.arrow (argType, bodyType)), str " = "], indent (layoutLambda lambda, 3)])), 3)] and layoutLambda (Lam {arg, argType, body, ...}) = paren (align [seq [str "fn ", maybeConstrain (Var.layout arg, argType), str " =>"], layoutExp body]) fun layoutExpWithType (exp as Exp {ty, ...}) = let val node = layoutExp exp in if !Control.showTypes then seq [node, str " : ", Type.layout ty] else node end end structure Lambda = struct datatype t = datatype lambda val make = Lam fun dest (Lam r) = r val bogus = make {arg = Var.newNoname (), argType = Type.unit, body = Exp {node = Seq (Vector.new0 ()), ty = Type.unit}, mayInline = true} end structure Exp = struct type dec = dec type lambda = lambda datatype t = datatype exp datatype node = datatype expNode datatype noMatch = datatype noMatch val layout = layoutExp val layoutWithType = layoutExpWithType local fun make f (Exp r) = f r in val dest = make (fn {node, ty} => (node, ty)) val node = make #node val ty = make #ty end fun make (n, t) = Exp {node = n, ty = t} fun var (x: Var.t, ty: Type.t): t = make (Var (fn () => x, fn () => Vector.new0 ()), ty) fun isExpansive (e: t): bool = case node e of App (e1, e2) => (case node e1 of Con (c, _) => Con.equals (c, Con.reff) orelse isExpansive e2 | _ => true) | Case _ => true | Con _ => false | Const _ => false | EnterLeave _ => true | Handle _ => true | Lambda _ => false | Let _ => true | List es => Vector.exists (es, isExpansive) | PrimApp _ => true | Raise _ => true | Record r => Record.exists (r, isExpansive) | Seq _ => true | Var _ => false | Vector es => Vector.exists (es, isExpansive) fun tuple es = if 1 = Vector.length es then Vector.first es else make (Record (Record.tuple es), Type.tuple (Vector.map (es, ty))) val unit = tuple (Vector.new0 ()) local fun bool c = make (Con (c, Vector.new0 ()), Type.bool) in val falsee: t = bool Con.falsee val truee: t = bool Con.truee end fun lambda (l as Lam {argType, body, ...}) = make (Lambda l, Type.arrow (argType, ty body)) fun casee (z as {rules, ...}) = if Vector.isEmpty rules then Error.bug "CoreML.Exp.casee" else make (Case z, ty (#exp (Vector.first rules))) fun iff (test, thenCase, elseCase): t = casee {ctxt = fn () => Layout.empty, kind = ("if", "branch"), nest = [], matchDiags = {nonexhaustiveExn = Control.Elaborate.DiagDI.Default, nonexhaustive = Control.Elaborate.DiagEIW.Ignore, redundant = Control.Elaborate.DiagEIW.Ignore}, noMatch = Impossible, region = Region.bogus, rules = Vector.new2 ({exp = thenCase, layPat = NONE, pat = Pat.truee, regionPat = Region.bogus}, {exp = elseCase, layPat = NONE, pat = Pat.falsee, regionPat = Region.bogus}), test = test} fun andAlso (e1, e2) = iff (e1, e2, falsee) fun orElse (e1, e2) = iff (e1, truee, e2) fun whilee {expr, test} = let val loop = Var.newNoname () val loopTy = Type.arrow (Type.unit, Type.unit) val call = make (App (var (loop, loopTy), unit), Type.unit) val lambda = Lambda.make {arg = Var.newNoname (), argType = Type.unit, body = iff (test, make (Seq (Vector.new2 (expr, call)), Type.unit), unit), mayInline = true} in make (Let (Vector.new1 (Fun {decs = Vector.new1 {lambda = lambda, var = loop}, tyvars = fn () => Vector.new0 ()}), call), Type.unit) end fun foreachVar (e: t, f: Var.t -> unit): unit = let fun loop (e: t): unit = case node e of App (e1, e2) => (loop e1; loop e2) | Case {rules, test, ...} => (loop test ; Vector.foreach (rules, loop o #exp)) | Con _ => () | Const _ => () | EnterLeave (e, _) => loop e | Handle {handler, try, ...} => (loop handler; loop try) | Lambda l => loopLambda l | Let (ds, e) => (Vector.foreach (ds, loopDec) ; loop e) | List es => Vector.foreach (es, loop) | PrimApp {args, ...} => Vector.foreach (args, loop) | Raise e => loop e | Record r => Record.foreach (r, loop) | Seq es => Vector.foreach (es, loop) | Var (x, _) => f (x ()) | Vector es => Vector.foreach (es, loop) and loopDec d = case d of Datatype _ => () | Exception _ => () | Fun {decs, ...} => Vector.foreach (decs, loopLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, loopLambda o #lambda) ; Vector.foreach (vbs, loop o #exp)) and loopLambda (Lam {body, ...}) = loop body in loop e end end structure Dec = struct datatype t = datatype dec fun dropProfile d = let fun loopExp e = let fun mk node = Exp.make (node, Exp.ty e) in case Exp.node e of App (e1, e2) => mk (App (loopExp e1, loopExp e2)) | Case {ctxt, kind, nest, matchDiags, noMatch, region, rules, test} => mk (Case {ctxt = ctxt, kind = kind, nest = nest, matchDiags = matchDiags, noMatch = noMatch, region = region, rules = Vector.map (rules, fn {exp, layPat, pat, regionPat} => {exp = loopExp exp, layPat = layPat, pat = pat, regionPat = regionPat}), test = loopExp test}) | Con _ => e | Const _ => e | EnterLeave (exp, _) => loopExp exp | Handle {catch, handler, try} => mk (Handle {catch = catch, handler = loopExp handler, try = loopExp try}) | Lambda lambda => mk (Lambda (loopLambda lambda)) | Let (decs, exp) => mk (Let (Vector.map (decs, loopDec), loopExp exp)) | List exps => mk (List (Vector.map (exps, loopExp))) | PrimApp {args, prim, targs} => mk (PrimApp {args = Vector.map (args, loopExp), prim = prim, targs = targs}) | Raise exp => mk (Raise (loopExp exp)) | Record r => mk (Record (Record.map (r, loopExp))) | Seq exps => mk (Seq (Vector.map (exps, loopExp))) | Var _ => e | Vector exps => mk (Vector (Vector.map (exps, loopExp))) end and loopDec d = case d of Datatype _ => d | Exception _ => d | Fun {decs, tyvars} => Fun {decs = Vector.map (decs, fn {lambda, var} => {lambda = loopLambda lambda, var = var}), tyvars = tyvars} | Val {matchDiags, rvbs, tyvars, vbs} => Val {matchDiags = matchDiags, rvbs = Vector.map (rvbs, fn {lambda, var} => {lambda = loopLambda lambda, var = var}), tyvars = tyvars, vbs = Vector.map (vbs, fn {ctxt, exp, layPat, nest, pat, regionPat} => {ctxt = ctxt, exp = loopExp exp, layPat = layPat, nest = nest, pat = pat, regionPat = regionPat})} and loopLambda (Lam {arg, argType, body, mayInline}) = Lam {arg = arg, argType = argType, body = loopExp body, mayInline = mayInline} in loopDec d end val layout = layoutDec end structure Program = struct datatype t = T of {decs: Dec.t vector} fun dropProfile (T {decs}) = (Control.profile := Control.ProfileNone ; T {decs = Vector.map (decs, Dec.dropProfile)}) fun layouts (T {decs, ...}, output') = let open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (Layout.str "\n") ; Vector.foreach (decs, output o Dec.layout) end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "core-ml"} fun layoutStats (program as T {...}) = let open Layout in align [Control.sizeMessage ("coreML program", program)] end (* fun typeCheck (T {decs, ...}) = * let * fun checkExp (e: Exp.t): Ty.t = * let * val (n, t) = Exp.dest e * val * datatype z = datatype Exp.t * val t' = * case n of * App (e1, e2) => * let * val t1 = checkExp e1 * val t2 = checkExp e2 * in * case Type.deArrowOpt t1 of * NONE => error "application of non-function" * | SOME (u1, u2) => * if Type.equals (u1, t2) * then t2 * else error "function/argument mismatch" * end * | Case {rules, test} => * let * val {pat, exp} = Vector.first rules * in * Vector.foreach (rules, fn {pat, exp} => * Type.equals * (checkPat pat, * end * in * * end * in * end *) end end mlton-20210117+dfsg/mlton/core-ml/core-ml.sig000066400000000000000000000161621416264345000205650ustar00rootroot00000000000000(* Copyright (C) 2015,2017,2019 Matthew Fluet * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CORE_ML_STRUCTS = sig include ATOMS structure Type: sig type t val arrow: t * t -> t val bool: t val deConOpt: t -> (Tycon.t * t vector) option val deRecord: t -> (Record.Field.t * t) vector val isCharX: t -> bool val isInt: t -> bool val layout: t -> Layout.t val makeHom: {con: Tycon.t * 'a vector -> 'a, var: Tyvar.t -> 'a} -> {destroy: unit -> unit, hom: t -> 'a} val tuple: t vector -> t val unit: t end end signature CORE_ML = sig include CORE_ML_STRUCTS structure Pat: sig type t datatype node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of unit -> Const.t | Layered of Var.t * t | List of t vector | Or of t vector | Record of t Record.t | Var of Var.t | Vector of t vector | Wild val dest: t -> node * Type.t val falsee: t val foreachVar: t * (Var.t -> unit) -> unit (* true if pattern contains a constant, constructor or variable *) val isRefutable: t -> bool val isUnit: t -> bool val isWild: t -> bool val layout: t -> Layout.t val make: node * Type.t -> t val node: t -> node val var: Var.t * Type.t -> t val truee: t val tuple: t vector -> t val ty: t -> Type.t val wild: Type.t -> t end structure Exp: sig type dec type lambda type t datatype noMatch = Impossible | RaiseAgain | RaiseBind | RaiseMatch datatype node = App of t * t | Case of {ctxt: unit -> Layout.t, kind: string * string, nest: string list, matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, noMatch: noMatch, region: Region.t, rules: {exp: t, layPat: (unit -> Layout.t) option, pat: Pat.t, regionPat: Region.t} vector, test: t} | Con of Con.t * Type.t vector | Const of unit -> Const.t | EnterLeave of t * SourceInfo.t | Handle of {catch: Var.t * Type.t, handler: t, try: t} | Lambda of lambda | Let of dec vector * t | List of t vector | PrimApp of {args: t vector, prim: Type.t Prim.t, targs: Type.t vector} | Raise of t | Record of t Record.t | Seq of t vector | Var of (unit -> Var.t) * (unit -> Type.t vector) | Vector of t vector val andAlso: t * t -> t val casee: {ctxt: unit -> Layout.t, kind: string * string, nest: string list, matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, noMatch: noMatch, region: Region.t, rules: {exp: t, layPat: (unit -> Layout.t) option, pat: Pat.t, regionPat: Region.t} vector, test: t} -> t val dest: t -> node * Type.t val iff: t * t * t -> t val falsee: t val foreachVar: t * (Var.t -> unit) -> unit (* true if the expression may side-effect. See p 19 of Definition *) val isExpansive: t -> bool val lambda: lambda -> t val layout: t -> Layout.t val layoutWithType: t -> Layout.t val make: node * Type.t -> t val node: t -> node val orElse: t * t -> t val truee: t val tuple: t vector -> t val ty: t -> Type.t val unit: t val var: Var.t * Type.t -> t val whilee: {expr: t, test: t} -> t end structure Lambda: sig type t val bogus: t val dest: t -> {arg: Var.t, argType: Type.t, body: Exp.t, mayInline: bool} val make: {arg: Var.t, argType: Type.t, body: Exp.t, mayInline: bool} -> t end sharing type Exp.lambda = Lambda.t structure Dec: sig datatype t = Datatype of {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: Lambda.t, var: Var.t} vector, tyvars: unit -> Tyvar.t vector} | Val of {matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, rvbs: {lambda: Lambda.t, var: Var.t} vector, tyvars: unit -> Tyvar.t vector, vbs: {ctxt: unit -> Layout.t, exp: Exp.t, layPat: unit -> Layout.t, nest: string list, pat: Pat.t, regionPat: Region.t} vector} val layout: t -> Layout.t end sharing type Exp.dec = Dec.t structure Program: sig datatype t = T of {decs: Dec.t vector} val dropProfile: t -> t val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val toFile: {display: t Control.display, style: Control.style, suffix: string} end end mlton-20210117+dfsg/mlton/core-ml/dead-code.fun000066400000000000000000000052451416264345000210420ustar00rootroot00000000000000(* Copyright (C) 2011 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor DeadCode (S: DEAD_CODE_STRUCTS): DEAD_CODE = struct open S open CoreML open Dec fun deadCode {prog} = let val {get = varIsUsed, set = setVarIsUsed, destroy, ...} = Property.destGetSet (Var.plist, Property.initConst false) fun patVarIsUsed (p: Pat.t): bool = Exn.withEscape (fn escape => (Pat.foreachVar (p, fn x => if varIsUsed x then escape true else ()) ; false)) fun decIsWildOrUnit (d: Dec.t): bool = case d of Val {rvbs, vbs, ...} => 0 = Vector.length rvbs andalso 1 = Vector.length vbs andalso let val pat = #pat (Vector.first vbs) in Pat.isWild pat orelse Pat.isUnit pat end | _ => false fun decIsNeeded (d: Dec.t): bool = case d of Datatype _ => true | Exception _ => true | Fun {decs, ...} => Vector.exists (decs, varIsUsed o #var) | Val {rvbs, vbs, ...} => Vector.exists (rvbs, varIsUsed o #var) orelse Vector.exists (vbs, patVarIsUsed o #pat) fun useVar x = setVarIsUsed (x, true) fun useExp (e: Exp.t): unit = Exp.foreachVar (e, useVar) fun useLambda (l: Lambda.t): unit = useExp (#body (Lambda.dest l)) fun useDec (d: Dec.t): unit = case d of Datatype _ => () | Exception _ => () | Fun {decs, ...} => Vector.foreach (decs, useLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, useLambda o #lambda) ; Vector.foreach (vbs, useExp o #exp)) val n = Vector.length prog val m = n - 1 val prog = Vector.tabulate (n, fn i => let val (decs, deadCode) = Vector.sub (prog, m - i) in if deadCode then List.fold (rev decs, [], fn (dec, decs) => if decIsWildOrUnit dec orelse decIsNeeded dec then (useDec dec; dec :: decs) else decs) else (List.foreach (decs, useDec) ; decs) end) val _ = destroy () in {prog = Vector.rev prog} end end mlton-20210117+dfsg/mlton/core-ml/dead-code.sig000066400000000000000000000010041416264345000210210ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DEAD_CODE_STRUCTS = sig structure CoreML: CORE_ML end signature DEAD_CODE = sig include DEAD_CODE_STRUCTS val deadCode: {prog: (CoreML.Dec.t list * bool) vector} -> {prog: CoreML.Dec.t list vector} end mlton-20210117+dfsg/mlton/core-ml/sources.cm000066400000000000000000000007101416264345000205170ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature CORE_ML functor CoreML functor DeadCode is ../../lib/mlton/sources.cm ../ast/sources.cm ../atoms/sources.cm ../control/sources.cm core-ml.sig core-ml.fun dead-code.sig dead-code.fun mlton-20210117+dfsg/mlton/core-ml/sources.mlb000066400000000000000000000007261416264345000207010ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb core-ml.sig core-ml.fun dead-code.sig dead-code.fun in signature CORE_ML functor CoreML functor DeadCode end mlton-20210117+dfsg/mlton/defunctorize/000077500000000000000000000000001416264345000176605ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/defunctorize/defunctorize.fun000066400000000000000000001407641416264345000231070ustar00rootroot00000000000000(* Copyright (C) 2015,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Defunctorize (S: DEFUNCTORIZE_STRUCTS): DEFUNCTORIZE = struct open S local open CoreML in structure Const = Const structure Cdec = Dec structure Cexp = Exp structure Clambda = Lambda structure Cpat = Pat structure Prim = Prim structure RealSize = RealSize structure Record = Record structure SortedRecord = SortedRecord structure SourceInfo = SourceInfo structure Ctype = Type structure WordSize = WordSize structure WordX = WordX end structure Field = Record.Field local open Xml in structure Xcases = Cases structure Con = Con structure Xdec = Dec structure Xexp = DirectExp structure Xlambda = Lambda structure Xpat = Pat structure XprimExp = PrimExp structure Tycon = Tycon structure Xtype = Type structure Tyvar = Tyvar structure Var = Var structure XvarExp = VarExp end structure NestedPat = NestedPat (open Xml) structure MatchCompile = MatchCompile (open Xml structure Type = Xtype structure NestedPat = NestedPat structure Exp = struct open Xexp val lett = let1 val var = monoVar fun detuple {tuple, body} = Xexp.detuple {tuple = tuple, body = fn xts => body (Vector.map (xts, fn (x, t) => (XvarExp.var x, t)))} fun devector {vector, length, body} = Xexp.devector {vector = vector, length = length, body = fn xts => body (Vector.map (xts, fn (x, t) => (XvarExp.var x, t)))} end) structure Xexp = struct open Xexp local fun exn (c: Con.t): Xexp.t = conApp {arg = NONE, con = c, targs = Vector.new0 (), ty = Xtype.exn} in val bind = exn Con.bind val match = exn Con.match end end fun enterLeave (e: Xexp.t, t, si): Xexp.t = Xexp.fromExp (Xml.Exp.enterLeave (Xexp.toExp e, t, si), t) local val matchDiagnostics: (unit -> unit) list ref = ref [] in fun addMatchDiagnostic (diag, mkArg) = case diag of Control.Elaborate.DiagEIW.Error => List.push (matchDiagnostics, Control.error o mkArg) | Control.Elaborate.DiagEIW.Ignore => () | Control.Elaborate.DiagEIW.Warn => List.push (matchDiagnostics, Control.warning o mkArg) fun showMatchDiagnostics () = List.foreach (!matchDiagnostics, fn th => th ()) end fun casee {ctxt: unit -> Layout.t, caseType: Xtype.t, cases: {exp: Xexp.t, layPat: (unit -> Layout.t) option, pat: NestedPat.t, regionPat: Region.t} vector, conTycon, kind: (string * string), nest: string list, matchDiags: {nonexhaustiveExn: Control.Elaborate.DiagDI.t, nonexhaustive: Control.Elaborate.DiagEIW.t, redundant: Control.Elaborate.DiagEIW.t}, noMatch, region: Region.t, test = (test: Xexp.t, testType: Xtype.t), tyconCons}: Xexp.t = let val nonexhaustiveExnDiag = #nonexhaustiveExn matchDiags val nonexhaustiveDiag = #nonexhaustive matchDiags val redundantDiag = #redundant matchDiags val cases = Vector.map (cases, fn {exp, layPat, pat, regionPat} => {exp = fn () => exp, isDefault = false, layPat = layPat, numPats = ref 0, numUses = ref 0, pat = pat, regionPat = regionPat}) fun raiseExn (f, mayWrap) = let val e = Var.newNoname () val exp = Xexp.raisee {exn = f e, extend = true, ty = caseType} val exp = fn () => if let open Control in !profile <> ProfileNone andalso !profileIL = ProfileSource andalso !profileRaise end then case mayWrap of NONE => exp | SOME kind => enterLeave (exp, caseType, SourceInfo.function {name = (concat [""]) :: nest, region = region}) else exp in Vector.concat [cases, Vector.new1 {exp = exp, isDefault = true, layPat = NONE, numPats = ref 0, numUses = ref 0, pat = NestedPat.make (NestedPat.Var e, testType), regionPat = Region.bogus}] end val cases = let datatype z = datatype Cexp.noMatch in case noMatch of Impossible => cases | RaiseAgain => raiseExn (fn e => Xexp.monoVar (e, Xtype.exn), NONE) | RaiseBind => raiseExn (fn _ => Xexp.bind, SOME "Bind") | RaiseMatch => raiseExn (fn _ => Xexp.match, SOME "Match") end fun matchCompile () = let val testVar = Var.newNoname () val decs = ref [] val cases = Vector.map (cases, fn {exp = e, numPats, numUses, pat = p, ...} => let val args = Vector.fromList (NestedPat.varsAndTypes p) val (vars, tys) = Vector.unzip args val func = Var.newNoname () val arg = Var.newNoname () val argType = Xtype.tuple tys val funcType = Xtype.arrow (argType, caseType) fun dec () = Xdec.MonoVal {var = func, ty = funcType, exp = XprimExp.Lambda (Xlambda.make {arg = arg, argType = argType, body = (Xexp.toExp (Xexp.detupleBind {tuple = Xexp.monoVar (arg, argType), components = vars, body = e ()})), mayInline = true})} fun finish np = (numPats := np ; fn rename => (if 0 = !numUses then List.push (decs, dec ()) else () ; Int.inc numUses ; (Xexp.app {func = Xexp.monoVar (func, funcType), arg = Xexp.tuple {exps = (Vector.map (args, fn (x, t) => Xexp.monoVar (rename x, t))), ty = argType}, ty = caseType}))) in (p, finish) end) val (body, nonexhaustiveExamples) = MatchCompile.matchCompile {caseType = caseType, cases = cases, conTycon = conTycon, test = testVar, testType = testType, tyconCons = tyconCons} (* Must convert to a normal expression to force everything. *) val body = Xexp.toExp body val nonexhaustiveExamples = if noMatch = Cexp.Impossible then NONE else let val dropOnlyExns = case nonexhaustiveExnDiag of Control.Elaborate.DiagDI.Default => {dropOnlyExns = false} | Control.Elaborate.DiagDI.Ignore => {dropOnlyExns = true} in nonexhaustiveExamples dropOnlyExns end in (Xexp.let1 {var = testVar, exp = test, body = Xexp.lett {decs = !decs, body = Xexp.fromExp (body, caseType)}}, nonexhaustiveExamples) end datatype z = datatype NestedPat.node fun lett (x, e) = Xexp.let1 {var = x, exp = test, body = e} fun wild e = lett (Var.newNoname (), e) val (exp, nonexhaustiveExamples) = if Vector.isEmpty cases then Error.bug "Defunctorize.casee: case with no patterns" else let val {exp = e, pat = p, numPats, numUses, ...} = Vector.first cases fun use () = (numPats := 1; numUses := 1) fun exhaustive exp = (exp, NONE) fun loop p = case NestedPat.node p of Wild => (use (); exhaustive (wild (e ()))) | Var x => (use (); exhaustive (lett (x, e ()))) | Record rps => let val ps = SortedRecord.range rps fun doitRecord () = (* It's a flat record pattern. * Generate the selects. *) let val _ = use () val t = Var.newNoname () val tuple = XvarExp.mono t val tys = Xtype.deTuple testType val (_, decs) = Vector.fold2 (ps, tys, (0, []), fn (p, ty, (i, decs)) => case NestedPat.node p of Var x => (i + 1, Xdec.MonoVal {var = x, ty = ty, exp = (XprimExp.Select {tuple = tuple, offset = i})} :: decs) | Wild => (i + 1, decs) | _ => Error.bug "Defunctorize.casee: flat record") in exhaustive (Xexp.let1 {var = t, exp = test, body = Xexp.lett {decs = decs, body = e ()}}) end in if Vector.forall (ps, NestedPat.isVarOrWild) then if Vector.length ps = 1 then loop (Vector.first ps) else doitRecord () else matchCompile () end | _ => matchCompile () in loop p end (* diagnoseRedundant *) val _ = Vector.foreachr (cases, fn {isDefault, layPat = layPat, numPats, numUses, regionPat = regionPat, ...} => let fun doit (msg1, msg2) = let open Layout in addMatchDiagnostic (redundantDiag, fn () => (regionPat, str (concat [#1 kind, msg1]), align [seq [str (concat [msg2, ": "]), case layPat of NONE => Error.bug "Defunctorize.casee: redundant match with no lay" | SOME layPat => layPat ()], ctxt ()])) end in if not isDefault andalso !numUses = 0 then ((* Rule with no uses; fully redundant. *) doit (" has redundant " ^ #2 kind, "redundant pattern")) else if not isDefault andalso !numUses > 0 andalso !numUses < !numPats then ((* Rule with some uses but fewer uses than pats; partially redundant. *) doit (" has " ^ #2 kind ^ " with redundancy", "pattern with redundancy")) else () end) (* diagnoseNonexhaustive *) val _ = Option.app (nonexhaustiveExamples, fn es => let open Layout in addMatchDiagnostic (nonexhaustiveDiag, fn () => (region, str (concat [#1 kind, " is not exhaustive"]), align [seq [str "missing pattern: ", es], ctxt ()])) end) in exp end val casee = Trace.trace ("Defunctorize.casee", Region.layout o #region, Xml.Exp.layout o Xexp.toExp) casee fun 'a sortByField (v: (Field.t * 'a) vector): 'a vector = Vector.map (QuickSort.sortVector (v, fn ((f, _), (f', _)) => Field.<= (f, f')), #2) fun valDec (tyvars: Tyvar.t vector, x: Var.t, e: Xexp.t, et: Xtype.t, e': Xexp.t): Xexp.t = Xexp.lett {body = e', decs = [Xdec.PolyVal {exp = Xexp.toExp e, ty = et, tyvars = tyvars, var = x}]} structure Xexp = struct open Xexp fun list (es: Xexp.t vector, ty: Xtype.t, {forceLeftToRight: bool}) : Xexp.t = let val targs = #2 (valOf (Xtype.deConOpt ty)) val eltTy = Vector.first targs val nill: Xexp.t = Xexp.conApp {arg = NONE, con = Con.nill, targs = targs, ty = ty} val consArgTy = Xtype.tuple (Vector.new2 (eltTy, ty)) val cons: Xexp.t * Xexp.t -> Xexp.t = fn (e1, e2) => Xexp.conApp {arg = SOME (Xexp.tuple {exps = Vector.new2 (e1, e2), ty = consArgTy}), con = Con.cons, targs = targs, ty = ty} in if not forceLeftToRight then (* Build the list right to left. *) Vector.foldr (es, nill, fn (e, rest) => let val var = Var.newNoname () in Xexp.let1 {body = cons (e, monoVar (var, ty)), exp = rest, var = var} end) else if Vector.length es < 20 then Vector.foldr (es, nill, cons) else let val revArgTy = Xtype.tuple (Vector.new2 (ty, ty)) val revTy = Xtype.arrow (revArgTy, ty) val revVar = Var.newString "rev" fun rev (e1, e2) = Xexp.app {func = Xexp.monoVar (revVar, revTy), arg = Xexp.tuple {exps = Vector.new2 (e1, e2), ty = revArgTy}, ty = ty} fun detuple2 (tuple: Xexp.t, f: XvarExp.t * XvarExp.t -> Xexp.t): Xexp.t = Xexp.detuple {body = fn xs => let fun x i = #1 (Vector.sub (xs, i)) in f (x 0, x 1) end, tuple = tuple} val revArg = Var.newNoname () val revLambda = Xlambda.make {arg = revArg, argType = revArgTy, mayInline = true, body = Xexp.toExp (detuple2 (Xexp.monoVar (revArg, revArgTy), fn (l, ac) => let val ac = Xexp.varExp (ac, ty) val consArg = Var.newNoname () in Xexp.casee {cases = Xcases.Con (Vector.new2 ((Xpat.T {arg = NONE, con = Con.nill, targs = targs}, ac), (Xpat.T {arg = SOME (consArg, consArgTy), con = Con.cons, targs = targs}, detuple2 (Xexp.monoVar (consArg, consArgTy), fn (x, l) => rev (Xexp.varExp (l, ty), cons (Xexp.varExp (x, eltTy), ac)))))), default = NONE, test = Xexp.varExp (l, ty), ty = ty} end))} val revDec = Xdec.Fun {decs = Vector.new1 {lambda = revLambda, ty = revTy, var = revVar}, tyvars = Vector.new0 ()} val l = Var.newNoname () val (l, body) = Vector.foldr (es, (l, Xexp.lett {decs = [revDec], body = rev (Xexp.monoVar (l, ty), nill)}), fn (e, (l, body)) => let val l' = Var.newNoname () in (l', Xexp.let1 {body = body, exp = cons (e, Xexp.monoVar (l', ty)), var = l}) end) in Xexp.let1 {body = body, exp = nill, var = l} end end end fun defunctorize (CoreML.Program.T {decs}) = let val {get = conExtraArgs: Con.t -> Xtype.t vector option, set = setConExtraArgs, destroy = destroy1, ...} = Property.destGetSetOnce (Con.plist, Property.initConst NONE) val {get = tyconExtraArgs: Tycon.t -> Xtype.t vector option, set = setTyconExtraArgs, destroy = destroy2, ...} = Property.destGetSetOnce (Tycon.plist, Property.initConst NONE) val {destroy = destroy3, hom = loopTy} = let fun con (c, ts) = let val ts = case tyconExtraArgs c of NONE => ts | SOME ts' => Vector.concat [ts', ts] in Xtype.con (c, ts) end in Ctype.makeHom {con = con, var = Xtype.var} end val loopTy = Trace.trace ("Defunctorize.loopTy", Ctype.layout, Xtype.layout) loopTy fun conTargs (c: Con.t, ts: Ctype.t vector): Xtype.t vector = let val ts = Vector.map (ts, loopTy) in case conExtraArgs c of NONE => ts | SOME ts' => Vector.concat [ts', ts] end val {get = conTycon, set = setConTycon, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conTycon", Con.layout)) val {get = tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector, set = setTyconCons, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconCons", Tycon.layout)) val setConTycon = Trace.trace2 ("Defunctorize.setConTycon", Con.layout, Tycon.layout, Unit.layout) setConTycon val datatypes = ref [] (* Process all the datatypes. *) fun loopDec (d: Cdec.t) = let datatype z = datatype Cdec.t in case d of Datatype dbs => let val frees: Tyvar.t list ref = ref [] val _ = Vector.foreach (dbs, fn {cons, tyvars, ...} => let fun var (a: Tyvar.t): unit = let fun eq a' = Tyvar.equals (a, a') in if Vector.exists (tyvars, eq) orelse List.exists (!frees, eq) then () else List.push (frees, a) end val {destroy, hom} = Ctype.makeHom {con = fn _ => (), var = var} val _ = Vector.foreach (cons, fn {arg, ...} => Option.app (arg, hom)) val _ = destroy () in () end) val frees = !frees val dbs = if List.isEmpty frees then dbs else let val frees = Vector.fromList frees val extra = Vector.map (frees, Xtype.var) in Vector.map (dbs, fn {cons, tycon, tyvars} => let val _ = setTyconExtraArgs (tycon, SOME extra) val _ = Vector.foreach (cons, fn {con, ...} => setConExtraArgs (con, SOME extra)) in {cons = cons, tycon = tycon, tyvars = Vector.concat [frees, tyvars]} end) end in Vector.foreach (dbs, fn {cons, tycon, tyvars} => let val _ = setTyconCons (tycon, Vector.map (cons, fn {arg, con} => {con = con, hasArg = isSome arg})) val cons = Vector.map (cons, fn {arg, con} => (setConTycon (con, tycon) ; {arg = Option.map (arg, loopTy), con = con})) val _ = if Tycon.equals (tycon, Tycon.reff) then () else List.push (datatypes, {cons = cons, tycon = tycon, tyvars = tyvars}) in () end) end | Exception {con, ...} => setConTycon (con, Tycon.exn) | Fun {decs, ...} => Vector.foreach (decs, loopLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, loopLambda o #lambda) ; Vector.foreach (vbs, loopExp o #exp)) end and loopExp (e: Cexp.t): unit = let datatype z = datatype Cexp.node in case Cexp.node e of App (e, e') => (loopExp e; loopExp e') | Case {rules, test, ...} => (loopExp test ; Vector.foreach (rules, loopExp o #exp)) | Con _ => () | Const _ => () | EnterLeave (e, _) => loopExp e | Handle {handler, try, ...} => (loopExp handler; loopExp try) | Lambda l => loopLambda l | Let (ds, e) => (Vector.foreach (ds, loopDec); loopExp e) | List es => Vector.foreach (es, loopExp) | PrimApp {args, ...} => Vector.foreach (args, loopExp) | Raise e => loopExp e | Record r => Record.foreach (r, loopExp) | Seq es => Vector.foreach (es, loopExp) | Var _ => () | Vector es => Vector.foreach (es, loopExp) end and loopLambda (l: Clambda.t): unit = loopExp (#body (Clambda.dest l)) fun loopPat (p: Cpat.t): NestedPat.t = let val (p, t) = Cpat.dest p val t' = loopTy t datatype z = datatype Cpat.node val p = case p of Con {arg, con, targs} => NestedPat.Con {arg = Option.map (arg, loopPat), con = con, targs = conTargs (con, targs)} | Const f => NestedPat.Const {const = f (), isChar = Ctype.isCharX t, isInt = Ctype.isInt t} | Layered (x, p) => NestedPat.Layered (x, loopPat p) | List ps => let val targs = Vector.map (#2 (valOf (Ctype.deConOpt t)), loopTy) in Vector.foldr (ps, NestedPat.Con {arg = NONE, con = Con.nill, targs = targs}, fn (p, np) => NestedPat.Con {arg = SOME (NestedPat.tuple (Vector.new2 (loopPat p, NestedPat.make (np, t')))), con = Con.cons, targs = targs}) end | Record r => NestedPat.Record (SortedRecord.fromVector (Vector.map (Ctype.deRecord t, fn (f, t: Ctype.t) => (f, case Record.peek (r, f) of NONE => NestedPat.make (NestedPat.Wild, loopTy t) | SOME p => loopPat p)))) | Or ps => NestedPat.Or (Vector.map (ps, loopPat)) | Var x => NestedPat.Var x | Vector ps => NestedPat.Vector (Vector.map (ps, loopPat)) | Wild => NestedPat.Wild in NestedPat.make (p, t') end val _ = Vector.foreach (decs, loopDec) (* Now, do the actual defunctorization. *) fun loopDec (d: Cdec.t, e: Xexp.t, et: Xtype.t): Xexp.t = let fun prefix (d: Xdec.t) = Xexp.lett {decs = [d], body = e} fun processLambdas v = Vector.map (Vector.rev v, fn {lambda, var} => let val {arg, argType, body, bodyType, mayInline} = loopLambda lambda in {lambda = Xlambda.make {arg = arg, argType = argType, body = Xexp.toExp body, mayInline = mayInline}, ty = Xtype.arrow (argType, bodyType), var = var} end) datatype z = datatype Cdec.t in case d of Datatype _ => e | Exception {arg, con} => prefix (Xdec.Exception {arg = Option.map (arg, loopTy), con = con}) | Fun {decs, tyvars} => prefix (Xdec.Fun {decs = processLambdas decs, tyvars = tyvars ()}) | Val {matchDiags, rvbs, tyvars, vbs} => let val tyvars = tyvars () val bodyType = et val e = Vector.foldr (vbs, e, fn ({ctxt, exp, layPat, nest, pat, regionPat}, e) => let fun patDec (p: NestedPat.t, e: Xexp.t, body: Xexp.t, bodyType: Xtype.t, mayWarn: bool) = casee {ctxt = ctxt, caseType = bodyType, cases = Vector.new1 {exp = body, layPat = SOME layPat, pat = p, regionPat = regionPat}, conTycon = conTycon, kind = ("declaration", "pattern"), nest = nest, matchDiags = if mayWarn then matchDiags else {nonexhaustiveExn = Control.Elaborate.DiagDI.Default, nonexhaustive = Control.Elaborate.DiagEIW.Ignore, redundant = Control.Elaborate.DiagEIW.Ignore}, noMatch = Cexp.RaiseBind, region = regionPat, test = (e, NestedPat.ty p), tyconCons = tyconCons} val isExpansive = Cexp.isExpansive exp val (exp, expType) = loopExp exp val pat = loopPat pat fun vd (x: Var.t) = valDec (tyvars, x, exp, expType, e) in if Vector.isEmpty tyvars then patDec (pat, exp, e, bodyType, true) else if isExpansive then let val x = Var.newNoname () val thunk = let open Xexp in toExp (lambda {arg = Var.newNoname (), argType = Xtype.unit, body = exp, bodyType = expType, mayInline = true}) end val thunkTy = Xtype.arrow (Xtype.unit, expType) fun subst t = Xtype.substitute (t, Vector.map (tyvars, fn a => (a, Xtype.unit))) val body = Xexp.app {arg = Xexp.unit (), func = Xexp.var {targs = (Vector.map (tyvars, fn _ => Xtype.unit)), ty = subst thunkTy, var = x}, ty = subst expType} val decs = [Xdec.PolyVal {exp = thunk, ty = thunkTy, tyvars = tyvars, var = x}] in patDec (NestedPat.replaceTypes (pat, subst), Xexp.lett {body = body, decs = decs}, e, bodyType, true) end else case NestedPat.node pat of NestedPat.Wild => vd (Var.newNoname ()) | NestedPat.Var x => vd x | _ => (* Polymorphic pattern. * val 'a Foo (y1, y2) = e * Expands to * val 'a x = e * val Foo (_, _) = x (* for match warnings *) * val 'a y1 = case x of Foo (y1', _) => y1' * val 'a y2 = case x of Foo (_, y2') => y2' *) let val x = Var.newNoname () val xt = expType val targs = Vector.map (tyvars, Xtype.var) val e = List.fold (NestedPat.varsAndTypes pat, e, fn ((y, yt), e) => let val y' = Var.new y val pat = NestedPat.removeOthersReplace (pat, {old = y, new = y'}) in valDec (tyvars, y, patDec (pat, Xexp.var {targs = targs, ty = xt, var = x}, Xexp.monoVar (y', yt), yt, false), yt, e) end) fun instantiatePat () = let val pat = NestedPat.removeVars pat fun con (_, c, ts) = Xtype.con (c, ts) fun var (t, a) = if (Vector.exists (tyvars, fn a' => Tyvar.equals (a, a'))) then Xtype.unit else t val {destroy, hom} = Xtype.makeHom {con = con, var = var} val pat = NestedPat.replaceTypes (pat, hom) val _ = destroy () in pat end val e = if NestedPat.isRefutable pat then let val targs = Vector.map (tyvars, fn _ => Xtype.unit) val pat = instantiatePat () in patDec (pat, Xexp.var {targs = targs, ty = NestedPat.ty pat, var = x}, e, bodyType, true) end else e in valDec (tyvars, x, exp, expType, e) end end) in if Vector.isEmpty rvbs then e else Xexp.lett {decs = [Xdec.Fun {decs = processLambdas rvbs, tyvars = tyvars}], body = e} end end and loopDecs (ds: Cdec.t vector, (e: Xexp.t, t: Xtype.t)): Xexp.t = loopDecsList (Vector.toList ds, (e, t)) (* Convert vector->list to allow processed Cdecs to be GC'ed. *) and loopDecsList (ds: Cdec.t list, (e: Xexp.t, t: Xtype.t)): Xexp.t = List.foldr (ds, e, fn (d, e) => loopDec (d, e, t)) and loopExp (e: Cexp.t): Xexp.t * Xtype.t = let val (n, ty) = Cexp.dest e val ty = loopTy ty fun conApp {arg, con, targs, ty} = if Con.equals (con, Con.reff) then Xexp.primApp {args = Vector.new1 arg, prim = Prim.Ref_ref, targs = targs, ty = ty} else Xexp.conApp {arg = SOME arg, con = con, targs = targs, ty = ty} datatype z = datatype Cexp.node val exp = case n of App (e1, e2) => let val (e2, _) = loopExp e2 in case Cexp.node e1 of Con (con, targs) => conApp {arg = e2, con = con, targs = conTargs (con, targs), ty = ty} | _ => Xexp.app {arg = e2, func = #1 (loopExp e1), ty = ty} end | Case {ctxt, kind, nest, matchDiags, noMatch, region, rules, test, ...} => casee {ctxt = ctxt, caseType = ty, cases = Vector.map (rules, fn {exp, layPat, pat, regionPat} => {exp = #1 (loopExp exp), layPat = layPat, pat = loopPat pat, regionPat = regionPat}), conTycon = conTycon, kind = kind, nest = nest, matchDiags = matchDiags, noMatch = noMatch, region = region, test = loopExp test, tyconCons = tyconCons} | Con (con, targs) => let val targs = conTargs (con, targs) in case Xtype.deArrowOpt ty of NONE => Xexp.conApp {arg = NONE, con = con, targs = targs, ty = ty} | SOME (argType, bodyType) => let val arg = Var.newNoname () in Xexp.lambda {arg = arg, argType = argType, body = (conApp {arg = Xexp.monoVar (arg, argType), con = con, targs = targs, ty = bodyType}), bodyType = bodyType, mayInline = true} end end | Const f => let val c = f () in if Xtype.equals (ty, Xtype.bool) then (case c of Const.Word w => if WordX.isZero w then Xexp.falsee () else Xexp.truee () | _ => Error.bug "Defunctorize.loopExp: Const:strange boolean constant") else Xexp.const c end | EnterLeave (e, si) => let val (e, t) = loopExp e in enterLeave (e, t, si) end | Handle {catch = (x, t), handler, try} => Xexp.handlee {catch = (x, loopTy t), handler = #1 (loopExp handler), try = #1 (loopExp try), ty = ty} | Lambda l => Xexp.lambda (loopLambda l) | Let (ds, e) => loopDecs (ds, loopExp e) | List es => let (* Must evaluate list components left-to-right if there * is more than one expansive expression. *) val numExpansive = Vector.fold (es, 0, fn (e, n) => if Cexp.isExpansive e then n + 1 else n) in Xexp.list (Vector.map (es, #1 o loopExp), ty, {forceLeftToRight = 2 <= numExpansive}) end | PrimApp {args, prim, targs} => let val args = Vector.map (args, #1 o loopExp) in if (case prim of Prim.Real_rndToReal (s1, s2) => RealSize.equals (s1, s2) | Prim.String_toWord8Vector => true | Prim.Word_extdToWord (s1, s2, _) => WordSize.equals (s1, s2) | Prim.Word8Vector_toString => true | _ => false) then Vector.first args else Xexp.primApp {args = args, prim = Prim.map (prim, loopTy), targs = Vector.map (targs, loopTy), ty = ty} end | Raise e => Xexp.raisee {exn = #1 (loopExp e), extend = true, ty = ty} | Record r => (* The components of the record have to be evaluated left to * right as they appeared in the source program, but then * ordered according to sorted field name within the tuple. *) let val fes = Record.toVector r in Xexp.seq (Vector.map (fes, #1 o loopExp o #2), fn es => Xexp.tuple {exps = (sortByField (Vector.map2 (fes, es, fn ((f, _), e) => (f, e)))), ty = ty}) end | Seq es => Xexp.sequence (Vector.map (es, #1 o loopExp)) | Var (var, targs) => Xexp.var {targs = Vector.map (targs (), loopTy), ty = ty, var = var ()} | Vector es => Xexp.primApp {args = Vector.map (es, #1 o loopExp), prim = Prim.Vector_vector, targs = Vector.new1 (Xtype.deVector ty), ty = ty} in (exp, ty) end and loopLambda (l: Clambda.t) = let val {arg, argType, body, mayInline} = Clambda.dest l val (body, bodyType) = loopExp body in {arg = arg, argType = loopTy argType, body = body, bodyType = bodyType, mayInline = mayInline} end val body = Xexp.toExp (loopDecs (decs, (Xexp.unit (), Xtype.unit))) val _ = showMatchDiagnostics () val _ = (destroy1 (); destroy2 (); destroy3 ()) in Xml.Program.T {body = body, datatypes = Vector.fromList (!datatypes)} end end mlton-20210117+dfsg/mlton/defunctorize/defunctorize.sig000066400000000000000000000007401416264345000230660ustar00rootroot00000000000000(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DEFUNCTORIZE_STRUCTS = sig structure CoreML: CORE_ML structure Xml: XML sharing CoreML.Atoms = Xml.Atoms end signature DEFUNCTORIZE = sig include DEFUNCTORIZE_STRUCTS val defunctorize: CoreML.Program.t -> Xml.Program.t end mlton-20210117+dfsg/mlton/defunctorize/sources.cm000066400000000000000000000006671416264345000216750ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor Defunctorize is ../../lib/mlton/sources.cm ../control/sources.cm ../core-ml/sources.cm ../match-compile/sources.cm ../xml/sources.cm defunctorize.sig defunctorize.fun mlton-20210117+dfsg/mlton/defunctorize/sources.mlb000066400000000000000000000007231416264345000220410ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb ../match-compile/sources.mlb ../xml/sources.mlb defunctorize.sig defunctorize.fun in functor Defunctorize end mlton-20210117+dfsg/mlton/elaborate/000077500000000000000000000000001416264345000171155ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/elaborate/decs.fun000066400000000000000000000010461416264345000205460ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Decs (S: DECS_STRUCTS): DECS = struct open S structure Dec = CoreML.Dec type dec = CoreML.Dec.t open AppendList type t = dec t fun add (ds, d) = append (ds, single d) fun layout ds = let open Layout in align (Vector.toListMap (toVector ds, Dec.layout)) end end mlton-20210117+dfsg/mlton/elaborate/decs.sig000066400000000000000000000017211416264345000205400ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DECS_STRUCTS = sig structure CoreML: CORE_ML end signature DECS = sig include DECS_STRUCTS type dec = CoreML.Dec.t type t val add: t * dec -> t (* add a dec to the end of the list *) val append: t * t -> t val appends: t list -> t val appendsV: t vector -> t val cons: dec * t -> t val empty: t val fold: t * 'a * (dec * 'a -> 'a) -> 'a val foreach: t * (dec -> unit) -> unit val fromList: dec list -> t val fromVector: dec vector -> t val layout: t -> Layout.t val map: t * (dec -> dec) -> t val single: dec -> t val toList: t -> dec list val toVector: t -> dec vector end mlton-20210117+dfsg/mlton/elaborate/elaborate-core.fun000066400000000000000000005534531416264345000225320ustar00rootroot00000000000000(* Copyright (C) 2009-2012,2015,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaborateCore (S: ELABORATE_CORE_STRUCTS): ELABORATE_CORE = struct open S local open Control.Elaborate in val nonexhaustiveBind = fn () => current nonexhaustiveBind val nonexhaustiveExnBind = fn () => current nonexhaustiveExnBind val nonexhaustiveExnMatch = fn () => current nonexhaustiveExnMatch val nonexhaustiveExnRaise = fn () => current nonexhaustiveExnRaise val nonexhaustiveMatch = fn () => current nonexhaustiveMatch val nonexhaustiveRaise = fn () => current nonexhaustiveRaise val redundantBind = fn () => current redundantBind val redundantMatch = fn () => current redundantMatch val redundantRaise = fn () => current redundantRaise val resolveScope = fn () => current resolveScope val sequenceNonUnit = fn () => current sequenceNonUnit val valrecConstr = fn () => current valrecConstr fun check (c: (bool,bool) t, keyword: string, region) = if current c then () else let open Layout in Control.error (region, str (concat (if expert c then [keyword, " disallowed"] else [keyword, " disallowed, compile with -default-ann '", name c, " true'"])), empty) end end structure ElabControl = Control.Elaborate local open Layout in val align = align val empty = empty val seq = seq val str = str end fun approximateN (l: Layout.t, prefixMax, suffixMax): Layout.t = let val s = Layout.toString l val n = String.size s in str (case suffixMax of NONE => if n <= prefixMax then s else concat [String.prefix (s, prefixMax - 5), " ..."] | SOME suffixMax => if n <= prefixMax + suffixMax then s else concat [String.prefix (s, prefixMax - 2), " ... ", String.suffix (s, suffixMax - 5)]) end fun approximate (l: Layout.t): Layout.t = approximateN (l, 35, SOME 25) fun approximatePrefix (l: Layout.t): Layout.t = approximateN (l, 15, NONE) local open Ast in structure Aconst = Const structure Adec = Dec structure Aexp = Exp structure Amatch = Match structure Apat = Pat structure Atype = Type structure Avar = Var structure Avid = Vid structure DatatypeRhs = DatatypeRhs structure DatBind = DatBind structure EbRhs = EbRhs structure Fixop = Fixop structure Longtycon = Longtycon structure Longvid = Longvid structure PrimKind = PrimKind structure ImportExportAttribute = PrimKind.ImportExportAttribute structure SymbolAttribute = PrimKind.SymbolAttribute structure Priority = Priority structure Record = Record structure SortedRecord = SortedRecord structure Symbol = Symbol structure TypBind = TypBind end local open Env in structure Kind = Kind structure TypeEnv = TypeEnv structure TypeStr = TypeStr structure TyvarEnv = TyvarEnv structure Vid = Vid end local open TypeEnv in structure Scheme = Scheme structure Time = Time structure Type = Type end local open CoreML in structure CFunction = CFunction structure CKind = CFunction.Kind structure CSymbol = CSymbol structure SymbolScope = CSymbolScope structure CType = CType structure CharSize = CharSize structure Con = Con structure Const = Const structure Convention = CFunction.Convention structure Cdec = Dec structure Cexp = Exp structure Ffi = Ffi structure IntSize = IntSize structure Lambda = Lambda structure Cpat = Pat structure Prim = Prim structure RealSize = RealSize structure RealX = RealX structure SourceInfo = SourceInfo structure Tycon = Tycon structure Tyvar = Tyvar structure Var = Var structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector end structure Tycon = struct open Tycon open TypeEnv.TyconExt end structure Tyvar = struct open Tyvar open TypeEnv.TyvarExt end fun matchDiagsFromNoMatch noMatch = case noMatch of Cexp.Impossible => {nonexhaustiveExn = Control.Elaborate.DiagDI.Default, nonexhaustive = Control.Elaborate.DiagEIW.Ignore, redundant = Control.Elaborate.DiagEIW.Ignore} | Cexp.RaiseAgain => {nonexhaustiveExn = nonexhaustiveExnRaise (), nonexhaustive = nonexhaustiveRaise (), redundant = redundantRaise ()} | Cexp.RaiseBind => {nonexhaustiveExn = nonexhaustiveExnBind (), nonexhaustive = nonexhaustiveBind (), redundant = redundantBind ()} | Cexp.RaiseMatch => {nonexhaustiveExn = nonexhaustiveExnMatch (), nonexhaustive = nonexhaustiveMatch (), redundant = redundantMatch ()} structure AdmitsEquality = Tycon.AdmitsEquality local open Record in structure Field = Field end structure Parse = PrecedenceParse (structure Ast = Ast structure Env = Env) structure Scope = Scope (structure Ast = Ast) structure Apat = struct open Apat fun getName (p: t): string option = case node p of Var {name, ...} => SOME (Longvid.toString name) | Constraint (p, _) => getName p | FlatApp v => if 1 = Vector.length v then getName (Vector.first v) else NONE | Layered {var, ...} => SOME (Avar.toString var) | _ => NONE val getName = Trace.trace ("ElaborateCore.Apat.getName", layout, Option.layout String.layout) getName end fun elaborateType (ty: Atype.t, E: Env.t, {bogusAsUnknown: bool}): Type.t = let fun makeBogus (mc, ts) = if bogusAsUnknown then Type.new () else let val arity = Vector.length ts val (name, region) = Option.fold (mc, ("t", NONE), fn (c, _) => (Longtycon.toString c, SOME (Longtycon.region c))) val c = Tycon.makeBogus {name = name, kind = Kind.Arity arity, region = region} in Type.con (c, ts) end fun loop (ty: Atype.t): Type.t = case Atype.node ty of Atype.Var a => (* rule 44 *) (case TyvarEnv.lookupTyvar a of NONE => makeBogus (NONE, Vector.new0 ()) | SOME a => Type.var a) | Atype.Con (c, ts) => (* rules 46, 47 *) let val ts = Vector.map (ts, loop) fun normal () = case Env.lookupLongtycon (E, c) of NONE => makeBogus (SOME c, ts) | SOME s => let val kind = TypeStr.kind s val numArgs = Vector.length ts val ts = case kind of Kind.Arity n => let fun error () = let open Layout fun doit n = seq [str "[", case n of 0 => empty | 1 => str "_" | _ => seq [str "(", (seq o separate) (List.tabulate (n, fn _ => str "_"), ", "), str ")"], str "] ", Ast.Longtycon.layout c] in Control.error (Atype.region ty, seq [str "type constructor applied to incorrect number of type arguments: ", Ast.Longtycon.layout c], align [seq [str "expects: ", doit n], seq [str "but got: ", doit numArgs], seq [str "in: ", Atype.layout ty]]) end in case Int.compare (n, numArgs) of LESS => (error (); Vector.prefix (ts, n)) | EQUAL => ts | GREATER => (error () ; Vector.concat [ts, Vector.tabulate (n - numArgs, fn _ => makeBogus (NONE, Vector.new0 ()))]) end | Kind.Nary => ts in TypeStr.apply (s, ts) end in case (Ast.Longtycon.split c, Vector.length ts) of (([], c), 2) => if Ast.Tycon.equals (c, Ast.Tycon.arrow) then Type.arrow (Vector.sub (ts, 0), Vector.sub (ts, 1)) else normal () | _ => normal () end | Atype.Paren t => loop t | Atype.Record r => (* rules 45, 49 *) Type.record (SortedRecord.fromVector (Vector.map (Record.toVector r, fn (f, (_, t)) => (f, loop t)))) in loop ty end val overloadChecks: (Ast.Priority.t * (unit -> unit)) list ref = ref [] fun resolveOverloads () = (* List.insertionSort is anti-stable; hence, it sorts and reverses the overloads. *) (List.foreach (List.insertionSort (!overloadChecks, fn ((p1,_),(p2,_)) => Priority.<= (p2, p1)), fn (_,th) => th ()) ; overloadChecks := []) val unresolvedFlexRecordChecks: (unit -> unit) list ref = ref [] fun reportUnresolvedFlexRecords () = (List.foreach (rev (!unresolvedFlexRecordChecks), fn th => th ()) ; unresolvedFlexRecordChecks := []) val undeterminedTypeChecks: (unit -> unit) list ref = ref [] fun reportUndeterminedTypes () = (List.foreach (rev (!undeterminedTypeChecks), fn th => th ()) ; undeterminedTypeChecks := []) val sequenceNonUnitChecks: (unit -> unit) list ref = ref [] fun reportSequenceNonUnit () = (List.foreach (rev (!sequenceNonUnitChecks), fn th => th ()) ; sequenceNonUnitChecks := []) val {hom = typeTycon: Type.t -> Tycon.t option, ...} = Type.makeHom {con = fn (c, _) => SOME c, expandOpaque = false, var = fn _ => NONE} val typeTycon = Trace.trace ("ElaborateCore.typeTycon", Type.layout, Option.layout Tycon.layout) typeTycon fun 'a elabConst (c: Aconst.t, {layoutPrettyType: Type.t -> Layout.t}, make: (unit -> Const.t) * Type.t -> 'a, {false = f: 'a, true = t: 'a}): 'a = let fun error (kind: string, ty: Type.t): unit = Control.error (Aconst.region c, seq [str kind, str " too large for type: ", Aconst.layout c], seq [str "type: ", layoutPrettyType ty]) fun choose (tycon, all, sizeTycon, make) = case List.peek (all, fn s => Tycon.equals (tycon, sizeTycon s)) of NONE => Const.string "" | SOME s => make s fun delay (ty: unit -> Type.t, resolve: Type.t -> Const.t): 'a = let val ty = ty () val resolve = Promise.lazy (fn () => resolve ty) val _ = List.push (overloadChecks, (Priority.default, ignore o resolve)) in make (resolve, ty) end val typeTycon = fn ty => case typeTycon ty of NONE => Tycon.bogus | SOME c => c in case Aconst.node c of Aconst.Bool b => if b then t else f | Aconst.Char ch => delay (Type.unresolvedChar, fn ty => choose (typeTycon ty, CharSize.all, Tycon.word o WordSize.fromBits o CharSize.bits, fn cs => let val ws = WordSize.fromBits (CharSize.bits cs) in Const.Word (if CharSize.isInRange (cs, ch) then WordX.fromIntInf (ch, ws) else (error ("char constant", ty); WordX.zero ws)) end)) | Aconst.Int i => delay (Type.unresolvedInt, fn ty => let val tycon = typeTycon ty in if Tycon.equals (tycon, Tycon.intInf) then Const.IntInf i else choose (tycon, WordSize.all, Tycon.word, fn s => Const.Word (if WordSize.isInRange (s, i, {signed = true}) then WordX.fromIntInf (i, s) else (error ("int constant", ty); WordX.zero s))) end) | Aconst.Real r => delay (Type.unresolvedReal, fn ty => choose (typeTycon ty, RealSize.all, Tycon.real, fn s => Const.Real (case RealX.make (r, s) of NONE => (error ("real constant", ty); RealX.zero s) | SOME r => r))) | Aconst.String v => delay (Type.unresolvedString, fn ty => choose (typeTycon (Type.deVector ty), CharSize.all, Tycon.word o WordSize.fromBits o CharSize.bits, fn cs => let val ws = WordSize.fromBits (CharSize.bits cs) val bigs = ref [] val wv = Const.WordVector (WordXVector.tabulate ({elementSize = ws}, Vector.length v, fn i => let val ch = Vector.sub (v, i) in if CharSize.isInRange (cs, ch) then WordX.fromIntInf (ch, ws) else (List.push (bigs, ch) ; WordX.zero ws) end)) val () = if List.isEmpty (!bigs) then () else Control.error (Aconst.region c, seq [str "string constant with ", str (case !bigs of [_] => "character " | _ => "characters "), str "too large for type: ", seq (Layout.separate (List.revMap (!bigs, fn ch => Aconst.layout (Aconst.makeRegion (Aconst.Char ch, Region.bogus))), ", "))], seq [str "type: ", layoutPrettyType ty]) in wv end)) | Aconst.Word w => delay (Type.unresolvedWord, fn ty => choose (typeTycon ty, WordSize.all, Tycon.word, fn s => Const.Word (if WordSize.isInRange (s, w, {signed = false}) then WordX.fromIntInf (w, s) else (error ("word constant", ty); WordX.zero s)))) end fun lookConst {default: string option, expandedTy, name, region}: unit -> Const.t = let fun badType () = let val _ = Control.error (region, seq [str "strange constant type: ", Type.layout expandedTy], empty) in Error.bug "ElaborateCore.lookConst" end fun notFound () = Error.bug (concat ["ElaborateCore.lookConst: constant ", name, " not found"]) fun badConversion (value, ty) = Error.bug (concat ["ElaborateCore.lookConst: constant ", name, " expects a ", ty, " but got ", value]) fun boolConstFromString v = case Bool.fromString v of NONE => badConversion (v, "bool") | SOME b => Const.Word (WordX.fromIntInf (if b then 1 else 0, WordSize.bool)) fun realConstFromString rs v = case RealX.make (v, rs) of NONE => badConversion (v, "real") | SOME r => Const.Real r fun strConstFromString v = Const.string v fun wordConstFromString ws v = case IntInf.fromString v of NONE => badConversion (v, "word") | SOME ii => Const.Word (WordX.fromIntInf (ii, ws)) fun intInfConstFromString v = case IntInf.fromString v of NONE => badConversion (v, "intInf") | SOME ii => Const.IntInf ii in case Type.deConOpt expandedTy of NONE => badType () | SOME (c, ts) => let val constFromString = if Tycon.equals (c, Tycon.bool) then boolConstFromString else if Tycon.isIntX c then (case Tycon.deIntX c of NONE => intInfConstFromString | SOME is => wordConstFromString (WordSize.fromBits (IntSize.bits is))) else if Tycon.isRealX c then realConstFromString (Tycon.deRealX c) else if Tycon.isWordX c then wordConstFromString (Tycon.deWordX c) else if Tycon.equals (c, Tycon.vector) andalso 1 = Vector.length ts andalso (case Type.deConOpt (Vector.first ts) of NONE => false | SOME (c, _) => Tycon.isCharX c andalso (Tycon.deCharX c = CharSize.C8)) then strConstFromString else badType () in fn () => let val value = case List.peekMap ([Control.commandLineConsts, Promise.force Control.buildConsts, Promise.force Control.Target.consts], fn consts => Control.StrMap.peek (consts, name)) of NONE => (case default of NONE => notFound () | SOME value => value) | SOME value => value val const = constFromString value in const end end end local fun unifySeq (seqTy, seqStr, trs: (Type.t * Region.t) vector, unify): Type.t = if Vector.isEmpty trs then seqTy (Type.new ()) else let val (t, _) = Vector.first trs val _ = Vector.foreach (trs, fn (t', r) => unify (t, t', fn (l, l') => (r, str (seqStr ^ " with element of different type"), align [seq [str "element: ", l'], seq [str "previous: ", l]]))) in seqTy t end in fun unifyList (trs: (Type.t * Region.t) vector, unify): Type.t = unifySeq (Type.list, "list", trs, unify) fun unifyVector (trs: (Type.t * Region.t) vector, unify): Type.t = unifySeq (Type.vector, "vector", trs, unify) end val elabPatInfo = Trace.info "ElaborateCore.elabPat" structure Var = struct open Var val fromAst = newString o Avar.toString end structure DiagUtils = struct type t = {layoutPrettyType: Type.t -> LayoutPretty.t, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t, unify: Type.t * Type.t * (Layout.t * Layout.t -> Region.t * Layout.t * Layout.t) -> unit} fun make E : t = let val {layoutPrettyTycon, ...} = Env.makeLayoutPrettyTycon (E, {prefixUnset = true}) val {layoutPretty = layoutPrettyTyvar, ...} = TyvarEnv.makeLayoutPretty () val layoutPrettyType = fn t => Type.layoutPretty (t, {expandOpaque = false, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) fun unify (t, t', error) = let val error = fn (l, l', {notes}) => let val (r, m, d) = error (l, l') in Control.error (r, m, align [d, notes ()]) end in Type.unify (t, t', {error = error, layoutPretty = layoutPrettyType, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) end in {layoutPrettyType = layoutPrettyType, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar, unify = unify} end end val elaboratePat: unit -> Apat.t * Env.t * {bind: bool, isRvb: bool} -> Cpat.t * (Avar.t * Var.t * Type.t) vector = fn () => let val others: (Apat.t * (Avar.t * Var.t * Type.t) vector) list ref = ref [] in fn (p: Apat.t, E: Env.t, {bind = bindInEnv, isRvb}) => let val {layoutPrettyType, unify, ...} = DiagUtils.make E fun ctxtTop () = seq [str "in: ", approximate (Apat.layout p)] val rename = let val renames: (Avar.t * Var.t) list ref = ref [] in fn x => case List.peek (!renames, fn (y, _) => Avar.equals (x, y)) of NONE => let val x' = Var.fromAst x in (List.push (renames, (x, x')); x') end | SOME (_, x') => x' end val xts: (Avar.t * Var.t * Type.t) list ref = ref [] fun bindToType (x: Avar.t, t: Type.t): Var.t = let val _ = Avid.checkRedefineSpecial (Avid.fromVar x, {allowIt = true, ctxt = ctxtTop, keyword = if isRvb then "val rec" else "pattern"}) val x' = rename x val () = case List.peek (!xts, fn (y, _, _) => Avar.equals (x, y)) of NONE => () | SOME _ => Control.error (Avar.region x, seq [str "duplicate variable in pattern: ", Avar.layout x], ctxtTop ()) val _ = List.push (xts, (x, x', t)) in x' end fun bind (x: Avar.t): Var.t * Type.t = let val t = Type.new () in (bindToType (x, t), t) end fun elabType (t: Atype.t): Type.t = elaborateType (t, E, {bogusAsUnknown = true}) fun loop (arg: Apat.t) = Trace.traceInfo' (elabPatInfo, Apat.layout, Cpat.layout) (fn (p: Apat.t) => let val region = Apat.region p fun ctxt () = seq [str "in: ", approximate (Apat.layout p)] val unify = fn (a, b, f) => unify (a, b, fn z => let val (r, m, d) = f z in (r, m, align [d, ctxt ()]) end) fun unifyPatternConstraint (p, c) = unify (p, c, fn (l1, l2) => (region, str "pattern and constraint disagree", align [seq [str "pattern: ", l1], seq [str "constraint: ", l2]])) fun dontCare () = Cpat.wild (Type.new ()) in case Apat.node p of Apat.App (c, p) => (case Env.lookupLongcon (E, c) of NONE => dontCare () | SOME (con, s) => let val {args, instance} = Scheme.instantiate s val args = args () val p = loop p val (argType, resultType) = case Type.deArrowOpt instance of SOME types => types | NONE => let val types = (Type.new (), Type.new ()) val _ = unify (instance, Type.arrow types, fn _ => (region, str "constant constructor applied to argument in pattern", Layout.empty)) in types end val _ = unify (Cpat.ty p, argType, fn (l, l') => (region, str "constructor applied to incorrect argument in pattern", align [seq [str "expects: ", l'], seq [str "but got: ", l]])) in Cpat.make (Cpat.Con {arg = SOME p, con = con, targs = args}, resultType) end) | Apat.Const c => elabConst (c, {layoutPrettyType = #1 o layoutPrettyType}, fn (resolve, ty) => Cpat.make (Cpat.Const resolve, ty), {false = Cpat.falsee, true = Cpat.truee}) | Apat.Constraint (p, t) => let val p' = loop p val _ = unifyPatternConstraint (Cpat.ty p', elabType t) in p' end | Apat.FlatApp items => loop (Parse.parsePat (items, E, fn () => ctxt ())) | Apat.Layered {var = x, constraint, pat, ...} => let val t = case constraint of NONE => Type.new () | SOME t => elabType t val xc = Avid.toCon (Avid.fromVar x) val x = case Env.peekLongcon (E, Ast.Longcon.short xc) of NONE => bindToType (x, t) | SOME _ => let val _ = Control.error (region, seq [str "constructor cannot be redefined by as: ", Avar.layout x], ctxt ()) in Var.fromAst x end val pat' = loop pat val _ = unifyPatternConstraint (Cpat.ty pat', t) in Cpat.make (Cpat.Layered (x, pat'), t) end | Apat.List ps => let val ps' = Vector.map (ps, loop) in Cpat.make (Cpat.List ps', unifyList (Vector.map2 (ps, ps', fn (p, p') => (Cpat.ty p', Apat.region p)), unify)) end | Apat.Or ps => let val _ = check (Control.Elaborate.allowOrPats, "Or patterns", region) val xtsOrig = !xts val n = Vector.length ps val ps = Vector.map (ps, fn p => let val _ = xts := [] val p' = loop p in (p, p', !xts) end) val ps' = Vector.map (ps, fn (_, p', _) => p') val xtsPats = Vector.fold (ps, [], fn ((p, _, xtsPat), xtsPats) => List.fold (xtsPat, xtsPats, fn ((x, x', t), xtsPats) => case List.peek (xtsPats, fn (y, _, _, _) => Avar.equals (x, y)) of NONE => (x, x', t, ref [x])::xtsPats | SOME (_, _, t', l) => let val _ = List.push (l, x) val _ = unify (t', t, fn (l', l) => (Avar.region x, seq [str "or-pattern with variable of different type: ", Avar.layout x], align [seq [str "variable: ", l], seq [str "previous: ", l'], seq [str "in: ", approximate (Apat.layout p)]])) in xtsPats end)) val _ = List.foreach (xtsPats, fn (x, _, _, l) => if List.length (!l) <> n then let val _ = Control.error (Apat.region p, seq [str "variable does not occur in all patterns of or-pattern: ", Avar.layout x], ctxt ()) in () end else ()) val t = Type.new () val _ = Vector.foreach (ps, fn (p, p', _) => unify (t, Cpat.ty p', fn (l, l') => (Apat.region p, str "or-pattern with pattern of different type", align [seq [str "pattern: ", l'], seq [str "previous: ", l], seq [str "in: ", approximate (Apat.layout p)]]))) val xtsMerge = List.fold (xtsPats, xtsOrig, fn ((x, x', t, l), xtsMerge) => case List.peek (xtsMerge, fn (y, _, _) => Avar.equals (x, y)) of NONE => (x, x', t)::xtsMerge | SOME _ => let val _ = List.foreach (List.rev (!l), fn x => Control.error (Avar.region x, seq [str "duplicate variable in pattern: ", Avar.layout x], ctxtTop ())) in (x, x', t)::xtsMerge end) val _ = xts := xtsMerge in Cpat.make (Cpat.Or ps', t) end | Apat.Paren p => loop p | Apat.Record {flexible, items} => (* rules 36, 38, 39 and Appendix A, p.57 *) let val (fs, ps) = Vector.unzip (Vector.map (items, fn (f, _, i) => (f, case i of Apat.Item.Field p => p | Apat.Item.Vid (vid, tyo, po) => let val p = case po of NONE => Apat.longvid (Longvid.short vid) | SOME p => Apat.layered {fixop = Fixop.None, var = Ast.Vid.toVar vid, constraint = NONE, pat = p} in case tyo of NONE => p | SOME ty => Apat.constraint (p, ty) end))) val ps = Vector.map (ps, loop) val r = SortedRecord.zip (fs, Vector.map (ps, Cpat.ty)) val ty = if flexible then let val (t, isResolved) = Type.flexRecord r fun resolve () = if isResolved () then () else Control.error (region, str "unresolved ... in record pattern", ctxt ()) val _ = List.push (unresolvedFlexRecordChecks, resolve) in t end else Type.record r in Cpat.make (Cpat.Record (Record.fromVector (Vector.zip (fs, ps))), ty) end | Apat.Tuple ps => Cpat.tuple (Vector.map (ps, loop)) | Apat.Var {name, ...} => let val (strids, x) = Ast.Longvid.split name fun var () = let val (x, t) = bind (Ast.Vid.toVar x) in Cpat.make (Cpat.Var x, t) end in case Env.peekLongcon (E, Ast.Longvid.toLongcon name) of NONE => if List.isEmpty strids then var () else let val _ = Control.error (region, seq [str "undefined constructor: ", Ast.Longvid.layout name], empty) in Cpat.make (Cpat.Wild, Type.new ()) end | SOME (c, s) => if List.isEmpty strids andalso isRvb then var () else let val {args, instance} = Scheme.instantiate s in if Type.isArrow instance then (Control.error (region, seq [str "constructor used without argument in pattern: ", Ast.Longvid.layout name], empty) ; dontCare ()) else Cpat.make (Cpat.Con {arg = NONE, con = c, targs = args ()}, instance) end end | Apat.Vector ps => let val _ = check (ElabControl.allowVectorPats, "Vector patterns", Apat.region p) val ps' = Vector.map (ps, loop) in Cpat.make (Cpat.Vector ps', unifyVector (Vector.map2 (ps, ps', fn (p, p') => (Cpat.ty p', Apat.region p)), unify)) end | Apat.Wild => Cpat.make (Cpat.Wild, Type.new ()) end) arg val p' = loop p val xts = Vector.fromList (!xts) val _ = Vector.foreach (xts, fn (x, _, _) => case (List.peekMap (!others, fn (p, v) => if Vector.exists (v, fn (y, _, _) => Avar.equals (x, y)) then SOME p else NONE)) of NONE => () | SOME p' => Control.error (Avar.region x, seq [str "variable bound in multiple patterns: ", Avar.layout x], align [seq [str "pattern: ", approximate (Apat.layout p)], seq [str "previous: ", approximate (Apat.layout p')]])) val _ = List.push (others, (p, xts)) val _ = if bindInEnv then Vector.foreach (xts, fn (x, x', t) => Env.extendVar (E, x, x', Scheme.fromType t, {isRebind = false})) else () in (p', xts) end end (*---------------------------------------------------*) (* Declarations *) (*---------------------------------------------------*) structure Nest = struct type t = string list val layout = List.layout String.layout end val elabDecInfo = Trace.info "ElaborateCore.elabDec" val elabExpInfo = Trace.info "ElaborateCore.elabExp" structure Type = struct open Type val nullary: (string * CType.t * Tycon.t) list = let fun sized (tycon: Bits.t -> Tycon.t, ctypes) = List.map (ctypes, fn cty => let val c = tycon (Bytes.toBits (CType.size cty)) val s = Tycon.toString c val s = CharVector.tabulate (String.size s, fn i => let val c = String.sub (s, i) in if i = 0 then Char.toUpper c else c end) in (s, cty, c) end) in [("Bool", CType.bool, Tycon.bool), ("CPointer", CType.cpointer, Tycon.cpointer), ("Real32", CType.real RealSize.R32, Tycon.real RealSize.R32), ("Real64", CType.real RealSize.R64, Tycon.real RealSize.R64), ("Thread", CType.thread, Tycon.thread)] @ sized (Tycon.char o CharSize.fromBits, let open CType in [Word8, Word16, Word32] end) @ sized (Tycon.int o IntSize.fromBits, let open CType in [Int8, Int16, Int32, Int64] end) @ sized (Tycon.word o WordSize.fromBits, let open CType in [Word8, Word16, Word32, Word64] end) end val nullary = List.map (nullary, fn (name, ctype, tycon) => {ctype = ctype, name = name, tycon = tycon}) val unary: Tycon.t list = [Tycon.array, Tycon.reff, Tycon.vector] fun toNullaryCType (t: t): {ctype: CType.t, name: string} option = case deConOpt t of NONE => NONE | SOME (c, _) => Option.map (List.peek (nullary, fn {tycon = c', ...} => Tycon.equals (c, c')), fn {ctype, name, ...} => {ctype = ctype, name = name}) and toUnaryCType (t: t): {ctype: CType.t, name: string} option = case deConOpt t of NONE => NONE | SOME (c, ts) => if List.exists (unary, fn c' => Tycon.equals (c, c')) andalso 1 = Vector.length ts andalso isSome (toCType (Vector.first ts)) then SOME {ctype = CType.objptr, name = "Objptr"} else NONE and toCType (ty: t): {ctype: CType.t, name: string} option = case toNullaryCType ty of NONE => toUnaryCType ty | SOME {ctype, name} => SOME {ctype = ctype, name = name} val toCType = Trace.trace ("ElaborateCore.Type.toCType", layout, Option.layout (fn {ctype, name} => Layout.record [("ctype", CType.layout ctype), ("name", String.layout name)])) toCType type z = {ctype: CType.t, name: string, ty: t} fun toCBaseType (ty: t): z option = case toCType ty of NONE => NONE | SOME {ctype, name} => SOME {ctype = ctype, name = name, ty = ty} fun toCArgType (ty: t): z vector option = case deTupleOpt ty of NONE => (case toCBaseType ty of NONE => NONE | SOME z => SOME (Vector.new1 z)) | SOME tys => Exn.withEscape (fn esc => (SOME o Vector.map) (tys, fn ty => case toCBaseType ty of NONE => esc NONE | SOME z => z)) fun toCRetType (ty: t): z option option = case toCBaseType ty of NONE => if Type.isUnit ty then SOME NONE else NONE | SOME z => SOME (SOME z) fun toCFunType (ty: t): (z vector * z option) option = case deArrowOpt ty of NONE => NONE | SOME (arg, ret) => (case toCArgType arg of NONE => NONE | SOME arg => (case toCRetType ret of NONE => NONE | SOME ret => SOME (arg, ret))) fun toCPtrType (ty: t): z option = if Type.isCPointer ty then let val {ctype, name} = valOf (toCType ty) in SOME {ctype = ctype, name = name, ty = ty} end else NONE end val isIEAttributeConvention = fn ImportExportAttribute.Cdecl => true | ImportExportAttribute.Stdcall => true | _ => false fun parseIEAttributesConvention (attributes: ImportExportAttribute.t list) : Convention.t option = case attributes of [] => SOME Convention.Cdecl | [a] => (case a of ImportExportAttribute.Cdecl => SOME Convention.Cdecl | ImportExportAttribute.Stdcall => if let open Control in case !Target.os of Target.Cygwin => true | Target.MinGW => true | _ => false end then SOME Convention.Stdcall else SOME Convention.Cdecl | _ => NONE) | _ => NONE val isIEAttributeInline = fn ImportExportAttribute.Inline => true | _ => false fun parseIEAttributesInline (attributes: ImportExportAttribute.t list) : bool option = case attributes of [] => SOME false | [a] => (case a of ImportExportAttribute.Inline => SOME true | _ => NONE) | _ => NONE val isIEAttributeKind = fn ImportExportAttribute.Impure => true | ImportExportAttribute.Pure => true | ImportExportAttribute.Runtime => true | ImportExportAttribute.Reentrant => true | _ => false fun parseIEAttributesKind (attributes: ImportExportAttribute.t list) : CKind.t option = case attributes of [] => SOME CKind.Impure | [a] => (case a of ImportExportAttribute.Impure => SOME CKind.impure | ImportExportAttribute.Pure => SOME CKind.pure | ImportExportAttribute.Runtime => SOME CKind.runtimeDefault | ImportExportAttribute.Reentrant => SOME CKind.reentrant | _ => NONE) | _ => NONE val isIEAttributeSymbolScope = fn ImportExportAttribute.External => true | ImportExportAttribute.Private => true | ImportExportAttribute.Public => true | _ => false fun parseIEAttributesSymbolScope (attributes: ImportExportAttribute.t list, defScope : SymbolScope.t) : SymbolScope.t option = case attributes of [] => SOME defScope | [a] => (case a of ImportExportAttribute.External => SOME SymbolScope.External | ImportExportAttribute.Private => SOME SymbolScope.Private | ImportExportAttribute.Public => SOME SymbolScope.Public | _ => NONE) | _ => NONE fun scopeCheck {name, symbolScope, region} = let fun warn l = Control.warning (region, seq (List.map (l, str)), empty) val oldScope = Ffi.checkScope {name = name, symbolScope = symbolScope} in if symbolScope = oldScope then () else warn [ "symbol '", name, "' redeclared as ", SymbolScope.toString symbolScope, " (previously ", SymbolScope.toString oldScope, "). This may cause linker errors"] end fun import {attributes: ImportExportAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string option, region: Region.t, layoutPrettyType: Type.t -> Layout.t}: Type.t Prim.t = let fun error l = Control.error (region, l, empty) fun invalidAttributes () = error (seq [str "invalid attributes for _import: ", List.layout ImportExportAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _import", layoutPrettyType elabedTy) in case Type.toCFunType expandedTy of NONE => let val () = invalidType () in Prim.MLton_bogus end | SOME (args, result) => let datatype z = datatype CFunction.Target.t val convention = List.keepAll (attributes, isIEAttributeConvention) val convention = case parseIEAttributesConvention convention of NONE => (invalidAttributes () ; Convention.Cdecl) | SOME c => c val inline = List.keepAll (attributes, isIEAttributeInline) val inline = case name of NONE => (if List.isEmpty inline then () else invalidAttributes () ; false) | SOME _ => (case parseIEAttributesInline inline of NONE => (invalidAttributes () ; false) | SOME i => i) val kind = List.keepAll (attributes, isIEAttributeKind) val kind = case parseIEAttributesKind kind of NONE => (invalidAttributes () ; CKind.Impure) | SOME k => k val symbolScope = List.keepAll (attributes, isIEAttributeSymbolScope) val symbolScope = case name of NONE => (if List.isEmpty symbolScope then () else invalidAttributes () ; SymbolScope.External) | SOME name => let val symbolScope = case parseIEAttributesSymbolScope (symbolScope, SymbolScope.External) of NONE => (invalidAttributes () ; SymbolScope.External) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} in symbolScope end val addrTy = Type.cpointer val func = CFunction.T {args = let val args = Vector.map (args, #ty) in if isSome name then args else Vector.concat [Vector.new1 addrTy, args] end, convention = convention, inline = inline, kind = kind, prototype = (Vector.map (args, #ctype), Option.map (result, #ctype)), return = (case result of NONE => Type.unit | SOME {ty, ...} => ty), symbolScope = symbolScope, target = (case name of NONE => Indirect | SOME name => Direct name)} in Prim.CFunction func end end fun primApp {args, prim, result: Type.t} = let val targs = Prim.extractTargs (prim, {args = Vector.map (args, Cexp.ty), result = result, typeOps = {deArray = Type.deArray, deArrow = Type.deArrow, deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}) in Cexp.make (Cexp.PrimApp {args = args, prim = prim, targs = targs}, result) end local val zeroExpBool = Cexp.make (Cexp.Const (fn () => Const.word (WordX.zero WordSize.bool)), Type.word WordSize.bool) val oneExpBool = Cexp.make (Cexp.Const (fn () => Const.word (WordX.one WordSize.bool)), Type.word WordSize.bool) fun zeroExpPtrdiff () = Cexp.make (Cexp.Const (fn () => Const.word (WordX.zero (WordSize.cptrdiff ()))), Type.word (WordSize.cptrdiff ())) fun mkAddress {expandedPtrTy: Type.t, name: string, cty: CType.t option, symbolScope: SymbolScope.t }: Cexp.t = Cexp.make (Cexp.Const (fn () => Const.csymbol (CSymbol.T {name = name, cty = cty, symbolScope = symbolScope})), expandedPtrTy) fun mkFetch {ctypeCbTy, isBool, expandedCbTy, ptrExp: Cexp.t}: Cexp.t = let val fetchExp = primApp {args = Vector.new2 (ptrExp, zeroExpPtrdiff ()), prim = Prim.cpointerGet ctypeCbTy, result = if isBool then Type.word WordSize.bool else expandedCbTy} in if not isBool then fetchExp else Cexp.iff (primApp {args = Vector.new2 (fetchExp, zeroExpBool), prim = Prim.Word_equal WordSize.bool, result = expandedCbTy}, Cexp.falsee, Cexp.truee) end fun mkStore {ctypeCbTy, isBool, ptrExp: Cexp.t, valueExp: Cexp.t}: Cexp.t = let val valueExp = if not isBool then valueExp else Cexp.iff (valueExp, oneExpBool, zeroExpBool) in primApp {args = Vector.new3 (ptrExp, zeroExpPtrdiff (), valueExp), prim = Prim.cpointerSet ctypeCbTy, result = Type.unit} end fun mkSymbol {ctypeCbTy: CType.t, expandedCbTy: Type.t, ptrExp: Cexp.t}: Cexp.t = let val isBool = Type.isBool expandedCbTy val getArg = Var.newNoname () val setArg = Var.newNoname () in (Cexp.tuple o Vector.new2) ((Cexp.lambda o Lambda.make) {arg = getArg, argType = Type.unit, body = mkFetch {ctypeCbTy = ctypeCbTy, isBool = isBool, expandedCbTy = expandedCbTy, ptrExp = ptrExp}, mayInline = true}, (Cexp.lambda o Lambda.make) {arg = setArg, argType = expandedCbTy, body = mkStore {ctypeCbTy = ctypeCbTy, isBool = isBool, ptrExp = ptrExp, valueExp = Cexp.var (setArg, expandedCbTy)}, mayInline = true}) end val isSymbolAttributeAlloc = fn SymbolAttribute.Alloc => true | _ => false fun parseSymbolAttributesAlloc (attributes: SymbolAttribute.t list) : bool option = case attributes of [] => SOME false | [a] => (case a of SymbolAttribute.Alloc => SOME true | _=> NONE) | _ => NONE val isSymbolAttributeSymbolScope = fn SymbolAttribute.Private => true | SymbolAttribute.Public => true | SymbolAttribute.External => true | _ => false fun parseSymbolAttributesSymbolScope (attributes: SymbolAttribute.t list, defScope: SymbolScope.t) : SymbolScope.t option = case attributes of [] => SOME defScope | [a] => (case a of SymbolAttribute.Private => SOME SymbolScope.Private | SymbolAttribute.Public => SOME SymbolScope.Public | SymbolAttribute.External => SOME SymbolScope.External | _=> NONE) | _ => NONE in fun address {attributes: SymbolAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t, layoutPrettyType: Type.t -> Layout.t}: Cexp.t = let fun error l = Control.error (region, l, empty) fun invalidAttributes () = error (seq [str "invalid attributes for _address: ", List.layout SymbolAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _address", layoutPrettyType elabedTy) val () = case Type.toCPtrType expandedTy of NONE => (invalidType (); ()) | SOME _ => () val expandedPtrTy = expandedTy val () = case List.keepAll (attributes, isSymbolAttributeAlloc) of [] => () | _ => invalidAttributes () val symbolScope = List.keepAll (attributes, isSymbolAttributeSymbolScope) val symbolScope = case parseSymbolAttributesSymbolScope (symbolScope, SymbolScope.External) of NONE => (invalidAttributes () ; SymbolScope.External) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val addrExp = mkAddress {expandedPtrTy = expandedPtrTy, name = name, symbolScope = symbolScope, cty = NONE} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap (addrExp, elabedTy) end fun symbolDirect {attributes: SymbolAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t, layoutPrettyType: Type.t -> Layout.t}: Cexp.t = let fun error l = Control.error (region, l, empty) fun invalidAttributes () = error (seq [str "invalid attributes for _symbol: ", List.layout SymbolAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _symbol", layoutPrettyType elabedTy) val expandedCbTy = Exn.withEscape (fn escape => let val invalidType = fn () => (invalidType () ; ignore (escape Type.word8) ; Error.bug "ElaborateCore.symbolDirect.escape") in case Type.deTupleOpt expandedTy of NONE => invalidType () | SOME tys => if Vector.length tys <> 2 then invalidType () else let fun doit ty = case Type.deArrowOpt ty of NONE => invalidType () | SOME tys => tys val (getArgTy, getResTy) = doit (Vector.first tys) val (setArgTy, setResTy) = doit (Vector.sub (tys, 1)) val () = if Type.isUnit getArgTy then () else invalidType () val () = if Type.isUnit setResTy then () else invalidType () val () = if Type.canUnify (getResTy, setArgTy) then () else invalidType () in getResTy end end) val ctypeCbTy = case Type.toCBaseType expandedCbTy of NONE => (invalidType () ; CType.word (WordSize.word8, {signed = false})) | SOME {ctype, ...} => ctype val alloc = List.keepAll (attributes, isSymbolAttributeAlloc) val alloc = case parseSymbolAttributesAlloc alloc of NONE => (invalidAttributes () ; false) | SOME a => a val defScope = if alloc then SymbolScope.Public else SymbolScope.External val symbolScope = List.keepAll (attributes, isSymbolAttributeSymbolScope) val symbolScope = case parseSymbolAttributesSymbolScope (symbolScope, defScope) of NONE => (invalidAttributes () ; defScope) | SOME s => s val () = if alloc andalso symbolScope = SymbolScope.External then invalidAttributes () else () val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val () = if not alloc then () else Ffi.addSymbol {name = name, ty = ctypeCbTy, symbolScope = symbolScope} val addrExp = mkAddress {expandedPtrTy = Type.cpointer, name = name, cty = SOME ctypeCbTy, symbolScope = symbolScope} val symExp = mkSymbol {ctypeCbTy = ctypeCbTy, expandedCbTy = expandedCbTy, ptrExp = addrExp} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap (symExp, elabedTy) end fun symbolIndirect {elabedTy: Type.t, expandedTy: Type.t, region: Region.t, layoutPrettyType: Type.t -> Layout.t}: Cexp.t = let fun invalidType () = Control.error (region, str "invalid type for _symbol", layoutPrettyType elabedTy) val (expandedPtrTy, expandedCbTy) = Exn.withEscape (fn escape => let val invalidType = fn () => (invalidType () ; ignore (escape (Type.cpointer, Type.word8)) ; Error.bug "ElaborateCore.symbolIndirect.escape") in case Type.deArrowOpt expandedTy of NONE => invalidType () | SOME (ptrTy, symTy) => (case Type.deTupleOpt symTy of NONE => invalidType () | SOME tys => if Vector.length tys <> 2 then invalidType () else let fun doit ty = case Type.deArrowOpt ty of NONE => invalidType () | SOME tys => tys val (getArgTy, getResTy) = doit (Vector.sub (tys, 0)) val (setArgTy, setResTy) = doit (Vector.sub (tys, 1)) val () = if Type.isUnit getArgTy then () else invalidType () val () = if Type.isUnit setResTy then () else invalidType () val () = if Type.canUnify (getResTy, setArgTy) then () else invalidType () in (ptrTy, getResTy) end) end) val ctypeCbTy = case Type.toCBaseType expandedCbTy of NONE => (invalidType (); CType.word (WordSize.word8, {signed = false})) | SOME {ctype, ...} => ctype val () = case Type.toCPtrType expandedPtrTy of NONE => (invalidType (); ()) | SOME _ => () val ptrArg = Var.newNoname () val ptrExp = Cexp.var (ptrArg, expandedPtrTy) val symExp = mkSymbol {ctypeCbTy = ctypeCbTy, expandedCbTy = expandedCbTy, ptrExp = ptrExp} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap ((Cexp.lambda o Lambda.make) {arg = ptrArg, argType = expandedPtrTy, body = symExp, mayInline = true}, elabedTy) end end fun export {attributes: ImportExportAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t, layoutPrettyType: Type.t -> Layout.t}: Aexp.t = let fun error l = Control.error (region, l, empty) fun invalidAttributes () = error (seq [str "invalid attributes for _export: ", List.layout ImportExportAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _export", layoutPrettyType elabedTy) val convention = List.keepAll (attributes, isIEAttributeConvention) val convention = case parseIEAttributesConvention convention of NONE => (invalidAttributes () ; Convention.Cdecl) | SOME c => c val symbolScope = List.keepAll (attributes, isIEAttributeSymbolScope) val symbolScope = case parseIEAttributesSymbolScope (symbolScope, SymbolScope.Public) of NONE => (invalidAttributes () ; SymbolScope.Public) | SOME SymbolScope.External => (invalidAttributes () ; SymbolScope.Public) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val (exportId, args, res) = case Type.toCFunType expandedTy of NONE => (invalidType () ; (0, Vector.new0 (), NONE)) | SOME (args, result) => let val id = Ffi.addExport {args = Vector.map (args, #ctype), convention = convention, name = name, res = Option.map (result, #ctype), symbolScope = symbolScope} in (id, args, result) end open Ast fun id (name: string) = Aexp.longvid (Longvid.short (Vid.fromSymbol (Symbol.fromString name, region))) fun int (i: int): Aexp.t = Aexp.const (Aconst.makeRegion (Aconst.Int (IntInf.fromInt i), region)) val f = Var.fromSymbol (Symbol.fromString "f", region) val p = Var.fromSymbol (Symbol.fromString "p", region) in Exp.fnn (Vector.new1 (Pat.var f, Exp.app (id "register", Exp.tuple (Vector.new2 (int exportId, Exp.fnn (Vector.new1 (Pat.var p, let val (args, decs) = Vector.unzip (Vector.mapi (args, fn (i, {name, ...}) => let val x = Var.fromSymbol (Symbol.fromString (concat ["x", Int.toString i]), region) val dec = Dec.vall (Vector.new0 (), x, Exp.app (id (concat ["get", name]), (Exp.tuple o Vector.new2) (Exp.var p, int (i + 1)))) in (x, dec) end)) val resVar = Var.fromSymbol (Symbol.fromString "res", region) fun newVar () = Var.fromSymbol (Symbol.fromString "none", region) in Exp.lett (Vector.concat [decs, Vector.map (Vector.new2 ((resVar, Exp.app (Exp.var f, Exp.tuple (Vector.map (args, Exp.var)))), (newVar (), (case res of NONE => Exp.constraint (Exp.var resVar, Type.unit) | SOME {name, ...} => Exp.app (id (concat ["set", name]), (Exp.tuple o Vector.new3) (Exp.var p, int (Vector.length args + 1), Exp.var resVar))))), fn (x, e) => Dec.vall (Vector.new0 (), x, e))], Exp.tuple (Vector.new0 ()), region) end))))))) end val export = Trace.trace ("ElaborateCore.export", fn {name, ...} => String.layout name, Aexp.layout) export structure Aexp = struct open Aexp local val x = Avar.fromSymbol (Symbol.fromString "#", Region.bogus) val xField = Apat.Item.Field (Apat.var x) val xVar = var x in fun selector (f: Field.t, r: Region.t): t = fnn (Vector.new1 (Apat.makeRegion (Apat.Record {flexible = true, items = Vector.new1 (f, Region.bogus, xField)}, r), xVar)) end end structure Con = struct open Con val fromAst = newString o Ast.Con.toString end structure Cexp = struct open Cexp fun enterLeave (e: t, doit: bool, si): t = if not doit (* Don't create the sourceInfo if we're in the middle of elaborating * a functor body. Count profiling keeps track of all sourceInfos * created and would show it with a count of zero, which would be * bad. *) orelse Env.amInsideFunctor () (* Don't create the source info if we're profiling some IL. *) orelse !Control.profileIL <> Control.ProfileSource then e else make (EnterLeave (e, si ()), ty e) end (* This property must be outside of elaborateDec, since we don't want it to * be created for each call to elaborateDec. If it were, then property lists * on variables would be littered with lots of these. *) val {get = recursiveTargs: Var.t -> (unit -> Type.t vector) option ref, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref NONE)) fun elaborateDec (d, {env = E, nest}) = let val profileBody = let open Control in !profile <> ProfileNone end fun recursiveFun () = let val boundRef: (unit -> Tyvar.t vector) option ref = ref NONE val targs = Promise.lazy (fn () => case !boundRef of NONE => Error.bug "ElaborateCore.elaborateDec: boundRef not set" | SOME f => Vector.map (f (), Type.var)) fun markFunc func = recursiveTargs func := SOME targs fun unmarkFunc func = recursiveTargs func := NONE fun setBound b = boundRef := SOME b in {markFunc = markFunc, setBound = setBound, unmarkFunc = unmarkFunc} end fun elabType (t: Atype.t, {bogusAsUnknown}): Type.t = elaborateType (t, E, {bogusAsUnknown = bogusAsUnknown}) fun elabTypBind (typBind: TypBind.t) = let val TypBind.T types = TypBind.node typBind val types = Vector.map (types, fn {def, tycon, tyvars} => TyvarEnv.scope (tyvars, fn tyvars => {scheme = Scheme.make {canGeneralize = true, ty = elabType (def, {bogusAsUnknown = false}), tyvars = tyvars}, tycon = tycon})) val () = Vector.foreach (types, fn {scheme, tycon} => Env.extendTycon (E, tycon, TypeStr.def scheme, {forceUsed = false, isRebind = false})) (* Rebuild type to propagate tycon equality * when 'withtype' components of 'datatype' decl. *) fun rebind () = Vector.foreach (types, fn {scheme, tycon} => let val (tyvars, ty) = Scheme.dest scheme val ty = Type.copy ty val scheme = Scheme.make {canGeneralize = true, tyvars = tyvars, ty = ty} in Env.extendTycon (E, tycon, TypeStr.def scheme, {forceUsed = false, isRebind = true}) end) in rebind end fun elabDatBind (datBind: DatBind.t, nest: string list) : Decs.t * {tycon: Ast.Tycon.t, typeStr: TypeStr.t} vector = (* rules 28, 29, 81, 82 *) let val DatBind.T {datatypes, withtypes} = DatBind.node datBind (* Build enough of an env so that that the withtypes and the * constructor argument types can be elaborated. *) val datatypes = Vector.map (datatypes, fn {cons, tycon = name, tyvars} => let val arity = Vector.length tyvars val k = Kind.Arity arity val n = Ast.Tycon.toString name val pd = concat (List.separate (rev (n :: nest), ".")) val r = Ast.Tycon.region name val tycon = Tycon.make {admitsEquality = AdmitsEquality.Sometimes, kind = k, name = n, prettyDefault = pd, region = r} val _ = Env.extendTycon (E, name, TypeStr.tycon tycon, {forceUsed = true, isRebind = false}) in {arity = arity, cons = cons, name = name, tycon = tycon, tyvars = tyvars} end) val rebindWithtypes = elabTypBind withtypes val datatypes = Vector.map (datatypes, fn {arity, cons, name, tycon, tyvars} => let val cons = Vector.map (cons, fn (name, arg) => TyvarEnv.scope (tyvars, fn tyvars => {arg = Option.map (arg, fn t => elabType (t, {bogusAsUnknown = false})), con = Con.fromAst name, name = name, tyvars = tyvars})) in {arity = arity, cons = cons, name = name, tycon = tycon} end) (* Maximize equality *) val change = ref false fun loop datatypes = let val datatypes = Vector.map (datatypes, fn {arity, cons, name, tycon} => let val isEquality = ref true val cons = Vector.map (cons, fn {arg, con, name, tyvars} => let val arg = Option.map (arg, fn arg => let (* Rebuild type to propagate tycon equality. *) val arg = Type.copy arg val argScheme = Scheme.make {canGeneralize = true, ty = arg, tyvars = tyvars} val () = if Scheme.admitsEquality argScheme then () else isEquality := false in arg end) in {arg = arg, con = con, name = name, tyvars = tyvars} end) datatype z = datatype AdmitsEquality.t val () = case Tycon.admitsEquality tycon of Always => Error.bug "ElaborateCore.elaborateDec.elabDatBind: Always" | Never => () | Sometimes => if !isEquality then () else (Tycon.setAdmitsEquality (tycon, Never) ; change := true) in {arity = arity, cons = cons, name = name, tycon = tycon} end) in if !change then (change := false; loop datatypes) else datatypes end val datatypes = loop datatypes val (datatypes, strs) = (Vector.unzip o Vector.map) (datatypes, fn {arity, cons, name, tycon} => let val tyvars' = Vector.tabulate (arity, fn _ => Tyvar.makeNoname {equality = false}) val tyargs' = Vector.map (tyvars', Type.var) val (cons, cons') = (Vector.unzip o Vector.map) (cons, fn {arg, con, name, tyvars} => let val res = Type.con (tycon, Vector.map (tyvars, Type.var)) val (arg', ty) = case arg of NONE => (NONE, res) | SOME arg => let val argScheme = Scheme.make {canGeneralize = true, ty = arg, tyvars = tyvars} val arg' = Scheme.apply (argScheme, tyargs') in (SOME arg', Type.arrow (arg, res)) end val scheme = Scheme.make {canGeneralize = true, ty = ty, tyvars = tyvars} in ({con = con, name = name, scheme = scheme}, {con = con, arg = arg'}) end) val cons = Env.newCons (E, cons) val typeStr = TypeStr.data (tycon, cons) val () = Env.extendTycon (E, name, typeStr, {forceUsed = false, isRebind = true}) in ({cons = cons', tycon = tycon, tyvars = tyvars'}, {tycon = name, typeStr = typeStr}) end) val () = rebindWithtypes () in (Decs.single (Cdec.Datatype datatypes), strs) end fun elabDec arg : Decs.t = Trace.traceInfo (elabDecInfo, Layout.tuple3 (Ast.Dec.layout, Nest.layout, Bool.layout), Decs.layout, Trace.assertTrue) (fn (d, nest, isTop) => let fun ctxt () = seq [str "in: ", approximate (Adec.layout d)] val region = Adec.region d fun generalizeError (var, lay, _) = Control.error (Avar.region var, seq [str "type of variable cannot be generalized in expansive declaration: ", Avar.layout var], align [seq [str "type: ", lay], ctxt ()]) val () = Time.tick {region = region} fun checkSchemes (v: (Avar.t * Scheme.t) vector): unit = if isTop then Vector.foreach (v, fn (x, s) => if not (Scheme.haveUnknowns s) then () else List.push (undeterminedTypeChecks, fn () => if not (Scheme.haveUnknowns s) then () else let (* Technically, wrong scope for region; * but saving environment would probably * be expensive. *) val (bs, t) = Scheme.dest s val {layoutPrettyTycon, ...} = Env.makeLayoutPrettyTycon (E, {prefixUnset = true}) val {layoutPretty = layoutPrettyTyvar, localInit = localInitLayoutPrettyTyvar, ...} = Tyvar.makeLayoutPretty () val () = localInitLayoutPrettyTyvar bs val (lay, _) = Type.layoutPretty (t, {expandOpaque = false, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) in Control.warning (Avar.region x, seq [str "type of variable was not inferred and could not be generalized: ", Avar.layout x], align [seq [str "type: ", lay], ctxt ()]) end)) else () fun checkConRedefine (vid, keyword, ctxt) = case Env.peekLongcon (E, Ast.Longcon.short (Avid.toCon vid)) of NONE => () | SOME _ => (case valrecConstr () of Control.Elaborate.DiagEIW.Error => Control.error | Control.Elaborate.DiagEIW.Ignore => (fn _ => ()) | Control.Elaborate.DiagEIW.Warn => Control.warning) (Avid.region vid, seq [str "constructor redefined by ", str keyword, str ": ", Avid.layout vid], ctxt ()) val elabDec = fn (d, isTop) => elabDec (d, nest, isTop) val decs = case Adec.node d of Adec.Abstype {datBind, body} => (* rule 19 and p.57 *) let val ((decs, strs), decs') = Env.localCore (E, fn () => elabDatBind (datBind, nest), fn z => (z, elabDec (body, isTop))) val () = Vector.foreach (strs, fn {tycon, typeStr} => Env.extendTycon (E, tycon, TypeStr.abs typeStr, {forceUsed = true, isRebind = false})) in Decs.append (decs, decs') end | Adec.Datatype rhs => (case DatatypeRhs.node rhs of DatatypeRhs.DatBind datBind => (* rule 17 *) #1 (elabDatBind (datBind, nest)) | DatatypeRhs.Repl {lhs, rhs} => (* rule 18 *) let val () = Option.app (Env.lookupLongtycon (E, rhs), fn s => let val forceUsed = case TypeStr.node s of TypeStr.Datatype _ => true | _ => false val () = Env.extendTycon (E, lhs, s, {forceUsed = forceUsed, isRebind = false}) in () end) in Decs.empty end) | Adec.DoDec exp => let val _ = check (ElabControl.allowDoDecls, "do declarations", Adec.region d) val {unify, ...} = DiagUtils.make E val exp' = elabExp (exp, nest, NONE) val _ = unify (Cexp.ty exp', Type.unit, fn (l1, _) => (Aexp.region exp, str "do declaration expression not of type unit", align [seq [str "expression: ", l1], ctxt ()])) val vb = {ctxt = fn _ => empty, exp = exp', layPat = fn _ => empty, nest = nest, pat = Cpat.wild Type.unit, regionPat = Region.bogus} in Decs.single (Cdec.Val {matchDiags = matchDiagsFromNoMatch Cexp.Impossible, rvbs = Vector.new0 (), tyvars = Vector.new0, vbs = Vector.new1 vb}) end | Adec.Exception ebs => let val decs = Vector.fold (ebs, Decs.empty, fn ((exn, rhs), decs) => let val decs = case EbRhs.node rhs of EbRhs.Def c => (case Env.lookupLongexn (E, c) of NONE => decs | SOME (exn', scheme) => let val _ = Env.extendExn (E, exn, exn', scheme) in decs end) | EbRhs.Gen arg => let val exn' = Con.fromAst exn val (arg, ty) = case arg of NONE => (NONE, Type.exn) | SOME t => let val t = elabType (t, {bogusAsUnknown = false}) in (SOME t, Type.arrow (t, Type.exn)) end val scheme = Scheme.fromType ty val _ = Env.extendExn (E, exn, exn', scheme) in Decs.add (decs, Cdec.Exception {arg = arg, con = exn'}) end in decs end) in decs end | Adec.Fix {ops, fixity} => (Vector.foreach (ops, fn op' => Env.extendFix (E, op', fixity)) ; Decs.empty) | Adec.Fun {tyvars = tyvars, fbs} => let val close = TypeEnv.close {region = region} in TyvarEnv.scope (tyvars, fn tyvars' => let val {layoutPrettyTycon, layoutPrettyTyvar, unify, ...} = DiagUtils.make E val {markFunc, setBound, unmarkFunc} = recursiveFun () val fbs = Vector.map2 (fbs, Adec.layoutFun {tyvars = tyvars, fbs = fbs}, fn (clauses, layFb) => let val ctxtFb = fn () => seq [str "in: ", approximate (layFb ())] val clauses = Vector.map (clauses, fn {body, pats, resultType} => let fun layPats () = approximate (Apat.layoutFlatApp pats) fun layPatsPrefix () = approximatePrefix (Apat.layoutFlatApp pats) val regionPats = Region.append (Apat.region (Vector.first pats), Apat.region (Vector.last pats)) val regionBody = Aexp.region body fun layClause () = approximate (seq [Apat.layoutFlatApp pats, case resultType of NONE => empty | SOME rt => seq [str ": ", Atype.layout rt], str " = ", Aexp.layout body]) val regionClause = Region.append (regionPats, regionBody) val {args = pats, func} = Parse.parseClause (pats, E, ctxt) in {body = body, func = func, layClause = layClause, layPats = layPats, layPatsPrefix = layPatsPrefix, pats = pats, regionClause = regionClause, regionPats = regionPats, resultType = resultType} end) val regionFb = Region.append (#regionClause (Vector.first clauses), #regionClause (Vector.last clauses)) val {pats = pats0, func as func0, layClause = layClause0, ...} = Vector.first clauses val layFunc0 = fn () => str (Avar.toString func0) fun err (reg, msg, desc, layN, lay0) = Control.error (reg, seq [str msg], align [seq [str desc, approximate (layN ())], seq [str "previous: ", approximate (lay0 ())], ctxtFb ()]) val _ = Vector.foreach (clauses, fn {func = funcN, pats = patsN, layClause = layClauseN, regionPats = regionPatsN, ...} => let val layFuncN = fn () => str (Avar.toString funcN) val _ = if Avar.equals (func, funcN) then () else err (Avar.region funcN, "function clause with different name", "name: ", layFuncN, layFunc0) val _ = if Vector.length pats0 = Vector.length patsN then () else err (regionPatsN, "function clause with different number of arguments", "clause: ", layClauseN, layClause0) in () end) val numArgs = Vector.fold (clauses, ~1, fn (r, numArgs) => Int.max (Vector.length (#pats r), numArgs)) in {clauses = clauses, ctxtFb = ctxtFb, func = func, numArgs = numArgs, regionFb = regionFb} end) val _ = Vector.fold (fbs, [], fn ({func = f, ...}, ac) => if List.exists (ac, fn f' => Avar.equals (f, f')) then (Control.error (Avar.region f, seq [str "duplicate function definition: ", Avar.layout f], ctxt ()) ; ac) else f :: ac) val fbs = Vector.map (fbs, fn {clauses, ctxtFb, func, numArgs, regionFb} => let val argTys = Vector.tabulate (numArgs, fn _ => Type.new ()) val resTy = Type.new () val clauses = Vector.map (clauses, fn {body, layPats, layPatsPrefix, pats, regionPats, resultType, ...} => let val elaboratePat = elaboratePat () val (pats, bindss) = (Vector.unzip o Vector.mapi) (pats, fn (i, pat) => let val regionPat = Apat.region pat val (pat, binds) = elaboratePat (pat, E, {bind = false, isRvb = false}) val _ = unify (Vector.sub (argTys, i), Cpat.ty pat, fn (l1, l2) => (regionPat, str "function clause with argument of different type", align [seq [str "argument: ", l2], seq [str "previous: ", l1], ctxtFb ()])) in (pat, binds) end) val binds = Vector.concatV (Vector.rev bindss) val resultType = Option.map (resultType, fn resultType => let val regionResultType = Atype.region resultType val resultType = elabType (resultType, {bogusAsUnknown = true}) val _ = unify (resTy, resultType, fn (l1, l2) => (regionResultType, str "function clause with result constraint of different type", align [seq [str "constraint: ", l2], seq [str "previous: ", l1], ctxtFb ()])) in (resultType, regionResultType) end) in {binds = binds, body = body, layPats = layPats, layPatsPrefix = layPatsPrefix, pats = pats, regionPats = regionPats, resultType = resultType} end) val funTy = let fun chk ty = if Type.isUnknown ty then Type.new () else ty in if Vector.forall (argTys, Type.isUnknown) andalso Type.isUnknown resTy then Type.new () else Vector.foldr (Vector.map (argTys, chk), chk resTy, Type.arrow) end val funcVid = Avid.fromVar func val _ = Avid.checkRedefineSpecial (funcVid, {allowIt = true, ctxt = ctxtFb, keyword = "fun"}) val _ = checkConRedefine (funcVid, "fun", ctxtFb) val var = Var.fromAst func val _ = Env.extendVar (E, func, var, Scheme.fromType funTy, {isRebind = false}) val _ = markFunc var in {argTys = argTys, clauses = clauses, ctxtFb = ctxtFb, func = func, funTy = funTy, regionFb = regionFb, resTy = resTy, var = var} end) val fbs = Vector.map (fbs, fn {argTys, clauses, ctxtFb, func, funTy, regionFb, resTy, var, ...} => let val nest = Avar.toString func :: nest val resultTypeConstraint = Vector.exists (clauses, Option.isSome o #resultType) val rules = Vector.map (clauses, fn {binds, body, layPats, layPatsPrefix, pats, regionPats, resultType} => let val regionBody = Aexp.region body val body = Env.scope (E, fn () => (Vector.foreach (binds, fn (x, x', ty) => Env.extendVar (E, x, x', Scheme.fromType ty, {isRebind = false})) ; elabExp (body, nest, NONE))) val body = Cexp.enterLeave (body, profileBody andalso !Control.profileBranch, fn () => SourceInfo.function {name = ("") :: nest, region = regionBody}) val _ = case resultType of SOME (resultType, regionResultType) => unify (resultType, Cexp.ty body, fn (l1, l2) => (Region.append (regionResultType, regionBody), seq [if Vector.length clauses = 1 then str "function " else str "function clause ", str "expression and result constraint disagree"], align [seq [str "expression: ", l2], seq [str "constraint: ", l1], ctxtFb ()])) | NONE => if resultTypeConstraint then unify (resTy, Cexp.ty body, fn (l1, l2) => (regionBody, str "function clause expression and result constraint disagree", align [seq [str "expression: ", l2], seq [str "constraint: ", l1], ctxtFb ()])) else unify (resTy, Cexp.ty body, fn (l1, l2) => (regionBody, str "function clause with expression of different type", align [seq [str "expression: ", l2], seq [str "previous: ", l1], ctxtFb ()])) in {exp = body, layPat = SOME layPats, pat = Cpat.tuple pats, regionPat = regionPats} end) val args = Vector.map (argTys, fn argTy => (Var.newNoname (), argTy)) fun check () = unify (Vector.foldr (argTys, resTy, Type.arrow), funTy, fn (l1, l2) => (Avar.region func, seq [str "recursive use of function disagrees with function declaration type: ", Avar.layout func], align [seq [str "recursive use: ", l2], seq [str "function type: ", l1], ctxt ()])) val body = Cexp.casee {ctxt = ctxtFb, kind = ("function", "clause"), nest = nest, matchDiags = matchDiagsFromNoMatch Cexp.RaiseMatch, noMatch = Cexp.RaiseMatch, region = regionFb, rules = rules, test = Cexp.tuple (Vector.map (args, Cexp.var))} val body = Cexp.enterLeave (body, profileBody, fn () => SourceInfo.function {name = nest, region = regionFb}) val lambda = Vector.foldr (args, body, fn ((arg, argTy), body) => Cexp.make (Cexp.Lambda (Lambda.make {arg = arg, argType = argTy, body = body, mayInline = true}), Type.arrow (argTy, Cexp.ty body))) val lambda = case Cexp.node lambda of Cexp.Lambda lambda => lambda | _ => Lambda.bogus in {check = check, func = func, funTy = funTy, lambda = lambda, var = var} end) val _ = Vector.foreach (fbs, fn {check, ...} => check ()) val {bound, schemes} = close (tyvars', Vector.map (fbs, fn {func, funTy, ...} => {isExpansive = false, ty = funTy, var = func}), {error = generalizeError, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) val _ = checkSchemes (Vector.zip (Vector.map (fbs, #func), schemes)) val _ = setBound bound val _ = Vector.foreach2 (fbs, schemes, fn ({func, var, ...}, scheme) => (Env.extendVar (E, func, var, scheme, {isRebind = true}) ; unmarkFunc var)) val decs = Vector.map (fbs, fn {lambda, var, ...} => {lambda = lambda, var = var}) in Decs.single (Cdec.Fun {decs = decs, tyvars = bound}) end) end | Adec.Local (d, d') => let val res = Env.localCore (E, fn () => elabDec (d, false), fn decs => Decs.append (decs, elabDec (d', isTop))) in res end | Adec.Open paths => let (* The following code is careful to first lookup all of the * paths in the current environment, and then extend the * environment with all of the results. * See rule 22 of the Definition. *) val _ = Vector.foreach (Vector.map (paths, fn p => Env.lookupLongstrid (E, p)), fn so => Option.app (so, fn s => Env.openStructure (E, s))) in Decs.empty end | Adec.Overload (p, x, tyvars, ty, xs) => TyvarEnv.scope (tyvars, fn tyvars' => let val {unify, ...} = DiagUtils.make E val () = check (ElabControl.allowOverload, "_overload", region) (* Lookup the overloads before extending the var in case * x appears in the xs. *) val ovlds = Vector.concatV (Vector.map (xs, fn x => case Env.lookupLongvid (E, x) of NONE => Vector.new0 () | SOME (Vid.Var v, t) => Vector.new1 (Longvid.region x, (v, t)) | SOME (Vid.Overload (_, vs), _) => Vector.map (vs, fn vt => (Longvid.region x, vt)) | _ => (Control.error (Longvid.region x, str "cannot overload", seq [str "constructor: ", Longvid.layout x]) ; Vector.new0 ()))) val s = Scheme.make {canGeneralize = false, tyvars = tyvars', ty = elabType (ty, {bogusAsUnknown = false})} val _ = Vector.foreach (ovlds, fn (r, (_, s')) => let val is = Scheme.instantiate s val is' = Scheme.instantiate s' in unify (#instance is, #instance is', fn (l1, l2) => (r, str "variant does not unify with overload", align [seq [str "overload: ", l1], seq [str "variant: ", l2], ctxt ()])) end) val _ = Env.extendOverload (E, p, x, Vector.map (ovlds, fn (_, vt) => vt), s) in Decs.empty end) | Adec.SeqDec ds => Vector.fold (ds, Decs.empty, fn (d, decs) => Decs.append (decs, elabDec (d, isTop))) | Adec.Type typBind => (ignore (elabTypBind typBind) ; Decs.empty) | Adec.Val {tyvars, rvbs, vbs} => let val close = TypeEnv.close {region = region} in TyvarEnv.scope (tyvars, fn tyvars' => let val {layoutPrettyTycon, layoutPrettyTyvar, unify, ...} = DiagUtils.make E val {vbs = layVbs, rvbs = layRvbs} = Adec.layoutVal {tyvars = tyvars, vbs = vbs, rvbs = rvbs} (* Must do all the es and rvbs before the ps because of * scoping rules. *) val vbs = Vector.map2 (vbs, layVbs, fn ({exp, pat, ...}, layVb) => let fun ctxtVb () = seq [str "in: ", approximate (layVb ())] fun layPat () = Apat.layout pat val regionPat = Apat.region pat val regionExp = Aexp.region exp val exp = elabExp (exp, nest, Apat.getName pat) val exp = Cexp.enterLeave (exp, profileBody andalso !Control.profileVal andalso Cexp.isExpansive exp, fn () => let val name = concat [""] in SourceInfo.function {name = name :: nest, region = regionExp} end) in {ctxtVb = ctxtVb, exp = exp, layPat = layPat, pat = pat, regionExp = regionExp, regionPat = regionPat} end) val {markFunc, setBound, unmarkFunc} = recursiveFun () val elaboratePat = elaboratePat () val rvbs = Vector.map2 (rvbs, layRvbs, fn ({pat, match}, layRvb) => let fun ctxtRvb () = seq [str "in: ", approximate (layRvb ())] val regionPat = Apat.region pat val (pat, bound) = elaboratePat (pat, E, {bind = false, isRvb = true}) val (nest, var) = if Vector.length bound = 1 andalso (Type.isUnknown (Cpat.ty pat) orelse Type.isArrow (Cpat.ty pat)) then let val (x, x', _) = Vector.first bound in (Avar.toString x :: nest, x') end else ("_" :: nest, Var.newNoname ()) val _ = markFunc var val bound = Vector.map (bound, fn (x, _, ty) => let val xVid = Avid.fromVar x val _ = checkConRedefine (xVid, "val rec", ctxtRvb) val _ = Env.extendVar (E, x, var, Scheme.fromType ty, {isRebind = false}) in (x, var, ty) end) in {bound = bound, ctxtRvb = ctxtRvb, match = match, nest = nest, pat = pat, regionPat = regionPat, patIsConstrained = not (Type.isUnknown (Cpat.ty pat)), var = var} end) val vbs = Vector.map (vbs, fn {ctxtVb, exp, layPat, pat, regionExp, regionPat, ...} => let val (pat, bound) = elaboratePat (pat, E, {bind = false, isRvb = false}) val _ = unify (Cpat.ty pat, Cexp.ty exp, fn (p, e) => (Region.append (regionPat, regionExp), str "pattern and expression disagree", align [seq [str "pattern: ", p], seq [str "expression: ", e], ctxtVb ()])) in {bound = bound, ctxtVb = ctxtVb, exp = exp, layPat = layPat, pat = pat, regionPat = regionPat} end) val rvbs = Vector.map (rvbs, fn {bound, ctxtRvb, match, nest, pat, patIsConstrained, regionPat, var, ...} => let val {argType, region, resultType, rules} = elabMatch (match, nest) fun check () = unify (Cpat.ty pat, Type.arrow (argType, resultType), fn (l1, l2) => if patIsConstrained then (Region.append (regionPat, Amatch.region match), str "recursive function pattern and expression disagree", align [seq [str "pattern: ", l1], seq [str "expression: ", l2], ctxt ()]) else (Avar.region (#1 (Vector.first bound)), seq [str "recursive use of function disagrees with function expression type: ", Avar.layout (#1 (Vector.first bound))], align [seq [str "recursive use: ", l1], seq [str "function type: ", l2], ctxt ()])) val arg = Var.newNoname () val body = Cexp.enterLeave (Cexp.casee {ctxt = ctxtRvb, kind = ("recursive function", "rule"), nest = nest, matchDiags = matchDiagsFromNoMatch Cexp.RaiseMatch, noMatch = Cexp.RaiseMatch, region = region, rules = rules, test = Cexp.var (arg, argType)}, profileBody, fn () => SourceInfo.function {name = nest, region = region}) val lambda = Lambda.make {arg = arg, argType = argType, body = body, mayInline = true} in {check = check, bound = bound, lambda = lambda, var = var} end) val _ = Vector.foreach (rvbs, fn {check, ...} => check ()) val boundVars = Vector.concat [Vector.concatV (Vector.map (rvbs, fn {bound, ...} => ((Vector.rev o Vector.map) (bound, fn z => (z, {isExpansive = false, isRebind = true}))))), Vector.concatV (Vector.map (vbs, fn {bound, exp, ...} => ((Vector.rev o Vector.map) (bound, fn z => (z, {isExpansive = Cexp.isExpansive exp, isRebind = false})))))] val {bound, schemes} = close (tyvars', Vector.map (boundVars, fn ((var, _, ty), {isExpansive, ...}) => {isExpansive = isExpansive, ty = ty, var = var}), {error = generalizeError, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) val _ = checkSchemes (Vector.zip (Vector.map (boundVars, #1 o #1), schemes)) val _ = setBound bound val _ = Vector.foreach2 (boundVars, schemes, fn (((x, x', _), {isRebind, ...}), scheme) => Env.extendVar (E, x, x', scheme, {isRebind = isRebind})) val _ = Vector.foreach (rvbs, fn {var, ...} => unmarkFunc var) val vbs = Vector.map (vbs, fn {ctxtVb, exp, layPat, pat, regionPat, ...} => {ctxt = ctxtVb, exp = exp, layPat = layPat, nest = nest, pat = pat, regionPat = regionPat}) val rvbs = Vector.map (rvbs, fn {lambda, var, ...} => {lambda = lambda, var = var}) (* According to page 28 of the Definition, we should * issue warnings for nonexhaustive valdecs only when it's * not a top level dec. It seems harmless enough to go * ahead and always issue them. *) in Decs.single (Cdec.Val {matchDiags = matchDiagsFromNoMatch Cexp.RaiseBind, rvbs = rvbs, tyvars = bound, vbs = vbs}) end) end val () = case resolveScope () of Control.Elaborate.ResolveScope.Dec => (reportUnresolvedFlexRecords () ; resolveOverloads ()) | _ => () in decs end) arg and elabExp (arg: Aexp.t * Nest.t * string option) : Cexp.t = Trace.traceInfo (elabExpInfo, Layout.tuple3 (Aexp.layout, Nest.layout, Option.layout String.layout), Cexp.layoutWithType, Trace.assertTrue) (fn (e: Aexp.t, nest, maybeName) => let fun elab e = elabExp (e, nest, NONE) val {layoutPrettyType, layoutPrettyTycon, layoutPrettyTyvar, unify} = DiagUtils.make E val layoutPrettyTypeBracket = fn ty => seq [str "[", #1 (layoutPrettyType ty), str "]"] fun ctxt () = seq [str "in: ", approximate (Aexp.layout e)] val unify = fn (a, b, f) => unify (a, b, fn z => let val (r, m, d) = f z in (r, m, align [d, ctxt ()]) end) val region = Aexp.region e in case Aexp.node e of Aexp.Andalso (el, er) => let fun doit (e, br) = let val ce = elab e val _ = unify (Cexp.ty ce, Type.bool, fn (l, _) => (Aexp.region e, str (concat [br, " branch of andalso not of type bool"]), seq [str "branch: ", l])) in ce end val cel = doit (el, "left") val cer = doit (er, "right") val e = Cexp.andAlso (cel, cer) in Cexp.make (Cexp.node e, Type.bool) end | Aexp.App (ef, ea) => let val cef = elab ef val cea = elab ea val isCon = case Cexp.node cef of Cexp.Con _ => true | _ => false val (argType, resultType) = case Type.deArrowOpt (Cexp.ty cef) of SOME types => types | NONE => let val types = (Type.new (), Type.new ()) val _ = unify (Cexp.ty cef, Type.arrow types, fn (l, _) => if isCon then (Aexp.region ef, str "constant constructor applied to argument", seq [str "constructor: ", l]) else (Aexp.region ef, str "function not of arrow type", seq [str "function: ", l])) in types end val _ = unify (argType, Cexp.ty cea, fn (l1, l2) => (region, seq [str (if isCon then "constructor" else "function"), str " applied to incorrect argument"], align [seq [str "expects: ", l1], seq [str "but got: ", l2]])) in Cexp.make (Cexp.App (cef, cea), resultType) end | Aexp.Case (e, m) => let val e = elab e val {argType, rules, ...} = elabMatch (m, nest) val _ = unify (Cexp.ty e, argType, fn (l1, l2) => (region, str "case object and match argument disagree", align [seq [str "case object: ", l1], seq [str "match argument: ", l2]])) in Cexp.casee {ctxt = ctxt, kind = ("case", "rule"), nest = nest, matchDiags = matchDiagsFromNoMatch Cexp.RaiseMatch, noMatch = Cexp.RaiseMatch, region = Amatch.region m, rules = rules, test = e} end | Aexp.Const c => elabConst (c, {layoutPrettyType = #1 o layoutPrettyType}, fn (resolve, ty) => Cexp.make (Cexp.Const resolve, ty), {false = Cexp.falsee, true = Cexp.truee}) | Aexp.Constraint (e, t') => let val e = elab e val t' = elabType (t', {bogusAsUnknown = true}) val _ = unify (Cexp.ty e, t', fn (l1, l2) => (region, str "expression and constraint disagree", align [seq [str "expression: ", l1], seq [str "constraint: ", l2]])) in Cexp.make (Cexp.node e, t') end | Aexp.FlatApp items => elab (Parse.parseExp (items, E, ctxt)) | Aexp.Fn match => let val nest = case maybeName of NONE => "fn" :: nest | SOME s => s :: nest val {arg, argType, body} = elabMatchFn (match, nest, ctxt, ("function", "rule"), Cexp.RaiseMatch) val body = Cexp.enterLeave (body, profileBody, fn () => SourceInfo.function {name = nest, region = region}) in Cexp.make (Cexp.Lambda (Lambda.make {arg = arg, argType = argType, body = body, mayInline = true}), Type.arrow (argType, Cexp.ty body)) end | Aexp.Handle (try, match) => let val try = elab try val {arg, argType, body} = elabMatchFn (match, nest, ctxt, ("handler", "rule"), Cexp.RaiseAgain) val _ = unify (Cexp.ty try, Cexp.ty body, fn (l1, l2) => (region, str "expression and handler disagree", align [seq [str "expression: ", l1], seq [str "handler: ", l2]])) val _ = unify (argType, Type.exn, fn (l1, _) => (Amatch.region match, str "handler match argument not of type exn", seq [str "argument: ", l1])) in Cexp.make (Cexp.Handle {catch = (arg, Type.exn), handler = body, try = try}, Cexp.ty try) end | Aexp.If (a, b, c) => let val a' = elab a val b' = elab b val c' = elab c val _ = unify (Cexp.ty a', Type.bool, fn (l1, _) => (Aexp.region a, str "if test not of type bool", seq [str "test: ", l1])) val _ = unify (Cexp.ty b', Cexp.ty c', fn (l1, l2) => (region, str "then and else branches disagree", align [seq [str "then: ", l1], seq [str "else: ", l2]])) val (b', c') = if not (!Control.profileBranch) then (b', c') else let fun wrap (e, e', name) = Cexp.enterLeave (e', profileBody, fn () => SourceInfo.function {name = name :: nest, region = Aexp.region e}) in (wrap (b, b', ""), wrap (c, c', "")) end in Cexp.iff (a', b', c') end | Aexp.Let (d, e) => let val res = Env.scope (E, fn () => let val time = Time.now () val d' = Decs.toVector (elabDec (d, nest, false)) val e' = elab e val ty = Cexp.ty e' val ty = case Type.checkTime (ty, time, {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) of NONE => ty | SOME (lay, ty, {tycons, ...}) => let val tycons = List.map (tycons, fn c => (c, layoutPrettyTycon c)) val tycons = List.insertionSort (tycons, fn ((_, l1), (_, l2)) => String.<= (Layout.toString l1, Layout.toString l2)) val _ = Control.error (region, seq [str "type of let has ", if List.length tycons > 1 then str "local types that would escape their scope: " else str "local type that would escape its scope: ", seq (Layout.separate (List.map (tycons, #2), ", "))], align [seq [str "type: ", lay], (align o List.map) (tycons, fn (c, _) => seq [str "escape from: ", Region.layout (Tycon.region c)]), ctxt ()]) in ty end in Cexp.make (Cexp.Let (d', e'), ty) end) in res end | Aexp.List es => let val es' = Vector.map (es, elab) in Cexp.make (Cexp.List es', unifyList (Vector.map2 (es, es', fn (e, e') => (Cexp.ty e', Aexp.region e)), unify)) end | Aexp.Orelse (el, er) => let fun doit (e, br) = let val ce = elab e val _ = unify (Cexp.ty ce, Type.bool, fn (l, _) => (Aexp.region e, str (concat [br, " branch of orelse not of type bool"]), seq [str "branch: ", l])) in ce end val cel = doit (el, "left") val cer = doit (er, "right") val e = Cexp.orElse (cel, cer) in Cexp.make (Cexp.node e, Type.bool) end | Aexp.Paren e => elab e | Aexp.Prim kind => let fun elabAndExpandTy ty = let val elabedTy = elabType (ty, {bogusAsUnknown = false}) val expandedTy = Type.hom (elabedTy, {con = Type.con, expandOpaque = true, record = Type.record, replaceSynonyms = false, var = Type.var}) in (elabedTy, expandedTy) end (* We use expandedTy to get the underlying primitive right * but we use wrap in the end to make the result of the * final expression be ty, because that is what the rest * of the code expects to see. *) fun wrap (e, t) = Cexp.make (Cexp.node e, t) fun etaExtraNoWrap {expandedTy, extra, prim: Type.t Prim.t}: Cexp.t = case Type.deArrowOpt expandedTy of NONE => primApp {args = extra, prim = prim, result = expandedTy} | SOME (argType, bodyType) => let val arg = Var.newNoname () fun app args = primApp {args = Vector.concat [extra, args], prim = prim, result = bodyType} val body = case Type.deTupleOpt argType of NONE => app (Vector.new1 (Cexp.var (arg, argType))) | SOME ts => let val vars = Vector.map (ts, fn t => (Var.newNoname (), t)) in Cexp.casee {ctxt = fn _ => empty, kind = ("", ""), nest = [], matchDiags = matchDiagsFromNoMatch Cexp.Impossible, noMatch = Cexp.Impossible, region = Region.bogus, rules = Vector.new1 {exp = app (Vector.map (vars, Cexp.var)), layPat = NONE, pat = Cpat.tuple (Vector.map (vars, Cpat.var)), regionPat = Region.bogus}, test = Cexp.var (arg, argType)} end in (Cexp.lambda o Lambda.make) {arg = arg, argType = argType, body = body, mayInline = true} end fun etaNoWrap {expandedTy, prim: Type.t Prim.t} : Cexp.t = etaExtraNoWrap {expandedTy = expandedTy, extra = Vector.new0 (), prim = prim} fun eta {elabedTy, expandedTy, prim: Type.t Prim.t} : Cexp.t = wrap (etaNoWrap {expandedTy = expandedTy, prim = prim}, elabedTy) val lookConst = fn {default, elabedTy, expandedTy, name} => let val finish = lookConst {default = default, expandedTy = expandedTy, name = name, region = region} in Cexp.make (Cexp.Const finish, elabedTy) end val check = fn (c, n) => check (c, n, region) datatype z = datatype Ast.PrimKind.t in case kind of Address {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_address") val (elabedTy, expandedTy) = elabAndExpandTy ty in address {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedTy, name = name, region = region, layoutPrettyType = #1 o layoutPrettyType} end | BuildConst {name, ty} => let val () = check (ElabControl.allowConstant, "_build_const") val (elabedTy, expandedTy) = elabAndExpandTy ty in lookConst {default = NONE, elabedTy = elabedTy, expandedTy = expandedTy, name = "buildConst::" ^ name} end | CommandLineConst {name, ty, value} => let val () = check (ElabControl.allowConstant, "_command_line_const") val (elabedTy, expandedTy) = elabAndExpandTy ty val value = elabConst (value, {layoutPrettyType = #1 o layoutPrettyType}, fn (resolve, _) => case resolve () of Const.Word w => IntInf.toString (WordX.toIntInf w) | c => Const.toString c, {false = "false", true = "true"}) in lookConst {default = SOME value, elabedTy = elabedTy, expandedTy = expandedTy, name = "cmdLineConst::" ^ name} end | Const {name, ty} => let val () = check (ElabControl.allowConstant, "_const") val (elabedTy, expandedTy) = elabAndExpandTy ty in lookConst {default = NONE, elabedTy = elabedTy, expandedTy = expandedTy, name = "const::" ^ name} end | Export {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_export") val (elabedTy, expandedTy) = elabAndExpandTy ty fun error () = Control.error (region, str "invalid type for _export", #1 (layoutPrettyType elabedTy)) val (expandedCfTy, elabedExportTy) = Exn.withEscape (fn escape => let val error = fn () => (error () ; ignore (escape (Type.arrow (Type.unit, Type.unit), elabedTy)) ; Error.bug "ElaborateCore.elabExp.Export.escape") in case Type.deArrowOpt expandedTy of NONE => error () | SOME (argTy, resTy) => (case Type.deArrowOpt argTy of NONE => error () | SOME _ => let val () = if Type.isUnit resTy then () else error () in (argTy, elabedTy) end) end) val exp = Env.scope (E, fn () => (Env.openStructure (E, valOf (!Env.Structure.ffi)) ; elab (export {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedCfTy, name = name, region = region, layoutPrettyType = #1 o layoutPrettyType}))) val _ = unify (Cexp.ty exp, Type.arrow (expandedCfTy, Type.unit), fn (l1, l2) => (region, str "_export unify bug", align [seq [str "inferred: ", l1], seq [str "expanded: ", l2]])) in wrap (exp, elabedExportTy) end | IImport {attributes, ty} => let val () = check (ElabControl.allowFFI, "_import") val (elabedTy, expandedTy) = elabAndExpandTy ty fun error () = Control.error (region, str "invalid type for _import", #1 (layoutPrettyType elabedTy)) val (expandedFPtrTy, expandedCfTy) = Exn.withEscape (fn escape => let val error = fn () => (error () ; ignore (escape (Type.cpointer, Type.arrow (Type.unit, Type.unit))) ; Error.bug "ElaborateCore.elabExp.IImport.escape") in case Type.deArrowOpt expandedTy of NONE => error () | SOME (fptrTy, cfTy) => (fptrTy, cfTy) end) val () = case Type.toCPtrType expandedFPtrTy of NONE => (error (); ()) | SOME _ => () val fptr = Var.newNoname () val fptrArg = Cexp.var (fptr, expandedFPtrTy) in wrap ((Cexp.lambda o Lambda.make) {arg = fptr, argType = expandedFPtrTy, body = etaExtraNoWrap {expandedTy = expandedCfTy, extra = Vector.new1 fptrArg, prim = import {attributes = attributes, name = NONE, region = region, elabedTy = elabedTy, expandedTy = expandedCfTy, layoutPrettyType = #1 o layoutPrettyType}}, mayInline = true}, elabedTy) end | Import {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_import") val (elabedTy, expandedTy) = elabAndExpandTy ty in eta ({elabedTy = elabedTy, expandedTy = expandedTy, prim = import {attributes = attributes, name = SOME name, region = region, elabedTy = elabedTy, expandedTy = expandedTy, layoutPrettyType = #1 o layoutPrettyType}}) end | ISymbol {ty} => let val () = check (ElabControl.allowFFI, "_symbol") val (elabedTy, expandedTy) = elabAndExpandTy ty in symbolIndirect {elabedTy = elabedTy, expandedTy = expandedTy, region = region, layoutPrettyType = #1 o layoutPrettyType} end | Prim {name, ty} => let val () = check (ElabControl.allowPrim, "_prim") val (elabedTy, expandedTy) = elabAndExpandTy ty val prim = case Prim.fromString name of NONE => (Control.error (region, str (concat ["unknown primitive: ", name]), empty) ; Prim.MLton_bogus) | SOME p => p in eta {elabedTy = elabedTy, expandedTy = expandedTy, prim = prim} end | Symbol {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_symbol") val (elabedTy, expandedTy) = elabAndExpandTy ty in symbolDirect {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedTy, name = name, region = region, layoutPrettyType = #1 o layoutPrettyType} end end | Aexp.Raise exn => let val region = Aexp.region exn val exn = elab exn val _ = unify (Cexp.ty exn, Type.exn, fn (l1, _) => (region, str "raise object not of type exn", seq [str "object: ", l1])) val resultType = Type.new () in Cexp.enterLeave (Cexp.make (Cexp.Raise exn, resultType), profileBody andalso !Control.profileRaise, fn () => SourceInfo.function {name = "" :: nest, region = region}) end | Aexp.Record r => let val r = Record.map (r, elab o #2) val ty = Type.record (SortedRecord.fromVector (Record.toVector (Record.map (r, Cexp.ty)))) in Cexp.make (Cexp.Record r, ty) end | Aexp.Selector f => elab (Aexp.selector (f, region)) | Aexp.Seq es => let val es' = Vector.map (es, elab) val last = Vector.length es - 1 (* Diagnose expressions before a ; that don't return unit. *) val _ = let (* Technically, wrong scope for region; * but saving environment would probably * be expensive. *) fun doit f = Vector.foreachi2 (es, es', fn (i, e, e') => if i = last orelse Type.isUnit (Cexp.ty e') then () else List.push (sequenceNonUnitChecks, fn () => if Type.isUnit (Cexp.ty e') then () else f (Aexp.region e, str "sequence expression not of type unit", align [seq [str "type: ", layoutPrettyTypeBracket (Cexp.ty e')], ctxt ()]))) in case sequenceNonUnit () of Control.Elaborate.DiagEIW.Error => doit Control.error | Control.Elaborate.DiagEIW.Ignore => () | Control.Elaborate.DiagEIW.Warn => doit Control.warning end in Cexp.make (Cexp.Seq es', Cexp.ty (Vector.sub (es', last))) end | Aexp.Var {name = id, ...} => let fun dontCare () = Cexp.var (Var.newNoname (), Type.new ()) in case Env.lookupLongvid (E, id) of NONE => dontCare () | SOME (vid, scheme) => let val {args, instance} = Scheme.instantiate scheme fun con c = Cexp.Con (c, args ()) val e = case vid of Vid.Con c => con c | Vid.Exn c => con c | Vid.Overload (p, yts) => let val resolve = Promise.lazy (fn () => case Vector.peekMap (yts, fn (x, s) => let val is = Scheme.instantiate s in if Type.canUnify (instance, #instance is) then SOME (x, SOME is) else NONE end) of NONE => let (* Technically, wrong scope for region; * but saving environment would probably * be expensive. *) val _ = Control.error (region, seq [str "variable not overloaded at type: ", str (Longvid.toString id)], seq [str "type: ", #1 (layoutPrettyType instance)]) in {id = Var.newNoname (), args = Vector.new0 ()} end | SOME (y, is) => (unify (instance, #instance (valOf is), fn _ => Error.bug "ElaborateCore.elabExp: Var:overload unify") ; {id = y, args = #args (valOf is) ()})) val _ = List.push (overloadChecks, (p, ignore o resolve)) in Cexp.Var (#id o resolve, #args o resolve) end | Vid.Var x => Cexp.Var (fn () => x, case ! (recursiveTargs x) of NONE => args | SOME f => f) in Cexp.make (e, instance) end end | Aexp.Vector es => let val _ = check (ElabControl.allowVectorExps, "Vector expressions", Aexp.region e) val es' = Vector.map (es, elab) in Cexp.make (Cexp.Vector es', unifyVector (Vector.map2 (es, es', fn (e, e') => (Cexp.ty e', Aexp.region e)), unify)) end | Aexp.While {expr, test} => let val test' = elab test val _ = unify (Cexp.ty test', Type.bool, fn (l1, _) => (Aexp.region test, str "while test not of type bool", seq [str "test: ", l1])) val expr' = elab expr (* Diagnose if expr is not of type unit. *) val _ = let (* Technically, wrong scope for region; * but saving environment would probably * be expensive. *) fun doit f = if Type.isUnit (Cexp.ty expr') then () else List.push (sequenceNonUnitChecks, fn () => if Type.isUnit (Cexp.ty expr') then () else f (Aexp.region expr, str "while body not of type unit", align [seq [str "body: ", layoutPrettyTypeBracket (Cexp.ty expr')], ctxt ()])) in case sequenceNonUnit () of Control.Elaborate.DiagEIW.Error => doit Control.error | Control.Elaborate.DiagEIW.Ignore => () | Control.Elaborate.DiagEIW.Warn => doit Control.warning end in Cexp.whilee {expr = expr', test = test'} end end) arg and elabMatchFn (m: Amatch.t, nest, ctxt, kind, noMatch) = let val arg = Var.newNoname () val {argType, region, rules, ...} = elabMatch (m, nest) val body = Cexp.casee {ctxt = ctxt, kind = kind, nest = nest, matchDiags = matchDiagsFromNoMatch noMatch, noMatch = noMatch, region = region, rules = rules, test = Cexp.var (arg, argType)} in {arg = arg, argType = argType, body = body} end and elabMatch (m: Amatch.t, nest: Nest.t) = let val {unify, ...} = DiagUtils.make E fun ctxt () = seq [str "in: ", approximate (Amatch.layout m)] val unify = fn (a, b, f) => unify (a, b, fn z => let val (r, m, d) = f z in (r, m, align [d, ctxt ()]) end) val region = Amatch.region m val Amatch.T rules = Amatch.node m val argType = Type.new () val resultType = Type.new () val rules = Vector.map (rules, fn (pat, exp) => Env.scope (E, fn () => let fun layPat () = approximate (Apat.layout pat) val patOrig = pat val (pat, _) = elaboratePat () (pat, E, {bind = true, isRvb = false}) val _ = unify (Cpat.ty pat, argType, fn (l1, l2) => (Apat.region patOrig, str "rule with pattern of different type", align [seq [str "pattern: ", l1], seq [str "previous: ", l2]])) val expOrig = exp val exp = elabExp (exp, nest, NONE) val _ = unify (Cexp.ty exp, resultType, fn (l1, l2) => (Aexp.region expOrig, str "rule with result of different type", align [seq [str "result: ", l1], seq [str "previous: ", l2]])) val exp = Cexp.enterLeave (exp, profileBody andalso !Control.profileBranch, fn () => let val name = concat [""] in SourceInfo.function {name = name :: nest, region = Aexp.region expOrig} end) in {exp = exp, layPat = SOME layPat, pat = pat, regionPat = Apat.region patOrig} end)) in {argType = argType, region = region, resultType = resultType, rules = rules} end val ds = elabDec (Scope.scope d, nest, true) in ds end end mlton-20210117+dfsg/mlton/elaborate/elaborate-core.sig000066400000000000000000000017221416264345000225070ustar00rootroot00000000000000(* Copyright (C) 2009,2012,2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_CORE_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_CORE = sig include ELABORATE_CORE_STRUCTS (* Elaborate dec in env, returning Core ML decs. *) val elaborateDec: Ast.Dec.t * {env: Env.t, nest: string list} -> Decs.t val reportSequenceNonUnit: unit -> unit val reportUndeterminedTypes: unit -> unit val reportUnresolvedFlexRecords: unit -> unit val resolveOverloads: unit -> unit end mlton-20210117+dfsg/mlton/elaborate/elaborate-env.fun000066400000000000000000005654451416264345000223760ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2015,2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaborateEnv (S: ELABORATE_ENV_STRUCTS): ELABORATE_ENV = struct open S local open Control.Elaborate in val warnUnused = fn () => current warnUnused end local open Layout in val align = align val alignPrefix = alignPrefix (* val empty = empty *) val mayAlign = mayAlign val seq = seq val str = str val bracket = fn l => seq [str "[", l, str "]"] end local open Ast in structure Basid = Basid structure Fctid = Fctid structure Strid = Strid structure Longtycon = Longtycon structure Priority = Priority structure Sigid = Sigid structure Strid = Strid structure Symbol = Symbol end fun layoutLong (ids: Layout.t list) = let open Layout in seq (separate (ids, ".")) end fun layoutStrids (ss: Strid.t list): Layout.t = layoutLong (List.map (ss, Strid.layout)) fun layoutLongRev (ss: Strid.t list, id: Layout.t) = (seq o List.fold) (ss, [id], fn (s, ls) => Strid.layout s :: str "." :: ls) fun toStringLongRev (ss: Strid.t list, id: Layout.t) = Layout.toString (layoutLongRev (ss, id)) local open CoreML in structure Con = Con structure Dec = Dec structure Exp = Exp structure Pat = Pat structure Tycon = Tycon structure Tyvar = Tyvar structure Var = Var end local open Tycon in structure AdmitsEquality = AdmitsEquality structure Kind = Kind structure Symbol = Symbol end local open TypeEnv in structure Scheme = Scheme structure Type = Type end structure Decs = Decs (structure CoreML = CoreML) structure Tycon = struct open Tycon open TypeEnv.TyconExt end structure Tyvar = struct open Tyvar open TypeEnv.TyvarExt fun fromAst a = makeString (Ast.Tyvar.toString a, {equality = Ast.Tyvar.isEquality a}) end structure TyvarEnv = struct datatype t = T of {cur: (Ast.Tyvar.t * Tyvar.t) list ref, get: Ast.Tyvar.t -> Tyvar.t list ref} fun new () = let val {get: Ast.Tyvar.t -> Tyvar.t list ref, ...} = Property.get (Symbol.plist o Ast.Tyvar.toSymbol, Property.initFun (fn _ => ref [])) val cur = ref [] in T {get = get, cur = cur} end fun peekTyvar (T {get, ...}, a) = case !(get a) of [] => NONE | a'::_ => SOME a' fun lookupTyvar (env, a) = case peekTyvar (env, a) of NONE => let val _ = Control.error (Ast.Tyvar.region a, seq [str "undefined type variable: ", Ast.Tyvar.layout a], Layout.empty) in NONE end | SOME tv => SOME tv fun scope (T {cur, get, ...}, bs, th) = let val bs' = Vector.map (bs, Tyvar.fromAst) val () = Vector.foreach2 (bs, bs', fn (b, b') => (List.push (cur, (b, b')) ; List.push (get b, b'))) val res = th bs' val () = Vector.foreach (bs, fn b => (ignore (List.pop cur) ; ignore (List.pop (get b)))) in res end val E = new () val lookupTyvar = fn a => lookupTyvar (E, a) val scope = fn (bs, th) => scope (E, bs, th) (* val makeLayoutPretty = fn () => let val {destroy, get = layoutPretty, set = setLayoutPretty, ...} = Property.destGetSet (Tyvar.plist, Property.initFun Tyvar.layout) val T {cur, ...} = E val pre = fn () => List.foreach (!cur, fn (a, a') => setLayoutPretty (a', Ast.Tyvar.layout a)) val pre = ClearablePromise.delay pre val destroy = fn () => (ClearablePromise.clear pre ; destroy ()) val layoutPretty = fn a' => (ClearablePromise.force pre ; layoutPretty a') in {destroy = destroy, layoutPretty = layoutPretty} end *) val makeLayoutPretty = fn () => let fun layoutPretty a' = let val T {cur, ...} = E in case List.peek (!cur, fn (_, b') => Tyvar.equals (a', b')) of NONE => Tyvar.layout a' | SOME (a, _) => Ast.Tyvar.layout a end in {destroy = fn () => (), layoutPretty = layoutPretty} end end val insideFunctor = ref false fun amInsideFunctor () = !insideFunctor structure Scope = struct structure Unique = UniqueId () datatype t = T of {unique: Unique.t} local fun make f (T r) = f r in val unique = make #unique end fun new (): t = T {unique = Unique.new ()} fun equals (s, s') = Unique.equals (unique s, unique s') end structure Uses: sig type 'a t structure Extend: sig val new: {rebind: {domain: 'a, uses: 'a t} option} -> 'a t option val old: 'a t -> {rebind: {domain: 'a, uses: 'a t} option} -> 'a t option val fromIsRebind: {isRebind: bool} -> {rebind: {domain: 'a, uses: 'a t} option} -> 'a t option end val add: 'a t * 'a -> unit val all: 'a t -> 'a list val clear: 'a t -> unit val forceUsed: 'a t -> unit val hasUse: 'a t -> bool val isUsed: 'a t -> bool val new: unit -> 'a t end = struct datatype 'a t = T of {direct: 'a list ref, forceUsed: bool ref} fun new () = T {direct = ref [], forceUsed = ref false} fun add (T {direct, ...}, a) = List.push (direct, a) fun forceUsed (T {forceUsed = r, ...}) = r := true fun clear (T {direct, ...}) = direct := [] fun all (T {direct, ...}) = !direct fun hasUse (T {direct, ...}): bool = not (List.isEmpty (!direct)) fun isUsed (u as T {forceUsed, ...}): bool = !forceUsed orelse hasUse u structure Extend = struct fun new _ = NONE fun old uses _ = SOME uses fun fromIsRebind {isRebind} = if isRebind then (fn {rebind} => case rebind of NONE => Error.bug "ElaborateEnv.Uses.Extend.fromIsRebind" | SOME {domain = _, uses} => SOME uses) else new end end structure Class = struct datatype t = Bas | Con | Exn | Fix | Fct | Sig | Str | Typ | Var val toString = fn Bas => "basis" | Con => "constructor" | Exn => "exception" | Fix => "fixity" | Fct => "functor" | Sig => "signature" | Str => "structure" | Typ => "type" | Var => "variable" end structure Vid = struct datatype t = Con of Con.t | Exn of Con.t | Overload of Priority.t * (Var.t * Scheme.t) vector | Var of Var.t val statusPretty = fn Con _ => "constructor" | Exn _ => "exception" | Overload _ => "overload" | Var _ => "variable" fun layout vid = let open Layout val (name, l) = case vid of Con c => ("Con", Con.layout c) | Exn c => ("Exn", Con.layout c) | Overload (p,xts) => (concat ["Overload (", Layout.toString (Priority.layout p), ")"], Vector.layout (tuple2 (Var.layout, Scheme.layout)) xts) | Var v => ("Var", Var.layout v) in paren (seq [str name, str " ", l]) end val deVar = fn Var v => SOME v | _ => NONE val deCon = fn Con c => SOME c | Exn c => SOME c | _ => NONE val deExn = fn Exn c => SOME c | _ => NONE val class = fn Con _ => Class.Con | Exn _ => Class.Exn | Overload _ => Class.Var | Var _ => Class.Var end structure TypeStr = struct structure Cons : sig type t val dest: t -> {con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} vector val fromSortedVector: {con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} vector -> t val fromVector: {con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} vector -> t val layout: t -> Layout.t val map: t * ({con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} -> {con: Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t}) -> t end = struct datatype t = T of {con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} vector fun dest (T v) = v val fromSortedVector = T fun fromVector v = (fromSortedVector o QuickSort.sortVector) (v, fn ({name = name1, ...}, {name = name2, ...}) => case Ast.Con.compare (name1, name2) of LESS => true | EQUAL => true | GREATER => false) fun map (T v, f) = (T o Vector.map) (v, fn elt as {name, ...} => let val {con, scheme, uses} = f elt in {con = con, name = name, scheme = scheme, uses = uses} end) fun layout (T v) = Vector.layout (fn {name, scheme, ...} => seq [Ast.Con.layout name, str ": ", Scheme.layout scheme]) v end datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t type t = node val node = fn s => s fun kind s = case node s of Datatype {tycon, ...} => Tycon.kind tycon | Scheme s => Scheme.kind s | Tycon c => Tycon.kind c fun layout t = let open Layout in case node t of Datatype {tycon, cons} => seq [str "Datatype ", record [("tycon", Tycon.layout tycon), ("cons", Cons.layout cons)]] | Scheme s => seq [str "Scheme ", Scheme.layout s] | Tycon c => seq [str "Tycon ", Tycon.layout c] end fun admitsEquality (s: t): AdmitsEquality.t = case node s of Datatype {tycon = c, ...} => Tycon.admitsEquality c | Scheme s => if Scheme.admitsEquality s then AdmitsEquality.Sometimes else AdmitsEquality.Never | Tycon c => Tycon.admitsEquality c fun explainDoesNotAdmitEquality (s: t, {layoutPrettyTycon}): Layout.t = let fun doitScheme s = case Scheme.checkEquality (s, {layoutPrettyTycon = layoutPrettyTycon}) of SOME l => l | NONE => Error.bug "ElaborateEnv.TypeStr.explainDoesNotAdmitEquality.doitScheme: NONE" in case node s of Datatype {cons, ...} => let val extra = ref false val cons = Vector.toListKeepAllMap (Cons.dest cons, fn {name, scheme, ...} => let val (tyvars, ty) = Scheme.dest scheme in case Type.deArrowOpt ty of NONE => (extra := true; NONE) | SOME (arg, _) => let val argScheme = Scheme.make {canGeneralize = true, ty = arg, tyvars = tyvars} in case Scheme.checkEquality (argScheme, {layoutPrettyTycon = layoutPrettyTycon}) of NONE => (extra := true; NONE) | SOME l => SOME (seq [Ast.Con.layout name, str " of ", l]) end end) val cons = if !extra then List.snoc (cons, str "...") else cons val cons = alignPrefix (cons, "| ") in cons end | Scheme s => doitScheme s | Tycon c => doitScheme (Scheme.fromTycon c) end fun apply (t: t, tys: Type.t vector): Type.t = case node t of Datatype {tycon, ...} => Type.con (tycon, tys) | Scheme s => Scheme.apply (s, tys) | Tycon c => Type.con (c, tys) fun toTyconOpt s = case node s of Datatype {tycon, ...} => SOME tycon | Scheme s => let val (tyvars, ty) = Scheme.dest s in case Type.deEta (ty, tyvars) of NONE => NONE | SOME c => if Tycon.equals (c, Tycon.arrow) orelse Tycon.equals (c, Tycon.tuple) then NONE else SOME c end | Tycon c => SOME c fun data (tycon, cons) = Datatype {tycon = tycon, cons = cons} val def = Scheme val tycon = Tycon fun abs t = case node t of Datatype {tycon = c, ...} => tycon c | _ => t end local open TypeStr in structure Cons = Cons end structure Interface = Interface (structure Ast = Ast structure AdmitsEquality = AdmitsEquality structure Kind = Kind structure EnvTycon = Tycon structure EnvTypeStr = TypeStr structure Tyvar = Tyvar) structure Interface = struct structure Econs = Cons structure Escheme = Scheme structure Etycon = Tycon structure Etype = Type structure EtypeStr = TypeStr structure Etyvar = Tyvar open Interface fun flexibleTyconToEnv (fc: FlexibleTycon.t): EtypeStr.t = let datatype z = datatype FlexibleTycon.realization in case FlexibleTycon.realization fc of SOME (ETypeStr s) => s | SOME (TypeStr s) => typeStrToEnv s | NONE => let (* A shadowed flexible tycon was not reported as * a flexible tycon and was not realized. *) val () = Assert.assert ("ElaborateEnv.Interface.flexibleTyconToEnv", fn () => !Control.numErrors > 0) val {admitsEquality = ae, kind = k, prettyDefault = pd, ...} = FlexibleTycon.dest fc val pd = "??." ^ pd val c = Etycon.make {admitsEquality = ae, kind = k, name = "", prettyDefault = pd, region = Region.bogus} val tyStr = EtypeStr.tycon c val () = FlexibleTycon.realize (fc, tyStr) in tyStr end end and tyconToEnv (t: Tycon.t): EtypeStr.t = let open Tycon in case t of Flexible c => flexibleTyconToEnv c | Rigid c => EtypeStr.tycon c end and typeToEnv (t: Type.t): Etype.t = Type.hom (t, {con = fn (c, ts) => EtypeStr.apply (tyconToEnv c, ts), record = Etype.record, var = Etype.var}) and schemeToEnv (Scheme.T {ty, tyvars}): Escheme.t = Escheme.make {canGeneralize = true, ty = typeToEnv ty, tyvars = tyvars} and consToEnv cons: Econs.t = (Econs.fromSortedVector o Vector.map) (Cons.dest cons, fn {name, scheme} => {con = Con.newNoname (), name = name, scheme = schemeToEnv scheme, uses = Uses.new ()}) and typeStrToEnv (s: TypeStr.t): EtypeStr.t = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons, tycon, ...} => let fun data c = EtypeStr.data (c, consToEnv cons) in case tycon of Tycon.Flexible c => let val typeStr = flexibleTyconToEnv c in case EtypeStr.toTyconOpt typeStr of SOME c => data c | _ => Error.bug (Layout.toString (seq [str "ElaborateEnv.Interface.typeStrToEnv ", str "datatype ", TypeStr.layout s, str " realized with type structure ", EtypeStr.layout typeStr])) end | Tycon.Rigid c => data c end | Scheme s => EtypeStr.def (schemeToEnv s) | Tycon {tycon, ...} => EtypeStr.abs (tyconToEnv tycon) end structure FlexibleTycon = struct open FlexibleTycon val toEnv = flexibleTyconToEnv fun dummyTycon (fc, name, strids, {prefix}) = let val {admitsEquality = ae, kind = k, ...} = FlexibleTycon.dest fc val r = Ast.Tycon.region name val n = Ast.Tycon.toString name val pd = prefix ^ toStringLongRev (strids, Ast.Tycon.layout name) val c = Etycon.make {admitsEquality = ae, kind = k, name = n, prettyDefault = pd, region = r} in c end end structure Tycon = struct open Tycon val fromEnv = Rigid end structure Type = struct open Type fun fromEnv (t: Etype.t): t = let fun con (c, ts) = Type.con (Tycon.fromEnv c, ts) in Etype.hom (t, {con = con, expandOpaque = false, record = record, replaceSynonyms = false, var = var}) end end structure Scheme = struct open Scheme val toEnv = schemeToEnv fun fromEnv (s: Escheme.t): t = let val (tyvars, ty) = Escheme.dest s in Scheme.T {ty = Type.fromEnv ty, tyvars = tyvars} end end structure Cons = struct open Cons fun fromEnv (cons): t = (fromSortedVector o Vector.map) (Econs.dest cons, fn {name, scheme, ...} => {name = name, scheme = Scheme.fromEnv scheme}) end structure TypeStr = struct open TypeStr val toEnv = typeStrToEnv fun fromEnv (s: EtypeStr.t) = case EtypeStr.node s of EtypeStr.Datatype {cons, tycon} => data (Tycon.fromEnv tycon, Cons.fromEnv cons, true) | EtypeStr.Scheme s => def (Scheme.fromEnv s) | EtypeStr.Tycon c => def (Scheme.fromTycon (Tycon.fromEnv c)) structure Sort = struct datatype t = Datatype of {tycon: Etycon.t, cons: Econs.t, repl: bool} | Scheme of Escheme.t | Type of {admitsEquality: bool} end fun sort (sigStr, rlzStr, representative) = case (representative, node sigStr, EtypeStr.node rlzStr) of (false, Datatype _, EtypeStr.Datatype {tycon = rlzTycon, cons = rlzCons}) => Sort.Datatype {tycon = rlzTycon, cons = rlzCons, repl = true} | (false, Datatype _, EtypeStr.Scheme _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = false, sigStr = Datatype _, rlzStr = Scheme _}" | (false, Datatype _, EtypeStr.Tycon _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = false, sigStr = Datatype _, rlzStr = Tycon _}" | (false, _, rlzStr) => Sort.Scheme (case rlzStr of EtypeStr.Datatype {tycon, ...} => Escheme.fromTycon tycon | EtypeStr.Scheme s => s | EtypeStr.Tycon c => Escheme.fromTycon c) | (true, Datatype {repl = false, ...}, EtypeStr.Datatype {tycon = rlzTycon, cons = rlzCons}) => Sort.Datatype {tycon = rlzTycon, cons = rlzCons, repl = false} | (true, Datatype {repl = false, ...}, EtypeStr.Scheme _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = true, sigStr = Datatype {repl = false, ...}, rlzStr = Scheme _}" | (true, Datatype {repl = false, ...}, EtypeStr.Tycon _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = true, sigStr = Datatype {repl = false, ...}, rlzStr = Tycon _}" | (true, Datatype {repl = true, ...}, _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = true, sigStr = Datatype {repl = true, ...}}" | (true, Scheme _, _) => Error.bug "ElaborateEnv.Interface.TypeStr.sort: {repr = true, sigStr = Scheme _}" | (true, Tycon _, _) => (case admitsEquality sigStr of AdmitsEquality.Always => Sort.Type {admitsEquality = true} | AdmitsEquality.Never => Sort.Type {admitsEquality = false} | AdmitsEquality.Sometimes => Sort.Type {admitsEquality = true}) val sort = fn (name, sigStr, rlzStr, flexTyconMap: FlexibleTycon.t TyconMap.t) => sort (sigStr, rlzStr, Option.isSome (TyconMap.peekTycon (flexTyconMap, name))) end fun layouts {interfaceSigid, layoutPrettyTycon, setLayoutPrettyTycon} = let val empty = Layout.empty val indent = fn l => Layout.indent (l, 3) val isEmpty = Layout.isEmpty val tuple = Layout.tuple val {destroy = destroyLayoutPrettyTyvar, layoutPretty = layoutPrettyTyvar, localInit = localInitLayoutPrettyTyvar} = Etyvar.makeLayoutPretty () val {destroy = destroyLayoutPrettyType, layoutPretty = layoutPrettyType} = Etype.makeLayoutPretty {expandOpaque = false, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar} fun layoutPrettyScheme s = let val (bs, t) = Escheme.dest s val () = localInitLayoutPrettyTyvar bs in #1 (layoutPrettyType t) end fun layoutValSpec (strids, name, (sigStatus, sigScheme), {compact, con, def}) = let val rlzScheme = Scheme.toEnv sigScheme fun doit kw = let val lay = mayAlign [seq [str kw, str " ", layoutLongRev (strids, Ast.Vid.layout name), str (if Ast.Vid.isSymbolic name then " : " else ": "), layoutPrettyScheme rlzScheme], indent (if def then seq [str "(* @ ", Region.layout (Ast.Vid.region name), str " *)"] else empty)] val lay = if compact then Layout.compact lay else lay in SOME lay end in case sigStatus of Status.Con => if con then doit "con" else NONE | Status.Exn => if con then doit "exn" else let val lay = mayAlign [seq [str "exception ", layoutLongRev (strids, Ast.Vid.layout name), case Etype.deArrowOpt (Escheme.ty rlzScheme) of NONE => empty | SOME (ty, _) => seq [str " of ", #1 (layoutPrettyType ty)]], indent (if def then seq [str "(* @ ", Region.layout (Ast.Vid.region name), str " *)"] else empty)] val lay = if compact then Layout.compact lay else lay in SOME lay end | Status.Var => doit "val" end fun layoutTypeSpec (strids, name, sigStr, {compact, def, flexTyconMap}) = let val lay = #1 o layoutPrettyType val rlzStr = TypeStr.toEnv sigStr val sort = TypeStr.sort (name, sigStr, rlzStr, flexTyconMap) val arity = case Interface.TypeStr.kind sigStr of Kind.Arity sigArity => sigArity | _ => Error.bug "ElaborateEnv.transparentCut.layouts.layoutTypeSpec: sigArity" val tyvars = Vector.tabulate (arity, fn _ => Etyvar.makeNoname {equality = false}) val () = localInitLayoutPrettyTyvar tyvars val tyargs = Vector.map (tyvars, Etype.var) val tyvars = Vector.map (tyvars, layoutPrettyTyvar) val tyvars = case Vector.length tyvars of 0 => empty | 1 => Vector.first tyvars | _ => tuple (Vector.toList tyvars) datatype sort = datatype TypeStr.Sort.t val (kw, rest) = case sort of Datatype {repl, cons, ...} => let val cons = Vector.toListMap (Econs.dest cons, fn {name, scheme, ...} => let val ty = Escheme.apply (scheme, tyargs) in seq [Ast.Con.layout name, case Etype.deArrowOpt ty of NONE => empty | SOME (ty, _) => seq [str " of ", lay ty]] end) val cons = List.mapi (cons, fn (i, l) => if i = 0 then l else Layout.indent (seq [str "| ", l], ~2)) val rest = if repl then let val repl = seq [str "(* = datatype ", lay (EtypeStr.apply (rlzStr, tyargs)), str " *)"] in List.snoc (cons, Layout.indent (repl, ~2)) end else cons in ("datatype", SOME (mayAlign rest)) end | Scheme scheme => ("type", SOME (lay (Escheme.apply (scheme, tyargs)))) | Type {admitsEquality} => (if admitsEquality then "eqtype" else "type", NONE) val lay = mayAlign [seq [str kw, str " ", tyvars, if isEmpty tyvars then empty else str " ", layoutLongRev (strids, Ast.Tycon.layout name), case rest of NONE => empty | SOME rest => seq [str " = ", rest]], indent (if def then seq [str "(* @ ", Region.layout (Ast.Tycon.region name), str " *)"] else empty)] val lay = if compact then Layout.compact lay else lay in lay end fun layoutStrSpec (strids, name, I, {compact, def, elide, flexTyconMap}) = let val bind = seq [str "structure ", layoutLongRev (strids, Ast.Strid.layout name), str ":"] val flexTyconMap = Option.fold (TyconMap.peekStrid (flexTyconMap, name), TyconMap.empty (), fn (flexTyconMap, _) => flexTyconMap) val {abbrev, full} = layoutSigRlz (I, {compact = compact, elide = elide, flexTyconMap = flexTyconMap}) val def = if def then seq [str "(* @ ", Region.layout (Ast.Strid.region name), str " *)"] else empty val full = fn () => align [bind, indent (full ()), indent def] in case abbrev () of NONE => full () | SOME sigg => let val lay = mayAlign [seq [bind, str " ", sigg], indent def] val lay = if compact then Layout.compact lay else lay in lay end end and layoutSigFlex (I, {compact, elide}) = let fun realize (TyconMap.T {strs, types}, strids) = let val () = Array.foreach (strs, fn (name, tm) => realize (tm, name :: strids)) val () = Array.foreach (types, fn (name, fc) => let val c = FlexibleTycon.dummyTycon (fc, name, strids, {prefix = "_sig."}) val () = setLayoutPrettyTycon (c, Etycon.layoutPrettyDefault c) val () = FlexibleTycon.realize (fc, EtypeStr.tycon c) in () end) in () end val rlzI = copy I val flexTyconMap = flexibleTycons rlzI val () = realize (flexTyconMap, []) in layoutSigRlz (rlzI, {compact = compact, elide = elide, flexTyconMap = flexTyconMap}) end and layoutSigRlz (I, {compact, elide, flexTyconMap}) = let fun abbrev () = case interfaceSigid (Interface.original I) of NONE => NONE | SOME (s, I') => SOME (layoutSigRlzAbbrev (s, I', I, {compact = compact, flexTyconMap = flexTyconMap})) fun full () = layoutSigRlzFull (I, {compact = compact, elide = elide, flexTyconMap = flexTyconMap}) in {abbrev = abbrev, full = full} end and layoutSigRlzFull (I, {compact, elide: {strs: (int * int) option, types: (int * int) option, vals: (int * int) option}, flexTyconMap}) = let val {strs, types, vals} = Interface.dest I fun doit (a, layout, elide) = let val specs = Array.foldr (a, [], fn ((name, range), ls) => case layout (name, range) of NONE => ls | SOME l => l :: ls) in case elide of NONE => align specs | SOME (n, m) => let val l = List.length specs in if n + m + 1 < l then align [align (List.dropSuffix (specs, l - n)), str "...", align (List.dropPrefix (specs, l - m))] else align specs end end val layoutTypeSpec = fn (name, sigStr) => layoutTypeSpec ([], name, sigStr, {compact = compact, def = false, flexTyconMap = flexTyconMap}) val layoutValSpec = fn (name, (sigStatus, sigScheme)) => layoutValSpec ([], name, (sigStatus, sigScheme), {compact = compact, con = false, def = false}) val layoutStrSpec = fn (name, I) => layoutStrSpec ([], name, I, {compact = compact, def = false, elide = elide, flexTyconMap = flexTyconMap}) in align [str "sig", indent (align [doit (types, SOME o layoutTypeSpec, #types elide), doit (vals, layoutValSpec, #vals elide), doit (strs, SOME o layoutStrSpec, #strs elide)]), str "end"] end and layoutSigRlzAbbrev (s, I', I, {compact, flexTyconMap}) = let val flexTyconMap' = Interface.flexibleTycons I' val wheres = ref [] fun loop (strids, flexTyconMap', I, flexTyconMap) = let val TyconMap.T {strs = strs', types = types'} = flexTyconMap' val _ = Array.foreach (strs', fn (name, flexTyconMap') => let val I = valOf (Interface.peekStrid (I, name)) val flexTyconMap = Option.fold (TyconMap.peekStrid (flexTyconMap, name), TyconMap.empty (), fn (flexTyconMap, _) => flexTyconMap) in loop (name::strids, flexTyconMap', I, flexTyconMap) end) val _ = Array.foreach (types', fn (name, _) => let val (_, sigStr) = valOf (Interface.peekTycon (I, name)) val flexTycon = TyconMap.peekTycon (flexTyconMap, name) in case flexTycon of NONE => List.push (wheres, seq [str "where ", layoutTypeSpec (strids, name, Interface.TypeStr.abs sigStr, {compact = compact, def = false, flexTyconMap = flexTyconMap})]) | SOME _ => () end) in () end val () = loop ([], flexTyconMap', I, flexTyconMap) val wheres = rev (!wheres) val lay = align (Ast.Sigid.layout s :: wheres) in lay end fun layoutSigDefn (name, I, {compact, def}) = let val bind = seq [str "signature ", Ast.Sigid.layout name, str " ="] val {abbrev, full} = layoutSigFlex (I, {compact = compact, elide = {strs = NONE, types = NONE, vals = NONE}}) val origI = Interface.original I val def = if def then seq [str "(* @ ", Region.layout (Ast.Sigid.region name), str " *)"] else empty val full = fn () => align [bind, indent (full ()), indent def] in if Interface.equals (I, origI) then full () else (case abbrev () of NONE => full () | SOME sigg => let val lay = mayAlign [seq [bind, str " ", sigg], indent def] val lay = if compact then Layout.compact lay else lay in lay end) end in {destroy = fn () => (destroyLayoutPrettyType () ; destroyLayoutPrettyTyvar ()), destroyLayoutPrettyType = destroyLayoutPrettyType, destroyLayoutPrettyTyvar = destroyLayoutPrettyTyvar, localInitLayoutPrettyTyvar = localInitLayoutPrettyTyvar, layoutPrettyScheme = layoutPrettyScheme, layoutPrettyType = layoutPrettyType, layoutPrettyTyvar = layoutPrettyTyvar, layoutSigDefn = layoutSigDefn, layoutSigFlex = layoutSigFlex, layoutSigRlz = layoutSigRlz, layoutStrSpec = layoutStrSpec, layoutTypeSpec = layoutTypeSpec, layoutValSpec = layoutValSpec} end fun layoutPretty I = let val {destroy, layoutSigFlex, ...} = layouts {interfaceSigid = fn _ => NONE, layoutPrettyTycon = Etycon.layoutPrettyDefault, setLayoutPrettyTycon = fn _ => ()} val {full, ...} = layoutSigFlex (I, {compact = false, elide = {strs = NONE, types = NONE, vals = NONE}}) val res = full () val () = destroy () in res end end local open Interface in structure FlexibleTycon = FlexibleTycon structure Status = Status structure TyconMap = TyconMap end structure Status = struct open Status val class = fn Con => Class.Con | Exn => Class.Exn | Var => Class.Var fun fromVid vid = case vid of Vid.Con _ => Con | Vid.Exn _ => Exn | Vid.Overload _ => Var | Vid.Var _ => Var val kw: t -> string = fn Con => "con" | Exn => "exn" | Var => "val" val pretty: t -> string = fn Con => "constructor" | Exn => "exception" | Var => "variable" end structure Time:> sig type t val >= : t * t -> bool val next: unit -> t end = struct type t = int val layout = Int.layout val op >= : t * t -> bool = op >= val next = Counter.generator 0 val next = Trace.trace ("ElaborateEnv.Time.next", Unit.layout, layout) next end structure Info = struct (* The array is sorted by domain element. *) datatype ('a, 'b) t = T of {domain: 'a, range: 'b, time: Time.t, uses: 'a Uses.t} array fun layout (layoutDomain, layoutRange) (T a) = Array.layout (fn {domain, range, ...} => Layout.tuple [layoutDomain domain, layoutRange range]) a fun isEmpty (T a) = Array.isEmpty a fun foreach (T a, f) = Array.foreach (a, fn {domain, range, ...} => f (domain, range)) fun foreachByTime (T a, f) = let val a = Array.copy a val _ = QuickSort.sortArray (a, fn ({time = t, ...}, {time = t', ...}) => Time.>= (t, t')) in foreach (T a, f) end fun peek (T a, domain: 'a, toSymbol: 'a -> Symbol.t) = Option.map (BinarySearch.search (a, fn {domain = d, ...} => Symbol.compare (toSymbol domain, toSymbol d)), fn i => Array.sub (a, i)) fun keepAll (T a, f) = T (Array.keepAll (a, f)) val map: ('a, 'b) t * ('b -> 'b) -> ('a, 'b) t = fn (T a, f) => T (Array.map (a, fn {domain, range, time, uses} => {domain = domain, range = f range, time = time, uses = uses})) val map2: ('a, 'b) t * ('a, 'b) t * ('b * 'b -> 'b) -> ('a, 'b) t = fn (T a, T a', f) => T (Array.map2 (a, a', fn ({domain, range = r, time, uses}, {range = r', ...}) => {domain = domain, range = f (r, r'), time = time, uses = uses})) end fun foreach2Sorted (abs: ('a * 'b) array, info: ('a, 'c) Info.t, equals: ('a * 'a -> bool), f: ('a * 'b * (int * 'c) option -> unit)): unit = let val Info.T acs = info val _ = Array.fold (abs, 0, fn ((a, b), i) => let fun find j = if j = Array.length acs then (i, NONE) else let val {domain = a', range = c, ...} = Array.sub (acs, j) in if equals (a, a') then (j + 1, SOME (j, c)) else find (j + 1) end val (i, co) = find i val () = f (a, b, co) in i end) in () end (* ------------------------------------------------- *) (* Structure *) (* ------------------------------------------------- *) structure Structure = struct datatype t = T of {interface: Interface.t option, plist: PropertyList.t, strs: (Ast.Strid.t, t) Info.t, types: (Ast.Tycon.t, TypeStr.t) Info.t, vals: (Ast.Vid.t, Vid.t * Scheme.t) Info.t} val ffi: t option ref = ref NONE local fun make f (T r) = f r in val interface = make #interface val plist = make #plist end fun layout (T {interface, strs, vals, types, ...}) = Layout.record [("interface", Option.layout Interface.layout interface), ("types", Info.layout (Ast.Tycon.layout, TypeStr.layout) types), ("vals", (Info.layout (Ast.Vid.layout, Layout.tuple2 (Vid.layout, Scheme.layout)) vals)), ("strs", Info.layout (Strid.layout, layout) strs)] fun eq (s: t, s': t): bool = PropertyList.equals (plist s, plist s') (* ------------------------------------------------- *) (* peek *) (* ------------------------------------------------- *) local fun make (field, toSymbol) (T fields, domain) = Option.map (Info.peek (field fields, domain, toSymbol), fn v as {uses, ...} => (Uses.add (uses, domain); v)) in val peekStrid' = make (#strs, Ast.Strid.toSymbol) val peekVid' = make (#vals, Ast.Vid.toSymbol) val peekTycon' = make (#types, Ast.Tycon.toSymbol) end fun peekStrid z = Option.map (peekStrid' z, #range) fun peekTycon z = Option.map (peekTycon' z, #range) fun peekVid z = Option.map (peekVid' z, #range) local fun make (from, de) (S, x) = case peekVid (S, from x) of NONE => NONE | SOME (vid, s) => Option.map (de vid, fn z => (z, s)) in val peekCon = make (Ast.Vid.fromCon, Vid.deCon) val peekExn = make (Ast.Vid.fromCon, Vid.deExn) val peekVar = make (Ast.Vid.fromVar, Vid.deVar) end structure PeekResult = struct datatype 'a t = Found of 'a | UndefinedStructure of Strid.t list end fun peekStrids (S, strids) = let fun loop (S, strids, ac) = case strids of [] => PeekResult.Found S | strid :: strids => case peekStrid (S, strid) of NONE => PeekResult.UndefinedStructure (rev (strid :: ac)) | SOME S => loop (S, strids, strid :: ac) in loop (S, strids, []) end (* ------------------------------------------------- *) (* layoutPretty *) (* ------------------------------------------------- *) fun layouts {interfaceSigid, layoutPrettyTycon, setLayoutPrettyTycon} = let val elide = {strs = NONE, types = NONE, vals = NONE} val flexTyconMap = TyconMap.empty () val {destroy, destroyLayoutPrettyType, destroyLayoutPrettyTyvar, layoutPrettyScheme, layoutPrettyType, layoutPrettyTyvar, layoutSigDefn, layoutSigFlex, layoutSigRlz, layoutStrSpec, layoutTypeSpec, layoutValSpec, ...} = Interface.layouts {interfaceSigid = interfaceSigid, layoutPrettyTycon = layoutPrettyTycon, setLayoutPrettyTycon = setLayoutPrettyTycon} fun layoutTypeDefn (strids, name, strStr, {compact, def}) = layoutTypeSpec (strids, name, Interface.TypeStr.fromEnv strStr, {compact = compact, def = def, flexTyconMap = flexTyconMap}) fun layoutValDefn (strids, name, (strVid, strScheme), {compact, con, def}) = layoutValSpec (strids, name, (Status.fromVid strVid, Interface.Scheme.fromEnv strScheme), {compact = compact, con = con, def = def}) local fun toInterface (T {interface, strs, types, vals, ...}) = case interface of NONE => let fun doit (Info.T a, f) = Array.map (a, f) val types = doit (types, fn {domain = name, range = strStr, ...} => (name, Interface.TypeStr.fromEnv strStr)) val vals = doit (vals, fn {domain = name, range = (strVid, strScheme), ...} => (name, (Status.fromVid strVid, Interface.Scheme.fromEnv strScheme))) val strs = doit (strs, fn {domain = name, range = S, ...} => (name, toInterface S)) in Interface.new {isClosed = true, original = NONE, strs = strs, types = types, vals = vals} end | SOME I => I in fun layoutStrDefn (strids, name, S, {compact, def}) = layoutStrSpec (strids, name, toInterface S, {compact = compact, def = def, elide = elide, flexTyconMap = flexTyconMap}) fun layoutStr (S, {compact}) = layoutSigRlz (toInterface S, {compact = compact, elide = elide, flexTyconMap = flexTyconMap}) end in {destroy = destroy, destroyLayoutPrettyType = destroyLayoutPrettyType, destroyLayoutPrettyTyvar = destroyLayoutPrettyTyvar, layoutPrettyScheme = layoutPrettyScheme, layoutPrettyType = layoutPrettyType, layoutPrettyTyvar = layoutPrettyTyvar, layoutSigDefn = layoutSigDefn, layoutSigFlex = layoutSigFlex, layoutSigRlz = layoutSigRlz, layoutStr = layoutStr, layoutStrDefn = layoutStrDefn, layoutStrSpec = layoutStrSpec, layoutTypeDefn = layoutTypeDefn, layoutTypeSpec = layoutTypeSpec, layoutValDefn = layoutValDefn, layoutValSpec = layoutValSpec} end fun layoutPretty S = let val {destroy, layoutStr, ...} = layouts {interfaceSigid = fn _ => NONE, layoutPrettyTycon = Tycon.layoutPrettyDefault, setLayoutPrettyTycon = fn _ => ()} val res = #full (layoutStr (S, {compact = false})) () val () = destroy () in res end (* ------------------------------------------------- *) (* forceUsed *) (* ------------------------------------------------- *) local datatype handleUses = Clear | Force fun make handleUses = let fun loop (T f) = let fun doit (sel, forceRange) = let val Info.T a = sel f in Array.foreach (a, fn {range, uses, ...} => let val _ = case handleUses of Clear => Uses.clear uses | Force => Uses.forceUsed uses val _ = forceRange range in () end) end val _ = doit (#strs, loop) val _ = doit (#types, ignore) val _ = doit (#vals, ignore) in () end in loop end in val forceUsed = make Force end (* ------------------------------------------------- *) (* realize *) (* ------------------------------------------------- *) fun realize (S: t, tm: 'a TyconMap.t, f: (Ast.Tycon.t * 'a * TypeStr.t option * {nest: Strid.t list}) -> unit): unit = let fun allNone (TyconMap.T {strs, types}, nest) = (Array.foreach (strs, fn (name, tm) => allNone (tm, name :: nest)) ; Array.foreach (types, fn (name, flex) => f (name, flex, NONE, {nest = nest}))) fun loop (TyconMap.T {strs, types}, T {strs = strs', types = types', ...}, nest: Strid.t list) = let val () = foreach2Sorted (strs, strs', Ast.Strid.equals, fn (name, tm, S) => case S of NONE => allNone (tm, name :: nest) | SOME (_, S) => loop (tm, S, name :: nest)) val () = foreach2Sorted (types, types', Ast.Tycon.equals, fn (name, flex, opt) => f (name, flex, Option.map (opt, #2), {nest = nest})) in () end in loop (tm, S, []) end (* ------------------------------------------------- *) (* dummy *) (* ------------------------------------------------- *) fun dummy (I: Interface.t, {prefix: string}) : t * (t * (Tycon.t * TypeStr.t -> unit) -> unit) = let val time = Time.next () val I = Interface.copy I fun realizeLoop (TyconMap.T {strs, types}, strids) = let val strs = Array.map (strs, fn (name, tm) => (name, realizeLoop (tm, name :: strids))) val types = Array.map (types, fn (name, flex) => let val c = FlexibleTycon.dummyTycon (flex, name, strids, {prefix = prefix}) val () = FlexibleTycon.realize (flex, TypeStr.tycon c) in (name, c) end) in TyconMap.T {strs = strs, types = types} end val flexible = realizeLoop (Interface.flexibleTycons I, []) val {get, ...} = Property.get (Interface.plist, Property.initRec (fn (I, get) => let val {strs, types, vals} = Interface.dest I val strs = Array.map (strs, fn (name, I) => {domain = name, range = get I, time = time, uses = Uses.new ()}) val types = Array.map (types, fn (name, s) => {domain = name, range = Interface.TypeStr.toEnv s, time = time, uses = Uses.new ()}) val vals = Array.map (vals, fn (name, (status, scheme)) => let val con = CoreML.Con.newString o Ast.Vid.toString val var = CoreML.Var.newString o Ast.Vid.toString val vid = case status of Status.Con => Vid.Con (con name) | Status.Exn => Vid.Exn (con name) | Status.Var => Vid.Var (var name) in {domain = name, range = (vid, Interface.Scheme.toEnv scheme), time = time, uses = Uses.new ()} end) in T {interface = SOME I, plist = PropertyList.new (), strs = Info.T strs, types = Info.T types, vals = Info.T vals} end)) val S = get I fun instantiate (S, f) = realize (S, flexible, fn (_, c, so, _) => case so of NONE => Error.bug "ElaborateEnv.Structure.dummy.instantiate" | SOME s => f (c, s)) in (S, instantiate) end val dummy = Trace.trace ("ElaborateEnv.Structure.dummy", Interface.layoutPretty o #1, layoutPretty o #1) dummy end (* ------------------------------------------------- *) (* FunctorClosure *) (* ------------------------------------------------- *) structure FunctorClosure = struct datatype t = T of {apply: Structure.t * string list -> Decs.t * Structure.t option, argInterface: Interface.t, resultStructure: Structure.t option, summary: Structure.t -> Structure.t option} local fun make f (T r) = f r in val argInterface = make #argInterface end fun layout _ = Layout.str "" fun apply (T {apply, ...}, S, nest) = apply (S, nest) val apply = Trace.trace3 ("ElaborateEnv.FunctorClosure.apply", layout, Structure.layout, List.layout String.layout, (Option.layout Structure.layout) o #2) apply fun forceUsed (T {resultStructure, ...}) = Option.app (resultStructure, Structure.forceUsed) end (* ------------------------------------------------- *) (* Basis *) (* ------------------------------------------------- *) structure Basis = struct datatype t = T of {plist: PropertyList.t, bass: (Ast.Basid.t, t) Info.t, fcts: (Ast.Fctid.t, FunctorClosure.t) Info.t, fixs: (Ast.Vid.t, Ast.Fixity.t) Info.t, sigs: (Ast.Sigid.t, Interface.t) Info.t, strs: (Ast.Strid.t, Structure.t) Info.t, types: (Ast.Tycon.t, TypeStr.t) Info.t, vals: (Ast.Vid.t, Vid.t * Scheme.t) Info.t} fun layout (T {bass, fcts, sigs, strs, types, vals, ...}) = Layout.record [("bass", Info.layout (Ast.Basid.layout, layout) bass), ("fcts", Info.layout (Ast.Fctid.layout, FunctorClosure.layout) fcts), ("sigs", Info.layout (Ast.Sigid.layout, Interface.layout) sigs), ("strs", Info.layout (Ast.Strid.layout, Structure.layout) strs), ("types", Info.layout (Ast.Tycon.layout, TypeStr.layout) types), ("vals", (Info.layout (Ast.Vid.layout, Layout.tuple2 (Vid.layout, Scheme.layout)) vals))] end (* ------------------------------------------------- *) (* NameSpace *) (* ------------------------------------------------- *) structure Values = struct type ('a, 'b) value = {domain: 'a, range: 'b, scope: Scope.t, time: Time.t, uses: 'a Uses.t} (* The domains of all elements in a values list have the same symbol. *) datatype ('a, 'b) t = T of ('a, 'b) value list ref fun new (): ('a, 'b) t = T (ref []) fun ! (T r) = Ref.! r fun pop (T r) = List.pop r end structure NameSpace = struct datatype ('a, 'b) t = T of {class: 'b -> Class.t, current: ('a, 'b) Values.t list ref, defUses: {class: Class.t, def: 'a, range: 'b option, uses: 'a Uses.t} list ref option, lookup: 'a -> ('a, 'b) Values.t, region: 'a -> Region.t, toSymbol: 'a -> Symbol.t} fun values (T {lookup, ...}, a) = lookup a (* ------------------------------------------------- *) (* empty *) (* ------------------------------------------------- *) fun empty {class, defUses, lookup, region, toSymbol} = T {class = class, current = ref [], defUses = if defUses then SOME (ref []) else NONE, lookup = lookup, region = region, toSymbol = toSymbol} (* ------------------------------------------------- *) (* newUses *) (* ------------------------------------------------- *) fun newUses (T {class, defUses, ...}, {def, forceUsed, range}) = let val u = Uses.new () val _ = if not (warnUnused ()) orelse forceUsed then Uses.forceUsed u else () val _ = case defUses of NONE => () | SOME defUses => let val class = class range val range = if isSome (!Control.showDefUse) andalso (class = Class.Var orelse class = Class.Exn orelse class = Class.Con) then SOME range else NONE in List.push (defUses, {class = class, def = def, range = range, uses = u}) end in u end (* ------------------------------------------------- *) (* peek *) (* ------------------------------------------------- *) fun ('a, 'b) peek (ns, a: 'a, {markUse: 'b -> bool}) : 'b option = case Values.! (values (ns, a)) of [] => NONE | {range, uses, ...} :: _ => (if markUse range then Uses.add (uses, a) else () ; SOME range) (* ------------------------------------------------- *) (* extend *) (* ------------------------------------------------- *) fun extend (ns as T {current, lookup, ...}, {domain, forceUsed, range, scope, time, uses}) = let val newUses = fn () => newUses (ns, {def = domain, range = range, forceUsed = forceUsed}) val values as Values.T r = lookup domain fun make uses = {domain = domain, range = range, scope = scope, time = time, uses = uses} fun new () = let val _ = List.push (current, values) val uses = case uses {rebind = NONE} of NONE => newUses () | SOME u => u in make uses end in case !r of [] => r := [new ()] | all as ({domain = domain', scope = scope', uses = uses', ...} :: rest) => if Scope.equals (scope, scope') then let val rebind = SOME {domain = domain', uses = uses'} val uses = case uses {rebind = rebind} of NONE => newUses () | SOME u => u in r := (make uses) :: rest end else r := new () :: all end (* ------------------------------------------------- *) (* scope *) (* ------------------------------------------------- *) fun scope (T {current, ...}: ('a, 'b) t) : unit -> unit = let val old = !current val _ = current := [] in fn () => let val c = !current val _ = List.foreach (c, ignore o Values.pop) val _ = current := old in () end end (* ------------------------------------------------- *) (* local *) (* ------------------------------------------------- *) fun locall (T {current, ...}: ('a, 'b) t) = let val old = !current val _ = current := [] in fn () => let val c1 = !current val _ = current := [] in fn () => let val c2 = !current val elts = List.revMap (c2, fn values => let val {domain, range, time, uses, ...} = Values.pop values in {domain = domain, range = range, time = time, uses = uses} end) val _ = List.foreach (c1, ignore o Values.pop) val _ = current := old in elts end end end (* ------------------------------------------------- *) (* collect *) (* ------------------------------------------------- *) fun collect (T {current, toSymbol, ...}: ('a, 'b) t) : unit -> ('a, 'b) Info.t = let val old = !current val _ = current := [] in fn () => let val elts = List.revMap (!current, fn values => let val {domain, range, time, uses, ...} = Values.pop values in {domain = domain, range = range, time = time, uses = uses} end) val _ = current := old val a = Array.fromList elts val () = QuickSort.sortArray (a, fn ({domain = d, ...}, {domain = d', ...}) => Symbol.<= (toSymbol d, toSymbol d')) in Info.T a end end end (* ------------------------------------------------- *) (* Main Env Datatype *) (* ------------------------------------------------- *) structure All = struct datatype t = Bas of (Basid.t, Basis.t) Values.t | Fct of (Fctid.t, FunctorClosure.t) Values.t | Fix of (Ast.Vid.t, Ast.Fixity.t) Values.t | IfcStr of (Strid.t, Interface.t) Values.t | IfcTyc of (Ast.Tycon.t, Interface.TypeStr.t) Values.t | IfcVal of (Ast.Vid.t, Interface.Status.t * Interface.Scheme.t) Values.t | Sig of (Sigid.t, Interface.t) Values.t | Str of (Strid.t, Structure.t) Values.t | Tyc of (Ast.Tycon.t, TypeStr.t) Values.t | Val of (Ast.Vid.t, Vid.t * Scheme.t) Values.t val basOpt = fn Bas z => SOME z | _ => NONE val fctOpt = fn Fct z => SOME z | _ => NONE val fixOpt = fn Fix z => SOME z | _ => NONE val ifcStrOpt = fn IfcStr z => SOME z | _ => NONE val ifcTycOpt = fn IfcTyc z => SOME z | _ => NONE val ifcValOpt = fn IfcVal z => SOME z | _ => NONE val sigOpt = fn Sig z => SOME z | _ => NONE val strOpt = fn Str z => SOME z | _ => NONE val tycOpt = fn Tyc z => SOME z | _ => NONE val valOpt = fn Val z => SOME z | _ => NONE end datatype t = T of {currentScope: Scope.t ref, bass: (Ast.Basid.t, Basis.t) NameSpace.t, fcts: (Ast.Fctid.t, FunctorClosure.t) NameSpace.t, fixs: (Ast.Vid.t, Ast.Fixity.t) NameSpace.t, interface: {strs: (Ast.Strid.t, Interface.t) NameSpace.t, types: (Ast.Tycon.t, Interface.TypeStr.t) NameSpace.t, vals: (Ast.Vid.t, Interface.Status.t * Interface.Scheme.t) NameSpace.t}, lookup: Symbol.t -> All.t list ref, sigs: (Ast.Sigid.t, Interface.t) NameSpace.t, strs: (Ast.Strid.t, Structure.t) NameSpace.t, types: (Ast.Tycon.t, TypeStr.t) NameSpace.t, vals: (Ast.Vid.t, Vid.t * Scheme.t) NameSpace.t} fun sizeMessage (E: t): Layout.t = let open Layout in record [("total", IntInf.layout (MLton.size E))] end (* quell unused warning *) val _ = sizeMessage (* ------------------------------------------------- *) (* empty *) (* ------------------------------------------------- *) fun empty () = let val {get = lookupAll: Symbol.t -> All.t list ref, ...} = Property.get (Symbol.plist, Property.initFun (fn _ => ref [])) fun ('a, 'b) make (class: 'b -> Class.t, region: 'a -> Region.t, toSymbol: 'a -> Symbol.t, defUses: bool, extract: All.t -> ('a, 'b) Values.t option, make: ('a, 'b) Values.t -> All.t) : ('a, 'b) NameSpace.t = let fun lookup (a: 'a): ('a, 'b) Values.t = let val r = lookupAll (toSymbol a) in case List.peekMap (!r, extract) of NONE => let val v = Values.new () val _ = List.push (r, make v) in v end | SOME v => v end in NameSpace.empty {class = class, defUses = defUses, lookup = lookup, region = region, toSymbol = toSymbol} end val bass = make (fn _ => Class.Bas, Basid.region, Basid.toSymbol, false, All.basOpt, All.Bas) val fcts = make (fn _ => Class.Fct, Fctid.region, Fctid.toSymbol, !Control.keepDefUse, All.fctOpt, All.Fct) val fixs = make (fn _ => Class.Fix, Ast.Vid.region, Ast.Vid.toSymbol, false, All.fixOpt, All.Fix) val sigs = make (fn _ => Class.Sig, Sigid.region, Sigid.toSymbol, !Control.keepDefUse, All.sigOpt, All.Sig) val strs = make (fn _ => Class.Str, Strid.region, Strid.toSymbol, !Control.keepDefUse, All.strOpt, All.Str) val types = make (fn _ => Class.Typ, Ast.Tycon.region, Ast.Tycon.toSymbol, !Control.keepDefUse, All.tycOpt, All.Tyc) val vals = make (Vid.class o #1, Ast.Vid.region, Ast.Vid.toSymbol, !Control.keepDefUse, All.valOpt, All.Val) local val strs = make (fn _ => Class.Str, Strid.region, Strid.toSymbol, false, All.ifcStrOpt, All.IfcStr) val types = make (fn _ => Class.Typ, Ast.Tycon.region, Ast.Tycon.toSymbol, false, All.ifcTycOpt, All.IfcTyc) val vals = make (Status.class o #1, Ast.Vid.region, Ast.Vid.toSymbol, false, All.ifcValOpt, All.IfcVal) in val interface = {strs = strs, types = types, vals = vals} end in T {currentScope = ref (Scope.new ()), bass = bass, fcts = fcts, fixs = fixs, interface = interface, lookup = lookupAll, sigs = sigs, strs = strs, types = types, vals = vals} end (* ------------------------------------------------- *) (* foreach *) (* ------------------------------------------------- *) local fun foreach (T {lookup, ...}, s, {bass, fcts, fixs, interface = {strs = ifcStrs, types = ifcTypes, vals = ifcVals}, sigs, strs, types, vals}) = List.foreach (! (lookup s), fn a => let datatype z = datatype All.t in case a of Bas vs => bass vs | Fct vs => fcts vs | Fix vs => fixs vs | IfcStr vs => ifcStrs vs | IfcTyc vs => ifcTypes vs | IfcVal vs => ifcVals vs | Sig vs => sigs vs | Str vs => strs vs | Tyc vs => types vs | Val vs => vals vs end) in fun foreachDefinedSymbol (E, z) = Symbol.foreach (fn s => foreach (E, s, z)) end (* ------------------------------------------------- *) (* current *) (* ------------------------------------------------- *) fun current (E, keep: {hasUse: bool, scope: Scope.t} -> bool) = let val bass = ref [] val fcts = ref [] val ifcStrs = ref [] val ifcTypes = ref [] val ifcVals = ref [] val sigs = ref [] val strs = ref [] val types = ref [] val vals = ref [] fun doit ac vs = case Values.! vs of [] => () | (z as {scope, uses, ...}) :: _ => if keep {hasUse = Uses.hasUse uses, scope = scope} then List.push (ac, z) else () val _ = foreachDefinedSymbol (E, {bass = doit bass, fcts = doit fcts, fixs = fn _ => (), interface = {strs = doit ifcStrs, types = doit ifcTypes, vals = doit ifcVals}, sigs = doit sigs, strs = doit strs, types = doit types, vals = doit vals}) fun ('a, 'b) finish (r: ('a, 'b) Values.value list ref, toSymbol: 'a -> Symbol.t) () = let val a = Array.fromListMap (!r, fn {domain, range, time, uses, ...} => {domain = domain, range = range, time = time, uses = uses}) val () = QuickSort.sortArray (a, fn ({domain = d, ...}, {domain = d', ...}) => Symbol.<= (toSymbol d, toSymbol d')) in Info.T a end in {bass = finish (bass, Basid.toSymbol), fcts = finish (fcts, Fctid.toSymbol), interface = {strs = finish (ifcStrs, Strid.toSymbol), types = finish (ifcTypes, Ast.Tycon.toSymbol), vals = finish (ifcVals, Ast.Vid.toSymbol)}, sigs = finish (sigs, Sigid.toSymbol), strs = finish (strs, Strid.toSymbol), types = finish (types, Ast.Tycon.toSymbol), vals = finish (vals, Ast.Vid.toSymbol)} end (* ------------------------------------------------- *) (* snapshot *) (* ------------------------------------------------- *) fun snapshot (E as T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}) : (unit -> 'a) -> 'a = let val add: (Scope.t -> unit) list ref = ref [] (* Push onto add everything currently in scope. *) fun doit (NameSpace.T {current, ...}) (v as Values.T vs) = case ! vs of [] => () | {domain, range, uses, ...} :: _ => List.push (add, fn s0 => (List.push (vs, {domain = domain, range = range, scope = s0, time = Time.next (), uses = uses}) ; List.push (current, v))) val _ = foreachDefinedSymbol (E, {bass = doit bass, fcts = doit fcts, fixs = doit fixs, interface = {strs = ignore, types = ignore, vals = ignore}, sigs = doit sigs, strs = doit strs, types = doit types, vals = doit vals}) in fn th => let val s0 = Scope.new () val restore: (unit -> unit) list ref = ref [] fun doit (NameSpace.T {current, ...}) = let val current0 = !current val _ = current := [] in List.push (restore, fn () => (List.foreach (!current, fn v => ignore (Values.pop v)) ; current := current0)) end val _ = (doit bass; doit fcts; doit fixs; doit sigs ; doit strs; doit types; doit vals) val _ = List.foreach (!add, fn f => f s0) (* Clear out any symbols that weren't available in the old scope. *) fun doit (Values.T vs) = let val cur = !vs in case cur of [] => () | {scope, ...} :: _ => if Scope.equals (s0, scope) then () else (vs := [] ; List.push (restore, fn () => vs := cur)) end val _ = (* Can't use foreachToplevelSymbol here, because a constructor C may * have been defined in a local scope but may not have been defined * at the snapshot point. This will make the identifier C, which * originally would have elaborated as a variable instead elaborate * as a constructor. *) foreachDefinedSymbol (E, {bass = doit, fcts = doit, fixs = doit, interface = {strs = ignore, types = ignore, vals = ignore}, sigs = doit, strs = doit, types = doit, vals = doit}) val s1 = !currentScope val _ = currentScope := s0 val res = th () val _ = currentScope := s1 val _ = List.foreach (!restore, fn f => f ()) in res end end (* ------------------------------------------------- *) (* peek *) (* ------------------------------------------------- *) local fun make sel (T r, a) = NameSpace.peek (sel r, a, {markUse = fn _ => true}) in val peekBasid = make #bass val peekFctid = make #fcts val peekFix = make #fixs val peekIfcStrid = make (#strs o #interface) val peekIfcTycon= make (#types o #interface) val peekSigid = make #sigs val peekStrid = make #strs val peekTycon = make #types val peekVid = make #vals fun peekVar (E, x) = case peekVid (E, Ast.Vid.fromVar x) of NONE => NONE | SOME (vid, s) => Option.map (Vid.deVar vid, fn x => (x, s)) end fun peekCon (T {vals, ...}, c: Ast.Con.t): (Con.t * Scheme.t) option = case NameSpace.peek (vals, Ast.Vid.fromCon c, {markUse = fn (vid, _) => isSome (Vid.deCon vid)}) of NONE => NONE | SOME (vid, s) => Option.map (Vid.deCon vid, fn c => (c, s)) fun peekExn (T {vals, ...}, c: Ast.Con.t): (Con.t * Scheme.t) option = case NameSpace.peek (vals, Ast.Vid.fromCon c, {markUse = fn (vid, _) => isSome (Vid.deExn vid)}) of NONE => NONE | SOME (vid, s) => Option.map (Vid.deExn vid, fn c => (c, s)) structure PeekResult = struct datatype 'a t = Found of 'a | UndefinedStructure of Strid.t list | Undefined val toOption: 'a t -> 'a option = fn Found z => SOME z | _ => NONE end local fun make (split: 'a -> Strid.t list * 'b, peek: t * 'b -> 'c option, strPeek: Structure.t * 'b -> 'c option) (E, x) = let val (strids, x) = split x in case strids of [] => (case peek (E, x) of NONE => PeekResult.Undefined | SOME z => PeekResult.Found z) | strid :: strids => case peekStrid (E, strid) of NONE => PeekResult.UndefinedStructure [strid] | SOME S => case Structure.peekStrids (S, strids) of Structure.PeekResult.Found S => (case strPeek (S, x) of NONE => PeekResult.Undefined | SOME z => PeekResult.Found z) | Structure.PeekResult.UndefinedStructure ss => PeekResult.UndefinedStructure (strid :: ss) end in val peekLongstrid = make (Ast.Longstrid.split, peekStrid, Structure.peekStrid) val peekLongtycon = make (Longtycon.split, peekTycon, Structure.peekTycon) val peekLongvar = make (Ast.Longvar.split, peekVar, Structure.peekVar) val peekLongvid = make (Ast.Longvid.split, peekVid, Structure.peekVid) val peekLongcon = make (Ast.Longcon.split, peekCon, Structure.peekCon) val peekLongexn = make (Ast.Longcon.split, peekExn, Structure.peekExn) end (* ------------------------------------------------- *) (* lookup *) (* ------------------------------------------------- *) fun unbound (r: Region.t, className, x: Layout.t): unit = Control.error (r, seq [str "undefined ", str className, str ": ", x], Layout.empty) fun lookupBasid (E, x) = case peekBasid (E, x) of NONE => (unbound (Ast.Basid.region x, "basis", Ast.Basid.layout x) ; NONE) | SOME f => SOME f fun lookupFctid (E, x) = case peekFctid (E, x) of NONE => (unbound (Ast.Fctid.region x, "functor", Ast.Fctid.layout x) ; NONE) | SOME f => SOME f fun lookupSigid (E, x) = case peekSigid (E, x) of NONE => (unbound (Ast.Sigid.region x, "signature", Ast.Sigid.layout x) ; NONE) | SOME I => SOME I fun lookupStrid (E, x) = case peekStrid (E, x) of NONE => (unbound (Ast.Strid.region x, "structure", Ast.Strid.layout x) ; NONE) | SOME S => SOME S local fun make (peek: t * 'a -> 'b PeekResult.t, className: string, region: 'a -> Region.t, layout: 'a -> Layout.t) (E: t, x: 'a): 'b option = let datatype z = datatype PeekResult.t in case peek (E, x) of Found z => SOME z | UndefinedStructure ss => (unbound (region x, "structure", layoutStrids ss); NONE) | Undefined => (unbound (region x, className, layout x); NONE) end in val lookupLongcon = make (peekLongcon, "constructor", Ast.Longcon.region, Ast.Longcon.layout) val lookupLongexn = make (peekLongexn, "exception", Ast.Longcon.region, Ast.Longcon.layout) val lookupLongstrid = make (peekLongstrid, "structure", Ast.Longstrid.region, Ast.Longstrid.layout) val lookupLongtycon = make (peekLongtycon, "type", Ast.Longtycon.region, Ast.Longtycon.layout) val lookupLongvid = make (peekLongvid, "variable", Ast.Longvid.region, Ast.Longvid.layout) val lookupLongvar = make (peekLongvar, "variable", Ast.Longvar.region, Ast.Longvar.layout) end val peekLongcon = PeekResult.toOption o peekLongcon (* ------------------------------------------------- *) (* extend *) (* ------------------------------------------------- *) local fun extend (T (r as {currentScope, ...}), sel, domain: 'a, range: 'b, forceUsed: bool, uses) = NameSpace.extend (sel r, {domain = domain, forceUsed = forceUsed, range = range, scope = !currentScope, time = Time.next (), uses = uses}) in fun extendBasid (E, d, r) = extend (E, #bass, d, r, false, Uses.Extend.new) fun extendFctid (E, d, r) = extend (E, #fcts, d, r, false, Uses.Extend.new) fun extendFix (E, d, r) = extend (E, #fixs, d, r, false, Uses.Extend.new) fun extendSigid (E, d, r) = extend (E, #sigs, d, r, false, Uses.Extend.new) fun extendStrid (E, d, r) = extend (E, #strs, d, r, false, Uses.Extend.new) fun extendVals (E, d, r, eu) = extend (E, #vals, d, r, false, eu) fun extendTycon (E, d, s, {forceUsed, isRebind}) = let val () = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons, ...} => Vector.foreach (Cons.dest cons, fn {con, name, scheme, uses} => extendVals (E, Ast.Vid.fromCon name, (Vid.Con con, scheme), Uses.Extend.old uses)) | _ => () end val _ = extend (E, #types, d, s, forceUsed, Uses.Extend.fromIsRebind {isRebind = isRebind}) in () end end fun extendExn (E, c, c', s) = extendVals (E, Ast.Vid.fromCon c, (Vid.Exn c', s), Uses.Extend.new) fun extendVar (E, x, x', s, ir) = extendVals (E, Ast.Vid.fromVar x, (Vid.Var x', s), Uses.Extend.fromIsRebind ir) val extendVar = Trace.trace ("ElaborateEnv.extendVar", fn (_, x, x', s, _) => Layout.tuple [Ast.Var.layout x, Var.layout x', Scheme.layout s], Unit.layout) extendVar fun extendOverload (E, p, x, yts, s) = extendVals (E, Ast.Vid.fromVar x, (Vid.Overload (p, yts), s), Uses.Extend.new) (* ------------------------------------------------- *) (* scope *) (* ------------------------------------------------- *) fun scopeAll (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, th) = let val b = NameSpace.scope bass val fc = NameSpace.scope fcts val f = NameSpace.scope fixs val si = NameSpace.scope sigs val s = NameSpace.scope strs val t = NameSpace.scope types val v = NameSpace.scope vals val s0 = !currentScope val _ = currentScope := Scope.new () val res = th () val _ = (b (); fc (); f (); si (); s (); t (); v ()) val _ = currentScope := s0 in res end fun scope (T {currentScope, fixs, strs, types, vals, ...}, th) = let val f = NameSpace.scope fixs val s = NameSpace.scope strs val t = NameSpace.scope types val v = NameSpace.scope vals val s0 = !currentScope val _ = currentScope := Scope.new () val res = th () val _ = (f (); s (); t (); v ()) val _ = currentScope := s0 in res end (* ------------------------------------------------- *) (* local *) (* ------------------------------------------------- *) local fun locall (ns, s0) = let val f = NameSpace.locall ns in fn () => let val f = f () in fn () => let val elts = f () val _ = List.foreach (elts, fn {domain, range, time, uses} => NameSpace.extend (ns, {domain = domain, forceUsed = false, range = range, scope = s0, time = time, uses = Uses.Extend.old uses})) in () end end end in fun localAll (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, f1, f2) = let val s0 = !currentScope val bass = locall (bass, s0) val fcts = locall (fcts, s0) val fixs = locall (fixs, s0) val sigs = locall (sigs, s0) val strs = locall (strs, s0) val types = locall (types, s0) val vals = locall (vals, s0) val _ = currentScope := Scope.new () val a1 = f1 () val bass = bass () val fcts = fcts () val fixs = fixs () val sigs = sigs () val strs = strs () val types = types () val vals = vals () val _ = currentScope := Scope.new () val a2 = f2 a1 val _ = (bass (); fcts (); fixs (); sigs (); strs (); types (); vals ()) val _ = currentScope := s0 in a2 end fun localModule (T {currentScope, fixs, strs, types, vals, ...}, f1, f2) = let val s0 = !currentScope val fixs = locall (fixs, s0) val strs = locall (strs, s0) val types = locall (types, s0) val vals = locall (vals, s0) val _ = currentScope := Scope.new () val a1 = f1 () val fixs = fixs () val strs = strs () val types = types () val vals = vals () val _ = currentScope := Scope.new () val a2 = f2 a1 val _ = (fixs (); strs (); types (); vals ()) val _ = currentScope := s0 in a2 end (* Can't eliminate the use of strs in localCore, because openn still modifies * module level constructs. *) val localCore = localModule end (* ------------------------------------------------- *) (* makeBasis / makeStructure *) (* ------------------------------------------------- *) fun makeBasis (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, make) = let val bass = NameSpace.collect bass val fcts = NameSpace.collect fcts val fixs = NameSpace.collect fixs val sigs = NameSpace.collect sigs val strs = NameSpace.collect strs val types = NameSpace.collect types val vals = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new () val res = make () val B = Basis.T {plist = PropertyList.new (), bass = bass (), fcts = fcts (), fixs = fixs (), sigs = sigs (), strs = strs (), types = types (), vals = vals ()} val _ = currentScope := s0 in (res, B) end fun makeStructure (T {currentScope, fixs, strs, types, vals, ...}, make) = let val f = NameSpace.collect fixs val s = NameSpace.collect strs val t = NameSpace.collect types val v = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new () val res = make () val _ = f () val S = Structure.T {interface = NONE, plist = PropertyList.new (), strs = s (), types = t (), vals = v ()} val _ = currentScope := s0 in (res, S) end (* ------------------------------------------------- *) (* open *) (* ------------------------------------------------- *) local fun openn (ns, Info.T a, s) = Array.foreach (a, fn {domain, range, time, uses} => NameSpace.extend (ns, {domain = domain, forceUsed = false, range = range, scope = s, time = time, uses = Uses.Extend.old uses})) in fun openBasis (T {currentScope, bass, fcts, fixs, sigs, strs, vals, types, ...}, Basis.T {bass = bass', fcts = fcts', fixs = fixs', sigs = sigs', strs = strs', vals = vals', types = types', ...}): unit = let val s0 = !currentScope val _ = openn (bass, bass', s0) val _ = openn (fcts, fcts', s0) val _ = openn (fixs, fixs', s0) val _ = openn (sigs, sigs', s0) val _ = openn (strs, strs', s0) val _ = openn (vals, vals', s0) val _ = openn (types, types', s0) in () end fun openStructure (T {currentScope, strs, vals, types, ...}, Structure.T {strs = strs', vals = vals', types = types', ...}): unit = let val s0 = !currentScope val _ = openn (strs, strs', s0) val _ = openn (vals, vals', s0) val _ = openn (types, types', s0) in () end end (* ------------------------------------------------- *) (* forceUsed *) (* ------------------------------------------------- *) (* Force everything that is currently in scope to be marked as used. *) fun forceUsed E = let fun doit forceRange (Values.T r) = case !r of [] => () | {uses, range, ...} :: _ => (Uses.forceUsed uses ; forceRange range) val _ = foreachDefinedSymbol (E, {bass = doit ignore, fcts = doit FunctorClosure.forceUsed, fixs = doit ignore, interface = {strs = doit ignore, types = doit ignore, vals = doit ignore}, sigs = doit ignore, strs = doit Structure.forceUsed, types = doit ignore, vals = doit ignore}) in () end fun forceUsedLocal (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, th) = let fun doit (forceRange: 'b -> unit, ns as NameSpace.T {current, ...}, s0) = let val old = !current val _ = current := [] in fn () => let val c = !current val lift = List.revMap (c, Values.pop) val _ = current := old val _ = List.foreach (lift, fn {domain, range, time, uses, ...} => (Uses.forceUsed uses ; forceRange range ; NameSpace.extend (ns, {domain = domain, forceUsed = false, range = range, scope = s0, time = time, uses = Uses.Extend.old uses}))) in () end end val s0 = !currentScope val bass = doit (ignore, bass, s0) val fcts = doit (FunctorClosure.forceUsed, fcts, s0) val fixs = doit (ignore, fixs, s0) val sigs = doit (ignore, sigs, s0) val strs = doit (Structure.forceUsed, strs, s0) val types = doit (ignore, types, s0) val vals = doit (ignore, vals, s0) val _ = currentScope := Scope.new () val res = th () val _ = (bass(); fcts (); fixs (); sigs (); strs (); types (); vals ()) val _ = currentScope := s0 in res end (* ------------------------------------------------- *) (* InterfaceEnv *) (* ------------------------------------------------- *) structure InterfaceEnv = struct structure Env = struct val lookupLongtycon = lookupLongtycon val peekIfcStrid = peekIfcStrid val peekIfcTycon = peekIfcTycon val lookupSigid = lookupSigid end local open Interface in structure FlexibleTycon = FlexibleTycon structure Scheme = Scheme structure Status = Status structure TypeStr = TypeStr end type t = t (* ------------------------------------------------- *) (* peek *) (* ------------------------------------------------- *) val peekStrid = Env.peekIfcStrid val peekTycon = Env.peekIfcTycon (* ------------------------------------------------- *) (* lookup *) (* ------------------------------------------------- *) val lookupSigid = Env.lookupSigid fun lookupLongtycon (E: t, long: Longtycon.t): TypeStr.t option = let fun lookupEnv () = Option.map (Env.lookupLongtycon (E, long), TypeStr.fromEnv) val (strids, c) = Longtycon.split long in case strids of [] => (case peekTycon (E, c) of NONE => lookupEnv () | SOME s => SOME s) | s :: ss => case peekStrid (E, s) of NONE => lookupEnv () | SOME I => ((fn opt => Option.map (opt, #2)) o Interface.lookupLongtycon) (I, Longtycon.long (ss, c), Longtycon.region long, {prefix = [s]}) end (* ------------------------------------------------- *) (* extend *) (* ------------------------------------------------- *) datatype z = MustExtend of Region.t | MustRebind fun extend (T {currentScope, interface, ...}, sel, domain, range, kind, must) = NameSpace.extend (sel interface, {domain = domain, forceUsed = true, range = range, scope = !currentScope, time = Time.next (), uses = (case must of MustExtend extendRegion => (fn {rebind} => let val NameSpace.T {region, toSymbol, ...} = sel interface val () = case rebind of SOME {domain = domain', ...} => let open Layout in Control.error (extendRegion, seq [str "duplicate ", str kind, str " specification: ", Symbol.layout (toSymbol domain)], (align o List.map) (if Region.equals (extendRegion, region domain) then [domain'] else [domain', domain], fn d => seq [str "spec at: ", Region.layout (region d)])) end | _ => () in NONE end) | MustRebind => (fn {rebind} => case rebind of NONE => Error.bug "ElaborateEnv.InterfaceEnv.extend: MustRebind" | SOME {uses, ...} => SOME uses))}) fun extendStrid (E, s, I, r) = extend (E, #strs, s, I, "structure", MustExtend r) fun extendTycon (E, c, s, r) = extend (E, #types, c, s, "type", MustExtend r) fun extendVid (E, v, st, s, r) = extend (E, #vals, v, (st, s), "value", MustExtend r) fun rebindTycon (E, c, s) = extend (E, #types, c, s, "type", MustRebind) (* ------------------------------------------------- *) (* makeInterface *) (* ------------------------------------------------- *) fun makeInterface (T {currentScope, interface = {strs, types, vals}, ...}, {isTop}, make) = let val s = NameSpace.collect strs val t = NameSpace.collect types val v = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new () val res = make () val Info.T s = s () val s = Array.map (s, fn {domain, range, ...} => (domain, range)) val Info.T t = t () val t = Array.map (t, fn {domain, range, ...} => (domain, range)) val Info.T v = v () val v = Array.map (v, fn {domain, range = (status, scheme), ...} => (domain, (status, scheme))) val I = Interface.new {isClosed = isTop, original = NONE, strs = s, types = t, vals = v} val _ = currentScope := s0 in (I, res) end (* ------------------------------------------------- *) (* openInterface *) (* ------------------------------------------------- *) fun openInterface (E, I, r: Region.t) = let val {strs, vals, types} = Interface.dest I val _ = Array.foreach (strs, fn (s, I) => extendStrid (E, s, I, r)) val _ = Array.foreach (types, fn (c, s) => extendTycon (E, c, s, r)) val _ = Array.foreach (vals, fn (x, (s, sc)) => extendVid (E, x, s, sc, r)) in () end (* ------------------------------------------------- *) (* extend *) (* ------------------------------------------------- *) val extendStrid = fn (E, s, I) => extendStrid (E, s, I, Strid.region s) val extendTycon = fn (E, c, s) => extendTycon (E, c, s, Ast.Tycon.region c) val extendVid = fn (E, v, st, s) => extendVid (E, v, st, s, Ast.Vid.region v) fun extendCon (E, c, s) = extendVid (E, Ast.Vid.fromCon c, Status.Con, s) fun extendExn (E, c, s) = extendVid (E, Ast.Vid.fromCon c, Status.Exn, s) (* ------------------------------------------------- *) (* makeLayoutPrettyFlexTycon *) (* ------------------------------------------------- *) fun genLayoutPrettyFlexTycon {prefixUnset} = let val {destroy = destroyLayoutPrettyFlexTycon: unit -> unit, get = layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t, set = setLayoutPrettyFlexTycon: FlexibleTycon.t * Layout.t -> unit} = Property.destGetSet (FlexibleTycon.plist, Property.initFun (fn f => let val l = FlexibleTycon.layoutPrettyDefault f in if prefixUnset then seq [str "??.", l] else l end)) fun doFlexTycon (flex, name, strids: Strid.t list) = let val name = layoutLongRev (strids, Ast.Tycon.layout name) in setLayoutPrettyFlexTycon (flex, name) end fun loopFlexTyconMap (TyconMap.T {strs, types}, strids) = let val () = Array.foreach (types, fn (name, flex) => doFlexTycon (flex, name, strids)) val () = Array.foreach (strs, fn (name, flexTyconMap) => loopFlexTyconMap (flexTyconMap, name::strids)) in () end in {destroy = destroyLayoutPrettyFlexTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, loopFlexTyconMap = loopFlexTyconMap} end end val makeInterfaceEnv = fn E => E (* ------------------------------------------------- *) (* makeLayoutPrettyTycon *) (* ------------------------------------------------- *) fun genLayoutPrettyTycon {prefixUnset} = let val {destroy = destroyLayoutPrettyTycon: unit -> unit, get = layoutPrettyTycon: Tycon.t -> Layout.t, set = setLayoutPrettyTycon: Tycon.t * Layout.t -> unit} = Property.destGetSet (Tycon.plist, Property.initFun (fn c => let val l = Tycon.layoutPrettyDefault c in if prefixUnset then seq [str "?.", l] else l end)) val {destroy = destroyTyconShortest, get = tyconShortest: Tycon.t -> (int * int) option ref, ...} = Property.destGet (Tycon.plist, Property.initFun (fn _ => ref NONE)) fun doType (typeStr: TypeStr.t, name: Ast.Tycon.t, priority: int, length: int, strids: Strid.t list): unit = case TypeStr.toTyconOpt typeStr of NONE => () | SOME c => let val r = tyconShortest c fun doit () = let val _ = r := SOME (priority, length) val name = layoutLongRev (strids, Ast.Tycon.layout name) in setLayoutPrettyTycon (c, name) end in case !r of NONE => doit () | SOME (priority', length') => (case Int.compare (priority, priority') of LESS => doit () | EQUAL => if length >= length' then () else doit () | GREATER => ()) end val {destroy = destroyStrShortest, get = strShortest: Structure.t -> (int * int) option ref, ...} = Property.destGet (Structure.plist, Property.initFun (fn _ => ref NONE)) fun loopStr (s as Structure.T {strs, types, ...}, priority: int, length: int, strids: Strid.t list): unit = let val r = strShortest s fun doit () = let val _ = r := SOME (priority, length) (* Process the declarations in decreasing order of * definition time so that later declarations will be * processed first, and hence will take precedence. *) val _ = Info.foreachByTime (types, fn (name, typeStr) => doType (typeStr, name, priority, length, strids)) val _ = Info.foreachByTime (strs, fn (strid, str) => loopStr (str, priority, 1 + length, strid::strids)) in () end in case !r of NONE => doit () | SOME (priority', length') => (case Int.compare (priority, priority') of LESS => doit () | EQUAL => if length >= length' then () else doit () | GREATER => ()) end fun loopFlexTyconMap (tm: FlexibleTycon.t TyconMap.t, priority, length: int, strids: Strid.t list): unit = let val TyconMap.T {strs, types} = tm val _ = Array.foreach (types, fn (name, flex) => doType (FlexibleTycon.toEnv flex, name, priority, length, strids)) val _ = Array.foreach (strs, fn (strid, tm) => loopFlexTyconMap (tm, priority, 1 + length, strid::strids)) in () end fun mk loop (z, priority, strids) = loop (z, priority, length strids, strids) in {destroy = fn () => (destroyStrShortest () ; destroyTyconShortest () ; destroyLayoutPrettyTycon ()), layoutPrettyTycon = layoutPrettyTycon, setLayoutPrettyTycon = setLayoutPrettyTycon, loopStr = mk loopStr, loopFlexTyconMap = mk loopFlexTyconMap} end fun makeLayoutPrettyTycon (E, {prefixUnset}) = let val {destroy = destroyLayoutPrettyTycon, layoutPrettyTycon, setLayoutPrettyTycon, loopStr, ...} = genLayoutPrettyTycon {prefixUnset = prefixUnset} fun pre () = let val {strs, types, ...} = current (E, fn _ => true) in loopStr (Structure.T {interface = NONE, plist = PropertyList.new (), strs = strs (), types = types (), vals = Info.T (Array.new0 ())}, 0, []) end val pre = ClearablePromise.delay pre in {destroy = fn () => (ClearablePromise.clear pre ; destroyLayoutPrettyTycon ()), layoutPrettyTycon = fn c => (ClearablePromise.force pre ; layoutPrettyTycon c), setLayoutPrettyTycon = setLayoutPrettyTycon, loopStr = loopStr} end fun makeLayoutPrettyTyconAndFlexTycon (E, _, Io, {prefixUnset}) = let val {destroy = destroyLayoutPrettyFlexTycon, layoutPrettyFlexTycon, loopFlexTyconMap, ...} = InterfaceEnv.genLayoutPrettyFlexTycon {prefixUnset = prefixUnset} val {destroy = destroyLayoutPrettyTycon, layoutPrettyTycon, setLayoutPrettyTycon, loopStr, ...} = genLayoutPrettyTycon {prefixUnset = prefixUnset} fun pre () = let val {strs, types, interface = {strs = ifcStrs, types = ifcTypes, ...}, ...} = current (E, fn _ => true) val strs = strs () val types = types () val ifcStrs = ifcStrs () val ifcTypes = ifcTypes () local fun doit (env, ifc, toSymbol) = if Info.isEmpty ifc then env else Info.keepAll (env, fn {domain, ...} => case Info.peek (ifc, domain, toSymbol) of NONE => true | SOME _ => false) in val () = loopStr (Structure.T {interface = NONE, plist = PropertyList.new (), strs = doit (strs, ifcStrs, Ast.Strid.toSymbol), types = doit (types, ifcTypes, Ast.Tycon.toSymbol), vals = Info.T (Array.new0 ())}, 0, []) end local fun doit ifc = let val Info.T a = ifc in Array.map (a, fn {domain, range, ...} => (domain, range)) end val I = Interface.new {isClosed = true, original = NONE, strs = doit ifcStrs, types = doit ifcTypes, vals = Array.new0 ()} in val () = loopFlexTyconMap (Interface.flexibleTycons I, []) end val () = Option.foreach (Io, fn I => loopFlexTyconMap (Interface.flexibleTycons I, [Ast.Strid.uSig])) in () end val pre = ClearablePromise.delay pre in {destroy = fn () => (ClearablePromise.clear pre ; destroyLayoutPrettyFlexTycon () ; destroyLayoutPrettyTycon ()), layoutPrettyTycon = fn c => (ClearablePromise.force pre ; layoutPrettyTycon c), layoutPrettyFlexTycon = fn f => (ClearablePromise.force pre ; layoutPrettyFlexTycon f), setLayoutPrettyTycon = setLayoutPrettyTycon} end fun output (E: t, out, {compact, def, flat, onlyCurrent, prefixUnset}): unit = let val keep = if onlyCurrent then let val T {currentScope, ...} = E val currentScope = !currentScope in fn {scope, ...} => Scope.equals (scope, currentScope) end else fn _ => true val {bass, fcts, sigs, strs, types, vals, ...} = current (E, keep) val bass = bass () val fcts = fcts () val sigs = sigs () val strs = strs () val types = types () val vals = vals () val {get = interfaceSigid: Interface.t -> (Sigid.t * Interface.t) option, set = setInterfaceSigid, ...} = Property.getSet (Interface.plist, Property.initConst NONE) val _ = Array.foreach (let val Info.T sigs = sigs in sigs end, fn {domain = s, range = I, ...} => setInterfaceSigid (I, SOME (s, I))) val {destroy = destroyLayoutPrettyTycon, layoutPrettyTycon, setLayoutPrettyTycon, loopStr, ...} = makeLayoutPrettyTycon (E, {prefixUnset = prefixUnset}) val empty = Layout.empty val indent = fn l => Layout.indent (l, 3) val paren = Layout.paren val {destroy, layoutSigDefn, layoutSigFlex, layoutStr, layoutStrDefn, layoutTypeDefn, layoutValDefn, ...} = Structure.layouts {interfaceSigid = interfaceSigid, layoutPrettyTycon = layoutPrettyTycon, setLayoutPrettyTycon = setLayoutPrettyTycon} val destroy = fn () => (destroy (); destroyLayoutPrettyTycon ()) fun layoutFctDefn (name, FunctorClosure.T {argInterface, summary, ...}, {compact, def}) = let val bind = seq [str "functor ", Fctid.layout name] val argId = Strid.uArg (Fctid.toString name) val {abbrev = argAbbrev, full = argFull} = let val bind = seq [Strid.layout argId, str ":"] val {abbrev, full} = layoutSigFlex (argInterface, {compact = compact, elide = {strs = NONE, types = NONE, vals = NONE}}) val abbrev = case abbrev () of NONE => NONE | SOME sigg => SOME (seq [bind, str " ", sigg]) val full = fn () => align [bind, indent (full ())] in {abbrev = abbrev, full = full} end val arg = #1 (Structure.dummy (argInterface, {prefix = Strid.toString argId ^ "."})) val () = loopStr (arg, 1, [argId]) val {abbrev = resAbbrev, full = resFull} = case summary arg of NONE => {abbrev = SOME (str "???"), full = fn () => str "???"} | SOME res => let val resId = Strid.uRes (Fctid.toString name) val () = loopStr (res, 2, [resId]) val {abbrev, full} = layoutStr (res, {compact = compact}) val abbrev = case abbrev () of NONE => NONE | SOME sigg => SOME (if compact then Layout.compact sigg else sigg) in {abbrev = abbrev, full = full} end val def = if def then seq [str "(* @ ", Region.layout (Fctid.region name), str " *)"] else empty val full = fn (arg, res) => align [bind, indent (seq [paren arg, str ":"]), indent res, indent def] in case (argAbbrev, resAbbrev) of (NONE, NONE) => full (argFull (), resFull ()) | (NONE, SOME resAbbrev) => full (argFull (), resAbbrev) | (SOME argAbbrev, NONE) => full (argAbbrev, resFull ()) | (SOME argAbbrev, SOME resAbbrev) => let val lay = mayAlign [seq [bind, str " ", paren argAbbrev, str ": ", resAbbrev], indent def] val lay = if compact then Layout.compact lay else lay in lay end end fun layoutBasDefn (name, _, {compact, def}) = let val lay = mayAlign [seq [str "basis ", Basid.layout name], indent (if def then seq [str "(* @ ", Region.layout (Basid.region name), str " *)"] else empty)] val lay = if compact then Layout.compact lay else lay in lay end val outputl = fn l => Layout.outputl (l, out) val maybeOutputl = fn lo => case lo of NONE => () | SOME l => outputl l val outputTypeDefn = fn (strids, name, tyStr) => (outputl o layoutTypeDefn) (strids, name, tyStr, {compact = compact, def = def}) val outputValDefn = fn (strids, name, (vid, scheme)) => (maybeOutputl o layoutValDefn) (strids, name, (vid, scheme), {compact = compact, con = flat, def = def}) val outputSigDefn = fn (name, I) => (outputl o layoutSigDefn) (name, I, {compact = compact, def = def}) val outputStrDefn = fn (strids, name, S) => (outputl o layoutStrDefn) (strids, name, S, {compact = compact, def = def}) fun outputStrDefnFlat (strids, name, S) = let val () = outputStrDefn (strids, name, S) val strids = name::strids val Structure.T {strs, types, vals, ...} = S fun doit (Info.T a, output) = Array.foreach (a, fn {domain, range, ...} => output (strids, domain, range)) val () = doit (types, outputTypeDefn) val () = doit (vals, outputValDefn) val () = doit (strs, outputStrDefnFlat) in () end val outputFctDefn = fn (name, fctCls) => (outputl o layoutFctDefn) (name, fctCls, {compact = compact, def = def}) val outputBasDefn = fn (name, B) => (outputl o layoutBasDefn) (name, B, {compact = compact, def = def}) fun doit (Info.T a, output) = Array.foreach (a, fn {domain, range, ...} => output (domain, range)) val () = doit (types, fn (name, tyStr) => outputTypeDefn ([], name, tyStr)) val () = doit (vals, fn (name, (vid, scheme)) => outputValDefn ([], name, (vid, scheme))) val () = doit (sigs, outputSigDefn) val () = doit (strs, fn (name, S) => if flat then outputStrDefnFlat ([], name, S) else outputStrDefn ([], name, S)) val () = doit (fcts, outputFctDefn) val () = doit (bass, outputBasDefn) val () = destroy () in () end fun showBasis (E, f) = File.withOut (f, fn out => output (E, out, {compact = !Control.showBasisCompact, def = !Control.showBasisDef, flat = !Control.showBasisFlat, onlyCurrent = false, prefixUnset = true})) val showBasis = Control.trace (Control.Detail, "showBasis") showBasis (* ------------------------------------------------- *) (* processDefUse *) (* ------------------------------------------------- *) fun processDefUse (E as T f) = let val {destroy = destroyLayoutPrettyTycon, layoutPrettyTycon, ...} = makeLayoutPrettyTycon (E, {prefixUnset = false}) val {destroy = destroyLayoutPrettyTyvar, layoutPretty = layoutPrettyTyvar, reset = resetLayoutPrettyTyvar} = Tyvar.makeLayoutPrettyLocal () fun layoutPrettyScheme s = let val () = resetLayoutPrettyTyvar () in (#1 o Type.layoutPretty) (Scheme.ty s, {expandOpaque = false, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) end val destroy = fn () => (destroyLayoutPrettyTyvar () ; destroyLayoutPrettyTycon ()) val _ = forceUsed E val all: {class: Class.t, def: Layout.t, extra: Layout.t list, isUsed: bool, region: Region.t, uses: Region.t list} list ref = ref [] fun doit (sel, mkExtra) = let val NameSpace.T {defUses, region, toSymbol, ...} = sel f in List.foreach (Option.fold (defUses, [], ! o #1), fn {class, def, uses, range, ...} => List.push (all, {class = class, def = Symbol.layout (toSymbol def), extra = mkExtra range, isUsed = Uses.isUsed uses, region = region def, uses = List.fold (Uses.all uses, [], fn (u, ac) => region u :: ac)})) end val _ = doit (#fcts, fn _ => []) val _ = doit (#sigs, fn _ => []) val _ = doit (#strs, fn _ => []) val _ = doit (#types, fn _ => []) local fun mkExtraFromScheme so = case so of NONE => [] | SOME (_, s) => [layoutPrettyScheme s] in val _ = doit (#vals, mkExtraFromScheme) end val a = Array.fromList (!all) val _ = QuickSort.sortArray (a, fn ({region = r, ...}, {region = r', ...}) => Region.<= (r, r')) val l = Array.foldr (a, [], fn (z as {class, def, extra, isUsed, region, uses}, ac) => case ac of [] => [z] | {extra = e', isUsed = i', region = r', uses = u', ...} :: ac' => if Region.equals (region, r') then {class = class, def = def, extra = extra @ e', isUsed = isUsed orelse i', region = region, uses = uses @ u'} :: ac' else z :: ac) val _ = List.foreach (l, fn {class, def, isUsed, region, ...} => if isUsed orelse Option.isNone (Region.left region) then () else Control.warning (region, seq [str (concat ["unused ", Class.toString class, ": "]), def], Layout.empty)) val _ = case !Control.showDefUse of NONE => () | SOME f => File.withOut (f, fn out => List.foreach (l, fn {class, def, extra, region, uses, ...} => case Region.left region of NONE => () | SOME p => let val uses = Array.fromList uses val _ = QuickSort.sortArray (uses, Region.<=) val uses = Array.foldr (uses, [], fn (r, ac) => case ac of [] => [r] | r' :: _ => if Region.equals (r, r') then ac else r :: ac) open Layout in outputl (align [seq [str (Class.toString class), str " ", def, str " ", str (SourcePos.toString p), case extra of [] => empty | ss => let val ts = List.map (ss, toString) val uts = List.map (List.equivalence (ts, String.equals), hd) val sts = List.insertionSort (uts, fn (l, r) => size l < size r orelse size l = size r andalso l < r) in str (concat (" \"" :: List.separate (sts, " andalso ") @ ["\""])) end], indent (align (List.map (uses, fn r => str (case Region.left r of NONE => "NONE" | SOME p => SourcePos.toString p))), 4)], out) end)) val () = destroy () in () end val processDefUse = Control.trace (Control.Detail, "processDefUse") processDefUse (* ------------------------------------------------- *) (* newCons *) (* ------------------------------------------------- *) fun newCons (T {vals, ...}, v) = let val forceUsed = 1 = Vector.length v in (Cons.fromVector o Vector.map) (v, fn {con, name, scheme} => let val uses = NameSpace.newUses (vals, {def = Ast.Vid.fromCon name, range = (Vid.Con con, scheme), forceUsed = forceUsed}) in {con = con, name = name, scheme = scheme, uses = uses} end) end (* ------------------------------------------------- *) (* cut *) (* ------------------------------------------------- *) local fun makeOpaque (S: Structure.t, I: Interface.t, {prefix: string}) = let fun fixCons (cs, cs') = Cons.map (cs', fn {name, scheme, ...} => let val (con, uses) = case Vector.peek (Cons.dest cs, fn {name = n, ...} => Ast.Con.equals (n, name)) of NONE => (Con.bogus, Uses.new ()) | SOME {con, uses, ...} => (con, uses) in {con = con, scheme = scheme, uses = uses} end) val (S', instantiate) = Structure.dummy (I, {prefix = prefix}) val _ = instantiate (S, fn (c, s) => Tycon.setOpaqueExpansion (c, fn ts => TypeStr.apply (s, ts))) val {destroy, get : Structure.t -> {formal: Structure.t, new: Structure.t} list ref, ...} = Property.destGet (Structure.plist, Property.initFun (fn _ => ref [])) (* fun replace (S, S'): Structure.t = reallyReplace (S, S') *) fun replace (S, S'): Structure.t = let val seen = get S in case List.peek (!seen, fn {formal, ...} => Structure.eq (S', formal)) of NONE => let val new = reallyReplace (S, S') val _ = List.push (seen, {formal = S', new = new}) in new end | SOME {new, ...} => new end and reallyReplace (S, S'): Structure.t = let val Structure.T {strs, types, vals, ...} = S val Structure.T {strs = strs', types = types', vals = vals', ...} = S' val strs = Info.map2 (strs, strs', replace) val types = Info.map2 (types, types', fn (s, s') => let datatype z = datatype TypeStr.node in case TypeStr.node s' of Datatype {cons = cs', tycon} => (case TypeStr.node s of Datatype {cons = cs, ...} => TypeStr.data (tycon, fixCons (cs, cs')) | _ => s') | Scheme _ => s' | Tycon _ => s' end) val vals = Info.map2 (vals, vals', fn ((v, _), (_, s')) => (v, s')) in Structure.T {interface = Structure.interface S', plist = PropertyList.new (), strs = strs, types = types, vals = vals} end val S'' = replace (S, S') val _ = destroy () in S'' end fun transparentCut (E: t, S: Structure.t, I: Interface.t, {isFunctor: bool, prefix: string}, region: Region.t): Structure.t * Decs.t = let val I = Interface.copy I val flexTyconMap = Interface.flexibleTycons I val () = Structure.realize (S, flexTyconMap, fn (name, flex, typeStr, {nest = strids}) => let val {admitsEquality = a, hasCons, kind = k, ...} = FlexibleTycon.dest flex fun dummy () = TypeStr.tycon (FlexibleTycon.dummyTycon (flex, name, strids, {prefix = prefix})) val typeStr = case typeStr of NONE => dummy () | SOME typeStr => (* Only realize a plausible candidate for typeStr. *) if Kind.equals (k, TypeStr.kind typeStr) andalso AdmitsEquality.<= (a, TypeStr.admitsEquality typeStr) andalso (not hasCons orelse Option.isSome (TypeStr.toTyconOpt typeStr)) then typeStr else dummy () val () = FlexibleTycon.realize (flex, typeStr) in () end) (* This tick is so that the type schemes for any values that need to be * instantiated and then re-generalized will be at a new time, so we can * check if something should not be generalized. *) val () = TypeEnv.Time.tick {region = region} val sign = if isFunctor then "argument signature" else "signature" val {destroy = destroyInterfaceSigid, get = interfaceSigid: Interface.t -> (Sigid.t * Interface.t) option, set = setInterfaceSigid, ...} = Property.destGetSet (Interface.plist, Property.initConst NONE) val {destroy = destroyLayoutPrettyTycon, layoutPrettyTycon, setLayoutPrettyTycon, loopStr, loopFlexTyconMap, ...} = genLayoutPrettyTycon {prefixUnset = true} val pre = Promise.delay (fn () => let val {sigs, strs, types, ...} = current (E, fn _ => true) val _ = Info.foreachByTime (sigs (), fn (s, I) => setInterfaceSigid (I, SOME (s, I))) val _ = loopFlexTyconMap (flexTyconMap, 2, [Strid.uSig]) val _ = loopStr (S, 1, [Strid.uStr]) val _ = loopStr (Structure.T {interface = NONE, plist = PropertyList.new (), strs = strs (), types = types (), vals = Info.T (Array.new0 ())}, 0, []) in () end) val interfaceSigid = fn I => (Promise.force pre; interfaceSigid I) val layoutPrettyTycon = fn c => (Promise.force pre; layoutPrettyTycon c) val {destroy = destroyLayouts, layoutPrettyType, layoutPrettyTyvar, layoutStrSpec, layoutTypeSpec, layoutValSpec, localInitLayoutPrettyTyvar, ...} = Interface.layouts {interfaceSigid = interfaceSigid, layoutPrettyTycon = layoutPrettyTycon, setLayoutPrettyTycon = setLayoutPrettyTycon} datatype sort = datatype Interface.TypeStr.Sort.t val sort = Interface.TypeStr.sort val decs = ref [] fun map {strInfo: ('name, 'strRange) Info.t, ifcArray: ('name * 'ifcRange) array, strids: Strid.t list, nameEquals: 'name * 'name -> bool, nameLayout: 'name -> Layout.t, specs: 'name * 'ifcRange -> Region.t list, notFound: 'name * 'ifcRange -> {diag: {spec: Layout.t option, thing: string} option, range: 'range}, doit: 'name * 'strRange * 'name * 'ifcRange -> 'range}: ('name, 'range) Info.t = let val Info.T strArray = strInfo val n = Array.length strArray val r = ref 0 val array = Array.map (ifcArray, fn (ifcName, ifcRange) => let fun find i = if i = n then let val {diag, range} = notFound (ifcName, ifcRange) val _ = Option.app (diag, fn {thing, spec} => Control.error (region, seq [str thing, str " in ", str sign, str " but not in structure: ", layoutLongRev (strids, nameLayout ifcName)], align ((case spec of NONE => Layout.empty | SOME spec => seq [str "signature: ", spec]):: (List.map (specs (ifcName, ifcRange), fn r => seq [str "spec at: ", Region.layout r]))))) in {domain = ifcName, range = range, time = Time.next (), uses = Uses.new ()} end else let val {domain = strName, range = strRange, time, uses} = Array.sub (strArray, i) in if nameEquals (strName, ifcName) then (r := i + 1 ; {domain = strName, range = doit (strName, strRange, ifcName, ifcRange), time = time, uses = uses}) else find (i + 1) end in find (!r) end) in Info.T array end val {destroy, get: Structure.t -> (Interface.t * Structure.t) list ref, ...} = Property.destGet (Structure.plist, Property.initFun (fn _ => ref [])) (* fun cut (S, I, strids): Structure.t = reallyCut (S, I, strids) *) fun cut (S, I, flexTyconMap, strids): Structure.t = let val seen = get S in case List.peek (!seen, fn (I', _) => Interface.equals (I, I')) of NONE => let fun really () = reallyCut (S, I, flexTyconMap, strids) val S = case Structure.interface S of NONE => really () | SOME I' => if Interface.equals (I, I') then S else really () val _ = List.push (seen, (I, S)) in S end | SOME (_, S) => S end and reallyCut (S, I, flexTyconMap, strids) = let val Structure.T {strs = strStrs, types = strTypes, vals = strVals, ...} = S val {strs = sigStrs, types = sigTypes, vals = sigVals} = Interface.dest I val types = map {strInfo = strTypes, ifcArray = sigTypes, strids = strids, nameEquals = Ast.Tycon.equals, nameLayout = Ast.Tycon.layout, specs = fn (name, sigStr) => Interface.TypeStr.specs (sigStr, Ast.Tycon.region name), notFound = fn (name, sigStr) => let val spec = layoutTypeSpec (strids, name, sigStr, {compact = false, def = false, flexTyconMap = flexTyconMap}) val thing = "type" val rlzStr = Interface.TypeStr.toEnv sigStr in {diag = SOME {spec = SOME spec, thing = thing}, range = rlzStr} end, doit = fn (strName, strStr, sigName, sigStr) => let val rlzStr = Interface.TypeStr.toEnv sigStr val error: (Layout.t list * Layout.t * Layout.t) option ref = ref NONE fun reportError () = case !error of NONE => () | SOME (msgs, strError, sigError) => Control.error (region, seq [str "type in structure disagrees with signature (", (seq o List.separate) (List.rev msgs, str ", "), str "): ", layoutLongRev (strids, Ast.Tycon.layout sigName)], align ((seq [str "structure: ", strError]) :: (seq [str "defn at: ", Region.layout (Ast.Tycon.region strName)]) :: (seq [str "signature: ", sigError]) :: (List.map (Interface.TypeStr.specs (sigStr, Ast.Tycon.region sigName), fn r => seq [str "spec at: ", Region.layout r])))) val error = fn (msg, strError, sigError) => let val msgs = case !error of NONE => [str msg] | SOME (msgs, _, _) => (str msg)::msgs in error := SOME (msgs, strError, sigError) end val strKind = TypeStr.kind strStr val strArity = case strKind of Kind.Arity strArity => strArity | _ => Error.bug "ElaborateEnv.transparentCut.reallyCut.: strArity" val sigKind = Interface.TypeStr.kind sigStr val sigArity = case sigKind of Kind.Arity sigArity => sigArity | _ => Error.bug "ElaborateEnv.transparentCut.reallyCut.: sigArity" local val tyvars = Vector.tabulate (Int.max (strArity, sigArity), fn _ => Tyvar.makeNoname {equality = false}) val () = localInitLayoutPrettyTyvar tyvars in val strTyvars = Vector.prefix (tyvars, strArity) val strTyargs = Vector.map (strTyvars, Type.var) val sigTyvars = Vector.prefix (tyvars, sigArity) val sigTyargs = Vector.map (sigTyvars, Type.var) end fun layoutTyvars tyvars = let open Layout val tyvars = case Vector.length tyvars of 0 => empty | 1 => layoutPrettyTyvar (Vector.first tyvars) | _ => tuple (Vector.toListMap (tyvars, layoutPrettyTyvar)) val tyvars = if strArity = sigArity then tyvars else bracket tyvars in if isEmpty tyvars then str " " else seq [str " ", tyvars, str " "] end val sort = sort (sigName, sigStr, rlzStr, flexTyconMap) fun sigMsg (b, rest) = let val empty = Layout.empty val indent = fn l => Layout.indent (l, 3) val rest = case rest of NONE => SOME (str "...") | SOME _ => rest val (kw, rest) = case sort of Datatype _ => ("datatype", rest) | Scheme _ => ("type", rest) | Type {admitsEquality} => (if admitsEquality then "eqtype" else "type", NONE) in mayAlign [seq [if b then bracket (str kw) else str kw, layoutTyvars sigTyvars, layoutLongRev (strids, Ast.Tycon.layout sigName), if Option.isSome rest then str " =" else empty], indent (case rest of NONE => empty | SOME rest => rest)] end fun strMsg (b, rest) = let val empty = Layout.empty val indent = fn l => Layout.indent (l, 3) val rest = case rest of NONE => SOME (str "...") | SOME _ => rest val kw = case TypeStr.node strStr of TypeStr.Datatype _ => "datatype" | TypeStr.Scheme _ => "type" | TypeStr.Tycon _ => "type" in mayAlign [seq [if b then bracket (str kw) else str kw, layoutTyvars strTyvars, layoutLongRev (strids, Ast.Tycon.layout strName), if Option.isSome rest then str " =" else empty], indent (case rest of NONE => empty | SOME rest => rest)] end val lay = #1 o layoutPrettyType fun unify (t, t', error) = let val error = fn (l, l', _) => error (l, l') in Type.unify (t, t', {error = error, layoutPretty = layoutPrettyType, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) end val () = if Kind.equals (strKind, sigKind) then () else error ("arity", strMsg (false, NONE), sigMsg (false, NONE)) val resStr = case sort of Type _ => let val sigEq = Interface.TypeStr.admitsEquality sigStr val strEq = TypeStr.admitsEquality strStr val _ = if AdmitsEquality.<= (sigEq, strEq) then () else error ("admits equality", strMsg (false, SOME (TypeStr.explainDoesNotAdmitEquality (strStr, {layoutPrettyTycon = layoutPrettyTycon}))), sigMsg (true, NONE)) in rlzStr end | Scheme sigScheme => let fun chkScheme strScheme = unify (Scheme.apply (strScheme, strTyargs), Scheme.apply (sigScheme, sigTyargs), fn (l, l') => error ("type definition", strMsg (false, SOME l), sigMsg (false, SOME l'))) val _ = case TypeStr.node strStr of TypeStr.Datatype {tycon = strTycon, ...} => let val strScheme = Scheme.fromTycon strTycon in unify (Scheme.apply (strScheme, strTyargs), Scheme.apply (sigScheme, sigTyargs), fn _ => error ("type structure", strMsg (true, NONE), sigMsg (false, SOME (bracket (lay (Scheme.apply (sigScheme, sigTyargs))))))) end | TypeStr.Scheme s => chkScheme s | TypeStr.Tycon c => chkScheme (Scheme.fromTycon c) in rlzStr end | Datatype {repl = true, tycon = sigTycon, ...} => let val sigScheme = Scheme.fromTycon sigTycon fun nonDatatype strScheme = (error ("type structure", strMsg (false, SOME (bracket (lay (Scheme.apply (strScheme, strTyargs))))), sigMsg (false, SOME (bracket (seq [str "datatype ", lay (Scheme.apply (sigScheme, sigTyargs))])))) ; rlzStr) in case TypeStr.node strStr of TypeStr.Datatype {tycon = strTycon, ...} => let val strScheme = Scheme.fromTycon strTycon in Exn.withEscape (fn escape => (unify (Scheme.apply (strScheme, strTyargs), Scheme.apply (sigScheme, sigTyargs), fn _ => (error ("type structure", strMsg (true, NONE), sigMsg (false, SOME (bracket (seq [str "datatype ", lay (Scheme.apply (sigScheme, sigTyargs))])))) ; escape rlzStr)) ; strStr)) end | TypeStr.Scheme strScheme => nonDatatype strScheme | TypeStr.Tycon strTycon => nonDatatype (Scheme.fromTycon strTycon) end | Datatype {repl = false, cons = sigCons, ...} => let fun nonDatatype strScheme = (error ("type structure", strMsg (false, SOME (bracket (lay (Scheme.apply (strScheme, strTyargs))))), sigMsg (true, NONE)) ; rlzStr) in case TypeStr.node strStr of TypeStr.Datatype {cons = strCons, ...} => let val extra: bool ref = ref false fun conScheme (scheme, tyvars) = case Type.deArrowOpt (Scheme.apply (scheme, tyvars)) of NONE => NONE | SOME (ty, _) => SOME ty fun layCon (name, scheme, tyvars) = (bracket o seq) [Ast.Con.layout name, case conScheme (scheme, tyvars) of NONE => Layout.empty | SOME _ => str " of _"] fun loop (sigCons, strCons, sigConsAcc, strConsAcc) = case (sigCons, strCons) of ([], []) => (List.rev sigConsAcc, List.rev strConsAcc) | ({name, scheme = sigScheme}::sigCons, []) => loop (sigCons, [], (layCon (name, sigScheme, sigTyargs))::sigConsAcc, strConsAcc) | ([], {name, scheme = strScheme}::strCons) => loop ([], strCons, sigConsAcc, (layCon (name, strScheme, strTyargs))::strConsAcc) | (sigCons as {name = sigName, scheme = sigScheme}::sigCons', strCons as {name = strName, scheme = strScheme}::strCons') => (case Ast.Con.compare (sigName, strName) of LESS => loop (sigCons', strCons, (layCon (sigName, sigScheme, sigTyargs))::sigConsAcc, strConsAcc) | EQUAL => (case (conScheme (sigScheme, sigTyargs), conScheme (strScheme, strTyargs)) of (NONE, NONE) => (extra := true ; loop (sigCons', strCons', sigConsAcc, strConsAcc)) | (NONE, SOME _) => loop (sigCons', strCons', (Ast.Con.layout sigName)::sigConsAcc, (seq [Ast.Con.layout strName, str " [of _]"])::strConsAcc) | (SOME _, NONE) => loop (sigCons', strCons', (seq [Ast.Con.layout sigName, str " [of _]"])::sigConsAcc, (Ast.Con.layout strName)::strConsAcc) | (SOME sigTy, SOME strTy) => Exn.withEscape (fn escape => (unify (sigTy, strTy, fn (sigLay, strLay) => (escape o loop) (sigCons', strCons', (seq [Ast.Con.layout sigName, str " of ", sigLay])::sigConsAcc, (seq [Ast.Con.layout strName, str " of ", strLay])::strConsAcc)) ; extra := true ; loop (sigCons', strCons', sigConsAcc, strConsAcc)))) | GREATER => loop (sigCons, strCons', sigConsAcc, (layCon (strName, strScheme, strTyargs))::strConsAcc)) val (sigCons, strCons) = loop (Vector.toListMap (Cons.dest sigCons, fn {name, scheme, ...} => {name = name, scheme = scheme}), Vector.toListMap (Cons.dest strCons, fn {name, scheme, ...} => {name = name, scheme = scheme}), [], []) val resStr = if List.isEmpty sigCons andalso List.isEmpty strCons then strStr else let fun layCons cons = let val cons = if !extra then List.snoc (cons, str "...") else cons val cons = alignPrefix (cons, "| ") in SOME cons end in error ("constructors", strMsg (false, layCons strCons), sigMsg (false, layCons sigCons)) ; rlzStr end in resStr end | TypeStr.Scheme strScheme => nonDatatype strScheme | TypeStr.Tycon strTycon => nonDatatype (Scheme.fromTycon strTycon) end val () = reportError () in resStr end} val vals = map {strInfo = strVals, ifcArray = sigVals, strids = strids, nameEquals = Ast.Vid.equals, nameLayout = Ast.Vid.layout, specs = fn (name, _) => [Ast.Vid.region name], notFound = fn (name, (sigStatus, sigScheme)) => let val spec = layoutValSpec (strids, name, (sigStatus, sigScheme), {compact = false, con = false, def = false}) val thing = Status.pretty sigStatus val con = Con.newString o Ast.Vid.toString val var = Var.newString o Ast.Vid.toString val vid = case sigStatus of Status.Con => Vid.Con (con name) | Status.Exn => Vid.Exn (con name) | Status.Var => Vid.Var (var name) val rlzScheme = Interface.Scheme.toEnv sigScheme in {diag = Option.map (spec, fn spec => {spec = SOME spec, thing = thing}), range = (vid, rlzScheme)} end, doit = fn (strName, (strVid, strScheme), sigName, (sigStatus, sigScheme)) => let val rlzScheme = Interface.Scheme.toEnv sigScheme val unifyError = ref NONE val statusError = ref false val (rlzTyvars, rlzType) = Scheme.fresh rlzScheme val () = localInitLayoutPrettyTyvar rlzTyvars val {args = strTyargs, instance = strType} = Scheme.instantiate strScheme val _ = Type.unify (strType, rlzType, {error = fn (l, l', {notes, ...}) => unifyError := SOME (l, l', notes), layoutPretty = layoutPrettyType, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) val strTyargs = strTyargs () fun addDec (name: string, n: Exp.node): Vid.t = let val x = Var.newString name val e = Exp.make (n, strType) val _ = List.push (decs, Dec.Val {matchDiags = {nonexhaustiveExn = Control.Elaborate.DiagDI.Default, nonexhaustive = Control.Elaborate.DiagEIW.Ignore, redundant = Control.Elaborate.DiagEIW.Ignore}, rvbs = Vector.new0 (), tyvars = fn () => rlzTyvars, vbs = (Vector.new1 {ctxt = fn _ => Layout.empty, exp = e, layPat = fn _ => Layout.empty, nest = [], pat = Pat.var (x, strType), regionPat = Region.bogus})}) in Vid.Var x end fun con (c: Con.t): Vid.t = addDec (Con.originalName c, Exp.Con (c, strTyargs)) val strStatus = Status.fromVid strVid val vid = case (strVid, sigStatus) of (Vid.Con c, Status.Var) => con c | (Vid.Exn c, Status.Var) => con c | (Vid.Var x, Status.Var) => if 0 < Vector.length rlzTyvars orelse 0 < Vector.length strTyargs then addDec (Var.originalName x, Exp.Var (fn () => x, fn () => strTyargs)) else strVid | (Vid.Con _, Status.Con) => strVid | (Vid.Exn _, Status.Exn) => strVid | _ => (statusError := true; strVid) val () = if Option.isNone (!unifyError) andalso not (!statusError) then () else let val errors = [] val errors = if Option.isSome (!unifyError) then str "type" :: errors else errors val errors = if !statusError then str "status" :: errors else errors val name = layoutLongRev (strids, Ast.Vid.layout sigName) val (strTy, sigTy, notes) = case !unifyError of NONE => let val lay = #1 (layoutPrettyType rlzType) in (lay, lay, Layout.empty) end | SOME (strLay, sigLay, notes) => (strLay, sigLay, notes ()) fun doit (space, status, ty, kind, vid) = let val indent = fn l => Layout.indent (l, 3) val kw = str (Status.kw status) val kw = if !statusError then bracket kw else kw in align [seq [str space, str ": ", mayAlign [seq [kw, str " ", name, str (if Ast.Vid.isSymbolic sigName then " :" else ":")], indent ty]], seq [str kind, str " at: ", Region.layout (Ast.Vid.region vid)]] end in Control.error (region, seq [if !statusError then str "value identifier" else str (Vid.statusPretty strVid), str " in structure disagrees with ", str sign, str " (", (seq o List.separate) (errors, str ", "), str "): ", name], align [doit ("structure", strStatus, strTy, "defn", strName), doit ("signature", sigStatus, sigTy, "spec", sigName), notes]) end in (vid, rlzScheme) end} val strs = map {strInfo = strStrs, ifcArray = sigStrs, strids = strids, nameEquals = Strid.equals, nameLayout = Strid.layout, specs = fn (name, _) => [Strid.region name], notFound = fn (name, I) => let val spec = layoutStrSpec (strids, name, I, {compact = false, def = false, elide = {strs = SOME (2, 0), types = NONE, vals = SOME (3, 2)}, flexTyconMap = flexTyconMap}) val thing = "structure" val (S, _) = Structure.dummy (I, {prefix = ""}) in {diag = SOME {spec = SOME spec, thing = thing}, range = S} end, doit = fn (_, S, name, I) => let val flexTyconMap = Option.fold (TyconMap.peekStrid (flexTyconMap, name), TyconMap.empty (), fn (flexTyconMap, _) => flexTyconMap) in cut (S, I, flexTyconMap, name :: strids) end} in Structure.T {interface = SOME I, plist = PropertyList.new (), strs = strs, types = types, vals = vals} end val S = cut (S, I, flexTyconMap, []) val () = destroy () val () = destroyLayouts () val () = destroyLayoutPrettyTycon () val () = destroyInterfaceSigid () in (S, Decs.fromList (!decs)) end in (* section 5.3, 5.5, 5.6 and rules 52, 53 *) fun cut (E: t, S: Structure.t, I: Interface.t, {isFunctor: bool, opaque: bool, prefix: string}, region) : Structure.t * Decs.t = let val (S, decs) = transparentCut (E, S, I, {isFunctor = isFunctor, prefix = prefix}, region) val S = if opaque then makeOpaque (S, I, {prefix = prefix}) else S in (S, decs) end val cut = Trace.trace ("ElaborateEnv.cut", fn (_, S, I, _, _) => Layout.tuple [Structure.layout S, Interface.layout I], Structure.layout o #1) cut end (* ------------------------------------------------- *) (* functorClosure *) (* ------------------------------------------------- *) fun functorClosure (E: t, name: Fctid.t, argInterface: Interface.t, makeBody: Structure.t * string list -> Decs.t * Structure.t option) = let val argId = Strid.uArg (Fctid.toString name) val resId = Strid.uRes (Fctid.toString name) val _ = insideFunctor := true (* Need to tick here so that any tycons created in the dummy structure * for the functor formal have a new time, and will therefore report an * error if they occur before the functor declaration. *) val _ = TypeEnv.Time.tick {region = Fctid.region name} val (formal, instantiate) = Structure.dummy (argInterface, {prefix = Strid.toString argId ^ "."}) (* Keep track of all tycons created during the instantiation of the * functor. These will later become the generative tycons that will need * to be recreated for each functor application. *) val (resultStructure, generativeTycons) = Tycon.scopeNew (fn () => let val nest = [Strid.toString resId] val (_, resultStructure) = makeBody (formal, nest) val _ = Option.app (resultStructure, Structure.forceUsed) in resultStructure end) val _ = insideFunctor := false val restore = let val withSaved = Control.Elaborate.snapshot () val snapshot = snapshot E in fn f => snapshot (fn () => withSaved f) end fun summary actual = let val _ = Structure.forceUsed actual val {destroy = destroy1, get = tyconTypeStr: Tycon.t -> TypeStr.t option, set = setTyconTypeStr, ...} = Property.destGetSet (Tycon.plist, Property.initConst NONE) (* Match the actual against the formal, to set the tycons. * Then duplicate the result, replacing tycons. Want to generate * new tycons just like the functor body did. *) val _ = instantiate (actual, fn (c, s) => setTyconTypeStr (c, SOME s)) val _ = List.foreach (generativeTycons, fn c => setTyconTypeStr (c, SOME (TypeStr.tycon (Tycon.makeLike c)))) fun replaceType (t: Type.t): Type.t = let fun con (c, ts) = case tyconTypeStr c of NONE => Type.con (c, ts) | SOME s => TypeStr.apply (s, ts) in Type.hom (t, {con = con, expandOpaque = false, record = Type.record, replaceSynonyms = false, var = Type.var}) end fun replaceScheme (s: Scheme.t): Scheme.t = let val (tyvars, ty) = Scheme.dest s in Scheme.make {canGeneralize = true, ty = replaceType ty, tyvars = tyvars} end fun replaceCons cons: Cons.t = Cons.map (cons, fn {con, scheme, uses, ...} => {con = con, scheme = replaceScheme scheme, uses = uses}) fun replaceTypeStr (s: TypeStr.t): TypeStr.t = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons, tycon} => let val tycon = case tyconTypeStr tycon of NONE => tycon | SOME s => (case TypeStr.toTyconOpt s of NONE => Error.bug "ElaborateEnv.functorClosure.apply: bad datatype" | SOME c => c) in TypeStr.data (tycon, replaceCons cons) end | Scheme s => TypeStr.def (replaceScheme s) | Tycon c => (case tyconTypeStr c of NONE => s | SOME s => s) end val {destroy = destroy2, get = replaceInterface: Interface.t -> Interface.t, ...} = Property.destGet (Interface.plist, Property.initRec (fn (I, replaceInterface) => let val {strs, types, vals} = Interface.dest I val replaceIScheme = Interface.Scheme.fromEnv o replaceScheme o Interface.Scheme.toEnv val replaceITypeStr = Interface.TypeStr.fromEnv o replaceTypeStr o Interface.TypeStr.toEnv in Interface.new {isClosed = true, original = SOME (Interface.original I), strs = Array.map (strs, fn (strid, I) => (strid, replaceInterface I)), types = Array.map (types, fn (tycon, s) => (tycon, replaceITypeStr s)), vals = Array.map (vals, fn (vid, (status, scheme)) => (vid, (status, replaceIScheme scheme)))} end)) val {destroy = destroy3, get = replaceStructure: Structure.t -> Structure.t, ...} = Property.destGet (Structure.plist, Property.initRec (fn (Structure.T {interface, strs, types, vals, ... }, replaceStructure) => Structure.T {interface = Option.map (interface, replaceInterface), plist = PropertyList.new (), strs = Info.map (strs, replaceStructure), types = Info.map (types, replaceTypeStr), vals = Info.map (vals, fn (status, s) => (status, replaceScheme s))})) val resultStructure = Option.map (resultStructure, replaceStructure) val _ = destroy1 () val _ = destroy2 () val _ = destroy3 () in resultStructure end val summary = Trace.trace ("ElaborateEnv.functorClosure.summary", fn actual => Layout.record [("argInterface", Interface.layout argInterface), ("formal", Structure.layout formal), ("resultStructure", Option.layout Structure.layout resultStructure), ("actual", Structure.layout actual)], Option.layout Structure.layout) summary fun apply (actual, nest) = if not (!insideFunctor) andalso !Control.numErrors = 0 then restore (fn () => makeBody (actual, nest)) else (Decs.empty, summary actual) in FunctorClosure.T {apply = apply, argInterface = argInterface, resultStructure = resultStructure, summary = summary} end end mlton-20210117+dfsg/mlton/elaborate/elaborate-env.sig000066400000000000000000000217101416264345000223460ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_ENV_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure TypeEnv: TYPE_ENV sharing Ast.Record = CoreML.Record sharing Ast.SortedRecord = CoreML.SortedRecord sharing CoreML.Atoms = TypeEnv.Atoms sharing CoreML.Type = TypeEnv.Type end signature ELABORATE_ENV = sig include ELABORATE_ENV_STRUCTS structure Decs: DECS sharing CoreML = Decs.CoreML structure Tyvar: TYVAR sharing Tyvar = TypeEnv.Tyvar structure TyvarEnv: sig val lookupTyvar: Ast.Tyvar.t -> Tyvar.t option val scope: Ast.Tyvar.t vector * (Tyvar.t vector -> 'a) -> 'a val makeLayoutPretty: unit -> {destroy: unit -> unit, layoutPretty: Tyvar.t -> Layout.t} end structure AdmitsEquality: ADMITS_EQUALITY sharing AdmitsEquality = TypeEnv.Tycon.AdmitsEquality structure Kind: TYCON_KIND sharing Kind = TypeEnv.Tycon.Kind structure Tycon: TYCON sharing Tycon = TypeEnv.Tycon structure Type: sig type t end sharing Type = TypeEnv.Type structure Scheme: sig type t end sharing Scheme = TypeEnv.Scheme (* The value of a vid. This is used to distinguish between vids whose * status cannot be determined at parse time. *) structure Vid: sig datatype t = Con of CoreML.Con.t | Exn of CoreML.Con.t | Overload of Ast.Priority.t * (CoreML.Var.t * Scheme.t) vector | Var of CoreML.Var.t val layout: t -> Layout.t end structure TypeStr: sig structure Cons: sig type t val layout: t -> Layout.t end type t datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t val abs: t -> t val admitsEquality: t -> AdmitsEquality.t val apply: t * Type.t vector -> Type.t val data: Tycon.t * Cons.t -> t val def: Scheme.t -> t val kind: t -> Kind.t val layout: t -> Layout.t val node: t -> node val toTyconOpt: t -> Tycon.t option (* NONE on Scheme *) val tycon: Tycon.t -> t end structure Interface: INTERFACE sharing Interface.Ast = Ast sharing Interface.AdmitsEquality = AdmitsEquality sharing Interface.Kind = Kind sharing Interface.EnvTycon = Tycon sharing Interface.EnvTypeStr = TypeStr sharing Interface.Tyvar = Tyvar structure Structure: sig type t (* ffi represents MLtonFFI, which is built by the basis library and * set via the special ffiStr MLB annotation. *) val ffi: t option ref val forceUsed: t -> unit val layout: t -> Layout.t end structure FunctorClosure: sig type t val apply: (t * Structure.t * string list -> Decs.t * Structure.t option) val argInterface: t -> Interface.t end structure InterfaceEnv: sig structure FlexibleTycon: sig type t end structure Scheme: sig type t end structure Status: sig type t end structure TypeStr: sig type t end type t val extendCon: t * Ast.Con.t * Scheme.t -> unit val extendExn: t * Ast.Con.t * Scheme.t -> unit val extendStrid: t * Ast.Strid.t * Interface.t -> unit val extendTycon: t * Ast.Tycon.t * TypeStr.t -> unit val extendVid: t * Ast.Vid.t * Status.t * Scheme.t -> unit val lookupLongtycon: t * Ast.Longtycon.t -> TypeStr.t option val lookupSigid: t * Ast.Sigid.t -> Interface.t option val makeInterface: t * {isTop: bool} * (unit -> 'a) -> Interface.t * 'a val openInterface: t * Interface.t * Region.t -> unit val rebindTycon: t * Ast.Tycon.t * TypeStr.t -> unit end sharing Interface.FlexibleTycon = InterfaceEnv.FlexibleTycon sharing Interface.Scheme = InterfaceEnv.Scheme sharing Interface.Status = InterfaceEnv.Status sharing Interface.TypeStr = InterfaceEnv.TypeStr structure Basis: sig type t val layout: t -> Layout.t end type t val amInsideFunctor: unit -> bool (* cut keeps only those bindings in the structure that also appear * in the interface. It proceeds recursively on substructures. *) val cut: t * Structure.t * Interface.t * {isFunctor: bool, opaque: bool, prefix: string} * Region.t -> Structure.t * Decs.t val empty: unit -> t val extendBasid: t * Ast.Basid.t * Basis.t -> unit val extendExn: t * Ast.Con.t * CoreML.Con.t * Scheme.t -> unit val extendFctid: t * Ast.Fctid.t * FunctorClosure.t -> unit val extendFix: t * Ast.Vid.t * Ast.Fixity.t -> unit val extendSigid: t * Ast.Sigid.t * Interface.t -> unit val extendStrid: t * Ast.Strid.t * Structure.t -> unit val extendTycon: t * Ast.Tycon.t * TypeStr.t * {forceUsed: bool, isRebind: bool} -> unit val extendVar: t * Ast.Var.t * CoreML.Var.t * Scheme.t * {isRebind: bool} -> unit val extendOverload: t * Ast.Priority.t * Ast.Var.t * (CoreML.Var.t * Scheme.t) vector * Scheme.t -> unit val forceUsed: t -> unit val forceUsedLocal: t * (unit -> 'a) -> 'a val functorClosure: t * Ast.Fctid.t * Interface.t * (Structure.t * string list -> Decs.t * Structure.t option) -> FunctorClosure.t val localAll: t * (unit -> 'a) * ('a -> 'b) -> 'b val localCore: t * (unit -> 'a) * ('a -> 'b) -> 'b val localModule: t * (unit -> 'a) * ('a -> 'b) -> 'b val lookupBasid: t * Ast.Basid.t -> Basis.t option val lookupFctid: t * Ast.Fctid.t -> FunctorClosure.t option val lookupLongcon: t * Ast.Longcon.t -> (CoreML.Con.t * Scheme.t) option val lookupLongexn: t * Ast.Longcon.t -> (CoreML.Con.t * Scheme.t) option val lookupLongstrid: t * Ast.Longstrid.t -> Structure.t option val lookupLongtycon: t * Ast.Longtycon.t -> TypeStr.t option val lookupLongvar: t * Ast.Longvar.t -> (CoreML.Var.t * Scheme.t) option val lookupLongvid: t * Ast.Longvid.t -> (Vid.t * Scheme.t) option val lookupSigid: t * Ast.Sigid.t -> Interface.t option val lookupStrid: t * Ast.Strid.t -> Structure.t option val makeBasis: t * (unit -> 'a) -> 'a * Basis.t val makeInterfaceEnv: t -> InterfaceEnv.t val makeLayoutPrettyTycon: t * {prefixUnset: bool} -> {destroy: unit -> unit, layoutPrettyTycon: Tycon.t -> Layout.t, setLayoutPrettyTycon: Tycon.t * Layout.t -> unit, loopStr: Structure.t * int * Ast.Strid.t list -> unit} val makeLayoutPrettyTyconAndFlexTycon: t * InterfaceEnv.t * Interface.t option * {prefixUnset: bool} -> {destroy: unit -> unit, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyFlexTycon: Interface.FlexibleTycon.t -> Layout.t, setLayoutPrettyTycon: Tycon.t * Layout.t -> unit} val makeStructure: t * (unit -> 'a) -> 'a * Structure.t val newCons: t * {con: CoreML.Con.t, name: Ast.Con.t, scheme: Scheme.t} vector -> TypeStr.Cons.t (* openStructure (E, S) opens S in the environment E. *) val openStructure: t * Structure.t -> unit (* openBasis (E, B) opens B in the environment E. *) val openBasis: t * Basis.t -> unit val peekFix: t * Ast.Vid.t -> Ast.Fixity.t option val peekLongcon: t * Ast.Longcon.t -> (CoreML.Con.t * Scheme.t) option val processDefUse: t -> unit (* scope f evaluates f () in a new scope so that extensions that occur * during f () are forgotten afterwards. * scope works for infixes, types, values, and structures *) val scope: t * (unit -> 'a) -> 'a (* like scope, but works for bases, signatures and functors as well *) val scopeAll: t * (unit -> 'a) -> 'a val showBasis: t * File.t -> unit val sizeMessage: t -> Layout.t val snapshot: t -> (unit -> 'a) -> 'a end mlton-20210117+dfsg/mlton/elaborate/elaborate-mlbs.fun000066400000000000000000000243451416264345000225300ustar00rootroot00000000000000(* Copyright (C) 2010,2016 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaborateMLBs (S: ELABORATE_MLBS_STRUCTS): ELABORATE_MLBS = struct open S local open Control.Elaborate in val deadCode = fn () => current deadCode end structure ElabControl = Control.Elaborate fun check (c: (bool,bool) ElabControl.t, keyword: string, region) = if ElabControl.current c then () else let open Layout in Control.error (region, str (concat (if ElabControl.expert c then [keyword, " disallowed"] else [keyword, " disallowed, compile with -default-ann '", ElabControl.name c, " true'"])), empty) end local open Ast in structure Basexp = Basexp structure Basdec = Basdec structure Longstrid = Longstrid structure ModIdBind = ModIdBind end local open Env in structure Decs = Decs end structure ElaboratePrograms = ElaboratePrograms (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) local open ElaboratePrograms in structure Decs = Decs structure Env = Env end fun elaborateMLB (mlb : Basdec.t, {addPrim}) = let val decs = Buffer.new {dummy = ([], false)} val E = Env.empty () fun withDef f = ElabControl.withDef (fn () => if ElabControl.default ElabControl.forceUsed then Env.forceUsedLocal (E, f) else f ()) val emptySnapshot : (unit -> Env.Basis.t) -> Env.Basis.t = Env.snapshot E val emptySnapshot = fn (f: unit -> Env.Basis.t) => emptySnapshot (fn () => withDef f) val primBasis = emptySnapshot (fn () => (#2 o Env.makeBasis) (E, fn () => let val primDecs = addPrim E in Buffer.add (decs, (primDecs, false)) end)) fun elabProg p = ElaboratePrograms.elaborateProgram (p, {env = E}) val psi : (File.t, Env.Basis.t Promise.t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} val elabBasexpInfo = Trace.info "ElaborateMLBs.elabBasexp" val elabBasdecInfo = Trace.info "ElaborateMLBs.elabBasdec" fun elabBasexp (basexp: Basexp.t) : Env.Basis.t option = Trace.traceInfo' (elabBasexpInfo, Basexp.layout, Layout.ignore) (fn (basexp: Basexp.t) => case Basexp.node basexp of Basexp.Bas basdec => let val ((), B) = Env.makeBasis (E, fn () => elabBasdec basdec) in SOME B end | Basexp.Var basid => Env.lookupBasid (E, basid) | Basexp.Let (basdec, basexp) => Env.scopeAll (E, fn () => (elabBasdec basdec ; elabBasexp basexp))) basexp and elabBasdec (basdec: Basdec.t) : unit = Trace.traceInfo' (elabBasdecInfo, Basdec.layout, Layout.ignore) (fn (basdec: Basdec.t) => case Basdec.node basdec of Basdec.Defs def => let fun doit (lookup, extend, bnds) = Vector.foreach (Vector.map (bnds, fn {lhs, rhs} => {lhs = lhs, rhs = lookup (E, rhs)}), fn {lhs, rhs} => Option.app (rhs, fn z => extend (E, lhs, z))) in case ModIdBind.node def of ModIdBind.Fct bnds => doit (Env.lookupFctid, Env.extendFctid, bnds) | ModIdBind.Sig bnds => doit (Env.lookupSigid, Env.extendSigid, bnds) | ModIdBind.Str bnds => doit (Env.lookupStrid, Env.extendStrid, bnds) end | Basdec.Basis basbinds => let val basbinds = Vector.map (basbinds, fn {name, def} => let val B = elabBasexp def in {B = B, name = name} end) in Vector.foreach (basbinds, fn {name, B, ...} => Option.app (B, fn B => Env.extendBasid (E, name, B))) end | Basdec.Local (basdec1, basdec2) => Env.localAll (E, fn () => elabBasdec basdec1, fn () => elabBasdec basdec2) | Basdec.Seq basdecs => List.foreach(basdecs, elabBasdec) | Basdec.Open basids => Vector.foreach (Vector.map (basids, fn basid => Env.lookupBasid (E, basid)), fn bo => Option.app (bo, fn b => Env.openBasis (E, b))) | Basdec.Prog (_, prog) => let val prog = Promise.force prog in Buffer.add (decs, (Decs.toList (elabProg prog), deadCode ())) end | Basdec.MLB ({fileAbs, ...}, basdec) => let val B = HashTable.lookupOrInsert (psi, fileAbs, fn () => let val basdec = Promise.force basdec in Promise.delay (fn () => emptySnapshot (fn () => (#2 o Env.makeBasis) (E, fn () => elabBasdec basdec))) end) val B = Promise.force B handle Promise.Force => (* Basis forms a cycle; * force the AST to generate error message. *) (ignore (Promise.force basdec) ; #2 (Env.makeBasis (E, fn () => ()))) in Env.openBasis (E, B) end | Basdec.Prim => (check (ElabControl.allowPrim, "_prim", Basdec.region basdec) ; Env.openBasis (E, primBasis)) | Basdec.Ann (ann, reg, basdec) => let open ElabControl fun warn () = if !Control.warnAnn then let open Layout in Control.warning (reg, seq [str "unrecognized annotation: ", str ann], empty) end else () in case parseIdAndArgs ann of ElabControl.Bad => (warn () ; elabBasdec basdec) | ElabControl.Good (id, args) => let val restore = Args.processAnn args in Exn.finally (fn () => if equalsId (forceUsed, id) andalso enabled forceUsed then Env.forceUsedLocal (E, fn () => elabBasdec basdec) else if equalsId (ffiStr, id) then let val ffi = valOf (current ffiStr) val ffi = Longstrid.fromSymbols (List.map (String.split (ffi, #"."), Longstrid.Symbol.fromString), reg) in elabBasdec basdec before Option.app (Env.lookupLongstrid (E, ffi), fn S => (Env.Structure.ffi := SOME S ; Env.Structure.forceUsed S)) end else elabBasdec basdec, restore) end | ElabControl.Other => elabBasdec basdec | ElabControl.Proxy (alts, {deprecated}) => let val (ids, args) = List.unzip alts val () = if !Control.warnDeprecated andalso deprecated then let open Layout in Control.warning (reg, seq [str "deprecated annotation: ", str ann, str ", use ", List.layout (str o ElabControl.Id.name) ids], empty) end else () val restores = List.map (args, Args.processAnn) in Exn.finally (fn () => elabBasdec basdec, fn () => List.foreach (List.rev restores, fn restore => restore ())) end end) basdec val _ = withDef (fn () => elabBasdec mlb) in (E, Buffer.toVector decs) end end mlton-20210117+dfsg/mlton/elaborate/elaborate-mlbs.sig000066400000000000000000000014221416264345000225110ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_MLBS_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_MLBS = sig include ELABORATE_MLBS_STRUCTS val elaborateMLB: Ast.Basdec.t * {addPrim: Env.t -> CoreML.Dec.t list} -> Env.t * (CoreML.Dec.t list * bool) vector end mlton-20210117+dfsg/mlton/elaborate/elaborate-modules.fun000066400000000000000000000320631416264345000232370ustar00rootroot00000000000000(* Copyright (C) 2012,2017,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaborateModules (S: ELABORATE_MODULES_STRUCTS): ELABORATE_MODULES = struct open S local open Control.Elaborate in val resolveScope = fn () => current resolveScope end local open Ast in structure FctArg = FctArg structure Fctid = Fctid structure Longstrid = Longstrid structure SigConst = SigConst structure Sigid = Sigid structure Sigexp = Sigexp structure Strdec = Strdec structure Strexp = Strexp structure Strid = Strid structure Topdec = Topdec end local open Env in structure Decs = Decs structure FunctorClosure = FunctorClosure structure Structure = Structure end structure ElaborateSigexp = ElaborateSigexp (structure Ast = Ast structure Env = Env) structure ElaborateCore = ElaborateCore (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) val elabStrdecInfo = Trace.info "ElaborateModules.elabStrdec" val elabStrexpInfo = Trace.info "ElaborateModules.elabStrexp" val elabTopdecInfo = Trace.info "ElaborateModules.elabTopdec" fun elaborateTopdec (topdec, {env = E: Env.t}) = let fun elabSigexp (s, no) = ElaborateSigexp.elaborateSigexp (s, {env = E, nest = case no of NONE => [] | SOME n => [n]}) fun elabSigexpConstraint (cons: SigConst.t, S: Structure.t option, nest: string list) : Decs.t * Structure.t option = let fun s (sigexp, opaque) = let val prefix = case nest of [] => "" | _ => concat (List.fold (nest, [], fn (s, ac) => s :: "." :: ac)) in case S of NONE => (Decs.empty, NONE) | SOME S => let val (S, decs) = case elabSigexp (sigexp, SOME (Strid.toString Strid.uSig)) of NONE => (S, Decs.empty) | SOME I => Env.cut (E, S, I, {isFunctor = false, opaque = opaque, prefix = prefix}, Sigexp.region sigexp) in (decs, SOME S) end end in case cons of SigConst.None => (Decs.empty, S) | SigConst.Opaque sigexp => s (sigexp, true) | SigConst.Transparent sigexp => s (sigexp, false) end fun elabStrdec (arg: Strdec.t * string list): Decs.t = Trace.traceInfo' (elabStrdecInfo, Layout.tuple2 (Strdec.layout, List.layout String.layout), Decs.layout) (fn (d: Strdec.t, nest: string list) => let val d = Strdec.coalesce d val elabStrdec = fn d => elabStrdec (d, nest) val decs = case Strdec.node d of Strdec.Core d => (* rule 56 *) ElaborateCore.elaborateDec (d, {env = E, nest = nest}) | Strdec.Local (d, d') => (* rule 58 *) Env.localModule (E, fn () => elabStrdec d, fn d => Decs.append (d, elabStrdec d')) | Strdec.Seq ds => (* rule 60 *) List.fold (ds, Decs.empty, fn (d, decs) => Decs.append (decs, elabStrdec d)) | Strdec.ShowBasis file => let open Layout val () = Env.showBasis (E, file) handle exn => Control.warning (Strdec.region d, str "Exception raised processing #showBasis", align [seq [str "file: ", File.layout file], seq [str "exn: ", Exn.layout exn]]) in Decs.empty end | Strdec.Structure strbinds => (* rules 57, 61 *) let val strbinds = Vector.map (strbinds, fn {name, def, constraint} => let val nest = Strid.toString name :: nest val (decs', S) = elabStrexp (def, nest) val (decs'', S) = elabSigexpConstraint (constraint, S, nest) in {decs = Decs.append (decs', decs''), name = name, S = S} end) val () = Vector.foreach (strbinds, fn {name, S, ...} => Option.app (S, fn S => Env.extendStrid (E, name, S))) in Decs.appendsV (Vector.map (strbinds, #decs)) end val () = case resolveScope () of Control.Elaborate.ResolveScope.Strdec => (ElaborateCore.reportUnresolvedFlexRecords () ; ElaborateCore.resolveOverloads ()) | _ => () in decs end) arg and elabStrexp (arg: Strexp.t * string list): Decs.t * Structure.t option = Trace.traceInfo' (elabStrexpInfo, Layout.tuple2 (Strexp.layout, List.layout String.layout), Layout.tuple2 (Decs.layout, Option.layout Structure.layout)) (fn (e: Strexp.t, nest: string list) => let val elabStrexp = fn e => elabStrexp (e, nest) in case Strexp.node e of Strexp.App (fctid, strexp) => (* rules 54, 154 *) let val (decs, S) = elabStrexp strexp in case S of NONE => (decs, NONE) | SOME S => case Env.lookupFctid (E, fctid) of NONE => (decs, NONE) | SOME fct => let val (S, decs') = Env.cut (E, S, FunctorClosure.argInterface fct, {isFunctor = true, opaque = false, prefix = ""}, Region.append (Fctid.region fctid, Strexp.region strexp)) val resId = Strid.uRes (Fctid.toString fctid) val (decs'', S) = FunctorClosure.apply (fct, S, [Strid.toString resId]) in (Decs.appends [decs, decs', decs''], S) end end | Strexp.Constrained (e, c) => (* rules 52, 53 *) let val (decs, S) = elabStrexp e val (decs', S) = elabSigexpConstraint (c, S, nest) in (Decs.append (decs, decs'), S) end | Strexp.Let (d, e) => (* rule 55 *) Env.scope (E, fn () => let val decs = elabStrdec (d, nest) val (decs', S) = elabStrexp e in (Decs.append (decs, decs'), S) end) | Strexp.Struct d => (* rule 50 *) let val (decs, S) = Env.makeStructure (E, fn () => elabStrdec (d, nest)) in (decs, SOME S) end | Strexp.Var p => (* rule 51 *) (Decs.empty, Env.lookupLongstrid (E, p)) end) arg fun elabFunctor {arg, body, name, result}: FunctorClosure.t option = let val body = Strexp.constrained (body, result) val argId = Strid.uArg (Fctid.toString name) val (argSig, argDec) = case FctArg.node arg of FctArg.Structure (arg, argSig) => (argSig, Strdec.structuree {name = arg, def = Strexp.var (Longstrid.short argId), constraint = SigConst.None}) | FctArg.Spec spec => (Sigexp.spec spec, Strdec.openn (Vector.new1 (Longstrid.short argId))) val body = Strexp.lett (argDec, body) in Option.map (elabSigexp (argSig, SOME (Strid.toString argId)), fn argInt => Env.functorClosure (E, name, argInt, fn (formal, nest) => Env.scope (E, fn () => (Env.extendStrid (E, argId, formal) ; elabStrexp (body, nest))))) end fun elabTopdec arg: Decs.t = Trace.traceInfo' (elabTopdecInfo, Topdec.layout, Decs.layout) (fn (d: Topdec.t) => let val decs = case Topdec.node d of Topdec.Signature sigbinds => let val sigbinds = Vector.map (sigbinds, fn (sigid, sigexp) => (sigid, elabSigexp (sigexp, SOME (Sigid.toString sigid)))) val () = Vector.foreach (sigbinds, fn (sigid, I) => Option.app (I, fn I => Env.extendSigid (E, sigid, I))) in Decs.empty end | Topdec.Strdec d => elabStrdec (d, []) | Topdec.Functor funbinds => (* Rules 85, 86. Appendix A, p.58 *) let val funbinds = Vector.map (funbinds, fn {arg, body, name, result} => {closure = elabFunctor {arg = arg, body = body, name = name, result = result}, name = name}) val () = Vector.foreach (funbinds, fn {closure, name} => Option.app (closure, fn closure => Env.extendFctid (E, name, closure))) in Decs.empty end val () = case resolveScope () of Control.Elaborate.ResolveScope.Topdec => (ElaborateCore.reportUnresolvedFlexRecords () ; ElaborateCore.resolveOverloads ()) | _ => () val _ = ElaborateCore.reportUndeterminedTypes () val _ = ElaborateCore.reportSequenceNonUnit () in decs end) arg in elabTopdec topdec end val reportSequenceNonUnit = ElaborateCore.reportSequenceNonUnit val reportUndeterminedTypes = ElaborateCore.reportUndeterminedTypes val reportUnresolvedFlexRecords = ElaborateCore.reportUnresolvedFlexRecords val resolveOverloads = ElaborateCore.resolveOverloads end mlton-20210117+dfsg/mlton/elaborate/elaborate-modules.sig000066400000000000000000000017141416264345000232300ustar00rootroot00000000000000(* Copyright (C) 2012,2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_MODULES_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_MODULES = sig include ELABORATE_MODULES_STRUCTS (* Elaborate Topdec in env, returning Core ML decs. *) val elaborateTopdec: Ast.Topdec.t * {env: Env.t} -> Decs.t val reportSequenceNonUnit: unit -> unit val reportUndeterminedTypes: unit -> unit val reportUnresolvedFlexRecords: unit -> unit val resolveOverloads: unit -> unit end mlton-20210117+dfsg/mlton/elaborate/elaborate-programs.fun000066400000000000000000000026061416264345000234210ustar00rootroot00000000000000(* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaboratePrograms (S: ELABORATE_PROGRAMS_STRUCTS): ELABORATE_PROGRAMS = struct open S local open Control.Elaborate in val resolveScope = fn () => current resolveScope end structure ElaborateModules = ElaborateModules (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) fun elaborateProgram (program, {env = E: Env.t}) = let val Ast.Program.T decs = Ast.Program.coalesce program fun elabTopdec d = ElaborateModules.elaborateTopdec (d, {env = E}) val decs = List.fold (decs, Decs.empty, fn (ds, decs) => List.fold (ds, decs, fn (d, decs) => Decs.append (decs, elabTopdec d))) val () = case resolveScope () of Control.Elaborate.ResolveScope.Program => (ElaborateModules.reportUnresolvedFlexRecords () ; ElaborateModules.resolveOverloads ()) | _ => () in decs end end mlton-20210117+dfsg/mlton/elaborate/elaborate-programs.sig000066400000000000000000000013241416264345000234070ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_PROGRAMS_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_PROGRAMS = sig include ELABORATE_PROGRAMS_STRUCTS val elaborateProgram: Ast.Program.t * {env: Env.t} -> Decs.t end mlton-20210117+dfsg/mlton/elaborate/elaborate-sigexp.fun000066400000000000000000000661551416264345000230770ustar00rootroot00000000000000(* Copyright (C) 2010,2012,2015,2017 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ElaborateSigexp (S: ELABORATE_SIGEXP_STRUCTS): ELABORATE_SIGEXP = struct open S local open Ast in structure Atype = Type structure DatBind = DatBind structure DatatypeRhs = DatatypeRhs structure SharingEquation = SharingEquation structure Longstrid = Longstrid structure Longtycon = Longtycon structure Record = Record structure Sigexp = Sigexp structure Sigid = Sigid structure SortedRecord = SortedRecord structure Spec = Spec structure TypBind = TypBind structure Atyvar = Tyvar structure WhereEquation = WhereEquation end local open Env in structure Interface = Interface structure StructureTycon = struct open Tycon open TypeEnv.TyconExt end structure TyvarEnv = TyvarEnv end structure StructureEnv = Env structure Env = StructureEnv.InterfaceEnv local open Interface in structure AdmitsEquality = AdmitsEquality structure Cons = Cons structure Kind = Kind structure FlexibleTycon = FlexibleTycon structure Scheme = Scheme structure Status = Status structure Tycon = Tycon structure Type = Type structure TypeStr = TypeStr structure Tyvar = Tyvar end local open Control.Elaborate in fun check (c: (bool,bool) t, keyword: string, region) = if current c then () else let open Layout in Control.error (region, str (concat (if expert c then [keyword, " disallowed"] else [keyword, " disallowed, compile with -default-ann '", name c, " true'"])), empty) end end fun elaborateType (ty: Atype.t, E: Env.t): Type.t = let fun makeBogus (mc, ts) = let val arity = Vector.length ts val (name, region) = Option.fold (mc, ("t", NONE), fn (c, _) => (Longtycon.toString c, SOME (Longtycon.region c))) val c = StructureTycon.makeBogus {name = name, kind = Kind.Arity arity, region = region} in Type.con (Tycon.Rigid c, ts) end fun loop (ty: Atype.t): Type.t = case Atype.node ty of Atype.Var a => (* rule 44 *) (case TyvarEnv.lookupTyvar a of NONE => makeBogus (NONE, Vector.new0 ()) | SOME a => Type.var a) | Atype.Con (c, ts) => (* rules 46, 47 *) let val ts = Vector.map (ts, loop) fun normal () = case Env.lookupLongtycon (E, c) of NONE => makeBogus (SOME c, ts) | SOME s => let val kind = TypeStr.kind s val numArgs = Vector.length ts val ts = case kind of Kind.Arity n => let fun error () = let open Layout fun doit n = seq [str "[", case n of 0 => empty | 1 => str "_" | _ => seq [str "(", (seq o separate) (List.tabulate (n, fn _ => str "_"), ", "), str ")"], str "] ", Ast.Longtycon.layout c] in Control.error (Atype.region ty, seq [str "type constructor applied to incorrect number of type arguments: ", Ast.Longtycon.layout c], align [seq [str "expects: ", doit n], seq [str "but got: ", doit numArgs], seq [str "in: ", Atype.layout ty]]) end in case Int.compare (n, numArgs) of LESS => (error (); Vector.prefix (ts, n)) | EQUAL => ts | GREATER => (error () ; Vector.concat [ts, Vector.tabulate (n - numArgs, fn _ => makeBogus (NONE, Vector.new0 ()))]) end | Kind.Nary => ts in TypeStr.apply (s, ts) end in case (Ast.Longtycon.split c, Vector.length ts) of (([], c), 2) => if Ast.Tycon.equals (c, Ast.Tycon.arrow) then Type.arrow (Vector.sub (ts, 0), Vector.sub (ts, 1)) else normal () | _ => normal () end | Atype.Paren t => loop t | Atype.Record r => (* rules 45, 49 *) Type.record (SortedRecord.fromVector (Vector.map (Record.toVector r, fn (f, (_, t)) => (f, loop t)))) val ty = loop ty in ty end val elaborateType = Trace.trace ("ElaborateSigexp.elaborateType", Atype.layout o #1, Type.layout) elaborateType fun elaborateScheme (tyvars: Tyvar.t vector, ty: Atype.t, E): Scheme.t = let val ty = elaborateType (ty, E) in Scheme.make (tyvars, ty) end fun elaborateTypedescs (typedescs: {tycon: Ast.Tycon.t, tyvars: Ast.Tyvar.t vector} vector, {equality: bool}, E, nest): unit = Vector.foreach (typedescs, fn {tycon = name, tyvars} => let val admitsEquality = if equality then AdmitsEquality.Sometimes else AdmitsEquality.Never val kind = Kind.Arity (Vector.length tyvars) val prettyDefault = concat (List.separate (rev (Ast.Tycon.toString name :: nest), ".")) val flex = FlexibleTycon.new {admitsEquality = admitsEquality, hasCons = false, kind = kind, prettyDefault = prettyDefault, region = Ast.Tycon.region name} val tycon = Tycon.Flexible flex in Env.extendTycon (E, name, TypeStr.tycon (tycon, equality)) end) fun elabTypBind (typBind: TypBind.t, E, {sequential}) = let fun mkDef {def, tycon = _, tyvars} = TyvarEnv.scope (tyvars, fn tyvars => let val realization = TypeStr.def (elaborateScheme (tyvars, def, E)) val _ = TypeStr.pushSpec (realization, Ast.Type.region def) in realization end) val TypBind.T bs = TypBind.node typBind in if sequential then Vector.foreach (bs, fn b as {tycon, ...} => Env.extendTycon (E, tycon, mkDef b)) else Vector.foreach2 (bs, Vector.map (bs, mkDef), fn ({tycon, ...}, str) => Env.extendTycon (E, tycon, str)) end fun elaborateDatBind (datBind: DatBind.t, E, nest): unit = let val DatBind.T {datatypes, withtypes} = DatBind.node datBind (* Build enough of an interface so that that the constructor argument * types can be elaborated. *) val datatypes = Vector.map (datatypes, fn {cons, tycon = name, tyvars} => let val arity = Vector.length tyvars val kind = Kind.Arity arity val prettyDefault = concat (List.separate (rev (Ast.Tycon.toString name :: nest), ".")) val flex = FlexibleTycon.new {admitsEquality = AdmitsEquality.Sometimes, hasCons = true, kind = kind, prettyDefault = prettyDefault, region = Ast.Tycon.region name} val tycon = Tycon.Flexible flex val _ = Env.extendTycon (E, name, TypeStr.tycon (tycon, false)) in {cons = cons, flex = flex, name = name, tycon = tycon, tyvars = tyvars} end) val _ = if TypBind.isEmpty withtypes then () else check (Control.Elaborate.allowSigWithtype, "withtype in signatures", TypBind.region withtypes) (* To match semantics of withtype in Core, * type binds are elaborated simultaneously. *) val _ = elabTypBind (withtypes, E, {sequential = false}) val datatypes = Vector.map (datatypes, fn {cons, flex, name, tycon, tyvars} => let val cons = Vector.map (cons, fn (name, arg) => TyvarEnv.scope (tyvars, fn tyvars => {arg = Option.map (arg, fn t => elaborateType (t, E)), name = name, tyvars = tyvars})) in {cons = cons, flex = flex, name = name, tycon = tycon} end) (* Maximize equality *) val change = ref false fun loop () = let val _ = Vector.foreach (datatypes, fn {cons, flex, ...} => let val isEquality = ref true val () = Vector.foreach (cons, fn {arg, tyvars, ...} => Option.foreach (arg, fn arg => let val argScheme = Scheme.make (tyvars, arg) in if Scheme.admitsEquality argScheme then () else isEquality := false end)) datatype z = datatype AdmitsEquality.t in case FlexibleTycon.admitsEquality flex of Always => Error.bug "ElaborateSigexp.elaborateDatBind: Always" | Never => () | Sometimes => if !isEquality then () else (FlexibleTycon.setAdmitsEquality (flex, Never) ; change := true) end) in if !change then (change := false; loop ()) else () end val () = loop () val () = Vector.foreach (datatypes, fn {cons, name, tycon, ...} => let val cons = Vector.map (cons, fn {arg, name, tyvars} => let val res = Type.con (tycon, Vector.map (tyvars, Type.var)) val ty = case arg of NONE => res | SOME arg => Type.arrow (arg, res) val scheme = Scheme.make (tyvars, ty) val () = Env.extendCon (E, name, scheme) in {name = name, scheme = scheme} end) val () = Env.rebindTycon (E, name, TypeStr.data (tycon, Cons.fromVector cons, false)) in () end) in () end val traceElaborateSigexp = Trace.trace2 ("ElaborateSigexp.elaborateSigexp", Sigexp.layout, fn {isTop, nest} => Layout.record [("isTop", Bool.layout isTop), ("nest", List.layout Layout.str nest)], Option.layout Interface.layout) val traceElaborateSpec = Trace.trace2 ("ElaborateSigexp.elaborateSpec", Spec.layout, fn {nest} => Layout.record [("nest", List.layout Layout.str nest)], Unit.layout) (* rule 65 *) fun elaborateSigexp (sigexp: Sigexp.t, {env = E: StructureEnv.t, nest: string list}): Interface.t option = let val strE = E val E = StructureEnv.makeInterfaceEnv E fun elaborateSigexp arg : Interface.t option = traceElaborateSigexp (fn (sigexp: Sigexp.t, {isTop, nest}) => case Sigexp.node sigexp of Sigexp.Spec spec => (* rule 62 *) SOME (#1 (Env.makeInterface (E, {isTop = isTop}, fn () => elaborateSpec (spec, {nest = nest})))) | Sigexp.Var x => (* rule 63 *) Option.map (Env.lookupSigid (E, x), Interface.copy) | Sigexp.Where {sigexp, equations} => (* rule 64 *) let val time = Interface.Time.tick () in Option.map (elaborateSigexp (sigexp, {isTop = false, nest = nest}), fn I => let val {layoutPrettyTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon, ...} = StructureEnv.makeLayoutPrettyTyconAndFlexTycon (strE, E, SOME I, {prefixUnset = true}) val _ = Vector.foreach (equations, fn eqn => case WhereEquation.node eqn of WhereEquation.Type {longtycon, ty, tyvars} => Option.app (Interface.lookupLongtycon (I, longtycon, Longtycon.region longtycon, {prefix = []}), fn (name, s) => let val realization = TyvarEnv.scope (tyvars, fn tyvars => TypeStr.def (elaborateScheme (tyvars, ty, E))) in TypeStr.wheree {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, realization = realization, region = WhereEquation.region eqn, time = time, ty = {name = fn () => Longtycon.layout longtycon, region = Longtycon.region longtycon, spec = Ast.Tycon.region name, tyStr = s}} end)) in I end) end) arg and elaborateSpec arg : unit = traceElaborateSpec (fn (spec: Spec.t, {nest}) => case Spec.node spec of Spec.Datatype rhs => (* rules 71, 72 *) (case DatatypeRhs.node rhs of DatatypeRhs.DatBind b => elaborateDatBind (b, E, nest) | DatatypeRhs.Repl {lhs, rhs} => Option.app (Env.lookupLongtycon (E, rhs), fn s => let val _ = TypeStr.pushSpec (s, Longtycon.region rhs) val _ = Env.extendTycon (E, lhs, TypeStr.repl s) val _ = Vector.foreach (Cons.dest (TypeStr.cons s), fn {name, scheme} => Env.extendCon (E, name, scheme)) in () end)) | Spec.Empty => (* rule 76 *) () | Spec.Eqtype typedescs => (* rule 70 *) elaborateTypedescs (typedescs, {equality = true}, E, nest) | Spec.Exception cons => (* rule 73 *) Vector.foreach (cons, fn (name: Ast.Con.t, arg: Ast.Type.t option) => let val ty = case arg of NONE => Type.exn | SOME t => let val t = elaborateType (t, E) in Type.arrow (t, Type.exn) end val scheme = Scheme.make (Vector.new0 (), ty) val _ = Env.extendExn (E, name, scheme) in () end) | Spec.IncludeSigexp sigexp => (* rule 75 *) Option.app (elaborateSigexp (sigexp, {isTop = false, nest = nest}), fn I => Env.openInterface (E, I, Sigexp.region sigexp)) | Spec.IncludeSigids sigids => (* Appendix A, p.59 *) Vector.foreach (sigids, fn x => Option.app (Env.lookupSigid (E, x), fn I => Env.openInterface (E, Interface.copy I, Sigid.region x))) | Spec.Seq (s, s') => (* rule 77 *) (elaborateSpec (s, {nest = nest}) ; elaborateSpec (s', {nest = nest})) | Spec.Sharing {equation, spec} => (* rule 78 and section G.3.3 *) let val time = Interface.Time.tick () (* Reifying the interface of spec is expensive, * so collect all `sharing` equations that * constrain the same spec. *) val (spec, equations) = let fun loop (spec, equations) = case Spec.node spec of Spec.Sharing {equation, spec} => loop (spec, equation::equations) | _ => (spec, equations) in loop (spec, [equation]) end val (I, _) = Env.makeInterface (E, {isTop = false}, fn () => elaborateSpec (spec, {nest = nest})) val () = Env.openInterface (E, I, Spec.region spec) val {layoutPrettyTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon, ...} = StructureEnv.makeLayoutPrettyTyconAndFlexTycon (strE, E, NONE, {prefixUnset = true}) val () = List.foreach (equations, fn eqn => case SharingEquation.node eqn of SharingEquation.Structure ss => let (* The following implements the "all * pairs" sharing as specified in * Appendix A (and described in * Appendix G.3.3). *) fun loop Is = case Is of [] => () | (long1, I1) :: Is => (List.foreach (Is, fn (long2, I2) => Interface.share {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, I1 = I1, long1 = long1, I2 = I2, long2 = long2, region = SharingEquation.region eqn, time = time}) ; loop Is) val Is = List.keepAllMap (ss, fn s => Option.map (Interface.lookupLongstrid (I, s, Longstrid.region s, {prefix = []}), fn I => (s, I))) in loop Is end | SharingEquation.Type cs => ignore (List.fold (cs, NONE, fn (c', so) => case (so, Interface.lookupLongtycon (I, c', Longtycon.region c', {prefix = []})) of (NONE, NONE) => NONE | (SOME _, NONE) => so | (NONE, SOME (n', s')) => SOME (c', n', s') | (SOME (c, n, s), SOME (n', s')) => let fun mkTy (c, n, s) = {name = fn () => Longtycon.layout c, region = Longtycon.region c, spec = Ast.Tycon.region n, tyStr = s} val _ = TypeStr.share {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, region = SharingEquation.region eqn, time = time, ty1 = mkTy (c, n, s), ty2 = mkTy (c', n', s')} in SOME (c', n', s') end))) in () end | Spec.Structure ss => (* rules 74, 84 *) let val ss = Vector.map (ss, fn (strid, sigexp) => (strid, case elaborateSigexp (sigexp, {isTop = false, nest = (Ast.Strid.toString strid)::nest}) of NONE => Interface.empty | SOME I => I)) in Vector.foreach (ss, fn (strid, I) => Env.extendStrid (E, strid, I)) end | Spec.Type typedescs => (* rule 69 *) elaborateTypedescs (typedescs, {equality = false}, E, nest) | Spec.TypeDefs typBind => (* Abbreviation on page 59 combined with rules 77 and 80. *) elabTypBind (typBind, E, {sequential = true}) | Spec.Val xts => (* rules 68, 79 *) Vector.foreach (xts, fn (x, t) => Env.extendVid (E, Ast.Vid.fromVar x, Status.Var, let val tyvars = let val tyvars = ref [] fun loop t = case Ast.Type.node t of Atype.Var a => if List.contains (!tyvars, a, Atyvar.equals) then () else List.push (tyvars, a) | Atype.Con (_, ts) => Vector.foreach (ts, loop) | Atype.Paren t => loop t | Atype.Record r => Record.foreach (r, loop o #2) val () = loop t in Vector.fromListRev (!tyvars) end in TyvarEnv.scope (tyvars, fn tyvars => elaborateScheme (tyvars, t, E)) end))) arg in elaborateSigexp (sigexp, {isTop = true, nest = nest}) end val elaborateSigexp = fn (sigexp, {env = E, nest}) => case Sigexp.node sigexp of Sigexp.Var x => StructureEnv.lookupSigid (E, x) | _ => elaborateSigexp (sigexp, {env = E, nest = nest}) val elaborateSigexp = Trace.trace2 ("ElaborateSigexp.elaborateSigexp", Sigexp.layout, Layout.ignore, Layout.ignore) elaborateSigexp structure Env = StructureEnv end mlton-20210117+dfsg/mlton/elaborate/elaborate-sigexp.sig000066400000000000000000000011701416264345000230530ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_SIGEXP_STRUCTS = sig structure Ast: AST structure Env: ELABORATE_ENV sharing Ast = Env.Ast end signature ELABORATE_SIGEXP = sig include ELABORATE_SIGEXP_STRUCTS val elaborateSigexp: Ast.Sigexp.t * {env: Env.t, nest: string list} -> Env.Interface.t option end mlton-20210117+dfsg/mlton/elaborate/elaborate.fun000066400000000000000000000014611416264345000215670ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Elaborate (S: ELABORATE_STRUCTS): ELABORATE = struct open S structure Env = ElaborateEnv (structure Ast = Ast structure CoreML = CoreML structure TypeEnv = TypeEnv) local open Env in structure Decs = Decs end structure ElaborateMLBs = ElaborateMLBs (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) open ElaborateMLBs end mlton-20210117+dfsg/mlton/elaborate/elaborate.sig000066400000000000000000000015211416264345000215560ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure TypeEnv: TYPE_ENV sharing Ast.Record = CoreML.Record sharing Ast.SortedRecord = CoreML.SortedRecord sharing CoreML.Atoms = TypeEnv.Atoms sharing CoreML.Type = TypeEnv.Type end signature ELABORATE = sig include ELABORATE_STRUCTS structure Env: ELABORATE_ENV val elaborateMLB: Ast.Basdec.t * {addPrim: Env.t -> CoreML.Dec.t list} -> Env.t * (CoreML.Dec.t list * bool) vector end mlton-20210117+dfsg/mlton/elaborate/interface.fun000066400000000000000000002005501416264345000215710ustar00rootroot00000000000000(* Copyright (C) 2009,2015,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Interface (S: INTERFACE_STRUCTS): INTERFACE = struct open S local open Layout in val align = align val empty = empty val seq = seq val str = str val bracket = fn l => seq [str "[", l, str "]"] end local open Ast in structure Longstrid = Longstrid structure Longtycon = Longtycon structure Record = SortedRecord structure Strid = Strid structure Vid = Vid end structure Etycon = EnvTycon structure EtypeStr = EnvTypeStr structure Set = DisjointSet structure Status: sig datatype t = Con | Exn | Var val layout: t -> Layout.t val toString: t -> string end = struct datatype t = Con | Exn | Var val toString = fn Con => "Con" | Exn => "Exn" | Var => "Var" val layout = Layout.str o toString end (* only needed for debugging *) structure TyconId = IntUniqueId () structure Defn = struct type t = exn val layoutRef: (t -> Layout.t) ref = ref (fn _ => Layout.empty) fun layout d = (!layoutRef) d end structure Time:> sig type t val < : t * t -> bool val current: unit -> t val layout: t -> Layout.t val min: t * t -> t val tick: unit -> t end = struct type t = int val op < = Int.< val layout = Int.layout val min = Int.min val currentTime: int ref = ref 0 fun current () = !currentTime fun tick () = let val n = 1 + !currentTime val _ = currentTime := n in n end end structure FlexibleTycon = struct (* hasCons is true if this tycon occurs in any type structure where the * cons are nonempty. This allows us to do a quick check of the side * condition on rule 64 that requires all type structures to be well-formed * when implementing "where type". *) datatype t = T of {admitsEquality: AdmitsEquality.t ref, copy: copy, creationTime: Time.t, defn: exn ref, hasCons: bool, id: TyconId.t, kind: Kind.t, plist: PropertyList.t, prettyDefault: string, specs: Region.t AppendList.t ref} Set.t withtype copy = t option ref fun fields (T s) = Set.! s local fun make f = f o fields in val admitsEquality = ! o make #admitsEquality val defnRef = make #defn val defn = ! o defnRef val hasCons = make #hasCons val kind = make #kind val plist = make #plist val prettyDefault = make #prettyDefault fun setAdmitsEquality (f, ae) = (make #admitsEquality f) := ae val specsRef = make #specs val specs = ! o specsRef end val layoutPrettyDefault = Layout.str o prettyDefault fun dest fc = let val {admitsEquality, hasCons, kind, prettyDefault, ...} = fields fc in {admitsEquality = !admitsEquality, hasCons = hasCons, kind = kind, prettyDefault = prettyDefault} end val equals = fn (T s, T s') => Set.equals (s, s') fun layout fc = let open Layout val {admitsEquality, creationTime, defn, hasCons, id, kind, prettyDefault, ...} = fields fc in record [("admitsEquality", AdmitsEquality.layout (!admitsEquality)), ("creationTime", Time.layout creationTime), ("defn", Defn.layout (!defn)), ("hasCons", Bool.layout hasCons), ("id", TyconId.layout id), ("kind", Kind.layout kind), ("prettyDefault", String.layout prettyDefault)] end val copies: copy list ref = ref [] fun make {admitsEquality: AdmitsEquality.t, defn: Defn.t, hasCons: bool, kind: Kind.t, prettyDefault: string, specs: Region.t AppendList.t}: t = T (Set.singleton {admitsEquality = ref admitsEquality, copy = ref NONE, creationTime = Time.current (), defn = ref defn, hasCons = hasCons, id = TyconId.new (), kind = kind, plist = PropertyList.new (), prettyDefault = prettyDefault, specs = ref specs}) fun pushSpec (fc, region) = let val specsRef = specsRef fc in specsRef := AppendList.snoc (!specsRef, region) end end structure Tycon = struct datatype t = Flexible of FlexibleTycon.t | Rigid of Etycon.t val fromEnv: Etycon.t -> t = Rigid fun admitsEquality c = case c of Flexible f => FlexibleTycon.admitsEquality f | Rigid c => Etycon.admitsEquality c val arrow = fromEnv Etycon.arrow val equals = fn (Flexible f, Flexible f') => FlexibleTycon.equals (f, f') | (Rigid c, Rigid c') => Etycon.equals (c, c') | _ => false val exn = Rigid Etycon.exn val kind = fn Flexible f => FlexibleTycon.kind f | Rigid c => Etycon.kind c val layout = fn Flexible f => FlexibleTycon.layout f | Rigid c => Etycon.layout c val tuple = Rigid Etycon.tuple fun layoutAppPretty (c, ts, {layoutPrettyEnvTycon, layoutPrettyFlexTycon}) = case c of Flexible f => EnvTycon.layoutAppPrettyNormal (layoutPrettyFlexTycon f, ts) | Rigid c => EnvTycon.layoutAppPretty (c, ts, {layoutPretty = layoutPrettyEnvTycon}) end structure Type = struct datatype t = Con of Tycon.t * t vector | Record of t Record.t | Var of Tyvar.t fun arrow (t1, t2) = Con (Tycon.arrow, Vector.new2 (t1, t2)) val con = Con fun deArrowOpt (t: t): (t * t) option = case t of Con (c, ts) => if Tycon.equals (c, Tycon.arrow) then SOME (Vector.sub (ts, 0), Vector.sub (ts, 1)) else NONE | _ => NONE fun deArrow t = case deArrowOpt t of NONE => Error.bug "Interface.Type.deArrow" | SOME z => z fun deEta (t: t, tyvars: Tyvar.t vector): Tycon.t option = case t of Con (c, ts) => if Vector.length ts = Vector.length tyvars andalso Vector.foralli (ts, fn (i, t) => case t of Var a => Tyvar.equals (a, Vector.sub (tyvars, i)) | _ => false) then SOME c else NONE | _ => NONE val exn = Con (Tycon.exn, Vector.new0 ()) fun hom (t, {con, record, var}) = let val rec loop = fn Con (c, ts) => con (c, Vector.map (ts, loop)) | Record r => record (Record.map (r, loop)) | Var a => var a in loop t end local open Layout in fun layout t = case t of Con (c, ts) => paren (align [seq [str "Con ", Tycon.layout c], Vector.layout layout ts]) | Record r => Record.layout {record = r, separator = ": ", extra = "", layoutTuple = Vector.layout layout, layoutElt = layout} | Var a => paren (seq [str "Var ", Tyvar.layout a]) end val record = Record fun substitute (t: t, sub: (Tyvar.t * t) vector): t = let fun var a = case Vector.peek (sub, fn (a', _) => Tyvar.equals (a, a')) of NONE => Error.bug "Interface.Type.substitute" | SOME (_, t) => t in hom (t, {con = Con, record = Record, var = var}) end val var = Var end structure Scheme = GenericScheme (structure Type = Type structure Tyvar = Tyvar) structure Scheme = struct open Scheme fun kind (T {tyvars, ...}) = Kind.Arity (Vector.length tyvars) fun make (tyvars, ty) = T {ty = ty, tyvars = tyvars} fun fromTycon tycon = let val kind = Tycon.kind tycon val arity = case kind of Kind.Arity arity => arity | Kind.Nary => Error.bug "Interface.Scheme.fromTycon: Kind.Nary" val tyvars = Vector.tabulate (arity, fn _ => Tyvar.makeNoname {equality = false}) in make (tyvars, Type.con (tycon, Vector.map (tyvars, Type.var))) end end structure Cons : sig type t val dest: t -> {name: Ast.Con.t, scheme: Scheme.t} vector val empty: t val fromSortedVector: {name: Ast.Con.t, scheme: Scheme.t} vector -> t val fromVector: {name: Ast.Con.t, scheme: Scheme.t} vector -> t val layout: t -> Layout.t val map: t * ({name: Ast.Con.t, scheme: Scheme.t} -> {scheme: Scheme.t}) -> t end = struct datatype t = T of {name: Ast.Con.t, scheme: Scheme.t} vector fun dest (T v) = v val fromSortedVector = T fun fromVector v = (fromSortedVector o QuickSort.sortVector) (v, fn ({name = name1, ...}, {name = name2, ...}) => case Ast.Con.compare (name1, name2) of LESS => true | EQUAL => true | GREATER => false) val empty = T (Vector.new0 ()) fun map (T v, f) = (T o Vector.map) (v, fn elt as {name, ...} => let val {scheme} = f elt in {name = name, scheme = scheme} end) fun layout (T v) = Vector.layout (fn {name, scheme} => let open Layout in seq [Ast.Con.layout name, str ": ", Scheme.layout scheme] end) v end structure TypeStr = struct datatype node = Datatype of {tycon: Tycon.t, cons: Cons.t, repl: bool} | Scheme of Scheme.t | Tycon of {eq: bool, tycon: Tycon.t} type t = node val node = fn s => s fun kind s = case node s of Datatype {tycon, ...} => Tycon.kind tycon | Scheme s => Scheme.kind s | Tycon {tycon, ...} => Tycon.kind tycon fun layout t = let open Layout in case node t of Datatype {tycon, cons, repl} => seq [str "Datatype ", record [("tycon", Tycon.layout tycon), ("cons", Cons.layout cons), ("repl", Bool.layout repl)]] | Scheme s => Scheme.layout s | Tycon {eq, tycon} => seq [str "Tycon ", record [("eq", Bool.layout eq), ("tycon", Tycon.layout tycon)]] end fun apply (t: t, tys: Type.t vector): Type.t = case node t of Datatype {tycon, ...} => Type.con (tycon, tys) | Scheme s => Scheme.apply (s, tys) | Tycon {tycon, ...} => Type.con (tycon, tys) val apply = Trace.trace ("Interface.TypeStr.apply", Layout.tuple2 (layout, Vector.layout Type.layout), Type.layout) apply fun cons t = case node t of Datatype {cons, ...} => cons | _ => Cons.empty fun data (tycon, cons, repl) = Datatype {tycon = tycon, cons = cons, repl = repl} val def = Scheme fun tycon (tycon, eq) = Tycon {eq = eq, tycon = tycon} local fun tyconAsScheme c = def (Scheme.fromTycon c) in fun repl (t: t) = case node t of Datatype {tycon, cons, ...} => data (tycon, cons, true) | Scheme _ => t | Tycon {tycon, ...} => tyconAsScheme tycon fun abs (t: t) = case node t of Datatype {tycon, ...} => tyconAsScheme tycon | Scheme _ => t | Tycon {tycon, ...} => tyconAsScheme tycon end end structure Defn = struct open Defn datatype dest = Realized of EtypeStr.t | TypeStr of TypeStr.t | Undefined exception U of dest val realized = U o Realized val typeStr = U o TypeStr val undefined = U Undefined fun dest (d: t): dest = case d of U u => u | _ => Error.bug "Interface.Defn.dest" val () = layoutRef := (fn d => let open Layout in case dest d of Realized s => seq [str "Realized ", EtypeStr.layout s] | TypeStr s => seq [str "TypeStr ", TypeStr.layout s] | Undefined => str "Undefined" end) end (* expandTy expands all type definitions in ty *) local fun con (c, ts) = case c of Tycon.Flexible f => (case Defn.dest (FlexibleTycon.defn f) of Defn.Realized _ => Error.bug "Interface.expandTy: Realized" | Defn.TypeStr s => expandTy (TypeStr.apply (s, ts)) | Defn.Undefined => Type.Con (c, ts)) | Tycon.Rigid _ => Type.Con (c, ts) and expandTy (ty: Type.t): Type.t = Type.hom (ty, {con = con, record = Type.Record, var = Type.Var}) in val expandTy = expandTy end structure Type = struct open Type fun layoutPretty (ty, {expand, layoutPrettyEnvTycon, layoutPrettyFlexTycon, layoutPrettyTyvar}) = let fun con (c, ts) = Tycon.layoutAppPretty (c, ts, {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon}) fun record r = case Record.detupleOpt r of NONE => (LayoutPretty.simple o seq) [str "{", Layout.mayAlign (Layout.separateRight (Vector.toListMap (Record.toVector r, fn (f, (t, _)) => seq [Record.Field.layout f, str ": ", t]), ",")), str "}"] | SOME ts => con (Tycon.tuple, ts) fun var a = LayoutPretty.simple (layoutPrettyTyvar a) val ty = if expand then expandTy ty else ty in Type.hom (ty, {con = con, record = record, var = var}) end fun explainDoesNotAdmitEquality (ty, {layoutPrettyEnvTycon, layoutPrettyFlexTycon}) = let val layoutAppPretty = fn (c, ls) => Tycon.layoutAppPretty (c, ls, {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon}) val bracket = LayoutPretty.bracket val dontCare = LayoutPretty.dontCare fun getLay lo = Option.fold (lo, dontCare, #1) fun con (c, los) = case Tycon.admitsEquality c of AdmitsEquality.Always => NONE | AdmitsEquality.Sometimes => if Vector.forall (los, Option.isNone) then NONE else (SOME o layoutAppPretty) (c, Vector.map (los, getLay)) | AdmitsEquality.Never => (SOME o bracket o layoutAppPretty) (c, Vector.map (los, fn _ => dontCare)) fun record r = case Record.detupleOpt r of NONE => let val v = Record.toVector r val (fls, extra) = Vector.fold (v, ([], false), fn ((f, lo), (fls, extra)) => case lo of NONE => (fls, true) | SOME l => ((f,l)::fls, extra)) in if List.isEmpty fls then NONE else (SOME o LayoutPretty.simple o seq) [str "{", Layout.mayAlign (Layout.separateRight (List.revMap (fls, fn (f, (l, _)) => seq [Record.Field.layout f, str ": ", l]), ",")), if extra then str ", ...}" else str "}"] end | SOME los => con (Tycon.tuple, los) fun var _ = NONE val ty = expandTy ty val res = Type.hom (ty, {con = con, record = record, var = var}) in Option.map (res, #1) end end structure TypeStr = struct open TypeStr fun toTyconOpt (s, {expand}) = let val s = if expand then abs s else s in case node s of Datatype {tycon, ...} => SOME tycon | Scheme s => let val Scheme.T {tyvars, ty} = s val ty = if expand then expandTy ty else ty in case Type.deEta (ty, tyvars) of NONE => NONE | SOME c => if Tycon.equals (c, Tycon.arrow) orelse Tycon.equals (c, Tycon.tuple) then NONE else SOME c end | Tycon {tycon, ...} => SOME tycon end end fun copyCons cons: Cons.t = Cons.map (cons, fn {scheme, ...} => {scheme = copyScheme scheme}) and copyDefn (d: Defn.t): Defn.t = let open Defn in case dest d of Realized _ => (* This will never happen in a type-correct program, but it may * in a type-incorrect one. So, we return d to avoid terminating * MLton. *) d | TypeStr s => Defn.typeStr (copyTypeStr s) | Undefined => Defn.undefined end and copyFlexibleTycon (fc: FlexibleTycon.t): FlexibleTycon.t = let open FlexibleTycon val {admitsEquality, copy, defn, hasCons, kind, prettyDefault, specs, ...} = fields fc in case !copy of NONE => let val fc' = make {admitsEquality = !admitsEquality, defn = copyDefn (!defn), hasCons = hasCons, kind = kind, prettyDefault = prettyDefault, specs = !specs} val _ = List.push (copies, copy) val _ = copy := SOME fc' in fc' end | SOME fc' => fc' end and copyTycon (t: Tycon.t): Tycon.t = let open Tycon in case t of Flexible c => Flexible (copyFlexibleTycon c) | Rigid _ => t end and copyType (t: Type.t): Type.t = let open Type in hom (t, {con = fn (c, ts) => Con (copyTycon c, ts), record = Record, var = Var}) end and copyScheme (Scheme.T {tyvars, ty}): Scheme.t = Scheme.T {ty = copyType ty, tyvars = tyvars} and copyTypeStr (s: TypeStr.t): TypeStr.t = let open TypeStr in case node s of Datatype {cons, tycon, repl} => data (copyTycon tycon, copyCons cons, repl) | Scheme s => def (copyScheme s) | Tycon {eq, tycon = c} => tycon (copyTycon c, eq) end structure AdmitsEquality = struct open AdmitsEquality fun fromBool b = if b then Sometimes else Never end fun flexibleTyconAdmitsEquality (fc: FlexibleTycon.t): AdmitsEquality.t = let val {admitsEquality, defn, ...} = FlexibleTycon.fields fc datatype z = datatype Defn.dest in case Defn.dest (!defn) of Realized _ => !admitsEquality | TypeStr s => typeStrAdmitsEquality s | Undefined => !admitsEquality end and schemeAdmitsEquality (s: Scheme.t): bool = let fun con (c, bs) = let datatype z = datatype AdmitsEquality.t in case Tycon.admitsEquality c of Always => true | Never => false | Sometimes => Vector.forall (bs, fn b => b) end in Type.hom (expandTy (Scheme.ty s), {con = con, record = fn r => Record.forall (r, fn b => b), var = fn _ => true}) end and tyconAdmitsEquality (t: Tycon.t): AdmitsEquality.t = let datatype z = datatype Tycon.t in case t of Flexible c => flexibleTyconAdmitsEquality c | Rigid e => Etycon.admitsEquality e end and typeStrAdmitsEquality (s: TypeStr.t): AdmitsEquality.t = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {tycon = c, ...} => tyconAdmitsEquality c | Scheme s => AdmitsEquality.fromBool (schemeAdmitsEquality s) | Tycon {tycon = c, ...} => tyconAdmitsEquality c end structure FlexibleTycon = struct open FlexibleTycon fun new {admitsEquality: AdmitsEquality.t, hasCons: bool, kind: Kind.t, prettyDefault: string, region: Region.t}: t = make {admitsEquality = admitsEquality, defn = Defn.undefined, hasCons = hasCons, kind = kind, prettyDefault = prettyDefault, specs = AppendList.single region} fun realize (fc, typeStr) = let val defn = defnRef fc in case Defn.dest (!defn) of Defn.Undefined => defn := Defn.realized typeStr | _ => Error.bug "Interface.FlexibleTycon.realize" end fun share (fc1 as T s1, fc2 as T s2, sharingSpec) = let val {admitsEquality = ae1, creationTime = t1, hasCons = hc1, specs = ss1, id, kind, plist, prettyDefault, ...} = fields fc1 val {admitsEquality = ae2, creationTime = t2, hasCons = hc2, specs = ss2, ...} = fields fc2 val _ = Set.union (s1, s2) val specs = AppendList.snoc (if Ref.equals (ss1, ss2) then !ss1 else AppendList.append (!ss1, !ss2), sharingSpec) val _ = Set.:= (s1, {admitsEquality = ref (AdmitsEquality.or (!ae1, !ae2)), copy = ref NONE, creationTime = Time.min (t1, t2), defn = ref Defn.undefined, specs = ref specs, hasCons = hc1 orelse hc2, id = id, kind = kind, plist = plist, prettyDefault = prettyDefault}) in () end type typeStr = TypeStr.t datatype realization = ETypeStr of EnvTypeStr.t | TypeStr of typeStr fun realization (f: t): realization option = case Defn.dest (defn f) of Defn.Realized s => SOME (ETypeStr s) | Defn.TypeStr s => SOME (TypeStr s) | Defn.Undefined => NONE end structure Scheme = struct open Scheme val admitsEquality = schemeAdmitsEquality val copy = copyScheme end structure TypeStr = struct open TypeStr val admitsEquality = typeStrAdmitsEquality val copy = copyTypeStr fun specs (s, first) = let fun loop s = case toTyconOpt (s, {expand = false}) of NONE => AppendList.empty | SOME c => loopTycon c and loopTycon c = case c of Tycon.Flexible fc => AppendList.append (FlexibleTycon.specs fc, case Defn.dest (FlexibleTycon.defn fc) of Defn.Realized _ => AppendList.empty | Defn.TypeStr s => loop s | Defn.Undefined => AppendList.empty) | Tycon.Rigid _ => AppendList.empty in first :: (List.rev o AppendList.fold) (loop s, [], fn (r, rs) => if List.contains (first::rs, r, Region.equals) then rs else r :: rs) end fun pushSpec (s, region) = case TypeStr.toTyconOpt (s, {expand = false}) of NONE => () | SOME (Tycon.Flexible flex) => FlexibleTycon.pushSpec (flex, region) | SOME (Tycon.Rigid _) => () fun getFlex {layoutPrettyEnvTycon, layoutPrettyFlexTycon, oper: string, time: Time.t, ty = {name: unit -> Layout.t, region: Region.t, spec: Region.t, tyStr: t}}: FlexibleTycon.t option = let fun error what = let val isEmpty = Layout.isEmpty val tuple = Layout.tuple val {layoutPretty = layoutPrettyTyvar, localInit = localInitLayoutPrettyTyvar, ...} = Tyvar.makeLayoutPretty () val arity = case kind tyStr of Kind.Arity arity => arity | _ => Error.bug "Interface.TypeStr.getFlex: Kind.Nary" val tyvars = Vector.tabulate (arity, fn _ => Tyvar.makeNoname {equality = false}) val () = localInitLayoutPrettyTyvar tyvars val tyargs = Vector.map (tyvars, Type.var) val tyvars = Vector.map (tyvars, layoutPrettyTyvar) val tyvars = case Vector.length tyvars of 0 => empty | 1 => Vector.first tyvars | _ => tuple (Vector.toList tyvars) val (kw, mkRest) = case TypeStr.node tyStr of TypeStr.Datatype _ => ("datatype", fn l => seq [str "... (* = datatype ", l, str " *)"]) | TypeStr.Scheme _ => ("type", fn l => l) | TypeStr.Tycon _ => ("type", fn l => l) val defn = TypeStr.apply (tyStr, tyargs) val () = Control.error (region, seq [str "type cannot be ", str oper, str " (", str what, str "): ", name ()], align ((seq [str "type spec: ", str kw, str " ", tyvars, if isEmpty tyvars then empty else str " ", name (), str " = ", mkRest ((#1 o Type.layoutPretty) (defn, {expand = true, layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, layoutPrettyTyvar = layoutPrettyTyvar}))]):: (List.map (specs (tyStr, spec), fn r => seq [str "spec at: ", Region.layout r])))) in NONE end in case toTyconOpt (tyStr, {expand = true}) of NONE => error "defined" | SOME c => (case c of Tycon.Flexible c => let val {creationTime, defn, ...} = FlexibleTycon.fields c in case Defn.dest (!defn) of Defn.Realized _ => Error.bug "Interface.TypeStr.getFlex: Realized" | Defn.TypeStr _ => Error.bug "Interface.TypeStr.getFlex: TypeStr" | Defn.Undefined => if Time.< (creationTime, time) then error "not local" else SOME c end | Tycon.Rigid _ => error "defined") end fun share {layoutPrettyEnvTycon, layoutPrettyFlexTycon, region: Region.t, time: Time.t, ty1 as {name = name1, ...}, ty2 as {name = name2, ...}} = case (getFlex {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, oper = "shared", time = time, ty = ty1}, getFlex {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, oper = "shared", time = time, ty = ty2}) of (NONE, _) => () | (_, NONE) => () | (SOME flex1, SOME flex2) => if Kind.equals (FlexibleTycon.kind flex1, FlexibleTycon.kind flex2) then FlexibleTycon.share (flex1, flex2, region) else let fun msg {name, region = _, spec, tyStr} = let val (keyword, rest) = case node tyStr of Datatype _ => ("datatype", str " = ...") | Scheme _ => ("type", str " = ...") | Tycon {eq, ...} => if eq then ("eqtype", empty) else ("type", empty) val arity = case kind tyStr of Kind.Arity arity => arity | _ => Error.bug "Interface.TypeStr.share.msg: arity" val tyvars = Vector.tabulate (arity, fn _ => Tyvar.makeNoname {equality = false}) val {layoutPretty = layoutPrettyTyvar, localInit = localInitLayoutPrettyTyvar, ...} = Tyvar.makeLayoutPretty () val () = localInitLayoutPrettyTyvar tyvars val tyvars = case Vector.length tyvars of 0 => empty | 1 => layoutPrettyTyvar (Vector.first tyvars) | _ => Layout.tuple (Vector.toListMap (tyvars, layoutPrettyTyvar)) in (seq [str "type spec: ", str keyword, str " [", tyvars, str "] ", name (), rest]):: (List.map (specs (tyStr, spec), fn r => seq [str "spec at: ", Region.layout r])) end in Control.error (region, seq [str "types cannot be shared (arity): ", name1 (), str ", ", name2 ()], align ((msg ty1) @ (msg ty2))) end val share = Trace.trace ("Interface.TypeStr.share", fn {time, ty1, ty2, ...} => Layout.record [("time", Time.layout time), ("ty1", Layout.record [("tyStr", layout (#tyStr ty1))]), ("ty2", Layout.record [("tyStr", layout (#tyStr ty2))])], Unit.layout) share fun wheree {layoutPrettyEnvTycon, layoutPrettyFlexTycon, region: Region.t, realization: t, time: Time.t, ty as {name: unit -> Layout.t, region = _: Region.t, spec: Region.t, tyStr: t}}: unit = case getFlex {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, oper = "realized", time = time, ty = ty} of NONE => () | SOME flex => let val error: (Layout.t list * Layout.t * Layout.t) option ref = ref NONE val addError = fn (msg, tyError, rlError) => let val msgs = case !error of NONE => [str msg] | SOME (msgs, _, _) => (str msg)::msgs in error := SOME (msgs, tyError, rlError) end val {layoutPretty = layoutPrettyTyvar, localInit = localInitLayoutPrettyTyvar, ...} = Tyvar.makeLayoutPretty () fun layoutPrettyType t = Type.layoutPretty (t, {expand = true, layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, layoutPrettyTyvar = layoutPrettyTyvar}) val tyKind = TypeStr.kind tyStr val tyArity = case tyKind of Kind.Arity tyArity => tyArity | _ => Error.bug "Interface.TypeStr.wheree: tyArity" val rlKind = TypeStr.kind realization val rlArity = case rlKind of Kind.Arity rlArity => rlArity | _ => Error.bug "Interface.TypeStr.wheree: rlArity" local val tyvars = Vector.tabulate (Int.max (tyArity, rlArity), fn _ => Tyvar.makeNoname {equality = false}) val () = localInitLayoutPrettyTyvar tyvars in val tyTyvars = Vector.prefix (tyvars, tyArity) val tyTyargs = Vector.map (tyTyvars, Type.var) val rlTyvars = Vector.prefix (tyvars, rlArity) val rlTyargs = Vector.map (rlTyvars, Type.var) end fun layoutTyvars tyvars = let open Layout val tyvars = case Vector.length tyvars of 0 => empty | 1 => layoutPrettyTyvar (Vector.first tyvars) | _ => tuple (Vector.toListMap (tyvars, layoutPrettyTyvar)) val tyvars = if tyArity = rlArity then tyvars else bracket tyvars in if isEmpty tyvars then str " " else seq [str " ", tyvars, str " "] end fun tyMsg (b, rest) = let val empty = Layout.empty val defn = seq [str " = ", case rest of NONE => str "..." | SOME rest => rest] val (kw, defn) = case TypeStr.node tyStr of Datatype _ => ("datatype", defn) | Scheme _ => ("type", defn) | Tycon {eq, ...} => (case rest of NONE => (if eq then "eqtype" else "type", empty) | SOME _ => ("type", defn)) in seq [if b then bracket (str kw) else str kw, layoutTyvars tyTyvars, name (), defn] end fun rlMsg (b, rest) = let val defn = seq [str " = ", case rest of NONE => str "..." | SOME rest => rest] val kw = "type" in seq [if b then bracket (str kw) else str kw, layoutTyvars rlTyvars, name (), defn] end val () = if Kind.equals (tyKind, rlKind) then () else addError ("arity", tyMsg (false, NONE), rlMsg (false, NONE)) val () = if FlexibleTycon.hasCons flex andalso Option.isNone (TypeStr.toTyconOpt (realization, {expand = true})) then let fun tyDefn () = (SOME o bracket o #1 o layoutPrettyType) (TypeStr.apply (tyStr, tyTyargs)) val (tyKwErr, tyDefn) = case TypeStr.node tyStr of Datatype _ => (true, NONE) | Scheme _ => (false, tyDefn ()) | Tycon _ => (false, tyDefn ()) val rlDefn = (SOME o bracket o #1 o layoutPrettyType) (TypeStr.apply (realization, rlTyargs)) in addError ("type structure", tyMsg (tyKwErr, tyDefn), rlMsg (false, rlDefn)) end else let val tyAdmitsEquality = admitsEquality (#tyStr ty) val rlAdmitsEquality = admitsEquality realization in if AdmitsEquality.<= (tyAdmitsEquality, rlAdmitsEquality) then () else let fun tyDefn () = (SOME o bracket o #1 o layoutPrettyType) (TypeStr.apply (tyStr, tyTyargs)) val (tyKwErr, tyDefn) = case TypeStr.node tyStr of Datatype _ => (false, NONE) | Scheme _ => (false, tyDefn ()) | Tycon {eq, ...} => if eq then (true, NONE) else (false, tyDefn ()) val rlDefn = Type.explainDoesNotAdmitEquality (TypeStr.apply (realization, rlTyargs), {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon}) in addError ("admits equality", tyMsg (tyKwErr, tyDefn), rlMsg (false, rlDefn)) end end in case !error of NONE => (FlexibleTycon.defnRef flex := Defn.typeStr realization ; FlexibleTycon.pushSpec (flex, region) ; pushSpec (realization, region)) | SOME (msgs, tyError, rlError) => Control.error (region, seq [str "type cannot be realized (", (seq o List.separate) (List.rev msgs, str ", "), str "): ", name ()], align ((seq [str "type spec: ", tyError]) :: (List.map (specs (tyStr, spec), fn r => seq [str "spec at: ", Region.layout r])) @ [seq [str "type defn: ", rlError]])) end val wheree = Trace.trace ("Interface.TypeStr.wheree", fn {realization, time, ty, ...} => Layout.record [("realization", layout realization), ("time", Time.layout time), ("ty", Layout.record [("tyStr", layout (#tyStr ty))])], Unit.layout) wheree end structure UniqueId = IntUniqueId () structure TyconMap = struct datatype 'a t = T of {strs: (Strid.t * 'a t) array, types: (Ast.Tycon.t * 'a) array} fun layout layoutA = let open Layout fun loop (T {strs, types}) = record [("strs", Array.layout (Layout.tuple2 (Strid.layout, loop)) strs), ("types", Array.layout (Layout.tuple2 (Ast.Tycon.layout, layoutA)) types)] in loop end fun empty (): 'a t = T {strs = Array.new0 (), types = Array.new0 ()} fun isEmpty (T {strs, types}) = 0 = Array.length strs andalso 0 = Array.length types fun peekStrid (T {strs, ...}, strid) = Array.peekMap (strs, fn (strid', z) => if Strid.equals (strid, strid') then SOME z else NONE) fun peekTycon (T {types, ...}, tycon) = Array.peekMap (types, fn (tycon', z) => if Ast.Tycon.equals (tycon, tycon') then SOME z else NONE) end (*---------------------------------------------------*) (* Main Datatype *) (*---------------------------------------------------*) datatype t = T of {copy: copy, flexible: FlexibleTycon.t TyconMap.t option ref, isClosed: bool, original: t option, plist: PropertyList.t, strs: (Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, uniqueId: UniqueId.t, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} Set.t withtype copy = t option ref fun dest (T s) = Set.! s local fun make f = f o dest in val plist = make #plist end fun original I = case #original (dest I) of NONE => I | SOME I => I fun new {isClosed, original, strs, types, vals} = T (Set.singleton {copy = ref NONE, flexible = ref NONE, isClosed = isClosed, original = original, plist = PropertyList.new (), strs = strs, types = types, uniqueId = UniqueId.new (), vals = vals}) val empty = new {isClosed = true, original = NONE, strs = Array.new0 (), types = Array.new0 (), vals = Array.new0 ()} local open Layout in fun layout (T s) = let val {strs, types, uniqueId = u, vals, ...} = Set.! s in record [("uniqueId", UniqueId.layout u), ("strs", Array.layout (Layout.tuple2 (Strid.layout, layout)) strs), ("types", Array.layout (Layout.tuple2 (Ast.Tycon.layout, TypeStr.layout)) types), ("vals", Array.layout (Layout.tuple2 (Vid.layout, Layout.tuple2 (Status.layout, Scheme.layout))) vals)] end end fun equals (T s, T s') = Set.equals (s, s') val equals = Trace.trace2 ("Interface.equals", layout, layout, Bool.layout) equals fun sameShape (I, I') = case (#original (dest I), #original (dest I')) of (SOME I, SOME I') => equals (I, I') | _ => false fun peekStrid (T s, strid: Strid.t): t option = let val {strs, ...} = Set.! s in Array.peekMap (strs, fn (strid', I) => if Strid.equals (strid, strid') then SOME I else NONE) end datatype 'a peekResult = Found of 'a | UndefinedStructure of Strid.t list fun peekStrids (I: t, strids: Strid.t list): t peekResult = let fun loop (I, strids, ac) = case strids of [] => Found I | strid :: strids => case peekStrid (I, strid) of NONE => UndefinedStructure (rev (strid :: ac)) | SOME I => loop (I, strids, strid :: ac) in loop (I, strids, []) end fun peekTycon (T s, tycon: Ast.Tycon.t): (Ast.Tycon.t * TypeStr.t) option = let val {types, ...} = Set.! s in Array.peekMap (types, fn (name, typeStr) => if Ast.Tycon.equals (tycon, name) then SOME (name, typeStr) else NONE) end fun unbound (r: Region.t, className, x: Layout.t): unit = Control.error (r, let open Layout in seq [str "undefined ", str className, str " ", x] end, Layout.empty) fun layoutStrids (ss: Strid.t list): Layout.t = Layout.str (concat (List.separate (List.map (ss, Strid.toString), "."))) fun lookupLongtycon (I: t, long: Longtycon.t, r: Region.t, {prefix: Strid.t list}) = let val (ss, c) = Longtycon.split long in case peekStrids (I, ss) of Found I => (case peekTycon (I, c) of NONE => (unbound (r, "type", Longtycon.layout (Longtycon.long (prefix @ ss, c))) ; NONE) | SOME (name, s) => SOME (name, s)) | UndefinedStructure ss => (unbound (r, "structure", layoutStrids (prefix @ ss)) ; NONE) end fun lookupLongstrid (I: t, long: Longstrid.t, r: Region.t, {prefix: Strid.t list}) = let val (ss, s) = Longstrid.split long in case peekStrids (I, ss) of Found I => (case peekStrid (I, s) of NONE => (unbound (r, "structure", Longstrid.layout (Longstrid.long (prefix @ ss, s))) ; NONE) | SOME I => SOME I) | UndefinedStructure ss => (unbound (r, "structure", layoutStrids (prefix @ ss)) ; NONE) end fun share {layoutPrettyEnvTycon, layoutPrettyFlexTycon, I1: t, long1: Longstrid.t, I2: t, long2: Longstrid.t, time, region}: unit = let fun mkTy (s, long, strids, name) = let val spec = Ast.Tycon.region name val region = Longstrid.region long val name = fn () => let val (ss, s) = Longstrid.split long in Ast.Longtycon.layout (Ast.Longtycon.long (List.concat [ss, [s], rev strids], name)) end in {name = name, region = region, spec = spec, tyStr = s} end fun ensureFlexible (I: t, strids): unit = let val {get: t -> bool ref, destroy, ...} = Property.destGet (plist, Property.initFun (fn _ => ref false)) fun loop (I: t, strids): unit = let val r = get I in if !r then () else let val _ = r := true val T s = I val {strs, types, ...} = Set.! s val _ = Array.foreach (strs, fn (strid, I) => ensureFlexible (I, strid :: strids)) val _ = Array.foreach (types, fn (name, s) => (ignore o TypeStr.getFlex) {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, oper = "shared", time = time, ty = mkTy (s, long1, strids, name)}) in () end end val () = loop (I, strids) val _ = destroy () in () end fun share (I1, I2, strids): unit = if equals (I1, I2) then ensureFlexible (I1, strids) else if sameShape (I1, I2) then let fun loop (T s1, T s2, strids): unit = let val {isClosed, strs = strs1, types = types1, ...} = Set.! s1 val {strs = strs2, types = types2, ...} = Set.! s2 val _ = Array.foreach2 (types1, types2, fn ((name, s1), (_, s2)) => TypeStr.share {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, region = region, time = time, ty1 = mkTy (s1, long1, strids, name), ty2 = mkTy (s2, long2, strids, name)}) val _ = Array.foreach2 (strs1, strs2, fn ((name, I1), (_, I2)) => loop (I1, I2, name :: strids)) val _ = (* Can't always union here. I1 and I2 may have * exactly the same shape, but may have free * flxible tycons defined in other signatures that * are different. * However, if the interface is closed, that is, if * all of the flexible tycons that appear in it are * also defined in it, then sharing the structures * implies that the structures are identical. This * also relies on the fact that the structures have * the same shape, which means that they are copies * of the same interface. That is sufficient to * guarantee that all rigid tycons are identical. *) if isClosed then Set.union (s1, s2) else () in () end in loop (I1, I2, strids) end else (* different shapes -- need to share pointwise *) let val T s1 = I1 val T s2 = I2 val {strs = strs1, types = types1, ...} = Set.! s1 val {strs = strs2, types = types2, ...} = Set.! s2 fun walk2 (a1, a2, compareNames, f: 'a * 'a * 'b -> unit) = let val n1 = Array.length a1 val n2 = Array.length a2 fun both (i1, i2) = if i1 < n1 andalso i2 < n2 then compare (i1, Array.sub (a1, i1), i2, Array.sub (a2, i2)) else () and compare (i1, (name1, z1), i2, (name2, z2)) = case compareNames (name1, name2) of GREATER => let val i2 = i2 + 1 in if i2 < n2 then compare (i1, (name1, z1), i2, Array.sub (a2, i2)) else () end | EQUAL => (f (z1, z2, name1) ; both (i1 + 1, i2 + 1)) | LESS => let val i1 = i1 + 1 in if i1 < n1 then compare (i1, Array.sub (a1, i1), i2, (name2, z2)) else () end in both (0, 0) end val _ = walk2 (strs1, strs2, Strid.compare, fn (I1, I2, name) => share (I1, I2, name :: strids)) val _ = walk2 (types1, types2, Ast.Tycon.compare, fn (s1, s2, name) => TypeStr.share {layoutPrettyEnvTycon = layoutPrettyEnvTycon, layoutPrettyFlexTycon = layoutPrettyFlexTycon, region = region, time = time, ty1 = mkTy (s1, long1, strids, name), ty2 = mkTy (s2, long2, strids, name)}) in () end in share (I1, I2, []) end val share = Trace.trace ("Interface.share", fn {I1, I2, time, ...} => Layout.tuple [layout I1, layout I2, Time.layout time], Unit.layout) share fun copy (I: t): t = let (* Keep track of all nodes that have forward pointers to copies, so * that we can gc them when done. *) val copies: copy list ref = ref [] fun loop (I as T s): t = let val r as {copy, ...} = Set.! s in case !copy of NONE => let val {isClosed, original, strs, types, vals, ...} = r val types = Array.map (types, fn (name, typeStr) => (name, TypeStr.copy typeStr)) val vals = Array.map (vals, fn (name, (status, scheme)) => (name, (status, Scheme.copy scheme))) val strs = Array.map (strs, fn (name, I) => (name, loop I)) val original = SOME (case original of NONE => I | SOME I => I) val I = T (Set.singleton {copy = ref NONE, flexible = ref NONE, isClosed = isClosed, original = original, plist = PropertyList.new (), strs = strs, types = types, uniqueId = UniqueId.new (), vals = vals}) val _ = List.push (copies, copy) val _ = copy := SOME I in I end | SOME I => I end val I = loop I fun clear copies = List.foreach (!copies, fn copy => copy := NONE) val _ = clear copies val _ = clear FlexibleTycon.copies val _ = FlexibleTycon.copies := [] in I end val copy = Trace.trace ("Interface.copy", layout, layout) copy fun flexibleTycons (I: t): FlexibleTycon.t TyconMap.t = let val {destroy = destroy1, get = tyconShortest: (FlexibleTycon.t -> {flex: FlexibleTycon.t option ref, length: int option} ref), ...} = Property.destGet (FlexibleTycon.plist, Property.initFun (fn _ => ref {flex = ref NONE, length = NONE})) val {destroy = destroy2, get = interfaceShortest: t -> int option ref, ...} = Property.destGet (plist, Property.initFun (fn _ => ref NONE)) fun loop (I: t, length: int): FlexibleTycon.t option ref TyconMap.t = let val r = interfaceShortest I in if isSome (!r) andalso length >= valOf (!r) then TyconMap.empty () else let val _ = r := SOME length val {strs, types, ...} = dest I fun setTycon (tycon, isDatatype, isEqtype) = case tycon of Tycon.Flexible fc => let val {admitsEquality, defn, hasCons, ...} = FlexibleTycon.fields fc val admitsEquality = case !admitsEquality of AdmitsEquality.Always => true | AdmitsEquality.Never => false | AdmitsEquality.Sometimes => true in case Defn.dest (!defn) of Defn.Undefined => let val r = tyconShortest fc in if (hasCons andalso not isDatatype) orelse (admitsEquality andalso not isEqtype) orelse (isSome (#length (!r)) andalso length >= valOf (#length (!r))) then ref NONE else let val _ = #flex (!r) := NONE val flex = ref (SOME fc) val _ = r := {flex = flex, length = SOME length} in flex end end | _ => ref NONE end | _ => ref NONE val types = Array.map (types, fn (tycon, typeStr) => (tycon, case TypeStr.node typeStr of TypeStr.Datatype {tycon, repl, ...} => setTycon (tycon, not repl, true) | TypeStr.Tycon {eq, tycon, ...} => setTycon (tycon, false, eq) | _ => ref NONE)) val strs = Array.map (strs, fn (s, I) => (s, loop (I, 1 + length))) in TyconMap.T {strs = strs, types = types} end end val tm = loop (I, 0) val _ = (destroy1 (); destroy2 ()) fun collapse (tm: FlexibleTycon.t option ref TyconMap.t) : FlexibleTycon.t TyconMap.t = let val TyconMap.T {strs, types} = tm val types = Array.keepAllMap (types, fn (c, r) => Option.map (!r, fn f => (c, f))) val strs = Array.keepAllMap (strs, fn (s, m) => let val m = collapse m in if TyconMap.isEmpty m then NONE else SOME (s, m) end) in TyconMap.T {strs = strs, types = types} end in collapse tm end val flexibleTycons = fn I as T s => let val {flexible, ...} = Set.! s in case !flexible of NONE => let val f = flexibleTycons I val _ = flexible := SOME f in f end | SOME f => f end val flexibleTycons = Trace.trace ("Interface.flexibleTycons", layout, TyconMap.layout FlexibleTycon.layout) flexibleTycons fun dest (T s) = let val {strs, types, vals, ...} = Set.! s in {strs = strs, types = types, vals = vals} end end mlton-20210117+dfsg/mlton/elaborate/interface.sig000066400000000000000000000210461416264345000215640ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature INTERFACE_STRUCTS = sig structure Ast: AST structure AdmitsEquality: ADMITS_EQUALITY structure Kind: TYCON_KIND structure EnvTycon: sig type t val admitsEquality: t -> AdmitsEquality.t val arrow: t val equals: t * t -> bool val exn: t val kind: t -> Kind.t val layout: t -> Layout.t val layoutAppPretty: t * LayoutPretty.t vector * {layoutPretty: t -> Layout.t} -> LayoutPretty.t val layoutAppPrettyNormal: Layout.t * LayoutPretty.t vector -> LayoutPretty.t val tuple: t end structure EnvTypeStr: sig type t val layout: t -> Layout.t end structure Tyvar: sig include ID val makeNoname: {equality: bool} -> t val makeLayoutPretty: unit -> {destroy: unit -> unit, layoutPretty: t -> Layout.t, localInit: t vector -> unit} end end signature INTERFACE = sig include INTERFACE_STRUCTS structure FlexibleTycon: sig type typeStr type t val admitsEquality: t -> AdmitsEquality.t val dest: t -> {admitsEquality: AdmitsEquality.t, hasCons: bool, kind: Kind.t, prettyDefault: string} val layout: t -> Layout.t val layoutPrettyDefault: t -> Layout.t val plist: t -> PropertyList.t val new: {admitsEquality: AdmitsEquality.t, hasCons: bool, kind: Kind.t, prettyDefault: string, region: Region.t} -> t val realize: t * EnvTypeStr.t -> unit datatype realization = ETypeStr of EnvTypeStr.t | TypeStr of typeStr val realization: t -> realization option val setAdmitsEquality: t * AdmitsEquality.t -> unit end structure Tycon: sig datatype t = Flexible of FlexibleTycon.t | Rigid of EnvTycon.t val admitsEquality: t -> AdmitsEquality.t end structure Record: RECORD sharing Record = Ast.SortedRecord structure Type: sig type t val arrow: t * t -> t val con: Tycon.t * t vector -> t val deArrow: t -> t * t val deEta: t * Tyvar.t vector -> Tycon.t option val exn: t val hom: t * {con: Tycon.t * 'a vector -> 'a, record: 'a Record.t -> 'a, var: Tyvar.t -> 'a} -> 'a val layout: t -> Layout.t val layoutPretty: t * {expand: bool, layoutPrettyEnvTycon: EnvTycon.t -> Layout.t, layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} -> LayoutPretty.t val record: t Record.t -> t val var: Tyvar.t -> t end structure Status: sig datatype t = Con | Exn | Var val layout: t -> Layout.t val toString: t -> string end structure Time: sig type t val tick: unit -> t end structure Scheme: sig datatype t = T of {ty: Type.t, tyvars: Tyvar.t vector} val admitsEquality: t -> bool val fromTycon: Tycon.t -> t val make: Tyvar.t vector * Type.t -> t val ty: t -> Type.t end structure Cons: sig type t val dest: t -> {name: Ast.Con.t, scheme: Scheme.t} vector val empty: t val fromSortedVector: {name: Ast.Con.t, scheme: Scheme.t} vector -> t val fromVector: {name: Ast.Con.t, scheme: Scheme.t} vector -> t val layout: t -> Layout.t val map: t * ({name: Ast.Con.t, scheme: Scheme.t} -> {scheme: Scheme.t}) -> t end structure TypeStr: sig type t datatype node = Datatype of {tycon: Tycon.t, cons: Cons.t, repl: bool} | Scheme of Scheme.t | Tycon of {eq: bool, tycon: Tycon.t} val abs: t -> t val admitsEquality: t -> AdmitsEquality.t val apply: t * Type.t vector -> Type.t val cons: t -> Cons.t val data: Tycon.t * Cons.t * bool -> t val def: Scheme.t -> t val kind: t -> Kind.t val layout: t -> Layout.t val node: t -> node val pushSpec: t * Region.t -> unit val repl: t -> t val toTyconOpt: t * {expand: bool} -> Tycon.t option (* NONE on Scheme *) val tycon: Tycon.t * bool -> t val specs: t * Region.t -> Region.t list val share: {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t, layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t, region: Region.t, time: Time.t, ty1: {name: unit -> Layout.t, region: Region.t, spec: Region.t, tyStr: t}, ty2: {name: unit -> Layout.t, region: Region.t, spec: Region.t, tyStr: t}} -> unit val wheree: {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t, layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t, realization: t, region: Region.t, time: Time.t, ty: {name: unit -> Layout.t, region: Region.t, spec: Region.t, tyStr: t}} -> unit end sharing type FlexibleTycon.typeStr = TypeStr.t structure TyconMap: sig datatype 'a t = T of {strs: (Ast.Strid.t * 'a t) array, types: (Ast.Tycon.t * 'a) array} val empty: unit -> 'a t val layout: ('a -> Layout.t) -> 'a t -> Layout.t val peekStrid: 'a t * Ast.Strid.t -> 'a t option val peekTycon: 'a t * Ast.Tycon.t ->'a option end type t val copy: t -> t (* copy renames all flexible tycons. *) val equals: t * t -> bool val dest: t -> {strs: (Ast.Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} val empty: t val flexibleTycons: t -> FlexibleTycon.t TyconMap.t val layout: t -> Layout.t val lookupLongstrid: t * Ast.Longstrid.t * Region.t * {prefix: Ast.Strid.t list} -> t option val lookupLongtycon: t * Ast.Longtycon.t * Region.t * {prefix: Ast.Strid.t list} -> (Ast.Tycon.t * TypeStr.t) option val new: {isClosed: bool, original: t option, strs: (Ast.Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} -> t val original: t -> t val peekStrid: t * Ast.Strid.t -> t option datatype 'a peekResult = Found of 'a | UndefinedStructure of Ast.Strid.t list val peekStrids: t * Ast.Strid.t list -> t peekResult val peekTycon: t * Ast.Tycon.t -> (Ast.Tycon.t * TypeStr.t) option val plist: t -> PropertyList.t val share: {layoutPrettyEnvTycon: EnvTycon.t -> Layout.t, layoutPrettyFlexTycon: FlexibleTycon.t -> Layout.t, I1: t, long1: Ast.Longstrid.t, I2: t, long2: Ast.Longstrid.t, time: Time.t, region: Region.t} -> unit end mlton-20210117+dfsg/mlton/elaborate/precedence-parse.fun000066400000000000000000000300501416264345000230320ustar00rootroot00000000000000(* Heavily modified from the SML/NJ sources. *) (* Copyright 1996 by AT&T Bell Laboratories *) (* precedence.sml *) functor PrecedenceParse (S: PRECEDENCE_PARSE_STRUCTS): PRECEDENCE_PARSE = struct open S local open Ast in structure Exp = Exp structure Fixity = Fixity structure Fixop = Fixop structure Longvid = Longvid structure Pat = Pat structure Vid = Vid end structure Exp = struct open Exp fun apply {func, arg} = Exp.app (func, arg) fun applyInfix {func, argl, argr} = let val arg = Exp.tuple (Vector.new2 (argl, argr)) in Exp.makeRegion (Exp.App (func, arg), Exp.region arg) end end structure Pat = struct open Pat local fun finishApply {func, arg, region, ctxt} = case Pat.node func of Pat.Var {name, ...} => Pat.makeRegion (Pat.App (Longvid.toLongcon name, arg), region) | _ => let val () = Control.error (region, Layout.str "non-constructor applied to argument in pattern", ctxt ()) in Pat.wild end in fun apply ctxt {func, arg} = finishApply {func = func, arg = arg, region = Region.append (Pat.region func, Pat.region arg), ctxt = ctxt} fun applyInfix ctxt {func, argl, argr} = let val arg = Pat.tuple (Vector.new2 (argl, argr)) in finishApply {func = func, arg = arg, region = Pat.region arg, ctxt = ctxt} end end end structure Fixval = struct datatype t = Nonfix | Infix of int * int fun eval (f: Fixity.t): t = case f of Fixity.Infix NONE => Infix (0, 1) | Fixity.Infix (SOME n) => Infix (n+n, n+n+1) | Fixity.Infixr NONE => Infix (1, 0) | Fixity.Infixr (SOME n) => Infix (n+n+1, n+n) | Fixity.Nonfix => Nonfix fun make ({name: Longvid.t, fixop: Fixop.t}, E: Env.t): t = case (fixop, Longvid.split name) of (Fixop.None, ([], vid)) => (case Env.peekFix (E, vid) of NONE => Nonfix | SOME f => eval f) | _ => Nonfix fun makePat (p: Pat.t, E: Env.t): t = case Pat.node p of Pat.Var r => make (r, E) | _ => Nonfix fun makeExp (e: Exp.t, E: Env.t): t = case Exp.node e of Exp.Var r => make (r, E) | _ => Nonfix end (*---------------------------------------------------*) (* from elaborate/precedence.sml *) (*---------------------------------------------------*) datatype 'a precStack = INf of int * 'a * 'a precStack | NONf of 'a * 'a precStack | NILf fun 'a parse {apply: {func: 'a, arg: 'a} -> 'a, applyInfix: {func: 'a, argl: 'a, argr: 'a} -> 'a, ctxt: unit -> Layout.t, fixval: 'a -> Fixval.t, items: 'a vector, name: string, region: 'a -> Region.t, toString: 'a -> string}: 'a = let fun error (r: Region.t, msg: string) = Control.error (r, Layout.str msg, ctxt ()) fun ensureNONf ((e, f), p, start) = let val _ = case f of Fixval.Nonfix => () | _ => error (region e, concat [if start then name ^ " starts with infix identifier: " else "identifier must be used infix: ", toString e]) in NONf (e, p) end fun start token = ensureNONf (token, NILf, true) (* parse an expression *) fun parse (stack: 'a precStack, (item: 'a, fixval: Fixval.t)) = case (stack, (item, fixval)) of (NONf (e, r), (e', Fixval.Nonfix)) => NONf (apply {func = e, arg = e'}, r) | (p as INf _, token) => ensureNONf (token, p, false) | (p as NONf (e1, INf (bp, e2, NONf (e3, r))), (e4, f as Fixval.Infix (lbp, rbp))) => if lbp > bp then INf (rbp, e4, p) else (if lbp = bp then error (Region.append (region e2, region e4), concat ["infix identifiers with equal precedence but mixed associativity: ", toString e2, ", ", toString e4]) else (); parse (NONf (applyInfix {func = e2, argl = e3, argr = e1}, r), (e4, f))) | (p as NONf _, (e', Fixval.Infix (_, rbp))) => INf (rbp, e', p) | _ => Error.bug "PrecedenceParse.parse.parse" (* clean up the stack *) fun finish stack = case stack of NONf (e1, INf (_, e2, NONf (e3, r))) => finish (NONf (applyInfix {func = e2, argl = e3, argr = e1}, r)) | NONf (e1, NILf) => e1 | INf (_, e1, NONf (e2, p)) => (error (region e1, concat [name, " ends with infix identifier: ", toString e1]) ; finish (NONf (apply {func = e2, arg = e1}, p))) | NILf => Error.bug "PrecedenceParse.parse.finish: NILf" | _ => Error.bug "PrecedenceParse.parse.finish" fun getfix x = (x, fixval x) in if Vector.isEmpty items then Error.bug "PrecedenceParse.parse" else let val item = Vector.first items in finish (Vector.foldFrom (items, 1, start (getfix item), fn (item, state) => parse (state, getfix item))) end end fun parsePat (ps, E, ctxt) = parse {apply = Pat.apply ctxt, applyInfix = Pat.applyInfix ctxt, ctxt = ctxt, fixval = fn p => Fixval.makePat (p, E), items = ps, name = "pattern", region = Pat.region, toString = Layout.toString o Pat.layout} val parsePat = Trace.trace ("PrecedenceParse.parsePat", fn (ps, _, _) => Vector.layout Pat.layout ps, Ast.Pat.layout) parsePat fun parseExp (es, E, ctxt) = parse {apply = Exp.apply, applyInfix = Exp.applyInfix, ctxt = ctxt, fixval = fn e => Fixval.makeExp (e, E), items = es, name = "expression", region = Exp.region, toString = Layout.toString o Exp.layout} val parseExp = Trace.trace ("PrecedenceParse.parseExp", fn (es, _, _) => Vector.layout Exp.layout es, Ast.Exp.layout) parseExp (*---------------------------------------------------*) (* parseClause *) (*---------------------------------------------------*) structure ClausePat = struct datatype t = Apply of {func: t, arg: t} | ApplyInfix of {func: t, argl: t, argr: t} | Pat of Pat.t fun region p = case p of Apply {func, arg} => Region.append (region func, region arg) | ApplyInfix {argl, argr, ...} => Region.append (region argl, region argr) | Pat p => Pat.region p local fun toPat p = case p of Apply {func, arg} => let val func = toPat func val arg = toPat arg in Pat.makeRegion (Pat.FlatApp (Vector.new2 (func, arg)), Region.append (Pat.region func, Pat.region arg)) end | ApplyInfix {func, argl, argr} => let val func = toPat func val argl = toPat argl val argr = toPat argr in Pat.makeRegion (Pat.FlatApp (Vector.new3 (argl, func, argr)), Region.append (Pat.region argl, Pat.region argr)) end | Pat p => p in val layout = Pat.layout o toPat end end fun parseClausePats (ps, E, ctxt) = parse {apply = ClausePat.Apply, applyInfix = ClausePat.ApplyInfix, ctxt = ctxt, fixval = fn ClausePat.Pat p => Fixval.makePat (p, E) | _ => Fixval.Nonfix, items = Vector.map (ps, ClausePat.Pat), name = "function clause", region = ClausePat.region, toString = Layout.toString o ClausePat.layout} fun parseClause (pats: Pat.t vector, E: Env.t, ctxt) = let fun error (region, msg) = Control.error (region, msg, ctxt ()) fun improper region = error (region, Layout.str "function clause with improper infix pattern") fun toPat p= case p of ClausePat.Pat p => p | ClausePat.Apply {func, arg} => Pat.apply ctxt {func = toPat func, arg = toPat arg} | ClausePat.ApplyInfix {func, argl, argr} => Pat.applyInfix ctxt {func = toPat func, argl = toPat argl, argr = toPat argr} fun toPatTop p = case p of ClausePat.Pat p => p | _ => (improper (ClausePat.region p) ; toPat p) fun toPatList p = let fun loop (p, args) = case p of ClausePat.Apply {func, arg} => loop (func, (toPatTop arg)::args) | _ => (toPatTop p)::args in loop (p, []) end fun done (func: Pat.t, args: Pat.t list) = let fun illegalName () = (error (Pat.region func, Layout.seq [Layout.str "function clause with illegal name: ", Pat.layout func]) ; Ast.Var.bogus) val func = case Pat.node func of Pat.Var {name, ...} => (case Longvid.split name of ([], x) => Vid.toVar x | _ => illegalName ()) | _ => illegalName () val args = Vector.fromList args val _ = if Vector.isEmpty args then error (Region.append (Pat.region (Vector.sub (pats, 0)), Pat.region (Vector.last pats)), Layout.str "function clause with no arguments") else () in {func = func, args = args} end fun doneApplyInfix ({func, argl, argr}, rest) = let val func = toPatTop func val argl = toPatTop argl val argr = toPatTop argr in done (func, (Pat.tuple (Vector.new2 (argl, argr)))::rest) end in case parseClausePats (pats, E, ctxt) of ClausePat.ApplyInfix func_argl_argr => doneApplyInfix (func_argl_argr, []) | p => (case toPatList p of [] => Error.bug "PrecedenceParse.parseClause: empty" | p::rest => let val improper = fn () => (improper (Pat.region p) ; done (Pat.var Ast.Var.bogus, rest)) in case Pat.node p of Pat.Paren p' => (case Pat.node p' of Pat.FlatApp pats => (case parseClausePats (pats, E, ctxt) of ClausePat.ApplyInfix func_argl_argr => doneApplyInfix (func_argl_argr, rest) | _ => improper ()) | _ => improper ()) | _ => done (p, rest) end) end end mlton-20210117+dfsg/mlton/elaborate/precedence-parse.sig000066400000000000000000000014641416264345000230330ustar00rootroot00000000000000(* Copyright (C) 2009,2017 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PRECEDENCE_PARSE_STRUCTS = sig structure Ast: AST structure Env: ELABORATE_ENV sharing Ast = Env.Ast end signature PRECEDENCE_PARSE = sig include PRECEDENCE_PARSE_STRUCTS val parseClause: Ast.Pat.t vector * Env.t * (unit -> Layout.t) -> {args: Ast.Pat.t vector, func: Ast.Var.t} val parseExp: Ast.Exp.t vector * Env.t * (unit -> Layout.t) -> Ast.Exp.t val parsePat: Ast.Pat.t vector * Env.t * (unit -> Layout.t) -> Ast.Pat.t end mlton-20210117+dfsg/mlton/elaborate/scope.fun000066400000000000000000000445151416264345000207510ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Scope (S: SCOPE_STRUCTS): SCOPE = struct open S open Ast structure Tyvars = UnorderedSet (Tyvar) structure Tyvars = struct open Tyvars val fromVector = fn v => Vector.fold (v, empty, fn (x, s) => add (s, x)) end fun ('down, 'up) processDec (d: Dec.t, {(* bindType is used at datatype and type declarations. *) bindType: ('down * Tyvar.t vector -> 'down * ('up -> 'up)), (* bindFunVal is used at fun, overload, and val declarations. *) bindFunVal: ('down * Tyvar.t vector * Region.t -> ('down * ('up -> Tyvar.t vector * 'up))), combineUp: 'up * 'up -> 'up, initDown: 'down, initUp: 'up, tyvar: Tyvar.t * 'down -> 'up }): Dec.t * 'up = let fun visits (xs: 'a vector, visitX: 'a -> 'up): 'up = Vector.fold (xs, initUp, fn (x, u) => combineUp (u, visitX x)) fun loops (xs: 'a vector, loopX: 'a -> 'a * 'up): 'a vector * 'up = Vector.mapAndFold (xs, initUp, fn (x, u) => let val (x, u') = loopX x in (x, combineUp (u, u')) end) fun visitTy (t: Type.t, d: 'down): 'up = let datatype z = datatype Type.node fun visit (t: Type.t): 'up = case Type.node t of Con (_, ts) => visits (ts, visit) | Paren t => visit t | Record r => Record.fold (r, initUp, fn ((_, t), u) => combineUp (u, visit t)) | Var a => tyvar (a, d) in visit t end fun visitTyOpt (to: Type.t option, d: 'down): 'up = case to of NONE => initUp | SOME t => visitTy (t, d) fun visitTypBind (tb: TypBind.t, d: 'down): 'up = let val TypBind.T tbs = TypBind.node tb val u = visits (tbs, fn {def, tyvars, ...} => let val (d, finish) = bindType (d, tyvars) in finish (visitTy (def, d)) end) in u end fun visitDatBind (db: DatBind.t, d: 'down): 'up = let val DatBind.T {datatypes, withtypes} = DatBind.node db val u = visits (datatypes, fn {cons, tyvars, ...} => let val (d, finish) = bindType (d, tyvars) in finish (visits (cons, fn (_, arg) => visitTyOpt (arg, d))) end) val u' = visitTypBind (withtypes, d) in combineUp (u, u') end fun visitPat (p: Pat.t, d: 'down): 'up = let datatype z = datatype Pat.node fun visit (p: Pat.t): 'up = (case Pat.node p of App (_, p) => visit p | Const _ => initUp | Constraint (p, t) => combineUp (visit p, visitTy (t, d)) | FlatApp ps => visits (ps, visit) | Layered {constraint, pat, ...} => combineUp (visitTyOpt (constraint, d), visit pat) | List ps => visits (ps, visit) | Or ps => visits (ps, visit) | Paren p => visit p | Record {items, ...} => Vector.fold (items, initUp, fn ((_, _, i), u) => let datatype z = datatype Pat.Item.t val u' = case i of Field p => visit p | Vid (_, to, po) => let val u = visitTyOpt (to, d) val u' = visitOpt po in combineUp (u, u') end in combineUp (u, u') end) | Tuple ps => visits (ps, visit) | Var _ => initUp | Vector ps => visits (ps, visit) | Wild => initUp) and visitOpt opt = (case opt of NONE => initUp | SOME p => visit p) in visit p end fun visitPrimKind (kind: PrimKind.t, d: 'down): 'up = let datatype z = datatype PrimKind.t in case kind of Address {ty, ...} => visitTy (ty, d) | BuildConst {ty, ...} => visitTy (ty, d) | CommandLineConst {ty, ...} => visitTy (ty, d) | Const {ty, ...} => visitTy (ty, d) | Export {ty, ...} => visitTy (ty, d) | IImport {ty, ...} => visitTy (ty, d) | Import {ty, ...} => visitTy (ty, d) | ISymbol {ty} => visitTy (ty, d) | Prim {ty, ...} => visitTy (ty, d) | Symbol {ty, ...} => visitTy (ty, d) end fun loopDec (d: Dec.t, down: 'down): Dec.t * 'up = let fun doit n = Dec.makeRegion (n, Dec.region d) fun do1 ((a, u), f) = (doit (f a), u) fun do2 ((a1, u1), (a2, u2), f) = (doit (f (a1, a2)), combineUp (u1, u2)) fun doVec (ds: Dec.t vector, f: Dec.t vector -> Dec.node) : Dec.t * 'up = let val (ds, u) = loops (ds, fn d => loopDec (d, down)) in (doit (f ds), u) end fun empty () = (d, initUp) datatype z = datatype Dec.node in case Dec.node d of Abstype {body, datBind} => let val (body, u) = loopDec (body, down) val u' = visitDatBind (datBind, down) in (doit (Abstype {body = body, datBind = datBind}), combineUp (u, u')) end | Datatype rhs => let datatype z = datatype DatatypeRhs.node val u = case DatatypeRhs.node rhs of DatBind db => visitDatBind (db, down) | Repl _ => initUp in (d, u) end | DoDec e => do1 (loopExp (e, down), DoDec) | Exception ebs => let val u = visits (ebs, fn (_, rhs) => let datatype z = datatype EbRhs.node val u = case EbRhs.node rhs of Def _ => initUp | Gen to => let val u = visitTyOpt (to, down) in u end in u end) in (d, u) end | Fix _ => empty () | Fun {tyvars, fbs} => let val (down, finish) = bindFunVal (down, tyvars, Dec.region d) val (fbs, u) = loops (fbs, fn clauses => let val (clauses, u) = loops (clauses, fn {body, pats, resultType} => let val (body, u) = loopExp (body, down) val u' = visits (pats, fn p => visitPat (p, down)) val u'' = visitTyOpt (resultType, down) in ({body = body, pats = pats, resultType = resultType}, combineUp (u, combineUp (u', u''))) end) in (clauses, u) end) val (tyvars, u) = finish u in (doit (Fun {tyvars = tyvars, fbs = fbs}), u) end | Local (d, d') => do2 (loopDec (d, down), loopDec (d', down), Local) | Open _ => empty () | Overload (i, x, tyvars, ty, ys) => let val (down, finish) = bindFunVal (down, tyvars, Dec.region d) val up = visitTy (ty, down) val (tyvars, up) = finish up in (doit (Overload (i, x, tyvars, ty, ys)), up) end | SeqDec ds => doVec (ds, SeqDec) | Type tb => let val u = visitTypBind (tb, down) in (d, u) end | Val {rvbs, tyvars, vbs} => let val (down, finish) = bindFunVal (down, tyvars, Dec.region d) val (rvbs, u) = loops (rvbs, fn {match, pat} => let val (match, u) = loopMatch (match, down) val u' = visitPat (pat, down) in ({match = match, pat = pat}, combineUp (u, u')) end) val (vbs, u') = loops (vbs, fn {exp, pat} => let val (exp, u) = loopExp (exp, down) val u' = visitPat (pat, down) in ({exp = exp, pat = pat}, combineUp (u, u')) end) val (tyvars, u) = finish (combineUp (u, u')) in (doit (Val {rvbs = rvbs, tyvars = tyvars, vbs = vbs}), u) end end and loopExp (e: Exp.t, d: 'down): Exp.t * 'up = let val loopMatch = fn m => loopMatch (m, d) fun loop (e: Exp.t): Exp.t * 'up = let fun empty () = (e, initUp) val region = Exp.region e fun doit n = Exp.makeRegion (n, region) datatype z = datatype Exp.node fun do1 ((a, u), f) = (doit (f a), u) fun do2 ((a1, u1), (a2, u2), f) = (doit (f (a1, a2)), combineUp (u1, u2)) fun do3 ((a1, u1), (a2, u2), (a3, u3), f) = (doit (f (a1, a2, a3)), combineUp (u1, combineUp (u2, u3))) fun doVec (es: Exp.t vector, f: Exp.t vector -> Exp.node) : Exp.t * 'up = let val (es, u) = loops (es, loop) in (doit (f es), u) end in case Exp.node e of Andalso (e1, e2) => do2 (loop e1, loop e2, Andalso) | App (e1, e2) => do2 (loop e1, loop e2, App) | Case (e, m) => do2 (loop e, loopMatch m, Case) | Const _ => empty () | Constraint (e, t) => let val (e, u) = loop e val u' = visitTy (t, d) in (doit (Constraint (e, t)), combineUp (u, u')) end | FlatApp es => doVec (es, FlatApp) | Fn m => do1 (loopMatch m, Fn) | Handle (e, m) => do2 (loop e, loopMatch m, Handle) | If (e1, e2, e3) => do3 (loop e1, loop e2, loop e3, If) | Let (dec, e) => do2 (loopDec (dec, d), loop e, Let) | List ts => doVec (ts, List) | Orelse (e1, e2) => do2 (loop e1, loop e2, Orelse) | Paren e => do1 (loop e, Paren) | Prim kind => (e, visitPrimKind (kind, d)) | Raise exn => do1 (loop exn, Raise) | Record r => let val (r, u) = Record.change (r, fn res => loops (res, fn (r, e) => let val (e', u) = loop e in ((r, e'), u) end)) in (doit (Record r), u) end | Selector _ => empty () | Seq es => doVec (es, Seq) | Var _ => empty () | Vector vs => doVec (vs, Vector) | While {expr, test} => do2 (loop expr, loop test, fn (expr, test) => While {expr = expr, test = test}) end in loop e end and loopMatch (m, d) = let val (Match.T rules, region) = Match.dest m val (rules, u) = loops (rules, fn (p, e) => let val u = visitPat (p, d) val (e, u') = loopExp (e, d) in ((p, e), combineUp (u, u')) end) in (Match.makeRegion (Match.T rules, region), u) end in loopDec (d, initDown) end fun scope (dec: Dec.t): Dec.t = let fun bindFunVal ((), tyvars, regionDec) = let fun finish {free, mayNotBind} = let val bound = Tyvars.+ (free, Tyvars.fromVector tyvars) val mayNotBind = List.keepAll (mayNotBind, fn a => not (Tyvars.contains (bound, a)) orelse let open Layout val _ = Control.error (Tyvar.region a, seq [str "type variable scoped at an outer declaration: ", Tyvar.layout a], seq [str "scoped at: ", Region.layout regionDec]) in false end) val bound = Vector.fromList (Tyvars.toList bound) in (bound, {free = Tyvars.empty, mayNotBind = List.append (Vector.toList tyvars, mayNotBind)}) end in ((), finish) end fun bindType ((), tyvars) = let fun finish {free, mayNotBind = _} = {free = Tyvars.- (free, Tyvars.fromVector tyvars), mayNotBind = []} in ((), finish) end fun tyvar (a, ()) = {free = Tyvars.singleton a, mayNotBind = []} fun combineUp ({free = f, mayNotBind = m}, {free = f', mayNotBind = m'}) = {free = Tyvars.+ (f, f'), mayNotBind = List.append (m, m')} val (dec, _) = processDec (dec, {bindFunVal = bindFunVal, bindType = bindType, combineUp = combineUp, initDown = (), initUp = {free = Tyvars.empty, mayNotBind = []}, tyvar = tyvar}) (* Walk down and bind a tyvar as soon as you see it, removing * all lower binding occurrences of the tyvar. *) fun bindFunVal (bound, tyvars: Tyvar.t vector, _) = let val tyvars = Vector.keepAll (tyvars, fn a => not (Tyvars.contains (bound, a))) val bound = Tyvars.+ (bound, Tyvars.fromVector tyvars) in (bound, fn () => (tyvars, ())) end fun bindType (bound, tyvars) = let val bound = Tyvars.+ (bound, Tyvars.fromVector tyvars) in (bound, fn () => ()) end fun tyvar (_, _) = () val (dec, ()) = processDec (dec, {bindFunVal = bindFunVal, bindType = bindType, combineUp = fn ((), ()) => (), initDown = Tyvars.empty, initUp = (), tyvar = tyvar}) in dec end val scope = Trace.trace ("Scope.scope", Dec.layout, Dec.layout) scope end mlton-20210117+dfsg/mlton/elaborate/scope.sig000066400000000000000000000010271416264345000207320ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SCOPE_STRUCTS = sig structure Ast: AST end signature SCOPE = sig include SCOPE_STRUCTS (* Add free type variables to the val or fun declaration where they are * implicitly scoped. *) val scope: Ast.Dec.t -> Ast.Dec.t end mlton-20210117+dfsg/mlton/elaborate/sources.cm000066400000000000000000000015251416264345000211240ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor Elaborate functor TypeEnv is ../../lib/mlton/sources.cm ../ast/sources.cm ../atoms/sources.cm ../control/sources.cm ../core-ml/sources.cm decs.sig decs.fun type-env.sig type-env.fun interface.sig interface.fun elaborate-env.sig elaborate-env.fun precedence-parse.sig precedence-parse.fun scope.sig scope.fun elaborate-core.sig elaborate-core.fun elaborate-sigexp.sig elaborate-sigexp.fun elaborate-modules.sig elaborate-modules.fun elaborate-programs.sig elaborate-programs.fun elaborate-mlbs.sig elaborate-mlbs.fun elaborate.sig elaborate.fun mlton-20210117+dfsg/mlton/elaborate/sources.mlb000066400000000000000000000016661416264345000213050ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb decs.sig decs.fun type-env.sig type-env.fun interface.sig interface.fun elaborate-env.sig elaborate-env.fun precedence-parse.sig precedence-parse.fun scope.sig scope.fun elaborate-core.sig elaborate-core.fun elaborate-sigexp.sig elaborate-sigexp.fun elaborate-modules.sig elaborate-modules.fun elaborate-programs.sig elaborate-programs.fun elaborate-mlbs.sig elaborate-mlbs.fun elaborate.sig elaborate.fun in functor Elaborate functor TypeEnv end mlton-20210117+dfsg/mlton/elaborate/type-env.fun000066400000000000000000003060361416264345000214060ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2012,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TypeEnv (S: TYPE_ENV_STRUCTS): TYPE_ENV = struct open S structure Layout = struct open Layout val bracket = fn l => seq [str "[", l, str "]"] end local open Layout in val seq = seq val str = str end local open LayoutPretty in val bracket = bracket val dontCare = dontCare val simple = simple end local open Tycon in structure AdmitsEquality = AdmitsEquality structure Kind = Kind end structure Field = Record.Field structure Srecord = SortedRecord structure Set = DisjointSet (* * Keep a clock that the elaborator ticks for each declaration. Associate each * type with a time that indicates the earliest declaration at which the type * occurs. The time is used for several things. * * 1. When we need to generalize a type, we can tell which unknowns appear * only in the declaration under consideration, and can hence be generalized. * * 2. Similarly, for type variables, we can tell if they appear in an earlier * declaration than the one in which they are to be bound, and hence can * not be generalized. * * 3. For "FlexRecord" types, we can tell when it appears only in the declaration * under consideration, and can hence be converted to a "GenFlexRecord" type * which allows for generalization of fields not yet known to be in the * flexRecord. * * 4. For type constructors, we can tell if they are used outside of the scope * of their definition. This handles the side conditions on rules 4, 17, and * 19. *) structure Time:> sig type t val <= : t * t -> bool val equals: t * t -> bool val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val now: unit -> t val region: t -> Region.t val tick: {region: Region.t} -> unit val zero: t end = struct datatype t = T of {clock: int, region: Region.t} local fun make f (T r) = f r in val clock = make #clock val region = make #region end fun layout t = Layout.tuple [Int.layout (clock t), Region.layout (region t)] local fun make f (t, t') = f (clock t, clock t') in val equals = make Int.equals val op <= = make Int.<= end fun max (t, t') = if t <= t' then t' else t fun min (t, t') = if t <= t' then t else t' val zero = T {clock = 0, region = Region.bogus} local val current: t ref = ref zero in fun now () = !current fun tick {region} = current := T {clock = 1 + clock (!current), region = region} end val tick = Trace.trace ("TypeEnv.Time.tick", Layout.ignore, Unit.layout) tick end structure Tyvar = struct open Tyvar local val {get = info: Tyvar.t -> {isEquality: bool, time: Time.t}, set = setInfo, ...} = Property.getSet (Tyvar.plist, Property.initRaise ("TypeEnv.Tyvar.info", Tyvar.layout)) fun init (a, ie) = setInfo (a, {isEquality = ie, time = Time.now ()}) in local fun make f = f o info in val time = make #time val isEquality = make #isEquality end fun makeString (s, {equality}) = let val a = newString s val _ = init (a, equality) in a end fun makeNoname {equality} = let val a = newNoname () val _ = init (a, equality) in a end fun makeLike a = let val a' = new a val _ = init (a', isEquality a) in a' end end local fun makeLocalNames () = let val a = Char.toInt #"a" val z = Char.toInt #"z" val cnt = Counter.new a fun reset () = Counter.reset (cnt, a) fun next b = let val n = Counter.next cnt in Layout.str (concat [if isEquality b then "''" else "'", if n > z then concat ["a", Int.toString (n - z)] else Char.toString (Char.fromInt n)]) end in {next = next, reset = reset} end in fun makeLayoutPretty () = let val {destroy, get = layoutPretty, set = setLayoutPretty, ...} = Property.destGetSet (plist, Property.initFun Tyvar.layout) fun localInit bs = let val {next, ...} = makeLocalNames () in Vector.foreach (bs, fn b => setLayoutPretty (b, next b)) end in {destroy = destroy, layoutPretty = layoutPretty, localInit = localInit} end fun makeLayoutPrettyLocal () = let val {next, reset} = makeLocalNames () val {destroy, get = layoutPretty, ...} = Property.destGet (plist, Property.initFun next) in {destroy = destroy, layoutPretty = layoutPretty, reset = fn () => (reset (); destroy ())} end end end structure TyvarExt = Tyvar structure Tycon = struct open Tycon local val {get = info: t -> {admitsEquality: AdmitsEquality.t ref, kind: Kind.t, prettyDefault: string, region: Region.t, time: Time.t}, set = setInfo, ...} = Property.getSet (Tycon.plist, Property.initRaise ("TypeEnv.Tycon.info", Tycon.layout)) fun init (c, a, k, pd, r) = setInfo (c, {admitsEquality = ref a, kind = k, prettyDefault = pd, region = r, time = Time.now ()}) val _ = List.foreach (Tycon.prims, fn {tycon = c, admitsEquality = a, kind = k, name = lpd, ...} => init (c, a, k, lpd, Region.bogus)) val made: Tycon.t list ref = ref [] in local fun make f = f o info in val admitsEquality = ! o make #admitsEquality val kind = make #kind val prettyDefault = make #prettyDefault val region = make #region val time = make #time fun setAdmitsEquality (t, ae) = (make #admitsEquality t) := ae end val layoutPrettyDefault = Layout.str o prettyDefault fun make {admitsEquality, kind, name, prettyDefault, region} = let val tycon = Tycon.newString name val _ = init (tycon, admitsEquality, kind, prettyDefault, region) val _ = List.push (made, tycon) in tycon end fun makeLike c = make {admitsEquality = admitsEquality c, kind = kind c, name = originalName c, prettyDefault = prettyDefault c, region = region c} fun scopeNew th = let val oldMade = !made val () = made := [] val res = th () val newMade = !made val () = made := oldMade in (res, newMade) end end fun makeBogus {name, kind, region} = make {admitsEquality = AdmitsEquality.Sometimes, kind = kind, name = name, prettyDefault = concat ["<", name, ">"], region = Option.fold (region, Region.bogus, #1)} end structure Equality:> sig datatype t = False | True | Unknown val and2: t * t -> t val andL: 'a list * ('a -> t) -> t val andV: 'a vector * ('a -> t) -> t val applyTycon: Tycon.t * t vector -> t val fromBool: bool -> t val join: t * t -> t val layout: t -> Layout.t val or2: t * t -> t end = struct datatype t = False | True | Unknown fun layout e = case e of False => Layout.str "False" | True => Layout.str "True" | Unknown => Layout.str "Unknown" fun and2 (e1, e2) = case (e1, e2) of (False, _) => False | (_, False) => False | (True, _) => e2 | (_, True) => e1 | (Unknown, Unknown) => Unknown fun andL (xs, f) = List.fold (xs, True, fn (x, e) => and2 (f x, e)) fun andV (xs, f) = Vector.fold (xs, True, fn (x, e) => and2 (f x, e)) fun or2 (e1, e2) = case (e1, e2) of (False, _) => e2 | (_, False) => e1 | (True, _) => True | (_, True) => True | (Unknown, Unknown) => Unknown fun join (e1, e2) = case (e1, e2) of (Unknown, _) => e2 | (_, Unknown) => e1 | (False, False) => False | (True, True) => True | _ => Error.bug "TypeEnv.Equality.join" fun applyTycon (c, es) = let datatype z = datatype AdmitsEquality.t in case Tycon.admitsEquality c of Always => True | Sometimes => andV (es, fn e => e) | Never => False end fun fromBool b = if b then True else False end structure Unknown = struct datatype t = T of {canGeneralize: bool, id: int} local fun make f (T r) = f r in val id = make #id end fun layout (T {canGeneralize, id, ...}) = seq [str "Unknown ", Layout.record [("canGeneralize", Bool.layout canGeneralize), ("id", Int.layout id)]] fun layoutPretty _ = str "???" fun equals (u, u') = id u = id u' val newId = Counter.generator 0 fun new {canGeneralize} = T {canGeneralize = canGeneralize, id = newId ()} fun join (T r, T r'): t = T {canGeneralize = #canGeneralize r andalso #canGeneralize r', id = newId ()} end (* Flexible record spine, i.e. a possibly extensible list of fields. *) structure Spine: sig type t val canAddFields: t -> bool val equals: t * t -> bool val fields: t -> Field.t list (* ensureField checks if field is there. If it is not, then ensureField * will add it unless no more fields are allowed in the spine. * It returns true iff it succeeds. *) val ensureField: t * Field.t -> bool val foldOverNew: t * (Field.t * 'a) list * 'b * (Field.t * 'b -> 'b) -> 'b val layout: t -> Layout.t val new: Field.t list -> t val noMoreFields: t -> unit val unify: t * t -> unit end = struct datatype t = T of {id: int, body: {fields: Field.t list ref, more: bool ref} Set.t} val newId = Counter.generator 0 fun new fields = T {id = newId (), body = Set.singleton {fields = ref fields, more = ref true}} fun equals (T {id = id1,...}, T {id = id2,...}) = id1 = id2 fun layout (T {body = s,...}) = let val {fields, more} = Set.! s in Layout.record [("fields", List.layout Field.layout (!fields)), ("more", Bool.layout (!more))] end fun canAddFields (T {body = s,...}) = ! (#more (Set.! s)) fun fields (T {body = s,...}) = ! (#fields (Set.! s)) fun ensureFieldValue ({fields, more}, f) = List.contains (!fields, f, Field.equals) orelse (!more andalso (List.push (fields, f); true)) fun ensureField (T {body = s,...}, f) = ensureFieldValue (Set.! s, f) fun noMoreFields (T {body = s,...}) = #more (Set.! s) := false fun unify (T {body = s1,...}, T {body = s2,...}) = let val {fields = fs1, more = m1} = Set.! s1 val {fields = fs2, more = m2} = Set.! s2 val _ = Set.union (s1, s2) val fs = List.union (!fs1, !fs2, Field.equals) val m = !m1 andalso !m2 val _ = Set.:= (s1, {fields = ref fs, more = ref m}) in () end fun foldOverNew (spine: t, fs, ac, g) = List.fold (fields spine, ac, fn (f, ac) => if List.exists (fs, fn (f', _) => Field.equals (f, f')) then ac else g (f, ac)) end structure Type = struct structure Overload = struct datatype t = Char | Int | Real | Word val equals: t * t -> bool = op = val toString = fn Char => "Char" | Int => "Int" | Real => "Real" | Word => "Word" val layout = Layout.str o toString val matchesTycon: t * Tycon.t -> bool = fn (ov, c) => case ov of Char => Tycon.isCharX c | Int => Tycon.isIntX c | Real => Tycon.isRealX c | Word => Tycon.isWordX c val defaultTycon: t -> Tycon.t = fn Char => Tycon.defaultChar () | Int => Tycon.defaultInt () | Real => Tycon.defaultReal () | Word => Tycon.defaultWord () val admitsEquality: t -> Equality.t = fn Char => Equality.True | Int => Equality.True | Real => Equality.False | Word => Equality.True end (* Tuples of length <> 1 are always represented as records. * There will never be tuples of length one. *) datatype t = T of {equality: Equality.t ref, plist: PropertyList.t, time: Time.t ref, ty: ty} Set.t and ty = Con of Tycon.t * t vector | FlexRecord of {fields: fields, spine: Spine.t} (* GenFlexRecord only appears in type schemes. * It will never be unified. * The fields that are filled in after generalization are stored in * extra. *) | GenFlexRecord of genFlexRecord | Overload of Overload.t | Record of t Srecord.t | Unknown of Unknown.t | Var of Tyvar.t withtype fields = (Field.t * t) list and genFlexRecord = {extra: unit -> {field: Field.t, tyvar: Tyvar.t} list, fields: (Field.t * t) list, spine: Spine.t} local fun make f (T s) = f (Set.! s) in val equality = make #equality val plist: t -> PropertyList.t = make #plist val time: t -> Time.t ref = make #time val getTy: t -> ty = make #ty end local open Layout in fun layoutFields fs = List.layout (Layout.tuple2 (Field.layout, layout)) fs and layout (T s) = let val {equality, time, ty, ...} = Set.! s in record [("time", Time.layout (!time)), ("equality", Equality.layout (!equality)), ("ty", case ty of Con (c, ts) => paren (align [seq [str "Con ", Tycon.layout c], Vector.layout layout ts]) | FlexRecord {fields, spine} => seq [str "Flex ", record [("fields", layoutFields fields), ("spine", Spine.layout spine)]] | GenFlexRecord {extra, fields, spine} => seq [str "GenFlex ", record [("extra", List.layout (fn {field, tyvar} => record [("field", Field.layout field), ("tyvar", Tyvar.layout tyvar)]) (extra ())), ("fields", layoutFields fields), ("spine", Spine.layout spine)]] | Overload ov => Overload.layout ov | Record r => Srecord.layout {record = r, separator = ": ", extra = "", layoutTuple = Vector.layout layout, layoutElt = layout} | Unknown u => Unknown.layout u | Var a => paren (seq [str "Var ", Tyvar.layout a]))] end end end structure Tycon = struct open Tycon val {get = opaqueExpansion: t -> (Type.t vector -> Type.t) option, set = setOpaqueExpansion, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val opaqueExpansion = Trace.trace ("TypeEnv.Tycon.opaqueExpansion", Tycon.layout, Layout.ignore) opaqueExpansion val setOpaqueExpansion = fn (c, f) => setOpaqueExpansion (c, SOME f) end structure TyconExt = Tycon structure LayoutPretty = struct open LayoutPretty fun record (ds: (Field.t * bool * t) list, flexible: bool) = simple (case ds of [] => if flexible then str "{...}" else str "{}" | _ => seq [str "{", Layout.mayAlign (Layout.separateRight (List.map (QuickSort.sortList (ds, fn ((f, _, _), (f', _, _)) => Field.<= (f, f')), fn (f, b, (l, _)) => let val f = Field.layout f val row = seq [f, str ": ", l] val row = if b then Layout.bracket row else row in row end), ",")), str (if flexible then ", ...}" else "}")]) fun tuple (ls: t vector): t = Tycon.layoutAppPretty (Tycon.tuple, ls, {layoutPretty = fn _ => Error.bug "TypeEnv.LayoutPretty.tuple: layoutPretty"}) end structure Type = struct open Type fun makeHom {con, expandOpaque, flexRecord, genFlexRecord, guard, overload, record, recursive, unknown, var} = let datatype status = Processing | Seen | Unseen val {destroy = destroyStatus, get = status, ...} = Property.destGet (plist, Property.initFun (fn _ => ref Unseen)) val {get, destroy = destroyProp} = Property.destGet (plist, Property.initRec (fn (t, get) => let val r = status t in case !r of Seen => Error.bug "TypeEnv.Type.makeHom: impossible" | Processing => recursive t | Unseen => (case guard t of NONE => let val _ = r := Processing fun loopFields fields = List.revMap (fields, fn (f, t) => (f, get t)) val res = case getTy t of Con (c, ts) => let fun no () = con (t, c, Vector.map (ts, get)) fun yes () = (case Tycon.opaqueExpansion c of NONE => no () | SOME f => get (f ts)) in if expandOpaque then yes () else no () end | FlexRecord {fields, spine} => flexRecord (t, {fields = loopFields fields, spine = spine}) | GenFlexRecord {extra, fields, spine} => genFlexRecord (t, {extra = extra, fields = loopFields fields, spine = spine}) | Overload ov => overload (t, ov) | Record r => record (t, Srecord.map (r, get)) | Unknown u => unknown (t, u) | Var a => var (t, a) val _ = r := Seen in res end | SOME res => (r := Seen; res)) end)) fun destroy () = (destroyStatus () ; destroyProp ()) in {hom = get, destroy = destroy} end fun hom (ty, z) = let val {hom, destroy} = makeHom z in Exn.finally (fn () => hom ty, destroy) end fun makeLayoutPretty {expandOpaque, layoutPrettyTycon, layoutPrettyTyvar} : {destroy: unit -> unit, layoutPretty: t -> LayoutPretty.t} = let val layoutAppPretty = fn (c, ts) => Tycon.layoutAppPretty (c, ts, {layoutPretty = layoutPrettyTycon}) fun con (_, c, ts) = layoutAppPretty (c, ts) fun con0 c = layoutAppPretty (c, Vector.new0 ()) fun flexRecord (_, {fields, spine}) = LayoutPretty.record (List.fold (fields, Spine.foldOverNew (spine, fields, [], fn (f, ac) => (f, false, simple (str "#???")) :: ac), fn ((f, t), ac) => (f, false, t) :: ac), Spine.canAddFields spine) fun genFlexRecord (_, {extra, fields, spine}) = LayoutPretty.record (List.fold (fields, List.revMap (extra (), fn {field, tyvar} => (field, false, simple (layoutPrettyTyvar tyvar))), fn ((f, t), ac) => (f, false, t) :: ac), Spine.canAddFields spine) fun overload (_, ov) = con0 (Overload.defaultTycon ov) fun record (_, r) = case Srecord.detupleOpt r of NONE => LayoutPretty.record (Vector.toListMap (Srecord.toVector r, fn (f, t) => (f, false, t)), false) | SOME ts => LayoutPretty.tuple ts fun recursive _ = simple (str "") fun unknown (_, u) = simple (Unknown.layoutPretty u) fun var (_, a) = simple (layoutPrettyTyvar a) val {destroy, hom = layoutPretty} = makeHom {con = con, expandOpaque = expandOpaque, flexRecord = flexRecord, genFlexRecord = genFlexRecord, guard = fn _ => NONE, overload = overload, record = record, recursive = recursive, unknown = unknown, var = var} in {destroy = destroy, layoutPretty = layoutPretty} end fun layoutPretty (t, {expandOpaque, layoutPrettyTycon, layoutPrettyTyvar}) = let val {destroy, layoutPretty} = makeLayoutPretty {expandOpaque = expandOpaque, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar} val res = layoutPretty t val () = destroy () in res end fun getEquality t = let (* guarded; only invoked if '!(Tycon.admitsEquality c) = Sometimes' *) fun con (_, c, es) = Equality.applyTycon (c, es) fun flexRecord (_, {fields: (Field.t * Equality.t) list, spine}) = if Spine.canAddFields spine then Equality.Unknown else Equality.andL (fields, #2) (* impossible; *) fun genFlexRecord _ = Error.bug "TypeEnv.Type.getEquality.genFlexRecord" (* guarded; an overload has known equality *) fun overload _ = Error.bug "TypeEnv.Type.getEquality.overload" fun record (_, r: Equality.t Srecord.t) = Equality.andV (Srecord.toVector r, #2) (* impossible *) fun recursive _ = Error.bug "TypeEnv.Type.getEquality.recursive" (* guarded; only invoked if '!(Type.equality t) = Unknown' *) fun unknown (_, _) = Equality.Unknown (* guarded; a tyvar has known equality *) fun var _ = Error.bug "TypeEnv.Type.getEquality.var" fun wrap (f, sel) arg = let val res = f arg val _ = equality (sel arg) := res in res end fun guard t = let val e = !(equality t) in case e of Equality.Unknown => NONE | _ => SOME e end in hom (t, {con = wrap (con, #1), expandOpaque = false, flexRecord = wrap (flexRecord, #1), genFlexRecord = genFlexRecord, guard = guard, overload = overload, record = wrap (record, #1), recursive = recursive, unknown = unknown, var = var}) end val getEquality = Trace.trace ("TypeEnv.Type.getEquality", layout, Equality.layout) getEquality val _ = getEquality fun deConOpt t = case getTy t of Con x => SOME x | _ => NONE fun deEta (t: t, tyvars: Tyvar.t vector): Tycon.t option = case deConOpt t of SOME (c, ts) => if Vector.length ts = Vector.length tyvars andalso Vector.foralli (ts, fn (i, t) => case getTy t of Var a => Tyvar.equals (a, Vector.sub (tyvars, i)) | _ => false) then SOME c else NONE | _ => NONE fun make {equality, time, ty}: t = T (Set.singleton {equality = ref equality, plist = PropertyList.new (), time = ref time, ty = ty}) fun newTy (ty: ty): t = let val (equality, time) = case ty of Con (c, ts) => (Equality.applyTycon (c, Vector.map (ts, ! o equality)), Vector.fold (ts, Tycon.time c, fn (t, t') => Time.max (!(time t), t'))) | GenFlexRecord _ => Error.bug "TypeEnv.Type.newTy: GenFlexRecord" | FlexRecord _ => (Equality.Unknown, Time.now ()) | Overload ov => (Overload.admitsEquality ov, Time.zero) | Record r => (Srecord.fold (r, Equality.True, fn (t, e') => Equality.and2 (!(equality t), e')), Srecord.fold (r, Time.zero, fn (t, t') => Time.max (!(time t), t'))) | Unknown _ => Error.bug "TypeEnv.Type.newTy: Unknown" | Var a => (Equality.fromBool (Tyvar.isEquality a), Tyvar.time a) in make {equality = equality, time = time, ty = ty} end fun setTy (T s, ty) = let val {equality, plist, time, ...} = Set.! s in Set.:= (s, {equality = equality, plist = plist, time = time, ty = ty}) end fun unknownAux {canGeneralize, equality, time} = let val u = Unknown.new {canGeneralize = canGeneralize} val t = make {equality = equality, time = time, ty = Unknown u} in (u, t) end val unknown = #2 o unknownAux fun new () = unknown {canGeneralize = true, equality = Equality.Unknown, time = Time.now ()} val new = Trace.trace ("TypeEnv.Type.new", Unit.layout, layout) new fun newFlex {fields, spine} = newTy (FlexRecord {fields = fields, spine = spine}) fun flexRecord record = let val v = Srecord.toVector record val spine = Spine.new (Vector.toListMap (v, #1)) fun isResolved (): bool = not (Spine.canAddFields spine) val t = newFlex {fields = Vector.toList v, spine = spine} in (t, isResolved) end fun record r = newTy (Record r) fun tuple ts = if 1 = Vector.length ts then Vector.first ts else newTy (Record (Srecord.tuple ts)) fun con (tycon, ts) = if Tycon.equals (tycon, Tycon.tuple) then tuple ts else newTy (Con (tycon, ts)) fun var a = newTy (Var a) end structure Ops = TypeOps (structure Tycon = Tycon open Type) structure UnifyResult = struct datatype ('a, 'b) t = NotUnifiable of 'a | Unified of 'b val layout = fn NotUnifiable _ => str "NotUnifiable" | Unified _ => str "Unified" end structure Type = struct (* Order is important, since want specialized definitions in Type to * override general definitions in Ops. *) open Ops Type val unit = tuple (Vector.new0 ()) fun isArrow t = case getTy t of Con (c, _) => Tycon.equals (c, Tycon.arrow) | _ => false fun isBool t = case getTy t of Con (c, _) => Tycon.isBool c | _ => false fun isCharX t = case getTy t of Con (c, _) => Tycon.isCharX c | Overload Overload.Char => true | _ => false fun isCPointer t = case getTy t of Con (c, _) => Tycon.isCPointer c | _ => false fun isInt t = case getTy t of Con (c, _) => Tycon.isIntX c | Overload Overload.Int => true | _ => false fun isUnit t = case getTy t of Record r => (case Srecord.detupleOpt r of NONE => false | SOME v => Vector.isEmpty v) | _ => false fun isUnknown t = case getTy t of Unknown _ => true | _ => false local fun make ov () = newTy (Overload ov) datatype z = datatype Overload.t in val unresolvedChar = make Char val unresolvedInt = make Int val unresolvedReal = make Real val unresolvedWord = make Word end fun unresolvedString () = vector (unresolvedChar ()) val traceCanUnify = Trace.trace2 ("TypeEnv.Type.canUnify", layout, layout, Bool.layout) fun canUnify arg = traceCanUnify (fn (t, t') => case (getTy t, getTy t') of (Unknown _, _) => true | (_, Unknown _) => true | (Con (c, ts), t') => conAnd (c, ts, t') | (t', Con (c, ts)) => conAnd (c, ts, t') | (Overload o1, Overload o2) => Overload.equals (o1, o2) | (Record r, Record r') => let val fs = Srecord.toVector r val fs' = Srecord.toVector r' in Vector.length fs = Vector.length fs' andalso Vector.forall2 (fs, fs', fn ((f, t), (f', t')) => Field.equals (f, f') andalso canUnify (t, t')) end | (Var a, Var a') => Tyvar.equals (a, a') | _ => false) arg and conAnd (c, ts, t') = case t' of Con (c', ts') => Tycon.equals (c, c') andalso Vector.forall2 (ts, ts', canUnify) | Overload ov => Vector.isEmpty ts andalso Overload.matchesTycon (ov, c) | _ => false (* checkEquality t checks that t is an equality type. If t is * not an equality type, then checkEquality t returns: * - a layout object highlighting violations in t * - an alternate type, replacing violations in t with fresh * equality unification variables and a layout object * highlighting the fresh unification variables. *) fun checkEquality (t, {layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t}) = let val layoutAppPretty = fn (c, ts) => Tycon.layoutAppPretty (c, ts, {layoutPretty = layoutPrettyTycon}) type ll = LayoutPretty.t * LayoutPretty.t local fun getLay sel (llo: ll option, _) = Option.fold (llo, dontCare, sel o #1) in val getLay1 = getLay #1 val getLay2 = getLay #2 end fun getTy (_, ty) = ty (* guarded; only invoked if 'Tycon.admitsEquality c = Sometimes' *) fun con (_, c, rs) = if Vector.forall (rs, Option.isNone o #1) then NONE else SOME (layoutAppPretty (c, Vector.map (rs, getLay1)), layoutAppPretty (c, Vector.map (rs, getLay2)), Type.con (c, Vector.map (rs, getTy))) fun doRecord (fls: (Field.t * ll) list, extra: bool, mk: unit -> t) = if List.isEmpty fls then NONE else let fun doit sel = LayoutPretty.record (List.map (fls, fn (f, lll) => (f, false, sel lll)), extra) in SOME (doit #1, doit #2, mk ()) end fun flexRecord (_, {fields, spine}) = doRecord (List.keepAllMap (fields, fn (f, r) => Option.map (#1 r, fn ll => (f, ll))), Spine.canAddFields spine, fn () => let val fields = List.map (fields, fn (f, r) => (f, getTy r)) in Type.newFlex {fields = fields, spine = spine} end) (* impossible *) fun genFlexRecord _ = Error.bug "TypeEnv.Type.checkEquality.genFlexRecord" (* guarded; an overload has known equality * only invoked if '!(Type.equality t) = False' *) fun overload (_, ov) = case ov of Overload.Real => let val ty = Type.unknown {canGeneralize = true, equality = Equality.True, time = Time.now ()} in SOME (bracket (simple (str "real")), bracket (simple (str "")), ty) end | _ => Error.bug "TypeEnv.Type.checkEquality.overload" fun record (_, r) = case Srecord.detupleOpt r of NONE => let val fields = Srecord.toVector r val fields' = Vector.keepAllMap (fields, fn (f, r) => Option.map (#1 r, fn ll => (f, ll))) in doRecord (Vector.toList fields', not (Vector.length fields = Vector.length fields'), fn () => let val fields = Vector.map (fields, fn (f, r) => (f, getTy r)) val fields = Srecord.fromVector fields in Type.record fields end) end | SOME rs => if Vector.forall (rs, Option.isNone o #1) then NONE else SOME (LayoutPretty.tuple (Vector.map (rs, getLay1)), LayoutPretty.tuple (Vector.map (rs, getLay2)), Type.tuple (Vector.map (rs, getTy))) (* impossible *) fun recursive _ = Error.bug "TypeEnv.Type.checkEquality.recursive" fun unknown (t, _) = case !(equality t) of Equality.False => let val ty = Type.unknown {canGeneralize = true, equality = Equality.True, time = Time.now ()} in SOME (bracket (simple (str "")), bracket (simple (str "")), ty) end | Equality.True => NONE | Equality.Unknown => NONE (* guarded; a tyvar has known equality * only invoked if '!(Type.equality t) = False' *) fun var (_, a) = if Tyvar.isEquality a then Error.bug "TypeEnv.Type.checkEquality.var" else let val ty = Type.unknown {canGeneralize = true, equality = Equality.True, time = Time.now ()} in SOME (bracket (simple (layoutPrettyTyvar a)), bracket (simple (str "")), ty) end fun wrap (f, sel) arg = case f arg of NONE => let val t = sel arg in equality t := Equality.True ; (NONE, t) end | SOME (l1, l2, t) => (SOME (l1, l2), t) (* Need extra guarding of Con, because proceeding with * hom/con would recursively force all Unknowns in type * args to Equality.True, even if tycon is * AdmitsEquality.Never. *) fun guard t = case !(equality t) of Equality.True => SOME (NONE, t) | _ => (case Type.getTy t of Con (c, ts) => (case Tycon.admitsEquality c of AdmitsEquality.Always => SOME (NONE, t) | AdmitsEquality.Sometimes => NONE | AdmitsEquality.Never => let val ty = Type.unknown {canGeneralize = true, equality = Equality.True, time = Time.now ()} in SOME (SOME ((bracket o layoutAppPretty) (c, Vector.map (ts, fn _ => dontCare)), bracket (simple (str ""))), ty) end) | _ => NONE) val res : ll option * t = hom (t, {con = wrap (con, #1), expandOpaque = false, flexRecord = wrap (flexRecord, #1), genFlexRecord = genFlexRecord, guard = guard, overload = wrap (overload, #1), record = wrap (record, #1), recursive = recursive, unknown = wrap (unknown, #1), var = wrap (var, #1)}) in case res of (NONE, _) => NONE | (SOME (l1, l2), t) => SOME (l1, (t, l2)) end (* checkTime (t, bound) checks that all components of t have * times no larger than bound. If t has components with time * larger than bound, then checkTime (t, bound) returns: * - a layout object highlighting violations in t * - an alternate type, replacing violations in t with fresh * unification variables at time bound and a layout object * highlighting the fresh unification variables. * - a list of violating tycons * - a list of violating tyvars *) fun makeCheckTime {layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} = let val layoutAppPretty = fn (c, ts) => Tycon.layoutAppPretty (c, ts, {layoutPretty = layoutPrettyTycon}) val times: Time.t list ref = ref [] val tycons: Tycon.t list ref = ref [] val tyvars: Tyvar.t list ref = ref [] type lll = LayoutPretty.t * LayoutPretty.t * LayoutPretty.t local fun getLay sel (lllo: lll option, _) = Option.fold (lllo, dontCare, sel o #1) in val getLay1 = getLay #1 val getLay2 = getLay #2 val getLay3 = getLay #3 end fun getTy (_, ty) = ty fun con bound (_, c, rs) = if Time.<= (Tycon.time c, bound) then if Vector.forall (rs, Option.isNone o #1) then NONE else SOME (layoutAppPretty (c, Vector.map (rs, getLay1)), layoutAppPretty (c, Vector.map (rs, getLay2)), layoutAppPretty (c, Vector.map (rs, getLay3)), Type.con (c, Vector.map (rs, getTy))) else let val (u, ty) = Type.unknownAux {canGeneralize = true, equality = Equality.Unknown, time = bound} in List.push (times, bound) ; List.push (tycons, c) ; SOME ((bracket o layoutAppPretty) (c, Vector.map (rs, getLay2)), layoutAppPretty (c, Vector.map (rs, getLay2)), bracket (simple (Unknown.layoutPretty u)), ty) end fun doRecord (fls: (Field.t * lll) list, extra: bool, mk: unit -> t) = if List.isEmpty fls then NONE else let fun doit sel = LayoutPretty.record (List.map (fls, fn (f, lll) => (f, false, sel lll)), extra) in SOME (doit #1, doit #2, doit #3, mk ()) end fun flexRecord (_, {fields, spine}) = doRecord (List.keepAllMap (fields, fn (f, r) => Option.map (#1 r, fn lll => (f, lll))), Spine.canAddFields spine, fn () => let val fields = List.map (fields, fn (f, r) => (f, getTy r)) in Type.newFlex {fields = fields, spine = spine} end) fun record (_, r) = case Srecord.detupleOpt r of NONE => let val fields = Srecord.toVector r val fields' = Vector.keepAllMap (fields, fn (f, r) => Option.map (#1 r, fn lll => (f, lll))) in doRecord (Vector.toList fields', not (Vector.length fields = Vector.length fields'), fn () => let val fields = Vector.map (fields, fn (f, r) => (f, getTy r)) val fields = Srecord.fromVector fields in Type.record fields end) end | SOME rs => if Vector.forall (rs, Option.isNone o #1) then NONE else SOME (LayoutPretty.tuple (Vector.map (rs, getLay1)), LayoutPretty.tuple (Vector.map (rs, getLay2)), LayoutPretty.tuple (Vector.map (rs, getLay3)), Type.tuple (Vector.map (rs, getTy))) fun var bound (_, a) = if Time.<= (Tyvar.time a, bound) then NONE else let val (u, ty) = Type.unknownAux {canGeneralize = true, equality = Equality.Unknown, time = bound} in List.push (times, bound) ; List.push (tyvars, a) ; SOME (bracket (simple (layoutPrettyTyvar a)), simple (layoutPrettyTyvar a), bracket (simple (Unknown.layoutPretty u)), ty) end fun genFlexRecord _ = Error.bug "TypeEnv.Type.checkTime.genFlexRecord" fun recursive _ = Error.bug "TypeEnv.Type.checkTime.recursive" fun checkTime (t, bound) = if Time.<= (!(time t), bound) then NONE else let fun wrap (f, sel) arg = case f arg of NONE => let val t = sel arg in time t := bound ; (NONE, t) end | SOME (l1, l2, l3, t) => (time t := bound ; (SOME (l1, l2, l3), t)) fun guard t = if Time.<= (!(time t), bound) then SOME (NONE, t) else NONE val res : lll option * t = hom (t, {con = wrap (con bound, #1), expandOpaque = false, flexRecord = wrap (flexRecord, #1), genFlexRecord = genFlexRecord, guard = guard, overload = wrap (fn _ => NONE, #1), record = wrap (record, #1), recursive = recursive, unknown = wrap (fn _ => NONE, #1), var = wrap (var bound, #1)}) in case res of (NONE, _) => NONE | (SOME (l1, _, l3), t) => SOME (l1, (t, l3)) end fun finishCheckTime () = {times = List.removeDuplicates (!times, Time.equals), tycons = List.removeDuplicates (!tycons, Tycon.equals), tyvars = List.removeDuplicates (!tyvars, Tyvar.equals)} in {checkTime = checkTime, finishCheckTime = finishCheckTime} end datatype z = datatype UnifyResult.t val traceUnify = Trace.trace2 ("TypeEnv.Type.unify", layout, layout, UnifyResult.layout: (LayoutPretty.t * LayoutPretty.t, unit) UnifyResult.t -> Layout.t) fun unify (t, t', {layoutPretty: t -> LayoutPretty.t, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t}) = let val layoutAppPretty = fn (c, ts) => Tycon.layoutAppPretty (c, ts, {layoutPretty = layoutPrettyTycon}) val checkEquality = fn t => checkEquality (t, {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) val {checkTime, finishCheckTime} = makeCheckTime {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar} fun unify arg = traceUnify (fn (outer as T s, outer' as T s') => if Set.equals (s, s') then Unified () else let fun notUnifiable (l: LayoutPretty.t, l': LayoutPretty.t) = NotUnifiable (l, l') fun notUnifiableBracket (l, l') = notUnifiable (bracket l, bracket l') fun flexToRecord (fields, spine) = (Vector.fromList fields, Spine.canAddFields spine) fun rigidToRecord r = (Srecord.toVector r, false) fun flexToFlexToRecord (fields, spine, equality, time, outer, spine') = let val () = List.foreach (Spine.fields spine', fn f' => ignore (Spine.ensureField (spine, f'))) val fields = Spine.foldOverNew (spine, fields, fields, fn (f, fields) => let val u = Type.unknown {canGeneralize = true, equality = Equality.or2 (equality, Equality.Unknown), time = time} in (f, u) :: fields end) val _ = setTy (outer, FlexRecord {fields = fields, spine = spine}) in flexToRecord (fields, spine) end fun flexToRigidToRecord (fields, spine, equality, time, outer, r') = let val () = Vector.foreach (Srecord.toVector r', fn (f', _) => ignore (Spine.ensureField (spine, f'))) val () = Spine.noMoreFields spine val fields = Spine.foldOverNew (spine, fields, fields, fn (f, fields) => let val u = Type.unknown {canGeneralize = true, equality = Equality.or2 (equality, Equality.Unknown), time = time} in (f, u) :: fields end) val r = Srecord.fromVector (Vector.fromList fields) val _ = setTy (outer, Record r) in rigidToRecord r end fun oneFlex ({fields, spine}, equality, time, outer, r', swap) = unifyRecords (flexToRigidToRecord (fields, spine, equality, time, outer, r'), rigidToRecord r', fn () => Unified (Record r'), notUnifiable o (fn (l, l') => if swap then (l', l) else (l, l'))) fun genFlexError () = Error.bug "TypeEnv.Type.unify: GenFlexRecord" val {equality, time, ty = t, plist} = Set.! s val {equality = equality', time = time', ty = t', ...} = Set.! s' fun not () = notUnifiableBracket (layoutPretty outer, layoutPretty outer') fun unifys (ts, ts', yes, no) = let val us = Vector.map2 (ts, ts', unify) in if Vector.forall (us, fn Unified _ => true | _ => false) then yes () else let val (ls, ls') = Vector.unzip (Vector.map (us, fn u => case u of Unified _ => (dontCare, dontCare) | NotUnifiable (l, l') => (l, l'))) in no (ls, ls') end end fun conAnd (c, ts, t, t', swap) = let fun maybe (z, z') = if swap then (z', z) else (z, z') in case t of Con (c', ts') => if Tycon.equals (c, c') then if Vector.length ts <> Vector.length ts' then let fun lay ts = simple (Layout.seq [Layout.str (concat ["<", Int.toString (Vector.length ts), " args> "]), Tycon.layout c]) in notUnifiableBracket (maybe (lay ts, lay ts')) end else unifys (ts, ts', fn () => Unified t, fn (ls, ls') => let fun lay ls = layoutAppPretty (c, ls) in notUnifiable (maybe (lay ls, lay ls')) end) else not () | Overload ov => if Vector.isEmpty ts andalso Overload.matchesTycon (ov, c) then Unified t' else not () | _ => not () end fun oneUnknown (u: Unknown.t, equality: Equality.t, time: Time.t, outer: t, t': Type.ty, outer': Type.t, swap: bool) = let (* This should fail if the unknown occurs in t. *) fun con (_, _, ts) = Vector.exists (ts, fn b => b) fun doFields fields = List.exists (fields, fn (_, b) => b) fun flexRecord (_, {fields, spine = _}) = doFields fields fun record (_, r) = Srecord.exists (r, fn b => b) fun unknown (_, u') = Unknown.equals (u, u') fun no _ = false val isCircular = hom (outer', {con = con, expandOpaque = false, flexRecord = flexRecord, genFlexRecord = fn _ => Error.bug "TypeEnv.Type.unify.oneUnknown: genFlexRecord", guard = fn _ => NONE, overload = no, record = record, recursive = fn _ => Error.bug "TypeEnv.Type.unify.oneUnknown: recursive", unknown = unknown, var = no}) in if isCircular then not () else let fun err (l, (t'', l'')) = (setTy (outer, getTy t'') ; notUnifiable (if swap then (l, l'') else (l'', l))) in case equality of Equality.True => (case checkEquality outer' of NONE => Unified t' | SOME (l, (t'', l'')) => err (l, (t'', l''))) | _ => (case checkTime (outer', time) of NONE => Unified t' | SOME (l, (t'', l'')) => err (l, (t'', l''))) end end val res = case (t, t') of (Unknown r, Unknown r') => (case (!equality, !equality') of (Equality.True, Equality.False) => notUnifiableBracket (simple (str ""), simple (str "")) | (Equality.False, Equality.True) => notUnifiableBracket (simple (str ""), simple (str "")) | _ => Unified (Unknown (Unknown.join (r, r')))) | (Unknown u, _) => oneUnknown (u, !equality, !time, outer, t', outer', false) | (_, Unknown u') => oneUnknown (u', !equality', !time', outer', t, outer, true) | (Con (c, ts), _) => conAnd (c, ts, t', t, false) | (_, Con (c, ts)) => conAnd (c, ts, t, t', true) | (FlexRecord f, Record r') => oneFlex (f, !equality, !time, outer, r', false) | (Record r, FlexRecord f') => oneFlex (f', !equality', !time', outer', r, true) | (FlexRecord {fields = fields, spine = spine}, FlexRecord {fields = fields', spine = spine'}) => let fun yes () = let val () = Spine.unify (spine, spine') val fields = List.fold (fields, fields', fn ((f, t), ac) => if List.exists (fields', fn (f', _) => Field.equals (f, f')) then ac else (f, t) :: ac) in Unified (FlexRecord {fields = fields, spine = spine}) end in unifyRecords (flexToFlexToRecord (fields, spine, !equality, !time, outer, spine'), flexToFlexToRecord (fields', spine', !equality', !time', outer', spine), yes, notUnifiable) end | (GenFlexRecord _, _) => genFlexError () | (_, GenFlexRecord _) => genFlexError () | (Overload ov1, Overload ov2) => if Overload.equals (ov1, ov2) then Unified t else not () | (Record r, Record r') => (case (Srecord.detupleOpt r, Srecord.detupleOpt r') of (NONE, NONE) => unifyRecords (rigidToRecord r, rigidToRecord r', fn () => Unified (Record r), notUnifiable) | (SOME ts, SOME ts') => if Vector.length ts = Vector.length ts' then unifys (ts, ts', fn () => Unified (Record r), fn (ls, ls') => notUnifiable (LayoutPretty.tuple ls, LayoutPretty.tuple ls')) else not () | _ => not ()) | (Var a, Var a') => if Tyvar.equals (a, a') then Unified t else not () | _ => not () val res = case res of NotUnifiable (l, l') => NotUnifiable (l, l') | Unified ty => let val () = Set.union (s, s') val () = time := Time.min (!time, !time') val () = equality := Equality.join (!equality, !equality') val () = Set.:= (s, {equality = equality, plist = plist, time = time, ty = ty}) in Unified () end in res end) arg and unifyRecords ((fields: (Field.t * t) vector, dots: bool), (fields': (Field.t * t) vector, dots': bool), yes, no) = let fun subset (fields, fields', ac, dots, ac', dots', skipBoth) = Vector.fold (fields, (ac, dots, ac', dots'), fn ((f, t), (ac, dots, ac', dots')) => case Vector.peek (fields', fn (f', _) => Field.equals (f, f')) of NONE => ((f, true, dontCare) :: ac, dots, ac', dots') | SOME (_, t') => if skipBoth then (ac, dots, ac', dots') else case unify (t, t') of NotUnifiable (l, l') => ((f, false, l) :: ac, dots, (f, false, l') :: ac', dots') | Unified _ => (ac, true, ac', true)) val (ac, dots, ac', dots') = subset (fields, fields', [], dots, [], dots', false) val (ac', dots', ac, dots) = subset (fields', fields, ac', dots', ac, dots, true) in case (ac, ac') of ([], []) => yes () | _ => no (LayoutPretty.record (ac, dots), LayoutPretty.record (ac', dots')) end val res = unify (t, t') in case res of NotUnifiable ((l, _), (l', _)) => let val {times, tycons, tyvars} = finishCheckTime () fun notes () = if List.isEmpty tycons andalso List.isEmpty tyvars then Layout.empty else let fun doit (xs, lay) = List.insertionSort (List.map (xs, fn x => (x, lay x)), fn ((_, l1), (_, l2)) => String.<= (Layout.toString l1, Layout.toString l2)) val tycons = doit (tycons, layoutPrettyTycon) val tyvars = doit (tyvars, layoutPrettyTyvar) val tys = List.map (tycons, #2) @ List.map (tyvars, #2) in Layout.align [seq [str "note: ", if List.length tys > 1 then str "types would escape their scope: " else str "type would escape its scope: ", seq (Layout.separate (tys, ", "))], (Layout.align o List.map) (tycons, fn (c, _) => seq [str "escape from: ", Region.layout (Tycon.region c)]), (Layout.align o List.map) (times, fn t => seq [str "escape to: ", Region.layout (Time.region t)])] end in NotUnifiable (l, l', {notes = notes}) end | Unified () => Unified () end local val {get: Tycon.t -> (t * Tycon.t) option, set, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) in fun setSynonym (c, c') = set (c, SOME (con (c, Vector.new0 ()), c')) val synonym = get end val () = List.foreach (CharSize.all, fn s => setSynonym (Tycon.char s, Tycon.word (WordSize.fromBits (CharSize.bits s)))) val () = List.foreach (IntSize.all, fn s => setSynonym (Tycon.int s, Tycon.word (WordSize.fromBits (IntSize.bits s)))) structure Overload = struct open Overload val defaultType = fn Char => con (Tycon.defaultChar (), Vector.new0 ()) | Int => con (Tycon.defaultInt (), Vector.new0 ()) | Real => con (Tycon.defaultReal (), Vector.new0 ()) | Word => con (Tycon.defaultWord (), Vector.new0 ()) end fun 'a simpleHom {con: t * Tycon.t * 'a vector -> 'a, expandOpaque: bool, record: t * (Field.t * 'a) vector -> 'a, replaceSynonyms: bool, var: t * Tyvar.t -> 'a} = let val unit = con (unit, Tycon.tuple, Vector.new0 ()) val unknown = unit fun sortFields (fields: (Field.t * 'a) list) = let val a = Array.fromList fields val () = QuickSort.sortArray (a, fn ((f, _), (f', _)) => Field.<= (f, f')) in Array.toVector a end fun unsorted (t, fields: (Field.t * 'a) list) = let val v = sortFields fields in record (t, v) end fun genFlexRecord (t, {extra, fields, spine = _}) = unsorted (t, List.fold (extra (), fields, fn ({field, tyvar}, ac) => (field, var (Type.var tyvar, tyvar)) :: ac)) fun flexRecord (t, {fields, spine}) = if Spine.canAddFields spine then Error.bug "TypeEnv.Type.simpleHom: flexRecord" else unsorted (t, Spine.foldOverNew (spine, fields, fields, fn (f, ac) => (f, unit) :: ac)) fun recursive _ = Error.bug "TypeEnv.Type.simpleHom.recursive" val con = if not replaceSynonyms then con else fn (t, c, ts) => let val (t, c) = case synonym c of NONE => (t, c) | SOME (t, c) => (t, c) in con (t, c, ts) end fun overload (t', ov) = let val t = Overload.defaultType ov val _ = unify (t, t', {layoutPretty = fn _ => Error.bug "TypeEnv.Type.simpleHom.overload: layoutPretty", layoutPrettyTycon = fn _ => Error.bug "TypeEnv.Type.simpleHom.overload: layoutPrettyTycon", layoutPrettyTyvar = fn _ => Error.bug "TypeEnv.Type.simpleHom.overload: layoutPrettyTyvar"}) in con (t, Overload.defaultTycon ov, Vector.new0 ()) end in makeHom {con = con, expandOpaque = expandOpaque, flexRecord = flexRecord, genFlexRecord = genFlexRecord, guard = fn _ => NONE, overload = overload, record = fn (t, r) => record (t, Srecord.toVector r), recursive = recursive, unknown = fn _ => unknown, var = var} end end structure Scheme = struct datatype t = General of {bound: unit -> Tyvar.t vector, canGeneralize: bool, flexes: Type.genFlexRecord list, tyvars: Tyvar.t vector, ty: Type.t} | Mono of Type.t val ty = fn General {ty, ...} => ty | Mono ty => ty val dest = fn General {bound, ty, ...} => (bound (), ty) | Mono ty => (Vector.new0 (), ty) val kind = fn General {bound, ...} => Kind.Arity (Vector.length (bound ())) | Mono _ => Kind.Arity 0 fun layout s = case s of Mono t => Type.layout t | General {canGeneralize, tyvars, ty, ...} => Layout.record [("canGeneralize", Bool.layout canGeneralize), ("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)] fun make {canGeneralize, tyvars, ty} = if Vector.isEmpty tyvars then Mono ty else General {bound = fn () => tyvars, canGeneralize = canGeneralize, flexes = [], tyvars = tyvars, ty = ty} val fromType = Mono fun fromTycon (tycon: Tycon.t): t = let val kind = Tycon.kind tycon val arity = case kind of Kind.Arity arity => arity | Kind.Nary => Error.bug "TypeEnv.Scheme.fromTycon: Kind.Nary" val tyvars = Vector.tabulate (arity, fn _ => Tyvar.makeNoname {equality = false}) in make {canGeneralize = true, ty = Type.con (tycon, Vector.map (tyvars, Type.var)), tyvars = tyvars} end fun instantiateAux (t: t, subst) = case t of Mono ty => {args = fn () => Vector.new0 (), instance = ty} | General {canGeneralize, flexes, tyvars, ty, ...} => (case Type.deEta (ty, tyvars) of SOME tycon => let val types = Vector.mapi (tyvars, fn (i, a) => subst {canGeneralize = canGeneralize, equality = Tyvar.isEquality a, index = i}) in {args = fn () => types, instance = Type.con (tycon, types)} end | NONE => let open Type val {destroy = destroyTyvarInst, get = tyvarInst: Tyvar.t -> Type.t option, set = setTyvarInst} = Property.destGetSetOnce (Tyvar.plist, Property.initConst NONE) val types = Vector.mapi (tyvars, fn (i, a) => let val t = subst {canGeneralize = canGeneralize, equality = Tyvar.isEquality a, index = i} val _ = setTyvarInst (a, SOME t) in t end) type z = {isNew: bool, ty: Type.t} fun isNew {isNew = b, ty = _} = b fun keep ty = {isNew = false, ty = ty} fun con (ty, c, zs) = if Vector.exists (zs, isNew) then {isNew = true, ty = Type.con (c, Vector.map (zs, #ty))} else keep ty val flexInsts = ref [] fun genFlexRecord (_, {extra = _, fields, spine}) = let val fields = List.revMap (fields, fn (f, t: z) => (f, #ty t)) val flex = newFlex {fields = fields, spine = spine} val _ = List.push (flexInsts, {flex = flex, spine = spine}) in {isNew = true, ty = flex} end fun record (t, r) = if Srecord.exists (r, isNew) then {isNew = true, ty = Type.record (Srecord.map (r, #ty))} else keep t fun recursive _ = (* If we get here, there has already been a type error * in the user's program, so we return a new type to avoid * compounding the error. *) {isNew = true, ty = Type.new ()} fun var (ty, a) = case tyvarInst a of NONE => {isNew = false, ty = ty} | SOME ty => {isNew = true, ty = ty} val {ty: Type.t, ...} = Type.hom (ty, {con = con, expandOpaque = false, flexRecord = keep o #1, genFlexRecord = genFlexRecord, guard = fn _ => NONE, overload = keep o #1, record = record, recursive = recursive, unknown = keep o #1, var = var}) val _ = destroyTyvarInst () val flexInsts = !flexInsts fun args (): Type.t vector = Vector.fromList (List.fold (flexes, Vector.toList types, fn ({fields, spine, ...}, ac) => let fun done peek = Spine.foldOverNew (spine, fields, ac, fn (f, ac) => (case peek f of NONE => Type.unit | SOME t => t) :: ac) in case List.peek (flexInsts, fn {spine = spine', ...} => Spine.equals (spine, spine')) of NONE => done (fn _ => NONE) | SOME {flex, ...} => let fun peekFields (fields, f) = Option.map (List.peek (fields, fn (f', _) => Field.equals (f, f')), #2) in done (case Type.getTy flex of FlexRecord {fields, ...} => (fn f => peekFields (fields, f)) | GenFlexRecord {extra, fields, ...} => (fn f => case peekFields (fields, f) of NONE => Option.map (List.peek (extra (), fn {field, ...} => Field.equals (f, field)), Type.var o #tyvar) | SOME t => SOME t) | Record r => (fn f => Srecord.peek (r, f)) | _ => Error.bug "TypeEnv.instantiate': General:strange flexInst") end end)) in {args = args, instance = ty} end) fun apply (s, ts) = #instance (instantiateAux (s, fn {index, ...} => Vector.sub (ts, index))) fun instantiate s = instantiateAux (s, fn {canGeneralize, equality, ...} => Type.unknown {canGeneralize = canGeneralize, equality = if equality then Equality.True else Equality.Unknown, time = Time.now ()}) val instantiate = Trace.trace ("TypeEnv.Scheme.instantiate", layout, Type.layout o #instance) instantiate fun fresh s = let val (tyvars, _) = dest s val tyvars = Vector.map (tyvars, Tyvar.makeLike) in (tyvars, apply (s, (Vector.map (tyvars, Type.var)))) end fun freshEq s = let val (tyvars, _) = dest s val tyvars = Vector.map (tyvars, fn _ => Tyvar.makeNoname {equality = true}) in (tyvars, apply (s, (Vector.map (tyvars, Type.var)))) end fun admitsEquality s = let val (_, ty) = freshEq s in case !(Type.equality ty) of Equality.False => false | Equality.True => true | Equality.Unknown => Error.bug "TypeEnv.Scheme.admitsEquality: Unknown" end val admitsEquality = Trace.trace ("TypeEnv.Scheme.admitsEquality", layout, Bool.layout) admitsEquality fun checkEquality (s, {layoutPrettyTycon}) = let fun layoutPrettyTyvar _ = Error.bug "TypeEnv.Scheme.checkEquality.layoutPrettyTyvar" val (_, ty) = freshEq s in Option.map (Type.checkEquality (ty, {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}), fn ((l, _), _) => l) end fun haveUnknowns s: bool = let fun con (_, _, bs) = Vector.exists (bs, fn b => b) fun no _ = false val {destroy, hom} = Type.makeHom {con = con, expandOpaque = false, flexRecord = fn (_, {fields, ...}) => List.exists (fields, #2), genFlexRecord = (fn (_, {fields, ...}) => List.exists (fields, #2)), guard = fn _ => NONE, overload = no, record = fn (_, r) => Srecord.exists (r, fn b => b), recursive = no, unknown = fn _ => true, var = no} val res = hom (ty s) val _ = destroy () in res end end fun 'a close region = let val beforeGen = Time.now () val () = Time.tick region in fn (ensure, varTypes, {error: 'a * Layout.t * Tyvar.t list -> unit, layoutPrettyTycon, layoutPrettyTyvar}) => let local fun checkTime (t, bound) = let val {checkTime, finishCheckTime} = Type.makeCheckTime {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar} in Option.map (checkTime (t, bound), fn z => (z, finishCheckTime ())) end in val varTypes = Vector.map (varTypes, fn ({isExpansive, ty, var}) => if not isExpansive then {isExpansive = false, ty = ty} else (case checkTime (ty, beforeGen) of NONE => {isExpansive = true, ty = ty} | SOME (((l, _), _), {tyvars, ...}) => (error (var, l, tyvars) ; {isExpansive = false, ty = ty}))) end val tyvars = Vector.toList ensure (* Convert all the unknown types bound at this level into tyvars. * Convert all the FlexRecords bound at this level into * GenFlexRecords. *) val (flexes, tyvars) = if Vector.forall (varTypes, fn {ty, ...} => Time.<= (!(Type.time ty), beforeGen)) then ([], tyvars) else let val flexes = ref [] val tyvars = ref tyvars fun flexRecord (t, _) = let val (fields, spine) = case Type.getTy t of Type.FlexRecord {fields, spine} => (fields, spine) | _ => Error.bug "TypeEnv.close.flexRecord: not FlexRecord" fun newField f = {field = f, tyvar = Tyvar.makeNoname {equality = false}} val extra = let val all = ref [] val fields = List.map (fields, fn (f, _) => (f, ())) in fn () => let val old = !all val fields = List.fold (old, fields, fn ({field, ...}, ac) => (field, ()) :: ac) val new = Spine.foldOverNew (spine, fields, old, fn (f, ac) => (newField f) :: ac) val () = all := new in new end end val gfr = {extra = extra, fields = fields, spine = spine} val _ = List.push (flexes, gfr) in Type.setTy (t, Type.GenFlexRecord gfr) end fun unknown (t, Unknown.T {canGeneralize, ...}) = if not canGeneralize then () else let val equality = Type.equality t val a = Tyvar.makeNoname {equality = case !equality of Equality.False => false | Equality.True => true | Equality.Unknown => (equality := Equality.False ; false)} val _ = List.push (tyvars, a) in Type.setTy (t, Type.Var a) end fun guard t = if Time.<= (!(Type.time t), beforeGen) then SOME () else NONE val {destroy, hom} = Type.makeHom {con = fn _ => (), expandOpaque = false, flexRecord = flexRecord, genFlexRecord = fn _ => (), guard = guard, overload = fn _ => (), record = fn _ => (), recursive = fn _ => (), unknown = unknown, var = fn _ => ()} val _ = Vector.foreach (varTypes, hom o #ty) val _ = destroy () in (!flexes, !tyvars) end (* For all fields that were added to the generalized flex records, * add a type variable. *) fun bound () = Vector.fromList (List.fold (flexes, tyvars, fn ({extra, fields, spine}, ac) => let val extra = extra () in Spine.foldOverNew (spine, fields, ac, fn (f, ac) => case List.peek (extra, fn {field, ...} => Field.equals (f, field)) of NONE => Error.bug "TypeEnv.close.bound: GenFlex missing field" | SOME {tyvar, ...} => tyvar :: ac) end)) val schemes = Vector.map (varTypes, fn {isExpansive, ty} => if isExpansive then Scheme.Mono ty else Scheme.General {bound = bound, canGeneralize = true, flexes = flexes, tyvars = Vector.fromList tyvars, ty = ty}) in {bound = bound, schemes = schemes} end end structure Type = struct open Type fun homConVar {con, expandOpaque, var} = let fun tuple (t, ts) = if 1 = Vector.length ts then Vector.first ts else con (t, Tycon.tuple, ts) in simpleHom {con = con, expandOpaque = expandOpaque, record = fn (t, fs) => tuple (t, Vector.map (fs, #2)), replaceSynonyms = true, var = var} end fun makeHom {con, expandOpaque, var} = homConVar {con = fn (_, c, ts) => con (c, ts), expandOpaque = expandOpaque, var = fn (_, a) => var a} fun deRecord t = let val {hom, destroy} = simpleHom {con = fn (t, _, _) => (t, NONE), expandOpaque = false, record = fn (t, fs) => (t, SOME (Vector.map (fs, fn (f, (t, _)) => (f, t)))), replaceSynonyms = true, var = fn (t, _) => (t, NONE)} val res = case #2 (hom t) of NONE => Error.bug "TypeEnv.Type.deRecord" | SOME fs => fs val _ = destroy () in res end fun deTupleOpt t = let val {destroy, hom} = homConVar {con = fn (t, c, ts) => (t, if Tycon.equals (c, Tycon.tuple) then SOME (Vector.map (ts, #1)) else NONE), expandOpaque = false, var = fn (t, _) => (t, NONE)} val res = #2 (hom t) val _ = destroy () in res end val deTupleOpt = Trace.trace ("TypeEnv.Type.deTupleOpt", layout, Option.layout (Vector.layout layout)) deTupleOpt fun hom (t, {con, expandOpaque = e, record, replaceSynonyms = r, var}) = let val {hom, destroy} = simpleHom {con = fn (_, c, v) => con (c, v), expandOpaque = e, record = fn (_, fs) => record (Srecord.fromVector fs), replaceSynonyms = r, var = fn (_, a) => var a} val res = hom t val _ = destroy () in res end fun copy t = hom (t, {con = Type.con, expandOpaque = false, record = Type.record, replaceSynonyms = false, var = Type.var}) val unify = fn (t1, t2, {error, layoutPretty, layoutPrettyTycon, layoutPrettyTyvar}) => case unify (t1, t2, {layoutPretty = layoutPretty, layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar}) of NotUnifiable (l1, l2, extra) => error (l1, l2, extra) | Unified () => () val checkTime = fn (t, bound, {layoutPrettyTycon, layoutPrettyTyvar}) => let val {checkTime, finishCheckTime} = makeCheckTime {layoutPrettyTycon = layoutPrettyTycon, layoutPrettyTyvar = layoutPrettyTyvar} in Option.map (checkTime (t, bound), fn ((l, _), (ty, _)) => (l, ty, let val {tycons, tyvars, ...} = finishCheckTime () in {tycons = tycons, tyvars = tyvars} end)) end end end mlton-20210117+dfsg/mlton/elaborate/type-env.sig000066400000000000000000000140201416264345000213650ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYPE_ENV_STRUCTS = sig include ATOMS end signature TYPE_ENV = sig include TYPE_ENV_STRUCTS structure Time: sig type t val now: unit -> t val tick: {region: Region.t} -> unit end structure Type: sig include TYPE_OPS (* can two types be unified? not side-effecting. *) val canUnify: t * t -> bool val checkTime: t * Time.t * {layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} -> (Layout.t * t * {tycons: Tycon.t list, tyvars: Tyvar.t list}) option val copy: t -> t val deEta: t * Tyvar.t vector -> Tycon.t option val deRecord: t -> (Record.Field.t * t) vector val flexRecord: t SortedRecord.t -> t * (unit -> bool) val hom: t * {con: Tycon.t * 'a vector -> 'a, expandOpaque: bool, record: 'a SortedRecord.t -> 'a, replaceSynonyms: bool, var: Tyvar.t -> 'a} -> 'a val isArrow: t -> bool val isBool: t -> bool val isCharX: t -> bool val isCPointer: t -> bool val isInt: t -> bool val isUnit: t -> bool val isUnknown: t -> bool val layout: t -> Layout.t val layoutPretty: t * {expandOpaque: bool, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} -> LayoutPretty.t val makeHom: {con: Tycon.t * 'a vector -> 'a, expandOpaque: bool, var: Tyvar.t -> 'a} -> {destroy: unit -> unit, hom: t -> 'a} val makeLayoutPretty: {expandOpaque: bool, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} -> {destroy: unit -> unit, layoutPretty: t -> LayoutPretty.t} val new: unit -> t val record: t SortedRecord.t -> t (* make two types identical (recursively). side-effecting. *) val unify: t * t * {error: Layout.t * Layout.t * {notes: unit -> Layout.t} -> unit, layoutPretty: t -> LayoutPretty.t, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t} -> unit val unresolvedChar: unit -> t val unresolvedInt: unit -> t val unresolvedReal: unit -> t val unresolvedString: unit -> t val unresolvedWord: unit -> t val var: Tyvar.t -> t end (* sharing type Type.intSize = IntSize.t *) sharing type Type.realSize = RealSize.t sharing type Type.wordSize = WordSize.t sharing type Type.tycon = Tycon.t structure Scheme: sig type t val admitsEquality: t -> bool val apply: t * Type.t vector -> Type.t val checkEquality: t * {layoutPrettyTycon: Tycon.t -> Layout.t} -> Layout.t option val dest: t -> Tyvar.t vector * Type.t val fresh: t -> Tyvar.t vector * Type.t val fromTycon: Tycon.t -> t val fromType: Type.t -> t val haveUnknowns: t -> bool val instantiate: t -> {args: unit -> Type.t vector, instance: Type.t} val kind: t -> TyconKind.t val layout: t -> Layout.t val make: {canGeneralize: bool, ty: Type.t, tyvars: Tyvar.t vector} -> t val ty: t -> Type.t end structure TyvarExt: sig type t val makeString: string * {equality: bool} -> t val makeNoname: {equality: bool} -> t val makeLayoutPretty: unit -> {destroy: unit -> unit, layoutPretty: t -> Layout.t, localInit: t vector -> unit} val makeLayoutPrettyLocal: unit -> {destroy: unit -> unit, layoutPretty: t -> Layout.t, reset: unit -> unit} val makeLike: t -> t end sharing type TyvarExt.t = Tyvar.t structure TyconExt: sig type t val admitsEquality: t -> AdmitsEquality.t val kind: t -> TyconKind.t val layoutPrettyDefault: t -> Layout.t val make: {admitsEquality: AdmitsEquality.t, kind: TyconKind.t, name: string, prettyDefault: string, region: Region.t} -> t val makeBogus: {name: string, kind: TyconKind.t, region: Region.t option} -> t val makeLike: t -> t val region: t -> Region.t val scopeNew: (unit -> 'a) -> ('a * t list) val setAdmitsEquality: t * AdmitsEquality.t -> unit val setOpaqueExpansion: t * (Type.t vector -> Type.t) -> unit end sharing type TyconExt.t = Tycon.t val close: {region: Region.t} -> (Tyvar.t vector * {isExpansive: bool, ty: Type.t, var: 'a} vector * {error: 'a * Layout.t * Tyvar.t list -> unit, layoutPrettyTycon: Tycon.t -> Layout.t, layoutPrettyTyvar: Tyvar.t -> Layout.t}) -> {bound: unit -> Tyvar.t vector, schemes: Scheme.t vector} end mlton-20210117+dfsg/mlton/front-end/000077500000000000000000000000001416264345000170535ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/front-end/.gitignore000066400000000000000000000001461416264345000210440ustar00rootroot00000000000000/ml.grm.desc /ml.grm.sig /ml.grm.sml /ml.lex.sml /mlb.grm.desc /mlb.grm.sig /mlb.grm.sml /mlb.lex.sml mlton-20210117+dfsg/mlton/front-end/front-end.fun000066400000000000000000000044061416264345000214650ustar00rootroot00000000000000(* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor FrontEnd (S: FRONT_END_STRUCTS): FRONT_END = struct open S structure LrVals = MLLrValsFun (structure Token = LrParser.Token structure Ast = Ast) structure Lex = MLLexFun (structure Tokens = LrVals.Tokens) structure Parse = JoinWithArg (structure ParserData = LrVals.ParserData structure Lex = Lex structure LrParser = LrParser) fun lexAndParse (source: Source.t, ins: In.t): Ast.Program.t = let val stream = Parse.makeLexer (fn n => In.inputN (ins, n)) {source = source} val lookahead = 30 val result = (#1 (Parse.parse (lookahead, stream, fn (s, left, right) => Control.errorStr (Region.make {left = left, right = right}, s), ()))) handle _ => let val i = Source.lineStart source val _ = Control.errorStr (Region.make {left = i, right = i}, "parse error") in Ast.Program.T [] end val () = Ast.Program.checkSyntax result (* Outputs AST to a file if Control.keepAST is true *) val () = if !Control.keepAST then File.withAppend (concat [!Control.inputFile, ".ast"], fn outputStream => (Out.outputl (outputStream, concat ["File: ", Source.name source]); Layout.output (Ast.Program.layout result, outputStream); Out.newline outputStream; Out.newline outputStream)) else () in result end fun lexAndParseFile (f: File.t) = File.withIn (f, fn ins => lexAndParse (Source.new f, ins)) val lexAndParseFile = Trace.trace ("FrontEnd.lexAndParseFile", File.layout, Ast.Program.layout) lexAndParseFile end mlton-20210117+dfsg/mlton/front-end/front-end.sig000066400000000000000000000006741416264345000214620ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature FRONT_END_STRUCTS = sig structure Ast: AST end signature FRONT_END = sig include FRONT_END_STRUCTS val lexAndParseFile: File.t -> Ast.Program.t end mlton-20210117+dfsg/mlton/front-end/ml-yacc-lib-proxy.cm000066400000000000000000000004241416264345000226440ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library library(../../lib/mlyacc-lib/ml-yacc-lib.cm) - ( signature STREAM structure Stream ) is ../../lib/mlyacc-lib/ml-yacc-lib.cm mlton-20210117+dfsg/mlton/front-end/ml.grm000066400000000000000000001377541416264345000202130ustar00rootroot00000000000000(* Heavily modified from SML/NJ sources. *) (* ml.grm * * Copyright 1989,1992 by AT&T Bell Laboratories * * SML/NJ is released under a HPND-style license. * See the file NJ-LICENSE for details. *) (* Copyright (C) 2008,2009,2014-2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) fun reg (left, right) = Region.make {left = left, right = right} fun error (reg, msg) = Control.error (reg, Layout.str msg, Layout.empty) local open Control.Elaborate in val allowOptBar = fn () => current allowOptBar val allowOptSemicolon = fn () => current allowOptSemicolon val allowRecordPunExps = fn () => current allowRecordPunExps end open Ast structure Field = Record.Field structure Srecord = SortedRecord structure Type = struct open Type fun tuple ts = Record (Record.tuple (Vector.map (ts, fn t => (Region.bogus, t)))) val unit = tuple (Vector.new0 ()) fun arrow (t1, t2) = Con (Longtycon.arrow, Vector.new2 (t1, t2)) end structure DatBind = struct open DatBind fun make (dbs, withtypes, left, right) = makeRegion' (T {datatypes = dbs, withtypes = withtypes}, left, right) end structure Pat = struct open Pat fun tuple ps = if 1 = Vector.length ps then Paren (Vector.sub (ps, 0)) else Tuple ps val unit = tuple (Vector.new0 ()) val bogus = unit fun makeAs (p1: t, p2: t): node = let fun err () = error (Pat.region p1, "must have variable to left in as pattern") fun fixopVar (p : t) = case node p of FlatApp ps => if 1 = Vector.length ps then (case node (Vector.sub (ps, 0)) of Var {fixop,name} => (case Longvid.split name of ([], vid) => SOME (fixop, Vid.toVar vid) | _ => let val () = err () in SOME (Fixop.None, Var.bogus) end) | _ => NONE) else NONE | _ => NONE in case fixopVar p1 of SOME (fixop, var) => Layered {fixop = fixop, var = var, constraint = NONE, pat = p2} | NONE => case node p1 of Pat.Constraint (p, t) => (case fixopVar p of SOME (fixop, var) => Layered {fixop = fixop, var = var, constraint = SOME t, pat = p2} | _ => (err (); bogus)) | _ => (err (); bogus) end end structure Exp = struct open Exp fun tuple es = if 1 = Vector.length es then Paren (Vector.sub (es, 0)) else Record (Record.tuple (Vector.map (es, fn e => (Region.bogus, e)))) val unit = tuple (Vector.new0 ()) end structure Dec = struct open Dec fun sequence (d1: t, d2: t): t = makeRegion (case (node d1, node d2) of (SeqDec d1, SeqDec d2) => SeqDec (Vector.concat [d1, d2]) | (SeqDec d1, _) => SeqDec (Vector.concat [d1, Vector.new1 d2]) | (_, SeqDec d2) => SeqDec (Vector.concat [Vector.new1 d1, d2]) | _ => SeqDec (Vector.new2 (d1, d2)), Region.append (region d1, region d2)) end structure Spec = struct open Spec (* Some of this mess is so that a sharing equation captures as * many specs as possible in its scope. *) fun seq (s: t, s': t): t = let fun reg s'' = makeRegion (s'', Region.append (region s, region s')) in case (node s, node s') of (Empty, _) => s' | (_, Empty) => s | (_, Seq (s1, s2)) => reg (Seq (seq (s, s1), s2)) | (_, Sharing {spec, equation}) => reg (Sharing {spec = seq (s, spec), equation = equation}) | _ => reg (Seq (s, s')) end end fun consTopdec (d, dss) = case dss of [] => [[d]] | ds :: dss => (d :: ds) :: dss type rule = Pat.t * Exp.t type clause = {pats : Pat.t vector, resultType : Type.t option, body : Exp.t} type clauses = clause vector type eb = Con.t * EbRhs.t type db = {tyvars: Tyvar.t vector, tycon: Tycon.t, cons: (Con.t * Type.t option) vector} type tb = {def: Type.t, tycon: Tycon.t, tyvars: Tyvar.t vector} type strdesc = Strid.t * Sigexp.t type typdesc = {tyvars: Tyvar.t vector, tycon: Tycon.t} type valdesc = Var.t * Type.t type exndesc = Con.t * Type.t option type strbind = {name: Strid.t, def: Strexp.t, constraint: SigConst.t} type sigbind = Sigid.t * Sigexp.t type funbind = {name : Fctid.t, arg : FctArg.t, result : SigConst.t, body : Strexp.t} type vb = {pat: Pat.t, exp: Exp.t} type rvb = {pat: Pat.t, match: Match.t} fun longIdFromTok (s, left, right) = let val syms = List.map (String.split (s, #"."), Symbol.fromString) in (syms, reg (left, right)) end fun shortIdFromTok (s, left, right) = (Symbol.fromString s, reg (left, right)) fun longIdFromShortId (sym, reg) = ([sym], reg) fun cons1 (x, (l, y)) = (x :: l, y) fun augment (id, sigexp, (whereeqns, binds)) = (id, Sigexp.wheree (sigexp, Vector.fromList whereeqns)) :: binds fun 'a augment1 ((strexp: Strexp.t, sigconst: Sigexp.t -> SigConst.t, sigexp: Sigexp.t), (whereeqns: WhereEquation.t list, z: 'a)): Strexp.t * 'a = let val sigexp = Sigexp.wheree (sigexp, Vector.fromList whereeqns) in (Strexp.makeRegion (Strexp.Constrained (strexp, sigconst sigexp), Region.append (Strexp.region strexp, Sigexp.region sigexp)), z) end type 'a whereAndEqns = WhereEquation.t list * 'a list %% %term CHAR of IntInf.t | INT of {digits: string, extended: bool, negate: bool, radix: StringCvt.radix} | SHORTALPHANUMID of string | SHORTSYMID of string | LONGALPHANUMID of string | LONGSYMID of string | REAL of string | STRING of IntInf.t vector | TYVAR of string | WORD of {digits: string, radix: StringCvt.radix} | ABSTYPE | AND | ANDALSO | ARROW | AS | ASTERISK | BAR | CASE | COLON | COLONGT | COMMA | DATATYPE | DOTDOTDOT | ELSE | END | EOF | EQUALOP | EQTYPE | EXCEPTION | DO | DARROW | FN | FUN | FUNCTOR | HANDLE | HASH | HASHLBRACKET | IF | IN | INCLUDE | INFIX | INFIXR | LBRACE | LBRACKET | LET | LOCAL | LPAREN | NONFIX | ORELSE | OF | OP | OPEN | OVERLOAD | RAISE | RBRACE | RBRACKET | REC | RPAREN | SEMICOLON | SHARING | SIG | SIGNATURE | STRUCT | STRUCTURE | THEN | TYPE | VAL | WHERE | WHILE | WILD | WITH | WITHTYPE (* Extensions *) | BUILD_CONST | COMMAND_LINE_CONST | CONST | ADDRESS | EXPORT | IMPORT | SYMBOL | PRIM | SHOW_BASIS of File.t %nonterm aexp of Exp.node | apat of Pat.t | apatnode of Pat.node | apats of Pat.t list | app_exp of Exp.t list | arg_fct of Strexp.t | ieattributes of PrimKind.ImportExportAttribute.t list | barcpats of Pat.t list | clause of clause | clauses of clause list | clausesTop of clauses | commapats of Pat.t list | con of Con.t | const of Const.t | const' of Const.node | constr of Con.t * Type.t option | constraint of Type.t option | constrs of (Con.t * Type.t option) list | constOrBool of Const.t | cpat of Pat.t | cpatnode of Pat.node | datBind of DatBind.t | datatypeRhs of DatatypeRhs.t | datatypeRhsnode of DatatypeRhs.node | db of db | dbs of db vector | dbs' of db list | dec of Dec.t | decnode of Dec.node | decnolocal of Dec.node | decs of Dec.t | decsnode of Dec.node | digit of int | eb of eb | ebrhs of EbRhs.t | ebrhsnode of EbRhs.node | ebs of eb list | elabel of (Field.t * (Region.t * Exp.t)) | elabels of (Field.t * (Region.t * Exp.t)) list | exndesc of exndesc | exndescs of exndesc list | exp of Exp.t | exp_2c of Exp.t list | exp_list of Exp.t list | exp_ps of Exp.t list | expnode of Exp.node | expsAndTopdecs of Topdec.t list list | fctarg of FctArg.node | fctid of Fctid.t | field of Field.t | fixity of Fixity.t | funbinds of funbind list | funbinds' of Strexp.t * funbind list | funbinds'1 of funbind whereAndEqns | funbinds'1' of funbind whereAndEqns | funbinds'2 of funbind list | funs of clauses list | idField of Symbol.t * Region.t | int of IntInf.t | longcon of Longcon.t | longAlphanumId of Symbol.t list * Region.t | longSymId of Symbol.t list * Region.t | longstrid of Longstrid.t | longstrideqns of Longstrid.t list | longstrids of Longstrid.t list | longtycon of Longtycon.t | longtyconeqns of Longtycon.t list | longvid of Longvid.t | longvidEqual of Longvid.t | longvidNoEqual of Longvid.t | longvidands of Longvid.t list | match of Match.t | numericField of int | opaspat of Pat.t option | opcon of Con.t | optbar of unit | optbar' of unit | optsemicolon of unit | pat of Pat.t | patitem of (Field.t * Region.t * Pat.Item.t) | patitems of ((Field.t * Region.t * Pat.Item.t) list * bool) | pats of Pat.t list | priority of Priority.t | program of Program.t | repl of DatatypeRhs.node | rule of rule | rules of rule list | rvalbind of rvb list | sdec of Dec.t | sdecs of Dec.t | sdecsPlus of Dec.t | sharespec of SharingEquation.node | shortAlphanumId of Symbol.t * Region.t | shortSymId of Symbol.t * Region.t | sigbinds of sigbind list | sigbinds' of sigbind whereAndEqns | sigbinds'' of sigbind whereAndEqns | sigconst of SigConst.t | sigexp of Sigexp.t | sigexp' of Sigexp.t | sigexp'node of Sigexp.node | sigexpnode of Sigexp.node | sigid of Sigid.t | sigids of Sigid.t list | spec of Spec.t | specnode of Spec.node | specs of Spec.t | strbinds of strbind list | strbinds' of Strexp.t * strbind list | strbinds'1 of strbind whereAndEqns | strbinds'1' of strbind whereAndEqns | strbinds'2 of strbind list | strdec of Strdec.t | strdecnode of Strdec.node | strdecs of Strdec.t | strdecsnode of Strdec.node | strdescs of strdesc list | strdescs' of strdesc whereAndEqns | strdescs'' of strdesc whereAndEqns | strexp of Strexp.t | strexp1 of Strexp.t * (Sigexp.t -> SigConst.t) * Sigexp.t | strexp2 of Strexp.t | strexp2node of Strexp.node | strexpnode of Strexp.node | strid of Strid.t | string of string | symattributes of PrimKind.SymbolAttribute.t list | tb of tb | tbs of tb vector | tbs' of tb list | tlabel of (Field.t * (Region.t * Type.t)) | tlabels of (Field.t * (Region.t * Type.t)) list | topdec of Topdec.t | topdecnode of Topdec.node | topdecs of Topdec.t list list | tuple_ty of Type.t list | ty of Type.t | ty' of Type.t | ty'node of Type.node | ty0_pc of Type.t list | tyOpt of Type.t option | tycon of Tycon.t | tynode of Type.node | typBind of TypBind.t | typdesc of typdesc | typdescs of typdesc list | tyvar of Tyvar.t | tyvar_pc of Tyvar.t list | tyvars of Tyvar.t vector | tyvarseq of Tyvar.t vector | valbind of vb list * rvb list | valbindTop of vb vector * rvb vector | valdesc of valdesc | valdescs of valdesc list | vid of Vid.t | vidEqual of Vid.t | vidNoEqual of Vid.t | vids of Vid.t list | whereandeqns of WhereEquation.t list | whereeqn of (SourcePos.t -> WhereEquation.t) | whereeqns of WhereEquation.t vector | whereeqns' of WhereEquation.t list | withtypes of TypBind.t | word of IntInf.t %verbose %pos SourcePos.t %eop EOF %noshift EOF %header (functor MLLrValsFun (structure Token: TOKEN structure Ast: AST)) %nonassoc WITHTYPE %right AND %right ARROW %right DARROW %left DO %left ELSE %left RAISE %right HANDLE %left ORELSE %left ANDALSO %right AS %left COLON %name ML %keyword ABSTYPE AND AS CASE DATATYPE DOTDOTDOT ELSE END EQTYPE EXCEPTION DO DARROW FN FUN FUNCTOR HANDLE IF IN INCLUDE INFIX INFIXR LET LOCAL NONFIX OF OP OPEN OVERLOAD RAISE REC SHARING SIG SIGNATURE STRUCT STRUCTURE THEN TYPE VAL WHILE WHERE WITH WITHTYPE ORELSE ANDALSO %change -> VAL | -> THEN | -> ELSE | -> LPAREN | -> SEMICOLON | DARROW -> EQUALOP | EQUALOP -> DARROW | AND -> ANDALSO | COLON -> OF | SEMICOLON -> COMMA | COMMA -> SEMICOLON | -> IN SHORTALPHANUMID END | -> ELSE SHORTALPHANUMID %value CHAR (IntInf.fromInt (Char.ord #"a")) %value INT ({digits = "0", extended = false, negate = false, radix = StringCvt.DEC}) %value SHORTALPHANUMID ("bogus") %value REAL ("13.0") %value STRING (Vector.fromList []) %value TYVAR ("'a") %value WORD ({digits = "0", radix = StringCvt.DEC}) %% program: expsAndTopdecs (Program.T expsAndTopdecs) expsAndTopdecs: exp SEMICOLON expsAndTopdecs ([Topdec.fromExp exp] :: expsAndTopdecs) | topdecs (topdecs) topdecs: ([]) | topdec topdecs (consTopdec (topdec, topdecs)) | SEMICOLON expsAndTopdecs ([] :: expsAndTopdecs) topdec : topdecnode (Topdec.makeRegion' (topdecnode, topdecnodeleft, topdecnoderight)) topdecnode : strdec (Topdec.Strdec strdec) | SIGNATURE sigbinds (let val sigbinds = Vector.fromList sigbinds val d = Topdec.Signature sigbinds in d end) | FUNCTOR funbinds (Topdec.Functor (Vector.fromList funbinds)) (*---------------------------------------------------*) (* Structures *) (*---------------------------------------------------*) strdecs : strdecsnode (Strdec.makeRegion' (strdecsnode, strdecsnodeleft, strdecsnoderight)) strdecsnode : (Strdec.Seq []) | SEMICOLON strdecs (Strdec.Seq [strdecs]) | strdec strdecs (Strdec.Seq [strdec, strdecs]) strdec : strdecnode (Strdec.makeRegion' (strdecnode, strdecnodeleft, strdecnoderight)) strdecnode : STRUCTURE strbinds (let val strbinds = Vector.fromList strbinds val d = Strdec.Structure strbinds in d end) | LOCAL strdecs IN strdecs END (Strdec.Local (strdecs1, strdecs2)) | decnolocal (Strdec.Core (Dec.makeRegion' (decnolocal, decnolocalleft, decnolocalright))) | SHOW_BASIS (Strdec.ShowBasis SHOW_BASIS) strbinds : strid sigconst EQUALOP strbinds' (let val (def,strbinds) = strbinds' in {name = strid, def = def, constraint = sigconst} :: strbinds end) strbinds' : strexp1 strbinds'1 (augment1 (strexp1, strbinds'1)) | strexp2 strbinds'2 ((strexp2,strbinds'2)) strbinds'1 : strbinds'2 (([], strbinds'2)) | WHERE whereeqn strbinds'1' (cons1 (whereeqn WHEREleft, strbinds'1')) strbinds'1' : strbinds'1 (strbinds'1) | AND whereeqn strbinds'1' (cons1 (whereeqn ANDleft, strbinds'1')) strbinds'2 : ([]) | AND strbinds (strbinds) strexp : strexpnode (Strexp.makeRegion' (strexpnode, strexpnodeleft, strexpnoderight)) strexpnode : strexp1 (let val (strexp, sigconst, sigexp) = strexp1 in Strexp.Constrained (strexp, sigconst sigexp) end) | strexp1 whereeqns (let val (strexp,sigconst,sigexp) = strexp1 val sigexp = Sigexp.wheree (sigexp, whereeqns) in Strexp.Constrained (strexp, sigconst sigexp) end) | strexp2node (strexp2node) strexp1 : strexp COLON sigexp' ((strexp,SigConst.Transparent,sigexp')) | strexp COLONGT sigexp' ((strexp,SigConst.Opaque,sigexp')) strexp2 : strexp2node (Strexp.makeRegion' (strexp2node, strexp2nodeleft, strexp2noderight)) strexp2node : longstrid (Strexp.Var longstrid) | STRUCT strdecs END (Strexp.Struct strdecs) | fctid arg_fct (Strexp.App (fctid, arg_fct)) | LET strdecs IN strexp END (Strexp.Let (strdecs, strexp)) arg_fct : LPAREN strexp RPAREN (Strexp.makeRegion' (Strexp.node strexp, LPARENleft, RPARENright)) | LPAREN strdecs RPAREN (Strexp.makeRegion' (Strexp.Struct strdecs, LPARENleft, RPARENright)) (*---------------------------------------------------*) (* Signatures *) (*---------------------------------------------------*) sigexp : sigexp' (sigexp') | sigexp' whereeqns (Sigexp.wheree (sigexp', whereeqns)) whereeqns : whereeqns' (Vector.fromList whereeqns') whereeqns' : WHERE whereeqn ([whereeqn WHEREleft]) | WHERE whereeqn whereeqns' (whereeqn WHEREleft :: whereeqns') | WHERE whereeqn whereandeqns (whereeqn WHEREleft :: whereandeqns) whereandeqns : AND whereeqn ([whereeqn ANDleft]) | AND whereeqn whereandeqns (whereeqn ANDleft :: whereandeqns) | AND whereeqn whereeqns' (whereeqn ANDleft :: whereeqns') sigbinds: sigid EQUALOP sigexp' sigbinds' (augment (sigid, sigexp', sigbinds')) sigexp' : sigexp'node (Sigexp.makeRegion' (sigexp'node, sigexp'nodeleft, sigexp'noderight)) sigexp'node : sigid (Sigexp.Var sigid) | SIG specs END (Sigexp.Spec specs) sigbinds': (([], [])) | AND sigbinds (([], sigbinds)) | WHERE whereeqn sigbinds'' (cons1 (whereeqn WHEREleft, sigbinds'')) sigbinds'' : sigbinds' (sigbinds') | AND whereeqn sigbinds'' (cons1 (whereeqn ANDleft, sigbinds'')) whereeqn : TYPE tyvars longtycon EQUALOP ty (fn eqnleft => WhereEquation.makeRegion' (WhereEquation.Type {tyvars = tyvars, longtycon = longtycon, ty = ty}, eqnleft, tyright)) sigconst : (SigConst.None) | COLON sigexp (SigConst.Transparent sigexp) | COLONGT sigexp (SigConst.Opaque sigexp) specs : (Spec.makeRegion (Spec.Empty, Region.bogus)) | SEMICOLON specs (specs) | spec specs (Spec.seq (spec, specs)) spec : specnode (Spec.makeRegion' (specnode, specnodeleft, specnoderight)) specnode : VAL valdescs (Spec.Val (Vector.fromList valdescs)) | TYPE typdescs (Spec.Type (Vector.fromList typdescs)) | TYPE typBind (Spec.TypeDefs typBind) | EQTYPE typdescs (Spec.Eqtype (Vector.fromList typdescs)) | DATATYPE datatypeRhs (Spec.Datatype datatypeRhs) | EXCEPTION exndescs (Spec.Exception (Vector.fromList exndescs)) | STRUCTURE strdescs (Spec.Structure (Vector.fromList strdescs)) | INCLUDE sigexp (Spec.IncludeSigexp sigexp) | INCLUDE sigid sigids (* p. 59 *) (Spec.IncludeSigids (Vector.fromList (sigid :: sigids)) ) | sharespec (Spec.Sharing {spec = Spec.makeRegion' (Spec.Empty, sharespecleft, sharespecright), equation = (SharingEquation.makeRegion' (sharespec, sharespecleft, sharespecright))}) sharespec : SHARING TYPE longtyconeqns (SharingEquation.Type longtyconeqns) | SHARING longstrideqns (SharingEquation.Structure longstrideqns) longstrideqns : longstrid EQUALOP longstrid ([longstrid1,longstrid2]) | longstrid EQUALOP longstrideqns (longstrid :: longstrideqns) longtyconeqns : longtycon EQUALOP longtycon ([longtycon1,longtycon2]) | longtycon EQUALOP longtyconeqns (longtycon :: longtyconeqns) strdescs : strid COLON sigexp' strdescs' (augment (strid, sigexp', strdescs')) strdescs' : (([], [])) | AND strdescs (([], strdescs)) | WHERE whereeqn strdescs'' (cons1 (whereeqn WHEREleft, strdescs'')) strdescs'' : strdescs' (strdescs') | AND whereeqn strdescs'' (cons1 (whereeqn ANDleft, strdescs'')) typdescs : typdesc ([typdesc]) | typdesc AND typdescs (typdesc :: typdescs) typdesc : tyvars tycon ({tyvars = tyvars, tycon = tycon}) valdescs : valdesc ([valdesc]) | valdesc AND valdescs (valdesc :: valdescs) valdesc : vid COLON ty (Vid.toVar vid, ty) exndescs : exndesc ([exndesc]) | exndesc AND exndescs (exndesc :: exndescs) exndesc : con tyOpt (con, tyOpt) tyOpt : (NONE) | OF ty (SOME ty) (*---------------------------------------------------*) (* Functors *) (*---------------------------------------------------*) funbinds : fctid LPAREN fctarg RPAREN sigconst EQUALOP funbinds' (let val (strexp,funbinds) = funbinds' in {name = fctid, arg = FctArg.makeRegion' (fctarg, fctargleft, fctargright), result = sigconst, body = strexp} :: funbinds end) funbinds' : strexp1 funbinds'1 (augment1 (strexp1, funbinds'1)) | strexp2 funbinds'2 ((strexp2, funbinds'2)) funbinds'1 : funbinds'2 ([], funbinds'2) | WHERE whereeqn funbinds'1' (cons1 (whereeqn WHEREleft, funbinds'1')) funbinds'2 : ([]) | AND funbinds (funbinds) funbinds'1' : funbinds'1 (funbinds'1) | AND whereeqn funbinds'1' (cons1 (whereeqn ANDleft, funbinds'1')) fctarg : strid COLON sigexp (FctArg.Structure (strid, sigexp)) | specs (FctArg.Spec specs) (*---------------------------------------------------*) (* Declarations *) (*---------------------------------------------------*) decs : (Dec.makeRegion' (Dec.SeqDec (Vector.new0 ()), defaultPos, defaultPos)) | dec decs (Dec.sequence (dec,decs)) | SEMICOLON decs (decs) dec : decnode (Dec.makeRegion' (decnode, decnodeleft, decnoderight)) decnode : decnolocal (decnolocal) | LOCAL decs IN decs END (Dec.Local (decs1,decs2)) decnolocal : VAL valbindTop (Dec.Val {tyvars = Vector.new0 (), vbs = #1 valbindTop, rvbs = #2 valbindTop}) | VAL tyvarseq valbindTop (Dec.Val {tyvars = tyvarseq, vbs = #1 valbindTop, rvbs = #2 valbindTop}) | DO exp (Dec.DoDec exp) | FUN funs (Dec.Fun {tyvars = Vector.new0 (), fbs = Vector.fromList funs}) | FUN tyvarseq funs (Dec.Fun {tyvars = tyvarseq, fbs = Vector.fromList funs}) | TYPE typBind (Dec.Type typBind) | DATATYPE datatypeRhs (Dec.Datatype datatypeRhs) | ABSTYPE datBind WITH decs END (Dec.Abstype {datBind = datBind, body = decs}) | EXCEPTION ebs (Dec.Exception (Vector.fromList ebs)) | OPEN longstrids (Dec.Open (Vector.fromList longstrids)) | fixity vids (Dec.Fix {fixity = fixity, ops = Vector.fromList vids}) | OVERLOAD priority vid COLON ty AS longvidands (Dec.Overload (priority, Vid.toVar vid, Vector.new0 (), ty, Vector.fromList longvidands)) valbindTop : valbind (let val (vbs, rvbs) = valbind in (Vector.fromList vbs, Vector.fromList rvbs) end) valbind : pat EQUALOP exp (([{pat = pat, exp = exp}], [])) | pat EQUALOP exp AND valbind (let val (vbs, rvbs) = valbind in ({pat = pat, exp = exp} :: vbs, rvbs) end) | REC rvalbind (([], rvalbind)) rvalbind : REC rvalbind (rvalbind) | pat EQUALOP FN match ([{pat = pat, match = match}]) | pat EQUALOP FN match AND rvalbind ({pat = pat, match = match} :: rvalbind) constraint : (NONE) | COLON ty (SOME ty) funs : clausesTop ([clausesTop]) | clausesTop AND funs (clausesTop :: funs) clausesTop: clauses (Vector.fromList clauses) | optbar' clauses (Vector.fromList clauses) clauses : clause ([clause]) | clause BAR clauses (clause :: clauses) clause : apats constraint EQUALOP exp ({pats = Vector.fromList apats, resultType = constraint, body = exp}) typBind : tbs (TypBind.makeRegion' (TypBind.T tbs, tbsleft, tbsright)) tbs : tbs' (Vector.fromList tbs') tbs' : tb ([tb]) | tb AND tbs' (tb :: tbs') tb : tyvars tycon EQUALOP ty ({def = ty, tycon = tycon, tyvars = tyvars}) tyvars : tyvarseq (tyvarseq) | (Vector.new0 ()) tyvarseq: tyvar (Vector.new1 tyvar) | LPAREN tyvar_pc RPAREN (Vector.fromList tyvar_pc) tyvar_pc: tyvar ([tyvar]) | tyvar COMMA tyvar_pc (tyvar :: tyvar_pc) constrs : constr ([constr]) | constr BAR constrs (constr :: constrs) constr : opcon (opcon, NONE) | opcon OF ty (opcon, SOME ty) opcon : con (con) | OP con (con) ebs : eb ([eb]) | eb AND ebs (eb::ebs) eb : opcon ebrhs (opcon, ebrhs) ebrhs : ebrhsnode (EbRhs.makeRegion' (ebrhsnode, ebrhsnodeleft, ebrhsnoderight)) ebrhsnode : (EbRhs.Gen NONE) | OF ty (EbRhs.Gen (SOME ty)) | EQUALOP longcon (EbRhs.Def longcon) | EQUALOP OP longcon (EbRhs.Def longcon) fixity : INFIX (Fixity.Infix NONE) | INFIX digit (Fixity.Infix (SOME digit)) | INFIXR (Fixity.Infixr NONE) | INFIXR digit (Fixity.Infixr (SOME digit)) | NONFIX (Fixity.Nonfix) priority : (Priority.T NONE) | digit (Priority.T (SOME digit)) int : INT (let val {digits, negate, radix, ...} = INT in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) digits of NONE => Error.bug "parser saw invalid int" | SOME i => if negate then ~ i else i end) word : WORD (let val {digits, radix} = WORD in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) digits of NONE => Error.bug "parser saw invalid word" | SOME i => i end) digit : INT (let val {digits, extended, negate, radix} = INT in if 1 = String.size digits andalso not extended andalso not negate andalso radix = StringCvt.DEC then valOf (Int.fromString digits) else let open Layout val _ = Control.error (reg (INTleft, INTright), str "invalid digit in infix declaration", empty) in 0 end end) numericField : INT (let val {digits, extended, negate, radix} = INT fun err () = let open Layout val _ = Control.error (reg (INTleft, INTright), str "invalid numeric label", empty) in 1 end in if String.sub (digits, 0) <> #"0" andalso not extended andalso not negate andalso radix = StringCvt.DEC then case StringCvt.scanString (fn r => IntInf.scan (radix, r)) digits of NONE => Error.bug "parser saw invalid int" | SOME i => (IntInf.toInt (if negate then ~ i else i) handle Exn.Overflow => err ()) else err () end) datatypeRhs : datatypeRhsnode (DatatypeRhs.makeRegion' (datatypeRhsnode, datatypeRhsnodeleft, datatypeRhsnoderight)) datatypeRhsnode : repl (repl) | datBind (DatatypeRhs.DatBind datBind) repl : tyvars tycon EQUALOP DATATYPE longtycon (if Vector.isEmpty tyvars then () else error (reg (tyvarsleft, tyvarsright), "nonempty tyvars in datatype repl") ; DatatypeRhs.Repl {lhs = tycon, rhs = longtycon}) datBind : dbs (DatBind.make (dbs, TypBind.empty, dbsleft, dbsright)) | dbs withtypes (DatBind.make (dbs, withtypes, dbsleft, withtypesright)) dbs : dbs' (Vector.fromList dbs') dbs' : db ([db]) | db AND dbs' (db :: dbs') db : tyvars tycon EQUALOP optbar constrs ({cons = Vector.fromList constrs, tycon = tycon, tyvars = tyvars}) withtypes : WITHTYPE typBind (typBind) longvidands : longvid ([longvid]) | longvid AND longvidands (longvid :: longvidands) match : optbar rules (Match.makeRegion' (Match.T (Vector.fromList rules), rulesleft, rulesright)) rules : rule ([rule]) | rule BAR rules (rule :: rules) rule : pat DARROW exp ((pat,exp)) elabel : field EQUALOP exp (field, (reg (fieldleft, fieldright), exp)) | idField constraint (if allowRecordPunExps () then () else error (reg (idFieldleft, idFieldright), "Record punning expressions disallowed, compile with -default-ann 'allowRecordPunExps true'") ; (Field.Symbol (#1 idField), (reg (idFieldleft, idFieldright), let val exp = Exp.makeRegion' (Exp.FlatApp (Vector.new1 (Exp.makeRegion' (Exp.Var {name = Longvid.short (Vid.fromSymbol idField), fixop = Fixop.None}, idFieldleft, idFieldright))), idFieldleft, idFieldright) val exp = case constraint of NONE => exp | SOME ty => Exp.makeRegion' (Exp.Constraint (exp, ty), idFieldleft, constraintright) in exp end))) elabels : elabel COMMA elabels (elabel :: elabels) | elabel ([elabel]) exp_ps : exp optsemicolon ([exp]) | exp SEMICOLON exp_ps (exp :: exp_ps) exp : expnode (Exp.makeRegion' (expnode, expnodeleft, expnoderight)) expnode : exp HANDLE match (Exp.Handle (exp, match)) | exp ORELSE exp (Exp.Orelse (exp1, exp2)) | exp ANDALSO exp (Exp.Andalso (exp1, exp2)) | exp COLON ty (Exp.Constraint (exp, ty)) | app_exp (Exp.FlatApp (Vector.fromList app_exp)) | FN match (Exp.Fn match) | CASE exp OF match (Exp.Case (exp, match)) | WHILE exp DO exp (Exp.While {test = exp1, expr = exp2}) | IF exp THEN exp ELSE exp (Exp.If (exp1, exp2, exp3)) | RAISE exp (Exp.Raise exp) app_exp : aexp ([Exp.makeRegion' (aexp, aexpleft, aexpright)]) | aexp app_exp (Exp.makeRegion' (aexp, aexpleft, aexpright) :: app_exp) | longvid ([Exp.makeRegion' (Exp.Var {name = longvid, fixop = Fixop.None}, longvidleft, longvidright)]) | longvid app_exp (Exp.makeRegion' (Exp.Var {name = longvid, fixop = Fixop.None}, longvidleft, longvidright) :: app_exp) aexp : OP longvid (Exp.Var {name = longvid, fixop = Fixop.Op}) | const (Exp.Const const) | HASH field (Exp.Selector field) | HASHLBRACKET exp_list RBRACKET (Exp.Vector (Vector.fromList exp_list)) | HASHLBRACKET RBRACKET (Exp.Vector (Vector.new0 ())) | LBRACE elabels RBRACE (Exp.Record (Record.fromVector (Vector.fromList elabels))) | LBRACE RBRACE (Exp.unit) | LPAREN RPAREN (Exp.unit) | LPAREN exp_ps RPAREN (case exp_ps of [exp] => Exp.Paren exp | _ => Exp.Seq (Vector.fromList exp_ps)) | LPAREN exp_2c RPAREN (Exp.tuple (Vector.fromList exp_2c)) | LBRACKET exp_list RBRACKET (Exp.List (Vector.fromList exp_list)) | LBRACKET RBRACKET (Exp.List (Vector.new0 ())) | LET decs IN exp_ps END (Exp.Let (decs, case exp_ps of [exp] => exp | _ => Exp.makeRegion' (Exp.Seq (Vector.fromList exp_ps), exp_psleft, exp_psright))) | ADDRESS string symattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Address {attributes = symattributes, name = string, ty = ty})) | BUILD_CONST string COLON ty SEMICOLON (Exp.Prim (PrimKind.BuildConst {name = string, ty = ty})) | COMMAND_LINE_CONST string COLON ty EQUALOP constOrBool SEMICOLON (Exp.Prim (PrimKind.CommandLineConst {name = string, ty = ty, value = constOrBool})) | CONST string COLON ty SEMICOLON (Exp.Prim (PrimKind.Const {name = string, ty = ty})) | EXPORT string ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Export {attributes = ieattributes, name = string, ty = ty})) | IMPORT string ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Import {attributes = ieattributes, name = string, ty = ty})) | IMPORT ASTERISK ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.IImport {attributes = ieattributes, ty = ty})) | PRIM string COLON ty SEMICOLON (Exp.Prim (PrimKind.Prim {name = string, ty = ty})) | SYMBOL string symattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Symbol {attributes = symattributes, name = string, ty = ty})) | SYMBOL ASTERISK COLON ty SEMICOLON (Exp.Prim (PrimKind.ISymbol {ty = ty})) ieattributes : ([]) | shortAlphanumId ieattributes (let val (id, reg) = shortAlphanumId in case Symbol.toString id of "cdecl" => PrimKind.ImportExportAttribute.Cdecl :: ieattributes | "external" => PrimKind.ImportExportAttribute.External :: ieattributes | "impure" => PrimKind.ImportExportAttribute.Impure :: ieattributes | "inline" => PrimKind.ImportExportAttribute.Inline :: ieattributes | "private" => PrimKind.ImportExportAttribute.Private :: ieattributes | "public" => PrimKind.ImportExportAttribute.Public :: ieattributes | "pure" => PrimKind.ImportExportAttribute.Pure :: ieattributes | "reentrant" => PrimKind.ImportExportAttribute.Reentrant :: ieattributes | "runtime" => PrimKind.ImportExportAttribute.Runtime :: ieattributes | "stdcall" => PrimKind.ImportExportAttribute.Stdcall :: ieattributes | id => (error (reg, concat ["invalid attribute: ", id]) ; ieattributes) end) symattributes : ([]) | shortAlphanumId symattributes (let val (id, reg) = shortAlphanumId in case Symbol.toString id of "alloc" => PrimKind.SymbolAttribute.Alloc :: symattributes | "external" => PrimKind.SymbolAttribute.External :: symattributes | "private" => PrimKind.SymbolAttribute.Private :: symattributes | "public" => PrimKind.SymbolAttribute.Public :: symattributes | id => (error (reg, concat ["invalid attribute: ", id]) ; symattributes) end) exp_2c : exp COMMA exp_2c (exp :: exp_2c) | exp COMMA exp ([exp1, exp2]) exp_list : exp ([exp]) | exp COMMA exp_list (exp :: exp_list) (*---------------------------------------------------*) (* Patterns *) (*---------------------------------------------------*) pat : cpat BAR barcpats (Pat.makeRegion' (Pat.Or (Vector.fromList (cpat::barcpats)), cpatleft, barcpatsright)) | cpat (cpat) cpat : cpatnode (Pat.makeRegion' (cpatnode, cpatnodeleft, cpatnoderight)) cpatnode : cpat AS cpat (Pat.makeAs (cpat1, cpat2)) | cpat COLON ty (Pat.Constraint (cpat, ty)) | apats (Pat.FlatApp (Vector.fromList apats)) apats : apat ([apat]) | apat apats (apat :: apats) apat : apatnode (Pat.makeRegion' (apatnode, apatnodeleft, apatnoderight)) apatnode : longvidNoEqual (Pat.Var {name = longvidNoEqual, fixop = Fixop.None}) | OP longvid (Pat.Var {name = longvid, fixop = Fixop.Op}) | const (let val _ = case Const.node const of Const.Real r => let open Layout in Control.error (Const.region const, seq [str "real constants not allowed in patterns: ", Const.layout const], empty) end | _ => () in Pat.Const const end) | WILD (Pat.Wild) | LPAREN pats RPAREN (Pat.tuple (Vector.fromList pats)) | LBRACKET pats RBRACKET (Pat.List (Vector.fromList pats)) | HASHLBRACKET pats RBRACKET (Pat.Vector (Vector.fromList pats)) | LBRACE RBRACE (Pat.unit) | LBRACE patitems RBRACE (let val (items, flexible) = patitems in Pat.Record {flexible = flexible, items = Vector.fromList items} end) pats : ([]) | pat commapats (pat :: commapats) barcpats : cpat ([cpat]) | cpat BAR barcpats (cpat :: barcpats) commapats : ([]) | COMMA pat commapats (pat :: commapats) patitems : patitem COMMA patitems (let val (items, f) = patitems in (patitem :: items, f) end) | patitem ([patitem], false) | DOTDOTDOT ([], true) patitem : field EQUALOP pat ((field, reg (fieldleft, fieldright), Pat.Item.Field pat)) | vid constraint opaspat (Field.Symbol (Vid.toSymbol vid), reg (vidleft, vidright), Pat.Item.Vid (vid, constraint, opaspat)) opaspat : (NONE) | AS pat (SOME pat) (*---------------------------------------------------*) (* Types *) (*---------------------------------------------------*) ty : tynode (Type.makeRegion' (tynode, tynodeleft, tynoderight)) tynode : tuple_ty (Type.tuple (Vector.fromList tuple_ty)) | ty ARROW ty (Type.arrow (ty1, ty2)) | ty'node (ty'node) ty' : ty'node (Type.makeRegion' (ty'node, ty'nodeleft, ty'noderight)) ty'node : tyvar (Type.Var tyvar) | LBRACE tlabels RBRACE (Type.Record (Record.fromVector (Vector.fromList tlabels))) | LBRACE RBRACE (Type.unit) | LPAREN ty0_pc RPAREN longtycon (Type.Con (longtycon, Vector.fromList ty0_pc)) | LPAREN ty RPAREN (Type.Paren ty) | ty' longtycon (Type.Con (longtycon, Vector.new1 ty')) | longtycon (Type.Con (longtycon, Vector.new0 ())) tlabel : field COLON ty (field, (reg (fieldleft, fieldright), ty)) tlabels : tlabel COMMA tlabels (tlabel :: tlabels) | tlabel ([tlabel]) tuple_ty : ty' ASTERISK tuple_ty (ty' :: tuple_ty) | ty' ASTERISK ty' ([ty'1, ty'2]) ty0_pc : ty COMMA ty ([ty1, ty2]) | ty COMMA ty0_pc (ty :: ty0_pc) (*---------------------------------------------------*) (* Atoms *) (*---------------------------------------------------*) optbar : (* empty *) () | optbar' () optbar' : BAR (if allowOptBar () then () else error (reg (BARleft, BARright), "Optional bar disallowed, compile with -default-ann 'allowOptBar true'")) optsemicolon : (* empty *) () | SEMICOLON (if allowOptSemicolon () then () else error (reg (SEMICOLONleft, SEMICOLONright), "Optional semicolon disallowed, compile with -default-ann 'allowOptSemicolon true'")) constOrBool : const (const) | shortAlphanumId (let fun ok b = Const.makeRegion (Const.Bool b, #2 shortAlphanumId) in case Symbol.toString (#1 shortAlphanumId) of "false" => ok false | "true" => ok true | s => (error (#2 shortAlphanumId, concat ["unknown boolean constant: ", s]) ; ok false) end) const : const' (Const.makeRegion (const', reg (const'left, const'right))) const' : int (Const.Int int) | word (Const.Word word) | REAL (Const.Real REAL) | STRING (Const.String STRING) | CHAR (Const.Char CHAR) string : STRING (CharVector.tabulate (Vector.length STRING, fn i => Char.fromInt (Int.fromIntInf (Vector.sub (STRING, i))))) shortAlphanumId : SHORTALPHANUMID (shortIdFromTok (SHORTALPHANUMID, SHORTALPHANUMIDleft, SHORTALPHANUMIDright)) shortSymId : SHORTSYMID (shortIdFromTok (SHORTSYMID, SHORTSYMIDleft, SHORTSYMIDright)) longAlphanumId : LONGALPHANUMID (longIdFromTok (LONGALPHANUMID, LONGALPHANUMIDleft, LONGALPHANUMIDright)) longSymId : LONGSYMID (longIdFromTok (LONGSYMID, LONGSYMIDleft, LONGSYMIDright)) vidNoEqual : shortAlphanumId (Vid.fromSymbol shortAlphanumId) | shortSymId (Vid.fromSymbol shortSymId) | ASTERISK (Vid.fromSymbol (Symbol.asterisk, reg (ASTERISKleft, ASTERISKright))) vidEqual : EQUALOP (Vid.fromSymbol (Symbol.equal, reg (EQUALOPleft, EQUALOPright))) vid : vidNoEqual (vidNoEqual) | vidEqual (vidEqual) longvidNoEqual : vidNoEqual (Longvid.short vidNoEqual) | longAlphanumId (Longvid.fromSymbols longAlphanumId) | longSymId (Longvid.fromSymbols longSymId) longvidEqual : vidEqual (Longvid.short vidEqual) longvid : longvidNoEqual (longvidNoEqual) | longvidEqual (longvidEqual) con : vid (Vid.toCon vid) longcon : longvid (Longvid.toLongcon longvid) tyvar : TYVAR (Tyvar.fromSymbol (Symbol.fromString TYVAR, reg (TYVARleft, TYVARright))) tycon : shortAlphanumId (Tycon.fromSymbol shortAlphanumId) | shortSymId (Tycon.fromSymbol shortSymId) longtycon : tycon (Longtycon.short tycon) | longAlphanumId (Longtycon.fromSymbols longAlphanumId) idField : shortAlphanumId (shortAlphanumId) | shortSymId (shortSymId) | ASTERISK ((Symbol.asterisk, reg (ASTERISKleft, ASTERISKright))) field : idField (Field.Symbol (#1 idField)) | numericField (Field.Int (numericField - 1)) strid : shortAlphanumId (Strid.fromSymbol shortAlphanumId) longstrid : strid (Longstrid.short strid) | longAlphanumId (Longstrid.fromSymbols longAlphanumId) sigid : shortAlphanumId (Sigid.fromSymbol shortAlphanumId) fctid : shortAlphanumId (Fctid.fromSymbol shortAlphanumId) vids : vid ([vid]) | vid vids (vid::vids) sigids : sigid ([sigid]) | sigid sigids (sigid :: sigids) longstrids : longstrid ([longstrid]) | longstrid longstrids (longstrid :: longstrids) mlton-20210117+dfsg/mlton/front-end/ml.lex000066400000000000000000000523221416264345000202010ustar00rootroot00000000000000(* Heavily modified from SML/NJ sources. *) (* ml.lex * * Copyright 1989 by AT&T Bell Laboratories * * SML/NJ is released under a HPND-style license. * See the file NJ-LICENSE for details. *) (* Copyright (C) 2009,2016-2017 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) type svalue = Tokens.svalue type pos = SourcePos.t type lexresult = (svalue, pos) Tokens.token type lexarg = {source: Source.t} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token local open Control.Elaborate in val allowLineComments = fn () => current allowLineComments val allowExtendedNumConsts = fn () => current allowExtendedNumConsts val allowExtendedTextConsts = fn () => current allowExtendedTextConsts end fun lastPos (yypos, yytext) = yypos + size yytext - 1 fun tok (t, x, s, l) = let val left = Source.getPos (s, l) val right = Source.getPos (s, lastPos (l, x)) in t (left, right) end fun tok' (t, x, s, l) = tok (fn (l, r) => t (x, l, r), x, s, l) fun error' (left, right, msg) = Control.errorStr (Region.make {left = left, right = right}, msg) fun error (source, left, right, msg) = error' (Source.getPos (source, left), Source.getPos (source, right), msg) (* Comments *) local val commentErrors: string list ref = ref [] val commentLeft = ref SourcePos.bogus val commentStack: (int -> unit) list ref = ref [] in fun addCommentError msg = List.push (commentErrors, msg) val inComment = fn () => not (List.isEmpty (!commentStack)) fun startComment (source, yypos, th) = if inComment () then List.push (commentStack, fn _ => th ()) else (commentErrors := [] ; commentLeft := Source.getPos (source, yypos) ; List.push (commentStack, fn yypos => (List.foreach (!commentErrors, fn msg => error' (!commentLeft, Source.getPos (source, yypos), msg)) ; th ()))) fun finishComment yypos = (List.pop commentStack) yypos end (* Line Directives *) local val lineDirCol: int ref = ref ~1 val lineDirFile: File.t option ref = ref NONE val lineDirLine: int ref = ref ~1 in fun startLineDir (source, yypos, th) = let val _ = lineDirCol := ~1 val _ = lineDirFile := NONE val _ = lineDirLine := ~1 in startComment (source, yypos, th) end fun addLineDirLineCol (line, col) = let val _ = lineDirLine := line val _ = lineDirCol := col in () end fun addLineDirFile file = let val _ = lineDirFile := SOME file in () end fun finishLineDir (source, yypos) = let val col = !lineDirCol val file = !lineDirFile val line = !lineDirLine val _ = lineDirCol := ~1 val _ = lineDirFile := NONE val _ = lineDirLine := ~1 in finishComment yypos ; Source.lineDirective (source, file, {lineNum = line, lineStart = yypos + 1 - col}) end end (* Numeric Constants *) local fun doit (source, yypos, yytext, drop, {extended: string option}, mkTok) = let val left = yypos val right = lastPos (yypos, yytext) val extended = if String.contains (yytext, #"_") then SOME (Option.fold (extended, "'_' separators", fn (msg1, msg2) => msg1 ^ " and " ^ msg2)) else extended val _ = case extended of NONE => () | SOME msg => if allowExtendedNumConsts () then () else error (source, left, right, concat ["Extended numeric constants (using ", msg, ") disallowed, compile with -default-ann 'allowExtendedNumConsts true'"]) in mkTok (String.keepAll (String.dropPrefix (yytext, drop), fn c => not (c = #"_")), {extended = Option.isSome extended}, Source.getPos (source, left), Source.getPos (source, right)) end in fun real (source, yypos, yytext) = doit (source, yypos, yytext, 0, {extended = NONE}, fn (digits, {extended: bool}, l, r) => Tokens.REAL (digits, l, r)) fun int (source, yypos, yytext, drop, {extended: string option}, {negate: bool}, radix) = doit (source, yypos, yytext, drop, {extended = extended}, fn (digits, {extended: bool}, l, r) => Tokens.INT ({digits = digits, extended = extended, negate = negate, radix = radix}, l, r)) fun word (source, yypos, yytext, drop, {extended: string option}, radix) = doit (source, yypos, yytext, drop, {extended = extended}, fn (digits, {extended: bool}, l, r) => Tokens.WORD ({digits = digits, radix = radix}, l, r)) end (* Text Constants *) local val chars: IntInf.t list ref = ref [] val inText = ref false val textLeft = ref SourcePos.bogus val textFinishFn: (IntInf.t vector * SourcePos.t * SourcePos.t -> lexresult) ref = ref (fn _ => raise Fail "textFinish") in fun startText (tl, tf) = let val _ = chars := [] val _ = inText := true val _ = textLeft := tl val _ = textFinishFn := tf in () end fun finishText textRight = let val cs = Vector.fromListRev (!chars) val tl = !textLeft val tr = textRight val tf = !textFinishFn val _ = chars := [] val _ = inText := false val _ = textLeft := SourcePos.bogus val _ = textFinishFn := (fn _ => raise Fail "textFinish") in tf (cs, tl, tr) end val inText = fn () => !inText fun addTextString (s: string) = chars := String.fold (s, !chars, fn (c, ac) => Int.toIntInf (Char.ord c) :: ac) fun addTextCharCode (i: IntInf.int) = List.push (chars, i) end fun addTextChar (c: char) = addTextString (String.fromChar c) fun addTextNumEsc (source, yypos, yytext, drop, {extended: string option}, radix): unit = let val left = yypos val right = lastPos (yypos, yytext) val _ = case extended of NONE => () | SOME msg => if allowExtendedTextConsts () then () else error (source, left, right, concat ["Extended text constants (using ", msg, ") disallowed, compile with -default-ann 'allowExtendedTextConsts true'"]) in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) (String.dropPrefix (yytext, drop)) of NONE => error (source, left, right, "Illegal numeric escape in text constant") | SOME i => addTextCharCode i end fun addTextUTF8 (source, yypos, yytext): unit = let val left = yypos val right = lastPos (yypos, yytext) in if not (allowExtendedTextConsts ()) then error (source, left, right, "Extended text constants (using UTF-8 byte sequences) disallowed, compile with -default-ann 'allowExtendedTextConsts true'") else addTextString yytext end (* EOF *) val eof: lexarg -> lexresult = fn {source, ...} => let val _ = Source.newline (source, ~1) val pos = Source.getPos (source, ~1) val _ = if inComment () then error' (pos, SourcePos.bogus, "Unclosed comment at end of file") else () val _ = if inText () then error' (pos, SourcePos.bogus, "Unclosed text constant at end of file") else () in Tokens.EOF (pos, SourcePos.bogus) end %% %full %s TEXT TEXT_FMT BLOCK_COMMENT LINE_COMMENT LINE_DIR1 LINE_DIR2 LINE_DIR3 LINE_DIR4; %header (functor MLLexFun (structure Tokens : ML_TOKENS)); %arg ({source}); ws=\t|"\011"|"\012"|" "; cr="\013"; nl="\010"; eol=({cr}{nl}|{nl}|{cr}); alphanum=[A-Za-z0-9'_]; alphanumId=[A-Za-z]{alphanum}*; sym="!"|"%"|"&"|"$"|"#"|"+"|"-"|"/"|":"|"<"|"="|">"|"?"|"@"|"\\"|"~"|"`"|"^"|"|"|"*"; symId={sym}+; tyvarId="'"{alphanum}*; longSymId=({alphanumId}".")+{symId}; longAlphanumId=({alphanumId}".")+{alphanumId}; decDigit=[0-9]; decnum={decDigit}("_"*{decDigit})*; hexDigit=[0-9a-fA-F]; hexnum={hexDigit}("_"*{hexDigit})*; binDigit=[0-1]; binnum={binDigit}("_"*{binDigit})*; frac="."{decnum}; exp=[eE](~?){decnum}; real=(~?)(({decnum}{frac}?{exp})|({decnum}{frac}{exp}?)); %% {ws}+ => (continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)); continue ()); "_address" => (tok (Tokens.ADDRESS, yytext, source, yypos)); "_build_const" => (tok (Tokens.BUILD_CONST, yytext, source, yypos)); "_command_line_const" => (tok (Tokens.COMMAND_LINE_CONST, yytext, source, yypos)); "_const" => (tok (Tokens.CONST, yytext, source, yypos)); "_export" => (tok (Tokens.EXPORT, yytext, source, yypos)); "_import" => (tok (Tokens.IMPORT, yytext, source, yypos)); "_overload" => (tok (Tokens.OVERLOAD, yytext, source, yypos)); "_prim" => (tok (Tokens.PRIM, yytext, source, yypos)); "_symbol" => (tok (Tokens.SYMBOL, yytext, source, yypos)); "#" => (tok (Tokens.HASH, yytext, source, yypos)); "#[" => (tok (Tokens.HASHLBRACKET, yytext, source, yypos)); "(" => (tok (Tokens.LPAREN, yytext, source, yypos)); ")" => (tok (Tokens.RPAREN, yytext, source, yypos)); "," => (tok (Tokens.COMMA, yytext, source, yypos)); "->" => (tok (Tokens.ARROW, yytext, source, yypos)); "..." => (tok (Tokens.DOTDOTDOT, yytext, source, yypos)); ":" => (tok (Tokens.COLON, yytext, source, yypos)); ":>" => (tok (Tokens.COLONGT, yytext, source, yypos)); ";" => (tok (Tokens.SEMICOLON, yytext, source, yypos)); "=" => (tok (Tokens.EQUALOP, yytext, source, yypos)); "=>" => (tok (Tokens.DARROW, yytext, source, yypos)); "[" => (tok (Tokens.LBRACKET, yytext, source, yypos)); "]" => (tok (Tokens.RBRACKET, yytext, source, yypos)); "_" => (tok (Tokens.WILD, yytext, source, yypos)); "{" => (tok (Tokens.LBRACE, yytext, source, yypos)); "|" => (tok (Tokens.BAR, yytext, source, yypos)); "}" => (tok (Tokens.RBRACE, yytext, source, yypos)); "abstype" => (tok (Tokens.ABSTYPE, yytext, source, yypos)); "and" => (tok (Tokens.AND, yytext, source, yypos)); "andalso" => (tok (Tokens.ANDALSO, yytext, source, yypos)); "as" => (tok (Tokens.AS, yytext, source, yypos)); "case" => (tok (Tokens.CASE, yytext, source, yypos)); "datatype" => (tok (Tokens.DATATYPE, yytext, source, yypos)); "do" => (tok (Tokens.DO, yytext, source, yypos)); "else" => (tok (Tokens.ELSE, yytext, source, yypos)); "end" => (tok (Tokens.END, yytext, source, yypos)); "eqtype" => (tok (Tokens.EQTYPE, yytext, source, yypos)); "exception" => (tok (Tokens.EXCEPTION, yytext, source, yypos)); "fn" => (tok (Tokens.FN, yytext, source, yypos)); "fun" => (tok (Tokens.FUN, yytext, source, yypos)); "functor" => (tok (Tokens.FUNCTOR, yytext, source, yypos)); "handle" => (tok (Tokens.HANDLE, yytext, source, yypos)); "if" => (tok (Tokens.IF, yytext, source, yypos)); "in" => (tok (Tokens.IN, yytext, source, yypos)); "include" => (tok (Tokens.INCLUDE, yytext, source, yypos)); "infix" => (tok (Tokens.INFIX, yytext, source, yypos)); "infixr" => (tok (Tokens.INFIXR, yytext, source, yypos)); "let" => (tok (Tokens.LET, yytext, source, yypos)); "local" => (tok (Tokens.LOCAL, yytext, source, yypos)); "nonfix" => (tok (Tokens.NONFIX, yytext, source, yypos)); "of" => (tok (Tokens.OF, yytext, source, yypos)); "op" => (tok (Tokens.OP, yytext, source, yypos)); "open" => (tok (Tokens.OPEN, yytext, source, yypos)); "orelse" => (tok (Tokens.ORELSE, yytext, source, yypos)); "raise" => (tok (Tokens.RAISE, yytext, source, yypos)); "rec" => (tok (Tokens.REC, yytext, source, yypos)); "sharing" => (tok (Tokens.SHARING, yytext, source, yypos)); "sig" => (tok (Tokens.SIG, yytext, source, yypos)); "signature" => (tok (Tokens.SIGNATURE, yytext, source, yypos)); "struct" => (tok (Tokens.STRUCT, yytext, source, yypos)); "structure" => (tok (Tokens.STRUCTURE, yytext, source, yypos)); "then" => (tok (Tokens.THEN, yytext, source, yypos)); "type" => (tok (Tokens.TYPE, yytext, source, yypos)); "val" => (tok (Tokens.VAL, yytext, source, yypos)); "where" => (tok (Tokens.WHERE, yytext, source, yypos)); "while" => (tok (Tokens.WHILE, yytext, source, yypos)); "with" => (tok (Tokens.WITH, yytext, source, yypos)); "withtype" => (tok (Tokens.WITHTYPE, yytext, source, yypos)); {alphanumId} => (tok' (Tokens.SHORTALPHANUMID, yytext, source, yypos)); {symId} => (case yytext of "*" => tok (Tokens.ASTERISK, yytext, source, yypos) | _ => tok' (Tokens.SHORTSYMID, yytext, source, yypos)); {tyvarId} => (tok' (Tokens.TYVAR, yytext, source, yypos)); {longAlphanumId} => (tok' (Tokens.LONGALPHANUMID, yytext, source, yypos)); {longSymId} => (tok' (Tokens.LONGSYMID, yytext, source, yypos)); {real} => (real (source, yypos, yytext)); {decnum} => (int (source, yypos, yytext, 0, {extended = NONE}, {negate = false}, StringCvt.DEC)); "~"{decnum} => (int (source, yypos, yytext, 1, {extended = NONE}, {negate = true}, StringCvt.DEC)); "0x"{hexnum} => (int (source, yypos, yytext, 2, {extended = NONE}, {negate = false}, StringCvt.HEX)); "~0x"{hexnum} => (int (source, yypos, yytext, 3, {extended = NONE}, {negate = true}, StringCvt.HEX)); "0b"{binnum} => (int (source, yypos, yytext, 2, {extended = SOME "binary notation"}, {negate = false}, StringCvt.BIN)); "~0b"{binnum} => (int (source, yypos, yytext, 3, {extended = SOME "binary notation"}, {negate = true}, StringCvt.BIN)); "0w"{decnum} => (word (source, yypos, yytext, 2, {extended = NONE}, StringCvt.DEC)); "0wx"{hexnum} => (word (source, yypos, yytext, 3, {extended = NONE}, StringCvt.HEX)); "0wb"{binnum} => (word (source, yypos, yytext, 3, {extended = SOME "binary notation"}, StringCvt.BIN)); "\"" => (startText (Source.getPos (source, yypos), fn (cs, l, r) => (YYBEGIN INITIAL; Tokens.STRING (cs, l, r))) ; YYBEGIN TEXT ; continue ()); "#\"" => (startText (Source.getPos (source, yypos), fn (cs, l, r) => let fun err () = error' (l, r, "character constant not of size 1") val c = case Int.compare (Vector.length cs, 1) of LESS => (err (); 0) | EQUAL => Vector.sub (cs, 0) | GREATER => (err (); Vector.sub (cs, 0)) in YYBEGIN INITIAL; Tokens.CHAR (c, l, r) end) ; YYBEGIN TEXT ; continue ()); "\"" => (finishText (Source.getPos (source, lastPos (yypos, yytext)))); " "|!|[\035-\091]|[\093-\126] => (addTextString yytext; continue ()); [\192-\223][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); [\224-\239][\128-\191][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); [\240-\247][\128-\191][\128-\191][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); \\a => (addTextChar #"\a"; continue ()); \\b => (addTextChar #"\b"; continue ()); \\t => (addTextChar #"\t"; continue ()); \\n => (addTextChar #"\n"; continue ()); \\v => (addTextChar #"\v"; continue ()); \\f => (addTextChar #"\f"; continue ()); \\r => (addTextChar #"\r"; continue ()); \\\^[@-_] => (addTextChar (Char.chr(Char.ord(String.sub(yytext, 2)) - Char.ord #"@")); continue ()); \\\^. => (error (source, yypos, yypos + 2, "Illegal control escape in text constant; must be one of @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"); continue ()); \\[0-9]{3} => (addTextNumEsc (source, yypos, yytext, 1, {extended = NONE}, StringCvt.DEC) ; continue ()); \\u{hexDigit}{4} => (addTextNumEsc (source, yypos, yytext, 2, {extended = NONE}, StringCvt.HEX) ; continue ()); \\U{hexDigit}{8} => (addTextNumEsc (source, yypos, yytext, 2, {extended = SOME "\\Uxxxxxxxx numeric escapes"}, StringCvt.HEX) ; continue ()); "\\\"" => (addTextString "\""; continue ()); \\\\ => (addTextString "\\"; continue ()); \\{ws}+ => (YYBEGIN TEXT_FMT; continue ()); \\{eol} => (Source.newline (source, lastPos (yypos, yytext)); YYBEGIN TEXT_FMT; continue ()); \\ => (error (source, yypos, yypos + 1, "Illegal escape in text constant") ; continue ()); {eol} => (error (source, yypos, lastPos (yypos, yytext), "Unclosed text constant at end of line") ; Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (error (source, yypos, yypos, "Illegal character in text constant") ; continue ()); {ws}+ => (continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)); continue ()); \\ => (YYBEGIN TEXT; continue ()); . => (error (source, yypos, yypos, "Illegal formatting character in text continuation") ; continue ()); "(*)" => (if allowLineComments () then () else error (source, yypos, lastPos (yypos, yytext), "Line comments disallowed, compile with -default-ann 'allowLineComments true'") ; startComment (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN LINE_COMMENT ; continue ()); "(*" => (startComment (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN BLOCK_COMMENT ; continue ()); {eol} => (finishComment (lastPos (yypos, yytext)) ; Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (continue ()); "(*)" => (if allowLineComments () then () else error (source, yypos, lastPos (yypos, yytext), "Line comments disallowed, compile with -default-ann 'allowLineComments true'") ; startComment (source, yypos, fn () => YYBEGIN BLOCK_COMMENT) ; YYBEGIN LINE_COMMENT ; continue ()); "(*" => (startComment (source, yypos, fn () => YYBEGIN BLOCK_COMMENT) ; YYBEGIN BLOCK_COMMENT ; continue ()); "*)" => (finishComment (lastPos (yypos,yytext)) ; continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (continue ()); "(*#line"{ws}+ => (startLineDir (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN LINE_DIR1 ; continue ()); {decDigit}+"."{decDigit}+ => (let fun err () = (addCommentError "Illegal line directive" ; YYBEGIN BLOCK_COMMENT) in case String.split (yytext, #".") of [line, col] => (YYBEGIN LINE_DIR2 ; addLineDirLineCol (valOf (Int.fromString line), valOf (Int.fromString col)) handle Overflow => err () | Option => err () ; continue ()) | _ => (err (); continue ()) end); {ws}+"\"" => (YYBEGIN LINE_DIR3 ; continue ()); [^"]*"\"" => (addLineDirFile (String.dropLast yytext) ; YYBEGIN LINE_DIR4 ; continue ()); {ws}*"*)" => (finishLineDir (source, lastPos (yypos, yytext)) ; continue ()); . => (addCommentError "Illegal line directive" ; YYBEGIN BLOCK_COMMENT ; continue ()); "(*#showBasis"{ws}+"\""[^"]*"\""{ws}*"*)" => (let val file = List.nth (String.split (yytext, #"\""), 1) val file = if OS.Path.isAbsolute file then file else OS.Path.mkCanonical (OS.Path.concat (OS.Path.dir (Source.name source), file)) in tok' (fn (_, l, r) => Tokens.SHOW_BASIS (file, l, r), yytext, source, yypos) end); . => (error (source, yypos, yypos, "Illegal token") ; continue ()); mlton-20210117+dfsg/mlton/front-end/mlb-front-end.fun000066400000000000000000000275451416264345000222460ustar00rootroot00000000000000(* Copyright (C) 2009,2015 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MLBFrontEnd (S: MLB_FRONT_END_STRUCTS): MLB_FRONT_END = struct open S (* The lexer recursively invokes the lexer/parser when it encounters a file * reference. So, we need a stub here to feed to the lexer. The stub is * overridden after the lexer is defined. *) val lexAndParseProgOrMLBRef: (File.t * Region.t -> Ast.Basdec.node) ref = ref (fn _ => Error.bug "MLBFrontEnd.lexAndParseProgOrMLB") val lexAndParseProgOrMLB = fn f => !lexAndParseProgOrMLBRef f structure LrVals = MLBLrValsFun (structure Token = LrParser.Token structure Ast = Ast val lexAndParseProgOrMLB = lexAndParseProgOrMLB) structure Lex = MLBLexFun (structure Tokens = LrVals.Tokens) structure Parse = JoinWithArg (structure ParserData = LrVals.ParserData structure Lex = Lex structure LrParser = LrParser) fun lexAndParse (source: Source.t, ins: In.t) = let val stream = Parse.makeLexer (fn n => In.inputN (ins, n)) {source = source} val lookahead = 30 val result = (#1 (Parse.parse (lookahead, stream, fn (s, left, right) => Control.errorStr (Region.make {left = left, right = right}, s), ()))) handle _ => let val i = Source.lineStart source val _ = Control.errorStr (Region.make {left = i, right = i}, "parse error") in Ast.Basdec.empty end val () = Ast.Basdec.checkSyntax result (* Outputs AST to a file if Control.keepAST is true *) val () = if !Control.keepAST then File.withAppend (concat [!Control.inputFile, ".ast"], fn outputStream => (Out.outputl (outputStream, concat ["File: ", Source.name source]); Layout.output (Ast.Basdec.layout result, outputStream); Out.newline outputStream; Out.newline outputStream)) else () in result end fun lexAndParseFile (f: File.t) = File.withIn (f, fn ins => lexAndParse (Source.new f, ins)) val lexAndParseFile = Trace.trace ("MLBFrontEnd.lexAndParseFile", File.layout, Ast.Basdec.layout) lexAndParseFile fun lexAndParseString (s: String.t) = let val source = Source.new "" val ins = In.openString s in lexAndParse (source, ins) end val lexAndParseString = Trace.trace ("MLBFrontEnd.lexAndParseString", String.layout, Ast.Basdec.layout) lexAndParseString val lexAndParseString = fn (s: string) => let val cwd = Dir.current () val relativize = SOME cwd val state = {cwd = cwd, relativize = relativize, seen = []} val psi : (File.t, Ast.Basdec.t Promise.t) HashTable.t = HashTable.new {hash = String.hash, equals = String.equals} local val pathMap = Control.mlbPathMap () fun peekPathMap var' = case List.peek (pathMap, fn {var,...} => var = var') of NONE => NONE | SOME {path, ...} => SOME path in val peekPathMap = Trace.trace ("MLBFrontEnd.peekPathMap", String.layout, Option.layout Dir.layout) peekPathMap end fun expandPathVars (path, seen, region) = let fun loop (s, acc, accs) = case s of [] => String.concat (List.rev (String.fromListRev acc :: accs)) | #"$" :: #"(" :: s => let val accs = String.fromListRev acc :: accs fun loopVar (s, acc) = case s of [] => Error.bug "MLBFrontEnd.lexAndParseString.expandPathVars" | #")" :: s => (s, String.fromListRev acc) | c :: s => loopVar (s, c :: acc) val (s, var) = loopVar (s, []) in if List.exists (seen, fn x => x = var) then let open Layout in Control.error (region, str "Cyclic MLB path variables", List.layout Layout.str (var :: seen)) ; loop (s, [], accs) end else case peekPathMap var of NONE => let open Layout in Control.error (region, seq [str "Undefined MLB path variable: ", str var], empty) ; loop (s, [], accs) end | SOME path => loop (s, [], expandPathVars (path, var :: seen, region) :: accs) end | c :: s => loop (s, c :: acc, accs) in loop (String.explode path, [], []) end fun regularize {fileOrig, cwd, region, relativize} = let val fileExp = expandPathVars (fileOrig, [], region) val fileAbs = OS.Path.mkAbsolute {path = fileExp, relativeTo = cwd} val fileAbs = OS.Path.mkCanonical fileAbs val relativize = if !Control.preferAbsPaths orelse OS.Path.isAbsolute fileExp then NONE else relativize val fileUse = case relativize of NONE => fileAbs | SOME d => OS.Path.mkRelative {path = fileAbs, relativeTo = d} in {fileAbs = fileAbs, fileUse = fileUse, relativize = relativize} end val regularize = Trace.trace ("MLBFrontEnd.lexAndParseString.regularize", fn {fileOrig, cwd, relativize, ...} => Layout.record [("fileOrig", File.layout fileOrig), ("cwd", Dir.layout cwd), ("relativize", Option.layout Dir.layout relativize)], fn {fileAbs, fileUse, relativize} => Layout.record [("fileAbs", File.layout fileAbs), ("fileUse", File.layout fileUse), ("relativize", Option.layout Dir.layout relativize)]) regularize fun lexAndParseProg {fileAbs: File.t, fileOrig: File.t, fileUse: File.t, fail: String.t -> Ast.Program.t} = Ast.Basdec.Prog ({fileAbs = fileAbs, fileUse = fileUse}, Promise.delay (fn () => Control.checkFile (fileUse, {fail = fail, name = fileOrig, ok = fn () => FrontEnd.lexAndParseFile fileUse}))) and lexAndParseMLB {relativize: Dir.t option, seen: (File.t * File.t * Region.t) list, fileAbs: File.t, fileOrig: File.t, fileUse: File.t, fail: String.t -> Ast.Basdec.t, reg: Region.t} = Ast.Basdec.MLB ({fileAbs = fileAbs, fileUse = fileUse}, Promise.delay (fn () => Control.checkFile (fileUse, {fail = fail, name = fileOrig, ok = fn () => let val seen' = (fileAbs, fileUse, reg) :: seen in if List.exists (seen, fn (fileAbs', _, _) => String.equals (fileAbs, fileAbs')) then (let open Layout in Control.error (reg, seq [str "Basis forms a cycle with ", File.layout fileUse], align (List.map (seen', fn (_, f, r) => seq [Region.layout r, str ": ", File.layout f]))) ; Ast.Basdec.empty end) else (Promise.force o HashTable.lookupOrInsert) (psi, fileAbs, fn () => let val cwd = OS.Path.dir fileAbs in Promise.delay (fn () => wrapLexAndParse ({cwd = cwd, relativize = relativize, seen = seen'}, lexAndParseFile, fileUse)) end) end}))) and lexAndParseProgOrMLB {cwd, relativize, seen} (fileOrig: File.t, reg: Region.t) = Exn.withEscape (fn escape => let fun fail default msg = let val () = Control.error (reg, Layout.str msg, Layout.empty) in default end fun err msg = fail (Ast.Basdec.Seq []) (concat ["File ", fileOrig, msg]) val {fileAbs, fileUse, relativize, ...} = regularize {cwd = cwd, fileOrig = fileOrig, region = reg, relativize = relativize} handle _ => escape (err " could not be regularized") val mlbExts = ["mlb"] val progExts = ["ML","fun","sig","sml"] fun errUnknownExt () = err " has an unknown extension" in case File.extension fileUse of NONE => errUnknownExt () | SOME s => if List.contains (mlbExts, s, String.equals) then lexAndParseMLB {relativize = relativize, seen = seen, fileAbs = fileAbs, fileOrig = fileOrig, fileUse = fileUse, fail = fail Ast.Basdec.empty, reg = reg} else if List.contains (progExts, s, String.equals) then lexAndParseProg {fileAbs = fileAbs, fileOrig = fileOrig, fileUse = fileUse, fail = fail Ast.Program.empty} else errUnknownExt () end) and wrapLexAndParse (state, lexAndParse, arg) = Ref.fluidLet (lexAndParseProgOrMLBRef, lexAndParseProgOrMLB state, fn () => lexAndParse arg) val dec = wrapLexAndParse (state, lexAndParseString, s) in dec end end mlton-20210117+dfsg/mlton/front-end/mlb-front-end.sig000066400000000000000000000010211416264345000222150ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MLB_FRONT_END_STRUCTS = sig structure Ast: AST structure FrontEnd: FRONT_END sharing Ast = FrontEnd.Ast end signature MLB_FRONT_END = sig include MLB_FRONT_END_STRUCTS val lexAndParseString: String.t -> Ast.Basdec.t end mlton-20210117+dfsg/mlton/front-end/mlb.grm000066400000000000000000000145141416264345000203410ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) fun reg (left, right) = Region.make {left = left, right = right} fun error (reg, msg) = Control.error (reg, Layout.str msg, Layout.empty) open Ast type fctbinds = {lhs: Fctid.t, rhs: Fctid.t} list type sigbinds = {lhs: Sigid.t, rhs: Sigid.t} list type strbinds = {lhs: Strid.t, rhs: Strid.t} list type basbinds = {name: Basid.t, def: Basexp.t} list %% %term ID of string | COMMA | SEMICOLON | EOF | AND | BAS | BASIS | END | EQUALOP | FUNCTOR | IN | LET | LOCAL | OPEN | SIGNATURE | STRUCTURE | ANN | PRIM | FILE of string | STRING of string %nonterm ann of string * Region.t | annPlus of (string * Region.t) list | annStar of (string * Region.t) list | basbinds of basbinds | basbinds' of Basexp.t * basbinds | basbinds'' of basbinds | basdec of Basdec.t | basdecnode of Basdec.node | basdecs of Basdec.t | basdecsnode of Basdec.node | basexp of Basexp.t | basexpnode of Basexp.node | basid of Basid.t | basids of Basid.t list | fctbinds of fctbinds | fctbinds' of Fctid.t * fctbinds | fctbinds'' of fctbinds | fctid of Fctid.t | id of Symbol.t * Region.t | mlb of Basdec.t | sigbinds of sigbinds | sigbinds' of Sigid.t * sigbinds | sigbinds'' of sigbinds | sigid of Sigid.t | strbinds of strbinds | strbinds' of Strid.t * strbinds | strbinds'' of strbinds | strid of Strid.t %verbose %pos SourcePos.t %eop EOF %noshift EOF %header (functor MLBLrValsFun (structure Token: TOKEN structure Ast: AST val lexAndParseProgOrMLB: File.t * Region.t -> Ast.Basdec.node)) %right AND %name MLB %keyword AND BAS BASIS END FUNCTOR IN LET LOCAL OPEN SIGNATURE STRUCTURE ANN PRIM %change -> SEMICOLON | -> IN ID END %value ID ("bogus") %% mlb : basdecs (basdecs) basdecs : basdecsnode (Basdec.makeRegion' (basdecsnode, basdecsnodeleft, basdecsnoderight)) basdecsnode : (Basdec.Seq []) | SEMICOLON basdecs (Basdec.Seq [basdecs]) | basdec basdecs (Basdec.Seq [basdec, basdecs]) basdec : basdecnode (Basdec.makeRegion' (basdecnode, basdecnodeleft, basdecnoderight)) basdecnode : FUNCTOR fctbinds (let val fctbinds = Vector.fromList fctbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Fct fctbinds, FUNCTORleft, fctbindsright)) end) | SIGNATURE sigbinds (let val sigbinds = Vector.fromList sigbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Sig sigbinds, SIGNATUREleft, sigbindsright)) end) | STRUCTURE strbinds (let val strbinds = Vector.fromList strbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Str strbinds, STRUCTUREleft, strbindsright)) end) | BASIS basbinds (let val basbinds = Vector.fromList basbinds in Basdec.Basis basbinds end) | LOCAL basdecs IN basdecs END (Basdec.Local (basdecs1, basdecs2)) | OPEN basids (Basdec.Open (Vector.fromList basids)) | FILE (let val reg = reg (FILEleft, FILEright) in lexAndParseProgOrMLB (FILE, reg) end) | STRING (let val reg = reg (STRINGleft, STRINGright) in lexAndParseProgOrMLB (STRING, reg) end) | PRIM (Basdec.Prim) | ANN annPlus IN basdecs END (let val extendRight = let val right = valOf (Region.right (Basdec.region basdecs)) in fn reg => Region.extendRight (reg, right) end fun mkAnn' ((ann,reg), basdecs) = Basdec.Ann (ann, reg, basdecs) fun mkAnn ((ann,reg), basdecsnode) : Basdec.node = mkAnn' ((ann,reg), Basdec.makeRegion (basdecsnode, extendRight reg)) val (anns,ann) = List.splitLast annPlus in List.fold(anns, mkAnn'(ann, basdecs), mkAnn) end) fctbinds : fctid EQUALOP fctbinds' (let val (def, fctbinds) = fctbinds' in {lhs = fctid, rhs = def} :: fctbinds end) | fctid fctbinds'' ({lhs = fctid, rhs = fctid} :: fctbinds'') fctbinds' : fctid fctbinds'' (fctid, fctbinds'') fctbinds'' : ([]) | AND fctbinds (fctbinds) sigbinds : sigid EQUALOP sigbinds' (let val (def, sigbinds) = sigbinds' in {lhs = sigid, rhs = def} :: sigbinds end) | sigid sigbinds'' ({lhs = sigid, rhs = sigid} :: sigbinds'') sigbinds' : sigid sigbinds'' (sigid, sigbinds'') sigbinds'' : ([]) | AND sigbinds (sigbinds) strbinds : strid EQUALOP strbinds' (let val (def, strbinds) = strbinds' in {lhs = strid, rhs = def} :: strbinds end) | strid strbinds'' ({lhs = strid, rhs = strid} :: strbinds'') strbinds' : strid strbinds'' (strid, strbinds'') strbinds'' : ([]) | AND strbinds (strbinds) basbinds : basid EQUALOP basbinds' (let val (def, basbinds) = basbinds' in {name = basid, def = def} :: basbinds end) basbinds' : basexp basbinds'' (basexp, basbinds'') basbinds'' : ([]) | AND basbinds (basbinds) basexp : basexpnode (Basexp.makeRegion' (basexpnode, basexpnodeleft, basexpnoderight)) basexpnode : BAS basdecs END (Basexp.Bas basdecs) | basid (Basexp.Var basid) | LET basdecs IN basexp END (Basexp.Let (basdecs, basexp)) basid : id (Basid.fromSymbol id) basids : basid ([basid]) | basid basids (basid :: basids) fctid : id (Fctid.fromSymbol id) sigid : id (Sigid.fromSymbol id) strid : id (Strid.fromSymbol id) id : ID (Symbol.fromString ID, reg (IDleft, IDright)) ann : STRING (STRING, reg (STRINGleft, STRINGright)) annPlus : ann annStar (ann::annStar) annStar : ([]) | annPlus (annPlus) mlton-20210117+dfsg/mlton/front-end/mlb.lex000066400000000000000000000274461416264345000203540ustar00rootroot00000000000000(* Copyright (C) 2009,2016,2017 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) type svalue = Tokens.svalue type pos = SourcePos.t type lexresult = (svalue, pos) Tokens.token type lexarg = {source: Source.t} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token fun lastPos (yypos, yytext) = yypos + size yytext - 1 fun tok (t, x, s, l) = let val left = Source.getPos (s, l) val right = Source.getPos (s, lastPos (l, x)) in t (left, right) end fun tok' (t, x, s, l) = tok (fn (l, r) => t (x, l, r), x, s, l) fun error' (left, right, msg) = Control.errorStr (Region.make {left = left, right = right}, msg) fun error (source, left, right, msg) = error' (Source.getPos (source, left), Source.getPos (source, right), msg) (* Comments *) local val commentErrors: string list ref = ref [] val commentLeft = ref SourcePos.bogus val commentStack: (int -> unit) list ref = ref [] in fun addCommentError msg = List.push (commentErrors, msg) val inComment = fn () => not (List.isEmpty (!commentStack)) fun startComment (source, yypos, th) = if inComment () then List.push (commentStack, fn _ => th ()) else (commentErrors := [] ; commentLeft := Source.getPos (source, yypos) ; List.push (commentStack, fn yypos => (List.foreach (!commentErrors, fn msg => error' (!commentLeft, Source.getPos (source, yypos), msg)) ; th ()))) fun finishComment yypos = (List.pop commentStack) yypos end (* Line Directives *) local val lineDirCol: int ref = ref ~1 val lineDirFile: File.t option ref = ref NONE val lineDirLine: int ref = ref ~1 in fun startLineDir (source, yypos, th) = let val _ = lineDirCol := ~1 val _ = lineDirFile := NONE val _ = lineDirLine := ~1 in startComment (source, yypos, th) end fun addLineDirLineCol (line, col) = let val _ = lineDirLine := line val _ = lineDirCol := col in () end fun addLineDirFile file = let val _ = lineDirFile := SOME file in () end fun finishLineDir (source, yypos) = let val col = !lineDirCol val file = !lineDirFile val line = !lineDirLine val _ = lineDirCol := ~1 val _ = lineDirFile := NONE val _ = lineDirLine := ~1 in finishComment yypos ; Source.lineDirective (source, file, {lineNum = line, lineStart = yypos + 1 - col}) end end (* Text Constants *) local val chars: char list ref = ref [] val inText = ref false val textLeft = ref SourcePos.bogus val textFinishFn: (string * SourcePos.t * SourcePos.t -> lexresult) ref = ref (fn _ => raise Fail "textFinish") in fun startText (tl, tf) = let val _ = chars := [] val _ = inText := true val _ = textLeft := tl val _ = textFinishFn := tf in () end fun finishText textRight = let val cs = String.fromListRev (!chars) val tl = !textLeft val tr = textRight val tf = !textFinishFn val _ = chars := [] val _ = inText := false val _ = textLeft := SourcePos.bogus val _ = textFinishFn := (fn _ => raise Fail "textFinish") in tf (cs, tl, tr) end fun addTextString (s: string) = chars := String.fold (s, !chars, fn (c, ac) => c :: ac) val inText = fn () => !inText end fun addTextChar (c: char) = addTextString (String.fromChar c) fun addTextNumEsc (source, yypos, yytext, drop, radix): unit = let val left = yypos val right = lastPos (left, yytext) fun err () = error (source, left, right, "Illegal numeric escape in text constant") in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) (String.dropPrefix (yytext, drop)) of NONE => err () | SOME i => if i > 255 then err () else addTextChar (Char.chr (IntInf.toInt i)) end fun addTextUTF8 (source, yypos, yytext): unit = addTextString yytext (* EOF *) val eof: lexarg -> lexresult = fn {source, ...} => let val _ = Source.newline (source, ~1) val pos = Source.getPos (source, ~1) val _ = if inComment () then error' (pos, SourcePos.bogus, "Unclosed comment at end of file") else () val _ = if inText () then error' (pos, SourcePos.bogus, "Unclosed text constant at end of file") else () in Tokens.EOF (pos, SourcePos.bogus) end %% %full %s TEXT TEXT_FMT BLOCK_COMMENT LINE_COMMENT LINE_DIR1 LINE_DIR2 LINE_DIR3 LINE_DIR4; %header (functor MLBLexFun (structure Tokens : MLB_TOKENS)); %arg ({source}); ws=\t|"\011"|"\012"|" "; cr="\013"; nl="\010"; eol=({cr}{nl}|{nl}|{cr}); alphanum=[A-Za-z0-9'_]; alphanumId=[A-Za-z]{alphanum}*; id={alphanumId}; pathvar="$("([A-Z_][A-Z0-9_]*)")"; filename=({pathvar}|[A-Za-z0-9_.])({pathvar}|[-A-Za-z0-9_.])*; arc=({pathvar}|{filename}|"."|".."); relpath=({arc}"/")*; abspath="/"{relpath}; path={relpath}|{abspath}; file={path}{filename}; decDigit=[0-9]; hexDigit=[0-9a-fA-F]; %% {ws}+ => (continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)); continue ()); "_prim" => (tok (Tokens.PRIM, yytext, source, yypos)); "," => (tok (Tokens.COMMA, yytext, source, yypos)); ";" => (tok (Tokens.SEMICOLON, yytext, source, yypos)); "=" => (tok (Tokens.EQUALOP, yytext, source, yypos)); "and" => (tok (Tokens.AND, yytext, source, yypos)); "ann" => (tok (Tokens.ANN, yytext, source, yypos)); "bas" => (tok (Tokens.BAS, yytext, source, yypos)); "basis" => (tok (Tokens.BASIS, yytext, source, yypos)); "end" => (tok (Tokens.END, yytext, source, yypos)); "functor" => (tok (Tokens.FUNCTOR, yytext, source, yypos)); "in" => (tok (Tokens.IN, yytext, source, yypos)); "let" => (tok (Tokens.LET, yytext, source, yypos)); "local" => (tok (Tokens.LOCAL, yytext, source, yypos)); "open" => (tok (Tokens.OPEN, yytext, source, yypos)); "signature" => (tok (Tokens.SIGNATURE, yytext, source, yypos)); "structure" => (tok (Tokens.STRUCTURE, yytext, source, yypos)); {id} => (tok' (Tokens.ID, yytext, source, yypos)); {file} => (tok' (Tokens.FILE, yytext, source, yypos)); "\"" => (startText (Source.getPos (source, yypos), fn (s, l, r) => (YYBEGIN INITIAL; Tokens.STRING (s, l, r))) ; YYBEGIN TEXT ; continue ()); "\"" => (finishText (Source.getPos (source, lastPos (yypos, yytext)))); " "|!|[\035-\091]|[\093-\126] => (addTextString yytext; continue ()); [\192-\223][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); [\224-\239][\128-\191][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); [\240-\247][\128-\191][\128-\191][\128-\191] => (addTextUTF8 (source, yypos, yytext); continue()); \\a => (addTextChar #"\a"; continue ()); \\b => (addTextChar #"\b"; continue ()); \\t => (addTextChar #"\t"; continue ()); \\n => (addTextChar #"\n"; continue ()); \\v => (addTextChar #"\v"; continue ()); \\f => (addTextChar #"\f"; continue ()); \\r => (addTextChar #"\r"; continue ()); \\\^[@-_] => (addTextChar (Char.chr(Char.ord(String.sub(yytext, 2)) - Char.ord #"@")); continue ()); \\\^. => (error (source, yypos, yypos + 2, "Illegal control escape in text constant; must be one of @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"); continue ()); \\[0-9]{3} => (addTextNumEsc (source, yypos, yytext, 1, StringCvt.DEC) ; continue ()); \\u{hexDigit}{4} => (addTextNumEsc (source, yypos, yytext, 2, StringCvt.HEX) ; continue ()); \\U{hexDigit}{8} => (addTextNumEsc (source, yypos, yytext, 2, StringCvt.HEX) ; continue ()); "\\\"" => (addTextString "\""; continue ()); \\\\ => (addTextString "\\"; continue ()); \\{ws}+ => (YYBEGIN TEXT_FMT; continue ()); \\{eol} => (Source.newline (source, lastPos (yypos, yytext)); YYBEGIN TEXT_FMT; continue ()); \\ => (error (source, yypos, yypos + 1, "Illegal escape in text constant") ; continue ()); {eol} => (error (source, yypos, lastPos (yypos, yytext), "Unclosed text constant at end of line") ; Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (error (source, yypos, yypos, "Illegal character in text constant") ; continue ()); {ws}+ => (continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)); continue ()); \\ => (YYBEGIN TEXT; continue ()); . => (error (source, yypos, yypos, "Illegal formatting character in text continuation") ; continue ()); "(*)" => (startComment (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN LINE_COMMENT ; continue ()); "(*" => (startComment (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN BLOCK_COMMENT ; continue ()); {eol} => (finishComment (lastPos (yypos, yytext)) ; Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (continue ()); "(*)" => (startComment (source, yypos, fn () => YYBEGIN BLOCK_COMMENT) ; YYBEGIN LINE_COMMENT ; continue ()); "(*" => (startComment (source, yypos, fn () => YYBEGIN BLOCK_COMMENT) ; YYBEGIN BLOCK_COMMENT ; continue ()); "*)" => (finishComment (lastPos (yypos, yytext)) ; continue ()); {eol} => (Source.newline (source, lastPos (yypos, yytext)) ; continue ()); . => (continue ()); "(*#line"{ws}+ => (startLineDir (source, yypos, fn () => YYBEGIN INITIAL) ; YYBEGIN LINE_DIR1 ; continue ()); {decDigit}+"."{decDigit}+ => (let fun err () = (addCommentError "Illegal line directive" ; YYBEGIN BLOCK_COMMENT) in case String.split (yytext, #".") of [line, col] => (YYBEGIN LINE_DIR2 ; addLineDirLineCol (valOf (Int.fromString line), valOf (Int.fromString col)) handle Overflow => err () | Option => err () ; continue ()) | _ => (err (); continue ()) end); {ws}+"\"" => (YYBEGIN LINE_DIR3 ; continue ()); [^"]*"\"" => (addLineDirFile (String.dropLast yytext) ; YYBEGIN LINE_DIR4 ; continue ()); {ws}*"*)" => (finishLineDir (source, lastPos (yypos, yytext)) ; continue ()); . => (addCommentError "Illegal line directive" ; YYBEGIN BLOCK_COMMENT ; continue ()); . => (error (source, yypos, yypos, "Illegal character") ; continue ()); mlton-20210117+dfsg/mlton/front-end/sources.cm000066400000000000000000000012021416264345000210520ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor FrontEnd functor MLBFrontEnd is ../../lib/mlton/sources.cm #if (defined (SMLNJ_VERSION)) ml-yacc-lib-proxy.cm #else ../../lib/mlyacc-lib/ml-yacc-lib.cm #endif ../ast/sources.cm ../control/sources.cm ml.grm.sig ml.grm.sml ml.lex.sml front-end.sig front-end.fun mlb.grm.sig mlb.grm.sml mlb.lex.sml mlb-front-end.sig mlb-front-end.fun mlton-20210117+dfsg/mlton/front-end/sources.mlb000066400000000000000000000022211416264345000212270ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../../lib/mlyacc-lib/mlyacc-lib.mlb ../ast/sources.mlb ../control/sources.mlb ann "warnUnused false" in ml.grm.sig ml.grm.sml local (* import Unsafe in case {ml,mlb}.lex.sml is generated by an old * version of mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in ml.lex.sml end end front-end.sig front-end.fun ann "warnUnused false" in mlb.grm.sig mlb.grm.sml local (* import Unsafe in case {ml,mlb}.lex.sml is generated by an old * version of mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in mlb.lex.sml end end mlb-front-end.sig mlb-front-end.fun in functor FrontEnd functor MLBFrontEnd end mlton-20210117+dfsg/mlton/main/000077500000000000000000000000001416264345000161035ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/main/compile.fun000066400000000000000000000573631416264345000202630ustar00rootroot00000000000000(* Copyright (C) 2011,2014-2015,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Compile (S: COMPILE_STRUCTS): COMPILE = struct open S (*---------------------------------------------------*) (* Intermediate Languages *) (*---------------------------------------------------*) structure Atoms = Atoms () local open Atoms in structure Ffi = Ffi structure Symbol = Symbol end structure Ast = Ast (open Atoms) structure TypeEnv = TypeEnv (open Atoms) structure CoreML = CoreML (open Atoms structure Type = struct open TypeEnv.Type val makeHom = fn {con, var} => makeHom {con = con, expandOpaque = true, var = var} fun layout t = #1 (layoutPretty (t, {expandOpaque = true, layoutPrettyTycon = Tycon.layout, layoutPrettyTyvar = Tyvar.layout})) end) structure Xml = Xml (open Atoms) structure Sxml = Sxml (open Xml) structure Ssa = Ssa (open Atoms) structure Ssa2 = Ssa2 (open Atoms) structure BackendAtoms = BackendAtoms (open Atoms) structure Rssa = Rssa (open BackendAtoms) structure Machine = Machine (open BackendAtoms) (*---------------------------------------------------*) (* Compiler Passes *) (*---------------------------------------------------*) structure FrontEnd = FrontEnd (structure Ast = Ast) structure MLBFrontEnd = MLBFrontEnd (structure Ast = Ast structure FrontEnd = FrontEnd) structure DeadCode = DeadCode (structure CoreML = CoreML) structure Defunctorize = Defunctorize (structure CoreML = CoreML structure Xml = Xml) structure Elaborate = Elaborate (structure Ast = Ast structure CoreML = CoreML structure TypeEnv = TypeEnv) local open Elaborate in structure Env = Env end structure Monomorphise = Monomorphise (structure Xml = Xml structure Sxml = Sxml) structure ClosureConvert = ClosureConvert (structure Ssa = Ssa structure Sxml = Sxml) structure SsaToSsa2 = SsaToSsa2 (structure Ssa = Ssa structure Ssa2 = Ssa2) structure Ssa2ToRssa = Ssa2ToRssa (structure Rssa = Rssa structure Ssa2 = Ssa2) structure Backend = Backend (structure Machine = Machine structure Rssa = Rssa fun funcToLabel f = f) structure CCodegen = CCodegen (structure Machine = Machine) structure LLVMCodegen = LLVMCodegen (structure CCodegen = CCodegen structure Machine = Machine) structure x86Codegen = x86Codegen (structure CCodegen = CCodegen structure Machine = Machine) structure amd64Codegen = amd64Codegen (structure CCodegen = CCodegen structure Machine = Machine) (* ------------------------------------------------- *) (* Primitive Env *) (* ------------------------------------------------- *) local structure Con = TypeEnv.Con structure Tycon = TypeEnv.Tycon structure Type = TypeEnv.Type structure Tyvar = struct open TypeEnv.Tyvar open TypeEnv.TyvarExt end val primitiveDatatypes = Vector.new3 ({tycon = Tycon.bool, tyvars = Vector.new0 (), cons = Vector.new2 ({con = Con.falsee, arg = NONE}, {con = Con.truee, arg = NONE})}, let val a = Tyvar.makeNoname {equality = false} in {tycon = Tycon.list, tyvars = Vector.new1 a, cons = Vector.new2 ({con = Con.nill, arg = NONE}, {con = Con.cons, arg = SOME (Type.tuple (Vector.new2 (Type.var a, Type.list (Type.var a))))})} end, let val a = Tyvar.makeNoname {equality = false} in {tycon = Tycon.reff, tyvars = Vector.new1 a, cons = Vector.new1 {con = Con.reff, arg = SOME (Type.var a)}} end) val primitiveExcons = let open CoreML.Con in [bind, match] end structure Con = struct open Con fun toAst c = Ast.Con.fromSymbol (Symbol.fromString (Con.toString c), Region.bogus) end structure Env = struct open Env structure Tycon = struct open Tycon fun toAst c = Ast.Tycon.fromSymbol (Symbol.fromString (Tycon.toString c), Region.bogus) end structure Type = TypeEnv.Type structure Scheme = TypeEnv.Scheme fun addPrim (E: t): unit = let val _ = List.foreach (Tycon.prims, fn {name, tycon, ...} => if List.contains ([Tycon.arrow, Tycon.tuple], tycon, Tycon.equals) then () else extendTycon (E, Ast.Tycon.fromSymbol (Symbol.fromString name, Region.bogus), TypeStr.tycon tycon, {forceUsed = false, isRebind = false})) val _ = Vector.foreach (primitiveDatatypes, fn {tyvars, tycon, cons} => let val cons = Vector.map (cons, fn {con, arg} => let val res = Type.con (tycon, Vector.map (tyvars, Type.var)) val ty = case arg of NONE => res | SOME arg => Type.arrow (arg, res) val scheme = Scheme.make {canGeneralize = true, ty = ty, tyvars = tyvars} in {con = con, name = Con.toAst con, scheme = scheme} end) val cons = Env.newCons (E, cons) in extendTycon (E, Tycon.toAst tycon, TypeStr.data (tycon, cons), {forceUsed = false, isRebind = false}) end) val _ = extendTycon (E, Ast.Tycon.fromSymbol (Symbol.unit, Region.bogus), TypeStr.def (Scheme.fromType Type.unit), {forceUsed = false, isRebind = false}) val scheme = Scheme.fromType Type.exn val _ = List.foreach (primitiveExcons, fn c => extendExn (E, Con.toAst c, c, scheme)) in () end end val primitiveDecs: CoreML.Dec.t list = let open CoreML.Dec in List.concat [[Datatype primitiveDatatypes], List.map (primitiveExcons, fn c => Exception {con = c, arg = NONE})] end in fun addPrim E = (Env.addPrim E ; primitiveDecs) end (* ------------------------------------------------- *) (* parseAndElaborateMLB *) (* ------------------------------------------------- *) structure MLBString:> sig type t val fromMLBFile: File.t -> t val fromSMLFile: File.t -> t val lexAndParseMLB: t -> Ast.Basdec.t end = struct type t = string fun quoteFile s = concat ["\"", String.escapeSML s, "\""] val fromMLBFile = quoteFile fun fromSMLFile input = let val basis = "$(SML_LIB)/basis/default.mlb" in String.concat ["local\n", basis, "\n", "in\n", quoteFile input, "\n", "end\n"] end val lexAndParseMLB = MLBFrontEnd.lexAndParseString end val lexAndParseMLB: MLBString.t -> Ast.Basdec.t = fn input => let val ast = MLBString.lexAndParseMLB input val _ = Control.checkForErrors () in ast end fun parseAndElaborateMLB (input: MLBString.t): (CoreML.Dec.t list * bool) vector = let fun parseAndElaborateMLB input = let val _ = if !Control.keepAST then File.remove (concat [!Control.inputFile, ".ast"]) else () val (E, decs) = Elaborate.elaborateMLB (lexAndParseMLB input, {addPrim = addPrim}) val _ = Control.checkForErrors () val _ = Option.map (!Control.showBasis, fn f => Env.showBasis (E, f)) val _ = Env.processDefUse E val _ = Option.app (!Control.exportHeader, Ffi.exportHeader) in decs end in Control.translatePass {arg = input, doit = parseAndElaborateMLB, keepIL = false, name = "parseAndElaborate", srcToFile = NONE, tgtStats = SOME (fn coreML => Control.sizeMessage ("coreML program", coreML)), tgtToFile = SOME {display = (Control.Layouts (fn (decss, output) => (output (Layout.str "\n"); Vector.foreach (decss, fn (decs, dc) => (output (Layout.seq [Layout.str "(* deadCode: ", Bool.layout dc, Layout.str " *)"]); List.foreach (decs, output o CoreML.Dec.layout)))))), style = #style CoreML.Program.toFile, suffix = #suffix CoreML.Program.toFile}, tgtTypeCheck = NONE} end (* ------------------------------------------------- *) (* compile *) (* ------------------------------------------------- *) fun mkCompile {outputC, outputLL, outputS} = let local val sourceFiles = Ast.Basdec.sourceFiles o lexAndParseMLB in val mlbSourceFiles = sourceFiles o MLBString.fromMLBFile val smlSourceFiles = sourceFiles o MLBString.fromSMLFile end fun deadCode decs = let fun deadCode decs = let val {prog = decs} = DeadCode.deadCode {prog = decs} val decs = Vector.concatV (Vector.map (decs, Vector.fromList)) val coreML = CoreML.Program.T {decs = decs} in coreML end val coreML = Control.translatePass {arg = decs, doit = deadCode, keepIL = !Control.keepCoreML, name = "deadCode", srcToFile = SOME {display = (Control.Layouts (fn (decss, output) => (output (Layout.str "\n"); Vector.foreach (decss, fn (decs, dc) => (output (Layout.seq [Layout.str "(* deadCode: ", Bool.layout dc, Layout.str " *)"]); List.foreach (decs, output o CoreML.Dec.layout)))))), style = #style CoreML.Program.toFile, suffix = #suffix CoreML.Program.toFile}, tgtStats = SOME CoreML.Program.layoutStats, tgtToFile = SOME CoreML.Program.toFile, tgtTypeCheck = NONE} in coreML end fun defunctorize coreML = Control.translatePass {arg = coreML, doit = (fn coreML => Defunctorize.defunctorize coreML before Control.checkForErrors ()), keepIL = false, name = "defunctorize", srcToFile = SOME CoreML.Program.toFile, tgtStats = SOME Xml.Program.layoutStats, tgtToFile = SOME Xml.Program.toFile, tgtTypeCheck = SOME Xml.typeCheck} fun frontend input = Control.translatePass {arg = input, doit = defunctorize o deadCode o parseAndElaborateMLB, keepIL = false, name = "frontend", srcToFile = NONE, tgtStats = SOME Xml.Program.layoutStats, tgtToFile = SOME Xml.Program.toFile, tgtTypeCheck = SOME Xml.typeCheck} val mlbFrontend = frontend o MLBString.fromMLBFile val smlFrontend = frontend o MLBString.fromSMLFile fun regionFromLocation (file, {column, line}) = let val sourcePos = SourcePos.make {column=column, file=file, line=line} in Region.make {left=sourcePos, right=sourcePos} end fun mkFrontend {parse, stats, toFile, typeCheck} = let val name = #suffix toFile in fn input => Ref.fluidLet (Control.typeCheck, true, fn () => Control.translatePass {arg = input, doit = (fn input => case Parse.parseFile (parse (), input) of Parse.Yes program => program | Parse.No (msg, location) => (Control.error (regionFromLocation (input, location), Layout.str (concat [name, "Parse failed"]), msg) ; Control.checkForErrors () ; Error.bug "unreachable")), keepIL = false, name = concat [name, "Parse"], srcToFile = NONE, tgtStats = SOME stats, tgtToFile = SOME toFile, tgtTypeCheck = SOME typeCheck}) end val xmlFrontend = mkFrontend {parse = Xml.Program.parse, stats = Xml.Program.layoutStats, toFile = Xml.Program.toFile, typeCheck = Xml.typeCheck} val sxmlFrontend = mkFrontend {parse = Sxml.Program.parse, stats = Sxml.Program.layoutStats, toFile = Sxml.Program.toFile, typeCheck = Sxml.typeCheck} val ssaFrontend = mkFrontend {parse = Ssa.Program.parse, stats = Ssa.Program.layoutStats, toFile = Ssa.Program.toFile, typeCheck = Ssa.typeCheck} val ssa2Frontend = mkFrontend {parse = Ssa2.Program.parse, stats = Ssa2.Program.layoutStats, toFile = Ssa2.Program.toFile, typeCheck = Ssa2.typeCheck} fun xmlSimplify xml = let val xml = Control.simplifyPass {arg = xml, doit = Xml.simplify, execute = true, keepIL = !Control.keepXML, name = "xmlSimplify", stats = Xml.Program.layoutStats, toFile = Xml.Program.toFile, typeCheck = Xml.typeCheck} in xml end fun toSxml xml = Control.translatePass {arg = xml, doit = Monomorphise.monomorphise, keepIL = false, name = "monomorphise", srcToFile = SOME Xml.Program.toFile, tgtStats = SOME Sxml.Program.layoutStats, tgtToFile = SOME Sxml.Program.toFile, tgtTypeCheck = SOME Sxml.typeCheck} fun sxmlSimplify sxml = let val sxml = Control.simplifyPass {arg = sxml, doit = Sxml.simplify, execute = true, keepIL = !Control.keepSXML, name = "sxmlSimplify", stats = Sxml.Program.layoutStats, toFile = Sxml.Program.toFile, typeCheck = Sxml.typeCheck} in sxml end fun toSsa sxml = Control.translatePass {arg = sxml, doit = ClosureConvert.closureConvert, keepIL = false, name = "closureConvert", srcToFile = SOME Sxml.Program.toFile, tgtStats = SOME Ssa.Program.layoutStats, tgtToFile = SOME Ssa.Program.toFile, tgtTypeCheck = SOME Ssa.typeCheck} fun ssaSimplify ssa = let val ssa = Control.simplifyPass {arg = ssa, doit = Ssa.simplify, execute = true, keepIL = !Control.keepSSA, name = "ssaSimplify", stats = Ssa.Program.layoutStats, toFile = Ssa.Program.toFile, typeCheck = Ssa.typeCheck} in ssa end fun toSsa2 ssa = Control.translatePass {arg = ssa, doit = SsaToSsa2.convert, keepIL = false, name = "toSsa2", srcToFile = SOME Ssa.Program.toFile, tgtStats = SOME Ssa2.Program.layoutStats, tgtToFile = SOME Ssa2.Program.toFile, tgtTypeCheck = SOME Ssa2.typeCheck} fun ssa2Simplify ssa2 = let val ssa2 = Control.simplifyPass {arg = ssa2, doit = Ssa2.simplify, execute = true, keepIL = !Control.keepSSA2, name = "ssa2Simplify", stats = Ssa2.Program.layoutStats, toFile = Ssa2.Program.toFile, typeCheck = Ssa2.typeCheck} in ssa2 end fun toRssa ssa2 = let val codegenImplementsPrim = case !Control.codegen of Control.AMD64Codegen => amd64Codegen.implementsPrim | Control.CCodegen => CCodegen.implementsPrim | Control.LLVMCodegen => LLVMCodegen.implementsPrim | Control.X86Codegen => x86Codegen.implementsPrim fun toRssa ssa2 = Ssa2ToRssa.convert (ssa2, {codegenImplementsPrim = codegenImplementsPrim}) val rssa = Control.translatePass {arg = ssa2, doit = toRssa, keepIL = false, name = "toRssa", srcToFile = SOME Ssa2.Program.toFile, tgtStats = SOME Rssa.Program.layoutStats, tgtToFile = SOME Rssa.Program.toFile, tgtTypeCheck = SOME Rssa.typeCheck} in rssa end fun rssaSimplify rssa = Control.simplifyPass {arg = rssa, doit = Rssa.simplify, execute = true, keepIL = !Control.keepRSSA, name = "rssaSimplify", stats = Rssa.Program.layoutStats, toFile = Rssa.Program.toFile, typeCheck = Rssa.typeCheck} fun toMachine rssa = let val machine = Control.translatePass {arg = rssa, doit = Backend.toMachine, keepIL = false, name = "backend", srcToFile = SOME Rssa.Program.toFile, tgtStats = SOME Machine.Program.layoutStats, tgtToFile = SOME Machine.Program.toFile, tgtTypeCheck = SOME Machine.Program.typeCheck} in machine end fun machineSimplify machine = Control.simplifyPass {arg = machine, doit = Machine.simplify, execute = true, keepIL = !Control.keepMachine, name = "machineSimplify", stats = Machine.Program.layoutStats, toFile = Machine.Program.toFile, typeCheck = Machine.Program.typeCheck} fun codegen machine = let val _ = Machine.Program.clearLabelNames machine val _ = Machine.Label.printNameAlphaNumeric := true fun codegen machine = case !Control.codegen of Control.AMD64Codegen => amd64Codegen.output {program = machine, outputC = outputC, outputS = outputS} | Control.CCodegen => CCodegen.output {program = machine, outputC = outputC} | Control.LLVMCodegen => LLVMCodegen.output {program = machine, outputC = outputC, outputLL = outputLL} | Control.X86Codegen => x86Codegen.output {program = machine, outputC = outputC, outputS = outputS} in Control.translatePass {arg = machine, doit = codegen, keepIL = false, name = concat [Control.Codegen.toString (!Control.codegen), "Codegen"], srcToFile = SOME Machine.Program.toFile, tgtStats = NONE, tgtToFile = NONE, tgtTypeCheck = NONE} end val goCodegen = codegen val goMachineSimplify = goCodegen o machineSimplify val goToMachine = goMachineSimplify o toMachine val goRssaSimplify = goToMachine o rssaSimplify val goToRssa = goRssaSimplify o toRssa val goSsa2Simplify = goToRssa o ssa2Simplify val goToSsa2 = goSsa2Simplify o toSsa2 val goSsaSimplify = goToSsa2 o ssaSimplify val goToSsa = goSsaSimplify o toSsa val goSxmlSimplify = goToSsa o sxmlSimplify val goToSxml = goSxmlSimplify o toSxml val goXmlSimplify = goToSxml o xmlSimplify fun mk (il, sourceFiles, frontend, compile) = {sourceFiles = sourceFiles, frontend = Control.trace (Control.Top, "Type Check " ^ il) (ignore o frontend), compile = Control.trace (Control.Top, "Compile " ^ il) (compile o frontend)} in {mlb = mk ("SML", mlbSourceFiles, mlbFrontend, goXmlSimplify), sml = mk ("SML", smlSourceFiles, smlFrontend, goXmlSimplify), xml = mk ("XML", Vector.new1, xmlFrontend, goXmlSimplify), sxml = mk ("SXML", Vector.new1, sxmlFrontend, goSxmlSimplify), ssa = mk ("SSA", Vector.new1, ssaFrontend, goSsaSimplify), ssa2 = mk ("SSA2", Vector.new1, ssa2Frontend, goSsa2Simplify)} end end mlton-20210117+dfsg/mlton/main/compile.sig000066400000000000000000000032311416264345000202360ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature COMPILE_STRUCTS = sig end signature COMPILE = sig include COMPILE_STRUCTS val mkCompile: {outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputLL: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> {mlb: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}, sml: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}, xml: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}, sxml: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}, ssa: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}, ssa2: {compile: File.t -> unit, frontend: File.t -> unit, sourceFiles: File.t -> File.t vector}} end mlton-20210117+dfsg/mlton/main/main.fun000066400000000000000000002214371416264345000175520ustar00rootroot00000000000000(* Copyright (C) 2010-2011,2013-2020 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Main (S: MAIN_STRUCTS): MAIN = struct open S structure Compile = Compile () structure Place = struct datatype t = Files | Generated | MLB | O | OUT | SML | SSA | SSA2 | SXML | TypeCheck | XML val toInt: t -> int = fn MLB => 1 | SML => 1 | Files => 2 | TypeCheck => 4 | XML => 6 | SXML => 7 | SSA => 10 | SSA2 => 11 | Generated => 13 | O => 14 | OUT => 15 val toString = fn Files => "files" | Generated => "g" | MLB => "mlb" | O => "o" | OUT => "out" | SML => "sml" | SSA => "ssa" | SSA2 => "ssa2" | SXML => "sxml" | TypeCheck => "tc" | XML => "xml" fun compare (p, p') = Int.compare (toInt p, toInt p') end structure OptPred = struct datatype t = Target of string | Yes end structure Show = struct datatype t = Anns | PathMap end val cc: string list ref = ref ["cc"] val arScript: string ref = ref "" val asOpts: {opt: string, pred: OptPred.t} list ref = ref [] val ccOpts: {opt: string, pred: OptPred.t} list ref = ref [] val mathLinkOpt: string ref = ref "-lm" val gmpLinkOpt: string ref = ref "-lgmp" val linkOpts: {opt: string, pred: OptPred.t} list ref = ref [] val llvm_as: string ref = ref "llvm-as" val llvm_asOpts: {opt: string, pred: OptPred.t} list ref = ref [] val llvm_llc: string ref = ref "llc" val llvm_llcOpts: {opt: string, pred: OptPred.t} list ref = ref [] val llvm_opt: string ref = ref "opt" val llvm_optOpts: {opt: string, pred: OptPred.t} list ref = ref [] val debugRuntime: bool ref = ref false val expert: bool ref = ref false val explicitAlign: Control.align option ref = ref NONE val explicitChunkify: Control.Chunkify.t option ref = ref NONE datatype explicitCodegen = Native | Explicit of Control.Codegen.t val explicitCodegen: explicitCodegen option ref = ref NONE val explicitNativePIC: bool option ref = ref NONE val keepGenerated = ref false val keepO = ref false val output: string option ref = ref NONE val profileSet: bool ref = ref false val profileTimeSet: bool ref = ref false val runtimeArgs: string list ref = ref ["@MLton"] val show: Show.t option ref = ref NONE val stop = ref Place.OUT fun parseMlbPathVar (line: String.t) = case String.tokens (line, Char.isSpace) of [var, path] => SOME {var = var, path = path} | _ => NONE fun readMlbPathMap (file: File.t) = if not (File.canRead file) then Error.bug (concat ["can't read MLB path map file: ", file]) else List.keepAllMap (File.lines file, fn line => if String.forall (line, Char.isSpace) then NONE else case parseMlbPathVar line of NONE => Error.bug (concat ["strange mlb path mapping: ", file, ":: ", line]) | SOME v => SOME v) val targetMap: unit -> {arch: MLton.Platform.Arch.t, os: MLton.Platform.OS.t, target: string} list = Promise.lazy (fn () => let val targetsDir = OS.Path.mkAbsolute {path = "targets", relativeTo = !Control.libDir} val potentialTargets = Dir.lsDirs targetsDir fun targetMap target = let val targetDir = OS.Path.mkAbsolute {path = target, relativeTo = targetsDir} val osFile = OS.Path.joinDirFile {dir = targetDir, file = "os"} val archFile = OS.Path.joinDirFile {dir = targetDir, file = "arch"} val os = File.contents osFile val arch = File.contents archFile val os = List.first (String.tokens (os, Char.isSpace)) val arch = List.first (String.tokens (arch, Char.isSpace)) val os = case MLton.Platform.OS.fromString os of NONE => Error.bug (concat ["strange os: ", os]) | SOME os => os val arch = case MLton.Platform.Arch.fromString arch of NONE => Error.bug (concat ["strange arch: ", arch]) | SOME a => a in SOME {arch = arch, os = os, target = target} end handle _ => NONE in List.keepAllMap (potentialTargets, targetMap) end) fun setTargetType (target: string, usage): unit = case List.peek (targetMap (), fn {target = t, ...} => target = t) of NONE => usage (concat ["invalid target: ", target]) | SOME {arch, os, ...} => let open Control in Target.arch := arch ; Target.os := os end fun hasCodegen (cg, {default}) = let datatype z = datatype Control.Target.arch datatype z = datatype Control.Target.os datatype z = datatype Control.Format.t datatype z = datatype Control.codegen in case !Control.Target.arch of AMD64 => (case cg of X86Codegen => false | _ => true) | X86 => (case cg of AMD64Codegen => false | X86Codegen => not default orelse (* Darwin PIC doesn't work *) !Control.Target.os <> Darwin | _ => true) | _ => (case cg of AMD64Codegen => false | X86Codegen => false | _ => true) end fun hasNativeCodegen () = let datatype z = datatype Control.codegen in hasCodegen (AMD64Codegen, {default = true}) orelse hasCodegen (X86Codegen, {default = true}) end fun defaultAlignIs8 () = let datatype z = datatype Control.Target.arch in case !Control.Target.arch of Alpha => true | AMD64 => true | ARM => true | ARM64 => true | HPPA => true | IA64 => true | MIPS => true | Sparc => true | S390 => true | _ => false end fun makeOptions {usage} = let val usage = fn s => (ignore (usage s); raise Fail "unreachable") fun reportAnnotation (s, flag, e) = case e of Control.Elaborate.Bad => usage (concat ["invalid -", flag, " flag: ", s]) | Control.Elaborate.Good _ => () | Control.Elaborate.Other => usage (concat ["invalid -", flag, " flag: ", s]) | Control.Elaborate.Proxy (ids, {deprecated}) => if deprecated andalso !Control.warnDeprecated then Out.output (Out.error, concat ["Warning: ", "deprecated annotation: ", s, ", use ", List.toString Control.Elaborate.Id.name ids, ".\n"]) else () open Control Popt datatype z = datatype MLton.Platform.Arch.t datatype z = datatype MLton.Platform.OS.t fun tokenizeOpt f opts = List.foreach (String.tokens (opts, Char.isSpace), fn opt => f opt) fun tokenizeTargetOpt f (target, opts) = List.foreach (String.tokens (opts, Char.isSpace), fn opt => f (target, opt)) in List.map ( [ (Normal, "align", if defaultAlignIs8 () then " {8|4}" else " {4|8}", "object alignment", (SpaceString (fn s => explicitAlign := SOME (case s of "4" => Align4 | "8" => Align8 | _ => usage (concat ["invalid -align flag: ", s]))))), (Expert, "ar-script", " ", "path to a script producing archives", SpaceString (fn s => arScript := s)), (Normal, "as-opt", " ", "pass option to assembler", (SpaceString o tokenizeOpt) (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "as-opt-quote", " ", "pass (quoted) option to assembler", SpaceString (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "bounce-rssa-limit", "", "Maximum number of rssa variables to bounce around gc", Int (fn i => bounceRssaLimit := (if i < 0 then NONE else SOME i))), (Expert, "bounce-rssa-live-cutoff", "", "Limit of bounceable variables at bounce points", Int (fn i => bounceRssaLiveCutoff := (if i < 0 then NONE else SOME i))), (Expert, "bounce-rssa-loop-size-cutoff", "", "Largest loop size to consider", Int (fn i => bounceRssaLoopCutoff := (if i < 0 then NONE else SOME i))), (Expert, "bounce-rssa-usage-cutoff", "", "Maximum variable use count to consider", Int (fn i => bounceRssaUsageCutoff := (if i < 0 then NONE else SOME i))), (Expert, "cc", " ", "set C compiler", SpaceString (fn s => cc := String.tokens (s, Char.isSpace))), (Normal, "cc-opt", " ", "pass option to C compiler", (SpaceString o tokenizeOpt) (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "cc-opt-quote", " ", "pass (quoted) option to C compiler", SpaceString (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "chunkify", " {coalesce|func|one|simple}", "set chunkify stategy", SpaceString (fn s => explicitChunkify := (case Chunkify.fromString s of SOME chunkify => SOME chunkify | NONE => usage (concat ["invalid -chunkify flag: ", s])))), (Expert, "chunk-batch", " ", "batch c files at size ~n", Int (fn n => chunkBatch := n)), (Expert, "chunk-jump-table", " {false|true}", "whether to use explicit jump table for chunk entry switch", Bool (fn b => chunkJumpTable := b)), (Expert, "chunk-may-rto-self-opt", " {true|false}", "whether to optimize return/raise that may transfer to self chunk", Bool (fn b => chunkMayRToSelfOpt := b)), (Expert, "chunk-must-rto-other-opt", " {true|false}", "whether to optimize return/raise that must transfer to one other chunk", Bool (fn b => chunkMustRToOtherOpt := b)), (Expert, "chunk-must-rto-self-opt", " {true|false}", "whether to optimize return/raise that must transfer to self chunk", Bool (fn b => chunkMustRToSelfOpt := b)), (Expert, "chunk-must-rto-sing-opt", " {true|false}", "whether to optimize return/raise that must transfer to a single label", Bool (fn b => chunkMustRToSingOpt := b)), (Expert, "chunk-tail-call", " {false|true}", "whether to use tail calls for interchunk transfers", Bool (fn b => chunkTailCall := b)), (Expert, "closure-convert-globalize", " {true|false}", "whether to globalize during closure conversion", Bool (fn b => (closureConvertGlobalize := b))), (Expert, "closure-convert-shrink", " {true|false}", "whether to shrink during closure conversion", Bool (fn b => (closureConvertShrink := b))), (Normal, "codegen", concat [" {", String.concatWith (List.keepAllMap (Native :: (List.map (Control.Codegen.all, Explicit)), fn cg => case cg of Native => if hasNativeCodegen () then SOME "native" else NONE | Explicit cg => if hasCodegen (cg, {default = true}) then SOME (Control.Codegen.toString cg) else NONE), "|"), "}"], "which code generator to use", SpaceString (fn s => explicitCodegen := SOME (if s = "native" then Native else (case List.peek (Control.Codegen.all, fn cg => s = Control.Codegen.toString cg) of SOME cg => Explicit cg | NONE => usage (concat ["invalid -codegen flag: ", s]))))), (Expert, "codegen-comments", " ", "level of comments (0)", intRef codegenComments), (Expert, "codegen-fuse-op-and-chk", " {false|true}", "fuse `op` and `opCheckP` primitives in codegen", boolRef codegenFuseOpAndChk), (Normal, "const", " ' '", "set compile-time constant", SpaceString (fn s => case String.tokens (s, Char.isSpace) of [name, value] => Control.setCommandLineConst {name = name, value = value} | _ => usage (concat ["invalid -const flag: ", s]))), (Expert, "contify-into-main", " {false|true}", "contify functions into main", boolRef contifyIntoMain), (Expert, "debug", " {false|true}", "produce executable with debug info", Bool (fn b => (debug := b ; debugRuntime := b))), (Expert, "debug-runtime", " {false|true}", "link with debug runtime", boolRef debugRuntime), let val flag = "default-ann" in (Normal, flag, " ", "set annotation default for mlb files", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processDefault s))) end, (Normal, "default-type", " ''", "set default type", SpaceString (fn s => (case s of "char8" => Control.defaultChar := s | "int8" => Control.defaultInt := s | "int16" => Control.defaultInt := s | "int32" => Control.defaultInt := s | "int64" => Control.defaultInt := s | "intinf" => Control.defaultInt := s | "real32" => Control.defaultReal := s | "real64" => Control.defaultReal := s | "widechar16" => Control.defaultWideChar := s | "widechar32" => Control.defaultWideChar := s | "word8" => Control.defaultWord := s | "word16" => Control.defaultWord := s | "word32" => Control.defaultWord := s | "word64" => Control.defaultWord := s | _ => usage (concat ["invalid -default-type flag: ", s])))), (Expert, "diag-pass", " ", "keep diagnostic info for pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (diagPasses, re) end | NONE => usage (concat ["invalid -diag-pass flag: ", s])))), let val flag = "disable-ann" in (Normal, flag, " ", "disable annotation in mlb files", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processEnabled (s, false)))) end, (Expert, "disable-pass", " ", "disable optimization pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (executePasses, (re, false)) end | NONE => usage (concat ["invalid -disable-pass flag: ", s])))), (Expert, "drop-pass", " ", "disable optimization pass", SpaceString (fn s => (if !Control.warnDeprecated then Out.output (Out.error, "Warning: -drop-pass is deprecated. Use -disable-pass.\n") else (); case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (executePasses, (re, false)) end | NONE => usage (concat ["invalid -disable-pass flag: ", s])))), let val flag = "enable-ann" in (Expert, flag, " ", "globally enable annotation", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processEnabled (s, true)))) end, (Expert, "enable-pass", " ", "enable optimization pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (executePasses, (re, true)) end | NONE => usage (concat ["invalid -enable-pass flag: ", s])))), (Expert, "error-threshhold", " ", "error threshhold (20)", intRef errorThreshhold), (Expert, "emit-main", " {true|false}", "emit main() startup function", boolRef emitMain), (Expert, "expert", " {false|true}", "enable expert status", boolRef expert), (Normal, "export-header", " ", "write C header file for _export's", SpaceString (fn s => exportHeader := SOME s)), (Expert, "format", concat [" {", String.concatWith (List.keepAllMap (Control.Format.all, fn cg => SOME (Control.Format.toString cg)), "|"), "}"], "generated output format", SpaceString (fn s => Control.format := (case List.peek (Control.Format.all, fn cg => s = Control.Format.toString cg) of SOME cg => cg | NONE => usage (concat ["invalid -format flag: ", s])))), (Expert, "gc-check", " {limit|first|every}", "force GCs", SpaceString (fn s => gcCheck := (case s of "limit" => Limit | "first" => First | "every" => Every | _ => usage (concat ["invalid -gc-check flag: ", s])))), (Expert, "gc-expect", " {none|false|true}", "GC expect", SpaceString (fn s => gcExpect := (case s of "false" => SOME false | "none" => NONE | "true" => SOME true | _ => usage (concat ["invalid -gc-expect flag: ", s])))), (Expert, "globalize-arrays", " {false|true}", "globalize arrays", boolRef globalizeArrays), (Expert, "globalize-refs", " {true|false}", "globalize refs", boolRef globalizeRefs), (Expert, "globalize-small-int-inf", " {true|false}", "globalize int-inf as small type", boolRef globalizeSmallIntInf), (Expert, "globalize-small-type", " {0|1|2|3|4|9}", "globalize small type", intRef globalizeSmallType), (Expert, "gmp-link-opt", " ", "link option for GMP library", (SpaceString o tokenizeOpt) (fn s => gmpLinkOpt := s)), (Normal, "ieee-fp", " {false|true}", "use strict IEEE floating-point", boolRef Native.IEEEFP), (Expert, "indentation", " ", "indentation level in ILs", intRef indentation), (Normal, "inline", " ", "set inlining threshold", Int (fn i => inlineNonRec := {small = i, product = #product (!inlineNonRec)})), (Expert, "inline-into-main", " {true|false}", "inline functions into main", boolRef inlineIntoMain), (Expert, "inline-leafa-loops", " {true|false}", "leaf inline loops", Bool (fn loops => case !inlineLeafA of {repeat, size, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafa-repeat", " {true|false}", "leaf inline repeat", Bool (fn repeat => case !inlineLeafA of {loops, size, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafa-size", " ", "set leaf inlining threshold (20)", SpaceString (fn s => case !inlineLeafA of {loops, repeat, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = (if s = "inf" then NONE else if String.forall (s, Char.isDigit) then Int.fromString s else (usage o concat) ["invalid -inline-leaf-size flag: ", s])})), (Expert, "inline-leafb-loops", " {true|false}", "leaf inline loops", Bool (fn loops => case !inlineLeafB of {repeat, size, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafb-repeat", " {true|false}", "leaf inline repeat", Bool (fn repeat => case !inlineLeafB of {loops, size, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafb-size", " ", "set leaf inlining threshold (40)", SpaceString (fn s => case !inlineLeafB of {loops, repeat, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = (if s = "inf" then NONE else if String.forall (s, Char.isDigit) then Int.fromString s else (usage o concat) ["invalid -inline-leaf-size flag: ", s])})), (Expert, "inline-nonrec-product", " ", "set inlining threshold (320)", Int (fn product => case !inlineNonRec of {small, ...} => inlineNonRec := {small = small, product = product})), (Expert, "inline-nonrec-small", " ", "set inlining threshold (60)", Int (fn small => case !inlineNonRec of {product, ...} => inlineNonRec := {small = small, product = product})), (Normal, "keep", " {g|o}", "save intermediate files", SpaceString (fn s => case s of "ast" => keepAST := true | "core-ml" => keepCoreML := true | "dot" => keepDot := true | "g" => keepGenerated := true | "machine" => keepMachine := true | "o" => keepO := true | "rssa" => keepRSSA := true | "ssa" => keepSSA := true | "ssa2" => keepSSA2 := true | "sxml" => keepSXML := true | "xml" => keepXML := true | _ => usage (concat ["invalid -keep flag: ", s]))), (Expert, "keep-pass", " ", "keep the results of pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (keepPasses, re) end | NONE => usage (concat ["invalid -keep-pass flag: ", s])))), (Expert, "layout-width", " ", "target width for pretty printer", Int (fn n => if n > 0 then Layout.setDefaultWidth n else usage (concat ["invalid -layout-width arg: ", Int.toString n]))), (Expert, "libname", " ", "the name of the generated library", SpaceString (fn s => libname := s)), (Normal, "link-opt", " ", "pass option to linker", (SpaceString o tokenizeOpt) (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "link-opt-quote", " ", "pass (quoted) option to linker", SpaceString (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-as", " ", "path to llvm .ll -> .bc assembler", SpaceString (fn s => llvm_as := s)), (Normal, "llvm-as-opt", " ", "pass option to llvm assembler", (SpaceString o tokenizeOpt) (fn s => List.push (llvm_asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-as-opt-quote", " ", "pass (quoted) option to llvm assembler", SpaceString (fn s => List.push (llvm_asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-aamd", " {none|tbaa}", "Include alias-analysis metadata when compiling with LLVM", SpaceString (fn s => llvmAAMD := (case LLVMAliasAnalysisMetaData.fromString s of SOME aamd => aamd | NONE => usage (concat ["invalid -llvm-aamd flag: ", s])))), (Expert, "llvm-cc10", " {false|true}", "use llvm 'cc10' for interchunk transfers", boolRef llvmCC10), (Expert, "llvm-llc", " ", "path to llvm .bc -> .o compiler", SpaceString (fn s => llvm_llc := s)), (Normal, "llvm-llc-opt", " ", "pass option to llvm compiler", (SpaceString o tokenizeOpt) (fn s => List.push (llvm_llcOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-llc-opt-quote", " ", "pass (quoted) option to llvm compiler", SpaceString (fn s => List.push (llvm_llcOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-opt", " ", "path to llvm .bc -> .bc optimizer", SpaceString (fn s => llvm_opt := s)), (Normal, "llvm-opt-opt", " ", "pass option to llvm optimizer", (SpaceString o tokenizeOpt) (fn s => List.push (llvm_optOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "llvm-opt-opt-quote", " ", "pass (quoted) option to llvm optimizer", SpaceString (fn s => List.push (llvm_optOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "loop-unroll-limit", " ", "limit code growth by loop unrolling", Int (fn i => if i >= 0 then loopUnrollLimit := i else usage (concat ["invalid -loop-unroll-limit: ", Int.toString i]))), (Expert, "loop-unswitch-limit", " ", "limit code growth by loop unswitching", Int (fn i => if i >= 0 then loopUnswitchLimit := i else usage (concat ["invalid -loop-unswitch-limit: ", Int.toString i]))), (Expert, "mark-cards", " {true|false}", "mutator marks cards", boolRef markCards), (Expert, "math-link-opt", " ", "link option for math library", (SpaceString o tokenizeOpt) (fn s => mathLinkOpt := s)), (Expert, "max-function-size", " ", "max function size (blocks)", intRef maxFunctionSize), (Normal, "mlb-path-map", " ", "additional MLB path map", SpaceString (fn s => mlbPathVars := !mlbPathVars @ readMlbPathMap s)), (Normal, "mlb-path-var", " ' '", "additional MLB path var", SpaceString (fn s => mlbPathVars := !mlbPathVars @ [case parseMlbPathVar s of NONE => Error.bug ("strange mlb path var: " ^ s) | SOME v => v])), (Expert, "native-al-redundant", "{true|false}", "eliminate redundant AL ops", boolRef Native.elimALRedundant), (Expert, "native-copy-prop", " {true|false}", "use copy propagation", boolRef Native.copyProp), (Expert, "native-cutoff", " ", "live transfer cutoff distance", intRef Native.cutoff), (Expert, "native-live-transfer", " {0,...,8}", "use live transfer", intRef Native.liveTransfer), (Expert, "native-live-stack", " {false|true}", "track liveness of stack slots", boolRef Native.liveStack), (Expert, "native-move-hoist", " {true|false}", "use move hoisting", boolRef Native.moveHoist), (Expert, "native-optimize", " ", "level of optimizations", intRef Native.optimize), (Expert, "native-pic", " {false|true}", "generate position-independent code", Bool (fn b => explicitNativePIC := SOME b)), (Expert, "native-split", " ", "split assembly files at ~n lines", Int (fn i => Native.split := SOME i)), (Expert, "native-shuffle", " {true|false}", "shuffle registers at C-calls", Bool (fn b => Native.shuffle := b)), (Expert, "opt-fuel", " ", "optimization 'fuel'", Int (fn n => optFuel := SOME n)), (Expert, "opt-passes", " {default|minimal}", "level of optimizations", SpaceString (fn s => case Control.OptimizationPasses.setAll s of Result.No s => usage (concat ["invalid -opt-passes flag: ", s]) | Result.Yes () => ())), (Normal, "output", " ", "name of output file", SpaceString (fn s => output := SOME s)), (Expert, "polyvariance", " {true|false}", "use polyvariance", Bool (fn b => if b then () else polyvariance := NONE)), (Expert, "polyvariance-hofo", " {true|false}", "duplicate higher-order fns only", Bool (fn hofo => case !polyvariance of SOME {product, rounds, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-product", " ", "set polyvariance threshold (300)", Int (fn product => case !polyvariance of SOME {hofo, rounds, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-rounds", " ", "set polyvariance rounds (2)", Int (fn rounds => case !polyvariance of SOME {hofo, product, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-small", " ", "set polyvariance threshold (30)", Int (fn small => case !polyvariance of SOME {hofo, product, rounds, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "pi-style", " {default|npi|pic|pie}", "position-independent style", SpaceString (fn s => (case (s, PositionIndependentStyle.fromString s) of ("default", NONE) => positionIndependentStyle := NONE | (_, SOME pis) => positionIndependentStyle := SOME pis | _ => usage (concat ["invalid -pi-style flag: ", s])))), (Expert, "prefer-abs-paths", " {false|true}", "prefer absolute paths when referring to files", boolRef preferAbsPaths), (Expert, "prof-pass", " ", "keep profile info for pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (profPasses, re) end | NONE => usage (concat ["invalid -diag-pass flag: ", s])))), (Normal, "profile", " {no|alloc|count|time}", "produce executable suitable for profiling", SpaceString (fn s => if !profileSet then usage "can't have multiple -profile switches" else (profileSet := true ; profile := (case s of "no" => ProfileNone | "alloc" => ProfileAlloc | "call" => ProfileCallStack | "count" => ProfileCount | "drop" => ProfileDrop | "label" => ProfileLabel | "time" => (profileTimeSet := true ; ProfileTimeLabel) | "time-field" => ProfileTimeField | "time-label" => ProfileTimeLabel | _ => usage (concat ["invalid -profile arg: ", s]))))), (Expert, "profile-block", " {false|true}", "profile IL blocks in addition to IL functions", boolRef profileBlock), (Normal, "profile-branch", " {false|true}", "profile branches in addition to functions", boolRef profileBranch), (Expert, "profile-c", " ", "include C-calls in files matching in profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileC, re) end | NONE => usage (concat ["invalid -profile-c flag: ", s])))), (Expert, "profile-exclude", " ", "exclude files matching from profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileInclExcl, (re, false)) end | NONE => usage (concat ["invalid -profile-exclude flag: ", s])))), (Expert, "profile-il", " {source}", "where to insert profile exps", SpaceString (fn s => case s of "source" => profileIL := ProfileSource | "ssa" => profileIL := ProfileSSA | "ssa2" => profileIL := ProfileSSA2 | _ => usage (concat ["invalid -profile-il arg: ", s]))), (Expert, "profile-include", " ", "include files matching from profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileInclExcl, (re, true)) end | NONE => usage (concat ["invalid -profile-include flag: ", s])))), (Expert, "profile-raise", " {false|true}", "profile raises in addition to functions", boolRef profileRaise), (Normal, "profile-stack", " {false|true}", "profile the stack", boolRef profileStack), (Normal, "profile-val", " {false|true}", "profile val bindings in addition to functions", boolRef profileVal), (Normal, "runtime", " ", "pass arg to runtime via @MLton", SpaceString (fn s => List.push (runtimeArgs, s))), (Expert, "seed-rand", " ", "seed the pseudo-random number generator", Word Random.srand), (Expert, "show", " {anns|path-map}", "print specified data and stop", SpaceString (fn s => show := SOME (case s of "anns" => Show.Anns | "path-map" => Show.PathMap | _ => usage (concat ["invalid -show arg: ", s])))), (Normal, "show-basis", " ", "write final basis environment", SpaceString (fn s => showBasis := SOME s)), (Expert, "show-basis-compact", " {false|true}", "show basis environment in compact form", boolRef showBasisCompact), (Expert, "show-basis-def", " {true|false}", "show basis environment with definition source position", boolRef showBasisDef), (Expert, "show-basis-flat", " {true|false}", "show basis environment with long identifier names", boolRef showBasisFlat), (Normal, "show-def-use", " ", "write def-use information", SpaceString (fn s => showDefUse := SOME s)), (Expert, "show-types", " {true|false}", "show types in ILs", boolRef showTypes), (Expert, "split-types-bool", " {smart|always|never}", "bool type splitting method", SpaceString (fn s => splitTypesBool := (case s of "always" => Always | "never" => Never | "smart" => Smart | _ => usage (concat ["invalid -split-types-bool flag: ", s])))), (Expert, "ssa-passes", " ", "ssa optimization passes", SpaceString (fn s => case Control.OptimizationPasses.set {il = "ssa", passes = s} of Result.Yes () => () | Result.No s => usage (concat ["invalid -ssa-passes arg: ", s]))), (Expert, "ssa2-passes", " ", "ssa2 optimization passes", SpaceString (fn s => case Control.OptimizationPasses.set {il = "ssa2", passes = s} of Result.Yes () => () | Result.No s => usage (concat ["invalid -ssa2-passes arg: ", s]))), (Normal, "stop", " {f|g|o|tc}", "when to stop", SpaceString (fn s => stop := (case s of "f" => Place.Files | "g" => Place.Generated | "o" => Place.O | "tc" => Place.TypeCheck | _ => usage (concat ["invalid -stop arg: ", s])))), (Expert, "stop-pass", " ", "stop compilation after pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (stopPasses, re) end | NONE => usage (concat ["invalid -stop-pass flag: ", s])))), (Expert, "sxml-passes", " ", "sxml optimization passes", SpaceString (fn s => case Control.OptimizationPasses.set {il = "sxml", passes = s} of Result.Yes () => () | Result.No s => usage (concat ["invalid -sxml-passes arg: ", s]))), (Normal, "target", concat [" {", (case targetMap () of [] => "" | [x] => #target x | x :: _ => concat [#target x, "|..."]), "}"], "platform that executable will run on", SpaceString (fn t => (target := (if t = "self" then Self else Cross t); setTargetType (t, usage)))), (Normal, "target-as-opt", " ", "target-dependent assembler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (asOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-as-opt-quote", " ", "target-dependent assembler option (quoted)", (SpaceString2 (fn (target, opt) => List.push (asOpts, {opt = opt, pred = OptPred.Target target})))), (Normal, "target-cc-opt", " ", "target-dependent C compiler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (ccOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-cc-opt-quote", " ", "target-dependent C compiler option (quoted)", (SpaceString2 (fn (target, opt) => List.push (ccOpts, {opt = opt, pred = OptPred.Target target})))), (Normal, "target-link-opt", " ", "target-dependent linker option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (linkOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-link-opt-quote", " ", "target-dependent linker option (quoted)", (SpaceString2 (fn (target, opt) => List.push (linkOpts, {opt = opt, pred = OptPred.Target target})))), (Expert, "target-llvm-as-opt", " ", "target-dependent llvm assembler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (llvm_asOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-llvm-as-opt-quote", " ", "target-dependent llvm assembler option (quoted)", SpaceString2 (fn (target, opt) => List.push (llvm_asOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-llvm-llc-opt", " ", "target-dependent llvm compiler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (llvm_llcOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-llvm-llc-opt-quote", " ", "target-dependent llvm compiler option (quoted)", SpaceString2 (fn (target, opt) => List.push (llvm_llcOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-llvm-opt-opt", " ", "target-dependent llvm optimizer option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (llvm_optOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-llvm-opt-opt-quote", " ", "target-dependent llvm optimizer option (quoted)", SpaceString2 (fn (target, opt) => List.push (llvm_optOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, #1 trace, " name1,...", "trace compiler internals", #2 trace), (Expert, "type-check", " {false|true}", "type check ILs", boolRef typeCheck), (Normal, "verbose", " {0|1|2|3}", "how verbose to be", SpaceString (fn s => verbosity := (case s of "0" => Silent | "1" => Top | "2" => Pass | "3" => Detail | _ => usage (concat ["invalid -verbose arg: ", s])))), (Expert, "warn-ann", " {true|false}", "unrecognized annotation warnings", boolRef warnAnn), (Expert, "warn-deprecated", " {true|false}", "deprecated feature warnings", boolRef warnDeprecated), (Expert, "xml-passes", " ", "xml optimization passes", SpaceString (fn s => case Control.OptimizationPasses.set {il = "xml", passes = s} of Result.Yes () => () | Result.No s => usage (concat ["invalid -xml-passes arg: ", s]))), (Expert, "zone-cut-depth", " ", "zone cut depth", intRef zoneCutDepth) ], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlton [option ...] file.{c|mlb|o|sml} [file.{c|o|s|S} ...]" val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => !expert} val usage = fn s => (usage s; raise Fail "unreachable") fun commandLine (args: string list): unit = let open Control datatype z = datatype MLton.Platform.Arch.t datatype z = datatype MLton.Platform.OS.t val args = case args of lib :: args => (libDir := OS.Path.mkCanonical lib ; args) | _ => Error.bug "incorrect args from shell script" val () = setTargetType ("self", usage) val result = parse args val target = !target val targetStr = case target of Cross s => s | Self => "self" val targetsDir = OS.Path.mkAbsolute {path = "targets", relativeTo = !libDir} val targetDir = OS.Path.mkAbsolute {path = targetStr, relativeTo = targetsDir} val () = Control.libTargetDir := targetDir val targetIncDir = OS.Path.mkAbsolute {path = "include", relativeTo = targetDir} val targetLibDir = targetDir val targetArch = !Target.arch val targetArchStr = String.toLower (MLton.Platform.Arch.toString targetArch) val targetOS = !Target.os val targetOSStr = String.toLower (MLton.Platform.OS.toString targetOS) val targetArchOSStr = concat [targetArchStr, "-", targetOSStr] val pisTargetDefault = let fun get s = Control.StrMap.lookupIntInf (Promise.force Control.Target.consts, "default::" ^ s) in if get "pie" > 0 then Control.PositionIndependentStyle.PIE else if get "pic" > 0 then Control.PositionIndependentStyle.PIC else Control.PositionIndependentStyle.NPI end val pisFormat = case (targetOS, targetArch, !format) of (MinGW, _, _) => NONE | (Cygwin, _, _) => NONE | (_, _, Executable) => NONE | (_, _, Archive) => NONE | (_, _, Library) => SOME Control.PositionIndependentStyle.PIC | (_, _, LibArchive) => SOME Control.PositionIndependentStyle.PIC val () = positionIndependentStyle := (case (!positionIndependentStyle, pisFormat) of (SOME pis, _) => SOME pis | (NONE, NONE) => NONE | (NONE, SOME pisFormat) => SOME pisFormat) val positionIndependentStyle = !positionIndependentStyle val () = Native.pic := (case !explicitNativePIC of NONE => let val pis = case positionIndependentStyle of NONE => pisTargetDefault | SOME pis => pis in case pis of Control.PositionIndependentStyle.NPI => false | Control.PositionIndependentStyle.PIC => true | Control.PositionIndependentStyle.PIE => true end | SOME b => b) val stop = !stop val () = align := (case !explicitAlign of NONE => if defaultAlignIs8 () then Align8 else Align4 | SOME a => a) val () = codegen := (case !explicitCodegen of NONE => if hasCodegen (AMD64Codegen, {default = true}) then AMD64Codegen else if hasCodegen (X86Codegen, {default = true}) then X86Codegen else CCodegen | SOME Native => if hasCodegen (AMD64Codegen, {default = false}) then AMD64Codegen else if hasCodegen (X86Codegen, {default = false}) then X86Codegen else usage (concat ["can't use native codegen on ", MLton.Platform.Arch.toString targetArch, " target"]) | SOME (Explicit cg) => cg) val () = MLton.Rusage.measureGC (!verbosity <> Silent) val () = if !profileTimeSet then (case !codegen of X86Codegen => profile := ProfileTimeLabel | AMD64Codegen => profile := ProfileTimeLabel | _ => profile := ProfileTimeField) else () val () = if !exnHistory then (case !profile of ProfileNone => profile := ProfileCallStack | ProfileCallStack => () | _ => usage "can't use -profile with Exn.keepHistory" ; profileRaise := true) else () val () = if !profileStack then (case !profile of ProfileAlloc => () | ProfileCount => () | ProfileTimeField => () | ProfileTimeLabel => () | _ => usage "can't use '-profile-stack true' without '-profile {alloc,count,time}'") else () val () = Control.setCommandLineConst {name = "CallStack.keep", value = Bool.toString (!Control.profile = Control.ProfileCallStack)} fun tokenize l = String.tokens (concat (List.separate (l, " ")), Char.isSpace) (* When cross-compiling, use the named cross compiler. * Older gcc versions used -b for multiple targets. * If this is still needed, a shell script wrapper can hide this. *) val cc = case target of Cross s => let val {dir = ccDir, file = ccFile} = OS.Path.splitDirFile (hd (!cc)) in OS.Path.joinDirFile {dir = ccDir, file = s ^ "-" ^ ccFile} :: tl (!cc) end | Self => !cc val arScript = !arScript local fun addMD s = if !debugRuntime then s ^ "-dbg" else s fun addPI s = s ^ (Control.PositionIndependentStyle.toSuffix positionIndependentStyle) in val mkLibName = addPI o addMD end fun addTargetOpts opts = List.fold (!opts, [], fn ({opt, pred}, ac) => if (case pred of OptPred.Target s => let val s = String.toLower s in s = targetArchOSStr orelse s = targetArchStr orelse s = targetOSStr end | OptPred.Yes => true) then opt :: ac else ac) val asOpts = addTargetOpts asOpts val ccOpts = addTargetOpts ccOpts val linkOpts = addTargetOpts linkOpts val linkOpts = List.map (["mlton", "gdtoa"], fn lib => "-l" ^ mkLibName lib) @ [!mathLinkOpt, !gmpLinkOpt] @ linkOpts val linkOpts = ("-L" ^ targetLibDir) :: linkOpts val linkArchives = List.map (["mlton", "gdtoa"], fn lib => OS.Path.joinDirFile {dir = targetLibDir, file = "lib" ^ mkLibName lib ^ ".a"}) val llvm_as = !llvm_as val llvm_llc = !llvm_llc val llvm_opt = !llvm_opt val llvm_asOpts = addTargetOpts llvm_asOpts val llvm_llcOpts = addTargetOpts llvm_llcOpts val llvm_optOpts = addTargetOpts llvm_optOpts val _ = if not (hasCodegen (!codegen, {default = false})) then usage (concat ["can't use ", Control.Codegen.toString (!codegen), " codegen on ", MLton.Platform.Arch.toString targetArch, " target"]) else () val () = Control.labelsHaveExtra_ := (case (targetOS, targetArch) of (Cygwin, X86) => true | (Darwin, _) => true | (MinGW, X86) => true | _ => false) val _ = chunkify := (case !explicitChunkify of NONE => (case !codegen of AMD64Codegen => Chunkify.Func | CCodegen => Chunkify.Coalesce {limit = 4096} | LLVMCodegen => Chunkify.Coalesce {limit = 4096} | X86Codegen => Chunkify.Func ) | SOME c => c) val _ = if not (!Control.codegen = X86Codegen) andalso !Native.IEEEFP then usage "must use x86 codegen with -ieee-fp true" else () val _ = if !keepDot andalso List.isEmpty (!keepPasses) then keepSSA := true else () val () = keepDefUse := (isSome (!showDefUse) orelse (Control.Elaborate.enabled Control.Elaborate.warnUnused) orelse (Control.Elaborate.default Control.Elaborate.warnUnused)) val _ = case targetOS of Darwin => () | FreeBSD => () | HPUX => () | Linux => () | MinGW => () | NetBSD => () | OpenBSD => () | Solaris => () | _ => if !profile = ProfileTimeField orelse !profile = ProfileTimeLabel then usage (concat ["can't use -profile time on ", MLton.Platform.OS.toString targetOS]) else () val () = case !show of NONE => () | SOME info => (case info of Show.Anns => Layout.outputl (Control.Elaborate.document {expert = !expert}, Out.standard) | Show.PathMap => let open Layout in outputl (align (List.revMap (Control.mlbPathMap (), fn {var, path, ...} => str (concat [var, " ", path]))), Out.standard) end ; let open OS.Process in exit success end) in case result of Result.No msg => usage msg | Result.Yes [] => (inputFile := "" ; Out.outputl (Out.standard, Version.banner) ; if Verbosity.< (!verbosity, Detail) then () else Layout.outputl (Control.layout (), Out.standard)) | Result.Yes (input :: rest) => let val _ = inputFile := File.base (File.fileOf input) val (start, base) = let val rec loop = fn [] => usage (concat ["invalid file suffix on ", input]) | (suf, start, hasNum) :: sufs => if String.hasSuffix (input, {suffix = suf}) then (start, let val f = File.base input in if hasNum then File.base f else f end) else loop sufs datatype z = datatype Place.t in loop [(".mlb", MLB, false), (".sml", SML, false), (".xml", XML, false), (".sxml", SXML, false), (".ssa", SSA, false), (".ssa2", SSA2, false), (".c", Generated, true), (".o", O, true)] end val _ = List.foreach (rest, fn f => if List.exists ([".c", ".o", ".s", ".S"], fn suffix => String.hasSuffix (f, {suffix = suffix})) then File.withIn (f, fn _ => ()) else usage (concat ["invalid file suffix: ", f])) val csoFiles = rest in case Place.compare (start, stop) of GREATER => usage (concat ["cannot go from ", Place.toString start, " to ", Place.toString stop]) | EQUAL => usage "nothing to do" | LESS => let val tempFiles: File.t list ref = ref [] val tmpDir = let val (tmpVar, default) = case MLton.Platform.OS.host of MinGW => ("TEMP", "C:/WINDOWS/TEMP") | _ => ("TMPDIR", "/tmp") in case Process.getEnv tmpVar of NONE => default | SOME d => d end fun temp (suf: string): File.t = let val (f, out) = File.temp {prefix = OS.Path.concat (tmpDir, "file"), suffix = suf} val _ = Out.close out val _ = List.push (tempFiles, f) in f end fun suffix s = concat [base, s] fun maybeOut suf = case !output of NONE => suffix suf | SOME f => f fun maybeOutBase suf = case !output of NONE => suffix suf | SOME f => if File.extension f = SOME "exe" then concat [File.base f, suf] else concat [f, suf] val {base = outputBase, ...} = OS.Path.splitBaseExt (maybeOut ".ext") val {file = defLibname, ...} = OS.Path.splitDirFile outputBase val defLibname = if String.hasPrefix (defLibname, {prefix = "lib"}) then String.extract (defLibname, 3, NONE) else defLibname fun toAlNum c = if Char.isAlphaNum c then c else #"_" val () = if !libname <> "" then () else libname := CharVector.map toAlNum defLibname (* Library output includes a header by default *) val () = case (!format, !exportHeader) of (Executable, _) => () | (_, NONE) => exportHeader := SOME (!libname ^ ".h") | _ => () val _ = atMLtons := Vector.fromList (tokenize (rev ("--" :: (!runtimeArgs)))) fun compileO (inputs: File.t list): unit = let val output = case (!format, targetOS) of (Archive, _) => maybeOut ".a" | (Executable, _) => maybeOut "" | (LibArchive, _) => maybeOut ".a" | (Library, Darwin) => maybeOut ".dylib" | (Library, Cygwin) => !libname ^ ".dll" | (Library, MinGW) => !libname ^ ".dll" | (Library, _) => maybeOut ".so" val libOpts = case targetOS of Darwin => [ "-dynamiclib" ] | Cygwin => [ "-shared", "-Wl,--out-implib," ^ maybeOut ".a", "-Wl,--output-def," ^ !libname ^ ".def"] | MinGW => [ "-shared", "-Wl,--out-implib," ^ maybeOut ".a", "-Wl,--output-def," ^ !libname ^ ".def"] | _ => [ "-fPIC", "-shared" ] val _ = trace (Top, "Link") (fn () => if !format = Archive orelse !format = LibArchive then System.system (arScript, List.concat [[targetStr, targetOSStr, output], inputs, linkArchives]) else System.system (hd cc, List.concat [tl cc, case !format of Executable => Control.PositionIndependentStyle.linkOpts positionIndependentStyle | Library => libOpts | _ => [], ["-o", output], inputs, linkOpts])) () (* gcc on Cygwin appends .exe, which I don't want, so * move the output file to it's rightful place. * Notice that we do not use targetOS here, since we * care about the platform we're running on, not the * platform we're generating for. * * We want to keep the .exe as is for MinGW/Win32. *) val _ = if MLton.Platform.OS.host = Cygwin then if String.contains (output, #".") then () else File.move {from = concat [output, ".exe"], to = output} else () in () end fun mkOutputO (c: Counter.t, input: File.t): File.t = if stop = Place.O orelse !keepO then if File.dirOf input = File.dirOf (maybeOutBase ".o") then concat [File.base input, ".o"] else maybeOutBase (concat [".", Int.toString (Counter.next c), ".o"]) else temp ".o" fun mkOutputBC (c: Counter.t, input: File.t, xsuf): File.t = if stop = Place.O orelse !keepO then if File.dirOf input = File.dirOf (maybeOutBase (xsuf ^ ".bc")) then concat [File.base input, xsuf, ".bc"] else maybeOutBase (concat [".", Int.toString (Counter.next c), xsuf, ".bc"]) else temp (xsuf ^ ".bc") fun compileC (c: Counter.t, input: File.t): File.t = let val output = mkOutputO (c, input) val _ = System.system (hd cc, List.concat [tl cc, [ "-c" ], if !debug then [ "-g", "-DASSERT=1" ] else [], if !format = Executable then [] else [ "-DLIBNAME=" ^ !libname ], Control.PositionIndependentStyle.ccOpts positionIndependentStyle, [ "-I" ^ targetIncDir ], ccOpts, ["-o", output], [input]]) in output end fun compileS (c: Counter.t, input: File.t): File.t = let val output = mkOutputO (c, input) val _ = System.system (hd cc, List.concat [tl cc, ["-c"], if !debug then [ "-Wa,-g" ] else [], asOpts, ["-o", output], [input]]) in output end fun compileLL (c: Counter.t, input: File.t): File.t = let val asBC = mkOutputBC (c, input, ".as") val _ = System.system (llvm_as, List.concat [llvm_asOpts, ["-o", asBC], [input]]) val optBC = mkOutputBC (c, input, ".opt") val _ = System.system (llvm_opt, List.concat [llvm_optOpts, ["-o", optBC], [asBC]]) val output = mkOutputO (c, input) val _ = System.system (llvm_llc, List.concat [["-filetype=obj"], Control.PositionIndependentStyle.llvm_llcOpts (positionIndependentStyle, {targetDefault = pisTargetDefault}), llvm_llcOpts, ["-o", output], [optBC]]) in output end fun compileCSO (inputs: File.t list): unit = if List.forall (inputs, fn f => SOME "o" = File.extension f) then compileO inputs else let val c = Counter.new 0 val oFiles = trace (Top, "Compile and Assemble") (fn () => List.fold (inputs, [], fn (input, ac) => let val extension = File.extension input in if SOME "o" = extension then input :: ac else if SOME "c" = extension then (compileC (c, input)) :: ac else if SOME "ll" = extension then (compileLL(c, input)) :: ac else if SOME "s" = extension orelse SOME "S" = extension then (compileS (c, input)) :: ac else Error.bug (concat ["invalid extension: ", Option.toString (fn s => s) extension]) end)) () in case stop of Place.O => () | _ => compileO (rev oFiles) end fun compileSrc sel = let val outputs: File.t list ref = ref [] val r = Counter.generator 0 fun make (style: style, suf: string) () = let val suf = concat [".", Int.toString (r ()), suf] val file = (if !keepGenerated orelse stop = Place.Generated then maybeOutBase else temp) suf val _ = List.push (outputs, file) val out = Out.openOut file fun print s = Out.output (out, s) val _ = outputHeader' (style, out) fun done () = Out.close out in {file = file, print = print, done = done} end val _ = Control.message (Verbosity.Detail, Control.layout) val {sourceFiles, frontend, compile} = (sel o Compile.mkCompile) {outputC = make (Control.C, ".c"), outputLL = make (Control.LLVM, ".ll"), outputS = make (Control.Assembly, ".s")} val _ = case stop of Place.Files => Vector.foreach (sourceFiles input, fn f => (print (String.translate (f, fn #"\\" => "/" | c => str c)) ; print "\n")) | Place.TypeCheck => frontend input | _ => compile input in case stop of Place.Files => () | Place.TypeCheck => () | Place.Generated => () | _ => (* Shrink the heap before calling C compiler. *) (MLton.GC.pack () ; compileCSO (List.concat [!outputs, csoFiles])) end fun compile () = case start of Place.SML => compileSrc #sml | Place.MLB => compileSrc #mlb | Place.Generated => compileCSO (input :: csoFiles) | Place.O => compileCSO (input :: csoFiles) | Place.XML => compileSrc #xml | Place.SXML => compileSrc #xml | Place.SSA => compileSrc #ssa | Place.SSA2 => compileSrc #ssa2 | _ => Error.bug "invalid start" val doit = traceTop Version.banner (fn () => Exn.finally (compile, fn () => List.foreach (!tempFiles, File.remove))) in doit () end end end val commandLine = Process.makeCommandLine commandLine val main = fn (_, args) => commandLine args val mainWrapped = fn () => OS.Process.exit (commandLine (CommandLine.arguments ())) end mlton-20210117+dfsg/mlton/main/main.sig000066400000000000000000000007401416264345000175340ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MAIN_STRUCTS = sig end signature MAIN = sig include MAIN_STRUCTS val main: string * string list -> OS.Process.status val mainWrapped: unit -> 'a end mlton-20210117+dfsg/mlton/main/main.sml000066400000000000000000000004721416264345000175470ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main = Main () mlton-20210117+dfsg/mlton/main/sources.cm000066400000000000000000000012421416264345000201060ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library structure Main is ../../lib/mlton/sources.cm ../ast/sources.cm ../atoms/sources.cm ../backend/sources.cm ../closure-convert/sources.cm ../codegen/sources.cm ../control/sources.cm ../core-ml/sources.cm ../defunctorize/sources.cm ../elaborate/sources.cm ../front-end/sources.cm ../ssa/sources.cm ../xml/sources.cm compile.sig compile.fun main.sig main.fun main.sml mlton-20210117+dfsg/mlton/main/sources.mlb000066400000000000000000000013471416264345000202670ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../atoms/sources.mlb ../backend/sources.mlb ../closure-convert/sources.mlb ../codegen/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb ../defunctorize/sources.mlb ../elaborate/sources.mlb ../front-end/sources.mlb ../ssa/sources.mlb ../xml/sources.mlb compile.sig compile.fun main.sig main.fun main.sml in structure Main end mlton-20210117+dfsg/mlton/match-compile/000077500000000000000000000000001416264345000177015ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/match-compile/match-compile.fun000066400000000000000000001452251416264345000231460ustar00rootroot00000000000000(* Copyright (C) 2015,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor MatchCompile (S: MATCH_COMPILE_STRUCTS): MATCH_COMPILE = struct open S structure ExpPat = Pat structure Example = struct datatype t = ConApp of {arg: t option, con: Con.t} | ConstRange of {lo: Const.t option, hi: Const.t option, isChar: bool, isInt: bool} | Exn | Or of t vector | Record of t SortedRecord.t | Vector of t vector * {dots: bool} | Wild fun layout (ex, isDelimited) = let open Layout fun delimit t = if isDelimited then t else paren t fun layoutChar c = let fun loop (n: int, c: IntInf.t, ac: char list) = if n = 0 then implode ac else let val (q, r) = IntInf.quotRem (c, 0x10) in loop (n - 1, q, Char.fromHexDigit (Int.fromIntInf r) :: ac) end fun doit (n, esc) = str (concat ["\\", esc, loop (n, c, [])]) in if c <= 0xFF then str (Char.escapeSML (Char.fromInt (Int.fromIntInf c))) else if c <= 0xFFFF then doit (4, "u") else doit (8, "U") end fun layoutConst (c, isChar, isInt) = if isChar then case c of Const.Word w => seq [str "#\"", layoutChar (WordX.toIntInf w), str "\""] | _ => Error.bug (concat ["MatchCompile.Example.layout.layoutConst: ", "strange char: ", Layout.toString (Const.layout c)]) else if isInt then case c of Const.IntInf i => IntInf.layout i | Const.Word w => IntInf.layout (WordX.toIntInfX w) | _ => Error.bug (concat ["MatchCompile.Example.layout.layoutConst: ", "strange int: ", Layout.toString (Const.layout c)]) else case c of Const.Word w => seq [str "0wx", str (IntInf.format (WordX.toIntInf w, StringCvt.HEX))] | Const.WordVector ws => seq [str "\"", seq (WordXVector.toListMap (ws, layoutChar o WordX.toIntInf)), str "\""] | _ => Error.bug (concat ["MatchCompile.Example.layout.layoutConst: ", "strange const: ", Layout.toString (Const.layout c)]) in case ex of ConApp {arg, con} => (case arg of NONE => str (Con.originalName con) | SOME arg => (delimit o seq) [str (Con.originalName con), str " ", layoutF arg]) | ConstRange {lo, hi, isChar, isInt} => (case (lo, hi) of (NONE, NONE) => str "..." | (NONE, SOME hi) => delimit (seq [str "... ", layoutConst (hi, isChar, isInt)]) | (SOME lo, NONE) => delimit (seq [layoutConst (lo, isChar, isInt), str " ..."]) | (SOME lo, SOME hi) => if Const.equals (lo, hi) then layoutConst (lo, isChar, isInt) else delimit (seq [layoutConst (lo, isChar, isInt), str " .. ", layoutConst (hi, isChar, isInt)])) | Exn => delimit (str "_ : exn") | Or exs => (delimit o mayAlign o separateLeft) (Vector.toListMap (exs, layoutT), "| ") | Record rexs => SortedRecord.layout {extra = "", layoutElt = layoutT, layoutTuple = fn exs => tuple (Vector.toListMap (exs, layoutT)), record = rexs, separator = " = "} | Vector (exs, {dots}) => let val exs = Vector.map (exs, layoutT) in vector (if dots then Vector.concat [exs, Vector.new1 (str "...")] else exs) end | Wild => str "_" end and layoutF ex = layout (ex, false) and layoutT ex = layout (ex, true) val layout = layoutT fun isWild ex = case ex of Wild => true | _ => false fun const {const, isChar, isInt} = ConstRange {lo = SOME const, hi = SOME const, isChar = isChar, isInt = isInt} fun constRange {lo, hi, isChar, isInt} = ConstRange {lo = lo, hi = hi, isChar = isChar, isInt = isInt} fun record rexs = if SortedRecord.forall (rexs, isWild) then Wild else Record rexs fun vector exs = Vector (exs, {dots = false}) fun vectorDots exs = Vector (exs, {dots = true}) fun compare (ex1, ex2) = case (ex1, ex2) of (* Wild sorts last *) (Wild, Wild) => EQUAL | (_, Wild) => LESS | (Wild, _) => GREATER (* Exn sorts last *) | (Exn, Exn) => EQUAL | (_, Exn) => LESS | (Exn, _) => GREATER | (ConstRange {lo = lo1, hi = hi1, isInt, ...}, ConstRange {lo = lo2, hi = hi2, ...}) => let fun cmp (x, y, b, k) = case (x, y) of (NONE, NONE) => k EQUAL | (NONE, SOME _) => if b then LESS else GREATER | (SOME _, NONE) => if b then GREATER else LESS | (SOME (Const.Word w1), SOME (Const.Word w2)) => k (WordX.compare (w1, w2, {signed = isInt})) | (SOME (Const.IntInf ii1), SOME (Const.IntInf ii2)) => k (IntInf.compare (ii1, ii2)) | (SOME (Const.WordVector ws1), SOME (Const.WordVector ws2)) => k (WordXVector.compare (ws1, ws2)) | _ => Error.bug "MatchCompile.Example.compare: ConstRange/ConstRange" in cmp (lo1, lo2, true, fn order => case order of LESS => LESS | EQUAL => cmp (hi1, hi2, false, fn order => order) | GREATER => GREATER) end | (ConApp {con = con1, arg = arg1}, ConApp {con = con2, arg = arg2}) => (case String.compare (Con.toString con1, Con.toString con2) of LESS => LESS | EQUAL => (case (arg1, arg2) of (SOME arg1, SOME arg2) => compare' (arg1, arg2) | (NONE, NONE) => EQUAL | _ => Error.bug "MatchCompile.Example.compare: ConApp/ConApp") | GREATER => GREATER) | (Vector (exs1, {dots = dots1}), Vector (exs2, {dots = dots2})) => (case (dots1, dots2) of (false, true) => LESS | (true, false) => GREATER | _ => Vector.compare (exs1, exs2, compare')) | (Record rexs1, Record rexs2) => Vector.compare (SortedRecord.range rexs1, SortedRecord.range rexs2, compare') | _ => Error.bug "MatchCompile.Example.compare" and compare' (ex1, ex2) = case (ex1, ex2) of (Or ex1s, Or ex2s) => compares (Vector.toList ex1s, Vector.toList ex2s) | (Or ex1s, _) => compares (Vector.toList ex1s, [ex2]) | (_, Or ex2s) => compares ([ex1], Vector.toList ex2s) | _ => compare (ex1, ex2) and compares (exs1, exs2) = List.compare (exs1, exs2, compare) fun or exs = let fun join (exs1, exs2) = case (exs1, exs2) of ([], _) => exs2 | (_, []) => exs1 | ((ex1 as ConApp {con = con1, arg = arg1})::exs1', (ex2 as ConApp {con = con2, arg = arg2})::exs2') => (case String.compare (Con.toString con1, Con.toString con2) of LESS => ex1::(join (exs1', exs2)) | EQUAL => let val arg = case (arg1, arg2) of (SOME arg1, SOME arg2) => or [arg1, arg2] | (NONE, NONE) => NONE | _ => Error.bug "MatchCompile.Example.or.join" in (ConApp {con = con1, arg = arg}):: (join (exs1', exs2')) end | GREATER => ex2::(join (exs1, exs2'))) | (ex1::exs1', ex2::exs2') => (case compare (ex1, ex2) of LESS => ex1::(join (exs1', exs2)) | EQUAL => ex1::(join (exs1', exs2')) | GREATER => ex2::(join (exs1, exs2'))) val exss = List.map (exs, fn Or exs => Vector.toList exs | ex => [ex]) val exs = List.fold (exss, [], join) in case exs of [] => NONE | [ex] => SOME ex | _ => SOME (Or (Vector.fromList exs)) end end structure Env = MonoEnv (structure Domain = Var structure Range = Var) structure Fact = struct datatype t = Con of {arg: Var.t option, con: Con.t} | Record of Var.t SortedRecord.t | Vector of Var.t vector fun layout (f: t): Layout.t = let open Layout in case f of Con {arg, con} => seq [Con.layout con, case arg of NONE => empty | SOME x => seq [str " ", Var.layout x]] | Record r => SortedRecord.layout {extra = "", layoutElt = Var.layout, layoutTuple = fn xs => tuple (Vector.toListMap (xs, Var.layout)), record = r, separator = " = "} | Vector xs => vector (Vector.map (xs, Var.layout)) end end structure Examples = struct datatype t = T of {exs: (Var.t * Example.t) list, isOnlyExns: bool} fun layout (T {exs, ...}) = List.layout (Layout.tuple2 (Var.layout, Example.layout)) exs val empty = T {exs = [], isOnlyExns = true} fun add (T {exs, isOnlyExns = is}, x, ex, {isOnlyExns: bool}) = T {exs = (x, ex) :: exs, isOnlyExns = is andalso isOnlyExns} end structure Facts = struct datatype t = T of {fact: Fact.t, var: Var.t} list fun layout (T fs) = let open Layout in List.layout (fn {fact, var} => seq [Var.layout var, str " = ", Fact.layout fact]) fs end val empty: t = T [] fun add (T fs, x, f) = T ({fact = f, var = x} :: fs) fun bind (T facts, x: Var.t, p: NestedPat.t): Env.t = let val {destroy, get = fact: Var.t -> Fact.t, set = setFact, ...} = Property.destGetSetOnce (Var.plist, Property.initRaise ("fact", Var.layout)) val () = List.foreach (facts, fn {fact, var} => setFact (var, fact)) fun loop (p: NestedPat.t, x: Var.t, env: Env.t): Env.t = let datatype z = datatype NestedPat.node in case NestedPat.node p of Con {arg, ...} => (case arg of NONE => env | SOME p => (case fact x of Fact.Con {arg = SOME x, ...} => loop (p, x, env) | _ => Error.bug "MatchCompile.Facts.bind: Con:wrong fact")) | Const _ => env | Layered (y, p) => loop (p, x, Env.extend (env, y, x)) | Or _ => Error.bug "MatchCompile.factbind: or pattern shouldn't be here" | Record rp => (case fact x of Fact.Record rx => Vector.fold2 (SortedRecord.range rp, SortedRecord.range rx, env, loop) | _ => Error.bug "MatchCompile.Facts.bind: Record:wrong fact") | Var y => Env.extend (env, y, x) | Vector ps => (case fact x of Fact.Vector xs => Vector.fold2 (ps, xs, env, loop) | _ => Error.bug "MatchCompile.Facts.bind: Vector:wrong fact") | Wild => env end val env = loop (p, x, Env.empty) val () = destroy () in env end val bind = Trace.trace3 ("MatchCompile.Facts.bind", layout, Var.layout, NestedPat.layout, Env.layout) bind fun example (T facts, Examples.T {exs, ...}, x: Var.t): Example.t = let val {destroy, get = fact: Var.t -> Fact.t option, set = setFact, ...} = Property.destGetSetOnce (Var.plist, Property.initConst NONE) val () = List.foreach (facts, fn {fact, var} => setFact (var, SOME fact)) fun loop (x: Var.t): Example.t = case fact x of NONE => (case List.peek (exs, fn (x', _) => Var.equals (x, x')) of NONE => Example.Wild | SOME (_, ex) => ex) | SOME f => (case f of Fact.Con {arg, con} => Example.ConApp {con = con, arg = Option.map (arg, loop)} | Fact.Record rxs => Example.record (SortedRecord.map (rxs, loop)) | Fact.Vector xs => Example.vector (Vector.map (xs, loop))) val res = loop x val () = destroy () in res end val example = Trace.trace3 ("MatchCompile.Facts.example", layout, Examples.layout, Var.layout, Example.layout) example end structure Pat = struct datatype t = Const of {const: Const.t, isChar: bool, isInt: bool} | Con of {arg: (t * Type.t) option, con: Con.t, targs: Type.t vector} | Record of t SortedRecord.t | Vector of t vector | Wild fun layout (p: t): Layout.t = let open Layout in case p of Const {const, ...} => Const.layout const | Con {arg, con, ...} => seq [Con.layout con, case arg of NONE => empty | SOME (p, _) => seq [str " ", layout p]] | Record rps => SortedRecord.layout {extra = "", layoutElt = layout, layoutTuple = fn ps => tuple (Vector.toListMap (ps, layout)), record = rps, separator = " = "} | Vector ps => vector (Vector.map (ps, layout)) | Wild => str "_" end val isWild: t -> bool = fn Wild => true | _ => false val fromNestedPat: NestedPat.t -> t = let fun loop (p: NestedPat.t): t = case NestedPat.node p of NestedPat.Con {arg, con, targs} => let val arg = Option.map (arg, fn p => (loop p, NestedPat.ty p)) in Con {arg = arg, con = con, targs = targs} end | NestedPat.Const r => Const r | NestedPat.Layered (_, p) => loop p | NestedPat.Or _ => Error.bug "MatchCompile.fromNestedPat: or pattern shouldn't be here" | NestedPat.Record rps => Record (SortedRecord.map (rps, loop)) | NestedPat.Var _ => Wild | NestedPat.Vector ps => Vector (Vector.map (ps, loop)) | NestedPat.Wild => Wild in loop end end structure Vector = struct open Vector fun dropNth (v: 'a t, n: int): 'a t = keepAllMapi (v, fn (i, a) => if i = n then NONE else SOME a) end structure Rule = struct datatype t = T of {pats: Pat.t vector, rest: {examples: (Example.t * {isOnlyExns: bool}) list ref option, finish: (Var.t -> Var.t) -> Exp.t, nestedPat: NestedPat.t}} fun layout (T {pats, ...}) = Layout.tuple (Vector.toListMap (pats, Pat.layout)) fun allWild (T {pats, ...}) = Vector.forall (pats, Pat.isWild) fun dropNth (T {pats, rest}, n) = T {pats = Vector.dropNth (pats, n), rest = rest} end structure Rules = struct type t = Rule.t vector fun layout (rs: t) = Layout.align (Vector.toListMap (rs, Rule.layout)) fun dropNth (rs: t, n: int): t = Vector.map (rs, fn r => Rule.dropNth (r, n)) end structure Vars = struct type t = (Var.t * Type.t) vector val layout = Vector.layout (Layout.tuple2 (Var.layout, Type.layout)) end val directCases = List.keepAllMap (WordSize.all, fn s => if WordSize.equals (s, WordSize.fromBits (Bits.fromInt 64)) then NONE else SOME {size = s, ty = Type.word s}) fun unhandledConsts {consts = cs: Const.t vector, isChar, isInt}: Example.t option = let fun search {<= : 'a * 'a -> bool, equals: 'a * 'a -> bool, extract: Const.t -> 'a, make: 'a -> Const.t, max: 'a option, min: 'a option, next: 'a -> 'a, prev: 'a -> 'a} = let fun exampleConstRange (lo, hi) = Example.constRange {lo = Option.map (lo, make), hi = Option.map (hi, make), isChar = isChar, isInt = isInt} fun mkExampleConstRange (lo, hi) = if lo <= hi then if equals (lo, hi) then [exampleConstRange (SOME lo, SOME hi)] else let val lo' = next lo val hi' = prev hi in if equals (lo', hi) then [exampleConstRange (SOME lo, SOME lo), exampleConstRange (SOME hi, SOME hi)] else if equals (lo', hi') then [exampleConstRange (SOME lo, SOME lo), exampleConstRange (SOME lo', SOME hi'), exampleConstRange (SOME hi, SOME hi)] else [exampleConstRange (SOME lo, SOME hi)] end else [] val cs = QuickSort.sortVector (Vector.map (cs, extract), op <=) val cs = Vector.toList cs fun loop cs = case cs of [] => [] | [cMax] => (case max of NONE => [exampleConstRange (SOME (next cMax), NONE)] | SOME max' => if equals (cMax, max') then [] else mkExampleConstRange (next cMax, max')) | c1::c2::cs => (mkExampleConstRange (next c1, prev c2)) @ (loop (c2::cs)) val cMin = hd cs val examples = case min of NONE => [exampleConstRange (NONE, SOME (prev cMin))] @ (loop cs) | SOME min' => if equals (cMin, min') then loop cs else (mkExampleConstRange (min', prev cMin)) @ (loop cs) in Example.or examples end datatype z = datatype Const.t in case Vector.first cs of CSymbol _ => Error.bug "MatchCompile.unhandledConsts: CSymbol" | IntInf _ => let fun extract c = case c of IntInf i => i | _ => Error.bug "MatchCompile.unhandledConsts: expected IntInf" in search {<= = op <=, equals = op =, extract = extract, make = Const.IntInf, max = NONE, min = NONE, next = fn i => i + 1, prev = fn i => i - 1} end | Null => Error.bug "MatchCompile.unhandledConsts: Null" | Real _ => Error.bug "MatchCompile.unhandledConsts: Real" | Word w => let val s = WordX.size w val signed = {signed = isInt} fun extract c = case c of Word w => w | _ => Error.bug "MatchCompile.unhandledConsts: expected Word" in search {<= = fn (w1, w2) => WordX.le (w1, w2, signed), equals = WordX.equals, extract = extract, make = Const.word, max = SOME (WordX.max (s, signed)), min = SOME (WordX.min (s, signed)), next = fn w => WordX.add (w, WordX.one s), prev = fn w => WordX.sub (w, WordX.one s)} end | WordVector ws => let val s = WordXVector.elementSize ws val signed = {signed = false} fun extract c = case c of WordVector ws => ws | _ => Error.bug "MatchCompile.unhandledConsts: expected Word" fun next ws = let val wsOrig = List.rev (WordXVector.toListMap (ws, fn w => w)) val wsNext = let fun loop ws = case ws of [] => [WordX.min (s, signed)] | w::ws => if WordX.isMax (w, signed) then (WordX.min (s, signed))::(loop ws) else (WordX.add (w, WordX.one s))::ws in loop wsOrig end in WordXVector.fromListRev ({elementSize = s}, wsNext) end fun prev ws = let val wsOrig = List.rev (WordXVector.toListMap (ws, fn w => w)) val wsPrev = let fun loop ws = case ws of [] => Error.bug "MatchCompile.unhandledConst: WordXVector.prev" | [w] => if WordX.isMin (w, signed) then [] else [WordX.sub (w, WordX.one s)] | w::ws => if WordX.isMin (w, signed) then (WordX.max (s, signed))::(loop ws) else (WordX.sub (w, WordX.one s))::ws in loop wsOrig end in WordXVector.fromListRev ({elementSize = s}, wsPrev) end in search {<= = WordXVector.le, equals = WordXVector.equals, extract = extract, make = Const.wordVector, max = NONE, min = SOME (WordXVector.fromVector ({elementSize = s}, Vector.new0 ())), next = next, prev = prev} end end structure Exp = struct open Exp fun layout (_: t) = Layout.str "" end val traceMatch = Trace.trace ("MatchCompile.match", fn (vars, rules, facts, es) => Layout.record [("vars", Vars.layout vars), ("rules", Rules.layout rules), ("facts", Facts.layout facts), ("examples", Examples.layout es)], Exp.layout) val traceConst = Trace.trace ("MatchCompile.const", fn (vars, rules, facts, es, i: Int.t, test: Exp.t) => Layout.record [("vars", Vars.layout vars), ("rules", Rules.layout rules), ("facts", Facts.layout facts), ("examples", Examples.layout es), ("index", Int.layout i), ("test", Exp.layout test)], Exp.layout) val traceSum = Trace.trace ("MatchCompile.sum", fn (vars, rules, facts, es, i: Int.t, test: Exp.t, _: Tycon.t) => Layout.record [("vars", Vars.layout vars), ("rules", Rules.layout rules), ("facts", Facts.layout facts), ("examples", Examples.layout es), ("index", Int.layout i), ("test", Exp.layout test)], Exp.layout) val traceRecord = Trace.trace ("MatchCompile.record", fn (vars, rules, facts, es, i: Int.t, test: Exp.t, _: Field.t vector) => Layout.record [("vars", Vars.layout vars), ("rules", Rules.layout rules), ("facts", Facts.layout facts), ("examples", Examples.layout es), ("index", Int.layout i), ("test", Exp.layout test)], Exp.layout) val traceVector = Trace.trace ("MatchCompile.vector", fn (vars, rules, facts, es, i: Int.t, test: Exp.t) => Layout.record [("vars", Vars.layout vars), ("rules", Rules.layout rules), ("facts", Facts.layout facts), ("examples", Examples.layout es), ("index", Int.layout i), ("test", Exp.layout test)], Exp.layout) (*---------------------------------------------------*) (* matchCompile *) (*---------------------------------------------------*) fun matchCompile {caseType: Type.t, cases: (NestedPat.t * ((Var.t -> Var.t) -> Exp.t)) vector, conTycon: Con.t -> Tycon.t, test: Var.t, testType: Type.t, tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector} = let fun chooseColumn _ = 0 fun match arg : Exp.t = traceMatch (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es) => if Vector.isEmpty rules then Error.bug "MatchCompile.match: no rules" else if Rule.allWild (Vector.first rules) then (* The first rule matches. *) let val Rule.T {rest = {examples, finish, nestedPat, ...}, ...} = Vector.first rules val env = Facts.bind (facts, test, nestedPat) val Examples.T {isOnlyExns, ...} = es val () = Option.app (examples, fn examples => List.push (examples, (Facts.example (facts, es, test), {isOnlyExns = isOnlyExns}))) in finish (fn x => Env.lookup (env, x)) end else let val i = chooseColumn rules in case Vector.peek (rules, fn Rule.T {pats, ...} => not (Pat.isWild (Vector.sub (pats, i)))) of NONE => match (Vector.dropNth (vars, i), Rules.dropNth (rules, i), facts, es) | SOME (Rule.T {pats, ...}) => let datatype z = datatype Pat.t val test = Exp.var (Vector.sub (vars, i)) in case Vector.sub (pats, i) of Const _ => const (vars, rules, facts, es, i, test) | Con {con, ...} => sum (vars, rules, facts, es, i, test, conTycon con) | Record rps => record (vars, rules, facts, es, i, test, SortedRecord.domain rps) | Vector _ => vector (vars, rules, facts, es, i, test) | Wild => Error.bug "MatchCompile.match: Wild" end end) arg and const arg = traceConst (fn (vars, rules, facts, es, i, test) => let val (var, ty) = Vector.sub (vars, i) val {isChar, isInt} = case Vector.peekMap (rules, fn Rule.T {pats, ...} => case Vector.sub (pats, i) of Pat.Const {isChar, isInt, ...} => SOME {isChar = isChar, isInt = isInt} | _ => NONE) of NONE => {isChar = false, isInt = false} | SOME {isChar, isInt} => {isChar = isChar, isInt = isInt} fun exampleConst c = Example.const {const = c, isChar = isChar, isInt = isInt} val (cases, defaults) = Vector.foldr (rules, ([], []), fn (rule as Rule.T {pats, ...}, (cases, defaults)) => let val rule = Rule.dropNth (rule, i) in case Vector.sub (pats, i) of Pat.Const {const = c, ...} => let fun insert (cases, ac) = case cases of [] => {const = c, rules = rule :: defaults} :: ac | (casee as {const, rules}) :: cases => if Const.equals (c, const) then {const = c, rules = rule :: rules} :: List.appendRev (ac, cases) else insert (cases, casee :: ac) in (insert (cases, []), defaults) end | Pat.Wild => (List.map (cases, fn {const, rules} => {const = const, rules = rule :: rules}), rule :: defaults) | _ => Error.bug "MatchCompile.const: expected Const pat" end) val cases = Vector.fromListMap (cases, fn {const, rules} => {const = const, rules = Vector.fromList rules}) val defaults = Vector.fromList defaults val vars = Vector.dropNth (vars, i) fun finish (rules: Rule.t vector, e): Exp.t = match (vars, rules, facts, Examples.add (es, var, e, {isOnlyExns = false})) val default: Exp.t option = Option.map (unhandledConsts {consts = Vector.map (cases, #const), isChar = isChar, isInt = isInt}, fn e => finish (defaults, e)) in case List.peek (directCases, fn {ty = ty', ...} => Type.equals (ty, ty')) of NONE => let val (cases, default) = case default of SOME default => (cases, default) | NONE => (Vector.dropSuffix (cases, 1), let val {const, rules} = Vector.last cases in finish (rules, exampleConst const) end) in Vector.fold (cases, default, fn ({const, rules}, rest) => Exp.iff {test = Exp.equal (test, Exp.const const), thenn = finish (rules, exampleConst const), elsee = rest, ty = caseType}) end | SOME {size, ...} => let val cases = Vector.map (cases, fn {const, rules} => let val w = case const of Const.Word w => w | _ => Error.bug "MatchCompile.const: caseWord type error" in (w, finish (rules, exampleConst const)) end) in Exp.casee {cases = Cases.Word (size, cases), default = default, test = test, ty = caseType} end end) arg and sum arg = traceSum (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es, i, test, tycon) => let val (var, _) = Vector.sub (vars, i) val (cases, defaults) = Vector.foldr (rules, ([], []), fn (rule as Rule.T {pats, ...}, (cases, defaults)) => case Vector.sub (pats, i) of Pat.Con {arg, con, targs} => let fun oneCase () = let val (arg, vars) = case arg of NONE => (NONE, Vector.keepAllMapi (vars, fn (i', x) => if i = i' then NONE else SOME x)) | SOME (_, ty) => let val arg = Var.newNoname () in (SOME (arg, ty), Vector.mapi (vars, fn (i', x) => if i = i' then (arg, ty) else x)) end in {rest = {arg = arg, con = con, targs = targs, vars = vars}, rules = rule :: defaults} end fun insert (cases, ac) = case cases of [] => oneCase () :: ac | ((casee as {rest as {con = con', ...}, rules}) :: cases) => if Con.equals (con, con') then {rest = rest, rules = rule :: rules} :: List.appendRev (ac, cases) else insert (cases, casee :: ac) in (insert (cases, []), defaults) end | Pat.Wild => (List.map (cases, fn {rest, rules} => {rest = rest, rules = rule :: rules}), rule :: defaults) | _ => Error.bug "MatchCompile.sum: expected Con pat") val cases = Vector.fromListMap (cases, fn {rest = {arg, con, targs, vars}, rules} => let val rules = Vector.fromListMap (rules, fn Rule.T {pats, rest} => let val pats = Vector.keepAllMapi (pats, fn (i', p') => if i <> i' then SOME p' else case p' of Pat.Con {arg, ...} => Option.map (arg, #1) | Pat.Wild => Option.map (arg, fn _ => Pat.Wild) | _ => Error.bug "MatchCompile.sum: decon got strange pattern") in Rule.T {pats = pats, rest = rest} end) val facts = Facts.add (facts, var, Fact.Con {arg = Option.map (arg, #1), con = con}) in (ExpPat.T {arg = arg, con = con, targs = targs}, match (vars, rules, facts, es)) end) fun done (e, isOnlyExns) = SOME (match (Vector.dropNth (vars, i), Rules.dropNth (Vector.fromList defaults, i), facts, Examples.add (es, var, e, {isOnlyExns = isOnlyExns}))) val default = if Vector.isEmpty cases then done (Example.Wild, true) else if Tycon.equals (tycon, Tycon.exn) then done (Example.Exn, true) else let val cons = tyconCons tycon val unhandled = List.keepAllMap (Vector.toList cons, fn {con, hasArg, ...} => if Vector.exists (cases, fn (ExpPat.T {con = con', ...}, _) => Con.equals (con, con')) then NONE else SOME (Example.ConApp {con = con, arg = if hasArg then SOME Example.Wild else NONE})) in Option.fold (Example.or unhandled, NONE, fn (e, _) => done (e, false)) end fun normal () = Exp.casee {cases = Cases.Con cases, default = default, test = test, ty = caseType} in if 1 <> Vector.length cases then normal () else let val (ExpPat.T {arg, con, ...}, rhs) = Vector.first cases in if not (Con.equals (con, Con.reff)) then normal () else case arg of NONE => Error.bug "MatchCompile.sum: ref missing arg" | SOME (var, _) => Exp.lett {body = rhs, exp = Exp.deref test, var = var} end end) arg and record arg = traceRecord (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es, i, test, fs) => let val (var, varTy) = Vector.sub (vars, i) fun body vars' = let val n = Vector.length vars' val vars = Vector.concatV (Vector.mapi (vars, fn (i', x) => if i = i' then vars' else Vector.new1 x)) val rules = Vector.map (rules, fn Rule.T {pats, rest} => let val pats = Vector.concatV (Vector.mapi (pats, fn (i', p) => if i <> i' then Vector.new1 p else (case p of Pat.Record rps => SortedRecord.range rps | Pat.Wild => Vector.tabulate (n, fn _ => Pat.Wild) | _ => Error.bug "MatchCompile.record: derecord"))) in Rule.T {pats = pats, rest = rest} end) val facts = Facts.add (facts, var, Fact.Record (SortedRecord.zip (fs, Vector.map (vars', #1)))) in match (vars, rules, facts, es) end in if Vector.length fs = 1 then let val var' = Var.newNoname () in (* Although 'test' is likely a variable, * must bind to a fresh variable to maintain * a unique Fact.t per variable in Facts.t. *) Exp.lett {var = var', exp = test, body = body (Vector.new1 (var', varTy))} end else Exp.detuple {body = body, tuple = test} end) arg and vector arg = traceVector (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es, i, test) => let val (var, _) = Vector.sub (vars, i) val (cases, defaults) = Vector.foldr (rules, ([], []), fn (rule as Rule.T {pats, ...}, (cases, defaults)) => case Vector.sub (pats, i) of Pat.Vector args => let fun oneCase () = {len = Vector.length args, rules = rule :: defaults} fun insert (cases, ac) = case cases of [] => oneCase () :: ac | ((casee as {len, rules})::cases) => if Vector.length args = len then {len = len, rules = rule :: rules} :: List.appendRev (ac, cases) else insert (cases, casee :: ac) in (insert (cases, []), defaults) end | Pat.Wild => (List.map (cases, fn {len, rules} => {len = len, rules = rule :: rules}), rule :: defaults) | _ => Error.bug "MatchCompile.vector: expected Vector pat") val default = let val maxLen = List.fold (cases, ~1, fn ({len, ...}, max) => Int.max (max, len)) val unhandled = Example.vectorDots (Vector.new (maxLen + 1, Example.Wild)) val unhandled = Int.foldDown (0, maxLen, [unhandled], fn (i, unhandled) => if List.exists (cases, fn {len, ...} => i = len) then unhandled else (Example.vector (Vector.new (i, Example.Wild))) :: unhandled) val unhandled = Example.or unhandled in match (Vector.dropNth (vars, i), Rules.dropNth (Vector.fromList defaults, i), facts, Option.fold (unhandled, es, fn (unhandled, es) => Examples.add (es, var, unhandled, {isOnlyExns = false}))) end val cases = Vector.fromListMap (cases, fn {len, rules} => let fun body vars' = let val vars = Vector.concatV (Vector.mapi (vars, fn (i', x) => if i = i' then vars' else Vector.new1 x)) val rules = Vector.fromListMap (rules, fn Rule.T {pats, rest} => let val pats = Vector.concatV (Vector.mapi (pats, fn (i', p) => if i <> i' then Vector.new1 p else (case p of Pat.Vector ps => ps | Pat.Wild => Vector.new (len, Pat.Wild) | _ => Error.bug "MatchCompile.vector: devector"))) in Rule.T {pats = pats, rest = rest} end) in match (vars, rules, Facts.add (facts, var, Fact.Vector (Vector.map (vars', #1))), es) end in (WordX.fromInt (len, WordSize.seqIndex ()), Exp.devector {vector = test, length = len, body = body}) end) in Exp.casee {cases = Cases.Word (WordSize.seqIndex (), cases), default = SOME default, test = Exp.vectorLength test, ty = caseType} end) arg val examples = ref [] val res = match (Vector.new1 (test, testType), Vector.mapi (cases, fn (i, (p, f)) => Rule.T {pats = Vector.new1 (Pat.fromNestedPat p), rest = {examples = if i = Vector.length cases - 1 then SOME examples else NONE, finish = f, nestedPat = p}}), Facts.empty, Examples.empty) val examples = fn {dropOnlyExns} => let val example = (Example.or o List.keepAllMap) (!examples, fn (ex, {isOnlyExns}) => if dropOnlyExns andalso isOnlyExns then NONE else SOME ex) in Option.map (example, Example.layout) end in (res, examples) end val matchCompile = fn {caseType: Type.t, cases: (NestedPat.t * (int -> (Var.t -> Var.t) -> Exp.t)) vector, conTycon: Con.t -> Tycon.t, test: Var.t, testType: Type.t, tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector} => let val cases = Vector.map (cases, fn (pat, mk) => let val pats = NestedPat.flatten pat val mk = mk (Vector.length pats) in Vector.map (pats, fn pat => (pat, mk)) end) val cases = Vector.concatV cases in matchCompile {caseType = caseType, cases = cases, conTycon = conTycon, test = test, testType = testType, tyconCons = tyconCons} end val matchCompile = Trace.trace ("MatchCompile.matchCompile", fn {caseType, cases, test, testType, ...} => Layout.record [("caseType", Type.layout caseType), ("cases", Vector.layout (NestedPat.layout o #1) cases), ("test", Var.layout test), ("testType", Type.layout testType)], Exp.layout o #1) matchCompile structure Pat = ExpPat end mlton-20210117+dfsg/mlton/match-compile/match-compile.sig000066400000000000000000000042211416264345000231260ustar00rootroot00000000000000(* Copyright (C) 2009,2015,2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MATCH_COMPILE_STRUCTS = sig include ATOMS structure Type: sig type t val deTuple: t -> t vector val equals: t * t -> bool val layout: t -> Layout.t val unit: t val word: WordSize.t -> t end structure Pat: sig datatype t = T of {arg: (Var.t * Type.t) option, con: Con.t, targs: Type.t vector} end structure Exp: sig type t val casee: {cases: (Pat.t, t) Cases.t, default: t option, test: t, ty: Type.t} (* type of entire case expression *) -> t val const: Const.t -> t val deref: t -> t val detuple: {tuple: t, body: (Var.t * Type.t) vector -> t} -> t val devector: {vector: t, length: int, body: (Var.t * Type.t) vector -> t} -> t val equal: t * t -> t val iff: {test: t, thenn: t, elsee: t, ty: Type.t} -> t val lett: {var: Var.t, exp: t, body: t} -> t val var: Var.t * Type.t -> t val vectorLength: t -> t end structure NestedPat: NESTED_PAT sharing Atoms = NestedPat.Atoms sharing Type = NestedPat.Type end signature MATCH_COMPILE = sig include MATCH_COMPILE_STRUCTS val matchCompile: {caseType: Type.t, (* type of entire expression *) cases: (NestedPat.t * (int -> (Var.t -> Var.t) -> Exp.t)) vector, conTycon: Con.t -> Tycon.t, test: Var.t, testType: Type.t, tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector} -> Exp.t * ({dropOnlyExns: bool} -> Layout.t option) end mlton-20210117+dfsg/mlton/match-compile/nested-pat.fun000066400000000000000000000145371416264345000224710ustar00rootroot00000000000000(* Copyright (C) 2015,2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor NestedPat (S: NESTED_PAT_STRUCTS): NESTED_PAT = struct open S datatype t = T of {pat: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of {const: Const.t, isChar: bool, isInt: bool} | Layered of Var.t * t | Or of t vector | Record of t SortedRecord.t | Var of Var.t | Vector of t vector | Wild local fun make f (T r) = f r in val node = make #pat val ty = make #ty end fun tuple ps = T {pat = Record (SortedRecord.tuple ps), ty = Type.tuple (Vector.map (ps, ty))} fun layout (p, isDelimited) = let open Layout fun delimit t = if isDelimited then t else paren t in case node p of Con {arg, con, targs} => delimit (Pretty.conApp {arg = Option.map (arg, layoutF), con = Con.layout con, targs = Vector.map (targs, Type.layout)}) | Const {const = c, ...} => Const.layout c | Layered (x, p) => delimit (seq [Var.layout x, str " as ", layoutT p]) | Or ps => paren (mayAlign (separateLeft (Vector.toListMap (ps, layoutT), "| "))) | Record rps => SortedRecord.layout {extra = "", layoutElt = layoutT, layoutTuple = fn ps => tuple (Vector.toListMap (ps, layoutT)), record = rps, separator = " = "} | Var x => Var.layout x | Vector ps => vector (Vector.map (ps, layoutT)) | Wild => str "_" end and layoutF p = layout (p, false) and layoutT p = layout (p, true) val layout = layoutT fun make (p, t) = T {pat = p, ty = t} fun flatten p = let val ty = ty p val make = fn p => make (p, ty) in case node p of Con {arg, con, targs} => (case arg of NONE => Vector.new1 p | SOME arg => Vector.map (flatten arg, fn arg => make (Con {arg = SOME arg, con = con, targs = targs}))) | Const _ => Vector.new1 p | Layered (x, p) => Vector.map (flatten p, fn p => make (Layered (x, p))) | Or ps => Vector.concatV (Vector.map (ps, flatten)) | Record rps => let val (fs, ps) = SortedRecord.unzip rps val record = fn ps => Record (SortedRecord.zip (fs, ps)) in flattens (ps, make o record) end | Var _ => Vector.new1 p | Vector ps => flattens (ps, make o Vector) | Wild => Vector.new1 p end and flattens (ps, make) = let val fpss = Vector.foldr (Vector.map (ps, flatten), [[]], fn (fps, fpss) => List.concat (Vector.toListMap (fps, fn fp => List.map (fpss, fn fps => fp :: fps)))) in Vector.fromListMap (fpss, fn fps => make (Vector.fromList fps)) end val flatten = Trace.trace ("NestedPat.flatten", layout, Vector.layout layout) flatten fun isRefutable p = case node p of Con _ => true | Const _ => true | Layered (_, p) => isRefutable p | Or ps => Vector.exists (ps, isRefutable) | Record rps => SortedRecord.exists (rps, isRefutable) | Var _ => false | Vector _ => true | Wild => false fun isVarOrWild p = case node p of Var _ => true | Wild => true | _ => false fun removeOthersReplace (p, {new, old}) = let fun loop (T {pat, ty}) = let val pat = case pat of Con {arg, con, targs} => Con {arg = Option.map (arg, loop), con = con, targs = targs} | Const _ => pat | Layered (x, p) => let val p = loop p in if Var.equals (x, old) then Layered (new, p) else node p end | Or ps => Or (Vector.map (ps, loop)) | Record rps => Record (SortedRecord.map (rps, loop)) | Var x => if Var.equals (x, old) then Var new else Wild | Vector ps => Vector (Vector.map (ps, loop)) | Wild => Wild in T {pat = pat, ty = ty} end in loop p end val removeOthersReplace = Trace.trace ("NestedPat.removeOthersReplace", fn (p, _) => layout p, layout) removeOthersReplace local val bogus = Var.newNoname () in fun removeVars (p: t): t = removeOthersReplace (p, {new = bogus, old = bogus}) end fun replaceTypes (p: t, f: Type.t -> Type.t): t = let fun loop (T {pat, ty}) = let val pat = case pat of Con {arg, con, targs} => Con {arg = Option.map (arg, loop), con = con, targs = Vector.map (targs, f)} | Const _ => pat | Layered (x, p) => Layered (x, loop p) | Or ps => Or (Vector.map (ps, loop)) | Record rps => Record (SortedRecord.map (rps, loop)) | Var _ => pat | Vector ps => Vector (Vector.map (ps, loop)) | Wild => pat in T {pat = pat, ty = f ty} end in loop p end fun varsAndTypes (p: t): (Var.t * Type.t) list = let fun loop (p: t, accum: (Var.t * Type.t) list) = case node p of Con {arg, ...} => (case arg of NONE => accum | SOME p => loop (p, accum)) | Const _ => accum | Layered (x, p) => loop (p, (x, ty p) :: accum) | Or ps => loop (Vector.first ps, accum) | Record rps => SortedRecord.fold (rps, accum, loop) | Var x => (x, ty p) :: accum | Vector ps => Vector.fold (ps, accum, loop) | Wild => accum in loop (p, []) end end mlton-20210117+dfsg/mlton/match-compile/nested-pat.sig000066400000000000000000000033771416264345000224630ustar00rootroot00000000000000(* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature NESTED_PAT_STRUCTS = sig include ATOMS structure Type: sig type t val layout: t -> Layout.t val tuple: t vector -> t end end signature NESTED_PAT = sig include NESTED_PAT_STRUCTS datatype t = T of {pat: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of {const: Const.t, isChar: bool, isInt: bool} | Layered of Var.t * t | Or of t vector | Record of t SortedRecord.t | Var of Var.t | Vector of t vector | Wild val flatten: t -> t vector (* isRefutable p iff p contains a constant, constructor or variable. *) val isRefutable: t -> bool val isVarOrWild: t -> bool val layout: t -> Layout.t val make: node * Type.t -> t val node: t -> node val removeOthersReplace: t * {new: Var.t, old: Var.t} -> t val removeVars: t -> t val replaceTypes: t * (Type.t -> Type.t) -> t val tuple: t vector -> t val ty: t -> Type.t (* varsAndTypes returns a list of the variables in the pattern, along with * their types. It is used for match compilation in order to build a * function that abstracts over the expression of a case rule p => e. * See infer.fun. *) val varsAndTypes: t -> (Var.t * Type.t) list end mlton-20210117+dfsg/mlton/match-compile/sources.cm000066400000000000000000000006711416264345000217110ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library functor MatchCompile functor NestedPat is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm nested-pat.sig nested-pat.fun match-compile.sig match-compile.fun mlton-20210117+dfsg/mlton/match-compile/sources.mlb000066400000000000000000000007261416264345000220650ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb nested-pat.sig nested-pat.fun match-compile.sig match-compile.fun in functor MatchCompile functor NestedPat end mlton-20210117+dfsg/mlton/mlton-smlnj.cm000066400000000000000000000002611416264345000177510ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library structure Main is sources.cm mlton-20210117+dfsg/mlton/mlton.mlb000066400000000000000000000003661416264345000170110ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20210117+dfsg/mlton/sources.cm000066400000000000000000000004521416264345000171640ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library structure Main is main/sources.cm mlton-20210117+dfsg/mlton/sources.mlb000066400000000000000000000004361416264345000173410ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local in main/sources.mlb end mlton-20210117+dfsg/mlton/ssa/000077500000000000000000000000001416264345000157455ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/ssa/analyze.fun000066400000000000000000000272651416264345000201360ustar00rootroot00000000000000(* Copyright (C) 2011,2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Analyze (S: ANALYZE_STRUCTS): ANALYZE = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t fun 'a analyze {coerce, conApp, const, filter, filterWord, fromType, layout, primApp, program = Program.T {main, globals, functions, ...}, select, tuple, useFromTypeOnBinds} = let val unit = fromType Type.unit fun coerces (msg, from, to) = if Vector.length from = Vector.length to then Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) else Error.bug (concat ["Analyze.coerces (length mismatch: ", msg, ")"]) val {get = value: Var.t -> 'a, set = setValue, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("Analyze.value", Var.layout)) val value = Trace.trace ("Analyze.value", Var.layout, layout) value fun values xs = Vector.map (xs, value) val {get = funcInfo, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Analyze.funcInfo", Func.layout)) val {get = labelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Analyze.labelInfo", Label.layout)) val labelArgs = #args o labelInfo val labelValues = #values o labelInfo fun loopArgs args = Vector.map (args, fn (x, t) => let val v = fromType t in setValue (x, v) ; v end) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFuncInfo (name, {args = loopArgs args, raises = Option.map (raises, fn ts => Vector.map (ts, fromType)), returns = Option.map (returns, fn ts => Vector.map (ts, fromType))}) end) fun loopTransfer (t: Transfer.t, shouldReturns: 'a vector option, shouldRaises: 'a vector option): unit = (case t of Bug => () | Call {func, args, return, ...} => let val {args = formals, raises, returns} = funcInfo func val _ = coerces ("call args/formals", values args, formals) fun noHandler () = case (raises, shouldRaises) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze.loopTransfer (raise mismatch)" | (SOME vs, SOME vs') => coerces ("call caller/raises", vs, vs') datatype z = datatype Return.t in case return of Dead => if isSome returns orelse isSome raises then Error.bug "Analyze.loopTransfer (return mismatch at Dead)" else () | NonTail {cont, handler} => (Option.app (returns, fn vs => coerces ("call non-tail/returns", vs, labelValues cont)) ; (case handler of Handler.Caller => noHandler () | Handler.Dead => if isSome raises then Error.bug "Analyze.loopTransfer (raise mismatch at NonTail/Dead)" else () | Handler.Handle h => let val _ = case raises of NONE => () | SOME vs => coerces ("call handle/raises", vs, labelValues h) in () end)) | Tail => let val _ = noHandler () val _ = case (returns, shouldReturns) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze.loopTransfer (return mismatch at Tail)" | (SOME vs, SOME vs') => coerces ("call tail/returns", vs, vs') in () end end | Case {test, cases, default, ...} => let val test = value test fun ensureNullary j = if Vector.isEmpty (labelValues j) then () else Error.bug (concat ["Analyze.loopTransfer (case ", Label.toString j, " must be nullary)"]) fun ensureSize (w, s) = if WordSize.equals (s, WordX.size w) then () else Error.bug (concat ["Analyze.loopTransfer (case ", WordX.toString (w, {suffix = true}), " must be size ", WordSize.toString s, ")"]) fun doitWord (s, cs) = (ignore (filterWord (test, s)) ; Vector.foreach (cs, fn (w, j) => (ensureSize (w, s) ; ensureNullary j))) fun doitCon cs = Vector.foreach (cs, fn (c, j) => filter (test, c, labelValues j)) datatype z = datatype Cases.t val _ = case cases of Con cs => doitCon cs | Word (s, cs) => doitWord (s, cs) val _ = Option.app (default, ensureNullary) in () end | Goto {dst, args} => coerces ("goto", values args, labelValues dst) | Raise xs => (case shouldRaises of NONE => Error.bug "Analyze.loopTransfer (raise mismatch at Raise)" | SOME vs => coerces ("raise", values xs, vs)) | Return xs => (case shouldReturns of NONE => Error.bug "Analyze.loopTransfer (return mismatch at Return)" | SOME vs => coerces ("return", values xs, vs)) | Runtime {prim, args, return} => let val xts = labelArgs return val (resultVar, resultType) = if Vector.isEmpty xts then (NONE, Type.unit) else let val (x, t) = Vector.first xts in (SOME x, t) end val _ = primApp {prim = prim, targs = Vector.new0 (), args = values args, resultType = resultType, resultVar = resultVar} in () end) handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Transfer.layout t)]) val loopTransfer = Trace.trace3 ("Analyze.loopTransfer", Transfer.layout, Option.layout (Vector.layout layout), Option.layout (Vector.layout layout), Layout.ignore) loopTransfer fun loopStatement (s as Statement.T {var, exp, ty}): unit = let val v = case exp of ConApp {con, args} => conApp {con = con, args = values args} | Const c => const c | PrimApp {prim, targs, args, ...} => primApp {prim = prim, targs = targs, args = values args, resultType = ty, resultVar = var} | Profile _ => unit | Select {tuple, offset} => select {tuple = value tuple, offset = offset, resultType = ty} | Tuple xs => if 1 = Vector.length xs then Error.bug "Analyze.loopStatement (unary tuple)" else tuple (values xs) | Var x => value x in Option.app (var, fn var => if useFromTypeOnBinds then let val v' = fromType ty val _ = coerce {from = v, to = v'} val _ = setValue (var, v') in () end else setValue (var, v)) end handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Statement.layout s)]) val loopStatement = Trace.trace ("Analyze.loopStatement", Statement.layout, Unit.layout) loopStatement val _ = coerces ("main", Vector.new0 (), #args (funcInfo main)) val _ = Vector.foreach (globals, loopStatement) handle exn => Error.reraiseSuffix (exn, concat [" in Globals"]) val _ = List.foreach (functions, fn f => let val {blocks, name, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, args, ...} => setLabelInfo (label, {args = args, block = b, values = loopArgs args, visited = ref false})) val {returns, raises, ...} = funcInfo name fun visit (l: Label.t) = let val {block, visited, ...} = labelInfo l in if !visited then () else let val _ = visited := true val Block.T {statements, transfer, ...} = block val _ = (Vector.foreach (statements, loopStatement) ; loopTransfer (transfer, returns, raises)) handle exn => Error.reraiseSuffix (exn, concat [" in ", Label.toString l]) in Transfer.foreachLabel (transfer, visit) end end val _ = visit start in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Func.toString (Function.name f)])) in {func = funcInfo, label = labelValues, value = value} end end mlton-20210117+dfsg/mlton/ssa/analyze.sig000066400000000000000000000027001416264345000201130ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ANALYZE_STRUCTS = sig include DIRECT_EXP end signature ANALYZE = sig include ANALYZE_STRUCTS val analyze: {coerce: {from: 'a, to: 'a} -> unit, conApp: {args: 'a vector, con: Con.t} -> 'a, const: Const.t -> 'a, filter: 'a * Con.t * 'a vector -> unit, filterWord: 'a * WordSize.t -> unit, fromType: Type.t -> 'a, layout: 'a -> Layout.t, primApp: {args: 'a vector, prim: Type.t Prim.t, resultType: Type.t, resultVar: Var.t option, targs: Type.t vector} -> 'a, program: Program.t, select: {offset: int, resultType: Type.t, tuple: 'a} -> 'a, tuple: 'a vector -> 'a, useFromTypeOnBinds: bool } -> { value: Var.t -> 'a, func: Func.t -> {args: 'a vector, raises: 'a vector option, returns: 'a vector option}, label: Label.t -> 'a vector } end mlton-20210117+dfsg/mlton/ssa/analyze2.fun000066400000000000000000000334111416264345000202060ustar00rootroot00000000000000(* Copyright (C) 2011,2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Analyze2 (S: ANALYZE2_STRUCTS): ANALYZE2 = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t fun 'a analyze {base, coerce, const, filter, filterWord, fromType, inject, layout, object, primApp, program = Program.T {functions, globals, main, ...}, select, sequence, update, useFromTypeOnBinds} = let fun coerces (msg, from, to) = if Vector.length from = Vector.length to then Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) else Error.bug (concat ["Analyze2.coerces (length mismatch: ", msg, ")"]) val {get = value: Var.t -> 'a, set = setValue, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("Analyze2.value", Var.layout)) val value = Trace.trace ("Analyze2.value", Var.layout, layout) value fun values xs = Vector.map (xs, value) val {get = funcInfo, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Analyze2.funcInfo", Func.layout)) val {get = labelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Analyze2.labelInfo", Label.layout)) val labelArgs = #args o labelInfo val labelValues = #values o labelInfo fun loopArgs args = Vector.map (args, fn (x, t) => let val v = fromType t in setValue (x, v) ; v end) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFuncInfo (name, {args = loopArgs args, raises = Option.map (raises, fn ts => Vector.map (ts, fromType)), returns = Option.map (returns, fn ts => Vector.map (ts, fromType))}) end) fun loopTransfer (t: Transfer.t, shouldReturns: 'a vector option, shouldRaises: 'a vector option): unit = (case t of Bug => () | Call {func, args, return, ...} => let val {args = formals, raises, returns} = funcInfo func val _ = coerces ("call args/formals", values args, formals) fun noHandler () = case (raises, shouldRaises) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze2.loopTransfer (raise mismatch)" | (SOME vs, SOME vs') => coerces ("call caller/raises", vs, vs') datatype z = datatype Return.t in case return of Dead => if isSome returns orelse isSome raises then Error.bug "Analyze2.loopTransfer (return mismatch at Dead)" else () | NonTail {cont, handler} => (Option.app (returns, fn vs => coerces ("call non-tail/returns", vs, labelValues cont)) ; (case handler of Handler.Caller => noHandler () | Handler.Dead => if isSome raises then Error.bug "Analyze2.loopTransfer (raise mismatch at NonTail/Dead)" else () | Handler.Handle h => let val _ = case raises of NONE => () | SOME vs => coerces ("call handle/raises", vs, labelValues h) in () end)) | Tail => let val _ = noHandler () val _ = case (returns, shouldReturns) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze2.loopTransfer (return mismatch at Tail)" | (SOME vs, SOME vs') => coerces ("call tail/return", vs, vs') in () end end | Case {test, cases, default, ...} => let val test = value test fun ensureSize (w, s) = if WordSize.equals (s, WordX.size w) then () else Error.bug (concat ["Analyze.loopTransfer (case ", WordX.toString (w, {suffix = true}), " must be size ", WordSize.toString s, ")"]) fun ensureNullary j = if Vector.isEmpty (labelValues j) then () else Error.bug (concat ["Analyze2.loopTransfer (case:", Label.toString j, " must be nullary)"]) fun doitWord (s, cs) = (ignore (filterWord (test, s)) ; Vector.foreach (cs, fn (w, j) => (ensureSize (w, s) ; ensureNullary j))) fun doitCon cs = Vector.foreach (cs, fn (c, j) => let val v = labelValues j val variant = case Vector.length v of 0 => NONE | 1 => SOME (Vector.first v) | _ => Error.bug "Analyze2.loopTransfer (case conApp with >1 arg)" in filter {con = c, test = test, variant = variant} end) datatype z = datatype Cases.t val _ = case cases of Con cs => doitCon cs | Word (s, cs) => doitWord (s, cs) val _ = Option.app (default, ensureNullary) in () end | Goto {dst, args} => coerces ("goto", values args, labelValues dst) | Raise xs => (case shouldRaises of NONE => Error.bug "Analyze2.loopTransfer (raise mismatch at Raise)" | SOME vs => coerces ("raise", values xs, vs)) | Return xs => (case shouldReturns of NONE => Error.bug "Analyze2.loopTransfer (return mismatch at Return)" | SOME vs => coerces ("return", values xs, vs)) | Runtime {prim, args, return} => let val xts = labelArgs return val (resultVar, resultType) = if Vector.isEmpty xts then (NONE, Type.unit) else let val (x, t) = Vector.first xts in (SOME x, t) end val _ = primApp {prim = prim, args = values args, resultType = resultType, resultVar = resultVar} in () end) handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Transfer.layout t)]) val loopTransfer = Trace.trace3 ("Analyze2.loopTransfer", Transfer.layout, Option.layout (Vector.layout layout), Option.layout (Vector.layout layout), Layout.ignore) loopTransfer fun baseValue b = base (Base.map (b, value)) fun loopBind {exp, ty, var}: 'a = case exp of Const c => const c | Inject {sum, variant} => inject {sum = sum, variant = value variant} | Object {args, con} => let val args = case Type.dest ty of Type.Object {args = ts, ...} => Prod.make (Vector.map2 (args, Prod.dest ts, fn (x, {isMutable, ...}) => {elt = value x, isMutable = isMutable})) | _ => Error.bug "Analyze2.loopBind (strange object)" in object {args = args, con = con, resultType = ty} end | PrimApp {prim, args, ...} => primApp {prim = prim, args = values args, resultType = ty, resultVar = var} | Select {base, offset} => select {base = baseValue base, offset = offset, resultType = ty} | Sequence {args} => let val args = case Type.dest ty of Type.Object {args = ts, con = ObjectCon.Sequence} => Vector.map (args, fn args => Prod.make (Vector.map2 (args, Prod.dest ts, fn (x, {isMutable, ...}) => {elt = value x, isMutable = isMutable}))) | _ => Error.bug "Analyze2.loopBind (strange sequence)" in sequence {args = args, resultType = ty} end | Var x => value x fun loopStatement (s: Statement.t): unit = (case s of Bind (b as {ty, var, ...}) => let val v = loopBind b in Option.app (var, fn var => if useFromTypeOnBinds then let val v' = fromType ty val _ = coerce {from = v, to = v'} val _ = setValue (var, v') in () end else setValue (var, v)) end | Profile _ => () | Update {base, offset, value = v} => update {base = baseValue base, offset = offset, value = value v}) handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Statement.layout s)]) val loopStatement = Trace.trace ("Analyze2.loopStatement", Statement.layout, Unit.layout) loopStatement val _ = coerces ("main", Vector.new0 (), #args (funcInfo main)) val _ = Vector.foreach (globals, loopStatement) handle exn => Error.reraiseSuffix (exn, concat [" in Globals"]) val _ = List.foreach (functions, fn f => let val {blocks, name, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, args, ...} => setLabelInfo (label, {args = args, block = b, values = loopArgs args, visited = ref false})) val {returns, raises, ...} = funcInfo name fun visit (l: Label.t) = let val {block, visited, ...} = labelInfo l in if !visited then () else let val _ = visited := true val Block.T {statements, transfer, ...} = block val _ = (Vector.foreach (statements, loopStatement) ; loopTransfer (transfer, returns, raises)) handle exn => Error.reraiseSuffix (exn, concat [" in ", Label.toString l]) in Transfer.foreachLabel (transfer, visit) end end val _ = visit start in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Func.toString (Function.name f)])) in {func = funcInfo, label = labelValues, value = value} end end mlton-20210117+dfsg/mlton/ssa/analyze2.sig000066400000000000000000000035601416264345000202020ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature ANALYZE2_STRUCTS = sig include SSA_TREE2 end signature ANALYZE2 = sig include ANALYZE2_STRUCTS val analyze: {base: 'a Base.t -> 'a, coerce: {from: 'a, to: 'a} -> unit, const: Const.t -> 'a, (* In filter, the variant is an 'a option because the targets of Case * branches may ignore the test (by taking 0 args). *) filter: {con: Con.t, test: 'a, variant: 'a option} -> unit, filterWord: 'a * WordSize.t -> unit, fromType: Type.t -> 'a, inject: {sum: Tycon.t, variant: 'a} -> 'a, layout: 'a -> Layout.t, object: {args: 'a Prod.t, con: Con.t option, resultType: Type.t} -> 'a, primApp: {args: 'a vector, prim: Type.t Prim.t, resultType: Type.t, resultVar: Var.t option} -> 'a, program: Program.t, select: {base: 'a, offset: int, resultType: Type.t} -> 'a, sequence: {args: 'a Prod.t vector, resultType: Type.t} -> 'a, update: {base: 'a, offset: int, value: 'a} -> unit, useFromTypeOnBinds: bool} -> {func: Func.t -> {args: 'a vector, raises: 'a vector option, returns: 'a vector option}, label: Label.t -> 'a vector, value: Var.t -> 'a} end mlton-20210117+dfsg/mlton/ssa/combine-conversions.fun000066400000000000000000000123161416264345000224440ustar00rootroot00000000000000(* Copyright (C) 2009 Wesley W. Tersptra. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CombineConversions (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S (* * This pass looks for and simplifies nested calls to (signed) * extension/truncation. * * It processes each block in dfs order (visiting defs before uses): * If the statement is not a PrimApp Word_extdToWords, skip it. * After processing a conversion, it tags the Var for subsequent * use. * When inspecting a conversion, check if the Var operand is also * the result of a conversion. If it is, try to combine the two * operations. Repeatedly simplify until hitting either a * non-conversion Var or a case where the conversion cannot be * simplified. * * The optimization rules are very simple: * x1 : word = ... * x2 : word = Word_extdToWord (W1, W2, {signed=s1}) x1 * x3 : word = Word_extdToWord (W2, W3, {signed=s2}) x2 * * If W1 = W2, then there is no conversions before x_1. * This is guaranteed because W2 = W3 will always trigger optimization. * * Case W1 <= W3 <= W2: * x3 = Word_extdToWord (W1, W3, {signed=s1}) x1 * Case W1 < W2 < W3 AND (NOT s1 OR s2): * x3 = Word_extdToWord (W1, W3, {signed=s1}) x1 * Case W1 = W2 < W3: * unoptimized * because there are no conversions past W1 and x2 = x1 * * Case W3 <= W2 <= W1: * Case W3 <= W1 <= W2: * x_3 = Word_extdToWord (W1, W3, {signed=_}) x1 * because W3 <= W1 && W3 <= W2, just clip x1 * * Case W2 < W1 <= W3: * Case W2 < W3 <= W1: * unoptimized * because W2 < W1 && W2 < W3, has truncation effect * * Case W1 < W2 < W3 AND s1 AND (NOT s2): * unoptimized * because each conversion affects the result separately *) val { get : Var.t -> ((WordSize.t * WordSize.t * {signed:bool}) * Var.t) option, set, ... } = Property.getSetOnce (Var.plist, Property.initConst NONE) fun rules x3 (conversion as ((W2, W3, {signed=s2}), x2)) = let val { <, <=, ... } = Relation.compare WordSize.compare fun stop () = set (x3, SOME conversion) fun loop ((W1, _, {signed=s1}), x1) = rules x3 ((W1, W3, {signed=s1}), x1) in case get x2 of NONE => stop () | SOME (prev as ((W1, _, {signed=s1}), _)) => if W1 <= W3 andalso W3 <= W2 then loop prev else if W1 < W2 andalso W2 < W3 andalso (not s1 orelse s2) then loop prev else if W3 <= W1 andalso W3 <= W2 then loop prev else (* If W2=W3, we never reach here *) stop () end fun markStatement stmt = case stmt of Statement.T { exp = Exp.PrimApp { args, prim, targs=_ }, ty = _, var = SOME v } => (case prim of Prim.Word_extdToWord a => rules v (a, Vector.first args) | _ => ()) | _ => () fun mapStatement stmt = let val Statement.T { exp, ty, var } = stmt val exp = case Option.map (var, get) of SOME (SOME (prim as (W2, W3, _), x2)) => if WordSize.equals (W2, W3) then Exp.Var x2 else Exp.PrimApp { args = Vector.new1 x2, prim = Prim.Word_extdToWord prim, targs = Vector.new0 () } | _ => exp in Statement.T { exp = exp, ty = ty, var = var } end fun transform program = let val Program.T { datatypes, functions, globals, main } = program val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let (* Traverse blocks in dfs order, marking their statements *) fun markBlock (Block.T {statements, ... }) = (Vector.foreach (statements, markStatement); fn () => ()) val () = Function.dfs (f, markBlock) (* Map the statements using the marks *) val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f fun mapBlock block = let val Block.T {args, label, statements, transfer} = block in Block.T {args = args, label = label, statements = Vector.map (statements, mapStatement), transfer = transfer} end val f = Function.new {args = args, blocks = Vector.map (blocks, mapBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val f = shrink f in f end) val () = Vector.foreach (globals, Statement.clear) in Program.T { datatypes = datatypes, functions = functions, globals = globals, main = main } end end mlton-20210117+dfsg/mlton/ssa/common-arg.fun000066400000000000000000000212631416264345000205220ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CommonArg (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Graph = DirectedGraph structure Node = Graph.Node structure VarInfo = struct datatype t = T of {node: unit DirectedGraph.Node.t} fun layout lNode (T {node, ...}) = let open Layout in record [("node", lNode node)] end local fun make f (T r) = f r in val node = make #node end fun new node = T {node = node} end structure NodeInfo = struct datatype t = T of {var: Var.t} local fun make f (T r) = f r in val var = make #var end fun new var = T {var = var} end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = nodeInfo: unit Node.t -> NodeInfo.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("CommonArg.nodeInfo", Node.layout)) val nodeInfo = Trace.trace ("CommonArg.nodeInfo", Layout.ignore, Layout.ignore) nodeInfo val {get = labelArgs: Label.t -> (Var.t * Type.t) vector, set = setLabelArgs, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CommonArg.labelArgs", Label.layout)) val labelArgs = Trace.trace ("CommonArg.labelArgs", Layout.ignore, Layout.ignore) labelArgs (* Argument flow graph. *) val G = Graph.new () val root = Graph.newNode G fun newNode (v: Var.t): unit Node.t = let val node = Graph.newNode G val () = setNodeInfo (node, NodeInfo.new v) in node end fun newRootedNode v = let val node = newNode v val _ = Graph.addEdge (G, {from = root, to = node}) in node end val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (VarInfo.new o newRootedNode)) val varInfo = Trace.trace ("CommonArg.varInfo", Layout.ignore, Layout.ignore) varInfo val varNode = VarInfo.node o varInfo (* Analyze *) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f val () = Vector.foreach (blocks, fn Block.T {label, args, ...} => (setLabelArgs (label, args) ; Vector.foreach (args, fn (v, _) => setVarInfo (v, VarInfo.new (newNode v))))) (* Flow Transfer.Goto arguments. *) fun flowVarVar (v, v'): unit = ignore (Graph.addEdge (G, {from = varNode v, to = varNode v'})) fun flowVarVarTy (v, (v', _)) = flowVarVar (v, v') fun flowVarsVarTys (vs, vts') = Vector.foreach2 (vs, vts', flowVarVarTy) fun flowVarsLabelArgs (vs, l) = flowVarsVarTys (vs, labelArgs l) (* Visit in unknown contexts. *) fun visitVar v = ignore (Graph.addEdge (G, {from = root, to = varNode v})) fun visitVarTy (v, _) = visitVar v fun visitArgs args = Vector.foreach (args, visitVarTy) fun visitLabelArgs l = visitArgs (labelArgs l) in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Bug => () | Call {return, ...} => (case return of Return.NonTail {cont, handler} => (visitLabelArgs cont ; (case handler of Handler.Handle hand => visitLabelArgs hand | _ => ())) | _ => ()) | Case {cases, default, ...} => (Cases.foreach (cases, visitLabelArgs) ; Option.app (default, visitLabelArgs)) | Goto {dst, args} => flowVarsLabelArgs (args, dst) | Raise _ => () | Return _ => () | Runtime {return, ...} => visitLabelArgs return) end) val () = Graph.removeDuplicateEdges G val {idom} = Graph.dominators (G, {root = root}) fun getVar (v: Var.t): Var.t = case idom (varNode v) of Graph.Idom parent => if Node.equals (parent, root) then v else NodeInfo.var (nodeInfo parent) | Graph.Unreachable => v | Graph.Root => v fun keepVar v = Var.equals (v, getVar v) (* Diagnostics *) val () = Control.diagnostics (fn display => List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f open Layout fun lNode n = record [("idom", case idom n of Graph.Idom parent => if Node.equals (parent, root) then str "root" else Var.layout (NodeInfo.var (nodeInfo parent)) | _ => str "???")] in display (seq [str "\n", Func.layout name]) ; (Vector.foreach (blocks, fn Block.T {args, label, ...} => if Vector.exists (args, not o keepVar o #1) then display (seq [Label.layout label, str " ", Vector.layout (fn (v, _) => seq [Var.layout v, str ": ", VarInfo.layout lNode (varInfo v)]) args]) else ())) end)) (* Transform *) val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, start, raises, returns} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val {yes = args, no = rems} = Vector.partition (args, keepVar o #1) val statements = if Vector.isEmpty rems then statements else Vector.concat [Vector.map (rems, fn (v, ty) => Statement.T {var = SOME v, ty = ty, exp = Var (getVar v)}), statements] val transfer = case transfer of Goto {args, dst} => let val args = Vector.keepAllMap2 (args, labelArgs dst, fn (arg, (v, _)) => if keepVar v then SOME arg else NONE) in Goto {args = args, dst = dst} end | _ => transfer in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, start = start, raises = raises, returns = returns}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/common-block.fun000066400000000000000000000154451416264345000210500ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CommonBlock (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer fun transform (Program.T {globals, datatypes, functions, main}) = let val shrink = shrinkFunction {globals = globals} local fun make transfer = let val l = Label.newNoname () in Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = transfer} end in fun makeRaise var = make (Raise (Vector.new1 var)) fun makeReturn var = make (Return (Vector.new1 var)) fun makeGoto (dst, var) = make (Goto {dst = dst, args = Vector.new1 var}) end fun makeNullaryGoto dst = Goto {dst = dst, args = Vector.new0 ()} val {get = varInfo: Var.t -> {returner: (Func.t * Label.t) option ref, raiser: (Func.t * Label.t) option ref, gotoers: (Func.t * (Label.t * Label.t) list ref) option ref} option, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) val _ = Vector.foreach (globals, fn Statement.T {var, ...} => setVarInfo(valOf var, SOME {returner = ref NONE, raiser = ref NONE, gotoers = ref NONE})) fun eliminateFunction f = let val {args, blocks, mayInline, name, returns, raises, start} = Function.dest f val newBlocks = ref [] local fun common (sel, make) var = case varInfo var of NONE => NONE | SOME varInfo => let val c = sel varInfo fun install () = let val b = make var val l = Block.label b in List.push(newBlocks, b) ; c := SOME (name, l) ; SOME l end in case !c of NONE => install () | SOME (name', l') => if Func.equals(name, name') then SOME l' else install () end in val commonReturner = common (#returner, makeReturn) val commonRaiser = common (#raiser, makeRaise) end fun commonGotoers (k, var) = case varInfo var of NONE => NONE | SOME {gotoers, ...} => let fun install info = let val b = makeGoto (k, var) val l = Block.label b in List.push(newBlocks, b) ; List.push(info, (k, l)) ; SOME l end fun install' () = let val info = ref [] in gotoers := SOME (name, info); install info end in case !gotoers of NONE => install' () | SOME (name', info') => if Func.equals(name, name') then case List.peek (!info', fn (k', _) => Label.equals(k', k)) of NONE => install info' | SOME (_, l') => SOME l' else install' () end val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let val doit = fn SOME l => makeNullaryGoto l | NONE => transfer val transfer = if Vector.isEmpty statements then case transfer of Goto {dst, args = xs} => if Vector.length xs = 1 then doit (commonGotoers (dst, Vector.first xs)) else transfer | Return xs => if Vector.length xs = 1 then doit (commonReturner (Vector.first xs)) else transfer | Raise xs => if Vector.length xs = 1 then doit (commonRaiser (Vector.first xs)) else transfer | _ => transfer else transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!newBlocks), blocks] in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/common-subexp.fun000066400000000000000000000314371416264345000212630ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CommonSubexp (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer fun transform (Program.T {globals, datatypes, functions, main}) = let (* Keep track of control-flow specific cse's, * arguments, and in-degree of blocks. *) val {get = labelInfo: Label.t -> {add: (Var.t * Exp.t) list ref, args: (Var.t * Type.t) vector, inDeg: int ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) (* Keep track of a total ordering on variables. *) val {get = varIndex : Var.t -> int, set = setVarIndex, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("varIndex", Var.layout)) val setVarIndex = let val c = Counter.generator 0 in fn x => setVarIndex (x, c ()) end (* Keep track of the replacements of variables. *) val {get = replace: Var.t -> Var.t option, set = setReplace, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) (* Keep track of the variable that holds the length of arrays (and * vectors and strings). *) val {get = getLength: Var.t -> Var.t option, set = setLength, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun canonVar x = case replace x of NONE => x | SOME y => y fun canonVars xs = Vector.map (xs, canonVar) (* Canonicalize an Exp. * Replace vars with their replacements. * Put commutative arguments in canonical order. *) fun canon (e: Exp.t): Exp.t = case e of ConApp {con, args} => ConApp {con = con, args = canonVars args} | Const _ => e | PrimApp {prim, targs, args} => let fun doit args = PrimApp {prim = prim, targs = targs, args = args} val args = canonVars args fun arg i = Vector.sub (args, i) fun canon2 () = let val a0 = arg 0 val a1 = arg 1 in if varIndex a0 >= varIndex a1 then (a0, a1) else (a1, a0) end in if Prim.isCommutative prim then doit (Vector.new2 (canon2 ())) else if (case prim of Prim.IntInf_add => true | Prim.IntInf_andb => true | Prim.IntInf_gcd => true | Prim.IntInf_mul => true | Prim.IntInf_orb => true | Prim.IntInf_xorb => true | _ => false) then let val (a0, a1) = canon2 () in doit (Vector.new3 (a0, a1, arg 2)) end else doit args end | Select {tuple, offset} => Select {tuple = canonVar tuple, offset = offset} | Tuple xs => Tuple (canonVars xs) | Var x => Var (canonVar x) | _ => e (* Keep a hash table of canonicalized Exps that are in scope. *) val table: (Exp.t, Var.t) HashTable.t = HashTable.new {hash = Exp.hash, equals = Exp.equals} fun lookup (var, exp) = HashTable.lookupOrInsert (table, exp, fn () => var) fun doitStatements (statements, remove) = Vector.keepAllMap (statements, fn Statement.T {var, ty, exp} => let val exp = canon exp fun keep () = SOME (Statement.T {var = var, ty = ty, exp = exp}) in case var of NONE => keep () | SOME var => let val _ = setVarIndex var fun replace var' = (setReplace (var, SOME var'); NONE) fun doit () = let val var' = lookup (var, exp) in if Var.equals(var, var') then (List.push (remove, (exp, var')) ; keep ()) else replace var' end in case exp of PrimApp ({args, prim, ...}) => let fun arg () = Vector.first args fun knownLength var' = let val _ = setLength (var, SOME var') in keep () end fun conv () = case getLength (arg ()) of NONE => keep () | SOME var' => knownLength var' fun length () = case getLength (arg ()) of NONE => doit () | SOME var' => replace var' in case prim of Prim.Array_alloc _ => knownLength (arg ()) | Prim.Array_length => length () | Prim.Array_toArray => conv () | Prim.Array_toVector => conv () | Prim.Vector_length => length () | _ => if Prim.isFunctional prim then doit () else keep () end | _ => doit () end end) (* All of the globals are in scope, and never go out of scope. *) val globals = doitStatements (globals, ref []) fun doitTree tree = let val blocks = ref [] fun loop (Tree.T (Block.T {args, label, statements, transfer}, children)): unit = let fun diag s = Control.diagnostics (fn display => let open Layout in display (seq [Label.layout label, str ": ", str s]) end) val _ = diag "started" val remove = ref [] val {add, ...} = labelInfo label val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "add: ", List.layout (fn (var,exp) => seq [Var.layout var, str ": ", Exp.layout exp]) (!add)]) end) val _ = List.foreach (!add, fn (var, exp) => let val var' = lookup (var, exp) val _ = if Var.equals(var, var') then List.push (remove, (exp, var')) else () in () end) val _ = diag "added" val _ = Vector.foreach (args, fn (var, _) => setVarIndex var) val statements = doitStatements (statements, remove) val _ = diag "statements" val transfer = Transfer.replaceVar (transfer, canonVar) val transfer = case transfer of Goto {dst, args} => let val {args = args', inDeg, ...} = labelInfo dst in if !inDeg = 1 then (Vector.foreach2 (args, args', fn (var, (var', _)) => setReplace (var', SOME var)) ; transfer) else transfer end | _ => transfer val _ = diag "transfer" val block = Block.T {args = args, label = label, statements = statements, transfer = transfer} val _ = List.push (blocks, block) val _ = Vector.foreach (children, loop) val _ = diag "children" val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "remove: ", List.layout (fn (exp, var) => seq [Var.layout var, str ": ", Exp.layout exp]) (!remove)]) end) val _ = List.foreach (!remove, fn (exp, var) => HashTable.removeWhen (table, exp, fn var' => Var.equals (var, var'))) val _ = diag "removed" in () end val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "starting loop"]) end) val _ = loop tree val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "finished loop"]) end) in Vector.fromList (!blocks) end val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (args, fn (var, _) => setVarIndex var) val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => (setLabelInfo (label, {add = ref [], args = args, inDeg = ref 0}))) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, fn label' => Int.inc (#inDeg (labelInfo label')))) val blocks = doitTree (Function.dominatorTree f) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/constant-propagation.fun000066400000000000000000001631331416264345000226400ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Invariant: Created globals only refer to other globals. * Hence, the newly created globals may appear at the * beginning of the program. * * Circular abstract values can arise as a result of programs like: * datatype t = T of t * fun f () = T (f ()) * val _ = f () * There is special code in printing abstract values and in determining whether * they are global in order to avoid infinite loops. *) functor ConstantPropagation (S: SSA_TRANSFORM_STRUCTS) : SSA_TRANSFORM = struct open S structure Multi = Multi (S) structure Global = Global (S) structure Graph = DirectedGraph structure Node = Graph.Node structure Size = TwoPointLattice (val bottom = "small" val top = "large") structure Sconst = Const open Exp Transfer structure Value = struct datatype global = NotComputed | No | Yes of Var.t structure Const = struct datatype t = T of {const: const ref, coercedTo: t list ref} and const = Const of Const.t | Undefined (* no possible value *) | Unknown (* many possible values *) fun layout (T {const, ...}) = layoutConst (!const) and layoutConst c = let open Layout in case c of Const c => Const.layout c | Undefined => str "undefined constant" | Unknown => str "unknown constant" end fun new c = T {const = ref c, coercedTo = ref []} fun equals (T {const = r, ...}, T {const = r', ...}) = r = r' val equals = Trace.trace2 ("ConstantPropagation.Value.Const.equals", layout, layout, Bool.layout) equals val const = new o Const fun undefined () = new Undefined fun unknown () = new Unknown fun makeUnknown (T {const, coercedTo}): unit = case !const of Unknown => () | _ => (const := Unknown ; List.foreach (!coercedTo, makeUnknown) ; coercedTo := []) val makeUnknown = Trace.trace ("ConstantPropagation.Value.Const.makeUnknown", layout, Unit.layout) makeUnknown fun send (c: t, c': const): unit = let fun loop (c as T {const, coercedTo}) = case (c', !const) of (_, Unknown) => () | (_, Undefined) => (const := c' ; List.foreach (!coercedTo, loop)) | (Const c', Const c'') => if Const.equals (c', c'') then () else makeUnknown c | _ => makeUnknown c in loop c end val send = Trace.trace2 ("ConstantPropagation.Value.Const.send", layout, layoutConst, Unit.layout) send fun coerce {from = from as T {const, coercedTo}, to: t}: unit = if equals (from, to) then () else let fun push () = List.push (coercedTo, to) in case !const of c as Const _ => (push (); send (to, c)) | Undefined => push () | Unknown => makeUnknown to end val coerce = Trace.trace ("ConstantPropagation.Value.Const.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) coerce fun unify (c, c') = (coerce {from = c, to = c'} ; coerce {from = c', to = c}) val unify = Trace.trace2 ("ConstantPropagation.Value.Const.unify", layout, layout, Unit.layout) unify end structure One = struct datatype 'a t = T of {extra: 'a, global: Var.t option ref} local fun make f (T r) = f r in val global = fn z => make #global z end fun layout (one: 'a t): Layout.t = Layout.record [("global", Option.layout Var.layout (! (global one)))] fun new (a: 'a): 'a t = T {extra = a, global = ref NONE} val equals: 'a t * 'a t -> bool = fn (n, n') => global n = global n' end structure Place = struct datatype 'a t = One of 'a One.t | Undefined | Unknown val toString = fn One _ => "One" | Undefined => "Undefined" | Unknown => "Unknown" fun layout b = Layout.str (toString b) end structure Birth = struct datatype 'a t = T of {coercedTo: 'a t list ref, place: 'a Place.t ref} fun layout (T {place, ...}) = Place.layout (!place) fun equals (T {place = r, ...}, T {place = r', ...}) = r = r' fun new p = T {place = ref p, coercedTo = ref []} fun undefined (): 'a t = new Place.Undefined fun unknown (): 'a t = new Place.Unknown fun here (a: 'a): 'a t = new (Place.One (One.new a)) val traceMakeUnknown = Trace.info "ConstantPropagation.Value.Birth.makeUnknown" fun makeUnknown arg = Trace.traceInfo' (traceMakeUnknown, layout, Unit.layout) (fn T {place, coercedTo, ...} => case !place of Place.Unknown => () | _ => (place := Place.Unknown ; List.foreach (!coercedTo, makeUnknown) ; coercedTo := [])) arg val traceSend = Trace.info "ConstantPropagation.Value.Birth.send" fun send arg = Trace.traceInfo' (traceSend, Layout.tuple2 (layout, One.layout), Unit.layout) (fn (b, one) => let fun loop (b as T {place, coercedTo, ...}) = case !place of Place.Undefined => (place := Place.One one ; List.foreach (!coercedTo, loop)) | Place.One one' => if One.equals (one, one') then () else makeUnknown b | Place.Unknown => () in loop b end) arg val traceCoerce = Trace.info "ConstantPropagation.Value.Birth.coerce" fun coerce arg = Trace.traceInfo' (traceCoerce, fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) (fn {from = from as T {place, coercedTo, ...}, to} => if equals (from, to) then () else let fun push () = List.push (coercedTo, to) in case !place of Place.Unknown => makeUnknown to | Place.One one => (push (); send (to, one)) | Place.Undefined => push () end) arg val traceUnify = Trace.info "ConstantPropagation.Value.Birth.unify" fun unify arg = Trace.traceInfo' (traceUnify, Layout.tuple2 (layout, layout), Unit.layout) (fn (c, c') => (coerce {from = c, to = c'} ; coerce {from = c', to = c})) arg end structure Raw = struct datatype t = T of {coercedTo: t list ref, raw: raw ref} and raw = Raw of bool | Undefined (* no possible value *) | Unknown (* many possible values *) fun layout (T {raw, ...}) = layoutRaw (!raw) and layoutRaw r = let open Layout in case r of Raw b => Bool.layout b | Undefined => str "undefined raw" | Unknown => str "unknown raw" end fun new r = T {coercedTo = ref [], raw = ref r} fun equals (T {raw = r1, ...}, T {raw = r2, ...}) = r1 = r2 val equals = Trace.trace2 ("ConstantPropagation.Value.Raw.equals", layout, layout, Bool.layout) equals val raw = new o Raw fun undefined () = new Undefined fun unknown () = new Unknown fun makeUnknown (T {coercedTo, raw}): unit = case !raw of Unknown => () | _ => (raw := Unknown ; List.foreach (!coercedTo, makeUnknown) ; coercedTo := []) val makeUnknown = Trace.trace ("ConstantPropagation.Value.Raw.makeUnknown", layout, Unit.layout) makeUnknown fun send (r: t, r': raw): unit = let fun loop (r as T {coercedTo, raw}) = case (r', !raw) of (_, Unknown) => () | (_, Undefined) => (raw := r' ; List.foreach (!coercedTo, loop)) | (Raw b', Raw b'') => if b' = b'' then () else makeUnknown r | _ => makeUnknown r in loop r end val send = Trace.trace2 ("ConstantPropagation.Value.Raw.send", layout, layoutRaw, Unit.layout) send fun coerce {from = from as T {coercedTo, raw}, to: t}: unit = if equals (from, to) then () else let fun push () = List.push (coercedTo, to) in case !raw of r as Raw _ => (push (); send (to, r)) | Undefined => push () | Unknown => makeUnknown to end val coerce = Trace.trace ("ConstantPropagation.Value.Raw.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) coerce fun unify (r, r') = (coerce {from = r, to = r'} ; coerce {from = r', to = r}) val unify = Trace.trace2 ("ConstantPropagation.Value.Raw.unify", layout, layout, Unit.layout) unify end structure Set = DisjointSet structure Unique = UniqueId () datatype t = T of {global: global ref, ty: Type.t, value: value} Set.t and value = Array of {birth: unit Birth.t, elt: t, length: t, raw: Raw.t} | Const of Const.t | Datatype of data | Ref of {arg: t, birth: {init: t} Birth.t} | Tuple of t vector | Vector of {elt: t, length: t} | Weak of t and data = Data of {coercedTo: data list ref, filters: {args: t vector, con: Con.t} list ref, value: dataVal ref} and dataVal = ConApp of {args: t vector, con: Con.t, uniq: Unique.t} | Undefined | Unknown local fun make sel (T s) = sel (Set.! s) in val value = make #value val ty = make #ty end fun deConst v = case value v of Const (Const.T {const, ...}) => (case !const of Const.Const c => SOME c | _ => NONE) | _ => NONE local open Layout in fun layout v = case value v of Array {birth, elt, length, raw, ...} => seq [str "array ", tuple [Birth.layout birth, layout length, layout elt, Raw.layout raw]] | Const c => Const.layout c | Datatype d => layoutData d | Ref {arg, birth, ...} => seq [str "ref ", tuple [layout arg, Birth.layout birth]] | Tuple vs => Vector.layout layout vs | Vector {elt, length, ...} => seq [str "vector ", tuple [layout elt, layout length]] | Weak v => seq [str "weak ", layout v] and layoutData (Data {value, ...}) = case !value of Undefined => str "undefined datatype" | ConApp {con, uniq, ...} => record [("con", Con.layout con), ("uniq", Unique.layout uniq)] (* Can't layout the args because there may be a circularity *) | Unknown => str "unknown datatype" end fun equals (T s, T s') = Set.equals (s, s') val equals = Trace.trace2 ("ConstantPropagation.Value.equals", layout, layout, Bool.layout) equals fun globals arg: (Var.t * Type.t) vector option = Trace.trace ("ConstantPropagation.Value.globals", (Vector.layout layout) o #1, Option.layout (Vector.layout (Var.layout o #1))) (fn (vs: t vector, isSmallType, newGlobal) => Exn.withEscape (fn escape => SOME (Vector.map (vs, fn v => case global (v, isSmallType, newGlobal) of NONE => escape NONE | SOME g => g)))) arg and global arg: (Var.t * Type.t) option = Trace.trace ("ConstantPropagation.Value.global", layout o #1, Option.layout (Var.layout o #1)) (fn (v as T s, isSmallType, newGlobal) => let val {global = r, ty, value} = Set.! s in case !r of No => NONE | Yes g => SOME (g, ty) | NotComputed => let val global = fn v => global (v, isSmallType, newGlobal) val globals = fn vs => globals (vs, isSmallType, newGlobal) (* avoid globalizing circular abstract values *) val _ = r := No fun yes e = Yes (newGlobal (ty, e)) fun unary (Birth.T {place, ...}, makeInit: 'a -> t, primApp: {targs: Type.t vector, args: Var.t vector} -> Exp.t, targ: Type.t) = case (!place, isSmallType targ) of (Place.One (One.T {global = glob, extra, ...}), true) => let val init = makeInit extra in case global init of SOME (x, _) => Yes (case !glob of NONE => let val exp = primApp {targs = Vector.new1 targ, args = Vector.new1 x} val g = newGlobal (ty, exp) in glob := SOME g; g end | SOME g => g) | _ => No end | _ => No val g = case value of Array {birth, length, raw = Raw.T {raw, ...}, ...} => if !Control.globalizeArrays then unary (birth, fn _ => length, fn {args, targs} => case !raw of Raw.Raw raw => Exp.PrimApp {args = args, prim = Prim.Array_alloc {raw = raw}, targs = targs} | _ => Error.bug "ConstantPropagation.Value.global: Array, raw", Type.deArray ty) else No | Const (Const.T {const, ...}) => (case !const of Const.Const c => yes (Exp.Const c) | _ => No) | Datatype (Data {value, ...}) => (case !value of ConApp {args, con, ...} => (case globals args of NONE => No | SOME args => yes (Exp.ConApp {con = con, args = Vector.map (args, #1)})) | _ => No) | Ref {birth, ...} => if !Control.globalizeRefs then unary (birth, fn {init} => init, fn {args, targs} => Exp.PrimApp {args = args, prim = Prim.Ref_ref, targs = targs}, Type.deRef ty) else No | Tuple vs => (case globals vs of NONE => No | SOME xts => yes (Exp.Tuple (Vector.map (xts, #1)))) | Vector {elt, length} => (case Option.map (deConst length, S.Const.deWord) of NONE => No | SOME length => let val length = WordX.toInt length val eltTy = Type.deVector ty fun mkVec args = yes (Exp.PrimApp {args = args, prim = Prim.Vector_vector, targs = Vector.new1 eltTy}) fun mkConst (ws, elts) = yes (Exp.Const (S.Const.wordVector (WordXVector.fromList ({elementSize = ws}, elts)))) in case (Option.map (deConst elt, S.Const.deWordOpt), global elt) of (SOME (SOME w), _) => mkConst (Type.deWord eltTy, List.new (length, w)) | (_, SOME (x, _)) => mkVec (Vector.new (length, x)) | _ => if length = 0 then case Type.deWordOpt eltTy of SOME ws => mkConst (ws, []) | NONE => mkVec (Vector.new0 ()) else No end) | Weak _ => No val _ = r := g in global v end end) arg fun new (v: value, ty: Type.t): t = T (Set.singleton {value = v, ty = ty, global = ref NotComputed}) fun tuple vs = new (Tuple vs, Type.tuple (Vector.map (vs, ty))) fun const' (c, ty) = new (Const c, ty) fun const c = let val c' = Const.const c in new (Const c', Type.ofConst c) end fun constToEltLength (c, err) = let val v = case c of Sconst.WordVector v => v | _ => Error.bug err val length = WordXVector.length v val eltTy = Type.word (WordXVector.elementSize v) val elt = if 0 = length then const' (Const.unknown (), eltTy) else let val w = WordXVector.sub (v, 0) in if WordXVector.forall (v, fn w' => WordX.equals (w, w')) then const (Sconst.word w) else const' (Const.unknown (), eltTy) end val length = const (Sconst.Word (WordX.fromInt (length, WordSize.seqIndex ()))) in {elt = elt, length = length} end local fun make (err, sel) v = case value v of Vector fs => sel fs | Const (Const.T {const = ref (Const.Const c), ...}) => sel (constToEltLength (c, err)) | _ => Error.bug err in val devector = make ("ConstantPropagation.Value.devector", #elt) val vectorLength = make ("ConstantPropagation.Value.vectorLength", #length) end local fun make (err, sel) v = case value v of Array fs => sel fs | _ => Error.bug err in val dearray = make ("ConstantPropagation.Value.dearray", #elt) val arrayLength = make ("ConstantPropagation.Value.arrayLength", #length) val arrayBirth = make ("ConstantPropagation.Value.arrayBirth", #birth) val arrayRaw = make ("ConstantPropagation.Value.arrayRaw", #raw) end fun arrayFromArray (T s: t): t = let val {value, ty, ...} = Set.! s in case value of Array {elt, length, ...} => new (Array {birth = Birth.unknown (), elt = elt, length = length, raw = Raw.raw false}, ty) | _ => Error.bug "ConstantPropagation.Value.arrayFromArray" end fun vectorFromArray (T s: t): t = let val {value, ty, ...} = Set.! s in case value of Array {elt, length, ...} => new (Vector {elt = elt, length = length}, Type.vector (Type.deArray ty)) | _ => Error.bug "ConstantPropagation.Value.vectorFromArray" end local fun make (err, sel) v = case value v of Ref fs => sel fs | _ => Error.bug err in val deref = make ("ConstantPropagation.Value.deref", #arg) val refBirth = make ("ConstantPropagation.Value.refBirth", #birth) end fun deweak v = case value v of Weak v => v | _ => Error.bug "ConstantPropagation.Value.deweak" structure Data = struct datatype t = datatype data val layout = layoutData local fun make v () = Data {value = ref v, coercedTo = ref [], filters = ref []} in val undefined = make Undefined val unknown = make Unknown end end local (* The extra birth is because of let-style polymorphism. * arrayBirth is really the same as refBirth. *) fun make (const, data, refBirth, arrayBirth, raw) = let fun loop (t: Type.t): t = new (case Type.dest t of Type.Array t => Array {birth = arrayBirth (), elt = loop t, length = loop (Type.word (WordSize.seqIndex ())), raw = raw ()} | Type.Datatype _ => Datatype (data ()) | Type.Ref t => Ref {arg = loop t, birth = refBirth ()} | Type.Tuple ts => Tuple (Vector.map (ts, loop)) | Type.Vector t => Vector {elt = loop t, length = loop (Type.word (WordSize.seqIndex ()))} | Type.Weak t => Weak (loop t) | _ => Const (const ()), t) in loop end in val fromType = make (Const.undefined, Data.undefined, Birth.undefined, Birth.undefined, Raw.undefined) val unknown = make (Const.unknown, Data.unknown, Birth.unknown, Birth.unknown, Raw.unknown) end fun select {tuple, offset, resultType = _} = case value tuple of Tuple vs => Vector.sub (vs, offset) | _ => Error.bug "ConstantPropagation.Value.select: non-tuple" fun unit () = tuple (Vector.new0 ()) end val traceSendConApp = Trace.trace2 ("ConstantPropagation.sendConApp", Value.Data.layout, fn {con, args, uniq} => Layout.record [("con", Con.layout con), ("args", Vector.layout Value.layout args), ("uniq", Value.Unique.layout uniq)], Unit.layout) val traceSendConAppLoop = Trace.trace ("ConstantPropagation.sendConAppLoop", Value.Data.layout, Unit.layout) val traceMakeDataUnknown = Trace.trace ("ConstantPropagation.makeDataUnknown", Value.Data.layout, Unit.layout) (* ------------------------------------------------- *) (* simplify *) (* ------------------------------------------------- *) fun transform (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program val {varIsMultiDefed, ...} = Multi.multi program val once = not o varIsMultiDefed val {get = conInfo: Con.t -> {result: Type.t, types: Type.t vector, values: Value.t vector}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conInfo", Con.layout)) val conValues = #values o conInfo val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {result = result, types = args, values = Vector.map (args, Value.fromType)})) end) local open Value in val traceCoerce = Trace.trace ("ConstantPropagation.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) fun makeDataUnknown arg: unit = traceMakeDataUnknown (fn Data {value, coercedTo, filters, ...} => let fun doit () = (value := Unknown ; List.foreach (!coercedTo, makeDataUnknown) ; coercedTo := [] ; (List.foreach (!filters, fn {con, args} => coerces {froms = conValues con, tos = args}))) in case !value of ConApp _ => doit () | Undefined => doit () | Unknown => () end) arg and sendConApp arg: unit = traceSendConApp (fn (d: data, ca as {con, args, uniq}) => let val v = ConApp ca fun loop arg: unit = traceSendConAppLoop (fn Data {value, coercedTo, filters, ...} => case !value of Unknown => () | Undefined => (value := v ; List.foreach (!coercedTo, loop) ; (List.foreach (!filters, fn {con = con', args = args'} => if Con.equals (con, con') then coerces {froms = args, tos = args'} else ()))) | ConApp {con = con', uniq = uniq', ...} => if Unique.equals (uniq, uniq') orelse (Con.equals (con, con') andalso Vector.isEmpty args) then () else makeDataUnknown d) arg in loop d end) arg and coerces {froms: Value.t vector, tos: Value.t vector} = Vector.foreach2 (froms, tos, fn (from, to) => coerce {from = from, to = to}) and coerce arg = traceCoerce (fn {from, to} => if equals (from, to) then () else let fun error () = Error.bug (concat ["ConstantPropagation.Value.coerce: strange: from: ", Layout.toString (Value.layout from), " to: ", Layout.toString (Value.layout to)]) in case (value from, value to) of (Const from, Const to) => Const.coerce {from = from, to = to} | (Datatype from, Datatype to) => coerceData {from = from, to = to} | (Ref {birth, arg}, Ref {birth = b', arg = a'}) => (Birth.coerce {from = birth, to = b'} ; unify (arg, a')) | (Array {birth = b, length = n, elt = x, raw = r}, Array {birth = b', length = n', elt = x', raw = r'}) => (Birth.coerce {from = b, to = b'} ; coerce {from = n, to = n'} ; unify (x, x') ; Raw.coerce {from = r, to = r'}) | (Vector {length = n, elt = x}, Vector {length = n', elt = x'}) => (coerce {from = n, to = n'} ; coerce {from = x, to = x'}) | (Tuple vs, Tuple vs') => coerces {froms = vs, tos = vs'} | (Weak v, Weak v') => unify (v, v') | (Const (Const.T {const = ref (Const.Const c), ...}), Vector {elt, length}) => let val {elt = elt', length = length'} = Value.constToEltLength (c, "coerce") in coerce {from = elt', to = elt} ; coerce {from = length', to = length} end | (_, _) => error () end) arg and unify (T s: t, T s': t): unit = if Set.equals (s, s') then () else let val {value, ...} = Set.! s val {value = value', ...} = Set.! s' fun error () = Error.bug (concat ["ConstantPropagation.Value.unify: strange: value: ", Layout.toString (Value.layout (T s)), " value': ", Layout.toString (Value.layout (T s'))]) in Set.union (s, s') ; case (value, value') of (Const c, Const c') => Const.unify (c, c') | (Datatype d, Datatype d') => unifyData (d, d') | (Ref {birth, arg}, Ref {birth = b', arg = a'}) => (Birth.unify (birth, b') ; unify (arg, a')) | (Array {birth = b, length = n, elt = x, raw = r}, Array {birth = b', length = n', elt = x', raw = r'}) => (Birth.unify (b, b') ; unify (n, n') ; unify (x, x') ; Raw.unify (r, r')) | (Vector {length = n, elt = x}, Vector {length = n', elt = x'}) => (unify (n, n') ; unify (x, x')) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unify) | (Weak v, Weak v') => unify (v, v') | _ => error () end and unifyData (d, d') = (coerceData {from = d, to = d'} ; coerceData {from = d', to = d}) and coerceData {from = Data {value, coercedTo, ...}, to} = case !value of ConApp ca => (List.push (coercedTo, to) ; sendConApp (to, ca)) | Undefined => List.push (coercedTo, to) | Unknown => makeDataUnknown to fun conApp {con: Con.t, args: t vector}: t = let val {values = tos, result, ...} = conInfo con in coerces {froms = args, tos = tos} ; new (Datatype (Data {value = ref (ConApp {con = con, args = args, uniq = Unique.new ()}), coercedTo = ref [], filters = ref []}), result) end fun makeUnknown (v: t): unit = case value v of Array {length, elt, ...} => (makeUnknown length ; makeUnknown elt) | Const c => Const.makeUnknown c | Datatype d => makeDataUnknown d | Ref {arg, ...} => makeUnknown arg | Tuple vs => Vector.foreach (vs, makeUnknown) | Vector {length, elt} => (makeUnknown length ; makeUnknown elt) | Weak v => makeUnknown v fun sideEffect (v: t): unit = case value v of Array {elt, ...} => makeUnknown elt | Const _ => () | Datatype _ => () | Ref {arg, ...} => makeUnknown arg | Vector {elt, ...} => makeUnknown elt | Tuple vs => Vector.foreach (vs, sideEffect) | Weak v => makeUnknown v fun primApp {prim, targs = _, args: Value.t vector, resultVar, resultType}: t = let fun bear z = case resultVar of SOME resultVar => if once resultVar then Birth.here z else Birth.unknown () | _ => Error.bug "ConstantPropagation.Value.primApp.bear" fun update (a, v) = (coerce {from = v, to = dearray a} ; unit ()) fun arg i = Vector.sub (args, i) fun array (raw, length, birth) = let val a = fromType resultType val _ = coerce {from = length, to = arrayLength a} val _ = Birth.coerce {from = birth, to = arrayBirth a} val _ = Raw.coerce {from = Raw.raw raw, to = arrayRaw a} in a end fun vector () = let val v = fromType resultType val l = (const o S.Const.word o WordX.fromInt) (Vector.length args, WordSize.seqIndex ()) val _ = coerce {from = l, to = vectorLength v} val _ = Vector.foreach (args, fn arg => coerce {from = arg, to = devector v}) in v end in case prim of Prim.Array_alloc {raw} => array (raw, arg 0, bear ()) | Prim.Array_array => let val l = (const o S.Const.word o WordX.fromInt) (Vector.length args, WordSize.seqIndex ()) val a = array (false, l, bear ()) val _ = Vector.foreach (args, fn arg => coerce {from = arg, to = dearray a}) in a end | Prim.Array_copyArray => update (arg 0, dearray (arg 2)) | Prim.Array_copyVector => update (arg 0, devector (arg 2)) | Prim.Array_length => arrayLength (arg 0) | Prim.Array_sub => dearray (arg 0) | Prim.Array_toArray => arrayFromArray (arg 0) | Prim.Array_toVector => vectorFromArray (arg 0) | Prim.Array_update => update (arg 0, arg 2) | Prim.Ref_assign => (coerce {from = arg 1, to = deref (arg 0)}; unit ()) | Prim.Ref_deref => deref (arg 0) | Prim.Ref_ref => let val v = arg 0 val r = fromType resultType val _ = coerce {from = v, to = deref r} val _ = Birth.coerce {from = bear {init = v}, to = refBirth r} in r end | Prim.Vector_length => vectorLength (arg 0) | Prim.Vector_sub => devector (arg 0) | Prim.Vector_vector => vector () | Prim.Weak_get => deweak (arg 0) | Prim.Weak_new => let val w = fromType resultType val _ = coerce {from = arg 0, to = deweak w} in w end | _ => (if Prim.maySideEffect prim then Vector.foreach (args, sideEffect) else () ; unknown resultType) end fun filter (variant, con, args) = case value variant of Datatype (Data {value, filters, ...}) => let fun save () = List.push (filters, {con = con, args = args}) in case !value of Undefined => save () | Unknown => coerces {froms = conValues con, tos = args} | ConApp {con = con', args = args', ...} => ((* The save () has to happen before the coerces because * they may loop back and change the variant, which * would need to then change this value. *) save () ; if Con.equals (con, con') then coerces {froms = args', tos = args} else ()) end | _ => Error.bug "ConstantPropagation.Value.filter: non-datatype" end fun filterIgnore _ = () val {value, ...} = Control.trace (Control.Detail, "fixed point") analyze { coerce = coerce, conApp = conApp, const = Value.const, filter = filter, filterWord = filterIgnore, fromType = Value.fromType, layout = Value.layout, primApp = primApp, program = program, select = Value.select, tuple = Value.tuple, useFromTypeOnBinds = false } val _ = Control.diagnostics (fn display => let open Layout in display (str "\n\nConstructors:") ; (Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (display (seq [Tycon.layout tycon, str ": "]) ; Vector.foreach (cons, fn {con, ...} => display (seq [Con.layout con, str ": ", Vector.layout Value.layout (conValues con)]))))) ; display (str "\n\nConstants:") ; (Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", Value.layout (value x)]))) end) fun mkIsSmallType n = let datatype t = datatype Type.dest in case n of 0 => {isSmallType = fn _ => false, destroyIsSmallType = fn () => ()} | 1 => let val {get: Type.t -> bool, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, get) => case Type.dest t of Array _ => false | CPointer => true | Datatype _ => false | IntInf => !Control.globalizeSmallIntInf | Real _ => true | Ref t => get t | Thread => false | Tuple ts => Vector.forall (ts, get) | Vector _ => false | Weak _ => true | Word _ => true)) in {isSmallType = get, destroyIsSmallType = destroy} end | 2 => let val {get = getTycon: Tycon.t -> bool, set = setTycon, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("ConstantPropagation.mkIsSmallType(2).getTycon", Tycon.layout)) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTycon (tycon, Vector.forall (cons, fn {args, ...} => Vector.isEmpty args))) val {get: Type.t -> bool, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, get) => case Type.dest t of Array _ => false | CPointer => true | Datatype tc => getTycon tc | IntInf => !Control.globalizeSmallIntInf | Real _ => true | Ref t => get t | Thread => false | Tuple ts => Vector.forall (ts, get) | Vector _ => false | Weak _ => true | Word _ => true)) in {isSmallType = get, destroyIsSmallType = destroy} end | 3 => let val {isSmallType, destroyIsSmallType} = mkIsSmallType 1 val {get = getTycon: Tycon.t -> bool, set = setTycon, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("ConstantPropagation.mkIsSmallType(3).getTycon", Tycon.layout)) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTycon (tycon, Vector.forall (cons, fn {args, ...} => Vector.forall (args, isSmallType)))) val () = destroyIsSmallType () val {get: Type.t -> bool, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, get) => case Type.dest t of Array _ => false | CPointer => true | Datatype tc => getTycon tc | IntInf => !Control.globalizeSmallIntInf | Real _ => true | Ref t => get t | Thread => false | Tuple ts => Vector.forall (ts, get) | Vector _ => false | Weak _ => true | Word _ => true)) in {isSmallType = get, destroyIsSmallType = destroy} end | 4 => let val {get = tyconSize: Tycon.t -> Size.t, ...} = Property.get (Tycon.plist, Property.initFun (fn _ => Size.new ())) (* Force (mutually) recursive datatypes to top. *) val {get = nodeTycon: unit Node.t -> Tycon.t, set = setNodeTycon, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeTycon", Node.layout)) val {get = tyconNode: Tycon.t -> unit Node.t, set = setTyconNode, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconNode", Tycon.layout)) val graph = Graph.new () val () = Vector.foreach (datatypes, fn Datatype.T {tycon, ...} => let val node = Graph.newNode graph val () = setTyconNode (tycon, node) val () = setNodeTycon (node, tycon) in () end) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val n = tyconNode tycon val {get = dependsOn, destroy = destroyDependsOn} = Property.destGet (Type.plist, Property.initRec (fn (t, dependsOn) => case Type.dest t of Array t => dependsOn t | Datatype tc => (ignore o Graph.addEdge) (graph, {from = n, to = tyconNode tc}) | Ref t => dependsOn t | Tuple ts => Vector.foreach (ts, dependsOn) | Vector t => dependsOn t | _ => ())) val () = Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, dependsOn)) val () = destroyDependsOn () in () end) val () = List.foreach (Graph.stronglyConnectedComponents graph, fn ns => let fun doit () = List.foreach (ns, fn n => Size.makeTop (tyconSize (nodeTycon n))) in case ns of [n] => if Node.hasEdge {from = n, to = n} then doit () else () | _ => doit () end) val {get = typeSize: Type.t -> Size.t, destroy = destroyTypeSize, ...} = Property.destGet (Type.plist, Property.initRec (fn (t, typeSize) => let val s = Size.new () fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) val () = case Type.dest t of Array _ => Size.makeTop s | CPointer => () | Datatype tc => Size.<= (tyconSize tc, s) | IntInf => if !Control.globalizeSmallIntInf then () else Size.makeTop s | Real _ => () | Ref t => dependsOn t | Thread => Size.makeTop s | Tuple ts => Vector.foreach (ts, dependsOn) | Vector _ => Size.makeTop s | Weak _ => () | Word _ => () in s end)) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val s = tyconSize tycon fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) val () = Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, dependsOn)) in () end) in {isSmallType = not o Size.isTop o typeSize, destroyIsSmallType = destroyTypeSize} end | 9 => {isSmallType = fn _ => true, destroyIsSmallType = fn () => ()} | _ => Error.bug "ConstantPropagation.mkIsSmallType" end val {isSmallType: Type.t -> bool, destroyIsSmallType: unit -> unit} = mkIsSmallType (!Control.globalizeSmallType) (* Walk through the program * - removing declarations whose rhs is constant * - replacing variables whose value is constant with globals * - building up the global decs *) val {new = newGlobal, all = allGlobals} = Global.make () fun maybeGlobal x = Value.global (value x, isSmallType, newGlobal) val maybeGlobal = Trace.trace ("ConstantPropagation.maybeGlobal", Var.layout, Option.layout (Var.layout o #1)) maybeGlobal fun replaceVar x = case maybeGlobal x of NONE => x | SOME (g, _) => g fun doitStatement (Statement.T {var, ty, exp}) = let fun keep () = SOME (Statement.T {var = var, ty = ty, exp = Exp.replaceVar (exp, replaceVar)}) in case var of NONE => keep () | SOME var => (case (maybeGlobal var, exp) of (NONE, _) => keep () | (SOME _, PrimApp {prim, ...}) => if Prim.maySideEffect prim then keep () else NONE | _ => NONE) end fun doitTransfer transfer = Transfer.replaceVar (transfer, replaceVar) fun doitBlock (Block.T {label, args, statements, transfer}) = Block.T {label = label, args = args, statements = Vector.keepAllMap (statements, doitStatement), transfer = doitTransfer transfer} fun doitFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f in Function.new {args = args, blocks = Vector.map (blocks, doitBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val functions = List.revMap (functions, doitFunction) val globals = Vector.keepAllMap (globals, doitStatement) val newGlobals = allGlobals () val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "\n\nNew Globals (", Int.layout (Vector.length newGlobals), str "):"]) ; (Vector.foreach (newGlobals, display o Statement.layout)) end) val globals = Vector.concat [newGlobals, globals] val shrink = shrinkFunction {globals = globals} val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, shrink), main = main} val _ = destroyIsSmallType () val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/contify.fun000066400000000000000000000756401416264345000201460ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * This pass is based on * Contification Using Dominators, by Fluet and Weeks. ICFP 2001. *) functor Contify (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Transfer structure Cont = struct type t = {cont: Label.t, handler: Handler.t} fun layout {cont, handler} = let open Layout in tuple2 (Label.layout, Handler.layout) (cont, handler) end end (* Return = {Uncalled, Unknown} U Cont U Func *) structure Areturn = struct datatype t = Uncalled | Unknown | Cont of Cont.t | Func of Func.t fun layout r = let open Layout in case r of Uncalled => str "Uncalled" | Unknown => str "Unknown" | Cont c => Cont.layout c | Func f => Func.layout f end end structure ContData = struct datatype t = T of {node: unit DirectedGraph.Node.t option ref, rootEdge: bool ref, prefixes: Func.t list ref} fun new () = T {node = ref NONE, rootEdge = ref false, prefixes = ref []} local fun make s = let fun S' (T r) = s r val S = ! o S' in (S', S) end in val (node', _) = make #node val (rootEdge', _) = make #rootEdge val (prefixes', prefixes) = make #prefixes end fun nodeReset (T {node, ...}) = node := NONE end structure FuncData = struct datatype t = T of {node: unit DirectedGraph.Node.t option ref, reach: bool ref, callers: {nontail: (Func.t * Cont.t) list ref, tail: Func.t list ref}, callees: {nontail: (Func.t * Cont.t) list ref, tail: Func.t list ref}, A: Areturn.t ref, prefixes: Func.t list ref, finished: bool ref, replace: {label: Label.t, blocks: Block.t list} option ref, contified: Block.t list list ref} fun new () = T {node = ref NONE, reach = ref false, callers = {nontail = ref [], tail = ref []}, callees = {nontail = ref [], tail = ref []}, A = ref Areturn.Uncalled, prefixes = ref [], finished = ref false, replace = ref NONE, contified = ref []} local fun make s = let fun S' (T r) = s r val S = ! o S' in (S', S) end fun make' s = let fun S' (T r) = s r in S' end in val (node', _) = make #node val (reach', reach) = make #reach val callers' = make' #callers val callees' = make' #callees val (_, A) = make #A val (prefixes', prefixes) = make #prefixes val (finished', _) = make #finished val (_, replace) = make #replace val (contified', contified) = make #contified end fun nodeReset (T {node, ...}) = node := NONE end structure ContFuncGraph = struct structure Graph = DirectedGraph structure Node = Graph.Node datatype t = ContNode of Cont.t | FuncNode of Func.t fun newContFuncGraph {getContData: Cont.t -> ContData.t, getFuncData: Func.t -> FuncData.t} = let val G = Graph.new () fun addEdge edge = ignore (Graph.addEdge (G, edge)) val {get = getNodeInfo : unit Node.t -> t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeInfo", Node.layout)) fun getFuncNode f = let val node = FuncData.node' (getFuncData f) in case !node of SOME n => n | NONE => let val n = Graph.newNode G in setNodeInfo (n, FuncNode f); node := SOME n; n end end fun getContNode c = let val node = ContData.node' (getContData c) in case !node of SOME n => n | NONE => let val n = Graph.newNode G in setNodeInfo (n, ContNode c); node := SOME n; n end end fun reset p = Graph.foreachNode (G, fn n => if p n then case getNodeInfo n of ContNode c => ContData.nodeReset (getContData c) | FuncNode f => FuncData.nodeReset (getFuncData f) else ()) in {G = G, addEdge = addEdge, getNodeInfo = getNodeInfo, getContNode = getContNode, getFuncNode = getFuncNode, reset = reset} end fun newFuncGraph {getFuncData: Func.t -> FuncData.t} = let val {G, addEdge, getNodeInfo, getFuncNode, reset, ...} = newContFuncGraph {getContData = fn _ => Error.bug "Contify.ContFuncGraph.newFuncGraph", getFuncData = getFuncData} in {G = G, addEdge = addEdge, getNodeInfo = fn n => case getNodeInfo n of FuncNode f => f | ContNode _ => Error.bug "Contify.ContFuncGraph.newFuncGraph", getFuncNode = getFuncNode, reset = reset} end end structure InitReachCallersCallees = struct structure Graph = DirectedGraph structure DfsParam = Graph.DfsParam (* Define Reach: Func -> Bool as follows: * Reach (f) iff there is a path of calls from fm to f. * * Define NontailCallers: Func -> P (Func x Cont) as follows: * NontailCallers (f) = {(g, c) | (g, f, c) in N} * Define TailCallers: Func -> P (Func) as follows: * Callers (f) = {g | (g, f) in T} * Define NontailCallees: Func -> P (Func x Cont) as follows: * NontailCallers (f) = {(g, c) | (f, g, c) in N} * Define TailCallees: Func -> P (Func) as follows: * Callers (f) = {g | (f, g) in T} * * Precondition: forall f in Func. (FuncData.node o getFuncData) f = NONE * forall f in Func. (FuncData.callers o getFuncData) f * = {nontail = [], tail = []} * forall f in Func. (FuncData.callees o getFuncData) f * = {nontail = [], tail = []} * Postcondition: FuncData.reach o getFuncData = Reach * #nontail (FuncData.callers o getFuncData) * = NontailCallers * #tail (FuncData.callers o getFuncData) * = TailCallers * #nontail (FuncData.callees o getFuncData) * = NontailCallees * #tail (FuncData.callees o getFuncData) * = TailCallees *) fun initReachCallersCallees {program = Program.T {functions, main = fm, ...}, getFuncData: Func.t -> FuncData.t} : unit = let val {G, addEdge, getNodeInfo, getFuncNode, reset, ...} = ContFuncGraph.newFuncGraph {getFuncData = getFuncData} val _ = List.foreach (functions, fn func => let val {name = f, blocks, ...} = Function.dest func val callees = FuncData.callees' (getFuncData f) val f_node = getFuncNode f in Vector.foreach (blocks, fn Block.T {transfer = Call {func = g, return, ...}, ...} => let val callers = FuncData.callers' (getFuncData g) val g_node = getFuncNode g val _ = case return of Return.NonTail c => (List.push (#nontail callees, (g, c)); List.push (#nontail callers, (f, c))) | _ => (List.push (#tail callees, g); List.push (#tail callers, f)) in addEdge {from = f_node, to = g_node} end | _ => ()) end) val dfs_param = DfsParam.finishNode (fn n => FuncData.reach' (getFuncData (getNodeInfo n)) := true) val fm_node = getFuncNode fm in Graph.dfsNodes (G, [fm_node], dfs_param); reset (fn _ => true) end val initReachCallersCallees = Control.trace (Control.Detail, "initReachCallerCallees") initReachCallersCallees end structure AnalyzeDom = struct structure Graph = DirectedGraph structure Node = Graph.Node (* Now define a directed graph G = (Node, Edge) where * Node = Cont U Fun U {Root} * Edge = {(Root, fm)} * U {(Root, c) | c in Cont} * U {(Root, f) | not (Reach (f))} * U {(f, g) | (f, g) in T and Reach (f)} * U {(c, g) | (f, g, c) in N and Reach (f)} * * Let D be the dominator tree of G rooted at Root. * For f in Fun, let idom (f) be the parent of f in D. * * Define an analysis, A_Dom, based on D as follows: * A_Dom (f) = * if idom (f) = Root * then if Reach (f) then Unknown else Uncalled * else the ancestor g of f in D such that idom (g) = Root * * Precondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall c in Cont. (ContData.rootEdge o getContData) c = false * forall f in Func. (FuncData.node o getFuncData) f = NONE * forall f in Func. (FuncData.reach o getFuncData) f = Reach * Postcondition: FuncData.ADom o getFuncData = A_Dom * forall c in Cont. (ContData.node o getContData) c = NONE * forall f in Func. (FuncData.node o getFuncData) f = NONE *) fun analyzeDom {program as Program.T {functions, main = fm, ...}, getContData: Cont.t -> ContData.t, getFuncData: Func.t -> FuncData.t} : unit = let datatype z = datatype Areturn.t val {G, addEdge, getNodeInfo, getContNode, getFuncNode, reset, ...} = ContFuncGraph.newContFuncGraph {getContData = getContData, getFuncData = getFuncData} val Root = DirectedGraph.newNode G fun buildGraph () = let val fm_node = getFuncNode fm (* {(Root, fm)} *) val _ = addEdge {from = Root, to = fm_node} (* { (Root, f) | fm calls f } *) val () = if !Control.contifyIntoMain then () else let val {blocks, ...} = Function.dest (Program.mainFunction program) in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => addEdge {from = Root, to = getFuncNode func} | _ => ()) end val _ = List.foreach (functions, fn func => let val {name = f, blocks, ...} = Function.dest func val f_reach = FuncData.reach (getFuncData f) val f_node = getFuncNode f in if f_reach then Vector.foreach (blocks, fn Block.T {transfer = Call {func = g, return, ...}, ...} => if FuncData.reach (getFuncData g) then let val g_node = getFuncNode g in case return of Return.Dead => (* When compiling with profiling, * Dead returns are allowed to * have nonempty source stacks * (see type-check.fun). So, we * can't contify functions that * are called with a Dead cont. *) addEdge {from = Root, to = g_node} | Return.NonTail c => let val c_node = getContNode c val rootEdge = ContData.rootEdge' (getContData c) in if !rootEdge then () else ((* {(Root, c) | c in Cont} *) addEdge {from = Root, to = c_node}; rootEdge := true); (* {(c, g) | (f, g, c) in N * and Reach (f)} *) addEdge {from = c_node, to = g_node} end | _ => (* {(f, g) | (f, g) in T * and Reach (f)} *) addEdge {from = f_node, to = g_node} end else () | _ => ()) else (* {(Root, f) | not (Reach (f))} *) addEdge {from = Root, to = f_node} end) in () end val buildGraph = Control.trace (Control.Detail, "buildGraph") buildGraph val _ = buildGraph () fun computeDominators () = let val {idom} = Graph.dominators (G, {root = Root}) in idom end val computeDominators = Control.trace (Control.Detail, "computeDominators") computeDominators val idom = computeDominators () fun computeADom () = let fun ancestor node = case idom node of Graph.Idom parent => if Node.equals (parent, Root) then node else ancestor parent | Graph.Root => node | Graph.Unreachable => Error.bug "Contify.AnalyzeDom.ancestor: unreachable" val _ = List.foreach (functions, fn func => let val {name = f, ...} = Function.dest func val FuncData.T {A, reach, node, ...} = getFuncData f val f_ADom = A val f_reach = !reach val f_node = valOf (!node) datatype z = datatype ContFuncGraph.t in if (case idom f_node of Graph.Idom n => Node.equals (n, Root) | Graph.Root => true | Graph.Unreachable => Error.bug "Contify.AnalyzeDom.idom: unreachable") then if f_reach then f_ADom := Unknown else f_ADom := Uncalled else let (* Use this for the ancestor version *) val l_node = ancestor f_node (* Use this for the parent version *) (* val l_node = idom f_node *) in case getNodeInfo l_node of FuncNode g => f_ADom := Func g | ContNode c => f_ADom := Cont c end end) in () end val computeADom = Control.trace (Control.Detail, "compute ADom") computeADom val _ = computeADom () val _ = reset (fn n => not (Node.equals (n, Root))) in () end val analyzeDom = Control.trace (Control.Detail, "analyzeDom") analyzeDom end structure Transform = struct (* * Precondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall c in Cont. (ContData.prefixes o getContData) c = [] * forall f in Func. (FuncData.node o getFuncData) f = NONE * FuncData.A o getFuncData = A * where A is a safe analysis * FuncData.callers o getFuncData * = {nontail = NontailCallers, tail = TailCallers} * FuncData.callees o getFuncData * = {nontail = NontailCallees, tail = TailCallees} * forall f in Func. (FuncData.prefixes o getFuncData) f = [] * forall f in Func. (FuncData.finished o getFuncData) f = false * forall f in Func. (FuncData.replace o getFuncData) f = NONE * Postcondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall f in Func. (FuncData.node o getFuncData) f = NONE *) fun transform {program = Program.T {datatypes, globals, functions, main}, getFuncData: Func.t -> FuncData.t, getContData: Cont.t -> ContData.t} : Program.t = let datatype z = datatype Areturn.t (* For functions turned into continuations, * record their args, blocks, and new name. *) val _ = List.foreach (functions, fn func => let val {name = f, args = f_args, blocks = f_blocks, start = f_start, ...} = Function.dest func val FuncData.T {A, replace, ...} = getFuncData f val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "A(", Func.layout f, str ") = ", Areturn.layout (!A)]) end) fun contify prefixes = let val f_label = Label.newString (Func.originalName f) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout f, str " -> ", Label.layout f_label]) end) val f_blocks = (Block.T {label = f_label, args = f_args, statements = Vector.new0 (), transfer = Goto {dst = f_start, args = Vector.new0 ()}}):: (Vector.toList f_blocks) in replace := SOME {label = f_label, blocks = f_blocks} ; List.push(prefixes, f) end in case !A of Uncalled => () | Unknown => () | Cont c => contify (ContData.prefixes' (getContData c)) | Func g => contify (FuncData.prefixes' (getFuncData g)) end) val traceAddFuncs = Trace.trace3 ("Contify.Transform.addFuncs", Func.layout, List.layout Func.layout, Return.layout, Unit.layout) val traceTransBlock = Trace.trace3 ("Contify.Transform.transBlock", Func.layout, Label.layout o Block.label, Return.layout, Layout.ignore) (* Walk over all functions, removing those that aren't top level, * and descening those that are, inserting local functions * where necessary. * - turn tail calls into nontail calls * - turn returns into gotos * - turn raises into gotos *) fun addFuncPrefixes (f: Func.t, g: Func.t, c: Return.t) : unit = let val prefixes = FuncData.prefixes (getFuncData g) val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "addFuncPrefixes: ", Func.layout f, str " ", Func.layout g, str " ", List.layout Func.layout prefixes]) end) in addFuncs (f, prefixes, c) end and addContPrefixes (f: Func.t, r: Cont.t, c: Return.t): unit = let val prefixes = ContData.prefixes (getContData r) val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "addContPrefixes: ", Func.layout f, str " ", Cont.layout r, str " ", List.layout Func.layout prefixes]) end) in addFuncs (f, prefixes, Return.compose (c, Return.NonTail r)) end and addFuncs arg : unit = traceAddFuncs (fn (f: Func.t, gs: Func.t list, c: Return.t) => List.foreach (gs, fn g => let val finished = FuncData.finished' (getFuncData g) in if !finished then () else (addFuncPrefixes(f, g, c); addBlocks (f, #blocks (valOf (FuncData.replace (getFuncData g))), c); finished := true) end) ) arg and addBlocks (f: Func.t, blocks: Block.t list, c: Return.t) : unit = let val contified' = List.map(blocks, fn block => transBlock (f, block, c)) val contified = FuncData.contified' (getFuncData f) in List.push(contified, contified') end and transBlock arg: Block.t = traceTransBlock (fn (f: Func.t, Block.T {label, args, statements, transfer}, c: Return.t) => let val transfer = case transfer of Call {func, args, return} => ((case return of Return.NonTail r => addContPrefixes (f, r, c) | _ => ()); case FuncData.replace (getFuncData func) of NONE => Call {func = func, args = args, return = Return.compose (c, return)} | SOME {label, ...} => Goto {dst = label, args = args}) | Return xs => (case c of Return.NonTail {cont, ...} => Goto {dst = cont, args = xs} | _ => transfer) | Raise xs => (case c of Return.NonTail {handler = Handler.Handle handler, ...} => Goto {dst = handler, args = xs} | _ => transfer) | _ => transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) arg val shrink = shrinkFunction {globals = globals} val functions = List.fold (functions, [], fn (func, ac) => let val {args = f_args, blocks = f_blocks, mayInline = f_mayInline, name = f, raises = f_raises, returns = f_returns, start = f_start} = Function.dest func in case FuncData.A (getFuncData f) of Unknown => let val _ = addFuncPrefixes (f, f, Return.Tail) val f_blocks = Vector.toListMap (f_blocks, fn block => transBlock (f, block, Return.Tail)) val f_blocks = f_blocks:: (FuncData.contified (getFuncData f)) val f_blocks = Vector.fromList (List.concat f_blocks) in shrink (Function.new {args = f_args, blocks = f_blocks, mayInline = f_mayInline, name = f, raises = f_raises, returns = f_returns, start = f_start}) :: ac end | _ => ac end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} in program end val transform = Control.trace (Control.Detail, "transform") transform end fun transform (program as Program.T _) = let val {get = getLabelInfo : Label.t -> (Handler.t * ContData.t) list ref, ...} = Property.get (Label.plist, Property.initFun (fn _ => ref [])) val getContData : Cont.t -> ContData.t = fn {cont, handler} => let val l = getLabelInfo cont in case List.peek (!l, fn (handler', _) => Handler.equals (handler, handler')) of SOME (_, cd) => cd | NONE => let val cd = ContData.new () val _ = List.push(l, (handler, cd)) in cd end end val {get = getFuncData : Func.t -> FuncData.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncData.new ())) val _ = InitReachCallersCallees.initReachCallersCallees {program = program, getFuncData = getFuncData} val _ = AnalyzeDom.analyzeDom {program = program, getContData = getContData, getFuncData = getFuncData} val program = Transform.transform {program = program, getContData = getContData, getFuncData = getFuncData} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/deep-flatten.fun000066400000000000000000001312241416264345000210320ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor DeepFlatten (S: SSA2_TRANSFORM_STRUCTS): SSA2_TRANSFORM = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Tree = Tree (structure Seq = Prod) structure TypeTree = struct datatype t = datatype Tree.t datatype info = Flat | NotFlat of {ty: Type.t, var: Var.t option} type t = info Tree.t fun layout (t: t): Layout.t = Tree.layout (t, let open Layout in fn Flat => str "Flat" | NotFlat {ty, var} => seq [str "NotFlat ", record [("ty", Type.layout ty), ("var", Option.layout Var.layout var)]] end) val isFlat: t -> bool = fn T (i, _) => case i of Flat => true | NotFlat _ => false end structure VarTree = struct open TypeTree val labelRoot: t * Var.t -> t = fn (t as T (info, ts), x) => case info of Flat => t | NotFlat {ty, ...} => T (NotFlat {ty = ty, var = SOME x}, ts) val fromTypeTree: TypeTree.t -> t = fn t => t val foldRoots: t * 'a * (Var.t * 'a -> 'a) -> 'a = fn (t, a, f) => let fun loop (T (info, children), a: 'a): 'a = case info of Flat => Prod.fold (children, a, loop) | NotFlat {var, ...} => case var of NONE => Error.bug "DeepFlatten.VarTree.foldRoots" | SOME x => f (x, a) in loop (t, a) end fun foreachRoot (t, f) = foldRoots (t, (), f o #1) val rootsOnto: t * Var.t list -> Var.t list = fn (t, ac) => List.appendRev (foldRoots (t, [], op ::), ac) val rec dropVars: t -> t = fn T (info, ts) => let val info = case info of Flat => Flat | NotFlat {ty, ...} => NotFlat {ty = ty, var = NONE} in T (info, Prod.map (ts, dropVars)) end fun fillInRoots (t: t, {base: Var.t Base.t, offset: int}) : t * Statement.t list = let fun loop (t as T (info, ts), offset, ac) = case info of Flat => let val (ts, (offset, ac)) = Vector.mapAndFold (Prod.dest ts, (offset, ac), fn ({elt = t, isMutable}, (offset, ac)) => let val (t, offset, ac) = loop (t, offset, ac) in ({elt = t, isMutable = isMutable}, (offset, ac)) end) in (T (Flat, Prod.make ts), offset, ac) end | NotFlat {ty, var} => let val (t, ac) = case var of NONE => let val var = Var.newNoname () in (T (NotFlat {ty = ty, var = SOME var}, ts), Bind {exp = Select {base = base, offset = offset}, ty = ty, var = SOME var} :: ac) end | SOME _ => (t, ac) in (t, offset + 1, ac) end val (t, _, ac) = loop (t, offset, []) in (t, List.rev ac) end val fillInRoots = Trace.trace2 ("DeepFlatten.VarTree.fillInRoots", layout, fn {base, offset} => Layout.record [("base", Base.layout (base, Var.layout)), ("offset", Int.layout offset)], Layout.tuple2 (layout, List.layout Statement.layout)) fillInRoots end fun flatten {base: Var.t Base.t option, from: VarTree.t, offset: int, to: TypeTree.t}: {offset: int} * VarTree.t * Statement.t list = let val Tree.T (from, fs) = from in case from of VarTree.Flat => if TypeTree.isFlat to then flattensAt {base = base, froms = fs, offset = offset, tos = Tree.children to} else Error.bug "DeepFlatten.flatten: cannot flatten from Flat to NotFlat" | VarTree.NotFlat {ty, var} => let val (var, ss) = case var of NONE => let val base = case base of NONE => Error.bug "DeepFlatten.flatten: flatten missing base" | SOME base => base val result = Var.newNoname () in (result, [Bind {exp = Select {base = base, offset = offset}, ty = ty, var = SOME result}]) end | SOME var => (var, []) val (r, ss) = if TypeTree.isFlat to then let val (_, r, ss') = flattensAt {base = SOME (Base.Object var), froms = fs, offset = 0, tos = Tree.children to} in (r, ss @ ss') end else (Tree.T (VarTree.NotFlat {ty = ty, var = SOME var}, fs), ss) in ({offset = 1 + offset}, r, ss) end end and flattensAt {base: Var.t Base.t option, froms: VarTree.t Prod.t, offset: int, tos: TypeTree.t Prod.t} = let val (ts, (off, ss)) = Vector.map2AndFold (Prod.dest froms, Prod.dest tos, ({offset = offset}, []), fn ({elt = f, isMutable}, {elt = t, ...}, ({offset}, ss)) => let val () = if isMutable then Error.bug "DeepFlatten.flattensAt: mutable" else () val ({offset}, t, ss') = flatten {base = base, from = f, offset = offset, to = t} in ({elt = t, isMutable = false}, ({offset = offset}, ss' @ ss)) end) in (off, Tree.T (VarTree.Flat, Prod.make ts), ss) end fun coerceTree {from: VarTree.t, to: TypeTree.t}: VarTree.t * Statement.t list = let val (_, r, ss) = flatten {base = NONE, from = from, offset = 0, to = to} in (r, ss) end val coerceTree = let open Layout in Trace.trace ("DeepFlatten.coerceTree", fn {from, to} => record [("from", VarTree.layout from), ("to", TypeTree.layout to)], fn (vt, ss) => tuple [VarTree.layout vt, List.layout Statement.layout ss]) coerceTree end structure Flat = struct datatype t = Flat | NotFlat val toString: t -> string = fn Flat => "Flat" | NotFlat => "NotFlat" val layout = Layout.str o toString end datatype z = datatype Flat.t structure Value = struct datatype t = Ground of Type.t | Object of object Equatable.t | Weak of {arg: t} withtype object = {args: t Prod.t, coercedFrom: t AppendList.t ref, con: ObjectCon.t, finalOffsets: int vector option ref, finalTree: TypeTree.t option ref, finalType: Type.t option ref, finalTypes: Type.t Prod.t option ref, flat: Flat.t ref} fun layout (v: t): Layout.t = let open Layout in case v of Ground t => Type.layout t | Object e => Equatable.layout (e, fn {args, con, flat, ...} => seq [str "Object ", record [("args", Prod.layout (args, layout)), ("con", ObjectCon.layout con), ("flat", Flat.layout (! flat))]]) | Weak {arg, ...} => seq [str "Weak ", layout arg] end val ground = Ground val traceCoerce = Trace.trace ("DeepFlatten.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) val traceUnify = Trace.trace2 ("DeepFlatten.Value.unify", layout, layout, Unit.layout) val rec unify: t * t -> unit = fn arg => traceUnify (fn (v, v') => case (v, v') of (Ground _, Ground _) => () | (Object e, Object e') => let val callDont = ref false val () = Equatable.equate (e, e', fn (z as {args = a, coercedFrom = c, flat = f, ...}, z' as {args = a', coercedFrom = c', flat = f', ...}) => let val () = unifyProd (a, a') in case (!f, !f') of (Flat, Flat) => (c := AppendList.append (!c', !c); z) | (Flat, NotFlat) => (callDont := true; z) | (NotFlat, Flat) => (callDont := true; z') | (NotFlat, NotFlat) => z end) in if !callDont then dontFlatten v else () end | (Weak {arg = a, ...}, Weak {arg = a', ...}) => unify (a, a') | _ => Error.bug "DeepFlatten.unify: strange") arg and unifyProd = fn (p, p') => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => unify (e, e')) and dontFlatten: t -> unit = fn v => case v of Object e => let val {coercedFrom, flat, ...} = Equatable.value e in case ! flat of Flat => let val () = flat := NotFlat val from = !coercedFrom val () = coercedFrom := AppendList.empty in AppendList.foreach (from, fn v' => unify (v, v')) end | NotFlat => () end | _ => () val rec coerce = fn arg as {from, to} => traceCoerce (fn _ => case (from, to) of (Ground _, Ground _) => () | (Object e, Object e') => if Equatable.equals (e, e') then () else Equatable.whenComputed (e', fn {args = a', coercedFrom = c', flat = f', ...} => let val {args = a, con, ...} = Equatable.value e in if Prod.someIsMutable a orelse ObjectCon.isSequence con then unify (from, to) else case !f' of Flat => (AppendList.push (c', from) ; coerceProd {from = a, to = a'}) | NotFlat => unify (from, to) end) | (Weak _, Weak _) => unify (from, to) | _ => Error.bug "DeepFlatten.coerce: strange") arg and coerceProd = fn {from = p, to = p'} => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => coerce {from = e, to = e'}) fun mayFlatten {args, con}: bool = (* Don't flatten constructors, since they are part of a sum type. * Don't flatten unit. * Don't flatten sequences (of course their components can be * flattened). * Don't flatten objects with mutable fields, since sharing must be * preserved. *) not (Prod.isEmpty args) andalso Prod.allAreImmutable args andalso (case con of ObjectCon.Con _ => false | ObjectCon.Sequence => false | ObjectCon.Tuple => true) fun objectFields {args, con} = let (* Don't flatten object components that are immutable fields. Those * have already had a chance to be flattened by other passes. *) val _ = if (case con of ObjectCon.Con _ => true | ObjectCon.Tuple => true | ObjectCon.Sequence => false) then Vector.foreach (Prod.dest args, fn {elt, isMutable} => if isMutable then () else dontFlatten elt) else () val flat = if mayFlatten {args = args, con = con} then Flat.Flat else Flat.NotFlat in {args = args, coercedFrom = ref AppendList.empty, con = con, finalOffsets = ref NONE, finalTree = ref NONE, finalType = ref NONE, finalTypes = ref NONE, flat = ref flat} end fun object f = Object (Equatable.delay (fn () => objectFields (f ()))) val tuple: t Prod.t -> t = fn vs => Object (Equatable.new (objectFields {args = vs, con = ObjectCon.Tuple})) val tuple = Trace.trace ("DeepFlatten.Value.tuple", fn p => Prod.layout (p, layout), layout) tuple fun weak (arg: t) = Weak {arg = arg} val deObject: t -> object option = fn v => case v of Object e => SOME (Equatable.value e) | _ => NONE val traceFinalType = Trace.trace ("DeepFlatten.Value.finalType", layout, Type.layout) val traceFinalTypes = Trace.trace ("DeepFlatten.Value.finalTypes", layout, fn p => Prod.layout (p, Type.layout)) fun finalTree (v: t): TypeTree.t = let fun notFlat (): TypeTree.info = TypeTree.NotFlat {ty = finalType v, var = NONE} in case deObject v of NONE => Tree.T (notFlat (), Prod.empty ()) | SOME {args, finalTree = r, flat, ...} => Ref.memoize (r, fn () => let val info = case !flat of Flat => TypeTree.Flat | NotFlat => notFlat () in Tree.T (info, Prod.map (args, finalTree)) end) end and finalType arg: Type.t = traceFinalType (fn v => case v of Ground t => t | Object e => let val {finalType = r, ...} = Equatable.value e in Ref.memoize (r, fn () => Prod.elt (finalTypes v, 0)) end | Weak {arg, ...} => Type.weak (finalType arg)) arg and finalTypes arg: Type.t Prod.t = traceFinalTypes (fn v => case deObject v of NONE => Prod.make (Vector.new1 {elt = finalType v, isMutable = false}) | SOME {args, con, finalTypes, flat, ...} => Ref.memoize (finalTypes, fn () => let val args = prodFinalTypes args in case !flat of Flat => args | NotFlat => Prod.make (Vector.new1 {elt = Type.object {args = args, con = con}, isMutable = false}) end)) arg and prodFinalTypes (p: t Prod.t): Type.t Prod.t = Prod.make (Vector.fromList (Vector.foldr (Prod.dest p, [], fn ({elt, isMutable = i}, ac) => Vector.foldr (Prod.dest (finalTypes elt), ac, fn ({elt, isMutable = i'}, ac) => {elt = elt, isMutable = i orelse i'} :: ac)))) end structure Object = struct type t = Value.object fun select ({args, ...}: t, offset): Value.t = Prod.elt (args, offset) fun finalOffsets ({args, finalOffsets = r, ...}: t): int vector = Ref.memoize (r, fn () => Vector.fromListRev (#2 (Prod.fold (args, (0, []), fn (elt, (offset, offsets)) => (offset + Prod.length (Value.finalTypes elt), offset :: offsets))))) fun finalOffset (object, offset) = Vector.sub (finalOffsets object, offset) end fun transform2 (program as Program.T {datatypes, functions, globals, main}) = let val {get = conValue: Con.t -> Value.t option ref, ...} = Property.get (Con.plist, Property.initFun (fn _ => ref NONE)) val conValue = Trace.trace ("DeepFlatten.conValue", Con.layout, Ref.layout (Option.layout Value.layout)) conValue datatype 'a make = Const of 'a | Make of unit -> 'a val traceMakeTypeValue = Trace.trace ("DeepFlatten.makeTypeValue", Type.layout o #1, Layout.ignore) fun makeValue m = case m of Const v => v | Make f => f () fun needToMakeProd p = Vector.exists (Prod.dest p, fn {elt, ...} => case elt of Const _ => false | Make _ => true) fun makeProd p = Prod.map (p, makeValue) val {get = makeTypeValue: Type.t -> Value.t make, ...} = Property.get (Type.plist, Property.initRec (traceMakeTypeValue (fn (t, makeTypeValue) => let fun const () = Const (Value.ground t) datatype z = datatype Type.dest in case Type.dest t of Object {args, con} => let val args = Prod.map (args, makeTypeValue) fun doit () = if needToMakeProd args orelse Value.mayFlatten {args = args, con = con} then Make (fn () => Value.object (fn () => {args = makeProd args, con = con})) else const () datatype z = datatype ObjectCon.t in case con of Con c => Const (Ref.memoize (conValue c, fn () => makeValue (doit ()))) | Tuple => doit () | Sequence => doit () end | Weak t => (case makeTypeValue t of Const _ => const () | Make f => Make (fn () => Value.weak (f ()))) | _ => const () end))) fun typeValue (t: Type.t): Value.t = makeValue (makeTypeValue t) val typeValue = Trace.trace ("DeepFlatten.typeValue", Type.layout, Value.layout) typeValue val (coerce, coerceProd) = (Value.coerce, Value.coerceProd) fun inject {sum, variant = _} = typeValue (Type.datatypee sum) fun object {args, con, resultType} = let val m = makeTypeValue resultType in case con of NONE => (case m of Const v => v | Make _ => Value.tuple args) | SOME _ => (case m of Const v => let val () = case Value.deObject v of NONE => () | SOME {args = args', ...} => coerceProd {from = args, to = args'} in v end | _ => Error.bug "DeepFlatten.object: strange con value") end val object = Trace.trace ("DeepFlatten.object", fn {args, con, ...} => Layout.record [("args", Prod.layout (args, Value.layout)), ("con", Option.layout Con.layout con)], Value.layout) object val deWeak : Value.t -> Value.t = fn v => case v of Value.Ground t => typeValue (case Type.dest t of Type.Weak t => t | _ => Error.bug "DeepFlatten.primApp: deWeak") | Value.Weak {arg, ...} => arg | _ => Error.bug "DeepFlatten.primApp: Value.deWeak" fun primApp {args, prim, resultVar = _, resultType} = let fun weak v = case makeTypeValue resultType of Const v => v | Make _ => Value.weak v fun arg i = Vector.sub (args, i) fun result () = typeValue resultType fun dontFlatten () = (Vector.foreach (args, Value.dontFlatten) ; result ()) fun equal () = (Value.unify (arg 0, arg 1) ; Value.dontFlatten (arg 0) ; result ()) in case prim of Prim.Array_toArray => let val res = result () val () = case (Value.deObject (arg 0), Value.deObject res) of (NONE, NONE) => () | (SOME {args = a, ...}, SOME {args = a', ...}) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "DeepFlatten.primApp: Array_toArray" in res end | Prim.Array_toVector => let val res = result () val () = case (Value.deObject (arg 0), Value.deObject res) of (NONE, NONE) => () | (SOME {args = a, ...}, SOME {args = a', ...}) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "DeepFlatten.primApp: Array_toVector" in res end | Prim.CFunction _ => (* Some imports, like Real64.modf, take ref cells that can not * be flattened. *) dontFlatten () | Prim.MLton_eq => equal () | Prim.MLton_equal => equal () | Prim.MLton_size => dontFlatten () | Prim.MLton_share => dontFlatten () | Prim.Weak_get => deWeak (arg 0) | Prim.Weak_new => let val a = arg 0 in (Value.dontFlatten a; weak a) end | _ => result () end fun base b = case b of Base.Object obj => obj | Base.SequenceSub {sequence, ...} => sequence fun select {base, offset} = let datatype z = datatype Value.t in case base of Ground t => (case Type.dest t of Type.Object {args, ...} => typeValue (Prod.elt (args, offset)) | _ => Error.bug "DeepFlatten.select: Ground") | Object e => Object.select (Equatable.value e, offset) | _ => Error.bug "DeepFlatten.select:" end fun update {base, offset, value} = coerce {from = value, to = select {base = base, offset = offset}} fun const c = typeValue (Type.ofConst c) fun sequence {args, resultType} = let val v = typeValue resultType val _ = Vector.foreach (args, fn args => Vector.foreachi (Prod.dest args, fn (offset, {elt, ...}) => update {base = v, offset = offset, value = elt})) in v end val {func, value = varValue, ...} = analyze {base = base, coerce = coerce, const = const, filter = fn _ => (), filterWord = fn _ => (), fromType = typeValue, inject = inject, layout = Value.layout, object = object, primApp = primApp, program = program, select = fn {base, offset, ...} => select {base = base, offset = offset}, sequence = sequence, update = update, useFromTypeOnBinds = false} (* Don't flatten outermost part of formal parameters. *) fun dontFlattenFormals (xts: (Var.t * Type.t) vector): unit = Vector.foreach (xts, fn (x, _) => Value.dontFlatten (varValue x)) val () = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val () = dontFlattenFormals args val () = Vector.foreach (blocks, fn Block.T {args, ...} => dontFlattenFormals args) in () end) val () = Control.diagnostics (fn display => let open Layout val () = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, ...} => display (Option.layout Value.layout (! (conValue con))))) val () = Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", Value.layout (varValue x)])) in () end) (* Transform the program. *) val datatypes = Vector.map (datatypes, fn Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {con, args} => let val args = case ! (conValue con) of NONE => args | SOME v => case Type.dest (Value.finalType v) of Type.Object {args, ...} => args | _ => Error.bug "DeepFlatten.datatypes: strange con" in {args = args, con = con} end) in Datatype.T {cons = cons, tycon = tycon} end) val valueType = Value.finalType fun valuesTypes vs = Vector.map (vs, Value.finalType) val {get = varTree: Var.t -> VarTree.t, set = setVarTree, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("tree", Var.layout)) val setVarTree = Trace.trace2 ("DeepFlatten.setVarTree", Var.layout, VarTree.layout, Unit.layout) setVarTree fun simpleVarTree (x: Var.t): unit = setVarTree (x, VarTree.labelRoot (VarTree.fromTypeTree (Value.finalTree (varValue x)), x)) fun transformFormals xts = Vector.map (xts, fn (x, _) => let val () = simpleVarTree x in (x, Value.finalType (varValue x)) end) fun replaceVar (x: Var.t): Var.t = let fun bug () = Error.bug (concat ["DeepFlatten.replaceVar ", Var.toString x]) val Tree.T (info, _) = varTree x in case info of VarTree.Flat => bug () | VarTree.NotFlat {var, ...} => case var of NONE => bug () | SOME y => y end fun transformBind {exp, ty, var}: Statement.t list = let fun simpleTree () = Option.app (var, simpleVarTree) fun doit (e: Exp.t) = let val ty = case var of NONE => ty | SOME var => valueType (varValue var) in [Bind {exp = e, ty = ty, var = var}] end fun simple () = (simpleTree () ; doit (Exp.replaceVar (exp, replaceVar))) fun none () = [] in case exp of Exp.Const _ => simple () | Inject _ => simple () | Object {args, con} => (case var of NONE => none () | SOME var => let val v = varValue var in case Value.deObject v of NONE => simple () | SOME {args = expects, flat, ...} => let val z = Vector.map2 (args, Prod.dest expects, fn (arg, {elt, isMutable}) => let val (vt, ss) = coerceTree {from = varTree arg, to = Value.finalTree elt} in ({elt = vt, isMutable = isMutable}, ss) end) val vts = Vector.map (z, #1) fun set info = setVarTree (var, Tree.T (info, Prod.make vts)) in case !flat of Flat => (set VarTree.Flat; none ()) | NotFlat => let val ty = Value.finalType v val () = set (VarTree.NotFlat {ty = ty, var = SOME var}) val args = Vector.fromList (Vector.foldr (vts, [], fn ({elt = vt, ...}, ac) => VarTree.rootsOnto (vt, ac))) val obj = Bind {exp = Object {args = args, con = con}, ty = ty, var = SOME var} in Vector.foldr (z, [obj], fn ((_, ss), ac) => ss @ ac) end end end) | PrimApp _ => simple () | Select {base, offset} => (case var of NONE => none () | SOME var => let val baseVar = Base.object base in case Value.deObject (varValue baseVar) of NONE => simple () | SOME obj => let val Tree.T (info, children) = varTree baseVar val {elt = child, isMutable} = Prod.sub (children, offset) val (child, ss) = case info of VarTree.Flat => (child, []) | VarTree.NotFlat _ => let val child = (* Don't simplify a select out * of a mutable field. * Something may have mutated * it. *) if isMutable then VarTree.dropVars child else child in VarTree.fillInRoots (child, {base = Base.map (base, replaceVar), offset = (Object.finalOffset (obj, offset))}) end val () = setVarTree (var, child) in ss end end) | Sequence {args} => (case var of NONE => none () | SOME var => let val v = varValue var in case Value.deObject v of NONE => simple () | SOME {args = expects, flat, ...} => let val z = Vector.map (args, fn args => Vector.map2 (args, Prod.dest expects, fn (arg, {elt, ...}) => let val (vt, ss) = coerceTree {from = varTree arg, to = Value.finalTree elt} in (vt, ss) end)) val () = simpleVarTree var in case !flat of Flat => Error.bug "DeepFlatten.transformBind: Sequence, Flat" | NotFlat => let val ty = Value.finalType v val args = Vector.map (z, fn z => Vector.fromList (Vector.foldr (z, [], fn ((vt, _), ac) => VarTree.rootsOnto (vt, ac)))) val obj = Bind {exp = Sequence {args = args}, ty = ty, var = SOME var} in Vector.foldr (z, [obj], fn (z, ac) => Vector.foldr (z, ac, fn ((_, ss), ac) => ss @ ac)) end end end) | Var x => (Option.app (var, fn y => setVarTree (y, varTree x)) ; none ()) end fun transformStatement (s: Statement.t): Statement.t list = let fun simple () = [Statement.replaceUses (s, replaceVar)] in case s of Bind b => transformBind b | Profile _ => simple () | Update {base, offset, value} => let val baseVar = case base of Base.Object x => x | Base.SequenceSub {sequence = x, ...} => x in case Value.deObject (varValue baseVar) of NONE => simple () | SOME object => let val ss = ref [] val child = Value.finalTree (Object.select (object, offset)) val offset = Object.finalOffset (object, offset) val base = Base.map (base, replaceVar) val us = if not (TypeTree.isFlat child) then [Update {base = base, offset = offset, value = replaceVar value}] else let val (vt, ss') = coerceTree {from = varTree value, to = child} val () = ss := ss' @ (!ss) val r = ref offset val us = ref [] val () = VarTree.foreachRoot (vt, fn var => let val offset = !r val () = r := 1 + !r in List.push (us, Update {base = base, offset = offset, value = var}) end) in !us end in !ss @ us end end end val transformStatement = Trace.trace ("DeepFlatten.transformStatement", Statement.layout, List.layout Statement.layout) transformStatement fun transformStatements ss = Vector.concatV (Vector.map (ss, Vector.fromList o transformStatement)) fun transformTransfer t = Transfer.replaceVar (t, replaceVar) val transformTransfer = Trace.trace ("DeepFlatten.transformTransfer", Transfer.layout, Transfer.layout) transformTransfer fun transformBlock (Block.T {args, label, statements, transfer}) = Block.T {args = transformFormals args, label = label, statements = transformStatements statements, transfer = transformTransfer transfer} fun transformFunction (f: Function.t): Function.t = let val {args, mayInline, name, start, ...} = Function.dest f val {raises, returns, ...} = func name val args = transformFormals args val raises = Option.map (raises, valuesTypes) val returns = Option.map (returns, valuesTypes) val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, transformBlock b) ; fn () => ())) in Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val globals = transformStatements globals val functions = List.revMap (functions, transformFunction) val program = Program.T {datatypes = datatypes, functions = functions, globals = globals, main = main} val () = Program.clear program in shrink program end end mlton-20210117+dfsg/mlton/ssa/direct-exp.fun000066400000000000000000000523621416264345000205330ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor DirectExp (S: DIRECT_EXP_STRUCTS): DIRECT_EXP = struct open S structure DirectExp = struct datatype t = Bug | Call of {func: Func.t, args: t vector, ty: Type.t} | Case of {cases: cases, default: t option, test: t, ty: Type.t} | ConApp of {con: Con.t, args: t vector, ty: Type.t} | Const of Const.t | Detuple of {body: Var.t vector -> t, length: int, tuple: t} | DetupleBind of {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} | Handle of {try: t, catch: Var.t * Type.t, handler: t, ty: Type.t} | Let of {decs: {var: Var.t, exp: t} list, body: t} | Name of t * (Var.t -> t) | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: t vector, ty: Type.t} | Profile of ProfileExp.t | Raise of t | Runtime of {args: t vector, prim: Type.t Prim.t, ty: Type.t} | Select of {tuple: t, offset: int, ty: Type.t} | Seq of t * t | Tuple of {exps: t vector, ty: Type.t} | Var of Var.t * Type.t and cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val call = Call val casee = Case val conApp = ConApp val const = Const val detuple = Detuple val detupleBind = DetupleBind val handlee = Handle val lett = Let val name = Name val profile = Profile val raisee = Raise val select = Select val word = Const o Const.word fun tuple (r as {exps, ...}) = if 1 = Vector.length exps then Vector.first exps else Tuple r val var = Var fun primApp {args, prim, targs, ty} = let fun runtime () = Runtime {args = args, prim = prim, ty = ty} fun primApp () = PrimApp {args = args, prim = prim, targs = targs, ty = ty} in case prim of Prim.MLton_bug => Seq (primApp (), Bug) | Prim.Thread_copyCurrent => runtime () | _ => primApp () end local fun make c = conApp {con = c, args = Vector.new0 (), ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun eq (e1, e2, ty) = primApp {prim = Prim.MLton_eq, targs = Vector.new1 ty, args = Vector.new2 (e1, e2), ty = Type.bool} local open Layout fun lett (decs, body) = align [seq [str "let ", decs], seq [str "in ", body], str "end"] in fun layout e : Layout.t = case e of Bug => str "bug" | Call {func, args, ty} => seq [Func.layout func, str " ", layouts args, str ": ", Type.layout ty] | Case {cases, default, test, ...} => align [seq [str "case ", layout test, str " of"], indent (align [let fun doit (v, f) = Vector.layout (fn z => let val (x, e) = f z in seq [str "| ", x, str " => ", layout e] end) v fun simple (v, f) = doit (v, (fn (x, e) => (f x, e))) in case cases of Con v => doit (v, fn {con, args, body} => (seq [Con.layout con, Vector.layout (Var.layout o #1) args], body)) | Word (_, v) => simple (v, fn w => WordX.layout (w, {suffix = true})) end, case default of NONE => empty | SOME e => seq [str " _ => ", layout e]], 2)] | ConApp {con, args, ty} => seq [Con.layout con, layouts args, str ": ", Type.layout ty] | Const c => Const.layout c | Detuple {tuple, ...} => seq [str "detuple ", layout tuple] | DetupleBind {body, components, tuple, ...} => lett (seq [Vector.layout Var.layout components, str " = ", Var.layout tuple], layout body) | Handle {try, catch, handler, ...} => align [layout try, seq [str "handle ", Var.layout (#1 catch), str " => ", layout handler]] | Let {decs, body} => lett (align (List.map (decs, fn {var, exp} => seq [Var.layout var, str " = ", layout exp])), layout body) | Name _ => str "Name" | PrimApp {args, prim, targs, ty} => seq [Prim.layoutFull (prim, Type.layout), Layout.list (Vector.toListMap (targs, Type.layout)), str " ", layouts args, str ": ", Type.layout ty] | Profile e => ProfileExp.layout e | Raise e => seq [str "raise ", layout e] | Runtime {args, prim, ty} => seq [Prim.layoutFull (prim, Type.layout), str " ", layouts args, str ": ", Type.layout ty] | Select {tuple, offset, ...} => seq [str "#", str (Int.toString (1 + offset)), str " ", layout tuple] | Seq (e1, e2) => seq [layout e1, str "; ", layout e2] | Tuple {exps, ...} => layouts exps | Var (x, t) => seq [Var.layout x, str ": ", Type.layout t] and layouts es = Vector.layout layout es end structure Res = struct type t = {statements: Statement.t list, transfer: Transfer.t} fun layout {statements, transfer} = let open Layout in align [align (List.map (statements, Statement.layout)), Transfer.layout transfer] end fun prefix ({statements, transfer}: t, s: Statement.t): t = {statements = s :: statements, transfer = transfer} end structure Cont: sig type t val bind: Var.t * Res.t -> t val goto: Label.t -> t val layout: t -> Layout.t val receiveExp: (Exp.t * Type.t -> Res.t) -> t val receiveVar: (Var.t * Type.t -> Res.t) -> t val return: t val sendExp: t * Type.t * Exp.t -> Res.t val sendVar: t * Type.t * Var.t -> Res.t val toBlock: t * Type.t -> Block.t end = struct type bind = {arg: Var.t, statements: Statement.t list, transfer: Transfer.t} datatype t = Bind of bind | Goto of Label.t | Prefix of t * Statement.t | ReceiveExp of Exp.t * Type.t -> Res.t | ReceiveVar of Var.t * Type.t -> Res.t | Return fun layout (k: t): Layout.t = let open Layout in case k of Bind {arg, statements, transfer} => seq [str "Bind ", record [("arg", Var.layout arg), ("statements", List.layout Statement.layout statements), ("transfer", Transfer.layout transfer)]] | Goto l => seq [str "Goto ", Label.layout l] | Prefix (k, s) => seq [str "Prefix ", tuple [layout k, Statement.layout s]] | ReceiveExp _ => str "ReceiveExp" | ReceiveVar _ => str "ReceiveVar" | Return => str "Return" end fun bind (arg, {statements, transfer}) = Bind {arg = arg, statements = statements, transfer = transfer} val goto = Goto val receiveExp = ReceiveExp val receiveVar = ReceiveVar val return = Return fun toBind (k: t, ty: Type.t): bind = case k of Bind b => b | _ => let val arg = Var.newNoname () val {statements, transfer} = sendVar (k, ty, arg) in {arg = arg, statements = statements, transfer = transfer} end and sendVar (k: t, ty: Type.t, x: Var.t): Res.t = case k of Bind b => sendBindExp (b, ty, Exp.Var x) | Goto dst => {statements = [], transfer = Transfer.Goto {dst = dst, args = Vector.new1 x}} | ReceiveExp f => f (Exp.Var x, ty) | ReceiveVar f => f (x, ty) | Prefix (k, s) => Res.prefix (sendVar (k, ty, x), s) | Return => {statements = [], transfer = Transfer.Return (Vector.new1 x)} and sendBindExp ({arg, statements, transfer}, ty, e: Exp.t) = {statements = Statement.T {var = SOME arg, ty = ty, exp = e} :: statements, transfer = transfer} val sendVar = Trace.trace3 ("DirectExp.Cont.sendVar", layout, Type.layout, Var.layout, Res.layout) sendVar val sendExp: t * Type.t * Exp.t -> Res.t = fn (k, ty, e) => case k of ReceiveExp f => f (e, ty) | _ => sendBindExp (toBind (k, ty), ty, e) val sendExp = Trace.trace3 ("DirectExp.Cont.sendExp", layout, Type.layout, Exp.layout, Res.layout) sendExp fun toBlock (k: t, ty: Type.t): Block.t = let val {arg, statements, transfer} = toBind (k, ty) val label = Label.newNoname () in Block.T {label = label, args = Vector.new1 (arg, ty), statements = Vector.fromList statements, transfer = transfer} end val toBlock = Trace.trace2 ("DirectExp.Cont.toBlock", layout, Type.layout, Block.layout) toBlock end fun selects (tuple: Var.t, ty: Type.t, components: Var.t vector) : Statement.t list = let val ts = Type.deTuple ty in Vector.foldi (ts, [], fn (i, t, ss) => Statement.T {var = SOME (Vector.sub (components, i)), ty = t, exp = Exp.Select {tuple = tuple, offset = i}} :: ss) end fun linearize' (e: t, h: Handler.t, k: Cont.t): Label.t * Block.t list = let val traceLinearizeLoop = Trace.trace3 ("DirectExp.linearize'.loop", layout, Handler.layout, Cont.layout, Res.layout) val blocks: Block.t list ref = ref [] fun newBlock (args: (Var.t * Type.t) vector, {statements: Statement.t list, transfer: Transfer.t}): Label.t = let val label = Label.newNoname () val _ = List.push (blocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in label end fun reify (k: Cont.t, ty: Type.t): Label.t = let val b = Cont.toBlock (k, ty) val _ = List.push (blocks, b) in Block.label b end fun newLabel (args: (Var.t * Type.t) vector, e: t, h: Handler.t, k: Cont.t): Label.t = newBlock (args, loop (e, h, k)) and newLabel0 (e, h, k) = newLabel (Vector.new0 (), e, h, k) and loopf (e: t, h: Handler.t, f: Var.t * Type.t -> Res.t) = loop (e, h, Cont.receiveVar f) and loop arg : Res.t = traceLinearizeLoop (fn (e: t, h: Handler.t, k: Cont.t) => case e of Bug => {statements = [], transfer = Transfer.Bug} | Call {func, args, ty} => loops (args, h, fn xs => {statements = [], transfer = (Transfer.Call {func = func, args = xs, return = Return.NonTail {cont = reify (k, ty), handler = h}})}) | Case {cases, default, test, ty} => let val k = Cont.goto (reify (k, ty)) in loopf (test, h, fn (x, _) => {statements = [], transfer = Transfer.Case {test = x, default = Option.map (default, fn e => newLabel0 (e, h, k)), cases = let fun doit v = Vector.map (v, fn (c, e) => (c, newLabel0 (e, h, k))) in case cases of Con v => Cases.Con (Vector.map (v, fn {con, args, body} => (con, newLabel (args, body, h, k)))) | Word (s, v) => Cases.Word (s, doit v) end}}) end | ConApp {con, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.ConApp {con = con, args = xs})) | Const c => Cont.sendExp (k, Type.ofConst c, Exp.Const c) | Detuple {tuple, length, body} => loop (tuple, h, Cont.receiveExp (fn (e, ty) => let fun doit (tuple: Var.t): Res.t = let val (ss, xs) = case length of 0 => ([], Vector.new0 ()) | 1 => ([], Vector.new1 tuple) | _ => let val xs = Vector.tabulate (length, fn _ => Var.newNoname ()) in (selects (tuple, ty, xs), xs) end val {statements, transfer} = loop (body xs, h, k) in {statements = List.appendRev (ss, statements), transfer = transfer} end in case e of Exp.Tuple xs => loop (body xs, h, k) | Exp.Var x => doit x | _ => let val tuple = Var.newNoname () in Res.prefix (doit tuple, Statement.T {var = SOME tuple, ty = ty, exp = e}) end end)) | DetupleBind {body, components, tuple, tupleTy} => let val {statements, transfer} = loop (body, h, k) val ss = case Vector.length components of 0 => [] | 1 => [Statement.T {var = SOME (Vector.first components), ty = tupleTy, exp = Exp.Var tuple}] | _ => selects (tuple, tupleTy, components) in {statements = List.appendRev (ss, statements), transfer = transfer} end | Handle {try, catch, handler, ty} => let val k = Cont.goto (reify (k, ty)) val hl = Label.newNoname () val {statements, transfer} = loop (handler, h, k) val _ = List.push (blocks, Block.T {label = hl, args = Vector.new1 catch, statements = Vector.fromList statements, transfer = transfer}) in loop (try, Handler.Handle hl, k) end | Let {decs, body} => let fun each decs = case decs of [] => loop (body, h, k) | {var, exp} :: decs => loop (exp, h, Cont.bind (var, each decs)) in each decs end | Name (e, f) => loopf (e, h, fn (x, _) => loop (f x, h, k)) | PrimApp {prim, targs, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.PrimApp {prim = prim, targs = targs, args = xs})) | Profile e => Cont.sendExp (k, Type.unit, Exp.Profile e) | Raise e => loopf (e, h, fn (x, _) => {statements = [], transfer = (case h of Handler.Caller => Transfer.Raise (Vector.new1 x) | Handler.Dead => Error.bug "DirectExp.linearize'.loop: Raise:to dead handler" | Handler.Handle l => Transfer.Goto {args = Vector.new1 x, dst = l})}) | Runtime {args, prim, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l val (args, exps) = case Type.deTupleOpt ty of NONE => let val res = Var.newNoname () in (Vector.new1 (res, ty), Vector.new1 (Var (res, ty))) end | SOME ts => if Vector.isEmpty ts then (Vector.new0 (), Vector.new0 ()) else Error.bug (concat ["DirectExp.linearize'.loop: Runtime:with multiple return values: ", Prim.toString prim]) in {statements = [], transfer = Transfer.Runtime {prim = prim, args = xs, return = newLabel (args, tuple {exps = exps, ty = ty}, h, k)}} end) | Select {tuple, offset, ty} => loopf (tuple, h, fn (tuple, _) => Cont.sendExp (k, ty, Exp.Select {tuple = tuple, offset = offset})) | Seq (e1, e2) => loopf (e1, h, fn _ => loop (e2, h, k)) | Tuple {exps, ty} => loops (exps, h, fn xs => Cont.sendExp (k, ty, Exp.Tuple xs)) | Var (x, ty) => Cont.sendVar (k, ty, x)) arg and loops (es: t vector, h: Handler.t, k: Var.t vector -> Res.t): Res.t = let val n = Vector.length es fun each (i, ac) = if i = n then k (Vector.fromListRev ac) else loopf (Vector.sub (es, i), h, fn (x, _) => each (i + 1, x :: ac)) in each (0, []) end val l = newLabel0 (e, h, k) in (l, !blocks) end fun linearize (e: t, h) = linearize' (e, h, Cont.return) val linearize = Trace.trace2 ("DirectExp.linearize", layout, Handler.layout, Layout.tuple2 (Label.layout, List.layout (Label.layout o Block.label))) linearize fun linearizeGoto (e: t, h, l) = linearize' (e, h, Cont.goto l) end end mlton-20210117+dfsg/mlton/ssa/direct-exp.sig000066400000000000000000000051221416264345000205150ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DIRECT_EXP_STRUCTS = sig include SSA_TREE end signature DIRECT_EXP = sig include DIRECT_EXP_STRUCTS structure DirectExp: sig type t datatype cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector (* For now, call always uses Handler.None. This means it should only * be used for functions that cannot raise. *) val call: {func: Func.t, args: t vector, ty: Type.t} -> t val casee: {test: t, cases: cases, default: t option, ty: Type.t} -> t val conApp: {con: Con.t, args: t vector, ty: Type.t} -> t val const: Const.t -> t val detuple: {body: Var.t vector -> t, length: int, tuple: t} -> t val detupleBind: {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} -> t val eq: t * t * Type.t -> t val falsee: t val handlee: {try: t, ty: Type.t, catch: Var.t * Type.t, handler: t} -> t val layout: t -> Layout.t val lett: {decs: {var: Var.t, exp: t} list, body: t} -> t val linearize: t * Return.Handler.t -> Label.t * Block.t list val linearizeGoto: t * Return.Handler.t * Label.t -> Label.t * Block.t list val name: t * (Var.t -> t) -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val profile: ProfileExp.t -> t val raisee: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val truee: t val tuple: {exps: t vector, ty: Type.t} -> t val var: Var.t * Type.t -> t val word: WordX.t -> t end end mlton-20210117+dfsg/mlton/ssa/direct-exp2.fun000066400000000000000000000514321416264345000206120ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor DirectExp2 (S: DIRECT_EXP2_STRUCTS): DIRECT_EXP2 = struct open S structure DirectExp = struct datatype t = Call of {func: Func.t, args: t vector, ty: Type.t} | Case of {cases: cases, default: t option, test: t, ty: Type.t} | ConApp of {con: Con.t, args: t vector, ty: Type.t} | Const of Const.t | Detuple of {body: Var.t vector -> t, length: int, tuple: t} | DetupleBind of {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} | Handle of {try: t, catch: Var.t * Type.t, handler: t, ty: Type.t} | Let of {decs: {var: Var.t, exp: t} list, body: t} | Name of t * (Var.t -> t) | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: t vector, ty: Type.t} | Profile of ProfileExp.t | Raise of t | Runtime of {args: t vector, prim: Type.t Prim.t, ty: Type.t} | Select of {tuple: t, offset: int, ty: Type.t} | Seq of t * t | Tuple of {exps: t vector, ty: Type.t} | Var of Var.t * Type.t and cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val call = Call val casee = Case val conApp = ConApp val const = Const val detuple = Detuple val detupleBind = DetupleBind val handlee = Handle val lett = Let val name = Name val profile = Profile val raisee = Raise val select = Select val seq = Seq val word = Const o Const.word fun tuple (r as {exps, ...}) = if 1 = Vector.length exps then Vector.first exps else Tuple r val var = Var fun primApp {args, prim, targs, ty} = let fun runtime () = Runtime {args = args, prim = prim, ty = ty} in case Prim.name prim of Prim.Name.MLton_halt => runtime () | Prim.Name.Thread_copyCurrent => runtime () | _ => PrimApp {args = args, prim = prim, targs = targs, ty = ty} end local fun make c = conApp {con = c, args = Vector.new0 (), ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun eq (e1, e2, ty) = primApp {prim = Prim.eq, targs = Vector.new1 ty, args = Vector.new2 (e1, e2), ty = Type.bool} local open Layout fun lett (decs, body) = align [seq [str "let ", decs], seq [str "in ", body], str "end"] in fun layout e : Layout.t = case e of Call {func, args, ty} => seq [Func.layout func, str " ", layouts args, str ": ", Type.layout ty] | Case {cases, default, test, ...} => align [seq [str "case ", layout test, str " of"], indent (align [let fun doit (v, f) = Vector.layout (fn z => let val (x, e) = f z in seq [str "| ", x, str " => ", layout e] end) v fun simple (v, f) = doit (v, (fn (x, e) => (f x, e))) in case cases of Con v => doit (v, fn {con, args, body} => (seq [Con.layout con, Vector.layout (Var.layout o #1) args], body)) | Word (_, v) => simple (v, WordX.layout) end, case default of NONE => empty | SOME e => seq [str " _ => ", layout e]], 2)] | ConApp {con, args, ty} => seq [Con.layout con, layouts args, str ": ", Type.layout ty] | Const c => Const.layout c | Detuple {tuple, ...} => seq [str "detuple ", layout tuple] | DetupleBind {body, components, tuple, ...} => lett (seq [Vector.layout Var.layout components, str " = ", Var.layout tuple], layout body) | Handle {try, catch, handler, ...} => align [layout try, seq [str "handle ", Var.layout (#1 catch), str " => ", layout handler]] | Let {decs, body} => lett (align (List.map (decs, fn {var, exp} => seq [Var.layout var, str " = ", layout exp])), layout body) | Name _ => str "Name" | PrimApp {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Profile e => ProfileExp.layout e | Raise e => seq [str "raise ", layout e] | Runtime {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Select {tuple, offset, ...} => seq [str "#", str (Int.toString (1 + offset)), str " ", layout tuple] | Seq (e1, e2) => seq [layout e1, str "; ", layout e2] | Tuple {exps, ...} => layouts exps | Var (x, t) => seq [Var.layout x, str ": ", Type.layout t] and layouts es = Vector.layout layout es end structure Res = struct type t = {statements: Statement.t list, transfer: Transfer.t} fun layout {statements, transfer} = let open Layout in align [align (List.map (statements, Statement.layout)), Transfer.layout transfer] end fun prefix ({statements, transfer}: t, s: Statement.t): t = {statements = s :: statements, transfer = transfer} end structure Cont: sig type t val bind: Var.t * Res.t -> t val goto: Label.t -> t val layout: t -> Layout.t val receiveExp: (Exp.t * Type.t -> Res.t) -> t val receiveVar: (Var.t * Type.t -> Res.t) -> t val return: t val sendExp: t * Type.t * Exp.t -> Res.t val sendVar: t * Type.t * Var.t -> Res.t val toBlock: t * Type.t -> Block.t end = struct type bind = {arg: Var.t, statements: Statement.t list, transfer: Transfer.t} datatype t = Bind of bind | Goto of Label.t | Prefix of t * Statement.t | ReceiveExp of Exp.t * Type.t -> Res.t | ReceiveVar of Var.t * Type.t -> Res.t | Return fun layout (k: t): Layout.t = let open Layout in case k of Bind {arg, statements, transfer} => seq [str "Bind ", record [("arg", Var.layout arg), ("statements", List.layout Statement.layout statements), ("transfer", Transfer.layout transfer)]] | Goto l => seq [str "Goto ", Label.layout l] | Prefix (k, s) => seq [str "Prefix ", tuple [layout k, Statement.layout s]] | ReceiveExp _ => str "ReceiveExp" | ReceiveVar _ => str "ReceiveVar" | Return => str "Return" end fun bind (arg, {statements, transfer}) = Bind {arg = arg, statements = statements, transfer = transfer} val goto = Goto val receiveExp = ReceiveExp val receiveVar = ReceiveVar val return = Return fun toBind (k: t, ty: Type.t): bind = case k of Bind b => b | _ => let val arg = Var.newNoname () val {statements, transfer} = sendVar (k, ty, arg) in {arg = arg, statements = statements, transfer = transfer} end and sendVar (k: t, ty: Type.t, x: Var.t): Res.t = case k of Bind b => sendBindExp (b, ty, Exp.Var x) | Goto dst => {statements = [], transfer = Transfer.Goto {dst = dst, args = Vector.new1 x}} | ReceiveExp f => f (Exp.Var x, ty) | ReceiveVar f => f (x, ty) | Prefix (k, s) => Res.prefix (sendVar (k, ty, x), s) | Return => {statements = [], transfer = Transfer.Return (Vector.new1 x)} and sendBindExp ({arg, statements, transfer}, ty, e: Exp.t) = {statements = Statement.T {var = SOME arg, ty = ty, exp = e} :: statements, transfer = transfer} val sendVar = Trace.trace3 ("DirectExp2.Cont.sendVar", layout, Type.layout, Var.layout, Res.layout) sendVar val sendExp: t * Type.t * Exp.t -> Res.t = fn (k, ty, e) => case k of ReceiveExp f => f (e, ty) | _ => sendBindExp (toBind (k, ty), ty, e) val sendExp = Trace.trace3 ("DirectExp2.Cont.sendExp", layout, Type.layout, Exp.layout, Res.layout) sendExp fun toBlock (k: t, ty: Type.t): Block.t = let val {arg, statements, transfer} = toBind (k, ty) val label = Label.newNoname () in Block.T {label = label, args = Vector.new1 (arg, ty), statements = Vector.fromList statements, transfer = transfer} end val toBlock = Trace.trace2 ("DirectExp2.Cont.toBlock", layout, Type.layout, Block.layout) toBlock end fun selects (tuple: Var.t, ty: Type.t, components: Var.t vector) : Statement.t list = let val ts = Type.deTuple ty in Vector.foldi (ts, [], fn (i, t, ss) => Statement.T {var = SOME (Vector.sub (components, i)), ty = t, exp = Exp.Select {tuple = tuple, offset = i}} :: ss) end fun linearize' (e: t, h: Handler.t, k: Cont.t): Label.t * Block.t list = let val traceLinearizeLoop = Trace.trace3 ("DirectExp.linearize'.loop", layout, Handler.layout, Cont.layout, Res.layout) val blocks: Block.t list ref = ref [] fun newBlock (args: (Var.t * Type.t) vector, {statements: Statement.t list, transfer: Transfer.t}): Label.t = let val label = Label.newNoname () val _ = List.push (blocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in label end fun reify (k: Cont.t, ty: Type.t): Label.t = let val b = Cont.toBlock (k, ty) val _ = List.push (blocks, b) in Block.label b end fun newLabel (args: (Var.t * Type.t) vector, e: t, h: Handler.t, k: Cont.t): Label.t = newBlock (args, loop (e, h, k)) and newLabel0 (e, h, k) = newLabel (Vector.new0 (), e, h, k) and loopf (e: t, h: Handler.t, f: Var.t * Type.t -> Res.t) = loop (e, h, Cont.receiveVar f) and loop arg : Res.t = traceLinearizeLoop (fn (e: t, h: Handler.t, k: Cont.t) => case e of Call {func, args, ty} => loops (args, h, fn xs => {statements = [], transfer = (Transfer.Call {func = func, args = xs, return = Return.NonTail {cont = reify (k, ty), handler = h}})}) | Case {cases, default, test, ty} => let val k = Cont.goto (reify (k, ty)) in loopf (test, h, fn (x, _) => {statements = [], transfer = Transfer.Case {test = x, default = Option.map (default, fn e => newLabel0 (e, h, k)), cases = let fun doit v = Vector.map (v, fn (c, e) => (c, newLabel0 (e, h, k))) in case cases of Con v => Cases.Con (Vector.map (v, fn {con, args, body} => (con, newLabel (args, body, h, k)))) | Word (s, v) => Cases.Word (s, doit v) end}}) end | ConApp {con, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.ConApp {con = con, args = xs})) | Const c => Cont.sendExp (k, Type.ofConst c, Exp.Const c) | Detuple {tuple, length, body} => loop (tuple, h, Cont.receiveExp (fn (e, ty) => let fun doit (tuple: Var.t): Res.t = let val (ss, xs) = case length of 0 => ([], Vector.new0 ()) | 1 => ([], Vector.new1 tuple) | _ => let val xs = Vector.tabulate (length, fn _ => Var.newNoname ()) in (selects (tuple, ty, xs), xs) end val {statements, transfer} = loop (body xs, h, k) in {statements = List.appendRev (ss, statements), transfer = transfer} end in case e of Exp.Tuple xs => loop (body xs, h, k) | Exp.Var x => doit x | _ => let val tuple = Var.newNoname () in Res.prefix (doit tuple, Statement.T {var = SOME tuple, ty = ty, exp = e}) end end)) | DetupleBind {body, components, tuple, tupleTy} => let val {statements, transfer} = loop (body, h, k) val ss = case Vector.length components of 0 => [] | 1 => [Statement.T {var = SOME (Vector.first components), ty = tupleTy, exp = Exp.Var tuple}] | _ => selects (tuple, tupleTy, components) in {statements = List.appendRev (ss, statements), transfer = transfer} end | Handle {try, catch, handler, ty} => let val k = Cont.goto (reify (k, ty)) val hl = Label.newNoname () val {statements, transfer} = loop (handler, h, k) val _ = List.push (blocks, Block.T {label = hl, args = Vector.new1 catch, statements = Vector.fromList statements, transfer = transfer}) in loop (try, Handler.Handle hl, k) end | Let {decs, body} => let fun each decs = case decs of [] => loop (body, h, k) | {var, exp} :: decs => loop (exp, h, Cont.bind (var, each decs)) in each decs end | Name (e, f) => loopf (e, h, fn (x, _) => loop (f x, h, k)) | PrimApp {prim, targs, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.PrimApp {prim = prim, targs = targs, args = xs})) | Profile e => Cont.sendExp (k, Type.unit, Exp.Profile e) | Raise e => loopf (e, h, fn (x, _) => {statements = [], transfer = (case h of Handler.Caller => Transfer.Raise (Vector.new1 x) | Handler.Dead => Error.bug "DirectExp2.linearize'.loop: Raise:to dead handler" | Handler.Handle l => Transfer.Goto {args = Vector.new1 x, dst = l})}) | Runtime {args, prim, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l val (args, exps) = case Type.deTupleOpt ty of NONE => let val res = Var.newNoname () in (Vector.new1 (res, ty), Vector.new1 (Var (res, ty))) end | SOME ts => if Vector.isEmpty ts then (Vector.new0 (), Vector.new0 ()) else Error.bug (concat ["DirectExp2.linearlize'.loop: Runtime:with multiple return values: ", Prim.toString prim]) in {statements = [], transfer = Transfer.Runtime {prim = prim, args = xs, return = newLabel (args, tuple {exps = exps, ty = ty}, h, k)}} end) | Select {tuple, offset, ty} => loopf (tuple, h, fn (tuple, _) => Cont.sendExp (k, ty, Exp.Select {tuple = tuple, offset = offset})) | Seq (e1, e2) => loopf (e1, h, fn _ => loop (e2, h, k)) | Tuple {exps, ty} => loops (exps, h, fn xs => Cont.sendExp (k, ty, Exp.Tuple xs)) | Var (x, ty) => Cont.sendVar (k, ty, x)) arg and loops (es: t vector, h: Handler.t, k: Var.t vector -> Res.t): Res.t = let val n = Vector.length es fun each (i, ac) = if i = n then k (Vector.fromListRev ac) else loopf (Vector.sub (es, i), h, fn (x, _) => each (i + 1, x :: ac)) in each (0, []) end val l = newLabel0 (e, h, k) in (l, !blocks) end fun linearize (e: t, h) = linearize' (e, h, Cont.return) val linearize = Trace.trace2 ("DirectExp2.linearize", layout, Handler.layout, Layout.tuple2 (Label.layout, List.layout (Label.layout o Block.label))) linearize fun linearizeGoto (e: t, h, l) = linearize' (e, h, Cont.goto l) end end mlton-20210117+dfsg/mlton/ssa/direct-exp2.sig000066400000000000000000000051651416264345000206060ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature DIRECT_EXP2_STRUCTS = sig include SSA_TREE2 end signature DIRECT_EXP2 = sig include DIRECT_EXP2_STRUCTS structure DirectExp: sig type t datatype cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector (* For now, call always uses Handler.None. This means it should only * be used for functions that cannot raise. *) val call: {func: Func.t, args: t vector, ty: Type.t} -> t val casee: {test: t, cases: cases, default: t option, ty: Type.t} -> t val conApp: {con: Con.t, args: t vector, ty: Type.t} -> t val const: Const.t -> t val detuple: {body: Var.t vector -> t, length: int, tuple: t} -> t val detupleBind: {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} -> t val eq: t * t * Type.t -> t val falsee: t val handlee: {try: t, ty: Type.t, catch: Var.t * Type.t, handler: t} -> t val layout: t -> Layout.t val lett: {decs: {var: Var.t, exp: t} list, body: t} -> t val linearize: t * Return.Handler.t -> Label.t * Block.t list val linearizeGoto: t * Return.Handler.t * Label.t -> Label.t * Block.t list val name: t * (Var.t -> t) -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val profile: ProfileExp.t -> t val raisee: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val seq: t * t -> t val truee: t val tuple: {exps: t vector, ty: Type.t} -> t val var: Var.t * Type.t -> t val word: WordX.t -> t end end mlton-20210117+dfsg/mlton/ssa/duplicate-globals.fun000066400000000000000000000152161416264345000220570ustar00rootroot00000000000000(* Copyright (C) 2018 Jason Carr * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Duplicate each global that appears in the program, once per usage in the program. * Globals which refer to other globals are not duplicated recursively. * * The primary purpose of this pass is to support passes which could possibly use * different types for different globals, currently SplitTypes, and so that these * passes may be separately enabled. *) functor DuplicateGlobals(S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S fun transform (Program.T {datatypes, globals, functions, main}): Program.t = let val globalVars: (Var.t, Var.t list ref) HashTable.t = HashTable.new {hash=Var.hash, equals=Var.equals} val _ = Vector.foreach (globals, fn st => let val exp = Statement.exp st val var = Statement.var st fun duplicatable var = ignore (HashTable.lookupOrInsert (globalVars, var, fn () => ref [])) val _ = case (var, exp) of (SOME var, Exp.ConApp _) => duplicatable var | (SOME var, Exp.PrimApp {prim, ...}) => (case prim of (* we might want to duplicate this due to the targ *) Prim.MLton_bogus => duplicatable var | Prim.Vector_vector => duplicatable var | _ => ()) | _ => () in () end) fun freshenIfGlobal (var: Var.t) = case HashTable.peek (globalVars, var) of NONE => var | SOME vs => let val newVar = Var.new var val _ = List.push (vs, newVar) in newVar end fun freshenVec (vars: Var.t vector) = Vector.map (vars, freshenIfGlobal) (* Rewrite all globals to a new version if they're in the table of valid globals *) fun loopExp exp = case exp of Exp.ConApp {args, con} => Exp.ConApp {con=con, args=freshenVec args} | Exp.PrimApp {args, prim, targs} => Exp.PrimApp {args=freshenVec args, prim=prim, targs=targs} | Exp.Select {offset, tuple} => Exp.Select {offset=offset, tuple=freshenIfGlobal tuple} | Exp.Tuple vs => Exp.Tuple (freshenVec vs) | Exp.Var v => Exp.Var (freshenIfGlobal v) | _ => exp fun loopStatement (Statement.T {exp, ty, var}) = (* This variable won't be global, since we're only looping over the program *) Statement.T {exp=loopExp exp, ty=ty, var=var} fun loopTransfer transfer = case transfer of Transfer.Bug => Transfer.Bug | Transfer.Call {args, func, return} => Transfer.Call {args=freshenVec args, func=func, return=return} | Transfer.Case {cases, default, test} => Transfer.Case {cases=cases, default=default, test=freshenIfGlobal test} | Transfer.Goto {args, dst} => Transfer.Goto {args=freshenVec args, dst=dst} | Transfer.Raise vs => Transfer.Raise (freshenVec vs) | Transfer.Return vs => Transfer.Return (freshenVec vs) | Transfer.Runtime {args, prim, return} => Transfer.Runtime {args=freshenVec args, prim=prim, return=return} fun loopBlock (Block.T {args, label, statements, transfer}) = Block.T {args=args, label=label, statements=Vector.map (statements, loopStatement), transfer=loopTransfer transfer} fun loopFunction func = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest func val newBlocks = Vector.map(blocks, loopBlock) in Function.new {args=args, blocks=newBlocks, mayInline=mayInline, name=name, raises=raises, returns=returns, start=start} end val newFunctions = List.map (functions, loopFunction) (* We do not recurse on global definintions, so if g1 = C1 (g0) and g2 = C2 (g0), we * will not duplicate g0. We expect this shouldn't improve much over proper * duplication of single-depth and nullary usages *) val newGlobals = let fun globalToClones (Statement.T {exp, ty, var}) = let val newVars = case var of SOME var => (case HashTable.peek (globalVars, var) of SOME vs => !vs | NONE => []) | NONE => [] in (Vector.fromList o List.map) (newVars, fn var => Statement.T { exp = exp, var = SOME var, ty = ty }) end (* globals that are used in other globals, * we want to avoid duplicating to help reduce churn/improve diagonstic data *) val usedGlobals: (Var.t, unit) HashTable.t = HashTable.new {equals=Var.equals, hash=Var.hash} val _ = Vector.map (globals, fn Statement.T {exp, ...} => Exp.foreachVar (exp, fn var => ignore (HashTable.lookupOrInsert (usedGlobals, var, ignore)))) fun isUsedInGlobals global = case HashTable.peek (usedGlobals, global) of NONE => false | SOME _ => true fun shouldKeepOriginal (Statement.T {var=varOpt, ...}) = case varOpt of SOME var => (case HashTable.peek (globalVars, var) of SOME _ => isUsedInGlobals var | NONE => true (* variable wasn't duplicated *)) | NONE => true (* doesn't have a var *) in Vector.concat [ Vector.keepAll (globals, shouldKeepOriginal), Vector.concatV (Vector.map (globals, globalToClones))] end in Program.T {datatypes=datatypes, globals=newGlobals, functions=newFunctions, main=main} end end mlton-20210117+dfsg/mlton/ssa/equatable.sig000066400000000000000000000020551416264345000204160ustar00rootroot00000000000000(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Equatable values can be equated, after which they are equals. Equating * two value requires the client to specify how to compute the new value from * the old. * * Equatable values can be either created by "new" or "delay". In the case of * delay, the value is only computed if "value" is called. * * Equating a value created by delay with a value created by new will completely * drop the delayed value. Hence, if a value is delayed, then nothing should * be assumed about any of its subcomponents. *) signature EQUATABLE = sig type 'a t val equals: 'a t * 'a t -> bool val delay: (unit -> 'a) -> 'a t val equate: 'a t * 'a t * ('a * 'a -> 'a) -> unit val layout: 'a t * ('a -> Layout.t) -> Layout.t val new: 'a -> 'a t val value: 'a t -> 'a val whenComputed: 'a t * ('a -> unit) -> unit end mlton-20210117+dfsg/mlton/ssa/equatable.sml000066400000000000000000000043571416264345000204360ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Equatable: EQUATABLE = struct structure Set = DisjointSet datatype 'a delay = Computed of 'a | Uncomputed of {compute: unit -> 'a, whenComputed: ('a -> unit) AppendList.t ref} datatype 'a t = T of 'a delay Set.t fun layout (T s, f) = case Set.! s of Computed a => f a | Uncomputed _ => Layout.str "" fun delay f = T (Set.singleton (Uncomputed {compute = f, whenComputed = ref AppendList.empty})) fun new a = T (Set.singleton (Computed a)) fun equals (T s, T s') = Set.equals (s, s') fun value (T s) = case Set.! s of Computed a => a | Uncomputed {compute, whenComputed} => let val a = compute () val () = Set.:= (s, Computed a) val () = AppendList.foreach (!whenComputed, fn f => f a) in a end fun equate (T s, T s', combine) = if Set.equals (s, s') then () else let val d = Set.! s val d' = Set.! s' val () = Set.union (s, s') fun one (a, {compute = _, whenComputed}) = (* Must set the value before calling the whenComputed, because * those may look at the value (which would cause it to be set, * which would then be overwritten). *) (Set.:= (s, Computed a) ; AppendList.foreach (!whenComputed, fn f => f a)) in case (d, d') of (Computed a, Computed a') => Set.:= (s, Computed (combine (a, a'))) | (Computed a, Uncomputed u) => one (a, u) | (Uncomputed u, Computed a) => one (a, u) | (Uncomputed {compute, whenComputed = w}, Uncomputed {whenComputed = w', ...}) => Set.:= (s, Uncomputed {compute = compute, whenComputed = ref (AppendList.append (!w, !w'))}) end fun whenComputed (T s, f): unit = case Set.! s of Computed a => f a | Uncomputed {whenComputed = w, ...} => AppendList.push (w, f) end mlton-20210117+dfsg/mlton/ssa/flatten.fun000066400000000000000000000473551416264345000201320ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Flatten arguments to jumps, constructors, and functions. * If a tuple is explicitly available at all uses of a jump (resp. function) * then * - The formals and call sites are changed so that the components of the * tuple are passed. * - The tuple is reconstructed at the beginning of the body of the jump. * * Similarly, if a tuple is explicitly available at all uses of a constructor, * - The constructor argument type is changed to flatten the tuple type. * - The tuple is passed flat at each ConApp. * - The tuple is reconstructed at each Case target. *) functor Flatten (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Rep = struct structure L = TwoPointLattice (val bottom = "flatten" val top = "don't flatten") open L val isFlat = not o isTop fun fromType t = case Type.deTupleOpt t of NONE => let val r = new () in makeTop r; r end | SOME _ => new () fun fromTypes (ts: Type.t vector): t vector = Vector.map (ts, fromType) val tuplize: t -> unit = makeTop val coerce = op <= fun coerces (rs, rs') = Vector.foreach2 (rs, rs', coerce) val unify = op == fun unifys (rs, rs') = Vector.foreach2 (rs, rs', unify) end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> {argsTypes: Type.t vector, args: Rep.t vector}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("Flatten.conInfo", Con.layout)) val conArgs = #args o conInfo val {get = funcInfo: Func.t -> {args: Rep.t vector, returns: Rep.t vector option, raises: Rep.t vector option}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Flatten.funcInfo", Func.layout)) val funcArgs = #args o funcInfo val {get = labelInfo: Label.t -> {args: Rep.t vector}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Flatten.labelInfo", Label.layout)) val labelArgs = #args o labelInfo val {get = varInfo: Var.t -> {rep: Rep.t, tuple: Var.t vector option ref}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => {rep = let val r = Rep.new () in Rep.tuplize r; r end, tuple = ref NONE})) val fromFormal = fn (x, ty) => let val r = Rep.fromType ty in setVarInfo (x, {rep = r, tuple = ref NONE}) ; r end val fromFormals = fn xtys => Vector.map (xtys, fromFormal) val varRep = #rep o varInfo val varTuple = #tuple o varInfo fun coerce (x: Var.t, r: Rep.t) = Rep.coerce (varRep x, r) fun coerces (xs: Var.t vector, rs: Rep.t vector) = Vector.foreach2 (xs, rs, coerce) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, args} => setConInfo (con, {argsTypes = args, args = Vector.map (args, Rep.fromType)}))) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFuncInfo (name, {args = fromFormals args, returns = Option.map (returns, Rep.fromTypes), raises = Option.map (raises, Rep.fromTypes)}) end) fun doitStatement (Statement.T {exp, var, ...}) = case exp of Tuple xs => Option.app (var, fn var => setVarInfo (var, {rep = Rep.new (), tuple = ref (SOME xs)})) | ConApp {con, args} => coerces (args, conArgs con) | Var x => setVarInfo (valOf var, varInfo x) | _ => () val _ = Vector.foreach (globals, doitStatement) val _ = List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f val {raises, returns, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (setLabelInfo (label, {args = fromFormals args}) ; Vector.foreach (statements, doitStatement))) ; Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Return xs => (case returns of NONE => Error.bug "Flatten.flatten: return mismatch" | SOME rs => coerces (xs, rs)) | Raise xs => (case raises of NONE => Error.bug "Flatten.flatten: raise mismatch" | SOME rs => coerces (xs, rs)) | Call {func, args, return} => let val {args = funcArgs, returns = funcReturns, raises = funcRaises} = funcInfo func val _ = coerces (args, funcArgs) fun unifyReturns () = case (funcReturns, returns) of (SOME rs, SOME rs') => Rep.unifys (rs, rs') | _ => () fun unifyRaises () = case (funcRaises, raises) of (SOME rs, SOME rs') => Rep.unifys (rs, rs') | _ => () in case return of Return.Dead => () | Return.NonTail {cont, handler} => (Option.app (funcReturns, fn rs => Rep.unifys (rs, labelArgs cont)) ; case handler of Handler.Caller => unifyRaises () | Handler.Dead => () | Handler.Handle handler => Option.app (funcRaises, fn rs => Rep.unifys (rs, labelArgs handler))) | Return.Tail => (unifyReturns (); unifyRaises ()) end | Goto {dst, args} => coerces (args, labelArgs dst) | Case {cases = Cases.Con cases, ...} => Vector.foreach (cases, fn (con, label) => Rep.coerces (conArgs con, labelArgs label)) | _ => ()) end) val _ = Control.diagnostics (fn display => List.foreach (functions, fn f => let val name = Function.name f val {args, raises, returns} = funcInfo name open Layout in display (seq [Func.layout name, str " ", record [("args", Vector.layout Rep.layout args), ("returns", Option.layout (Vector.layout Rep.layout) returns), ("raises", Option.layout (Vector.layout Rep.layout) raises)]]) end)) fun flattenTypes (ts: Type.t vector, rs: Rep.t vector): Type.t vector = Vector.fromList (Vector.fold2 (ts, rs, [], fn (t, r, ts) => if Rep.isFlat r then Vector.fold (Type.deTuple t, ts, op ::) else t :: ts)) val datatypes = Vector.map (datatypes, fn Datatype.T {tycon, cons} => Datatype.T {tycon = tycon, cons = (Vector.map (cons, fn {con, args} => {con = con, args = flattenTypes (args, conArgs con)}))}) fun flattens (xs as xsX: Var.t vector, rs: Rep.t vector) = Vector.fromList (Vector.fold2 (xs, rs, [], fn (x, r, xs) => if Rep.isFlat r then (case !(varTuple x) of SOME ys => Vector.fold (ys, xs, op ::) | _ => (Error.bug (concat ["Flatten.flattens: tuple unavailable: ", (Var.toString x), " ", (Layout.toString (Vector.layout Var.layout xsX))]))) else x :: xs)) fun doitStatement (stmt as Statement.T {var, ty, exp}) = case exp of ConApp {con, args} => Statement.T {var = var, ty = ty, exp = ConApp {con = con, args = flattens (args, conArgs con)}} | _ => stmt val globals = Vector.map (globals, doitStatement) fun doitFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val {args = argsReps, returns = returnsReps, raises = raisesReps} = funcInfo name val newBlocks = ref [] fun doitArgs (args, reps) = let val (args, stmts) = Vector.fold2 (args, reps, ([], []), fn ((x, ty), r, (args, stmts)) => if Rep.isFlat r then let val tys = Type.deTuple ty val xs = Vector.map (tys, fn _ => Var.newNoname ()) val _ = varTuple x := SOME xs val args = Vector.fold2 (xs, tys, args, fn (x, ty, args) => (x, ty) :: args) in (args, Statement.T {var = SOME x, ty = ty, exp = Tuple xs} :: stmts) end else ((x, ty) :: args, stmts)) in (Vector.fromList args, Vector.fromList stmts) end fun doitCaseCon {test, cases, default} = let val cases = Vector.map (cases, fn (c, l) => let val {args, argsTypes} = conInfo c val actualReps = labelArgs l in if Vector.forall2 (args, actualReps, fn (r, r') => Rep.isFlat r = Rep.isFlat r') then (c, l) else (* Coerce from the constructor representation to the * formals the jump expects. *) let val l' = Label.newNoname () (* The formals need to match the type of the con. * The actuals need to match the type of l. *) val (stmts, formals, actuals) = Vector.fold3 (args, actualReps, argsTypes, ([], [], []), fn (r, r', ty, (stmts, formals, actuals)) => if Rep.isFlat r then (* The con is flat *) let val xts = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) val xs = Vector.map (xts, #1) val formals = Vector.fold (xts, formals, op ::) val (stmts, actuals) = if Rep.isFlat r' then (stmts, Vector.fold (xs, actuals, op ::)) else let val x = Var.newNoname () in (Statement.T {var = SOME x, ty = ty, exp = Tuple xs} :: stmts, x :: actuals) end in (stmts, formals, actuals) end else (* The con is tupled *) let val tuple = Var.newNoname () val formals = (tuple, ty) :: formals val (stmts, actuals) = if Rep.isFlat r' then let val xts = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) val xs = Vector.map (xts, #1) val actuals = Vector.fold (xs, actuals, op ::) val stmts = Vector.foldi (xts, stmts, fn (i, (x, ty), stmts) => Statement.T {var = SOME x, ty = ty, exp = Select {tuple = tuple, offset = i}} :: stmts) in (stmts, actuals) end else (stmts, tuple :: actuals) in (stmts, formals, actuals) end) val _ = List.push (newBlocks, Block.T {label = l', args = Vector.fromList formals, statements = Vector.fromList stmts, transfer = Goto {dst = l, args = Vector.fromList actuals}}) in (c, l') end end) in Case {test = test, cases = Cases.Con cases, default = default} end fun doitTransfer transfer = case transfer of Call {func, args, return} => Call {func = func, args = flattens (args, funcArgs func), return = return} | Case {test, cases = Cases.Con cases, default} => doitCaseCon {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = flattens (args, labelArgs dst)} | Raise xs => Raise (flattens (xs, valOf raisesReps)) | Return xs => Return (flattens (xs, valOf returnsReps)) | _ => transfer fun doitBlock (Block.T {label, args, statements, transfer}) = let val (args, stmts) = doitArgs (args, labelArgs label) val statements = Vector.map (statements, doitStatement) val statements = Vector.concat [stmts, statements] val transfer = doitTransfer transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val (args, stmts) = doitArgs (args, argsReps) val start' = Label.newNoname () val _ = List.push (newBlocks, Block.T {label = start', args = Vector.new0 (), statements = stmts, transfer = Goto {dst = start, args = Vector.new0 ()}}) val start = start' val _ = Function.dfs (f, fn b => let val _ = List.push (newBlocks, doitBlock b) in fn () => () end) val blocks = Vector.fromList (!newBlocks) val returns = Option.map (returns, fn ts => flattenTypes (ts, valOf returnsReps)) val raises = Option.map (raises, fn ts => flattenTypes (ts, valOf raisesReps)) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, shrink o doitFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/global.fun000066400000000000000000000034501416264345000177210ustar00rootroot00000000000000(* Copyright (C) 2017,2020 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Global (S: GLOBAL_STRUCTS): GLOBAL = struct open S open Exp fun equalss (xs, xs') = Vector.equals (xs, xs', Var.equals) val expEquals = fn (ConApp {con = c, args}, ConApp {con = c', args = args'}) => Con.equals (c, c') andalso equalss (args, args') | (Const c, Const c') => Const.equals (c, c') | (PrimApp {prim = p, targs = ts, args = xs}, PrimApp {prim = p', targs = ts', args = xs'}) => (case (p, p') of (Prim.Vector_vector, Prim.Vector_vector) => Vector.equals (ts, ts', Type.equals) andalso equalss (xs, xs') | _ => false) | (Tuple xs, Tuple xs') => equalss (xs, xs') | _ => false fun make () = let type bind = {var: Var.t, ty: Type.t, exp: Exp.t} val binds: bind list ref = ref [] fun all () = Vector.fromList (List.revMap (!binds, fn {var, ty, exp} => Statement.T {var = SOME var, ty = ty, exp = exp})) before binds := [] val table: (Exp.t, bind) HashTable.t = HashTable.new {equals = expEquals, hash = Exp.hash} fun new (ty: Type.t, exp: Exp.t): Var.t = #var (HashTable.lookupOrInsert (table, exp, fn () => let val x = Var.newString "global" val bind = {var = x, ty = ty, exp = exp} in List.push (binds, bind) ; bind end)) in {new = new, all = all} end end mlton-20210117+dfsg/mlton/ssa/global.sig000066400000000000000000000010731416264345000177120ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature GLOBAL_STRUCTS = sig include SSA_TREE end signature GLOBAL = sig include GLOBAL_STRUCTS val make: unit -> { new: Type.t * Exp.t -> Var.t, all: unit -> Statement.t vector } end mlton-20210117+dfsg/mlton/ssa/inline.fun000066400000000000000000000463431416264345000177470ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Inline (S: INLINE_STRUCTS): INLINE = struct open S open Exp Transfer structure Function = struct open Function fun containsCall (f: Function.t): bool = Exn.withEscape (fn escape => (Vector.foreach (Function.blocks f, fn Block.T {transfer, ...} => case transfer of Call _ => escape true | _ => ()) ; false)) fun containsLoop (f: Function.t): bool = let val {get, set, destroy} = Property.destGetSet (Label.plist, Property.initConst false) in Exn.withEscape (fn escape => let val _ = Function.dfs (f, fn (Block.T {label, transfer, ...}) => (set (label, true) ; (case transfer of Goto {dst, ...} => if get dst then escape true else () | _ => ()) ; fn () => set (label, false))) in false end) before (destroy ()) end end local fun 'a make (dontInlineFunc: Function.t * 'a -> bool) (Program.T {functions, ...}, a: 'a): Func.t -> bool = let val {get = shouldInline: Func.t -> bool, set = setShouldInline, ...} = Property.getSetOnce (Func.plist, Property.initConst false) in List.foreach (functions, fn f => if not (Function.mayInline f) orelse dontInlineFunc (f, a) then () else setShouldInline (Function.name f, true)) ; Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val shouldInline = shouldInline name in display (seq [Func.layout name, str ": ", record [("shouldInline", Bool.layout shouldInline)]]) end) end) ; shouldInline end in val leafOnce = make (fn (f, {size}) => Option.isNone (Function.sizeMax (f, {max = size, sizeExp = Exp.size, sizeTransfer =Transfer.size})) orelse Function.containsCall f) val leafOnceNoLoop = make (fn (f, {size}) => Option.isNone (Function.sizeMax (f, {max = size, sizeExp = Exp.size, sizeTransfer =Transfer.size})) orelse Function.containsCall f orelse Function.containsLoop f) end structure Graph = DirectedGraph structure Node = Graph.Node local fun make (dontInline: Function.t -> bool) (Program.T {functions, ...}, {size: int option}) = let val max = size type info = {function: Function.t, node: unit Node.t, shouldInline: bool ref, size: int ref} val {get = funcInfo: Func.t -> info, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcInfo", Func.layout)) val {get = nodeFunc: unit Node.t -> Func.t, set = setNodeFunc, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeFunc", Node.layout)) val graph = Graph.new () (* initialize the info for each func *) val _ = List.foreach (functions, fn f => let val name = Function.name f val n = Graph.newNode graph in setNodeFunc (n, name) ; setFuncInfo (name, {function = f, node = n, shouldInline = ref false, size = ref 0}) end) (* Build the call graph. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {node, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => (ignore o Graph.addEdge) (graph, {from = node, to = #node (funcInfo func)}) | _ => ()) end) (* Compute strongly-connected components. * Then start at the leaves of the call graph and work up. *) val _ = List.foreach (rev (Graph.stronglyConnectedComponents graph), fn scc => case scc of [n] => let val {function, shouldInline, size, ...} = funcInfo (nodeFunc n) in if Function.mayInline function andalso not (dontInline function) then Exn.withEscape (fn escape => let val res = Function.sizeMax (function, {max = max, sizeExp = Exp.size, sizeTransfer = fn t => case t of Call {func, ...} => let val {shouldInline, size, ...} = funcInfo func in if !shouldInline then !size else escape () end | _ => Transfer.size t}) in case res of NONE => () | SOME n => (shouldInline := true ; size := n) end) else () end | _ => ()) val _ = Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val {shouldInline, size, ...} = funcInfo name val shouldInline = !shouldInline val size = !size in display (seq [Func.layout name, str ": ", record [("shouldInline", Bool.layout shouldInline), ("size", Int.layout size)]]) end) end) in ! o #shouldInline o funcInfo end in val leafRepeat = make (fn _ => false) val leafRepeatNoLoop = make (fn f => Function.containsLoop f) end fun nonRecursive (Program.T {functions, ...}, {small: int, product: int}) = let type info = {doesCallSelf: bool ref, function: Function.t, node: unit Node.t, numCalls: int ref, shouldInline: bool ref, size: int ref} val {get = funcInfo: Func.t -> info, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcInfo", Func.layout)) val {get = nodeFunc: unit Node.t -> Func.t, set = setNodeFunc, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeFunc", Node.layout)) val graph = Graph.new () (* initialize the info for each func *) val _ = List.foreach (functions, fn f => let val name = Function.name f val n = Graph.newNode graph in setNodeFunc (n, name) ; setFuncInfo (name, {doesCallSelf = ref false, function = f, node = n, numCalls = ref 0, shouldInline = ref false, size = ref 0}) end) (* Update call counts. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {doesCallSelf, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => let val {numCalls, ...} = funcInfo func in if Func.equals (name, func) then doesCallSelf := true else Int.inc numCalls end | _ => ()) end) fun mayInline (setSize: bool, {function, doesCallSelf, numCalls, size, ...}: info): bool = Function.mayInline function andalso not (!doesCallSelf) andalso let val n = Function.size (function, {sizeExp = Exp.size, sizeTransfer = fn t as Call {func, ...} => let val {shouldInline, size, ...} = funcInfo func in if !shouldInline then !size else Transfer.size t end | t => Transfer.size t}) in if setSize then size := n else () ; (!numCalls - 1) * (n - small) <= product end (* Build the call graph. Do not include functions that we already know * will not be inlined. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val info as {node, ...} = funcInfo name in if mayInline (false, info) then Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => if Func.equals (name, func) then () else (ignore o Graph.addEdge) (graph, {from = node, to = #node (funcInfo func)}) | _ => ()) else () end) (* Compute strongly-connected components. * Then start at the leaves of the call graph and work up. *) val _ = List.foreach (rev (Graph.stronglyConnectedComponents graph), fn [n] => let val info as {shouldInline, ...} = funcInfo (nodeFunc n) in shouldInline := mayInline (true, info) end | _ => ()) val _ = Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val {numCalls, shouldInline, size, ...} = funcInfo name val numCalls = !numCalls val shouldInline = !shouldInline val size = !size in display (seq [Func.layout name, str ": ", record [("numCalls", Int.layout numCalls), ("shouldInline", Bool.layout shouldInline), ("size", Int.layout size)]]) end) end) in ! o #shouldInline o funcInfo end fun transform {program as Program.T {datatypes, globals, functions, main}, shouldInline: Func.t -> bool, inlineIntoMain: bool} = let val {get = funcInfo: Func.t -> {function: Function.t, isCalledByMain: bool ref}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Inline.funcInfo", Func.layout)) val isCalledByMain: Func.t -> bool = ! o #isCalledByMain o funcInfo val () = List.foreach (functions, fn f => setFuncInfo (Function.name f, {function = f, isCalledByMain = ref false})) val () = Vector.foreach (#blocks (Function.dest (Program.mainFunction program)), fn Block.T {transfer, ...} => case transfer of Transfer.Call {func, ...} => #isCalledByMain (funcInfo func) := true | _ => ()) fun doit (blocks: Block.t vector, return: Return.t) : Block.t vector = let val newBlocks = ref [] val blocks = Vector.map (blocks, fn block as Block.T {label, args, statements, transfer} => let fun new transfer = Block.T {label = label, args = args, statements = statements, transfer = transfer} in case transfer of Call {func, args, return = return'} => let val return = Return.compose (return, return') in if shouldInline func then let local val {name, args, start, blocks, ...} = (Function.dest o Function.alphaRename) (#function (funcInfo func)) val blocks = doit (blocks, return) val _ = List.push (newBlocks, blocks) val name = Label.newString (Func.originalName name) val _ = List.push (newBlocks, Vector.new1 (Block.T {label = name, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}})) in val name = name end in new (Goto {dst = name, args = args}) end else new (Call {func = func, args = args, return = return}) end | Raise xs => (case return of Return.NonTail {handler = Handler.Handle handler, ...} => new (Goto {dst = handler, args = xs}) | _ => block) | Return xs => (case return of Return.NonTail {cont, ...} => new (Goto {dst = cont, args = xs}) | _ => block) | _ => block end) in Vector.concat (blocks::(!newBlocks)) end val shrink = shrinkFunction {globals = globals} val functions = List.fold (functions, [], fn (f, ac) => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f fun keep () = let val blocks = doit (blocks, Return.Tail) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) :: ac end in if Func.equals (name, main) then if inlineIntoMain then keep () else f :: ac else if shouldInline name then if inlineIntoMain orelse not (isCalledByMain name) then ac else keep () else keep () end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end fun inlineLeaf (p, {loops, repeat, size}) = if size = SOME 0 then p else transform {program = p, shouldInline = case (loops, repeat) of (false, false) => leafOnce (p, {size = size}) | (false, true) => leafRepeat (p, {size = size}) | (true, false) => leafOnceNoLoop (p, {size = size}) | (true, true) => leafRepeatNoLoop (p, {size = size}), inlineIntoMain = true} fun inlineNonRecursive (p, arg) = transform {program = p, shouldInline = nonRecursive (p, arg), inlineIntoMain = !Control.inlineIntoMain} end mlton-20210117+dfsg/mlton/ssa/inline.sig000066400000000000000000000011411416264345000177240ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature INLINE_STRUCTS = sig include SHRINK end signature INLINE = sig include INLINE_STRUCTS val inlineLeaf: Program.t * {loops: bool, repeat: bool, size: int option} -> Program.t val inlineNonRecursive: Program.t * {small:int,product:int} -> Program.t end mlton-20210117+dfsg/mlton/ssa/introduce-loops.fun000066400000000000000000000110531416264345000216050ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Change any toplevel function that only calls itself in tail position * into one with a local loop and no self calls. *) functor IntroduceLoops (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t structure Return = struct open Return fun isTail (z: t): bool = case z of Dead => false | NonTail _ => false | Tail => true end fun transform (Program.T {datatypes, globals, functions, main}) = let val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val tailCallsItself = ref false val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => if Func.equals (name, func) andalso Return.isTail return then tailCallsItself := true else () | _ => ()) val (args, start, blocks) = if !tailCallsItself then let val _ = Control.diagnostics (fn display => let open Layout in display (Func.layout name) end) val newArgs = Vector.map (args, fn (x, t) => (Var.new x, t)) val loopName = Label.newString "loop" val loopSName = Label.newString "loopS" val blocks = Vector.toListMap (blocks, fn Block.T {label, args, statements, transfer} => let val transfer = case transfer of Call {func, args, return} => if Func.equals (name, func) andalso Return.isTail return then Goto {dst = loopName, args = args} else transfer | _ => transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val blocks = Vector.fromList (Block.T {label = loopSName, args = Vector.new0 (), statements = Vector.new0 (), transfer = Goto {dst = loopName, args = Vector.map (newArgs, #1)}} :: Block.T {label = loopName, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} :: blocks) in (newArgs, loopSName, blocks) end else (args, start, blocks) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end mlton-20210117+dfsg/mlton/ssa/known-case.fun000066400000000000000000001176251416264345000205400ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor KnownCase (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector} local fun make f (T r) = f r in val cons = make #cons end fun layout (T {cons, ...}) = Layout.record [("cons", Vector.layout Con.layout cons)] end structure ConInfo = struct datatype t = T of {args: Type.t vector, index: int, tycon: Tycon.t} local fun make f (T r) = f r in val args = make #args val index = make #index end fun layout (T {index, ...}) = Layout.record [("index", Int.layout index)] end structure ConValue = struct type w = Var.t ref vector type v = w option type u = v option type t = Con.t * u val equalsW : w * w -> bool = fn (x, y) => Vector.equals (x, y, fn (x, y) => Var.equals (!x, !y)) val layoutW = Vector.layout (Var.layout o !) val layoutV = Option.layout layoutW val layoutU = Option.layout layoutV val layout : t -> Layout.t = Layout.tuple2 (Con.layout, layoutU) val joinV : v * v -> v = fn (SOME x, SOME y) => if equalsW (x, y) then SOME x else NONE | (NONE, _) => NONE | (_, NONE) => NONE val joinU : u * u -> u = fn (SOME x, SOME y) => SOME (joinV (x, y)) | (NONE, y) => y | (x, NONE) => x val join : t * t -> t = fn ((conx, x), (cony, y)) => if Con.equals (conx, cony) then (conx, joinU (x, y)) else Error.bug "KnownCase.ConValue.join" fun newKnown (con, args) : t = (con, SOME (SOME args)) fun newUnknown con : t = (con, SOME NONE) fun new con : t = (con, NONE) fun isTop ((_, x) : t) = isSome x val con : t -> Con.t = fn (conx, _) => conx end structure TyconValue = struct type t = ConValue.t vector val layout : t -> Layout.t = Vector.layout ConValue.layout val join : t * t -> t = fn (x, y) => Vector.map2 (x, y, ConValue.join) fun newKnown (cons, con, args) = Vector.map (cons, fn con' => if Con.equals (con, con') then ConValue.newKnown (con, args) else ConValue.new con') fun newUnknown cons = Vector.map (cons, ConValue.newUnknown) val cons : t -> Con.t vector = fn x => Vector.map (x, ConValue.con) end structure VarInfo = struct datatype t = T of {active: bool ref, tyconValues: TyconValue.t list ref, var: Var.t} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (_, active') = make' #active end fun layout (T {active, tyconValues, var, ...}) = Layout.record [("active", Bool.layout (!active)), ("tyconValues", List.layout TyconValue.layout (!tyconValues)), ("var", Var.layout var)] fun new var = T {active = ref false, tyconValues = ref [], var = var} fun deactivate (T {active, ...}) = active := false fun activate (T {active, ...}) = active := true fun activate' (vi, addPost: (unit -> unit) -> unit) = (addPost (fn () => deactivate vi); activate vi) val active = active' fun tyconValue (T {tyconValues, ...}) = case !tyconValues of h::_ => SOME h | _ => NONE fun popTyconValue (T {tyconValues, ...}) = ignore (List.pop tyconValues) fun pushTyconValue (T {tyconValues, ...}, tcv) = List.push (tyconValues, tcv) fun pushTyconValue' (vi, tcv, addPost) = let val _ = pushTyconValue (vi, tcv) val _ = addPost (fn () => popTyconValue vi) in () end fun joinActiveTyconValue (vi, tcv, addPost, addPost') = if active vi then let val tcv' = valOf (tyconValue vi) in popTyconValue vi; pushTyconValue (vi, TyconValue.join (tcv, tcv')) end else (activate' (vi, addPost'); pushTyconValue' (vi, tcv, addPost)) end structure ReplaceInfo = struct datatype t = T of {replaces: Var.t ref list ref} fun new var = T {replaces = ref [ref var]} fun replace (T {replaces, ...}) = case !replaces of h::_ => h | _ => Error.bug "KnownCase.ReplaceInfo.replace" fun popReplace (T {replaces, ...}) = ignore (List.pop replaces) fun pushReplace (T {replaces, ...}, rep) = List.push (replaces, ref rep) fun pushReplace' (vi, rep, addPost) = let val _ = pushReplace (vi, rep) val _ = addPost (fn () => popReplace vi) in () end fun flipReplace (vi, rep) = let val r = replace vi in !r before (r := rep) end fun flipReplace' (vi, rep, addPost) = let val rep = flipReplace (vi, rep) val _ = addPost (fn () => ignore (flipReplace (vi, rep))) in rep end fun nextReplace' (vi, rep, addPost) = let val rep = flipReplace' (vi, rep, addPost) val _ = pushReplace' (vi, rep, addPost) in () end end structure LabelInfo = struct datatype t = T of {activations: (VarInfo.t * TyconValue.t) list ref, block: Block.t, depth: int ref, pred: Label.t option option ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val block = make #block val (_, depth') = make' #depth end fun layout (T {pred, ...}) = Layout.record [("pred", Option.layout (Option.layout Label.layout) (!pred))] fun new block = T {activations = ref [], block = block, depth = ref 0, pred = ref NONE} fun popDepth (T {depth, ...}) = Int.dec depth fun pushDepth (T {depth, ...}) = Int.inc depth fun pushDepth' (li, addPost) = let val _ = pushDepth li val _ = addPost (fn () => popDepth li) in () end fun addPred (T {pred, ...}, l) = case !pred of NONE => pred := SOME (SOME l) | SOME NONE => () | SOME (SOME l') => if Label.equals (l, l') then () else pred := SOME NONE fun onePred (T {pred, ...}) = case !pred of SOME (SOME _) => true | _ => false fun addActivation (T {activations, ...}, activation) = List.push (activations, activation) fun activate (T {activations, ...}, addPost) = let val {addPost = addPost', post = post'} = mkPost () in List.foreach (!activations, fn (vi, tcv) => VarInfo.joinActiveTyconValue (vi, tcv, addPost, addPost')); post' () end val activate : t * ((unit -> unit) -> unit) -> unit = Trace.trace ("KnownCase.LabelInfo.activate", fn (T {activations, block = Block.T {label, ...}, ...}, _) => let open Layout in seq [Label.layout label, str " ", (List.layout (tuple2 (VarInfo.layout, TyconValue.layout)) (!activations))] end, Layout.ignore) activate end fun transform (Program.T {globals, datatypes, functions, main}) = let (* restore and shrink *) val restore = restoreFunction {globals = globals} val shrink = shrinkFunction {globals = globals} (* tyconInfo and conInfo *) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("knownCase.tyconInfo", Tycon.layout)) val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("knownCase.conInfo", Con.layout)) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (setTyconInfo (tycon, TyconInfo.T {cons = Vector.map (cons, #con)}); Vector.foreachi (cons, fn (i, {con, args}) => setConInfo (con, ConInfo.T {args = args, index = i, tycon = tycon})))) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val tci = tyconInfo tycon in display (seq [Tycon.layout tycon, str " ", TyconInfo.layout tci, Vector.layout (fn {con, ...} => let val ci = conInfo con in seq [Con.layout con, str " ", ConInfo.layout ci] end) cons]) end) end) fun optimizeTycon _ = true fun optimizeType ty = case Type.dest ty of Type.Datatype tycon => optimizeTycon tycon | _ => false (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn x => VarInfo.new x)) (* replaceInfo *) val {get = replaceInfo: Var.t -> ReplaceInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn x => ReplaceInfo.new x)) fun bindVar' (x, ty, exp, addPost) = case Type.dest ty of Type.Datatype tycon => if optimizeTycon tycon then let val cons = TyconInfo.cons (tyconInfo tycon) val tyconValue = case exp of SOME (ConApp {con, args}) => TyconValue.newKnown (cons, con, Vector.map (args, ReplaceInfo.replace o replaceInfo)) | _ => TyconValue.newUnknown cons in VarInfo.pushTyconValue' (varInfo x, tyconValue, addPost) end else () | _ => () fun bindVarArgs' (args, addPost) = Vector.foreach (args, fn (x, ty) => bindVar' (x, ty, NONE, addPost)) fun bindVarArgs args = bindVarArgs' (args, ignore) fun bindVarStatement' (Statement.T {var, ty, exp}, addPost) = Option.app (var, fn x => bindVar' (x, ty, SOME exp, addPost)) fun bindVarStatements' (statements, addPost) = Vector.foreach (statements, fn statement => bindVarStatement' (statement, addPost)) fun bindVarStatements statements = bindVarStatements' (statements, ignore) val _ = bindVarStatements globals (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (globals, fn Statement.T {var, ...} => Option.app (var, fn x => let val vi = varInfo x in display (seq [Var.layout x, str " ", VarInfo.layout vi]) end)) end) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("knownCase.labelInfo", Label.layout)) val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, LabelInfo.new block)) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => Transfer.foreachLabel (transfer, fn l => let val li = labelInfo l in LabelInfo.addPred (li, label) end)) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (blocks, fn Block.T {label, ...} => let val li = labelInfo label in display (seq [Label.layout label, str " ", LabelInfo.layout li]) end) end) val newBlocks = ref [] fun addBlock block = List.push (newBlocks, block) fun addNewBlock (block as Block.T {label, ...}) = (setLabelInfo (label, LabelInfo.new block); addBlock block) local val table: (Transfer.t, Label.t) HashTable.t = HashTable.new {hash = Transfer.hash, equals = Transfer.equals} in fun newBlock transfer = let val label = Label.newNoname () val block = Block.T {label = label, args = Vector.new0 (), statements = Vector.new0 (), transfer = transfer} val _ = addNewBlock block in label end (* newBlock' isn't used, because it shares blocks that causes * violation of the requirements for profiling information -- * namely that each block correspond to a unique sequence of * source infos at it' start. * * I left the code in case we want to enable it when compiling * without profiling. *) fun newBlock' transfer = HashTable.lookupOrInsert (table, transfer, fn () => newBlock transfer) val _ = newBlock' (* quell unused variable warning *) fun bugBlock () = newBlock Bug end val traceRewriteGoto = Trace.trace ("KnownCase.rewriteGoto", fn {dst, args} => Layout.record [("dst", Label.layout dst), ("args", Vector.layout Var.layout args)], Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) val traceRewriteCase = Trace.trace ("KnownCase.rewriteCase", fn {test, cases, default} => Layout.record [("test", Var.layout test), ("cases", Vector.layout (Layout.tuple2 (Con.layout, Label.layout)) cases), ("default", Option.layout Label.layout default)], Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) val traceRewriteTransfer = Trace.trace ("KnownCase.rewriteTransfer", Transfer.layout, Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) fun rewriteGoto' {dst, args} : (Statement.t vector * Transfer.t) option = let val li = labelInfo dst val Block.T {args = argsDst, statements = statementsDst, transfer = transferDst, ...} = LabelInfo.block li val depthDst = LabelInfo.depth' li in if depthDst <= 2 andalso Vector.fold (statementsDst, 0, fn (Statement.T {exp = Profile _, ...}, i) => i | (_, i) => i + 1) <= 0 then let val {addPost, post} = mkPost () val _ = LabelInfo.pushDepth' (li, addPost) val vars = Vector.map2 (args, argsDst, fn (x, (z, ty)) => (x, Var.newNoname (), z, Var.newNoname (), ty)) val moves1 = if depthDst > 0 then Vector.map (vars, fn (_, _, z, t, ty) => (if optimizeType ty then let val zvi = varInfo z val tvi = varInfo t in VarInfo.pushTyconValue' (tvi, valOf (VarInfo.tyconValue zvi), addPost) end else (); ReplaceInfo.nextReplace' (replaceInfo z, t, addPost); Statement.T {var = SOME t, ty = ty, exp = Var z})) else Vector.new0 () val moves2 = Vector.map (vars, fn (x, t, _, _, ty) => (if optimizeType ty then let val xvi = varInfo x val tvi = varInfo t in VarInfo.pushTyconValue' (tvi, valOf (VarInfo.tyconValue xvi), addPost) end else (); Statement.T {var = SOME t, ty = ty, exp = Var x})) val moves3 = Vector.map (vars, fn (_, t, z, _, ty) => (if optimizeType ty then let val tvi = varInfo t val zvi = varInfo z in VarInfo.pushTyconValue' (zvi, valOf (VarInfo.tyconValue tvi), addPost) end else (); Statement.T {var = SOME z, ty = ty, exp = Var t})) val _ = bindVarStatements' (statementsDst, addPost) in (case rewriteTransfer transferDst of NONE => NONE | SOME (newStatements, newTransfer) => SOME (Vector.concat [moves1, moves2, moves3, statementsDst, newStatements], newTransfer)) before (post ()) end else NONE end and rewriteGoto goto = traceRewriteGoto rewriteGoto' goto and rewriteCase' {test, cases, default} : (Statement.t vector * Transfer.t) option = let val {addPost, post} = mkPost () val testvi = varInfo test val tyconValue as conValues = case VarInfo.tyconValue testvi of SOME tyconValue => tyconValue | _ => Error.bug "KnownCase.rewriteCase: tyconValue" val cons = TyconValue.cons tyconValue val numCons = Vector.length cons datatype z = None | One of (Con.t * ConValue.v) | Many fun doOneSome (con, args) = let val goto = case Vector.peek (cases, fn (con', _) => Con.equals (con, con')) of SOME (_, dst) => {dst = dst, args = Vector.map (args, !)} | NONE => {dst = valOf default, args = Vector.new0 ()} in case rewriteGoto goto of NONE => SOME (Vector.new0 (), Transfer.Goto goto) | sst => sst end val doOneSome = Trace.trace ("KnownCase.doOneSome", Layout.ignore, Layout.ignore) doOneSome fun rewriteDefault conValues' = let val _ = VarInfo.pushTyconValue' (testvi, conValues', addPost) in rewriteGoto {dst = valOf default, args = Vector.new0 ()} end val rewriteDefault = Trace.trace ("KnownCase.rewriteCase.rewriteDefault", Layout.ignore, Layout.ignore) rewriteDefault fun doOneNone con = let fun doit dst = SOME (Vector.new0 (), Case {test = test, cases = Cases.Con (Vector.new1 (con, dst)), default = if numCons = 1 then NONE else SOME (bugBlock ())}) in case Vector.peek (cases, fn (con', _) => Con.equals (con, con')) of SOME (_, dst) => doit dst | NONE => let val args = Vector.map (ConInfo.args (conInfo con), fn ty => let val x = Var.newNoname () val xvi = varInfo x val _ = case Type.dest ty of Type.Datatype tycon => if optimizeTycon tycon then VarInfo.pushTyconValue' (xvi, TyconValue.newUnknown (TyconInfo.cons (tyconInfo tycon)), addPost) else () | _ => () in (x, ty) end) val (xs, _) = Vector.unzip args val conValues' = TyconValue.newKnown (cons, con, Vector.map (xs, ReplaceInfo.replace o replaceInfo)) val label = Label.newNoname () val (statements, transfer) = case rewriteDefault conValues' of SOME sst => sst | NONE => (Vector.new0 (), Goto {dst = valOf default, args = Vector.new0 ()}) val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} val _ = addNewBlock block in doit label end end val doOneNone = Trace.trace ("KnownCase.rewriteCase.doOneNone", Layout.ignore, Layout.ignore) doOneNone fun doMany () = let val usedCons = Array.new (numCons, false) val cases = Vector.keepAllMap (cases, fn (con, dst) => let val conIndex = ConInfo.index (conInfo con) val _ = Array.update (usedCons, conIndex, true) in if ConValue.isTop (Vector.sub (conValues, conIndex)) then SOME (con, dst) else NONE end) val (cases, default) = case default of NONE => (cases, NONE) | SOME dst => let val conValues' = Vector.mapi (cons, fn (i, con) => if Array.sub (usedCons, i) then ConValue.new con else Vector.sub (conValues, i)) fun route (statements, (cases, default)) = if Vector.isEmpty statements then (cases, default) else let fun route' dst = let val Block.T {args, ...} = LabelInfo.block (labelInfo dst) val label = Label.newNoname () val args = Vector.map (args, fn (_, ty) => (Var.newNoname (), ty)) val xs = Vector.map (args, #1) val block = Block.T {label = label, args = args, statements = statements, transfer = Goto {dst = dst, args = xs}} val _ = addNewBlock block in label end in (Vector.map (cases, fn (con, dst) => (con, route' dst)), Option.map (default, route')) end in case rewriteDefault conValues' of SOME (statements, Case {test = test', cases = Cases.Con cases', default = default'}) => if Option.equals (SOME test, Vector.foldr (statements, SOME test', fn (Statement.T _, NONE) => NONE | (Statement.T {var, exp, ...}, SOME test') => if Option.equals (var, SOME test', Var.equals) then case exp of Var test' => SOME test' | _ => NONE else SOME test'), Var.equals) then let val (cases', default') = route (statements, (cases', default')) in (Vector.concat [cases, cases'], default') end else (cases, SOME dst) | SOME (statements, transfer) => let val label = if Vector.isEmpty statements then newBlock transfer else let val label = Label.newNoname () val block = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = addNewBlock block in label end in (cases, SOME label) end | NONE => (cases, SOME dst) end val numCases = Vector.length cases fun doit (cases, default) = SOME (Vector.new0 (), Case {test = test, cases = Cases.Con cases, default = default}) in if numCases = numCons then doit (cases, NONE) else doit (cases, case default of SOME _ => default | NONE => SOME (bugBlock ())) end val doMany = Trace.trace ("KnownCase.rewriteCase.doMany", Layout.ignore, Layout.ignore) doMany in (* (if Vector.forall (conValues, ConValue.isTop) *) (if false then NONE else case Vector.foldi (conValues, None, fn (_, _, Many) => Many | (_, conValue, One ccv) => (case conValue of (_, NONE) => One ccv | (_, SOME _) => Many) | (_, conValue, None) => (case conValue of (_, NONE) => None | (con, SOME cv) => One (con, cv))) of None => SOME (Vector.new0 (), Bug) | One (con, SOME args) => doOneSome (con, args) | One (con, NONE) => doOneNone con | Many => doMany ()) before (post ()) end and rewriteCase casee = traceRewriteCase rewriteCase' casee and rewriteTransfer' (transfer: Transfer.t) : (Statement.t vector * Transfer.t) option = case transfer of Goto {dst, args} => rewriteGoto {dst = dst, args = args} | Case {test, cases = Cases.Con cases, default} => rewriteCase {test = test, cases = cases, default = default} | _ => NONE and rewriteTransfer transfer = traceRewriteTransfer rewriteTransfer' transfer fun activateGoto {dst, args} = let val liDst = labelInfo dst val Block.T {args = argsDst, ...} = LabelInfo.block liDst in if LabelInfo.onePred liDst then Vector.foreach2 (args, argsDst, fn (x, (y, ty)) => if optimizeType ty then let val xvi = varInfo x val yvi = varInfo y val conValues' = valOf (VarInfo.tyconValue xvi) in LabelInfo.addActivation (liDst, (yvi, conValues')) end else ()) else () end fun activateCase {test, cases, default} = let val testvi = varInfo test val tyconValue as conValues = case VarInfo.tyconValue testvi of NONE => Error.bug "KnownCase.activateCase: tyconValue" | SOME tyconValue => tyconValue val cons = TyconValue.cons tyconValue val numCons = Vector.length cons val usedCons = Array.new (numCons, false) in Vector.foreach (cases, fn (con, dst) => let val conIndex = ConInfo.index (conInfo con) val _ = Array.update (usedCons, conIndex, true) val liDst = labelInfo dst val Block.T {args = argsDst, ...} = LabelInfo.block liDst val conValues' = TyconValue.newKnown (cons, con, Vector.map (argsDst, ReplaceInfo.replace o replaceInfo o #1)) in if LabelInfo.onePred liDst then LabelInfo.addActivation (liDst, (testvi, conValues')) else () end); Option.app (default, fn dst => let val liDst = labelInfo dst val conValues' = Vector.mapi (cons, fn (i, con) => if Array.sub (usedCons, i) then ConValue.new con else Vector.sub (conValues, i)) in if LabelInfo.onePred liDst then LabelInfo.addActivation (liDst, (testvi, conValues')) else () end) end fun activateTransfer transfer = case transfer of Goto {dst, args} => activateGoto {dst = dst, args = args} | Case {test, cases = Cases.Con cases, default} => activateCase {test = test, cases = cases, default = default} | _ => () fun rewriteBlock (Block.T {label, args, statements, transfer}, addPost) = let val li = labelInfo label val _ = LabelInfo.pushDepth' (li, addPost) val _ = bindVarArgs' (args, addPost) val _ = LabelInfo.activate (li, addPost) val _ = bindVarStatements' (statements, addPost) val _ = activateTransfer transfer val (statements, transfer) = case rewriteTransfer transfer of NONE => (statements, transfer) | SOME (newStatements, newTransfer) => (Vector.concat [statements,newStatements], newTransfer) in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val rewriteBlock = Trace.trace ("KnownCase.rewriteBlock", Layout.tuple2 (Block.layout, Layout.ignore), Block.layout) rewriteBlock fun doitTree tree = let fun loop (Tree.T (block, children)) = let val {addPost, post} = mkPost () val block = rewriteBlock (block, addPost) in addBlock block ; Vector.foreach (children, loop) ; post () end val _ = loop tree in Vector.fromListRev (!newBlocks) end val _ = bindVarArgs args val blocks = doitTree (Function.dominatorTree f) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = eliminateDeadBlocksFunction f val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = restore f val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = shrink f val _ = Control.diagnostics (fn display => display (Function.layout f)) val _ = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/local-flatten.fun000066400000000000000000000275321416264345000212150ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor LocalFlatten (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer (* Flatten a jump arg as long as it is only flows to selects and there is * some tuple constructed in this function that flows to it. *) structure ArgInfo = struct datatype t = T of {fromTuple: bool ref, fromForce: t list ref, toSelect: bool ref, toForce: t list ref} fun isFlat (T {fromTuple, toSelect, ...}) = !fromTuple andalso !toSelect val isTupled = not o isFlat fun layout (i: t): Layout.t = Layout.str (if isFlat i then "flat" else "tupled") fun new () = T {fromTuple = ref false, fromForce = ref [], toSelect = ref true, toForce = ref []} fun tuple (T {fromTuple = f, fromForce, ...}) = if !f then () else (f := true; List.foreach (!fromForce, tuple)) fun nonSelect (T {toSelect = t, toForce, ...}) = if !t then (t := false; List.foreach (!toForce, nonSelect)) else () val op <= = fn (lhs as T {fromTuple = f, fromForce, ...}, rhs as T {toSelect = t, toForce, ...}) => let val _ = if !f then tuple rhs else List.push (fromForce, rhs) val _ = if !t then List.push (toForce, lhs) else nonSelect lhs in () end end structure VarInfo = struct datatype t = None | Arg of ArgInfo.t | Tuple end fun transform (Program.T {globals, datatypes, functions, main}) = let val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst VarInfo.None) type argsInfo = (ArgInfo.t * Type.t) option vector val {get = labelArgs: Label.t -> argsInfo, set = setLabelArgs, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("args", Label.layout)) val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelArgs (label, Vector.map (args, fn (x, t) => if Type.isTuple t then let val i = ArgInfo.new () val _ = setVarInfo (x, VarInfo.Arg i) in SOME (i, t) end else NONE))) fun force (x: Var.t): unit = case varInfo x of VarInfo.Arg i => ArgInfo.nonSelect i | _ => () fun forces (xs: Var.t vector): unit = Vector.foreach (xs, force) fun forceArgs (l: Label.t): unit = Vector.foreach (labelArgs l, fn NONE => () | SOME (i, _) => ArgInfo.nonSelect i) fun visit (Block.T {statements, transfer, ...}): unit -> unit = let val _ = Vector.foreach (statements, fn Statement.T {var, exp, ...} => case exp of ConApp {args, ...} => forces args | PrimApp {args, ...} => forces args | Tuple args => (setVarInfo (valOf var, VarInfo.Tuple) ; forces args) | Var x => force x | _ => ()) val _ = case transfer of Bug => () | Call {args, return, ...} => (forces args ; Return.foreachLabel (return, forceArgs)) | Case {cases, default, ...} => (Cases.foreach (cases, forceArgs) ; Option.app (default, forceArgs)) | Goto {dst, args} => Vector.foreach2 (args, labelArgs dst, fn (_, NONE) => () | (x, SOME (i, _)) => (case varInfo x of VarInfo.Arg i' => ArgInfo.<= (i', i) | VarInfo.None => () | VarInfo.Tuple => ArgInfo.tuple i)) | Raise xs => forces xs | Return xs => forces xs | Runtime {args, return, ...} => (forces args ; forceArgs return) in fn () => () end val _ = Function.dfs (f, visit) val _ = Control.diagnostics (fn display => let fun doit x = case varInfo x of VarInfo.Arg i => display (let open Layout in seq [Var.layout x, str " ", ArgInfo.layout i] end) | _ => () in Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach(args, doit o #1); Vector.foreach(statements, fn Statement.T {var, ...} => Option.app(var, doit)))) end) fun makeTuple (formals: (Var.t * Type.t) vector, reps: argsInfo) : (Var.t * Type.t) vector * Statement.t list = let val (argss, stmts) = Vector.map2AndFold (formals, reps, [], fn ((x, ty), rep, stmts) => case rep of NONE => (Vector.new1 (x, ty), stmts) | SOME (i, _) => if ArgInfo.isTupled i then (Vector.new1 (x, ty), stmts) else let val vars = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) in (vars, Statement.T {var = SOME x, ty = ty, exp = Tuple (Vector.map (vars, #1))} :: stmts) end) in (Vector.concatV argss, stmts) end fun makeSelects (args: Var.t vector, formals: argsInfo) : Var.t vector * Statement.t list = let val (argss, stmts) = Vector.map2AndFold (args, formals, [], fn (x, formal, stmts) => case formal of NONE => (Vector.new1 x, stmts) | SOME (i, t) => if ArgInfo.isTupled i then (Vector.new1 x, stmts) else let val (vars, stmts) = Vector.foldi (Type.deTuple t, ([], stmts), fn (i, ty, (vars, stmts)) => let val var = Var.newNoname () in (var :: vars, Statement.T {var = SOME var, ty = ty, exp = Select {tuple = x, offset = i}} :: stmts) end) in (Vector.fromListRev vars, stmts) end) in (Vector.concatV argss, stmts) end fun anyFlat (v: argsInfo): bool = Vector.exists (v, fn NONE => false | SOME (i, _) => ArgInfo.isFlat i) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let val (args, pre) = let val formals = labelArgs label in if anyFlat formals then makeTuple (args, formals) else (args, []) end val (post, transfer) = case transfer of Goto {dst, args} => let val formals = labelArgs dst in if anyFlat formals then let val (args, stmts) = makeSelects (args, formals) in (stmts, Goto {dst = dst, args = args}) end else ([], transfer) end | _ => ([], transfer) val statements = Vector.concatV (Vector.new3 (Vector.fromList pre, statements, Vector.fromList post)) in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/local-ref.fun000066400000000000000000000514321416264345000203300ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor LocalRef (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Prim = struct open Prim val isReff: 'a t -> bool = fn p => case p of Ref_ref => true | _ => false end structure FuncLattice = FlatLattice (structure Point = Func) structure GlobalInfo = struct datatype t = T of {isGlobalRef: bool, funcUses: FuncLattice.t} fun layout (T {isGlobalRef, funcUses, ...}) = let open Layout in record [("isGlobalRef", Bool.layout isGlobalRef), ("funcUses", FuncLattice.layout funcUses)] end local fun make f (T r) = f r in val isGlobalRef = make #isGlobalRef val funcUses = make #funcUses end fun new isGlobalRef = T {isGlobalRef = isGlobalRef, funcUses = FuncLattice.new ()} end structure Local = struct structure L = TwoPointLattice (val bottom = "local" val top = "non local") open L val isLocal = isBottom val nonLocal = makeTop end structure VarInfo = struct datatype t = T of {reff: (Label.t * Type.t) option, assigns: Label.t list ref, derefs: Label.t list ref, locall: Local.t, threadCopyCurrent: {assign: bool ref, deref: bool ref}} fun layout (T {reff, assigns, derefs, locall, threadCopyCurrent = {assign, deref, ...}, ...}) = let open Layout in record [("reff", Option.layout (tuple2 (Label.layout, Type.layout)) reff), ("assigns", List.layout Label.layout (!assigns)), ("derefs", List.layout Label.layout (!derefs)), ("locall", Local.layout locall), ("threadCopyCurrent", record [("assign", Bool.layout (!assign)), ("deref", Bool.layout (!deref))])] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val reff = make #reff val (assigns, _) = make' #assigns val (derefs, _) = make' #derefs val locall = make #locall val threadCopyCurrent = make #threadCopyCurrent end val isLocal = Local.isLocal o locall val nonLocal = Local.nonLocal o locall local fun make f = f o threadCopyCurrent fun make' f = (make f, ! o (make f)) in val (threadCopyCurrentAssign,threadCopyCurrentAssign') = make' #assign val (threadCopyCurrentDeref,threadCopyCurrentDeref') = make' #deref end fun new reff: t = T {reff = reff, assigns = ref [], derefs = ref [], locall = let val locall = Local.new () val _ = if isSome reff then () else Local.nonLocal locall in locall end, threadCopyCurrent = {assign = ref false, deref = ref false}} end structure LabelInfo = struct datatype t = T of {reffs: Var.t list ref, assigns: Var.t list ref, derefs: Var.t list ref, preds: Label.t list ref, visited: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (reffs, reffs') = make' #reffs val (assigns, assigns') = make' #assigns val (derefs, derefs') = make' #derefs val (preds, preds') = make' #preds val (visited, visited') = make' #visited end fun new (): t = T {reffs = ref [], assigns = ref [], derefs = ref [], preds = ref [], visited = ref false} end structure Multi = Multi (S) fun transform (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program (* Compute multi *) val multi = Control.trace (Control.Detail, "multi") Multi.multi val {usesThreadsOrConts: bool, funcIsMultiUsed: Func.t -> bool, labelDoesThreadCopyCurrent: Label.t -> bool, ...} = multi program (* Initialize globalInfo *) val {get = globalInfo: Var.t -> GlobalInfo.t, set = setGlobalInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => GlobalInfo.new false)) val varFuncUses = GlobalInfo.funcUses o globalInfo val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => Option.app (var, fn var => case exp of PrimApp {prim, ...} => if Prim.isReff prim then setGlobalInfo (var, GlobalInfo.new true) else () | _ => ())) (* Compute funcUses *) fun addFunc f x = let val gi = globalInfo x in if GlobalInfo.isGlobalRef gi then ignore (FuncLattice.lowerBound (GlobalInfo.funcUses gi, f)) else () end val dummy = Func.newNoname () val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => let fun default () = Exp.foreachVar (exp, addFunc dummy) in case exp of PrimApp {prim, args, ...} => if Prim.isReff prim then ignore (FuncLattice.<= (varFuncUses (valOf var), varFuncUses (Vector.first args))) else default () | _ => default () end) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, fn Statement.T {exp, ...} => Exp.foreachVar (exp, addFunc name)) ; Transfer.foreachVar (transfer, addFunc name))) end) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (str "\n\nGlobals:") ; (Vector.foreach (globals, fn Statement.T {var, ...} => Option.app (var, fn x => if GlobalInfo.isGlobalRef (globalInfo x) then display (seq [Var.layout x, str ": ", GlobalInfo.layout (globalInfo x)]) else ()))) end) (* Localize global refs *) val {get = funcInfo: Func.t -> {locals: Statement.t list ref}, ...} = Property.get (Func.plist, Property.initFun (fn _ => {locals = ref []})) val globals = Vector.keepAllMap (globals, fn (s as Statement.T {var, ...}) => case var of NONE => SOME s | SOME x => let val GlobalInfo.T {isGlobalRef, funcUses} = globalInfo x in if not isGlobalRef then SOME s else (case FuncLattice.getPoint funcUses of NONE => SOME s | SOME f => if funcIsMultiUsed f orelse Func.equals (f, dummy) then SOME s else (List.push (#locals (funcInfo f), s) ; NONE)) end) (* restore and shrink *) val restore = restoreFunction {globals = globals} val shrink = shrinkFunction {globals = globals} (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => VarInfo.new NONE)) fun nonLocal x = VarInfo.nonLocal (varInfo x) fun isLocal x = VarInfo.isLocal (varInfo x) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("localRef.labelInfo", Label.layout)) fun rewrite (f: Function.t, refs): Function.t = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " LocalRefs: ", List.layout (fn x => seq [Var.layout x, str ": ", VarInfo.layout (varInfo x)]) refs]) end) (* Rewrite. *) fun rewriteStatement (s: Statement.t as Statement.T {exp, var, ...}) = (case exp of PrimApp {prim, args, ...} => let fun arg n = Vector.sub (args, n) fun rewriteReffAssign rvar var = let val vi = varInfo rvar in if VarInfo.isLocal vi then Statement.T {var = SOME rvar, ty = #2 (valOf (VarInfo.reff vi)), exp = Var var} else s end fun rewriteReff () = case var of NONE => s | SOME var => rewriteReffAssign var (arg 0) fun rewriteAssign () = rewriteReffAssign (arg 0) (arg 1) fun rewriteDeref rvar = let val vi = varInfo rvar in if VarInfo.isLocal vi then let in Statement.T {var = var, ty = #2 (valOf (VarInfo.reff vi)), exp = Var rvar} end else s end val rewriteDeref = fn () => rewriteDeref (arg 0) in case prim of Prim.Ref_ref => rewriteReff () | Prim.Ref_assign => rewriteAssign () | Prim.Ref_deref => rewriteDeref () | _ => s end | _ => s) fun rewriteBlock (Block.T {label, args, statements, transfer}) = let val li = labelInfo label (* Don't need to rewrite the statements * if this block doesn't mention localizable refs. *) val statements = if List.exists (LabelInfo.reffs' li, isLocal) orelse List.exists (LabelInfo.assigns' li, isLocal) orelse List.exists (LabelInfo.derefs' li, isLocal) then Vector.map (statements, rewriteStatement) else statements in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val blocks = Vector.map (blocks, rewriteBlock) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val f = restore f val f = shrink f in f end val functions = List.revMap (functions, fn f => let val {name, ...} = Function.dest f val {locals, ...} = funcInfo name val locals = !locals val f = if List.isEmpty locals then f else let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val locals = Vector.fromListRev locals val localsLabel = Label.newNoname () val localsBlock = Block.T {label = localsLabel, args = Vector.new0 (), statements = locals, transfer = Goto {dst = start, args = Vector.new0 ()}} val blocks = Vector.concat [Vector.new1 localsBlock, blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = localsLabel} end (* Find all localizable refs. *) val refs = ref [] fun visitStatement label (Statement.T {var, ty, exp}) = let val li = labelInfo label fun setReff () = Option.app (var, fn var => let val vi = VarInfo.new (SOME (label, Type.deRef ty)) val _ = setVarInfo (var, vi) in List.push (refs, var) ; List.push (LabelInfo.reffs li, var) end) fun setAssign var = (List.push (VarInfo.assigns (varInfo var), label) ; List.push (LabelInfo.assigns li, var)) fun setDeref var = (List.push (VarInfo.derefs (varInfo var), label) ; List.push (LabelInfo.derefs li, var)) fun default () = Exp.foreachVar (exp, nonLocal) in case exp of PrimApp {prim, args, ...} => let fun arg n = Vector.sub (args, n) in case prim of Prim.Ref_ref => (setReff (); default ()) | Prim.Ref_assign => (setAssign (arg 0); nonLocal (arg 1)) | Prim.Ref_deref => setDeref (arg 0) | _ => default () end | _ => default () end fun visitBlock (Block.T {label, statements, transfer, ...}) = let val li = LabelInfo.new () val _ = setLabelInfo (label, li) val _ = Vector.foreach (statements, visitStatement label) val _ = Transfer.foreachVar (transfer, nonLocal) in if usesThreadsOrConts then fn () => Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) else fn () => () end val _ = Function.dfs (f, visitBlock) val refs = List.keepAll (!refs, isLocal) (* Thread criteria *) val refs = if usesThreadsOrConts then (List.foreach (refs, fn x => let val vi = varInfo x val def = #1 (valOf (VarInfo.reff vi)) fun doit (threadCopyCurrent, uses) = let val visited = ref [] fun doit' l = let val li = labelInfo l in if LabelInfo.visited' li then () else (List.push (visited, l); LabelInfo.visited li := true; if labelDoesThreadCopyCurrent l then threadCopyCurrent := true else (); if Label.equals (def, l) then () else List.foreach (LabelInfo.preds' li, doit')) end in List.foreach (uses, fn l => List.foreach (LabelInfo.preds' (labelInfo l), doit')) ; List.foreach (!visited, fn l => LabelInfo.visited (labelInfo l) := false) end val _ = doit (VarInfo.threadCopyCurrentAssign vi, !(VarInfo.assigns vi)) val _ = doit (VarInfo.threadCopyCurrentDeref vi, !(VarInfo.derefs vi)) in if VarInfo.threadCopyCurrentAssign' vi andalso VarInfo.threadCopyCurrentDeref' vi then VarInfo.nonLocal vi else () end); List.keepAll (refs, isLocal)) else refs in if 0 < List.length refs then rewrite (f, refs) else (Function.clear f ; (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoLocalRefs"]) end)) ; f) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/loop-invariant.fun000066400000000000000000000161521416264345000214260ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Remove loop invariant args to local loops. * fun loop (x, y) = ... loop (x, z) ... * * becomes * * fun loop (x, y') = * let fun loop' (y) = ... loop' (z) ... * in loop' (y') * end *) functor LoopInvariant (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer fun transform (Program.T {globals, datatypes, functions, main}) = let val shrink = shrinkFunction {globals = globals} fun simplifyFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = labelInfo: Label.t -> {callsSelf: bool ref, visited: bool ref, invariant: (Var.t * bool ref) vector, newLabel: Label.t option ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("LoopInvariant.labelInfo", Label.layout)) val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelInfo (label, {callsSelf = ref false, visited = ref false, invariant = Vector.map (args, fn (x, _) => (x, ref true)), newLabel = ref NONE})) fun visit (Block.T {label, transfer, ...}): unit -> unit = let val {visited, ...} = labelInfo label val _ = visited := true val _ = case transfer of Goto {dst, args} => let val {callsSelf, visited, invariant, ...} = labelInfo dst in if !visited then (callsSelf := true ; Vector.foreach2 (args, invariant, fn (x, (y, b)) => if !b andalso not (Var.equals (x, y)) then b := false else ())) else () end | _ => () in fn () => visited := false end val _ = Function.dfs (f, visit) fun remove (xs: 'a vector, invariant: ('b * bool ref) vector) : 'a vector = Vector.keepAllMap2 (xs, invariant, fn (x, (_, b)) => if !b then NONE else SOME x) val newBlocks = ref [] fun visit (Block.T {label, args, statements, transfer}) : unit -> unit = let val {callsSelf, invariant, newLabel, ...} = labelInfo label val _ = if !callsSelf andalso Vector.exists (invariant, ! o #2) then newLabel := SOME (Label.new label) else () val transfer = case transfer of Goto {dst, args} => let val {invariant, newLabel, ...} = labelInfo dst in case !newLabel of NONE => transfer | SOME dst' => Goto {dst = dst', args = remove (args, invariant)} end | _ => transfer val (args, statements, transfer) = case !newLabel of NONE => (args, statements, transfer) | SOME label' => let val _ = Control.diagnostic (fn () => let open Layout in seq [Label.layout label, str " -> ", Label.layout label'] end) val (outerFormals, innerFormals, innerActuals) = Vector.foldr2 (args, invariant, ([], [], []), fn ((x, t), (_, b), (ofs, ifs, ias)) => if !b then ((x, t) :: ofs, ifs, ias) else let val x' = Var.new x in ((x', t) :: ofs, (x, t) :: ifs, x' :: ias) end) in List.push (newBlocks, Block.T {label = label', args = Vector.fromList innerFormals, statements = statements, transfer = transfer}) ; (Vector.fromList outerFormals, Vector.new0 (), Goto {dst = label', args = Vector.fromList innerActuals}) end val _ = List.push (newBlocks, Block.T {label = label, args = args, statements = statements, transfer = transfer}) in fn () => newLabel := NONE end val _ = Function.dfs (f, visit) val blocks = Vector.fromList (!newBlocks) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, simplifyFunction), main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/loop-unroll.fun000066400000000000000000001602451416264345000207510ustar00rootroot00000000000000(* Copyright (C) 2016 Matthew Surawski. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Reduces or eliminates the iteration count of loops by duplicating * the loop body. *) functor LoopUnroll (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer Prim structure Graph = DirectedGraph local open Graph in structure Forest = LoopForest end structure Histogram = struct type t = (IntInf.t, int ref) HashTable.t fun inc (set: t, key: IntInf.t): unit = let val _ = HashTable.insertIfNew (set, key, (fn () => ref 1), Int.inc) in () end fun new (): t = HashTable.new {hash = IntInf.hash, equals = IntInf.equals} fun toList (set: t): (IntInf.t * int ref) list = HashTable.toList set fun toString (set: t) : string = let val eles = toList set in List.fold (eles, "", fn ((k, r), s) => concat[s, IntInf.toString k, ": ", Int.toString (!r), "\n"]) end end val loopCount = Counter.new 0 val optCount = Counter.new 0 val total = Counter.new 0 val partial = Counter.new 0 val multiHeaders = Counter.new 0 val varEntryArg = Counter.new 0 val variantTransfer = Counter.new 0 val unsupported = Counter.new 0 val ccTransfer = Counter.new 0 val varBound = Counter.new 0 val infinite = Counter.new 0 val boundDom = Counter.new 0 val histogram = ref (Histogram.new ()) type BlockInfo = Label.t * (Var.t * Type.t) vector structure Loop = struct datatype Bound = Eq of IntInf.t | Lt of IntInf.t | Gt of IntInf.t type Start = IntInf.t type Step = IntInf.t datatype t = T of {start: Start, step: Step, bound: Bound, invert: bool} fun toString (T {start, step, bound, invert}): string = let val boundStr = case bound of Eq b => if invert then concat ["!= ", IntInf.toString b] else concat ["= ", IntInf.toString b] | Lt b => if invert then concat ["!< ", IntInf.toString b] else concat ["< ", IntInf.toString b] | Gt b => if invert then concat ["!> ", IntInf.toString b] else concat ["> ", IntInf.toString b] in concat[" Start: ", IntInf.toString start, " Step: ", IntInf.toString step, " Bound: ", boundStr] end fun isInfiniteLoop (T {start, step, bound, invert}): bool = case bound of Eq b => if invert then (if start = b then false else if start < b andalso step > 0 then not (((b - start) mod step) = 0) else if start > b andalso step < 0 then not (((start - b) mod (~step)) = 0) else true) else step = 0 | Lt b => if invert then start >= b andalso step >= 0 else start < b andalso step <= 0 | Gt b => if invert then start <= b andalso step <= 0 else start > b andalso step >= 0 fun iters (start: IntInf.t, step: IntInf.t, max: IntInf.t): IntInf.t = let val range = max - start val iters = range div step val adds = range mod step in if step > range then 1 else iters + adds end (* Assumes isInfiniteLoop is false, otherwise the result is undefined. *) fun iterCount (T {start, step, bound, invert}): IntInf.t = case bound of Eq b => if invert then (b - start) div step else 1 | Lt b => (case (start >= b, invert) of (true, false) => 0 | (true, true) => iters (b - 1, ~step, start) | (false, true) => 0 | (false, false) => iters (start, step, b)) | Gt b => (case (start <= b, invert) of (true, false) => 0 | (true, true) => iters (start, step, b + 1) | (false, true) => 0 | (false, false) => iters (b, ~step, start)) fun makeConstStmt (v: IntInf.t, wsize: WordSize.t): Var.t * Statement.t = let val newWord = WordX.fromIntInf (v, wsize) val newConst = Const.word newWord val newExp = Exp.Const (newConst) val newType = Type.word wsize val newVar = Var.newNoname() val newStatement = Statement.T {exp = newExp, ty = newType, var = SOME(newVar)} in (newVar, newStatement) end fun makeVarStmt (v: IntInf.t, wsize: WordSize.t, var: Var.t) : Var.t * Statement.t list = let val (cVar, cStmt) = makeConstStmt (v, wsize) val newExp = Exp.PrimApp {args = Vector.new2 (var, cVar), prim = Prim.Word_add wsize, targs = Vector.new0 ()} val newType = Type.word wsize val newVar = Var.newNoname() val newStatement = Statement.T {exp = newExp, ty = newType, var = SOME(newVar)} in (newVar, [cStmt, newStatement]) end (* Given: - a loop - a word size Returns: A variable and statement for the constant value after the loops final iteration. This value will make the loop exit. Assumes isInfiniteLoop is false, otherwise the result is undefined. *) fun makeLastConstant (T {start, step, bound, invert}, wsize: WordSize.t) : Var.t list * Statement.t list = let val ic = iterCount (T {start = start, step = step, bound = bound, invert = invert}) val last = start + (step * ic) val (newVar, newStatement) = makeConstStmt(last, wsize) in ([newVar], [newStatement]) end (* Given: - a loop - a word size - an iteration limit Returns: A pair of variables and statements for those variables for each iteration of the loop. This should go 1 step beyond the end of the loop. Assumes isInfiniteLoop is false, otherwise this will run forever. *) fun makeConstants (T {start, step, bound, invert}, wsize: WordSize.t, limit: IntInf.t) : Var.t list * Statement.t list = case bound of Eq b => if (start = b) <> invert andalso limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) val nextIter = T {start = start + step, step = step, bound = bound, invert = invert} val (rVars, rStmts) = makeConstants (nextIter, wsize, limit - 1) in (newVar::rVars, newStatement::rStmts) end else if limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) in ([newVar], [newStatement]) end else ([], []) | Lt b => if (start < b) <> invert andalso limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) val nextIter = T {start = start + step, step = step, bound = bound, invert = invert} val (rVars, rStmts) = makeConstants (nextIter, wsize, limit - 1) in (newVar::rVars, newStatement::rStmts) end else if limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) in ([newVar], [newStatement]) end else ([], []) | Gt b => if (start > b) <> invert andalso limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) val nextIter = T {start = start + step, step = step, bound = bound, invert = invert} val (rVars, rStmts) = makeConstants (nextIter, wsize, limit - 1) in (newVar::rVars, newStatement::rStmts) end else if limit > 0 then let val (newVar, newStatement) = makeConstStmt(start, wsize) in ([newVar], [newStatement]) end else ([], []) fun makeStepsRec (step: Step, wsize: WordSize.t, var: Var.t, times: IntInf.t, vList: Var.t list, sList: Statement.t list) : Var.t list * Statement.t list = if times > 0 then let val stepAdd = step * (times - 1) val (newVar, newStatements) = makeVarStmt(stepAdd, wsize, var) in makeStepsRec (step, wsize, var, times - 1, newVar::vList, newStatements @ sList) end else (vList, sList) fun makeSteps (T {step, ...}, wsize: WordSize.t, var: Var.t, times: IntInf.t) : Var.t list * Statement.t list = makeStepsRec (step, wsize, var, times, [], []) end fun logli (l: Layout.t, i: int): unit = Control.diagnostics (fn display => display(Layout.indent(l, i * 2))) fun logsi (s: string, i: int): unit = logli((Layout.str s), i) fun logs (s: string): unit = logsi(s, 0) fun logstat (x: Counter.t, s: string): unit = logs (concat [Int.toString(Counter.value x), " ", s]) fun listPop lst = case lst of [] => [] | _::tl => tl (* If a block was renamed, return the new name. Otherwise return the old name. *) fun fixLabel (getBlockInfo: Label.t -> BlockInfo, label: Label.t, origLabels: Label.t vector): Label.t = if Vector.contains(origLabels, label, Label.equals) then let val (name, _) = getBlockInfo(label) in name end else label fun varOptEquals (v1: Var.t, v2: Var.t option): bool = case v2 of NONE => false | SOME (v2') => Var.equals (v1, v2') (* For an binary operation where one argument is a constant, load that constant. Returns the variable, the constant, and true if the var was the first arg *) fun varConst (args, loadVar, signed): (Var.t * IntInf.int * bool) option = let val a1 = Vector.sub (args, 0) val a2 = Vector.sub (args, 1) val a1v = loadVar(a1, signed) val a2v = loadVar(a2, signed) in case (a1v, a2v) of (SOME x, NONE) => SOME (a2, x, false) | (NONE, SOME x) => SOME (a1, x, true) | _ => NONE end (* Given: - an argument vector with two arguments - a primative operaton that is an addition or subtraction of a const value - a function from variables to their constant values Returns: - The non-const variable and the constant value in terms of addition *) fun checkPrim (args, prim, loadVar) = case prim of Word_add _ => (case varConst(args, loadVar, false) of SOME(nextVar, x, _) => SOME (nextVar, x) | NONE => NONE) | Word_sub _ => (case varConst(args, loadVar, false) of SOME(nextVar, x, _) => SOME (nextVar, ~x) | NONE => NONE) | _ => NONE (* Given: - a variable in the loop - another variable in the loop - the loop body - a function from variables to their constant values - a starting value, if the transfer to the header is an arith transfer Returns: - Some x such that the value of origVar in loop iteration i+1 is equal to (the value of origVar in iteration i) + x, or None if the step couldn't be computed *) fun varChain (origVar, endVar, blocks, loadVar, total) = case Var.equals (origVar, endVar) of true => SOME (total) | false => let val endVarAssign = Vector.peekMap (blocks, fn b => let val stmts = Block.statements b val assignments = Vector.keepAllMap (stmts, fn s => case varOptEquals (endVar, Statement.var s) of false => NONE | true => (case Statement.exp s of Exp.PrimApp {args, prim, ...} => checkPrim (args, prim, loadVar) | _ => NONE)) in case Vector.length assignments of 0 => NONE | 1 => SOME (Vector.sub (assignments, 0)) | _ => raise Fail "Multiple assignments in SSA form!" end) in case endVarAssign of NONE => NONE | SOME (nextVar, x) => varChain(origVar, nextVar, blocks, loadVar, x + total) end (* Given: - a list of loop body labels - a transfer on a boolean value where one branch exits the loop and the other continues Returns: - the label that exits the loop - the label that continues the loop - true if the continue branch is the true branch *) fun loopExit (loopLabels: Label.t vector, transfer: Transfer.t) : (Label.t * Label.t * bool) = case transfer of (* This should be a case statement on a boolean, so all dsts should be unary. One should transfer outside the loop, the other inside. *) Transfer.Case {cases, default, ...} => (case default of SOME(defaultLabel) => let val (caseCon, caseLabel) = case cases of Cases.Con v => Vector.sub (v, 0) | _ => raise Fail "This should be a con" in if Vector.contains (loopLabels, defaultLabel, Label.equals) then (caseLabel, defaultLabel, Con.equals (Con.fromBool false, caseCon)) else (defaultLabel, caseLabel, Con.equals (Con.fromBool true, caseCon)) end | NONE => (case cases of Cases.Con v => let val (c1, d1) = Vector.sub (v, 0) val (c2, d2) = Vector.sub (v, 1) in if Vector.contains (loopLabels, d1, Label.equals) then (d2, d1, Con.equals (Con.fromBool true, c1)) else (d1, d2, Con.equals (Con.fromBool true, c2)) end | _ => raise Fail "This should be a con")) | _ => raise Fail "This should be a case statement" fun isLoopBranch (loopLabels, cases, default) = case default of SOME (defaultLabel) => (case cases of Cases.Con v => if (Vector.length v) = 1 then let val (_, caseLabel) = Vector.sub (v, 0) val defaultInLoop = Vector.contains (loopLabels, defaultLabel, Label.equals) val caseInLoop = Vector.contains (loopLabels, caseLabel, Label.equals) in defaultInLoop <> caseInLoop end else false | _ => false) | NONE => (case cases of Cases.Con v => if (Vector.length v) = 2 then let val (_, c1) = Vector.sub (v, 0) val (_, c2) = Vector.sub (v, 1) val c1il = Vector.contains (loopLabels, c1, Label.equals) val c2il = Vector.contains (loopLabels, c2, Label.equals) in c1il <> c2il end else false | _ => false) fun transfersToHeader (headerLabel, block) = case Block.transfer block of Transfer.Call {return, ...} => (case return of Return.NonTail {handler, ...} => (case handler of Handler.Handle l => Label.equals (headerLabel, l) | _ => false) | _ => false) | Transfer.Case {cases, ...} => (* We don't have to check default because we know the header isn't nullary *) (case cases of Cases.Con v => Vector.exists (v, (fn (_, lbl) => Label.equals (headerLabel, lbl))) | Cases.Word (_, v) => Vector.exists (v, (fn (_, lbl) => Label.equals (headerLabel, lbl)))) | Transfer.Goto {dst, ...} => Label.equals (headerLabel, dst) | Transfer.Runtime {return, ...} => Label.equals(headerLabel, return) | _ => false (* Given: - a loop phi variable - that variables index in the loop header's arguments - that variables constant entry value (if it has one) - the loop header block - the loop body block - a function from variables to their constant values Returns: - a Loop structure for unrolling that phi var, if one exists *) fun checkArg ((argVar, _), argIndex, entryArg, header, loopBody, loadVar: Var.t * bool -> IntInf.t option, domInfo, depth) = case entryArg of NONE => (logsi ("Can't unroll: entry arg not constant", depth) ; Counter.tick varEntryArg ; NONE) | SOME (entryX, entryXSigned) => let val headerLabel = Block.label header val unsupportedTransfer = ref false (* For every transfer to the start of the loop get the variable at argIndex *) val loopVars = Vector.keepAllMap (loopBody, fn block => case Block.transfer block of Transfer.Call {return, ...} => (case return of Return.NonTail {cont, ...} => if Label.equals (headerLabel, cont) then (unsupportedTransfer := true ; NONE) else NONE | _ => NONE) | Transfer.Case {cases, ...} => (case cases of Cases.Con v => if Vector.exists(v, fn (_, lbl) => Label.equals (headerLabel, lbl)) then (unsupportedTransfer := true ; NONE) else NONE | Cases.Word (_, v) => if Vector.exists(v, fn (_, lbl) => Label.equals (headerLabel, lbl)) then (unsupportedTransfer := true ; NONE) else NONE) | Transfer.Goto {args, dst} => if Label.equals (headerLabel, dst) then SOME (Vector.sub (args, argIndex), 0) else NONE | _ => NONE) in if (Vector.length loopVars) > 1 andalso not (Vector.forall (loopVars, fn (arg, x) => let val (arg0, x0) = Vector.sub (loopVars, 0) in Var.equals (arg0, arg) andalso (x0 = x) end)) then (logsi ("Can't unroll: variant transfer to head of loop", depth) ; Counter.tick variantTransfer ; NONE) else if (!unsupportedTransfer) then (logsi ("Can't unroll: unsupported transfer to head of loop", depth) ; Counter.tick unsupported ; NONE) else let val (loopVar, x) = Vector.sub (loopVars, 0) in case varChain (argVar, loopVar, loopBody, loadVar, x) of NONE => (logsi ("Can't unroll: can't compute transfer", depth) ; Counter.tick ccTransfer ; NONE) | SOME (step) => let fun ltOrGt (vc, signed) = case vc of NONE => NONE | SOME (_, c, b) => if b then SOME(Loop.Lt (c), signed) else SOME(Loop.Gt (c), signed) fun eq (vc, signed) = case vc of NONE => NONE | SOME (_, c, _) => SOME(Loop.Eq (c), signed) val loopLabels = Vector.map (loopBody, Block.label) val transferVarBlock = Vector.peekMap (loopBody, (fn b => let val transferVar = case Block.transfer b of Transfer.Case {cases, default, test} => if isLoopBranch (loopLabels, cases, default) then SOME(test) else NONE | _ => NONE val loopBound = case (transferVar) of NONE => NONE | SOME (tVar) => Vector.peekMap (Block.statements b, (fn s => case Statement.var s of NONE => NONE | SOME (sVar) => if Var.equals (tVar, sVar) then case Statement.exp s of PrimApp {args, prim, ...} => if not (Vector.contains (args, argVar, Var.equals)) then NONE else (case prim of Word_lt (_, {signed}) => ltOrGt (varConst (args, loadVar, signed), signed) | Word_equal _ => eq (varConst (args, loadVar, false), false) | _ => NONE) | _ => NONE else NONE)) in case loopBound of NONE => NONE | SOME (bound, signed) => SOME(bound, b, signed) end)) in case transferVarBlock of NONE => (logsi ("Can't unroll: can't determine bound", depth) ; Counter.tick varBound ; NONE) | SOME(bound, block, signed) => let val headerTransferBlocks = Vector.keepAll(loopBody, (fn b => transfersToHeader (headerLabel, b))) val boundDominates = Vector.forall (headerTransferBlocks, (fn b => List.exists ((domInfo (Block.label b)), (fn l => Label.equals ((Block.label block), l))))) val loopLabels = Vector.map (loopBody, Block.label) val (_, _, contIsTrue) = loopExit (loopLabels, Block.transfer block) val entryVal = if signed then entryXSigned else entryX in if boundDominates then SOME (argIndex, block, Loop.T {start = entryVal, step = step, bound = bound, invert = not contIsTrue}) else (logsi ("Can't unroll: bound doesn't dominate", depth) ; Counter.tick boundDom ; NONE) end end end end (* Check all of a loop's entry point arguments to see if a constant value. Returns a list of int options where SOME(x) is always x for each entry. *) fun findConstantStart (entryArgs: (((IntInf.t * IntInf.t) option) vector) vector) : ((IntInf.t * IntInf.t) option) vector = if (Vector.length entryArgs) > 0 then Vector.rev (Vector.fold (entryArgs, Vector.sub (entryArgs, 0), fn (v1, v2) => Vector.fromList ( Vector.fold2 (v1, v2, [], fn (a1, a2, lst) => case (a1, a2) of (SOME(x1, x1'), SOME(x2, _)) => if x1 = x2 then SOME(x1, x1')::lst else NONE::lst | _ => NONE::lst)))) else Vector.new0 () (* Look for any optimization opportunities in the loop. *) fun findOpportunity(functionBody: Block.t vector, loopBody: Block.t vector, loopHeaders: Block.t vector, loadGlobal: Var.t * bool -> IntInf.t option, domInfo: Label.t -> Label.t list, depth: int): (int * Block.t * Loop.t) option = if (Vector.length loopHeaders) = 1 then let val header = Vector.sub (loopHeaders, 0) val headerArgs = Block.args header val headerLabel = Block.label header val () = logsi (concat["Evaluating loop with header: ", Label.toString headerLabel], depth - 1) fun blockEquals (b1, b2) = Label.equals (Block.label b1, Block.label b2) val emptyArgs = SOME(Vector.new (Vector.length headerArgs, NONE)) val entryArgs = Vector.keepAllMap(functionBody, fn block => if Vector.contains (loopBody, block, blockEquals) then NONE else case Block.transfer block of Transfer.Call {return, ...} => (case return of Return.NonTail {cont, ...} => if Label.equals (headerLabel, cont) then emptyArgs else NONE | _ => NONE) | Transfer.Case {cases, ...} => (case cases of Cases.Con v => if Vector.exists (v, fn (_, lbl) => Label.equals (headerLabel, lbl)) then emptyArgs else NONE | Cases.Word (_, v) => if Vector.exists (v, fn (_, lbl) => Label.equals (headerLabel, lbl)) then emptyArgs else NONE) | Transfer.Goto {args, dst} => if Label.equals (dst, headerLabel) then SOME(Vector.map (args, fn a => case (loadGlobal(a, false), loadGlobal(a, true)) of (NONE, NONE) => NONE | (SOME v1, SOME v2) => SOME (v1, v2) | _ => raise Fail "Impossible")) else NONE | _ => NONE) val () = logsi (concat["Loop has ", Int.toString (Vector.length entryArgs), " entry points"], depth - 1) val constantArgs = findConstantStart entryArgs val unrollableArgs = Vector.keepAllMapi (headerArgs, fn (i, arg) => ( logsi (concat["Checking arg: ", Var.toString (#1 arg)], depth) ; checkArg (arg, i, Vector.sub (constantArgs, i), header, loopBody, loadGlobal, domInfo, depth + 1))) in if (Vector.length unrollableArgs) > 0 then SOME(Vector.sub (unrollableArgs, 0)) else NONE end else (logsi ("Can't optimize: loop has more than 1 header", depth) ; Counter.tick multiHeaders; NONE) fun makeHeader(oldHeader, (newVars, newStmts), newEntry) = let val oldArgs = Block.args oldHeader val newArgs = Vector.map (oldArgs, fn (arg, _) => arg) val newTransfer = Transfer.Goto {args = newArgs, dst = newEntry} in (Block.T {args = oldArgs, label = Block.label oldHeader, statements = Vector.fromList newStmts, transfer = newTransfer}, newVars) end (* Copy an entire loop. In the header, rewrite the transfer to take the loop branch. In the transfers to the top of the loop, rewrite the transfer to goto next. Ensure that the header is the first element in the list. Replace all instances of argi with argVar *) fun copyLoop(blocks: Block.t vector, nextLabel: Label.t, headerLabel: Label.t, tBlock: Block.t, argi: int, argVar: Var.t, rewriteTransfer: bool, blockInfo: Label.t -> BlockInfo, setBlockInfo: Label.t * BlockInfo -> unit): Block.t vector = let val labels = Vector.map (blocks, Block.label) (* Assign a new label for each block *) val newBlocks = Vector.map (blocks, fn b => let val oldName = Block.label b val oldArgs = Block.args b val newName = Label.newNoname() val () = setBlockInfo(oldName, (newName, oldArgs)) in Block.T {args = Block.args b, label = newName, statements = Block.statements b, transfer = Block.transfer b} end) (* Rewrite the transfers of each block *) val fixedBlocks = Vector.map (newBlocks, fn Block.T {args, label, statements, transfer} => let val f = fn l => fixLabel(blockInfo, l, labels) val isHeader = Label.equals (label, f(headerLabel)) val (newArgs, unrolledArg) = if isHeader then (args, SOME(Vector.sub (args, argi))) else (args, NONE) val newStmts = if isHeader then case unrolledArg of NONE => statements | SOME(var, ty) => let val assignExp = Exp.Var (argVar) val assign = Statement.T {exp = assignExp, ty = ty, var = SOME(var)} val assignV = Vector.new1(assign) in Vector.concat [assignV, statements] end else statements val newTransfer = if rewriteTransfer andalso Label.equals (label, f(Block.label tBlock)) then let val (_, contLabel, _) = loopExit(labels, transfer) in Transfer.Goto {args = Vector.new0 (), dst = f(contLabel)} end else case transfer of Transfer.Call {args, func, return} => let val newReturn = case return of Return.NonTail {cont, handler} => let val newHandler = case handler of Handler.Handle l => Handler.Handle(f(l)) | _ => handler in Return.NonTail {cont = f(cont), handler = newHandler} end | _ => return in Transfer.Call {args = args, func = func, return = newReturn} end | Transfer.Case {cases, default, test} => let val newCases = Cases.map(cases, f) val newDefault = case default of NONE => default | SOME(l) => SOME(f(l)) in Transfer.Case {cases = newCases, default = newDefault, test = test} end | Transfer.Goto {args, dst} => if Label.equals (dst, headerLabel) then Transfer.Goto {args = args, dst = nextLabel} else Transfer.Goto {args = args, dst = f(dst)} | Transfer.Runtime {args, prim, return} => Transfer.Runtime {args = args, prim = prim, return = f(return)} | _ => transfer in Block.T {args = newArgs, label = label, statements = newStmts, transfer = newTransfer} end) in Vector.rev fixedBlocks end (* Unroll a loop. The header should ALWAYS be the first element in the returned list. *) fun unrollLoop (oldHeader, tBlock, argi, loopBlocks, argLabels, exit, rewriteTransfer, blockInfo, setBlockInfo) = let val oldHeaderLabel = Block.label oldHeader in case argLabels of [] => [exit] | hd::tl => let val res = unrollLoop (oldHeader, tBlock, argi, loopBlocks, tl, exit, rewriteTransfer, blockInfo, setBlockInfo) val nextBlockLabel = Block.label (List.first res) val newLoop = copyLoop(loopBlocks, nextBlockLabel, oldHeaderLabel, tBlock, argi, hd, rewriteTransfer, blockInfo, setBlockInfo) in (Vector.toList newLoop) @ res end end (* Given: - an itertion count - a loop body Returns (b, x, y, z) such that: if b is true - unroll the loop completely - x, y, and z are undefined. if b is false - x is the number of times to expand the loop body - y is the number of iterations to run the expanded body (must never be 0) - z is the number of times to peel the loop body *) fun shouldOptimize (iterCount, loopBlocks, depth) = let val loopSize' = Block.sizeV (loopBlocks, {sizeExp = Exp.size, sizeTransfer = Transfer.size}) val loopSize = IntInf.fromInt loopSize' val unrollLimit = IntInf.fromInt (!Control.loopUnrollLimit) val () = logsi ("iterations * loop size < unroll factor = can total unroll", depth) val canTotalUnroll = (iterCount * loopSize) < unrollLimit val () = logsi (concat[IntInf.toString iterCount, " * ", IntInf.toString loopSize, " < ", IntInf.toString unrollLimit, " = ", Bool.toString canTotalUnroll], depth) in if (iterCount = 1) orelse canTotalUnroll then (* Loop runs once or it's small enough to unroll *) (true, 0, 0, 0) else if loopSize >= unrollLimit then (* Loop is too big to unroll at all, peel off 1 iteration *) (false, 1, iterCount - 1, 1) else let val exBodySize = unrollLimit div loopSize val exIters = iterCount div exBodySize val leftovers = iterCount - (exIters * exBodySize) in if (exIters - 1) < 2 then (* If the unpeeled loop would run 1 or 0 times, just unroll the whole thing *) (true, 0, 0, 0) else if leftovers = 0 then (* If we don't get any unpeelings naturally, force one *) (false, exBodySize, exIters - 1, exBodySize) else (* Otherwise stick them on the front of the loop *) (false, exBodySize, exIters, leftovers) end end fun expandLoop (oldHeader, loopBlocks, loop, tBlock, argi, argSize, oldArg, exBody, iterBody, exitLabel, blockInfo, setBlockInfo) = let (* Make a new loop header with an additional arg *) val newLoopEntry = Label.newNoname() val (newLoopHeader, loopArgLabels) = makeHeader (oldHeader, Loop.makeSteps (loop, argSize, oldArg, exBody), newLoopEntry) val iterVar = Var.newNoname () val newLoopHeaderArgs' = Vector.concat [Block.args newLoopHeader, Vector.new1 (iterVar, Type.word argSize)] val newLoopHeader' = Block.T {args = newLoopHeaderArgs', label = Label.newNoname (), statements = Block.statements newLoopHeader, transfer = Block.transfer newLoopHeader} (* Make a new goto to the top of the loop increasing the iter by 1 *) val loopHeaderGoto = let val (newVar, newVarStmts) = Loop.makeVarStmt (1, argSize, iterVar) val nonIterArgs = Vector.map (Block.args oldHeader, fn (a, _) => a) val newArgs = Vector.concat [nonIterArgs, Vector.new1 (newVar)] val newTransfer = Transfer.Goto {args = newArgs, dst = Block.label newLoopHeader'} in Block.T {args = Vector.new0 (), label = Label.newNoname (), statements = Vector.fromList newVarStmts, transfer = newTransfer} end val newLoopExit = let val (newLimitVar, newLimitStmt) = Loop.makeConstStmt (iterBody - 1, argSize) val (newComp, newCompVar) = let val newVar = Var.newNoname () val newTy = Type.datatypee Tycon.bool val newExp = PrimApp {args = Vector.new2 (iterVar, newLimitVar), prim = Prim.Word_lt (argSize, {signed = true}), targs = Vector.new0 ()} in (Statement.T {exp = newExp, ty = newTy, var = SOME(newVar)}, newVar) end val exitStatements = Vector.new2(newLimitStmt, newComp) val exitCases = Cases.Con ( Vector.new1 (Con.fromBool true, Block.label loopHeaderGoto)) val exitTransfer = Transfer.Case {cases = exitCases, default = SOME(exitLabel), test = newCompVar} in Block.T {args = Block.args oldHeader, label = Label.newNoname (), statements = exitStatements, transfer = exitTransfer} end (* Expand the loop exBody times. Rewrite the bound's transfer, because we know it will always be true and it won't be eliminated by shrink. *) val newLoopBlocks = unrollLoop (oldHeader, tBlock, argi, loopBlocks, loopArgLabels, newLoopExit, true, blockInfo, setBlockInfo) val firstLoopBlock = List.first newLoopBlocks val loopArgs' = Block.args firstLoopBlock val loopStatements' = Block.statements firstLoopBlock val loopTransfer' = Block.transfer firstLoopBlock val newLoopHead = Block.T {args = loopArgs', label = newLoopEntry, statements = loopStatements', transfer = loopTransfer'} val newLoopBlocks' = newLoopHeader':: (loopHeaderGoto:: (newLoopHead:: (listPop newLoopBlocks))) in newLoopBlocks' end (* Attempt to optimize a single loop. Returns a list of blocks to add to the program and a list of blocks to remove from the program. *) fun optimizeLoop(allBlocks, headerNodes, loopNodes, nodeBlock, loadGlobal, domInfo, depth) = let val () = Counter.tick loopCount val headers = Vector.map (headerNodes, nodeBlock) val loopBlocks = Vector.map (loopNodes, nodeBlock) val loopBlockNames = Vector.map (loopBlocks, Block.label) val optOpt = findOpportunity (allBlocks, loopBlocks, headers, loadGlobal, domInfo, depth + 1) val {get = blockInfo: Label.t -> BlockInfo, set = setBlockInfo: Label.t * BlockInfo -> unit, destroy} = Property.destGetSet(Label.plist, Property.initRaise("blockInfo", Label.layout)) in case optOpt of NONE => ([], []) | SOME (argi, tBlock, loop) => if Loop.isInfiniteLoop loop then (logsi ("Can't unroll: infinite loop", depth) ; Counter.tick infinite ; logsi (concat["Index: ", Int.toString argi, Loop.toString loop], depth) ; ([], [])) else let val () = Counter.tick optCount val oldHeader = Vector.sub (headers, 0) val oldArgs = Block.args oldHeader val (oldArg, oldType) = Vector.sub (oldArgs, argi) val () = logsi (concat["Can unroll loop on ", Var.toString oldArg], depth) val () = logsi (concat["Index: ", Int.toString argi, Loop.toString loop], depth) val iterCount = Loop.iterCount loop val () = logsi (concat["Loop will run ", IntInf.toString iterCount, " times"], depth) val () = logsi (concat["Transfer block is ", Label.toString (Block.label tBlock)], depth) val () = Histogram.inc ((!histogram), iterCount) val (totalUnroll, exBody, iterBody, peel) = shouldOptimize (iterCount, loopBlocks, depth + 1) val argSize = case Type.dest oldType of Type.Word wsize => wsize | _ => raise Fail "Argument is not of type word" in if totalUnroll then let val () = Counter.tick total val () = logsi ("Completely unrolling loop", depth) val newEntry = Label.newNoname() val (newHeader, argLabels) = makeHeader (oldHeader, Loop.makeConstants (loop, argSize, iterCount+1), newEntry) val exitBlock = Block.T {args = oldArgs, label = Label.newNoname (), statements = Vector.new0 (), transfer = Transfer.Bug} (* For each induction variable value, copy the loop's body *) val newBlocks = unrollLoop (oldHeader, tBlock, argi, loopBlocks, argLabels, exitBlock, false, blockInfo, setBlockInfo) (* Fix the first entry's label *) val firstBlock = List.first newBlocks val args' = Block.args firstBlock val statements' = Block.statements firstBlock val transfer' = Block.transfer firstBlock val newHead = Block.T {args = args', label = newEntry, statements = statements', transfer = transfer'} val newBlocks' = newHeader::(newHead::(listPop newBlocks)) val () = destroy() in (newBlocks', (Vector.toList loopBlockNames)) end else let val () = Counter.tick partial val () = logsi ("Partially unrolling loop", depth) val () = logsi (concat["Body expansion: ", IntInf.toString exBody, " Body iterations: ", IntInf.toString iterBody, " Peel iterations: ", IntInf.toString peel], depth) val oldArgLabels = Vector.map (oldArgs, fn (a, _) => a) (* Produce an exit loop iteration. *) val exitEntry = Label.newNoname() val (exitHeader, exitConsts) = makeHeader (oldHeader, Loop.makeLastConstant (loop, argSize), exitEntry) val exitHeader' = Block.T {args = Block.args exitHeader, label = Label.newNoname (), statements = Block.statements exitHeader, transfer = Block.transfer exitHeader} val exitBlock = Block.T {args = oldArgs, label = Label.newNoname (), statements = Vector.new0 (), transfer = Transfer.Bug} val exitBlocks = unrollLoop (oldHeader, tBlock, argi, loopBlocks, exitConsts, exitBlock, false, blockInfo, setBlockInfo) val exitFirstBlock = List.first exitBlocks val exitArgs = Block.args exitFirstBlock val exitStatements = Block.statements exitFirstBlock val exitTransfer = Block.transfer exitFirstBlock val exitHead = Block.T {args = exitArgs, label = exitEntry, statements = exitStatements, transfer = exitTransfer} val exitGotoLabel = Label.newNoname() val exitGoto = Block.T {args = Vector.new0 (), label = exitGotoLabel, statements = Vector.new0 (), transfer = Transfer.Goto {args = oldArgLabels, dst = Block.label exitHeader'}} val exitBlocks' = exitGoto:: exitHeader':: (exitHead::(listPop exitBlocks)) (* Expand the loop *) val exLoopBlocks = expandLoop (oldHeader, loopBlocks, loop, tBlock, argi, argSize, oldArg, exBody, iterBody, exitGotoLabel, blockInfo, setBlockInfo) (* Make an entry to the expanded loop *) val exLoopEntry = let val (zeroVar, zeroStmt) = Loop.makeConstStmt(0, argSize) val exLoopHeader = Block.label (List.first exLoopBlocks) val transferArgs = Vector.concat [oldArgLabels, Vector.new1(zeroVar)] val newTransfer = Transfer.Goto {args = transferArgs, dst = exLoopHeader} in Block.T {args = oldArgs, label = Label.newNoname(), statements = Vector.new1 zeroStmt, transfer = newTransfer} end (* Make a replacement loop entry *) val newEntry = Label.newNoname() val (newHeader, argLabels) = makeHeader (oldHeader, Loop.makeConstants (loop, argSize, peel), newEntry) (* For each induction variable value, copy the loop's body *) val newBlocks = unrollLoop (oldHeader, tBlock, argi, loopBlocks, argLabels, exLoopEntry, false, blockInfo, setBlockInfo) (* Fix the first entry's label *) val firstBlock = List.first newBlocks val args' = Block.args firstBlock val statements' = Block.statements firstBlock val transfer' = Block.transfer firstBlock val newHead = Block.T {args = args', label = newEntry, statements = statements', transfer = transfer'} val newBlocks' = newHeader::(newHead::(listPop newBlocks)) val () = destroy() in (newBlocks' @ exLoopBlocks @ exitBlocks', (Vector.toList loopBlockNames)) end end end (* Traverse sub-forests until the innermost loop is found. *) fun traverseSubForest ({loops, notInLoop}, allBlocks, enclosingHeaders, labelNode, nodeBlock, loadGlobal, domInfo) = if (Vector.length loops) = 0 then optimizeLoop(allBlocks, enclosingHeaders, notInLoop, nodeBlock, loadGlobal, domInfo, 1) else Vector.fold(loops, ([], []), fn (loop, (new, remove)) => let val (nBlocks, rBlocks) = traverseLoop(loop, allBlocks, labelNode, nodeBlock, loadGlobal, domInfo) in ((new @ nBlocks), (remove @ rBlocks)) end) (* Traverse loops in the loop forest. *) and traverseLoop ({headers, child}, allBlocks, labelNode, nodeBlock, loadGlobal, domInfo) = traverseSubForest ((Forest.dest child), allBlocks, headers, labelNode, nodeBlock, loadGlobal, domInfo) (* Traverse the top-level loop forest. *) fun traverseForest ({loops, notInLoop = _}, allBlocks, labelNode, nodeBlock, loadGlobal, domInfo) = let (* Gather the blocks to add/remove *) val (newBlocks, blocksToRemove) = Vector.fold(loops, ([], []), fn (loop, (new, remove)) => let val (nBlocks, rBlocks) = traverseLoop(loop, allBlocks, labelNode, nodeBlock, loadGlobal, domInfo) in ((new @ nBlocks), (remove @ rBlocks)) end) val keep: Block.t -> bool = (fn b => not (List.contains(blocksToRemove, (Block.label b), Label.equals))) val reducedBlocks = Vector.keepAll(allBlocks, keep) in (Vector.toList reducedBlocks) @ newBlocks end fun setDoms tree = let val {get = domInfo: Label.t -> Label.t list, set = setDomInfo: Label.t * Label.t list -> unit, destroy} = Property.destGetSet(Label.plist, Property.initRaise("domInfo", Label.layout)) fun loop (tree, doms) = case tree of Tree.T (block, children) => (setDomInfo (Block.label block, doms) ; Vector.foreach (children, fn tree => loop(tree, (Block.label block)::doms))) val () = loop (tree, []) in (domInfo, destroy) end (* Performs the optimization on the body of a single function. *) fun optimizeFunction loadGlobal function = let val {graph, labelNode, nodeBlock} = Function.controlFlow function val {args, blocks, mayInline, name, raises, returns, start} = Function.dest function val fsize = Function.size (function, {sizeExp = Exp.size, sizeTransfer = Transfer.size}) val () = logs (concat["Optimizing function: ", Func.toString name, " of size ", Int.toString fsize]) val root = labelNode start val forest = Graph.loopForestSteensgaard(graph, {root = root, nodeValue = fn x => x}) val dtree = Function.dominatorTree function val (domInfo, destroy) = setDoms dtree val newBlocks = traverseForest((Forest.dest forest), blocks, labelNode, nodeBlock, loadGlobal, domInfo) val () = destroy() in Function.new {args = args, blocks = Vector.fromList(newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end (* Entry point. *) fun transform (Program.T {datatypes, globals, functions, main}) = let fun loadGlobal (var: Var.t, signed: bool): IntInf.t option = let fun matchGlobal v g = case Statement.var g of NONE => false | SOME (v') => Var.equals (v, v') in case Vector.peek (globals, matchGlobal var) of NONE => NONE | SOME (stmt) => (case Statement.exp stmt of Exp.Const c => (case c of Const.Word w => if signed then SOME(WordX.toIntInfX w) else SOME(WordX.toIntInf w) | _ => NONE) | _ => NONE) end val () = List.foreach ([loopCount, total, partial, optCount, multiHeaders, varEntryArg, variantTransfer, unsupported, ccTransfer, varBound, infinite, boundDom], fn c => Counter.reset (c, 0)) val () = histogram := Histogram.new () val () = logs (concat["Unrolling loops. Unrolling factor = ", Int.toString (!Control.loopUnrollLimit)]) val optimizedFunctions = List.map (functions, optimizeFunction loadGlobal) val restore = restoreFunction {globals = globals} val () = logs "Performing SSA restore" val cleanedFunctions = List.map (optimizedFunctions, restore) val shrink = shrinkFunction {globals = globals} val () = logs "Performing shrink" val shrunkFunctions = List.map (cleanedFunctions, shrink) val () = logstat (loopCount, "total innermost loops") val () = logstat (optCount, "loops optimized") val () = logstat (total, "loops completely unrolled") val () = logstat (partial, "loops partially unrolled") val () = logstat (multiHeaders, "loops had multiple headers") val () = logstat (varEntryArg, "variable entry values") val () = logstat (variantTransfer, "loops had variant transfers to the header") val () = logstat (unsupported, "loops had unsupported transfers to the header") val () = logstat (ccTransfer, "loops had non-computable steps") val () = logstat (varBound, "loops had variable bounds") val () = logstat (infinite, "infinite loops") val () = logstat (boundDom, "loops had non-dominating bounds") val () = logs ("Iterations: Occurences") val () = logs (Histogram.toString (!histogram)) val () = logs "Done." in Program.T {datatypes = datatypes, globals = globals, functions = shrunkFunctions, main = main} end end mlton-20210117+dfsg/mlton/ssa/loop-unswitch.fun000066400000000000000000000351311416264345000212750ustar00rootroot00000000000000(* Copyright (C) 2016 Matthew Surawski. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Moves a conditional statement outside a loop by duplicating the loops body * under each branch of the conditional. *) functor LoopUnswitch (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Graph = DirectedGraph local open Graph in structure Node = Node structure Forest = LoopForest end fun ++ (v: int ref): unit = v := (!v) + 1 val optCount = ref 0 val tooBig = ref 0 val notInvariant = ref 0 val multiHeaders = ref 0 type BlockInfo = Label.t * (Var.t * Type.t) vector fun logli (l: Layout.t, i: int): unit = Control.diagnostics (fn display => display(Layout.indent(l, i))) fun logsi (s: string, i: int): unit = logli((Layout.str s), i) fun logs (s: string): unit = logsi(s, 0) fun logstat (x: int ref, s: string): unit = logs (concat[Int.toString(!x), " ", s]) (* If a block was renamed, return the new name. Otherwise return the old name. *) fun fixLabel (getBlockInfo: Label.t -> BlockInfo, label: Label.t, origLabels: Label.t vector): Label.t = if Vector.contains(origLabels, label, Label.equals) then let val (name, _) = getBlockInfo(label) in name end else label (* Copy an entire loop. *) fun copyLoop(blocks: Block.t vector, blockInfo: Label.t -> BlockInfo, setBlockInfo: Label.t * BlockInfo -> unit): Block.t vector = let val labels = Vector.map (blocks, Block.label) (* Assign a new label for each block *) val newBlocks = Vector.map (blocks, fn b => let val oldName = Block.label b val oldArgs = Block.args b val newName = Label.newNoname() val () = setBlockInfo(oldName, (newName, oldArgs)) in Block.T {args = Block.args b, label = newName, statements = Block.statements b, transfer = Block.transfer b} end) (* Rewrite the transfers of each block *) val fixedBlocks = Vector.map (newBlocks, fn Block.T {args, label, statements, transfer} => let val f = fn l => fixLabel(blockInfo, l, labels) val newTransfer = Transfer.replaceLabel(transfer, f) in Block.T {args = args, label = label, statements = statements, transfer = newTransfer} end) in fixedBlocks end (* Find all variables introduced in a block. *) fun blockVars (block: Block.t): Var.t list = let val args = Vector.fold ((Block.args block), [], (fn ((var, _), lst) => var::lst)) val stmts = Vector.fold ((Block.statements block), [], (fn (stmt, lst) => case Statement.var stmt of NONE => lst | SOME(v) => v::lst)) in args @ stmts end (* Determine if the block can be unswitched. *) fun detectCases(block: Block.t, loopVars: Var.t list, depth: int) = case Block.transfer block of Case {cases, default, test} => let val blockName = Block.label block val () = logsi (concat ["Evaluating ", Label.toString(blockName)], depth) val () = logli(Transfer.layout (Block.transfer block), depth) val testIsInvariant = not (List.contains(loopVars, test, Var.equals)) in if testIsInvariant then (logsi("Can optimize!", depth) ; SOME(cases, test, default)) else (logsi ("Can't optimize: condition not invariant", depth) ; ++notInvariant ; NONE) end | _ => NONE (* Look for any optimization opportunities in the loop. *) fun findOpportunity(loopBody: Block.t vector, loopHeaders: Block.t vector, depth: int) : (((Con.t, Label.t) Cases.t * Var.t * Label.t option) * Block.t) option = let val vars = Vector.fold (loopBody, [], (fn (b, lst) => (blockVars b) @ lst)) val canOptimize = Vector.keepAllMap (loopBody, fn b => detectCases (b, vars, depth + 1)) in if (Vector.length loopHeaders) = 1 then case Vector.length canOptimize of 0 => NONE | _ => SOME(Vector.sub(canOptimize, 0), Vector.sub(loopHeaders, 0)) else (logsi ("Can't optimize: loop has more than 1 header", depth) ; ++multiHeaders ; NONE) end (* Copy a loop and set up the transfer *) fun makeBranch (loopBody: Block.t vector, loopHeader: Block.t, branchLabel: Label.t, blockInfo: Label.t -> BlockInfo, setBlockInfo: Label.t * BlockInfo -> unit, labelNode: Label.t -> unit Node.t, nodeBlock: unit Node.t -> Block.t) : Block.t vector * Label.t = let (* Copy the loop body *) val loopBodyLabels = Vector.map (loopBody, Block.label) val newLoop = copyLoop(loopBody, blockInfo, setBlockInfo) (* Set up a goto for the loop *) val (newLoopHeaderLabel, _) = blockInfo(Block.label loopHeader) val newLoopArgs = Vector.map (Block.args loopHeader, fn (v, _) => v) val newLoopEntryTransfer = Transfer.Goto {args = newLoopArgs, dst = newLoopHeaderLabel} val newLoopEntryLabel = Label.newNoname() val newLoopEntryArgs = if Vector.contains (loopBodyLabels, branchLabel, Label.equals) then let val (_, args) = blockInfo(branchLabel) in args end else let val block = nodeBlock (labelNode branchLabel) in Block.args block end val newLoopEntry = Block.T {args = newLoopEntryArgs, label = newLoopEntryLabel, statements = Vector.new0(), transfer = newLoopEntryTransfer} (* Return the new loop, entrypoint, and entrypoint label *) val returnBlocks = Vector.concat [newLoop, (Vector.new1(newLoopEntry))] in (returnBlocks, newLoopEntryLabel) end fun shouldOptimize (cases, default, loopBlocks, depth) = let val loopSize' = Block.sizeV (loopBlocks, {sizeExp = Exp.size, sizeTransfer = Transfer.size}) val loopSize = IntInf.fromInt (loopSize') val branchCount = IntInf.fromInt ( (case cases of Cases.Con v => Vector.length v | Cases.Word (_, v) => Vector.length v) + (case default of NONE => 0 | SOME _ => 1)) val unswitchLimit = IntInf.fromInt (!Control.loopUnswitchLimit) val shouldUnswitch = (branchCount * loopSize) < unswitchLimit val () = logsi ("branches * loop size < unswitch factor = can unswitch", depth) val () = logsi (concat[IntInf.toString branchCount, " * ", IntInf.toString loopSize, " < ", IntInf.toString unswitchLimit, " = ", Bool.toString shouldUnswitch], depth) in shouldUnswitch end (* Attempt to optimize a single loop. Returns a list of blocks to add to the program and a list of blocks to remove from the program. *) fun optimizeLoop(headerNodes, loopNodes, labelNode, nodeBlock, depth): Block.t list * Label.t list = let val () = logsi ("At innermost loop", depth) val headers = Vector.map (headerNodes, nodeBlock) val blocks = Vector.map (loopNodes, nodeBlock) val blockNames = Vector.map (blocks, Block.label) val condLabelOpt = findOpportunity(blocks, headers, depth) val {get = blockInfo: Label.t -> BlockInfo, set = setBlockInfo: Label.t * BlockInfo -> unit, destroy} = Property.destGetSet(Label.plist, Property.initRaise("blockInfo", Label.layout)) in case condLabelOpt of NONE => ([], []) | SOME((cases, check, default), header) => if shouldOptimize (cases, default, blocks, depth + 1) then let val () = ++optCount val mkBranch = fn lbl => makeBranch(blocks, header, lbl, blockInfo, setBlockInfo, labelNode, nodeBlock) (* Copy the loop body for the default case if necessary *) val (newDefaultLoop, newDefault) = case default of NONE => ([], NONE) | SOME(defaultLabel) => let val (newLoop, newLoopEntryLabel) = mkBranch(defaultLabel) in (Vector.toList newLoop, SOME(newLoopEntryLabel)) end (* Copy the loop body for each case (except default) *) val (newLoops, newCases) = case cases of Cases.Con v => let val newLoopCases = Vector.map(v, fn (con, lbl) => let val (newLoop, newLoopEntryLabel) = mkBranch(lbl) val newCase = (con, newLoopEntryLabel) in (newLoop, newCase) end) val (newLoops, newCaseList) = Vector.unzip newLoopCases val newCases = Cases.Con (newCaseList) in (newLoops, newCases) end | Cases.Word (size, v) => let val newLoopCases = Vector.map(v, fn (wrd, lbl) => let val (newLoop, newLoopEntryLabel) = mkBranch(lbl) val newCase = (wrd, newLoopEntryLabel) in (newLoop, newCase) end) val (newLoops, newCaseList) = Vector.unzip newLoopCases val newCases = Cases.Word (size, newCaseList) in (newLoops, newCases) end (* Produce a single list of new blocks *) val loopBlocks = Vector.fold(newLoops, newDefaultLoop, fn (loop, acc) => acc @ (Vector.toList loop)) (* Produce a new entry block with the same label as the old loop header *) val newTransfer = Transfer.Case {cases = newCases, default = newDefault, test = check} val newEntry = Block.T {args = Block.args header, label = Block.label header, statements = Vector.new0(), transfer = newTransfer} val () = destroy() in (newEntry::loopBlocks, (Vector.toList blockNames)) end else (logsi ("Can't unswitch: too big", depth) ; ++tooBig ; ([], [])) end (* Traverse sub-forests until the innermost loop is found. *) fun traverseSubForest ({loops, notInLoop}, enclosingHeaders, labelNode, nodeBlock, depth): Block.t list * Label.t list = if (Vector.length loops) = 0 then optimizeLoop(enclosingHeaders, notInLoop, labelNode, nodeBlock, depth) else Vector.fold(loops, ([], []), fn (loop, (new, remove)) => let val (nBlocks, rBlocks) = traverseLoop(loop, labelNode, nodeBlock, depth + 1) in ((new @ nBlocks), (remove @ rBlocks)) end) (* Traverse loops in the loop forest. *) and traverseLoop ({headers, child}, labelNode, nodeBlock, depth): Block.t list * Label.t list = traverseSubForest ((Forest.dest child), headers, labelNode, nodeBlock, depth + 1) (* Traverse the top-level loop forest. *) fun traverseForest ({loops, notInLoop = _}, allBlocks, labelNode, nodeBlock): Block.t list = let (* Gather the blocks to add/remove *) val (newBlocks, blocksToRemove) = Vector.fold(loops, ([], []), fn (loop, (new, remove)) => let val (nBlocks, rBlocks) = traverseLoop(loop, labelNode, nodeBlock, 1) in ((new @ nBlocks), (remove @ rBlocks)) end) val keep: Block.t -> bool = (fn b => not (List.contains(blocksToRemove, (Block.label b), Label.equals))) val reducedBlocks = Vector.keepAll(allBlocks, keep) in (Vector.toList reducedBlocks) @ newBlocks end (* Performs the optimization on the body of a single function. *) fun optimizeFunction(function: Function.t): Function.t = let val {graph, labelNode, nodeBlock} = Function.controlFlow function val {args, blocks, mayInline, name, raises, returns, start} = Function.dest function val fsize = Function.size (function, {sizeExp = Exp.size, sizeTransfer = Transfer.size}) val () = logs (concat["Optimizing function: ", Func.toString name, " of size ", Int.toString fsize]) val root = labelNode start val forest = Graph.loopForestSteensgaard(graph, {root = root, nodeValue = fn x => x}) val newBlocks = traverseForest((Forest.dest forest), blocks, labelNode, nodeBlock) in Function.new {args = args, blocks = Vector.fromList(newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end (* Entry point. *) fun transform (Program.T {datatypes, globals, functions, main}) = let val () = optCount := 0 val () = tooBig := 0 val () = notInvariant := 0 val () = multiHeaders := 0 val () = logs "Unswitching loops" val optimizedFunctions = List.map (functions, optimizeFunction) val restore = restoreFunction {globals = globals} val () = logs "Performing SSA restore" val cleanedFunctions = List.map (optimizedFunctions, restore) val () = logstat (optCount, "loops optimized") val () = logstat (tooBig, "loops too big to unswitch") val () = logstat (notInvariant, "loops had variant conditions") val () = logstat (multiHeaders, "loops had multiple headers") val () = logs "Done." in Program.T {datatypes = datatypes, globals = globals, functions = cleanedFunctions, main = main} end end mlton-20210117+dfsg/mlton/ssa/multi.fun000066400000000000000000000401311416264345000176100ustar00rootroot00000000000000(* Copyright (C) 2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Defn: A label is exactly-multi-threaded if it may be executed by two different threads during some run of the program. The initial call to main counts as one thread. Defn: A label is actually-multi-used if it may be executed more than once during the execution of the program. *) functor Multi (S: MULTI_STRUCTS): MULTI = struct open S open Exp Transfer structure Graph = DirectedGraph local open Graph in structure Node = Node end structure Calls = struct datatype t = T of value ref and value = Zero | One | Many fun new (): t = T (ref Zero) fun inc (T r) = case !r of Zero => r := One | _ => r := Many val isMany = fn (T (ref Many)) => true | _ => false end structure ThreadCopyCurrent = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val does = isTop val when = addHandler end structure MultiThreaded = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val is = isTop val when = addHandler end structure MultiUsed = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val is = isTop val when = addHandler end structure FuncInfo = struct datatype t = T of {calls: Calls.t, threadCopyCurrent: ThreadCopyCurrent.t, multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val calls = make #calls val threadCopyCurrent = make #threadCopyCurrent val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {calls = Calls.new (), threadCopyCurrent = ThreadCopyCurrent.new (), multiUsed = MultiUsed.new (), multiThreaded = MultiThreaded.new ()} end structure LabelInfo = struct datatype t = T of {threadCopyCurrent: ThreadCopyCurrent.t, multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val threadCopyCurrent = make #threadCopyCurrent val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {threadCopyCurrent = ThreadCopyCurrent.new (), multiThreaded = MultiThreaded.new (), multiUsed = MultiUsed.new ()} end structure VarInfo = struct datatype t = T of {multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {multiThreaded = MultiThreaded.new (), multiUsed = MultiUsed.new ()} end fun multi (p as Program.T {functions, main, ...}) = let val usesThreadsOrConts = Program.hasPrim (p, fn p => case p of Prim.Thread_switchTo => true | _ => false) (* funcNode *) val {get = funcNode: Func.t -> unit Node.t, set = setFuncNode, rem = remFuncNode, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Multi.funcNode", Func.layout)) (* nodeFunction *) val {get = nodeFunction: unit Node.t -> Function.t, set = setNodeFunction, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("Multi.nodeFunc", Node.layout)) (* funcInfo *) val {get = funcInfo: Func.t -> FuncInfo.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncInfo.new ())) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) (* construct call graph * compute calls * compute threadCopyCurrent *) val G = Graph.new () fun newNode () = Graph.newNode G fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (functions, fn f => let val n = newNode () in setFuncNode (Function.name f, n) ; setNodeFunction (n, f) end) val _ = Calls.inc (FuncInfo.calls (funcInfo main)) val _ = List.foreach (functions, fn f => let val {name = f, blocks, ...} = Function.dest f val fi = funcInfo f in Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val li = labelInfo label in case transfer of Call {func = g, ...} => let val gi = funcInfo g in Calls.inc (FuncInfo.calls gi) ; addEdge {from = funcNode f, to = funcNode g} ; if usesThreadsOrConts then ThreadCopyCurrent.when (FuncInfo.threadCopyCurrent gi, fn () => (ThreadCopyCurrent.force (LabelInfo.threadCopyCurrent li) ; ThreadCopyCurrent.force (FuncInfo.threadCopyCurrent fi))) else () end | Runtime {prim, ...} => if usesThreadsOrConts andalso (case prim of Prim.Thread_copyCurrent => true | _ => false) then (ThreadCopyCurrent.force (LabelInfo.threadCopyCurrent li) ; ThreadCopyCurrent.force (FuncInfo.threadCopyCurrent fi)) else () | _ => () end) end) val () = Graph.removeDuplicateEdges G val rec forceMultiThreadedVar = fn x => let val vi = varInfo x in MultiThreaded.force (VarInfo.multiThreaded vi) ; MultiUsed.force (VarInfo.multiUsed vi) end val rec forceMultiUsedVar = fn x => let val vi = varInfo x in MultiUsed.force (VarInfo.multiUsed vi) end val rec forceMultiThreadedFunc = fn f => let val fi = funcInfo f in MultiThreaded.force (FuncInfo.multiThreaded fi) ; MultiUsed.force (FuncInfo.multiUsed fi) end val rec forceMultiUsedFunc = fn f => let val fi = funcInfo f in MultiUsed.force (FuncInfo.multiUsed fi) end val rec forceMultiThreadedBlock = fn Block.T {label, args, statements, transfer} => let val li = labelInfo label in if MultiThreaded.is (LabelInfo.multiThreaded li) then () else (MultiThreaded.force (LabelInfo.multiThreaded li) ; MultiUsed.force (LabelInfo.multiUsed li) ; Vector.foreach (args, forceMultiThreadedVar o #1) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, forceMultiThreadedVar)) ; Transfer.foreachFunc (transfer, forceMultiThreadedFunc)) end val rec forceMultiThreadedBlockDFS = fn controlFlow as {graph = _, labelNode, nodeBlock} => fn block as Block.T {label, transfer, ...} => let val li = labelInfo label in if MultiThreaded.is (LabelInfo.multiThreaded li) then () else (forceMultiThreadedBlock block ; Transfer.foreachLabel (transfer, fn l => forceMultiThreadedBlockDFS controlFlow (nodeBlock (labelNode l)))) end val rec forceMultiUsedBlock = fn Block.T {label, args, statements, transfer} => let val li = labelInfo label in if MultiUsed.is (LabelInfo.multiUsed li) then () else (MultiUsed.force (LabelInfo.multiUsed li) ; Vector.foreach (args, forceMultiUsedVar o #1) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, forceMultiUsedVar)) ; Transfer.foreachFunc (transfer, forceMultiUsedFunc)) end val rec visitBlock = fn controlFlow as {graph = _, labelNode, nodeBlock} => fn Block.T {label, transfer, ...} => if ThreadCopyCurrent.does (LabelInfo.threadCopyCurrent (labelInfo label)) then Transfer.foreachLabel (transfer, fn l => forceMultiThreadedBlockDFS controlFlow (nodeBlock (labelNode l))) else () val rec visitForceMultiUsedBlock = fn controlFlow => fn block => (forceMultiUsedBlock block ; visitBlock controlFlow block) val rec forceMultiThreadedFunc = fn f => let val {args, blocks, ...} = Function.dest f in Vector.foreach (args, forceMultiThreadedVar o #1) ; Vector.foreach (blocks, forceMultiThreadedBlock) end val rec forceMultiUsedFunc = fn f => let val {args, blocks, ...} = Function.dest f in Vector.foreach (args, forceMultiUsedVar o #1) ; Vector.foreach (blocks, forceMultiUsedBlock) end fun visitFunc multiUsed f = let val _ = remFuncNode (Function.name f) val fi = funcInfo (Function.name f) val _ = if multiUsed orelse Calls.isMany (FuncInfo.calls fi) then MultiUsed.force (FuncInfo.multiUsed fi) else () in if MultiThreaded.is (FuncInfo.multiThreaded fi) then forceMultiThreadedFunc f else if MultiUsed.is (FuncInfo.multiUsed fi) then (forceMultiUsedFunc f ; if usesThreadsOrConts then let val _ = MultiThreaded.when (FuncInfo.multiThreaded fi, fn () => forceMultiThreadedFunc f) val controlFlow = Function.controlFlow f in Vector.foreach (Function.blocks f, visitBlock controlFlow) end else ()) else if usesThreadsOrConts then let val _ = MultiThreaded.when (FuncInfo.multiThreaded fi, fn () => forceMultiThreadedFunc f) val _ = MultiUsed.when (FuncInfo.multiUsed fi, fn () => forceMultiUsedFunc f) val controlFlow as {graph, nodeBlock, ...} = Function.controlFlow f in List.foreach (Graph.stronglyConnectedComponents graph, fn [] => () | [n] => if Node.hasEdge {from = n, to = n} then visitForceMultiUsedBlock controlFlow (nodeBlock n) else visitBlock controlFlow (nodeBlock n) | ns => List.foreach (ns, fn n => visitForceMultiUsedBlock controlFlow (nodeBlock n))) end else let val _ = MultiUsed.when (FuncInfo.multiUsed fi, fn () => forceMultiUsedFunc f) val {graph, nodeBlock, ...} = Function.controlFlow f in List.foreach (Graph.stronglyConnectedComponents graph, fn [] => () | [n] => if Node.hasEdge {from = n, to = n} then forceMultiUsedBlock (nodeBlock n) else () | ns => List.foreach (ns, fn n => forceMultiUsedBlock (nodeBlock n))) end end val _ = List.foreach (Graph.stronglyConnectedComponents G, fn [] => () | [n] => visitFunc (Node.hasEdge {from = n, to = n}) (nodeFunction n) | ns => List.foreach (ns, fn n => visitFunc true (nodeFunction n))) (* val _ = Control.diagnostics (fn display => let open Layout in display (Layout.str "\n\nMulti:") ; display (seq [Layout.str "usesThreadsOrConts: ", Bool.layout usesThreadsOrConts]) ; List.foreach (functions, fn f => let val {name = f, blocks, ...} = Function.dest f in display (seq [Func.layout f, str ": ", FuncInfo.layout (funcInfo f)]) ; Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])) end) end) *) in { usesThreadsOrConts = usesThreadsOrConts, funcDoesThreadCopyCurrent = ThreadCopyCurrent.does o FuncInfo.threadCopyCurrent o funcInfo, funcIsMultiThreaded = MultiThreaded.is o FuncInfo.multiThreaded o funcInfo, funcIsMultiUsed = MultiUsed.is o FuncInfo.multiUsed o funcInfo, labelDoesThreadCopyCurrent = ThreadCopyCurrent.does o LabelInfo.threadCopyCurrent o labelInfo, labelIsMultiThreaded = MultiThreaded.is o LabelInfo.multiThreaded o labelInfo, labelIsMultiUsed = MultiUsed.is o LabelInfo.multiUsed o labelInfo, varIsMultiDefed = MultiUsed.is o VarInfo.multiUsed o varInfo } end end mlton-20210117+dfsg/mlton/ssa/multi.sig000066400000000000000000000045671416264345000176170ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MULTI_STRUCTS = sig include SSA_TREE end signature MULTI = sig include MULTI_STRUCTS val multi: Program.t -> {(* Program has an occurence of Thread_switchTo. *) usesThreadsOrConts: bool, (* usesThreadsOrConts == true * and the func directly or indirectly invokes * Thread_copyCurrent. *) funcDoesThreadCopyCurrent: Func.t -> bool, (* usesThreadsOrConts == true * and the func may be called by two * different threads during some run of the * program. *) funcIsMultiThreaded: Func.t -> bool, (* The func may be called more than once * during some run of the program. *) funcIsMultiUsed: Func.t -> bool, (* usesThreadsOrConts == true * and the label's block's transfer is * either Runtime {prim, ...} * with prim = Thread_copyCurrent * or Call {func, ...} * with funcDoesThreadCopyCurrent(func) == true. *) labelDoesThreadCopyCurrent: Label.t -> bool, (* usesTheadsOrConts == true * and the label may be executed by two * different threads during some run of the * program. *) labelIsMultiThreaded: Label.t -> bool, (* The label may be executed more than once * during some run of the program. *) labelIsMultiUsed: Label.t -> bool, (* The var may be defined more than once * during some run of the program; * i.e., varIsMultiDefed(x) = * labelIsMultiUsed(label of x's def) * when x is defined in a block; *) varIsMultiDefed: Var.t -> bool} end mlton-20210117+dfsg/mlton/ssa/poly-equal.fun000066400000000000000000000730201416264345000205510ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PolyEqual (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S (* * This pass implements polymorphic equality. * * For each datatype tycon and vector type, it builds an equality function and * translates calls to MLton_equal into calls to that function. * * Also generates calls to primitive wordEqual. * * For tuples, it does the equality test inline. I.E. it does not create * a separate equality function for each tuple type. * * All equality functions are only created if necessary, i.e. if equality * is actually used at a type. * * Optimizations: * - For datatype tycons that are enumerations, do not build a case dispatch, * just use eq, since you know the backend will represent these as ints. * - Deep equality always does an eq test first. * - If one argument to = is a constant and the type will get translated to * an IntOrPointer, then just use eq instead of the full equality. This is * important for implementing code like the following efficiently: * if x = 0 ... (where x is an IntInf.int) * * Also convert pointer equality on scalar types to type specific primitives. *) open Exp Transfer structure Dexp = struct open DirectExp fun conjoin (e1: t, e2: t): t = casee {test = e1, cases = Con (Vector.new2 ({con = Con.truee, args = Vector.new0 (), body = e2}, {con = Con.falsee, args = Vector.new0 (), body = falsee})), default = NONE, ty = Type.bool} fun disjoin (e1: t, e2:t): t = casee {test = e1, cases = Con (Vector.new2 ({con = Con.truee, args = Vector.new0 (), body = truee}, {con = Con.falsee, args = Vector.new0 (), body = e2})), default = NONE, ty = Type.bool} local fun mk prim = fn (e1: t, e2: t, s) => primApp {prim = prim s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} in val add = mk Prim.Word_add val andb = mk Prim.Word_andb val orb = mk Prim.Word_orb end fun wordEqual (e1: t, e2: t, s): t = primApp {prim = Prim.Word_equal s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.bool} end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {hasEqual: bool}, set = setFuncInfo, ...} = Property.getSet (Func.plist, Property.initConst {hasEqual = false}) val {get = labelInfo: Label.t -> {hasEqual: bool}, set = setLabelInfo, ...} = Property.getSet (Label.plist, Property.initConst {hasEqual = false}) val {get = varInfo: Var.t -> {isConst: bool}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst {isConst = false}) val {get = tyconInfo: Tycon.t -> {isEnum: bool, cons: {con: Con.t, args: Type.t vector} vector}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("PolyEqual.tyconInfo", Tycon.layout)) val isEnum = #isEnum o tyconInfo val tyconCons = #cons o tyconInfo val {get = getTyconEqualFunc: Tycon.t -> Func.t option, set = setTyconEqualFunc, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val {get = getVectorEqualFunc: Type.t -> Func.t option, set = setVectorEqualFunc, destroy = destroyVectorEqualFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val (getIntInfEqualFunc: unit -> Func.t option, setIntInfEqualFunc: Func.t option -> unit) = let val r = ref NONE in (fn () => !r, fn fo => r := fo) end val returns = SOME (Vector.new1 Type.bool) val seqIndexWordSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexWordSize val newFunctions: Function.t list ref = ref [] fun newFunction z = List.push (newFunctions, Function.profile (Function.new z, SourceInfo.polyEqual)) fun equalTyconFunc (tycon: Tycon.t): Func.t = case getTyconEqualFunc tycon of SOME f => f | NONE => let val name = Func.newString (concat ["equal_", Tycon.originalName tycon]) val _ = setTyconEqualFunc (tycon, SOME name) val ty = Type.datatypee tycon val arg1 = (Var.newNoname (), ty) val arg2 = (Var.newNoname (), ty) val args = Vector.new2 (arg1, arg2) val darg1 = Dexp.var arg1 val darg2 = Dexp.var arg2 val cons = tyconCons tycon val body = Dexp.disjoin (Dexp.eq (Dexp.var arg1, Dexp.var arg2, ty), Dexp.casee {test = darg1, ty = Type.bool, default = (if Vector.exists (cons, fn {args, ...} => Vector.isEmpty args) then SOME Dexp.falsee else NONE), cases = Dexp.Con (Vector.keepAllMap (cons, fn {con, args} => if Vector.isEmpty args then NONE else let fun makeArgs () = Vector.map (args, fn ty => (Var.newNoname (), ty)) val xs = makeArgs () val ys = makeArgs () in SOME {con = con, args = xs, body = Dexp.casee {test = darg2, ty = Type.bool, default = if 1 = Vector.length cons then NONE else SOME Dexp.falsee, cases = Dexp.Con (Vector.new1 {con = con, args = ys, body = Vector.fold2 (xs, ys, Dexp.truee, fn ((x, ty), (y, _), de) => Dexp.conjoin (de, equal (x, y, ty)))})}} end))}) val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end and mkVectorEqualFunc {name: Func.t, ty: Type.t, doEq: bool}: unit = let val loop = Func.newString (Func.originalName name ^ "Loop") (* Build two functions, one that checks the lengths and the * other that loops. *) val vty = Type.vector ty local val vec1 = (Var.newNoname (), vty) val vec2 = (Var.newNoname (), vty) val args = Vector.new2 (vec1, vec2) val dvec1 = Dexp.var vec1 val dvec2 = Dexp.var vec2 val len1 = (Var.newNoname (), seqIndexTy) val dlen1 = Dexp.var len1 val len2 = (Var.newNoname (), seqIndexTy) val dlen2 = Dexp.var len2 val body = let fun length dvec = Dexp.primApp {prim = Prim.Vector_length, targs = Vector.new1 ty, args = Vector.new1 dvec, ty = Type.word seqIndexWordSize} val body = Dexp.lett {decs = [{var = #1 len1, exp = length dvec1}, {var = #1 len2, exp = length dvec2}], body = Dexp.conjoin (Dexp.wordEqual (dlen1, dlen2, seqIndexWordSize), Dexp.call {func = loop, args = Vector.new4 (dvec1, dvec2, dlen1, Dexp.word (WordX.zero seqIndexWordSize)), ty = Type.bool})} in if doEq then Dexp.disjoin (Dexp.eq (dvec1, dvec2, vty), body) else body end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} end local val vec1 = (Var.newNoname (), vty) val vec2 = (Var.newNoname (), vty) val len = (Var.newNoname (), seqIndexTy) val i = (Var.newNoname (), seqIndexTy) val args = Vector.new4 (vec1, vec2, len, i) val dvec1 = Dexp.var vec1 val dvec2 = Dexp.var vec2 val dlen = Dexp.var len val di = Dexp.var i val body = let fun sub (dvec, di) = Dexp.primApp {prim = Prim.Vector_sub, targs = Vector.new1 ty, args = Vector.new2 (dvec, di), ty = ty} val args = Vector.new4 (dvec1, dvec2, dlen, Dexp.add (di, Dexp.word (WordX.one seqIndexWordSize), seqIndexWordSize)) in Dexp.disjoin (Dexp.wordEqual (di, dlen, seqIndexWordSize), Dexp.conjoin (equalExp (sub (dvec1, di), sub (dvec2, di), ty), Dexp.call {args = args, func = loop, ty = Type.bool})) end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = loop, raises = NONE, returns = returns, start = start} end in () end and vectorEqualFunc (ty: Type.t): Func.t = case getVectorEqualFunc ty of SOME f => f | NONE => let val name = Func.newString "vectorEqual" val _ = setVectorEqualFunc (ty, SOME name) val () = mkVectorEqualFunc {name = name, ty = ty, doEq = true} in name end and intInfEqualFunc (): Func.t = case getIntInfEqualFunc () of SOME f => f | NONE => let val intInfEqual = Func.newString "intInfEqual" val _ = setIntInfEqualFunc (SOME intInfEqual) val bws = WordSize.bigIntInfWord () val sws = WordSize.smallIntInfWord () val bigIntInfEqual = Func.newString "bigIntInfEqual" val () = mkVectorEqualFunc {name = bigIntInfEqual, ty = Type.word bws, doEq = false} local val arg1 = (Var.newNoname (), Type.intInf) val arg2 = (Var.newNoname (), Type.intInf) val args = Vector.new2 (arg1, arg2) val darg1 = Dexp.var arg1 val darg2 = Dexp.var arg2 fun toWord dx = Dexp.primApp {prim = Prim.IntInf_toWord, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word sws} fun toVector dx = Dexp.primApp {prim = Prim.IntInf_toVector, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.vector (Type.word bws)} val one = Dexp.word (WordX.one sws) val body = Dexp.disjoin (Dexp.eq (darg1, darg2, Type.intInf), Dexp.casee {test = Dexp.wordEqual (Dexp.andb (Dexp.orb (toWord darg1, toWord darg2, sws), one, sws), one, sws), ty = Type.bool, default = NONE, cases = (Dexp.Con o Vector.new2) ({con = Con.truee, args = Vector.new0 (), body = Dexp.falsee}, {con = Con.falsee, args = Vector.new0 (), body = Dexp.call {func = bigIntInfEqual, args = Vector.new2 (toVector darg1, toVector darg2), ty = Type.bool}})}) val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = intInfEqual, raises = NONE, returns = returns, start = start} end in intInfEqual end and equalExp (e1: Dexp.t, e2: Dexp.t, ty: Type.t): Dexp.t = Dexp.name (e1, fn x1 => Dexp.name (e2, fn x2 => equal (x1, x2, ty))) and equal (x1: Var.t, x2: Var.t, ty: Type.t): Dexp.t = let val dx1 = Dexp.var (x1, ty) val dx2 = Dexp.var (x2, ty) fun prim (p, targs) = Dexp.primApp {prim = p, targs = targs, args = Vector.new2 (dx1, dx2), ty = Type.bool} fun eq () = prim (Prim.MLton_eq, Vector.new1 ty) fun hasConstArg () = #isConst (varInfo x1) orelse #isConst (varInfo x2) in case Type.dest ty of Type.Array _ => eq () | Type.CPointer => prim (Prim.CPointer_equal, Vector.new0 ()) | Type.Datatype tycon => if isEnum tycon orelse hasConstArg () then eq () else Dexp.call {func = equalTyconFunc tycon, args = Vector.new2 (dx1, dx2), ty = Type.bool} | Type.IntInf => if hasConstArg () then eq () else Dexp.call {func = intInfEqualFunc (), args = Vector.new2 (dx1, dx2), ty = Type.bool} | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) fun toWord dx = Dexp.primApp {prim = Prim.Real_castToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Dexp.wordEqual (toWord dx1, toWord dx2, ws) end | Type.Ref _ => eq () | Type.Thread => eq () | Type.Tuple tys => let val max = Vector.length tys - 1 (* test components i, i+1, ... *) fun loop (i: int): Dexp.t = if i > max then Dexp.truee else let val ty = Vector.sub (tys, i) fun select dx = Dexp.select {tuple = dx, offset = i, ty = ty} in Dexp.conjoin (equalExp (select dx1, select dx2, ty), loop (i + 1)) end in loop 0 end | Type.Vector ty => Dexp.call {func = vectorEqualFunc ty, args = Vector.new2 (dx1, dx2), ty = Type.bool} | Type.Weak _ => eq () | Type.Word ws => prim (Prim.Word_equal ws, Vector.new0 ()) end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTyconInfo (tycon, {isEnum = Vector.forall (cons, fn {args, ...} => Vector.isEmpty args), cons = cons})) fun setBind (Statement.T {exp, var, ...}) = let fun const () = case var of NONE => () | SOME x => setVarInfo (x, {isConst = true}) in case exp of Const c => (case c of Const.IntInf i => (case Const.IntInfRep.fromIntInf i of Const.IntInfRep.Big _ => () | Const.IntInfRep.Small _ => const ()) | Const.Word _ => const () | _ => ()) | ConApp {args, ...} => if Vector.isEmpty args then const () else () | _ => () end val _ = Vector.foreach (globals, setBind) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {label, statements, ...} => let fun setHasEqual () = (setFuncInfo (name, {hasEqual = true}) ; setLabelInfo (label, {hasEqual = true})) in Vector.foreach (statements, fn stmt as Statement.T {exp, ...} => (setBind stmt; case exp of PrimApp {prim, ...} => (case prim of Prim.MLton_eq => setHasEqual () | Prim.MLton_equal => setHasEqual () | _ => ()) | _ => ())) end) end) fun doit blocks = let val blocks = Vector.fold (blocks, [], fn (block as Block.T {label, args, statements, transfer}, blocks) => if not (#hasEqual (labelInfo label)) then block::blocks else let fun finish ({label, args, statements}, transfer) = Block.T {label = label, args = args, statements = Vector.fromListRev statements, transfer = transfer} val (blocks, las) = Vector.fold (statements, (blocks, {label = label, args = args, statements = []}), fn (stmt as Statement.T {exp, var, ...}, (blocks, las as {label, args, statements})) => let fun normal () = (blocks, {label = label, args = args, statements = stmt::statements}) fun adds ss = (blocks, {label = label, args = args, statements = ss @ statements}) in case exp of PrimApp {prim, targs, args, ...} => (case (prim, Vector.length targs) of (Prim.MLton_eq, 1) => (case Type.dest (Vector.first targs) of Type.CPointer => let val cp0 = Vector.sub (args, 0) val cp1 = Vector.sub (args, 1) val cpointerEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.CPointer_equal, targs = Vector.new0 (), args = Vector.new2 (cp0,cp1)}} in adds [cpointerEqStmt] end | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) val wt = Type.word ws val r0 = Vector.sub (args, 0) val r1 = Vector.sub (args, 1) val w0 = Var.newNoname () val w1 = Var.newNoname () fun realCastToWordStmt (r, w) = Statement.T {var = SOME w, ty = wt, exp = Exp.PrimApp {prim = Prim.Real_castToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 r}} val wordEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.Word_equal ws, targs = Vector.new0 (), args = Vector.new2 (w0,w1)}} in adds [wordEqStmt, realCastToWordStmt (r1, w1), realCastToWordStmt (r0, w0)] end | Type.Word ws => let val w0 = Vector.sub (args, 0) val w1 = Vector.sub (args, 1) val wordEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.Word_equal ws, targs = Vector.new0 (), args = Vector.new2 (w0,w1)}} in adds [wordEqStmt] end | _ => normal ()) | (Prim.MLton_equal, 1) => let val ty = Vector.sub (targs, 0) fun arg i = Vector.sub (args, i) val l = Label.newNoname () val (start',bs') = Dexp.linearizeGoto (equal (arg 0, arg 1, ty), Handler.Dead, l) in (finish (las, Goto {dst = start', args = Vector.new0 ()}) :: (bs' @ blocks), {label = l, args = Vector.new1 (valOf var, Type.bool), statements = []}) end | _ => normal ()) | _ => normal () end) in finish (las, transfer) :: blocks end) in Vector.fromList blocks end val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val f = if #hasEqual (funcInfo name) then Function.new {args = args, blocks = doit blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} else f val () = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = (!newFunctions) @ functions, main = main} val _ = destroyVectorEqualFunc () val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/poly-hash.fun000066400000000000000000000774651416264345000204060ustar00rootroot00000000000000(* Copyright (C) 2009-2010,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PolyHash (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S (* * This pass implements polymorphic, structural hashing. * * For each datatype tycon and vector type, it builds a hashing function and * translates calls to MLton_hash into calls to that function. * * For tuples, it does the hashing inline. I.E. it does not create * a separate hashing function for each tuple type. * * All hashing functions are only created if necessary, i.e. if hashing * is actually used at a type. * * Optimizations: *) open Exp Transfer structure Dexp = struct open DirectExp fun wordFromWord (w: word, ws: WordSize.t): t = word (WordX.fromWord (w, ws)) fun shiftInt i = word (WordX.fromIntInf (i, WordSize.shiftArg)) fun shiftBits b = shiftInt (Bits.toIntInf b) local fun mk prim = fn (e1: t, e2: t, s) => primApp {prim = prim s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} in val add = mk Prim.Word_add val andb = mk Prim.Word_andb val rshift = mk (fn s => Prim.Word_rshift (s, {signed = false})) val xorb = mk Prim.Word_xorb end local fun mk prim = fn (e1: t, e2: t, s, sg) => primApp {prim = prim (s, sg), targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} in val mul = mk Prim.Word_mul end fun wordEqual (e1: t, e2: t, s): t = primApp {prim = Prim.Word_equal s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.bool} end structure Hash = struct val resWordSize = WordSize.word32 val resTy = Type.word resWordSize fun mkWordBytes {stateTy: Type.t, workWordSize: WordSize.t, combByte: Dexp.t * Dexp.t -> Dexp.t, mix: Dexp.t -> Dexp.t} = let val workBits = WordSize.bits workWordSize val workTy = Type.word workWordSize fun wordBytes (st,w,ws) = let fun extdW w = if WordSize.equals (ws, workWordSize) then w else Dexp.primApp {prim = Prim.Word_extdToWord (ws, workWordSize, {signed = false}), targs = Vector.new0 (), args = Vector.new1 w, ty = workTy} val mask = (Dexp.word o WordX.resize) (WordX.allOnes WordSize.word8, workWordSize) fun loop (st, w, b) = if Bits.<= (b, Bits.zero) then st else let val dst0 = st val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val bw = Var.newNoname () val dbw = Dexp.var (bw, workTy) val st1 = Var.newNoname () val dst1 = Dexp.var (st1, stateTy) val st2 = Var.newNoname () val dst2 = Dexp.var (st2, stateTy) in Dexp.lett {decs = [{var = w0, exp = w}, {var = bw, exp = Dexp.andb (dw0, mask, workWordSize)}, {var = st1, exp = combByte (dst0, dbw)}, {var = st2, exp = mix dst1}], body = loop (dst2, Dexp.rshift (dw0, Dexp.shiftBits Bits.inWord8, workWordSize), Bits.- (b, Bits.inWord8))} end fun lp (st, w, b) = if Bits.<= (b, Bits.zero) then st else let val dst0 = st val w0 = Var.newNoname () val dw0 = Dexp.var (w0, Type.word ws) val ew = Var.newNoname () val dew = Dexp.var (ew, workTy) val loopBits = Bits.min (b, workBits) val st1 = Var.newNoname () val dst1 = Dexp.var (st1, stateTy) in Dexp.lett {decs = [{var = w0, exp = w}, {var = ew, exp = extdW dw0}, {var = st1, exp = loop (dst0, dew, loopBits)}], body = lp (dst1, Dexp.rshift (dw0, Dexp.shiftBits workBits, ws), Bits.- (b, workBits))} end val st0 = Var.newNoname () val dst0 = Dexp.var (st0, stateTy) in Dexp.lett {decs = [{var = st0, exp = st}], body = lp (dst0, w, WordSize.bits ws)} end in wordBytes end (* (* Jenkins hash function * http://en.wikipedia.org/wiki/Jenkins_hash_function (20100315) *) val {stateTy: Type.t, init: unit -> Dexp.t, wordBytes: Dexp.t * Dexp.t * WordSize.t -> Dexp.t, fini: Dexp.t -> Dexp.t} = let val stateWordSize = resWordSize val stateTy = Type.word stateWordSize val workWordSize = resWordSize val workTy = Type.word workWordSize local fun mk prim = fn (w1, w2) => prim (w1, w2, stateWordSize) in val add = mk Dexp.add val lshift = mk Dexp.lshift val rshift = mk Dexp.rshift val xorb = mk Dexp.xorb end fun init () = Dexp.word (WordX.zero stateWordSize) fun combByte (hexp, wexp) = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = w0, exp = wexp}, {var = h1, exp = add (dh0, dw0)}], body = dh1} end fun mix hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) val h2 = Var.newNoname () val dh2 = Dexp.var (h2, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = add (dh0, lshift (dh0, Dexp.shiftInt 10))}, {var = h2, exp = xorb (dh1, rshift (dh1, Dexp.shiftInt 6))}], body = dh2} end val wordBytes = mkWordBytes {stateTy = stateTy, workWordSize = workWordSize, combByte = combByte, mix = mix} fun fini hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) val h2 = Var.newNoname () val dh2 = Dexp.var (h2, stateTy) val h3 = Var.newNoname () val dh3 = Dexp.var (h3, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = add (dh0, lshift (dh0, Dexp.shiftInt 3))}, {var = h2, exp = xorb (dh1, rshift (dh1, Dexp.shiftInt 11))}, {var = h3, exp = add (dh2, lshift (dh2, Dexp.shiftInt 15))}], body = dh3} end in {stateTy = stateTy, init = init, wordBytes = wordBytes, fini = fini} end *) (* FNV-1a hash function * http://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function (20100315) *) val {stateTy: Type.t, init: unit -> Dexp.t, wordBytes: Dexp.t * Dexp.t * WordSize.t -> Dexp.t, fini: Dexp.t -> Dexp.t} = let val stateWordSize = resWordSize val stateTy = Type.word stateWordSize val workWordSize = resWordSize val workTy = Type.word workWordSize local fun mk prim = fn (w1, w2) => prim (w1, w2, stateWordSize) in val mul = mk (fn (w1,w2,s) => Dexp.mul (w1,w2,s,{signed = false})) val xorb = mk Dexp.xorb end val fnv_prime = WordX.fromIntInf (16777619, stateWordSize) val fnv_offset_bias = WordX.fromIntInf (2166136261, stateWordSize) fun init () = Dexp.word fnv_offset_bias fun combByte (hexp, wexp) = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = w0, exp = wexp}, {var = h1, exp = xorb (dh0, dw0)}], body = dh1} end fun mix hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val p = Dexp.word fnv_prime val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = mul (dh0, p)}], body = dh1} end val wordBytes = mkWordBytes {stateTy = stateTy, workWordSize = workWordSize, combByte = combByte, mix = mix} fun fini hexp = hexp in {stateTy = stateTy, init = init, wordBytes = wordBytes, fini = fini} end fun wordBytesFromWord (st: Dexp.t, w:word, ws: WordSize.t) = wordBytes (st, Dexp.wordFromWord (w, ws), ws) end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {hasHash: bool}, set = setFuncInfo, ...} = Property.getSet (Func.plist, Property.initConst {hasHash = false}) val {get = labelInfo: Label.t -> {hasHash: bool}, set = setLabelInfo, ...} = Property.getSet (Label.plist, Property.initConst {hasHash = false}) val {get = tyconInfo: Tycon.t -> {cons: {con: Con.t, args: Type.t vector} vector}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("PolyHash.info", Tycon.layout)) val tyconCons = #cons o tyconInfo val {get = getHashFunc: Type.t -> Func.t option, set = setHashFunc, destroy = destroyHashFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val {get = getTyconHashFunc: Tycon.t -> Func.t option, set = setTyconHashFunc, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val {get = getVectorHashFunc: Type.t -> Func.t option, set = setVectorHashFunc, destroy = destroyVectorHashFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val returns = SOME (Vector.new1 Hash.stateTy) val seqIndexWordSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexWordSize val newFunctions: Function.t list ref = ref [] fun newFunction z = List.push (newFunctions, Function.profile (Function.new z, SourceInfo.polyHash)) fun hashTyconFunc (tycon: Tycon.t): Func.t = case getTyconHashFunc tycon of SOME f => f | NONE => let val name = Func.newString (concat ["hash_", Tycon.originalName tycon]) val _ = setTyconHashFunc (tycon, SOME name) val ty = Type.datatypee tycon val st = (Var.newNoname (), Hash.stateTy) val x = (Var.newNoname (), ty) val args = Vector.new2 (st, x) val dst = Dexp.var st val dx = Dexp.var x val cons = tyconCons tycon val body = Dexp.casee {test = dx, ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.map) (cons, fn {con, args} => let val xs = Vector.map (args, fn ty => (Var.newNoname (), ty)) in {con = con, args = xs, body = Vector.fold (xs, Hash.wordBytesFromWord (dst, Con.hash con, WordSize.word32), fn ((x,ty), dstate) => hashExp (dstate, Dexp.var (x, ty), ty))} end)} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end and vectorHashFunc (ty: Type.t): Func.t = case getVectorHashFunc ty of SOME f => f | NONE => let (* Build two functions, one that hashes the length and the * other that loops. *) val name = Func.newString "vectorHash" val _ = setVectorHashFunc (ty, SOME name) val loop = Func.newString "vectorHashLoop" val vty = Type.vector ty local val st = (Var.newNoname (), Hash.stateTy) val vec = (Var.newNoname (), vty) val args = Vector.new2 (st, vec) val dst = Dexp.var st val dvec = Dexp.var vec val len = (Var.newNoname (), seqIndexTy) val dlen = Dexp.var len val body = Dexp.lett {decs = [{var = #1 len, exp = Dexp.primApp {prim = Prim.Vector_length, targs = Vector.new1 ty, args = Vector.new1 dvec, ty = seqIndexTy}}], body = Dexp.call {func = loop, args = (Vector.new4 (Hash.wordBytes (dst, dlen, seqIndexWordSize), dvec, dlen, Dexp.word (WordX.zero seqIndexWordSize))), ty = Hash.stateTy}} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} end local val st = (Var.newNoname (), Hash.stateTy) val vec = (Var.newNoname (), vty) val len = (Var.newNoname (), seqIndexTy) val i = (Var.newNoname (), seqIndexTy) val args = Vector.new4 (st, vec, len, i) val dst = Dexp.var st val dvec = Dexp.var vec val dlen = Dexp.var len val di = Dexp.var i val body = let val args = Vector.new4 (hashExp (dst, Dexp.primApp {prim = Prim.Vector_sub, targs = Vector.new1 ty, args = Vector.new2 (dvec, di), ty = ty}, ty), dvec, dlen, Dexp.add (di, Dexp.word (WordX.one seqIndexWordSize), seqIndexWordSize)) in Dexp.casee {test = Dexp.wordEqual (di, dlen, seqIndexWordSize), ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.new2) ({con = Con.truee, args = Vector.new0 (), body = dst}, {con = Con.falsee, args = Vector.new0 (), body = Dexp.call {args = args, func = loop, ty = Hash.stateTy}})} end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = loop, raises = NONE, returns = returns, start = start} end in name end and hashExp (st: Dexp.t, x: Dexp.t, ty: Type.t): Dexp.t = Dexp.name (st, fn st => Dexp.name (x, fn x => hash (st, x, ty))) and hash (st: Var.t, x: Var.t, ty: Type.t): Dexp.t = let val dst = Dexp.var (st, Hash.stateTy) val dx = Dexp.var (x, ty) fun stateful () = Hash.wordBytesFromWord (dst, Type.hash ty, WordSize.word32) val body = case Type.dest ty of Type.Array _ => stateful () | Type.CPointer => let val ws = WordSize.cpointer () val toWord = Dexp.primApp {prim = Prim.CPointer_toWord, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Hash.wordBytes (dst, toWord, ws) end | Type.Datatype tycon => Dexp.call {func = hashTyconFunc tycon, args = Vector.new2 (dst, dx), ty = Hash.stateTy} | Type.IntInf => let val sws = WordSize.smallIntInfWord () val bws = WordSize.bigIntInfWord () val toWord = Dexp.primApp {prim = Prim.IntInf_toWord, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word sws} val toVector = Dexp.primApp {prim = Prim.IntInf_toVector, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.vector (Type.word bws)} val w = Var.newNoname () val dw = Dexp.var (w, Type.word sws) val one = Dexp.word (WordX.one sws) in Dexp.lett {decs = [{var = w, exp = toWord}], body = Dexp.casee {test = Dexp.wordEqual (Dexp.andb (dw, one, sws), one, sws), ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.new2) ({con = Con.truee, args = Vector.new0 (), body = Hash.wordBytes (dst, dw, sws)}, {con = Con.falsee, args = Vector.new0 (), body = Dexp.call {func = vectorHashFunc (Type.word bws), args = Vector.new2 (dst, toVector), ty = Hash.stateTy}})}} end | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) val toWord = Dexp.primApp {prim = Prim.Real_castToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Hash.wordBytes (dst, toWord, ws) end | Type.Ref _ => stateful () | Type.Thread => stateful () | Type.Tuple tys => let val max = Vector.length tys - 1 (* hash components i, i+1, ... *) fun loop (i: int, dst): Dexp.t = if i > max then dst else let val ty = Vector.sub (tys, i) val select = Dexp.select {tuple = dx, offset = i, ty = ty} in loop (i + 1, hashExp (dst, select, ty)) end in loop (0, dst) end | Type.Vector ty => Dexp.call {func = vectorHashFunc ty, args = Vector.new2 (dst, dx), ty = Hash.stateTy} | Type.Weak _ => stateful () | Type.Word ws => Hash.wordBytes (dst, dx, ws) in body end fun hashFunc (ty: Type.t): Func.t = case getHashFunc ty of SOME f => f | NONE => let val name = Func.newString "hash" val _ = setHashFunc (ty, SOME name) val x = (Var.newNoname (), ty) val args = Vector.new1 x val sti = Var.newNoname () val dsti = Dexp.var (sti, Hash.stateTy) val dx = Dexp.var x val stf = Var.newNoname () val dstf = Dexp.var (stf, Hash.stateTy) val w = Var.newNoname () val dw = Dexp.var (w, Hash.resTy) val body = Dexp.lett {decs = [{var = sti, exp = Hash.init ()}, {var = stf, exp = hashExp (dsti, dx, ty)}, {var = w, exp = Hash.fini dstf}], body = dw} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTyconInfo (tycon, {cons = cons})) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {label, statements, ...} => let fun setHasHash () = (setFuncInfo (name, {hasHash = true}) ; setLabelInfo (label, {hasHash = true})) in Vector.foreach (statements, fn Statement.T {exp, ...} => (case exp of PrimApp {prim, ...} => (case prim of Prim.MLton_hash => setHasHash () | _ => ()) | _ => ())) end) end) fun doit blocks = let val blocks = Vector.fold (blocks, [], fn (block as Block.T {label, args, statements, transfer}, blocks) => if not (#hasHash (labelInfo label)) then block::blocks else let fun finish ({label, args, statements}, transfer) = Block.T {label = label, args = args, statements = Vector.fromListRev statements, transfer = transfer} val (blocks, las) = Vector.fold (statements, (blocks, {label = label, args = args, statements = []}), fn (stmt as Statement.T {exp, var, ...}, (blocks, las as {label, args, statements})) => let fun normal () = (blocks, {label = label, args = args, statements = stmt::statements}) in case exp of PrimApp {prim, targs, args, ...} => (case (prim, Vector.length targs) of (Prim.MLton_hash, 1) => let val ty = Vector.first targs val x = Vector.first args val l = Label.newNoname () in (finish (las, Call {args = Vector.new1 x, func = hashFunc ty, return = Return.NonTail {cont = l, handler = Handler.Caller}}) :: blocks, {label = l, args = Vector.new1 (valOf var, Hash.resTy), statements = []}) end | _ => normal ()) | _ => normal () end) in finish (las, transfer) :: blocks end) in Vector.fromList blocks end val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val f = if #hasHash (funcInfo name) then Function.new {args = args, blocks = doit blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} else f val () = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = (!newFunctions) @ functions, main = main} val _ = destroyHashFunc () val _ = destroyVectorHashFunc () val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/prepasses.fun000066400000000000000000000202761416264345000204730ustar00rootroot00000000000000(* Copyright (C) 2009,2017 Matthew Fluet. * Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PrePasses (S: PREPASSES_STRUCTS): PREPASSES = struct open S open Exp Transfer (* A critical edge is one that connects a block with two or more * succesors to one with two or more predecessors. * This prepass breaks all critical edges by inserting an eta-block. * For some analyses and transformations, simply ensuring the unique * successor or predecessor property is sufficient. (For example, see * the comments at the end of "Conditional Constant Propagation" in * Section 19.3 of Appel's "Modern Compiler Implementation in ML".) * However, passes that require critical edges to be broken in order * to accomodate code motion (for example, PRE), should also break an * edge that connects a block with non-goto transfer to one with two * or more predecessors. *) structure CriticalEdges = struct structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector, inDeg: int ref, mustBreak: bool, outDeg: int ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val (inDeg', inDeg) = make' #inDeg val mustBreak = make #mustBreak val (outDeg', outDeg) = make' #outDeg end fun new (args, mustBreak): t = T {args = args, inDeg = ref 0, mustBreak = mustBreak, outDeg = ref 0} end fun breakFunction (f, {codeMotion: bool}) = let val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CriticalEdges.labelInfo", Label.layout)) val argsLabel = LabelInfo.args o labelInfo val inDeg = LabelInfo.inDeg o labelInfo val inDeg' = LabelInfo.inDeg' o labelInfo val mustBreak = LabelInfo.mustBreak o labelInfo val outDeg = LabelInfo.outDeg o labelInfo val outDeg' = LabelInfo.outDeg' o labelInfo val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {args, label, transfer, ...} => let val mustBreak = case transfer of Bug => false (* no successors *) | Goto _ => false | Raise _ => false (* no successors *) | Return _ => false (* no successors *) | _ => true in setLabelInfo (label, LabelInfo.new (args, mustBreak)) end) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val outDeg' = outDeg' label fun doit l = (Int.inc outDeg' ; Int.inc (inDeg' l)) in Transfer.foreachLabel (transfer, doit) end) val newBlocks = ref [] fun newBlock l = let val l' = Label.newString "L_crit" val args = Vector.map (argsLabel l, fn (x, ty) => (Var.new x, ty)) val _ = List.push (newBlocks, Block.T {args = args, label = l', statements = Vector.new0 (), transfer = Goto {dst = l, args = Vector.map(args, #1)}}) in l' end val blocks = Vector.map (blocks, fn b as Block.T {args, label, statements, transfer} => if (codeMotion andalso mustBreak label) orelse outDeg label >= 2 then let fun doit t = Transfer.replaceLabel (t, fn l => if inDeg l > 1 then newBlock l else l) in Block.T {args = args, label = label, statements = statements, transfer = doit transfer} end else b) in Function.new {args = args, blocks = Vector.concat [blocks, Vector.fromList (!newBlocks)], mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun break (Program.T {datatypes, globals, functions, main}, codeMotion) = let val functions = List.revMap (functions, fn f => breakFunction (f, codeMotion)) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end val breakCriticalEdgesFunction = CriticalEdges.breakFunction (* quell unused warning *) val _ = breakCriticalEdgesFunction val breakCriticalEdges = CriticalEdges.break structure DeadBlocks = struct fun eliminateFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val _ = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val _ = Vector.foreach (blocks, rem o Block.label) in f end fun eliminate (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} end val eliminateDeadBlocksFunction = DeadBlocks.eliminateFunction val eliminateDeadBlocks = DeadBlocks.eliminate structure Order = struct fun orderFunctions (p as Program.T {globals, datatypes, main, ...}) = let val functions = ref [] val () = Program.dfs (p, fn f => let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) in Program.T {datatypes = datatypes, globals = globals, functions = List.rev (!functions), main = main} end end val orderFunctions = Order.orderFunctions structure Reverse = struct fun reverseFunctions (Program.T {globals, datatypes, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.rev functions, main = main} end val reverseFunctions = Reverse.reverseFunctions end mlton-20210117+dfsg/mlton/ssa/prepasses.sig000066400000000000000000000027631416264345000204660ustar00rootroot00000000000000(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PREPASSES_STRUCTS = sig include TYPE_CHECK end signature PREPASSES = sig include PREPASSES_STRUCTS (* A critical edge is one that connects a block with two or more * succesors to one with two or more predecessors. * This prepass breaks all critical edges by inserting an eta-block. * For some analyses and transformations, simply ensuring the unique * successor or predecessor property is sufficient. (For example, see * the comments at the end of "Conditional Constant Propagation" in * Section 19.3 of Appel's "Modern Compiler Implementation in ML".) * However, passes that require critical edges to be broken in order * to accomodate code motion (for example, PRE), should also break an * edge that connects a block with non-functional control transfer to * one with two or more predecessors. *) val breakCriticalEdgesFunction: Function.t * {codeMotion: bool} -> Function.t val breakCriticalEdges: Program.t * {codeMotion: bool} -> Program.t val eliminateDeadBlocksFunction: Function.t -> Function.t val eliminateDeadBlocks: Program.t -> Program.t val orderFunctions: Program.t -> Program.t val reverseFunctions: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/prepasses2.fun000066400000000000000000000063061416264345000205530ustar00rootroot00000000000000(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor PrePasses2 (S: PREPASSES2_STRUCTS): PREPASSES2 = struct open S structure DeadBlocks = struct fun eliminateFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val _ = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val _ = Vector.foreach (blocks, rem o Block.label) in f end fun eliminate (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} end val eliminateDeadBlocksFunction = DeadBlocks.eliminateFunction (* quell unused warning *) val _ = eliminateDeadBlocksFunction val eliminateDeadBlocks = DeadBlocks.eliminate structure Order = struct fun orderFunctions (p as Program.T {globals, datatypes, main, ...}) = let val functions = ref [] val () = Program.dfs (p, fn f => let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) in Program.T {datatypes = datatypes, globals = globals, functions = List.rev (!functions), main = main} end end val orderFunctions = Order.orderFunctions structure Reverse = struct fun reverseFunctions (Program.T {globals, datatypes, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.rev functions, main = main} end val reverseFunctions = Reverse.reverseFunctions end mlton-20210117+dfsg/mlton/ssa/prepasses2.sig000066400000000000000000000010641416264345000205410ustar00rootroot00000000000000(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PREPASSES2_STRUCTS = sig include TYPE_CHECK2 end signature PREPASSES2 = sig include PREPASSES2_STRUCTS val eliminateDeadBlocksFunction: Function.t -> Function.t val eliminateDeadBlocks: Program.t -> Program.t val orderFunctions: Program.t -> Program.t val reverseFunctions: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/profile.fun000066400000000000000000000163611416264345000201260ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Profile (S: PROFILE_STRUCTS): PROFILE = struct open S fun addProfileFunction (f: Function.t) = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val extraBlocks = ref [] val siF = SourceInfo.function {name = [Func.toString name], region = Region.bogus} val enterF = ProfileExp.Enter siF val enterF = fn () => Statement.profile enterF val leaveF = ProfileExp.Leave siF val leaveF = fn () => Statement.profile leaveF val start = if Vector.exists (blocks, fn Block.T {transfer, ...} => Exn.withEscape (fn escape => (Transfer.foreachLabel (transfer, fn l => if Label.equals (l, start) then escape true else ()) ; false))) then let val newStart = Label.new start val _ = List.push (extraBlocks, Block.T {args = Vector.new0 (), label = newStart, statements = Vector.new1 (enterF ()), transfer = Transfer.Goto {dst = start, args = Vector.new0 ()}}) in newStart end else start val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val (enterFL, enterL, leaveL, leaveLF) = if not (!Control.profileBlock) orelse Vector.isEmpty statements then (fn () => Vector.new1 (enterF ()), fn () => Vector.new0 (), fn () => Vector.new0 (), fn () => Vector.new1 (leaveF ())) else let val siL = SourceInfo.function {name = [Label.toString label], region = Region.bogus} val enterL = ProfileExp.Enter siL val enterL = fn () => Statement.profile enterL val leaveL = ProfileExp.Leave siL val leaveL = fn () => Statement.profile leaveL in (fn () => Vector.new2 (enterF (), enterL ()), fn () => Vector.new1 (enterL ()), fn () => Vector.new1 (leaveL ()), fn () => Vector.new2 (leaveL (), leaveF ())) end val enterStmts = if Label.equals (label, start) then enterFL () else enterL () fun doitLF () = (leaveLF (), transfer) fun doitL () = (leaveL (), transfer) fun doit () = (Vector.new0 (), transfer) fun genHandler () = case raises of NONE => Handler.Caller | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leaveF ()), transfer = Transfer.Raise xs}) in Handler.Handle l end val (leaveStmts, transfer) = case transfer of Transfer.Call {args, func, return} => (case return of Return.Dead => doit () | Return.NonTail {cont, handler} => (case handler of Handler.Dead => doitL () | Handler.Caller => let val handler = genHandler () val return = Return.NonTail {cont = cont, handler = handler} in (leaveL (), Transfer.Call {args = args, func = func, return = return}) end | Handler.Handle _ => doitL ()) | Return.Tail => doitLF ()) | Transfer.Raise _ => doitLF () | Transfer.Return _ => doitLF () | _ => doitL () val statements = Vector.concat [enterStmts, statements, leaveStmts] in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun addProfile (Program.T {datatypes, functions, globals, main}) = Program.T {datatypes = datatypes, functions = List.revMap (functions, addProfileFunction), globals = globals, main = main} fun dropProfileFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => Block.T {args = args, label = label, statements = Vector.keepAll (statements, fn Statement.T {exp = Exp.Profile _, ...} => false | _ => true), transfer = transfer}) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun dropProfile (Program.T {datatypes, globals, functions, main}) = (Control.profile := Control.ProfileNone ; Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, dropProfileFunction), main = main}) end mlton-20210117+dfsg/mlton/ssa/profile.sig000066400000000000000000000006501416264345000201120ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_STRUCTS = sig include SHRINK end signature PROFILE = sig include PROFILE_STRUCTS val addProfile: Program.t -> Program.t val dropProfile: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/profile2.fun000066400000000000000000000163371416264345000202130ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Profile2 (S: PROFILE2_STRUCTS): PROFILE2 = struct open S fun addProfileFunction (f: Function.t) = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val extraBlocks = ref [] val siF = SourceInfo.function {name = [Func.toString name], region = Region.bogus} val enterF = ProfileExp.Enter siF val enterF = fn () => Statement.profile enterF val leaveF = ProfileExp.Leave siF val leaveF = fn () => Statement.profile leaveF val start = if Vector.exists (blocks, fn Block.T {transfer, ...} => Exn.withEscape (fn escape => (Transfer.foreachLabel (transfer, fn l => if Label.equals (l, start) then escape true else ()) ; false))) then let val newStart = Label.new start val _ = List.push (extraBlocks, Block.T {args = Vector.new0 (), label = newStart, statements = Vector.new1 (enterF ()), transfer = Transfer.Goto {dst = start, args = Vector.new0 ()}}) in newStart end else start val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val (enterFL, enterL, leaveL, leaveLF) = if not (!Control.profileBlock) orelse Vector.isEmpty statements then (fn () => Vector.new1 (enterF ()), fn () => Vector.new0 (), fn () => Vector.new0 (), fn () => Vector.new1 (leaveF ())) else let val siL = SourceInfo.function {name = [Label.toString label], region = Region.bogus} val enterL = ProfileExp.Enter siL val enterL = fn () => Statement.profile enterL val leaveL = ProfileExp.Leave siL val leaveL = fn () => Statement.profile leaveL in (fn () => Vector.new2 (enterF (), enterL ()), fn () => Vector.new1 (enterL ()), fn () => Vector.new1 (leaveL ()), fn () => Vector.new2 (leaveL (), leaveF ())) end val enterStmts = if Label.equals (label, start) then enterFL () else enterL () fun doitLF () = (leaveLF (), transfer) fun doitL () = (leaveL (), transfer) fun doit () = (Vector.new0 (), transfer) fun genHandler () = case raises of NONE => Handler.Caller | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leaveF ()), transfer = Transfer.Raise xs}) in Handler.Handle l end val (leaveStmts, transfer) = case transfer of Transfer.Call {args, func, return} => (case return of Return.Dead => doit () | Return.NonTail {cont, handler} => (case handler of Handler.Dead => doitL () | Handler.Caller => let val handler = genHandler () val return = Return.NonTail {cont = cont, handler = handler} in (leaveL (), Transfer.Call {args = args, func = func, return = return}) end | Handler.Handle _ => doitL ()) | Return.Tail => doitLF ()) | Transfer.Raise _ => doitLF () | Transfer.Return _ => doitLF () | _ => doitL () val statements = Vector.concat [enterStmts, statements, leaveStmts] in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun addProfile (Program.T {datatypes, functions, globals, main}) = Program.T {datatypes = datatypes, functions = List.revMap (functions, addProfileFunction), globals = globals, main = main} fun dropProfileFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => Block.T {args = args, label = label, statements = Vector.keepAll (statements, fn Statement.Profile _ => false | _ => true), transfer = transfer}) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun dropProfile (Program.T {datatypes, globals, functions, main}) = (Control.profile := Control.ProfileNone ; Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, dropProfileFunction), main = main}) end mlton-20210117+dfsg/mlton/ssa/profile2.sig000066400000000000000000000006541416264345000202000ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature PROFILE2_STRUCTS = sig include SHRINK2 end signature PROFILE2 = sig include PROFILE2_STRUCTS val addProfile: Program.t -> Program.t val dropProfile: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/redundant-tests.fun000066400000000000000000000475041416264345000216150ustar00rootroot00000000000000(* Copyright (C) 2009,2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RedundantTests (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S structure Rel = struct datatype t = EQ | LT of {signed: bool} | LE of {signed: bool} | NE val equals: t * t -> bool = op = val toString = fn EQ => "=" | LT _ => "<" | LE _ => "<=" | NE => "<>" val layout = Layout.str o toString end structure Oper = struct datatype t = Const of Const.t | Var of Var.t val layout = fn Const c => Const.layout c | Var x => Var.layout x val equals = fn (Const c, Const c') => Const.equals (c, c') | (Var x, Var x') => Var.equals (x, x') | _ => false end structure Fact = struct datatype t = T of {rel: Rel.t, lhs: Oper.t, rhs: Oper.t} fun layout (T {rel, lhs, rhs}) = let open Layout in seq [Oper.layout lhs, str " ", Rel.layout rel, str " ", Oper.layout rhs] end fun equals (T {rel, lhs = l, rhs = r}, T {rel = rel', lhs = l', rhs = r'}) = Rel.equals (rel, rel') andalso Oper.equals (l, l') andalso Oper.equals (r, r') fun negate (T {rel, lhs, rhs}): t = let datatype z = datatype Rel.t val rel = case rel of EQ => NE | LT s => LE s | LE s => LT s | NE => EQ in T {rel = rel, lhs = rhs, rhs = lhs} end datatype result = False | True | Unknown fun determine (facts: t list, f: t): result = if List.contains (facts, f, equals) then True else if List.contains (facts, negate f, equals) then False else Unknown end open Exp Transfer fun transform (Program.T {globals, datatypes, functions, main}) = let datatype varInfo = Const of Const.t | Fact of Fact.t | None | Or of Fact.t * Fact.t val {get = varInfo: Var.t -> varInfo, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst None) val setVarInfo = Trace.trace ("RedundantTests.setVarInfo", Var.layout o #1, Unit.layout) setVarInfo datatype z = datatype Fact.result datatype z = datatype Rel.t fun makeVarInfo {args, prim, targs = _}: varInfo = let fun arg i = let val x = Vector.sub (args, i) in case varInfo x of Const c => Oper.Const c | _ => Oper.Var x end fun z (r, a, b) = Fact (Fact.T {rel = r, lhs = arg a, rhs = arg b}) fun doit rel = z (rel, 0, 1) in case prim of Prim.MLton_eq => doit EQ | Prim.Word_equal _ => doit EQ | Prim.Word_lt (_, sg) => doit (LT sg) | _ => None end fun setConst (x, c) = setVarInfo (x, Const c) val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => case exp of Exp.Const c => Option.app (var, fn x => setConst (x, c)) | _ => ()) local fun make c = let val x = Var.newNoname () in (x, Statement.T {var = SOME x, ty = Type.bool, exp = ConApp {con = c, args = Vector.new0 ()}}) end in val (trueVar, trueStmt) = make Con.truee val (falseVar, falseStmt) = make Con.falsee end val globals = Vector.concat [Vector.new2 (trueStmt, falseStmt), globals] val shrink = shrinkFunction {globals = globals} val numSimplified = ref 0 fun simplifyFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Control.diagnostic (fn () => let open Layout in seq [str "processing ", Func.layout name] end) val {get = labelInfo: Label.t -> {ancestor: Label.t option ref, facts: Fact.t list ref, inDeg: int ref}, ...} = Property.get (Label.plist, Property.initFun (fn _ => {ancestor = ref NONE, facts = ref [], inDeg = ref 0})) (* Set up inDeg. *) fun inc l = Int.inc (#inDeg (labelInfo l)) val () = inc start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, inc)) (* Perform analysis, set up facts, and set up ancestor. *) fun loop (Tree.T (Block.T {label, statements, transfer, ...}, children), ancestor') = let val _ = Vector.foreach (statements, fn Statement.T {var, exp, ...} => case exp of Exp.Const c => Option.app (var, fn x => setConst (x, c)) | Exp.PrimApp pa => Option.app (var, fn x => setVarInfo (x, makeVarInfo pa)) | _ => ()) val _ = case transfer of Case {test, cases, default, ...} => let fun add (l, f) = let val {facts, inDeg, ...} = labelInfo l in if !inDeg = 1 then List.push (facts, f) else () end fun falseTrue () = case cases of Cases.Con v => let fun ca i = Vector.sub (v, i) in case (Vector.length v, default) of (1, SOME l') => let val (c, l) = ca 0 in if Con.equals (c, Con.truee) then (l', l) else (l, l') end | (2, _) => let val (c, l) = ca 0 val (_, l') = ca 1 in if Con.equals (c, Con.truee) then (l', l) else (l, l') end | _ => Error.bug "RedundantTests.simplifyFunction: expected two branches" end | _ => Error.bug "RedundantTests.simplifyFunction: expected con" in case varInfo test of Fact f => let val (l, l') = falseTrue () in add (l, Fact.negate f) ; add (l', f) end | Or (f, f') => let val (l, _) = falseTrue () in add (l, Fact.negate f) ; add (l, Fact.negate f') end | _ => () end | _ => () val {ancestor, facts, ...} = labelInfo label val _ = ancestor := ancestor' val ancestor' = if List.isEmpty (!facts) then ancestor' else SOME label in Vector.foreach (children, fn tree => loop (tree, ancestor')) end val _ = loop (Function.dominatorTree f, NONE) (* Diagnostic. *) val _ = Control.diagnostics (fn display => Vector.foreach (blocks, fn Block.T {label, ...} => let open Layout in display (seq [Label.layout label, str " ", List.layout Fact.layout (! (#facts (labelInfo label)))]) end)) (* Transformation. *) fun isFact (l: Label.t, p: Fact.t -> bool): bool = let fun loop (l: Label.t) = let val {ancestor, facts, ...} = labelInfo l in List.exists (!facts, p) orelse (case !ancestor of NONE => false | SOME l => loop l) end in loop l end fun determine (l: Label.t, f: Fact.t) = let fun loop {ancestor, facts, ...} = case Fact.determine (!facts, f) of Unknown => (case !ancestor of NONE => Unknown | SOME l => loop (labelInfo l)) | r => r in loop (labelInfo l) end val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let fun add1Eligible (x: Var.t, s: WordSize.t, sg) = isFact (label, fn Fact.T {lhs, rel, rhs} => case (lhs, rel, rhs) of (Oper.Var x', Rel.LT sg', _) => Var.equals (x, x') andalso sg = sg' | (Oper.Var x', Rel.LE sg', Oper.Const c) => Var.equals (x, x') andalso sg = sg' andalso (case c of Const.Word w => WordX.lt (w, WordX.max (s, sg), sg) | _ => Error.bug "RedundantTests.add1: strange fact") | _ => false) fun sub1Eligible (x: Var.t, s: WordSize.t, sg) = isFact (label, fn Fact.T {lhs, rel, rhs} => case (lhs, rel, rhs) of (_, Rel.LT sg', Oper.Var x') => Var.equals (x, x') andalso sg = sg' | (Oper.Const c, Rel.LE sg', Oper.Var x') => Var.equals (x, x') andalso sg = sg' andalso (case c of Const.Word w => WordX.gt (w, WordX.min (s, sg), sg) | _ => Error.bug "RedundantTests.sub1: strange fact") | _ => false) val statements = Vector.map (statements, fn statement as Statement.T {ty, var, exp, ...} => let fun doit x = (Int.inc numSimplified ; Control.diagnostic (fn () => let open Layout in seq [Option.layout Var.layout var, str " -> ", Var.layout x] end) ; Statement.T {var = var, ty = ty, exp = Var x}) fun falsee () = doit falseVar fun truee () = doit trueVar fun checkPrimApp (args, prim) = let fun add1 (x: Var.t, s: WordSize.t, sg) = if add1Eligible (x, s, sg) then falsee () else statement fun sub1 (x: Var.t, s: WordSize.t, sg) = if sub1Eligible (x, s, sg) then falsee () else statement fun add (c: Const.t, x: Var.t, (s, sg as {signed})) = case c of Const.Word i => if WordX.isOne i then add1 (x, s, sg) else if signed andalso WordX.isNegOne i then sub1 (x, s, sg) else statement | _ => Error.bug ("RedundantTests.add: strange const") in case prim of Prim.Word_addCheckP s => let val x1 = Vector.sub (args, 0) val x2 = Vector.sub (args, 1) in case varInfo x1 of Const c => add (c, x2, s) | _ => (case varInfo x2 of Const c => add (c, x1, s) | _ => statement) end | Prim.Word_subCheckP (s, sg as {signed}) => let val x1 = Vector.sub (args, 0) val x2 = Vector.sub (args, 1) in case varInfo x2 of Const c => (case c of Const.Word i => if WordX.isOne i then sub1 (x1, s, sg) else if signed andalso WordX.isNegOne i then add1 (x1, s, sg) else statement | _ => Error.bug ("RedundantTests.sub: strange const")) | _ => statement end | _ => statement end in case var of NONE => statement | SOME var => (case varInfo var of Or (f, f') => (case determine (label, f) of False => (case determine (label, f') of False => falsee () | True => truee () | Unknown => statement) | True => truee () | Unknown => statement) | Fact f => (case determine (label, f) of False => falsee () | True => truee () | Unknown => statement) | _ => (case exp of Exp.PrimApp {args, prim, ...} => checkPrimApp (args, prim) | _ => statement)) end) in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val _ = Control.diagnostic (fn () => let open Layout in seq [str "numSimplified = ", Int.layout (!numSimplified)] end) val functions = List.revMap (functions, simplifyFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/redundant.fun000066400000000000000000000474271416264345000204610ustar00rootroot00000000000000(* Copyright (C) 2009,2012,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Redundant (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t structure Element: sig structure Class: sig type t val plist: t -> PropertyList.t end type t val class: t -> Class.t val fixedPoint: unit -> unit val forceDistinct: t vector -> unit val new: 'a vector * ('a -> PropertyList.t) -> t vector val new1: unit -> t val refine: {coarse: t, fine: t} vector -> unit end = struct datatype t = T of {class: class ref} and class = Class of {plist: PropertyList.t} withtype refinement = {coarse: t, fine: t} vector structure Element = struct datatype t = datatype t end structure Class = struct datatype t = datatype class local fun make f (Class r) = f r in val plist = make #plist end fun new () = Class {plist = PropertyList.new ()} end local fun make f (T r) = f r in val class = ! o make #class end fun setClass (T {class, ...}, c) = class := c fun 'a new (elements: 'a vector, plist: 'a -> PropertyList.t): t vector = let val {destroy, get = class: 'a -> Class.t, ...} = Property.destGet (plist, Property.initFun (fn _ => Class.new ())) val elements = Vector.map (elements, fn elt => T {class = ref (class elt)}) val () = destroy () in elements end fun new1 () = let val elt = T {class = ref (Class.new ())} in elt end fun forceDistinct (es: t vector): unit = Vector.foreach (es, fn e => setClass (e, Class.new ())) structure Refinement = struct type t = refinement fun group (v: t, sel): t list = let val classes = ref [] val {destroy, get: Class.t -> {coarse: Element.t, fine: Element.t} list ref, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => let val r = ref [] val () = List.push (classes, r) in r end)) val () = Vector.foreach (v, fn cf => List.push (get (class (sel cf)), cf)) val () = destroy () in List.fold (!classes, [], fn (r, ac) => Vector.fromList (!r) :: ac) end end fun refine (v: Refinement.t): {change: bool, keep: bool} = let val fineGroups = Refinement.group (v, #fine) in if Vector.length v = List.length fineGroups then {change = false, keep = false} else let val change = ref false val numClasses = List.fold (fineGroups, 0, fn (v, n) => case Refinement.group (v, #coarse) of [] => n | [_] => n + 1 | classes => let val () = change := true val n = List.fold (classes, n, fn (v, n) => let val elements = Vector.map (v, #fine) val c = Class.new () val () = Vector.foreach (elements, fn e => setClass (e, c)) in n + 1 end) in n end) in {change = !change, keep = Vector.length v <> numClasses} end end fun fixedPoint rs = let fun loop rs = let val _ = Control.diagnostics (fn display => let open Layout val () = display (seq [str "List.length rs = ", Int.layout (List.length rs)]) in () end) val (rs, change) = List.fold (rs, ([], false), fn (r, (rs, change)) => let val {keep = keep', change = change'} = refine r in (if keep' then r :: rs else rs, change orelse change') end) in if change then loop rs else () end val () = loop rs in () end val todo: Refinement.t list ref = ref [] val refine = fn r => if Vector.length r > 1 then List.push (todo, r) else () val fixedPoint = fn () => fixedPoint (!todo before todo := []) end structure Class = Element.Class structure Eqrel:> sig type t val classes: t -> int list list val element: t * int -> Element.t val elements: t -> Element.t vector val forceDistinct: t -> unit val fromTypes: Type.t vector -> t val layout: t -> Layout.t val make: Element.t vector -> t val refine: {coarse: t, fine: t} -> unit val unify: t * t -> unit end = struct datatype t = T of Element.t vector val make = T fun elements (T v) = v fun element (r, i) = Vector.sub (elements r, i) fun forceDistinct (T v) = Element.forceDistinct v fun fromTypes ts = T (Element.new (ts, Type.plist)) fun refine {coarse = T cv, fine = T fv} = Element.refine (Vector.map2 (cv, fv, fn (c, f) => {coarse = c, fine = f})) fun unify (r, r') = (refine {coarse = r, fine = r'} ; refine {coarse = r', fine = r}) fun classes (T v) = let val classes = ref [] val {get = classIndices: Class.t -> int list ref, destroy, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => let val r = ref [] val () = List.push (classes, r) in r end)) val () = Vector.foreachi (v, fn (i, e) => List.push (classIndices (Element.class e), i)) val () = destroy () in List.fold (!classes, [], fn (r, ac) => !r :: ac) end val layout = (List.layout (List.layout Int.layout)) o classes end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {arg: Eqrel.t, return: Eqrel.t option}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Redundant.info", Func.layout)) val {get = labelInfo: Label.t -> Eqrel.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Redundant.info", Label.layout)) val {get = varInfo : Var.t -> Element.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => Element.new1 ())) fun varEquiv xs = Eqrel.make (Vector.map (xs, varInfo)) (* compute the fixed point *) val () = let fun makeFormalsRel (xs: (Var.t * Type.t) vector): Eqrel.t = let val eqrel = Eqrel.fromTypes (Vector.map (xs, #2)) val () = Vector.foreachi (xs, fn (i, (x, _)) => setVarInfo (x, Eqrel.element (eqrel, i))) in eqrel end (* initialize all funcInfo and labelInfo *) val () = List.foreach (functions, fn f => let val {name, args, returns, blocks, ...} = Function.dest f val _ = setFuncInfo (name, {arg = makeFormalsRel args, return = Option.map (returns, Eqrel.fromTypes)}) val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelInfo (label, makeFormalsRel args)) in () end) (* Add the calls to all the funcInfos and labelInfos *) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {return, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, args, return = ret, ...} => let val {arg = arg', return = return'} = funcInfo func val _ = Eqrel.refine {coarse = varEquiv args, fine = arg'} in case ret of Return.Dead => () | Return.NonTail {cont, ...} => Option.app (return', fn e => Eqrel.unify (e, labelInfo cont)) | Return.Tail => (case (return, return') of (SOME e, SOME e') => Eqrel.unify (e, e') | _ => ()) end | Case {cases = Cases.Con cases, ...} => (* For now, assume that constructor arguments * are never redundant. Thus all case branches * need to have trivial equivalence relations. *) Vector.foreach (cases, fn (_, l) => Eqrel.forceDistinct (labelInfo l)) | Goto {dst, args, ...} => Eqrel.refine {coarse = varEquiv args, fine = labelInfo dst} | Return xs => Eqrel.refine {coarse = varEquiv xs, fine = valOf return} | _ => ()) end) val _ = Element.fixedPoint () in () end val _ = Control.diagnostics (fn display => List.foreach (functions, fn f => let open Layout val {name, blocks, ...} = Function.dest f val {arg, return} = funcInfo name val () = display (seq [Func.layout name, str " ", Eqrel.layout arg, str " : ", Option.layout Eqrel.layout return]) val () = Vector.foreach (blocks, fn Block.T {label, ...} => let val arg = labelInfo label in display (seq [str "\t", Label.layout label, str " ", Eqrel.layout arg]) end) in () end)) val {get = replacement : Var.t -> Var.t option, set = setReplacement, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) datatype red = Useful | Redundant of int (* the index it is the same as *) (* Turn an equivalence relation on 0 ... n - 1 into a red vector by * choosing a representative of each class. *) fun makeReds (r: Eqrel.t): red vector = let val {get = rep: Class.t -> int option ref, destroy, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => ref NONE)) val reds = Vector.mapi (Eqrel.elements r, fn (i, e) => let val r = rep (Element.class e) in case !r of NONE => (r := SOME i; Useful) | SOME i => Redundant i end) val () = destroy () in reds end fun redundantFormals (xs: (Var.t * Type.t) vector, r: Eqrel.t) : red vector * (Var.t * Type.t) vector = let val reds = makeReds r val xs = Vector.keepAllMap2 (xs, reds, fn (x, red) => case red of Useful => SOME x | Redundant i => (setReplacement (#1 x, SOME (#1 (Vector.sub (xs, i)))) ; NONE)) in (reds, xs) end fun keepUseful (reds: red vector, xs: 'a vector): 'a vector = Vector.keepAllMap2 (reds, xs, fn (r, x) => case r of Useful => SOME x | _ => NONE) val {get = funcReds : Func.t -> {argsRed: red vector, args: (Var.t * Type.t) vector, returnsRed: red vector option, returns: Type.t vector option}, set = setFuncReds, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcReds", Func.layout)) val {get = labelReds: Label.t -> {argsRed: red vector, args: (Var.t * Type.t) vector}, set = setLabelReds, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelReds", Label.layout)) val _ = List.foreach (functions, fn f => let val {name, args, blocks, returns, ...} = Function.dest f val {arg, return} = funcInfo name val (returnsRed, returns) = (case (returns, return) of (SOME r, SOME r') => let val returnsRed = makeReds r' val returns = keepUseful (returnsRed, r) in (SOME returnsRed, SOME returns) end | _ => (NONE, NONE)) val (argsRed, args) = redundantFormals (args, arg) in setFuncReds (name, {args = args, argsRed = argsRed, returns = returns, returnsRed = returnsRed}) ; Vector.foreach (blocks, fn Block.T {label, args, ...} => let val (argsRed, args) = redundantFormals (args, labelInfo label) in setLabelReds (label, {args = args, argsRed = argsRed}) end) end) fun loopVar x = case replacement x of NONE => x | SOME y => y fun loopVars xs = Vector.map (xs, loopVar) val functions = List.revMap (functions, fn f => let val {blocks, mayInline, name, raises, start, ...} = Function.dest f val {args, returns, returnsRed, ...} = funcReds name val blocks = Vector.map (blocks, fn Block.T {label, statements, transfer, ...} => let val {args, ...} = labelReds label val statements = Vector.map (statements, fn Statement.T {var, ty, exp} => Statement.T {var = var, ty = ty, exp = Exp.replaceVar (exp, loopVar)}) val transfer = case transfer of Bug => Bug | Call {func, args, return} => Call {func = func, args = loopVars (keepUseful (#argsRed (funcReds func), args)), return = return} | Case {test, cases, default} => Case {test = loopVar test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = loopVars (keepUseful (#argsRed (labelReds dst), args))} | Raise xs => Raise (loopVars xs) | Return xs => Return (loopVars (keepUseful (valOf returnsRed, xs))) | Runtime {prim, args, return} => Runtime {prim = prim, args = loopVars args, return = return} in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Function.clear f in f end) val p = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop p in p end end mlton-20210117+dfsg/mlton/ssa/ref-flatten.fun000066400000000000000000001330171416264345000206730ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RefFlatten (S: SSA2_TRANSFORM_STRUCTS): SSA2_TRANSFORM = struct open S structure Graph = DirectedGraph structure Node = Graph.Node datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Finish = struct datatype t = T of {flat: Type.t Prod.t option, ty: Type.t} val _: t -> Layout.t = fn T {flat, ty} => let open Layout in record [("flat", Option.layout (fn p => Prod.layout (p, Type.layout)) flat), ("ty", Type.layout ty)] end end structure Value = struct datatype t = GroundV of Type.t | Complex of computed Equatable.t and computed = ObjectC of object | WeakC of {arg: t, finalType: Type.t option ref, originalType: Type.t} and object = Obj of {args: t Prod.t, con: ObjectCon.t, finalComponents: Type.t Prod.t option ref, finalOffsets: int vector option ref, finalType: Type.t option ref, flat: flat ref, originalType: Type.t} and flat = NotFlat | Offset of {object: object, offset: int} | Unknown fun delay (f: unit -> computed): t = Complex (Equatable.delay f) datatype value = Ground of Type.t | Object of object | Weak of {arg: t, finalType: Type.t option ref, originalType: Type.t} val value: t -> value = fn GroundV t => Ground t | Complex e => case Equatable.value e of ObjectC obj => Object obj | WeakC w => Weak w local open Layout in fun layout v: Layout.t = case v of GroundV t => Type.layout t | Complex e => Equatable.layout (e, fn ObjectC ob => layoutObject ob | WeakC {arg, ...} => seq [str "Weak ", layout arg]) and layoutFlat (f: flat): Layout.t = case f of NotFlat => str "NotFlat" | Offset {offset, ...} => seq [str "Offset ", record [("offset", Int.layout offset)]] | Unknown => str "Unknown" and layoutObject (Obj {args, con, flat, ...}) = seq [str "Object ", record [("args", Prod.layout (args, layout)), ("con", ObjectCon.layout con), ("flat", layoutFlat (! flat))]] end fun originalType (v: t) = case value v of Ground t => t | Object (Obj {originalType = t, ...}) => t | Weak {originalType = t, ...} => t end structure Flat = struct datatype t = datatype Value.flat end structure Object = struct datatype t = datatype Value.object val layout = Value.layoutObject fun equals (Obj {flat = f, ...}, Obj {flat = f', ...}) = f = f' val select: t * int -> Value.t = fn (Obj {args, ...}, offset) => Prod.elt (args, offset) end datatype z = datatype Object.t structure Value = struct open Value val ground = GroundV val deObject: t -> Object.t option = fn v => case value v of Object ob => SOME ob | _ => NONE fun deFlat {inner: t, outer: Object.t}: Object.t option = case value inner of Object (z as Obj {flat, ...}) => (case ! flat of Flat.Offset {object, ...} => if Object.equals (object, outer) then SOME z else NONE | _ => NONE) | _ => NONE fun dontFlatten (v: t): unit = case value v of Object (Obj {flat, ...}) => flat := NotFlat | _ => () fun isUnit v = case v of GroundV t => Type.isUnit t | _ => false fun objectC {args: t Prod.t, con: ObjectCon.t, originalType} : computed = let (* Only may flatten objects with mutable fields, and where the field * isn't unit. Flattening a unit field could lead to a problem * because the containing object might be otherwise immutable, and * hence the unit ref would lose its identity. We can fix this * once objects have a notion of identity independent of mutability. *) val flat = ref (if Vector.exists (Prod.dest args, fn {elt, isMutable} => isMutable andalso not (isUnit elt)) andalso not (ObjectCon.isSequence con) then Unknown else NotFlat) in ObjectC (Obj {args = args, con = con, finalComponents = ref NONE, finalOffsets = ref NONE, finalType = ref NONE, flat = flat, originalType = originalType}) end val computed: computed -> t = fn c => Complex (Equatable.new c) fun weakC (a: t): computed = WeakC {arg = a, finalType = ref NONE, originalType = Type.weak (originalType a)} val weak = computed o weakC fun tuple (args: t Prod.t, originalType: Type.t): t = computed (objectC {args = args, con = ObjectCon.Tuple, originalType = originalType}) val tuple = Trace.trace ("RefFlatten.Value.tuple", fn (p, _) => Prod.layout (p, layout), layout) tuple val rec unify: t * t -> unit = fn z => case z of (GroundV t, GroundV t') => if Type.equals (t, t') then () else Error.bug "RefFlatten.Value.unify: unequal Grounds" | (Complex e, Complex e') => Equatable.equate (e, e', fn (c, c') => case (c, c') of (ObjectC (Obj {args = a, flat = f, ...}), ObjectC (Obj {args = a', flat = f', ...})) => let val () = unifyProd (a, a') val () = case (!f, !f') of (_, NotFlat) => f := NotFlat | (NotFlat, _) => f' := NotFlat | (Offset _, _) => Error.bug "RefFlatten.Value.unify: Offset" | (_, Offset _) => Error.bug "RefFlatten.Value.unify: Offset" | _ => () in c end | (WeakC {arg = a, ...}, WeakC {arg = a', ...}) => (unify (a, a'); c) | _ => Error.bug "RefFlatten.Value.unify: strange Complex") | _ => Error.bug "RefFlatten.Value.unify: Complex with Ground" and unifyProd = fn (p, p') => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => unify (e, e')) fun coerce {from, to} = unify (from, to) val coerce = Trace.trace ("RefFlatten.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) coerce end structure Size = TwoPointLattice (val bottom = "small" val top = "large") structure VarInfo = struct datatype useStatus = InTuple of {object: Object.t, objectVar: Var.t, offset: int} | Unused datatype t = Flattenable of {components: Var.t vector, defBlock: Label.t, useStatus: useStatus ref} | Unflattenable fun layout (i: t): Layout.t = let open Layout in case i of Flattenable {components, defBlock, useStatus} => seq [str "Flattenable ", record [("components", Vector.layout Var.layout components), ("defBlock", Label.layout defBlock), ("useStatus", (case !useStatus of InTuple {object, objectVar, offset} => seq [str "InTuple ", record [("object", Object.layout object), ("objectVar", Var.layout objectVar), ("offset", Int.layout offset)]] | Unused => str "Unused"))]] | Unflattenable => str "Unflattenable" end end fun transform2 (program as Program.T {datatypes, functions, globals, main}) = let val {get = conValue: Con.t -> Value.t option ref, ...} = Property.get (Con.plist, Property.initFun (fn _ => ref NONE)) val conValue = Trace.trace ("RefFlatten.conValue", Con.layout, Ref.layout (Option.layout Value.layout)) conValue datatype 'a make = Const of 'a | Make of unit -> 'a fun needToMakeProd p = Vector.exists (Prod.dest p, fn {elt, ...} => case elt of Const _ => false | Make _ => true) fun makeProd p = Prod.map (p, fn m => case m of Const v => v | Make f => f ()) val {get = makeTypeValue: Type.t -> Value.t make, ...} = Property.get (Type.plist, Property.initRec (fn (t, makeTypeValue) => let fun const () = Const (Value.ground t) datatype z = datatype Type.dest in case Type.dest t of Object {args, con} => let fun doit () = let val args = Prod.map (args, makeTypeValue) val mayFlatten = Vector.exists (Prod.dest args, #isMutable) andalso not (ObjectCon.isSequence con) in if mayFlatten orelse needToMakeProd args then Make (fn () => Value.delay (fn () => Value.objectC {args = makeProd args, con = con, originalType = t})) else const () end datatype z = datatype ObjectCon.t in case con of Con c => Const (Ref.memoize (conValue c, fn () => case doit () of Const v => v | Make f => let val v = f () (* Constructors can never be * flattened into other objects. *) val () = Value.dontFlatten v in v end)) | Sequence => doit () | Tuple => doit () end | Weak t => (case makeTypeValue t of Const _ => const () | Make f => Make (fn () => Value.delay (fn () => Value.weakC (f ())))) | _ => const () end)) fun typeValue (t: Type.t): Value.t = case makeTypeValue t of Const v => v | Make f => f () val typeValue = Trace.trace ("RefFlatten.typeValue", Type.layout, Value.layout) typeValue val coerce = Value.coerce fun inject {sum, variant = _} = typeValue (Type.datatypee sum) fun object {args, con, resultType} = let val m = makeTypeValue resultType in case con of NONE => (case m of Const v => v | Make _ => Value.tuple (args, resultType)) | SOME _ => (case m of Const v => let val () = case Value.deObject v of NONE => () | SOME (Obj {args = args', ...}) => Vector.foreach2 (Prod.dest args, Prod.dest args', fn ({elt = a, ...}, {elt = a', ...}) => coerce {from = a, to = a'}) in v end | _ => Error.bug "RefFlatten.object: strange con value") end val object = Trace.trace ("RefFlatten.object", fn {args, con, ...} => Layout.record [("args", Prod.layout (args, Value.layout)), ("con", Option.layout Con.layout con)], Value.layout) object val deWeak: Value.t -> Value.t = fn v => case Value.value v of Value.Ground t => typeValue (case Type.dest t of Type.Weak t => t | _ => Error.bug "RefFlatten.deWeak") | Value.Weak {arg, ...} => arg | _ => Error.bug "RefFlatten.deWeak" fun primApp {args, prim, resultVar = _, resultType} = let fun weak v = case makeTypeValue resultType of Const v => v | Make _ => Value.weak v fun arg i = Vector.sub (args, i) fun result () = typeValue resultType fun dontFlatten () = (Vector.foreach (args, Value.dontFlatten) ; result ()) fun equal () = (Value.unify (arg 0, arg 1) ; result ()) in case prim of Prim.Array_toArray => let val res = result () datatype z = datatype Value.value val () = case (Value.value (arg 0), Value.value res) of (Ground _, Ground _) => () | (Object (Obj {args = a, ...}), Object (Obj {args = a', ...})) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "RefFlatten.primApp: Array_toArray" in res end | Prim.Array_toVector => let val res = result () datatype z = datatype Value.value val () = case (Value.value (arg 0), Value.value res) of (Ground _, Ground _) => () | (Object (Obj {args = a, ...}), Object (Obj {args = a', ...})) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "RefFlatten.primApp: Array_toVector" in res end | Prim.CFunction _ => (* Some imports, like Real64.modf, take ref cells that can not * be flattened. *) dontFlatten () | Prim.MLton_eq => equal () | Prim.MLton_equal => equal () | Prim.MLton_size => dontFlatten () | Prim.MLton_share => dontFlatten () | Prim.Weak_get => deWeak (arg 0) | Prim.Weak_new => let val a = arg 0 in (Value.dontFlatten a; weak a) end | _ => result () end fun base b = case b of Base.Object obj => obj | Base.SequenceSub {sequence, ...} => sequence fun select {base, offset} = let datatype z = datatype Value.value in case Value.value base of Ground t => (case Type.dest t of Type.Object {args, ...} => typeValue (Prod.elt (args, offset)) | _ => Error.bug "RefFlatten.select: Ground") | Object ob => Object.select (ob, offset) | _ => Error.bug "RefFlatten.select" end fun update {base, offset, value} = (coerce {from = value, to = select {base = base, offset = offset}} (* Don't flatten the component of the update, * else sharing will be broken. *) ; Value.dontFlatten value) fun const c = typeValue (Type.ofConst c) fun sequence {args, resultType} = let val v = typeValue resultType val _ = Vector.foreach (args, fn args => Vector.foreachi (Prod.dest args, fn (offset, {elt, ...}) => update {base = v, offset = offset, value = elt})) in v end val {func, value = varValue, ...} = analyze {base = base, coerce = coerce, const = const, filter = fn _ => (), filterWord = fn _ => (), fromType = typeValue, inject = inject, layout = Value.layout, object = object, primApp = primApp, program = program, select = fn {base, offset, ...} => select {base = base, offset = offset}, sequence = sequence, update = update, useFromTypeOnBinds = false} val varObject = Value.deObject o varValue (* Mark a variable as Flattenable if all its uses are contained in a single * basic block, there is a single use in an object construction, and * all other uses follow the object construction. * * ... * r: (t ref) = (t) * ... ... * x: (... * (t ref) * ...) = (..., r, ...) * ... ... * *) datatype z = datatype VarInfo.t datatype z = datatype VarInfo.useStatus val {get = varInfo: Var.t -> VarInfo.t ref, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref VarInfo.Unflattenable)) val varInfo = Trace.trace ("RefFlatten.varInfo", Var.layout, Ref.layout VarInfo.layout) varInfo fun use x = varInfo x := Unflattenable val use = Trace.trace ("RefFlatten.use", Var.layout, Unit.layout) use fun uses xs = Vector.foreach (xs, use) fun loopStatement (s: Statement.t, current: Label.t): unit = case s of Bind {exp = Exp.Object {args, ...}, var, ...} => (case var of NONE => uses args | SOME var => case Value.deObject (varValue var) of NONE => uses args | SOME object => let val () = varInfo var := Flattenable {components = args, defBlock = current, useStatus = ref Unused} in Vector.foreachi (args, fn (offset, x) => let val r = varInfo x in case !r of Flattenable {defBlock, useStatus, ...} => (if Label.equals (current, defBlock) andalso (case !useStatus of InTuple _ => false | Unused => true) then (useStatus := (InTuple {object = object, objectVar = var, offset = offset})) else r := Unflattenable) | Unflattenable => () end) end) | Statement.Update {base, value, ...} => (use value ; (case base of Base.Object r => let val i = varInfo r in case ! i of Flattenable {defBlock, useStatus, ...} => if Label.equals (current, defBlock) andalso (case !useStatus of InTuple _ => true | Unused => false) then () else i := Unflattenable | Unflattenable => () end | Base.SequenceSub _ => ())) | _ => Statement.foreachUse (s, use) val loopStatement = Trace.trace2 ("RefFlatten.loopStatement", Statement.layout, Label.layout, Unit.layout) loopStatement fun loopStatements (ss, label) = Vector.foreach (ss, fn s => loopStatement (s, label)) fun loopTransfer t = Transfer.foreachVar (t, use) val globalLabel = Label.newNoname () val () = loopStatements (globals, globalLabel) val () = List.foreach (functions, fn f => Function.dfs (f, fn Block.T {label, statements, transfer, ...} => (loopStatements (statements, label) ; loopTransfer transfer ; fn () => ()))) fun foreachObject (f): unit = let fun loopStatement s = case s of Bind {exp = Exp.Object {args, ...}, var, ...} => Option.app (var, fn var => case Value.value (varValue var) of Value.Ground _ => () | Value.Object obj => f (var, args, obj) | _ => Error.bug "RefFlatten.foreachObject: Object with strange value") | _ => () val () = Vector.foreach (globals, loopStatement) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, ...} => Vector.foreach (statements, loopStatement)) end) in () end (* Try to flatten each ref. *) val () = foreachObject (fn (var, _, Obj {flat, ...}) => let datatype z = datatype Flat.t fun notFlat () = flat := NotFlat val () = case ! (varInfo var) of Flattenable {useStatus, ...} => (case !useStatus of InTuple {object = obj', offset = i', ...} => (case ! flat of NotFlat => () | Offset {object = obj'', offset = i''} => if i' = i'' andalso Object.equals (obj', obj'') then () else notFlat () | Unknown => flat := Offset {object = obj', offset = i'}) | Unused => notFlat ()) | Unflattenable => notFlat () in () end) val () = foreachObject (fn (_, args, obj) => let datatype z = datatype Flat.t (* Check that all arguments that are represented by flattening them * into the object are available as an explicit allocation. *) val () = Vector.foreach (args, fn a => case Value.deFlat {inner = varValue a, outer = obj} of NONE => () | SOME (Obj {flat, ...}) => case ! (varInfo a) of Flattenable _ => () | Unflattenable => flat := NotFlat) in () end) (* * The following code disables flattening of some refs to ensure * space safety. Flattening a ref into an object that has * another component that contains a value of unbounded size (a * large object) could keep the large object alive beyond where * it should be. So, we first use a simple fixed point to * figure out which types have values of unbounded size. Then, * for each reference to a mutable object, if we are trying to * flatten it into an object that has another component with a * large value and the container is not live in this block (we * approximate liveness), then don't allow the flattening to * happen. * * Sequences may be objects of unbounded size. * Weak pointers may not be objects of unbounded size; weak * pointers do not keep pointed-to object live. * Instances of recursive datatypes may be objects of unbounded * size. *) val {get = tyconSize: Tycon.t -> Size.t, ...} = Property.get (Tycon.plist, Property.initFun (fn _ => Size.new ())) (* Force (mutually) recursive datatypes to top. *) val {get = nodeTycon: unit Node.t -> Tycon.t, set = setNodeTycon, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeTycon", Node.layout)) val {get = tyconNode: Tycon.t -> unit Node.t, set = setTyconNode, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconNode", Tycon.layout)) val graph = Graph.new () val () = Vector.foreach (datatypes, fn Datatype.T {tycon, ...} => let val node = Graph.newNode graph val () = setTyconNode (tycon, node) val () = setNodeTycon (node, tycon) in () end) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val n = tyconNode tycon datatype z = datatype Type.dest val {get = dependsOn, destroy = destroyDependsOn} = Property.destGet (Type.plist, Property.initRec (fn (t, dependsOn) => case Type.dest t of Datatype tc => (ignore o Graph.addEdge) (graph, {from = n, to = tyconNode tc}) | Object {args, ...} => Prod.foreach (args, dependsOn) | _ => ())) val () = Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, dependsOn)) val () = destroyDependsOn () in () end) val () = List.foreach (Graph.stronglyConnectedComponents graph, fn ns => let fun doit () = List.foreach (ns, fn n => Size.makeTop (tyconSize (nodeTycon n))) in case ns of [n] => if Node.hasEdge {from = n, to = n} then doit () else () | _ => doit () end) val {get = typeSize: Type.t -> Size.t, ...} = Property.get (Type.plist, Property.initRec (fn (t, typeSize) => let val s = Size.new () fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) datatype z = datatype Type.dest val () = case Type.dest t of CPointer => () | Datatype tc => Size.<= (tyconSize tc, s) | IntInf => Size.makeTop s | Object {args, con, ...} => if ObjectCon.isSequence con then Size.makeTop s else Prod.foreach (args, dependsOn) | Real _ => () | Thread => Size.makeTop s | Weak _ => () | Word _ => () in s end)) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val s = tyconSize tycon fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) val () = Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, dependsOn)) in () end) fun typeIsLarge (t: Type.t): bool = Size.isTop (typeSize t) fun objectHasAnotherLarge (Object.Obj {args, ...}, {offset: int}) = Vector.existsi (Prod.dest args, fn (i, {elt, ...}) => i <> offset andalso typeIsLarge (Value.originalType elt)) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => let fun containerIsLive (x: Var.t) = Vector.exists (statements, fn s => case s of Bind {exp, var = SOME x', ...} => Var.equals (x, x') andalso (case exp of Exp.Select _ => true | _ => false) | _ => false) fun use (x: Var.t) = case Value.value (varValue x) of Value.Object (Obj {flat, ...}) => (case !flat of Flat.Offset {object, offset} => if objectHasAnotherLarge (object, {offset = offset}) andalso not (containerIsLive x) then flat := Flat.NotFlat else () | _ => ()) | _ => () val () = Vector.foreach (statements, fn s => Statement.foreachUse (s, use)) val () = Transfer.foreachVar (transfer, use) in () end) end) (* Mark varInfo as Unflattenable if varValue is. This done after all the * other parts of the analysis so that varInfo is consistent with the * varValue. *) val () = Program.foreachVar (program, fn (x, _) => let val r = varInfo x in case !r of Flattenable _ => (case Value.deObject (varValue x) of NONE => () | SOME (Obj {flat, ...}) => (case !flat of Flat.NotFlat => r := Unflattenable | _ => ())) | Unflattenable => () end) val () = Control.diagnostics (fn display => let open Layout val () = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, ...} => display (Option.layout Value.layout (! (conValue con))))) val () = Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", record [("value", Value.layout (varValue x)), ("varInfo", VarInfo.layout (! (varInfo x)))]])) in () end) (* Conversion from values to types. *) datatype z = datatype Finish.t val traceValueType = Trace.trace ("RefFlatten.valueType", Value.layout, Type.layout) fun valueType arg: Type.t = traceValueType (fn (v: Value.t) => let datatype z = datatype Value.value in case Value.value v of Ground t => t | Object z => objectType z | Weak {arg, finalType, ...} => Ref.memoize (finalType, fn () => Type.weak (valueType arg)) end) arg and objectFinalComponents (obj as Obj {args, finalComponents, ...}) = Ref.memoize (finalComponents, fn () => Prod.make (Vector.fromList (Vector.foldr (Prod.dest args, [], fn ({elt, isMutable = i}, ac) => case Value.deFlat {inner = elt, outer = obj} of NONE => {elt = valueType elt, isMutable = i} :: ac | SOME z => Vector.foldr (Prod.dest (objectFinalComponents z), ac, fn ({elt, isMutable = i'}, ac) => {elt = elt, isMutable = i orelse i'} :: ac))))) and objectFinalOffsets (z as Obj {args, finalOffsets, flat, ...}) = Ref.memoize (finalOffsets, fn () => let val initial = case ! flat of Flat.Offset {object, offset} => objectOffset (object, offset) | _ => 0 val (_, offsets) = Vector.fold (Prod.dest args, (initial, []), fn ({elt, ...}, (offset, ac)) => let val width = case Value.deFlat {inner = elt, outer = z} of NONE => 1 | SOME z => Prod.length (objectFinalComponents z) in (offset + width, offset :: ac) end) in Vector.fromListRev offsets end) and objectOffset (z: Object.t, offset: int): int = Vector.sub (objectFinalOffsets z, offset) and objectType (z as Obj {con, finalType, flat, ...}): Type.t = Ref.memoize (finalType, fn () => case ! flat of Flat.Offset {object, ...} => objectType object | _ => Type.object {args = objectFinalComponents z, con = con}) (* Transform the program. *) fun transformFormals (xts: (Var.t * Type.t) vector) : (Var.t * Type.t) vector = Vector.map (xts, fn (x, _) => (x, valueType (varValue x))) val extraSelects: Statement.t list ref = ref [] fun flattenValues (object: Var.t, obj as Obj {args, ...}, ac: Var.t list): Var.t list = Vector.foldri (Prod.dest args, ac, fn (i, {elt, ...}, ac) => case Value.deFlat {inner = elt, outer = obj} of NONE => let val var = Var.newNoname () val () = List.push (extraSelects, Bind {exp = Select {base = Base.Object object, offset = objectOffset (obj, i)}, ty = valueType elt, var = SOME var}) in var :: ac end | SOME obj => flattenValues (object, obj, ac)) fun flattenArgs (xs: Var.t vector, outer: Object.t, ac): Var.t list = Vector.foldr (xs, ac, fn (x, ac) => let val v = varValue x in case Value.deFlat {inner = v, outer = outer} of NONE => x :: ac | SOME obj => (case ! (varInfo x) of Flattenable {components, ...} => flattenArgs (components, obj, ac) | Unflattenable => flattenValues (x, obj, ac)) end) val flattenArgs = Trace.trace3 ("RefFlatten.flattenArgs", Vector.layout Var.layout, Object.layout, List.layout Var.layout, List.layout Var.layout) flattenArgs fun transformBind {exp, ty, var}: Statement.t vector = let fun make e = Vector.new1 (Bind {exp = e, ty = (case var of NONE => ty | SOME var => valueType (varValue var)), var = var}) fun none () = Vector.new0 () in case exp of Exp.Object {args, con} => (case var of NONE => none () | SOME var => (case varObject var of NONE => make exp | SOME (z as Obj {flat, ...}) => case ! flat of Flat.Offset _ => none () | _ => let val args = Vector.fromList (flattenArgs (args, z, [])) val extra = !extraSelects val () = extraSelects := [] in Vector.concat [Vector.fromList extra, make (Exp.Object {args = args, con = con})] end)) | PrimApp {args, prim} => make (PrimApp {args = args, prim = prim}) | Select {base, offset} => (case var of NONE => none () | SOME var => (case base of Base.Object object => (case varObject object of NONE => make exp | SOME obj => make (if isSome (Value.deFlat {inner = varValue var, outer = obj}) then Var object else (Select {base = base, offset = (objectOffset (obj, offset))}))) | Base.SequenceSub _ => make exp)) | _ => make exp end fun transformStatement (s: Statement.t): Statement.t vector = case s of Bind b => transformBind b | Profile _ => Vector.new1 s | Update {base, offset, value} => Vector.new1 (case base of Base.Object object => (case varObject object of NONE => s | SOME obj => let val base = case ! (varInfo object) of Flattenable {useStatus, ...} => (case ! useStatus of InTuple {objectVar, ...} => Base.Object objectVar | _ => base) | Unflattenable => base in Update {base = base, offset = objectOffset (obj, offset), value = value} end) | Base.SequenceSub _ => s) val transformStatement = Trace.trace ("RefFlatten.transformStatement", Statement.layout, Vector.layout Statement.layout) transformStatement fun transformStatements ss = Vector.concatV (Vector.map (ss, transformStatement)) fun transformBlock (Block.T {args, label, statements, transfer}) = Block.T {args = transformFormals args, label = label, statements = transformStatements statements, transfer = transfer} fun valuesTypes vs = Vector.map (vs, valueType) val datatypes = Vector.map (datatypes, fn Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {con, args} => let val args = case ! (conValue con) of NONE => args | SOME v => case Type.dest (valueType v) of Type.Object {args, ...} => args | _ => Error.bug "RefFlatten.datatypes: strange con" in {args = args, con = con} end) in Datatype.T {cons = cons, tycon = tycon} end) fun transformFunction (f: Function.t): Function.t = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val {raises, returns, ...} = func name val raises = Option.map (raises, valuesTypes) val returns = Option.map (returns, valuesTypes) in Function.new {args = transformFormals args, blocks = Vector.map (blocks, transformBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val program = Program.T {datatypes = datatypes, functions = List.revMap (functions, transformFunction), globals = transformStatements globals, main = main} val () = Program.clear program in shrink program end end mlton-20210117+dfsg/mlton/ssa/remove-unused.fun000066400000000000000000001451251416264345000212650ustar00rootroot00000000000000(* Copyright (C) 2009,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RemoveUnused (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Used = struct structure L = TwoPointLattice (val bottom = "unused" val top = "used") open L val use = makeTop val isUsed = isTop val whenUsed = addHandler end structure Coned = struct structure L = TwoPointLattice (val bottom = "not coned" val top = "coned") open L val con = makeTop val isConed = isTop val whenConed = addHandler end structure Deconed = struct structure L = TwoPointLattice (val bottom = "not deconed" val top = "deconed") open L val decon = makeTop val isDeconed = isTop end structure MayReturn = struct structure L = TwoPointLattice (val bottom = "does not return" val top = "may return") open L val return = makeTop val mayReturn = isTop val whenReturns = addHandler end structure MayRaise = struct structure L = TwoPointLattice (val bottom = "does not raise" val top = "may raise") open L val raisee = makeTop val mayRaise = isTop val whenRaises = addHandler end structure VarInfo = struct datatype t = T of {ty: Type.t, used: Used.t} fun layout (T {used, ...}) = Used.layout used local fun make f (T r) = f r in val ty = make #ty val used = make #used end fun new (ty : Type.t): t = T {ty = ty, used = Used.new ()} val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) end structure ConInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, coned: Coned.t, deconed: Deconed.t, dummy: {con: Con.t, args: Type.t vector, exp: Exp.t}} fun layout (T {args, coned, deconed, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("coned", Coned.layout coned), ("deconed", Deconed.layout deconed)] local fun make f (T r) = f r in val args = make #args val coned = make #coned val deconed = make #deconed val dummy = make #dummy end val con = Coned.con o coned val isConed = Coned.isConed o coned fun whenConed (ci, th) = Coned.whenConed (coned ci, th) val decon = Deconed.decon o deconed val isDeconed = Deconed.isDeconed o deconed fun new {args: Type.t vector, dummy: {con: Con.t, args: Type.t vector , exp: Exp.t}}: t = T {args = Vector.map (args, fn ty => (VarInfo.new ty, ty)), coned = Coned.new (), deconed = Deconed.new (), dummy = dummy} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector, dummy: {con: Con.t, args: Type.t vector}, numCons: int ref, used: Used.t} fun layout (T {used, ...}) = Layout.record [("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val cons = make #cons val dummy = make #dummy val (numCons', numCons) = make' #numCons val used = make #used end fun new {cons: Con.t vector, dummy: {con: Con.t, args: Type.t vector}}: t = T {cons = cons, dummy = dummy, numCons = ref ~1, used = Used.new ()} end structure TypeInfo = struct datatype t = T of {deconed: bool ref, simplify: Type.t option ref, used: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (deconed', _) = make' #deconed val (simplify', _) = make' #simplify val (used', _) = make' #used end fun new (): t = T {deconed = ref false, simplify = ref NONE, used = ref false} end structure FuncInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, bugLabel: Label.t option ref, mayRaise: MayRaise.t, mayReturn: MayReturn.t, raiseLabel: Label.t option ref, raises: (VarInfo.t * Type.t) vector option, returnLabel: Label.t option ref, returns: (VarInfo.t * Type.t) vector option, used: Used.t, wrappers: Block.t list ref} fun layout (T {args, mayRaise, mayReturn, raises, returns, used, ...}) = Layout.record [("args", Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout)) args), ("mayRaise", MayRaise.layout mayRaise), ("mayReturn", MayReturn.layout mayReturn), ("raises", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) raises), ("returns", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) returns), ("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val mayRaise' = make #mayRaise val mayReturn' = make #mayReturn val raiseLabel = make #raiseLabel val raises = make #raises val returnLabel = make #returnLabel val returns = make #returns val used = make #used val (wrappers', wrappers) = make' #wrappers end val raisee = MayRaise.raisee o mayRaise' val mayRaise = MayRaise.mayRaise o mayRaise' fun whenRaises (fi, th) = MayRaise.whenRaises (mayRaise' fi, th) fun flowRaises (fi, fi') = MayRaise.<= (mayRaise' fi, mayRaise' fi') val return = MayReturn.return o mayReturn' fun whenReturns (fi, th) = MayReturn.whenReturns (mayReturn' fi, th) val mayReturn = MayReturn.mayReturn o mayReturn' fun flowReturns (fi, fi') = MayReturn.<= (mayReturn' fi, mayReturn' fi') val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (fi, th) = Used.whenUsed (used fi, th) fun new {args: (VarInfo.t * Type.t) vector, raises: (VarInfo.t * Type.t) vector option, returns: (VarInfo.t * Type.t) vector option}: t = T {args = args, bugLabel = ref NONE, mayRaise = MayRaise.new (), mayReturn = MayReturn.new (), raiseLabel = ref NONE, raises = raises, returnLabel = ref NONE, returns = returns, used = Used.new (), wrappers = ref []} end structure LabelInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t, used: Used.t, wrappers: (Type.t vector * Label.t) list ref} fun layout (T {args, used, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("used", Used.layout used)] fun new {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t}: t = T {args = args, func = func, used = Used.new (), wrappers = ref []} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val func = make #func val used = make #used val (wrappers', wrappers) = make' #wrappers end val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (li, th) = Used.whenUsed (used li, th) end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("RemoveUnused.conInfo", Con.layout)) fun newConInfo (con, args, dummy) = setConInfo (con, ConInfo.new {args = args, dummy = dummy}) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("RemoveUnused.tyconInfo", Tycon.layout)) fun newTyconInfo (tycon, cons, dummy) = setTyconInfo (tycon, TyconInfo.new {cons = cons, dummy = dummy}) val {get = typeInfo: Type.t -> TypeInfo.t, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn _ => TypeInfo.new ())) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("RemoveUnused.varInfo", Var.layout)) fun newVarInfo (var, ty) = setVarInfo (var, VarInfo.new ty) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("RemoveUnused.labelInfo", Label.layout)) val {get = funcInfo: Func.t -> FuncInfo.t, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("RemoveUnused.funcInfo", Func.layout)) val usedTycon = TyconInfo.used o tyconInfo val useTycon = Used.use o usedTycon fun visitTycon (tycon: Tycon.t) = useTycon tycon val isUsedTycon = Used.isUsed o usedTycon fun visitType (ty: Type.t) = let val ti = typeInfo ty val used = TypeInfo.used' ti in if !used then () else let val () = used := true datatype z = datatype Type.dest val () = case Type.dest ty of Array ty => visitType ty | Datatype tycon => visitTycon tycon | Ref ty => visitType ty | Tuple tys => Vector.foreach (tys, visitType) | Vector ty => visitType ty | Weak ty => visitType ty | _ => () in () end end val visitTypeTh = fn ty => fn () => visitType ty val tyVar = VarInfo.ty o varInfo val usedVar = VarInfo.used o varInfo val useVar = Used.use o usedVar val isUsedVar = Used.isUsed o usedVar val whenUsedVar = fn (var, th) => VarInfo.whenUsed (varInfo var, th) fun flowVarInfoTyVarInfoTy ((vi, _), (vi', _)) = Used.<= (VarInfo.used vi, VarInfo.used vi') fun flowVarInfoTysVarInfoTys (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVarInfoTy) fun flowVarInfoTyVar ((vi, _), x) = Used.<= (VarInfo.used vi, usedVar x) fun flowVarInfoTysVars (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVar) val newVarInfo = fn (var, ty) => (newVarInfo (var, ty) ; whenUsedVar (var, visitTypeTh ty)) val visitLabelInfo = LabelInfo.use val visitLabelInfoTh = fn li => fn () => visitLabelInfo li val visitLabel = visitLabelInfo o labelInfo val visitLabelTh = fn l => fn () => visitLabel l val visitFuncInfo = FuncInfo.use val visitFunc = visitFuncInfo o funcInfo fun visitVar (x: Var.t) = useVar x fun visitVars (xs: Var.t Vector.t) = Vector.foreach (xs, visitVar) fun visitExp (e: Exp.t) = case e of ConApp {con, args} => let val ci = conInfo con val () = ConInfo.con ci val () = flowVarInfoTysVars (ConInfo.args ci, args) in () end | Const _ => () | PrimApp {prim, args, ...} => let val () = visitVars args datatype z = datatype Type.dest fun deconType (ty: Type.t) = let val ti = typeInfo ty val deconed = TypeInfo.deconed' ti in if !deconed then () else let val () = deconed := true val () = case Type.dest ty of Datatype t => Vector.foreach (TyconInfo.cons (tyconInfo t), fn con => deconCon con) | Tuple ts => Vector.foreach (ts, deconType) | Vector t => deconType t | _ => () in () end end and deconCon con = let val ci = conInfo con val () = ConInfo.decon ci val () = Vector.foreach (ConInfo.args ci, fn (x, t) => (VarInfo.use x ; deconType t)) in () end val () = case prim of Prim.MLton_eq => (* MLton_eq may be used on datatypes used as enums. *) deconType (tyVar (Vector.first args)) | Prim.MLton_equal => (* MLton_equal will be expanded by poly-equal into uses * of constructors as patterns. *) deconType (tyVar (Vector.first args)) | Prim.MLton_hash => (* MLton_hash will be expanded by poly-hash into uses * of constructors as patterns. *) deconType (tyVar (Vector.first args)) (* | Prim.MLton_size => deconType (tyVar (Vector.first args)) *) | _ => () in () end | Profile _ => () | Select {tuple, ...} => visitVar tuple | Tuple xs => visitVars xs | Var x => visitVar x val visitExpTh = fn e => fn () => visitExp e fun maybeVisitVarExp (var, exp) = Option.app (var, fn var => VarInfo.whenUsed (varInfo var, visitExpTh exp)) fun visitStatement (Statement.T {exp, var, ty, ...}) = (Option.app (var, fn var => newVarInfo (var, ty)) ; if Exp.maySideEffect exp then (visitType ty ; visitExp exp) else maybeVisitVarExp (var, exp)) fun visitTransfer (t: Transfer.t, fi: FuncInfo.t) = case t of Bug => () | Call {args, func, return} => let datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val fi' = funcInfo func val () = flowVarInfoTysVars (FuncInfo.args fi', args) val () = case cont of None => () | Caller => let val () = case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowReturns (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.returns fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenReturns (fi', visitLabelInfoTh li) in () end val () = case handler of None => () | Caller => let val () = case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowRaises (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.raises fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenRaises (fi', visitLabelInfoTh li) in () end val () = visitFuncInfo fi' in () end | Case {test, cases, default} => let val () = visitVar test in case cases of Cases.Word (_, cs) => (Vector.foreach (cs, visitLabel o #2) ; Option.app (default, visitLabel)) | Cases.Con cases => if Vector.isEmpty cases then Option.app (default, visitLabel) else let val () = Vector.foreach (cases, fn (con, l) => let val ci = conInfo con val () = ConInfo.decon ci val li = labelInfo l val () = flowVarInfoTysVarInfoTys (LabelInfo.args li, ConInfo.args ci) val () = ConInfo.whenConed (ci, visitLabelTh l) in () end) val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused.visitTransfer: Case:non-Datatype" val cons = TyconInfo.cons (tyconInfo tycon) in case default of NONE => () | SOME l => Vector.foreach (cons, fn con => if Vector.exists (cases, fn (c, _) => Con.equals(c, con)) then () else ConInfo.whenConed (conInfo con, visitLabelTh l)) end end | Goto {dst, args} => let val li = labelInfo dst val () = flowVarInfoTysVars (LabelInfo.args li, args) val () = visitLabelInfo li in () end | Raise xs => (FuncInfo.raisee fi ; flowVarInfoTysVars (valOf (FuncInfo.raises fi), xs)) | Return xs => (FuncInfo.return fi ; flowVarInfoTysVars (valOf (FuncInfo.returns fi), xs)) | Runtime {args, return, ...} => (visitVars args ; visitLabel return) fun visitBlock (Block.T {statements, transfer, ...}, fi: FuncInfo.t) = (Vector.foreach (statements, visitStatement) ; visitTransfer (transfer, fi)) val visitBlockTh = fn (b, fi) => fn () => visitBlock (b, fi) (* Visit all reachable expressions. *) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val dummyCon = Con.newString "dummy" val dummyArgs = Vector.new0 () val dummy = {con = dummyCon, args = dummyArgs} val () = newTyconInfo (tycon, Vector.map (cons, fn {con, ...} => con), dummy) val dummyExp = ConApp {args = Vector.new0 (), con = dummyCon} val dummy = {con = dummyCon, args = dummyArgs, exp = dummyExp} val () = Vector.foreach (cons, fn {con, args} => newConInfo (con, args, dummy)) in () end) val () = let fun doitCon c = let val ci = conInfo c in ConInfo.con ci ; ConInfo.decon ci end in useTycon Tycon.bool ; doitCon Con.truee ; doitCon Con.falsee end val () = Vector.foreach (globals, visitStatement) val () = List.foreach (functions, fn function => let val {name, args, raises, returns, start, blocks, ...} = Function.dest function val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) fun doitTys ts = Vector.map (ts, fn t => (VarInfo.new t, t)) fun doitTys' ts = Option.map (ts, doitTys) in val fi = FuncInfo.new {args = doitVarTys args, raises = doitTys' raises, returns = doitTys' returns} end val () = setFuncInfo (name, fi) val () = FuncInfo.whenUsed (fi, visitLabelTh start) val () = Vector.foreach (blocks, fn block as Block.T {label, args, ...} => let val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) in val li = LabelInfo.new {args = doitVarTys args, func = fi} end val () = setLabelInfo (label, li) val () = LabelInfo.whenUsed (li, visitBlockTh (block, fi)) in () end) in () end) val () = visitFunc main (* Diagnostics *) val () = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (seq [Tycon.layout tycon, str ": ", TyconInfo.layout (tyconInfo tycon), str ": ", Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", ConInfo.layout (conInfo con)]) cons])); display (str "\n"); List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in display (seq [Func.layout name, str ": ", FuncInfo.layout (funcInfo name)]); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])); display (str "\n") end) end) (* Analysis is done, Now build the resulting program. *) fun getWrapperLabel (l: Label.t, args: (VarInfo.t * Type.t) vector) = let val li = labelInfo l in if Vector.forall2 (args, LabelInfo.args li, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) then l else let val tys = Vector.keepAllMap (args, fn (x, ty) => if VarInfo.isUsed x then SOME ty else NONE) in case List.peek (LabelInfo.wrappers li, fn (args', _) => Vector.length args' = Vector.length tys andalso Vector.forall2 (args', tys, fn (ty', ty) => Type.equals (ty', ty))) of NONE => let val liArgs = LabelInfo.args li val l' = Label.newNoname () val (args', args'') = Vector.unzip (Vector.map2 (args, liArgs, fn ((x, ty), (y, _)) => let val z = Var.newNoname () in (if VarInfo.isUsed x then SOME (z, ty) else NONE, if VarInfo.isUsed y then SOME z else NONE) end)) val args' = Vector.keepAllMap (args', fn x => x) val (_, tys') = Vector.unzip args' val args'' = Vector.keepAllMap (args'', fn x => x) val block = Block.T {label = l', args = args', statements = Vector.new0 (), transfer = Goto {dst = l, args = args''}} val () = List.push (LabelInfo.wrappers' li, (tys', l')) val () = List.push (FuncInfo.wrappers' (LabelInfo.func li), block) in l' end | SOME (_, l') => l' end end val getConWrapperLabel = getWrapperLabel val getContWrapperLabel = getWrapperLabel val getHandlerWrapperLabel = getWrapperLabel fun getOriginalWrapperLabel l = getWrapperLabel (l, Vector.map (LabelInfo.args (labelInfo l), fn (_, t) => let val x = VarInfo.new t val () = VarInfo.use x in (x, t) end)) val getRuntimeWrapperLabel = getOriginalWrapperLabel fun getBugFunc (fi: FuncInfo.t): Label.t = (* Can't share the Bug block across different places because the * profile sourceInfo stack might be different. *) let val l = Label.newNoname () val block = Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug} val () = List.push (FuncInfo.wrappers' fi, block) in l end fun getReturnFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.returnLabel fi in case !r of NONE => let val l = Label.newNoname () val returns = valOf (FuncInfo.returns fi) val args = Vector.keepAllMap (returns, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Return xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = returns}) in l end | SOME l => l end fun getReturnContFunc (fi, args) = getWrapperLabel (getReturnFunc fi, args) fun getRaiseFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.raiseLabel fi in case !r of NONE => let val l = Label.newNoname () val raises = valOf (FuncInfo.raises fi) val args = Vector.keepAllMap (raises, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Raise xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = raises}) in l end | SOME l => l end fun getRaiseHandlerFunc (fi, args) = getWrapperLabel (getRaiseFunc fi, args) fun simplifyType (ty: Type.t): Type.t = let val ti = typeInfo ty val simplify = TypeInfo.simplify' ti in case !simplify of NONE => let datatype z = datatype Type.dest val ty = case Type.dest ty of Array ty => Type.array (simplifyType ty) | Ref ty => Type.reff (simplifyType ty) | Tuple tys => Type.tuple (Vector.map (tys, simplifyType)) | Vector ty => Type.vector (simplifyType ty) | Weak ty => Type.weak (simplifyType ty) | _ => ty in simplify := SOME ty ; ty end | SOME ty => ty end val datatypes = Vector.keepAllMap (datatypes, fn Datatype.T {tycon, cons} => if isUsedTycon tycon then let val needsDummy : bool ref = ref false val cons = Vector.keepAllMap (cons, fn {con, ...} => let val ci = conInfo con fun addDummy () = if !needsDummy then NONE else let val () = needsDummy := true in SOME (TyconInfo.dummy (tyconInfo tycon)) end in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => NONE | (true, true) => SOME {args = Vector.keepAllMap (ConInfo.args ci, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE), con = con} | (true, false) => addDummy () end) val num = Vector.length cons val () = TyconInfo.numCons' (tyconInfo tycon) := num in SOME (Datatype.T {tycon = tycon, cons = cons}) end else NONE) fun simplifyExp (e: Exp.t): Exp.t = case e of ConApp {con, args} => let val ci = conInfo con in if ConInfo.isDeconed ci then let val ciArgs = ConInfo.args ci in ConApp {args = (Vector.keepAllMap2 (args, ciArgs, fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)), con = con} end else #exp (ConInfo.dummy ci) end | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = Vector.map (targs, simplifyType), args = args} | _ => e fun simplifyStatement (s as Statement.T {var, ty, exp}) : Statement.t option = case exp of Profile _ => SOME s | _ => let fun doit' var = SOME (Statement.T {var = var, ty = simplifyType ty, exp = simplifyExp exp}) fun doit var' = if Exp.maySideEffect exp then doit' var else if isSome var' then doit' var' else NONE in case var of SOME var => if isUsedVar var then doit (SOME var) else doit NONE | NONE => doit NONE end fun simplifyStatements (ss: Statement.t Vector.t) : Statement.t Vector.t = Vector.keepAllMap (ss, simplifyStatement) fun simplifyTransfer (t: Transfer.t, fi: FuncInfo.t): Transfer.t = case t of Bug => Bug | Call {func, args, return} => let val fi' = funcInfo func datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val cont = if FuncInfo.mayReturn fi' then case cont of None => Error.bug "RemoveUnused.simplifyTransfer: cont:None" | Caller => (if (case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused.simplifyTransfer: cont:Caller") then Caller else Some (getReturnContFunc (fi, valOf (FuncInfo.returns fi')))) | Some l => Some (getContWrapperLabel (l, valOf (FuncInfo.returns fi'))) else None val handler = if FuncInfo.mayRaise fi' then (case handler of None => Error.bug "RemoveUnused.simplifyTransfer: handler:None" | Caller => (if (case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused.simplifyTransfer: handler:Caller") then Caller else Some (getRaiseHandlerFunc (fi, valOf (FuncInfo.raises fi')))) | Some l => Some (getHandlerWrapperLabel (l, valOf (FuncInfo.raises fi')))) else None val return = case (cont, handler) of (None, None) => Return.Dead | (None, Caller) => Return.Tail | (None, Some h) => Return.NonTail {cont = getBugFunc fi, handler = Handler.Handle h} | (Caller, None) => Return.Tail | (Caller, Caller) => Return.Tail | (Caller, Some h) => Return.NonTail {cont = getReturnContFunc (fi, valOf (FuncInfo.returns fi')), handler = Handler.Handle h} | (Some c, None) => Return.NonTail {cont = c, handler = Handler.Dead} | (Some c, Caller) => Return.NonTail {cont = c, handler = Handler.Caller} | (Some c, Some h) => Return.NonTail {cont = c, handler = Handler.Handle h} val args = Vector.keepAllMap2 (args, FuncInfo.args fi', fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE) in Call {func = func, args = args, return = return} end | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAllMap (cases, fn (con, l) => let val ci = conInfo con in if ConInfo.isConed ci then SOME (con, getConWrapperLabel (l, ConInfo.args ci)) else NONE end) fun keep default = Case {test = test, cases = Cases.Con cases, default = default} fun none () = keep NONE in case default of NONE => none () | SOME l => if Vector.isEmpty cases then if LabelInfo.isUsed (labelInfo l) then Goto {dst = l, args = Vector.new0 ()} else Bug else let val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused.simplifyTransfer: Case:non-Datatype" val numCons = TyconInfo.numCons (tyconInfo tycon) in if Vector.length cases = numCons then none () else keep (SOME l) end end | Case {test, cases, default} => Case {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = (Vector.keepAllMap2 (args, LabelInfo.args (labelInfo dst), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} | Raise xs => Raise (Vector.keepAllMap2 (xs, valOf (FuncInfo.raises fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Return xs => Return (Vector.keepAllMap2 (xs, valOf (FuncInfo.returns fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Runtime {prim, args, return} => Runtime {prim = prim, args = args, return = getRuntimeWrapperLabel return} val simplifyTransfer = Trace.trace ("RemoveUnused.simplifyTransfer", Layout.tuple2 (Transfer.layout, FuncInfo.layout), Transfer.layout) simplifyTransfer fun simplifyBlock (Block.T {label, args, statements, transfer}): Block.t option = let val li = labelInfo label in if LabelInfo.isUsed li then let val args = Vector.keepAllMap2 (LabelInfo.args li, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val statements = simplifyStatements statements val transfer = simplifyTransfer (transfer, LabelInfo.func li) in SOME (Block.T {label = label, args = args, statements = statements, transfer = transfer}) end else NONE end fun simplifyBlocks (bs: Block.t Vector.t): Block.t Vector.t = Vector.keepAllMap (bs, simplifyBlock) val globals = simplifyStatements globals val shrink = shrinkFunction {globals = globals} fun simplifyFunction (f: Function.t): Function.t option = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val fi = funcInfo name in if FuncInfo.isUsed fi then let val args = Vector.keepAllMap2 (FuncInfo.args fi, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val blocks = simplifyBlocks blocks val wrappers = Vector.fromList (FuncInfo.wrappers fi) val blocks = Vector.concat [wrappers, blocks] val returns = case FuncInfo.returns fi of NONE => NONE | SOME xts => if FuncInfo.mayReturn fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE val raises = case FuncInfo.raises fi of NONE => NONE | SOME xts => if FuncInfo.mayRaise fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE in SOME (shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start})) end else NONE end fun simplifyFunctions (fs: Function.t List.t): Function.t List.t = List.keepAllMap (fs, simplifyFunction) val functions = simplifyFunctions functions val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = destroy () val () = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/remove-unused2.fun000066400000000000000000001735421416264345000213530ustar00rootroot00000000000000(* Copyright (C) 2009,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor RemoveUnused2 (S: SSA2_TRANSFORM_STRUCTS): SSA2_TRANSFORM = struct open S open Exp Statement Transfer structure Used = struct structure L = TwoPointLattice (val bottom = "unused" val top = "used") open L val use = makeTop val isUsed = isTop val whenUsed = addHandler end structure Coned = struct structure L = TwoPointLattice (val bottom = "not coned" val top = "coned") open L val con = makeTop val isConed = isTop val whenConed = addHandler end structure Deconed = struct structure L = TwoPointLattice (val bottom = "not deconed" val top = "deconed") open L val decon = makeTop val isDeconed = isTop end structure MayReturn = struct structure L = TwoPointLattice (val bottom = "does not return" val top = "may return") open L val return = makeTop val mayReturn = isTop val whenReturns = addHandler end structure MayRaise = struct structure L = TwoPointLattice (val bottom = "does not raise" val top = "may raise") open L val raisee = makeTop val mayRaise = isTop val whenRaises = addHandler end structure VarInfo = struct datatype t = T of {ty: Type.t, used: Used.t} fun layout (T {used, ...}) = Used.layout used local fun make f (T r) = f r in val ty = make #ty val used = make #used end fun new (ty : Type.t): t = T {ty = ty, used = Used.new ()} val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) end structure ConInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) Prod.t, coned: Coned.t, deconed: Deconed.t, dummy: {con: Con.t, args: Type.t Prod.t, ty: Type.t, exp: Exp.t}, used: Used.t} fun layout (T {args, coned, deconed, used, ...}) = Layout.record [("args", Prod.layout (args, VarInfo.layout o #1)), ("coned", Coned.layout coned), ("deconed", Deconed.layout deconed), ("used", Used.layout used)] local fun make f (T r) = f r in val args = make #args val coned = make #coned val deconed = make #deconed val dummy = make #dummy val used = make #used end val con = Coned.con o coned val isConed = Coned.isConed o coned fun whenConed (ci, th) = Coned.whenConed (coned ci, th) val decon = Deconed.decon o deconed val isDeconed = Deconed.isDeconed o deconed val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) fun new {args: Type.t Prod.t, dummy: {con: Con.t, args: Type.t Prod.t, ty: Type.t, exp: Exp.t}}: t = T {args = Prod.map (args, fn ty => (VarInfo.new ty, ty)), coned = Coned.new (), deconed = Deconed.new (), dummy = dummy, used = Used.new ()} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector, dummy: {con: Con.t, args: Type.t Prod.t}, numCons: int ref, used: Used.t} fun layout (T {used, ...}) = Layout.record [("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val cons = make #cons val dummy = make #dummy val (numCons', numCons) = make' #numCons val used = make #used end fun new {cons: Con.t vector, dummy: {con: Con.t, args: Type.t Prod.t}}: t = T {cons = cons, dummy = dummy, numCons = ref ~1, used = Used.new ()} end structure TypeInfo = struct datatype t = T of {deconed: bool ref, simplify: Type.t option ref, used: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (deconed', _) = make' #deconed val (simplify', _) = make' #simplify val (used', _) = make' #used end fun new (): t = T {deconed = ref false, simplify = ref NONE, used = ref false} end structure FuncInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, bugLabel: Label.t option ref, mayRaise: MayRaise.t, mayReturn: MayReturn.t, raiseLabel: Label.t option ref, raises: (VarInfo.t * Type.t) vector option, returnLabel: Label.t option ref, returns: (VarInfo.t * Type.t) vector option, used: Used.t, wrappers: Block.t list ref} fun layout (T {args, mayRaise, mayReturn, raises, returns, used, ...}) = Layout.record [("args", Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout)) args), ("mayRaise", MayRaise.layout mayRaise), ("mayReturn", MayReturn.layout mayReturn), ("raises", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) raises), ("returns", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) returns), ("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val mayRaise' = make #mayRaise val mayReturn' = make #mayReturn val raiseLabel = make #raiseLabel val raises = make #raises val returnLabel = make #returnLabel val returns = make #returns val used = make #used val (wrappers', wrappers) = make' #wrappers end val raisee = MayRaise.raisee o mayRaise' val mayRaise = MayRaise.mayRaise o mayRaise' fun whenRaises (fi, th) = MayRaise.whenRaises (mayRaise' fi, th) fun flowRaises (fi, fi') = MayRaise.<= (mayRaise' fi, mayRaise' fi') val return = MayReturn.return o mayReturn' fun whenReturns (fi, th) = MayReturn.whenReturns (mayReturn' fi, th) val mayReturn = MayReturn.mayReturn o mayReturn' fun flowReturns (fi, fi') = MayReturn.<= (mayReturn' fi, mayReturn' fi') val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (fi, th) = Used.whenUsed (used fi, th) fun new {args: (VarInfo.t * Type.t) vector, raises: (VarInfo.t * Type.t) vector option, returns: (VarInfo.t * Type.t) vector option}: t = T {args = args, bugLabel = ref NONE, mayRaise = MayRaise.new (), mayReturn = MayReturn.new (), raiseLabel = ref NONE, raises = raises, returnLabel = ref NONE, returns = returns, used = Used.new (), wrappers = ref []} end structure LabelInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t, used: Used.t, wrappers: (Type.t vector * Label.t) list ref} fun layout (T {args, used, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("used", Used.layout used)] fun new {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t}: t = T {args = args, func = func, used = Used.new (), wrappers = ref []} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val func = make #func val used = make #used val (wrappers', wrappers) = make' #wrappers end val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (li, th) = Used.whenUsed (used li, th) end fun transform2 (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("RemoveUnused2.conInfo", Con.layout)) fun newConInfo (con, args, dummy) = setConInfo (con, ConInfo.new {args = args, dummy = dummy}) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("RemoveUnused2.tyconInfo", Tycon.layout)) fun newTyconInfo (tycon, cons, dummy) = setTyconInfo (tycon, TyconInfo.new {cons = cons, dummy = dummy}) val {get = typeInfo: Type.t -> TypeInfo.t, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn _ => TypeInfo.new ())) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("RemoveUnused2.varInfo", Var.layout)) fun newVarInfo (var, ty) = setVarInfo (var, VarInfo.new ty) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("RemoveUnused2.labelInfo", Label.layout)) val {get = funcInfo: Func.t -> FuncInfo.t, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("RemoveUnused2.funcInfo", Func.layout)) val usedCon = ConInfo.used o conInfo val useCon = Used.use o usedCon fun visitCon (con: Con.t) = useCon con val whenUsedCon = fn (con, th) => ConInfo.whenUsed (conInfo con, th) val usedTycon = TyconInfo.used o tyconInfo val useTycon = Used.use o usedTycon fun visitTycon (tycon: Tycon.t) = useTycon tycon val isUsedTycon = Used.isUsed o usedTycon fun visitType (ty: Type.t) = let val ti = typeInfo ty val used = TypeInfo.used' ti in if !used then () else let val () = used := true datatype z = datatype Type.dest datatype z = datatype ObjectCon.t val () = case Type.dest ty of Datatype tycon => visitTycon tycon | Object {args, con} => let val () = Prod.foreach (args, visitType) val () = case con of Con con => visitCon con | Sequence => () | Tuple => () in () end | Weak ty => visitType ty | _ => () in () end end val visitTypeTh = fn ty => fn () => visitType ty val tyVar = VarInfo.ty o varInfo val usedVar = VarInfo.used o varInfo val useVar = Used.use o usedVar val isUsedVar = Used.isUsed o usedVar val whenUsedVar = fn (var, th) => VarInfo.whenUsed (varInfo var, th) fun flowVarInfoTyVarInfoTy ((vi, _), (vi', _)) = Used.<= (VarInfo.used vi, VarInfo.used vi') fun flowVarInfoTysVarInfoTys (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVarInfoTy) fun flowVarInfoTyVar ((vi, _), x) = Used.<= (VarInfo.used vi, usedVar x) fun flowVarInfoTysVars (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVar) val newVarInfo = fn (var, ty) => (newVarInfo (var, ty) ; whenUsedVar (var, visitTypeTh ty)) val visitLabelInfo = LabelInfo.use val visitLabelInfoTh = fn li => fn () => visitLabelInfo li val visitLabel = visitLabelInfo o labelInfo val visitLabelTh = fn l => fn () => visitLabel l val visitFuncInfo = FuncInfo.use val visitFunc = visitFuncInfo o funcInfo fun visitVar (x: Var.t) = useVar x fun visitVars (xs: Var.t Vector.t) = Vector.foreach (xs, visitVar) fun visitExp (e: Exp.t) = case e of Const _ => () | Inject {sum, variant} => (visitTycon sum ; visitVar variant) | Object {args, con} => let val () = case con of NONE => visitVars args | SOME con => let val ci = conInfo con val () = ConInfo.con ci val ciArgs = Vector.map (Prod.dest (ConInfo.args ci), #elt) val () = flowVarInfoTysVars (ciArgs, args) in () end in () end | PrimApp {prim, args, ...} => let val () = visitVars args datatype z = datatype Type.dest datatype z = datatype ObjectCon.t fun deconType (ty: Type.t) = let val ti = typeInfo ty val deconed = TypeInfo.deconed' ti in if !deconed then () else let val () = deconed := true val () = case Type.dest ty of Datatype t => Vector.foreach (TyconInfo.cons (tyconInfo t), fn con => deconCon con) | Object {args, con} => let fun default () = Vector.foreach (Prod.dest args, fn {elt, isMutable} => if isMutable then () else deconType elt) val () = case con of Con con => deconCon con | Sequence => default () | Tuple => default () in () end | _ => () in () end end and deconCon con = let val ci = conInfo con val () = ConInfo.decon ci val () = Vector.foreach (Prod.dest (ConInfo.args ci), fn {elt = (x, t), isMutable} => (VarInfo.use x ; if isMutable then () else deconType t)) in () end val () = case prim of Prim.MLton_eq => (* MLton_eq may be used on datatypes used as enums. *) deconType (tyVar (Vector.first args)) | Prim.MLton_equal => (* MLton_equal will be expanded by poly-equal into uses * of constructors as patterns. *) deconType (tyVar (Vector.first args)) | Prim.MLton_hash => (* MLton_hash will be expanded by poly-hash into uses * of constructors as patterns. *) deconType (tyVar (Vector.first args)) (* | Prim.MLton_size => deconType (tyVar (Vector.first args)) *) | _ => () in () end | Select {base, offset} => let datatype z = datatype Base.t datatype z = datatype ObjectCon.t in case base of Object base => let val () = visitVar base val () = case Type.dest (tyVar base) of Type.Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val {elt = (vi, _), ...} = Prod.sub (ciArgs, offset) val () = ConInfo.decon ci val () = VarInfo.use vi in () end | Sequence => Error.bug "RemoveUnused2.visitExp: Select:non-Con|Tuple" | Tuple => ()) | _ => Error.bug "RemovUnused2.visitExp: Select:non-Object" in () end | SequenceSub {index, sequence} => (visitVar index ; visitVar sequence) end | Sequence {args} => Vector.foreach (args, visitVars) | Var x => visitVar x val visitExpTh = fn e => fn () => visitExp e fun maybeVisitVarExp (var, exp) = Option.app (var, fn var => VarInfo.whenUsed (varInfo var, visitExpTh exp)) fun visitStatement s = case s of Bind {exp, ty, var} => (Option.app (var, fn var => newVarInfo (var, ty)) ; if Exp.maySideEffect exp then (visitType ty ; visitExp exp) else maybeVisitVarExp (var, exp)) | Profile _ => () | Update {base, offset, value} => let datatype z = datatype Base.t datatype z = datatype ObjectCon.t in case base of Object base => (case Type.dest (tyVar base) of Type.Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val {elt = (vi, _), ...} = Prod.sub (ciArgs, offset) in VarInfo.whenUsed (vi, fn () => (ConInfo.decon ci ; visitVar base ; visitVar value)) end | Sequence => Error.bug "RemoveUnused2.visitStatement: Update:non-Con|Tuple" | Tuple => (visitVar base ; visitVar value)) | _ => Error.bug "RemoveUnused2.visitStatement: Update:non-Object") | SequenceSub {index, sequence} => (visitVar index ; visitVar sequence ; visitVar value) end fun visitTransfer (t: Transfer.t, fi: FuncInfo.t) = case t of Bug => () | Call {args, func, return} => let datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val fi' = funcInfo func val () = flowVarInfoTysVars (FuncInfo.args fi', args) val () = case cont of None => () | Caller => let val () = case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowReturns (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.returns fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenReturns (fi', visitLabelInfoTh li) in () end val () = case handler of None => () | Caller => let val () = case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowRaises (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.raises fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenRaises (fi', visitLabelInfoTh li) in () end val () = visitFuncInfo fi' in () end | Case {test, cases, default} => let val () = visitVar test in case cases of Cases.Word (_, cs) => (Vector.foreach (cs, visitLabel o #2) ; Option.app (default, visitLabel)) | Cases.Con cases => if Vector.isEmpty cases then Option.app (default, visitLabel) else let val () = Vector.foreach (cases, fn (con, l) => let val ci = conInfo con val () = ConInfo.decon ci val () = ConInfo.whenConed (ci, visitLabelTh l) in () end) val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused2.visitTransfer: Case:non-Datatype" val cons = TyconInfo.cons (tyconInfo tycon) in case default of NONE => () | SOME l => Vector.foreach (cons, fn con => if Vector.exists (cases, fn (c, _) => Con.equals(c, con)) then () else ConInfo.whenConed (conInfo con, visitLabelTh l)) end end | Goto {dst, args} => let val li = labelInfo dst val () = flowVarInfoTysVars (LabelInfo.args li, args) val () = visitLabelInfo li in () end | Raise xs => (FuncInfo.raisee fi ; flowVarInfoTysVars (valOf (FuncInfo.raises fi), xs)) | Return xs => (FuncInfo.return fi ; flowVarInfoTysVars (valOf (FuncInfo.returns fi), xs)) | Runtime {args, return, ...} => (visitVars args ; visitLabel return) fun visitBlock (Block.T {statements, transfer, ...}, fi: FuncInfo.t) = (Vector.foreach (statements, visitStatement) ; visitTransfer (transfer, fi)) val visitBlockTh = fn (b, fi) => fn () => visitBlock (b, fi) (* Visit all reachable expressions. *) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val dummyCon = Con.newString "dummy" val dummyArgs = Prod.empty () val dummy = {con = dummyCon, args = dummyArgs} val () = newTyconInfo (tycon, Vector.map (cons, fn {con, ...} => con), dummy) val dummyTy = Type.conApp (dummyCon, dummyArgs) val dummyExp = Object {args = Vector.new0 (), con = SOME dummyCon} val dummy = {con = dummyCon, args = dummyArgs, ty = dummyTy, exp = dummyExp} val () = Vector.foreach (cons, fn {con, args} => (newConInfo (con, args, dummy) ; whenUsedCon (con, fn () => useTycon tycon))) in () end) val () = let fun doitCon c = let val ci = conInfo c in ConInfo.use ci ; ConInfo.con ci ; ConInfo.decon ci end in useTycon Tycon.bool ; doitCon Con.truee ; doitCon Con.falsee end val () = Vector.foreach (globals, visitStatement) val () = List.foreach (functions, fn function => let val {name, args, raises, returns, start, blocks, ...} = Function.dest function val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) fun doitTys ts = Vector.map (ts, fn t => (VarInfo.new t, t)) fun doitTys' ts = Option.map (ts, doitTys) in val fi = FuncInfo.new {args = doitVarTys args, raises = doitTys' raises, returns = doitTys' returns} end val () = setFuncInfo (name, fi) val () = FuncInfo.whenUsed (fi, visitLabelTh start) val () = Vector.foreach (blocks, fn block as Block.T {label, args, ...} => let val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) in val li = LabelInfo.new {args = doitVarTys args, func = fi} end val () = setLabelInfo (label, li) val () = LabelInfo.whenUsed (li, visitBlockTh (block, fi)) in () end) in () end) val () = visitFunc main (* Diagnostics *) val () = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (seq [Tycon.layout tycon, str ": ", TyconInfo.layout (tyconInfo tycon), str ": ", Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", ConInfo.layout (conInfo con)]) cons])); display (str "\n"); List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in display (seq [Func.layout name, str ": ", FuncInfo.layout (funcInfo name)]); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])); display (str "\n") end) end) (* Analysis is done, Now build the resulting program. *) fun getWrapperLabel (l: Label.t, args: (VarInfo.t * Type.t) vector) = let val li = labelInfo l in if Vector.forall2 (args, LabelInfo.args li, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) then l else let val tys = Vector.keepAllMap (args, fn (x, ty) => if VarInfo.isUsed x then SOME ty else NONE) in case List.peek (LabelInfo.wrappers li, fn (args', _) => Vector.length args' = Vector.length tys andalso Vector.forall2 (args', tys, fn (ty', ty) => Type.equals (ty', ty))) of NONE => let val liArgs = LabelInfo.args li val l' = Label.newNoname () val (args', args'') = Vector.unzip (Vector.map2 (args, liArgs, fn ((x, ty), (y, _)) => let val z = Var.newNoname () in (if VarInfo.isUsed x then SOME (z, ty) else NONE, if VarInfo.isUsed y then SOME z else NONE) end)) val args' = Vector.keepAllMap (args', fn x => x) val (_, tys') = Vector.unzip args' val args'' = Vector.keepAllMap (args'', fn x => x) val block = Block.T {label = l', args = args', statements = Vector.new0 (), transfer = Goto {dst = l, args = args''}} val () = List.push (LabelInfo.wrappers' li, (tys', l')) val () = List.push (FuncInfo.wrappers' (LabelInfo.func li), block) in l' end | SOME (_, l') => l' end end val getContWrapperLabel = getWrapperLabel val getHandlerWrapperLabel = getWrapperLabel fun getOriginalWrapperLabel l = getWrapperLabel (l, Vector.map (LabelInfo.args (labelInfo l), fn (_, t) => let val x = VarInfo.new t val () = VarInfo.use x in (x, t) end)) val getRuntimeWrapperLabel = getOriginalWrapperLabel fun getBugFunc (fi: FuncInfo.t): Label.t = (* Can't share the Bug block across different places because the * profile sourceInfo stack might be different. *) let val l = Label.newNoname () val block = Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug} val () = List.push (FuncInfo.wrappers' fi, block) in l end fun getReturnFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.returnLabel fi in case !r of NONE => let val l = Label.newNoname () val returns = valOf (FuncInfo.returns fi) val args = Vector.keepAllMap (returns, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Return xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = returns}) in l end | SOME l => l end fun getReturnContFunc (fi, args) = getWrapperLabel (getReturnFunc fi, args) fun getRaiseFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.raiseLabel fi in case !r of NONE => let val l = Label.newNoname () val raises = valOf (FuncInfo.raises fi) val args = Vector.keepAllMap (raises, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Raise xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = raises}) in l end | SOME l => l end fun getRaiseHandlerFunc (fi, args) = getWrapperLabel (getRaiseFunc fi, args) fun simplifyType (ty: Type.t): Type.t = let val ti = typeInfo ty val simplify = TypeInfo.simplify' ti in case !simplify of NONE => let datatype z = datatype Type.dest datatype z = datatype ObjectCon.t val ty = case Type.dest ty of Object {args, con} => (case con of Con con => let val ci = conInfo con in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => #ty (ConInfo.dummy ci) | (true, true) => Type.object {args = Prod.keepAllMap (ConInfo.args ci, fn (x,t) => if VarInfo.isUsed x then SOME (simplifyType t) else NONE), con = Con con} | (true, false) => #ty (ConInfo.dummy ci) end | _ => Type.object {args = Prod.map (args, simplifyType), con = con}) | Weak ty => Type.weak (simplifyType ty) | _ => ty in simplify := SOME ty ; ty end | SOME ty => ty end val datatypes = Vector.keepAllMap (datatypes, fn Datatype.T {tycon, cons} => if isUsedTycon tycon then let val needsDummy : bool ref = ref false val cons = Vector.keepAllMap (cons, fn {con, ...} => let val ci = conInfo con fun addDummy () = if !needsDummy then NONE else let val () = needsDummy := true in SOME (TyconInfo.dummy (tyconInfo tycon)) end in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => if ConInfo.isUsed ci then addDummy () else NONE | (true, true) => SOME {con = con, args = Prod.keepAllMap (ConInfo.args ci, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)} | (true, false) => addDummy () end) val num = Vector.length cons val () = TyconInfo.numCons' (tyconInfo tycon) := num in SOME (Datatype.T {tycon = tycon, cons = cons}) end else NONE) fun simplifyExp (e: Exp.t): Exp.t = case e of Object {con, args} => (case con of NONE => e | SOME con => let val ci = conInfo con in if ConInfo.isDeconed ci then let val ciArgs = Vector.map (Prod.dest (ConInfo.args ci), #elt) in Object {con = SOME con, args = (Vector.keepAllMap2 (args, ciArgs, fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} end else #exp (ConInfo.dummy ci) end) | Select {base, offset} => let datatype z = datatype Base.t in case base of Object base => let datatype z = datatype ObjectCon.t datatype z = datatype Type.dest in case Type.dest (tyVar base) of Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val offset = Int.fold (0, offset, 0, fn (i, offset) => if (VarInfo.isUsed o #1 o #elt) (Prod.sub (ciArgs, i)) then offset + 1 else offset) in Select {base = Base.Object base, offset = offset} end | Sequence => Error.bug "RemoveUnused2.simplifyExp: Update:non-Con|Tuple" | Tuple => e) | _ => Error.bug "RemoveUnused2.simplifyExp:Select:non-Object" end | _ => e end | _ => e fun simplifyStatement (s : Statement.t) : Statement.t option = case s of Bind {exp, ty, var} => let fun doit' var = SOME (Statement.Bind {var = var, ty = simplifyType ty, exp = simplifyExp exp}) fun doit var' = if Exp.maySideEffect exp then doit' var else if isSome var' then doit' var' else NONE in case var of SOME var => if isUsedVar var then doit (SOME var) else doit NONE | NONE => doit NONE end | Profile _ => SOME s | Update {base, offset, value} => let datatype z = datatype Base.t in case base of Object base => let datatype z = datatype ObjectCon.t datatype z = datatype Type.dest in case Type.dest (tyVar base) of Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci fun argIsUsed i = VarInfo.isUsed (#1 (#elt (Prod.sub (ciArgs, i)))) in if argIsUsed offset then let val offset = Int.fold (0, offset, 0, fn (i, offset) => if argIsUsed i then offset + 1 else offset) in SOME (Update {base = Base.Object base, offset = offset, value = value}) end else NONE end | Sequence => Error.bug "RemoveUnused2.simplifyStatement: Update:non-Con|Tuple" | Tuple => SOME s) | _ => Error.bug "RemoveUnused2.simplifyStatement: Select:non-Object" end | _ => SOME s end fun simplifyStatements (ss: Statement.t Vector.t) : Statement.t Vector.t = Vector.keepAllMap (ss, simplifyStatement) fun simplifyTransfer (t: Transfer.t, fi: FuncInfo.t): Transfer.t = case t of Bug => Bug | Call {func, args, return} => let val fi' = funcInfo func datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val cont = if FuncInfo.mayReturn fi' then case cont of None => Error.bug "RemoveUnused2.simplifyTransfer: cont:None" | Caller => (if (case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused2.simplifyTransfer: cont:Caller") then Caller else Some (getReturnContFunc (fi, valOf (FuncInfo.returns fi')))) | Some l => Some (getContWrapperLabel (l, valOf (FuncInfo.returns fi'))) else None val handler = if FuncInfo.mayRaise fi' then (case handler of None => Error.bug "RemoveUnused2.simplifyTransfer: handler:None" | Caller => (if (case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused2.simplifyTransfer: handler:Caller") then Caller else Some (getRaiseHandlerFunc (fi, valOf (FuncInfo.raises fi')))) | Some l => Some (getHandlerWrapperLabel (l, valOf (FuncInfo.raises fi')))) else None val return = case (cont, handler) of (None, None) => Return.Dead | (None, Caller) => Return.Tail | (None, Some h) => Return.NonTail {cont = getBugFunc fi, handler = Handler.Handle h} | (Caller, None) => Return.Tail | (Caller, Caller) => Return.Tail | (Caller, Some h) => Return.NonTail {cont = getReturnContFunc (fi, valOf (FuncInfo.returns fi')), handler = Handler.Handle h} | (Some c, None) => Return.NonTail {cont = c, handler = Handler.Dead} | (Some c, Caller) => Return.NonTail {cont = c, handler = Handler.Caller} | (Some c, Some h) => Return.NonTail {cont = c, handler = Handler.Handle h} val args = Vector.keepAllMap2 (args, FuncInfo.args fi', fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE) in Call {func = func, args = args, return = return} end | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAllMap (cases, fn (con, l) => let val ci = conInfo con in if ConInfo.isConed ci then SOME (con, l) else NONE end) fun keep default = Case {test = test, cases = Cases.Con cases, default = default} fun none () = keep NONE in case default of NONE => none () | SOME l => if Vector.isEmpty cases then if LabelInfo.isUsed (labelInfo l) then Goto {dst = l, args = Vector.new0 ()} else Bug else let val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused2.simplifyTransfer: Case:non-Datatype" val numCons = TyconInfo.numCons (tyconInfo tycon) in if Vector.length cases = numCons then none () else keep (SOME l) end end | Case {test, cases, default} => Case {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = (Vector.keepAllMap2 (args, LabelInfo.args (labelInfo dst), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} | Raise xs => Raise (Vector.keepAllMap2 (xs, valOf (FuncInfo.raises fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Return xs => Return (Vector.keepAllMap2 (xs, valOf (FuncInfo.returns fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Runtime {prim, args, return} => Runtime {prim = prim, args = args, return = getRuntimeWrapperLabel return} val simplifyTransfer = Trace.trace ("RemoveUnused2.simplifyTransfer", Layout.tuple2 (Transfer.layout, FuncInfo.layout), Transfer.layout) simplifyTransfer fun simplifyBlock (Block.T {label, args, statements, transfer}): Block.t option = let val li = labelInfo label in if LabelInfo.isUsed li then let val args = Vector.keepAllMap2 (LabelInfo.args li, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val statements = simplifyStatements statements val transfer = simplifyTransfer (transfer, LabelInfo.func li) in SOME (Block.T {label = label, args = args, statements = statements, transfer = transfer}) end else NONE end fun simplifyBlocks (bs: Block.t Vector.t): Block.t Vector.t = Vector.keepAllMap (bs, simplifyBlock) val globals = simplifyStatements globals val shrink = shrinkFunction {globals = globals} fun simplifyFunction (f: Function.t): Function.t option = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val fi = funcInfo name in if FuncInfo.isUsed fi then let val args = Vector.keepAllMap2 (FuncInfo.args fi, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val blocks = simplifyBlocks blocks val wrappers = Vector.fromList (FuncInfo.wrappers fi) val blocks = Vector.concat [wrappers, blocks] val returns = case FuncInfo.returns fi of NONE => NONE | SOME xts => if FuncInfo.mayReturn fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE val raises = case FuncInfo.raises fi of NONE => NONE | SOME xts => if FuncInfo.mayRaise fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE in SOME (shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start})) end else NONE end fun simplifyFunctions (fs: Function.t List.t): Function.t List.t = List.keepAllMap (fs, simplifyFunction) val functions = simplifyFunctions functions val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = destroy () val () = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/restore.fun000066400000000000000000000615731416264345000201560ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Restore SSA * * Based primarily on Section 19.1 of Appel's "Modern Compiler Implementation in ML", * (but see the caveats in the comments below). * The main deviation is the calculation of liveness of the violating variables, * which is used to predicate the insertion of phi arguments. This is due to * the algorithm's bias towards imperative languages, for which it makes the * assumption that all variables are defined in the start block and all variables * are "used" at exit. * This is "optimized" for restoration of functions with small numbers of violating * variables -- use bool vectors to represent sets of violating variables. * Also, we use a Promise.t to suspend part of the dominance frontier computation. * * Requirements: no violation in globals; this is checked. *) functor Restore (S: RESTORE_STRUCTS): RESTORE = struct structure Control = struct open Control fun diagnostics _ = () end open S open Exp Transfer structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector ref, preds: Label.t list ref, defs: bool vector ref, uses: bool vector ref, live: bool array ref, dtindex: int ref, df: Label.t vector Promise.t ref, phi: Var.t list ref, phiArgs: Var.t vector ref, queued: bool ref} fun layout (T {preds, defs, uses, live, dtindex, df, phiArgs, ...}) = let open Layout in record [("preds", List.layout Label.layout (!preds)), ("defs", Vector.layout Bool.layout (!defs)), ("uses", Vector.layout Bool.layout (!uses)), ("live", Array.layout Bool.layout (!live)), ("dtindex", Int.layout (!dtindex)), ("df", Promise.layout (Vector.layout Label.layout) (!df)), ("phiArgs", Vector.layout Var.layout (!phiArgs))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (args, args') = make' #args val (preds, preds') = make' #preds val (defs, defs') = make' #defs val (uses, uses') = make' #uses val (live, live') = make' #live val (dtindex, dtindex') = make' #dtindex val (df, df') = make' #df val (phi, _) = make' #phi val (phiArgs, phiArgs') = make' #phiArgs val (queued, _) = make' #queued end fun new (): t = T {args = ref (Vector.new0 ()), preds = ref [], defs = ref (Vector.new0 ()), uses = ref (Vector.new0 ()), live = ref (Array.new0 ()), dtindex = ref ~1, df = ref (Promise.delay (fn () => Vector.new0 ())), phi = ref [], phiArgs = ref (Vector.new0 ()), queued = ref false} end structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val isOne = isMid val makeOne = makeMid val isMany = isTop val makeMany = makeTop val whenMany = whenTop val inc: t -> unit = fn c => if isZero c then makeOne c else if isOne c then makeMany c else () end structure VarInfo = struct datatype t = T of {defs: Cardinality.t, ty: Type.t ref, index: int ref, defSites: Label.t list ref, useSites: Label.t list ref, vars: Var.t list ref} fun layout (T {defs, index, defSites, useSites, vars, ...}) = let open Layout in record [("defs", Cardinality.layout defs), ("index", Int.layout (!index)), ("defSites", List.layout Label.layout (!defSites)), ("useSites", List.layout Label.layout (!useSites)), ("vars", List.layout Var.layout (!vars))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val defs = make #defs val (index,index') = make' #index val (_,defSites') = make' #defSites val (_,useSites') = make' #useSites val (ty,ty') = make' #ty end fun addDef (T {defs, ...}) = Cardinality.inc defs fun addDefSite (T {defSites, ...}, l) = List.push(defSites, l) fun addUseSite (T {useSites, ...}, l) = List.push(useSites, l) val violates = Cardinality.isMany o defs fun whenViolates (T {defs, ...}, th) = Cardinality.whenMany (defs, th) fun new (): t = T {defs = Cardinality.new (), index = ref ~1, defSites = ref [], useSites = ref [], ty = ref Type.unit, vars = ref []} fun pushVar (T {vars, ...}, var) = List.push (vars, var) fun popVar (T {vars, ...}) = ignore (List.pop vars) fun peekVar (T {vars, ...}) = case !vars of [] => NONE | h::_ => SOME h end fun restoreFunction {globals: Statement.t vector} = let exception NoViolations val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) fun mkQueue () = let val todo = ref [] in {enque = fn (l, li) => let val queued = LabelInfo.queued li in if !queued then () else (queued := true ; List.push (todo, (l,li))) end, deque = fn () => case !todo of [] => NONE | (l,li)::todo' => (todo := todo'; LabelInfo.queued li := false; SOME (l,li))} end fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end (* check for violations in globals *) fun addDef (x, ty) = let val vi = varInfo x in VarInfo.ty vi := ty ; VarInfo.addDef vi ; VarInfo.whenViolates (vi, fn () => Error.bug "Restore.restore: violation in globals") end val _ = Vector.foreach (globals, fn Statement.T {var, ty, ...} => Option.app (var, fn x => addDef (x, ty))) in fn (f: Function.t) => let val {args, blocks, mayInline, name, returns, raises, start} = Function.dest f (* check for violations *) val violations = ref [] fun addDef (x, ty) = let val vi = varInfo x in if VarInfo.violates vi then () else (VarInfo.ty vi := ty ; VarInfo.addDef vi ; if VarInfo.violates vi then List.push (violations, x) else ()) end val _ = Function.foreachVar (f, addDef) (* escape early *) val _ = if List.isEmpty (!violations) then (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoViolations"]) end); raise NoViolations) else () (* init violations *) val index = Counter.new 0 val violations = Vector.fromListMap (!violations, fn x => let val vi = varInfo x val _ = VarInfo.index vi := (Counter.next index) in x end) val numViolations = Counter.value index (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " Violations: ", Vector.layout Var.layout violations]) end) (* init entryBlock *) val entry = Label.newNoname () val entryBlock = Block.T {label = entry, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} (* compute dominator tree *) val dt = Function.dominatorTree f val dt' = Tree.T (entryBlock, Vector.new1 dt) (* compute df (dominance frontier) *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" *) (* also computes defSites and useSites of violating variables *) (* also computes preds, defs, and uses *) val dtindex = ref 0 fun doitTree (Tree.T (Block.T {label, args, statements, transfer}, children)) = let val li = labelInfo label val _ = LabelInfo.args li := args val _ = Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) val defs = Array.new (numViolations, false) val uses = Array.new (numViolations, false) fun addDef x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addDefSite (varInfo x, label); Array.update (defs, index, true); Array.update (uses, index, false) end else () end fun addUse x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addUseSite (varInfo x, label); Array.update (uses, index, true) end else () end val _ = Transfer.foreachVar (transfer, addUse) val _ = Vector.foreachr (statements, fn Statement.T {var, exp, ...} => (Option.app (var, addDef); Exp.foreachVar (exp, addUse))) val _ = Vector.foreach (args, addDef o #1) val _ = LabelInfo.defs li := Array.toVector defs val _ = LabelInfo.uses li := Array.toVector uses val _ = LabelInfo.live li := Array.new (numViolations, false) val _ = Int.inc dtindex val dtindexMin = !dtindex val _ = LabelInfo.dtindex li := dtindexMin val _ = Vector.foreach(children, doitTree) val dtindexMax = !dtindex fun dominates l = let val dtindex = LabelInfo.dtindex' (labelInfo l) in dtindexMin < dtindex andalso dtindex <= dtindexMax end fun promise () = let val df = ref [] fun addDF l = if List.contains(!df, l, Label.equals) then () else List.push(df,l) val _ = Transfer.foreachLabel (transfer, fn l => if Vector.exists (children, fn Tree.T (b, _) => Label.equals (Block.label b, l)) then () else addDF l) val _ = Vector.foreach (children, fn Tree.T (Block.T {label, ...}, _) => let val li = labelInfo label in Vector.foreach (Promise.force (LabelInfo.df' li), fn l => if dominates l then () else addDF l) end) in Vector.fromList (!df) end val _ = LabelInfo.df li := Promise.delay promise in () end val _ = doitTree dt' (* compute liveness *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val enque = fn l => enque (l, labelInfo l) val vi = varInfo x val index = VarInfo.index' vi val useSites = VarInfo.useSites' vi val _ = List.foreach (useSites, enque) fun doit (_,li) = let val uses = LabelInfo.uses' li val defs = LabelInfo.defs' li val live = LabelInfo.live' li in if Array.sub (live, index) orelse (Vector.sub(defs, index) andalso not (Vector.sub (uses, index))) then () else (Array.update(live, index, true) ; List.foreach (LabelInfo.preds' li, enque)) end fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* insert phi-functions *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" * (beware: Alg. 19.6 (both in the book and as corrected by the * errata) has numerous typos; and this implementation computes sets of * variables that must have phi-functions at a node, which is close to * the algorithm in the book, but the reverse of the algorithm as * corrected by the errata, which computes sets of nodes that must have * a phi-functions for a variable.) *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val vi = varInfo x val index = VarInfo.index' vi val defSites = VarInfo.defSites' vi val _ = List.foreach (defSites, fn l => enque (l, labelInfo l)) fun doit (_,li) = Vector.foreach (Promise.force (LabelInfo.df' li), fn l => let val li = labelInfo l val live = LabelInfo.live' li val phi = LabelInfo.phi li in if Array.sub(live, index) andalso not (List.contains(!phi, x, Var.equals)) then (List.push(phi, x); enque (l, li)) else () end) fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* finalize phi args *) fun visitBlock (Block.T {label, ...}) = let val li = labelInfo label val phi = LabelInfo.phi li val phiArgs = LabelInfo.phiArgs li in phiArgs := Vector.fromList (!phi) ; phi := [] end val _ = visitBlock entryBlock val _ = Vector.foreach (blocks, visitBlock) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (violations, fn x => display (seq [Var.layout x, str " ", VarInfo.layout (varInfo x)])); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", LabelInfo.layout (labelInfo label)])) end) (* rewrite *) val blocks = ref [] fun rewriteVar (x: Var.t) = case VarInfo.peekVar (varInfo x) of NONE => x | SOME x' => x' fun rewriteStatement (addPost: (unit -> unit) -> unit) (Statement.T {var, ty, exp}) = let val exp = Exp.replaceVar (exp, rewriteVar) val var = case var of NONE => NONE | SOME x => let val vi = varInfo x in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x'); SOME x' end else SOME x end in Statement.T {var = var, ty = ty, exp = exp} end local val routeTable: ({dst: Label.t, phiArgs: Var.t vector}, Label.t) HashTable.t = HashTable.new {equals = (fn ({dst = dst1, phiArgs = phiArgs1}, {dst = dst2, phiArgs = phiArgs2}) => Label.equals (dst1, dst2) andalso Vector.equals (phiArgs1, phiArgs2, Var.equals)), hash = (fn {dst, phiArgs} => Hash.combine (Label.hash dst, Hash.vectorMap (phiArgs, Var.hash)))} in fun route dst = let val li = labelInfo dst val phiArgs = LabelInfo.phiArgs' li in if Vector.isEmpty phiArgs then dst else let val phiArgs = Vector.map (phiArgs, valOf o VarInfo.peekVar o varInfo) in HashTable.lookupOrInsert (routeTable, {dst = dst, phiArgs = phiArgs}, fn () => let val route = Label.new dst val args = Vector.map (LabelInfo.args' li, fn (x,ty) => (Var.new x, ty)) val args' = Vector.concat [Vector.map(args, #1), phiArgs] val block = Block.T {label = route, args = args, statements = Vector.new0 (), transfer = Goto {dst = dst, args = args'}} val _ = List.push (blocks, block) in route end) end end end fun rewriteTransfer (t: Transfer.t) = Transfer.replaceLabelVar (t, route, rewriteVar) fun visitBlock' (Block.T {label, args, statements, transfer}) = let val {addPost, post} = mkPost () val li = labelInfo label fun doit x = let val vi = varInfo x val ty = VarInfo.ty' vi in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x') ; (x', ty) end else (x, ty) end val args = Vector.map (args, fn (x, _) => doit x) val phiArgs = Vector.map (LabelInfo.phiArgs' li, fn x => doit x) val args = Vector.concat [args, phiArgs] val statements = if Vector.exists(LabelInfo.defs' li, fn b => b) orelse Vector.exists(LabelInfo.uses' li, fn b => b) then Vector.map (statements, rewriteStatement addPost) else statements val transfer = rewriteTransfer transfer val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} in (block, post) end fun visitBlock block = let val (block, post) = visitBlock' block in List.push (blocks, block) ; post end fun rewrite () = let local val (Block.T {label, args, statements, transfer}, post) = visitBlock' entryBlock val entryBlock = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = List.push (blocks, entryBlock) in val args = args val post = post end val _ = Tree.traverse (dt, visitBlock) val _ = post () in Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = entry} end val f = rewrite () in f end handle NoViolations => f end val traceRestoreFunction = Trace.trace ("Restore.restoreFunction", Func.layout o Function.name, Func.layout o Function.name) val restoreFunction = fn g => let val r = restoreFunction g in fn f => traceRestoreFunction r f end fun restore (Program.T {datatypes, globals, functions, main}) = let val r = restoreFunction {globals = globals} in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, r), main = main} end (* quell unused warning *) val _ = restore end mlton-20210117+dfsg/mlton/ssa/restore.sig000066400000000000000000000010101416264345000201240ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RESTORE_STRUCTS = sig include SHRINK end signature RESTORE = sig include RESTORE_STRUCTS val restoreFunction: {globals: Statement.t vector} -> Function.t -> Function.t val restore: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/restore2.fun000066400000000000000000000613451416264345000202350ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Restore SSA * * Based primarily on Section 19.1 of Appel's "Modern Compiler Implementation in ML", * (but see the caveats in the comments below). * The main deviation is the calculation of liveness of the violating variables, * which is used to predicate the insertion of phi arguments. This is due to * the algorithm's bias towards imperative languages, for which it makes the * assumption that all variables are defined in the start block and all variables * are "used" at exit. * This is "optimized" for restoration of functions with small numbers of violating * variables -- use bool vectors to represent sets of violating variables. * Also, we use a Promise.t to suspend part of the dominance frontier computation. * * Requirements: no violation in globals; this is checked. *) functor Restore2 (S: RESTORE2_STRUCTS): RESTORE2 = struct structure Control = struct open Control fun diagnostics _ = () end open S open Exp Transfer structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector ref, preds: Label.t list ref, defs: bool vector ref, uses: bool vector ref, live: bool array ref, dtindex: int ref, df: Label.t vector Promise.t ref, phi: Var.t list ref, phiArgs: Var.t vector ref, queued: bool ref} fun layout (T {preds, defs, uses, live, dtindex, df, phiArgs, ...}) = let open Layout in record [("preds", List.layout Label.layout (!preds)), ("defs", Vector.layout Bool.layout (!defs)), ("uses", Vector.layout Bool.layout (!uses)), ("live", Array.layout Bool.layout (!live)), ("dtindex", Int.layout (!dtindex)), ("df", Promise.layout (Vector.layout Label.layout) (!df)), ("phiArgs", Vector.layout Var.layout (!phiArgs))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (args, args') = make' #args val (preds, preds') = make' #preds val (defs, defs') = make' #defs val (uses, uses') = make' #uses val (live, live') = make' #live val (dtindex, dtindex') = make' #dtindex val (df, df') = make' #df val (phi, _) = make' #phi val (phiArgs, phiArgs') = make' #phiArgs val (queued, _) = make' #queued end fun new (): t = T {args = ref (Vector.new0 ()), preds = ref [], defs = ref (Vector.new0 ()), uses = ref (Vector.new0 ()), live = ref (Array.new0 ()), dtindex = ref ~1, df = ref (Promise.delay (fn () => Vector.new0 ())), phi = ref [], phiArgs = ref (Vector.new0 ()), queued = ref false} end structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val isOne = isMid val makeOne = makeMid val isMany = isTop val makeMany = makeTop val whenMany = whenTop val inc: t -> unit = fn c => if isZero c then makeOne c else if isOne c then makeMany c else () end structure VarInfo = struct datatype t = T of {defs: Cardinality.t, ty: Type.t ref, index: int ref, defSites: Label.t list ref, useSites: Label.t list ref, vars: Var.t list ref} fun layout (T {defs, index, defSites, useSites, vars, ...}) = let open Layout in record [("defs", Cardinality.layout defs), ("index", Int.layout (!index)), ("defSites", List.layout Label.layout (!defSites)), ("useSites", List.layout Label.layout (!useSites)), ("vars", List.layout Var.layout (!vars))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val defs = make #defs val (index,index') = make' #index val (_,defSites') = make' #defSites val (_,useSites') = make' #useSites val (ty,ty') = make' #ty end fun addDef (T {defs, ...}) = Cardinality.inc defs fun addDefSite (T {defSites, ...}, l) = List.push(defSites, l) fun addUseSite (T {useSites, ...}, l) = List.push(useSites, l) val violates = Cardinality.isMany o defs fun whenViolates (T {defs, ...}, th) = Cardinality.whenMany (defs, th) fun new (): t = T {defs = Cardinality.new (), index = ref ~1, defSites = ref [], useSites = ref [], ty = ref Type.unit, vars = ref []} fun pushVar (T {vars, ...}, var) = List.push (vars, var) fun popVar (T {vars, ...}) = ignore (List.pop vars) fun peekVar (T {vars, ...}) = case !vars of [] => NONE | h::_ => SOME h end fun restoreFunction {globals: Statement.t vector} = let exception NoViolations val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) fun mkQueue () = let val todo = ref [] in {enque = fn (l, li) => let val queued = LabelInfo.queued li in if !queued then () else (queued := true ; List.push (todo, (l,li))) end, deque = fn () => case !todo of [] => NONE | (l,li)::todo' => (todo := todo'; LabelInfo.queued li := false; SOME (l,li))} end fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end (* check for violations in globals *) fun addDef (x, ty) = let val vi = varInfo x in VarInfo.ty vi := ty ; VarInfo.addDef vi ; VarInfo.whenViolates (vi, fn () => Error.bug "Restore2.restore: violation in globals") end val _ = Vector.foreach (globals, fn Statement.T {var, ty, ...} => Option.app (var, fn x => addDef (x, ty))) in fn (f: Function.t) => let val {args, blocks, name, returns, raises, start} = Function.dest f (* check for violations *) val violations = ref [] fun addDef (x, ty) = let val vi = varInfo x in if VarInfo.violates vi then () else (VarInfo.ty vi := ty ; VarInfo.addDef vi ; if VarInfo.violates vi then List.push (violations, x) else ()) end val _ = Function.foreachVar (f, addDef) (* escape early *) val _ = if List.isEmpty (!violations) then (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoViolations"]) end); raise NoViolations) else () (* init violations *) val index = Counter.new 0 val violations = Vector.fromListMap (!violations, fn x => let val vi = varInfo x val _ = VarInfo.index vi := (Counter.next index) in x end) val numViolations = Counter.value index (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " Violations: ", Vector.layout Var.layout violations]) end) (* init entryBlock *) val entry = Label.newNoname () val entryBlock = Block.T {label = entry, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} (* compute dominator tree *) val dt = Function.dominatorTree f val dt' = Tree.T (entryBlock, Vector.new1 dt) (* compute df (dominance frontier) *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" *) (* also computes defSites and useSites of violating variables *) (* also computes preds, defs, and uses *) val dtindex = ref 0 fun doitTree (Tree.T (Block.T {label, args, statements, transfer}, children)) = let val li = labelInfo label val _ = LabelInfo.args li := args val _ = Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) val defs = Array.new (numViolations, false) val uses = Array.new (numViolations, false) fun addDef x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addDefSite (varInfo x, label); Array.update (defs, index, true); Array.update (uses, index, false) end else () end fun addUse x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addUseSite (varInfo x, label); Array.update (uses, index, true) end else () end val _ = Transfer.foreachVar (transfer, addUse) val _ = Vector.foreachr (statements, fn Statement.T {var, exp, ...} => (Option.app (var, addDef); Exp.foreachVar (exp, addUse))) val _ = Vector.foreach (args, addDef o #1) val _ = LabelInfo.defs li := Array.toVector defs val _ = LabelInfo.uses li := Array.toVector uses val _ = LabelInfo.live li := Array.new (numViolations, false) val _ = Int.inc dtindex val dtindexMin = !dtindex val _ = LabelInfo.dtindex li := dtindexMin val _ = Vector.foreach(children, doitTree) val dtindexMax = !dtindex fun dominates l = let val dtindex = LabelInfo.dtindex' (labelInfo l) in dtindexMin < dtindex andalso dtindex <= dtindexMax end fun promise () = let val df = ref [] fun addDF l = if List.contains(!df, l, Label.equals) then () else List.push(df,l) val _ = Transfer.foreachLabel (transfer, fn l => if Vector.exists (children, fn Tree.T (b, _) => Label.equals (Block.label b, l)) then () else addDF l) val _ = Vector.foreach (children, fn Tree.T (Block.T {label, ...}, _) => let val li = labelInfo label in Vector.foreach (Promise.force (LabelInfo.df' li), fn l => if dominates l then () else addDF l) end) in Vector.fromList (!df) end val _ = LabelInfo.df li := Promise.delay promise in () end val _ = doitTree dt' (* compute liveness *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val enque = fn l => enque (l, labelInfo l) val vi = varInfo x val index = VarInfo.index' vi val useSites = VarInfo.useSites' vi val _ = List.foreach (useSites, enque) fun doit (_,li) = let val uses = LabelInfo.uses' li val defs = LabelInfo.defs' li val live = LabelInfo.live' li in if Array.sub (live, index) orelse (Vector.sub(defs, index) andalso not (Vector.sub (uses, index))) then () else (Array.update(live, index, true) ; List.foreach (LabelInfo.preds' li, enque)) end fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* insert phi-functions *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" * (beware: Alg. 19.6 (both in the book and as corrected by the * errata) has numerous typos; and this implementation computes sets of * variables that must have phi-functions at a node, which is close to * the algorithm in the book, but the reverse of the algorithm as * corrected by the errata, which computes sets of nodes that must have * a phi-functions for a variable.) *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val vi = varInfo x val index = VarInfo.index' vi val defSites = VarInfo.defSites' vi val _ = List.foreach (defSites, fn l => enque (l, labelInfo l)) fun doit (_,li) = Vector.foreach (Promise.force (LabelInfo.df' li), fn l => let val li = labelInfo l val live = LabelInfo.live' li val phi = LabelInfo.phi li in if Array.sub(live, index) andalso not (List.contains(!phi, x, Var.equals)) then (List.push(phi, x); enque (l, li)) else () end) fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* finalize phi args *) fun visitBlock (Block.T {label, ...}) = let val li = labelInfo label val phi = LabelInfo.phi li val phiArgs = LabelInfo.phiArgs li in phiArgs := Vector.fromList (!phi) ; phi := [] end val _ = visitBlock entryBlock val _ = Vector.foreach (blocks, visitBlock) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (violations, fn x => display (seq [Var.layout x, str " ", VarInfo.layout (varInfo x)])); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", LabelInfo.layout (labelInfo label)])) end) (* rewrite *) val blocks = ref [] fun rewriteVar (x: Var.t) = case VarInfo.peekVar (varInfo x) of NONE => x | SOME x' => x' fun rewriteStatement addPost (Statement.T {var, ty, exp}) = let val exp = Exp.replaceVar (exp, rewriteVar) val var = case var of NONE => NONE | SOME x => let val vi = varInfo x in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x'); SOME x' end else SOME x end in Statement.T {var = var, ty = ty, exp = exp} end local val routeTable: ({dst: Label.t, phiArgs: Var.t vector}, Label.t) HashTable.t = HashTable.new {equals = (fn ({dst = dst1, phiArgs = phiArgs1}, {dst = dst2, phiArgs = phiArgs2}) => Label.equals (dst1, dst2) andalso Vector.equals (phiArgs1, phiArgs2, Var.equals)), hash = (fn {dst, phiArgs} => Hash.combine (Label.hash dst, Hash.vectorMap (phiArgs, Var.hash)))} in fun route dst = let val li = labelInfo dst val phiArgs = LabelInfo.phiArgs' li in if Vector.isEmpty phiArgs then dst else let val phiArgs = Vector.map (phiArgs, valOf o VarInfo.peekVar o varInfo) in HashTable.lookupOrInsert (routeTable, {dst = dst, phiArgs = phiArgs}, fn () => let val route = Label.new dst val args = Vector.map (LabelInfo.args' li, fn (x,ty) => (Var.new x, ty)) val args' = Vector.concat [Vector.map(args, #1), phiArgs] val block = Block.T {label = route, args = args, statements = Vector.new0 (), transfer = Goto {dst = dst, args = args'}} val _ = List.push (blocks, block) in route end) end end end fun rewriteTransfer (t: Transfer.t) = Transfer.replaceLabelVar (t, route, rewriteVar) fun visitBlock' (Block.T {label, args, statements, transfer}) = let val {addPost, post} = mkPost () val li = labelInfo label fun doit x = let val vi = varInfo x val ty = VarInfo.ty' vi in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x') ; (x', ty) end else (x, ty) end val args = Vector.map (args, fn (x, _) => doit x) val phiArgs = Vector.map (LabelInfo.phiArgs' li, fn x => doit x) val args = Vector.concat [args, phiArgs] val statements = if Vector.exists(LabelInfo.defs' li, fn b => b) orelse Vector.exists(LabelInfo.uses' li, fn b => b) then Vector.map (statements, rewriteStatement addPost) else statements val transfer = rewriteTransfer transfer val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} in (block, post) end fun visitBlock block = let val (block, post) = visitBlock' block in List.push (blocks, block) ; post end fun rewrite () = let local val (Block.T {label, args, statements, transfer}, post) = visitBlock' entryBlock val entryBlock = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = List.push (blocks, entryBlock) in val args = args val post = post end val _ = Tree.traverse (dt, visitBlock) val _ = post () in Function.new {args = args, blocks = Vector.fromList (!blocks), name = name, raises = raises, returns = returns, start = entry} end val f = rewrite () in f end handle NoViolations => f end val traceRestoreFunction = Trace.trace ("Restore2.restoreFunction", Func.layout o Function.name, Func.layout o Function.name) val restoreFunction = fn g => let val r = restoreFunction g in fn f => traceRestoreFunction r f end fun restore (Program.T {datatypes, globals, functions, main}) = let val r = restoreFunction globals in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, r), main = main} end end mlton-20210117+dfsg/mlton/ssa/restore2.sig000066400000000000000000000010141416264345000202120ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature RESTORE2_STRUCTS = sig include SHRINK2 end signature RESTORE2 = sig include RESTORE2_STRUCTS val restoreFunction: {globals: Statement.t vector} -> Function.t -> Function.t val restore: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/share-zero-vec.fun000066400000000000000000000231271416264345000213160ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ShareZeroVec (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp fun transform (Program.T {datatypes, globals, functions, main}) = let val seqIndexSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexSize val (zeroVar, globals) = case Vector.peekMap (globals, fn Statement.T {var, ty, exp} => case (var, exp) of (SOME var, Exp.Const (Const.Word w)) => if WordX.isZero w andalso Type.equals (seqIndexTy, ty) then SOME var else NONE | _ => NONE) of SOME zeroVar => (zeroVar, globals) | _ => let val zeroVar = Var.newString "zero" val zeroVarStmt = Statement.T {var = SOME zeroVar, ty = seqIndexTy, exp = Exp.Const (Const.word (WordX.zero seqIndexSize))} in (zeroVar, Vector.concat [globals, Vector.new1 zeroVarStmt]) end val shrink = shrinkFunction {globals = globals} (* initialize a HashTable for new zero-length array globals *) val newGlobals = ref [] local val hs: (Type.t, Var.t) HashTable.t = HashTable.new {hash = Type.hash, equals = Type.equals} in fun getZeroArrVar (ty: Type.t): Var.t = HashTable.lookupOrInsert (hs, ty, fn () => let val zeroArrVar = Var.newString "zeroArr" val statement = Statement.T {var = SOME zeroArrVar, ty = Type.array ty, exp = PrimApp {args = Vector.new0 (), prim = Prim.Array_array, targs = Vector.new1 ty}} val () = List.push (newGlobals, statement) in zeroArrVar end) end (* splitStmts (stmts, arrVars) * returns (preStmts, (arrVar, arrTy, eltTy, lenVar), postStmts) * when stmts = ...pre... * val arrVar: arrTy = Array_alloc(eltTy) (lenVar) * ...post... * and arrVar in arrVars *) fun splitStmts (stmts, arrVars) = case Vector.peekMapi (stmts, fn Statement.T {var, ty, exp} => case exp of PrimApp ({prim, args, targs}) => (case (var, prim) of (SOME var, Prim.Array_alloc {raw = false}) => if List.contains (arrVars, var, Var.equals) then SOME (var, ty, Vector.first targs, Vector.first args) else NONE | _ => NONE) | _ => NONE) of NONE => NONE | SOME (i, (arrVar, arrTy, eltTy, lenVar)) => SOME (Vector.prefix (stmts, i), (* val arrVar: arrTy = Array_alloc(eltTy) (lenVar) *) (arrVar, arrTy, eltTy, lenVar), Vector.dropPrefix (stmts, i + 1)) fun transformBlock (block, arrVars) = case splitStmts (Block.statements block, arrVars) of NONE => NONE | SOME (preStmts, (arrVar, arrTy, eltTy, lenVar), postStmts) => let val Block.T {label, args, transfer, ...} = block val ifZeroLab = Label.newString "L_zeroLen" val ifNonZeroLab = Label.newString "L_nonZeroLen" val joinLab = Label.newString "L_join" (* new block up to Array_alloc match *) val preBlock = let val isZeroVar = Var.newString "isZero" val newStatements = Vector.new1 (Statement.T {var = SOME isZeroVar, ty = Type.bool, exp = PrimApp {args = Vector.new2 (zeroVar, lenVar), prim = Prim.Word_equal seqIndexSize, targs = Vector.new0 ()}}) val transfer = Transfer.Case {cases = (Cases.Con o Vector.new2) ((Con.truee, ifZeroLab), (Con.falsee, ifNonZeroLab)), default = NONE, test = isZeroVar} in Block.T {label = label, args = args, statements = Vector.concat [preStmts, newStatements], transfer = transfer} end (* new block for if zero array *) val ifZeroBlock = let val transfer = Transfer.Goto {args = Vector.new1 (getZeroArrVar eltTy), dst = joinLab} in Block.T {label = ifZeroLab, args = Vector.new0 (), statements = Vector.new0 (), transfer = transfer} end (* new block for if non-zero array *) val ifNonZeroBlock = let val arrVar' = Var.new arrVar val statements = Vector.new1 (Statement.T {var = SOME arrVar', ty = arrTy, exp = PrimApp {args = Vector.new1 lenVar, prim = Prim.Array_alloc {raw = false}, targs = Vector.new1 eltTy}}) val transfer = Transfer.Goto {args = Vector.new1 arrVar', dst = joinLab} in Block.T {label = ifNonZeroLab, args = Vector.new0 (), statements = statements, transfer = transfer} end (* new block with statements following match *) val joinBlock = Block.T {label = joinLab, args = Vector.new1 (arrVar, arrTy), statements = postStmts, transfer = transfer} in SOME (preBlock, ifZeroBlock, ifNonZeroBlock, joinBlock) end val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f (* analysis: compile a list of array vars cast to vectors *) val arrVars = Vector.fold (blocks, [], fn (Block.T {statements, ...}, acc) => Vector.fold (statements, acc, fn (Statement.T {exp, ...}, acc) => case exp of PrimApp ({prim, args, ...}) => (case prim of Prim.Array_toVector => (Vector.first args)::acc | _ => acc) | _ => acc)) in if List.isEmpty arrVars then f (* no Array_toVector found in the function *) else (* transformation: branch and join at Array_alloc *) let fun doBlock (b, acc) = case transformBlock (b, arrVars) of NONE => b::acc | SOME (preBlock, ifZeroBlock, ifNonZeroBlock, joinBlock) => doBlock (joinBlock, ifNonZeroBlock::ifZeroBlock::preBlock::acc) val blocks = Vector.fold (blocks, [], doBlock) val blocks = Vector.fromListRev blocks in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end end) val globals = Vector.concat [globals, Vector.fromList (!newGlobals)] in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end mlton-20210117+dfsg/mlton/ssa/shrink.fun000066400000000000000000001571021416264345000177630ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Shrink (S: SHRINK_STRUCTS): SHRINK = struct open S structure Exp = struct open Exp val isProfile = fn Profile _ => true | _ => false end structure Statement = struct open Statement fun isProfile (T {exp, ...}) = Exp.isProfile exp end structure Array = struct open Array fun inc (a: int t, i: int): unit = update (a, i, 1 + sub (a, i)) fun dec (a: int t, i: int): unit = update (a, i, sub (a, i) - 1) end datatype z = datatype Exp.t datatype z = datatype Transfer.t structure VarInfo = struct datatype t = T of {isUsed: bool ref, numOccurrences: int ref, ty: Type.t option, value: value option ref, var: Var.t} and value = Con of {con: Con.t, args: t vector} | Const of Const.t | Select of {tuple: t, offset: int} | Tuple of t vector fun equals (T {var = x, ...}, T {var = y, ...}) = Var.equals (x, y) fun layout (T {isUsed, numOccurrences, ty, value, var}) = let open Layout in record [("isUsed", Bool.layout (!isUsed)), ("numOccurrences", Int.layout (!numOccurrences)), ("ty", Option.layout Type.layout ty), ("value", Option.layout layoutValue (!value)), ("var", Var.layout var)] end and layoutValue v = let open Layout in case v of Con {con, args} => seq [Con.layout con, Vector.layout layout args] | Const c => Const.layout c | Select {tuple, offset} => seq [str "#", Int.layout (offset + 1), str " ", layout tuple] | Tuple vis => Vector.layout layout vis end fun new (x: Var.t, ty: Type.t option) = T {isUsed = ref false, numOccurrences = ref 0, ty = ty, value = ref NONE, var = x} fun setValue (T {value, ...}, v) = (Assert.assert ("Ssa.Shrink.VarInfo.setValue", fn () => Option.isNone (!value)) ; value := SOME v) fun numOccurrences (T {numOccurrences = r, ...}) = r fun ty (T {ty, ...}): Type.t option = ty fun value (T {value, ...}): value option = !value fun var (T {var, ...}): Var.t = var end structure Value = struct datatype t = datatype VarInfo.value end structure Position = struct datatype t = Formal of int | Free of Var.t fun layout (p: t) = case p of Formal i => Int.layout i | Free x => Var.layout x val equals = fn (Formal i, Formal i') => i = i' | (Free x, Free x') => Var.equals (x, x') | _ => false end structure Positions = MonoVector (Position) structure LabelMeaning = struct datatype t = T of {aux: aux, blockIndex: int, (* The index of the block *) label: Label.t} (* redundant, the label of the block *) and aux = Block | Bug | Case of {canMove: Statement.t list, cases: (Con.t, Label.t) Cases.t, default: Label.t option} | Goto of {canMove: Statement.t list, dst: t, args: Positions.t} | Raise of {args: Positions.t, canMove: Statement.t list} | Return of {args: Positions.t, canMove: Statement.t list} local fun make f (T r) = f r in val aux = make #aux val blockIndex = make #blockIndex end fun layout (T {aux, label, ...}) = let open Layout in seq [Label.layout label, str " ", case aux of Block => str "Block " | Bug => str "Bug" | Case _ => str "Case" | Goto {dst, args, ...} => seq [str "Goto ", tuple [layout dst, Positions.layout args]] | Raise {args, ...} => seq [str "Raise ", Positions.layout args] | Return {args, ...} => seq [str "Return ", Positions.layout args]] end end structure State = struct datatype state = Unvisited | Visited of LabelMeaning.t | Visiting val layout = let open Layout in fn Unvisited => str "Unvisited" | Visited m => LabelMeaning.layout m | Visiting => str "Visiting" end end val traceApplyInfo = Trace.info "Ssa.Shrink.Prim.apply" fun shrinkFunction {globals: Statement.t vector} = let fun use (VarInfo.T {isUsed, var, ...}): Var.t = (isUsed := true ; var) fun uses (vis: VarInfo.t vector): Var.t vector = Vector.map (vis, use) (* varInfo can't be getSetOnce because of setReplacement. *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initFun (fn x => VarInfo.new (x, NONE))) (* Property.getSet (Var.plist, Property.initFun VarInfo.new) *) val setVarInfo = Trace.trace2 ("Ssa.Shrink.setVarInfo", Var.layout, VarInfo.layout, Unit.layout) setVarInfo fun varInfos xs = Vector.map (xs, varInfo) fun simplifyVar (x: Var.t) = use (varInfo x) val simplifyVar = Trace.trace ("Ssa.Shrink.simplifyVar", Var.layout, Var.layout) simplifyVar fun simplifyVars xs = Vector.map (xs, simplifyVar) fun incVarInfo (x: VarInfo.t): unit = Int.inc (VarInfo.numOccurrences x) fun incVar (x: Var.t): unit = incVarInfo (varInfo x) fun incVars xs = Vector.foreach (xs, incVar) fun numVarOccurrences (x: Var.t): int = ! (VarInfo.numOccurrences (varInfo x)) val _ = Vector.foreach (globals, fn Statement.T {var, exp, ty} => let val _ = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun construct v = Option.app (var, fn x => VarInfo.setValue (varInfo x, v)) in case exp of ConApp {con, args} => construct (Value.Con {con = con, args = Vector.map (args, varInfo)}) | Const c => construct (Value.Const c) | Select {tuple, offset} => construct (Value.Select {tuple = varInfo tuple, offset = offset}) | Tuple xs => construct (Value.Tuple (Vector.map (xs, varInfo))) | Var y => Option.app (var, fn x => setVarInfo (x, varInfo y)) | _ => () end) in fn f: Function.t => let val _ = Function.clear f val {args, blocks, mayInline, name, raises, returns, start, ...} = Function.dest f val _ = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) (* Index the labels by their defining block in blocks. *) val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val numBlocks = Vector.length blocks (* Do a DFS to compute occurrence counts and set label meanings *) val states = Array.array (numBlocks, State.Unvisited) val inDegree = Array.array (numBlocks, 0) fun addLabelIndex i = Array.inc (inDegree, i) val isHeader = Array.array (numBlocks, false) val numHandlerUses = Array.array (numBlocks, 0) fun layoutLabel (l: Label.t): Layout.t = let val i = labelIndex l in Layout.record [("label", Label.layout l), ("inDegree", Int.layout (Array.sub (inDegree, i)))] end fun incAux aux = case aux of LabelMeaning.Goto {dst, ...} => addLabelIndex (LabelMeaning.blockIndex dst) | _ => () fun incLabel (l: Label.t): unit = incLabelMeaning (labelMeaning l) and incLabelMeaning (LabelMeaning.T {aux, blockIndex, ...}): unit = let val i = blockIndex val n = Array.sub (inDegree, i) val _ = Array.update (inDegree, i, 1 + n) in if n = 0 then incAux aux else () end and labelMeaning (l: Label.t): LabelMeaning.t = let val i = labelIndex l in case Array.sub (states, i) of State.Visited m => m | State.Visiting => (Array.update (isHeader, i, true) ; (LabelMeaning.T {aux = LabelMeaning.Block, blockIndex = i, label = Block.label (Vector.sub (blocks, i))})) | State.Unvisited => let val _ = Array.update (states, i, State.Visiting) val m = computeMeaning i val _ = Array.update (states, i, State.Visited m) in m end end and computeMeaning (i: int): LabelMeaning.t = let val Block.T {args, statements, transfer, ...} = Vector.sub (blocks, i) val _ = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) val _ = Vector.foreach (statements, fn s => Exp.foreachVar (Statement.exp s, incVar)) fun extract (actuals: Var.t vector): Positions.t = let val {get: Var.t -> Position.t, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initFun Position.Free) val _ = Vector.foreachi (args, fn (i, (x, _)) => set (x, Position.Formal i)) val ps = Vector.map (actuals, get) val _ = destroy () in ps end fun doit aux = LabelMeaning.T {aux = aux, blockIndex = i, label = Block.label (Vector.sub (blocks, i))} fun normal () = doit LabelMeaning.Block fun canMove () = Vector.toListMap (statements, fn Statement.T {exp, ty, ...} => Statement.T {exp = exp, ty = ty, var = NONE}) fun rr (xs: Var.t vector, make) = let val _ = incVars xs (* val n = Vector.length statements fun loop (i, ac) = if i = n then if 0 = Vector.length xs orelse 0 < Vector.length args then doit (make {args = extract xs, canMove = rev ac}) else normal () else let val Statement.T {exp, ty, ...} = Vector.sub (statements, i) in if Exp.isProfile exp then loop (i + 1, Statement.T {exp = exp, ty = ty, var = NONE} :: ac) else normal () end in loop (0, []) end *) in if Vector.forall (statements, Statement.isProfile) andalso (0 = Vector.length xs orelse 0 < Vector.length args) then doit (make {args = extract xs, canMove = canMove ()}) else normal () end in case transfer of Bug => if Vector.forall (statements, Statement.isProfile) andalso (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then doit LabelMeaning.Bug else normal () | Call {args, return, ...} => let val _ = incVars args val _ = Return.foreachHandler (return, fn l => Array.inc (numHandlerUses, labelIndex l)) val _ = Return.foreachLabel (return, incLabel) in normal () end | Case {test, cases, default} => let val _ = incVar test val _ = Cases.foreach (cases, incLabel) val _ = Option.app (default, incLabel) in if Vector.forall (statements, Statement.isProfile) andalso not (Array.sub (isHeader, i)) andalso 1 = Vector.length args andalso 1 = numVarOccurrences test andalso Var.equals (test, #1 (Vector.first args)) then doit (LabelMeaning.Case {canMove = canMove (), cases = cases, default = default}) else normal () end | Goto {dst, args = actuals} => let val _ = incVars actuals val m = labelMeaning dst in if Vector.exists (statements, not o Statement.isProfile) orelse Array.sub (isHeader, i) then (incLabelMeaning m ; normal ()) else if Vector.isEmpty statements andalso Vector.equals (args, actuals, fn ((x, _), x') => Var.equals (x, x') andalso 1 = numVarOccurrences x) then m (* It's an eta. *) else let val ps = extract actuals val n = Vector.fold (args, 0, fn ((x, _), n) => n + numVarOccurrences x) val n' = Vector.fold (ps, 0, fn (p, n) => case p of Position.Formal _ => n + 1 | _ => n) datatype z = datatype LabelMeaning.aux in if n <> n' then (incLabelMeaning m ; normal ()) else let fun extract (ps': Positions.t) : Positions.t = Vector.map (ps', fn p => let datatype z = datatype Position.t in case p of Free x => Free x | Formal i => Vector.sub (ps, i) end) val canMove' = canMove () val a = case LabelMeaning.aux m of Block => Goto {canMove = canMove', dst = m, args = ps} | Bug => if (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then Bug else Goto {canMove = canMove', dst = m, args = ps} | Case _ => Goto {canMove = canMove', dst = m, args = ps} | Goto {canMove, dst, args} => Goto {canMove = canMove' @ canMove, dst = dst, args = extract args} | Raise {args, canMove} => Raise {args = extract args, canMove = canMove' @ canMove} | Return {args, canMove} => Return {args = extract args, canMove = canMove' @ canMove} in doit a end end end | Raise xs => rr (xs, LabelMeaning.Raise) | Return xs => rr (xs, LabelMeaning.Return) | Runtime {args, return, ...} => (incVars args ; incLabel return ; normal ()) end val _ = incLabel start fun indexMeaning i = case Array.sub (states, i) of State.Visited m => m | _ => Error.bug "Ssa.Shrink.indexMeaning: not computed" val indexMeaning = Trace.trace ("Ssa.Shrink.indexMeaning", Int.layout, LabelMeaning.layout) indexMeaning val labelMeaning = indexMeaning o labelIndex val labelMeaning = Trace.trace ("Ssa.Shrink.labelMeaning", Label.layout, LabelMeaning.layout) labelMeaning fun meaningLabel m = Block.label (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun labelArgs l = Block.args (Vector.sub (blocks, labelIndex l)) fun meaningArgs m = Block.args (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun save (f, s) = let val {destroy, controlFlowGraph, ...} = Function.layoutDot (f, Var.layout) in File.withOut (concat ["/tmp/", Func.toString (Function.name f), ".", s, ".dot"], fn out => Layout.outputl (controlFlowGraph, out)) ; destroy () end val _ = if true then () else save (f, "pre") (* *) val _ = if true then () else Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) val _ = Assert.assert ("Ssa.Shrink.labelMeanings", fn () => let val inDegree' = Array.array (numBlocks, 0) fun bumpIndex i = Array.inc (inDegree', i) fun bumpMeaning m = bumpIndex (LabelMeaning.blockIndex m) val bumpLabel = bumpMeaning o labelMeaning fun doit (LabelMeaning.T {aux, blockIndex, ...}) = let datatype z = datatype LabelMeaning.aux in case aux of Block => Transfer.foreachLabel (Block.transfer (Vector.sub (blocks, blockIndex)), bumpLabel) | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, bumpLabel) ; Option.app (default, bumpLabel)) | Goto {dst, ...} => bumpMeaning dst | Raise _ => () | Return _ => () end val _ = Array.foreachi (states, fn (i, s) => if Array.sub (inDegree, i) > 0 then (case s of State.Visited m => doit m | _ => ()) else ()) val _ = bumpMeaning (labelMeaning start) in Array.equals (inDegree, inDegree', Int.equals) orelse let val _ = Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("inDegree'", Int.layout (Array.sub (inDegree', i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) in false end end) val isBlock = Array.array (numBlocks, false) (* Functions for maintaining inDegree. *) val addLabelIndex = fn i => (Assert.assert ("Ssa.Shrink.addLabelIndex", fn () => Array.sub (inDegree, i) > 0) ; addLabelIndex i) val addLabelMeaning = addLabelIndex o LabelMeaning.blockIndex fun layoutLabelMeaning m = Layout.record [("inDegree", Int.layout (Array.sub (inDegree, LabelMeaning.blockIndex m))), ("meaning", LabelMeaning.layout m)] val traceDeleteLabelMeaning = Trace.trace ("SSa.Shrink.deleteLabelMeaning", layoutLabelMeaning, Unit.layout) fun deleteLabel l = deleteLabelMeaning (labelMeaning l) and deleteLabelMeaning arg: unit = traceDeleteLabelMeaning (fn (m: LabelMeaning.t) => let val i = LabelMeaning.blockIndex m val n = Array.sub (inDegree, i) - 1 val _ = Array.update (inDegree, i, n) val _ = Assert.assert ("Ssa.Shrink.deleteLabelMeaning", fn () => n >= 0) in if n = 0 (* andalso not (Array.sub (isBlock, i)) *) then let datatype z = datatype LabelMeaning.aux in case LabelMeaning.aux m of Block => let val t = Block.transfer (Vector.sub (blocks, i)) val _ = Transfer.foreachLabel (t, deleteLabel) val _ = case t of Transfer.Call {return, ...} => Return.foreachHandler (return, fn l => Array.dec (numHandlerUses, (LabelMeaning.blockIndex (labelMeaning l)))) | _ => () in () end | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)) | Goto {dst, ...} => deleteLabelMeaning dst | Raise _ => () | Return _ => () end else () end) arg fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.T {value = ref (SOME v), ...} => (case v of Value.Con {con, args} => if Vector.isEmpty args then Prim.ApplyArg.Con {con = con, hasArg = false} else Prim.ApplyArg.Var vi | Value.Const c => Prim.ApplyArg.Const c | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) in Trace.traceInfo' (traceApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (Var.layout o VarInfo.var)) args] end, Prim.ApplyResult.layout (Var.layout o VarInfo.var)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (* Another DFS, this time accumulating the new blocks. *) val traceForceMeaningBlock = Trace.trace ("Ssa.Shrink.forceMeaningBlock", layoutLabelMeaning, Unit.layout) val traceSimplifyBlock = Trace.trace2 ("Ssa.Shrink.simplifyBlock", List.layout Statement.layout, layoutLabel o Block.label, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceGotoMeaning = Trace.trace3 ("Ssa.Shrink.gotoMeaning", List.layout Statement.layout, layoutLabelMeaning, Vector.layout VarInfo.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceEvalStatement = Trace.trace ("Ssa.Shrink.evalStatement", Statement.layout, Layout.ignore: (Statement.t list -> Statement.t list) -> Layout.t) val traceSimplifyTransfer = Trace.trace ("Ssa.Shrink.simplifyTransfer", Transfer.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceSimplifyCase = Trace.trace ("Ssa.Shrink2.simplifyCase", fn {canMove, cases, default, test, ...} => Layout.record [("canMove", List.layout Statement.layout canMove), ("cantSimplify", Layout.str "fn () => ..."), ("gone", Layout.str "fn () => ..."), ("test", VarInfo.layout test), ("cases/default", (Transfer.layout o Transfer.Case) {cases = cases, default = default, test = VarInfo.var test})], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val newBlocks = ref [] fun simplifyLabel l = let val m = labelMeaning l val _ = forceMeaningBlock m in meaningLabel m end and forceMeaningBlock arg = traceForceMeaningBlock (fn (LabelMeaning.T {aux, blockIndex = i, ...}) => if Array.sub (isBlock, i) then () else let val _ = Array.update (isBlock, i, true) val block as Block.T {label, args, ...} = Vector.sub (blocks, i) fun extract (p: Position.t): VarInfo.t = varInfo (case p of Position.Formal n => #1 (Vector.sub (args, n)) | Position.Free x => x) val (statements, transfer) = let fun rr ({args, canMove}, make) = (canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => simplifyBlock ([], block) | Bug => ([], Transfer.Bug) | Case _ => simplifyBlock ([], block) | Goto {canMove, dst, args} => gotoMeaning (canMove, dst, Vector.map (args, extract)) | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end val _ = List.push (newBlocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in () end) arg and simplifyBlock arg : Statement.t list * Transfer.t = traceSimplifyBlock (fn (canMoveIn, Block.T {statements, transfer, ...}) => let val f = evalStatements statements val (ss, transfer) = simplifyTransfer transfer in (canMoveIn @ (f ss), transfer) end) arg and evalStatements (ss: Statement.t vector) : Statement.t list -> Statement.t list = let val fs = Vector.map (ss, evalStatement) in fn ss => Vector.foldr (fs, ss, fn (f, ss) => f ss) end and simplifyTransfer arg : Statement.t list * Transfer.t = traceSimplifyTransfer (fn (t: Transfer.t) => case t of Bug => ([], Bug) | Call {func, args, return} => let val (statements, return) = case return of Return.NonTail {cont, handler} => let fun isEta (m: LabelMeaning.t, ps: Position.t vector): bool = Vector.length ps = Vector.length (meaningArgs m) andalso Vector.foralli (ps, fn (i, Position.Formal i') => i = i' | _ => false) val m = labelMeaning cont fun nonTail handler = let val _ = forceMeaningBlock m val handler = Handler.map (handler, fn l => let val m = labelMeaning l val _ = forceMeaningBlock m in meaningLabel m end) in ([], Return.NonTail {cont = meaningLabel m, handler = handler}) end fun tail statements = (deleteLabelMeaning m ; (statements, Return.Tail)) fun cont (handler, handlerEta) = case LabelMeaning.aux m of LabelMeaning.Bug => (case handlerEta of NONE => nonTail handler | SOME canMove => tail canMove) | LabelMeaning.Return {args, canMove} => if isEta (m, args) then tail canMove else nonTail handler | _ => nonTail handler in case handler of Handler.Caller => cont (handler, NONE) | Handler.Dead => cont (handler, NONE) | Handler.Handle l => let val m = labelMeaning l in case LabelMeaning.aux m of LabelMeaning.Bug => cont (handler, NONE) | LabelMeaning.Raise {args, canMove} => if isEta (m, args) then cont (if List.isEmpty canMove then Handler.Caller else handler, SOME canMove) else nonTail handler | _ => nonTail handler end end | _ => ([], return) in (statements, Call {func = func, args = simplifyVars args, return = return}) end | Case {test, cases, default} => let val test = varInfo test fun cantSimplify () = ([], Case {test = use test, cases = Cases.map (cases, simplifyLabel), default = Option.map (default, simplifyLabel)}) in simplifyCase {canMove = [], cantSimplify = cantSimplify, cases = cases, default = default, gone = fn () => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)), test = test} end | Goto {dst, args} => goto (dst, varInfos args) | Raise xs => ([], Raise (simplifyVars xs)) | Return xs => ([], Return (simplifyVars xs)) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = simplifyVars args, return = simplifyLabel return}) ) arg and simplifyCase arg : Statement.t list * Transfer.t = traceSimplifyCase (fn {canMove, cantSimplify, cases, default, gone, test: VarInfo.t} => let (* tryToEliminate makes sure that the destination meaning * hasn't already been simplified. If it has, then we can't * simplify the case. *) fun tryToEliminate m = let val i = LabelMeaning.blockIndex m in if Array.sub (inDegree, i) = 0 then cantSimplify () else let val _ = addLabelIndex i val _ = gone () in gotoMeaning (canMove, m, Vector.new0 ()) end end in if Cases.isEmpty cases then (case default of NONE => (canMove, Bug) | SOME l => tryToEliminate (labelMeaning l)) else let val l = Cases.hd cases fun isOk (l': Label.t): bool = Label.equals (l, l') in if Vector.isEmpty (labelArgs l) andalso Cases.forall (cases, isOk) andalso (case default of NONE => true | SOME l => isOk l) then (* All cases the same -- eliminate the case. *) tryToEliminate (labelMeaning l) else let fun findCase (cases, isCon, args) = let val n = Vector.length cases fun doit (l, args) = let val m = labelMeaning l val _ = addLabelMeaning m val _ = gone () in gotoMeaning (canMove, m, args) end fun loop k = if k = n then (case default of NONE => (gone (); ([], Bug)) | SOME l => doit (l, Vector.new0 ())) else let val (con, l) = Vector.sub (cases, k) in if isCon con then doit (l, args) else loop (k + 1) end in loop 0 end in case (VarInfo.value test, cases) of (SOME (Value.Const c), _) => (case (cases, c) of (Cases.Word (_, cs), Const.Word w) => findCase (cs, fn w' => WordX.equals (w, w'), Vector.new0 ()) | _ => Error.bug "Ssa.Shrink.simplifyCases: strange constant") | (SOME (Value.Con {con, args}), Cases.Con cases) => findCase (cases, fn c => Con.equals (con, c), args) | _ => cantSimplify () end end end) arg and goto (dst: Label.t, args: VarInfo.t vector) : Statement.t list * Transfer.t = gotoMeaning ([], labelMeaning dst, args) and gotoMeaning arg : Statement.t list * Transfer.t = traceGotoMeaning (fn (canMoveIn, m as LabelMeaning.T {aux, blockIndex = i, ...}, args: VarInfo.t vector) => let val n = Array.sub (inDegree, i) val _ = Assert.assert ("Ssa.Shrink.gotoMeaning", fn () => n >= 1) fun normal () = if n = 1 then let val _ = Array.update (inDegree, i, 0) val b = Vector.sub (blocks, i) val _ = Vector.foreach2 (Block.args b, args, fn ((x, _), vi) => setVarInfo (x, vi)) in simplifyBlock (canMoveIn, b) end else let val _ = forceMeaningBlock m in (canMoveIn, Goto {dst = Block.label (Vector.sub (blocks, i)), args = uses args}) end fun extract p = case p of Position.Formal n => Vector.sub (args, n) | Position.Free x => varInfo x fun rr ({args, canMove}, make) = (canMoveIn @ canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => normal () | Bug => ((*canMoveIn*)[], Transfer.Bug) | Case {canMove, cases, default} => simplifyCase {canMove = canMoveIn @ canMove, cantSimplify = normal, cases = cases, default = default, gone = fn () => deleteLabelMeaning m, test = Vector.first args} | Goto {canMove, dst, args} => if Array.sub (isHeader, i) orelse Array.sub (isBlock, i) then normal () else let val n' = n - 1 val _ = Array.update (inDegree, i, n') val _ = if n' > 0 then addLabelMeaning dst else () in gotoMeaning (canMoveIn @ canMove, dst, Vector.map (args, extract)) end | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end) arg and evalStatement arg : Statement.t list -> Statement.t list = traceEvalStatement (fn (Statement.T {var, ty, exp}) => let val _ = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun delete ss = ss fun doit {makeExp: unit -> Exp.t, sideEffect: bool, value: Value.t option} = let fun make var = Statement.T {var = var, ty = ty, exp = makeExp ()} in case var of NONE => if sideEffect then (fn ss => make NONE :: ss) else delete | SOME x => let val VarInfo.T {isUsed, value = r, ...} = varInfo x val _ = r := value in fn ss => if !isUsed then make (SOME x) :: ss else if sideEffect then make NONE :: ss else ss end end fun setVar vi = (Option.app (var, fn x => setVarInfo (x, vi)) ; delete) fun construct (v: Value.t, makeExp) = doit {makeExp = makeExp, sideEffect = false, value = SOME v} in case exp of ConApp {con, args} => let val args = varInfos args in construct (Value.Con {con = con, args = args}, fn () => ConApp {con = con, args = uses args}) end | Const c => construct (Value.Const c, fn () => exp) | PrimApp {prim, targs, args} => let val args = varInfos args fun apply {prim, targs, args} = doit {sideEffect = Prim.maySideEffect prim, makeExp = fn () => PrimApp {prim = prim, targs = targs, args = uses args}, value = NONE} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args) => apply {prim = prim, targs = Vector.new0 (), args = Vector.fromList args} | Bool b => let val con = Con.fromBool b in construct (Value.Con {con = con, args = Vector.new0 ()}, fn () => ConApp {con = con, args = Vector.new0 ()}) end | Const c => construct (Value.Const c, fn () => Exp.Const c) | Var vi => setVar vi | _ => apply {prim = prim, targs = targs, args = args} end | Select {tuple, offset} => let val tuple as VarInfo.T {value, ...} = varInfo tuple in case !value of SOME (Value.Tuple vs) => setVar (Vector.sub (vs, offset)) | _ => construct (Value.Select {tuple = tuple, offset = offset}, fn () => Select {tuple = use tuple, offset = offset}) end | Tuple xs => let val xs = varInfos xs in case Exn.withEscape (fn escape => Vector.foldri (xs, NONE, fn (i, VarInfo.T {value, ...}, tuple') => case !value of SOME (Value.Select {offset, tuple}) => if offset = i then case tuple' of NONE => (case VarInfo.ty tuple of SOME ty => (case Type.deTupleOpt ty of SOME ts => if Vector.length xs = Vector.length ts then SOME tuple else escape NONE | NONE => escape NONE) | NONE => escape NONE) | SOME tuple'' => if VarInfo.equals (tuple'', tuple) then tuple' else escape NONE else escape NONE | _ => escape NONE)) of SOME tuple => setVar tuple | NONE => construct (Value.Tuple xs, fn () => Tuple (uses xs)) end | Var x => setVar (varInfo x) | _ => doit {makeExp = fn () => exp, sideEffect = true, value = NONE} end) arg val start = labelMeaning start val _ = forceMeaningBlock start val f = Function.new {args = args, blocks = Vector.fromList (!newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = meaningLabel start} val _ = if true then () else save (f, "post") val _ = Function.clear f in f end end fun eliminateUselessProfile (f: Function.t): Function.t = if !Control.profile = Control.ProfileNone then f else let fun eliminateInBlock (b as Block.T {args, label, statements, transfer}) : Block.t = if not (Vector.exists (statements, Statement.isProfile)) then b else let datatype z = datatype Exp.t datatype z = datatype ProfileExp.t val stack = Vector.fold (statements, [], fn (s as Statement.T {exp, ...}, stack) => case exp of Profile (Leave si) => (case stack of Statement.T {exp = Profile (Enter si'), ...} :: rest => if SourceInfo.equals (si, si') then rest else Error.bug "Ssa.Shrink.eliminateUselessProfile: mismatched Leave" | _ => s :: stack) | _ => s :: stack) val statements = Vector.fromListRev stack in Block.T {args = args, label = label, statements = statements, transfer = transfer} end val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, eliminateInBlock) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val traceShrinkFunction = Trace.trace ("Ssa.Shrink.shrinkFunction", Function.layout, Function.layout) val shrinkFunction = fn g => let val s = shrinkFunction g in fn f => traceShrinkFunction s (eliminateUselessProfile f) end fun shrink (Program.T {datatypes, globals, functions, main}) = let val s = shrinkFunction {globals = globals} in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, s), main = main} end end mlton-20210117+dfsg/mlton/ssa/shrink.sig000066400000000000000000000010061416264345000177440ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SHRINK_STRUCTS = sig include PREPASSES end signature SHRINK = sig include SHRINK_STRUCTS val shrinkFunction: {globals: Statement.t vector} -> Function.t -> Function.t val shrink: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/shrink2.fun000066400000000000000000001711441416264345000200470ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Shrink2 (S: SHRINK2_STRUCTS): SHRINK2 = struct open S structure Statement = struct open Statement fun isProfile (s: t): bool = case s of Profile _ => true | _ => false end structure Array = struct open Array fun inc (a: int t, i: int): unit = update (a, i, 1 + sub (a, i)) fun dec (a: int t, i: int): unit = update (a, i, sub (a, i) - 1) end datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure VarInfo = struct datatype t = T of {isUsed: bool ref, numOccurrences: int ref, ty: Type.t option, value: value option ref, var: Var.t} and value = Const of Const.t | Inject of {sum: Tycon.t, variant: t} | Object of {args: t vector, con: Con.t option} | Select of {object: t, offset: int} fun equals (T {var = x, ...}, T {var = y, ...}) = Var.equals (x, y) fun layout (T {isUsed, numOccurrences, ty, value, var}) = let open Layout in record [("isUsed", Bool.layout (!isUsed)), ("numOccurrences", Int.layout (!numOccurrences)), ("ty", Option.layout Type.layout ty), ("value", Option.layout layoutValue (!value)), ("var", Var.layout var)] end and layoutValue v = let open Layout in case v of Const c => Const.layout c | Inject {sum, variant} => seq [layout variant, str ": ", Tycon.layout sum] | Object {args, con} => let val args = Vector.layout layout args in case con of NONE => args | SOME con => seq [Con.layout con, args] end | Select {object, offset} => seq [str "#", Int.layout (offset + 1), str " ", layout object] end fun new (x: Var.t, ty: Type.t option) = T {isUsed = ref false, numOccurrences = ref 0, ty = ty, value = ref NONE, var = x} fun setValue (T {value, ...}, v) = (Assert.assert ("Ssa2.Shrink2.VarInfo.setValue", fn () => Option.isNone (!value)) ; value := SOME v) fun numOccurrences (T {numOccurrences = r, ...}) = r fun ty (T {ty, ...}): Type.t option = ty fun value (T {value, ...}): value option = !value fun var (T {var, ...}): Var.t = var end structure Value = struct datatype t = datatype VarInfo.value end structure Position = struct datatype t = Formal of int | Free of Var.t fun layout (p: t) = case p of Formal i => Int.layout i | Free x => Var.layout x val equals = fn (Formal i, Formal i') => i = i' | (Free x, Free x') => Var.equals (x, x') | _ => false end structure Positions = MonoVector (Position) structure LabelMeaning = struct datatype t = T of {aux: aux, blockIndex: int, (* The index of the block *) label: Label.t} (* redundant, the label of the block *) and aux = Block | Bug | Case of {canMove: Statement.t list, cases: (Con.t, Label.t) Cases.t, default: Label.t option} | Goto of {canMove: Statement.t list, dst: t, args: Positions.t} | Raise of {args: Positions.t, canMove: Statement.t list} | Return of {args: Positions.t, canMove: Statement.t list} local fun make f (T r) = f r in val aux = make #aux val blockIndex = make #blockIndex end fun layout (T {aux, label, ...}) = let open Layout in seq [Label.layout label, str " ", case aux of Block => str "Block " | Bug => str "Bug" | Case _ => str "Case" | Goto {dst, args, ...} => seq [str "Goto ", tuple [layout dst, Positions.layout args]] | Raise {args, ...} => seq [str "Raise ", Positions.layout args] | Return {args, ...} => seq [str "Return ", Positions.layout args]] end end structure State = struct datatype state = Unvisited | Visited of LabelMeaning.t | Visiting val layout = let open Layout in fn Unvisited => str "Unvisited" | Visited m => LabelMeaning.layout m | Visiting => str "Visiting" end end val traceApplyInfo = Trace.info "Ssa2.Shrink2.Prim.apply" fun shrinkFunction {globals: Statement.t vector} = let fun use (VarInfo.T {isUsed, var, ...}): Var.t = (isUsed := true ; var) fun uses (vis: VarInfo.t vector): Var.t vector = Vector.map (vis, use) (* varInfo can't be getSetOnce because of setReplacement. *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initFun (fn x => VarInfo.new (x, NONE))) val setVarInfo = Trace.trace2 ("Ssa2.Shrink2.setVarInfo", Var.layout, VarInfo.layout, Unit.layout) setVarInfo fun varInfos xs = Vector.map (xs, varInfo) fun simplifyVar (x: Var.t) = use (varInfo x) val simplifyVar = Trace.trace ("Ssa2.Shrink2.simplifyVar", Var.layout, Var.layout) simplifyVar fun simplifyVars xs = Vector.map (xs, simplifyVar) fun incVarInfo (x: VarInfo.t): unit = Int.inc (VarInfo.numOccurrences x) fun incVar (x: Var.t): unit = incVarInfo (varInfo x) fun incVars xs = Vector.foreach (xs, incVar) fun numVarOccurrences (x: Var.t): int = ! (VarInfo.numOccurrences (varInfo x)) val () = Vector.foreach (globals, fn s => case s of Bind {exp, ty, var} => let val () = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun construct v = Option.app (var, fn x => VarInfo.setValue (varInfo x, v)) in case exp of Const c => construct (Value.Const c) | Object {args, con} => construct (Value.Object {args = Vector.map (args, varInfo), con = con}) | Select {base, offset} => (case base of Base.Object x => construct (Value.Select {object = varInfo x, offset = offset}) | _ => ()) | Var y => Option.app (var, fn x => setVarInfo (x, varInfo y)) | _ => () end | _ => ()) in fn f: Function.t => let val () = Function.clear f val {args, blocks, mayInline, name, raises, returns, start, ...} = Function.dest f val () = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) (* Index the labels by their defining block in blocks. *) val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val () = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val numBlocks = Vector.length blocks (* Do a DFS to compute occurrence counts and set label meanings *) val states = Array.array (numBlocks, State.Unvisited) val inDegree = Array.array (numBlocks, 0) fun addLabelIndex i = Array.inc (inDegree, i) val isHeader = Array.array (numBlocks, false) val numHandlerUses = Array.array (numBlocks, 0) fun layoutLabel (l: Label.t): Layout.t = let val i = labelIndex l in Layout.record [("label", Label.layout l), ("inDegree", Int.layout (Array.sub (inDegree, i)))] end fun incAux aux = case aux of LabelMeaning.Goto {dst, ...} => addLabelIndex (LabelMeaning.blockIndex dst) | _ => () fun incLabel (l: Label.t): unit = incLabelMeaning (labelMeaning l) and incLabelMeaning (LabelMeaning.T {aux, blockIndex, ...}): unit = let val i = blockIndex val n = Array.sub (inDegree, i) val () = Array.update (inDegree, i, 1 + n) in if n = 0 then incAux aux else () end and labelMeaning (l: Label.t): LabelMeaning.t = let val i = labelIndex l in case Array.sub (states, i) of State.Visited m => m | State.Visiting => (Array.update (isHeader, i, true) ; (LabelMeaning.T {aux = LabelMeaning.Block, blockIndex = i, label = Block.label (Vector.sub (blocks, i))})) | State.Unvisited => let val () = Array.update (states, i, State.Visiting) val m = computeMeaning i val () = Array.update (states, i, State.Visited m) in m end end and computeMeaning (i: int): LabelMeaning.t = let val Block.T {args, statements, transfer, ...} = Vector.sub (blocks, i) val () = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) val () = Vector.foreach (statements, fn s => Statement.foreachUse (s, incVar)) fun extract (actuals: Var.t vector): Positions.t = let val {get: Var.t -> Position.t, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initFun Position.Free) val () = Vector.foreachi (args, fn (i, (x, _)) => set (x, Position.Formal i)) val ps = Vector.map (actuals, get) val () = destroy () in ps end fun doit aux = LabelMeaning.T {aux = aux, blockIndex = i, label = Block.label (Vector.sub (blocks, i))} fun normal () = doit LabelMeaning.Block fun canMove () = Vector.toList statements fun rr (xs: Var.t vector, make) = let val () = incVars xs (* val n = Vector.length statements fun loop (i, ac) = if i = n then if 0 = Vector.length xs orelse 0 < Vector.length args then doit (make {args = extract xs, canMove = rev ac}) else normal () else let val s = Vector.sub (statements, i) in if Statement.isProfile s then loop (i + 1, s :: ac) else normal () end in loop (0, []) end *) in if Vector.forall (statements, Statement.isProfile) andalso (0 = Vector.length xs orelse 0 < Vector.length args) then doit (make {args = extract xs, canMove = canMove ()}) else normal () end in case transfer of Bug => if Vector.isEmpty statements andalso (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then doit LabelMeaning.Bug else normal () | Call {args, return, ...} => let val () = incVars args val () = Return.foreachHandler (return, fn l => Array.inc (numHandlerUses, labelIndex l)) val () = Return.foreachLabel (return, incLabel) in normal () end | Case {test, cases, default} => let val () = incVar test val () = Cases.foreach (cases, incLabel) val () = Option.app (default, incLabel) in if Vector.forall(statements, Statement.isProfile) andalso not (Array.sub (isHeader, i)) andalso 1 = Vector.length args andalso 1 = numVarOccurrences test andalso Var.equals (test, #1 (Vector.first args)) then doit (LabelMeaning.Case {canMove = canMove (), cases = cases, default = default}) else normal () end | Goto {dst, args = actuals} => let val () = incVars actuals val m = labelMeaning dst in if Vector.exists (statements, not o Statement.isProfile) orelse Array.sub (isHeader, i) then (incLabelMeaning m ; normal ()) else if Vector.isEmpty statements andalso Vector.equals (args, actuals, fn ((x, _), x') => Var.equals (x, x') andalso 1 = numVarOccurrences x) then m (* It's an eta. *) else let val ps = extract actuals val n = Vector.fold (args, 0, fn ((x, _), n) => n + numVarOccurrences x) val n' = Vector.fold (ps, 0, fn (p, n) => case p of Position.Formal _ => n + 1 | _ => n) datatype z = datatype LabelMeaning.aux in if n <> n' then (incLabelMeaning m ; normal ()) else let fun extract (ps': Positions.t) : Positions.t = Vector.map (ps', fn p => let datatype z = datatype Position.t in case p of Free x => Free x | Formal i => Vector.sub (ps, i) end) val canMove' = canMove () val a = case LabelMeaning.aux m of Block => Goto {canMove = canMove', dst = m, args = ps} | Bug => if (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then Bug else Goto {canMove = canMove', dst = m, args = ps} | Case _ => Goto {canMove = canMove', dst = m, args = ps} | Goto {canMove, dst, args} => Goto {canMove = canMove' @ canMove, dst = dst, args = extract args} | Raise {args, canMove} => Raise {args = extract args, canMove = canMove' @ canMove} | Return {args, canMove} => Return {args = extract args, canMove = canMove' @ canMove} in doit a end end end | Raise xs => rr (xs, LabelMeaning.Raise) | Return xs => rr (xs, LabelMeaning.Return) | Runtime {args, return, ...} => (incVars args ; incLabel return ; normal ()) end val () = incLabel start fun indexMeaning i = case Array.sub (states, i) of State.Visited m => m | _ => Error.bug "Ssa2.Shrink2.indexMeaning: not computed" val indexMeaning = Trace.trace ("Ssa2.Shrink2.indexMeaning", Int.layout, LabelMeaning.layout) indexMeaning val labelMeaning = indexMeaning o labelIndex val labelMeaning = Trace.trace ("Ssa2.Shrink2.labelMeaning", Label.layout, LabelMeaning.layout) labelMeaning fun meaningLabel m = Block.label (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun labelArgs l = Block.args (Vector.sub (blocks, labelIndex l)) fun meaningArgs m = Block.args (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun save (f, s) = let val {destroy, controlFlowGraph, ...} = Function.layoutDot (f, Var.layout) in File.withOut (concat ["/tmp/", Func.toString (Function.name f), ".", s, ".dot"], fn out => Layout.outputl (controlFlowGraph, out)) ; destroy () end val () = if true then () else save (f, "pre") (* *) val () = if true then () else Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) val () = Assert.assert ("Ssa2.Shrink2.labelMeanings", fn () => let val inDegree' = Array.array (numBlocks, 0) fun bumpIndex i = Array.inc (inDegree', i) fun bumpMeaning m = bumpIndex (LabelMeaning.blockIndex m) val bumpLabel = bumpMeaning o labelMeaning fun doit (LabelMeaning.T {aux, blockIndex, ...}) = let datatype z = datatype LabelMeaning.aux in case aux of Block => Transfer.foreachLabel (Block.transfer (Vector.sub (blocks, blockIndex)), bumpLabel) | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, bumpLabel) ; Option.app (default, bumpLabel)) | Goto {dst, ...} => bumpMeaning dst | Raise _ => () | Return _ => () end val () = Array.foreachi (states, fn (i, s) => if Array.sub (inDegree, i) > 0 then (case s of State.Visited m => doit m | _ => ()) else ()) val () = bumpMeaning (labelMeaning start) in Array.equals (inDegree, inDegree', Int.equals) orelse let val () = Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("inDegree'", Int.layout (Array.sub (inDegree', i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) in false end end) val isBlock = Array.array (numBlocks, false) (* Functions for maintaining inDegree. *) val addLabelIndex = fn i => (Assert.assert ("Ssa2.Shrink2.addLabelIndex", fn () => Array.sub (inDegree, i) > 0) ; addLabelIndex i) val addLabelMeaning = addLabelIndex o LabelMeaning.blockIndex fun layoutLabelMeaning m = Layout.record [("inDegree", Int.layout (Array.sub (inDegree, LabelMeaning.blockIndex m))), ("meaning", LabelMeaning.layout m)] val traceDeleteLabelMeaning = Trace.trace ("Ssa2.Shrink2.deleteLabelMeaning", layoutLabelMeaning, Unit.layout) fun deleteLabel l = deleteLabelMeaning (labelMeaning l) and deleteLabelMeaning arg: unit = traceDeleteLabelMeaning (fn (m: LabelMeaning.t) => let val i = LabelMeaning.blockIndex m val n = Array.sub (inDegree, i) - 1 val () = Array.update (inDegree, i, n) val () = Assert.assert ("Ssa2.Shrink2.deleteLabelMeaning", fn () => n >= 0) in if n = 0 (* andalso not (Array.sub (isBlock, i)) *) then let datatype z = datatype LabelMeaning.aux in case LabelMeaning.aux m of Block => let val t = Block.transfer (Vector.sub (blocks, i)) val () = Transfer.foreachLabel (t, deleteLabel) val () = case t of Transfer.Call {return, ...} => Return.foreachHandler (return, fn l => Array.dec (numHandlerUses, (LabelMeaning.blockIndex (labelMeaning l)))) | _ => () in () end | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)) | Goto {dst, ...} => deleteLabelMeaning dst | Raise _ => () | Return _ => () end else () end) arg fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.T {value = ref (SOME v), ...} => (case v of Value.Const c => Prim.ApplyArg.Const c | Value.Object {args, con} => (case (con, Vector.length args) of (SOME con, 0) => Prim.ApplyArg.Con {con = con, hasArg = false} | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) in Trace.traceInfo' (traceApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (Var.layout o VarInfo.var)) args] end, Prim.ApplyResult.layout (Var.layout o VarInfo.var)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (* Another DFS, this time accumulating the new blocks. *) val traceForceMeaningBlock = Trace.trace ("Ssa2.Shrink2.forceMeaningBlock", layoutLabelMeaning, Unit.layout) val traceSimplifyBlock = Trace.trace2 ("Ssa2.Shrink2.simplifyBlock", List.layout Statement.layout, layoutLabel o Block.label, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceGotoMeaning = Trace.trace3 ("Ssa2.Shrink2.gotoMeaning", List.layout Statement.layout, layoutLabelMeaning, Vector.layout VarInfo.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceEvalStatement = Trace.trace ("Ssa2.Shrink2.evalStatement", Statement.layout, Layout.ignore: (Statement.t list -> Statement.t list) -> Layout.t) val traceSimplifyTransfer = Trace.trace ("Ssa2.Shrink2.simplifyTransfer", Transfer.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceSimplifyCase = Trace.trace ("Ssa2.Shrink2.simplifyCase", fn {canMove, cases, default, test, ...} => Layout.record [("canMove", List.layout Statement.layout canMove), ("cantSimplify", Layout.str "fn () => ..."), ("gone", Layout.str "fn () => ..."), ("test", VarInfo.layout test), ("cases/default", (Transfer.layout o Transfer.Case) {cases = cases, default = default, test = VarInfo.var test})], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val newBlocks = ref [] fun simplifyLabel l = let val m = labelMeaning l val () = forceMeaningBlock m in meaningLabel m end and forceMeaningBlock arg = traceForceMeaningBlock (fn (LabelMeaning.T {aux, blockIndex = i, ...}) => if Array.sub (isBlock, i) then () else let val () = Array.update (isBlock, i, true) val block as Block.T {label, args, ...} = Vector.sub (blocks, i) fun extract (p: Position.t): VarInfo.t = varInfo (case p of Position.Formal n => #1 (Vector.sub (args, n)) | Position.Free x => x) val (statements, transfer) = let fun rr ({args, canMove}, make) = (canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => simplifyBlock ([], block) | Bug => ([], Transfer.Bug) | Case _ => simplifyBlock ([], block) | Goto {canMove, dst, args} => gotoMeaning (canMove, dst, Vector.map (args, extract)) | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end val () = List.push (newBlocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in () end) arg and simplifyBlock arg : Statement.t list * Transfer.t = traceSimplifyBlock (fn (canMoveIn, Block.T {statements, transfer, ...}) => let val f = evalStatements statements val (ss, transfer) = simplifyTransfer transfer in (canMoveIn @ (f ss), transfer) end) arg and evalStatements (ss: Statement.t vector) : Statement.t list -> Statement.t list = let val fs = Vector.map (ss, evalStatement) in fn ss => Vector.foldr (fs, ss, fn (f, ss) => f ss) end and simplifyTransfer arg : Statement.t list * Transfer.t = traceSimplifyTransfer (fn (t: Transfer.t) => case t of Bug => ([], Bug) | Call {func, args, return} => let val (statements, return) = case return of Return.NonTail {cont, handler} => let fun isEta (m: LabelMeaning.t, ps: Position.t vector): bool = Vector.length ps = Vector.length (meaningArgs m) andalso Vector.foralli (ps, fn (i, Position.Formal i') => i = i' | _ => false) val m = labelMeaning cont fun nonTail handler = let val () = forceMeaningBlock m val handler = Handler.map (handler, fn l => let val m = labelMeaning l val () = forceMeaningBlock m in meaningLabel m end) in ([], Return.NonTail {cont = meaningLabel m, handler = handler}) end fun tail statements = (deleteLabelMeaning m ; (statements, Return.Tail)) fun cont (handler, handlerEta) = case LabelMeaning.aux m of LabelMeaning.Bug => (case handlerEta of NONE => nonTail handler | SOME canMove => tail canMove) | LabelMeaning.Return {args, canMove} => if isEta (m, args) then tail canMove else nonTail handler | _ => nonTail handler in case handler of Handler.Caller => cont (handler, NONE) | Handler.Dead => cont (handler, NONE) | Handler.Handle l => let val m = labelMeaning l in case LabelMeaning.aux m of LabelMeaning.Bug => cont (handler, NONE) | LabelMeaning.Raise {args, canMove} => if isEta (m, args) then cont (if List.isEmpty canMove then Handler.Caller else handler, SOME canMove) else nonTail handler | _ => nonTail handler end end | _ => ([], return) in (statements, Call {func = func, args = simplifyVars args, return = return}) end | Case {test, cases, default} => let val test = varInfo test fun cantSimplify () = ([], Case {test = use test, cases = Cases.map (cases, simplifyLabel), default = Option.map (default, simplifyLabel)}) in simplifyCase {canMove = [], cantSimplify = cantSimplify, cases = cases, default = default, gone = fn () => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)), test = test} end | Goto {dst, args} => goto (dst, varInfos args) | Raise xs => ([], Raise (simplifyVars xs)) | Return xs => ([], Return (simplifyVars xs)) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = simplifyVars args, return = simplifyLabel return}) ) arg and simplifyCase arg : Statement.t list * Transfer.t = traceSimplifyCase (fn {canMove, cantSimplify, cases, default, gone, test: VarInfo.t} => let (* tryToEliminate makes sure that the destination meaning * hasn't already been simplified. If it has, then we can't * simplify the case. *) fun tryToEliminate m = let val i = LabelMeaning.blockIndex m in if Array.sub (inDegree, i) = 0 then cantSimplify () else let val () = addLabelIndex i val () = gone () in gotoMeaning (canMove, m, Vector.new0 ()) end end in if Cases.isEmpty cases then (case default of NONE => ([], Bug) | SOME l => tryToEliminate (labelMeaning l)) else let val l = Cases.hd cases fun isOk (l': Label.t): bool = Label.equals (l, l') in if Vector.isEmpty (labelArgs l) andalso Cases.forall (cases, isOk) andalso (case default of NONE => true | SOME l => isOk l) then (* All cases the same -- eliminate the case. *) tryToEliminate (labelMeaning l) else let fun findCase (cases, isCon, args) = let val n = Vector.length cases fun doit (l, args) = let val args = if Vector.isEmpty (labelArgs l) then Vector.new0 () else args val m = labelMeaning l val () = addLabelMeaning m val () = gone () in gotoMeaning (canMove, m, args) end fun loop k = if k = n then (case default of NONE => (gone (); ([], Bug)) | SOME l => doit (l, Vector.new0 ())) else let val (con, l) = Vector.sub (cases, k) in if isCon con then doit (l, args) else loop (k + 1) end in loop 0 end in case (VarInfo.value test, cases) of (SOME (Value.Const c), _) => (case (cases, c) of (Cases.Word (_, cs), Const.Word w) => findCase (cs, fn w' => WordX.equals (w, w'), Vector.new0 ()) | _ => Error.bug "Ssa2.Shrink2.simplifyCase: strange constant") | (SOME (Value.Inject {variant, ...}), Cases.Con cases) => let val VarInfo.T {value, ...} = variant in case !value of SOME (Value.Object {con = SOME con, ...}) => findCase (cases, fn c => Con.equals (con, c), Vector.new1 variant) | _ => cantSimplify () end | _ => cantSimplify () end end end) arg and goto (dst: Label.t, args: VarInfo.t vector) : Statement.t list * Transfer.t = gotoMeaning ([], labelMeaning dst, args) and gotoMeaning arg : Statement.t list * Transfer.t = traceGotoMeaning (fn (canMoveIn, m as LabelMeaning.T {aux, blockIndex = i, ...}, args: VarInfo.t vector) => let val n = Array.sub (inDegree, i) val () = Assert.assert ("Ssa2.Shrink2.gotoMeaning", fn () => n >= 1) fun normal () = if n = 1 then let val () = Array.update (inDegree, i, 0) val b = Vector.sub (blocks, i) val () = Vector.foreach2 (Block.args b, args, fn ((x, _), vi) => setVarInfo (x, vi)) in simplifyBlock (canMoveIn, b) end else let val () = forceMeaningBlock m in (canMoveIn, Goto {dst = Block.label (Vector.sub (blocks, i)), args = uses args}) end fun extract p = case p of Position.Formal n => Vector.sub (args, n) | Position.Free x => varInfo x fun rr ({args, canMove}, make) = (canMoveIn @ canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => normal () | Bug => ((*canMoveIn*)[], Transfer.Bug) | Case {canMove, cases, default} => simplifyCase {canMove = canMoveIn @ canMove, cantSimplify = normal, cases = cases, default = default, gone = fn () => deleteLabelMeaning m, test = Vector.first args} | Goto {canMove, dst, args} => if Array.sub (isHeader, i) orelse Array.sub (isBlock, i) then normal () else let val n' = n - 1 val () = Array.update (inDegree, i, n') val () = if n' > 0 then addLabelMeaning dst else () in gotoMeaning (canMoveIn @ canMove, dst, Vector.map (args, extract)) end | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end) arg and evalBind {exp, ty, var} = let val () = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun delete ss = ss fun doit {makeExp: unit -> Exp.t, sideEffect: bool, value: Value.t option} = let fun make var = Bind {exp = makeExp (), ty = ty, var = var} in case var of NONE => if sideEffect then (fn ss => make NONE :: ss) else delete | SOME x => let val VarInfo.T {isUsed, value = r, ...} = varInfo x val () = r := value in fn ss => if !isUsed then make (SOME x) :: ss else if sideEffect then make NONE :: ss else ss end end fun simple {sideEffect} = let fun makeExp () = Exp.replaceVar (exp, use o varInfo) in doit {makeExp = makeExp, sideEffect = sideEffect, value = NONE} end fun setVar vi = (Option.app (var, fn x => setVarInfo (x, vi)) ; delete) fun construct (v: Value.t, makeExp) = doit {makeExp = makeExp, sideEffect = false, value = SOME v} fun tuple (xs: VarInfo.t vector) = case (Exn.withEscape (fn escape => let fun no () = escape NONE in Vector.foldri (xs, NONE, fn (i, VarInfo.T {value, ...}, tuple') => case !value of SOME (Value.Select {object, offset}) => (if i = offset then case tuple' of NONE => (case VarInfo.ty object of NONE => no () | SOME ty => (case Type.dest ty of Type.Object {args, con = ObjectCon.Tuple} => if Prod.length args = Vector.length xs andalso Prod.allAreImmutable args then SOME object else no () | _ => no ())) | SOME tuple'' => if VarInfo.equals (tuple'', object) then tuple' else no () else no ()) | _ => no ()) end)) of NONE => construct (Value.Object {args = xs, con = NONE}, fn () => Object {args = uses xs, con = NONE}) | SOME object => setVar object in case exp of Const c => construct (Value.Const c, fn () => exp) | Inject {sum, variant} => let val variant = varInfo variant in construct (Value.Inject {sum = sum, variant = variant}, fn () => Inject {sum = sum, variant = use variant}) end | Object {args, con} => let val args = varInfos args val isMutable = case Type.dest ty of Type.Object {args, ...} => Prod.someIsMutable args | _ => Error.bug "strange Object type" in (* It would be nice to improve this code to do * reconstruction when isSome con, not just for * tuples. *) if isMutable orelse isSome con then construct (Value.Object {args = args, con = con}, fn () => Object {args = uses args, con = con}) else tuple args end | PrimApp {args, prim} => let val args = varInfos args fun apply {prim, args} = doit {makeExp = fn () => PrimApp {args = uses args, prim = prim}, sideEffect = Prim.maySideEffect prim, value = NONE} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args) => apply {prim = prim, args = Vector.fromList args} | Bool b => let val variant = Var.newNoname () val con = Con.fromBool b in evalStatements (Vector.new2 (Bind {exp = Object {args = Vector.new0 (), con = SOME con}, ty = Type.object {args = Prod.empty (), con = ObjectCon.Con con}, var = SOME variant}, Bind {exp = Inject {sum = Tycon.bool, variant = variant}, ty = Type.bool, var = var})) end | Const c => construct (Value.Const c, fn () => Exp.Const c) | Var vi => setVar vi | _ => apply {args = args, prim = prim} end | Select {base, offset} => (case base of Base.Object object => let val object as VarInfo.T {ty, value, ...} = varInfo object fun dontChange () = construct (Value.Select {object = object, offset = offset}, fn () => Select {base = Base.Object (use object), offset = offset}) in case (ty, !value) of (SOME ty, SOME (Value.Object {args, ...})) => (case Type.dest ty of Type.Object {args = targs, ...} => (* Can't simplify the select if the * field is mutable. *) if (#isMutable (Vector.sub (Prod.dest targs, offset))) then dontChange () else setVar (Vector.sub (args, offset)) | _ => Error.bug "Ssa2.Shrink2.evalBind: Select:non object") | _ => dontChange () end | Base.SequenceSub _ => simple {sideEffect = false}) | Sequence _ => simple {sideEffect = false} | Var x => setVar (varInfo x) end and evalStatement arg : Statement.t list -> Statement.t list = traceEvalStatement (fn s => let fun simple () = fn ss => Statement.replaceUses (s, use o varInfo) :: ss in case s of Bind b => evalBind b | Profile _ => simple () | Update _ => simple () end) arg val start = labelMeaning start val () = forceMeaningBlock start val f = Function.new {args = args, blocks = Vector.fromList (!newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = meaningLabel start} val () = if true then () else save (f, "post") val () = Function.clear f in f end end fun eliminateUselessProfile (f: Function.t): Function.t = if !Control.profile = Control.ProfileNone then f else let fun eliminateInBlock (b as Block.T {args, label, statements, transfer}) : Block.t = if not (Vector.exists (statements, Statement.isProfile)) then b else let datatype z = datatype Exp.t datatype z = datatype ProfileExp.t val stack = Vector.fold (statements, [], fn (s, stack) => case s of Profile (Leave si) => (case stack of Profile (Enter si') :: rest => if SourceInfo.equals (si, si') then rest else Error.bug "Ssa2.Shrink2.eliminateUselessProfile: mismatched Leave" | _ => s :: stack) | _ => s :: stack) val statements = Vector.fromListRev stack in Block.T {args = args, label = label, statements = statements, transfer = transfer} end val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, eliminateInBlock) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val traceShrinkFunction = Trace.trace ("Ssa2.Shrink2.shrinkFunction", Function.layout, Function.layout) val shrinkFunction = fn g => let val s = shrinkFunction g in fn f => traceShrinkFunction s (eliminateUselessProfile f) end fun shrink (Program.T {datatypes, globals, functions, main}) = let val s = shrinkFunction {globals = globals} val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, s), main = main} val () = Program.clear program in program end fun eliminateDeadBlocksFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val () = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val () = Vector.foreach (blocks, rem o Block.label) in f end fun eliminateDeadBlocks (Program.T {datatypes, globals, functions, main}) = let val functions = List.revMap (functions, eliminateDeadBlocksFunction) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end mlton-20210117+dfsg/mlton/ssa/shrink2.sig000066400000000000000000000010111416264345000200220ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SHRINK2_STRUCTS = sig include PREPASSES2 end signature SHRINK2 = sig include SHRINK2_STRUCTS val shrinkFunction: {globals: Statement.t vector} -> Function.t -> Function.t val shrink: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/simplify-types.fun000066400000000000000000001065271416264345000214700ustar00rootroot00000000000000(* Copyright (C) 2009,2018,2020 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* This pass must happen before polymorphic equality is implemented because * 1. it will make polymorphic equality faster because some types are simpler * 2. it removes uses of polymorphic equality that must return true * * This pass computes a "cardinality" of each datatype, which is an * abstraction of the number of values of the datatype. * Zero means the datatype has no values (except for bottom). * One means the datatype has one value (except for bottom). * Many means the datatype has many values. * * This pass removes all datatypes whose cardinality is Zero or One * and removes * components of tuples * function args * constructor args * which are such datatypes. * * This pass marks constructors as one of * Useless: it never appears in a ConApp. * Transparent: it is the only variant in its datatype * and its argument type does not contain any uses of * Tycon.array or Tycon.vector. * Useful: otherwise * This pass also removes Useless and Transparent constructors. * * We must keep track of Transparent constructors whose argument type * uses Tycon.array because of datatypes like the following: * datatype t = T of t array * Such a datatype has Cardinality.Many, but we cannot eliminate * the datatype and replace the lhs by the rhs, i.e. we must keep the * circularity around. * Must do similar things for vectors. * * Also, to eliminate as many Transparent constructors as possible, for * something like the following, * datatype t = T of u array * and u = U of t vector * we (arbitrarily) expand one of the datatypes first. * The result will be something like * datatype u = U of u array array * where all uses of t are replaced by u array. *) functor SimplifyTypes (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S open Exp Transfer structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val newZero = new val isOne = isMid val makeOne = makeMid val whenOne = whenMid val makeMany = makeTop val whenMany = whenTop local fun mkNew (make: t -> unit) () = let val c = newZero () in make c; c end in val newOne = mkNew makeOne val newMany = mkNew makeMany end val one = newOne () val many = newMany () structure Card = struct datatype t = Zero | One | Many fun toCard c = if isZero c then Zero else if isOne c then One else Many fun sum esc (c1, c2) = case (toCard c1, c2) of (Zero, c2) => c2 | (c1, Zero) => c1 | _ => esc Many fun prod esc (c1, c2) = case (toCard c1, c2) of (Zero, _) => esc Zero | (_, Zero) => esc Zero | (One, One) => One | _ => Many end local fun make (f, id) cs = let val c' = newZero () fun doit () = case (Exn.withEscape (fn escape => Vector.fold (cs, id, f escape))) of Card.Zero => () | Card.One => makeOne c' | Card.Many => makeMany c' val () = Vector.foreach (cs, fn c => (whenOne (c, doit); whenMany (c, doit))) val () = doit () in c' end in val sum = make (Card.sum, Card.Zero) val prod = make (Card.prod, Card.One) end end structure ConRep = struct datatype t = Useless | Transparent | Useful val isUseful = fn Useful => true | _ => false val isUseless = fn Useless => true | _ => false val toString = fn Useless => "useless" | Transparent => "transparent" | Useful => "useful" val layout = Layout.str o toString end structure Result = struct datatype 'a t = Dead | Delete | Keep of 'a fun layout layoutX = let open Layout in fn Dead => str "Dead" | Delete => str "Delete" | Keep x => seq [str "Keep ", layoutX x] end end fun transform (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> {args: Type.t vector, cardinality: Cardinality.t, rep: ConRep.t ref}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("SimplifyTypes.conInfo", Con.layout)) val conInfo = Trace.trace ("SimplifyTypes.conInfo", Con.layout, fn {args, cardinality, rep} => Layout.record [("args", Vector.layout Type.layout args), ("cardinality", Cardinality.layout cardinality), ("rep", ConRep.layout (!rep))]) conInfo local fun make sel = sel o conInfo fun make' sel = let val get = make sel in (! o get, fn (c, x) => get c := x) end in val conArgs = make #args val conCardinality = make #cardinality val (conRep, setConRep) = make' #rep end val setConRep = Trace.trace2 ("SimplifyTypes.setConRep", Con.layout, ConRep.layout, Unit.layout) setConRep val conIsUseful = ConRep.isUseful o conRep val conIsUseful = Trace.trace ("SimplifyTypes.conIsUseful", Con.layout, Bool.layout) conIsUseful val {get = tyconInfo: Tycon.t -> {cardinality: Cardinality.t, numCons: int ref, replacement: Type.t option ref}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("SimplifyTypes.tyconInfo", Tycon.layout)) local fun make sel = sel o tyconInfo fun make' sel = let val get = make sel in (! o get, fn (t, x) => get t := x) end in val tyconCardinality = make #cardinality val (tyconNumCons, setTyconNumCons) = make' #numCons val (tyconReplacement, setTyconReplacement) = make' #replacement end (* Initialize conInfo and typeInfo *) fun initTyconInfo tycon = setTyconInfo (tycon, {cardinality = Cardinality.newZero (), numCons = ref 0, replacement = ref NONE}) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (initTyconInfo tycon; Vector.foreach (cons, fn {con, args} => setConInfo (con, {args = args, cardinality = Cardinality.newZero (), rep = ref ConRep.Useless})))) (* Tentatively mark all constructors appearing in a ConApp as Useful * (some may later be marked as Useless or Transparent). * Mark any tycons created by MLton_bogus as cardinality Many. *) val _ = let fun setConRepUseful c = setConRep (c, ConRep.Useful) fun handleStatement (Statement.T {exp, ...}) = case exp of ConApp {con, ...} => setConRepUseful con | PrimApp {prim, targs, ...} => (case prim of Prim.MLton_bogus => (case Type.dest (Vector.sub (targs, 0)) of Type.Datatype tycon => Cardinality.makeOne (tyconCardinality tycon) | _ => ()) | _ => ()) | _ => () (* Booleans are special because they are generated by primitives. *) val _ = setConRepUseful Con.truee val _ = setConRepUseful Con.falsee val _ = Vector.foreach (globals, handleStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, ...} => Vector.foreach (statements, handleStatement))) in () end (* Compute the type cardinalities with a fixed point * over the Cardinality lattice. *) val {get = typeCardinality, destroy = destroyTypeCardinality} = Property.destGet (Type.plist, Property.initRec (fn (t, typeCardinality) => let fun ptrCard t = (Cardinality.prod o Vector.new2) (typeCardinality t, Cardinality.many) fun tupleCard ts = (Cardinality.prod o Vector.map) (ts, typeCardinality) fun vecCard t = (Cardinality.sum o Vector.new2) (Cardinality.one, (Cardinality.prod o Vector.new2) (typeCardinality t, Cardinality.many)) datatype z = datatype Type.dest in case Type.dest t of Array _ => Cardinality.many | CPointer => Cardinality.many | Datatype tycon => tyconCardinality tycon | IntInf => Cardinality.many | Real _ => Cardinality.many | Ref t => ptrCard t | Thread => Cardinality.many | Tuple ts => tupleCard ts | Vector t => vecCard t | Weak t => ptrCard t | Word _ => Cardinality.many end)) (* Remove useless constructors from datatypes. * Lower-bound cardinality of cons by product of arguments. * Lower-bound cardinality of tycons by sum of cons. *) val tyconVoid = Tycon.newString "void" val _ = initTyconInfo tyconVoid val typeVoid = Type.datatypee tyconVoid val typeIsVoid = fn t => Type.equals (t, typeVoid) val origDatatypes = datatypes val datatypes = Vector.map (datatypes, fn Datatype.T {tycon, cons} => let val cons = Vector.keepAll (cons, conIsUseful o #con) val _ = Cardinality.<= (Cardinality.sum (Vector.map (cons, conCardinality o #con)), tyconCardinality tycon) val _ = Vector.foreach (cons, fn {con, args} => Cardinality.<= (Cardinality.prod (Vector.map (args, typeCardinality)), conCardinality con)) in Datatype.T {tycon = tycon, cons = cons} end) (* diagnostic *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (origDatatypes, fn Datatype.T {tycon, cons} => (display (seq [str "cardinality of ", Tycon.layout tycon, str " = ", Cardinality.layout (tyconCardinality tycon)]); Vector.foreach (cons, fn {con, ...} => (display (seq [str "rep of ", Con.layout con, str " = ", ConRep.layout (conRep con)]); display (seq [str "cardinality of ", Con.layout con, str " = ", Cardinality.layout (conCardinality con)]))))) end) fun transparent (tycon, con, args) = (setTyconNumCons (tycon, 1) ; setTyconReplacement (tycon, SOME (Type.tuple args)) ; setConRep (con, ConRep.Transparent)) (* "unary" are datatypes with one constructor * whose rhs contains an array (or vector) type. * For datatypes with one variant not containing an array type, * eliminate the datatype. *) fun containsArrayOrVector (ty: Type.t): bool = let datatype z = datatype Type.dest fun loop t = case Type.dest t of Array _ => true | Ref t => loop t | Tuple ts => Vector.exists (ts, loop) | Vector _ => true | Weak t => loop t | _ => false in loop ty end val (datatypes, unary) = Vector.fold (datatypes, ([], []), fn (Datatype.T {tycon, cons}, (datatypes, unary)) => let (* remove all cons with zero cardinality and mark them as useless *) val cons = Vector.keepAllMap (cons, fn c as {con, ...} => if Cardinality.isZero (conCardinality con) then (setConRep (con, ConRep.Useless) ; NONE) else SOME c) in case Vector.length cons of 0 => (setTyconNumCons (tycon, 0) ; if Cardinality.isZero (tyconCardinality tycon) then setTyconReplacement (tycon, SOME typeVoid) else setTyconReplacement (tycon, SOME Type.unit) ; (datatypes, unary)) | 1 => let val {con, args} = Vector.first cons in if Vector.exists (args, containsArrayOrVector) then (datatypes, {tycon = tycon, con = con, args = args} :: unary) else (transparent (tycon, con, args) ; (datatypes, unary)) end | _ => (Datatype.T {tycon = tycon, cons = cons} :: datatypes, unary) end) fun containsTycon (ty: Type.t, tyc: Tycon.t): bool = let datatype z = datatype Type.dest val {get = containsTycon, destroy = destroyContainsTycon} = Property.destGet (Type.plist, Property.initRec (fn (t, containsTycon) => case Type.dest t of Array t => containsTycon t | Datatype tyc' => (case tyconReplacement tyc' of NONE => Tycon.equals (tyc, tyc') | SOME t => containsTycon t) | Tuple ts => Vector.exists (ts, containsTycon) | Ref t => containsTycon t | Vector t => containsTycon t | Weak t => containsTycon t | _ => false)) val res = containsTycon ty val () = destroyContainsTycon () in res end (* Keep the circular transparent tycons, ditch the rest. *) val datatypes = List.fold (unary, datatypes, fn ({tycon, con, args}, accum) => if Vector.exists (args, fn arg => containsTycon (arg, tycon)) then Datatype.T {tycon = tycon, cons = Vector.new1 {con = con, args = args}} :: accum else (transparent (tycon, con, args) ; accum)) (* diagnostic *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (origDatatypes, fn Datatype.T {tycon, cons} => (display (seq [str "num cons of ", Tycon.layout tycon, str " = ", Int.layout (tyconNumCons tycon)]); display (seq [str "replacement of ", Tycon.layout tycon, str " = ", Option.layout Type.layout (tyconReplacement tycon)]); Vector.foreach (cons, fn {con, ...} => display (seq [str "rep of ", Con.layout con, str " = ", ConRep.layout (conRep con)])))) end) fun makeSimplifyTypeFns simplifyType = let val simplifyType = Trace.trace ("SimplifyTypes.simplifyType", Type.layout, Type.layout) simplifyType fun simplifyTypes ts = Vector.map (ts, simplifyType) val simplifyTypes = Trace.trace ("SimplifyTypes.simplifyTypes", Vector.layout Type.layout, Vector.layout Type.layout) simplifyTypes fun simplifyUsefulTypesOpt ts = Exn.withEscape (fn escape => SOME (Vector.keepAllMap (ts, fn t => let val t = simplifyType t in if typeIsVoid t then escape NONE else if Type.isUnit t then NONE else SOME t end))) val simplifyUsefulTypesOpt = Trace.trace ("SimplifyTypes.simplifyUsefulTypesOpt", Vector.layout Type.layout, Option.layout (Vector.layout Type.layout)) simplifyUsefulTypesOpt val simplifyUsefulTypes = valOf o simplifyUsefulTypesOpt val simplifyUsefulTypes = Trace.trace ("SimplifyTypes.simplifyUsefulTypes", Vector.layout Type.layout, Vector.layout Type.layout) simplifyUsefulTypes in {simplifyType = simplifyType, simplifyTypes = simplifyTypes, simplifyUsefulTypes = simplifyUsefulTypes, simplifyUsefulTypesOpt = simplifyUsefulTypesOpt} end val {get = simplifyType, destroy = destroySimplifyType} = Property.destGet (Type.plist, Property.initRec (fn (t, simplifyType) => let val {simplifyType, simplifyUsefulTypesOpt, ...} = makeSimplifyTypeFns simplifyType fun doitPtr (mk, t) = let val t = simplifyType t in if typeIsVoid t then typeVoid else mk t end open Type in case dest t of Array t => array (simplifyType t) | Datatype tycon => (case tyconReplacement tycon of SOME t => let val t = simplifyType t val _ = setTyconReplacement (tycon, SOME t) in t end | NONE => t) | Ref t => doitPtr (reff, t) | Tuple ts => (case simplifyUsefulTypesOpt ts of NONE => typeVoid | SOME ts => Type.tuple ts) | Vector t => vector (simplifyType t) | Weak t => doitPtr (weak, t) | _ => t end)) val {simplifyType, simplifyTypes, simplifyUsefulTypesOpt, simplifyUsefulTypes, ...} = makeSimplifyTypeFns simplifyType val typeIsUseful = not o Type.isUnit o simplifyType (* Simplify constructor argument types. *) val datatypes = Vector.fromListMap (datatypes, fn Datatype.T {tycon, cons} => (setTyconNumCons (tycon, Vector.length cons) ; Datatype.T {tycon = tycon, cons = Vector.map (cons, fn {con, args} => {con = con, args = simplifyUsefulTypes args})})) val datatypes = Vector.concat [Vector.new1 (Datatype.T {tycon = tyconVoid, cons = Vector.new0 ()}), datatypes] val unitVar = Var.newNoname () val {get = varInfo: Var.t -> {oldType: Type.t}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("varInfo", Var.layout)) fun simplifyVarType (x: Var.t, t: Type.t): Type.t = (setVarInfo (x, {oldType = t}) ; simplifyType t) fun simplifyMaybeVarType (x: Var.t option, t: Type.t): Type.t = case x of SOME x => simplifyVarType (x, t) | NONE => simplifyType t val oldVarType = #oldType o varInfo val varIsUseful = typeIsUseful o oldVarType fun simplifyVar (x: Var.t): Var.t = if varIsUseful x then x else unitVar fun simplifyVars xs = Vector.map (xs, simplifyVar) fun simplifyUsefulVars xs = Vector.keepAll (xs, varIsUseful) fun tuple xs = let val xs = simplifyUsefulVars xs in if 1 = Vector.length xs then Var (Vector.first xs) else Tuple xs end fun simplifyUsefulFormals xts = Exn.withEscape (fn escape => SOME (Vector.keepAllMap (xts, fn (x, t) => let val t = simplifyVarType (x, t) in if typeIsVoid t then escape NONE else if Type.isUnit t then NONE else SOME (x, t) end))) fun simplifyExp (e: Exp.t): Exp.t = case e of ConApp {con, args} => (case conRep con of ConRep.Transparent => tuple (simplifyUsefulVars args) | ConRep.Useful => ConApp {con = con, args = simplifyUsefulVars args} | ConRep.Useless => Error.bug "SimplifyTypes.simplfyExp: ConApp, ConRep.Useless") | PrimApp {prim, targs, args} => let fun normal () = PrimApp {prim = prim, targs = simplifyTypes targs, args = simplifyVars args} fun equal () = if Cardinality.isOne (typeCardinality (Vector.first targs)) then ConApp {con = Con.truee, args = Vector.new0 ()} else normal () fun length () = if Cardinality.isZero (typeCardinality (Vector.first targs)) then Exp.Const (Const.word (WordX.zero (WordSize.seqIndex ()))) else normal () in case prim of Prim.Array_length => length () | Prim.MLton_eq => equal () | Prim.MLton_equal => equal () | Prim.Vector_length => length () | _ => normal () end | Select {tuple, offset} => let val ts = Type.deTuple (oldVarType tuple) in Vector.fold' (ts, 0, (offset, 0), fn (pos, t, (n, offset)) => if n = 0 then (Vector.Done (if offset = 0 andalso not (Vector.existsR (ts, pos + 1, Vector.length ts, typeIsUseful)) then Var tuple else Select {tuple = tuple, offset = offset})) else (Vector.Continue (n - 1, if typeIsUseful t then offset + 1 else offset)), fn _ => Error.bug "SimplifyTypes.simplifyExp: Select") end | Tuple xs => tuple xs | _ => e val simplifyExp = Trace.trace ("SimplifyTypes.simplifyExp", Exp.layout, Exp.layout) simplifyExp fun simplifyTransfer (t : Transfer.t): Statement.t vector * Transfer.t = case t of Bug => (Vector.new0 (), t) | Call {func, args, return} => (Vector.new0 (), Call {func = func, return = return, args = simplifyUsefulVars args}) | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAll (cases, fn (con, _) => not (ConRep.isUseless (conRep con))) val default = case (Vector.length cases, default) of (_, NONE) => NONE | (0, SOME l) => SOME l | (n, SOME l) => if n = tyconNumCons (Type.deDatatype (oldVarType test)) then NONE else SOME l fun normal () = (Vector.new0 (), Case {test = test, cases = Cases.Con cases, default = default}) in case (Vector.length cases, default) of (0, NONE) => (Vector.new0 (), Bug) | (0, SOME l) => (Vector.new0 (), Goto {dst = l, args = Vector.new0 ()}) | (1, NONE) => let val (con, l) = Vector.first cases in if ConRep.isUseful (conRep con) then (* This case can occur because an array or vector * tycon was kept around. *) normal () else (* The type has become a tuple. Do the selects. *) let val ts = simplifyUsefulTypes (conArgs con) val (args, stmts) = if 1 = Vector.length ts then (Vector.new1 test, Vector.new0 ()) else Vector.unzip (Vector.mapi (ts, fn (i, ty) => let val x = Var.newNoname () in (x, Statement.T {var = SOME x, ty = ty, exp = Select {tuple = test, offset = i}}) end)) in (stmts, Goto {dst = l, args = args}) end end | _ => normal () end | Case _ => (Vector.new0 (), t) | Goto {dst, args} => (Vector.new0 (), Goto {dst = dst, args = simplifyUsefulVars args}) | Raise xs => (Vector.new0 (), Raise (simplifyUsefulVars xs)) | Return xs => (Vector.new0 (), Return (simplifyUsefulVars xs)) | Runtime {prim, args, return} => (Vector.new0 (), Runtime {prim = prim, args = simplifyVars args, return = return}) val simplifyTransfer = Trace.trace ("SimplifyTypes.simplifyTransfer", Transfer.layout, Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout)) simplifyTransfer datatype result = datatype Result.t fun simplifyStatement (Statement.T {var, ty, exp}) = let val ty = simplifyMaybeVarType (var, ty) in if typeIsVoid ty then (* It is impossible for a statement to produce a value of an * uninhabited type; block must be unreachable. * Example: `Vector_sub` from a `(ty) vector`, where `ty` is * uninhabited. The `(ty) vector` type is inhabited, but * only by the vector of length 0; this `Vector_sub` is * unreachable due to a dominating bounds check that must * necessarily fail. *) Dead else if not (Type.isUnit ty) orelse Exp.maySideEffect exp orelse (case exp of Profile _ => true | _ => false) then (* It is wrong to omit calling simplifyExp when var = * NONE because targs in a PrimApp may still need to be * simplified. *) Keep (Statement.T {var = var, ty = ty, exp = simplifyExp exp}) else Delete end val simplifyStatement = Trace.trace ("SimplifyTypes.simplifyStatement", Statement.layout, Result.layout Statement.layout) simplifyStatement fun simplifyBlock (Block.T {label, args, statements, transfer}) = case simplifyUsefulFormals args of NONE => (* It is impossible for a block to be called with a value of an * uninhabited type; block must be unreachable. * However, block may be the `cont` or `handle` of a non-tail * call. While it will be impossible for the called function * to `Return` or `Raise` with a value of an uninhabited type, * the `returns` and `raises` of such a function will be * transformed to `SOME (Vector.new0 ())`. *) ({dead = true}, Block.T {label = label, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug}) | SOME args => let val statements = Vector.fold' (statements, 0, [], fn (_, statement, statements) => case simplifyStatement statement of Dead => Vector.Done NONE | Delete => Vector.Continue statements | Keep s => Vector.Continue (s :: statements), SOME o Vector.fromListRev) in case statements of NONE => ({dead = true}, Block.T {label = label, args = args, statements = Vector.new0 (), transfer = Bug}) | SOME statements => let val (stmts, transfer) = simplifyTransfer transfer val statements = Vector.concat [statements, stmts] in ({dead = false}, Block.T {label = label, args = args, statements = statements, transfer = transfer}) end end fun simplifyFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f in case simplifyUsefulFormals args of NONE => (* It is impossible for a function to be called with a value of an * uninhabited type; function must be unreachable. *) NONE | SOME args => let val blocks = ref [] fun loop (Tree.T (b, children)) = let val ({dead}, b) = simplifyBlock b val _ = List.push (blocks, b) in if dead then () else Tree.Seq.foreach (children, loop) end val _ = loop (Function.dominatorTree f) local fun doit rs = case rs of NONE => NONE | SOME ts => SOME (case simplifyUsefulTypesOpt ts of NONE => Vector.new0 () | SOME ts => ts) in val returns = doit returns val raises = doit raises end in SOME (Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end end val globals = Vector.concat [Vector.new1 (Statement.T {var = SOME unitVar, ty = Type.unit, exp = Exp.unit}), Vector.keepAllMap (globals, fn s => case simplifyStatement s of Dead => Error.bug "SimplifyTypes.globals: Dead" | Delete => NONE | Keep b => SOME b)] val shrink = shrinkFunction {globals = globals} val simplifyFunction = fn f => Option.map (simplifyFunction f, shrink) val functions = List.revKeepAllMap (functions, simplifyFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroyTypeCardinality () val _ = destroySimplifyType () val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/simplify.fun000066400000000000000000000340041416264345000203140ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Simplify (S: SIMPLIFY_STRUCTS): SIMPLIFY = struct open S structure CommonArg = CommonArg (S) structure CommonBlock = CommonBlock (S) structure CommonSubexp = CommonSubexp (S) structure CombineConversions = CombineConversions (S) structure ConstantPropagation = ConstantPropagation (S) structure Contify = Contify (S) structure DuplicateGlobals = DuplicateGlobals (S) structure Flatten = Flatten (S) structure Inline = Inline (S) structure IntroduceLoops = IntroduceLoops (S) structure KnownCase = KnownCase (S) structure LocalFlatten = LocalFlatten (S) structure LocalRef = LocalRef (S) structure LoopInvariant = LoopInvariant (S) structure LoopUnroll = LoopUnroll (S) structure LoopUnswitch = LoopUnswitch (S) structure PolyEqual = PolyEqual (S) structure PolyHash = PolyHash (S) structure Profile = Profile (S) structure Redundant = Redundant (S) structure RedundantTests = RedundantTests (S) structure RemoveUnused = RemoveUnused (S) structure ShareZeroVec = ShareZeroVec (S) structure SimplifyTypes = SimplifyTypes (S) structure SplitTypes = SplitTypes (S) structure Useless = Useless (S) type pass = {name: string, doit: Program.t -> Program.t, execute: bool} val ssaPassesDefault = {name = "removeUnused1", doit = RemoveUnused.transform, execute = true} :: {name = "introduceLoops1", doit = IntroduceLoops.transform, execute = true} :: {name = "loopInvariant1", doit = LoopInvariant.transform, execute = true} :: {name = "inlineLeaf1", doit = fn p => Inline.inlineLeaf (p, !Control.inlineLeafA), execute = true} :: {name = "inlineLeaf2", doit = fn p => Inline.inlineLeaf (p, !Control.inlineLeafB), execute = true} :: {name = "contify1", doit = Contify.transform, execute = true} :: {name = "localFlatten1", doit = LocalFlatten.transform, execute = true} :: {name = "constantPropagation", doit = ConstantPropagation.transform, execute = true} :: {name = "duplicateGlobals1", doit = DuplicateGlobals.transform, execute = false} :: {name = "splitTypes1", doit = SplitTypes.transform, execute = true} :: (* useless should run * - after constant propagation because constant propagation makes * slots of tuples that are constant useless *) {name = "useless", doit = Useless.transform, execute = true} :: (* loopUnroll should run * - after constants have been globalized *) {name = "loopUnroll1", doit = LoopUnroll.transform, execute = false} :: {name = "removeUnused2", doit = RemoveUnused.transform, execute = true} :: {name = "duplicateGlobals2", doit = DuplicateGlobals.transform, execute = true} :: {name = "splitTypes2", doit = SplitTypes.transform, execute = true} :: {name = "simplifyTypes", doit = SimplifyTypes.transform, execute = true} :: (* polyEqual should run * - after types are simplified so that many equals are turned into eqs * - before inlining so that equality functions can be inlined *) {name = "polyEqual", doit = PolyEqual.transform, execute = true} :: (* polyHash should run * - after types are simplified * - before inlining so that hash functions can be inlined *) {name = "polyHash", doit = PolyHash.transform, execute = true} :: {name = "introduceLoops2", doit = IntroduceLoops.transform, execute = true} :: {name = "loopInvariant2", doit = LoopInvariant.transform, execute = true} :: (* loopUnswitch should run * - after loop invariant code motion so invariant conditions are obvious * - before a knownCase pass to cleanup after unswitching *) {name = "loopUnswitch1", doit = LoopUnswitch.transform, execute = false} :: {name = "knownCase1", doit = KnownCase.transform, execute = false} :: {name = "contify2", doit = Contify.transform, execute = true} :: {name = "inlineNonRecursive", doit = fn p => Inline.inlineNonRecursive (p, !Control.inlineNonRec), execute = true} :: {name = "localFlatten2", doit = LocalFlatten.transform, execute = true} :: {name = "removeUnused3", doit = RemoveUnused.transform, execute = true} :: {name = "contify3", doit = Contify.transform, execute = true} :: {name = "introduceLoops3", doit = IntroduceLoops.transform, execute = true} :: {name = "loopInvariant3", doit = LoopInvariant.transform, execute = true} :: {name = "localRef", doit = LocalRef.transform, execute = true} :: {name = "flatten", doit = Flatten.transform, execute = true} :: {name = "localFlatten3", doit = LocalFlatten.transform, execute = true} :: {name = "combineConversions", doit = CombineConversions.transform, execute = true} :: {name = "commonArg", doit = CommonArg.transform, execute = true} :: {name = "commonSubexp1", doit = CommonSubexp.transform, execute = true} :: {name = "commonBlock", doit = CommonBlock.transform, execute = true} :: (* shareZeroVec should run * - after useless because sharing of zero-length array inhibits * changing type of flow-disjoint vector data * - after simplifyTypes because it may make previously distinct * types equal and allow more sharing of zero-length arrays * - after inlining because shareZeroVec (slightly) increases size * - before redundantTests because shareZeroVec introduces * comparisons with zero *) {name = "shareZeroVec", doit = ShareZeroVec.transform, execute = true} :: {name = "redundantTests", doit = RedundantTests.transform, execute = true} :: {name = "redundant", doit = Redundant.transform, execute = true} :: {name = "loopUnswitch2", doit = LoopUnswitch.transform, execute = false} :: {name = "knownCase2", doit = KnownCase.transform, execute = true} :: {name = "loopUnroll2", doit = LoopUnroll.transform, execute = false} :: {name = "commonSubexp2", doit = CommonSubexp.transform, execute = false} :: {name = "removeUnused4", doit = RemoveUnused.transform, execute = true} :: nil val ssaPassesMinimal = (* polyEqual cannot be omitted. It implements MLton_equal. *) {name = "polyEqual", doit = PolyEqual.transform, execute = true} :: (* polyHash cannot be omitted. It implements MLton_hash. *) {name = "polyHash", doit = PolyHash.transform, execute = true} :: nil val ssaPasses : pass list ref = ref ssaPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.generator 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (count ())], doit = doit, execute = true} else NONE end val inlinePassGen = let datatype t = Bool of bool | IntOpt of int option val count = Counter.generator 1 fun nums s = Exn.withEscape (fn escape => if s = "" then SOME [] else let val l = String.length s in if String.sub (s, 0) = #"(" andalso String.sub (s, l - 1)= #")" then let val s = String.substring2 (s, {start = 1, finish = l - 1}) fun doit s = if s = "true" then Bool true else if s = "false" then Bool false else if s = "inf" then IntOpt NONE else if String.forall (s, Char.isDigit) then IntOpt (Int.fromString s) else escape NONE in case List.map (String.split (s, #","), doit) of l as _::_ => SOME l | _ => NONE end else NONE end) in fn s => if String.hasPrefix (s, {prefix = "inlineNonRecursive"}) then let fun mk (product, small) = SOME {name = concat ["inlineNonRecursive(", Int.toString product, ",", Int.toString small, ")#", Int.toString (count ())], doit = (fn p => Inline.inlineNonRecursive (p, {small = small, product = product})), execute = true} val s = String.dropPrefix (s, String.size "inlineNonRecursive") in case nums s of SOME [IntOpt (SOME product), IntOpt (SOME small)] => mk (product, small) | _ => NONE end else if String.hasPrefix (s, {prefix = "inlineLeaf"}) then let fun mk (loops, repeat, size) = SOME {name = concat ["inlineLeafRepeat(", Bool.toString loops, ",", Bool.toString repeat, ",", Option.toString Int.toString size, ")#", Int.toString (count ())], doit = (fn p => Inline.inlineLeaf (p, {loops = loops, repeat = repeat, size = size})), execute = true} val s = String.dropPrefix (s, String.size "inlineLeaf") in case nums s of SOME [Bool loops, Bool repeat, IntOpt size] => mk (loops, repeat, size) | _ => NONE end else NONE end val passGens = inlinePassGen :: (List.map([("combineConversions", CombineConversions.transform), ("commonArg", CommonArg.transform), ("commonBlock", CommonBlock.transform), ("commonSubexp", CommonSubexp.transform), ("constantPropagation", ConstantPropagation.transform), ("contify", Contify.transform), ("duplicateGlobals", DuplicateGlobals.transform), ("flatten", Flatten.transform), ("introduceLoops", IntroduceLoops.transform), ("knownCase", KnownCase.transform), ("localFlatten", LocalFlatten.transform), ("localRef", LocalRef.transform), ("loopInvariant", LoopInvariant.transform), ("loopUnroll", LoopUnroll.transform), ("loopUnswitch", LoopUnswitch.transform), ("polyEqual", PolyEqual.transform), ("polyHash", PolyHash.transform), ("redundant", Redundant.transform), ("redundantTests", RedundantTests.transform), ("removeUnused", RemoveUnused.transform), ("shareZeroVec", ShareZeroVec.transform), ("simplifyTypes", SimplifyTypes.transform), ("splitTypes", SplitTypes.transform), ("useless", Useless.transform), ("ssaAddProfile", Profile.addProfile), ("ssaDropProfile", Profile.dropProfile), ("ssaBreakCriticalEdges", fn p => S.breakCriticalEdges (p, {codeMotion = true})), ("ssaEliminateDeadBlocks", S.eliminateDeadBlocks), ("ssaOrderFunctions", S.orderFunctions), ("ssaReverseFunctions", S.reverseFunctions), ("ssaShrink", S.shrink)], mkSimplePassGen)) in fun ssaPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in ssaPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end fun ssaPassesSet s = case s of "default" => (ssaPasses := ssaPassesDefault ; Result.Yes ()) | "minimal" => (ssaPasses := ssaPassesMinimal ; Result.Yes ()) | _ => ssaPassesSetCustom s val _ = Control.OptimizationPasses.register {il = "ssa", set = ssaPassesSet} fun simplify p = let val ssaPasses = AppendList.fromList (!ssaPasses) val ssaPasses = if !Control.profile <> Control.ProfileNone andalso !Control.profileIL = Control.ProfileSSA then AppendList.snoc (ssaPasses, {name = "ssaAddProfile", doit = Profile.addProfile, execute = true}) else ssaPasses val ssaPasses = AppendList.snoc (ssaPasses, {name = "ssaOrderFunctions", doit = S.orderFunctions, execute = true}) val ssaPasses = AppendList.toList ssaPasses (* Always want to type check the initial and final SSA programs, * even if type checking is turned off, just to catch bugs. *) val () = Control.trace (Control.Pass, "ssaTypeCheck") typeCheck p val p = Control.simplifyPasses {arg = p, passes = ssaPasses, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} val () = Control.trace (Control.Pass, "ssaTypeCheck") typeCheck p in p end end mlton-20210117+dfsg/mlton/ssa/simplify.sig000066400000000000000000000006561416264345000203140ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY_STRUCTS = sig include RESTORE end signature SIMPLIFY = sig include SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/simplify2.fun000066400000000000000000000077501416264345000204060ustar00rootroot00000000000000(* Copyright (C) 2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Simplify2 (S: SIMPLIFY2_STRUCTS): SIMPLIFY2 = struct open S structure DeepFlatten = DeepFlatten (S) structure Profile2 = Profile2 (S) structure RefFlatten = RefFlatten (S) structure RemoveUnused2 = RemoveUnused2 (S) structure Zone = Zone (S) type pass = {name: string, doit: Program.t -> Program.t, execute: bool} val ssa2PassesDefault = {name = "deepFlatten", doit = DeepFlatten.transform2, execute = true} :: {name = "refFlatten", doit = RefFlatten.transform2, execute = true} :: {name = "removeUnused5", doit = RemoveUnused2.transform2, execute = true} :: {name = "zone", doit = Zone.transform2, execute = false} :: nil val ssa2PassesMinimal = nil val ssa2Passes : pass list ref = ref ssa2PassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.generator 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (count ())], doit = doit, execute = true} else NONE end val passGens = List.map([("deepFlatten", DeepFlatten.transform2), ("refFlatten", RefFlatten.transform2), ("removeUnused", RemoveUnused2.transform2), ("zone", Zone.transform2), ("ssa2AddProfile", Profile2.addProfile), ("ssa2DropProfile", Profile2.dropProfile), ("ssa2EliminateDeadBlocks", S.eliminateDeadBlocks), ("ssa2OrderFunctions", S.orderFunctions), ("ssa2ReverseFunctions", S.reverseFunctions), ("ssa2Shrink", S.shrink)], mkSimplePassGen) in fun ssa2PassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in ssa2Passes := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end fun ssa2PassesSet s = case s of "default" => (ssa2Passes := ssa2PassesDefault ; Result.Yes ()) | "minimal" => (ssa2Passes := ssa2PassesMinimal ; Result.Yes ()) | _ => ssa2PassesSetCustom s val _ = Control.OptimizationPasses.register {il = "ssa2", set = ssa2PassesSet} fun simplify p = let val ssa2Passes = AppendList.fromList (!ssa2Passes) val ssa2Passes = if !Control.profile <> Control.ProfileNone andalso !Control.profileIL = Control.ProfileSSA2 then AppendList.snoc (ssa2Passes, {name = "ssa2AddProfile", doit = Profile2.addProfile, execute = true}) else ssa2Passes val ssa2Passes = AppendList.snoc (ssa2Passes, {name = "ssa2OrderFunctions", doit = S.orderFunctions, execute = true}) val ssa2Passes = AppendList.toList ssa2Passes (* Always want to type check the initial and final SSA2 programs, * even if type checking is turned off, just to catch bugs. *) val () = Control.trace (Control.Pass, "ssa2TypeCheck") typeCheck p val p = Control.simplifyPasses {arg = p, passes = ssa2Passes, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} val () = Control.trace (Control.Pass, "ssa2TypeCheck") typeCheck p in p end end mlton-20210117+dfsg/mlton/ssa/simplify2.sig000066400000000000000000000006611416264345000203720ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY2_STRUCTS = sig include SHRINK2 end signature SIMPLIFY2 = sig include SIMPLIFY2_STRUCTS val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/sources.cm000066400000000000000000000030071416264345000177510ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature SSA signature SSA2 functor Ssa functor Ssa2 functor SsaToSsa2 is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm equatable.sig equatable.sml ssa-tree.sig ssa-tree2.sig ssa-tree.fun ssa-tree2.fun direct-exp.sig direct-exp.fun analyze.sig analyze2.sig analyze.fun analyze2.fun type-check.sig type-check2.sig type-check.fun type-check2.fun prepasses.sig prepasses2.sig prepasses.fun prepasses2.fun shrink.sig shrink2.sig shrink.fun shrink2.fun restore.sig restore.fun ssa-transform.sig ssa2-transform.sig common-arg.fun common-block.fun common-subexp.fun global.sig global.fun multi.sig multi.fun combine-conversions.fun constant-propagation.fun contify.fun deep-flatten.fun duplicate-globals.fun flatten.fun inline.sig inline.fun introduce-loops.fun known-case.fun local-flatten.fun local-ref.fun loop-invariant.fun loop-unroll.fun loop-unswitch.fun poly-equal.fun poly-hash.fun profile.sig profile.fun profile2.sig profile2.fun redundant-tests.fun redundant.fun ref-flatten.fun remove-unused.fun remove-unused2.fun share-zero-vec.fun simplify-types.fun split-types.fun useless.fun zone.fun simplify.sig simplify2.sig simplify.fun simplify2.fun ssa.sig ssa2.sig ssa.fun ssa2.fun ssa-to-ssa2.sig ssa-to-ssa2.fun mlton-20210117+dfsg/mlton/ssa/sources.mlb000066400000000000000000000034051416264345000201260ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb equatable.sig equatable.sml ssa-tree.sig ssa-tree2.sig ssa-tree.fun ssa-tree2.fun direct-exp.sig direct-exp.fun analyze.sig analyze2.sig analyze.fun analyze2.fun type-check.sig type-check2.sig type-check.fun type-check2.fun prepasses.sig prepasses2.sig prepasses.fun prepasses2.fun shrink.sig shrink2.sig shrink.fun shrink2.fun restore.sig restore.fun ssa-transform.sig ssa2-transform.sig common-arg.fun common-block.fun common-subexp.fun global.sig global.fun multi.sig multi.fun combine-conversions.fun constant-propagation.fun contify.fun deep-flatten.fun duplicate-globals.fun flatten.fun inline.sig inline.fun introduce-loops.fun known-case.fun local-flatten.fun local-ref.fun loop-invariant.fun loop-unroll.fun loop-unswitch.fun poly-equal.fun poly-hash.fun profile.sig profile.fun profile2.sig profile2.fun redundant-tests.fun redundant.fun ref-flatten.fun remove-unused.fun remove-unused2.fun share-zero-vec.fun simplify-types.fun split-types.fun useless.fun zone.fun simplify.sig simplify2.sig simplify.fun simplify2.fun ssa.sig ssa2.sig ssa.fun ssa2.fun ssa-to-ssa2.sig ssa-to-ssa2.fun in signature SSA signature SSA2 functor Ssa functor Ssa2 functor SsaToSsa2 end mlton-20210117+dfsg/mlton/ssa/split-types.fun000066400000000000000000000463021416264345000207610ustar00rootroot00000000000000(* Copyright (C) 2018 Jason Carr * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SplitTypes(S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S structure TypeInfo = struct datatype heapType = Array | Ref | Vector | Weak datatype t = Unchanged of Type.t | Fresh of {cons: con list ref, hash: word, tycon: Tycon.t} Equatable.t | Tuple of t vector | Heap of (t * heapType) and con = ConData of Con.t * (t vector) fun layoutFresh {tycon=ty, cons=cons, ...} = Layout.fill [Tycon.layout ty, Layout.str " # ", Ref.layout (List.layout (fn ConData (con, _) => Con.layout con)) cons] and layout (t: t) = case t of Unchanged t => Type.layout t | Fresh eq => Equatable.layout (eq, layoutFresh) | Tuple vect => Layout.tuple (Vector.toListMap (vect, layout)) | Heap (t, ht) => Layout.fill [layout t, case ht of Array => Layout.str " array" | Ref => Layout.str " ref" | Vector => Layout.str " vector" | Weak => Layout.str " weak"] and hash (t : t) : word = case t of Unchanged ty => Type.hash ty | Fresh eq => #hash (Equatable.value eq) | Tuple vect => Hash.vectorMap(vect, hash) | Heap (t,htype) => Hash.combine (hash t, (case htype of Array => 0w0 | Ref => 0w1 | Vector => 0w2 | Weak => 0w3)) (* The equality of types becomes more coarse during analysis, * so it may be unsafe to use as equality *) fun equated (t1, t2) = case (t1, t2) of (Unchanged ty1, Unchanged ty2) => Type.equals (ty1, ty2) | (Fresh eq1, Fresh eq2) => Equatable.equals (eq1, eq2) | (Tuple tup1, Tuple tup2) => Vector.equals (tup1, tup2, equated) | (Heap (t1, _), Heap (t2, _)) => equated (t1, t2) | _ => false fun deFresh t = case t of Fresh eq => eq | _ => Error.bug "SplitTypes.TypeInfo.deFresh" fun mergeFresh coerceList ({tycon=tycon1, cons=cons1, hash=hash1}, {tycon=tycon2, cons=cons2, hash=_}) = let val tycon = if Tycon.equals (tycon1, tycon2) then tycon1 else Error.bug "SplitTypes.TypeInfo.mergeFresh: Inconsistent tycons" val cons = ref (!cons1) val _ = List.foreach (!cons2, fn conData as ConData (con2, args2) => let val found = List.peek (!cons1, fn ConData (con1, _) => Con.equals (con1, con2)) in case found of SOME (ConData (_, args1)) => List.push (coerceList, (args1, args2)) | NONE => List.push (cons, conData) end) in {tycon=tycon, cons=cons, hash=hash1} end fun coerce (from, to) = case (from, to) of (Fresh a, Fresh b) => let (* in some situations, recursive data types may cause lost updates * so we need to completely finish the coercion before we recurse *) val coerceList = ref [] val result = Equatable.equate (a, b, mergeFresh coerceList) val _ = List.foreach (!coerceList, fn (args1, args2) => Vector.foreach2 (args1, args2, coerce)) in result end | (Tuple a, Tuple b) => Vector.foreach2 (a, b, coerce) | (Unchanged t1, Unchanged t2) => if Type.equals (t1, t2) then () else Error.bug "SplitTypes.TypeInfo.coerce: Bad merge of unchanged types" | (Heap (t1, _), Heap (t2, _)) => coerce (t1, t2) | _ => Error.bug (Layout.toString (Layout.fill [ Layout.str "SplitTypes.TypeInfo.coerce: Strange coercion: ", layout from, Layout.str " coerced to ", layout to ])) fun newFresh (tycon, cons) = Equatable.new {tycon=tycon, cons=ref cons, hash=Random.word ()} fun fromType (ty: Type.t) = case Type.dest ty of Type.Datatype tycon => Fresh (newFresh (tycon, [])) | Type.Tuple ts => Tuple (Vector.map (ts, fromType)) | Type.Array t => Heap (fromType t, Array) | Type.Ref t => Heap (fromType t, Ref) | Type.Vector t => Heap (fromType t, Vector) | Type.Weak t => Heap (fromType t, Weak) | _ => Unchanged ty fun fromCon {con: Con.t, args: t vector, tycon: Tycon.t} = Fresh (newFresh (tycon, [ConData (con, args)])) fun fromTuple (vect: t vector) = Tuple vect fun const (c: Const.t): t = fromType (Type.ofConst c) fun select {tuple, offset, resultType=_} = case tuple of Tuple ts => Vector.sub (ts, offset) | _ => Error.bug "SplitTypes.TypeInfo.select: Tried to select from non-tuple info" end fun transform (program as Program.T {datatypes, globals, functions, main}) = let val conTyconMap = HashTable.new {hash=Con.hash, equals=Con.equals} fun conTycon con = HashTable.lookupOrInsert (conTyconMap, con, fn () => Error.bug ("SplitTypes.transform.conTycon: " ^ (Con.toString con))) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => Vector.foreach (cons, fn {con, ...} => ignore (HashTable.lookupOrInsert (conTyconMap, con, fn () => tycon)))) (* primitives may return this boolean *) val primBoolTy = Type.bool val primBoolTycon = Type.deDatatype primBoolTy val primBoolInfo = TypeInfo.fromType primBoolTy val _ = List.map ([Con.truee, Con.falsee], fn con => TypeInfo.coerce (TypeInfo.fromCon {con=con, args=Vector.new0 (), tycon = primBoolTycon}, primBoolInfo)) fun primApp {args, prim, resultType, resultVar=_, targs} = let fun derefPrim args = case Vector.sub (args, 0) of TypeInfo.Heap (t, _) => t | _ => Error.bug "SplitTypes.transform.primApp: Strange deref" fun refPrim heapType args = TypeInfo.Heap (Vector.sub (args, 0), heapType) fun assignPrim heapType args = let val _ = TypeInfo.coerce (Vector.sub (args, 0), TypeInfo.Heap (Vector.sub (args, 1), heapType)) in TypeInfo.fromType Type.unit end fun updatePrim heapType args = let val _ = TypeInfo.coerce (Vector.sub (args, 0), TypeInfo.Heap (Vector.sub (args, 2), heapType)) in TypeInfo.fromType Type.unit end fun equalPrim args = let val _ = TypeInfo.coerce (Vector.sub (args, 0), Vector.sub (args, 1)) in primBoolInfo end fun default () = if case Type.dest resultType of Type.Datatype tycon => Tycon.equals (tycon, primBoolTycon) | _ => false then primBoolInfo else TypeInfo.fromType resultType in case prim of Prim.Array_array => TypeInfo.Heap let val ty = TypeInfo.fromType (Vector.sub (targs, 0)) val _ = Vector.foreach (args, fn a => TypeInfo.coerce (a, ty)) in (ty, TypeInfo.Array) end | Prim.Array_sub => derefPrim args | Prim.Array_toArray => Vector.sub (args, 0) | Prim.Array_toVector => Vector.sub (args, 0) | Prim.Array_update => updatePrim TypeInfo.Array args | Prim.Ref_ref => refPrim TypeInfo.Ref args | Prim.Ref_deref => derefPrim args | Prim.Ref_assign => assignPrim TypeInfo.Ref args | Prim.Vector_sub => derefPrim args | Prim.Vector_vector => TypeInfo.Heap let val ty = TypeInfo.fromType (Vector.sub (targs, 0)) val _ = Vector.foreach (args, fn a => TypeInfo.coerce (a, ty)) in (ty, TypeInfo.Vector) end | Prim.Weak_get => derefPrim args | Prim.Weak_new => refPrim TypeInfo.Weak args | Prim.MLton_equal => equalPrim args | Prim.MLton_eq => equalPrim args | Prim.CFunction (CFunction.T {args=cargs, ...}) => let (* for the C methods, we need false -> 0 and true -> 1 so they have to remain bools *) val _ = Vector.foreach2 (args, cargs, fn (arg, carg) => if Type.equals (carg, primBoolTy) then TypeInfo.coerce (arg, primBoolInfo) else ()) in default () end | _ => default () end val { value, func, ... } = analyze { coerce = fn {from, to} => TypeInfo.coerce (from, to), conApp = fn {con, args} => TypeInfo.fromCon {con = con, args = args, tycon = conTycon con}, const = TypeInfo.const, filter = fn (ty, con, args) => TypeInfo.coerce (ty, TypeInfo.fromCon {con=con, args=args, tycon = conTycon con}), filterWord = fn _ => (), fromType = TypeInfo.fromType, layout = TypeInfo.layout, primApp = primApp, program = program, select = TypeInfo.select, tuple = TypeInfo.fromTuple, useFromTypeOnBinds = true } val tyconMap = HashTable.new {hash=(#hash o Equatable.value), equals=Equatable.equals} (* Always map the prim boolean to bool *) val _ = HashTable.lookupOrInsert (tyconMap, TypeInfo.deFresh primBoolInfo, fn () => primBoolTycon) fun getTy typeInfo = let fun pickTycon {tycon, cons, hash = _} = case (Tycon.equals (tycon, primBoolTycon), !Control.splitTypesBool) of (true, Control.Always) => Tycon.new tycon | (true, Control.Never) => tycon | (true, Control.Smart) => if List.length (!cons) < 2 then Tycon.new tycon else tycon | (false, _) => Tycon.new tycon fun makeTy eq = pickTycon (Equatable.value eq) in case typeInfo of TypeInfo.Unchanged ty => ty | TypeInfo.Fresh eq => Type.datatypee (HashTable.lookupOrInsert (tyconMap, eq, fn () => makeTy eq)) | TypeInfo.Tuple typeInfos => Type.tuple (Vector.map (typeInfos, getTy)) | TypeInfo.Heap (typeInfo', heapType) => (case heapType of TypeInfo.Array => Type.array (getTy typeInfo') | TypeInfo.Ref => Type.reff (getTy typeInfo') | TypeInfo.Weak => Type.weak (getTy typeInfo') | TypeInfo.Vector => Type.vector (getTy typeInfo')) end fun remappedConsHash (oldCon, tycon) = Hash.combine (Tycon.hash tycon, Con.hash oldCon) val remappedCons: ((Con.t * Tycon.t), Con.t) HashTable.t = HashTable.new {hash=remappedConsHash, equals=fn ((con1, tycon1), (con2, tycon2)) => Tycon.equals (tycon1, tycon2) andalso Con.equals (con1, con2)} fun remapCon (oldCon, newTycon) = if Tycon.equals (newTycon, primBoolTycon) then oldCon else HashTable.lookupOrInsert (remappedCons, (oldCon, newTycon), fn () => Con.new oldCon) (* Loop over the entire program, map each type to the new type, * and each constructor to the new constructor *) fun loopExp (exp, newTy) = case exp of Exp.ConApp {con, args} => let val newCon = remapCon (con, Type.deDatatype newTy) in Exp.ConApp {con=newCon, args=args} end | Exp.PrimApp {prim, args, ...} => let val argTys = Vector.map (args, fn arg => getTy (value arg)) val newTargs = Prim.extractTargs (prim, {args=argTys, result=newTy, typeOps = {deArray = Type.deArray, deArrow = fn _ => Error.bug "SplitTypes.transform.loopExp: deArrow primApp", deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}) val newPrim = case prim of Prim.CFunction (cfunc as CFunction.T {args=_, return=_, convention, inline, kind, prototype, symbolScope, target}) => let val newArgs = argTys val newReturn = newTy val newCFunc = case kind of CFunction.Kind.Runtime _ => CFunction.T {args=newArgs, return=newReturn, convention=convention, inline=inline, kind=kind, prototype=prototype, symbolScope=symbolScope, target=target} | _ => cfunc in Prim.CFunction newCFunc end | _ => prim in Exp.PrimApp {prim=newPrim, targs=newTargs, args=args} end | _ => exp fun loopStatement (Statement.T {exp, ty, var=varopt}) = let val newTy = case varopt of NONE => ty | SOME var => getTy (value var) val newExp = loopExp (exp, newTy) in Statement.T {exp=newExp, ty=newTy, var=varopt} end fun loopTransfer transfer = case transfer of Transfer.Case {cases, test, default} => (case cases of Cases.Con cases' => let val newTycon = Type.deDatatype (getTy (value test)) val newCases = Cases.Con (Vector.map (cases', fn (con, label) => (remapCon (con, newTycon), label))) (* if the cases are now exhaustive, default needs to be removed *) val newDefault = case (default, value test) of (SOME _, TypeInfo.Fresh eq) => let val cons = (! o #cons o Equatable.value) eq in if Vector.length cases' < List.length cons then default else NONE end | _ => default in Transfer.Case {cases=newCases, default=newDefault, test=test} end | Cases.Word _ => transfer) | _ => transfer fun loopBlock (Block.T { args, label, statements, transfer }) = let val newArgs = Vector.map (args, fn (var, _) => (var, getTy (value var))) val newStatements = Vector.map (statements, loopStatement) val newTransfer = loopTransfer transfer in Block.T {args=newArgs, label=label, statements=newStatements ,transfer=newTransfer} end val globals = Vector.map (globals, loopStatement) val functions = List.map (functions, fn f => let val { args, blocks, mayInline, name, start, ... } = Function.dest f val { args = argTys, raises = raiseTys, returns = returnTys } = func name in Function.new { args = Vector.map2 (args, argTys, fn ((v, _), typeInfo) => (v, getTy typeInfo)), blocks = Vector.map (blocks, loopBlock), mayInline = mayInline, name = name, raises = Option.map (raiseTys, fn tys => Vector.map (tys, getTy)), returns = Option.map (returnTys, fn tys => Vector.map (tys, getTy)), start = start } end) (* This needs to run after looping since the types/constructors were * duplicated at usage in the loops above *) val numOldDatatypes = Vector.length datatypes val datatypes = let fun reifyCon newTycon (TypeInfo.ConData (con, ts)) = let val newCon = remapCon (con, newTycon) in {con=newCon, args=Vector.map (ts, getTy)} end fun reifyCons (conList, newTycon) = Vector.fromList (List.map (conList, reifyCon newTycon)) (* bool may appear multiple times depending on settings *) val primBoolDt = Datatype.T {cons=Vector.new2 ({con=Con.truee, args=Vector.new0 ()}, {con=Con.falsee, args=Vector.new0 ()}), tycon=primBoolTycon} in (Vector.fromList (primBoolDt :: (List.keepAllMap (HashTable.toList tyconMap, fn (eq, tycon) => (* Only one copy of the true prim bool type should exist *) if Tycon.equals (tycon, primBoolTycon) then NONE else let val {cons, ...} = Equatable.value eq in SOME (Datatype.T {cons=reifyCons (!cons, tycon), tycon=tycon}) end)))) end val _ = Control.diagnostics (fn display => let open Layout in display ( mayAlign [ str "Program before splitting had ", str (Int.toString numOldDatatypes), str " datatypes.", str "Program after splitting has ", str (Int.toString (Vector.length datatypes)), str " datatypes." ]) end ) val program = Program.T { datatypes = datatypes, globals = globals, functions = functions, main = main } in program end end mlton-20210117+dfsg/mlton/ssa/ssa-to-ssa2.fun000066400000000000000000000310231416264345000205320ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SsaToSsa2 (S: SSA_TO_SSA2_STRUCTS): SSA_TO_SSA2 = struct open S structure S = Ssa structure S2 = Ssa2 local open S in structure Con = Con structure Label = Label structure Prim = Prim structure Var = Var end local open S2 in structure Base = Base structure Prod = Prod end fun convert (S.Program.T {datatypes, functions, globals, main}) = let val {get = convertType: S.Type.t -> S2.Type.t, ...} = Property.get (S.Type.plist, Property.initRec (fn (t, convertType) => case S.Type.dest t of S.Type.Array t => S2.Type.array1 (convertType t) | S.Type.CPointer => S2.Type.cpointer | S.Type.Datatype tycon => S2.Type.datatypee tycon | S.Type.IntInf => S2.Type.intInf | S.Type.Real s => S2.Type.real s | S.Type.Ref t => S2.Type.reff1 (convertType t) | S.Type.Thread => S2.Type.thread | S.Type.Tuple ts => S2.Type.tuple (Prod.make (Vector.map (ts, fn t => {elt = convertType t, isMutable = false}))) | S.Type.Vector t => S2.Type.vector1 (convertType t) | S.Type.Weak t => S2.Type.weak (convertType t) | S.Type.Word s => S2.Type.word s)) fun convertTypes ts = Vector.map (ts, convertType) val {get = conType: Con.t -> S2.Type.t, set = setConType, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("type", Con.layout)) val datatypes = Vector.map (datatypes, fn S.Datatype.T {cons, tycon} => S2.Datatype.T {cons = Vector.map (cons, fn {args, con} => let val args = Prod.make (Vector.map (args, fn t => {elt = convertType t, isMutable = false})) val () = setConType (con, S2.Type.conApp (con, args)) in {args = args, con = con} end), tycon = tycon}) fun convertPrim p = S.Prim.map (p, convertType) fun convertStatement (S.Statement.T {exp, ty, var}) : S2.Statement.t vector = let val ty = convertType ty fun simple (exp: S2.Exp.t): S2.Statement.t vector = Vector.new1 (S2.Statement.Bind {exp = exp, ty = ty, var = var}) fun maybeBindUnit (stmt: S2.Statement.t): S2.Statement.t vector = case var of NONE => Vector.new1 stmt | SOME _ => Vector.new2 (S2.Statement.Bind {var = var, ty = ty, exp = S2.Exp.unit}, stmt) in case exp of S.Exp.ConApp {args, con} => let val sum = case S2.Type.dest ty of S2.Type.Datatype tycon => tycon | _ => Error.bug "SsaToSsa2.convertStatement: strange ConApp" val variant = Var.newNoname () in Vector.new2 (S2.Statement.Bind {exp = S2.Exp.Object {args = args, con = SOME con}, ty = conType con, var = SOME variant}, S2.Statement.Bind {exp = S2.Exp.Inject {variant = variant, sum = sum}, ty = ty, var = var}) end | S.Exp.Const c => simple (S2.Exp.Const c) | S.Exp.PrimApp {args, prim, ...} => let fun arg i = Vector.sub (args, i) fun sequence () = simple (S2.Exp.Sequence {args = Vector.map (args, Vector.new1)}) fun sub () = simple (S2.Exp.Select {base = Base.SequenceSub {index = arg 1, sequence = arg 0}, offset = 0}) in case prim of Prim.Array_array => sequence () | Prim.Array_sub => sub () | Prim.Array_update => maybeBindUnit (S2.Statement.Update {base = Base.SequenceSub {index = arg 1, sequence = arg 0}, offset = 0, value = arg 2}) | Prim.Ref_assign => maybeBindUnit (S2.Statement.Update {base = Base.Object (arg 0), offset = 0, value = arg 1}) | Prim.Ref_deref => simple (S2.Exp.Select {base = Base.Object (arg 0), offset = 0}) | Prim.Ref_ref => simple (S2.Exp.Object {args = Vector.new1 (arg 0), con = NONE}) | Prim.Vector_length => simple (S2.Exp.PrimApp {args = args, prim = Prim.Array_length}) | Prim.Vector_sub => sub () | Prim.Vector_vector => sequence () | _ => simple (S2.Exp.PrimApp {args = args, prim = convertPrim prim}) end | S.Exp.Profile e => maybeBindUnit (S2.Statement.Profile e) | S.Exp.Select {offset, tuple} => simple (S2.Exp.Select {base = Base.Object tuple, offset = offset}) | S.Exp.Tuple v => simple (S2.Exp.Object {args = v, con = NONE}) | S.Exp.Var x => simple (S2.Exp.Var x) end val convertStatement = Trace.trace ("SsaToSsa2.convertStatement", S.Statement.layout, Vector.layout S2.Statement.layout) convertStatement fun convertHandler (h: S.Handler.t): S2.Handler.t = case h of S.Handler.Caller => S2.Handler.Caller | S.Handler.Dead => S2.Handler.Dead | S.Handler.Handle l => S2.Handler.Handle l fun convertReturn (r: S.Return.t): S2.Return.t = case r of S.Return.Dead => S2.Return.Dead | S.Return.NonTail {cont, handler} => S2.Return.NonTail {cont = cont, handler = convertHandler handler} | S.Return.Tail => S2.Return.Tail val extraBlocks: S2.Block.t list ref = ref [] fun convertCases (cs: (Con.t, Label.t) S.Cases.t): (Con.t, Label.t) S2.Cases.t = case cs of S.Cases.Con v => S2.Cases.Con (Vector.map (v, fn (c, l) => let val objectTy = conType c in case S2.Type.dest objectTy of S2.Type.Object {args, ...} => if Prod.isEmpty args then (c, l) else let val l' = Label.newNoname () val object = Var.newNoname () val (xs, statements) = Vector.unzip (Vector.mapi (Prod.dest args, fn (i, {elt = ty, ...}) => let val x = Var.newNoname () val exp = S2.Exp.Select {base = Base.Object object, offset = i} in (x, S2.Statement.Bind {exp = exp, ty = ty, var = SOME x}) end)) val transfer = S2.Transfer.Goto {args = xs, dst = l} val args = Vector.new1 (object, objectTy) val () = List.push (extraBlocks, S2.Block.T {args = args, label = l', statements = statements, transfer = transfer}) in (c, l') end | _ => Error.bug "SsaToSsa2.convertCases: strange object type" end)) | S.Cases.Word v => S2.Cases.Word v fun convertTransfer (t: S.Transfer.t): S2.Transfer.t = case t of S.Transfer.Bug => S2.Transfer.Bug | S.Transfer.Call {args, func, return} => S2.Transfer.Call {args = args, func = func, return = convertReturn return} | S.Transfer.Case {cases, default, test} => S2.Transfer.Case {cases = convertCases cases, default = default, test = test} | S.Transfer.Goto r => S2.Transfer.Goto r | S.Transfer.Raise v => S2.Transfer.Raise v | S.Transfer.Return v => S2.Transfer.Return v | S.Transfer.Runtime {args, prim, return} => S2.Transfer.Runtime {args = args, prim = convertPrim prim, return = return} fun convertStatements ss = Vector.concatV (Vector.map (ss, convertStatement)) fun convertFormals xts = Vector.map (xts, fn (x, t) => (x, convertType t)) fun convertBlock (S.Block.T {args, label, statements, transfer}) = S2.Block.T {args = convertFormals args, label = label, statements = convertStatements statements, transfer = convertTransfer transfer} val functions = List.map (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = S.Function.dest f fun rr tvo = Option.map (tvo, convertTypes) val blocks = Vector.map (blocks, convertBlock) val blocks = Vector.concat [blocks, Vector.fromList (!extraBlocks)] val () = extraBlocks := [] in S2.Function.new {args = convertFormals args, blocks = blocks, mayInline = mayInline, name = name, raises = rr raises, returns = rr returns, start = start} end) val globals = convertStatements globals val program = S2.Program.T {datatypes = datatypes, functions = functions, globals = globals, main = main} in S2.shrink program end end mlton-20210117+dfsg/mlton/ssa/ssa-to-ssa2.sig000066400000000000000000000007171416264345000205320ustar00rootroot00000000000000(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA_TO_SSA2_STRUCTS = sig structure Ssa: SSA structure Ssa2: SSA2 sharing Ssa.Atoms = Ssa2.Atoms end signature SSA_TO_SSA2 = sig include SSA_TO_SSA2_STRUCTS val convert: Ssa.Program.t -> Ssa2.Program.t end mlton-20210117+dfsg/mlton/ssa/ssa-transform.sig000066400000000000000000000005211416264345000212460ustar00rootroot00000000000000(* Copyright (C) 2009 Wesley W. Tersptra. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA_TRANSFORM_STRUCTS = sig include RESTORE end signature SSA_TRANSFORM = sig include SSA_TRANSFORM_STRUCTS val transform: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/ssa-tree.fun000066400000000000000000002277531416264345000202220ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2017-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SsaTree (S: SSA_TREE_STRUCTS): SSA_TREE = struct open S (* infix declarations for Parse.Ops *) infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> structure Type = struct datatype t = T of {hash: Word.t, plist: PropertyList.t, tree: tree} and tree = Array of t | CPointer | Datatype of Tycon.t | IntInf | Real of RealSize.t | Ref of t | Thread | Tuple of t vector | Vector of t | Weak of t | Word of WordSize.t local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end datatype dest = datatype tree val dest = tree fun equals (t, t') = PropertyList.equals (plist t, plist t') local fun make (sel : dest -> 'a option) = let val deOpt: t -> 'a option = fn t => sel (dest t) val de: t -> 'a = valOf o deOpt val is: t -> bool = isSome o deOpt in (deOpt, de, is) end in val (_,deArray,_) = make (fn Array t => SOME t | _ => NONE) val (_,deDatatype,_) = make (fn Datatype tyc => SOME tyc | _ => NONE) val (_,deRef,_) = make (fn Ref t => SOME t | _ => NONE) val (deTupleOpt,deTuple,isTuple) = make (fn Tuple ts => SOME ts | _ => NONE) val (_,deVector,_) = make (fn Vector t => SOME t | _ => NONE) val (_,deWeak,_) = make (fn Weak t => SOME t | _ => NONE) val (deWordOpt,deWord,_) = make (fn Word ws => SOME ws | _ => NONE) end local val same: tree * tree -> bool = fn (Array t1, Array t2) => equals (t1, t2) | (CPointer, CPointer) => true | (Datatype t1, Datatype t2) => Tycon.equals (t1, t2) | (IntInf, IntInf) => true | (Real s1, Real s2) => RealSize.equals (s1, s2) | (Ref t1, Ref t2) => equals (t1, t2) | (Thread, Thread) => true | (Tuple ts1, Tuple ts2) => Vector.equals (ts1, ts2, equals) | (Vector t1, Vector t2) => equals (t1, t2) | (Weak t1, Weak t2) => equals (t1, t2) | (Word s1, Word s2) => WordSize.equals (s1, s2) | _ => false val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", lookup)] end end val newHash = Random.word local fun make f : t -> t = let val w = newHash () in fn t => lookup (Hash.combine (w, hash t), f t) end in val array = make Array val reff = make Ref val vector = make Vector val weak = make Weak end val datatypee: Tycon.t -> t = fn t => lookup (Tycon.hash t, Datatype t) val bool = datatypee Tycon.bool local fun make (tycon, tree) = lookup (Tycon.hash tycon, tree) in val cpointer = make (Tycon.cpointer, CPointer) val intInf = make (Tycon.intInf, IntInf) val thread = make (Tycon.thread, Thread) end val real: RealSize.t -> t = fn s => lookup (Tycon.hash (Tycon.real s), Real s) val word: WordSize.t -> t = fn s => lookup (Tycon.hash (Tycon.word s), Word s) local val w = newHash () in fun tuple ts = if 1 = Vector.length ts then Vector.first ts else lookup (Hash.combine (w, Hash.vectorMap (ts, hash)), Tuple ts) end fun ofConst c = let datatype z = datatype Const.t in case c of CSymbol _ => cpointer | IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector (word (WordXVector.elementSize v)) end val unit: t = tuple (Vector.new0 ()) val isUnit: t -> bool = fn t => case deTupleOpt t of SOME ts => Vector.isEmpty ts | _ => false local open Layout in val {get = layout, ...} = Property.get (plist, Property.initRec (fn (t, layout) => let fun unary (t, tc) = seq [paren (layout t), str " ", str tc] in case dest t of Array t => unary (t, "array") | CPointer => str "cpointer" | Datatype t => Tycon.layout t | IntInf => str "intInf" | Real s => str (concat ["real", RealSize.toString s]) | Ref t => unary (t, "ref") | Thread => str "thread" | Tuple ts => if Vector.isEmpty ts then str "unit" else seq [str "(", (mayAlign o separateRight) (Vector.toListMap (ts, layout), ","), str ") tuple"] | Vector t => unary (t, "vector") | Weak t => unary (t, "weak") | Word s => str (concat ["word", WordSize.toString s]) end)) end local structure P = Parse open Parse.Ops val tyconAlts = Vector.fromList ([("cpointer", cpointer), ("intInf", intInf), ("unit", unit), ("thread", thread)] @ List.map (WordSize.all, fn ws => ("word" ^ WordSize.toString ws, word ws)) @ List.map (RealSize.all, fn rs => ("real" ^ RealSize.toString rs, real rs))) val unary = [array <$ P.kw "array", reff <$ P.kw "ref", (tuple o Vector.new1) <$ P.kw "tuple", vector <$ P.kw "vector", weak <$ P.kw "weak"] in fun parse () = let val parse = P.delay parse in Tycon.parseAs (tyconAlts, datatypee) <|> (P.paren parse >>= (fn ty => P.any unary >>= (fn unary => P.pure (unary ty)))) <|> (P.vector parse >>= (fn tys => P.kw "tuple" *> P.pure (tuple tys))) end val parse = parse () end fun checkPrimApp {args, prim, result, targs}: bool = let exception BadPrimApp fun default () = Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array, arrow = fn _ => raise BadPrimApp, bool = bool, cpointer = cpointer, equals = equals, exn = unit, intInf = intInf, real = real, reff = reff, thread = thread, unit = unit, vector = vector, weak = weak, word = word}}) val default = fn () => (default ()) handle BadPrimApp => false in case prim of _ => default () end end structure Size = struct val check: int * int option -> int *bool = fn (size, NONE) => (size,false) | (size, SOME max) => (size,size > max) end structure Exp = struct datatype t = ConApp of {con: Con.t, args: Var.t vector} | Const of Const.t | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: Var.t vector} | Profile of ProfileExp.t | Select of {tuple: Var.t, offset: int} | Tuple of Var.t vector | Var of Var.t val unit = Tuple (Vector.new0 ()) (* Vals to determine the size for inline.fun and loop optimization*) val size : t -> int = fn ConApp {args, ...} => 1 + Vector.length args | Const _ => 0 | PrimApp {args, ...} => 1 + Vector.length args | Profile _ => 0 | Select _ => 1 + 1 | Tuple xs => 1 + Vector.length xs | Var _ => 0 fun foreachVar (e, v) = let fun vs xs = Vector.foreach (xs, v) in case e of ConApp {args, ...} => vs args | Const _ => () | PrimApp {args, ...} => vs args | Profile _ => () | Select {tuple, ...} => v tuple | Tuple xs => vs xs | Var x => v x end fun replaceVar (e, fx) = let fun fxs xs = Vector.map (xs, fx) in case e of ConApp {con, args} => ConApp {con = con, args = fxs args} | Const _ => e | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = targs, args = fxs args} | Profile _ => e | Select {tuple, offset} => Select {tuple = fx tuple, offset = offset} | Tuple xs => Tuple (fxs xs) | Var x => Var (fx x) end fun layout' (e, layoutVar) = let open Layout fun layoutArgs xs = Vector.layout layoutVar xs in case e of ConApp {con, args} => seq [str "con ", Con.layout con, if Vector.isEmpty args then empty else seq [str " ", layoutArgs args]] | Const c => Const.layout c | PrimApp {prim, targs, args} => seq [str "prim ", Prim.layoutFull (prim, Type.layout), if !Control.showTypes andalso not (Vector.isEmpty targs) then Layout.list (Vector.toListMap (targs, Type.layout)) else empty, str " ", layoutArgs args] | Profile p => ProfileExp.layout p | Select {tuple, offset} => seq [str "#", Int.layout offset, str " ", paren (layoutVar tuple)] | Tuple xs => layoutArgs xs | Var x => layoutVar x end fun layout e = layout' (e, Var.layout) val parse = let open Parse val parseArgs = vector Var.parse val parseArgsOpt = vectorOpt Var.parse in mlSpaces *> any [ConApp <$> (kw "con" *> Con.parse >>= (fn con => parseArgsOpt >>= (fn args => pure {con = con, args = args}))), Const <$> Const.parse, PrimApp <$> (kw "prim" *> Prim.parseFull Type.parse >>= (fn prim => listOpt Type.parse >>= (fn targs => parseArgs >>= (fn args => pure {prim = prim, targs = Vector.fromList targs, args = args})))), Select <$> (mlSpaces *> char #"#" *> (peek (nextSat Char.isDigit) *> fromScan (Function.curry Int.scan StringCvt.DEC)) >>= (fn offset => paren Var.parse >>= (fn tuple => pure {tuple = tuple, offset = offset}))), Tuple <$> parseArgs, Var <$> Var.parse] end fun maySideEffect (e: t): bool = case e of ConApp _ => false | Const _ => false | PrimApp {prim,...} => Prim.maySideEffect prim | Profile _ => false | Select _ => false | Tuple _ => false | Var _ => false fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (ConApp {con, args}, ConApp {con = con', args = args'}) => Con.equals (con, con') andalso varsEquals (args, args') | (Const c, Const c') => Const.equals (c, c') | (PrimApp {prim, targs, args}, PrimApp {prim = prim', targs = targs', args = args'}) => Prim.equals (prim, prim') andalso Vector.equals (targs, targs', Type.equals) andalso varsEquals (args, args') | (Profile p, Profile p') => ProfileExp.equals (p, p') | (Select {tuple = t, offset = i}, Select {tuple = t', offset = i'}) => Var.equals (t, t') andalso i = i' | (Tuple xs, Tuple xs') => varsEquals (xs, xs') | (Var x, Var x') => Var.equals (x, x') | _ => false local val newHash = Random.word val primApp = newHash () val profile = newHash () val select = newHash () val tuple = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Hash.combine (w, Hash.vectorMap (xs, Var.hash)) fun hashTypes (ts: Type.t vector, w: Word.t): Word.t = Hash.combine (w, Hash.vectorMap (ts, Type.hash)) in val hash: t -> Word.t = fn ConApp {con, args, ...} => hashVars (args, Con.hash con) | Const c => Const.hash c | PrimApp {targs, args, ...} => hashVars (args, hashTypes (targs, primApp)) | Profile p => Hash.combine (profile, ProfileExp.hash p) | Select {tuple, offset} => Hash.combine (select, Var.hash tuple + Word.fromInt offset) | Tuple xs => hashVars (xs, tuple) | Var x => Var.hash x end val hash = Trace.trace ("SsaTree.Exp.hash", layout, Word.layout) hash end datatype z = datatype Exp.t structure Statement = struct datatype t = T of {var: Var.t option, ty: Type.t, exp: Exp.t} local fun make f (T r) = f r in val var = make #var val exp = make #exp end fun sizeAux (T {exp, ...}, acc, max, sizeExp) = Size.check (sizeExp exp + acc, max) fun layout' (T {var, ty, exp}, layoutVar) = let open Layout val (sep, ty) = if !Control.showTypes then (str ":", indent (seq [Type.layout ty, str " ="], 2)) else (str " =", empty) in mayAlign [mayAlign [seq [str "val ", case var of NONE => str "_" | SOME var => Var.layout var, sep], ty], indent (Exp.layout' (exp, layoutVar), 2)] end fun layout e = layout' (e, Var.layout) val parse = let open Parse in T <$> (kw "val" *> ((SOME <$> Var.parse) <|> (NONE <$ kw "_")) >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=" *> Exp.parse >>= (fn exp => pure {var = var, ty = ty, exp = exp})))) end local fun make f x = T {var = NONE, ty = Type.unit, exp = f x} in val profile = make Exp.Profile end fun clear s = Option.app (var s, Var.clear) fun prettifyGlobals (v: t vector): Var.t -> Layout.t = let val {get = global: Var.t -> Layout.t, set = setGlobal, ...} = Property.getSet (Var.plist, Property.initFun Var.layout) val _ = Vector.foreach (v, fn T {var, exp, ...} => Option.app (var, fn var => let fun set () = let val s = Layout.toString (Exp.layout' (exp, Var.layout)) val maxSize = 20 val dots = " ... " val dotsSize = String.size dots val frontSize = 2 * (maxSize - dotsSize) div 3 val backSize = maxSize - dotsSize - frontSize val s = if String.size s > maxSize then concat [String.prefix (s, frontSize), dots, String.suffix (s, backSize)] else s in if String.hasSubstring (s, {substring = "(*"}) orelse String.hasSubstring (s, {substring = "*)"}) then () else setGlobal (var, Layout.seq [Var.layout var, Layout.str (" (*" ^ s ^ "*)")]) end in case exp of Const _ => set () | ConApp _ => set () | Tuple xs => if Vector.isEmpty xs then set () else () | _ => () end)) in global end end structure Transfer = struct datatype t = Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {test: Var.t, cases: (Con.t, Label.t) Cases.t, default: Label.t option} (* Must be nullary. *) | Goto of {dst: Label.t, args: Var.t vector} | Raise of Var.t vector | Return of Var.t vector | Runtime of {prim: Type.t Prim.t, args: Var.t vector, return: Label.t} (* Vals to determine the size for inline.fun and loop optimization*) val size = fn Bug => 1 | Call {args, ...} => 1 + Vector.length args | Case {cases, ...} => 1 + Cases.length cases | Goto {args, ...} => 1 + Vector.length args | Raise xs => 1 + Vector.length xs | Return xs => 1 + Vector.length xs | Runtime {args, ...} => 1 + Vector.length args fun foreachFuncLabelVar (t, func: Func.t -> unit, label: Label.t -> unit, var) = let fun vars xs = Vector.foreach (xs, var) in case t of Bug => () | Call {func = f, args, return, ...} => (func f ; Return.foreachLabel (return, label) ; vars args) | Case {test, cases, default, ...} => (var test ; Cases.foreach (cases, label) ; Option.app (default, label)) | Goto {dst, args, ...} => (vars args; label dst) | Raise xs => vars xs | Return xs => vars xs | Runtime {args, return, ...} => (vars args ; label return) end fun foreachFunc (t, func) = foreachFuncLabelVar (t, func, fn _ => (), fn _ => ()) fun foreachLabelVar (t, label, var) = foreachFuncLabelVar (t, fn _ => (), label, var) fun foreachLabel (t, j) = foreachLabelVar (t, j, fn _ => ()) fun foreachVar (t, v) = foreachLabelVar (t, fn _ => (), v) fun replaceLabelVar (t, fl, fx) = let fun fxs xs = Vector.map (xs, fx) in case t of Bug => Bug | Call {func, args, return} => Call {func = func, args = fxs args, return = Return.map (return, fl)} | Case {test, cases, default} => Case {test = fx test, cases = Cases.map(cases, fl), default = Option.map(default, fl)} | Goto {dst, args} => Goto {dst = fl dst, args = fxs args} | Raise xs => Raise (fxs xs) | Return xs => Return (fxs xs) | Runtime {prim, args, return} => Runtime {prim = prim, args = fxs args, return = fl return} end fun replaceLabel (t, f) = replaceLabelVar (t, f, fn x => x) fun replaceVar (t, f) = replaceLabelVar (t, fn l => l, f) fun layout' (t, layoutVar) = let open Layout fun layoutArgs xs = Vector.layout layoutVar xs fun layoutCase {test, cases, default} = let fun doit (l, layout) = Vector.toListMap (l, fn (i, l) => seq [layout i, str " => ", Label.layout l]) datatype z = datatype Cases.t val (suffix, cases) = case cases of Con l => (empty, doit (l, Con.layout)) | Word (size, l) => (str (WordSize.toString size), doit (l, fn w => WordX.layout (w, {suffix = true}))) val cases = case default of NONE => cases | SOME j => cases @ [seq [str "_ => ", Label.layout j]] in align [seq [str "case", suffix, str " ", layoutVar test, str " of"], indent (alignPrefix (cases, "| "), 2)] end fun layoutPrim {prim, args} = seq [Prim.layoutFull (prim, Type.layout), str " ", layoutArgs args] in case t of Bug => str "bug" | Call {func, args, return} => let val call = seq [Func.layout func, str " ", layoutArgs args] in case return of Return.Dead => seq [str "call dead ", call] | Return.NonTail {cont, handler} => seq [str "call ", Label.layout cont, str " ", paren call, str " handle _ => ", case handler of Handler.Caller => str "raise" | Handler.Dead => str "dead" | Handler.Handle l => Label.layout l] | Return.Tail => seq [str "call tail ", call] end | Case arg => layoutCase arg | Goto {dst, args} => seq [str "goto ", Label.layout dst, str " ", layoutArgs args] | Raise xs => seq [str "raise ", layoutArgs xs] | Return xs => seq [str "return ", layoutArgs xs] | Runtime {prim, args, return} => seq [str "runtime ", Label.layout return, str " ", paren (layoutPrim {prim = prim, args = args})] end fun layout t = layout' (t, Var.layout) val parse = let open Parse val parseArgs = vector Var.parse fun parseCase (parse', mk) = Var.parse >>= (fn test => kw "of" *> (Vector.fromList <$> sepBy (parse' >>= (fn p => sym "=>" *> Label.parse >>= (fn l => pure (p, l))), sym "|")) >>= (fn cases => optional ((if Vector.isEmpty cases then pure () else sym "|") *> kw "_" *> sym "=>" *> Label.parse) >>= (fn default => pure {test = test, cases = mk cases, default = default}))) val parseCall = Func.parse >>= (fn func => parseArgs >>= (fn args => pure (fn return => pure {func = func, args = args, return = return}))) in mlSpaces *> any [Bug <$ kw "bug", Call <$> (kw "call" *> any [kw "dead" *> parseCall >>= (fn mkCall => mkCall Return.Dead), kw "tail" *> parseCall >>= (fn mkCall => mkCall Return.Tail), Label.parse >>= (fn cont => paren parseCall >>= (fn mkCall => kw "handle" *> kw "_" *> sym "=>" *> any [kw "raise" *> mkCall (Return.NonTail {cont = cont, handler = Handler.Caller}), kw "dead" *> mkCall (Return.NonTail {cont = cont, handler = Handler.Dead}), Label.parse >>= (fn h => mkCall (Return.NonTail {cont = cont, handler = Handler.Handle h}))]))]), Case <$> any ((kw "case" *> parseCase (Con.parse, Cases.Con)) :: (List.map (WordSize.all, fn ws => kw ("case" ^ WordSize.toString ws) *> parseCase (WordX.parse, fn cases => Cases.Word (ws, cases))))), Goto <$> (kw "goto" *> Label.parse >>= (fn dst => parseArgs >>= (fn args => pure {dst = dst, args = args}))), Raise <$> (kw "raise" *> parseArgs), Return <$> (kw "return" *> parseArgs), Runtime <$> (kw "runtime" *> Label.parse >>= (fn return => paren (Prim.parseFull Type.parse >>= (fn prim => parseArgs >>= (fn args => pure (prim, args)))) >>= (fn (prim, args) => pure {prim = prim, args = args, return = return})))] end fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Bug, Bug) => true | (Call {func, args, return}, Call {func = func', args = args', return = return'}) => Func.equals (func, func') andalso varsEquals (args, args') andalso Return.equals (return, return') | (Case {test, cases, default}, Case {test = test', cases = cases', default = default'}) => Var.equals (test, test') andalso Cases.equals (cases, cases', Con.equals, Label.equals) andalso Option.equals (default, default', Label.equals) | (Goto {dst, args}, Goto {dst = dst', args = args'}) => Label.equals (dst, dst') andalso varsEquals (args, args') | (Raise xs, Raise xs') => varsEquals (xs, xs') | (Return xs, Return xs') => varsEquals (xs, xs') | (Runtime {prim, args, return}, Runtime {prim = prim', args = args', return = return'}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (return, return') | _ => false local val newHash = Random.word val bug = newHash () val raisee = newHash () val return = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Hash.combine (w, Hash.vectorMap (xs, Var.hash)) fun hash2 (w1: Word.t, w2: Word.t) = Hash.combine (w1, w2) in val hash: t -> Word.t = fn Bug => bug | Call {func, args, return} => hashVars (args, hash2 (Func.hash func, Return.hash return)) | Case {test, cases, default} => hash2 (Var.hash test, Cases.fold (cases, Option.fold (default, 0wx55555555, fn (l, w) => hash2 (Label.hash l, w)), fn (l, w) => hash2 (Label.hash l, w))) | Goto {dst, args} => hashVars (args, Label.hash dst) | Raise xs => hashVars (xs, raisee) | Return xs => hashVars (xs, return) | Runtime {args, return, ...} => hashVars (args, Label.hash return) end val hash = Trace.trace ("SsaTree.Transfer.hash", layout, Word.layout) hash end datatype z = datatype Transfer.t local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => if !Control.showTypes then mayAlign [seq [Var.layout x, str ":"], indent (Type.layout t, 2)] else Var.layout x) xts end local open Parse in val parseFormals = vector (Var.parse >>= (fn x => sym ":" *> Type.parse >>= (fn ty => pure (x, ty)))) end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val args = make #args val label = make #label val statements = make #statements val transfer = make #transfer end fun sizeAux (T {statements, transfer, ...}, acc, max, sizeExp, sizeTransfer) = Exn.withEscape (fn escape => Vector.fold (statements, Size.check (acc + sizeTransfer transfer, max), fn (stmt, (acc, chk)) => if chk then escape (acc, chk) else Statement.sizeAux (stmt, acc, max, sizeExp))) fun sizeAuxV (bs, acc, max, sizeExp, sizeTransfer) = Exn.withEscape (fn escape => Vector.fold (bs, (acc, false), fn (b, (acc, chk)) => if chk then escape (acc, chk) else sizeAux (b, acc, max, sizeExp, sizeTransfer))) fun sizeV (bs, {sizeExp, sizeTransfer}) = #1 (sizeAuxV (bs, 0, NONE, sizeExp, sizeTransfer)) fun layout' (T {label, args, statements, transfer}, layoutVar) = let open Layout fun layoutStatement s = Statement.layout' (s, layoutVar) fun layoutTransfer t = Transfer.layout' (t, layoutVar) in align [seq [str "block ", Label.layout label, str " ", layoutFormals args], indent (align [align (Vector.toListMap (statements, layoutStatement)), layoutTransfer transfer], 2)] end fun layout b = layout' (b, Var.layout) val parse = let open Parse in T <$> (kw "block" *> Label.parse >>= (fn label => parseFormals >>= (fn args => many Statement.parse >>= (fn statements => Transfer.parse >>= (fn transfer => pure {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}))))) end fun clear (T {label, args, statements, ...}) = (Label.clear label ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (statements, Statement.clear)) end structure Datatype = struct datatype t = T of { tycon: Tycon.t, cons: {con: Con.t, args: Type.t vector} vector } fun layout (T {tycon, cons}) = let open Layout in seq [str "datatype ", Tycon.layout tycon, str " = ", alignPrefix (Vector.toListMap (cons, fn {con, args} => seq [Con.layout con, if Vector.isEmpty args then empty else seq [str " of ", Vector.layout Type.layout args]]), "| ")] end val parse = let open Parse val conExcepts = Vector.new2 ("datatype", "val") in T <$> (kw "datatype" *> Tycon.parse >>= (fn tycon => sym "=" *> sepBy (Con.parseExcept conExcepts >>= (fn con => ((kw "of" *> vector Type.parse) <|> pure (Vector.new0 ())) >>= (fn args => pure {con = con, args = args})), sym "|") >>= (fn cons => pure {tycon = tycon, cons = Vector.fromList cons}))) end fun clear (T {tycon, cons}) = (Tycon.clear tycon ; Vector.foreach (cons, Con.clear o #con)) end structure Function = struct structure CPromise = ClearablePromise type dest = {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* There is a messy interaction between the laziness used in controlFlow * and the property lists on labels because the former stores * stuff on the property lists. So, if you force the laziness, then * clear the property lists, then try to use the lazy stuff, you will * get screwed with undefined properties. The right thing to do is reset * the laziness when the properties are cleared. *) datatype t = T of {controlFlow: {dfsTree: unit -> Block.t Tree.t, dominatorTree: unit -> Block.t Tree.t, graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} CPromise.t, dest: dest} local fun make f (T {dest, ...}) = f dest in val blocks = make #blocks val dest = make (fn d => d) val mayInline = make #mayInline val name = make #name end fun sizeAux (f, acc, max, sizeExp, sizeTransfer) = Block.sizeAuxV (blocks f, acc, max, sizeExp, sizeTransfer) fun size (f, {sizeExp, sizeTransfer}) = #1 (sizeAux (f, 0, NONE, sizeExp, sizeTransfer)) fun sizeMax (f, {max, sizeExp, sizeTransfer}) = let val (s, chk) = sizeAux (f, 0, max, sizeExp, sizeTransfer) in if chk then NONE else SOME s end fun foreachVar (f: t, fx: Var.t * Type.t -> unit): unit = let val {args, blocks, ...} = dest f val _ = Vector.foreach (args, fx) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach (args, fx) ; Vector.foreach (statements, fn Statement.T {var, ty, ...} => Option.app (var, fn x => fx (x, ty))))) in () end fun controlFlow (T {controlFlow, ...}) = let val {graph, labelNode, nodeBlock, ...} = CPromise.force controlFlow in {graph = graph, labelNode = labelNode, nodeBlock = nodeBlock} end local fun make sel = fn T {controlFlow, ...} => sel (CPromise.force controlFlow) () in val dominatorTree = make #dominatorTree end fun dfs (f, v) = let val {blocks, start, ...} = dest f val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun determineControlFlow ({blocks, start, ...}: dest) = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> {block: Block.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, transfer, ...} => let val from = labelNode label val _ = setNodeInfo (from, {block = b}) val _ = Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) in () end) val root = labelNode start val dfsTree = Promise.lazy (fn () => Graph.dfsTree (g, {root = root, nodeValue = #block o nodeInfo})) val dominatorTree = Promise.lazy (fn () => Graph.dominatorTree (g, {root = root, nodeValue = #block o nodeInfo})) in {dfsTree = dfsTree, dominatorTree = dominatorTree, graph = g, labelNode = labelNode, nodeBlock = #block o nodeInfo} end fun layoutDot (f, layoutVar) = let fun toStringStatement s = Layout.toString (Statement.layout' (s, layoutVar)) fun toStringTransfer t = Layout.toString (case t of Case {test, ...} => Layout.seq [Layout.str "case ", layoutVar test] | _ => Transfer.layout' (t, layoutVar)) fun toStringFormals args = Layout.toString (layoutFormals args) fun toStringHeader (name, args) = concat [name, " ", toStringFormals args] val {name, args, start, blocks, returns, raises, ...} = dest f open Dot val graph = Graph.new () val {get = nodeOptions, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref [])) fun setNodeText (n: unit Node.t, l): unit = List.push (nodeOptions n, NodeOption.Label l) fun newNode () = Graph.newNode graph val {destroy, get = labelNode} = Property.destGet (Label.plist, Property.initFun (fn _ => newNode ())) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) fun edge (from, to, label: string, style: style): unit = let val e = Graph.addEdge (graph, {from = from, to = to}) val _ = setEdgeOptions (e, [EdgeOption.label label, EdgeOption.Style style]) in () end val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, transfer} => let val from = labelNode label val edge = fn (to, label, style) => edge (from, labelNode to, label, style) val () = case transfer of Bug => () | Call {return, ...} => let val _ = case return of Return.Dead => () | Return.NonTail {cont, handler} => (edge (cont, "", Dotted) ; (Handler.foreachLabel (handler, fn l => edge (l, "Handle", Dashed)))) | Return.Tail => () in () end | Case {cases, default, ...} => let fun doit (v, toString) = Vector.foreach (v, fn (x, j) => edge (j, toString x, Solid)) val _ = case cases of Cases.Con v => doit (v, Con.toString) | Cases.Word (_, v) => doit (v, fn w => WordX.toString (w, {suffix = true})) val _ = case default of NONE => () | SOME j => edge (j, "Default", Solid) in () end | Goto {dst, ...} => edge (dst, "", Solid) | Raise _ => () | Return _ => () | Runtime {return, ...} => edge (return, "", Dotted) val lab = [(toStringTransfer transfer, Left)] val lab = Vector.foldr (statements, lab, fn (s, ac) => (toStringStatement s, Left) :: ac) val lab = (toStringHeader (Label.toString label, args), Left)::lab val _ = setNodeText (from, lab) in () end) val startNode = labelNode start val funNode = let val funNode = newNode () val _ = edge (funNode, startNode, "Start", Solid) val lab = [(toStringTransfer (Transfer.Goto {dst = start, args = Vector.new0 ()}), Left)] val lab = if !Control.showTypes then ((Layout.toString o Layout.seq) [Layout.str ": ", Layout.record [("returns", Option.layout (Vector.layout Type.layout) returns), ("raises", Option.layout (Vector.layout Type.layout) raises)]], Left)::lab else lab val lab = (toStringHeader ("fun " ^ Func.toString name, args), Left):: lab val _ = setNodeText (funNode, lab) in funNode end val controlFlowGraphLayout = Graph.layoutDot (graph, fn {nodeName} => {title = concat [Func.toString name, " control-flow graph"], options = [GraphOption.Rank (Min, [{nodeName = nodeName funNode}])], edgeOptions = edgeOptions, nodeOptions = fn n => let val l = ! (nodeOptions n) open NodeOption in FontColor Black :: Shape Box :: l end}) val () = Graph.removeNode (graph, funNode) fun dominatorTreeLayout () = let val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeOptions (labelNode label, [NodeOption.label (Label.toString label)])) val dominatorTreeLayout = Tree.layoutDot (Graph.dominatorTree (graph, {root = startNode, nodeValue = fn n => n}), {title = concat [Func.toString name, " dominator tree"], options = [], nodeOptions = nodeOptions}) in dominatorTreeLayout end fun loopForestLayout () = let val {get = nodeName, set = setNodeName, ...} = Property.getSetOnce (Node.plist, Property.initConst "") val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeName (labelNode label, Label.toString label)) val loopForestLayout = Graph.LoopForest.layoutDot (Graph.loopForestSteensgaard (graph, {root = startNode, nodeValue = fn x => x}), {title = concat [Func.toString name, " loop forest"], options = [], name = nodeName}) in loopForestLayout end in {destroy = destroy, controlFlowGraph = controlFlowGraphLayout, dominatorTree = dominatorTreeLayout, loopForest = loopForestLayout} end end fun new (dest: dest) = let val controlFlow = CPromise.delay (fn () => determineControlFlow dest) in T {controlFlow = controlFlow, dest = dest} end fun clear (T {controlFlow, dest, ...}) = let val {args, blocks, ...} = dest val _ = (Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) val _ = CPromise.clear controlFlow in () end fun layoutHeader (f: t): Layout.t = let val {args, name, mayInline, raises, returns, start, ...} = dest f open Layout val (sep, rty) = if !Control.showTypes then (str ":", indent (seq [record [("returns", Option.layout (Vector.layout Type.layout) returns), ("raises", Option.layout (Vector.layout Type.layout) raises)], str " ="], 2)) else (str " =", empty) in mayAlign [mayAlign [seq [str "fun ", if mayInline then empty else str "noinline ", Func.layout name, str " ", layoutFormals args, sep], rty], seq [Label.layout start, str " ()"]] end val parseHeader = let open Parse in kw "fun" *> optional (kw "noinline") >>= (fn noInline => Func.parse >>= (fn name => parseFormals >>= (fn args => sym ":" *> cbrack (ffield ("returns", option (vector Type.parse)) >>= (fn returns => nfield ("raises", option (vector Type.parse)) >>= (fn raises => pure (returns, raises)))) >>= (fn (returns, raises) => sym "=" *> Label.parse >>= (fn start => paren (pure ()) *> pure (Option.isNone noInline, name, args, returns, raises, start)))))) end fun layout' (f: t, layoutVar) = let val {blocks, ...} = dest f open Layout fun layoutBlock b = Block.layout' (b, layoutVar) in align [layoutHeader f, indent (align (Vector.toListMap (blocks, layoutBlock)), 2)] end fun layout f = layout' (f, Var.layout) val parse = let open Parse in new <$> (parseHeader >>= (fn (mayInline, name, args, returns, raises, start) => many Block.parse >>= (fn blocks => pure {mayInline = mayInline, name = name, args = args, returns = returns, raises = raises, start = start, blocks = Vector.fromList blocks}))) end fun layouts (f: t, layoutVar, output: Layout.t -> unit): unit = let val {blocks, name, ...} = dest f val _ = output (layoutHeader f) val _ = Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout' (b, layoutVar), 2))) val _ = if not (!Control.keepDot) then () else let val {destroy, controlFlowGraph, dominatorTree, loopForest} = layoutDot (f, layoutVar) val name = Func.toString name fun doit (s, g) = Control.saveToFile {arg = (), name = SOME (concat [name, ".", s]), toFile = {display = Control.Layout (fn () => g), style = Control.Dot, suffix = "dot"}, verb = Control.Detail} val _ = doit ("cfg", controlFlowGraph) handle _ => Error.warning "SsaTree.layouts: couldn't layout cfg" val _ = doit ("dom", dominatorTree ()) handle _ => Error.warning "SsaTree.layouts: couldn't layout dom" val _ = doit ("lf", loopForest ()) handle _ => Error.warning "SsaTree.layouts: couldn't layout lf" val () = destroy () in () end in () end fun alphaRename f = let local fun make (new, plist) = let val {get, set, destroy, ...} = Property.destGetSetOnce (plist, Property.initConst NONE) fun bind x = let val x' = new x val _ = set (x, SOME x') in x' end fun lookup x = case get x of NONE => x | SOME y => y in (bind, lookup, destroy) end in val (bindVar, lookupVar, destroyVar) = make (Var.new, Var.plist) val (bindLabel, lookupLabel, destroyLabel) = make (Label.new, Label.plist) end val {args, blocks, mayInline, name, raises, returns, start, ...} = dest f val args = Vector.map (args, fn (x, ty) => (bindVar x, ty)) val bindLabel = ignore o bindLabel val bindVar = ignore o bindVar val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (bindLabel label ; Vector.foreach (args, fn (x, _) => bindVar x) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, bindVar)))) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => Block.T {label = lookupLabel label, args = Vector.map (args, fn (x, ty) => (lookupVar x, ty)), statements = Vector.map (statements, fn Statement.T {var, ty, exp} => Statement.T {var = Option.map (var, lookupVar), ty = ty, exp = Exp.replaceVar (exp, lookupVar)}), transfer = Transfer.replaceLabelVar (transfer, lookupLabel, lookupVar)}) val start = lookupLabel start val _ = destroyVar () val _ = destroyLabel () in new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun profile (f: t, sourceInfo): t = if !Control.profile = Control.ProfileNone orelse !Control.profileIL <> Control.ProfileSource then f else let val _ = Control.diagnostic (fn () => layout f) val {args, blocks, mayInline, name, raises, returns, start} = dest f val extraBlocks = ref [] val {get = labelBlock, set = setLabelBlock, rem} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelBlock (label, block)) val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let fun make (exp: Exp.t): Statement.t = Statement.T {exp = exp, ty = Type.unit, var = NONE} val statements = if Label.equals (label, start) then (Vector.concat [Vector.new1 (make (Exp.Profile (ProfileExp.Enter sourceInfo))), statements]) else statements fun leave () = make (Exp.Profile (ProfileExp.Leave sourceInfo)) fun prefix (l: Label.t, statements: Statement.t vector): Label.t = let val Block.T {args, ...} = labelBlock l val c = Label.newNoname () val xs = Vector.map (args, fn (x, _) => Var.new x) val _ = List.push (extraBlocks, Block.T {args = Vector.map2 (xs, args, fn (x, (_, t)) => (x, t)), label = c, statements = statements, transfer = Goto {args = xs, dst = l}}) in c end fun genHandler (cont: Label.t) : Statement.t vector * Label.t * Handler.t = case raises of NONE => (statements, cont, Handler.Caller) | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leave ()), transfer = Transfer.Raise xs}) in (statements, prefix (cont, Vector.new0 ()), Handler.Handle l) end fun addLeave () = (Vector.concat [statements, Vector.new1 (leave ())], transfer) val (statements, transfer) = case transfer of Call {args, func, return} => let datatype z = datatype Return.t in case return of Dead => (statements, transfer) | NonTail {cont, handler} => (case handler of Handler.Dead => (statements, transfer) | Handler.Caller => let val (statements, cont, handler) = genHandler cont val return = Return.NonTail {cont = cont, handler = handler} in (statements, Call {args = args, func = func, return = return}) end | Handler.Handle _ => (statements, transfer)) | Tail => addLeave () end | Raise _ => addLeave () | Return _ => addLeave () | _ => (statements, transfer) in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val _ = Vector.foreach (blocks, rem o Block.label) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val f = new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostic (fn () => layout f) in f end val profile = Trace.trace2 ("SsaTree.Function.profile", layout, SourceInfo.layout, layout) profile end structure Program = struct datatype t = T of { datatypes: Datatype.t vector, globals: Statement.t vector, functions: Function.t list, main: Func.t } end structure Program = struct open Program local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun layoutCallGraph (T {functions, main, ...}, title: string): Layout.t = let open Dot val graph = Graph.new () val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val {get = funcNode, destroy} = Property.destGet (Func.plist, Property.initFun (fn f => let val n = Graph.newNode graph val _ = setNodeOptions (n, let open NodeOption in [FontColor Black, label (Func.toString f)] end) in n end)) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val from = funcNode name val {get, destroy} = Property.destGet (Node.plist, Property.initFun (fn _ => {nontail = ref false, tail = ref false})) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => let val to = funcNode func val {tail, nontail} = get to datatype z = datatype Return.t val is = case return of Dead => false | NonTail _ => true | Tail => false val r = if is then nontail else tail in if !r then () else (r := true ; (setEdgeOptions (Graph.addEdge (graph, {from = from, to = to}), if is then [] else [EdgeOption.Style Dotted]))) end | _ => ()) val _ = destroy () in () end) val root = funcNode main val l = Graph.layoutDot (graph, fn {nodeName} => {title = title, options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = nodeOptions}) val _ = destroy () in l end end fun layouts (p as T {datatypes, globals, functions, main}, output': Layout.t -> unit) = let val layoutVar = Statement.prettifyGlobals globals open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\n(* Datatypes: *)") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (str "\n\n(* Globals: *)") ; Vector.foreach (globals, output o (fn s => Statement.layout' (s, layoutVar))) ; output (str "\n\n(* Functions: *)") ; List.foreach (functions, fn f => Function.layouts (f, layoutVar, output)) ; output (seq [str "\n\n(* Main: *) ", Func.layout main]) ; if not (!Control.keepDot) then () else Control.saveToFile {arg = (), name = NONE, toFile = {display = Control.Layout (fn () => layoutCallGraph (p, !Control.inputFile)), style = Control.Dot, suffix = "call-graph.dot"}, verb = Control.Detail} end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "ssa"} fun parse () = let open Parse val () = Tycon.parseReset {prims = Vector.new1 Tycon.bool} val () = Con.parseReset {prims = Vector.new2 (Con.truee, Con.falsee)} val () = Var.parseReset {prims = Vector.new0 ()} val () = Label.parseReset {prims = Vector.new0 ()} val () = Func.parseReset {prims = Vector.new0 ()} val parseProgram = T <$> (many Datatype.parse >>= (fn datatypes => many Statement.parse >>= (fn globals => many Function.parse >>= (fn functions => Func.parse >>= (fn main => pure {datatypes = Vector.fromList datatypes, globals = Vector.fromList globals, functions = functions, main = main}))))) in parseProgram <* (mlSpaces *> (failing next <|> fail "end of file")) end fun layoutStats (program as T {datatypes, globals, functions, main, ...}) = let val (mainNumVars, mainNumBlocks) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree.Program.layoutStats: no main" | SOME f => let val numVars = ref 0 val _ = Function.foreachVar (f, fn _ => Int.inc numVars) val {blocks, ...} = Function.dest f val numBlocks = Vector.length blocks in (!numVars, numBlocks) end val numTypes = ref 0 val {get = countType, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, countType) => let datatype z = datatype Type.dest val _ = case Type.dest t of Array t => countType t | CPointer => () | Datatype _ => () | IntInf => () | Real _ => () | Ref t => countType t | Thread => () | Tuple ts => Vector.foreach (ts, countType) | Vector t => countType t | Weak t => countType t | Word _ => () val _ = Int.inc numTypes in () end)) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, countType))) val numGlobals = Vector.length globals val numStatements = ref numGlobals val numBlocks = ref 0 val _ = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => let val _ = Int.inc numBlocks val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (statements, fn Statement.T {ty, ...} => let val _ = Int.inc numStatements val _ = countType ty in () end) in () end) in () end) val numFunctions = List.length functions val _ = destroy () open Layout in align [Control.sizeMessage ("ssa program", program), seq [str "num globals = ", Int.layout numGlobals], seq [str "num vars in main = ", Int.layout mainNumVars], seq [str "num blocks in main = ", Int.layout mainNumBlocks], seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end (* clear all property lists reachable from program *) fun clear (T {datatypes, globals, functions, ...}) = ((* Can't do Type.clear because it clears out the info needed for * Type.dest. *) Vector.foreach (datatypes, Datatype.clear) ; Vector.foreach (globals, Statement.clear) ; List.foreach (functions, Function.clear)) fun clearGlobals (T {globals, ...}) = Vector.foreach (globals, Statement.clear) fun clearTop (p as T {datatypes, functions, ...}) = (Vector.foreach (datatypes, Datatype.clear) ; List.foreach (functions, Func.clear o Function.name) ; clearGlobals p) fun foreachVar (T {globals, functions, ...}, f) = (Vector.foreach (globals, fn Statement.T {var, ty, ...} => f (valOf var, ty)) ; List.foreach (functions, fn g => Function.foreachVar (g, f))) fun foreachPrim (T {globals, functions, ...}, f) = let fun loopStatement (Statement.T {exp, ...}) = case exp of PrimApp {prim, ...} => f prim | _ => () fun loopTransfer t = case t of Runtime {prim, ...} => f prim | _ => () val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, loopStatement); loopTransfer transfer))) in () end fun hasPrim (p, f) = Exn.withEscape (fn escape => (foreachPrim (p, fn prim => if f prim then escape true else ()) ; false)) fun mainFunction (T {functions, main, ...}) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree.Program.mainFunction: no main function" | SOME f => f fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList functions val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit main val _ = Vector.foreach (functions, rem o Function.name) in () end end end mlton-20210117+dfsg/mlton/ssa/ssa-tree.sig000066400000000000000000000214561416264345000202040ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA_TREE_STRUCTS = sig include ATOMS end signature SSA_TREE = sig include SSA_TREE_STRUCTS structure Type: sig type t datatype dest = Array of t | CPointer | Datatype of Tycon.t | IntInf | Real of RealSize.t | Ref of t | Thread | Tuple of t vector | Vector of t | Weak of t | Word of WordSize.t val array: t -> t val bool: t val checkPrimApp: {targs: t vector, args: t vector, prim: t Prim.t, result: t} -> bool val cpointer: t val datatypee: Tycon.t -> t val dest: t -> dest val deArray: t -> t val deDatatype: t -> Tycon.t val deRef: t -> t val deTuple: t -> t vector val deTupleOpt: t -> t vector option val deVector: t -> t val deWeak: t -> t val deWord: t -> WordSize.t val deWordOpt: t -> WordSize.t option val equals: t * t -> bool val hash: t -> word val intInf: t val isTuple: t -> bool val isUnit: t -> bool val layout: t -> Layout.t val ofConst: Const.t -> t val plist: t -> PropertyList.t val real: RealSize.t -> t val reff: t -> t val thread: t val tuple: t vector -> t val vector: t -> t val weak: t -> t val word: WordSize.t -> t val unit: t end structure Exp: sig datatype t = ConApp of {args: Var.t vector, con: Con.t} | Const of Const.t | PrimApp of {args: Var.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Select of {offset: int, tuple: Var.t} | Tuple of Var.t vector | Var of Var.t val equals: t * t -> bool val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val maySideEffect: t -> bool val replaceVar: t * (Var.t -> Var.t) -> t val size: t -> int val unit: t end structure Statement: sig datatype t = T of {exp: Exp.t, ty: Type.t, var: Var.t option} val clear: t -> unit (* clear the var *) val exp: t -> Exp.t val layout: t -> Layout.t val profile: ProfileExp.t -> t val var: t -> Var.t option end structure Transfer: sig datatype t = Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {cases: (Con.t, Label.t) Cases.t, default: Label.t option, (* Must be nullary. *) test: Var.t} | Goto of {args: Var.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Var.t vector | Return of Var.t vector | Runtime of {args: Var.t vector, prim: Type.t Prim.t, return: Label.t} val equals: t * t -> bool val foreachFunc : t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachLabelVar: t * (Label.t -> unit) * (Var.t -> unit) -> unit val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val replaceLabelVar: t * (Label.t -> Label.t) * (Var.t -> Var.t) -> t val replaceLabel: t * (Label.t -> Label.t) -> t val replaceVar: t * (Var.t -> Var.t) -> t val size: t -> int end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val args: t -> (Var.t * Type.t) vector val clear: t -> unit val label: t -> Label.t val layout: t -> Layout.t val sizeV: t vector * {sizeExp: Exp.t -> int, sizeTransfer: Transfer.t -> int} -> int val statements: t -> Statement.t vector val transfer: t -> Transfer.t end structure Datatype: sig datatype t = T of {cons: {args: Type.t vector, con: Con.t} vector, tycon: Tycon.t} val layout: t -> Layout.t end structure Function: sig type t val alphaRename: t -> t val blocks: t -> Block.t vector (* clear the plists for all bound variables and labels that appear * in the function, but not the function name's plist. *) val clear: t -> unit val controlFlow: t -> {graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val dominatorTree: t -> Block.t Tree.t val foreachVar: t * (Var.t * Type.t -> unit) -> unit val layout: t -> Layout.t val layoutDot: t * (Var.t -> Layout.t) -> {destroy: unit -> unit, controlFlowGraph: Layout.t, dominatorTree: unit -> Layout.t, loopForest: unit -> Layout.t} val mayInline: t -> bool val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t val profile: t * SourceInfo.t -> t val size: t * {sizeExp: Exp.t -> int, sizeTransfer: Transfer.t -> int} -> int val sizeMax: t * {max: int option, sizeExp: Exp.t -> int, sizeTransfer: Transfer.t -> int} -> int option end structure Program: sig datatype t = T of {datatypes: Datatype.t vector, functions: Function.t list, globals: Statement.t vector, main: Func.t (* Must be nullary. *)} val clear: t -> unit val clearTop: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting f's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val foreachPrim: t * (Type.t Prim.t -> unit) -> unit val foreachVar: t * (Var.t * Type.t -> unit) -> unit val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val mainFunction: t -> Function.t val parse: unit -> t Parse.t val toFile: {style: Control.style, suffix: string, display: t Control.display} end end mlton-20210117+dfsg/mlton/ssa/ssa-tree2.fun000066400000000000000000002502231416264345000202700ustar00rootroot00000000000000(* Copyright (C) 2009,2014,2017-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SsaTree2 (S: SSA_TREE2_STRUCTS): SSA_TREE2 = struct open S (* infix declarations for Parse.Ops *) infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> structure ObjectCon = struct datatype t = Con of Con.t | Sequence | Tuple val equals: t * t -> bool = fn (Con c, Con c') => Con.equals (c, c') | (Sequence, Sequence) => true | (Tuple, Tuple) => true | _ => false val isSequence: t -> bool = fn Sequence => true | _ => false val layout: t -> Layout.t = fn oc => let open Layout in case oc of Con c => Con.layout c | Sequence => str "sequence" | Tuple => str "tuple" end local val conAlts = Vector.fromList [("sequence", Sequence), ("tuple", Tuple)] in val parse = Con.parseAs (conAlts, Con) end end datatype z = datatype ObjectCon.t structure Type = struct datatype t = T of {hash: Word.t, plist: PropertyList.t, tree: tree} and tree = CPointer | Datatype of Tycon.t | IntInf | Object of {args: t Prod.t, con: ObjectCon.t} | Real of RealSize.t | Thread | Weak of t | Word of WordSize.t local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end datatype dest = datatype tree val dest = tree fun equals (t, t') = PropertyList.equals (plist t, plist t') val deSequenceOpt: t -> t Prod.t option = fn t => case dest t of Object {args, con = Sequence} => SOME args | _ => NONE val deSequence1: t -> t = fn t => case deSequenceOpt t of SOME args => if Prod.length args = 1 then Prod.elt (args, 0) else Error.bug "SsaTree2.Type.deSequence1" | _ => Error.bug "SsaTree2.Type.deSequence1" val isSequence: t -> bool = isSome o deSequenceOpt val deWeakOpt: t -> t option = fn t => case dest t of Weak t => SOME t | _ => NONE val deWeak: t -> t = valOf o deWeakOpt local val same: tree * tree -> bool = fn (CPointer, CPointer) => true | (Datatype t1, Datatype t2) => Tycon.equals (t1, t2) | (IntInf, IntInf) => true | (Object {args = a1, con = c1}, Object {args = a2, con = c2}) => ObjectCon.equals (c1, c2) andalso Prod.equals (a1, a2, equals) | (Real s1, Real s2) => RealSize.equals (s1, s2) | (Thread, Thread) => true | (Weak t1, Weak t2) => equals (t1, t2) | (Word s1, Word s2) => WordSize.equals (s1, s2) | _ => false val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", lookup)] end end val newHash = Random.word local fun make f : t -> t = let val w = newHash () in fn t => lookup (Hash.combine (w, hash t), f t) end in val weak = make Weak end val datatypee: Tycon.t -> t = fn t => lookup (Tycon.hash t, Datatype t) val bool = datatypee Tycon.bool val isBool: t -> bool = fn t => case dest t of Datatype t => Tycon.equals (t, Tycon.bool) | _ => false local fun make (tycon, tree) = lookup (Tycon.hash tycon, tree) in val cpointer = make (Tycon.cpointer, CPointer) val intInf = make (Tycon.intInf, IntInf) val thread = make (Tycon.thread, Thread) end val real: RealSize.t -> t = fn s => lookup (Tycon.hash (Tycon.real s), Real s) val word: WordSize.t -> t = fn s => lookup (Tycon.hash (Tycon.word s), Word s) local val tuple = newHash () val sequence = newHash () fun hashProd (p, base) = Hash.combine (base, Hash.vectorMap (Prod.dest p, fn {elt, ...} => hash elt)) in fun object {args, con}: t = let val base = case con of Con c => Con.hash c | Sequence => sequence | Tuple => tuple val hash = hashProd (args, base) in lookup (hash, Object {args = args, con = con}) end end fun sequence p = object {args = p, con = Sequence} fun array1 ty = sequence (Prod.new1Mutable ty) fun vector1 ty = sequence (Prod.new1Immutable ty) fun ofConst c = let datatype z = datatype Const.t in case c of CSymbol _ => cpointer | IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector1 (word (WordXVector.elementSize v)) end fun conApp (con, args) = object {args = args, con = Con con} fun tuple ts = object {args = ts, con = Tuple} fun reff1 t = object {args = Prod.make (Vector.new1 {elt = t, isMutable = true}), con = Tuple} val unit: t = tuple (Prod.empty ()) val isUnit: t -> bool = fn t => case dest t of Object {args, con = Tuple} => Prod.isEmpty args | _ => false local open Layout in val {get = layout, ...} = Property.get (plist, Property.initRec (fn (t, layout) => case dest t of CPointer => str "cpointer" | Datatype t => Tycon.layout t | IntInf => str "intInf" | Object {args, con} => if isUnit t then str "unit" else seq [Prod.layout (args, layout), str " ", ObjectCon.layout con] | Real s => str (concat ["real", RealSize.toString s]) | Thread => str "thread" | Weak t => seq [paren (layout t), str " ", str "weak"] | Word s => str (concat ["word", WordSize.toString s]))) end local structure P = Parse open Parse.Ops val tyconAlts = Vector.fromList ([("cpointer", cpointer), ("intInf", intInf), ("unit", unit), ("thread", thread)] @ List.map (WordSize.all, fn ws => ("word" ^ WordSize.toString ws, word ws)) @ List.map (RealSize.all, fn rs => ("real" ^ RealSize.toString rs, real rs))) val unary = Con.parseAs (Vector.new3 (("sequence", sequence o Prod.new1Immutable), ("tuple", tuple o Prod.new1Immutable), ("weak", weak)), fn con => fn ty => conApp (con, Prod.new1Immutable ty)) in fun parse () = let val parse = P.delay parse in Tycon.parseAs (tyconAlts, datatypee) <|> (P.paren parse >>= (fn ty => unary >>= (fn unary => P.pure (unary ty)))) <|> (Prod.parse parse >>= (fn args => ObjectCon.parse >>= (fn con => P.pure (object {args = args, con = con})))) end val parse = parse () end fun checkPrimApp {args, prim, result}: bool = let exception BadPrimApp fun default () = let val targs = Prim.extractTargs (prim, {args = args, result = result, typeOps = {deArray = fn _ => raise BadPrimApp, deArrow = fn _ => raise BadPrimApp, deRef = fn _ => raise BadPrimApp, deVector = fn _ => raise BadPrimApp, deWeak = deWeak}}) in Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array1, arrow = fn _ => raise BadPrimApp, bool = bool, cpointer = cpointer, equals = equals, exn = unit, intInf = intInf, real = real, reff = fn _ => raise BadPrimApp, thread = thread, unit = unit, vector = vector1, weak = weak, word = word}}) end val default = fn () => (default ()) handle BadPrimApp => false fun arg i = Vector.sub (args, i) fun oneArg f = 1 = Vector.length args andalso f (arg 0) fun twoArgs f = 2 = Vector.length args andalso f (arg 0, arg 1) fun fiveArgs f = 5 = Vector.length args andalso f (arg 0, arg 1, arg 2, arg 3, arg 4) val seqIndex = word (WordSize.seqIndex ()) in case prim of Prim.Array_alloc _ => oneArg (fn n => case deSequenceOpt result of SOME resp => Prod.allAreMutable resp andalso equals (n, seqIndex) | _ => false) | Prim.Array_copyArray => fiveArgs (fn (dst, di, src, si, len) => case (deSequenceOpt dst, deSequenceOpt src) of (SOME dstp, SOME srcp) => Vector.equals (Prod.dest dstp, Prod.dest srcp, fn ({elt = dstElt, isMutable = dstIsMutable}, {elt = srcElt, isMutable = srcIsMutable}) => dstIsMutable andalso srcIsMutable andalso equals (dstElt, srcElt)) andalso equals (di, seqIndex) andalso equals (si, seqIndex) andalso equals (len, seqIndex) andalso isUnit result | _ => false) | Prim.Array_copyVector => fiveArgs (fn (dst, di, src, si, len) => case (deSequenceOpt dst, deSequenceOpt src) of (SOME dstp, SOME srcp) => Vector.equals (Prod.dest dstp, Prod.dest srcp, fn ({elt = dstElt, isMutable = dstIsMutable}, {elt = srcElt, ...}) => dstIsMutable andalso equals (dstElt, srcElt)) andalso equals (di, seqIndex) andalso equals (si, seqIndex) andalso equals (len, seqIndex) andalso isUnit result | _ => false) | Prim.Array_length => oneArg (fn a => isSequence a andalso equals (result, seqIndex)) | Prim.Array_toArray => oneArg (fn arr => case (deSequenceOpt arr, deSequenceOpt result) of (SOME arrp, SOME resp) => Vector.equals (Prod.dest arrp, Prod.dest resp, fn ({elt = arrElt, isMutable = arrIsMutable}, {elt = resElt, isMutable = resIsMutable}) => arrIsMutable andalso resIsMutable andalso equals (arrElt, resElt)) | _ => false) | Prim.Array_toVector => oneArg (fn arr => case (deSequenceOpt arr, deSequenceOpt result) of (SOME arrp, SOME resp) => Vector.equals (Prod.dest arrp, Prod.dest resp, fn ({elt = arrElt, isMutable = arrIsMutable}, {elt = resElt, ...}) => arrIsMutable andalso equals (arrElt, resElt)) | _ => false) | Prim.Array_uninit => twoArgs (fn (arr, i) => case deSequenceOpt arr of SOME arrp => Prod.allAreMutable arrp andalso equals (i, seqIndex) andalso isUnit result | _ => false) | Prim.Array_uninitIsNop => oneArg (fn arr => case deSequenceOpt arr of SOME arrp => Prod.allAreMutable arrp andalso isBool result | _ => false) | _ => default () end end structure Base = struct datatype 'a t = Object of 'a | SequenceSub of {index: 'a, sequence: 'a} fun layout (base: 'a t, layoutX: 'a -> Layout.t): Layout.t = let open Layout in case base of Object x => layoutX x | SequenceSub {index, sequence} => seq [str "$", tuple [layoutX sequence, layoutX index]] end fun parse (parseX: 'a Parse.t): 'a t Parse.t = let open Parse in SequenceSub <$> (mlSpaces *> str "$(" *> parseX >>= (fn sequence => mlSpaces *> str "," *> parseX >>= (fn index => mlSpaces *> str ")" *> pure {index = index, sequence = sequence}))) <|> (Object <$> parseX) end fun layoutWithOffset (base: 'a t, offset, layoutX: 'a -> Layout.t): Layout.t = let open Layout in seq [str "#", Int.layout offset, str " ", layout (base, layoutX)] end fun parseWithOffset (parseX: 'a Parse.t): ('a t * int) Parse.t = let open Parse in mlSpaces *> char #"#" *> (peek (nextSat Char.isDigit) *> fromScan (Function.curry Int.scan StringCvt.DEC)) >>= (fn offset => parse parseX >>= (fn base => pure (base, offset))) end val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool = fn (b1, b2, equalsX) => case (b1, b2) of (Object x1, Object x2) => equalsX (x1, x2) | (SequenceSub {index = i1, sequence = v1}, SequenceSub {index = i2, sequence = v2}) => equalsX (i1, i2) andalso equalsX (v1, v2) | _ => false fun object (b: 'a t): 'a = case b of Object x => x | SequenceSub {sequence = x, ...} => x local val newHash = Random.word val object = newHash () val sequenceSub = newHash () in val hash: 'a t * ('a -> word) -> word = fn (b, hashX) => case b of Object x => Hash.combine (object, hashX x) | SequenceSub {index, sequence} => Hash.combine3 (hashX index, hashX sequence, sequenceSub) end fun foreach (b: 'a t, f: 'a -> unit): unit = case b of Object x => f x | SequenceSub {index, sequence} => (f index; f sequence) fun map (b: 'a t, f: 'a -> 'b): 'b t = case b of Object x => Object (f x) | SequenceSub {index, sequence} => SequenceSub {index = f index, sequence = f sequence} end structure Exp = struct datatype t = Const of Const.t | Inject of {sum: Tycon.t, variant: Var.t} | Object of {con: Con.t option, args: Var.t vector} | PrimApp of {prim: Type.t Prim.t, args: Var.t vector} | Select of {base: Var.t Base.t, offset: int} | Sequence of {args: Var.t vector vector} | Var of Var.t val unit = Object {con = NONE, args = Vector.new0 ()} fun foreachVar (e, v) = let fun vs xs = Vector.foreach (xs, v) in case e of Const _ => () | Inject {variant, ...} => v variant | Object {args, ...} => vs args | PrimApp {args, ...} => vs args | Select {base, ...} => Base.foreach (base, v) | Sequence {args, ...} => Vector.foreach (args, vs) | Var x => v x end fun replaceVar (e, fx) = let fun fxs xs = Vector.map (xs, fx) in case e of Const _ => e | Inject {sum, variant} => Inject {sum = sum, variant = fx variant} | Object {con, args} => Object {con = con, args = fxs args} | PrimApp {prim, args} => PrimApp {args = fxs args, prim = prim} | Select {base, offset} => Select {base = Base.map (base, fx), offset = offset} | Sequence {args} => Sequence {args = Vector.map (args, fxs)} | Var x => Var (fx x) end fun layout' (e, layoutVar) = let open Layout fun layoutArgs xs = Vector.layout layoutVar xs in case e of Const c => Const.layout c | Inject {sum, variant} => seq [str "inj ", paren (layoutVar variant), str ": ", Tycon.layout sum] | Object {con, args} => seq [str "obj ", (case con of NONE => empty | SOME c => seq [Con.layout c, str " "]), layoutArgs args] | PrimApp {args, prim} => seq [str "prim ", Prim.layoutFull (prim, Type.layout), str " ", layoutArgs args] | Select {base, offset} => Base.layoutWithOffset (base, offset, layoutVar) | Sequence {args} => seq [str "seq ", Vector.layout layoutArgs args] | Var x => layoutVar x end fun layout e = layout' (e, Var.layout) val parse = let open Parse val parseArgs = vector Var.parse in mlSpaces *> any [Const <$> Const.parse, Inject <$> (kw "inj" *> paren Var.parse >>= (fn variant => sym ":" *> Tycon.parse >>= (fn sum => pure {variant = variant, sum = sum}))), Object <$> (kw "obj" *> optional Con.parse >>= (fn con => parseArgs >>= (fn args => pure {con = con, args = args}))), PrimApp <$> (kw "prim" *> Prim.parseFull Type.parse >>= (fn prim => parseArgs >>= (fn args => pure {prim = prim, args = args}))), Select <$> (Base.parseWithOffset Var.parse >>= (fn (base, offset) => pure {base = base, offset = offset})), Sequence <$> (kw "seq" *> vector parseArgs >>= (fn args => pure {args = args})), Var <$> Var.parse] end fun maySideEffect (e: t): bool = case e of Const _ => false | Inject _ => false | Object _ => false | PrimApp {prim,...} => Prim.maySideEffect prim | Select _ => false | Sequence _ => false | Var _ => false fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Const c, Const c') => Const.equals (c, c') | (Object {con, args}, Object {con = con', args = args'}) => Option.equals (con, con', Con.equals) andalso varsEquals (args, args') | (PrimApp {prim, args, ...}, PrimApp {prim = prim', args = args', ...}) => Prim.equals (prim, prim') andalso varsEquals (args, args') | (Select {base = b1, offset = i1}, Select {base = b2, offset = i2}) => Base.equals (b1, b2, Var.equals) andalso i1 = i2 | (Sequence {args}, Sequence {args = args'}) => Vector.equals (args, args', varsEquals) | (Var x, Var x') => Var.equals (x, x') | _ => false (* quell unused warning *) val _ = equals local val newHash = Random.word val inject = newHash () val primApp = newHash () val select = newHash () val sequence = newHash () val tuple = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Hash.combine (w, Hash.vectorMap (xs, Var.hash)) in val hash: t -> Word.t = fn Const c => Const.hash c | Inject {sum, variant} => Hash.combine3 (inject, Tycon.hash sum, Var.hash variant) | Object {con, args, ...} => hashVars (args, case con of NONE => tuple | SOME c => Con.hash c) | PrimApp {args, ...} => hashVars (args, primApp) | Select {base, offset} => Hash.combine3 (select, Base.hash (base, Var.hash), Word.fromInt offset) | Sequence {args} => Hash.combine (sequence, Hash.vectorMap (args, fn args => Hash.vectorMap (args, Var.hash))) | Var x => Var.hash x end (* quell unused warning *) val _ = hash end datatype z = datatype Exp.t structure Statement = struct datatype t = Bind of {var: Var.t option, ty: Type.t, exp: Exp.t} | Profile of ProfileExp.t | Update of {base: Var.t Base.t, offset: int, value: Var.t} fun layout' (s: t, layoutVar): Layout.t = let open Layout in case s of Bind {var, ty, exp} => let val (sep, ty) = if !Control.showTypes then (str ":", indent (seq [Type.layout ty, str " ="], 2)) else (str " =", empty) in mayAlign [mayAlign [seq [str "val ", case var of NONE => str "_" | SOME var => Var.layout var, sep], ty], indent (Exp.layout' (exp, layoutVar), 2)] end | Profile p => seq [str "prof ", ProfileExp.layout p] | Update {base, offset, value} => mayAlign [seq [str "upd ", Base.layoutWithOffset (base, offset, layoutVar), str " :="], layoutVar value] end fun layout s = layout' (s, Var.layout) val parse = let open Parse in mlSpaces *> any [Bind <$> (kw "val" *> ((SOME <$> Var.parse) <|> (NONE <$ kw "_")) >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=" *> Exp.parse >>= (fn exp => pure {var = var, ty = ty, exp = exp})))), Update <$> (kw "upd" *> Base.parseWithOffset Var.parse >>= (fn (base, offset) => sym ":=" *> Var.parse >>= (fn value => pure {base = base, offset = offset, value = value})))] end val profile = Profile fun foreachDef (s: t, f: Var.t * Type.t -> unit): unit = case s of Bind {ty, var, ...} => Option.app (var, fn x => f (x, ty)) | _ => () fun clear s = foreachDef (s, Var.clear o #1) fun prettifyGlobals (v: t vector): Var.t -> Layout.t = let val {get = global: Var.t -> Layout.t, set = setGlobal, ...} = Property.getSet (Var.plist, Property.initFun Var.layout) val _ = Vector.foreach (v, fn s => case s of Bind {var, exp, ...} => Option.app (var, fn var => let fun set () = let val s = Layout.toString (Exp.layout' (exp, Var.layout)) val maxSize = 20 val dots = " ... " val dotsSize = String.size dots val frontSize = 2 * (maxSize - dotsSize) div 3 val backSize = maxSize - dotsSize - frontSize val s = if String.size s > maxSize then concat [String.prefix (s, frontSize), dots, String.suffix (s, backSize)] else s in if String.hasSubstring (s, {substring = "(*"}) orelse String.hasSubstring (s, {substring = "*)"}) then () else setGlobal (var, Layout.seq [Var.layout var, Layout.str (" (*" ^ s ^ "*)")]) end in case exp of Const _ => set () | Object {con, args, ...} => (case con of NONE => if Vector.isEmpty args then set () else () | SOME _ => set ()) | _ => () end) | _ => ()) in global end fun foreachUse (s: t, f: Var.t -> unit): unit = case s of Bind {exp, ...} => Exp.foreachVar (exp, f) | Profile _ => () | Update {base, value, ...} => (Base.foreach (base, f); f value) fun replaceDefsUses (s: t, {def: Var.t -> Var.t, use: Var.t -> Var.t}): t = case s of Bind {exp, ty, var} => Bind {exp = Exp.replaceVar (exp, use), ty = ty, var = Option.map (var, def)} | Profile _ => s | Update {base, offset, value} => Update {base = Base.map (base, use), offset = offset, value = use value} fun replaceUses (s, f) = replaceDefsUses (s, {def = fn x => x, use = f}) end datatype z = datatype Statement.t structure Transfer = struct datatype t = Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {test: Var.t, cases: (Con.t, Label.t) Cases.t, default: Label.t option} (* Must be nullary. *) | Goto of {dst: Label.t, args: Var.t vector} | Raise of Var.t vector | Return of Var.t vector | Runtime of {prim: Type.t Prim.t, args: Var.t vector, return: Label.t} fun foreachFuncLabelVar (t, func: Func.t -> unit, label: Label.t -> unit, var) = let fun vars xs = Vector.foreach (xs, var) in case t of Bug => () | Call {func = f, args, return, ...} => (func f ; Return.foreachLabel (return, label) ; vars args) | Case {test, cases, default, ...} => (var test ; Cases.foreach (cases, label) ; Option.app (default, label)) | Goto {dst, args, ...} => (vars args; label dst) | Raise xs => vars xs | Return xs => vars xs | Runtime {args, return, ...} => (vars args ; label return) end fun foreachFunc (t, func) = foreachFuncLabelVar (t, func, fn _ => (), fn _ => ()) (* quell unused warning *) val _ = foreachFunc fun foreachLabelVar (t, label, var) = foreachFuncLabelVar (t, fn _ => (), label, var) fun foreachLabel (t, j) = foreachLabelVar (t, j, fn _ => ()) fun foreachVar (t, v) = foreachLabelVar (t, fn _ => (), v) fun replaceLabelVar (t, fl, fx) = let fun fxs xs = Vector.map (xs, fx) in case t of Bug => Bug | Call {func, args, return} => Call {func = func, args = fxs args, return = Return.map (return, fl)} | Case {test, cases, default} => Case {test = fx test, cases = Cases.map(cases, fl), default = Option.map(default, fl)} | Goto {dst, args} => Goto {dst = fl dst, args = fxs args} | Raise xs => Raise (fxs xs) | Return xs => Return (fxs xs) | Runtime {prim, args, return} => Runtime {prim = prim, args = fxs args, return = fl return} end fun replaceLabel (t, f) = replaceLabelVar (t, f, fn x => x) (* quell unused warning *) val _ = replaceLabel fun replaceVar (t, f) = replaceLabelVar (t, fn l => l, f) fun layout' (t, layoutVar) = let open Layout fun layoutArgs xs = Vector.layout layoutVar xs fun layoutCase {test, cases, default} = let fun doit (l, layout) = Vector.toListMap (l, fn (i, l) => seq [layout i, str " => ", Label.layout l]) datatype z = datatype Cases.t val (suffix, cases) = case cases of Con l => (empty, doit (l, Con.layout)) | Word (size, l) => (str (WordSize.toString size), doit (l, fn w => (WordX.layout (w, {suffix = true})))) val cases = case default of NONE => cases | SOME j => cases @ [seq [str "_ => ", Label.layout j]] in align [seq [str "case", suffix, str " ", layoutVar test, str " of"], indent (alignPrefix (cases, "| "), 2)] end fun layoutPrim {prim, args} = seq [Prim.layoutFull (prim, Type.layout), str " ", layoutArgs args] in case t of Bug => str "bug" | Call {func, args, return} => let val call = seq [Func.layout func, str " ", layoutArgs args] in case return of Return.Dead => seq [str "call dead ", call] | Return.NonTail {cont, handler} => seq [str "call ", Label.layout cont, str " ", paren call, str " handle _ => ", case handler of Handler.Caller => str "raise" | Handler.Dead => str "dead" | Handler.Handle l => Label.layout l] | Return.Tail => seq [str "call tail ", call] end | Case arg => layoutCase arg | Goto {dst, args} => seq [str "goto ", Label.layout dst, str " ", layoutArgs args] | Raise xs => seq [str "raise ", layoutArgs xs] | Return xs => seq [str "return ", layoutArgs xs] | Runtime {prim, args, return} => seq [str "runtime ", Label.layout return, str " ", paren (layoutPrim {prim = prim, args = args})] end fun layout t = layout' (t, Var.layout) val parse = let open Parse val parseArgs = vector Var.parse fun parseCase (parse', mk) = Var.parse >>= (fn test => kw "of" *> (Vector.fromList <$> sepBy (parse' >>= (fn p => sym "=>" *> Label.parse >>= (fn l => pure (p, l))), sym "|")) >>= (fn cases => optional ((if Vector.isEmpty cases then pure () else sym "|") *> kw "_" *> sym "=>" *> Label.parse) >>= (fn default => pure {test = test, cases = mk cases, default = default}))) val parseCall = Func.parse >>= (fn func => parseArgs >>= (fn args => pure (fn return => pure {func = func, args = args, return = return}))) in mlSpaces *> any [Bug <$ kw "bug", Call <$> (kw "call" *> mlSpaces *> any [kw "dead" *> parseCall >>= (fn mkCall => mkCall Return.Dead), kw "tail" *> parseCall >>= (fn mkCall => mkCall Return.Tail), Label.parse >>= (fn cont => paren parseCall >>= (fn mkCall => kw "handle" *> kw "_" *> sym "=>" *> any [kw "raise" *> mkCall (Return.NonTail {cont = cont, handler = Handler.Caller}), kw "dead" *> mkCall (Return.NonTail {cont = cont, handler = Handler.Dead}), Label.parse >>= (fn h => mkCall (Return.NonTail {cont = cont, handler = Handler.Handle h}))]))]), Case <$> any ((kw "case" *> parseCase (Con.parse, Cases.Con)) :: (List.map (WordSize.all, fn ws => kw ("case" ^ WordSize.toString ws) *> parseCase (WordX.parse, fn cases => Cases.Word (ws, cases))))), Goto <$> (kw "goto" *> Label.parse >>= (fn dst => parseArgs >>= (fn args => pure {dst = dst, args = args}))), Raise <$> (kw "raise" *> parseArgs), Return <$> (kw "return" *> parseArgs), Runtime <$> (kw "runtime" *> Label.parse >>= (fn return => paren (Prim.parseFull Type.parse >>= (fn prim => parseArgs >>= (fn args => pure (prim, args)))) >>= (fn (prim, args) => pure {prim = prim, args = args, return = return})))] end fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Bug, Bug) => true | (Call {func, args, return}, Call {func = func', args = args', return = return'}) => Func.equals (func, func') andalso varsEquals (args, args') andalso Return.equals (return, return') | (Case {test, cases, default}, Case {test = test', cases = cases', default = default'}) => Var.equals (test, test') andalso Cases.equals (cases, cases', Con.equals, Label.equals) andalso Option.equals (default, default', Label.equals) | (Goto {dst, args}, Goto {dst = dst', args = args'}) => Label.equals (dst, dst') andalso varsEquals (args, args') | (Raise xs, Raise xs') => varsEquals (xs, xs') | (Return xs, Return xs') => varsEquals (xs, xs') | (Runtime {prim, args, return}, Runtime {prim = prim', args = args', return = return'}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (return, return') | _ => false (* quell unused warning *) val _ = equals local val newHash = Random.word val bug = newHash () val raisee = newHash () val return = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Hash.combine (w, Hash.vectorMap (xs, Var.hash)) fun hash2 (w1: Word.t, w2: Word.t) = Hash.combine (w1, w2) in val hash: t -> Word.t = fn Bug => bug | Call {func, args, return} => hashVars (args, hash2 (Func.hash func, Return.hash return)) | Case {test, cases, default} => hash2 (Var.hash test, Cases.fold (cases, Option.fold (default, 0wx55555555, fn (l, w) => hash2 (Label.hash l, w)), fn (l, w) => hash2 (Label.hash l, w))) | Goto {dst, args} => hashVars (args, Label.hash dst) | Raise xs => hashVars (xs, raisee) | Return xs => hashVars (xs, return) | Runtime {args, return, ...} => hashVars (args, Label.hash return) end (* quell unused warning *) val _ = hash end datatype z = datatype Transfer.t local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => if !Control.showTypes then mayAlign [seq [Var.layout x, str ":"], indent (Type.layout t, 2)] else Var.layout x) xts end local open Parse in val parseFormals = vector (Var.parse >>= (fn x => sym ":" *> Type.parse >>= (fn ty => pure (x, ty)))) end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val args = make #args val label = make #label val transfer = make #transfer end fun layout' (T {label, args, statements, transfer}, layoutVar) = let open Layout fun layoutStatement s = Statement.layout' (s, layoutVar) fun layoutTransfer t = Transfer.layout' (t, layoutVar) in align [seq [str "block ", Label.layout label, str " ", layoutFormals args], indent (align [align (Vector.toListMap (statements, layoutStatement)), layoutTransfer transfer], 2)] end fun layout b = layout' (b, Var.layout) val parse = let open Parse in T <$> (kw "block" *> Label.parse >>= (fn label => parseFormals >>= (fn args => many Statement.parse >>= (fn statements => Transfer.parse >>= (fn transfer => pure {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}))))) end fun clear (T {label, args, statements, ...}) = (Label.clear label ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (statements, Statement.clear)) end structure Datatype = struct datatype t = T of {cons: {args: Type.t Prod.t, con: Con.t} vector, tycon: Tycon.t} fun layout (T {cons, tycon}) = let open Layout in seq [str "datatype ", Tycon.layout tycon, str " = ", alignPrefix (Vector.toListMap (cons, fn {con, args} => seq [Prod.layout (args, Type.layout), str " ", Con.layout con]), "| ")] end val parse = let open Parse in T <$> (kw "datatype" *> Tycon.parse >>= (fn tycon => sym "=" *> sepBy (Prod.parse Type.parse >>= (fn args => Con.parse >>= (fn con => pure {con = con, args = args})), sym "|") >>= (fn cons => pure {tycon = tycon, cons = Vector.fromList cons}))) end fun clear (T {cons, tycon}) = (Tycon.clear tycon ; Vector.foreach (cons, Con.clear o #con)) end structure Function = struct structure CPromise = ClearablePromise type dest = {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* There is a messy interaction between the laziness used in controlFlow * and the property lists on labels because the former stores * stuff on the property lists. So, if you force the laziness, then * clear the property lists, then try to use the lazy stuff, you will * get screwed with undefined properties. The right thing to do is reset * the laziness when the properties are cleared. *) datatype t = T of {controlFlow: {dfsTree: unit -> Block.t Tree.t, dominatorTree: unit -> Block.t Tree.t, graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} CPromise.t, dest: dest} local fun make f (T {dest, ...}) = f dest in val blocks = make #blocks val dest = make (fn d => d) val name = make #name end fun foreachVar (f: t, fx: Var.t * Type.t -> unit): unit = let val {args, blocks, ...} = dest f val _ = Vector.foreach (args, fx) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach (args, fx) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, fx)))) in () end fun controlFlow (T {controlFlow, ...}) = let val {graph, labelNode, nodeBlock, ...} = CPromise.force controlFlow in {graph = graph, labelNode = labelNode, nodeBlock = nodeBlock} end local fun make sel = fn T {controlFlow, ...} => sel (CPromise.force controlFlow) () in val dominatorTree = make #dominatorTree end fun dfs (f, v) = let val {blocks, start, ...} = dest f val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun determineControlFlow ({blocks, start, ...}: dest) = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> {block: Block.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, transfer, ...} => let val from = labelNode label val _ = setNodeInfo (from, {block = b}) val _ = Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) in () end) val root = labelNode start val dfsTree = Promise.lazy (fn () => Graph.dfsTree (g, {root = root, nodeValue = #block o nodeInfo})) val dominatorTree = Promise.lazy (fn () => Graph.dominatorTree (g, {root = root, nodeValue = #block o nodeInfo})) in {dfsTree = dfsTree, dominatorTree = dominatorTree, graph = g, labelNode = labelNode, nodeBlock = #block o nodeInfo} end fun layoutDot (f, layoutVar) = let fun toStringStatement s = Layout.toString (Statement.layout' (s, layoutVar)) fun toStringTransfer t = Layout.toString (case t of Case {test, ...} => Layout.seq [Layout.str "case ", layoutVar test] | _ => Transfer.layout' (t, layoutVar)) fun toStringFormals args = Layout.toString (layoutFormals args) fun toStringHeader (name, args) = concat [name, " ", toStringFormals args] val {name, args, start, blocks, returns, raises, ...} = dest f open Dot val graph = Graph.new () val {get = nodeOptions, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref [])) fun setNodeText (n: unit Node.t, l): unit = List.push (nodeOptions n, NodeOption.Label l) fun newNode () = Graph.newNode graph val {destroy, get = labelNode} = Property.destGet (Label.plist, Property.initFun (fn _ => newNode ())) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) fun edge (from, to, label: string, style: style): unit = let val e = Graph.addEdge (graph, {from = from, to = to}) val _ = setEdgeOptions (e, [EdgeOption.label label, EdgeOption.Style style]) in () end val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, transfer} => let val from = labelNode label val edge = fn (to, label, style) => edge (from, labelNode to, label, style) val () = case transfer of Bug => () | Call {return, ...} => let val _ = case return of Return.Dead => () | Return.NonTail {cont, handler} => (edge (cont, "", Dotted) ; (Handler.foreachLabel (handler, fn l => edge (l, "Handle", Dashed)))) | Return.Tail => () in () end | Case {cases, default, ...} => let fun doit (v, toString) = Vector.foreach (v, fn (x, j) => edge (j, toString x, Solid)) val _ = case cases of Cases.Con v => doit (v, Con.toString) | Cases.Word (_, v) => doit (v, fn w => WordX.toString (w, {suffix = true})) val _ = case default of NONE => () | SOME j => edge (j, "Default", Solid) in () end | Goto {dst, ...} => edge (dst, "", Solid) | Raise _ => () | Return _ => () | Runtime {return, ...} => edge (return, "", Dotted) val lab = [(toStringTransfer transfer, Left)] val lab = Vector.foldr (statements, lab, fn (s, ac) => (toStringStatement s, Left) :: ac) val lab = (toStringHeader (Label.toString label, args), Left)::lab val _ = setNodeText (from, lab) in () end) val startNode = labelNode start val funNode = let val funNode = newNode () val _ = edge (funNode, startNode, "Start", Solid) val lab = [(toStringTransfer (Transfer.Goto {dst = start, args = Vector.new0 ()}), Left)] val lab = if !Control.showTypes then ((Layout.toString o Layout.seq) [Layout.str ": ", Layout.record [("returns", Option.layout (Vector.layout Type.layout) returns), ("raises", Option.layout (Vector.layout Type.layout) raises)]], Left)::lab else lab val lab = (toStringHeader ("fun " ^ Func.toString name, args), Left):: lab val _ = setNodeText (funNode, lab) in funNode end val controlFlowGraphLayout = Graph.layoutDot (graph, fn {nodeName} => {title = concat [Func.toString name, " control-flow graph"], options = [GraphOption.Rank (Min, [{nodeName = nodeName funNode}])], edgeOptions = edgeOptions, nodeOptions = fn n => let val l = ! (nodeOptions n) open NodeOption in FontColor Black :: Shape Box :: l end}) val () = Graph.removeNode (graph, funNode) fun dominatorTreeLayout () = let val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeOptions (labelNode label, [NodeOption.label (Label.toString label)])) val dominatorTreeLayout = Tree.layoutDot (Graph.dominatorTree (graph, {root = startNode, nodeValue = fn n => n}), {title = concat [Func.toString name, " dominator tree"], options = [], nodeOptions = nodeOptions}) in dominatorTreeLayout end fun loopForestLayout () = let val {get = nodeName, set = setNodeName, ...} = Property.getSetOnce (Node.plist, Property.initConst "") val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeName (labelNode label, Label.toString label)) val loopForestLayout = Graph.LoopForest.layoutDot (Graph.loopForestSteensgaard (graph, {root = startNode, nodeValue = fn x => x}), {title = concat [Func.toString name, " loop forest"], options = [], name = nodeName}) in loopForestLayout end in {destroy = destroy, controlFlowGraph = controlFlowGraphLayout, dominatorTree = dominatorTreeLayout, loopForest = loopForestLayout} end end fun new (dest: dest) = let val controlFlow = CPromise.delay (fn () => determineControlFlow dest) in T {controlFlow = controlFlow, dest = dest} end fun clear (T {controlFlow, dest, ...}) = let val {args, blocks, ...} = dest val _ = (Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) val _ = CPromise.clear controlFlow in () end fun layoutHeader (f: t): Layout.t = let val {args, name, mayInline, raises, returns, start, ...} = dest f open Layout val (sep, rty) = if !Control.showTypes then (str ":", indent (seq [record [("returns", Option.layout (Vector.layout Type.layout) returns), ("raises", Option.layout (Vector.layout Type.layout) raises)], str " ="], 2)) else (str " =", empty) in mayAlign [mayAlign [seq [str "fun ", if mayInline then empty else str "noinline ", Func.layout name, str " ", layoutFormals args, sep], rty], seq [Label.layout start, str " ()"]] end val parseHeader = let open Parse in kw "fun" *> optional (kw "noinline") >>= (fn noInline => Func.parse >>= (fn name => parseFormals >>= (fn args => sym ":" *> cbrack (ffield ("returns", option (vector Type.parse)) >>= (fn returns => nfield ("raises", option (vector Type.parse)) >>= (fn raises => pure (returns, raises)))) >>= (fn (returns, raises) => sym "=" *> Label.parse >>= (fn start => paren (pure ()) *> pure (Option.isNone noInline, name, args, returns, raises, start)))))) end fun layout' (f: t, layoutVar) = let val {blocks, ...} = dest f open Layout fun layoutBlock b = Block.layout' (b, layoutVar) in align [layoutHeader f, indent (align (Vector.toListMap (blocks, layoutBlock)), 2)] end fun layout f = layout' (f, Var.layout) val parse = let open Parse in new <$> (parseHeader >>= (fn (mayInline, name, args, returns, raises, start) => many Block.parse >>= (fn blocks => pure {mayInline = mayInline, name = name, args = args, returns = returns, raises = raises, start = start, blocks = Vector.fromList blocks}))) end fun layouts (f: t, layoutVar, output: Layout.t -> unit): unit = let val {blocks, name, ...} = dest f val _ = output (layoutHeader f) val _ = Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout' (b, layoutVar), 2))) val _ = if not (!Control.keepDot) then () else let val {destroy, controlFlowGraph, dominatorTree, loopForest} = layoutDot (f, layoutVar) val name = Func.toString name fun doit (s, g) = Control.saveToFile {arg = (), name = SOME (concat [name, ".", s]), toFile = {display = Control.Layout (fn () => g), style = Control.Dot, suffix = ".dot"}, verb = Control.Detail} val _ = doit ("cfg", controlFlowGraph) handle _ => Error.warning "SsaTree2.layouts: couldn't layout cfg" val _ = doit ("dom", dominatorTree ()) handle _ => Error.warning "SsaTree2.layouts: couldn't layout dom" val _ = doit ("lf", loopForest ()) handle _ => Error.warning "SsaTree2.layouts: couldn't layout lf" val () = destroy () in () end in () end fun alphaRename f = let local fun make (new, plist) = let val {get, set, destroy, ...} = Property.destGetSetOnce (plist, Property.initConst NONE) fun bind x = let val x' = new x val _ = set (x, SOME x') in x' end fun lookup x = case get x of NONE => x | SOME y => y in (bind, lookup, destroy) end in val (bindVar, lookupVar, destroyVar) = make (Var.new, Var.plist) val (bindLabel, lookupLabel, destroyLabel) = make (Label.new, Label.plist) end val {args, blocks, mayInline, name, raises, returns, start, ...} = dest f val args = Vector.map (args, fn (x, ty) => (bindVar x, ty)) val bindLabel = ignore o bindLabel val bindVar = ignore o bindVar val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (bindLabel label ; Vector.foreach (args, fn (x, _) => bindVar x) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, bindVar o #1)))) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => Block.T {label = lookupLabel label, args = Vector.map (args, fn (x, ty) => (lookupVar x, ty)), statements = (Vector.map (statements, fn s => Statement.replaceDefsUses (s, {def = lookupVar, use = lookupVar}))), transfer = Transfer.replaceLabelVar (transfer, lookupLabel, lookupVar)}) val start = lookupLabel start val _ = destroyVar () val _ = destroyLabel () in new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end (* quell unused warning *) val _ = alphaRename fun profile (f: t, sourceInfo): t = if !Control.profile = Control.ProfileNone orelse !Control.profileIL <> Control.ProfileSource then f else let val _ = Control.diagnostic (fn () => layout f) val {args, blocks, mayInline, name, raises, returns, start} = dest f val extraBlocks = ref [] val {get = labelBlock, set = setLabelBlock, rem} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelBlock (label, block)) val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val statements = if Label.equals (label, start) then (Vector.concat [Vector.new1 (Profile (ProfileExp.Enter sourceInfo)), statements]) else statements fun leave () = Profile (ProfileExp.Leave sourceInfo) fun prefix (l: Label.t, statements: Statement.t vector): Label.t = let val Block.T {args, ...} = labelBlock l val c = Label.newNoname () val xs = Vector.map (args, fn (x, _) => Var.new x) val _ = List.push (extraBlocks, Block.T {args = Vector.map2 (xs, args, fn (x, (_, t)) => (x, t)), label = c, statements = statements, transfer = Goto {args = xs, dst = l}}) in c end fun genHandler (cont: Label.t) : Statement.t vector * Label.t * Handler.t = case raises of NONE => (statements, cont, Handler.Caller) | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leave ()), transfer = Transfer.Raise xs}) in (statements, prefix (cont, Vector.new0 ()), Handler.Handle l) end fun addLeave () = (Vector.concat [statements, Vector.new1 (leave ())], transfer) val (statements, transfer) = case transfer of Call {args, func, return} => let datatype z = datatype Return.t in case return of Dead => (statements, transfer) | NonTail {cont, handler} => (case handler of Handler.Dead => (statements, transfer) | Handler.Caller => let val (statements, cont, handler) = genHandler cont val return = Return.NonTail {cont = cont, handler = handler} in (statements, Call {args = args, func = func, return = return}) end | Handler.Handle _ => (statements, transfer)) | Tail => addLeave () end | Raise _ => addLeave () | Return _ => addLeave () | _ => (statements, transfer) in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val _ = Vector.foreach (blocks, rem o Block.label) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val f = new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostic (fn () => layout f) in f end val profile = Trace.trace2 ("SsaTree2.Function.profile", layout, SourceInfo.layout, layout) profile end structure Program = struct datatype t = T of { datatypes: Datatype.t vector, globals: Statement.t vector, functions: Function.t list, main: Func.t } end structure Program = struct open Program local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun layoutCallGraph (T {functions, main, ...}, title: string): Layout.t = let open Dot val graph = Graph.new () val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val {get = funcNode, destroy} = Property.destGet (Func.plist, Property.initFun (fn f => let val n = Graph.newNode graph val _ = setNodeOptions (n, let open NodeOption in [FontColor Black, label (Func.toString f)] end) in n end)) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val from = funcNode name val {get, destroy} = Property.destGet (Node.plist, Property.initFun (fn _ => {nontail = ref false, tail = ref false})) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => let val to = funcNode func val {tail, nontail} = get to datatype z = datatype Return.t val is = case return of Dead => false | NonTail _ => true | Tail => false val r = if is then nontail else tail in if !r then () else (r := true ; (setEdgeOptions (Graph.addEdge (graph, {from = from, to = to}), if is then [] else [EdgeOption.Style Dotted]))) end | _ => ()) val _ = destroy () in () end) val root = funcNode main val l = Graph.layoutDot (graph, fn {nodeName} => {title = title, options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = nodeOptions}) val _ = destroy () in l end end fun layouts (p as T {datatypes, globals, functions, main}, output': Layout.t -> unit) = let val layoutVar = Statement.prettifyGlobals globals open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\n(* Datatypes: *)") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (str "\n\n(* Globals: *)") ; Vector.foreach (globals, output o (fn s => Statement.layout' (s, layoutVar))) ; output (str "\n\n(* Functions: *)") ; List.foreach (functions, fn f => Function.layouts (f, layoutVar, output)) ; output (seq [str "\n\n(* Main: *) ", Func.layout main]) ; if not (!Control.keepDot) then () else Control.saveToFile {arg = (), name = SOME "call-graph", toFile = {display = Control.Layout (fn () => layoutCallGraph (p, !Control.inputFile)), style = Control.Dot, suffix = "dot"}, verb = Control.Detail} end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "ssa2"} fun parse () = let open Parse val () = Tycon.parseReset {prims = Vector.new1 Tycon.bool} val () = Con.parseReset {prims = Vector.new2 (Con.truee, Con.falsee)} val () = Var.parseReset {prims = Vector.new0 ()} val () = Label.parseReset {prims = Vector.new0 ()} val () = Func.parseReset {prims = Vector.new0 ()} val parseProgram = T <$> (many Datatype.parse >>= (fn datatypes => many Statement.parse >>= (fn globals => many Function.parse >>= (fn functions => Func.parse >>= (fn main => pure {datatypes = Vector.fromList datatypes, globals = Vector.fromList globals, functions = functions, main = main}))))) in parseProgram <* (mlSpaces *> (failing next <|> fail "end of file")) end fun layoutStats (program as T {datatypes, globals, functions, main, ...}) = let val (mainNumVars, mainNumBlocks) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree2.Program.layoutStats: no main" | SOME f => let val numVars = ref 0 val _ = Function.foreachVar (f, fn _ => Int.inc numVars) val {blocks, ...} = Function.dest f val numBlocks = Vector.length blocks in (!numVars, numBlocks) end val numTypes = ref 0 val {get = countType, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, countType) => let datatype z = datatype Type.dest val _ = case Type.dest t of CPointer => () | Datatype _ => () | IntInf => () | Object {args, ...} => Prod.foreach (args, countType) | Real _ => () | Thread => () | Weak t => countType t | Word _ => () val _ = Int.inc numTypes in () end)) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, countType))) val numGlobals = Vector.length globals val numStatements = ref numGlobals val numBlocks = ref 0 val _ = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => let val _ = Int.inc numBlocks val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (statements, fn stmt => let val _ = Int.inc numStatements datatype z = datatype Statement.t val _ = case stmt of Bind {ty, ...} => countType ty | _ => () in () end) in () end) in () end) val numFunctions = List.length functions val _ = destroy () open Layout in align [Control.sizeMessage ("ssa2 program", program), seq [str "num globals = ", Int.layout (Vector.length globals)], seq [str "num vars in main = ", Int.layout mainNumVars], seq [str "num blocks in main = ", Int.layout mainNumBlocks], seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end (* clear all property lists reachable from program *) fun clear (T {datatypes, globals, functions, ...}) = ((* Can't do Type.clear because it clears out the info needed for * Type.dest. *) Vector.foreach (datatypes, Datatype.clear) ; Vector.foreach (globals, Statement.clear) ; List.foreach (functions, Function.clear)) fun clearGlobals (T {globals, ...}) = Vector.foreach (globals, Statement.clear) fun clearTop (p as T {datatypes, functions, ...}) = (Vector.foreach (datatypes, Datatype.clear) ; List.foreach (functions, Func.clear o Function.name) ; clearGlobals p) fun foreachVar (T {globals, functions, ...}, f) = (Vector.foreach (globals, fn s => Statement.foreachDef (s, f)) ; List.foreach (functions, fn g => Function.foreachVar (g, f))) fun foreachPrimApp (T {globals, functions, ...}, f) = let fun loopStatement (s: Statement.t) = case s of Bind {exp = PrimApp {args, prim}, ...} => f {args = args, prim = prim} | _ => () fun loopTransfer t = case t of Runtime {args, prim, ...} => f {args = args, prim = prim} | _ => () val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, loopStatement); loopTransfer transfer))) in () end fun hasPrim (p, f) = Exn.withEscape (fn escape => (foreachPrimApp (p, fn {prim, ...} => if f prim then escape true else ()) ; false)) fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList functions val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit main val _ = Vector.foreach (functions, rem o Function.name) in () end end end mlton-20210117+dfsg/mlton/ssa/ssa-tree2.sig000066400000000000000000000220671416264345000202650ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA_TREE2_STRUCTS = sig include ATOMS end signature SSA_TREE2 = sig include SSA_TREE2_STRUCTS structure ObjectCon: sig datatype t = Con of Con.t | Sequence | Tuple val isSequence: t -> bool val layout: t -> Layout.t end structure Type: sig type t datatype dest = CPointer | Datatype of Tycon.t | IntInf | Object of {args: t Prod.t, con: ObjectCon.t} | Real of RealSize.t | Thread | Weak of t | Word of WordSize.t val array1: t -> t val bool: t val conApp: Con.t * t Prod.t -> t val checkPrimApp: {args: t vector, prim: t Prim.t, result: t} -> bool val cpointer: t val datatypee: Tycon.t -> t val dest: t -> dest val deSequence1: t -> t val deSequenceOpt: t -> t Prod.t option val equals: t * t -> bool val intInf: t val isSequence: t -> bool val isUnit: t -> bool val layout: t -> Layout.t val object: {args: t Prod.t, con: ObjectCon.t} -> t val ofConst: Const.t -> t val plist: t -> PropertyList.t val real: RealSize.t -> t val reff1: t -> t val sequence: t Prod.t -> t val thread: t val tuple: t Prod.t -> t val vector1: t -> t val weak: t -> t val word: WordSize.t -> t val unit: t end structure Base: sig datatype 'a t = Object of 'a | SequenceSub of {index: 'a, sequence: 'a} val foreach: 'a t * ('a -> unit) -> unit val layout: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val object: 'a t -> 'a end structure Exp: sig datatype t = Const of Const.t | Inject of {sum: Tycon.t, variant: Var.t} | Object of {args: Var.t vector, con: Con.t option} | PrimApp of {args: Var.t vector, prim: Type.t Prim.t} | Select of {base: Var.t Base.t, offset: int} | Sequence of {args: Var.t vector vector} | Var of Var.t val equals: t * t -> bool val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val maySideEffect: t -> bool val replaceVar: t * (Var.t -> Var.t) -> t val unit: t end structure Statement: sig datatype t = Bind of {exp: Exp.t, ty: Type.t, var: Var.t option} | Profile of ProfileExp.t | Update of {base: Var.t Base.t, offset: int, value: Var.t} val clear: t -> unit (* clear the var *) val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val layout: t -> Layout.t val profile: ProfileExp.t -> t val replaceUses: t * (Var.t -> Var.t) -> t end structure Transfer: sig datatype t = Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {cases: (Con.t, Label.t) Cases.t, default: Label.t option, (* Must be nullary. *) test: Var.t} | Goto of {args: Var.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Var.t vector | Return of Var.t vector | Runtime of {args: Var.t vector, prim: Type.t Prim.t, return: Label.t} val equals: t * t -> bool val foreachFunc : t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachLabelVar: t * (Label.t -> unit) * (Var.t -> unit) -> unit val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val replaceLabelVar: t * (Label.t -> Label.t) * (Var.t -> Var.t) -> t val replaceLabel: t * (Label.t -> Label.t) -> t val replaceVar: t * (Var.t -> Var.t) -> t end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val args: t -> (Var.t * Type.t) vector val clear: t -> unit val label: t -> Label.t val layout: t -> Layout.t val transfer: t -> Transfer.t end structure Datatype: sig datatype t = T of {cons: {args: Type.t Prod.t, con: Con.t} vector, tycon: Tycon.t} val layout: t -> Layout.t end structure Function: sig type t val alphaRename: t -> t val blocks: t -> Block.t vector (* clear the plists for all bound variables and labels that appear * in the function, but not the function name's plist. *) val clear: t -> unit val controlFlow: t -> {graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val dominatorTree: t -> Block.t Tree.t val foreachVar: t * (Var.t * Type.t -> unit) -> unit val layout: t -> Layout.t val layoutDot: t * (Var.t -> Layout.t) -> {destroy: unit -> unit, controlFlowGraph: Layout.t, dominatorTree: unit -> Layout.t, loopForest: unit -> Layout.t} val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t val profile: t * SourceInfo.t -> t end structure Program: sig datatype t = T of {datatypes: Datatype.t vector, functions: Function.t list, globals: Statement.t vector, main: Func.t (* Must be nullary. *)} val clear: t -> unit val clearTop: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting f's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val foreachPrimApp: t * ({args: Var.t vector, prim: Type.t Prim.t} -> unit) -> unit val foreachVar: t * (Var.t * Type.t -> unit) -> unit val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val parse: unit -> t Parse.t val toFile: {display: t Control.display, style: Control.style, suffix: string} end end mlton-20210117+dfsg/mlton/ssa/ssa.fun000066400000000000000000000006001416264345000172410ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Ssa (S: SSA_STRUCTS): SSA = Simplify (Restore (Shrink (PrePasses ( TypeCheck (Analyze (DirectExp (SsaTree (S)))))))) mlton-20210117+dfsg/mlton/ssa/ssa.sig000066400000000000000000000005711416264345000172420ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA_STRUCTS = sig include SSA_TREE_STRUCTS end signature SSA = sig include SIMPLIFY end mlton-20210117+dfsg/mlton/ssa/ssa2-transform.sig000066400000000000000000000005251416264345000213340ustar00rootroot00000000000000(* Copyright (C) 2009 Wesley W. Tersptra. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA2_TRANSFORM_STRUCTS = sig include SHRINK2 end signature SSA2_TRANSFORM = sig include SSA2_TRANSFORM_STRUCTS val transform2: Program.t -> Program.t end mlton-20210117+dfsg/mlton/ssa/ssa2.fun000066400000000000000000000005631416264345000173330ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Ssa2 (S: SSA2_STRUCTS): SSA2 = Simplify2 (Shrink2 (PrePasses2 ( TypeCheck2 (Analyze2 (SsaTree2 (S)))))) mlton-20210117+dfsg/mlton/ssa/ssa2.sig000066400000000000000000000005751416264345000173300ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SSA2_STRUCTS = sig include SSA_TREE2_STRUCTS end signature SSA2 = sig include SIMPLIFY2 end mlton-20210117+dfsg/mlton/ssa/type-check.fun000066400000000000000000000466061416264345000205270ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck (S: TYPE_CHECK_STRUCTS): TYPE_CHECK = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t fun checkScopes (program as Program.T {datatypes, globals, functions, main}): unit = let datatype 'a status = Undefined | InScope of 'a | Defined fun make' (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, v) = case get x of Undefined => set (x, InScope v) | _ => Error.bug ("Ssa.TypeCheck.checkScopes: duplicate definition of " ^ (Layout.toString (layout x))) fun reference x = case get x of InScope v => v | _ => Error.bug (concat ["Ssa.TypeCheck.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = set (x, Defined) in (bind, ignore o reference, reference, unbind) end fun make (layout, plist) = let val (bind, reference, _, unbind) = make' (layout, plist) in (fn x => bind (x, ()), reference, unbind) end val (bindTycon, getTycon, getTycon', _) = make' (Tycon.layout, Tycon.plist) val (bindCon, getCon, _) = make (Con.layout, Con.plist) val (bindVar, getVar, getVar', unbindVar) = make' (Var.layout, Var.plist) fun getVars xs = Vector.foreach (xs, getVar) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) val (bindFunc, getFunc, _) = make (Func.layout, Func.plist) val {destroy = destroyLoopType, get = loopType, ...} = Property.destGet (Type.plist, Property.initRec (fn (ty, loopType) => let datatype z = datatype Type.dest val _ = case Type.dest ty of Array ty => loopType ty | CPointer => () | Datatype tycon => getTycon tycon | IntInf => () | Real _ => () | Ref ty => loopType ty | Thread => () | Tuple tys => Vector.foreach (tys, loopType) | Vector ty => loopType ty | Weak ty => loopType ty | Word _ => () in () end)) fun loopTypes tys = Vector.foreach (tys, loopType) (* Redefine bindVar to check well-formedness of types. *) val bindVar = fn (x, ty) => (loopType ty; bindVar (x, ty)) fun loopExp exp = let val _ = case exp of ConApp {con, args, ...} => (getCon con ; getVars args) | Const _ => () | PrimApp {args, targs, ...} => (loopTypes targs; getVars args) | Profile _ => () | Select {tuple, ...} => getVar tuple | Tuple xs => getVars xs | Var x => getVar x in () end fun loopStatement (s as Statement.T {var, ty, exp, ...}) = let val _ = loopExp exp val _ = loopType ty val _ = Option.app (var, fn x => bindVar (x, ty)) in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Statement.layout s)]) val loopTransfer = fn Bug => () | Call {func, args, ...} => (getFunc func; getVars args) | Case {test, cases, default, ...} => let fun doit (cases: ('a * 'b) vector, equals: 'a * 'a -> bool, hash: 'a -> word, numExhaustiveCases: IntInf.t) = let val table = HashTable.new {equals = equals, hash = hash} val _ = Vector.foreach (cases, fn (x, _) => let val _ = HashTable.insertIfNew (table, x, ignore, fn _ => Error.bug "Ssa.TypeCheck.loopTransfer: redundant branch in case") in () end) val numCases = Int.toIntInf (Vector.length cases) in case (IntInf.equals (numCases, numExhaustiveCases), isSome default) of (true, true) => Error.bug "Ssa.TypeCheck.loopTransfer: exhaustive case has default" | (false, false) => Error.bug "Ssa.TypeCheck.loopTransfer: non-exhaustive case has no default" | _ => () end fun doitWord (ws, cases) = doit (cases, WordX.equals, WordX.hash, WordSize.cardinality ws) fun doitCon cases = let val numExhaustiveCases = case Type.dest (getVar' test) of Type.Datatype t => Int.toIntInf (getTycon' t) | _ => Error.bug "Ssa.TypeCheck.loopTransfer: case test is not a datatype" in doit (cases, Con.equals, Con.hash, numExhaustiveCases) end val _ = getVar test val _ = case cases of Cases.Con cs => doitCon cs | Cases.Word (ws, cs) => doitWord (ws, cs) in () end | Goto {args, ...} => getVars args | Raise xs => getVars xs | Return xs => getVars xs | Runtime {args, ...} => getVars args val loopTransfer = fn t => (loopTransfer t) handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Transfer.layout t)]) fun loopFunc (f: Function.t) = let val {args, blocks, raises, returns, start, ...} = Function.dest f (* Descend the dominator tree, verifying that variable definitions * dominate variable uses. *) fun loop (Tree.T (block, children)): unit = let val Block.T {label, args, statements, transfer, ...} = block val _ = (Vector.foreach (args, bindVar) ; Vector.foreach (statements, loopStatement) ; loopTransfer transfer) handle exn => Error.reraiseSuffix (exn, concat [" in ", Label.toString label]) val _ = Vector.foreach (children, loop) val _ = Vector.foreach (statements, fn s => Option.app (Statement.var s, unbindVar)) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (blocks, bindLabel o Block.label) (* Check that 'start' and all transfer labels are in scope. * In the case that something is not in scope, * "getLabel" gives a more informative error message * than the CFG/dominatorTree construction failure. *) val _ = getLabel start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) val _ = loop (Function.dominatorTree f) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) val _ = Option.app (returns, loopTypes) val _ = Option.app (raises, loopTypes) val _ = Function.clear f in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Func.toString (Function.name f)]) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (bindTycon (tycon, Vector.length cons) ; Vector.foreach (cons, fn {con, ...} => bindCon con))) handle exn => Error.reraiseSuffix (exn, concat [" in Datatypes"]) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, loopType))) handle exn => Error.reraiseSuffix (exn, concat [" in Datatypes"]) val _ = Vector.foreach (globals, loopStatement) handle exn => Error.reraiseSuffix (exn, concat [" in Globals"]) val _ = List.foreach (functions, bindFunc o Function.name) val _ = getFunc main val _ = List.foreach (functions, loopFunc) val _ = Program.clearTop program val _ = destroyLoopType () in () end val checkScopes = Control.trace (Control.Detail, "checkScopes") checkScopes structure Function = struct open Function fun checkProf (f: t): unit = let val debug = false val {blocks, start, ...} = dest f val {get = labelInfo, rem, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelInfo (label, {block = b, sources = ref NONE})) fun goto (l: Label.t, sources: SourceInfo.t list) = let fun bug (msg: string): 'a = let val _ = Vector.foreach (blocks, fn Block.T {label, ...} => let val {sources, ...} = labelInfo label open Layout in outputl (seq [Label.layout label, str " ", Option.layout (List.layout SourceInfo.layout) (!sources)], Out.error) end) in Error.bug (concat ["Ssa.TypeCheck.checkProf: bug found in ", Label.toString l, ": ", msg]) end val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout SourceInfo.layout sources, str ")"], Out.error) end val {block, sources = r} = labelInfo l in case !r of NONE => let val _ = r := SOME sources val Block.T {statements, transfer, ...} = block datatype z = datatype Statement.t datatype z = datatype ProfileExp.t val sources = Vector.fold (statements, sources, fn (Statement.T {exp, ...}, sources) => case exp of Profile pe => (case pe of Enter s => s :: sources | Leave s => (case sources of [] => bug "unmatched Leave" | s' :: sources => if SourceInfo.equals (s, s') then sources else bug "mismatched Leave")) | _ => sources) val _ = if not debug then () else let open Layout in outputl (List.layout SourceInfo.layout sources, Out.error) end val _ = if (case transfer of Call {return, ...} => let datatype z = datatype Return.t in case return of Dead => false | NonTail _ => false | Tail => true end | Raise _ => true | Return _ => true | _ => false) then (case sources of [] => () | _ => bug "nonempty sources when leaving function") else () in Transfer.foreachLabel (transfer, fn l => goto (l, sources)) end | SOME sources' => if List.equals (sources, sources', SourceInfo.equals) then () else bug "mismatched block" end val _ = goto (start, []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => rem label) in () end end fun checkProf (Program.T {functions, ...}): unit = List.foreach (functions, fn f => Function.checkProf f) val checkProf = Control.trace (Control.Detail, "checkProf") checkProf fun typeCheck (program as Program.T {datatypes, ...}): unit = let val _ = checkScopes program val _ = if !Control.profile <> Control.ProfileNone then checkProf program else () fun coerce {from: Type.t, to: Type.t}: unit = if Type.equals (from, to) then () else Error.bug (concat ["Ssa.TypeCheck.coerce (", (Layout.toString o Layout.record) [("from", Type.layout from), ("to", Type.layout to)], ")"]) fun coerces (from, to) = Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) val coerce = Trace.trace ("Ssa.TypeCheck.coerce", fn {from, to} => let open Layout in record [("from", Type.layout from), ("to", Type.layout to)] end, Unit.layout) coerce fun select {tuple: Type.t, offset: int, resultType = _}: Type.t = case Type.deTupleOpt tuple of NONE => Error.bug ("Ssa.TypeCheck.select (non tuple)") | SOME ts => Vector.sub (ts, offset) val {get = conInfo: Con.t -> {args: Type.t vector, result: Type.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("Ssa.TypeCheck.conInfo", Con.layout)) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {args = args, result = result})) end) fun conApp {con, args} = let val {args = args', result, ...} = conInfo con val _ = coerces (args', args) in result end fun filter (test, con, args) = let val {result, args = args'} = conInfo con val _ = coerce {from = test, to = result} val _ = coerces (args', args) in () end fun primApp {args, prim, resultType, resultVar = _, targs} = let val () = if Type.checkPrimApp {args = args, prim = prim, result = resultType, targs = targs} then () else Error.bug (concat ["Ssa.TypeCheck.primApp (", let open Layout in (toString o seq) [Prim.layout prim, if Vector.isEmpty targs then empty else Vector.layout Type.layout targs, str " ", Vector.layout Type.layout args] end, ")"]) in resultType end val _ = analyze { coerce = coerce, conApp = conApp, const = Type.ofConst, filter = filter, filterWord = fn (from, s) => coerce {from = from, to = Type.word s}, fromType = fn x => x, layout = Type.layout, primApp = primApp, program = program, select = select, tuple = Type.tuple, useFromTypeOnBinds = true } val _ = Program.clear program in () end val typeCheck = fn p => (typeCheck p) handle exn => Error.reraisePrefix (exn, "TypeError (SSA): ") end mlton-20210117+dfsg/mlton/ssa/type-check.sig000066400000000000000000000006601416264345000205070ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK_STRUCTS = sig include ANALYZE end signature TYPE_CHECK = sig include TYPE_CHECK_STRUCTS val typeCheck: Program.t -> unit end mlton-20210117+dfsg/mlton/ssa/type-check2.fun000066400000000000000000000565631416264345000206140ustar00rootroot00000000000000(* Copyright (C) 2009,2011,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck2 (S: TYPE_CHECK2_STRUCTS): TYPE_CHECK2 = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t fun checkScopes (program as Program.T {datatypes, globals, functions, main}): unit = let datatype 'a status = Undefined | InScope of 'a | Defined fun make' (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, v) = case get x of Undefined => set (x, InScope v) | _ => Error.bug (concat ["Ssa2.TypeCheck2.checkScopes: duplicate definition of ", Layout.toString (layout x)]) fun reference x = case get x of InScope v => v | _ => Error.bug (concat ["Ssa2.TypeCheck2.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = set (x, Defined) in (bind, ignore o reference, reference, unbind) end fun make (layout, plist) = let val (bind, reference, _, unbind) = make' (layout, plist) in (fn x => bind (x, ()), reference, unbind) end val (bindTycon, getTycon, getTycon', _) = make' (Tycon.layout, Tycon.plist) val (bindCon, getCon, _) = make (Con.layout, Con.plist) val (bindVar, getVar, getVar', unbindVar) = make' (Var.layout, Var.plist) fun getVars xs = Vector.foreach (xs, getVar) val (bindFunc, getFunc, _) = make (Func.layout, Func.plist) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) fun loopObjectCon oc = let datatype z = datatype ObjectCon.t val _ = case oc of Con con => getCon con | Sequence => () | Tuple => () in () end val {destroy = destroyLoopType, get = loopType, ...} = Property.destGet (Type.plist, Property.initRec (fn (ty, loopType) => let datatype z = datatype Type.dest val _ = case Type.dest ty of CPointer => () | Datatype tycon => getTycon tycon | IntInf => () | Object {args, con, ...} => let val _ = loopObjectCon con val _ = Prod.foreach (args, loopType) in () end | Real _ => () | Thread => () | Weak ty => loopType ty | Word _ => () in () end)) fun loopTypes tys = Vector.foreach (tys, loopType) (* Redefine bindVar to check well-formedness of types. *) val bindVar = fn (x, ty) => (loopType ty; bindVar (x, ty)) fun loopExp exp = let val _ = case exp of Const _ => () | Inject {sum, variant, ...} => (getTycon sum; getVar variant) | Object {args, con, ...} => (Option.app (con, getCon); getVars args) | PrimApp {args, ...} => getVars args | Select {base, ...} => Base.foreach (base, getVar) | Sequence {args} => Vector.foreach (args, getVars) | Var x => getVar x in () end fun loopStatement (s: Statement.t): unit = let val _ = case s of Bind {exp, ty, var, ...} => let val _ = loopExp exp val _ = loopType ty val _ = Option.app (var, fn x => bindVar (x, ty)) in () end | Profile _ => () | Update {base, value, ...} => (Base.foreach (base, getVar); getVar value) in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Statement.layout s)]) val loopTransfer = fn Bug => () | Call {func, args, ...} => (getFunc func; getVars args) | Case {test, cases, default, ...} => let fun doit (cases: ('a * 'b) vector, equals: 'a * 'a -> bool, hash: 'a -> word, numExhaustiveCases: IntInf.t) = let val table = HashTable.new {equals = equals, hash = hash} val _ = Vector.foreach (cases, fn (x, _) => let val _ = HashTable.insertIfNew (table, x, ignore, fn _ => Error.bug "Ssa2.TypeCheck2.loopTransfer: redundant branch in case") in () end) val numCases = Int.toIntInf (Vector.length cases) in case (IntInf.equals (numCases, numExhaustiveCases), isSome default) of (true, true) => Error.bug "Ssa2.TypeCheck2.loopTransfer: exhaustive case has default" | (false, false) => Error.bug "Ssa2.TypeCheck2.loopTransfer: non-exhaustive case has no default" | _ => () end fun doitWord (ws, cases) = doit (cases, WordX.equals, WordX.hash, WordSize.cardinality ws) fun doitCon cases = let val numExhaustiveCases = case Type.dest (getVar' test) of Type.Datatype t => Int.toIntInf (getTycon' t) | _ => Error.bug "Ssa2.TypeCheck2.loopTransfer: case test is not a datatype" in doit (cases, Con.equals, Con.hash, numExhaustiveCases) end val _ = getVar test val _ = case cases of Cases.Con cs => doitCon cs | Cases.Word (ws, cs) => doitWord (ws, cs) in () end | Goto {args, ...} => getVars args | Raise xs => getVars xs | Return xs => getVars xs | Runtime {args, ...} => getVars args val loopTransfer = fn t => (loopTransfer t) handle exn => Error.reraiseSuffix (exn, concat [" in ", Layout.toString (Transfer.layout t)]) fun loopFunc (f: Function.t) = let val {args, blocks, raises, returns, start, ...} = Function.dest f (* Descend the dominator tree, verifying that variable definitions * dominate variable uses. *) fun loop (Tree.T (block, children)): unit = let val Block.T {label, args, statements, transfer, ...} = block val _ = (Vector.foreach (args, bindVar) ; Vector.foreach (statements, loopStatement) ; loopTransfer transfer) handle exn => Error.reraiseSuffix (exn, concat [" in ", Label.toString label]) val _ = Vector.foreach (children, loop) val _ = Vector.foreach (statements, fn s => Statement.foreachDef (s, unbindVar o #1)) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (blocks, bindLabel o Block.label) (* Check that 'start' and all transfer labels are in scope. * In the case that something is not in scope, * "getLabel" gives a more informative error message * than the CFG/dominatorTree construction failure. *) val _ = getLabel start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) val _ = loop (Function.dominatorTree f) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) val _ = Option.app (returns, loopTypes) val _ = Option.app (raises, loopTypes) val _ = Function.clear f in () end handle exn => Error.reraiseSuffix (exn, concat [" in ", Func.toString (Function.name f)]) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (bindTycon (tycon, Vector.length cons) ; Vector.foreach (cons, fn {con, ...} => bindCon con))) handle exn => Error.reraiseSuffix (exn, concat [" in Datatypes"]) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, loopType))) handle exn => Error.reraiseSuffix (exn, concat [" in Datatypes"]) val _ = Vector.foreach (globals, loopStatement) handle exn => Error.reraiseSuffix (exn, concat [" in Globals"]) val _ = List.foreach (functions, bindFunc o Function.name) val _ = List.foreach (functions, loopFunc) val _ = getFunc main val _ = Program.clearTop program val _ = destroyLoopType () in () end val checkScopes = Control.trace (Control.Detail, "checkScopes") checkScopes structure Function = struct open Function fun checkProf (f: t): unit = let val debug = false val {blocks, start, ...} = dest f val {get = labelInfo, rem, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelInfo (label, {block = b, sources = ref NONE})) fun goto (l: Label.t, sources: SourceInfo.t list) = let fun bug (msg: string): 'a = let val _ = Vector.foreach (blocks, fn Block.T {label, ...} => let val {sources, ...} = labelInfo label open Layout in outputl (seq [Label.layout label, str " ", Option.layout (List.layout SourceInfo.layout) (!sources)], Out.error) end) in Error.bug (concat ["Ssa2.TypeCheck2.checkProf: bug found in ", Label.toString l, ": ", msg]) end val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout SourceInfo.layout sources, str ")"], Out.error) end val {block, sources = r} = labelInfo l in case !r of NONE => let val _ = r := SOME sources val Block.T {statements, transfer, ...} = block datatype z = datatype Statement.t datatype z = datatype ProfileExp.t val sources = Vector.fold (statements, sources, fn (s, sources) => case s of Profile pe => (case pe of Enter s => s :: sources | Leave s => (case sources of [] => bug "unmatched Leave" | s' :: sources => if SourceInfo.equals (s, s') then sources else bug "mismatched Leave")) | _ => sources) val _ = if not debug then () else let open Layout in outputl (List.layout SourceInfo.layout sources, Out.error) end val _ = if (case transfer of Call {return, ...} => let datatype z = datatype Return.t in case return of Dead => false | NonTail _ => false | Tail => true end | Raise _ => true | Return _ => true | _ => false) then (case sources of [] => () | _ => bug "nonempty sources when leaving function") else () in Transfer.foreachLabel (transfer, fn l => goto (l, sources)) end | SOME sources' => if List.equals (sources, sources', SourceInfo.equals) then () else bug "mismatched block" end val _ = goto (start, []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => rem label) in () end end fun checkProf (Program.T {functions, ...}): unit = List.foreach (functions, fn f => Function.checkProf f) val checkProf = Control.trace (Control.Detail, "checkProf") checkProf fun typeCheck (program as Program.T {datatypes, ...}): unit = let val _ = checkScopes program val _ = if !Control.profile <> Control.ProfileNone then checkProf program else () val {get = conInfo: Con.t -> {result: Type.t, ty: Type.t, tycon: Tycon.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("Ssa2.TypeCheck2.conInfo", Con.layout)) val conTycon = #tycon o conInfo val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {result = result, ty = Type.conApp (con, args), tycon = tycon})) end) fun inject {sum: Tycon.t, variant: Type.t}: Type.t = let val error = fn msg => Error.bug (concat ["Ssa2.TypeCheck2.inject (", msg, " ", (Layout.toString o Layout.record) [("sum", Tycon.layout sum), ("variant", Type.layout variant)], ")"]) in case Type.dest variant of Type.Object {con, ...} => (case con of ObjectCon.Con c => if Tycon.equals (conTycon c, sum) then Type.datatypee sum else error "wrong sum" | _ => error "no object-con") | _ => error "no object" end fun coerce {from: Type.t, to: Type.t}: unit = if Type.equals (from, to) then () else Error.bug (concat ["SSa2.TypeCheck2.coerce (", (Layout.toString o Layout.record) [("from", Type.layout from), ("to", Type.layout to)], ")"]) val coerce = Trace.trace ("Ssa2.TypeCheck2.coerce", fn {from, to} => let open Layout in record [("from", Type.layout from), ("to", Type.layout to)] end, Unit.layout) coerce fun object {args, con, resultType} = let fun err () = Error.bug "Ssa2.TypeCheck2.object (bad object)" in case Type.dest resultType of Type.Object {args = args', con = con'} => (if (case (con, con') of (NONE, ObjectCon.Tuple) => true | (SOME c, ObjectCon.Con c') => Con.equals (c, c') | _ => false) andalso (Vector.foreach2 (Prod.dest args, Prod.dest args', fn ({elt = t, isMutable = _}, {elt = t', ...}) => coerce {from = t, to = t'}) ; true) then resultType else err ()) | _ => err () end fun base b = case b of Base.Object ty => ty | Base.SequenceSub {index, sequence} => if Type.isSequence sequence then let val _ = if Type.equals (index, Type.word (WordSize.seqIndex ())) then () else Error.bug "Ssa2.TypeCheck2.base (sequence-sub of non seqIndex)" in sequence end else Error.bug "Ssa2.TypeCheck2.base (sequence-sub of non sequence)" fun select {base: Type.t, offset: int, resultType = _}: Type.t = case Type.dest base of Type.Object {args, ...} => Prod.elt (args, offset) | _ => Error.bug "Ssa2.TypeCheck2.select (non object)" fun sequence {args, resultType} = let fun err () = Error.bug "Ssa2.TypeCheck2.sequence (bad sequence)" in case Type.dest resultType of Type.Object {args = args', con = ObjectCon.Sequence} => (if (Vector.foreach (args, fn args => Vector.foreach2 (Prod.dest args, Prod.dest args', fn ({elt = t, isMutable = _}, {elt = t', ...}) => coerce {from = t, to = t'})) ; true) then resultType else err ()) | _ => err () end fun update {base, offset, value} = case Type.dest base of Type.Object {args, ...} => let val {elt, isMutable} = Prod.sub (args, offset) val () = coerce {from = value, to = elt} val () = if isMutable then () else Error.bug "Ssa2.TypeCheck2.update (non-mutable field)" in () end | _ => Error.bug "Ssa2.TypeCheck2.update (non object)" fun filter {con, test, variant} = let val {result, ty, ...} = conInfo con val () = coerce {from = test, to = result} val () = Option.app (variant, fn to => coerce {from = ty, to = to}) in () end fun filterWord (from, s) = coerce {from = from, to = Type.word s} fun primApp {args, prim, resultType, resultVar = _} = let val () = if Type.checkPrimApp {args = args, prim = prim, result = resultType} then () else Error.bug (concat ["Ssa2.TypeCheck2.primApp (", let open Layout in (toString o seq) [Prim.layout prim, str " ", Vector.layout Type.layout args] end, ")"]) in resultType end val _ = analyze {base = base, coerce = coerce, const = Type.ofConst, filter = filter, filterWord = filterWord, fromType = fn x => x, inject = inject, layout = Type.layout, object = object, primApp = primApp, program = program, select = select, sequence = sequence, update = update, useFromTypeOnBinds = true} val _ = Program.clear program in () end val typeCheck = fn p => (typeCheck p) handle exn => Error.reraisePrefix (exn, "TypeError (SSA2): ") end mlton-20210117+dfsg/mlton/ssa/type-check2.sig000066400000000000000000000006641416264345000205750ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK2_STRUCTS = sig include ANALYZE2 end signature TYPE_CHECK2 = sig include TYPE_CHECK2_STRUCTS val typeCheck: Program.t -> unit end mlton-20210117+dfsg/mlton/ssa/useless.fun000066400000000000000000001531641416264345000201540ustar00rootroot00000000000000(* Copyright (C) 2009,2017-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Useless (S: SSA_TRANSFORM_STRUCTS): SSA_TRANSFORM = struct open S (* useless thing elimination * build some kind of dependence graph where * - a value of ground type is useful if it is an arg to a primitive * - a tuple is useful if it contains a useful component * - a conapp is useful if it contains a useful component * or is used in a case * * If a useful tuple is coerced to another useful tuple, * then all of their components must agree (exactly). * It is trivial to convert a useful value to a useless one. * * It is also trivial to convert a useful tuple to one of its * useful components -- but this seems hard *) (* Suppose that you have a ref/array/vector that is useful, but the * components aren't -- then the components are converted to type unit, and * any primapp args must be as well. *) structure Value = struct structure Set = DisjointSet structure Exists : sig type t val <= : t * t -> unit val == : t * t -> unit val doesExist: t -> bool val layout: t -> Layout.t val mustExist: t -> unit val new: unit -> t val whenExists: t * (unit -> unit) -> unit end = struct structure L = TwoPointLattice (val bottom = "not exists" val top = "exists") open L val mustExist = makeTop val doesExist = isTop val whenExists = addHandler end structure Useful : sig type t val <= : t * t -> unit val == : t * t -> unit val isUseful: t -> bool val layout: t -> Layout.t val makeUseful: t -> unit val makeWanted: t -> unit val new: unit -> t val whenUseful: t * (unit -> unit) -> unit end = struct structure U = TwoPointLattice (val bottom = "useless" val top = "useful") structure W = TwoPointLattice (val bottom = "unwanted" val top = "wanted") datatype t = T of U.t * W.t fun layout (T (u, w)) = let open Layout in seq [U.layout u, str "/", W.layout w] end fun new () = T (U.new (), W.new ()) fun == (T (u, w), T (u', w')) = (U.== (u, u'); W.== (w, w')) fun (T (uf, wf)) <= (T (ut, wt)) = (U.<= (uf, ut); W.<= (wf, wt); W.addHandler (wf, fn () => U.== (uf, ut))) fun makeUseful (T (u, _)) = U.makeTop u fun isUseful (T (u, _)) = U.isTop u fun whenUseful (T (u, _), h) = U.addHandler (u, h) fun makeWanted (T (_, w)) = W.makeTop w end datatype t = T of {new: (Type.t * bool) option ref, ty: Type.t, value: value} Set.t and value = Array of {elt: slot, length: t, useful: Useful.t} | Ground of Useful.t | Ref of {arg: slot, useful: Useful.t} | Tuple of slot vector | Vector of {elt: slot, length: t} | Weak of {arg: slot, useful: Useful.t} withtype slot = t * Exists.t local fun make sel (T s) = sel (Set.! s) in val value = make #value val ty = make #ty end local open Layout in fun layout (T s) = let val {value, ...} = Set.! s in case value of Array {elt, length, ...} => seq [str "array", tuple [layout length, layoutSlot elt]] | Ground g => seq [str "ground ", Useful.layout g] | Ref {arg, useful, ...} => seq [str "ref ", record [("useful", Useful.layout useful), ("slot", layoutSlot arg)]] | Tuple vs => Vector.layout layoutSlot vs | Vector {elt, length} => seq [str "vector", tuple [layout length, layoutSlot elt]] | Weak {arg, useful} => seq [str "weak ", record [("useful", Useful.layout useful), ("slot", layoutSlot arg)]] end and layoutSlot (v, e) = tuple [Exists.layout e, layout v] end fun unify (T s, T s') = if Set.equals (s, s') then () else let val {value = v, ...} = Set.! s val {value = v', ...} = Set.! s' val _ = Set.union (s, s') in case (v, v') of (Array {useful = u, length = n, elt = e}, Array {useful = u', length = n', elt = e'}) => (Useful.== (u, u'); unify (n, n'); unifySlot (e, e')) | (Ground g, Ground g') => Useful.== (g, g') | (Ref {useful = u, arg = a}, Ref {useful = u', arg = a'}) => (Useful.== (u, u'); unifySlot (a, a')) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unifySlot) | (Vector {length = n, elt = e}, Vector {length = n', elt = e'}) => (unify (n, n'); unifySlot (e, e')) | (Weak {useful = u, arg = a}, Weak {useful = u', arg = a'}) => (Useful.== (u, u'); unifySlot (a, a')) | _ => Error.bug "Useless.Value.unify: strange" end and unifySlot ((v, e), (v', e')) = (unify (v, v'); Exists.== (e, e')) val unify = Trace.trace ("Useless.Value.unify", Layout.tuple2 (layout, layout), Unit.layout) unify fun coerce {from = from as T sfrom, to = to as T sto}: unit = if Set.equals (sfrom, sto) then () else let fun coerceSlot ((v, e), (v', e')) = (coerce {from = v, to = v'} ; Exists.== (e, e')) in case (value from, value to) of (Array _, Array _) => unify (from, to) | (Ground from, Ground to) => Useful.<= (to, from) | (Ref _, Ref _) => unify (from, to) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', coerceSlot) | (Vector {length = n, elt = e}, Vector {length = n', elt = e'}) => (coerce {from = n, to = n'} ; coerceSlot (e, e')) | (Weak _, Weak _) => unify (from, to) | _ => Error.bug "Useless.Value.coerce: strange" end val coerce = Trace.trace ("Useless.Value.coerce", fn {from, to} => let open Layout in record [("from", layout from), ("to", layout to)] end, Unit.layout) coerce fun coerces {from, to} = Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) fun foreach (v: t, f: Useful.t -> unit): unit = let fun loop (v: t): unit = case value v of Array {length, elt, useful} => (f useful; loop length; slot elt) | Ground u => f u | Tuple vs => Vector.foreach (vs, slot) | Ref {arg, useful} => (f useful; slot arg) | Vector {length, elt} => (loop length; slot elt) | Weak {arg, useful} => (f useful; slot arg) and slot (v, _) = loop v in loop v end (* Coerce every ground value in v to u. *) fun deepCoerce (v: t, u: Useful.t): unit = foreach (v, fn u' => Useful.<= (u', u)) val deepCoerce = Trace.trace2 ("Useless.deepCoerce", layout, Useful.layout, Unit.layout) deepCoerce fun deground (v: t): Useful.t = case value v of Ground g => g | _ => Error.bug "Useless.deground" fun someUseful (v: t): Useful.t option = case value v of Array {useful = u, ...} => SOME u | Ground u => SOME u | Ref {useful = u, ...} => SOME u | Tuple slots => Vector.peekMap (slots, someUseful o #1) | Vector {length, ...} => SOME (deground length) | Weak {useful = u, ...} => SOME u fun allOrNothing (v: t): Useful.t option = case someUseful v of NONE => NONE | SOME u => (foreach (v, fn u' => Useful.== (u, u')) ; SOME u) fun fromType (t: Type.t): t = let fun loop (t: Type.t, es: Exists.t list): t = let fun useful () = let val u = Useful.new () in Useful.whenUseful (u, fn () => List.foreach (es, Exists.mustExist)) ; u end fun slot t = let val e = Exists.new () in (loop (t, e :: es), e) end val loop = fn t => loop (t, es) val value = case Type.dest t of Type.Array t => let val elt as (_, e) = slot t val length = loop (Type.word (WordSize.seqIndex ())) in Exists.whenExists (e, fn () => Useful.makeUseful (deground length)) ; Array {useful = useful (), length = length, elt = elt} end | Type.Ref t => Ref {arg = slot t, useful = useful ()} | Type.Tuple ts => Tuple (Vector.map (ts, slot)) | Type.Vector t => Vector {length = loop (Type.word (WordSize.seqIndex ())), elt = slot t} | Type.Weak t => Weak {arg = slot t, useful = useful ()} | _ => Ground (useful ()) in T (Set.singleton {ty = t, new = ref NONE, value = value}) end in loop (t, []) end fun const (c: Const.t): t = let val v = fromType (Type.ofConst c) (* allOrNothing v because constants are not transformed and their * type cannot change. So they must either be completely eliminated * or completely kept. *) val _ = allOrNothing v in v end fun detupleSlots (v: t): slot vector = case value v of Tuple ss => ss | _ => Error.bug "Useless.detupleSlots" fun detuple v = Vector.map (detupleSlots v, #1) fun tuple (vs: t vector): t = let val t = Type.tuple (Vector.map (vs, ty)) val v = fromType t val _ = Vector.foreach2 (vs, detuple v, fn (v, v') => coerce {from = v, to = v'}) in v end fun select {tuple, offset, resultType} = let val v = fromType resultType val _ = coerce {from = Vector.sub (detuple tuple, offset), to = v} in v end local fun make (err, sel) v = case value v of Vector fs => sel fs | _ => Error.bug err in val devector = make ("Useless.devector", #1 o #elt) val vectorLength = make ("Useless.vectorLength", #length) end local fun make (err, sel) v = case value v of Array fs => sel fs | _ => Error.bug err in val dearray: t -> t = make ("Useless.dearray", #1 o #elt) val arrayLength = make ("Useless.arrayLength", #length) val arrayUseful = make ("Useless.arrayUseful", #useful) end local fun make (err, sel) v = case value v of Ref fs => sel fs | _ => Error.bug err in val deref: t -> t = make ("Useless.deref", #1 o #arg) end local fun make (err, sel) v = case value v of Weak fs => sel fs | _ => Error.bug err in val deweak: t -> t = make ("Useless.deweak", #1 o #arg) val weakUseful = make ("Useless.weakUseful", #useful) end fun newType (v: t): Type.t = #1 (getNew v) and isUseful (v: t): bool = #2 (getNew v) and getNew (T s): Type.t * bool = let val {value, ty, new, ...} = Set.! s in Ref.memoize (new, fn () => let fun slot (arg: t, e: Exists.t) = let val (t, b) = getNew arg in (if Exists.doesExist e then t else Type.unit, b) end fun wrap ((t, b), f) = (f t, b) fun or ((t, b), b') = (t, b orelse b') fun maybe (u: Useful.t, s: slot, make: Type.t -> Type.t) = wrap (or (slot s, Useful.isUseful u), make) in case value of Array {useful, elt, length, ...} => or (wrap (slot elt, Type.array), Useful.isUseful useful orelse isUseful length) | Ground u => (ty, Useful.isUseful u) | Ref {arg, useful, ...} => maybe (useful, arg, Type.reff) | Tuple vs => let val (v, b) = Vector.mapAndFold (vs, false, fn ((v, e), useful) => let val (t, u) = getNew v val t = if Exists.doesExist e then SOME t else NONE in (t, u orelse useful) end) val v = Vector.keepAllMap (v, fn t => t) in (Type.tuple v, b) end | Vector {elt, length, ...} => or (wrap (slot elt, Type.vector), isUseful length) | Weak {arg, useful} => maybe (useful, arg, Type.weak) end) end val getNew = Trace.trace ("Useless.getNew", layout, Layout.tuple2 (Type.layout, Bool.layout)) getNew val isUseful = Trace.trace ("Useless.isUseful", layout, Bool.layout) isUseful val newType = Trace.trace ("Useless.newType", layout, Type.layout) newType fun newTypes (vs: t vector): Type.t vector = Vector.keepAllMap (vs, fn v => let val (t, b) = getNew v in if b then SOME t else NONE end) end structure Exists = Value.Exists fun transform (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program val {get = conInfo: Con.t -> {args: Value.t vector, value: unit -> Value.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("Useless.conInfo", Con.layout)) val {get = tyconInfo: Tycon.t -> {cons: Con.t vector, visitedDeepMakeUseful: bool ref, visitedShallowMakeUseful: bool ref}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("Useless.tyconInfo", Tycon.layout)) local open Value in val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val _ = setTyconInfo (tycon, {cons = Vector.map (cons, #con), visitedDeepMakeUseful = ref false, visitedShallowMakeUseful = ref false}) fun value () = fromType (Type.datatypee tycon) in Vector.foreach (cons, fn {con, args} => setConInfo (con, {value = value, args = Vector.map (args, fromType)})) end) val conArgs = #args o conInfo fun conApp {con: Con.t, args: Value.t vector} = let val {args = args', value, ...} = conInfo con in coerces {from = args, to = args'} ; value () end fun filter (v: Value.t, con: Con.t, to: Value.t vector): unit = case value v of Ground g => (Useful.makeUseful g ; coerces {from = conArgs con, to = to}) | _ => Error.bug "Useless.filter: non ground" val filter = Trace.trace3 ("Useless.filter", Value.layout, Con.layout, Vector.layout Value.layout, Unit.layout) filter fun filterGround (v: Value.t): unit = case value v of Ground g => Useful.makeUseful g | _ => Error.bug "Useless.filterGround: non ground" (* This is for primitive args, which may inspect any component. *) fun mkDeepMakeUseful deepMakeUseful v = let val slot = deepMakeUseful o #1 in case value v of Array {useful = u, length = n, elt = e} => (Useful.makeUseful u ; deepMakeUseful n ; slot e) | Ground u => (Useful.makeUseful u (* Make all constructor args of this tycon useful *) ; (case Type.dest (ty v) of Type.Datatype tycon => let val {cons, visitedDeepMakeUseful, visitedShallowMakeUseful} = tyconInfo tycon in if !visitedDeepMakeUseful then () else (visitedDeepMakeUseful := true ; visitedShallowMakeUseful := true ; Vector.foreach (cons, fn con => Vector.foreach (#args (conInfo con), deepMakeUseful))) end | _ => ())) | Ref {useful = u, arg = a} => (Useful.makeUseful u; slot a) | Tuple vs => Vector.foreach (vs, slot) | Vector {length = n, elt = e} => (deepMakeUseful n; slot e) | Weak {useful = u, arg = a} => (Useful.makeUseful u; slot a) end val deepMakeUseful = Trace.traceRec ("Useless.deepMakeUseful", Value.layout, Unit.layout) mkDeepMakeUseful (* This is used for MLton_equal and MLton_hash, which will not inspect * contents of Array, Ref, or Weak. *) fun mkShallowMakeUseful shallowMakeUseful v = let val slot = shallowMakeUseful o #1 in case value v of Array {useful = u, ...} => Useful.makeUseful u | Ground u => (Useful.makeUseful u (* Make all constructor args of this tycon useful *) ; (case Type.dest (ty v) of Type.Datatype tycon => let val {cons, visitedShallowMakeUseful, ...} = tyconInfo tycon in if !visitedShallowMakeUseful then () else (visitedShallowMakeUseful := true ; Vector.foreach (cons, fn con => Vector.foreach (#args (conInfo con), shallowMakeUseful))) end | _ => ())) | Ref {useful = u, ...} => Useful.makeUseful u | Tuple vs => Vector.foreach (vs, slot) | Vector {length = n, elt = e} => (shallowMakeUseful n; slot e) | Weak {useful = u, ...} => Useful.makeUseful u end val shallowMakeUseful = Trace.traceRec ("Useless.shallowMakeUseful", Value.layout, Unit.layout) mkShallowMakeUseful (* This is used for MLton_eq, MLton_share, and MLton_size, * which should only make use of the components that * are used elsewhere in the computation. *) fun mkMakeWanted makeWanted v = let val slot = makeWanted o #1 in case value v of Array {useful = u, ...} => Useful.makeWanted u | Ground u => Useful.makeWanted u | Ref {useful = u, ...} => Useful.makeWanted u | Tuple vs => Vector.foreach (vs, slot) | Vector {length = n, elt = e} => (makeWanted n; slot e) | Weak {useful = u, ...} => Useful.makeWanted u end val makeWanted = Trace.traceRec ("Useless.makeWanted", Value.layout, Unit.layout) mkMakeWanted fun primApp {args: t vector, prim, resultVar = _, resultType, targs = _} = let val result = fromType resultType fun return v = coerce {from = v, to = result} infix dependsOn fun v1 dependsOn v2 = deepCoerce (v2, deground v1) fun arg i = Vector.sub (args, i) fun sub () = (arg 1 dependsOn result ; return (dearray (arg 0))) fun update () = let val a = dearray (arg 0) in arg 1 dependsOn a ; coerce {from = arg 2, to = a} end val _ = case prim of Prim.Array_alloc _ => coerce {from = arg 0, to = arrayLength result} | Prim.Array_array => let val l = (const o S.Const.word o WordX.fromInt) (Vector.length args, WordSize.seqIndex ()) in (coerce {from = l, to = arrayLength result} ; Vector.foreach (args, fn arg => coerce {from = arg, to = dearray result})) end | Prim.Array_copyArray => let val a = dearray (arg 0) in arg 1 dependsOn a ; arg 3 dependsOn a ; arg 4 dependsOn a ; case (value (arg 0), value (arg 2)) of (Array {elt = e, ...}, Array {elt = e', ...}) => unifySlot (e, e') | _ => Error.bug "Useless.primApp: Array_copyArray" end | Prim.Array_copyVector => let val a = dearray (arg 0) in arg 1 dependsOn a ; arg 3 dependsOn a ; arg 4 dependsOn a ; case (value (arg 0), value (arg 2)) of (Array {elt = e, ...}, Vector {elt = e', ...}) => unifySlot (e, e') | _ => Error.bug "Useless.primApp: Array_copyVector" end | Prim.Array_length => return (arrayLength (arg 0)) | Prim.Array_sub => sub () | Prim.Array_toArray => (case (value (arg 0), value result) of (Array {length = l, elt = e, ...}, Array {length = l', elt = e', ...}) => (unify (l, l'); unifySlot (e, e')) | _ => Error.bug "Useless.primApp: Array_toArray") | Prim.Array_toVector => (case (value (arg 0), value result) of (Array {length = l, elt = e, ...}, Vector {length = l', elt = e', ...}) => (unify (l, l'); unifySlot (e, e')) | _ => Error.bug "Useless.primApp: Array_toVector") | Prim.Array_uninit => let val a = dearray (arg 0) in arg 1 dependsOn a end | Prim.Array_uninitIsNop => Useful.whenUseful (deground result, fn () => Useful.makeUseful (arrayUseful (arg 0))) | Prim.Array_update => update () | Prim.CFunction _ => (Vector.foreach (args, deepMakeUseful); deepMakeUseful result) | Prim.MLton_eq => Useful.whenUseful (deground result, fn () => (unify (arg 0, arg 1) ; makeWanted (arg 1))) | Prim.MLton_equal => Useful.whenUseful (deground result, fn () => (shallowMakeUseful (arg 0) ; shallowMakeUseful (arg 1))) | Prim.MLton_hash => Useful.whenUseful (deground result, fn () => shallowMakeUseful (arg 0)) | Prim.MLton_share => makeWanted (arg 0) | Prim.MLton_size => Useful.whenUseful (deground result, fn () => makeWanted (arg 0)) | Prim.MLton_touch => shallowMakeUseful (arg 0) | Prim.Ref_assign => coerce {from = arg 1, to = deref (arg 0)} | Prim.Ref_deref => return (deref (arg 0)) | Prim.Ref_ref => coerce {from = arg 0, to = deref result} | Prim.Vector_length => return (vectorLength (arg 0)) | Prim.Vector_sub => (arg 1 dependsOn result ; return (devector (arg 0))) | Prim.Vector_vector => let val l = (const o S.Const.word o WordX.fromInt) (Vector.length args, WordSize.seqIndex ()) in (coerce {from = l, to = vectorLength result} ; Vector.foreach (args, fn arg => coerce {from = arg, to = devector result})) end | Prim.Weak_canGet => Useful.whenUseful (deground result, fn () => Useful.makeUseful (weakUseful (arg 0))) | Prim.Weak_get => return (deweak (arg 0)) | Prim.Weak_new => coerce {from = arg 0, to = deweak result} | Prim.WordArray_subWord _ => sub () | Prim.WordArray_updateWord _ => update () | _ => let (* allOrNothing so the type doesn't change *) val res = allOrNothing result in if Prim.maySideEffect prim then Vector.foreach (args, deepMakeUseful) else Vector.foreach (args, fn a => case (allOrNothing a, res) of (SOME u, SOME u') => Useful.<= (u', u) | _ => ()) end in result end val primApp = Trace.trace ("Useless.primApp", fn {prim, args, ...} => Layout.seq [Prim.layout prim, Vector.layout layout args], layout) primApp end val {value, func, label, ...} = analyze { coerce = Value.coerce, conApp = conApp, const = Value.const, filter = filter, filterWord = filterGround o #1, fromType = Value.fromType, layout = Value.layout, primApp = primApp, program = program, select = Value.select, tuple = Value.tuple, useFromTypeOnBinds = true } open Exp Transfer val _ = Control.diagnostics (fn display => let open Layout val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (align [Tycon.layout tycon, indent (Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", Vector.layout Value.layout (conArgs con)]) cons, 2)])) fun diagVar x = display (seq [Var.layout x, str " ", Value.layout (value x)]) val _ = Vector.foreach (globals, fn Statement.T {var, ...} => Option.app (var, diagVar)) val _ = List.foreach (functions, fn f => let val {name, ...} = Function.dest f val _ = display (seq [str "Useless info for ", Func.layout name]) val {args, returns, raises} = func name val _ = display (record [("args", Vector.layout Value.layout args), ("returns", Option.layout (Vector.layout Value.layout) returns), ("raises", Option.layout (Vector.layout Value.layout) raises)]) val _ = Function.foreachVar (f, fn (x, _) => diagVar x) in () end) in () end) val varExists = Value.isUseful o value val unitVar = Var.newString "unit" val bogusGlobals: Statement.t list ref = ref [] val {get = bogus, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn ty => let val var = Var.newString "bogus" in List.push (bogusGlobals, Statement.T {var = SOME var, ty = ty, exp = PrimApp {prim = Prim.MLton_bogus, targs = Vector.new1 ty, args = Vector.new0 ()}}) ; var end)) fun keepUseful (xs: Var.t vector, vs: Value.t vector): Var.t vector = Vector.keepAllMap2 (xs, vs, fn (x, v) => let val (t, b) = Value.getNew v in if b then SOME (if varExists x then x else bogus t) else NONE end) fun keepUsefulArgs (xts: (Var.t * Type.t) vector) = Vector.keepAllMap (xts, fn (x, _) => let val (t, b) = Value.getNew (value x) in if b then SOME (x, t) else NONE end) val keepUsefulArgs = Trace.trace ("Useless.keepUsefulArgs", Vector.layout (Layout.tuple2 (Var.layout, Type.layout)), Vector.layout (Layout.tuple2 (Var.layout, Type.layout))) keepUsefulArgs fun dropUseless (vs: Value.t vector, vs': Value.t vector, makeTrans: Var.t vector -> Transfer.t): Label.t * Block.t = let val l = Label.newNoname () val (formals, actuals) = Vector.unzip (Vector.map2 (vs, vs', fn (v, v') => if Value.isUseful v then let val x = Var.newNoname () in (SOME (x, Value.newType v), if Value.isUseful v' then SOME x else NONE) end else (NONE, NONE))) in (l, Block.T {label = l, args = Vector.keepAllSome formals, statements = Vector.new0 (), transfer = makeTrans (Vector.keepAllSome actuals)}) end (* Returns true if the component is the only component of the tuple * that exists. *) fun newOffset (bs: bool vector, n: int): int * bool = let val len = Vector.length bs fun loop (pos, n, i) = let val b = Vector.sub (bs, pos) in if n = 0 then (i, (i = 0 andalso not (Int.exists (pos + 1, len, fn i => Vector.sub (bs, i))))) else loop (pos + 1, n - 1, if b then i + 1 else i) end in loop (0, n, 0) end fun doitExp (e: Exp.t, resultType: Type.t, resultValue: Value.t option) = case e of ConApp {con, args} => ConApp {con = con, args = keepUseful (args, conArgs con)} | Const _ => e | PrimApp {prim, args, ...} => let fun arg i = Vector.sub (args, i) fun doit () = let val (args, argTypes) = Vector.unzip (Vector.map (args, fn x => let val (t, b) = Value.getNew (value x) in if b then (x, t) else (unitVar, Type.unit) end)) in PrimApp {prim = prim, args = args, targs = (Prim.extractTargs (prim, {args = argTypes, result = resultType, typeOps = {deArray = Type.deArray, deArrow = fn _ => Error.bug "Useless.doitExp: deArrow", deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}))} end fun makePtr dePtr = if Type.isUnit (dePtr resultType) then PrimApp {prim = prim, targs = Vector.new1 Type.unit, args = Vector.new1 unitVar} else doit () in case prim of Prim.Array_uninitIsNop => if varExists (Vector.sub (args, 0)) then doit () else ConApp {args = Vector.new0 (), con = Con.truee} | Prim.MLton_equal => let val (t0, _) = Value.getNew (value (arg 0)) val (t1, _) = Value.getNew (value (arg 1)) in if Type.equals (t0, t1) then PrimApp {prim = prim, targs = Vector.new1 t0, args = args} else (* The arguments differ in the usefulness of * contents of an Array, Ref, or Weak and * the corresponding Array, Ref, or Weak * objects must be distinct and, therefore, * not equal. *) ConApp {args = Vector.new0 (), con = Con.falsee} end | Prim.Ref_ref => makePtr Type.deRef | Prim.Weak_new => makePtr Type.deWeak | _ => doit () end | Select {tuple, offset} => let val (offset, isOne) = newOffset (Vector.map (Value.detupleSlots (value tuple), Exists.doesExist o #2), offset) in if isOne then Var tuple else Select {tuple = tuple, offset = offset} end | Tuple xs => let val slots = Value.detupleSlots (valOf resultValue) val xs = Vector.keepAllMap2 (xs, slots, fn (x, (v, e)) => if Exists.doesExist e then SOME (if varExists x then x else bogus (Value.newType v)) else NONE) in if 1 = Vector.length xs then Var (Vector.first xs) else Tuple xs end | Var _ => e | _ => e val doitExp = Trace.trace3 ("Useless.doitExp", Exp.layout, Layout.ignore, Layout.ignore, Exp.layout) doitExp fun doitStatement (Statement.T {var, exp, ty}) = let val v = Option.map (var, value) val (ty, b) = case v of NONE => (ty, false) | SOME v => Value.getNew v fun yes ty = SOME (Statement.T {var = var, ty = ty, exp = doitExp (exp, ty, v)}) in if b then yes ty else case exp of PrimApp {prim, args, ...} => if Prim.maySideEffect prim andalso let fun arg i = Vector.sub (args, i) fun array () = Value.isUseful (Value.dearray (value (arg 0))) in case prim of Prim.Array_copyArray => array () | Prim.Array_copyVector => array () | Prim.Array_uninit => array () | Prim.Array_update => array () | Prim.Ref_assign => Value.isUseful (Value.deref (value (arg 0))) | Prim.WordArray_updateWord _ => array () | _ => true end then yes ty else NONE | Profile _ => yes ty | _ => NONE end val doitStatement = Trace.trace ("Useless.doitStatement", Statement.layout, Option.layout Statement.layout) doitStatement fun agree (v: Value.t, v': Value.t): bool = Value.isUseful v = Value.isUseful v' fun agrees (vs, vs') = Vector.forall2 (vs, vs', agree) val agrees = Trace.trace2 ("Useless.agrees", Vector.layout Value.layout, Vector.layout Value.layout, Bool.layout) agrees fun doitTransfer (t: Transfer.t, returns: Value.t vector option, raises: Value.t vector option) : Block.t list * Transfer.t = case t of Bug => ([], Bug) | Call {func = f, args, return} => let val {args = fargs, returns = freturns, raises = fraises} = func f fun bug () = let val l = Label.newNoname () in (l, Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug}) end fun wrap (froms, tos, mkTrans) = case (froms, tos) of (NONE, NONE) => (true, bug) | (NONE, SOME _) => (true, bug) | (SOME _, NONE) => Error.bug "Useless.doitTransfer: Call mismatch" | (SOME froms, SOME tos) => (agrees (froms, tos), fn () => dropUseless (froms, tos, mkTrans)) val (blocks, return) = case return of Return.Dead => ([], return) | Return.Tail => (case (wrap (freturns, returns, Return), wrap (fraises, raises, Raise)) of ((true, _), (true, _)) => ([], Return.Tail) | ((false, mkc), (true, _)) => let val (lc, bc) = mkc () in ([bc], Return.NonTail {cont = lc, handler = Handler.Caller}) end | ((_, mkc), (false, mkh)) => let val (lc, bc) = mkc () val (lh, bh) = mkh () in ([bc, bh], Return.NonTail {cont = lc, handler = Handler.Handle lh}) end) | Return.NonTail {cont, handler} => let val returns = SOME (label cont) val mkct = fn args => Goto {dst = cont, args = args} val (raises, mkht) = case handler of Handler.Dead => (NONE, fn _ => Bug) | Handler.Caller => (raises, Raise) | Handler.Handle hand => (SOME (label hand), fn args => Goto {dst = hand, args = args}) in case (wrap (freturns, returns, mkct), wrap (fraises, raises, mkht)) of ((true, _), (true, _)) => ([], Return.NonTail {cont = cont, handler = handler}) | ((false, mkc), (true, _)) => let val (lc, bc) = mkc () in ([bc], Return.NonTail {cont = lc, handler = handler}) end | ((true, _), (false, mkh)) => let val (lh, bh) = mkh () in ([bh], Return.NonTail {cont = cont, handler = Handler.Handle lh}) end | ((false, mkc), (false, mkh)) => let val (lc, bc) = mkc () val (lh, bh) = mkh () in ([bc, bh], Return.NonTail {cont = lc, handler = Handler.Handle lh}) end end in (blocks, Call {func = f, args = keepUseful (args, fargs), return = return}) end | Case {test, cases, default} => let datatype z = datatype Cases.t in case cases of Con cases => (case (Vector.length cases, default) of (0, NONE) => ([], Bug) | _ => let val (cases, blocks) = Vector.mapAndFold (cases, [], fn ((c, l), blocks) => let val args = label l in if Vector.forall (args, Value.isUseful) then ((c, l), blocks) else let val (l', b) = dropUseless (conArgs c, args, fn args => Goto {dst = l, args = args}) in ((c, l'), b :: blocks) end end) in (blocks, Case {test = test, cases = Cases.Con cases, default = default}) end) | Word (_, cs) => (* The test may be useless if there are no cases or * default, thus we must eliminate the case. *) case (Vector.length cs, default) of (0, NONE) => ([], Bug) | _ => ([], t) end | Goto {dst, args} => ([], Goto {dst = dst, args = keepUseful (args, label dst)}) | Raise xs => ([], Raise (keepUseful (xs, valOf raises))) | Return xs => ([], Return (keepUseful (xs, valOf returns))) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = args, return = return}) val doitTransfer = Trace.trace3 ("Useless.doitTransfer", Transfer.layout, Option.layout (Vector.layout Value.layout), Option.layout (Vector.layout Value.layout), Layout.tuple2 (List.layout (Label.layout o Block.label), Transfer.layout)) doitTransfer fun doitBlock (Block.T {label, args, statements, transfer}, returns: Value.t vector option, raises: Value.t vector option) : Block.t list * Block.t = let val args = keepUsefulArgs args val statements = Vector.keepAllMap (statements, doitStatement) val (blocks, transfer) = doitTransfer (transfer, returns, raises) in (blocks, Block.T {label = label, args = args, statements = statements, transfer = transfer}) end val doitBlock = Trace.trace3 ("Useless.doitBlock", Label.layout o Block.label, Option.layout (Vector.layout Value.layout), Option.layout (Vector.layout Value.layout), Layout.tuple2 (List.layout (Label.layout o Block.label), (Label.layout o Block.label))) doitBlock fun doitFunction f = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val {returns = returnvs, raises = raisevs, ...} = func name val args = keepUsefulArgs args val (blocks, blocks') = Vector.mapAndFold (blocks, [], fn (block, blocks') => let val (blocks'', block) = doitBlock (block, returnvs, raisevs) in (block, blocks''::blocks') end) val blocks = Vector.concat (blocks :: List.map (blocks', Vector.fromList)) val returns = Option.map (returnvs, Value.newTypes) val raises = Option.map (raisevs, Value.newTypes) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val datatypes = Vector.map (datatypes, fn Datatype.T {tycon, cons} => Datatype.T {tycon = tycon, cons = Vector.map (cons, fn {con, ...} => {con = con, args = Value.newTypes (conArgs con)})}) val globals = Vector.concat [Vector.new1 (Statement.T {var = SOME unitVar, ty = Type.unit, exp = Exp.unit}), Vector.keepAllMap (globals, doitStatement)] val shrink = shrinkFunction {globals = globals} val functions = List.map (functions, shrink o doitFunction) val globals = Vector.concat [Vector.fromList (!bogusGlobals), globals] val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroy () val _ = Program.clearTop program in program end end mlton-20210117+dfsg/mlton/ssa/zone.fun000066400000000000000000000242301416264345000174330ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Zone (S: SSA2_TRANSFORM_STRUCTS): SSA2_TRANSFORM = struct open S structure Graph = DirectedGraph local open Graph in structure Node = Node end structure Scope = UniqueId () fun zoneFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f datatype z = datatype Exp.t datatype z = datatype Statement.t val {get = labelInfo: Label.t -> {isInLoop: bool ref, isCut: bool ref}, ...} = Property.get (Label.plist, Property.initFun (fn _ => {isCut = ref false, isInLoop = ref false})) (* Mark nodes that are in loops so that we can avoid inserting tuple * constructions there. *) val {graph, nodeBlock, ...} = Function.controlFlow f val () = List.foreach (Graph.stronglyConnectedComponents graph, fn ns => let fun doit () = List.foreach (ns, fn n => #isInLoop (labelInfo (Block.label (nodeBlock n))) := true) in case ns of [n] => if Node.hasEdge {from = n, to = n} then doit () else () | _ => doit () end) val dominatorTree = Function.dominatorTree f (* Decide which labels to cut at. *) val cutDepth = !Control.zoneCutDepth fun addCuts (Tree.T (b, ts), depth: int) = let val depth = if depth = 0 then let val Block.T {label, ...} = b val {isCut, isInLoop, ...} = labelInfo label val () = if !isInLoop then Control.diagnostic (fn () => let open Layout in seq [str "skipping cut at ", Label.layout label] end) else isCut := true in cutDepth end else depth - 1 in Vector.foreach (ts, fn t => addCuts (t, depth)) end val () = addCuts (dominatorTree, cutDepth) (* Build a tuple of lives at each cut node. *) type info = {componentsRev: Var.t list ref, numComponents: int ref, scope: Scope.t, tuple: Var.t} fun newInfo () = {componentsRev = ref [], numComponents = ref 0, scope = Scope.new (), tuple = Var.newNoname ()} datatype varInfo = Global | Local of {blockCache: Var.t option ref, defScope: Scope.t, ty: Type.t, uses: {exp: Exp.t, scope: Scope.t} list ref} val {get = varInfo: Var.t -> varInfo, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => Global)) val blockSelects: {blockCache: Var.t option ref, statement: Statement.t} list ref = ref [] fun addBlockSelects (ss: Statement.t vector): Statement.t vector = let val blockSelectsV = Vector.fromList (!blockSelects) val () = Vector.foreach (blockSelectsV, fn {blockCache, ...} => blockCache := NONE) val () = blockSelects := [] in Vector.concat [Vector.map (blockSelectsV, #statement), ss] end fun define (x: Var.t, ty: Type.t, info: info): unit = setVarInfo (x, Local {blockCache = ref NONE, defScope = #scope info, ty = ty, uses = ref []}) fun replaceVar (x: Var.t, {componentsRev, numComponents, scope, tuple}: info) : Var.t = case varInfo x of Global => x | Local {blockCache, defScope, ty, uses, ...} => case !blockCache of SOME y => y | _ => if Scope.equals (defScope, scope) then x else let fun new () = let val offset = !numComponents val () = List.push (componentsRev, x) val () = numComponents := 1 + offset val exp = Select {base = Base.Object tuple, offset = offset} val () = List.push (uses, {exp = exp, scope = scope}) in exp end val exp = case !uses of [] => new () | {exp, scope = scope'} :: _ => if Scope.equals (scope, scope') then exp else new () val y = Var.new x val () = blockCache := SOME y val () = List.push (blockSelects, {blockCache = blockCache, statement = Bind {exp = exp, ty = ty, var = SOME y}}) in y end val blocks = ref [] fun loop (Tree.T (b, ts), info: info) = let val Block.T {args, label, statements, transfer} = b val {isCut = ref isCut, ...} = labelInfo label val info' = if isCut then newInfo () else info val define = fn (x, t) => define (x, t, info') val () = Vector.foreach (args, define) val statements = Vector.map (statements, fn s => let val s = Statement.replaceUses (s, fn x => replaceVar (x, info')) val () = Statement.foreachDef (s, define) in s end) val transfer = Transfer.replaceVar (transfer, fn x => replaceVar (x, info')) val statements = addBlockSelects statements val () = Vector.foreach (ts, fn t => loop (t, info')) val statements = if not isCut then statements else let val {componentsRev, tuple, ...} = info' val components = Vector.fromListRev (!componentsRev) in if Vector.isEmpty components then statements else let val componentTys = Vector.map (components, fn x => case varInfo x of Global => Error.bug "Zone.zoneFunction: global component" | Local {ty, uses, ...} => (ignore (List.pop uses) ; {elt = ty, isMutable = false})) val components = Vector.map (components, fn x => replaceVar (x, info)) val s = Bind {exp = Object {args = components, con = NONE}, ty = Type.tuple (Prod.make componentTys), var = SOME tuple} in addBlockSelects (Vector.concat [Vector.new1 s, statements]) end end val () = List.push (blocks, Block.T {args = args, label = label, statements = statements, transfer = transfer}) in () end val () = loop (dominatorTree, newInfo ()) val blocks = Vector.fromList (!blocks) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun maybeZoneFunction (f, ac) = let val {blocks, name, ...} = Function.dest f val () = Control.diagnostic (fn () => let open Layout in seq [Func.layout name, str " has ", str " blocks."] end) in if Vector.length blocks <= !Control.maxFunctionSize then f :: ac else zoneFunction f :: ac end fun transform2 (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.fold (functions, [], maybeZoneFunction), main = main} end mlton-20210117+dfsg/mlton/xml/000077500000000000000000000000001416264345000157575ustar00rootroot00000000000000mlton-20210117+dfsg/mlton/xml/call-count.fun000066400000000000000000000123041416264345000205320ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CallCount(S: CALL_COUNT_STRUCTS): CALL_COUNT = struct open S open Dec PrimExp fun instrument(program as Program.T{datatypes, body}, passName: string) = if !Control.instrument then let datatype kind = None | Lam of int (* for curried lambdas, how many arrows remain *) | Prim val {get = kind: Var.t -> kind, set} = Property.new(Var.plist, Property.initConst None) fun makeLam(l: Lambda.t): kind = let fun loop(l, n) = let val {decs, result} = Exp.dest(Lambda.body l) in case decs of [MonoVal{var, exp = Lambda l, ...}] => if Var.equals(var, VarExp.var result) then loop(l, n + 1) else n | _ => n end in Lam(loop(l, 0)) end fun inc(name: string) : unit -> Dec.t = let val exp = PrimApp {prim = Prim.newNullary(concat["MLTON_inc", passName, name]), targs = [], args = []} in fn () => MonoVal{var = Var.newNoname(), ty = Type.unit, exp = exp} end val incCount = inc "Unknown" val incObvious = inc "Known" val program = Program.T{datatypes = datatypes, body = body} fun loopExp(e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e in Exp.new{decs = loopDecs decs, result = result} end and loopDecs(ds: Dec.t list): Dec.t list = case ds of [] => [] | d :: ds => case d of MonoVal{var, ty, exp} => let fun keep exp = MonoVal{var = var, ty = ty, exp = exp} :: loopDecs ds in case exp of App{func, ...} => let fun rest() = d :: loopDecs ds in case kind(VarExp.var func) of None => incCount() :: rest() | Prim => rest() | Lam n => (if n >= 0 then set(var, Lam(n - 1)) else () ; incObvious() :: rest()) end | Lambda l => (set(var, case Exp.decs(Lambda.body l) of [MonoVal{exp = PrimApp _, ...}] => Prim | _ => makeLam l) ; keep(Lambda(loopLambda l))) | Case{test, cases, default} => keep (Case{test = test, cases = List.map(cases, fn (p, e) => (p, loopExp e)), default = Option.map loopExp default}) | Handle{try, catch, handler} => keep(Handle{try = loopExp try, catch = catch, handler = loopExp handler}) | _ => d :: loopDecs ds end | PolyVal{var, tyvars, ty, exp} => PolyVal{var = var, tyvars = tyvars, ty = ty, exp = loopExp exp} :: loopDecs ds | Fun{tyvars, decs} => (List.foreach(decs, fn {var, lambda, ...} => set(var, makeLam lambda)) ; Fun{tyvars = tyvars, decs = List.map(decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})} :: loopDecs ds) | Exception _ => d :: loopDecs ds and loopLambda(l: Lambda.t): Lambda.t = let val {arg, argType, body} = Lambda.dest l in Lambda.new{arg = arg, argType = argType, body = loopExp body} end val program = Program.T{datatypes = datatypes, body = loopExp body} in Program.clear program ; program end else program end mlton-20210117+dfsg/mlton/xml/call-count.sig000066400000000000000000000011541416264345000205250ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature CALL_COUNT_STRUCTS = sig include XML end signature CALL_COUNT = sig include CALL_COUNT_STRUCTS (* Instrument the program so that the C primitive of the given name * is applied at each call. * For now, the string should either be Xml or Sxml. *) val instrument: Program.t * string -> Program.t end mlton-20210117+dfsg/mlton/xml/cps-transform.fun000066400000000000000000000442201416264345000212710ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 2007-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor CPSTransform (S: XML_TRANSFORM_STRUCTS): XML_TRANSFORM = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t fun transform (prog: Program.t): Program.t = let val Program.T {datatypes, body} = prog (* Answer type is always unit in an XML IL program. *) val ansTy = Type.unit (* Exception type is always exn in an XML IL program. *) val exnTy = Type.exn (* Style of function-type translation. *) datatype style = Curried | Mixed | Uncurried val style = Uncurried val {hom = transType, destroy = destroyTransType} = Type.makeMonoHom {con = fn (_, c, tys) => if Tycon.equals (c, Tycon.arrow) then let val argTy = Vector.sub (tys, 0) val resTy = Vector.sub (tys, 1) in case style of Curried => Type.arrow (Type.arrow (resTy, ansTy), Type.arrow (Type.arrow (exnTy, ansTy), Type.arrow (argTy, ansTy))) | Mixed => Type.arrow ((Type.tuple o Vector.new2) (Type.arrow (resTy, ansTy), Type.arrow (exnTy, ansTy)), Type.arrow (argTy, ansTy)) | Uncurried => Type.arrow ((Type.tuple o Vector.new3) (Type.arrow (resTy, ansTy), Type.arrow (exnTy, ansTy), argTy), ansTy) end else Type.con (c, tys)} (* A property to record (original) type of each bound variable. *) val {get = getVarOrigType: Var.t -> Type.t, set = setVarOrigType, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("getVarOrigType", Var.layout)) val getVarExpOrigType = getVarOrigType o VarExp.var fun transVarExpWithType (x: VarExp.t) : DirectExp.t * Type.t = let val xTy = transType (getVarExpOrigType x) in (DirectExp.varExp (x, xTy), xTy) end val transVarExp = #1 o transVarExpWithType fun transLambda (l: Lambda.t): Lambda.t = let val {arg = argVar, argType = argTy, body, mayInline} = Lambda.dest l val resTy = getVarExpOrigType (Exp.result body) val argTy = transType argTy val resTy = transType resTy val kVar = Var.newString "k" val kTy = Type.arrow (resTy, ansTy) val hVar = Var.newString "h" val hTy = Type.arrow (exnTy, ansTy) val bodyKHA = transExp (body, kVar, kTy, hVar, hTy) in case style of Curried => let val bodyKH = DirectExp.lambda {arg = argVar, argType = argTy, body = bodyKHA, bodyType = ansTy, mayInline = mayInline} val bodyK = DirectExp.lambda {arg = hVar, argType = hTy, body = bodyKH, bodyType = Type.arrow (argTy, ansTy), mayInline = true} in Lambda.make {arg = kVar, argType = kTy, body = DirectExp.toExp bodyK, mayInline = true} end | Mixed => let val xVar = Var.newNoname () val xTy = Type.tuple (Vector.new2 (kTy, hTy)) val x = DirectExp.monoVar (xVar, xTy) val bodyKH = DirectExp.lambda {arg = argVar, argType = argTy, body = bodyKHA, bodyType = ansTy, mayInline = mayInline} val bodyXK = DirectExp.let1 {var = hVar, exp = (DirectExp.select {tuple = x, offset = 1, ty = hTy}), body = bodyKH} val bodyX = DirectExp.let1 {var = kVar, exp = (DirectExp.select {tuple = x, offset = 0, ty = kTy}), body = bodyXK} in Lambda.make {arg = xVar, argType = xTy, body = DirectExp.toExp bodyX, mayInline = true} end | Uncurried => let val xVar = Var.newNoname () val xTy = Type.tuple (Vector.new3 (kTy, hTy, argTy)) val x = DirectExp.monoVar (xVar, xTy) val bodyXKH = DirectExp.let1 {var = argVar, exp = (DirectExp.select {tuple = x, offset = 2, ty = argTy}), body = bodyKHA} val bodyXK = DirectExp.let1 {var = hVar, exp = (DirectExp.select {tuple = x, offset = 1, ty = hTy}), body = bodyXKH} val bodyX = DirectExp.let1 {var = kVar, exp = (DirectExp.select {tuple = x, offset = 0, ty = kTy}), body = bodyXK} in Lambda.make {arg = xVar, argType = xTy, body = DirectExp.toExp bodyX, mayInline = mayInline} end end and transPrimExp (e: PrimExp.t, eTy: Type.t, kVar: Var.t, kTy: Type.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let val eTy = transType eTy val k = DirectExp.monoVar (kVar, kTy) val h = DirectExp.monoVar (hVar, hTy) fun return x = DirectExp.app {func = k, arg = x, ty = ansTy} in case e of App {arg, func} => let val (arg, argTy) = transVarExpWithType arg val func = transVarExp func in case style of Curried => let val app1 = DirectExp.app {func = func, arg = k, ty = Type.arrow (hTy, Type.arrow (argTy, ansTy))} val app2 = DirectExp.app {func = app1, arg = h, ty = Type.arrow (argTy, ansTy)} val app3 = DirectExp.app {func = app2, arg = arg, ty = ansTy} in app3 end | Mixed => let val arg2 = DirectExp.tuple {exps = Vector.new2 (k, h), ty = (Type.tuple o Vector.new2) (kTy, hTy)} val app2 = DirectExp.app {func = func, arg = arg2, ty = Type.arrow (argTy, ansTy)} val app3 = DirectExp.app {func = app2, arg = arg, ty = ansTy} in app3 end | Uncurried => let val arg3 = DirectExp.tuple {exps = Vector.new3 (k, h, arg), ty = (Type.tuple o Vector.new3) (kTy, hTy, argTy)} val app3 = DirectExp.app {func = func, arg = arg3, ty = ansTy} in app3 end end | Case {cases, default, test} => let val cases = case cases of Cases.Con cases => let val cases = Vector.map (cases, fn (Pat.T {arg, con, targs}, e) => let val arg = Option.map (arg, fn (arg, argTy) => (arg, transType argTy)) val targs = Vector.map (targs, transType) in (Pat.T {arg = arg, con = con, targs = targs}, transExp (e, kVar, kTy, hVar, hTy)) end) in Cases.Con cases end | Cases.Word (ws, cases) => let val cases = Vector.map (cases, fn (w, e) => (w, transExp (e, kVar, kTy, hVar, hTy))) in Cases.Word (ws, cases) end val default = Option.map (default, fn e => transExp (e, kVar, kTy, hVar, hTy)) in DirectExp.casee {cases = cases, default = default, test = transVarExp test, ty = ansTy} end | ConApp {arg, con, targs} => (return o DirectExp.conApp) {arg = Option.map (arg, transVarExp), con = con, targs = Vector.map (targs, transType), ty = eTy} | Const c => return (DirectExp.const c) | Handle {catch = (cVar, _), handler, try} => let val h'Var = Var.newString "h" val h'Ty = Type.arrow (exnTy, ansTy) val h'Body = DirectExp.lambda {arg = cVar, argType = exnTy, body = transExp (handler, kVar, kTy, hVar, hTy), bodyType = ansTy, mayInline = true} in DirectExp.let1 {var = h'Var, exp = h'Body, body = transExp (try, kVar, kTy, h'Var, h'Ty)} end | Lambda l => let val l = transLambda l in return (DirectExp.fromLambda (l, eTy)) end | PrimApp {args, prim, targs} => DirectExp.primApp {args = Vector.map (args, transVarExp), prim = prim, targs = Vector.map (targs, transType), ty = eTy} | Profile _ => let (* Profile statements won't properly nest after * CPS conversion. *) in Error.bug "CPSTransform.transPrimExp: Profile" end | Raise {exn, ...} => DirectExp.app {func = h, arg = transVarExp exn, ty = ansTy} | Select {offset, tuple} => (return o DirectExp.select) {tuple = transVarExp tuple, offset = offset, ty = eTy} | Tuple xs => (return o DirectExp.tuple) {exps = Vector.map (xs, transVarExp), ty = eTy} | Var x => return (transVarExp x) end and transDec (d: Dec.t, kBody: DirectExp.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let in case d of Exception _ => Error.bug "CPSTransform.transDec: Exception" | Fun {decs, tyvars} => let val decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = transType ty, lambda = transLambda lambda}) val d = Fun {decs = decs, tyvars = tyvars} in DirectExp.lett {decs = [d], body = kBody} end | MonoVal {var, ty, exp} => let val expTy = ty val argVar = var val argTy = transType ty val k'Var = Var.newString "k" val k'Ty = Type.arrow (argTy, ansTy) val k'Body = DirectExp.lambda {arg = argVar, argType = argTy, body = kBody, bodyType = ansTy, mayInline = true} in DirectExp.let1 {var = k'Var, exp = k'Body, body = transPrimExp (exp, expTy, k'Var, k'Ty, hVar, hTy)} end | PolyVal _ => Error.bug "CPSTransform.transDec: PolyVal" end and transExp (e: Exp.t, kVar: Var.t, kTy: Type.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let val {decs, result} = Exp.dest e val k = DirectExp.monoVar (kVar, kTy) val k'Body = DirectExp.app {func = k, arg = transVarExp result, ty = ansTy} in List.foldr (decs, k'Body, fn (dec, kBody) => transDec (dec, kBody, hVar, hTy)) end (* Set (original) type of each bound variable. *) val () = Exp.foreachBoundVar (body, fn (v, _, ty) => setVarOrigType (v, ty)) (* Translate datatypes. *) val datatypes = Vector.map (datatypes, fn {cons, tycon, tyvars} => {cons = Vector.map (cons, fn {arg, con} => {arg = Option.map (arg, transType), con = con}), tycon = tycon, tyvars = tyvars}) (* Initial continuation. *) val k0 = Var.newString "k0" val k0Body = DirectExp.lambda {arg = Var.newNoname (), argType = ansTy, body = DirectExp.unit (), bodyType = ansTy, mayInline = true} val k0Ty = Type.arrow (ansTy, Type.unit) (* Initial exception continuation. *) val h0 = Var.newString "h0" val h0Body = DirectExp.lambda {arg = Var.newNoname (), argType = exnTy, body = DirectExp.unit (), bodyType = ansTy, mayInline = true} val h0Ty = Type.arrow (exnTy, Type.unit) (* Translate body, in context of initial continuations. *) val body = DirectExp.let1 {var = k0, exp = k0Body, body = DirectExp.let1 {var = h0, exp = h0Body, body = transExp (body, k0, k0Ty, h0, h0Ty)}} (* Closure-convert (transformation from SXML to SSA) introduces * every (non-main) SSA function with "raises = [exn]"; * we need a top-level handler to avoid a "raise mismatch" type * error in the SSA IL. *) val body = DirectExp.handlee {try = body, catch = (Var.newNoname (), exnTy), handler = DirectExp.unit (), ty = ansTy} val body = DirectExp.toExp body val prog = Program.T {datatypes = datatypes, body = body} (* Clear and destroy properties. *) val () = Exp.clear body val () = destroyTransType () in prog end end mlton-20210117+dfsg/mlton/xml/implement-exceptions.fun000066400000000000000000000555061416264345000226550ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ImplementExceptions (S: XML_TRANSFORM_STRUCTS): XML_TRANSFORM = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Dexp = DirectExp fun transform (Program.T {datatypes, body, ...}): Program.t = let (* topLevelHandler holds the ref cell containing the function of * type exn -> unit that should be called on unhandled exceptions. *) val topLevelHandlerType = Type.arrow (Type.exn, Type.unit) val topLevelHandlerVar = Var.newNoname () val extraType = Exn.withEscape (fn escape => let val _ = Exp.foreachPrimExp (body, fn (_, _, e) => case e of PrimApp {prim, targs, ...} => (case prim of Prim.Exn_extra => escape (Vector.first targs) | Prim.Exn_setExtendExtra => escape (Vector.first targs) | _ => ()) | _ => ()) in Type.unit end) val dfltExtraVar = Var.newNoname () val dfltExtraExp = if Type.isUnit extraType then Dexp.unit () else let val extraTycon = Type.tycon extraType val extraCon = Exn.withEscape (fn escape => let val _ = Vector.foreach (datatypes, fn {cons, tycon, ...} => if Tycon.equals (tycon, extraTycon) then Vector.foreach (cons, fn {arg, con, ...} => case arg of NONE => escape con | _ => ()) else ()) in Error.bug "ImplementExceptions: can't find extraCon" end) in Dexp.conApp {arg = NONE, con = extraCon, targs = Vector.new0 (), ty = extraType} end val extendExtraType = Type.arrow (extraType, extraType) val extendExtraVar = Var.newNoname () val exnNameVar = Var.newString "exnName" (* sumType is the type of the datatype with all of the exn constructors. *) val {extraDatatypes, injectSum, projectExtra, projectSum, raisee, sumTycon, sumType } = if not (!Control.exnHistory) then {extraDatatypes = Vector.new0 (), injectSum = fn e => e, projectExtra = fn _ => Dexp.monoVar (dfltExtraVar, extraType), projectSum = fn x => Dexp.monoVar (x, Type.exn), raisee = (fn {exn, extend, ty, var} => [MonoVal {var = var, ty = ty, exp = Raise {exn = exn, extend = extend}}]), sumTycon = Tycon.exn, sumType = Type.exn} else let val sumTycon = Tycon.newNoname () val sumType = Type.con (sumTycon, Vector.new0 ()) local open Type in val exnCon = Con.newNoname () val exnConArgType = tuple (Vector.new2 (extraType, sumType)) end fun makeExn {exn, extra} = let open Dexp in conApp {con = exnCon, targs = Vector.new0 (), ty = Type.exn, arg = SOME (tuple {exps = Vector.new2 (extra, exn), ty = exnConArgType})} end fun injectSum (exn: Dexp.t): Dexp.t = makeExn {exn = exn, extra = Dexp.monoVar (dfltExtraVar, extraType)} fun extractExtra x = Dexp.select {tuple = x, offset = 0, ty = extraType} fun extractSum x = Dexp.select {tuple = x, offset = 1, ty = sumType} fun extract (exn: Var.t, ty, f: Dexp.t -> Dexp.t): Dexp.t = let open Dexp val tuple = Var.newNoname () in casee {test = monoVar (exn, Type.exn), default = NONE, ty = ty, cases = Cases.Con (Vector.new1 (Pat.T {con = exnCon, targs = Vector.new0 (), arg = SOME (tuple, exnConArgType)}, f (monoVar (tuple, exnConArgType))))} end fun projectExtra (x: Var.t) = extract (x, extraType, extractExtra) fun projectSum (x: Var.t) = extract (x, sumType, extractSum) fun raisee {exn: VarExp.t, extend: bool, ty: Type.t, var = x : Var.t}: Dec.t list = let open Dexp val exp = if not extend then raisee {exn = varExp (exn, Type.exn), extend = false, ty = ty} else extract (VarExp.var exn, ty, fn tup => raisee {exn = makeExn {exn = extractSum tup, extra = app {func = deref (monoVar (extendExtraVar, Type.reff extendExtraType)), arg = extractExtra tup, ty = extraType}}, extend = false, ty = ty}) in vall {exp = exp, var = x} end val extraDatatypes = Vector.new1 {tycon = Tycon.exn, tyvars = Vector.new0 (), cons = Vector.new1 {con = exnCon, arg = SOME exnConArgType}} in {extraDatatypes = extraDatatypes, injectSum = injectSum, projectExtra = projectExtra, projectSum = projectSum, raisee = raisee, sumTycon = sumTycon, sumType = sumType} end val {get = exconInfo: Con.t -> {refVar: Var.t, make: VarExp.t option -> Dexp.t} option, set = setExconInfo, destroy} = Property.destGetSetOnce (Con.plist, Property.initConst NONE) val setExconInfo = Trace.trace2 ("ImplementExceptions.setExconInfo", Con.layout, Layout.ignore, Unit.layout) setExconInfo val exconInfo = Trace.trace ("ImplementExceptions.exconInfo", Con.layout, Layout.ignore) exconInfo fun isExcon c = case exconInfo c of NONE => false | SOME _ => true val exnValCons: {con: Con.t, arg: Type.t} list ref = ref [] val traceLoopDec = Trace.trace ("ImplementExceptions.loopDec", Dec.layout, List.layout Dec.layout) fun loop (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.concatRev (List.fold (decs, [], fn (d, ds) => loopDec d :: ds)) in Exp.make {decs = decs, result = result} end and loopDec arg: Dec.t list = traceLoopDec (fn (dec: Dec.t) => case dec of MonoVal b => loopMonoVal b | Fun {decs, ...} => [Fun {tyvars = Vector.new0 (), decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})}] | Exception {con, arg} => let open Dexp val r = Var.newString "exnRef" val uniq = monoVar (r, Type.unitRef) fun conApp arg = injectSum (Dexp.conApp {con = con, targs = Vector.new0 (), ty = sumType, arg = SOME arg}) val (arg, decs, make) = case arg of NONE => (* If the exception is not value carrying, then go * ahead and make it now. *) let val exn = Var.newNoname () in (Type.unitRef, Dexp.vall {var = exn, exp = conApp uniq}, fn NONE => monoVar (exn, Type.exn) | _ => Error.bug "ImplementExceptions: nullary excon applied to arg") end | SOME t => let val tupleType = Type.tuple (Vector.new2 (Type.unitRef, t)) in (tupleType, [], fn SOME x => (conApp o tuple) {exps = Vector.new2 (uniq, varExp (x, t)), ty = tupleType} | _ => Error.bug "ImplmentExceptions: unary excon not applied to arg") end in setExconInfo (con, SOME {refVar = r, make = make}) ; List.push (exnValCons, {con = con, arg = arg}) ; vall {var = r, exp = reff (unit ())} @ decs end | _ => Error.bug "ImplementExceptions: saw unexpected dec") arg and loopMonoVal {var, ty, exp} : Dec.t list = let fun primExp e = [MonoVal {var = var, ty = ty, exp = e}] fun keep () = primExp exp fun makeExp e = Dexp.vall {var = var, exp = e} in case exp of Case {test, cases, default} => let fun normal () = primExp (Case {cases = Cases.map (cases, loop), default = Option.map (default, loop), test = test}) in case cases of Cases.Con cases => if Vector.isEmpty cases then normal () else let val (Pat.T {con, ...}, _) = Vector.first cases in if not (isExcon con) then normal () else (* convert to an exception match *) let open Dexp val defaultVar = Var.newString "default" fun callDefault () = app {func = (monoVar (defaultVar, Type.arrow (Type.unit, ty))), arg = unit (), ty = ty} val unit = Var.newString "unit" val body = case default of NONE => Error.bug "ImplementExceptions: no default for exception case" | SOME e => fromExp (loop e, ty) val decs = vall {var = defaultVar, exp = lambda {arg = unit, argType = Type.unit, body = body, bodyType = ty, mayInline = true}} in makeExp (lett {decs = decs, body = casee {test = projectSum (VarExp.var test), ty = ty, default = SOME (callDefault ()), cases = Cases.Con (Vector.map (cases, fn (Pat.T {con, arg, ...}, e) => let val refVar = Var.newNoname () val body = iff {test = equal (monoVar (refVar, Type.unitRef), monoVar (#refVar (valOf (exconInfo con)), Type.unitRef)), ty = ty, thenn = (fromExp (loop e, ty)), elsee = callDefault ()} fun make (arg, body) = (Pat.T {con = con, targs = Vector.new0 (), arg = SOME arg}, body) in case arg of NONE => make ((refVar, Type.unitRef), body) | SOME (x, t) => let val tuple = (Var.newNoname (), Type.tuple (Vector.new2 (Type.unitRef, t))) in make (tuple, detupleBind {tuple = monoVar tuple, components = Vector.new2 (refVar, x), body = body}) end end))}}) end end | _ => normal () end | ConApp {con, arg, ...} => (case exconInfo con of NONE => keep () | SOME {make, ...} => makeExp (make arg)) | Handle {try, catch = (catch, ty), handler} => primExp (Handle {try = loop try, catch = (catch, ty), handler = loop handler}) | Lambda l => primExp (Lambda (loopLambda l)) | PrimApp {args, prim, ...} => let fun deref (var, ty) = primExp (PrimApp {prim = Prim.Ref_deref, targs = Vector.new1 ty, args = Vector.new1 (VarExp.mono var)}) fun assign (var, ty) = primExp (PrimApp {prim = Prim.Ref_assign, targs = Vector.new1 ty, args = Vector.new2 (VarExp.mono var, Vector.first args)}) in case prim of Prim.Exn_extra => (makeExp o projectExtra) (VarExp.var (Vector.first args)) | Prim.Exn_name => (primExp o App) {func = VarExp.mono exnNameVar, arg = Vector.first args} | Prim.Exn_setExtendExtra => assign (extendExtraVar, extendExtraType) | Prim.TopLevel_getHandler => deref (topLevelHandlerVar, topLevelHandlerType) | Prim.TopLevel_setHandler => assign (topLevelHandlerVar, topLevelHandlerType) | _ => primExp exp end | Raise {exn, extend} => raisee {exn = exn, extend = extend, ty = ty, var = var} | _ => keep () end and loopLambda l = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loop body, mayInline = mayInline} end val body = Dexp.fromExp (loop body, Type.unit) val exnValCons = Vector.fromList (!exnValCons) val datatypes = Vector.concat [Vector.new1 {tycon = sumTycon, tyvars = Vector.new0 (), cons = Vector.map (exnValCons, fn {con, arg} => {con = con, arg = SOME arg})}, extraDatatypes, datatypes] val body = Dexp.let1 {body = body, exp = let val exn = Var.newNoname () in Dexp.lambda {arg = exn, argType = Type.exn, body = (Dexp.casee {test = projectSum exn, cases = Cases.Con (Vector.map (exnValCons, fn {con, arg} => (Pat.T {con = con, targs = Vector.new0 (), arg = SOME (Var.newNoname (), arg)}, Dexp.const (Const.string (Con.originalName con))))), default = NONE, ty = Type.string}), bodyType = Type.string, mayInline = true} end, var = exnNameVar} val body = Dexp.let1 {body = body, exp = (Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = extraType, body = (Dexp.sequence o Vector.new2) (Dexp.bug "extendExtra unimplemented", Dexp.monoVar (dfltExtraVar, extraType)), bodyType = extraType, mayInline = true})), var = extendExtraVar} val body = Dexp.let1 {body = body, exp = dfltExtraExp, var = dfltExtraVar} val body = let val x = (Var.newNoname (), Type.exn) in Dexp.handlee {try = body, ty = Type.unit, catch = x, handler = Dexp.app {func = (Dexp.deref (Dexp.monoVar (topLevelHandlerVar, Type.reff topLevelHandlerType))), arg = Dexp.monoVar x, ty = Type.unit}} end val body = Dexp.let1 {var = topLevelHandlerVar, exp = Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = Type.exn, body = Dexp.bug "toplevel handler not installed", bodyType = Type.unit, mayInline = true}), body = body} val body = Dexp.handlee {try = body, ty = Type.unit, catch = (Var.newNoname (), Type.exn), handler = Dexp.bug "toplevel handler not installed"} val body = Dexp.toExp body val program = Program.T {datatypes = datatypes, body = body} val _ = destroy () in program end end mlton-20210117+dfsg/mlton/xml/implement-suffix.fun000066400000000000000000000112141416264345000217640ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor ImplementSuffix (S: XML_TRANSFORM_STRUCTS): XML_TRANSFORM = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Dexp = DirectExp fun transform (Program.T {datatypes, body, ...}): Program.t = let (* topLevelSuffix holds the ref cell containing the function of * type unit -> unit that should be called on program exit. *) val topLevelSuffixType = Type.arrow (Type.unit, Type.unit) val topLevelSuffixVar = Var.newNoname () fun loop (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.rev (List.fold (decs, [], fn (d, ds) => loopDec d :: ds)) in Exp.make {decs = decs, result = result} end and loopDec (dec: Dec.t): Dec.t = case dec of MonoVal b => loopMonoVal b | Fun {decs, ...} => Fun {tyvars = Vector.new0 (), decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})} | Exception {...} => dec | _ => Error.bug "ImplementSuffix: saw unexpected dec" and loopMonoVal {var, ty, exp} : Dec.t = let fun primExp e = MonoVal {var = var, ty = ty, exp = e} fun keep () = primExp exp in case exp of Case {test, cases, default} => primExp (Case {cases = Cases.map (cases, loop), default = Option.map (default, loop), test = test}) | ConApp {...} => keep () | Handle {try, catch = (catch, ty), handler} => primExp (Handle {try = loop try, catch = (catch, ty), handler = loop handler}) | Lambda l => primExp (Lambda (loopLambda l)) | PrimApp {args, prim, ...} => let fun deref (var, ty) = primExp (PrimApp {prim = Prim.Ref_deref, targs = Vector.new1 ty, args = Vector.new1 (VarExp.mono var)}) fun assign (var, ty) = primExp (PrimApp {prim = Prim.Ref_assign, targs = Vector.new1 ty, args = Vector.new2 (VarExp.mono var, Vector.first args)}) in case prim of Prim.TopLevel_getSuffix => deref (topLevelSuffixVar, topLevelSuffixType) | Prim.TopLevel_setSuffix => assign (topLevelSuffixVar, topLevelSuffixType) | _ => keep () end | _ => keep () end and loopLambda l = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loop body, mayInline = mayInline} end val body = Dexp.fromExp (loop body, Type.unit) val body = (Dexp.sequence o Vector.new2) (body, Dexp.app {func = (Dexp.deref (Dexp.monoVar (topLevelSuffixVar, Type.reff topLevelSuffixType))), arg = Dexp.unit (), ty = Type.unit}) val body = Dexp.let1 {var = topLevelSuffixVar, exp = Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = Type.unit, body = Dexp.bug "toplevel suffix not installed", bodyType = Type.unit, mayInline = true}), body = body} val body = Dexp.toExp body in Program.T {datatypes = datatypes, body = body} end end mlton-20210117+dfsg/mlton/xml/monomorphise.fun000066400000000000000000000405241416264345000212150ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Monomorphise (S: MONOMORPHISE_STRUCTS): MONOMORPHISE = struct open S open Xml.Atoms local open Xml in structure Xcases = Cases structure Xpat = Pat structure Xdec = Dec structure Xexp = Exp structure Xlambda = Lambda structure XprimExp = PrimExp structure Xprogram = Program structure Xtype = Type structure XvarExp = VarExp end local open Sxml in structure Scases = Cases structure Spat = Pat structure Sdec = Dec structure Sexp = Exp structure Slambda = Lambda structure SprimExp = PrimExp structure Sprogram = Program structure Stype = Type structure SvarExp = VarExp end structure Cache: sig type 'a t val new: unit -> 'a t val getOrAdd: 'a t * Stype.t vector * (unit -> 'a) -> 'a val toList: 'a t -> (Stype.t vector * 'a) list end = struct type 'a t = (Stype.t vector, 'a) HashTable.t local val base = Random.word () in fun hash ts = Hash.combine (base, Hash.vectorMap (ts, Stype.hash)) fun equal (ts, ts') = Vector.equals (ts, ts', Stype.equals) end fun new () : 'a t = HashTable.new {hash = hash, equals = equal} fun getOrAdd (c, ts, th) = HashTable.lookupOrInsert (c, ts, th) val toList = HashTable.toList end fun monomorphise (Xprogram.T {datatypes, body, ...}): Sprogram.t = let val {get = getVar: Var.t -> (Stype.t vector -> SvarExp.t), set = setVar, ...} = Property.getSet (Var.plist, Property.initRaise ("var", Var.layout)) val setVar = Trace.trace2 ("Monomorphise.setVar", Var.layout, Layout.ignore, Unit.layout) setVar val getVar = Trace.trace ("Monomorphise.getVar", Var.layout, Layout.ignore) getVar val {get = getCon: Con.t -> (Stype.t vector -> Con.t), set = setCon, destroy = destroyCon} = Property.destGetSet (Con.plist, Property.initRaise ("mono", Con.layout)) val {get = getTycon: Tycon.t -> Stype.t vector -> Stype.t, set = setTycon, destroy = destroyTycon} = Property.destGetSet (Tycon.plist, Property.initRaise ("mono", Tycon.layout)) val _ = List.foreach (Tycon.prims, fn {tycon = t, ...} => setTycon (t, fn ts => Stype.con (t, ts))) val {set = setTyvar, get = getTyvar: Tyvar.t -> Stype.t, ...} = Property.getSet (Tyvar.plist, Property.initRaise ("tyvar", Tyvar.layout)) val getTyvar = Trace.trace ("Monomorphise.getTyvar", Tyvar.layout, Stype.layout) getTyvar val setTyvar = Trace.trace2 ("Monomorphise.setTyvar", Tyvar.layout, Stype.layout, Unit.layout) setTyvar fun setTyvars (tyvs, tys) = Vector.foreach2 (tyvs, tys, setTyvar) val setTyvars = Trace.trace2 ("Monomorphise.setTyvars", Vector.layout Tyvar.layout, Vector.layout Stype.layout, Unit.layout) setTyvars fun monoType (t: Xtype.t): Stype.t = Xtype.hom {ty = t, var = getTyvar, con = fn (c, ts) => getTycon c ts} val monoType = Trace.trace ("Monomorphise.monoType", Xtype.layout, Stype.layout) monoType fun monoTypeOpt (to: Xtype.t option): Stype.t option = case to of NONE => NONE | SOME t => SOME (monoType t) fun monoTypes ts = Vector.map (ts, monoType) fun monoVar (x: Var.t, ts: Xtype.t vector): SvarExp.t = getVar x (monoTypes ts) val monoVar = Trace.trace2 ("Monomorphise.monoVar", Var.layout, Vector.layout Xtype.layout, SvarExp.layout) monoVar fun monoCon (c: Con.t, ts: Xtype.t vector): Con.t = getCon c (monoTypes ts) val monoCon = Trace.trace2 ("Monomorphise.monoCon", Con.layout, Vector.layout Xtype.layout, Con.layout) monoCon (* It is necessary to create new variables for monomorphic variables * because they still may have type variables in their type. *) fun renameMono (x, t) = let val x' = Var.new x val ve = SvarExp.mono x' fun inst ts = if Vector.isEmpty ts then ve else Error.bug "Monomorphise.renameMono: expected monomorphic instance" val _ = setVar (x, inst) in (x', monoType t) end val renameMono = Trace.trace2 ("Monomorphise.renameMono", Var.layout, Xtype.layout, Layout.tuple2 (Var.layout, Stype.layout)) renameMono fun monoPat (Xpat.T {con, targs, arg}): Spat.t = let val con = monoCon (con, targs) in Spat.T {con = con, targs = Vector.new0 (), arg = (case arg of NONE => NONE | SOME x => SOME (renameMono x))} end val monoPat = Trace.trace ("Monomorphise.monoPat", Xpat.layout, Spat.layout) monoPat val traceMonoExp = Trace.trace ("Monomorphise.monoExp", Xexp.layout, Sexp.layout) val traceMonoDec = Trace.trace ("Monomorphise.monoDec", Xdec.layout, fn (_: unit -> Sdec.t list) => Layout.empty) (*------------------------------------*) (* datatypes *) (*------------------------------------*) val newDbs: {tyvars: Tyvar.t vector, types: Stype.t vector, tycon: Tycon.t, ty: Stype.t, cons: {con: Con.t, typ: Xtype.t option, used: bool} ref vector} list ref = ref [] val _ = Vector.foreach (datatypes, fn {tyvars, tycon, cons} => let val cache = Cache.new () fun instantiate ts = Cache.getOrAdd (cache, ts, fn () => let val (tycon, cons) = if Tycon.equals (tycon, Tycon.bool) then (tycon, Vector.map (cons, fn {con, ...} => ref {con = con, typ = NONE, used = true})) else (Tycon.new tycon, Vector.map (cons, fn {con, arg} => ref {con = con, typ = arg, used = false})) val db = {tyvars = tyvars, types = ts, tycon = tycon, ty = Stype.con (tycon, Vector.new0 ()), cons = cons} val _ = List.push (newDbs, db) in db end) val _ = setTycon (tycon, #ty o instantiate) val _ = Vector.foreachi (cons, fn (n, {con, ...}) => setCon (con, fn ts => let val r as ref {con, typ, used} = Vector.sub (#cons (instantiate ts), n) in if used then con else let val con = Con.new con in r := {con = con, typ = typ, used = true} ; con end end)) in () end) val _ = monoCon (Con.truee, Vector.new0 ()) val _ = monoCon (Con.falsee, Vector.new0 ()) fun finishDbs ac = let val dbs = !newDbs val _ = newDbs := [] in case dbs of [] => ac | _ => finishDbs (List.fold (dbs, ac, fn ({tyvars, types, tycon, cons, ...}, ac) => let val cons = Vector.keepAllMap (cons, fn ref {con, typ, used} => if used then (setTyvars (tyvars, types) ; SOME {con = con, arg = monoTypeOpt typ}) else NONE) val cons = if Vector.isEmpty cons then Vector.new1 {con = Con.newNoname (), arg = NONE} else cons in {tycon = tycon, tyvars = Vector.new0 (), cons = cons} :: ac end)) end (*------------------------------------*) (* monoExp *) (*------------------------------------*) fun monoVarExp (XvarExp.T {var, targs}) = monoVar (var, targs) val monoVarExp = Trace.trace ("Monomorphise.monoVarExp", XvarExp.layout, SvarExp.layout) monoVarExp fun monoVarExps xs = Vector.map (xs, monoVarExp) fun monoExp (arg: Xexp.t): Sexp.t = traceMonoExp (fn (e: Xexp.t) => let val {decs, result} = Xexp.dest e val thunks = List.fold (decs, [], fn (dec, thunks) => monoDec dec :: thunks) val result = monoVarExp result val decs = List.fold (thunks, [], fn (thunk, decs) => thunk () @ decs) in Sexp.make {decs = decs, result = result} end) arg and monoPrimExp (e: XprimExp.t): SprimExp.t = case e of XprimExp.App {func, arg} => SprimExp.App {func = monoVarExp func, arg = monoVarExp arg} | XprimExp.Case {test, cases, default} => let val cases = case cases of Xcases.Con cases => Scases.Con (Vector.map (cases, fn (pat, exp) => (monoPat pat, monoExp exp))) | Xcases.Word (s, v) => Scases.Word (s, Vector.map (v, fn (c, e) => (c, monoExp e))) in SprimExp.Case {test = monoVarExp test, cases = cases, default = Option.map (default, monoExp)} end | XprimExp.ConApp {con, targs, arg} => let val con = monoCon (con, targs) in SprimExp.ConApp {con = con, targs = Vector.new0 (), arg = Option.map (arg, monoVarExp)} end | XprimExp.Const c => SprimExp.Const c | XprimExp.Handle {try, catch, handler} => SprimExp.Handle {try = monoExp try, catch = renameMono catch, handler = monoExp handler} | XprimExp.Lambda l => SprimExp.Lambda (monoLambda l) | XprimExp.PrimApp {prim, targs, args} => SprimExp.PrimApp {args = monoVarExps args, prim = Prim.map (prim, monoType), targs = monoTypes targs} | XprimExp.Profile e => SprimExp.Profile e | XprimExp.Raise {exn, extend} => SprimExp.Raise {exn = monoVarExp exn, extend = extend} | XprimExp.Select {tuple, offset} => SprimExp.Select {tuple = monoVarExp tuple, offset = offset} | XprimExp.Tuple xs => SprimExp.Tuple (monoVarExps xs) | XprimExp.Var x => SprimExp.Var (monoVarExp x) and monoLambda l: Slambda.t = let val {arg, argType, body, mayInline} = Xlambda.dest l val (arg, argType) = renameMono (arg, argType) in Slambda.make {arg = arg, argType = argType, body = monoExp body, mayInline = mayInline} end (*------------------------------------*) (* monoDec *) (*------------------------------------*) and monoDec arg: unit -> Sdec.t list = traceMonoDec (fn (d: Xdec.t) => case d of Xdec.MonoVal {var, ty, exp} => let val (var, ty) = renameMono (var, ty) in fn () => [Sdec.MonoVal {var = var, ty = ty, exp = monoPrimExp exp}] end | Xdec.PolyVal {var, tyvars, ty, exp} => let val cache = Cache.new () val _ = setVar (var, fn ts => (setTyvars (tyvars, ts) ; Cache.getOrAdd (cache, ts, fn () => SvarExp.mono (Var.new var)))) in fn () => List.fold (Cache.toList cache, [], fn ((ts, ve), decs) => (setVar (var, fn _ => ve) ; let val _ = setTyvars (tyvars, ts) val ty = monoType ty val {decs = decs', result} = Sexp.dest (monoExp exp) in decs' @ (Sdec.MonoVal {var = SvarExp.var ve, ty = ty, exp = SprimExp.Var result} :: decs) end)) end | Xdec.Fun {tyvars, decs} => let val cache = Cache.new () val _ = Vector.foreachi (decs, fn (n, {var, ...}) => setVar (var, fn ts => (setTyvars (tyvars, ts) ; Vector.sub (Cache.getOrAdd (cache, ts, fn () => Vector.map (decs, SvarExp.mono o Var.new o #var)), n)))) in fn () => List.revMap (Cache.toList cache, fn (ts, xs) => (Vector.foreach2 (decs, xs, fn ({var, ...}, ve) => setVar (var, fn _ => ve)) ; (Sdec.Fun {tyvars = Vector.new0 (), decs = (Vector.map2 (decs, xs, fn ({ty, lambda, ...}, ve) => let val _ = setTyvars (tyvars, ts) val ty = monoType ty val lambda = monoLambda lambda in {var = SvarExp.var ve, ty = ty, lambda = lambda} end))}))) end | Xdec.Exception {con, arg} => let val con' = Con.new con val _ = setCon (con, fn _ => con') in fn () => [Sdec.Exception {con = con', arg = monoTypeOpt arg}] end) arg (*------------------------------------*) (* main code for monomorphise *) (*------------------------------------*) val body = monoExp body val datatypes = finishDbs [] val program = Sprogram.T {datatypes = Vector.fromList datatypes, body = body} val _ = Sprogram.clear program val _ = destroyCon () val _ = destroyTycon () in program end end mlton-20210117+dfsg/mlton/xml/monomorphise.sig000066400000000000000000000010171416264345000212010ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature MONOMORPHISE_STRUCTS = sig structure Xml: XML structure Sxml: SXML_EXNS sharing Xml.Atoms = Sxml.Atoms end signature MONOMORPHISE = sig include MONOMORPHISE_STRUCTS val monomorphise: Xml.Program.t -> Sxml.Program.t end mlton-20210117+dfsg/mlton/xml/polyvariance.fun000066400000000000000000000523551416264345000211770ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* * Duplicate a let bound function at each variable reference * if cost is smaller than threshold. * *) functor Polyvariance (S: XML_TRANSFORM_STRUCTS): XML_TRANSFORM = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Type = struct open Type fun containsArrow t = containsTycon (t, Tycon.arrow) fun isHigherOrder t = case deArrowOpt t of NONE => false | SOME (t1, t2) => containsArrow t1 orelse isHigherOrder t2 (* val isHigherOrder = Trace.trace ("Polyvariance.isHigherOrder", layout, Bool.layout) isHigherOrder *) end fun lambdaSize (Program.T {body, ...}): Lambda.t -> int = let val {get = size: Lambda.t -> int, set, ...} = Property.getSetOnce (Lambda.plist, Property.initRaise ("size", Lambda.layout)) fun loopExp (e: Exp.t, n: int): int = List.fold (Exp.decs e, n, fn (d, n) => case d of MonoVal {exp, ...} => loopPrimExp (exp, n + 1) | PolyVal {exp, ...} => loopExp (exp, n + 1) | Fun {decs, ...} => Vector.fold (decs, n, fn ({lambda, ...}, n) => loopLambda (lambda, n)) | Exception _ => n + 1) and loopLambda (l: Lambda.t, n): int = let val m = loopExp (Lambda.body l, 0) in set (l, m); m + n end and loopPrimExp (e: PrimExp.t, n: int): int = case e of Case {cases, default, ...} => let val n = n + 1 in Cases.fold (cases, (case default of NONE => n | SOME e => loopExp (e, n)), loopExp) end | Handle {try, catch = (catchVar, _), handler} => (case Exp.dest handler of {decs = [MonoVal {exp = Profile (ProfileExp.Leave _), ...}, MonoVal {var = raiseVar, exp = Raise {exn = exnVar, ...}, ...}], result = resultVar} => if VarExp.equals (VarExp.mono catchVar, exnVar) andalso VarExp.equals (VarExp.mono raiseVar, resultVar) then loopExp (try, n - 1) else loopExp (try, loopExp (handler, n + 1)) | _ => loopExp (try, loopExp (handler, n + 1))) | Lambda l => loopLambda (l, n + 1) | Profile _ => n | _ => n + 1 val _ = loopExp (body, 0) in size end fun shouldDuplicate (program as Program.T {body, ...}, hofo, small, product) : Var.t -> bool = let val costs: (Var.t * int * int * int) list ref = ref [] val lambdaSize = lambdaSize program fun isOK (var: Var.t, size: int, numOccurrences: int): bool = let val cost = (numOccurrences - 1) * (size - small) in List.push (costs, (var, size, numOccurrences, cost)) ; cost <= product end type info = {numOccurrences: int ref, shouldDuplicate: bool ref} val {get = varInfo: Var.t -> info option, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun new {lambda = _, ty, var}: unit = if not hofo orelse Type.isHigherOrder ty then setVarInfo (var, SOME {numOccurrences = ref 0, shouldDuplicate = ref false}) else () fun loopExp (e: Exp.t, numDuplicates: int): unit = let fun loopVar (x: VarExp.t): unit = case varInfo (VarExp.var x) of NONE => () | SOME {numOccurrences, ...} => numOccurrences := !numOccurrences + numDuplicates fun loopVars xs = Vector.foreach (xs, loopVar) val {decs, result} = Exp.dest e val rec loopDecs = fn [] => loopVar result | dec :: decs => case dec of MonoVal {var, ty, exp} => (case exp of Lambda l => (new {var = var, ty = ty, lambda = l} ; loopDecs decs ; let val body = Lambda.body l val numDuplicates = case varInfo var of NONE => numDuplicates | SOME {numOccurrences, shouldDuplicate} => if isOK (var, lambdaSize l, !numOccurrences) then (shouldDuplicate := true ; !numOccurrences) else numDuplicates in loopExp (body, numDuplicates) end) | _ => let val loopExp = fn e => loopExp (e, numDuplicates) val _ = case exp of App {func, arg} => (loopVar func; loopVar arg) | Case {test, cases, default} => (loopVar test ; Cases.foreach (cases, loopExp) ; Option.app (default, loopExp)) | ConApp {arg, ...} => Option.app (arg, loopVar) | Const _ => () | Handle {try, handler, ...} => (loopExp try; loopExp handler) | Lambda _ => Error.bug "Polyvariance.loopExp.loopDecs: unexpected Lambda" | PrimApp {args, ...} => loopVars args | Profile _ => () | Raise {exn, ...} => loopVar exn | Select {tuple, ...} => loopVar tuple | Tuple xs => loopVars xs | Var x => loopVar x in loopDecs decs end) | Fun {decs = lambdas, ...} => let val _ = (Vector.foreach (lambdas, new) ; loopDecs decs) val dups = Vector.fold (lambdas, [], fn ({var, lambda, ...}, dups) => let val body = Lambda.body lambda in case varInfo var of NONE => (loopExp (body, numDuplicates); dups) | SOME info => {body = body, size = lambdaSize lambda, info = info} :: dups end) in case dups of [] => () | _ => let val size = List.fold (dups, 0, fn ({size, ...}, n) => n + size) val numOccurrences = List.fold (dups, 0, fn ({info = {numOccurrences, ...}, ...}, n) => n + !numOccurrences) in if isOK (if Vector.isEmpty lambdas then Error.bug "Polyvariance.loopExp.loopDecs: empty lambdas" else #var (Vector.first lambdas), size, numOccurrences) then (List.foreach (dups, fn {body, info = {shouldDuplicate, ...}, ...} => (shouldDuplicate := true ; loopExp (body, numOccurrences)))) else List.foreach (dups, fn {body, ...} => loopExp (body, numDuplicates)) end end | _ => Error.bug "Polyvariance.loopExp.loopDecs: strange dec" in loopDecs decs end val _ = loopExp (body, 1) fun sort l = List.insertionSort (l, fn ((_, _, _, c), (_, _, _, c')) => c < c') val _ = Control.diagnostics (fn layout => List.foreach (sort (!costs), fn (x, size, numOcc, c) => layout (let open Layout in seq [Var.layout x, str " ", Int.layout size, str " ", Int.layout numOcc, str " ", Int.layout c] end))) in fn x => case varInfo x of NONE => false | SOME {shouldDuplicate, ...} => !shouldDuplicate end fun transform (program as Program.T {datatypes, body}, hofo: bool, small: int, product: int) = let val shouldDuplicate = shouldDuplicate (program, hofo, small, product) datatype info = Replace of Var.t | Dup of { duplicates: Var.t list ref } val {get = varInfo: Var.t -> info, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initRaise ("Polyvariance.info", Var.layout)) fun loopVar (x: VarExp.t): VarExp.t = VarExp.mono (let val x = VarExp.var x in case varInfo x of Replace y => y | Dup {duplicates, ...} => let val x' = Var.new x in List.push (duplicates, x') ; x' end end) fun loopVars xs = Vector.map (xs, loopVar) fun bind (x: Var.t): Var.t = let val x' = Var.new x in setVarInfo (x, Replace x') ; x' end fun bindVarType (x, t) = (bind x, t) fun bindPat (Pat.T {con, targs, arg}) = Pat.T {con = con, targs = targs, arg = Option.map (arg, bindVarType)} fun new {lambda = _, ty = _, var}: unit = if shouldDuplicate var then setVarInfo (var, Dup {duplicates = ref []}) else ignore (bind var) fun loopExp (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e in Exp.make (loopDecs (decs, result)) end and loopLambda (l: Lambda.t): Lambda.t = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = bind arg, argType = argType, body = loopExp body, mayInline = mayInline} end and loopDecs (ds: Dec.t list, result): {decs: Dec.t list, result: VarExp.t} = case ds of [] => {decs = [], result = loopVar result} | d :: ds => case d of MonoVal {var, ty, exp} => (case exp of Lambda l => let val _ = new {var = var, ty = ty, lambda = l} val {decs, result} = loopDecs (ds, result) val decs = case varInfo var of Replace var => MonoVal {var = var, ty = ty, exp = Lambda (loopLambda l)} :: decs | Dup {duplicates, ...} => List.fold (!duplicates, decs, fn (var, decs) => MonoVal {var = var, ty = ty, exp = Lambda (loopLambda l)} :: decs) in {decs = decs, result = result} end | _ => let val exp = case exp of App {func, arg} => App {func = loopVar func, arg = loopVar arg} | Case {test, cases, default} => let datatype z = datatype Cases.t val cases = case cases of Con cases => Con (Vector.map (cases, fn (p, e) => (bindPat p, loopExp e))) | Word (s, v) => Word (s, (Vector.map (v, fn (z, e) => (z, loopExp e)))) in Case {test = loopVar test, cases = cases, default = Option.map (default, loopExp)} end | ConApp {con, targs, arg} => ConApp {con = con, targs = targs, arg = Option.map (arg, loopVar)} | Const _ => exp | Handle {try, catch, handler} => Handle {try = loopExp try, catch = bindVarType catch, handler = loopExp handler} | Lambda _ => Error.bug "Polyvariance.loopDecs: unexpected Lambda" | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = targs, args = loopVars args} | Profile _ => exp | Raise {exn, extend} => Raise {exn = loopVar exn, extend = extend} | Select {tuple, offset} => Select {tuple = loopVar tuple, offset = offset} | Tuple xs => Tuple (loopVars xs) | Var x => Var (loopVar x) val var = bind var val {decs, result} = loopDecs (ds, result) in {decs = (MonoVal {var = var, ty = ty, exp = exp} :: decs), result = result} end) | Fun {decs, ...} => let val _ = Vector.foreach (decs, new) val {decs = ds, result} = loopDecs (ds, result) val ac = ref [Vector.keepAllMap (decs, fn {var, ty, lambda} => case varInfo var of Replace var => SOME {var = var, ty = ty, lambda = loopLambda lambda} | Dup _ => NONE)] val dups = Vector.keepAllMap (decs, fn dec as {var, ...} => case varInfo var of Replace _ => NONE | Dup {duplicates, ...} => SOME (dec, !duplicates)) val _ = Vector.foreach (dups, fn ({var, ...}, duplicates) => List.foreach (duplicates, fn var' => let val vars = Vector.map (dups, fn ({var = var'', ...}, _) => if Var.equals (var, var'') then (setVarInfo (var, Replace var') ; var') else bind var'') in List.push (ac, Vector.map2 (dups, vars, fn (({ty, lambda, ...}, _), var) => {var = var, ty = ty, lambda = loopLambda lambda})) end)) val decs = Vector.concat (!ac) in {decs = Fun {tyvars = Vector.new0 (), decs = decs} :: ds, result = result} end | _ => Error.bug "Polyvariance.loopDecs: saw bogus dec" val body = loopExp body val program = Program.T {datatypes = datatypes, body = body} val _ = Program.clear program in program end val transform = fn p => case !Control.polyvariance of NONE => p | SOME {hofo, rounds, small, product} => let fun loop (p, n) = if n = rounds then p else let val p = Control.simplifyPass {arg = p, doit = fn p => (Control.diagnostics (fn layout => layout (let open Layout in seq [str "duplicate", Int.layout (n+1), str ":"] end)) ; shrink (transform (p, hofo, small, product))), execute = true, keepIL = false, name = concat ["duplicate", Int.toString (n + 1)], stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} in loop (p, n + 1) end in loop (p, 0) end end mlton-20210117+dfsg/mlton/xml/scc-funs.fun000066400000000000000000000130131416264345000202100ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SccFuns (S: SCC_FUNS_STRUCTS): SCC_FUNS = struct open S open Dec PrimExp structure Graph = DirectedGraph structure Node = Graph.Node fun sccFuns (Program.T {datatypes, body}) = let (* For each function appearing in a fun dec record its node, which will * have edges to the nodes of other functions declared in the same dec * if they appear in its body. *) val {get = funInfo: Var.t -> { node: unit Node.t, visit: (unit -> unit) ref } option, set = setFunInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) val {get = nodeLambda, set = setNodeLambda, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("lambda", Node.layout)) fun loopVar x = case funInfo x of NONE => () | SOME {visit, ...} => !visit () val loopVarExp = loopVar o VarExp.var fun loopVarExps xs = Vector.foreach (xs, loopVarExp) fun loopLambda (l: Lambda.t): Lambda.t = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loopExp body, mayInline = mayInline} end and loopPrimExp (e: PrimExp.t): PrimExp.t = case e of App {func, arg} => (loopVarExp func; loopVarExp arg; e) | Case {test, cases, default} => (loopVarExp test ; Case {cases = Cases.map (cases, loopExp), default = Option.map (default, loopExp), test = test}) | ConApp {arg, ...} => (Option.app (arg, loopVarExp); e) | Const _ => e | Handle {try, catch, handler} => Handle {try = loopExp try, catch = catch, handler = loopExp handler} | Lambda l => Lambda (loopLambda l) | PrimApp {args, ...} => (loopVarExps args; e) | Profile _ => e | Raise {exn, ...} => (loopVarExp exn; e) | Select {tuple, ...} => (loopVarExp tuple; e) | Tuple xs => (loopVarExps xs; e) | Var x => (loopVarExp x; e) and loopExp (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.rev (List.fold (decs, [], fn (dec, decs) => case dec of MonoVal {var, ty, exp} => MonoVal {var = var, ty = ty, exp = loopPrimExp exp} :: decs | PolyVal {var, tyvars, ty, exp} => PolyVal {var = var, tyvars = tyvars, ty = ty, exp = loopExp exp} :: decs | Exception _ => dec :: decs | Fun {tyvars, decs = lambdas} => let val g = Graph.new () val _ = Vector.foreach (lambdas, fn {var, ...} => setFunInfo (var, SOME {node = Graph.newNode g, visit = ref ignore})) val _ = Vector.foreach (lambdas, fn {var, ty, lambda} => let val {node = from, ...} = valOf (funInfo var) in Vector.foreach (lambdas, fn {var = x, ...} => let val {visit, node = to} = valOf (funInfo x) in visit := (fn () => let val _ = Graph.addEdge (g, {from = from, to = to}) in visit := ignore end) end) ; (setNodeLambda (from, {var = var, ty = ty, lambda = loopLambda lambda})) ; (Vector.foreach (lambdas, fn {var, ...} => let val {visit, ...} = valOf (funInfo var) in visit := ignore end)) end) in List.map (Graph.stronglyConnectedComponents g, fn nodes => Fun {tyvars = tyvars, decs = Vector.fromListMap (nodes, nodeLambda)}) @ decs end)) val _ = loopVarExp result in Exp.make {decs = decs, result = result} end in Program.T {datatypes = datatypes, body = loopExp body} end end mlton-20210117+dfsg/mlton/xml/scc-funs.sig000066400000000000000000000010201416264345000201750ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* Compute strongly connected components on fun decs to make them * as small as possible. *) signature SCC_FUNS_STRUCTS = sig include TYPE_CHECK end signature SCC_FUNS = sig include SCC_FUNS_STRUCTS val sccFuns: Program.t -> Program.t end mlton-20210117+dfsg/mlton/xml/shrink.fun000066400000000000000000000633121416264345000177740ustar00rootroot00000000000000(* Copyright (C) 2009,2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* This simplifier is based on the following article. * Shrinking Lambda Expressions in Linear Time. * Journal of Functional Programming. Vol 7, no 5, 1997. *) functor Shrink (S: SHRINK_STRUCTS): SHRINK = struct open S open Dec PrimExp val tracePrimApplyInfo = Trace.info "Xml.Shrink.Prim.apply" val traceShrinkExp = Trace.trace ("Xml.Shrink.shrinkExp", Exp.layout, Exp.layout) val traceShrinkLambda = Trace.trace ("Xml.Shrink.shrinkLambda", Lambda.layout, Lambda.layout) fun inc (r: int ref, n) = let val n = !r + n in Assert.assert ("Xml.Shrink.inc", fn () => n >= 0) ; r := n end structure VarInfo = struct datatype t = Mono of monoVarInfo | Poly of VarExp.t and value = ConApp of {con: Con.t, targs: Type.t vector, arg: t option} | Const of Const.t | Lambda of {isInlined: bool ref, lam: Lambda.t} | Tuple of t vector withtype monoVarInfo = {numOccurrences: int ref, value: value option ref, varExp: VarExp.t} local open Layout in val rec layout = fn Mono {numOccurrences, value, varExp} => record [("numOccurrences", Int.layout (!numOccurrences)), ("value", Option.layout layoutValue (!value)), ("varExp", VarExp.layout varExp)] | Poly x => seq [str "Poly ", VarExp.layout x] and layoutValue = fn ConApp {con, arg, ...} => seq [Con.layout con, case arg of NONE => empty | SOME i => paren (layout i)] | Const c => Const.layout c | Lambda {isInlined, ...} => seq [str "Lambda ", Bool.layout (!isInlined)] | Tuple is => Vector.layout layout is end val inc = fn (i, n) => case i of Mono {numOccurrences = r, ...} => inc (r, n) | Poly _ => () val inc = Trace.trace2 ("Xml.Shrink.VarInfo.inc", layout, Int.layout, Unit.layout) inc fun inc1 i = inc (i, 1) val inc1 = Trace.trace ("Xml.Shrink.VarInfo.inc1", layout, Unit.layout) inc1 fun delete i = inc (i, ~1) val delete = Trace.trace ("Xml.Shrink.VarInfo.delete", layout, Unit.layout) delete fun deletes is = Vector.foreach (is, delete) val varExp = fn Mono {varExp, ...} => varExp | Poly x => x fun equals (vi1, vi2) = VarExp.equals (varExp vi1, varExp vi2) end structure InternalVarInfo = struct datatype t = VarInfo of VarInfo.t | Self val layout = fn VarInfo i => VarInfo.layout i | Self => Layout.str "self" end structure MonoVarInfo = struct type t = VarInfo.monoVarInfo end structure Value = struct datatype t = datatype VarInfo.value fun toPrimExp v = case v of ConApp {con, targs, arg} => PrimExp.ConApp {con = con, targs = targs, arg = Option.map (arg, VarInfo.varExp)} | Const c => PrimExp.Const c | Lambda {lam, ...} => PrimExp.Lambda lam | Tuple vs => PrimExp.Tuple (Vector.map (vs, VarInfo.varExp)) end fun shrinkOnce (Program.T {datatypes, body}) = let (* Keep track of the number of constuctors in each datatype so that * we can eliminate redundant defaults. *) val {get = conNumCons: Con.t -> int , set = setConNumCons, ...} = Property.getSetOnce (Con.plist, Property.initConst ~1) val _ = Vector.foreach (datatypes, fn {cons, ...} => let val n = Vector.length cons in Vector.foreach (cons, fn {con, ...} => setConNumCons (con, n)) end) fun isExhaustive (cases: (Pat.t, exp) Cases.t): bool = case cases of Cases.Con v => (0 < Vector.length v andalso (Vector.length v = conNumCons (Pat.con (#1 (Vector.first v))))) | _ => false val {get = varInfo: Var.t -> InternalVarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initRaise ("shrink varInfo", Var.layout)) val setVarInfo = Trace.trace2 ("Xml.Shrink.setVarInfo", Var.layout, InternalVarInfo.layout, Unit.layout) setVarInfo val varInfo = Trace.trace ("Xml.Shrink.varInfo", Var.layout, InternalVarInfo.layout) varInfo fun monoVarInfo x = case varInfo x of InternalVarInfo.VarInfo (VarInfo.Mono i) => i | _ => Error.bug "Xml.Shrink.monoVarInfo" fun varExpInfo (x as VarExp.T {var, ...}): VarInfo.t = case varInfo var of InternalVarInfo.Self => VarInfo.Poly x | InternalVarInfo.VarInfo i => i val varExpInfo = Trace.trace ("Xml.Shrink.varExpInfo", VarExp.layout, VarInfo.layout) varExpInfo fun varExpInfos xs = Vector.map (xs, varExpInfo) fun replaceInfo (x: Var.t, {numOccurrences = r, ...}: MonoVarInfo.t, i: VarInfo.t): unit = (VarInfo.inc (i, !r) ; setVarInfo (x, InternalVarInfo.VarInfo i)) val replaceInfo = Trace.trace ("Xml.Shrink.replaceInfo", fn (x, _, i) => Layout.tuple [Var.layout x, VarInfo.layout i], Unit.layout) replaceInfo fun replace (x, i) = replaceInfo (x, monoVarInfo x, i) val shrinkVarExp = VarInfo.varExp o varExpInfo local fun handleBoundVar (x, ts, _) = setVarInfo (x, if Vector.isEmpty ts then (InternalVarInfo.VarInfo (VarInfo.Mono {numOccurrences = ref 0, value = ref NONE, varExp = VarExp.mono x})) else InternalVarInfo.Self) fun handleVarExp x = VarInfo.inc1 (varExpInfo x) in fun countExp (e: Exp.t): unit = Exp.foreach {exp = e, handleBoundVar = handleBoundVar, handleExp = fn _ => (), handlePrimExp = fn _ => (), handleVarExp = handleVarExp} end fun deleteVarExp (x: VarExp.t): unit = VarInfo.delete (varExpInfo x) fun deleteExp (e: Exp.t): unit = Exp.foreachVarExp (e, deleteVarExp) val deleteExp = Trace.trace ("Xml.Shrink.deleteExp", Exp.layout, Unit.layout) deleteExp fun deleteLambda l = deleteExp (Lambda.body l) fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.Poly _ => Prim.ApplyArg.Var vi | VarInfo.Mono {value, ...} => (case !value of SOME (Value.ConApp {con, arg, ...}) => if isSome arg then Prim.ApplyArg.Var vi else Prim.ApplyArg.Con {con = con, hasArg = false} | SOME (Value.Const c) => Prim.ApplyArg.Const c | _ => Prim.ApplyArg.Var vi)) in Trace.traceInfo' (tracePrimApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (VarExp.layout o VarInfo.varExp)) args] end, Prim.ApplyResult.layout (VarExp.layout o VarInfo.varExp)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (*---------------------------------------------------*) (* shrinkExp *) (*---------------------------------------------------*) fun shrinkExp arg: Exp.t = traceShrinkExp (fn (e: Exp.t) => let val {decs, result} = Exp.dest e in Exp.make {decs = shrinkDecs decs, result = shrinkVarExp result} end) arg and shrinkDecs (decs: Dec.t list): Dec.t list = case decs of [] => [] | dec :: decs => case dec of Exception _ => dec :: shrinkDecs decs | PolyVal {var, tyvars, ty, exp} => Dec.PolyVal {var = var, tyvars = tyvars, ty = ty, exp = shrinkExp exp} :: shrinkDecs decs | Fun {tyvars, decs = decs'} => if Vector.isEmpty tyvars then let val decs' = Vector.keepAll (decs', fn {lambda, var, ...} => let val {numOccurrences, value, ...} = monoVarInfo var in if 0 = !numOccurrences then (deleteLambda lambda; false) else (value := (SOME (Value.Lambda {isInlined = ref false, lam = lambda})) ; true) end) val decs = shrinkDecs decs (* Need to walk over all the decs and remove * their value before shrinking any of them * because they are mutually recursive. *) val decs' = Vector.keepAll (decs', fn {var, lambda, ...} => let val {numOccurrences, value, ...} = monoVarInfo var in case !value of SOME (Value.Lambda {isInlined, ...}) => not (!isInlined) andalso if 0 = !numOccurrences then (deleteLambda lambda ; false) else (value := NONE; true) | _ => Error.bug "Xml.Shrink.shrinkDecs: should be a lambda" end) in if Vector.isEmpty decs' then decs else Dec.Fun {tyvars = tyvars, decs = Vector.map (decs', fn {var, ty, lambda} => {var = var, ty = ty, lambda = shrinkLambda lambda})} :: decs end else Dec.Fun {tyvars = tyvars, decs = Vector.map (decs', fn {var, ty, lambda} => {var = var, ty = ty, lambda = shrinkLambda lambda})} :: shrinkDecs decs | MonoVal b => shrinkMonoVal (b, fn () => shrinkDecs decs) and shrinkMonoVal ({var, ty, exp}, rest: unit -> Dec.t list) = let val info as {numOccurrences, value, ...} = monoVarInfo var fun finish (exp, decs) = MonoVal {var = var, ty = ty, exp = exp} :: decs fun nonExpansive (delete: unit -> unit, set: unit -> (unit -> PrimExp.t) option) = if 0 = !numOccurrences then (delete (); rest ()) else let val s = set () val decs = rest () in if 0 = !numOccurrences then (delete (); decs) else (case s of NONE => decs | SOME mk => finish (mk (), decs)) end fun expansive (e: PrimExp.t) = finish (e, rest ()) fun nonExpansiveValue (delete, v: Value.t) = nonExpansive (delete, fn () => (value := SOME v ; SOME (fn () => Value.toPrimExp v))) fun expression (e: Exp.t): Dec.t list = let val {decs = decs', result} = Exp.dest (shrinkExp e) val _ = replaceInfo (var, info, varExpInfo result) val decs = rest () in decs' @ decs end in case exp of App {func, arg} => let val arg = varExpInfo arg fun normal func = expansive (App {func = func, arg = VarInfo.varExp arg}) in case varExpInfo func of VarInfo.Poly x => normal x | VarInfo.Mono {numOccurrences, value, varExp, ...} => case (!numOccurrences, !value) of (1, SOME (Value.Lambda {isInlined, lam = l})) => if not (Lambda.mayInline l) then normal varExp else let val {arg = form, body, ...} = Lambda.dest l in VarInfo.delete arg ; replace (form, arg) ; isInlined := true ; numOccurrences := 0 ; expression body end | _ => normal varExp end | Case {test, cases, default} => let fun match (cases, f): Dec.t list = let val _ = deleteVarExp test fun step (i, (c, e), ()) = if f c then (Vector.foreachR (cases, i + 1, Vector.length cases, deleteExp o #2) ; Option.app (default, deleteExp) ; Vector.Done (expression e)) else (deleteExp e; Vector.Continue ()) fun done () = case default of SOME e => expression e | NONE => Error.bug "Xml.Shrink.shrinkMonoVal: Case, match" in Vector.fold' (cases, 0, (), step, done) end fun normal test = let (* Eliminate redundant default case. *) val default = if isExhaustive cases then (Option.app (default, deleteExp) ; NONE) else Option.map (default, shrinkExp) in expansive (Case {test = test, cases = Cases.map (cases, shrinkExp), default = default}) end in case varExpInfo test of VarInfo.Poly test => normal test | VarInfo.Mono {value, varExp, ...} => case (cases, !value) of (Cases.Con cases, SOME (Value.ConApp {con = c, arg, ...})) => let val match = fn f => match (cases, fn Pat.T {con = c', arg, ...} => Con.equals (c, c') andalso f arg) in case arg of NONE => match Option.isNone | SOME v => match (fn SOME (x, _) => (replace (x, v); true) | _ => false) end | (_, SOME (Value.Const c)) => (case (cases, c) of (Cases.Word (_, l), Const.Word w) => match (l, fn w' => WordX.equals (w, w')) | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Case, strange case") | (_, NONE) => normal varExp | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Case, default" end | ConApp {con, targs, arg} => let val arg = Option.map (arg, varExpInfo) in nonExpansiveValue (fn () => Option.app (arg, VarInfo.delete), Value.ConApp {con = con, targs = targs, arg = arg}) end | Const c => nonExpansiveValue (fn () => (), Value.Const c) | Handle {try, catch as (catchVar, _), handler} => let val handler = shrinkExp handler fun doit () = expansive (Handle {try = shrinkExp try, catch = catch, handler = handler}) in case Exp.dest handler of {decs = [MonoVal {var = raiseVar, exp = Raise {exn = exnVar, ...}, ...}], result = resultVar} => if VarExp.equals (VarExp.mono catchVar, exnVar) andalso VarExp.equals (VarExp.mono raiseVar, resultVar) then expression try else doit () | _ => doit () end | Lambda l => let val isInlined = ref false in nonExpansive (fn () => if !isInlined then () else deleteLambda l, fn () => (value := SOME (Value.Lambda {isInlined = isInlined, lam = l}) ; SOME (fn () => Lambda (shrinkLambda l)))) end | PrimApp {prim, args, targs} => let val args = varExpInfos args fun doit {prim, targs, args} = let fun make () = PrimApp {prim = prim, targs = targs, args = Vector.map (args, VarInfo.varExp)} in if Prim.maySideEffect prim then expansive (make ()) else nonExpansive (fn () => VarInfo.deletes args, fn () => SOME make) end fun default () = doit {prim = prim, targs = targs, args = args} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args') => let val args' = Vector.fromList args' val {no = unused, ...} = Vector.partition (args, fn arg => Vector.exists (args', fn arg' => VarInfo.equals (arg, arg'))) val _ = VarInfo.deletes unused in doit {prim = prim, targs = targs, args = args'} end | Bool b => let val _ = VarInfo.deletes args in nonExpansiveValue (fn () => (), Value.ConApp {con = Con.fromBool b, targs = Vector.new0 (), arg = NONE}) end | Const c => let val _ = VarInfo.deletes args in nonExpansiveValue (fn () => (), Value.Const c) end | Var x => let val _ = Vector.foreach (args, fn arg => if VarInfo.equals (arg, x) then () else VarInfo.delete arg) in replaceInfo (var, info, x) ; VarInfo.delete x ; rest () end | _ => default () end | Profile _ => expansive exp | Raise {exn, extend} => expansive (Raise {exn = shrinkVarExp exn, extend = extend}) | Select {tuple, offset} => let fun normal x = Select {tuple = x, offset = offset} in case varExpInfo tuple of VarInfo.Poly x => finish (normal x, rest ()) | VarInfo.Mono {numOccurrences, value, varExp, ...} => nonExpansive (fn () => inc (numOccurrences, ~1), fn () => case !value of NONE => SOME (fn () => normal varExp) | SOME (Value.Tuple vs) => (inc (numOccurrences, ~1) ; replaceInfo (var, info, Vector.sub (vs, offset)) ; NONE) | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Select") end | Tuple xs => let val xs = varExpInfos xs in nonExpansiveValue (fn () => VarInfo.deletes xs, Value.Tuple xs) end | Var x => let val x = varExpInfo x in replaceInfo (var, info, x) ; VarInfo.delete x ; rest () end end and shrinkLambda l: Lambda.t = traceShrinkLambda (fn l => let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = shrinkExp body, mayInline = mayInline} end) l val _ = countExp body val body = shrinkExp body val _ = Exp.clear body val _ = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, Con.clear o #con)) in Program.T {datatypes = datatypes, body = body} end val shrinkOnce = Trace.trace ("Xml.Shrink.shrinkOnce", Program.layout, Program.layout) shrinkOnce val shrink = shrinkOnce o shrinkOnce structure SccFuns = SccFuns (S) val shrink = shrink o SccFuns.sccFuns val shrink = Trace.trace ("Xml.Shrink.shrink", Program.layout, Program.layout) shrink end mlton-20210117+dfsg/mlton/xml/shrink.sig000066400000000000000000000006501416264345000177620ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SHRINK_STRUCTS = sig include TYPE_CHECK end signature SHRINK = sig include SHRINK_STRUCTS val shrink: Program.t -> Program.t end mlton-20210117+dfsg/mlton/xml/simplify-types.fun000066400000000000000000000272271416264345000215010ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SimplifyTypes (S: SIMPLIFY_TYPES_STRUCTS): SIMPLIFY_TYPES = struct open S structure I = Input structure O = Output open I.Atoms structure PowerSetLat = struct datatype t = T of {isIn: bool ref, whenIn: (unit -> unit) list ref} vector fun isIn (T v, i) = ! (#isIn (Vector.sub (v, i))) fun new (size: int) = T (Vector.tabulate (size, fn _ => {isIn = ref false, whenIn = ref []})) fun add (T v, i) = let val {isIn, whenIn, ...} = Vector.sub (v, i) in if !isIn then () else (isIn := true ; List.foreach (!whenIn, fn f => f ())) end fun whenIn (T v, i, f) = let val {isIn, whenIn, ...} = Vector.sub (v, i) in if !isIn then f () else List.push (whenIn, f) end end fun simplifyTypes (I.Program.T {body, datatypes}) = let val {get = tyconInfo: Tycon.t -> {used: PowerSetLat.t} option, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) val _ = Vector.foreach (datatypes, fn {tycon, tyvars, ...} => setTyconInfo (tycon, SOME {used = PowerSetLat.new (Vector.length tyvars)})) val _ = Vector.foreach (datatypes, fn {cons, tycon, tyvars} => let val {get = tyvarIndex, set = setTyvarIndex, rem, ...} = Property.getSet (Tyvar.plist, Property.initRaise ("index", Tyvar.layout)) val _ = Vector.foreachi (tyvars, fn (i, a) => setTyvarIndex (a, i)) val {used, ...} = valOf (tyconInfo tycon) val {destroy, hom} = I.Type.makeHom {con = (fn (_, tc, ts) => fn () => case tyconInfo tc of NONE => Vector.foreach (ts, fn t => t ()) | SOME {used, ...} => Vector.foreachi (ts, fn (i, t) => PowerSetLat.whenIn (used, i, t))), var = (fn (_, a) => let val i = tyvarIndex a in fn () => PowerSetLat.add (used, i) end)} val _ = Vector.foreach (cons, fn {arg, ...} => case arg of NONE => () | SOME t => hom t ()) val _ = Vector.foreach (tyvars, rem) val _ = destroy () in () end) val {get = tyconKeep: Tycon.t -> bool vector option, set = setTyconKeep, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) val {get = conKeep: Con.t -> bool vector option, set = setConKeep, ...} = Property.getSetOnce (Con.plist, Property.initConst NONE) val _ = Vector.foreach (datatypes, fn {cons, tycon, tyvars} => let val {used, ...} = valOf (tyconInfo tycon) val v = Vector.tabulate (Vector.length tyvars, fn i => PowerSetLat.isIn (used, i)) val _ = Vector.foreach (cons, fn {con, ...} => setConKeep (con, SOME v)) val u = if Vector.forall (v, fn b => b) then NONE else SOME v val _ = setTyconKeep (tycon, u) in () end) fun keep (v: 'a vector, bv: bool vector): 'a vector = Vector.keepAllMapi (v, fn (i, a) => if Vector.sub (bv, i) then SOME a else NONE) val {get = tyvarIsUsed: Tyvar.t -> bool ref, ...} = Property.get (Tyvar.plist, Property.initFun (fn _ => ref false)) (* There is some mesiness with promises here for two reasons: * 1. The thunk is to make sure that even though we are using a type * homomorphism, a type variable is only marked as used if it appears * in the output. * 2. The promise is do avoid computing the same output multiple times. * This is necessary because the type homomorphism only memoizes the * mapping from type to thunk, *not* the thunk's output. *) val {hom = fixType: I.Type.t -> unit -> O.Type.t, ...} = I.Type.makeHom {con = (fn (_, tc, ts) => Promise.lazy (fn () => let val ts = case tyconKeep tc of NONE => ts | SOME bv => keep (ts, bv) val ts = Vector.map (ts, fn t => t ()) in O.Type.con (tc, ts) end)), var = (fn (_, a) => Promise.lazy (fn () => (tyvarIsUsed a := true; O.Type.var a)))} val fixType = fn t => fixType t () val fixType = Trace.trace ("SimplifyTypes.fixType", I.Type.layout, O.Type.layout) fixType val tyvarIsUsed = ! o tyvarIsUsed val datatypes = Vector.map (datatypes, fn {cons, tycon, tyvars} => {cons = Vector.map (cons, fn {arg, con} => {arg = Option.map (arg, fixType), con = con}), tycon = tycon, tyvars = (case tyconKeep tycon of NONE => tyvars | SOME bv => keep (tyvars, bv))}) val {get = varKeep: Var.t -> bool vector option, set = setVarKeep, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun fixVarExp (I.VarExp.T {targs, var}): O.VarExp.t = let val targs = case varKeep var of NONE => targs | SOME bv => keep (targs, bv) in O.VarExp.T {targs = Vector.map (targs, fixType), var = var} end val fixVarExp = Trace.trace ("SimplifyTypes.fixVarExp", I.VarExp.layout, O.VarExp.layout) fixVarExp fun fixConTargs (con: Con.t, targs: I.Type.t vector): O.Type.t vector = let val targs = case conKeep con of NONE => targs | SOME bv => keep (targs, bv) in Vector.map (targs, fixType) end fun fixPat (I.Pat.T {arg, con, targs}): O.Pat.t = O.Pat.T {arg = Option.map (arg, fn (x, t) => (x, fixType t)), con = con, targs = fixConTargs (con, targs)} fun fixDec (d: I.Dec.t): O.Dec.t = case d of I.Dec.Exception {arg, con} => O.Dec.Exception {arg = Option.map (arg, fixType), con = con} | I.Dec.Fun {decs, tyvars} => let val decs = Vector.map (decs, fn {lambda, ty, var} => {lambda = fixLambda lambda, ty = fixType ty, var = var}) val bv = Vector.map (tyvars, tyvarIsUsed) val tyvars = keep (tyvars, bv) val _ = Vector.foreach (decs, fn {var, ...} => setVarKeep (var, SOME bv)) in O.Dec.Fun {decs = decs, tyvars = tyvars} end | I.Dec.MonoVal {exp, ty, var} => O.Dec.MonoVal {exp = fixPrimExp exp, ty = fixType ty, var = var} | I.Dec.PolyVal {exp, ty, tyvars, var} => let val exp = fixExp exp val ty = fixType ty val bv = Vector.map (tyvars, tyvarIsUsed) val _ = setVarKeep (var, SOME bv) in O.Dec.PolyVal {exp = exp, ty = ty, tyvars = keep (tyvars, bv), var = var} end and fixExp (e: I.Exp.t): O.Exp.t = let val {decs, result} = I.Exp.dest e in O.Exp.make {decs = List.map (decs, fixDec), result = fixVarExp result} end and fixLambda (l: I.Lambda.t): O.Lambda.t = let val {arg, argType, body, mayInline} = I.Lambda.dest l in O.Lambda.make {arg = arg, argType = fixType argType, body = fixExp body, mayInline = mayInline} end and fixPrimExp (e: I.PrimExp.t): O.PrimExp.t = case e of I.PrimExp.App {arg, func} => O.PrimExp.App {arg = fixVarExp arg, func = fixVarExp func} | I.PrimExp.Case {cases, default, test} => let val cases = case cases of I.Cases.Con v => O.Cases.Con (Vector.map (v, fn (p, e) => (fixPat p, fixExp e))) | I.Cases.Word (s, v) => O.Cases.Word (s, Vector.map (v, fn (c, e) => (c, fixExp e))) in O.PrimExp.Case {cases = cases, default = Option.map (default, fixExp), test = fixVarExp test} end | I.PrimExp.ConApp {arg, con, targs} => O.PrimExp.ConApp {arg = Option.map (arg, fixVarExp), con = con, targs = fixConTargs (con, targs)} | I.PrimExp.Const c => O.PrimExp.Const c | I.PrimExp.Handle {catch = (x, t), handler, try} => O.PrimExp.Handle {catch = (x, fixType t), handler = fixExp handler, try = fixExp try} | I.PrimExp.Lambda l => O.PrimExp.Lambda (fixLambda l) | I.PrimExp.PrimApp {args, prim, targs} => O.PrimExp.PrimApp {args = Vector.map (args, fixVarExp), prim = Prim.map (prim, fixType), targs = Vector.map (targs, fixType)} | I.PrimExp.Profile e => O.PrimExp.Profile e | I.PrimExp.Raise {exn, extend} => O.PrimExp.Raise {exn = fixVarExp exn, extend = extend} | I.PrimExp.Select {offset, tuple} => O.PrimExp.Select {offset = offset, tuple = fixVarExp tuple} | I.PrimExp.Tuple xs => O.PrimExp.Tuple (Vector.map (xs, fixVarExp)) | I.PrimExp.Var x => O.PrimExp.Var (fixVarExp x) val body = fixExp body in O.Program.T {datatypes = datatypes, body = body} end end mlton-20210117+dfsg/mlton/xml/simplify-types.sig000066400000000000000000000011131416264345000214550ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY_TYPES_STRUCTS = sig structure Input: XML_TREE structure Output: XML_TREE sharing Input.Atoms = Output.Atoms end signature SIMPLIFY_TYPES = sig include SIMPLIFY_TYPES_STRUCTS val simplifyTypes: Input.Program.t -> Output.Program.t end mlton-20210117+dfsg/mlton/xml/sources.cm000066400000000000000000000015231416264345000177640ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) Library signature SXML signature XML signature XML_TYPE functor Monomorphise functor Sxml functor Xml is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm xml-type.sig xml-tree.sig xml-tree.fun type-check.sig type-check.fun shrink.sig shrink.fun xml-transform.sig scc-funs.sig scc-funs.fun simplify-types.sig simplify-types.fun xml-simplify.sig xml-simplify.fun xml.sig xml.fun sxml-exns.sig monomorphise.sig monomorphise.fun sxml-tree.sig implement-exceptions.fun implement-suffix.fun polyvariance.fun cps-transform.fun sxml-simplify.sig sxml-simplify.fun sxml.sig sxml.fun mlton-20210117+dfsg/mlton/xml/sources.mlb000066400000000000000000000016561416264345000201460ustar00rootroot00000000000000(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb xml-type.sig xml-tree.sig xml-tree.fun type-check.sig type-check.fun scc-funs.sig scc-funs.fun shrink.sig shrink.fun xml-transform.sig simplify-types.sig simplify-types.fun xml-simplify.sig xml-simplify.fun xml.sig xml.fun sxml-exns.sig monomorphise.sig monomorphise.fun sxml-tree.sig implement-exceptions.fun implement-suffix.fun polyvariance.fun cps-transform.fun sxml-simplify.sig sxml-simplify.fun sxml.sig sxml.fun in signature SXML signature XML functor Monomorphise functor Sxml functor Xml end mlton-20210117+dfsg/mlton/xml/sxml-exns.sig000066400000000000000000000007651416264345000204310ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SXML_EXNS = XML (* invariants: * no PolyVal decs * hasExns = true * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20210117+dfsg/mlton/xml/sxml-simplify.fun000066400000000000000000000142331416264345000213110ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor SxmlSimplify (S: SXML_SIMPLIFY_STRUCTS): SXML_SIMPLIFY = struct open S structure ImplementExceptions = ImplementExceptions (open S) structure ImplementSuffix = ImplementSuffix (open S) structure Polyvariance = Polyvariance (open S) (* structure Uncurry = Uncurry (open S) *) structure CPSTransform = CPSTransform (open S) fun polyvariance (hofo, rounds, small, product) p = Ref.fluidLet (Control.polyvariance, SOME {hofo = hofo, rounds = rounds, small = small, product = product}, fn () => Polyvariance.transform p) type pass = {name: string, doit: Program.t -> Program.t, execute: bool} val sxmlPassesDefault = {name = "sxmlShrink1", doit = S.shrink, execute = true} :: {name = "implementSuffix", doit = ImplementSuffix.transform, execute = true} :: {name = "sxmlShrink2", doit = S.shrink, execute = true} :: {name = "implementExceptions", doit = ImplementExceptions.transform, execute = true} :: {name = "sxmlShrink3", doit = S.shrink, execute = true} :: (* {name = "uncurry", doit = Uncurry.transform, execute = true} :: *) (* {name = "sxmlShrink4", doit = S.shrink, execute = true} :: *) {name = "polyvariance", doit = Polyvariance.transform, execute = true} :: {name = "sxmlShrink4", doit = S.shrink, execute = true} :: nil val sxmlPassesCpsTransform = sxmlPassesDefault @ {name = "cpsTransform", doit = CPSTransform.transform, execute = true} :: {name = "cpsSxmlShrink5", doit = S.shrink, execute = true} :: {name = "cpsPolyvariance", doit = Polyvariance.transform, execute = true} :: {name = "cpsSxmlShrink6", doit = S.shrink, execute = true} :: nil val sxmlPassesMinimal = {name = "implementSuffix", doit = ImplementSuffix.transform, execute = true} :: {name = "implementExceptions", doit = ImplementExceptions.transform, execute = true} :: nil val sxmlPasses : pass list ref = ref sxmlPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val next = Counter.generator 1 in fn s => if s = name then SOME {name = name ^ "#" ^ (Int.toString (next ())), doit = doit, execute = true} else NONE end val polyvariancePassGen = let val next = Counter.generator 1 fun nums s = if s = "" then SOME [] else if String.sub (s, 0) = #"(" andalso String.sub (s, String.size s - 1)= #")" then let val s = String.dropFirst (String.dropLast s) in case List.fold (String.split (s, #","), SOME [], fn (s,SOME nums) => (case Int.fromString s of SOME i => SOME (i::nums) | NONE => NONE) | (_, NONE) => NONE) of SOME (l as _::_) => SOME (List.rev l) | _ => NONE end else NONE in fn s => if String.hasPrefix (s, {prefix = "polyvariance"}) then let fun mk (hofo, rounds, small, product) = SOME {name = concat ["polyvariance(", Bool.toString hofo, ",", Int.toString rounds, ",", Int.toString small, ",", Int.toString product, ")#", Int.toString (next ())], doit = polyvariance (hofo, rounds, small, product), execute = true} val s = String.dropPrefix (s, String.size "polyvariance") in case nums s of SOME [] => mk (true, 2, 30, 300) | SOME [hofo, rounds, small, product] => mk (hofo <> 0, rounds, small, product) | _ => NONE end else NONE end val passGens = polyvariancePassGen :: (List.map([("sxmlShrink", S.shrink), ("implementExceptions", ImplementExceptions.transform), ("implementSuffix", ImplementSuffix.transform)], mkSimplePassGen)) in fun sxmlPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in sxmlPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end fun sxmlPassesSet s = case s of "default" => (sxmlPasses := sxmlPassesDefault ; Result.Yes ()) | "cpsTransform" => (sxmlPasses := sxmlPassesCpsTransform ; Result.Yes ()) | "minimal" => (sxmlPasses := sxmlPassesMinimal ; Result.Yes ()) | _ => sxmlPassesSetCustom s val _ = Control.OptimizationPasses.register {il = "sxml", set = sxmlPassesSet} fun simplify p = let val sxmlPasses = !sxmlPasses (* Always want to type check the initial and final SXML programs, * even if type checking is turned off, just to catch bugs. *) val () = Control.trace (Control.Pass, "sxmlTypeCheck") typeCheck p val p = Control.simplifyPasses {arg = p, passes = sxmlPasses, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} val () = Control.trace (Control.Pass, "sxmlTypeCheck") typeCheck p in p end end mlton-20210117+dfsg/mlton/xml/sxml-simplify.sig000066400000000000000000000010171416264345000212770ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SXML_SIMPLIFY_STRUCTS = sig include SXML_TREE val shrink: Program.t -> Program.t val typeCheck: Program.t -> unit end signature SXML_SIMPLIFY = sig include SXML_SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/xml/sxml-tree.sig000066400000000000000000000010321416264345000203770ustar00rootroot00000000000000(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SXML_TREE = XML_TREE (* invariants: * no Exception decs * no PolyVal decs * hasPrimExns = false * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20210117+dfsg/mlton/xml/sxml.fun000066400000000000000000000014561416264345000174620ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Sxml (S: SXML_STRUCTS): SXML = SxmlSimplify (struct open S structure Program = struct open Program val layoutStats = mkLayoutStats "sxml" val toFile = {display = #display toFile, style = #style toFile, suffix = "sxml"} end end) mlton-20210117+dfsg/mlton/xml/sxml.sig000066400000000000000000000011001416264345000174360ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature SXML_STRUCTS = sig include XML end signature SXML = XML (* invariants: * no Exception decs * no PolyVal decs * hasPrimExns = false * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20210117+dfsg/mlton/xml/type-check.fun000066400000000000000000000333271416264345000205350ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck (S: TYPE_CHECK_STRUCTS): TYPE_CHECK = struct open S open Dec PrimExp fun typeCheck (program as Program.T {datatypes, body}): unit = let (* tyvarInScope is used to ensure that tyvars never shadow themselves. *) val {get = tyvarInScope: Tyvar.t -> bool ref, ...} = Property.get (Tyvar.plist, Property.initFun (fn _ => ref false)) fun bindTyvars (vs: Tyvar.t vector): unit = Vector.foreach (vs, fn v => let val r = tyvarInScope v in if !r then Type.error ("tyvar already in scope", Tyvar.layout v) else r := true end) fun unbindTyvars (vs: Tyvar.t vector): unit = Vector.foreach (vs, fn v => tyvarInScope v := false) (* checkType makes sure all tyvars are bound. *) fun checkType (ty: Type.t): unit = Type.hom {ty = ty, con = fn _ => (), var = fn a => if !(tyvarInScope a) then () else Type.error ("tyvar not in scope", Tyvar.layout a)} fun checkTypes v = Vector.foreach (v, checkType) val {get = getCon: Con.t -> {tyvars: Tyvar.t vector, ty: Type.t}, set, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("scheme", Con.layout)) fun setCon ({con, arg}, tyvars, result: Type.t): unit = (checkType result ; set (con, {tyvars = tyvars, ty = (case arg of NONE => result | SOME ty => (checkType ty ; Type.arrow (ty, result)))})) fun checkConExp (c: Con.t, ts: Type.t vector): Type.t = let val _ = checkTypes ts val {tyvars, ty} = getCon c in Type.substitute (ty, Vector.zip (tyvars, ts)) end val {get = getVar: Var.t -> {tyvars: Tyvar.t vector, ty: Type.t}, set = setVar, ...} = Property.getSet (Var.plist, Property.initRaise ("var scheme", Var.layout)) val getVar = Trace.trace ("Xml.TypeCheck.getVar", Var.layout, fn {tyvars, ty} => Layout.record [("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)]) getVar val setVar = Trace.trace2 ("Xml.TypeCheck.setVar", Var.layout, fn {tyvars, ty} => Layout.record [("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)], Layout.ignore) setVar fun checkVarExp (VarExp.T {var, targs}): Type.t = let val _ = checkTypes targs val {tyvars, ty} = getVar var in if Vector.length targs = Vector.length tyvars then Type.substitute (ty, Vector.zip (tyvars, targs)) else Type.error ("variable applied to wrong number of type args", let open Layout in align [Var.layout var, seq [str "tyvars: ", Vector.layout Tyvar.layout tyvars], seq [str "targs: ", Vector.layout Type.layout targs]] end) end fun checkVarExps xs = Vector.map (xs, checkVarExp) fun checkPat (p as Pat.T {con, targs, arg}): Type.t = let val t = checkConExp (con, targs) in case (arg, Type.deArrowOpt t) of (NONE, NONE) => t | (SOME (x, ty), SOME (t1, t2)) => (checkType ty ; if Type.equals (t1, ty) then (setVar (x, {tyvars = Vector.new0 (), ty = t1}) ; t2) else (Type.error ("argument constraint of wrong type", let open Layout in align [seq [str "constructor expects : ", Type.layout t1], seq [str "but got: ", Type.layout ty], seq [str "p: ", Pat.layout p]] end))) | _ => Type.error ("constructor pattern mismatch", Pat.layout p) end val traceCheckExp = Trace.trace ("Xml.TypeCheck.checkExp", Exp.layout, Type.layout) val traceCheckPrimExp = Trace.trace2 ("Xml.TypeCheck.checkPrimExp", PrimExp.layout, Type.layout, Type.layout) val traceCheckLambda = Trace.trace ("Xml.TypeCheck.checkLambda", Lambda.layout, Type.layout) val traceCheckDec = Trace.trace ("Xml.TypeCheck.checkDec", Dec.layout, Unit.layout) local val exnType = ref NONE in fun isExnType t = case !exnType of NONE => (exnType := SOME t; true) | SOME t' => Type.equals (t, t') end fun check (t: Type.t, t': Type.t, layout: unit -> Layout.t): unit = if Type.equals (t, t') then () else Type.error ("type mismatch", Layout.align [Type.layout t, Type.layout t', layout ()]) fun checkExp arg: Type.t = traceCheckExp (fn (exp: Exp.t) => let val {decs, result} = Exp.dest exp in List.foreach (decs, checkDec) ; checkVarExp result end) arg and checkPrimExp arg: Type.t = traceCheckPrimExp (fn (e: PrimExp.t, ty: Type.t) => let fun error msg = Type.error (msg, let open Layout in seq [str "exp: ", PrimExp.layout e] end) fun checkApp (t1, x) = let val t2 = checkVarExp x in case Type.deArrowOpt t1 of NONE => error "function not of arrow type" | SOME (t2', t3) => if Type.equals (t2, t2') then t3 else Type.error ("actual and formal not of same type", let open Layout in align [seq [str "actual: ", Type.layout t2], seq [str "formal: ", Type.layout t2'], seq [str "expression: ", PrimExp.layout e]] end) end in case e of App {arg, func} => checkApp (checkVarExp func, arg) | Case {cases, default, test} => let val default = Option.map (default, checkExp) fun equalss v = if Vector.isEmpty v then Error.bug "Xml.TypeCheck.equalss" else let val t = Vector.first v in if Vector.forall (v, fn t' => Type.equals (t, t')) then SOME t else NONE end fun finish (ptys: Type.t vector, etys: Type.t vector): Type.t = case (equalss ptys, equalss etys) of (NONE, _) => error "patterns not of same type" | (_, NONE) => error "branches not of same type" | (SOME pty, SOME ety) => if Type.equals (checkVarExp test, pty) then case default of NONE => ety | SOME t => if Type.equals (ety, t) then ety else error "default of wrong type" else error "test and patterns of different types" datatype z = datatype Cases.t in case cases of Con cases => finish (Vector.unzip (Vector.map (cases, fn (p, e) => (checkPat p, checkExp e)))) | Word (s, cs) => finish (Vector.new1 (Type.word s), Vector.map (cs, fn (_, e) => checkExp e)) end | ConApp {con, targs, arg} => let val t = checkConExp (con, targs) in case arg of NONE => t | SOME e => checkApp (t, e) end | Const c => Type.ofConst c | Handle {try, catch = (catch, catchType), handler, ...} => let val _ = if isExnType catchType then () else error "handle with non-exn type for catch" val ty = checkExp try val _ = setVar (catch, {tyvars = Vector.new0 (), ty = catchType}) val ty' = checkExp handler in if Type.equals (ty, ty') then ty else error "bad handle" end | Lambda l => checkLambda l | PrimApp {args, prim, targs} => let val _ = checkTypes targs val () = if Type.checkPrimApp {args = checkVarExps args, prim = prim, result = ty, targs = targs} then () else error "bad primapp" in ty end | Profile _ => Type.unit | Raise {exn, ...} => if isExnType (checkVarExp exn) then ty else error "bad raise" | Select {tuple, offset} => (case Type.deTupleOpt (checkVarExp tuple) of NONE => error "selection from nontuple" | SOME ts => Vector.sub (ts, offset)) | Tuple xs => if 1 = Vector.length xs then error "unary tuple" else Type.tuple (checkVarExps xs) | Var x => checkVarExp x end) arg and checkLambda arg: Type.t = traceCheckLambda (fn (l: Lambda.t) => let val {arg, argType, body, ...} = Lambda.dest l val _ = checkType argType val _ = setVar (arg, {tyvars = Vector.new0 (), ty = argType}) in Type.arrow (argType, checkExp body) end) arg and checkDec arg: unit = traceCheckDec (fn (d: Dec.t) => let val check = fn (t, t') => check (t, t', fn () => Dec.layout d) in case d of Exception c => setCon (c, Vector.new0 (), Type.exn) | Fun {tyvars, decs} => (bindTyvars tyvars ; (Vector.foreach (decs, fn {ty, var, ...} => (checkType ty ; setVar (var, {tyvars = tyvars, ty = ty})))) ; Vector.foreach (decs, fn {ty, lambda, ...} => check (ty, checkLambda lambda)) ; unbindTyvars tyvars) | MonoVal {var, ty, exp} => (checkType ty ; check (ty, checkPrimExp (exp, ty)) ; setVar (var, {tyvars = Vector.new0 (), ty = ty})) | PolyVal {tyvars, var, ty, exp} => (bindTyvars tyvars ; checkType ty ; check (ty, checkExp exp) ; unbindTyvars tyvars ; setVar (var, {tyvars = tyvars, ty = ty})) end) arg val _ = Vector.foreach (datatypes, fn {tycon, tyvars, cons} => let val _ = bindTyvars tyvars val ty = Type.con (tycon, Vector.map (tyvars, Type.var)) val _ = Vector.foreach (cons, fn c => setCon (c, tyvars, ty)) val _ = unbindTyvars tyvars in () end) val _ = if Type.equals (checkExp body, Type.unit) then () else Error.bug "Xml.TypeCheck.typeCheck: program must be of type unit" val _ = Program.clear program in () end val typeCheck = Trace.trace ("Xml.TypeCheck.typeCheck", Program.layout, Unit.layout) typeCheck end mlton-20210117+dfsg/mlton/xml/type-check.sig000066400000000000000000000006671416264345000205300ustar00rootroot00000000000000(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK_STRUCTS = sig include XML_TREE end signature TYPE_CHECK = sig include TYPE_CHECK_STRUCTS val typeCheck: Program.t -> unit end mlton-20210117+dfsg/mlton/xml/uncurry.fun000066400000000000000000000605261416264345000202110ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Uncurry(S: XML_TRANSFORM_STRUCTS): XML_TRANSFORM = struct open S open Dec PrimExp fun transform (program as Program.T{datatypes, body, overflow}) = let datatype D = T of {var: Var.t, lambda : Lambda.t} val {get = getArity: Var.t -> int, set = setArity, ...} = Property.getSet(Var.plist, Property.initConst 0) val {get = curriedRep: Var.t -> {unCurriedFun: D, curriedFun: D} option, set = setCurriedRep, ...} = Property.getSet(Var.plist, Property.initConst NONE) val {get = getType: Var.t -> {args: Type.t vector, result: Type.t}, set = setType, ...} = Property.getSet(Var.plist, Property.initConst {args = Vector.new1 Type.unit, result = Type.unit}) fun getResultType(exp) = let val {decs,result} = Exp.dest(exp) in List.fold (decs, Type.unit, fn (d, i) => case d of MonoVal {var, ty, exp} => if Var.equals(var,VarExp.var(result)) then ty else i | Fun {tyvars, decs} => Vector.fold (decs, Type.unit, fn ({var,ty,lambda}, i) => if Var.equals(var,VarExp.var(result)) then ty else i) | _ => i) end fun buildLambda(f,args,types,resultType) = let val newArg' = Var.newString("c") val newArg'' = Var.newString("c") in Lambda.new {arg = Vector.last(args), argType = Vector.last(types), body = Vector.fold2 (Vector.tabulate(Vector.length args - 2, fn i => Vector.sub(args, i + 1)), Vector.tabulate(Vector.length types - 2, fn i => Vector.sub(types, i + 1)), let val newVar = Var.newString("c") val arg = Vector.sub(args,0) val argType = Vector.sub(types,0) val decs = [MonoVal {var = newVar, ty = Type.arrow(argType,resultType), exp = Lambda (Lambda.new {arg = arg, argType = argType, body = Exp.new {decs = [MonoVal {var = newArg', ty = Type.tuple(Vector.rev(types)), exp = Tuple(Vector.map (Vector.rev(args), fn a => VarExp.mono(a)))}, MonoVal {var = newArg'', ty = resultType, exp = App {func = f, arg = VarExp.mono(newArg')}}], result = VarExp.mono(newArg'')}})}] val result = VarExp.mono(newVar) in Exp.new {decs = decs, result = result} end, fn (a, atype, i) => let val newVar = Var.newString("c") in Exp.new {decs = [MonoVal {var = newVar, ty = Type.arrow(atype, getResultType(i)), exp = Lambda(Lambda.new {arg = a, argType = atype, body = i})}], result = VarExp.mono(newVar)} end)} end fun uncurryFun(dec) = let fun lamExp(decs,result,args,types,newDecs,e) = case decs of [] => (args,types,e) | d::rest => case d of Dec.MonoVal{var, ty, exp = Const c} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Var v} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Select tuple} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Lambda l} => let val body = Lambda.body(l) val r = result val {decs,result} = Exp.dest(body) val newDecs = List.append(newDecs,decs) val new = Exp.new{decs = newDecs,result = result} in if Var.equals(var, VarExp.var(r)) andalso List.isEmpty(rest) then lamExp(newDecs, result, Lambda.arg(l)::args, Lambda.argType(l)::types, [], new) else (args,types,e) end | _ => (args,types,e) val lamExp = fn x => let val (args,types,e) = lamExp x in (Vector.fromList args, Vector.fromList types, e) end val T{var,lambda} = dec val (f, r) = let val arg = Lambda.arg(lambda) val argType = Lambda.argType(lambda) val body = Lambda.body(lambda) val {decs,result} = Exp.dest(body) in (var, lamExp(decs, result, [arg], [argType], [],body)) end fun buildCurried (f,args,types,e) = let val newVar = Var.newString("c") val newArg = Var.newString("c") val (newDecs,n) = Vector.fold2 (Vector.rev(args), Vector.rev(types), ([],0), fn (a, mtype, (l, i)) => (MonoVal {var = a, ty = mtype, exp = PrimExp.Select {tuple = VarExp.mono(newArg), offset = i}}::l, i+1)) val newExp = Exp.new {decs = List.append(newDecs, Exp.decs(e)), result = Exp.result(e)} val resultType = getResultType(newExp) val unCurriedFun = T{var = newVar, lambda = Lambda.new {arg = newArg, argType = Type.tuple(Vector.rev(types)), body = newExp}} val newArgs = Vector.map(args, fn z => Var.newString("c")) val newFun = buildLambda(VarExp.mono(newVar),newArgs,types,resultType) val newFunBinding = T{var = f, lambda = newFun} in setCurriedRep(f, SOME {unCurriedFun = unCurriedFun, curriedFun = newFunBinding}) end in case r of (args,types,e) => (setArity(f, Vector.length(args)); setType(f, {args = types, result = getResultType(e)}); if getArity(f) > 1 then buildCurried(f,args,types,e) else ()) end fun replaceVar(decs,old,new) = let fun compare(v) = if Var.equals(VarExp.var(v),old) then new else v fun replaceExp(e) = let val {decs,result} = Exp.dest(e) val newDecs = replaceVar(decs,old,new) val newResult = compare(result) in Exp.new {decs = newDecs, result = newResult} end in List.map (decs, fn d => (case d of MonoVal {var, ty, exp} => MonoVal {var=var, ty = ty, exp = (case exp of Var v => PrimExp.Var(compare(v)) | Tuple vs => Tuple(Vector.map(vs, fn v => compare(v))) | Select {tuple,offset} => Select {tuple = compare(tuple), offset = offset} | Lambda l => let val {arg,argType,body} = Lambda.dest(l) val {decs,result} = Exp.dest(body) val newDecs = replaceVar(decs,old,new) in Lambda (Lambda.new {arg=arg, argType=argType, body=Exp.new {decs = newDecs, result = result}}) end | ConApp {con,targs,arg} => (case arg of NONE => exp | SOME v => ConApp {con = con, targs = targs, arg = SOME (compare(v))}) | PrimApp {prim,targs,args} => PrimApp {prim = prim, targs = targs, args = Vector.map(args, fn a => compare(a))} | App {func,arg} => App {func = compare(func), arg = compare(arg)} | Raise {exn,filePos} => Raise {exn = compare(exn), filePos = filePos} | Case {test,cases,default} => Case {test=compare(test), cases = Cases.map (cases,fn e => replaceExp(e)), default = Option.map (default, fn (e,r) => (replaceExp e,r))} | Handle {try,catch,handler} => Handle {try = replaceExp(try), catch = catch, handler = replaceExp(handler)} | _ => exp)} | Fun {tyvars,decs} => Fun {tyvars=tyvars, decs = Vector.map (decs, fn {var,ty,lambda} => {var = var, ty = ty, lambda = let val {arg,argType,body} = Lambda.dest(lambda) in Lambda.new ({arg = arg, argType = argType, body = replaceExp(body)}) end})} | _ => d)) end fun uncurryApp(decs,expResult) = let fun makeUncurryApp(f,arguments,lastCall) = let val newArg = Var.newString("c") val newArg' = Var.newString("c") val varF = VarExp.var(f) val {args,result} = getType(varF) val var = (case curriedRep(varF) of NONE => Error.bug "Uncurry: uncurryApp" | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun in var end) val argDec = MonoVal{var = newArg, ty = Type.tuple(Vector.rev(args)), exp = Tuple(Vector.rev(arguments))} val appDec = MonoVal{var = newArg', ty = result, exp = App {func = VarExp.mono(var), arg = VarExp.mono(newArg)}} val newR = if Var.equals(lastCall, VarExp.var(expResult)) then (SOME newArg') else NONE in (appDec::[argDec],newR,newArg') end in case decs of [] => Error.bug "Uncurry: uncurryApp" | d::r => (case d of MonoVal {var, ty, exp = App {func,arg}} => (case curriedRep(VarExp.var(func)) of NONE => Error.bug "Uncurry: uncurryApp" | SOME _ => let val arity = getArity(VarExp.var(func)) fun loop(args,arity,d,f) = if arity = 0 then SOME (Vector.fromList args,d,f) else case d of [] => NONE | h::r => (case h of MonoVal {var,ty, exp = App {func,arg}} => if Var.equals(VarExp.var(func),f) then loop(arg::args, arity-1, r, var) else NONE | _ => NONE) in case loop([arg],arity-1,r,var) of NONE => ([d],r,NONE) | SOME (args,r,lastCall) => let val (newDecs,newR,newArg) = makeUncurryApp(func,args,lastCall) val r = (replaceVar(r,lastCall, VarExp.mono(newArg))) in (newDecs,r,newR) end end) | _ => Error.bug "Uncurry: uncurryApp") end fun singleUse(var,decs) = let fun compare(e) = (case e of App {func,arg} => Var.equals(VarExp.var(func),var) | _ => false) in List.fold (decs, false, fn (d,r) => case d of MonoVal {var,ty,exp} => compare(exp) | _ => false) end fun transform(body) = let val {decs,result} = Exp.dest(body) val newR = ref NONE in Exp.new {decs = List.rev (let fun loop(decs,newDecs) = case decs of [] => newDecs | d::rest => (case d of MonoVal {var,ty, exp = Lambda l} => (case curriedRep(var) of NONE => let val lamBody = Lambda.body(l) val arg = Lambda.arg(l) val argType = Lambda.argType(l) val newLam = Lambda.new{arg=arg, argType = argType, body = transform(lamBody)} val newDec = MonoVal{var=var, ty=ty, exp = Lambda newLam} in loop(rest,newDec::newDecs) end | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun val body = Lambda.body(lambda) val newBody = transform(body) val resultType = getResultType(newBody) val argType = Lambda.argType(lambda) val l = Lambda(Lambda.new {arg = Lambda.arg(lambda), argType = argType, body = newBody}) val b1 = MonoVal{var=var, ty = Type.arrow(argType,resultType), exp = l} val T{var,lambda} = curriedFun val argType = Lambda.argType(lambda) val resultType = getResultType(Lambda.body(lambda)) val b2 = MonoVal{var=var, ty = Type.arrow(argType, resultType), exp = Lambda lambda} in loop(rest,b2::(b1::newDecs)) end) | MonoVal {var,ty,exp = App {func,arg}} => (case curriedRep(VarExp.var(func)) of NONE => loop(rest,d::newDecs) | SOME _ => if singleUse(var,rest) then let val (appDecs,r,newResult) = uncurryApp(decs,result) in (newR := newResult; loop(r,List.append(appDecs,newDecs))) end else loop(rest,d::newDecs)) | MonoVal {var,ty,exp = Case {test,cases,default}} => let val newCases = Cases.map(cases, fn e => transform(e)) val default = Option.map (default, fn (e,r) => (transform(e),r)) in loop(rest, (MonoVal{var=var, ty=ty, exp = Case {test = test, cases = newCases, default = default}}:: newDecs)) end | MonoVal {var,ty, exp = Handle {try,catch,handler}} => loop(rest, (MonoVal{var=var, ty=ty, exp = Handle {try = transform(try), catch = catch, handler = transform(handler)}}:: newDecs)) | Fun {tyvars,decs} => loop(rest, Fun {tyvars = Vector.new0 (), decs = Vector.fromList( Vector.fold (decs, []:{var:Var.t, ty:Type.t, lambda:Lambda.t} list, fn (d as {var, ty, lambda:Lambda.t}, acc) => (case curriedRep(var) of NONE => let val body = Lambda.body(lambda) val arg = Lambda.arg(lambda) val argType = Lambda.argType(lambda) val newBody = transform(body) val newLam = Lambda.new{arg = arg, argType = argType, body = newBody} in {var=var, ty=ty, lambda=newLam}::acc end | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun val body = Lambda.body(lambda) val newBody = transform(body) val argType = Lambda.argType(lambda) val resultType = getResultType(newBody) val b1 = {var=var, ty = Type.arrow(argType,resultType), lambda = Lambda.new{arg = Lambda.arg(lambda), argType = argType, body = newBody}} val T{var,lambda} = curriedFun val argType = Lambda.argType(lambda) val newBody = transform(Lambda.body(lambda)) val resultType = getResultType(newBody) val b2 = {var=var, ty = Type.arrow(argType,resultType), lambda = lambda} in b1::(b2::acc) end)))}::newDecs) | _ => loop(rest,d::newDecs)) in loop(decs,[]) end), result = (case !newR of NONE => result | SOME r => VarExp.mono(r))} end in Exp.foreachExp (body, fn e => let val {decs,result} = Exp.dest(e) in List.foreach (decs, fn d => case d of MonoVal {var,ty,exp = Lambda l} => uncurryFun(T{var=var,lambda=l}) | Fun {tyvars,decs} => Vector.foreach (decs, fn {var,ty,lambda} => uncurryFun(T{var=var,lambda=lambda})) | _ => ()) end); let val newBody = transform(body) in Program.T{datatypes = datatypes, body = newBody, overflow = overflow} end end end mlton-20210117+dfsg/mlton/xml/xml-simplify.fun000066400000000000000000000052541416264345000211310ustar00rootroot00000000000000(* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor XmlSimplify (S: XML_SIMPLIFY_STRUCTS): XML_SIMPLIFY = struct open S structure SimplifyTypes = SimplifyTypes (structure Input = S structure Output = S) type pass = {name: string, doit: Program.t -> Program.t, execute: bool} val xmlPassesDefault = {name = "xmlShrink", doit = S.shrink, execute = true} :: {name = "xmlSimplifyTypes", doit = SimplifyTypes.simplifyTypes, execute = true} :: nil val xmlPassesMinimal = nil val xmlPasses : pass list ref = ref xmlPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.generator 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (count ())], doit = doit, execute = true} else NONE end val passGens = (List.map([("xmlShrink", S.shrink), ("xmlSimplifyTypes", SimplifyTypes.simplifyTypes)], mkSimplePassGen)) in fun xmlPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in xmlPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end fun xmlPassesSet s = case s of "default" => (xmlPasses := xmlPassesDefault ; Result.Yes ()) | "minimal" => (xmlPasses := xmlPassesMinimal ; Result.Yes ()) | _ => xmlPassesSetCustom s val _ = Control.OptimizationPasses.register {il = "xml", set = xmlPassesSet} fun simplify p = let val xmlPasses = !xmlPasses (* Always want to type check the initial and final XML programs, * even if type checking is turned off, just to catch bugs. *) val () = Control.trace (Control.Pass, "xmlTypeCheck") typeCheck p val p = Control.simplifyPasses {arg = p, passes = xmlPasses, stats = Program.layoutStats, toFile = Program.toFile, typeCheck = typeCheck} val () = Control.trace (Control.Pass, "xmlTypeCheck") typeCheck p in p end end mlton-20210117+dfsg/mlton/xml/xml-simplify.sig000066400000000000000000000010131416264345000211100ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature XML_SIMPLIFY_STRUCTS = sig include XML_TREE val shrink: Program.t -> Program.t val typeCheck: Program.t -> unit end signature XML_SIMPLIFY = sig include XML_SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20210117+dfsg/mlton/xml/xml-transform.sig000066400000000000000000000006121416264345000212730ustar00rootroot00000000000000(* Copyright (C) 2007-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature XML_TRANSFORM_STRUCTS = sig include SHRINK end signature XML_TRANSFORM = sig include XML_TRANSFORM_STRUCTS val transform: Program.t -> Program.t end mlton-20210117+dfsg/mlton/xml/xml-tree.fun000066400000000000000000001230721416264345000202330ustar00rootroot00000000000000(* Copyright (C) 2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor XmlTree (S: XML_TREE_STRUCTS): XML_TREE = struct open S (* infix declarations for Parse.Ops *) infix 1 <|> >>= infix 3 <*> <* *> infixr 4 <$> <$$> <$$$> <$$$$> <$ <$?> local open Layout in fun layoutTyvars ts = case Vector.length ts of 0 => empty | _ => seq [Vector.layout Tyvar.layout ts, str " "] end local open Parse in val parseTyvars = vectorOpt Tyvar.parse end structure Type = struct structure T = HashType (S) open T datatype dest = Var of Tyvar.t | Con of Tycon.t * t vector fun dest t = case Dest.dest t of Dest.Var a => Var a | Dest.Con x => Con x fun parse () = let open Parse val parse = delay parse in (unit <$ kw "unit") <|> (var <$> Tyvar.parse) <|> (con <$> (vectorOpt parse >>= (fn args => Tycon.parse >>= (fn con => pure (con, args))))) end val parse = parse () end fun maybeConstrain (pre, var, ty, post) = let open Layout in if !Control.showTypes then mayAlign [seq [pre, Var.layout var, str ":"], indent (seq [Type.layout ty, post], 2)] else seq [pre, Var.layout var, post] end local open Layout in fun layoutTargs (ts: Type.t vector) = if !Control.showTypes andalso 0 < Vector.length ts then list (Vector.toListMap (ts, Type.layout)) else empty end local open Parse in val parseTargs = Vector.fromList <$> listOpt Type.parse end structure Pat = struct datatype t = T of {arg: (Var.t * Type.t) option, con: Con.t, targs: Type.t vector} local open Layout in fun layout (T {arg, con, targs}) = seq [Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME (var, ty) => seq [str " ", paren (maybeConstrain (empty, var, ty, empty))]] end local open Parse in val parse = T <$> (Con.parse >>= (fn con => parseTargs >>= (fn targs => optional (paren (Var.parse >>= (fn var => sym ":" *> Type.parse >>= (fn ty => pure (var, ty))))) >>= (fn arg => pure {con = con, targs = targs, arg = arg})))) end fun con (T {con, ...}) = con local fun make c = T {con = c, targs = Vector.new0 (), arg = NONE} in val falsee = make Con.falsee val truee = make Con.truee end end structure VarExp = struct datatype t = T of {targs: Type.t vector, var: Var.t} fun equals (T {targs = targs1, var = var1}, T {targs = targs2, var = var2}) = Var.equals (var1, var2) andalso Vector.equals (targs1, targs2, Type.equals) fun mono var = T {var = var, targs = Vector.new0 ()} local fun make f (T r) = f r in val var = make #var end fun layout (T {var, targs, ...}) = let open Layout in seq [Var.layout var, layoutTargs targs] end val parse = let open Parse val varExcepts = Vector.new4 ("exception", "val", "in", "fun") in T <$> (Var.parseExcept varExcepts >>= (fn var => parseTargs >>= (fn targs => pure {var = var, targs = targs}))) end end (*---------------------------------------------------*) (* Expressions and Declarations *) (*---------------------------------------------------*) datatype exp = Exp of {decs: dec list, result: VarExp.t} and primExp = App of {func: VarExp.t, arg: VarExp.t} | Case of {test: VarExp.t, cases: (Pat.t, exp) Cases.t, default: exp option} | ConApp of {con: Con.t, targs: Type.t vector, arg: VarExp.t option} | Const of Const.t | Handle of {try: exp, catch: Var.t * Type.t, handler: exp} | Lambda of lambda | PrimApp of {args: VarExp.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Raise of {exn: VarExp.t, extend: bool} | Select of {tuple: VarExp.t, offset: int} | Tuple of VarExp.t vector | Var of VarExp.t and dec = Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: lambda, ty: Type.t, var: Var.t} vector, tyvars: Tyvar.t vector} | MonoVal of {exp: primExp, ty: Type.t, var: Var.t} | PolyVal of {exp: exp, ty: Type.t, tyvars: Tyvar.t vector, var: Var.t} and lambda = Lam of {arg: Var.t, argType: Type.t, body: exp, mayInline: bool, plist: PropertyList.t} local open Layout in fun layoutConArg {arg, con} = seq [Con.layout con, case arg of NONE => empty | SOME t => seq [str " of ", Type.layout t]] fun layoutDec d = case d of Exception ca => seq [str "exception ", layoutConArg ca] | Fun {decs, tyvars} => align (Vector.toListMapi (decs, fn (i, {lambda, ty, var}) => let val pre = if i = 0 then seq [str "fun ", layoutTyvars tyvars] else str "and " in mayAlign [maybeConstrain (pre, var, ty, str " ="), indent (layoutLambda lambda, 2)] end)) | MonoVal {exp, ty, var} => mayAlign [maybeConstrain (str "val ", var, ty, str " ="), indent (layoutPrimExp exp, 2)] | PolyVal {exp, ty, tyvars, var} => mayAlign [maybeConstrain (seq [str "val ", if !Control.showTypes then layoutTyvars tyvars else empty], var, ty, str " ="), indent (layoutExp exp, 2)] and layoutExp (Exp {decs, result}) = if List.isEmpty decs then VarExp.layout result else align [str "let", indent (align (List.map (decs, layoutDec)), 2), str "in", indent (VarExp.layout result, 2), str "end"] and layoutPrimExp e = case e of App {arg, func} => seq [VarExp.layout func, str " ", VarExp.layout arg] | Case {test, cases, default} => let fun doit (v, layoutP) = Vector.toListMap (v, fn (p, e) => mayAlign [seq [layoutP p, str " =>"], indent (layoutExp e, 3)]) datatype z = datatype Cases.t val (suffix, cases) = case cases of Con v => (empty, doit (v, Pat.layout)) | Word (ws, v) => (str (WordSize.toString ws), doit (v, fn w => WordX.layout (w, {suffix = true}))) val cases = case default of NONE => cases | SOME e => cases @ [mayAlign [str "_ =>", indent (layoutExp e, 3)]] in align [seq [str "case", suffix, str " ", VarExp.layout test, str " of"], indent (alignPrefix (cases, "| "), 2)] end | ConApp {arg, con, targs, ...} => seq [str "con ", Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME x => seq [str " ", VarExp.layout x]] | Const c => Const.layout c | Handle {catch, handler, try} => mayAlign [layoutExp try, mayAlign [maybeConstrain (str "handle ", #1 catch, #2 catch, str " =>"), indent (layoutExp handler, 2)]] | Lambda l => layoutLambda l | PrimApp {args, prim, targs} => seq [str "prim ", Prim.layoutFull(prim, Type.layout), layoutTargs targs, str " ", Vector.layout VarExp.layout args] | Profile e => ProfileExp.layout e | Raise {exn, extend} => seq [str "raise ", str (if extend then "extend " else ""), VarExp.layout exn] | Select {offset, tuple} => seq [str "#", Int.layout offset, str " ", VarExp.layout tuple] | Tuple xs => Vector.layouti (fn (i, x) => seq (* very specific case to prevent open comments *) [str (if i = 0 andalso (case x of (VarExp.T {var, ...}) => String.sub(Var.toString var, 0) = #"*") then " " else ""), VarExp.layout x]) xs | Var x => VarExp.layout x and layoutLambda (Lam {arg, argType, body, mayInline, ...}) = mayAlign [maybeConstrain (seq [str "fn ", str (if not mayInline then "noinline " else "")], arg, argType, str " =>"), indent (layoutExp body, 2)] end local open Parse in val parseConArg = Con.parse >>= (fn con => optional (kw "of" *> Type.parse) >>= (fn arg => pure {con = con, arg = arg})) val parseArgs = vector VarExp.parse fun parseDec () = mlSpaces *> any [Exception <$> (kw "exception" *> parseConArg), Fun <$> (kw "fun" *> parseTyvars >>= (fn tyvars => sepBy (Var.parse >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=" *> delay parseLambda >>= (fn lambda => pure {var = var, ty = ty, lambda = lambda}))), kw "and") >>= (fn decs => pure {tyvars = tyvars, decs = Vector.fromList decs}))), MonoVal <$> (kw "val" *> Var.parse >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=" *> delay parsePrimExp >>= (fn exp => pure {var = var, ty = ty, exp = exp})))), PolyVal <$> (kw "val" *> parseTyvars >>= (fn tyvars => Var.parse >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=" *> delay parseExp >>= (fn exp => pure {tyvars = tyvars, var = var, ty = ty, exp = exp})))))] and parseExp () = Exp <$> ((kw "let" *> many (delay parseDec) >>= (fn decs => kw "in" *> VarExp.parse >>= (fn result => kw "end" *> pure {decs = decs, result = result}))) <|> (VarExp.parse >>= (fn result => pure {decs = [], result = result}))) and parsePrimExp () = mlSpaces *> any [Case <$> let fun parseCase (parseP, mk) = VarExp.parse >>= (fn test => kw "of" *> (Vector.fromList <$> sepBy (parseP >>= (fn p => sym "=>" *> delay parseExp >>= (fn e => pure (p, e))), sym "|")) >>= (fn cases => optional ((if Vector.isEmpty cases then pure () else sym "|") *> kw "_" *> sym "=>" *> delay parseExp) >>= (fn default => pure {test = test, cases = mk cases, default = default}))) in any ((kw "case" *> parseCase (Pat.parse, Cases.Con)) :: (List.map (WordSize.all, fn ws => (kw ("case" ^ WordSize.toString ws) *> parseCase (WordX.parse, fn cases => (Cases.Word (ws, cases))))))) end, ConApp <$> (kw "con" *> Con.parse >>= (fn con => parseTargs >>= (fn targs => optional VarExp.parse >>= (fn arg => pure {con = con, targs = targs, arg = arg})))), Const <$> Const.parse, Handle <$> (delay parseExp >>= (fn try => kw "handle" *> Var.parse >>= (fn var => sym ":" *> Type.parse >>= (fn ty => sym "=>" *> delay parseExp >>= (fn handler => pure {try = try, catch = (var, ty), handler = handler}))))), Lambda <$> delay parseLambda, PrimApp <$> (kw "prim" *> Prim.parseFull Type.parse >>= (fn prim => parseTargs >>= (fn targs => parseArgs >>= (fn args => pure {prim = prim, targs = targs, args = args})))), Raise <$> (kw "raise" *> optional (kw "extend") >>= (fn extend => VarExp.parse >>= (fn exn => pure {extend = Option.isSome extend, exn = exn}))), Select <$> (mlSpaces *> char #"#" *> (peek (nextSat Char.isDigit) *> fromScan (Function.curry Int.scan StringCvt.DEC)) >>= (fn offset => VarExp.parse >>= (fn tuple => pure {offset = offset, tuple = tuple}))), Tuple <$> parseArgs, App <$> (VarExp.parse >>= (fn func => VarExp.parse >>= (fn arg => pure {func = func, arg = arg}))), Var <$> VarExp.parse] and parseLambda () = Lam <$> (kw "fn" *> optional (kw "noinline") >>= (fn noInline => Var.parse >>= (fn arg => sym ":" *> Type.parse >>= (fn argType => sym "=>" *> delay parseExp >>= (fn body => pure {mayInline = Option.isNone noInline, arg = arg, argType = argType, body = body, plist = PropertyList.new ()}))))) end structure Dec = struct type exp = exp datatype t = datatype dec val layout = layoutDec end structure PrimExp = struct type exp = exp datatype t = datatype primExp val layout = layoutPrimExp end structure Exp = struct datatype t = datatype exp val layout = layoutExp val parse = parseExp () val make = Exp fun dest (Exp r) = r val decs = #decs o dest val result = #result o dest fun fromPrimExp (exp: PrimExp.t, ty: Type.t): t = let val var = Var.newNoname () in Exp {decs = [Dec.MonoVal {var = var, ty = ty, exp = exp}], result = VarExp.mono var} end local fun make f (Exp {decs, result}, d) = Exp {decs = f (d, decs), result = result} in val prefix = make (op ::) val prefixs = make (op @) end fun enterLeave (e: t, ty: Type.t, si: SourceInfo.t): t = let datatype z = datatype Dec.t datatype z = datatype PrimExp.t fun mayRaiseExp e = List.exists (decs e, mayRaiseDec) and mayRaisePrimExp e = case e of App _ => true | Case {cases, default, ...} => Cases.exists (cases, mayRaiseExp) orelse Option.fold (default, false, mayRaiseExp o #1) | Handle {handler, ...} => mayRaiseExp handler | Raise _ => true | _ => false and mayRaiseDec d = case d of MonoVal {exp, ...} => mayRaisePrimExp exp | _ => false fun prof f = MonoVal {exp = Profile (f si), ty = Type.unit, var = Var.newNoname ()} val exn = Var.newNoname () val res = Var.newNoname () val handler = make {decs = [prof ProfileExp.Leave, MonoVal {exp = Raise {exn = VarExp.mono exn, extend = false}, ty = ty, var = res}], result = VarExp.mono res} val touch = if !Control.profile = Control.ProfileCount then let val unit = Var.newNoname () in [MonoVal {exp = Tuple (Vector.new0 ()), ty = Type.unit, var = unit}, MonoVal {exp = PrimApp {args = Vector.new1 (VarExp.mono unit), prim = Prim.MLton_touch, targs = Vector.new1 Type.unit}, ty = Type.unit, var = Var.newNoname ()}] end else [] val {decs, result} = dest e val decs = List.concat [[prof ProfileExp.Enter], touch, decs, [prof ProfileExp.Leave]] val try = make {decs = decs, result = result} in if mayRaiseExp e then fromPrimExp (Handle {catch = (exn, Type.exn), handler = handler, try = try}, ty) else try end (*------------------------------------*) (* foreach *) (*------------------------------------*) fun foreach {exp: t, handleExp: t -> unit, handlePrimExp: Var.t * Type.t * PrimExp.t -> unit, handleBoundVar: Var.t * Tyvar.t vector * Type.t -> unit, handleVarExp: VarExp.t -> unit}: unit = let fun monoVar (x, t) = handleBoundVar (x, Vector.new0 (), t) fun handleVarExps xs = Vector.foreach (xs, handleVarExp) fun loopExp e = let val {decs, result} = dest e in List.foreach (decs, loopDec) ; handleVarExp result ; handleExp e end and loopPrimExp (x: Var.t, ty: Type.t, e: PrimExp.t): unit = (handlePrimExp (x, ty, e) ; (case e of Const _ => () | Var x => handleVarExp x | Tuple xs => handleVarExps xs | Select {tuple, ...} => handleVarExp tuple | Lambda lambda => loopLambda lambda | PrimApp {args, ...} => handleVarExps args | Profile _ => () | ConApp {arg, ...} => (case arg of NONE => () | SOME x => handleVarExp x) | App {func, arg} => (handleVarExp func ; handleVarExp arg) | Raise {exn, ...} => handleVarExp exn | Handle {try, catch, handler, ...} => (loopExp try ; monoVar catch ; loopExp handler) | Case {test, cases, default} => (handleVarExp test ; Cases.foreach' (cases, loopExp, fn Pat.T {arg, ...} => case arg of NONE => () | SOME x => monoVar x) ; Option.app (default, loopExp)))) and loopDec d = case d of MonoVal {var, ty, exp} => (monoVar (var, ty); loopPrimExp (var, ty, exp)) | PolyVal {var, tyvars, ty, exp} => (handleBoundVar (var, tyvars, ty) ; loopExp exp) | Exception _ => () | Fun {tyvars, decs, ...} => (Vector.foreach (decs, fn {ty, var, ...} => handleBoundVar (var, tyvars, ty)) ; Vector.foreach (decs, fn {lambda, ...} => loopLambda lambda)) and loopLambda (Lam {arg, argType, body, ...}): unit = (monoVar (arg, argType); loopExp body) in loopExp exp end fun ignore _ = () fun foreachPrimExp (e, f) = foreach {exp = e, handlePrimExp = f, handleExp = ignore, handleBoundVar = ignore, handleVarExp = ignore} fun foreachVarExp (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = ignore, handleBoundVar = ignore, handleVarExp = f} fun foreachBoundVar (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = ignore, handleBoundVar = f, handleVarExp = ignore} fun foreachExp (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = f, handleBoundVar = ignore, handleVarExp = ignore} (* quell unused warning *) val _ = foreachExp fun hasPrim (e, f) = Exn.withEscape (fn escape => (foreachPrimExp (e, fn (_, _, e) => case e of PrimApp {prim, ...} => if f prim then escape true else () | _ => ()) ; false)) fun size e = let val n: int ref = ref 0 fun inc () = n := 1 + !n in foreachPrimExp (e, fn _ => inc ()); !n end val size = Trace.trace ("XmlTree.Exp.size", Layout.ignore, Int.layout) size (* quell unused warning *) val _ = size fun dropProfile (e: t): t = let fun dropProfileExp (Exp {decs, result}) = Exp {decs = List.keepAllMap (decs, dropProfileDec), result = result} and dropProfilePrimExp e = case e of Case {test, cases, default} => Case {test = test, cases = Cases.map (cases, dropProfileExp), default = Option.map (default, dropProfileExp)} | Handle {try, catch, handler} => Handle {try = dropProfileExp try, catch = catch, handler = dropProfileExp handler} | Lambda lambda => Lambda (dropProfileLambda lambda) | _ => e and dropProfileDec d = case d of Exception arg_con => SOME (Exception arg_con) | Fun {decs, tyvars} => SOME (Fun {decs = Vector.map (decs, fn {lambda, ty, var} => {lambda = dropProfileLambda lambda, ty = ty, var = var}), tyvars = tyvars}) | MonoVal {exp = Profile _, ...} => NONE | MonoVal {exp, ty, var} => SOME (MonoVal {exp = dropProfilePrimExp exp, ty = ty, var = var}) | PolyVal {exp, ty, tyvars, var} => SOME (PolyVal {exp = dropProfileExp exp, ty = ty, tyvars = tyvars, var = var}) and dropProfileLambda (Lam {arg, argType, body, mayInline, plist}) = Lam {arg = arg, argType = argType, body = dropProfileExp body, mayInline = mayInline, plist = plist} in dropProfileExp e end fun clear (e: t): unit = let open PrimExp fun clearTyvars ts = Vector.foreach (ts, Tyvar.clear) fun clearPat (Pat.T {arg, ...}) = case arg of NONE => () | SOME (x, _) => Var.clear x fun clearExp e = clearDecs (decs e) and clearDecs ds = List.foreach (ds, clearDec) and clearDec d = case d of MonoVal {var, exp, ...} => (Var.clear var; clearPrimExp exp) | PolyVal {var, tyvars, exp, ...} => (Var.clear var ; clearTyvars tyvars ; clearExp exp) | Fun {tyvars, decs} => (clearTyvars tyvars ; Vector.foreach (decs, fn {var, lambda, ...} => (Var.clear var ; clearLambda lambda))) | Exception {con, ...} => Con.clear con and clearPrimExp e = case e of Lambda l => clearLambda l | Case {cases, default, ...} => (Cases.foreach' (cases, clearExp, clearPat) ; Option.app (default, clearExp)) | Handle {try, catch, handler, ...} => (clearExp try ; Var.clear (#1 catch) ; clearExp handler) | _ => () and clearLambda (Lam {arg, body, ...}) = (Var.clear arg; clearExp body) in clearExp e end end (*---------------------------------------------------*) (* Lambda *) (*---------------------------------------------------*) structure Lambda = struct type exp = exp datatype t = datatype lambda local fun make f (Lam r) = f r in val arg = make #arg val body = make #body val mayInline = make #mayInline end fun make {arg, argType, body, mayInline} = Lam {arg = arg, argType = argType, body = body, mayInline = mayInline, plist = PropertyList.new ()} fun dest (Lam {arg, argType, body, mayInline, ...}) = {arg = arg, argType = argType, body = body, mayInline = mayInline} fun plist (Lam {plist, ...}) = plist val layout = layoutLambda fun equals (f:t, f':t) = PropertyList.equals (plist f, plist f') end (* ------------------------------------------------- *) (* DirectExp *) (* ------------------------------------------------- *) structure DirectExp = struct open Dec PrimExp structure Cont = struct type t = PrimExp.t * Type.t -> Exp.t fun nameGen (k: VarExp.t * Type.t -> Exp.t): t = fn (e, t) => case e of Var x => k (x, t) | _ => let val x = Var.newNoname () in Exp.prefix (k (VarExp.mono x, t), MonoVal {var = x, ty = t, exp = e}) end fun name (k: VarExp.t * Type.t -> Exp.t): t = nameGen k val id: t = name (fn (x, _) => Exp {decs = [], result = x}) fun return (k: t, xt) = k xt end type t = Cont.t -> Exp.t fun send (e: t, k: Cont.t): Exp.t = e k fun toExp e = send (e, Cont.id) fun fromExp (Exp {decs, result}, ty): t = fn k => Exp.prefixs (k (Var result, ty), decs) fun sendName (e, k) = send (e, Cont.name k) fun simple (e: PrimExp.t * Type.t) k = Cont.return (k, e) fun const c = simple (Const c, Type.ofConst c) val string = const o Const.string fun varExp (x, t) = simple (Var x, t) fun var {var, targs, ty} = varExp (VarExp.T {var = var, targs = targs}, ty) fun monoVar (x, t) = var {var = x, targs = Vector.new0 (), ty = t} fun convertsGen (es: t vector, k: (VarExp.t * Type.t) vector -> Exp.t): Exp.t = let val n = Vector.length es fun loop (i, xs) = if i = n then k (Vector.fromListRev xs) else sendName (Vector.sub (es, i), fn x => loop (i + 1, x :: xs)) in loop (0, []) end fun converts (es: t vector, make: (VarExp.t * Type.t) vector -> PrimExp.t * Type.t): t = fn k => convertsGen (es, k o make) fun convert (e: t, make: VarExp.t * Type.t -> PrimExp.t * Type.t): t = fn k => send (e, Cont.name (k o make)) fun convertOpt (e, make) = case e of NONE => simple (make NONE) | SOME e => convert (e, make o SOME o #1) fun tuple {exps: t vector, ty: Type.t}: t = if 1 = Vector.length exps then Vector.first exps else converts (exps, fn xs => (PrimExp.Tuple (Vector.map (xs, #1)), ty)) fun select {tuple, offset, ty} = convert (tuple, fn (tuple, _) => (Select {tuple = tuple, offset = offset}, ty)) fun conApp {con, targs, arg, ty} = convertOpt (arg, fn arg => (ConApp {con = con, targs = targs, arg = arg}, ty)) local fun make c () = conApp {con = c, targs = Vector.new0 (), arg = NONE, ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun primApp {prim, targs, args, ty} = converts (args, fn args => (PrimApp {prim = prim, targs = targs, args = Vector.map (args, #1)}, ty)) fun convert2 (e1, e2, make) = converts (Vector.new2 (e1, e2), fn xs => make (Vector.first xs, Vector.sub (xs, 1))) fun app {func, arg, ty} = convert2 (func, arg, fn ((func, _), (arg, _)) => (App {func = func, arg = arg}, ty)) fun casee {test, cases, default, ty} = convert (test, fn (test, _) => (Case {test = test, cases = Cases.map (cases, toExp), default = Option.map (default, toExp)}, ty)) fun raisee {exn: t, extend: bool, ty: Type.t}: t = convert (exn, fn (x, _) => (Raise {exn = x, extend = extend}, ty)) fun handlee {try, catch, handler, ty} = simple (Handle {try = toExp try, catch = catch, handler = toExp handler}, ty) fun unit () = tuple {exps = Vector.new0 (), ty = Type.unit} fun reff (e: t): t = convert (e, fn (x, t) => (PrimApp {prim = Prim.Ref_ref, targs = Vector.new1 t, args = Vector.new1 x}, Type.reff t)) fun deref (e: t): t = convert (e, fn (x, t) => let val t = Type.deRef t in (PrimApp {prim = Prim.Ref_deref, targs = Vector.new1 t, args = Vector.new1 x}, t) end) fun vectorLength (e: t): t = convert (e, fn (x, t) => let val t = Type.deVector t in (PrimApp {prim = Prim.Vector_length, targs = Vector.new1 t, args = Vector.new1 x}, Type.word (WordSize.seqIndex ())) end) fun vectorSub (e1: t, e2: t): t = convert2 (e1, e2, fn ((x1, t1), (x2, _)) => let val t = Type.deVector t1 in (PrimApp {prim = Prim.Vector_sub, targs = Vector.new1 t, args = Vector.new2 (x1, x2)}, t) end) fun equal (e1, e2) = convert2 (e1, e2, fn ((x1, t), (x2, _)) => (PrimApp {prim = Prim.MLton_equal, targs = Vector.new1 t, args = Vector.new2 (x1, x2)}, Type.bool)) fun iff {test, thenn, elsee, ty} = casee {test = test, cases = Cases.Con (Vector.new2 ((Pat.truee, thenn), (Pat.falsee, elsee))), default = NONE, ty = ty} fun vall {var, exp}: Dec.t list = let val t = ref Type.unit val Exp {decs, result} = sendName (exp, fn (x, t') => (t := t'; Exp {decs = [], result = x})) in decs @ [MonoVal {var = var, ty = !t, exp = Var result}] end fun sequence es = converts (es, fn xs => let val (x, t) = Vector.last xs in (Var x, t) end) val bug: string -> t = fn s => primApp {prim = Prim.MLton_bug, targs = Vector.new0 (), args = Vector.new1 (string s), ty = Type.unit} fun seq (es, make) = fn k => convertsGen (es, fn xts => send (make (Vector.map (xts, varExp)), k)) fun lett {decs, body} = fn k => Exp.prefixs (send (body, k), decs) fun let1 {var, exp, body} = fn k => send (exp, fn (exp, ty) => Exp.prefix (send (body, k), Dec.MonoVal {var = var, ty = ty, exp = exp})) fun lambda {arg, argType, body, bodyType, mayInline} = simple (Lambda (Lambda.make {arg = arg, argType = argType, body = toExp body, mayInline = mayInline}), Type.arrow (argType, bodyType)) fun fromLambda (l, ty) = simple (Lambda l, ty) fun detupleGen (e: PrimExp.t, t: Type.t, components: Var.t vector, body: Exp.t): Exp.t = Exp.prefixs (body, case Vector.length components of 0 => [] | 1 => [MonoVal {var = Vector.first components, ty = t, exp = e}] | _ => let val ts = Type.deTuple t val tupleVar = Var.newNoname () in MonoVal {var = tupleVar, ty = t, exp = e} :: #2 (Vector.fold2 (components, ts, (0, []), fn (x, t, (i, ac)) => (i + 1, MonoVal {var = x, ty = t, exp = Select {tuple = VarExp.mono tupleVar, offset = i}} :: ac))) end) fun detupleBind {tuple, components, body} = fn k => send (tuple, fn (e, t) => detupleGen (e, t, components, body k)) fun detuple {tuple: t, body}: t = fn k => tuple (fn (e, t) => let val ts = Type.deTuple t in case e of Tuple xs => send (body (Vector.zip (xs, ts)), k) | _ => let val components = Vector.map (ts, fn _ => Var.newNoname ()) in detupleGen (e, t, components, send (body (Vector.map2 (components, ts, fn (x, t) => (VarExp.mono x, t))), k)) end end) fun devector {vector: t, length: int, body}: t = fn k => let val es = Vector.tabulate (length, fn i => vectorSub (vector, const (Const.word (WordX.fromInt (i, WordSize.seqIndex ()))))) in convertsGen (es, fn args => (body args) k) end end (*---------------------------------------------------*) (* Datatype *) (*---------------------------------------------------*) structure Datatype = struct type t = {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} fun layout ({cons, tycon, tyvars}: t): Layout.t = let open Layout in seq [str "datatype ", layoutTyvars tyvars, Tycon.layout tycon, str " = ", alignPrefix (Vector.toListMap (cons, layoutConArg), "| ")] end val parse = let open Parse in kw "datatype" *> parseTyvars >>= (fn tyvars => Tycon.parse >>= (fn tycon => sym "=" *> sepBy (parseConArg, sym "|") >>= (fn cons => pure {tyvars = tyvars, tycon = tycon, cons = Vector.fromList cons}))) end end (*---------------------------------------------------*) (* Program *) (*---------------------------------------------------*) structure Program = struct datatype t = T of {body: Exp.t, datatypes: Datatype.t vector} fun layout (T {body, datatypes, ...}) = let open Layout in align [str "\n\nDatatypes:", align (Vector.toListMap (datatypes, Datatype.layout)), str "\n\nBody:", Exp.layout body] end fun layouts (T {body, datatypes, ...}, output') = let open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\n(* Datatypes: *)") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (str "\n\n(* Body: *)") ; output (Exp.layout body) end val toFile = {display = Control.Layouts layouts, style = Control.ML, suffix = "xml"} fun parse () = let open Parse val () = Tyvar.parseReset {prims = Vector.new0 ()} val () = Tycon.parseReset {prims = Vector.fromListMap (Tycon.prims, #tycon)} val () = Con.parseReset {prims = Vector.new3 (Con.truee, Con.falsee, Con.reff)} val () = Var.parseReset {prims = Vector.new0 ()} val parseProgram = T <$> (many Datatype.parse >>= (fn datatypes => Exp.parse >>= (fn body => pure {datatypes = Vector.fromList datatypes, body = body}))) in parseProgram <* (mlSpaces *> (failing next <|> fail "end of file")) end fun dropProfile (T {datatypes, body}) = (Control.profile := Control.ProfileNone ; T {datatypes = datatypes, body = Exp.dropProfile body}) fun clear (T {datatypes, body, ...}) = (Vector.foreach (datatypes, fn {tycon, tyvars, cons} => (Tycon.clear tycon ; Vector.foreach (tyvars, Tyvar.clear) ; Vector.foreach (cons, Con.clear o #con))) ; Exp.clear body) fun mkLayoutStats il (program as T {datatypes, body, ...}) = let val numTypes = ref 0 fun inc _ = numTypes := 1 + !numTypes val {hom, destroy} = Type.makeHom {var = inc, con = inc} val numPrimExps = ref 0 val _ = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, fn {arg, ...} => case arg of NONE => () | SOME t => hom t)) val _ = Exp.foreach {exp = body, handlePrimExp = fn _ => numPrimExps := 1 + !numPrimExps, handleVarExp = fn _ => (), handleBoundVar = hom o #3, handleExp = fn _ => ()} val _ = destroy () open Layout in align [Control.sizeMessage (il ^ " program", program), seq [str "num primexps in program = ", Int.layout (!numPrimExps)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end val layoutStats = mkLayoutStats "xml" end end mlton-20210117+dfsg/mlton/xml/xml-tree.sig000066400000000000000000000211611416264345000202210ustar00rootroot00000000000000(* Copyright (C) 2009,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) (* binding occurences: * 1. lambda arg * 2. pattern arg * 3. MonoVal dec * 4. PolyVal dec * 5. Fun dec * 6. Handle catch *) signature XML_TREE_STRUCTS = sig include ATOMS end signature XML_TREE = sig include XML_TREE_STRUCTS structure Type: XML_TYPE sharing Atoms = Type.Atoms structure Pat: sig datatype t = T of {arg: (Var.t * Type.t) option, con: Con.t, targs: Type.t vector} val falsee: t val truee: t val con: t -> Con.t val layout: t -> Layout.t end structure Lambda: sig type exp type t val arg: t -> Var.t val body: t -> exp val dest: t -> {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} val equals: t * t -> bool val layout: t -> Layout.t val make: {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} -> t val mayInline: t -> bool val plist: t -> PropertyList.t end (* VarExp is a type application, variable applied to type args. *) structure VarExp: sig datatype t = T of {var: Var.t, targs: Type.t vector} val equals: t * t -> bool val layout: t -> Layout.t val mono: Var.t -> t val var: t -> Var.t end structure PrimExp: sig type exp = Lambda.exp datatype t = App of {arg: VarExp.t, func: VarExp.t} | Case of {cases: (Pat.t, exp) Cases.t, default: exp option, test: VarExp.t} | ConApp of {arg: VarExp.t option, con: Con.t, targs: Type.t vector} | Const of Const.t | Handle of {(* catch binds the exception in the handler. *) catch: Var.t * Type.t, handler: exp, try: exp} | Lambda of Lambda.t | PrimApp of {args: VarExp.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Raise of {exn: VarExp.t, extend: bool} | Select of {offset: int, tuple: VarExp.t} | Tuple of VarExp.t vector | Var of VarExp.t val layout: t -> Layout.t end structure Dec: sig type exp = Lambda.exp datatype t = Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: Lambda.t, ty: Type.t, var: Var.t} vector, tyvars: Tyvar.t vector} | MonoVal of {exp: PrimExp.t, ty: Type.t, var: Var.t} | PolyVal of {exp: exp, ty: Type.t, tyvars: Tyvar.t vector, var: Var.t} val layout: t -> Layout.t end structure Exp: sig type t = Lambda.exp val clear: t -> unit val decs: t -> Dec.t list val dest: t -> {decs: Dec.t list, result: VarExp.t} val enterLeave: t * Type.t * SourceInfo.t -> t (* foreach {exp, handleExp, handleBoundVar, handleVarExp} * applies handleExp to each subexpresison of e (including e) * applies handleBoundVar to each variable bound in e * applies handleVarExp to each variable expression in e * handleBoundVar will be called on a variable binding before * handleVarExp is called on any occurrences * handleExp is called on an expression after it is called on * all of its subexpressions *) val foreach: {exp: t, handleExp: t -> unit, handlePrimExp: Var.t * Type.t * PrimExp.t -> unit, handleBoundVar: Var.t * Tyvar.t vector * Type.t -> unit, handleVarExp: VarExp.t -> unit} -> unit val foreachBoundVar: t * (Var.t * Tyvar.t vector * Type.t -> unit) -> unit val foreachExp: t * (t -> unit) -> unit val foreachPrimExp: t * (Var.t * Type.t * PrimExp.t -> unit) -> unit val foreachVarExp: t * (VarExp.t -> unit) -> unit val fromPrimExp: PrimExp.t * Type.t -> t val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layout: t -> Layout.t val make: {decs: Dec.t list, result: VarExp.t} -> t val prefix: t * Dec.t -> t val result: t -> VarExp.t val size: t -> int end structure DirectExp: sig type t val app: {func: t, arg: t, ty: Type.t} -> t val bug: string -> t val casee: {cases: (Pat.t, t) Cases.t, default: t option, test: t, ty: Type.t} (* type of entire case expression *) -> t val conApp: {arg: t option, con: Con.t, targs: Type.t vector, ty: Type.t} -> t val const: Const.t -> t val deref: t -> t val detuple: {tuple: t, body: (VarExp.t * Type.t) vector -> t} -> t val detupleBind: {tuple: t, components: Var.t vector, body: t} -> t val devector: {vector: t, length: int, body: (VarExp.t * Type.t) vector -> t} -> t val equal: t * t -> t val falsee: unit -> t val fromExp: Exp.t * Type.t -> t val fromLambda: Lambda.t * Type.t -> t val handlee: {catch: Var.t * Type.t, handler: t, try: t, ty: Type.t} -> t val iff: {test: t, thenn: t, elsee: t, ty: Type.t} -> t val lambda: {arg: Var.t, argType: Type.t, body: t, bodyType: Type.t, mayInline: bool} -> t val let1: {var: Var.t, exp: t, body: t} -> t val lett: {decs: Dec.t list, body: t} -> t val monoVar: Var.t * Type.t -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val raisee: {exn: t, extend: bool, ty: Type.t} -> t val reff: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val seq: t vector * (t vector -> t) -> t val sequence: t vector -> t val string: string -> t val toExp: t -> Exp.t val truee: unit -> t val tuple: {exps: t vector, ty: Type.t} -> t val unit: unit -> t val vall: {var: Var.t, exp: t} -> Dec.t list val var: {targs: Type.t vector, ty: Type.t, var: Var.t} -> t val varExp: VarExp.t * Type.t -> t val vectorLength: t -> t end structure Program: sig datatype t = T of {body: Exp.t, datatypes: {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector} val clear: t -> unit (* clear all property lists *) val dropProfile: t -> t val layout: t -> Layout.t val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val mkLayoutStats: string -> t -> Layout.t val parse: unit -> t Parse.t val toFile: {display: t Control.display, style: Control.style, suffix: string} end end mlton-20210117+dfsg/mlton/xml/xml-type.sig000066400000000000000000000006441416264345000202460ustar00rootroot00000000000000(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature XML_TYPE = sig include HASH_TYPE datatype dest = Var of Tyvar.t | Con of Tycon.t * t vector val dest: t -> dest end mlton-20210117+dfsg/mlton/xml/xml.fun000066400000000000000000000005221416264345000172700ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) functor Xml (S: XML_STRUCTS): XML = XmlSimplify (Shrink (TypeCheck (XmlTree (S)))) mlton-20210117+dfsg/mlton/xml/xml.sig000066400000000000000000000007631416264345000172710ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) signature XML_STRUCTS = sig include XML_TREE_STRUCTS end signature XML = sig include XML_TREE val shrink: Program.t -> Program.t val simplify: Program.t -> Program.t val typeCheck: Program.t -> unit end mlton-20210117+dfsg/mlyacc/000077500000000000000000000000001416264345000152765ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/.gitignore000066400000000000000000000001301416264345000172600ustar00rootroot00000000000000/ml.grm /ml.grm.desc /ml.grm.sig /ml.grm.sml /mlyacc /mlyacc.exe /mlyacc.pdf /mlyacc.ps mlton-20210117+dfsg/mlyacc/COPYRIGHT000066400000000000000000000021471416264345000165750ustar00rootroot00000000000000ML-YACC COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright 1989, 1990 by David R. Tarditi Jr. and Andrew W. Appel Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the names of David R. Tarditi Jr. and Andrew W. Appel not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. David R. Tarditi Jr. and Andrew W. Appel disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall David R. Tarditi Jr. and Andrew W. Appel be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20210117+dfsg/mlyacc/Makefile000066400000000000000000000024661416264345000167460ustar00rootroot00000000000000## Copyright (C) 2009,2013,2018-2020 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### NAME := mlyacc all: $(NAME) $(NAME): $(NAME).mlb $(shell "$(RUN_MLTON_DEPS)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(RUN_MLTON)" @MLton $(RUN_MLTON_RUNTIME_ARGS) -- $(RUN_MLTON_COMPILE_ARGS) -target $(TARGET) $(NAME).mlb .PHONY: clean clean: $(SRC)/bin/clean src/%.lex.sml: src/%.lex $(RM) $<.* $(RUN_MLLEX) $< $(CHMOD) -w $<.* src/%.grm.sig src/%.grm.sml: src/%.grm $(RM) $<.* $(RUN_MLYACC) $< $(CHMOD) -w $<.* PDFLATEX := pdflatex doc/mlyacc.pdf: $(MAKE) -C doc mlyacc.pdf mlyacc.pdf: doc/mlyacc.pdf $(CP) doc/mlyacc.pdf . DOCS := ifneq ($(shell which $(PDFLATEX) 2> /dev/null),) DOCS += mlyacc.pdf endif .PHONY: docs docs: $(DOCS) .PHONY: test test: $(NAME) $(CP) ../mlton/front-end/ml.grm . \ $(NAME) ml.grm && \ $(DIFF) ml.grm.sig ../mlton/front-end/ml.grm.sig && \ $(DIFF) ml.grm.sml ../mlton/front-end/ml.grm.sml \ $(RM) ml.grm ml.grm.sig ml.grm.sml ml.grm.desc mlton-20210117+dfsg/mlyacc/README000066400000000000000000000023511416264345000161570ustar00rootroot00000000000000Copyright (c) 1989, 1990, 1991 Andrew W. Appel and David R. Tarditi Jr. This directory contains ML-Yacc, an LALR parser generator for Standard ML. ML-Yacc is distributed subject to the terms of the accompanying ML-Yacc copyright notice, license, and disclaimer in the file COPYRIGHT. Files of interest (those marked with a * must be built by the person installing ML-Yacc): README - this file INSTALL - installation instructions. COPYRIGHT - this software is distributed subject to the terms of this file. lib - implementation of the ML-Yacc library (aka $/ml-yacc-lib.cm); this library is used by both by applications and by ML-Yacc itself (because ML-Yacc IS an ML-Yacc application) src - source code for the parser-generator part of ML-Yacc. doc - documentation for ML-Yacc. Please read this before using ML-Yacc examples - sample parsers built with ML-Yacc build - script that invokes ../../bin/ml-build to construct the stand-alone version of ML-Yacc mlton-20210117+dfsg/mlyacc/README.MLton000066400000000000000000000025731416264345000172150ustar00rootroot00000000000000This is a modified version of the ml-lex directory that comes with SML/NJ. Files from SML/NJ: COPYRIGHT INSTALL -- deleted build -- deleted build.bat -- deleted doc/ examples/ lib/base.sig -- moved to /lib/mlyacc-lib lib/join.sml -- moved to /lib/mlyacc-lib lib/lrtable.sml -- moved to /lib/mlyacc-lib lib/ml-yacc-lib.cm lib/parser1.sml -- moved to /lib/mlyacc-lib lib/parser2.sml -- moved to /lib/mlyacc-lib lib/sources.cm -- deleted lib/stream.sml -- moved to /lib/mlyacc-lib src/FILES src/README src/absyn.sig -- modifed src/absyn.sml -- modifed src/core.sml src/coreutils.sml src/export-yacc.sml -- deleted src/grammar.sml src/graph.sml src/hdr.sml -- modifed src/lalr.sml src/link.sml src/look.sml src/mklrtable.sml src/mkprstruct.sml src/ml-yacc.cm -- deleted src/parse.sml -- modifed src/shrink.sml src/sigs.sml -- modifed src/utils.sig src/utils.sml src/verbose.sml src/yacc.grm -- modifed src/yacc.grm.sig -- deleted (generated by Makefile) src/yacc.grm.sml -- deleted (generated by Makefile) src/yacc.lex -- modifed src/yacc.lex.sml -- deleted (generated by Makefile) src/yacc.sml -- modifed tool/* -- deleted Files added: Makefile README.MLton call-main.sml doc/Makefile doc/macros.hva lib/mlyacc-lib.mlb -- moved to /lib/mlyacc-lib main.sml mlyacc.mlb mlton-20210117+dfsg/mlyacc/call-main.sml000066400000000000000000000004201416264345000176440ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20210117+dfsg/mlyacc/doc/000077500000000000000000000000001416264345000160435ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/doc/.gitignore000066400000000000000000000001071416264345000200310ustar00rootroot00000000000000/mlyacc.aux /mlyacc.dvi /mlyacc.log /mlyacc.pdf /mlyacc.ps /mlyacc.toc mlton-20210117+dfsg/mlyacc/doc/Makefile000066400000000000000000000007011416264345000175010ustar00rootroot00000000000000## Copyright (C) 2013,2018 Matthew Fluet # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## PDFLATEX := pdflatex mlyacc.pdf: mlyacc.tex $(PDFLATEX) mlyacc.tex $(PDFLATEX) mlyacc.tex $(PDFLATEX) mlyacc.tex .PHONY: clean clean: ../../bin/clean mlton-20210117+dfsg/mlyacc/doc/mlyacc.tex000066400000000000000000001637761416264345000200610ustar00rootroot00000000000000\documentstyle{article} \title{ ML-Yacc User's Manual \\ Version 2.4 } \author{ David R. Tarditi$^1$\\ Andrew W. Appel$^2$\\ \\ $^1$Microsoft Research \\ \\ $^2$Department of Computer Science \\ Princeton University \\ Princeton, NJ 08544 } \date{April 24, 2000} \begin{document} \maketitle \begin{center} (c) 1989, 1990, 1991,1994 Andrew W. Appel, David R. Tarditi \end{center} {\bf This software comes with ABSOLUTELY NO WARRANTY. It is subject only to the terms of the ML-Yacc NOTICE, LICENSE, and DISCLAIMER (in the file COPYRIGHT distributed with this software). } New in this version: Improved error correction directive \verb|%change| that allows multi-token insertions, deletions, substitutions. Explanation of how to build a parser (Section 5) and the Calc example (Section 7) revised for SML/NJ Version 110 and the use of CM. \newpage \tableofcontents \newpage \section{Introduction} \subsection{General} ML-Yacc is a parser generator for Standard ML modeled after the Yacc parser generator. It generates parsers for LALR languages, like Yacc, and has a similar syntax. The generated parsers use a different algorithm for recovering from syntax errors than parsers generated by Yacc. The algorithm is a partial implementation of an algorithm described in \cite{bf}. A parser tries to recover from a syntax error by making a single token insertion, deletion, or substitution near the point in the input stream at which the error was detected. The parsers delay the evaluation of semantic actions until parses are completed successfully. This makes it possible for parsers to recover from syntax errors that occur before the point of error detection, but it does prevent the parsers from affecting lexers in any significant way. The parsers can insert tokens with values and substitute tokens with values for other tokens. All symbols carry left and right position values which are available to semantic actions and are used in syntactic error messages. ML-Yacc uses context-free grammars to specify the syntax of languages to be parsed. See \cite{ahu} for definitions and information on context-free grammars and LR parsing. We briefly review some terminology here. A context-free grammar is defined by a set of terminals $T$, a set of nonterminals $NT$, a set of productions $P$, and a start nonterminal $S$. Terminals are interchangeably referred to as tokens. The terminal and nonterminal sets are assumed to be disjoint. The set of symbols is the union of the nonterminal and terminal sets. We use lower case Greek letters to denote a string of symbols. We use upper case Roman letters near the beginning of the alphabet to denote nonterminals. Each production gives a derivation of a string of symbols from a nonterminal, which we will write as $A \rightarrow \alpha$. We define a relation between strings of symbols $\alpha$ and $\beta$, written $\alpha \vdash \beta$ and read as $\alpha$ derives $\beta$, if and only if $\alpha = \delta A \gamma$, $\beta = \delta \phi \gamma$ and there exists some production $A \rightarrow \phi$. We write the transitive closure of this relation as $\vdash_*$. We say that a string of terminals $\alpha$ is a valid sentence of the language, {\em i.e.} it is derivable, if the start symbol $S \vdash_* \alpha$. The sequence of derivations is often visualized as a parse tree. ML-Yacc uses an attribute grammar scheme with synthesized attributes. Each symbol in the grammar may have a value (i.e. attribute) associated with it. Each production has a semantic action associated with it. A production with a semantic action is called a rule. Parsers perform bottom-up, left-to-right evaluations of parse trees using semantic actions to compute values as they do so. Given a production $P = A \rightarrow \alpha$, the corresponding semantic action is used to compute a value for $A$ from the values of the symbols in $\alpha$. If $A$ has no value, the semantic action is still evaluated but the value is ignored. Each parse returns the value associated with the start symbol $S$ of the grammar. A parse returns a nullary value if the start symbol does not carry a value. The synthesized attribute scheme can be adapted easily to inherited attributes. An inherited attribute is a value which propagates from a nonterminal to the symbols produced by the nonterminal according to some rule. Since functions are values in ML, the semantic actions for the derived symbols can return functions which takes the inherited value as an argument. \subsection{Modules} ML-Yacc uses the ML modules facility to specify the interface between a parser that it generates and a lexical analyzer that must be supplied by you. It also uses the ML modules facility to factor out a set of modules that are common to every generated parser. These common modules include a parsing structure, which contains an error-correcting LR parser\footnote{A plain LR parser is also available.}, an LR table structure, and a structure which defines the representation of terminals. ML-Yacc produces a functor for a particular parser parameterized by the LR table structure and the representation of terminals. This functor contains values specific to the parser, such as the LR table for the parser\footnote{The LR table is a value. The LR table structure defines an abstract LR table type.}, the semantic actions for the parser, and a structure containing the terminals for the parser. ML-Yacc produces a signature for the structure produced by applying this functor and another signature for the structure containing the terminals for the parser. You must supply a functor for the lexing module parameterized this structure. Figure 1 is a dependency diagram of the modules that summarizes this information. A module at the head of an arrow is dependent on the module at the tail. \begin{figure} \begin{tabular}{|rcl|} \hline parsing structure & $\longrightarrow$ & values for a particular parser\\ values for a particular parser & $\longrightarrow$ & lexical analyzer\\ parsing structure, & $\longrightarrow$ & particular parser\\ values for a particular parser, & & \\ lexical analyzer & & \\ \hline \end{tabular} \caption{Module Dependencies} \end{figure} \subsection{Error Recovery} The error recovery algorithm is able to accurately recover from many single token syntax errors. It tries to make a single token correction at the token in the input stream at which the syntax error was detected and any of the 15 tokens\footnote{An arbitrary number chosen because numbers above this do not seem to improve error correction much.} before that token. The algorithm checks corrections before the point of error detection because a syntax error is often not detected until several tokens beyond the token which caused the error.\footnote{An LR parser detects a syntax error as soon as possible, but this does not necessarily mean that the token at which the error was detected caused the error.} The algorithm works by trying corrections at each of the 16 tokens up to and including the token at which the error was detected. At each token in the input stream, it will try deleting the token, substituting other tokens for the token, or inserting some other token before the token. The algorithm uses a parse check to evaluate corrections. A parse check is a check of how far a correction allows a parser to parse without encountering a syntax error. You pass an upper bound on how many tokens beyond the error point a parser may read while doing a parse check as an argument to the parser. This allows you to control the amount of lookahead that a parser reads for different kinds of systems. For an interactive system, you should set the lookahead to zero. Otherwise, a parser may hang waiting for input in the case of a syntax error. If the lookahead is zero, no syntax errors will be corrected. For a batch system, you should set the lookahead to 15. The algorithm selects the set of corrections which allows the parse to proceed the farthest and parse through at least the error token. It then removes those corrections involving keywords which do not meet a longer minimum parse check. If there is more than one correction possible after this, it uses a simple heuristic priority scheme to order the corrections, and then arbitrarily chooses one of the corrections with the highest priority. You have some control over the priority scheme by being able to name a set of preferred insertions and a set of preferred substitutions. The priorities for corrections, ordered from highest to lowest priority, are preferred insertions, preferred substitutions, insertions, deletions, and substitutions. The error recovery algorithm is guaranteed to terminate since it always selects fixes which parse through the error token. The error-correcting LR parser implements the algorithm by keeping a queue of its state stacks before shifting tokens and using a lazy stream for the lexer. This makes it possible to restart the parse from before an error point and try various corrections. The error-correcting LR parser does not defer semantic actions. Instead, ML-Yacc creates semantic actions which are free of side-effects and always terminate. ML-Yacc uses higher-order functions to defer the evaluation of all user semantic actions until the parse is successfully completed without constructing an explicit parse tree. You may declare whether your semantic actions are free of side-effects and always terminate, in which case ML-Yacc does not need to defer the evaluation of your semantic actions. \subsection{Precedence} ML-Yacc uses the same precedence scheme as Yacc for resolving shift/reduce conflicts. Each terminal may be assigned a precedence and associativity. Each rule is then assigned the precedence of its rightmost terminal. If a shift/reduce conflict occurs, the conflict is resolved silently if the terminal and the rule in the conflict have precedences. If the terminal has the higher precedence, the shift is chosen. If the rule has the higher precedence, the reduction is chosen. If both the terminal and the rule have the same precedence, then the associativity of the terminal is used to resolve the conflict. If the terminal is left associative, the reduction is chosen. If the terminal is right associative, the shift is chosen. Terminals may be declared to be nonassociative, also, in which case an error message is produced if the associativity is need to resolve the parsing conflict. If a terminal or a rule in a shift/reduce conflict does not have a precedence, then an error message is produced and the shift is chosen. In reduce/reduce conflicts, an error message is always produced and the first rule listed in the specification is chosen for reduction. \subsection{Notation} Text surrounded by brackets denotes meta-notation. If you see something like \{parser name\}, you should substitute the actual name of your parser for the meta-notation. Text in a bold-face typewriter font ({\tt like this}) denotes text in a specification or ML code. \section{ML-Yacc specifications} An ML-Yacc specification consists of three parts, each of which is separated from the others by a {\tt \%\%} delimiter. The general format is: \begin{quote} \tt \{user declarations\} \\ \%\% \\ \{ML-Yacc declarations\} \\ \%\% \\ \{rules\} \end{quote} You can define values available in the semantic actions of the rules in the user declarations section. It is recommended that you keep the size of this section as small as possible and place large blocks of code in other modules. The ML-Yacc declarations section is used to make a set of required declarations and a set of optional declarations. You must declare the nonterminals and terminals and the types of the values associated with them there. You must also name the parser and declare the type of position values. You should specify the set of terminals which can follow the start symbol and the set of non-shiftable terminals. You may optionally declare precedences for terminals, make declarations that will improve error-recovery, and suppress the generation of default reductions in the parser. You may declare whether the parser generator should create a verbose description of the parser in a ``.desc'' file. This is useful for finding the causes of shift/reduce errors and other parsing conflicts. You may also declare whether the semantic actions are free of significant side-effects and always terminate. Normally, ML-Yacc delays the evaluation of semantic actions until the completion of a successful parse. This ensures that there will be no semantic actions to ``undo'' if a syntactic error-correction invalidates some semantic actions. If, however, the semantic actions are free of significant side-effects and always terminate, the results of semantic actions that are invalidated by a syntactic error-correction can always be safely ignored. Parsers run faster and need less memory when it is not necessary to delay the evaluation of semantic actions. You are encouraged to write semantic actions that are free of side-effects and always terminate and to declare this information to ML-Yacc. A semantic action is free of significant side-effects if it can be reexecuted a reasonably small number of times without affecting the result of a parse. (The reexecution occurs when the error-correcting parser is testing possible corrections to fix a syntax error, and the number of times reexecution occurs is roughly bounded, for each syntax error, by the number of terminals times the amount of lookahead permitted for the error-correcting parser). The rules section contains the context-free grammar productions and their associated semantic actions. \subsection{Lexical Definitions} Comments have the same lexical definition as they do in Standard ML and can be placed anywhere in a specification. All characters up to the first occurrence of a delimiting {\tt \%\%} outside of a comment are placed in the user declarations section. After that, the following words and symbols are reserved: \begin{quote} \verb'of for = { } , * -> : | ( )' \end{quote} The following classes of ML symbols are used: \begin{quote} \begin{description} \item[identifiers:] nonsymbolic ML identifiers, which consist of an alphabetic character followed by one or more alphabetic characters, numeric characters, primes ``{\tt '}'', or underscores ``{\tt \_}''. \item[type variables:] nonsymbolic ML identifier starting with a prime ``{\tt '}'' \item[integers:] one or more decimal digits. \item[qualified identifiers:] an identifer followed by a period. \end{description} \end{quote} The following classes of non-ML symbols are used: \begin{quote} \begin{description} \item[\% identifiers:] a percent sign followed by one or more lowercase alphabet letters. The valid \% identifiers are: \begin{quote} \raggedright \tt \%arg \%eop \%header \%keyword \%left \%name \%nodefault \%nonassoc \%nonterm \%noshift \%pos \%prec \%prefer \%pure \%right \%start \%subst \%term \%value \%verbose \end{quote} \item[code:] This class is meant to hold ML code. The ML code is not parsed for syntax errors. It consists of a left parenthesis followed by all characters up to a balancing right parenthesis. Parentheses in ML comments and ML strings are excluded from the count of balancing parentheses. \end{description} \end{quote} \subsection{Grammar} This is the grammar for specifications: \begin{eqnarray*} \mbox{spec} & ::= & \mbox{user-declarations {\tt \%\%} cmd-list {\tt \%\%} rule-list} \\ \mbox{ML-type} & ::= & \mbox{nonpolymorphic ML types (see the Standard ML manual)} \\ \mbox{symbol} & ::= & \mbox{identifier} \\ \mbox{symbol-list} & ::= & \mbox{symbol-list symbol} \\ & | & \epsilon \\ \mbox{symbol-type-list} & ::= & \mbox{symbol-type-list {\tt |} symbol {\tt of} ML-type} \\ & | & \mbox{symbol-type list {\tt |} symbol} \\ & | & \mbox{symbol {\tt of} ML-type} \\ & | & \mbox{symbol} \\ \mbox{subst-list} & ::= & \mbox{subst-list {\tt |} symbol {\tt for} symbol} \\ & | & \epsilon \\ \mbox{cmd} & ::= & \mbox{{\tt \%arg} (Any-ML-pattern) {\tt :} ML-type} \\ & | & \mbox{{\tt \%eop} symbol-list} \\ & | & \mbox{{\tt \%header} code} \\ & | & \mbox{{\tt \%keyword} symbol-list} \\ & | & \mbox{{\tt \%left} symbol-list} \\ & | & \mbox{{\tt \%name} identifier} \\ & | & \mbox{{\tt \%nodefault}} \\ & | & \mbox{{\tt \%nonassoc} symbol-list} \\ & | & \mbox{{\tt \%nonterm} symbol-type list} \\ & | & \mbox{{\tt \%noshift} symbol-list } \\ & | & \mbox{{\tt \%pos} ML-type} \\ & | & \mbox{{\tt \%prefer} symbol-list} \\ & | & \mbox{\tt \%pure} \\ & | & \mbox{{\tt \%right} symbol-list} \\ & | & \mbox{{\tt \%start} symbol} \\ & | & \mbox{{\tt \%subst} subst-list} \\ & | & \mbox{{\tt \%term} symbol-type-list} \\ & | & \mbox{{\tt \%value} symbol code} \\ & | & \mbox{{\tt \%verbose}} \\ \mbox{cmd-list} & ::= &\mbox{ cmd-list cmd} \\ & | & \mbox{cmd} \\ \mbox{rule-prec} & ::= & \mbox{{\tt \%prec} symbol} \\ & | & \epsilon \\ \mbox{clause-list} & ::= & \mbox{symbol-list rule-prec code} \\ & | & \mbox{clause-list {\tt |} symbol-list rule-prec code} \\ \mbox{rule} & ::= & \mbox{symbol {\tt :} clause-list} \\ \mbox{rule-list} & ::= & \mbox{rule-list rule} \\ & | & \mbox{rule} \end{eqnarray*} \subsection{Required ML-Yacc Declarations} \begin{description} \item[{\tt \%name}] You must specify the name of the parser with {\tt \%name} \{name\}. \item[{\tt \%nonterm} and {\tt \%term}] You must define the terminal and nonterminal sets using the {\tt \%term} and {\tt \%nonterm} declarations, respectively. These declarations are like an ML datatype definition. The type of the value that a symbol may carry is defined at the same time that the symbol is defined. Each declarations consists of the keyword ({\tt \%term} or {\tt \%nonterm}) followed by a list of symbol entries separated by a bar (``{\tt |}''). Each symbol entry is a symbol name followed by an optional ``of \/ $<$ML-type$>$''. The types cannot be polymorphic. Those symbol entries without a type carry no value. Nonterminal and terminal names must be disjoint and no name may be declared more than once in either declaration. The symbol names and types are used to construct a datatype union for the values on the semantic stack in the LR parser and to name the values associated with subcomponents of a rule. The names and types of terminals are also used to construct a signature for a structure that may be passed to the lexer functor. Because the types and names are used in these manners, do not use ML keywords as symbol names. The programs produced by ML-Yacc will not compile if ML keywords are used as symbol names. Make sure that the types specified in the {\tt \%term} declaration are fully qualified types or are available in the background environment when the signatures produced by ML-Yacc are loaded. Do not use any locally defined types from the user declarations section of the specification. These requirements on the types in the {\tt \%term} declaration are not a burden. They force the types to be defined in another module, which is a good idea since these types will be used in the lexer module. \item[{\tt \%pos}] You must declare the type of position values using the {\tt \%pos} declaration. The syntax is {\tt \%pos} $<$ML-type$>$. This type MUST be the same type as that which is actually found in the lexer. It cannot be polymorphic. \end{description} \subsection{Optional ML-Yacc Declarations} \label{optional-def} \begin{description} \item[{\tt \%arg}] You may want each invocation of the entire parser to be parameterized by a particular argument, such as the file-name of the input being parsed in an invocation of the parser. The {\tt \%arg} declaration allows you to specify such an argument. (This is often cleaner than using ``global'' reference variables.) The declaration \begin{quote} {\tt \%arg} (Any-ML-pattern) {\tt :} $<$ML-type$>$ \end{quote} specifies the argument to the parser, as well as its type. For example: \begin{quote} {\tt \%arg (filename) : string} \end{quote} If {\tt \%arg} is not specified, it defaults to {\tt () : unit}. \item[{\tt \%eop} and {\tt \%noshift}] You should specify the set of terminals that may follow the start symbol, also called end-of-parse symbols, using the {\tt \%eop} declaration. The {\tt \%eop} keyword should be followed by the list of terminals. This is useful, for example, in an interactive system where you want to force the evaluation of a statement before an end-of-file (remember, a parser delays the execution of semantic actions until a parse is successful). ML-Yacc has no concept of an end-of-file. You must define an end-of-file terminal (EOF, perhaps) in the {\tt \%term} declaration. You must declare terminals which cannot be shifted, such as end-of-file, in the {\tt \%noshift} declaration. The {\tt \%noshift} keyword should be followed by the list of non-shiftable terminals. An error message will be printed if a non-shiftable terminal is found on the right hand side of any rule, but ML-Yacc will not prevent you from using such grammars. It is important to emphasize that \begin{em} non-shiftable terminals must be declared. \end{em} The error-correcting parser may attempt to read past such terminals while evaluating a correction to a syntax error otherwise. This may confuse the lexer. \item[{\tt \%header}] You may define code to head the functor \{parser name\}LrValsFun here. This may be useful for adding additonal parameter structures to the functor. The functor must be parameterized by the Token structure, so the declaration should always have the form: \begin{quote} \begin{verbatim} %header (functor {parser name}LrValsFun( structure Token : TOKEN ...) ) \end{verbatim} \end{quote} \item[{\tt \%left},{\tt \%right},{\tt \%nonassoc}] You should list the precedence declarations in order of increasing (tighter-binding) precedence. Each precedence declaration consists of \% keyword specifying associativity followed by a list of terminals. The keywords are {\tt \%left}, {\tt \%right}, and {\tt \%nonassoc}, standing for their respective associativities. \item[{\tt \%nodefault}] The {\tt \%nodefault} declaration suppresses the generation of default reductions. If only one production can be reduced in a given state in an LR table, it may be made the default action for the state. An incorrect reduction will be caught later when the parser attempts to shift the lookahead terminal which caused the reduction. ML-Yacc usually produces programs and verbose files with default reductions. This saves a great deal of space in representing the LR tables,but sometimes it is useful for debugging and advanced uses of the parser to suppress the generation of default reductions. \item[{\tt \%pure}] Include the {\tt \%pure} declaration if the semantic actions are free of significant side-effects and always terminate. \item[{\tt \%start}] You may define the start symbol using the {\tt \%start} declaration. Otherwise the nonterminal for the first rule will be used as the start nonterminal. The keyword {\tt \%start} should be followed by the name of the starting nonterminal. This nonterminal should not be used on the right hand side of any rules, to avoid conflicts between reducing to the start symbol and shifting a terminal. ML-Yacc will not prevent you from using such grammars, but it will print a warning message. \item[{\tt \%verbose}] Include the {\tt \%verbose} declaration to produce a verbose description of the LALR parser. The name of this file is the name of the specification file with a ``.desc'' appended to it. This file has the following format: \begin{enumerate} \item A summary of errors found while generating the LALR tables. \item A detailed description of all errors. \item A description of the states of the parser. Each state is preceded by a list of conflicts in the state. \end{enumerate} \end{description} \subsection{Declarations for improving error-recovery} These optional declarations improve error-recovery: \begin{description} \item[{\tt \%keyword}] Specify all keywords in a grammar here. The {\tt \%keyword} should be followed by a list of terminal names. Fixes involving keywords are generally dangerous; they are prone to substantially altering the syntactic meaning of the program. They are subject to a more rigorous parse check than other fixes. \item[{\tt \%prefer}] List terminals to prefer for insertion after the {\tt \%prefer}. Corrections which insert a terminal on this list will be chosen over other corrections, all other things being equal. \item[{\tt \%subst}] This declaration should be followed by a list of clauses of the form \{terminal\} {\tt for} \{terminal\}, where items on the list are separated using a {\tt |}. Substitution corrections on this list will be chosen over all other corrections except preferred insertion corrections (listed above), all other things being equal. \item[{\tt \%change}] This is a generalization of {\tt \%prefer} and {\tt \%subst}. It takes a the following syntax: \begin{quote} ${\it tokens}_{1a}$ \verb|->| ${\it tokens}_{1b}$ \verb+|+ ${\it tokens}_{2a}$ \verb|->| ${\it tokens}_{2b}$ {\it etc.} \end{quote} where each {\it tokens} is a (possibly empty) seqence of tokens. The idea is that any instance of ${\it tokens}_{1a}$ can be ``corrected'' to ${\it tokens}_{1b}$, and so on. For example, to suggest that a good error correction to try is \verb|IN ID END| (which is useful for the ML parser), write, \begin{verbatim} %change -> IN ID END \end{verbatim} \item[{\tt \%value}] The error-correction algorithm may also insert terminals with values. You must supply a value for such a terminal. The keyword should be followed by a terminal and a piece of code (enclosed in parentheses) that when evaluated supplies the value. There must be a separate {\tt \%value} declaration for each terminal with a value that you wish may be inserted or substituted in an error correction. The code for the value is not evaluated until the parse is successful. Do not specify a {\tt \%value} for terminals without values. This will result in a type error in the program produced by ML-Yacc. \end{description} \subsection{Rules} All rules are declared in the final section, after the last {\tt \%\%} delimiter. A rule consists of a left hand side nonterminal, followed by a colon, followed by a list of right hand side clauses. The right hand side clauses should be separated by bars (``{\tt |}''). Each clause consists of a list of nonterminal and terminal symbols, followed by an optional {\tt \%prec} declaration, and then followed by the code to be evaluated when the rule is reduced. The optional {\tt \%prec} consists of the keyword {\tt \%prec} followed by a terminal whose precedence should be used as the precedence of the rule. The values of those symbols on the right hand side which have values are available inside the code. Positions for all the symbols are also available. Each value has the general form \{symbol name\}\{n+1\}, where \{n\} is the number of occurrences of the symbol to the left of the symbol. If the symbol occurs only once in the rule, \{symbol name\} may also be used. The positions are given by \{symbol~name\}\{n+1\}left and \{symbol~name\}\{n+1\}right. where \{n\} is defined as before. The position for a null rhs of a production is assumed to be the leftmost position of the lookahead terminal which is causing the reduction. This position value is available in {\tt defaultPos}. The value to which the code evaluates is used as the value of the nonterminal. The type of the value and the nonterminal must match. The value is ignored if the nonterminal has no value, but is still evaluated for side-effects. \section{Producing files with ML-Yacc} ML-Yacc may be used from the interactive system or built as a stand-alone program which may be run from the Unix command line. See the file {\bf README} in the mlyacc directory for directions on installing ML-Yacc. We recommend thaat ML-Yacc be installed as a stand-alone program. If you are using the stand-alone version of ML-Yacc, invoke the program ``sml-yacc'' with the name of the specifcation file. If you are using ML-Yacc in the interactive system, load the file ``smlyacc.sml''. The end result is a structure ParseGen, with one value parseGen in it. Apply parseGen to a string containing the name of the specification file. Two files will be created, one named by attaching ``.sig'' to the name of the specification, the other named by attaching ``.sml'' to the name of the specification. \section{The lexical analyzer} Let the name for the parser given in the {\tt \%name} declaration be denoted by \{n\} and the specification file name be denoted by \{spec name\} The parser generator creates a functor named \{n\}LrValsFun for the values needed for a particular parser. This functor is placed in \{spec name\}.sml. This functor contains a structure Tokens which allows you to construct terminals from the appropriate values. The structure has a function for each terminal that takes a tuple consisting of the value for the terminal (if there is any), a leftmost position for the terminal, and a rightmost position for the terminal and constructs the terminal from these values. A signature for the structure Tokens is created and placed in the ``.sig'' file created by ML-Yacc. This signature is \{n\}\_TOKENS, where \{n\} is the name given in the parser specification. A signature \{n\}\_LRVALS is created for the structure produced by applying \{n\}LrValsFun. Use the signature \{n\}\_TOKENS to create a functor for the lexical analyzer which takes the structure Tokens as an argument. The signature \{n\}\_TOKENS will not change unless the {\tt \%term} declaration in a specification is altered by adding terminals or changing the types of terminals. You do not need to recompile the lexical analyzer functor each time the specification for the parser is changed if the signature \{n\}\_TOKENS does not change. If you are using ML-Lex to create the lexical analyzer, you can turn the lexer structure into a functor using the {\tt \%header} declaration. {\tt \%header} allows the user to define the header for a structure body. If the name of the parser in the specification were Calc, you would add this declaration to the specification for the lexical analyzer: \begin{quote} \tt \begin{verbatim} %header (functor CalcLexFun(structure Tokens : Calc_TOKENS)) \end{verbatim} \end{quote} You must define the following in the user definitions section: \begin{quote} \tt \begin{verbatim} type pos \end{verbatim} \end{quote} This is the type of position values for terminals. This type must be the same as the one declared in the specification for the grammar. Note, however, that this type is not available in the Tokens structure that parameterizes the lexer functor. You must include the following code in the user definitions section of the ML-Lex specification: \begin{quote} \tt \begin{verbatim} type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token \end{verbatim} \end{quote} These types are used to give lexers signatures. You may use a lexer constructed using ML-Lex with the {\tt \%arg} declaration, but you must follow special instructions for tying the parser and lexer together. \section{Creating the parser} \label{create-parser} Let the name of the grammar specification file be denoted by \{grammar\} and the name of the lexer specification file be denoted by \{lexer\} (e.g. in our calculator example these would stand for calc.grm and calc.lex, respectively). Let the parser name in the specification be represented by \{n\} (e.g. Calc in our calculator example). To construct a parser, do the following: \begin{enumerate} \item In the appropriate CM description file (e.g. for your main program or one of its subgroups or libraries), include the lines: \begin{quote} \begin{verbatim} ml-yacc-lib.cm {lexer} {grammar} \end{verbatim} \end{quote} This will cause ML-Yacc to be run on \{grammar\}, producing source files \{grammar\}.sig and \{grammar\}.sml, and ML-Lex to be run on \{lexer\}, producing a source file \{lexer\}.sml. Then these files will be compiled after loading the necessary signatures and modules from the ML-Yacc library as specified by {\tt ml-yacc-lib.cm}. \item Apply functors to create the parser: \begin{quote} \begin{verbatim} structure {n}LrVals = {n}LrValsFun(structure Token = LrParser.Token) structure {n}Lex = {n}LexFun(structure Tokens = {n}LrVals.Tokens) structure {n}Parser= Join(structure ParserData = {n}LrVals.ParserData structure Lex={n}Lex structure LrParser=LrParser) \end{verbatim} \end{quote} If the lexer was created using the {\tt \%arg} declaration in ML-Lex, the definition of \{n\}Parser must be changed to use another functor called JoinWithArg: \begin{quote} \begin{verbatim} structure {n}Parser= JoinWithArg (structure ParserData={n}LrVals.ParserData structure Lex={n}Lex structure LrParser=LrParser) \end{verbatim} \end{quote} \end{enumerate} The following outline summarizes this process: \begin{quote} \begin{verbatim} (* available at top level *) TOKEN LR_TABLE STREAM LR_PARSER PARSER_DATA structure LrParser : LR_PARSER (* printed out in .sig file created by parser generator: *) signature {n}_TOKENS = sig structure Token : TOKEN type svalue val PLUS : 'pos * 'pos -> (svalue,'pos) Token.token val INTLIT : int * 'pos * 'pos -> (svalue,'pos) Token.token ... end signature {n}_LRVALS = sig structure Tokens : {n}_TOKENS structure ParserData : PARSER_DATA sharing ParserData.Token = Tokens.Token sharing type ParserData.svalue = Tokens.svalue end (* printed out by lexer generator: *) functor {n}LexFun(structure Tokens : {n}_TOKENS)= struct ... end (* printed out in .sml file created by parser generator: *) functor {n}LrValsFun(structure Token : TOKENS) = struct structure ParserData = struct structure Token = Token (* code in header section of specification *) structure Header = ... type svalue = ... type result = ... type pos = ... structure Actions = ... structure EC = ... val table = ... end structure Tokens : {n}_TOKENS = struct structure Token = ParserData.Token type svalue = ... fun PLUS(p1,p2) = ... fun INTLIT(i,p1,p2) = ... end end (* to be done by the user: *) structure {n}LrVals = {n}LrValsFun(structure Token = LrParser.Token) structure {n}Lex = {n}LexFun(structure Tokens = {n}LrVals.Tokens) structure {n}Parser = Join(structure Lex = {n}Lex structure ParserData = {n}ParserData structure LrParser = LrParser) \end{verbatim} \end{quote} \section{Using the parser} \subsection{Parser Structure Signatures} The final structure created will have the signature PARSER: \begin{quote} \begin{verbatim} signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type pos (* pos is the type of line numbers *) type result (* value returned by the parser *) type arg (* type of the user-supplied argument *) type svalue (* the types of semantic values *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} or the signature ARG\_PARSER if you used {\tt \%arg} to create the lexer. This signature differs from ARG\_PARSER in that it which has an additional type {\tt lexarg} and a different type for {\tt makeLexer}: \begin{quote} \begin{verbatim} type lexarg val makeLexer : (int -> string) -> lexarg -> (svalue,pos) token stream \end{verbatim} \end{quote} The signature STREAM (providing lazy streams) is: \begin{quote} \begin{verbatim} signature STREAM = sig type 'a stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end \end{verbatim} \end{quote} \subsection{Using the parser structure} The parser structure converts the lexing function produced by ML-Lex into a function which creates a lazy stream of tokens. The function {\tt makeLexer} takes the same values as the corresponding {\tt makeLexer} created by ML-Lex, but returns a stream of tokens instead of a function which yields tokens. The function parse takes the token stream and some other arguments that are described below and parses the token stream. It returns a pair composed of the value associated with the start symbol and the rest of the token stream. The rest of the token stream includes the end-of-parse symbol which caused the reduction of some rule to the start symbol. The function parse raises the exception ParseError if a syntax error occurs which it cannot fix. The lazy stream is implemented by the {\tt Stream} structure. The function {\tt streamify} converts a conventional implementation of a stream into a lazy stream. In a conventional implementation of a stream, a stream consists of a position in a list of values. Fetching a value from a stream returns the value associated with the position and updates the position to the next element in the list of values. The fetch is a side-effecting operation. In a lazy stream, a fetch returns a value and a new stream, without a side-effect which updates the position value. This means that a stream can be repeatedly re-evaluated without affecting the values that it returns. If $f$ is the function that is passed to {\tt streamify}, $f$ is called only as many times as necessary to construct the portion of the list of values that is actually used. Parse also takes an integer giving the maximum amount of lookahead permitted for the error-correcting parse, a function to print error messages, and a value of type arg. The maximum amount of lookahead for interactive systems should be zero. In this case, no attempt is made to correct any syntax errors. For non-interactive systems, try 15. The function to print error messages takes a tuple of values consisting of the left and right positions of the terminal which caused the error and an error message. If the {\tt \%arg} declaration is not used, the value of type arg should be a value of type unit. The function sameToken can be used to see if two tokens denote the same terminal, irregardless of any values that the tokens carry. It is useful if you have multiple end-of-parse symbols and must check which end-of-parse symbol has been left on the front of the token stream. The types have the following meanings. The type {\tt arg} is the type of the additional argument to the parser, which is specified by the {\tt \%arg} declaration in the ML-Yacc specification. The type {\tt lexarg} is the optional argument to lexers, and is specified by the {\tt \%arg} declaration in an ML-Lex specifcation. The type {\tt pos} is the type of line numbers, and is specified by the {\tt \%pos} declaration in an ML-Yacc specification and defined in the user declarations section of the ML-Lex specification. The type {\tt result} is the type associated with the start symbol in the ML-Yacc specification. \section{Examples} See the directory examples for examples of parsers constructed using ML-Yacc. Here is a small sample parser and lexer for an interactive calculator, from the directory examples/calc, along with code for creating a parsing function. The calculator reads one or more expressions from the standard input, evaluates the expressions, and prints their values. Expressions should be separated by semicolons, and may also be ended by using an end-of-file. This shows how to construct an interactive parser which reads a top-level declaration and processes the declaration before reading the next top-level declaration. \subsection{Sample Grammar} \begin{tt} \begin{verbatim} (* Sample interactive calculator for ML-Yacc *) fun lookup "bogus" = 10000 | lookup s = 0 %% %eop EOF SEMI (* %pos declares the type of positions for terminals. Each symbol has an associated left and right position. *) %pos int %left SUB PLUS %left TIMES DIV %right CARAT %term ID of string | NUM of int | PLUS | TIMES | PRINT | SEMI | EOF | CARAT | DIV | SUB %nonterm EXP of int | START of int option %name Calc %subst PRINT for ID %prefer PLUS TIMES DIV SUB %keyword PRINT SEMI %noshift EOF %value ID ("bogus") %nodefault %verbose %% (* the parser returns the value associated with the expression *) START : PRINT EXP (print EXP; print "\n"; flush_out std_out; SOME EXP) | EXP (SOME EXP) | (NONE) EXP : NUM (NUM) | ID (lookup ID) | EXP PLUS EXP (EXP1+EXP2) | EXP TIMES EXP (EXP1*EXP2) | EXP DIV EXP (EXP1 div EXP2) | EXP SUB EXP (EXP1-EXP2) | EXP CARAT EXP (let fun e (m,0) = 1 | e (m,l) = m*e(m,l-1) in e (EXP1,EXP2) end) \end{verbatim} \end{tt} \subsection{Sample Lexer} \begin{tt} \begin{verbatim} structure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val pos = ref 0 val eof = fn () => Tokens.EOF(!pos,!pos) val error = fn (e,l : int,_) => output(std_out,"line " ^ (makestring l) ^ ": " ^ e ^ "\n") %% %header (functor CalcLexFun(structure Tokens: Calc_TOKENS)); alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (pos := (!pos) + 1; lex()); {ws}+ => (lex()); {digit}+ => (Tokens.NUM (revfold (fn (a,r) => ord(a)-ord("0")+10*r) (explode yytext) 0, !pos,!pos)); "+" => (Tokens.PLUS(!pos,!pos)); "*" => (Tokens.TIMES(!pos,!pos)); ";" => (Tokens.SEMI(!pos,!pos)); {alpha}+ => (if yytext="print" then Tokens.PRINT(!pos,!pos) else Tokens.ID(yytext,!pos,!pos) ); "-" => (Tokens.SUB(!pos,!pos)); "^" => (Tokens.CARAT(!pos,!pos)); "/" => (Tokens.DIV(!pos,!pos)); "." => (error ("ignoring bad character "^yytext,!pos,!pos); lex()); \end{verbatim} \end{tt} \subsection{Top-level code} You must follow the instructions in Section~\ref{create-parser} to create the parser and lexer functors and load them. After you have done this, you must then apply the functors to produce the {\tt CalcParser} structure. The code for doing this is shown below. \begin{quote} \begin{verbatim} structure CalcLrVals = CalcLrValsFun(structure Token = LrParser.Token) structure CalcLex = CalcLexFun(structure Tokens = CalcLrVals.Tokens); structure CalcParser = Join(structure LrParser = LrParser structure ParserData = CalcLrVals.ParserData structure Lex = CalcLex) \end{verbatim} \end{quote} Now we need a function which given a lexer invokes the parser. The function {\tt invoke} does this. \begin{quote} \begin{verbatim} fun invoke lexstream = let fun print_error (s,i:int,_) = TextIO.output(TextIO.stdOut, "Error, line " ^ (Int.toString i) ^ ", " ^ s ^ "\n") in CalcParser.parse(0,lexstream,print_error,()) end \end{verbatim} \end{quote} Finally, we need a function which can read one or more expressions from the standard input. The function {\tt parse}, shown below, does this. It runs the calculator on the standard input and terminates when an end-of-file is encountered. \begin{quote} \begin{verbatim} fun parse () = let val lexer = CalcParser.makeLexer (fn _ => TextIO.inputLine TextIO.stdIn) val dummyEOF = CalcLrVals.Tokens.EOF(0,0) val dummySEMI = CalcLrVals.Tokens.SEMI(0,0) fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = CalcParser.Stream.get lexer in case result of SOME r => TextIO.output(TextIO.stdOut, "result = " ^ (Int.toString r) ^ "\n") | NONE => (); if CalcParser.sameToken(nextToken,dummyEOF) then () else loop lexer end in loop lexer end \end{verbatim} \end{quote} \section{Signatures} This section contains signatures used by ML-Yacc for structures in the file base.sml, functors and structures that it generates, and for the signatures of lexer structures supplied by you. \subsection{Parsing structure signatures} \begin{quote} \begin{verbatim} (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'a stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end (* LR_TABLE: signature for an LR Table.*) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature for the internal structure of a token.*) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse: {table : LrTable.table, lexer : ('b,'c) Token.token Stream.stream, arg: 'arg, saction : int * 'c * (LrTable.state * ('b * 'c * 'c)) list * 'arg -> LrTable.nonterm * ('b * 'c * 'c) * ((LrTable.state *('b * 'c * 'c)) list), void : 'b, ec: {is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_subst:LrTable.term -> LrTable.term list, preferred_insert : LrTable.term -> bool, errtermvalue : LrTable.term -> 'b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * 'c * 'c -> unit }, lookahead : int (* max amount of lookahead used in * error correction *) } -> 'b * (('b,'c) Token.token Stream.stream) end \end{verbatim} \end{quote} \subsection{Lexers} Lexers for use with ML-Yacc's output must match one of these signatures. \begin{quote} \begin{verbatim} signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue, UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token. *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue, UserDeclarations.pos) UserDeclarations.token end \end{verbatim} \end{quote} \subsection{Signatures for the functor produced by ML-Yacc} The following signature is used in signatures generated by ML-Yacc: \begin{quote} \begin{verbatim} (* PARSER_DATA: the signature of ParserData structures in {n}LrValsFun functor produced by ML-Yacc. All such structures match this signature. *) signature PARSER_DATA = sig type pos (* the type of line numbers *) type svalue (* the type of semantic values *) type arg (* the type of the user-supplied *) (* argument to the parser *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg -> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_subst: LrTable.term -> LrTable.term list val preferred_insert : LrTable.term -> bool val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end \end{verbatim} \end{quote} ML-Yacc generates these two signatures: \begin{quote} \begin{verbatim} (* printed out in .sig file created by parser generator: *) signature {n}_TOKENS = sig type ('a,'b) token type svalue ... end signature {n}_LRVALS = sig structure Tokens : {n}_TOKENS structure ParserData : PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end \end{verbatim} \end{quote} \subsection{User parser signatures} Parsers created by applying the Join functor will match this signature: \begin{quote} \begin{verbatim} signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type pos (* pos is the type of line numbers *) type result (* value returned by the parser *) type arg (* type of the user-supplied argument *) type svalue (* the types of semantic values *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} Parsers created by applying the JoinWithArg functor will match this signature: \begin{quote} \begin{verbatim} signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} \section{Sharing constraints} Let the name of the parser be denoted by \{n\}. If you have not created a lexer which takes an argument, and you have followed the directions given earlier for creating the parser, you will have the following structures with the following signatures: \begin{quote} \begin{verbatim} (* always present *) signature TOKEN signature LR_TABLE signature STREAM signature LR_PARSER signature PARSER_DATA structure LrParser : LR_PARSER (* signatures generated by ML-Yacc *) signature {n}_TOKENS signature {n}_LRVALS (* structures created by you *) structure {n}LrVals : {n}_LRVALS structure Lex : LEXER structure {n}Parser : PARSER \end{verbatim} \end{quote} The following sharing constraints will exist: \begin{quote} \begin{verbatim} sharing {n}Parser.Token = LrParser.Token = {n}LrVals.ParserData.Token sharing {n}Parser.Stream = LrParser.Stream sharing type {n}Parser.arg = {n}LrVals.ParserData.arg sharing type {n}Parser.result = {n}LrVals.ParserData.result sharing type {n}Parser.pos = {n}LrVals.ParserData.pos = Lex.UserDeclarations.pos sharing type {n}Parser.svalue = {n}LrVals.ParserData.svalue = {n}LrVals.Tokens.svalue = Lex.UserDeclarations.svalue sharing type {n}Parser.Token.token = {n}LrVals.ParserData.Token.token = LrParser.Token.token = Lex.UserDeclarations.token sharing {n}LrVals.LrTable = LrParser.LrTable \end{verbatim} \end{quote} If you used a lexer which takes an argument, then you will have: \begin{quote} \begin{verbatim} structure ARG_LEXER structure {n}Parser : PARSER (* additional sharing constraint *) sharing type {n}Parser.lexarg = Lex.UserDeclarations.arg \end{verbatim} \end{quote} \section{Hints} \subsection{Multiple start symbols} To have multiple start symbols, define a dummy token for each start symbol. Then define a start symbol which derives the multiple start symbols with dummy tokens placed in front of them. When you start the parser you must place a dummy token on the front of the lexer stream to select a start symbol from which to begin parsing. Assuming that you have followed the naming conventions used before, create the lexer using the makeLexer function in the \{n\}Parser structure. Then, place the dummy token on the front of the lexer: \begin{quote} \begin{verbatim} val dummyLexer = {n}Parser.Stream.cons ({n}LrVals.Tokens.{dummy token name} ({dummy lineno},{dummy lineno}), lexer) \end{verbatim} \end{quote} You have to pass a Tokens structure to the lexer. This Tokens structure contains functions which construct tokens from values and line numbers. So to create your dummy token just apply the appropriate token constructor function from this Tokens structure to a value (if there is one) and the line numbers. This is exactly what you do in the lexer to construct tokens. Then you must place the dummy token on the front of your lex stream. The structure \{n\}Parser contains a structure Stream which implements lazy streams. So you just cons the dummy token on to stream returned by makeLexer. \subsection{Functorizing things further} You may wish to functorize things even further. Two possibilities are turning the lexer and parser structures into closed functors, that is, functors which do not refer to types or values defined outside their body or outside their parameter structures (except for pervasive types and values), and creating a functor which encapsulates the code necessary to invoke the parser. Use the {\tt \%header} declarations in ML-Lex and ML-Yacc to create closed functors. See section~\ref{optional-def} of this manual and section 4 of the manual for ML-Lex for complete descriptions of these declarations. If you do this, you should also parameterize these structures by the types of line numbers. The type will be an abstract type, so you will also need to define all the valid operations on the type. The signature INTERFACE, defined below, shows one possible signature for a structure defining the line number type and associated operations. If you wish to encapsulate the code necessary to invoke the parser, your functor generally will have form: \begin{quote} \begin{verbatim} functor Encapsulate( structure Parser : PARSER structure Interface : INTERFACE sharing type Parser.arg = Interface.arg sharing type Parser.pos = Interface.pos sharing type Parser.result = ... structure Tokens : {parser name}_TOKENS sharing type Tokens.token = Parser.Token.token sharing type Tokens.svalue = Parser.svalue) = struct ... end \end{verbatim} \end{quote} The signature INTERFACE, defined below, is a possible signature for a structure defining the types of line numbers and arguments (types pos and arg, respectively) along with operations for them. You need this structure because these types will be abstract types inside the body of your functor. \begin{quote} \begin{verbatim} signature INTERFACE = sig type pos val line : pos ref val reset : unit -> unit val next : unit -> unit val error : string * pos * pos -> unit type arg val nothing : arg end \end{verbatim} \end{quote} The directory example/fol contains a sample parser in which the code for tying together the lexer and parser has been encapsulated in a functor. \section{Acknowledgements} Nick Rothwell wrote an SLR table generator in 1988 which inspired the initial work on an ML parser generator. Bruce Duba and David MacQueen made useful suggestions about the design of the error-correcting parser. Thanks go to all the users at Carnegie Mellon who beta-tested this version. Their comments and questions led to the creation of this manual and helped improve it. \section{Bugs} There is a slight difference in syntax between ML-Lex and ML-Yacc. In ML-Lex, semantic actions must be followed by a semicolon but in ML-Yacc semantic actions cannot be followed by a semicolon. The syntax should be the same. ML-Lex also produces structures with two different signatures, but it should produce structures with just one signature. This would simplify some things. \begin{thebibliography}{9} \bibitem{bf} ``A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery'', M. Burke and G. Fisher, ACM Transactions on Programming Languages and Systems, Vol. 9, No. 2, April 1987, pp. 164-167. \bibitem{ahu} A. Aho, R. Sethi, J. Ullman, {\em Compilers: Principles, Techniques, and Tools}, Addison-Wesley, Reading, MA, 1986. \end{thebibliography} \end{document} mlton-20210117+dfsg/mlyacc/doc/tech.doc000066400000000000000000000253401416264345000174610ustar00rootroot00000000000000A Hacker's guide ML-Yacc itself The program for computing the LALR(1) table can be divided into 3 separate parts. The first part computes the LR(0) graph. The second part attaches lookahead to the LR(0) graph to get the LALR(1) graph. The third part computes the parse tables from the LALR(1) graph. Look at the file sigs.sml to see how the modules are layed out. The file graph.sml contains the Graph functor, which produces a structure containing a function mkGraph. mkGraph takes a grammar and returns a some useful values and functions, including the LR(0) graph. It renumbers the rules to an internal form to make the LR(0) graph generation more efficient. The LR(0) graph includes only core items in its set of items. The file look.sml takes some of theses values and produces functions which tell whether a nonterm is nullable and the first set of a symbol list. The functor mkLalr creates a structure with a function that takes an LR(0) graph and some other values (notably the first and nullable) functions produced by Look and creates a stripped down version of an LR(0) graph with lookaheads attached. Nullable items (which usually aren't core items) are added and all other items without dots at the end (i.e. non-reduction items) are removed. The functor MkTable produces a function with takes the LR(0) graph produced by the function in mkGraph and the LR(0) graph with lookaheads produced by Lalr and creates an LALR(1) table from these graphs. ----------------------------------------------------------------------- An overview of the algorithms used in LR(0) graph generation and LALR(1) lookahead creation. LR(0) graph ----------- The LR(0) graph consists of sets of items. Each set of items will be called a core set. The basic algorithm is: let fun add_gotos(graph,f,nil,r) = (graph,r) | add_gotos(graph,f,(a,symbol)::b,r) let newgraph = graph + edge from f to a labelled with symbol in if a exists in graph then add_gotos(newgraph,f,b,r) else add_gotos(newgraph,f,b,a::r) end fun f(graph,nil) = graph | f(graph,a::b) = f(add_gotos(graph,a,gotos of closure a,b)) in f(empty-graph,[initial core set]) end For each core, we compute the new cores which result from doing a shift or goto, and then add these new cores with the symbol used in the shift or goto to the graph. We continue doing this until there are no more cores to adds to the graph. We have to take the closure of a core to include those items which are derived from nonterminals with a dot before them. If item A -> 'a .B 'c is in a core, the all productions derived by B must also be in the core. We want to be able to do the following operations efficently: (1) check if a core is in the graph already (2) compute the closure of a core (3) compute the cores resulting from goto/shift operations. (1) This can be done efficiently if a complete order exists for the cores. This can be done by imposing an ordering on items, giving each item a unique integer and using the place in an item. This can be used to order a set of items. (2) Much of the computation for the closure can be done ahead of time. The set of nonterminals to add for a given a nonterminal can be pre-computed using a transitive closure algorithm (the transitive closure is sparse in practice). One can then compute the closure for a core in the following manner. First, compute the set of nonterminals with . in front of them. This can be done in (m ln m) time. Next, use the results from the transitive closure to compute the complete set of nonterminals that should be used. Finally, for each nonterminal, merge its set of productions (sort all rules by the nonterminals from which they are derived before numbering them, then all we have to do is just prepend the rules while scanning the list in reverse order). (3) To do this, just scan the core closure, sorting rules by their symbols into lists. Then reverse all the lists, and we have the new core sets. Lookahead representation ------------------------ The previous part throws away the result of the closure operations. It is used only to compute new cores for use in the goto operation. These intermediate results should be saved because they will be useful here. Lookaheads are attached to an item when (1) an item is the result of a shift/goto. The item must have the same lookahead as the item from which it is derived. (2) an item is added as the result of a closure. Note that in fact all productions derived from a given nonterminal are added here. This can be used (perhaps) to our advantage, as we can represent a closure using just the nonterminal. This can be divided into two cases: (a) A -> 'a .B 'c , where 'c derives epsilon, (b) A -> 'a .B 'c , where 'c does not derive epsilon In (a), lookahead(items derived from B) includes first('c) and lookahead(A -> 'a .B 'c) In (b), lookahead(items derived from B) includes only first('c). This is an example of back propagation. Note that an item is either the result of a closure or the result of a shift/goto. It is never the result of both (that would be a contradiction). The following representation will be used: goto/shift items: an ordered list of item * lookahead ref * lookahead ref for the resulting shift/goto item in another core. closure items: for each nonterminal: (1) lookahead ref (2) a list of item * lookahead ref for the resulting shift/goto item in another core. Lookahead algorithms -------------------- After computing the LR(0) graph, lookaheads must be attached to the items in the graph. An item i may receive lookaheads in two ways. If item i was the result of a shift or goto from some item j, then lookahead(i) includes lookahead(j). If item i is a production of some nonterminal B, and there exists some item j of the form A -> x .B y, then item i will be added through closure(j). This implies that lookahead(i) includes first(y). If y => epsilon, then lookahead(i) includes lookahead(j). Lookahead must be recorded for completion items, which are items of the form A -> x., non-closure items of the form A -> y . B z, where z is not nullable, and closure items of the form A -> epsilon. (comment: items of the form A -> .x can appear in the start state as non-closure items. A must be the start symbol, which should not appear in the right hand side of any rule. This implies that lookaheads will never be propagated to such items) We chose to omit closure items that do not have the form A -> epsilon. It is possible to add lookaheads to closure items, but we have not done so because it would greatly slow down the addition of lookaheads. Instead we precompute the nonterminals whose productions are added through the closure operation, the lookaheads for these nonterminals, and whether the lookahead for these nonterminals should include first(y) and lookahead(j) for some item j of the form A -> x .B y. This information depends only on the particular nonterminal whose closure is being taken. Some notation is necessary to describe what is happening here. Let =c=> denote items added in one closure step that are derived from some nonterminal B in a production A -> x .B y. Let =c+=> denote items added in one or more =c=> steps. Consider the following productions B -> S ; S -> E E -> F * E F -> num in a kernal with the item B -> .S The following derivations are possible: B -> .S =c=> S -> .E =c+=> S -> .E, E -> .F * E, F -> .num The nonterminals that are added through the closure operation are the nonterminals for some item j = A -> .B x such that j =c+=> .C y. Lookahead(C) includes first(y). If y =*=> epsilon then lookahead (C) includes first (x). If x=*=> epsilon and y =*=> epsilon then lookahead(C) includes first(j). The following algorithm computes the information for each nonterminal: (1) nonterminals such that c =c+=> .C y and y =*=> epsilon Let s = the set of nonterminals added through closure = B repeat for all B which are elements of s, if B -> .C z and z =*=> epsilon then add B to s. until s does not change. (2) nonterminals added through closure and their lookaheads Let s = the set of nonterminals added through closure = B where A -> x . B y repeat for all B which are elements of s, if B -> .C z then add C to s, and add first(z) to lookahead(C) until nothing changes. Now, for each nonterminal A in s, find the set of nonterminals such that A =c+=> .B z, and z =*=> epsilon (i.e. use the results from 1). Add the lookahead for nonterminal A to the lookahead for each nonterminal in this set. These algorithms can be restated as either breadth-first or depth-first search algorithms. The loop invariant of the algorithms is that whenever a nonterminal is added to the set being calculated, all the productions for the nonterminal are checked. This algorithm computes the lookahead for each item: for each state, for each item of the form A -> u .B v in the state, where u may be nullable, let first_v = first(v) l-ref = ref for A -> u .B v s = the set of nonterminals added through the closure of B. for each element X of s, let r = the rules produced by an element X of s l = the lookahead ref cells for each rule, i.e. all items of A -> x. or A -> x .B y, where y =*=> epsilon, and x is not epsilon add the lookahead we have computed for X to the elements of l if B =c+=> X z, where z is nullable, add first(y) to the l. If y =*=> epsilon, save l with the ref for A -> x .B y in a list. Now take the list of (lookahead ref, list of lookahead refs) and propagate each lookahead ref cell's contents to the elements of the list of lookahead ref cells associated with it. Iterate until no lookahead set changes. mlton-20210117+dfsg/mlyacc/examples/000077500000000000000000000000001416264345000171145ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/examples/calc/000077500000000000000000000000001416264345000200165ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/examples/calc/README000066400000000000000000000032451416264345000207020ustar00rootroot00000000000000This is a sample interactive calculator built using ML-Yacc and ML-Lex. The calculator is defined by the files calc.lex (* defines lexer *) calc.grm (* defines grammar *) calc.sml (* defines driver function, Calc.parse *) calc.mlb (* ML Basis file *) To compile this example, type the following commands mllex calc.lex mlyacc calc.grm mlton calc.mlb in this directory. They will invoke ml-lex and ml-yacc to process the lexer specification calc.lex and the grammar specification calc.grm respectively. Then it will compile the resulting SML source files calc.lex.sml calc.grm.sig calc.grm.sml and the calc.sml file containing the driver code. The end result of compiling these files is an executable file named "calc", that is based on the structure Calc containing a top-level driver function named parse. Calc.parse : unit -> unit The calculator can be invoked by applying Calc.parse to the unit value. - Calc.parse(); 1+3; result = 4 The calculator reads a sequence of expressions from the standard input and prints the value of each expression after reading the expression. Expressions must be separated by semicolons. An expression is not evaluated until the semicolon is encountered. The calculator terminates when an end-of-file is encountered. There is no attempt to fix input errors: a lexical error will cause exception LexError to be raised, while a syntax error will cause ParseError to be raised. NOTE: The ML Basis file calc.mlb mentions the ml-yacc library (mlyacc-lib.mlb). MLton's search path should be configured so that this library will be found. This should normally be the case if MLton is properly installed. mlton-20210117+dfsg/mlyacc/examples/calc/calc.grm000066400000000000000000000022011416264345000214220ustar00rootroot00000000000000(* Sample interactive calculator for ML-Yacc *) fun lookup "bogus" = 10000 | lookup s = 0 %% %eop EOF SEMI (* %pos declares the type of positions for terminals. Each symbol has an associated left and right position. *) %pos int %left SUB PLUS %left TIMES DIV %right CARAT %term ID of string | NUM of int | PLUS | TIMES | PRINT | SEMI | EOF | CARAT | DIV | SUB %nonterm EXP of int | START of int option %name Calc %subst PRINT for ID %prefer PLUS TIMES DIV SUB %keyword PRINT SEMI %noshift EOF %value ID ("bogus") %verbose %% (* the parser returns the value associated with the expression *) START : PRINT EXP (print (Int.toString EXP); print "\n"; SOME EXP) | EXP (SOME EXP) | (NONE) EXP : NUM (NUM) | ID (lookup ID) | EXP PLUS EXP (EXP1+EXP2) | EXP TIMES EXP (EXP1*EXP2) | EXP DIV EXP (EXP1 div EXP2) | EXP SUB EXP (EXP1-EXP2) | EXP CARAT EXP (let fun e (m,0) = 1 | e (m,l) = m*e(m,l-1) in e (EXP1,EXP2) end) mlton-20210117+dfsg/mlyacc/examples/calc/calc.lex000066400000000000000000000020021416264345000214240ustar00rootroot00000000000000structure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val pos = ref 0 fun eof () = Tokens.EOF(!pos,!pos) fun error (e,l : int,_) = TextIO.output (TextIO.stdOut, String.concat[ "line ", (Int.toString l), ": ", e, "\n" ]) %% %header (functor CalcLexFun(structure Tokens: Calc_TOKENS)); alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (pos := (!pos) + 1; lex()); {ws}+ => (lex()); {digit}+ => (Tokens.NUM (valOf (Int.fromString yytext), !pos, !pos)); "+" => (Tokens.PLUS(!pos,!pos)); "*" => (Tokens.TIMES(!pos,!pos)); ";" => (Tokens.SEMI(!pos,!pos)); {alpha}+ => (if yytext="print" then Tokens.PRINT(!pos,!pos) else Tokens.ID(yytext,!pos,!pos) ); "-" => (Tokens.SUB(!pos,!pos)); "^" => (Tokens.CARAT(!pos,!pos)); "/" => (Tokens.DIV(!pos,!pos)); "." => (error ("ignoring bad character "^yytext,!pos,!pos); lex()); mlton-20210117+dfsg/mlyacc/examples/calc/calc.mlb000066400000000000000000000002031416264345000214070ustar00rootroot00000000000000local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb calc.grm.sig calc.grm.sml calc.lex.sml in calc.sml end mlton-20210117+dfsg/mlyacc/examples/calc/calc.sml000066400000000000000000000043031416264345000214350ustar00rootroot00000000000000(* calc.sml *) (* This file provides glue code for building the calculator using the * parser and lexer specified in calc.lex and calc.grm. *) structure Calc : sig val parse : unit -> unit end = struct (* * We apply the functors generated from calc.lex and calc.grm to produce * the CalcParser structure. *) structure CalcLrVals = CalcLrValsFun(structure Token = LrParser.Token) structure CalcLex = CalcLexFun(structure Tokens = CalcLrVals.Tokens) structure CalcParser = Join(structure LrParser = LrParser structure ParserData = CalcLrVals.ParserData structure Lex = CalcLex) (* * We need a function which given a lexer invokes the parser. The * function invoke does this. *) fun invoke lexstream = let fun print_error (s,i:int,_) = TextIO.output(TextIO.stdOut, "Error, line " ^ (Int.toString i) ^ ", " ^ s ^ "\n") in CalcParser.parse(0,lexstream,print_error,()) end (* * Finally, we need a driver function that reads one or more expressions * from the standard input. The function parse, shown below, does * this. It runs the calculator on the standard input and terminates when * an end-of-file is encountered. *) fun parse () = let val lexer = CalcParser.makeLexer (fn _ => (case TextIO.inputLine TextIO.stdIn of SOME s => s | _ => "")) val dummyEOF = CalcLrVals.Tokens.EOF(0,0) val dummySEMI = CalcLrVals.Tokens.SEMI(0,0) fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = CalcParser.Stream.get lexer val _ = case result of SOME r => TextIO.output(TextIO.stdOut, "result = " ^ (Int.toString r) ^ "\n") | NONE => () in if CalcParser.sameToken(nextToken,dummyEOF) then () else loop lexer end in loop lexer end end (* structure Calc *) mlton-20210117+dfsg/mlyacc/examples/fol/000077500000000000000000000000001416264345000176745ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/examples/fol/README000066400000000000000000000031451416264345000205570ustar00rootroot00000000000000fol/README This is a sample parser for first-order logic. The grammar was contributed by Frank Pfenning. The parser is defined by the files fol.lex (* defines lexer *) fol.grm (* defines grammar *) link.sml (* constructs basic parser structures *) absyn.sml (* a trivial abstract syntax *) interface.sml (* interface to lexer and parser properties *) parse.sml (* driver functions *) fol.mlb (* ML Basis file *) To compile this example, type the following commands mllex fol.lex mlyacc fol.grm mlton fol.mlb in this directory. They will invoke ml-lex and ml-yacc to process the lexer specification fol.lex and the grammar specification fol.grm respectively. Then they will compile the resulting SML source files fol.lex.sml fol.grm.sig fol.grm.sml and the other sml source files. The end result of loading these files is a structure Parse containing the following top-level driver functions: val prog_parse : string -> Absyn.absyn (* parse a program from a string *) val query_parse : string -> Absyn.absyn (* parse a query from a string *) val file_parse : string -> Absyn.absyn (* parse a program in a file *) val top_parse : unit -> Absyn.absyn (* parse a query from the standard input *) The file list.fol is a sample input file that can be parsed using the file_parse function: - Parse.file_parse "list.fol"; NOTE: The ML Basis file fol.mlb mentions the ml-yacc library (mlyacc-lib.mlb). MLton's search path should be configured so that this library will be found. This should normally be the case if MLton is properly installed. mlton-20210117+dfsg/mlyacc/examples/fol/absyn.sml000066400000000000000000000002421416264345000215230ustar00rootroot00000000000000signature ABSYN = sig type absyn val null : absyn end structure Absyn :> ABSYN = struct datatype absyn = NULL val null = NULL endmlton-20210117+dfsg/mlyacc/examples/fol/fol.grm000066400000000000000000000037571416264345000211770ustar00rootroot00000000000000%% %header (functor FolLrValsFun (structure Token : TOKEN structure Absyn : ABSYN ) : Fol_LRVALS) %term EOF | DOT | COMMA | SEMICOLON | LPAREN | RPAREN | BACKARROW | DOUBLEARROW | ARROW | BAR | TRUE | FORALL | EXISTS | PARSEPROG | PARSEQUERY | LCID of string | UCID of string | INT of string (* gform: goal formula dform: definite clause *) %nonterm start of Absyn.absyn | clause | query | gform | dform | atom | termlist | term | varbd | id %start start %eop EOF DOT %pos int %verbose %pure %right FORALL EXISTS %left BACKARROW %right SEMICOLON %right COMMA %right DOUBLEARROW %right ARROW %left BAR %name Fol %prefer DOT %% start : PARSEPROG clause (Absyn.null) | PARSEQUERY query (Absyn.null) clause : dform () | () query : gform () | () gform : TRUE () | gform COMMA gform () (* and *) | gform SEMICOLON gform () (* disjunction *) | gform BACKARROW dform () (* implication: dform implies gform *) | gform ARROW gform BAR gform () (* if-then-else *) | FORALL varbd gform () (* universal quantification *) | EXISTS varbd gform () (* existential quantification *) | atom () (* atomic formula *) | LPAREN gform RPAREN () dform : TRUE () | dform COMMA dform () (* and *) | dform BACKARROW gform () (* gform implies dform *) | FORALL varbd dform () | atom () | LPAREN dform RPAREN () atom : LCID () | LCID LPAREN termlist RPAREN () termlist : term () | term COMMA termlist () term : id () | INT () | LCID LPAREN termlist RPAREN () varbd : LCID DOT () | UCID DOT () id : LCID () | UCID () mlton-20210117+dfsg/mlyacc/examples/fol/fol.lex000066400000000000000000000027561416264345000212000ustar00rootroot00000000000000structure Tokens = Tokens structure Interface = Interface open Interface type pos = Interface.pos type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val eof = fn () => Tokens.EOF(!line,!line) fun makeInt (s : string) = s %% %header (functor FolLexFun(structure Tokens: Fol_TOKENS structure Interface: INTERFACE) : LEXER); lcstart=[a-z!&$+/<=>?@~|#*`]|\-; ucstart=[A-Z_]; idchars={lcstart}|{ucstart}|[0-9]; lcid={lcstart}{idchars}*; ucid={ucstart}{idchars}*; ws=[\t\ ]*; num=[0-9]+; %% {ws} => (lex()); \n => (next_line(); lex()); ":-" => (Tokens.BACKARROW(!line,!line)); "," => (Tokens.COMMA(!line,!line)); ";" => (Tokens.SEMICOLON(!line,!line)); "." => (Tokens.DOT(!line,!line)); "(" => (Tokens.LPAREN(!line,!line)); ")" => (Tokens.RPAREN(!line,!line)); "->" => (Tokens.ARROW(!line,!line)); "=>" => (Tokens.DOUBLEARROW(!line,!line)); "|" => (Tokens.BAR(!line,!line)); "true" => (Tokens.TRUE(!line,!line)); "forall" => (Tokens.FORALL(!line,!line)); "exists" => (Tokens.EXISTS(!line,!line)); {lcid} => (Tokens.LCID (yytext,!line,!line)); {ucid} => (Tokens.UCID (yytext,!line,!line)); {num} => (Tokens.INT (makeInt yytext,!line,!line)); . => (error ("ignoring illegal character" ^ yytext, !line,!line); lex()); mlton-20210117+dfsg/mlyacc/examples/fol/fol.mlb000066400000000000000000000002441416264345000211500ustar00rootroot00000000000000local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb absyn.sml interface.sml fol.grm.sig fol.grm.sml fol.lex.sml parse.sml in link.sml endmlton-20210117+dfsg/mlyacc/examples/fol/interface.sml000066400000000000000000000011251416264345000223500ustar00rootroot00000000000000(* Externally visible aspects of the lexer and parser *) signature INTERFACE = sig type pos val line : pos ref val init_line : unit -> unit val next_line : unit -> unit val error : string * pos * pos -> unit type arg val nothing : arg end (* signature INTERFACE *) functor Interface () : INTERFACE = struct type pos = int val line = ref 0 fun init_line () = (line := 1) fun next_line () = (line := !line + 1) fun error (errmsg,line:pos,_) = TextIO.output(TextIO.stdOut,"Line " ^ (Int.toString line) ^ ": " ^ errmsg ^ "\n") type arg = unit val nothing = () end (* functor INTERFACE *) mlton-20210117+dfsg/mlyacc/examples/fol/link.sml000066400000000000000000000012031416264345000213420ustar00rootroot00000000000000structure FolLrVals : Fol_LRVALS = FolLrValsFun(structure Token = LrParser.Token structure Absyn = Absyn); structure Interface : INTERFACE = Interface(); structure FolLex : LEXER = FolLexFun(structure Tokens = FolLrVals.Tokens structure Interface = Interface); structure FolParser : PARSER = Join(structure ParserData = FolLrVals.ParserData structure Lex = FolLex structure LrParser = LrParser); structure Parse : PARSE = Parse (structure Absyn = Absyn structure Interface = Interface structure Parser = FolParser structure Tokens = FolLrVals.Tokens ); mlton-20210117+dfsg/mlyacc/examples/fol/list.fol000066400000000000000000000001011416264345000213410ustar00rootroot00000000000000append(nil,K,K). append(cons(X,L),K,cons(X,M)) :- append(L,K,M). mlton-20210117+dfsg/mlyacc/examples/fol/parse.sml000066400000000000000000000045341416264345000215310ustar00rootroot00000000000000(* Uses the generated lexer and parser to export parsing functions *) signature PARSE = sig structure Absyn : ABSYN (* parse a program from a string *) val prog_parse : string -> Absyn.absyn (* parse a query from a string *) val query_parse : string -> Absyn.absyn (* parse a program in a file *) val file_parse : string -> Absyn.absyn (* parse a query from the standard input *) val top_parse : unit -> Absyn.absyn end (* signature PARSE *) functor Parse (structure Absyn : ABSYN structure Interface : INTERFACE structure Parser : PARSER sharing type Parser.arg = Interface.arg sharing type Parser.pos = Interface.pos sharing type Parser.result = Absyn.absyn structure Tokens : Fol_TOKENS sharing type Tokens.token = Parser.Token.token sharing type Tokens.svalue = Parser.svalue ) : PARSE = struct structure Absyn = Absyn fun parse (dummyToken,lookahead,reader : int -> string) = let val _ = Interface.init_line() val empty = !Interface.line val dummyEOF = Tokens.EOF(empty,empty) val dummyTOKEN = dummyToken(empty,empty) fun invoke lexer = let val newLexer = Parser.Stream.cons(dummyTOKEN,lexer) in Parser.parse(lookahead,newLexer,Interface.error, Interface.nothing) end fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = Parser.Stream.get lexer in if Parser.sameToken(nextToken,dummyEOF) then result else loop lexer end in loop (Parser.makeLexer reader) end fun string_reader s = let val next = ref s in fn _ => !next before next := "" end fun prog_parse s = parse (Tokens.PARSEPROG,15,string_reader s) fun query_parse s = parse (Tokens.PARSEQUERY,15,string_reader s) fun file_parse name = let val dev = TextIO.openIn name in (parse (Tokens.PARSEPROG,15,fn i => TextIO.inputN(dev,i))) before TextIO.closeIn dev end fun top_parse () = parse (Tokens.PARSEQUERY,0,(fn i => (case TextIO.inputLine TextIO.stdIn of SOME s => s | _ => ""))) end (* functor Parse *) mlton-20210117+dfsg/mlyacc/examples/pascal/000077500000000000000000000000001416264345000203575ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/examples/pascal/README000066400000000000000000000020301416264345000212320ustar00rootroot00000000000000This is a grammar for Berkeley Pascal, hacked to be SLR, though that is not necessary because ML-Yacc supports LALR(1). To construct the parser, make this your current directory and run the following commands mlyacc pascal.grm mllex pascal.lex mlton pascal.mlb They will apply ML-Yacc to the file "pascal.grm" to create the files "pascal.grm.sig" and "pascal.grm.sml", then ML_Lex will be applied to pascal.lex to produce pascal.lex.sml. Then these generated files will be compiled together with necessary components from the ML-Yacc library supplied by the mlyacc-lib.mlb file. The end result is a structure Parser with two functions. The function parse: string -> PascalParser.result * (Parser.PascalParser.svalue,PascalParser.pos) LrParser.Token.token LrParser.stream parses input from a file, while keybd: unit -> Parser.PascalParser.result * (Parser.PascalParser.svalue,Parser.PascalParser.pos) LrParser.Token.token LrParser.stream parses from the standard input. mlton-20210117+dfsg/mlyacc/examples/pascal/parser.sml000066400000000000000000000025131416264345000223710ustar00rootroot00000000000000(* parser.sml *) (* driver for Pascal parser *) structure Parser = struct structure PascalLrVals = PascalLrValsFun(structure Token = LrParser.Token) structure PascalLex = PascalLexFun(structure Tokens = PascalLrVals.Tokens) structure PascalParser = Join(structure Lex= PascalLex structure LrParser = LrParser structure ParserData = PascalLrVals.ParserData) fun parse s = let val dev = TextIO.openIn s val stream = PascalParser.makeLexer(fn i => TextIO.inputN(dev,i)) fun error (e,i:int,_) = TextIO.output(TextIO.stdOut, s ^ "," ^ " line " ^ (Int.toString i) ^ ", Error: " ^ e ^ "\n") in PascalLex.UserDeclarations.lineNum := 1; PascalParser.parse(30,stream,error,()) before TextIO.closeIn dev end fun keybd () = let val stream = PascalParser.makeLexer (fn i => (case TextIO.inputLine TextIO.stdIn of SOME s => s | _ => "")) fun error (e,i:int,_) = TextIO.output(TextIO.stdOut, "std_in," ^ " line " ^ (Int.toString i) ^ ", Error: " ^ e ^ "\n") in PascalLex.UserDeclarations.lineNum := 1; PascalParser.parse(0,stream,error,()) end end (* structure Parser *) mlton-20210117+dfsg/mlyacc/examples/pascal/pascal.grm000066400000000000000000000200271416264345000223320ustar00rootroot00000000000000%% %name Pascal %term YAND | YARRAY | YBEGIN | YCASE | YCONST | YDIV | YDO | YDOTDOT | YTO | YELSE | YEND | YFILE | YFOR | YFORWARD | YPROCEDURE | YGOTO | YID | YIF | YIN | YINT | YLABEL | YMOD | YNOT | YNUMB | YOF | YOR | YPACKED | YNIL | YFUNCTION | YPROG | YRECORD | YREPEAT | YSET | YSTRING | YTHEN | YDOWNTO | YTYPE | YUNTIL | YVAR | YWHILE | YWITH | YBINT | YOCT | YHEX | YCASELAB | YILLCH | YEXTERN | YDOT | YLPAR | YRPAR | YSEMI | YCOMMA | YCOLON | YCARET | YLBRA | YRBRA | YTILDE | YLESS | YEQUAL | YGREATER | YPLUS | YMINUS | YBAR | UNARYSIGN | YSTAR | YSLASH | YAMP | EOF %eop EOF %pos int %pure %noshift EOF %nonassoc YLESS YEQUAL YGREATER YIN %left YPLUS YMINUS YOR YBAR %left UNARYSIGN %left YSTAR YSLASH YDIV YMOD YAND YAMP %left YNOT %nonterm goal | prog_hedr | block | decls | decl | labels | label_decl | const_decl | type_decl | var_decl | proc_decl | pheadres | phead | porf | params | param | ftype | param_list | const | number | const_list | type' | simple_type | struct_type | simple_type_list | field_list | fixed_part | field | variant_part | variant_list | variant | stat_list | stat_lsth | cstat_list | cstat | stat | assign | expr | element_list | element | variable | qual_var | wexpr | octhex | expr_list | wexpr_list | relop | addop | divop | negop | var_list | id_list | const_id | type_id | var_id | array_id | ptr_id | record_id | field_id | func_id | begin %keyword YAND YARRAY YBEGIN YCASE YCONST YDIV YDO YTO YELSE YEND YFILE YFOR YFORWARD YPROCEDURE YGOTO YIF YIN YLABEL YMOD YNOT YOF YOR YPACKED YNIL YFUNCTION YPROG YRECORD YREPEAT YSET YSTRING YTHEN YDOWNTO YTYPE YUNTIL YVAR YWHILE YWITH YOCT YHEX YEXTERN YAMP %prefer YID YSEMI YCOMMA YLBRA %subst YCOMMA for YSEMI | YSEMI for YCOMMA %% begin: goal () goal: prog_hedr decls block YDOT () | decls () prog_hedr: YPROG YID YLPAR id_list YRPAR YSEMI () | YPROG YID YSEMI () block: YBEGIN stat_list YEND () decls: decls decl () | () decl: labels () | const_decl () | type_decl () | var_decl () | proc_decl () labels: YLABEL label_decl YSEMI () label_decl: YINT () | label_decl YCOMMA YINT () const_decl: YCONST YID YEQUAL const YSEMI () | const_decl YID YEQUAL const YSEMI () | YCONST YID YEQUAL YID YSEMI () | const_decl YID YEQUAL YID YSEMI () type_decl: YTYPE YID YEQUAL type' YSEMI () | type_decl YID YEQUAL type' YSEMI () var_decl: YVAR id_list YCOLON type' YSEMI () | var_decl id_list YCOLON type' YSEMI () proc_decl: phead YFORWARD YSEMI () | phead YEXTERN YSEMI () | pheadres decls block YSEMI () pheadres: phead () phead: porf YID params ftype YSEMI () porf: YPROCEDURE () | YFUNCTION () params: YLPAR param_list YRPAR () | () param: id_list YCOLON type' () | YVAR id_list YCOLON type' () | YFUNCTION id_list params ftype () | YPROCEDURE id_list params ftype () ftype: YCOLON type' () | () param_list: param () | param_list YSEMI param () const: YSTRING () | number () | YPLUS number () | YMINUS number () | YPLUS YID () | YMINUS YID () number: YINT () | YBINT () | YNUMB () const_list: const () | const_list YCOMMA const () | YID () | const_list YCOMMA YID () type': simple_type () | YCARET YID () | struct_type () | YPACKED struct_type () simple_type: type_id () | YLPAR id_list YRPAR () | const YDOTDOT const () | YID YDOTDOT const () | const YDOTDOT YID () | YID YDOTDOT YID () struct_type: YARRAY YLBRA simple_type_list YRBRA YOF type' () | YFILE YOF type' () | YSET YOF simple_type () | YRECORD field_list YEND () simple_type_list: simple_type () | simple_type_list YCOMMA simple_type () field_list: fixed_part variant_part () fixed_part: field () | fixed_part YSEMI field () field: () | id_list YCOLON type' () variant_part: () | YCASE type_id YOF variant_list () | YCASE YID YCOLON type_id YOF variant_list () variant_list: variant () | variant_list YSEMI variant () variant: () | const_list YCOLON YLPAR field_list YRPAR () stat_list: stat () | stat_lsth stat () stat_lsth: stat_list YSEMI () cstat_list: cstat () | cstat_list YSEMI cstat () cstat: const_list YCOLON stat () | YCASELAB stat () | () stat: () | YINT YCOLON stat () | YID () | YID YLPAR wexpr_list YRPAR () | assign () | YBEGIN stat_list YEND () | YCASE expr YOF cstat_list YEND () | YWITH var_list YDO stat () | YWHILE expr YDO stat () | YREPEAT stat_list YUNTIL expr () | YFOR assign YTO expr YDO stat () | YFOR assign YDOWNTO expr YDO stat () | YGOTO YINT () | YIF expr YTHEN stat () | YIF expr YTHEN stat YELSE stat () assign: variable YCOLON YEQUAL expr () | YID YCOLON YEQUAL expr () expr: expr relop expr %prec YLESS () | YPLUS expr %prec UNARYSIGN () | YMINUS expr %prec UNARYSIGN () | expr addop expr %prec YPLUS () | expr divop expr %prec YSTAR () | YNIL () | YSTRING () | YINT () | YBINT () | YNUMB () | variable () | YID () | YID YLPAR wexpr_list YRPAR () | YLPAR expr YRPAR () | negop expr %prec YNOT () | YLBRA element_list YRBRA () | YLBRA YRBRA () element_list: element () | element_list YCOMMA element () element: expr () | expr YDOTDOT expr () variable: qual_var () qual_var: YID YLBRA expr_list YRBRA () | qual_var YLBRA expr_list YRBRA () | YID YDOT field_id () | qual_var YDOT field_id () | YID YCARET () | qual_var YCARET () wexpr: expr () | expr YCOLON expr () | expr YCOLON expr YCOLON expr () | expr octhex () | expr YCOLON expr octhex () octhex: YOCT () | YHEX () expr_list: expr () | expr_list YCOMMA expr () wexpr_list: wexpr () | wexpr_list YCOMMA wexpr () relop: YEQUAL () | YLESS () | YGREATER () | YLESS YGREATER () | YLESS YEQUAL () | YGREATER YEQUAL () | YIN () addop: YPLUS () | YMINUS () | YOR () | YBAR () divop: YSTAR () | YSLASH () | YDIV () | YMOD () | YAND () | YAMP () negop: YNOT () | YTILDE () var_list: variable () | var_list YCOMMA variable () | YID () | var_list YCOMMA YID () id_list: YID () | id_list YCOMMA YID () const_id: YID () type_id: YID () var_id: YID () array_id: YID () ptr_id: YID () record_id: YID () field_id: YID () func_id: YID () mlton-20210117+dfsg/mlyacc/examples/pascal/pascal.lex000066400000000000000000000103571416264345000223420ustar00rootroot00000000000000structure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token open Tokens val lineNum = ref 0 val eof = fn () => EOF(!lineNum,!lineNum) structure KeyWord : sig val find : string -> (int * int -> (svalue,int) token) option end = struct val TableSize = 211 val HashFactor = 5 val hash = fn s => foldl (fn (c,v)=>(v*HashFactor+(ord c)) mod TableSize) 0 (explode s) val HashTable = Array.array(TableSize,nil) : (string * (int * int -> (svalue,int) token)) list Array.array val add = fn (s,v) => let val i = hash s in Array.update(HashTable,i,(s,v) :: (Array.sub(HashTable, i))) end val find = fn s => let val i = hash s fun f ((key,v)::r) = if s=key then SOME v else f r | f nil = NONE in f (Array.sub(HashTable, i)) end val _ = (List.app add [("and",YAND), ("array",YARRAY), ("begin",YBEGIN), ("case",YCASE), ("const",YCONST), ("div",YDIV), ("do",YDO), ("downto",YDOWNTO), ("else",YELSE), ("end",YEND), ("extern",YEXTERN), ("file",YFILE), ("for",YFOR), ("forward",YFORWARD), ("function",YFUNCTION), ("goto",YGOTO), ("hex",YHEX), ("if",YIF), ("in",YIN), ("label",YLABEL), ("mod",YMOD), ("nil",YNIL), ("not",YNOT), ("oct",YOCT), ("of",YOF), ("or",YOR), ("packed",YPACKED), ("procedure",YPROCEDURE), ("program",YPROG), ("record",YRECORD), ("repeat",YREPEAT), ("set",YSET), ("then",YTHEN), ("to",YTO), ("type",YTYPE), ("until",YUNTIL), ("var",YVAR), ("while",YWHILE), ("with",YWITH) ]) end open KeyWord %% %header (functor PascalLexFun(structure Tokens : Pascal_TOKENS)); %s C B; alpha=[A-Za-z]; digit=[0-9]; optsign=("+"|"-")?; integer={digit}+; frac="."{digit}+; exp=(e|E){optsign}{digit}+; octdigit=[0-7]; ws = [\ \t]; %% {ws}+ => (lex()); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); {alpha}+ => (case find yytext of SOME v => v(!lineNum,!lineNum) | _ => YID(!lineNum,!lineNum)); {alpha}({alpha}|{digit})* => (YID(!lineNum,!lineNum)); {optsign}{integer}({frac}{exp}?|{frac}?{exp}) => (YNUMB(!lineNum,!lineNum)); {optsign}{integer} => (YINT(!lineNum,!lineNum)); {octdigit}+(b|B) => (YBINT(!lineNum,!lineNum)); "'"([^']|"''")*"'" => (YSTRING(!lineNum,!lineNum)); "(*" => (YYBEGIN C; lex()); ".." => (YDOTDOT(!lineNum,!lineNum)); "." => (YDOT(!lineNum,!lineNum)); "(" => (YLPAR(!lineNum,!lineNum)); ")" => (YRPAR(!lineNum,!lineNum)); ";" => (YSEMI(!lineNum,!lineNum)); "," => (YCOMMA(!lineNum,!lineNum)); ":" => (YCOLON(!lineNum,!lineNum)); "^" => (YCARET(!lineNum,!lineNum)); "[" => (YLBRA(!lineNum,!lineNum)); "]" => (YRBRA(!lineNum,!lineNum)); "~" => (YTILDE(!lineNum,!lineNum)); "<" => (YLESS(!lineNum,!lineNum)); "=" => (YEQUAL(!lineNum,!lineNum)); ">" => (YGREATER(!lineNum,!lineNum)); "+" => (YPLUS(!lineNum,!lineNum)); "-" => (YMINUS(!lineNum,!lineNum)); "|" => (YBAR(!lineNum,!lineNum)); "*" => (YSTAR(!lineNum,!lineNum)); "/" => (YSLASH(!lineNum,!lineNum)); "{" => (YYBEGIN B; lex()); . => (YILLCH(!lineNum,!lineNum)); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); [^()*\n]+ => (lex()); "(*" => (lex()); "*)" => (YYBEGIN INITIAL; lex()); [*()] => (lex()); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); [^{}\n]+ => (lex()); "{" => (lex()); "}" => (YYBEGIN INITIAL; lex()); mlton-20210117+dfsg/mlyacc/examples/pascal/pascal.mlb000066400000000000000000000002121416264345000223110ustar00rootroot00000000000000local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb pascal.grm.sig pascal.grm.sml pascal.lex.sml in parser.sml endmlton-20210117+dfsg/mlyacc/examples/pascal/test/000077500000000000000000000000001416264345000213365ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/examples/pascal/test/README000066400000000000000000000002041416264345000222120ustar00rootroot00000000000000Test files for the error-correcting parser. Files beginning with c are correct. Those beginning with t have simple syntax errors. mlton-20210117+dfsg/mlyacc/examples/pascal/test/c2.p000066400000000000000000000000711416264345000220210ustar00rootroot00000000000000program p(input,output); begin if x=0 then x := 1 end. mlton-20210117+dfsg/mlyacc/examples/pascal/test/t2.p000066400000000000000000000000741416264345000220450ustar00rootroot00000000000000program p(input,output); begin if x := 0 then x := 1 end. mlton-20210117+dfsg/mlyacc/examples/pascal/test/t3.p000066400000000000000000000001711416264345000220440ustar00rootroot00000000000000program p(input,output); function topsort(var x: order, var y : sorted, x : integer); begin end; begin x:= 1 end. mlton-20210117+dfsg/mlyacc/examples/pascal/test/t4.p000066400000000000000000000001331416264345000220430ustar00rootroot00000000000000program p(input,output); var l,n: real; var x, nonprime,prime: ; begin var end. mlton-20210117+dfsg/mlyacc/examples/pascal/test/t5.p000066400000000000000000000001431416264345000220450ustar00rootroot00000000000000program p(input,output) begin writeln(' '; 9, 'x'; 10, 'm'; 9, '[x]'; 9,'approx x]'; 19, end. mlton-20210117+dfsg/mlyacc/examples/pascal/test/t6.p000066400000000000000000000006641416264345000220560ustar00rootroot00000000000000program this (output) procedure addcor; var bins,start,i,last : integer; level : real; begin bins := trunc((r1+r2)*maxcor); if bins < 1 then bins := 1; start := round(d*maxcor) - bins div 2; level := mm/bins; last := start+bins; if last>maxcor then last := maxcor; corfarray[start] := corfarray[start]-level; corfarray[last] := corfarray[last]+level; end; mlton-20210117+dfsg/mlyacc/examples/pascal/test/t7.p000066400000000000000000000001201416264345000220420ustar00rootroot00000000000000program p(input,otput); begin for i := 1 to maxelements do y[i] := 0; end. mlton-20210117+dfsg/mlyacc/main.sml000066400000000000000000000012511416264345000167360ustar00rootroot00000000000000(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure Main = struct fun usage s = Process.usage {usage = "file.grm", msg = s} fun main args = let val rest = let open Popt in parse {switches = args, opts = []} end in case rest of Result.No msg => usage msg | Result.Yes [file] => ParseGen.parseGen file | _ => usage "too many files" end val main = Process.makeMain main end mlton-20210117+dfsg/mlyacc/mlyacc.mlb000066400000000000000000000024541416264345000172470ustar00rootroot00000000000000(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) local local local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb src/utils.sig src/utils.sml src/sigs.sml src/hdr.sml src/yacc.grm.sig src/yacc.grm.sml local (* import Unsafe in case yacc.lex.sml is generated by an old version of * mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in src/yacc.lex.sml end src/parse.sml src/grammar.sml src/core.sml src/coreutils.sml src/graph.sml src/look.sml src/lalr.sml src/mklrtable.sml src/mkprstruct.sml src/shrink.sml src/verbose.sml src/absyn.sig src/absyn.sml src/yacc.sml src/link.sml in structure ParseGen end local ../lib/mlton/sources.mlb main.sml in structure Main end in structure Main end in call-main.sml end mlton-20210117+dfsg/mlyacc/src/000077500000000000000000000000001416264345000160655ustar00rootroot00000000000000mlton-20210117+dfsg/mlyacc/src/.gitignore000066400000000000000000000000521416264345000200520ustar00rootroot00000000000000/yacc.grm.sig /yacc.grm.sml /yacc.lex.sml mlton-20210117+dfsg/mlyacc/src/FILES000066400000000000000000000020031416264345000166450ustar00rootroot00000000000000Base files; used by all parsers generated by ML-Yacc, included ML-Yacc's own parser. ../lib/base.sig ../lib/stream.sml ../lib/lrtable.sml ../lib/join.sml ../lib/parser2.sml Signatures and parser for ML-Yacc. utils.sig sigs.sml hdr.sml yacc.grm.sig yacc.grm.sml yacc.lex.sml parse.sml LR table generator: base definitions: grammar.sml LR(0) graph generation: intgrammar.sml core.sml coreutils.sml graph.sml LALR(1) table generation: look.sml lalr.sml mklrtable.sml modules to print out table structure: mkprstruct.sml shrink.sml and verbose file: verbose.sml Rest of ML-Yacc: Signature and module to handle abstract syntax for actions and remove unused variable bindings from the abstract syntax: absyn.sig absyn.sml module to check specification for errors, create grammar from specification, have appropriate files printed out, and print out semantic actions for the parser: yacc.sml module to hook everything together: link.sml mlton-20210117+dfsg/mlyacc/src/README000066400000000000000000000001611416264345000167430ustar00rootroot00000000000000These are the sources for the parser-generator part of ML-Yacc. The file FILES explains what each file contains. mlton-20210117+dfsg/mlyacc/src/absyn.sig000066400000000000000000000020551416264345000177070ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) signature ABSYN = sig datatype exp = EVAR of string | EAPP of exp * exp | ETUPLE of exp list | EINT of int | FN of pat * exp | LET of decl list * exp | UNIT | SEQ of exp * exp | CODE of {text : string, pos : Header.pos} and pat = PVAR of string | PAPP of string * pat | PTUPLE of pat list | PLIST of pat list * pat option | PINT of int | WILD | AS of string * pat and decl = VB of pat * exp and rule = RULE of pat * exp val printRule : ((string -> unit) * (string -> unit) * (Header.pos option -> string)) -> rule -> unit end mlton-20210117+dfsg/mlyacc/src/absyn.sml000066400000000000000000000146731416264345000177310ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi *) structure Absyn : ABSYN = struct datatype exp = CODE of {text : string, pos : Header.pos} | EAPP of exp * exp | EINT of int | ETUPLE of exp list | EVAR of string | FN of pat * exp | LET of decl list * exp | SEQ of exp * exp | UNIT and pat = PVAR of string | PAPP of string * pat | PINT of int | PLIST of pat list * pat option | PTUPLE of pat list | WILD | AS of string * pat and decl = VB of pat * exp and rule = RULE of pat * exp fun idchar #"'" = true | idchar #"_" = true | idchar c = Char.isAlpha c orelse Char.isDigit c fun code_to_ids s = let fun g(nil,r) = r | g(a as (h::t),r) = if Char.isAlpha h then f(t,[h],r) else g(t,r) and f(nil,accum,r)= implode(rev accum)::r | f(a as (h::t),accum,r) = if idchar h then f(t,h::accum,r) else g(a,implode (rev accum) :: r) in g(explode s,nil) end val simplifyRule : rule -> rule = fn (RULE(p,e)) => let val used : (string -> bool) = let fun f(CODE s) = code_to_ids (#text s) | f(EAPP(a,b)) = f a @ f b | f(ETUPLE l) = List.concat (map f l) | f(EVAR s) = [s] | f(FN(_,e)) = f e | f(LET(dl,e)) = (List.concat (map (fn VB(_,e) => f e) dl)) @ f e | f(SEQ(a,b)) = f a @ f b | f _ = nil val identifiers = f e in fn s => List.exists (fn a=>a=s) identifiers end val simplifyPat : pat -> pat = let fun f a = case a of (PVAR s) => if used s then a else WILD | (PAPP(s,pat)) => (case f pat of WILD => WILD | pat' => PAPP(s,pat')) | (PLIST (l, topt)) => let val l' = map f l val topt' = Option.map f topt fun notWild WILD = false | notWild _ = true in case topt' of SOME WILD => if List.exists notWild l' then PLIST (l', topt') else WILD | _ => PLIST (l', topt') end | (PTUPLE l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PTUPLE l' else WILD end | (AS(a,b)) => if used a then case f b of WILD => PVAR a | b' => AS(a,b') else f b | _ => a in f end val simplifyExp : exp -> exp = let fun f(EAPP(a,b)) = EAPP(f a,f b) | f(ETUPLE l) = ETUPLE(map f l) | f(FN(p,e)) = FN(simplifyPat p,f e) | f(LET(dl,e)) = LET(map (fn VB(p,e) => VB(simplifyPat p,f e)) dl, f e) | f(SEQ(a,b)) = SEQ(f a,f b) | f a = a in f end in RULE(simplifyPat p,simplifyExp e) end fun printRule (say : string -> unit, sayln:string -> unit, fmtPos) r = let fun flat (a, []) = rev a | flat (a, SEQ (e1, e2) :: el) = flat (a, e1 :: e2 :: el) | flat (a, e :: el) = flat (e :: a, el) fun pl (lb, rb, c, f, [], a) = " " :: lb :: rb :: a | pl (lb, rb, c, f, h :: t, a) = " " :: lb :: f (h, foldr (fn (x, a) => c :: f (x, a)) (rb :: a) t) fun pe (CODE {text, pos}, a) = " (" :: fmtPos (SOME pos) :: text :: fmtPos NONE :: ")" :: a | pe (EAPP (x, y as (EAPP _)), a) = pe (x, " (" :: pe (y, ")" :: a)) | pe (EAPP (x, y), a) = pe (x, pe (y, a)) | pe (EINT i, a) = " " :: Int.toString i :: a | pe (ETUPLE l, a) = pl ("(", ")", ",", pe, l, a) | pe (EVAR v, a) = " " :: v :: a | pe (FN (p, b), a) = " (fn" :: pp (p, " =>" :: pe (b, ")" :: a)) | pe (LET ([], b), a) = pe (b, a) | pe (LET (dl, b), a) = let fun pr (VB (p, e), a) = " val " :: pp (p, " =" :: pe (e, "\n" :: a)) in " let" :: foldr pr (" in" :: pe (b, "\nend" :: a)) dl end | pe (SEQ (e1, e2), a) = pl ("(", ")", ";", pe, flat ([], [e1, e2]), a) | pe (UNIT, a) = " ()" :: a and pp (PVAR v, a) = " " :: v :: a | pp (PAPP (x, y as PAPP _), a) = " " :: x :: " (" :: pp (y, ")" :: a) | pp (PAPP (x, y), a) = " " :: x :: pp (y, a) | pp (PINT i, a) = " " :: Int.toString i :: a | pp (PLIST (l, NONE), a) = pl ("[", "]", ",", pp, l, a) | pp (PLIST (l, SOME t), a) = " (" :: foldr (fn (x, a) => pp (x, " ::" :: a)) (pp (t, ")" :: a)) l | pp (PTUPLE l, a) = pl ("(", ")", ",", pp, l, a) | pp (WILD, a) = " _" :: a | pp (AS (v, PVAR v'), a) = " (" :: v :: " as " :: v' :: ")" :: a | pp (AS (v, p), a) = " (" :: v :: " as (" :: pp (p, "))" :: a) fun out "\n" = sayln "" | out s = say s in case simplifyRule r of RULE (p, e) => app out (pp (p, " =>" :: pe (e, ["\n"]))) end end; mlton-20210117+dfsg/mlyacc/src/core.sml000066400000000000000000000063371416264345000175430ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkCore(structure IntGrammar : INTGRAMMAR) : CORE = struct open IntGrammar open Grammar structure IntGrammar = IntGrammar structure Grammar = Grammar datatype item = ITEM of { rule : rule, dot : int, rhsAfter : symbol list } val eqItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n=m andalso d=e val gtItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n>m orelse (n=m andalso d>e) structure ItemList = ListOrdSet (struct type elem = item val eq = eqItem val gt = gtItem end) open ItemList datatype core = CORE of item list * int val gtCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_gt(a,b) val eqCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_eq(a,b) (* functions for printing and debugging *) val prItem = fn (symbolToString,nontermToString,print) => let val printInt = print o (Int.toString : int -> string) val prSymbol = print o symbolToString val prNonterm = print o nontermToString fun showRest nil = () | showRest (h::t) = (prSymbol h; print " "; showRest t) fun showRhs (l,0) = (print ". "; showRest l) | showRhs (nil,_) = () | showRhs (h::t,n) = (prSymbol h; print " "; showRhs(t,n-1)) in fn (ITEM {rule=RULE {lhs,rhs,rulenum,num,...}, dot,rhsAfter,...}) => (prNonterm lhs; print " : "; showRhs(rhs,dot); case rhsAfter of nil => (print " (reduce by rule "; printInt rulenum; print ")") | _ => (); if DEBUG then (print " (num "; printInt num; print ")") else ()) end val prCore = fn a as (_,_,print) => let val prItem = prItem a in fn (CORE (items,state)) => (print "state "; print (Int.toString state); print ":\n\n"; app (fn i => (print "\t"; prItem i; print "\n")) items; print "\n") end end; mlton-20210117+dfsg/mlyacc/src/coreutils.sml000066400000000000000000000240551416264345000206210ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkCoreUtils(structure Core : CORE) : CORE_UTILS = struct val sub = Array.sub infix 9 sub val DEBUG = true structure Core = Core structure IntGrammar = Core.IntGrammar structure Grammar = IntGrammar.Grammar open Grammar IntGrammar Core structure Assoc = SymbolAssoc structure NtList = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn (GRAMMAR {rules,terms,nonterms,...}) => let val derives=Array.array(nonterms,nil : rule list) (* sort rules by their lhs nonterminal by placing them in an array indexed in their lhs nonterminal *) val _ = let val f = fn {lhs=lhs as (NT n), rhs, precedence,rulenum} => let val rule=RULE{lhs=lhs,rhs=rhs,precedence=precedence, rulenum=rulenum,num=0} in Array.update(derives,n,rule::(derives sub n)) end in app f rules end (* renumber rules so that rule numbers increase monotonically with the number of their lhs nonterminal, and so that rules are numbered sequentially. **Functions below assume that this number is true**, i.e. productions for nonterm i are numbered from j to k, productions for nonterm i+1 are numbered from k+1 to m, and productions for nonterm 0 start at 0 *) val _ = let val f = fn (RULE{lhs,rhs,precedence,rulenum,num}, (l,i)) => (RULE{lhs=lhs,rhs=rhs, precedence=precedence, rulenum=rulenum, num=i}::l,i+1) fun g(i,num) = if i if DEBUG andalso (n<0 orelse n>=nonterms) then let exception Produces of int in raise (Produces n) end else derives sub n val memoize = fn f => let fun loop i = if i = nonterms then nil else f (NT i) :: (loop (i+1)) val data = Array.fromList(loop 0) in fn (NT i) => data sub i end (* compute nonterminals which must be added to a closure when a given nonterminal is added, i.e all nonterminals C for each nonterminal A such that A =*=> Cx *) val nontermClosure = let val collectNonterms = fn n => List.foldr (fn (r,l) => case r of RULE {rhs=NONTERM n :: _,...} => NtList.insert(n,l) | _ => l) NtList.empty (produces n) val closureNonterm = fn n => NtList.closure(NtList.singleton n, collectNonterms) in memoize closureNonterm end (* ntShifts: Take the items produced by a nonterminal, and sort them by their first symbol. For each first symbol, make sure the item list associated with the symbol is sorted also. ** This function assumes that the item list returned by produces is sorted ** Create a table of item lists keyed by symbols. Scan the list of items produced by a nonterminal, and insert those with a first symbol on to the beginning of the item list for that symbol, creating a list if necessary. Since produces returns an item list that is already in order, the list for each symbol will also end up in order. *) fun sortItems nt = let fun add_item (a as RULE{rhs=symbol::rest,...},r) = let val item = ITEM{rule=a,dot=1,rhsAfter=rest} in Assoc.insert((symbol,case Assoc.find (symbol,r) of SOME l => item::l | NONE => [item]),r) end | add_item (_,r) = r in List.foldr add_item Assoc.empty (produces nt) end val ntShifts = memoize sortItems (* getNonterms: get the nonterminals with a . before them in a core. Returns a list of nonterminals in ascending order *) fun getNonterms l = List.foldr (fn (ITEM {rhsAfter=NONTERM sym ::_, ...},r) => NtList.insert(sym,r) | (_,r) => r) [] l (* closureNonterms: compute the nonterminals that would have a . before them in the closure of the core. Returns a list of nonterminals in ascending order *) fun closureNonterms a = let val nonterms = getNonterms a in List.foldr (fn (nt,r) => NtList.union(nontermClosure nt,r)) nonterms nonterms end (* shifts: compute the core sets that result from shift/gotoing on the closure of a kernal set. The items in core sets are sorted, of course. (1) compute the core sets that result just from items added through the closure operation. (2) then add the shift/gotos on kernal items. We can do (1) the following way. Keep a table which for each shift/goto symbol gives the list of items that result from shifting or gotoing on the symbol. Compute the nonterminals that would have dots before them in the closure of the kernal set. For each of these nonterminals, we already have an item list in sorted order for each possible shift symbol. Scan the nonterminal list from back to front. For each nonterminal, prepend the shift/goto list for each shift symbol to the list already in the table. We end up with the list of items in correct order for each shift/goto symbol. We have kept the item lists in order, scanned the nonterminals from back to front (=> that the items end up in ascending order), and never had any duplicate items (each item is derived from only one nonterminal). *) fun shifts (CORE (itemList,_)) = let (* mergeShiftItems: add an item list for a shift/goto symbol to the table *) fun mergeShiftItems (args as ((k,l),r)) = case Assoc.find(k,r) of NONE => Assoc.insert args | SOME old => Assoc.insert ((k,l@old),r) (* mergeItems: add all items derived from a nonterminal to the table. We've kept these items sorted by their shift/goto symbol (the first symbol on their rhs) *) fun mergeItems (n,r) = Assoc.fold mergeShiftItems (ntShifts n) r (* nonterms: a list of nonterminals that are in a core after the closure operation *) val nonterms = closureNonterms itemList (* now create a table which for each shift/goto symbol gives the sorted list of closure items which would result from first taking all the closure items and then sorting them by the shift/goto symbols *) val newsets = List.foldr mergeItems Assoc.empty nonterms (* finally prepare to insert the kernal items of a core *) fun insertItem ((k,i),r) = case (Assoc.find(k,r)) of NONE => Assoc.insert((k,[i]),r) | SOME l => Assoc.insert((k,Core.insert(i,l)),r) fun shiftCores(ITEM{rule,dot,rhsAfter=symbol::rest},r) = insertItem((symbol, ITEM{rule=rule,dot=dot+1,rhsAfter=rest}),r) | shiftCores(_,r) = r (* insert the kernal items of a core *) val newsets = List.foldr shiftCores newsets itemList in Assoc.make_list newsets end (* nontermEpsProds: returns a list of epsilon productions produced by a nonterminal sorted by rule number. ** Depends on produces returning an ordered list **. It does not alter the order in which the rules were returned by produces; it only removes non-epsilon productions *) val nontermEpsProds = let val f = fn nt => List.foldr (fn (rule as RULE {rhs=nil,...},results) => rule :: results | (_,results) => results) [] (produces nt) in memoize f end (* epsProds: take a core and compute a list of epsilon productions for it sorted by rule number. ** Depends on closureNonterms returning a list of nonterminals sorted by nonterminal #, rule numbers increasing monotonically with their lhs production #, and nontermEpsProds returning an ordered item list for each production *) fun epsProds (CORE (itemList,state)) = let val prods = map nontermEpsProds (closureNonterms itemList) in List.concat prods end in {produces=produces,shifts=shifts,rules=rules,epsProds=epsProds} end end; mlton-20210117+dfsg/mlyacc/src/grammar.sml000066400000000000000000000110261416264345000202300ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) structure Grammar : GRAMMAR = struct (* define types term and nonterm using those in LrTable datatype term = T of int datatype nonterm = NT of int *) open LrTable datatype symbol = TERM of term | NONTERM of nonterm datatype grammar = GRAMMAR of {rules: {lhs: nonterm, rhs: symbol list, precedence: int option, rulenum: int} list, noshift : term list, eop : term list, terms: int, nonterms: int, start : nonterm, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end; structure IntGrammar : INTGRAMMAR = struct structure Grammar = Grammar open Grammar datatype rule = RULE of {lhs: nonterm, rhs: symbol list, num: int,(* internal # assigned by coreutils *) rulenum: int, precedence: int option} val eqTerm : term * term -> bool = (op =) val gtTerm : term * term -> bool = fn (T i,T j) => i>j val eqNonterm : nonterm * nonterm -> bool = (op =) val gtNonterm : nonterm * nonterm -> bool = fn (NT i,NT j) => i>j val eqSymbol : symbol * symbol -> bool = (op =) val gtSymbol = fn (TERM (T i),TERM (T j)) => i>j | (NONTERM (NT i),NONTERM (NT j)) => i>j | (TERM _,NONTERM _) => false | (NONTERM _,TERM _) => true structure SymbolAssoc = Table(type key = symbol val gt = gtSymbol) structure NontermAssoc = Table(type key = nonterm val gt = gtNonterm) val DEBUG = false val prRule = fn (a as symbolToString,nontermToString,print) => let val printSymbol = print o symbolToString fun printRhs (h::t) = (printSymbol h; print " "; printRhs t) | printRhs nil = () in fn (RULE {lhs,rhs,num,rulenum,precedence,...}) => ((print o nontermToString) lhs; print " : "; printRhs rhs; if DEBUG then (print " num = "; print (Int.toString num); print " rulenum = "; print (Int.toString rulenum); print " precedence = "; case precedence of NONE => print " none" | (SOME i) => print (Int.toString i); ()) else ()) end val prGrammar = fn (a as (symbolToString,nontermToString,print)) => fn (GRAMMAR {rules,terms,nonterms,start,...}) => let val printRule = let val prRule = prRule a in fn {lhs,rhs,precedence,rulenum} => (prRule (RULE {lhs=lhs,rhs=rhs,num=0, rulenum=rulenum, precedence=precedence}); print "\n") end in print "grammar = \n"; List.app printRule rules; print "\n"; print (" terms = " ^ (Int.toString terms) ^ " nonterms = " ^ (Int.toString nonterms) ^ " start = "); (print o nontermToString) start; () end end; mlton-20210117+dfsg/mlyacc/src/graph.sml000066400000000000000000000115421416264345000177060ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkGraph(structure IntGrammar : INTGRAMMAR structure Core : CORE structure CoreUtils : CORE_UTILS sharing IntGrammar = Core.IntGrammar = CoreUtils.IntGrammar sharing CoreUtils.Core = Core ) : LRGRAPH = struct val sub = Array.sub infix 9 sub structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Core Core.Grammar CoreUtils IntGrammar structure NodeSet = RbOrdSet (struct type elem = core val eq = eqCore val gt = gtCore end) open NodeSet exception Shift of int * symbol type graph = {edges: {edge:symbol,to:core} list array, nodes: core list,nodeArray : core array} val edges = fn (CORE (_,i),{edges,...}:graph) => edges sub i val nodes = fn ({nodes,...} : graph) => nodes val shift = fn ({edges,nodes,...} : graph) => fn a as (i,sym) => let fun find nil = raise (Shift a) | find ({edge,to=CORE (_,state)} :: r) = if gtSymbol(sym,edge) then find r else if eqSymbol(edge,sym) then state else raise (Shift a) in find (edges sub i) end val core = fn ({nodeArray,...} : graph) => fn i => nodeArray sub i val mkGraph = fn (g as (GRAMMAR {start,...})) => let val {shifts,produces,rules,epsProds} = CoreUtils.mkFuncs g fun add_goto ((symbol,a),(nodes,edges,future,num)) = case find(CORE (a,0),nodes) of NONE => let val core =CORE (a,num) val edge = {edge=symbol,to=core} in (insert(core,nodes),edge::edges, core::future,num+1) end | (SOME c) => let val edge={edge=symbol,to=c} in (nodes,edge::edges,future,num) end fun f (nodes,node_list,edge_list,nil,nil,num) = let val nodes=rev node_list in {nodes=nodes, edges=Array.fromList (rev edge_list), nodeArray = Array.fromList nodes } end | f (nodes,node_list,edge_list,nil,y,num) = f (nodes,node_list,edge_list,rev y,nil,num) | f (nodes,node_list,edge_list,h::t,y,num) = let val (nodes,edges,future,num) = List.foldr add_goto (nodes,[],y,num) (shifts h) in f (nodes,h::node_list, edges::edge_list,t,future,num) end in {graph= let val makeItem = fn (r as (RULE {rhs,...})) => ITEM{rule=r,dot=0,rhsAfter=rhs} val initialItemList = map makeItem (produces start) val orderedItemList = List.foldr Core.insert [] initialItemList val initial = CORE (orderedItemList,0) in f(empty,nil,nil,[initial],nil,1) end, produces=produces, rules=rules, epsProds=epsProds} end val prGraph = fn a as (nontermToString,termToString,print) => fn g => let val printCore = prCore a val printSymbol = print o nontermToString val nodes = nodes g val printEdges = fn n => List.app (fn {edge,to=CORE (_,state)} => (print "\tshift on "; printSymbol edge; print " to "; print (Int.toString state); print "\n")) (edges (n,g)) in List.app (fn c => (printCore c; print "\n"; printEdges c)) nodes end end; mlton-20210117+dfsg/mlyacc/src/hdr.sml000066400000000000000000000113151416264345000173600ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor HeaderFun () : HEADER = struct val DEBUG = true type pos = {line : int, col : int} val pos = {line = ref 1, start = ref 0} val text = ref (nil: string list) type inputSource = {name : string, errStream : TextIO.outstream, inStream : TextIO.instream, errorOccurred : bool ref} val newSource = fn (s : string,i : TextIO.instream ,errs : TextIO.outstream) => {name=s,errStream=errs,inStream=i, errorOccurred = ref false} val errorOccurred = fn (s : inputSource) =>fn () => !(#errorOccurred s) val pr = fn out : TextIO.outstream => fn s : string => TextIO.output(out,s) val error = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString (#line l)); pr ": Error: "; pr msg; pr "\n"; errorOccurred := true) end val warn = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString (#line l)); pr ": Warning: "; pr msg; pr "\n") end datatype prec = LEFT | RIGHT | NONASSOC datatype symbol = SYMBOL of string * pos val symbolName = fn SYMBOL(s,_) => s val symbolPos = fn SYMBOL(_,p) => p val symbolMake = fn sp => SYMBOL sp type ty = string val tyName = fn i => i val tyMake = fn i => i datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string | TOKEN_SIG_INFO of string datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol*ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol* ty option) list option, control : control list, value : (symbol * string) list} type rhsData = {rhs:symbol list,code:string, prec:symbol option} list datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : {text : string, pos : pos}, prec : symbol option} type parseResult = string * declData * rule list val getResult = fn p => p fun join_decls (DECL {eop=e,control=c,keyword=k,nonterm=n,prec, change=su,term=t,value=v}:declData, DECL {eop=e',control=c',keyword=k',nonterm=n',prec=prec', change=su',term=t',value=v'} : declData, inputSource,pos) = let val ignore = fn s => (warn inputSource pos ("ignoring duplicate " ^ s ^ " declaration")) val join = fn (e,NONE,NONE) => NONE | (e,NONE,a) => a | (e,a,NONE) => a | (e,a,b) => (ignore e; a) fun mergeControl (nil,a) = [a] | mergeControl (l as h::t,a) = case (h,a) of (PARSER_NAME _,PARSER_NAME n1) => (ignore "%name"; l) | (FUNCTOR _,FUNCTOR _) => (ignore "%header"; l) | (PARSE_ARG _,PARSE_ARG _) => (ignore "%arg"; l) | (START_SYM _,START_SYM s) => (ignore "%start"; l) | (POS _,POS _) => (ignore "%pos"; l) | (TOKEN_SIG_INFO _, TOKEN_SIG_INFO _) => (ignore "%token_sig_info"; l) | (NSHIFT a,NSHIFT b) => (NSHIFT (a@b)::t) | _ => h :: mergeControl(t,a) fun loop (nil,r) = r | loop (h::t,r) = loop(t,mergeControl(r,h)) in DECL {eop=e@e',control=loop(c',c),keyword=k'@k, nonterm=join("%nonterm",n,n'), prec=prec@prec', change=su@su', term=join("%term",t,t'),value=v@v'} : declData end end; structure Header = HeaderFun(); mlton-20210117+dfsg/mlyacc/src/lalr.sml000066400000000000000000000506071416264345000175440ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkLalr ( structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH structure Look: LOOK sharing Graph.Core = Core sharing Graph.IntGrammar = Core.IntGrammar = Look.IntGrammar = IntGrammar) : LALR_GRAPH = struct val sub = Array.sub infix 9 sub open IntGrammar.Grammar IntGrammar Core Graph Look structure Graph = Graph structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar datatype tmpcore = TMPCORE of (item * term list ref) list * int datatype lcore = LCORE of (item * term list) list * int val prLcore = fn a as (SymbolToString,nontermToString,termToString,print) => let val printItem = prItem (SymbolToString,nontermToString,print) val printLookahead = prLook(termToString,print) in fn (LCORE (items,state)) => (print "\n"; print "state "; print (Int.toString state); print " :\n\n"; List.app (fn (item,lookahead) => (print "{"; printItem item; print ","; printLookahead lookahead; print "}\n")) items) end exception Lalr of int structure ItemList = ListOrdSet (struct type elem = item * term list ref val eq = fn ((a,_),(b,_)) => eqItem(a,b) val gt = fn ((a,_),(b,_)) => gtItem(a,b) end) structure NontermSet = ListOrdSet (struct type elem = nonterm val gt = gtNonterm val eq = eqNonterm end) (* NTL: nonterms with lookahead *) structure NTL = RbOrdSet (struct type elem = nonterm * term list val gt = fn ((i,_),(j,_)) => gtNonterm(i,j) val eq = fn ((i,_),(j,_)) => eqNonterm(i,j) end) val DEBUG = false val addLookahead = fn {graph,nullable,first,eop, rules,produces,nonterms,epsProds, print,termToString,nontermToString} => let val eop = Look.make_set eop val symbolToString = fn (TERM t) => termToString t | (NONTERM t) => nontermToString t val print = if DEBUG then print else fn _ => () val prLook = if DEBUG then prLook (termToString,print) else fn _ => () val prNonterm = print o nontermToString val prRule = if DEBUG then prRule(symbolToString,nontermToString,print) else fn _ => () val printInt = print o (Int.toString : int -> string) val printItem = prItem(symbolToString,nontermToString,print) (* look_pos: position in the rhs of a rule at which we should start placing lookahead ref cells, i.e. the minimum place at which A -> x .B y, where B is a nonterminal and y =*=> epsilon, or A -> x. is true. Positions are given by the number of symbols before the place. The place before the first symbol is 0, etc. *) val look_pos = let val positions = Array.array(length rules,0) (* rule_pos: calculate place in the rhs of a rule at which we should start placing lookahead ref cells *) fun rule_pos (RULE {rhs,...}) = case (rev rhs) of nil => 0 | (TERM t) :: r => length rhs | (NONTERM n :: r) => let (* f assumes that everything after n in the * rule has proven to be nullable so far. * Remember that the rhs has been reversed, * implying that this is true initially *) (* A -> .z t B y, where y is nullable *) fun f (b, (r as (TERM _ :: _))) = length r (* A -> .z B C y *) | f (c, (NONTERM b :: r)) = if nullable c then f (b, r) else length r + 1 (* A -> .B y, where y is nullable *) | f (_, []) = 0 in f (n, r) end val check_rule = fn (rule as RULE {num,...}) => let val pos = rule_pos rule in (print "look_pos: "; prRule rule; print " = "; printInt pos; print "\n"; Array.update(positions,num,rule_pos rule)) end in app check_rule rules; fn RULE{num,...} => (positions sub num) end (* rest_is_null: true for items of the form A -> x .B y, where y is nullable *) val rest_is_null = fn (ITEM{rule,dot, rhsAfter=NONTERM _ :: _}) => dot >= (look_pos rule) | _ => false (* map core to a new core including only items of the form A -> x. or A -> x. B y, where y =*=> epsilon. It also adds epsilon productions to the core. Each item is given a ref cell to hold the lookahead nonterminals for it.*) val map_core = let val f = fn (item as ITEM {rhsAfter=nil,...},r) => (item,ref nil) :: r | (item,r) => if (rest_is_null item) then (item,ref nil)::r else r in fn (c as CORE (items,state)) => let val epsItems = map (fn rule=>(ITEM{rule=rule,dot=0,rhsAfter=nil}, ref (nil : term list)) ) (epsProds c) in TMPCORE(ItemList.union(List.foldr f [] items,epsItems),state) end end val new_nodes = map map_core (nodes graph) exception Find (* findRef: state * item -> lookahead ref cell for item *) val findRef = let val states = Array.fromList new_nodes val dummy = ref nil in fn (state,item) => let val TMPCORE (l,_) = states sub state in case ItemList.find((item,dummy),l) of SOME (_,look_ref) => look_ref | NONE => (print "find failed: state "; printInt state; print "\nitem =\n"; printItem item; print "\nactual items =\n"; app (fn (i,_) => (printItem i; print "\n")) l; raise Find) end end (* findRuleRefs: state -> rule -> lookahead refs for rule. *) val findRuleRefs = let val shift = shift graph in fn state => (* handle epsilon productions *) fn (rule as RULE {rhs=nil,...}) => [findRef(state,ITEM{rule=rule,dot=0,rhsAfter=nil})] | (rule as RULE {rhs=sym::rest,...}) => let val pos = Int.max(look_pos rule,1) fun scan'(state,nil,pos,result) = findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=nil}) :: result | scan'(state,rhs as sym::rest,pos,result) = scan'(shift(state,sym), rest, pos+1, findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=rhs})::result) (* find first item of the form A -> x .B y, where y =*=> epsilon and x is not epsilon, or A -> x. use scan' to pick up all refs after this point *) fun scan(state,nil,_) = [findRef(state,ITEM{rule=rule,dot=pos,rhsAfter=nil})] | scan(state,rhs,0) = scan'(state,rhs,pos,nil) | scan(state,sym::rest,place) = scan(shift(state,sym),rest,place-1) in scan(shift(state,sym),rest,pos-1) end end (* function to compute for some nonterminal n the set of nonterminals A added through the closure of nonterminal n such that n =c*=> .A x, where x is nullable *) val nonterms_w_null = fn nt => let val collect_nonterms = fn n => List.foldr (fn (rule as RULE {rhs=rhs as NONTERM n :: _,...},r) => (case (rest_is_null(ITEM {dot=0,rhsAfter=rhs,rule=rule})) of true => n :: r | false => r) | (_,r) => r) [] (produces n) fun dfs(a as (n,r)) = if (NontermSet.exists a) then r else List.foldr dfs (NontermSet.insert(n,r)) (collect_nonterms n) in dfs(nt,NontermSet.empty) end val nonterms_w_null = let val data = Array.array(nonterms,NontermSet.empty) fun f n = if n=nonterms then () else (Array.update(data,n,nonterms_w_null (NT n)); f (n+1)) in (f 0; fn (NT nt) => data sub nt) end (* look_info: for some nonterminal n the set of nonterms A added through the closure of the nonterminal such that n =c+=> .Ax and the lookahead accumlated for each nonterm A *) val look_info = fn nt => let val collect_nonterms = fn n => List.foldr (fn (RULE {rhs=NONTERM n :: t,...},r) => (case NTL.find ((n,nil),r) of SOME (key,data) => NTL.insert((n,Look.union(data,first t)),r) | NONE => NTL.insert ((n,first t),r)) | (_,r) => r) NTL.empty (produces n) fun dfs(a as ((key1,data1),r)) = case (NTL.find a) of SOME (_,data2) => NTL.insert((key1,Look.union(data1,data2)),r) | NONE => NTL.fold dfs (collect_nonterms key1) (NTL.insert a) in dfs((nt,nil),NTL.empty) end val look_info = if not DEBUG then look_info else fn nt => (print "look_info of "; prNonterm nt; print "=\n"; let val info = look_info nt in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* prop_look: propagate lookaheads for nonterms added in the closure of a nonterm. Lookaheads must be propagated from each nonterminal m to all nonterminals { n | m =c+=> nx, where x=*=>epsilon} *) val prop_look = fn ntl => let val upd_lookhd = fn new_look => fn (nt,r) => case NTL.find ((nt,new_look),r) of SOME (_,old_look) => NTL.insert((nt, Look.union(new_look,old_look)),r) | NONE => raise (Lalr 241) val upd_nonterm = fn ((nt,look),r) => NontermSet.fold (upd_lookhd look) (nonterms_w_null nt) r in NTL.fold upd_nonterm ntl ntl end val prop_look = if not DEBUG then prop_look else fn ntl => (print "prop_look =\n"; let val info = prop_look ntl in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* now put the information from these functions together. Create a function which takes a nonterminal n and returns a list of triplets of (a nonterm added through closure, the lookahead for the nonterm, whether the nonterm should include the lookahead for the nonterminal whose closure is being taken (i.e. first(y) for an item j of the form A -> x .n y and lookahead(j) if y =*=> epsilon) *) val closure_nonterms = let val data = Array.array(nonterms,nil: (nonterm * term list * bool) list) val do_nonterm = fn i => let val nonterms_followed_by_null = nonterms_w_null i val nonterms_added_through_closure = NTL.make_list (prop_look (look_info i)) val result = map (fn (nt,l) => (nt,l,NontermSet.exists (nt,nonterms_followed_by_null)) ) nonterms_added_through_closure in if DEBUG then (print "closure_nonterms = "; prNonterm i; print "\n"; app (fn (nt,look,nullable) => (prNonterm nt; print ":"; prLook look; case nullable of false => print "(false)\n" | true => print "(true)\n")) result; print "\n") else (); result end fun f i = if i=nonterms then () else (Array.update(data,i,do_nonterm (NT i)); f (i+1)) val _ = f 0 in fn (NT i) => data sub i end (* add_nonterm_lookahead: Add lookahead to all completion items for rules added when the closure of a given nonterm in some state is taken. It returns a list of lookahead refs to which the given nonterm's lookahead should be propagated. For each rule, it must trace the shift/gotos in the LR(0) graph to find all items of the form A-> x .B y where y =*=> epsilon or A -> x. *) val add_nonterm_lookahead = fn (nt,state) => let val f = fn ((nt,lookahead,nullable),r) => let val refs = map (findRuleRefs state) (produces nt) val refs = List.concat refs val _ = app (fn r => r := (Look.union (!r,lookahead))) refs in if nullable then refs @ r else r end in List.foldr f [] (closure_nonterms nt) end (* scan_core: Scan a core for all items of the form A -> x .B y. Applies add_nonterm_lookahead to each such B, and then merges first(y) into the list of refs returned by add_nonterm_lookahead. It returns a list of ref * ref list for all the items where y =*=> epsilon *) val scan_core = fn (CORE (l,state)) => let fun f ((item as ITEM{rhsAfter= NONTERM b :: y, dot,rule})::t,r) = (case (add_nonterm_lookahead(b,state)) of nil => r | l => let val first_y = first y val newr = if dot >= (look_pos rule) then (findRef(state,item),l)::r else r in (app (fn r => r := Look.union(!r,first_y)) l; f (t,newr)) end) | f (_ :: t,r) = f (t,r) | f (nil,r) = r in f (l,nil) end (* add end-of-parse symbols to set of items consisting of all items immediately derived from the start symbol *) val add_eop = fn (c as CORE (l,state),eop) => let fun f (item as ITEM {rule,dot,...}) = let val refs = findRuleRefs state rule in (* first take care of kernal items. Add the end-of-parse symbols to the lookahead sets for these items. Epsilon productions of the start symbol do not need to be handled specially because they will be in the kernal also *) app (fn r => r := Look.union(!r,eop)) refs; (* now take care of closure items. These are all nonterminals C which have a derivation S =+=> .C x, where x is nullable *) if dot >= (look_pos rule) then case item of ITEM{rhsAfter=NONTERM b :: _,...} => (case add_nonterm_lookahead(b,state) of nil => () | l => app (fn r => r := Look.union(!r,eop)) l) | _ => () else () end in app f l end val iterate = fn l => let fun f lookahead (nil,done) = done | f lookahead (h::t,done) = let val old = !h in h := Look.union (old,lookahead); if (length (!h)) <> (length old) then f lookahead (t,false) else f lookahead(t,done) end fun g ((from,to)::rest,done) = let val new_done = f (!from) (to,done) in g (rest,new_done) end | g (nil,done) = done fun loop true = () | loop false = loop (g (l,true)) in loop false end val lookahead = List.concat (map scan_core (nodes graph)) (* used to scan the item list of a TMPCORE and remove the items not being reduced *) val create_lcore_list = fn ((item as ITEM {rhsAfter=nil,...},ref l),r) => (item,l) :: r | (_,r) => r in add_eop(Graph.core graph 0,eop); iterate lookahead; map (fn (TMPCORE (l,state)) => LCORE (List.foldr create_lcore_list [] l, state)) new_nodes end end; mlton-20210117+dfsg/mlyacc/src/link.sml000066400000000000000000000034451416264345000175450ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) local (* create parser *) structure LrVals = MlyaccLrValsFun(structure Token = LrParser.Token structure Hdr = Header) structure Lex = LexMLYACC(structure Tokens = LrVals.Tokens structure Hdr = Header) structure Parser = JoinWithArg(structure Lex=Lex structure ParserData = LrVals.ParserData structure LrParser= LrParser) structure ParseGenParser = ParseGenParserFun(structure Parser = Parser structure Header = Header) (* create structure for computing LALR table from a grammar *) structure MakeLrTable = mkMakeLrTable(structure IntGrammar =IntGrammar structure LrTable = LrTable) (* create structures for printing LALR tables: Verbose prints a verbose description of an lalr table PrintStruct prints an ML structure representing that is an lalr table *) structure Verbose = mkVerbose(structure Errs = MakeLrTable.Errs) structure PrintStruct = mkPrintStruct(structure LrTable = MakeLrTable.LrTable structure ShrinkLrTable = ShrinkLrTableFun(structure LrTable=LrTable)) in (* returns function which takes a file name, invokes the parser on the file, does semantic checks, creates table, and prints it *) structure ParseGen = ParseGenFun(structure ParseGenParser = ParseGenParser structure MakeTable = MakeLrTable structure Verbose = Verbose structure PrintStruct = PrintStruct structure Absyn = Absyn) end mlton-20210117+dfsg/mlyacc/src/look.sml000066400000000000000000000141211416264345000175450ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkLook (structure IntGrammar : INTGRAMMAR) : LOOK = struct val sub = Array.sub infix 9 sub structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Grammar IntGrammar structure TermSet = ListOrdSet (struct type elem = term val eq = eqTerm val gt = gtTerm end) val union = TermSet.union val make_set = TermSet.make_set val prLook = fn (termToString,print) => let val printTerm = print o termToString fun f nil = print " " | f (a :: b) = (printTerm a; print " "; f b) in f end structure NontermSet = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn {rules : rule list, nonterms : int, produces : nonterm -> rule list} => let (* nullable: create a function which tells if a nonterminal is nullable or not. Method: Keep an array of booleans. The nth entry is true if NT i is nullable. If is false if we don't know whether NT i is nullable. Keep a list of rules whose remaining rhs we must prove to be null. First, scan the list of rules and remove those rules whose rhs contains a terminal. These rules are not nullable. Now iterate through the rules that were left: (1) if there is no remaining rhs we have proved that the rule is nullable, mark the nonterminal for the rule as nullable (2) if the first element of the remaining rhs is nullable, place the rule back on the list with the rest of the rhs (3) if we don't know whether the nonterminal is nullable, place it back on the list (4) repeat until the list does not change. We have found all the possible nullable rules. *) val nullable = let fun add_rule (RULE { lhs, rhs, ... }, r) = let fun addNT (TERM _, _) = NONE | addNT (_, NONE) = NONE | addNT (NONTERM (NT i), SOME ntlist) = SOME (i :: ntlist) in case foldr addNT (SOME []) rhs of NONE => r | SOME ntlist => (lhs, ntlist) :: r end val items = List.foldr add_rule [] rules val nullable = Array.array(nonterms,false) fun f ((NT i,nil),(l,_)) = (Array.update(nullable,i,true); (l,true)) | f (a as (lhs,(h::t)),(l,change)) = (case (nullable sub h) of false => (a::l,change) | true => ((lhs,t)::l,true)) fun prove(l,true) = prove(List.foldr f (nil,false) l) | prove(_,false) = () in (prove(items,true); fn (NT i) => nullable sub i) end (* scanRhs : look at a list of symbols, scanning past nullable nonterminals, applying addSymbol to the symbols scanned *) fun scanRhs addSymbol = let fun f (nil,result) = result | f ((sym as NONTERM nt) :: rest,result) = if nullable nt then f (rest,addSymbol(sym,result)) else addSymbol(sym,result) | f ((sym as TERM _) :: _,result) = addSymbol(sym,result) in f end (* accumulate: look at the start of the right-hand-sides of rules, looking past nullable nonterminals, applying addObj to the visible symbols. *) fun accumulate(rules, empty, addObj) = List.foldr (fn (RULE {rhs,...},r) =>(scanRhs addObj) (rhs,r)) empty rules val nontermMemo = fn f => let val lookup = Array.array(nonterms,nil) fun g i = if i=nonterms then () else (Array.update(lookup,i,f (NT i)); g (i+1)) in (g 0; fn (NT j) => lookup sub j) end (* first1: the FIRST set of a nonterminal in the grammar. Only looks at other terminals, but it is clever enough to move past nullable nonterminals at the start of a production. *) fun first1 nt = accumulate(produces nt, TermSet.empty, fn (TERM t, set) => TermSet.insert (t,set) | (_, set) => set) val first1 = nontermMemo(first1) (* starters1: given a nonterminal "nt", return the set of nonterminals which can start its productions. Looks past nullables, but doesn't recurse *) fun starters1 nt = accumulate(produces nt, nil, fn (NONTERM nt, set) => NontermSet.insert(nt,set) | (_, set) => set) val starters1 = nontermMemo(starters1) (* first: maps a nonterminal to its first-set. Get all the starters of the nonterminal, get the first1 terminal set of each of these, union the whole lot together *) fun first nt = List.foldr (fn (a,r) => TermSet.union(r,first1 a)) [] (NontermSet.closure (NontermSet.singleton nt, starters1)) val first = nontermMemo(first) (* prefix: all possible terminals starting a symbol list *) fun prefix symbols = scanRhs (fn (TERM t,r) => TermSet.insert(t,r) | (NONTERM nt,r) => TermSet.union(first nt,r)) (symbols,nil) fun nullable_string ((TERM t) :: r) = false | nullable_string ((NONTERM nt) :: r) = (case (nullable nt) of true => nullable_string r | f => f) | nullable_string nil = true in {nullable = nullable, first = prefix} end end; mlton-20210117+dfsg/mlyacc/src/mklrtable.sml000066400000000000000000000434341416264345000205670ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkMakeLrTable (structure IntGrammar : INTGRAMMAR structure LrTable : LR_TABLE sharing type LrTable.term = IntGrammar.Grammar.term sharing type LrTable.nonterm = IntGrammar.Grammar.nonterm ) : MAKE_LR_TABLE = struct val sub = Array.sub infix 9 sub structure Core = mkCore(structure IntGrammar = IntGrammar) structure CoreUtils = mkCoreUtils(structure IntGrammar = IntGrammar structure Core = Core) structure Graph = mkGraph(structure IntGrammar = IntGrammar structure Core = Core structure CoreUtils = CoreUtils) structure Look = mkLook(structure IntGrammar = IntGrammar) structure Lalr = mkLalr(structure IntGrammar = IntGrammar structure Core = Core structure Graph = Graph structure Look = Look) structure LrTable = LrTable structure IntGrammar = IntGrammar structure Grammar = IntGrammar.Grammar structure GotoList = ListOrdSet (struct type elem = Grammar.nonterm * LrTable.state val eq = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a=b val gt = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a>b end) structure Errs : LR_ERRS = struct structure LrTable = LrTable datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NOT_REDUCED of int | NS of LrTable.term * int | START of int val summary = fn l => let val numRR = ref 0 val numSR = ref 0 val numSTART = ref 0 val numNOT_REDUCED = ref 0 val numNS = ref 0 fun loop (h::t) = (case h of RR _ => numRR := !numRR+1 | SR _ => numSR := !numSR+1 | START _ => numSTART := !numSTART+1 | NOT_REDUCED _ => numNOT_REDUCED := !numNOT_REDUCED+1 | NS _ => numNS := !numNS+1; loop t) | loop nil = {rr = !numRR, sr = !numSR, start = !numSTART, not_reduced = !numNOT_REDUCED, nonshift = !numNS} in loop l end val printSummary = fn say => fn l => let val {rr,sr,start, not_reduced,nonshift} = summary l val say_plural = fn (i,s) => (say (Int.toString i); say " "; case i of 1 => (say s) | _ => (say s; say "s")) val say_error = fn (args as (i,s)) => case i of 0 => () | i => (say_plural args; say "\n") in say_error(rr,"reduce/reduce conflict"); say_error(sr,"shift/reduce conflict"); if nonshift<>0 then (say "non-shiftable terminal used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if start<>0 then (say "start symbol used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if not_reduced<>0 then (say_plural(not_reduced,"rule"); say " not reduced\n") else () end end open IntGrammar Grammar Errs LrTable Core (* rules for resolving conflicts: shift/reduce: If either the terminal or the rule has no precedence, a shift/reduce conflict is reported. A shift is chosen for the table. If both have precedences, the action with the higher precedence is chosen. If the precedences are equal, neither the shift nor the reduce is chosen. reduce/reduce: A reduce/reduce conflict is reported. The lowest numbered rule is chosen for reduction. *) (* method for filling tables - first compute the reductions called for in a state, then add the shifts for the state to this information. How to compute the reductions: A reduction initially is given as an item and a lookahead set calling for reduction by that item. The first reduction is mapped to a list of terminal * rule pairs. Each additional reduction is then merged into this list and reduce/reduce conflicts are resolved according to the rule given. Missed Errors: This method misses some reduce/reduce conflicts that exist because some reductions are removed from the list before conflicting reductions can be compared against them. All reduce/reduce conflicts, however, can be generated given a list of the reduce/reduce conflicts generated by this method. This can be done by taking the transitive closure of the relation given by the list. If reduce/reduce (a,b) and reduce/reduce (b,c) are true, then reduce/reduce (a,c) is true. The relation is symmetric and transitive. Adding shifts: Finally scan the list merging in shifts and resolving conflicts according to the rule given. Missed Shift/Reduce Errors: Some errors may be missed by this method because some reductions were removed as the result of reduce/reduce conflicts. For a shift/reduce conflict of term a, reduction by rule n, shift/reduce conficts exist for all rules y such that reduce/reduce (x,y) or reduce/reduce (y,x) is true. *) fun unREDUCE (REDUCE num) = num | unREDUCE _ = raise Fail "bug: unexpected action (expected REDUCE)" val mergeReduces = let val merge = fn state => let fun f (j as (pair1 as (T t1,action1)) :: r1, k as (pair2 as (T t2,action2)) :: r2,result,errs) = if t1 < t2 then f(r1,k,pair1::result,errs) else if t1 > t2 then f(j,r2,pair2::result,errs) else let val num1 = unREDUCE action1 val num2 = unREDUCE action2 val errs = RR(T t1,state,num1,num2) :: errs val action = if num1 < num2 then pair1 else pair2 in f(r1,r2,action::result,errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (pair1::r,nil,result,errs) = f(r,nil,pair1::result,errs) | f (nil,pair2 :: r,result,errs) = f(nil,r,pair2::result,errs) in f end in fn state => fn ((ITEM {rule=RULE {rulenum,...},...}, lookahead), (reduces,errs)) => let val action = REDUCE rulenum val actions = map (fn a=>(a,action)) lookahead in case reduces of nil => (actions,errs) | _ => merge state (reduces,actions,nil,errs) end end val computeActions = fn (rules,precedence,graph,defaultReductions) => let val rulePrec = let val precData = Array.array(length rules,NONE : int option) in app (fn RULE {rulenum=r,precedence=p,...} => Array.update(precData,r,p)) rules; fn i => precData sub i end fun mergeShifts(state,shifts,nil) = (shifts,nil) | mergeShifts(state,nil,reduces) = (reduces,nil) | mergeShifts(state,shifts,reduces) = let fun f(shifts as (pair1 as (T t1,_)) :: r1, reduces as (pair2 as (T t2,action)) :: r2, result,errs) = if t1 < t2 then f(r1,reduces,pair1 :: result,errs) else if t1 > t2 then f(shifts,r2,pair2 :: result,errs) else let val rulenum = unREDUCE action val (term1,_) = pair1 in case (precedence term1,rulePrec rulenum) of (SOME i,SOME j) => if i>j then f(r1,r2,pair1 :: result,errs) else if j>i then f(r1,r2,pair2 :: result,errs) else f(r1,r2,(T t1, ERROR)::result,errs) | (_,_) => f(r1,r2,pair1 :: result, SR (term1,state,rulenum)::errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (nil,h::t,result,errs) = f (nil,t,h::result,errs) | f (h::t,nil,result,errs) = f (t,nil,h::result,errs) in f(shifts,reduces,nil,nil) end fun mapCore ({edge=symbol,to=CORE (_,state)}::r,shifts,gotos) = (case symbol of (TERM t) => mapCore (r,(t,SHIFT(STATE state))::shifts,gotos) | (NONTERM nt) => mapCore(r,shifts,(nt,STATE state)::gotos) ) | mapCore (nil,shifts,gotos) = (rev shifts,rev gotos) fun pruneError ((_,ERROR)::rest) = pruneError rest | pruneError (a::rest) = a :: pruneError rest | pruneError nil = nil in fn (Lalr.LCORE (reduceItems,state),c as CORE (shiftItems,state')) => if DEBUG andalso (state <> state') then let exception MkTable in raise MkTable end else let val (shifts,gotos) = mapCore (Graph.edges(c,graph),nil,nil) val tableState = STATE state in case reduceItems of nil => ((shifts,ERROR),gotos,nil) | h :: nil => let val (ITEM {rule=RULE {rulenum,...},...}, l) = h val (reduces,_) = mergeReduces tableState (h,(nil,nil)) val (actions,errs) = mergeShifts(tableState, shifts,reduces) val actions' = pruneError actions val (actions,default) = let fun hasReduce (nil,actions) = (rev actions,REDUCE rulenum) | hasReduce ((a as (_,SHIFT _)) :: r,actions) = hasReduce(r,a::actions) | hasReduce (_ :: r,actions) = hasReduce(r,actions) fun loop (nil,actions) = (rev actions,ERROR) | loop ((a as (_,SHIFT _)) :: r,actions) = loop(r,a::actions) | loop ((a as (_,REDUCE _)) :: r,actions) = hasReduce(r,actions) | loop (_ :: r,actions) = loop(r,actions) in if defaultReductions andalso length actions = length actions' then loop(actions,nil) else (actions',ERROR) end in ((actions,default), gotos,errs) end | l => let val (reduces,errs1) = List.foldr (mergeReduces tableState) (nil,nil) l val (actions,errs2) = mergeShifts(tableState,shifts,reduces) in ((pruneError actions,ERROR),gotos,errs1@errs2) end end end val mkTable = fn (grammar as GRAMMAR{rules,terms,nonterms,start, precedence,termToString,noshift, nontermToString,eop},defaultReductions) => let val symbolToString = fn (TERM t) => termToString t | (NONTERM nt) => nontermToString nt val {rules,graph,produces,epsProds,...} = Graph.mkGraph grammar val {nullable,first} = Look.mkFuncs{rules=rules,produces=produces,nonterms=nonterms} val lcores = Lalr.addLookahead {graph=graph, nullable=nullable, produces=produces, eop=eop, nonterms=nonterms, first=first, rules=rules, epsProds=epsProds, print=(fn s=>TextIO.output(TextIO.stdOut,s)), termToString = termToString, nontermToString = nontermToString} fun zip (h::t,h'::t') = (h,h') :: zip(t,t') | zip (nil,nil) = nil | zip _ = let exception MkTable in raise MkTable end fun unzip l = let fun f ((a,b,c)::r,j,k,l) = f(r,a::j,b::k,c::l) | f (nil,j,k,l) = (rev j,rev k,rev l) in f(l,nil,nil,nil) end val (actions,gotos,errs) = let val doState = computeActions(rules,precedence,graph, defaultReductions) in unzip (map doState (zip(lcores,Graph.nodes graph))) end (* add goto from state 0 to a new state. The new state has accept actions for all of the end-of-parse symbols *) val (actions,gotos,errs) = case gotos of nil => (actions,gotos,errs) | h :: t => let val newStateActions = (map (fn t => (t,ACCEPT)) (Look.make_set eop),ERROR) val state0Goto = GotoList.insert((start,STATE (length actions)),h) in (actions @ [newStateActions], state0Goto :: (t @ [nil]), errs @ [nil]) end val startErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => if (List.exists (fn NONTERM a => a=start | _ => false) rhs) then START rulenum :: r else r) [] rules val nonshiftErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => (List.foldr (fn (nonshift,r) => if (List.exists (fn TERM a => a=nonshift | _ => false) rhs) then NS(nonshift,rulenum) :: r else r) r noshift) ) [] rules val notReduced = let val ruleReduced = Array.array(length rules,false) val test = fn REDUCE i => Array.update(ruleReduced,i,true) | _ => () val _ = app (fn (actions,default) => (app (fn (_,r) => test r) actions; test default) ) actions; fun scan (i,r) = if i >= 0 then scan(i-1, if ruleReduced sub i then r else NOT_REDUCED i :: r) else r in scan(Array.length ruleReduced-1,nil) end handle Subscript => (if DEBUG then print "rules not numbered correctly!" else (); nil) val numstates = length actions val allErrs = startErrs @ notReduced @ nonshiftErrs @ (List.concat errs) fun convert_to_pairlist(nil : ('a * 'b) list): ('a,'b) pairlist = EMPTY | convert_to_pairlist ((a,b) :: r) = PAIR(a,b,convert_to_pairlist r) in (mkLrTable {actions=Array.fromList(map (fn (a,b) => (convert_to_pairlist a,b)) actions), gotos=Array.fromList (map convert_to_pairlist gotos), numRules=length rules,numStates=length actions, initialState=STATE 0}, let val errArray = Array.fromList errs in fn (STATE state) => errArray sub state end, fn print => let val printCore = prCore(symbolToString,nontermToString,print) val core = Graph.core graph in fn STATE state => printCore (if state=(numstates-1) then Core.CORE (nil,state) else (core state)) end, allErrs) end end; mlton-20210117+dfsg/mlyacc/src/mkprstruct.sml000066400000000000000000000165641416264345000210340ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkPrintStruct(structure LrTable : LR_TABLE structure ShrinkLrTable : SHRINK_LR_TABLE sharing LrTable = ShrinkLrTable.LrTable):PRINT_STRUCT = struct val sub = Array.sub infix 9 sub structure LrTable = LrTable open ShrinkLrTable LrTable (* lineLength = approximately the largest number of characters to allow on a line when printing out an encode string *) val lineLength = 72 (* maxLength = length of a table entry. All table entries are encoded using two 16-bit integers, one for the terminal number and the other for the entry. Each integer is printed as two characters (low byte, high byte), using the ML ascii escape sequence. We need 4 characters for each escape sequence and 16 characters for each entry *) val maxLength = 16 (* number of entries we can fit on a row *) val numEntries = lineLength div maxLength (* convert integer between 0 and 255 to the three character ascii decimal escape sequence for it *) val chr = let val lookup = Array.array(256,"\000") val intToString = fn i => if i>=100 then "\\" ^ (Int.toString i) else if i>=10 then "\\0" ^ (Int.toString i) else "\\00" ^ (Int.toString i) fun loop n = if n=256 then () else (Array.update(lookup,n,intToString n); loop (n+1)) in loop 0; fn i => lookup sub i end val makeStruct = fn {table,name,print,verbose} => let val states = numStates table val rules = numRules table fun printPairList (prEntry : 'a * 'b -> unit) l = let fun f (EMPTY,_) = () | f (PAIR(a,b,r),count) = if count >= numEntries then (print "\\\n\\"; prEntry(a,b); f(r,1)) else (prEntry(a,b); f(r,(count+1))) in f(l,0) end val printList : ('a -> unit) -> 'a list -> unit = fn prEntry => fn l => let fun f (nil,_) = () | f (a :: r,count) = if count >= numEntries then (print "\\\n\\"; prEntry a; f(r,1)) else (prEntry a; f(r,count+1)) in f(l,0) end val prEnd = fn _ => print "\\000\\000\\\n\\" fun printPairRow prEntry = let val printEntries = printPairList prEntry in fn l => (printEntries l; prEnd()) end fun printPairRowWithDefault (prEntry,prDefault) = let val f = printPairRow prEntry in fn (l,default) => (prDefault default; f l) end fun printTable (printRow,count) = (print "\"\\\n\\"; let fun f i = if i=count then () else (printRow i; f (i+1)) in f 0 end; print"\"\n") val printChar = print o chr (* print an integer between 0 and 2^16-1 as a 2-byte character, with the low byte first *) val printInt = fn i => (printChar (i mod 256); printChar (i div 256)) (* encode actions as integers: ACCEPT => 0 ERROR => 1 SHIFT i => 2 + i REDUCE rulenum => numstates+2+rulenum *) val printAction = fn (REDUCE rulenum) => printInt (rulenum+states+2) | (SHIFT (STATE i)) => printInt (i+2) | ACCEPT => printInt 0 | ERROR => printInt 1 val printTermAction = fn (T t,action) => (printInt (t+1); printAction action) val printGoto = fn (NT n,STATE s) => (printInt (n+1); printInt s) val ((rowCount,rowNumbers,actionRows),entries)= shrinkActionList(table,verbose) val getActionRow = let val a = Array.fromList actionRows in fn i => a sub i end val printGotoRow : int -> unit = let val f = printPairRow printGoto val g = describeGoto table in fn i => f (g (STATE i)) end val printActionRow = let val f = printPairRowWithDefault(printTermAction,printAction) in fn i => f (getActionRow i) end in print "val "; print name; print "="; print "let val actionRows =\n"; printTable(printActionRow,rowCount); print "val actionRowNumbers =\n\""; printList (fn i => printInt i) rowNumbers; print "\"\n"; print "val gotoT =\n"; printTable(printGotoRow,states); print "val numstates = "; print (Int.toString states); print "\nval numrules = "; print (Int.toString rules); print "\n\ \val s = ref \"\" and index = ref 0\n\ \val string_to_int = fn () => \n\ \let val i = !index\n\ \in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256\n\ \end\n\ \val string_to_list = fn s' =>\n\ \ let val len = String.size s'\n\ \ fun f () =\n\ \ if !index < len then string_to_int() :: f()\n\ \ else nil\n\ \ in index := 0; s := s'; f ()\n\ \ end\n\ \val string_to_pairlist = fn (conv_key,conv_entry) =>\n\ \ let fun f () =\n\ \ case string_to_int()\n\ \ of 0 => EMPTY\n\ \ | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f())\n\ \ in f\n\ \ end\n\ \val string_to_pairlist_default = fn (conv_key,conv_entry) =>\n\ \ let val conv_row = string_to_pairlist(conv_key,conv_entry)\n\ \ in fn () =>\n\ \ let val default = conv_entry(string_to_int())\n\ \ val row = conv_row()\n\ \ in (row,default)\n\ \ end\n\ \ end\n\ \val string_to_table = fn (convert_row,s') =>\n\ \ let val len = String.size s'\n\ \ fun f ()=\n\ \ if !index < len then convert_row() :: f()\n\ \ else nil\n\ \ in (s := s'; index := 0; f ())\n\ \ end\n\ \local\n\ \ val memo = Array.array(numstates+numrules,ERROR)\n\ \ val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1))\n\ \ fun f i =\n\ \ if i=numstates then g i\n\ \ else (Array.update(memo,i,SHIFT (STATE i)); f (i+1))\n\ \ in f 0 handle General.Subscript => ()\n\ \ end\n\ \in\n\ \val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2))\n\ \end\n\ \val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT))\n\ \val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows)\n\ \val actionRowNumbers = string_to_list actionRowNumbers\n\ \val actionT = let val actionRowLookUp=\n\ \let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end\n\ \in Array.fromList(List.map actionRowLookUp actionRowNumbers)\n\ \end\n\ \in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules,\n\ \numStates=numstates,initialState=STATE "; print (Int.toString ((fn (STATE i) => i) (initialState table))); print "}\nend\n"; entries end end; mlton-20210117+dfsg/mlyacc/src/parse.sml000066400000000000000000000024041416264345000177140ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor ParseGenParserFun(structure Header : HEADER structure Parser : ARG_PARSER where type pos = Header.pos sharing type Parser.result = Header.parseResult sharing type Parser.arg = Header.inputSource = Parser.lexarg ) : PARSE_GEN_PARSER = struct structure Header = Header val parse = fn file => let val in_str = TextIO.openIn file val source = Header.newSource(file,in_str,TextIO.stdOut) val error = fn (s : string,p:Header.pos,_) => Header.error source p s val stream = Parser.makeLexer (fn i => (TextIO.inputN(in_str,i))) source val (result,_) = (#line Header.pos := 1; #start Header.pos := 0; Header.text := nil; Parser.parse(15,stream,error,source)) in (TextIO.closeIn in_str; (result,source)) end end; mlton-20210117+dfsg/mlyacc/src/shrink.sml000066400000000000000000000200441416264345000201000ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi *) signature SORT_ARG = sig type entry val gt : entry * entry -> bool end signature SORT = sig type entry val sort : entry list -> entry list end signature EQUIV_ARG = sig type entry val gt : entry * entry -> bool val eq : entry * entry -> bool end signature EQUIV = sig type entry (* equivalences: take a list of entries and divides them into equivalence classes numbered 0 to n-1. It returns a triple consisting of: * the number of equivalence classes * a list which maps each original entry to an equivalence class. The nth entry in this list gives the equivalence class for the nth entry in the original entry list. * a list which maps equivalence classes to some representative element. The nth entry in this list is an element from the nth equivalence class *) val equivalences : entry list -> (int * int list * entry list) end (* An O(n lg n) merge sort routine *) functor MergeSortFun(A : SORT_ARG) : SORT = struct type entry = A.entry (* sort: an O(n lg n) merge sort routine. We create a list of lists and then merge these lists in passes until only one list is left.*) fun sort nil = nil | sort l = let (* merge: merge two lists *) fun merge (l as a::at,r as b::bt) = if A.gt(a,b) then b :: merge(l,bt) else a :: merge(at,r) | merge (l,nil) = l | merge (nil,r) = r (* scan: merge pairs of lists on a list of lists. Reduces the number of lists by about 1/2 *) fun scan (a :: b :: rest) = merge(a,b) :: scan rest | scan l = l (* loop: calls scan on a list of lists until only one list is left. It terminates only if the list of lists is nonempty. (The pattern match for sort ensures this.) *) fun loop (a :: nil) = a | loop l = loop (scan l) in loop (map (fn a => [a]) l) end end (* an O(n lg n) routine for placing items in equivalence classes *) functor EquivFun(A : EQUIV_ARG) : EQUIV = struct val sub = Array.sub infix 9 sub (* Our algorithm for finding equivalence class is simple. The basic idea is to sort the entries and place duplicates entries in the same equivalence class. Let the original entry list be E. We map E to a list of a pairs consisting of the entry and its position in E, where the positions are numbered 0 to n-1. Call this list of pairs EP. We then sort EP on the original entries. The second elements in the pairs now specify a permutation that will return us to EP. We then scan the sorted list to create a list R of representative entries, a list P of integers which permutes the sorted list back to the original list and a list SE of integers which gives the equivalence class for the nth entry in the sorted list . We then return the length of R, R, and the list that results from permuting SE by P. *) type entry = A.entry val gt = fn ((a,_),(b,_)) => A.gt(a,b) structure Sort = MergeSortFun(type entry = A.entry * int val gt = gt) val assignIndex = fn l => let fun loop (index,nil) = nil | loop (index,h :: t) = (h,index) :: loop(index+1,t) in loop (0,l) end local fun loop ((e,_) :: t, prev, class, R , SE) = if A.eq(e,prev) then loop(t,e,class,R, class :: SE) else loop(t,e,class+1,e :: R, (class + 1) :: SE) | loop (nil,_,_,R,SE) = (rev R, rev SE) in val createEquivalences = fn nil => (nil,nil) | (e,_) :: t => loop(t, e, 0, [e],[0]) end val inversePermute = fn permutation => fn nil => nil | l as h :: _ => let val result = Array.array(length l,h) fun loop (elem :: r, dest :: s) = (Array.update(result,dest,elem); loop(r,s)) | loop _ = () fun listofarray i = if i < Array.length result then (result sub i) :: listofarray (i+1) else nil in loop (l,permutation); listofarray 0 end fun makePermutation x = map (fn (_,b) => b) x val equivalences = fn l => let val EP = assignIndex l val sorted = Sort.sort EP val P = makePermutation sorted val (R, SE) = createEquivalences sorted in (length R, inversePermute P SE, R) end end functor ShrinkLrTableFun(structure LrTable : LR_TABLE) : SHRINK_LR_TABLE = struct structure LrTable = LrTable open LrTable val gtAction = fn (a,b) => case a of SHIFT (STATE s) => (case b of SHIFT (STATE s') => s>s' | _ => true) | REDUCE i => (case b of SHIFT _ => false | REDUCE i' => i>i' | _ => true) | ACCEPT => (case b of ERROR => true | _ => false) | ERROR => false structure ActionEntryList = struct type entry = (term, action) pairlist * action local fun eqlist (EMPTY, EMPTY) = true | eqlist (PAIR (T t,d,r),PAIR(T t',d',r')) = t=t' andalso d=d' andalso eqlist(r,r') | eqlist _ = false fun gtlist (PAIR _,EMPTY) = true | gtlist (PAIR(T t,d,r),PAIR(T t',d',r')) = t>t' orelse (t=t' andalso (gtAction(d,d') orelse (d=d' andalso gtlist(r,r')))) | gtlist _ = false in fun eq ((l,a): entry, (l',a'): entry) = a = a' andalso eqlist (l,l') fun gt ((l,a): entry, (l',a'): entry) = gtAction(a,a') orelse (a=a' andalso gtlist(l,l')) end end (* structure GotoEntryList = struct type entry = (nonterm,state) pairlist val rec eq = fn (EMPTY,EMPTY) => true | (PAIR (t,d,r),PAIR(t',d',r')) => t=t' andalso d=d' andalso eq(r,r') | _ => false val rec gt = fn (PAIR _,EMPTY) => true | (PAIR(NT t,STATE d,r),PAIR(NT t',STATE d',r')) => t>t' orelse (t=t' andalso (d>d' orelse (d=d' andalso gt(r,r')))) | _ => false end *) structure EquivActionList = EquivFun(ActionEntryList) val states = fn max => let fun f i=if i int = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end val size : (('a,'b) pairlist * 'c) list -> int = fn l => let val c = ref 0 in (app (fn (row,_) => c := !c + length row) l; !c) end val shrinkActionList = fn (table,verbose) => case EquivActionList.equivalences (map (describeActions table) (states (numStates table))) of result as (_,_,l) => (result,if verbose then size l else 0) end; mlton-20210117+dfsg/mlyacc/src/sigs.sml000066400000000000000000000327401416264345000175550ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989, 1991 Andrew W. Appel, David R. Tarditi *) signature HEADER = sig type pos = {line : int, col : int} val pos : {line : int ref, start : int ref} val text : string list ref type inputSource val newSource : string * TextIO.instream * TextIO.outstream -> inputSource val error : inputSource -> pos -> string -> unit val warn : inputSource -> pos -> string -> unit val errorOccurred : inputSource -> unit -> bool datatype symbol = SYMBOL of string * pos val symbolName : symbol -> string val symbolPos : symbol -> pos val symbolMake : string * pos -> symbol type ty val tyName : ty -> string val tyMake : string -> ty (* associativities: each kind of associativity is assigned a unique integer *) datatype prec = LEFT | RIGHT | NONASSOC datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string | TOKEN_SIG_INFO of string datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : {text : string, pos : pos}, prec : symbol option} datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol * ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol * ty option) list option, control : control list, value : (symbol * string) list} val join_decls : declData * declData * inputSource * pos -> declData type parseResult val getResult : parseResult -> string * declData * rule list end; signature PARSE_GEN_PARSER = sig structure Header : HEADER val parse : string -> Header.parseResult * Header.inputSource end; signature PARSE_GEN = sig val parseGen : string -> unit end; signature GRAMMAR = sig datatype term = T of int datatype nonterm = NT of int datatype symbol = TERM of term | NONTERM of nonterm (* grammar: terminals should be numbered from 0 to terms-1, nonterminals should be numbered from 0 to nonterms-1, rules should be numbered between 0 and (length rules) - 1, higher precedence binds tighter, start nonterminal should not occur on the rhs of any rule *) datatype grammar = GRAMMAR of {rules: {lhs : nonterm, rhs : symbol list, precedence : int option, rulenum : int } list, terms: int, nonterms: int, start : nonterm, eop : term list, noshift : term list, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end (* signature for internal version of grammar *) signature INTGRAMMAR = sig structure Grammar : GRAMMAR structure SymbolAssoc : TABLE structure NontermAssoc : TABLE sharing type SymbolAssoc.key = Grammar.symbol sharing type NontermAssoc.key = Grammar.nonterm datatype rule = RULE of {lhs : Grammar.nonterm, rhs : Grammar.symbol list, (* internal number of rule - convenient for producing LR graph *) num : int, rulenum : int, precedence : int option} val gtTerm : Grammar.term * Grammar.term -> bool val eqTerm : Grammar.term * Grammar.term -> bool val gtNonterm : Grammar.nonterm * Grammar.nonterm -> bool val eqNonterm : Grammar.nonterm * Grammar.nonterm -> bool val gtSymbol : Grammar.symbol * Grammar.symbol -> bool val eqSymbol : Grammar.symbol * Grammar.symbol -> bool (* Debugging information will be generated only if DEBUG is true. *) val DEBUG : bool val prRule : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> 'b) -> rule -> unit val prGrammar : (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> Grammar.grammar -> unit end signature CORE = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar datatype item = ITEM of { rule : IntGrammar.rule, dot : int, (* rhsAfter: The portion of the rhs of a rule that lies after the dot *) rhsAfter: Grammar.symbol list } (* eqItem and gtItem compare items *) val eqItem : item * item -> bool val gtItem : item * item -> bool (* functions for maintaining ordered item lists *) val insert : item * item list -> item list val union : item list * item list -> item list (* core: a set of items. It is represented by an ordered list of items. The list is in ascending order The rule numbers and the positions of the dots are used to order the items. *) datatype core = CORE of item list * int (* state # *) (* gtCore and eqCore compare the lists of items *) val gtCore : core * core -> bool val eqCore : core * core -> bool (* functions for debugging *) val prItem : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> item -> unit val prCore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> core -> unit end signature CORE_UTILS = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar (* mkFuncs: create functions for the set of productions derived from a nonterminal, the cores that result from shift/gotos from a core, and return a list of rules *) val mkFuncs : Grammar.grammar -> { produces : Grammar.nonterm -> IntGrammar.rule list, (* shifts: take a core and compute all the cores that result from shifts/gotos on symbols *) shifts : Core.core -> (Grammar.symbol*Core.item list) list, rules: IntGrammar.rule list, (* epsProds: take a core compute epsilon productions for it *) epsProds : Core.core -> IntGrammar.rule list} end signature LRGRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar type graph val edges : Core.core * graph -> {edge:Grammar.symbol,to:Core.core} list val nodes : graph -> Core.core list val shift : graph -> int * Grammar.symbol -> int (* int = state # *) val core : graph -> int -> Core.core (* get core for a state *) (* mkGraph: compute the LR(0) sets of items *) val mkGraph : Grammar.grammar -> {graph : graph, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds: Core.core -> IntGrammar.rule list} val prGraph: (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> graph -> unit end signature LOOK = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar val union : Grammar.term list * Grammar.term list -> Grammar.term list val make_set : Grammar.term list -> Grammar.term list val mkFuncs : {rules : IntGrammar.rule list, nonterms : int, produces : Grammar.nonterm -> IntGrammar.rule list} -> {nullable: Grammar.nonterm -> bool, first : Grammar.symbol list -> Grammar.term list} val prLook : (Grammar.term -> string) * (string -> unit) -> Grammar.term list -> unit end signature LALR_GRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH sharing Grammar = IntGrammar.Grammar = Core.Grammar = Graph.Grammar sharing IntGrammar = Core.IntGrammar = Graph.IntGrammar sharing Core = Graph.Core datatype lcore = LCORE of (Core.item * Grammar.term list) list * int val addLookahead : {graph : Graph.graph, first : Grammar.symbol list -> Grammar.term list, eop : Grammar.term list, nonterms : int, nullable: Grammar.nonterm -> bool, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds : Core.core -> IntGrammar.rule list, print : string -> unit, (* for debugging *) termToString : Grammar.term -> string, nontermToString : Grammar.nonterm -> string} -> lcore list val prLcore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (Grammar.term -> string) * (string -> unit) -> lcore -> unit end (* LR_ERRS: errors found while constructing an LR table *) signature LR_ERRS = sig structure LrTable : LR_TABLE (* RR = reduce/reduce, SR = shift/reduce NS: non-shiftable terminal found on the rhs of a rule NOT_REDUCED n: rule number n was not reduced START n : start symbol found on the rhs of rule n *) datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NS of LrTable.term * int | NOT_REDUCED of int | START of int val summary : err list -> {rr : int, sr: int, not_reduced : int, start : int,nonshift : int} val printSummary : (string -> unit) -> err list -> unit end (* PRINT_STRUCT: prints a structure which includes a value 'table' and a structure Table whose signature matches LR_TABLE. The table in the printed structure will contain the same information as the one passed to printStruct, although the representation may be different. It returns the number of entries left in the table after compaction.*) signature PRINT_STRUCT = sig structure LrTable : LR_TABLE val makeStruct : {table : LrTable.table, name : string, print: string -> unit, verbose : bool } -> int end (* VERBOSE: signature for a structure which takes a table and creates a verbose description of it *) signature VERBOSE = sig structure Errs : LR_ERRS val printVerbose : {table : Errs.LrTable.table, entries : int, termToString : Errs.LrTable.term -> string, nontermToString : Errs.LrTable.nonterm -> string, stateErrs : Errs.LrTable.state -> Errs.err list, errs : Errs.err list, print: string -> unit, printCores : (string -> unit) -> Errs.LrTable.state -> unit, printRule : (string -> unit) -> int -> unit} -> unit end (* MAKE_LR_TABLE: signature for a structure which includes a structure matching the signature LR_TABLE and a function which maps grammars to tables *) signature MAKE_LR_TABLE = sig structure Grammar : GRAMMAR structure Errs : LR_ERRS structure LrTable : LR_TABLE sharing Errs.LrTable = LrTable sharing type LrTable.term = Grammar.term sharing type LrTable.nonterm = Grammar.nonterm (* boolean value determines whether default reductions will be used. If it is true, reductions will be used. *) val mkTable : Grammar.grammar * bool -> LrTable.table * (LrTable.state -> Errs.err list) * (* errors in a state *) ((string -> unit) -> LrTable.state -> unit) * Errs.err list (* list of all errors *) end; (* SHRINK_LR_TABLE: finds unique action entry rows in the action table for the LR parser *) signature SHRINK_LR_TABLE = sig (* Takes an action table represented as a list of action rows. It returns the number of unique rows left in the action table, a list of integers which maps each original row to a unique row, and a list of unique rows *) structure LrTable : LR_TABLE val shrinkActionList : LrTable.table * bool -> (int * int list * ((LrTable.term,LrTable.action) LrTable.pairlist * LrTable.action) list) * int end mlton-20210117+dfsg/mlyacc/src/utils.sig000066400000000000000000000034341416264345000177350ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) signature ORDSET = sig type set type elem exception Select_arb val app : (elem -> unit) -> set -> unit and card: set -> int and closure: set * (elem -> set) -> set and difference: set * set -> set and elem_eq: (elem * elem -> bool) and elem_gt : (elem * elem -> bool) and empty: set and exists: (elem * set) -> bool and find : (elem * set) -> elem option and fold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and insert: (elem * set) -> set and is_empty: set -> bool and make_list: set -> elem list and make_set: (elem list -> set) and partition: (elem -> bool) -> (set -> set * set) and remove: (elem * set) -> set and revfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and select_arb: set -> elem and set_eq: (set * set) -> bool and set_gt: (set * set) -> bool and singleton: (elem -> set) and union: set * set -> set end signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end; mlton-20210117+dfsg/mlyacc/src/utils.sml000066400000000000000000000407761416264345000177600ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* Implementation of ordered sets using ordered lists and red-black trees. The code for red-black trees was originally written by Norris Boyd, which was modified for use here. *) (* ordered sets implemented using ordered lists. Upper bound running times for functions implemented here: app = O(n) card = O(n) closure = O(n^2) difference = O(n+m), where n,m = the size of the two sets used here. empty = O(1) exists = O(n) find = O(n) fold = O(n) insert = O(n) is_empty = O(1) make_list = O(1) make_set = O(n^2) partition = O(n) remove = O(n) revfold = O(n) select_arb = O(1) set_eq = O(n), where n = the cardinality of the smaller set set_gt = O(n), ditto singleton = O(1) union = O(n+m) *) functor ListOrdSet(B : sig type elem val gt : elem * elem -> bool val eq : elem * elem -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq type set = elem list exception Select_arb val empty = nil val insert = fn (key,s) => let fun f (l as (h::t)) = if elem_gt(key,h) then h::(f t) else if elem_eq(key,h) then key::t else key::l | f nil = [key] in f s end val select_arb = fn nil => raise Select_arb | a::b => a val exists = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else elem_eq(h,key) | f nil = false in f s end val find = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else if elem_eq(h,key) then SOME h else NONE | f nil = NONE in f s end fun revfold f lst init = List.foldl f init lst fun fold f lst init = List.foldr f init lst val app = List.app fun set_eq(h::t,h'::t') = (case elem_eq(h,h') of true => set_eq(t,t') | a => a) | set_eq(nil,nil) = true | set_eq _ = false fun set_gt(h::t,h'::t') = (case elem_gt(h,h') of false => (case (elem_eq(h,h')) of true => set_gt(t,t') | a => a) | a => a) | set_gt(_::_,nil) = true | set_gt _ = false fun union(a as (h::t),b as (h'::t')) = if elem_gt(h',h) then h::union(t,b) else if elem_eq(h,h') then h::union(t,t') else h'::union(a,t') | union(nil,s) = s | union(s,nil) = s val make_list = fn s => s val is_empty = fn nil => true | _ => false val make_set = fn l => List.foldr insert [] l val partition = fn f => fn s => fold (fn (e,(yes,no)) => if (f e) then (e::yes,no) else (e::no,yes)) s (nil,nil) val remove = fn (e,s) => let fun f (l as (h::t)) = if elem_gt(h,e) then l else if elem_eq(h,e) then t else h::(f t) | f nil = nil in f s end (* difference: X-Y *) fun difference (nil,_) = nil | difference (r,nil) = r | difference (a as (h::t),b as (h'::t')) = if elem_gt (h',h) then h::difference(t,b) else if elem_eq(h',h) then difference(t,t') else difference(a,t') fun singleton X = [X] fun card(S) = fold (fn (a,count) => count+1) S 0 local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end (* ordered set implemented using red-black trees: Upper bound running time of the functions below: app: O(n) card: O(n) closure: O(n^2 ln n) difference: O(n ln n) empty: O(1) exists: O(ln n) find: O(ln n) fold: O(n) insert: O(ln n) is_empty: O(1) make_list: O(n) make_set: O(n ln n) partition: O(n ln n) remove: O(n ln n) revfold: O(n) select_arb: O(1) set_eq: O(n) set_gt: O(n) singleton: O(1) union: O(n ln n) *) functor RbOrdSet (B : sig type elem val eq : (elem*elem) -> bool val gt : (elem*elem) -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq datatype Color = RED | BLACK abstype set = EMPTY | TREE of (B.elem * Color * set * set) with exception Select_arb val empty = EMPTY fun insert(key,t) = let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if elem_gt (key,k) then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if elem_gt(k,key) then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(key,BLACK,l,r) | f (TREE(k,RED,l,r)) = if elem_gt(key,k) then TREE(k,RED,l, f r) else if elem_gt(k,key) then TREE(k,RED, f l, r) else TREE(key,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun select_arb (TREE(k,_,l,r)) = k | select_arb EMPTY = raise Select_arb fun exists(key,t) = let fun look EMPTY = false | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else SOME k in look t end fun revfold f t start = let fun scan (EMPTY,value) = value | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value))) in scan(t,start) end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun app f t = let fun scan EMPTY = () | scan(TREE(k,_,l,r)) = (scan l; f k; scan r) in scan t end (* equal_tree : test if two trees are equal. Two trees are equal if the set of leaves are equal *) fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = true | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_eq(v1,v2)) andalso f(news1,news2) end | f _ = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end | set_eq (EMPTY,EMPTY) = true | set_eq _ = false (* gt_tree : Test if tree1 is greater than tree 2 *) fun set_gt (tree1,tree2) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = false | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2)) end | f (_,nil) = true | f (nil,_) = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end fun is_empty S = (let val _ = select_arb S in false end handle Select_arb => true) fun make_list S = fold (op ::) S nil fun make_set l = List.foldr insert empty l fun partition F S = fold (fn (a,(Yes,No)) => if F(a) then (insert(a,Yes),No) else (Yes,insert(a,No))) S (empty,empty) fun remove(X, XSet) = let val (YSet, _) = partition (fn a => not (elem_eq (X, a))) XSet in YSet end fun difference(Xs, Ys) = fold (fn (p as (a,Xs')) => if exists(a,Ys) then Xs' else insert p) Xs empty fun singleton X = insert(X,empty) fun card(S) = fold (fn (_,count) => count+1) S 0 fun union(Xs,Ys)= fold insert Ys Xs local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end end (* In utils.sig signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end *) functor Table (B : sig type key val gt : (key * key) -> bool end ) : TABLE = struct datatype Color = RED | BLACK type key = B.key abstype 'a table = EMPTY | TREE of ((B.key * 'a ) * Color * 'a table * 'a table) with val empty = EMPTY fun insert(elem as (key,data),t) = let val key_gt = fn (a,_) => B.gt(key,a) val key_lt = fn (a,_) => B.gt(a,key) fun f EMPTY = TREE(elem,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if key_gt k then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if key_lt k then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(elem,BLACK,l,r) | f (TREE(k,RED,l,r)) = if key_gt k then TREE(k,RED,l, f r) else if key_lt k then TREE(k,RED, f l, r) else TREE(elem,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun exists(key,t) = let fun look EMPTY = false | look (TREE((k,_),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE((k,data),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else SOME data in look t end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun make_table l = List.foldr insert empty l fun size S = fold (fn (_,count) => count+1) S 0 fun make_list table = fold (op ::) table nil end end; (* assumes that a functor Table with signature TABLE from table.sml is in the environment *) (* In utils.sig signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end *) (* hash: creates a hash table of size n which assigns each distinct member a unique integer between 0 and n-1 *) functor Hash(B : sig type elem val gt : elem * elem -> bool end) : HASH = struct type elem=B.elem structure HashTable = Table(type key=B.elem val gt = B.gt) type table = {count : int, table : int HashTable.table} val empty = {count=0,table=HashTable.empty} val size = fn {count,table} => count val add = fn (e,{count,table}) => {count=count+1,table=HashTable.insert((e,count),table)} val find = fn (e,{table,count}) => HashTable.find(e,table) val exists = fn (e,{table,count}) => HashTable.exists(e,table) end; mlton-20210117+dfsg/mlyacc/src/verbose.sml000066400000000000000000000137471416264345000202630ustar00rootroot00000000000000(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkVerbose(structure Errs : LR_ERRS) : VERBOSE = struct structure Errs = Errs open Errs Errs.LrTable val mkPrintAction = fn print => let val printInt = print o (Int.toString : int -> string) in fn (SHIFT (STATE i)) => (print "\tshift "; printInt i; print "\n") | (REDUCE rulenum) => (print "\treduce by rule "; printInt rulenum; print "\n") | ACCEPT => print "\taccept\n" | ERROR => print "\terror\n" end val mkPrintGoto = fn (printNonterm,print) => let val printInt = print o (Int.toString : int -> string) in fn (nonterm,STATE i) => (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintTermAction = fn (printTerm,print) => let val printAction = mkPrintAction print in fn (term,action) => (print "\t"; printTerm term; printAction action) end val mkPrintGoto = fn (printNonterm,print) => fn (nonterm,STATE i) => let val printInt = print o (Int.toString : int -> string) in (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintError = fn (printTerm,printRule,print) => let val printInt = print o (Int.toString : int -> string) val printState = fn STATE s => (print " state "; printInt s) in fn (RR (term,state,r1,r2)) => (print "error: "; printState state; print ": reduce/reduce conflict between rule "; printInt r1; print " and rule "; printInt r2; print " on "; printTerm term; print "\n") | (SR (term,state,r1)) => (print "error: "; printState state; print ": shift/reduce conflict "; print "(shift "; printTerm term; print ", reduce by rule "; printInt r1; print ")\n") | NOT_REDUCED i => (print "warning: rule <"; printRule i; print "> will never be reduced\n") | START i => (print "warning: start symbol appears on the rhs of "; print "<"; printRule i; print ">\n") | NS (term,i) => (print "warning: non-shiftable terminal "; printTerm term; print "appears on the rhs of "; print "<"; printRule i; print ">\n") end structure PairList : sig val app : ('a * 'b -> unit) -> ('a,'b) pairlist -> unit val length : ('a,'b) pairlist -> int end = struct val app = fn f => let fun g EMPTY = () | g (PAIR(a,b,r)) = (f(a,b); g r) in g end val length = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end end val printVerbose = fn {termToString,nontermToString,table,stateErrs,entries:int, print,printRule,errs,printCores} => let val printTerm = print o termToString val printNonterm = print o nontermToString val printCore = printCores print val printTermAction = mkPrintTermAction(printTerm,print) val printAction = mkPrintAction print val printGoto = mkPrintGoto(printNonterm,print) val printError = mkPrintError(printTerm,printRule print,print) val gotos = LrTable.describeGoto table val actions = LrTable.describeActions table val states = numStates table val gotoTableSize = ref 0 val actionTableSize = ref 0 val _ = if length errs > 0 then (printSummary print errs; print "\n"; app printError errs) else () fun loop i = if i=states then () else let val s = STATE i in (app printError (stateErrs s); print "\n"; printCore s; let val (actionList,default) = actions s val gotoList = gotos s in (PairList.app printTermAction actionList; print "\n"; PairList.app printGoto gotoList; print "\n"; print "\t."; printAction default; print "\n"; gotoTableSize:=(!gotoTableSize)+ PairList.length gotoList; actionTableSize := (!actionTableSize) + PairList.length actionList + 1 ) end; loop (i+1)) end in loop 0; print (Int.toString entries ^ " of " ^ Int.toString (!actionTableSize)^ " action table entries left after compaction\n"); print (Int.toString (!gotoTableSize)^ " goto table entries\n") end end; mlton-20210117+dfsg/mlyacc/src/yacc.grm000066400000000000000000000172611416264345000175220ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser for the ML parser generator *) open Hdr %% %name Mlyacc %eop EOF %noshift EOF %right ARROW %left ASTERISK %pos pos %term ARROW | ASTERISK | BLOCK | BAR | CHANGE | COLON | COMMA | DELIMITER | EOF | FOR | HEADER of string | ID of string*Header.pos | IDDOT of string | PERCENT_HEADER | INT of string | KEYWORD | LBRACE | LPAREN | NAME | NODEFAULT | NONTERM | NOSHIFT | OF | PERCENT_EOP | PERCENT_PURE | PERCENT_POS | PERCENT_ARG | PERCENT_TOKEN_SIG_INFO | PREC of Header.prec | PREC_TAG | PREFER | PROG of string | RBRACE | RPAREN | SUBST | START | TERM | TYVAR of string | VERBOSE | VALUE | UNKNOWN of string | BOGUS_VALUE %nonterm BEGIN of string * Hdr.declData * (Hdr.rule list) | CONSTR_LIST of (Hdr.symbol * Hdr.ty option) list | ID_LIST of Hdr.symbol list | LABEL of string | MPC_DECL of Hdr.declData | MPC_DECLS of Hdr.declData | QUAL_ID of string | RECORD_LIST of string | RHS_LIST of {rhs:Hdr.symbol list,code:{text:string, pos:Header.pos}, prec:Hdr.symbol option} list | G_RULE of Hdr.rule list | G_RULE_LIST of Hdr.rule list | G_RULE_PREC of Hdr.symbol option | SUBST_DECL of (Hdr.symbol list * Hdr.symbol list) list | SUBST_DEC of (Hdr.symbol list * Hdr.symbol list) | CHANGE_DECL of (Hdr.symbol list * Hdr.symbol list) list | CHANGE_DEC of (Hdr.symbol list * Hdr.symbol list) | TY of string %header ( functor MlyaccLrValsFun(structure Hdr : HEADER where type prec = Header.prec structure Token : TOKEN) ) %arg (inputSource) : Hdr.inputSource %% BEGIN : HEADER MPC_DECLS DELIMITER G_RULE_LIST (HEADER,MPC_DECLS,rev G_RULE_LIST) MPC_DECLS : MPC_DECLS MPC_DECL (join_decls(MPC_DECLS,MPC_DECL,inputSource,MPC_DECLleft)) MPC_DECLS: (DECL {prec=nil,nonterm=NONE,term=NONE,eop=nil,control=nil, keyword=nil,change=nil, value=nil}) MPC_DECL: TERM CONSTR_LIST (DECL { prec=nil,nonterm=NONE, term = SOME CONSTR_LIST, eop =nil,control=nil, change=nil,keyword=nil, value=nil}) | NONTERM CONSTR_LIST (DECL { prec=nil,control=nil,nonterm= SOME CONSTR_LIST, term = NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PREC ID_LIST (DECL {prec= [(PREC,ID_LIST)],control=nil, nonterm=NONE,term=NONE,eop=nil,change=nil, keyword=nil,value=nil}) | START ID (DECL {prec=nil,control=[START_SYM (symbolMake ID)],nonterm=NONE, term = NONE, eop = nil,change=nil,keyword=nil, value=nil}) | PERCENT_EOP ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE, eop=ID_LIST, change=nil,keyword=nil, value=nil}) | KEYWORD ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=ID_LIST, value=nil}) | PREFER ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=map (fn i=>([],[i])) ID_LIST,keyword=nil, value=nil}) | CHANGE CHANGE_DECL (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=CHANGE_DECL,keyword=nil, value=nil}) | SUBST SUBST_DECL (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=SUBST_DECL,keyword=nil, value=nil}) | NOSHIFT ID_LIST (DECL {prec=nil,control=[NSHIFT ID_LIST],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_HEADER PROG (DECL {prec=nil,control=[FUNCTOR PROG],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_TOKEN_SIG_INFO PROG (DECL {prec=nil,control=[TOKEN_SIG_INFO PROG], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | NAME ID (DECL {prec=nil,control=[PARSER_NAME (symbolMake ID)], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_ARG PROG COLON TY (DECL {prec=nil,control=[PARSE_ARG(PROG,TY)],nonterm=NONE, term=NONE,eop=nil,change=nil,keyword=nil, value=nil}) | VERBOSE (DECL {prec=nil,control=[Hdr.VERBOSE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | NODEFAULT (DECL {prec=nil,control=[Hdr.NODEFAULT], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | PERCENT_PURE (DECL {prec=nil,control=[Hdr.PURE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | PERCENT_POS TY (DECL {prec=nil,control=[Hdr.POS TY], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | VALUE ID PROG (DECL {prec=nil,control=nil, nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=[(symbolMake ID,PROG)]}) CHANGE_DECL : CHANGE_DEC BAR CHANGE_DECL (CHANGE_DEC :: CHANGE_DECL) | CHANGE_DEC ([CHANGE_DEC]) CHANGE_DEC : ID_LIST ARROW ID_LIST (ID_LIST1, ID_LIST2) SUBST_DECL : SUBST_DEC BAR SUBST_DECL (SUBST_DEC :: SUBST_DECL) | SUBST_DEC ([SUBST_DEC]) SUBST_DEC: ID FOR ID ([symbolMake ID2],[symbolMake ID1]) CONSTR_LIST : CONSTR_LIST BAR ID OF TY ((symbolMake ID,SOME (tyMake TY))::CONSTR_LIST) | CONSTR_LIST BAR ID ((symbolMake ID,NONE)::CONSTR_LIST) | ID OF TY ([(symbolMake ID,SOME (tyMake TY))]) | ID ([(symbolMake ID,NONE)]) G_RULE : ID COLON RHS_LIST (map (fn {rhs,code,prec} => Hdr.RULE {lhs=symbolMake ID,rhs=rhs, code=code,prec=prec}) RHS_LIST) G_RULE_LIST: G_RULE_LIST G_RULE (G_RULE@G_RULE_LIST) | G_RULE (G_RULE) ID_LIST : ID ID_LIST (symbolMake ID :: ID_LIST) | (nil) RHS_LIST : ID_LIST G_RULE_PREC PROG ([{rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}]) | RHS_LIST BAR ID_LIST G_RULE_PREC PROG ({rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}::RHS_LIST) TY : TYVAR (TYVAR) | LBRACE RECORD_LIST RBRACE ("{ "^RECORD_LIST^" } ") | LBRACE RBRACE ("{}") | PROG (" ( "^PROG^" ) ") | TY QUAL_ID (TY^" "^QUAL_ID) | QUAL_ID (QUAL_ID) | TY ASTERISK TY (TY1^"*"^TY2) | TY ARROW TY (TY1 ^ " -> " ^ TY2) RECORD_LIST : RECORD_LIST COMMA LABEL COLON TY (RECORD_LIST^","^LABEL^":"^TY) | LABEL COLON TY (LABEL^":"^TY) QUAL_ID : ID ((fn (a,_) => a) ID) | IDDOT QUAL_ID (IDDOT^QUAL_ID) LABEL : ID ((fn (a,_) => a) ID) | INT (INT) G_RULE_PREC : PREC_TAG ID (SOME (symbolMake ID)) G_RULE_PREC : (NONE) mlton-20210117+dfsg/mlyacc/src/yacc.lex000066400000000000000000000133271416264345000175240ustar00rootroot00000000000000(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi yacc.lex: Lexer specification *) structure Tokens = Tokens type svalue = Tokens.svalue type pos = Header.pos type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token type lexarg = Hdr.inputSource type arg = lexarg open Tokens val error = Hdr.error val text = Hdr.text val pcount = ref 0 val commentLevel = ref 0 val actionstart = ref {line = 1, col = 0} fun linePos () = {line = !(#line Hdr.pos), col = 0} fun pos pos = {line = !(#line Hdr.pos), col = pos - !(#start Hdr.pos)} val eof = fn i => (if (!pcount)>0 then error i (!actionstart) " eof encountered in action beginning here !" else (); EOF(linePos (), linePos ())) val Add = fn s => (text := s::(!text)) local val dict = [("%prec",PREC_TAG),("%term",TERM), ("%nonterm",NONTERM), ("%eop",PERCENT_EOP),("%start",START), ("%prefer",PREFER),("%subst",SUBST),("%change",CHANGE), ("%keyword",KEYWORD),("%name",NAME), ("%verbose",VERBOSE), ("%nodefault",NODEFAULT), ("%value",VALUE), ("%noshift",NOSHIFT), ("%header",PERCENT_HEADER),("%pure",PERCENT_PURE), ("%token_sig_info",PERCENT_TOKEN_SIG_INFO), ("%arg",PERCENT_ARG), ("%pos",PERCENT_POS)] in fun lookup (s,left,right) = let fun f ((a,d)::b) = if a=s then d(left,right) else f b | f nil = UNKNOWN(s,left,right) in f dict end end fun inc (ri as ref i) = (ri := i+1) fun dec (ri as ref i) = (ri := i-1) fun incLineNum pos = (inc (#line Hdr.pos) ; #start Hdr.pos := pos) %% %header ( functor LexMLYACC(structure Tokens : Mlyacc_TOKENS structure Hdr : HEADER (* = Header *) where type prec = Header.prec and type inputSource = Header.inputSource) : ARG_LEXER ); %arg (inputSource); %s A CODE F COMMENT STRING EMPTYCOMMENT; ws = [\t\ ]+; eol=("\n"|"\013\n"|"\013"); idchars = [A-Za-z_'0-9]; id=[A-Za-z]{idchars}*; tyvar="'"{idchars}*; qualid ={id}"."; %% "(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue(); YYBEGIN INITIAL; continue()); "(*" => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue()); "(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue(); YYBEGIN CODE; continue()); [^(%\013\n]+ => (Add yytext; continue()); "%%" => (YYBEGIN A; HEADER (concat (rev (!text)),pos yypos,pos yypos)); {eol} => (Add yytext; incLineNum yypos; continue()); . => (Add yytext; continue()); {eol} => (incLineNum yypos; continue ()); {ws}+ => (continue()); of => (OF(pos yypos,pos yypos)); for => (FOR(pos yypos,pos yypos)); "{" => (LBRACE(pos yypos,pos yypos)); "}" => (RBRACE(pos yypos,pos yypos)); "," => (COMMA(pos yypos,pos yypos)); "*" => (ASTERISK(pos yypos,pos yypos)); "->" => (ARROW(pos yypos,pos yypos)); "%left" => (PREC(Hdr.LEFT,pos yypos,pos yypos)); "%right" => (PREC(Hdr.RIGHT,pos yypos,pos yypos)); "%nonassoc" => (PREC(Hdr.NONASSOC,pos yypos,pos yypos)); "%"[a-z_]+ => (lookup(yytext,pos yypos,pos yypos)); {tyvar} => (TYVAR(yytext,pos yypos,pos yypos)); {qualid} => (IDDOT(yytext,pos yypos,pos yypos)); [0-9]+ => (INT (yytext,pos yypos,pos yypos)); "%%" => (DELIMITER(pos yypos,pos yypos)); ":" => (COLON(pos yypos,pos yypos)); "|" => (BAR(pos yypos,pos yypos)); {id} => (ID ((yytext,pos yypos),pos yypos,pos yypos)); "(" => (pcount := 1; actionstart := pos yypos; text := nil; YYBEGIN CODE; continue() before YYBEGIN A); . => (UNKNOWN(yytext,pos yypos,pos yypos)); "(" => (inc pcount; Add yytext; continue()); ")" => (dec pcount; if !pcount = 0 then PROG (concat (rev (!text)),!actionstart,pos yypos) else (Add yytext; continue())); "\"" => (Add yytext; YYBEGIN STRING; continue()); [^()"\n\013]+ => (Add yytext; continue()); [(*)] => (Add yytext; continue()); "*)" => (Add yytext; dec commentLevel; if !commentLevel=0 then BOGUS_VALUE(pos yypos,pos yypos) else continue() ); "(*" => (Add yytext; inc commentLevel; continue()); [^*()\n\013]+ => (Add yytext; continue()); [(*)] => (continue()); "*)" => (dec commentLevel; if !commentLevel=0 then YYBEGIN A else (); continue ()); "(*" => (inc commentLevel; continue()); [^*()\n\013]+ => (continue()); "\"" => (Add yytext; YYBEGIN CODE; continue()); \\ => (Add yytext; continue()); {eol} => (Add yytext; error inputSource (pos yypos) "unclosed string"; incLineNum yypos; YYBEGIN CODE; continue()); [^"\\\n\013]+ => (Add yytext; continue()); \\\" => (Add yytext; continue()); \\{eol} => (Add yytext; incLineNum yypos; YYBEGIN F; continue()); \\[\ \t] => (Add yytext; YYBEGIN F; continue()); {ws} => (Add yytext; continue()); \\ => (Add yytext; YYBEGIN STRING; continue()); . => (Add yytext; error inputSource (pos yypos) "unclosed string"; YYBEGIN CODE; continue()); mlton-20210117+dfsg/mlyacc/src/yacc.sml000066400000000000000000001070031416264345000175220ustar00rootroot00000000000000(* Modified by Matthew Fluet on 2011-06-17. * Use simple file name (rather than absolute paths) in line directives in output. *) (* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989, 1990 Andrew W. Appel, David R. Tarditi *) functor ParseGenFun(structure ParseGenParser : PARSE_GEN_PARSER structure MakeTable : MAKE_LR_TABLE structure Verbose : VERBOSE structure PrintStruct : PRINT_STRUCT sharing MakeTable.LrTable = PrintStruct.LrTable sharing MakeTable.Errs = Verbose.Errs structure Absyn : ABSYN ) : PARSE_GEN = struct val sub = Array.sub infix 9 sub structure Grammar = MakeTable.Grammar structure Header = ParseGenParser.Header open Header Grammar (* approx. maximum length of a line *) val lineLength = 70 (* record type describing names of structures in the program being generated *) datatype names = NAMES of {miscStruct : string, (* Misc{n} struct name *) tableStruct : string, (* LR table structure *) tokenStruct : string, (* Tokens{n} struct name *) actionsStruct : string, (* Actions structure *) valueStruct: string, (* semantic value structure *) ecStruct : string, (* error correction structure *) arg: string, (* user argument for parser *) tokenSig : string, (* TOKENS{n} signature *) miscSig :string, (* Signature for Misc structure *) dataStruct:string, (* name of structure in Misc *) (* which holds parser data *) dataSig:string (* signature for this structure *) } val DEBUG = true exception Semantic (* common functions and values used in printing out program *) datatype values = VALS of {say : string -> unit, saydot : string -> unit, sayln : string -> unit, fmtPos : {line : int, col : int} option -> string, pureActions: bool, pos_type : string, arg_type : string, ntvoid : string, termvoid : string, start : Grammar.nonterm, hasType : Grammar.symbol -> bool, (* actual (user) name of terminal *) termToString : Grammar.term -> string, symbolToString : Grammar.symbol -> string, (* type symbol comes from the HDR structure, and is now abstract *) term : (Header.symbol * ty option) list, nonterm : (Header.symbol * ty option) list, terms : Grammar.term list, (* tokenInfo is the user inserted spec in the *_TOKEN sig*) tokenInfo : string option} structure SymbolHash = Hash(type elem = string val gt = (op >) : string*string -> bool) structure TermTable = Table(type key = Grammar.term val gt = fn (T i,T j) => i > j) structure SymbolTable = Table( type key = Grammar.symbol val gt = fn (TERM(T i),TERM(T j)) => i>j | (NONTERM(NT i),NONTERM(NT j)) => i>j | (NONTERM _,TERM _) => true | (TERM _,NONTERM _) => false) (* printTypes: function to print the following types in the LrValues structure and a structure containing the datatype svalue: type svalue -- it holds semantic values on the parse stack type pos -- the type of line numbers type result -- the type of the value that results from the parse The type svalue is set equal to the datatype svalue declared in the structure named by valueStruct. The datatype svalue is declared inside the structure named by valueStruct to deal with the scope of constructors. *) val printTypes = fn (VALS {say,sayln,term,nonterm,symbolToString,pos_type, arg_type, termvoid,ntvoid,saydot,hasType,start, pureActions,...}, NAMES {valueStruct,...},symbolType) => let val prConstr = fn (symbol,SOME s) => say (" | " ^ (symbolName symbol) ^ " of " ^ (if pureActions then "" else "unit -> ") ^ " (" ^ tyName s ^ ")" ) | _ => () in sayln "local open Header in"; sayln ("type pos = " ^ pos_type); sayln ("type arg = " ^ arg_type); sayln ("structure " ^ valueStruct ^ " = "); sayln "struct"; say ("datatype svalue = " ^ termvoid ^ " | " ^ ntvoid ^ " of" ^ (if pureActions then "" else " unit -> ") ^ " unit"); app prConstr term; app prConstr nonterm; sayln "\nend"; sayln ("type svalue = " ^ valueStruct ^ ".svalue"); say "type result = "; case symbolType (NONTERM start) of NONE => sayln "unit" | SOME t => (say (tyName t); sayln ""); sayln "end" end (* function to print Tokens{n} structure *) val printTokenStruct = fn (VALS {say, sayln, termToString, hasType,termvoid,terms, pureActions,tokenInfo,...}, NAMES {miscStruct,tableStruct,valueStruct, tokenStruct,tokenSig,dataStruct,...}) => (sayln ("structure " ^ tokenStruct ^ " : " ^ tokenSig ^ " ="); sayln "struct"; (case tokenInfo of NONE => () | _ => sayln ("open "^dataStruct^".Header")); sayln ("type svalue = " ^ dataStruct ^ ".svalue"); sayln "type ('a,'b) token = ('a,'b) Token.token"; let val f = fn term as T i => (say "fun "; say (termToString term); say " ("; if (hasType (TERM term)) then say "i," else (); say "p1,p2) = Token.TOKEN ("; say (dataStruct ^ "." ^ tableStruct ^ ".T "); say (Int.toString i); say ",("; say (dataStruct ^ "." ^ valueStruct ^ "."); if (hasType (TERM term)) then (say (termToString term); if pureActions then say " i" else say " (fn () => i)") else say termvoid; say ","; sayln "p1,p2))") in app f terms end; sayln "end") (* function to print signatures out - takes print function which does not need to insert line breaks *) val printSigs = fn (VALS {term,tokenInfo,...}, NAMES {tokenSig,tokenStruct,miscSig, dataStruct, dataSig, ...}, say) => say ("signature " ^ tokenSig ^ " =\nsig\n"^ (case tokenInfo of NONE => "" | SOME s => (s^"\n"))^ "type ('a,'b) token\ntype svalue\n" ^ (List.foldr (fn ((s,ty),r) => String.concat [ "val ", symbolName s, (case ty of NONE => ": " | SOME l => ": (" ^ (tyName l) ^ ") * "), " 'a * 'a -> (svalue,'a) token\n", r]) "" term) ^ "end\nsignature " ^ miscSig ^ "=\nsig\nstructure Tokens : " ^ tokenSig ^ "\nstructure " ^ dataStruct ^ ":" ^ dataSig ^ "\nsharing type " ^ dataStruct ^ ".Token.token = Tokens.token\nsharing type " ^ dataStruct ^ ".svalue = Tokens.svalue\nend\n") (* function to print structure for error correction *) val printEC = fn (keyword : term list, preferred_change : (term list * term list) list, noshift : term list, value : (term * string) list, VALS {termToString, say,sayln,terms,saydot,hasType, termvoid,pureActions,...}, NAMES {ecStruct,tableStruct,valueStruct,...}) => let val sayterm = fn (T i) => (say "(T "; say (Int.toString i); say ")") val printBoolCase = fn ( l : term list) => (say "fn "; app (fn t => (sayterm t; say " => true"; say " | ")) l; sayln "_ => false") val printTermList = fn (l : term list) => (sayln "nil"; app (fn t => (say " $$ "; sayterm t)) (rev l)) fun printChange () = (sayln "val preferred_change : (term list * term list) list = "; app (fn (d,i) => (say"("; printTermList d; say ","; printTermList i; sayln ")::" ) ) preferred_change; sayln "nil") val printErrValues = fn (l : (term * string) list) => (sayln "local open Header in"; sayln "val errtermvalue="; say "fn "; app (fn (t,s) => (sayterm t; say " => "; saydot valueStruct; say (termToString t); say "("; if pureActions then () else say "fn () => "; say "("; say s; say "))"; sayln " | " ) ) l; say "_ => "; say (valueStruct ^ "."); sayln termvoid; sayln "end") val printNames = fn () => let val f = fn term => ( sayterm term; say " => "; sayln (String.concat["\"", termToString term, "\""]); say " | ") in (sayln "val showTerminal ="; say "fn "; app f terms; sayln "_ => \"bogus-term\"") end val ecTerms = List.foldr (fn (t,r) => if hasType (TERM t) orelse List.exists (fn (a,_)=>a=t) value then r else t::r) [] terms in say "structure "; say ecStruct; sayln "="; sayln "struct"; say "open "; sayln tableStruct; sayln "infix 5 $$"; sayln "fun x $$ y = y::x"; sayln "val is_keyword ="; printBoolCase keyword; printChange(); sayln "val noShift = "; printBoolCase noshift; printNames (); printErrValues value; say "val terms : term list = "; printTermList ecTerms; sayln "end" end val printAction = fn (rules, VALS {hasType,say,sayln,fmtPos,termvoid,ntvoid, symbolToString,saydot,start,pureActions,...}, NAMES {actionsStruct,valueStruct,tableStruct,arg,...}) => let val printAbsynRule = Absyn.printRule(say,sayln,fmtPos) val is_nonterm = fn (NONTERM i) => true | _ => false val numberRhs = fn r => List.foldl (fn (e,(r,table)) => let val num = case SymbolTable.find(e,table) of SOME i => i | NONE => 1 in ((e,num,hasType e orelse is_nonterm e)::r, SymbolTable.insert((e,num+1),table)) end) (nil,SymbolTable.empty) r val saySym = symbolToString val printCase = fn (i:int, r as {lhs=lhs as (NT lhsNum),prec, rhs,code,rulenum}) => (* mkToken: Build an argument *) let open Absyn val mkToken = fn (sym,num : int,typed) => let val symString = symbolToString sym val symNum = symString ^ (Int.toString num) in PTUPLE[WILD, PTUPLE[if not (hasType sym) then (if is_nonterm sym then PAPP(valueStruct^"."^ntvoid, PVAR symNum) else WILD) else PAPP(valueStruct^"."^symString, if num=1 andalso pureActions then AS(symNum,PVAR symString) else PVAR symNum), if num=1 then AS(symString^"left", PVAR(symNum^"left")) else PVAR(symNum^"left"), if num=1 then AS(symString^"right", PVAR(symNum^"right")) else PVAR(symNum^"right")]] end val numberedRhs = #1 (numberRhs rhs) (* construct case pattern *) val pat = PTUPLE[PINT i,PLIST(map mkToken numberedRhs, SOME (PVAR "rest671"))] (* remove terminals in argument list w/o types *) val argsWithTypes = List.foldr (fn ((_,_,false),r) => r | (s as (_,_,true),r) => s::r) nil numberedRhs (* construct case body *) val defaultPos = EVAR "defaultPos" val resultexp = EVAR "result" val resultpat = PVAR "result" val code = CODE code val rest = EVAR "rest671" val body = LET([VB(resultpat, EAPP(EVAR(valueStruct^"."^ (if hasType (NONTERM lhs) then saySym(NONTERM lhs) else ntvoid)), if pureActions then code else if argsWithTypes=nil then FN(WILD,code) else FN(WILD, let val body = LET(map (fn (sym,num:int,_) => let val symString = symbolToString sym val symNum = symString ^ Int.toString num in VB(if num=1 then AS(symString,PVAR symNum) else PVAR symNum, EAPP(EVAR symNum,UNIT)) end) (rev argsWithTypes), code) in if hasType (NONTERM lhs) then body else SEQ(body,UNIT) end)))], ETUPLE[EAPP(EVAR(tableStruct^".NT"),EINT(lhsNum)), case rhs of nil => ETUPLE[resultexp,defaultPos,defaultPos] | r =>let val (rsym,rnum,_) = hd(numberedRhs) val (lsym,lnum,_) = hd(rev numberedRhs) in ETUPLE[resultexp, EVAR (symbolToString lsym ^ Int.toString lnum ^ "left"), EVAR (symbolToString rsym ^ Int.toString rnum ^ "right")] end, rest]) in printAbsynRule (RULE(pat,body)) end val prRules = fn () => (sayln "fn (i392,defaultPos,stack,"; say " ("; say arg; sayln "):arg) =>"; sayln "case (i392,stack)"; say "of "; app (fn (rule as {rulenum,...}) => (printCase(rulenum,rule); say "| ")) rules; sayln "_ => raise (mlyAction i392)") in say "structure "; say actionsStruct; sayln " ="; sayln "struct "; sayln "exception mlyAction of int"; sayln "local open Header in"; sayln "val actions = "; prRules(); sayln "end"; say "val void = "; saydot valueStruct; sayln termvoid; say "val extract = "; say "fn a => (fn "; saydot valueStruct; if hasType (NONTERM start) then say (symbolToString (NONTERM start)) else say "ntVOID"; sayln " x => x"; sayln "| _ => let exception ParseInternal"; say "\tin raise ParseInternal end) a "; sayln (if pureActions then "" else "()"); sayln "end" end val make_parser = fn ((header, DECL {eop,change,keyword,nonterm,prec, term, control,value} : declData, rules : rule list),spec,error : pos -> string -> unit, wasError : unit -> bool) => let val verbose = List.exists (fn VERBOSE=>true | _ => false) control val defaultReductions = not (List.exists (fn NODEFAULT=>true | _ => false) control) val pos_type = let fun f nil = NONE | f ((POS s)::r) = SOME s | f (_::r) = f r in f control end val start = let fun f nil = NONE | f ((START_SYM s)::r) = SOME s | f (_::r) = f r in f control end val name = let fun f nil = NONE | f ((PARSER_NAME s)::r) = SOME s | f (_::r) = f r in f control end val header_decl = let fun f nil = NONE | f ((FUNCTOR s)::r) = SOME s | f (_::r) = f r in f control end val token_sig_info_decl = let fun f nil = NONE | f ((TOKEN_SIG_INFO s)::_) = SOME s | f (_::r) = f r in f control end val arg_decl = let fun f nil = ("()","unit") | f ((PARSE_ARG s)::r) = s | f (_::r) = f r in f control end val noshift = let fun f nil = nil | f ((NSHIFT s)::r) = s | f (_::r) = f r in f control end val pureActions = let fun f nil = false | f ((PURE)::r) = true | f (_::r) = f r in f control end val term = case term of NONE => (error {line = 1, col = 0} "missing %term definition"; nil) | SOME l => l val nonterm = case nonterm of NONE => (error {line = 1, col = 0} "missing %nonterm definition"; nil) | SOME l => l val pos_type = case pos_type of NONE => (error {line = 1, col = 0} "missing %pos definition"; "") | SOME l => l val termHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) ("duplicate definition of " ^ name ^ " in %term"); table) else SymbolHash.add(name,table) end) SymbolHash.empty term val isTerm = fn name => SymbolHash.exists(name,termHash) val symbolHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) (if isTerm name then name ^ " is defined as a terminal and a nonterminal" else "duplicate definition of " ^ name ^ " in %nonterm"); table) else SymbolHash.add(name,table) end) termHash nonterm fun makeUniqueId s = if SymbolHash.exists(s,symbolHash) then makeUniqueId (s ^ "'") else s val _ = if wasError() then raise Semantic else () val numTerms = SymbolHash.size termHash val numNonterms = SymbolHash.size symbolHash - numTerms val symError = fn sym => fn err => fn symbol => error (symbolPos symbol) (symbolName symbol^" in "^err^" is not defined as a " ^ sym) val termNum : string -> Header.symbol -> term = let val termError = symError "terminal" in fn stmt => let val stmtError = termError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; T ~1) | SOME i => T (if i Header.symbol -> nonterm = let val nontermError = symError "nonterminal" in fn stmt => let val stmtError = nontermError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NT ~1) | SOME i => if i>=numTerms then NT (i-numTerms) else (stmtError symbol;NT ~1) end end val symbolNum : string -> Header.symbol -> Grammar.symbol = let val symbolError = symError "symbol" in fn stmt => let val stmtError = symbolError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NONTERM (NT ~1)) | SOME i => if i>=numTerms then NONTERM(NT (i-numTerms)) else TERM(T i) end end (* map all symbols in the following values to terminals and check that the symbols are defined as terminals: eop : symbol list keyword: symbol list prec: (lexvalue * (symbol list)) list change: (symbol list * symbol list) list *) val eop = map (termNum "%eop") eop val keyword = map (termNum "%keyword") keyword val prec = map (fn (a,l) => (a,case a of LEFT => map (termNum "%left") l | RIGHT => map (termNum "%right") l | NONASSOC => map (termNum "%nonassoc") l )) prec val change = let val mapTerm = termNum "%prefer, %subst, or %change" in map (fn (a,b) => (map mapTerm a, map mapTerm b)) change end val noshift = map (termNum "%noshift") noshift val value = let val mapTerm = termNum "%value" in map (fn (a,b) => (mapTerm a,b)) value end val (rules,_) = let val symbolNum = symbolNum "rule" val nontermNum = nontermNum "rule" val termNum = termNum "%prec tag" in List.foldr (fn (RULE {lhs,rhs,code,prec},(l,n)) => ( {lhs=nontermNum lhs,rhs=map symbolNum rhs, code=code,prec=case prec of NONE => NONE | SOME t => SOME (termNum t), rulenum=n}::l,n-1)) (nil,length rules-1) rules end val _ = if wasError() then raise Semantic else () (* termToString: map terminals back to strings *) val termToString = let val data = Array.array(numTerms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in Array.update(data, case SymbolHash.find(name,symbolHash) of SOME i => i | NONE => raise Fail "termToString", name) end val _ = app unmap term in fn T i => if DEBUG andalso (i<0 orelse i>=numTerms) then "bogus-num" ^ (Int.toString i) else data sub i end val nontermToString = let val data = Array.array(numNonterms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in Array.update(data, case SymbolHash.find(name,symbolHash) of SOME i => i-numTerms | NONE => raise Fail "nontermToString", name) end val _ = app unmap nonterm in fn NT i => if DEBUG andalso (i<0 orelse i>=numNonterms) then "bogus-num" ^ (Int.toString i) else data sub i end (* create functions mapping terminals to precedence numbers and rules to precedence numbers. Precedence statements are listed in order of ascending (tighter binding) precedence in the specification. We receive a list composed of pairs containing the kind of precedence (left,right, or assoc) and a list of terminals associated with that precedence. The list has the same order as the corresponding declarations did in the specification. Internally, a tighter binding has a higher precedence number. We give precedences using multiples of 3: p+2 = right associative (force shift of symbol) p+1 = precedence for rule p = left associative (force reduction of rule) Nonassociative terminals are given also given a precedence of p+1. The table generator detects when the associativity of a nonassociative terminal is being used to resolve a shift/reduce conflict by checking if the precedences of the rule and the terminal are equal. A rule is given the precedence of its rightmost terminal *) val termPrec = let val precData = Array.array(numTerms, NONE : int option) val addPrec = fn termPrec => fn term as (T i) => case precData sub i of SOME _ => error {line = 1, col = 0} ("multiple precedences specified for terminal " ^ (termToString term)) | NONE => Array.update(precData,i,termPrec) val termPrec = fn ((LEFT,_) ,i) => i | ((RIGHT,_),i) => i+2 | ((NONASSOC,l),i) => i+1 val _ = List.foldl (fn (args as ((_,l),i)) => (app (addPrec (SOME (termPrec args))) l; i+3)) 0 prec in fn (T i) => if DEBUG andalso (i < 0 orelse i >= numTerms) then NONE else precData sub i end val elimAssoc = fn i => (i - (i mod 3) + 1) val rulePrec = let fun findRightTerm (nil,r) = r | findRightTerm (TERM t :: tail,r) = findRightTerm(tail,SOME t) | findRightTerm (_ :: tail,r) = findRightTerm(tail,r) in fn rhs => case findRightTerm(rhs,NONE) of NONE => NONE | SOME term => case termPrec term of SOME i => SOME (elimAssoc i) | a => a end val grammarRules = let val conv = fn {lhs,rhs,code,prec,rulenum} => {lhs=lhs,rhs =rhs,precedence= case prec of SOME t => (case termPrec t of SOME i => SOME(elimAssoc i) | a => a) | _ => rulePrec rhs, rulenum=rulenum} in map conv rules end (* get start symbol *) val start = case start of NONE => #lhs (hd grammarRules) | SOME name => nontermNum "%start" name val symbolType = let val data = Array.array(numTerms+numNonterms,NONE : ty option) fun unmap (symbol,ty) = Array.update(data, case SymbolHash.find(symbolName symbol,symbolHash) of SOME i => i | NONE => raise Fail "symbolType", ty) val _ = (app unmap term; app unmap nonterm) in fn NONTERM(NT i) => if DEBUG andalso (i<0 orelse i>=numNonterms) then NONE else data sub (i+numTerms) | TERM (T i) => if DEBUG andalso (i<0 orelse i>=numTerms) then NONE else data sub i end val symbolToString = fn NONTERM i => nontermToString i | TERM i => termToString i val grammar = GRAMMAR {rules=grammarRules, terms=numTerms,nonterms=numNonterms, eop = eop, start=start,noshift=noshift, termToString = termToString, nontermToString = nontermToString, precedence = termPrec} val name' = case name of NONE => "" | SOME s => symbolName s val names = NAMES {miscStruct=name' ^ "LrValsFun", valueStruct="MlyValue", tableStruct="LrTable", tokenStruct="Tokens", actionsStruct="Actions", ecStruct="EC", arg= #1 arg_decl, tokenSig = name' ^ "_TOKENS", miscSig = name' ^ "_LRVALS", dataStruct = "ParserData", dataSig = "PARSER_DATA"} val (table,stateErrs,corePrint,errs) = MakeTable.mkTable(grammar,defaultReductions) val entries = ref 0 (* save number of action table entries here *) in let val result = TextIO.openOut (spec ^ ".sml") val sigs = TextIO.openOut (spec ^ ".sig") val specFile = OS.Path.file spec val resultFile = specFile ^ ".sml" val line = ref 1 val col = ref 0 val pr = fn s => TextIO.output(result,s) val say = fn s => (CharVector.app (fn #"\n" => (line := !line + 1 ; col := 0) | _ => col := !col + 1) s ; pr s) val saydot = fn s => (say (s ^ ".")) val sayln = fn t => (say t; say "\n") fun fmtLineDir {line, col} path = String.concat ["(*#line ", Int.toString line, ".", Int.toString (col+1), " \"", path, "\"*)"] val fmtPos = fn NONE => (fmtLineDir {line = !line, col = 0} resultFile) ^ "\n" | SOME pos => fmtLineDir pos specFile val termvoid = makeUniqueId "VOID" val ntvoid = makeUniqueId "ntVOID" val hasType = fn s => case symbolType s of NONE => false | _ => true val terms = let fun f n = if n=numTerms then nil else (T n) :: f(n+1) in f 0 end val values = VALS {say=say,sayln=sayln,saydot=saydot,fmtPos=fmtPos, termvoid=termvoid, ntvoid = ntvoid, hasType=hasType, pos_type = pos_type, arg_type = #2 arg_decl, start=start,pureActions=pureActions, termToString=termToString, symbolToString=symbolToString,term=term, nonterm=nonterm,terms=terms, tokenInfo=token_sig_info_decl} val (NAMES {miscStruct,tableStruct,dataStruct,tokenSig,tokenStruct,dataSig,...}) = names in case header_decl of NONE => (say "functor "; say miscStruct; sayln "(structure Token : TOKEN)"; say " : sig structure "; say dataStruct; say " : "; sayln dataSig; say " structure "; say tokenStruct; say " : "; sayln tokenSig; sayln " end") | SOME s => say s; sayln " = "; sayln "struct"; sayln ("structure " ^ dataStruct ^ "="); sayln "struct"; sayln "structure Header = "; sayln "struct"; say (fmtPos (SOME {line = 1, col = 1})); sayln header; say (fmtPos NONE); sayln "end"; sayln "structure LrTable = Token.LrTable"; sayln "structure Token = Token"; sayln "local open LrTable in "; entries := PrintStruct.makeStruct{table=table,print=say, name = "table", verbose=verbose}; sayln "end"; printTypes(values,names,symbolType); printEC (keyword,change,noshift,value,values,names); printAction(rules,values,names); sayln "end"; printTokenStruct(values,names); sayln "end"; printSigs(values,names,fn s => TextIO.output(sigs,s)); TextIO.closeOut sigs; TextIO.closeOut result; MakeTable.Errs.printSummary (fn s => TextIO.output(TextIO.stdOut,s)) errs end; if verbose then let val f = TextIO.openOut (spec ^ ".desc") val say = fn s=> TextIO.output(f,s) val printRule = let val rules = Array.fromList grammarRules in fn say => let val prRule = fn {lhs,rhs,precedence,rulenum} => ((say o nontermToString) lhs; say " : "; app (fn s => (say (symbolToString s); say " ")) rhs) in fn i => prRule (rules sub i) end end in Verbose.printVerbose {termToString=termToString,nontermToString=nontermToString, table=table, stateErrs=stateErrs,errs = errs,entries = !entries, print=say, printCores=corePrint,printRule=printRule}; TextIO.closeOut f end else () end val parseGen = fn spec => let val (result,inputSource) = ParseGenParser.parse spec in make_parser(getResult result,spec,Header.error inputSource, errorOccurred inputSource) end end; mlton-20210117+dfsg/regression/000077500000000000000000000000001416264345000162065ustar00rootroot00000000000000mlton-20210117+dfsg/regression/.gitignore000066400000000000000000000002651416264345000202010ustar00rootroot00000000000000/RepeatParserCombinator.txt /empty.dat /hardlinkA /hardlinkB /medium.dat /outFuhMishra[012345] /small1.dat /small2.dat /test.dat /testbadl /testcycl /testlink /text.dat /textio.tmp mlton-20210117+dfsg/regression/1.ok000066400000000000000000000000631416264345000167000ustar00rootroot00000000000000unhandled exception: Overflow Nonzero exit status. mlton-20210117+dfsg/regression/1.sml000066400000000000000000000000351416264345000170610ustar00rootroot00000000000000val _ = raise raise Overflow mlton-20210117+dfsg/regression/10.sml000066400000000000000000000000461416264345000171430ustar00rootroot00000000000000val {...} = {hello = true, no = "no"} mlton-20210117+dfsg/regression/11.sml000066400000000000000000000001051416264345000171400ustar00rootroot00000000000000val _ = let val x = SOME [] in (valOf x = [1], valOf x = [true]) end mlton-20210117+dfsg/regression/12.sml000066400000000000000000000001031416264345000171370ustar00rootroot00000000000000fun f x = x val _ = f (0w1: Word8.word) val _ = f (0w1: Word.word) mlton-20210117+dfsg/regression/13.sml000066400000000000000000000001741416264345000171500ustar00rootroot00000000000000fun plus (a, b) = a functor F () = struct val _ = plus (plus (1, 2), 3) end infix plus structure S = F () mlton-20210117+dfsg/regression/14.sml000066400000000000000000000001331416264345000171440ustar00rootroot00000000000000datatype t = A | B datatype u = C of t val _ = if C A = C B then raise Fail "bug" else () mlton-20210117+dfsg/regression/15.ok000066400000000000000000000000001416264345000167540ustar00rootroot00000000000000mlton-20210117+dfsg/regression/15.sml000066400000000000000000000000001416264345000171360ustar00rootroot00000000000000mlton-20210117+dfsg/regression/16.ok000066400000000000000000000000161416264345000167640ustar00rootroot00000000000000Hello, World! mlton-20210117+dfsg/regression/16.sml000066400000000000000000000000311416264345000171430ustar00rootroot00000000000000print "Hello, World!\n"; mlton-20210117+dfsg/regression/17.ok000066400000000000000000000000161416264345000167650ustar00rootroot00000000000000Hello, World! mlton-20210117+dfsg/regression/17.sml000066400000000000000000000000431416264345000171470ustar00rootroot00000000000000print "Hello,"; print " World!\n"; mlton-20210117+dfsg/regression/18.ok000066400000000000000000000000161416264345000167660ustar00rootroot00000000000000Hello, World! mlton-20210117+dfsg/regression/18.sml000066400000000000000000000000651416264345000171540ustar00rootroot00000000000000print "Hello,"; val _ = print " "; print "World!\n"; mlton-20210117+dfsg/regression/19.ok000066400000000000000000000000161416264345000167670ustar00rootroot00000000000000Hello, World! mlton-20210117+dfsg/regression/19.sml000066400000000000000000000001061416264345000171510ustar00rootroot00000000000000print "Hello,"; val _ = print " "; print "World!"; val _ = print "\n" mlton-20210117+dfsg/regression/2.ok000066400000000000000000000000631416264345000167010ustar00rootroot00000000000000unhandled exception: Overflow Nonzero exit status. mlton-20210117+dfsg/regression/2.sml000066400000000000000000000001471416264345000170660ustar00rootroot00000000000000datatype t = A | B val f = fn A => 1 | B => 2 val _ = f(raise Overflow) val _ = f(raise Bind) mlton-20210117+dfsg/regression/20.ok000066400000000000000000000000161416264345000167570ustar00rootroot00000000000000Hello, World! mlton-20210117+dfsg/regression/20.sml000066400000000000000000000000641416264345000171440ustar00rootroot00000000000000structure S = struct end; print "Hello, World!\n"; mlton-20210117+dfsg/regression/21.ok000066400000000000000000000000001416264345000167510ustar00rootroot00000000000000mlton-20210117+dfsg/regression/21.sml000066400000000000000000000000311416264345000171370ustar00rootroot00000000000000val 'a rec f = fn x => x mlton-20210117+dfsg/regression/22.ok000066400000000000000000000000001416264345000167520ustar00rootroot00000000000000mlton-20210117+dfsg/regression/22.sml000066400000000000000000000000131416264345000171400ustar00rootroot00000000000000val _ = () mlton-20210117+dfsg/regression/23.nonterm000066400000000000000000000000001416264345000200240ustar00rootroot00000000000000mlton-20210117+dfsg/regression/23.sml000066400000000000000000000001161416264345000171450ustar00rootroot00000000000000fun f l = case l of [] => f l | _ :: l => f l val _ = f [13] mlton-20210117+dfsg/regression/3.sml000066400000000000000000000001641416264345000170660ustar00rootroot00000000000000(* Lexing tyvars *) type ('_a, '1a, ''a, '_, '', ''', ''1) t = int type u = (int, int, int, int, int, int, int) t mlton-20210117+dfsg/regression/4.sml000066400000000000000000000003331416264345000170650ustar00rootroot00000000000000(* This code has a handler which is provably unreachable. *) fun f(n: int): int list = if n = 0 then [] else let val x = f(n - 1) in [13] handle e => (hd x + 1; raise e) end val _ = f 13 mlton-20210117+dfsg/regression/5.sml000066400000000000000000000005071416264345000170710ustar00rootroot00000000000000(* Verifies that signature constraints change status *) structure S: sig val E: exn end = struct exception E end local open S in val E = E end val e = E structure S: sig type t val A: t end = struct datatype t = A end local open S in val A = A end val a = A mlton-20210117+dfsg/regression/6.sml000066400000000000000000000001321416264345000170640ustar00rootroot00000000000000fun f x = x val r: (int -> int) ref = ref f val _ = r := (fn y => y) val _ = !r 13 + 1 mlton-20210117+dfsg/regression/7.sml000066400000000000000000000002161416264345000170700ustar00rootroot00000000000000fun h f = f 13 fun f x = let fun z x = z(x + 1) in h z end val r : (int -> int) ref = ref f val _ = h(fn x => x) mlton-20210117+dfsg/regression/8.sml000066400000000000000000000000421416264345000170660ustar00rootroot00000000000000val _ = {hello = true, 1 = "yes"} mlton-20210117+dfsg/regression/9.sml000066400000000000000000000000601416264345000170670ustar00rootroot00000000000000fun 'a f (x: 'a): 'a = x val y: int -> int = f mlton-20210117+dfsg/regression/FuhMishra.ok000066400000000000000000000005431416264345000204310ustar00rootroot00000000000000 processing outFuhMishra0...running TYPE...running MATCH... processing outFuhMishra1...running TYPE...running MATCH... processing outFuhMishra2...running TYPE...running MATCH... processing outFuhMishra3...running TYPE...running MATCH... processing outFuhMishra4...running TYPE...running MATCH... processing outFuhMishra5...running TYPE...running MATCH... mlton-20210117+dfsg/regression/FuhMishra.sml000066400000000000000000000401471416264345000206170ustar00rootroot00000000000000val toString = Int.toString (* Ported to kit 23/4/97 by Mads. Commented out module phrases and changed a couple of sml/nj things (like makestring) No rewriting to please region inference. Still it uses less that 100Kb when it runs (see region.ps) *) (* This is a quickly written type checker for subtyping, using the MATCH and TYPE algorithms from the Fuh and Mishra paper. The code is ugly at places, and no consideration has been given to effeciency -- please accept my apologies -- Mads*) (* structure List = (* list utilities *) struct *) type 'a set = 'a list; (* sets are represented by lists without repeated elements *) val emptyset = [] fun isin(x,[])=false | isin(x,(y::rest)) = x=y orelse isin(x,rest) fun union([],l) = l | union((x::rest),l) = if isin(x,l) then union(rest,l) else x:: union(rest,l); fun intersect([],l) = [] | intersect((x::rest),l) = if isin(x,l) then x:: intersect(rest,l) else intersect(rest,l); fun setminus([],l) = [] | setminus(x::l,l') = if isin(x,l') then setminus(l,l') else x:: setminus(l,l'); fun foldr f b [] = b | foldr f b (x::rest) = f(x,foldr f b rest); fun foldl f base [] = base | foldl f base (x::xs) = foldl f (f(x, base)) xs (* function for finding transitive closure. Culled from other application. DO NOT READ (CRUDE AND INEFFICIENT) *) fun transClos (eq: 'a * 'a -> bool) (insert_when_eq: bool) (newsets: 'a set list, oldsets: 'a set list): bool * 'a set list = (* The lists in oldsets are pairwise disjoint, but nothing is known about the lists in newsets. The resulting sets are pairwise disjoint, and moreover, the resulting boolean is true if and only if every member (i.e. list) of newsets, is contained in some member (i.e., list) of oldsets *) let val any: bool = true (* could be false, for that matter *) fun isin(x,[]) = false | isin(x,x'::rest) = eq(x,x') orelse isin(x,rest) (* In the following function, L is a list of pairwise disjoint sets. S' is the set currently under construction; it is also disjoint from the sets in L. x will be added to S' if x is not in any set in L. *) fun add(x:'a, (found_fixpt: bool, found_class: bool, L as [], S')): bool * bool * 'a list list * 'a list = if isin(x,S') then if insert_when_eq then (found_fixpt andalso found_class, found_class,[],x::S') else (found_fixpt andalso found_class, found_class,[],S') else (false, any, [], x::S') | add(x,(found_fixpt,found_class,(S::L), S')) = if isin(x,S) then if insert_when_eq then (found_fixpt andalso not found_class,true, L, x::(S @ S')) else (found_fixpt andalso not found_class,true, L, S @ S') else let val (found_fixpt1, found_class1, L1, S1)= add(x,(found_fixpt,found_class,L,S')) in (found_fixpt andalso found_fixpt1, found_class orelse found_class1, S::L1, S1 ) end fun add_S (S,(found_fixpt, oldsets)) : bool * 'a set list = let val (found_fixpt1, _, L1, S1) = foldl add (found_fixpt, false, oldsets, emptyset) S in case S1 of [] => (found_fixpt andalso found_fixpt1, L1) | _ => (found_fixpt andalso found_fixpt1, S1::L1) end in foldl add_S (true, oldsets) newsets end (* end; *) (* structure Variables = (* program variables *) struct *) type var = string (* end; *) (*structure Type = (* Types, substitutions and matching *) struct local (* open List Variables*) in *) datatype ty = INT | REAL | ARROW of ty * ty | PROD of ty * ty | TYVAR of int type subst = ty -> ty fun mk_subst_ty(i: int,ty:ty):subst = let fun S(INT) = INT | S(REAL) = REAL | S(ARROW(ty1,ty2)) = ARROW(S ty1, S ty2) | S(PROD(ty1,ty2)) = PROD(S ty1, S ty2) | S(tv as TYVAR j) = if i=j then ty else tv in S end; val Id = fn x => x; val r = ref 0; (* counter for fresh type variables *) fun fresh() = (r:= !r + 1; ! r); fun fresh_ty() = TYVAR(fresh()); (* free variables *) fun fv_ty (INT,acc) = acc | fv_ty (REAL,acc) = acc | fv_ty(ARROW(t1,t2), acc) = fv_ty(t1,fv_ty(t2,acc)) | fv_ty(PROD(t1,t2), acc) = fv_ty(t1,fv_ty(t2,acc)) | fv_ty((TYVAR i),acc) = if isin(i,acc) then acc else i :: acc; fun tyvars(t:ty) = fv_ty(t,[]) fun fv_tyenv TE = foldr (fn((i,tau),acc)=> fv_ty(tau,acc)) [] TE (* ALLNEW, page 168: create a fresh copy of a type, using type variables at the leaves of the type *) fun allnew(INT) = fresh_ty() | allnew(REAL) = fresh_ty() | allnew(ARROW(t1,t2)) = ARROW(allnew(t1),allnew(t2)) | allnew(PROD(t1,t2)) = PROD(allnew(t1),allnew(t2)) | allnew(TYVAR _) = fresh_ty(); (* PAIR, page 168: create list of atomic types that occur in the same places of t1 and t2 *) fun pair(ARROW(t1,t2),ARROW(t1',t2')) = pair(t1,t1') @ pair (t2,t2') | pair(PROD(t1,t2),PROD(t1',t2')) = pair(t1,t1') @ pair (t2,t2') | pair(t1,t2) = [[t1,t2]] (* dealing with equivalence classes of atomic types -- for algorithm MATCH *) (* M_v, page 168: removing that equivalence class containing v from M *) fun remove([], v) = [] | remove((class::rest), v) = if isin(v,class) then rest else class:: remove(rest,v); (* [a]_M, page 168: the equivalence class containing a *) exception ClassOff fun class_of([],a) = raise ClassOff | class_of((class::rest), a) = if isin(a,class) then class else class_of(rest,a); (* [t]^M, page 168: the set of type variables eqivalent to some type variable occurring in non-atomic type t *) fun equiv_tyvars(t,M): ty list = foldr union [] ((map (fn a=> class_of(M,TYVAR a)) (tyvars(t))): ty list list) ; fun transitive_closure(oldsets,newsets) = #2(transClos(op = : ty*ty-> bool)(false)(newsets,oldsets)) (* Coercion sets *) type coercion = ty * ty type coercion_set = coercion list fun on_C(S,C) = map (fn(t1,t2) => (S t1, S t2)) C fun atomic t = case t of INT => true | REAL => true | TYVAR _ => true | _ => false; (* diagonal is used in match to create initial equivalence relation*) fun diagonal(C: coercion_set) = let fun diag(t,acc) = case t of INT => union([INT],acc) | REAL => union([REAL],acc) | PROD(t1,t2) => diag(t1,diag(t2,acc)) | ARROW(t1,t2) => diag(t1,diag(t2,acc)) | TYVAR _ => union([t],acc) fun diag2((t1,t2),acc) = diag(t1,diag(t2,acc)) val atomics = foldr diag2 [] C in map (fn atomic => [atomic,atomic]) atomics end fun ground_atomic t = case t of INT => true | REAL => true | _ => false; fun contains_no_type_constant [] = true | contains_no_type_constant (t::rest) = not (ground_atomic t) andalso contains_no_type_constant rest; exception MATCH local fun match1([]:coercion_set,S:subst,M) = S | match1((t1,t2)::C, S, M) = if atomic t1 andalso atomic t2 then atomicElimination(t1,t2,C,S,M) else if atomic t1 then expansion(t1,t2,C,S,M) else if atomic t2 then expansion(t2,t1,C,S,M) else decomposition(t1,t2,C,S,M) and atomicElimination(t1,t2,C,S,M) = match1(C,S,transitive_closure(M,[[t1,t2]])) and decomposition(ARROW(t1,t2),ARROW(t1',t2'),C,S,M)= match1((t1',t1)::(t2,t2')::C, S, M) | decomposition(PROD(t1,t2),PROD(t1',t2'),C,S,M)= match1((t1,t1')::(t2,t2')::C, S, M) | decomposition(_) = raise MATCH and expansion(t1:ty,t2:ty,C,S,M) = case intersect(class_of(M,t1), equiv_tyvars(t2,M)) (* occurs check *) of []=> if contains_no_type_constant(class_of(M,t1)) then (* not matching of int or real with arrow or prod *) let fun loop([],C,S,M) = match1(C,S,M) | loop((TYVAR alpha)::tyvars, C, S, M) = let val t' = allnew t2 val delta = mk_subst_ty(alpha,t') in loop(tyvars, on_C(delta,C), delta o S, transitive_closure(M,pair(t2,t'))) end | loop((_::tyvars), C, S, M) = (* skip atomic types, that are not variables *) loop(tyvars, C, S, M) in loop(class_of(M,t1),C,S,M) end else (* matching of int or real with arrow or prod *) raise MATCH | _ => (* occurs check failed *) raise MATCH in fun match(C) = match1(C,Id,diagonal C); end (* Type Environments *) type tyenv = (var * ty)list (* no polymorphism! *) (* looking up variables in the type environement *) exception Lookup; fun lookup(i,[]) = raise Lookup | lookup(i,((j,sigma)::rest)) = if i=j then sigma else lookup(i,rest); fun on_tyenv(S:subst,TE:tyenv) = map (fn(i,tau) => (i, S tau)) TE (* pretty printing -- actually not very pretty, but it will do *) (* precedences: -> : 1 * : 2 *) fun pp_ty' (context:int,INT) = "INT" | pp_ty'(_,REAL) = "REAL" | pp_ty'(context,ARROW(ty1, ty2)) = let val s = pp_ty'(2,ty1) ^ "->" ^ pp_ty'(1, ty2) in if context > 1 then "(" ^ s ^ ")" else s end | pp_ty'(context,PROD(ty1, ty2)) = let val s = pp_ty'(3,ty1) ^ "*" ^ pp_ty'(3,ty2) in if context > 2 then "(" ^ s ^ ")" else s end | pp_ty'(context,(TYVAR i)) = "'a" ^ toString i; fun pp_ty ty = pp_ty'(0,ty) local fun filter [] = [] | filter ((x,sigma)::rest) = if isin(x,["fst","snd","floor"]) (* hack to avoid printing of built-in variables fst, snd and floor *) then filter rest else (x,sigma)::filter rest fun pp_tyenv [] = "" | pp_tyenv ([(x,sigma)]) = x ^ ":" ^ pp_ty sigma ^ " " | pp_tyenv ((x,sigma)::rest) = x ^ ":" ^ pp_ty sigma ^ "," ^ pp_tyenv rest; in val pp_tyenv = pp_tyenv o filter end fun pp_coercion(tau1,tau2) = "\n " ^ pp_ty tau1 ^ " |> " ^ pp_ty tau2 fun pp_coercion_set [] = "" | pp_coercion_set[coercion] = pp_coercion coercion | pp_coercion_set(coercion::rest) = pp_coercion coercion ^ ", " ^ pp_coercion_set rest (* end (* local *) end; *) (*structure Expressions = struct local open List Variables in *) datatype exp = VAR of var | INTCON of int | REALCON of real | LAM of var * exp | APP of exp * exp | LET of var * exp * exp | PLUS of exp | MINUS of exp | PAIR of exp * exp; (* pretty printing *) fun pp_exp(VAR x) = x | pp_exp(LAM(x,e')) = "(fn " ^ x ^ " =>" ^ pp_exp e' ^ ")" | pp_exp(APP(e1,e2)) = "(" ^ pp_exp e1 ^ " @ " ^ pp_exp e2 ^ ")" | pp_exp(LET(x,e1,e2)) = "let " ^ x ^ "=" ^ pp_exp e1 ^ " in " ^ pp_exp e2 ^ "end" | pp_exp(INTCON i) = toString i | pp_exp(REALCON r) = toString(floor r) ^ ".?" | pp_exp(PLUS(e1)) = "(+" ^ pp_exp e1 ^ ")" | pp_exp(MINUS(e1)) = "(-" ^ pp_exp e1 ^ ")" | pp_exp(PAIR(e1,e2)) = "(" ^ pp_exp e1 ^ "," ^ pp_exp e2 ^ ")" (* end (* local *) end; *) (*structure TypeChecker= struct local open List Variables Type Expressions in *) type job = tyenv * exp * ty fun TYPE(TE:tyenv,e:exp) : ty * coercion_set = let val alpha0 = fresh_ty() val C = TY([(TE,e,alpha0)],[]) in (alpha0, C) end and TY([]: job list, C: coercion_set)= C | TY((job as (TE,e,tau)) :: rest, C: coercion_set)= case e of VAR x => TY(rest, (lookup(x,TE),tau)::C) | LAM(x,e') => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); val TE' = (x,(new_ty1))::TE in TY((TE',e',new_ty2)::rest, (ARROW(new_ty1,new_ty2), tau):: C) end | APP(e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,ARROW(new_ty1,new_ty2))::(TE,e2,new_ty1)::rest, (new_ty2,tau)::C) end | LET(x,e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,new_ty1)::((x,new_ty1)::TE,e2,new_ty2)::rest, (new_ty2,tau)::C) end | INTCON i => TY(rest, (INT, tau):: C) | REALCON i => TY(rest, (REAL, tau):: C) | PLUS e1 => TY((TE,e1, PROD(INT,INT))::rest, (PROD(INT,INT),tau):: C) | MINUS e1 => TY((TE,e1, PROD(INT,INT))::rest, (PROD(INT,INT),tau):: C) | PAIR(e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,new_ty1)::(TE,e2,new_ty2)::rest, (PROD(new_ty1,new_ty2),tau)::C) end type judgement = coercion_set * tyenv * exp * ty fun pp_judgement(C,TE,e,tau) = "\nCoersion set: " ^ pp_coercion_set C ^ "\nType environment: " ^ pp_tyenv TE ^ "\nExpression: " ^ pp_exp e ^ "\nType: " ^ pp_ty tau; (* end (* local *) end; *) (*structure Run = struct local open List Variables Type Expressions TypeChecker in *) val e0 = (* let val Id = fn x => x in (Id 3, Id 4.0) end *) let val Id = LAM("x",VAR "x") val pair = PAIR(APP(VAR "Id", INTCON 3), APP(VAR "Id", REALCON 4.0)) in LET("Id",Id, pair) end; val e1 = (* let val makepair = fn x => (x,x) in makepair 3.14 *) let val makepair = LAM("x",PAIR(VAR "x", VAR "x")) in LET("makepair", makepair, APP(VAR "makepair", REALCON 3.14)) end val e2 = (* let fun mappair = fn f => fn x => (f (fst x), f (snd x)) in mappair floor (3.14,2.18) end *) let val mappair = LAM("f",LAM("x", PAIR(APP(VAR "f",APP(VAR "fst", VAR "x")), APP(VAR "f",APP(VAR "snd", VAR "x"))))) in LET("mappair",mappair, APP(APP(VAR "mappair", VAR "floor"), PAIR(REALCON 3.14, REALCON 2.18))) end; val e3 = (* fn x => x *) LAM("x",VAR "x") val e4 = (* fn f => fn x => f x *) LAM("f",LAM("x",APP(VAR "f", VAR "x"))); val e5 = (* fn f => fn x => f(f x) *) LAM("f",LAM("x",APP(VAR "f", APP(VAR "f", VAR "x")))); fun run(e: exp, outfilename: string) = let val _ = r:= 5; (* reset counter for type variables *) val _ = print("\nprocessing " ^ outfilename ^ "...") val TE0 = [("fst", (ARROW(PROD(TYVAR 0,TYVAR 1),TYVAR 0))), (* the type of fst *) ("snd", (ARROW(PROD(TYVAR 0,TYVAR 1),TYVAR 1))), (* the type of snd *) ("floor", (ARROW(REAL,INT)))] (* the type of floor *) val _ = print("running TYPE...") val (ty,C) = TYPE(TE0,e) ; val os = TextIO.openOut outfilename; val _ = TextIO.output(os, "\nResult of TYPE:\n\n\n " ^ pp_judgement(C,TE0,e,ty)); val _ = print("running MATCH...") val S = match C val judgem' as (C',TE',e',ty') = (on_C(S,C),on_tyenv(S,TE0),e,S ty) val _ = TextIO.output(os, "\n\n\nResult of MATCH:\n\n\n " ^ pp_judgement judgem'); in TextIO.closeOut os end; val _ = run(e0,"outFuhMishra0"); val _ = run(e1,"outFuhMishra1"); val _ = run(e2,"outFuhMishra2"); val _ = run(e3,"outFuhMishra3"); val _ = run(e4,"outFuhMishra4"); val _ = run(e5,"outFuhMishra5"); (* end (* local *) end (*struct*); *) val _ = print "\n" mlton-20210117+dfsg/regression/Makefile000066400000000000000000000007261416264345000176530ustar00rootroot00000000000000## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean rm -f *.[csS] for f in *; do \ if [ -x "$$f" -a ! -d "$$f" ]; then \ rm -f "$$f"; \ fi; \ done .PHONY: abnormal abnormal: ls -1 | egrep -v '\.ok$$|\.sml$$' mlton-20210117+dfsg/regression/README000066400000000000000000000022331416264345000170660ustar00rootroot00000000000000The following regressions are known to fail when using a version of MLton built by SML/NJ. This happens because of bugs in SML/NJ. pack-real.sml fails because SML/NJ has the wrong sign for Real.fromString "~0.0". ---------------------------------------------------------------------- Many of these regression tests come from the ML Kit Version 3 distribution, which borrowed them from the Moscow ML distribution. The "regression" script runs all the tests in this directory and prints whether they succeeded or failed. If they fail, you should look at the "log" file to see what went wrong. There should be only two warnings in the log file. filesys.sml warning due to the use of tmpnam real.sml fails due to MLton's incorrect handling of real to string conversions. The following subdirectories contain tests that have not yet been integrated into the regression script. fail/ contains tests that should fail to compile. modules/ contains tests of the module system. nonterminate/ contains tests that should compile, but when run, should not terminate. mlton-20210117+dfsg/regression/README.kit000066400000000000000000000015641416264345000176620ustar00rootroot00000000000000This directory contains test programs for the ML Kit. Many of the test cases for the SML Basis Library have been borrowed from the Moscow ML distribution. The test is invoked with the `kittester' program located (after the Kit is installed) in the kit/bin directory. (The sources for `kittester' are available in the directory kit/src/Tools/Tester.) The directory must contain this file `README' and three symbolic links: testlink -> README testcycl -> testcycl testbadl -> exists.not Moreover, it must contain a file `hardlinkA' and a hard link `hardlinkB' to `hardlinkA' (or vice versa). The directory must not contain a file or directory named `exists.not'. To run all the tests, invoke `kittester' as follows (from this directory): > ../bin/kittester all.tst See the file `all.tst' to learn how to add programs to the test. - ME 1998-10-21mlton-20210117+dfsg/regression/abcde.nonterm000066400000000000000000000000001416264345000206360ustar00rootroot00000000000000mlton-20210117+dfsg/regression/abcde.sml000066400000000000000000000001471416264345000177630ustar00rootroot00000000000000fun a x = (b x; c x) and b x = (a x; c x; d x) and c x = d x and d x = e x and e x = d x val _ = a 13 mlton-20210117+dfsg/regression/abstype.ok000066400000000000000000000000001416264345000201760ustar00rootroot00000000000000mlton-20210117+dfsg/regression/abstype.sml000066400000000000000000000016301416264345000203720ustar00rootroot00000000000000abstype t = T with val eq = op = end val _ = eq (3, 3) abstype t = T with val t = T val eq = op = end val _ = eq (t, t) abstype t = T with val t = T val eq = op = val _ = eq (t, t) end val _ = eq (2, 3) abstype t = T with val t = T val eq = op = val _ = eq (t, t) end val _ = eq (t, t) abstype t = T with val t = T val eq = op = val _ = eq (t, t) andalso eq (2, 3) end val _ = eq (2, 3) (* with abstype *) structure S = struct abstype s = S with val a = S end end signature F = sig val b : S.s end functor F() : F = struct type s = S.s val b = S.a end functor K() = struct structure F = F() end structure K = K() (* abstype.sml *) (* Checks equality inferred for abstype environments. *) abstype t = T with datatype u = U of t val eq = op= end fun eq1(t1, t2) = U t1 = U t2; fun eq2(t1, t2 : t) = eq(t1, t2); mlton-20210117+dfsg/regression/all-overloads.sml000066400000000000000000000575711416264345000215060ustar00rootroot00000000000000(* This file is automatically generated. Do not edit. *) fun f (x: Int.int) = ~ x fun f (x: IntInf.int) = ~ x fun f (x: LargeInt.int) = ~ x fun f (x: FixedInt.int) = ~ x fun f (x: Position.int) = ~ x fun f (x: Int2.int) = ~ x fun f (x: Int3.int) = ~ x fun f (x: Int4.int) = ~ x fun f (x: Int5.int) = ~ x fun f (x: Int6.int) = ~ x fun f (x: Int7.int) = ~ x fun f (x: Int8.int) = ~ x fun f (x: Int9.int) = ~ x fun f (x: Int10.int) = ~ x fun f (x: Int11.int) = ~ x fun f (x: Int12.int) = ~ x fun f (x: Int13.int) = ~ x fun f (x: Int14.int) = ~ x fun f (x: Int15.int) = ~ x fun f (x: Int16.int) = ~ x fun f (x: Int17.int) = ~ x fun f (x: Int18.int) = ~ x fun f (x: Int19.int) = ~ x fun f (x: Int20.int) = ~ x fun f (x: Int21.int) = ~ x fun f (x: Int22.int) = ~ x fun f (x: Int23.int) = ~ x fun f (x: Int24.int) = ~ x fun f (x: Int25.int) = ~ x fun f (x: Int26.int) = ~ x fun f (x: Int27.int) = ~ x fun f (x: Int28.int) = ~ x fun f (x: Int29.int) = ~ x fun f (x: Int30.int) = ~ x fun f (x: Int31.int) = ~ x fun f (x: Int32.int) = ~ x fun f (x: Int64.int) = ~ x fun f (x: Word.word) = ~ x fun f (x: LargeWord.word) = ~ x fun f (x: SysWord.word) = ~ x fun f (x: Word2.word) = ~ x fun f (x: Word3.word) = ~ x fun f (x: Word4.word) = ~ x fun f (x: Word5.word) = ~ x fun f (x: Word6.word) = ~ x fun f (x: Word7.word) = ~ x fun f (x: Word8.word) = ~ x fun f (x: Word9.word) = ~ x fun f (x: Word10.word) = ~ x fun f (x: Word11.word) = ~ x fun f (x: Word12.word) = ~ x fun f (x: Word13.word) = ~ x fun f (x: Word14.word) = ~ x fun f (x: Word15.word) = ~ x fun f (x: Word16.word) = ~ x fun f (x: Word17.word) = ~ x fun f (x: Word18.word) = ~ x fun f (x: Word19.word) = ~ x fun f (x: Word20.word) = ~ x fun f (x: Word21.word) = ~ x fun f (x: Word22.word) = ~ x fun f (x: Word23.word) = ~ x fun f (x: Word24.word) = ~ x fun f (x: Word25.word) = ~ x fun f (x: Word26.word) = ~ x fun f (x: Word27.word) = ~ x fun f (x: Word28.word) = ~ x fun f (x: Word29.word) = ~ x fun f (x: Word30.word) = ~ x fun f (x: Word31.word) = ~ x fun f (x: Word32.word) = ~ x fun f (x: Word64.word) = ~ x fun f (x: Real.real) = ~ x fun f (x: Real32.real) = ~ x fun f (x: Real64.real) = ~ x fun f (x: LargeReal.real) = ~ x fun f (x: Int.int) = x + x fun f (x: IntInf.int) = x + x fun f (x: LargeInt.int) = x + x fun f (x: FixedInt.int) = x + x fun f (x: Position.int) = x + x fun f (x: Int2.int) = x + x fun f (x: Int3.int) = x + x fun f (x: Int4.int) = x + x fun f (x: Int5.int) = x + x fun f (x: Int6.int) = x + x fun f (x: Int7.int) = x + x fun f (x: Int8.int) = x + x fun f (x: Int9.int) = x + x fun f (x: Int10.int) = x + x fun f (x: Int11.int) = x + x fun f (x: Int12.int) = x + x fun f (x: Int13.int) = x + x fun f (x: Int14.int) = x + x fun f (x: Int15.int) = x + x fun f (x: Int16.int) = x + x fun f (x: Int17.int) = x + x fun f (x: Int18.int) = x + x fun f (x: Int19.int) = x + x fun f (x: Int20.int) = x + x fun f (x: Int21.int) = x + x fun f (x: Int22.int) = x + x fun f (x: Int23.int) = x + x fun f (x: Int24.int) = x + x fun f (x: Int25.int) = x + x fun f (x: Int26.int) = x + x fun f (x: Int27.int) = x + x fun f (x: Int28.int) = x + x fun f (x: Int29.int) = x + x fun f (x: Int30.int) = x + x fun f (x: Int31.int) = x + x fun f (x: Int32.int) = x + x fun f (x: Int64.int) = x + x fun f (x: Word.word) = x + x fun f (x: LargeWord.word) = x + x fun f (x: SysWord.word) = x + x fun f (x: Word2.word) = x + x fun f (x: Word3.word) = x + x fun f (x: Word4.word) = x + x fun f (x: Word5.word) = x + x fun f (x: Word6.word) = x + x fun f (x: Word7.word) = x + x fun f (x: Word8.word) = x + x fun f (x: Word9.word) = x + x fun f (x: Word10.word) = x + x fun f (x: Word11.word) = x + x fun f (x: Word12.word) = x + x fun f (x: Word13.word) = x + x fun f (x: Word14.word) = x + x fun f (x: Word15.word) = x + x fun f (x: Word16.word) = x + x fun f (x: Word17.word) = x + x fun f (x: Word18.word) = x + x fun f (x: Word19.word) = x + x fun f (x: Word20.word) = x + x fun f (x: Word21.word) = x + x fun f (x: Word22.word) = x + x fun f (x: Word23.word) = x + x fun f (x: Word24.word) = x + x fun f (x: Word25.word) = x + x fun f (x: Word26.word) = x + x fun f (x: Word27.word) = x + x fun f (x: Word28.word) = x + x fun f (x: Word29.word) = x + x fun f (x: Word30.word) = x + x fun f (x: Word31.word) = x + x fun f (x: Word32.word) = x + x fun f (x: Word64.word) = x + x fun f (x: Real.real) = x + x fun f (x: Real32.real) = x + x fun f (x: Real64.real) = x + x fun f (x: LargeReal.real) = x + x fun f (x: Int.int) = x - x fun f (x: IntInf.int) = x - x fun f (x: LargeInt.int) = x - x fun f (x: FixedInt.int) = x - x fun f (x: Position.int) = x - x fun f (x: Int2.int) = x - x fun f (x: Int3.int) = x - x fun f (x: Int4.int) = x - x fun f (x: Int5.int) = x - x fun f (x: Int6.int) = x - x fun f (x: Int7.int) = x - x fun f (x: Int8.int) = x - x fun f (x: Int9.int) = x - x fun f (x: Int10.int) = x - x fun f (x: Int11.int) = x - x fun f (x: Int12.int) = x - x fun f (x: Int13.int) = x - x fun f (x: Int14.int) = x - x fun f (x: Int15.int) = x - x fun f (x: Int16.int) = x - x fun f (x: Int17.int) = x - x fun f (x: Int18.int) = x - x fun f (x: Int19.int) = x - x fun f (x: Int20.int) = x - x fun f (x: Int21.int) = x - x fun f (x: Int22.int) = x - x fun f (x: Int23.int) = x - x fun f (x: Int24.int) = x - x fun f (x: Int25.int) = x - x fun f (x: Int26.int) = x - x fun f (x: Int27.int) = x - x fun f (x: Int28.int) = x - x fun f (x: Int29.int) = x - x fun f (x: Int30.int) = x - x fun f (x: Int31.int) = x - x fun f (x: Int32.int) = x - x fun f (x: Int64.int) = x - x fun f (x: Word.word) = x - x fun f (x: LargeWord.word) = x - x fun f (x: SysWord.word) = x - x fun f (x: Word2.word) = x - x fun f (x: Word3.word) = x - x fun f (x: Word4.word) = x - x fun f (x: Word5.word) = x - x fun f (x: Word6.word) = x - x fun f (x: Word7.word) = x - x fun f (x: Word8.word) = x - x fun f (x: Word9.word) = x - x fun f (x: Word10.word) = x - x fun f (x: Word11.word) = x - x fun f (x: Word12.word) = x - x fun f (x: Word13.word) = x - x fun f (x: Word14.word) = x - x fun f (x: Word15.word) = x - x fun f (x: Word16.word) = x - x fun f (x: Word17.word) = x - x fun f (x: Word18.word) = x - x fun f (x: Word19.word) = x - x fun f (x: Word20.word) = x - x fun f (x: Word21.word) = x - x fun f (x: Word22.word) = x - x fun f (x: Word23.word) = x - x fun f (x: Word24.word) = x - x fun f (x: Word25.word) = x - x fun f (x: Word26.word) = x - x fun f (x: Word27.word) = x - x fun f (x: Word28.word) = x - x fun f (x: Word29.word) = x - x fun f (x: Word30.word) = x - x fun f (x: Word31.word) = x - x fun f (x: Word32.word) = x - x fun f (x: Word64.word) = x - x fun f (x: Real.real) = x - x fun f (x: Real32.real) = x - x fun f (x: Real64.real) = x - x fun f (x: LargeReal.real) = x - x fun f (x: Int.int) = x * x fun f (x: IntInf.int) = x * x fun f (x: LargeInt.int) = x * x fun f (x: FixedInt.int) = x * x fun f (x: Position.int) = x * x fun f (x: Int2.int) = x * x fun f (x: Int3.int) = x * x fun f (x: Int4.int) = x * x fun f (x: Int5.int) = x * x fun f (x: Int6.int) = x * x fun f (x: Int7.int) = x * x fun f (x: Int8.int) = x * x fun f (x: Int9.int) = x * x fun f (x: Int10.int) = x * x fun f (x: Int11.int) = x * x fun f (x: Int12.int) = x * x fun f (x: Int13.int) = x * x fun f (x: Int14.int) = x * x fun f (x: Int15.int) = x * x fun f (x: Int16.int) = x * x fun f (x: Int17.int) = x * x fun f (x: Int18.int) = x * x fun f (x: Int19.int) = x * x fun f (x: Int20.int) = x * x fun f (x: Int21.int) = x * x fun f (x: Int22.int) = x * x fun f (x: Int23.int) = x * x fun f (x: Int24.int) = x * x fun f (x: Int25.int) = x * x fun f (x: Int26.int) = x * x fun f (x: Int27.int) = x * x fun f (x: Int28.int) = x * x fun f (x: Int29.int) = x * x fun f (x: Int30.int) = x * x fun f (x: Int31.int) = x * x fun f (x: Int32.int) = x * x fun f (x: Int64.int) = x * x fun f (x: Word.word) = x * x fun f (x: LargeWord.word) = x * x fun f (x: SysWord.word) = x * x fun f (x: Word2.word) = x * x fun f (x: Word3.word) = x * x fun f (x: Word4.word) = x * x fun f (x: Word5.word) = x * x fun f (x: Word6.word) = x * x fun f (x: Word7.word) = x * x fun f (x: Word8.word) = x * x fun f (x: Word9.word) = x * x fun f (x: Word10.word) = x * x fun f (x: Word11.word) = x * x fun f (x: Word12.word) = x * x fun f (x: Word13.word) = x * x fun f (x: Word14.word) = x * x fun f (x: Word15.word) = x * x fun f (x: Word16.word) = x * x fun f (x: Word17.word) = x * x fun f (x: Word18.word) = x * x fun f (x: Word19.word) = x * x fun f (x: Word20.word) = x * x fun f (x: Word21.word) = x * x fun f (x: Word22.word) = x * x fun f (x: Word23.word) = x * x fun f (x: Word24.word) = x * x fun f (x: Word25.word) = x * x fun f (x: Word26.word) = x * x fun f (x: Word27.word) = x * x fun f (x: Word28.word) = x * x fun f (x: Word29.word) = x * x fun f (x: Word30.word) = x * x fun f (x: Word31.word) = x * x fun f (x: Word32.word) = x * x fun f (x: Word64.word) = x * x fun f (x: Real.real) = x * x fun f (x: Real32.real) = x * x fun f (x: Real64.real) = x * x fun f (x: LargeReal.real) = x * x fun f (x: Real.real) = x / x fun f (x: Real32.real) = x / x fun f (x: Real64.real) = x / x fun f (x: LargeReal.real) = x / x fun f (x: Int.int) = x div x fun f (x: IntInf.int) = x div x fun f (x: LargeInt.int) = x div x fun f (x: FixedInt.int) = x div x fun f (x: Position.int) = x div x fun f (x: Int2.int) = x div x fun f (x: Int3.int) = x div x fun f (x: Int4.int) = x div x fun f (x: Int5.int) = x div x fun f (x: Int6.int) = x div x fun f (x: Int7.int) = x div x fun f (x: Int8.int) = x div x fun f (x: Int9.int) = x div x fun f (x: Int10.int) = x div x fun f (x: Int11.int) = x div x fun f (x: Int12.int) = x div x fun f (x: Int13.int) = x div x fun f (x: Int14.int) = x div x fun f (x: Int15.int) = x div x fun f (x: Int16.int) = x div x fun f (x: Int17.int) = x div x fun f (x: Int18.int) = x div x fun f (x: Int19.int) = x div x fun f (x: Int20.int) = x div x fun f (x: Int21.int) = x div x fun f (x: Int22.int) = x div x fun f (x: Int23.int) = x div x fun f (x: Int24.int) = x div x fun f (x: Int25.int) = x div x fun f (x: Int26.int) = x div x fun f (x: Int27.int) = x div x fun f (x: Int28.int) = x div x fun f (x: Int29.int) = x div x fun f (x: Int30.int) = x div x fun f (x: Int31.int) = x div x fun f (x: Int32.int) = x div x fun f (x: Int64.int) = x div x fun f (x: Word.word) = x div x fun f (x: LargeWord.word) = x div x fun f (x: SysWord.word) = x div x fun f (x: Word2.word) = x div x fun f (x: Word3.word) = x div x fun f (x: Word4.word) = x div x fun f (x: Word5.word) = x div x fun f (x: Word6.word) = x div x fun f (x: Word7.word) = x div x fun f (x: Word8.word) = x div x fun f (x: Word9.word) = x div x fun f (x: Word10.word) = x div x fun f (x: Word11.word) = x div x fun f (x: Word12.word) = x div x fun f (x: Word13.word) = x div x fun f (x: Word14.word) = x div x fun f (x: Word15.word) = x div x fun f (x: Word16.word) = x div x fun f (x: Word17.word) = x div x fun f (x: Word18.word) = x div x fun f (x: Word19.word) = x div x fun f (x: Word20.word) = x div x fun f (x: Word21.word) = x div x fun f (x: Word22.word) = x div x fun f (x: Word23.word) = x div x fun f (x: Word24.word) = x div x fun f (x: Word25.word) = x div x fun f (x: Word26.word) = x div x fun f (x: Word27.word) = x div x fun f (x: Word28.word) = x div x fun f (x: Word29.word) = x div x fun f (x: Word30.word) = x div x fun f (x: Word31.word) = x div x fun f (x: Word32.word) = x div x fun f (x: Word64.word) = x div x fun f (x: Int.int) = x mod x fun f (x: IntInf.int) = x mod x fun f (x: LargeInt.int) = x mod x fun f (x: FixedInt.int) = x mod x fun f (x: Position.int) = x mod x fun f (x: Int2.int) = x mod x fun f (x: Int3.int) = x mod x fun f (x: Int4.int) = x mod x fun f (x: Int5.int) = x mod x fun f (x: Int6.int) = x mod x fun f (x: Int7.int) = x mod x fun f (x: Int8.int) = x mod x fun f (x: Int9.int) = x mod x fun f (x: Int10.int) = x mod x fun f (x: Int11.int) = x mod x fun f (x: Int12.int) = x mod x fun f (x: Int13.int) = x mod x fun f (x: Int14.int) = x mod x fun f (x: Int15.int) = x mod x fun f (x: Int16.int) = x mod x fun f (x: Int17.int) = x mod x fun f (x: Int18.int) = x mod x fun f (x: Int19.int) = x mod x fun f (x: Int20.int) = x mod x fun f (x: Int21.int) = x mod x fun f (x: Int22.int) = x mod x fun f (x: Int23.int) = x mod x fun f (x: Int24.int) = x mod x fun f (x: Int25.int) = x mod x fun f (x: Int26.int) = x mod x fun f (x: Int27.int) = x mod x fun f (x: Int28.int) = x mod x fun f (x: Int29.int) = x mod x fun f (x: Int30.int) = x mod x fun f (x: Int31.int) = x mod x fun f (x: Int32.int) = x mod x fun f (x: Int64.int) = x mod x fun f (x: Word.word) = x mod x fun f (x: LargeWord.word) = x mod x fun f (x: SysWord.word) = x mod x fun f (x: Word2.word) = x mod x fun f (x: Word3.word) = x mod x fun f (x: Word4.word) = x mod x fun f (x: Word5.word) = x mod x fun f (x: Word6.word) = x mod x fun f (x: Word7.word) = x mod x fun f (x: Word8.word) = x mod x fun f (x: Word9.word) = x mod x fun f (x: Word10.word) = x mod x fun f (x: Word11.word) = x mod x fun f (x: Word12.word) = x mod x fun f (x: Word13.word) = x mod x fun f (x: Word14.word) = x mod x fun f (x: Word15.word) = x mod x fun f (x: Word16.word) = x mod x fun f (x: Word17.word) = x mod x fun f (x: Word18.word) = x mod x fun f (x: Word19.word) = x mod x fun f (x: Word20.word) = x mod x fun f (x: Word21.word) = x mod x fun f (x: Word22.word) = x mod x fun f (x: Word23.word) = x mod x fun f (x: Word24.word) = x mod x fun f (x: Word25.word) = x mod x fun f (x: Word26.word) = x mod x fun f (x: Word27.word) = x mod x fun f (x: Word28.word) = x mod x fun f (x: Word29.word) = x mod x fun f (x: Word30.word) = x mod x fun f (x: Word31.word) = x mod x fun f (x: Word32.word) = x mod x fun f (x: Word64.word) = x mod x fun f (x: Int.int) = abs x fun f (x: IntInf.int) = abs x fun f (x: LargeInt.int) = abs x fun f (x: FixedInt.int) = abs x fun f (x: Position.int) = abs x fun f (x: Int2.int) = abs x fun f (x: Int3.int) = abs x fun f (x: Int4.int) = abs x fun f (x: Int5.int) = abs x fun f (x: Int6.int) = abs x fun f (x: Int7.int) = abs x fun f (x: Int8.int) = abs x fun f (x: Int9.int) = abs x fun f (x: Int10.int) = abs x fun f (x: Int11.int) = abs x fun f (x: Int12.int) = abs x fun f (x: Int13.int) = abs x fun f (x: Int14.int) = abs x fun f (x: Int15.int) = abs x fun f (x: Int16.int) = abs x fun f (x: Int17.int) = abs x fun f (x: Int18.int) = abs x fun f (x: Int19.int) = abs x fun f (x: Int20.int) = abs x fun f (x: Int21.int) = abs x fun f (x: Int22.int) = abs x fun f (x: Int23.int) = abs x fun f (x: Int24.int) = abs x fun f (x: Int25.int) = abs x fun f (x: Int26.int) = abs x fun f (x: Int27.int) = abs x fun f (x: Int28.int) = abs x fun f (x: Int29.int) = abs x fun f (x: Int30.int) = abs x fun f (x: Int31.int) = abs x fun f (x: Int32.int) = abs x fun f (x: Int64.int) = abs x fun f (x: Real.real) = abs x fun f (x: Real32.real) = abs x fun f (x: Real64.real) = abs x fun f (x: LargeReal.real) = abs x fun f (x: Int.int) = x < x fun f (x: IntInf.int) = x < x fun f (x: LargeInt.int) = x < x fun f (x: FixedInt.int) = x < x fun f (x: Position.int) = x < x fun f (x: Int2.int) = x < x fun f (x: Int3.int) = x < x fun f (x: Int4.int) = x < x fun f (x: Int5.int) = x < x fun f (x: Int6.int) = x < x fun f (x: Int7.int) = x < x fun f (x: Int8.int) = x < x fun f (x: Int9.int) = x < x fun f (x: Int10.int) = x < x fun f (x: Int11.int) = x < x fun f (x: Int12.int) = x < x fun f (x: Int13.int) = x < x fun f (x: Int14.int) = x < x fun f (x: Int15.int) = x < x fun f (x: Int16.int) = x < x fun f (x: Int17.int) = x < x fun f (x: Int18.int) = x < x fun f (x: Int19.int) = x < x fun f (x: Int20.int) = x < x fun f (x: Int21.int) = x < x fun f (x: Int22.int) = x < x fun f (x: Int23.int) = x < x fun f (x: Int24.int) = x < x fun f (x: Int25.int) = x < x fun f (x: Int26.int) = x < x fun f (x: Int27.int) = x < x fun f (x: Int28.int) = x < x fun f (x: Int29.int) = x < x fun f (x: Int30.int) = x < x fun f (x: Int31.int) = x < x fun f (x: Int32.int) = x < x fun f (x: Int64.int) = x < x fun f (x: Word.word) = x < x fun f (x: LargeWord.word) = x < x fun f (x: SysWord.word) = x < x fun f (x: Word2.word) = x < x fun f (x: Word3.word) = x < x fun f (x: Word4.word) = x < x fun f (x: Word5.word) = x < x fun f (x: Word6.word) = x < x fun f (x: Word7.word) = x < x fun f (x: Word8.word) = x < x fun f (x: Word9.word) = x < x fun f (x: Word10.word) = x < x fun f (x: Word11.word) = x < x fun f (x: Word12.word) = x < x fun f (x: Word13.word) = x < x fun f (x: Word14.word) = x < x fun f (x: Word15.word) = x < x fun f (x: Word16.word) = x < x fun f (x: Word17.word) = x < x fun f (x: Word18.word) = x < x fun f (x: Word19.word) = x < x fun f (x: Word20.word) = x < x fun f (x: Word21.word) = x < x fun f (x: Word22.word) = x < x fun f (x: Word23.word) = x < x fun f (x: Word24.word) = x < x fun f (x: Word25.word) = x < x fun f (x: Word26.word) = x < x fun f (x: Word27.word) = x < x fun f (x: Word28.word) = x < x fun f (x: Word29.word) = x < x fun f (x: Word30.word) = x < x fun f (x: Word31.word) = x < x fun f (x: Word32.word) = x < x fun f (x: Word64.word) = x < x fun f (x: Real.real) = x < x fun f (x: Real32.real) = x < x fun f (x: Real64.real) = x < x fun f (x: LargeReal.real) = x < x fun f (x: Char.char) = x < x fun f (x: String.string) = x < x fun f (x: Int.int) = x <= x fun f (x: IntInf.int) = x <= x fun f (x: LargeInt.int) = x <= x fun f (x: FixedInt.int) = x <= x fun f (x: Position.int) = x <= x fun f (x: Int2.int) = x <= x fun f (x: Int3.int) = x <= x fun f (x: Int4.int) = x <= x fun f (x: Int5.int) = x <= x fun f (x: Int6.int) = x <= x fun f (x: Int7.int) = x <= x fun f (x: Int8.int) = x <= x fun f (x: Int9.int) = x <= x fun f (x: Int10.int) = x <= x fun f (x: Int11.int) = x <= x fun f (x: Int12.int) = x <= x fun f (x: Int13.int) = x <= x fun f (x: Int14.int) = x <= x fun f (x: Int15.int) = x <= x fun f (x: Int16.int) = x <= x fun f (x: Int17.int) = x <= x fun f (x: Int18.int) = x <= x fun f (x: Int19.int) = x <= x fun f (x: Int20.int) = x <= x fun f (x: Int21.int) = x <= x fun f (x: Int22.int) = x <= x fun f (x: Int23.int) = x <= x fun f (x: Int24.int) = x <= x fun f (x: Int25.int) = x <= x fun f (x: Int26.int) = x <= x fun f (x: Int27.int) = x <= x fun f (x: Int28.int) = x <= x fun f (x: Int29.int) = x <= x fun f (x: Int30.int) = x <= x fun f (x: Int31.int) = x <= x fun f (x: Int32.int) = x <= x fun f (x: Int64.int) = x <= x fun f (x: Word.word) = x <= x fun f (x: LargeWord.word) = x <= x fun f (x: SysWord.word) = x <= x fun f (x: Word2.word) = x <= x fun f (x: Word3.word) = x <= x fun f (x: Word4.word) = x <= x fun f (x: Word5.word) = x <= x fun f (x: Word6.word) = x <= x fun f (x: Word7.word) = x <= x fun f (x: Word8.word) = x <= x fun f (x: Word9.word) = x <= x fun f (x: Word10.word) = x <= x fun f (x: Word11.word) = x <= x fun f (x: Word12.word) = x <= x fun f (x: Word13.word) = x <= x fun f (x: Word14.word) = x <= x fun f (x: Word15.word) = x <= x fun f (x: Word16.word) = x <= x fun f (x: Word17.word) = x <= x fun f (x: Word18.word) = x <= x fun f (x: Word19.word) = x <= x fun f (x: Word20.word) = x <= x fun f (x: Word21.word) = x <= x fun f (x: Word22.word) = x <= x fun f (x: Word23.word) = x <= x fun f (x: Word24.word) = x <= x fun f (x: Word25.word) = x <= x fun f (x: Word26.word) = x <= x fun f (x: Word27.word) = x <= x fun f (x: Word28.word) = x <= x fun f (x: Word29.word) = x <= x fun f (x: Word30.word) = x <= x fun f (x: Word31.word) = x <= x fun f (x: Word32.word) = x <= x fun f (x: Word64.word) = x <= x fun f (x: Real.real) = x <= x fun f (x: Real32.real) = x <= x fun f (x: Real64.real) = x <= x fun f (x: LargeReal.real) = x <= x fun f (x: Char.char) = x <= x fun f (x: String.string) = x <= x fun f (x: Int.int) = x > x fun f (x: IntInf.int) = x > x fun f (x: LargeInt.int) = x > x fun f (x: FixedInt.int) = x > x fun f (x: Position.int) = x > x fun f (x: Int2.int) = x > x fun f (x: Int3.int) = x > x fun f (x: Int4.int) = x > x fun f (x: Int5.int) = x > x fun f (x: Int6.int) = x > x fun f (x: Int7.int) = x > x fun f (x: Int8.int) = x > x fun f (x: Int9.int) = x > x fun f (x: Int10.int) = x > x fun f (x: Int11.int) = x > x fun f (x: Int12.int) = x > x fun f (x: Int13.int) = x > x fun f (x: Int14.int) = x > x fun f (x: Int15.int) = x > x fun f (x: Int16.int) = x > x fun f (x: Int17.int) = x > x fun f (x: Int18.int) = x > x fun f (x: Int19.int) = x > x fun f (x: Int20.int) = x > x fun f (x: Int21.int) = x > x fun f (x: Int22.int) = x > x fun f (x: Int23.int) = x > x fun f (x: Int24.int) = x > x fun f (x: Int25.int) = x > x fun f (x: Int26.int) = x > x fun f (x: Int27.int) = x > x fun f (x: Int28.int) = x > x fun f (x: Int29.int) = x > x fun f (x: Int30.int) = x > x fun f (x: Int31.int) = x > x fun f (x: Int32.int) = x > x fun f (x: Int64.int) = x > x fun f (x: Word.word) = x > x fun f (x: LargeWord.word) = x > x fun f (x: SysWord.word) = x > x fun f (x: Word2.word) = x > x fun f (x: Word3.word) = x > x fun f (x: Word4.word) = x > x fun f (x: Word5.word) = x > x fun f (x: Word6.word) = x > x fun f (x: Word7.word) = x > x fun f (x: Word8.word) = x > x fun f (x: Word9.word) = x > x fun f (x: Word10.word) = x > x fun f (x: Word11.word) = x > x fun f (x: Word12.word) = x > x fun f (x: Word13.word) = x > x fun f (x: Word14.word) = x > x fun f (x: Word15.word) = x > x fun f (x: Word16.word) = x > x fun f (x: Word17.word) = x > x fun f (x: Word18.word) = x > x fun f (x: Word19.word) = x > x fun f (x: Word20.word) = x > x fun f (x: Word21.word) = x > x fun f (x: Word22.word) = x > x fun f (x: Word23.word) = x > x fun f (x: Word24.word) = x > x fun f (x: Word25.word) = x > x fun f (x: Word26.word) = x > x fun f (x: Word27.word) = x > x fun f (x: Word28.word) = x > x fun f (x: Word29.word) = x > x fun f (x: Word30.word) = x > x fun f (x: Word31.word) = x > x fun f (x: Word32.word) = x > x fun f (x: Word64.word) = x > x fun f (x: Real.real) = x > x fun f (x: Real32.real) = x > x fun f (x: Real64.real) = x > x fun f (x: LargeReal.real) = x > x fun f (x: Char.char) = x > x fun f (x: String.string) = x > x fun f (x: Int.int) = x >= x fun f (x: IntInf.int) = x >= x fun f (x: LargeInt.int) = x >= x fun f (x: FixedInt.int) = x >= x fun f (x: Position.int) = x >= x fun f (x: Int2.int) = x >= x fun f (x: Int3.int) = x >= x fun f (x: Int4.int) = x >= x fun f (x: Int5.int) = x >= x fun f (x: Int6.int) = x >= x fun f (x: Int7.int) = x >= x fun f (x: Int8.int) = x >= x fun f (x: Int9.int) = x >= x fun f (x: Int10.int) = x >= x fun f (x: Int11.int) = x >= x fun f (x: Int12.int) = x >= x fun f (x: Int13.int) = x >= x fun f (x: Int14.int) = x >= x fun f (x: Int15.int) = x >= x fun f (x: Int16.int) = x >= x fun f (x: Int17.int) = x >= x fun f (x: Int18.int) = x >= x fun f (x: Int19.int) = x >= x fun f (x: Int20.int) = x >= x fun f (x: Int21.int) = x >= x fun f (x: Int22.int) = x >= x fun f (x: Int23.int) = x >= x fun f (x: Int24.int) = x >= x fun f (x: Int25.int) = x >= x fun f (x: Int26.int) = x >= x fun f (x: Int27.int) = x >= x fun f (x: Int28.int) = x >= x fun f (x: Int29.int) = x >= x fun f (x: Int30.int) = x >= x fun f (x: Int31.int) = x >= x fun f (x: Int32.int) = x >= x fun f (x: Int64.int) = x >= x fun f (x: Word.word) = x >= x fun f (x: LargeWord.word) = x >= x fun f (x: SysWord.word) = x >= x fun f (x: Word2.word) = x >= x fun f (x: Word3.word) = x >= x fun f (x: Word4.word) = x >= x fun f (x: Word5.word) = x >= x fun f (x: Word6.word) = x >= x fun f (x: Word7.word) = x >= x fun f (x: Word8.word) = x >= x fun f (x: Word9.word) = x >= x fun f (x: Word10.word) = x >= x fun f (x: Word11.word) = x >= x fun f (x: Word12.word) = x >= x fun f (x: Word13.word) = x >= x fun f (x: Word14.word) = x >= x fun f (x: Word15.word) = x >= x fun f (x: Word16.word) = x >= x fun f (x: Word17.word) = x >= x fun f (x: Word18.word) = x >= x fun f (x: Word19.word) = x >= x fun f (x: Word20.word) = x >= x fun f (x: Word21.word) = x >= x fun f (x: Word22.word) = x >= x fun f (x: Word23.word) = x >= x fun f (x: Word24.word) = x >= x fun f (x: Word25.word) = x >= x fun f (x: Word26.word) = x >= x fun f (x: Word27.word) = x >= x fun f (x: Word28.word) = x >= x fun f (x: Word29.word) = x >= x fun f (x: Word30.word) = x >= x fun f (x: Word31.word) = x >= x fun f (x: Word32.word) = x >= x fun f (x: Word64.word) = x >= x fun f (x: Real.real) = x >= x fun f (x: Real32.real) = x >= x fun f (x: Real64.real) = x >= x fun f (x: LargeReal.real) = x >= x fun f (x: Char.char) = x >= x fun f (x: String.string) = x >= x mlton-20210117+dfsg/regression/args-create.ok000066400000000000000000000000041416264345000207300ustar00rootroot00000000000000OK! mlton-20210117+dfsg/regression/args-create.sml000066400000000000000000000016371416264345000211270ustar00rootroot00000000000000val tests = [ "\"hello\\\"", "c:\\foo.bah", "", "hi\\", "hi\"", "evil\narg", "evil\targ", "evil arg", "evil\rarg", "evil\farg", "\"bar\\", "\\bah", "bah \\bar", "bah\\bar", "bah\\\\", "ba h\\\\", "holy\"smoke", "holy \"smoke" ] val cmd = CommandLine.name () val args = CommandLine.arguments () fun loop ([], []) = print "OK!\n" | loop (x::r, y::s) = (if x <> y then print ("FAIL: "^x^":"^y^"\n") else (); loop (r, s)) | loop (_, _) = print "Wrong argument count\n" open MLton.Process val () = if List.length args = 0 then let val pid = create {args = (*cmd::*)tests, env = NONE, path = cmd, stderr = Param.self, stdin = Param.self, stdout = Param.self} val status = reap pid in () end else loop (tests, args) mlton-20210117+dfsg/regression/args-spawn.ok000066400000000000000000000000041416264345000206150ustar00rootroot00000000000000OK! mlton-20210117+dfsg/regression/args-spawn.sml000066400000000000000000000013761416264345000210140ustar00rootroot00000000000000val tests = [ "\"hello\\\"", "c:\\foo.bah", "", "hi\\", "hi\"", "evil\narg", "evil\targ", "evil arg", "evil\rarg", "evil\farg", "\"bar\\", "\\bah", "bah \\bar", "bah\\bar", "bah\\\\", "ba h\\\\", "holy\"smoke", "holy \"smoke" ] val cmd = CommandLine.name () val args = CommandLine.arguments () fun loop ([], []) = print "OK!\n" | loop (x::r, y::s) = (if x <> y then print ("FAIL: "^x^":"^y^"\n") else (); loop (r, s)) | loop (_, _) = print "Wrong argument count\n" open Posix.Process open MLton.Process val () = if List.length args = 0 then let val pid = spawn {path = cmd, args = cmd::tests} val status = waitpid (W_CHILD pid, []) in () end else loop (tests, args) mlton-20210117+dfsg/regression/array.ok000066400000000000000000000021361416264345000176610ustar00rootroot00000000000000Testing Array... test1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5a OK test5b OK test6a OK test6b OK test6c OK test7 OK test8a OK test8b OK test9 OK test9a OK test9b OK test9i OK test9j OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test11k OK test12a OK test12b OK test12c OK test12d OK test12e OK test13a OK test13b OK test13c OK test13d OK test13e OK test13f OK test13g OK test13h OK test13i OK test13j OK test13k OK test13l OK test13m OK test13n OK test14a OK test14b OK test15a OK test15b OK test15c OK test15d OK test15e OK test15f OK test15g OK test15h OK test16a OK test16b OK test16c OK test16d OK test16e OK test16f OK test16g OK mlton-20210117+dfsg/regression/array.sml000066400000000000000000000421721416264345000200470ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/array.sml -- some test cases for Array PS 1994-12-10, 1995-06-14, 1995-11-07 *) val _ = print "Testing Array...\n" local open Array infix 9 sub val array0 : int array = fromList [] fun extract (arr, s, l) = ArraySlice.vector (ArraySlice.slice (arr, s, l)) val copy = fn {src, si, len, dst, di} => ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun foldli f b (arr, s, l) = ArraySlice.foldli (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l)) fun foldri f b (arr, s, l) = ArraySlice.foldri (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l)) fun appi f (arr, s, l) = ArraySlice.appi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) fun modifyi f (arr, s, l) = ArraySlice.modifyi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) fun findi f (arr, s, l) = ArraySlice.findi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) in val a = fromList [1,11,21,31,41,51,61]; val b = fromList [441,551,661]; val c = fromList [1,11,21,31,41,51,61]; val test1 = tst' "test1" (fn () => a<>c); val test2 = tst' "test2" (fn () => array(0, 11) <> array0 andalso array(0,()) <> tabulate(0, fn _ => ()) andalso tabulate(0, fn _ => ()) <> fromList [] andalso fromList [] <> fromList [] andalso array(0, ()) <> array(0, ()) andalso tabulate(0, fn _ => ()) <> tabulate(0, fn _ => ())); val d = tabulate(100, fn i => i mod 7 * 10 + 1); val test3 = tst' "test3" (fn () => d sub 27 = 61); val test4a = tst0 "test4a" ((tabulate(maxLen+1, fn i => i) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG"); val test4b = tst0 "test4b" ((tabulate(~1, fn i => i) seq "WRONG") handle Size => "OK" | _ => "WRONG"); val test4c = tst' "test4c" (fn () => length (tabulate(0, fn i => i div 0)) = 0); val test5a = tst' "test5a" (fn () => length (fromList []) = 0 andalso length a = 7); val test5b = tst' "test5b" (fn () => length array0 = 0); val test6a = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6b = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6c = tst' "test6c" (fn () => c sub 0 = 1); val e = array(203, 0); val _ = (copy{src=d, si=0, dst=e, di=0, len=NONE}; copy{src=b, si=0, dst=e, di=length d, len=NONE}; copy{src=d, si=0, dst=e, di=length d + length b, len=NONE}); fun a2v a = extract(a, 0, NONE); val ev = Vector.concat [a2v d, a2v b, a2v d]; (* length e = 203 *) val test7 = tst' "test7" (fn () => length e = 203); val test8a = tst0 "test8a" ((update(e, ~1, 99) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test8b = tst0 "test8b" ((update(e, length e, 99) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val f = extract (e, 100, SOME 3); val test9 = tst' "test9" (fn () => f = a2v b); val test9a = tst' "test9a" (fn () => ev = extract(e, 0, SOME (length e)) andalso ev = extract(e, 0, NONE)); val test9b = tst' "test9b" (fn () => Vector.fromList [] = extract(e, 100, SOME 0)); val test9c = (extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9d = (extract(e, length e+1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9e = (extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9f = (extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9g = (extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9h = (extract(e, length e+1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9i = tst' "test9i" (fn () => a2v (fromList []) = extract(e, length e, SOME 0) andalso a2v (fromList []) = extract(e, length e, NONE)); val test9j = tst' "test9j" (fn () => extract(e, 3, SOME(length e - 3)) = extract(e, 3, NONE)); val _ = copy{src=e, si=0, dst=e, di=0, len=NONE}; val g = array(203, 9999999); val _ = copy{src=e, si=0, dst=g, di=0, len=NONE}; val test10a = tst' "test10a" (fn () => ev = extract(e, 0, SOME (length e)) andalso ev = extract(e, 0, NONE)); val test10b = tst' "test10b" (fn () => ev = extract(g, 0, SOME (length g)) andalso ev = extract(g, 0, NONE)); val _ = copy{src=g, si=203, dst=g, di=0, len=SOME 0}; val test10c = tst' "test10c" (fn () => ev = extract(g, 0, SOME (length g))); val _ = copy{src=g, si=0, dst=g, di=203, len=SOME 0}; val test10d = tst' "test10d" (fn () => ev = extract(g, 0, SOME (length g))); val _ = copy{src=g, si=0, dst=g, di=1, len=SOME (length g-1)}; val test10e = tst' "test10e" (fn () => a2v b = extract(g, 101, SOME 3)); val _ = copy{src=g, si=1, dst=g, di=0, len=SOME (length g-1)}; val test10f = tst' "test10f" (fn () => a2v b = extract(g, 100, SOME 3)); val _ = copy{src=g, si=202, dst=g, di=202, len=SOME 1}; val test10g = tst' "test10g" (fn () => g sub 202 = 10 * (202-1-103) mod 7 + 1); val test10h = tst' "test10h" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=SOME 0}; array0 <> array(0, 999999))); val test10i = tst' "test10i" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=NONE}; array0 <> array(0, 999999))); val test11a = tst0 "test11a" ((copy{src=g, si= ~1, dst=g, di=0, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11b = tst0 "test11b" ((copy{src=g, si=0, dst=g, di= ~1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11c = tst0 "test11c" ((copy{src=g, si=1, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11d = tst0 "test11d" ((copy{src=g, si=0, dst=g, di=1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e = tst0 "test11e" ((copy{src=g, si=203, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11f = tst0 "test11f" ((copy{src=g, si= ~1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g = tst0 "test11g" ((copy{src=g, si=0, dst=g, di= ~1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h = tst0 "test11h" ((copy{src=g, si=1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i = tst0 "test11i" ((copy{src=g, si=0, dst=g, di=1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j = tst0 "test11j" ((copy{src=g, si=0, dst=g, di=0, len=SOME (length g+1)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11k = tst0 "test11k" ((copy{src=g, si=203, dst=g, di=0, len=SOME 1}; "WRONG") handle Subscript => "OK" | _ => "WRONG") local val v = ref 0 fun setv c = v := c; fun addv c = v := c + !v; fun setvi (i, c) = v := c + i; fun addvi (i, c) = v := c + i + !v; fun cons (x,r) = x :: r fun consi (i,x,r) = (i,x) :: r val inplist = [7,9,13]; val inp = fromList inplist val pni = fromList (rev inplist) fun copyinp a = copy{src=inp, si=0, dst=a, di=0, len=NONE} in val array0 = fromList [] : int array; val test12a = tst' "test12a" (fn _ => foldl cons [1,2] array0 = [1,2] andalso foldl cons [1,2] inp = [13,9,7,1,2] andalso (foldl (fn (x, _) => setv x) () inp; !v = 13)); val test12b = tst' "test12b" (fn _ => foldr cons [1,2] array0 = [1,2] andalso foldr cons [1,2] inp = [7,9,13,1,2] andalso (foldr (fn (x, _) => setv x) () inp; !v = 7)); val test12c = tst' "test12c" (fn _ => find (fn _ => true) array0 = NONE andalso find (fn _ => false) inp = NONE andalso find (fn x => x=7) inp = SOME 7 andalso find (fn x => x=9) inp = SOME 9 andalso (setv 0; find (fn x => (addv x; x=9)) inp; !v = 7+9)); val test12d = tst' "test12d" (fn _ => (setv 117; app setv array0; !v = 117) andalso (setv 0; app addv inp; !v = 7+9+13) andalso (app setv inp; !v = 13)); val test12e = let val a = array(length inp, inp sub 0) in tst' "test12e" (fn _ => (modify (~ : int -> int) array0; true) andalso (copyinp a; modify ~ a; foldr (op::) [] a = map ~ inplist) andalso (setv 117; modify (fn x => (setv x; 37)) a; !v = ~13)) end val test13a = tst' "test13a" (fn _ => foldli consi [] (array0, 0, NONE) = [] andalso foldri consi [] (array0, 0, NONE) = [] andalso foldli consi [] (inp, 0, NONE) = [(2,13),(1,9),(0,7)] andalso foldri consi [] (inp, 0, NONE) = [(0,7),(1,9),(2,13)]) val test13b = tst' "test13b" (fn _ => foldli consi [] (array0, 0, SOME 0) = [] andalso foldri consi [] (array0, 0, SOME 0) = [] andalso foldli consi [] (inp, 0, SOME 0) = [] andalso foldri consi [] (inp, 0, SOME 0) = [] andalso foldli consi [] (inp, 3, SOME 0) = [] andalso foldri consi [] (inp, 3, SOME 0) = [] andalso foldli consi [] (inp, 0, SOME 3) = [(2,13),(1,9),(0,7)] andalso foldri consi [] (inp, 0, SOME 3) = [(0,7),(1,9),(2,13)] andalso foldli consi [] (inp, 0, SOME 2) = [(1,9),(0,7)] andalso foldri consi [] (inp, 0, SOME 2) = [(0,7),(1,9)] andalso foldli consi [] (inp, 1, SOME 2) = [(2,13),(1,9)] andalso foldri consi [] (inp, 1, SOME 2) = [(1,9),(2,13)] andalso foldli consi [] (inp, 2, SOME 1) = [(2,13)] andalso foldri consi [] (inp, 2, SOME 1) = [(2,13)]); val test13c = tst0 "test13c" ((foldli consi [] (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13d = tst0 "test13d" ((foldli consi [] (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13e = tst0 "test13e" ((foldli consi [] (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13f = tst0 "test13f" ((foldli consi [] (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13g = tst0 "test13g" ((foldli consi [] (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13h = tst0 "test13h" ((foldli consi [] (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13i = tst0 "test13i" ((foldri consi [] (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13j = tst0 "test13j" ((foldri consi [] (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13k = tst0 "test13k" ((foldri consi [] (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13l = tst0 "test13l" ((foldri consi [] (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13m = tst0 "test13m" ((foldri consi [] (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13n = tst0 "test13n" ((foldri consi [] (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test14a = tst' "test14a" (fn _ => findi (fn _ => true) (array0, 0, NONE) = NONE andalso findi (fn _ => false) (inp, 0, NONE) = NONE andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE) = SOME (1,9)); val test14b = tst' "test14b" (fn _ => findi (fn _ => true) (array0, 0, SOME 0) = NONE andalso findi (fn _ => false) (inp, 0, NONE) = NONE andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE) = SOME (1,9)); val test14c = (findi (fn _ => true) (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14d = (findi (fn _ => true) (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14e = (findi (fn _ => true) (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14f = (findi (fn _ => true) (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14g = (findi (fn _ => true) (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14h = (findi (fn _ => true) (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test15a = tst' "test15a" (fn _ => (setvi (0,117); appi setvi (array0, 0, NONE); !v = 117) andalso (setvi (0,0); appi addvi (inp, 0, NONE); !v = 0+7+1+9+2+13) andalso (appi setvi (inp, 0, NONE); !v = 2+13)); val test15b = tst' "test15b" (fn _ => (setvi (0,117); appi setvi (array0, 0, SOME 0); !v = 117) andalso (setvi (0,0); appi addvi (inp, 0, SOME 0); !v = 0) andalso (setvi (0,0); appi addvi (inp, 3, SOME 0); !v = 0) andalso (setvi (0,0); appi addvi (inp, 0, SOME 2); !v = 0+7+1+9) andalso (setvi (0,0); appi addvi (inp, 1, SOME 2); !v = 1+9+2+13) andalso (setvi (0,0); appi addvi (inp, 0, SOME 3); !v = 0+7+1+9+2+13) andalso (appi setvi (inp, 1, SOME 2); !v = 2+13) andalso (appi setvi (inp, 0, SOME 2); !v = 1+9) andalso (appi setvi (inp, 0, SOME 1); !v = 0+7) andalso (appi setvi (inp, 0, SOME 3); !v = 2+13)); val test15c = tst0 "test15c" ((appi setvi (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15d = tst0 "test15d" ((appi setvi (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15e = tst0 "test15e" ((appi setvi (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15f = tst0 "test15f" ((appi setvi (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15g = tst0 "test15g" ((appi setvi (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15h = tst0 "test15h" ((appi setvi (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16a = let val a = array(length inp, inp sub 0) in tst' "test16a" (fn _ => (modifyi (op +) (array0, 0, NONE); true) andalso (modifyi (op +) (array0, 0, SOME 0); true) andalso (copyinp a; modifyi (op -) (a, 0, SOME 0); foldr (op::) [] a = [7,9,13]) andalso (copyinp a; modifyi (op -) (a, 3, SOME 0); foldr (op::) [] a = [7,9,13]) andalso (copyinp a; modifyi (op -) (a, 0, NONE); foldr (op::) [] a = [~7,~8,~11]) andalso (copyinp a; modifyi (op -) (a, 0, SOME 3); foldr (op::) [] a = [~7,~8,~11]) andalso (copyinp a; modifyi (op -) (a, 0, SOME 2); foldr (op::) [] a = [~7,~8,13]) andalso (copyinp a; modifyi (op -) (a, 1, SOME 2); foldr (op::) [] a = [7,~8,~11]) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, NONE); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 3); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 1, SOME 2); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 2); !v = 1+9) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 0); !v = 117) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 3, SOME 0); !v = 117)) end val test16b = tst0 "test16b" ((modifyi (op+) (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16c = tst0 "test16c" ((modifyi (op+) (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16d = tst0 "test16d" ((modifyi (op+) (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16e = tst0 "test16e" ((modifyi (op+) (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16f = tst0 "test16f" ((modifyi (op+) (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16g = tst0 "test16g" ((modifyi (op+) (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); end end mlton-20210117+dfsg/regression/array2.ok000066400000000000000000000004041416264345000177370ustar00rootroot00000000000000(0, 0, 1) (0, 1, 2) (0, 2, 3) (0, 3, 4) (1, 0, 5) (1, 1, 6) (1, 2, 7) (1, 3, 8) (2, 0, 9) (2, 1, 10) (2, 2, 11) (2, 3, 12) (0, 0, 13) (1, 0, 14) (2, 0, 15) (0, 1, 16) (1, 1, 17) (2, 1, 18) (0, 2, 19) (1, 2, 20) (2, 2, 21) (0, 3, 22) (1, 3, 23) (2, 3, 24) OKOK mlton-20210117+dfsg/regression/array2.sml000066400000000000000000000011661416264345000201270ustar00rootroot00000000000000open Array2 val x = ref 0 val i2s = Int.toString fun test trv = let val a = tabulate trv (3, 4, fn (r, c) => (x := !x + 1 ; concat["(", i2s r, ", ", i2s c, ", ", i2s(!x), ")"])) val _ = app trv (fn s => (print s; print "\n")) a in () end val _ = (test RowMajor; test ColMajor) (* Check that Size is correctly raised when constructing large arrays. *) val m = valOf Int.maxInt val _ = (array (m, 2, 13) ; print "FAIL") handle Size => print "OK" val _ = (tabulate RowMajor (m, 2, fn _ => 13) ; print "FAIL") handle Size => print "OK\n" mlton-20210117+dfsg/regression/array3.ok000066400000000000000000000000001416264345000177300ustar00rootroot00000000000000mlton-20210117+dfsg/regression/array3.sml000066400000000000000000000003321416264345000201220ustar00rootroot00000000000000open Array val a = array (1000, 0) fun g i = (update (a, i, i); g (i + 1)) fun f i = if i = 100 then g i else (update (a, i, 0); f (i + 1)) val _ = f 0 handle Subscript => () val _ = sub (a, 0) + 1 mlton-20210117+dfsg/regression/array4.ok000066400000000000000000000000001416264345000177310ustar00rootroot00000000000000mlton-20210117+dfsg/regression/array4.sml000066400000000000000000000002401416264345000201210ustar00rootroot00000000000000fun f n = if 0 = Array.sub (Array.tabulate (n, fn i => i), 0) then () else f 13 val _ = (f 0; raise Fail "bug") handle Subscript => () val _ = f 1 mlton-20210117+dfsg/regression/array5.ok000066400000000000000000000002451416264345000177450ustar00rootroot0000000000000013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 1 4 7 2 5 8 3 6 9 mlton-20210117+dfsg/regression/array5.sml000066400000000000000000000021341416264345000201260ustar00rootroot00000000000000open Array2 fun printa a = let val (rows, cols) = dimensions a fun loopRows r = if r = rows then () else (let fun loopCols c = if c = cols then () else (print(Int.toString(sub(a, r, c))) ; print " " ; loopCols(c + 1)) in loopCols 0 end; print "\n"; loopRows(r + 1)) in loopRows 0 end val a1 = array(4, 5, 13) val _ = (printa a1; modifyi RowMajor (fn (x, y, _) => x + y) {base = a1, row = 0, col = 0, nrows = NONE, ncols = NONE}; printa a1) val a2 = fromList[[1, 2], [3, 4], [5, 6]] val _ = printa a2 fun bogus l = (fromList l; false) handle Size => true val _ = (bogus[[1], [2, 3]]; bogus[[], [1]]) val a3 = let val r = ref 0 in tabulate RowMajor (3, 3, fn _ => (r := !r + 1 ; !r)) end val _ = printa a3 val a4 = let val r = ref 0 in tabulate ColMajor (3, 3, fn _ => (r := !r + 1 ; !r)) end val _ = printa a4 mlton-20210117+dfsg/regression/array6.ok000066400000000000000000000000001416264345000177330ustar00rootroot00000000000000mlton-20210117+dfsg/regression/array6.sml000066400000000000000000000061151416264345000201320ustar00rootroot00000000000000(* Test various basis library functions. Quite incomplete. This program should terminate without raising an exception and without printing anything if no bugs are discovered. If a bug is discovered, "assertion failed:" will be printed, followed by a string uniquely identifying the bug. *) fun assert (msg,b) = ((*print (concat ["trying " ^ msg ^ "\n"]);*) if b then () else print ("assertion failed: " ^ msg ^ "\n")) (*------------------------------------------------------------------*) (* Array *) (*------------------------------------------------------------------*) local open Array fun extract (arr, s, l) = ArraySlice.vector (ArraySlice.slice (arr, s, l)) val copy = fn {src, si, len, dst, di} => ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun appi f (arr, s, l) = ArraySlice.appi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) val a0 = array (0,()) val a1 = array (100,1) val a2 = fromList [0,1,2] val a3 = tabulate (13, fn x => x) val _ = update (a3,11,9) val v1 = extract (a3, 0, NONE) val v2 = extract (a3, 1, SOME 3) val a4 = array (10,47) val _ = copy {src = a3, si = 10, len = SOME 3, dst = a4, di = 1} val a5 = array (100, 0) val _ = appi (fn (i,_) => update (a5,i,i)) (a5, 0, NONE) val _ = List.app assert [("Array.length 0", length a0 = 0), ("Array.length 1", length a1 = 100), ("Array.length 2", length a2 = 3), ("Array.length 3", length a3 = 13), ("Array.sub 1", sub (a1, 50) = 1), ("Array.sub 2", sub (a2, 2) = 2), ("Array.sub 3a", sub (a3, 10) = 10), ("Array.sub 3b", sub (a3, 11) = 9), ("Vector.length 1", Vector.length v1 = 13), ("Vector.length 2", Vector.length v2 = 3), ("Vector.sub 1", sub (a4, 1) = sub (a3, 10)), ("Vector.sub 2", sub (a4, 2) = sub (a3, 11)), ("Vector.sub 3", sub (a4, 3) = sub (a3, 12)), ("Vector.sub 4", sub (a5, 50) = 50)] fun swap (a,i,j) = let val t = sub (a,i) in update (a, i, sub (a,j)) ; update (a, j, t) end fun bubbleSort (a, op <) = let val n = length a fun loop i = if i = n then () else (let fun loop j = if j = 0 then () else if sub (a,j) < sub (a,j-1) then (swap (a,j,j-1) ; loop (j-1)) else () in loop i end ; loop (i+1)) in loop 0 end fun isSorted (a, op <=) = let val max = length a - 1 fun loop i = i = max orelse (sub (a, i) <= sub (a, i + 1) andalso loop (i + 1)) in loop 0 end val size = 2000 val a = tabulate (size, fn i => size - i) val _ = bubbleSort (a, op <) val _ = assert ("bubbleSort", isSorted (a, op <=)) in end mlton-20210117+dfsg/regression/array7.ok000066400000000000000000000000001416264345000177340ustar00rootroot00000000000000mlton-20210117+dfsg/regression/array7.sml000066400000000000000000000004741416264345000201350ustar00rootroot00000000000000(* This program tests the implementation of arrays whose length is important but * whose elements aren't. *) open Array val a = array (2, #"a") val _ = update (a, 0, #"b") val n = if sub (a, 0) = #"b" then 2 else 1 val _ = if 2 = length (array (n, 13)) then () else raise Fail "bug" mlton-20210117+dfsg/regression/asterisk.ok000066400000000000000000000000001416264345000203540ustar00rootroot00000000000000mlton-20210117+dfsg/regression/asterisk.sml000066400000000000000000000001301416264345000205420ustar00rootroot00000000000000(* asterisk.sml *) (* Checks parsing of "* )". *) val op* : int * int -> int = (op*); mlton-20210117+dfsg/regression/basis-sharing.sml000066400000000000000000000345131416264345000214630ustar00rootroot00000000000000val id = fn x => x val _ = fn () => (() ; id: 'a Array.array -> 'a array ; id: 'a Array.vector -> 'a vector ; id: BinIO.StreamIO.elem -> Word8.word ; id: BinIO.StreamIO.pos -> BinPrimIO.pos ; id: BinIO.StreamIO.reader -> BinPrimIO.reader ; id: BinIO.StreamIO.vector -> Word8Vector.vector ; id: BinIO.StreamIO.writer -> BinPrimIO.writer ; id: BinPrimIO.array -> Word8Array.array ; id: BinPrimIO.elem -> Word8.word ; id: BinPrimIO.pos -> Position.int ; id: BinPrimIO.vector -> Word8Vector.vector ; id: Bool.bool -> bool ; id: BoolArray.elem -> Bool.bool ; id: BoolArray.vector -> BoolVector.vector ; id: BoolArray2.elem -> Bool.bool ; id: BoolArray2.vector -> BoolVector.vector ; id: BoolArraySlice.array -> BoolArray.array ; id: BoolArraySlice.elem -> Bool.bool ; id: BoolArraySlice.vector -> BoolVector.vector ; id: BoolArraySlice.vector_slice -> BoolVectorSlice.slice ; id: BoolVector.elem -> Bool.bool ; id: BoolVectorSlice.elem -> BoolVector.elem ; id: BoolVectorSlice.vector -> BoolVector.vector ; id: Char.char -> char ; id: Char.string -> String.string ; id: CharArray.elem -> Char.char ; id: CharArray.vector -> CharVector.vector ; id: CharArray2.elem -> Char.char ; id: CharArray2.vector -> CharVector.vector ; id: CharArraySlice.array -> CharArray.array ; id: CharArraySlice.elem -> Char.char ; id: CharArraySlice.vector -> CharVector.vector ; id: CharArraySlice.vector_slice -> CharVectorSlice.slice ; id: CharVector.elem -> Char.char ; id: CharVector.vector -> String.string ; id: CharVectorSlice.elem -> char ; id: CharVectorSlice.slice -> Substring.substring ; id: CharVectorSlice.vector -> String.string ; id: General.exn -> exn ; id: INetSock.dgram_sock -> Socket.dgram INetSock.sock ; id: INetSock.sock_addr -> INetSock.inet Socket.sock_addr ; id: 'sock_type INetSock.sock -> (INetSock.inet, 'sock_type) Socket.sock ; id: 'mode INetSock.stream_sock -> 'mode Socket.stream INetSock.sock ; id: Int16Array.elem -> Int16.int ; id: Int16Array.vector -> Int16Vector.vector ; id: Int16Array2.elem -> Int16.int ; id: Int16Array2.vector -> Int16Vector.vector ; id: Int16ArraySlice.array -> Int16Array.array ; id: Int16ArraySlice.elem -> Int16.int ; id: Int16ArraySlice.vector -> Int16Vector.vector ; id: Int16ArraySlice.vector_slice -> Int16VectorSlice.slice ; id: Int16Vector.elem -> Int16.int ; id: Int16VectorSlice.elem -> Int16Vector.elem ; id: Int16VectorSlice.vector -> Int16Vector.vector ; id: Int32Array.elem -> Int32.int ; id: Int32Array.vector -> Int32Vector.vector ; id: Int32Array2.elem -> Int32.int ; id: Int32Array2.vector -> Int32Vector.vector ; id: Int32ArraySlice.array -> Int32Array.array ; id: Int32ArraySlice.elem -> Int32.int ; id: Int32ArraySlice.vector -> Int32Vector.vector ; id: Int32ArraySlice.vector_slice -> Int32VectorSlice.slice ; id: Int32Vector.elem -> Int32.int ; id: Int32VectorSlice.elem -> Int32Vector.elem ; id: Int32VectorSlice.vector -> Int32Vector.vector ; id: Int64Array.elem -> Int64.int ; id: Int64Array.vector -> Int64Vector.vector ; id: Int64Array2.elem -> Int64.int ; id: Int64Array2.vector -> Int64Vector.vector ; id: Int64ArraySlice.array -> Int64Array.array ; id: Int64ArraySlice.elem -> Int64.int ; id: Int64ArraySlice.vector -> Int64Vector.vector ; id: Int64ArraySlice.vector_slice -> Int64VectorSlice.slice ; id: Int64Vector.elem -> Int64.int ; id: Int64VectorSlice.elem -> Int64Vector.elem ; id: Int64VectorSlice.vector -> Int64Vector.vector ; id: Int8Array.elem -> Int8.int ; id: Int8Array.vector -> Int8Vector.vector ; id: Int8Array2.elem -> Int8.int ; id: Int8Array2.vector -> Int8Vector.vector ; id: Int8ArraySlice.array -> Int8Array.array ; id: Int8ArraySlice.elem -> Int8.int ; id: Int8ArraySlice.vector -> Int8Vector.vector ; id: Int8ArraySlice.vector_slice -> Int8VectorSlice.slice ; id: Int8Vector.elem -> Int8.int ; id: Int8VectorSlice.elem -> Int8Vector.elem ; id: Int8VectorSlice.vector -> Int8Vector.vector ; id: IntArray.elem -> Int.int ; id: IntArray.vector -> IntVector.vector ; id: IntArray2.elem -> Int.int ; id: IntArray2.vector -> IntVector.vector ; id: IntArraySlice.array -> IntArray.array ; id: IntArraySlice.elem -> Int.int ; id: IntArraySlice.vector -> IntVector.vector ; id: IntArraySlice.vector_slice -> IntVectorSlice.slice ; id: IntVector.elem -> Int.int ; id: IntVectorSlice.elem -> IntVector.elem ; id: IntVectorSlice.vector -> IntVector.vector ; id: LargeIntArray.elem -> LargeInt.int ; id: LargeIntArray.vector -> LargeIntVector.vector ; id: LargeIntArray2.elem -> LargeInt.int ; id: LargeIntArray2.vector -> LargeIntVector.vector ; id: LargeIntArraySlice.array -> LargeIntArray.array ; id: LargeIntArraySlice.elem -> LargeInt.int ; id: LargeIntArraySlice.vector -> LargeIntVector.vector ; id: LargeIntArraySlice.vector_slice -> LargeIntVectorSlice.slice ; id: LargeIntVector.elem -> LargeInt.int ; id: LargeIntVectorSlice.elem -> LargeIntVector.elem ; id: LargeIntVectorSlice.vector -> LargeIntVector.vector ; id: LargeRealArray.elem -> LargeReal.real ; id: LargeRealArray.vector -> LargeRealVector.vector ; id: LargeRealArray2.elem -> LargeReal.real ; id: LargeRealArray2.vector -> LargeRealVector.vector ; id: LargeRealArraySlice.array -> LargeRealArray.array ; id: LargeRealArraySlice.elem -> LargeReal.real ; id: LargeRealArraySlice.vector -> LargeRealVector.vector ; id: LargeRealArraySlice.vector_slice -> LargeRealVectorSlice.slice ; id: LargeRealVector.elem -> LargeReal.real ; id: LargeRealVectorSlice.elem -> LargeRealVector.elem ; id: LargeRealVectorSlice.vector -> LargeRealVector.vector ; id: LargeWordArray.elem -> LargeWord.word ; id: LargeWordArray.vector -> LargeWordVector.vector ; id: LargeWordArray2.elem -> LargeWord.word ; id: LargeWordArray2.vector -> LargeWordVector.vector ; id: LargeWordArraySlice.array -> LargeWordArray.array ; id: LargeWordArraySlice.elem -> LargeWord.word ; id: LargeWordArraySlice.vector -> LargeWordVector.vector ; id: LargeWordArraySlice.vector_slice -> LargeWordVectorSlice.slice ; id: LargeWordVector.elem -> LargeWord.word ; id: LargeWordVectorSlice.elem -> LargeWordVector.elem ; id: LargeWordVectorSlice.vector -> LargeWordVector.vector ; id: 'a List.list -> 'a list ; id: Math.real -> Real.real ; id: 'a Option.option -> 'a option ; id: PackReal32Big.real -> Real32.real ; id: PackReal32Little.real -> Real32.real ; id: PackReal64Big.real -> Real64.real ; id: PackReal64Little.real -> Real64.real ; id: PackRealBig.real -> Real.real ; id: PackRealLittle.real -> Real.real ; id: Posix.Error.syserror -> OS.syserror ; id: Posix.FileSys.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.FileSys.gid -> Posix.ProcEnv.gid ; id: Posix.FileSys.uid -> Posix.ProcEnv.uid ; id: Posix.IO.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.IO.open_mode -> Posix.FileSys.open_mode ; id: Posix.IO.pid -> Posix.Process.pid ; id: Posix.ProcEnv.pid -> Posix.Process.pid ; id: Posix.Process.signal -> Posix.Signal.signal ; id: Posix.SysDB.gid -> Posix.ProcEnv.gid ; id: Posix.SysDB.uid -> Posix.ProcEnv.uid ; id: Posix.TTY.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.TTY.pid -> Posix.Process.pid ; id: Real.real -> real ; id: Real32Array.elem -> Real32.real ; id: Real32Array.vector -> Real32Vector.vector ; id: Real32Array2.elem -> Real32.real ; id: Real32Array2.vector -> Real32Vector.vector ; id: Real32ArraySlice.array -> Real32Array.array ; id: Real32ArraySlice.elem -> Real32.real ; id: Real32ArraySlice.vector -> Real32Vector.vector ; id: Real32ArraySlice.vector_slice -> Real32VectorSlice.slice ; id: Real32Vector.elem -> Real32.real ; id: Real32VectorSlice.elem -> Real32Vector.elem ; id: Real32VectorSlice.vector -> Real32Vector.vector ; id: Real64Array.elem -> Real64.real ; id: Real64Array.vector -> Real64Vector.vector ; id: Real64Array2.elem -> Real64.real ; id: Real64Array2.vector -> Real64Vector.vector ; id: Real64ArraySlice.array -> Real64Array.array ; id: Real64ArraySlice.elem -> Real64.real ; id: Real64ArraySlice.vector -> Real64Vector.vector ; id: Real64ArraySlice.vector_slice -> Real64VectorSlice.slice ; id: Real64Vector.elem -> Real64.real ; id: Real64VectorSlice.elem -> Real64Vector.elem ; id: Real64VectorSlice.vector -> Real64Vector.vector ; id: RealArray.elem -> Real.real ; id: RealArray.vector -> RealVector.vector ; id: RealArray2.elem -> Real.real ; id: RealArray2.vector -> RealVector.vector ; id: RealArraySlice.array -> RealArray.array ; id: RealArraySlice.elem -> Real.real ; id: RealArraySlice.vector -> RealVector.vector ; id: RealArraySlice.vector_slice -> RealVectorSlice.slice ; id: RealVector.elem -> Real.real ; id: RealVectorSlice.elem -> RealVector.elem ; id: RealVectorSlice.vector -> RealVector.vector ; id: String.char -> Char.char ; id: String.string -> CharVector.vector ; id: String.string -> string ; id: Substring.char -> Char.char ; id: Substring.string -> String.string ; id: Substring.substring -> CharVectorSlice.slice ; id: Text.Char.char -> Char.char ; id: Text.Char.char -> Text.CharArray.elem ; id: Text.Char.char -> Text.CharArraySlice.elem ; id: Text.Char.char -> Text.CharVector.elem ; id: Text.Char.char -> Text.CharVectorSlice.elem ; id: Text.Char.char -> Text.String.char ; id: Text.Char.char -> Text.Substring.char ; id: Text.Char.string -> Text.CharArray.vector ; id: Text.Char.string -> Text.CharArraySlice.vector ; id: Text.Char.string -> Text.CharVector.vector ; id: Text.Char.string -> Text.CharVectorSlice.vector ; id: Text.Char.string -> Text.String.string ; id: Text.Char.string -> Text.Substring.string ; id: Text.CharArray.array -> CharArray.array ; id: Text.CharArray.array -> Text.CharArraySlice.array ; id: Text.CharArraySlice.array -> Text.CharArray.array ; id: Text.CharArraySlice.slice -> CharArraySlice.slice ; id: Text.CharArraySlice.vector_slice -> Text.CharVectorSlice.slice ; id: Text.CharVector.vector -> CharVector.vector ; id: Text.CharVectorSlice.slice -> CharVectorSlice.slice ; id: Text.CharVectorSlice.slice -> Text.CharArraySlice.vector_slice ; id: Text.String.string -> String.string ; id: Text.Substring.substring -> Substring.substring ; id: TextIO.StreamIO.pos -> TextPrimIO.pos ; id: TextIO.StreamIO.reader -> TextPrimIO.reader ; id: TextIO.StreamIO.writer -> TextPrimIO.writer ; id: TextPrimIO.array -> CharArray.array ; id: TextPrimIO.elem -> Char.char ; id: TextPrimIO.vector -> CharVector.vector ; id: UnixSock.dgram_sock -> Socket.dgram UnixSock.sock ; id: UnixSock.sock_addr -> UnixSock.unix Socket.sock_addr ; id: 'sock_type UnixSock.sock -> (UnixSock.unix, 'sock_type) Socket.sock ; id: 'mode UnixSock.stream_sock -> 'mode Socket.stream UnixSock.sock ; id: 'a Vector.vector -> 'a vector ; id: Word.word -> word ; id: Word16Array.elem -> Word16.word ; id: Word16Array.vector -> Word16Vector.vector ; id: Word16Array2.elem -> Word16.word ; id: Word16Array2.vector -> Word16Vector.vector ; id: Word16ArraySlice.array -> Word16Array.array ; id: Word16ArraySlice.elem -> Word16.word ; id: Word16ArraySlice.vector -> Word16Vector.vector ; id: Word16ArraySlice.vector_slice -> Word16VectorSlice.slice ; id: Word16Vector.elem -> Word16.word ; id: Word16VectorSlice.elem -> Word16Vector.elem ; id: Word16VectorSlice.vector -> Word16Vector.vector ; id: Word32Array.elem -> Word32.word ; id: Word32Array.vector -> Word32Vector.vector ; id: Word32Array2.elem -> Word32.word ; id: Word32Array2.vector -> Word32Vector.vector ; id: Word32ArraySlice.array -> Word32Array.array ; id: Word32ArraySlice.elem -> Word32.word ; id: Word32ArraySlice.vector -> Word32Vector.vector ; id: Word32ArraySlice.vector_slice -> Word32VectorSlice.slice ; id: Word32Vector.elem -> Word32.word ; id: Word32VectorSlice.elem -> Word32Vector.elem ; id: Word32VectorSlice.vector -> Word32Vector.vector ; id: Word64Array.elem -> Word64.word ; id: Word64Array.vector -> Word64Vector.vector ; id: Word64Array2.elem -> Word64.word ; id: Word64Array2.vector -> Word64Vector.vector ; id: Word64ArraySlice.array -> Word64Array.array ; id: Word64ArraySlice.elem -> Word64.word ; id: Word64ArraySlice.vector -> Word64Vector.vector ; id: Word64ArraySlice.vector_slice -> Word64VectorSlice.slice ; id: Word64Vector.elem -> Word64.word ; id: Word64VectorSlice.elem -> Word64Vector.elem ; id: Word64VectorSlice.vector -> Word64Vector.vector ; id: Word8Array.elem -> Word8.word ; id: Word8Array.vector -> Word8Vector.vector ; id: Word8Array2.elem -> Word8.word ; id: Word8Array2.vector -> Word8Vector.vector ; id: Word8ArraySlice.array -> Word8Array.array ; id: Word8ArraySlice.elem -> Word8.word ; id: Word8ArraySlice.vector -> Word8Vector.vector ; id: Word8ArraySlice.vector_slice -> Word8VectorSlice.slice ; id: Word8Vector.elem -> Word8.word ; id: Word8VectorSlice.elem -> Word8Vector.elem ; id: Word8VectorSlice.vector -> Word8Vector.vector ; id: WordArray.elem -> Word.word ; id: WordArray.vector -> WordVector.vector ; id: WordArray2.elem -> Word.word ; id: WordArray2.vector -> WordVector.vector ; id: WordArraySlice.array -> WordArray.array ; id: WordArraySlice.elem -> Word.word ; id: WordArraySlice.vector -> WordVector.vector ; id: WordArraySlice.vector_slice -> WordVectorSlice.slice ; id: WordVector.elem -> Word.word ; id: WordVectorSlice.elem -> WordVector.elem ; id: WordVectorSlice.vector -> WordVector.vector (* ; id: WideChar.string -> WideString.string * ; id: WideCharArray.elem -> WideChar.char * ; id: WideCharArray.vector -> WideCharVector.vector * ; id: WideCharArray2.elem -> WideChar.char * ; id: WideCharArray2.vector -> WideCharVector.vector * ; id: WideCharArraySlice.array -> WideCharArray.array * ; id: WideCharArraySlice.elem -> WideChar.char * ; id: WideCharArraySlice.vector -> WideCharVector.vector * ; id: WideCharArraySlice.vector_slice -> WideCharVectorSlice.slice * ; id: WideCharVector.elem -> WideChar.char * ; id: WideCharVector.vector -> WideString.string * ; id: WideCharVectorSlice.elem -> WideCharVector.elem * ; id: WideCharVectorSlice.vector -> WideCharVector.vector * ; id: WideString.string -> WideCharVector.vector * ; id: WideString.type char -> WideChar.char * ; id: WideSubstring.char -> WideChar.char * ; id: WideSubstring.string -> WideString.string * ; id: WideSubstring.substring -> WideCharVectorSlice.slice * ; id: WideText.Char.char -> WideChar.char * ; id: WideText.CharArray.array -> WideCharArray.array * ; id: WideText.CharArraySlice.slice -> WideCharArraySlice.slice * ; id: WideText.CharVector.vector -> WideCharVector.vector * ; id: WideText.CharVectorSlice.slice -> WideCharVectorSlice.slice * ; id: WideText.String.string -> WideString.string * ; id: WideText.Substring.substring -> WideSubstring.substring * ; id: WideTextPrimIO.array -> WideCharArray.array * ; id: WideTextPrimIO.elem -> WideChar.char * ; id: WideTextPrimIO.vector -> WideCharVector.vector *) ) mlton-20210117+dfsg/regression/big-array.ok000066400000000000000000000000031416264345000204070ustar00rootroot00000000000000OK mlton-20210117+dfsg/regression/big-array.sml000066400000000000000000000001551416264345000206010ustar00rootroot00000000000000open Array val a'' = tabulate (1000000, fn i => i) val _ = sub (a'', 0) + sub (a'', 1) val _ = print "OK\n" mlton-20210117+dfsg/regression/binio.ok000066400000000000000000000002371416264345000176430ustar00rootroot00000000000000basic test of writing and reading back all characters done test of writing files of all possible characters in strings of lengths 0-256 finished test finished mlton-20210117+dfsg/regression/binio.sml000066400000000000000000000026101416264345000200220ustar00rootroot00000000000000val filename = OS.FileSys.tmpName () fun testRange (start, length) = let val allChars = Word8Vector.tabulate(length, fn i => Word8.fromInt ((i + start) mod 256)) val outStr = BinIO.openOut filename val _ = BinIO.output (outStr, allChars) val _ = BinIO.closeOut outStr val inStr = BinIO.openIn filename val readChars = BinIO.inputAll inStr val _ = BinIO.closeIn inStr val _ = OS.FileSys.remove filename fun testCharF (c, cnt) = let val readC = Word8Vector.sub(readChars, cnt) val _ = if c = readC then () else print ("Error at index: " ^ (Int.toString cnt) ^ ": " ^ (Word8.toString c) ^ " <> " ^ (Word8.toString readC) ^ "\n") in cnt + 1 end val _ = Word8Vector.foldl testCharF 0 allChars in () end val _ = testRange (0, 256) val _ = print "basic test of writing and reading back all characters done\n" val _ = List.tabulate(256, fn i => List.tabulate(257, fn i2 => testRange (i, i2))) val _ = print "test of writing files of all possible characters in strings of lengths 0-256 finished\n" val _ = List.tabulate(6, fn i => List.tabulate(5000, fn i2 => testRange (i, i2))) val _ = print "test finished\n" mlton-20210117+dfsg/regression/bool-triple.ok000066400000000000000000000000061416264345000207650ustar00rootroot00000000000000false mlton-20210117+dfsg/regression/bool-triple.sml000066400000000000000000000003561416264345000211570ustar00rootroot00000000000000val a = Array.array (100, (true, false, true)) val _ = Array.update (a, 0, (false, true, false)) val b = Array.sub (a, 0) = Array.sub (a, 1) andalso Array.sub (a, 2) = Array.sub (a, 3) val _ = print (concat [Bool.toString b, "\n"]) mlton-20210117+dfsg/regression/bytechar.ok000066400000000000000000000015711416264345000203460ustar00rootroot00000000000000 File bytechar.sml: Testing structures Byte and Char... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test10j OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test18 OK test19 OK test20 OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK test31 OK test32 OK test33 OK test34a OK test34b OK test35a OK test35b OK test36 OK test37 OK test38 OK test39 OK test40 OK test41 OK test42 OK test43 OK mlton-20210117+dfsg/regression/bytechar.sml000066400000000000000000000333631416264345000205340ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") (* handle _ => "EXN" *); fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/bytechar.sml -- test cases for Byte and Char, suitable for ASCII PS 1994-12-10, 1995-05-11, 1995-11-10, 1996-09-30 *) (*KILL 05/11/1997 10:55. tho.: use "auxil.sml"; *) val _ = print "\nFile bytechar.sml: Testing structures Byte and Char...\n" local in val test1 = tstrange "test1" (0,255) (fn i => (Word8.toInt o Byte.charToByte o Byte.byteToChar o Word8.fromInt) i = i); val test2 = tstrange "test2" (0,Char.maxOrd) (fn i => (Word8.toInt o Byte.charToByte o Char.chr) i = i); val test3 = tstrange "test3" (0,255) (fn i => (Char.ord o Byte.byteToChar o Word8.fromInt) i = i); val test4 = tstrange "test4" (0, Char.maxOrd) (fn i => (Char.ord o Char.chr) i = i); val test5 = tst0 "test5" ((Char.chr ~1 seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test6 = tst0 "test6" ((Char.chr (Char.maxOrd+1) seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test7 = tst "test7" ("" = Byte.bytesToString (Word8Vector.fromList [])); val test8 = tst "test8" ("ABDC" = (Byte.bytesToString o Word8Vector.fromList o map Word8.fromInt) [65, 66, 68, 67]); val unpackString = Byte.unpackString o Word8ArraySlice.slice val test9 = tst "test9" ("" = unpackString (Word8Array.fromList [], 0, SOME 0)) local val arr = Word8Array.tabulate(10, fn i => Word8.fromInt(i+65)) in val test10a = tst "test10a" ("" = unpackString(arr, 0, SOME 0)); val test10b = tst "test10b" ("" = unpackString(arr, 10, SOME 0) andalso "" = unpackString(arr, 10, NONE)); val test10c = tst "test10c" ("BCDE" = unpackString(arr, 1, SOME 4)); val test10d = tst0 "test10d" ((unpackString(arr, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10e = tst0 "test10e" ((unpackString(arr, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10f = tst0 "test10f" ((unpackString(arr, 0, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10g = tst0 "test10g" ((unpackString(arr, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10h = tst0 "test10h" ((unpackString(arr, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10i = tst0 "test10i" ((unpackString(arr, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10j = tst0 "test10j" ((unpackString(arr, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end val unpackStringVec = Byte.unpackStringVec o Word8VectorSlice.slice local val vec = Word8Vector.tabulate(10, fn i => Word8.fromInt(i+65)) in val test11a = tst "test11a" ("" = unpackStringVec(vec, 0, SOME 0)); val test11b = tst "test11b" ("" = unpackStringVec(vec, 10, SOME 0) andalso "" = unpackStringVec(vec, 10, NONE)); val test11c = tst "test11c" ("BCDE" = unpackStringVec(vec, 1, SOME 4)); val test11d = tst0 "test11d" ((unpackStringVec(vec, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e = tst0 "test11e" ((unpackStringVec(vec, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11f = tst0 "test11f" ((unpackStringVec(vec, 0, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g = tst0 "test11g" ((unpackStringVec(vec, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h = tst0 "test11h" ((unpackStringVec(vec, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i = tst0 "test11i" ((unpackStringVec(vec, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j = tst0 "test11j" ((unpackStringVec(vec, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end val test18 = tst "test18" (not (Char.contains "" (Char.chr 65)) andalso not (Char.contains "aBCDE" (Char.chr 65)) andalso (Char.contains "ABCD" (Char.chr 67)) andalso not (Char.contains "" #"\000") andalso not (Char.contains "" #"\255") andalso not (Char.contains "azAZ09" #"\000") andalso not (Char.contains "azAZ09" #"\255")); val test19 = tst "test19" (Char.notContains "" (Char.chr 65) andalso Char.notContains "aBCDE" (Char.chr 65) andalso not (Char.notContains "ABCD" (Char.chr 67)) andalso Char.notContains "" #"\000" andalso Char.notContains "" #"\255" andalso Char.notContains "azAZ09" #"\000" andalso Char.notContains "azAZ09" #"\255"); val test20 = tst "test20" (Char.ord Char.maxChar = Char.maxOrd); local fun mycontains s c = let val stop = String.size s fun h i = i < stop andalso (c = String.sub(s, i) orelse h(i+1)) in h 0 end; (* Check that p(c) = (mycontains s c) for all characters: *) fun equivalent p s = let fun h n = n > 255 orelse (p (chr n) = mycontains s (chr n)) andalso h(n+1) in h 0 end fun checkset p s = tst' "checkset" (fn _ => equivalent p s); val graphchars = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\ \[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; val ascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val lowerascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val upperascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\127" val allchars = let fun h 0 res = chr 0 :: res | h n res = h (n-1) (chr n :: res) in h 255 [] end open Char in val test21 = checkset isLower "abcdefghijklmnopqrstuvwxyz"; val test22 = checkset isUpper "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test23 = checkset isDigit "0123456789"; val test24 = checkset isAlpha "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test25 = checkset isHexDigit "0123456789abcdefABCDEF"; val test26 = checkset isAlphaNum "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test27 = checkset isPrint (" " ^ graphchars) val test28 = checkset isSpace " \009\010\011\012\013"; val test29 = checkset isGraph graphchars val test30 = checkset isAscii ascii val test31 = tst' "test31" (fn _ => map toLower (explode ascii) = explode lowerascii) val test32 = tst' "test32" (fn _ => map toUpper (explode ascii) = explode upperascii) val test33 = tst' "test33" (fn _ => map toUpper (explode graphchars) seq map toLower (explode graphchars) seq true) val test34a = tst' "test34a" (fn _ => map pred (List.drop(allchars, 1)) = List.take(allchars, 255)); val test34b = tst0 "test34b" ((pred minChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test35a = tst' "test35a" (fn _ => map succ (List.take(allchars, 255)) = List.drop(allchars, 1)); val test35b = tst0 "test35b" ((succ maxChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") end (* Test cases for SML character escape functions. *) val test36 = let fun chk (arg, res) = Char.toString arg = res in tst' "test36" (fn _ => List.all chk [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")]) end; val test37 = let val chars = List.tabulate(256, chr) fun chk c = Char.fromString(Char.toString c) = SOME c in tst' "test37" (fn _ => List.all chk chars) end val test38 = let fun chkFromString (arg, res) = Char.fromString arg = SOME res val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] in tst' "test38" (fn _ => List.all chkFromString argResList) end; val test39 = tst' "test39" (fn _ => List.all (fn arg => Char.fromString arg = NONE) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\256", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\ a", "\\ a\\B", "\\ \\"]); (* Test cases for C string escape functions *) val test40 = let val chars = List.tabulate(256, chr) in tst' "test40" (fn _ => List.map SOME chars = List.map Char.fromCString (List.map Char.toCString chars)) end; val test41 = let val argResList = [(#"\010", "\\n"), (#"\009", "\\t"), (#"\011", "\\v"), (#"\008", "\\b"), (#"\013", "\\r"), (#"\012", "\\f"), (#"\007", "\\a"), (#"\\", "\\\\"), (#"?", "\\?"), (#"'", "\\'"), (#"\"", "\\\"")] in tst' "test41" (fn _ => List.all (fn (arg, res) => Char.toCString arg = res) argResList) end; val test42 = let fun checkFromCStringSucc (arg, res) = str (valOf (Char.fromCString arg)) = res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\064"), ("\\100A", "\064"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\001"), ("\\178", "\015"), ("\\1C", "\001"), ("\\17C", "\015"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010"), ("\\xAAg", "\170"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017") ] in tst' "test42" (fn _ => List.all checkFromCStringSucc argResList) end; val test43 = let fun checkFromCStringFail arg = Char.fromCString arg = NONE in tst' "test43" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\400", "\\777", "\\8", "\\9", "\\c", "\\d", "\\x", "\\x100", "\\xG"]) end; end mlton-20210117+dfsg/regression/callcc.ok000066400000000000000000000000021416264345000177520ustar00rootroot000000000000003 mlton-20210117+dfsg/regression/callcc.sml000066400000000000000000000001441416264345000201430ustar00rootroot00000000000000open MLton.Cont val _ = print(Int.toString(1 + callcc(fn k => throw(k, 2)))) val _ = print "\n" mlton-20210117+dfsg/regression/callcc2.ok000066400000000000000000000000211416264345000200350ustar00rootroot00000000000000Fun Fun Code Fun mlton-20210117+dfsg/regression/callcc2.sml000066400000000000000000000201651416264345000202320ustar00rootroot00000000000000type ident = string type con = string datatype pattern = PVar of ident | PAlias of ident * pattern | PConstruct of con * pattern list | PAliasD of ident * pattern | PConstructD of con * pattern list datatype exp = Var of ident | Lam of ident * exp | App of exp * exp | Construct of con * exp list | Case of exp * (pattern * exp) list | Let of ident * exp * exp | LamD of ident * exp | AppD of exp * exp | ConstructD of con * exp list | CaseD of exp * (pattern * exp) list | LetD of ident * exp * exp | Lift of exp datatype value = Fun of (value -> value) | Con of con * value list | Code of exp | Wrong val valueToString = fn Fun _ => "Fun" | Con _ => "Con" | Code _ => "Code" | Wrong => "Wrong" (* control operators *) (*********************) (* toplevel resetMarker *) val metaCont = ref (fn (x : value) => x) fun abort thunk = let val v = thunk () in !metaCont v end fun reset thunk = let val mc = !metaCont in SMLofNJ.Cont.callcc (fn k => let (* new marker which restores old one *) val _ = metaCont := (fn v => let val _ = metaCont := mc in SMLofNJ.Cont.throw k v end) in abort thunk end) end fun shift f = SMLofNJ.Cont.callcc (fn k => abort (fn () => f (fn v => reset (fn () => SMLofNJ.Cont.throw k v)))) (*********************) (* environment *) exception UnboundVar of ident fun update r var value = (var, value) :: r fun lookup [] var = raise (UnboundVar var) | lookup ((var, value) :: r) var' = if var = var' then value else lookup r var' (* pattern matcher - binds variables patterns are linear and pairwise disjoint *) fun patterneq (p, value) r = case p of PVar x => (update r x value, true) | PAlias (x, p) => let val (r', eq) = patterneq (p, value) r in (update r' x value, eq) end | PConstruct (c, ps) => let val Con(c', vs) = value val eq = (c = c') val eq = eq andalso (List.length vs = List.length ps) in List.foldl (fn ((p, v), (r', eq')) => let val (r'', eq'') = patterneq (p, v) r' in (r'', eq'' andalso eq') end) (r, eq) (ListPair.zip (ps, vs)) end val gensym = let val count = ref 0 in (fn x => (count := !count + 1; (x^(Int.toString (!count))))) end (* copies pattern with fresh variables bound in new environment *) fun generatePattern (r, p) = case p of PVar x => let val xx = gensym x in (update r x (Code (Var xx)), PVar xx) end | PAliasD (x, p) => let val (r', p') = generatePattern (r, p) val xx = gensym x in (update r x (Code (Var xx)), PAlias (xx, p')) end | PConstructD (c, ps) => let val (r, ps) = List.foldr (fn (p, (r, ps)) => let val (r', p') = generatePattern (r, p) in (r', p' :: ps) end) (r, []) ps in (r, PConstruct (c, ps)) end (* the specializer *) fun spec e r = case e of Var x => lookup r x (* Specialization of Static Stuff - standard semantics *) | Lam (x, e) => Fun (fn y => spec e (update r x y)) | App (f, a) => let val Fun ff = spec f r in ff (spec a r) end | Construct (c, es) => let val vs = List.map (fn e => spec e r) es in Con (c, vs) end | Case (test, cls) => let val testv = spec test r (* exhaustive by restriction on patterns *) fun loop cls = (case cls of ((p, e) :: cls) => let val (r', eq) = patterneq (p, testv) r in if eq then spec e r' else loop cls end | [] => Wrong) in loop cls end | Let (x, e1, e2) => let val v1 = spec e1 r in spec e2 (update r x v1) end (* Specialization of Dynamic stuff *) | LamD (x, e) => let val xx = gensym x val Code body = reset (fn () => spec e (update r x (Code (Var xx)))) in Code (Lam (xx, body)) end | AppD (f, a) => let val Code ff = spec f r val Code aa = spec a r in Code (App (ff, aa)) end | ConstructD (c, es) => let val es' = List.map (fn e => let val Code v = spec e r in v end) es in Code (Construct (c, es')) end | LetD (x, e1, e2) => let val xx = gensym x in shift (fn k => let val Code e1' = spec e1 r val Code e2' = reset (fn () => k (spec e2 (update r x (Code (Var xx))))) in Code (Let (xx, e1', e2')) end) end | CaseD (test, cls) => shift (fn k => let val Code testd = spec test r val newCls = List.map (fn (p, e) => let val (r', p') = generatePattern(r, p) val Code branch = reset (fn () => k (spec e r')) in (p', branch) end) cls in Code (Case(testd, newCls)) end) (* first-order lifting *) | Lift e => let val Con(c, []) = spec e r in Code(Construct (c, [])) end fun specialize p = spec p [] (* standard evaluation *) val sampleProg1 = Lam("q", App(Let("id", App(Var "q", Var "q"), Lam("z", Var "z")), Var "q")) val sampleProg2 = Lam("f", App(Lam("x", Case(Var "x", [(PConstruct("True",[]), Lam("x",Lam("y",Var "x"))), (PConstruct("False",[]), Lam("x",Lam("y",Var "y")))])), Var "f")) (* partial evaluation *) val sampleProg1D = LamD("q", App(LetD("id", AppD(Var "q", Var "q"), Lam("z", Var "z")), Var "q")) val sampleProg2D = LamD("f", LamD("x", App(CaseD(Var "x", [(PConstructD("True",[]), Lam("z",LamD("y", Var "z"))), (PConstructD("False",[]), Lam("z",LamD("y", Var "y")))]), Var "f"))) val specialize = fn p => let val v = specialize p in print(valueToString v) ; print "\n" end val v1 = specialize sampleProg1 val v2 = specialize sampleProg2 val v3 = specialize sampleProg1D val v4 = specialize sampleProg2 mlton-20210117+dfsg/regression/callcc3.ok000066400000000000000000000000001416264345000200330ustar00rootroot00000000000000mlton-20210117+dfsg/regression/callcc3.sml000066400000000000000000000005371416264345000202340ustar00rootroot00000000000000open MLton open Cont val kr: unit Cont.t option ref = ref NONE val rr: unit ref option ref = ref NONE val r: unit ref = ref (callcc (fn k => kr := SOME k)) val _ = case !rr of NONE => (rr := SOME r ; throw (valOf (!kr), ())) | SOME r' => if r = r' then raise Fail "bug" else () mlton-20210117+dfsg/regression/cases.ok000066400000000000000000000000001416264345000176250ustar00rootroot00000000000000mlton-20210117+dfsg/regression/cases.sml000066400000000000000000000010361416264345000200210ustar00rootroot00000000000000fun test (f, a, r) = if f a = r then () else raise Fail "bug" val rec f = fn 0 => 0 | 1 => 1 | 2 => 2 | i => f (i - 1) val _ = test (f, 100, 2) val rec f: word -> int = fn 0w0 => 0 | 0w1 => 1 | 0w2 => 2 | w => f (w - 0w1) val _ = test (f, 0w100, 2) val rec f: Word8.word -> int = fn 0w0 => 0 | 0w1 => 1 | 0w2 => 2 | w => f (w - 0w1) val _ = test (f, 0w100, 2) val rec f: char -> int = fn #"a" => 0 | #"b" => 1 | #"c" => 2 | _ => f #"c" val _ = test (f, #"d", 2) mlton-20210117+dfsg/regression/char.scan.ok000066400000000000000000000000731416264345000204010ustar00rootroot00000000000000false a at 4 of 4 a at 4 of 4 a at 7 of 7 a at 7 of 7 NONE mlton-20210117+dfsg/regression/char.scan.sml000066400000000000000000000011341416264345000205620ustar00rootroot00000000000000val dquote = "\"" val _ = print (concat [Bool.toString (isSome (Char.fromString dquote)), "\n"]) val scan: string -> unit = fn s => let val n = String.size s fun reader i = if i = n then NONE else SOME (String.sub (s, i), i + 1) in case Char.scan reader 0 of NONE => print "NONE\n" | SOME (c, i) => print (concat [str c, " at ", Int.toString i, " of ", Int.toString n, "\n"]) end val _ = List.app scan ["a\\ \\", "\\ \\a", "\\ \\a\\ \\", "\\ \\\\ \\a", "\\ \\"] mlton-20210117+dfsg/regression/char0.sml000066400000000000000000000001541416264345000177200ustar00rootroot00000000000000fun f c = case c of #"a" => () | _ => raise Fail "bug" val _ = f #"a" val _ = f #"a" mlton-20210117+dfsg/regression/check_arrays.ok000066400000000000000000000025431416264345000212030ustar00rootroot00000000000000 Testing structure Word8Array Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 158-array. ok Now I will try with a 316-array. ok Now I will try with a 159-array. ok Now I will try with a 3161-array. ok Now I will try with a 15161-array. ok Testing structure Array Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 158-array. ok Now I will try with a 316-array. ok Now I will try with a 159-array. ok Now I will try with a 3161-array. ok Now I will try with a 15161-array. ok Testing structure CharArray Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 758-array. ok Now I will try with a 1516-array. ok Now I will try with a 759-array. ok Now I will try with a 15161-array. ok check done mlton-20210117+dfsg/regression/check_arrays.sml000066400000000000000000000136751416264345000213750ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (*check_arrays.sml 13/10/1997 22:13. tho.*) fun impossible s = (print "ERROR : "; print s; print "\n") val Char_prim_array_maxLen = 200*4-42; val Poly_prim_array_maxLen = 200-42; (*test Word8Array structure*) val _ = (print "\nTesting structure Word8Array\n"; let fun dot () = {}(*pr "."*) fun phase s = {}(*pr s*) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = Word8Array.array (n, 0w42); val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if Word8Array.sub (a, !i) <> 0w42 then impossible ("check 1 failed: it is " ^ Int.toString (Word8.toInt (Word8Array.sub (a, !i)))) else (); i := !i + 1); phase "\ncheck length:"; if Word8Array.length a <> n then impossible ("length was " ^ Int.toString (Word8Array.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if (Word8Array.foldr (fn (e,a) => Word8.toInt e + a) 0 a) <> Word8Array.length a * 42 then impossible ("foldr check failed: it was " ^ Int.toString (Word8Array.foldr (fn (e,a) => Word8.toInt e + a) 0 a) ^ " and not " ^ Int.toString (Word8Array.length a * 42)) else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); Word8Array.update (a, !i, 0w2 * (Word8.fromInt (!i) mod 0w20)); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if Word8Array.sub (a, !i) <> (0w2 * (Word8.fromInt (!i) mod 0w20)) then impossible (concat["check 2 failed: found ", (Int.toString o Word8.toInt)(Word8Array.sub (a, !i)), " and not ", (Int.toString o Word8.toInt)(0w2 * (Word8.fromInt (!i) mod 0w20))]) else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Poly_prim_array_maxLen; try_with (2 * Poly_prim_array_maxLen); try_with (Poly_prim_array_maxLen + 1); try_with (20 * Poly_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ) val _ = ( (*test Array structure*) print "\nTesting structure Array\n"; let fun dot () = () (*pr ".";*) fun phase s = () (*pr s;*) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = Array.array (n, 42) val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if Array.sub (a, !i) <> 42 then impossible "check 1 failed" else (); i := !i + 1); phase "\ncheck length:"; if Array.length a <> n then impossible ("length was " ^ Int.toString (Array.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if Array.foldr (op +) 0 a <> Array.length a * 42 then impossible ("foldr check failed: it was " ^ Int.toString (Array.foldr (op +) 0 a) ^ " and not " ^ Int.toString (Array.length a * 42)) else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); Array.update (a, !i, !i * !i); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if Array.sub (a, !i) <> !i * !i then impossible "check 2 failed" else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Poly_prim_array_maxLen; try_with (2 * Poly_prim_array_maxLen); try_with (Poly_prim_array_maxLen + 1); try_with (20 * Poly_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ) val _ = ( (*test CharArray structure*) print "\nTesting structure CharArray\n"; let fun dot () = () (*pr ".";*) fun phase s = () (*pr s*) val x = #"*" fun f (* : (elem * 'b) -> 'b *) (x', b) = x = x' andalso b val b_init = true fun repeat x 0 = [] | repeat x n = x :: repeat x (n-1) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = CharArray.array (n, x) val x_summasumarum = true val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if CharArray.sub (a, !i) <> x then impossible "check 1 failed" else (); i := !i + 1); phase "\ncheck length:"; if CharArray.length a <> n then impossible ("length was " ^ Int.toString (CharArray.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if CharArray.foldr f b_init a <> x_summasumarum then impossible "foldr check failed" else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); CharArray.update (a, !i, chr ((!i mod (127-34)) + 34) ); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if CharArray.sub (a, !i) <> chr ((!i mod (127-34)) + 34) then impossible "check 2 failed" else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Char_prim_array_maxLen; try_with (2 * Char_prim_array_maxLen); try_with (Char_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ; print "\ncheck done\n" ) mlton-20210117+dfsg/regression/circular.ok000066400000000000000000000000001416264345000203330ustar00rootroot00000000000000mlton-20210117+dfsg/regression/circular.sml000066400000000000000000000003651416264345000205330ustar00rootroot00000000000000open Vector datatype t = T of t vector fun makeT () = T (tabulate (0, fn _ => makeT ())) fun destT (T v) = if length v > 0 then 1 + destT (sub (v, 0)) else 0 val _ = if 0 = destT (makeT ()) then () else raise Fail "bug" mlton-20210117+dfsg/regression/cmdline.ok000066400000000000000000000000671416264345000201570ustar00rootroot00000000000000This program is invoked as `./cmdline' with arguments: mlton-20210117+dfsg/regression/cmdline.sml000066400000000000000000000013671416264345000203450ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/cmdline.sml, PS 1997-03-07 *) val _ = (app print ["This program is invoked as `", CommandLine.name(), "'\n", "with arguments:\n"]; app (fn a => (print a; print "\n")) (CommandLine.arguments ())) mlton-20210117+dfsg/regression/cobol.sml000066400000000000000000007231321416264345000200310ustar00rootroot00000000000000 val condition_names:(string list ref) = ref [] (*hojfeld defunctorised*) structure Cobol = struct type pos = unit (*hojfeld*) (* BASIC STUFF *) type ts2k = string datatype figurative_constant = ZERO | ZEROS | ZEROES | SPACE | SPACES | HIGHVALUE | HIGHVALUES | LOWVALUE | LOWVALUES | QUOTE | QUOTES | ALL_ZERO | ALL_ZEROS | ALL_ZEROES | ALL_SPACE | ALL_SPACES | ALL_HIGHVALUE | ALL_HIGHVALUES | ALL_LOWVALUE | ALL_LOWVALUES | ALL_QUOTE | ALL_QUOTES | ALL_NONNUMERICLITERAL of string datatype literal = LITERAL_IS_NONNUMERICLITERAL of string * pos * pos | LITERAL_IS_INTEGER of string * pos * pos | LITERAL_IS_DECIMALNUMBER of string * pos * pos | LITERAL_IS_BOOLEANLITERAL of bool * pos * pos | LITERAL_IS_FIGURATIVECONSTANT of figurative_constant * pos * pos datatype data_name_or_literal = DATA_NAME_OR_LITERAL_IS_DATA_NAME of string | DATA_NAME_OR_LITERAL_IS_LITERAL of literal datatype data_names = DATA_NAMES of data_names * string | ONE_DATA_NAME of string datatype data_name_or_integer = DATA_NAME_OR_INTEGER_IS_DATA_NAME of string | DATA_NAME_OR_INTEGER_IS_INTEGER of string type qualification = string datatype qualifications = SEVERAL_QUALIFICATIONS of qualifications * qualification | NO_QUALIFICATIONS type subscript_phrase = unit (* TODO *) datatype special_register = LINAGECOUNTER | DEBUGITEM datatype identifier = QUALIFIED_IDENTIFIER of string * qualifications * subscript_phrase * pos * pos | SPECIAL_REGISTER of special_register * pos * pos datatype identifiers = SEVERAL_IDENTIFIERS of identifiers * identifier | ONE_IDENTIFIER of identifier datatype identifier_or_literal = IDENTIFIER_OR_LITERAL_IS_IDENTIFIER of identifier | IDENTIFIER_OR_LITERAL_IS_LITERAL of literal datatype identifier_or_literals = SEVERAL_IDENTIFIER_OR_LITERALS of identifier_or_literals * identifier_or_literal | ONE_IDENTIFIER_OR_LITERAL of identifier_or_literal datatype rounded = ROUNDED | NOT_ROUNDED datatype identifier_rounded = IDENTIFIER_ROUNDED of identifier * rounded datatype identifier_roundeds = SEVERAL_IDENTIFIER_ROUNDEDS of identifier_roundeds * identifier_rounded | ONE_IDENTIFIER_ROUNDED of identifier_rounded datatype is_not = IS_NOT_IS | IS_NOT_NOT datatype data_class = DATA_CLASS_IS_NUMERIC | DATA_CLASS_IS_ALPHABETIC datatype relational_operator = GREATER | LESS | EQUAL | GREATER_OR_EQUAL | LESS_OR_EQUAL datatype sign_specification = SIGN_SPECIFICATION_IS_POSITIVE | SIGN_SPECIFICATION_IS_NEGATIVE | SIGN_SPECIFICATION_IS_ZERO (* END OF BASIC STUFF *) (* ENVIRONMENT DIVISION *) type source_computer_paragraph = unit type object_computer_paragraph = unit datatype currency_sign_clause = CURRENCY of string datatype decimal_clause = DECIMALPOINT_IS_COMMA datatype special_names_clause = ENVIRONMENT_CLAUSE | ALPHABET_CLAUSE | CURRENCY_SIGN_CLAUSE of currency_sign_clause | DECIMAL_CLAUSE of decimal_clause datatype special_names_clauses = SEVERAL_SPECIAL_NAMES_CLAUSES of special_names_clauses * special_names_clause | NO_SPECIAL_NAMES_CLAUSES datatype special_names_paragraph = SPECIAL_NAMES_PARAGRAPH of special_names_clauses | NO_SPECIAL_NAMES_PARAGRAPH datatype configuration_section = CONFIGURATION_SECTION of source_computer_paragraph * object_computer_paragraph * special_names_paragraph type input_output_section = unit (* END OF ENVIRONMENT DIVISION *) (* WORKINGSTORAGE and LINKAGE SECTION *) datatype left_right = LEFT | RIGHT datatype through_data_name = THROUGH_DATA_NAME of string | NOT_THROUGH_DATA_NAME datatype separate_character = SEPARATE | NO_SEPARATE datatype leading_trailing = LEADING_TRAILING_IS_LEADING | LEADING_TRAILING_IS_TRAILING datatype table_length_description = FIXED_LENGTH_TABLE of string (* integer-2 *) | VARIABLE_LENGTH_TABLE of string (* integer-1 *) * string (* integer-2 *) * string (* data-name-1 *) datatype ascending_descending = ASCENDING | DESCENDING datatype ascending_descending_key_phrase = ASCENDING_DESCENDING_KEY_PHRASE of ascending_descending * data_names datatype ascending_descending_key_phrases = ASCENDING_DESCENDING_KEY_PHRASES of ascending_descending_key_phrases * ascending_descending_key_phrase | NO_ASCENDING_DESCENDING_KEY_PHRASES datatype index_names = SEVERAL_INDEX_NAMES of index_names * string | ONE_INDEX_NAME of string datatype indexed_by_phrase = INDEXED_BY_PHRASE of index_names | NO_INDEXED_BY_PHRASE datatype usage_specifier = USAGE_IS_DISPLAY | USAGE_IS_INDEX | USAGE_IS_COMP3 | USAGE_IS_COMP4 | USAGE_IS_COMP datatype through_literal = THROUGH_LITERAL of literal | NO_THROUGH_LITERAL datatype literal_range = LITERAL_RANGE of literal * through_literal datatype literal_ranges = SEVERAL_LITERAL_RANGES of literal_ranges * literal_range | ONE_LITERAL_RANGE of literal_range datatype data_description_clause = DATA_DESCRIPTION_CLAUSE_IS_USAGE_CLAUSE of usage_specifier * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_SIGN_CLAUSE of leading_trailing * separate_character * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_OCCURS_CLAUSE of table_length_description * ascending_descending_key_phrases * indexed_by_phrase * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_SYNCHRONIZED_CLAUSE of left_right * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_JUSTIFIED_CLAUSE of pos * pos | DATA_DESCRIPTION_CLAUSE_IS_BLANK_WHEN_ZERO_CLAUSE of pos * pos | DATA_DESCRIPTION_CLAUSE_IS_VALUE_CLAUSE of literal_ranges * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_PICTURE_CLAUSE of string * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_INDICATOR_CLAUSE of string * pos * pos datatype data_description_clauses = DATA_DESCRIPTION_CLAUSES of data_description_clauses * data_description_clause | NO_DATA_DESCRIPTION_CLAUSES datatype redefines_clause = REDEFINES_CLAUSE of string | NO_REDEFINES_CLAUSE datatype filler = FILLER | NO_FILLER datatype data_name_or_filler = DATA_NAME_OR_FILLER_IS_DATA_NAME of string | DATA_NAME_OR_FILLER_IS_FILLER of filler datatype record_description_entry = DATA_DESCRIPTION_ENTRY_134 of string (* levelnumber *) * data_name_or_filler * redefines_clause * data_description_clauses * pos * pos | RENAMES_CLAUSE of string (* levelnumber *) * string (* data-name *) * string (* data-name *) * through_data_name * pos * pos | TS2K_NOARROW of ts2k * pos * pos | TS2K_ARROW of ts2k * ts2k * pos * pos | TS2K_ALL of ts2k * ts2k * pos * pos | TS2K_END of pos * pos | TS2K_ASSUME_SEPARATE of pos * pos (* CHANGED-MHS: the 4 TS2K constructors were: | TS2K of ts2k * pos * pos | TS2K_EXPANDS of identifier * pos * pos | TS2K_FIRST_OR_FINAL END-CHANGED-MHS *) datatype record_description_entries = RECORD_DESCRIPTION_ENTRIES of record_description_entries * record_description_entry | NO_RECORD_DESCRIPTION_ENTRIES datatype record_description_entries_opt = RECORD_DESCRIPTION_ENTRIES_OPT of record_description_entries | NO_RECORD_DESCRIPTION_ENTRIES_OPT datatype working_storage_section = WORKINGSTORAGE_SECTION of record_description_entries_opt * pos * pos | NO_WORKINGSTORAGE_SECTION datatype linkage_section = LINKAGE_SECTION of record_description_entries_opt * pos * pos | NO_LINKAGE_SECTION (* END OF WORKINGSTORAGE and LINKAGE SECTION *) (* FILE SECTION *) datatype integer_range = SIMPLE_RANGE of string | INTEGER_TO_INTEGER of string * string datatype record_contains_clause = RECORD_CONTAINS of integer_range datatype data_records_clause = DATA_RECORD_IS of data_names datatype sort_description_clause = SORT_DESCRIPTION_CLAUSE_IS_RECORD of record_contains_clause * pos * pos | SORT_DESCRIPTION_CLAUSE_IS_DATA of data_records_clause * pos * pos datatype sort_description_clauses = SORT_DESCRIPTION_CLAUSES of sort_description_clauses * sort_description_clause | NO_SORT_DESCRIPTION_CLAUSE datatype sort_description_entry = SD of string * sort_description_clauses datatype footing_specification = FOOTING of data_name_or_integer | NOFOOTING datatype top_bottom_specification = TOP | BOTTOM datatype top_bottom_specifications = TOP_BOTTOM_SPECIFICATIONS of top_bottom_specifications * top_bottom_specification | NO_TOP_BOTTOM_SPECIFICATION datatype value_of_phrase = VALUE_OF of string * data_name_or_literal datatype value_of_phrases = VALUE_OF_PHRASES of value_of_phrases * value_of_phrase | VALUE_OF_PHRASE of value_of_phrase datatype characters_or_records = CHARACTERS | RECORDS datatype file_description_clause = BLOCK of integer_range * characters_or_records * pos * pos | FILE_DESCRIPTION_CLAUSE_IS_RECORD of record_contains_clause * pos * pos | LABEL_STANDARD | LABEL_OMITTED | VALUE_OF_CLAUSE of value_of_phrases * pos * pos | FILE_DESCRIPTION_CLAUSE_IS_DATA of data_records_clause * pos * pos | LINAGE_CLAUSE of data_name_or_integer * footing_specification * top_bottom_specifications * pos * pos | CODE_SET_CLAUSE of string * pos * pos datatype file_description_clauses = FILE_DESCRIPTION_CLAUSES of file_description_clauses * file_description_clause | NO_FILE_DESCRIPTION_CLAUSES datatype file_description_entry = FD of string * file_description_clauses * pos * pos datatype file_and_sort_description_entry = FILE_DESCRIPTION_ENTRY of file_description_entry | SORT_DESCRIPTION_ENTRY of sort_description_entry datatype file_description_paragraph = FILE_DESCRIPTION_PARAGRAPH of file_and_sort_description_entry * record_description_entries datatype file_description_paragraphs = FILE_DESCRIPTION_PARAGRAPHS of file_description_paragraphs * file_description_paragraph | NO_FILE_DESCRIPTION_PARAGRAPHS datatype file_section = FILE_SECTION of file_description_paragraphs * pos * pos | NO_FILE_SECTION (* END OF FILESECTION *) (* STATEMENTS *) datatype arithmetic_expression = ARITHMETIC_EXPRESSION_IS_INTEGER of string * pos * pos | ARITHMETIC_EXPRESSION_IS_DECIMALNUMBER of string * pos * pos | ARITHMETIC_EXPRESSION_IS_NONNUMERICLITERAL of string * pos * pos | ARITHMETIC_EXPRESSION_IS_BOOLEANLITERAL of bool * pos * pos | ARITHMETIC_EXPRESSION_IS_FIGURATIVE_CONSTANT of figurative_constant * pos * pos | ARITHMETIC_EXPRESSION_IS_IDENTIFIER of identifier | ARITHMETIC_EXPRESSION_IS_PLUS_SIGN of arithmetic_expression | ARITHMETIC_EXPRESSION_IS_MINUS_SIGN of arithmetic_expression | ARITHMETIC_EXPRESSION_IS_EXPONENTIATION of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_MULTIPLY of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_DIVIDE of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_ADD of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_SUBTRACT of arithmetic_expression * arithmetic_expression datatype simple_condition = CLASS_CONDITION of identifier * is_not * data_class | CONDITION_NAME of identifier | RELATION_CONDITION of arithmetic_expression * is_not * relational_operator * arithmetic_expression * pos * pos (* Unclear if TRUE and FALSE are allowed in conditions *) (* at all (TRUE is reserved word but not FALSE) *) | SIMPLE_CONDITION_IS_TRUE of pos * pos | SIMPLE_CONDITION_IS_FALSE of pos * pos | SIGN_CONDITION of arithmetic_expression * is_not * sign_specification (* SWITCH_STATUS_CONDITION is SYSTEM-SHUT-DOWN or UPSI-i *) (* Don't think we need to know *) | SWITCH_STATUS_CONDITION of pos * pos datatype conditional_expression = SIMPLE_CONDITION of simple_condition | NEGATED_CONDITION of conditional_expression (* the manual says NOT simple_expression, but example in fig 11-12 *) (* tells a different story!! *) | AND_CONDITION of conditional_expression * conditional_expression | OR_CONDITION of conditional_expression * conditional_expression datatype add_or_subtract = ADD | SUBTRACT datatype date_day_time = DATE of pos * pos | DAY of pos * pos | TIME of pos * pos datatype identifier_or_literal_or_ddt = IDENTIFIER_OR_LITERAL_OR_DDT_IS_IDENTIFIER_OR_LITERAL of identifier_or_literal | IDENTIFIER_OR_LITERAL_OR_DDT_IS_DDT of date_day_time datatype annotation_statement = TS2K_ASSUME of identifier_or_literal_or_ddt * ts2k * pos * pos | TS2K_COERCE of identifier_or_literal_or_ddt * ts2k * pos * pos * identifier datatype move_statement = MOVE of identifier_or_literal * identifiers * pos * pos | MOVECORRESPONDING of identifier * identifier * pos * pos datatype from_environment = NO_FROM | FROM of string * pos * pos datatype accept_statement = ACCEPT_ENVIRONMENT of identifier * from_environment * pos * pos | ACCEPT_DATE_DAY_TIME of identifier * date_day_time * pos * pos datatype statements = SEVERAL_STATEMENTS of statements * statement | ONE_STATEMENT of statement and statement = MOVE_STATEMENT of move_statement | COMPUTE_STATEMENT of compute_statement | ADD_OR_SUBTRACT_STATEMENT of add_or_subtract_statement | MULTIPLY_STATEMENT of multiply_statement | DIVIDE_STATEMENT of divide_statement | IF_STATEMENT of if_statement | ANNOTATION_STATEMENT of annotation_statement | ACCEPT_STATEMENT of accept_statement | OTHER_STATEMENT (* TODO *) and add_or_subtract_statement = ADD_OR_SUBTRACT of add_or_subtract * identifier_or_literals * identifier_roundeds * size_error_clause * pos * pos | ADD_OR_SUBTRACT_GIVING of add_or_subtract * identifier_or_literals * identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos | ADD_OR_SUBTRACT_CORRESPONDING of add_or_subtract * identifier * identifier * rounded * size_error_clause * pos * pos and compute_statement = COMPUTE of identifier_roundeds * arithmetic_expression * size_error_clause * pos * pos and multiply_statement = MULTIPLY of identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos | MULTIPLY_GIVING of identifier_or_literal * identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos (* NOTE: the following is not checked against the manual *) (* neither is it tested *) and divide_statement = (* DIVIDE a INTO b [[ON] SIZE ERROR c] *) DIVIDE_INTO of identifier_or_literal (* a *) * identifier_roundeds (* b *) * size_error_clause (* c *) * pos * pos (* DIVIDE a INTO b GIVING c [[ON] SIZE ERROR d] *) | DIVIDE_INTO_GIVING of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * size_error_clause (* d *) * pos * pos (* DIVIDE a INTO b GIVING c REMAINDER d [[ON] SIZE ERROR e] *) | DIVIDE_INTO_GIVING_REMAINDER of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * identifier (* d *) * size_error_clause (* e *) * pos * pos (* DIVIDE a BY b GIVING c [[ON] SIZE ERROR d] *) | DIVIDE_BY_GIVING of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * size_error_clause (* d *) * pos * pos (* DIVIDE a BY b GIVING c REMAINDER d [[ON] SIZE ERROR e] *) | DIVIDE_BY_GIVING_REMAINDER of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * identifier (* d *) * size_error_clause (* e *) * pos * pos and size_error_clause = SIZE_ERROR of statements | NO_SIZE_ERROR and if_statement = IF of conditional_expression * then_statements * else_statements * pos * pos and then_statements = THEN_STATEMENTS of statements | NEXT_SENTENCE and else_statements = ELSE of statements | ELSE_NEXT_SENTENCE | NO_ELSE (* ENDSTATEMENTS *) (* PROCEDURE DIVISION *) type section_name = string type paragraph_name = string datatype sentence = SENTENCE of statements datatype sentences = SENTENCES of sentences * sentence | NO_SENTENCES datatype paragraph = PARAGRAPH of paragraph_name * sentences datatype paragraphs = SEVERAL_PARAGRAPHS of paragraphs * paragraph | ONE_PARAGRAPH of paragraph datatype segment_number_opt = SEGMENT_NUMBER of string | NOSEGMENT_NUMBER datatype sections = NO_BODY_SECTION of section_name * segment_number_opt | NO_BODY_SECTION_FOLLOWED_BY_SECTION of section_name * segment_number_opt * sections | SECTION of section_name * segment_number_opt * paragraphs_and_sections and paragraphs_and_sections = SEVERAL_PARAGRAPHS_AND_SECTIONS of paragraph * paragraphs_and_sections | SINGLE_PARAGRAPH_AND_SECTIONS of paragraph * sections | SINGLE_PARAGRAPH of paragraph type using_clause = unit (* TODO *) type declaratives_section = unit (* TODO *) datatype procedure_division = PROCEDURE_DIVISION_FORMAT_1_DECLARATIVES of using_clause * declaratives_section * sections * pos * pos | PROCEDURE_DIVISION_FORMAT_1_NO_DECLARATIVES of using_clause * sections * pos * pos | PROCEDURE_DIVISION_FORMAT_2 of using_clause * paragraphs * pos * pos | EMPTY_PROCEDURE_DIVISION (* no procedure division allowed by our parser though mandatory in S/36 *) (* END OF PROCEDURE DIVISION *) (* PROGRAM STRUCTURE *) datatype data_division = DATA_DIVISION of file_section * working_storage_section * linkage_section | NO_DATA_DIVISION datatype environment_division = ENVIRONMENT_DIVISION of configuration_section * input_output_section | NO_ENVIRONMENT_DIVISION type identification_division = unit datatype cobol_program = PROGRAM of identification_division * environment_division * data_division * procedure_division datatype test_cobol_programs = TEST_COBOL_PROGRAMS of test_cobol_programs * cobol_program | TEST_COBOL_PROGRAM of cobol_program datatype test_cobol = TEST of test_cobol_programs | COBOL_PROGRAM of cobol_program end; datatype cexpression = CE_AE of Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_SINGLE_REL of Cobol.relational_operator * Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_REL of Cobol.arithmetic_expression * Cobol.is_not * Cobol.relational_operator * Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_DC of Cobol.arithmetic_expression * Cobol.is_not * Cobol.data_class | CE_SIGN of Cobol.arithmetic_expression * Cobol.is_not * Cobol.sign_specification | CE_SWITCH of Cobol.pos * Cobol.pos | CE_TRUE of Cobol.pos * Cobol.pos | CE_FALSE of Cobol.pos * Cobol.pos | CE_NOT of cexpression | CE_AND of cexpression * cexpression | CE_OR of cexpression * cexpression structure MlyValue = struct datatype svalue = VOID | ntVOID of unit | PSEUDOTEXT of (string) | USERDEFINEDWORD of (string) | PICTURESTRING of (string) | BOOLEANLITERAL of (bool) | INTEGER of (string) | DECIMALNUMBER of (string) | NONNUMERICLITERAL of (string) | identifier_or_literal_or_ddt of (Cobol.identifier_or_literal_or_ddt) | ts2k of (Cobol.ts2k) | annotation_statement of (Cobol.annotation_statement) | data_description_annotation of (Cobol.record_description_entry) | working_storage_section of (Cobol.working_storage_section) | variable_length_tables_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | value_of_phrases of (Cobol.value_of_phrases) | value_of_phrase of (Cobol.value_of_phrase) | value_of_clause of (Cobol.file_description_clause) | value_clause of (Cobol.literal_ranges) | using_clause of (Cobol.using_clause) | usage_specifier of (Cobol.usage_specifier) | usage_clause of (Cobol.usage_specifier) | top_bottom_specifications of (Cobol.top_bottom_specifications) | top_bottom_specification of (Cobol.top_bottom_specification) | top_bottom of (Cobol.top_bottom_specification) | filler of (Cobol.filler) | through_literal of (Cobol.through_literal) | through_data_name of (Cobol.through_data_name) | then_statements of (Cobol.then_statements) | text_name of (string) | system_name of (string) | conditional_expression of (Cobol.conditional_expression) | arithmetic_expression of (Cobol.arithmetic_expression) | synchronized_clause of (Cobol.left_right) | subtract_statement of (Cobol.add_or_subtract_statement) | subscript_phrase of (Cobol.subscript_phrase) | statements of (Cobol.statements) | statement of (Cobol.statement) | standard_or_omitted of (Cobol.file_description_clause) | special_names_paragraph of (Cobol.special_names_paragraph) | source_computer_paragraph of (Cobol.source_computer_paragraph) | sort_description_entry of (Cobol.sort_description_entry) | sort_description_clauses of (Cobol.sort_description_clauses) | sort_description_clause of (Cobol.sort_description_clause) | size_error_clauses of (Cobol.size_error_clause) | size_error_clause of (Cobol.size_error_clause) | sign_clause of (Cobol.leading_trailing*Cobol.separate_character) | separate_character of (Cobol.separate_character) | sentences of (Cobol.sentences) | sentence of (Cobol.sentence) | segment_number_opt of (Cobol.segment_number_opt) | sections of (Cobol.sections) | section_name of (string) | rounded of (Cobol.rounded) | renames_clause of (Cobol.record_description_entry) | redefines_clause of (Cobol.redefines_clause) | record_description_entry of (Cobol.record_description_entry) | record_description_entries of (Cobol.record_description_entries) | record_description_entries_opt of (Cobol.record_description_entries_opt) | record_contains_clause of (Cobol.record_contains_clause) | qualifications of (Cobol.qualifications) | qualification of (Cobol.qualification) | procedure_division of (Cobol.procedure_division) | data_name_or_filler of (Cobol.data_name_or_filler) | picture_clause of (string) | paragraphs_and_sections of (Cobol.paragraphs_and_sections) | paragraphs of (Cobol.paragraphs) | paragraph_name of (string) | paragraph of (Cobol.paragraph) | occurs_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | object_computer_paragraph of (Cobol.object_computer_paragraph) | multiply_statement of (Cobol.multiply_statement) | move_statement of (Cobol.move_statement) | mnemonic_name of (string) | literal_ranges of (Cobol.literal_ranges) | literal_range of (Cobol.literal_range) | literal of (Cobol.literal) | linkage_section of (Cobol.linkage_section) | linage_clause of (Cobol.file_description_clause) | level_number of (string) | left_right of (Cobol.left_right) | figurative_constant of (Cobol.figurative_constant) | leading_trailing of (Cobol.leading_trailing) | label_records_clause of (Cobol.file_description_clause) | is_not of (Cobol.is_not) | integer_range of (Cobol.integer_range) | input_output_section of (Cobol.input_output_section) | indicator_clause of (string) | indexed_by_phrase of (Cobol.indexed_by_phrase) | index_names of (Cobol.index_names) | index_name of (string) | imperative_statement of (Cobol.statements) | if_statement of (Cobol.if_statement) | identifiers of (Cobol.identifiers) | identifier_roundeds of (Cobol.identifier_roundeds) | identifier_rounded of (Cobol.identifier_rounded) | identifier_or_literals of (Cobol.identifier_or_literals) | identifier_or_literal of (Cobol.identifier_or_literal) | identifier of (Cobol.identifier) | identification_division of (Cobol.identification_division) | from_environment of (Cobol.from_environment) | footing_specification of (Cobol.footing_specification) | fixed_length_tables_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | file_section of (Cobol.file_section) | file_name of (string) | file_description_paragraphs of (Cobol.file_description_paragraphs) | file_description_paragraph of (Cobol.file_description_paragraph) | file_description_entry of (Cobol.file_description_entry) | file_description_clauses of (Cobol.file_description_clauses) | file_description_clause of (Cobol.file_description_clause) | file_and_sort_description_entry of (Cobol.file_and_sort_description_entry) | special_register of (Cobol.special_register) | environment_division of (Cobol.environment_division) | else_statements of (Cobol.else_statements) | divide_statement of (Cobol.divide_statement) | sign_specification of (Cobol.sign_specification) | data_class of (Cobol.data_class) | relational_operator of (Cobol.relational_operator) | declaratives_section of (Cobol.declaratives_section) | decimal_clause of (Cobol.decimal_clause) | date_day_time of (Cobol.date_day_time) | data_records_clause of (Cobol.data_records_clause) | data_name_or_literal of (Cobol.data_name_or_literal) | special_names_clause of (Cobol.special_names_clause) | special_names_clauses of (Cobol.special_names_clauses) | data_name_or_integer of (Cobol.data_name_or_integer) | data_names of (Cobol.data_names) | data_name of (string) | data_division of (Cobol.data_division) | data_description_entry_134 of (Cobol.record_description_entry) | data_description_entry of (Cobol.record_description_entry) | data_description_clauses of (Cobol.data_description_clauses) | data_description_clause of (Cobol.data_description_clause) | currency_sign_clause of (Cobol.currency_sign_clause) | configuration_section of (Cobol.configuration_section) | compute_statement of (Cobol.compute_statement) | code_set_clause of (Cobol.file_description_clause) | characters_or_records of (Cobol.characters_or_records) | character_string of (string) | block_contains_clause of (Cobol.file_description_clause) | ascending_descending_key_phrases of (Cobol.ascending_descending_key_phrases) | ascending_descending_key_phrase of (Cobol.ascending_descending_key_phrase) | ascending_descending of (Cobol.ascending_descending) | expression of (cexpression) | alphabet_name of (string) | add_statement of (Cobol.add_or_subtract_statement) | accept_statement of (Cobol.accept_statement) | test_cobol of (Cobol.test_cobol) | test_cobol_program of (Cobol.cobol_program) | test_cobol_programs of (Cobol.test_cobol_programs) | cobol_program of (Cobol.cobol_program) end type svalue = MlyValue.svalue (*TODO 13/01/1998 14:54. hojfeld.: mine erklringer:*) type pos = unit type arg = unit datatype nonterm = hojfelds_NT of int exception Hojfeld of string (*og s: LrTable.NT |-> hojfelds_NT*) (*TODO 13/01/1998 14:54. hojfeld.: mine erklringer slut*) fun actions(i392:int, defaultPos:pos, stack:(unit (*LrTable.state*) * (svalue * pos * pos)) list, ():arg ) = case (i392, stack) of (0, _) => raise Hojfeld "0" (*act0(stack)*) | (1, _) => raise Hojfeld "1" (*act1(stack)*) | (2, _) => raise Hojfeld "2" (*act2(stack)*) | (3, _) => raise Hojfeld "3" (*act3(stack)*) | (4, _) => raise Hojfeld "4" (*act4(stack)*) | (5, _) => raise Hojfeld "5" (*act5(stack)*) | (6, _) => raise Hojfeld "6" (*act6(stack)*) | (7, _) => raise Hojfeld "7" (*act7(stack)*) | (8, _) => raise Hojfeld "8" (*act8(stack,defaultPos)*) | (9, _) => raise Hojfeld "9" (*act9(stack)*) | (10,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 76,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (11,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.data_name((USERDEFINEDWORD)) in (hojfelds_NT 96,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (12,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (13,(_,(_,_,qdata_name1right))::_::(_,(_,USERDEFINEDWORD1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,qdata_name1right), rest671) end | (14,(_,(_,_,qdata_name1right))::_::(_,(_,USERDEFINEDWORD1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,qdata_name1right), rest671) end | (15,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 389,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (16,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.file_name((USERDEFINEDWORD)) in (hojfelds_NT 200,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (17,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.index_name((USERDEFINEDWORD)) in (hojfelds_NT 244,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (18,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.mnemonic_name((USERDEFINEDWORD)) in (hojfelds_NT 309,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (19,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 415,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (20,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 291,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (21,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 374,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (22,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.text_name((USERDEFINEDWORD)) in (hojfelds_NT 486,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (23,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.paragraph_name((USERDEFINEDWORD)) in (hojfelds_NT 357,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (24,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.paragraph_name((INTEGER)) in (hojfelds_NT 357,(result,INTEGER1left,INTEGER1right),rest671) end | (25,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.section_name((USERDEFINEDWORD)) in (hojfelds_NT 422,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (26,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.section_name((INTEGER)) in (hojfelds_NT 422,(result,INTEGER1left,INTEGER1right),rest671) end | (27,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.level_number((INTEGER)) in (hojfelds_NT 290,(result,INTEGER1left,INTEGER1right),rest671) end | (28,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.system_name((USERDEFINEDWORD)) in (hojfelds_NT 478,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (29,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 74,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (30,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 286,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (31,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZERO1left,ZERO1right),rest671) end | (32,(_,(_,ZEROS1left,ZEROS1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZEROS1left,ZEROS1right),rest671) end | (33,(_,(_,ZEROES1left,ZEROES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZEROES1left,ZEROES1right),rest671) end | (34,(_,(_,SPACE1left,SPACE1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.SPACE)) in (hojfelds_NT 288,(result,SPACE1left,SPACE1right),rest671) end | (35,(_,(_,SPACES1left,SPACES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.SPACE)) in (hojfelds_NT 288,(result,SPACES1left,SPACES1right),rest671) end | (36,(_,(_,HIGHVALUE1left,HIGHVALUE1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.HIGHVALUE)) in (hojfelds_NT 288,(result,HIGHVALUE1left,HIGHVALUE1right),rest671) end | (37,(_,(_,HIGHVALUES1left,HIGHVALUES1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.HIGHVALUE)) in (hojfelds_NT 288,(result,HIGHVALUES1left,HIGHVALUES1right),rest671) end | (38,(_,(_,LOWVALUE1left,LOWVALUE1right))::rest671) => let val result =MlyValue.figurative_constant((Cobol.LOWVALUE)) in (hojfelds_NT 288,(result,LOWVALUE1left,LOWVALUE1right),rest671) end | (39,(_,(_,LOWVALUES1left,LOWVALUES1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.LOWVALUE)) in (hojfelds_NT 288,(result,LOWVALUES1left,LOWVALUES1right),rest671) end | (40,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.QUOTE)) in (hojfelds_NT 288,(result,QUOTE1left,QUOTE1right),rest671) end | (41,(_,(_,QUOTES1left,QUOTES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.QUOTE)) in (hojfelds_NT 288,(result,QUOTES1left,QUOTES1right),rest671) end | (42,(_,(_,_,ZERO1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZERO1right),rest671) end | (43,(_,(_,_,ZEROS1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZEROS1right),rest671) end | (44,(_,(_,_,ZEROES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZEROES1right),rest671) end | (45,(_,(_,_,SPACE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_SPACE)) in (hojfelds_NT 288,(result,ALL1left,SPACE1right),rest671) end | (46,(_,(_,_,SPACES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_SPACE)) in (hojfelds_NT 288,(result,ALL1left,SPACES1right),rest671) end | (47,(_,(_,_,HIGHVALUE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_HIGHVALUE)) in (hojfelds_NT 288,(result,ALL1left,HIGHVALUE1right),rest671) end | (48,(_,(_,_,HIGHVALUES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_HIGHVALUE)) in (hojfelds_NT 288,(result,ALL1left,HIGHVALUES1right),rest671) end | (49,(_,(_,_,LOWVALUE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_LOWVALUE)) in (hojfelds_NT 288,(result,ALL1left,LOWVALUE1right),rest671) end | (50,(_,(_,_,LOWVALUES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_LOWVALUE)) in (hojfelds_NT 288,(result,ALL1left,LOWVALUES1right),rest671) end | (51,(_,(_,_,QUOTE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_QUOTE)) in (hojfelds_NT 288,(result,ALL1left,QUOTE1right),rest671) end | (52,(_,(_,_,QUOTES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_QUOTE)) in (hojfelds_NT 288,(result,ALL1left,QUOTES1right),rest671) end | (53,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL,_, NONNUMERICLITERAL1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant(( Cobol.ALL_NONNUMERICLITERAL(NONNUMERICLITERAL))) in (hojfelds_NT 288,(result,ALL1left,NONNUMERICLITERAL1right),rest671) end | (54,(_,(_,LINAGECOUNTER1left,LINAGECOUNTER1right))::rest671) => let val result=MlyValue.special_register((Cobol.LINAGECOUNTER)) in (hojfelds_NT 181,(result,LINAGECOUNTER1left,LINAGECOUNTER1right), rest671) end | (55,(_,(_,DEBUGITEM1left,DEBUGITEM1right))::rest671) => let val result=MlyValue.special_register((Cobol.DEBUGITEM)) in (hojfelds_NT 181,(result,DEBUGITEM1left,DEBUGITEM1right),rest671) end | (56,(_,(_,PERIOD1left,PERIOD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 361,(result,PERIOD1left,PERIOD1right),rest671) end | (57,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 361,(result,defaultPos,defaultPos),rest671) end | (58,(_,(_,data_name1left,data_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 100,(result,data_name1left,data_name1right),rest671) end | (59,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 100,(result,defaultPos,defaultPos),rest671) end | (60,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 369,(result,procedure_name1left,procedure_name1right), rest671) end | (61,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 369,(result,defaultPos,defaultPos),rest671) end | (62,(_,(_,routine_name1left,routine_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 183,(result,routine_name1left,routine_name1right), rest671) end | (63,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 183,(result,defaultPos,defaultPos),rest671) end | (64,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.segment_number_opt(( Cobol.SEGMENT_NUMBER(INTEGER))) in (hojfelds_NT 428,(result,INTEGER1left,INTEGER1right),rest671) end | (65,rest671) => let val result=MlyValue.segment_number_opt(( Cobol.NOSEGMENT_NUMBER)) in (hojfelds_NT 428,(result,defaultPos,defaultPos),rest671) end | (66,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,( MlyValue.data_names data_names,data_names1left,_))::rest671) => let val result=MlyValue.data_names(( Cobol.DATA_NAMES(data_names,data_name ))) in (hojfelds_NT 97,(result,data_names1left,data_name1right),rest671) end | (67,(_,(MlyValue.data_name data_name,data_name1left,data_name1right) )::rest671) => let val result=MlyValue.data_names(( Cobol.ONE_DATA_NAME(data_name))) in (hojfelds_NT 97,(result,data_name1left,data_name1right),rest671) end | (68,(_,(_,_,qdata_name1right))::(_,(_,qdata_names1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 99,(result,qdata_names1left,qdata_name1right),rest671) end | (69,(_,(_,qdata_name1left,qdata_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 99,(result,qdata_name1left,qdata_name1right),rest671) end | (70,(_,(_,_,file_name1right))::(_,(_,file_names1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 203,(result,file_names1left,file_name1right),rest671) end | (71,(_,(_,file_name1left,file_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 203,(result,file_name1left,file_name1right),rest671) end | (72,(_,(MlyValue.index_name index_name,_,index_name1right))::(_,( MlyValue.index_names index_names,index_names1left,_))::rest671) => let val result=MlyValue.index_names(( Cobol.SEVERAL_INDEX_NAMES(index_names,index_name))) in (hojfelds_NT 245,(result,index_names1left,index_name1right),rest671 ) end | (73,(_,(MlyValue.index_name index_name,index_name1left, index_name1right))::rest671) => let val result=MlyValue.index_names(( Cobol.ONE_INDEX_NAME(index_name))) in (hojfelds_NT 245,(result,index_name1left,index_name1right),rest671) end | (74,(_,(_,_,procedure_name1right))::(_,(_,procedure_names1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 370,(result,procedure_names1left,procedure_name1right) ,rest671) end | (75,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 370,(result,procedure_name1left,procedure_name1right), rest671) end | (76,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 106,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (77,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 368,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (78,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 368,(result,INTEGER1left,INTEGER1right),rest671) end | (79,(_,(_,SYSTEMCONSOLE1left,SYSTEMCONSOLE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,SYSTEMCONSOLE1left,SYSTEMCONSOLE1right), rest671) end | (80,(_,(_,REQUESTOR1left,REQUESTOR1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,REQUESTOR1left,REQUESTOR1right),rest671) end | (81,(_,(_,LOCALDATA1left,LOCALDATA1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,LOCALDATA1left,LOCALDATA1right),rest671) end | (82,(_,(_,ATTRIBUTEDATA1left,ATTRIBUTEDATA1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,ATTRIBUTEDATA1left,ATTRIBUTEDATA1right), rest671) end | (83,(_,(_,C011left,C011right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,C011left,C011right),rest671) end | (84,(_,(_,CSP1left,CSP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,CSP1left,CSP1right),rest671) end | (85,(_,(_,SYSTEMSHUTDOWN1left,SYSTEMSHUTDOWN1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,SYSTEMSHUTDOWN1left,SYSTEMSHUTDOWN1right), rest671) end | (86,(_,(_,UPSI01left,UPSI01right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI01left,UPSI01right),rest671) end | (87,(_,(_,UPSI11left,UPSI11right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI11left,UPSI11right),rest671) end | (88,(_,(_,UPSI21left,UPSI21right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI21left,UPSI21right),rest671) end | (89,(_,(_,UPSI31left,UPSI31right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI31left,UPSI31right),rest671) end | (90,(_,(_,UPSI41left,UPSI41right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI41left,UPSI41right),rest671) end | (91,(_,(_,UPSI51left,UPSI51right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI51left,UPSI51right),rest671) end | (92,(_,(_,UPSI61left,UPSI61right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI61left,UPSI61right),rest671) end | (93,(_,(_,UPSI71left,UPSI71right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI71left,UPSI71right),rest671) end | (94,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 47,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (95,(_,(_,ADVANCING1left,ADVANCING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 11,(result,ADVANCING1left,ADVANCING1right),rest671) end | (96,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 11,(result,defaultPos,defaultPos),rest671) end | (97,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 15,(result,ALL1left,ALL1right),rest671) end | (98,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 15,(result,defaultPos,defaultPos),rest671) end | (99,(_,(_,ARE1left,ARE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 38,(result,ARE1left,ARE1right),rest671) end | (100,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 38,(result,defaultPos,defaultPos),rest671) end | (101,(_,(_,AREA1left,AREA1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 39,(result,AREA1left,AREA1right),rest671) end | (102,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 39,(result,defaultPos,defaultPos),rest671) end | (103,(_,(_,AREAS1left,AREAS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,AREAS1left,AREAS1right),rest671) end | (104,(_,(_,AREA1left,AREA1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,AREA1left,AREA1right),rest671) end | (105,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,defaultPos,defaultPos),rest671) end | (106,(_,(_,_,for_opt1right))::(_,(_,area1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 40,(result,area1left,for_opt1right),rest671) end | (107,(_,(_,AT1left,AT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 48,(result,AT1left,AT1right),rest671) end | (108,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 48,(result,defaultPos,defaultPos),rest671) end | (109,(_,(_,BY1left,BY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 54,(result,BY1left,BY1right),rest671) end | (110,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 54,(result,defaultPos,defaultPos),rest671) end | (111,(_,(_,CHARACTER1left,CHARACTER1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 59,(result,CHARACTER1left,CHARACTER1right),rest671) end | (112,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 59,(result,defaultPos,defaultPos),rest671) end | (113,(_,(_,CHARACTERS1left,CHARACTERS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 61,(result,CHARACTERS1left,CHARACTERS1right),rest671) end | (114,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 61,(result,defaultPos,defaultPos),rest671) end | (115,(_,(_,COLLATING1left,COLLATING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 66,(result,COLLATING1left,COLLATING1right),rest671) end | (116,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 66,(result,defaultPos,defaultPos),rest671) end | (117,(_,(_,CONTAINS1left,CONTAINS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 78,(result,CONTAINS1left,CONTAINS1right),rest671) end | (118,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 78,(result,defaultPos,defaultPos),rest671) end | (119,(_,(_,EVERY1left,EVERY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 159,(result,EVERY1left,EVERY1right),rest671) end | (120,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 159,(result,defaultPos,defaultPos),rest671) end | (121,(_,(_,FILE1left,FILE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 166,(result,FILE1left,FILE1right),rest671) end | (122,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 166,(result,defaultPos,defaultPos),rest671) end | (123,(_,(_,FILLER1left,FILLER1right))::rest671) => let val result= MlyValue.filler((Cobol.FILLER)) in (hojfelds_NT 496,(result,FILLER1left,FILLER1right),rest671) end | (124,rest671) => let val result=MlyValue.filler((Cobol.NO_FILLER)) in (hojfelds_NT 496,(result,defaultPos,defaultPos),rest671) end | (125,(_,(_,FOR1left,FOR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 213,(result,FOR1left,FOR1right),rest671) end | (126,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 213,(result,defaultPos,defaultPos),rest671) end | (127,(_,(_,_,REMOVAL1right))::(_,(_,for_opt1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 214,(result,for_opt1left,REMOVAL1right),rest671) end | (128,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 214,(result,defaultPos,defaultPos),rest671) end | (129,(_,(_,INITIAL1left,INITIAL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 253,(result,INITIAL1left,INITIAL1right),rest671) end | (130,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 253,(result,defaultPos,defaultPos),rest671) end | (131,(_,(_,IN1left,IN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 242,(result,IN1left,IN1right),rest671) end | (132,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 242,(result,defaultPos,defaultPos),rest671) end | (133,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 278,(result,IS1left,IS1right),rest671) end | (134,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 278,(result,defaultPos,defaultPos),rest671) end | (135,(_,(_,_,NOT1right))::(_,(_,IS1left,_))::rest671) => let val result=MlyValue.is_not((Cobol.IS_NOT_NOT)) in (hojfelds_NT 279,(result,IS1left,NOT1right),rest671) end | (136,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.is_not((Cobol.IS_NOT_IS)) in (hojfelds_NT 279,(result,IS1left,IS1right),rest671) end | (137,(_,(_,NOT1left,NOT1right))::rest671) => let val result= MlyValue.is_not((Cobol.IS_NOT_NOT)) in (hojfelds_NT 279,(result,NOT1left,NOT1right),rest671) end | (138,rest671) => let val result=MlyValue.is_not((Cobol.IS_NOT_IS)) in (hojfelds_NT 279,(result,defaultPos,defaultPos),rest671) end | (139,(_,(_,KEY1left,KEY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 282,(result,KEY1left,KEY1right),rest671) end | (140,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 282,(result,defaultPos,defaultPos),rest671) end | (141,(_,(_,LINE1left,LINE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 294,(result,LINE1left,LINE1right),rest671) end | (142,(_,(_,lines1left,lines1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 294,(result,lines1left,lines1right),rest671) end | (143,(_,(_,LINES1left,LINES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 295,(result,LINES1left,LINES1right),rest671) end | (144,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 295,(result,defaultPos,defaultPos),rest671) end | (145,(_,(_,_,is1right))::(_,(_,MODE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 313,(result,MODE1left,is1right),rest671) end | (146,(_,(_,is1left,is1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 313,(result,is1left,is1right),rest671) end | (147,(_,(_,NEXT1left,NEXT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,NEXT1left,NEXT1right),rest671) end | (148,(_,(_,FIRST1left,FIRST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,FIRST1left,FIRST1right),rest671) end | (149,(_,(_,LAST1left,LAST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,LAST1left,LAST1right),rest671) end | (150,(_,(_,PRIOR1left,PRIOR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,PRIOR1left,PRIOR1right),rest671) end | (151,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,defaultPos,defaultPos),rest671) end | (152,(_,(_,OF1left,OF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 331,(result,OF1left,OF1right),rest671) end | (153,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 331,(result,defaultPos,defaultPos),rest671) end | (154,(_,(_,ON1left,ON1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 335,(result,ON1left,ON1right),rest671) end | (155,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 335,(result,defaultPos,defaultPos),rest671) end | (156,(_,(_,OPTIONAL1left,OPTIONAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 348,(result,OPTIONAL1left,OPTIONAL1right),rest671) end | (157,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 348,(result,defaultPos,defaultPos),rest671) end | (158,(_,(_,_,is1right))::(_,(_,ORGANIZATION1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 352,(result,ORGANIZATION1left,is1right),rest671) end | (159,(_,(_,_,TO1right))::(_,(_,PROCEED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 371,(result,PROCEED1left,TO1right),rest671) end | (160,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 371,(result,defaultPos,defaultPos),rest671) end | (161,(_,(_,_,COLLATING1right))::(_,(_,PROGRAM1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,PROGRAM1left,COLLATING1right),rest671) end | (162,(_,(_,PROGRAM1left,PROGRAM1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,PROGRAM1left,PROGRAM1right),rest671) end | (163,(_,(_,COLLATING1left,COLLATING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,COLLATING1left,COLLATING1right),rest671) end | (164,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,defaultPos,defaultPos),rest671) end | (165,(_,(_,RECORD1left,RECORD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 378,(result,RECORD1left,RECORD1right),rest671) end | (166,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 378,(result,defaultPos,defaultPos),rest671) end | (167,(_,(_,RIGHT1left,RIGHT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 413,(result,RIGHT1left,RIGHT1right),rest671) end | (168,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 413,(result,defaultPos,defaultPos),rest671) end | (169,(_,(_,ROUNDED1left,ROUNDED1right))::rest671) => let val result= MlyValue.rounded((Cobol.ROUNDED)) in (hojfelds_NT 414,(result,ROUNDED1left,ROUNDED1right),rest671) end | (170,rest671) => let val result=MlyValue.rounded((Cobol.NOT_ROUNDED) ) in (hojfelds_NT 414,(result,defaultPos,defaultPos),rest671) end | (171,(_,(_,_,character1right))::(_,(_,SEPARATE1left,_))::rest671) => let val result=MlyValue.separate_character((Cobol.SEPARATE)) in (hojfelds_NT 431,(result,SEPARATE1left,character1right),rest671) end | (172,rest671) => let val result=MlyValue.separate_character(( Cobol.NO_SEPARATE)) in (hojfelds_NT 431,(result,defaultPos,defaultPos),rest671) end | (173,(_,(_,_,IS1right))::(_,(_,SIGN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 437,(result,SIGN1left,IS1right),rest671) end | (174,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 437,(result,IS1left,IS1right),rest671) end | (175,(_,(_,_,is1right))::(_,(_,SIGN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 438,(result,SIGN1left,is1right),rest671) end | (176,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 438,(result,defaultPos,defaultPos),rest671) end | (177,(_,(_,SIZE1left,SIZE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 440,(result,SIZE1left,SIZE1right),rest671) end | (178,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 440,(result,defaultPos,defaultPos),rest671) end | (179,(_,(_,STANDARD1left,STANDARD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 455,(result,STANDARD1left,STANDARD1right),rest671) end | (180,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 455,(result,defaultPos,defaultPos),rest671) end | (181,(_,(_,_,IS1right))::(_,(_,STATUS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 464,(result,STATUS1left,IS1right),rest671) end | (182,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 464,(result,IS1left,IS1right),rest671) end | (183,(_,(_,_,CONTAINS1right))::(_,(_,TAPE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,TAPE1left,CONTAINS1right),rest671) end | (184,(_,(_,TAPE1left,TAPE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,TAPE1left,TAPE1right),rest671) end | (185,(_,(_,CONTAINS1left,CONTAINS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,CONTAINS1left,CONTAINS1right),rest671) end | (186,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,defaultPos,defaultPos),rest671) end | (187,(_,(_,THAN1left,THAN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 487,(result,THAN1left,THAN1right),rest671) end | (188,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 487,(result,defaultPos,defaultPos),rest671) end | (189,(_,(_,THEN1left,THEN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 488,(result,THEN1left,THEN1right),rest671) end | (190,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 488,(result,defaultPos,defaultPos),rest671) end | (191,(_,(_,TIMES1left,TIMES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 497,(result,TIMES1left,TIMES1right),rest671) end | (192,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 497,(result,defaultPos,defaultPos),rest671) end | (193,(_,(_,TO1left,TO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 499,(result,TO1left,TO1right),rest671) end | (194,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 499,(result,defaultPos,defaultPos),rest671) end | (195,(_,(_,_,is1right))::(_,(_,USAGE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 508,(result,USAGE1left,is1right),rest671) end | (196,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 508,(result,defaultPos,defaultPos),rest671) end | (197,(_,(_,WHEN1left,WHEN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 524,(result,WHEN1left,WHEN1right),rest671) end | (198,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 524,(result,defaultPos,defaultPos),rest671) end | (199,(_,(_,WITH1left,WITH1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 528,(result,WITH1left,WITH1right),rest671) end | (200,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 528,(result,defaultPos,defaultPos),rest671) end | (201,(_,(_,CORRESPONDING1left,CORRESPONDING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 82,(result,CORRESPONDING1left,CORRESPONDING1right), rest671) end | (202,(_,(_,CORR1left,CORR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 82,(result,CORR1left,CORR1right),rest671) end | (203,(_,(_,JUSTIFIED1left,JUSTIFIED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 280,(result,JUSTIFIED1left,JUSTIFIED1right),rest671) end | (204,(_,(_,JUST1left,JUST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 280,(result,JUST1left,JUST1right),rest671) end | (205,(_,(_,PICTURE1left,PICTURE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 362,(result,PICTURE1left,PICTURE1right),rest671) end | (206,(_,(_,PIC1left,PIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 362,(result,PIC1left,PIC1right),rest671) end | (207,(_,(_,SYNCHRONIZED1left,SYNCHRONIZED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 474,(result,SYNCHRONIZED1left,SYNCHRONIZED1right), rest671) end | (208,(_,(_,SYNC1left,SYNC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 474,(result,SYNC1left,SYNC1right),rest671) end | (209,(_,(_,THROUGH1left,THROUGH1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 491,(result,THROUGH1left,THROUGH1right),rest671) end | (210,(_,(_,THRU1left,THRU1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 491,(result,THRU1left,THRU1right),rest671) end | (211,(_,(_,ENDADD1left,ENDADD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 131,(result,ENDADD1left,ENDADD1right),rest671) end | (212,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 131,(result,defaultPos,defaultPos),rest671) end | (213,(_,(_,ENDCALL1left,ENDCALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 132,(result,ENDCALL1left,ENDCALL1right),rest671) end | (214,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 132,(result,defaultPos,defaultPos),rest671) end | (215,(_,(_,ENDCOMPUTE1left,ENDCOMPUTE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 133,(result,ENDCOMPUTE1left,ENDCOMPUTE1right),rest671) end | (216,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 133,(result,defaultPos,defaultPos),rest671) end | (217,(_,(_,ENDDELETE1left,ENDDELETE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 134,(result,ENDDELETE1left,ENDDELETE1right),rest671) end | (218,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 134,(result,defaultPos,defaultPos),rest671) end | (219,(_,(_,ENDDIVIDE1left,ENDDIVIDE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 135,(result,ENDDIVIDE1left,ENDDIVIDE1right),rest671) end | (220,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 135,(result,defaultPos,defaultPos),rest671) end | (221,(_,(_,ENDIF1left,ENDIF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 138,(result,ENDIF1left,ENDIF1right),rest671) end | (222,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 138,(result,defaultPos,defaultPos),rest671) end | (223,(_,(_,ENDMULTIPLY1left,ENDMULTIPLY1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 139,(result,ENDMULTIPLY1left,ENDMULTIPLY1right), rest671) end | (224,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 139,(result,defaultPos,defaultPos),rest671) end | (225,(_,(_,ENDREAD1left,ENDREAD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 142,(result,ENDREAD1left,ENDREAD1right),rest671) end | (226,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 142,(result,defaultPos,defaultPos),rest671) end | (227,(_,(_,ENDRETURN1left,ENDRETURN1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 143,(result,ENDRETURN1left,ENDRETURN1right),rest671) end | (228,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 143,(result,defaultPos,defaultPos),rest671) end | (229,(_,(_,ENDREWRITE1left,ENDREWRITE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 144,(result,ENDREWRITE1left,ENDREWRITE1right),rest671) end | (230,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 144,(result,defaultPos,defaultPos),rest671) end | (231,(_,(_,ENDSEARCH1left,ENDSEARCH1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 145,(result,ENDSEARCH1left,ENDSEARCH1right),rest671) end | (232,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 145,(result,defaultPos,defaultPos),rest671) end | (233,(_,(_,ENDSTART1left,ENDSTART1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 182,(result,ENDSTART1left,ENDSTART1right),rest671) end | (234,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 182,(result,defaultPos,defaultPos),rest671) end | (235,(_,(_,ENDSTRING1left,ENDSTRING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 146,(result,ENDSTRING1left,ENDSTRING1right),rest671) end | (236,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 146,(result,defaultPos,defaultPos),rest671) end | (237,(_,(_,ENDSUBTRACT1left,ENDSUBTRACT1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 147,(result,ENDSUBTRACT1left,ENDSUBTRACT1right), rest671) end | (238,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 147,(result,defaultPos,defaultPos),rest671) end | (239,(_,(_,ENDUNSTRING1left,ENDUNSTRING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 149,(result,ENDUNSTRING1left,ENDUNSTRING1right), rest671) end | (240,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 149,(result,defaultPos,defaultPos),rest671) end | (241,(_,(_,ENDWRITE1left,ENDWRITE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 150,(result,ENDWRITE1left,ENDWRITE1right),rest671) end | (242,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 150,(result,defaultPos,defaultPos),rest671) end | (243,(_,(MlyValue.identifier identifier,_,identifier1right))::(_,( MlyValue.identifiers identifiers,identifiers1left,_))::rest671) => let val result=MlyValue.identifiers(( Cobol.SEVERAL_IDENTIFIERS(identifiers,identifier))) in (hojfelds_NT 239,(result,identifiers1left,identifier1right),rest671 ) end | (244,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result=MlyValue.identifiers(( Cobol.ONE_IDENTIFIER(identifier))) in (hojfelds_NT 239,(result,identifier1left,identifier1right),rest671) end | (245,(_,(MlyValue.subscript_phrase subscript_phrase,_, subscript_phraseright as subscript_phrase1right))::(_,( MlyValue.qualifications qualifications,_,_))::(_,( MlyValue.USERDEFINEDWORD USERDEFINEDWORD,USERDEFINEDWORDleft as USERDEFINEDWORD1left,_))::rest671) => let val result= MlyValue.identifier(( Cobol.QUALIFIED_IDENTIFIER(USERDEFINEDWORD, qualifications, subscript_phrase, USERDEFINEDWORDleft, subscript_phraseright) )) in (hojfelds_NT 228,(result,USERDEFINEDWORD1left, subscript_phrase1right),rest671) end | (246,(_,(MlyValue.special_register special_register, special_registerleft as special_register1left,special_registerright as special_register1right))::rest671) => let val result= MlyValue.identifier(( Cobol.SPECIAL_REGISTER(special_register,special_registerleft,special_registerright) )) in (hojfelds_NT 228,(result,special_register1left, special_register1right),rest671) end | (247,(_,(MlyValue.qualification qualification,_,qualification1right) )::(_,(MlyValue.qualifications qualifications,qualifications1left,_)) ::rest671) => let val result=MlyValue.qualifications(( Cobol.SEVERAL_QUALIFICATIONS(qualifications,qualification))) in (hojfelds_NT 376,(result,qualifications1left,qualification1right), rest671) end | (248,rest671) => let val result=MlyValue.qualifications(( Cobol.NO_QUALIFICATIONS)) in (hojfelds_NT 376,(result,defaultPos,defaultPos),rest671) end | (249,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD,_, USERDEFINEDWORD1right))::(_,(_,of_in1left,_))::rest671) => let val result=MlyValue.qualification((USERDEFINEDWORD)) in (hojfelds_NT 375,(result,of_in1left,USERDEFINEDWORD1right),rest671) end | (250,(_,(_,OF1left,OF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 330,(result,OF1left,OF1right),rest671) end | (251,(_,(_,IN1left,IN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 330,(result,IN1left,IN1right),rest671) end | (252,(_,(_,_,RPAR1right))::_::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.subscript_phrase(()) in (hojfelds_NT 471,(result,LPAR1left,RPAR1right),rest671) end | (253,rest671) => let val result=MlyValue.subscript_phrase(()) in (hojfelds_NT 471,(result,defaultPos,defaultPos),rest671) end | (254,(_,(_,_,subscript1right))::(_,(_,subscripts1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 472,(result,subscripts1left,subscript1right),rest671) end | (255,(_,(_,subscript1left,subscript1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 472,(result,subscript1left,subscript1right),rest671) end | (256,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 470,(result,INTEGER1left,INTEGER1right),rest671) end | (257,(_,(_,_,offset1right))::(_,(_,data_or_index_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 470,(result,data_or_index_name1left,offset1right), rest671) end | (258,(_,(_,_,INTEGER1right))::(_,(_,PLUSSYMBOL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,PLUSSYMBOL1left,INTEGER1right),rest671) end | (259,(_,(_,_,INTEGER1right))::(_,(_,MINUSSYMBOL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,MINUSSYMBOL1left,INTEGER1right),rest671) end | (260,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,defaultPos,defaultPos),rest671) end | (261,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_literal(( Cobol.DATA_NAME_OR_LITERAL_IS_DATA_NAME(data_name))) in (hojfelds_NT 105,(result,data_name1left,data_name1right),rest671) end | (262,(_,(MlyValue.literal literal,literal1left,literal1right)):: rest671) => let val result=MlyValue.data_name_or_literal(( Cobol.DATA_NAME_OR_LITERAL_IS_LITERAL(literal))) in (hojfelds_NT 105,(result,literal1left,literal1right),rest671) end | (263,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_integer(( Cobol.DATA_NAME_OR_INTEGER_IS_DATA_NAME(data_name))) in (hojfelds_NT 101,(result,data_name1left,data_name1right),rest671) end | (264,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.data_name_or_integer(( Cobol.DATA_NAME_OR_INTEGER_IS_INTEGER(INTEGER))) in (hojfelds_NT 101,(result,INTEGER1left,INTEGER1right),rest671) end | (265,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_filler(( Cobol.DATA_NAME_OR_FILLER_IS_DATA_NAME(data_name))) in (hojfelds_NT 366,(result,data_name1left,data_name1right),rest671) end | (266,(_,(MlyValue.filler filler,filler1left,filler1right))::rest671) => let val result=MlyValue.data_name_or_filler(( Cobol.DATA_NAME_OR_FILLER_IS_FILLER(filler))) in (hojfelds_NT 366,(result,filler1left,filler1right),rest671) end | (267,(_,(MlyValue.identifier_or_literal identifier_or_literal,_, identifier_or_literal1right))::(_,(MlyValue.identifier_or_literals identifier_or_literals,identifier_or_literals1left,_))::rest671) => let val result=MlyValue.identifier_or_literals(( Cobol.SEVERAL_IDENTIFIER_OR_LITERALS(identifier_or_literals, identifier_or_literal) )) in (hojfelds_NT 234,(result,identifier_or_literals1left, identifier_or_literal1right),rest671) end | (268,(_,(MlyValue.identifier_or_literal identifier_or_literal, identifier_or_literal1left,identifier_or_literal1right))::rest671) => let val result=MlyValue.identifier_or_literals(( Cobol.ONE_IDENTIFIER_OR_LITERAL(identifier_or_literal))) in (hojfelds_NT 234,(result,identifier_or_literal1left, identifier_or_literal1right),rest671) end | (269,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result= MlyValue.identifier_or_literal(( Cobol.IDENTIFIER_OR_LITERAL_IS_IDENTIFIER(identifier))) in (hojfelds_NT 233,(result,identifier1left,identifier1right),rest671) end | (270,(_,(MlyValue.literal literal,literal1left,literal1right)):: rest671) => let val result=MlyValue.identifier_or_literal(( Cobol.IDENTIFIER_OR_LITERAL_IS_LITERAL(literal))) in (hojfelds_NT 233,(result,literal1left,literal1right),rest671) end | (271,(_,(_,_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, _))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 94,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (272,(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 94,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (273,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,identifier1left,identifier1right),rest671) end | (274,(_,(_,nonnumeric_literal1left,nonnumeric_literal1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,nonnumeric_literal1left, nonnumeric_literal1right),rest671) end | (275,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZERO1left,ZERO1right),rest671) end | (276,(_,(_,ZEROS1left,ZEROS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZEROS1left,ZEROS1right),rest671) end | (277,(_,(_,ZEROES1left,ZEROES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZEROES1left,ZEROES1right),rest671) end | (278,(_,(_,SPACE1left,SPACE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,SPACE1left,SPACE1right),rest671) end | (279,(_,(_,SPACES1left,SPACES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,SPACES1left,SPACES1right),rest671) end | (280,(_,(_,HIGHVALUE1left,HIGHVALUE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,HIGHVALUE1left,HIGHVALUE1right),rest671) end | (281,(_,(_,HIGHVALUES1left,HIGHVALUES1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,HIGHVALUES1left,HIGHVALUES1right),rest671) end | (282,(_,(_,LOWVALUE1left,LOWVALUE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,LOWVALUE1left,LOWVALUE1right),rest671) end | (283,(_,(_,LOWVALUES1left,LOWVALUES1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,LOWVALUES1left,LOWVALUES1right),rest671) end | (284,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,QUOTE1left,QUOTE1right),rest671) end | (285,(_,(_,QUOTES1left,QUOTES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,QUOTES1left,QUOTES1right),rest671) end | (286,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 232,(result,identifier1left,identifier1right),rest671) end | (287,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 232,(result,INTEGER1left,INTEGER1right),rest671) end | (288,(_,(MlyValue.test_cobol_programs test_cobol_programs, test_cobol_programs1left,test_cobol_programs1right))::rest671) => let val result=MlyValue.test_cobol(( Cobol.TEST(test_cobol_programs) )) in (hojfelds_NT 3,(result,test_cobol_programs1left, test_cobol_programs1right),rest671) end | (289,(_,(MlyValue.cobol_program cobol_program,cobol_program1left, cobol_program1right))::rest671) => let val result=MlyValue.test_cobol( ( Cobol.COBOL_PROGRAM(cobol_program))) in (hojfelds_NT 3,(result,cobol_program1left,cobol_program1right), rest671) end | (290,(_,(MlyValue.test_cobol_program test_cobol_program,_, test_cobol_program1right))::(_,(MlyValue.test_cobol_programs test_cobol_programs,test_cobol_programs1left,_))::rest671) => let val result=MlyValue.test_cobol_programs(( Cobol.TEST_COBOL_PROGRAMS(test_cobol_programs, test_cobol_program))) in (hojfelds_NT 1,(result,test_cobol_programs1left, test_cobol_program1right),rest671) end | (291,(_,(MlyValue.test_cobol_program test_cobol_program, test_cobol_program1left,test_cobol_program1right))::rest671) => let val result=MlyValue.test_cobol_programs(( Cobol.TEST_COBOL_PROGRAM(test_cobol_program))) in (hojfelds_NT 1,(result,test_cobol_program1left, test_cobol_program1right),rest671) end | (292,(_,(_,_,PROGEND1right))::(_,(MlyValue.cobol_program cobol_program,_,_))::(_,(_,PROGBEGIN1left,_))::rest671) => let val result=MlyValue.test_cobol_program((cobol_program)) in (hojfelds_NT 2,(result,PROGBEGIN1left,PROGEND1right),rest671) end | (293,(_,(MlyValue.procedure_division procedure_division,_, procedure_division1right))::(_,(MlyValue.data_division data_division,_ ,_))::(_,(MlyValue.environment_division environment_division,_,_))::(_ ,(MlyValue.identification_division identification_division,_,_))::(_,( _,process_statement1left,_))::rest671) => let val result= MlyValue.cobol_program(( condition_names := []; Cobol.PROGRAM(identification_division, environment_division, data_division, procedure_division) )) in (hojfelds_NT 0,(result,process_statement1left, procedure_division1right),rest671) end | (294,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 4,(result,defaultPos,defaultPos),rest671) end | (295,(_,(_,_,process_options1right))::(_,(_,PROCESS1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 4,(result,PROCESS1left,process_options1right),rest671) end | (296,(_,(_,_,process_option1right))::(_,(_,process_options1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 5,(result,process_options1left,process_option1right), rest671) end | (297,(_,(_,process_option1left,process_option1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 5,(result,process_option1left,process_option1right), rest671) end | (298,(_,(_,SLASHSYMBOL1left,SLASHSYMBOL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SLASHSYMBOL1left,SLASHSYMBOL1right),rest671) end | (299,(_,(_,SORT1left,SORT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SORT1left,SORT1right),rest671) end | (300,(_,(_,SOURCE1left,SOURCE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SOURCE1left,SOURCE1right),rest671) end | (301,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,QUOTE1left,QUOTE1right),rest671) end | (302,(_,(_,PERIOD1left,PERIOD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,PERIOD1left,PERIOD1right),rest671) end | (303,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right), rest671) end | (304,(_,(_,COMP1left,COMP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,COMP1left,COMP1right),rest671) end | (305,(_,(_,LPAR1left,LPAR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,LPAR1left,LPAR1right),rest671) end | (306,(_,(_,RPAR1left,RPAR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,RPAR1left,RPAR1right),rest671) end | (307,(_,(_,_,identification_paragraphs1right))::_::_::_::(_,(_, IDENTIFICATION1left,_))::rest671) => let val result= MlyValue.identification_division(()) in (hojfelds_NT 225,(result,IDENTIFICATION1left, identification_paragraphs1right),rest671) end | (308,(_,(_,_,PERIOD2right))::_::_::(_,(_,PROGRAMID1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 104,(result,PROGRAMID1left,PERIOD2right),rest671) end | (309,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 104,(result,defaultPos,defaultPos),rest671) end | (310,(_,(_,_,identification_paragraph1right))::(_,(_, identification_paragraphs1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 227,(result,identification_paragraphs1left, identification_paragraph1right),rest671) end | (311,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 227,(result,defaultPos,defaultPos),rest671) end | (312,(_,(_,author_paragraph1left,author_paragraph1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,author_paragraph1left, author_paragraph1right),rest671) end | (313,(_,(_,installation_paragraph1left,installation_paragraph1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,installation_paragraph1left, installation_paragraph1right),rest671) end | (314,(_,(_,date_written_paragraph1left,date_written_paragraph1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,date_written_paragraph1left, date_written_paragraph1right),rest671) end | (315,(_,(_,date_compiled_paragraph1left, date_compiled_paragraph1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,date_compiled_paragraph1left, date_compiled_paragraph1right),rest671) end | (316,(_,(_,security_paragraph1left,security_paragraph1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,security_paragraph1left, security_paragraph1right),rest671) end | (317,(_,(_,_,comment_entry1right))::(_,(_,AUTHOR1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 50,(result,AUTHOR1left,comment_entry1right),rest671) end | (318,(_,(_,_,comment_entry1right))::(_,(_,INSTALLATION1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 264,(result,INSTALLATION1left,comment_entry1right), rest671) end | (319,(_,(_,_,comment_entry1right))::(_,(_,DATEWRITTEN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 114,(result,DATEWRITTEN1left,comment_entry1right), rest671) end | (320,(_,(_,_,comment_entry1right))::(_,(_,DATECOMPILED1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 111,(result,DATECOMPILED1left,comment_entry1right), rest671) end | (321,(_,(_,_,comment_entry1right))::(_,(_,SECURITY1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 426,(result,SECURITY1left,comment_entry1right),rest671 ) end | (322,(_,(MlyValue.input_output_section input_output_section,_, input_output_section1right))::(_,(MlyValue.configuration_section configuration_section,_,_))::_::_::(_,(_,ENVIRONMENT1left,_))::rest671 ) => let val result=MlyValue.environment_division(( Cobol.ENVIRONMENT_DIVISION (configuration_section,input_output_section) )) in (hojfelds_NT 153,(result,ENVIRONMENT1left, input_output_section1right),rest671) end | (323,rest671) => let val result=MlyValue.environment_division(( Cobol.NO_ENVIRONMENT_DIVISION)) in (hojfelds_NT 153,(result,defaultPos,defaultPos),rest671) end | (324,(_,(MlyValue.special_names_paragraph special_names_paragraph,_, special_names_paragraph1right))::(_,( MlyValue.object_computer_paragraph object_computer_paragraph,_,_))::(_ ,(MlyValue.source_computer_paragraph source_computer_paragraph,_,_)):: _::_::(_,(_,CONFIGURATION1left,_))::rest671) => let val result= MlyValue.configuration_section(( Cobol.CONFIGURATION_SECTION (source_computer_paragraph,object_computer_paragraph ,special_names_paragraph) )) in (hojfelds_NT 77,(result,CONFIGURATION1left, special_names_paragraph1right),rest671) end | (325,(_,(_,_,source_computer_entry1right))::_::(_,(_, SOURCECOMPUTER1left,_))::rest671) => let val result= MlyValue.source_computer_paragraph(()) in (hojfelds_NT 451,(result,SOURCECOMPUTER1left, source_computer_entry1right),rest671) end | (326,rest671) => let val result=MlyValue.source_computer_paragraph(( )) in (hojfelds_NT 451,(result,defaultPos,defaultPos),rest671) end | (327,(_,(_,_,PERIOD1right))::_::(_,(_,computer_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 450,(result,computer_name1left,PERIOD1right),rest671) end | (328,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 450,(result,defaultPos,defaultPos),rest671) end | (329,(_,(_,_,MODE1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 115,(result,with1left,MODE1right),rest671) end | (330,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 115,(result,defaultPos,defaultPos),rest671) end | (331,(_,(_,_,object_computer_entry1right))::_::(_,(_, OBJECTCOMPUTER1left,_))::rest671) => let val result= MlyValue.object_computer_paragraph(()) in (hojfelds_NT 328,(result,OBJECTCOMPUTER1left, object_computer_entry1right),rest671) end | (332,rest671) => let val result=MlyValue.object_computer_paragraph(( )) in (hojfelds_NT 328,(result,defaultPos,defaultPos),rest671) end | (333,(_,(_,_,PERIOD1right))::_::_::_::(_,(_,computer_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 327,(result,computer_name1left,PERIOD1right),rest671) end | (334,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 327,(result,defaultPos,defaultPos),rest671) end | (335,(_,(_,_,size_unit1right))::_::_::(_,(_,MEMORY1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 307,(result,MEMORY1left,size_unit1right),rest671) end | (336,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 307,(result,defaultPos,defaultPos),rest671) end | (337,(_,(_,WORDS1left,WORDS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,WORDS1left,WORDS1right),rest671) end | (338,(_,(_,CHARACTERS1left,CHARACTERS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,CHARACTERS1left,CHARACTERS1right),rest671) end | (339,(_,(_,MODULES1left,MODULES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,MODULES1left,MODULES1right),rest671) end | (340,(_,(_,_,alphabet_name1right))::_::_::(_,(_, program_collating1left,_))::rest671) => let val result=MlyValue.ntVOID (()) in (hojfelds_NT 67,(result,program_collating1left,alphabet_name1right) ,rest671) end | (341,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 67,(result,defaultPos,defaultPos),rest671) end | (342,(_,(_,_,INTEGER1right))::_::(_,(_,SEGMENTLIMIT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 427,(result,SEGMENTLIMIT1left,INTEGER1right),rest671) end | (343,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 427,(result,defaultPos,defaultPos),rest671) end | (344,(_,(_,_,period1right))::(_,(MlyValue.special_names_clauses special_names_clauses,_,_))::_::(_,(_,SPECIALNAMES1left,_))::rest671) => let val result=MlyValue.special_names_paragraph(( Cobol.SPECIAL_NAMES_PARAGRAPH(special_names_clauses))) in (hojfelds_NT 453,(result,SPECIALNAMES1left,period1right),rest671) end | (345,rest671) => let val result=MlyValue.special_names_paragraph(( Cobol.NO_SPECIAL_NAMES_PARAGRAPH)) in (hojfelds_NT 453,(result,defaultPos,defaultPos),rest671) end | (346,(_,(MlyValue.special_names_clause special_names_clause,_, special_names_clause1right))::(_,(MlyValue.special_names_clauses special_names_clauses,special_names_clauses1left,_))::rest671) => let val result=MlyValue.special_names_clauses(( Cobol.SEVERAL_SPECIAL_NAMES_CLAUSES(special_names_clauses, special_names_clause) )) in (hojfelds_NT 102,(result,special_names_clauses1left, special_names_clause1right),rest671) end | (347,rest671) => let val result=MlyValue.special_names_clauses(( Cobol.NO_SPECIAL_NAMES_CLAUSES)) in (hojfelds_NT 102,(result,defaultPos,defaultPos),rest671) end | (348,(_,(_,environment_clause1left,environment_clause1right)):: rest671) => let val result=MlyValue.special_names_clause(( Cobol.ENVIRONMENT_CLAUSE)) in (hojfelds_NT 103,(result,environment_clause1left, environment_clause1right),rest671) end | (349,(_,(_,alphabet_clause1left,alphabet_clause1right))::rest671) => let val result=MlyValue.special_names_clause(( Cobol.ALPHABET_CLAUSE)) in (hojfelds_NT 103,(result,alphabet_clause1left,alphabet_clause1right ),rest671) end | (350,(_,(MlyValue.currency_sign_clause currency_sign_clause, currency_sign_clause1left,currency_sign_clause1right))::rest671) => let val result=MlyValue.special_names_clause(( Cobol.CURRENCY_SIGN_CLAUSE(currency_sign_clause))) in (hojfelds_NT 103,(result,currency_sign_clause1left, currency_sign_clause1right),rest671) end | (351,(_,(MlyValue.decimal_clause decimal_clause,decimal_clause1left, decimal_clause1right))::rest671) => let val result= MlyValue.special_names_clause((Cobol.DECIMAL_CLAUSE(decimal_clause))) in (hojfelds_NT 103,(result,decimal_clause1left,decimal_clause1right), rest671) end | (352,(_,(_,_,mnemonic_name1right))::_::(_,(_,environment_name_11left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_11left, mnemonic_name1right),rest671) end | (353,(_,(_,_,status_cond_phrase_opt1right))::_::_::(_,(_, environment_name_21left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_21left, status_cond_phrase_opt1right),rest671) end | (354,(_,(_,_,status_cond_phrase_opt1right))::(_,(_, environment_name_21left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_21left, status_cond_phrase_opt1right),rest671) end | (355,(_,(_,status_cond_phrase1left,status_cond_phrase1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 463,(result,status_cond_phrase1left, status_cond_phrase1right),rest671) end | (356,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 463,(result,defaultPos,defaultPos),rest671) end | (357,(_,(_,_,off_status_opt1right))::(_,(_,on_status1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 462,(result,on_status1left,off_status_opt1right), rest671) end | (358,(_,(_,_,on_status_opt1right))::(_,(_,off_status1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 462,(result,off_status1left,on_status_opt1right), rest671) end | (359,(_,(_,on_status1left,on_status1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 340,(result,on_status1left,on_status1right),rest671) end | (360,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 340,(result,defaultPos,defaultPos),rest671) end | (361,(_,(_,off_status1left,off_status1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 333,(result,off_status1left,off_status1right),rest671) end | (362,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 333,(result,defaultPos,defaultPos),rest671) end | (363,(_,(_,_,condition_name1right))::_::(_,(_,ON1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 339,(result,ON1left,condition_name1right),rest671) end | (364,(_,(_,_,condition_name1right))::_::(_,(_,OFF1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 332,(result,OFF1left,condition_name1right),rest671) end | (365,(_,(_,_,alphabet_specifier1right))::_::(_,(_,alphabet_name1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 23,(result,alphabet_name1left,alphabet_specifier1right ),rest671) end | (366,(_,(_,STANDARD11left,STANDARD11right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,STANDARD11left,STANDARD11right),rest671) end | (367,(_,(_,NATIVE1left,NATIVE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,NATIVE1left,NATIVE1right),rest671) end | (368,(_,(_,literal_also_ranges1left,literal_also_ranges1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,literal_also_ranges1left, literal_also_ranges1right),rest671) end | (369,(_,(_,_,literal_also_range1right))::(_,(_, literal_also_ranges1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 300,(result,literal_also_ranges1left, literal_also_range1right),rest671) end | (370,(_,(_,literal_also_range1left,literal_also_range1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 300,(result,literal_also_range1left, literal_also_range1right),rest671) end | (371,(_,(_,_,literal_boundary1right))::(_,(_,literal1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 299,(result,literal1left,literal_boundary1right), rest671) end | (372,(_,(_,_,literal1right))::(_,(_,through1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 301,(result,through1left,literal1right),rest671) end | (373,(_,(_,also_literals1left,also_literals1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 301,(result,also_literals1left,also_literals1right), rest671) end | (374,(_,(_,_,also_literal1right))::(_,(_,also_literals1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 27,(result,also_literals1left,also_literal1right), rest671) end | (375,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 27,(result,defaultPos,defaultPos),rest671) end | (376,(_,(_,_,literal1right))::(_,(_,ALSO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 26,(result,ALSO1left,literal1right),rest671) end | (377,(_,(MlyValue.literal_range literal_range,_,literal_range1right) )::(_,(MlyValue.literal_ranges literal_ranges,literal_ranges1left,_)) ::rest671) => let val result=MlyValue.literal_ranges(( Cobol.SEVERAL_LITERAL_RANGES(literal_ranges,literal_range))) in (hojfelds_NT 303,(result,literal_ranges1left,literal_range1right), rest671) end | (378,(_,(MlyValue.literal_range literal_range,literal_range1left, literal_range1right))::rest671) => let val result= MlyValue.literal_ranges((Cobol.ONE_LITERAL_RANGE(literal_range))) in (hojfelds_NT 303,(result,literal_range1left,literal_range1right), rest671) end | (379,(_,(MlyValue.through_literal through_literal,_, through_literal1right))::(_,(MlyValue.literal literal,literal1left,_)) ::rest671) => let val result=MlyValue.literal_range(( Cobol.LITERAL_RANGE(literal,through_literal))) in (hojfelds_NT 302,(result,literal1left,through_literal1right), rest671) end | (380,(_,(MlyValue.literal literal,_,literal1right))::(_,(_, through1left,_))::rest671) => let val result=MlyValue.through_literal( (Cobol.THROUGH_LITERAL(literal))) in (hojfelds_NT 493,(result,through1left,literal1right),rest671) end | (381,rest671) => let val result=MlyValue.through_literal(( Cobol.NO_THROUGH_LITERAL)) in (hojfelds_NT 493,(result,defaultPos,defaultPos),rest671) end | (382,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL,_, NONNUMERICLITERAL1right))::_::(_,(_,CURRENCY1left,_))::rest671) => let val result=MlyValue.currency_sign_clause(( Cobol.CURRENCY(NONNUMERICLITERAL))) in (hojfelds_NT 85,(result,CURRENCY1left,NONNUMERICLITERAL1right), rest671) end | (383,(_,(_,_,COMMA1right))::_::(_,(_,DECIMALPOINT1left,_))::rest671) => let val result=MlyValue.decimal_clause(( Cobol.DECIMALPOINT_IS_COMMA)) in (hojfelds_NT 116,(result,DECIMALPOINT1left,COMMA1right),rest671) end | (384,(_,(_,_,i_o_control_paragraph1right))::_::_::_::(_,(_, INPUTOUTPUT1left,_))::rest671) => let val result= MlyValue.input_output_section(()) in (hojfelds_NT 260,(result,INPUTOUTPUT1left, i_o_control_paragraph1right),rest671) end | (385,rest671) => let val result=MlyValue.input_output_section(()) in (hojfelds_NT 260,(result,defaultPos,defaultPos),rest671) end | (386,(_,(_,_,file_control_entries1right))::_::(_,(_,FILECONTROL1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 189,(result,FILECONTROL1left, file_control_entries1right),rest671) end | (387,(_,(_,_,file_control_entry1right))::(_,(_, file_control_entries1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 187,(result,file_control_entries1left, file_control_entry1right),rest671) end | (388,(_,(_,file_control_entry1left,file_control_entry1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 187,(result,file_control_entry1left, file_control_entry1right),rest671) end | (389,(_,(_,_,PERIOD1right))::_::_::_::(_,(_,SELECT1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 188,(result,SELECT1left,PERIOD1right),rest671) end | (390,(_,(_,_,file_control_clause1right))::(_,(_, file_control_clauses1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 186,(result,file_control_clauses1left, file_control_clause1right),rest671) end | (391,(_,(_,file_control_clause1left,file_control_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 186,(result,file_control_clause1left, file_control_clause1right),rest671) end | (392,(_,(_,assign_clause1left,assign_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,assign_clause1left,assign_clause1right), rest671) end | (393,(_,(_,reserve_clause1left,reserve_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,reserve_clause1left,reserve_clause1right), rest671) end | (394,(_,(_,organization_clause1left,organization_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,organization_clause1left, organization_clause1right),rest671) end | (395,(_,(_,record_key_clause1left,record_key_clause1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,record_key_clause1left, record_key_clause1right),rest671) end | (396,(_,(_,access_mode_clause1left,access_mode_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,access_mode_clause1left, access_mode_clause1right),rest671) end | (397,(_,(_,file_status_clause1left,file_status_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,file_status_clause1left, file_status_clause1right),rest671) end | (398,(_,(_,control_clause1left,control_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,control_clause1left,control_clause1right), rest671) end | (399,(_,(_,_,external_data_sets1right))::_::(_,(_,ASSIGN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 46,(result,ASSIGN1left,external_data_sets1right), rest671) end | (400,(_,(_,_,external_data_set1right))::(_,(_, external_data_sets1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 165,(result,external_data_sets1left, external_data_set1right),rest671) end | (401,(_,(_,external_data_set1left,external_data_set1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 165,(result,external_data_set1left, external_data_set1right),rest671) end | (402,(_,(_,assignment_name1left,assignment_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 164,(result,assignment_name1left,assignment_name1right ),rest671) end | (403,(_,(_,NONNUMERICLITERAL1left,NONNUMERICLITERAL1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 164,(result,NONNUMERICLITERAL1left, NONNUMERICLITERAL1right),rest671) end | (404,(_,(_,_,areas1right))::_::(_,(_,RESERVE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 410,(result,RESERVE1left,areas1right),rest671) end | (405,(_,(_,_,data_organization1right))::(_,(_,organization_is1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 351,(result,organization_is1left, data_organization1right),rest671) end | (406,(_,(_,SEQUENTIAL1left,SEQUENTIAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,SEQUENTIAL1left,SEQUENTIAL1right),rest671) end | (407,(_,(_,INDEXED1left,INDEXED1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,INDEXED1left,INDEXED1right),rest671) end | (408,(_,(_,RELATIVE1left,RELATIVE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,RELATIVE1left,RELATIVE1right),rest671) end | (409,(_,(_,TRANSACTION1left,TRANSACTION1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,TRANSACTION1left,TRANSACTION1right), rest671) end | (410,(_,(_,_,relative_key_clause1right))::_::_::(_,(_,ACCESS1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 8,(result,ACCESS1left,relative_key_clause1right), rest671) end | (411,(_,(_,SEQUENTIAL1left,SEQUENTIAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,SEQUENTIAL1left,SEQUENTIAL1right),rest671) end | (412,(_,(_,RANDOM1left,RANDOM1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,RANDOM1left,RANDOM1right),rest671) end | (413,(_,(_,DYNAMIC1left,DYNAMIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,DYNAMIC1left,DYNAMIC1right),rest671) end | (414,(_,(_,_,data_name1right))::_::_::(_,(_,RELATIVE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 396,(result,RELATIVE1left,data_name1right),rest671) end | (415,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 396,(result,defaultPos,defaultPos),rest671) end | (416,(_,(_,_,duplicates_phrase1right))::_::_::_::(_,(_,RECORD1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 388,(result,RECORD1left,duplicates_phrase1right), rest671) end | (417,(_,(_,_,DUPLICATES1right))::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 128,(result,with1left,DUPLICATES1right),rest671) end | (418,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 128,(result,defaultPos,defaultPos),rest671) end | (419,(_,(_,_,data_name_opt1right))::_::_::_::(_,(_,file1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 210,(result,file1left,data_name_opt1right),rest671) end | (420,(_,(_,_,data_name1right))::_::(_,(_,CONTROLAREA1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 79,(result,CONTROLAREA1left,data_name1right),rest671) end | (421,(_,(_,_,i_o_control_entries1right))::_::(_,(_,IOCONTROL1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 223,(result,IOCONTROL1left,i_o_control_entries1right), rest671) end | (422,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 223,(result,defaultPos,defaultPos),rest671) end | (423,(_,(_,_,PERIOD1right))::(_,(_,i_o_control_clauses1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 222,(result,i_o_control_clauses1left,PERIOD1right), rest671) end | (424,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 222,(result,defaultPos,defaultPos),rest671) end | (425,(_,(_,_,i_o_control_clause1right))::(_,(_, i_o_control_clauses1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 221,(result,i_o_control_clauses1left, i_o_control_clause1right),rest671) end | (426,(_,(_,i_o_control_clause1left,i_o_control_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 221,(result,i_o_control_clause1left, i_o_control_clause1right),rest671) end | (427,(_,(_,rerun_clause1left,rerun_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,rerun_clause1left,rerun_clause1right), rest671) end | (428,(_,(_,same_area_clause1left,same_area_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_area_clause1left, same_area_clause1right),rest671) end | (429,(_,(_,same_record_area_clause1left, same_record_area_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_record_area_clause1left, same_record_area_clause1right),rest671) end | (430,(_,(_,same_sort_area_clause1left,same_sort_area_clause1right)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_sort_area_clause1left, same_sort_area_clause1right),rest671) end | (431,(_,(_,same_sort_merge_area_clause1left, same_sort_merge_area_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_sort_merge_area_clause1left, same_sort_merge_area_clause1right),rest671) end | (432,(_,(_,apply_core_index_clause1left, apply_core_index_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,apply_core_index_clause1left, apply_core_index_clause1right),rest671) end | (433,(_,(_,multiple_file_tape_clause1left, multiple_file_tape_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,multiple_file_tape_clause1left, multiple_file_tape_clause1right),rest671) end | (434,(_,(_,_,file_name2right))::_::_::_::_::_::_::(_,(_,RERUN1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 409,(result,RERUN1left,file_name2right),rest671) end | (435,(_,(_,_,file_names1right))::_::_::(_,(_,SAME1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 416,(result,SAME1left,file_names1right),rest671) end | (436,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 417,(result,SAME1left,file_names1right),rest671) end | (437,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 419,(result,SAME1left,file_names1right),rest671) end | (438,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 420,(result,SAME1left,file_names1right),rest671) end | (439,(_,(_,_,file_names1right))::_::_::_::_::(_,(_,APPLY1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 37,(result,APPLY1left,file_names1right),rest671) end | (440,(_,(_,_,file_positions1right))::_::_::(_,(_,MULTIPLE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 316,(result,MULTIPLE1left,file_positions1right), rest671) end | (441,(_,(_,_,file_position1right))::(_,(_,file_positions1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 208,(result,file_positions1left,file_position1right), rest671) end | (442,(_,(_,file_position1left,file_position1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 208,(result,file_position1left,file_position1right), rest671) end | (443,(_,(_,_,position_integer1right))::(_,(_,file_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 207,(result,file_name1left,position_integer1right), rest671) end | (444,(_,(_,_,INTEGER1right))::(_,(_,POSITION1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 365,(result,POSITION1left,INTEGER1right),rest671) end | (445,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 365,(result,defaultPos,defaultPos),rest671) end | (446,(_,(MlyValue.linkage_section linkage_section,_, linkage_section1right))::(_,(MlyValue.working_storage_section working_storage_section,_,_))::(_,(MlyValue.file_section file_section, _,_))::_::_::(_,(_,DATA1left,_))::rest671) => let val result= MlyValue.data_division(( Cobol.DATA_DIVISION(file_section, working_storage_section, linkage_section) )) in (hojfelds_NT 91,(result,DATA1left,linkage_section1right),rest671) end | (447,rest671) => let val result=MlyValue.data_division(( Cobol.NO_DATA_DIVISION)) in (hojfelds_NT 91,(result,defaultPos,defaultPos),rest671) end | (448,(_,(MlyValue.file_description_paragraphs file_description_paragraphs,_,file_description_paragraphsright as file_description_paragraphs1right))::_::_::(_,(_,FILEleft as FILE1left ,_))::rest671) => let val result=MlyValue.file_section(( Cobol.FILE_SECTION(file_description_paragraphs,FILEleft,file_description_paragraphsright) )) in (hojfelds_NT 209,(result,FILE1left, file_description_paragraphs1right),rest671) end | (449,rest671) => let val result=MlyValue.file_section(( Cobol.NO_FILE_SECTION)) in (hojfelds_NT 209,(result,defaultPos,defaultPos),rest671) end | (450,(_,(MlyValue.file_description_paragraph file_description_paragraph,_,file_description_paragraph1right))::(_,( MlyValue.file_description_paragraphs file_description_paragraphs, file_description_paragraphs1left,_))::rest671) => let val result= MlyValue.file_description_paragraphs(( Cobol.FILE_DESCRIPTION_PARAGRAPHS(file_description_paragraphs, file_description_paragraph) )) in (hojfelds_NT 195,(result,file_description_paragraphs1left, file_description_paragraph1right),rest671) end | (451,rest671) => let val result=MlyValue.file_description_paragraphs ((Cobol.NO_FILE_DESCRIPTION_PARAGRAPHS)) in (hojfelds_NT 195,(result,defaultPos,defaultPos),rest671) end | (452,(_,(MlyValue.record_description_entries record_description_entries,_,record_description_entries1right))::(_,( MlyValue.file_and_sort_description_entry file_and_sort_description_entry,file_and_sort_description_entry1left,_ ))::rest671) => let val result=MlyValue.file_description_paragraph(( Cobol.FILE_DESCRIPTION_PARAGRAPH(file_and_sort_description_entry, record_description_entries) )) in (hojfelds_NT 194,(result,file_and_sort_description_entry1left, record_description_entries1right),rest671) end | (453,(_,(MlyValue.file_description_entry file_description_entry, file_description_entry1left,file_description_entry1right))::rest671) => let val result=MlyValue.file_and_sort_description_entry(( Cobol.FILE_DESCRIPTION_ENTRY(file_description_entry))) in (hojfelds_NT 184,(result,file_description_entry1left, file_description_entry1right),rest671) end | (454,(_,(MlyValue.sort_description_entry sort_description_entry, sort_description_entry1left,sort_description_entry1right))::rest671) => let val result=MlyValue.file_and_sort_description_entry(( Cobol.SORT_DESCRIPTION_ENTRY(sort_description_entry))) in (hojfelds_NT 184,(result,sort_description_entry1left, sort_description_entry1right),rest671) end | (455,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.file_description_clauses file_description_clauses,_,_))::(_,( MlyValue.file_name file_name,_,_))::(_,(_,FDleft as FD1left,_)):: rest671) => let val result=MlyValue.file_description_entry(( Cobol.FD(file_name,file_description_clauses,FDleft,PERIODright))) in (hojfelds_NT 193,(result,FD1left,PERIOD1right),rest671) end | (456,(_,(MlyValue.file_description_clause file_description_clause,_, file_description_clause1right))::(_,(MlyValue.file_description_clauses file_description_clauses,file_description_clauses1left,_))::rest671) => let val result=MlyValue.file_description_clauses(( Cobol.FILE_DESCRIPTION_CLAUSES(file_description_clauses, file_description_clause) )) in (hojfelds_NT 192,(result,file_description_clauses1left, file_description_clause1right),rest671) end | (457,rest671) => let val result=MlyValue.file_description_clauses(( Cobol.NO_FILE_DESCRIPTION_CLAUSES)) in (hojfelds_NT 192,(result,defaultPos,defaultPos),rest671) end | (458,(_,(MlyValue.block_contains_clause block_contains_clause, block_contains_clause1left,block_contains_clause1right))::rest671) => let val result=MlyValue.file_description_clause((block_contains_clause )) in (hojfelds_NT 191,(result,block_contains_clause1left, block_contains_clause1right),rest671) end | (459,(_,(MlyValue.record_contains_clause record_contains_clause, record_contains_clauseleft as record_contains_clause1left, record_contains_clauseright as record_contains_clause1right))::rest671 ) => let val result=MlyValue.file_description_clause(( Cobol.FILE_DESCRIPTION_CLAUSE_IS_RECORD(record_contains_clause, record_contains_clauseleft, record_contains_clauseright) )) in (hojfelds_NT 191,(result,record_contains_clause1left, record_contains_clause1right),rest671) end | (460,(_,(MlyValue.label_records_clause label_records_clause, label_records_clause1left,label_records_clause1right))::rest671) => let val result=MlyValue.file_description_clause((label_records_clause) ) in (hojfelds_NT 191,(result,label_records_clause1left, label_records_clause1right),rest671) end | (461,(_,(MlyValue.value_of_clause value_of_clause, value_of_clause1left,value_of_clause1right))::rest671) => let val result=MlyValue.file_description_clause((value_of_clause)) in (hojfelds_NT 191,(result,value_of_clause1left,value_of_clause1right ),rest671) end | (462,(_,(MlyValue.data_records_clause data_records_clause, data_records_clauseleft as data_records_clause1left, data_records_clauseright as data_records_clause1right))::rest671) => let val result=MlyValue.file_description_clause(( Cobol.FILE_DESCRIPTION_CLAUSE_IS_DATA(data_records_clause, data_records_clauseleft, data_records_clauseright) )) in (hojfelds_NT 191,(result,data_records_clause1left, data_records_clause1right),rest671) end | (463,(_,(MlyValue.linage_clause linage_clause,linage_clause1left, linage_clause1right))::rest671) => let val result= MlyValue.file_description_clause((linage_clause)) in (hojfelds_NT 191,(result,linage_clause1left,linage_clause1right), rest671) end | (464,(_,(MlyValue.code_set_clause code_set_clause, code_set_clause1left,code_set_clause1right))::rest671) => let val result=MlyValue.file_description_clause((code_set_clause)) in (hojfelds_NT 191,(result,code_set_clause1left,code_set_clause1right ),rest671) end | (465,(_,(MlyValue.characters_or_records characters_or_records,_, characters_or_recordsright as characters_or_records1right))::(_,( MlyValue.integer_range integer_range,_,_))::_::(_,(_,BLOCKleft as BLOCK1left,_))::rest671) => let val result= MlyValue.block_contains_clause(( Cobol.BLOCK(integer_range, characters_or_records, BLOCKleft, characters_or_recordsright) )) in (hojfelds_NT 53,(result,BLOCK1left,characters_or_records1right), rest671) end | (466,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.integer_range(( Cobol.SIMPLE_RANGE(INTEGER))) in (hojfelds_NT 265,(result,INTEGER1left,INTEGER1right),rest671) end | (467,(_,(MlyValue.INTEGER INTEGER2,_,INTEGER2right))::_::(_,( MlyValue.INTEGER INTEGER1,INTEGER1left,_))::rest671) => let val result =MlyValue.integer_range((Cobol.INTEGER_TO_INTEGER(INTEGER1,INTEGER2))) in (hojfelds_NT 265,(result,INTEGER1left,INTEGER2right),rest671) end | (468,(_,(_,characters1left,characters1right))::rest671) => let val result=MlyValue.characters_or_records((Cobol.CHARACTERS)) in (hojfelds_NT 62,(result,characters1left,characters1right),rest671) end | (469,(_,(_,RECORDS1left,RECORDS1right))::rest671) => let val result= MlyValue.characters_or_records((Cobol.RECORDS)) in (hojfelds_NT 62,(result,RECORDS1left,RECORDS1right),rest671) end | (470,(_,(_,_,characters1right))::(_,(MlyValue.integer_range integer_range,_,_))::_::(_,(_,RECORD1left,_))::rest671) => let val result=MlyValue.record_contains_clause(( Cobol.RECORD_CONTAINS(integer_range))) in (hojfelds_NT 381,(result,RECORD1left,characters1right),rest671) end | (471,(_,(MlyValue.standard_or_omitted standard_or_omitted,_, standard_or_omitted1right))::_::(_,(_,LABEL1left,_))::rest671) => let val result=MlyValue.label_records_clause((standard_or_omitted)) in (hojfelds_NT 285,(result,LABEL1left,standard_or_omitted1right), rest671) end | (472,(_,(_,_,is1right))::(_,(_,RECORD1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 387,(result,RECORD1left,is1right),rest671) end | (473,(_,(_,_,are1right))::(_,(_,RECORDS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 387,(result,RECORDS1left,are1right),rest671) end | (474,(_,(_,STANDARD1left,STANDARD1right))::rest671) => let val result=MlyValue.standard_or_omitted((Cobol.LABEL_STANDARD)) in (hojfelds_NT 456,(result,STANDARD1left,STANDARD1right),rest671) end | (475,(_,(_,OMITTED1left,OMITTED1right))::rest671) => let val result= MlyValue.standard_or_omitted((Cobol.LABEL_OMITTED)) in (hojfelds_NT 456,(result,OMITTED1left,OMITTED1right),rest671) end | (476,(_,(MlyValue.value_of_phrases value_of_phrases,_, value_of_phrasesright as value_of_phrases1right))::_::(_,(_,VALUEleft as VALUE1left,_))::rest671) => let val result= MlyValue.value_of_clause(( Cobol.VALUE_OF_CLAUSE(value_of_phrases, VALUEleft, value_of_phrasesright) )) in (hojfelds_NT 518,(result,VALUE1left,value_of_phrases1right),rest671 ) end | (477,(_,(MlyValue.value_of_phrase value_of_phrase,_, value_of_phrase1right))::(_,(MlyValue.value_of_phrases value_of_phrases,value_of_phrases1left,_))::rest671) => let val result =MlyValue.value_of_phrases(( Cobol.VALUE_OF_PHRASES(value_of_phrases, value_of_phrase))) in (hojfelds_NT 521,(result,value_of_phrases1left, value_of_phrase1right),rest671) end | (478,(_,(MlyValue.value_of_phrase value_of_phrase, value_of_phrase1left,value_of_phrase1right))::rest671) => let val result=MlyValue.value_of_phrases(( Cobol.VALUE_OF_PHRASE(value_of_phrase))) in (hojfelds_NT 521,(result,value_of_phrase1left,value_of_phrase1right ),rest671) end | (479,(_,(MlyValue.data_name_or_literal data_name_or_literal,_, data_name_or_literal1right))::_::(_,(MlyValue.system_name system_name, system_name1left,_))::rest671) => let val result= MlyValue.value_of_phrase(( Cobol.VALUE_OF(system_name, data_name_or_literal))) in (hojfelds_NT 520,(result,system_name1left, data_name_or_literal1right),rest671) end | (480,(_,(MlyValue.data_names data_names,_,data_names1right))::_::(_, (_,DATA1left,_))::rest671) => let val result= MlyValue.data_records_clause((Cobol.DATA_RECORD_IS(data_names))) in (hojfelds_NT 108,(result,DATA1left,data_names1right),rest671) end | (481,(_,(MlyValue.top_bottom_specifications top_bottom_specifications,_,top_bottom_specificationsright as top_bottom_specifications1right))::(_,(MlyValue.footing_specification footing_specification,_,_))::_::(_,(MlyValue.data_name_or_integer data_name_or_integer,_,_))::_::(_,(_,LINAGEleft as LINAGE1left,_)):: rest671) => let val result=MlyValue.linage_clause(( Cobol.LINAGE_CLAUSE(data_name_or_integer, footing_specification, top_bottom_specifications, LINAGEleft, top_bottom_specificationsright) )) in (hojfelds_NT 293,(result,LINAGE1left, top_bottom_specifications1right),rest671) end | (482,(_,(MlyValue.data_name_or_integer data_name_or_integer,_, data_name_or_integer1right))::_::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.footing_specification(( Cobol.FOOTING(data_name_or_integer))) in (hojfelds_NT 212,(result,with1left,data_name_or_integer1right), rest671) end | (483,rest671) => let val result=MlyValue.footing_specification(( Cobol.NOFOOTING)) in (hojfelds_NT 212,(result,defaultPos,defaultPos),rest671) end | (484,(_,(MlyValue.top_bottom_specification top_bottom_specification, _,top_bottom_specification1right))::(_,( MlyValue.top_bottom_specifications top_bottom_specifications, top_bottom_specifications1left,_))::rest671) => let val result= MlyValue.top_bottom_specifications(( Cobol.TOP_BOTTOM_SPECIFICATIONS(top_bottom_specifications, top_bottom_specification) )) in (hojfelds_NT 502,(result,top_bottom_specifications1left, top_bottom_specification1right),rest671) end | (485,rest671) => let val result=MlyValue.top_bottom_specifications(( Cobol.NO_TOP_BOTTOM_SPECIFICATION)) in (hojfelds_NT 502,(result,defaultPos,defaultPos),rest671) end | (486,(_,(_,_,data_name_or_integer1right))::(_,(MlyValue.top_bottom top_bottom,_,_))::_::(_,(_,lines1left,_))::rest671) => let val result= MlyValue.top_bottom_specification((top_bottom)) in (hojfelds_NT 501,(result,lines1left,data_name_or_integer1right), rest671) end | (487,(_,(_,TOP1left,TOP1right))::rest671) => let val result= MlyValue.top_bottom((Cobol.TOP)) in (hojfelds_NT 500,(result,TOP1left,TOP1right),rest671) end | (488,(_,(_,BOTTOM1left,BOTTOM1right))::rest671) => let val result= MlyValue.top_bottom((Cobol.BOTTOM)) in (hojfelds_NT 500,(result,BOTTOM1left,BOTTOM1right),rest671) end | (489,(_,(MlyValue.alphabet_name alphabet_name,_,alphabet_nameright as alphabet_name1right))::_::(_,(_,CODESETleft as CODESET1left,_)):: rest671) => let val result=MlyValue.code_set_clause(( Cobol.CODE_SET_CLAUSE(alphabet_name, CODESETleft, alphabet_nameright) )) in (hojfelds_NT 65,(result,CODESET1left,alphabet_name1right),rest671) end | (490,(_,(_,_,PERIOD1right))::(_,(MlyValue.sort_description_clauses sort_description_clauses,_,_))::(_,(MlyValue.file_name file_name,_,_)) ::(_,(_,SD1left,_))::rest671) => let val result= MlyValue.sort_description_entry(( Cobol.SD(file_name,sort_description_clauses))) in (hojfelds_NT 447,(result,SD1left,PERIOD1right),rest671) end | (491,(_,(MlyValue.sort_description_clause sort_description_clause,_, sort_description_clause1right))::(_,(MlyValue.sort_description_clauses sort_description_clauses,sort_description_clauses1left,_))::rest671) => let val result=MlyValue.sort_description_clauses(( Cobol.SORT_DESCRIPTION_CLAUSES(sort_description_clauses, sort_description_clause) )) in (hojfelds_NT 446,(result,sort_description_clauses1left, sort_description_clause1right),rest671) end | (492,rest671) => let val result=MlyValue.sort_description_clauses(( Cobol.NO_SORT_DESCRIPTION_CLAUSE)) in (hojfelds_NT 446,(result,defaultPos,defaultPos),rest671) end | (493,(_,(MlyValue.record_contains_clause record_contains_clause, record_contains_clauseleft as record_contains_clause1left, record_contains_clauseright as record_contains_clause1right))::rest671 ) => let val result=MlyValue.sort_description_clause(( Cobol.SORT_DESCRIPTION_CLAUSE_IS_RECORD (record_contains_clause, record_contains_clauseleft, record_contains_clauseright) )) in (hojfelds_NT 445,(result,record_contains_clause1left, record_contains_clause1right),rest671) end | (494,(_,(MlyValue.data_records_clause data_records_clause, data_records_clauseleft as data_records_clause1left, data_records_clauseright as data_records_clause1right))::rest671) => let val result=MlyValue.sort_description_clause(( Cobol.SORT_DESCRIPTION_CLAUSE_IS_DATA(data_records_clause, data_records_clauseleft, data_records_clauseright) )) in (hojfelds_NT 445,(result,data_records_clause1left, data_records_clause1right),rest671) end | (495,(_,(MlyValue.record_description_entry record_description_entry, _,record_description_entry1right))::(_,( MlyValue.record_description_entries record_description_entries, record_description_entries1left,_))::rest671) => let val result= MlyValue.record_description_entries(( Cobol.RECORD_DESCRIPTION_ENTRIES(record_description_entries, record_description_entry) )) in (hojfelds_NT 385,(result,record_description_entries1left, record_description_entry1right),rest671) end | (496,(_,(MlyValue.record_description_entry record_description_entry, record_description_entry1left,record_description_entry1right)):: rest671) => let val result=MlyValue.record_description_entries(( Cobol.RECORD_DESCRIPTION_ENTRIES(Cobol.NO_RECORD_DESCRIPTION_ENTRIES, record_description_entry) )) in (hojfelds_NT 385,(result,record_description_entry1left, record_description_entry1right),rest671) end | (497,(_,(MlyValue.record_description_entries record_description_entries,record_description_entries1left, record_description_entries1right))::rest671) => let val result= MlyValue.record_description_entries_opt(( Cobol.RECORD_DESCRIPTION_ENTRIES_OPT(record_description_entries))) in (hojfelds_NT 384,(result,record_description_entries1left, record_description_entries1right),rest671) end | (498,rest671) => let val result= MlyValue.record_description_entries_opt(( Cobol.NO_RECORD_DESCRIPTION_ENTRIES_OPT)) in (hojfelds_NT 384,(result,defaultPos,defaultPos),rest671) end | (499,(_,(MlyValue.data_description_entry data_description_entry, data_description_entry1left,data_description_entry1right))::rest671) => let val result=MlyValue.record_description_entry(( data_description_entry)) in (hojfelds_NT 386,(result,data_description_entry1left, data_description_entry1right),rest671) end | (500,(_,(MlyValue.data_description_entry_134 data_description_entry_134,data_description_entry_1341left, data_description_entry_1341right))::rest671) => let val result= MlyValue.data_description_entry((data_description_entry_134)) in (hojfelds_NT 89,(result,data_description_entry_1341left, data_description_entry_1341right),rest671) end | (501,(_,(MlyValue.renames_clause renames_clause,renames_clause1left, renames_clause1right))::rest671) => let val result= MlyValue.data_description_entry((renames_clause)) in (hojfelds_NT 89,(result,renames_clause1left,renames_clause1right), rest671) end | (502,(_,(MlyValue.data_description_annotation data_description_annotation,data_description_annotation1left, data_description_annotation1right))::rest671) => let val result= MlyValue.data_description_entry((data_description_annotation)) in (hojfelds_NT 89,(result,data_description_annotation1left, data_description_annotation1right),rest671) end | (503,(_,(MlyValue.ts2k ts2k,_,ts2kright as ts2k1right))::(_,(_, TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.data_description_annotation(( Cobol.TS2K_NOARROW(ts2k,TS2Kleft,ts2kright))) in (hojfelds_NT 541,(result,TS2K1left,ts2k1right),rest671) end | (504,(_,(MlyValue.ts2k ts2k2,_,ts2k2right))::_::(_,(MlyValue.ts2k ts2k1,_,_))::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_ARROW(ts2k1,ts2k2,TS2Kleft,ts2k2right))) in (hojfelds_NT 541,(result,TS2K1left,ts2k2right),rest671) end | (505,(_,(MlyValue.ts2k ts2k2,_,ts2k2right))::_::(_,(MlyValue.ts2k ts2k1,_,_))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_ALL(ts2k1,ts2k2,TS2Kleft,ts2k2right))) in (hojfelds_NT 541,(result,TS2K1left,ts2k2right),rest671) end | (506,(_,(_,_,ENDright as END1right))::(_,(_,TS2Kleft as TS2K1left,_) )::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_END(TS2Kleft,ENDright))) in (hojfelds_NT 541,(result,TS2K1left,END1right),rest671) end | (507,(_,(_,_,SEPARATEright as SEPARATE1right))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.data_description_annotation(( Cobol.TS2K_ASSUME_SEPARATE(TS2Kleft,SEPARATEright))) in (hojfelds_NT 541,(result,TS2K1left,SEPARATE1right),rest671) end | (508,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.data_description_clauses data_description_clauses,_,_))::(_,( MlyValue.redefines_clause redefines_clause,_,_))::(_,( MlyValue.data_name_or_filler data_name_or_filler,_,_))::(_,( MlyValue.level_number level_number,level_numberleft as level_number1left,_))::rest671) => let val result= MlyValue.data_description_entry_134(( (if (level_number = "88") then (case data_name_or_filler of Cobol.DATA_NAME_OR_FILLER_IS_DATA_NAME(data_name) => condition_names := data_name :: (!condition_names) | _ => ()) else ()); Cobol.DATA_DESCRIPTION_ENTRY_134(level_number, data_name_or_filler, redefines_clause, data_description_clauses, level_numberleft, PERIODright) )) in (hojfelds_NT 90,(result,level_number1left,PERIOD1right),rest671) end | (509,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,(_, REDEFINES1left,_))::rest671) => let val result= MlyValue.redefines_clause((Cobol.REDEFINES_CLAUSE(data_name))) in (hojfelds_NT 391,(result,REDEFINES1left,data_name1right),rest671) end | (510,rest671) => let val result=MlyValue.redefines_clause(( Cobol.NO_REDEFINES_CLAUSE)) in (hojfelds_NT 391,(result,defaultPos,defaultPos),rest671) end | (511,(_,(MlyValue.data_description_clause data_description_clause,_, data_description_clause1right))::(_,(MlyValue.data_description_clauses data_description_clauses,data_description_clauses1left,_))::rest671) => let val result=MlyValue.data_description_clauses(( Cobol.DATA_DESCRIPTION_CLAUSES(data_description_clauses, data_description_clause) )) in (hojfelds_NT 88,(result,data_description_clauses1left, data_description_clause1right),rest671) end | (512,rest671) => let val result=MlyValue.data_description_clauses(( Cobol.NO_DATA_DESCRIPTION_CLAUSES)) in (hojfelds_NT 88,(result,defaultPos,defaultPos),rest671) end | (513,(_,(MlyValue.usage_clause usage_clause,usage_clauseleft as usage_clause1left,usage_clauseright as usage_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_USAGE_CLAUSE(usage_clause, usage_clauseleft, usage_clauseright) )) in (hojfelds_NT 87,(result,usage_clause1left,usage_clause1right), rest671) end | (514,(_,(MlyValue.sign_clause sign_clause,sign_clauseleft as sign_clause1left,sign_clauseright as sign_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( let val (lt,sc) = sign_clause in Cobol.DATA_DESCRIPTION_CLAUSE_IS_SIGN_CLAUSE (lt,sc,sign_clauseleft,sign_clauseright) end )) in (hojfelds_NT 87,(result,sign_clause1left,sign_clause1right),rest671 ) end | (515,(_,(MlyValue.occurs_clause occurs_clause,occurs_clauseleft as occurs_clause1left,occurs_clauseright as occurs_clause1right)):: rest671) => let val result=MlyValue.data_description_clause(( let val (tld, adkp, ibp) = occurs_clause in Cobol.DATA_DESCRIPTION_CLAUSE_IS_OCCURS_CLAUSE (tld, adkp, ibp, occurs_clauseleft, occurs_clauseright) end )) in (hojfelds_NT 87,(result,occurs_clause1left,occurs_clause1right), rest671) end | (516,(_,(MlyValue.synchronized_clause synchronized_clause, synchronized_clauseleft as synchronized_clause1left, synchronized_clauseright as synchronized_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_SYNCHRONIZED_CLAUSE (synchronized_clause, synchronized_clauseleft, synchronized_clauseright) )) in (hojfelds_NT 87,(result,synchronized_clause1left, synchronized_clause1right),rest671) end | (517,(_,(_,justified_clauseleft as justified_clause1left, justified_clauseright as justified_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_JUSTIFIED_CLAUSE (justified_clauseleft, justified_clauseright) )) in (hojfelds_NT 87,(result,justified_clause1left, justified_clause1right),rest671) end | (518,(_,(_,blank_when_zero_clauseleft as blank_when_zero_clause1left ,blank_when_zero_clauseright as blank_when_zero_clause1right)):: rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_BLANK_WHEN_ZERO_CLAUSE (blank_when_zero_clauseleft, blank_when_zero_clauseright) )) in (hojfelds_NT 87,(result,blank_when_zero_clause1left, blank_when_zero_clause1right),rest671) end | (519,(_,(MlyValue.value_clause value_clause,value_clauseleft as value_clause1left,value_clauseright as value_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_VALUE_CLAUSE(value_clause, value_clauseleft, value_clauseright) )) in (hojfelds_NT 87,(result,value_clause1left,value_clause1right), rest671) end | (520,(_,(MlyValue.picture_clause picture_clause,picture_clauseleft as picture_clause1left,picture_clauseright as picture_clause1right)) ::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_PICTURE_CLAUSE(picture_clause, picture_clauseleft, picture_clauseright) )) in (hojfelds_NT 87,(result,picture_clause1left,picture_clause1right), rest671) end | (521,(_,(MlyValue.indicator_clause indicator_clause, indicator_clauseleft as indicator_clause1left,indicator_clauseright as indicator_clause1right))::rest671) => let val result= MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_INDICATOR_CLAUSE (indicator_clause, indicator_clauseleft, indicator_clauseright) )) in (hojfelds_NT 87,(result,indicator_clause1left, indicator_clause1right),rest671) end | (522,(_,(MlyValue.INTEGER INTEGER,_,INTEGER1right))::(_,(_, indicator1left,_))::rest671) => let val result= MlyValue.indicator_clause((INTEGER)) in (hojfelds_NT 251,(result,indicator1left,INTEGER1right),rest671) end | (523,(_,(_,INDICATOR1left,INDICATOR1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDICATOR1left,INDICATOR1right),rest671) end | (524,(_,(_,INDICATORS1left,INDICATORS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDICATORS1left,INDICATORS1right),rest671) end | (525,(_,(_,INDIC1left,INDIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDIC1left,INDIC1right),rest671) end | (526,(_,(_,_,ZERO1right))::_::(_,(_,BLANK1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 52,(result,BLANK1left,ZERO1right),rest671) end | (527,(_,(_,_,right1right))::(_,(_,justified1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 281,(result,justified1left,right1right),rest671) end | (528,(_,(MlyValue.fixed_length_tables_clause fixed_length_tables_clause,fixed_length_tables_clause1left, fixed_length_tables_clause1right))::rest671) => let val result= MlyValue.occurs_clause((fixed_length_tables_clause)) in (hojfelds_NT 329,(result,fixed_length_tables_clause1left, fixed_length_tables_clause1right),rest671) end | (529,(_,(MlyValue.variable_length_tables_clause variable_length_tables_clause,variable_length_tables_clause1left, variable_length_tables_clause1right))::rest671) => let val result= MlyValue.occurs_clause((variable_length_tables_clause)) in (hojfelds_NT 329,(result,variable_length_tables_clause1left, variable_length_tables_clause1right),rest671) end | (530,(_,(MlyValue.indexed_by_phrase indexed_by_phrase,_, indexed_by_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,_,_))::_::(_,(MlyValue.INTEGER INTEGER,_,_))::(_,(_,OCCURS1left,_))::rest671) => let val result= MlyValue.fixed_length_tables_clause(( (Cobol.FIXED_LENGTH_TABLE(INTEGER), ascending_descending_key_phrases, indexed_by_phrase) )) in (hojfelds_NT 211,(result,OCCURS1left,indexed_by_phrase1right), rest671) end | (531,(_,(MlyValue.ascending_descending_key_phrase ascending_descending_key_phrase,_, ascending_descending_key_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,ascending_descending_key_phrases1left ,_))::rest671) => let val result= MlyValue.ascending_descending_key_phrases(( Cobol.ASCENDING_DESCENDING_KEY_PHRASES (ascending_descending_key_phrases, ascending_descending_key_phrase) )) in (hojfelds_NT 45,(result,ascending_descending_key_phrases1left, ascending_descending_key_phrase1right),rest671) end | (532,rest671) => let val result= MlyValue.ascending_descending_key_phrases(( Cobol.NO_ASCENDING_DESCENDING_KEY_PHRASES)) in (hojfelds_NT 45,(result,defaultPos,defaultPos),rest671) end | (533,(_,(MlyValue.data_names data_names,_,data_names1right))::_::_:: (_,(MlyValue.ascending_descending ascending_descending, ascending_descending1left,_))::rest671) => let val result= MlyValue.ascending_descending_key_phrase(( Cobol.ASCENDING_DESCENDING_KEY_PHRASE(ascending_descending, data_names) )) in (hojfelds_NT 44,(result,ascending_descending1left,data_names1right) ,rest671) end | (534,(_,(_,ASCENDING1left,ASCENDING1right))::rest671) => let val result=MlyValue.ascending_descending((Cobol.ASCENDING)) in (hojfelds_NT 43,(result,ASCENDING1left,ASCENDING1right),rest671) end | (535,(_,(_,DESCENDING1left,DESCENDING1right))::rest671) => let val result=MlyValue.ascending_descending((Cobol.DESCENDING)) in (hojfelds_NT 43,(result,DESCENDING1left,DESCENDING1right),rest671) end | (536,(_,(MlyValue.index_names index_names,_,index_names1right))::_:: (_,(_,INDEXED1left,_))::rest671) => let val result= MlyValue.indexed_by_phrase((Cobol.INDEXED_BY_PHRASE(index_names))) in (hojfelds_NT 248,(result,INDEXED1left,index_names1right),rest671) end | (537,rest671) => let val result=MlyValue.indexed_by_phrase(( Cobol.NO_INDEXED_BY_PHRASE)) in (hojfelds_NT 248,(result,defaultPos,defaultPos),rest671) end | (538,(_,(MlyValue.indexed_by_phrase indexed_by_phrase,_, indexed_by_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,_,_))::(_,(MlyValue.data_name data_name,_,_))::_::_::_::(_,(MlyValue.INTEGER INTEGER2,_,_))::_::(_,( MlyValue.INTEGER INTEGER1,_,_))::(_,(_,OCCURS1left,_))::rest671) => let val result=MlyValue.variable_length_tables_clause(( (Cobol.VARIABLE_LENGTH_TABLE(INTEGER1,INTEGER2,data_name), ascending_descending_key_phrases, indexed_by_phrase) )) in (hojfelds_NT 522,(result,OCCURS1left,indexed_by_phrase1right), rest671) end | (539,(_,(MlyValue.character_string character_string,_, character_string1right))::_::(_,(_,picture1left,_))::rest671) => let val result=MlyValue.picture_clause((character_string)) in (hojfelds_NT 363,(result,picture1left,character_string1right), rest671) end | (540,(_,(MlyValue.separate_character separate_character,_, separate_character1right))::(_,(MlyValue.leading_trailing leading_trailing,_,_))::(_,(_,sign_is_opt1left,_))::rest671) => let val result=MlyValue.sign_clause(( (leading_trailing, separate_character))) in (hojfelds_NT 436,(result,sign_is_opt1left,separate_character1right) ,rest671) end | (541,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.leading_trailing((Cobol.LEADING_TRAILING_IS_LEADING)) in (hojfelds_NT 287,(result,LEADING1left,LEADING1right),rest671) end | (542,(_,(_,TRAILING1left,TRAILING1right))::rest671) => let val result=MlyValue.leading_trailing((Cobol.LEADING_TRAILING_IS_TRAILING)) in (hojfelds_NT 287,(result,TRAILING1left,TRAILING1right),rest671) end | (543,(_,(MlyValue.left_right left_right,_,left_right1right))::(_,(_, synchronized1left,_))::rest671) => let val result= MlyValue.synchronized_clause((left_right)) in (hojfelds_NT 475,(result,synchronized1left,left_right1right), rest671) end | (544,(_,(_,LEFT1left,LEFT1right))::rest671) => let val result= MlyValue.left_right((Cobol.LEFT)) in (hojfelds_NT 289,(result,LEFT1left,LEFT1right),rest671) end | (545,(_,(_,RIGHT1left,RIGHT1right))::rest671) => let val result= MlyValue.left_right((Cobol.RIGHT)) in (hojfelds_NT 289,(result,RIGHT1left,RIGHT1right),rest671) end | (546,(_,(MlyValue.usage_specifier usage_specifier,_, usage_specifier1right))::(_,(_,usage_is1left,_))::rest671) => let val result=MlyValue.usage_clause((usage_specifier)) in (hojfelds_NT 507,(result,usage_is1left,usage_specifier1right), rest671) end | (547,(_,(_,DISPLAY1left,DISPLAY1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_DISPLAY)) in (hojfelds_NT 509,(result,DISPLAY1left,DISPLAY1right),rest671) end | (548,(_,(_,INDEX1left,INDEX1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_INDEX)) in (hojfelds_NT 509,(result,INDEX1left,INDEX1right),rest671) end | (549,(_,(_,COMPUTATIONAL31left,COMPUTATIONAL31right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP3)) in (hojfelds_NT 509,(result,COMPUTATIONAL31left,COMPUTATIONAL31right), rest671) end | (550,(_,(_,COMP31left,COMP31right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP3)) in (hojfelds_NT 509,(result,COMP31left,COMP31right),rest671) end | (551,(_,(_,COMPUTATIONAL41left,COMPUTATIONAL41right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP4)) in (hojfelds_NT 509,(result,COMPUTATIONAL41left,COMPUTATIONAL41right), rest671) end | (552,(_,(_,COMP41left,COMP41right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP4)) in (hojfelds_NT 509,(result,COMP41left,COMP41right),rest671) end | (553,(_,(_,COMPUTATIONAL1left,COMPUTATIONAL1right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP)) in (hojfelds_NT 509,(result,COMPUTATIONAL1left,COMPUTATIONAL1right), rest671) end | (554,(_,(_,COMP1left,COMP1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP)) in (hojfelds_NT 509,(result,COMP1left,COMP1right),rest671) end | (555,(_,(MlyValue.literal_ranges literal_ranges,_, literal_ranges1right))::(_,(_,value_is1left,_))::rest671) => let val result=MlyValue.value_clause((literal_ranges)) in (hojfelds_NT 516,(result,value_is1left,literal_ranges1right), rest671) end | (556,(_,(_,_,is1right))::(_,(_,VALUE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 517,(result,VALUE1left,is1right),rest671) end | (557,(_,(_,_,are1right))::(_,(_,VALUES1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 517,(result,VALUES1left,are1right),rest671) end | (558,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.through_data_name through_data_name,_,_))::(_,( MlyValue.data_name data_name2,_,_))::_::(_,(MlyValue.data_name data_name1,_,_))::(_,(MlyValue.level_number level_number, level_numberleft as level_number1left,_))::rest671) => let val result= MlyValue.renames_clause(( Cobol.RENAMES_CLAUSE(level_number, data_name1, data_name2, through_data_name, level_numberleft, PERIODright) )) in (hojfelds_NT 401,(result,level_number1left,PERIOD1right),rest671) end | (559,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,(_, through1left,_))::rest671) => let val result= MlyValue.through_data_name((Cobol.THROUGH_DATA_NAME(data_name))) in (hojfelds_NT 492,(result,through1left,data_name1right),rest671) end | (560,rest671) => let val result=MlyValue.through_data_name(( Cobol.NOT_THROUGH_DATA_NAME)) in (hojfelds_NT 492,(result,defaultPos,defaultPos),rest671) end | (561,(_,(MlyValue.record_description_entries_opt record_description_entries_opt,_,record_description_entries_optright as record_description_entries_opt1right))::_::_::(_,(_, WORKINGSTORAGEleft as WORKINGSTORAGE1left,_))::rest671) => let val result=MlyValue.working_storage_section(( Cobol.WORKINGSTORAGE_SECTION(record_description_entries_opt, WORKINGSTORAGEleft,record_description_entries_optright) )) in (hojfelds_NT 529,(result,WORKINGSTORAGE1left, record_description_entries_opt1right),rest671) end | (562,rest671) => let val result=MlyValue.working_storage_section(( Cobol.NO_WORKINGSTORAGE_SECTION)) in (hojfelds_NT 529,(result,defaultPos,defaultPos),rest671) end | (563,(_,(MlyValue.record_description_entries_opt record_description_entries_opt,_,record_description_entries_optright as record_description_entries_opt1right))::_::_::(_,(_,LINKAGEleft as LINKAGE1left,_))::rest671) => let val result= MlyValue.linkage_section(( Cobol.LINKAGE_SECTION(record_description_entries_opt, LINKAGEleft,record_description_entries_optright) )) in (hojfelds_NT 297,(result,LINKAGE1left, record_description_entries_opt1right),rest671) end | (564,rest671) => let val result=MlyValue.linkage_section(( Cobol.NO_LINKAGE_SECTION)) in (hojfelds_NT 297,(result,defaultPos,defaultPos),rest671) end | (565,(_,(MlyValue.sections sections,_,sectionsright as sections1right))::(_,(MlyValue.declaratives_section declaratives_section,_,_))::_::(_,(MlyValue.using_clause using_clause, _,_))::_::(_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result=MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_1_DECLARATIVES(using_clause, declaratives_section, sections, PROCEDUREleft, sectionsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,sections1right),rest671) end | (566,(_,(MlyValue.sections sections,_,sectionsright as sections1right))::_::(_,(MlyValue.using_clause using_clause,_,_))::_:: (_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result= MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_1_NO_DECLARATIVES(using_clause, sections, PROCEDUREleft, sectionsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,sections1right),rest671) end | (567,(_,(MlyValue.paragraphs paragraphs,_,paragraphsright as paragraphs1right))::_::(_,(MlyValue.using_clause using_clause,_,_))::_ ::(_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result=MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_2(using_clause, paragraphs, PROCEDUREleft, paragraphsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,paragraphs1right),rest671) end | (568,rest671) => let val result=MlyValue.procedure_division(( Cobol.EMPTY_PROCEDURE_DIVISION)) in (hojfelds_NT 367,(result,defaultPos,defaultPos),rest671) end | (569,(_,(_,_,data_names1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.using_clause(()) in (hojfelds_NT 512,(result,USING1left,data_names1right),rest671) end | (570,rest671) => let val result=MlyValue.using_clause(()) in (hojfelds_NT 512,(result,defaultPos,defaultPos),rest671) end | (571,(_,(_,_,PERIOD2right))::_::_::_::_::(_,(_,DECLARATIVES1left,_)) ::rest671) => let val result=MlyValue.declaratives_section(()) in (hojfelds_NT 118,(result,DECLARATIVES1left,PERIOD2right),rest671) end | (572,(_,(_,_,PERIOD2right))::_::_::_::_::(_,(_,section_name1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left,PERIOD2right),rest671) end | (573,(_,(_,_,declaratives_sections1right))::_::_::_::_::_::(_,(_, section_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left, declaratives_sections1right),rest671) end | (574,(_,(_,_,declaratives_paragraphs1right))::_::_::_::_::_::(_,(_, section_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left, declaratives_paragraphs1right),rest671) end | (575,(_,(_,_,declaratives_paragraphs1right))::_::_::(_,(_, paragraph_name1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 117,(result,paragraph_name1left, declaratives_paragraphs1right),rest671) end | (576,(_,(_,_,declaratives_sections1right))::_::_::(_,(_, paragraph_name1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 117,(result,paragraph_name1left, declaratives_sections1right),rest671) end | (577,(_,(_,_,sentences1right))::_::(_,(_,paragraph_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 117,(result,paragraph_name1left,sentences1right), rest671) end | (578,(_,(_,_,PERIOD1right))::(_,(MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,(MlyValue.section_name section_name, section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.NO_BODY_SECTION(section_name,segment_number_opt))) in (hojfelds_NT 424,(result,section_name1left,PERIOD1right),rest671) end | (579,(_,(MlyValue.sections sections,_,sections1right))::_::(_,( MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,( MlyValue.section_name section_name,section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.NO_BODY_SECTION_FOLLOWED_BY_SECTION(section_name, segment_number_opt, sections) )) in (hojfelds_NT 424,(result,section_name1left,sections1right),rest671) end | (580,(_,(MlyValue.paragraphs_and_sections paragraphs_and_sections,_, paragraphs_and_sections1right))::_::(_,(MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,(MlyValue.section_name section_name, section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.SECTION(section_name, segment_number_opt, paragraphs_and_sections) )) in (hojfelds_NT 424,(result,section_name1left, paragraphs_and_sections1right),rest671) end | (581,(_,(MlyValue.paragraphs_and_sections paragraphs_and_sections,_, paragraphs_and_sections1right))::(_,(MlyValue.paragraph paragraph, paragraph1left,_))::rest671) => let val result= MlyValue.paragraphs_and_sections(( Cobol.SEVERAL_PARAGRAPHS_AND_SECTIONS(paragraph, paragraphs_and_sections) )) in (hojfelds_NT 359,(result,paragraph1left, paragraphs_and_sections1right),rest671) end | (582,(_,(MlyValue.sections sections,_,sections1right))::(_,( MlyValue.paragraph paragraph,paragraph1left,_))::rest671) => let val result=MlyValue.paragraphs_and_sections(( Cobol.SINGLE_PARAGRAPH_AND_SECTIONS(paragraph,sections))) in (hojfelds_NT 359,(result,paragraph1left,sections1right),rest671) end | (583,(_,(MlyValue.paragraph paragraph,paragraph1left,paragraph1right ))::rest671) => let val result=MlyValue.paragraphs_and_sections(( Cobol.SINGLE_PARAGRAPH(paragraph))) in (hojfelds_NT 359,(result,paragraph1left,paragraph1right),rest671) end | (584,(_,(MlyValue.paragraph paragraph,_,paragraph1right))::(_,( MlyValue.paragraphs paragraphs,paragraphs1left,_))::rest671) => let val result=MlyValue.paragraphs(( Cobol.SEVERAL_PARAGRAPHS(paragraphs,paragraph))) in (hojfelds_NT 358,(result,paragraphs1left,paragraph1right),rest671) end | (585,(_,(MlyValue.paragraph paragraph,paragraph1left,paragraph1right ))::rest671) => let val result=MlyValue.paragraphs(( Cobol.ONE_PARAGRAPH(paragraph))) in (hojfelds_NT 358,(result,paragraph1left,paragraph1right),rest671) end | (586,(_,(MlyValue.sentences sentences,_,sentences1right))::_::(_,( MlyValue.paragraph_name paragraph_name,paragraph_name1left,_)):: rest671) => let val result=MlyValue.paragraph(( Cobol.PARAGRAPH(paragraph_name,sentences))) in (hojfelds_NT 356,(result,paragraph_name1left,sentences1right), rest671) end | (587,(_,(MlyValue.sentence sentence,_,sentence1right))::(_,( MlyValue.sentences sentences,sentences1left,_))::rest671) => let val result=MlyValue.sentences((Cobol.SENTENCES(sentences,sentence))) in (hojfelds_NT 430,(result,sentences1left,sentence1right),rest671) end | (588,rest671) => let val result=MlyValue.sentences(( Cobol.NO_SENTENCES)) in (hojfelds_NT 430,(result,defaultPos,defaultPos),rest671) end | (589,(_,(_,_,PERIOD1right))::(_,(MlyValue.statements statements, statements1left,_))::rest671) => let val result=MlyValue.sentence(( Cobol.SENTENCE(statements))) in (hojfelds_NT 429,(result,statements1left,PERIOD1right),rest671) end | (590,(_,(MlyValue.statement statement,_,statement1right))::(_,( MlyValue.statements statements,statements1left,_))::rest671) => let val result=MlyValue.statements(( Cobol.SEVERAL_STATEMENTS(statements,statement))) in (hojfelds_NT 459,(result,statements1left,statement1right),rest671) end | (591,(_,(MlyValue.statement statement,statement1left,statement1right ))::rest671) => let val result=MlyValue.statements(( Cobol.ONE_STATEMENT(statement))) in (hojfelds_NT 459,(result,statement1left,statement1right),rest671) end | (592,(_,(MlyValue.statements statements,statements1left, statements1right))::rest671) => let val result= MlyValue.imperative_statement((statements)) in (hojfelds_NT 241,(result,statements1left,statements1right),rest671) end | (593,(_,(MlyValue.INTEGER INTEGER,INTEGERleft as INTEGER1left, INTEGERright as INTEGER1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_INTEGER(INTEGER,INTEGERleft,INTEGERright) )) in (hojfelds_NT 476,(result,INTEGER1left,INTEGER1right),rest671) end | (594,(_,(MlyValue.DECIMALNUMBER DECIMALNUMBER,DECIMALNUMBERleft as DECIMALNUMBER1left,DECIMALNUMBERright as DECIMALNUMBER1right)):: rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_DECIMALNUMBER (DECIMALNUMBER,DECIMALNUMBERleft,DECIMALNUMBERright) )) in (hojfelds_NT 476,(result,DECIMALNUMBER1left,DECIMALNUMBER1right), rest671) end | (595,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL, NONNUMERICLITERALleft as NONNUMERICLITERAL1left,NONNUMERICLITERALright as NONNUMERICLITERAL1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_NONNUMERICLITERAL(NONNUMERICLITERAL, NONNUMERICLITERALleft, NONNUMERICLITERALright) )) in (hojfelds_NT 476,(result,NONNUMERICLITERAL1left, NONNUMERICLITERAL1right),rest671) end | (596,(_,(MlyValue.BOOLEANLITERAL BOOLEANLITERAL,BOOLEANLITERALleft as BOOLEANLITERAL1left,BOOLEANLITERALright as BOOLEANLITERAL1right)) ::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_BOOLEANLITERAL (BOOLEANLITERAL,BOOLEANLITERALleft,BOOLEANLITERALright) )) in (hojfelds_NT 476,(result,BOOLEANLITERAL1left,BOOLEANLITERAL1right), rest671) end | (597,(_,(MlyValue.figurative_constant figurative_constant, figurative_constantleft as figurative_constant1left, figurative_constantright as figurative_constant1right))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_FIGURATIVE_CONSTANT (figurative_constant,figurative_constantleft,figurative_constantright) )) in (hojfelds_NT 476,(result,figurative_constant1left, figurative_constant1right),rest671) end | (598,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_IDENTIFIER(identifier))) in (hojfelds_NT 476,(result,identifier1left,identifier1right),rest671) end | (599,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expression1right))::(_,(_,PLUSSYMBOL1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_PLUS_SIGN(arithmetic_expression))) in (hojfelds_NT 476,(result,PLUSSYMBOL1left, arithmetic_expression1right),rest671) end | (600,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expression1right))::(_,(_,MINUSSYMBOL1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_MINUS_SIGN(arithmetic_expression))) in (hojfelds_NT 476,(result,MINUSSYMBOL1left, arithmetic_expression1right),rest671) end | (601,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_EXPONENTIATION (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (602,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_MULTIPLY (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (603,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_DIVIDE (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (604,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_ADD (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (605,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_SUBTRACT (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (606,(_,(_,_,RPAR1right))::(_,(MlyValue.arithmetic_expression arithmetic_expression,_,_))::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.arithmetic_expression((arithmetic_expression)) in (hojfelds_NT 476,(result,LPAR1left,RPAR1right),rest671) end | (607,(_,(MlyValue.expression expression,expression1left, expression1right))::rest671) => raise Hojfeld "607" (* let val result= MlyValue.conditional_expression((convertCE(expression))) in (hojfelds_NT 477,(result,expression1left,expression1right),rest671) end *) | (608,(_,(MlyValue.arithmetic_expression arithmetic_expression, arithmetic_expressionleft as arithmetic_expression1left, arithmetic_expressionright as arithmetic_expression1right))::rest671) => let val result=MlyValue.expression(( CE_AE(arithmetic_expression, arithmetic_expressionleft, arithmetic_expressionright) )) in (hojfelds_NT 42,(result,arithmetic_expression1left, arithmetic_expression1right),rest671) end | (609,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expressionright as arithmetic_expression1right))::(_,( MlyValue.relational_operator relational_operator, relational_operatorleft as relational_operator1left,_))::rest671) => let val result=MlyValue.expression(( CE_SINGLE_REL(relational_operator, arithmetic_expression, relational_operatorleft, arithmetic_expressionright) )) in (hojfelds_NT 42,(result,relational_operator1left, arithmetic_expression1right),rest671) end | (610,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::(_,(MlyValue.relational_operator relational_operator,_,_))::(_,(MlyValue.is_not is_not,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression1, arithmetic_expression1left,_))::rest671) => let val result= MlyValue.expression(( CE_REL(arithmetic_expression1, is_not, relational_operator, arithmetic_expression2, arithmetic_expression1left, arithmetic_expression2right) )) in (hojfelds_NT 42,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (611,(_,(MlyValue.data_class data_class,_,data_class1right))::(_,( MlyValue.is_not is_not,_,_))::(_,(MlyValue.arithmetic_expression arithmetic_expression,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.expression(( CE_DC(arithmetic_expression,is_not,data_class))) in (hojfelds_NT 42,(result,arithmetic_expression1left,data_class1right ),rest671) end | (612,(_,(MlyValue.sign_specification sign_specification,_, sign_specification1right))::(_,(MlyValue.is_not is_not,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression, arithmetic_expression1left,_))::rest671) => let val result= MlyValue.expression(( CE_SIGN(arithmetic_expression,is_not,sign_specification))) in (hojfelds_NT 42,(result,arithmetic_expression1left, sign_specification1right),rest671) end | (613,(_,(_,TRUEleft as TRUE1left,TRUEright as TRUE1right))::rest671) => let val result=MlyValue.expression((CE_TRUE(TRUEleft,TRUEright))) in (hojfelds_NT 42,(result,TRUE1left,TRUE1right),rest671) end | (614,(_,(_,FALSEleft as FALSE1left,FALSEright as FALSE1right)):: rest671) => let val result=MlyValue.expression(( CE_FALSE(FALSEleft,FALSEright))) in (hojfelds_NT 42,(result,FALSE1left,FALSE1right),rest671) end | (615,(_,(_,environment_name_2left as environment_name_21left, environment_name_2right as environment_name_21right))::rest671) => let val result=MlyValue.expression(( CE_SWITCH(environment_name_2left,environment_name_2right))) in (hojfelds_NT 42,(result,environment_name_21left, environment_name_21right),rest671) end | (616,(_,(MlyValue.expression expression,_,expression1right))::(_,(_, NOT1left,_))::rest671) => let val result=MlyValue.expression(( CE_NOT(expression))) in (hojfelds_NT 42,(result,NOT1left,expression1right),rest671) end | (617,(_,(MlyValue.expression expression2,_,expression2right))::_::(_ ,(MlyValue.expression expression1,expression1left,_))::rest671) => let val result=MlyValue.expression((CE_AND(expression1,expression2))) in (hojfelds_NT 42,(result,expression1left,expression2right),rest671) end | (618,(_,(MlyValue.expression expression2,_,expression2right))::_::(_ ,(MlyValue.expression expression1,expression1left,_))::rest671) => let val result=MlyValue.expression((CE_OR(expression1,expression2))) in (hojfelds_NT 42,(result,expression1left,expression2right),rest671) end | (619,(_,(_,_,RPAR1right))::(_,(MlyValue.expression expression,_,_)) ::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.expression( (expression)) in (hojfelds_NT 42,(result,LPAR1left,RPAR1right),rest671) end | (620,(_,(_,NUMERIC1left,NUMERIC1right))::rest671) => let val result= MlyValue.data_class((Cobol.DATA_CLASS_IS_NUMERIC)) in (hojfelds_NT 122,(result,NUMERIC1left,NUMERIC1right),rest671) end | (621,(_,(_,ALPHABETIC1left,ALPHABETIC1right))::rest671) => let val result=MlyValue.data_class((Cobol.DATA_CLASS_IS_ALPHABETIC)) in (hojfelds_NT 122,(result,ALPHABETIC1left,ALPHABETIC1right),rest671) end | (622,(_,(_,_,than1right))::(_,(_,GREATER1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.GREATER)) in (hojfelds_NT 121,(result,GREATER1left,than1right),rest671) end | (623,(_,(_,GREATERSYMBOL1left,GREATERSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.GREATER)) in (hojfelds_NT 121,(result,GREATERSYMBOL1left,GREATERSYMBOL1right), rest671) end | (624,(_,(_,_,than1right))::(_,(_,LESS1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.LESS)) in (hojfelds_NT 121,(result,LESS1left,than1right),rest671) end | (625,(_,(_,LESSSYMBOL1left,LESSSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.LESS)) in (hojfelds_NT 121,(result,LESSSYMBOL1left,LESSSYMBOL1right),rest671) end | (626,(_,(_,_,to1right))::(_,(_,EQUAL1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.EQUAL)) in (hojfelds_NT 121,(result,EQUAL1left,to1right),rest671) end | (627,(_,(_,EQSYMBOL1left,EQSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.EQUAL)) in (hojfelds_NT 121,(result,EQSYMBOL1left,EQSYMBOL1right),rest671) end | (628,(_,(_,POSITIVE1left,POSITIVE1right))::rest671) => let val result=MlyValue.sign_specification(( Cobol.SIGN_SPECIFICATION_IS_POSITIVE)) in (hojfelds_NT 123,(result,POSITIVE1left,POSITIVE1right),rest671) end | (629,(_,(_,NEGATIVE1left,NEGATIVE1right))::rest671) => let val result=MlyValue.sign_specification(( Cobol.SIGN_SPECIFICATION_IS_NEGATIVE)) in (hojfelds_NT 123,(result,NEGATIVE1left,NEGATIVE1right),rest671) end | (630,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.sign_specification((Cobol.SIGN_SPECIFICATION_IS_ZERO)) in (hojfelds_NT 123,(result,ZERO1left,ZERO1right),rest671) end | (631,(_,(MlyValue.accept_statement accept_statement, accept_statement1left,accept_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.ACCEPT_STATEMENT(accept_statement))) in (hojfelds_NT 458,(result,accept_statement1left, accept_statement1right),rest671) end | (632,(_,(MlyValue.add_statement add_statement,add_statement1left, add_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ADD_OR_SUBTRACT_STATEMENT(add_statement))) in (hojfelds_NT 458,(result,add_statement1left,add_statement1right), rest671) end | (633,(_,(_,alter_statement1left,alter_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,alter_statement1left,alter_statement1right ),rest671) end | (634,(_,(_,call_statement1left,call_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,call_statement1left,call_statement1right), rest671) end | (635,(_,(_,cancel_statement1left,cancel_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,cancel_statement1left, cancel_statement1right),rest671) end | (636,(_,(_,close_statement1left,close_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,close_statement1left,close_statement1right ),rest671) end | (637,(_,(MlyValue.compute_statement compute_statement, compute_statement1left,compute_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.COMPUTE_STATEMENT(compute_statement)) ) in (hojfelds_NT 458,(result,compute_statement1left, compute_statement1right),rest671) end | (638,(_,(_,delete_statement1left,delete_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,delete_statement1left, delete_statement1right),rest671) end | (639,(_,(_,display_statement1left,display_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,display_statement1left, display_statement1right),rest671) end | (640,(_,(MlyValue.divide_statement divide_statement, divide_statement1left,divide_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.DIVIDE_STATEMENT(divide_statement))) in (hojfelds_NT 458,(result,divide_statement1left, divide_statement1right),rest671) end | (641,(_,(_,enter_statement1left,enter_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,enter_statement1left,enter_statement1right ),rest671) end | (642,(_,(_,exit_statement1left,exit_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exit_statement1left,exit_statement1right), rest671) end | (643,(_,(_,exit_program_statement1left,exit_program_statement1right) )::rest671) => let val result=MlyValue.statement(( Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exit_program_statement1left, exit_program_statement1right),rest671) end | (644,(_,(_,goback_statement1left,goback_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,goback_statement1left, goback_statement1right),rest671) end | (645,(_,(_,go_to_statement1left,go_to_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,go_to_statement1left,go_to_statement1right ),rest671) end | (646,(_,(MlyValue.if_statement if_statement,if_statement1left, if_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.IF_STATEMENT(if_statement))) in (hojfelds_NT 458,(result,if_statement1left,if_statement1right), rest671) end | (647,(_,(_,initialize_statement1left,initialize_statement1right)):: rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,initialize_statement1left, initialize_statement1right),rest671) end | (648,(_,(_,inspect_statement1left,inspect_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,inspect_statement1left, inspect_statement1right),rest671) end | (649,(_,(_,merge_statement1left,merge_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,merge_statement1left,merge_statement1right ),rest671) end | (650,(_,(MlyValue.move_statement move_statement,move_statement1left, move_statement1right))::rest671) => let val result=MlyValue.statement( (Cobol.MOVE_STATEMENT(move_statement))) in (hojfelds_NT 458,(result,move_statement1left,move_statement1right), rest671) end | (651,(_,(MlyValue.multiply_statement multiply_statement, multiply_statement1left,multiply_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.MULTIPLY_STATEMENT(multiply_statement))) in (hojfelds_NT 458,(result,multiply_statement1left, multiply_statement1right),rest671) end | (652,(_,(_,open_statement1left,open_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,open_statement1left,open_statement1right), rest671) end | (653,(_,(_,perform_statement1left,perform_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,perform_statement1left, perform_statement1right),rest671) end | (654,(_,(_,read_statement1left,read_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,read_statement1left,read_statement1right), rest671) end | (655,(_,(_,release_statement1left,release_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,release_statement1left, release_statement1right),rest671) end | (656,(_,(_,return_statement1left,return_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,return_statement1left, return_statement1right),rest671) end | (657,(_,(_,rewrite_statement1left,rewrite_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,rewrite_statement1left, rewrite_statement1right),rest671) end | (658,(_,(_,search_statement1left,search_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,search_statement1left, search_statement1right),rest671) end | (659,(_,(_,set_statement1left,set_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,set_statement1left,set_statement1right), rest671) end | (660,(_,(_,sort_statement1left,sort_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,sort_statement1left,sort_statement1right), rest671) end | (661,(_,(_,start_statement1left,start_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,start_statement1left,start_statement1right ),rest671) end | (662,(_,(_,stop_statement1left,stop_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,stop_statement1left,stop_statement1right), rest671) end | (663,(_,(_,string_statement1left,string_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,string_statement1left, string_statement1right),rest671) end | (664,(_,(MlyValue.subtract_statement subtract_statement, subtract_statement1left,subtract_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ADD_OR_SUBTRACT_STATEMENT(subtract_statement))) in (hojfelds_NT 458,(result,subtract_statement1left, subtract_statement1right),rest671) end | (665,(_,(_,unstring_statement1left,unstring_statement1right)):: rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,unstring_statement1left, unstring_statement1right),rest671) end | (666,(_,(_,use_statement1left,use_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,use_statement1left,use_statement1right), rest671) end | (667,(_,(_,write_statement1left,write_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,write_statement1left,write_statement1right ),rest671) end | (668,(_,(_,copy_statement1left,copy_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,copy_statement1left,copy_statement1right), rest671) end | (669,(_,(_,eject_statement1left,eject_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,eject_statement1left,eject_statement1right ),rest671) end | (670,(_,(_,exhibit_statement1left,exhibit_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exhibit_statement1left, exhibit_statement1right),rest671) end | (671,(_,(_,trace_statement1left,trace_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,trace_statement1left,trace_statement1right ),rest671) end | (672,(_,(MlyValue.annotation_statement annotation_statement, annotation_statement1left,annotation_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ANNOTATION_STATEMENT(annotation_statement))) in (hojfelds_NT 458,(result,annotation_statement1left, annotation_statement1right),rest671) end | (673,(_,(MlyValue.identifier_or_literal identifier_or_literal, identifier_or_literal1left,identifier_or_literal1right))::rest671) => let val result=MlyValue.identifier_or_literal_or_ddt(( Cobol.IDENTIFIER_OR_LITERAL_OR_DDT_IS_IDENTIFIER_OR_LITERAL(identifier_or_literal) )) in (hojfelds_NT 544,(result,identifier_or_literal1left, identifier_or_literal1right),rest671) end | (674,(_,(MlyValue.date_day_time date_day_time,date_day_time1left, date_day_time1right))::rest671) => let val result= MlyValue.identifier_or_literal_or_ddt(( Cobol.IDENTIFIER_OR_LITERAL_OR_DDT_IS_DDT(date_day_time))) in (hojfelds_NT 544,(result,date_day_time1left,date_day_time1right), rest671) end | (675,(_,(MlyValue.identifier identifier,_,identifierright as identifier1right))::_::(_,(MlyValue.ts2k ts2k,_,_))::_::(_,( MlyValue.identifier_or_literal_or_ddt identifier_or_literal_or_ddt,_,_ ))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.annotation_statement(( Cobol.TS2K_COERCE(identifier_or_literal_or_ddt, ts2k, TS2Kleft,identifierright,identifier) )) in (hojfelds_NT 542,(result,TS2K1left,identifier1right),rest671) end | (676,(_,(MlyValue.ts2k ts2k,_,ts2kright as ts2k1right))::_::(_,( MlyValue.identifier_or_literal_or_ddt identifier_or_literal_or_ddt,_,_ ))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.annotation_statement(( Cobol.TS2K_ASSUME(identifier_or_literal_or_ddt,ts2k,TS2Kleft,ts2kright) )) in (hojfelds_NT 542,(result,TS2K1left,ts2k1right),rest671) end | (677,(_,(MlyValue.from_environment from_environment,_, from_environmentright as from_environment1right))::(_,( MlyValue.identifier identifier,_,_))::(_,(_,ACCEPTleft as ACCEPT1left, _))::rest671) => let val result=MlyValue.accept_statement(( Cobol.ACCEPT_ENVIRONMENT(identifier, from_environment,ACCEPTleft,from_environmentright) )) in (hojfelds_NT 7,(result,ACCEPT1left,from_environment1right),rest671) end | (678,(_,(MlyValue.date_day_time date_day_time,_,date_day_timeright as date_day_time1right))::_::(_,(MlyValue.identifier identifier,_,_)) ::(_,(_,ACCEPTleft as ACCEPT1left,_))::rest671) => let val result= MlyValue.accept_statement(( Cobol.ACCEPT_DATE_DAY_TIME(identifier, date_day_time,ACCEPTleft,date_day_timeright) )) in (hojfelds_NT 7,(result,ACCEPT1left,date_day_time1right),rest671) end | (679,(_,(MlyValue.mnemonic_name mnemonic_name,_,mnemonic_nameright as mnemonic_name1right))::(_,(_,FROMleft as FROM1left,_))::rest671) => let val result=MlyValue.from_environment(( Cobol.FROM(mnemonic_name,FROMleft,mnemonic_nameright))) in (hojfelds_NT 215,(result,FROM1left,mnemonic_name1right),rest671) end | (680,rest671) => let val result=MlyValue.from_environment(( Cobol.NO_FROM)) in (hojfelds_NT 215,(result,defaultPos,defaultPos),rest671) end | (681,(_,(_,DATEleft as DATE1left,DATEright as DATE1right))::rest671) => let val result=MlyValue.date_day_time(( Cobol.DATE(DATEleft,DATEright))) in (hojfelds_NT 112,(result,DATE1left,DATE1right),rest671) end | (682,(_,(_,DAYleft as DAY1left,DAYright as DAY1right))::rest671) => let val result=MlyValue.date_day_time((Cobol.DAY(DAYleft,DAYright))) in (hojfelds_NT 112,(result,DAY1left,DAY1right),rest671) end | (683,(_,(_,TIMEleft as TIME1left,TIMEright as TIME1right))::rest671) => let val result=MlyValue.date_day_time(( Cobol.TIME(TIMEleft,TIMEright))) in (hojfelds_NT 112,(result,TIME1left,TIME1right),rest671) end | (684,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, ADDleft as ADD1left,_))::rest671) => let val result= MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT (Cobol.ADD,identifier_or_literals,identifier_roundeds, size_error_clauses, ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (685,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, ADDleft as ADD1left,_))::rest671) => let val result= MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT_GIVING (Cobol.ADD,identifier_or_literals,identifier_or_literal, identifier_roundeds, size_error_clauses,ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (686,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.rounded rounded,_,_))::(_,(MlyValue.identifier identifier2,_, _))::_::(_,(MlyValue.identifier identifier1,_,_))::_::(_,(_,ADDleft as ADD1left,_))::rest671) => let val result=MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT_CORRESPONDING (Cobol.ADD,identifier1,identifier2,rounded, size_error_clauses,ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (687,(_,(MlyValue.identifier_rounded identifier_rounded,_, identifier_rounded1right))::(_,(MlyValue.identifier_roundeds identifier_roundeds,identifier_roundeds1left,_))::rest671) => let val result=MlyValue.identifier_roundeds(( Cobol.SEVERAL_IDENTIFIER_ROUNDEDS(identifier_roundeds, identifier_rounded) )) in (hojfelds_NT 236,(result,identifier_roundeds1left, identifier_rounded1right),rest671) end | (688,(_,(MlyValue.identifier_rounded identifier_rounded, identifier_rounded1left,identifier_rounded1right))::rest671) => let val result=MlyValue.identifier_roundeds(( Cobol.ONE_IDENTIFIER_ROUNDED(identifier_rounded))) in (hojfelds_NT 236,(result,identifier_rounded1left, identifier_rounded1right),rest671) end | (689,(_,(MlyValue.rounded rounded,_,rounded1right))::(_,( MlyValue.identifier identifier,identifier1left,_))::rest671) => let val result=MlyValue.identifier_rounded(( Cobol.IDENTIFIER_ROUNDED(identifier,rounded))) in (hojfelds_NT 235,(result,identifier1left,rounded1right),rest671) end | (690,(_,(MlyValue.size_error_clause size_error_clause, size_error_clause1left,size_error_clause1right))::rest671) => let val result=MlyValue.size_error_clauses((size_error_clause)) in (hojfelds_NT 442,(result,size_error_clause1left, size_error_clause1right),rest671) end | (691,(_,(MlyValue.imperative_statement imperative_statement,_, imperative_statement1right))::_::_::(_,(_,on1left,_))::rest671) => let val result=MlyValue.size_error_clause(( Cobol.SIZE_ERROR(imperative_statement))) in (hojfelds_NT 441,(result,on1left,imperative_statement1right), rest671) end | (692,rest671) => let val result=MlyValue.size_error_clause(( Cobol.NO_SIZE_ERROR)) in (hojfelds_NT 441,(result,defaultPos,defaultPos),rest671) end | (693,(_,(_,_,alterations1right))::(_,(_,ALTER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 32,(result,ALTER1left,alterations1right),rest671) end | (694,(_,(_,_,alteration1right))::(_,(_,alterations1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 34,(result,alterations1left,alteration1right),rest671) end | (695,(_,(_,alteration1left,alteration1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 34,(result,alteration1left,alteration1right),rest671) end | (696,(_,(_,_,procedure_name2right))::_::_::(_,(_,procedure_name1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 33,(result,procedure_name1left,procedure_name2right), rest671) end | (697,(_,(_,_,end_call1right))::_::_::_::(_,(_,CALL1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 55,(result,CALL1left,end_call1right),rest671) end | (698,(_,(_,_,identifiers1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 513,(result,USING1left,identifiers1right),rest671) end | (699,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 513,(result,defaultPos,defaultPos),rest671) end | (700,(_,(_,_,identifier_or_literals1right))::(_,(_,CANCEL1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 56,(result,CANCEL1left,identifier_or_literals1right), rest671) end | (701,(_,(_,_,file_name_specifications1right))::(_,(_,CLOSE1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 63,(result,CLOSE1left,file_name_specifications1right), rest671) end | (702,(_,(_,_,file_name_specification1right))::(_,(_, file_name_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 202,(result,file_name_specifications1left, file_name_specification1right),rest671) end | (703,(_,(_,file_name_specification1left, file_name_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 202,(result,file_name_specification1left, file_name_specification1right),rest671) end | (704,(_,(_,_,closing_specification1right))::(_,(_,file_name1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 201,(result,file_name1left,closing_specification1right ),rest671) end | (705,(_,(_,_,for_removal1right))::(_,(_,reel_or_unit1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,reel_or_unit1left,for_removal1right), rest671) end | (706,(_,(_,_,no_rewind_or_lock1right))::(_,(_,with1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,with1left,no_rewind_or_lock1right),rest671) end | (707,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,defaultPos,defaultPos),rest671) end | (708,(_,(_,REEL1left,REEL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 392,(result,REEL1left,REEL1right),rest671) end | (709,(_,(_,UNIT1left,UNIT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 392,(result,UNIT1left,UNIT1right),rest671) end | (710,(_,(_,_,REWIND1right))::(_,(_,NO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 320,(result,NO1left,REWIND1right),rest671) end | (711,(_,(_,LOCK1left,LOCK1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 320,(result,LOCK1left,LOCK1right),rest671) end | (712,(_,(_,_,end_computeright as end_compute1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::(_,(_, COMPUTEleft as COMPUTE1left,_))::rest671) => let val result= MlyValue.compute_statement(( Cobol.COMPUTE(identifier_roundeds, arithmetic_expression, size_error_clauses, COMPUTEleft,end_computeright) )) in (hojfelds_NT 72,(result,COMPUTE1left,end_compute1right),rest671) end | (713,(_,(_,_,end_delete1right))::_::_::_::(_,(_,DELETE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 120,(result,DELETE1left,end_delete1right),rest671) end | (714,(_,(_,_,not_invalid_key_error_clause1right))::(_,(_, invalid_key_error_clause1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 272,(result,invalid_key_error_clause1left, not_invalid_key_error_clause1right),rest671) end | (715,(_,(_,_,imperative_statement1right))::_::(_,(_,INVALID1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 270,(result,INVALID1left,imperative_statement1right), rest671) end | (716,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 270,(result,defaultPos,defaultPos),rest671) end | (717,(_,(_,_,imperative_statement1right))::_::_::(_,(_,NOT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 324,(result,NOT1left,imperative_statement1right), rest671) end | (718,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 324,(result,defaultPos,defaultPos),rest671) end | (719,(_,(_,_,upon_mnemonic_name1right))::_::(_,(_,DISPLAY1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 126,(result,DISPLAY1left,upon_mnemonic_name1right), rest671) end | (720,(_,(_,_,mnemonic_name1right))::(_,(_,UPON1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 506,(result,UPON1left,mnemonic_name1right),rest671) end | (721,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 506,(result,defaultPos,defaultPos),rest671) end | (722,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO(identifier_or_literal,identifier_roundeds, size_error_clauses,DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (723,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO_GIVING (identifier_or_literal1,identifier_or_literal2, identifier_roundeds, size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (724,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_BY_GIVING (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (725,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier identifier,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO_GIVING_REMAINDER (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,identifier,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (726,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier identifier,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_BY_GIVING_REMAINDER (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,identifier,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (727,(_,(_,_,routine_name_opt1right))::_::(_,(_,ENTER1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 151,(result,ENTER1left,routine_name_opt1right),rest671 ) end | (728,(_,(_,_,identifiers1right))::_::(_,(_,EXHIBIT1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 161,(result,EXHIBIT1left,identifiers1right),rest671) end | (729,(_,(_,NAMED1left,NAMED1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 58,(result,NAMED1left,NAMED1right),rest671) end | (730,(_,(_,_,NAMED1right))::(_,(_,CHANGED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 58,(result,CHANGED1left,NAMED1right),rest671) end | (731,(_,(_,EXIT1left,EXIT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 163,(result,EXIT1left,EXIT1right),rest671) end | (732,(_,(_,_,PROGRAM1right))::(_,(_,EXIT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 162,(result,EXIT1left,PROGRAM1right),rest671) end | (733,(_,(_,_,procedure_name_opt1right))::_::(_,(_,GO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 218,(result,GO1left,procedure_name_opt1right),rest671) end | (734,(_,(_,_,identifier1right))::_::_::_::_::(_,(_,GO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 218,(result,GO1left,identifier1right),rest671) end | (735,(_,(MlyValue.else_statements else_statements,_, else_statements1right))::(_,(MlyValue.then_statements then_statements, _,_))::(_,(_,_,thenright))::(_,(MlyValue.conditional_expression conditional_expression,_,_))::(_,(_,IFleft as IF1left,_))::rest671) => let val result=MlyValue.if_statement(( Cobol.IF(conditional_expression,then_statements,else_statements, IFleft,thenright) )) in (hojfelds_NT 240,(result,IF1left,else_statements1right),rest671) end | (736,(_,(MlyValue.imperative_statement imperative_statement, imperative_statement1left,imperative_statement1right))::rest671) => let val result=MlyValue.then_statements(( Cobol.THEN_STATEMENTS(imperative_statement))) in (hojfelds_NT 490,(result,imperative_statement1left, imperative_statement1right),rest671) end | (737,(_,(_,_,SENTENCE1right))::(_,(_,NEXT1left,_))::rest671) => let val result=MlyValue.then_statements((Cobol.NEXT_SENTENCE)) in (hojfelds_NT 490,(result,NEXT1left,SENTENCE1right),rest671) end | (738,(_,(_,_,end_if1right))::(_,(MlyValue.statements statements,_,_) )::(_,(_,ELSE1left,_))::rest671) => let val result= MlyValue.else_statements((Cobol.ELSE(statements))) in (hojfelds_NT 130,(result,ELSE1left,end_if1right),rest671) end | (739,(_,(_,_,SENTENCE1right))::_::(_,(_,ELSE1left,_))::rest671) => let val result=MlyValue.else_statements((Cobol.ELSE_NEXT_SENTENCE)) in (hojfelds_NT 130,(result,ELSE1left,SENTENCE1right),rest671) end | (740,(_,(_,end_if1left,end_if1right))::rest671) => let val result= MlyValue.else_statements((Cobol.NO_ELSE)) in (hojfelds_NT 130,(result,end_if1left,end_if1right),rest671) end | (741,(_,(_,_,identifier_tallying_specifications1right))::_::_::(_,(_ ,INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, identifier_tallying_specifications1right),rest671) end | (742,(_,(_,_,inspect_replacing_specifications1right))::_::_::(_,(_, INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, inspect_replacing_specifications1right),rest671) end | (743,(_,(_,_,inspect_replacing_specifications1right))::_::_::_::_::( _,(_,INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, inspect_replacing_specifications1right),rest671) end | (744,(_,(_,_,tallying_specifications1right))::_::(_,(_, identifier1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 238,(result,identifier1left, tallying_specifications1right),rest671) end | (745,(_,(_,_,before_after_phrase1right))::(_,(_,CHARACTERS1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left,before_after_phrase1right) ,rest671) end | (746,(_,(_,_,all_or_leading_specifications1right))::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, all_or_leading_specifications1right),rest671) end | (747,(_,(_,_,tallying_specifications1right))::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left, tallying_specifications1right),rest671) end | (748,(_,(_,_,tallying_specifications1right))::_::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, tallying_specifications1right),rest671) end | (749,(_,(_,_,identifier_tallying_specifications1right))::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left, identifier_tallying_specifications1right),rest671) end | (750,(_,(_,_,identifier_tallying_specifications1right))::_::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, identifier_tallying_specifications1right),rest671) end | (751,(_,(_,_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::_::(_,(_,before_after1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 168,(result,before_after1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (752,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 168,(result,defaultPos,defaultPos),rest671) end | (753,(_,(_,BEFORE1left,BEFORE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 51,(result,BEFORE1left,BEFORE1right),rest671) end | (754,(_,(_,AFTER1left,AFTER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 51,(result,AFTER1left,AFTER1right),rest671) end | (755,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 19,(result,ALL1left,ALL1right),rest671) end | (756,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 19,(result,LEADING1left,LEADING1right),rest671) end | (757,(_,(_,_,all_or_leading_specification1right))::(_,(_, all_or_leading_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 22,(result,all_or_leading_specifications1left, all_or_leading_specification1right),rest671) end | (758,(_,(_,all_or_leading_specification1left, all_or_leading_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 22,(result,all_or_leading_specification1left, all_or_leading_specification1right),rest671) end | (759,(_,(_,_,before_after_phrase1right))::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 21,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, before_after_phrase1right),rest671) end | (760,(_,(_,_,inspect_replacing_specification1right))::(_,(_, inspect_replacing_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 167,(result,inspect_replacing_specifications1left, inspect_replacing_specification1right),rest671) end | (761,(_,(_,inspect_replacing_specification1left, inspect_replacing_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 167,(result,inspect_replacing_specification1left, inspect_replacing_specification1right),rest671) end | (762,(_,(_,_,before_after_phrase1right))::_::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 169,(result,CHARACTERS1left,before_after_phrase1right) ,rest671) end | (763,(_,(_,_,all_leading_first_specifications1right))::(_,(_, all_or_leading_or_first1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 169,(result,all_or_leading_or_first1left, all_leading_first_specifications1right),rest671) end | (764,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,ALL1left,ALL1right),rest671) end | (765,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,LEADING1left,LEADING1right),rest671) end | (766,(_,(_,FIRST1left,FIRST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,FIRST1left,FIRST1right),rest671) end | (767,(_,(_,_,all_leading_first_specification1right))::(_,(_, all_leading_first_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 17,(result,all_leading_first_specifications1left, all_leading_first_specification1right),rest671) end | (768,(_,(_,all_leading_first_specification1left, all_leading_first_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 17,(result,all_leading_first_specification1left, all_leading_first_specification1right),rest671) end | (769,(_,(_,_,before_after_phrase1right))::_::_::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 16,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, before_after_phrase1right),rest671) end | (770,(_,(_,_,output_procedure_or_giving_phrase1right))::_::_::_::_:: (_,(_,MERGE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 308,(result,MERGE1left, output_procedure_or_giving_phrase1right),rest671) end | (771,(_,(_,_,on_ascending_descending_key_phrase1right))::(_,(_, on_ascending_descending_key_phrases1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 337,(result,on_ascending_descending_key_phrases1left, on_ascending_descending_key_phrase1right),rest671) end | (772,(_,(_,on_ascending_descending_key_phrase1left, on_ascending_descending_key_phrase1right))::rest671) => let val result =MlyValue.ntVOID(()) in (hojfelds_NT 337,(result,on_ascending_descending_key_phrase1left, on_ascending_descending_key_phrase1right),rest671) end | (773,(_,(_,_,data_names1right))::_::_::(_,(_,on1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 336,(result,on1left,data_names1right),rest671) end | (774,(_,(_,_,alphabet_name1right))::_::_::(_,(_,collating1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 68,(result,collating1left,alphabet_name1right),rest671 ) end | (775,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 68,(result,defaultPos,defaultPos),rest671) end | (776,(_,(_,_,file_names1right))::_::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 515,(result,USING1left,file_names1right),rest671) end | (777,(_,(_,output_procedure_phrase1left, output_procedure_phrase1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 353,(result,output_procedure_phrase1left, output_procedure_phrase1right),rest671) end | (778,(_,(_,giving_phrase1left,giving_phrase1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 353,(result,giving_phrase1left,giving_phrase1right), rest671) end | (779,(_,(_,_,procedure_range1right))::_::_::(_,(_,OUTPUT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 354,(result,OUTPUT1left,procedure_range1right),rest671 ) end | (780,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 170,(result,procedure_name1left,procedure_name1right), rest671) end | (781,(_,(_,_,procedure_name2right))::_::(_,(_,procedure_name1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 170,(result,procedure_name1left,procedure_name2right), rest671) end | (782,(_,(_,_,file_names1right))::(_,(_,GIVING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 217,(result,GIVING1left,file_names1right),rest671) end | (783,(_,(MlyValue.identifiers identifiers,_,identifiersright as identifiers1right))::_::(_,(MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_,MOVEleft as MOVE1left,_))::rest671) => let val result=MlyValue.move_statement(( Cobol.MOVE(identifier_or_literal,identifiers, MOVEleft,identifiersright) )) in (hojfelds_NT 314,(result,MOVE1left,identifiers1right),rest671) end | (784,(_,(MlyValue.identifier identifier2,_,identifier2right))::_::(_ ,(MlyValue.identifier identifier1,_,identifierright))::_::(_,(_, MOVEleft as MOVE1left,_))::rest671) => let val result= MlyValue.move_statement(( Cobol.MOVECORRESPONDING(identifier1,identifier2, MOVEleft,identifierright) )) in (hojfelds_NT 314,(result,MOVE1left,identifier2right),rest671) end | (785,(_,(_,_,end_multiplyright as end_multiply1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_, MULTIPLYleft as MULTIPLY1left,_))::rest671) => let val result= MlyValue.multiply_statement(( Cobol.MULTIPLY(identifier_or_literal,identifier_roundeds ,size_error_clauses,MULTIPLYleft,end_multiplyright) )) in (hojfelds_NT 317,(result,MULTIPLY1left,end_multiply1right),rest671) end | (786,(_,(_,_,end_multiplyright as end_multiply1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, MULTIPLYleft as MULTIPLY1left,_))::rest671) => let val result= MlyValue.multiply_statement(( Cobol.MULTIPLY_GIVING(identifier_or_literal1,identifier_or_literal2 ,identifier_roundeds,size_error_clauses ,MULTIPLYleft,end_multiplyright) )) in (hojfelds_NT 317,(result,MULTIPLY1left,end_multiply1right),rest671) end | (787,(_,(_,_,io_phrases1right))::(_,(_,OPEN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 341,(result,OPEN1left,io_phrases1right),rest671) end | (788,(_,(_,_,io_phrase1right))::(_,(_,io_phrases1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 274,(result,io_phrases1left,io_phrase1right),rest671) end | (789,(_,(_,io_phrase1left,io_phrase1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 274,(result,io_phrase1left,io_phrase1right),rest671) end | (790,(_,(_,_,file_input_specifications1right))::(_,(_,INPUT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,INPUT1left,file_input_specifications1right ),rest671) end | (791,(_,(_,_,file_output_specifications1right))::(_,(_,OUTPUT1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,OUTPUT1left, file_output_specifications1right),rest671) end | (792,(_,(_,_,file_names1right))::(_,(_,IO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,IO1left,file_names1right),rest671) end | (793,(_,(_,_,file_names1right))::(_,(_,EXTEND1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,EXTEND1left,file_names1right),rest671) end | (794,(_,(_,_,file_input_specification1right))::(_,(_, file_input_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 199,(result,file_input_specifications1left, file_input_specification1right),rest671) end | (795,(_,(_,file_input_specification1left, file_input_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 199,(result,file_input_specification1left, file_input_specification1right),rest671) end | (796,(_,(_,_,file_input_specification_attribute1right))::(_,(_, file_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 197,(result,file_name1left, file_input_specification_attribute1right),rest671) end | (797,(_,(_,REVERSED1left,REVERSED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,REVERSED1left,REVERSED1right),rest671) end | (798,(_,(_,_,REWIND1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,with1left,REWIND1right),rest671) end | (799,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,defaultPos,defaultPos),rest671) end | (800,(_,(_,_,file_output_specification1right))::(_,(_, file_output_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 206,(result,file_output_specifications1left, file_output_specification1right),rest671) end | (801,(_,(_,file_output_specification1left, file_output_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 206,(result,file_output_specification1left, file_output_specification1right),rest671) end | (802,(_,(_,_,file_output_specification_attribute1right))::(_,(_, file_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 204,(result,file_name1left, file_output_specification_attribute1right),rest671) end | (803,(_,(_,_,REWIND1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 205,(result,with1left,REWIND1right),rest671) end | (804,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 205,(result,defaultPos,defaultPos),rest671) end | (805,(_,(_,_,procedure_range1right))::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,procedure_range1right), rest671) end | (806,(_,(_,_,times_phrase1right))::_::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,times_phrase1right),rest671) end | (807,(_,(_,_,until_phrase1right))::_::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,until_phrase1right),rest671) end | (808,(_,(_,_,test_varying_phrase1right))::_::(_,(_,PERFORM1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,test_varying_phrase1right), rest671) end | (809,(_,(_,_,TIMES1right))::(_,(_,identifier_or_integer1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 498,(result,identifier_or_integer1left,TIMES1right), rest671) end | (810,(_,(_,_,conditional_expression1right))::(_,(_,UNTIL1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 484,(result,UNTIL1left,conditional_expression1right), rest671) end | (811,(_,(_,_,after_phrases1right))::_::_::_::_::_::_::_::(_,(_, VARYING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 485,(result,VARYING1left,after_phrases1right),rest671) end | (812,(_,(_,_,after_phrase1right))::(_,(_,after_phrases1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 14,(result,after_phrases1left,after_phrase1right), rest671) end | (813,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 14,(result,defaultPos,defaultPos),rest671) end | (814,(_,(_,_,conditional_expression1right))::_::_::_::_::_::_::(_,(_ ,AFTER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 13,(result,AFTER1left,conditional_expression1right), rest671) end | (815,(_,(_,_,end_read1right))::_::_::_::_::_::_::(_,(_,READ1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 377,(result,READ1left,end_read1right),rest671) end | (816,(_,(_,_,identifier1right))::(_,(_,INTO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 266,(result,INTO1left,identifier1right),rest671) end | (817,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 266,(result,defaultPos,defaultPos),rest671) end | (818,(_,(_,_,data_name1right))::_::(_,(_,KEY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 283,(result,KEY1left,data_name1right),rest671) end | (819,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 283,(result,defaultPos,defaultPos),rest671) end | (820,(_,(_,end_error_clauses1left,end_error_clauses1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 141,(result,end_error_clauses1left, end_error_clauses1right),rest671) end | (821,(_,(_,invalid_key_error_clauses1left, invalid_key_error_clauses1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 141,(result,invalid_key_error_clauses1left, invalid_key_error_clauses1right),rest671) end | (822,(_,(_,_,not_end_error_clause1right))::(_,(_, end_error_clause1left,_))::rest671) => let val result=MlyValue.ntVOID( ()) in (hojfelds_NT 137,(result,end_error_clause1left, not_end_error_clause1right),rest671) end | (823,(_,(_,_,imperative_statement1right))::_::(_,(_,at1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 136,(result,at1left,imperative_statement1right), rest671) end | (824,(_,(_,_,imperative_statement1right))::_::_::(_,(_,NOT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 321,(result,NOT1left,imperative_statement1right), rest671) end | (825,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 321,(result,defaultPos,defaultPos),rest671) end | (826,(_,(_,_,from_identifier1right))::_::(_,(_,RELEASE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 400,(result,RELEASE1left,from_identifier1right), rest671) end | (827,(_,(_,_,identifier1right))::(_,(_,FROM1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 216,(result,FROM1left,identifier1right),rest671) end | (828,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 216,(result,defaultPos,defaultPos),rest671) end | (829,(_,(_,_,end_return1right))::_::_::_::_::(_,(_,RETURN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 411,(result,RETURN1left,end_return1right),rest671) end | (830,(_,(_,_,end_rewrite1right))::_::_::_::(_,(_,REWRITE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 412,(result,REWRITE1left,end_rewrite1right),rest671) end | (831,(_,(_,_,end_search1right))::_::_::_::_::(_,(_,SEARCH1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 421,(result,SEARCH1left,end_search1right),rest671) end | (832,(_,(_,_,end_search1right))::_::_::_::_::_::_::(_,(_,SEARCH1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 421,(result,SEARCH1left,end_search1right),rest671) end | (833,(_,(_,_,identifier1right))::(_,(_,VARYING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 523,(result,VARYING1left,identifier1right),rest671) end | (834,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 523,(result,defaultPos,defaultPos),rest671) end | (835,(_,(_,end_error_clause1left,end_error_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 173,(result,end_error_clause1left, end_error_clause1right),rest671) end | (836,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 173,(result,defaultPos,defaultPos),rest671) end | (837,(_,(_,_,search_when_phrase1right))::(_,(_, search_when_phrases1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 172,(result,search_when_phrases1left, search_when_phrase1right),rest671) end | (838,(_,(_,search_when_phrase1left,search_when_phrase1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 172,(result,search_when_phrase1left, search_when_phrase1right),rest671) end | (839,(_,(_,_,then_statement1right))::_::(_,(_,WHEN1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 174,(result,WHEN1left,then_statement1right),rest671) end | (840,(_,(_,_,identifier_or_integer1right))::_::_::(_,(_,SET1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,identifier_or_integer1right), rest671) end | (841,(_,(_,_,identifier_or_integer1right))::_::_::(_,(_,SET1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,identifier_or_integer1right), rest671) end | (842,(_,(_,_,mnemonic_switches1right))::(_,(_,SET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,mnemonic_switches1right),rest671) end | (843,(_,(_,_,TRUE1right))::_::_::(_,(_,SET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,TRUE1right),rest671) end | (844,(_,(_,_,BY1right))::(_,(_,UP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 505,(result,UP1left,BY1right),rest671) end | (845,(_,(_,_,BY1right))::(_,(_,DOWN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 505,(result,DOWN1left,BY1right),rest671) end | (846,(_,(_,_,mnemonic_switch1right))::(_,(_,mnemonic_switches1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 312,(result,mnemonic_switches1left, mnemonic_switch1right),rest671) end | (847,(_,(_,mnemonic_switch1left,mnemonic_switch1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 312,(result,mnemonic_switch1left,mnemonic_switch1right ),rest671) end | (848,(_,(_,_,on_off1right))::_::(_,(_,identifiers1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 311,(result,identifiers1left,on_off1right),rest671) end | (849,(_,(_,ON1left,ON1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 338,(result,ON1left,ON1right),rest671) end | (850,(_,(_,OFF1left,OFF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 338,(result,OFF1left,OFF1right),rest671) end | (851,(_,(_,_,output_procedure_or_giving_phrase1right))::_::_::_::_:: (_,(_,SORT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 448,(result,SORT1left, output_procedure_or_giving_phrase1right),rest671) end | (852,(_,(_,input_procedure_phrase1left,input_procedure_phrase1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 176,(result,input_procedure_phrase1left, input_procedure_phrase1right),rest671) end | (853,(_,(_,sort_using_phrase1left,sort_using_phrase1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 176,(result,sort_using_phrase1left, sort_using_phrase1right),rest671) end | (854,(_,(_,_,procedure_range1right))::_::_::(_,(_,INPUT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 261,(result,INPUT1left,procedure_range1right),rest671) end | (855,(_,(_,_,file_names1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 175,(result,USING1left,file_names1right),rest671) end | (856,(_,(_,_,end_start1right))::_::_::_::(_,(_,START1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 457,(result,START1left,end_start1right),rest671) end | (857,(_,(_,_,qdata_names1right))::_::_::(_,(_,KEY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 284,(result,KEY1left,qdata_names1right),rest671) end | (858,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 284,(result,defaultPos,defaultPos),rest671) end | (859,(_,(_,_,RUN1right))::(_,(_,STOP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 466,(result,STOP1left,RUN1right),rest671) end | (860,(_,(_,_,literal1right))::(_,(_,STOP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 466,(result,STOP1left,literal1right),rest671) end | (861,(_,(_,_,end_string1right))::_::_::_::_::_::(_,(_,STRING1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 469,(result,STRING1left,end_string1right),rest671) end | (862,(_,(_,_,string_specification1right))::(_,(_, string_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 468,(result,string_specifications1left, string_specification1right),rest671) end | (863,(_,(_,string_specification1left,string_specification1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 468,(result,string_specification1left, string_specification1right),rest671) end | (864,(_,(_,_,identifier_literal_size1right))::_::_::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, _))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 467,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, identifier_literal_size1right),rest671) end | (865,(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 231,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (866,(_,(_,SIZE1left,SIZE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 231,(result,SIZE1left,SIZE1right),rest671) end | (867,(_,(_,_,identifier1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 364,(result,with1left,identifier1right),rest671) end | (868,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 364,(result,defaultPos,defaultPos),rest671) end | (869,(_,(_,_,imperative_statement1right))::_::(_,(_,on1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 355,(result,on1left,imperative_statement1right), rest671) end | (870,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 355,(result,defaultPos,defaultPos),rest671) end | (871,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT (Cobol.SUBTRACT,identifier_or_literals,identifier_roundeds, size_error_clauses, SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (872,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT_GIVING (Cobol.SUBTRACT,identifier_or_literals,identifier_or_literal, identifier_roundeds, size_error_clauses,SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (873,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.rounded rounded,_,_))::(_,(MlyValue.identifier identifier2,_, _))::_::(_,(MlyValue.identifier identifier1,_,_))::_::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT_CORRESPONDING (Cobol.SUBTRACT,identifier1,identifier2,rounded, size_error_clauses,SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (874,(_,(_,_,TRACE1right))::(_,(_,READY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 503,(result,READY1left,TRACE1right),rest671) end | (875,(_,(_,_,TRACE1right))::(_,(_,RESET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 503,(result,RESET1left,TRACE1right),rest671) end | (876,(_,(_,_,end_unstring1right))::_::_::_::_::_::_::(_,(_, UNSTRING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 504,(result,UNSTRING1left,end_unstring1right),rest671) end | (877,(_,(_,_,delimited_by_specifications1right))::_::(_,(_, DELIMITED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 124,(result,DELIMITED1left, delimited_by_specifications1right),rest671) end | (878,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 124,(result,defaultPos,defaultPos),rest671) end | (879,(_,(_,_,delimited_by_specifications2right))::_::(_,(_, delimited_by_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 177,(result,delimited_by_specifications1left, delimited_by_specifications2right),rest671) end | (880,(_,(_,_,identifier_or_literal1right))::(_,(_,all1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 177,(result,all1left,identifier_or_literal1right), rest671) end | (881,(_,(_,_,into_specifications1right))::(_,(_,INTO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 267,(result,INTO1left,into_specifications1right), rest671) end | (882,(_,(_,_,into_specification1right))::(_,(_, into_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 269,(result,into_specifications1left, into_specification1right),rest671) end | (883,(_,(_,into_specification1left,into_specification1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 269,(result,into_specification1left, into_specification1right),rest671) end | (884,(_,(_,_,count_specification1right))::_::(_,(_,identifier1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 268,(result,identifier1left,count_specification1right) ,rest671) end | (885,(_,(_,_,identifier1right))::_::(_,(_,DELIMITER1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 125,(result,DELIMITER1left,identifier1right),rest671) end | (886,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 125,(result,defaultPos,defaultPos),rest671) end | (887,(_,(_,_,identifier1right))::_::(_,(_,COUNT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 83,(result,COUNT1left,identifier1right),rest671) end | (888,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 83,(result,defaultPos,defaultPos),rest671) end | (889,(_,(_,_,identifier1right))::_::(_,(_,TALLYING1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 479,(result,TALLYING1left,identifier1right),rest671) end | (890,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 479,(result,defaultPos,defaultPos),rest671) end | (891,(_,(_,_,io_specification1right))::_::_::_::_::_::(_,(_,USE1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 511,(result,USE1left,io_specification1right),rest671) end | (892,(_,(_,_,procedure_specification1right))::_::_::_::(_,(_, USE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 511,(result,USE1left,procedure_specification1right), rest671) end | (893,(_,(_,_,PROCEDURES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,ALL1left,PROCEDURES1right),rest671) end | (894,(_,(_,_,procedure_names1right))::_::(_,(_,ALL1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,ALL1left,procedure_names1right),rest671) end | (895,(_,(_,procedure_names1left,procedure_names1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,procedure_names1left,procedure_names1right ),rest671) end | (896,(_,(_,EXCEPTION1left,EXCEPTION1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 160,(result,EXCEPTION1left,EXCEPTION1right),rest671) end | (897,(_,(_,ERROR1left,ERROR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 160,(result,ERROR1left,ERROR1right),rest671) end | (898,(_,(_,file_names1left,file_names1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,file_names1left,file_names1right),rest671) end | (899,(_,(_,INPUT1left,INPUT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,INPUT1left,INPUT1right),rest671) end | (900,(_,(_,OUTPUT1left,OUTPUT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,OUTPUT1left,OUTPUT1right),rest671) end | (901,(_,(_,IO1left,IO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,IO1left,IO1right),rest671) end | (902,(_,(_,EXTEND1left,EXTEND1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,EXTEND1left,EXTEND1right),rest671) end | (903,(_,(_,_,end_write1right))::_::_::_::_::_::_::_::_::(_,(_, WRITE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 530,(result,WRITE1left,end_write1right),rest671) end | (904,(_,(_,_,end_write1right))::_::_::_::_::_::(_,(_,WRITE1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 530,(result,WRITE1left,end_write1right),rest671) end | (905,(_,(_,_,identifier_or_literal1right))::_::(_,(_,FORMAT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 531,(result,FORMAT1left,identifier_or_literal1right), rest671) end | (906,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 531,(result,defaultPos,defaultPos),rest671) end | (907,(_,(_,_,identifier_or_literal1right))::_::(_,(_,TERMINAL1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 532,(result,TERMINAL1left,identifier_or_literal1right) ,rest671) end | (908,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 532,(result,defaultPos,defaultPos),rest671) end | (909,(_,(_,_,identifier_or_literal1right))::_::(_,(_,STARTING1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 533,(result,STARTING1left,identifier_or_literal1right) ,rest671) end | (910,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 533,(result,defaultPos,defaultPos),rest671) end | (911,(_,(_,AT1left,AT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,AT1left,AT1right),rest671) end | (912,(_,(_,LINE1left,LINE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,LINE1left,LINE1right),rest671) end | (913,(_,(_,_,LINE1right))::(_,(_,AT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,AT1left,LINE1right),rest671) end | (914,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,defaultPos,defaultPos),rest671) end | (915,(_,(_,_,lines_pages_specification1right))::(_,(_,advancing1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 12,(result,advancing1left, lines_pages_specification1right),rest671) end | (916,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 12,(result,defaultPos,defaultPos),rest671) end | (917,(_,(_,_,line_or_lines2right))::_::_::_::_::_::_::(_,(_, ROLLING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 534,(result,ROLLING1left,line_or_lines2right),rest671) end | (918,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 534,(result,defaultPos,defaultPos),rest671) end | (919,(_,(_,_,rolling_phrase1right))::_::(_,(_,before_after1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 540,(result,before_after1left,rolling_phrase1right), rest671) end | (920,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 540,(result,defaultPos,defaultPos),rest671) end | (921,(_,(_,_,identifier1right))::_::(_,(_,indicator1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 535,(result,indicator1left,identifier1right),rest671) end | (922,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 535,(result,defaultPos,defaultPos),rest671) end | (923,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,IS1left,IS1right),rest671) end | (924,(_,(_,ARE1left,ARE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,ARE1left,ARE1right),rest671) end | (925,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,defaultPos,defaultPos),rest671) end | (926,(_,(_,through1left,through1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 537,(result,through1left,through1right),rest671) end | (927,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 537,(result,defaultPos,defaultPos),rest671) end | (928,(_,(_,_,line_or_lines1right))::(_,(_,identifier1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,identifier1left,line_or_lines1right), rest671) end | (929,(_,(_,_,line_or_lines1right))::(_,(_,INTEGER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,INTEGER1left,line_or_lines1right),rest671) end | (930,(_,(_,PAGE1left,PAGE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,PAGE1left,PAGE1right),rest671) end | (931,(_,(_,_,imperative_statement1right))::_::(_,(_,AT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 156,(result,AT1left,imperative_statement1right), rest671) end | (932,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 156,(result,defaultPos,defaultPos),rest671) end | (933,(_,(_,ENDOFPAGE1left,ENDOFPAGE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 140,(result,ENDOFPAGE1left,ENDOFPAGE1right),rest671) end | (934,(_,(_,EOP1left,EOP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 140,(result,EOP1left,EOP1right),rest671) end | (935,(_,(_,_,copy_replacing_phrase1right))::_::_::(_,(_,COPY1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 81,(result,COPY1left,copy_replacing_phrase1right), rest671) end | (936,(_,(_,_,library_name1right))::(_,(_,OF1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,OF1left,library_name1right),rest671) end | (937,(_,(_,_,library_name1right))::(_,(_,IN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,IN1left,library_name1right),rest671) end | (938,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,defaultPos,defaultPos),rest671) end | (939,(_,(_,_,copy_replacing_specifications1right))::(_,(_, REPLACING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 178,(result,REPLACING1left, copy_replacing_specifications1right),rest671) end | (940,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 178,(result,defaultPos,defaultPos),rest671) end | (941,(_,(_,_,copy_replacing_specification1right))::(_,(_, copy_replacing_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 179,(result,copy_replacing_specifications1left, copy_replacing_specification1right),rest671) end | (942,(_,(_,copy_replacing_specification1left, copy_replacing_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 179,(result,copy_replacing_specification1left, copy_replacing_specification1right),rest671) end | (943,(_,(_,_,operand2right))::_::(_,(_,operand1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 180,(result,operand1left,operand2right),rest671) end | (944,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,identifier1left,identifier1right),rest671) end | (945,(_,(_,literal1left,literal1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,literal1left,literal1right),rest671) end | (946,(_,(_,PSEUDOTEXT1left,PSEUDOTEXT1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,PSEUDOTEXT1left,PSEUDOTEXT1right),rest671) end | _ => raise Hojfeld "_" (*(mlyAction i392)*) val void = MlyValue.VOID val extract = fn a => (fn MlyValue.test_cobol x => x | _ => let exception ParseInternal in raise ParseInternal end) a mlton-20210117+dfsg/regression/command-line.ok000066400000000000000000000000171416264345000211020ustar00rootroot00000000000000./command-line mlton-20210117+dfsg/regression/command-line.sml000066400000000000000000000003301416264345000212620ustar00rootroot00000000000000(* print out the command name and all of the command line arguments on separate lines *) val _ = (print(CommandLine.name()) ; print "\n" ; app (fn s => (print s ; print "\n")) (CommandLine.arguments())) mlton-20210117+dfsg/regression/comment-end.sml000066400000000000000000000000551416264345000211310ustar00rootroot00000000000000val ** = 13 val x = ( **) val _ = 1 + ** + x mlton-20210117+dfsg/regression/common-subexp0.ok000066400000000000000000000000041416264345000214070ustar00rootroot00000000000000nan mlton-20210117+dfsg/regression/common-subexp0.sml000066400000000000000000000001171416264345000215760ustar00rootroot00000000000000val x = !(ref 0.0) / !(ref 0.0) val _ = print (concat [Real.toString x, "\n"]) mlton-20210117+dfsg/regression/constraint.ok000066400000000000000000000000131416264345000207170ustar00rootroot00000000000000A(hello,5) mlton-20210117+dfsg/regression/constraint.sml000066400000000000000000000006601416264345000211110ustar00rootroot00000000000000signature S = sig type ('a, 'b) t val A : 'a * int -> ('a, int) t val pr : ('a -> string) -> ('b -> string) -> ('a, 'b) t -> string end structure S = struct datatype ('a, 'b) t = A of 'a * 'b fun pr pr_a pr_b (A(a,b)) = "A(" ^ pr_a a ^ "," ^ pr_b b ^ ")" end structure S' = S : S val s = S'.pr (fn s => s) (Int.toString) (S'.A("hello",5)) val _ = print (s ^ "\n") mlton-20210117+dfsg/regression/conv.ok000066400000000000000000000000071416264345000175030ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/conv.sml000066400000000000000000000024661416264345000177000ustar00rootroot00000000000000val big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val small = SOME (IntInf.toInt barg) handle Overflow => NONE val bstr = IntInf.toString barg fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n") val isSmall = ~ big <= barg andalso barg < big in case small of NONE => if isSmall then fail "1" else () | SOME sarg => if isSmall then let val sstr = Int.toString sarg in if bstr = sstr andalso barg = IntInf.fromInt sarg then () else fail "2" end else fail "3" end fun spin (low: IntInf.int, limit: IntInf.int): unit = let fun loop (arg: IntInf.int): unit = if arg = limit then () else ( try arg; try (~ arg); loop (arg + 1) ) in loop low end val _ = spin (0, 1000) val _ = spin (big - 1000, big + 1000) val _ = print "All ok\n" mlton-20210117+dfsg/regression/conv2.ok000066400000000000000000000000071416264345000175650ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/conv2.sml000066400000000000000000001427401416264345000177620ustar00rootroot00000000000000val arg: { v: IntInf.int, b: string, oc: string, d: string, x: string} list = [ {v = 0, b = "0", oc = "0", d = "0", x = "0"}, {v = ~0, b = "~0", oc = "~0", d = "~0", x = "~0"}, {v = 1, b = "1", oc = "1", d = "1", x = "1"}, {v = ~1, b = "~1", oc = "~1", d = "~1", x = "~1"}, {v = 2, b = "10", oc = "2", d = "2", x = "2"}, {v = ~2, b = "~10", oc = "~2", d = "~2", x = "~2"}, {v = 3, b = "11", oc = "3", d = "3", x = "3"}, {v = ~3, b = "~11", oc = "~3", d = "~3", x = "~3"}, {v = 4, b = "100", oc = "4", d = "4", x = "4"}, {v = ~4, b = "~100", oc = "~4", d = "~4", x = "~4"}, {v = 5, b = "101", oc = "5", d = "5", x = "5"}, {v = ~5, b = "~101", oc = "~5", d = "~5", x = "~5"}, {v = 6, b = "110", oc = "6", d = "6", x = "6"}, {v = ~6, b = "~110", oc = "~6", d = "~6", x = "~6"}, {v = 7, b = "111", oc = "7", d = "7", x = "7"}, {v = ~7, b = "~111", oc = "~7", d = "~7", x = "~7"}, {v = 8, b = "1000", oc = "10", d = "8", x = "8"}, {v = ~8, b = "~1000", oc = "~10", d = "~8", x = "~8"}, {v = 9, b = "1001", oc = "11", d = "9", x = "9"}, {v = ~9, b = "~1001", oc = "~11", d = "~9", x = "~9"}, {v = 10, b = "1010", oc = "12", d = "10", x = "A"}, {v = ~10, b = "~1010", oc = "~12", d = "~10", x = "~A"}, {v = 11, b = "1011", oc = "13", d = "11", x = "B"}, {v = ~11, b = "~1011", oc = "~13", d = "~11", x = "~B"}, {v = 12, b = "1100", oc = "14", d = "12", x = "C"}, {v = ~12, b = "~1100", oc = "~14", d = "~12", x = "~C"}, {v = 13, b = "1101", oc = "15", d = "13", x = "D"}, {v = ~13, b = "~1101", oc = "~15", d = "~13", x = "~D"}, {v = 14, b = "1110", oc = "16", d = "14", x = "E"}, {v = ~14, b = "~1110", oc = "~16", d = "~14", x = "~E"}, {v = 15, b = "1111", oc = "17", d = "15", x = "F"}, {v = ~15, b = "~1111", oc = "~17", d = "~15", x = "~F"}, {v = 16, b = "10000", oc = "20", d = "16", x = "10"}, {v = ~16, b = "~10000", oc = "~20", d = "~16", x = "~10"}, {v = 17, b = "10001", oc = "21", d = "17", x = "11"}, {v = ~17, b = "~10001", oc = "~21", d = "~17", x = "~11"}, {v = 18, b = "10010", oc = "22", d = "18", x = "12"}, {v = ~18, b = "~10010", oc = "~22", d = "~18", x = "~12"}, {v = 19, b = "10011", oc = "23", d = "19", x = "13"}, {v = ~19, b = "~10011", oc = "~23", d = "~19", x = "~13"}, {v = 20, b = "10100", oc = "24", d = "20", x = "14"}, {v = ~20, b = "~10100", oc = "~24", d = "~20", x = "~14"}, {v = 21, b = "10101", oc = "25", d = "21", x = "15"}, {v = ~21, b = "~10101", oc = "~25", d = "~21", x = "~15"}, {v = 22, b = "10110", oc = "26", d = "22", x = "16"}, {v = ~22, b = "~10110", oc = "~26", d = "~22", x = "~16"}, {v = 23, b = "10111", oc = "27", d = "23", x = "17"}, {v = ~23, b = "~10111", oc = "~27", d = "~23", x = "~17"}, {v = 24, b = "11000", oc = "30", d = "24", x = "18"}, {v = ~24, b = "~11000", oc = "~30", d = "~24", x = "~18"}, {v = 25, b = "11001", oc = "31", d = "25", x = "19"}, {v = ~25, b = "~11001", oc = "~31", d = "~25", x = "~19"}, {v = 26, b = "11010", oc = "32", d = "26", x = "1A"}, {v = ~26, b = "~11010", oc = "~32", d = "~26", x = "~1A"}, {v = 27, b = "11011", oc = "33", d = "27", x = "1B"}, {v = ~27, b = "~11011", oc = "~33", d = "~27", x = "~1B"}, {v = 28, b = "11100", oc = "34", d = "28", x = "1C"}, {v = ~28, b = "~11100", oc = "~34", d = "~28", x = "~1C"}, {v = 29, b = "11101", oc = "35", d = "29", x = "1D"}, {v = ~29, b = "~11101", oc = "~35", d = "~29", x = "~1D"}, {v = 30, b = "11110", oc = "36", d = "30", x = "1E"}, {v = ~30, b = "~11110", oc = "~36", d = "~30", x = "~1E"}, {v = 31, b = "11111", oc = "37", d = "31", x = "1F"}, {v = ~31, b = "~11111", oc = "~37", d = "~31", x = "~1F"}, {v = 32, b = "100000", oc = "40", d = "32", x = "20"}, {v = ~32, b = "~100000", oc = "~40", d = "~32", x = "~20"}, {v = 33, b = "100001", oc = "41", d = "33", x = "21"}, {v = ~33, b = "~100001", oc = "~41", d = "~33", x = "~21"}, {v = 34, b = "100010", oc = "42", d = "34", x = "22"}, {v = ~34, b = "~100010", oc = "~42", d = "~34", x = "~22"}, {v = 35, b = "100011", oc = "43", d = "35", x = "23"}, {v = ~35, b = "~100011", oc = "~43", d = "~35", x = "~23"}, {v = 36, b = "100100", oc = "44", d = "36", x = "24"}, {v = ~36, b = "~100100", oc = "~44", d = "~36", x = "~24"}, {v = 37, b = "100101", oc = "45", d = "37", x = "25"}, {v = ~37, b = "~100101", oc = "~45", d = "~37", x = "~25"}, {v = 38, b = "100110", oc = "46", d = "38", x = "26"}, {v = ~38, b = "~100110", oc = "~46", d = "~38", x = "~26"}, {v = 39, b = "100111", oc = "47", d = "39", x = "27"}, {v = ~39, b = "~100111", oc = "~47", d = "~39", x = "~27"}, {v = 40, b = "101000", oc = "50", d = "40", x = "28"}, {v = ~40, b = "~101000", oc = "~50", d = "~40", x = "~28"}, {v = 41, b = "101001", oc = "51", d = "41", x = "29"}, {v = ~41, b = "~101001", oc = "~51", d = "~41", x = "~29"}, {v = 42, b = "101010", oc = "52", d = "42", x = "2A"}, {v = ~42, b = "~101010", oc = "~52", d = "~42", x = "~2A"}, {v = 43, b = "101011", oc = "53", d = "43", x = "2B"}, {v = ~43, b = "~101011", oc = "~53", d = "~43", x = "~2B"}, {v = 44, b = "101100", oc = "54", d = "44", x = "2C"}, {v = ~44, b = "~101100", oc = "~54", d = "~44", x = "~2C"}, {v = 45, b = "101101", oc = "55", d = "45", x = "2D"}, {v = ~45, b = "~101101", oc = "~55", d = "~45", x = "~2D"}, {v = 46, b = "101110", oc = "56", d = "46", x = "2E"}, {v = ~46, b = "~101110", oc = "~56", d = "~46", x = "~2E"}, {v = 47, b = "101111", oc = "57", d = "47", x = "2F"}, {v = ~47, b = "~101111", oc = "~57", d = "~47", x = "~2F"}, {v = 48, b = "110000", oc = "60", d = "48", x = "30"}, {v = ~48, b = "~110000", oc = "~60", d = "~48", x = "~30"}, {v = 49, b = "110001", oc = "61", d = "49", x = "31"}, {v = ~49, b = "~110001", oc = "~61", d = "~49", x = "~31"}, {v = 50, b = "110010", oc = "62", d = "50", x = "32"}, {v = ~50, b = "~110010", oc = "~62", d = "~50", x = "~32"}, {v = 51, b = "110011", oc = "63", d = "51", x = "33"}, {v = ~51, b = "~110011", oc = "~63", d = "~51", x = "~33"}, {v = 52, b = "110100", oc = "64", d = "52", x = "34"}, {v = ~52, b = "~110100", oc = "~64", d = "~52", x = "~34"}, {v = 53, b = "110101", oc = "65", d = "53", x = "35"}, {v = ~53, b = "~110101", oc = "~65", d = "~53", x = "~35"}, {v = 54, b = "110110", oc = "66", d = "54", x = "36"}, {v = ~54, b = "~110110", oc = "~66", d = "~54", x = "~36"}, {v = 55, b = "110111", oc = "67", d = "55", x = "37"}, {v = ~55, b = "~110111", oc = "~67", d = "~55", x = "~37"}, {v = 56, b = "111000", oc = "70", d = "56", x = "38"}, {v = ~56, b = "~111000", oc = "~70", d = "~56", x = "~38"}, {v = 57, b = "111001", oc = "71", d = "57", x = "39"}, {v = ~57, b = "~111001", oc = "~71", d = "~57", x = "~39"}, {v = 58, b = "111010", oc = "72", d = "58", x = "3A"}, {v = ~58, b = "~111010", oc = "~72", d = "~58", x = "~3A"}, {v = 59, b = "111011", oc = "73", d = "59", x = "3B"}, {v = ~59, b = "~111011", oc = "~73", d = "~59", x = "~3B"}, {v = 60, b = "111100", oc = "74", d = "60", x = "3C"}, {v = ~60, b = "~111100", oc = "~74", d = "~60", x = "~3C"}, {v = 61, b = "111101", oc = "75", d = "61", x = "3D"}, {v = ~61, b = "~111101", oc = "~75", d = "~61", x = "~3D"}, {v = 62, b = "111110", oc = "76", d = "62", x = "3E"}, {v = ~62, b = "~111110", oc = "~76", d = "~62", x = "~3E"}, {v = 63, b = "111111", oc = "77", d = "63", x = "3F"}, {v = ~63, b = "~111111", oc = "~77", d = "~63", x = "~3F"}, {v = 64, b = "1000000", oc = "100", d = "64", x = "40"}, {v = ~64, b = "~1000000", oc = "~100", d = "~64", x = "~40"}, {v = 65, b = "1000001", oc = "101", d = "65", x = "41"}, {v = ~65, b = "~1000001", oc = "~101", d = "~65", x = "~41"}, {v = 66, b = "1000010", oc = "102", d = "66", x = "42"}, {v = ~66, b = "~1000010", oc = "~102", d = "~66", x = "~42"}, {v = 67, b = "1000011", oc = "103", d = "67", x = "43"}, {v = ~67, b = "~1000011", oc = "~103", d = "~67", x = "~43"}, {v = 68, b = "1000100", oc = "104", d = "68", x = "44"}, {v = ~68, b = "~1000100", oc = "~104", d = "~68", x = "~44"}, {v = 69, b = "1000101", oc = "105", d = "69", x = "45"}, {v = ~69, b = "~1000101", oc = "~105", d = "~69", x = "~45"}, {v = 70, b = "1000110", oc = "106", d = "70", x = "46"}, {v = ~70, b = "~1000110", oc = "~106", d = "~70", x = "~46"}, {v = 71, b = "1000111", oc = "107", d = "71", x = "47"}, {v = ~71, b = "~1000111", oc = "~107", d = "~71", x = "~47"}, {v = 72, b = "1001000", oc = "110", d = "72", x = "48"}, {v = ~72, b = "~1001000", oc = "~110", d = "~72", x = "~48"}, {v = 73, b = "1001001", oc = "111", d = "73", x = "49"}, {v = ~73, b = "~1001001", oc = "~111", d = "~73", x = "~49"}, {v = 74, b = "1001010", oc = "112", d = "74", x = "4A"}, {v = ~74, b = "~1001010", oc = "~112", d = "~74", x = "~4A"}, {v = 75, b = "1001011", oc = "113", d = "75", x = "4B"}, {v = ~75, b = "~1001011", oc = "~113", d = "~75", x = "~4B"}, {v = 76, b = "1001100", oc = "114", d = "76", x = "4C"}, {v = ~76, b = "~1001100", oc = "~114", d = "~76", x = "~4C"}, {v = 77, b = "1001101", oc = "115", d = "77", x = "4D"}, {v = ~77, b = "~1001101", oc = "~115", d = "~77", x = "~4D"}, {v = 78, b = "1001110", oc = "116", d = "78", x = "4E"}, {v = ~78, b = "~1001110", oc = "~116", d = "~78", x = "~4E"}, {v = 79, b = "1001111", oc = "117", d = "79", x = "4F"}, {v = ~79, b = "~1001111", oc = "~117", d = "~79", x = "~4F"}, {v = 80, b = "1010000", oc = "120", d = "80", x = "50"}, {v = ~80, b = "~1010000", oc = "~120", d = "~80", x = "~50"}, {v = 81, b = "1010001", oc = "121", d = "81", x = "51"}, {v = ~81, b = "~1010001", oc = "~121", d = "~81", x = "~51"}, {v = 82, b = "1010010", oc = "122", d = "82", x = "52"}, {v = ~82, b = "~1010010", oc = "~122", d = "~82", x = "~52"}, {v = 83, b = "1010011", oc = "123", d = "83", x = "53"}, {v = ~83, b = "~1010011", oc = "~123", d = "~83", x = "~53"}, {v = 84, b = "1010100", oc = "124", d = "84", x = "54"}, {v = ~84, b = "~1010100", oc = "~124", d = "~84", x = "~54"}, {v = 85, b = "1010101", oc = "125", d = "85", x = "55"}, {v = ~85, b = "~1010101", oc = "~125", d = "~85", x = "~55"}, {v = 86, b = "1010110", oc = "126", d = "86", x = "56"}, {v = ~86, b = "~1010110", oc = "~126", d = "~86", x = "~56"}, {v = 87, b = "1010111", oc = "127", d = "87", x = "57"}, {v = ~87, b = "~1010111", oc = "~127", d = "~87", x = "~57"}, {v = 88, b = "1011000", oc = "130", d = "88", x = "58"}, {v = ~88, b = "~1011000", oc = "~130", d = "~88", x = "~58"}, {v = 89, b = "1011001", oc = "131", d = "89", x = "59"}, {v = ~89, b = "~1011001", oc = "~131", d = "~89", x = "~59"}, {v = 90, b = "1011010", oc = "132", d = "90", x = "5A"}, {v = ~90, b = "~1011010", oc = "~132", d = "~90", x = "~5A"}, {v = 91, b = "1011011", oc = "133", d = "91", x = "5B"}, {v = ~91, b = "~1011011", oc = "~133", d = "~91", x = "~5B"}, {v = 92, b = "1011100", oc = "134", d = "92", x = "5C"}, {v = ~92, b = "~1011100", oc = "~134", d = "~92", x = "~5C"}, {v = 93, b = "1011101", oc = "135", d = "93", x = "5D"}, {v = ~93, b = "~1011101", oc = "~135", d = "~93", x = "~5D"}, {v = 94, b = "1011110", oc = "136", d = "94", x = "5E"}, {v = ~94, b = "~1011110", oc = "~136", d = "~94", x = "~5E"}, {v = 95, b = "1011111", oc = "137", d = "95", x = "5F"}, {v = ~95, b = "~1011111", oc = "~137", d = "~95", x = "~5F"}, {v = 96, b = "1100000", oc = "140", d = "96", x = "60"}, {v = ~96, b = "~1100000", oc = "~140", d = "~96", x = "~60"}, {v = 97, b = "1100001", oc = "141", d = "97", x = "61"}, {v = ~97, b = "~1100001", oc = "~141", d = "~97", x = "~61"}, {v = 98, b = "1100010", oc = "142", d = "98", x = "62"}, {v = ~98, b = "~1100010", oc = "~142", d = "~98", x = "~62"}, {v = 99, b = "1100011", oc = "143", d = "99", x = "63"}, {v = ~99, b = "~1100011", oc = "~143", d = "~99", x = "~63"}, {v = 128, b = "10000000", oc = "200", d = "128", x = "80"}, {v = ~128, b = "~10000000", oc = "~200", d = "~128", x = "~80"}, {v = 256, b = "100000000", oc = "400", d = "256", x = "100"}, {v = ~256, b = "~100000000", oc = "~400", d = "~256", x = "~100"}, {v = 512, b = "1000000000", oc = "1000", d = "512", x = "200"}, {v = ~512, b = "~1000000000", oc = "~1000", d = "~512", x = "~200"}, {v = 1024, b = "10000000000", oc = "2000", d = "1024", x = "400"}, {v = ~1024, b = "~10000000000", oc = "~2000", d = "~1024", x = "~400"}, {v = 2048, b = "100000000000", oc = "4000", d = "2048", x = "800"}, {v = ~2048, b = "~100000000000", oc = "~4000", d = "~2048", x = "~800"}, {v = 4096, b = "1000000000000", oc = "10000", d = "4096", x = "1000"}, {v = ~4096, b = "~1000000000000", oc = "~10000", d = "~4096", x = "~1000"}, {v = 8192, b = "10000000000000", oc = "20000", d = "8192", x = "2000"}, {v = ~8192, b = "~10000000000000", oc = "~20000", d = "~8192", x = "~2000"}, {v = 16384, b = "100000000000000", oc = "40000", d = "16384", x = "4000"}, {v = ~16384, b = "~100000000000000", oc = "~40000", d = "~16384", x = "~4000"}, {v = 32768, b = "1000000000000000", oc = "100000", d = "32768", x = "8000"}, {v = ~32768, b = "~1000000000000000", oc = "~100000", d = "~32768", x = "~8000"}, {v = 65536, b = "10000000000000000", oc = "200000", d = "65536", x = "10000"}, {v = ~65536, b = "~10000000000000000", oc = "~200000", d = "~65536", x = "~10000"}, {v = 131072, b = "100000000000000000", oc = "400000", d = "131072", x = "20000"}, {v = ~131072, b = "~100000000000000000", oc = "~400000", d = "~131072", x = "~20000"}, {v = 262144, b = "1000000000000000000", oc = "1000000", d = "262144", x = "40000"}, {v = ~262144, b = "~1000000000000000000", oc = "~1000000", d = "~262144", x = "~40000"}, {v = 524288, b = "10000000000000000000", oc = "2000000", d = "524288", x = "80000"}, {v = ~524288, b = "~10000000000000000000", oc = "~2000000", d = "~524288", x = "~80000"}, {v = 1048576, b = "100000000000000000000", oc = "4000000", d = "1048576", x = "100000"}, {v = ~1048576, b = "~100000000000000000000", oc = "~4000000", d = "~1048576", x = "~100000"}, {v = 2097152, b = "1000000000000000000000", oc = "10000000", d = "2097152", x = "200000"}, {v = ~2097152, b = "~1000000000000000000000", oc = "~10000000", d = "~2097152", x = "~200000"}, {v = 4194304, b = "10000000000000000000000", oc = "20000000", d = "4194304", x = "400000"}, {v = ~4194304, b = "~10000000000000000000000", oc = "~20000000", d = "~4194304", x = "~400000"}, {v = 8388608, b = "100000000000000000000000", oc = "40000000", d = "8388608", x = "800000"}, {v = ~8388608, b = "~100000000000000000000000", oc = "~40000000", d = "~8388608", x = "~800000"}, {v = 16777216, b = "1000000000000000000000000", oc = "100000000", d = "16777216", x = "1000000"}, {v = ~16777216, b = "~1000000000000000000000000", oc = "~100000000", d = "~16777216", x = "~1000000"}, {v = 33554432, b = "10000000000000000000000000", oc = "200000000", d = "33554432", x = "2000000"}, {v = ~33554432, b = "~10000000000000000000000000", oc = "~200000000", d = "~33554432", x = "~2000000"}, {v = 67108864, b = "100000000000000000000000000", oc = "400000000", d = "67108864", x = "4000000"}, {v = ~67108864, b = "~100000000000000000000000000", oc = "~400000000", d = "~67108864", x = "~4000000"}, {v = 100000000, b = "101111101011110000100000000", oc = "575360400", d = "100000000", x = "5F5E100"}, {v = ~100000000, b = "~101111101011110000100000000", oc = "~575360400", d = "~100000000", x = "~5F5E100"}, {v = 134217728, b = "1000000000000000000000000000", oc = "1000000000", d = "134217728", x = "8000000"}, {v = ~134217728, b = "~1000000000000000000000000000", oc = "~1000000000", d = "~134217728", x = "~8000000"}, {v = 268435456, b = "10000000000000000000000000000", oc = "2000000000", d = "268435456", x = "10000000"}, {v = ~268435456, b = "~10000000000000000000000000000", oc = "~2000000000", d = "~268435456", x = "~10000000"}, {v = 536870912, b = "100000000000000000000000000000", oc = "4000000000", d = "536870912", x = "20000000"}, {v = ~536870912, b = "~100000000000000000000000000000", oc = "~4000000000", d = "~536870912", x = "~20000000"}, {v = 1073741822, b = "111111111111111111111111111110", oc = "7777777776", d = "1073741822", x = "3FFFFFFE"}, {v = ~1073741822, b = "~111111111111111111111111111110", oc = "~7777777776", d = "~1073741822", x = "~3FFFFFFE"}, {v = 1073741823, b = "111111111111111111111111111111", oc = "7777777777", d = "1073741823", x = "3FFFFFFF"}, {v = ~1073741823, b = "~111111111111111111111111111111", oc = "~7777777777", d = "~1073741823", x = "~3FFFFFFF"}, {v = 1073741824, b = "1000000000000000000000000000000", oc = "10000000000", d = "1073741824", x = "40000000"}, {v = ~1073741824, b = "~1000000000000000000000000000000", oc = "~10000000000", d = "~1073741824", x = "~40000000"}, {v = 1073741825, b = "1000000000000000000000000000001", oc = "10000000001", d = "1073741825", x = "40000001"}, {v = ~1073741825, b = "~1000000000000000000000000000001", oc = "~10000000001", d = "~1073741825", x = "~40000001"}, {v = 1073741826, b = "1000000000000000000000000000010", oc = "10000000002", d = "1073741826", x = "40000002"}, {v = ~1073741826, b = "~1000000000000000000000000000010", oc = "~10000000002", d = "~1073741826", x = "~40000002"}, {v = 2147483648, b = "10000000000000000000000000000000", oc = "20000000000", d = "2147483648", x = "80000000"}, {v = ~2147483648, b = "~10000000000000000000000000000000", oc = "~20000000000", d = "~2147483648", x = "~80000000"}, {v = 4294967296, b = "100000000000000000000000000000000", oc = "40000000000", d = "4294967296", x = "100000000"}, {v = ~4294967296, b = "~100000000000000000000000000000000", oc = "~40000000000", d = "~4294967296", x = "~100000000"}, {v = 4304967296, b = "100000000100110001001011010000000", oc = "40046113200", d = "4304967296", x = "100989680"}, {v = ~4304967296, b = "~100000000100110001001011010000000", oc = "~40046113200", d = "~4304967296", x = "~100989680"}, {v = 8589934592, b = "1000000000000000000000000000000000", oc = "100000000000", d = "8589934592", x = "200000000"}, {v = ~8589934592, b = "~1000000000000000000000000000000000", oc = "~100000000000", d = "~8589934592", x = "~200000000"}, {v = 17179869184, b = "10000000000000000000000000000000000", oc = "200000000000", d = "17179869184", x = "400000000"}, {v = ~17179869184, b = "~10000000000000000000000000000000000", oc = "~200000000000", d = "~17179869184", x = "~400000000"}, {v = 34359738368, b = "100000000000000000000000000000000000", oc = "400000000000", d = "34359738368", x = "800000000"}, {v = ~34359738368, b = "~100000000000000000000000000000000000", oc = "~400000000000", d = "~34359738368", x = "~800000000"}, {v = 68719476736, b = "1000000000000000000000000000000000000", oc = "1000000000000", d = "68719476736", x = "1000000000"}, {v = ~68719476736, b = "~1000000000000000000000000000000000000", oc = "~1000000000000", d = "~68719476736", x = "~1000000000"}, {v = 137438953472, b = "10000000000000000000000000000000000000", oc = "2000000000000", d = "137438953472", x = "2000000000"}, {v = ~137438953472, b = "~10000000000000000000000000000000000000", oc = "~2000000000000", d = "~137438953472", x = "~2000000000"}, {v = 274877906944, b = "100000000000000000000000000000000000000", oc = "4000000000000", d = "274877906944", x = "4000000000"}, {v = ~274877906944, b = "~100000000000000000000000000000000000000", oc = "~4000000000000", d = "~274877906944", x = "~4000000000"}, {v = 549755813888, b = "1000000000000000000000000000000000000000", oc = "10000000000000", d = "549755813888", x = "8000000000"}, {v = ~549755813888, b = "~1000000000000000000000000000000000000000", oc = "~10000000000000", d = "~549755813888", x = "~8000000000"}, {v = 1099511627776, b = "10000000000000000000000000000000000000000", oc = "20000000000000", d = "1099511627776", x = "10000000000"}, {v = ~1099511627776, b = "~10000000000000000000000000000000000000000", oc = "~20000000000000", d = "~1099511627776", x = "~10000000000"}, {v = 2199023255552, b = "100000000000000000000000000000000000000000", oc = "40000000000000", d = "2199023255552", x = "20000000000"}, {v = ~2199023255552, b = "~100000000000000000000000000000000000000000", oc = "~40000000000000", d = "~2199023255552", x = "~20000000000"}, {v = 4398046511104, b = "1000000000000000000000000000000000000000000", oc = "100000000000000", d = "4398046511104", x = "40000000000"}, {v = ~4398046511104, b = "~1000000000000000000000000000000000000000000", oc = "~100000000000000", d = "~4398046511104", x = "~40000000000"}, {v = 8796093022208, b = "10000000000000000000000000000000000000000000", oc = "200000000000000", d = "8796093022208", x = "80000000000"}, {v = ~8796093022208, b = "~10000000000000000000000000000000000000000000", oc = "~200000000000000", d = "~8796093022208", x = "~80000000000"}, {v = 17592186044416, b = "100000000000000000000000000000000000000000000", oc = "400000000000000", d = "17592186044416", x = "100000000000"}, {v = ~17592186044416, b = "~100000000000000000000000000000000000000000000", oc = "~400000000000000", d = "~17592186044416", x = "~100000000000"}, {v = 35184372088832, b = "1000000000000000000000000000000000000000000000", oc = "1000000000000000", d = "35184372088832", x = "200000000000"}, {v = ~35184372088832, b = "~1000000000000000000000000000000000000000000000", oc = "~1000000000000000", d = "~35184372088832", x = "~200000000000"}, {v = 70368744177664, b = "10000000000000000000000000000000000000000000000", oc = "2000000000000000", d = "70368744177664", x = "400000000000"}, {v = ~70368744177664, b = "~10000000000000000000000000000000000000000000000", oc = "~2000000000000000", d = "~70368744177664", x = "~400000000000"}, {v = 140737488355328, b = "100000000000000000000000000000000000000000000000", oc = "4000000000000000", d = "140737488355328", x = "800000000000"}, {v = ~140737488355328, b = "~100000000000000000000000000000000000000000000000", oc = "~4000000000000000", d = "~140737488355328", x = "~800000000000"}, {v = 281474976710656, b = "1000000000000000000000000000000000000000000000000", oc = "10000000000000000", d = "281474976710656", x = "1000000000000"}, {v = ~281474976710656, b = "~1000000000000000000000000000000000000000000000000", oc = "~10000000000000000", d = "~281474976710656", x = "~1000000000000"}, {v = 562949953421312, b = "10000000000000000000000000000000000000000000000000", oc = "20000000000000000", d = "562949953421312", x = "2000000000000"}, {v = ~562949953421312, b = "~10000000000000000000000000000000000000000000000000", oc = "~20000000000000000", d = "~562949953421312", x = "~2000000000000"}, {v = 1125899906842624, b = "100000000000000000000000000000000000000000000000000", oc = "40000000000000000", d = "1125899906842624", x = "4000000000000"}, {v = ~1125899906842624, b = "~100000000000000000000000000000000000000000000000000", oc = "~40000000000000000", d = "~1125899906842624", x = "~4000000000000"}, {v = 2251799813685248, b = "1000000000000000000000000000000000000000000000000000", oc = "100000000000000000", d = "2251799813685248", x = "8000000000000"}, {v = ~2251799813685248, b = "~1000000000000000000000000000000000000000000000000000", oc = "~100000000000000000", d = "~2251799813685248", x = "~8000000000000"}, {v = 4503599627370496, b = "10000000000000000000000000000000000000000000000000000", oc = "200000000000000000", d = "4503599627370496", x = "10000000000000"}, {v = ~4503599627370496, b = "~10000000000000000000000000000000000000000000000000000", oc = "~200000000000000000", d = "~4503599627370496", x = "~10000000000000"}, {v = 9007199254740992, b = "100000000000000000000000000000000000000000000000000000", oc = "400000000000000000", d = "9007199254740992", x = "20000000000000"}, {v = ~9007199254740992, b = "~100000000000000000000000000000000000000000000000000000", oc = "~400000000000000000", d = "~9007199254740992", x = "~20000000000000"}, {v = 18014398509481984, b = "1000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000", d = "18014398509481984", x = "40000000000000"}, {v = ~18014398509481984, b = "~1000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000", d = "~18014398509481984", x = "~40000000000000"}, {v = 36028797018963968, b = "10000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000", d = "36028797018963968", x = "80000000000000"}, {v = ~36028797018963968, b = "~10000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000", d = "~36028797018963968", x = "~80000000000000"}, {v = 72057594037927936, b = "100000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000", d = "72057594037927936", x = "100000000000000"}, {v = ~72057594037927936, b = "~100000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000", d = "~72057594037927936", x = "~100000000000000"}, {v = 144115188075855872, b = "1000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000", d = "144115188075855872", x = "200000000000000"}, {v = ~144115188075855872, b = "~1000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000", d = "~144115188075855872", x = "~200000000000000"}, {v = 288230376151711744, b = "10000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000", d = "288230376151711744", x = "400000000000000"}, {v = ~288230376151711744, b = "~10000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000", d = "~288230376151711744", x = "~400000000000000"}, {v = 576460752303423488, b = "100000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000", d = "576460752303423488", x = "800000000000000"}, {v = ~576460752303423488, b = "~100000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000", d = "~576460752303423488", x = "~800000000000000"}, {v = 1152921504606846976, b = "1000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000", d = "1152921504606846976", x = "1000000000000000"}, {v = ~1152921504606846976, b = "~1000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000", d = "~1152921504606846976", x = "~1000000000000000"}, {v = 2305843009213693952, b = "10000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000", d = "2305843009213693952", x = "2000000000000000"}, {v = ~2305843009213693952, b = "~10000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000", d = "~2305843009213693952", x = "~2000000000000000"}, {v = 4611686018427387904, b = "100000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000", d = "4611686018427387904", x = "4000000000000000"}, {v = ~4611686018427387904, b = "~100000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000", d = "~4611686018427387904", x = "~4000000000000000"}, {v = 9223372036854775808, b = "1000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000", d = "9223372036854775808", x = "8000000000000000"}, {v = ~9223372036854775808, b = "~1000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000", d = "~9223372036854775808", x = "~8000000000000000"}, {v = 18446744073709551616, b = "10000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000", d = "18446744073709551616", x = "10000000000000000"}, {v = ~18446744073709551616, b = "~10000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000", d = "~18446744073709551616", x = "~10000000000000000"}, {v = 36893488147419103232, b = "100000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000", d = "36893488147419103232", x = "20000000000000000"}, {v = ~36893488147419103232, b = "~100000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000", d = "~36893488147419103232", x = "~20000000000000000"}, {v = 73786976294838206464, b = "1000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000", d = "73786976294838206464", x = "40000000000000000"}, {v = ~73786976294838206464, b = "~1000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000", d = "~73786976294838206464", x = "~40000000000000000"}, {v = 147573952589676412928, b = "10000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000", d = "147573952589676412928", x = "80000000000000000"}, {v = ~147573952589676412928, b = "~10000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000", d = "~147573952589676412928", x = "~80000000000000000"}, {v = 295147905179352825856, b = "100000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000", d = "295147905179352825856", x = "100000000000000000"}, {v = ~295147905179352825856, b = "~100000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000", d = "~295147905179352825856", x = "~100000000000000000"}, {v = 590295810358705651712, b = "1000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000", d = "590295810358705651712", x = "200000000000000000"}, {v = ~590295810358705651712, b = "~1000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000", d = "~590295810358705651712", x = "~200000000000000000"}, {v = 1180591620717411303424, b = "10000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000", d = "1180591620717411303424", x = "400000000000000000"}, {v = ~1180591620717411303424, b = "~10000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000", d = "~1180591620717411303424", x = "~400000000000000000"}, {v = 2361183241434822606848, b = "100000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000", d = "2361183241434822606848", x = "800000000000000000"}, {v = ~2361183241434822606848, b = "~100000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000", d = "~2361183241434822606848", x = "~800000000000000000"}, {v = 4722366482869645213696, b = "1000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000", d = "4722366482869645213696", x = "1000000000000000000"}, {v = ~4722366482869645213696, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000", d = "~4722366482869645213696", x = "~1000000000000000000"}, {v = 9444732965739290427392, b = "10000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000", d = "9444732965739290427392", x = "2000000000000000000"}, {v = ~9444732965739290427392, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000", d = "~9444732965739290427392", x = "~2000000000000000000"}, {v = 18889465931478580854784, b = "100000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000", d = "18889465931478580854784", x = "4000000000000000000"}, {v = ~18889465931478580854784, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000", d = "~18889465931478580854784", x = "~4000000000000000000"}, {v = 37778931862957161709568, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000", d = "37778931862957161709568", x = "8000000000000000000"}, {v = ~37778931862957161709568, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000", d = "~37778931862957161709568", x = "~8000000000000000000"}, {v = 75557863725914323419136, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000", d = "75557863725914323419136", x = "10000000000000000000"}, {v = ~75557863725914323419136, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000", d = "~75557863725914323419136", x = "~10000000000000000000"}, {v = 151115727451828646838272, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000", d = "151115727451828646838272", x = "20000000000000000000"}, {v = ~151115727451828646838272, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000", d = "~151115727451828646838272", x = "~20000000000000000000"}, {v = 302231454903657293676544, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000", d = "302231454903657293676544", x = "40000000000000000000"}, {v = ~302231454903657293676544, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000", d = "~302231454903657293676544", x = "~40000000000000000000"}, {v = 604462909807314587353088, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000", d = "604462909807314587353088", x = "80000000000000000000"}, {v = ~604462909807314587353088, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000", d = "~604462909807314587353088", x = "~80000000000000000000"}, {v = 1208925819614629174706176, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000", d = "1208925819614629174706176", x = "100000000000000000000"}, {v = ~1208925819614629174706176, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000", d = "~1208925819614629174706176", x = "~100000000000000000000"}, {v = 2417851639229258349412352, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000", d = "2417851639229258349412352", x = "200000000000000000000"}, {v = ~2417851639229258349412352, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000", d = "~2417851639229258349412352", x = "~200000000000000000000"}, {v = 4835703278458516698824704, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000000", d = "4835703278458516698824704", x = "400000000000000000000"}, {v = ~4835703278458516698824704, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000000", d = "~4835703278458516698824704", x = "~400000000000000000000"}, {v = 9671406556917033397649408, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000000", d = "9671406556917033397649408", x = "800000000000000000000"}, {v = ~9671406556917033397649408, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000000", d = "~9671406556917033397649408", x = "~800000000000000000000"}, {v = 19342813113834066795298816, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000000", d = "19342813113834066795298816", x = "1000000000000000000000"}, {v = ~19342813113834066795298816, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000000", d = "~19342813113834066795298816", x = "~1000000000000000000000"}, {v = 38685626227668133590597632, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000000", d = "38685626227668133590597632", x = "2000000000000000000000"}, {v = ~38685626227668133590597632, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000000", d = "~38685626227668133590597632", x = "~2000000000000000000000"}, {v = 77371252455336267181195264, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000000", d = "77371252455336267181195264", x = "4000000000000000000000"}, {v = ~77371252455336267181195264, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000000", d = "~77371252455336267181195264", x = "~4000000000000000000000"}, {v = 154742504910672534362390528, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000000", d = "154742504910672534362390528", x = "8000000000000000000000"}, {v = ~154742504910672534362390528, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000000", d = "~154742504910672534362390528", x = "~8000000000000000000000"}, {v = 309485009821345068724781056, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000000", d = "309485009821345068724781056", x = "10000000000000000000000"}, {v = ~309485009821345068724781056, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000000", d = "~309485009821345068724781056", x = "~10000000000000000000000"}, {v = 618970019642690137449562112, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000000", d = "618970019642690137449562112", x = "20000000000000000000000"}, {v = ~618970019642690137449562112, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000000", d = "~618970019642690137449562112", x = "~20000000000000000000000"}, {v = 1237940039285380274899124224, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000000", d = "1237940039285380274899124224", x = "40000000000000000000000"}, {v = ~1237940039285380274899124224, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000000", d = "~1237940039285380274899124224", x = "~40000000000000000000000"}, {v = 2475880078570760549798248448, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000000000", d = "2475880078570760549798248448", x = "80000000000000000000000"}, {v = ~2475880078570760549798248448, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000000000", d = "~2475880078570760549798248448", x = "~80000000000000000000000"}, {v = 4951760157141521099596496896, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000000000", d = "4951760157141521099596496896", x = "100000000000000000000000"}, {v = ~4951760157141521099596496896, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000000000", d = "~4951760157141521099596496896", x = "~100000000000000000000000"}, {v = 9903520314283042199192993792, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000000000", d = "9903520314283042199192993792", x = "200000000000000000000000"}, {v = ~9903520314283042199192993792, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000000000", d = "~9903520314283042199192993792", x = "~200000000000000000000000"}, {v = 19807040628566084398385987584, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000000000", d = "19807040628566084398385987584", x = "400000000000000000000000"}, {v = ~19807040628566084398385987584, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000000000", d = "~19807040628566084398385987584", x = "~400000000000000000000000"}, {v = 39614081257132168796771975168, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000000000", d = "39614081257132168796771975168", x = "800000000000000000000000"}, {v = ~39614081257132168796771975168, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000000000", d = "~39614081257132168796771975168", x = "~800000000000000000000000"}, {v = 79228162514264337593543950336, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000000000", d = "79228162514264337593543950336", x = "1000000000000000000000000"}, {v = ~79228162514264337593543950336, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000000000", d = "~79228162514264337593543950336", x = "~1000000000000000000000000"}, {v = 158456325028528675187087900672, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000000000", d = "158456325028528675187087900672", x = "2000000000000000000000000"}, {v = ~158456325028528675187087900672, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000000000", d = "~158456325028528675187087900672", x = "~2000000000000000000000000"}, {v = 316912650057057350374175801344, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000000000", d = "316912650057057350374175801344", x = "4000000000000000000000000"}, {v = ~316912650057057350374175801344, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000000000", d = "~316912650057057350374175801344", x = "~4000000000000000000000000"}, {v = 633825300114114700748351602688, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000000000", d = "633825300114114700748351602688", x = "8000000000000000000000000"}, {v = ~633825300114114700748351602688, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000000000", d = "~633825300114114700748351602688", x = "~8000000000000000000000000"} ] fun makeReader str = let val len = String.size str fun reader pos = if pos = String.size str then NONE else SOME (String.sub (str, pos), pos + 1) in reader end exception FailRead of StringCvt.radix * string exception FailWrite of StringCvt.radix * IntInf.int fun read2 str = case IntInf.scan StringCvt.BIN (makeReader str) 0 of NONE => raise (FailRead (StringCvt.BIN, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.BIN, str)) fun read8 str = case IntInf.scan StringCvt.OCT (makeReader str) 0 of NONE => raise (FailRead (StringCvt.OCT, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.OCT, str)) fun read10 str = case IntInf.scan StringCvt.DEC (makeReader str) 0 of NONE => raise (FailRead (StringCvt.DEC, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.DEC, str)) fun read16 str = case IntInf.scan StringCvt.HEX (makeReader str) 0 of NONE => raise (FailRead (StringCvt.HEX, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.HEX, str)) fun read str = case IntInf.fromString str of NONE => raise (FailRead (StringCvt.DEC, str)) | SOME v => v fun toStr2 v = IntInf.fmt StringCvt.BIN v fun toStr8 v = IntInf.fmt StringCvt.OCT v fun toStr10 v = IntInf.fmt StringCvt.DEC v fun toStr16 v = IntInf.fmt StringCvt.HEX v fun toStr v = IntInf.toString v fun baseToStr (base: StringCvt.radix): string = case base of StringCvt.BIN => "BIN" | StringCvt.OCT => "OCT" | StringCvt.DEC => "DEC" | StringCvt.HEX => "HEX" fun f ({ v: IntInf.int, b: string, oc: string, d: string, x: string}): unit = let val bv = read2 b val ov = read8 oc val dv = read10 d val xv = read16 x val vv = read d in if bv <> v then raise (FailRead (StringCvt.BIN, b)) else if ov <> v then raise (FailRead (StringCvt.OCT, oc)) else if dv <> v then raise (FailRead (StringCvt.DEC, d)) else if xv <> v then raise (FailRead (StringCvt.HEX, x)) else if vv <> v then raise (FailRead (StringCvt.DEC, d)) else let val vb = toStr2 v val vo = toStr8 v val vd = toStr10 v val vx = toStr16 v val vv = toStr v val (b, oc, d, x) = if v = 0 andalso String.sub (d, 0) = #"~" then ("0", "0", "0", "0") else (b, oc, d, x) in if vb <> b then raise (FailWrite (StringCvt.BIN, v)) else if vo <> oc then raise (FailWrite (StringCvt.OCT, v)) else if vd <> d then raise (FailWrite (StringCvt.DEC, v)) else if vx <> x then raise (FailWrite (StringCvt.HEX, v)) else if vv <> d then raise (FailWrite (StringCvt.DEC, v)) else () end end handle FailRead (base, str) => print ("FailRead, base = " ^ (baseToStr base) ^ ", str = |" ^ str ^ "|\n") | FailWrite (base, v) => print ("FailWrite, base = " ^ (baseToStr base) ^ ", d = |" ^ d ^ "|\n") val _ = List.app f arg val _ = print "All ok\n" mlton-20210117+dfsg/regression/conversion.ok000066400000000000000000000066761416264345000207450ustar00rootroot0000000000000001237F7EFEFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFF01237F7EFFFEFFFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFFFFFFFEFFFFFFFF FFFFFFFFFFFFFFFEFFFFFFFF01237F7EFFFFFFFEFFFFFFFF FFFEFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFEFFFFFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 01237F7EFEFF 01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF FFFEFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF mlton-20210117+dfsg/regression/conversion.sml000066400000000000000000000227231416264345000211160ustar00rootroot00000000000000val w8t16 = Word16.fromLarge o Word8.toLarge val w16t32 = Word32.fromLarge o Word16.toLarge val w32t64 = Word64.fromLarge o Word32.toLarge (* All of these should become no-ops *) val id8_1 = Word8.fromLarge o Word8.toLarge val id8_2 = Word8.fromLarge o Word8.toLargeX val id8_3 = Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val id8_4 = Word8.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val id8_5 = Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val id16_1 = Word16.fromLarge o Word16.toLarge val id16_2 = Word16.fromLarge o Word16.toLargeX val id16_3 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLarge val id16_4 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val id16_5 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLarge val id16_6 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLargeX val xx16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge val xx16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val xx16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val xx16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLargeX val id32_1 = Word32.fromLarge o Word32.toLarge val id32_2 = Word32.fromLarge o Word32.toLargeX val id32_3 = Word32.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLarge val id32_4 = Word32.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLargeX val id32_5 = Word32.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLarge val id32_6 = Word32.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLargeX val xx32_1 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLarge val xx32_2 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLargeX val xx32_3 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word32.toLarge val xx32_4 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word32.toLargeX val id64_1 = Word64.fromLarge o Word64.toLarge val id64_2 = Word64.fromLarge o Word64.toLargeX val id64_3 = Word64.fromLarge o Word64.toLarge o Word64.fromLarge o Word64.toLarge val id64_4 = Word64.fromLarge o Word64.toLarge o Word64.fromLarge o Word64.toLargeX val id64_5 = Word64.fromLarge o Word64.toLargeX o Word64.fromLarge o Word64.toLarge val id64_6 = Word64.fromLarge o Word64.toLargeX o Word64.fromLarge o Word64.toLargeX val xx64_1 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLarge val xx64_2 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLargeX val xx64_3 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word64.toLarge val xx64_4 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word64.toLargeX val c8t16_1 = Word16.fromLarge o Word8.toLarge val c8t16_2 = Word16.fromLarge o Word8.toLargeX val c8t16_3 = Word16.fromLarge o Word8.toLarge o id8_3 val c8t16_4 = Word16.fromLarge o Word8.toLarge o id8_4 val c8t16_5 = Word16.fromLarge o Word8.toLarge o id8_5 val c8t32_1 = Word32.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t32_2 = Word32.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c8t32_3 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLarge val c8t32_4 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val c8t64_1 = Word64.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t64_2 = Word64.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c8t64_3 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLarge val c8t64_4 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val c8t64_5 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t64_6 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c16t8_1 = Word8.fromLarge o Word16.toLarge val c16t8_2 = Word8.fromLarge o Word16.toLargeX val c16t8_3 = Word8.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val c16t8_4 = id8_3 o Word8.fromLarge o Word16.toLargeX val c16t8_5 = id8_4 o Word8.fromLarge o Word16.toLarge val c16t8_6 = id8_5 o Word8.fromLarge o Word16.toLargeX (* These tests rely on Int = Int32 to be useful *) val w16t8z = Word8.fromInt o Word16.toInt val w16t8s = Word8.fromInt o Word16.toIntX val c16t32_1 = Word32.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val c16t32_2 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val c16t32_3 = Word32.fromLarge o Word16.toLarge val c16t32_4 = Word32.fromLarge o Word16.toLargeX val c16t64_1 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLarge val c16t64_2 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val c16t64_3 = Word64.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLarge val c16t64_4 = Word64.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLargeX val c16t64_5 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge val c16t64_6 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val c16t64_7 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val c16t64_8 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLargeX val c32t8_1 = id8_4 o Word8.fromLarge o Word32.toLarge o id32_1 val c32t8_2 = id8_3 o Word8.fromLarge o Word32.toLargeX o id32_2 val c32t8_3 = id8_2 o Word8.fromLarge o Word32.toLarge o id32_3 val c32t8_4 = id8_1 o Word8.fromLarge o Word32.toLargeX o id32_4 val c32t16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLarge val c32t16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLargeX val c32t16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word32.toLarge val c32t16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word32.toLargeX val c32t16_5 = Word16.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLarge val c32t16_6 = Word16.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLarge val c32t16_7 = Word16.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLargeX val c32t16_8 = Word16.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLargeX val c64t8_1 = id8_4 o Word8.fromLarge o Word64.toLarge o id64_1 val c64t8_2 = id8_3 o Word8.fromLarge o Word64.toLargeX o id64_2 val c64t8_3 = id8_2 o Word8.fromLarge o Word64.toLarge o id64_3 val c64t8_4 = id8_1 o Word8.fromLarge o Word64.toLargeX o id64_4 val c64t16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word64.toLarge val c64t16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word64.toLargeX val c64t16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word64.toLarge val c64t16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word64.toLargeX val c64t16_5 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLarge val c64t16_6 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word64.toLarge val c64t16_7 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLargeX val c64t16_8 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word64.toLargeX val f8t8 = [ id8_1, id8_2, id8_3, id8_4, id8_5 ] val f8t16 = [ c8t16_1, c8t16_2, c8t16_3, c8t16_4, c8t16_5 ] val f8t32 = [ c8t32_1, c8t32_2, c8t32_3, c8t32_4 ] val f8t64 = [ c8t64_1, c8t64_2, c8t64_3, c8t64_4, c8t64_5, c8t64_6 ] val f16t8 = [ c16t8_1, c16t8_2, c16t8_3, c16t8_5, c16t8_6, w16t8z, w16t8s ] val f16t16 = [ id16_1, id16_2, id16_3, id16_4, id16_5, id16_6, xx16_1, xx16_2, xx16_3, xx16_4 ] val f16t32 = [ c16t32_1, c16t32_2, c16t32_3, c16t32_4 ] val f16t64 = [ c16t64_1, c16t64_2, c16t64_3, c16t64_4, c16t64_6, c16t64_7, c16t64_8 ] val f32t8 = [ c32t8_1, c32t8_2, c32t8_3, c32t8_4 ] val f32t16 = [ c32t16_1, c32t16_2, c32t16_3, c32t16_4, c32t16_5, c32t16_6, c32t16_7, c32t16_8 ] val f32t32 = [ id32_1, id32_2, id32_3, id32_4, id32_5, id32_6, xx32_1, xx32_2, xx32_3, xx32_4 ] val f32t64 = [ ] val f64t8 = [ c64t8_1, c64t8_2, c64t8_3, c64t8_4 ] val f64t16 = [ c64t16_1, c64t16_2, c64t16_3, c64t16_4, c64t16_5, c64t16_6, c64t16_7, c64t16_8 ] val f64t32 = [ ] val f64t64 = [ id64_1, id64_2, id64_3, id64_4, id64_5, id64_6, xx64_1, xx64_2, xx64_3, xx64_4 ] val x8 = [ 0w0, 0w1, 0w2, 0w3, 0wx7f, 0wx7e, 0wxfe, 0wxff ] val x16 = [ 0wx7fff, 0wxfffe, 0wxffff ] @ List.map w8t16 x8 val x32 = [ 0wx7fffffff, 0wxfffffffe, 0wxffffffff ] @ List.map w16t32 x16 val x64 = [ 0wx7fffffffffffffff, 0wxfffffffffffffffe, 0wxffffffffffffffff ] @ List.map w32t64 x32 fun doit (out, xl) f = let val () = List.app (print o out o f) xl in print "\n" end val () = List.app (doit (Word8.toString, x8)) f8t8 val () = List.app (doit (Word8.toString, x16)) f16t8 val () = List.app (doit (Word8.toString, x32)) f32t8 val () = List.app (doit (Word8.toString, x64)) f64t8 val () = List.app (doit (Word16.toString, x8)) f8t16 val () = List.app (doit (Word16.toString, x16)) f16t16 val () = List.app (doit (Word16.toString, x32)) f32t16 val () = List.app (doit (Word16.toString, x64)) f64t16 val () = List.app (doit (Word32.toString, x8)) f8t32 val () = List.app (doit (Word32.toString, x16)) f16t32 val () = List.app (doit (Word32.toString, x32)) f32t32 val () = List.app (doit (Word32.toString, x64)) f64t32 val () = List.app (doit (Word64.toString, x8)) f8t64 val () = List.app (doit (Word64.toString, x16)) f16t64 val () = List.app (doit (Word64.toString, x32)) f32t64 val () = List.app (doit (Word64.toString, x64)) f64t64 mlton-20210117+dfsg/regression/cycle.nonterm000066400000000000000000000000001416264345000206770ustar00rootroot00000000000000mlton-20210117+dfsg/regression/cycle.sml000066400000000000000000000001431416264345000200200ustar00rootroot00000000000000datatype t = T of u | V and u = U of t * t fun f V = T (U (f V,f V)) | f (T _) = V val _ = f V mlton-20210117+dfsg/regression/datatype-with-free-tyvars.ok000066400000000000000000000000221416264345000235640ustar00rootroot00000000000000true 13 false foo mlton-20210117+dfsg/regression/datatype-with-free-tyvars.sml000066400000000000000000000007141416264345000237560ustar00rootroot00000000000000fun 'a f (x1: 'a, x2: 'a, aToString: 'a -> string): unit = let datatype 'b t = T of 'a * 'b and u = U of int t val y1: int t = T (x1, 13) val _: u = U y1 val y2 = T (x2, "foo") fun 'b g (T (a, b), bToString: 'b -> string): unit = print (concat [aToString a, " ", bToString b, "\n"]) val _ = g (y1, Int.toString) val _ = g (y2, fn s => s) in () end val _ = f (true, false, Bool.toString) mlton-20210117+dfsg/regression/date.ok000066400000000000000000000005001416264345000174510ustar00rootroot00000000000000 File date.sml: Testing structure Date... This is the epoch (UTC): Thu Jan 01 00:00:00 1970 The UTC millenium (UTC time): Sat Jan 01 00:00:00 2000 The UTC millenium minus 5 sec: Fri Dec 31 23:59:55 1999 test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK mlton-20210117+dfsg/regression/date.sml000066400000000000000000000177151416264345000176530ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/date.sml PS 1995-03-20, 1995-05-12, 1996-07-05, 1998-04-07 *) (* MosML test file ported to the ML Kit; ME 1998-07-17 *) val _ = print "\nFile date.sml: Testing structure Date...\n" local open Time Date fun later h = toString(fromTimeLocal(now() + fromReal (3600.0 * real h))) ^ "\n"; fun nowdate () = Date.fromTimeLocal(now()); fun mkdate(y,mo,d,h,mi,s) = date {year=y, month=mo, day=d, hour=h, minute=mi, second=s, offset = NONE} fun cmp(dt1, dt2) = compare(mkdate dt1, mkdate dt2) fun fromto dt = toString (valOf (fromString (toString dt))) = toString dt fun tofrom s = toString (valOf (fromString s)) = s val y2k = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME Time.zeroTime} val y2kE1 = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME (Time.fromSeconds 82800) } val y2kW1 = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME (Time.fromSeconds 3600) } val _ = ((*print "This is (local time) now: "; print (later 0); print "This is UTC now: "; print (toString (fromTimeUniv(now()))); print "\n"; print "This is an hour from now: "; print (later 1); print "This is a day from now: "; print (later 24); print "This is a week from now: "; print (later 168); print "This is 120 days from now: "; print (later (24 * 120)); print "This is 160 days from now: "; print (later (24 * 160)); print "This is 200 days from now: "; print (later (24 * 200)); print "This is 240 days from now: "; print (later (24 * 240)); *) print "This is the epoch (UTC): "; print (toString(fromTimeUniv zeroTime) ^ "\n"); print "The UTC millenium (UTC time): "; print (toString y2k ^ "\n"); print "The UTC millenium minus 5 sec: "; print (toString (date {year=2000, month=Jan, day=1, hour=0, minute=0, second= ~5, offset = SOME Time.zeroTime}) ^ "\n") (* print "The UTC millenium (local time): "; print (toString (fromTimeLocal (toTime y2k)) ^ "\n"); print "The local millenium (UTC time): "; print (toString (fromTimeUniv (toTime (mkdate(2000, Jan, 1, 0, 0, 0)))) ^ "\n"); print "The UTC+01 millenium (UTC): "; print (toString (fromTimeUniv (toTime y2kE1)) ^ "\n"); print "The UTC-01 millenium (UTC): "; print (toString (fromTimeUniv (toTime y2kW1)) ^ "\n"); print "This is today's number: "; print (fmt "%j" (nowdate()) ^ " (internally: "); print (Int.toString (yearDay (nowdate())) ^ ")\n"); print "This is today's weekday: "; print (fmt "%A" (nowdate()) ^ "\n"); print "This is the name of this month: "; print (fmt "%B" (nowdate()) ^ "\n"); print "Today's ISO date: "; print (fmt "%Y-%m-%d" (nowdate ()) ^ "\n")*)) val test1 = tst' "test1" (fn _ => cmp((1993,Jul,25,16,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1995,May,25,16,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,May,26,16,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jul,24,16,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,24,17,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,26,15,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,15,13,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,17,11,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,11,19), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,16,13,17), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,12,17), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,16,12,19), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,12,18), (1994,Jun,25,16,12,18)) = EQUAL); val test2 = tst' "test2" (fn _ => fmt "%A" (mkdate(1995,May,22,4,0,1)) = "Monday"); val test3 = tst' "test3" (fn _ => List.all fromto [mkdate(1995,Aug,22,4,0,1), mkdate(1996,Apr, 5, 0, 7, 21), mkdate(1996,Mar, 5, 6, 13, 58)]); val test4 = tst' "test4" (fn _ => List.all tofrom ["Fri Jul 05 14:25:16 1996", "Mon Feb 05 04:25:16 1996", "Sat Jan 06 04:25:16 1996"]) val test5 = tst' "test5" (fn _ => weekDay(mkdate(1962, Jun, 25, 1, 2, 3)) = Mon andalso weekDay(mkdate(1998, Mar, 6, 1, 2, 3)) = Fri andalso weekDay(mkdate(1998, Apr, 6, 1, 2, 3)) = Mon andalso weekDay(mkdate(1900, Feb, 28, 1, 2, 3)) = Wed andalso weekDay(mkdate(1900, Mar, 1, 1, 2, 3)) = Thu andalso weekDay(mkdate(1850, Feb, 28, 1, 2, 3)) = Thu andalso weekDay(mkdate(1850, Mar, 1, 1, 2, 3)) = Fri andalso weekDay(mkdate(1860, Feb, 28, 1, 2, 3)) = Tue andalso weekDay(mkdate(1860, Feb, 29, 1, 2, 3)) = Wed andalso weekDay(mkdate(1860, Mar, 1, 1, 2, 3)) = Thu andalso weekDay(mkdate(2000, Feb, 28, 1, 2, 3)) = Mon andalso weekDay(mkdate(2000, Feb, 29, 1, 2, 3)) = Tue andalso weekDay(mkdate(2000, Mar, 1, 1, 2, 3)) = Wed) val test6 = tst' "test6" (fn _ => yearDay(mkdate(1962, Jan, 1, 1, 2, 3)) = 0 andalso yearDay(mkdate(1998, Mar, 6, 1, 2, 3)) = 64 andalso yearDay(mkdate(1900, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1900, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1900, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1850, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1850, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1850, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1860, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1860, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(1860, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(1860, Dec, 31, 1, 2, 3)) = 365 andalso yearDay(mkdate(2000, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(2000, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(2000, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(2000, Dec, 31, 1, 2, 3)) = 365 andalso yearDay(mkdate(1959, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1959, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1959, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1960, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1960, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(1960, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(1960, Dec, 31, 1, 2, 3)) = 365) fun addh h = let val dt = mkdate(1998, Apr, 6, h, 0, 0) in (month dt, day dt, hour dt) end val test7 = tst' "test7" (fn _ => addh 0 = (Apr, 6, 0) andalso addh 23 = (Apr, 6, 23) andalso addh 24 = (Apr, 7, 0) andalso addh 36 = (Apr, 7, 12) andalso addh 600 = (May, 1, 0) andalso addh 610 = (May, 1, 10) andalso addh 625 = (May, 2, 1)) val test8 = tst' "test8" (fn _ => hour (mkdate(1998, Mar, 28, 12, 0, 0)) = 12 andalso hour (mkdate(1998, Mar, 28, 36, 0, 0)) = 12) in end mlton-20210117+dfsg/regression/dead.nonterm000066400000000000000000000000001416264345000204750ustar00rootroot00000000000000mlton-20210117+dfsg/regression/dead.sml000066400000000000000000000001161416264345000176160ustar00rootroot00000000000000datatype t = A of t fun f (A y) = f y fun g () = A (g ()) val _ = f (g ()) mlton-20210117+dfsg/regression/deep-flatten.ok000066400000000000000000000000041416264345000211030ustar00rootroot000000000000005 6 mlton-20210117+dfsg/regression/deep-flatten.sml000066400000000000000000000003621416264345000212740ustar00rootroot00000000000000fun f r = case #1 (!r) of 3 => r := (5, 6) | _ => f (ref (7, 8)) val r = ref (1, 2) val _ = r := (3, 4) val _ = f r val _ = print (concat [Int.toString (#1 (!r)), " ", Int.toString (#2 (!r)), "\n"]) mlton-20210117+dfsg/regression/default-overloads.sml000066400000000000000000000007311416264345000223440ustar00rootroot00000000000000fun f x = ~ x; fun g (x: int) = f x; fun f x = abs x; fun g (x: int) = f x; fun f x = x + x; fun g (x: int) = f x; fun f x = x - x; fun g (x: int) = f x; fun f x = x * x; fun g (x: int) = f x; fun f x = x div x; fun g (x: int) = f x; fun f x = x mod x; fun g (x: int) = f x; fun f x = x < x; fun g (x: int) = f x; fun f x = x <= x; fun g (x: int) = f x; fun f x = x > x; fun g (x: int) = f x; fun f x = x >= x; fun g (x: int) = f x; fun f x = x / x; fun g (x: real) = f x; mlton-20210117+dfsg/regression/down.ok000066400000000000000000000000001416264345000174760ustar00rootroot00000000000000mlton-20210117+dfsg/regression/down.sml000066400000000000000000000002361416264345000176730ustar00rootroot00000000000000val rec down = fn 0 => 0 | n => 1 + down' (n - 1) + down (n - 1) and down' = fn 0 => 0 | n => 1 + down (n - 1) + down' (n - 1) val _ = down 13 mlton-20210117+dfsg/regression/eq.ok000066400000000000000000000000031416264345000171370ustar00rootroot00000000000000no mlton-20210117+dfsg/regression/eq.sml000066400000000000000000000001561416264345000173320ustar00rootroot00000000000000fun f x = x + 1 fun g x = x + 2 val _ = if MLton.eq (f, g) then print "yes\n" else print "no\n" mlton-20210117+dfsg/regression/eqtype.sml000066400000000000000000000034161416264345000202360ustar00rootroot00000000000000signature T = sig eqtype s structure V: sig datatype v = V end where type v = s end signature S = sig eqtype v structure T: sig eqtype t end where type t = v end signature S = sig eqtype v structure S: sig type 'a t end where type 'a t = v structure T: sig eqtype t end where type t = int S.t end signature S = sig eqtype v structure S: sig type 'a t end where type 'a t = v structure T: sig eqtype t end where type t = real S.t end signature S = sig eqtype v structure S: sig type 'a t type u = real t end where type 'a t = v structure T: sig eqtype t end where type t = S.u end functor F (eqtype v structure S: sig type 'a t type u = real t end where type 'a t = v) = struct fun f (x: 'a S.t) = x = x fun f (x: S.u) = x = x end signature T = sig eqtype s structure U: sig type 'a t type u = (int * real) t end where type 'a t = s structure V: sig datatype v = V end where type v = U.u end structure T: T = struct datatype s = V structure U = struct type 'a t = s type u = (int * real) t end structure V = struct datatype v = datatype s end end mlton-20210117+dfsg/regression/ex.nonterm000066400000000000000000000000001416264345000202140ustar00rootroot00000000000000mlton-20210117+dfsg/regression/ex.sml000066400000000000000000000004351416264345000173410ustar00rootroot00000000000000exception Foo of unit ref fun f (x, r): int = if x then raise (Foo r) else (f (true, r); 1 + 2) fun loop (r: unit ref): int = let val r' = ref () in if r = r' then 13 else f (false, r') handle Foo r => loop r end val _ = loop (ref ()) mlton-20210117+dfsg/regression/exhaustive.ok000066400000000000000000000000001416264345000207140ustar00rootroot00000000000000mlton-20210117+dfsg/regression/exhaustive.sml000066400000000000000000000130231416264345000211070ustar00rootroot00000000000000(* exhaustive.sml *) (* Checks for correct treatment of exhaustiveness for basic types * (compiler should NOT warn here). *) fun ord #"\000" = 0 | ord #"\001" = 1 | ord #"\002" = 2 | ord #"\003" = 3 | ord #"\004" = 4 | ord #"\005" = 5 | ord #"\006" = 6 | ord #"\007" = 7 | ord #"\008" = 8 | ord #"\009" = 9 | ord #"\010" = 10 | ord #"\011" = 11 | ord #"\012" = 12 | ord #"\013" = 13 | ord #"\014" = 14 | ord #"\015" = 15 | ord #"\016" = 16 | ord #"\017" = 17 | ord #"\018" = 18 | ord #"\019" = 19 | ord #"\020" = 20 | ord #"\021" = 21 | ord #"\022" = 22 | ord #"\023" = 23 | ord #"\024" = 24 | ord #"\025" = 25 | ord #"\026" = 26 | ord #"\027" = 27 | ord #"\028" = 28 | ord #"\029" = 29 | ord #"\030" = 30 | ord #"\031" = 31 | ord #"\032" = 32 | ord #"\033" = 33 | ord #"\034" = 34 | ord #"\035" = 35 | ord #"\036" = 36 | ord #"\037" = 37 | ord #"\038" = 38 | ord #"\039" = 39 | ord #"\040" = 40 | ord #"\041" = 41 | ord #"\042" = 42 | ord #"\043" = 43 | ord #"\044" = 44 | ord #"\045" = 45 | ord #"\046" = 46 | ord #"\047" = 47 | ord #"\048" = 48 | ord #"\049" = 49 | ord #"\050" = 50 | ord #"\051" = 51 | ord #"\052" = 52 | ord #"\053" = 53 | ord #"\054" = 54 | ord #"\055" = 55 | ord #"\056" = 56 | ord #"\057" = 57 | ord #"\058" = 58 | ord #"\059" = 59 | ord #"\060" = 60 | ord #"\061" = 61 | ord #"\062" = 62 | ord #"\063" = 63 | ord #"\064" = 64 | ord #"\065" = 65 | ord #"\066" = 66 | ord #"\067" = 67 | ord #"\068" = 68 | ord #"\069" = 69 | ord #"\070" = 70 | ord #"\071" = 71 | ord #"\072" = 72 | ord #"\073" = 73 | ord #"\074" = 74 | ord #"\075" = 75 | ord #"\076" = 76 | ord #"\077" = 77 | ord #"\078" = 78 | ord #"\079" = 79 | ord #"\080" = 80 | ord #"\081" = 81 | ord #"\082" = 82 | ord #"\083" = 83 | ord #"\084" = 84 | ord #"\085" = 85 | ord #"\086" = 86 | ord #"\087" = 87 | ord #"\088" = 88 | ord #"\089" = 89 | ord #"\090" = 90 | ord #"\091" = 91 | ord #"\092" = 92 | ord #"\093" = 93 | ord #"\094" = 94 | ord #"\095" = 95 | ord #"\096" = 96 | ord #"\097" = 97 | ord #"\098" = 98 | ord #"\099" = 99 | ord #"\100" = 100 | ord #"\101" = 101 | ord #"\102" = 102 | ord #"\103" = 103 | ord #"\104" = 104 | ord #"\105" = 105 | ord #"\106" = 106 | ord #"\107" = 107 | ord #"\108" = 108 | ord #"\109" = 109 | ord #"\110" = 110 | ord #"\111" = 111 | ord #"\112" = 112 | ord #"\113" = 113 | ord #"\114" = 114 | ord #"\115" = 115 | ord #"\116" = 116 | ord #"\117" = 117 | ord #"\118" = 118 | ord #"\119" = 119 | ord #"\120" = 120 | ord #"\121" = 121 | ord #"\122" = 122 | ord #"\123" = 123 | ord #"\124" = 124 | ord #"\125" = 125 | ord #"\126" = 126 | ord #"\127" = 127 | ord #"\128" = 128 | ord #"\129" = 129 | ord #"\130" = 130 | ord #"\131" = 131 | ord #"\132" = 132 | ord #"\133" = 133 | ord #"\134" = 134 | ord #"\135" = 135 | ord #"\136" = 136 | ord #"\137" = 137 | ord #"\138" = 138 | ord #"\139" = 139 | ord #"\140" = 140 | ord #"\141" = 141 | ord #"\142" = 142 | ord #"\143" = 143 | ord #"\144" = 144 | ord #"\145" = 145 | ord #"\146" = 146 | ord #"\147" = 147 | ord #"\148" = 148 | ord #"\149" = 149 | ord #"\150" = 150 | ord #"\151" = 151 | ord #"\152" = 152 | ord #"\153" = 153 | ord #"\154" = 154 | ord #"\155" = 155 | ord #"\156" = 156 | ord #"\157" = 157 | ord #"\158" = 158 | ord #"\159" = 159 | ord #"\160" = 160 | ord #"\161" = 161 | ord #"\162" = 162 | ord #"\163" = 163 | ord #"\164" = 164 | ord #"\165" = 165 | ord #"\166" = 166 | ord #"\167" = 167 | ord #"\168" = 168 | ord #"\169" = 169 | ord #"\170" = 170 | ord #"\171" = 171 | ord #"\172" = 172 | ord #"\173" = 173 | ord #"\174" = 174 | ord #"\175" = 175 | ord #"\176" = 176 | ord #"\177" = 177 | ord #"\178" = 178 | ord #"\179" = 179 | ord #"\180" = 180 | ord #"\181" = 181 | ord #"\182" = 182 | ord #"\183" = 183 | ord #"\184" = 184 | ord #"\185" = 185 | ord #"\186" = 186 | ord #"\187" = 187 | ord #"\188" = 188 | ord #"\189" = 189 | ord #"\190" = 190 | ord #"\191" = 191 | ord #"\192" = 192 | ord #"\193" = 193 | ord #"\194" = 194 | ord #"\195" = 195 | ord #"\196" = 196 | ord #"\197" = 197 | ord #"\198" = 198 | ord #"\199" = 199 | ord #"\200" = 200 | ord #"\201" = 201 | ord #"\202" = 202 | ord #"\203" = 203 | ord #"\204" = 204 | ord #"\205" = 205 | ord #"\206" = 206 | ord #"\207" = 207 | ord #"\208" = 208 | ord #"\209" = 209 | ord #"\210" = 210 | ord #"\211" = 211 | ord #"\212" = 212 | ord #"\213" = 213 | ord #"\214" = 214 | ord #"\215" = 215 | ord #"\216" = 216 | ord #"\217" = 217 | ord #"\218" = 218 | ord #"\219" = 219 | ord #"\220" = 220 | ord #"\221" = 221 | ord #"\222" = 222 | ord #"\223" = 223 | ord #"\224" = 224 | ord #"\225" = 225 | ord #"\226" = 226 | ord #"\227" = 227 | ord #"\228" = 228 | ord #"\229" = 229 | ord #"\230" = 230 | ord #"\231" = 231 | ord #"\232" = 232 | ord #"\233" = 233 | ord #"\234" = 234 | ord #"\235" = 235 | ord #"\236" = 236 | ord #"\237" = 237 | ord #"\238" = 238 | ord #"\239" = 239 | ord #"\240" = 240 | ord #"\241" = 241 | ord #"\242" = 242 | ord #"\243" = 243 | ord #"\244" = 244 | ord #"\245" = 245 | ord #"\246" = 246 | ord #"\247" = 247 | ord #"\248" = 248 | ord #"\249" = 249 | ord #"\250" = 250 | ord #"\251" = 251 | ord #"\252" = 252 | ord #"\253" = 253 | ord #"\254" = 254 | ord #"\255" = 255; mlton-20210117+dfsg/regression/exn-history.ok000066400000000000000000000004301416264345000210270ustar00rootroot00000000000000f. exn-history.sml 3.18 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5
    mlton-20210117+dfsg/regression/exn-history.sml000066400000000000000000000003361416264345000212160ustar00rootroot00000000000000fun f x = if x = 0 then raise Fail "ok" else f (x - 1) handle Overflow => 13 val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) mlton-20210117+dfsg/regression/exn-history3.ok000066400000000000000000000011141416264345000211120ustar00rootroot00000000000000f. exn-history3.sml 5.18 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5
    ZZZ f. exn-history3.sml 5.18 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5
    mlton-20210117+dfsg/regression/exn-history3.sml000066400000000000000000000006011416264345000212740ustar00rootroot00000000000000exception FOO fun f x = if x = 0 then raise FOO else f (x - 1) handle Overflow => 13 val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) val _ = print "ZZZ\n" val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) mlton-20210117+dfsg/regression/exn.ok000066400000000000000000000000161416264345000173300ustar00rootroot00000000000000zzzzzzzzzzzzz mlton-20210117+dfsg/regression/exn.sml000066400000000000000000000002301416264345000175100ustar00rootroot00000000000000exception E fun loop n = if n = 0 then raise E else (loop(n - 1) handle e => (print "z"; raise e)) val _ = loop 13 handle _ => print "\n" mlton-20210117+dfsg/regression/exn2.sml000066400000000000000000000002651416264345000176020ustar00rootroot00000000000000fun die(): 'a = let exception Die in raise Die end val _ = let val _: string = die() val _: real = die() val _: bool = die() in () end handle _ => () mlton-20210117+dfsg/regression/expansive-valbind.sml000066400000000000000000000007311416264345000223430ustar00rootroot00000000000000val f = fn x => x and r = ref 13 val _ = (f 1; f true) val () = r := !r + 1 val () = print (concat [Int.toString (!r), "\n"]) val () = r := !r + 1 val () = print (concat [Int.toString (!r), "\n"]) val x = let exception E of 'a in () end val 'a x = let exception E of 'a in () end val 'a id = fn x: 'a => x and x = let exception E of 'a in () end val 'a _ = let exception E of 'a in E end val 'a (f: int -> int, _) = (fn x => x, let exception E of 'a in E end); mlton-20210117+dfsg/regression/exponential.ok000066400000000000000000000000001416264345000210550ustar00rootroot00000000000000mlton-20210117+dfsg/regression/exponential.sml000066400000000000000000000002271416264345000212520ustar00rootroot00000000000000fun f x = x fun toy () = let fun g y = f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f y in g 3; g 4 end val _ = toy () mlton-20210117+dfsg/regression/fact.ok000066400000000000000000000000101416264345000174450ustar00rootroot000000000000003628800 mlton-20210117+dfsg/regression/fact.sml000066400000000000000000000001531416264345000176370ustar00rootroot00000000000000val rec fact = fn 0 => 1 | n => n * fact(n - 1) val _ = print(concat[Int.toString(fact 10), "\n"]) mlton-20210117+dfsg/regression/fail/000077500000000000000000000000001416264345000171215ustar00rootroot00000000000000mlton-20210117+dfsg/regression/fail/1.sml000066400000000000000000000001201416264345000177670ustar00rootroot00000000000000functor F () = struct val x = y end val y = 13 structure S = F () mlton-20210117+dfsg/regression/fail/2.sml000066400000000000000000000001031416264345000177710ustar00rootroot00000000000000val _ = let val x = ref [] in (!x = [1], !x = [true]) end mlton-20210117+dfsg/regression/fail/3.sml000066400000000000000000000000211416264345000177710ustar00rootroot00000000000000type t = 'a * 'b mlton-20210117+dfsg/regression/fail/4.sml000066400000000000000000000000311416264345000177730ustar00rootroot00000000000000datatype foo = Foo of 'a mlton-20210117+dfsg/regression/fail/5.sml000066400000000000000000000000231416264345000177750ustar00rootroot00000000000000datatype t = A | = mlton-20210117+dfsg/regression/fail/constant-too-big.sml000066400000000000000000000007341416264345000230310ustar00rootroot00000000000000val _ = 1234: Int8.int val _ = 12345678: Int16.int val _ = 12345678901234567890: Int32.int val _ = 1234567890123456789012345678901234567890: Int64.int val _ = 0w1234: Word8.word val _ = 0w12345678: Word16.word val _ = 0w12345678901234567890: Word32.word val _ = 0w1234567890123456789012345678901234567890: Word64.word val _ = 1e999: Real32.real val _ = 1e999: Real64.real val _ = #"\uFFFF": Char.char val _ = "A\uFFFFB": String.string val _ = "A\uFFFFB\u9999C": String.string mlton-20210117+dfsg/regression/fail/datatype-where-complex.1.sml000066400000000000000000000001121416264345000243570ustar00rootroot00000000000000signature S = sig datatype t = T end where type t = int * int mlton-20210117+dfsg/regression/fail/datatype-where-complex.2.sml000066400000000000000000000017661416264345000244000ustar00rootroot00000000000000(* This should fail because 'a -> 'b is not a type name; * The Defn does not treat -> as a TyName(2), but rather as a distinct * sub-class of Type. *) signature S = sig datatype ('a, 'b) t = T of 'a -> 'b end where type ('a, 'b) t = 'a -> 'b (* Similarly, this should fail because 'a * 'b is not a type name; * it is a synonym for {1: 'a, 2: 'b}, which is RowType. *) signature S = sig datatype ('a, 'b) t = T of 'a * 'b end where type ('a, 'b) t = 'a * 'b (* Similarly, this should fail because 'a * 'b is not a type name; * it is a synonym for {1: 'a, 2: 'b}, which is RowType. *) signature S = sig datatype t = T of unit end where type t = unit (* On the other hand, The Defn does treat 'ref' and 'int' and other * primitive types as TyName(k); see Appendix C. Hence, the following * should succeed. *) signature S = sig datatype 'a t = T of 'a ref end where type 'a t = 'a ref signature S = sig datatype t = T of int end where type t = int mlton-20210117+dfsg/regression/fail/datatype.1.sml000066400000000000000000000000541416264345000216070ustar00rootroot00000000000000datatype t = T of int * t withtype t = real mlton-20210117+dfsg/regression/fail/datatype.2.sml000066400000000000000000000000231416264345000216040ustar00rootroot00000000000000datatype t = A | A mlton-20210117+dfsg/regression/fail/datatype.3.sml000066400000000000000000000000311416264345000216040ustar00rootroot00000000000000datatype t = A and u = A mlton-20210117+dfsg/regression/fail/datatype.4.sml000066400000000000000000000000211416264345000216040ustar00rootroot00000000000000datatype t = nil mlton-20210117+dfsg/regression/fail/dec.sml000066400000000000000000000005021416264345000203660ustar00rootroot00000000000000fun F.f () = () fun f = () fun f _ = () | f _ _ = () fun f _ = () | g _ = () | h _ = () fun f (): bool = 13 fun f (_: bool) = () | f (_: int) = () fun f (): int = 13 | f (): bool = true fun f (x: int) = f true val 'a x: 'a -> 'a = (fn y => y) (fn z => z) val rec (x: int) = fn z => z val x: int = true mlton-20210117+dfsg/regression/fail/duplicate-tyvar.sml000066400000000000000000000002601416264345000227510ustar00rootroot00000000000000type ('a, 'a) t = unit datatype ('a, 'a) t = T of ('a, 'a) u withtype ('b, 'b) u = 'b * 'b fun ('a, 'a) id (x: 'a) : 'a = x val ('a, 'a) id : 'a -> 'a = fn (x: 'a) => x : 'a mlton-20210117+dfsg/regression/fail/eqtype.1.sml000066400000000000000000000004031416264345000213010ustar00rootroot00000000000000(* This should fail because v is an eqtype and s does not admit equality. * Hence, the side condition on rule 64 fails. *) signature T = sig type s structure V: sig datatype v = V end where type v = s end mlton-20210117+dfsg/regression/fail/equal.sml000066400000000000000000000000531416264345000207430ustar00rootroot00000000000000val op = = () val rec (op =) = fn _ => 13 mlton-20210117+dfsg/regression/fail/equality-types.sml000066400000000000000000000011351416264345000226350ustar00rootroot00000000000000val _ = 1 = 2 val _ = 1.0 = 2.0 (* error *) val f: ''a -> unit = fn _ => raise Fail "f" val _ = f 1 val _ = f 1.0 (* error *) datatype 'a t = T of 'a val _ = T 1 = T 2 val _ = T 1.0 = T 2.0 (* 15 error *) datatype 'a t = T val _ = (T: int t) = T val _ = (T: real t) = T (* 21 error *) datatype t = T of u withtype u = real val _ = T 13.0 = T 14.0 (* 26 error *) datatype t = T of u and u = U of t fun f (x: t) = x = x datatype 'a t = T of 'a u and 'a u = U of 'a fun f (x: int t) = x = x fun f (x: real t) = x = x (* 38 error *) val f: 'a -> unit = fn x => (x = x; ()) (* 40 error *) mlton-20210117+dfsg/regression/fail/escaping-datatype.sml000066400000000000000000000001061416264345000232350ustar00rootroot00000000000000val _ = let datatype t = T in (T, fn T => 1) end mlton-20210117+dfsg/regression/fail/exception.1.sml000066400000000000000000000000221416264345000217650ustar00rootroot00000000000000exception E and E mlton-20210117+dfsg/regression/fail/exp.1.sml000066400000000000000000000000311416264345000205630ustar00rootroot00000000000000val _ = {x = 13, x = 14} mlton-20210117+dfsg/regression/fail/exp.2.sml000066400000000000000000000000271416264345000205710ustar00rootroot00000000000000val x = 13 and x = (); mlton-20210117+dfsg/regression/fail/exp.3.sml000066400000000000000000000000171416264345000205710ustar00rootroot00000000000000fun f x x = 13 mlton-20210117+dfsg/regression/fail/exp.4.sml000066400000000000000000000000541416264345000205730ustar00rootroot00000000000000val rec x = fn () => () and x = fn () => () mlton-20210117+dfsg/regression/fail/exp.5.sml000066400000000000000000000000341416264345000205720ustar00rootroot00000000000000fun f () = () and f () = () mlton-20210117+dfsg/regression/fail/exp.6.sml000066400000000000000000000000321416264345000205710ustar00rootroot00000000000000val rec nil = fn () => () mlton-20210117+dfsg/regression/fail/exp.7.sml000066400000000000000000000000201416264345000205670ustar00rootroot00000000000000fun nil () = () mlton-20210117+dfsg/regression/fail/exp.8.sml000066400000000000000000000000161416264345000205750ustar00rootroot00000000000000exception nil mlton-20210117+dfsg/regression/fail/exp.sml000066400000000000000000000010161416264345000204300ustar00rootroot00000000000000val _ = 1 andalso true val _ = true andalso 1 val _ = 13 14 val _ = (op +) (1, true) val _ = case "foo" of 13 => 14 val _ = 13: bool val _ = + 1 2 val _ = 1 handle _ => "foo" val _ = () handle _: int => () val _ = if "foo" then () else () val _ = if true then 1 else "foo" val _ = [1, 2, "foo"] val _ = 1 orelse true val _ = true orelse 1 val _ = raise 13 val _ = "foo" + "bar" val _ = while "foo" do () val _ = fn _: int => () | _: bool => () val _ = fn 1 => "foo" | 2 => true mlton-20210117+dfsg/regression/fail/free-type-variable.sml000066400000000000000000000000251416264345000233160ustar00rootroot00000000000000datatype t = T of 'a mlton-20210117+dfsg/regression/fail/functor-and.sml000066400000000000000000000000531416264345000220540ustar00rootroot00000000000000functor F () = struct end and F' () = F () mlton-20210117+dfsg/regression/fail/functor-generative-equality.sml000066400000000000000000000002331416264345000252760ustar00rootroot00000000000000functor F () = struct datatype t = T of int -> int end functor G () = struct structure S = F () fun f (x: S.t) = x = x end mlton-20210117+dfsg/regression/fail/functor.1.sml000066400000000000000000000006751416264345000214650ustar00rootroot00000000000000val b = ref false val r = ref NONE functor F (type t val x: t val f: t -> string) = struct val _ = if !b then print (concat [f (valOf (! r)), "\n"]) else (b := true; r := SOME x) end structure S = F (type t = int val x = 13 val f = Int.toString) structure S = F (type t = real val x = 13.0 val f = Real.toString) mlton-20210117+dfsg/regression/fail/infix.1.sml000066400000000000000000000005041416264345000211110ustar00rootroot00000000000000(* error *) local fun _ f _ = () in end (* error *) local fun (_ f _) = () in end (* error *) local fun (_ f _) _ = () in end infix && || (* error *) local fun && x = () in end (* error *) local fun x && = () in end (* error *) local fun && || = () in end (* error *) local fun || && = () in end mlton-20210117+dfsg/regression/fail/infix.2.sml000066400000000000000000000016141416264345000211150ustar00rootroot00000000000000infix 1 @> infixr 2 !!> @@> infix 0 & infix 9 && datatype ('a, 'b) t1 = & of 'a * 'b datatype ('a, 'b) t2 = && of 'a * 'b (* error *) local fun fst x && y = x in end (* defines fst *) local fun fst (x && y) = x in val _ = fst end (* error *) local fun fst x @> infixr 2 !!> @@> infix 0 & infix 9 && datatype ('a, 'b) t1 = & of 'a * 'b datatype ('a, 'b) t2 = && of 'a * 'b (* error *) local fun () = () in end (* error *) local fun () _ = () in end (* error *) local fun () _ _ = () in end (* error *) local fun () _ _ _ = () in end (* error *) local fun (f) = () in end (* error *) local fun (f) _ = () in end (* error *) local fun (f) _ _ = () in end (* error *) local fun (f) _ _ _ = () in end mlton-20210117+dfsg/regression/fail/infix.4.sml000066400000000000000000000006061416264345000211170ustar00rootroot00000000000000infix 1 @> infixr 2 !!> @@> infix 0 & infix 9 && datatype ('a, 'b) t1 = & of 'a * 'b datatype ('a, 'b) t2 = && of 'a * 'b (* error *) local fun _ f = () in end (* error *) local fun _ f _ = () in end (* error *) local fun (_ f _) = () in end (* error *) local fun (_ f _) _ = () in end (* error *) local fun _ f _ _ = () in end mlton-20210117+dfsg/regression/fail/infix.5.sml000066400000000000000000000013321416264345000211150ustar00rootroot00000000000000infix 1 @> infixr 2 !!> @@> infix 0 & infix 9 && datatype ('a, 'b) t1 = & of 'a * 'b datatype ('a, 'b) t2 = && of 'a * 'b (* defines @> infixr 2 !!> @@> infix 0 & infix 9 && datatype ('a, 'b) t1 = & of 'a * 'b datatype ('a, 'b) t2 = && of 'a * 'b (* defines u = fn x => x end mlton-20210117+dfsg/regression/fail/modules.2.sml000066400000000000000000000001531416264345000214450ustar00rootroot00000000000000structure S: sig datatype 'a t = T of int end = struct datatype 'a t = T of 'a end mlton-20210117+dfsg/regression/fail/modules.20.sml000066400000000000000000000000651416264345000215270ustar00rootroot00000000000000functor F (type t) = struct fun f (x: t) = x = x end mlton-20210117+dfsg/regression/fail/modules.21.sml000066400000000000000000000001051416264345000215230ustar00rootroot00000000000000structure S: sig val x: bool end = struct val x = 13 end mlton-20210117+dfsg/regression/fail/modules.22.sml000066400000000000000000000001371416264345000215310ustar00rootroot00000000000000structure S: sig val x: 'a list end = struct val x: unit list = [] end mlton-20210117+dfsg/regression/fail/modules.23.sml000066400000000000000000000002211416264345000215240ustar00rootroot00000000000000structure S: sig val f: 'a -> 'a list end = struct fun f x = if x = x then [] else [x] end mlton-20210117+dfsg/regression/fail/modules.24.sml000066400000000000000000000001401416264345000215250ustar00rootroot00000000000000structure S: sig datatype t = A | B end = struct datatype t = B | C end mlton-20210117+dfsg/regression/fail/modules.25.sml000066400000000000000000000003121416264345000215270ustar00rootroot00000000000000structure S: sig structure T: sig datatype t = A | B end end = struct structure T = struct datatype t = B | C end end mlton-20210117+dfsg/regression/fail/modules.26.sml000066400000000000000000000001531416264345000215330ustar00rootroot00000000000000structure S: sig datatype 'a t = T of int end = struct datatype 'a t = T of 'a end mlton-20210117+dfsg/regression/fail/modules.27.sml000066400000000000000000000001651416264345000215370ustar00rootroot00000000000000structure S: sig datatype t = A | B end = struct datatype t = A | B datatype u = B end mlton-20210117+dfsg/regression/fail/modules.28.sml000066400000000000000000000002151416264345000215340ustar00rootroot00000000000000structure S: sig datatype t = A | B of unit end = struct datatype t = A | B of int val rec B = fn () => A end mlton-20210117+dfsg/regression/fail/modules.29.sml000066400000000000000000000002211416264345000215320ustar00rootroot00000000000000(* Generativity of functors. *) functor F () = struct datatype t = T end structure S1 = F () structure S2 = F () val _ = S1.T = S2.T mlton-20210117+dfsg/regression/fail/modules.3.sml000066400000000000000000000002221416264345000214430ustar00rootroot00000000000000functor F (type t datatype u = U of t eqtype v sharing type t = v) = struct fun f (u: u) = u = u end mlton-20210117+dfsg/regression/fail/modules.30.sml000066400000000000000000000001101416264345000215170ustar00rootroot00000000000000structure S:> sig type t end = struct type t = unit end val _ = (): S.t mlton-20210117+dfsg/regression/fail/modules.31.sml000066400000000000000000000002021416264345000215220ustar00rootroot00000000000000structure S:> sig type t val x: t end = struct type t = unit val x = () end val _ = S.x = S.x mlton-20210117+dfsg/regression/fail/modules.32.sml000066400000000000000000000002041416264345000215250ustar00rootroot00000000000000structure S:> sig type t val x: t end = struct type t = real val x = 13.0 end val _ = S.x = S.x mlton-20210117+dfsg/regression/fail/modules.33.sml000066400000000000000000000002261416264345000215320ustar00rootroot00000000000000signature S = sig type t = int end signature S = sig structure S1: S structure S2: S sharing type S1.t = S2.t end mlton-20210117+dfsg/regression/fail/modules.34.sml000066400000000000000000000001061416264345000215300ustar00rootroot00000000000000signature S = sig type 'a t end where type 'a t = 'b list mlton-20210117+dfsg/regression/fail/modules.35.sml000066400000000000000000000000701416264345000215310ustar00rootroot00000000000000functor F (ZZZ: sig end) = struct end structure Z = ZZZ mlton-20210117+dfsg/regression/fail/modules.36.sml000066400000000000000000000001421416264345000215320ustar00rootroot00000000000000signature SIG = sig include sig type t end where type t = int end where type t = bool mlton-20210117+dfsg/regression/fail/modules.37.sml000066400000000000000000000001511416264345000215330ustar00rootroot00000000000000signature SIG = sig structure S: sig type t end where type t = int end where type S.t = bool mlton-20210117+dfsg/regression/fail/modules.38.sml000066400000000000000000000001521416264345000215350ustar00rootroot00000000000000structure S: sig type t end where type t = int * int = struct type t = int end mlton-20210117+dfsg/regression/fail/modules.39.sml000066400000000000000000000002331416264345000215360ustar00rootroot00000000000000signature SIG = sig type u type v = u end where type v = int structure S: SIG = struct type u = real type v = real end mlton-20210117+dfsg/regression/fail/modules.4.sml000066400000000000000000000001441416264345000214470ustar00rootroot00000000000000signature S = sig type t type u type v = t * t sharing type u = v end mlton-20210117+dfsg/regression/fail/modules.40.sml000066400000000000000000000002411416264345000215250ustar00rootroot00000000000000signature SIG = sig type t structure S: sig type u = t type v sharing type u = v end end mlton-20210117+dfsg/regression/fail/modules.41.sml000066400000000000000000000001461416264345000215320ustar00rootroot00000000000000signature SIG = sig type t structure S: sig type u = t end where type u = t * t end mlton-20210117+dfsg/regression/fail/modules.42.sml000066400000000000000000000002041416264345000215260ustar00rootroot00000000000000structure S = struct end and S = struct end functor F () = struct end and F () = struct end signature S = sig end and S = sig end mlton-20210117+dfsg/regression/fail/modules.43.sml000066400000000000000000000000631416264345000215320ustar00rootroot00000000000000signature S = sig type ('a , 'a) t end mlton-20210117+dfsg/regression/fail/modules.44.sml000066400000000000000000000000671416264345000215370ustar00rootroot00000000000000signature S = sig datatype t = T of 'a end mlton-20210117+dfsg/regression/fail/modules.45.sml000066400000000000000000000001071416264345000215330ustar00rootroot00000000000000signature S = sig type 'a t end where type 'a t = int * 'b mlton-20210117+dfsg/regression/fail/modules.46.sml000066400000000000000000000000571416264345000215400ustar00rootroot00000000000000signature S = sig exception it end mlton-20210117+dfsg/regression/fail/modules.47.sml000066400000000000000000000000611416264345000215340ustar00rootroot00000000000000signature S = sig val true: bool end mlton-20210117+dfsg/regression/fail/modules.48.sml000066400000000000000000000002241416264345000215360ustar00rootroot00000000000000signature S = sig datatype t = T end structure S1: S = struct datatype t = T end structure S2: S where type t = int = S1 mlton-20210117+dfsg/regression/fail/modules.49.sml000066400000000000000000000004661416264345000215470ustar00rootroot00000000000000signature SIG = sig type t end functor F (structure S1: SIG structure S2: SIG sharing S1 = S2) = struct end structure S1: SIG = struct type t = int end structure S2: SIG = struct type t = real end structure Z = F (structure S1 = S1 structure S2 = S2) mlton-20210117+dfsg/regression/fail/modules.5.sml000066400000000000000000000001141416264345000214450ustar00rootroot00000000000000signature S = sig datatype t = T end where type t = int * int ; mlton-20210117+dfsg/regression/fail/modules.50.sml000066400000000000000000000003311416264345000215260ustar00rootroot00000000000000signature SIG = sig type t end structure S: sig structure S1: SIG end where type S1.t = int = struct structure S1: SIG = struct type t = real end end mlton-20210117+dfsg/regression/fail/modules.51.sml000066400000000000000000000006731416264345000215400ustar00rootroot00000000000000(* * This example tests that a variable type containing unknown types is not * mistakenly generalized when matching a signature. *) structure S: sig val f: 'a option -> 'a option end = struct val f = let val r = ref NONE in fn z => (!r before (r := z)) end end val _ = S.f (SOME 13) val _ = case S.f (SOME (fn z => z)) of NONE => 15 | SOME f => f 17 mlton-20210117+dfsg/regression/fail/modules.6.sml000066400000000000000000000002041416264345000214460ustar00rootroot00000000000000signature S = sig type ('a, 'b) t type ('a, 'b) u type ('a, 'b) v = ('b, 'a) t sharing type u = v end mlton-20210117+dfsg/regression/fail/modules.7.sml000066400000000000000000000001221416264345000214460ustar00rootroot00000000000000signature S = sig type 'a t type u sharing type t = u end mlton-20210117+dfsg/regression/fail/modules.8.sml000066400000000000000000000001251416264345000214520ustar00rootroot00000000000000signature S = sig type t = int type u sharing type t = u end mlton-20210117+dfsg/regression/fail/modules.9.sml000066400000000000000000000001331416264345000214520ustar00rootroot00000000000000signature S = sig type t = int type u = int sharing type t = u end mlton-20210117+dfsg/regression/fail/overloading-context.1.sml000066400000000000000000000004331416264345000237700ustar00rootroot00000000000000(* This must fail, because the overloading context can be no larger than the * smallest enclosing strdec. So, the declaration of double must be resolved * (with type int -> int) before continuing. *) structure S = struct fun double x = x + x end val _ = S.double 2.0 mlton-20210117+dfsg/regression/fail/overloading-context.2.sml000066400000000000000000000005561416264345000237770ustar00rootroot00000000000000(* This program must fail because the semicolon means that the declarations * must be treated as two topdecs, not a single topdec leading to two strdec's. * This follows from the restriction on page 14 of the Definition that states * "No topdec may contain as an initial segment, a strdec followed by a * semicolon" *) fun double x = x + x; val y = double 2.0 mlton-20210117+dfsg/regression/fail/overloading-context.3.sml000066400000000000000000000000701416264345000237670ustar00rootroot00000000000000val x = 0w0 signature S = sig end val _ = x: Word8.word mlton-20210117+dfsg/regression/fail/overloading-context.4.sml000066400000000000000000000000451416264345000237720ustar00rootroot00000000000000val x = 0.0 ; val _ = x: Real32.real mlton-20210117+dfsg/regression/fail/overloading-context.5.sml000066400000000000000000000001561416264345000237760ustar00rootroot00000000000000functor F () = struct val x = 0w0 structure S = struct end val _ = x: Word8.word end mlton-20210117+dfsg/regression/fail/overloading-context.6.sml000066400000000000000000000001541416264345000237750ustar00rootroot00000000000000structure S = struct val x = 0w0 structure S = struct end val _ = x: Word8.word end mlton-20210117+dfsg/regression/fail/pat.1.sml000066400000000000000000000000531416264345000205570ustar00rootroot00000000000000val _ = case 13.0 of 14.0 => () ; mlton-20210117+dfsg/regression/fail/pat.2.sml000066400000000000000000000000261416264345000205600ustar00rootroot00000000000000val {x, x} = {x = 13} mlton-20210117+dfsg/regression/fail/pat.3.sml000066400000000000000000000000371416264345000205630ustar00rootroot00000000000000val {x = y, x = z} = {x = 13}; mlton-20210117+dfsg/regression/fail/pat.sml000066400000000000000000000004651416264345000204270ustar00rootroot00000000000000val NONE _ = () val _ :: 13 = [] val 13 : bool = 14 (* Precedence parsing *) val x _ _ = 13 val + _ = 13 val _ + = 13 val _ + _ = 13 local infixr 5 foo infix 5 bar in val x foo y bar z = 13 end val x _ = 13 val x : int as NONE = NONE val [13, "foo"] = [] val {foo, ...} = raise Fail "" mlton-20210117+dfsg/regression/fail/rank.sml000066400000000000000000000004771416264345000206010ustar00rootroot00000000000000local val f = let val f = (fn x => x) (fn x => x) in f end datatype t = A val g = fn x => let val d = #1 x val k = #2 x val s = f (d,k) val _ = if true then (d,k) else x in s end in val a : t * t = g (A,A) endmlton-20210117+dfsg/regression/fail/sharing.2.sml000066400000000000000000000003301416264345000214250ustar00rootroot00000000000000functor F (structure A: sig type t end structure B: sig end structure C: sig type t end sharing A = B sharing B = C) = struct val _: A.t -> C.t = fn x => x end mlton-20210117+dfsg/regression/fail/sharing.sml000066400000000000000000000001301416264345000212630ustar00rootroot00000000000000signature S = sig structure T: sig type t = int end sharing T = T end mlton-20210117+dfsg/regression/fail/sig.1.sml000066400000000000000000000001011416264345000205470ustar00rootroot00000000000000signature S = sig datatype t = A and u = A end mlton-20210117+dfsg/regression/fail/sig.2.sml000066400000000000000000000002661416264345000205640ustar00rootroot00000000000000signature S = sig type t end signature S1 = S where type t = int signature S2 = S where type t = real structure S1: S1 = struct type t = int end structure S2: S2 = S1 mlton-20210117+dfsg/regression/fail/signature-and.sml000066400000000000000000000000471416264345000224000ustar00rootroot00000000000000signature SIG = sig end and SIG' = SIG mlton-20210117+dfsg/regression/fail/special-ids.1.sml000066400000000000000000000012501416264345000221700ustar00rootroot00000000000000signature SIG1 = sig datatype t = ref of unit exception true val false : int end signature SIG2 = sig datatype t = it of unit end signature SIG3 = sig exception it end signature SIG4 = sig (* correct *) val it : int end local datatype t = op:: of unit | nil of unit exception false datatype u = it of unit exception it in end local fun ref z = z in end local val rec ref = fn z => z in end local fun true z = z in end local val rec true = fn z => z in end local fun op:: z = z in end local val rec op:: = fn z => z in end local (* correct *) val rec it = fn z => z in end local (* correct *) fun it z = z in end mlton-20210117+dfsg/regression/fail/special-ids.2.sml000066400000000000000000000005621416264345000221760ustar00rootroot00000000000000signature SIG1 = sig datatype t = = of unit end signature SIG2 = sig exception = end signature SIG3 = sig val = : unit end local datatype t = = of unit in end local exception = in end local val op= = () in end local val rec f = fn op= => fn () => () val rec op= = fn () => () in end local fun f op= () = () fun op= () = () in end mlton-20210117+dfsg/regression/fail/structure-and.sml000066400000000000000000000000441416264345000224340ustar00rootroot00000000000000structure S = struct end and S' = S mlton-20210117+dfsg/regression/fail/type-use-before-def.sml000066400000000000000000000000641416264345000234050ustar00rootroot00000000000000val r = ref NONE datatype t = T val _ = r := SOME T mlton-20210117+dfsg/regression/fail/type.1.sml000066400000000000000000000000331416264345000207520ustar00rootroot00000000000000type t = {x: int, x: real} mlton-20210117+dfsg/regression/fail/type.2.sml000066400000000000000000000000321416264345000207520ustar00rootroot00000000000000type t = int and t = real mlton-20210117+dfsg/regression/fail/type.sml000066400000000000000000000001061416264345000206140ustar00rootroot00000000000000type t = u type 'a t = unit type u = t datatype 'a t = T type u = t mlton-20210117+dfsg/regression/fail/tyvar-scope.1.sml000066400000000000000000000001131416264345000222440ustar00rootroot00000000000000fun 'a f (x: 'a) = let fun 'a g (y: 'a) = y in () end mlton-20210117+dfsg/regression/fail/tyvar-scope.2.sml000066400000000000000000000001101416264345000222420ustar00rootroot00000000000000fun f (x: 'a) = let fun 'a g (y: 'a) = y in () end mlton-20210117+dfsg/regression/fail/tyvar-scope.3.sml000066400000000000000000000001441416264345000222520ustar00rootroot00000000000000val _ = fn () => let exception E of 'a val 'a f = fn z => z in () end mlton-20210117+dfsg/regression/fast.ok000066400000000000000000000000071416264345000174730ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/fast.sml000066400000000000000000000003101416264345000176520ustar00rootroot00000000000000fun loop (left: Int.int): unit = case Int.compare (left, 0) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20210117+dfsg/regression/fast2.ok000066400000000000000000000000071416264345000175550ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/fast2.sml000066400000000000000000000002331416264345000177400ustar00rootroot00000000000000fun loop (left: Int.int): unit = if left = 0 then () else loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20210117+dfsg/regression/ffi-opaque.sml000066400000000000000000000010651416264345000207610ustar00rootroot00000000000000structure S:> sig type t val x: t val g: t -> unit end = struct type t = int val x = 13 fun g x = () end val f = _import "f": S.t -> unit; val _ = fn () => f S.x val e = _export "g1": (S.t -> unit) -> unit; val _ = fn () => e S.g structure S:> sig type t val f: t -> unit val x: t end = struct type t = int -> unit fun f g = g 13 fun x _ = () end val p = _import "f": S.t; val _ = fn () => S.f p val e = _export "g2": S.t -> unit; val _ = fn () => e S.x mlton-20210117+dfsg/regression/ffi.ok000066400000000000000000000000031416264345000172760ustar00rootroot00000000000000ok mlton-20210117+dfsg/regression/ffi.sml000066400000000000000000000000251416264345000174640ustar00rootroot00000000000000val _ = print "ok\n" mlton-20210117+dfsg/regression/fft.ok000066400000000000000000000000741416264345000173210ustar00rootroot00000000000000 fft by Torben Mogensen (torbenm@diku.dk) fft'ing... done mlton-20210117+dfsg/regression/fft.sml000066400000000000000000000033671416264345000175130ustar00rootroot00000000000000(*fft.sml*) (*by Torben Mogensen (torbenm@diku.dk)*) val pi = 3.14159265358979 fun pr (s : string) : unit = print(s) exception Impossible fun impossible s = impossible0 (s ^ "\n") and impossible0 s = (pr ("\nimpossible: " ^ s); raise Impossible) fun zipWith f ([],[]) = [] | zipWith f ((a::b),(c::d)) = f (a,c) :: zipWith f (b,d) | zipWith f _ = impossible "zipWith" fun zip ([],[]) = [] | zip ((a::b),(c::d)) = (a,c) :: zip (b,d) | zip _ = impossible "zip" fun ~+ ((x:real,y:real),(v,w)) = (x+v,y+w) fun ~- ((x:real,y:real),(v,w)) = (x-v,y-w) fun ~* ((x:real,y:real),(v,w)) = (x*v-y*w,x*w+y*v) fun evens [] = [] | evens (x::y::l) = x :: evens l | evens _ = impossible "evens" fun odds [] = [] | odds (x::y::l) = y :: odds l | odds _ = impossible "odds" fun fmul (c,pin,[]) = [] | fmul (c,pin,(a::b)) = ~*((Math.cos(c),Math.sin(c)), a) :: fmul (c+pin,pin,b) fun cp [] = [] | cp (a::b) = a :: cp b fun fft ([(a,b)], 1) = [(a+0.0,b+0.0)] | fft (x, n2) = let val n = n2 div 2 val a = fft (evens x, n) val cb = fmul (0.0,pi/(real n),fft (odds x, n)) in let val l1 = zipWith ~+ (a,cb) val l2 = zipWith ~- (a,cb) in (*resetRegions a; resetRegions cb;*) l1 @ l2 end end local val a = 16807.0 and m = 2147483678.0 in fun nextrand seed = let val t = a*seed in t - m * real(floor (t/m)) end end fun mkList(tr as (seed,0,acc)) = tr | mkList(seed,n,acc) = mkList(nextrand seed, n-1, seed::acc) val n = 256 * 256 fun run () = (pr "\nfft by Torben Mogensen (torbenm@diku.dk)\n\nfft'ing... "; let val r = fft (zip (#3(mkList(7.0,n,[])), #3(mkList(8.0,n,[]))), n) in pr " done\n" end); val _ = run () mlton-20210117+dfsg/regression/filesys.ok000066400000000000000000000016371416264345000202260ustar00rootroot00000000000000 File filesys.sml: Testing structure FileSys... test1a OK test1b OK test2 OK test3a OK test4a OK test4b OK test4c OK test4d OK test5 OK test6a OK test6b OK test6c OK test6d OK test6e OK test6f OK test6g OK test6h OK test6i OK test6j OK test6k OK test6l OK test7a OK test7b OK test7c OK test7d OK test7e OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test8g OK test8h OK test9a OK test9b OK test10a OK test10b OK test10c OK test11a OK test11b OK test11c OK test12a OK test12b OK test12c OK test13a OK test13b OK test13c OK test13d OK test13e OK test14 OK test15a OK test15b OK test15b1 OK test15b2 OK test15b3 OK test15c OK test15d OK test15e OK test15f OK test15g OK mlton-20210117+dfsg/regression/filesys.sml000066400000000000000000000210461416264345000204040ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/filesys.sml PS 1995-03-23, 1996-05-01, 1998-04-06 *) (* DOS: Plain WRONG: test6a, test9a (and test9b); Excusable: test8b, test11b, test12a, test13a, test13b, test13c *) (* The test requires three symbolic links to be present in the current directory: testlink -> README testcycl -> testcycl testbadl -> exists.not Moreover, the file README must exist and the file exists.not not. Also, the test requires one hard link between file hardlinkA and file hardlinkB. *) val _ = print "\nFile filesys.sml: Testing structure FileSys...\n" local open OS.FileSys (* Clean up: *) val _ = (rmDir "testdir") handle OS.SysErr _ => (); val _ = (rmDir "testdir2") handle OS.SysErr _ => (); val test1a = tst0 "test1a" ((mkDir "testdir" seq "OK") handle _ => "WRONG") val test1b = tst0 "test1b" ((mkDir "testdir" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test2 = tst' "test2" (fn _ => isDir "testdir"); val test3a = tst' "test3a" (fn _ => access("testdir", [A_READ, A_EXEC, A_WRITE])); local val cdir = getDir(); in val test4a = tst0 "test4a" ((chDir cdir seq "OK") handle _ => "WRONG") val test4b = tst' "test4b" (fn _ => cdir = getDir()); val _ = chDir "testdir"; val test4c = tst' "test4c" (fn _ => cdir <> getDir()); val _ = chDir ".."; val test4d = tst' "test4d" (fn _ => cdir = getDir()); end; val _ = rename{old = "testdir", new = "exists.not"}; val test5 = tst0 "test5" ((rmDir "exists.not" seq "OK") handle _ => "WRONG") val test6a = tst0 "test6a" ((openDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6b = tst0 "test6b" ((isDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6c = tst0 "test6c" ((rmDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6d = tst0 "test6d" ((chDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6e = tst0 "test6e" ((fullPath "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6f = tst0 "test6f" ((realPath "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6g = tst0 "test6g" ((modTime "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6h = tst0 "test6h" ((setTime("exists.not", NONE) seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6i = tst0 "test6i" ((remove "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6j = tst0 "test6j" ((rename{old="exists.not", new="testdir2"} seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6k = tst0 "test6k" ((fileSize "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6l = tst' "test6l" (fn _ => not (access("exists.not", []))); val _ = mkDir "testdir"; local val dstr = openDir "testdir"; in val test7a = tst' "test7a" (fn _ => NONE = readDir dstr); val _ = rewindDir dstr; val test7b = tst' "test7b" (fn _ => NONE = readDir dstr); val _ = closeDir dstr; val test7c = tst0 "test7c" ((readDir dstr seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test7d = tst0 "test7d" ((rewindDir dstr seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test7e = tst0 "test7e" ((closeDir dstr seq "OK") handle _ => "WRONG") end val _ = List.app (fn (new, old) => if isLink new handle OS.SysErr _ => false then () else Posix.FileSys.symlink {new = new, old = old}) [("testlink", "README"), ("testcycl", "testcycl"), ("testbadl", "exists.not")] val test8a = tst' "test8a" (fn _ => fullPath "." = getDir ()); val test8b = tst' "test8b" (fn _ => fullPath "testlink" = getDir() ^ "/README"); val test8c = tst0 "test8c" ((fullPath "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8d = tst0 "test8d" ((fullPath "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8e = tst' "test8e" (fn _ => realPath "." = "."); val test8f = tst' "test8f" (fn _ => realPath "testlink" = "README"); val test8g = tst0 "test8g" ((realPath "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8h = tst0 "test8h" ((realPath "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test9a = tst' "test9a" (fn _ => setTime ("README", SOME (Time.fromReal 1E6)) = ()); val test9b = tst' "test9b" (fn _ => modTime "README" = Time.fromReal 1E6); val test10a = tst0 "test10a" ((remove "testdir" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test10b = tst' "test10b" (fn _ => rename{old = "testdir", new = "testdir2"} = ()); val test10c = tst' "test10c" (fn _ => isDir "testdir2"); val test11a = tst' "test11a" (fn _ => not (access ("testdir", []))); val test11b = tst' "test11b" (fn _ => access("testlink", [])); val test11c = tst' "test11c" (fn _ => not (access("testbadl", []))); val test12a = tst' "test12a" (fn _ => isLink "testcycl" andalso isLink "testlink" andalso isLink "testbadl"); val test12b = tst' "test12b" (fn _ => not (isLink "testdir2" orelse isLink "README")); val test12c = tst0 "test12c" ((isLink "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test13a = tst' "test13a" (fn _ => readLink "testcycl" = "testcycl"); val test13b = tst' "test13b" (fn _ => readLink "testlink" = "README"); val test13c = tst' "test13c" (fn _ => readLink "testbadl" = "exists.not"); val test13d = tst0 "test13d" ((readLink "testdir2" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test13e = tst0 "test13e" ((readLink "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test14 = tst0 "test14" ((tmpName () seq "OK")) val test15a = tst' "test15a" (fn _ => fileId "." = fileId "." andalso fileId "testlink" = fileId "README" andalso fileId "." <> fileId "README"); val test15b = tst' "test15b" (fn _ => compare(fileId ".", fileId ".") = EQUAL) val test15b1 = tst' "test15b1" (fn _ => compare(fileId ".", fileId "README") <> EQUAL) val test15b2 = tst' "test15b2" (fn _ => compare(fileId "testlink", fileId "README") = EQUAL) val test15b3 = tst' "test15b3" (fn _ => (compare(fileId ".", fileId "README") = LESS andalso compare(fileId "README", fileId ".") = GREATER orelse compare(fileId ".", fileId "README") = GREATER andalso compare(fileId "README", fileId ".") = LESS)); val test15c = tst0 "test15c" ((fileId "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test15d = tst0 "test15d" ((fileId "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test15e = tst0 "test15e" ((fileId "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") (* Unix only: *) val _ = (if access ("hardlinkA", []) then () else TextIO.closeOut (TextIO.openOut "hardlinkA") ; if access ("hardlinkB", []) then () else Posix.FileSys.link {old = "hardlinkA", new = "hardlinkB"}) val test15f = tst' "test15f" (fn _ => fileId "hardlinkA" = fileId "hardlinkB") val test15g = tst' "test15g" (fn _ => compare(fileId "hardlinkA", fileId "hardlinkB") = EQUAL) val _ = rmDir "testdir2"; in end mlton-20210117+dfsg/regression/finalize.2.ok000066400000000000000000000000261416264345000205000ustar00rootroot000000000000002 3 4 5 6 7 8 9 10 13 mlton-20210117+dfsg/regression/finalize.2.sml000066400000000000000000000006251416264345000206670ustar00rootroot00000000000000structure F = MLton.Finalizable fun loop (n, f) = if n = 0 then () else let val f' = F.new n val _ = F.addFinalizer (f', fn _ => F.withValue (f, fn n => print (concat [Int.toString n, "\n"]))) in loop (n - 1, f') end val r = loop (10, F.new 13) mlton-20210117+dfsg/regression/finalize.3.ok000066400000000000000000000001411416264345000204770ustar00rootroot00000000000000before test 4 before GC 4a after GC 4a invoking touch before GC 4b test 4: finalizer after GC 4b mlton-20210117+dfsg/regression/finalize.3.sml000066400000000000000000000010041416264345000206600ustar00rootroot00000000000000fun test2 (str : string) = let open MLton.Finalizable val x = new str in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); (fn () => (print "invoking touch\n"; touch x)) end val _ = (print "before test 4\n"; let val t = test2 "test 4" in print "before GC 4a\n"; MLton.GC.collect (); print "after GC 4a\n"; t (); print "before GC 4b\n"; MLton.GC.collect (); print "after GC 4b\n" end) mlton-20210117+dfsg/regression/finalize.4.ok000066400000000000000000000002211416264345000204770ustar00rootroot00000000000000before test 5 before GC 5 after GC 5 before GC 5a after GC 5a invoking touch before GC 5b test 5: finalizer after GC 5b before GC 5c after GC 5c mlton-20210117+dfsg/regression/finalize.4.sml000066400000000000000000000014371416264345000206730ustar00rootroot00000000000000fun test (str : string) = let open MLton.Finalizable val x = new str in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); withValue (x, fn s => (print "before GC 5\n"; MLton.GC.collect (); print "after GC 5\n"; (fn () => (print "invoking touch\n"; touch x)))) end val _ = (print "before test 5\n"; let val t = test "test 5" in print "before GC 5a\n"; MLton.GC.collect (); print "after GC 5a\n"; t (); print "before GC 5b\n"; MLton.GC.collect (); print "after GC 5b\n" end; print "before GC 5c\n"; MLton.GC.collect (); print "after GC 5c\n") mlton-20210117+dfsg/regression/finalize.5.ok000066400000000000000000000001201416264345000204760ustar00rootroot00000000000000before test 6 before GC 6 after GC 6 before GC 6a test 6: finalizer after GC 6a mlton-20210117+dfsg/regression/finalize.5.sml000066400000000000000000000010611416264345000206650ustar00rootroot00000000000000fun test (str : string) = let open MLton.Finalizable val x = new str exception Exit in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); withValue (x, fn s => (print "before GC 6\n"; MLton.GC.collect (); print "after GC 6\n"; raise Exit)) handle Exit => () end val _ = (print "before test 6\n"; test "test 6"; print "before GC 6a\n"; MLton.GC.collect (); print "after GC 6a\n") mlton-20210117+dfsg/regression/finalize.6.ok000066400000000000000000000074641416264345000205210ustar00rootroot000000000000005000000 4990000 4980000 4970000 4960000 4950000 4940000 4930000 4920000 4910000 4900000 4890000 4880000 4870000 4860000 4850000 4840000 4830000 4820000 4810000 4800000 4790000 4780000 4770000 4760000 4750000 4740000 4730000 4720000 4710000 4700000 4690000 4680000 4670000 4660000 4650000 4640000 4630000 4620000 4610000 4600000 4590000 4580000 4570000 4560000 4550000 4540000 4530000 4520000 4510000 4500000 4490000 4480000 4470000 4460000 4450000 4440000 4430000 4420000 4410000 4400000 4390000 4380000 4370000 4360000 4350000 4340000 4330000 4320000 4310000 4300000 4290000 4280000 4270000 4260000 4250000 4240000 4230000 4220000 4210000 4200000 4190000 4180000 4170000 4160000 4150000 4140000 4130000 4120000 4110000 4100000 4090000 4080000 4070000 4060000 4050000 4040000 4030000 4020000 4010000 4000000 3990000 3980000 3970000 3960000 3950000 3940000 3930000 3920000 3910000 3900000 3890000 3880000 3870000 3860000 3850000 3840000 3830000 3820000 3810000 3800000 3790000 3780000 3770000 3760000 3750000 3740000 3730000 3720000 3710000 3700000 3690000 3680000 3670000 3660000 3650000 3640000 3630000 3620000 3610000 3600000 3590000 3580000 3570000 3560000 3550000 3540000 3530000 3520000 3510000 3500000 3490000 3480000 3470000 3460000 3450000 3440000 3430000 3420000 3410000 3400000 3390000 3380000 3370000 3360000 3350000 3340000 3330000 3320000 3310000 3300000 3290000 3280000 3270000 3260000 3250000 3240000 3230000 3220000 3210000 3200000 3190000 3180000 3170000 3160000 3150000 3140000 3130000 3120000 3110000 3100000 3090000 3080000 3070000 3060000 3050000 3040000 3030000 3020000 3010000 3000000 2990000 2980000 2970000 2960000 2950000 2940000 2930000 2920000 2910000 2900000 2890000 2880000 2870000 2860000 2850000 2840000 2830000 2820000 2810000 2800000 2790000 2780000 2770000 2760000 2750000 2740000 2730000 2720000 2710000 2700000 2690000 2680000 2670000 2660000 2650000 2640000 2630000 2620000 2610000 2600000 2590000 2580000 2570000 2560000 2550000 2540000 2530000 2520000 2510000 2500000 2490000 2480000 2470000 2460000 2450000 2440000 2430000 2420000 2410000 2400000 2390000 2380000 2370000 2360000 2350000 2340000 2330000 2320000 2310000 2300000 2290000 2280000 2270000 2260000 2250000 2240000 2230000 2220000 2210000 2200000 2190000 2180000 2170000 2160000 2150000 2140000 2130000 2120000 2110000 2100000 2090000 2080000 2070000 2060000 2050000 2040000 2030000 2020000 2010000 2000000 1990000 1980000 1970000 1960000 1950000 1940000 1930000 1920000 1910000 1900000 1890000 1880000 1870000 1860000 1850000 1840000 1830000 1820000 1810000 1800000 1790000 1780000 1770000 1760000 1750000 1740000 1730000 1720000 1710000 1700000 1690000 1680000 1670000 1660000 1650000 1640000 1630000 1620000 1610000 1600000 1590000 1580000 1570000 1560000 1550000 1540000 1530000 1520000 1510000 1500000 1490000 1480000 1470000 1460000 1450000 1440000 1430000 1420000 1410000 1400000 1390000 1380000 1370000 1360000 1350000 1340000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1130000 1120000 1110000 1100000 1090000 1080000 1070000 1060000 1050000 1040000 1030000 1020000 1010000 1000000 990000 980000 970000 960000 950000 940000 930000 920000 910000 900000 890000 880000 870000 860000 850000 840000 830000 820000 810000 800000 790000 780000 770000 760000 750000 740000 730000 720000 710000 700000 690000 680000 670000 660000 650000 640000 630000 620000 610000 600000 590000 580000 570000 560000 550000 540000 530000 520000 510000 500000 490000 480000 470000 460000 450000 440000 430000 420000 410000 400000 390000 380000 370000 360000 350000 340000 330000 320000 310000 300000 290000 280000 270000 260000 250000 240000 230000 220000 210000 200000 190000 180000 170000 160000 150000 140000 130000 120000 110000 100000 90000 80000 70000 60000 50000 40000 30000 20000 10000 mlton-20210117+dfsg/regression/finalize.6.sml000066400000000000000000000021311416264345000206650ustar00rootroot00000000000000structure Bug = struct structure F = MLton.Finalizable fun new_t () = let val p = 0 val t = F.new p fun finalize x = () in F.addFinalizer(t,finalize); t end fun from_string (_:string) = let val x = new_t () in F.withValue(x,fn p => ()); x end val zero = from_string "0.0" (* NOTE: I removed the F.withValue lines in an attempt to make the code simpler, but the bug didn't manifest itself. So I think these lines are critical. *) fun plus (x,y) = let val z = new_t () in F.withValue(x,fn xp => F.withValue(y,fn yp => F.withValue(z,fn zp => let in z end))) end end structure B = Bug fun bigsum (n,store) = if n = 0 then store else let val _ = if Int.mod(n,10000) = 0 then print (Int.toString n ^ "\n") else () in bigsum(Int.-(n,1),B.plus(store,B.from_string(Int.toString n ^ ".0"))) end val bigsum = (fn n => bigsum(n,B.zero)) val x = bigsum 5000000 mlton-20210117+dfsg/regression/finalize.ok000066400000000000000000000000441416264345000203400ustar00rootroot000000000000003 gone. 2 gone. 1 1 gone. 0 0 gone. mlton-20210117+dfsg/regression/finalize.sml000066400000000000000000000014341416264345000205260ustar00rootroot00000000000000structure F = MLton.Finalizable val n = 4 val fs = Array.tabulate (n, fn i => let val f = F.new i val _ = F.addFinalizer (f, fn i => print (concat [Int.toString i, " gone.\n"])) in f end) fun sub i = F.withValue (Array.sub (fs, i), fn i => i) val f = F.new 13 fun clear i = Array.update (fs, i, f) val _ = clear 3 val _ = clear 2 val _ = MLton.GC.collect () fun pi x = print (concat [Int.toString x, "\n"]) val _ = pi (sub 0 + sub 1) val _ = clear 1 val _ = MLton.GC.collect () val _ = pi (sub 0) val _ = clear 0 val _ = MLton.GC.collect () mlton-20210117+dfsg/regression/fixed-integer.ok000066400000000000000000000003141416264345000212710ustar00rootroot00000000000000Testing Int2 Testing Int3 Testing Int4 Testing Int7 Testing Int8 Testing Int9 Testing Int13 Testing Int16 Testing Int17 Testing Int20 Testing Int25 Testing Int30 Testing Int31 Testing Int32 Testing Int64 mlton-20210117+dfsg/regression/fixed-integer.sml000066400000000000000000000155141416264345000214630ustar00rootroot00000000000000functor Test (I: INTEGER) = struct fun foreach (l, f) = List.app f l val m = concat ["Int", Int.toString (valOf I.precision)] val _ = print (concat ["Testing ", m, "\n"]) val nums = [valOf I.maxInt, I.- (valOf I.maxInt, I.fromInt 1)] @ (List.foldl (fn (i, ac) => case SOME (I.fromInt i) handle Overflow => NONE of NONE => ac | SOME i => i :: ac) [] [100, 10, 5, 2, 1, 0, ~1, ~2, ~5, ~10, ~100]) @ [I.+ (I.fromInt 1, valOf I.minInt), valOf I.minInt] fun err msg = print (concat [m, ": ", concat msg, "\n"]) datatype z = datatype StringCvt.radix val _ = foreach (nums, fn i => foreach ([("toString", I.toString, LargeInt.toString), ("fmt BIN", I.fmt BIN, LargeInt.fmt BIN), ("fmt OCT", I.fmt OCT, LargeInt.fmt OCT), ("fmt DEC", I.fmt DEC, LargeInt.fmt DEC), ("fmt HEX", I.fmt HEX, LargeInt.fmt HEX)], fn (name, f, f') => let val s = f i val s' = f' (I.toLarge i) handle Overflow => "Overflow" in if s = s' then () else err [name, " ", s, " <> ", name, " ", s'] end)) structure Answer = struct datatype t = Div | Int of I.int | Overflow val toString = fn Div => "Div" | Int i => I.toString i | Overflow => "Overflow" fun run (f: unit -> I.int): t = Int (f ()) handle General.Div => Div | General.Overflow => Overflow val equals: t * t -> bool = op = end val _ = foreach (nums, fn i => let val a1 = Answer.Int i val a2 = Answer.run (fn () => I.fromLarge (I.toLarge i)) in if Answer.equals (a1, a2) then () else err ["fromLarge (toLarge ", I.toString i, ") = ", Answer.toString a2] end) val _ = foreach ([("abs", I.abs, LargeInt.abs), ("~", I.~, LargeInt.~), ("fromString o toString", valOf o I.fromString o I.toString, valOf o LargeInt.fromString o LargeInt.toString)], fn (name, f, f') => foreach (nums, fn i => let val a = Answer.run (fn () => f i) val a' = Answer.run (fn () => I.fromLarge (f' (I.toLarge i))) in if Answer.equals (a, a') then () else err [name, " ", I.toString i, " = ", Answer.toString a, " <> ", Answer.toString a'] end)) val _ = foreach (nums, fn i => foreach ([("BIN", BIN), ("OCT", OCT), ("DEC", DEC), ("HEX", HEX)], fn (rName, r) => let val i' = valOf (StringCvt.scanString (I.scan r) (I.fmt r i)) in if i = i' then () else err ["scan ", rName, " ", I.toString i, " = ", I.toString i'] end)) val _ = foreach ([("sign", I.sign, LargeInt.sign), ("toInt", I.toInt, LargeInt.toInt)], fn (name, f, f') => foreach (nums, fn i => let val a = Answer.run (fn () => I.fromInt (f i)) val a' = Answer.run (fn () => I.fromInt (f' (I.toLarge i))) in if Answer.equals (a, a') then () else err [name, " ", I.toString i, " = ", Answer.toString a, " <> ", Answer.toString a'] end)) val _ = foreach ([("+", I.+, LargeInt.+), ("-", I.-, LargeInt.-), ("*", I.*, LargeInt.* ), ("div", I.div, LargeInt.div), ("max", I.max, LargeInt.max), ("min", I.min, LargeInt.min), ("mod", I.mod, LargeInt.mod), ("quot", I.quot, LargeInt.quot), ("rem", I.rem, LargeInt.rem)], fn (name, f: I.int * I.int -> I.int, f': LargeInt.int * LargeInt.int -> LargeInt.int) => foreach (nums, fn i: I.int => foreach (nums, fn j: I.int => let val a = Answer.run (fn () => f (i, j)) val a' = Answer.run (fn () => I.fromLarge (f' (I.toLarge i, I.toLarge j))) in if Answer.equals (a, a') then () else err [I.toString i, " ", name, " ", I.toString j, " = ", Answer.toString a, " <> ", Answer.toString a'] end))) val _ = foreach ([(">", I.>, LargeInt.>), (">=", I.>=, LargeInt.>=), ("<", I.<, LargeInt.<), ("<=", I.<=, LargeInt.<=), ("sameSign", I.sameSign, LargeInt.sameSign)], fn (name, f, f') => foreach (nums, fn i: I.int => foreach (nums, fn j: I.int => let val b = f (i, j) val b' = f' (I.toLarge i, I.toLarge j) in if b = b' then () else err [I.toString i, " ", name, " ", I.toString j, " = ", Bool.toString b, " <> ", Bool.toString b'] end))) structure Order = struct datatype t = datatype order val equals: t * t -> bool = op = val toString = fn EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" end val _ = foreach (nums, fn i => foreach (nums, fn j => let val ord = I.compare (i, j) val ord' = LargeInt.compare (I.toLarge i, I.toLarge j) in if Order.equals (ord, ord') then () else err ["compare (", I.toString i, ", ", I.toString j, ") = ", Order.toString ord, " <> ", Order.toString ord'] end)) end structure S = Test (Int2) structure S = Test (Int3) structure S = Test (Int4) structure S = Test (Int7) structure S = Test (Int8) structure S = Test (Int9) structure S = Test (Int13) structure S = Test (Int16) structure S = Test (Int17) structure S = Test (Int20) structure S = Test (Int25) structure S = Test (Int30) structure S = Test (Int31) structure S = Test (Int32) structure S = Test (Int64) mlton-20210117+dfsg/regression/flat-array.2.ok000066400000000000000000000000061416264345000207370ustar00rootroot0000000000000012 14 mlton-20210117+dfsg/regression/flat-array.2.sml000066400000000000000000000005071416264345000211270ustar00rootroot00000000000000val n = 20 val a = Array.tabulate (n, fn i => (i, Array.array (1, 1))) val (i, a') = Array.sub (a, 13) val _ = Array.update (a', 0, i + Array.sub (a', 0)) val _ = print (concat [Int.toString (#1 (Array.sub (a, 12))), " ", Int.toString (Array.sub (#2 (Array.sub (a, 13)), 0)), "\n"]) mlton-20210117+dfsg/regression/flat-array.3.ok000066400000000000000000000000061416264345000207400ustar00rootroot000000000000002 101 mlton-20210117+dfsg/regression/flat-array.3.sml000066400000000000000000000004231416264345000211250ustar00rootroot00000000000000val a = Array.tabulate (100, fn i => (i, real i)) val _ = Array.update (a, 0, (1, 100.0)) val i = #1 (Array.sub (a, 0)) + #1 (Array.sub (a, 1)) val x = #2 (Array.sub (a, 0)) + #2 (Array.sub (a, 1)) val () = print (concat [Int.toString i, " ", Real.toString x, "\n"]) mlton-20210117+dfsg/regression/flat-array.4.ok000066400000000000000000000000001416264345000207330ustar00rootroot00000000000000mlton-20210117+dfsg/regression/flat-array.4.sml000066400000000000000000000017371416264345000211370ustar00rootroot00000000000000structure Main = struct fun doit n = let val v = Vector.tabulate (1000000, fn i => (Word14.fromInt i, Word10.fromInt (i + 1), Word8.fromInt (i + 2))) fun loop n = if 0 = n then () else let val sum = Vector.foldl (fn ((a, b, c), d) => Word14.toLarge a + Word10.toLarge b + Word8.toLarge c + d) 0wx0 v val _ = if 0wx20E0F3760 <> sum then raise Fail (LargeWord.toString sum) else () in loop (n - 1) end in loop n end end val _ = Main.doit 10 mlton-20210117+dfsg/regression/flat-array.ok000066400000000000000000000000041416264345000205750ustar00rootroot000000000000000 3 mlton-20210117+dfsg/regression/flat-array.sml000066400000000000000000000006301416264345000207640ustar00rootroot00000000000000val n = 20 val a = Array.tabulate (n, fn _ => (Array.array (1, 0), Array.array (1, 1))) val (a1, a2) = Array.sub (a, 13) val _ = Array.update (a1, 0, 2) val _ = Array.update (a2, 0, 3) val _ = print (concat [Int.toString (Array.sub (#1 (Array.sub (a, 12)), 0)), " ", Int.toString (Array.sub (#2 (Array.sub (a, 13)), 0)), "\n"]) mlton-20210117+dfsg/regression/flat-vector.ok000066400000000000000000000000201416264345000207570ustar00rootroot00000000000000should be 08 08 mlton-20210117+dfsg/regression/flat-vector.sml000066400000000000000000000004031416264345000211460ustar00rootroot00000000000000val v = Vector.tabulate (10, (fn x => let fun toChar x = Char.chr (Char.ord #"0" + x) in (toChar 0, toChar x) end)) val x = Vector.sub (v, 8) val _ = print "should be 08\n" val _ = print (str (#1 x) ^ str (#2 x) ^ "\n") mlton-20210117+dfsg/regression/flexrecord.2.ok000066400000000000000000000000001416264345000210240ustar00rootroot00000000000000mlton-20210117+dfsg/regression/flexrecord.2.sml000066400000000000000000000012271416264345000212220ustar00rootroot00000000000000datatype b = TRUE | FALSE datatype nat = Z | S of nat fun lt (Z, S _) = TRUE | lt (S n1, S n2) = lt (n1, n2) | lt _ = FALSE fun ZZZ_f (a, b) = lt (#value a, #value b) fun ZZZ_copyTo (array, record as {value, offset}) = fn S Z => {value = value, offset = S (S (S Z))} | n => array n fun ZZZ_fixTooBig (array, record) = let val left = array (S Z) val right = array (S (S Z)) val small = case ZZZ_f (left, right) of TRUE => left | FALSE => right in case ZZZ_f (record, small) of TRUE => ZZZ_copyTo (array, record) | FALSE => ZZZ_copyTo (array, small) end mlton-20210117+dfsg/regression/flexrecord.ok000066400000000000000000000000001416264345000206640ustar00rootroot00000000000000mlton-20210117+dfsg/regression/flexrecord.sml000066400000000000000000000027261416264345000210670ustar00rootroot00000000000000(* flexrecord.sml *) (* Checks type inference for flexible records. *) (* flexrecord1 *) fun f(r as {...}) = let fun g() = r in [r, {a=1}] end; (* flexrecord1 *) (* flexrecord2 *) val _ = let val g = #foo val _ = g {foo = 13} val _ = g {foo = "yes"} in () end (* flexrecord2 *) (* flexrecord3 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = 1.0} in () end (* flexrecord3 *) (* flexrecord4 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = false} in () end (* flexrecord4 *) (* flexrecord5 *) val _ = let val f = #foo val g = fn h => fn y => h (f y) val h = fn x => f x val _ = f {foo=0, bar=1} in () end (* flexrecord5 *) (* flexrecord6 *) val _ = fn x => let val _: string = #1 x fun id z = z fun g () = let val (_, a) = x in a end in g () end (* flexrecord6 *) (* flexrecord7 *) val _ = let fun f r = { a = #a r, b = #b r } val _ = f { a = 0.0, b = 0.0 } in () end (* flexrecord7 *) (* flexrecord8 *) val _ = fn _ => let val f = #foo val g = (fn x => x) f val _ = f {foo=0, bar=1} in () end (* flexrecord8 *) (* flexrecord9 *) val g = fn {...} => () and h = fn () => () val () = (h (); g {a = 13}) (* flexrecord9 *) mlton-20210117+dfsg/regression/format.sml000066400000000000000000000034771416264345000202260ustar00rootroot00000000000000(* * This is based on * Functional Unparsing * BRICS Technical Report RS 98-12 * Olivier Danvy, May 1998 *) signature FORMAT = sig type ('a, 'b) t val eol: ('a, 'a) t val format: (string, 'a) t -> 'a val int: ('a, int -> 'a) t val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t val lit: string -> ('a, 'a) t val new: ('b -> string) -> ('a, 'b -> 'a) t val o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t val string: ('a, string -> 'a) t end structure Format:> FORMAT = struct type ('a, 'b) t = (string list -> 'a) * string list -> 'b val new: ('b -> string) -> ('a, 'b -> 'a) t = fn toString => fn (k, ss) => fn b => k (toString b :: ss) val lit: string -> ('a, 'a) t = fn s => fn (k, ss) => k (s :: ss) val eol: ('a, 'a) t = fn z => lit "\n" z val format: (string, 'a) t -> 'a = fn f => f (concat o rev, []) val int: ('a, int -> 'a) t = fn z => new Int.toString z val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t = fn f => fn (k, ss) => fn [] => k ("[]" :: ss) | x :: xs => let fun loop xs ss = case xs of [] => k ("]" :: ss) | x :: xs => f (loop xs, ", " :: ss) x in f (loop xs, "[" :: ss) x end val op o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t = fn (f, g) => fn (k, ss) => f (fn ss => g (k, ss), ss) val string: ('a, string -> 'a) t = fn z => new (fn s => s) z end open Format val _ = if "abc" = format (lit "abc") andalso "abc" = format string "abc" andalso "abc" = format (lit "a" o lit "b" o lit "c") andalso "abc" = format (string o string o string) "a" "b" "c" andalso "[a, b, c]" = format (list string) ["a", "b", "c"] andalso "[1, 2, 3]" = format (list int) [1, 2, 3] then () else raise Fail "bug" mlton-20210117+dfsg/regression/ftruncate.ok000066400000000000000000000000061416264345000205300ustar00rootroot00000000000000hello mlton-20210117+dfsg/regression/ftruncate.sml000066400000000000000000000011041416264345000207120ustar00rootroot00000000000000val tmp = "tmp" val () = let open TextIO val out = openOut tmp val () = output (out, "hello, there\n") val () = closeOut out in () end val () = let open Posix open FileSys val fd = openf (tmp, O_WRONLY, O.flags []) val () = ftruncate (fd, 5) val () = IO.close fd in () end val () = let open TextIO val ins = openIn tmp val () = print (TextIO.inputAll ins) val () = print "\n" val () = closeIn ins in () end val () = OS.FileSys.remove tmp mlton-20210117+dfsg/regression/functor.ok000066400000000000000000000000341416264345000202160ustar00rootroot00000000000000value is A(K) value is A(J) mlton-20210117+dfsg/regression/functor.sml000066400000000000000000000016001416264345000204000ustar00rootroot00000000000000signature A = sig type t val a : t end functor F(A : sig type t val pr : t -> string end) = struct datatype k = A of A.t fun pr (A t) = "A(" ^ A.pr t ^ ")" end functor G(A : A) = struct type t = A.t val b = A.a end functor H(A : sig type t type s val a : s sharing type t = s val pr : t -> string end) = struct structure A1 : sig type t val pr : t -> string end = A structure A2 = F(A1) structure A3 = G(A) val a = A2.A A.a val _ = print ("value is " ^ A2.pr a ^ "\n") end structure B1 = struct datatype t = J | K type s = t val a = K fun pr K = "K" | pr J = "J" end structure B2 = struct open B1 val a = J end structure H1 = H(B1) structure H2 = H(B2) signature S = sig end functor F (): S = struct end signature S = sig val y: int end structure C = F () mlton-20210117+dfsg/regression/gc-collect.ok000066400000000000000000000000161416264345000205520ustar00rootroot00000000000000Hello, world! mlton-20210117+dfsg/regression/gc-collect.sml000066400000000000000000000001151416264345000207340ustar00rootroot00000000000000val _ = print "Hello, " val _ = MLton.GC.collect () val _ = print "world!\n" mlton-20210117+dfsg/regression/gc-collect2.ok000066400000000000000000000000061416264345000206330ustar00rootroot0000000000000060480 mlton-20210117+dfsg/regression/gc-collect2.sml000066400000000000000000000061571416264345000210320ustar00rootroot00000000000000val n = case CommandLine.arguments () of [n] => (case Int.fromString n of SOME n => n | NONE => 42) | _ => 42 val () = MLton.GC.collect () val l = [ n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n ] val k = List.foldl op+ 0 l val _ = print (Int.toString k ^ "\n") mlton-20210117+dfsg/regression/general.ok000066400000000000000000000006271416264345000201630ustar00rootroot00000000000000 File general.sml: Testing structure General... Should be `E1 or E2': E1 E1 Should be `Bind': Bind Bind Should be `Match': Match Match Should be `Subscript': Subscript Subscript Should be `Overflow': Overflow Overflow Should be `Div': Div Div Should be `Chr': Chr Chr Should be `Fail': Fail Fail: demo Should be `Option': Option Option Should be `Empty': Empty Empty mlton-20210117+dfsg/regression/general.sml000066400000000000000000000033201416264345000203360ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* General -- incomplete 1996-04-19, 1996-09-30, 1997-03-12 *) val _ = print "\nFile general.sml: Testing structure General...\n" exception NoExceptionRaised fun getExn (f : unit -> 'a) = (f (); NoExceptionRaised) handle e => e fun prExn(exnStr, exn) = (print "Should be `"; print exnStr; print "':\n "; print (exnName exn); print "\n "; print (exnMessage exn); print "\n"); exception E1; exception E2 = E1; val _ = List.map prExn [("E1 or E2", E2), ("Bind", getExn(fn _ => let val true = false in () end)), ("Match", getExn(fn _ => (fn true => ()) false)), ("Subscript", getExn(fn _ => Vector.sub(vector [], ~1))), ("Overflow", getExn(fn _ => Array.array(Array.maxLen+1, ()))), (* ("Overflow", getExn(fn _ => Math.exp 1E99)), ("Domain", getExn(fn _ => Math.ln ~1.0)), *) ("Div", getExn(fn _ => 1 div 0)), ("Chr", getExn(fn _ => Char.chr 9999999)), ("Fail", Fail "demo"), ("Option", getExn(fn _ => valOf NONE)), ("Empty", getExn(fn _ => List.hd [])) (* ("SysErr", getExn (fn _ => FileSys.modTime "exists.not")), *) (* ("Io", getExn (fn _ => TextIO.openOut "."))*) ]; mlton-20210117+dfsg/regression/generate/000077500000000000000000000000001416264345000200005ustar00rootroot00000000000000mlton-20210117+dfsg/regression/generate/all-overloads.sml000066400000000000000000000034021416264345000232600ustar00rootroot00000000000000structure List = struct fun foreach (l, f) = List.app f l fun map (l, f) = List.map f l val tabulate = List.tabulate end val int = List.map (["Int", "IntInf", "LargeInt", "FixedInt", "Position"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Int", Int.toString i]), fn s => concat [s, ".int"]) val real = List.map (["Real", "Real32", "Real64", "LargeReal"], fn s => concat [s, ".real"]) val word = List.map (["Word", "LargeWord", "SysWord"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Word", Int.toString i]), fn s => concat [s, ".word"]) val text = ["Char.char", "String.string"] val num = int @ word @ real val numtext = num @ text val realint = int @ real val wordint = int @ word datatype ty = Binary | Compare | Unary val binary = Binary val compare = Compare val unary = Unary val () = print "(* This file is automatically generated. Do not edit. *)\n" val () = List.foreach ([(2, "~", unary, num), (2, "+", binary, num), (2, "-", binary, num), (2, "*", binary, num), (4, "/", binary, real), (3, "div", binary, wordint), (3, "mod", binary, wordint), (3, "abs", unary, realint), (1, "<", compare, numtext), (1, "<=", compare, numtext), (1, ">", compare, numtext), (1, ">=", compare, numtext)], fn (prec, f, ty, class) => List.foreach (class, fn c => print (concat ["fun f (x: ", c, ") = ", case ty of Binary => concat ["x ", f, " x"] | Compare => concat ["x ", f, " x"] | Unary => concat [f, " x"], "\n"]))) mlton-20210117+dfsg/regression/grow-raise.ok000066400000000000000000000000001416264345000206060ustar00rootroot00000000000000mlton-20210117+dfsg/regression/grow-raise.sml000066400000000000000000000001561416264345000210040ustar00rootroot00000000000000exception E val rec loop = fn 0 => raise E | n => 1 + loop(n - 1) val _ = loop 1000000 handle E => 13 mlton-20210117+dfsg/regression/harmonic.ok000066400000000000000000000313621416264345000203460ustar00rootroot0000000000000039222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351743/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456000 39222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351743/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456000 39222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351744/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456001 358461522098562330522368524929524622532525584701059206153553750705434052377283596613617481244424655693938930381311997638293627537451602773903820968552130972887303413589546894027520754651486856563137183246192178699678402674540166374627043664906073906297274816459668667036172130641349518050143421076760383286883364703596950890826015165833823694165609326072001125925947941173292524929320852017146822552580638365083483573117047367907722692354093191112509683582480630626180028955372947526880363943215041437553968453959363728935349050391593152514726743292861966553534860639703655812111123703492148921565094560252518073467308791001926448291515790185269315396666769441921156757709919400568459053368117262392436797838420825408664173807857671257927851086211239359173148006022651766185985672015333229146155414185880238456850333030849296390403416675648924190821935978318989697994624107101305396695983830632125072845164812608610833360642906546522190574915516848572373515590594917314505410655067616876247233191199817079398386955544892254430829041736578397432786470885476870096007407522453020569324839377946875102819464791750940674570207041763842316441109697127357863841849145838811505860143547300714245154314578247330134740357056527510649351445398291224426935672440003549443264153139231810411557938591935804436421724688022578381481699067514507018795258379898018399970464639526159219836206011899406009490169254066867274286342171170719392359389802691145117784143916274403098064821963496884388846081261575676105167332019732620818187134376880408113297535044274080416137366664494303712982922098088481681093999247876230652664042310297148215907700256629842200353215007673060147934906189095051105500850952119747212056924070502979140048214801694542153464541916357678242046135777239281222581603879070245671419345161950788321812100718635294239261469314197276562803799064652964897014029613177142413026355718471140534348348916512813301600229638316055104001586939995060778557881845061653288224182636421889298105106468406213805686490082433529022670697855737490359289535619298910652702271815338404242660070659472302812176970967983677659407644879715291108839385336661792302741320341464267733962261575530356168292989514277191194677808581144814150652561935573324235668284280889410326969292735491803095464745049786166321512680100995313043414674410401107844809249447925921508469269537158965153499211799791828276270030959415043680955031377932590520288088551118270213895992371250638890623059917310752449735873914754336938879520234347126678667131091377876120324203904603402431390534249783544011207559910049608289464118144065780698236078439423743/20881051253527521376266628409869519108736635442546416785552763792625959236782369335331122938859228653454653830414612406110100659460692055710637320771439442740023116591792113518214225847223460813939376434174077717092474236675124110134538937502306128830400556386689067533143838085992709008360691371931761554299464698716134460357341438509873836572575129511710229238690268798423730447986901673734875163195074232041608826497393923429838146507099826012591048597537170575345634170780854654867803566634587723300344673046819127672492279838245759278057065677246645861360873977026582276690505990086770498970856903812369800192948369393569991792196174211064018085096327649136716884533268494424920809187135912218199481817861413234925743678185356051182634431087183608027419999566922617194511846511053638472677233818212710120673151792340351358429025210111198176650463187702039643623863929346139413620466425701541316867367759692854200856647313268505845502164988832260143258418726180902155818243740203225442133534507563310733806742900928848033545045850483706342734716830656237203579768765082045678817101699253409958167704269292264638180841420055115815117759518307480103520371072795365791410262205317173836104236746251742930032764071294066395496496859903255277091959141417406492853412401985848227410568340137026519598541209708211542093795071057456229356282015253909367631254379970978096739167471084878345177085009589413576223502624147226165657176819032738515764606556537733047549323845366088599944872791579225919600025760566308781390209620720309216401632591493511274663830028025982488236430055652087712595531127150404248836944878030337945884808357552585634524317577768773922416999325074273405313728339632788329508579480304232808517777116171250332089351193074144436830834115981381263037947750947397202410144915121964319701276673210148182982111528528737004451640818764508669425015173887689559553644971188242567819492876843814351073907861592146589712227491870025173195229134158327277560002290852338792723345564970959855741208293512637069750897013244062420619894414706016980289858301158602967474185960922013609169766365917722983233483157210895113717249132840388834959192954008423234840715058829935612371904513112679664232958753504408293439851675195309613057738876050559566271873961750656956871044217803226408727433665326738402841796877688374578576771404698063663600578161484674304442373965967383950076333797700813576865390400492976331175087227695126769646433936057192548695882076685652873146573892287086381304698709288766089082422458380330759589017296536424270948994870182360146319308312461592885651230596183554702257149107456000 mlton-20210117+dfsg/regression/harmonic.sml000066400000000000000000000052551416264345000205320ustar00rootroot00000000000000fun die str = ( print (str ^ "\n"); raise Overflow ) local fun loop (big: IntInf.int, small: IntInf.int): IntInf.int = if small = 0 then big else loop (small, IntInf.rem (big, small)) in fun gcd (x: IntInf.int, y: IntInf.int): IntInf.int = let val x = IntInf.abs x val y = IntInf.abs y val (x, y) = if x >= y then (x, y) else (y, x) in loop (x, y) end end fun reduce (num: IntInf.int, den: IntInf.int) : IntInf.int * IntInf.int = let val g = gcd (num, den) val gs = if den >= 0 then g else ~ g in if gs = 1 then (num, den) else let val rnum = IntInf.quot (num, gs) val badn = IntInf.rem (num, gs) val rden = IntInf.quot (den, gs) val badd = IntInf.rem (den, gs) in if badn <> 0 orelse num <> rnum * gs orelse badd <> 0 orelse den <> rden * gs then die ("Bad: num " ^ (IntInf.toString num) ^ ", den " ^ (IntInf.toString den) ^ ", gcds " ^ (IntInf.toString gs) ^ ", rnum " ^ (IntInf.toString rnum) ^ ", rden " ^ (IntInf.toString rden) ^ ", badn " ^ (IntInf.toString badn) ^ ", badd " ^ (IntInf.toString badd)) else (); (rnum, rden) end end fun addrecip (xxx: int, (num: IntInf.int, den: IntInf.int)) : IntInf.int * IntInf.int = let val xxx = IntInf.fromInt xxx val xnum = xxx * num + den val xden = xxx * den in reduce (xnum, xden) end fun printRat (num: IntInf.int, den: IntInf.int): unit = print (IntInf.toString num ^ "/" ^ IntInf.toString den ^ "\n") fun spin (limit: int): IntInf.int * IntInf.int = let fun loop (n: int, res: IntInf.int * IntInf.int) : IntInf.int * IntInf.int = if n = limit then res else loop (n + 1, addrecip (n, res)) in if limit <= 0 then die "Bad limit" else loop (1, (0, 1)) end val (n, d) = spin 3000 val _ = printRat (n, d) val _ = printRat (reduce (n * d * n, d * d * n)) val _ = printRat (reduce (n + 1, d + 1)) val _ = printRat (reduce (n * (d + 1) + d * (n + 1), d * (d + 1))) mlton-20210117+dfsg/regression/hello-world.ok000066400000000000000000000000161416264345000207660ustar00rootroot00000000000000Hello, world! mlton-20210117+dfsg/regression/hello-world.sml000066400000000000000000000000401416264345000211450ustar00rootroot00000000000000val _ = print "Hello, world!\n" mlton-20210117+dfsg/regression/id.ok000066400000000000000000000000001416264345000171230ustar00rootroot00000000000000mlton-20210117+dfsg/regression/id.sml000066400000000000000000000003741416264345000173230ustar00rootroot00000000000000(* id.sml *) (* Checks parsing of identifiers. *) val ? = {* = op*, + = op+} val op* = # * ? val op+ = # + ?; type '& = ' list type t = int& type ''`` = '' type ('0,'_) == = '_`` &; fun !x=x=x fun ''`x:''=(x=x;x); infix v fun 3v? = 0 | _v? = 1; mlton-20210117+dfsg/regression/ieee-real.arm-linux.ok000066400000000000000000000001131416264345000222770ustar00rootroot00000000000000unhandled exception: SysErr: Invalid argument [inval] Nonzero exit status. mlton-20210117+dfsg/regression/ieee-real.ok000066400000000000000000000001041416264345000203640ustar00rootroot000000000000003FB9999999999999 3FB999999999999A 3FB999999999999A 3FB9999999999999 mlton-20210117+dfsg/regression/ieee-real.sml000066400000000000000000000022431416264345000205540ustar00rootroot00000000000000structure R = Real structure I = IEEEReal structure V = Word8Vector structure P = PackRealBig fun setRM mode = (I.setRoundingMode mode; if I.getRoundingMode () <> mode then raise Fail "setRM" else ()) fun up() = setRM I.TO_POSINF fun down() = setRM I.TO_NEGINF fun near() = setRM I.TO_NEAREST fun zero() = setRM I.TO_ZERO (* 61 digits of 1 / 10 in Mathematica In[7]:= RealDigits[1 / 10,2,61] Out[7]= {{1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1},-3} *) val mtenth_lo = (down();1.0 / 10.0) val mtenth_hi = (up();1.0 / 10.0) val mtenth_near = (near();1.0 / 10.0) val mtenth_zero = (zero();1.0 / 10.0) fun word8vectorToString v = V.foldr (fn(w,s) => Word8.toString w ^ s) "" v val _ = print(word8vectorToString (P.toBytes mtenth_lo) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_hi) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_near) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_zero) ^ "\n") mlton-20210117+dfsg/regression/int-inf.0.ok000066400000000000000000000000131416264345000202350ustar00rootroot000000000000002147483648 mlton-20210117+dfsg/regression/int-inf.0.sml000066400000000000000000000000721416264345000204240ustar00rootroot00000000000000val _ = print (concat [IntInf.toString 0x80000000, "\n"]) mlton-20210117+dfsg/regression/int-inf.1.ok000066400000000000000000000000301416264345000202350ustar00rootroot00000000000000trying 0 ok trying 1 ok mlton-20210117+dfsg/regression/int-inf.1.sml000066400000000000000000000005671416264345000204360ustar00rootroot00000000000000val big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val bstr = IntInf.toString barg val _ = print (concat ["trying ", bstr, "\n"]) in print (if ~ big <= barg then if barg < big then "ok\n" else "positive\n" else "negative\n") end val _ = try 0 val _ = try 1 mlton-20210117+dfsg/regression/int-inf.2.ok000066400000000000000000005154421416264345000202600ustar00rootroot00000000000000trying 0 trying 0 trying 1 trying ~1 trying 2 trying ~2 trying 3 trying ~3 trying 4 trying ~4 trying 5 trying ~5 trying 6 trying ~6 trying 7 trying ~7 trying 8 trying ~8 trying 9 trying ~9 trying 10 trying ~10 trying 11 trying ~11 trying 12 trying ~12 trying 13 trying ~13 trying 14 trying ~14 trying 15 trying ~15 trying 16 trying ~16 trying 17 trying ~17 trying 18 trying ~18 trying 19 trying ~19 trying 20 trying ~20 trying 21 trying ~21 trying 22 trying ~22 trying 23 trying ~23 trying 24 trying ~24 trying 25 trying ~25 trying 26 trying ~26 trying 27 trying ~27 trying 28 trying ~28 trying 29 trying ~29 trying 30 trying ~30 trying 31 trying ~31 trying 32 trying ~32 trying 33 trying ~33 trying 34 trying ~34 trying 35 trying ~35 trying 36 trying ~36 trying 37 trying ~37 trying 38 trying ~38 trying 39 trying ~39 trying 40 trying ~40 trying 41 trying ~41 trying 42 trying ~42 trying 43 trying ~43 trying 44 trying ~44 trying 45 trying ~45 trying 46 trying ~46 trying 47 trying ~47 trying 48 trying ~48 trying 49 trying ~49 trying 50 trying ~50 trying 51 trying ~51 trying 52 trying ~52 trying 53 trying ~53 trying 54 trying ~54 trying 55 trying ~55 trying 56 trying ~56 trying 57 trying ~57 trying 58 trying ~58 trying 59 trying ~59 trying 60 trying ~60 trying 61 trying ~61 trying 62 trying ~62 trying 63 trying ~63 trying 64 trying ~64 trying 65 trying ~65 trying 66 trying ~66 trying 67 trying ~67 trying 68 trying ~68 trying 69 trying ~69 trying 70 trying ~70 trying 71 trying ~71 trying 72 trying ~72 trying 73 trying ~73 trying 74 trying ~74 trying 75 trying ~75 trying 76 trying ~76 trying 77 trying ~77 trying 78 trying ~78 trying 79 trying ~79 trying 80 trying ~80 trying 81 trying ~81 trying 82 trying ~82 trying 83 trying ~83 trying 84 trying ~84 trying 85 trying ~85 trying 86 trying ~86 trying 87 trying ~87 trying 88 trying ~88 trying 89 trying ~89 trying 90 trying ~90 trying 91 trying ~91 trying 92 trying ~92 trying 93 trying ~93 trying 94 trying ~94 trying 95 trying ~95 trying 96 trying ~96 trying 97 trying ~97 trying 98 trying ~98 trying 99 trying ~99 trying 100 trying ~100 trying 101 trying ~101 trying 102 trying ~102 trying 103 trying ~103 trying 104 trying ~104 trying 105 trying ~105 trying 106 trying ~106 trying 107 trying ~107 trying 108 trying ~108 trying 109 trying ~109 trying 110 trying ~110 trying 111 trying ~111 trying 112 trying ~112 trying 113 trying ~113 trying 114 trying ~114 trying 115 trying ~115 trying 116 trying ~116 trying 117 trying ~117 trying 118 trying ~118 trying 119 trying ~119 trying 120 trying ~120 trying 121 trying ~121 trying 122 trying ~122 trying 123 trying ~123 trying 124 trying ~124 trying 125 trying ~125 trying 126 trying ~126 trying 127 trying ~127 trying 128 trying ~128 trying 129 trying ~129 trying 130 trying ~130 trying 131 trying ~131 trying 132 trying ~132 trying 133 trying ~133 trying 134 trying ~134 trying 135 trying ~135 trying 136 trying ~136 trying 137 trying ~137 trying 138 trying ~138 trying 139 trying ~139 trying 140 trying ~140 trying 141 trying ~141 trying 142 trying ~142 trying 143 trying ~143 trying 144 trying ~144 trying 145 trying ~145 trying 146 trying ~146 trying 147 trying ~147 trying 148 trying ~148 trying 149 trying ~149 trying 150 trying ~150 trying 151 trying ~151 trying 152 trying ~152 trying 153 trying ~153 trying 154 trying ~154 trying 155 trying ~155 trying 156 trying ~156 trying 157 trying ~157 trying 158 trying ~158 trying 159 trying ~159 trying 160 trying ~160 trying 161 trying ~161 trying 162 trying ~162 trying 163 trying ~163 trying 164 trying ~164 trying 165 trying ~165 trying 166 trying ~166 trying 167 trying ~167 trying 168 trying ~168 trying 169 trying ~169 trying 170 trying ~170 trying 171 trying ~171 trying 172 trying ~172 trying 173 trying ~173 trying 174 trying ~174 trying 175 trying ~175 trying 176 trying ~176 trying 177 trying ~177 trying 178 trying ~178 trying 179 trying ~179 trying 180 trying ~180 trying 181 trying ~181 trying 182 trying ~182 trying 183 trying ~183 trying 184 trying ~184 trying 185 trying ~185 trying 186 trying ~186 trying 187 trying ~187 trying 188 trying ~188 trying 189 trying ~189 trying 190 trying ~190 trying 191 trying ~191 trying 192 trying ~192 trying 193 trying ~193 trying 194 trying ~194 trying 195 trying ~195 trying 196 trying ~196 trying 197 trying ~197 trying 198 trying ~198 trying 199 trying ~199 trying 200 trying ~200 trying 201 trying ~201 trying 202 trying ~202 trying 203 trying ~203 trying 204 trying ~204 trying 205 trying ~205 trying 206 trying ~206 trying 207 trying ~207 trying 208 trying ~208 trying 209 trying ~209 trying 210 trying ~210 trying 211 trying ~211 trying 212 trying ~212 trying 213 trying ~213 trying 214 trying ~214 trying 215 trying ~215 trying 216 trying ~216 trying 217 trying ~217 trying 218 trying ~218 trying 219 trying ~219 trying 220 trying ~220 trying 221 trying ~221 trying 222 trying ~222 trying 223 trying ~223 trying 224 trying ~224 trying 225 trying ~225 trying 226 trying ~226 trying 227 trying ~227 trying 228 trying ~228 trying 229 trying ~229 trying 230 trying ~230 trying 231 trying ~231 trying 232 trying ~232 trying 233 trying ~233 trying 234 trying ~234 trying 235 trying ~235 trying 236 trying ~236 trying 237 trying ~237 trying 238 trying ~238 trying 239 trying ~239 trying 240 trying ~240 trying 241 trying ~241 trying 242 trying ~242 trying 243 trying ~243 trying 244 trying ~244 trying 245 trying ~245 trying 246 trying ~246 trying 247 trying ~247 trying 248 trying ~248 trying 249 trying ~249 trying 250 trying ~250 trying 251 trying ~251 trying 252 trying ~252 trying 253 trying ~253 trying 254 trying ~254 trying 255 trying ~255 trying 256 trying ~256 trying 257 trying ~257 trying 258 trying ~258 trying 259 trying ~259 trying 260 trying ~260 trying 261 trying ~261 trying 262 trying ~262 trying 263 trying ~263 trying 264 trying ~264 trying 265 trying ~265 trying 266 trying ~266 trying 267 trying ~267 trying 268 trying ~268 trying 269 trying ~269 trying 270 trying ~270 trying 271 trying ~271 trying 272 trying ~272 trying 273 trying ~273 trying 274 trying ~274 trying 275 trying ~275 trying 276 trying ~276 trying 277 trying ~277 trying 278 trying ~278 trying 279 trying ~279 trying 280 trying ~280 trying 281 trying ~281 trying 282 trying ~282 trying 283 trying ~283 trying 284 trying ~284 trying 285 trying ~285 trying 286 trying ~286 trying 287 trying ~287 trying 288 trying ~288 trying 289 trying ~289 trying 290 trying ~290 trying 291 trying ~291 trying 292 trying ~292 trying 293 trying ~293 trying 294 trying ~294 trying 295 trying ~295 trying 296 trying ~296 trying 297 trying ~297 trying 298 trying ~298 trying 299 trying ~299 trying 300 trying ~300 trying 301 trying ~301 trying 302 trying ~302 trying 303 trying ~303 trying 304 trying ~304 trying 305 trying ~305 trying 306 trying ~306 trying 307 trying ~307 trying 308 trying ~308 trying 309 trying ~309 trying 310 trying ~310 trying 311 trying ~311 trying 312 trying ~312 trying 313 trying ~313 trying 314 trying ~314 trying 315 trying ~315 trying 316 trying ~316 trying 317 trying ~317 trying 318 trying ~318 trying 319 trying ~319 trying 320 trying ~320 trying 321 trying ~321 trying 322 trying ~322 trying 323 trying ~323 trying 324 trying ~324 trying 325 trying ~325 trying 326 trying ~326 trying 327 trying ~327 trying 328 trying ~328 trying 329 trying ~329 trying 330 trying ~330 trying 331 trying ~331 trying 332 trying ~332 trying 333 trying ~333 trying 334 trying ~334 trying 335 trying ~335 trying 336 trying ~336 trying 337 trying ~337 trying 338 trying ~338 trying 339 trying ~339 trying 340 trying ~340 trying 341 trying ~341 trying 342 trying ~342 trying 343 trying ~343 trying 344 trying ~344 trying 345 trying ~345 trying 346 trying ~346 trying 347 trying ~347 trying 348 trying ~348 trying 349 trying ~349 trying 350 trying ~350 trying 351 trying ~351 trying 352 trying ~352 trying 353 trying ~353 trying 354 trying ~354 trying 355 trying ~355 trying 356 trying ~356 trying 357 trying ~357 trying 358 trying ~358 trying 359 trying ~359 trying 360 trying ~360 trying 361 trying ~361 trying 362 trying ~362 trying 363 trying ~363 trying 364 trying ~364 trying 365 trying ~365 trying 366 trying ~366 trying 367 trying ~367 trying 368 trying ~368 trying 369 trying ~369 trying 370 trying ~370 trying 371 trying ~371 trying 372 trying ~372 trying 373 trying ~373 trying 374 trying ~374 trying 375 trying ~375 trying 376 trying ~376 trying 377 trying ~377 trying 378 trying ~378 trying 379 trying ~379 trying 380 trying ~380 trying 381 trying ~381 trying 382 trying ~382 trying 383 trying ~383 trying 384 trying ~384 trying 385 trying ~385 trying 386 trying ~386 trying 387 trying ~387 trying 388 trying ~388 trying 389 trying ~389 trying 390 trying ~390 trying 391 trying ~391 trying 392 trying ~392 trying 393 trying ~393 trying 394 trying ~394 trying 395 trying ~395 trying 396 trying ~396 trying 397 trying ~397 trying 398 trying ~398 trying 399 trying ~399 trying 400 trying ~400 trying 401 trying ~401 trying 402 trying ~402 trying 403 trying ~403 trying 404 trying ~404 trying 405 trying ~405 trying 406 trying ~406 trying 407 trying ~407 trying 408 trying ~408 trying 409 trying ~409 trying 410 trying ~410 trying 411 trying ~411 trying 412 trying ~412 trying 413 trying ~413 trying 414 trying ~414 trying 415 trying ~415 trying 416 trying ~416 trying 417 trying ~417 trying 418 trying ~418 trying 419 trying ~419 trying 420 trying ~420 trying 421 trying ~421 trying 422 trying ~422 trying 423 trying ~423 trying 424 trying ~424 trying 425 trying ~425 trying 426 trying ~426 trying 427 trying ~427 trying 428 trying ~428 trying 429 trying ~429 trying 430 trying ~430 trying 431 trying ~431 trying 432 trying ~432 trying 433 trying ~433 trying 434 trying ~434 trying 435 trying ~435 trying 436 trying ~436 trying 437 trying ~437 trying 438 trying ~438 trying 439 trying ~439 trying 440 trying ~440 trying 441 trying ~441 trying 442 trying ~442 trying 443 trying ~443 trying 444 trying ~444 trying 445 trying ~445 trying 446 trying ~446 trying 447 trying ~447 trying 448 trying ~448 trying 449 trying ~449 trying 450 trying ~450 trying 451 trying ~451 trying 452 trying ~452 trying 453 trying ~453 trying 454 trying ~454 trying 455 trying ~455 trying 456 trying ~456 trying 457 trying ~457 trying 458 trying ~458 trying 459 trying ~459 trying 460 trying ~460 trying 461 trying ~461 trying 462 trying ~462 trying 463 trying ~463 trying 464 trying ~464 trying 465 trying ~465 trying 466 trying ~466 trying 467 trying ~467 trying 468 trying ~468 trying 469 trying ~469 trying 470 trying ~470 trying 471 trying ~471 trying 472 trying ~472 trying 473 trying ~473 trying 474 trying ~474 trying 475 trying ~475 trying 476 trying ~476 trying 477 trying ~477 trying 478 trying ~478 trying 479 trying ~479 trying 480 trying ~480 trying 481 trying ~481 trying 482 trying ~482 trying 483 trying ~483 trying 484 trying ~484 trying 485 trying ~485 trying 486 trying ~486 trying 487 trying ~487 trying 488 trying ~488 trying 489 trying ~489 trying 490 trying ~490 trying 491 trying ~491 trying 492 trying ~492 trying 493 trying ~493 trying 494 trying ~494 trying 495 trying ~495 trying 496 trying ~496 trying 497 trying ~497 trying 498 trying ~498 trying 499 trying ~499 trying 500 trying ~500 trying 501 trying ~501 trying 502 trying ~502 trying 503 trying ~503 trying 504 trying ~504 trying 505 trying ~505 trying 506 trying ~506 trying 507 trying ~507 trying 508 trying ~508 trying 509 trying ~509 trying 510 trying ~510 trying 511 trying ~511 trying 512 trying ~512 trying 513 trying ~513 trying 514 trying ~514 trying 515 trying ~515 trying 516 trying ~516 trying 517 trying ~517 trying 518 trying ~518 trying 519 trying ~519 trying 520 trying ~520 trying 521 trying ~521 trying 522 trying ~522 trying 523 trying ~523 trying 524 trying ~524 trying 525 trying ~525 trying 526 trying ~526 trying 527 trying ~527 trying 528 trying ~528 trying 529 trying ~529 trying 530 trying ~530 trying 531 trying ~531 trying 532 trying ~532 trying 533 trying ~533 trying 534 trying ~534 trying 535 trying ~535 trying 536 trying ~536 trying 537 trying ~537 trying 538 trying ~538 trying 539 trying ~539 trying 540 trying ~540 trying 541 trying ~541 trying 542 trying ~542 trying 543 trying ~543 trying 544 trying ~544 trying 545 trying ~545 trying 546 trying ~546 trying 547 trying ~547 trying 548 trying ~548 trying 549 trying ~549 trying 550 trying ~550 trying 551 trying ~551 trying 552 trying ~552 trying 553 trying ~553 trying 554 trying ~554 trying 555 trying ~555 trying 556 trying ~556 trying 557 trying ~557 trying 558 trying ~558 trying 559 trying ~559 trying 560 trying ~560 trying 561 trying ~561 trying 562 trying ~562 trying 563 trying ~563 trying 564 trying ~564 trying 565 trying ~565 trying 566 trying ~566 trying 567 trying ~567 trying 568 trying ~568 trying 569 trying ~569 trying 570 trying ~570 trying 571 trying ~571 trying 572 trying ~572 trying 573 trying ~573 trying 574 trying ~574 trying 575 trying ~575 trying 576 trying ~576 trying 577 trying ~577 trying 578 trying ~578 trying 579 trying ~579 trying 580 trying ~580 trying 581 trying ~581 trying 582 trying ~582 trying 583 trying ~583 trying 584 trying ~584 trying 585 trying ~585 trying 586 trying ~586 trying 587 trying ~587 trying 588 trying ~588 trying 589 trying ~589 trying 590 trying ~590 trying 591 trying ~591 trying 592 trying ~592 trying 593 trying ~593 trying 594 trying ~594 trying 595 trying ~595 trying 596 trying ~596 trying 597 trying ~597 trying 598 trying ~598 trying 599 trying ~599 trying 600 trying ~600 trying 601 trying ~601 trying 602 trying ~602 trying 603 trying ~603 trying 604 trying ~604 trying 605 trying ~605 trying 606 trying ~606 trying 607 trying ~607 trying 608 trying ~608 trying 609 trying ~609 trying 610 trying ~610 trying 611 trying ~611 trying 612 trying ~612 trying 613 trying ~613 trying 614 trying ~614 trying 615 trying ~615 trying 616 trying ~616 trying 617 trying ~617 trying 618 trying ~618 trying 619 trying ~619 trying 620 trying ~620 trying 621 trying ~621 trying 622 trying ~622 trying 623 trying ~623 trying 624 trying ~624 trying 625 trying ~625 trying 626 trying ~626 trying 627 trying ~627 trying 628 trying ~628 trying 629 trying ~629 trying 630 trying ~630 trying 631 trying ~631 trying 632 trying ~632 trying 633 trying ~633 trying 634 trying ~634 trying 635 trying ~635 trying 636 trying ~636 trying 637 trying ~637 trying 638 trying ~638 trying 639 trying ~639 trying 640 trying ~640 trying 641 trying ~641 trying 642 trying ~642 trying 643 trying ~643 trying 644 trying ~644 trying 645 trying ~645 trying 646 trying ~646 trying 647 trying ~647 trying 648 trying ~648 trying 649 trying ~649 trying 650 trying ~650 trying 651 trying ~651 trying 652 trying ~652 trying 653 trying ~653 trying 654 trying ~654 trying 655 trying ~655 trying 656 trying ~656 trying 657 trying ~657 trying 658 trying ~658 trying 659 trying ~659 trying 660 trying ~660 trying 661 trying ~661 trying 662 trying ~662 trying 663 trying ~663 trying 664 trying ~664 trying 665 trying ~665 trying 666 trying ~666 trying 667 trying ~667 trying 668 trying ~668 trying 669 trying ~669 trying 670 trying ~670 trying 671 trying ~671 trying 672 trying ~672 trying 673 trying ~673 trying 674 trying ~674 trying 675 trying ~675 trying 676 trying ~676 trying 677 trying ~677 trying 678 trying ~678 trying 679 trying ~679 trying 680 trying ~680 trying 681 trying ~681 trying 682 trying ~682 trying 683 trying ~683 trying 684 trying ~684 trying 685 trying ~685 trying 686 trying ~686 trying 687 trying ~687 trying 688 trying ~688 trying 689 trying ~689 trying 690 trying ~690 trying 691 trying ~691 trying 692 trying ~692 trying 693 trying ~693 trying 694 trying ~694 trying 695 trying ~695 trying 696 trying ~696 trying 697 trying ~697 trying 698 trying ~698 trying 699 trying ~699 trying 700 trying ~700 trying 701 trying ~701 trying 702 trying ~702 trying 703 trying ~703 trying 704 trying ~704 trying 705 trying ~705 trying 706 trying ~706 trying 707 trying ~707 trying 708 trying ~708 trying 709 trying ~709 trying 710 trying ~710 trying 711 trying ~711 trying 712 trying ~712 trying 713 trying ~713 trying 714 trying ~714 trying 715 trying ~715 trying 716 trying ~716 trying 717 trying ~717 trying 718 trying ~718 trying 719 trying ~719 trying 720 trying ~720 trying 721 trying ~721 trying 722 trying ~722 trying 723 trying ~723 trying 724 trying ~724 trying 725 trying ~725 trying 726 trying ~726 trying 727 trying ~727 trying 728 trying ~728 trying 729 trying ~729 trying 730 trying ~730 trying 731 trying ~731 trying 732 trying ~732 trying 733 trying ~733 trying 734 trying ~734 trying 735 trying ~735 trying 736 trying ~736 trying 737 trying ~737 trying 738 trying ~738 trying 739 trying ~739 trying 740 trying ~740 trying 741 trying ~741 trying 742 trying ~742 trying 743 trying ~743 trying 744 trying ~744 trying 745 trying ~745 trying 746 trying ~746 trying 747 trying ~747 trying 748 trying ~748 trying 749 trying ~749 trying 750 trying ~750 trying 751 trying ~751 trying 752 trying ~752 trying 753 trying ~753 trying 754 trying ~754 trying 755 trying ~755 trying 756 trying ~756 trying 757 trying ~757 trying 758 trying ~758 trying 759 trying ~759 trying 760 trying ~760 trying 761 trying ~761 trying 762 trying ~762 trying 763 trying ~763 trying 764 trying ~764 trying 765 trying ~765 trying 766 trying ~766 trying 767 trying ~767 trying 768 trying ~768 trying 769 trying ~769 trying 770 trying ~770 trying 771 trying ~771 trying 772 trying ~772 trying 773 trying ~773 trying 774 trying ~774 trying 775 trying ~775 trying 776 trying ~776 trying 777 trying ~777 trying 778 trying ~778 trying 779 trying ~779 trying 780 trying ~780 trying 781 trying ~781 trying 782 trying ~782 trying 783 trying ~783 trying 784 trying ~784 trying 785 trying ~785 trying 786 trying ~786 trying 787 trying ~787 trying 788 trying ~788 trying 789 trying ~789 trying 790 trying ~790 trying 791 trying ~791 trying 792 trying ~792 trying 793 trying ~793 trying 794 trying ~794 trying 795 trying ~795 trying 796 trying ~796 trying 797 trying ~797 trying 798 trying ~798 trying 799 trying ~799 trying 800 trying ~800 trying 801 trying ~801 trying 802 trying ~802 trying 803 trying ~803 trying 804 trying ~804 trying 805 trying ~805 trying 806 trying ~806 trying 807 trying ~807 trying 808 trying ~808 trying 809 trying ~809 trying 810 trying ~810 trying 811 trying ~811 trying 812 trying ~812 trying 813 trying ~813 trying 814 trying ~814 trying 815 trying ~815 trying 816 trying ~816 trying 817 trying ~817 trying 818 trying ~818 trying 819 trying ~819 trying 820 trying ~820 trying 821 trying ~821 trying 822 trying ~822 trying 823 trying ~823 trying 824 trying ~824 trying 825 trying ~825 trying 826 trying ~826 trying 827 trying ~827 trying 828 trying ~828 trying 829 trying ~829 trying 830 trying ~830 trying 831 trying ~831 trying 832 trying ~832 trying 833 trying ~833 trying 834 trying ~834 trying 835 trying ~835 trying 836 trying ~836 trying 837 trying ~837 trying 838 trying ~838 trying 839 trying ~839 trying 840 trying ~840 trying 841 trying ~841 trying 842 trying ~842 trying 843 trying ~843 trying 844 trying ~844 trying 845 trying ~845 trying 846 trying ~846 trying 847 trying ~847 trying 848 trying ~848 trying 849 trying ~849 trying 850 trying ~850 trying 851 trying ~851 trying 852 trying ~852 trying 853 trying ~853 trying 854 trying ~854 trying 855 trying ~855 trying 856 trying ~856 trying 857 trying ~857 trying 858 trying ~858 trying 859 trying ~859 trying 860 trying ~860 trying 861 trying ~861 trying 862 trying ~862 trying 863 trying ~863 trying 864 trying ~864 trying 865 trying ~865 trying 866 trying ~866 trying 867 trying ~867 trying 868 trying ~868 trying 869 trying ~869 trying 870 trying ~870 trying 871 trying ~871 trying 872 trying ~872 trying 873 trying ~873 trying 874 trying ~874 trying 875 trying ~875 trying 876 trying ~876 trying 877 trying ~877 trying 878 trying ~878 trying 879 trying ~879 trying 880 trying ~880 trying 881 trying ~881 trying 882 trying ~882 trying 883 trying ~883 trying 884 trying ~884 trying 885 trying ~885 trying 886 trying ~886 trying 887 trying ~887 trying 888 trying ~888 trying 889 trying ~889 trying 890 trying ~890 trying 891 trying ~891 trying 892 trying ~892 trying 893 trying ~893 trying 894 trying ~894 trying 895 trying ~895 trying 896 trying ~896 trying 897 trying ~897 trying 898 trying ~898 trying 899 trying ~899 trying 900 trying ~900 trying 901 trying ~901 trying 902 trying ~902 trying 903 trying ~903 trying 904 trying ~904 trying 905 trying ~905 trying 906 trying ~906 trying 907 trying ~907 trying 908 trying ~908 trying 909 trying ~909 trying 910 trying ~910 trying 911 trying ~911 trying 912 trying ~912 trying 913 trying ~913 trying 914 trying ~914 trying 915 trying ~915 trying 916 trying ~916 trying 917 trying ~917 trying 918 trying ~918 trying 919 trying ~919 trying 920 trying ~920 trying 921 trying ~921 trying 922 trying ~922 trying 923 trying ~923 trying 924 trying ~924 trying 925 trying ~925 trying 926 trying ~926 trying 927 trying ~927 trying 928 trying ~928 trying 929 trying ~929 trying 930 trying ~930 trying 931 trying ~931 trying 932 trying ~932 trying 933 trying ~933 trying 934 trying ~934 trying 935 trying ~935 trying 936 trying ~936 trying 937 trying ~937 trying 938 trying ~938 trying 939 trying ~939 trying 940 trying ~940 trying 941 trying ~941 trying 942 trying ~942 trying 943 trying ~943 trying 944 trying ~944 trying 945 trying ~945 trying 946 trying ~946 trying 947 trying ~947 trying 948 trying ~948 trying 949 trying ~949 trying 950 trying ~950 trying 951 trying ~951 trying 952 trying ~952 trying 953 trying ~953 trying 954 trying ~954 trying 955 trying ~955 trying 956 trying ~956 trying 957 trying ~957 trying 958 trying ~958 trying 959 trying ~959 trying 960 trying ~960 trying 961 trying ~961 trying 962 trying ~962 trying 963 trying ~963 trying 964 trying ~964 trying 965 trying ~965 trying 966 trying ~966 trying 967 trying ~967 trying 968 trying ~968 trying 969 trying ~969 trying 970 trying ~970 trying 971 trying ~971 trying 972 trying ~972 trying 973 trying ~973 trying 974 trying ~974 trying 975 trying ~975 trying 976 trying ~976 trying 977 trying ~977 trying 978 trying ~978 trying 979 trying ~979 trying 980 trying ~980 trying 981 trying ~981 trying 982 trying ~982 trying 983 trying ~983 trying 984 trying ~984 trying 985 trying ~985 trying 986 trying ~986 trying 987 trying ~987 trying 988 trying ~988 trying 989 trying ~989 trying 990 trying ~990 trying 991 trying ~991 trying 992 trying ~992 trying 993 trying ~993 trying 994 trying ~994 trying 995 trying ~995 trying 996 trying ~996 trying 997 trying ~997 trying 998 trying ~998 trying 999 trying ~999 trying 1073740824 trying ~1073740824 trying 1073740825 trying ~1073740825 trying 1073740826 trying ~1073740826 trying 1073740827 trying ~1073740827 trying 1073740828 trying ~1073740828 trying 1073740829 trying ~1073740829 trying 1073740830 trying ~1073740830 trying 1073740831 trying ~1073740831 trying 1073740832 trying ~1073740832 trying 1073740833 trying ~1073740833 trying 1073740834 trying ~1073740834 trying 1073740835 trying ~1073740835 trying 1073740836 trying ~1073740836 trying 1073740837 trying ~1073740837 trying 1073740838 trying ~1073740838 trying 1073740839 trying ~1073740839 trying 1073740840 trying ~1073740840 trying 1073740841 trying ~1073740841 trying 1073740842 trying ~1073740842 trying 1073740843 trying ~1073740843 trying 1073740844 trying ~1073740844 trying 1073740845 trying ~1073740845 trying 1073740846 trying ~1073740846 trying 1073740847 trying ~1073740847 trying 1073740848 trying ~1073740848 trying 1073740849 trying ~1073740849 trying 1073740850 trying ~1073740850 trying 1073740851 trying ~1073740851 trying 1073740852 trying ~1073740852 trying 1073740853 trying ~1073740853 trying 1073740854 trying ~1073740854 trying 1073740855 trying ~1073740855 trying 1073740856 trying ~1073740856 trying 1073740857 trying ~1073740857 trying 1073740858 trying ~1073740858 trying 1073740859 trying ~1073740859 trying 1073740860 trying ~1073740860 trying 1073740861 trying ~1073740861 trying 1073740862 trying ~1073740862 trying 1073740863 trying ~1073740863 trying 1073740864 trying ~1073740864 trying 1073740865 trying ~1073740865 trying 1073740866 trying ~1073740866 trying 1073740867 trying ~1073740867 trying 1073740868 trying ~1073740868 trying 1073740869 trying ~1073740869 trying 1073740870 trying ~1073740870 trying 1073740871 trying ~1073740871 trying 1073740872 trying ~1073740872 trying 1073740873 trying ~1073740873 trying 1073740874 trying ~1073740874 trying 1073740875 trying ~1073740875 trying 1073740876 trying ~1073740876 trying 1073740877 trying ~1073740877 trying 1073740878 trying ~1073740878 trying 1073740879 trying ~1073740879 trying 1073740880 trying ~1073740880 trying 1073740881 trying ~1073740881 trying 1073740882 trying ~1073740882 trying 1073740883 trying ~1073740883 trying 1073740884 trying ~1073740884 trying 1073740885 trying ~1073740885 trying 1073740886 trying ~1073740886 trying 1073740887 trying ~1073740887 trying 1073740888 trying ~1073740888 trying 1073740889 trying ~1073740889 trying 1073740890 trying ~1073740890 trying 1073740891 trying ~1073740891 trying 1073740892 trying ~1073740892 trying 1073740893 trying ~1073740893 trying 1073740894 trying ~1073740894 trying 1073740895 trying ~1073740895 trying 1073740896 trying ~1073740896 trying 1073740897 trying ~1073740897 trying 1073740898 trying ~1073740898 trying 1073740899 trying ~1073740899 trying 1073740900 trying ~1073740900 trying 1073740901 trying ~1073740901 trying 1073740902 trying ~1073740902 trying 1073740903 trying ~1073740903 trying 1073740904 trying ~1073740904 trying 1073740905 trying ~1073740905 trying 1073740906 trying ~1073740906 trying 1073740907 trying ~1073740907 trying 1073740908 trying ~1073740908 trying 1073740909 trying ~1073740909 trying 1073740910 trying ~1073740910 trying 1073740911 trying ~1073740911 trying 1073740912 trying ~1073740912 trying 1073740913 trying ~1073740913 trying 1073740914 trying ~1073740914 trying 1073740915 trying ~1073740915 trying 1073740916 trying ~1073740916 trying 1073740917 trying ~1073740917 trying 1073740918 trying ~1073740918 trying 1073740919 trying ~1073740919 trying 1073740920 trying ~1073740920 trying 1073740921 trying ~1073740921 trying 1073740922 trying ~1073740922 trying 1073740923 trying ~1073740923 trying 1073740924 trying ~1073740924 trying 1073740925 trying ~1073740925 trying 1073740926 trying ~1073740926 trying 1073740927 trying ~1073740927 trying 1073740928 trying ~1073740928 trying 1073740929 trying ~1073740929 trying 1073740930 trying ~1073740930 trying 1073740931 trying ~1073740931 trying 1073740932 trying ~1073740932 trying 1073740933 trying ~1073740933 trying 1073740934 trying ~1073740934 trying 1073740935 trying ~1073740935 trying 1073740936 trying ~1073740936 trying 1073740937 trying ~1073740937 trying 1073740938 trying ~1073740938 trying 1073740939 trying ~1073740939 trying 1073740940 trying ~1073740940 trying 1073740941 trying ~1073740941 trying 1073740942 trying ~1073740942 trying 1073740943 trying ~1073740943 trying 1073740944 trying ~1073740944 trying 1073740945 trying ~1073740945 trying 1073740946 trying ~1073740946 trying 1073740947 trying ~1073740947 trying 1073740948 trying ~1073740948 trying 1073740949 trying ~1073740949 trying 1073740950 trying ~1073740950 trying 1073740951 trying ~1073740951 trying 1073740952 trying ~1073740952 trying 1073740953 trying ~1073740953 trying 1073740954 trying ~1073740954 trying 1073740955 trying ~1073740955 trying 1073740956 trying ~1073740956 trying 1073740957 trying ~1073740957 trying 1073740958 trying ~1073740958 trying 1073740959 trying ~1073740959 trying 1073740960 trying ~1073740960 trying 1073740961 trying ~1073740961 trying 1073740962 trying ~1073740962 trying 1073740963 trying ~1073740963 trying 1073740964 trying ~1073740964 trying 1073740965 trying ~1073740965 trying 1073740966 trying ~1073740966 trying 1073740967 trying ~1073740967 trying 1073740968 trying ~1073740968 trying 1073740969 trying ~1073740969 trying 1073740970 trying ~1073740970 trying 1073740971 trying ~1073740971 trying 1073740972 trying ~1073740972 trying 1073740973 trying ~1073740973 trying 1073740974 trying ~1073740974 trying 1073740975 trying ~1073740975 trying 1073740976 trying ~1073740976 trying 1073740977 trying ~1073740977 trying 1073740978 trying ~1073740978 trying 1073740979 trying ~1073740979 trying 1073740980 trying ~1073740980 trying 1073740981 trying ~1073740981 trying 1073740982 trying ~1073740982 trying 1073740983 trying ~1073740983 trying 1073740984 trying ~1073740984 trying 1073740985 trying ~1073740985 trying 1073740986 trying ~1073740986 trying 1073740987 trying ~1073740987 trying 1073740988 trying ~1073740988 trying 1073740989 trying ~1073740989 trying 1073740990 trying ~1073740990 trying 1073740991 trying ~1073740991 trying 1073740992 trying ~1073740992 trying 1073740993 trying ~1073740993 trying 1073740994 trying ~1073740994 trying 1073740995 trying ~1073740995 trying 1073740996 trying ~1073740996 trying 1073740997 trying ~1073740997 trying 1073740998 trying ~1073740998 trying 1073740999 trying ~1073740999 trying 1073741000 trying ~1073741000 trying 1073741001 trying ~1073741001 trying 1073741002 trying ~1073741002 trying 1073741003 trying ~1073741003 trying 1073741004 trying ~1073741004 trying 1073741005 trying ~1073741005 trying 1073741006 trying ~1073741006 trying 1073741007 trying ~1073741007 trying 1073741008 trying ~1073741008 trying 1073741009 trying ~1073741009 trying 1073741010 trying ~1073741010 trying 1073741011 trying ~1073741011 trying 1073741012 trying ~1073741012 trying 1073741013 trying ~1073741013 trying 1073741014 trying ~1073741014 trying 1073741015 trying ~1073741015 trying 1073741016 trying ~1073741016 trying 1073741017 trying ~1073741017 trying 1073741018 trying ~1073741018 trying 1073741019 trying ~1073741019 trying 1073741020 trying ~1073741020 trying 1073741021 trying ~1073741021 trying 1073741022 trying ~1073741022 trying 1073741023 trying ~1073741023 trying 1073741024 trying ~1073741024 trying 1073741025 trying ~1073741025 trying 1073741026 trying ~1073741026 trying 1073741027 trying ~1073741027 trying 1073741028 trying ~1073741028 trying 1073741029 trying ~1073741029 trying 1073741030 trying ~1073741030 trying 1073741031 trying ~1073741031 trying 1073741032 trying ~1073741032 trying 1073741033 trying ~1073741033 trying 1073741034 trying ~1073741034 trying 1073741035 trying ~1073741035 trying 1073741036 trying ~1073741036 trying 1073741037 trying ~1073741037 trying 1073741038 trying ~1073741038 trying 1073741039 trying ~1073741039 trying 1073741040 trying ~1073741040 trying 1073741041 trying ~1073741041 trying 1073741042 trying ~1073741042 trying 1073741043 trying ~1073741043 trying 1073741044 trying ~1073741044 trying 1073741045 trying ~1073741045 trying 1073741046 trying ~1073741046 trying 1073741047 trying ~1073741047 trying 1073741048 trying ~1073741048 trying 1073741049 trying ~1073741049 trying 1073741050 trying ~1073741050 trying 1073741051 trying ~1073741051 trying 1073741052 trying ~1073741052 trying 1073741053 trying ~1073741053 trying 1073741054 trying ~1073741054 trying 1073741055 trying ~1073741055 trying 1073741056 trying ~1073741056 trying 1073741057 trying ~1073741057 trying 1073741058 trying ~1073741058 trying 1073741059 trying ~1073741059 trying 1073741060 trying ~1073741060 trying 1073741061 trying ~1073741061 trying 1073741062 trying ~1073741062 trying 1073741063 trying ~1073741063 trying 1073741064 trying ~1073741064 trying 1073741065 trying ~1073741065 trying 1073741066 trying ~1073741066 trying 1073741067 trying ~1073741067 trying 1073741068 trying ~1073741068 trying 1073741069 trying ~1073741069 trying 1073741070 trying ~1073741070 trying 1073741071 trying ~1073741071 trying 1073741072 trying ~1073741072 trying 1073741073 trying ~1073741073 trying 1073741074 trying ~1073741074 trying 1073741075 trying ~1073741075 trying 1073741076 trying ~1073741076 trying 1073741077 trying ~1073741077 trying 1073741078 trying ~1073741078 trying 1073741079 trying ~1073741079 trying 1073741080 trying ~1073741080 trying 1073741081 trying ~1073741081 trying 1073741082 trying ~1073741082 trying 1073741083 trying ~1073741083 trying 1073741084 trying ~1073741084 trying 1073741085 trying ~1073741085 trying 1073741086 trying ~1073741086 trying 1073741087 trying ~1073741087 trying 1073741088 trying ~1073741088 trying 1073741089 trying ~1073741089 trying 1073741090 trying ~1073741090 trying 1073741091 trying ~1073741091 trying 1073741092 trying ~1073741092 trying 1073741093 trying ~1073741093 trying 1073741094 trying ~1073741094 trying 1073741095 trying ~1073741095 trying 1073741096 trying ~1073741096 trying 1073741097 trying ~1073741097 trying 1073741098 trying ~1073741098 trying 1073741099 trying ~1073741099 trying 1073741100 trying ~1073741100 trying 1073741101 trying ~1073741101 trying 1073741102 trying ~1073741102 trying 1073741103 trying ~1073741103 trying 1073741104 trying ~1073741104 trying 1073741105 trying ~1073741105 trying 1073741106 trying ~1073741106 trying 1073741107 trying ~1073741107 trying 1073741108 trying ~1073741108 trying 1073741109 trying ~1073741109 trying 1073741110 trying ~1073741110 trying 1073741111 trying ~1073741111 trying 1073741112 trying ~1073741112 trying 1073741113 trying ~1073741113 trying 1073741114 trying ~1073741114 trying 1073741115 trying ~1073741115 trying 1073741116 trying ~1073741116 trying 1073741117 trying ~1073741117 trying 1073741118 trying ~1073741118 trying 1073741119 trying ~1073741119 trying 1073741120 trying ~1073741120 trying 1073741121 trying ~1073741121 trying 1073741122 trying ~1073741122 trying 1073741123 trying ~1073741123 trying 1073741124 trying ~1073741124 trying 1073741125 trying ~1073741125 trying 1073741126 trying ~1073741126 trying 1073741127 trying ~1073741127 trying 1073741128 trying ~1073741128 trying 1073741129 trying ~1073741129 trying 1073741130 trying ~1073741130 trying 1073741131 trying ~1073741131 trying 1073741132 trying ~1073741132 trying 1073741133 trying ~1073741133 trying 1073741134 trying ~1073741134 trying 1073741135 trying ~1073741135 trying 1073741136 trying ~1073741136 trying 1073741137 trying ~1073741137 trying 1073741138 trying ~1073741138 trying 1073741139 trying ~1073741139 trying 1073741140 trying ~1073741140 trying 1073741141 trying ~1073741141 trying 1073741142 trying ~1073741142 trying 1073741143 trying ~1073741143 trying 1073741144 trying ~1073741144 trying 1073741145 trying ~1073741145 trying 1073741146 trying ~1073741146 trying 1073741147 trying ~1073741147 trying 1073741148 trying ~1073741148 trying 1073741149 trying ~1073741149 trying 1073741150 trying ~1073741150 trying 1073741151 trying ~1073741151 trying 1073741152 trying ~1073741152 trying 1073741153 trying ~1073741153 trying 1073741154 trying ~1073741154 trying 1073741155 trying ~1073741155 trying 1073741156 trying ~1073741156 trying 1073741157 trying ~1073741157 trying 1073741158 trying ~1073741158 trying 1073741159 trying ~1073741159 trying 1073741160 trying ~1073741160 trying 1073741161 trying ~1073741161 trying 1073741162 trying ~1073741162 trying 1073741163 trying ~1073741163 trying 1073741164 trying ~1073741164 trying 1073741165 trying ~1073741165 trying 1073741166 trying ~1073741166 trying 1073741167 trying ~1073741167 trying 1073741168 trying ~1073741168 trying 1073741169 trying ~1073741169 trying 1073741170 trying ~1073741170 trying 1073741171 trying ~1073741171 trying 1073741172 trying ~1073741172 trying 1073741173 trying ~1073741173 trying 1073741174 trying ~1073741174 trying 1073741175 trying ~1073741175 trying 1073741176 trying ~1073741176 trying 1073741177 trying ~1073741177 trying 1073741178 trying ~1073741178 trying 1073741179 trying ~1073741179 trying 1073741180 trying ~1073741180 trying 1073741181 trying ~1073741181 trying 1073741182 trying ~1073741182 trying 1073741183 trying ~1073741183 trying 1073741184 trying ~1073741184 trying 1073741185 trying ~1073741185 trying 1073741186 trying ~1073741186 trying 1073741187 trying ~1073741187 trying 1073741188 trying ~1073741188 trying 1073741189 trying ~1073741189 trying 1073741190 trying ~1073741190 trying 1073741191 trying ~1073741191 trying 1073741192 trying ~1073741192 trying 1073741193 trying ~1073741193 trying 1073741194 trying ~1073741194 trying 1073741195 trying ~1073741195 trying 1073741196 trying ~1073741196 trying 1073741197 trying ~1073741197 trying 1073741198 trying ~1073741198 trying 1073741199 trying ~1073741199 trying 1073741200 trying ~1073741200 trying 1073741201 trying ~1073741201 trying 1073741202 trying ~1073741202 trying 1073741203 trying ~1073741203 trying 1073741204 trying ~1073741204 trying 1073741205 trying ~1073741205 trying 1073741206 trying ~1073741206 trying 1073741207 trying ~1073741207 trying 1073741208 trying ~1073741208 trying 1073741209 trying ~1073741209 trying 1073741210 trying ~1073741210 trying 1073741211 trying ~1073741211 trying 1073741212 trying ~1073741212 trying 1073741213 trying ~1073741213 trying 1073741214 trying ~1073741214 trying 1073741215 trying ~1073741215 trying 1073741216 trying ~1073741216 trying 1073741217 trying ~1073741217 trying 1073741218 trying ~1073741218 trying 1073741219 trying ~1073741219 trying 1073741220 trying ~1073741220 trying 1073741221 trying ~1073741221 trying 1073741222 trying ~1073741222 trying 1073741223 trying ~1073741223 trying 1073741224 trying ~1073741224 trying 1073741225 trying ~1073741225 trying 1073741226 trying ~1073741226 trying 1073741227 trying ~1073741227 trying 1073741228 trying ~1073741228 trying 1073741229 trying ~1073741229 trying 1073741230 trying ~1073741230 trying 1073741231 trying ~1073741231 trying 1073741232 trying ~1073741232 trying 1073741233 trying ~1073741233 trying 1073741234 trying ~1073741234 trying 1073741235 trying ~1073741235 trying 1073741236 trying ~1073741236 trying 1073741237 trying ~1073741237 trying 1073741238 trying ~1073741238 trying 1073741239 trying ~1073741239 trying 1073741240 trying ~1073741240 trying 1073741241 trying ~1073741241 trying 1073741242 trying ~1073741242 trying 1073741243 trying ~1073741243 trying 1073741244 trying ~1073741244 trying 1073741245 trying ~1073741245 trying 1073741246 trying ~1073741246 trying 1073741247 trying ~1073741247 trying 1073741248 trying ~1073741248 trying 1073741249 trying ~1073741249 trying 1073741250 trying ~1073741250 trying 1073741251 trying ~1073741251 trying 1073741252 trying ~1073741252 trying 1073741253 trying ~1073741253 trying 1073741254 trying ~1073741254 trying 1073741255 trying ~1073741255 trying 1073741256 trying ~1073741256 trying 1073741257 trying ~1073741257 trying 1073741258 trying ~1073741258 trying 1073741259 trying ~1073741259 trying 1073741260 trying ~1073741260 trying 1073741261 trying ~1073741261 trying 1073741262 trying ~1073741262 trying 1073741263 trying ~1073741263 trying 1073741264 trying ~1073741264 trying 1073741265 trying ~1073741265 trying 1073741266 trying ~1073741266 trying 1073741267 trying ~1073741267 trying 1073741268 trying ~1073741268 trying 1073741269 trying ~1073741269 trying 1073741270 trying ~1073741270 trying 1073741271 trying ~1073741271 trying 1073741272 trying ~1073741272 trying 1073741273 trying ~1073741273 trying 1073741274 trying ~1073741274 trying 1073741275 trying ~1073741275 trying 1073741276 trying ~1073741276 trying 1073741277 trying ~1073741277 trying 1073741278 trying ~1073741278 trying 1073741279 trying ~1073741279 trying 1073741280 trying ~1073741280 trying 1073741281 trying ~1073741281 trying 1073741282 trying ~1073741282 trying 1073741283 trying ~1073741283 trying 1073741284 trying ~1073741284 trying 1073741285 trying ~1073741285 trying 1073741286 trying ~1073741286 trying 1073741287 trying ~1073741287 trying 1073741288 trying ~1073741288 trying 1073741289 trying ~1073741289 trying 1073741290 trying ~1073741290 trying 1073741291 trying ~1073741291 trying 1073741292 trying ~1073741292 trying 1073741293 trying ~1073741293 trying 1073741294 trying ~1073741294 trying 1073741295 trying ~1073741295 trying 1073741296 trying ~1073741296 trying 1073741297 trying ~1073741297 trying 1073741298 trying ~1073741298 trying 1073741299 trying ~1073741299 trying 1073741300 trying ~1073741300 trying 1073741301 trying ~1073741301 trying 1073741302 trying ~1073741302 trying 1073741303 trying ~1073741303 trying 1073741304 trying ~1073741304 trying 1073741305 trying ~1073741305 trying 1073741306 trying ~1073741306 trying 1073741307 trying ~1073741307 trying 1073741308 trying ~1073741308 trying 1073741309 trying ~1073741309 trying 1073741310 trying ~1073741310 trying 1073741311 trying ~1073741311 trying 1073741312 trying ~1073741312 trying 1073741313 trying ~1073741313 trying 1073741314 trying ~1073741314 trying 1073741315 trying ~1073741315 trying 1073741316 trying ~1073741316 trying 1073741317 trying ~1073741317 trying 1073741318 trying ~1073741318 trying 1073741319 trying ~1073741319 trying 1073741320 trying ~1073741320 trying 1073741321 trying ~1073741321 trying 1073741322 trying ~1073741322 trying 1073741323 trying ~1073741323 trying 1073741324 trying ~1073741324 trying 1073741325 trying ~1073741325 trying 1073741326 trying ~1073741326 trying 1073741327 trying ~1073741327 trying 1073741328 trying ~1073741328 trying 1073741329 trying ~1073741329 trying 1073741330 trying ~1073741330 trying 1073741331 trying ~1073741331 trying 1073741332 trying ~1073741332 trying 1073741333 trying ~1073741333 trying 1073741334 trying ~1073741334 trying 1073741335 trying ~1073741335 trying 1073741336 trying ~1073741336 trying 1073741337 trying ~1073741337 trying 1073741338 trying ~1073741338 trying 1073741339 trying ~1073741339 trying 1073741340 trying ~1073741340 trying 1073741341 trying ~1073741341 trying 1073741342 trying ~1073741342 trying 1073741343 trying ~1073741343 trying 1073741344 trying ~1073741344 trying 1073741345 trying ~1073741345 trying 1073741346 trying ~1073741346 trying 1073741347 trying ~1073741347 trying 1073741348 trying ~1073741348 trying 1073741349 trying ~1073741349 trying 1073741350 trying ~1073741350 trying 1073741351 trying ~1073741351 trying 1073741352 trying ~1073741352 trying 1073741353 trying ~1073741353 trying 1073741354 trying ~1073741354 trying 1073741355 trying ~1073741355 trying 1073741356 trying ~1073741356 trying 1073741357 trying ~1073741357 trying 1073741358 trying ~1073741358 trying 1073741359 trying ~1073741359 trying 1073741360 trying ~1073741360 trying 1073741361 trying ~1073741361 trying 1073741362 trying ~1073741362 trying 1073741363 trying ~1073741363 trying 1073741364 trying ~1073741364 trying 1073741365 trying ~1073741365 trying 1073741366 trying ~1073741366 trying 1073741367 trying ~1073741367 trying 1073741368 trying ~1073741368 trying 1073741369 trying ~1073741369 trying 1073741370 trying ~1073741370 trying 1073741371 trying ~1073741371 trying 1073741372 trying ~1073741372 trying 1073741373 trying ~1073741373 trying 1073741374 trying ~1073741374 trying 1073741375 trying ~1073741375 trying 1073741376 trying ~1073741376 trying 1073741377 trying ~1073741377 trying 1073741378 trying ~1073741378 trying 1073741379 trying ~1073741379 trying 1073741380 trying ~1073741380 trying 1073741381 trying ~1073741381 trying 1073741382 trying ~1073741382 trying 1073741383 trying ~1073741383 trying 1073741384 trying ~1073741384 trying 1073741385 trying ~1073741385 trying 1073741386 trying ~1073741386 trying 1073741387 trying ~1073741387 trying 1073741388 trying ~1073741388 trying 1073741389 trying ~1073741389 trying 1073741390 trying ~1073741390 trying 1073741391 trying ~1073741391 trying 1073741392 trying ~1073741392 trying 1073741393 trying ~1073741393 trying 1073741394 trying ~1073741394 trying 1073741395 trying ~1073741395 trying 1073741396 trying ~1073741396 trying 1073741397 trying ~1073741397 trying 1073741398 trying ~1073741398 trying 1073741399 trying ~1073741399 trying 1073741400 trying ~1073741400 trying 1073741401 trying ~1073741401 trying 1073741402 trying ~1073741402 trying 1073741403 trying ~1073741403 trying 1073741404 trying ~1073741404 trying 1073741405 trying ~1073741405 trying 1073741406 trying ~1073741406 trying 1073741407 trying ~1073741407 trying 1073741408 trying ~1073741408 trying 1073741409 trying ~1073741409 trying 1073741410 trying ~1073741410 trying 1073741411 trying ~1073741411 trying 1073741412 trying ~1073741412 trying 1073741413 trying ~1073741413 trying 1073741414 trying ~1073741414 trying 1073741415 trying ~1073741415 trying 1073741416 trying ~1073741416 trying 1073741417 trying ~1073741417 trying 1073741418 trying ~1073741418 trying 1073741419 trying ~1073741419 trying 1073741420 trying ~1073741420 trying 1073741421 trying ~1073741421 trying 1073741422 trying ~1073741422 trying 1073741423 trying ~1073741423 trying 1073741424 trying ~1073741424 trying 1073741425 trying ~1073741425 trying 1073741426 trying ~1073741426 trying 1073741427 trying ~1073741427 trying 1073741428 trying ~1073741428 trying 1073741429 trying ~1073741429 trying 1073741430 trying ~1073741430 trying 1073741431 trying ~1073741431 trying 1073741432 trying ~1073741432 trying 1073741433 trying ~1073741433 trying 1073741434 trying ~1073741434 trying 1073741435 trying ~1073741435 trying 1073741436 trying ~1073741436 trying 1073741437 trying ~1073741437 trying 1073741438 trying ~1073741438 trying 1073741439 trying ~1073741439 trying 1073741440 trying ~1073741440 trying 1073741441 trying ~1073741441 trying 1073741442 trying ~1073741442 trying 1073741443 trying ~1073741443 trying 1073741444 trying ~1073741444 trying 1073741445 trying ~1073741445 trying 1073741446 trying ~1073741446 trying 1073741447 trying ~1073741447 trying 1073741448 trying ~1073741448 trying 1073741449 trying ~1073741449 trying 1073741450 trying ~1073741450 trying 1073741451 trying ~1073741451 trying 1073741452 trying ~1073741452 trying 1073741453 trying ~1073741453 trying 1073741454 trying ~1073741454 trying 1073741455 trying ~1073741455 trying 1073741456 trying ~1073741456 trying 1073741457 trying ~1073741457 trying 1073741458 trying ~1073741458 trying 1073741459 trying ~1073741459 trying 1073741460 trying ~1073741460 trying 1073741461 trying ~1073741461 trying 1073741462 trying ~1073741462 trying 1073741463 trying ~1073741463 trying 1073741464 trying ~1073741464 trying 1073741465 trying ~1073741465 trying 1073741466 trying ~1073741466 trying 1073741467 trying ~1073741467 trying 1073741468 trying ~1073741468 trying 1073741469 trying ~1073741469 trying 1073741470 trying ~1073741470 trying 1073741471 trying ~1073741471 trying 1073741472 trying ~1073741472 trying 1073741473 trying ~1073741473 trying 1073741474 trying ~1073741474 trying 1073741475 trying ~1073741475 trying 1073741476 trying ~1073741476 trying 1073741477 trying ~1073741477 trying 1073741478 trying ~1073741478 trying 1073741479 trying ~1073741479 trying 1073741480 trying ~1073741480 trying 1073741481 trying ~1073741481 trying 1073741482 trying ~1073741482 trying 1073741483 trying ~1073741483 trying 1073741484 trying ~1073741484 trying 1073741485 trying ~1073741485 trying 1073741486 trying ~1073741486 trying 1073741487 trying ~1073741487 trying 1073741488 trying ~1073741488 trying 1073741489 trying ~1073741489 trying 1073741490 trying ~1073741490 trying 1073741491 trying ~1073741491 trying 1073741492 trying ~1073741492 trying 1073741493 trying ~1073741493 trying 1073741494 trying ~1073741494 trying 1073741495 trying ~1073741495 trying 1073741496 trying ~1073741496 trying 1073741497 trying ~1073741497 trying 1073741498 trying ~1073741498 trying 1073741499 trying ~1073741499 trying 1073741500 trying ~1073741500 trying 1073741501 trying ~1073741501 trying 1073741502 trying ~1073741502 trying 1073741503 trying ~1073741503 trying 1073741504 trying ~1073741504 trying 1073741505 trying ~1073741505 trying 1073741506 trying ~1073741506 trying 1073741507 trying ~1073741507 trying 1073741508 trying ~1073741508 trying 1073741509 trying ~1073741509 trying 1073741510 trying ~1073741510 trying 1073741511 trying ~1073741511 trying 1073741512 trying ~1073741512 trying 1073741513 trying ~1073741513 trying 1073741514 trying ~1073741514 trying 1073741515 trying ~1073741515 trying 1073741516 trying ~1073741516 trying 1073741517 trying ~1073741517 trying 1073741518 trying ~1073741518 trying 1073741519 trying ~1073741519 trying 1073741520 trying ~1073741520 trying 1073741521 trying ~1073741521 trying 1073741522 trying ~1073741522 trying 1073741523 trying ~1073741523 trying 1073741524 trying ~1073741524 trying 1073741525 trying ~1073741525 trying 1073741526 trying ~1073741526 trying 1073741527 trying ~1073741527 trying 1073741528 trying ~1073741528 trying 1073741529 trying ~1073741529 trying 1073741530 trying ~1073741530 trying 1073741531 trying ~1073741531 trying 1073741532 trying ~1073741532 trying 1073741533 trying ~1073741533 trying 1073741534 trying ~1073741534 trying 1073741535 trying ~1073741535 trying 1073741536 trying ~1073741536 trying 1073741537 trying ~1073741537 trying 1073741538 trying ~1073741538 trying 1073741539 trying ~1073741539 trying 1073741540 trying ~1073741540 trying 1073741541 trying ~1073741541 trying 1073741542 trying ~1073741542 trying 1073741543 trying ~1073741543 trying 1073741544 trying ~1073741544 trying 1073741545 trying ~1073741545 trying 1073741546 trying ~1073741546 trying 1073741547 trying ~1073741547 trying 1073741548 trying ~1073741548 trying 1073741549 trying ~1073741549 trying 1073741550 trying ~1073741550 trying 1073741551 trying ~1073741551 trying 1073741552 trying ~1073741552 trying 1073741553 trying ~1073741553 trying 1073741554 trying ~1073741554 trying 1073741555 trying ~1073741555 trying 1073741556 trying ~1073741556 trying 1073741557 trying ~1073741557 trying 1073741558 trying ~1073741558 trying 1073741559 trying ~1073741559 trying 1073741560 trying ~1073741560 trying 1073741561 trying ~1073741561 trying 1073741562 trying ~1073741562 trying 1073741563 trying ~1073741563 trying 1073741564 trying ~1073741564 trying 1073741565 trying ~1073741565 trying 1073741566 trying ~1073741566 trying 1073741567 trying ~1073741567 trying 1073741568 trying ~1073741568 trying 1073741569 trying ~1073741569 trying 1073741570 trying ~1073741570 trying 1073741571 trying ~1073741571 trying 1073741572 trying ~1073741572 trying 1073741573 trying ~1073741573 trying 1073741574 trying ~1073741574 trying 1073741575 trying ~1073741575 trying 1073741576 trying ~1073741576 trying 1073741577 trying ~1073741577 trying 1073741578 trying ~1073741578 trying 1073741579 trying ~1073741579 trying 1073741580 trying ~1073741580 trying 1073741581 trying ~1073741581 trying 1073741582 trying ~1073741582 trying 1073741583 trying ~1073741583 trying 1073741584 trying ~1073741584 trying 1073741585 trying ~1073741585 trying 1073741586 trying ~1073741586 trying 1073741587 trying ~1073741587 trying 1073741588 trying ~1073741588 trying 1073741589 trying ~1073741589 trying 1073741590 trying ~1073741590 trying 1073741591 trying ~1073741591 trying 1073741592 trying ~1073741592 trying 1073741593 trying ~1073741593 trying 1073741594 trying ~1073741594 trying 1073741595 trying ~1073741595 trying 1073741596 trying ~1073741596 trying 1073741597 trying ~1073741597 trying 1073741598 trying ~1073741598 trying 1073741599 trying ~1073741599 trying 1073741600 trying ~1073741600 trying 1073741601 trying ~1073741601 trying 1073741602 trying ~1073741602 trying 1073741603 trying ~1073741603 trying 1073741604 trying ~1073741604 trying 1073741605 trying ~1073741605 trying 1073741606 trying ~1073741606 trying 1073741607 trying ~1073741607 trying 1073741608 trying ~1073741608 trying 1073741609 trying ~1073741609 trying 1073741610 trying ~1073741610 trying 1073741611 trying ~1073741611 trying 1073741612 trying ~1073741612 trying 1073741613 trying ~1073741613 trying 1073741614 trying ~1073741614 trying 1073741615 trying ~1073741615 trying 1073741616 trying ~1073741616 trying 1073741617 trying ~1073741617 trying 1073741618 trying ~1073741618 trying 1073741619 trying ~1073741619 trying 1073741620 trying ~1073741620 trying 1073741621 trying ~1073741621 trying 1073741622 trying ~1073741622 trying 1073741623 trying ~1073741623 trying 1073741624 trying ~1073741624 trying 1073741625 trying ~1073741625 trying 1073741626 trying ~1073741626 trying 1073741627 trying ~1073741627 trying 1073741628 trying ~1073741628 trying 1073741629 trying ~1073741629 trying 1073741630 trying ~1073741630 trying 1073741631 trying ~1073741631 trying 1073741632 trying ~1073741632 trying 1073741633 trying ~1073741633 trying 1073741634 trying ~1073741634 trying 1073741635 trying ~1073741635 trying 1073741636 trying ~1073741636 trying 1073741637 trying ~1073741637 trying 1073741638 trying ~1073741638 trying 1073741639 trying ~1073741639 trying 1073741640 trying ~1073741640 trying 1073741641 trying ~1073741641 trying 1073741642 trying ~1073741642 trying 1073741643 trying ~1073741643 trying 1073741644 trying ~1073741644 trying 1073741645 trying ~1073741645 trying 1073741646 trying ~1073741646 trying 1073741647 trying ~1073741647 trying 1073741648 trying ~1073741648 trying 1073741649 trying ~1073741649 trying 1073741650 trying ~1073741650 trying 1073741651 trying ~1073741651 trying 1073741652 trying ~1073741652 trying 1073741653 trying ~1073741653 trying 1073741654 trying ~1073741654 trying 1073741655 trying ~1073741655 trying 1073741656 trying ~1073741656 trying 1073741657 trying ~1073741657 trying 1073741658 trying ~1073741658 trying 1073741659 trying ~1073741659 trying 1073741660 trying ~1073741660 trying 1073741661 trying ~1073741661 trying 1073741662 trying ~1073741662 trying 1073741663 trying ~1073741663 trying 1073741664 trying ~1073741664 trying 1073741665 trying ~1073741665 trying 1073741666 trying ~1073741666 trying 1073741667 trying ~1073741667 trying 1073741668 trying ~1073741668 trying 1073741669 trying ~1073741669 trying 1073741670 trying ~1073741670 trying 1073741671 trying ~1073741671 trying 1073741672 trying ~1073741672 trying 1073741673 trying ~1073741673 trying 1073741674 trying ~1073741674 trying 1073741675 trying ~1073741675 trying 1073741676 trying ~1073741676 trying 1073741677 trying ~1073741677 trying 1073741678 trying ~1073741678 trying 1073741679 trying ~1073741679 trying 1073741680 trying ~1073741680 trying 1073741681 trying ~1073741681 trying 1073741682 trying ~1073741682 trying 1073741683 trying ~1073741683 trying 1073741684 trying ~1073741684 trying 1073741685 trying ~1073741685 trying 1073741686 trying ~1073741686 trying 1073741687 trying ~1073741687 trying 1073741688 trying ~1073741688 trying 1073741689 trying ~1073741689 trying 1073741690 trying ~1073741690 trying 1073741691 trying ~1073741691 trying 1073741692 trying ~1073741692 trying 1073741693 trying ~1073741693 trying 1073741694 trying ~1073741694 trying 1073741695 trying ~1073741695 trying 1073741696 trying ~1073741696 trying 1073741697 trying ~1073741697 trying 1073741698 trying ~1073741698 trying 1073741699 trying ~1073741699 trying 1073741700 trying ~1073741700 trying 1073741701 trying ~1073741701 trying 1073741702 trying ~1073741702 trying 1073741703 trying ~1073741703 trying 1073741704 trying ~1073741704 trying 1073741705 trying ~1073741705 trying 1073741706 trying ~1073741706 trying 1073741707 trying ~1073741707 trying 1073741708 trying ~1073741708 trying 1073741709 trying ~1073741709 trying 1073741710 trying ~1073741710 trying 1073741711 trying ~1073741711 trying 1073741712 trying ~1073741712 trying 1073741713 trying ~1073741713 trying 1073741714 trying ~1073741714 trying 1073741715 trying ~1073741715 trying 1073741716 trying ~1073741716 trying 1073741717 trying ~1073741717 trying 1073741718 trying ~1073741718 trying 1073741719 trying ~1073741719 trying 1073741720 trying ~1073741720 trying 1073741721 trying ~1073741721 trying 1073741722 trying ~1073741722 trying 1073741723 trying ~1073741723 trying 1073741724 trying ~1073741724 trying 1073741725 trying ~1073741725 trying 1073741726 trying ~1073741726 trying 1073741727 trying ~1073741727 trying 1073741728 trying ~1073741728 trying 1073741729 trying ~1073741729 trying 1073741730 trying ~1073741730 trying 1073741731 trying ~1073741731 trying 1073741732 trying ~1073741732 trying 1073741733 trying ~1073741733 trying 1073741734 trying ~1073741734 trying 1073741735 trying ~1073741735 trying 1073741736 trying ~1073741736 trying 1073741737 trying ~1073741737 trying 1073741738 trying ~1073741738 trying 1073741739 trying ~1073741739 trying 1073741740 trying ~1073741740 trying 1073741741 trying ~1073741741 trying 1073741742 trying ~1073741742 trying 1073741743 trying ~1073741743 trying 1073741744 trying ~1073741744 trying 1073741745 trying ~1073741745 trying 1073741746 trying ~1073741746 trying 1073741747 trying ~1073741747 trying 1073741748 trying ~1073741748 trying 1073741749 trying ~1073741749 trying 1073741750 trying ~1073741750 trying 1073741751 trying ~1073741751 trying 1073741752 trying ~1073741752 trying 1073741753 trying ~1073741753 trying 1073741754 trying ~1073741754 trying 1073741755 trying ~1073741755 trying 1073741756 trying ~1073741756 trying 1073741757 trying ~1073741757 trying 1073741758 trying ~1073741758 trying 1073741759 trying ~1073741759 trying 1073741760 trying ~1073741760 trying 1073741761 trying ~1073741761 trying 1073741762 trying ~1073741762 trying 1073741763 trying ~1073741763 trying 1073741764 trying ~1073741764 trying 1073741765 trying ~1073741765 trying 1073741766 trying ~1073741766 trying 1073741767 trying ~1073741767 trying 1073741768 trying ~1073741768 trying 1073741769 trying ~1073741769 trying 1073741770 trying ~1073741770 trying 1073741771 trying ~1073741771 trying 1073741772 trying ~1073741772 trying 1073741773 trying ~1073741773 trying 1073741774 trying ~1073741774 trying 1073741775 trying ~1073741775 trying 1073741776 trying ~1073741776 trying 1073741777 trying ~1073741777 trying 1073741778 trying ~1073741778 trying 1073741779 trying ~1073741779 trying 1073741780 trying ~1073741780 trying 1073741781 trying ~1073741781 trying 1073741782 trying ~1073741782 trying 1073741783 trying ~1073741783 trying 1073741784 trying ~1073741784 trying 1073741785 trying ~1073741785 trying 1073741786 trying ~1073741786 trying 1073741787 trying ~1073741787 trying 1073741788 trying ~1073741788 trying 1073741789 trying ~1073741789 trying 1073741790 trying ~1073741790 trying 1073741791 trying ~1073741791 trying 1073741792 trying ~1073741792 trying 1073741793 trying ~1073741793 trying 1073741794 trying ~1073741794 trying 1073741795 trying ~1073741795 trying 1073741796 trying ~1073741796 trying 1073741797 trying ~1073741797 trying 1073741798 trying ~1073741798 trying 1073741799 trying ~1073741799 trying 1073741800 trying ~1073741800 trying 1073741801 trying ~1073741801 trying 1073741802 trying ~1073741802 trying 1073741803 trying ~1073741803 trying 1073741804 trying ~1073741804 trying 1073741805 trying ~1073741805 trying 1073741806 trying ~1073741806 trying 1073741807 trying ~1073741807 trying 1073741808 trying ~1073741808 trying 1073741809 trying ~1073741809 trying 1073741810 trying ~1073741810 trying 1073741811 trying ~1073741811 trying 1073741812 trying ~1073741812 trying 1073741813 trying ~1073741813 trying 1073741814 trying ~1073741814 trying 1073741815 trying ~1073741815 trying 1073741816 trying ~1073741816 trying 1073741817 trying ~1073741817 trying 1073741818 trying ~1073741818 trying 1073741819 trying ~1073741819 trying 1073741820 trying ~1073741820 trying 1073741821 trying ~1073741821 trying 1073741822 trying ~1073741822 trying 1073741823 trying ~1073741823 trying 1073741824 trying ~1073741824 trying 1073741825 trying ~1073741825 trying 1073741826 trying ~1073741826 trying 1073741827 trying ~1073741827 trying 1073741828 trying ~1073741828 trying 1073741829 trying ~1073741829 trying 1073741830 trying ~1073741830 trying 1073741831 trying ~1073741831 trying 1073741832 trying ~1073741832 trying 1073741833 trying ~1073741833 trying 1073741834 trying ~1073741834 trying 1073741835 trying ~1073741835 trying 1073741836 trying ~1073741836 trying 1073741837 trying ~1073741837 trying 1073741838 trying ~1073741838 trying 1073741839 trying ~1073741839 trying 1073741840 trying ~1073741840 trying 1073741841 trying ~1073741841 trying 1073741842 trying ~1073741842 trying 1073741843 trying ~1073741843 trying 1073741844 trying ~1073741844 trying 1073741845 trying ~1073741845 trying 1073741846 trying ~1073741846 trying 1073741847 trying ~1073741847 trying 1073741848 trying ~1073741848 trying 1073741849 trying ~1073741849 trying 1073741850 trying ~1073741850 trying 1073741851 trying ~1073741851 trying 1073741852 trying ~1073741852 trying 1073741853 trying ~1073741853 trying 1073741854 trying ~1073741854 trying 1073741855 trying ~1073741855 trying 1073741856 trying ~1073741856 trying 1073741857 trying ~1073741857 trying 1073741858 trying ~1073741858 trying 1073741859 trying ~1073741859 trying 1073741860 trying ~1073741860 trying 1073741861 trying ~1073741861 trying 1073741862 trying ~1073741862 trying 1073741863 trying ~1073741863 trying 1073741864 trying ~1073741864 trying 1073741865 trying ~1073741865 trying 1073741866 trying ~1073741866 trying 1073741867 trying ~1073741867 trying 1073741868 trying ~1073741868 trying 1073741869 trying ~1073741869 trying 1073741870 trying ~1073741870 trying 1073741871 trying ~1073741871 trying 1073741872 trying ~1073741872 trying 1073741873 trying ~1073741873 trying 1073741874 trying ~1073741874 trying 1073741875 trying ~1073741875 trying 1073741876 trying ~1073741876 trying 1073741877 trying ~1073741877 trying 1073741878 trying ~1073741878 trying 1073741879 trying ~1073741879 trying 1073741880 trying ~1073741880 trying 1073741881 trying ~1073741881 trying 1073741882 trying ~1073741882 trying 1073741883 trying ~1073741883 trying 1073741884 trying ~1073741884 trying 1073741885 trying ~1073741885 trying 1073741886 trying ~1073741886 trying 1073741887 trying ~1073741887 trying 1073741888 trying ~1073741888 trying 1073741889 trying ~1073741889 trying 1073741890 trying ~1073741890 trying 1073741891 trying ~1073741891 trying 1073741892 trying ~1073741892 trying 1073741893 trying ~1073741893 trying 1073741894 trying ~1073741894 trying 1073741895 trying ~1073741895 trying 1073741896 trying ~1073741896 trying 1073741897 trying ~1073741897 trying 1073741898 trying ~1073741898 trying 1073741899 trying ~1073741899 trying 1073741900 trying ~1073741900 trying 1073741901 trying ~1073741901 trying 1073741902 trying ~1073741902 trying 1073741903 trying ~1073741903 trying 1073741904 trying ~1073741904 trying 1073741905 trying ~1073741905 trying 1073741906 trying ~1073741906 trying 1073741907 trying ~1073741907 trying 1073741908 trying ~1073741908 trying 1073741909 trying ~1073741909 trying 1073741910 trying ~1073741910 trying 1073741911 trying ~1073741911 trying 1073741912 trying ~1073741912 trying 1073741913 trying ~1073741913 trying 1073741914 trying ~1073741914 trying 1073741915 trying ~1073741915 trying 1073741916 trying ~1073741916 trying 1073741917 trying ~1073741917 trying 1073741918 trying ~1073741918 trying 1073741919 trying ~1073741919 trying 1073741920 trying ~1073741920 trying 1073741921 trying ~1073741921 trying 1073741922 trying ~1073741922 trying 1073741923 trying ~1073741923 trying 1073741924 trying ~1073741924 trying 1073741925 trying ~1073741925 trying 1073741926 trying ~1073741926 trying 1073741927 trying ~1073741927 trying 1073741928 trying ~1073741928 trying 1073741929 trying ~1073741929 trying 1073741930 trying ~1073741930 trying 1073741931 trying ~1073741931 trying 1073741932 trying ~1073741932 trying 1073741933 trying ~1073741933 trying 1073741934 trying ~1073741934 trying 1073741935 trying ~1073741935 trying 1073741936 trying ~1073741936 trying 1073741937 trying ~1073741937 trying 1073741938 trying ~1073741938 trying 1073741939 trying ~1073741939 trying 1073741940 trying ~1073741940 trying 1073741941 trying ~1073741941 trying 1073741942 trying ~1073741942 trying 1073741943 trying ~1073741943 trying 1073741944 trying ~1073741944 trying 1073741945 trying ~1073741945 trying 1073741946 trying ~1073741946 trying 1073741947 trying ~1073741947 trying 1073741948 trying ~1073741948 trying 1073741949 trying ~1073741949 trying 1073741950 trying ~1073741950 trying 1073741951 trying ~1073741951 trying 1073741952 trying ~1073741952 trying 1073741953 trying ~1073741953 trying 1073741954 trying ~1073741954 trying 1073741955 trying ~1073741955 trying 1073741956 trying ~1073741956 trying 1073741957 trying ~1073741957 trying 1073741958 trying ~1073741958 trying 1073741959 trying ~1073741959 trying 1073741960 trying ~1073741960 trying 1073741961 trying ~1073741961 trying 1073741962 trying ~1073741962 trying 1073741963 trying ~1073741963 trying 1073741964 trying ~1073741964 trying 1073741965 trying ~1073741965 trying 1073741966 trying ~1073741966 trying 1073741967 trying ~1073741967 trying 1073741968 trying ~1073741968 trying 1073741969 trying ~1073741969 trying 1073741970 trying ~1073741970 trying 1073741971 trying ~1073741971 trying 1073741972 trying ~1073741972 trying 1073741973 trying ~1073741973 trying 1073741974 trying ~1073741974 trying 1073741975 trying ~1073741975 trying 1073741976 trying ~1073741976 trying 1073741977 trying ~1073741977 trying 1073741978 trying ~1073741978 trying 1073741979 trying ~1073741979 trying 1073741980 trying ~1073741980 trying 1073741981 trying ~1073741981 trying 1073741982 trying ~1073741982 trying 1073741983 trying ~1073741983 trying 1073741984 trying ~1073741984 trying 1073741985 trying ~1073741985 trying 1073741986 trying ~1073741986 trying 1073741987 trying ~1073741987 trying 1073741988 trying ~1073741988 trying 1073741989 trying ~1073741989 trying 1073741990 trying ~1073741990 trying 1073741991 trying ~1073741991 trying 1073741992 trying ~1073741992 trying 1073741993 trying ~1073741993 trying 1073741994 trying ~1073741994 trying 1073741995 trying ~1073741995 trying 1073741996 trying ~1073741996 trying 1073741997 trying ~1073741997 trying 1073741998 trying ~1073741998 trying 1073741999 trying ~1073741999 trying 1073742000 trying ~1073742000 trying 1073742001 trying ~1073742001 trying 1073742002 trying ~1073742002 trying 1073742003 trying ~1073742003 trying 1073742004 trying ~1073742004 trying 1073742005 trying ~1073742005 trying 1073742006 trying ~1073742006 trying 1073742007 trying ~1073742007 trying 1073742008 trying ~1073742008 trying 1073742009 trying ~1073742009 trying 1073742010 trying ~1073742010 trying 1073742011 trying ~1073742011 trying 1073742012 trying ~1073742012 trying 1073742013 trying ~1073742013 trying 1073742014 trying ~1073742014 trying 1073742015 trying ~1073742015 trying 1073742016 trying ~1073742016 trying 1073742017 trying ~1073742017 trying 1073742018 trying ~1073742018 trying 1073742019 trying ~1073742019 trying 1073742020 trying ~1073742020 trying 1073742021 trying ~1073742021 trying 1073742022 trying ~1073742022 trying 1073742023 trying ~1073742023 trying 1073742024 trying ~1073742024 trying 1073742025 trying ~1073742025 trying 1073742026 trying ~1073742026 trying 1073742027 trying ~1073742027 trying 1073742028 trying ~1073742028 trying 1073742029 trying ~1073742029 trying 1073742030 trying ~1073742030 trying 1073742031 trying ~1073742031 trying 1073742032 trying ~1073742032 trying 1073742033 trying ~1073742033 trying 1073742034 trying ~1073742034 trying 1073742035 trying ~1073742035 trying 1073742036 trying ~1073742036 trying 1073742037 trying ~1073742037 trying 1073742038 trying ~1073742038 trying 1073742039 trying ~1073742039 trying 1073742040 trying ~1073742040 trying 1073742041 trying ~1073742041 trying 1073742042 trying ~1073742042 trying 1073742043 trying ~1073742043 trying 1073742044 trying ~1073742044 trying 1073742045 trying ~1073742045 trying 1073742046 trying ~1073742046 trying 1073742047 trying ~1073742047 trying 1073742048 trying ~1073742048 trying 1073742049 trying ~1073742049 trying 1073742050 trying ~1073742050 trying 1073742051 trying ~1073742051 trying 1073742052 trying ~1073742052 trying 1073742053 trying ~1073742053 trying 1073742054 trying ~1073742054 trying 1073742055 trying ~1073742055 trying 1073742056 trying ~1073742056 trying 1073742057 trying ~1073742057 trying 1073742058 trying ~1073742058 trying 1073742059 trying ~1073742059 trying 1073742060 trying ~1073742060 trying 1073742061 trying ~1073742061 trying 1073742062 trying ~1073742062 trying 1073742063 trying ~1073742063 trying 1073742064 trying ~1073742064 trying 1073742065 trying ~1073742065 trying 1073742066 trying ~1073742066 trying 1073742067 trying ~1073742067 trying 1073742068 trying ~1073742068 trying 1073742069 trying ~1073742069 trying 1073742070 trying ~1073742070 trying 1073742071 trying ~1073742071 trying 1073742072 trying ~1073742072 trying 1073742073 trying ~1073742073 trying 1073742074 trying ~1073742074 trying 1073742075 trying ~1073742075 trying 1073742076 trying ~1073742076 trying 1073742077 trying ~1073742077 trying 1073742078 trying ~1073742078 trying 1073742079 trying ~1073742079 trying 1073742080 trying ~1073742080 trying 1073742081 trying ~1073742081 trying 1073742082 trying ~1073742082 trying 1073742083 trying ~1073742083 trying 1073742084 trying ~1073742084 trying 1073742085 trying ~1073742085 trying 1073742086 trying ~1073742086 trying 1073742087 trying ~1073742087 trying 1073742088 trying ~1073742088 trying 1073742089 trying ~1073742089 trying 1073742090 trying ~1073742090 trying 1073742091 trying ~1073742091 trying 1073742092 trying ~1073742092 trying 1073742093 trying ~1073742093 trying 1073742094 trying ~1073742094 trying 1073742095 trying ~1073742095 trying 1073742096 trying ~1073742096 trying 1073742097 trying ~1073742097 trying 1073742098 trying ~1073742098 trying 1073742099 trying ~1073742099 trying 1073742100 trying ~1073742100 trying 1073742101 trying ~1073742101 trying 1073742102 trying ~1073742102 trying 1073742103 trying ~1073742103 trying 1073742104 trying ~1073742104 trying 1073742105 trying ~1073742105 trying 1073742106 trying ~1073742106 trying 1073742107 trying ~1073742107 trying 1073742108 trying ~1073742108 trying 1073742109 trying ~1073742109 trying 1073742110 trying ~1073742110 trying 1073742111 trying ~1073742111 trying 1073742112 trying ~1073742112 trying 1073742113 trying ~1073742113 trying 1073742114 trying ~1073742114 trying 1073742115 trying ~1073742115 trying 1073742116 trying ~1073742116 trying 1073742117 trying ~1073742117 trying 1073742118 trying ~1073742118 trying 1073742119 trying ~1073742119 trying 1073742120 trying ~1073742120 trying 1073742121 trying ~1073742121 trying 1073742122 trying ~1073742122 trying 1073742123 trying ~1073742123 trying 1073742124 trying ~1073742124 trying 1073742125 trying ~1073742125 trying 1073742126 trying ~1073742126 trying 1073742127 trying ~1073742127 trying 1073742128 trying ~1073742128 trying 1073742129 trying ~1073742129 trying 1073742130 trying ~1073742130 trying 1073742131 trying ~1073742131 trying 1073742132 trying ~1073742132 trying 1073742133 trying ~1073742133 trying 1073742134 trying ~1073742134 trying 1073742135 trying ~1073742135 trying 1073742136 trying ~1073742136 trying 1073742137 trying ~1073742137 trying 1073742138 trying ~1073742138 trying 1073742139 trying ~1073742139 trying 1073742140 trying ~1073742140 trying 1073742141 trying ~1073742141 trying 1073742142 trying ~1073742142 trying 1073742143 trying ~1073742143 trying 1073742144 trying ~1073742144 trying 1073742145 trying ~1073742145 trying 1073742146 trying ~1073742146 trying 1073742147 trying ~1073742147 trying 1073742148 trying ~1073742148 trying 1073742149 trying ~1073742149 trying 1073742150 trying ~1073742150 trying 1073742151 trying ~1073742151 trying 1073742152 trying ~1073742152 trying 1073742153 trying ~1073742153 trying 1073742154 trying ~1073742154 trying 1073742155 trying ~1073742155 trying 1073742156 trying ~1073742156 trying 1073742157 trying ~1073742157 trying 1073742158 trying ~1073742158 trying 1073742159 trying ~1073742159 trying 1073742160 trying ~1073742160 trying 1073742161 trying ~1073742161 trying 1073742162 trying ~1073742162 trying 1073742163 trying ~1073742163 trying 1073742164 trying ~1073742164 trying 1073742165 trying ~1073742165 trying 1073742166 trying ~1073742166 trying 1073742167 trying ~1073742167 trying 1073742168 trying ~1073742168 trying 1073742169 trying ~1073742169 trying 1073742170 trying ~1073742170 trying 1073742171 trying ~1073742171 trying 1073742172 trying ~1073742172 trying 1073742173 trying ~1073742173 trying 1073742174 trying ~1073742174 trying 1073742175 trying ~1073742175 trying 1073742176 trying ~1073742176 trying 1073742177 trying ~1073742177 trying 1073742178 trying ~1073742178 trying 1073742179 trying ~1073742179 trying 1073742180 trying ~1073742180 trying 1073742181 trying ~1073742181 trying 1073742182 trying ~1073742182 trying 1073742183 trying ~1073742183 trying 1073742184 trying ~1073742184 trying 1073742185 trying ~1073742185 trying 1073742186 trying ~1073742186 trying 1073742187 trying ~1073742187 trying 1073742188 trying ~1073742188 trying 1073742189 trying ~1073742189 trying 1073742190 trying ~1073742190 trying 1073742191 trying ~1073742191 trying 1073742192 trying ~1073742192 trying 1073742193 trying ~1073742193 trying 1073742194 trying ~1073742194 trying 1073742195 trying ~1073742195 trying 1073742196 trying ~1073742196 trying 1073742197 trying ~1073742197 trying 1073742198 trying ~1073742198 trying 1073742199 trying ~1073742199 trying 1073742200 trying ~1073742200 trying 1073742201 trying ~1073742201 trying 1073742202 trying ~1073742202 trying 1073742203 trying ~1073742203 trying 1073742204 trying ~1073742204 trying 1073742205 trying ~1073742205 trying 1073742206 trying ~1073742206 trying 1073742207 trying ~1073742207 trying 1073742208 trying ~1073742208 trying 1073742209 trying ~1073742209 trying 1073742210 trying ~1073742210 trying 1073742211 trying ~1073742211 trying 1073742212 trying ~1073742212 trying 1073742213 trying ~1073742213 trying 1073742214 trying ~1073742214 trying 1073742215 trying ~1073742215 trying 1073742216 trying ~1073742216 trying 1073742217 trying ~1073742217 trying 1073742218 trying ~1073742218 trying 1073742219 trying ~1073742219 trying 1073742220 trying ~1073742220 trying 1073742221 trying ~1073742221 trying 1073742222 trying ~1073742222 trying 1073742223 trying ~1073742223 trying 1073742224 trying ~1073742224 trying 1073742225 trying ~1073742225 trying 1073742226 trying ~1073742226 trying 1073742227 trying ~1073742227 trying 1073742228 trying ~1073742228 trying 1073742229 trying ~1073742229 trying 1073742230 trying ~1073742230 trying 1073742231 trying ~1073742231 trying 1073742232 trying ~1073742232 trying 1073742233 trying ~1073742233 trying 1073742234 trying ~1073742234 trying 1073742235 trying ~1073742235 trying 1073742236 trying ~1073742236 trying 1073742237 trying ~1073742237 trying 1073742238 trying ~1073742238 trying 1073742239 trying ~1073742239 trying 1073742240 trying ~1073742240 trying 1073742241 trying ~1073742241 trying 1073742242 trying ~1073742242 trying 1073742243 trying ~1073742243 trying 1073742244 trying ~1073742244 trying 1073742245 trying ~1073742245 trying 1073742246 trying ~1073742246 trying 1073742247 trying ~1073742247 trying 1073742248 trying ~1073742248 trying 1073742249 trying ~1073742249 trying 1073742250 trying ~1073742250 trying 1073742251 trying ~1073742251 trying 1073742252 trying ~1073742252 trying 1073742253 trying ~1073742253 trying 1073742254 trying ~1073742254 trying 1073742255 trying ~1073742255 trying 1073742256 trying ~1073742256 trying 1073742257 trying ~1073742257 trying 1073742258 trying ~1073742258 trying 1073742259 trying ~1073742259 trying 1073742260 trying ~1073742260 trying 1073742261 trying ~1073742261 trying 1073742262 trying ~1073742262 trying 1073742263 trying ~1073742263 trying 1073742264 trying ~1073742264 trying 1073742265 trying ~1073742265 trying 1073742266 trying ~1073742266 trying 1073742267 trying ~1073742267 trying 1073742268 trying ~1073742268 trying 1073742269 trying ~1073742269 trying 1073742270 trying ~1073742270 trying 1073742271 trying ~1073742271 trying 1073742272 trying ~1073742272 trying 1073742273 trying ~1073742273 trying 1073742274 trying ~1073742274 trying 1073742275 trying ~1073742275 trying 1073742276 trying ~1073742276 trying 1073742277 trying ~1073742277 trying 1073742278 trying ~1073742278 trying 1073742279 trying ~1073742279 trying 1073742280 trying ~1073742280 trying 1073742281 trying ~1073742281 trying 1073742282 trying ~1073742282 trying 1073742283 trying ~1073742283 trying 1073742284 trying ~1073742284 trying 1073742285 trying ~1073742285 trying 1073742286 trying ~1073742286 trying 1073742287 trying ~1073742287 trying 1073742288 trying ~1073742288 trying 1073742289 trying ~1073742289 trying 1073742290 trying ~1073742290 trying 1073742291 trying ~1073742291 trying 1073742292 trying ~1073742292 trying 1073742293 trying ~1073742293 trying 1073742294 trying ~1073742294 trying 1073742295 trying ~1073742295 trying 1073742296 trying ~1073742296 trying 1073742297 trying ~1073742297 trying 1073742298 trying ~1073742298 trying 1073742299 trying ~1073742299 trying 1073742300 trying ~1073742300 trying 1073742301 trying ~1073742301 trying 1073742302 trying ~1073742302 trying 1073742303 trying ~1073742303 trying 1073742304 trying ~1073742304 trying 1073742305 trying ~1073742305 trying 1073742306 trying ~1073742306 trying 1073742307 trying ~1073742307 trying 1073742308 trying ~1073742308 trying 1073742309 trying ~1073742309 trying 1073742310 trying ~1073742310 trying 1073742311 trying ~1073742311 trying 1073742312 trying ~1073742312 trying 1073742313 trying ~1073742313 trying 1073742314 trying ~1073742314 trying 1073742315 trying ~1073742315 trying 1073742316 trying ~1073742316 trying 1073742317 trying ~1073742317 trying 1073742318 trying ~1073742318 trying 1073742319 trying ~1073742319 trying 1073742320 trying ~1073742320 trying 1073742321 trying ~1073742321 trying 1073742322 trying ~1073742322 trying 1073742323 trying ~1073742323 trying 1073742324 trying ~1073742324 trying 1073742325 trying ~1073742325 trying 1073742326 trying ~1073742326 trying 1073742327 trying ~1073742327 trying 1073742328 trying ~1073742328 trying 1073742329 trying ~1073742329 trying 1073742330 trying ~1073742330 trying 1073742331 trying ~1073742331 trying 1073742332 trying ~1073742332 trying 1073742333 trying ~1073742333 trying 1073742334 trying ~1073742334 trying 1073742335 trying ~1073742335 trying 1073742336 trying ~1073742336 trying 1073742337 trying ~1073742337 trying 1073742338 trying ~1073742338 trying 1073742339 trying ~1073742339 trying 1073742340 trying ~1073742340 trying 1073742341 trying ~1073742341 trying 1073742342 trying ~1073742342 trying 1073742343 trying ~1073742343 trying 1073742344 trying ~1073742344 trying 1073742345 trying ~1073742345 trying 1073742346 trying ~1073742346 trying 1073742347 trying ~1073742347 trying 1073742348 trying ~1073742348 trying 1073742349 trying ~1073742349 trying 1073742350 trying ~1073742350 trying 1073742351 trying ~1073742351 trying 1073742352 trying ~1073742352 trying 1073742353 trying ~1073742353 trying 1073742354 trying ~1073742354 trying 1073742355 trying ~1073742355 trying 1073742356 trying ~1073742356 trying 1073742357 trying ~1073742357 trying 1073742358 trying ~1073742358 trying 1073742359 trying ~1073742359 trying 1073742360 trying ~1073742360 trying 1073742361 trying ~1073742361 trying 1073742362 trying ~1073742362 trying 1073742363 trying ~1073742363 trying 1073742364 trying ~1073742364 trying 1073742365 trying ~1073742365 trying 1073742366 trying ~1073742366 trying 1073742367 trying ~1073742367 trying 1073742368 trying ~1073742368 trying 1073742369 trying ~1073742369 trying 1073742370 trying ~1073742370 trying 1073742371 trying ~1073742371 trying 1073742372 trying ~1073742372 trying 1073742373 trying ~1073742373 trying 1073742374 trying ~1073742374 trying 1073742375 trying ~1073742375 trying 1073742376 trying ~1073742376 trying 1073742377 trying ~1073742377 trying 1073742378 trying ~1073742378 trying 1073742379 trying ~1073742379 trying 1073742380 trying ~1073742380 trying 1073742381 trying ~1073742381 trying 1073742382 trying ~1073742382 trying 1073742383 trying ~1073742383 trying 1073742384 trying ~1073742384 trying 1073742385 trying ~1073742385 trying 1073742386 trying ~1073742386 trying 1073742387 trying ~1073742387 trying 1073742388 trying ~1073742388 trying 1073742389 trying ~1073742389 trying 1073742390 trying ~1073742390 trying 1073742391 trying ~1073742391 trying 1073742392 trying ~1073742392 trying 1073742393 trying ~1073742393 trying 1073742394 trying ~1073742394 trying 1073742395 trying ~1073742395 trying 1073742396 trying ~1073742396 trying 1073742397 trying ~1073742397 trying 1073742398 trying ~1073742398 trying 1073742399 trying ~1073742399 trying 1073742400 trying ~1073742400 trying 1073742401 trying ~1073742401 trying 1073742402 trying ~1073742402 trying 1073742403 trying ~1073742403 trying 1073742404 trying ~1073742404 trying 1073742405 trying ~1073742405 trying 1073742406 trying ~1073742406 trying 1073742407 trying ~1073742407 trying 1073742408 trying ~1073742408 trying 1073742409 trying ~1073742409 trying 1073742410 trying ~1073742410 trying 1073742411 trying ~1073742411 trying 1073742412 trying ~1073742412 trying 1073742413 trying ~1073742413 trying 1073742414 trying ~1073742414 trying 1073742415 trying ~1073742415 trying 1073742416 trying ~1073742416 trying 1073742417 trying ~1073742417 trying 1073742418 trying ~1073742418 trying 1073742419 trying ~1073742419 trying 1073742420 trying ~1073742420 trying 1073742421 trying ~1073742421 trying 1073742422 trying ~1073742422 trying 1073742423 trying ~1073742423 trying 1073742424 trying ~1073742424 trying 1073742425 trying ~1073742425 trying 1073742426 trying ~1073742426 trying 1073742427 trying ~1073742427 trying 1073742428 trying ~1073742428 trying 1073742429 trying ~1073742429 trying 1073742430 trying ~1073742430 trying 1073742431 trying ~1073742431 trying 1073742432 trying ~1073742432 trying 1073742433 trying ~1073742433 trying 1073742434 trying ~1073742434 trying 1073742435 trying ~1073742435 trying 1073742436 trying ~1073742436 trying 1073742437 trying ~1073742437 trying 1073742438 trying ~1073742438 trying 1073742439 trying ~1073742439 trying 1073742440 trying ~1073742440 trying 1073742441 trying ~1073742441 trying 1073742442 trying ~1073742442 trying 1073742443 trying ~1073742443 trying 1073742444 trying ~1073742444 trying 1073742445 trying ~1073742445 trying 1073742446 trying ~1073742446 trying 1073742447 trying ~1073742447 trying 1073742448 trying ~1073742448 trying 1073742449 trying ~1073742449 trying 1073742450 trying ~1073742450 trying 1073742451 trying ~1073742451 trying 1073742452 trying ~1073742452 trying 1073742453 trying ~1073742453 trying 1073742454 trying ~1073742454 trying 1073742455 trying ~1073742455 trying 1073742456 trying ~1073742456 trying 1073742457 trying ~1073742457 trying 1073742458 trying ~1073742458 trying 1073742459 trying ~1073742459 trying 1073742460 trying ~1073742460 trying 1073742461 trying ~1073742461 trying 1073742462 trying ~1073742462 trying 1073742463 trying ~1073742463 trying 1073742464 trying ~1073742464 trying 1073742465 trying ~1073742465 trying 1073742466 trying ~1073742466 trying 1073742467 trying ~1073742467 trying 1073742468 trying ~1073742468 trying 1073742469 trying ~1073742469 trying 1073742470 trying ~1073742470 trying 1073742471 trying ~1073742471 trying 1073742472 trying ~1073742472 trying 1073742473 trying ~1073742473 trying 1073742474 trying ~1073742474 trying 1073742475 trying ~1073742475 trying 1073742476 trying ~1073742476 trying 1073742477 trying ~1073742477 trying 1073742478 trying ~1073742478 trying 1073742479 trying ~1073742479 trying 1073742480 trying ~1073742480 trying 1073742481 trying ~1073742481 trying 1073742482 trying ~1073742482 trying 1073742483 trying ~1073742483 trying 1073742484 trying ~1073742484 trying 1073742485 trying ~1073742485 trying 1073742486 trying ~1073742486 trying 1073742487 trying ~1073742487 trying 1073742488 trying ~1073742488 trying 1073742489 trying ~1073742489 trying 1073742490 trying ~1073742490 trying 1073742491 trying ~1073742491 trying 1073742492 trying ~1073742492 trying 1073742493 trying ~1073742493 trying 1073742494 trying ~1073742494 trying 1073742495 trying ~1073742495 trying 1073742496 trying ~1073742496 trying 1073742497 trying ~1073742497 trying 1073742498 trying ~1073742498 trying 1073742499 trying ~1073742499 trying 1073742500 trying ~1073742500 trying 1073742501 trying ~1073742501 trying 1073742502 trying ~1073742502 trying 1073742503 trying ~1073742503 trying 1073742504 trying ~1073742504 trying 1073742505 trying ~1073742505 trying 1073742506 trying ~1073742506 trying 1073742507 trying ~1073742507 trying 1073742508 trying ~1073742508 trying 1073742509 trying ~1073742509 trying 1073742510 trying ~1073742510 trying 1073742511 trying ~1073742511 trying 1073742512 trying ~1073742512 trying 1073742513 trying ~1073742513 trying 1073742514 trying ~1073742514 trying 1073742515 trying ~1073742515 trying 1073742516 trying ~1073742516 trying 1073742517 trying ~1073742517 trying 1073742518 trying ~1073742518 trying 1073742519 trying ~1073742519 trying 1073742520 trying ~1073742520 trying 1073742521 trying ~1073742521 trying 1073742522 trying ~1073742522 trying 1073742523 trying ~1073742523 trying 1073742524 trying ~1073742524 trying 1073742525 trying ~1073742525 trying 1073742526 trying ~1073742526 trying 1073742527 trying ~1073742527 trying 1073742528 trying ~1073742528 trying 1073742529 trying ~1073742529 trying 1073742530 trying ~1073742530 trying 1073742531 trying ~1073742531 trying 1073742532 trying ~1073742532 trying 1073742533 trying ~1073742533 trying 1073742534 trying ~1073742534 trying 1073742535 trying ~1073742535 trying 1073742536 trying ~1073742536 trying 1073742537 trying ~1073742537 trying 1073742538 trying ~1073742538 trying 1073742539 trying ~1073742539 trying 1073742540 trying ~1073742540 trying 1073742541 trying ~1073742541 trying 1073742542 trying ~1073742542 trying 1073742543 trying ~1073742543 trying 1073742544 trying ~1073742544 trying 1073742545 trying ~1073742545 trying 1073742546 trying ~1073742546 trying 1073742547 trying ~1073742547 trying 1073742548 trying ~1073742548 trying 1073742549 trying ~1073742549 trying 1073742550 trying ~1073742550 trying 1073742551 trying ~1073742551 trying 1073742552 trying ~1073742552 trying 1073742553 trying ~1073742553 trying 1073742554 trying ~1073742554 trying 1073742555 trying ~1073742555 trying 1073742556 trying ~1073742556 trying 1073742557 trying ~1073742557 trying 1073742558 trying ~1073742558 trying 1073742559 trying ~1073742559 trying 1073742560 trying ~1073742560 trying 1073742561 trying ~1073742561 trying 1073742562 trying ~1073742562 trying 1073742563 trying ~1073742563 trying 1073742564 trying ~1073742564 trying 1073742565 trying ~1073742565 trying 1073742566 trying ~1073742566 trying 1073742567 trying ~1073742567 trying 1073742568 trying ~1073742568 trying 1073742569 trying ~1073742569 trying 1073742570 trying ~1073742570 trying 1073742571 trying ~1073742571 trying 1073742572 trying ~1073742572 trying 1073742573 trying ~1073742573 trying 1073742574 trying ~1073742574 trying 1073742575 trying ~1073742575 trying 1073742576 trying ~1073742576 trying 1073742577 trying ~1073742577 trying 1073742578 trying ~1073742578 trying 1073742579 trying ~1073742579 trying 1073742580 trying ~1073742580 trying 1073742581 trying ~1073742581 trying 1073742582 trying ~1073742582 trying 1073742583 trying ~1073742583 trying 1073742584 trying ~1073742584 trying 1073742585 trying ~1073742585 trying 1073742586 trying ~1073742586 trying 1073742587 trying ~1073742587 trying 1073742588 trying ~1073742588 trying 1073742589 trying ~1073742589 trying 1073742590 trying ~1073742590 trying 1073742591 trying ~1073742591 trying 1073742592 trying ~1073742592 trying 1073742593 trying ~1073742593 trying 1073742594 trying ~1073742594 trying 1073742595 trying ~1073742595 trying 1073742596 trying ~1073742596 trying 1073742597 trying ~1073742597 trying 1073742598 trying ~1073742598 trying 1073742599 trying ~1073742599 trying 1073742600 trying ~1073742600 trying 1073742601 trying ~1073742601 trying 1073742602 trying ~1073742602 trying 1073742603 trying ~1073742603 trying 1073742604 trying ~1073742604 trying 1073742605 trying ~1073742605 trying 1073742606 trying ~1073742606 trying 1073742607 trying ~1073742607 trying 1073742608 trying ~1073742608 trying 1073742609 trying ~1073742609 trying 1073742610 trying ~1073742610 trying 1073742611 trying ~1073742611 trying 1073742612 trying ~1073742612 trying 1073742613 trying ~1073742613 trying 1073742614 trying ~1073742614 trying 1073742615 trying ~1073742615 trying 1073742616 trying ~1073742616 trying 1073742617 trying ~1073742617 trying 1073742618 trying ~1073742618 trying 1073742619 trying ~1073742619 trying 1073742620 trying ~1073742620 trying 1073742621 trying ~1073742621 trying 1073742622 trying ~1073742622 trying 1073742623 trying ~1073742623 trying 1073742624 trying ~1073742624 trying 1073742625 trying ~1073742625 trying 1073742626 trying ~1073742626 trying 1073742627 trying ~1073742627 trying 1073742628 trying ~1073742628 trying 1073742629 trying ~1073742629 trying 1073742630 trying ~1073742630 trying 1073742631 trying ~1073742631 trying 1073742632 trying ~1073742632 trying 1073742633 trying ~1073742633 trying 1073742634 trying ~1073742634 trying 1073742635 trying ~1073742635 trying 1073742636 trying ~1073742636 trying 1073742637 trying ~1073742637 trying 1073742638 trying ~1073742638 trying 1073742639 trying ~1073742639 trying 1073742640 trying ~1073742640 trying 1073742641 trying ~1073742641 trying 1073742642 trying ~1073742642 trying 1073742643 trying ~1073742643 trying 1073742644 trying ~1073742644 trying 1073742645 trying ~1073742645 trying 1073742646 trying ~1073742646 trying 1073742647 trying ~1073742647 trying 1073742648 trying ~1073742648 trying 1073742649 trying ~1073742649 trying 1073742650 trying ~1073742650 trying 1073742651 trying ~1073742651 trying 1073742652 trying ~1073742652 trying 1073742653 trying ~1073742653 trying 1073742654 trying ~1073742654 trying 1073742655 trying ~1073742655 trying 1073742656 trying ~1073742656 trying 1073742657 trying ~1073742657 trying 1073742658 trying ~1073742658 trying 1073742659 trying ~1073742659 trying 1073742660 trying ~1073742660 trying 1073742661 trying ~1073742661 trying 1073742662 trying ~1073742662 trying 1073742663 trying ~1073742663 trying 1073742664 trying ~1073742664 trying 1073742665 trying ~1073742665 trying 1073742666 trying ~1073742666 trying 1073742667 trying ~1073742667 trying 1073742668 trying ~1073742668 trying 1073742669 trying ~1073742669 trying 1073742670 trying ~1073742670 trying 1073742671 trying ~1073742671 trying 1073742672 trying ~1073742672 trying 1073742673 trying ~1073742673 trying 1073742674 trying ~1073742674 trying 1073742675 trying ~1073742675 trying 1073742676 trying ~1073742676 trying 1073742677 trying ~1073742677 trying 1073742678 trying ~1073742678 trying 1073742679 trying ~1073742679 trying 1073742680 trying ~1073742680 trying 1073742681 trying ~1073742681 trying 1073742682 trying ~1073742682 trying 1073742683 trying ~1073742683 trying 1073742684 trying ~1073742684 trying 1073742685 trying ~1073742685 trying 1073742686 trying ~1073742686 trying 1073742687 trying ~1073742687 trying 1073742688 trying ~1073742688 trying 1073742689 trying ~1073742689 trying 1073742690 trying ~1073742690 trying 1073742691 trying ~1073742691 trying 1073742692 trying ~1073742692 trying 1073742693 trying ~1073742693 trying 1073742694 trying ~1073742694 trying 1073742695 trying ~1073742695 trying 1073742696 trying ~1073742696 trying 1073742697 trying ~1073742697 trying 1073742698 trying ~1073742698 trying 1073742699 trying ~1073742699 trying 1073742700 trying ~1073742700 trying 1073742701 trying ~1073742701 trying 1073742702 trying ~1073742702 trying 1073742703 trying ~1073742703 trying 1073742704 trying ~1073742704 trying 1073742705 trying ~1073742705 trying 1073742706 trying ~1073742706 trying 1073742707 trying ~1073742707 trying 1073742708 trying ~1073742708 trying 1073742709 trying ~1073742709 trying 1073742710 trying ~1073742710 trying 1073742711 trying ~1073742711 trying 1073742712 trying ~1073742712 trying 1073742713 trying ~1073742713 trying 1073742714 trying ~1073742714 trying 1073742715 trying ~1073742715 trying 1073742716 trying ~1073742716 trying 1073742717 trying ~1073742717 trying 1073742718 trying ~1073742718 trying 1073742719 trying ~1073742719 trying 1073742720 trying ~1073742720 trying 1073742721 trying ~1073742721 trying 1073742722 trying ~1073742722 trying 1073742723 trying ~1073742723 trying 1073742724 trying ~1073742724 trying 1073742725 trying ~1073742725 trying 1073742726 trying ~1073742726 trying 1073742727 trying ~1073742727 trying 1073742728 trying ~1073742728 trying 1073742729 trying ~1073742729 trying 1073742730 trying ~1073742730 trying 1073742731 trying ~1073742731 trying 1073742732 trying ~1073742732 trying 1073742733 trying ~1073742733 trying 1073742734 trying ~1073742734 trying 1073742735 trying ~1073742735 trying 1073742736 trying ~1073742736 trying 1073742737 trying ~1073742737 trying 1073742738 trying ~1073742738 trying 1073742739 trying ~1073742739 trying 1073742740 trying ~1073742740 trying 1073742741 trying ~1073742741 trying 1073742742 trying ~1073742742 trying 1073742743 trying ~1073742743 trying 1073742744 trying ~1073742744 trying 1073742745 trying ~1073742745 trying 1073742746 trying ~1073742746 trying 1073742747 trying ~1073742747 trying 1073742748 trying ~1073742748 trying 1073742749 trying ~1073742749 trying 1073742750 trying ~1073742750 trying 1073742751 trying ~1073742751 trying 1073742752 trying ~1073742752 trying 1073742753 trying ~1073742753 trying 1073742754 trying ~1073742754 trying 1073742755 trying ~1073742755 trying 1073742756 trying ~1073742756 trying 1073742757 trying ~1073742757 trying 1073742758 trying ~1073742758 trying 1073742759 trying ~1073742759 trying 1073742760 trying ~1073742760 trying 1073742761 trying ~1073742761 trying 1073742762 trying ~1073742762 trying 1073742763 trying ~1073742763 trying 1073742764 trying ~1073742764 trying 1073742765 trying ~1073742765 trying 1073742766 trying ~1073742766 trying 1073742767 trying ~1073742767 trying 1073742768 trying ~1073742768 trying 1073742769 trying ~1073742769 trying 1073742770 trying ~1073742770 trying 1073742771 trying ~1073742771 trying 1073742772 trying ~1073742772 trying 1073742773 trying ~1073742773 trying 1073742774 trying ~1073742774 trying 1073742775 trying ~1073742775 trying 1073742776 trying ~1073742776 trying 1073742777 trying ~1073742777 trying 1073742778 trying ~1073742778 trying 1073742779 trying ~1073742779 trying 1073742780 trying ~1073742780 trying 1073742781 trying ~1073742781 trying 1073742782 trying ~1073742782 trying 1073742783 trying ~1073742783 trying 1073742784 trying ~1073742784 trying 1073742785 trying ~1073742785 trying 1073742786 trying ~1073742786 trying 1073742787 trying ~1073742787 trying 1073742788 trying ~1073742788 trying 1073742789 trying ~1073742789 trying 1073742790 trying ~1073742790 trying 1073742791 trying ~1073742791 trying 1073742792 trying ~1073742792 trying 1073742793 trying ~1073742793 trying 1073742794 trying ~1073742794 trying 1073742795 trying ~1073742795 trying 1073742796 trying ~1073742796 trying 1073742797 trying ~1073742797 trying 1073742798 trying ~1073742798 trying 1073742799 trying ~1073742799 trying 1073742800 trying ~1073742800 trying 1073742801 trying ~1073742801 trying 1073742802 trying ~1073742802 trying 1073742803 trying ~1073742803 trying 1073742804 trying ~1073742804 trying 1073742805 trying ~1073742805 trying 1073742806 trying ~1073742806 trying 1073742807 trying ~1073742807 trying 1073742808 trying ~1073742808 trying 1073742809 trying ~1073742809 trying 1073742810 trying ~1073742810 trying 1073742811 trying ~1073742811 trying 1073742812 trying ~1073742812 trying 1073742813 trying ~1073742813 trying 1073742814 trying ~1073742814 trying 1073742815 trying ~1073742815 trying 1073742816 trying ~1073742816 trying 1073742817 trying ~1073742817 trying 1073742818 trying ~1073742818 trying 1073742819 trying ~1073742819 trying 1073742820 trying ~1073742820 trying 1073742821 trying ~1073742821 trying 1073742822 trying ~1073742822 trying 1073742823 trying ~1073742823 trying 2147482648 trying ~2147482648 trying 2147482649 trying ~2147482649 trying 2147482650 trying ~2147482650 trying 2147482651 trying ~2147482651 trying 2147482652 trying ~2147482652 trying 2147482653 trying ~2147482653 trying 2147482654 trying ~2147482654 trying 2147482655 trying ~2147482655 trying 2147482656 trying ~2147482656 trying 2147482657 trying ~2147482657 trying 2147482658 trying ~2147482658 trying 2147482659 trying ~2147482659 trying 2147482660 trying ~2147482660 trying 2147482661 trying ~2147482661 trying 2147482662 trying ~2147482662 trying 2147482663 trying ~2147482663 trying 2147482664 trying ~2147482664 trying 2147482665 trying ~2147482665 trying 2147482666 trying ~2147482666 trying 2147482667 trying ~2147482667 trying 2147482668 trying ~2147482668 trying 2147482669 trying ~2147482669 trying 2147482670 trying ~2147482670 trying 2147482671 trying ~2147482671 trying 2147482672 trying ~2147482672 trying 2147482673 trying ~2147482673 trying 2147482674 trying ~2147482674 trying 2147482675 trying ~2147482675 trying 2147482676 trying ~2147482676 trying 2147482677 trying ~2147482677 trying 2147482678 trying ~2147482678 trying 2147482679 trying ~2147482679 trying 2147482680 trying ~2147482680 trying 2147482681 trying ~2147482681 trying 2147482682 trying ~2147482682 trying 2147482683 trying ~2147482683 trying 2147482684 trying ~2147482684 trying 2147482685 trying ~2147482685 trying 2147482686 trying ~2147482686 trying 2147482687 trying ~2147482687 trying 2147482688 trying ~2147482688 trying 2147482689 trying ~2147482689 trying 2147482690 trying ~2147482690 trying 2147482691 trying ~2147482691 trying 2147482692 trying ~2147482692 trying 2147482693 trying ~2147482693 trying 2147482694 trying ~2147482694 trying 2147482695 trying ~2147482695 trying 2147482696 trying ~2147482696 trying 2147482697 trying ~2147482697 trying 2147482698 trying ~2147482698 trying 2147482699 trying ~2147482699 trying 2147482700 trying ~2147482700 trying 2147482701 trying ~2147482701 trying 2147482702 trying ~2147482702 trying 2147482703 trying ~2147482703 trying 2147482704 trying ~2147482704 trying 2147482705 trying ~2147482705 trying 2147482706 trying ~2147482706 trying 2147482707 trying ~2147482707 trying 2147482708 trying ~2147482708 trying 2147482709 trying ~2147482709 trying 2147482710 trying ~2147482710 trying 2147482711 trying ~2147482711 trying 2147482712 trying ~2147482712 trying 2147482713 trying ~2147482713 trying 2147482714 trying ~2147482714 trying 2147482715 trying ~2147482715 trying 2147482716 trying ~2147482716 trying 2147482717 trying ~2147482717 trying 2147482718 trying ~2147482718 trying 2147482719 trying ~2147482719 trying 2147482720 trying ~2147482720 trying 2147482721 trying ~2147482721 trying 2147482722 trying ~2147482722 trying 2147482723 trying ~2147482723 trying 2147482724 trying ~2147482724 trying 2147482725 trying ~2147482725 trying 2147482726 trying ~2147482726 trying 2147482727 trying ~2147482727 trying 2147482728 trying ~2147482728 trying 2147482729 trying ~2147482729 trying 2147482730 trying ~2147482730 trying 2147482731 trying ~2147482731 trying 2147482732 trying ~2147482732 trying 2147482733 trying ~2147482733 trying 2147482734 trying ~2147482734 trying 2147482735 trying ~2147482735 trying 2147482736 trying ~2147482736 trying 2147482737 trying ~2147482737 trying 2147482738 trying ~2147482738 trying 2147482739 trying ~2147482739 trying 2147482740 trying ~2147482740 trying 2147482741 trying ~2147482741 trying 2147482742 trying ~2147482742 trying 2147482743 trying ~2147482743 trying 2147482744 trying ~2147482744 trying 2147482745 trying ~2147482745 trying 2147482746 trying ~2147482746 trying 2147482747 trying ~2147482747 trying 2147482748 trying ~2147482748 trying 2147482749 trying ~2147482749 trying 2147482750 trying ~2147482750 trying 2147482751 trying ~2147482751 trying 2147482752 trying ~2147482752 trying 2147482753 trying ~2147482753 trying 2147482754 trying ~2147482754 trying 2147482755 trying ~2147482755 trying 2147482756 trying ~2147482756 trying 2147482757 trying ~2147482757 trying 2147482758 trying ~2147482758 trying 2147482759 trying ~2147482759 trying 2147482760 trying ~2147482760 trying 2147482761 trying ~2147482761 trying 2147482762 trying ~2147482762 trying 2147482763 trying ~2147482763 trying 2147482764 trying ~2147482764 trying 2147482765 trying ~2147482765 trying 2147482766 trying ~2147482766 trying 2147482767 trying ~2147482767 trying 2147482768 trying ~2147482768 trying 2147482769 trying ~2147482769 trying 2147482770 trying ~2147482770 trying 2147482771 trying ~2147482771 trying 2147482772 trying ~2147482772 trying 2147482773 trying ~2147482773 trying 2147482774 trying ~2147482774 trying 2147482775 trying ~2147482775 trying 2147482776 trying ~2147482776 trying 2147482777 trying ~2147482777 trying 2147482778 trying ~2147482778 trying 2147482779 trying ~2147482779 trying 2147482780 trying ~2147482780 trying 2147482781 trying ~2147482781 trying 2147482782 trying ~2147482782 trying 2147482783 trying ~2147482783 trying 2147482784 trying ~2147482784 trying 2147482785 trying ~2147482785 trying 2147482786 trying ~2147482786 trying 2147482787 trying ~2147482787 trying 2147482788 trying ~2147482788 trying 2147482789 trying ~2147482789 trying 2147482790 trying ~2147482790 trying 2147482791 trying ~2147482791 trying 2147482792 trying ~2147482792 trying 2147482793 trying ~2147482793 trying 2147482794 trying ~2147482794 trying 2147482795 trying ~2147482795 trying 2147482796 trying ~2147482796 trying 2147482797 trying ~2147482797 trying 2147482798 trying ~2147482798 trying 2147482799 trying ~2147482799 trying 2147482800 trying ~2147482800 trying 2147482801 trying ~2147482801 trying 2147482802 trying ~2147482802 trying 2147482803 trying ~2147482803 trying 2147482804 trying ~2147482804 trying 2147482805 trying ~2147482805 trying 2147482806 trying ~2147482806 trying 2147482807 trying ~2147482807 trying 2147482808 trying ~2147482808 trying 2147482809 trying ~2147482809 trying 2147482810 trying ~2147482810 trying 2147482811 trying ~2147482811 trying 2147482812 trying ~2147482812 trying 2147482813 trying ~2147482813 trying 2147482814 trying ~2147482814 trying 2147482815 trying ~2147482815 trying 2147482816 trying ~2147482816 trying 2147482817 trying ~2147482817 trying 2147482818 trying ~2147482818 trying 2147482819 trying ~2147482819 trying 2147482820 trying ~2147482820 trying 2147482821 trying ~2147482821 trying 2147482822 trying ~2147482822 trying 2147482823 trying ~2147482823 trying 2147482824 trying ~2147482824 trying 2147482825 trying ~2147482825 trying 2147482826 trying ~2147482826 trying 2147482827 trying ~2147482827 trying 2147482828 trying ~2147482828 trying 2147482829 trying ~2147482829 trying 2147482830 trying ~2147482830 trying 2147482831 trying ~2147482831 trying 2147482832 trying ~2147482832 trying 2147482833 trying ~2147482833 trying 2147482834 trying ~2147482834 trying 2147482835 trying ~2147482835 trying 2147482836 trying ~2147482836 trying 2147482837 trying ~2147482837 trying 2147482838 trying ~2147482838 trying 2147482839 trying ~2147482839 trying 2147482840 trying ~2147482840 trying 2147482841 trying ~2147482841 trying 2147482842 trying ~2147482842 trying 2147482843 trying ~2147482843 trying 2147482844 trying ~2147482844 trying 2147482845 trying ~2147482845 trying 2147482846 trying ~2147482846 trying 2147482847 trying ~2147482847 trying 2147482848 trying ~2147482848 trying 2147482849 trying ~2147482849 trying 2147482850 trying ~2147482850 trying 2147482851 trying ~2147482851 trying 2147482852 trying ~2147482852 trying 2147482853 trying ~2147482853 trying 2147482854 trying ~2147482854 trying 2147482855 trying ~2147482855 trying 2147482856 trying ~2147482856 trying 2147482857 trying ~2147482857 trying 2147482858 trying ~2147482858 trying 2147482859 trying ~2147482859 trying 2147482860 trying ~2147482860 trying 2147482861 trying ~2147482861 trying 2147482862 trying ~2147482862 trying 2147482863 trying ~2147482863 trying 2147482864 trying ~2147482864 trying 2147482865 trying ~2147482865 trying 2147482866 trying ~2147482866 trying 2147482867 trying ~2147482867 trying 2147482868 trying ~2147482868 trying 2147482869 trying ~2147482869 trying 2147482870 trying ~2147482870 trying 2147482871 trying ~2147482871 trying 2147482872 trying ~2147482872 trying 2147482873 trying ~2147482873 trying 2147482874 trying ~2147482874 trying 2147482875 trying ~2147482875 trying 2147482876 trying ~2147482876 trying 2147482877 trying ~2147482877 trying 2147482878 trying ~2147482878 trying 2147482879 trying ~2147482879 trying 2147482880 trying ~2147482880 trying 2147482881 trying ~2147482881 trying 2147482882 trying ~2147482882 trying 2147482883 trying ~2147482883 trying 2147482884 trying ~2147482884 trying 2147482885 trying ~2147482885 trying 2147482886 trying ~2147482886 trying 2147482887 trying ~2147482887 trying 2147482888 trying ~2147482888 trying 2147482889 trying ~2147482889 trying 2147482890 trying ~2147482890 trying 2147482891 trying ~2147482891 trying 2147482892 trying ~2147482892 trying 2147482893 trying ~2147482893 trying 2147482894 trying ~2147482894 trying 2147482895 trying ~2147482895 trying 2147482896 trying ~2147482896 trying 2147482897 trying ~2147482897 trying 2147482898 trying ~2147482898 trying 2147482899 trying ~2147482899 trying 2147482900 trying ~2147482900 trying 2147482901 trying ~2147482901 trying 2147482902 trying ~2147482902 trying 2147482903 trying ~2147482903 trying 2147482904 trying ~2147482904 trying 2147482905 trying ~2147482905 trying 2147482906 trying ~2147482906 trying 2147482907 trying ~2147482907 trying 2147482908 trying ~2147482908 trying 2147482909 trying ~2147482909 trying 2147482910 trying ~2147482910 trying 2147482911 trying ~2147482911 trying 2147482912 trying ~2147482912 trying 2147482913 trying ~2147482913 trying 2147482914 trying ~2147482914 trying 2147482915 trying ~2147482915 trying 2147482916 trying ~2147482916 trying 2147482917 trying ~2147482917 trying 2147482918 trying ~2147482918 trying 2147482919 trying ~2147482919 trying 2147482920 trying ~2147482920 trying 2147482921 trying ~2147482921 trying 2147482922 trying ~2147482922 trying 2147482923 trying ~2147482923 trying 2147482924 trying ~2147482924 trying 2147482925 trying ~2147482925 trying 2147482926 trying ~2147482926 trying 2147482927 trying ~2147482927 trying 2147482928 trying ~2147482928 trying 2147482929 trying ~2147482929 trying 2147482930 trying ~2147482930 trying 2147482931 trying ~2147482931 trying 2147482932 trying ~2147482932 trying 2147482933 trying ~2147482933 trying 2147482934 trying ~2147482934 trying 2147482935 trying ~2147482935 trying 2147482936 trying ~2147482936 trying 2147482937 trying ~2147482937 trying 2147482938 trying ~2147482938 trying 2147482939 trying ~2147482939 trying 2147482940 trying ~2147482940 trying 2147482941 trying ~2147482941 trying 2147482942 trying ~2147482942 trying 2147482943 trying ~2147482943 trying 2147482944 trying ~2147482944 trying 2147482945 trying ~2147482945 trying 2147482946 trying ~2147482946 trying 2147482947 trying ~2147482947 trying 2147482948 trying ~2147482948 trying 2147482949 trying ~2147482949 trying 2147482950 trying ~2147482950 trying 2147482951 trying ~2147482951 trying 2147482952 trying ~2147482952 trying 2147482953 trying ~2147482953 trying 2147482954 trying ~2147482954 trying 2147482955 trying ~2147482955 trying 2147482956 trying ~2147482956 trying 2147482957 trying ~2147482957 trying 2147482958 trying ~2147482958 trying 2147482959 trying ~2147482959 trying 2147482960 trying ~2147482960 trying 2147482961 trying ~2147482961 trying 2147482962 trying ~2147482962 trying 2147482963 trying ~2147482963 trying 2147482964 trying ~2147482964 trying 2147482965 trying ~2147482965 trying 2147482966 trying ~2147482966 trying 2147482967 trying ~2147482967 trying 2147482968 trying ~2147482968 trying 2147482969 trying ~2147482969 trying 2147482970 trying ~2147482970 trying 2147482971 trying ~2147482971 trying 2147482972 trying ~2147482972 trying 2147482973 trying ~2147482973 trying 2147482974 trying ~2147482974 trying 2147482975 trying ~2147482975 trying 2147482976 trying ~2147482976 trying 2147482977 trying ~2147482977 trying 2147482978 trying ~2147482978 trying 2147482979 trying ~2147482979 trying 2147482980 trying ~2147482980 trying 2147482981 trying ~2147482981 trying 2147482982 trying ~2147482982 trying 2147482983 trying ~2147482983 trying 2147482984 trying ~2147482984 trying 2147482985 trying ~2147482985 trying 2147482986 trying ~2147482986 trying 2147482987 trying ~2147482987 trying 2147482988 trying ~2147482988 trying 2147482989 trying ~2147482989 trying 2147482990 trying ~2147482990 trying 2147482991 trying ~2147482991 trying 2147482992 trying ~2147482992 trying 2147482993 trying ~2147482993 trying 2147482994 trying ~2147482994 trying 2147482995 trying ~2147482995 trying 2147482996 trying ~2147482996 trying 2147482997 trying ~2147482997 trying 2147482998 trying ~2147482998 trying 2147482999 trying ~2147482999 trying 2147483000 trying ~2147483000 trying 2147483001 trying ~2147483001 trying 2147483002 trying ~2147483002 trying 2147483003 trying ~2147483003 trying 2147483004 trying ~2147483004 trying 2147483005 trying ~2147483005 trying 2147483006 trying ~2147483006 trying 2147483007 trying ~2147483007 trying 2147483008 trying ~2147483008 trying 2147483009 trying ~2147483009 trying 2147483010 trying ~2147483010 trying 2147483011 trying ~2147483011 trying 2147483012 trying ~2147483012 trying 2147483013 trying ~2147483013 trying 2147483014 trying ~2147483014 trying 2147483015 trying ~2147483015 trying 2147483016 trying ~2147483016 trying 2147483017 trying ~2147483017 trying 2147483018 trying ~2147483018 trying 2147483019 trying ~2147483019 trying 2147483020 trying ~2147483020 trying 2147483021 trying ~2147483021 trying 2147483022 trying ~2147483022 trying 2147483023 trying ~2147483023 trying 2147483024 trying ~2147483024 trying 2147483025 trying ~2147483025 trying 2147483026 trying ~2147483026 trying 2147483027 trying ~2147483027 trying 2147483028 trying ~2147483028 trying 2147483029 trying ~2147483029 trying 2147483030 trying ~2147483030 trying 2147483031 trying ~2147483031 trying 2147483032 trying ~2147483032 trying 2147483033 trying ~2147483033 trying 2147483034 trying ~2147483034 trying 2147483035 trying ~2147483035 trying 2147483036 trying ~2147483036 trying 2147483037 trying ~2147483037 trying 2147483038 trying ~2147483038 trying 2147483039 trying ~2147483039 trying 2147483040 trying ~2147483040 trying 2147483041 trying ~2147483041 trying 2147483042 trying ~2147483042 trying 2147483043 trying ~2147483043 trying 2147483044 trying ~2147483044 trying 2147483045 trying ~2147483045 trying 2147483046 trying ~2147483046 trying 2147483047 trying ~2147483047 trying 2147483048 trying ~2147483048 trying 2147483049 trying ~2147483049 trying 2147483050 trying ~2147483050 trying 2147483051 trying ~2147483051 trying 2147483052 trying ~2147483052 trying 2147483053 trying ~2147483053 trying 2147483054 trying ~2147483054 trying 2147483055 trying ~2147483055 trying 2147483056 trying ~2147483056 trying 2147483057 trying ~2147483057 trying 2147483058 trying ~2147483058 trying 2147483059 trying ~2147483059 trying 2147483060 trying ~2147483060 trying 2147483061 trying ~2147483061 trying 2147483062 trying ~2147483062 trying 2147483063 trying ~2147483063 trying 2147483064 trying ~2147483064 trying 2147483065 trying ~2147483065 trying 2147483066 trying ~2147483066 trying 2147483067 trying ~2147483067 trying 2147483068 trying ~2147483068 trying 2147483069 trying ~2147483069 trying 2147483070 trying ~2147483070 trying 2147483071 trying ~2147483071 trying 2147483072 trying ~2147483072 trying 2147483073 trying ~2147483073 trying 2147483074 trying ~2147483074 trying 2147483075 trying ~2147483075 trying 2147483076 trying ~2147483076 trying 2147483077 trying ~2147483077 trying 2147483078 trying ~2147483078 trying 2147483079 trying ~2147483079 trying 2147483080 trying ~2147483080 trying 2147483081 trying ~2147483081 trying 2147483082 trying ~2147483082 trying 2147483083 trying ~2147483083 trying 2147483084 trying ~2147483084 trying 2147483085 trying ~2147483085 trying 2147483086 trying ~2147483086 trying 2147483087 trying ~2147483087 trying 2147483088 trying ~2147483088 trying 2147483089 trying ~2147483089 trying 2147483090 trying ~2147483090 trying 2147483091 trying ~2147483091 trying 2147483092 trying ~2147483092 trying 2147483093 trying ~2147483093 trying 2147483094 trying ~2147483094 trying 2147483095 trying ~2147483095 trying 2147483096 trying ~2147483096 trying 2147483097 trying ~2147483097 trying 2147483098 trying ~2147483098 trying 2147483099 trying ~2147483099 trying 2147483100 trying ~2147483100 trying 2147483101 trying ~2147483101 trying 2147483102 trying ~2147483102 trying 2147483103 trying ~2147483103 trying 2147483104 trying ~2147483104 trying 2147483105 trying ~2147483105 trying 2147483106 trying ~2147483106 trying 2147483107 trying ~2147483107 trying 2147483108 trying ~2147483108 trying 2147483109 trying ~2147483109 trying 2147483110 trying ~2147483110 trying 2147483111 trying ~2147483111 trying 2147483112 trying ~2147483112 trying 2147483113 trying ~2147483113 trying 2147483114 trying ~2147483114 trying 2147483115 trying ~2147483115 trying 2147483116 trying ~2147483116 trying 2147483117 trying ~2147483117 trying 2147483118 trying ~2147483118 trying 2147483119 trying ~2147483119 trying 2147483120 trying ~2147483120 trying 2147483121 trying ~2147483121 trying 2147483122 trying ~2147483122 trying 2147483123 trying ~2147483123 trying 2147483124 trying ~2147483124 trying 2147483125 trying ~2147483125 trying 2147483126 trying ~2147483126 trying 2147483127 trying ~2147483127 trying 2147483128 trying ~2147483128 trying 2147483129 trying ~2147483129 trying 2147483130 trying ~2147483130 trying 2147483131 trying ~2147483131 trying 2147483132 trying ~2147483132 trying 2147483133 trying ~2147483133 trying 2147483134 trying ~2147483134 trying 2147483135 trying ~2147483135 trying 2147483136 trying ~2147483136 trying 2147483137 trying ~2147483137 trying 2147483138 trying ~2147483138 trying 2147483139 trying ~2147483139 trying 2147483140 trying ~2147483140 trying 2147483141 trying ~2147483141 trying 2147483142 trying ~2147483142 trying 2147483143 trying ~2147483143 trying 2147483144 trying ~2147483144 trying 2147483145 trying ~2147483145 trying 2147483146 trying ~2147483146 trying 2147483147 trying ~2147483147 trying 2147483148 trying ~2147483148 trying 2147483149 trying ~2147483149 trying 2147483150 trying ~2147483150 trying 2147483151 trying ~2147483151 trying 2147483152 trying ~2147483152 trying 2147483153 trying ~2147483153 trying 2147483154 trying ~2147483154 trying 2147483155 trying ~2147483155 trying 2147483156 trying ~2147483156 trying 2147483157 trying ~2147483157 trying 2147483158 trying ~2147483158 trying 2147483159 trying ~2147483159 trying 2147483160 trying ~2147483160 trying 2147483161 trying ~2147483161 trying 2147483162 trying ~2147483162 trying 2147483163 trying ~2147483163 trying 2147483164 trying ~2147483164 trying 2147483165 trying ~2147483165 trying 2147483166 trying ~2147483166 trying 2147483167 trying ~2147483167 trying 2147483168 trying ~2147483168 trying 2147483169 trying ~2147483169 trying 2147483170 trying ~2147483170 trying 2147483171 trying ~2147483171 trying 2147483172 trying ~2147483172 trying 2147483173 trying ~2147483173 trying 2147483174 trying ~2147483174 trying 2147483175 trying ~2147483175 trying 2147483176 trying ~2147483176 trying 2147483177 trying ~2147483177 trying 2147483178 trying ~2147483178 trying 2147483179 trying ~2147483179 trying 2147483180 trying ~2147483180 trying 2147483181 trying ~2147483181 trying 2147483182 trying ~2147483182 trying 2147483183 trying ~2147483183 trying 2147483184 trying ~2147483184 trying 2147483185 trying ~2147483185 trying 2147483186 trying ~2147483186 trying 2147483187 trying ~2147483187 trying 2147483188 trying ~2147483188 trying 2147483189 trying ~2147483189 trying 2147483190 trying ~2147483190 trying 2147483191 trying ~2147483191 trying 2147483192 trying ~2147483192 trying 2147483193 trying ~2147483193 trying 2147483194 trying ~2147483194 trying 2147483195 trying ~2147483195 trying 2147483196 trying ~2147483196 trying 2147483197 trying ~2147483197 trying 2147483198 trying ~2147483198 trying 2147483199 trying ~2147483199 trying 2147483200 trying ~2147483200 trying 2147483201 trying ~2147483201 trying 2147483202 trying ~2147483202 trying 2147483203 trying ~2147483203 trying 2147483204 trying ~2147483204 trying 2147483205 trying ~2147483205 trying 2147483206 trying ~2147483206 trying 2147483207 trying ~2147483207 trying 2147483208 trying ~2147483208 trying 2147483209 trying ~2147483209 trying 2147483210 trying ~2147483210 trying 2147483211 trying ~2147483211 trying 2147483212 trying ~2147483212 trying 2147483213 trying ~2147483213 trying 2147483214 trying ~2147483214 trying 2147483215 trying ~2147483215 trying 2147483216 trying ~2147483216 trying 2147483217 trying ~2147483217 trying 2147483218 trying ~2147483218 trying 2147483219 trying ~2147483219 trying 2147483220 trying ~2147483220 trying 2147483221 trying ~2147483221 trying 2147483222 trying ~2147483222 trying 2147483223 trying ~2147483223 trying 2147483224 trying ~2147483224 trying 2147483225 trying ~2147483225 trying 2147483226 trying ~2147483226 trying 2147483227 trying ~2147483227 trying 2147483228 trying ~2147483228 trying 2147483229 trying ~2147483229 trying 2147483230 trying ~2147483230 trying 2147483231 trying ~2147483231 trying 2147483232 trying ~2147483232 trying 2147483233 trying ~2147483233 trying 2147483234 trying ~2147483234 trying 2147483235 trying ~2147483235 trying 2147483236 trying ~2147483236 trying 2147483237 trying ~2147483237 trying 2147483238 trying ~2147483238 trying 2147483239 trying ~2147483239 trying 2147483240 trying ~2147483240 trying 2147483241 trying ~2147483241 trying 2147483242 trying ~2147483242 trying 2147483243 trying ~2147483243 trying 2147483244 trying ~2147483244 trying 2147483245 trying ~2147483245 trying 2147483246 trying ~2147483246 trying 2147483247 trying ~2147483247 trying 2147483248 trying ~2147483248 trying 2147483249 trying ~2147483249 trying 2147483250 trying ~2147483250 trying 2147483251 trying ~2147483251 trying 2147483252 trying ~2147483252 trying 2147483253 trying ~2147483253 trying 2147483254 trying ~2147483254 trying 2147483255 trying ~2147483255 trying 2147483256 trying ~2147483256 trying 2147483257 trying ~2147483257 trying 2147483258 trying ~2147483258 trying 2147483259 trying ~2147483259 trying 2147483260 trying ~2147483260 trying 2147483261 trying ~2147483261 trying 2147483262 trying ~2147483262 trying 2147483263 trying ~2147483263 trying 2147483264 trying ~2147483264 trying 2147483265 trying ~2147483265 trying 2147483266 trying ~2147483266 trying 2147483267 trying ~2147483267 trying 2147483268 trying ~2147483268 trying 2147483269 trying ~2147483269 trying 2147483270 trying ~2147483270 trying 2147483271 trying ~2147483271 trying 2147483272 trying ~2147483272 trying 2147483273 trying ~2147483273 trying 2147483274 trying ~2147483274 trying 2147483275 trying ~2147483275 trying 2147483276 trying ~2147483276 trying 2147483277 trying ~2147483277 trying 2147483278 trying ~2147483278 trying 2147483279 trying ~2147483279 trying 2147483280 trying ~2147483280 trying 2147483281 trying ~2147483281 trying 2147483282 trying ~2147483282 trying 2147483283 trying ~2147483283 trying 2147483284 trying ~2147483284 trying 2147483285 trying ~2147483285 trying 2147483286 trying ~2147483286 trying 2147483287 trying ~2147483287 trying 2147483288 trying ~2147483288 trying 2147483289 trying ~2147483289 trying 2147483290 trying ~2147483290 trying 2147483291 trying ~2147483291 trying 2147483292 trying ~2147483292 trying 2147483293 trying ~2147483293 trying 2147483294 trying ~2147483294 trying 2147483295 trying ~2147483295 trying 2147483296 trying ~2147483296 trying 2147483297 trying ~2147483297 trying 2147483298 trying ~2147483298 trying 2147483299 trying ~2147483299 trying 2147483300 trying ~2147483300 trying 2147483301 trying ~2147483301 trying 2147483302 trying ~2147483302 trying 2147483303 trying ~2147483303 trying 2147483304 trying ~2147483304 trying 2147483305 trying ~2147483305 trying 2147483306 trying ~2147483306 trying 2147483307 trying ~2147483307 trying 2147483308 trying ~2147483308 trying 2147483309 trying ~2147483309 trying 2147483310 trying ~2147483310 trying 2147483311 trying ~2147483311 trying 2147483312 trying ~2147483312 trying 2147483313 trying ~2147483313 trying 2147483314 trying ~2147483314 trying 2147483315 trying ~2147483315 trying 2147483316 trying ~2147483316 trying 2147483317 trying ~2147483317 trying 2147483318 trying ~2147483318 trying 2147483319 trying ~2147483319 trying 2147483320 trying ~2147483320 trying 2147483321 trying ~2147483321 trying 2147483322 trying ~2147483322 trying 2147483323 trying ~2147483323 trying 2147483324 trying ~2147483324 trying 2147483325 trying ~2147483325 trying 2147483326 trying ~2147483326 trying 2147483327 trying ~2147483327 trying 2147483328 trying ~2147483328 trying 2147483329 trying ~2147483329 trying 2147483330 trying ~2147483330 trying 2147483331 trying ~2147483331 trying 2147483332 trying ~2147483332 trying 2147483333 trying ~2147483333 trying 2147483334 trying ~2147483334 trying 2147483335 trying ~2147483335 trying 2147483336 trying ~2147483336 trying 2147483337 trying ~2147483337 trying 2147483338 trying ~2147483338 trying 2147483339 trying ~2147483339 trying 2147483340 trying ~2147483340 trying 2147483341 trying ~2147483341 trying 2147483342 trying ~2147483342 trying 2147483343 trying ~2147483343 trying 2147483344 trying ~2147483344 trying 2147483345 trying ~2147483345 trying 2147483346 trying ~2147483346 trying 2147483347 trying ~2147483347 trying 2147483348 trying ~2147483348 trying 2147483349 trying ~2147483349 trying 2147483350 trying ~2147483350 trying 2147483351 trying ~2147483351 trying 2147483352 trying ~2147483352 trying 2147483353 trying ~2147483353 trying 2147483354 trying ~2147483354 trying 2147483355 trying ~2147483355 trying 2147483356 trying ~2147483356 trying 2147483357 trying ~2147483357 trying 2147483358 trying ~2147483358 trying 2147483359 trying ~2147483359 trying 2147483360 trying ~2147483360 trying 2147483361 trying ~2147483361 trying 2147483362 trying ~2147483362 trying 2147483363 trying ~2147483363 trying 2147483364 trying ~2147483364 trying 2147483365 trying ~2147483365 trying 2147483366 trying ~2147483366 trying 2147483367 trying ~2147483367 trying 2147483368 trying ~2147483368 trying 2147483369 trying ~2147483369 trying 2147483370 trying ~2147483370 trying 2147483371 trying ~2147483371 trying 2147483372 trying ~2147483372 trying 2147483373 trying ~2147483373 trying 2147483374 trying ~2147483374 trying 2147483375 trying ~2147483375 trying 2147483376 trying ~2147483376 trying 2147483377 trying ~2147483377 trying 2147483378 trying ~2147483378 trying 2147483379 trying ~2147483379 trying 2147483380 trying ~2147483380 trying 2147483381 trying ~2147483381 trying 2147483382 trying ~2147483382 trying 2147483383 trying ~2147483383 trying 2147483384 trying ~2147483384 trying 2147483385 trying ~2147483385 trying 2147483386 trying ~2147483386 trying 2147483387 trying ~2147483387 trying 2147483388 trying ~2147483388 trying 2147483389 trying ~2147483389 trying 2147483390 trying ~2147483390 trying 2147483391 trying ~2147483391 trying 2147483392 trying ~2147483392 trying 2147483393 trying ~2147483393 trying 2147483394 trying ~2147483394 trying 2147483395 trying ~2147483395 trying 2147483396 trying ~2147483396 trying 2147483397 trying ~2147483397 trying 2147483398 trying ~2147483398 trying 2147483399 trying ~2147483399 trying 2147483400 trying ~2147483400 trying 2147483401 trying ~2147483401 trying 2147483402 trying ~2147483402 trying 2147483403 trying ~2147483403 trying 2147483404 trying ~2147483404 trying 2147483405 trying ~2147483405 trying 2147483406 trying ~2147483406 trying 2147483407 trying ~2147483407 trying 2147483408 trying ~2147483408 trying 2147483409 trying ~2147483409 trying 2147483410 trying ~2147483410 trying 2147483411 trying ~2147483411 trying 2147483412 trying ~2147483412 trying 2147483413 trying ~2147483413 trying 2147483414 trying ~2147483414 trying 2147483415 trying ~2147483415 trying 2147483416 trying ~2147483416 trying 2147483417 trying ~2147483417 trying 2147483418 trying ~2147483418 trying 2147483419 trying ~2147483419 trying 2147483420 trying ~2147483420 trying 2147483421 trying ~2147483421 trying 2147483422 trying ~2147483422 trying 2147483423 trying ~2147483423 trying 2147483424 trying ~2147483424 trying 2147483425 trying ~2147483425 trying 2147483426 trying ~2147483426 trying 2147483427 trying ~2147483427 trying 2147483428 trying ~2147483428 trying 2147483429 trying ~2147483429 trying 2147483430 trying ~2147483430 trying 2147483431 trying ~2147483431 trying 2147483432 trying ~2147483432 trying 2147483433 trying ~2147483433 trying 2147483434 trying ~2147483434 trying 2147483435 trying ~2147483435 trying 2147483436 trying ~2147483436 trying 2147483437 trying ~2147483437 trying 2147483438 trying ~2147483438 trying 2147483439 trying ~2147483439 trying 2147483440 trying ~2147483440 trying 2147483441 trying ~2147483441 trying 2147483442 trying ~2147483442 trying 2147483443 trying ~2147483443 trying 2147483444 trying ~2147483444 trying 2147483445 trying ~2147483445 trying 2147483446 trying ~2147483446 trying 2147483447 trying ~2147483447 trying 2147483448 trying ~2147483448 trying 2147483449 trying ~2147483449 trying 2147483450 trying ~2147483450 trying 2147483451 trying ~2147483451 trying 2147483452 trying ~2147483452 trying 2147483453 trying ~2147483453 trying 2147483454 trying ~2147483454 trying 2147483455 trying ~2147483455 trying 2147483456 trying ~2147483456 trying 2147483457 trying ~2147483457 trying 2147483458 trying ~2147483458 trying 2147483459 trying ~2147483459 trying 2147483460 trying ~2147483460 trying 2147483461 trying ~2147483461 trying 2147483462 trying ~2147483462 trying 2147483463 trying ~2147483463 trying 2147483464 trying ~2147483464 trying 2147483465 trying ~2147483465 trying 2147483466 trying ~2147483466 trying 2147483467 trying ~2147483467 trying 2147483468 trying ~2147483468 trying 2147483469 trying ~2147483469 trying 2147483470 trying ~2147483470 trying 2147483471 trying ~2147483471 trying 2147483472 trying ~2147483472 trying 2147483473 trying ~2147483473 trying 2147483474 trying ~2147483474 trying 2147483475 trying ~2147483475 trying 2147483476 trying ~2147483476 trying 2147483477 trying ~2147483477 trying 2147483478 trying ~2147483478 trying 2147483479 trying ~2147483479 trying 2147483480 trying ~2147483480 trying 2147483481 trying ~2147483481 trying 2147483482 trying ~2147483482 trying 2147483483 trying ~2147483483 trying 2147483484 trying ~2147483484 trying 2147483485 trying ~2147483485 trying 2147483486 trying ~2147483486 trying 2147483487 trying ~2147483487 trying 2147483488 trying ~2147483488 trying 2147483489 trying ~2147483489 trying 2147483490 trying ~2147483490 trying 2147483491 trying ~2147483491 trying 2147483492 trying ~2147483492 trying 2147483493 trying ~2147483493 trying 2147483494 trying ~2147483494 trying 2147483495 trying ~2147483495 trying 2147483496 trying ~2147483496 trying 2147483497 trying ~2147483497 trying 2147483498 trying ~2147483498 trying 2147483499 trying ~2147483499 trying 2147483500 trying ~2147483500 trying 2147483501 trying ~2147483501 trying 2147483502 trying ~2147483502 trying 2147483503 trying ~2147483503 trying 2147483504 trying ~2147483504 trying 2147483505 trying ~2147483505 trying 2147483506 trying ~2147483506 trying 2147483507 trying ~2147483507 trying 2147483508 trying ~2147483508 trying 2147483509 trying ~2147483509 trying 2147483510 trying ~2147483510 trying 2147483511 trying ~2147483511 trying 2147483512 trying ~2147483512 trying 2147483513 trying ~2147483513 trying 2147483514 trying ~2147483514 trying 2147483515 trying ~2147483515 trying 2147483516 trying ~2147483516 trying 2147483517 trying ~2147483517 trying 2147483518 trying ~2147483518 trying 2147483519 trying ~2147483519 trying 2147483520 trying ~2147483520 trying 2147483521 trying ~2147483521 trying 2147483522 trying ~2147483522 trying 2147483523 trying ~2147483523 trying 2147483524 trying ~2147483524 trying 2147483525 trying ~2147483525 trying 2147483526 trying ~2147483526 trying 2147483527 trying ~2147483527 trying 2147483528 trying ~2147483528 trying 2147483529 trying ~2147483529 trying 2147483530 trying ~2147483530 trying 2147483531 trying ~2147483531 trying 2147483532 trying ~2147483532 trying 2147483533 trying ~2147483533 trying 2147483534 trying ~2147483534 trying 2147483535 trying ~2147483535 trying 2147483536 trying ~2147483536 trying 2147483537 trying ~2147483537 trying 2147483538 trying ~2147483538 trying 2147483539 trying ~2147483539 trying 2147483540 trying ~2147483540 trying 2147483541 trying ~2147483541 trying 2147483542 trying ~2147483542 trying 2147483543 trying ~2147483543 trying 2147483544 trying ~2147483544 trying 2147483545 trying ~2147483545 trying 2147483546 trying ~2147483546 trying 2147483547 trying ~2147483547 trying 2147483548 trying ~2147483548 trying 2147483549 trying ~2147483549 trying 2147483550 trying ~2147483550 trying 2147483551 trying ~2147483551 trying 2147483552 trying ~2147483552 trying 2147483553 trying ~2147483553 trying 2147483554 trying ~2147483554 trying 2147483555 trying ~2147483555 trying 2147483556 trying ~2147483556 trying 2147483557 trying ~2147483557 trying 2147483558 trying ~2147483558 trying 2147483559 trying ~2147483559 trying 2147483560 trying ~2147483560 trying 2147483561 trying ~2147483561 trying 2147483562 trying ~2147483562 trying 2147483563 trying ~2147483563 trying 2147483564 trying ~2147483564 trying 2147483565 trying ~2147483565 trying 2147483566 trying ~2147483566 trying 2147483567 trying ~2147483567 trying 2147483568 trying ~2147483568 trying 2147483569 trying ~2147483569 trying 2147483570 trying ~2147483570 trying 2147483571 trying ~2147483571 trying 2147483572 trying ~2147483572 trying 2147483573 trying ~2147483573 trying 2147483574 trying ~2147483574 trying 2147483575 trying ~2147483575 trying 2147483576 trying ~2147483576 trying 2147483577 trying ~2147483577 trying 2147483578 trying ~2147483578 trying 2147483579 trying ~2147483579 trying 2147483580 trying ~2147483580 trying 2147483581 trying ~2147483581 trying 2147483582 trying ~2147483582 trying 2147483583 trying ~2147483583 trying 2147483584 trying ~2147483584 trying 2147483585 trying ~2147483585 trying 2147483586 trying ~2147483586 trying 2147483587 trying ~2147483587 trying 2147483588 trying ~2147483588 trying 2147483589 trying ~2147483589 trying 2147483590 trying ~2147483590 trying 2147483591 trying ~2147483591 trying 2147483592 trying ~2147483592 trying 2147483593 trying ~2147483593 trying 2147483594 trying ~2147483594 trying 2147483595 trying ~2147483595 trying 2147483596 trying ~2147483596 trying 2147483597 trying ~2147483597 trying 2147483598 trying ~2147483598 trying 2147483599 trying ~2147483599 trying 2147483600 trying ~2147483600 trying 2147483601 trying ~2147483601 trying 2147483602 trying ~2147483602 trying 2147483603 trying ~2147483603 trying 2147483604 trying ~2147483604 trying 2147483605 trying ~2147483605 trying 2147483606 trying ~2147483606 trying 2147483607 trying ~2147483607 trying 2147483608 trying ~2147483608 trying 2147483609 trying ~2147483609 trying 2147483610 trying ~2147483610 trying 2147483611 trying ~2147483611 trying 2147483612 trying ~2147483612 trying 2147483613 trying ~2147483613 trying 2147483614 trying ~2147483614 trying 2147483615 trying ~2147483615 trying 2147483616 trying ~2147483616 trying 2147483617 trying ~2147483617 trying 2147483618 trying ~2147483618 trying 2147483619 trying ~2147483619 trying 2147483620 trying ~2147483620 trying 2147483621 trying ~2147483621 trying 2147483622 trying ~2147483622 trying 2147483623 trying ~2147483623 trying 2147483624 trying ~2147483624 trying 2147483625 trying ~2147483625 trying 2147483626 trying ~2147483626 trying 2147483627 trying ~2147483627 trying 2147483628 trying ~2147483628 trying 2147483629 trying ~2147483629 trying 2147483630 trying ~2147483630 trying 2147483631 trying ~2147483631 trying 2147483632 trying ~2147483632 trying 2147483633 trying ~2147483633 trying 2147483634 trying ~2147483634 trying 2147483635 trying ~2147483635 trying 2147483636 trying ~2147483636 trying 2147483637 trying ~2147483637 trying 2147483638 trying ~2147483638 trying 2147483639 trying ~2147483639 trying 2147483640 trying ~2147483640 trying 2147483641 trying ~2147483641 trying 2147483642 trying ~2147483642 trying 2147483643 trying ~2147483643 trying 2147483644 trying ~2147483644 trying 2147483645 trying ~2147483645 trying 2147483646 trying ~2147483646 trying 2147483647 trying ~2147483647 trying 2147483648 trying ~2147483648 trying 2147483649 trying ~2147483649 trying 2147483650 trying ~2147483650 trying 2147483651 trying ~2147483651 trying 2147483652 trying ~2147483652 trying 2147483653 trying ~2147483653 trying 2147483654 trying ~2147483654 trying 2147483655 trying ~2147483655 trying 2147483656 trying ~2147483656 trying 2147483657 trying ~2147483657 trying 2147483658 trying ~2147483658 trying 2147483659 trying ~2147483659 trying 2147483660 trying ~2147483660 trying 2147483661 trying ~2147483661 trying 2147483662 trying ~2147483662 trying 2147483663 trying ~2147483663 trying 2147483664 trying ~2147483664 trying 2147483665 trying ~2147483665 trying 2147483666 trying ~2147483666 trying 2147483667 trying ~2147483667 trying 2147483668 trying ~2147483668 trying 2147483669 trying ~2147483669 trying 2147483670 trying ~2147483670 trying 2147483671 trying ~2147483671 trying 2147483672 trying ~2147483672 trying 2147483673 trying ~2147483673 trying 2147483674 trying ~2147483674 trying 2147483675 trying ~2147483675 trying 2147483676 trying ~2147483676 trying 2147483677 trying ~2147483677 trying 2147483678 trying ~2147483678 trying 2147483679 trying ~2147483679 trying 2147483680 trying ~2147483680 trying 2147483681 trying ~2147483681 trying 2147483682 trying ~2147483682 trying 2147483683 trying ~2147483683 trying 2147483684 trying ~2147483684 trying 2147483685 trying ~2147483685 trying 2147483686 trying ~2147483686 trying 2147483687 trying ~2147483687 trying 2147483688 trying ~2147483688 trying 2147483689 trying ~2147483689 trying 2147483690 trying ~2147483690 trying 2147483691 trying ~2147483691 trying 2147483692 trying ~2147483692 trying 2147483693 trying ~2147483693 trying 2147483694 trying ~2147483694 trying 2147483695 trying ~2147483695 trying 2147483696 trying ~2147483696 trying 2147483697 trying ~2147483697 trying 2147483698 trying ~2147483698 trying 2147483699 trying ~2147483699 trying 2147483700 trying ~2147483700 trying 2147483701 trying ~2147483701 trying 2147483702 trying ~2147483702 trying 2147483703 trying ~2147483703 trying 2147483704 trying ~2147483704 trying 2147483705 trying ~2147483705 trying 2147483706 trying ~2147483706 trying 2147483707 trying ~2147483707 trying 2147483708 trying ~2147483708 trying 2147483709 trying ~2147483709 trying 2147483710 trying ~2147483710 trying 2147483711 trying ~2147483711 trying 2147483712 trying ~2147483712 trying 2147483713 trying ~2147483713 trying 2147483714 trying ~2147483714 trying 2147483715 trying ~2147483715 trying 2147483716 trying ~2147483716 trying 2147483717 trying ~2147483717 trying 2147483718 trying ~2147483718 trying 2147483719 trying ~2147483719 trying 2147483720 trying ~2147483720 trying 2147483721 trying ~2147483721 trying 2147483722 trying ~2147483722 trying 2147483723 trying ~2147483723 trying 2147483724 trying ~2147483724 trying 2147483725 trying ~2147483725 trying 2147483726 trying ~2147483726 trying 2147483727 trying ~2147483727 trying 2147483728 trying ~2147483728 trying 2147483729 trying ~2147483729 trying 2147483730 trying ~2147483730 trying 2147483731 trying ~2147483731 trying 2147483732 trying ~2147483732 trying 2147483733 trying ~2147483733 trying 2147483734 trying ~2147483734 trying 2147483735 trying ~2147483735 trying 2147483736 trying ~2147483736 trying 2147483737 trying ~2147483737 trying 2147483738 trying ~2147483738 trying 2147483739 trying ~2147483739 trying 2147483740 trying ~2147483740 trying 2147483741 trying ~2147483741 trying 2147483742 trying ~2147483742 trying 2147483743 trying ~2147483743 trying 2147483744 trying ~2147483744 trying 2147483745 trying ~2147483745 trying 2147483746 trying ~2147483746 trying 2147483747 trying ~2147483747 trying 2147483748 trying ~2147483748 trying 2147483749 trying ~2147483749 trying 2147483750 trying ~2147483750 trying 2147483751 trying ~2147483751 trying 2147483752 trying ~2147483752 trying 2147483753 trying ~2147483753 trying 2147483754 trying ~2147483754 trying 2147483755 trying ~2147483755 trying 2147483756 trying ~2147483756 trying 2147483757 trying ~2147483757 trying 2147483758 trying ~2147483758 trying 2147483759 trying ~2147483759 trying 2147483760 trying ~2147483760 trying 2147483761 trying ~2147483761 trying 2147483762 trying ~2147483762 trying 2147483763 trying ~2147483763 trying 2147483764 trying ~2147483764 trying 2147483765 trying ~2147483765 trying 2147483766 trying ~2147483766 trying 2147483767 trying ~2147483767 trying 2147483768 trying ~2147483768 trying 2147483769 trying ~2147483769 trying 2147483770 trying ~2147483770 trying 2147483771 trying ~2147483771 trying 2147483772 trying ~2147483772 trying 2147483773 trying ~2147483773 trying 2147483774 trying ~2147483774 trying 2147483775 trying ~2147483775 trying 2147483776 trying ~2147483776 trying 2147483777 trying ~2147483777 trying 2147483778 trying ~2147483778 trying 2147483779 trying ~2147483779 trying 2147483780 trying ~2147483780 trying 2147483781 trying ~2147483781 trying 2147483782 trying ~2147483782 trying 2147483783 trying ~2147483783 trying 2147483784 trying ~2147483784 trying 2147483785 trying ~2147483785 trying 2147483786 trying ~2147483786 trying 2147483787 trying ~2147483787 trying 2147483788 trying ~2147483788 trying 2147483789 trying ~2147483789 trying 2147483790 trying ~2147483790 trying 2147483791 trying ~2147483791 trying 2147483792 trying ~2147483792 trying 2147483793 trying ~2147483793 trying 2147483794 trying ~2147483794 trying 2147483795 trying ~2147483795 trying 2147483796 trying ~2147483796 trying 2147483797 trying ~2147483797 trying 2147483798 trying ~2147483798 trying 2147483799 trying ~2147483799 trying 2147483800 trying ~2147483800 trying 2147483801 trying ~2147483801 trying 2147483802 trying ~2147483802 trying 2147483803 trying ~2147483803 trying 2147483804 trying ~2147483804 trying 2147483805 trying ~2147483805 trying 2147483806 trying ~2147483806 trying 2147483807 trying ~2147483807 trying 2147483808 trying ~2147483808 trying 2147483809 trying ~2147483809 trying 2147483810 trying ~2147483810 trying 2147483811 trying ~2147483811 trying 2147483812 trying ~2147483812 trying 2147483813 trying ~2147483813 trying 2147483814 trying ~2147483814 trying 2147483815 trying ~2147483815 trying 2147483816 trying ~2147483816 trying 2147483817 trying ~2147483817 trying 2147483818 trying ~2147483818 trying 2147483819 trying ~2147483819 trying 2147483820 trying ~2147483820 trying 2147483821 trying ~2147483821 trying 2147483822 trying ~2147483822 trying 2147483823 trying ~2147483823 trying 2147483824 trying ~2147483824 trying 2147483825 trying ~2147483825 trying 2147483826 trying ~2147483826 trying 2147483827 trying ~2147483827 trying 2147483828 trying ~2147483828 trying 2147483829 trying ~2147483829 trying 2147483830 trying ~2147483830 trying 2147483831 trying ~2147483831 trying 2147483832 trying ~2147483832 trying 2147483833 trying ~2147483833 trying 2147483834 trying ~2147483834 trying 2147483835 trying ~2147483835 trying 2147483836 trying ~2147483836 trying 2147483837 trying ~2147483837 trying 2147483838 trying ~2147483838 trying 2147483839 trying ~2147483839 trying 2147483840 trying ~2147483840 trying 2147483841 trying ~2147483841 trying 2147483842 trying ~2147483842 trying 2147483843 trying ~2147483843 trying 2147483844 trying ~2147483844 trying 2147483845 trying ~2147483845 trying 2147483846 trying ~2147483846 trying 2147483847 trying ~2147483847 trying 2147483848 trying ~2147483848 trying 2147483849 trying ~2147483849 trying 2147483850 trying ~2147483850 trying 2147483851 trying ~2147483851 trying 2147483852 trying ~2147483852 trying 2147483853 trying ~2147483853 trying 2147483854 trying ~2147483854 trying 2147483855 trying ~2147483855 trying 2147483856 trying ~2147483856 trying 2147483857 trying ~2147483857 trying 2147483858 trying ~2147483858 trying 2147483859 trying ~2147483859 trying 2147483860 trying ~2147483860 trying 2147483861 trying ~2147483861 trying 2147483862 trying ~2147483862 trying 2147483863 trying ~2147483863 trying 2147483864 trying ~2147483864 trying 2147483865 trying ~2147483865 trying 2147483866 trying ~2147483866 trying 2147483867 trying ~2147483867 trying 2147483868 trying ~2147483868 trying 2147483869 trying ~2147483869 trying 2147483870 trying ~2147483870 trying 2147483871 trying ~2147483871 trying 2147483872 trying ~2147483872 trying 2147483873 trying ~2147483873 trying 2147483874 trying ~2147483874 trying 2147483875 trying ~2147483875 trying 2147483876 trying ~2147483876 trying 2147483877 trying ~2147483877 trying 2147483878 trying ~2147483878 trying 2147483879 trying ~2147483879 trying 2147483880 trying ~2147483880 trying 2147483881 trying ~2147483881 trying 2147483882 trying ~2147483882 trying 2147483883 trying ~2147483883 trying 2147483884 trying ~2147483884 trying 2147483885 trying ~2147483885 trying 2147483886 trying ~2147483886 trying 2147483887 trying ~2147483887 trying 2147483888 trying ~2147483888 trying 2147483889 trying ~2147483889 trying 2147483890 trying ~2147483890 trying 2147483891 trying ~2147483891 trying 2147483892 trying ~2147483892 trying 2147483893 trying ~2147483893 trying 2147483894 trying ~2147483894 trying 2147483895 trying ~2147483895 trying 2147483896 trying ~2147483896 trying 2147483897 trying ~2147483897 trying 2147483898 trying ~2147483898 trying 2147483899 trying ~2147483899 trying 2147483900 trying ~2147483900 trying 2147483901 trying ~2147483901 trying 2147483902 trying ~2147483902 trying 2147483903 trying ~2147483903 trying 2147483904 trying ~2147483904 trying 2147483905 trying ~2147483905 trying 2147483906 trying ~2147483906 trying 2147483907 trying ~2147483907 trying 2147483908 trying ~2147483908 trying 2147483909 trying ~2147483909 trying 2147483910 trying ~2147483910 trying 2147483911 trying ~2147483911 trying 2147483912 trying ~2147483912 trying 2147483913 trying ~2147483913 trying 2147483914 trying ~2147483914 trying 2147483915 trying ~2147483915 trying 2147483916 trying ~2147483916 trying 2147483917 trying ~2147483917 trying 2147483918 trying ~2147483918 trying 2147483919 trying ~2147483919 trying 2147483920 trying ~2147483920 trying 2147483921 trying ~2147483921 trying 2147483922 trying ~2147483922 trying 2147483923 trying ~2147483923 trying 2147483924 trying ~2147483924 trying 2147483925 trying ~2147483925 trying 2147483926 trying ~2147483926 trying 2147483927 trying ~2147483927 trying 2147483928 trying ~2147483928 trying 2147483929 trying ~2147483929 trying 2147483930 trying ~2147483930 trying 2147483931 trying ~2147483931 trying 2147483932 trying ~2147483932 trying 2147483933 trying ~2147483933 trying 2147483934 trying ~2147483934 trying 2147483935 trying ~2147483935 trying 2147483936 trying ~2147483936 trying 2147483937 trying ~2147483937 trying 2147483938 trying ~2147483938 trying 2147483939 trying ~2147483939 trying 2147483940 trying ~2147483940 trying 2147483941 trying ~2147483941 trying 2147483942 trying ~2147483942 trying 2147483943 trying ~2147483943 trying 2147483944 trying ~2147483944 trying 2147483945 trying ~2147483945 trying 2147483946 trying ~2147483946 trying 2147483947 trying ~2147483947 trying 2147483948 trying ~2147483948 trying 2147483949 trying ~2147483949 trying 2147483950 trying ~2147483950 trying 2147483951 trying ~2147483951 trying 2147483952 trying ~2147483952 trying 2147483953 trying ~2147483953 trying 2147483954 trying ~2147483954 trying 2147483955 trying ~2147483955 trying 2147483956 trying ~2147483956 trying 2147483957 trying ~2147483957 trying 2147483958 trying ~2147483958 trying 2147483959 trying ~2147483959 trying 2147483960 trying ~2147483960 trying 2147483961 trying ~2147483961 trying 2147483962 trying ~2147483962 trying 2147483963 trying ~2147483963 trying 2147483964 trying ~2147483964 trying 2147483965 trying ~2147483965 trying 2147483966 trying ~2147483966 trying 2147483967 trying ~2147483967 trying 2147483968 trying ~2147483968 trying 2147483969 trying ~2147483969 trying 2147483970 trying ~2147483970 trying 2147483971 trying ~2147483971 trying 2147483972 trying ~2147483972 trying 2147483973 trying ~2147483973 trying 2147483974 trying ~2147483974 trying 2147483975 trying ~2147483975 trying 2147483976 trying ~2147483976 trying 2147483977 trying ~2147483977 trying 2147483978 trying ~2147483978 trying 2147483979 trying ~2147483979 trying 2147483980 trying ~2147483980 trying 2147483981 trying ~2147483981 trying 2147483982 trying ~2147483982 trying 2147483983 trying ~2147483983 trying 2147483984 trying ~2147483984 trying 2147483985 trying ~2147483985 trying 2147483986 trying ~2147483986 trying 2147483987 trying ~2147483987 trying 2147483988 trying ~2147483988 trying 2147483989 trying ~2147483989 trying 2147483990 trying ~2147483990 trying 2147483991 trying ~2147483991 trying 2147483992 trying ~2147483992 trying 2147483993 trying ~2147483993 trying 2147483994 trying ~2147483994 trying 2147483995 trying ~2147483995 trying 2147483996 trying ~2147483996 trying 2147483997 trying ~2147483997 trying 2147483998 trying ~2147483998 trying 2147483999 trying ~2147483999 trying 2147484000 trying ~2147484000 trying 2147484001 trying ~2147484001 trying 2147484002 trying ~2147484002 trying 2147484003 trying ~2147484003 trying 2147484004 trying ~2147484004 trying 2147484005 trying ~2147484005 trying 2147484006 trying ~2147484006 trying 2147484007 trying ~2147484007 trying 2147484008 trying ~2147484008 trying 2147484009 trying ~2147484009 trying 2147484010 trying ~2147484010 trying 2147484011 trying ~2147484011 trying 2147484012 trying ~2147484012 trying 2147484013 trying ~2147484013 trying 2147484014 trying ~2147484014 trying 2147484015 trying ~2147484015 trying 2147484016 trying ~2147484016 trying 2147484017 trying ~2147484017 trying 2147484018 trying ~2147484018 trying 2147484019 trying ~2147484019 trying 2147484020 trying ~2147484020 trying 2147484021 trying ~2147484021 trying 2147484022 trying ~2147484022 trying 2147484023 trying ~2147484023 trying 2147484024 trying ~2147484024 trying 2147484025 trying ~2147484025 trying 2147484026 trying ~2147484026 trying 2147484027 trying ~2147484027 trying 2147484028 trying ~2147484028 trying 2147484029 trying ~2147484029 trying 2147484030 trying ~2147484030 trying 2147484031 trying ~2147484031 trying 2147484032 trying ~2147484032 trying 2147484033 trying ~2147484033 trying 2147484034 trying ~2147484034 trying 2147484035 trying ~2147484035 trying 2147484036 trying ~2147484036 trying 2147484037 trying ~2147484037 trying 2147484038 trying ~2147484038 trying 2147484039 trying ~2147484039 trying 2147484040 trying ~2147484040 trying 2147484041 trying ~2147484041 trying 2147484042 trying ~2147484042 trying 2147484043 trying ~2147484043 trying 2147484044 trying ~2147484044 trying 2147484045 trying ~2147484045 trying 2147484046 trying ~2147484046 trying 2147484047 trying ~2147484047 trying 2147484048 trying ~2147484048 trying 2147484049 trying ~2147484049 trying 2147484050 trying ~2147484050 trying 2147484051 trying ~2147484051 trying 2147484052 trying ~2147484052 trying 2147484053 trying ~2147484053 trying 2147484054 trying ~2147484054 trying 2147484055 trying ~2147484055 trying 2147484056 trying ~2147484056 trying 2147484057 trying ~2147484057 trying 2147484058 trying ~2147484058 trying 2147484059 trying ~2147484059 trying 2147484060 trying ~2147484060 trying 2147484061 trying ~2147484061 trying 2147484062 trying ~2147484062 trying 2147484063 trying ~2147484063 trying 2147484064 trying ~2147484064 trying 2147484065 trying ~2147484065 trying 2147484066 trying ~2147484066 trying 2147484067 trying ~2147484067 trying 2147484068 trying ~2147484068 trying 2147484069 trying ~2147484069 trying 2147484070 trying ~2147484070 trying 2147484071 trying ~2147484071 trying 2147484072 trying ~2147484072 trying 2147484073 trying ~2147484073 trying 2147484074 trying ~2147484074 trying 2147484075 trying ~2147484075 trying 2147484076 trying ~2147484076 trying 2147484077 trying ~2147484077 trying 2147484078 trying ~2147484078 trying 2147484079 trying ~2147484079 trying 2147484080 trying ~2147484080 trying 2147484081 trying ~2147484081 trying 2147484082 trying ~2147484082 trying 2147484083 trying ~2147484083 trying 2147484084 trying ~2147484084 trying 2147484085 trying ~2147484085 trying 2147484086 trying ~2147484086 trying 2147484087 trying ~2147484087 trying 2147484088 trying ~2147484088 trying 2147484089 trying ~2147484089 trying 2147484090 trying ~2147484090 trying 2147484091 trying ~2147484091 trying 2147484092 trying ~2147484092 trying 2147484093 trying ~2147484093 trying 2147484094 trying ~2147484094 trying 2147484095 trying ~2147484095 trying 2147484096 trying ~2147484096 trying 2147484097 trying ~2147484097 trying 2147484098 trying ~2147484098 trying 2147484099 trying ~2147484099 trying 2147484100 trying ~2147484100 trying 2147484101 trying ~2147484101 trying 2147484102 trying ~2147484102 trying 2147484103 trying ~2147484103 trying 2147484104 trying ~2147484104 trying 2147484105 trying ~2147484105 trying 2147484106 trying ~2147484106 trying 2147484107 trying ~2147484107 trying 2147484108 trying ~2147484108 trying 2147484109 trying ~2147484109 trying 2147484110 trying ~2147484110 trying 2147484111 trying ~2147484111 trying 2147484112 trying ~2147484112 trying 2147484113 trying ~2147484113 trying 2147484114 trying ~2147484114 trying 2147484115 trying ~2147484115 trying 2147484116 trying ~2147484116 trying 2147484117 trying ~2147484117 trying 2147484118 trying ~2147484118 trying 2147484119 trying ~2147484119 trying 2147484120 trying ~2147484120 trying 2147484121 trying ~2147484121 trying 2147484122 trying ~2147484122 trying 2147484123 trying ~2147484123 trying 2147484124 trying ~2147484124 trying 2147484125 trying ~2147484125 trying 2147484126 trying ~2147484126 trying 2147484127 trying ~2147484127 trying 2147484128 trying ~2147484128 trying 2147484129 trying ~2147484129 trying 2147484130 trying ~2147484130 trying 2147484131 trying ~2147484131 trying 2147484132 trying ~2147484132 trying 2147484133 trying ~2147484133 trying 2147484134 trying ~2147484134 trying 2147484135 trying ~2147484135 trying 2147484136 trying ~2147484136 trying 2147484137 trying ~2147484137 trying 2147484138 trying ~2147484138 trying 2147484139 trying ~2147484139 trying 2147484140 trying ~2147484140 trying 2147484141 trying ~2147484141 trying 2147484142 trying ~2147484142 trying 2147484143 trying ~2147484143 trying 2147484144 trying ~2147484144 trying 2147484145 trying ~2147484145 trying 2147484146 trying ~2147484146 trying 2147484147 trying ~2147484147 trying 2147484148 trying ~2147484148 trying 2147484149 trying ~2147484149 trying 2147484150 trying ~2147484150 trying 2147484151 trying ~2147484151 trying 2147484152 trying ~2147484152 trying 2147484153 trying ~2147484153 trying 2147484154 trying ~2147484154 trying 2147484155 trying ~2147484155 trying 2147484156 trying ~2147484156 trying 2147484157 trying ~2147484157 trying 2147484158 trying ~2147484158 trying 2147484159 trying ~2147484159 trying 2147484160 trying ~2147484160 trying 2147484161 trying ~2147484161 trying 2147484162 trying ~2147484162 trying 2147484163 trying ~2147484163 trying 2147484164 trying ~2147484164 trying 2147484165 trying ~2147484165 trying 2147484166 trying ~2147484166 trying 2147484167 trying ~2147484167 trying 2147484168 trying ~2147484168 trying 2147484169 trying ~2147484169 trying 2147484170 trying ~2147484170 trying 2147484171 trying ~2147484171 trying 2147484172 trying ~2147484172 trying 2147484173 trying ~2147484173 trying 2147484174 trying ~2147484174 trying 2147484175 trying ~2147484175 trying 2147484176 trying ~2147484176 trying 2147484177 trying ~2147484177 trying 2147484178 trying ~2147484178 trying 2147484179 trying ~2147484179 trying 2147484180 trying ~2147484180 trying 2147484181 trying ~2147484181 trying 2147484182 trying ~2147484182 trying 2147484183 trying ~2147484183 trying 2147484184 trying ~2147484184 trying 2147484185 trying ~2147484185 trying 2147484186 trying ~2147484186 trying 2147484187 trying ~2147484187 trying 2147484188 trying ~2147484188 trying 2147484189 trying ~2147484189 trying 2147484190 trying ~2147484190 trying 2147484191 trying ~2147484191 trying 2147484192 trying ~2147484192 trying 2147484193 trying ~2147484193 trying 2147484194 trying ~2147484194 trying 2147484195 trying ~2147484195 trying 2147484196 trying ~2147484196 trying 2147484197 trying ~2147484197 trying 2147484198 trying ~2147484198 trying 2147484199 trying ~2147484199 trying 2147484200 trying ~2147484200 trying 2147484201 trying ~2147484201 trying 2147484202 trying ~2147484202 trying 2147484203 trying ~2147484203 trying 2147484204 trying ~2147484204 trying 2147484205 trying ~2147484205 trying 2147484206 trying ~2147484206 trying 2147484207 trying ~2147484207 trying 2147484208 trying ~2147484208 trying 2147484209 trying ~2147484209 trying 2147484210 trying ~2147484210 trying 2147484211 trying ~2147484211 trying 2147484212 trying ~2147484212 trying 2147484213 trying ~2147484213 trying 2147484214 trying ~2147484214 trying 2147484215 trying ~2147484215 trying 2147484216 trying ~2147484216 trying 2147484217 trying ~2147484217 trying 2147484218 trying ~2147484218 trying 2147484219 trying ~2147484219 trying 2147484220 trying ~2147484220 trying 2147484221 trying ~2147484221 trying 2147484222 trying ~2147484222 trying 2147484223 trying ~2147484223 trying 2147484224 trying ~2147484224 trying 2147484225 trying ~2147484225 trying 2147484226 trying ~2147484226 trying 2147484227 trying ~2147484227 trying 2147484228 trying ~2147484228 trying 2147484229 trying ~2147484229 trying 2147484230 trying ~2147484230 trying 2147484231 trying ~2147484231 trying 2147484232 trying ~2147484232 trying 2147484233 trying ~2147484233 trying 2147484234 trying ~2147484234 trying 2147484235 trying ~2147484235 trying 2147484236 trying ~2147484236 trying 2147484237 trying ~2147484237 trying 2147484238 trying ~2147484238 trying 2147484239 trying ~2147484239 trying 2147484240 trying ~2147484240 trying 2147484241 trying ~2147484241 trying 2147484242 trying ~2147484242 trying 2147484243 trying ~2147484243 trying 2147484244 trying ~2147484244 trying 2147484245 trying ~2147484245 trying 2147484246 trying ~2147484246 trying 2147484247 trying ~2147484247 trying 2147484248 trying ~2147484248 trying 2147484249 trying ~2147484249 trying 2147484250 trying ~2147484250 trying 2147484251 trying ~2147484251 trying 2147484252 trying ~2147484252 trying 2147484253 trying ~2147484253 trying 2147484254 trying ~2147484254 trying 2147484255 trying ~2147484255 trying 2147484256 trying ~2147484256 trying 2147484257 trying ~2147484257 trying 2147484258 trying ~2147484258 trying 2147484259 trying ~2147484259 trying 2147484260 trying ~2147484260 trying 2147484261 trying ~2147484261 trying 2147484262 trying ~2147484262 trying 2147484263 trying ~2147484263 trying 2147484264 trying ~2147484264 trying 2147484265 trying ~2147484265 trying 2147484266 trying ~2147484266 trying 2147484267 trying ~2147484267 trying 2147484268 trying ~2147484268 trying 2147484269 trying ~2147484269 trying 2147484270 trying ~2147484270 trying 2147484271 trying ~2147484271 trying 2147484272 trying ~2147484272 trying 2147484273 trying ~2147484273 trying 2147484274 trying ~2147484274 trying 2147484275 trying ~2147484275 trying 2147484276 trying ~2147484276 trying 2147484277 trying ~2147484277 trying 2147484278 trying ~2147484278 trying 2147484279 trying ~2147484279 trying 2147484280 trying ~2147484280 trying 2147484281 trying ~2147484281 trying 2147484282 trying ~2147484282 trying 2147484283 trying ~2147484283 trying 2147484284 trying ~2147484284 trying 2147484285 trying ~2147484285 trying 2147484286 trying ~2147484286 trying 2147484287 trying ~2147484287 trying 2147484288 trying ~2147484288 trying 2147484289 trying ~2147484289 trying 2147484290 trying ~2147484290 trying 2147484291 trying ~2147484291 trying 2147484292 trying ~2147484292 trying 2147484293 trying ~2147484293 trying 2147484294 trying ~2147484294 trying 2147484295 trying ~2147484295 trying 2147484296 trying ~2147484296 trying 2147484297 trying ~2147484297 trying 2147484298 trying ~2147484298 trying 2147484299 trying ~2147484299 trying 2147484300 trying ~2147484300 trying 2147484301 trying ~2147484301 trying 2147484302 trying ~2147484302 trying 2147484303 trying ~2147484303 trying 2147484304 trying ~2147484304 trying 2147484305 trying ~2147484305 trying 2147484306 trying ~2147484306 trying 2147484307 trying ~2147484307 trying 2147484308 trying ~2147484308 trying 2147484309 trying ~2147484309 trying 2147484310 trying ~2147484310 trying 2147484311 trying ~2147484311 trying 2147484312 trying ~2147484312 trying 2147484313 trying ~2147484313 trying 2147484314 trying ~2147484314 trying 2147484315 trying ~2147484315 trying 2147484316 trying ~2147484316 trying 2147484317 trying ~2147484317 trying 2147484318 trying ~2147484318 trying 2147484319 trying ~2147484319 trying 2147484320 trying ~2147484320 trying 2147484321 trying ~2147484321 trying 2147484322 trying ~2147484322 trying 2147484323 trying ~2147484323 trying 2147484324 trying ~2147484324 trying 2147484325 trying ~2147484325 trying 2147484326 trying ~2147484326 trying 2147484327 trying ~2147484327 trying 2147484328 trying ~2147484328 trying 2147484329 trying ~2147484329 trying 2147484330 trying ~2147484330 trying 2147484331 trying ~2147484331 trying 2147484332 trying ~2147484332 trying 2147484333 trying ~2147484333 trying 2147484334 trying ~2147484334 trying 2147484335 trying ~2147484335 trying 2147484336 trying ~2147484336 trying 2147484337 trying ~2147484337 trying 2147484338 trying ~2147484338 trying 2147484339 trying ~2147484339 trying 2147484340 trying ~2147484340 trying 2147484341 trying ~2147484341 trying 2147484342 trying ~2147484342 trying 2147484343 trying ~2147484343 trying 2147484344 trying ~2147484344 trying 2147484345 trying ~2147484345 trying 2147484346 trying ~2147484346 trying 2147484347 trying ~2147484347 trying 2147484348 trying ~2147484348 trying 2147484349 trying ~2147484349 trying 2147484350 trying ~2147484350 trying 2147484351 trying ~2147484351 trying 2147484352 trying ~2147484352 trying 2147484353 trying ~2147484353 trying 2147484354 trying ~2147484354 trying 2147484355 trying ~2147484355 trying 2147484356 trying ~2147484356 trying 2147484357 trying ~2147484357 trying 2147484358 trying ~2147484358 trying 2147484359 trying ~2147484359 trying 2147484360 trying ~2147484360 trying 2147484361 trying ~2147484361 trying 2147484362 trying ~2147484362 trying 2147484363 trying ~2147484363 trying 2147484364 trying ~2147484364 trying 2147484365 trying ~2147484365 trying 2147484366 trying ~2147484366 trying 2147484367 trying ~2147484367 trying 2147484368 trying ~2147484368 trying 2147484369 trying ~2147484369 trying 2147484370 trying ~2147484370 trying 2147484371 trying ~2147484371 trying 2147484372 trying ~2147484372 trying 2147484373 trying ~2147484373 trying 2147484374 trying ~2147484374 trying 2147484375 trying ~2147484375 trying 2147484376 trying ~2147484376 trying 2147484377 trying ~2147484377 trying 2147484378 trying ~2147484378 trying 2147484379 trying ~2147484379 trying 2147484380 trying ~2147484380 trying 2147484381 trying ~2147484381 trying 2147484382 trying ~2147484382 trying 2147484383 trying ~2147484383 trying 2147484384 trying ~2147484384 trying 2147484385 trying ~2147484385 trying 2147484386 trying ~2147484386 trying 2147484387 trying ~2147484387 trying 2147484388 trying ~2147484388 trying 2147484389 trying ~2147484389 trying 2147484390 trying ~2147484390 trying 2147484391 trying ~2147484391 trying 2147484392 trying ~2147484392 trying 2147484393 trying ~2147484393 trying 2147484394 trying ~2147484394 trying 2147484395 trying ~2147484395 trying 2147484396 trying ~2147484396 trying 2147484397 trying ~2147484397 trying 2147484398 trying ~2147484398 trying 2147484399 trying ~2147484399 trying 2147484400 trying ~2147484400 trying 2147484401 trying ~2147484401 trying 2147484402 trying ~2147484402 trying 2147484403 trying ~2147484403 trying 2147484404 trying ~2147484404 trying 2147484405 trying ~2147484405 trying 2147484406 trying ~2147484406 trying 2147484407 trying ~2147484407 trying 2147484408 trying ~2147484408 trying 2147484409 trying ~2147484409 trying 2147484410 trying ~2147484410 trying 2147484411 trying ~2147484411 trying 2147484412 trying ~2147484412 trying 2147484413 trying ~2147484413 trying 2147484414 trying ~2147484414 trying 2147484415 trying ~2147484415 trying 2147484416 trying ~2147484416 trying 2147484417 trying ~2147484417 trying 2147484418 trying ~2147484418 trying 2147484419 trying ~2147484419 trying 2147484420 trying ~2147484420 trying 2147484421 trying ~2147484421 trying 2147484422 trying ~2147484422 trying 2147484423 trying ~2147484423 trying 2147484424 trying ~2147484424 trying 2147484425 trying ~2147484425 trying 2147484426 trying ~2147484426 trying 2147484427 trying ~2147484427 trying 2147484428 trying ~2147484428 trying 2147484429 trying ~2147484429 trying 2147484430 trying ~2147484430 trying 2147484431 trying ~2147484431 trying 2147484432 trying ~2147484432 trying 2147484433 trying ~2147484433 trying 2147484434 trying ~2147484434 trying 2147484435 trying ~2147484435 trying 2147484436 trying ~2147484436 trying 2147484437 trying ~2147484437 trying 2147484438 trying ~2147484438 trying 2147484439 trying ~2147484439 trying 2147484440 trying ~2147484440 trying 2147484441 trying ~2147484441 trying 2147484442 trying ~2147484442 trying 2147484443 trying ~2147484443 trying 2147484444 trying ~2147484444 trying 2147484445 trying ~2147484445 trying 2147484446 trying ~2147484446 trying 2147484447 trying ~2147484447 trying 2147484448 trying ~2147484448 trying 2147484449 trying ~2147484449 trying 2147484450 trying ~2147484450 trying 2147484451 trying ~2147484451 trying 2147484452 trying ~2147484452 trying 2147484453 trying ~2147484453 trying 2147484454 trying ~2147484454 trying 2147484455 trying ~2147484455 trying 2147484456 trying ~2147484456 trying 2147484457 trying ~2147484457 trying 2147484458 trying ~2147484458 trying 2147484459 trying ~2147484459 trying 2147484460 trying ~2147484460 trying 2147484461 trying ~2147484461 trying 2147484462 trying ~2147484462 trying 2147484463 trying ~2147484463 trying 2147484464 trying ~2147484464 trying 2147484465 trying ~2147484465 trying 2147484466 trying ~2147484466 trying 2147484467 trying ~2147484467 trying 2147484468 trying ~2147484468 trying 2147484469 trying ~2147484469 trying 2147484470 trying ~2147484470 trying 2147484471 trying ~2147484471 trying 2147484472 trying ~2147484472 trying 2147484473 trying ~2147484473 trying 2147484474 trying ~2147484474 trying 2147484475 trying ~2147484475 trying 2147484476 trying ~2147484476 trying 2147484477 trying ~2147484477 trying 2147484478 trying ~2147484478 trying 2147484479 trying ~2147484479 trying 2147484480 trying ~2147484480 trying 2147484481 trying ~2147484481 trying 2147484482 trying ~2147484482 trying 2147484483 trying ~2147484483 trying 2147484484 trying ~2147484484 trying 2147484485 trying ~2147484485 trying 2147484486 trying ~2147484486 trying 2147484487 trying ~2147484487 trying 2147484488 trying ~2147484488 trying 2147484489 trying ~2147484489 trying 2147484490 trying ~2147484490 trying 2147484491 trying ~2147484491 trying 2147484492 trying ~2147484492 trying 2147484493 trying ~2147484493 trying 2147484494 trying ~2147484494 trying 2147484495 trying ~2147484495 trying 2147484496 trying ~2147484496 trying 2147484497 trying ~2147484497 trying 2147484498 trying ~2147484498 trying 2147484499 trying ~2147484499 trying 2147484500 trying ~2147484500 trying 2147484501 trying ~2147484501 trying 2147484502 trying ~2147484502 trying 2147484503 trying ~2147484503 trying 2147484504 trying ~2147484504 trying 2147484505 trying ~2147484505 trying 2147484506 trying ~2147484506 trying 2147484507 trying ~2147484507 trying 2147484508 trying ~2147484508 trying 2147484509 trying ~2147484509 trying 2147484510 trying ~2147484510 trying 2147484511 trying ~2147484511 trying 2147484512 trying ~2147484512 trying 2147484513 trying ~2147484513 trying 2147484514 trying ~2147484514 trying 2147484515 trying ~2147484515 trying 2147484516 trying ~2147484516 trying 2147484517 trying ~2147484517 trying 2147484518 trying ~2147484518 trying 2147484519 trying ~2147484519 trying 2147484520 trying ~2147484520 trying 2147484521 trying ~2147484521 trying 2147484522 trying ~2147484522 trying 2147484523 trying ~2147484523 trying 2147484524 trying ~2147484524 trying 2147484525 trying ~2147484525 trying 2147484526 trying ~2147484526 trying 2147484527 trying ~2147484527 trying 2147484528 trying ~2147484528 trying 2147484529 trying ~2147484529 trying 2147484530 trying ~2147484530 trying 2147484531 trying ~2147484531 trying 2147484532 trying ~2147484532 trying 2147484533 trying ~2147484533 trying 2147484534 trying ~2147484534 trying 2147484535 trying ~2147484535 trying 2147484536 trying ~2147484536 trying 2147484537 trying ~2147484537 trying 2147484538 trying ~2147484538 trying 2147484539 trying ~2147484539 trying 2147484540 trying ~2147484540 trying 2147484541 trying ~2147484541 trying 2147484542 trying ~2147484542 trying 2147484543 trying ~2147484543 trying 2147484544 trying ~2147484544 trying 2147484545 trying ~2147484545 trying 2147484546 trying ~2147484546 trying 2147484547 trying ~2147484547 trying 2147484548 trying ~2147484548 trying 2147484549 trying ~2147484549 trying 2147484550 trying ~2147484550 trying 2147484551 trying ~2147484551 trying 2147484552 trying ~2147484552 trying 2147484553 trying ~2147484553 trying 2147484554 trying ~2147484554 trying 2147484555 trying ~2147484555 trying 2147484556 trying ~2147484556 trying 2147484557 trying ~2147484557 trying 2147484558 trying ~2147484558 trying 2147484559 trying ~2147484559 trying 2147484560 trying ~2147484560 trying 2147484561 trying ~2147484561 trying 2147484562 trying ~2147484562 trying 2147484563 trying ~2147484563 trying 2147484564 trying ~2147484564 trying 2147484565 trying ~2147484565 trying 2147484566 trying ~2147484566 trying 2147484567 trying ~2147484567 trying 2147484568 trying ~2147484568 trying 2147484569 trying ~2147484569 trying 2147484570 trying ~2147484570 trying 2147484571 trying ~2147484571 trying 2147484572 trying ~2147484572 trying 2147484573 trying ~2147484573 trying 2147484574 trying ~2147484574 trying 2147484575 trying ~2147484575 trying 2147484576 trying ~2147484576 trying 2147484577 trying ~2147484577 trying 2147484578 trying ~2147484578 trying 2147484579 trying ~2147484579 trying 2147484580 trying ~2147484580 trying 2147484581 trying ~2147484581 trying 2147484582 trying ~2147484582 trying 2147484583 trying ~2147484583 trying 2147484584 trying ~2147484584 trying 2147484585 trying ~2147484585 trying 2147484586 trying ~2147484586 trying 2147484587 trying ~2147484587 trying 2147484588 trying ~2147484588 trying 2147484589 trying ~2147484589 trying 2147484590 trying ~2147484590 trying 2147484591 trying ~2147484591 trying 2147484592 trying ~2147484592 trying 2147484593 trying ~2147484593 trying 2147484594 trying ~2147484594 trying 2147484595 trying ~2147484595 trying 2147484596 trying ~2147484596 trying 2147484597 trying ~2147484597 trying 2147484598 trying ~2147484598 trying 2147484599 trying ~2147484599 trying 2147484600 trying ~2147484600 trying 2147484601 trying ~2147484601 trying 2147484602 trying ~2147484602 trying 2147484603 trying ~2147484603 trying 2147484604 trying ~2147484604 trying 2147484605 trying ~2147484605 trying 2147484606 trying ~2147484606 trying 2147484607 trying ~2147484607 trying 2147484608 trying ~2147484608 trying 2147484609 trying ~2147484609 trying 2147484610 trying ~2147484610 trying 2147484611 trying ~2147484611 trying 2147484612 trying ~2147484612 trying 2147484613 trying ~2147484613 trying 2147484614 trying ~2147484614 trying 2147484615 trying ~2147484615 trying 2147484616 trying ~2147484616 trying 2147484617 trying ~2147484617 trying 2147484618 trying ~2147484618 trying 2147484619 trying ~2147484619 trying 2147484620 trying ~2147484620 trying 2147484621 trying ~2147484621 trying 2147484622 trying ~2147484622 trying 2147484623 trying ~2147484623 trying 2147484624 trying ~2147484624 trying 2147484625 trying ~2147484625 trying 2147484626 trying ~2147484626 trying 2147484627 trying ~2147484627 trying 2147484628 trying ~2147484628 trying 2147484629 trying ~2147484629 trying 2147484630 trying ~2147484630 trying 2147484631 trying ~2147484631 trying 2147484632 trying ~2147484632 trying 2147484633 trying ~2147484633 trying 2147484634 trying ~2147484634 trying 2147484635 trying ~2147484635 trying 2147484636 trying ~2147484636 trying 2147484637 trying ~2147484637 trying 2147484638 trying ~2147484638 trying 2147484639 trying ~2147484639 trying 2147484640 trying ~2147484640 trying 2147484641 trying ~2147484641 trying 2147484642 trying ~2147484642 trying 2147484643 trying ~2147484643 trying 2147484644 trying ~2147484644 trying 2147484645 trying ~2147484645 trying 2147484646 trying ~2147484646 trying 2147484647 trying ~2147484647 All ok mlton-20210117+dfsg/regression/int-inf.2.sml000066400000000000000000000026561416264345000204400ustar00rootroot00000000000000val big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val small = SOME (IntInf.toInt barg) handle Overflow => NONE val bstr = IntInf.toString barg val _ = print (concat ["trying ", bstr, "\n"]) fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n") val isSmall = ~ big <= barg andalso barg < big in case small of NONE => if isSmall then fail "1" else () | SOME sarg => if isSmall then let val sstr = Int.toString sarg in if bstr = sstr andalso barg = IntInf.fromInt sarg then () else fail "2" end else fail "3" end fun spin (low: IntInf.int, limit: IntInf.int): unit = let fun loop (arg: IntInf.int): unit = if arg = limit then () else ( try arg; try (~ arg); loop (arg + 1) ) in loop low end val _ = spin (0, 1000) val _ = spin (0x40000000 - 1000, 0x40000000 + 1000) val _ = spin (big - 1000, big + 1000) val _ = print "All ok\n" mlton-20210117+dfsg/regression/int-inf.3.ok000066400000000000000000000000121416264345000202370ustar00rootroot00000000000000true12345 mlton-20210117+dfsg/regression/int-inf.3.sml000066400000000000000000000002121416264345000204230ustar00rootroot00000000000000val _ = print (Bool.toString ((1: IntInf.int) < 2)) val _ = print (IntInf.toString (IntInf.quot (1234567890, 100000))) val _ = print "\n" mlton-20210117+dfsg/regression/int-inf.4.ok000066400000000000000000000000251416264345000202440ustar00rootroot0000000000000009876543210987654321 mlton-20210117+dfsg/regression/int-inf.4.sml000066400000000000000000000004401416264345000204270ustar00rootroot00000000000000fun dump (x: IntInf.int): unit = let val rest = IntInf.quot (x, 10) in (print o Int.toString o IntInf.toInt o IntInf.rem) (x, 10); if rest = 0 then print "\n" else dump rest end val _ = dump 12345678901234567890 mlton-20210117+dfsg/regression/int-inf.5.ok000066400000000000000000000000201416264345000202400ustar00rootroot000000000000005 5 500000000 1 mlton-20210117+dfsg/regression/int-inf.5.sml000066400000000000000000000004451416264345000204350ustar00rootroot00000000000000open IntInf MLton.IntInf fun p (a, b) = (print (toString (gcd (a, b))) ; print "\n") val _ = List.app p [(1000, 205), (1000000000000, 205), (100000000000000000000, 500000000), (100000000000000000000, 500000001)] mlton-20210117+dfsg/regression/int-inf.bitops.ok000066400000000000000000004617461416264345000214260ustar00rootroot00000000000000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1 A & B: 0 A: 0 B: 1 A | B: 1 A: 0 B: 1 A ^ B: 1 A: 0 B: 1 A & B: 0 A: 0 B: 1 A | B: 1 A: 0 B: 1 A ^ B: 1 A: 0 B: ~1 A & B: 0 A: 0 B: ~1 A | B: ~1 A: 0 B: ~1 A ^ B: ~1 A: 0 B: ~1 A & B: 0 A: 0 B: ~1 A | B: ~1 A: 0 B: ~1 A ^ B: ~1 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 3931 A & B: 0 A: 0 B: 3931 A | B: 3931 A: 0 B: 3931 A ^ B: 3931 A: 0 B: 3931 A & B: 0 A: 0 B: 3931 A | B: 3931 A: 0 B: 3931 A ^ B: 3931 A: 0 B: ~3931 A & B: 0 A: 0 B: ~3931 A | B: ~3931 A: 0 B: ~3931 A ^ B: ~3931 A: 0 B: ~3931 A & B: 0 A: 0 B: ~3931 A | B: ~3931 A: 0 B: ~3931 A ^ B: ~3931 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 1 B: 1 A & B: 1 A: 1 B: 1 A | B: 1 A: 1 B: 1 A ^ B: 0 A: ~1 B: 1 A & B: 1 A: ~1 B: 1 A | B: ~1 A: ~1 B: 1 A ^ B: ~2 A: 1 B: ~1 A & B: 1 A: 1 B: ~1 A | B: ~1 A: 1 B: ~1 A ^ B: ~2 A: ~1 B: ~1 A & B: ~1 A: ~1 B: ~1 A | B: ~1 A: ~1 B: ~1 A ^ B: 0 A: 1 B: 2 A & B: 0 A: 1 B: 2 A | B: 3 A: 1 B: 2 A ^ B: 3 A: ~1 B: 2 A & B: 2 A: ~1 B: 2 A | B: ~1 A: ~1 B: 2 A ^ B: ~3 A: 1 B: ~2 A & B: 0 A: 1 B: ~2 A | B: ~1 A: 1 B: ~2 A ^ B: ~1 A: ~1 B: ~2 A & B: ~2 A: ~1 B: ~2 A | B: ~1 A: ~1 B: ~2 A ^ B: 1 A: 1 B: B A & B: 1 A: 1 B: B A | B: B A: 1 B: B A ^ B: A A: ~1 B: B A & B: B A: ~1 B: B A | B: ~1 A: ~1 B: B A ^ B: ~C A: 1 B: ~B A & B: 1 A: 1 B: ~B A | B: ~B A: 1 B: ~B A ^ B: ~C A: ~1 B: ~B A & B: ~B A: ~1 B: ~B A | B: ~1 A: ~1 B: ~B A ^ B: A A: 1 B: 16 A & B: 0 A: 1 B: 16 A | B: 17 A: 1 B: 16 A ^ B: 17 A: ~1 B: 16 A & B: 16 A: ~1 B: 16 A | B: ~1 A: ~1 B: 16 A ^ B: ~17 A: 1 B: ~16 A & B: 0 A: 1 B: ~16 A | B: ~15 A: 1 B: ~16 A ^ B: ~15 A: ~1 B: ~16 A & B: ~16 A: ~1 B: ~16 A | B: ~1 A: ~1 B: ~16 A ^ B: 15 A: 1 ! A: ~2 A: ~1 ! A: 0 A: ~1 A ~>> 0: ~1 A: ~1 A ~>> 1: ~1 A: ~1 A ~>> 2: ~1 A: ~1 A ~>> F: ~1 A: ~1 A ~>> 10: ~1 A: ~1 A ~>> 11: ~1 A: ~1 A ~>> 12: ~1 A: ~1 A << 0: ~1 A: ~1 A << 1: ~2 A: ~1 A << 2: ~4 A: ~1 A << F: ~8000 A: ~1 A << 10: ~10000 A: ~1 A << 11: ~20000 A: ~1 A << 12: ~40000 A: B B: B A & B: B A: B B: B A | B: B A: B B: B A ^ B: 0 A: ~B B: B A & B: 1 A: ~B B: B A | B: ~1 A: ~B B: B A ^ B: ~2 A: B B: ~B A & B: 1 A: B B: ~B A | B: ~1 A: B B: ~B A ^ B: ~2 A: ~B B: ~B A & B: ~B A: ~B B: ~B A | B: ~B A: ~B B: ~B A ^ B: 0 A: B B: 16 A & B: 2 A: B B: 16 A | B: 1F A: B B: 16 A ^ B: 1D A: ~B B: 16 A & B: 14 A: ~B B: 16 A | B: ~9 A: ~B B: 16 A ^ B: ~1D A: B B: ~16 A & B: A A: B B: ~16 A | B: ~15 A: B B: ~16 A ^ B: ~1F A: ~B B: ~16 A & B: ~20 A: ~B B: ~16 A | B: ~1 A: ~B B: ~16 A ^ B: 1F A: B B: 79 A & B: 9 A: B B: 79 A | B: 7B A: B B: 79 A ^ B: 72 A: ~B B: 79 A & B: 71 A: ~B B: 79 A | B: ~3 A: ~B B: 79 A ^ B: ~74 A: B B: ~79 A & B: 3 A: B B: ~79 A | B: ~71 A: B B: ~79 A ^ B: ~74 A: ~B B: ~79 A & B: ~7B A: ~B B: ~79 A | B: ~9 A: ~B B: ~79 A ^ B: 72 A: B B: F2 A & B: 2 A: B B: F2 A | B: FB A: B B: F2 A ^ B: F9 A: ~B B: F2 A & B: F0 A: ~B B: F2 A | B: ~9 A: ~B B: F2 A ^ B: ~F9 A: B B: ~F2 A & B: A A: B B: ~F2 A | B: ~F1 A: B B: ~F2 A ^ B: ~FB A: ~B B: ~F2 A & B: ~FC A: ~B B: ~F2 A | B: ~1 A: ~B B: ~F2 A ^ B: FB A: B ! A: ~C A: ~B ! A: A A: ~B A ~>> 0: ~B A: ~B A ~>> 1: ~6 A: ~B A ~>> 2: ~3 A: ~B A ~>> F: ~1 A: ~B A ~>> 10: ~1 A: ~B A ~>> 11: ~1 A: ~B A ~>> 12: ~1 A: ~B A << 0: ~B A: ~B A << 1: ~16 A: ~B A << 2: ~2C A: ~B A << F: ~58000 A: ~B A << 10: ~B0000 A: ~B A << 11: ~160000 A: ~B A << 12: ~2C0000 A: 79 B: 79 A & B: 79 A: 79 B: 79 A | B: 79 A: 79 B: 79 A ^ B: 0 A: ~79 B: 79 A & B: 1 A: ~79 B: 79 A | B: ~1 A: ~79 B: 79 A ^ B: ~2 A: 79 B: ~79 A & B: 1 A: 79 B: ~79 A | B: ~1 A: 79 B: ~79 A ^ B: ~2 A: ~79 B: ~79 A & B: ~79 A: ~79 B: ~79 A | B: ~79 A: ~79 B: ~79 A ^ B: 0 A: 79 B: F2 A & B: 70 A: 79 B: F2 A | B: FB A: 79 B: F2 A ^ B: 8B A: ~79 B: F2 A & B: 82 A: ~79 B: F2 A | B: ~9 A: ~79 B: F2 A ^ B: ~8B A: 79 B: ~F2 A & B: 8 A: 79 B: ~F2 A | B: ~81 A: 79 B: ~F2 A ^ B: ~89 A: ~79 B: ~F2 A & B: ~FA A: ~79 B: ~F2 A | B: ~71 A: ~79 B: ~F2 A ^ B: 89 A: 79 B: 533 A & B: 31 A: 79 B: 533 A | B: 57B A: 79 B: 533 A ^ B: 54A A: ~79 B: 533 A & B: 503 A: ~79 B: 533 A | B: ~49 A: ~79 B: 533 A ^ B: ~54C A: 79 B: ~533 A & B: 49 A: 79 B: ~533 A | B: ~503 A: 79 B: ~533 A ^ B: ~54C A: ~79 B: ~533 A & B: ~57B A: ~79 B: ~533 A | B: ~31 A: ~79 B: ~533 A ^ B: 54A A: 79 B: A66 A & B: 60 A: 79 B: A66 A | B: A7F A: 79 B: A66 A ^ B: A1F A: ~79 B: A66 A & B: A06 A: ~79 B: A66 A | B: ~19 A: ~79 B: A66 A ^ B: ~A1F A: 79 B: ~A66 A & B: 18 A: 79 B: ~A66 A | B: ~A05 A: 79 B: ~A66 A ^ B: ~A1D A: ~79 B: ~A66 A & B: ~A7E A: ~79 B: ~A66 A | B: ~61 A: ~79 B: ~A66 A ^ B: A1D A: 79 ! A: ~7A A: ~79 ! A: 78 A: ~79 A ~>> 0: ~79 A: ~79 A ~>> 1: ~3D A: ~79 A ~>> 2: ~1F A: ~79 A ~>> F: ~1 A: ~79 A ~>> 10: ~1 A: ~79 A ~>> 11: ~1 A: ~79 A ~>> 12: ~1 A: ~79 A << 0: ~79 A: ~79 A << 1: ~F2 A: ~79 A << 2: ~1E4 A: ~79 A << F: ~3C8000 A: ~79 A << 10: ~790000 A: ~79 A << 11: ~F20000 A: ~79 A << 12: ~1E40000 A: 533 B: 533 A & B: 533 A: 533 B: 533 A | B: 533 A: 533 B: 533 A ^ B: 0 A: ~533 B: 533 A & B: 1 A: ~533 B: 533 A | B: ~1 A: ~533 B: 533 A ^ B: ~2 A: 533 B: ~533 A & B: 1 A: 533 B: ~533 A | B: ~1 A: 533 B: ~533 A ^ B: ~2 A: ~533 B: ~533 A & B: ~533 A: ~533 B: ~533 A | B: ~533 A: ~533 B: ~533 A ^ B: 0 A: 533 B: A66 A & B: 22 A: 533 B: A66 A | B: F77 A: 533 B: A66 A ^ B: F55 A: ~533 B: A66 A & B: A44 A: ~533 B: A66 A | B: ~511 A: ~533 B: A66 A ^ B: ~F55 A: 533 B: ~A66 A & B: 512 A: 533 B: ~A66 A | B: ~A45 A: 533 B: ~A66 A ^ B: ~F57 A: ~533 B: ~A66 A & B: ~F78 A: ~533 B: ~A66 A | B: ~21 A: ~533 B: ~A66 A ^ B: F57 A: 533 B: 3931 A & B: 131 A: 533 B: 3931 A | B: 3D33 A: 533 B: 3931 A ^ B: 3C02 A: ~533 B: 3931 A & B: 3801 A: ~533 B: 3931 A | B: ~403 A: ~533 B: 3931 A ^ B: ~3C04 A: 533 B: ~3931 A & B: 403 A: 533 B: ~3931 A | B: ~3801 A: 533 B: ~3931 A ^ B: ~3C04 A: ~533 B: ~3931 A & B: ~3D33 A: ~533 B: ~3931 A | B: ~131 A: ~533 B: ~3931 A ^ B: 3C02 A: 533 B: 7262 A & B: 22 A: 533 B: 7262 A | B: 7773 A: 533 B: 7262 A ^ B: 7751 A: ~533 B: 7262 A & B: 7240 A: ~533 B: 7262 A | B: ~511 A: ~533 B: 7262 A ^ B: ~7751 A: 533 B: ~7262 A & B: 512 A: 533 B: ~7262 A | B: ~7241 A: 533 B: ~7262 A ^ B: ~7753 A: ~533 B: ~7262 A & B: ~7774 A: ~533 B: ~7262 A | B: ~21 A: ~533 B: ~7262 A ^ B: 7753 A: 533 ! A: ~534 A: ~533 ! A: 532 A: ~533 A ~>> 0: ~533 A: ~533 A ~>> 1: ~29A A: ~533 A ~>> 2: ~14D A: ~533 A ~>> F: ~1 A: ~533 A ~>> 10: ~1 A: ~533 A ~>> 11: ~1 A: ~533 A ~>> 12: ~1 A: ~533 A << 0: ~533 A: ~533 A << 1: ~A66 A: ~533 A << 2: ~14CC A: ~533 A << F: ~2998000 A: ~533 A << 10: ~5330000 A: ~533 A << 11: ~A660000 A: ~533 A << 12: ~14CC0000 A: 2 B: 2 A & B: 2 A: 2 B: 2 A | B: 2 A: 2 B: 2 A ^ B: 0 A: ~2 B: 2 A & B: 2 A: ~2 B: 2 A | B: ~2 A: ~2 B: 2 A ^ B: ~4 A: 2 B: ~2 A & B: 2 A: 2 B: ~2 A | B: ~2 A: 2 B: ~2 A ^ B: ~4 A: ~2 B: ~2 A & B: ~2 A: ~2 B: ~2 A | B: ~2 A: ~2 B: ~2 A ^ B: 0 A: 2 B: 3 A & B: 2 A: 2 B: 3 A | B: 3 A: 2 B: 3 A ^ B: 1 A: ~2 B: 3 A & B: 2 A: ~2 B: 3 A | B: ~1 A: ~2 B: 3 A ^ B: ~3 A: 2 B: ~3 A & B: 0 A: 2 B: ~3 A | B: ~1 A: 2 B: ~3 A ^ B: ~1 A: ~2 B: ~3 A & B: ~4 A: ~2 B: ~3 A | B: ~1 A: ~2 B: ~3 A ^ B: 3 A: 2 B: 16 A & B: 2 A: 2 B: 16 A | B: 16 A: 2 B: 16 A ^ B: 14 A: ~2 B: 16 A & B: 16 A: ~2 B: 16 A | B: ~2 A: ~2 B: 16 A ^ B: ~18 A: 2 B: ~16 A & B: 2 A: 2 B: ~16 A | B: ~16 A: 2 B: ~16 A ^ B: ~18 A: ~2 B: ~16 A & B: ~16 A: ~2 B: ~16 A | B: ~2 A: ~2 B: ~16 A ^ B: 14 A: 2 B: 21 A & B: 0 A: 2 B: 21 A | B: 23 A: 2 B: 21 A ^ B: 23 A: ~2 B: 21 A & B: 20 A: ~2 B: 21 A | B: ~1 A: ~2 B: 21 A ^ B: ~21 A: 2 B: ~21 A & B: 2 A: 2 B: ~21 A | B: ~21 A: 2 B: ~21 A ^ B: ~23 A: ~2 B: ~21 A & B: ~22 A: ~2 B: ~21 A | B: ~1 A: ~2 B: ~21 A ^ B: 21 A: 2 ! A: ~3 A: ~2 ! A: 1 A: ~2 A ~>> 0: ~2 A: ~2 A ~>> 1: ~1 A: ~2 A ~>> 2: ~1 A: ~2 A ~>> F: ~1 A: ~2 A ~>> 10: ~1 A: ~2 A ~>> 11: ~1 A: ~2 A ~>> 12: ~1 A: ~2 A << 0: ~2 A: ~2 A << 1: ~4 A: ~2 A << 2: ~8 A: ~2 A << F: ~10000 A: ~2 A << 10: ~20000 A: ~2 A << 11: ~40000 A: ~2 A << 12: ~80000 A: 16 B: 16 A & B: 16 A: 16 B: 16 A | B: 16 A: 16 B: 16 A ^ B: 0 A: ~16 B: 16 A & B: 2 A: ~16 B: 16 A | B: ~2 A: ~16 B: 16 A ^ B: ~4 A: 16 B: ~16 A & B: 2 A: 16 B: ~16 A | B: ~2 A: 16 B: ~16 A ^ B: ~4 A: ~16 B: ~16 A & B: ~16 A: ~16 B: ~16 A | B: ~16 A: ~16 B: ~16 A ^ B: 0 A: 16 B: 21 A & B: 0 A: 16 B: 21 A | B: 37 A: 16 B: 21 A ^ B: 37 A: ~16 B: 21 A & B: 20 A: ~16 B: 21 A | B: ~15 A: ~16 B: 21 A ^ B: ~35 A: 16 B: ~21 A & B: 16 A: 16 B: ~21 A | B: ~21 A: 16 B: ~21 A ^ B: ~37 A: ~16 B: ~21 A & B: ~36 A: ~16 B: ~21 A | B: ~1 A: ~16 B: ~21 A ^ B: 35 A: 16 B: F2 A & B: 12 A: 16 B: F2 A | B: F6 A: 16 B: F2 A ^ B: E4 A: ~16 B: F2 A & B: E2 A: ~16 B: F2 A | B: ~6 A: ~16 B: F2 A ^ B: ~E8 A: 16 B: ~F2 A & B: 6 A: 16 B: ~F2 A | B: ~E2 A: 16 B: ~F2 A ^ B: ~E8 A: ~16 B: ~F2 A & B: ~F6 A: ~16 B: ~F2 A | B: ~12 A: ~16 B: ~F2 A ^ B: E4 A: 16 B: 16B A & B: 2 A: 16 B: 16B A | B: 17F A: 16 B: 16B A ^ B: 17D A: ~16 B: 16B A & B: 16A A: ~16 B: 16B A | B: ~15 A: ~16 B: 16B A ^ B: ~17F A: 16 B: ~16B A & B: 14 A: 16 B: ~16B A | B: ~169 A: 16 B: ~16B A ^ B: ~17D A: ~16 B: ~16B A & B: ~180 A: ~16 B: ~16B A | B: ~1 A: ~16 B: ~16B A ^ B: 17F A: 16 ! A: ~17 A: ~16 ! A: 15 A: ~16 A ~>> 0: ~16 A: ~16 A ~>> 1: ~B A: ~16 A ~>> 2: ~6 A: ~16 A ~>> F: ~1 A: ~16 A ~>> 10: ~1 A: ~16 A ~>> 11: ~1 A: ~16 A ~>> 12: ~1 A: ~16 A << 0: ~16 A: ~16 A << 1: ~2C A: ~16 A << 2: ~58 A: ~16 A << F: ~B0000 A: ~16 A << 10: ~160000 A: ~16 A << 11: ~2C0000 A: ~16 A << 12: ~580000 A: F2 B: F2 A & B: F2 A: F2 B: F2 A | B: F2 A: F2 B: F2 A ^ B: 0 A: ~F2 B: F2 A & B: 2 A: ~F2 B: F2 A | B: ~2 A: ~F2 B: F2 A ^ B: ~4 A: F2 B: ~F2 A & B: 2 A: F2 B: ~F2 A | B: ~2 A: F2 B: ~F2 A ^ B: ~4 A: ~F2 B: ~F2 A & B: ~F2 A: ~F2 B: ~F2 A | B: ~F2 A: ~F2 B: ~F2 A ^ B: 0 A: F2 B: 16B A & B: 62 A: F2 B: 16B A | B: 1FB A: F2 B: 16B A ^ B: 199 A: ~F2 B: 16B A & B: 10A A: ~F2 B: 16B A | B: ~91 A: ~F2 B: 16B A ^ B: ~19B A: F2 B: ~16B A & B: 90 A: F2 B: ~16B A | B: ~109 A: F2 B: ~16B A ^ B: ~199 A: ~F2 B: ~16B A & B: ~1FC A: ~F2 B: ~16B A | B: ~61 A: ~F2 B: ~16B A ^ B: 19B A: F2 B: A66 A & B: 62 A: F2 B: A66 A | B: AF6 A: F2 B: A66 A ^ B: A94 A: ~F2 B: A66 A & B: A06 A: ~F2 B: A66 A | B: ~92 A: ~F2 B: A66 A ^ B: ~A98 A: F2 B: ~A66 A & B: 92 A: F2 B: ~A66 A | B: ~A06 A: F2 B: ~A66 A ^ B: ~A98 A: ~F2 B: ~A66 A & B: ~AF6 A: ~F2 B: ~A66 A | B: ~62 A: ~F2 B: ~A66 A ^ B: A94 A: F2 B: F99 A & B: 90 A: F2 B: F99 A | B: FFB A: F2 B: F99 A ^ B: F6B A: ~F2 B: F99 A & B: F08 A: ~F2 B: F99 A | B: ~61 A: ~F2 B: F99 A ^ B: ~F69 A: F2 B: ~F99 A & B: 62 A: F2 B: ~F99 A | B: ~F09 A: F2 B: ~F99 A ^ B: ~F6B A: ~F2 B: ~F99 A & B: ~FFA A: ~F2 B: ~F99 A | B: ~91 A: ~F2 B: ~F99 A ^ B: F69 A: F2 ! A: ~F3 A: ~F2 ! A: F1 A: ~F2 A ~>> 0: ~F2 A: ~F2 A ~>> 1: ~79 A: ~F2 A ~>> 2: ~3D A: ~F2 A ~>> F: ~1 A: ~F2 A ~>> 10: ~1 A: ~F2 A ~>> 11: ~1 A: ~F2 A ~>> 12: ~1 A: ~F2 A << 0: ~F2 A: ~F2 A << 1: ~1E4 A: ~F2 A << 2: ~3C8 A: ~F2 A << F: ~790000 A: ~F2 A << 10: ~F20000 A: ~F2 A << 11: ~1E40000 A: ~F2 A << 12: ~3C80000 A: A66 B: A66 A & B: A66 A: A66 B: A66 A | B: A66 A: A66 B: A66 A ^ B: 0 A: ~A66 B: A66 A & B: 2 A: ~A66 B: A66 A | B: ~2 A: ~A66 B: A66 A ^ B: ~4 A: A66 B: ~A66 A & B: 2 A: A66 B: ~A66 A | B: ~2 A: A66 B: ~A66 A ^ B: ~4 A: ~A66 B: ~A66 A & B: ~A66 A: ~A66 B: ~A66 A | B: ~A66 A: ~A66 B: ~A66 A ^ B: 0 A: A66 B: F99 A & B: A00 A: A66 B: F99 A | B: FFF A: A66 B: F99 A ^ B: 5FF A: ~A66 B: F99 A & B: 598 A: ~A66 B: F99 A | B: ~65 A: ~A66 B: F99 A ^ B: ~5FD A: A66 B: ~F99 A & B: 66 A: A66 B: ~F99 A | B: ~599 A: A66 B: ~F99 A ^ B: ~5FF A: ~A66 B: ~F99 A & B: ~FFE A: ~A66 B: ~F99 A | B: ~A01 A: ~A66 B: ~F99 A ^ B: 5FD A: A66 B: 7262 A & B: 262 A: A66 B: 7262 A | B: 7A66 A: A66 B: 7262 A ^ B: 7804 A: ~A66 B: 7262 A & B: 7002 A: ~A66 B: 7262 A | B: ~806 A: ~A66 B: 7262 A ^ B: ~7808 A: A66 B: ~7262 A & B: 806 A: A66 B: ~7262 A | B: ~7002 A: A66 B: ~7262 A ^ B: ~7808 A: ~A66 B: ~7262 A & B: ~7A66 A: ~A66 B: ~7262 A | B: ~262 A: ~A66 B: ~7262 A ^ B: 7804 A: A66 B: AB93 A & B: A02 A: A66 B: AB93 A | B: ABF7 A: A66 B: AB93 A ^ B: A1F5 A: ~A66 B: AB93 A & B: A192 A: ~A66 B: AB93 A | B: ~65 A: ~A66 B: AB93 A ^ B: ~A1F7 A: A66 B: ~AB93 A & B: 64 A: A66 B: ~AB93 A | B: ~A191 A: A66 B: ~AB93 A ^ B: ~A1F5 A: ~A66 B: ~AB93 A & B: ~ABF8 A: ~A66 B: ~AB93 A | B: ~A01 A: ~A66 B: ~AB93 A ^ B: A1F7 A: A66 ! A: ~A67 A: ~A66 ! A: A65 A: ~A66 A ~>> 0: ~A66 A: ~A66 A ~>> 1: ~533 A: ~A66 A ~>> 2: ~29A A: ~A66 A ~>> F: ~1 A: ~A66 A ~>> 10: ~1 A: ~A66 A ~>> 11: ~1 A: ~A66 A ~>> 12: ~1 A: ~A66 A << 0: ~A66 A: ~A66 A << 1: ~14CC A: ~A66 A << 2: ~2998 A: ~A66 A << F: ~5330000 A: ~A66 A << 10: ~A660000 A: ~A66 A << 11: ~14CC0000 A: ~A66 A << 12: ~29980000 A: 3 B: 3 A & B: 3 A: 3 B: 3 A | B: 3 A: 3 B: 3 A ^ B: 0 A: ~3 B: 3 A & B: 1 A: ~3 B: 3 A | B: ~1 A: ~3 B: 3 A ^ B: ~2 A: 3 B: ~3 A & B: 1 A: 3 B: ~3 A | B: ~1 A: 3 B: ~3 A ^ B: ~2 A: ~3 B: ~3 A & B: ~3 A: ~3 B: ~3 A | B: ~3 A: ~3 B: ~3 A ^ B: 0 A: 3 B: 4 A & B: 0 A: 3 B: 4 A | B: 7 A: 3 B: 4 A ^ B: 7 A: ~3 B: 4 A & B: 4 A: ~3 B: 4 A | B: ~3 A: ~3 B: 4 A ^ B: ~7 A: 3 B: ~4 A & B: 0 A: 3 B: ~4 A | B: ~1 A: 3 B: ~4 A ^ B: ~1 A: ~3 B: ~4 A & B: ~4 A: ~3 B: ~4 A | B: ~3 A: ~3 B: ~4 A ^ B: 1 A: 3 B: 21 A & B: 1 A: 3 B: 21 A | B: 23 A: 3 B: 21 A ^ B: 22 A: ~3 B: 21 A & B: 21 A: ~3 B: 21 A | B: ~3 A: ~3 B: 21 A ^ B: ~24 A: 3 B: ~21 A & B: 3 A: 3 B: ~21 A | B: ~21 A: 3 B: ~21 A ^ B: ~24 A: ~3 B: ~21 A & B: ~23 A: ~3 B: ~21 A | B: ~1 A: ~3 B: ~21 A ^ B: 22 A: 3 B: 2C A & B: 0 A: 3 B: 2C A | B: 2F A: 3 B: 2C A ^ B: 2F A: ~3 B: 2C A & B: 2C A: ~3 B: 2C A | B: ~3 A: ~3 B: 2C A ^ B: ~2F A: 3 B: ~2C A & B: 0 A: 3 B: ~2C A | B: ~29 A: 3 B: ~2C A ^ B: ~29 A: ~3 B: ~2C A & B: ~2C A: ~3 B: ~2C A | B: ~3 A: ~3 B: ~2C A ^ B: 29 A: 3 ! A: ~4 A: ~3 ! A: 2 A: ~3 A ~>> 0: ~3 A: ~3 A ~>> 1: ~2 A: ~3 A ~>> 2: ~1 A: ~3 A ~>> F: ~1 A: ~3 A ~>> 10: ~1 A: ~3 A ~>> 11: ~1 A: ~3 A ~>> 12: ~1 A: ~3 A << 0: ~3 A: ~3 A << 1: ~6 A: ~3 A << 2: ~C A: ~3 A << F: ~18000 A: ~3 A << 10: ~30000 A: ~3 A << 11: ~60000 A: ~3 A << 12: ~C0000 A: 21 B: 21 A & B: 21 A: 21 B: 21 A | B: 21 A: 21 B: 21 A ^ B: 0 A: ~21 B: 21 A & B: 1 A: ~21 B: 21 A | B: ~1 A: ~21 B: 21 A ^ B: ~2 A: 21 B: ~21 A & B: 1 A: 21 B: ~21 A | B: ~1 A: 21 B: ~21 A ^ B: ~2 A: ~21 B: ~21 A & B: ~21 A: ~21 B: ~21 A | B: ~21 A: ~21 B: ~21 A ^ B: 0 A: 21 B: 2C A & B: 20 A: 21 B: 2C A | B: 2D A: 21 B: 2C A ^ B: D A: ~21 B: 2C A & B: C A: ~21 B: 2C A | B: ~1 A: ~21 B: 2C A ^ B: ~D A: 21 B: ~2C A & B: 0 A: 21 B: ~2C A | B: ~B A: 21 B: ~2C A ^ B: ~B A: ~21 B: ~2C A & B: ~2C A: ~21 B: ~2C A | B: ~21 A: ~21 B: ~2C A ^ B: B A: 21 B: 16B A & B: 21 A: 21 B: 16B A | B: 16B A: 21 B: 16B A ^ B: 14A A: ~21 B: 16B A & B: 14B A: ~21 B: 16B A | B: ~1 A: ~21 B: 16B A ^ B: ~14C A: 21 B: ~16B A & B: 1 A: 21 B: ~16B A | B: ~14B A: 21 B: ~16B A ^ B: ~14C A: ~21 B: ~16B A & B: ~16B A: ~21 B: ~16B A | B: ~21 A: ~21 B: ~16B A ^ B: 14A A: 21 B: 1E4 A & B: 20 A: 21 B: 1E4 A | B: 1E5 A: 21 B: 1E4 A ^ B: 1C5 A: ~21 B: 1E4 A & B: 1C4 A: ~21 B: 1E4 A | B: ~1 A: ~21 B: 1E4 A ^ B: ~1C5 A: 21 B: ~1E4 A & B: 0 A: 21 B: ~1E4 A | B: ~1C3 A: 21 B: ~1E4 A ^ B: ~1C3 A: ~21 B: ~1E4 A & B: ~1E4 A: ~21 B: ~1E4 A | B: ~21 A: ~21 B: ~1E4 A ^ B: 1C3 A: 21 ! A: ~22 A: ~21 ! A: 20 A: ~21 A ~>> 0: ~21 A: ~21 A ~>> 1: ~11 A: ~21 A ~>> 2: ~9 A: ~21 A ~>> F: ~1 A: ~21 A ~>> 10: ~1 A: ~21 A ~>> 11: ~1 A: ~21 A ~>> 12: ~1 A: ~21 A << 0: ~21 A: ~21 A << 1: ~42 A: ~21 A << 2: ~84 A: ~21 A << F: ~108000 A: ~21 A << 10: ~210000 A: ~21 A << 11: ~420000 A: ~21 A << 12: ~840000 A: 16B B: 16B A & B: 16B A: 16B B: 16B A | B: 16B A: 16B B: 16B A ^ B: 0 A: ~16B B: 16B A & B: 1 A: ~16B B: 16B A | B: ~1 A: ~16B B: 16B A ^ B: ~2 A: 16B B: ~16B A & B: 1 A: 16B B: ~16B A | B: ~1 A: 16B B: ~16B A ^ B: ~2 A: ~16B B: ~16B A & B: ~16B A: ~16B B: ~16B A | B: ~16B A: ~16B B: ~16B A ^ B: 0 A: 16B B: 1E4 A & B: 160 A: 16B B: 1E4 A | B: 1EF A: 16B B: 1E4 A ^ B: 8F A: ~16B B: 1E4 A & B: 84 A: ~16B B: 1E4 A | B: ~B A: ~16B B: 1E4 A ^ B: ~8F A: 16B B: ~1E4 A & B: 8 A: 16B B: ~1E4 A | B: ~81 A: 16B B: ~1E4 A ^ B: ~89 A: ~16B B: ~1E4 A & B: ~1EC A: ~16B B: ~1E4 A | B: ~163 A: ~16B B: ~1E4 A ^ B: 89 A: 16B B: F99 A & B: 109 A: 16B B: F99 A | B: FFB A: 16B B: F99 A ^ B: EF2 A: ~16B B: F99 A & B: E91 A: ~16B B: F99 A | B: ~63 A: ~16B B: F99 A ^ B: ~EF4 A: 16B B: ~F99 A & B: 63 A: 16B B: ~F99 A | B: ~E91 A: 16B B: ~F99 A ^ B: ~EF4 A: ~16B B: ~F99 A & B: ~FFB A: ~16B B: ~F99 A | B: ~109 A: ~16B B: ~F99 A ^ B: EF2 A: 16B B: 14CC A & B: 48 A: 16B B: 14CC A | B: 15EF A: 16B B: 14CC A ^ B: 15A7 A: ~16B B: 14CC A & B: 1484 A: ~16B B: 14CC A | B: ~123 A: ~16B B: 14CC A ^ B: ~15A7 A: 16B B: ~14CC A & B: 120 A: 16B B: ~14CC A | B: ~1481 A: 16B B: ~14CC A ^ B: ~15A1 A: ~16B B: ~14CC A & B: ~15EC A: ~16B B: ~14CC A | B: ~4B A: ~16B B: ~14CC A ^ B: 15A1 A: 16B ! A: ~16C A: ~16B ! A: 16A A: ~16B A ~>> 0: ~16B A: ~16B A ~>> 1: ~B6 A: ~16B A ~>> 2: ~5B A: ~16B A ~>> F: ~1 A: ~16B A ~>> 10: ~1 A: ~16B A ~>> 11: ~1 A: ~16B A ~>> 12: ~1 A: ~16B A << 0: ~16B A: ~16B A << 1: ~2D6 A: ~16B A << 2: ~5AC A: ~16B A << F: ~B58000 A: ~16B A << 10: ~16B0000 A: ~16B A << 11: ~2D60000 A: ~16B A << 12: ~5AC0000 A: F99 B: F99 A & B: F99 A: F99 B: F99 A | B: F99 A: F99 B: F99 A ^ B: 0 A: ~F99 B: F99 A & B: 1 A: ~F99 B: F99 A | B: ~1 A: ~F99 B: F99 A ^ B: ~2 A: F99 B: ~F99 A & B: 1 A: F99 B: ~F99 A | B: ~1 A: F99 B: ~F99 A ^ B: ~2 A: ~F99 B: ~F99 A & B: ~F99 A: ~F99 B: ~F99 A | B: ~F99 A: ~F99 B: ~F99 A ^ B: 0 A: F99 B: 14CC A & B: 488 A: F99 B: 14CC A | B: 1FDD A: F99 B: 14CC A ^ B: 1B55 A: ~F99 B: 14CC A & B: 1044 A: ~F99 B: 14CC A | B: ~B11 A: ~F99 B: 14CC A ^ B: ~1B55 A: F99 B: ~14CC A & B: B10 A: F99 B: ~14CC A | B: ~1043 A: F99 B: ~14CC A ^ B: ~1B53 A: ~F99 B: ~14CC A & B: ~1FDC A: ~F99 B: ~14CC A | B: ~489 A: ~F99 B: ~14CC A ^ B: 1B53 A: F99 B: AB93 A & B: B91 A: F99 B: AB93 A | B: AF9B A: F99 B: AB93 A ^ B: A40A A: ~F99 B: AB93 A & B: A003 A: ~F99 B: AB93 A | B: ~409 A: ~F99 B: AB93 A ^ B: ~A40C A: F99 B: ~AB93 A & B: 409 A: F99 B: ~AB93 A | B: ~A003 A: F99 B: ~AB93 A ^ B: ~A40C A: ~F99 B: ~AB93 A & B: ~AF9B A: ~F99 B: ~AB93 A | B: ~B91 A: ~F99 B: ~AB93 A ^ B: A40A A: F99 B: E4C4 A & B: 480 A: F99 B: E4C4 A | B: EFDD A: F99 B: E4C4 A ^ B: EB5D A: ~F99 B: E4C4 A & B: E044 A: ~F99 B: E4C4 A | B: ~B19 A: ~F99 B: E4C4 A ^ B: ~EB5D A: F99 B: ~E4C4 A & B: B18 A: F99 B: ~E4C4 A | B: ~E043 A: F99 B: ~E4C4 A ^ B: ~EB5B A: ~F99 B: ~E4C4 A & B: ~EFDC A: ~F99 B: ~E4C4 A | B: ~481 A: ~F99 B: ~E4C4 A ^ B: EB5B A: F99 ! A: ~F9A A: ~F99 ! A: F98 A: ~F99 A ~>> 0: ~F99 A: ~F99 A ~>> 1: ~7CD A: ~F99 A ~>> 2: ~3E7 A: ~F99 A ~>> F: ~1 A: ~F99 A ~>> 10: ~1 A: ~F99 A ~>> 11: ~1 A: ~F99 A ~>> 12: ~1 A: ~F99 A << 0: ~F99 A: ~F99 A << 1: ~1F32 A: ~F99 A << 2: ~3E64 A: ~F99 A << F: ~7CC8000 A: ~F99 A << 10: ~F990000 A: ~F99 A << 11: ~1F320000 A: ~F99 A << 12: ~3E640000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: CC6DB61 A & B: 0 A: 0 B: CC6DB61 A | B: CC6DB61 A: 0 B: CC6DB61 A ^ B: CC6DB61 A: 0 B: CC6DB61 A & B: 0 A: 0 B: CC6DB61 A | B: CC6DB61 A: 0 B: CC6DB61 A ^ B: CC6DB61 A: 0 B: ~CC6DB61 A & B: 0 A: 0 B: ~CC6DB61 A | B: ~CC6DB61 A: 0 B: ~CC6DB61 A ^ B: ~CC6DB61 A: 0 B: ~CC6DB61 A & B: 0 A: 0 B: ~CC6DB61 A | B: ~CC6DB61 A: 0 B: ~CC6DB61 A ^ B: ~CC6DB61 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 426DE69953 A & B: 0 A: 0 B: 426DE69953 A | B: 426DE69953 A: 0 B: 426DE69953 A ^ B: 426DE69953 A: 0 B: 426DE69953 A & B: 0 A: 0 B: 426DE69953 A | B: 426DE69953 A: 0 B: 426DE69953 A ^ B: 426DE69953 A: 0 B: ~426DE69953 A & B: 0 A: 0 B: ~426DE69953 A | B: ~426DE69953 A: 0 B: ~426DE69953 A ^ B: ~426DE69953 A: 0 B: ~426DE69953 A & B: 0 A: 0 B: ~426DE69953 A | B: ~426DE69953 A: 0 B: ~426DE69953 A ^ B: ~426DE69953 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: CC6DB61 B: CC6DB61 A & B: CC6DB61 A: CC6DB61 B: CC6DB61 A | B: CC6DB61 A: CC6DB61 B: CC6DB61 A ^ B: 0 A: ~CC6DB61 B: CC6DB61 A & B: 1 A: ~CC6DB61 B: CC6DB61 A | B: ~1 A: ~CC6DB61 B: CC6DB61 A ^ B: ~2 A: CC6DB61 B: ~CC6DB61 A & B: 1 A: CC6DB61 B: ~CC6DB61 A | B: ~1 A: CC6DB61 B: ~CC6DB61 A ^ B: ~2 A: ~CC6DB61 B: ~CC6DB61 A & B: ~CC6DB61 A: ~CC6DB61 B: ~CC6DB61 A | B: ~CC6DB61 A: ~CC6DB61 B: ~CC6DB61 A ^ B: 0 A: CC6DB61 B: 198DB6C2 A & B: 8849240 A: CC6DB61 B: 198DB6C2 A | B: 1DCFFFE3 A: CC6DB61 B: 198DB6C2 A ^ B: 154B6DA3 A: ~CC6DB61 B: 198DB6C2 A & B: 11092482 A: ~CC6DB61 B: 198DB6C2 A | B: ~4424921 A: ~CC6DB61 B: 198DB6C2 A ^ B: ~154B6DA3 A: CC6DB61 B: ~198DB6C2 A & B: 4424920 A: CC6DB61 B: ~198DB6C2 A | B: ~11092481 A: CC6DB61 B: ~198DB6C2 A ^ B: ~154B6DA1 A: ~CC6DB61 B: ~198DB6C2 A & B: ~1DCFFFE2 A: ~CC6DB61 B: ~198DB6C2 A | B: ~8849241 A: ~CC6DB61 B: ~198DB6C2 A ^ B: 154B6DA1 A: CC6DB61 B: 8C8B6D2B A & B: C824921 A: CC6DB61 B: 8C8B6D2B A | B: 8CCFFF6B A: CC6DB61 B: 8C8B6D2B A ^ B: 804DB64A A: ~CC6DB61 B: 8C8B6D2B A & B: 8009240B A: ~CC6DB61 B: 8C8B6D2B A | B: ~449241 A: ~CC6DB61 B: 8C8B6D2B A ^ B: ~804DB64C A: CC6DB61 B: ~8C8B6D2B A & B: 449241 A: CC6DB61 B: ~8C8B6D2B A | B: ~8009240B A: CC6DB61 B: ~8C8B6D2B A ^ B: ~804DB64C A: ~CC6DB61 B: ~8C8B6D2B A & B: ~8CCFFF6B A: ~CC6DB61 B: ~8C8B6D2B A | B: ~C824921 A: ~CC6DB61 B: ~8C8B6D2B A ^ B: 804DB64A A: CC6DB61 B: 11916DA56 A & B: 806DA40 A: CC6DB61 B: 11916DA56 A | B: 11DD6DB77 A: CC6DB61 B: 11916DA56 A ^ B: 115D00137 A: ~CC6DB61 B: 11916DA56 A & B: 111100016 A: ~CC6DB61 B: 11916DA56 A | B: ~4C00121 A: ~CC6DB61 B: 11916DA56 A ^ B: ~115D00137 A: CC6DB61 B: ~11916DA56 A & B: 4C00120 A: CC6DB61 B: ~11916DA56 A | B: ~111100015 A: CC6DB61 B: ~11916DA56 A ^ B: ~115D00135 A: ~CC6DB61 B: ~11916DA56 A & B: ~11DD6DB76 A: ~CC6DB61 B: ~11916DA56 A | B: ~806DA41 A: ~CC6DB61 B: ~11916DA56 A ^ B: 115D00135 A: CC6DB61 ! A: ~CC6DB62 A: ~CC6DB61 ! A: CC6DB60 A: ~CC6DB61 A ~>> 0: ~CC6DB61 A: ~CC6DB61 A ~>> 1: ~6636DB1 A: ~CC6DB61 A ~>> 2: ~331B6D9 A: ~CC6DB61 A ~>> F: ~198E A: ~CC6DB61 A ~>> 10: ~CC7 A: ~CC6DB61 A ~>> 11: ~664 A: ~CC6DB61 A ~>> 12: ~332 A: ~CC6DB61 A << 0: ~CC6DB61 A: ~CC6DB61 A << 1: ~198DB6C2 A: ~CC6DB61 A << 2: ~331B6D84 A: ~CC6DB61 A << F: ~6636DB08000 A: ~CC6DB61 A << 10: ~CC6DB610000 A: ~CC6DB61 A << 11: ~198DB6C20000 A: ~CC6DB61 A << 12: ~331B6D840000 A: 8C8B6D2B B: 8C8B6D2B A & B: 8C8B6D2B A: 8C8B6D2B B: 8C8B6D2B A | B: 8C8B6D2B A: 8C8B6D2B B: 8C8B6D2B A ^ B: 0 A: ~8C8B6D2B B: 8C8B6D2B A & B: 1 A: ~8C8B6D2B B: 8C8B6D2B A | B: ~1 A: ~8C8B6D2B B: 8C8B6D2B A ^ B: ~2 A: 8C8B6D2B B: ~8C8B6D2B A & B: 1 A: 8C8B6D2B B: ~8C8B6D2B A | B: ~1 A: 8C8B6D2B B: ~8C8B6D2B A ^ B: ~2 A: ~8C8B6D2B B: ~8C8B6D2B A & B: ~8C8B6D2B A: ~8C8B6D2B B: ~8C8B6D2B A | B: ~8C8B6D2B A: ~8C8B6D2B B: ~8C8B6D2B A ^ B: 0 A: 8C8B6D2B B: 11916DA56 A & B: 8024802 A: 8C8B6D2B B: 11916DA56 A | B: 19D9FFF7F A: 8C8B6D2B B: 11916DA56 A ^ B: 1959DB77D A: ~8C8B6D2B B: 11916DA56 A & B: 111149254 A: ~8C8B6D2B B: 11916DA56 A | B: ~84892529 A: ~8C8B6D2B B: 11916DA56 A ^ B: ~1959DB77D A: 8C8B6D2B B: ~11916DA56 A & B: 8489252A A: 8C8B6D2B B: ~11916DA56 A | B: ~111149255 A: 8C8B6D2B B: ~11916DA56 A ^ B: ~1959DB77F A: ~8C8B6D2B B: ~11916DA56 A & B: ~19D9FFF80 A: ~8C8B6D2B B: ~11916DA56 A | B: ~8024801 A: ~8C8B6D2B B: ~11916DA56 A ^ B: 1959DB77F A: 8C8B6D2B B: 609FDB0D9 A & B: 8892009 A: 8C8B6D2B B: 609FDB0D9 A | B: 68DFFFDFB A: 8C8B6D2B B: 609FDB0D9 A ^ B: 68576DDF2 A: ~8C8B6D2B B: 609FDB0D9 A & B: 6017490D1 A: ~8C8B6D2B B: 609FDB0D9 A | B: ~84024D23 A: ~8C8B6D2B B: 609FDB0D9 A ^ B: ~68576DDF4 A: 8C8B6D2B B: ~609FDB0D9 A & B: 84024D23 A: 8C8B6D2B B: ~609FDB0D9 A | B: ~6017490D1 A: 8C8B6D2B B: ~609FDB0D9 A ^ B: ~68576DDF4 A: ~8C8B6D2B B: ~609FDB0D9 A & B: ~68DFFFDFB A: ~8C8B6D2B B: ~609FDB0D9 A | B: ~8892009 A: ~8C8B6D2B B: ~609FDB0D9 A ^ B: 68576DDF2 A: 8C8B6D2B B: C13FB61B2 A & B: 8B6122 A: 8C8B6D2B B: C13FB61B2 A | B: C9FFB6DBB A: 8C8B6D2B B: C13FB61B2 A ^ B: C9F700C99 A: ~8C8B6D2B B: C13FB61B2 A & B: C13700090 A: ~8C8B6D2B B: C13FB61B2 A | B: ~8C000C09 A: ~8C8B6D2B B: C13FB61B2 A ^ B: ~C9F700C99 A: 8C8B6D2B B: ~C13FB61B2 A & B: 8C000C0A A: 8C8B6D2B B: ~C13FB61B2 A | B: ~C13700091 A: 8C8B6D2B B: ~C13FB61B2 A ^ B: ~C9F700C9B A: ~8C8B6D2B B: ~C13FB61B2 A & B: ~C9FFB6DBC A: ~8C8B6D2B B: ~C13FB61B2 A | B: ~8B6121 A: ~8C8B6D2B B: ~C13FB61B2 A ^ B: C9F700C9B A: 8C8B6D2B ! A: ~8C8B6D2C A: ~8C8B6D2B ! A: 8C8B6D2A A: ~8C8B6D2B A ~>> 0: ~8C8B6D2B A: ~8C8B6D2B A ~>> 1: ~4645B696 A: ~8C8B6D2B A ~>> 2: ~2322DB4B A: ~8C8B6D2B A ~>> F: ~11917 A: ~8C8B6D2B A ~>> 10: ~8C8C A: ~8C8B6D2B A ~>> 11: ~4646 A: ~8C8B6D2B A ~>> 12: ~2323 A: ~8C8B6D2B A << 0: ~8C8B6D2B A: ~8C8B6D2B A << 1: ~11916DA56 A: ~8C8B6D2B A << 2: ~2322DB4AC A: ~8C8B6D2B A << F: ~4645B6958000 A: ~8C8B6D2B A << 10: ~8C8B6D2B0000 A: ~8C8B6D2B A << 11: ~11916DA560000 A: ~8C8B6D2B A << 12: ~2322DB4AC0000 A: 609FDB0D9 B: 609FDB0D9 A & B: 609FDB0D9 A: 609FDB0D9 B: 609FDB0D9 A | B: 609FDB0D9 A: 609FDB0D9 B: 609FDB0D9 A ^ B: 0 A: ~609FDB0D9 B: 609FDB0D9 A & B: 1 A: ~609FDB0D9 B: 609FDB0D9 A | B: ~1 A: ~609FDB0D9 B: 609FDB0D9 A ^ B: ~2 A: 609FDB0D9 B: ~609FDB0D9 A & B: 1 A: 609FDB0D9 B: ~609FDB0D9 A | B: ~1 A: 609FDB0D9 B: ~609FDB0D9 A ^ B: ~2 A: ~609FDB0D9 B: ~609FDB0D9 A & B: ~609FDB0D9 A: ~609FDB0D9 B: ~609FDB0D9 A | B: ~609FDB0D9 A: ~609FDB0D9 B: ~609FDB0D9 A ^ B: 0 A: 609FDB0D9 B: C13FB61B2 A & B: 401F92090 A: 609FDB0D9 B: C13FB61B2 A | B: E1BFFF1FB A: 609FDB0D9 B: C13FB61B2 A ^ B: A1A06D16B A: ~609FDB0D9 B: C13FB61B2 A & B: 812024122 A: ~609FDB0D9 B: C13FB61B2 A | B: ~208049049 A: ~609FDB0D9 B: C13FB61B2 A ^ B: ~A1A06D16B A: 609FDB0D9 B: ~C13FB61B2 A & B: 208049048 A: 609FDB0D9 B: ~C13FB61B2 A | B: ~812024121 A: 609FDB0D9 B: ~C13FB61B2 A ^ B: ~A1A06D169 A: ~609FDB0D9 B: ~C13FB61B2 A & B: ~E1BFFF1FA A: ~609FDB0D9 B: ~C13FB61B2 A | B: ~401F92091 A: ~609FDB0D9 B: ~C13FB61B2 A ^ B: A1A06D169 A: 609FDB0D9 B: 426DE69953 A & B: 209E49051 A: 609FDB0D9 B: 426DE69953 A | B: 466DFFB9DB A: 609FDB0D9 B: 426DE69953 A ^ B: 44641B298A A: ~609FDB0D9 B: 426DE69953 A & B: 4064020903 A: ~609FDB0D9 B: 426DE69953 A | B: ~400192089 A: ~609FDB0D9 B: 426DE69953 A ^ B: ~44641B298C A: 609FDB0D9 B: ~426DE69953 A & B: 400192089 A: 609FDB0D9 B: ~426DE69953 A | B: ~4064020903 A: 609FDB0D9 B: ~426DE69953 A ^ B: ~44641B298C A: ~609FDB0D9 B: ~426DE69953 A & B: ~466DFFB9DB A: ~609FDB0D9 B: ~426DE69953 A | B: ~209E49051 A: ~609FDB0D9 B: ~426DE69953 A ^ B: 44641B298A A: 609FDB0D9 B: 84DBCD32A6 A & B: 409CD3080 A: 609FDB0D9 B: 84DBCD32A6 A | B: 86DBFDB2FF A: 609FDB0D9 B: 84DBCD32A6 A ^ B: 82D230827F A: ~609FDB0D9 B: 84DBCD32A6 A & B: 80D2000226 A: ~609FDB0D9 B: 84DBCD32A6 A | B: ~200308059 A: ~609FDB0D9 B: 84DBCD32A6 A ^ B: ~82D230827F A: 609FDB0D9 B: ~84DBCD32A6 A & B: 200308058 A: 609FDB0D9 B: ~84DBCD32A6 A | B: ~80D2000225 A: 609FDB0D9 B: ~84DBCD32A6 A ^ B: ~82D230827D A: ~609FDB0D9 B: ~84DBCD32A6 A & B: ~86DBFDB2FE A: ~609FDB0D9 B: ~84DBCD32A6 A | B: ~409CD3081 A: ~609FDB0D9 B: ~84DBCD32A6 A ^ B: 82D230827D A: 609FDB0D9 ! A: ~609FDB0DA A: ~609FDB0D9 ! A: 609FDB0D8 A: ~609FDB0D9 A ~>> 0: ~609FDB0D9 A: ~609FDB0D9 A ~>> 1: ~304FED86D A: ~609FDB0D9 A ~>> 2: ~1827F6C37 A: ~609FDB0D9 A ~>> F: ~C13FC A: ~609FDB0D9 A ~>> 10: ~609FE A: ~609FDB0D9 A ~>> 11: ~304FF A: ~609FDB0D9 A ~>> 12: ~18280 A: ~609FDB0D9 A << 0: ~609FDB0D9 A: ~609FDB0D9 A << 1: ~C13FB61B2 A: ~609FDB0D9 A << 2: ~1827F6C364 A: ~609FDB0D9 A << F: ~304FED86C8000 A: ~609FDB0D9 A << 10: ~609FDB0D90000 A: ~609FDB0D9 A << 11: ~C13FB61B20000 A: ~609FDB0D9 A << 12: ~1827F6C3640000 A: 198DB6C2 B: 198DB6C2 A & B: 198DB6C2 A: 198DB6C2 B: 198DB6C2 A | B: 198DB6C2 A: 198DB6C2 B: 198DB6C2 A ^ B: 0 A: ~198DB6C2 B: 198DB6C2 A & B: 2 A: ~198DB6C2 B: 198DB6C2 A | B: ~2 A: ~198DB6C2 B: 198DB6C2 A ^ B: ~4 A: 198DB6C2 B: ~198DB6C2 A & B: 2 A: 198DB6C2 B: ~198DB6C2 A | B: ~2 A: 198DB6C2 B: ~198DB6C2 A ^ B: ~4 A: ~198DB6C2 B: ~198DB6C2 A & B: ~198DB6C2 A: ~198DB6C2 B: ~198DB6C2 A | B: ~198DB6C2 A: ~198DB6C2 B: ~198DB6C2 A ^ B: 0 A: 198DB6C2 B: 26549223 A & B: 49202 A: 198DB6C2 B: 26549223 A | B: 3FDDB6E3 A: 198DB6C2 B: 26549223 A ^ B: 3FD924E1 A: ~198DB6C2 B: 26549223 A & B: 26500022 A: ~198DB6C2 B: 26549223 A | B: ~198924C1 A: ~198DB6C2 B: 26549223 A ^ B: ~3FD924E3 A: 198DB6C2 B: ~26549223 A & B: 198924C0 A: 198DB6C2 B: ~26549223 A | B: ~26500021 A: 198DB6C2 B: ~26549223 A ^ B: ~3FD924E1 A: ~198DB6C2 B: ~26549223 A & B: ~3FDDB6E4 A: ~198DB6C2 B: ~26549223 A | B: ~49201 A: ~198DB6C2 B: ~26549223 A ^ B: 3FD924E3 A: 198DB6C2 B: 11916DA56 A & B: 19049242 A: 198DB6C2 B: 11916DA56 A | B: 1199FFED6 A: 198DB6C2 B: 11916DA56 A ^ B: 1009B6C94 A: ~198DB6C2 B: 11916DA56 A & B: 100124816 A: ~198DB6C2 B: 11916DA56 A | B: ~892482 A: ~198DB6C2 B: 11916DA56 A ^ B: ~1009B6C98 A: 198DB6C2 B: ~11916DA56 A & B: 892482 A: 198DB6C2 B: ~11916DA56 A | B: ~100124816 A: 198DB6C2 B: ~11916DA56 A ^ B: ~1009B6C98 A: ~198DB6C2 B: ~11916DA56 A & B: ~1199FFED6 A: ~198DB6C2 B: ~11916DA56 A | B: ~19049242 A: ~198DB6C2 B: ~11916DA56 A ^ B: 1009B6C94 A: 198DB6C2 B: 1A5A24781 A & B: 1800680 A: 198DB6C2 B: 1A5A24781 A | B: 1BDAFF7C3 A: 198DB6C2 B: 1A5A24781 A ^ B: 1BC2FF143 A: ~198DB6C2 B: 1A5A24781 A & B: 1A4224100 A: ~198DB6C2 B: 1A5A24781 A | B: ~180DB041 A: ~198DB6C2 B: 1A5A24781 A ^ B: ~1BC2FF141 A: 198DB6C2 B: ~1A5A24781 A & B: 180DB042 A: 198DB6C2 B: ~1A5A24781 A | B: ~1A4224101 A: 198DB6C2 B: ~1A5A24781 A ^ B: ~1BC2FF143 A: ~198DB6C2 B: ~1A5A24781 A & B: ~1BDAFF7C2 A: ~198DB6C2 B: ~1A5A24781 A | B: ~1800681 A: ~198DB6C2 B: ~1A5A24781 A ^ B: 1BC2FF141 A: 198DB6C2 ! A: ~198DB6C3 A: ~198DB6C2 ! A: 198DB6C1 A: ~198DB6C2 A ~>> 0: ~198DB6C2 A: ~198DB6C2 A ~>> 1: ~CC6DB61 A: ~198DB6C2 A ~>> 2: ~6636DB1 A: ~198DB6C2 A ~>> F: ~331C A: ~198DB6C2 A ~>> 10: ~198E A: ~198DB6C2 A ~>> 11: ~CC7 A: ~198DB6C2 A ~>> 12: ~664 A: ~198DB6C2 A << 0: ~198DB6C2 A: ~198DB6C2 A << 1: ~331B6D84 A: ~198DB6C2 A << 2: ~6636DB08 A: ~198DB6C2 A << F: ~CC6DB610000 A: ~198DB6C2 A << 10: ~198DB6C20000 A: ~198DB6C2 A << 11: ~331B6D840000 A: ~198DB6C2 A << 12: ~6636DB080000 A: 11916DA56 B: 11916DA56 A & B: 11916DA56 A: 11916DA56 B: 11916DA56 A | B: 11916DA56 A: 11916DA56 B: 11916DA56 A ^ B: 0 A: ~11916DA56 B: 11916DA56 A & B: 2 A: ~11916DA56 B: 11916DA56 A | B: ~2 A: ~11916DA56 B: 11916DA56 A ^ B: ~4 A: 11916DA56 B: ~11916DA56 A & B: 2 A: 11916DA56 B: ~11916DA56 A | B: ~2 A: 11916DA56 B: ~11916DA56 A ^ B: ~4 A: ~11916DA56 B: ~11916DA56 A & B: ~11916DA56 A: ~11916DA56 B: ~11916DA56 A | B: ~11916DA56 A: ~11916DA56 B: ~11916DA56 A ^ B: 0 A: 11916DA56 B: 1A5A24781 A & B: 101024200 A: 11916DA56 B: 1A5A24781 A | B: 1BDB6DFD7 A: 11916DA56 B: 1A5A24781 A ^ B: BCB49DD7 A: ~11916DA56 B: 1A5A24781 A & B: A4A00580 A: ~11916DA56 B: 1A5A24781 A | B: ~18149855 A: ~11916DA56 B: 1A5A24781 A ^ B: ~BCB49DD5 A: 11916DA56 B: ~1A5A24781 A & B: 18149856 A: 11916DA56 B: ~1A5A24781 A | B: ~A4A00581 A: 11916DA56 B: ~1A5A24781 A ^ B: ~BCB49DD7 A: ~11916DA56 B: ~1A5A24781 A & B: ~1BDB6DFD6 A: ~11916DA56 B: ~1A5A24781 A | B: ~101024201 A: ~11916DA56 B: ~1A5A24781 A ^ B: BCB49DD5 A: 11916DA56 B: C13FB61B2 A & B: 11124012 A: 11916DA56 B: C13FB61B2 A | B: D1BFFFBF6 A: 11916DA56 B: C13FB61B2 A ^ B: D0AEDBBE4 A: ~11916DA56 B: C13FB61B2 A & B: C02E921A2 A: ~11916DA56 B: C13FB61B2 A | B: ~108049A46 A: ~11916DA56 B: C13FB61B2 A ^ B: ~D0AEDBBE8 A: 11916DA56 B: ~C13FB61B2 A & B: 108049A46 A: 11916DA56 B: ~C13FB61B2 A | B: ~C02E921A2 A: 11916DA56 B: ~C13FB61B2 A ^ B: ~D0AEDBBE8 A: ~11916DA56 B: ~C13FB61B2 A & B: ~D1BFFFBF6 A: ~11916DA56 B: ~C13FB61B2 A | B: ~11124012 A: ~11916DA56 B: ~C13FB61B2 A ^ B: D0AEDBBE4 A: 11916DA56 B: 121DF9128B A & B: 19101202 A: 11916DA56 B: 121DF9128B A | B: 131DFFDADF A: 11916DA56 B: 121DF9128B A ^ B: 1304EFC8DD A: ~11916DA56 B: 121DF9128B A & B: 1204E9008A A: ~11916DA56 B: 121DF9128B A | B: ~10006C855 A: ~11916DA56 B: 121DF9128B A ^ B: ~1304EFC8DF A: 11916DA56 B: ~121DF9128B A & B: 10006C854 A: 11916DA56 B: ~121DF9128B A | B: ~1204E90089 A: 11916DA56 B: ~121DF9128B A ^ B: ~1304EFC8DD A: ~11916DA56 B: ~121DF9128B A & B: ~131DFFDAE0 A: ~11916DA56 B: ~121DF9128B A | B: ~19101201 A: ~11916DA56 B: ~121DF9128B A ^ B: 1304EFC8DF A: 11916DA56 ! A: ~11916DA57 A: ~11916DA56 ! A: 11916DA55 A: ~11916DA56 A ~>> 0: ~11916DA56 A: ~11916DA56 A ~>> 1: ~8C8B6D2B A: ~11916DA56 A ~>> 2: ~4645B696 A: ~11916DA56 A ~>> F: ~2322E A: ~11916DA56 A ~>> 10: ~11917 A: ~11916DA56 A ~>> 11: ~8C8C A: ~11916DA56 A ~>> 12: ~4646 A: ~11916DA56 A << 0: ~11916DA56 A: ~11916DA56 A << 1: ~2322DB4AC A: ~11916DA56 A << 2: ~4645B6958 A: ~11916DA56 A << F: ~8C8B6D2B0000 A: ~11916DA56 A << 10: ~11916DA560000 A: ~11916DA56 A << 11: ~2322DB4AC0000 A: ~11916DA56 A << 12: ~4645B69580000 A: C13FB61B2 B: C13FB61B2 A & B: C13FB61B2 A: C13FB61B2 B: C13FB61B2 A | B: C13FB61B2 A: C13FB61B2 B: C13FB61B2 A ^ B: 0 A: ~C13FB61B2 B: C13FB61B2 A & B: 2 A: ~C13FB61B2 B: C13FB61B2 A | B: ~2 A: ~C13FB61B2 B: C13FB61B2 A ^ B: ~4 A: C13FB61B2 B: ~C13FB61B2 A & B: 2 A: C13FB61B2 B: ~C13FB61B2 A | B: ~2 A: C13FB61B2 B: ~C13FB61B2 A ^ B: ~4 A: ~C13FB61B2 B: ~C13FB61B2 A & B: ~C13FB61B2 A: ~C13FB61B2 B: ~C13FB61B2 A | B: ~C13FB61B2 A: ~C13FB61B2 B: ~C13FB61B2 A ^ B: 0 A: C13FB61B2 B: 121DF9128B A & B: 11F90082 A: C13FB61B2 B: 121DF9128B A | B: 1E1FFB73BB A: C13FB61B2 B: 121DF9128B A ^ B: 1E0E027339 A: ~C13FB61B2 B: 121DF9128B A & B: 120C00120A A: ~C13FB61B2 B: 121DF9128B A | B: ~C02026131 A: ~C13FB61B2 B: 121DF9128B A ^ B: ~1E0E02733B A: C13FB61B2 B: ~121DF9128B A & B: C02026130 A: C13FB61B2 B: ~121DF9128B A | B: ~120C001209 A: C13FB61B2 B: ~121DF9128B A ^ B: ~1E0E027339 A: ~C13FB61B2 B: ~121DF9128B A & B: ~1E1FFB73BC A: ~C13FB61B2 B: ~121DF9128B A | B: ~11F90081 A: ~C13FB61B2 B: ~121DF9128B A ^ B: 1E0E02733B A: C13FB61B2 B: 84DBCD32A6 A & B: 413C920A2 A: C13FB61B2 B: 84DBCD32A6 A | B: 8CDBFF73B6 A: C13FB61B2 B: 84DBCD32A6 A ^ B: 88C8365314 A: ~C13FB61B2 B: 84DBCD32A6 A & B: 80C8041206 A: ~C13FB61B2 B: 84DBCD32A6 A | B: ~800324112 A: ~C13FB61B2 B: 84DBCD32A6 A ^ B: ~88C8365318 A: C13FB61B2 B: ~84DBCD32A6 A & B: 800324112 A: C13FB61B2 B: ~84DBCD32A6 A | B: ~80C8041206 A: C13FB61B2 B: ~84DBCD32A6 A ^ B: ~88C8365318 A: ~C13FB61B2 B: ~84DBCD32A6 A & B: ~8CDBFF73B6 A: ~C13FB61B2 B: ~84DBCD32A6 A | B: ~413C920A2 A: ~C13FB61B2 B: ~84DBCD32A6 A ^ B: 88C8365314 A: C13FB61B2 B: C749B3CBF9 A & B: 401B341B0 A: C13FB61B2 B: C749B3CBF9 A | B: CF5BFBEBFB A: C13FB61B2 B: C749B3CBF9 A ^ B: CB5A48AA4B A: ~C13FB61B2 B: C749B3CBF9 A & B: C348008A48 A: ~C13FB61B2 B: C749B3CBF9 A | B: ~812482001 A: ~C13FB61B2 B: C749B3CBF9 A ^ B: ~CB5A48AA49 A: C13FB61B2 B: ~C749B3CBF9 A & B: 812482002 A: C13FB61B2 B: ~C749B3CBF9 A | B: ~C348008A49 A: C13FB61B2 B: ~C749B3CBF9 A ^ B: ~CB5A48AA4B A: ~C13FB61B2 B: ~C749B3CBF9 A & B: ~CF5BFBEBFA A: ~C13FB61B2 B: ~C749B3CBF9 A | B: ~401B341B1 A: ~C13FB61B2 B: ~C749B3CBF9 A ^ B: CB5A48AA49 A: C13FB61B2 ! A: ~C13FB61B3 A: ~C13FB61B2 ! A: C13FB61B1 A: ~C13FB61B2 A ~>> 0: ~C13FB61B2 A: ~C13FB61B2 A ~>> 1: ~609FDB0D9 A: ~C13FB61B2 A ~>> 2: ~304FED86D A: ~C13FB61B2 A ~>> F: ~1827F7 A: ~C13FB61B2 A ~>> 10: ~C13FC A: ~C13FB61B2 A ~>> 11: ~609FE A: ~C13FB61B2 A ~>> 12: ~304FF A: ~C13FB61B2 A << 0: ~C13FB61B2 A: ~C13FB61B2 A << 1: ~1827F6C364 A: ~C13FB61B2 A << 2: ~304FED86C8 A: ~C13FB61B2 A << F: ~609FDB0D90000 A: ~C13FB61B2 A << 10: ~C13FB61B20000 A: ~C13FB61B2 A << 11: ~1827F6C3640000 A: ~C13FB61B2 A << 12: ~304FED86C80000 A: 26549223 B: 26549223 A & B: 26549223 A: 26549223 B: 26549223 A | B: 26549223 A: 26549223 B: 26549223 A ^ B: 0 A: ~26549223 B: 26549223 A & B: 1 A: ~26549223 B: 26549223 A | B: ~1 A: ~26549223 B: 26549223 A ^ B: ~2 A: 26549223 B: ~26549223 A & B: 1 A: 26549223 B: ~26549223 A | B: ~1 A: 26549223 B: ~26549223 A ^ B: ~2 A: ~26549223 B: ~26549223 A & B: ~26549223 A: ~26549223 B: ~26549223 A | B: ~26549223 A: ~26549223 B: ~26549223 A ^ B: 0 A: 26549223 B: 331B6D84 A & B: 22100000 A: 26549223 B: 331B6D84 A | B: 375FFFA7 A: 26549223 B: 331B6D84 A ^ B: 154FFFA7 A: ~26549223 B: 331B6D84 A & B: 110B6D84 A: ~26549223 B: 331B6D84 A | B: ~4449223 A: ~26549223 B: 331B6D84 A ^ B: ~154FFFA7 A: 26549223 B: ~331B6D84 A & B: 4449220 A: 26549223 B: ~331B6D84 A | B: ~110B6D81 A: 26549223 B: ~331B6D84 A ^ B: ~154FFFA1 A: ~26549223 B: ~331B6D84 A & B: ~375FFFA4 A: ~26549223 B: ~331B6D84 A | B: ~22100003 A: ~26549223 B: ~331B6D84 A ^ B: 154FFFA1 A: 26549223 B: 1A5A24781 A & B: 24000201 A: 26549223 B: 1A5A24781 A | B: 1A7F6D7A3 A: 26549223 B: 1A5A24781 A ^ B: 183F6D5A2 A: ~26549223 B: 1A5A24781 A & B: 181A24581 A: ~26549223 B: 1A5A24781 A | B: ~2549023 A: ~26549223 B: 1A5A24781 A ^ B: ~183F6D5A4 A: 26549223 B: ~1A5A24781 A & B: 2549023 A: 26549223 B: ~1A5A24781 A | B: ~181A24581 A: 26549223 B: ~1A5A24781 A ^ B: ~183F6D5A4 A: ~26549223 B: ~1A5A24781 A & B: ~1A7F6D7A3 A: ~26549223 B: ~1A5A24781 A | B: ~24000201 A: ~26549223 B: ~1A5A24781 A ^ B: 183F6D5A2 A: 26549223 B: 2322DB4AC A & B: 22049020 A: 26549223 B: 2322DB4AC A | B: 2367DB6AF A: 26549223 B: 2322DB4AC A ^ B: 21479268F A: ~26549223 B: 2322DB4AC A & B: 21029248C A: ~26549223 B: 2322DB4AC A | B: ~4500203 A: ~26549223 B: 2322DB4AC A ^ B: ~21479268F A: 26549223 B: ~2322DB4AC A & B: 4500200 A: 26549223 B: ~2322DB4AC A | B: ~210292489 A: 26549223 B: ~2322DB4AC A ^ B: ~214792689 A: ~26549223 B: ~2322DB4AC A & B: ~2367DB6AC A: ~26549223 B: ~2322DB4AC A | B: ~22049023 A: ~26549223 B: ~2322DB4AC A ^ B: 214792689 A: 26549223 ! A: ~26549224 A: ~26549223 ! A: 26549222 A: ~26549223 A ~>> 0: ~26549223 A: ~26549223 A ~>> 1: ~132A4912 A: ~26549223 A ~>> 2: ~9952489 A: ~26549223 A ~>> F: ~4CAA A: ~26549223 A ~>> 10: ~2655 A: ~26549223 A ~>> 11: ~132B A: ~26549223 A ~>> 12: ~996 A: ~26549223 A << 0: ~26549223 A: ~26549223 A << 1: ~4CA92446 A: ~26549223 A << 2: ~9952488C A: ~26549223 A << F: ~132A49118000 A: ~26549223 A << 10: ~265492230000 A: ~26549223 A << 11: ~4CA924460000 A: ~26549223 A << 12: ~9952488C0000 A: 1A5A24781 B: 1A5A24781 A & B: 1A5A24781 A: 1A5A24781 B: 1A5A24781 A | B: 1A5A24781 A: 1A5A24781 B: 1A5A24781 A ^ B: 0 A: ~1A5A24781 B: 1A5A24781 A & B: 1 A: ~1A5A24781 B: 1A5A24781 A | B: ~1 A: ~1A5A24781 B: 1A5A24781 A ^ B: ~2 A: 1A5A24781 B: ~1A5A24781 A & B: 1 A: 1A5A24781 B: ~1A5A24781 A | B: ~1 A: 1A5A24781 B: ~1A5A24781 A ^ B: ~2 A: ~1A5A24781 B: ~1A5A24781 A & B: ~1A5A24781 A: ~1A5A24781 B: ~1A5A24781 A | B: ~1A5A24781 A: ~1A5A24781 B: ~1A5A24781 A ^ B: 0 A: 1A5A24781 B: 2322DB4AC A & B: 20200480 A: 1A5A24781 B: 2322DB4AC A | B: 3B7AFF7AD A: 1A5A24781 B: 2322DB4AC A ^ B: 3978FF32D A: ~1A5A24781 B: 2322DB4AC A & B: 2120DB02C A: ~1A5A24781 B: 2322DB4AC A | B: ~185824301 A: ~1A5A24781 B: 2322DB4AC A ^ B: ~3978FF32D A: 1A5A24781 B: ~2322DB4AC A & B: 185824300 A: 1A5A24781 B: ~2322DB4AC A | B: ~2120DB02B A: 1A5A24781 B: ~2322DB4AC A ^ B: ~3978FF32B A: ~1A5A24781 B: ~2322DB4AC A & B: ~3B7AFF7AC A: ~1A5A24781 B: ~2322DB4AC A | B: ~20200481 A: ~1A5A24781 B: ~2322DB4AC A ^ B: 3978FF32B A: 1A5A24781 B: 121DF9128B A & B: 5A00281 A: 1A5A24781 B: 121DF9128B A | B: 13BDFB578B A: 1A5A24781 B: 121DF9128B A ^ B: 13B85B550A A: ~1A5A24781 B: 121DF9128B A & B: 121859100B A: ~1A5A24781 B: 121DF9128B A | B: ~1A0024501 A: ~1A5A24781 B: 121DF9128B A ^ B: ~13B85B550C A: 1A5A24781 B: ~121DF9128B A & B: 1A0024501 A: 1A5A24781 B: ~121DF9128B A | B: ~121859100B A: 1A5A24781 B: ~121DF9128B A ^ B: ~13B85B550C A: ~1A5A24781 B: ~121DF9128B A & B: ~13BDFB578B A: ~1A5A24781 B: ~121DF9128B A | B: ~5A00281 A: ~1A5A24781 B: ~121DF9128B A ^ B: 13B85B550A A: 1A5A24781 B: 1827F6C364 A & B: 25A24300 A: 1A5A24781 B: 1827F6C364 A | B: 19A7F6C7E5 A: 1A5A24781 B: 1827F6C364 A ^ B: 19825484E5 A: ~1A5A24781 B: 1827F6C364 A & B: 1802548064 A: ~1A5A24781 B: 1827F6C364 A | B: ~180000481 A: ~1A5A24781 B: 1827F6C364 A ^ B: ~19825484E5 A: 1A5A24781 B: ~1827F6C364 A & B: 180000480 A: 1A5A24781 B: ~1827F6C364 A | B: ~1802548063 A: 1A5A24781 B: ~1827F6C364 A ^ B: ~19825484E3 A: ~1A5A24781 B: ~1827F6C364 A & B: ~19A7F6C7E4 A: ~1A5A24781 B: ~1827F6C364 A | B: ~25A24301 A: ~1A5A24781 B: ~1827F6C364 A ^ B: 19825484E3 A: 1A5A24781 ! A: ~1A5A24782 A: ~1A5A24781 ! A: 1A5A24780 A: ~1A5A24781 A ~>> 0: ~1A5A24781 A: ~1A5A24781 A ~>> 1: ~D2D123C1 A: ~1A5A24781 A ~>> 2: ~696891E1 A: ~1A5A24781 A ~>> F: ~34B45 A: ~1A5A24781 A ~>> 10: ~1A5A3 A: ~1A5A24781 A ~>> 11: ~D2D2 A: ~1A5A24781 A ~>> 12: ~6969 A: ~1A5A24781 A << 0: ~1A5A24781 A: ~1A5A24781 A << 1: ~34B448F02 A: ~1A5A24781 A << 2: ~696891E04 A: ~1A5A24781 A << F: ~D2D123C08000 A: ~1A5A24781 A << 10: ~1A5A247810000 A: ~1A5A24781 A << 11: ~34B448F020000 A: ~1A5A24781 A << 12: ~696891E040000 A: 121DF9128B B: 121DF9128B A & B: 121DF9128B A: 121DF9128B B: 121DF9128B A | B: 121DF9128B A: 121DF9128B B: 121DF9128B A ^ B: 0 A: ~121DF9128B B: 121DF9128B A & B: 1 A: ~121DF9128B B: 121DF9128B A | B: ~1 A: ~121DF9128B B: 121DF9128B A ^ B: ~2 A: 121DF9128B B: ~121DF9128B A & B: 1 A: 121DF9128B B: ~121DF9128B A | B: ~1 A: 121DF9128B B: ~121DF9128B A ^ B: ~2 A: ~121DF9128B B: ~121DF9128B A & B: ~121DF9128B A: ~121DF9128B B: ~121DF9128B A | B: ~121DF9128B A: ~121DF9128B B: ~121DF9128B A ^ B: 0 A: 121DF9128B B: 1827F6C364 A & B: 1005F00200 A: 121DF9128B B: 1827F6C364 A | B: 1A3FFFD3EF A: 121DF9128B B: 1827F6C364 A ^ B: A3A0FD1EF A: ~121DF9128B B: 1827F6C364 A & B: 82206C164 A: ~121DF9128B B: 1827F6C364 A | B: ~21809108B A: ~121DF9128B B: 1827F6C364 A ^ B: ~A3A0FD1EF A: 121DF9128B B: ~1827F6C364 A & B: 218091088 A: 121DF9128B B: ~1827F6C364 A | B: ~82206C161 A: 121DF9128B B: ~1827F6C364 A ^ B: ~A3A0FD1E9 A: ~121DF9128B B: ~1827F6C364 A & B: ~1A3FFFD3EC A: ~121DF9128B B: ~1827F6C364 A | B: ~1005F00203 A: ~121DF9128B B: ~1827F6C364 A ^ B: A3A0FD1E9 A: 121DF9128B B: C749B3CBF9 A & B: 209B10289 A: 121DF9128B B: C749B3CBF9 A | B: D75DFBDBFB A: 121DF9128B B: C749B3CBF9 A ^ B: D5544AD972 A: ~121DF9128B B: C749B3CBF9 A & B: C54002C971 A: ~121DF9128B B: C749B3CBF9 A | B: ~1014481003 A: ~121DF9128B B: C749B3CBF9 A ^ B: ~D5544AD974 A: 121DF9128B B: ~C749B3CBF9 A & B: 1014481003 A: 121DF9128B B: ~C749B3CBF9 A | B: ~C54002C971 A: 121DF9128B B: ~C749B3CBF9 A ^ B: ~D5544AD974 A: ~121DF9128B B: ~C749B3CBF9 A & B: ~D75DFBDBFB A: ~121DF9128B B: ~C749B3CBF9 A | B: ~209B10289 A: ~121DF9128B B: ~C749B3CBF9 A ^ B: D5544AD972 A: 121DF9128B B: 109B79A654C A & B: 15980008 A: 121DF9128B B: 109B79A654C A | B: 11BBFFB77CF A: 121DF9128B B: 109B79A654C A ^ B: 11BAA6377C7 A: ~121DF9128B B: 109B79A654C A & B: 109A2026544 A: ~121DF9128B B: 109B79A654C A | B: ~1208611283 A: ~121DF9128B B: 109B79A654C A ^ B: ~11BAA6377C7 A: 121DF9128B B: ~109B79A654C A & B: 1208611280 A: 121DF9128B B: ~109B79A654C A | B: ~109A2026541 A: 121DF9128B B: ~109B79A654C A ^ B: ~11BAA6377C1 A: ~121DF9128B B: ~109B79A654C A & B: ~11BBFFB77CC A: ~121DF9128B B: ~109B79A654C A | B: ~1598000B A: ~121DF9128B B: ~109B79A654C A ^ B: 11BAA6377C1 A: 121DF9128B ! A: ~121DF9128C A: ~121DF9128B ! A: 121DF9128A A: ~121DF9128B A ~>> 0: ~121DF9128B A: ~121DF9128B A ~>> 1: ~90EFC8946 A: ~121DF9128B A ~>> 2: ~4877E44A3 A: ~121DF9128B A ~>> F: ~243BF3 A: ~121DF9128B A ~>> 10: ~121DFA A: ~121DF9128B A ~>> 11: ~90EFD A: ~121DF9128B A ~>> 12: ~4877F A: ~121DF9128B A << 0: ~121DF9128B A: ~121DF9128B A << 1: ~243BF22516 A: ~121DF9128B A << 2: ~4877E44A2C A: ~121DF9128B A << F: ~90EFC89458000 A: ~121DF9128B A << 10: ~121DF9128B0000 A: ~121DF9128B A << 11: ~243BF225160000 A: ~121DF9128B A << 12: ~4877E44A2C0000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 2478481C02491517F1 A & B: 0 A: 0 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A ^ B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A & B: 0 A: 0 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A ^ B: 2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A & B: 0 A: 0 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A ^ B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A & B: 0 A: 0 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A ^ B: ~2478481C02491517F1 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A | B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A ^ B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A | B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A ^ B: BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~BD9D5EE99FE1F8AB7A03 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 2478481C02491517F1 B: 2478481C02491517F1 A & B: 2478481C02491517F1 A: 2478481C02491517F1 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 2478481C02491517F1 B: 2478481C02491517F1 A ^ B: 0 A: ~2478481C02491517F1 B: 2478481C02491517F1 A & B: 1 A: ~2478481C02491517F1 B: 2478481C02491517F1 A | B: ~1 A: ~2478481C02491517F1 B: 2478481C02491517F1 A ^ B: ~2 A: 2478481C02491517F1 B: ~2478481C02491517F1 A & B: 1 A: 2478481C02491517F1 B: ~2478481C02491517F1 A | B: ~1 A: 2478481C02491517F1 B: ~2478481C02491517F1 A ^ B: ~2 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A & B: ~2478481C02491517F1 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A ^ B: 0 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A & B: 70001800000007E0 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A | B: 6CF8D83C06DB3F3FF3 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A ^ B: 6C88D82406DB3F3813 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A & B: 4880902004922A2802 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A | B: ~240848040249151011 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A ^ B: ~6C88D82406DB3F3813 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A & B: 240848040249151010 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A | B: ~4880902004922A2801 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A ^ B: ~6C88D82406DB3F3811 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A & B: ~6CF8D83C06DB3F3FF2 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A | B: ~70001800000007E1 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A ^ B: 6C88D82406DB3F3811 A: 2478481C02491517F1 B: 1912B19341923E8075B A & B: 2808140001000751 A: 2478481C02491517F1 B: 1912B19341923E8075B A | B: 1B57B593C1B6BFD17FB A: 2478481C02491517F1 B: 1912B19341923E8075B A ^ B: 1B55351281B6AFD10AA A: ~2478481C02491517F1 B: 1912B19341923E8075B A & B: 1910311201922E8000B A: ~2478481C02491517F1 B: 1912B19341923E8075B A | B: ~2450400802481510A1 A: ~2478481C02491517F1 B: 1912B19341923E8075B A ^ B: ~1B55351281B6AFD10AC A: 2478481C02491517F1 B: ~1912B19341923E8075B A & B: 2450400802481510A1 A: 2478481C02491517F1 B: ~1912B19341923E8075B A | B: ~1910311201922E8000B A: 2478481C02491517F1 B: ~1912B19341923E8075B A ^ B: ~1B55351281B6AFD10AC A: ~2478481C02491517F1 B: ~1912B19341923E8075B A & B: ~1B57B593C1B6BFD17FB A: ~2478481C02491517F1 B: ~1912B19341923E8075B A | B: ~2808140001000751 A: ~2478481C02491517F1 B: ~1912B19341923E8075B A ^ B: 1B55351281B6AFD10AA A: 2478481C02491517F1 B: 3225632683247D00EB6 A & B: 2050000802411006B0 A: 2478481C02491517F1 B: 3225632683247D00EB6 A | B: 3267E7A7C324FD51FF7 A: 2478481C02491517F1 B: 3225632683247D00EB6 A ^ B: 3062E7A74300EC51947 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A & B: 3020632603006C00806 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A | B: ~42848140008051141 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A ^ B: ~3062E7A74300EC51947 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A & B: 42848140008051140 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A | B: ~3020632603006C00805 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A ^ B: ~3062E7A74300EC51945 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A & B: ~3267E7A7C324FD51FF6 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A | B: ~2050000802411006B1 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A ^ B: 3062E7A74300EC51945 A: 2478481C02491517F1 ! A: ~2478481C02491517F2 A: ~2478481C02491517F1 ! A: 2478481C02491517F0 A: ~2478481C02491517F1 A ~>> 0: ~2478481C02491517F1 A: ~2478481C02491517F1 A ~>> 1: ~123C240E01248A8BF9 A: ~2478481C02491517F1 A ~>> 2: ~91E120700924545FD A: ~2478481C02491517F1 A ~>> F: ~48F0903804922B A: ~2478481C02491517F1 A ~>> 10: ~2478481C024916 A: ~2478481C02491517F1 A ~>> 11: ~123C240E01248B A: ~2478481C02491517F1 A ~>> 12: ~91E1207009246 A: ~2478481C02491517F1 A << 0: ~2478481C02491517F1 A: ~2478481C02491517F1 A << 1: ~48F0903804922A2FE2 A: ~2478481C02491517F1 A << 2: ~91E120700924545FC4 A: ~2478481C02491517F1 A << F: ~123C240E01248A8BF88000 A: ~2478481C02491517F1 A << 10: ~2478481C02491517F10000 A: ~2478481C02491517F1 A << 11: ~48F0903804922A2FE20000 A: ~2478481C02491517F1 A << 12: ~91E120700924545FC40000 A: 1912B19341923E8075B B: 1912B19341923E8075B A & B: 1912B19341923E8075B A: 1912B19341923E8075B B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 1912B19341923E8075B B: 1912B19341923E8075B A ^ B: 0 A: ~1912B19341923E8075B B: 1912B19341923E8075B A & B: 1 A: ~1912B19341923E8075B B: 1912B19341923E8075B A | B: ~1 A: ~1912B19341923E8075B B: 1912B19341923E8075B A ^ B: ~2 A: 1912B19341923E8075B B: ~1912B19341923E8075B A & B: 1 A: 1912B19341923E8075B B: ~1912B19341923E8075B A | B: ~1 A: 1912B19341923E8075B B: ~1912B19341923E8075B A ^ B: ~2 A: ~1912B19341923E8075B B: ~1912B19341923E8075B A & B: ~1912B19341923E8075B A: ~1912B19341923E8075B B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: ~1912B19341923E8075B B: ~1912B19341923E8075B A ^ B: 0 A: 1912B19341923E8075B B: 3225632683247D00EB6 A & B: 1000210201003C00612 A: 1912B19341923E8075B B: 3225632683247D00EB6 A | B: 3B37F3B7C3B67F80FFF A: 1912B19341923E8075B B: 3225632683247D00EB6 A ^ B: 2B37D2B5C2B643809ED A: ~1912B19341923E8075B B: 3225632683247D00EB6 A & B: 22254224822441008A4 A: ~1912B19341923E8075B B: 3225632683247D00EB6 A | B: ~912909140920280149 A: ~1912B19341923E8075B B: 3225632683247D00EB6 A ^ B: ~2B37D2B5C2B643809ED A: 1912B19341923E8075B B: ~3225632683247D00EB6 A & B: 91290914092028014A A: 1912B19341923E8075B B: ~3225632683247D00EB6 A | B: ~22254224822441008A5 A: 1912B19341923E8075B B: ~3225632683247D00EB6 A ^ B: ~2B37D2B5C2B643809EF A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A & B: ~3B37F3B7C3B67F81000 A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A | B: ~1000210201003C00611 A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A ^ B: 2B37D2B5C2B643809EF A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A & B: 1100A11341002E80049 A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A | B: 11BDFB1D3D1DABF857FB A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A ^ B: 10ADF10C090DA91057B2 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A & B: 102CD0040904881050A1 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A | B: ~812108000921000713 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A ^ B: ~10ADF10C090DA91057B4 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A & B: 812108000921000713 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A | B: ~102CD0040904881050A1 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A ^ B: ~10ADF10C090DA91057B4 A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A & B: ~11BDFB1D3D1DABF857FB A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A | B: ~1100A11341002E80049 A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A ^ B: 10ADF10C090DA91057B2 A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A & B: 112008300901E00152 A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A | B: 23F9BF3B7E3937F8A7DB A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A ^ B: 23E89F334E303618A689 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A & B: 226894224A201410A080 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A | B: ~1800B11041022080609 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A ^ B: ~23E89F334E303618A689 A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A & B: 1800B1104102208060A A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A | B: ~226894224A201410A081 A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A ^ B: ~23E89F334E303618A68B A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A & B: ~23F9BF3B7E3937F8A7DC A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A | B: ~112008300901E00151 A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A ^ B: 23E89F334E303618A68B A: 1912B19341923E8075B ! A: ~1912B19341923E8075C A: ~1912B19341923E8075B ! A: 1912B19341923E8075A A: ~1912B19341923E8075B A ~>> 0: ~1912B19341923E8075B A: ~1912B19341923E8075B A ~>> 1: ~C8958C9A0C91F403AE A: ~1912B19341923E8075B A ~>> 2: ~644AC64D0648FA01D7 A: ~1912B19341923E8075B A ~>> F: ~3225632683247D1 A: ~1912B19341923E8075B A ~>> 10: ~1912B19341923E9 A: ~1912B19341923E8075B A ~>> 11: ~C8958C9A0C91F5 A: ~1912B19341923E8075B A ~>> 12: ~644AC64D0648FB A: ~1912B19341923E8075B A << 0: ~1912B19341923E8075B A: ~1912B19341923E8075B A << 1: ~3225632683247D00EB6 A: ~1912B19341923E8075B A << 2: ~644AC64D0648FA01D6C A: ~1912B19341923E8075B A << F: ~C8958C9A0C91F403AD8000 A: ~1912B19341923E8075B A << 10: ~1912B19341923E8075B0000 A: ~1912B19341923E8075B A << 11: ~3225632683247D00EB60000 A: ~1912B19341923E8075B A << 12: ~644AC64D0648FA01D6C0000 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A & B: 113CDA153D148AF850E9 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A ^ B: 0 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A & B: 1 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A | B: ~1 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A ^ B: ~2 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A & B: 1 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A | B: ~1 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A ^ B: ~2 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A & B: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A ^ B: 0 A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A & B: 389000380000F000C0 A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A | B: 337DFE3F7F3D9FF8F1FB A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A ^ B: 33456E3F473D9F08F13B A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A & B: 2241242A42291500A112 A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A | B: ~11044A1505148A085029 A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A ^ B: ~33456E3F473D9F08F13B A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A & B: 11044A1505148A085028 A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A | B: ~2241242A42291500A111 A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A ^ B: ~33456E3F473D9F08F139 A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A & B: ~337DFE3F7F3D9FF8F1FA A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A | B: ~389000380000F000C1 A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A ^ B: 33456E3F473D9F08F139 A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A & B: 111C5A011D0088A85001 A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A | B: BDBDDEFDBFF5FAFB7AEB A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A ^ B: ACA184FCA2F572532AEA A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A & B: AC8104E882E170032A03 A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A | B: ~2080142014025000E9 A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A ^ B: ~ACA184FCA2F572532AEC A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A & B: 2080142014025000E9 A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~AC8104E882E170032A03 A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~ACA184FCA2F572532AEC A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A & B: ~BDBDDEFDBFF5FAFB7AEB A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~111C5A011D0088A85001 A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ACA184FCA2F572532AEA A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A & B: 113898113D0080505000 A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A | B: 17B3EFFD73FD7FBFEF4EF A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A ^ B: 16A0667C602D77BAEA4EF A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A & B: 16A0225C202C37106A406 A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A | B: ~4420400140AA800E9 A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A ^ B: ~16A0667C602D77BAEA4EF A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A & B: 4420400140AA800E8 A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A | B: ~16A0225C202C37106A405 A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A ^ B: ~16A0667C602D77BAEA4ED A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A & B: ~17B3EFFD73FD7FBFEF4EE A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A | B: ~113898113D0080505001 A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A ^ B: 16A0667C602D77BAEA4ED A: 113CDA153D148AF850E9 ! A: ~113CDA153D148AF850EA A: ~113CDA153D148AF850E9 ! A: 113CDA153D148AF850E8 A: ~113CDA153D148AF850E9 A ~>> 0: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 A ~>> 1: ~89E6D0A9E8A457C2875 A: ~113CDA153D148AF850E9 A ~>> 2: ~44F36854F4522BE143B A: ~113CDA153D148AF850E9 A ~>> F: ~2279B42A7A2915F1 A: ~113CDA153D148AF850E9 A ~>> 10: ~113CDA153D148AF9 A: ~113CDA153D148AF850E9 A ~>> 11: ~89E6D0A9E8A457D A: ~113CDA153D148AF850E9 A ~>> 12: ~44F36854F4522BF A: ~113CDA153D148AF850E9 A << 0: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 A << 1: ~2279B42A7A2915F0A1D2 A: ~113CDA153D148AF850E9 A << 2: ~44F36854F4522BE143A4 A: ~113CDA153D148AF850E9 A << F: ~89E6D0A9E8A457C28748000 A: ~113CDA153D148AF850E9 A << 10: ~113CDA153D148AF850E90000 A: ~113CDA153D148AF850E9 A << 11: ~2279B42A7A2915F0A1D20000 A: ~113CDA153D148AF850E9 A << 12: ~44F36854F4522BE143A40000 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A & B: 48F0903804922A2FE2 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A | B: 48F0903804922A2FE2 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A ^ B: 0 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A & B: 2 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A | B: ~2 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A ^ B: ~4 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A & B: 2 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A | B: ~2 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A ^ B: ~4 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A & B: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A | B: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A ^ B: 0 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A & B: 4860901004922A07C2 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A | B: 6DF8D87C06DB3F6FF3 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A ^ B: 2598486C0249156831 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A & B: 250848440249154012 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A | B: ~9000280000002821 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A ^ B: ~2598486C0249156833 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A & B: 9000280000002820 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A | B: ~250848440249154011 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A ^ B: ~2598486C0249156831 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A & B: ~6DF8D87C06DB3F6FF4 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A | B: ~4860901004922A07C1 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A ^ B: 2598486C0249156833 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A & B: 5010280002000EA2 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A | B: 36AF6B27836D7FA2FF6 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A ^ B: 36AA6A25036D5FA2154 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A & B: 3220622403245D00016 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A | B: ~48A0801004902A2142 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A ^ B: ~36AA6A25036D5FA2158 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A & B: 48A0801004902A2142 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A | B: ~3220622403245D00016 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A ^ B: ~36AA6A25036D5FA2158 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A & B: ~36AF6B27836D7FA2FF6 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A | B: ~5010280002000EA2 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A ^ B: 36AA6A25036D5FA2154 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A & B: 8000180002280600 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A | B: 4FBF1DBBC4FFBBA3FF3 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A ^ B: 4FB71DBA44FF99239F3 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A & B: 4B3014B844B69901010 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A | B: ~4870902004900229E1 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A ^ B: ~4FB71DBA44FF99239F1 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A & B: 4870902004900229E2 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A | B: ~4B3014B844B69901011 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A ^ B: ~4FB71DBA44FF99239F3 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A & B: ~4FBF1DBBC4FFBBA3FF2 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A | B: ~8000180002280601 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A ^ B: 4FB71DBA44FF99239F1 A: 48F0903804922A2FE2 ! A: ~48F0903804922A2FE3 A: ~48F0903804922A2FE2 ! A: 48F0903804922A2FE1 A: ~48F0903804922A2FE2 A ~>> 0: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 A ~>> 1: ~2478481C02491517F1 A: ~48F0903804922A2FE2 A ~>> 2: ~123C240E01248A8BF9 A: ~48F0903804922A2FE2 A ~>> F: ~91E12070092455 A: ~48F0903804922A2FE2 A ~>> 10: ~48F0903804922B A: ~48F0903804922A2FE2 A ~>> 11: ~2478481C024916 A: ~48F0903804922A2FE2 A ~>> 12: ~123C240E01248B A: ~48F0903804922A2FE2 A << 0: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 A << 1: ~91E120700924545FC4 A: ~48F0903804922A2FE2 A << 2: ~123C240E01248A8BF88 A: ~48F0903804922A2FE2 A << F: ~2478481C02491517F10000 A: ~48F0903804922A2FE2 A << 10: ~48F0903804922A2FE20000 A: ~48F0903804922A2FE2 A << 11: ~91E120700924545FC40000 A: ~48F0903804922A2FE2 A << 12: ~123C240E01248A8BF880000 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A & B: 3225632683247D00EB6 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A | B: 3225632683247D00EB6 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A ^ B: 0 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A & B: 2 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A | B: ~2 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A ^ B: ~4 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A & B: 2 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A | B: ~2 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A ^ B: ~4 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A & B: ~3225632683247D00EB6 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A | B: ~3225632683247D00EB6 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A ^ B: 0 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A & B: 220002080243900610 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A | B: 7B3D77BFC7B6FF81EB7 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A ^ B: 791D779F4792C6818A7 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A & B: 4918149944928281000 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A | B: ~30056306030044008A5 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A ^ B: ~791D779F4792C6818A5 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A & B: 30056306030044008A6 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A | B: ~4918149944928281001 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A ^ B: ~791D779F4792C6818A7 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A & B: ~7B3D77BFC7B6FF81EB6 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A | B: ~220002080243900611 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A ^ B: 791D779F4792C6818A5 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A & B: 2201422682005D00092 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A | B: 237BF63A7A3B57F0AFF6 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A ^ B: 215BE218121B5220AF64 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A & B: 2059A00812091020A142 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A | B: ~1024210001242000E26 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A ^ B: ~215BE218121B5220AF68 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A & B: 1024210001242000E26 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A | B: ~2059A00812091020A142 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A ^ B: ~215BE218121B5220AF68 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A & B: ~237BF63A7A3B57F0AFF6 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A | B: ~2201422682005D00092 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A ^ B: 215BE218121B5220AF64 A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A & B: 3220632203000C002B2 A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A | B: 33B6DE3FFF3FE7F8FEBF A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A ^ B: 3094D80DDF0FE738FC0D A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A & B: 3094880D970DA028F00A A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A | B: ~5000480247100C05 A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A ^ B: ~3094D80DDF0FE738FC0F A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A & B: 5000480247100C04 A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A | B: ~3094880D970DA028F009 A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~3094D80DDF0FE738FC0D A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A & B: ~33B6DE3FFF3FE7F8FEC0 A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A | B: ~3220632203000C002B1 A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A ^ B: 3094D80DDF0FE738FC0F A: 3225632683247D00EB6 ! A: ~3225632683247D00EB7 A: ~3225632683247D00EB6 ! A: 3225632683247D00EB5 A: ~3225632683247D00EB6 A ~>> 0: ~3225632683247D00EB6 A: ~3225632683247D00EB6 A ~>> 1: ~1912B19341923E8075B A: ~3225632683247D00EB6 A ~>> 2: ~C8958C9A0C91F403AE A: ~3225632683247D00EB6 A ~>> F: ~644AC64D0648FA1 A: ~3225632683247D00EB6 A ~>> 10: ~3225632683247D1 A: ~3225632683247D00EB6 A ~>> 11: ~1912B19341923E9 A: ~3225632683247D00EB6 A ~>> 12: ~C8958C9A0C91F5 A: ~3225632683247D00EB6 A << 0: ~3225632683247D00EB6 A: ~3225632683247D00EB6 A << 1: ~644AC64D0648FA01D6C A: ~3225632683247D00EB6 A << 2: ~C8958C9A0C91F403AD8 A: ~3225632683247D00EB6 A << F: ~1912B19341923E8075B0000 A: ~3225632683247D00EB6 A << 10: ~3225632683247D00EB60000 A: ~3225632683247D00EB6 A << 11: ~644AC64D0648FA01D6C0000 A: ~3225632683247D00EB6 A << 12: ~C8958C9A0C91F403AD80000 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A & B: 2279B42A7A2915F0A1D2 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A | B: 2279B42A7A2915F0A1D2 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A ^ B: 0 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A & B: 2 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A | B: ~2 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A ^ B: ~4 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A & B: 2 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A | B: ~2 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A ^ B: ~4 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A & B: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A | B: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A ^ B: 0 A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A & B: 2230842A322900E0A092 A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A | B: 33FFBE3FFF3DB5F8F3FB A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A ^ B: 11CF3A15CD14B5185369 A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A & B: 11860A158514A008522A A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A | B: ~493000480015100141 A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A ^ B: ~11CF3A15CD14B518536B A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A & B: 493000480015100140 A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A | B: ~11860A158514A0085229 A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~11CF3A15CD14B5185369 A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A & B: ~33FFBE3FFF3DB5F8F3FC A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A | B: ~2230842A322900E0A091 A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A ^ B: 11CF3A15CD14B518536B A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A & B: 2238B4023A011150A002 A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A | B: 17B7BBDFB7FEBF5F6F5D6 A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A ^ B: 1594309F945EAE4A655D4 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A & B: 1590209D105C2E0065406 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A | B: ~410028402804A001D2 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A ^ B: ~1594309F945EAE4A655D8 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A & B: 410028402804A001D2 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A | B: ~1590209D105C2E0065406 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A ^ B: ~1594309F945EAE4A655D8 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A & B: ~17B7BBDFB7FEBF5F6F5D6 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A | B: ~2238B4023A011150A002 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A ^ B: 1594309F945EAE4A655D4 A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A & B: 205814285A2100002000 A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A | B: 23AF9BCBEFFADFFF2EFDB A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A ^ B: 21AA1A896A58CFFF2CFDB A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A & B: 2188008948584EA024E08 A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A | B: ~221A002200815F081D1 A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A ^ B: ~21AA1A896A58CFFF2CFD9 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A & B: 221A002200815F081D2 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A | B: ~2188008948584EA024E09 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A ^ B: ~21AA1A896A58CFFF2CFDB A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A & B: ~23AF9BCBEFFADFFF2EFDA A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A | B: ~205814285A2100002001 A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A ^ B: 21AA1A896A58CFFF2CFD9 A: 2279B42A7A2915F0A1D2 ! A: ~2279B42A7A2915F0A1D3 A: ~2279B42A7A2915F0A1D2 ! A: 2279B42A7A2915F0A1D1 A: ~2279B42A7A2915F0A1D2 A ~>> 0: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 A ~>> 1: ~113CDA153D148AF850E9 A: ~2279B42A7A2915F0A1D2 A ~>> 2: ~89E6D0A9E8A457C2875 A: ~2279B42A7A2915F0A1D2 A ~>> F: ~44F36854F4522BE2 A: ~2279B42A7A2915F0A1D2 A ~>> 10: ~2279B42A7A2915F1 A: ~2279B42A7A2915F0A1D2 A ~>> 11: ~113CDA153D148AF9 A: ~2279B42A7A2915F0A1D2 A ~>> 12: ~89E6D0A9E8A457D A: ~2279B42A7A2915F0A1D2 A << 0: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 A << 1: ~44F36854F4522BE143A4 A: ~2279B42A7A2915F0A1D2 A << 2: ~89E6D0A9E8A457C28748 A: ~2279B42A7A2915F0A1D2 A << F: ~113CDA153D148AF850E90000 A: ~2279B42A7A2915F0A1D2 A << 10: ~2279B42A7A2915F0A1D20000 A: ~2279B42A7A2915F0A1D2 A << 11: ~44F36854F4522BE143A40000 A: ~2279B42A7A2915F0A1D2 A << 12: ~89E6D0A9E8A457C287480000 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A & B: 6D68D85406DB3F47D3 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A | B: 6D68D85406DB3F47D3 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A ^ B: 0 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A & B: 1 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A | B: ~1 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A ^ B: ~2 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A & B: 1 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A | B: ~1 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A ^ B: ~2 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A & B: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A | B: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A ^ B: 0 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A & B: 160005000001447C0 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A | B: FDE9F8740FFF7F5FD7 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A ^ B: FC89F8240FFF6B1817 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A & B: 908120200924401804 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A | B: ~6C08D80406DB2B0013 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A ^ B: ~FC89F8240FFF6B1817 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A & B: 6C08D80406DB2B0010 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A | B: ~908120200924401801 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A ^ B: ~FC89F8240FFF6B1811 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A & B: ~FDE9F8740FFF7F5FD4 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A | B: ~160005000001447C3 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A ^ B: FC89F8240FFF6B1811 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A & B: 21004814024B380611 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A | B: 4FFE9DBDC4FFBBF57D3 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A ^ B: 4DEE993C84DB08751C2 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A & B: 4928103884920801001 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A | B: ~4C68904004900741C3 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A ^ B: ~4DEE993C84DB08751C4 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A & B: 4C68904004900741C3 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A | B: ~4928103884920801001 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A ^ B: ~4DEE993C84DB08751C4 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A & B: ~4FFE9DBDC4FFBBF57D3 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A | B: ~21004814024B380611 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A ^ B: 4DEE993C84DB08751C2 A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A & B: 44284050048B200540 A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A | B: 66DECFCD466DFBF5FFF A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A ^ B: 629C4BC8462549F5ABF A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A & B: 600842480600480182C A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A | B: ~2940980402501F4293 A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A ^ B: ~629C4BC8462549F5ABF A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A & B: 2940980402501F4290 A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A | B: ~6008424806004801829 A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A ^ B: ~629C4BC8462549F5AB9 A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A & B: ~66DECFCD466DFBF5FFC A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A | B: ~44284050048B200543 A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A ^ B: 629C4BC8462549F5AB9 A: 6D68D85406DB3F47D3 ! A: ~6D68D85406DB3F47D4 A: ~6D68D85406DB3F47D3 ! A: 6D68D85406DB3F47D2 A: ~6D68D85406DB3F47D3 A ~>> 0: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 A ~>> 1: ~36B46C2A036D9FA3EA A: ~6D68D85406DB3F47D3 A ~>> 2: ~1B5A361501B6CFD1F5 A: ~6D68D85406DB3F47D3 A ~>> F: ~DAD1B0A80DB67F A: ~6D68D85406DB3F47D3 A ~>> 10: ~6D68D85406DB40 A: ~6D68D85406DB3F47D3 A ~>> 11: ~36B46C2A036DA0 A: ~6D68D85406DB3F47D3 A ~>> 12: ~1B5A361501B6D0 A: ~6D68D85406DB3F47D3 A << 0: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 A << 1: ~DAD1B0A80DB67E8FA6 A: ~6D68D85406DB3F47D3 A << 2: ~1B5A361501B6CFD1F4C A: ~6D68D85406DB3F47D3 A << F: ~36B46C2A036D9FA3E98000 A: ~6D68D85406DB3F47D3 A << 10: ~6D68D85406DB3F47D30000 A: ~6D68D85406DB3F47D3 A << 11: ~DAD1B0A80DB67E8FA60000 A: ~6D68D85406DB3F47D3 A << 12: ~1B5A361501B6CFD1F4C0000 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A & B: 4B3814B9C4B6BB81611 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A | B: 4B3814B9C4B6BB81611 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A ^ B: 0 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A & B: 1 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A | B: ~1 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A ^ B: ~2 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A & B: 1 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A | B: ~1 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A ^ B: ~2 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A & B: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A | B: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A ^ B: 0 A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A & B: 400804090400BA01400 A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A | B: 6F7AD6FDC6FEFB81F7D A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A ^ B: 2F72D2F4C2FE4180B7D A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A & B: 2442C2440248400096C A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A | B: ~B3010B0C0B60180211 A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A ^ B: ~2F72D2F4C2FE4180B7D A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A & B: B3010B0C0B60180210 A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A | B: ~2442C2440248400096B A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A ^ B: ~2F72D2F4C2FE4180B7B A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A & B: ~6F7AD6FDC6FEFB81F7C A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A | B: ~400804090400BA01401 A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A ^ B: 2F72D2F4C2FE4180B7B A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A & B: B2800B940920A81211 A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A | B: 37B78F7FBF7FEBF8F6BB A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A ^ B: 37050F742B76CB50E4AA A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A & B: 33040E3423348040E0AB A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A | B: ~401014008424B100401 A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A ^ B: ~37050F742B76CB50E4AC A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A & B: 401014008424B100401 A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A | B: ~33040E3423348040E0AB A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~37050F742B76CB50E4AC A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A & B: ~37B78F7FBF7FEBF8F6BB A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A | B: ~B2800B940920A81211 A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A ^ B: 37050F742B76CB50E4AA A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A & B: 4B3004094422BA00200 A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A | B: 44F3E95FFC5B6BF957B5 A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A ^ B: 4040E91F6819405955B5 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A & B: 404068146010004141A4 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A | B: ~810B080940181411 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A ^ B: ~4040E91F6819405955B5 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A & B: 810B080940181410 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A | B: ~404068146010004141A3 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A ^ B: ~4040E91F6819405955B3 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A & B: ~44F3E95FFC5B6BF957B4 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A | B: ~4B3004094422BA00201 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A ^ B: 4040E91F6819405955B3 A: 4B3814B9C4B6BB81611 ! A: ~4B3814B9C4B6BB81612 A: ~4B3814B9C4B6BB81611 ! A: 4B3814B9C4B6BB81610 A: ~4B3814B9C4B6BB81611 A ~>> 0: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 A ~>> 1: ~259C0A5CE25B5DC0B09 A: ~4B3814B9C4B6BB81611 A ~>> 2: ~12CE052E712DAEE0585 A: ~4B3814B9C4B6BB81611 A ~>> F: ~96702973896D771 A: ~4B3814B9C4B6BB81611 A ~>> 10: ~4B3814B9C4B6BB9 A: ~4B3814B9C4B6BB81611 A ~>> 11: ~259C0A5CE25B5DD A: ~4B3814B9C4B6BB81611 A ~>> 12: ~12CE052E712DAEF A: ~4B3814B9C4B6BB81611 A << 0: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 A << 1: ~96702973896D7702C22 A: ~4B3814B9C4B6BB81611 A << 2: ~12CE052E712DAEE05844 A: ~4B3814B9C4B6BB81611 A << F: ~259C0A5CE25B5DC0B088000 A: ~4B3814B9C4B6BB81611 A << 10: ~4B3814B9C4B6BB816110000 A: ~4B3814B9C4B6BB81611 A << 11: ~96702973896D7702C220000 A: ~4B3814B9C4B6BB81611 A << 12: ~12CE052E712DAEE058440000 A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A & B: 33B68E3FB73DA0E8F2BB A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A | B: 33B68E3FB73DA0E8F2BB A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A ^ B: 0 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A & B: 1 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A | B: ~1 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A ^ B: ~2 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A & B: 1 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A | B: ~1 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A ^ B: ~2 A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A & B: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A | B: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A ^ B: 0 A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A & B: B20814B41020E042A0 A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A | B: 77F7EE7FF77FABE9F3BF A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A ^ B: 7745E66B436F8B09B11F A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A & B: 4441604040420B010104 A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A | B: ~3304862B032D8008B01B A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A ^ B: ~7745E66B436F8B09B11F A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A & B: 3304862B032D8008B018 A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A | B: ~4441604040420B010101 A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A ^ B: ~7745E66B436F8B09B119 A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A & B: ~77F7EE7FF77FABE9F3BC A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A | B: ~B20814B41020E042A3 A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A ^ B: 7745E66B436F8B09B119 A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A & B: 30900C3C9725A0006209 A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A | B: 23BFE9EBFFFBDEAEAFEBB A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A ^ B: 20B6E928368984AEA9CB2 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A & B: 20848108048804A020C01 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A | B: ~3268203201800E890B3 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A ^ B: ~20B6E928368984AEA9CB4 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A & B: 3268203201800E890B3 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A | B: ~20848108048804A020C01 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A ^ B: ~20B6E928368984AEA9CB4 A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A & B: ~23BFE9EBFFFBDEAEAFEBB A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A | B: ~30900C3C9725A0006209 A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A ^ B: 20B6E928368984AEA9CB2 A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A & B: 32340A263705A0A8E008 A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A | B: 2F7F7FFBFFFBFE2EDFABF A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A ^ B: 2C5C3F599C8BA42451AB7 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A & B: 2C4417180488242050804 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A | B: ~18284198038004012B3 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A ^ B: ~2C5C3F599C8BA42451AB7 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A & B: 18284198038004012B0 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A | B: ~2C4417180488242050801 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A ^ B: ~2C5C3F599C8BA42451AB1 A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A & B: ~2F7F7FFBFFFBFE2EDFABC A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A | B: ~32340A263705A0A8E00B A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A ^ B: 2C5C3F599C8BA42451AB1 A: 33B68E3FB73DA0E8F2BB ! A: ~33B68E3FB73DA0E8F2BC A: ~33B68E3FB73DA0E8F2BB ! A: 33B68E3FB73DA0E8F2BA A: ~33B68E3FB73DA0E8F2BB A ~>> 0: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB A ~>> 1: ~19DB471FDB9ED074795E A: ~33B68E3FB73DA0E8F2BB A ~>> 2: ~CEDA38FEDCF683A3CAF A: ~33B68E3FB73DA0E8F2BB A ~>> F: ~676D1C7F6E7B41D2 A: ~33B68E3FB73DA0E8F2BB A ~>> 10: ~33B68E3FB73DA0E9 A: ~33B68E3FB73DA0E8F2BB A ~>> 11: ~19DB471FDB9ED075 A: ~33B68E3FB73DA0E8F2BB A ~>> 12: ~CEDA38FEDCF683B A: ~33B68E3FB73DA0E8F2BB A << 0: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB A << 1: ~676D1C7F6E7B41D1E576 A: ~33B68E3FB73DA0E8F2BB A << 2: ~CEDA38FEDCF683A3CAEC A: ~33B68E3FB73DA0E8F2BB A << F: ~19DB471FDB9ED074795D8000 A: ~33B68E3FB73DA0E8F2BB A << 10: ~33B68E3FB73DA0E8F2BB0000 A: ~33B68E3FB73DA0E8F2BB A << 11: ~676D1C7F6E7B41D1E5760000 A: ~33B68E3FB73DA0E8F2BB A << 12: ~CEDA38FEDCF683A3CAEC0000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A ^ B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A ^ B: DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A | B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A ^ B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A | B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A ^ B: 681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: ~681955362721CE00DDAAAB61C581 A | B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: ~681955362721CE00DDAAAB61C581 A | B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~681955362721CE00DDAAAB61C581 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A & B: DC3E0F41E901B3D7849583FB49 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A ^ B: 0 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A & B: 1 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A | B: ~1 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A ^ B: ~2 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A & B: 1 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~1 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~2 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A & B: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: 0 A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A & B: 983C0E01C0012387000103F200 A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A | B: 1FC7E1FC3FB03F7FF8DBF87FFDB A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A ^ B: 1644211C23B02D4788DBE840DDB A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A & B: 12040108212024428092A040492 A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A | B: ~44020140290090508494800949 A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A ^ B: ~1644211C23B02D4788DBE840DDB A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A & B: 44020140290090508494800948 A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A | B: ~12040108212024428092A040491 A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A ^ B: ~1644211C23B02D4788DBE840DD9 A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A & B: ~1FC7E1FC3FB03F7FF8DBF87FFDA A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A | B: ~983C0E01C0012387000103F201 A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A ^ B: 1644211C23B02D4788DBE840DD9 A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A & B: 542A07410100B242800483C801 A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A | B: 9FEBEAFD5EB13BBD7B6FDABFF6B A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 9AA94A894EA13099536F928376A A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A & B: 92280A094021208003268280423 A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A | B: ~88140800E80101950491003349 A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A ^ B: ~9AA94A894EA13099536F928376C A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A & B: 88140800E80101950491003349 A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~92280A094021208003268280423 A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~9AA94A894EA13099536F928376C A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A & B: ~9FEBEAFD5EB13BBD7B6FDABFF6B A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~542A07410100B242800483C801 A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: 9AA94A894EA13099536F928376A A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A & B: CC140F00000130850491039840 A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A | B: 12FD7F4FEBEF25F7D7E4DDD7FB4F A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A ^ B: 12316B40EBEF24C752E04CD4630F A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A & B: 12214140AA062444006048540006 A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A | B: ~102A0041E90083528004806309 A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A ^ B: ~12316B40EBEF24C752E04CD4630F A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A & B: 102A0041E90083528004806308 A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A | B: ~12214140AA062444006048540005 A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A ^ B: ~12316B40EBEF24C752E04CD4630D A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A & B: ~12FD7F4FEBEF25F7D7E4DDD7FB4E A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A | B: ~CC140F00000130850491039841 A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A ^ B: 12316B40EBEF24C752E04CD4630D A: DC3E0F41E901B3D7849583FB49 ! A: ~DC3E0F41E901B3D7849583FB4A A: ~DC3E0F41E901B3D7849583FB49 ! A: DC3E0F41E901B3D7849583FB48 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 0: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 1: ~6E1F07A0F480D9EBC24AC1FDA5 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 2: ~370F83D07A406CF5E12560FED3 A: ~DC3E0F41E901B3D7849583FB49 A ~>> F: ~1B87C1E83D20367AF092B08 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 10: ~DC3E0F41E901B3D7849584 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 11: ~6E1F07A0F480D9EBC24AC2 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 12: ~370F83D07A406CF5E12561 A: ~DC3E0F41E901B3D7849583FB49 A << 0: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 A << 1: ~1B87C1E83D20367AF092B07F692 A: ~DC3E0F41E901B3D7849583FB49 A << 2: ~370F83D07A406CF5E12560FED24 A: ~DC3E0F41E901B3D7849583FB49 A << F: ~6E1F07A0F480D9EBC24AC1FDA48000 A: ~DC3E0F41E901B3D7849583FB49 A << 10: ~DC3E0F41E901B3D7849583FB490000 A: ~DC3E0F41E901B3D7849583FB49 A << 11: ~1B87C1E83D20367AF092B07F6920000 A: ~DC3E0F41E901B3D7849583FB49 A << 12: ~370F83D07A406CF5E12560FED240000 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A & B: 976AAA7D50312BA42B26CABCC23 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 0 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A & B: 1 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A | B: ~1 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A ^ B: ~2 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A & B: 1 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~1 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~2 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A & B: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: 0 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A & B: 64000780020030002048038802 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A | B: 1BFFFFEFFF0737FEC7F6FDFFDC67 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A ^ B: 1B9BFFE87F0537CEC7D6B5FC5465 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A & B: 128955482A042544854491541044 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A | B: ~912AAA05501128A429224A84421 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A ^ B: ~1B9BFFE87F0537CEC7D6B5FC5465 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A & B: 912AAA05501128A429224A84422 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A | B: ~128955482A042544854491541045 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A ^ B: ~1B9BFFE87F0537CEC7D6B5FC5467 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A & B: ~1BFFFFEFFF0737FEC7F6FDFFDC68 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A | B: ~64000780020030002048038801 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A ^ B: 1B9BFFE87F0537CEC7D6B5FC5467 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A & B: 81000260501020040A22821C401 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A | B: 697FFFB7F723DEBADFBAEFEBCDA3 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A ^ B: 616FFF91F222DCBA9F18C7CA09A2 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A & B: 600955102220CC009D0883400181 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A | B: ~166AA81D00210BA0210448A0823 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A ^ B: ~616FFF91F222DCBA9F18C7CA09A4 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A & B: 166AA81D00210BA0210448A0823 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A | B: ~600955102220CC009D0883400181 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~616FFF91F222DCBA9F18C7CA09A4 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A & B: ~697FFFB7F723DEBADFBAEFEBCDA3 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A | B: ~81000260501020040A22821C401 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A ^ B: 616FFF91F222DCBA9F18C7CA09A2 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A & B: 32AA2444031000021044838802 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A | B: D976AAEFDF439EBBFBF77EEBCF23 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A ^ B: D94400CB9B408EBBF9E73A684721 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A & B: D00000480A408C01B94512400300 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A | B: ~9440083910002BA40A228284421 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A ^ B: ~D94400CB9B408EBBF9E73A684721 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A & B: 9440083910002BA40A228284422 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~D00000480A408C01B94512400301 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: ~D94400CB9B408EBBF9E73A684723 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A & B: ~D976AAEFDF439EBBFBF77EEBCF24 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~32AA2444031000021044838801 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: D94400CB9B408EBBF9E73A684723 A: 976AAA7D50312BA42B26CABCC23 ! A: ~976AAA7D50312BA42B26CABCC24 A: ~976AAA7D50312BA42B26CABCC23 ! A: 976AAA7D50312BA42B26CABCC22 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 0: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 1: ~4BB5553EA81895D21593655E612 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 2: ~25DAAA9F540C4AE90AC9B2AF309 A: ~976AAA7D50312BA42B26CABCC23 A ~>> F: ~12ED554FAA0625748564D958 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 10: ~976AAA7D50312BA42B26CAC A: ~976AAA7D50312BA42B26CABCC23 A ~>> 11: ~4BB5553EA81895D21593656 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 12: ~25DAAA9F540C4AE90AC9B2B A: ~976AAA7D50312BA42B26CABCC23 A << 0: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 A << 1: ~12ED554FAA0625748564D9579846 A: ~976AAA7D50312BA42B26CABCC23 A << 2: ~25DAAA9F540C4AE90AC9B2AF308C A: ~976AAA7D50312BA42B26CABCC23 A << F: ~4BB5553EA81895D21593655E6118000 A: ~976AAA7D50312BA42B26CABCC23 A << 10: ~976AAA7D50312BA42B26CABCC230000 A: ~976AAA7D50312BA42B26CABCC23 A << 11: ~12ED554FAA0625748564D95798460000 A: ~976AAA7D50312BA42B26CABCC23 A << 12: ~25DAAA9F540C4AE90AC9B2AF308C0000 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A & B: 1B87C1E83D20367AF092B07F692 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A | B: 1B87C1E83D20367AF092B07F692 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A ^ B: 0 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A & B: 2 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A | B: ~2 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A ^ B: ~4 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A & B: 2 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A | B: ~2 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A ^ B: ~4 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A & B: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A | B: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A ^ B: 0 A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A & B: 90380C8192010386090003F092 A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A | B: 3BCFE3FC7FB077FAF8DEB8FF7DB A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A ^ B: 32CC6334669067C2984EB8C0749 A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A & B: 2048221442904180084C088014A A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A | B: ~12844120240026429002B040601 A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A ^ B: ~32CC6334669067C2984EB8C074B A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A & B: 12844120240026429002B040600 A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~2048221442904180084C0880149 A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: ~32CC6334669067C2984EB8C0749 A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A & B: ~3BCFE3FC7FB077FAF8DEB8FF7DC A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~90380C8192010386090003F091 A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: 32CC6334669067C2984EB8C074B A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A & B: A8540E82020164850009079002 A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A | B: 13FD7D5FABD62777AF6DFB57FED6 A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A ^ B: 1355295129D426132A6DF2506ED4 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A & B: 12450141280424100064D0500846 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A | B: ~110281001D002032A0922006692 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A ^ B: ~1355295129D426132A6DF2506ED8 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A & B: 110281001D002032A0922006692 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A | B: ~12450141280424100064D0500846 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A ^ B: ~1355295129D426132A6DF2506ED8 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A & B: ~13FD7D5FABD62777AF6DFB57FED6 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A | B: ~A8540E82020164850009079002 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A ^ B: 1355295129D426132A6DF2506ED4 A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A & B: 207C1603000026880102036400 A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A | B: 1DFBFFFFFFDB3B6FEF1F6F07F6FB A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A ^ B: 1DDB83E9FCDB3B49671E6D0492FB A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A & B: 1C4383E17C093808401644000068 A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A | B: ~198000880D20341270829049291 A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A ^ B: ~1DDB83E9FCDB3B49671E6D0492F9 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A & B: 198000880D20341270829049292 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A | B: ~1C4383E17C093808401644000069 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~1DDB83E9FCDB3B49671E6D0492FB A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A & B: ~1DFBFFFFFFDB3B6FEF1F6F07F6FA A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A | B: ~207C1603000026880102036401 A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A ^ B: 1DDB83E9FCDB3B49671E6D0492F9 A: 1B87C1E83D20367AF092B07F692 ! A: ~1B87C1E83D20367AF092B07F693 A: ~1B87C1E83D20367AF092B07F692 ! A: 1B87C1E83D20367AF092B07F691 A: ~1B87C1E83D20367AF092B07F692 A ~>> 0: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 A ~>> 1: ~DC3E0F41E901B3D7849583FB49 A: ~1B87C1E83D20367AF092B07F692 A ~>> 2: ~6E1F07A0F480D9EBC24AC1FDA5 A: ~1B87C1E83D20367AF092B07F692 A ~>> F: ~370F83D07A406CF5E125610 A: ~1B87C1E83D20367AF092B07F692 A ~>> 10: ~1B87C1E83D20367AF092B08 A: ~1B87C1E83D20367AF092B07F692 A ~>> 11: ~DC3E0F41E901B3D7849584 A: ~1B87C1E83D20367AF092B07F692 A ~>> 12: ~6E1F07A0F480D9EBC24AC2 A: ~1B87C1E83D20367AF092B07F692 A << 0: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 A << 1: ~370F83D07A406CF5E12560FED24 A: ~1B87C1E83D20367AF092B07F692 A << 2: ~6E1F07A0F480D9EBC24AC1FDA48 A: ~1B87C1E83D20367AF092B07F692 A << F: ~DC3E0F41E901B3D7849583FB490000 A: ~1B87C1E83D20367AF092B07F692 A << 10: ~1B87C1E83D20367AF092B07F6920000 A: ~1B87C1E83D20367AF092B07F692 A << 11: ~370F83D07A406CF5E12560FED240000 A: ~1B87C1E83D20367AF092B07F692 A << 12: ~6E1F07A0F480D9EBC24AC1FDA480000 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A & B: 12ED554FAA0625748564D9579846 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A | B: 12ED554FAA0625748564D9579846 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A ^ B: 0 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A & B: 2 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A | B: ~2 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A ^ B: ~4 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A & B: 2 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A | B: ~2 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A ^ B: ~4 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A & B: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A | B: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A ^ B: 0 A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A & B: 106155472A002024800440030040 A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A | B: 1EEFFFFFFF0F3D7ECD77DF57FC6F A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A ^ B: E8EAAB8D50F1D5A4D739F54FC2F A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A & B: C02AAB05509180A481306006428 A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A | B: ~28C000880060550056099549805 A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A ^ B: ~E8EAAB8D50F1D5A4D739F54FC2D A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A & B: 28C000880060550056099549806 A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A | B: ~C02AAB05509180A481306006429 A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~E8EAAB8D50F1D5A4D739F54FC2F A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A & B: ~1EEFFFFFFF0F3D7ECD77DF57FC6E A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A | B: ~106155472A002024800440030041 A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A ^ B: E8EAAB8D50F1D5A4D739F54FC2D A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A & B: 1020004C0A020400814450438802 A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A | B: D2FFFF6FEE47BD75BF75DFD79B46 A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A ^ B: C2DFFF23E445B9753E318F941344 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A & B: C012AA20444198013A1106800302 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A | B: ~2CD5503A0042174042089141046 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A ^ B: ~C2DFFF23E445B9753E318F941348 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A & B: 2CD5503A0042174042089141046 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~C012AA20444198013A1106800302 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: ~C2DFFF23E445B9753E318F941348 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A & B: ~D2FFFF6FEE47BD75BF75DFD79B46 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~1020004C0A020400814450438802 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: C2DFFF23E445B9753E318F941344 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A & B: 1049550220042000810000051002 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A | B: 13AEFFFEFFF676F769D64DB77D8C7 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A ^ B: 12AA6AAEDDF634F761C64DB72C8C5 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A & B: 12802AAA055614A02180002204082 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A | B: ~2A4004D8A0205740464D9528845 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A ^ B: ~12AA6AAEDDF634F761C64DB72C8C7 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A & B: 2A4004D8A0205740464D9528844 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A | B: ~12802AAA055614A02180002204081 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A ^ B: ~12AA6AAEDDF634F761C64DB72C8C5 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A & B: ~13AEFFFEFFF676F769D64DB77D8C8 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A | B: ~1049550220042000810000051001 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A ^ B: 12AA6AAEDDF634F761C64DB72C8C7 A: 12ED554FAA0625748564D9579846 ! A: ~12ED554FAA0625748564D9579847 A: ~12ED554FAA0625748564D9579846 ! A: 12ED554FAA0625748564D9579845 A: ~12ED554FAA0625748564D9579846 A ~>> 0: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 A ~>> 1: ~976AAA7D50312BA42B26CABCC23 A: ~12ED554FAA0625748564D9579846 A ~>> 2: ~4BB5553EA81895D21593655E612 A: ~12ED554FAA0625748564D9579846 A ~>> F: ~25DAAA9F540C4AE90AC9B2B0 A: ~12ED554FAA0625748564D9579846 A ~>> 10: ~12ED554FAA0625748564D958 A: ~12ED554FAA0625748564D9579846 A ~>> 11: ~976AAA7D50312BA42B26CAC A: ~12ED554FAA0625748564D9579846 A ~>> 12: ~4BB5553EA81895D21593656 A: ~12ED554FAA0625748564D9579846 A << 0: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 A << 1: ~25DAAA9F540C4AE90AC9B2AF308C A: ~12ED554FAA0625748564D9579846 A << 2: ~4BB5553EA81895D21593655E6118 A: ~12ED554FAA0625748564D9579846 A << F: ~976AAA7D50312BA42B26CABCC230000 A: ~12ED554FAA0625748564D9579846 A << 10: ~12ED554FAA0625748564D95798460000 A: ~12ED554FAA0625748564D9579846 A << 11: ~25DAAA9F540C4AE90AC9B2AF308C0000 A: ~12ED554FAA0625748564D9579846 A << 12: ~4BB5553EA81895D21593655E61180000 A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A & B: 294BA2DC5BB051B868DC08BF1DB A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A | B: 294BA2DC5BB051B868DC08BF1DB A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A ^ B: 0 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A & B: 1 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A | B: ~1 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A ^ B: ~2 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A & B: 1 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~1 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: ~2 A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A & B: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: 0 A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A & B: 210B82D05A0040B0600400BE100 A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A | B: 3F4FA3DC7BF07DFDE9FD68FFDFF A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A ^ B: 1E44210C21F03D4D89F96841CFF A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A & B: 1604010020402C4581216040C24 A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A | B: ~840200C01B0110808D808010DB A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A ^ B: ~1E44210C21F03D4D89F96841CFF A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A & B: 840200C01B0110808D808010D8 A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A | B: ~1604010020402C4581216040C21 A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A ^ B: ~1E44210C21F03D4D89F96841CF9 A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A & B: ~3F4FA3DC7BF07DFDE9FD68FFDFC A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A | B: ~210B82D05A0040B0600400BE103 A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A ^ B: 1E44210C21F03D4D89F96841CF9 A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A & B: BA254509000A800540036049 A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A | B: 1EF7FFFFFFBB3D3FCE9FC68BF5FB A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A ^ B: 1EF745DABAB23D354E9A868895B2 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A & B: 1C6345D23A003824481206000421 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A | B: ~294000880B20511068880889193 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A ^ B: ~1EF745DABAB23D354E9A868895B4 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A & B: 294000880B20511068880889193 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A | B: ~1C6345D23A003824481206000421 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A ^ B: ~1EF745DABAB23D354E9A868895B4 A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A & B: ~1EF7FFFFFFBB3D3FCE9FC68BF5FB A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A | B: ~BA254509000A800540036049 A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A ^ B: 1EF745DABAB23D354E9A868895B2 A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 90AA0D440800090289808B3088 A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A | B: 27DEBABFD5BF4FFB8ECDF2AFF1DF A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: 274E10B291B74FF28C447224C157 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 254A009210044AE0084032240004 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A | B: ~204102081B3051284044000C153 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~274E10B291B74FF28C447224C157 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: 204102081B3051284044000C150 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~254A009210044AE0084032240001 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~274E10B291B74FF28C447224C151 A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: ~27DEBABFD5BF4FFB8ECDF2AFF1DC A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~90AA0D440800090289808B308B A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: 274E10B291B74FF28C447224C151 A: 294BA2DC5BB051B868DC08BF1DB ! A: ~294BA2DC5BB051B868DC08BF1DC A: ~294BA2DC5BB051B868DC08BF1DB ! A: 294BA2DC5BB051B868DC08BF1DA A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 0: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 1: ~14A5D16E2DD828DC346E045F8EE A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 2: ~A52E8B716EC146E1A37022FC77 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> F: ~529745B8B760A370D1B8118 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 10: ~294BA2DC5BB051B868DC08C A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 11: ~14A5D16E2DD828DC346E046 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 12: ~A52E8B716EC146E1A37023 A: ~294BA2DC5BB051B868DC08BF1DB A << 0: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB A << 1: ~529745B8B760A370D1B8117E3B6 A: ~294BA2DC5BB051B868DC08BF1DB A << 2: ~A52E8B716EC146E1A37022FC76C A: ~294BA2DC5BB051B868DC08BF1DB A << F: ~14A5D16E2DD828DC346E045F8ED8000 A: ~294BA2DC5BB051B868DC08BF1DB A << 10: ~294BA2DC5BB051B868DC08BF1DB0000 A: ~294BA2DC5BB051B868DC08BF1DB A << 11: ~529745B8B760A370D1B8117E3B60000 A: ~294BA2DC5BB051B868DC08BF1DB A << 12: ~A52E8B716EC146E1A37022FC76C0000 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A & B: 1C63FFF77F09382EC81746036469 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A | B: 1C63FFF77F09382EC81746036469 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A ^ B: 0 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A & B: 1 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A | B: ~1 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A ^ B: ~2 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A & B: 1 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A | B: ~1 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~2 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A & B: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A | B: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A ^ B: 0 A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 442AA9754080828080102032008 A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A | B: 3DFBFFFF7F0D7AEFCADFF6AF74ED A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: 39B955682B0572C7C2DEF4AC54E5 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 21980008000442C102C8B0AC1084 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A | B: ~182155602B013006C01644004461 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~39B955682B0572C7C2DEF4AC54E5 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: 182155602B013006C01644004460 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~21980008000442C102C8B0AC1083 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~39B955682B0572C7C2DEF4AC54E3 A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: ~3DFBFFFF7F0D7AEFCADFF6AF74EC A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~442AA9754080828080102032009 A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: 39B955682B0572C7C2DEF4AC54E3 A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A & B: 1843FFA275012802880002014001 A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A | B: 13C6BFFF77F6D7A2ED917462774EB A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A ^ B: 1242800550A6C522C5117442634EA A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A & B: 12008000000644200110000241083 A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A | B: ~42000550A08102C401744022469 A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A ^ B: ~1242800550A6C522C5117442634EC A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A & B: 42000550A08102C401744022469 A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A | B: ~12008000000644200110000241083 A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A ^ B: ~1242800550A6C522C5117442634EC A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A & B: ~13C6BFFF77F6D7A2ED917462774EB A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A | B: ~1843FFA275012802880002014001 A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A ^ B: 1242800550A6C522C5117442634EA A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A & B: 6154D01C013802400204030400 A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A | B: 1BC67FFFFFF8F382FFEBFEF87766D A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A ^ B: 1BC06AB2FE38E002DBEBDEB84726D A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A & B: 1A00400088086000136A8A9841204 A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A | B: ~1C02AB276308002C881542006069 A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A ^ B: ~1BC06AB2FE38E002DBEBDEB84726D A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A & B: 1C02AB276308002C881542006068 A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A | B: ~1A00400088086000136A8A9841203 A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A ^ B: ~1BC06AB2FE38E002DBEBDEB84726B A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A & B: ~1BC67FFFFFF8F382FFEBFEF87766C A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A | B: ~6154D01C013802400204030401 A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A ^ B: 1BC06AB2FE38E002DBEBDEB84726B A: 1C63FFF77F09382EC81746036469 ! A: ~1C63FFF77F09382EC8174603646A A: ~1C63FFF77F09382EC81746036469 ! A: 1C63FFF77F09382EC81746036468 A: ~1C63FFF77F09382EC81746036469 A ~>> 0: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 A ~>> 1: ~E31FFFBBF849C17640BA301B235 A: ~1C63FFF77F09382EC81746036469 A ~>> 2: ~718FFFDDFC24E0BB205D180D91B A: ~1C63FFF77F09382EC81746036469 A ~>> F: ~38C7FFEEFE12705D902E8C07 A: ~1C63FFF77F09382EC81746036469 A ~>> 10: ~1C63FFF77F09382EC8174604 A: ~1C63FFF77F09382EC81746036469 A ~>> 11: ~E31FFFBBF849C17640BA302 A: ~1C63FFF77F09382EC81746036469 A ~>> 12: ~718FFFDDFC24E0BB205D181 A: ~1C63FFF77F09382EC81746036469 A << 0: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 A << 1: ~38C7FFEEFE12705D902E8C06C8D2 A: ~1C63FFF77F09382EC81746036469 A << 2: ~718FFFDDFC24E0BB205D180D91A4 A: ~1C63FFF77F09382EC81746036469 A << F: ~E31FFFBBF849C17640BA301B2348000 A: ~1C63FFF77F09382EC81746036469 A << 10: ~1C63FFF77F09382EC817460364690000 A: ~1C63FFF77F09382EC81746036469 A << 11: ~38C7FFEEFE12705D902E8C06C8D20000 A: ~1C63FFF77F09382EC81746036469 A << 12: ~718FFFDDFC24E0BB205D180D91A40000 mlton-20210117+dfsg/regression/int-inf.bitops.sml000066400000000000000000000044651416264345000215770ustar00rootroot00000000000000fun pr i = (print (IntInf.fmt StringCvt.HEX i); print "\n") fun prBin oper a b c = (print " A: "; pr a; print " B: "; pr b; print ("A " ^ oper ^ " B: "); pr c) fun prUn oper a c = (print " A: "; pr a; print (oper ^ " A: "); pr c) fun prSh oper w a c = let val s = Word.fmt StringCvt.HEX w val sp = CharVector.tabulate(String.size s, fn _ => #" ") in print (" " ^ sp ^ "A: "); pr a; print ("A " ^ oper ^ " " ^ s ^ ": "); pr c end fun mkInt i n = if n = 0 then i else mkInt (IntInf.+ (IntInf.* (i, IntInf.fromInt 10),i)) (n - 1) val mkInt = fn i => fn n => mkInt (IntInf.fromInt i) n fun tryBin' (a, b) = let val _ = prBin "&" a b (IntInf.andb (a, b)) val _ = prBin "|" a b (IntInf.orb (a, b)) val _ = prBin "^" a b (IntInf.xorb (a, b)) in () end fun tryBin (a, b) = let val _ = tryBin' (a, b) val _ = tryBin' (IntInf.~ a, b) val _ = tryBin' (a, IntInf.~ b) val _ = tryBin' (IntInf.~ a, IntInf.~ b) in () end fun tryUn' a = let val _ = prUn "!" a (IntInf.notb a) in () end fun tryUn a = let val _ = tryUn' a val _ = tryUn' (IntInf.~ a) in () end fun trySh' a = let val _ = List.app (fn w => prSh "~>>" w a (IntInf.~>> (a, w))) [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] val _ = List.app (fn w => prSh " <<" w a (IntInf.<< (a, w))) [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] in () end fun trySh a = let (* val _ = trySh' a *) val _ = trySh' (IntInf.~ a) in () end fun loop (n', m') (n, m) = let fun loop' i = let fun loop'' j = if j > m then loop' (i + 1) else (tryBin (mkInt i j, mkInt i j); tryBin (mkInt i j, mkInt (i + 1) j); tryBin (mkInt i j, mkInt i (j + 1)); tryBin (mkInt i j, mkInt (i + 1) (j + 1)); tryUn (mkInt i j); trySh (mkInt i j); loop'' (j + 1)) in if i > n then () else loop'' m' end in loop' n' end val _ = loop (0, 0) (3, 3) val _ = loop (0, 8) (3, 10) val _ = loop (0, 20) (3, 22) val _ = loop (0, 30) (3, 31)mlton-20210117+dfsg/regression/int-inf.compare.ok000066400000000000000000000014151416264345000215330ustar00rootroot00000000000000equal greater greater greater greater greater greater greater greater greater greater less equal greater greater greater greater greater greater greater greater greater less less equal greater greater greater greater greater greater greater greater less less less equal greater greater greater greater greater greater greater less less less less equal greater greater greater greater greater greater less less less less less equal greater greater greater greater greater less less less less less less equal greater greater greater greater less less less less less less less equal greater greater greater less less less less less less less less equal greater greater less less less less less less less less less equal greater less less less less less less less less less less equal mlton-20210117+dfsg/regression/int-inf.compare.sml000066400000000000000000000007571416264345000217250ustar00rootroot00000000000000val l = [12345678901234567890, 1234567890, 1234, 12, 1, 0, ~1, ~12, ~1234, ~1234567890, ~12345678901234567890] val _ = List.app (fn i => List.app (fn i' => let val s = case IntInf.compare (i, i') of EQUAL => "equal" | GREATER => "greater" | LESS => "less" in print (concat [s, "\n"]) end) l) l mlton-20210117+dfsg/regression/int-inf.log2.ok000066400000000000000000000000411416264345000207420ustar00rootroot000000000000000 1 1 28 29 30 31 32 32 33 33 OK mlton-20210117+dfsg/regression/int-inf.log2.sml000066400000000000000000000010421416264345000211260ustar00rootroot00000000000000val _ = List.app (fn i => print (concat [Int.toString (IntInf.log2 i), "\n"])) [1, 2, 3, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x100000000, 0x1FFFFFFFF, 0x200000000, 0x200000001] val _ = List.app (fn i => if i = IntInf.log2 (IntInf.pow (2, i)) andalso i = IntInf.log2 (IntInf.pow (2, i) + 1) andalso i - 1 = IntInf.log2 (IntInf.pow (2, i) - 1) then () else raise Fail "bug") (List.tabulate (100, fn i => i + 1)) val _ = print "OK\n" mlton-20210117+dfsg/regression/int-inf.rep1.ok000066400000000000000000000000141416264345000207460ustar00rootroot00000000000000That's good mlton-20210117+dfsg/regression/int-inf.rep1.sml000066400000000000000000000004171416264345000211370ustar00rootroot00000000000000structure I = MLton.IntInf val bigthree = Vector.fromList (List.map I.BigWord.fromInt [0,3]) val three = case I.fromRep (I.Big bigthree) of SOME b3 => b3 | NONE => 3 val () = if three = three + 1 - 1 then print "That's good\n" else print "That's bad\n" mlton-20210117+dfsg/regression/int-inf.rep2.ok000066400000000000000000000000141416264345000207470ustar00rootroot00000000000000That's good mlton-20210117+dfsg/regression/int-inf.rep2.sml000066400000000000000000000004521416264345000211370ustar00rootroot00000000000000structure I = MLton.IntInf val bigthree = Vector.fromList (List.map I.BigWord.fromInt [0,3]) val three = case I.fromRep (I.Big bigthree) of SOME b3 => b3 | NONE => 3 val () = case IntInf.compare (three, three + 1 - 1) of EQUAL => print "That's good\n" | _ => print "That's bad\n" mlton-20210117+dfsg/regression/int-inf.rep3.ok000066400000000000000000000000341416264345000207520ustar00rootroot00000000000000int-inf.rep3.???.ok missing mlton-20210117+dfsg/regression/int-inf.rep3.rep32.ok000066400000000000000000000000421416264345000217030ustar00rootroot00000000000000That's good 4294967296 4294967296 mlton-20210117+dfsg/regression/int-inf.rep3.rep64.ok000066400000000000000000000000661416264345000217160ustar00rootroot00000000000000That's good 18446744073709551616 18446744073709551616 mlton-20210117+dfsg/regression/int-inf.rep3.sml000066400000000000000000000010541416264345000211370ustar00rootroot00000000000000structure I = MLton.IntInf val big_canonical = Vector.fromList (List.map I.BigWord.fromInt [0,0,1]) val big_canonical = valOf (I.fromRep (I.Big big_canonical)) val big_non_canon = Vector.fromList (List.map I.BigWord.fromInt [0,0,1,0]) val big_non_canon = case I.fromRep (I.Big big_non_canon) of SOME bnc => bnc | NONE => big_canonical val () = if big_canonical = big_non_canon then print "That's good\n" else print "That's bad\n" val () = print (IntInf.toString big_canonical^"\n") val () = print (IntInf.toString big_non_canon^"\n") mlton-20210117+dfsg/regression/int-inf.rep4.ok000066400000000000000000000000341416264345000207530ustar00rootroot00000000000000int-inf.rep4.???.ok missing mlton-20210117+dfsg/regression/int-inf.rep4.rep32.ok000066400000000000000000000000421416264345000217040ustar00rootroot00000000000000That's good 4294967296 4294967296 mlton-20210117+dfsg/regression/int-inf.rep4.rep64.ok000066400000000000000000000000661416264345000217170ustar00rootroot00000000000000That's good 18446744073709551616 18446744073709551616 mlton-20210117+dfsg/regression/int-inf.rep4.sml000066400000000000000000000011071416264345000211370ustar00rootroot00000000000000structure I = MLton.IntInf val big_canonical = Vector.fromList (List.map I.BigWord.fromInt [0,0,1]) val big_canonical = valOf (I.fromRep (I.Big big_canonical)) val big_non_canon = Vector.fromList (List.map I.BigWord.fromInt [0,0,1,0]) val big_non_canon = case I.fromRep (I.Big big_non_canon) of SOME bnc => bnc | NONE => big_canonical val () = case IntInf.compare (big_canonical, big_non_canon) of EQUAL => print "That's good\n" | _ => print "That's bad\n" val () = print (IntInf.toString big_canonical^"\n") val () = print (IntInf.toString big_non_canon^"\n") mlton-20210117+dfsg/regression/int-inf.rep5.ok000066400000000000000000000000001416264345000207450ustar00rootroot00000000000000mlton-20210117+dfsg/regression/int-inf.rep5.sml000066400000000000000000000044231416264345000211440ustar00rootroot00000000000000structure II = IntInf structure MII = MLton.IntInf structure BigWord = MLton.IntInf.BigWord structure SmallInt = MLton.IntInf.SmallInt datatype rep = datatype MLton.IntInf.rep val toRep = MLton.IntInf.rep val fromRep = MLton.IntInf.fromRep fun checkToFrom ii = let fun bug str = print (concat ["checkToFrom ", IntInf.toString ii, " => ", str, "\n"]) val r = toRep ii val () = if false then print (concat ["toRep ", IntInf.toString ii, " = ", case r of Big _ => "Big\n" | Small _ => "Small\n"]) else () in case fromRep r of NONE => bug "(isSome (fromRep r)) failed" | SOME ii' => if ii = ii' then if r = toRep ii' then () else bug "(r = (toRep ii')) failed" else bug "(ii = ii') failed" end fun loop l = case l of nil => () | (lo,hi)::l => let fun iloop ii = if ii <= hi then (checkToFrom ii; iloop (ii + 1)) else loop l in iloop lo end val tests = let val op + = SmallInt.+ val op - = SmallInt.- val op div = SmallInt.div val two = SmallInt.fromInt 2 val thirtytwo = SmallInt.fromInt 32 val sixtyfour = thirtytwo + thirtytwo val min = valOf SmallInt.minInt val hmin = min div two val max = valOf SmallInt.maxInt val hmax = max div two in [(SmallInt.toLarge min, SmallInt.toLarge (min + sixtyfour)), (SmallInt.toLarge (hmin - thirtytwo), SmallInt.toLarge (hmin + thirtytwo)), (SmallInt.toLarge (hmax - thirtytwo), SmallInt.toLarge (hmax + thirtytwo)), (SmallInt.toLarge (max - sixtyfour), SmallInt.toLarge max)] end @ let val prec = valOf SmallInt.precision val min = ~ (IntInf.pow (2, prec - 1)) val hmin = min div 2 val max = IntInf.pow (2, prec - 1) - 1 val hmax = max div 2 in [(min, (min + 64)), ((hmin - 32), (hmin + 32)), ((hmax - 32), (hmax + 32)), ((max - 64), max)] end val () = loop tests mlton-20210117+dfsg/regression/int-mul-pow2.ok000066400000000000000000002473731416264345000210330ustar00rootroot00000000000000~32 * 64 = Overflow ~32 * 32 = Overflow ~32 * 16 = Overflow ~32 * 8 = Overflow ~32 * 4 = ~128 ~31 * 64 = Overflow ~31 * 32 = Overflow ~31 * 16 = Overflow ~31 * 8 = Overflow ~31 * 4 = ~124 ~30 * 64 = Overflow ~30 * 32 = Overflow ~30 * 16 = Overflow ~30 * 8 = Overflow ~30 * 4 = ~120 ~29 * 64 = Overflow ~29 * 32 = Overflow ~29 * 16 = Overflow ~29 * 8 = Overflow ~29 * 4 = ~116 ~28 * 64 = Overflow ~28 * 32 = Overflow ~28 * 16 = Overflow ~28 * 8 = Overflow ~28 * 4 = ~112 ~27 * 64 = Overflow ~27 * 32 = Overflow ~27 * 16 = Overflow ~27 * 8 = Overflow ~27 * 4 = ~108 ~26 * 64 = Overflow ~26 * 32 = Overflow ~26 * 16 = Overflow ~26 * 8 = Overflow ~26 * 4 = ~104 ~25 * 64 = Overflow ~25 * 32 = Overflow ~25 * 16 = Overflow ~25 * 8 = Overflow ~25 * 4 = ~100 ~24 * 64 = Overflow ~24 * 32 = Overflow ~24 * 16 = Overflow ~24 * 8 = Overflow ~24 * 4 = ~96 ~23 * 64 = Overflow ~23 * 32 = Overflow ~23 * 16 = Overflow ~23 * 8 = Overflow ~23 * 4 = ~92 ~22 * 64 = Overflow ~22 * 32 = Overflow ~22 * 16 = Overflow ~22 * 8 = Overflow ~22 * 4 = ~88 ~21 * 64 = Overflow ~21 * 32 = Overflow ~21 * 16 = Overflow ~21 * 8 = Overflow ~21 * 4 = ~84 ~20 * 64 = Overflow ~20 * 32 = Overflow ~20 * 16 = Overflow ~20 * 8 = Overflow ~20 * 4 = ~80 ~19 * 64 = Overflow ~19 * 32 = Overflow ~19 * 16 = Overflow ~19 * 8 = Overflow ~19 * 4 = ~76 ~18 * 64 = Overflow ~18 * 32 = Overflow ~18 * 16 = Overflow ~18 * 8 = Overflow ~18 * 4 = ~72 ~17 * 64 = Overflow ~17 * 32 = Overflow ~17 * 16 = Overflow ~17 * 8 = Overflow ~17 * 4 = ~68 ~16 * 64 = Overflow ~16 * 32 = Overflow ~16 * 16 = Overflow ~16 * 8 = ~128 ~16 * 4 = ~64 ~15 * 64 = Overflow ~15 * 32 = Overflow ~15 * 16 = Overflow ~15 * 8 = ~120 ~15 * 4 = ~60 ~14 * 64 = Overflow ~14 * 32 = Overflow ~14 * 16 = Overflow ~14 * 8 = ~112 ~14 * 4 = ~56 ~13 * 64 = Overflow ~13 * 32 = Overflow ~13 * 16 = Overflow ~13 * 8 = ~104 ~13 * 4 = ~52 ~12 * 64 = Overflow ~12 * 32 = Overflow ~12 * 16 = Overflow ~12 * 8 = ~96 ~12 * 4 = ~48 ~11 * 64 = Overflow ~11 * 32 = Overflow ~11 * 16 = Overflow ~11 * 8 = ~88 ~11 * 4 = ~44 ~10 * 64 = Overflow ~10 * 32 = Overflow ~10 * 16 = Overflow ~10 * 8 = ~80 ~10 * 4 = ~40 ~9 * 64 = Overflow ~9 * 32 = Overflow ~9 * 16 = Overflow ~9 * 8 = ~72 ~9 * 4 = ~36 ~8 * 64 = Overflow ~8 * 32 = Overflow ~8 * 16 = ~128 ~8 * 8 = ~64 ~8 * 4 = ~32 ~7 * 64 = Overflow ~7 * 32 = Overflow ~7 * 16 = ~112 ~7 * 8 = ~56 ~7 * 4 = ~28 ~6 * 64 = Overflow ~6 * 32 = Overflow ~6 * 16 = ~96 ~6 * 8 = ~48 ~6 * 4 = ~24 ~5 * 64 = Overflow ~5 * 32 = Overflow ~5 * 16 = ~80 ~5 * 8 = ~40 ~5 * 4 = ~20 ~4 * 64 = Overflow ~4 * 32 = ~128 ~4 * 16 = ~64 ~4 * 8 = ~32 ~4 * 4 = ~16 ~3 * 64 = Overflow ~3 * 32 = ~96 ~3 * 16 = ~48 ~3 * 8 = ~24 ~3 * 4 = ~12 ~2 * 64 = ~128 ~2 * 32 = ~64 ~2 * 16 = ~32 ~2 * 8 = ~16 ~2 * 4 = ~8 ~1 * 64 = ~64 ~1 * 32 = ~32 ~1 * 16 = ~16 ~1 * 8 = ~8 ~1 * 4 = ~4 0 * 64 = 0 0 * 32 = 0 0 * 16 = 0 0 * 8 = 0 0 * 4 = 0 1 * 64 = 64 1 * 32 = 32 1 * 16 = 16 1 * 8 = 8 1 * 4 = 4 2 * 64 = Overflow 2 * 32 = 64 2 * 16 = 32 2 * 8 = 16 2 * 4 = 8 3 * 64 = Overflow 3 * 32 = 96 3 * 16 = 48 3 * 8 = 24 3 * 4 = 12 4 * 64 = Overflow 4 * 32 = Overflow 4 * 16 = 64 4 * 8 = 32 4 * 4 = 16 5 * 64 = Overflow 5 * 32 = Overflow 5 * 16 = 80 5 * 8 = 40 5 * 4 = 20 6 * 64 = Overflow 6 * 32 = Overflow 6 * 16 = 96 6 * 8 = 48 6 * 4 = 24 7 * 64 = Overflow 7 * 32 = Overflow 7 * 16 = 112 7 * 8 = 56 7 * 4 = 28 8 * 64 = Overflow 8 * 32 = Overflow 8 * 16 = Overflow 8 * 8 = 64 8 * 4 = 32 9 * 64 = Overflow 9 * 32 = Overflow 9 * 16 = Overflow 9 * 8 = 72 9 * 4 = 36 10 * 64 = Overflow 10 * 32 = Overflow 10 * 16 = Overflow 10 * 8 = 80 10 * 4 = 40 11 * 64 = Overflow 11 * 32 = Overflow 11 * 16 = Overflow 11 * 8 = 88 11 * 4 = 44 12 * 64 = Overflow 12 * 32 = Overflow 12 * 16 = Overflow 12 * 8 = 96 12 * 4 = 48 13 * 64 = Overflow 13 * 32 = Overflow 13 * 16 = Overflow 13 * 8 = 104 13 * 4 = 52 14 * 64 = Overflow 14 * 32 = Overflow 14 * 16 = Overflow 14 * 8 = 112 14 * 4 = 56 15 * 64 = Overflow 15 * 32 = Overflow 15 * 16 = Overflow 15 * 8 = 120 15 * 4 = 60 16 * 64 = Overflow 16 * 32 = Overflow 16 * 16 = Overflow 16 * 8 = Overflow 16 * 4 = 64 17 * 64 = Overflow 17 * 32 = Overflow 17 * 16 = Overflow 17 * 8 = Overflow 17 * 4 = 68 18 * 64 = Overflow 18 * 32 = Overflow 18 * 16 = Overflow 18 * 8 = Overflow 18 * 4 = 72 19 * 64 = Overflow 19 * 32 = Overflow 19 * 16 = Overflow 19 * 8 = Overflow 19 * 4 = 76 20 * 64 = Overflow 20 * 32 = Overflow 20 * 16 = Overflow 20 * 8 = Overflow 20 * 4 = 80 21 * 64 = Overflow 21 * 32 = Overflow 21 * 16 = Overflow 21 * 8 = Overflow 21 * 4 = 84 22 * 64 = Overflow 22 * 32 = Overflow 22 * 16 = Overflow 22 * 8 = Overflow 22 * 4 = 88 23 * 64 = Overflow 23 * 32 = Overflow 23 * 16 = Overflow 23 * 8 = Overflow 23 * 4 = 92 24 * 64 = Overflow 24 * 32 = Overflow 24 * 16 = Overflow 24 * 8 = Overflow 24 * 4 = 96 25 * 64 = Overflow 25 * 32 = Overflow 25 * 16 = Overflow 25 * 8 = Overflow 25 * 4 = 100 26 * 64 = Overflow 26 * 32 = Overflow 26 * 16 = Overflow 26 * 8 = Overflow 26 * 4 = 104 27 * 64 = Overflow 27 * 32 = Overflow 27 * 16 = Overflow 27 * 8 = Overflow 27 * 4 = 108 28 * 64 = Overflow 28 * 32 = Overflow 28 * 16 = Overflow 28 * 8 = Overflow 28 * 4 = 112 29 * 64 = Overflow 29 * 32 = Overflow 29 * 16 = Overflow 29 * 8 = Overflow 29 * 4 = 116 30 * 64 = Overflow 30 * 32 = Overflow 30 * 16 = Overflow 30 * 8 = Overflow 30 * 4 = 120 31 * 64 = Overflow 31 * 32 = Overflow 31 * 16 = Overflow 31 * 8 = Overflow 31 * 4 = 124 32 * 64 = Overflow 32 * 32 = Overflow 32 * 16 = Overflow 32 * 8 = Overflow 32 * 4 = Overflow ~32 * ~128 = Overflow ~32 * ~64 = Overflow ~32 * ~32 = Overflow ~32 * ~16 = Overflow ~32 * ~8 = Overflow ~31 * ~128 = Overflow ~31 * ~64 = Overflow ~31 * ~32 = Overflow ~31 * ~16 = Overflow ~31 * ~8 = Overflow ~30 * ~128 = Overflow ~30 * ~64 = Overflow ~30 * ~32 = Overflow ~30 * ~16 = Overflow ~30 * ~8 = Overflow ~29 * ~128 = Overflow ~29 * ~64 = Overflow ~29 * ~32 = Overflow ~29 * ~16 = Overflow ~29 * ~8 = Overflow ~28 * ~128 = Overflow ~28 * ~64 = Overflow ~28 * ~32 = Overflow ~28 * ~16 = Overflow ~28 * ~8 = Overflow ~27 * ~128 = Overflow ~27 * ~64 = Overflow ~27 * ~32 = Overflow ~27 * ~16 = Overflow ~27 * ~8 = Overflow ~26 * ~128 = Overflow ~26 * ~64 = Overflow ~26 * ~32 = Overflow ~26 * ~16 = Overflow ~26 * ~8 = Overflow ~25 * ~128 = Overflow ~25 * ~64 = Overflow ~25 * ~32 = Overflow ~25 * ~16 = Overflow ~25 * ~8 = Overflow ~24 * ~128 = Overflow ~24 * ~64 = Overflow ~24 * ~32 = Overflow ~24 * ~16 = Overflow ~24 * ~8 = Overflow ~23 * ~128 = Overflow ~23 * ~64 = Overflow ~23 * ~32 = Overflow ~23 * ~16 = Overflow ~23 * ~8 = Overflow ~22 * ~128 = Overflow ~22 * ~64 = Overflow ~22 * ~32 = Overflow ~22 * ~16 = Overflow ~22 * ~8 = Overflow ~21 * ~128 = Overflow ~21 * ~64 = Overflow ~21 * ~32 = Overflow ~21 * ~16 = Overflow ~21 * ~8 = Overflow ~20 * ~128 = Overflow ~20 * ~64 = Overflow ~20 * ~32 = Overflow ~20 * ~16 = Overflow ~20 * ~8 = Overflow ~19 * ~128 = Overflow ~19 * ~64 = Overflow ~19 * ~32 = Overflow ~19 * ~16 = Overflow ~19 * ~8 = Overflow ~18 * ~128 = Overflow ~18 * ~64 = Overflow ~18 * ~32 = Overflow ~18 * ~16 = Overflow ~18 * ~8 = Overflow ~17 * ~128 = Overflow ~17 * ~64 = Overflow ~17 * ~32 = Overflow ~17 * ~16 = Overflow ~17 * ~8 = Overflow ~16 * ~128 = Overflow ~16 * ~64 = Overflow ~16 * ~32 = Overflow ~16 * ~16 = Overflow ~16 * ~8 = Overflow ~15 * ~128 = Overflow ~15 * ~64 = Overflow ~15 * ~32 = Overflow ~15 * ~16 = Overflow ~15 * ~8 = 120 ~14 * ~128 = Overflow ~14 * ~64 = Overflow ~14 * ~32 = Overflow ~14 * ~16 = Overflow ~14 * ~8 = 112 ~13 * ~128 = Overflow ~13 * ~64 = Overflow ~13 * ~32 = Overflow ~13 * ~16 = Overflow ~13 * ~8 = 104 ~12 * ~128 = Overflow ~12 * ~64 = Overflow ~12 * ~32 = Overflow ~12 * ~16 = Overflow ~12 * ~8 = 96 ~11 * ~128 = Overflow ~11 * ~64 = Overflow ~11 * ~32 = Overflow ~11 * ~16 = Overflow ~11 * ~8 = 88 ~10 * ~128 = Overflow ~10 * ~64 = Overflow ~10 * ~32 = Overflow ~10 * ~16 = Overflow ~10 * ~8 = 80 ~9 * ~128 = Overflow ~9 * ~64 = Overflow ~9 * ~32 = Overflow ~9 * ~16 = Overflow ~9 * ~8 = 72 ~8 * ~128 = Overflow ~8 * ~64 = Overflow ~8 * ~32 = Overflow ~8 * ~16 = Overflow ~8 * ~8 = 64 ~7 * ~128 = Overflow ~7 * ~64 = Overflow ~7 * ~32 = Overflow ~7 * ~16 = 112 ~7 * ~8 = 56 ~6 * ~128 = Overflow ~6 * ~64 = Overflow ~6 * ~32 = Overflow ~6 * ~16 = 96 ~6 * ~8 = 48 ~5 * ~128 = Overflow ~5 * ~64 = Overflow ~5 * ~32 = Overflow ~5 * ~16 = 80 ~5 * ~8 = 40 ~4 * ~128 = Overflow ~4 * ~64 = Overflow ~4 * ~32 = Overflow ~4 * ~16 = 64 ~4 * ~8 = 32 ~3 * ~128 = Overflow ~3 * ~64 = Overflow ~3 * ~32 = 96 ~3 * ~16 = 48 ~3 * ~8 = 24 ~2 * ~128 = Overflow ~2 * ~64 = Overflow ~2 * ~32 = 64 ~2 * ~16 = 32 ~2 * ~8 = 16 ~1 * ~128 = Overflow ~1 * ~64 = 64 ~1 * ~32 = 32 ~1 * ~16 = 16 ~1 * ~8 = 8 0 * ~128 = 0 0 * ~64 = 0 0 * ~32 = 0 0 * ~16 = 0 0 * ~8 = 0 1 * ~128 = ~128 1 * ~64 = ~64 1 * ~32 = ~32 1 * ~16 = ~16 1 * ~8 = ~8 2 * ~128 = Overflow 2 * ~64 = ~128 2 * ~32 = ~64 2 * ~16 = ~32 2 * ~8 = ~16 3 * ~128 = Overflow 3 * ~64 = Overflow 3 * ~32 = ~96 3 * ~16 = ~48 3 * ~8 = ~24 4 * ~128 = Overflow 4 * ~64 = Overflow 4 * ~32 = ~128 4 * ~16 = ~64 4 * ~8 = ~32 5 * ~128 = Overflow 5 * ~64 = Overflow 5 * ~32 = Overflow 5 * ~16 = ~80 5 * ~8 = ~40 6 * ~128 = Overflow 6 * ~64 = Overflow 6 * ~32 = Overflow 6 * ~16 = ~96 6 * ~8 = ~48 7 * ~128 = Overflow 7 * ~64 = Overflow 7 * ~32 = Overflow 7 * ~16 = ~112 7 * ~8 = ~56 8 * ~128 = Overflow 8 * ~64 = Overflow 8 * ~32 = Overflow 8 * ~16 = ~128 8 * ~8 = ~64 9 * ~128 = Overflow 9 * ~64 = Overflow 9 * ~32 = Overflow 9 * ~16 = Overflow 9 * ~8 = ~72 10 * ~128 = Overflow 10 * ~64 = Overflow 10 * ~32 = Overflow 10 * ~16 = Overflow 10 * ~8 = ~80 11 * ~128 = Overflow 11 * ~64 = Overflow 11 * ~32 = Overflow 11 * ~16 = Overflow 11 * ~8 = ~88 12 * ~128 = Overflow 12 * ~64 = Overflow 12 * ~32 = Overflow 12 * ~16 = Overflow 12 * ~8 = ~96 13 * ~128 = Overflow 13 * ~64 = Overflow 13 * ~32 = Overflow 13 * ~16 = Overflow 13 * ~8 = ~104 14 * ~128 = Overflow 14 * ~64 = Overflow 14 * ~32 = Overflow 14 * ~16 = Overflow 14 * ~8 = ~112 15 * ~128 = Overflow 15 * ~64 = Overflow 15 * ~32 = Overflow 15 * ~16 = Overflow 15 * ~8 = ~120 16 * ~128 = Overflow 16 * ~64 = Overflow 16 * ~32 = Overflow 16 * ~16 = Overflow 16 * ~8 = ~128 17 * ~128 = Overflow 17 * ~64 = Overflow 17 * ~32 = Overflow 17 * ~16 = Overflow 17 * ~8 = Overflow 18 * ~128 = Overflow 18 * ~64 = Overflow 18 * ~32 = Overflow 18 * ~16 = Overflow 18 * ~8 = Overflow 19 * ~128 = Overflow 19 * ~64 = Overflow 19 * ~32 = Overflow 19 * ~16 = Overflow 19 * ~8 = Overflow 20 * ~128 = Overflow 20 * ~64 = Overflow 20 * ~32 = Overflow 20 * ~16 = Overflow 20 * ~8 = Overflow 21 * ~128 = Overflow 21 * ~64 = Overflow 21 * ~32 = Overflow 21 * ~16 = Overflow 21 * ~8 = Overflow 22 * ~128 = Overflow 22 * ~64 = Overflow 22 * ~32 = Overflow 22 * ~16 = Overflow 22 * ~8 = Overflow 23 * ~128 = Overflow 23 * ~64 = Overflow 23 * ~32 = Overflow 23 * ~16 = Overflow 23 * ~8 = Overflow 24 * ~128 = Overflow 24 * ~64 = Overflow 24 * ~32 = Overflow 24 * ~16 = Overflow 24 * ~8 = Overflow 25 * ~128 = Overflow 25 * ~64 = Overflow 25 * ~32 = Overflow 25 * ~16 = Overflow 25 * ~8 = Overflow 26 * ~128 = Overflow 26 * ~64 = Overflow 26 * ~32 = Overflow 26 * ~16 = Overflow 26 * ~8 = Overflow 27 * ~128 = Overflow 27 * ~64 = Overflow 27 * ~32 = Overflow 27 * ~16 = Overflow 27 * ~8 = Overflow 28 * ~128 = Overflow 28 * ~64 = Overflow 28 * ~32 = Overflow 28 * ~16 = Overflow 28 * ~8 = Overflow 29 * ~128 = Overflow 29 * ~64 = Overflow 29 * ~32 = Overflow 29 * ~16 = Overflow 29 * ~8 = Overflow 30 * ~128 = Overflow 30 * ~64 = Overflow 30 * ~32 = Overflow 30 * ~16 = Overflow 30 * ~8 = Overflow 31 * ~128 = Overflow 31 * ~64 = Overflow 31 * ~32 = Overflow 31 * ~16 = Overflow 31 * ~8 = Overflow 32 * ~128 = Overflow 32 * ~64 = Overflow 32 * ~32 = Overflow 32 * ~16 = Overflow 32 * ~8 = Overflow ~128 * 1 = ~128 ~128 * 2 = Overflow ~128 * 4 = Overflow ~128 * 8 = Overflow ~128 * 16 = Overflow ~64 * 1 = ~64 ~64 * 2 = ~128 ~64 * 4 = Overflow ~64 * 8 = Overflow ~64 * 16 = Overflow ~32 * 1 = ~32 ~32 * 2 = ~64 ~32 * 4 = ~128 ~32 * 8 = Overflow ~32 * 16 = Overflow ~16 * 1 = ~16 ~16 * 2 = ~32 ~16 * 4 = ~64 ~16 * 8 = ~128 ~16 * 16 = Overflow ~8 * 1 = ~8 ~8 * 2 = ~16 ~8 * 4 = ~32 ~8 * 8 = ~64 ~8 * 16 = ~128 ~4 * 1 = ~4 ~4 * 2 = ~8 ~4 * 4 = ~16 ~4 * 8 = ~32 ~4 * 16 = ~64 ~4 * 1 = ~4 ~4 * 2 = ~8 ~4 * 4 = ~16 ~4 * 8 = ~32 ~4 * 16 = ~64 ~3 * 1 = ~3 ~3 * 2 = ~6 ~3 * 4 = ~12 ~3 * 8 = ~24 ~3 * 16 = ~48 ~2 * 1 = ~2 ~2 * 2 = ~4 ~2 * 4 = ~8 ~2 * 8 = ~16 ~2 * 16 = ~32 ~1 * 1 = ~1 ~1 * 2 = ~2 ~1 * 4 = ~4 ~1 * 8 = ~8 ~1 * 16 = ~16 0 * 1 = 0 0 * 2 = 0 0 * 4 = 0 0 * 8 = 0 0 * 16 = 0 1 * 1 = 1 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 1 * 16 = 16 2 * 1 = 2 2 * 2 = 4 2 * 4 = 8 2 * 8 = 16 2 * 16 = 32 3 * 1 = 3 3 * 2 = 6 3 * 4 = 12 3 * 8 = 24 3 * 16 = 48 4 * 1 = 4 4 * 2 = 8 4 * 4 = 16 4 * 8 = 32 4 * 16 = 64 2 * 1 = 2 2 * 2 = 4 2 * 4 = 8 2 * 8 = 16 2 * 16 = 32 4 * 1 = 4 4 * 2 = 8 4 * 4 = 16 4 * 8 = 32 4 * 16 = 64 8 * 1 = 8 8 * 2 = 16 8 * 4 = 32 8 * 8 = 64 8 * 16 = Overflow 16 * 1 = 16 16 * 2 = 32 16 * 4 = 64 16 * 8 = Overflow 16 * 16 = Overflow 32 * 1 = 32 32 * 2 = 64 32 * 4 = Overflow 32 * 8 = Overflow 32 * 16 = Overflow 64 * 1 = 64 64 * 2 = Overflow 64 * 4 = Overflow 64 * 8 = Overflow 64 * 16 = Overflow ~128 * ~1 = Overflow ~128 * ~2 = Overflow ~128 * ~4 = Overflow ~128 * ~8 = Overflow ~128 * ~16 = Overflow ~64 * ~1 = 64 ~64 * ~2 = Overflow ~64 * ~4 = Overflow ~64 * ~8 = Overflow ~64 * ~16 = Overflow ~32 * ~1 = 32 ~32 * ~2 = 64 ~32 * ~4 = Overflow ~32 * ~8 = Overflow ~32 * ~16 = Overflow ~16 * ~1 = 16 ~16 * ~2 = 32 ~16 * ~4 = 64 ~16 * ~8 = Overflow ~16 * ~16 = Overflow ~8 * ~1 = 8 ~8 * ~2 = 16 ~8 * ~4 = 32 ~8 * ~8 = 64 ~8 * ~16 = Overflow ~4 * ~1 = 4 ~4 * ~2 = 8 ~4 * ~4 = 16 ~4 * ~8 = 32 ~4 * ~16 = 64 ~4 * ~1 = 4 ~4 * ~2 = 8 ~4 * ~4 = 16 ~4 * ~8 = 32 ~4 * ~16 = 64 ~3 * ~1 = 3 ~3 * ~2 = 6 ~3 * ~4 = 12 ~3 * ~8 = 24 ~3 * ~16 = 48 ~2 * ~1 = 2 ~2 * ~2 = 4 ~2 * ~4 = 8 ~2 * ~8 = 16 ~2 * ~16 = 32 ~1 * ~1 = 1 ~1 * ~2 = 2 ~1 * ~4 = 4 ~1 * ~8 = 8 ~1 * ~16 = 16 0 * ~1 = 0 0 * ~2 = 0 0 * ~4 = 0 0 * ~8 = 0 0 * ~16 = 0 1 * ~1 = ~1 1 * ~2 = ~2 1 * ~4 = ~4 1 * ~8 = ~8 1 * ~16 = ~16 2 * ~1 = ~2 2 * ~2 = ~4 2 * ~4 = ~8 2 * ~8 = ~16 2 * ~16 = ~32 3 * ~1 = ~3 3 * ~2 = ~6 3 * ~4 = ~12 3 * ~8 = ~24 3 * ~16 = ~48 4 * ~1 = ~4 4 * ~2 = ~8 4 * ~4 = ~16 4 * ~8 = ~32 4 * ~16 = ~64 2 * ~1 = ~2 2 * ~2 = ~4 2 * ~4 = ~8 2 * ~8 = ~16 2 * ~16 = ~32 4 * ~1 = ~4 4 * ~2 = ~8 4 * ~4 = ~16 4 * ~8 = ~32 4 * ~16 = ~64 8 * ~1 = ~8 8 * ~2 = ~16 8 * ~4 = ~32 8 * ~8 = ~64 8 * ~16 = ~128 16 * ~1 = ~16 16 * ~2 = ~32 16 * ~4 = ~64 16 * ~8 = ~128 16 * ~16 = Overflow 32 * ~1 = ~32 32 * ~2 = ~64 32 * ~4 = ~128 32 * ~8 = Overflow 32 * ~16 = Overflow 64 * ~1 = ~64 64 * ~2 = ~128 64 * ~4 = Overflow 64 * ~8 = Overflow 64 * ~16 = Overflow ~32 * 16384 = Overflow ~32 * 8192 = Overflow ~32 * 4096 = Overflow ~32 * 2048 = Overflow ~32 * 1024 = ~32768 ~31 * 16384 = Overflow ~31 * 8192 = Overflow ~31 * 4096 = Overflow ~31 * 2048 = Overflow ~31 * 1024 = ~31744 ~30 * 16384 = Overflow ~30 * 8192 = Overflow ~30 * 4096 = Overflow ~30 * 2048 = Overflow ~30 * 1024 = ~30720 ~29 * 16384 = Overflow ~29 * 8192 = Overflow ~29 * 4096 = Overflow ~29 * 2048 = Overflow ~29 * 1024 = ~29696 ~28 * 16384 = Overflow ~28 * 8192 = Overflow ~28 * 4096 = Overflow ~28 * 2048 = Overflow ~28 * 1024 = ~28672 ~27 * 16384 = Overflow ~27 * 8192 = Overflow ~27 * 4096 = Overflow ~27 * 2048 = Overflow ~27 * 1024 = ~27648 ~26 * 16384 = Overflow ~26 * 8192 = Overflow ~26 * 4096 = Overflow ~26 * 2048 = Overflow ~26 * 1024 = ~26624 ~25 * 16384 = Overflow ~25 * 8192 = Overflow ~25 * 4096 = Overflow ~25 * 2048 = Overflow ~25 * 1024 = ~25600 ~24 * 16384 = Overflow ~24 * 8192 = Overflow ~24 * 4096 = Overflow ~24 * 2048 = Overflow ~24 * 1024 = ~24576 ~23 * 16384 = Overflow ~23 * 8192 = Overflow ~23 * 4096 = Overflow ~23 * 2048 = Overflow ~23 * 1024 = ~23552 ~22 * 16384 = Overflow ~22 * 8192 = Overflow ~22 * 4096 = Overflow ~22 * 2048 = Overflow ~22 * 1024 = ~22528 ~21 * 16384 = Overflow ~21 * 8192 = Overflow ~21 * 4096 = Overflow ~21 * 2048 = Overflow ~21 * 1024 = ~21504 ~20 * 16384 = Overflow ~20 * 8192 = Overflow ~20 * 4096 = Overflow ~20 * 2048 = Overflow ~20 * 1024 = ~20480 ~19 * 16384 = Overflow ~19 * 8192 = Overflow ~19 * 4096 = Overflow ~19 * 2048 = Overflow ~19 * 1024 = ~19456 ~18 * 16384 = Overflow ~18 * 8192 = Overflow ~18 * 4096 = Overflow ~18 * 2048 = Overflow ~18 * 1024 = ~18432 ~17 * 16384 = Overflow ~17 * 8192 = Overflow ~17 * 4096 = Overflow ~17 * 2048 = Overflow ~17 * 1024 = ~17408 ~16 * 16384 = Overflow ~16 * 8192 = Overflow ~16 * 4096 = Overflow ~16 * 2048 = ~32768 ~16 * 1024 = ~16384 ~15 * 16384 = Overflow ~15 * 8192 = Overflow ~15 * 4096 = Overflow ~15 * 2048 = ~30720 ~15 * 1024 = ~15360 ~14 * 16384 = Overflow ~14 * 8192 = Overflow ~14 * 4096 = Overflow ~14 * 2048 = ~28672 ~14 * 1024 = ~14336 ~13 * 16384 = Overflow ~13 * 8192 = Overflow ~13 * 4096 = Overflow ~13 * 2048 = ~26624 ~13 * 1024 = ~13312 ~12 * 16384 = Overflow ~12 * 8192 = Overflow ~12 * 4096 = Overflow ~12 * 2048 = ~24576 ~12 * 1024 = ~12288 ~11 * 16384 = Overflow ~11 * 8192 = Overflow ~11 * 4096 = Overflow ~11 * 2048 = ~22528 ~11 * 1024 = ~11264 ~10 * 16384 = Overflow ~10 * 8192 = Overflow ~10 * 4096 = Overflow ~10 * 2048 = ~20480 ~10 * 1024 = ~10240 ~9 * 16384 = Overflow ~9 * 8192 = Overflow ~9 * 4096 = Overflow ~9 * 2048 = ~18432 ~9 * 1024 = ~9216 ~8 * 16384 = Overflow ~8 * 8192 = Overflow ~8 * 4096 = ~32768 ~8 * 2048 = ~16384 ~8 * 1024 = ~8192 ~7 * 16384 = Overflow ~7 * 8192 = Overflow ~7 * 4096 = ~28672 ~7 * 2048 = ~14336 ~7 * 1024 = ~7168 ~6 * 16384 = Overflow ~6 * 8192 = Overflow ~6 * 4096 = ~24576 ~6 * 2048 = ~12288 ~6 * 1024 = ~6144 ~5 * 16384 = Overflow ~5 * 8192 = Overflow ~5 * 4096 = ~20480 ~5 * 2048 = ~10240 ~5 * 1024 = ~5120 ~4 * 16384 = Overflow ~4 * 8192 = ~32768 ~4 * 4096 = ~16384 ~4 * 2048 = ~8192 ~4 * 1024 = ~4096 ~3 * 16384 = Overflow ~3 * 8192 = ~24576 ~3 * 4096 = ~12288 ~3 * 2048 = ~6144 ~3 * 1024 = ~3072 ~2 * 16384 = ~32768 ~2 * 8192 = ~16384 ~2 * 4096 = ~8192 ~2 * 2048 = ~4096 ~2 * 1024 = ~2048 ~1 * 16384 = ~16384 ~1 * 8192 = ~8192 ~1 * 4096 = ~4096 ~1 * 2048 = ~2048 ~1 * 1024 = ~1024 0 * 16384 = 0 0 * 8192 = 0 0 * 4096 = 0 0 * 2048 = 0 0 * 1024 = 0 1 * 16384 = 16384 1 * 8192 = 8192 1 * 4096 = 4096 1 * 2048 = 2048 1 * 1024 = 1024 2 * 16384 = Overflow 2 * 8192 = 16384 2 * 4096 = 8192 2 * 2048 = 4096 2 * 1024 = 2048 3 * 16384 = Overflow 3 * 8192 = 24576 3 * 4096 = 12288 3 * 2048 = 6144 3 * 1024 = 3072 4 * 16384 = Overflow 4 * 8192 = Overflow 4 * 4096 = 16384 4 * 2048 = 8192 4 * 1024 = 4096 5 * 16384 = Overflow 5 * 8192 = Overflow 5 * 4096 = 20480 5 * 2048 = 10240 5 * 1024 = 5120 6 * 16384 = Overflow 6 * 8192 = Overflow 6 * 4096 = 24576 6 * 2048 = 12288 6 * 1024 = 6144 7 * 16384 = Overflow 7 * 8192 = Overflow 7 * 4096 = 28672 7 * 2048 = 14336 7 * 1024 = 7168 8 * 16384 = Overflow 8 * 8192 = Overflow 8 * 4096 = Overflow 8 * 2048 = 16384 8 * 1024 = 8192 9 * 16384 = Overflow 9 * 8192 = Overflow 9 * 4096 = Overflow 9 * 2048 = 18432 9 * 1024 = 9216 10 * 16384 = Overflow 10 * 8192 = Overflow 10 * 4096 = Overflow 10 * 2048 = 20480 10 * 1024 = 10240 11 * 16384 = Overflow 11 * 8192 = Overflow 11 * 4096 = Overflow 11 * 2048 = 22528 11 * 1024 = 11264 12 * 16384 = Overflow 12 * 8192 = Overflow 12 * 4096 = Overflow 12 * 2048 = 24576 12 * 1024 = 12288 13 * 16384 = Overflow 13 * 8192 = Overflow 13 * 4096 = Overflow 13 * 2048 = 26624 13 * 1024 = 13312 14 * 16384 = Overflow 14 * 8192 = Overflow 14 * 4096 = Overflow 14 * 2048 = 28672 14 * 1024 = 14336 15 * 16384 = Overflow 15 * 8192 = Overflow 15 * 4096 = Overflow 15 * 2048 = 30720 15 * 1024 = 15360 16 * 16384 = Overflow 16 * 8192 = Overflow 16 * 4096 = Overflow 16 * 2048 = Overflow 16 * 1024 = 16384 17 * 16384 = Overflow 17 * 8192 = Overflow 17 * 4096 = Overflow 17 * 2048 = Overflow 17 * 1024 = 17408 18 * 16384 = Overflow 18 * 8192 = Overflow 18 * 4096 = Overflow 18 * 2048 = Overflow 18 * 1024 = 18432 19 * 16384 = Overflow 19 * 8192 = Overflow 19 * 4096 = Overflow 19 * 2048 = Overflow 19 * 1024 = 19456 20 * 16384 = Overflow 20 * 8192 = Overflow 20 * 4096 = Overflow 20 * 2048 = Overflow 20 * 1024 = 20480 21 * 16384 = Overflow 21 * 8192 = Overflow 21 * 4096 = Overflow 21 * 2048 = Overflow 21 * 1024 = 21504 22 * 16384 = Overflow 22 * 8192 = Overflow 22 * 4096 = Overflow 22 * 2048 = Overflow 22 * 1024 = 22528 23 * 16384 = Overflow 23 * 8192 = Overflow 23 * 4096 = Overflow 23 * 2048 = Overflow 23 * 1024 = 23552 24 * 16384 = Overflow 24 * 8192 = Overflow 24 * 4096 = Overflow 24 * 2048 = Overflow 24 * 1024 = 24576 25 * 16384 = Overflow 25 * 8192 = Overflow 25 * 4096 = Overflow 25 * 2048 = Overflow 25 * 1024 = 25600 26 * 16384 = Overflow 26 * 8192 = Overflow 26 * 4096 = Overflow 26 * 2048 = Overflow 26 * 1024 = 26624 27 * 16384 = Overflow 27 * 8192 = Overflow 27 * 4096 = Overflow 27 * 2048 = Overflow 27 * 1024 = 27648 28 * 16384 = Overflow 28 * 8192 = Overflow 28 * 4096 = Overflow 28 * 2048 = Overflow 28 * 1024 = 28672 29 * 16384 = Overflow 29 * 8192 = Overflow 29 * 4096 = Overflow 29 * 2048 = Overflow 29 * 1024 = 29696 30 * 16384 = Overflow 30 * 8192 = Overflow 30 * 4096 = Overflow 30 * 2048 = Overflow 30 * 1024 = 30720 31 * 16384 = Overflow 31 * 8192 = Overflow 31 * 4096 = Overflow 31 * 2048 = Overflow 31 * 1024 = 31744 32 * 16384 = Overflow 32 * 8192 = Overflow 32 * 4096 = Overflow 32 * 2048 = Overflow 32 * 1024 = Overflow ~32 * ~32768 = Overflow ~32 * ~16384 = Overflow ~32 * ~8192 = Overflow ~32 * ~4096 = Overflow ~32 * ~2048 = Overflow ~31 * ~32768 = Overflow ~31 * ~16384 = Overflow ~31 * ~8192 = Overflow ~31 * ~4096 = Overflow ~31 * ~2048 = Overflow ~30 * ~32768 = Overflow ~30 * ~16384 = Overflow ~30 * ~8192 = Overflow ~30 * ~4096 = Overflow ~30 * ~2048 = Overflow ~29 * ~32768 = Overflow ~29 * ~16384 = Overflow ~29 * ~8192 = Overflow ~29 * ~4096 = Overflow ~29 * ~2048 = Overflow ~28 * ~32768 = Overflow ~28 * ~16384 = Overflow ~28 * ~8192 = Overflow ~28 * ~4096 = Overflow ~28 * ~2048 = Overflow ~27 * ~32768 = Overflow ~27 * ~16384 = Overflow ~27 * ~8192 = Overflow ~27 * ~4096 = Overflow ~27 * ~2048 = Overflow ~26 * ~32768 = Overflow ~26 * ~16384 = Overflow ~26 * ~8192 = Overflow ~26 * ~4096 = Overflow ~26 * ~2048 = Overflow ~25 * ~32768 = Overflow ~25 * ~16384 = Overflow ~25 * ~8192 = Overflow ~25 * ~4096 = Overflow ~25 * ~2048 = Overflow ~24 * ~32768 = Overflow ~24 * ~16384 = Overflow ~24 * ~8192 = Overflow ~24 * ~4096 = Overflow ~24 * ~2048 = Overflow ~23 * ~32768 = Overflow ~23 * ~16384 = Overflow ~23 * ~8192 = Overflow ~23 * ~4096 = Overflow ~23 * ~2048 = Overflow ~22 * ~32768 = Overflow ~22 * ~16384 = Overflow ~22 * ~8192 = Overflow ~22 * ~4096 = Overflow ~22 * ~2048 = Overflow ~21 * ~32768 = Overflow ~21 * ~16384 = Overflow ~21 * ~8192 = Overflow ~21 * ~4096 = Overflow ~21 * ~2048 = Overflow ~20 * ~32768 = Overflow ~20 * ~16384 = Overflow ~20 * ~8192 = Overflow ~20 * ~4096 = Overflow ~20 * ~2048 = Overflow ~19 * ~32768 = Overflow ~19 * ~16384 = Overflow ~19 * ~8192 = Overflow ~19 * ~4096 = Overflow ~19 * ~2048 = Overflow ~18 * ~32768 = Overflow ~18 * ~16384 = Overflow ~18 * ~8192 = Overflow ~18 * ~4096 = Overflow ~18 * ~2048 = Overflow ~17 * ~32768 = Overflow ~17 * ~16384 = Overflow ~17 * ~8192 = Overflow ~17 * ~4096 = Overflow ~17 * ~2048 = Overflow ~16 * ~32768 = Overflow ~16 * ~16384 = Overflow ~16 * ~8192 = Overflow ~16 * ~4096 = Overflow ~16 * ~2048 = Overflow ~15 * ~32768 = Overflow ~15 * ~16384 = Overflow ~15 * ~8192 = Overflow ~15 * ~4096 = Overflow ~15 * ~2048 = 30720 ~14 * ~32768 = Overflow ~14 * ~16384 = Overflow ~14 * ~8192 = Overflow ~14 * ~4096 = Overflow ~14 * ~2048 = 28672 ~13 * ~32768 = Overflow ~13 * ~16384 = Overflow ~13 * ~8192 = Overflow ~13 * ~4096 = Overflow ~13 * ~2048 = 26624 ~12 * ~32768 = Overflow ~12 * ~16384 = Overflow ~12 * ~8192 = Overflow ~12 * ~4096 = Overflow ~12 * ~2048 = 24576 ~11 * ~32768 = Overflow ~11 * ~16384 = Overflow ~11 * ~8192 = Overflow ~11 * ~4096 = Overflow ~11 * ~2048 = 22528 ~10 * ~32768 = Overflow ~10 * ~16384 = Overflow ~10 * ~8192 = Overflow ~10 * ~4096 = Overflow ~10 * ~2048 = 20480 ~9 * ~32768 = Overflow ~9 * ~16384 = Overflow ~9 * ~8192 = Overflow ~9 * ~4096 = Overflow ~9 * ~2048 = 18432 ~8 * ~32768 = Overflow ~8 * ~16384 = Overflow ~8 * ~8192 = Overflow ~8 * ~4096 = Overflow ~8 * ~2048 = 16384 ~7 * ~32768 = Overflow ~7 * ~16384 = Overflow ~7 * ~8192 = Overflow ~7 * ~4096 = 28672 ~7 * ~2048 = 14336 ~6 * ~32768 = Overflow ~6 * ~16384 = Overflow ~6 * ~8192 = Overflow ~6 * ~4096 = 24576 ~6 * ~2048 = 12288 ~5 * ~32768 = Overflow ~5 * ~16384 = Overflow ~5 * ~8192 = Overflow ~5 * ~4096 = 20480 ~5 * ~2048 = 10240 ~4 * ~32768 = Overflow ~4 * ~16384 = Overflow ~4 * ~8192 = Overflow ~4 * ~4096 = 16384 ~4 * ~2048 = 8192 ~3 * ~32768 = Overflow ~3 * ~16384 = Overflow ~3 * ~8192 = 24576 ~3 * ~4096 = 12288 ~3 * ~2048 = 6144 ~2 * ~32768 = Overflow ~2 * ~16384 = Overflow ~2 * ~8192 = 16384 ~2 * ~4096 = 8192 ~2 * ~2048 = 4096 ~1 * ~32768 = Overflow ~1 * ~16384 = 16384 ~1 * ~8192 = 8192 ~1 * ~4096 = 4096 ~1 * ~2048 = 2048 0 * ~32768 = 0 0 * ~16384 = 0 0 * ~8192 = 0 0 * ~4096 = 0 0 * ~2048 = 0 1 * ~32768 = ~32768 1 * ~16384 = ~16384 1 * ~8192 = ~8192 1 * ~4096 = ~4096 1 * ~2048 = ~2048 2 * ~32768 = Overflow 2 * ~16384 = ~32768 2 * ~8192 = ~16384 2 * ~4096 = ~8192 2 * ~2048 = ~4096 3 * ~32768 = Overflow 3 * ~16384 = Overflow 3 * ~8192 = ~24576 3 * ~4096 = ~12288 3 * ~2048 = ~6144 4 * ~32768 = Overflow 4 * ~16384 = Overflow 4 * ~8192 = ~32768 4 * ~4096 = ~16384 4 * ~2048 = ~8192 5 * ~32768 = Overflow 5 * ~16384 = Overflow 5 * ~8192 = Overflow 5 * ~4096 = ~20480 5 * ~2048 = ~10240 6 * ~32768 = Overflow 6 * ~16384 = Overflow 6 * ~8192 = Overflow 6 * ~4096 = ~24576 6 * ~2048 = ~12288 7 * ~32768 = Overflow 7 * ~16384 = Overflow 7 * ~8192 = Overflow 7 * ~4096 = ~28672 7 * ~2048 = ~14336 8 * ~32768 = Overflow 8 * ~16384 = Overflow 8 * ~8192 = Overflow 8 * ~4096 = ~32768 8 * ~2048 = ~16384 9 * ~32768 = Overflow 9 * ~16384 = Overflow 9 * ~8192 = Overflow 9 * ~4096 = Overflow 9 * ~2048 = ~18432 10 * ~32768 = Overflow 10 * ~16384 = Overflow 10 * ~8192 = Overflow 10 * ~4096 = Overflow 10 * ~2048 = ~20480 11 * ~32768 = Overflow 11 * ~16384 = Overflow 11 * ~8192 = Overflow 11 * ~4096 = Overflow 11 * ~2048 = ~22528 12 * ~32768 = Overflow 12 * ~16384 = Overflow 12 * ~8192 = Overflow 12 * ~4096 = Overflow 12 * ~2048 = ~24576 13 * ~32768 = Overflow 13 * ~16384 = Overflow 13 * ~8192 = Overflow 13 * ~4096 = Overflow 13 * ~2048 = ~26624 14 * ~32768 = Overflow 14 * ~16384 = Overflow 14 * ~8192 = Overflow 14 * ~4096 = Overflow 14 * ~2048 = ~28672 15 * ~32768 = Overflow 15 * ~16384 = Overflow 15 * ~8192 = Overflow 15 * ~4096 = Overflow 15 * ~2048 = ~30720 16 * ~32768 = Overflow 16 * ~16384 = Overflow 16 * ~8192 = Overflow 16 * ~4096 = Overflow 16 * ~2048 = ~32768 17 * ~32768 = Overflow 17 * ~16384 = Overflow 17 * ~8192 = Overflow 17 * ~4096 = Overflow 17 * ~2048 = Overflow 18 * ~32768 = Overflow 18 * ~16384 = Overflow 18 * ~8192 = Overflow 18 * ~4096 = Overflow 18 * ~2048 = Overflow 19 * ~32768 = Overflow 19 * ~16384 = Overflow 19 * ~8192 = Overflow 19 * ~4096 = Overflow 19 * ~2048 = Overflow 20 * ~32768 = Overflow 20 * ~16384 = Overflow 20 * ~8192 = Overflow 20 * ~4096 = Overflow 20 * ~2048 = Overflow 21 * ~32768 = Overflow 21 * ~16384 = Overflow 21 * ~8192 = Overflow 21 * ~4096 = Overflow 21 * ~2048 = Overflow 22 * ~32768 = Overflow 22 * ~16384 = Overflow 22 * ~8192 = Overflow 22 * ~4096 = Overflow 22 * ~2048 = Overflow 23 * ~32768 = Overflow 23 * ~16384 = Overflow 23 * ~8192 = Overflow 23 * ~4096 = Overflow 23 * ~2048 = Overflow 24 * ~32768 = Overflow 24 * ~16384 = Overflow 24 * ~8192 = Overflow 24 * ~4096 = Overflow 24 * ~2048 = Overflow 25 * ~32768 = Overflow 25 * ~16384 = Overflow 25 * ~8192 = Overflow 25 * ~4096 = Overflow 25 * ~2048 = Overflow 26 * ~32768 = Overflow 26 * ~16384 = Overflow 26 * ~8192 = Overflow 26 * ~4096 = Overflow 26 * ~2048 = Overflow 27 * ~32768 = Overflow 27 * ~16384 = Overflow 27 * ~8192 = Overflow 27 * ~4096 = Overflow 27 * ~2048 = Overflow 28 * ~32768 = Overflow 28 * ~16384 = Overflow 28 * ~8192 = Overflow 28 * ~4096 = Overflow 28 * ~2048 = Overflow 29 * ~32768 = Overflow 29 * ~16384 = Overflow 29 * ~8192 = Overflow 29 * ~4096 = Overflow 29 * ~2048 = Overflow 30 * ~32768 = Overflow 30 * ~16384 = Overflow 30 * ~8192 = Overflow 30 * ~4096 = Overflow 30 * ~2048 = Overflow 31 * ~32768 = Overflow 31 * ~16384 = Overflow 31 * ~8192 = Overflow 31 * ~4096 = Overflow 31 * ~2048 = Overflow 32 * ~32768 = Overflow 32 * ~16384 = Overflow 32 * ~8192 = Overflow 32 * ~4096 = Overflow 32 * ~2048 = Overflow ~32768 * 1 = ~32768 ~32768 * 2 = Overflow ~32768 * 4 = Overflow ~32768 * 8 = Overflow ~32768 * 16 = Overflow ~16384 * 1 = ~16384 ~16384 * 2 = ~32768 ~16384 * 4 = Overflow ~16384 * 8 = Overflow ~16384 * 16 = Overflow ~8192 * 1 = ~8192 ~8192 * 2 = ~16384 ~8192 * 4 = ~32768 ~8192 * 8 = Overflow ~8192 * 16 = Overflow ~4096 * 1 = ~4096 ~4096 * 2 = ~8192 ~4096 * 4 = ~16384 ~4096 * 8 = ~32768 ~4096 * 16 = Overflow ~2048 * 1 = ~2048 ~2048 * 2 = ~4096 ~2048 * 4 = ~8192 ~2048 * 8 = ~16384 ~2048 * 16 = ~32768 ~1024 * 1 = ~1024 ~1024 * 2 = ~2048 ~1024 * 4 = ~4096 ~1024 * 8 = ~8192 ~1024 * 16 = ~16384 ~4 * 1 = ~4 ~4 * 2 = ~8 ~4 * 4 = ~16 ~4 * 8 = ~32 ~4 * 16 = ~64 ~3 * 1 = ~3 ~3 * 2 = ~6 ~3 * 4 = ~12 ~3 * 8 = ~24 ~3 * 16 = ~48 ~2 * 1 = ~2 ~2 * 2 = ~4 ~2 * 4 = ~8 ~2 * 8 = ~16 ~2 * 16 = ~32 ~1 * 1 = ~1 ~1 * 2 = ~2 ~1 * 4 = ~4 ~1 * 8 = ~8 ~1 * 16 = ~16 0 * 1 = 0 0 * 2 = 0 0 * 4 = 0 0 * 8 = 0 0 * 16 = 0 1 * 1 = 1 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 1 * 16 = 16 2 * 1 = 2 2 * 2 = 4 2 * 4 = 8 2 * 8 = 16 2 * 16 = 32 3 * 1 = 3 3 * 2 = 6 3 * 4 = 12 3 * 8 = 24 3 * 16 = 48 4 * 1 = 4 4 * 2 = 8 4 * 4 = 16 4 * 8 = 32 4 * 16 = 64 512 * 1 = 512 512 * 2 = 1024 512 * 4 = 2048 512 * 8 = 4096 512 * 16 = 8192 1024 * 1 = 1024 1024 * 2 = 2048 1024 * 4 = 4096 1024 * 8 = 8192 1024 * 16 = 16384 2048 * 1 = 2048 2048 * 2 = 4096 2048 * 4 = 8192 2048 * 8 = 16384 2048 * 16 = Overflow 4096 * 1 = 4096 4096 * 2 = 8192 4096 * 4 = 16384 4096 * 8 = Overflow 4096 * 16 = Overflow 8192 * 1 = 8192 8192 * 2 = 16384 8192 * 4 = Overflow 8192 * 8 = Overflow 8192 * 16 = Overflow 16384 * 1 = 16384 16384 * 2 = Overflow 16384 * 4 = Overflow 16384 * 8 = Overflow 16384 * 16 = Overflow ~32768 * ~1 = Overflow ~32768 * ~2 = Overflow ~32768 * ~4 = Overflow ~32768 * ~8 = Overflow ~32768 * ~16 = Overflow ~16384 * ~1 = 16384 ~16384 * ~2 = Overflow ~16384 * ~4 = Overflow ~16384 * ~8 = Overflow ~16384 * ~16 = Overflow ~8192 * ~1 = 8192 ~8192 * ~2 = 16384 ~8192 * ~4 = Overflow ~8192 * ~8 = Overflow ~8192 * ~16 = Overflow ~4096 * ~1 = 4096 ~4096 * ~2 = 8192 ~4096 * ~4 = 16384 ~4096 * ~8 = Overflow ~4096 * ~16 = Overflow ~2048 * ~1 = 2048 ~2048 * ~2 = 4096 ~2048 * ~4 = 8192 ~2048 * ~8 = 16384 ~2048 * ~16 = Overflow ~1024 * ~1 = 1024 ~1024 * ~2 = 2048 ~1024 * ~4 = 4096 ~1024 * ~8 = 8192 ~1024 * ~16 = 16384 ~4 * ~1 = 4 ~4 * ~2 = 8 ~4 * ~4 = 16 ~4 * ~8 = 32 ~4 * ~16 = 64 ~3 * ~1 = 3 ~3 * ~2 = 6 ~3 * ~4 = 12 ~3 * ~8 = 24 ~3 * ~16 = 48 ~2 * ~1 = 2 ~2 * ~2 = 4 ~2 * ~4 = 8 ~2 * ~8 = 16 ~2 * ~16 = 32 ~1 * ~1 = 1 ~1 * ~2 = 2 ~1 * ~4 = 4 ~1 * ~8 = 8 ~1 * ~16 = 16 0 * ~1 = 0 0 * ~2 = 0 0 * ~4 = 0 0 * ~8 = 0 0 * ~16 = 0 1 * ~1 = ~1 1 * ~2 = ~2 1 * ~4 = ~4 1 * ~8 = ~8 1 * ~16 = ~16 2 * ~1 = ~2 2 * ~2 = ~4 2 * ~4 = ~8 2 * ~8 = ~16 2 * ~16 = ~32 3 * ~1 = ~3 3 * ~2 = ~6 3 * ~4 = ~12 3 * ~8 = ~24 3 * ~16 = ~48 4 * ~1 = ~4 4 * ~2 = ~8 4 * ~4 = ~16 4 * ~8 = ~32 4 * ~16 = ~64 512 * ~1 = ~512 512 * ~2 = ~1024 512 * ~4 = ~2048 512 * ~8 = ~4096 512 * ~16 = ~8192 1024 * ~1 = ~1024 1024 * ~2 = ~2048 1024 * ~4 = ~4096 1024 * ~8 = ~8192 1024 * ~16 = ~16384 2048 * ~1 = ~2048 2048 * ~2 = ~4096 2048 * ~4 = ~8192 2048 * ~8 = ~16384 2048 * ~16 = ~32768 4096 * ~1 = ~4096 4096 * ~2 = ~8192 4096 * ~4 = ~16384 4096 * ~8 = ~32768 4096 * ~16 = Overflow 8192 * ~1 = ~8192 8192 * ~2 = ~16384 8192 * ~4 = ~32768 8192 * ~8 = Overflow 8192 * ~16 = Overflow 16384 * ~1 = ~16384 16384 * ~2 = ~32768 16384 * ~4 = Overflow 16384 * ~8 = Overflow 16384 * ~16 = Overflow ~32 * 1073741824 = Overflow ~32 * 536870912 = Overflow ~32 * 268435456 = Overflow ~32 * 134217728 = Overflow ~32 * 67108864 = ~2147483648 ~31 * 1073741824 = Overflow ~31 * 536870912 = Overflow ~31 * 268435456 = Overflow ~31 * 134217728 = Overflow ~31 * 67108864 = ~2080374784 ~30 * 1073741824 = Overflow ~30 * 536870912 = Overflow ~30 * 268435456 = Overflow ~30 * 134217728 = Overflow ~30 * 67108864 = ~2013265920 ~29 * 1073741824 = Overflow ~29 * 536870912 = Overflow ~29 * 268435456 = Overflow ~29 * 134217728 = Overflow ~29 * 67108864 = ~1946157056 ~28 * 1073741824 = Overflow ~28 * 536870912 = Overflow ~28 * 268435456 = Overflow ~28 * 134217728 = Overflow ~28 * 67108864 = ~1879048192 ~27 * 1073741824 = Overflow ~27 * 536870912 = Overflow ~27 * 268435456 = Overflow ~27 * 134217728 = Overflow ~27 * 67108864 = ~1811939328 ~26 * 1073741824 = Overflow ~26 * 536870912 = Overflow ~26 * 268435456 = Overflow ~26 * 134217728 = Overflow ~26 * 67108864 = ~1744830464 ~25 * 1073741824 = Overflow ~25 * 536870912 = Overflow ~25 * 268435456 = Overflow ~25 * 134217728 = Overflow ~25 * 67108864 = ~1677721600 ~24 * 1073741824 = Overflow ~24 * 536870912 = Overflow ~24 * 268435456 = Overflow ~24 * 134217728 = Overflow ~24 * 67108864 = ~1610612736 ~23 * 1073741824 = Overflow ~23 * 536870912 = Overflow ~23 * 268435456 = Overflow ~23 * 134217728 = Overflow ~23 * 67108864 = ~1543503872 ~22 * 1073741824 = Overflow ~22 * 536870912 = Overflow ~22 * 268435456 = Overflow ~22 * 134217728 = Overflow ~22 * 67108864 = ~1476395008 ~21 * 1073741824 = Overflow ~21 * 536870912 = Overflow ~21 * 268435456 = Overflow ~21 * 134217728 = Overflow ~21 * 67108864 = ~1409286144 ~20 * 1073741824 = Overflow ~20 * 536870912 = Overflow ~20 * 268435456 = Overflow ~20 * 134217728 = Overflow ~20 * 67108864 = ~1342177280 ~19 * 1073741824 = Overflow ~19 * 536870912 = Overflow ~19 * 268435456 = Overflow ~19 * 134217728 = Overflow ~19 * 67108864 = ~1275068416 ~18 * 1073741824 = Overflow ~18 * 536870912 = Overflow ~18 * 268435456 = Overflow ~18 * 134217728 = Overflow ~18 * 67108864 = ~1207959552 ~17 * 1073741824 = Overflow ~17 * 536870912 = Overflow ~17 * 268435456 = Overflow ~17 * 134217728 = Overflow ~17 * 67108864 = ~1140850688 ~16 * 1073741824 = Overflow ~16 * 536870912 = Overflow ~16 * 268435456 = Overflow ~16 * 134217728 = ~2147483648 ~16 * 67108864 = ~1073741824 ~15 * 1073741824 = Overflow ~15 * 536870912 = Overflow ~15 * 268435456 = Overflow ~15 * 134217728 = ~2013265920 ~15 * 67108864 = ~1006632960 ~14 * 1073741824 = Overflow ~14 * 536870912 = Overflow ~14 * 268435456 = Overflow ~14 * 134217728 = ~1879048192 ~14 * 67108864 = ~939524096 ~13 * 1073741824 = Overflow ~13 * 536870912 = Overflow ~13 * 268435456 = Overflow ~13 * 134217728 = ~1744830464 ~13 * 67108864 = ~872415232 ~12 * 1073741824 = Overflow ~12 * 536870912 = Overflow ~12 * 268435456 = Overflow ~12 * 134217728 = ~1610612736 ~12 * 67108864 = ~805306368 ~11 * 1073741824 = Overflow ~11 * 536870912 = Overflow ~11 * 268435456 = Overflow ~11 * 134217728 = ~1476395008 ~11 * 67108864 = ~738197504 ~10 * 1073741824 = Overflow ~10 * 536870912 = Overflow ~10 * 268435456 = Overflow ~10 * 134217728 = ~1342177280 ~10 * 67108864 = ~671088640 ~9 * 1073741824 = Overflow ~9 * 536870912 = Overflow ~9 * 268435456 = Overflow ~9 * 134217728 = ~1207959552 ~9 * 67108864 = ~603979776 ~8 * 1073741824 = Overflow ~8 * 536870912 = Overflow ~8 * 268435456 = ~2147483648 ~8 * 134217728 = ~1073741824 ~8 * 67108864 = ~536870912 ~7 * 1073741824 = Overflow ~7 * 536870912 = Overflow ~7 * 268435456 = ~1879048192 ~7 * 134217728 = ~939524096 ~7 * 67108864 = ~469762048 ~6 * 1073741824 = Overflow ~6 * 536870912 = Overflow ~6 * 268435456 = ~1610612736 ~6 * 134217728 = ~805306368 ~6 * 67108864 = ~402653184 ~5 * 1073741824 = Overflow ~5 * 536870912 = Overflow ~5 * 268435456 = ~1342177280 ~5 * 134217728 = ~671088640 ~5 * 67108864 = ~335544320 ~4 * 1073741824 = Overflow ~4 * 536870912 = ~2147483648 ~4 * 268435456 = ~1073741824 ~4 * 134217728 = ~536870912 ~4 * 67108864 = ~268435456 ~3 * 1073741824 = Overflow ~3 * 536870912 = ~1610612736 ~3 * 268435456 = ~805306368 ~3 * 134217728 = ~402653184 ~3 * 67108864 = ~201326592 ~2 * 1073741824 = ~2147483648 ~2 * 536870912 = ~1073741824 ~2 * 268435456 = ~536870912 ~2 * 134217728 = ~268435456 ~2 * 67108864 = ~134217728 ~1 * 1073741824 = ~1073741824 ~1 * 536870912 = ~536870912 ~1 * 268435456 = ~268435456 ~1 * 134217728 = ~134217728 ~1 * 67108864 = ~67108864 0 * 1073741824 = 0 0 * 536870912 = 0 0 * 268435456 = 0 0 * 134217728 = 0 0 * 67108864 = 0 1 * 1073741824 = 1073741824 1 * 536870912 = 536870912 1 * 268435456 = 268435456 1 * 134217728 = 134217728 1 * 67108864 = 67108864 2 * 1073741824 = Overflow 2 * 536870912 = 1073741824 2 * 268435456 = 536870912 2 * 134217728 = 268435456 2 * 67108864 = 134217728 3 * 1073741824 = Overflow 3 * 536870912 = 1610612736 3 * 268435456 = 805306368 3 * 134217728 = 402653184 3 * 67108864 = 201326592 4 * 1073741824 = Overflow 4 * 536870912 = Overflow 4 * 268435456 = 1073741824 4 * 134217728 = 536870912 4 * 67108864 = 268435456 5 * 1073741824 = Overflow 5 * 536870912 = Overflow 5 * 268435456 = 1342177280 5 * 134217728 = 671088640 5 * 67108864 = 335544320 6 * 1073741824 = Overflow 6 * 536870912 = Overflow 6 * 268435456 = 1610612736 6 * 134217728 = 805306368 6 * 67108864 = 402653184 7 * 1073741824 = Overflow 7 * 536870912 = Overflow 7 * 268435456 = 1879048192 7 * 134217728 = 939524096 7 * 67108864 = 469762048 8 * 1073741824 = Overflow 8 * 536870912 = Overflow 8 * 268435456 = Overflow 8 * 134217728 = 1073741824 8 * 67108864 = 536870912 9 * 1073741824 = Overflow 9 * 536870912 = Overflow 9 * 268435456 = Overflow 9 * 134217728 = 1207959552 9 * 67108864 = 603979776 10 * 1073741824 = Overflow 10 * 536870912 = Overflow 10 * 268435456 = Overflow 10 * 134217728 = 1342177280 10 * 67108864 = 671088640 11 * 1073741824 = Overflow 11 * 536870912 = Overflow 11 * 268435456 = Overflow 11 * 134217728 = 1476395008 11 * 67108864 = 738197504 12 * 1073741824 = Overflow 12 * 536870912 = Overflow 12 * 268435456 = Overflow 12 * 134217728 = 1610612736 12 * 67108864 = 805306368 13 * 1073741824 = Overflow 13 * 536870912 = Overflow 13 * 268435456 = Overflow 13 * 134217728 = 1744830464 13 * 67108864 = 872415232 14 * 1073741824 = Overflow 14 * 536870912 = Overflow 14 * 268435456 = Overflow 14 * 134217728 = 1879048192 14 * 67108864 = 939524096 15 * 1073741824 = Overflow 15 * 536870912 = Overflow 15 * 268435456 = Overflow 15 * 134217728 = 2013265920 15 * 67108864 = 1006632960 16 * 1073741824 = Overflow 16 * 536870912 = Overflow 16 * 268435456 = Overflow 16 * 134217728 = Overflow 16 * 67108864 = 1073741824 17 * 1073741824 = Overflow 17 * 536870912 = Overflow 17 * 268435456 = Overflow 17 * 134217728 = Overflow 17 * 67108864 = 1140850688 18 * 1073741824 = Overflow 18 * 536870912 = Overflow 18 * 268435456 = Overflow 18 * 134217728 = Overflow 18 * 67108864 = 1207959552 19 * 1073741824 = Overflow 19 * 536870912 = Overflow 19 * 268435456 = Overflow 19 * 134217728 = Overflow 19 * 67108864 = 1275068416 20 * 1073741824 = Overflow 20 * 536870912 = Overflow 20 * 268435456 = Overflow 20 * 134217728 = Overflow 20 * 67108864 = 1342177280 21 * 1073741824 = Overflow 21 * 536870912 = Overflow 21 * 268435456 = Overflow 21 * 134217728 = Overflow 21 * 67108864 = 1409286144 22 * 1073741824 = Overflow 22 * 536870912 = Overflow 22 * 268435456 = Overflow 22 * 134217728 = Overflow 22 * 67108864 = 1476395008 23 * 1073741824 = Overflow 23 * 536870912 = Overflow 23 * 268435456 = Overflow 23 * 134217728 = Overflow 23 * 67108864 = 1543503872 24 * 1073741824 = Overflow 24 * 536870912 = Overflow 24 * 268435456 = Overflow 24 * 134217728 = Overflow 24 * 67108864 = 1610612736 25 * 1073741824 = Overflow 25 * 536870912 = Overflow 25 * 268435456 = Overflow 25 * 134217728 = Overflow 25 * 67108864 = 1677721600 26 * 1073741824 = Overflow 26 * 536870912 = Overflow 26 * 268435456 = Overflow 26 * 134217728 = Overflow 26 * 67108864 = 1744830464 27 * 1073741824 = Overflow 27 * 536870912 = Overflow 27 * 268435456 = Overflow 27 * 134217728 = Overflow 27 * 67108864 = 1811939328 28 * 1073741824 = Overflow 28 * 536870912 = Overflow 28 * 268435456 = Overflow 28 * 134217728 = Overflow 28 * 67108864 = 1879048192 29 * 1073741824 = Overflow 29 * 536870912 = Overflow 29 * 268435456 = Overflow 29 * 134217728 = Overflow 29 * 67108864 = 1946157056 30 * 1073741824 = Overflow 30 * 536870912 = Overflow 30 * 268435456 = Overflow 30 * 134217728 = Overflow 30 * 67108864 = 2013265920 31 * 1073741824 = Overflow 31 * 536870912 = Overflow 31 * 268435456 = Overflow 31 * 134217728 = Overflow 31 * 67108864 = 2080374784 32 * 1073741824 = Overflow 32 * 536870912 = Overflow 32 * 268435456 = Overflow 32 * 134217728 = Overflow 32 * 67108864 = Overflow ~32 * ~2147483648 = Overflow ~32 * ~1073741824 = Overflow ~32 * ~536870912 = Overflow ~32 * ~268435456 = Overflow ~32 * ~134217728 = Overflow ~31 * ~2147483648 = Overflow ~31 * ~1073741824 = Overflow ~31 * ~536870912 = Overflow ~31 * ~268435456 = Overflow ~31 * ~134217728 = Overflow ~30 * ~2147483648 = Overflow ~30 * ~1073741824 = Overflow ~30 * ~536870912 = Overflow ~30 * ~268435456 = Overflow ~30 * ~134217728 = Overflow ~29 * ~2147483648 = Overflow ~29 * ~1073741824 = Overflow ~29 * ~536870912 = Overflow ~29 * ~268435456 = Overflow ~29 * ~134217728 = Overflow ~28 * ~2147483648 = Overflow ~28 * ~1073741824 = Overflow ~28 * ~536870912 = Overflow ~28 * ~268435456 = Overflow ~28 * ~134217728 = Overflow ~27 * ~2147483648 = Overflow ~27 * ~1073741824 = Overflow ~27 * ~536870912 = Overflow ~27 * ~268435456 = Overflow ~27 * ~134217728 = Overflow ~26 * ~2147483648 = Overflow ~26 * ~1073741824 = Overflow ~26 * ~536870912 = Overflow ~26 * ~268435456 = Overflow ~26 * ~134217728 = Overflow ~25 * ~2147483648 = Overflow ~25 * ~1073741824 = Overflow ~25 * ~536870912 = Overflow ~25 * ~268435456 = Overflow ~25 * ~134217728 = Overflow ~24 * ~2147483648 = Overflow ~24 * ~1073741824 = Overflow ~24 * ~536870912 = Overflow ~24 * ~268435456 = Overflow ~24 * ~134217728 = Overflow ~23 * ~2147483648 = Overflow ~23 * ~1073741824 = Overflow ~23 * ~536870912 = Overflow ~23 * ~268435456 = Overflow ~23 * ~134217728 = Overflow ~22 * ~2147483648 = Overflow ~22 * ~1073741824 = Overflow ~22 * ~536870912 = Overflow ~22 * ~268435456 = Overflow ~22 * ~134217728 = Overflow ~21 * ~2147483648 = Overflow ~21 * ~1073741824 = Overflow ~21 * ~536870912 = Overflow ~21 * ~268435456 = Overflow ~21 * ~134217728 = Overflow ~20 * ~2147483648 = Overflow ~20 * ~1073741824 = Overflow ~20 * ~536870912 = Overflow ~20 * ~268435456 = Overflow ~20 * ~134217728 = Overflow ~19 * ~2147483648 = Overflow ~19 * ~1073741824 = Overflow ~19 * ~536870912 = Overflow ~19 * ~268435456 = Overflow ~19 * ~134217728 = Overflow ~18 * ~2147483648 = Overflow ~18 * ~1073741824 = Overflow ~18 * ~536870912 = Overflow ~18 * ~268435456 = Overflow ~18 * ~134217728 = Overflow ~17 * ~2147483648 = Overflow ~17 * ~1073741824 = Overflow ~17 * ~536870912 = Overflow ~17 * ~268435456 = Overflow ~17 * ~134217728 = Overflow ~16 * ~2147483648 = Overflow ~16 * ~1073741824 = Overflow ~16 * ~536870912 = Overflow ~16 * ~268435456 = Overflow ~16 * ~134217728 = Overflow ~15 * ~2147483648 = Overflow ~15 * ~1073741824 = Overflow ~15 * ~536870912 = Overflow ~15 * ~268435456 = Overflow ~15 * ~134217728 = 2013265920 ~14 * ~2147483648 = Overflow ~14 * ~1073741824 = Overflow ~14 * ~536870912 = Overflow ~14 * ~268435456 = Overflow ~14 * ~134217728 = 1879048192 ~13 * ~2147483648 = Overflow ~13 * ~1073741824 = Overflow ~13 * ~536870912 = Overflow ~13 * ~268435456 = Overflow ~13 * ~134217728 = 1744830464 ~12 * ~2147483648 = Overflow ~12 * ~1073741824 = Overflow ~12 * ~536870912 = Overflow ~12 * ~268435456 = Overflow ~12 * ~134217728 = 1610612736 ~11 * ~2147483648 = Overflow ~11 * ~1073741824 = Overflow ~11 * ~536870912 = Overflow ~11 * ~268435456 = Overflow ~11 * ~134217728 = 1476395008 ~10 * ~2147483648 = Overflow ~10 * ~1073741824 = Overflow ~10 * ~536870912 = Overflow ~10 * ~268435456 = Overflow ~10 * ~134217728 = 1342177280 ~9 * ~2147483648 = Overflow ~9 * ~1073741824 = Overflow ~9 * ~536870912 = Overflow ~9 * ~268435456 = Overflow ~9 * ~134217728 = 1207959552 ~8 * ~2147483648 = Overflow ~8 * ~1073741824 = Overflow ~8 * ~536870912 = Overflow ~8 * ~268435456 = Overflow ~8 * ~134217728 = 1073741824 ~7 * ~2147483648 = Overflow ~7 * ~1073741824 = Overflow ~7 * ~536870912 = Overflow ~7 * ~268435456 = 1879048192 ~7 * ~134217728 = 939524096 ~6 * ~2147483648 = Overflow ~6 * ~1073741824 = Overflow ~6 * ~536870912 = Overflow ~6 * ~268435456 = 1610612736 ~6 * ~134217728 = 805306368 ~5 * ~2147483648 = Overflow ~5 * ~1073741824 = Overflow ~5 * ~536870912 = Overflow ~5 * ~268435456 = 1342177280 ~5 * ~134217728 = 671088640 ~4 * ~2147483648 = Overflow ~4 * ~1073741824 = Overflow ~4 * ~536870912 = Overflow ~4 * ~268435456 = 1073741824 ~4 * ~134217728 = 536870912 ~3 * ~2147483648 = Overflow ~3 * ~1073741824 = Overflow ~3 * ~536870912 = 1610612736 ~3 * ~268435456 = 805306368 ~3 * ~134217728 = 402653184 ~2 * ~2147483648 = Overflow ~2 * ~1073741824 = Overflow ~2 * ~536870912 = 1073741824 ~2 * ~268435456 = 536870912 ~2 * ~134217728 = 268435456 ~1 * ~2147483648 = Overflow ~1 * ~1073741824 = 1073741824 ~1 * ~536870912 = 536870912 ~1 * ~268435456 = 268435456 ~1 * ~134217728 = 134217728 0 * ~2147483648 = 0 0 * ~1073741824 = 0 0 * ~536870912 = 0 0 * ~268435456 = 0 0 * ~134217728 = 0 1 * ~2147483648 = ~2147483648 1 * ~1073741824 = ~1073741824 1 * ~536870912 = ~536870912 1 * ~268435456 = ~268435456 1 * ~134217728 = ~134217728 2 * ~2147483648 = Overflow 2 * ~1073741824 = ~2147483648 2 * ~536870912 = ~1073741824 2 * ~268435456 = ~536870912 2 * ~134217728 = ~268435456 3 * ~2147483648 = Overflow 3 * ~1073741824 = Overflow 3 * ~536870912 = ~1610612736 3 * ~268435456 = ~805306368 3 * ~134217728 = ~402653184 4 * ~2147483648 = Overflow 4 * ~1073741824 = Overflow 4 * ~536870912 = ~2147483648 4 * ~268435456 = ~1073741824 4 * ~134217728 = ~536870912 5 * ~2147483648 = Overflow 5 * ~1073741824 = Overflow 5 * ~536870912 = Overflow 5 * ~268435456 = ~1342177280 5 * ~134217728 = ~671088640 6 * ~2147483648 = Overflow 6 * ~1073741824 = Overflow 6 * ~536870912 = Overflow 6 * ~268435456 = ~1610612736 6 * ~134217728 = ~805306368 7 * ~2147483648 = Overflow 7 * ~1073741824 = Overflow 7 * ~536870912 = Overflow 7 * ~268435456 = ~1879048192 7 * ~134217728 = ~939524096 8 * ~2147483648 = Overflow 8 * ~1073741824 = Overflow 8 * ~536870912 = Overflow 8 * ~268435456 = ~2147483648 8 * ~134217728 = ~1073741824 9 * ~2147483648 = Overflow 9 * ~1073741824 = Overflow 9 * ~536870912 = Overflow 9 * ~268435456 = Overflow 9 * ~134217728 = ~1207959552 10 * ~2147483648 = Overflow 10 * ~1073741824 = Overflow 10 * ~536870912 = Overflow 10 * ~268435456 = Overflow 10 * ~134217728 = ~1342177280 11 * ~2147483648 = Overflow 11 * ~1073741824 = Overflow 11 * ~536870912 = Overflow 11 * ~268435456 = Overflow 11 * ~134217728 = ~1476395008 12 * ~2147483648 = Overflow 12 * ~1073741824 = Overflow 12 * ~536870912 = Overflow 12 * ~268435456 = Overflow 12 * ~134217728 = ~1610612736 13 * ~2147483648 = Overflow 13 * ~1073741824 = Overflow 13 * ~536870912 = Overflow 13 * ~268435456 = Overflow 13 * ~134217728 = ~1744830464 14 * ~2147483648 = Overflow 14 * ~1073741824 = Overflow 14 * ~536870912 = Overflow 14 * ~268435456 = Overflow 14 * ~134217728 = ~1879048192 15 * ~2147483648 = Overflow 15 * ~1073741824 = Overflow 15 * ~536870912 = Overflow 15 * ~268435456 = Overflow 15 * ~134217728 = ~2013265920 16 * ~2147483648 = Overflow 16 * ~1073741824 = Overflow 16 * ~536870912 = Overflow 16 * ~268435456 = Overflow 16 * ~134217728 = ~2147483648 17 * ~2147483648 = Overflow 17 * ~1073741824 = Overflow 17 * ~536870912 = Overflow 17 * ~268435456 = Overflow 17 * ~134217728 = Overflow 18 * ~2147483648 = Overflow 18 * ~1073741824 = Overflow 18 * ~536870912 = Overflow 18 * ~268435456 = Overflow 18 * ~134217728 = Overflow 19 * ~2147483648 = Overflow 19 * ~1073741824 = Overflow 19 * ~536870912 = Overflow 19 * ~268435456 = Overflow 19 * ~134217728 = Overflow 20 * ~2147483648 = Overflow 20 * ~1073741824 = Overflow 20 * ~536870912 = Overflow 20 * ~268435456 = Overflow 20 * ~134217728 = Overflow 21 * ~2147483648 = Overflow 21 * ~1073741824 = Overflow 21 * ~536870912 = Overflow 21 * ~268435456 = Overflow 21 * ~134217728 = Overflow 22 * ~2147483648 = Overflow 22 * ~1073741824 = Overflow 22 * ~536870912 = Overflow 22 * ~268435456 = Overflow 22 * ~134217728 = Overflow 23 * ~2147483648 = Overflow 23 * ~1073741824 = Overflow 23 * ~536870912 = Overflow 23 * ~268435456 = Overflow 23 * ~134217728 = Overflow 24 * ~2147483648 = Overflow 24 * ~1073741824 = Overflow 24 * ~536870912 = Overflow 24 * ~268435456 = Overflow 24 * ~134217728 = Overflow 25 * ~2147483648 = Overflow 25 * ~1073741824 = Overflow 25 * ~536870912 = Overflow 25 * ~268435456 = Overflow 25 * ~134217728 = Overflow 26 * ~2147483648 = Overflow 26 * ~1073741824 = Overflow 26 * ~536870912 = Overflow 26 * ~268435456 = Overflow 26 * ~134217728 = Overflow 27 * ~2147483648 = Overflow 27 * ~1073741824 = Overflow 27 * ~536870912 = Overflow 27 * ~268435456 = Overflow 27 * ~134217728 = Overflow 28 * ~2147483648 = Overflow 28 * ~1073741824 = Overflow 28 * ~536870912 = Overflow 28 * ~268435456 = Overflow 28 * ~134217728 = Overflow 29 * ~2147483648 = Overflow 29 * ~1073741824 = Overflow 29 * ~536870912 = Overflow 29 * ~268435456 = Overflow 29 * ~134217728 = Overflow 30 * ~2147483648 = Overflow 30 * ~1073741824 = Overflow 30 * ~536870912 = Overflow 30 * ~268435456 = Overflow 30 * ~134217728 = Overflow 31 * ~2147483648 = Overflow 31 * ~1073741824 = Overflow 31 * ~536870912 = Overflow 31 * ~268435456 = Overflow 31 * ~134217728 = Overflow 32 * ~2147483648 = Overflow 32 * ~1073741824 = Overflow 32 * ~536870912 = Overflow 32 * ~268435456 = Overflow 32 * ~134217728 = Overflow ~2147483648 * 1 = ~2147483648 ~2147483648 * 2 = Overflow ~2147483648 * 4 = Overflow ~2147483648 * 8 = Overflow ~2147483648 * 16 = Overflow ~1073741824 * 1 = ~1073741824 ~1073741824 * 2 = ~2147483648 ~1073741824 * 4 = Overflow ~1073741824 * 8 = Overflow ~1073741824 * 16 = Overflow ~536870912 * 1 = ~536870912 ~536870912 * 2 = ~1073741824 ~536870912 * 4 = ~2147483648 ~536870912 * 8 = Overflow ~536870912 * 16 = Overflow ~268435456 * 1 = ~268435456 ~268435456 * 2 = ~536870912 ~268435456 * 4 = ~1073741824 ~268435456 * 8 = ~2147483648 ~268435456 * 16 = Overflow ~134217728 * 1 = ~134217728 ~134217728 * 2 = ~268435456 ~134217728 * 4 = ~536870912 ~134217728 * 8 = ~1073741824 ~134217728 * 16 = ~2147483648 ~67108864 * 1 = ~67108864 ~67108864 * 2 = ~134217728 ~67108864 * 4 = ~268435456 ~67108864 * 8 = ~536870912 ~67108864 * 16 = ~1073741824 ~4 * 1 = ~4 ~4 * 2 = ~8 ~4 * 4 = ~16 ~4 * 8 = ~32 ~4 * 16 = ~64 ~3 * 1 = ~3 ~3 * 2 = ~6 ~3 * 4 = ~12 ~3 * 8 = ~24 ~3 * 16 = ~48 ~2 * 1 = ~2 ~2 * 2 = ~4 ~2 * 4 = ~8 ~2 * 8 = ~16 ~2 * 16 = ~32 ~1 * 1 = ~1 ~1 * 2 = ~2 ~1 * 4 = ~4 ~1 * 8 = ~8 ~1 * 16 = ~16 0 * 1 = 0 0 * 2 = 0 0 * 4 = 0 0 * 8 = 0 0 * 16 = 0 1 * 1 = 1 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 1 * 16 = 16 2 * 1 = 2 2 * 2 = 4 2 * 4 = 8 2 * 8 = 16 2 * 16 = 32 3 * 1 = 3 3 * 2 = 6 3 * 4 = 12 3 * 8 = 24 3 * 16 = 48 4 * 1 = 4 4 * 2 = 8 4 * 4 = 16 4 * 8 = 32 4 * 16 = 64 33554432 * 1 = 33554432 33554432 * 2 = 67108864 33554432 * 4 = 134217728 33554432 * 8 = 268435456 33554432 * 16 = 536870912 67108864 * 1 = 67108864 67108864 * 2 = 134217728 67108864 * 4 = 268435456 67108864 * 8 = 536870912 67108864 * 16 = 1073741824 134217728 * 1 = 134217728 134217728 * 2 = 268435456 134217728 * 4 = 536870912 134217728 * 8 = 1073741824 134217728 * 16 = Overflow 268435456 * 1 = 268435456 268435456 * 2 = 536870912 268435456 * 4 = 1073741824 268435456 * 8 = Overflow 268435456 * 16 = Overflow 536870912 * 1 = 536870912 536870912 * 2 = 1073741824 536870912 * 4 = Overflow 536870912 * 8 = Overflow 536870912 * 16 = Overflow 1073741824 * 1 = 1073741824 1073741824 * 2 = Overflow 1073741824 * 4 = Overflow 1073741824 * 8 = Overflow 1073741824 * 16 = Overflow ~2147483648 * ~1 = Overflow ~2147483648 * ~2 = Overflow ~2147483648 * ~4 = Overflow ~2147483648 * ~8 = Overflow ~2147483648 * ~16 = Overflow ~1073741824 * ~1 = 1073741824 ~1073741824 * ~2 = Overflow ~1073741824 * ~4 = Overflow ~1073741824 * ~8 = Overflow ~1073741824 * ~16 = Overflow ~536870912 * ~1 = 536870912 ~536870912 * ~2 = 1073741824 ~536870912 * ~4 = Overflow ~536870912 * ~8 = Overflow ~536870912 * ~16 = Overflow ~268435456 * ~1 = 268435456 ~268435456 * ~2 = 536870912 ~268435456 * ~4 = 1073741824 ~268435456 * ~8 = Overflow ~268435456 * ~16 = Overflow ~134217728 * ~1 = 134217728 ~134217728 * ~2 = 268435456 ~134217728 * ~4 = 536870912 ~134217728 * ~8 = 1073741824 ~134217728 * ~16 = Overflow ~67108864 * ~1 = 67108864 ~67108864 * ~2 = 134217728 ~67108864 * ~4 = 268435456 ~67108864 * ~8 = 536870912 ~67108864 * ~16 = 1073741824 ~4 * ~1 = 4 ~4 * ~2 = 8 ~4 * ~4 = 16 ~4 * ~8 = 32 ~4 * ~16 = 64 ~3 * ~1 = 3 ~3 * ~2 = 6 ~3 * ~4 = 12 ~3 * ~8 = 24 ~3 * ~16 = 48 ~2 * ~1 = 2 ~2 * ~2 = 4 ~2 * ~4 = 8 ~2 * ~8 = 16 ~2 * ~16 = 32 ~1 * ~1 = 1 ~1 * ~2 = 2 ~1 * ~4 = 4 ~1 * ~8 = 8 ~1 * ~16 = 16 0 * ~1 = 0 0 * ~2 = 0 0 * ~4 = 0 0 * ~8 = 0 0 * ~16 = 0 1 * ~1 = ~1 1 * ~2 = ~2 1 * ~4 = ~4 1 * ~8 = ~8 1 * ~16 = ~16 2 * ~1 = ~2 2 * ~2 = ~4 2 * ~4 = ~8 2 * ~8 = ~16 2 * ~16 = ~32 3 * ~1 = ~3 3 * ~2 = ~6 3 * ~4 = ~12 3 * ~8 = ~24 3 * ~16 = ~48 4 * ~1 = ~4 4 * ~2 = ~8 4 * ~4 = ~16 4 * ~8 = ~32 4 * ~16 = ~64 33554432 * ~1 = ~33554432 33554432 * ~2 = ~67108864 33554432 * ~4 = ~134217728 33554432 * ~8 = ~268435456 33554432 * ~16 = ~536870912 67108864 * ~1 = ~67108864 67108864 * ~2 = ~134217728 67108864 * ~4 = ~268435456 67108864 * ~8 = ~536870912 67108864 * ~16 = ~1073741824 134217728 * ~1 = ~134217728 134217728 * ~2 = ~268435456 134217728 * ~4 = ~536870912 134217728 * ~8 = ~1073741824 134217728 * ~16 = ~2147483648 268435456 * ~1 = ~268435456 268435456 * ~2 = ~536870912 268435456 * ~4 = ~1073741824 268435456 * ~8 = ~2147483648 268435456 * ~16 = Overflow 536870912 * ~1 = ~536870912 536870912 * ~2 = ~1073741824 536870912 * ~4 = ~2147483648 536870912 * ~8 = Overflow 536870912 * ~16 = Overflow 1073741824 * ~1 = ~1073741824 1073741824 * ~2 = ~2147483648 1073741824 * ~4 = Overflow 1073741824 * ~8 = Overflow 1073741824 * ~16 = Overflow ~32 * 4611686018427387904 = Overflow ~32 * 2305843009213693952 = Overflow ~32 * 1152921504606846976 = Overflow ~32 * 576460752303423488 = Overflow ~32 * 288230376151711744 = ~9223372036854775808 ~31 * 4611686018427387904 = Overflow ~31 * 2305843009213693952 = Overflow ~31 * 1152921504606846976 = Overflow ~31 * 576460752303423488 = Overflow ~31 * 288230376151711744 = ~8935141660703064064 ~30 * 4611686018427387904 = Overflow ~30 * 2305843009213693952 = Overflow ~30 * 1152921504606846976 = Overflow ~30 * 576460752303423488 = Overflow ~30 * 288230376151711744 = ~8646911284551352320 ~29 * 4611686018427387904 = Overflow ~29 * 2305843009213693952 = Overflow ~29 * 1152921504606846976 = Overflow ~29 * 576460752303423488 = Overflow ~29 * 288230376151711744 = ~8358680908399640576 ~28 * 4611686018427387904 = Overflow ~28 * 2305843009213693952 = Overflow ~28 * 1152921504606846976 = Overflow ~28 * 576460752303423488 = Overflow ~28 * 288230376151711744 = ~8070450532247928832 ~27 * 4611686018427387904 = Overflow ~27 * 2305843009213693952 = Overflow ~27 * 1152921504606846976 = Overflow ~27 * 576460752303423488 = Overflow ~27 * 288230376151711744 = ~7782220156096217088 ~26 * 4611686018427387904 = Overflow ~26 * 2305843009213693952 = Overflow ~26 * 1152921504606846976 = Overflow ~26 * 576460752303423488 = Overflow ~26 * 288230376151711744 = ~7493989779944505344 ~25 * 4611686018427387904 = Overflow ~25 * 2305843009213693952 = Overflow ~25 * 1152921504606846976 = Overflow ~25 * 576460752303423488 = Overflow ~25 * 288230376151711744 = ~7205759403792793600 ~24 * 4611686018427387904 = Overflow ~24 * 2305843009213693952 = Overflow ~24 * 1152921504606846976 = Overflow ~24 * 576460752303423488 = Overflow ~24 * 288230376151711744 = ~6917529027641081856 ~23 * 4611686018427387904 = Overflow ~23 * 2305843009213693952 = Overflow ~23 * 1152921504606846976 = Overflow ~23 * 576460752303423488 = Overflow ~23 * 288230376151711744 = ~6629298651489370112 ~22 * 4611686018427387904 = Overflow ~22 * 2305843009213693952 = Overflow ~22 * 1152921504606846976 = Overflow ~22 * 576460752303423488 = Overflow ~22 * 288230376151711744 = ~6341068275337658368 ~21 * 4611686018427387904 = Overflow ~21 * 2305843009213693952 = Overflow ~21 * 1152921504606846976 = Overflow ~21 * 576460752303423488 = Overflow ~21 * 288230376151711744 = ~6052837899185946624 ~20 * 4611686018427387904 = Overflow ~20 * 2305843009213693952 = Overflow ~20 * 1152921504606846976 = Overflow ~20 * 576460752303423488 = Overflow ~20 * 288230376151711744 = ~5764607523034234880 ~19 * 4611686018427387904 = Overflow ~19 * 2305843009213693952 = Overflow ~19 * 1152921504606846976 = Overflow ~19 * 576460752303423488 = Overflow ~19 * 288230376151711744 = ~5476377146882523136 ~18 * 4611686018427387904 = Overflow ~18 * 2305843009213693952 = Overflow ~18 * 1152921504606846976 = Overflow ~18 * 576460752303423488 = Overflow ~18 * 288230376151711744 = ~5188146770730811392 ~17 * 4611686018427387904 = Overflow ~17 * 2305843009213693952 = Overflow ~17 * 1152921504606846976 = Overflow ~17 * 576460752303423488 = Overflow ~17 * 288230376151711744 = ~4899916394579099648 ~16 * 4611686018427387904 = Overflow ~16 * 2305843009213693952 = Overflow ~16 * 1152921504606846976 = Overflow ~16 * 576460752303423488 = ~9223372036854775808 ~16 * 288230376151711744 = ~4611686018427387904 ~15 * 4611686018427387904 = Overflow ~15 * 2305843009213693952 = Overflow ~15 * 1152921504606846976 = Overflow ~15 * 576460752303423488 = ~8646911284551352320 ~15 * 288230376151711744 = ~4323455642275676160 ~14 * 4611686018427387904 = Overflow ~14 * 2305843009213693952 = Overflow ~14 * 1152921504606846976 = Overflow ~14 * 576460752303423488 = ~8070450532247928832 ~14 * 288230376151711744 = ~4035225266123964416 ~13 * 4611686018427387904 = Overflow ~13 * 2305843009213693952 = Overflow ~13 * 1152921504606846976 = Overflow ~13 * 576460752303423488 = ~7493989779944505344 ~13 * 288230376151711744 = ~3746994889972252672 ~12 * 4611686018427387904 = Overflow ~12 * 2305843009213693952 = Overflow ~12 * 1152921504606846976 = Overflow ~12 * 576460752303423488 = ~6917529027641081856 ~12 * 288230376151711744 = ~3458764513820540928 ~11 * 4611686018427387904 = Overflow ~11 * 2305843009213693952 = Overflow ~11 * 1152921504606846976 = Overflow ~11 * 576460752303423488 = ~6341068275337658368 ~11 * 288230376151711744 = ~3170534137668829184 ~10 * 4611686018427387904 = Overflow ~10 * 2305843009213693952 = Overflow ~10 * 1152921504606846976 = Overflow ~10 * 576460752303423488 = ~5764607523034234880 ~10 * 288230376151711744 = ~2882303761517117440 ~9 * 4611686018427387904 = Overflow ~9 * 2305843009213693952 = Overflow ~9 * 1152921504606846976 = Overflow ~9 * 576460752303423488 = ~5188146770730811392 ~9 * 288230376151711744 = ~2594073385365405696 ~8 * 4611686018427387904 = Overflow ~8 * 2305843009213693952 = Overflow ~8 * 1152921504606846976 = ~9223372036854775808 ~8 * 576460752303423488 = ~4611686018427387904 ~8 * 288230376151711744 = ~2305843009213693952 ~7 * 4611686018427387904 = Overflow ~7 * 2305843009213693952 = Overflow ~7 * 1152921504606846976 = ~8070450532247928832 ~7 * 576460752303423488 = ~4035225266123964416 ~7 * 288230376151711744 = ~2017612633061982208 ~6 * 4611686018427387904 = Overflow ~6 * 2305843009213693952 = Overflow ~6 * 1152921504606846976 = ~6917529027641081856 ~6 * 576460752303423488 = ~3458764513820540928 ~6 * 288230376151711744 = ~1729382256910270464 ~5 * 4611686018427387904 = Overflow ~5 * 2305843009213693952 = Overflow ~5 * 1152921504606846976 = ~5764607523034234880 ~5 * 576460752303423488 = ~2882303761517117440 ~5 * 288230376151711744 = ~1441151880758558720 ~4 * 4611686018427387904 = Overflow ~4 * 2305843009213693952 = ~9223372036854775808 ~4 * 1152921504606846976 = ~4611686018427387904 ~4 * 576460752303423488 = ~2305843009213693952 ~4 * 288230376151711744 = ~1152921504606846976 ~3 * 4611686018427387904 = Overflow ~3 * 2305843009213693952 = ~6917529027641081856 ~3 * 1152921504606846976 = ~3458764513820540928 ~3 * 576460752303423488 = ~1729382256910270464 ~3 * 288230376151711744 = ~864691128455135232 ~2 * 4611686018427387904 = ~9223372036854775808 ~2 * 2305843009213693952 = ~4611686018427387904 ~2 * 1152921504606846976 = ~2305843009213693952 ~2 * 576460752303423488 = ~1152921504606846976 ~2 * 288230376151711744 = ~576460752303423488 ~1 * 4611686018427387904 = ~4611686018427387904 ~1 * 2305843009213693952 = ~2305843009213693952 ~1 * 1152921504606846976 = ~1152921504606846976 ~1 * 576460752303423488 = ~576460752303423488 ~1 * 288230376151711744 = ~288230376151711744 0 * 4611686018427387904 = 0 0 * 2305843009213693952 = 0 0 * 1152921504606846976 = 0 0 * 576460752303423488 = 0 0 * 288230376151711744 = 0 1 * 4611686018427387904 = 4611686018427387904 1 * 2305843009213693952 = 2305843009213693952 1 * 1152921504606846976 = 1152921504606846976 1 * 576460752303423488 = 576460752303423488 1 * 288230376151711744 = 288230376151711744 2 * 4611686018427387904 = Overflow 2 * 2305843009213693952 = 4611686018427387904 2 * 1152921504606846976 = 2305843009213693952 2 * 576460752303423488 = 1152921504606846976 2 * 288230376151711744 = 576460752303423488 3 * 4611686018427387904 = Overflow 3 * 2305843009213693952 = 6917529027641081856 3 * 1152921504606846976 = 3458764513820540928 3 * 576460752303423488 = 1729382256910270464 3 * 288230376151711744 = 864691128455135232 4 * 4611686018427387904 = Overflow 4 * 2305843009213693952 = Overflow 4 * 1152921504606846976 = 4611686018427387904 4 * 576460752303423488 = 2305843009213693952 4 * 288230376151711744 = 1152921504606846976 5 * 4611686018427387904 = Overflow 5 * 2305843009213693952 = Overflow 5 * 1152921504606846976 = 5764607523034234880 5 * 576460752303423488 = 2882303761517117440 5 * 288230376151711744 = 1441151880758558720 6 * 4611686018427387904 = Overflow 6 * 2305843009213693952 = Overflow 6 * 1152921504606846976 = 6917529027641081856 6 * 576460752303423488 = 3458764513820540928 6 * 288230376151711744 = 1729382256910270464 7 * 4611686018427387904 = Overflow 7 * 2305843009213693952 = Overflow 7 * 1152921504606846976 = 8070450532247928832 7 * 576460752303423488 = 4035225266123964416 7 * 288230376151711744 = 2017612633061982208 8 * 4611686018427387904 = Overflow 8 * 2305843009213693952 = Overflow 8 * 1152921504606846976 = Overflow 8 * 576460752303423488 = 4611686018427387904 8 * 288230376151711744 = 2305843009213693952 9 * 4611686018427387904 = Overflow 9 * 2305843009213693952 = Overflow 9 * 1152921504606846976 = Overflow 9 * 576460752303423488 = 5188146770730811392 9 * 288230376151711744 = 2594073385365405696 10 * 4611686018427387904 = Overflow 10 * 2305843009213693952 = Overflow 10 * 1152921504606846976 = Overflow 10 * 576460752303423488 = 5764607523034234880 10 * 288230376151711744 = 2882303761517117440 11 * 4611686018427387904 = Overflow 11 * 2305843009213693952 = Overflow 11 * 1152921504606846976 = Overflow 11 * 576460752303423488 = 6341068275337658368 11 * 288230376151711744 = 3170534137668829184 12 * 4611686018427387904 = Overflow 12 * 2305843009213693952 = Overflow 12 * 1152921504606846976 = Overflow 12 * 576460752303423488 = 6917529027641081856 12 * 288230376151711744 = 3458764513820540928 13 * 4611686018427387904 = Overflow 13 * 2305843009213693952 = Overflow 13 * 1152921504606846976 = Overflow 13 * 576460752303423488 = 7493989779944505344 13 * 288230376151711744 = 3746994889972252672 14 * 4611686018427387904 = Overflow 14 * 2305843009213693952 = Overflow 14 * 1152921504606846976 = Overflow 14 * 576460752303423488 = 8070450532247928832 14 * 288230376151711744 = 4035225266123964416 15 * 4611686018427387904 = Overflow 15 * 2305843009213693952 = Overflow 15 * 1152921504606846976 = Overflow 15 * 576460752303423488 = 8646911284551352320 15 * 288230376151711744 = 4323455642275676160 16 * 4611686018427387904 = Overflow 16 * 2305843009213693952 = Overflow 16 * 1152921504606846976 = Overflow 16 * 576460752303423488 = Overflow 16 * 288230376151711744 = 4611686018427387904 17 * 4611686018427387904 = Overflow 17 * 2305843009213693952 = Overflow 17 * 1152921504606846976 = Overflow 17 * 576460752303423488 = Overflow 17 * 288230376151711744 = 4899916394579099648 18 * 4611686018427387904 = Overflow 18 * 2305843009213693952 = Overflow 18 * 1152921504606846976 = Overflow 18 * 576460752303423488 = Overflow 18 * 288230376151711744 = 5188146770730811392 19 * 4611686018427387904 = Overflow 19 * 2305843009213693952 = Overflow 19 * 1152921504606846976 = Overflow 19 * 576460752303423488 = Overflow 19 * 288230376151711744 = 5476377146882523136 20 * 4611686018427387904 = Overflow 20 * 2305843009213693952 = Overflow 20 * 1152921504606846976 = Overflow 20 * 576460752303423488 = Overflow 20 * 288230376151711744 = 5764607523034234880 21 * 4611686018427387904 = Overflow 21 * 2305843009213693952 = Overflow 21 * 1152921504606846976 = Overflow 21 * 576460752303423488 = Overflow 21 * 288230376151711744 = 6052837899185946624 22 * 4611686018427387904 = Overflow 22 * 2305843009213693952 = Overflow 22 * 1152921504606846976 = Overflow 22 * 576460752303423488 = Overflow 22 * 288230376151711744 = 6341068275337658368 23 * 4611686018427387904 = Overflow 23 * 2305843009213693952 = Overflow 23 * 1152921504606846976 = Overflow 23 * 576460752303423488 = Overflow 23 * 288230376151711744 = 6629298651489370112 24 * 4611686018427387904 = Overflow 24 * 2305843009213693952 = Overflow 24 * 1152921504606846976 = Overflow 24 * 576460752303423488 = Overflow 24 * 288230376151711744 = 6917529027641081856 25 * 4611686018427387904 = Overflow 25 * 2305843009213693952 = Overflow 25 * 1152921504606846976 = Overflow 25 * 576460752303423488 = Overflow 25 * 288230376151711744 = 7205759403792793600 26 * 4611686018427387904 = Overflow 26 * 2305843009213693952 = Overflow 26 * 1152921504606846976 = Overflow 26 * 576460752303423488 = Overflow 26 * 288230376151711744 = 7493989779944505344 27 * 4611686018427387904 = Overflow 27 * 2305843009213693952 = Overflow 27 * 1152921504606846976 = Overflow 27 * 576460752303423488 = Overflow 27 * 288230376151711744 = 7782220156096217088 28 * 4611686018427387904 = Overflow 28 * 2305843009213693952 = Overflow 28 * 1152921504606846976 = Overflow 28 * 576460752303423488 = Overflow 28 * 288230376151711744 = 8070450532247928832 29 * 4611686018427387904 = Overflow 29 * 2305843009213693952 = Overflow 29 * 1152921504606846976 = Overflow 29 * 576460752303423488 = Overflow 29 * 288230376151711744 = 8358680908399640576 30 * 4611686018427387904 = Overflow 30 * 2305843009213693952 = Overflow 30 * 1152921504606846976 = Overflow 30 * 576460752303423488 = Overflow 30 * 288230376151711744 = 8646911284551352320 31 * 4611686018427387904 = Overflow 31 * 2305843009213693952 = Overflow 31 * 1152921504606846976 = Overflow 31 * 576460752303423488 = Overflow 31 * 288230376151711744 = 8935141660703064064 32 * 4611686018427387904 = Overflow 32 * 2305843009213693952 = Overflow 32 * 1152921504606846976 = Overflow 32 * 576460752303423488 = Overflow 32 * 288230376151711744 = Overflow ~32 * ~9223372036854775808 = Overflow ~32 * ~4611686018427387904 = Overflow ~32 * ~2305843009213693952 = Overflow ~32 * ~1152921504606846976 = Overflow ~32 * ~576460752303423488 = Overflow ~31 * ~9223372036854775808 = Overflow ~31 * ~4611686018427387904 = Overflow ~31 * ~2305843009213693952 = Overflow ~31 * ~1152921504606846976 = Overflow ~31 * ~576460752303423488 = Overflow ~30 * ~9223372036854775808 = Overflow ~30 * ~4611686018427387904 = Overflow ~30 * ~2305843009213693952 = Overflow ~30 * ~1152921504606846976 = Overflow ~30 * ~576460752303423488 = Overflow ~29 * ~9223372036854775808 = Overflow ~29 * ~4611686018427387904 = Overflow ~29 * ~2305843009213693952 = Overflow ~29 * ~1152921504606846976 = Overflow ~29 * ~576460752303423488 = Overflow ~28 * ~9223372036854775808 = Overflow ~28 * ~4611686018427387904 = Overflow ~28 * ~2305843009213693952 = Overflow ~28 * ~1152921504606846976 = Overflow ~28 * ~576460752303423488 = Overflow ~27 * ~9223372036854775808 = Overflow ~27 * ~4611686018427387904 = Overflow ~27 * ~2305843009213693952 = Overflow ~27 * ~1152921504606846976 = Overflow ~27 * ~576460752303423488 = Overflow ~26 * ~9223372036854775808 = Overflow ~26 * ~4611686018427387904 = Overflow ~26 * ~2305843009213693952 = Overflow ~26 * ~1152921504606846976 = Overflow ~26 * ~576460752303423488 = Overflow ~25 * ~9223372036854775808 = Overflow ~25 * ~4611686018427387904 = Overflow ~25 * ~2305843009213693952 = Overflow ~25 * ~1152921504606846976 = Overflow ~25 * ~576460752303423488 = Overflow ~24 * ~9223372036854775808 = Overflow ~24 * ~4611686018427387904 = Overflow ~24 * ~2305843009213693952 = Overflow ~24 * ~1152921504606846976 = Overflow ~24 * ~576460752303423488 = Overflow ~23 * ~9223372036854775808 = Overflow ~23 * ~4611686018427387904 = Overflow ~23 * ~2305843009213693952 = Overflow ~23 * ~1152921504606846976 = Overflow ~23 * ~576460752303423488 = Overflow ~22 * ~9223372036854775808 = Overflow ~22 * ~4611686018427387904 = Overflow ~22 * ~2305843009213693952 = Overflow ~22 * ~1152921504606846976 = Overflow ~22 * ~576460752303423488 = Overflow ~21 * ~9223372036854775808 = Overflow ~21 * ~4611686018427387904 = Overflow ~21 * ~2305843009213693952 = Overflow ~21 * ~1152921504606846976 = Overflow ~21 * ~576460752303423488 = Overflow ~20 * ~9223372036854775808 = Overflow ~20 * ~4611686018427387904 = Overflow ~20 * ~2305843009213693952 = Overflow ~20 * ~1152921504606846976 = Overflow ~20 * ~576460752303423488 = Overflow ~19 * ~9223372036854775808 = Overflow ~19 * ~4611686018427387904 = Overflow ~19 * ~2305843009213693952 = Overflow ~19 * ~1152921504606846976 = Overflow ~19 * ~576460752303423488 = Overflow ~18 * ~9223372036854775808 = Overflow ~18 * ~4611686018427387904 = Overflow ~18 * ~2305843009213693952 = Overflow ~18 * ~1152921504606846976 = Overflow ~18 * ~576460752303423488 = Overflow ~17 * ~9223372036854775808 = Overflow ~17 * ~4611686018427387904 = Overflow ~17 * ~2305843009213693952 = Overflow ~17 * ~1152921504606846976 = Overflow ~17 * ~576460752303423488 = Overflow ~16 * ~9223372036854775808 = Overflow ~16 * ~4611686018427387904 = Overflow ~16 * ~2305843009213693952 = Overflow ~16 * ~1152921504606846976 = Overflow ~16 * ~576460752303423488 = Overflow ~15 * ~9223372036854775808 = Overflow ~15 * ~4611686018427387904 = Overflow ~15 * ~2305843009213693952 = Overflow ~15 * ~1152921504606846976 = Overflow ~15 * ~576460752303423488 = 8646911284551352320 ~14 * ~9223372036854775808 = Overflow ~14 * ~4611686018427387904 = Overflow ~14 * ~2305843009213693952 = Overflow ~14 * ~1152921504606846976 = Overflow ~14 * ~576460752303423488 = 8070450532247928832 ~13 * ~9223372036854775808 = Overflow ~13 * ~4611686018427387904 = Overflow ~13 * ~2305843009213693952 = Overflow ~13 * ~1152921504606846976 = Overflow ~13 * ~576460752303423488 = 7493989779944505344 ~12 * ~9223372036854775808 = Overflow ~12 * ~4611686018427387904 = Overflow ~12 * ~2305843009213693952 = Overflow ~12 * ~1152921504606846976 = Overflow ~12 * ~576460752303423488 = 6917529027641081856 ~11 * ~9223372036854775808 = Overflow ~11 * ~4611686018427387904 = Overflow ~11 * ~2305843009213693952 = Overflow ~11 * ~1152921504606846976 = Overflow ~11 * ~576460752303423488 = 6341068275337658368 ~10 * ~9223372036854775808 = Overflow ~10 * ~4611686018427387904 = Overflow ~10 * ~2305843009213693952 = Overflow ~10 * ~1152921504606846976 = Overflow ~10 * ~576460752303423488 = 5764607523034234880 ~9 * ~9223372036854775808 = Overflow ~9 * ~4611686018427387904 = Overflow ~9 * ~2305843009213693952 = Overflow ~9 * ~1152921504606846976 = Overflow ~9 * ~576460752303423488 = 5188146770730811392 ~8 * ~9223372036854775808 = Overflow ~8 * ~4611686018427387904 = Overflow ~8 * ~2305843009213693952 = Overflow ~8 * ~1152921504606846976 = Overflow ~8 * ~576460752303423488 = 4611686018427387904 ~7 * ~9223372036854775808 = Overflow ~7 * ~4611686018427387904 = Overflow ~7 * ~2305843009213693952 = Overflow ~7 * ~1152921504606846976 = 8070450532247928832 ~7 * ~576460752303423488 = 4035225266123964416 ~6 * ~9223372036854775808 = Overflow ~6 * ~4611686018427387904 = Overflow ~6 * ~2305843009213693952 = Overflow ~6 * ~1152921504606846976 = 6917529027641081856 ~6 * ~576460752303423488 = 3458764513820540928 ~5 * ~9223372036854775808 = Overflow ~5 * ~4611686018427387904 = Overflow ~5 * ~2305843009213693952 = Overflow ~5 * ~1152921504606846976 = 5764607523034234880 ~5 * ~576460752303423488 = 2882303761517117440 ~4 * ~9223372036854775808 = Overflow ~4 * ~4611686018427387904 = Overflow ~4 * ~2305843009213693952 = Overflow ~4 * ~1152921504606846976 = 4611686018427387904 ~4 * ~576460752303423488 = 2305843009213693952 ~3 * ~9223372036854775808 = Overflow ~3 * ~4611686018427387904 = Overflow ~3 * ~2305843009213693952 = 6917529027641081856 ~3 * ~1152921504606846976 = 3458764513820540928 ~3 * ~576460752303423488 = 1729382256910270464 ~2 * ~9223372036854775808 = Overflow ~2 * ~4611686018427387904 = Overflow ~2 * ~2305843009213693952 = 4611686018427387904 ~2 * ~1152921504606846976 = 2305843009213693952 ~2 * ~576460752303423488 = 1152921504606846976 ~1 * ~9223372036854775808 = Overflow ~1 * ~4611686018427387904 = 4611686018427387904 ~1 * ~2305843009213693952 = 2305843009213693952 ~1 * ~1152921504606846976 = 1152921504606846976 ~1 * ~576460752303423488 = 576460752303423488 0 * ~9223372036854775808 = 0 0 * ~4611686018427387904 = 0 0 * ~2305843009213693952 = 0 0 * ~1152921504606846976 = 0 0 * ~576460752303423488 = 0 1 * ~9223372036854775808 = ~9223372036854775808 1 * ~4611686018427387904 = ~4611686018427387904 1 * ~2305843009213693952 = ~2305843009213693952 1 * ~1152921504606846976 = ~1152921504606846976 1 * ~576460752303423488 = ~576460752303423488 2 * ~9223372036854775808 = Overflow 2 * ~4611686018427387904 = ~9223372036854775808 2 * ~2305843009213693952 = ~4611686018427387904 2 * ~1152921504606846976 = ~2305843009213693952 2 * ~576460752303423488 = ~1152921504606846976 3 * ~9223372036854775808 = Overflow 3 * ~4611686018427387904 = Overflow 3 * ~2305843009213693952 = ~6917529027641081856 3 * ~1152921504606846976 = ~3458764513820540928 3 * ~576460752303423488 = ~1729382256910270464 4 * ~9223372036854775808 = Overflow 4 * ~4611686018427387904 = Overflow 4 * ~2305843009213693952 = ~9223372036854775808 4 * ~1152921504606846976 = ~4611686018427387904 4 * ~576460752303423488 = ~2305843009213693952 5 * ~9223372036854775808 = Overflow 5 * ~4611686018427387904 = Overflow 5 * ~2305843009213693952 = Overflow 5 * ~1152921504606846976 = ~5764607523034234880 5 * ~576460752303423488 = ~2882303761517117440 6 * ~9223372036854775808 = Overflow 6 * ~4611686018427387904 = Overflow 6 * ~2305843009213693952 = Overflow 6 * ~1152921504606846976 = ~6917529027641081856 6 * ~576460752303423488 = ~3458764513820540928 7 * ~9223372036854775808 = Overflow 7 * ~4611686018427387904 = Overflow 7 * ~2305843009213693952 = Overflow 7 * ~1152921504606846976 = ~8070450532247928832 7 * ~576460752303423488 = ~4035225266123964416 8 * ~9223372036854775808 = Overflow 8 * ~4611686018427387904 = Overflow 8 * ~2305843009213693952 = Overflow 8 * ~1152921504606846976 = ~9223372036854775808 8 * ~576460752303423488 = ~4611686018427387904 9 * ~9223372036854775808 = Overflow 9 * ~4611686018427387904 = Overflow 9 * ~2305843009213693952 = Overflow 9 * ~1152921504606846976 = Overflow 9 * ~576460752303423488 = ~5188146770730811392 10 * ~9223372036854775808 = Overflow 10 * ~4611686018427387904 = Overflow 10 * ~2305843009213693952 = Overflow 10 * ~1152921504606846976 = Overflow 10 * ~576460752303423488 = ~5764607523034234880 11 * ~9223372036854775808 = Overflow 11 * ~4611686018427387904 = Overflow 11 * ~2305843009213693952 = Overflow 11 * ~1152921504606846976 = Overflow 11 * ~576460752303423488 = ~6341068275337658368 12 * ~9223372036854775808 = Overflow 12 * ~4611686018427387904 = Overflow 12 * ~2305843009213693952 = Overflow 12 * ~1152921504606846976 = Overflow 12 * ~576460752303423488 = ~6917529027641081856 13 * ~9223372036854775808 = Overflow 13 * ~4611686018427387904 = Overflow 13 * ~2305843009213693952 = Overflow 13 * ~1152921504606846976 = Overflow 13 * ~576460752303423488 = ~7493989779944505344 14 * ~9223372036854775808 = Overflow 14 * ~4611686018427387904 = Overflow 14 * ~2305843009213693952 = Overflow 14 * ~1152921504606846976 = Overflow 14 * ~576460752303423488 = ~8070450532247928832 15 * ~9223372036854775808 = Overflow 15 * ~4611686018427387904 = Overflow 15 * ~2305843009213693952 = Overflow 15 * ~1152921504606846976 = Overflow 15 * ~576460752303423488 = ~8646911284551352320 16 * ~9223372036854775808 = Overflow 16 * ~4611686018427387904 = Overflow 16 * ~2305843009213693952 = Overflow 16 * ~1152921504606846976 = Overflow 16 * ~576460752303423488 = ~9223372036854775808 17 * ~9223372036854775808 = Overflow 17 * ~4611686018427387904 = Overflow 17 * ~2305843009213693952 = Overflow 17 * ~1152921504606846976 = Overflow 17 * ~576460752303423488 = Overflow 18 * ~9223372036854775808 = Overflow 18 * ~4611686018427387904 = Overflow 18 * ~2305843009213693952 = Overflow 18 * ~1152921504606846976 = Overflow 18 * ~576460752303423488 = Overflow 19 * ~9223372036854775808 = Overflow 19 * ~4611686018427387904 = Overflow 19 * ~2305843009213693952 = Overflow 19 * ~1152921504606846976 = Overflow 19 * ~576460752303423488 = Overflow 20 * ~9223372036854775808 = Overflow 20 * ~4611686018427387904 = Overflow 20 * ~2305843009213693952 = Overflow 20 * ~1152921504606846976 = Overflow 20 * ~576460752303423488 = Overflow 21 * ~9223372036854775808 = Overflow 21 * ~4611686018427387904 = Overflow 21 * ~2305843009213693952 = Overflow 21 * ~1152921504606846976 = Overflow 21 * ~576460752303423488 = Overflow 22 * ~9223372036854775808 = Overflow 22 * ~4611686018427387904 = Overflow 22 * ~2305843009213693952 = Overflow 22 * ~1152921504606846976 = Overflow 22 * ~576460752303423488 = Overflow 23 * ~9223372036854775808 = Overflow 23 * ~4611686018427387904 = Overflow 23 * ~2305843009213693952 = Overflow 23 * ~1152921504606846976 = Overflow 23 * ~576460752303423488 = Overflow 24 * ~9223372036854775808 = Overflow 24 * ~4611686018427387904 = Overflow 24 * ~2305843009213693952 = Overflow 24 * ~1152921504606846976 = Overflow 24 * ~576460752303423488 = Overflow 25 * ~9223372036854775808 = Overflow 25 * ~4611686018427387904 = Overflow 25 * ~2305843009213693952 = Overflow 25 * ~1152921504606846976 = Overflow 25 * ~576460752303423488 = Overflow 26 * ~9223372036854775808 = Overflow 26 * ~4611686018427387904 = Overflow 26 * ~2305843009213693952 = Overflow 26 * ~1152921504606846976 = Overflow 26 * ~576460752303423488 = Overflow 27 * ~9223372036854775808 = Overflow 27 * ~4611686018427387904 = Overflow 27 * ~2305843009213693952 = Overflow 27 * ~1152921504606846976 = Overflow 27 * ~576460752303423488 = Overflow 28 * ~9223372036854775808 = Overflow 28 * ~4611686018427387904 = Overflow 28 * ~2305843009213693952 = Overflow 28 * ~1152921504606846976 = Overflow 28 * ~576460752303423488 = Overflow 29 * ~9223372036854775808 = Overflow 29 * ~4611686018427387904 = Overflow 29 * ~2305843009213693952 = Overflow 29 * ~1152921504606846976 = Overflow 29 * ~576460752303423488 = Overflow 30 * ~9223372036854775808 = Overflow 30 * ~4611686018427387904 = Overflow 30 * ~2305843009213693952 = Overflow 30 * ~1152921504606846976 = Overflow 30 * ~576460752303423488 = Overflow 31 * ~9223372036854775808 = Overflow 31 * ~4611686018427387904 = Overflow 31 * ~2305843009213693952 = Overflow 31 * ~1152921504606846976 = Overflow 31 * ~576460752303423488 = Overflow 32 * ~9223372036854775808 = Overflow 32 * ~4611686018427387904 = Overflow 32 * ~2305843009213693952 = Overflow 32 * ~1152921504606846976 = Overflow 32 * ~576460752303423488 = Overflow ~9223372036854775808 * 1 = ~9223372036854775808 ~9223372036854775808 * 2 = Overflow ~9223372036854775808 * 4 = Overflow ~9223372036854775808 * 8 = Overflow ~9223372036854775808 * 16 = Overflow ~4611686018427387904 * 1 = ~4611686018427387904 ~4611686018427387904 * 2 = ~9223372036854775808 ~4611686018427387904 * 4 = Overflow ~4611686018427387904 * 8 = Overflow ~4611686018427387904 * 16 = Overflow ~2305843009213693952 * 1 = ~2305843009213693952 ~2305843009213693952 * 2 = ~4611686018427387904 ~2305843009213693952 * 4 = ~9223372036854775808 ~2305843009213693952 * 8 = Overflow ~2305843009213693952 * 16 = Overflow ~1152921504606846976 * 1 = ~1152921504606846976 ~1152921504606846976 * 2 = ~2305843009213693952 ~1152921504606846976 * 4 = ~4611686018427387904 ~1152921504606846976 * 8 = ~9223372036854775808 ~1152921504606846976 * 16 = Overflow ~576460752303423488 * 1 = ~576460752303423488 ~576460752303423488 * 2 = ~1152921504606846976 ~576460752303423488 * 4 = ~2305843009213693952 ~576460752303423488 * 8 = ~4611686018427387904 ~576460752303423488 * 16 = ~9223372036854775808 ~288230376151711744 * 1 = ~288230376151711744 ~288230376151711744 * 2 = ~576460752303423488 ~288230376151711744 * 4 = ~1152921504606846976 ~288230376151711744 * 8 = ~2305843009213693952 ~288230376151711744 * 16 = ~4611686018427387904 ~4 * 1 = ~4 ~4 * 2 = ~8 ~4 * 4 = ~16 ~4 * 8 = ~32 ~4 * 16 = ~64 ~3 * 1 = ~3 ~3 * 2 = ~6 ~3 * 4 = ~12 ~3 * 8 = ~24 ~3 * 16 = ~48 ~2 * 1 = ~2 ~2 * 2 = ~4 ~2 * 4 = ~8 ~2 * 8 = ~16 ~2 * 16 = ~32 ~1 * 1 = ~1 ~1 * 2 = ~2 ~1 * 4 = ~4 ~1 * 8 = ~8 ~1 * 16 = ~16 0 * 1 = 0 0 * 2 = 0 0 * 4 = 0 0 * 8 = 0 0 * 16 = 0 1 * 1 = 1 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 1 * 16 = 16 2 * 1 = 2 2 * 2 = 4 2 * 4 = 8 2 * 8 = 16 2 * 16 = 32 3 * 1 = 3 3 * 2 = 6 3 * 4 = 12 3 * 8 = 24 3 * 16 = 48 4 * 1 = 4 4 * 2 = 8 4 * 4 = 16 4 * 8 = 32 4 * 16 = 64 144115188075855872 * 1 = 144115188075855872 144115188075855872 * 2 = 288230376151711744 144115188075855872 * 4 = 576460752303423488 144115188075855872 * 8 = 1152921504606846976 144115188075855872 * 16 = 2305843009213693952 288230376151711744 * 1 = 288230376151711744 288230376151711744 * 2 = 576460752303423488 288230376151711744 * 4 = 1152921504606846976 288230376151711744 * 8 = 2305843009213693952 288230376151711744 * 16 = 4611686018427387904 576460752303423488 * 1 = 576460752303423488 576460752303423488 * 2 = 1152921504606846976 576460752303423488 * 4 = 2305843009213693952 576460752303423488 * 8 = 4611686018427387904 576460752303423488 * 16 = Overflow 1152921504606846976 * 1 = 1152921504606846976 1152921504606846976 * 2 = 2305843009213693952 1152921504606846976 * 4 = 4611686018427387904 1152921504606846976 * 8 = Overflow 1152921504606846976 * 16 = Overflow 2305843009213693952 * 1 = 2305843009213693952 2305843009213693952 * 2 = 4611686018427387904 2305843009213693952 * 4 = Overflow 2305843009213693952 * 8 = Overflow 2305843009213693952 * 16 = Overflow 4611686018427387904 * 1 = 4611686018427387904 4611686018427387904 * 2 = Overflow 4611686018427387904 * 4 = Overflow 4611686018427387904 * 8 = Overflow 4611686018427387904 * 16 = Overflow ~9223372036854775808 * ~1 = Overflow ~9223372036854775808 * ~2 = Overflow ~9223372036854775808 * ~4 = Overflow ~9223372036854775808 * ~8 = Overflow ~9223372036854775808 * ~16 = Overflow ~4611686018427387904 * ~1 = 4611686018427387904 ~4611686018427387904 * ~2 = Overflow ~4611686018427387904 * ~4 = Overflow ~4611686018427387904 * ~8 = Overflow ~4611686018427387904 * ~16 = Overflow ~2305843009213693952 * ~1 = 2305843009213693952 ~2305843009213693952 * ~2 = 4611686018427387904 ~2305843009213693952 * ~4 = Overflow ~2305843009213693952 * ~8 = Overflow ~2305843009213693952 * ~16 = Overflow ~1152921504606846976 * ~1 = 1152921504606846976 ~1152921504606846976 * ~2 = 2305843009213693952 ~1152921504606846976 * ~4 = 4611686018427387904 ~1152921504606846976 * ~8 = Overflow ~1152921504606846976 * ~16 = Overflow ~576460752303423488 * ~1 = 576460752303423488 ~576460752303423488 * ~2 = 1152921504606846976 ~576460752303423488 * ~4 = 2305843009213693952 ~576460752303423488 * ~8 = 4611686018427387904 ~576460752303423488 * ~16 = Overflow ~288230376151711744 * ~1 = 288230376151711744 ~288230376151711744 * ~2 = 576460752303423488 ~288230376151711744 * ~4 = 1152921504606846976 ~288230376151711744 * ~8 = 2305843009213693952 ~288230376151711744 * ~16 = 4611686018427387904 ~4 * ~1 = 4 ~4 * ~2 = 8 ~4 * ~4 = 16 ~4 * ~8 = 32 ~4 * ~16 = 64 ~3 * ~1 = 3 ~3 * ~2 = 6 ~3 * ~4 = 12 ~3 * ~8 = 24 ~3 * ~16 = 48 ~2 * ~1 = 2 ~2 * ~2 = 4 ~2 * ~4 = 8 ~2 * ~8 = 16 ~2 * ~16 = 32 ~1 * ~1 = 1 ~1 * ~2 = 2 ~1 * ~4 = 4 ~1 * ~8 = 8 ~1 * ~16 = 16 0 * ~1 = 0 0 * ~2 = 0 0 * ~4 = 0 0 * ~8 = 0 0 * ~16 = 0 1 * ~1 = ~1 1 * ~2 = ~2 1 * ~4 = ~4 1 * ~8 = ~8 1 * ~16 = ~16 2 * ~1 = ~2 2 * ~2 = ~4 2 * ~4 = ~8 2 * ~8 = ~16 2 * ~16 = ~32 3 * ~1 = ~3 3 * ~2 = ~6 3 * ~4 = ~12 3 * ~8 = ~24 3 * ~16 = ~48 4 * ~1 = ~4 4 * ~2 = ~8 4 * ~4 = ~16 4 * ~8 = ~32 4 * ~16 = ~64 144115188075855872 * ~1 = ~144115188075855872 144115188075855872 * ~2 = ~288230376151711744 144115188075855872 * ~4 = ~576460752303423488 144115188075855872 * ~8 = ~1152921504606846976 144115188075855872 * ~16 = ~2305843009213693952 288230376151711744 * ~1 = ~288230376151711744 288230376151711744 * ~2 = ~576460752303423488 288230376151711744 * ~4 = ~1152921504606846976 288230376151711744 * ~8 = ~2305843009213693952 288230376151711744 * ~16 = ~4611686018427387904 576460752303423488 * ~1 = ~576460752303423488 576460752303423488 * ~2 = ~1152921504606846976 576460752303423488 * ~4 = ~2305843009213693952 576460752303423488 * ~8 = ~4611686018427387904 576460752303423488 * ~16 = ~9223372036854775808 1152921504606846976 * ~1 = ~1152921504606846976 1152921504606846976 * ~2 = ~2305843009213693952 1152921504606846976 * ~4 = ~4611686018427387904 1152921504606846976 * ~8 = ~9223372036854775808 1152921504606846976 * ~16 = Overflow 2305843009213693952 * ~1 = ~2305843009213693952 2305843009213693952 * ~2 = ~4611686018427387904 2305843009213693952 * ~4 = ~9223372036854775808 2305843009213693952 * ~8 = Overflow 2305843009213693952 * ~16 = Overflow 4611686018427387904 * ~1 = ~4611686018427387904 4611686018427387904 * ~2 = ~9223372036854775808 4611686018427387904 * ~4 = Overflow 4611686018427387904 * ~8 = Overflow 4611686018427387904 * ~16 = Overflow mlton-20210117+dfsg/regression/int-mul-pow2.sml000066400000000000000000000155251416264345000212050ustar00rootroot00000000000000functor Test(structure Int: sig include INTEGER val zero: int val one: int end) = struct val zero = Int.zero val one = Int.one val two = Int.+ (one, one) val three = Int.+ (two, one) val four = Int.* (two, two) val eight = Int.* (four, two) val sixteen = Int.* (eight, two) val thirtytwo = Int.* (sixteen, two) val maxposint = valOf Int.maxInt val maxnegpow2 = Int.- (Int.~ maxposint, one) val maxpospow2 = Int.+ (Int.quot (maxposint, two), one) fun doit k = let val i = maxpospow2 val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) in () end fun loop k = if Int.> (k, thirtytwo) then () else (doit k; loop (Int.+ (k, one))) val () = loop (Int.~ thirtytwo) fun doit k = let val i = maxnegpow2 val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.quot (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) in () end fun loop k = if Int.> (k, thirtytwo) then () else (doit k; loop (Int.+ (k, one))) val () = loop (Int.~ thirtytwo) val ks = [maxnegpow2, Int.quot (maxnegpow2, two), Int.quot (maxnegpow2, four), Int.quot (maxnegpow2, eight), Int.quot (maxnegpow2, sixteen), Int.quot (maxnegpow2, thirtytwo), Int.~ four, Int.~ three, Int.~ two, Int.~ one, zero, one, two, three, four, Int.quot (maxpospow2, thirtytwo), Int.quot (maxpospow2, sixteen), Int.quot (maxpospow2, eight), Int.quot (maxpospow2, four), Int.quot (maxpospow2, two), maxpospow2] fun doit k = let val i = one val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) in () end fun loop ks = case ks of [] => () | k::ks => (doit k; loop ks) val () = loop ks fun doit k = let val i = Int.~ one val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) val i = Int.* (i, two) val () = print (concat [Int.toString k, " * ", Int.toString i, " = ", (Int.toString (Int.* (k, i)) handle Overflow => "Overflow"), "\n"]) in () end fun loop ks = case ks of [] => () | k::ks => (doit k; loop ks) val () = loop ks end structure Test8 = Test(structure Int = struct open Int8 val zero: int = 0 val one: int = 1 end) structure Test16 = Test(structure Int = struct open Int16 val zero: int = 0 val one: int = 1 end) structure Test32 = Test(structure Int = struct open Int32 val zero: int = 0 val one: int = 1 end) structure Test64 = Test(structure Int = struct open Int64 val zero: int = 0 val one: int = 1 end) mlton-20210117+dfsg/regression/int-overflow.ok000066400000000000000000000000141416264345000211670ustar00rootroot00000000000000OK OK OK OK mlton-20210117+dfsg/regression/int-overflow.sml000066400000000000000000000006061416264345000213600ustar00rootroot00000000000000val _ = (Int.fromString "12345678901234567890" ; print "ERROR\n") handle Overflow => print "OK\n" val min = valOf Int.minInt val _ = (~ min ; print "ERROR\n") handle Overflow => print "OK\n" val _ = (Int.fromString "2147483648" ; print "ERROR\n") handle Overflow => print "OK\n" val _ = (abs min ; print "ERROR\n") handle Overflow => print "OK\n" mlton-20210117+dfsg/regression/int.ok000066400000000000000000000040751416264345000173410ustar00rootroot00000000000000 File int.sml: Testing structure Int... test1a OK test1b OK test1c OK test1d OK test2a OK test2b OK test2c OK test2d OK test3 OK test4 OK test5 OK test6 OK test12 OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test18 OK test19 OK test20 OK test21 OK test22 OK mlton-20210117+dfsg/regression/int.sml000066400000000000000000000155161416264345000175250ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/int.sml -- here we test only the `exotic' operations PS 1995-02-25, 1996-07-02 *) (*KILL 05/11/1997 10:59. tho.: use "auxil.sml"; *) val _ = print "\nFile int.sml: Testing structure Int...\n" local open Int infix 7 quot rem fun divmod s (i, d, q, r) = tst s (i div d = q andalso i mod d = r); fun quotrem s (i, d, q, r) = tst s (i quot d = q andalso i rem d = r); in val test1a = divmod "test1a" (10, 3, 3, 1); val test1b = divmod "test1b" (~10, 3, ~4, 2); val test1c = divmod "test1c" (~10, ~3, 3, ~1); val test1d = divmod "test1d" (10, ~3, ~4, ~2); val test2a = quotrem "test2a" (10, 3, 3, 1); val test2b = quotrem "test2b" (~10, 3, ~3, ~1); val test2c = quotrem "test2c" (~10, ~3, 3, ~1); val test2d = quotrem "test2d" (10, ~3, ~3, 1); val test3 = tst "test3" (max(~5, 2) = 2 andalso max(5, 2) = 5); val test4 = tst "test4" (min(~5, 3) = ~5 andalso min(5, 2) = 2); val test5 = tst "test5" (sign ~57 = ~1 andalso sign 99 = 1 andalso sign 0 = 0); val test6 = tst "test6" (sameSign(~255, ~256) andalso sameSign(255, 256) andalso sameSign(0, 0)); val test12 = tst0 "test12" (case (minInt, maxInt) of (SOME mi, SOME ma) => check(sign mi = ~1 andalso sign ma = 1 andalso sameSign(mi, ~1) andalso sameSign(ma, 1)) | (NONE, NONE) => "OK" | _ => "WRONG") fun chk f (s, r) = tst' "chk" (fn _ => case f s of SOME res => res = r | NONE => false) fun chkScan fmt = chk (StringCvt.scanString (scan fmt)) val test13a = List.map (chk fromString) [("10789", 10789), ("+10789", 10789), ("~10789", ~10789), ("-10789", ~10789), (" \n\t10789crap", 10789), (" \n\t+10789crap", 10789), (" \n\t~10789crap", ~10789), (" \n\t-10789crap", ~10789), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test13b = List.map (fn s => tst0 "test13b" (case fromString s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "ff"]; val test14a = List.map (chkScan StringCvt.DEC) [("10789", 10789), ("+10789", 10789), ("~10789", ~10789), ("-10789", ~10789), (" \n\t10789crap", 10789), (" \n\t+10789crap", 10789), (" \n\t~10789crap", ~10789), (" \n\t-10789crap", ~10789), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test14b = List.map (fn s => tst0 "test14b" (case StringCvt.scanString (scan StringCvt.DEC) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "ff"]; val test15a = List.map (chkScan StringCvt.BIN) [("10010", 18), ("+10010", 18), ("~10010", ~18), ("-10010", ~18), (" \n\t10010crap", 18), (" \n\t+10010crap", 18), (" \n\t~10010crap", ~18), (" \n\t-10010crap", ~18), ("0w101", 0), ("0W101", 0), ("0x101", 0), ("0X101", 0), ("0wx101", 0), ("0wX101", 0)]; val test15b = List.map (fn s => tst0 "test15b" (case StringCvt.scanString (scan StringCvt.BIN) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "2", "8", "ff"]; val test16a = List.map (chkScan StringCvt.OCT) [("2071", 1081), ("+2071", 1081), ("~2071", ~1081), ("-2071", ~1081), (" \n\t2071crap", 1081), (" \n\t+2071crap", 1081), (" \n\t~2071crap", ~1081), (" \n\t-2071crap", ~1081), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test16b = List.map (fn s => tst0 "test16b" (case StringCvt.scanString (scan StringCvt.OCT) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "8", "ff"]; val test17a = List.map (chkScan StringCvt.HEX) [("20Af", 8367), ("+20Af", 8367), ("~20Af", ~8367), ("-20Af", ~8367), (" \n\t20AfGrap", 8367), (" \n\t+20AfGrap", 8367), (" \n\t~20AfGrap", ~8367), (" \n\t-20AfGrap", ~8367), ("0w123", 0), ("0W123", 0), ("0x", 0), ("0x ", 0), ("0xG", 0), ("0X", 0), ("0XG", 0), ("0x123", 291), ("0X123", 291), ("-0x123", ~291), ("-0X123", ~291), ("~0x123", ~291), ("~0X123", ~291), ("+0x123", 291), ("+0X123", 291), ("0wx123", 0), ("0wX123", 0)]; val test17b = List.map (fn s => tst0 "test17b" (case StringCvt.scanString (scan StringCvt.HEX) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1"]; local fun fromToString i = fromString (toString i) = SOME i; fun scanFmt radix i = StringCvt.scanString (scan radix) (fmt radix i) = SOME i; in val test18 = tst' "test18" (fn _ => range (~1200, 1200) fromToString); val test19 = tst' "test19" (fn _ => range (~1200, 1200) (scanFmt StringCvt.BIN)); val test20 = tst' "test20" (fn _ => range (~1200, 1200) (scanFmt StringCvt.OCT)); val test21 = tst' "test21" (fn _ => range (~1200, 1200) (scanFmt StringCvt.DEC)); val test22 = tst' "test22" (fn _ => range (~1200, 1200) (scanFmt StringCvt.HEX)); end end mlton-20210117+dfsg/regression/jump.ok000066400000000000000000000003221416264345000175110ustar00rootroot00000000000000big big zero big big big one big big big two big big big three big big big four big big big five big big big six big big big seven big big big eight big big big nine big big big ten big big big big big big big mlton-20210117+dfsg/regression/jump.sml000066400000000000000000000005241416264345000176770ustar00rootroot00000000000000 fun doit 2 = "zero" | doit 6 = "one" | doit 10 = "two" | doit 14 = "three" | doit 18 = "four" | doit 22 = "five" | doit 26 = "six" | doit 30 = "seven" | doit 34 = "eight" | doit 38 = "nine" | doit 42 = "ten" | doit _ = "big" val l = List.tabulate(50,fn i => i) val _ = List.app (fn i => print ((doit i) ^ "\n")) l mlton-20210117+dfsg/regression/kitdangle.ok000066400000000000000000000000001416264345000204710ustar00rootroot00000000000000mlton-20210117+dfsg/regression/kitdangle.sml000066400000000000000000000006231416264345000206660ustar00rootroot00000000000000(*kitdangle.sml*) infix - + :: = (*fun op = (x: ''a, y: ''a): bool = prim ("=", "=", (x, y)) *) exception Hd fun hd (x::l) = x | hd [] = raise Hd fun mklist 0 = [] | mklist n = n :: mklist(n-1) fun cycle(p as (m,f)) = if m=0 then p else cycle(m-1, let val x = [(m, mklist 2000)] in fn () => #1(hd x) + f() end) val r = cycle(1000, fn() => 0); mlton-20210117+dfsg/regression/kitdangle3.ok000066400000000000000000000000001416264345000205540ustar00rootroot00000000000000mlton-20210117+dfsg/regression/kitdangle3.sml000066400000000000000000000007351416264345000207550ustar00rootroot00000000000000(*kitdangle3.sml*) infix - + :: = (*fun op = (x: ''a, y: ''a): bool = prim("=", "=", (x, y)) *) exception Hd fun hd (x::l) = x | hd [] = raise Hd fun mklist 0 = [] | mklist n = n :: mklist(n-1) fun cycle(p as (m,f)) = if m=0 then p else cycle(m-1, let val x = [(m, mklist 2000)] in fn () => #1(hd x) + f() end) val r = ((cycle(1000, fn() => 0);()), (cycle(1000, fn() => 0);()), (cycle(1000, fn() => 0);())) mlton-20210117+dfsg/regression/kitfib35.ok000066400000000000000000000000001416264345000201470ustar00rootroot00000000000000mlton-20210117+dfsg/regression/kitfib35.sml000066400000000000000000000001751416264345000203460ustar00rootroot00000000000000(*kitfib35.sml*) val _ = let infix + - < fun fib n = if n < 1 then 1 else fib (n-1) + fib (n-2) in fib 35; () end mlton-20210117+dfsg/regression/kitkbjul9.ok000066400000000000000000000445201416264345000204560ustar00rootroot000000000000001 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20210117+dfsg/regression/kitkbjul9.sml000066400000000000000000000551051416264345000206410ustar00rootroot00000000000000(*kitkbjul9.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) (* fun eq_integer (x: int, y: int): bool = prim ("=", "=", (x, y)) *) val eq_integer: int * int -> bool = op = (* fun eq_string (x: string, y: string): bool = prim("=", "=", (x, y)) *) val eq_string: string * string -> bool = op = (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end (* fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end *) (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y (* fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end *) fun it_list f a [] = a | it_list f a (b::L) = it_list f (f a b) L fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) (* fun mem eq a = let fun mem_rec [] = false | mem_rec (b::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem eq a []= false | mem eq a (b::L) = eq(a,b) orelse mem eq a L fun union eq L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem eq a L2 then union_rec L else a :: union_rec L in union_rec L1 end (* fun mem_assoc eq a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem_assoc eq a [] = false | mem_assoc eq a ((b,_)::L) = eq(a,b) orelse mem_assoc eq a L fun assoc eq a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if eq(a,b) then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union eq L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem eq a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun map' f ([]:term list) : term list = [] | map' f (term::terms) = f term :: map' f terms fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map' copy_term l) fun eq_term x = (fn (Var i1, Var i2) => eq_integer(i1,i2) | (Term(s1,ts1),Term(s2,ts2)) => eq_string(s1,s2) andalso (eq_term_list(ts1,ts2)) | _ => false) x and eq_term_list x = (fn ([],[]) => true | (t1::ts1,t2::ts2) => eq_term(t1,t2) andalso eq_term_list(ts1,ts2) | _ => false) x fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union eq_integer (vars t) (vars_of_list r) (* fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc eq_integer n subst) handle _ => t in subst_rec end *) fun substitute subst (t as Term(oper,[])) = t | substitute subst (Term(oper,sons)) = Term(oper, map (substitute subst) sons) | substitute subst (t as (Var n)) = (assoc eq_integer n subst) handle _ => t fun change f = let fun change_rec (h::t) n = if eq_integer(n,1) then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc eq_integer v subst then if eq_term(M,assoc eq_integer v subst) then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = eq_integer(m,n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if eq_term(term1,term2) then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem eq_string oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem eq_string oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union eq_integer (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if eq_integer(k,n+1) then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun eq_ordering (Greater,Greater) = true (*lars *) | eq_ordering (Equal,Equal) = true | eq_ordering (NotGE,NotGE) = true | eq_ordering _ = false fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => eq_ordering(order (M,N),Greater)) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if eq_integer(r1,r2) then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if eq_term(M,N) then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (* r1908 *) (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in (* these applications of substitute put terms attop *) map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(interm:bool, n, rules, failures, p, eps) = (interm, n, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion (* [r2225] *)(arg as (done,n, rules, list, (k,l), eps)) = let fun kbrec (* [r2272] *) count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc eq_integer k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k (true, n, rules, [], (k,l), failures) (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else (false,n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if eq_term(M',N') then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if eq_integer(k,l) then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end fun kb_outer (* [r2517] *)(arg as (_, n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of result as (true,_, result_rules,_,_,_) => if false then arg else result | arg0 as (false, n', rules', failures', (k',l'), eqs') => kb_outer(let val arg1 = copy_arg arg0 in (*resetRegions arg0; *) copy_arg(arg1) end ) in (fn (_,_,x,_,_,_) => x)(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules (* letregion r2656 *) val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(false,n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); (* end r2683 *) ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () (* end (* Main *) *) val _ = (doit(); doit(); doit()); mlton-20210117+dfsg/regression/kitlife35u.ok000066400000000000000000000013231416264345000205240ustar00rootroot00000000000000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 00 00 00 0 0 0 mlton-20210117+dfsg/regression/kitlife35u.sml000066400000000000000000000203021416264345000207040ustar00rootroot00000000000000(*kitlife35u.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) local fun eq_integer (x: int, y: int): bool = x = y fun eq_string (x: string, y: string): bool = x = y fun eq_integer_curry(x)(y:int) =eq_integer(x,y) fun eq_int_pair_curry (x,x')(y,y'): bool = eq_integer(x,y) andalso eq_integer(x',y') fun app f [] = () | app f (x::xs) = (f x; app f xs) fun map f [] = [] | map f (a::x) = f a :: map f x fun map_rec(f, []) = [] | map_rec(f, x::xs) = f x:: map_rec(f, xs) exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun accumulate' (f, a, []) = a | accumulate' (f, a, b::x) = accumulate'(f, f(a,b), x) fun filter p l= rev (accumulate (fn x => fn a => if p a then a::x else x) [] l) (*builds an intermediate list; the regions of this list are now made local (unlike in escape.sml) *) fun equal a b = a=b fun exists p [] = false | exists p (a::x) = if p a then true else exists p x fun exists' (p, []) = false | exists' (p, (a::x)) = p a orelse exists'(p,x) fun member eq x a = exists' (eq a, x) fun C f x y = f y x fun cons a x = a::x fun revonto x y = accumulate' ((fn (x,y) => y::x), x, y) fun copy_int n = n+0 fun length x = copy_int(let fun count (n, a) = n+1 in accumulate'(count, 0, x) end) (* eta expanded*) fun repeat f = let (* rptf moved into inner let *) fun check n = if n<0 then error "repeat<0" else n in fn x => fn y => let fun rptf n x = if n=0 then x else rptf(n-1)(f x) in rptf (check x) y end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") fun copy_list[] = [] | copy_list((x,y)::rest) = (x+0,y+0):: copy_list rest fun lexless(a2,b2)(a1:int,b1:int) = if a2 0 | x::xs => 1 + length xs fun copy [] = [] | copy (x::xs) = x :: copy xs fun take(i,l) = case l of [] => [] | x::xs=> if i>0 then x::take(i-1,xs) else nil fun drop(i,l) = case l of [] => [] | x::xs => if i>0 then drop(i-1,xs) else l fun merge(lp as (left, right)) = case left of [] => right | x::xs => (case right of [] => left | y::ys => if lexless x y then x::merge(xs, right) else if lexless y x then y:: merge(left,ys) else (*x=y*) merge(xs, right) ) fun tmergesort l = case l of [] => [] | x::xs => (case xs of []=> l | _ => let val k = length l div 2 in merge(copy (tmergesort(take(k,l))), copy (tmergesort(drop(k,l)))) end ) fun lexordset x = tmergesort x fun collect f list = let fun accumf sofar [] = sofar | accumf sofar (a::x) = accumf (revonto sofar (f a)) x in accumf [] list (* note: this worked without changes!*) end fun occurs3 x = (* finds coords which occur exactly 3 times in coordlist x *) let fun f (q) = case q of (_,_,_,_,[]) => q | ( xover, x3, x2, x1, (a::x)) => if member eq_int_pair_curry xover a then f( xover, x3, x2, x1, x) else if member eq_int_pair_curry x3 a then f ((a::xover), x3, x2, x1, x) else if member eq_int_pair_curry x2 a then f (xover, (a::x3), x2, x1, x) else if member eq_int_pair_curry x1 a then f (xover, x3, (a::x2), x1, x) else f (xover, x3, x2, (a::x1), x) fun diff x y = filter (fn x => not(member eq_int_pair_curry y x)) x (* unfolded o *) val (xover, x3, _, _, _) = f ([],[],[],[],x) in diff x3 xover end fun copy_string s= implode(explode s) fun copy_bool true = true | copy_bool false = false fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN( copy_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and mk_nextgen_fn gen = if true then let val living = alive gen fun isalive x = copy_bool(member eq_int_pair_curry living x) (* eta *) fun liveneighbours x = length( filter isalive ( neighbours x)) (*eta*) fun twoorthree n = eq_integer(n,2) orelse eq_integer(n,3) val survivors = copy_list(filter (twoorthree o liveneighbours) living) val newnbrlist = copy_list(collect (fn z => filter (fn x => not( isalive x)) ( neighbours z)) living) (* unfolded o twice*) val newborn = copy_list(occurs3 newnbrlist) in mkgen (survivors @ newborn) end else gen end local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1,y1)::more) (* coordinates to be plotted *) = if eq_integer(x,x1) then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = map_rec(copy_string,(plotfrom(xstart,ystart) "" (copy_list(filter good coordlist)))) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end fun rotate x = map (fn (x:int,y:int) => (y,~x)) x (* eta converted*) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if eq_integer(i,n) then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun copy_whole_arg (p, g) = (copy_int p, copy g) fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = (print ".\n"; nthgen' (copy_whole_arg(let val arg = (i-1,mk_nextgen_fn g) val arg' = copy_whole_arg arg in (*resetRegions arg; *) arg' end))) fun gun() = mkgen (* turned into function *) [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun iter n = #2(nthgen'(n+0,gun())) fun pr x = print x fun show(x) = (pr "starting printing\n"; app (fn s => (pr s; pr "\n"))(plot(alive x)); () ) (* had to uncurry show, as iter 50 gave attop also made it return a different unit *) fun testit _ = show(iter 250) (* inserted call of iter *) val _ = testit () in val done = "done"; end mlton-20210117+dfsg/regression/kitloop2.ok000066400000000000000000000000221416264345000202760ustar00rootroot00000000000000 looping... done mlton-20210117+dfsg/regression/kitloop2.sml000066400000000000000000000010201416264345000204570ustar00rootroot00000000000000(*kitloop2.sml*) (* A tail-recursive loop which gives stack overflow, unless one uses storage mode analsysis *) val x = let val N = 500 val I = 1000 type int_pair = int * int val maxint = 2000 val zero = (0,0) fun is_zero(0,0) = true | is_zero _ = false fun sub (m,n) = if n=0 then (m-1, maxint) else (m, n-1) fun loop (x as (m,n)) = if is_zero x then x else loop(sub x) fun loop' p = (loop p; "\ndone\n") in print "\nlooping...\n"; print (loop'(maxint,maxint)) end mlton-20210117+dfsg/regression/kitmandelbrot.ok000066400000000000000000000000711416264345000213760ustar00rootroot000000000000004194304 iterations 4194304 iterations 4194304 iterations mlton-20210117+dfsg/regression/kitmandelbrot.sml000066400000000000000000000042001416264345000215560ustar00rootroot00000000000000(*kitmandelbrot.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) (* mandelbrot.sml *) (* structure Main : BMARK = struct *) val x_base = ~2.0 val y_base = 1.25 val side = 2.5 val sz = 2048 val maxCount = 1024 val delta = side / (real sz) val sum_iterations = ref 0 fun loop1 i = if (i >= sz) then () else let val c_im : real = y_base - (delta * real i) fun loop2 j = if (j >= sz) then () else let val c_re = x_base * (delta + real j) fun loop3 (count, z_re : real, z_im : real) = if (count < maxCount) then let val z_re_sq = z_re * z_re val z_im_sq = z_im * z_im in if ((z_re_sq + z_im_sq) > 4.0) then count else let val z_re_im = (z_re * z_im) in loop3 (count+1, (z_re_sq - z_im_sq) + c_re, z_re_im + z_re_im + c_im) end end (* loop3 *) else count val count = loop3 (0, c_re, c_im) in sum_iterations := !sum_iterations + 1(*count*); loop2 (j+1) end in loop2 0; loop1 (i+1) end fun doit () = (sum_iterations := 0; loop1 0) fun testit () = ( sum_iterations := 0; loop1 0; print(int_to_string(!sum_iterations) ^ " iterations\n")) (* end (* Mandelbrot *) *) (*val _ = (doit (); doit(); doit());*) val _ = (testit (); testit (); testit ()); (* this should give ``1084512 iterations'' *) mlton-20210117+dfsg/regression/kitqsort.ok000066400000000000000000000000041416264345000204130ustar00rootroot00000000000000Ok! mlton-20210117+dfsg/regression/kitqsort.sml000066400000000000000000000065161416264345000206130ustar00rootroot00000000000000(*kitknuth_bendix36c.sml*) (* quicksort-random.sml * * Input....: Random list (pseudo-random integers) * Optimised: 'arg as ...' in quickSort'() and partition(). * Copying left-parts after partitioning inside quickSort'(). * `Bertelsen transformation' of argument to tail-recursive * call to quickSort'(). * * Sestoft & Bertelsen, December 1995 *) val _ = let fun map f nil = nil | map f (x :: L) = f x :: map f L fun rev l = let fun rev_rec(p as ([], acc)) = p | rev_rec(x::xs, acc) = rev_rec(xs, x::acc) in #2 (rev_rec(l,nil)) end fun length [] = 0 | length (x::xs) = 1 + length xs fun app f [] = () | app f (x::xs) = (f x; app f xs) (* Quicksort -- Paulson p. 98 and answer to exercise 3.29 *) (* Optimised for the Kit with Regions *) (* NOTE: * This is the most space efficient version of quicksort with the current * storage mode analysis (implemented in 25q); copyList() will be called "sat" * inside partition() and the `innermost' recursive call to quickSort'() will * be "atbot" for the regions holding right'. Unfortunately, calling * copyList() after (the `innermost' recursive call to) quickSort'() means * that we keep the regions holding the `original list' live during the * call to quickSort'(). This should not be necessary, since a::bs will be * copied (i.e. partitioned) into to left and right parts, but rules 28 and 26 * in the region analysis are a bit too conservative in this case... *) fun say(s) = print s type elem = int fun copyList [] = [] | copyList (x::xr) = x::(copyList xr) fun quickSort' (arg as ([], sorted)) = arg | quickSort' ([a], sorted) = ([], a::sorted) | quickSort' (a::bs, sorted) = (* "a" is the pivot *) let fun partition (arg as (_, _, []: elem list)) = arg | partition (left, right, x::xr) = if x<=a then partition(x::left, right, xr) else partition(left, x::right, xr) val arg' = let val (left', right) = let val (left, right, _) = partition([], [], bs) in (*forceResetting bs; *) (copyList left, right) end val sorted' = #2 (quickSort'(right, sorted)) in (left', a::sorted') end in quickSort' arg' end fun quickSort l = #2 (quickSort'(l, [])) (* Generating random numbers. Paulson, page 96 *) val min = 1 val max = 100000 val a = 16807.0 val m = 2147483647.0 val w = real(max - min)/m fun seed0() = 117.0 fun nextRand seed = let val t = a*seed in t - m*real(floor(t/m)) end fun randomList' (arg as (0, _, res)) = arg | randomList' (i, seed, res) = let val res' = min+floor(seed*w) :: res (* NOTE: It is significant to use seed for * calculating res' before calling nextRand()... *) in randomList'(i-1, nextRand seed, res') end fun randomList n = #3 (randomList'(n, seed0(), [])) (* Building input list, sorting it and testing the result *) fun isSorted [] = true | isSorted [x: elem] = true | isSorted (x::(xr as (y::yr))) = (x <= y) andalso (isSorted xr) in if isSorted (quickSort(randomList 100000)) then say("Ok!\n") else say("Oops...\n") end mlton-20210117+dfsg/regression/kitreynolds2.ok000066400000000000000000000000061416264345000211660ustar00rootroot00000000000000false mlton-20210117+dfsg/regression/kitreynolds2.sml000066400000000000000000000017451416264345000213630ustar00rootroot00000000000000(*kitreynolds2.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun foldR f b [] = b | foldR f b (x::xs) = f x (foldR f b xs) fun curry f x y = f(x,y) datatype 'a Option = None | Some of 'a datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree fun max(i:int, j) = if i>j then i else j fun search p Lf = false | search p (Br(x,t1,t2)) = if p x then true else search (fn y => y=x orelse p y) t1 orelse search (fn y => y=x orelse p y) t2 fun mk_tree 0 = Lf | mk_tree n = let val t = mk_tree(n-1) in Br(n,t,t) end val it = if search (fn _ => false) (mk_tree 20) then print "true\n" else print "false\n" mlton-20210117+dfsg/regression/kitreynolds3.ok000066400000000000000000000000061416264345000211670ustar00rootroot00000000000000false mlton-20210117+dfsg/regression/kitreynolds3.sml000066400000000000000000000020121416264345000213500ustar00rootroot00000000000000(*kitreynolds3.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun foldR f b [] = b | foldR f b (x::xs) = f x (foldR f b xs) fun curry f x y = f(x,y) datatype 'a Option = None | Some of 'a datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree fun max(i:int, j) = if i>j then i else j fun member(x,[]) = false | member(x,x'::rest) = x=x' orelse member(x, rest) fun search p Lf = false | search p (Br(x,t1,t2)) = if member(x,p) then true else search (x::p) t1 orelse search (x::p) t2 fun mk_tree 0 = Lf | mk_tree n = let val t = mk_tree(n-1) in Br(n,t,t) end val it = if search [] (mk_tree 20) then print "true\n" else print "false\n"; mlton-20210117+dfsg/regression/kitsimple.ok000066400000000000000000000006041416264345000205420ustar00rootroot00000000000000.done make_velocity done make_position done make_area_density_volume done make_viscosity done make_temperature make_sigma:deltat = done make_sigma done make_cc done make_gamma done make_ab done make_theta done make_gamma done make_ab done make_theta done compute_heat_conduction done make_pressure done make_energy done compute_energy_error done compute_time_step 3072 ~61403 mlton-20210117+dfsg/regression/kitsimple.sml000066400000000000000000001143031416264345000207260ustar00rootroot00000000000000(*kitsimple.sml*) exception Overflow fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = if n<0 then implode(#"~"::digits(~n,[])) else implode(digits(n,[])) exception Hd fun hd [] = raise Hd | hd (x::xs) = x (* structure Array = (* Interface as in SML/NJ *) struct *) infix sub type 'a array = 'a ref list exception Size exception Subscript fun tabulate' (i,f) = let fun tab j = if j < i then f j :: tab (j+1) else nil in if i < 0 then raise Size else (tab 0) end fun array (n, x) = tabulate' (n, fn _ => ref x) fun arrayoflist l = map ref l fun tabulate (n, f) = tabulate' (n, fn x => ref(f x)) fun sub'(nil,i) = raise Subscript | sub' (a::r,i) = if i > 0 then sub' (r,i-1) else if i < 0 then raise Subscript else a fun op sub (a, i) = !(sub'(a,i)) fun update (a, i, v) = sub'(a, i) := v fun length [] = 0 | length (x::xs) = 1 + length xs (* end (* Array *) *) (* structure List = (* Interface as in SML/NJ *) struct *) exception Nth and NthTail fun null [] = true | null _ = false (* this lenght overrides the one in Array, but that was also the case in the original lexgen.sml (see the order in the open declaration below) *) fun length [] = 0 | length (x::xs) = 1 + length xs fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun fold f [] b = b | fold f (x::xs) b = f(x,fold f xs b) fun revfold f [] b = b | revfold f (x::xs) b = revfold f xs (f(x,b)) fun app f [] = () | app f (x::xs) = (f x; app f xs) fun revapp f [] = () | revapp f (x::xs) = (revapp f xs; f x; ()) fun nth ([],_) = raise Nth | nth (x::xs,0) = x | nth (x::xs,k) = nth(xs,k-1) fun nthtail ([],_) = raise NthTail | nthtail (l,0) = l | nthtail (l::ls,n) = nthtail(ls,n-1) fun exists p [] = false | exists p (x::xs) = p x orelse exists p xs (* end; (* List *) *) (* structure Control = struct *) val trace = ref true (* end; *) (* structure Array2 : sig type 'a array2 exception Subscript val array: (int*int) * '1a -> '1a array2 val sub : 'a array2 * (int*int) -> 'a val update : 'a array2 * (int*int) * 'a -> unit val length : 'a array2 -> (int*int) end = struct *) type 'a array2 = {size : (int*int), value : 'a array} exception Subscript = Subscript fun index22 ((i1:int,i2:int),(s1,s2)) = if i1>=0 andalso i1=0 andalso i20 andalso endd>=start then let fun f x = if x > endd then () else (body x; f(x+delta)) in f start end else if endd<=start then let fun f x = if x < endd then () else (body x; f(x+delta)) in f start end else () fun from(n,m) = if n>m then [] else n::from(n+1,m) fun flatten [] = [] | flatten (x::xs) = x @ flatten xs fun pow(x:real,y:int) = if y=0 then 1.0 else x * pow(x,y-1) fun array2(bounds as ((l1,u1),(l2,u2)),v) = (array22((u1-l1+1, u2-l2+1),v), bounds) fun sub2((A,((lb1:int,ub1:int),(lb2:int,ub2:int))),(k,l)) = sub22(A, (k-lb1, l-lb2)) fun update2((A,((lb1,_),(lb2,_))),(k,l), v) = update22(A,(k-lb1,l-lb2),v) fun bounds2(_,b) = b fun printarray2 (A as (M:real array2,((l1,u1),(l2,u2)))) = for {from=l1,step=1,to=u1} (fn i => (print "["; for {from=l2,step=1,to=u2-1} (fn j => print ( (* makestring(sub2(A,(i,j))) ^ *) ", ")); print ( (* makestring (sub2(A,(i,u2))) ^ *) "]\n"))) fun array1((l,u),v) = (array(u-l+1,v),(l,u)) fun sub1((A,(l:int,u:int)),i:int) = (op sub)(A,i-l) fun update1((A,(l,_)),i,v) = update(A,i-l,v) fun bounds1(_,b) = b (* * Specification of the state variable computation *) val grid_size = ((2,grid_max), (2,grid_max)) fun north (k,l) = (k-1,l) fun south (k,l) = (k+1,l) fun east (k,l) = (k,l+1) fun west (k,l) = (k,l-1) val northeast = north o east val southeast = south o east val northwest = north o west val southwest = south o west type dir = int * int -> int * int val farnorth : dir = north o north val farsouth : dir = south o south val fareast : dir = east o east val farwest : dir = west o west fun zone_A(k,l) = (k,l) fun zone_B(k,l) = (k+1,l) fun zone_C(k,l) = (k+1,l+1) fun zone_D(k,l) = (k,l+1) val zone_corner_northeast = north val zone_corner_northwest = northwest fun zone_corner_southeast zone = zone val zone_corner_southwest = west val ((kmin,kmax),(lmin,lmax)) = grid_size val dimension_all_nodes = ((kmin-1,kmax+1),(lmin-1,lmax+1)) fun for_all_nodes f = for {from=kmin-1, step=1, to=kmax+1} (fn k => for {from=lmin-1, step=1, to=lmax+1} (fn l => f k l)) val dimension_interior_nodes = ((kmin,kmax),(lmin,lmax)) fun for_interior_nodes f = for {from=kmin, step=1, to=kmax} (fn k => for {from=lmin, step=1, to=lmax} (fn l => f k l)) val dimension_all_zones = ((kmin,kmax+1),(lmin,lmax+1)) fun for_all_zones f = for {from=kmin, step=1, to=kmax+1} (fn k => for {from=lmin, step=1, to=lmax+1} (fn l => f (k,l))) val dimension_interior_zones = ((kmin+1,kmax),(lmin+1,lmax)) fun for_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun map_interior_nodes f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin,lmax)))) (from(kmin,kmax))) fun map_interior_zones f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin+1,lmax)))) (from(kmin+1,kmax))) fun for_north_ward_interior_zones f = for {from=kmax, step= ~1, to=kmin+1} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun for_west_ward_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmax, step= ~1, to=lmin+1} (fn l => f (k,l))) fun for_north_zones f = for {from=lmin, step=1, to=lmax+1} (fn l => f (kmin,l)) fun for_south_zones f = for {from=lmin+1, step=1, to=lmax} (fn l => f (kmax+1,l)) fun for_east_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmax+1)) fun for_west_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmin)) type 'a reflect_dir = int * int -> {size: int * int, value: 'a ref list} * ((int * int) * (int * int)) -> 'a fun reflect dir node A = sub2(A, dir node) val reflect_north : real reflect_dir = reflect north val reflect_south : real reflect_dir = reflect south val reflect_east : real reflect_dir = reflect east val reflect_west : real reflect_dir = reflect west fun for_north_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmin-1,l)) fun for_south_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmax+1,l)) fun for_east_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmax+1)) fun for_west_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmin-1)) val north_east_corner = (kmin-1,lmax+1) val north_west_corner = (kmin-1,lmin-1) val south_east_corner = (kmax+1,lmax+1) val south_west_corner = (kmax+1,lmin-1) val west_of_north_east = (kmin-1, lmax) val west_of_south_east = (kmax+1, lmax) val north_of_south_east = (kmax, lmax+1) val north_of_south_west = (kmax, lmin-1) (* * Initialization of parameters *) val constant_heat_source = 0.0 val deltat_maximum = 0.01 val specific_heat = 0.1 val p_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (1,1), 0.06698); M end val e_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (0,1), 0.1); M end val p_poly = array2(((1,4),(1,5)),p_coeffs) val e_poly = array2(((1,4),(1,5)), e_coeffs) val rho_table = let val V = array1((1,3), 0.0) in update1(V,2,1.0); update1(V,3,100.0); V end val theta_table = let val V = array1((1,4), 0.0) in update1(V,2,3.0); update1(V,3,300.0); update1(V,4,3000.0); V end val extract_energy_tables_from_constants = (e_poly,2,rho_table,theta_table) val extract_pressure_tables_from_constants = (p_poly,2,rho_table,theta_table) val nbc = let val M = array2(dimension_all_zones, 1) in for {from=lmin+1,step=1,to=lmax} (fn j => update2(M,(kmax+1, j),2)); update2(M,(kmin,lmin),4); update2(M,(kmin,lmax+1),4); update2(M,(kmax+1,lmin),4); update2(M,(kmax+1,lmax+1),4); M end val pbb = let val A = array1((1,4), 0.0) in update1(A,2,6.0); A end val pb = let val A = array1((1,4), 1.0) in update1(A,2,0.0); update1(A,3,0.0); A end val qb = pb val all_zero_nodes = array2(dimension_all_nodes, 0.0) val all_zero_zones = array2(dimension_all_zones, 0.0) (* * Positional Coordinates. (page 9-10) *) fun make_position_matrix interior_function = let val r' = array2(dimension_all_nodes, 0.0) val z' = array2(dimension_all_nodes, 0.0) fun boundary_position (rx,zx,ry,zy,ra,za) = let val (rax, zax) = (ra - rx, za - zx) val (ryx, zyx) = (ry - rx, zy - zx) val omega = 2.0*(rax*ryx + zax*zyx)/(ryx*ryx + zyx*zyx) val rb = rx - rax + omega*ryx val zb = zx - zax + omega*zyx in (rb, zb) end fun reflect_node (x_dir, y_dir, a_dir, node) = let val rx = reflect x_dir node r' val zx = reflect x_dir node z' val ry = reflect y_dir node r' val zy = reflect y_dir node z' val ra = reflect a_dir node r' val za = reflect a_dir node z' in boundary_position (rx, zx, ry, zy, ra, za) end fun u2 (rv,zv) n = (update2(r',n,rv); update2(z',n,zv)) in for_interior_nodes (fn k => fn l => u2 (interior_function (k,l)) (k,l)); for_north_nodes(fn n => u2 (reflect_node(south,southeast,farsouth,n)) n); for_south_nodes (fn n => u2(reflect_node(north,northeast,farnorth,n)) n); for_east_nodes (fn n => u2(reflect_node(west, southwest, farwest, n)) n); for_west_nodes (fn n => u2(reflect_node(east, southeast, fareast, n)) n); u2 (reflect_node(south, southwest, farsouth, west_of_north_east)) west_of_north_east; u2 (reflect_node(north, northwest, farnorth, west_of_south_east)) west_of_south_east; u2 (reflect_node(west, northwest, farwest, north_of_south_east)) north_of_south_east; u2 (reflect_node(east, northeast, fareast, north_of_south_west)) north_of_south_west; u2 (reflect_node(southwest, west, farwest, north_east_corner)) north_east_corner; u2 (reflect_node(northwest, west, farwest, south_east_corner)) south_east_corner; u2 (reflect_node(southeast, south, farsouth, north_west_corner)) north_west_corner; u2 (reflect_node(northeast, east, fareast, south_west_corner)) south_west_corner; (r',z') end (* * Physical Properties of a Zone (page 10) *) fun zone_area_vol ((r,z), zone) = let val (r1,z1)=(sub2(r,zone_corner_southwest zone), sub2(z,zone_corner_southwest zone)) val (r2,z2)=(sub2(r,zone_corner_southeast zone), sub2(z,zone_corner_southeast zone)) val (r3,z3)=(sub2(r,zone_corner_northeast zone), sub2(z,zone_corner_northeast zone)) val (r4,z4)=(sub2(r,zone_corner_northwest zone), sub2(z,zone_corner_northwest zone)) val area1 = (r2-r1)*(z3-z1) - (r3-r2)*(z3-z2) val radius1 = 0.3333 *(r1+r2+r3) val volume1 = area1 * radius1 val area2 = (r3-r1)*(z4-z3) - (r4-r3)*(z3-z1) val radius2 = 0.3333 *(r1+r3+r4) val volume2 = area2 * radius2 in (area1+area2, volume1+volume2) end (* * Velocity (page 8) *) fun make_velocity((u,w),(r,z),p,q,alpha,rho,delta_t: real) = let fun line_integral (p,z,node) : real = sub2(p,zone_A node)*(sub2(z,west node) - sub2(z,north node)) + sub2(p,zone_B node)*(sub2(z,south node) - sub2(z,west node)) + sub2(p,zone_C node)*(sub2(z,east node) - sub2(z,south node)) + sub2(p,zone_D node)*(sub2(z,north node) - sub2(z,east node)) fun regional_mass node = 0.5 * (sub2(rho, zone_A node)*sub2(alpha,zone_A node) + sub2(rho, zone_B node)*sub2(alpha,zone_B node) + sub2(rho, zone_C node)*sub2(alpha,zone_C node) + sub2(rho, zone_D node)*sub2(alpha,zone_D node)) fun velocity node = let val d = regional_mass node val n1 = ~(line_integral(p,z,node)) - line_integral(q,z,node) val n2 = line_integral(p,r,node) + line_integral(q,r,node) val u_dot = n1/d val w_dot = n2/d in (sub2(u,node)+delta_t*u_dot, sub2(w,node)+delta_t*w_dot) end val U = array2(dimension_interior_nodes,0.0) val W = array2(dimension_interior_nodes,0.0) in for_interior_nodes (fn k => fn l => let val (uv,wv) = velocity (k,l) in update2(U,(k,l),uv); update2(W,(k,l),wv) end); (U,W) end fun make_position ((r,z),delta_t:real,(u',w')) = let fun interior_position node = (sub2(r,node) + delta_t*sub2(u',node), sub2(z,node) + delta_t*sub2(w',node)) in make_position_matrix interior_position end fun make_area_density_volume(rho, s, x') = let val alpha' = array2(dimension_all_zones, 0.0) val s' = array2(dimension_all_zones, 0.0) val rho' = array2(dimension_all_zones, 0.0) fun interior_area zone = let val (area, vol) = zone_area_vol (x', zone) val density = sub2(rho,zone)*sub2(s,zone) / vol in (area,vol,density) end fun reflect_area_vol_density reflect_function = (reflect_function alpha',reflect_function s',reflect_function rho') fun update_asr (zone,(a,s,r)) = (update2(alpha',zone,a); update2(s',zone,s); update2(rho',zone,r)) fun r_area_vol_den (reflect_dir,zone) = let val asr = reflect_area_vol_density (reflect_dir zone) in update_asr(zone, asr) end in for_interior_zones (fn zone => update_asr(zone, interior_area zone)); for_south_zones (fn zone => r_area_vol_den(reflect_north, zone)); for_east_zones (fn zone => r_area_vol_den(reflect_west, zone)); for_west_zones (fn zone => r_area_vol_den(reflect_east, zone)); for_north_zones (fn zone => r_area_vol_den(reflect_south, zone)); (alpha', rho', s') end (* * Artifical Viscosity (page 11) *) fun make_viscosity(p,(u',w'),(r',z'), alpha',rho') = let fun interior_viscosity zone = let fun upper_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_northeast zone)) + (sub2(f,zone_corner_southwest zone) - sub2(f,zone_corner_northwest zone))) fun lower_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_southwest zone)) + (sub2(f,zone_corner_northeast zone) - sub2(f,zone_corner_northwest zone))) val xi = pow(upper_del r',2) + pow(upper_del z',2) val eta = pow(lower_del r',2) + pow(lower_del z',2) val upper_disc = (upper_del r')*(lower_del w') - (upper_del z')*(lower_del u') val lower_disc = (upper_del u')*(lower_del z') - (upper_del w') * (lower_del r') val upper_ubar = if upper_disc<0.0 then upper_disc/xi else 0.0 val lower_ubar = if lower_disc<0.0 then lower_disc/eta else 0.0 val gamma = 1.6 val speed_of_sound = gamma*sub2(p,zone)/sub2(rho',zone) val ubar = pow(upper_ubar,2) + pow(lower_ubar,2) val viscosity = sub2(rho',zone)*(1.5*ubar + 0.5*speed_of_sound*(Math.sqrt ubar)) val length = Math.sqrt(pow(upper_del r',2) + pow(lower_del r',2)) val courant_delta = 0.5* sub2(alpha',zone)/(speed_of_sound*length) in (viscosity, courant_delta) end val q' = array2(dimension_all_zones, 0.0) val d = array2(dimension_all_zones, 0.0) fun reflect_viscosity_cdelta (direction, zone) = sub2(q',direction zone) * sub1(qb, sub2(nbc,zone)) fun do_zones (dir,zone) = update2(q',zone,reflect_viscosity_cdelta (dir,zone)) in for_interior_zones (fn zone => let val (qv,dv) = interior_viscosity zone in update2(q',zone,qv); update2(d,zone,dv) end); for_south_zones (fn zone => do_zones(north,zone)); for_east_zones (fn zone => do_zones(west,zone)); for_west_zones (fn zone => do_zones(east,zone)); for_north_zones (fn zone => do_zones(south,zone)); (q', d) end (* * Pressure and Energy Polynomial (page 12) *) fun polynomial(G,degree,rho_table,theta_table,rho_value,theta_value) = let fun table_search (table, value : real) = let val (low, high) = bounds1 table fun search_down i = if value > sub1(table,i-1) then i else search_down (i-1) in if value>sub1(table,high) then high+1 else if value <= sub1(table,low) then low else search_down high end val rho_index = table_search(rho_table, rho_value) val theta_index = table_search(theta_table, theta_value) val A = sub2(G, (rho_index, theta_index)) fun from(n,m) = if n>m then [] else n::from(n+1,m) fun f(i,j) = sub2(A,(i,j))*pow(rho_value,i)*pow(theta_value,j) in sum_list (map (fn i => sum_list(map (fn j => f (i,j)) (from(0,degree)))) (from (0,degree))) end fun zonal_pressure (rho_value:real, theta_value:real) = let val (G,degree,rho_table,theta_table) = extract_pressure_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end fun zonal_energy (rho_value, theta_value) = let val (G, degree, rho_table, theta_table) = extract_energy_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end val dx = 0.000001 val tiny = 0.000001 fun newton_raphson (f,x) = let fun iter (x,fx) = if fx > tiny then let val fxdx = f(x+dx) val denom = fxdx - fx in if denom < tiny then iter(x,tiny) else iter(x-fx*dx/denom, fxdx) end else x in iter(x, f x) end (* * Temperature (page 13-14) *) fun make_temperature(p,epsilon,rho,theta,rho_prime,q_prime) = let fun interior_temperature zone = let val qkl = sub2(q_prime,zone) val rho_kl = sub2(rho,zone) val rho_prime_kl = sub2(rho_prime,zone) val tau_kl = (1.0 /rho_prime_kl - 1.0/rho_kl) fun energy_equation epsilon_kl theta_kl = epsilon_kl - zonal_energy(rho_kl,theta_kl) val epsilon_0 = sub2(epsilon,zone) fun revised_energy pkl = epsilon_0 - (pkl + qkl) * tau_kl fun revised_temperature epsilon_kl theta_kl = newton_raphson ((energy_equation epsilon_kl), theta_kl) fun revised_pressure theta_kl = zonal_pressure(rho_kl, theta_kl) val p_0 = sub2(p,zone) val theta_0 = sub2(theta,zone) val epsilon_1 = revised_energy p_0 val theta_1 = revised_temperature epsilon_1 theta_0 val p_1 = revised_pressure theta_1 val epsilon_2 = revised_energy p_1 val theta_2 = revised_temperature epsilon_2 theta_1 in theta_2 end val M = array2(dimension_all_zones, constant_heat_source) in for_interior_zones (fn zone => update2(M, zone, interior_temperature zone)); M end (* * Heat conduction *) fun make_cc(alpha_prime, theta_hat) = let fun interior_cc zone = (0.0001 * pow(sub2(theta_hat,zone),2) * (Math.sqrt (abs(sub2(theta_hat,zone)))) / sub2(alpha_prime,zone)) handle Sqrt => (print ("" (*Real.makestring (sub2(theta_hat, zone))*)); print ("\nzone =(" (* ^ makestring (#1 zone) *) ^ "," ^ (* makestring (#2 zone) ^ *) ")\n"); printarray2 theta_hat; raise Sqrt) val cc = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(cc,zone, interior_cc zone)); for_south_zones(fn zone => update2(cc,zone, reflect_north zone cc)); for_west_zones(fn zone => update2(cc,zone,reflect_east zone cc)); for_east_zones(fn zone => update2(cc,zone,reflect_west zone cc)); for_north_zones(fn zone => update2(cc,zone, reflect_south zone cc)); cc end fun make_sigma(deltat, rho_prime, alpha_prime) = let fun interior_sigma zone = sub2(rho_prime,zone)*sub2(alpha_prime,zone)*specific_heat/ deltat val M = array2(dimension_interior_zones, 0.0) fun ohandle zone = (print ( (* makestring (sub2(rho_prime, zone)) ^ *)" "); print ( (* makestring (sub2(alpha_prime, zone)) ^ *)" "); print ( (* makestring specific_heat ^ *) " "); print ( (* makestring deltat ^ *) "\n"); raise Overflow) in if !trace then print ("\t\tmake_sigma:deltat = " (* ^ makestring deltat *) ^ "\n") else (); (*** for_interior_zones(fn zone => update2(M,zone, interior_sigma zone)) **) for_interior_zones(fn zone => (update2(M,zone, interior_sigma zone) handle _ => (*old: Overflow => *) ohandle zone)); M end fun make_gamma ((r_prime,z_prime), cc, succeeding, adjacent) = let fun interior_gamma zone = let val r1 = sub2(r_prime, zone_corner_southeast zone) val z1 = sub2(z_prime, zone_corner_southeast zone) val r2 = sub2(r_prime, zone_corner_southeast (adjacent zone)) val z2 = sub2(z_prime, zone_corner_southeast (adjacent zone)) val cross_section = 0.5*(r1+r2)*(pow(r1 - r2,2)+pow(z1 - z2,2)) val (c1,c2) = (sub2(cc, zone), sub2(cc, succeeding zone)) val specific_conductivity = 2.0 * c1 * c2 / (c1 + c2) in cross_section * specific_conductivity end val M = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(M,zone,interior_gamma zone)); M end fun make_ab(theta, sigma, Gamma, preceding) = let val a = array2(dimension_all_zones, 0.0) val b = array2(dimension_all_zones, 0.0) fun interior_ab zone = let val denom = sub2(sigma, zone) + sub2(Gamma, zone) + sub2(Gamma, preceding zone) * (1.0 - sub2(a, preceding zone)) val nume1 = sub2(Gamma,zone) val nume2 = sub2(Gamma,preceding zone)*sub2(b,preceding zone) + sub2(sigma,zone) * sub2(theta,zone) in (nume1/denom, nume2 / denom) end val f = fn zone => update2(b,zone,sub2(theta,zone)) in for_north_zones f; for_south_zones f; for_west_zones f; for_east_zones f; for_interior_zones(fn zone => let val ab = interior_ab zone in update2(a,zone,#1 ab); update2(b,zone,#2 ab) end); (a,b) end fun make_theta (a, b, succeeding, int_zones) = let val theta = array2(dimension_all_zones, constant_heat_source) fun interior_theta zone = sub2(a,zone) * sub2(theta,succeeding zone)+ sub2(b,zone) in int_zones (fn (k,l) => update2(theta, (k,l), interior_theta (k,l))); theta end fun compute_heat_conduction(theta_hat, deltat, x', alpha', rho') = let val sigma = make_sigma(deltat, rho', alpha') val _ = if !trace then print "\tdone make_sigma\n" else () val cc = make_cc(alpha', theta_hat) val _ = if !trace then print "\tdone make_cc\n" else () val Gamma_k = make_gamma( x', cc, north, east) val _ = if !trace then print "\tdone make_gamma\n" else () val (a_k,b_k) = make_ab(theta_hat, sigma, Gamma_k, north) val _ = if !trace then print "\tdone make_ab\n" else () val theta_k = make_theta(a_k,b_k,south,for_north_ward_interior_zones) val _ = if !trace then print "\tdone make_theta\n" else () val Gamma_l = make_gamma(x', cc, west, south) val _ = if !trace then print "\tdone make_gamma\n" else () val (a_l,b_l) = make_ab(theta_k, sigma, Gamma_l, west) val _ = if !trace then print "\tdone make_ab\n" else () val theta_l = make_theta(a_l,b_l,east,for_west_ward_interior_zones) val _ = if !trace then print "\tdone make_theta\n" else () in (theta_l, Gamma_k, Gamma_l) end (* * Final Pressure and Energy calculation *) fun make_pressure(rho', theta') = let val p = array2(dimension_all_zones, 0.0) fun boundary_p(direction, zone) = sub1(pbb, sub2(nbc, zone)) + sub1(pb,sub2(nbc,zone)) * sub2(p, direction zone) in for_interior_zones (fn zone => update2(p,zone,zonal_pressure(sub2(rho',zone), sub2(theta',zone)))); for_south_zones(fn zone => update2(p,zone,boundary_p(north,zone))); for_east_zones(fn zone => update2(p,zone,boundary_p(west,zone))); for_west_zones(fn zone => update2(p,zone,boundary_p(east,zone))); for_north_zones(fn zone => update2(p,zone,boundary_p(south,zone))); p end fun make_energy(rho', theta') = let val epsilon' = array2(dimension_all_zones, 0.0) in for_interior_zones (fn zone => update2(epsilon', zone, zonal_energy(sub2(rho',zone), sub2(theta',zone)))); for_south_zones (fn zone => update2(epsilon',zone, reflect_north zone epsilon')); for_west_zones (fn zone => update2(epsilon',zone, reflect_east zone epsilon')); for_east_zones (fn zone => update2(epsilon',zone, reflect_west zone epsilon')); for_north_zones (fn zone => update2(epsilon',zone, reflect_south zone epsilon')); epsilon' end (* * Energy Error Calculation (page 20) *) fun compute_energy_error ((u',w'),(r',z'),p',q',epsilon',theta',rho',alpha', Gamma_k,Gamma_l,deltat) = let fun mass zone = sub2(rho',zone) * sub2(alpha',zone):real val internal_energy = sum_list (map_interior_zones (fn z => sub2(epsilon',z)*(mass z))) fun kinetic node = let val average_mass = 0.25*((mass (zone_A node)) + (mass (zone_B node)) + (mass (zone_C node)) + (mass (zone_D node))) val v_square = pow(sub2(u',node),2) + pow(sub2(w',node),2) in 0.5 * average_mass * v_square end val kinetic_energy = sum_list (map_interior_nodes kinetic) fun work_done (node1, node2) = let val (r1, r2) = (sub2(r',node1), sub2(r',node2)) val (z1, z2) = (sub2(z',node1), sub2(z',node2)) val (u1, u2) = (sub2(p',node1), sub2(p',node2)) val (w1, w2) = (sub2(z',node1), sub2(z',node2)) val (p1, p2) = (sub2(p',node1), sub2(p',node2)) val (q1, q2) = (sub2(q',node1), sub2(q',node2)) val force = 0.5*(p1+p2+q1+q2) val radius = 0.5* (r1+r2) val area = 0.5* ((r1-r2)*(u1-u2) - (z1-z2)*(w1-w2)) in force * radius * area * deltat end fun from(n,m) = if n > m then [] else n::from(n+1,m) val north_line = map (fn l => (west(kmin,l),(kmin,l))) (from(lmin+1,lmax)) val south_line = map (fn l => (west(kmax,l),(kmax,l))) (from(lmin+1,lmax)) val east_line = map (fn k => (south(k,lmax),(k,lmax))) (from(kmin+1,kmax)) val west_line = map (fn k => (south(k,lmin+1),(k,lmin+1))) (from(kmin+1,kmax)) val w1 = sum_list (map work_done north_line) val w2 = sum_list (map work_done south_line) val w3 = sum_list (map work_done east_line) val w4 = sum_list (map work_done west_line) val boundary_work = w1 + w2 + w3 + w4 fun heat_flow Gamma (zone1,zone2) = deltat * sub2(Gamma, zone1) * (sub2(theta',zone1) - sub2(theta',zone2)) val north_flow = let val k = kmin+1 in map (fn l => (north(k,l),(k,l))) (from(lmin+1,lmax)) end val south_flow = let val k = kmax in map (fn l => (south(k,l),(k,l))) (from(lmin+2,lmax-1)) end val east_flow = let val l = lmax in map (fn k => (east(k,l),(k,l))) (from(kmin+2,kmax)) end val west_flow = let val l = lmin+1 in map (fn k => (west(k,l),(k,l))) (from(kmin+2,kmax)) end val h1 = sum_list (map (heat_flow Gamma_k) north_flow) val h2 = sum_list (map (heat_flow Gamma_k) south_flow) val h3 = sum_list (map (heat_flow Gamma_l) east_flow) val h4 = sum_list (map (heat_flow Gamma_l) west_flow) val boundary_heat = h1 + h2 + h3 + h4 in internal_energy + kinetic_energy - boundary_heat - boundary_work end fun compute_time_step(d, theta_hat, theta') = let val deltat_courant = min_list (map_interior_zones (fn zone => sub2(d,zone))) val deltat_conduct = max_list (map_interior_zones (fn z => (abs(sub2(theta_hat,z) - sub2(theta', z))/ sub2(theta_hat,z)))) val deltat_minimum = min (deltat_courant, deltat_conduct) in min (deltat_maximum, deltat_minimum) end fun compute_initial_state () = let val v = (all_zero_nodes, all_zero_nodes) val x = let fun interior_position (k,l) = let val pi = 3.1415926535898 val rp = real (lmax - lmin) val z1 = real(10 + k - kmin) val zz = (~0.5 + real(l - lmin) / rp) * pi in (z1 * Math.cos zz, z1 * Math.sin zz) end in make_position_matrix interior_position end val (alpha,s) = let val (alpha_prime,s_prime) = let val A = array2(dimension_all_zones, 0.0) val S = array2(dimension_all_zones, 0.0) fun reflect_area_vol f = (f A, f S) fun u2 (f,z) = let val (a,s) = reflect_area_vol(f z) in update2(A,z,a); update2(S,z,s) end in for_interior_zones (fn z => let val (a,s) = zone_area_vol(x, z) in update2(A,z,a); update2(S,z,s) end); for_south_zones (fn z => u2 (reflect_north, z)); for_east_zones (fn z => u2 (reflect_west, z)); for_west_zones (fn z => u2 (reflect_east, z)); for_north_zones (fn z => u2 (reflect_south, z)); (A,S) end in (alpha_prime,s_prime) end val rho = let val R = array2(dimension_all_zones, 0.0) in for_all_zones (fn z => update2(R,z,1.4)); R end val theta = let val T = array2(dimension_all_zones, constant_heat_source) in for_interior_zones(fn z => update2(T,z,0.0001)); T end val p = make_pressure(rho, theta) val q = all_zero_zones val epsilon = make_energy(rho, theta) val deltat = 0.01 val c = 0.0 in (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) end fun compute_next_state state = let val (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) = state val v' = make_velocity (v, x, p, q, alpha, rho, deltat) val _ = if !trace then print "done make_velocity\n" else () val x' = make_position(x,deltat,v') handle _ => ( (* old: handle Overflow => *) printarray2 (#1 v'); printarray2 (#2 v'); raise Overflow) val _ = if !trace then print "done make_position\n" else () val (alpha',rho',s') = make_area_density_volume (rho, s , x') val _ = if !trace then print "done make_area_density_volume\n" else () val (q',d) = make_viscosity (p, v', x', alpha', rho') val _ = if !trace then print "done make_viscosity\n" else () val theta_hat = make_temperature (p, epsilon, rho, theta, rho', q') val _ = if !trace then print "done make_temperature\n" else () val (theta',Gamma_k,Gamma_l) = compute_heat_conduction (theta_hat, deltat, x', alpha', rho') val _ = if !trace then print "done compute_heat_conduction\n" else () val p' = make_pressure(rho', theta') val _ = if !trace then print "done make_pressure\n" else () val epsilon' = make_energy (rho', theta') val _ = if !trace then print "done make_energy\n" else () val c' = compute_energy_error (v', x', p', q', epsilon', theta', rho', alpha', Gamma_k, Gamma_l, deltat) val _ = if !trace then print "done compute_energy_error\n" else () val deltat' = compute_time_step (d, theta_hat, theta') val _ = if !trace then print "done compute_time_step\n\n" else () in (v',x',alpha',s',rho',p',q', epsilon',theta',deltat',c') end fun runit () = let fun iter (i,state) = if i = 0 then state else (print "."; iter(i-1, compute_next_state state)) in iter(step_count, compute_initial_state()) end fun print_state ((v1,v2),(r,z),alpha,s,rho,p,q,epsilon,theta,deltat,c) = ( print "Velocity matrices = \n"; printarray2 v1; print "\n\n"; printarray2 v2; print "\n\nPosition matrices = \n"; printarray2 r; print "\n\n"; printarray2 z; print "\n\nalpha = \n"; printarray2 alpha; print "\n\ns = \n"; printarray2 s; print "\n\nrho = \n"; printarray2 rho; print "\n\nPressure = \n"; printarray2 p; print "\n\nq = \n"; printarray2 q; print "\n\nepsilon = \n"; printarray2 epsilon; print "\n\ntheta = \n"; printarray2 theta; print ("delatat = " (* ^ Real.makestring deltat *) ^ "\n"); print ("c = " (* ^ Real.makestring c *) ^ "\n")) fun testit outstrm = print_state (runit()) fun doit () = let val (_, _, _, _, _, _, _, _, _, delta', c') = runit() val delta : int = floor (* truncate *) delta' val c : int = floor (* truncate *) (c' * 10000.0) val _ = print(int_to_string(c)) val _ = print("\n") val _ = print(int_to_string(delta)) val _ = print("\n") in if (c = 3072 andalso delta = ~61403) (* for grid_max = 30 *) (* (c = 6787 andalso delta = ~33093) *) then () else print("*** ERROR ***\n") (*old : IO.output (IO.std_err, "*** ERROR ***\n") *) end (* end; (* functor Simple *) structure Main = Simple(val grid_max=100 val step_count=1); *) val _ = doit(); mlton-20210117+dfsg/regression/kittmergesort.ok000066400000000000000000000000741416264345000214450ustar00rootroot00000000000000 List generated Doing tmergesort... Sorted 50000 numbers mlton-20210117+dfsg/regression/kittmergesort.sml000066400000000000000000000040531416264345000216300ustar00rootroot00000000000000(*kittmergesort.sml*) (* This is tmergesort taken from Paulson's book , page 99 *) (* The merge function has been modified slightly, to traverse and rebuild both arguments fully, even when the one argument is empty. This ensures that both recursive calls of tmergesort in itself can put their results in regions local to the body of tmergesort. One can show that the maximum number of live list elements is 3n, where n is the number of elements to be sorted. For n=50000 this should give an approximate memory usage of 3 * 50.000 list elements * 5 words/list element * 4 bytes/word= 3Mb. The actual memory usage (run24d) is 4.5Mb. The remaining 1.5Mb is probably largely due to the fact that merge puts stuff on the stack (as it is not tail recursive). *) exception Take and Drop fun take(0, _ ) = [] | take(n, x::xs) = x::take(n-1, xs) | take(n, []) = raise Take fun drop(0, l) = l | drop(n, x::xs) = drop(n-1, xs) | drop(n, []) = raise Drop fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[#"\n"])) fun snd(x,y) = y val a = 167 val m = 2147 fun nextrand(seed) = let val t = a*seed in t - (m*(t div m)) end fun randlist(n,seed,tail)= if n=0 then (seed,tail) else randlist(n-1, nextrand seed, seed::tail) fun length [] = 0 | length (_::xs) = 1+length xs fun merge([], ys) = (ys:int list)@[] | merge(xs, []) = xs @[] | merge(l as x::xs, r as y:: ys) = if x<= y then x::merge(xs, r) else y:: merge(l, ys) fun tmergesort [] = [] | tmergesort [x] = [x] | tmergesort xs = let val k = length xs div 2 in merge(tmergesort(take(k, xs)), tmergesort(drop(k, xs))) end val result = let val n = 50000 val xs = snd(randlist(n,1,[])) val _ = print "\n List generated\n" fun report msg = print(msg^"\n") in report "Doing tmergesort..."; tmergesort xs; report("Sorted " ^ int_to_string n ^ " numbers\n") end mlton-20210117+dfsg/regression/kkb36c.ok000066400000000000000000000445201416264345000176310ustar00rootroot000000000000001 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20210117+dfsg/regression/kkb36c.sml000066400000000000000000000574571416264345000200300ustar00rootroot00000000000000(*kitknuth_bendix36c.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) local fun eq_integer (x: int, y: int): bool = x = y fun eq_string (x: string, y: string): bool = x = y (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end (* fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end *) (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y (* fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end *) fun it_list f a [] = a | it_list f a (b::L) = it_list f (f a b) L fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) (* fun mem eq a = let fun mem_rec [] = false | mem_rec (b::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem eq a []= false | mem eq a (b::L) = eq(a,b) orelse mem eq a L fun union eq L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem eq a L2 then union_rec L else a :: union_rec L in union_rec L1 end (* fun mem_assoc eq a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem_assoc eq a [] = false | mem_assoc eq a ((b,_)::L) = eq(a,b) orelse mem_assoc eq a L fun assoc eq a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if eq(a,b) then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union eq L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem eq a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun map' f ([]:term list) : term list = [] | map' f (term::terms) = f term :: map' f terms fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map' copy_term l) fun eq_term x = (fn (Var i1, Var i2) => eq_integer(i1,i2) | (Term(s1,ts1),Term(s2,ts2)) => eq_string(s1,s2) andalso (eq_term_list(ts1,ts2)) | _ => false) x and eq_term_list x = (fn ([],[]) => true | (t1::ts1,t2::ts2) => eq_term(t1,t2) andalso eq_term_list(ts1,ts2) | _ => false) x fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union eq_integer (vars t) (vars_of_list r) (* fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc eq_integer n subst) handle _ => t in subst_rec end *) fun substitute subst (t as Term(oper,[])) = t | substitute subst (Term(oper,sons)) = Term(oper, map (substitute subst) sons) | substitute subst (t as (Var n)) = (assoc eq_integer n subst) handle _ => t fun change f = let fun change_rec (h::t) n = if eq_integer(n,1) then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc eq_integer v subst then if eq_term(M,assoc eq_integer v subst) then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = eq_integer(m,n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if eq_term(term1,term2) then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem eq_string oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem eq_string oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union eq_integer (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if eq_integer(k,n+1) then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun eq_ordering (Greater,Greater) = true (*lars *) | eq_ordering (Equal,Equal) = true | eq_ordering (NotGE,NotGE) = true | eq_ordering _ = false fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => eq_ordering(order (M,N),Greater)) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if eq_integer(r1,r2) then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if eq_term(M,N) then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (* r1908 *) (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in (* these applications of substitute put terms attop *) map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(interm:bool, n, rules, failures, p, eps) = (interm, n, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion (* [r2225] *)(arg as (done,n, rules, list, (k,l), eps)) = let fun kbrec (* [r2272] *) count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc eq_integer k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k (true, n, rules, [], (k,l), failures) (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else (false,n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if eq_term(M',N') then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if eq_integer(k,l) then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end fun kb_outer (* [r2517] *)(arg as (_, n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of result as (true,_, result_rules,_,_,_) => if false then arg else result | arg0 as (false, n', rules', failures', (k',l'), eqs') => kb_outer(let val arg1 = copy_arg arg0 in (*resetRegions arg0;*) copy_arg(arg1) end ) in (fn (_,_,x,_,_,_) => x)(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules (* letregion r2656 *) val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(false,n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); (* end r2683 *) ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () in (*local*) val _ = (doit(); doit(); doit()) end (*local*) mlton-20210117+dfsg/regression/kkb_eq.ok000066400000000000000000000445201416264345000200020ustar00rootroot000000000000001 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20210117+dfsg/regression/kkb_eq.sml000066400000000000000000000525141416264345000201660ustar00rootroot00000000000000(*kkb_eq.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) val _ = let (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) fun mem a = let fun mem_rec [] = false | mem_rec (b::L) = a = b orelse mem_rec L in mem_rec end fun union L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem a L2 then union_rec L else a :: union_rec L in union_rec L1 end fun mem_assoc a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = a = b orelse mem_rec L in mem_rec end fun assoc a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if a = b then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map copy_term l) fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union (vars t) (vars_of_list r) fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc n subst) handle _ => t in subst_rec end fun change f = let fun change_rec (h::t) n = if n = 1 then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc v subst then if M = assoc v subst then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = m = n | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if term1 = term2 then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if k = n+1 then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) (* inserted eta; 03/07/1996-Martin *) fun reduce L M t = substitute (matching L M) t (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => order (M,N) = Greater) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if r1 = r2 then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if M = N then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(n, rules, failures, p, eps) = (n+0, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) datatype ('a,'b) intermediate = FOUND of 'a | NOTFOUND of 'b (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion(arg as (n, rules, list, (k,l), eps)) = let fun kbrec count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k FOUND rules (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else NOTFOUND(n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if M' = N' then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if k = l then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end (* fun kb_outer n rules failures (k,l) other_failures = case kbrec 10 (copy_int n) (copy_rules rules) (copy_termpairlist failures) (copy_int_pair (k,l)) (copy_termpairlist other_failures) of FOUND rules => copy_rules rules | NOTFOUND (n', rules', failures', (k',l'), eqs') => kb_outer n' rules' failures' (k',l') eqs' *) fun kb_outer(arg as (n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of FOUND result_rules => if false then arg else (n, result_rules, failures, (k,l), other_failures) | NOTFOUND (n', rules', failures', (k',l'), eqs') => kb_outer(copy_arg(copy_arg((n', rules', failures', (k',l'), eqs')))) in #2(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () (* end (* Main *) *) in doit(); doit(); doit() end mlton-20210117+dfsg/regression/klife_eq.ok000066400000000000000000000024641416264345000203260ustar00rootroot00000000000000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 mlton-20210117+dfsg/regression/klife_eq.sml000066400000000000000000000151601416264345000205050ustar00rootroot00000000000000(*klife_eq.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) val _ = let (* structure Main : BMARK = struct *) fun map f [] = [] | map f (a::x) = f a :: map f x fun map_rec(f, []) = [] | map_rec(f, x::xs) = f x:: map_rec(f, xs) exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun filter p l= rev (accumulate (fn x => fn a => if p a then a::x else x) [] l) (*builds an intermediate list; the regions of this list are now made local (unlike in escape.sml) *) fun member x [] = false | member x (y::ys) = x =y orelse member x ys fun C f x y = f y x fun cons a x = a::x fun revonto x y = accumulate (C cons) x y (* eta expanded*) fun length x = (let fun count n a = n+1 in accumulate count 0 end) x (* eta expanded*) fun repeat f = let (* rptf moved into inner let *) fun check n = if n<0 then error "repeat<0" else n in fn x => fn y => let fun rptf n x = if n=0 then x else rptf(n-1)(f x) in rptf (check x) y end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") (*mads local mads*) fun copy_list[] = [] | copy_list((x,y)::rest) = (x,y):: copy_list rest fun lexordset [] = [] | lexordset (a::x) = lexordset (filter (lexless a) x) @ [a] @ lexordset (filter (lexgreater a) x) and lexless(a1:int,b1:int)(a2,b2) = if a2 not(member x y)) x (* unfolded o *) fun f xover x3 x2 x1 [] = diff x3 xover | f xover x3 x2 x1 (a::x) = if member a xover then f xover x3 x2 x1 x else if member a x3 then f (a::xover) x3 x2 x1 x else if member a x2 then f xover (a::x3) x2 x1 x else if member a x1 then f xover x3 (a::x2) x1 x else f xover x3 x2 (a::x1) x in f [] [] [] [] x end (* in *) fun copy_string s= implode(explode s) fun copy_bool true = true | copy_bool false = false abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN( copy_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and mk_nextgen_fn neighbours gen = if true then let val living = alive gen fun isalive x = copy_bool(member x living) (* eta *) fun liveneighbours x = length( filter isalive ( neighbours x)) (*eta*) fun twoorthree n = n = 2 orelse n = 3 val survivors = copy_list(filter (twoorthree o liveneighbours) living) val newnbrlist = copy_list(collect (fn z => filter (fn x => not( isalive x)) ( neighbours z)) living) (* unfolded o twice*) val newborn = copy_list(occurs3 newnbrlist) in mkgen (survivors @ newborn) end else gen end (* end*) fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1,y1)::more) (* coordinates to be plotted *) = if x = x1 then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = map_rec(copy_string,(plotfrom(xstart,ystart) "" (copy_list(filter good coordlist)))) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end fun rotate x = map (fn (x:int,y:int) => (y,~x)) x (* eta converted*) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if i = n then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun copy_whole_arg (p, g) = (p, copy g) fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = (print ".\n"; nthgen' (copy_whole_arg(copy_whole_arg(i-1,mk_nextgen_fn neighbours g)))) fun gun() = mkgen (* turned into function *) [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun iter n = #2(nthgen'(n,gun())) fun pr x = print x fun show(x) = (pr "starting printing\n"; app (fn s => (pr s; pr "\n"))(plot(alive x)); () ) (* had to uncurry show, as iter 50 gave attop also made it return a different unit *) (* fun doit () = show((fn _ => ()), (iter 50)) (* inserted call of iter *)*) fun testit _ = show(iter 50) (* inserted call of iter *) (* end (* Life *) *) (* val _ = (doit (); doit(); doit()); *) in testit (); testit (); testit () end mlton-20210117+dfsg/regression/known-case0.ok000066400000000000000000000000021416264345000206560ustar00rootroot000000000000001 mlton-20210117+dfsg/regression/known-case0.sml000066400000000000000000000003071416264345000210500ustar00rootroot00000000000000 fun nlist 0 = 0::nil | nlist n = n::(nlist (n-1)) val rec last = fn nil => 0 | x::nil => x | _ :: l => last l val n = 1 + (last (nlist (10))) val _ = print ((Int.toString n) ^ "\n") mlton-20210117+dfsg/regression/known-case1.ok000066400000000000000000000000021416264345000206570ustar00rootroot000000000000002 mlton-20210117+dfsg/regression/known-case1.sml000066400000000000000000000003341416264345000210510ustar00rootroot00000000000000 fun nlist 0 = 0::nil | nlist n = n::(nlist (n-1)) val rec last = fn nil => 0 | x::nil => x | y::x::nil => y | _ :: l => last l val n = 1 + (last (nlist (10))) val _ = print ((Int.toString n) ^ "\n") mlton-20210117+dfsg/regression/lambda-list-ref.ok000066400000000000000000000000001416264345000214720ustar00rootroot00000000000000mlton-20210117+dfsg/regression/lambda-list-ref.sml000066400000000000000000000003011416264345000216600ustar00rootroot00000000000000val r : (int -> int) list ref = ref [] val _ = r := (fn x => x + 1) :: ! r val _ = r := (fn x => x + 2) :: ! r val _ = app (fn f => (f 13; ())) (!r) mlton-20210117+dfsg/regression/layout.ok000066400000000000000000000000001416264345000200440ustar00rootroot00000000000000mlton-20210117+dfsg/regression/layout.sml000066400000000000000000000003141416264345000202360ustar00rootroot00000000000000 fun layout (cbs : (string * real) list list) : string = let val layoutcb = map (fn (con,_) => con) fun layoutdb cb = "{" ^ concat(layoutcb cb) ^ "}" in concat(map layoutdb cbs) end mlton-20210117+dfsg/regression/lex.ok000066400000000000000000000000001416264345000173170ustar00rootroot00000000000000mlton-20210117+dfsg/regression/lex.sml000066400000000000000000000001521416264345000175110ustar00rootroot00000000000000 fun token0(tokFn) = tokFn and token1(tokFn, value) = tokFn(value) val a = token1(fn _ => "1", 2) mlton-20210117+dfsg/regression/lib.sml000066400000000000000000000034111416264345000174700ustar00rootroot00000000000000datatype 'a Option = None | Some of 'a fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun toString(n) = implode(digits(n,[])) fun writeln s = print(s^"\n") fun percent(i: int, j: int)(*:int*) = floor((real i * 100.0)/real j) (* seek: (char -> bool) -> instream -> string list: seek(pred)(is) returns the list of characters obtained by reading from up to and including the first character which satisfies "pred". (If no such character exists, the empty list is returned. *) exception Impossible fun seek (pred: char -> bool) (is: TextIO.instream): char list = let fun readLoop() = (case explode (TextIO.inputN(is, 1)) of [] => [] | [char] => char :: (if pred char then [] else readLoop()) | _ => (print "lib.seek: impossible"; raise Impossible)) in readLoop() end fun readLn(is) = seek(fn ch => ch = #"\n")is (* dropwhile: ('a -> bool) -> 'a list -> 'a list; endomorphic *) fun dropwhile pred l = let fun drop_loop (l as []) = l | drop_loop (l as x::xs) = if pred x then drop_loop xs else l in drop_loop l end (* takewhile: ('a -> bool) -> 'a list -> 'a list; exomorphic *) fun takewhile pred l = let fun take_loop [] = [] | take_loop (l as x::xs) = if pred x then x:: take_loop xs else [] in take_loop l end fun isSpace(ch:char) = ch = #" " orelse ch = #"\t" orelse ch = #"\n" (* orelse ch= "\f" orelse ch = "\r" orelse ch = "\v"*) fun readWord(is): string Option = case implode(takewhile(not o isSpace) (dropwhile isSpace (readLn is))) of "" => None | word => Some word mlton-20210117+dfsg/regression/library/000077500000000000000000000000001416264345000176525ustar00rootroot00000000000000mlton-20210117+dfsg/regression/library/.gitignore000066400000000000000000000001341416264345000216400ustar00rootroot00000000000000/m?.h /m?.def /m?.dll /libm?.so /libm?.a /libm?.dylib /check.h /check /check.exe /mlmon.out mlton-20210117+dfsg/regression/library/Makefile000066400000000000000000000003611416264345000213120ustar00rootroot00000000000000## Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean mlton-20210117+dfsg/regression/library/check.c000066400000000000000000000031121416264345000210700ustar00rootroot00000000000000#include #include "check.h" #include "m5.h" #include "m4.h" #define DYNAMIC_LINK_M3 #include "m3.h" extern EXTERNAL void* libm3cSymPublic; extern EXTERNAL void* libm3cFnPublic(void); extern EXTERNAL void* libm4cSymPublic; extern EXTERNAL void* libm4cFnPublic(void); extern PUBLIC void* libm5cSymPublic; extern PUBLIC void* libm5cFnPublic(void); PRIVATE void* checkcSymPrivate = 0; PUBLIC void* checkcSymPublic = 0; PRIVATE void* checkcFnPrivate(void) { return &checkcSymPrivate; } PUBLIC void* checkcFnPublic(void) { return &checkcSymPublic; } PRIVATE void checkconfirmC(void) { assert (&checksmlFnPrivate == checksmlSymPrivate); assert (&checksmlFnPublic == checksmlSymPublic); assert (&checkcFnPrivate == checkcSymPrivate); assert (&checkcFnPublic == checkcSymPublic); assert (checksmlFnPrivate() == &checksmlSymPrivate); assert (checksmlFnPublic() == &checksmlSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); /* Check libm4 */ assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPublic() == &libm4smlSymPublic); assert (libm4cFnPublic() == &libm4cSymPublic); /* Check libm5 */ assert (&libm5smlFnPublic == libm5smlSymPublic); assert (&libm5cFnPublic == libm5cSymPublic); assert (libm5smlFnPublic() == &libm5smlSymPublic); assert (libm5cFnPublic() == &libm5cSymPublic); } mlton-20210117+dfsg/regression/library/check.ok000066400000000000000000000005231416264345000212620ustar00rootroot00000000000000check starting up libm5 starting up libm4 starting up libm3 starting up libm2 starting up libm1 starting up m1 pointer test complete. m2 pointer test complete. m3 pointer test complete. m4 pointer test complete. m5 pointer test complete. check pointer test complete. libm1 exits libm2 exits libm3 exits libm4 exits libm5 exits check exits mlton-20210117+dfsg/regression/library/check.sml000066400000000000000000000075231416264345000214530ustar00rootroot00000000000000val () = print "check starting up\n" val () = OS.Process.atExit (fn () => (_import "m5_close" public : unit -> unit; () ; print "check exits\n")) (* Prepare lib5 *) val () = _import "m5_open" public : int * string vector -> unit; (1, Vector.fromList ["libm5"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "checksmlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "checksmlSymPublic" alloc public : p s; val (_, setCI) = _symbol "checkcSymPrivate" private : p s; val (_, setCB) = _symbol "checkcSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "checksmlFnPrivate" private : e; (fn () => _address "checksmlSymPrivate" private : p;) val () = _export "checksmlFnPublic" public : e; (fn () => _address "checksmlSymPublic" public : p;) val getCI = _import "checkcFnPrivate" private : i; val getCB = _import "checkcFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "checksmlFnPrivate" private : p;) val () = setSB (_address "checksmlFnPublic" public : p;) val () = setCI (_address "checkcFnPrivate" private : p;) val () = setCB (_address "checkcFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "checkconfirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("checkcFnPrivate", getCI () = _address "checkcSymPrivate" private : p;) val () = check ("checkcFnPublic", getCB () = _address "checkcSymPublic" public : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" external : p s; val (CB, _) = _symbol "libm3cSymPublic" external : p s; val getSB = _import "libm3smlFnPublic" external : i; val getCB = _import "libm3cFnPublic" external : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" external : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" external : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" external : p;) (* Test symbols in libm4 *) val (SB, _) = _symbol "libm4smlSymPublic" external : p s; val (CB, _) = _symbol "libm4cSymPublic" external : p s; val getSB = _import "libm4smlFnPublic" external : i; val getCB = _import "libm4cFnPublic" external : i; (* Check function pointers *) val () = check ("libm4smlFnPublic", SB () = _address "libm4smlFnPublic" external : p;) val () = check ("libm4cFnPublic", CB () = _address "libm4cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm4smlSymPublic", getSB () = _address "libm4smlSymPublic" external : p;) val () = check ("libm4cSymPublic", getCB () = _address "libm4cSymPublic" external : p;) (* Test symbols in libm5 *) val (SB, _) = _symbol "libm5smlSymPublic" public : p s; val (CB, _) = _symbol "libm5cSymPublic" public : p s; val getSB = _import "libm5smlFnPublic" public : i; val getCB = _import "libm5cFnPublic" public : i; (* Check function pointers *) val () = check ("libm5smlFnPublic", SB () = _address "libm5smlFnPublic" public : p;) val () = check ("libm5cFnPublic", CB () = _address "libm5cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm5smlSymPublic", getSB () = _address "libm5smlSymPublic" public : p;) val () = check ("libm5cSymPublic", getCB () = _address "libm5cSymPublic" public : p;) val () = print "check pointer test complete.\n" mlton-20210117+dfsg/regression/library/libm1.c000066400000000000000000000011541416264345000210230ustar00rootroot00000000000000#include #define PART_OF_M1 #include "m1.h" PRIVATE void* libm1cSymPrivate = 0; PUBLIC void* libm1cSymPublic = 0; PRIVATE void* libm1cFnPrivate(void) { return &libm1cSymPrivate; } PUBLIC void* libm1cFnPublic(void) { return &libm1cSymPublic; } PRIVATE void libm1confirmC(void) { assert (&libm1smlFnPrivate == libm1smlSymPrivate); assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPrivate == libm1cSymPrivate); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPrivate() == &libm1smlSymPrivate); assert (libm1smlFnPublic() == &libm1smlSymPublic); } mlton-20210117+dfsg/regression/library/libm1.sml000066400000000000000000000033011416264345000213700ustar00rootroot00000000000000val () = print "libm1 starting up\n" val () = OS.Process.atExit (fn () => print "libm1 exits\n") type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm1smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm1smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm1cSymPrivate" private : p s; val (_, setCB) = _symbol "libm1cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm1smlFnPrivate" private : e; (fn () => _address "libm1smlSymPrivate" private : p;) val () = _export "libm1smlFnPublic" public : e; (fn () => _address "libm1smlSymPublic" public : p;) val getCI = _import "libm1cFnPrivate" private : i; val getCB = _import "libm1cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm1smlFnPrivate" private : p;) val () = setSB (_address "libm1smlFnPublic" public : p;) val () = setCI (_address "libm1cFnPrivate" private : p;) val () = setCB (_address "libm1cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm1confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm1cFnPrivate", getCI () = _address "libm1cSymPrivate" private : p;) val () = check ("libm1cFnPublic", getCB () = _address "libm1cSymPublic" public : p;) val () = print "m1 pointer test complete.\n" mlton-20210117+dfsg/regression/library/libm2.c000066400000000000000000000017101416264345000210220ustar00rootroot00000000000000#include #define PART_OF_M2 #include "m2.h" #define STATIC_LINK_M1 #include "m1.h" extern PUBLIC void* libm1cSymPublic; extern PUBLIC void* libm1cFnPublic(void); PRIVATE void* libm2cSymPrivate = 0; PUBLIC void* libm2cSymPublic = 0; PRIVATE void* libm2cFnPrivate(void) { return &libm2cSymPrivate; } PUBLIC void* libm2cFnPublic(void) { return &libm2cSymPublic; } PRIVATE void libm2confirmC(void) { assert (&libm2smlFnPrivate == libm2smlSymPrivate); assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPrivate == libm2cSymPrivate); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPrivate() == &libm2smlSymPrivate); assert (libm2smlFnPublic() == &libm2smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); } mlton-20210117+dfsg/regression/library/libm2.sml000066400000000000000000000050311416264345000213730ustar00rootroot00000000000000val () = print "libm2 starting up\n" val () = OS.Process.atExit (fn () => (_import "m1_close" public : unit -> unit; () ; print "libm2 exits\n")) (* Prepare libm1 *) val () = _import "m1_open" public : int * string vector -> unit; (1, Vector.fromList ["libm1"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm2smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm2smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm2cSymPrivate" private : p s; val (_, setCB) = _symbol "libm2cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm2smlFnPrivate" private : e; (fn () => _address "libm2smlSymPrivate" private : p;) val () = _export "libm2smlFnPublic" public : e; (fn () => _address "libm2smlSymPublic" public : p;) val getCI = _import "libm2cFnPrivate" private : i; val getCB = _import "libm2cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm2smlFnPrivate" private : p;) val () = setSB (_address "libm2smlFnPublic" public : p;) val () = setCI (_address "libm2cFnPrivate" private : p;) val () = setCB (_address "libm2cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm2confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm2cFnPrivate", getCI () = _address "libm2cSymPrivate" private : p;) val () = check ("libm2cFnPublic", getCB () = _address "libm2cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" public : p s; val (CB, _) = _symbol "libm1cSymPublic" public : p s; val getSB = _import "libm1smlFnPublic" public : i; val getCB = _import "libm1cFnPublic" public : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" public : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" public : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" public : p;) val () = print "m2 pointer test complete.\n" mlton-20210117+dfsg/regression/library/libm3.c000066400000000000000000000024251416264345000210270ustar00rootroot00000000000000#include #define PART_OF_M3 #include "m3.h" #include "m2.h" #define DYNAMIC_LINK_M1 #include "m1.h" extern EXTERNAL void* libm1cSymPublic; extern EXTERNAL void* libm1cFnPublic(void); extern EXTERNAL void* libm2cSymPublic; extern EXTERNAL void* libm2cFnPublic(void); PRIVATE void* libm3cSymPrivate = 0; PUBLIC void* libm3cSymPublic = 0; PRIVATE void* libm3cFnPrivate(void) { return &libm3cSymPrivate; } PUBLIC void* libm3cFnPublic(void) { return &libm3cSymPublic; } PRIVATE void libm3confirmC(void) { assert (&libm3smlFnPrivate == libm3smlSymPrivate); assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPrivate == libm3cSymPrivate); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPrivate() == &libm3smlSymPrivate); assert (libm3smlFnPublic() == &libm3smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); /* Check libm2 */ assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPublic() == &libm2smlSymPublic); assert (libm2cFnPublic() == &libm2cSymPublic); } mlton-20210117+dfsg/regression/library/libm3.sml000066400000000000000000000063071416264345000214030ustar00rootroot00000000000000val () = print "libm3 starting up\n" val () = OS.Process.atExit (fn () => (_import "m2_close" public : unit -> unit; () ; print "libm3 exits\n")) (* Prepare libm2 *) val () = _import "m2_open" external : int * string vector -> unit; (1, Vector.fromList ["libm2"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm3smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm3smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm3cSymPrivate" private : p s; val (_, setCB) = _symbol "libm3cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm3smlFnPrivate" private : e; (fn () => _address "libm3smlSymPrivate" private : p;) val () = _export "libm3smlFnPublic" public : e; (fn () => _address "libm3smlSymPublic" public : p;) val getCI = _import "libm3cFnPrivate" private : i; val getCB = _import "libm3cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm3smlFnPrivate" private : p;) val () = setSB (_address "libm3smlFnPublic" public : p;) val () = setCI (_address "libm3cFnPrivate" private : p;) val () = setCB (_address "libm3cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm3confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm3cFnPrivate", getCI () = _address "libm3cSymPrivate" private : p;) val () = check ("libm3cFnPublic", getCB () = _address "libm3cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" external : p s; val (CB, _) = _symbol "libm1cSymPublic" external : p s; val getSB = _import "libm1smlFnPublic" external : i; val getCB = _import "libm1cFnPublic" external : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" external : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" external : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" external : p;) (* Test symbols in libm2 *) val (SB, _) = _symbol "libm2smlSymPublic" external : p s; val (CB, _) = _symbol "libm2cSymPublic" external : p s; val getSB = _import "libm2smlFnPublic" external : i; val getCB = _import "libm2cFnPublic" external : i; (* Check function pointers *) val () = check ("libm2smlFnPublic", SB () = _address "libm2smlFnPublic" external : p;) val () = check ("libm2cFnPublic", CB () = _address "libm2cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm2smlSymPublic", getSB () = _address "libm2smlSymPublic" external : p;) val () = check ("libm2cSymPublic", getCB () = _address "libm2cSymPublic" external : p;) val () = print "m3 pointer test complete.\n" mlton-20210117+dfsg/regression/library/libm4.c000066400000000000000000000031611416264345000210260ustar00rootroot00000000000000#include #define PART_OF_M4 #include "m4.h" #define STATIC_LINK_M3 #include "m3.h" #include "m2.h" #define DYNAMIC_LINK_M1 #include "m1.h" extern EXTERNAL void* libm1cSymPublic; extern EXTERNAL void* libm1cFnPublic(void); extern EXTERNAL void* libm2cSymPublic; extern EXTERNAL void* libm2cFnPublic(void); extern PUBLIC void* libm3cSymPublic; extern PUBLIC void* libm3cFnPublic(void); PRIVATE void* libm4cSymPrivate = 0; PUBLIC void* libm4cSymPublic = 0; PRIVATE void* libm4cFnPrivate(void) { return &libm4cSymPrivate; } PUBLIC void* libm4cFnPublic(void) { return &libm4cSymPublic; } PRIVATE void libm4confirmC(void) { assert (&libm4smlFnPrivate == libm4smlSymPrivate); assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPrivate == libm4cSymPrivate); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPrivate() == &libm4smlSymPrivate); assert (libm4smlFnPublic() == &libm4smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); /* Check libm2 */ assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPublic() == &libm2smlSymPublic); assert (libm2cFnPublic() == &libm2cSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); } mlton-20210117+dfsg/regression/library/libm4.sml000066400000000000000000000075211416264345000214030ustar00rootroot00000000000000val () = print "libm4 starting up\n" val () = OS.Process.atExit (fn () => (_import "m3_close" public : unit -> unit; () ; print "libm4 exits\n")) (* Prepare libm3 *) val () = _import "m3_open" public : int * string vector -> unit; (1, Vector.fromList ["libm3"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm4smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm4smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm4cSymPrivate" private : p s; val (_, setCB) = _symbol "libm4cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm4smlFnPrivate" private : e; (fn () => _address "libm4smlSymPrivate" private : p;) val () = _export "libm4smlFnPublic" public : e; (fn () => _address "libm4smlSymPublic" public : p;) val getCI = _import "libm4cFnPrivate" private : i; val getCB = _import "libm4cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm4smlFnPrivate" private : p;) val () = setSB (_address "libm4smlFnPublic" public : p;) val () = setCI (_address "libm4cFnPrivate" private : p;) val () = setCB (_address "libm4cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm4confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm4cFnPrivate", getCI () = _address "libm4cSymPrivate" private : p;) val () = check ("libm4cFnPublic", getCB () = _address "libm4cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" external : p s; val (CB, _) = _symbol "libm1cSymPublic" external : p s; val getSB = _import "libm1smlFnPublic" external : i; val getCB = _import "libm1cFnPublic" external : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" external : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" external : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" external : p;) (* Test symbols in libm2 *) val (SB, _) = _symbol "libm2smlSymPublic" external : p s; val (CB, _) = _symbol "libm2cSymPublic" external : p s; val getSB = _import "libm2smlFnPublic" external : i; val getCB = _import "libm2cFnPublic" external : i; (* Check function pointers *) val () = check ("libm2smlFnPublic", SB () = _address "libm2smlFnPublic" external : p;) val () = check ("libm2cFnPublic", CB () = _address "libm2cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm2smlSymPublic", getSB () = _address "libm2smlSymPublic" external : p;) val () = check ("libm2cSymPublic", getCB () = _address "libm2cSymPublic" external : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" public : p s; val (CB, _) = _symbol "libm3cSymPublic" public : p s; val getSB = _import "libm3smlFnPublic" public : i; val getCB = _import "libm3cFnPublic" public : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" public : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" public : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" public : p;) val () = print "m4 pointer test complete.\n" mlton-20210117+dfsg/regression/library/libm5.c000066400000000000000000000024251416264345000210310ustar00rootroot00000000000000#include #define PART_OF_M5 #include "m5.h" #include "m4.h" #define DYNAMIC_LINK_M3 #include "m3.h" extern EXTERNAL void* libm3cSymPublic; extern EXTERNAL void* libm3cFnPublic(void); extern EXTERNAL void* libm4cSymPublic; extern EXTERNAL void* libm4cFnPublic(void); PRIVATE void* libm5cSymPrivate = 0; PUBLIC void* libm5cSymPublic = 0; PRIVATE void* libm5cFnPrivate(void) { return &libm5cSymPrivate; } PUBLIC void* libm5cFnPublic(void) { return &libm5cSymPublic; } PRIVATE void libm5confirmC(void) { assert (&libm5smlFnPrivate == libm5smlSymPrivate); assert (&libm5smlFnPublic == libm5smlSymPublic); assert (&libm5cFnPrivate == libm5cSymPrivate); assert (&libm5cFnPublic == libm5cSymPublic); assert (libm5smlFnPrivate() == &libm5smlSymPrivate); assert (libm5smlFnPublic() == &libm5smlSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); /* Check libm4 */ assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPublic() == &libm4smlSymPublic); assert (libm4cFnPublic() == &libm4cSymPublic); } mlton-20210117+dfsg/regression/library/libm5.sml000066400000000000000000000063071416264345000214050ustar00rootroot00000000000000val () = print "libm5 starting up\n" val () = OS.Process.atExit (fn () => (_import "m4_close" public : unit -> unit; () ; print "libm5 exits\n")) (* Prepare libm4 *) val () = _import "m4_open" external : int * string vector -> unit; (1, Vector.fromList ["libm4"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm5smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm5smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm5cSymPrivate" private : p s; val (_, setCB) = _symbol "libm5cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm5smlFnPrivate" private : e; (fn () => _address "libm5smlSymPrivate" private : p;) val () = _export "libm5smlFnPublic" public : e; (fn () => _address "libm5smlSymPublic" public : p;) val getCI = _import "libm5cFnPrivate" private : i; val getCB = _import "libm5cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm5smlFnPrivate" private : p;) val () = setSB (_address "libm5smlFnPublic" public : p;) val () = setCI (_address "libm5cFnPrivate" private : p;) val () = setCB (_address "libm5cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm5confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm5cFnPrivate", getCI () = _address "libm5cSymPrivate" private : p;) val () = check ("libm5cFnPublic", getCB () = _address "libm5cSymPublic" public : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" external : p s; val (CB, _) = _symbol "libm3cSymPublic" external : p s; val getSB = _import "libm3smlFnPublic" external : i; val getCB = _import "libm3cFnPublic" external : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" external : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" external : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" external : p;) (* Test symbols in libm4 *) val (SB, _) = _symbol "libm4smlSymPublic" external : p s; val (CB, _) = _symbol "libm4cSymPublic" external : p s; val getSB = _import "libm4smlFnPublic" external : i; val getCB = _import "libm4cFnPublic" external : i; (* Check function pointers *) val () = check ("libm4smlFnPublic", SB () = _address "libm4smlFnPublic" external : p;) val () = check ("libm4cFnPublic", CB () = _address "libm4cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm4smlSymPublic", getSB () = _address "libm4smlSymPublic" external : p;) val () = check ("libm4cSymPublic", getCB () = _address "libm4cSymPublic" external : p;) val () = print "m5 pointer test complete.\n" mlton-20210117+dfsg/regression/library/library-all000077500000000000000000000007421416264345000220150ustar00rootroot00000000000000#! /usr/bin/env bash set -e ./library-test "$@" -debug true ./library-test "$@" -debug true -codegen bytecode ./library-test "$@" -debug true -codegen c ./library-test "$@" ./library-test "$@" -codegen bytecode ./library-test "$@" -codegen c # Time profiling messes around with labels. Make sure this works. ./library-test "$@" -profile time ./library-test "$@" -profile time -codegen bytecode ./library-test "$@" -profile time -codegen c echo '********** ALL PASS **********' mlton-20210117+dfsg/regression/library/library-test000077500000000000000000000015621416264345000222250ustar00rootroot00000000000000#! /usr/bin/env bash ML=../../build/bin/mlton O[0]='-default-ann' O[1]='allowFFI true' O[2]='-link-opt' O[3]='-L.' LIB="-link-opt -l" # Enable finding libraries locally export LD_LIBRARY_PATH=. set -ex # Compile DSO #1 $ML "${O[@]}" "$@" -format libarchive libm1.sml libm1.c $ML "${O[@]}" "$@" ${LIB}m1 -format library libm2.sml libm2.c # Compile DSO #2 $ML "${O[@]}" "$@" -format libarchive libm3.sml libm3.c $ML "${O[@]}" "$@" ${LIB}m3 ${LIB}m2 -format library libm4.sml libm4.c # Compile executable $ML "${O[@]}" "$@" -format archive libm5.sml libm5.c $ML "${O[@]}" "$@" ${LIB}m5 ${LIB}m4 -format executable \ -default-ann 'allowFFI true' -export-header check.h check.sml check.c # Check that symbols resolved correctly ./check | sed '' > check.log # Confirm expected output set +x diff -u check.ok check.log echo '********** PASS:' "$@" '**********' rm -f check.log mlton-20210117+dfsg/regression/life.ok000066400000000000000000001656461416264345000175020ustar00rootroot00000000000000 0 0 0 0 00 0 00 0 00 0000 0 00 0 00 0000 0 0 0 0 0 00 0 0000 00 0000 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 0000 0 0 00 0 0 00 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 0 0 00 00 00 00 00 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 0 0 00 0 0 0 00 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 0 0 00 00 00 00 0 00 00 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 0 0 00 0 0 00 00 00 0 00 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 0 0 0 00 000 00 00 0000 00 00 0000 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 0 0 00 00 0 00 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 000 0 000 00 00 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 0 00 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 0000 00 000 00 0 000 00 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 0 0 000 0 00 0 0 0 00 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 00 0 0 0 000 00 0 0 00 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 00 0 0 00 0 0 0 000 0 0 00 0 00 0 00 000 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0 00 0 00 0 00 0 0 0 0 00 00 0 0 00 00 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 0 0 0 00 0000 00 00 0 0000 0 0 00 0 0 00 0 0000 00 0000 0 0 0000 00 00 0 0 00 0000 0 0 0 00 0 0 000 00 0 0 0 00 0 0 00 0 0 0000 0 0 00 0 0 00 0 0 0 0 00 0 0 0 000 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 0 0 0 00 00 000 0 0 00 00 00 0 0 00 0 0 00 0 0 0 00 0 0 0 00 00 0 0 0 0 00 0 0 0 00 0 0 0 0 0 0 00 00 0 00 0 0 0 00 00 00 00 00 0 00 0 0 0 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 00 0 00 00 0 0 0 00 000 0 0 0 00000 0 0 0 0 0 0 0000 0 00 0 00 0 0 0 0 0 000 0 0 00 00 00 0 0 00 0000 0 0 00 00 000 00 0 0 00000 00 00 0 0 0 000 0 0 00 0 00 0 0 00 0 0 00000 00 0 0 000 0 0 00 00 0 00 0 0 0 0 000 0 0 00 0 0 0 0 0 0 00 00 00 0 00 0 00 000 000 0 0 00 00 0 0 00 0 0 00 0 0 00 0 0 0 0 00 00 00 00 0 00 0 0 00 00 0 0 0 0 0 0 0 00 0 0 0 0 00 0 0 00 000 0 0 0 0000 0 0 0000 00 00 0 0 0 0 00 0000 000 0 0000 000 0 0 0 0 000 00 0 0 00 0 00 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 00 00 0 0 0 0 0 0 00 00 00 00 00 00 00 00 0 0 000 000 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 0 0 000 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 000 00 000 0 0 0 0 0 00 0 0 0 00 00 00 0 0 00 00 0 00 0 0 0 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0 0 00 0 00 0 00 0000 00 0 00 0000 0 0 0 0 0 0 0 0000 0000 0 0 0 0 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 0000 0 0 0 0 0 0 0 0 00 0 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 0 0 00 00 00 0 0 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 0 0 00 00 00 0 00 0 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 0 0 00 0 0 00 00 0 0 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 0 0 0 00 000 00 0000 00 0000 0 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 0 0 00 0 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 000 0 000 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 0000 00 000 0 000 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 0 0 000 0 0 0 0 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 00 0 0 0 000 0 0 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 00 0 0 00 0 0 0 000 0 0 0 00 0 000 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0 00 0 00 0 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 0 0 0 00 0000 00 00 0 0000 0 0 00 0 0 0 0000 0000 0 0 0000 00 00 0 0 00 0000 0 0 0 00 0 0 000 00 0 0 0 00 0 0 00 0 0 0000 0 0 0 0 0 0 0 0 00 0 0 0 000 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 00 00 0 0 0 0 0 00 00 00 00 0 0 0 00 00 000 0 0 00 00 00 0 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 0 00 0 0 0 0 0 0 00 00 0 00 0 0 0 00 00 00 00 0 0 0 0 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 00 000 0 0 0 00000 0 0 0 0 0 0 0000 0 00 0 00 0 0 0 0 0 000 0 0 00 00 0 0 0000 0 0 00 00 000 00 0 0 00000 00 00 0 0 0 000 0 0 00 0 00 0 0 00 0 0 00 00 0 0 0 0 00 00 0 00 0 0 0 0 000 0 0 00 0 0 0 0 0 0 00 00 00 0 00 00 000 000 00 00 00 00 00 0 00 0 0 00 0 0 0 0 00 00 00 00 0 00 0 0 00 00 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 000 0 0 0 0000 0 0 0000 00 00 0 0 0 0 00 0000 000 00 0000 000 0 0 0 000 00 0 0 00 0 00 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 0 0 00 0 0 00 00 0 0 0 0 0 0 00 00 00 00 00 00 00 00 00 0 0 000 0 0 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 0 0 000 00 0 0 0 00 00 0 0 0 0 0 0 0 0 00 00 000 00 000 0 0 0 0 0 00 0 0 0 00 00 00 0 0 00 00 0 00 00 0 0 00 0 0 0 0 00 00 0 0 0 0 00 0 0 0 0 0 0 00 0 00 0 00 0000 00 0 00 0000 00 0 0 0 0 0 0 0 0000 00 0000 0 0 0 0 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 00 0000 0 0 0 0 0 0 00 0 0 0 0 00 0 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 00 0 0 00 0 0 00 00 00 0 0 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 00 0 0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 00 0 0 00 00 0 0 00 0 00 00 0 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 00 0 0 00 0 0 0 0 00 00 0 00 0 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 00 0 0 0 00 000 0 0 00 0000 00 00 0000 0 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 00 0 0 0 0 00 0 00 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 00 000 0 000 0 0 00 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 00 0 0 00 0 0 0 0 0 0 0 00 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 00 0000 00 000 0 0 0 000 00 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 00 0 0 000 0 0 0 0 0 0 00 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 000 00 0 0 0 00 0 0 0 0 000 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 0 00 0 0 00 0000 0 0 000 0 0 0 00 0000 000 0 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0000 00 0 00 0 00000 0 0 0 0 0 0 0 00000 0 0000 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 00 0 0 0 00 0 00 0 00 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 00 0 0000 00 00 0 0 00 0000 0 0 00 00 0 0 000 00 0 000 0 00 0 0 00 0 00 00 0000 00 0 00 00 000 0 0 00 00 0 0 0 000 0 0 0 0 00 00 00 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 00 00 00 00 0 0 0 00 00 000 00 00 0 00 00 00 0 0 0 00 00 00 0 0 0 0 00 00 0 0 00 00 0 0 0 0 00 0 0 000 00 0 0 0 0 0 0 0 00 00 0 0000 0 00 0 0 00 00 00 0000 0 00 0 0 0 000 00 00 0 0 00 0 00 000 0 0 0 0000 0 000 0 00 000 00 000 0 00 0 0 0 0 0 0 00 0 00 0 0 0 00 0 0 0 00 000 0 0 0 0 00000 0 0 00 0 0 0 00 00 00 0 00 0 00 00 0 0 0 00 00 00 00 00 00 00 00 00 0 0 00 00 000 00 0 0 00 00000 00 0 0 0 0 000 00 0000000 00 0 00 00 0 00 0 00 00 0 00 0000000 0 00 00 0 00 0 0 0 0 000 00 0 0 00 0 00 000000 0 0 0 0 00 0 0000 00 00 0 0 00 0 000 000 00 0 00 0 00 0 0000 0 000000 0 00 0 0 0 0 0 00 0000 00 00 0 000 0 00 0 00 000 0 00 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 000 0 0000 0 00 0 0000 00 0 0 0 0000 00 0 00 00 0 0 000 0 0 00 0000 000 0000 000 0 00 00 0 0 0000 0 0 00 0 0 00 0 0 000 00000 0 0 0 0 00 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 000 0 00 0 0 0 0000 00 0 0 0 0 0 0 000 00 0 00 0 00 00 00 000 00 00 0 0 0 0 00 0 000 0 0000 0 00 00 0 0 0 000 00 0 0 0 0 00 0 0 0 0 00 0 0 00 000 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 00 0 0 0 00 0 0 0 0 00 00 00 0 0 00 00 00 0 000 0 0 0 0 000 0 00 00 0 0 0 00 0 00 0 0 00 00 0 0 0 00 00 0 0 00 0 00 0 00 00 00 0 00 00 0 00 0 0 0 0 0 0 0 000 0 0 00 00 0 0 00000 0000 0 0000 0 00 0 0 0 0 00 000 0 0 00 0 0 00 00 0 0 00 0 0 0000 000 000 0 0 0 0 0 00 000000 00 00 0 0 0 0 0 0 0 0 00 0 00 0 0 00 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 00 0000 0000000 0 0 0000 00 0 00 00 00 00 0 00 00 000 00 0 00 00 00 00 00 00000 0 00 000 0 000 0 0 00 0 00 0 0 0 00 00 0 0 0 000 0 0 0 00 0 0 00 0 0 0 0 0 00 0 00 0 0 0 0 0 0 0 00 0 000 0 0 0 00 0 00 00 0 0 0 0 00 00 000 00 0 00 000 0 0 00 000 00 00 0 0 0 0 000 00 0 0 000 00 0 0 000 0 0 0 00 0 00 00 00 0 0 0 00 0 00 00 0 0 0 0 0 0 00 000 0 0 000 0 00 0 0 0 0 00 00 0 0 00 00 00 00 000 0 0 00 00 00 00 00 0 0 000 00 000 0 000 0 0 0 00 0 00 0 0 000 0 0 00 00 000 00 0 0 0 0 00 0 00 00 00 0 000 0 0 0 00 0 0 0 000 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 0 0 0 000 0 0 00 00 0 0 0 00 0 00 0 0 00 00 0000 0 0 0000 00 000 00 0 0 0 0 00 00 0000 00 00 0 0000 0 0 0 0 00 00 0 00 00 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 00 0 00 00 0 0 00 0 000 0 0 0 0 0 0 000 0 0 0000 0 00 0 0 00 0 0 00 00 000 00 00 0 0 0 00 00 00 000 0 0 0 000 0 0 0 0 00 0 0 000 000 0 0 00 0 0 0 0 00 0 0 000 0 0 0 0 0 00 0 00 0 0 0 0 0 0 00 0 0 00 0 0 0 0 0 0 000 0 0 0 0 0 0 000 0 0 00 0 0 0 0 00 0 0 0 0 0 0 0 00 00 0 00 00 00 00 0 000 00 0 00 00 0 0 0 0 0 00 00 0 0 00 000 0 00 0000 00 0 0 0 000 0 0 0 0 00 0 0 0 0 00 0 00 00 00 00 0 0 0 0 00 00 0 0 0000 000 0 0 0 0 0 000 0 00 0 0 0 0 0 0 0 00 0000 0 0 0 0 0 0 0000 000 0 0 0 00 00 000 00 0 0 000 0 00 0 0 00 0 0 00 0 00000 0 0000 0 0 0 00 0 000 0 0 0 00 0 000 0 0000 0 0 00 000 0 0 0 00 0 0 0 0 0 0 00 00 0 0 00 0 0 00 00 0 0 00 0000 0 0 00 0 000 00 00 0 00 0 0 00 00 000 000 0 0 0 0 0 0 00 00 00 0 00 00 0 0 0 00 00 000 00 0 000 0 0 00 00 00 00 00 00 0 00 00 00 0 0 0 0 0 000 0 0 0 0 000 00 0 0 0 000 00 0000 0 00 0 0000 0 0 000 0 00 0 0 00 0 0 0 0 000000000 00 00 00 00 0 00 0 0 0 0 00 000 00 0 00 0 0 0 0 0 0 00 00 00 0 0 0 0 00 0 0 00 0 0 0 000 0 00 000 0 0000 0 000 000000 00 00 000 00 000 00000 0 000 0 0 0 0 0 0 0000 0 00 00000 00 0 0 0 000000 00 0 00 000 00 0 0 0 0 0 00 0 00 0 0 0 00 00000 0 0 0 00 0 0 0 0 00000 0000 0 00 0 0 0 0 0 0 0 0 0 000 00 0 00 00 0 0 0 0 0 00 0 00 00 0 0 0 00 0 0 000 00 000 0 00000 00000 0 00 0 0 0 00 00 0 000000 00 0 00 0 0 0 0 000 00 00 00 00 0 00 0 00 0 0 000 0 0000 0 0000 0 0 0 0 00 0 00 0 0 000 0 000 0 00 0 00 0 0 0 0 0 000 0 0 00 000000 000 0 00 000 0 00 0 00 00 0 0 0 0 00 0 00 0 00 0 0 0 0 0 0 0 00 0 0 0 00 0 0000 0 0 00 000 00 0 00 0 0000 0 0 0 00 0 0 00 00 0 0 0 0 0 0 000 0 0 0 0 0 00 000 00 00 0 00 00 0 00 0 0 0000 0 00 0 0 0 00 0 0 0 0 00 0 00 0 0 00 00 00 0 00000 00 0 0000 00 00 0 0 0 0 0 00 00 0 00 0 00 00 000 0 00 0 0 0 0 00 0 0 0 0 0 000 00 0 00 00 00 000 00 0 00 00 0 0 0 0 0 00 00 0 000 00 00 00 0 00 0 0 0 0 0 0 0 00 00 0 00 00 0 00 00 0 0 0 0 00 00 00 00 00 00 00 00 0 0 0 0 0 00 000 00 00 00 00 0 0 0 0 0 00 00 00 00 0 00 00 0 0 0 0 00 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 00 0 00 00 000 00 00 0 0 0 00 0 0 00 00 00 00 0 00 0 0 0 00 0 00 00 0 0 00 00 00 0 0 0 00 0 00 00 00 00 00 00 0 0 0 00 0 00 00 0 00 000 00 0 0 0 00 00 00 0 0 00 00 0 00 0 0 0 00 00 00 0 00 0 0 00 00 0 0 0 00 00 00 0 00 00 00 00 0 0 0 00 00 00 0 00 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 00 0 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 00 000 0 0 0 00 00 00 00 0 0 00 00 0 0 0 0 00 00 00 00 0 00 0 0 0 0 00 0 00 00 00 00 0 00 00 0 0 00 0 00 00 00 00 0 00 0 0 0 000 0 00 00 00 00 00 0 0 0 0 00 0 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 00 0 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 mlton-20210117+dfsg/regression/life.sml000066400000000000000000000152031416264345000176430ustar00rootroot00000000000000(*life.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) local fun map f l = let fun loop [] = [] | loop (x::xs) = f x :: loop xs in loop l end fun rev l = let fun rev_rec(p as ([], acc)) = p | rev_rec(x::xs, acc) = rev_rec(xs, x::acc) in #2 (rev_rec(l,nil)) end fun length [] = 0 | length (x::xs) = 1 + length xs fun app f [] = () | app f (x::xs) = (f x; app f xs) fun eq_integer_curry(x)(y:int) = x= y fun eq_int_pair_curry (x:int,x':int)(y,y'): bool = x=y andalso x'=y' exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun accumulate' (f, a, []) = a | accumulate' (f, a, b::x) = accumulate'(f, f(a,b), x) fun filter pred l = let fun loop [] = [] | loop (x::xs) = if pred(x) then x:: loop xs else loop xs in loop l end fun exists pred l = let fun loop [] = false | loop (x::xs) = pred(x) orelse loop xs in loop l end fun member eq x a = exists (eq a) x fun cons a x = a::x fun revonto x y = accumulate' ((fn (x,y) => y::x), x, y) local fun check n = if n<0 then error "repeat<0" else n in fun repeat f x y = let fun loop(p as (0,x)) = p | loop(n,x) = loop(n-1, f x) in #2(loop(check x, y)) end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") fun cp_list[] = [] | cp_list((x,y)::rest) = let val l = cp_list rest in (x,y):: l end fun lexless(a2,b2)(a1:int,b1:int) = if a2 [] | x::xs=> if i>0 then x::take(i-1,xs) else nil fun drop(i,l) = case l of [] => [] | x::xs => if i>0 then drop(i-1,xs) else l fun merge(lp as (left, right)) = case left of [] => right | x::xs => (case right of [] => left | y::ys => if lexless x y then x::merge(xs, right) else if lexless y x then y:: merge(left,ys) else (*x=y*) merge(xs, right) ) in fun tmergesort l = case l of [] => [] | x::xs => (case xs of []=> l | _ => let val k = length l div 2 in merge(copy (tmergesort(take(k,l))), copy (tmergesort(drop(k,l)))) end ) fun lexordset x = tmergesort x end fun collect f list = let fun accumf sofar [] = sofar | accumf sofar (a::x) = accumf (revonto sofar (f a)) x in accumf [] list (* note: this worked without changes!*) end fun occurs3 x = (* finds coords which occur exactly 3 times in coordlist x *) let fun f (q) = case q of (_,_,_,_,[]) => q | ( xover, x3, x2, x1, (a::x)) => if member eq_int_pair_curry xover a then f( xover, x3, x2, x1, x) else if member eq_int_pair_curry x3 a then f ((a::xover), x3, x2, x1, x) else if member eq_int_pair_curry x2 a then f (xover, (a::x3), x2, x1, x) else if member eq_int_pair_curry x1 a then f (xover, x3, (a::x2), x1, x) else f (xover, x3, x2, (a::x1), x) fun diff x y = filter (fn x => not(member eq_int_pair_curry y x)) x (* unfolded o *) val (xover, x3, _, _, _) = f ([],[],[],[],x) in diff x3 xover end fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] infix footnote fun x footnote y = x abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN(cp_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and nextgen gen = let val living = alive gen fun isalive x = member eq_int_pair_curry living x fun liveneighbours x = length( filter isalive ( neighbours x)) fun twoorthree n = n=2 orelse n=3 val survivors = filter (twoorthree o liveneighbours) living val newnbrlist = collect (fn z => filter (fn x => not(isalive x)) (neighbours z) ) living val newborn = occurs3 newnbrlist in mkgen (cp_list(survivors @ newborn)) end end local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1:int,y1)::more) (* coordinates to be plotted *) = if x=x1 then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = plotfrom(xstart,ystart) "" (filter good coordlist) end (* the initial generation *) fun gun() = mkgen [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun show(x) = app (fn s => (print s; print "\n"))(plot(alive x)); local fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = nthgen' (i-1, let val g' = nextgen g in show g; (*resetRegions g;*) (* resetRegions g can actually be omitted here, since *) copy g' (* copy will reset the regions of g! *) end) in fun iter n = #2(nthgen'(n,gun())) end fun testit _ = show(iter 200) in val _ = testit () end mlton-20210117+dfsg/regression/list.ok000066400000000000000000000011311416264345000175100ustar00rootroot00000000000000 File list.sml: Testing structure List... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK test11 OK test12 OK test13 OK test15 OK test16 OK test17 OK test18 OK test19 OK test20 OK checkv OK test22 OK checkv OK test24 OK test25 OK checkv OK checkv OK test28 OK test29 OK test30 OK test31 OK checkv OK test33 OK test36b OK test35a OK test36b OK test35c OK test36a OK test36b OK test36c OK test37a OK mlton-20210117+dfsg/regression/list.sml000066400000000000000000000106441416264345000177030ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/list.sml PS 1994-12-10; Martin-11/03/1998 *) val _ = print "\nFile list.sml: Testing structure List...\n"; local open List in val v123 = [1,2,3]; fun even i = i mod 2 = 0; val test1 = tst "test1" (null [] andalso not (null [[]])); val test2 = tst "test2" (1 = hd v123 andalso [2,3] = tl v123 andalso 3 = last v123) val test3 = tst0 "test3" ((hd [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test4 = tst0 "test4" ((tl [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test5 = tst0 "test5" ((last [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test6 = tst "test6" (1 = nth(v123,0) andalso 3 = nth(v123,2)) val test7 = tst0 "test7" ((nth(v123,~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8 = tst0 "test8" ((nth(v123,3) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9 = tst "test9" (3 = length v123); val test10 = tst "test10" ([3,2,1] = rev [1,2,3]); val v16 = v123 @ [4,5,6]; val test11 = tst "test11" ([1,2,3,4,5,6] = v16); val test12 = tst "test12" (concat [] = [] andalso concat [v16] = v16 andalso concat [v123, [4,5,6]] = v16); val test13 = tst "test13"(rev v16 = revAppend([4,5,6], [3,2,1])); local val v = ref 0 fun h [] r = r | h (x::xr) r = h xr (r+r+x): int; val isum = h v16 0 in fun reset () = v := 0; fun incrv i = v := 2 * !v + i; fun checkv () = tst "checkv" (!v = isum); end; val test14 = (reset (); app incrv v16; checkv); val test15 = tst "test15" ([2,4,6,8,10,12] = map (fn i=>i*2) v16); val test16 = tst "test16" ([3,9,15] = mapPartial (fn i => if even i then NONE else SOME (3*i)) v16); val test17 = tst "test17" (NONE = find (fn i => i>7) v16); val test18 = tst "test18" (SOME 5 = find (fn i => i>4) v16); val test19 = tst "test19" (NONE = find (fn _ => true) []); val test20 = tst "test20" ([2,4,6] = filter even v16); val test21 = (reset (); filter (fn i => (incrv i; true)) v16 seq checkv()); val test22 = tst "test22" (([2,4,6], [1,3,5]) = partition even v16); val test23 = (reset (); partition (fn i => (incrv i; true)) v16 seq checkv()); val test24 = tst "test24" (v16 = foldr op:: [] v16); val test25 = tst "test25" (rev v16 = foldl op:: [] v16); val test26 = (reset(); foldr (fn (i,r) => incrv i) () (rev v16); checkv()); val test27 = (reset(); foldl (fn (i,r) => incrv i) () v16; checkv()); val test28 = tst "test28" (21 = foldr op+ 0 v16 andalso 21 = foldl op+ 0 v16); val test29 = tst "test29" (all (fn _ => false) [] andalso not (exists (fn _ => true) [])); val test30 = tst "test30" (exists even [1,1,1,1,1,1,2,1] andalso all even [6,6,6,6,6,6,6,6]); val test31 = tst "test31" (v16 = tabulate (6, fn i => i+1)); val test32 = (reset(); tabulate (6, fn i => (incrv (i+1); 127)) seq checkv()); val test33 = tst "test33" ([] = tabulate (0, fn i => 1 div i)); val test34 = tst0 "test36b" ((tabulate(~1, fn _ => raise Div) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test35a = tst "test35a" (drop([], 0) = [] andalso drop(v123, 0) = v123 andalso drop(v123, 3) = []); val test35b = tst0 "test36b" ((drop(v123, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test35c = tst0 "test35c" ((drop(v123, 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test36a = tst "test36a" (take([], 0) = [] andalso take(v123, 3) = v123 andalso take(v123, 0) = []); val test36b = tst0 "test36b" ((take(v123, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test36c = tst0 "test36c" ((take(v123, 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test37a = tst' "test37a" (fn _ => getItem [] = NONE andalso getItem [#"A"] = SOME(#"A", []) andalso getItem [#"B", #"C"] = SOME(#"B", [#"C"])); end; mlton-20210117+dfsg/regression/listpair.ok000066400000000000000000000003451416264345000203720ustar00rootroot00000000000000 File listpair.sml: Testing structure ListPair... test1 OK test2a OK test2b OK test3a OK checkv OK checkv OK test5a OK test5b OK test5c OK checkv OK checkv OK test6 OK test7 OK mlton-20210117+dfsg/regression/listpair.sml000066400000000000000000000070711416264345000205570ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/listpair.sml PS 1995-02-25, 1997-03-07 *) (*KILL 05/11/1997 11:00. tho.: use "auxil.sml"; *) val _ = print "\nFile listpair.sml: Testing structure ListPair...\n"; local open ListPair val a = [1, 2, 3, 4, 5, 6] val b = [10, 40, 50, 50] val ab = [(1, 10), (2, 40), (3, 50), (4, 50)] fun take 0 xs = [] | take n [] = [] | take n (x :: xr) = x :: take (n-1) xr in val test1 = tst "test1" (zip([], []) = [] andalso zip ([], a) = [] andalso zip(a, []) = [] andalso zip(a, b) = ab andalso zip(b, a) = List.map (fn (x,y) => (y,x)) ab); val test2a = tst "test2a" (([], []) = unzip [] andalso (a, a) = unzip(zip(a,a)) andalso (take (length b) a, b) = unzip(zip(a, b)) andalso (b, take (length b) a) = unzip(zip(b, a))); val test2b = tst "test2b" (ab = zip(unzip ab)); val test3a = tst "test3a" (map (fn (x, y) => x + y) (a, b) = List.map (fn (x,y) => x + y) (zip(a, b))); local val v = ref 0 fun h [] r = r | h (x::xr) r = h xr (r+r+x): int; val isum = h (take (length b) a) 0 in fun reset () = v := 0; fun incrv i = v := 2 * !v + i; fun checkv () = tst "checkv" (!v = isum); end; val test3b = (reset (); map (incrv o #1) (a, b) seq (); checkv()); val test4 = (reset (); app (incrv o #1) (a, b); checkv()); val test5a = tst "test5a" (all (fn _ => false) (a, []) andalso not (exists (fn _ => true) ([], b))); val test5b = tst "test5b" (exists (fn (x, y) => x = 3) (a, b) andalso all (fn (x, y) => y <= 50) (a, b)); val test5c = tst "test5c" (not (exists (fn (x, y) => x = 5) (a, b)) andalso not (exists (fn (x, y) => y = 5) (b, a)) andalso all (fn (x, y) => x <> 6) (a, b) andalso all (fn (x, y) => y <> 6) (b, a)); val test5d = (reset(); all (fn (x,y) => (incrv x; true)) (a, b) seq (); checkv()); val test5e = (reset(); exists (fn (x,y) => (incrv x; false)) (a, b) seq (); checkv()); local fun foldrchk f e xs ys = foldr f e (xs, ys) = List.foldr (fn ((x, y), r) => f(x, y, r)) e (zip(xs, ys)) fun foldlchk f e xs ys = foldl f e (xs, ys) = List.foldl (fn ((x, y), r) => f(x, y, r)) e (zip(xs, ys)) in val test6 = tst' "test6" (fn _ => foldrchk (fn (x, y, (r1, r2)) => (x-r1, y div r2)) (0, 10) a b andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] b andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) a [] andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] []); val test7 = tst' "test7" (fn _ => foldlchk (fn (x, y, (r1, r2)) => (x-r1, y div r2)) (0, 10) a b andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] b andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) a [] andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] []); end end; mlton-20210117+dfsg/regression/listsort.ok000066400000000000000000000001141416264345000204200ustar00rootroot00000000000000 File listsort.sml: Testing structure ListSort... test1 OK test2 OK mlton-20210117+dfsg/regression/llv.ok000066400000000000000000000000001416264345000173240ustar00rootroot00000000000000mlton-20210117+dfsg/regression/llv.sml000066400000000000000000000025711416264345000175250ustar00rootroot00000000000000 structure LLV = struct datatype place = P of int datatype info = Info1 | Info2 | Info3 datatype 'a tr = TR of 'a exp * info | K of 'a -> int and 'a exp = SWITCH_I of ('a, int) switch | SWITCH_S of ('a, string) switch | STRING of string * 'a and ('a,'c) switch = SWITCH of 'a tr * ('c * 'a tr) list datatype 'a pgm = PGM of string * 'a tr type mulexp = place exp and multrip = place tr type mulexp_llv = (place*int) exp and trip_llv = (place*int) tr fun llv(tr: multrip as TR(e,Info1)) : trip_llv = let val e' = llvExp e in TR(e',Info2) end and llvExp(e: mulexp) : mulexp_llv = let fun llv_switch(SWITCH(e,branches)) = (* Note: e is trivial *) let val branches' = map (fn (c,e) => (c,llv e)) branches in SWITCH(llv e, branches') end in case e of SWITCH_I(switch) => let val switch' = llv_switch switch in SWITCH_I(switch') end | SWITCH_S(switch) => let val switch' = llv_switch switch in SWITCH_S(switch') end | STRING(s,place) => STRING(s, (place, 5)) end val llv = fn (PGM (label,expression)) => let val tr' = llv expression in PGM(label, tr') end end mlton-20210117+dfsg/regression/local-ref.ok000066400000000000000000000001161416264345000204030ustar00rootroot000000000000000th invocation of fib 5th invocation of fib 10th invocation of fib fib(5) = 8 mlton-20210117+dfsg/regression/local-ref.sml000066400000000000000000000007351416264345000205740ustar00rootroot00000000000000 local val c = ref 0 in fun fib n = let val _ = if !c mod 5 = 0 then print (concat [Int.toString (!c), "th invocation of fib\n"]) else () val _ = c := !c + 1 in case n of 0 => 1 | 1 => 1 | n => (fib (n-1)) + (fib (n-2)) end end val n = fib 5 val _ = print (concat ["fib(5) = ", Int.toString n, "\n"]) mlton-20210117+dfsg/regression/math.ok000066400000000000000000000024761416264345000175030ustar00rootroot00000000000000 File math.sml: Testing structure Math... test0a OK test0b OK test1a OK test1b OK test1c OK test2a OK test2b OK test2c OK test2d OK test3a OK test3b OK test3c OK test3d OK test4a OK test4b OK test4c OK test4d OK test4e OK test4f OK test4g OK test5a OK test5b OK test5c OK test5d OK test5e OK test6a OK test6b OK test6c OK test6d OK test6e OK test7a OK test7b OK test7c OK test7d OK test7e OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test8g OK test8h OK test8i OK test8j OK test8k OK test8l OK test9a OK test9b OK test9c OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test12a OK test12b OK test12c OK test12d OK test12e OK test12f OK test12g OK test12h OK test12i OK test12l OK test12m OK test13a OK test13b OK test13c OK test13d OK test13e OK test14a OK test14b OK test14c OK test14d OK test14e OK test15a OK test15b OK test15c OK test15d OK test15e OK test16a OK test16b OK test16c OK test16d OK test16e OK test16f OK test16g OK mlton-20210117+dfsg/regression/math.sml000066400000000000000000000154061416264345000176620ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/math.sml PS 1995-02-25, 1996-04-01, 1997-03-07 *) val _ = print "\nFile math.sml: Testing structure Math...\n" local open Math val MAXDOUBLE = 8.98846567431157E307; val MINDOUBLE = 4.94065645841246544E~324 val PI = 3.14159265358979323846; val E = 2.7182818284590452354; val eps = 1E~8 infix 4 === fun x === y = abs (x - y) <= eps orelse abs(x-y) <= eps * (abs x + abs y) fun check1 (opr, a, r) = if opr a === r then "OK" else "WRONG" fun check2 (opr, a1, a2, r) = if opr(a1, a2) === r then "OK" else "WRONG" fun tst1 s (opr, a, r) = tst0 s (check1 (opr, a, r)) fun tst2 s (opr, a1, a2, r) = tst0 s (check2 (opr, a1, a2, r)) val test0a = tst "test0a" (PI === pi); val test0b = tst "test0b" (E === e); val test1a = tst1 "test1a" (sqrt, 64.0, 8.0); val test1b = tst1 "test1b" (sqrt, 0.0, 0.0); val test1c = tst0 "test1c" (if Real.isNan(sqrt ~1.0) then "OK" else "WRONG") val test2a = tst1 "test2a" (sin, 0.0, 0.0); val test2b = tst1 "test2b" (sin, pi/2.0, 1.0); val test2c = tst1 "test2c" (sin, pi, 0.0); val test2d = tst1 "test2d" (sin, 3.0*pi/2.0, ~1.0); val test3a = tst1 "test3a" (cos, 0.0, 1.0); val test3b = tst1 "test3b" (cos, pi/2.0, 0.0); val test3c = tst1 "test3c" (cos, pi, ~1.0); val test3d = tst1 "test3d" (cos, 3.0*pi/2.0, 0.0); val test4a = tst1 "test4a" (tan, 0.0, 0.0); val test4b = tst1 "test4b" (tan, pi/4.0, 1.0); val test4c = tst1 "test4c" (tan, pi, 0.0); val test4d = tst1 "test4d" (tan, 3.0*pi/4.0, ~1.0); val test4e = tst1 "test4e" (tan, ~pi/4.0, ~1.0); val test4f = tst "test4f" ((abs(tan (pi/2.0)) > 1E8) handle _ => true); val test4g = tst "test4g" ((abs(tan (~pi/2.0)) > 1E8) handle _ => true); val test5a = tst1 "test5a" (asin, 0.0, 0.0); val test5b = tst1 "test5b" (asin, 1.0, pi/2.0); val test5c = tst1 "test5c" (asin, ~1.0, ~pi/2.0); val test5d = tst0 "test5d" (if Real.isNan(asin 1.1) then "OK" else "WRONG") val test5e = tst0 "test5e" (if Real.isNan(asin ~1.1) then "OK" else "WRONG") val test6a = tst1 "test6a" (acos, 1.0, 0.0); val test6b = tst1 "test6b" (acos, 0.0, pi/2.0); val test6c = tst1 "test6c" (acos, ~1.0, pi); val test6d = tst0 "test6d" (if Real.isNan(acos 1.1) then "OK" else "WRONG") val test6e = tst0 "test6e" (if Real.isNan(acos ~1.1) then "OK" else "WRONG") val test7a = tst1 "test7a" (atan, 0.0, 0.0); val test7b = tst1 "test7b" (atan, 1.0, pi/4.0); val test7c = tst1 "test7c" (atan, ~1.0, ~pi/4.0); val test7d = tst1 "test7d" (atan, 1E8, pi/2.0); val test7e = tst1 "test7e" (atan, ~1E8, ~pi/2.0); (* atan2 -- here I am in doubt over the argument order, since the New Basis document is inconsistent with itself and with atan2 in the C libraries. *) val test8a = tst2 "test8a" (atan2, 0.0, 0.0, 0.0); val test8b = tst2 "test8b" (atan2, 1.0, 0.0, pi/2.0); val test8c = tst2 "test8c" (atan2, ~1.0, 0.0, ~pi/2.0); val test8d = tst2 "test8d" (atan2, 1.0, 1.0, pi/4.0); val test8e = tst2 "test8e" (atan2, ~1.0, 1.0, ~pi/4.0); val test8f = tst2 "test8f" (atan2, ~1.0, ~1.0, ~3.0*pi/4.0); val test8g = tst2 "test8g" (atan2, 1.0, ~1.0, 3.0*pi/4.0); val test8h = tst2 "test8h" (atan2, 1E8, 1.0, pi/2.0); val test8i = tst2 "test8i" (atan2, ~1E8, 1.0, ~pi/2.0); val test8j = tst2 "test8j" (atan2, 1.0, 1E8, 0.0); val test8k = tst2 "test8k" (atan2, 1.0, ~1E8, pi); val test8l = tst2 "test8l" (atan2, ~1.0, ~1E8, ~pi); val test9a = tst1 "test9a" (exp, 0.0, 1.0); val test9b = tst1 "test9b" (exp, 1.0, e); val test9c = tst1 "test9c" (exp, ~1.0, 1.0/e); val test10a = tst1 "test10a" (ln, 1.0, 0.0); val test10b = tst1 "test10b" (ln, e, 1.0); val test10c = tst1 "test10c" (ln, 1.0/e, ~1.0); val test10d = tst0 "test10d" (if Real.==(ln 0.0,Real.negInf) then "OK" else "WRONG") val test10e = tst0 "test10e" (if Real.isNan(ln ~1.0) then "OK" else "WRONG") val test10f = tst0 "test10f" (if Real.==(ln Real.posInf, Real.posInf) then "OK" else "WRONG") val test10g = tst0 "test10g" (if Real.==(Real.posInf, Real.posInf) then "OK" else "WRONG") val test12a = tst2 "test12a" (pow, 0.0, 0.0, 1.0); (* arbitrary, might be 0.0 *) val test12b = tst2 "test12b" (pow, 7.0, 0.0, 1.0); val test12c = tst2 "test12c" (pow, 0.0, 7.0, 0.0); val test12d = tst2 "test12d" (pow, 64.0, 0.5, 8.0); val test12e = tst2 "test12e" (pow, ~9.0, 2.0, 81.0); val test12f = tst2 "test12f" (pow, 10.0, ~2.0, 0.01); val test12g = tst2 "test12g" (pow, ~10.0, ~2.0, 0.01); val test12h = tst2 "test12h" (pow, 0.0, 0.5, 0.0); val test12i = tst2 "test12i" (pow, 0.4, ~2.0, 6.25); (*we do not follow the Basis Library specification exactly here, but rather follow math.h val test12j = tst0 "test12j" (if Real.==(pow(0.0, ~1.0),Real.posInf) then "OK" else "WRONG") val test12k = tst0 "test12k" (if Real.==(pow(0.0, ~0.5),Real.posInf) then "OK" else "WRONG") *) val test12l = tst0 "test12l" (if Real.isNan(pow(~1.0, 1.1)) then "OK" else "WRONG") val test12m = tst0 "test12m" (if Real.isNan(pow(~1.0, 0.5)) then "OK" else "WRONG") (* sweeks removed 12n because it fails on FreeBSD on x86, apparently due to a * 64 bit vs 80 bit issue. *) (* val test12n = tst0 "test12n" (if Real.==(pow(3.0, 1000000.0),Real.posInf) then "OK" else "WRONG") *) (* not in basis lib spec.*) val test13a = tst1 "test13a" (log10, 1.0, 0.0); val test13b = tst1 "test13b" (log10, 10.0, 1.0); val test13c = tst1 "test13c" (log10, 100.0, 2.0); val test13d = tst1 "test13d" (log10, 0.1, ~1.0); val test13e = tst1 "test13e" (log10, 0.01, ~2.0); val check14a = tst1 "test14a" (sinh, 0.0, 0.0); val check14b = tst1 "test14b" (sinh, 1.0, 1.17520119364); val check14c = tst1 "test14c" (sinh, ~1.0, ~1.17520119364); val check14d = tst1 "test14d" (sinh, 2.0, 3.62686040785); val check14e = tst1 "test14e" (sinh, ~2.0, ~3.62686040785); val check15a = tst1 "test15a" (cosh, 0.0, 1.0); val check15b = tst1 "test15b" (cosh, 1.0, 1.54308063482); val check15c = tst1 "test15c" (cosh, ~1.0, 1.54308063482); val check15d = tst1 "test15d" (cosh, 2.0, 3.76219569108); val check15e = tst1 "test15e" (cosh, ~2.0, 3.76219569108); val check16a = tst1 "test16a" (tanh, 0.0, 0.0); val check16b = tst1 "test16b" (tanh, 1.0, 0.761594155956); val check16c = tst1 "test16c" (tanh, ~1.0, ~0.761594155956); val check16d = tst1 "test16d" (tanh, 2.0, 0.964027580076); val check16e = tst1 "test16e" (tanh, ~2.0, ~0.964027580076); val check16f = tst1 "test16f" (tanh, 100.0, 1.0); val check16g = tst1 "test16g" (tanh, ~100.0, ~1.0); in end mlton-20210117+dfsg/regression/mlton.overload.ok000066400000000000000000000000001416264345000214720ustar00rootroot00000000000000mlton-20210117+dfsg/regression/mlton.overload.sml000066400000000000000000000002111416264345000216600ustar00rootroot00000000000000(* Checks overload declarations. *) fun f (x: int) = x fun g (x: word) = x _overload f: 'a -> 'a as f and g val _ = f 1 val _ = f 0w1 mlton-20210117+dfsg/regression/mlton.share.ok000066400000000000000000000000331416264345000207670ustar00rootroot00000000000000mlton.share.???.ok missing mlton-20210117+dfsg/regression/mlton.share.rep32a4.ok000066400000000000000000000220701416264345000221530ustar00rootroot00000000000000size of a is 1600 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 484 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1024 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 448 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2400 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1284 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1600000 (1, 1) size of a is 400084 (1, 1) size is 172 size is 72 abcdef abcdef size is 52 size is 32 abcdef abcdef 1 2 mlton-20210117+dfsg/regression/mlton.share.rep32a8.ok000066400000000000000000000220701416264345000221570ustar00rootroot00000000000000size of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20210117+dfsg/regression/mlton.share.rep64.ok000066400000000000000000000220711416264345000217340ustar00rootroot00000000000000size of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20210117+dfsg/regression/mlton.share.sml000066400000000000000000000107061416264345000211610ustar00rootroot00000000000000(* sharing on a non-object *) val () = MLton.share 13 (* tuple option array *) val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = (print (concat ["size of a is ", IntInf.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () (* tuple option array with pre-existing sharing *) val one = 1 + length (CommandLine.arguments ()) val v = SOME (one, one) val a = Array.tabulate (100, fn i => if i mod 2 = 0 then v else SOME (i mod 3, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = (print (concat ["size of a is ", IntInf.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () (* tuple option ref array *) val a = Array.tabulate (100, fn i => ref (SOME (i mod 2, i mod 3))) val () = Array.sub (a, 0) := NONE fun msg () = (print (concat ["size of a is ", IntInf.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case !z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () val () = Array.appi (fn (i, r) => r := (if i = 0 then NONE else (SOME (i mod 2, i mod 3)))) a val () = msg () (* big tuple option array *) val a = Array.tabulate (100000, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = print (concat ["size of a is ", IntInf.toString (MLton.size a), "\n", case Array.sub (a, 1) of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"]) val () = msg () val () = MLton.share a val () = msg () (* non-sharing of vectors *) datatype t = A | B val v1 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, B] val v2 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, A] val a = Array.tabulate (4, fn i => if i mod 2 = 0 then v1 else v2) val () = MLton.share a val () = if Array.sub (a, 2) = Array.sub (a, 3) then raise Fail "bug" else () (* sharing of vectors *) val s = concat ["ab", "cd", "ef"] val a = Array.tabulate (10, fn i => if i mod 2 = 0 then s else concat ["abc", "def"]) fun p () = print (concat ["size is ", IntInf.toString (MLton.size a), "\n"]) val () = p () val () = MLton.share a val () = p () val s0 = Array.sub (a, 0) val s1 = Array.sub (a, 1) val () = print (concat [s0, " ", s1, "\n"]) (* sharing of vectors in a tuple *) val t = (concat ["ab", "cd", "ef"], concat ["abc", "def"]) fun p () = print (concat ["size is ", IntInf.toString (MLton.size t), "\n"]) val () = p () val () = MLton.share t val () = p () val (s1, s2) = t val () = print (concat [s1, " ", s2, "\n"]) (* non-sharing of similar looking strings of different lengths. *) val a = Array.tabulate (10, fn i => if 0 = i mod 2 then "a" else concat ["a", "\000"]) val () = MLton.share a val s0 = Array.sub (a, 0) val s1 = Array.sub (a, 1) val () = print (concat [Int.toString (size s0), " ", Int.toString (size s1), "\n"]) mlton-20210117+dfsg/regression/mlton.word.ok000066400000000000000000000050441416264345000206470ustar00rootroot000000000000000 FFFFFFFF FFFFFFF1 80808081 1 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 0 0 0 0 0 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 8 10 20 40 80 100 200 400 800 1000 2000 4000 8000 10000 20000 40000 80000 100000 200000 400000 800000 1000000 2000000 4000000 8000000 10000000 20000000 40000000 80000000 1 F 1E 3C 78 F0 1E0 3C0 780 F00 1E00 3C00 7800 F000 1E000 3C000 78000 F0000 1E0000 3C0000 780000 F00000 1E00000 3C00000 7800000 F000000 1E000000 3C000000 78000000 F0000000 E0000001 C0000003 80000007 F 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 80000000 40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000 400000 200000 100000 80000 40000 20000 10000 8000 4000 2000 1000 800 400 200 100 80 40 20 10 8 4 2 1 F 80000007 C0000003 E0000001 F0000000 78000000 3C000000 1E000000 F000000 7800000 3C00000 1E00000 F00000 780000 3C0000 1E0000 F0000 78000 3C000 1E000 F000 7800 3C00 1E00 F00 780 3C0 1E0 F0 78 3C 1E F 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 FF F1 81 1 0 1 F 7F FF 0 1 F 7F FF 0 1 F 7F FF 0 1 F 7F FF 0 0 0 0 0 0 FF FF FF FF FF FF 0 0 0 0 0 0 0 0 0 1 2 4 8 10 20 40 80 1 F 1E 3C 78 F0 E1 C3 87 F 7F FE FD FB F7 EF DF BF 7F FF FF FF FF FF FF FF FF FF 0 0 0 0 0 0 0 0 0 1 80 40 20 10 8 4 2 1 F 87 C3 E1 F0 78 3C 1E F 7F BF DF EF F7 FB FD FE 7F FF FF FF FF FF FF FF FF FF mlton-20210117+dfsg/regression/mlton.word.sml000066400000000000000000000053651416264345000210370ustar00rootroot00000000000000functor F (S: sig type word val trials: word list val ~ : word -> word val fromInt: int -> word val max: word val rol: word * Word.word -> word val ror: word * Word.word -> word val toString: word -> string val wordSize: int val zero: word end) = struct open S val rots = List.tabulate (wordSize + 1, Word.fromInt) fun p w = print (concat [toString w, "\n"]) (* Test ~ *) val _ = List.app (p o ~) trials (* Test Algebraic simplifications. *) val _ = List.app (fn w => p (rol (w, 0w0))) trials val _ = List.app (fn w => p (ror (w, 0w0))) trials val _ = List.app (fn w => p (rol (w, Word.fromInt wordSize))) trials val _ = List.app (fn w => p (ror (w, Word.fromInt wordSize))) trials val _ = List.app (fn w => p (rol (zero, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (ror (zero, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (rol (max, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (ror (max, w))) [0w1, 0w2, 0w3] val _ = List.app (fn oper => List.app (fn w => List.app (fn w' => p (oper (w, w'))) rots) trials) [rol, ror] end structure Z = F (open Word MLton.Word val zero: word = 0w0 val max: word = 0wxFFFFFFFF val trials: word list = [0w0, 0w1, 0wxF, 0wx7F7F7F7F, 0wxFFFFFFFF]) structure Z = F (open Word8 MLton.Word8 val zero: word = 0w0 val max: word = 0wxFF val trials: word list = [0w0, 0w1, 0wxF, 0wx7F, 0wxFF]) (* Test unsigned addition and multiplication with overflow checking. *) (* val _ = * (MLton.Word.addCheck (0wxFFFFFFFF, 0wx1) * ; print "BUG\n") * handle Overflow => print "OK\n" * * fun doit (name, f, all) = * List.app * (fn (w, w') => * let * val _ = print (concat ["0x", Word.toString w, " ", name, " ", * "0x", Word.toString w']) * val res = f (w, w') * val _ = print (concat [" = ", Word.toString res, "\n"]) * in * () * end handle Overflow => print " --> Overflow\n") * all * * val _ = doit ("+", MLton.Word.addCheck, * [(0wx7FFFFFFF, 0wx1), * (0wxFFFFFFFE, 0wx1), * (0wxFFFFFFFD, 0wx2), * (0wxFFFFFFFF, 0wx1)]) * * val _ = doit ("*", MLton.Word.mulCheck, * [(0wxFFFFFFFF, 0wx1), * (0wx7FFFFFFF, 0wx2), * (0wx80000000, 0wx2), * (0wxFFFFFFFF, 0wx2)]) *) mlton-20210117+dfsg/regression/modules.sml000066400000000000000000000106741416264345000204030ustar00rootroot00000000000000signature S = sig type t structure S: sig type 'a t val x: 'a t end end structure S: sig datatype ('a, 'b) t = T of 'a end = struct datatype ('b, 'a) t = T of 'b end functor F (eqtype t datatype u = U of t eqtype v sharing type t = v) = struct fun f (u: u) = u = u end functor F (type t eqtype u sharing type t = u) = struct fun f (x: t) = x = x end signature S1 = sig datatype t = T end signature S2 = sig eqtype u structure S: S1 where type t = u end; signature S1 = sig datatype t = T end signature S2 = sig datatype u = U structure S: S1 where type t = u end; signature S = sig datatype t = T end where type t = int signature S = sig type t type u type v = t sharing type u = v end signature S = sig type 'a t type 'a u type 'a v = 'a t sharing type u = v end signature S = sig type t datatype u = U sharing type u = t end signature S = sig type t structure Z: sig datatype u = U end sharing type Z.u = t end signature S = sig eqtype t structure Z: sig datatype u = U end where type u = t end structure S: sig eqtype t structure Z: sig datatype u = U end where type u = t end = struct structure Z = struct datatype u = U end type t = Z.u end functor F () = struct end functor F (type t) = struct type u = t end functor F (val x: int) = struct val y = x end functor F (structure S: sig end) = struct open S end functor F (type t type u sharing type t = u) = struct val id: t -> u = fn x => x end functor F (eqtype t) = struct fun f (x: t) = x = x end functor F (structure S: sig type t end structure T: sig type t end sharing S = T) = struct val id: S.t -> T.t = fn x => x end functor F (datatype 'a t = T of 'a * 'a) = struct val _ = T (13, 14) end functor F (type ('a, 'b) t type 'a u = ('a, int) t val f: (bool, 'b) t -> real val u: bool u) = struct val _ = f u end functor F (datatype t = T datatype u = U of t) = struct fun f (x: u) = x = x end structure S: sig val x: unit list end = struct val x = [] end structure S: sig val x: 'a list end = struct val x = [] end structure S: sig val x: ''a list end = struct val x = [] end structure S: sig val f: ''a -> ''a list end = struct fun f x = [x] end structure S: sig type 'a t val T: int t end = struct datatype 'a t = T end structure S: sig val f: 'a list -> 'a list end = struct fun f _ = [] end val z = S.f [1, 2, 3] structure S = struct datatype t = T end functor F () = S structure S1 = F () structure S2 = F () val _ = S1.T = S2.T datatype t = T functor F () = struct datatype t = datatype t end structure S1 = F () structure S2 = F () val _ = S1.T = S2.T signature SIG = sig type t end functor F (S: sig type t end): SIG = S structure S:> sig structure T: sig type t end structure U: SIG sharing type T.t = U.t end = struct structure T = struct type t = unit end structure U = F (type t = unit) end val f = fn z: S.T.t => z: S.U.t structure S:> sig eqtype t val x: t end = struct type t = unit val x = () end val _ = S.x = S.x val _ = fn x: LargeInt.int => x: IntInf.int signature S = sig type t end structure S:> S = struct datatype t = T end signature T = sig type u include S where type t = S.t end structure T:> T = struct datatype u = U type t = S.t end val _: T.t -> S.t = fn x => x signature SIG = sig type u type v = u end where type v = int structure S: SIG = struct type u = int type v = int end functor F () = struct val A = 0 end structure S = struct datatype z = A structure F = F () end mlton-20210117+dfsg/regression/msort.sml000066400000000000000000000012501416264345000200650ustar00rootroot00000000000000 fun cp [] =[] | cp (x::xs)= x :: cp xs (* exormorphic merge *) fun merge(xs, []):int list = cp xs | merge([], ys) = cp ys | merge(l1 as x::xs, l2 as y::ys) = if x= stop then () else (f i; loop (i + 1)) in loop start end structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit structure Mutex: sig type t val new: unit -> t val lock: t -> unit val unlock: t -> unit end end = struct open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t = Queue.enque (threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => (print "exiting\n" ; next ())) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 10))))) ; setItimer Time.zeroTime ; setHandler (alrm, Handler.ignore) ; topLevel := NONE) structure Mutex = struct datatype t = T of {locked: bool ref, waiting: unit Thread.t Queue.t} fun new () = T {locked = ref false, waiting = Queue.new ()} fun lock (T {locked, waiting, ...}) = let fun loop () = (Thread.atomicBegin () ; if !locked then (Thread.atomicEnd () ; switch (fn t => (Queue.enque (waiting, t) ; next ())) ; loop ()) else (locked := true ; Thread.atomicEnd ())) in loop () end fun safeUnlock (T {locked, waiting, ...}) = (locked := false ; (case Queue.deque waiting of NONE => () | SOME t => ready (Thread.prepare (t,())))) fun unlock (m: t) = (Thread.atomicBegin () ; safeUnlock m ; Thread.atomicEnd ()) end end open Thread fun main (name, args) = let val m = Mutex.new () val gotIt = ref false val _ = for (0, 10, fn _ => Thread.spawn (fn () => let val _ = print "starting\n" fun loop i = if i = 0 then () else (Mutex.lock m ; if !gotIt then raise Fail "bug" else (gotIt := true ; for (0, 100000, fn _ => ()) ; gotIt := false ; Mutex.unlock m ; loop (i - 1))) in loop 10000 end)) in run () end val _ = main ( CommandLine.name (), CommandLine.arguments () ) mlton-20210117+dfsg/regression/nested-loop.ok000066400000000000000000000000001416264345000207600ustar00rootroot00000000000000mlton-20210117+dfsg/regression/nested-loop.sml000066400000000000000000000003571416264345000211610ustar00rootroot00000000000000fun loop1 x = if x = 0 then () else (let fun loop2 y = if y = 0 then () else loop2 (y - 1) in loop2 x end; loop1 (x - 1)) val _ = loop1 13 mlton-20210117+dfsg/regression/nextAfter.ok000066400000000000000000000031271416264345000205040ustar00rootroot00000000000000nextAfter (~0.0, ~0.0) = ~0.0 OK nextAfter (~0.0, 0.0) = 0.0 OK nextAfter (0.0, ~0.0) = ~0.0 OK nextAfter (0.0, 0.0) = 0.0 OK nextAfter (~0.0, inf) = 0.1E~44 OK nextAfter (~0.0, ~inf) = ~0.1E~44 OK nextAfter (0.0, inf) = 0.1E~44 OK nextAfter (0.0, ~inf) = ~0.1E~44 OK nextAfter (0.1E~44, 0.0) = 0.0 OK nextAfter (0.1E~44, ~0.0) = 0.0 OK nextAfter (0.1E~44, ~inf) = 0.0 OK nextAfter (~0.1E~44, 0.0) = ~0.0 OK nextAfter (~0.1E~44, ~0.0) = ~0.0 OK nextAfter (~0.1E~44, inf) = ~0.0 OK nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 OK nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 OK nextAfter (0.1E~44, inf) = 0.3E~44 OK nextAfter (~0.1E~44, ~inf) = ~0.3E~44 OK nextAfter (0.34028235E39, inf) = inf OK nextAfter (~0.34028235E39, ~inf) = ~inf OK nextAfter (0.11754942E~37, inf) = 0.11754944E~37 OK nextAfter (~0.0, ~0.0) = ~0.0 OK nextAfter (~0.0, 0.0) = 0.0 OK nextAfter (0.0, ~0.0) = ~0.0 OK nextAfter (0.0, 0.0) = 0.0 OK nextAfter (~0.0, inf) = 0.5E~323 OK nextAfter (~0.0, ~inf) = ~0.5E~323 OK nextAfter (0.0, inf) = 0.5E~323 OK nextAfter (0.0, ~inf) = ~0.5E~323 OK nextAfter (0.5E~323, 0.0) = 0.0 OK nextAfter (0.5E~323, ~0.0) = 0.0 OK nextAfter (0.5E~323, ~inf) = 0.0 OK nextAfter (~0.5E~323, 0.0) = ~0.0 OK nextAfter (~0.5E~323, ~0.0) = ~0.0 OK nextAfter (~0.5E~323, inf) = ~0.0 OK nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 OK nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 OK nextAfter (0.5E~323, inf) = 0.1E~322 OK nextAfter (~0.5E~323, ~inf) = ~0.1E~322 OK nextAfter (0.17976931348623157E309, inf) = inf OK nextAfter (~0.17976931348623157E309, ~inf) = ~inf OK nextAfter (0.2225073858507201E~307, inf) = 0.22250738585072014E~307 OK mlton-20210117+dfsg/regression/nextAfter.sml000066400000000000000000000023101416264345000206570ustar00rootroot00000000000000functor Test (R: REAL) = struct open R val posZero = minPos - minPos val negZero = ~posZero val rs = [(negZero, negZero, negZero), (negZero, posZero, posZero), (posZero, negZero, negZero), (posZero, posZero, posZero), (negZero, posInf, minPos), (negZero, negInf, ~minPos), (posZero, posInf, minPos), (posZero, negInf, ~minPos), (minPos, posZero, posZero), (minPos, negZero, posZero), (minPos, negInf, posZero), (~minPos, posZero, negZero), (~minPos, negZero, negZero), (~minPos, posInf, negZero), (minPos, minPos, minPos), (~minPos, ~minPos, ~minPos), (minPos, posInf, fromInt 2 * minPos), (~minPos, negInf, ~(fromInt 2 * minPos)), (maxFinite, posInf, posInf), (~maxFinite, negInf, negInf), (nextAfter (minNormalPos, negInf), posInf, minNormalPos)] val () = List.app (fn (x, y, z) => let val r2s = fmt StringCvt.EXACT val z' = nextAfter (x, y) in print (concat ["nextAfter (", r2s x, ", ", r2s y, ") = ", r2s z', " ", if == (z, z') then "OK" else concat ["<> ", r2s z], "\n"]) end) rs end structure Z = Test (Real32) structure Z = Test (Real64) mlton-20210117+dfsg/regression/nonexhaustive.ok000066400000000000000000000000001416264345000214270ustar00rootroot00000000000000mlton-20210117+dfsg/regression/nonexhaustive.sml000066400000000000000000000140621416264345000216260ustar00rootroot00000000000000(* nonexhaustive.sml *) val _ = case 2 of 2 => 3 | 3 => 4 val _ = case [] of [] => 1 val _ = case [] of [] => 0 | [_] => 1 | [_, _] => 2 fun first l = case l of SOME x :: _ => x fun f x = case x of (false, false) => () | (true, true) => () datatype z = A | B | C fun f x = case x of (A, B, C) => () val _ = case Fail "foo" of Fail _ => false val _ = case (1, []) of (1, []) => true val _ = case (1, []) of (1, _) => true fun f 1 2 = 3 fun f "" = () fun f #"a" = 13 fun f (0w0: Word8.word) = 13 (* Checks for non-exhaustive pattern matches (compiler should warn). *) fun ord #"\000" = 0 | ord #"\002" = 2 | ord #"\003" = 3 | ord #"\004" = 4 | ord #"\005" = 5 | ord #"\006" = 6 | ord #"\007" = 7 | ord #"\008" = 8 | ord #"\009" = 9 | ord #"\010" = 10 | ord #"\011" = 11 | ord #"\012" = 12 | ord #"\013" = 13 | ord #"\014" = 14 | ord #"\015" = 15 | ord #"\016" = 16 | ord #"\017" = 17 | ord #"\018" = 18 | ord #"\019" = 19 | ord #"\020" = 20 | ord #"\021" = 21 | ord #"\022" = 22 | ord #"\023" = 23 | ord #"\024" = 24 | ord #"\025" = 25 | ord #"\026" = 26 | ord #"\027" = 27 | ord #"\028" = 28 | ord #"\029" = 29 | ord #"\030" = 30 | ord #"\031" = 31 | ord #"\032" = 32 | ord #"\033" = 33 | ord #"\034" = 34 | ord #"\035" = 35 | ord #"\036" = 36 | ord #"\037" = 37 | ord #"\038" = 38 | ord #"\039" = 39 | ord #"\040" = 40 | ord #"\041" = 41 | ord #"\042" = 42 | ord #"\043" = 43 | ord #"\044" = 44 | ord #"\045" = 45 | ord #"\046" = 46 | ord #"\047" = 47 | ord #"\048" = 48 | ord #"\049" = 49 | ord #"\050" = 50 | ord #"\051" = 51 | ord #"\052" = 52 | ord #"\053" = 53 | ord #"\054" = 54 | ord #"\055" = 55 | ord #"\056" = 56 | ord #"\057" = 57 | ord #"\058" = 58 | ord #"\059" = 59 | ord #"\060" = 60 | ord #"\061" = 61 | ord #"\062" = 62 | ord #"\063" = 63 | ord #"\064" = 64 | ord #"\065" = 65 | ord #"\066" = 66 | ord #"\067" = 67 | ord #"\068" = 68 | ord #"\069" = 69 | ord #"\070" = 70 | ord #"\071" = 71 | ord #"\072" = 72 | ord #"\073" = 73 | ord #"\074" = 74 | ord #"\075" = 75 | ord #"\076" = 76 | ord #"\077" = 77 | ord #"\078" = 78 | ord #"\079" = 79 | ord #"\080" = 80 | ord #"\081" = 81 | ord #"\082" = 82 | ord #"\083" = 83 | ord #"\084" = 84 | ord #"\085" = 85 | ord #"\086" = 86 | ord #"\087" = 87 | ord #"\088" = 88 | ord #"\089" = 89 | ord #"\090" = 90 | ord #"\091" = 91 | ord #"\092" = 92 | ord #"\093" = 93 | ord #"\094" = 94 | ord #"\095" = 95 | ord #"\096" = 96 | ord #"\097" = 97 | ord #"\098" = 98 | ord #"\099" = 99 | ord #"\100" = 100 | ord #"\101" = 101 | ord #"\102" = 102 | ord #"\103" = 103 | ord #"\104" = 104 | ord #"\105" = 105 | ord #"\106" = 106 | ord #"\107" = 107 | ord #"\108" = 108 | ord #"\109" = 109 | ord #"\110" = 110 | ord #"\111" = 111 | ord #"\112" = 112 | ord #"\113" = 113 | ord #"\114" = 114 | ord #"\115" = 115 | ord #"\116" = 116 | ord #"\117" = 117 | ord #"\118" = 118 | ord #"\119" = 119 | ord #"\120" = 120 | ord #"\121" = 121 | ord #"\122" = 122 | ord #"\123" = 123 | ord #"\124" = 124 | ord #"\125" = 125 | ord #"\126" = 126 | ord #"\127" = 127 | ord #"\128" = 128 | ord #"\129" = 129 | ord #"\130" = 130 | ord #"\131" = 131 | ord #"\132" = 132 | ord #"\133" = 133 | ord #"\134" = 134 | ord #"\135" = 135 | ord #"\136" = 136 | ord #"\137" = 137 | ord #"\138" = 138 | ord #"\139" = 139 | ord #"\140" = 140 | ord #"\141" = 141 | ord #"\142" = 142 | ord #"\143" = 143 | ord #"\144" = 144 | ord #"\145" = 145 | ord #"\146" = 146 | ord #"\147" = 147 | ord #"\148" = 148 | ord #"\149" = 149 | ord #"\150" = 150 | ord #"\151" = 151 | ord #"\152" = 152 | ord #"\153" = 153 | ord #"\154" = 154 | ord #"\155" = 155 | ord #"\156" = 156 | ord #"\157" = 157 | ord #"\158" = 158 | ord #"\159" = 159 | ord #"\160" = 160 | ord #"\161" = 161 | ord #"\162" = 162 | ord #"\163" = 163 | ord #"\164" = 164 | ord #"\165" = 165 | ord #"\166" = 166 | ord #"\167" = 167 | ord #"\168" = 168 | ord #"\169" = 169 | ord #"\170" = 170 | ord #"\171" = 171 | ord #"\172" = 172 | ord #"\173" = 173 | ord #"\174" = 174 | ord #"\175" = 175 | ord #"\176" = 176 | ord #"\177" = 177 | ord #"\178" = 178 | ord #"\179" = 179 | ord #"\180" = 180 | ord #"\181" = 181 | ord #"\182" = 182 | ord #"\183" = 183 | ord #"\184" = 184 | ord #"\185" = 185 | ord #"\186" = 186 | ord #"\187" = 187 | ord #"\188" = 188 | ord #"\189" = 189 | ord #"\190" = 190 | ord #"\191" = 191 | ord #"\192" = 192 | ord #"\193" = 193 | ord #"\194" = 194 | ord #"\195" = 195 | ord #"\196" = 196 | ord #"\197" = 197 | ord #"\198" = 198 | ord #"\199" = 199 | ord #"\200" = 200 | ord #"\201" = 201 | ord #"\202" = 202 | ord #"\203" = 203 | ord #"\204" = 204 | ord #"\205" = 205 | ord #"\206" = 206 | ord #"\207" = 207 | ord #"\208" = 208 | ord #"\209" = 209 | ord #"\210" = 210 | ord #"\211" = 211 | ord #"\212" = 212 | ord #"\213" = 213 | ord #"\214" = 214 | ord #"\215" = 215 | ord #"\216" = 216 | ord #"\217" = 217 | ord #"\218" = 218 | ord #"\219" = 219 | ord #"\220" = 220 | ord #"\221" = 221 | ord #"\222" = 222 | ord #"\223" = 223 | ord #"\224" = 224 | ord #"\225" = 225 | ord #"\226" = 226 | ord #"\227" = 227 | ord #"\228" = 228 | ord #"\229" = 229 | ord #"\230" = 230 | ord #"\231" = 231 | ord #"\232" = 232 | ord #"\233" = 233 | ord #"\234" = 234 | ord #"\235" = 235 | ord #"\236" = 236 | ord #"\237" = 237 | ord #"\238" = 238 | ord #"\239" = 239 | ord #"\240" = 240 | ord #"\241" = 241 | ord #"\242" = 242 | ord #"\243" = 243 | ord #"\244" = 244 | ord #"\245" = 245 | ord #"\246" = 246 | ord #"\247" = 247 | ord #"\248" = 248 | ord #"\249" = 249 | ord #"\250" = 250 | ord #"\251" = 251 | ord #"\252" = 252 | ord #"\253" = 253 | ord #"\254" = 254 | ord #"\255" = 255; mlton-20210117+dfsg/regression/nonterminate/000077500000000000000000000000001416264345000207115ustar00rootroot00000000000000mlton-20210117+dfsg/regression/nonterminate/8.sml000066400000000000000000000002401416264345000215710ustar00rootroot00000000000000datatype t = T of t datatype u = A of int | B of t * int fun f () = T (f ()) val _ = case if 0 = 0 then B (f (), 13) else A 13 of B (_, n) => n + 1 mlton-20210117+dfsg/regression/once.ok000066400000000000000000000002711416264345000174650ustar00rootroot00000000000000a = 12 b = 12 a = 11 b = 12 a = 10 b = 12 a = 9 b = 12 a = 8 b = 12 a = 7 b = 12 a = 6 b = 12 a = 5 b = 12 a = 4 b = 12 a = 3 b = 12 a = 2 b = 12 a = 1 b = 12 a = 0 b = 12 mlton-20210117+dfsg/regression/once.sml000066400000000000000000000005611416264345000176510ustar00rootroot00000000000000open SMLofNJ.Cont val r: unit cont option ref = ref NONE val a = ref 13 val () = callcc(fn k => r := SOME k) val b = ref 13 val _ = a := !a - 1 val _ = b := !b - 1 val _ = print(concat["a = ", Int.toString(!a), " b = ", Int.toString(!b), "\n"]) val _ = if !a = 0 then () else throw (valOf(!r)) () mlton-20210117+dfsg/regression/only-one-exception.nonterm000066400000000000000000000000001416264345000233340ustar00rootroot00000000000000mlton-20210117+dfsg/regression/only-one-exception.sml000066400000000000000000000001571416264345000224620ustar00rootroot00000000000000fun f n = if n = 0 then 0 else f (f (n - 1)) val _ = f 13 fun loop () = loop () val _ = loop () mlton-20210117+dfsg/regression/opaque.ok000066400000000000000000000000601416264345000200270ustar00rootroot00000000000000f.a = 232 g.A = A g.B = B h.b = 343 i.c = (A,C) mlton-20210117+dfsg/regression/opaque.sml000066400000000000000000000040551416264345000202210ustar00rootroot00000000000000(* From Chapter 5 of Elsman's PhD thesis; these examples should * elaborate. *) (* Decrease in generativity *) functor f() = struct type a = int val a = 232 val pr = Int.toString end :> sig type a val a : a val pr : a -> string end structure f = f() val _ = print ("f.a = " ^ f.pr f.a ^ "\n") functor g() = struct datatype a = A | B fun pr_a A = "A" | pr_a B = "B" val pr_b = pr_a type b = a end :> sig type a type b val A : a val B : b val pr_a : a -> string val pr_b : b -> string end structure g = g() val _ = print ("g.A = " ^ g.pr_a g.A ^ "\n") val _ = print ("g.B = " ^ g.pr_b g.B ^ "\n") functor h(s : sig type a val pr : a -> string val a : a end) = struct val pr = s.pr val b = s.a type b = s.a end :> sig type b val pr : b -> string val b : b end structure h = h(struct type a = int val pr = Int.toString val a = 343 end) val _ = print ("h.b = " ^ h.pr h.b ^ "\n") (* Increase in generativity *) functor i() = struct datatype a = A and b = B | C type c = a * b val c = (A,C) fun pr (A,B) = "(A,B)" | pr (A,C) = "(A,C)" end :> sig type c val c : c val pr : c -> string end structure i = i() val _ = print ("i.c = " ^ i.pr i.c ^ "\n") (* Signature S below is well-formed, but after opacity elimination it * is not. No real structure (i.e., a structure existing outside of a * functor body) can match the signature S. The signature should * elaborate, however. *) structure S = struct type s = int * int end :> sig eqtype s end signature S = sig datatype u = A end where type u = S.s mlton-20210117+dfsg/regression/opaque2.ok000066400000000000000000000000001416264345000201030ustar00rootroot00000000000000mlton-20210117+dfsg/regression/opaque2.sml000066400000000000000000000005341416264345000203010ustar00rootroot00000000000000structure S :> sig type ('a,'b) t val f : ('a,'b) t -> ('b,'a) t val mk : 'a * 'b -> ('a,'b) t end = struct type ('a,'b) t = 'b * 'a fun f (x,y) = (y,x) fun mk (a,b) = (b,a) end val a = S.mk (5, "hello") val b = S.f amlton-20210117+dfsg/regression/open.ok000066400000000000000000000000001416264345000174700ustar00rootroot00000000000000mlton-20210117+dfsg/regression/open.sml000066400000000000000000000003021416264345000176570ustar00rootroot00000000000000(* open.sml *) (* Checks scoping rules of open. *) structure A = struct structure B = struct val x = 1 end end structure B = struct val x = 0.1 end open A B val y = B.x + 1 val z = x + 1.0; mlton-20210117+dfsg/regression/os-exit.ok000066400000000000000000000000061416264345000201250ustar00rootroot00000000000000hello mlton-20210117+dfsg/regression/os-exit.sml000066400000000000000000000001411416264345000203070ustar00rootroot00000000000000val _ = (TextIO.output (TextIO.stdOut, "hello\n") ; OS.Process.exit OS.Process.success) mlton-20210117+dfsg/regression/overloading.ok000066400000000000000000000000001416264345000210400ustar00rootroot00000000000000mlton-20210117+dfsg/regression/overloading.sml000066400000000000000000000005521416264345000212360ustar00rootroot00000000000000(* overloading.sml *) (* Checks overloading resolution. *) val z = 1: Int16.int val y = z + 2 val x = (valOf Int16.minInt) + z fun f(x,y) = (x + y)/y fun g(x,y) = x + (y/y) signature S = sig end val x = f(1.2, 2.3) + g(1.0, 2.0); fun f x = x + let fun g() = x in g() * 2.0 end; (* Checks each overloaded operator at each type. *) mlton-20210117+dfsg/regression/pack-real.2.ok000066400000000000000000000001021416264345000205310ustar00rootroot00000000000000576.105263158 576.105263158 9.93985099471E~242 9.93985099471E~242 mlton-20210117+dfsg/regression/pack-real.2.sml000066400000000000000000000007471416264345000207320ustar00rootroot00000000000000 val v = Word8Vector.fromList [0wx0D,0wxE5,0wx35,0wx94,0wxD7,0wx00,0wx82,0wx40, 0wx0D,0wxE5,0wx35,0wx94,0wxD7,0wx00,0wx82,0wx40] val r = PackReal64Little.subVec(v, 0) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Little.subVec(v, 1) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Big.subVec(v, 0) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Big.subVec(v, 1) val () = print (concat [Real64.toString r, "\n"]) mlton-20210117+dfsg/regression/pack-real.ok000066400000000000000000000024521416264345000204030ustar00rootroot00000000000000r = ~inf FF800000 r = ~0.1E3 C2C80000 r = ~0.11E1 BF8CCCCD r = ~0.12345 BDFCD35B r = ~0.0 80000000 r = 0.0 00000000 r = 0.1E~44 00000001 r = 0.11754944E~37 00800000 r = 0.1E1 3F800000 r = 0.2E1 40000000 r = 0.123E9 4CEA9A98 r = 0.34028235E39 7F7FFFFF r = inf 7F800000 r = ~inf 000080FF r = ~0.1E3 0000C8C2 r = ~0.11E1 CDCC8CBF r = ~0.12345 5BD3FCBD r = ~0.0 00000080 r = 0.0 00000000 r = 0.1E~44 01000000 r = 0.11754944E~37 00008000 r = 0.1E1 0000803F r = 0.2E1 00000040 r = 0.123E9 989AEA4C r = 0.34028235E39 FFFF7F7F r = inf 0000807F r = ~inf FFF0000000000000 r = ~0.1E3 C059000000000000 r = ~0.11E1 BFF199999999999A r = ~0.12345 BFBF9A6B50B0F27C r = ~0.0 8000000000000000 r = 0.0 0000000000000000 r = 0.5E~323 0000000000000001 r = 0.22250738585072014E~307 0010000000000000 r = 0.1E1 3FF0000000000000 r = 0.2E1 4000000000000000 r = 0.123E9 419D535300000000 r = 0.17976931348623157E309 7FEFFFFFFFFFFFFF r = inf 7FF0000000000000 r = ~inf 000000000000F0FF r = ~0.1E3 00000000000059C0 r = ~0.11E1 9A9999999999F1BF r = ~0.12345 7CF2B0506B9ABFBF r = ~0.0 0000000000000080 r = 0.0 0000000000000000 r = 0.5E~323 0100000000000000 r = 0.22250738585072014E~307 0000000000001000 r = 0.1E1 000000000000F03F r = 0.2E1 0000000000000040 r = 0.123E9 0000000053539D41 r = 0.17976931348623157E309 FFFFFFFFFFFFEF7F r = inf 000000000000F07F mlton-20210117+dfsg/regression/pack-real.sml000066400000000000000000000040341416264345000205630ustar00rootroot00000000000000functor Test (structure PackReal: PACK_REAL structure Real: REAL val tests: Real.real list sharing type PackReal.real = Real.real) = struct val _ = if List.all (fn r => let val v = PackReal.toBytes r val _ = print (concat ["r = ", Real.fmt StringCvt.EXACT r, "\t"]) val _ = Word8Vector.app (fn w => let val s = Word8.toString w in print (if String.size s = 1 then concat ["0", s] else s) end) v val _ = print "\n" in Real.== (r, PackReal.fromBytes v) end) tests then () else raise Fail "failure" end val real32Tests = let open Real32 in [negInf, ~100.0, ~1.1, ~0.12345, ~0.0, 0.0, minPos, minNormalPos, 1.0, 2.0, 123E6, maxFinite, posInf] end val real64Tests = let open Real64 in [negInf, ~100.0, ~1.1, ~0.12345, ~0.0, 0.0, minPos, minNormalPos, 1.0, 2.0, 123E6, maxFinite, posInf] end structure Z = Test (structure PackReal = PackReal32Big structure Real = Real32 val tests = real32Tests) structure Z = Test (structure PackReal = PackReal32Little structure Real = Real32 val tests = real32Tests) structure Z = Test (structure PackReal = PackReal64Big structure Real = Real64 val tests = real64Tests) structure Z = Test (structure PackReal = PackReal64Little structure Real = Real64 val tests = real64Tests) mlton-20210117+dfsg/regression/pack-word.ok000066400000000000000000000001441416264345000204270ustar00rootroot000000000000003020100 7060504 OK OK OK 10203 4050607 OK OK OK FFFEFDFC 7060504 OK OK OK FFFEFDFC 4050607 OK OK OK mlton-20210117+dfsg/regression/pack-word.sml000066400000000000000000000015111416264345000206100ustar00rootroot00000000000000functor F (P: PACK_WORD) = struct val v = Word8Vector.tabulate (11, Word8.fromInt) fun p i = print (concat [LargeWord.toString (P.subVec (v, i)), "\n"]) val _ = (p 0; p 1) val _ = List.app (fn i => p i handle Subscript => print "OK\n") [~1, 2, valOf Int.maxInt] end structure S = F (PackWord32Little) structure S = F (PackWord32Big) functor F (P: PACK_WORD) = struct val a = Word8Array.tabulate (11, Word8.fromInt) val _ = P.update (a, 0, 0wxFFFEFDFC) fun p i = print (concat [LargeWord.toString (P.subArr (a, i)), "\n"]) val _ = (p 0; p 1) val _ = List.app (fn i => p i handle Subscript => print "OK\n") [~1, 2, valOf Int.maxInt] end structure S = F (PackWord32Little) structure S = F (PackWord32Big) mlton-20210117+dfsg/regression/pack.ok000066400000000000000000000000031416264345000174500ustar00rootroot00000000000000OK mlton-20210117+dfsg/regression/pack.sml000066400000000000000000000004421416264345000176410ustar00rootroot00000000000000open Array MLton.GC val a = tabulate (100000, fn i => i) val _ = pack () val a' = tabulate (100, fn i => i) val _ = unpack () val _ = sub (a, 0) + sub (a, 1) val _ = sub (a', 0) + sub (a', 1) val a'' = tabulate (1000000, fn i => i) val _ = sub (a'', 0) + sub (a'', 1) val _ = print "OK\n" mlton-20210117+dfsg/regression/parse.ok000066400000000000000000000000471416264345000176540ustar00rootroot00000000000000The name of the structure is: MyStruct mlton-20210117+dfsg/regression/parse.sml000066400000000000000000001041031416264345000200340ustar00rootroot00000000000000(* MLton 20020329 (built Fri Mar 29 21:56:03 2002 on asv-058) *) (* created this file on Wed Apr 3 11:12:56 2002. *) (* Do not edit this file. *) (* Flag settings: *) (* chunk: chunk per function *) (* debug: false *) (* defines: [] *) (* detect overflow: true *) (* drop passes: [] *) (* exn history: false *) (* fixed heap: None *) (* gc check: Limit *) (* host: self *) (* host type: Linux *) (* indentation: 3 *) (* includes: [mlton.h] *) (* inline: NonRecursive {product = 320,small = 60} *) (* input file: sources *) (* instrument: false *) (* instrument Sxml: false *) (* keepSSA: false *) (* keep diagnostics: [] *) (* keep dot: false *) (* keep passes: [] *) (* lib dir: /usr/local/lib/mlton/self *) (* limit check: loop headers (fullCFG = false, loopExits = true) *) (* limit check counts: false *) (* loop passes: 1 *) (* native: true *) (* native commented: 0 *) (* native live stack: false *) (* native optimize: 1 *) (* native move hoist: true *) (* native copy prop: true *) (* native cutoff: 100 *) (* native live transfer: 8 *) (* native future: 64 *) (* native ieee fp: false *) (* native split: Some (20000) *) (* new return: false *) (* polyvariance: Some ({rounds = 2,small = 30,product = 300}) *) (* print at fun entry: false *) (* profile: false *) (* safe: true *) (* show basis used: false *) (* show types: false *) (* stack cont: false *) (* static: false *) (* TextIO buffer size: 4096 *) (* type check: false *) (* use basis library: true *) (* verbosity: Silent *) (* start of FunctionalIO/srcSML/FunctionalIO_sig.sml *) (* This file is part of the FunctionalIO project - which provides functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). E-mail: anoq@HardcoreProcessing.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) signature FUNCTIONAL_IO = sig include IO type vector type elem type instream type outstream val input : instream -> vector * instream val input1 : instream -> (elem * instream) option val inputN : (instream * int) -> vector * instream val closeIn : instream -> unit (* Closes file for further input. New end of file becomes the furthest position in the file that has been read internally. *) end signature FUNC_BIN_IO = sig include FUNCTIONAL_IO val openIn : string -> instream end (* For now we just keep things simple *) signature FUNC_TEXT_IO = FUNC_BIN_IO(* stop of FunctionalIO/srcSML/FunctionalIO_sig.sml *) (* start of FunctionalIO/srcSML/FunctionalIO.sml *) (* This file is part of the FunctionalIO project - which provides functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). E-mail: anoq@HardcoreProcessing.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Notice: This is not thread safe! *) functor FFunctionalIO(type vec type element type instream val impOpenIn : string -> instream val impCloseIn : instream -> unit val impInput : instream -> vec val vecConcat : vec list -> vec val vecExtract : (vec * int * int option) -> vec val vecSub : (vec * int) -> element val vecLength : vec -> int) = struct open IO type vector = vec type elem = element datatype impInChunk = ImpInChunkEnd | ImpInChunkVector of vector * (impInChunk ref) | ImpInChunkStream of instream (* The integer is a functional position in the first vector chunk - if there is a vector chunk at all. *) type instream = int * (impInChunk ref) type outstream = unit (* Internal function implementing inputN *) fun fInputN _ acc inStrRef ImpInChunkEnd n = (* (print "inputN, ChunkEnd\n"; *) (vecConcat (rev acc), (0, inStrRef)) | fInputN pos acc inStrRef (ImpInChunkVector (v, next)) n = let (* val _ = print "inputN, ChunkVector\n" *) val len = vecLength v - pos in if len = n then if pos = 0 then (vecConcat (rev (v::acc)), (0, next)) else let val data = vecExtract (v, pos, SOME(n)) in (vecConcat (rev (data::acc)), (0, next)) end else if len > n then let val data = vecExtract (v, pos, SOME(n)) in (vecConcat (rev (data::acc)), (pos + n, inStrRef)) end else (* i.e.: len < n *) let val data = vecExtract (v, pos, SOME(len)) in fInputN 0 (data::acc) next (!next) (n - len) end end | fInputN _ acc inStrRef (ImpInChunkStream inStr) n = let (* val _ = print "inputN, ChunkStream\n" *) val newVec = impInput inStr val _ = inStrRef := (case vecLength newVec of 0 => (impCloseIn inStr; ImpInChunkEnd) | _ => ImpInChunkVector (newVec, ref (ImpInChunkStream inStr))) in fInputN 0 acc inStrRef (!inStrRef) n end (* FIXME: Return 0-length vector for NONE? *) fun inputN ((pos, inStr), n) = if n < 0 then (* FIXME: No check for maxLen! *) raise Size else fInputN pos nil inStr (!inStr) n (* FIXME: Implement more efficiently... *) fun input1 inStr = let val (v, s) = inputN (inStr, 1) in if vecLength v >= 1 then SOME(vecSub (v, 0), s) else NONE end (* Internal function implementing input *) fun fInput pos inStrRef (ImpInChunkVector (v, next)) = (vecExtract (v, pos, NONE), (0, next)) | fInput pos inStrRef _ = (* FIXME: Implement more efficiently? *) fInputN 0 nil inStrRef (!inStrRef) 64 fun input (pos, inStr) = fInput pos inStr (!inStr) (* Internal function implementing closeIn Maybe we should make a more general parametrized traverse function... *) fun fCloseIn inStrRef (ImpInChunkStream inStr) = (impCloseIn inStr; inStrRef := ImpInChunkEnd) | fCloseIn _ ImpInChunkEnd = () | fCloseIn _ (ImpInChunkVector (_, next)) = fCloseIn next (!next) (* Closes file for further input. New end of file becomes the furthest position in the file that has been read internally. *) fun closeIn (_, inStr) = fCloseIn inStr (!inStr) fun openIn fileName = (0, ref (ImpInChunkStream (impOpenIn fileName))) end structure Word8Vector = struct open Word8Vector fun extract (arr, s, l) = Word8VectorSlice.vector (Word8VectorSlice.slice (arr, s, l)) end structure CharVector = struct open CharVector fun extract (arr, s, l) = CharVectorSlice.vector (CharVectorSlice.slice (arr, s, l)) end structure FuncBinIO = FFunctionalIO(type vec = Word8Vector.vector type element = Word8.word type instream = BinIO.instream val impOpenIn = BinIO.openIn val impCloseIn = BinIO.closeIn val impInput = BinIO.input val vecConcat = Word8Vector.concat val vecExtract = Word8Vector.extract val vecSub = Word8Vector.sub val vecLength = Word8Vector.length) :> FUNC_BIN_IO where type vector = Word8Vector.vector and type elem = Word8.word structure FuncTextIO = FFunctionalIO(type vec = CharVector.vector type element = Char.char type instream = TextIO.instream val impOpenIn = TextIO.openIn val impCloseIn = TextIO.closeIn val impInput = TextIO.input val vecConcat = CharVector.concat val vecExtract = CharVector.extract val vecSub = CharVector.sub val vecLength = CharVector.length) :> FUNC_TEXT_IO where type vector = CharVector.vector and type elem = Char.char(* stop of FunctionalIO/srcSML/FunctionalIO.sml *) (* start of ParsingToolkit/srcSML/ParserCombinators_sig.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) signature PARSER_COMBINATORS = sig type instream (* This is FuncTextIO.instream in TextIOParserCombinators and FuncBinIO.instream in BinIOParserCombinators *) type vec (* This is string in TextIOParserCombinators and Word8Vector.vector in BinIOParserCombinators *) type elem (* This is char in TextIOParserCombinators and Word8.word in BinIOParserCombinators *) (* This is the type of a parser. A parser is a function taking a functional instream as argument. It returns a value that has been created by the parser during parsing, and a new functional instream with the stream position updated to where the parser stopped reading. *) type 'a parser = instream -> ('a * instream) (* SyntaxError is raised when a parser fails to parse. *) exception SyntaxError of string * instream (* Functions given to the >> combinator are expected to raise ValidityError on invalid arguments. *) exception ValidityError of string (* The combinators *) (* The purpose of this combinator is to try parsing with 2 parser functions and return the result of the first function that succeeds. *) val || : ('a parser) * ('a parser) -> ('a parser) (* This combinator will execute 2 parsers in sequence and return a pair of the results of the parsers. *) val -- : ('a parser) * ('b parser) -> (('a * 'b) parser) (* This combinator executes 2 parsers in sequence and ignores the result of the first parser. *) val $-- : ('a parser) * ('b parser) -> ('b parser) (* This combinator executes 2 parsers in sequence and ignores the result of the second parser. *) val --$ : ('a parser) * ('b parser) -> ('a parser) (* Execute a parser and run the result through a function. *) val >> : ('a parser) * ('a -> 'b) -> ('b parser) (* This combinator is for reading an verifying an expected keyword. *) val $$ : vec -> (vec parser) (* Some handy built-in parsers. *) (* Doesn't parse anything, just returns nil. *) val empty : ('a list) parser (* Given a predicate, returns a parser that will read an element from the stream if the predicate is true. *) val getIf : (elem -> bool) -> (elem parser) (* Given a parser, returns a parser that will read a list of values with the given parser. Parses as many values as possible. *) val repeat : ('a parser) -> (('a list) parser) (* Given a predicate, returns a parser that will read a list of elements, until the predicate is false. *) val repeatIf : (elem -> bool) -> ((elem list) parser) (* Given a number n and a parser, returns a parser that parses a list of n values with the given parser. *) val repeatN : int -> ('a parser) -> ('a list parser) (* Same as repeatIf, except that this will read at least one value - or fail. *) val repeatOneIf : (elem -> bool) -> ((elem list) parser) end (* stop of ParsingToolkit/srcSML/ParserCombinators_sig.sml *) (* start of ParsingToolkit/srcSML/ParserCombinators.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) infix 6 $-- infix 6 --$ infix 5 -- infix 3 >> (* infix 1 // *) infix 0 || functor FParserCombinators(structure FIO : FUNCTIONAL_IO type vec type elem val elemToString : elem -> string val vecLength : vec -> int val vecEqual : (vec * vec) -> bool val vecToString : vec -> string sharing type elem = FIO.elem sharing type vec = FIO.vector) :> PARSER_COMBINATORS where type instream = FIO.instream and type vec = vec and type elem = elem = struct type instream = FIO.instream type vec = vec type elem = elem (* FIXME: Use FIO.StreamIO.PrimIO.compare instead... *) (* val csSize = Substring.size *) (* Exceptions for combinator errors *) exception SyntaxError of string * instream exception ValidityError of string type 'a parser = instream -> ('a * instream) fun (pf1 || pf2) stream = pf1 stream handle exn1 as (SyntaxError (_, stream1)) => (pf2 stream handle exn2 as (SyntaxError (_, stream2)) => raise exn1 (* FIXME: We could compare with FIO.StreamIO.PrimIO.compare if it was implemented *) (* if csSize stream1 < csSize stream2 then raise exn1 else raise exn2 *) ) fun (pf1 -- pf2) stream = let val (res1, stream1) = pf1 stream val (res2, stream2) = pf2 stream1 in ((res1, res2), stream2) end fun (pf1 $-- pf2) stream = let val (_, stream1) = pf1 stream in pf2 stream1 end fun (pf1 --$ pf2) stream = let val (res1, stream1) = pf1 stream val (_, stream2) = pf2 stream1 in (res1, stream2) end fun (pf >> f) stream = let val (res, stream') = pf stream in (f res, stream') handle ValidityError msg => raise SyntaxError (msg, stream') end fun $$ s stream = let val (v, stream2) = FIO.inputN (stream, vecLength s) in if vecEqual (v, s) then (s, stream2) else raise SyntaxError ((vecToString s) ^ " expected", stream) end fun empty stream = (nil, stream) (* Utility functions *) (* This implementation (and several others I've tried) runs out of memory on test.rib. I assume it is because of the stack of exceptions. *) (* fun repeat pf stream = (pf -- repeat pf >> op:: || empty) stream *) (* Working implementation of repeat - takes 1.45 sec for parsing test.rib when using SML/NJ 110.0.6 on Linux on a 166Mhz Pentium. It does not use huge amounts of memory when compared to the amount of data being read. *) fun repeat pf stream = let fun oneIter stream = let val (res, stream') = pf stream in (SOME(res), stream') end handle SyntaxError _ => (NONE, stream) fun rep acc (NONE, stream) = (rev acc, stream) | rep acc (SOME(res), stream) = rep (res :: acc) (oneIter stream) in rep nil (oneIter stream) end fun repeatN n pf stream = if n > 0 then let fun oneIter stream = let val (res, stream') = pf stream in (SOME(res), stream') end handle SyntaxError _ => (NONE, stream) fun rep n acc (NONE, stream) = raise SyntaxError ("Could not repeat parser the last " ^ (Int.toString n) ^ " times!", stream) | rep n acc (SOME(res), stream) = if n > 0 then rep (n - 1) (res :: acc) (oneIter stream) else (rev (res::acc), stream) in (* We subtract 1 from n because we call oneIter once already here *) rep (n - 1) nil (oneIter stream) end else (nil, stream) fun getIf pred stream = case FIO.input1 stream of SOME (res as (e, stream')) => if pred e then res else raise SyntaxError ((elemToString e) ^ " unexpected", stream) | NONE => raise SyntaxError ("Unexpected end of file", stream) fun repeatIf pred = repeat (getIf pred) fun repeatOneIf pred = getIf pred -- repeatIf pred >> op:: end structure TextIOParserCombinators = FParserCombinators(structure FIO = FuncTextIO type vec = string type elem = char val elemToString = Char.toString val vecLength = size val vecEqual = (fn (s1, s2) => s1 = s2) val vecToString = (fn s => s)) structure BinIOParserCombinators = FParserCombinators(structure FIO = FuncBinIO type vec = Word8Vector.vector type elem = Word8.word (* FIXME: These anonymous functions are ugly... implement them somewhere else *) val elemToString = (fn e => Char.toString (chr (Word8.toInt e))) val vecLength = Word8Vector.length val vecEqual = (fn (v1, v2) => #2 (Word8Vector.foldl (fn (e, (index, value)) => (index + 1, value andalso ((Word8.compare (e, Word8Vector.sub (v2, index))) = EQUAL))) (0, true) v1)) val vecToString = (fn v => String.concat (Word8Vector.foldr (fn (e, acc) => (elemToString e)::acc) nil v))) (* stop of ParsingToolkit/srcSML/ParserCombinators.sml *) (* start of ParsingToolkit/srcSML/TextIOParserCombExtra_sig.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) signature TEXT_IO_PARSER_COMB_EXTRA = sig type instream = TextIOParserCombinators.instream type elem = TextIOParserCombinators.elem type 'a parser = 'a TextIOParserCombinators.parser val isWhitespaceChar : char -> bool val isLetterChar : char -> bool val isDigitChar : char -> bool val whitespaceForce : elem list parser val whitespace : elem list parser val getReal : instream -> real * instream val getRealWS : real parser end (* stop of ParsingToolkit/srcSML/TextIOParserCombExtra_sig.sml *) (* start of ParsingToolkit/srcSML/TextIOParserCombExtra.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) functor FTextIOParserCombExtra() :> TEXT_IO_PARSER_COMB_EXTRA = struct open TextIOParserCombinators (* Character predicates *) fun isWhitespaceChar #" " = true | isWhitespaceChar #"\009" = true | isWhitespaceChar #"\r" = true | isWhitespaceChar #"\n" = true | isWhitespaceChar _ = false val isLetterChar = Char.isAlpha (* must be generalized! *) val isDigitChar = Char.isDigit (* Lexical scanner functions *) val whitespaceForce = repeatOneIf isWhitespaceChar val whitespace = repeatIf isWhitespaceChar fun getReal stream = let val (digits, stream1) = repeatOneIf (fn c => isDigitChar c orelse c = #"." orelse c = #"-") stream val realChars = map (fn c => if c = #"-" then #"~" else c) digits val realStr = implode realChars in case Real.fromString realStr of NONE => raise SyntaxError ("The string " ^ realStr ^ " is not a real number", stream1) | SOME r => (r, stream1) end val getRealWS = getReal --$ whitespace end structure TextIOParserCombExtra = FTextIOParserCombExtra()(* stop of ParsingToolkit/srcSML/TextIOParserCombExtra.sml *) (* start of RepeatParserCombinatorTest.sml *) (* Create a text file with a Standard ML Modules code snippet *) val outStr = TextIO.openOut "RepeatParserCombinator.txt" val _ = TextIO.output (outStr, "structure MyStruct = struct end") val _ = TextIO.closeOut outStr (* Now for the combinator parser test using the repeat and >> combinators *) structure FIO = FuncTextIO local open TextIOParserCombinators in (* White space *) fun isWhitespaceChar #" " = true | isWhitespaceChar #"\009" = true | isWhitespaceChar #"\r" = true | isWhitespaceChar #"\n" = true | isWhitespaceChar _ = false val whitespace = (repeatIf isWhitespaceChar) >> (fn _ => ()) (* End white *) val EQUALS = ($$ "=") -- whitespace fun isIdentChar c = Char.isAlphaNum c orelse c = #"'" orelse c = #"_" fun isIdentStartChar c = Char.isAlpha c orelse c = #"'" fun isSymbolChar (#"!") = true | isSymbolChar (#"%") = true | isSymbolChar (#"&") = true | isSymbolChar (#"$") = true | isSymbolChar (#"#") = true | isSymbolChar (#"+") = true | isSymbolChar (#"-") = true | isSymbolChar (#"/") = true | isSymbolChar (#":") = true | isSymbolChar (#"<") = true | isSymbolChar (#"=") = true | isSymbolChar (#">") = true | isSymbolChar (#"?") = true | isSymbolChar (#"@") = true | isSymbolChar (#"\\") = true | isSymbolChar (#"~") = true | isSymbolChar (#"`") = true | isSymbolChar (#"^") = true | isSymbolChar (#"|") = true | isSymbolChar (#"*") = true | isSymbolChar _ = false val alphaIdentNoWS = ((getIf isIdentStartChar) -- (repeatIf isIdentChar)) >> (fn (a, b) => implode (a::b)) val symbolIdentNoWS = (repeatOneIf isSymbolChar) >> implode val identNoWS = alphaIdentNoWS || symbolIdentNoWS val ident = identNoWS --$ whitespace fun validateReserved res str = if str = res then str else raise ValidityError ("Expected token " ^ res ^ " not found! Found " ^ str ^ " instead.") fun reserved parser res inStr = (parser >> (validateReserved res)) inStr (* And the next is really beautiful functional programming :) *) val STRUCTURE = reserved ident "structure" val STRUCT = reserved ident "struct" val END = reserved ident "end" fun parseStructure inStr = let val (result, inStr2) = ((((STRUCTURE $-- ident) --$ (EQUALS --$ STRUCT)) --$ END) >> (fn str => str)) inStr in result end handle (SyntaxError (msg, inStr)) => (print ("Syntax error while parsing:\n" ^ msg ^ "\n"); "") | _ => (print "Error during parsing!\n"; "") fun import fileName = let val inStr = FIO.openIn fileName val result = parseStructure inStr val _ = FIO.closeIn inStr in result end end (* end local *) val structureName = import "RepeatParserCombinator.txt" val _ = print ("The name of the structure is: " ^ structureName) val _ = print "\n" (* stop of RepeatParserCombinatorTest.sml *) mlton-20210117+dfsg/regression/pat.ok000066400000000000000000000000141416264345000173200ustar00rootroot00000000000000hello world mlton-20210117+dfsg/regression/pat.sml000066400000000000000000000003521416264345000175070ustar00rootroot00000000000000val c: int as d: int = 13 val c: unit -> unit as d: unit -> unit = fn () => () val c: 'a -> unit as d: 'a -> unit = fn _ => () val (f, hd::tail) = (fn x => x, [fn y => (y,y)]) val (s,_) = f (hd "hello world\n") val _ = print (s) mlton-20210117+dfsg/regression/poly-equal.2.ok000066400000000000000000000000001416264345000207570ustar00rootroot00000000000000mlton-20210117+dfsg/regression/poly-equal.2.sml000066400000000000000000000013611416264345000211540ustar00rootroot00000000000000fun assert (msg,b) = if b then () else print ("assertion failed: " ^ msg ^ "\n") datatype 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree val _ = (assert ("string equal", "foobar" = "foobar") ; assert ("string not equal", "foobar" <> "foobaz") ; assert ("tuple equal", (1,2,3) = (1,2,3)) ; assert ("tuple not equal", (1,2,3) <> (1,2,4)) ; assert ("list equal", [1,2,3] = [1,2,3]) ; assert ("list not equal", [1,2,3] <> [1,2,3,4]) ; assert ("pair list equal", [(1,2), (3,4)] = [(1,2), (3,4)]) ; assert ("pair list not equal", [(1,2), (3,4)] <> [(1,2), (3,5)]) ; assert ("tree equal", let val t = Node (1, Leaf 2, Node (3, Leaf 4, Leaf 5)) in t = t end)) mlton-20210117+dfsg/regression/poly-equal.ok000066400000000000000000000000061416264345000206250ustar00rootroot00000000000000false mlton-20210117+dfsg/regression/poly-equal.sml000066400000000000000000000001561416264345000210150ustar00rootroot00000000000000val _ = print(if ([1, 2, 3], [4, 5]) = ([1, 2, 3], [4]) then "true\n" else "false\n") mlton-20210117+dfsg/regression/polymorphic-recursion.ok000066400000000000000000000000001416264345000231030ustar00rootroot00000000000000mlton-20210117+dfsg/regression/polymorphic-recursion.sml000066400000000000000000000032411416264345000232770ustar00rootroot00000000000000datatype 'a t = R of 'a | L of 'a t t val rec build: int -> int t = fn 0 => R 17 | n => L (R (build (n - 1))) val rec depth: int t -> int = fn R _ => 0 | L (R z) => 1 + depth z | _ => raise Match val n = depth (build 13) val _ = if n = 13 then () else raise Fail "bug" (* val _ = R 13 val _ = L (R (R 13)) val rec build: int -> int t = fn 0 => R 13 | n => L (R (build (n - 1))) val _ = f 13 *) (* val rec f = fn R _ => 0 | L (R z) => 1 + f z val v0: int t = R 13 val v2: int t t = R v0 val v1: int t = L (v2: int t t) val _ = L (L (R (R (R 13)))) val _ = L (R (L (R (R 13)))) val _ = L (L (R (R (R (R (R 13)))))) *) (* datatype 'a t = A of 'a | B of ('a t * 'a t) t val v1 = A 13 val v2 = A (v1, v1) val v3 = A (v2, v2) val v4 = B v3 val v5 = B v4 val x = A 1 : int t val y = B (A (x, x)) val z = B (A (y, y)) val a = B (A (z, z)) fun d ((A _) : 'a t) : int = 0 | d ((B (A (x, _))) : 'a t) : int = 1 + d x val n = d a *) (* Here's (the relevant part of) what the monomorphiser in smlc returns for your program. datatype t_0 = B_0 of t_1 | A_0 of int and t_1 = A_1 of (t_0 * t_0) It figures out exactly your observation that every use of B must be followed by A. [z0 = int t] datatype z0 = A of int | B of z1 [z1 = (z0 * z0) t] datatype z1 = A of z0 * z0 | B of z2 [z2 = (z1 * z1) t] datatype z2 = A of z1 * z1 | B of z3 [z3 = (z2 * z2) t] B z1 B (B z2) B (B (A (z1, z1))) B (B (A (A (z0,z0), A (z0,z0)))) B (B (A (A (v1, v1), A (v1, v1)))) B (B (A (A (v1, v1), A (v1, v1)))) datatype z = A of int | B of (z * z) t datatype w = A of z * z | B of (w * w) t *) mlton-20210117+dfsg/regression/posix-exit.ok000066400000000000000000000000001416264345000206400ustar00rootroot00000000000000mlton-20210117+dfsg/regression/posix-exit.sml000066400000000000000000000001231416264345000210300ustar00rootroot00000000000000val _ = (TextIO.output (TextIO.stdOut, "hello") ; Posix.Process.exit 0w0) mlton-20210117+dfsg/regression/posix-procenv.sml000066400000000000000000000007551416264345000215460ustar00rootroot00000000000000 fun downto n = if n = 0 then 0 else downto (n - 1) val truee = 1 = downto 0 open Posix.ProcEnv val egid = getegid () val env = getenv "HOME" val euid = geteuid () val gid = getgid () val groups = getgroups () val login = getlogin () handle _ => "" val pgrp = getpgrp () val pid = getpid () val ppid = getppid () val uid = getuid () val () = setgid gid val () = setpgid {pgid = SOME pid, pid = SOME pid} val () = ignore (setsid ()) handle _ => () val () = setuid uid mlton-20210117+dfsg/regression/print-self.ok000066400000000000000000000005161416264345000206260ustar00rootroot00000000000000val K = "\nval _ = print (concat [\"val K = \\\"\", String.translate (fn #\"\\n\" => \"\\\\n\" | #\"\\\\\" => \"\\\\\\\\\" | #\"\\\"\" => \"\\\\\\\"\" | c => str c) K, \"\\\"\", K, \"\\n\"])" val _ = print (concat ["val K = \"", String.translate (fn #"\n" => "\\n" | #"\\" => "\\\\" | #"\"" => "\\\"" | c => str c) K, "\"", K, "\n"]) mlton-20210117+dfsg/regression/print-self.sml000066400000000000000000000005161416264345000210100ustar00rootroot00000000000000val K = "\nval _ = print (concat [\"val K = \\\"\", String.translate (fn #\"\\n\" => \"\\\\n\" | #\"\\\\\" => \"\\\\\\\\\" | #\"\\\"\" => \"\\\\\\\"\" | c => str c) K, \"\\\"\", K, \"\\n\"])" val _ = print (concat ["val K = \"", String.translate (fn #"\n" => "\\n" | #"\\" => "\\\\" | #"\"" => "\\\"" | c => str c) K, "\"", K, "\n"]) mlton-20210117+dfsg/regression/prodcons.ok000066400000000000000000000000161416264345000203650ustar00rootroot00000000000000100000 100000 mlton-20210117+dfsg/regression/prodcons.sml000066400000000000000000000156621416264345000205640ustar00rootroot00000000000000open Posix.Signal MLton.Signal (* Translated from prodcons.ocaml. *) fun for (start, stop, f) = let fun loop i = if i > stop then () else (f i; loop (i + 1)) in loop start end fun print s = () structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit structure Mutex: sig type t val new: unit -> t val lock: t * string -> unit val unlock: t -> unit end structure Condition: sig type t val new: unit -> t val signal: t -> unit val wait: t * Mutex.t -> unit end end = struct open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t: unit = Queue.enque (threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => (print "switching to toplevel\n" ; valOf (!topLevel)) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (print "scheduling\n" ; ready t ; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 20))))) ; setItimer Time.zeroTime ; ignore alrm ; topLevel := NONE) structure Mutex = struct datatype t = T of {locked: bool ref, waiting: unit Thread.t Queue.t} fun new () = T {locked = ref false, waiting = Queue.new ()} fun lock (T {locked, waiting, ...}, name) = let fun loop () = (print (concat [name, " lock looping\n"]) ; Thread.atomicBegin () ; if !locked then (print "mutex is locked\n" ; switch (fn t => (Thread.atomicEnd () ; Queue.enque (waiting, t) ; next ())) ; loop ()) else (print "mutex is not locked\n" ; locked := true ; Thread.atomicEnd ())) in loop () end fun safeUnlock (T {locked, waiting, ...}) = (locked := false ; (case Queue.deque waiting of NONE => () | SOME t => (print "unlock found waiting thread\n" ; ready (Thread.prepare (t, ()))))) fun unlock (m: t) = (print "unlock atomicBegin\n" ; Thread.atomicBegin () ; safeUnlock m ; Thread.atomicEnd ()) end structure Condition = struct datatype t = T of {waiting: unit Thread.t Queue.t} fun new () = T {waiting = Queue.new ()} fun wait (T {waiting, ...}, m) = (switch (fn t => (Mutex.safeUnlock m ; print "wait unlocked mutex\n" ; Queue.enque (waiting, t) ; next ())) ; Mutex.lock (m, "wait")) fun signal (T {waiting, ...}) = case Queue.deque waiting of NONE => () | SOME t => ready (Thread.prepare (t, ())) end end structure Mutex = Thread.Mutex structure Condition = Thread.Condition val count = ref 0 val data = ref 0 val produced = ref 0 val consumed = ref 0 val m = Mutex.new () val c = Condition.new () fun producer n = for (1, n, fn i => (print (concat ["producer acquiring lock ", Int.toString i, "\n"]) ; Mutex.lock (m, "producer") ; print "producer acquired lock\n" ; while !count = 1 do Condition.wait (c, m) ; print "producer passed condition\n" ; data := i ; count := 1 ; Condition.signal c ; print "producer releasing lock\n" ; Mutex.unlock m ; print "producer released lock\n" ; produced := !produced + 1)) fun consumer n = let val i = ref 0 in while !i <> n do (print (concat ["consumer acquiring lock ", Int.toString (!i), "\n"]) ; Mutex.lock (m, "consumer") ; print "consumer acquired lock\n" ; while !count = 0 do Condition.wait (c, m) ; i := !data ; count := 0 ; Condition.signal c ; print "consumer releasing lock\n" ; Mutex.unlock m ; print "consumer released lock\n" ; consumed := !consumed + 1) end fun atoi s = case Int.fromString s of SOME num => num | NONE => 0 fun printl [] = TextIO.print "\n" | printl (h::t) = ( TextIO.print h ; printl t ) fun main (name, args) = let val n = atoi (hd (args @ ["1"])) val p = Thread.spawn (fn () => producer n) val c = Thread.spawn (fn () => consumer n) val _ = Thread.run () val _ = Posix.Process.sleep (Time.fromSeconds 1) val _ = printl [Int.toString (!produced), " ", Int.toString (!consumed)] in () end val _ = main ( "prodcons", ["100000"] ) mlton-20210117+dfsg/regression/pseudokit.sml000066400000000000000000000013371416264345000207360ustar00rootroot00000000000000structure Set = struct datatype Set = S end signature FINMAPEQ = sig type map val dom : map -> Set.Set end functor FinMapEq() = struct datatype map = M fun dom m = Set.S end signature TOOLS = sig structure FinMapEq : FINMAPEQ end functor Tools (): TOOLS = struct structure FinMapEq = FinMapEq() end (* functor Basics(structure Tools : sig structure FinMapEq : sig type map val dom : map -> Set.Set end end) = *) functor Basics(structure Tools : TOOLS) = struct structure Tools = Tools end functor KitCompiler() = struct structure Tools = Tools() structure Basics = Basics(structure Tools = Tools) end structure K = KitCompiler() mlton-20210117+dfsg/regression/real-algsimp.ok000066400000000000000000000001201416264345000211070ustar00rootroot00000000000000false false false false false true true false false false false false true true mlton-20210117+dfsg/regression/real-algsimp.sml000066400000000000000000000012671416264345000213060ustar00rootroot00000000000000val one = valOf (Real.fromString "1.0") val zero = valOf (Real.fromString "0.0") val posInf = one / zero val negInf = ~one / zero val nan1 = posInf + negInf fun cmp f = print ((Bool.toString (f (nan1, nan1))) ^ "\n") local open Real in val _ = cmp (op <) val _ = cmp (op <=) val _ = cmp (op >) val _ = cmp (op >=) val _ = cmp (op ==) val _ = cmp (op !=) val _ = cmp (op ?=) end val nan2 = valOf (Real.fromString "nan") fun cmp f = print ((Bool.toString (f (nan1, nan2))) ^ "\n") local open Real in val _ = cmp (op <) val _ = cmp (op <=) val _ = cmp (op >) val _ = cmp (op >=) val _ = cmp (op ==) val _ = cmp (op !=) val _ = cmp (op ?=) end mlton-20210117+dfsg/regression/real-basic.ok000066400000000000000000000011531416264345000205430ustar00rootroot00000000000000Real32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Exported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Exported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 mlton-20210117+dfsg/regression/real-basic.sml000066400000000000000000000052431416264345000207310ustar00rootroot00000000000000functor Basic(structure Real : REAL structure Pack : PACK_REAL where type real = Real.real) = struct open Real val () = print " Reported\n" val () = print (" precision: " ^ Int.toString precision ^ "\n") val {man=_, exp} = toManExp maxFinite val () = print (" max exponent: " ^ Int.toString exp ^ "\n") val {man=_, exp} = toManExp minNormalPos val () = print (" min exponent: " ^ Int.toString exp ^ "\n") val {man=_, exp} = toManExp minPos val () = print (" min denormal: " ^ Int.toString exp ^ "\n") (* Now let's compute the actual mantissa *) val zero = fromInt 0 val one = fromInt 1 val two = fromInt 2 fun precision eq x = if eq (x+one, x) then 0 else Int.+ (1, precision eq (x+x)) fun maxExp eq x = if eq (x, x+x) then 0 else Int.+ (1, maxExp eq (x+x)) fun lowBit (1, x) = x | lowBit (i, x) = lowBit (Int.- (i, 1), x / two) fun minExp eq x = if not (eq (x, (x / two) * two)) orelse eq (x, zero) then 1 else Int.- (minExp eq (x / two), 1) val eq = == val xprecision = precision eq one val lastBit = one + lowBit (xprecision, one) val xmaxExp = maxExp eq one val xminNormalExp = minExp eq lastBit val xminExp = minExp eq one val () = print " Actual\n" val () = print (" precision: " ^ Int.toString xprecision ^ "\n") val () = print (" max exponent: " ^ Int.toString xmaxExp ^ "\n") val () = print (" min exponent: " ^ Int.toString xminNormalExp ^ "\n") val () = print (" min denormal: " ^ Int.toString xminExp ^ "\n") val a = Word8Array.array (Pack.bytesPerElem, 0w0) fun id x = (Pack.update (a, 0, x); Pack.subArr (a, 0)) val eq = fn (x, y) => == (id x, id y) val xprecision = precision eq one val lastBit = one + lowBit (xprecision, one) val xmaxExp = maxExp eq one val xminNormalExp = minExp eq lastBit val xminExp = minExp eq one val () = print " Exported\n" val () = print (" precision: " ^ Int.toString xprecision ^ "\n") val () = print (" max exponent: " ^ Int.toString xmaxExp ^ "\n") val () = print (" min exponent: " ^ Int.toString xminNormalExp ^ "\n") val () = print (" min denormal: " ^ Int.toString xminExp ^ "\n") end val () = print "Real32\n" structure Z = Basic(structure Real = Real32 structure Pack = PackReal32Little) val () = print "Real64\n" structure Z = Basic(structure Real = Real64 structure Pack = PackReal64Big) mlton-20210117+dfsg/regression/real-basic.x86.ok000066400000000000000000000011531416264345000211670ustar00rootroot00000000000000Real32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20210117+dfsg/regression/real-decimal.1.ok000066400000000000000000000001061416264345000212140ustar00rootroot00000000000000minusIEEENan = ~nan signBit (valOf (fromDecimal minusIEEENan)) = true mlton-20210117+dfsg/regression/real-decimal.1.sml000066400000000000000000000007761416264345000214130ustar00rootroot00000000000000(* * The Basis Library description for fromDecimal in signature REAL states: * * ... If class is NAN, a signed NaN is generated. * * However, it appears that the generated NaN always has the sign bit cleared. *) open Real; val minusIEEENan = {class = IEEEReal.NAN, sign = true, digits = [], exp = 0}; app print [ "minusIEEENan = ", IEEEReal.toString minusIEEENan, "\n", "signBit (valOf (fromDecimal minusIEEENan)) = ", Bool.toString (signBit (valOf (fromDecimal minusIEEENan))), "\n" ]; mlton-20210117+dfsg/regression/real-int.ok000066400000000000000000063722761416264345000203030ustar00rootroot00000000000000[~2147483648,~2147483648] --> [~0.21474836E10,~0.21474836E10] --> OK [~2147483647,~2147483647] --> [~0.21474836E10,~0.21474836E10] --> OK [~2147483646,~2147483646] --> [~0.21474836E10,~0.21474836E10] --> OK [~2147483645,~2147483645] --> [~0.21474836E10,~0.21474836E10] --> OK [~2113929217,~2113929217] --> [~0.21139292E10,~0.21139292E10] --> OK [~2080374785,~2080374785] --> [~0.20803748E10,~0.20803748E10] --> OK [~2013265921,~2013265921] --> [~0.20132659E10,~0.20132659E10] --> OK [~1879048193,~1879048193] --> [~0.18790482E10,~0.18790482E10] --> OK [~1610612737,~1610612737] --> [~0.16106127E10,~0.16106127E10] --> OK [~1073741825,~1073741825] --> [~0.10737418E10,~0.10737418E10] --> OK [~3,~3] --> [~0.3E1,~0.3E1] --> OK [~2,~2] --> [~0.2E1,~0.2E1] --> OK [~1,~1] --> [~0.1E1,~0.1E1] --> OK [0,0] --> [0.0,0.0] --> OK [1,1] --> [0.1E1,0.1E1] --> OK [2,2] --> [0.2E1,0.2E1] --> OK [3,3] --> [0.3E1,0.3E1] --> OK [1073741824,1073741824] --> [0.10737418E10,0.10737418E10] --> OK [1610612736,1610612736] --> [0.16106127E10,0.16106127E10] --> OK [1879048192,1879048192] --> [0.18790482E10,0.18790482E10] --> OK [2013265920,2013265920] --> [0.20132659E10,0.20132659E10] --> OK [2080374784,2080374784] --> [0.20803748E10,0.20803748E10] --> OK [2113929216,2113929216] --> [0.21139292E10,0.21139292E10] --> OK [2147483644,2147483644] --> [0.21474836E10,0.21474836E10] --> OK [2147483645,2147483645] --> [0.21474836E10,0.21474836E10] --> OK [2147483646,2147483646] --> [0.21474836E10,0.21474836E10] --> OK [2147483647,2147483647] --> [0.21474836E10,0.21474836E10] --> OK [~0.21475E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.21139374E10,TO_NEAREST] --> [~2113937408,~2113937408] --> OK [~0.21139373E10,TO_NEAREST] --> [~2113937280,~2113937280] --> OK [~0.21139372E10,TO_NEAREST] --> [~2113937152,~2113937152] --> OK [~0.2113937E10,TO_NEAREST] --> [~2113937024,~2113937024] --> OK [~0.21139369E10,TO_NEAREST] --> [~2113936896,~2113936896] --> OK [~0.21139368E10,TO_NEAREST] --> [~2113936768,~2113936768] --> OK [~0.21139366E10,TO_NEAREST] --> [~2113936640,~2113936640] --> OK [~0.21139365E10,TO_NEAREST] --> [~2113936512,~2113936512] --> OK [~0.21139364E10,TO_NEAREST] --> [~2113936384,~2113936384] --> OK [~0.21139363E10,TO_NEAREST] --> [~2113936256,~2113936256] --> OK [~0.21139361E10,TO_NEAREST] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_NEAREST] --> [~2113936000,~2113936000] --> OK [~0.21139359E10,TO_NEAREST] --> [~2113935872,~2113935872] --> OK [~0.21139357E10,TO_NEAREST] --> [~2113935744,~2113935744] --> OK [~0.21139356E10,TO_NEAREST] --> [~2113935616,~2113935616] --> OK [~0.21139355E10,TO_NEAREST] --> [~2113935488,~2113935488] --> OK [~0.21139354E10,TO_NEAREST] --> [~2113935360,~2113935360] --> OK [~0.21139352E10,TO_NEAREST] --> [~2113935232,~2113935232] --> OK [~0.21139351E10,TO_NEAREST] --> [~2113935104,~2113935104] --> OK [~0.2113935E10,TO_NEAREST] --> [~2113934976,~2113934976] --> OK [~0.21139348E10,TO_NEAREST] --> [~2113934848,~2113934848] --> OK [~0.21139347E10,TO_NEAREST] --> [~2113934720,~2113934720] --> OK [~0.21139346E10,TO_NEAREST] --> [~2113934592,~2113934592] --> OK [~0.21139345E10,TO_NEAREST] --> [~2113934464,~2113934464] --> OK [~0.21139343E10,TO_NEAREST] --> [~2113934336,~2113934336] --> OK [~0.21139342E10,TO_NEAREST] --> [~2113934208,~2113934208] --> OK [~0.21139341E10,TO_NEAREST] --> [~2113934080,~2113934080] --> OK [~0.2113934E10,TO_NEAREST] --> [~2113933952,~2113933952] --> OK [~0.21139338E10,TO_NEAREST] --> [~2113933824,~2113933824] --> OK [~0.21139337E10,TO_NEAREST] --> [~2113933696,~2113933696] --> OK [~0.21139336E10,TO_NEAREST] --> [~2113933568,~2113933568] --> OK [~0.21139334E10,TO_NEAREST] --> [~2113933440,~2113933440] --> OK [~0.21139333E10,TO_NEAREST] --> [~2113933312,~2113933312] --> OK [~0.21139332E10,TO_NEAREST] --> [~2113933184,~2113933184] --> OK [~0.2113933E10,TO_NEAREST] --> [~2113933056,~2113933056] --> OK [~0.21139329E10,TO_NEAREST] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_NEAREST] --> [~2113932800,~2113932800] --> OK [~0.21139327E10,TO_NEAREST] --> [~2113932672,~2113932672] --> OK [~0.21139325E10,TO_NEAREST] --> [~2113932544,~2113932544] --> OK [~0.21139324E10,TO_NEAREST] --> [~2113932416,~2113932416] --> OK [~0.21139323E10,TO_NEAREST] --> [~2113932288,~2113932288] --> OK [~0.21139322E10,TO_NEAREST] --> [~2113932160,~2113932160] --> OK [~0.2113932E10,TO_NEAREST] --> [~2113932032,~2113932032] --> OK [~0.21139319E10,TO_NEAREST] --> [~2113931904,~2113931904] --> OK [~0.21139318E10,TO_NEAREST] --> [~2113931776,~2113931776] --> OK [~0.21139316E10,TO_NEAREST] --> [~2113931648,~2113931648] --> OK [~0.21139315E10,TO_NEAREST] --> [~2113931520,~2113931520] --> OK [~0.21139314E10,TO_NEAREST] --> [~2113931392,~2113931392] --> OK [~0.21139313E10,TO_NEAREST] --> [~2113931264,~2113931264] --> OK [~0.21139311E10,TO_NEAREST] --> [~2113931136,~2113931136] --> OK [~0.2113931E10,TO_NEAREST] --> [~2113931008,~2113931008] --> OK [~0.21139309E10,TO_NEAREST] --> [~2113930880,~2113930880] --> OK [~0.21139308E10,TO_NEAREST] --> [~2113930752,~2113930752] --> OK [~0.21139306E10,TO_NEAREST] --> [~2113930624,~2113930624] --> OK [~0.21139305E10,TO_NEAREST] --> [~2113930496,~2113930496] --> OK [~0.21139304E10,TO_NEAREST] --> [~2113930368,~2113930368] --> OK [~0.21139302E10,TO_NEAREST] --> [~2113930240,~2113930240] --> OK [~0.21139301E10,TO_NEAREST] --> [~2113930112,~2113930112] --> OK [~0.211393E10,TO_NEAREST] --> [~2113929984,~2113929984] --> OK [~0.21139299E10,TO_NEAREST] --> [~2113929856,~2113929856] --> OK [~0.21139297E10,TO_NEAREST] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_NEAREST] --> [~2113929600,~2113929600] --> OK [~0.21139295E10,TO_NEAREST] --> [~2113929472,~2113929472] --> OK [~0.21139293E10,TO_NEAREST] --> [~2113929344,~2113929344] --> OK [~0.21139292E10,TO_NEAREST] --> [~2113929216,~2113929216] --> OK [~0.2113921E10,TO_NEAREST] --> [~2113921024,~2113921024] --> OK [~0.21139212E10,TO_NEAREST] --> [~2113921152,~2113921152] --> OK [~0.21139213E10,TO_NEAREST] --> [~2113921280,~2113921280] --> OK [~0.21139214E10,TO_NEAREST] --> [~2113921408,~2113921408] --> OK [~0.21139215E10,TO_NEAREST] --> [~2113921536,~2113921536] --> OK [~0.21139217E10,TO_NEAREST] --> [~2113921664,~2113921664] --> OK [~0.21139218E10,TO_NEAREST] --> [~2113921792,~2113921792] --> OK [~0.21139219E10,TO_NEAREST] --> [~2113921920,~2113921920] --> OK [~0.2113922E10,TO_NEAREST] --> [~2113922048,~2113922048] --> OK [~0.21139222E10,TO_NEAREST] --> [~2113922176,~2113922176] --> OK [~0.21139223E10,TO_NEAREST] --> [~2113922304,~2113922304] --> OK [~0.21139224E10,TO_NEAREST] --> [~2113922432,~2113922432] --> OK [~0.21139226E10,TO_NEAREST] --> [~2113922560,~2113922560] --> OK [~0.21139227E10,TO_NEAREST] --> [~2113922688,~2113922688] --> OK [~0.21139228E10,TO_NEAREST] --> [~2113922816,~2113922816] --> OK [~0.2113923E10,TO_NEAREST] --> [~2113922944,~2113922944] --> OK [~0.21139231E10,TO_NEAREST] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_NEAREST] --> [~2113923200,~2113923200] --> OK [~0.21139233E10,TO_NEAREST] --> [~2113923328,~2113923328] --> OK [~0.21139235E10,TO_NEAREST] --> [~2113923456,~2113923456] --> OK [~0.21139236E10,TO_NEAREST] --> [~2113923584,~2113923584] --> OK [~0.21139237E10,TO_NEAREST] --> [~2113923712,~2113923712] --> OK [~0.21139238E10,TO_NEAREST] --> [~2113923840,~2113923840] --> OK [~0.2113924E10,TO_NEAREST] --> [~2113923968,~2113923968] --> OK [~0.21139241E10,TO_NEAREST] --> [~2113924096,~2113924096] --> OK [~0.21139242E10,TO_NEAREST] --> [~2113924224,~2113924224] --> OK [~0.21139244E10,TO_NEAREST] --> [~2113924352,~2113924352] --> OK [~0.21139245E10,TO_NEAREST] --> [~2113924480,~2113924480] --> OK [~0.21139246E10,TO_NEAREST] --> [~2113924608,~2113924608] --> OK [~0.21139247E10,TO_NEAREST] --> [~2113924736,~2113924736] --> OK [~0.21139249E10,TO_NEAREST] --> [~2113924864,~2113924864] --> OK [~0.2113925E10,TO_NEAREST] --> [~2113924992,~2113924992] --> OK [~0.21139251E10,TO_NEAREST] --> [~2113925120,~2113925120] --> OK [~0.21139252E10,TO_NEAREST] --> [~2113925248,~2113925248] --> OK [~0.21139254E10,TO_NEAREST] --> [~2113925376,~2113925376] --> OK [~0.21139255E10,TO_NEAREST] --> [~2113925504,~2113925504] --> OK [~0.21139256E10,TO_NEAREST] --> [~2113925632,~2113925632] --> OK [~0.21139258E10,TO_NEAREST] --> [~2113925760,~2113925760] --> OK [~0.21139259E10,TO_NEAREST] --> [~2113925888,~2113925888] --> OK [~0.2113926E10,TO_NEAREST] --> [~2113926016,~2113926016] --> OK [~0.21139261E10,TO_NEAREST] --> [~2113926144,~2113926144] --> OK [~0.21139263E10,TO_NEAREST] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_NEAREST] --> [~2113926400,~2113926400] --> OK [~0.21139265E10,TO_NEAREST] --> [~2113926528,~2113926528] --> OK [~0.21139267E10,TO_NEAREST] --> [~2113926656,~2113926656] --> OK [~0.21139268E10,TO_NEAREST] --> [~2113926784,~2113926784] --> OK [~0.21139269E10,TO_NEAREST] --> [~2113926912,~2113926912] --> OK [~0.2113927E10,TO_NEAREST] --> [~2113927040,~2113927040] --> OK [~0.21139272E10,TO_NEAREST] --> [~2113927168,~2113927168] --> OK [~0.21139273E10,TO_NEAREST] --> [~2113927296,~2113927296] --> OK [~0.21139274E10,TO_NEAREST] --> [~2113927424,~2113927424] --> OK [~0.21139276E10,TO_NEAREST] --> [~2113927552,~2113927552] --> OK [~0.21139277E10,TO_NEAREST] --> [~2113927680,~2113927680] --> OK [~0.21139278E10,TO_NEAREST] --> [~2113927808,~2113927808] --> OK [~0.2113928E10,TO_NEAREST] --> [~2113927936,~2113927936] --> OK [~0.21139281E10,TO_NEAREST] --> [~2113928064,~2113928064] --> OK [~0.21139282E10,TO_NEAREST] --> [~2113928192,~2113928192] --> OK [~0.21139283E10,TO_NEAREST] --> [~2113928320,~2113928320] --> OK [~0.21139284E10,TO_NEAREST] --> [~2113928448,~2113928448] --> OK [~0.21139286E10,TO_NEAREST] --> [~2113928576,~2113928576] --> OK [~0.21139287E10,TO_NEAREST] --> [~2113928704,~2113928704] --> OK [~0.21139288E10,TO_NEAREST] --> [~2113928832,~2113928832] --> OK [~0.2113929E10,TO_NEAREST] --> [~2113928960,~2113928960] --> OK [~0.21139291E10,TO_NEAREST] --> [~2113929088,~2113929088] --> OK [~0.2080383E10,TO_NEAREST] --> [~2080382976,~2080382976] --> OK [~0.20803828E10,TO_NEAREST] --> [~2080382848,~2080382848] --> OK [~0.20803827E10,TO_NEAREST] --> [~2080382720,~2080382720] --> OK [~0.20803826E10,TO_NEAREST] --> [~2080382592,~2080382592] --> OK [~0.20803825E10,TO_NEAREST] --> [~2080382464,~2080382464] --> OK [~0.20803823E10,TO_NEAREST] --> [~2080382336,~2080382336] --> OK [~0.20803822E10,TO_NEAREST] --> [~2080382208,~2080382208] --> OK [~0.20803821E10,TO_NEAREST] --> [~2080382080,~2080382080] --> OK [~0.2080382E10,TO_NEAREST] --> [~2080381952,~2080381952] --> OK [~0.20803818E10,TO_NEAREST] --> [~2080381824,~2080381824] --> OK [~0.20803817E10,TO_NEAREST] --> [~2080381696,~2080381696] --> OK [~0.20803816E10,TO_NEAREST] --> [~2080381568,~2080381568] --> OK [~0.20803814E10,TO_NEAREST] --> [~2080381440,~2080381440] --> OK [~0.20803813E10,TO_NEAREST] --> [~2080381312,~2080381312] --> OK [~0.20803812E10,TO_NEAREST] --> [~2080381184,~2080381184] --> OK [~0.2080381E10,TO_NEAREST] --> [~2080381056,~2080381056] --> OK [~0.20803809E10,TO_NEAREST] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_NEAREST] --> [~2080380800,~2080380800] --> OK [~0.20803807E10,TO_NEAREST] --> [~2080380672,~2080380672] --> OK [~0.20803805E10,TO_NEAREST] --> [~2080380544,~2080380544] --> OK [~0.20803804E10,TO_NEAREST] --> [~2080380416,~2080380416] --> OK [~0.20803803E10,TO_NEAREST] --> [~2080380288,~2080380288] --> OK [~0.20803802E10,TO_NEAREST] --> [~2080380160,~2080380160] --> OK [~0.208038E10,TO_NEAREST] --> [~2080380032,~2080380032] --> OK [~0.20803799E10,TO_NEAREST] --> [~2080379904,~2080379904] --> OK [~0.20803798E10,TO_NEAREST] --> [~2080379776,~2080379776] --> OK [~0.20803796E10,TO_NEAREST] --> [~2080379648,~2080379648] --> OK [~0.20803795E10,TO_NEAREST] --> [~2080379520,~2080379520] --> OK [~0.20803794E10,TO_NEAREST] --> [~2080379392,~2080379392] --> OK [~0.20803793E10,TO_NEAREST] --> [~2080379264,~2080379264] --> OK [~0.20803791E10,TO_NEAREST] --> [~2080379136,~2080379136] --> OK [~0.2080379E10,TO_NEAREST] --> [~2080379008,~2080379008] --> OK [~0.20803789E10,TO_NEAREST] --> [~2080378880,~2080378880] --> OK [~0.20803788E10,TO_NEAREST] --> [~2080378752,~2080378752] --> OK [~0.20803786E10,TO_NEAREST] --> [~2080378624,~2080378624] --> OK [~0.20803785E10,TO_NEAREST] --> [~2080378496,~2080378496] --> OK [~0.20803784E10,TO_NEAREST] --> [~2080378368,~2080378368] --> OK [~0.20803782E10,TO_NEAREST] --> [~2080378240,~2080378240] --> OK [~0.20803781E10,TO_NEAREST] --> [~2080378112,~2080378112] --> OK [~0.2080378E10,TO_NEAREST] --> [~2080377984,~2080377984] --> OK [~0.20803779E10,TO_NEAREST] --> [~2080377856,~2080377856] --> OK [~0.20803777E10,TO_NEAREST] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_NEAREST] --> [~2080377600,~2080377600] --> OK [~0.20803775E10,TO_NEAREST] --> [~2080377472,~2080377472] --> OK [~0.20803773E10,TO_NEAREST] --> [~2080377344,~2080377344] --> OK [~0.20803772E10,TO_NEAREST] --> [~2080377216,~2080377216] --> OK [~0.20803771E10,TO_NEAREST] --> [~2080377088,~2080377088] --> OK [~0.2080377E10,TO_NEAREST] --> [~2080376960,~2080376960] --> OK [~0.20803768E10,TO_NEAREST] --> [~2080376832,~2080376832] --> OK [~0.20803767E10,TO_NEAREST] --> [~2080376704,~2080376704] --> OK [~0.20803766E10,TO_NEAREST] --> [~2080376576,~2080376576] --> OK [~0.20803764E10,TO_NEAREST] --> [~2080376448,~2080376448] --> OK [~0.20803763E10,TO_NEAREST] --> [~2080376320,~2080376320] --> OK [~0.20803762E10,TO_NEAREST] --> [~2080376192,~2080376192] --> OK [~0.2080376E10,TO_NEAREST] --> [~2080376064,~2080376064] --> OK [~0.20803759E10,TO_NEAREST] --> [~2080375936,~2080375936] --> OK [~0.20803758E10,TO_NEAREST] --> [~2080375808,~2080375808] --> OK [~0.20803757E10,TO_NEAREST] --> [~2080375680,~2080375680] --> OK [~0.20803756E10,TO_NEAREST] --> [~2080375552,~2080375552] --> OK [~0.20803754E10,TO_NEAREST] --> [~2080375424,~2080375424] --> OK [~0.20803753E10,TO_NEAREST] --> [~2080375296,~2080375296] --> OK [~0.20803752E10,TO_NEAREST] --> [~2080375168,~2080375168] --> OK [~0.2080375E10,TO_NEAREST] --> [~2080375040,~2080375040] --> OK [~0.20803749E10,TO_NEAREST] --> [~2080374912,~2080374912] --> OK [~0.20803748E10,TO_NEAREST] --> [~2080374784,~2080374784] --> OK [~0.20803666E10,TO_NEAREST] --> [~2080366592,~2080366592] --> OK [~0.20803667E10,TO_NEAREST] --> [~2080366720,~2080366720] --> OK [~0.20803668E10,TO_NEAREST] --> [~2080366848,~2080366848] --> OK [~0.2080367E10,TO_NEAREST] --> [~2080366976,~2080366976] --> OK [~0.20803671E10,TO_NEAREST] --> [~2080367104,~2080367104] --> OK [~0.20803672E10,TO_NEAREST] --> [~2080367232,~2080367232] --> OK [~0.20803674E10,TO_NEAREST] --> [~2080367360,~2080367360] --> OK [~0.20803675E10,TO_NEAREST] --> [~2080367488,~2080367488] --> OK [~0.20803676E10,TO_NEAREST] --> [~2080367616,~2080367616] --> OK [~0.20803677E10,TO_NEAREST] --> [~2080367744,~2080367744] --> OK [~0.20803679E10,TO_NEAREST] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_NEAREST] --> [~2080368000,~2080368000] --> OK [~0.20803681E10,TO_NEAREST] --> [~2080368128,~2080368128] --> OK [~0.20803683E10,TO_NEAREST] --> [~2080368256,~2080368256] --> OK [~0.20803684E10,TO_NEAREST] --> [~2080368384,~2080368384] --> OK [~0.20803685E10,TO_NEAREST] --> [~2080368512,~2080368512] --> OK [~0.20803686E10,TO_NEAREST] --> [~2080368640,~2080368640] --> OK [~0.20803688E10,TO_NEAREST] --> [~2080368768,~2080368768] --> OK [~0.20803689E10,TO_NEAREST] --> [~2080368896,~2080368896] --> OK [~0.2080369E10,TO_NEAREST] --> [~2080369024,~2080369024] --> OK [~0.20803692E10,TO_NEAREST] --> [~2080369152,~2080369152] --> OK [~0.20803693E10,TO_NEAREST] --> [~2080369280,~2080369280] --> OK [~0.20803694E10,TO_NEAREST] --> [~2080369408,~2080369408] --> OK [~0.20803695E10,TO_NEAREST] --> [~2080369536,~2080369536] --> OK [~0.20803697E10,TO_NEAREST] --> [~2080369664,~2080369664] --> OK [~0.20803698E10,TO_NEAREST] --> [~2080369792,~2080369792] --> OK [~0.20803699E10,TO_NEAREST] --> [~2080369920,~2080369920] --> OK [~0.208037E10,TO_NEAREST] --> [~2080370048,~2080370048] --> OK [~0.20803702E10,TO_NEAREST] --> [~2080370176,~2080370176] --> OK [~0.20803703E10,TO_NEAREST] --> [~2080370304,~2080370304] --> OK [~0.20803704E10,TO_NEAREST] --> [~2080370432,~2080370432] --> OK [~0.20803706E10,TO_NEAREST] --> [~2080370560,~2080370560] --> OK [~0.20803707E10,TO_NEAREST] --> [~2080370688,~2080370688] --> OK [~0.20803708E10,TO_NEAREST] --> [~2080370816,~2080370816] --> OK [~0.2080371E10,TO_NEAREST] --> [~2080370944,~2080370944] --> OK [~0.20803711E10,TO_NEAREST] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_NEAREST] --> [~2080371200,~2080371200] --> OK [~0.20803713E10,TO_NEAREST] --> [~2080371328,~2080371328] --> OK [~0.20803715E10,TO_NEAREST] --> [~2080371456,~2080371456] --> OK [~0.20803716E10,TO_NEAREST] --> [~2080371584,~2080371584] --> OK [~0.20803717E10,TO_NEAREST] --> [~2080371712,~2080371712] --> OK [~0.20803718E10,TO_NEAREST] --> [~2080371840,~2080371840] --> OK [~0.2080372E10,TO_NEAREST] --> [~2080371968,~2080371968] --> OK [~0.20803721E10,TO_NEAREST] --> [~2080372096,~2080372096] --> OK [~0.20803722E10,TO_NEAREST] --> [~2080372224,~2080372224] --> OK [~0.20803724E10,TO_NEAREST] --> [~2080372352,~2080372352] --> OK [~0.20803725E10,TO_NEAREST] --> [~2080372480,~2080372480] --> OK [~0.20803726E10,TO_NEAREST] --> [~2080372608,~2080372608] --> OK [~0.20803727E10,TO_NEAREST] --> [~2080372736,~2080372736] --> OK [~0.20803729E10,TO_NEAREST] --> [~2080372864,~2080372864] --> OK [~0.2080373E10,TO_NEAREST] --> [~2080372992,~2080372992] --> OK [~0.20803731E10,TO_NEAREST] --> [~2080373120,~2080373120] --> OK [~0.20803732E10,TO_NEAREST] --> [~2080373248,~2080373248] --> OK [~0.20803734E10,TO_NEAREST] --> [~2080373376,~2080373376] --> OK [~0.20803735E10,TO_NEAREST] --> [~2080373504,~2080373504] --> OK [~0.20803736E10,TO_NEAREST] --> [~2080373632,~2080373632] --> OK [~0.20803738E10,TO_NEAREST] --> [~2080373760,~2080373760] --> OK [~0.20803739E10,TO_NEAREST] --> [~2080373888,~2080373888] --> OK [~0.2080374E10,TO_NEAREST] --> [~2080374016,~2080374016] --> OK [~0.20803741E10,TO_NEAREST] --> [~2080374144,~2080374144] --> OK [~0.20803743E10,TO_NEAREST] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_NEAREST] --> [~2080374400,~2080374400] --> OK [~0.20803745E10,TO_NEAREST] --> [~2080374528,~2080374528] --> OK [~0.20803747E10,TO_NEAREST] --> [~2080374656,~2080374656] --> OK [~0.20132741E10,TO_NEAREST] --> [~2013274112,~2013274112] --> OK [~0.2013274E10,TO_NEAREST] --> [~2013273984,~2013273984] --> OK [~0.20132739E10,TO_NEAREST] --> [~2013273856,~2013273856] --> OK [~0.20132737E10,TO_NEAREST] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_NEAREST] --> [~2013273600,~2013273600] --> OK [~0.20132735E10,TO_NEAREST] --> [~2013273472,~2013273472] --> OK [~0.20132733E10,TO_NEAREST] --> [~2013273344,~2013273344] --> OK [~0.20132732E10,TO_NEAREST] --> [~2013273216,~2013273216] --> OK [~0.20132731E10,TO_NEAREST] --> [~2013273088,~2013273088] --> OK [~0.2013273E10,TO_NEAREST] --> [~2013272960,~2013272960] --> OK [~0.20132728E10,TO_NEAREST] --> [~2013272832,~2013272832] --> OK [~0.20132727E10,TO_NEAREST] --> [~2013272704,~2013272704] --> OK [~0.20132726E10,TO_NEAREST] --> [~2013272576,~2013272576] --> OK [~0.20132724E10,TO_NEAREST] --> [~2013272448,~2013272448] --> OK [~0.20132723E10,TO_NEAREST] --> [~2013272320,~2013272320] --> OK [~0.20132722E10,TO_NEAREST] --> [~2013272192,~2013272192] --> OK [~0.2013272E10,TO_NEAREST] --> [~2013272064,~2013272064] --> OK [~0.20132719E10,TO_NEAREST] --> [~2013271936,~2013271936] --> OK [~0.20132718E10,TO_NEAREST] --> [~2013271808,~2013271808] --> OK [~0.20132717E10,TO_NEAREST] --> [~2013271680,~2013271680] --> OK [~0.20132716E10,TO_NEAREST] --> [~2013271552,~2013271552] --> OK [~0.20132714E10,TO_NEAREST] --> [~2013271424,~2013271424] --> OK [~0.20132713E10,TO_NEAREST] --> [~2013271296,~2013271296] --> OK [~0.20132712E10,TO_NEAREST] --> [~2013271168,~2013271168] --> OK [~0.2013271E10,TO_NEAREST] --> [~2013271040,~2013271040] --> OK [~0.20132709E10,TO_NEAREST] --> [~2013270912,~2013270912] --> OK [~0.20132708E10,TO_NEAREST] --> [~2013270784,~2013270784] --> OK [~0.20132707E10,TO_NEAREST] --> [~2013270656,~2013270656] --> OK [~0.20132705E10,TO_NEAREST] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_NEAREST] --> [~2013270400,~2013270400] --> OK [~0.20132703E10,TO_NEAREST] --> [~2013270272,~2013270272] --> OK [~0.20132701E10,TO_NEAREST] --> [~2013270144,~2013270144] --> OK [~0.201327E10,TO_NEAREST] --> [~2013270016,~2013270016] --> OK [~0.20132699E10,TO_NEAREST] --> [~2013269888,~2013269888] --> OK [~0.20132698E10,TO_NEAREST] --> [~2013269760,~2013269760] --> OK [~0.20132696E10,TO_NEAREST] --> [~2013269632,~2013269632] --> OK [~0.20132695E10,TO_NEAREST] --> [~2013269504,~2013269504] --> OK [~0.20132694E10,TO_NEAREST] --> [~2013269376,~2013269376] --> OK [~0.20132692E10,TO_NEAREST] --> [~2013269248,~2013269248] --> OK [~0.20132691E10,TO_NEAREST] --> [~2013269120,~2013269120] --> OK [~0.2013269E10,TO_NEAREST] --> [~2013268992,~2013268992] --> OK [~0.20132689E10,TO_NEAREST] --> [~2013268864,~2013268864] --> OK [~0.20132687E10,TO_NEAREST] --> [~2013268736,~2013268736] --> OK [~0.20132686E10,TO_NEAREST] --> [~2013268608,~2013268608] --> OK [~0.20132685E10,TO_NEAREST] --> [~2013268480,~2013268480] --> OK [~0.20132684E10,TO_NEAREST] --> [~2013268352,~2013268352] --> OK [~0.20132682E10,TO_NEAREST] --> [~2013268224,~2013268224] --> OK [~0.20132681E10,TO_NEAREST] --> [~2013268096,~2013268096] --> OK [~0.2013268E10,TO_NEAREST] --> [~2013267968,~2013267968] --> OK [~0.20132678E10,TO_NEAREST] --> [~2013267840,~2013267840] --> OK [~0.20132677E10,TO_NEAREST] --> [~2013267712,~2013267712] --> OK [~0.20132676E10,TO_NEAREST] --> [~2013267584,~2013267584] --> OK [~0.20132675E10,TO_NEAREST] --> [~2013267456,~2013267456] --> OK [~0.20132673E10,TO_NEAREST] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_NEAREST] --> [~2013267200,~2013267200] --> OK [~0.20132671E10,TO_NEAREST] --> [~2013267072,~2013267072] --> OK [~0.2013267E10,TO_NEAREST] --> [~2013266944,~2013266944] --> OK [~0.20132668E10,TO_NEAREST] --> [~2013266816,~2013266816] --> OK [~0.20132667E10,TO_NEAREST] --> [~2013266688,~2013266688] --> OK [~0.20132666E10,TO_NEAREST] --> [~2013266560,~2013266560] --> OK [~0.20132664E10,TO_NEAREST] --> [~2013266432,~2013266432] --> OK [~0.20132663E10,TO_NEAREST] --> [~2013266304,~2013266304] --> OK [~0.20132662E10,TO_NEAREST] --> [~2013266176,~2013266176] --> OK [~0.2013266E10,TO_NEAREST] --> [~2013266048,~2013266048] --> OK [~0.20132659E10,TO_NEAREST] --> [~2013265920,~2013265920] --> OK [~0.20132577E10,TO_NEAREST] --> [~2013257728,~2013257728] --> OK [~0.20132579E10,TO_NEAREST] --> [~2013257856,~2013257856] --> OK [~0.2013258E10,TO_NEAREST] --> [~2013257984,~2013257984] --> OK [~0.20132581E10,TO_NEAREST] --> [~2013258112,~2013258112] --> OK [~0.20132582E10,TO_NEAREST] --> [~2013258240,~2013258240] --> OK [~0.20132584E10,TO_NEAREST] --> [~2013258368,~2013258368] --> OK [~0.20132585E10,TO_NEAREST] --> [~2013258496,~2013258496] --> OK [~0.20132586E10,TO_NEAREST] --> [~2013258624,~2013258624] --> OK [~0.20132588E10,TO_NEAREST] --> [~2013258752,~2013258752] --> OK [~0.20132589E10,TO_NEAREST] --> [~2013258880,~2013258880] --> OK [~0.2013259E10,TO_NEAREST] --> [~2013259008,~2013259008] --> OK [~0.20132591E10,TO_NEAREST] --> [~2013259136,~2013259136] --> OK [~0.20132593E10,TO_NEAREST] --> [~2013259264,~2013259264] --> OK [~0.20132594E10,TO_NEAREST] --> [~2013259392,~2013259392] --> OK [~0.20132595E10,TO_NEAREST] --> [~2013259520,~2013259520] --> OK [~0.20132596E10,TO_NEAREST] --> [~2013259648,~2013259648] --> OK [~0.20132598E10,TO_NEAREST] --> [~2013259776,~2013259776] --> OK [~0.20132599E10,TO_NEAREST] --> [~2013259904,~2013259904] --> OK [~0.201326E10,TO_NEAREST] --> [~2013260032,~2013260032] --> OK [~0.20132602E10,TO_NEAREST] --> [~2013260160,~2013260160] --> OK [~0.20132603E10,TO_NEAREST] --> [~2013260288,~2013260288] --> OK [~0.20132604E10,TO_NEAREST] --> [~2013260416,~2013260416] --> OK [~0.20132605E10,TO_NEAREST] --> [~2013260544,~2013260544] --> OK [~0.20132607E10,TO_NEAREST] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_NEAREST] --> [~2013260800,~2013260800] --> OK [~0.20132609E10,TO_NEAREST] --> [~2013260928,~2013260928] --> OK [~0.2013261E10,TO_NEAREST] --> [~2013261056,~2013261056] --> OK [~0.20132612E10,TO_NEAREST] --> [~2013261184,~2013261184] --> OK [~0.20132613E10,TO_NEAREST] --> [~2013261312,~2013261312] --> OK [~0.20132614E10,TO_NEAREST] --> [~2013261440,~2013261440] --> OK [~0.20132616E10,TO_NEAREST] --> [~2013261568,~2013261568] --> OK [~0.20132617E10,TO_NEAREST] --> [~2013261696,~2013261696] --> OK [~0.20132618E10,TO_NEAREST] --> [~2013261824,~2013261824] --> OK [~0.2013262E10,TO_NEAREST] --> [~2013261952,~2013261952] --> OK [~0.20132621E10,TO_NEAREST] --> [~2013262080,~2013262080] --> OK [~0.20132622E10,TO_NEAREST] --> [~2013262208,~2013262208] --> OK [~0.20132623E10,TO_NEAREST] --> [~2013262336,~2013262336] --> OK [~0.20132625E10,TO_NEAREST] --> [~2013262464,~2013262464] --> OK [~0.20132626E10,TO_NEAREST] --> [~2013262592,~2013262592] --> OK [~0.20132627E10,TO_NEAREST] --> [~2013262720,~2013262720] --> OK [~0.20132628E10,TO_NEAREST] --> [~2013262848,~2013262848] --> OK [~0.2013263E10,TO_NEAREST] --> [~2013262976,~2013262976] --> OK [~0.20132631E10,TO_NEAREST] --> [~2013263104,~2013263104] --> OK [~0.20132632E10,TO_NEAREST] --> [~2013263232,~2013263232] --> OK [~0.20132634E10,TO_NEAREST] --> [~2013263360,~2013263360] --> OK [~0.20132635E10,TO_NEAREST] --> [~2013263488,~2013263488] --> OK [~0.20132636E10,TO_NEAREST] --> [~2013263616,~2013263616] --> OK [~0.20132637E10,TO_NEAREST] --> [~2013263744,~2013263744] --> OK [~0.20132639E10,TO_NEAREST] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_NEAREST] --> [~2013264000,~2013264000] --> OK [~0.20132641E10,TO_NEAREST] --> [~2013264128,~2013264128] --> OK [~0.20132643E10,TO_NEAREST] --> [~2013264256,~2013264256] --> OK [~0.20132644E10,TO_NEAREST] --> [~2013264384,~2013264384] --> OK [~0.20132645E10,TO_NEAREST] --> [~2013264512,~2013264512] --> OK [~0.20132646E10,TO_NEAREST] --> [~2013264640,~2013264640] --> OK [~0.20132648E10,TO_NEAREST] --> [~2013264768,~2013264768] --> OK [~0.20132649E10,TO_NEAREST] --> [~2013264896,~2013264896] --> OK [~0.2013265E10,TO_NEAREST] --> [~2013265024,~2013265024] --> OK [~0.20132652E10,TO_NEAREST] --> [~2013265152,~2013265152] --> OK [~0.20132653E10,TO_NEAREST] --> [~2013265280,~2013265280] --> OK [~0.20132654E10,TO_NEAREST] --> [~2013265408,~2013265408] --> OK [~0.20132655E10,TO_NEAREST] --> [~2013265536,~2013265536] --> OK [~0.20132657E10,TO_NEAREST] --> [~2013265664,~2013265664] --> OK [~0.20132658E10,TO_NEAREST] --> [~2013265792,~2013265792] --> OK [~0.18790564E10,TO_NEAREST] --> [~1879056384,~1879056384] --> OK [~0.18790563E10,TO_NEAREST] --> [~1879056256,~1879056256] --> OK [~0.18790561E10,TO_NEAREST] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_NEAREST] --> [~1879056000,~1879056000] --> OK [~0.18790559E10,TO_NEAREST] --> [~1879055872,~1879055872] --> OK [~0.18790557E10,TO_NEAREST] --> [~1879055744,~1879055744] --> OK [~0.18790556E10,TO_NEAREST] --> [~1879055616,~1879055616] --> OK [~0.18790555E10,TO_NEAREST] --> [~1879055488,~1879055488] --> OK [~0.18790554E10,TO_NEAREST] --> [~1879055360,~1879055360] --> OK [~0.18790552E10,TO_NEAREST] --> [~1879055232,~1879055232] --> OK [~0.18790551E10,TO_NEAREST] --> [~1879055104,~1879055104] --> OK [~0.1879055E10,TO_NEAREST] --> [~1879054976,~1879054976] --> OK [~0.18790548E10,TO_NEAREST] --> [~1879054848,~1879054848] --> OK [~0.18790547E10,TO_NEAREST] --> [~1879054720,~1879054720] --> OK [~0.18790546E10,TO_NEAREST] --> [~1879054592,~1879054592] --> OK [~0.18790545E10,TO_NEAREST] --> [~1879054464,~1879054464] --> OK [~0.18790543E10,TO_NEAREST] --> [~1879054336,~1879054336] --> OK [~0.18790542E10,TO_NEAREST] --> [~1879054208,~1879054208] --> OK [~0.18790541E10,TO_NEAREST] --> [~1879054080,~1879054080] --> OK [~0.1879054E10,TO_NEAREST] --> [~1879053952,~1879053952] --> OK [~0.18790538E10,TO_NEAREST] --> [~1879053824,~1879053824] --> OK [~0.18790537E10,TO_NEAREST] --> [~1879053696,~1879053696] --> OK [~0.18790536E10,TO_NEAREST] --> [~1879053568,~1879053568] --> OK [~0.18790534E10,TO_NEAREST] --> [~1879053440,~1879053440] --> OK [~0.18790533E10,TO_NEAREST] --> [~1879053312,~1879053312] --> OK [~0.18790532E10,TO_NEAREST] --> [~1879053184,~1879053184] --> OK [~0.1879053E10,TO_NEAREST] --> [~1879053056,~1879053056] --> OK [~0.18790529E10,TO_NEAREST] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_NEAREST] --> [~1879052800,~1879052800] --> OK [~0.18790527E10,TO_NEAREST] --> [~1879052672,~1879052672] --> OK [~0.18790525E10,TO_NEAREST] --> [~1879052544,~1879052544] --> OK [~0.18790524E10,TO_NEAREST] --> [~1879052416,~1879052416] --> OK [~0.18790523E10,TO_NEAREST] --> [~1879052288,~1879052288] --> OK [~0.18790522E10,TO_NEAREST] --> [~1879052160,~1879052160] --> OK [~0.1879052E10,TO_NEAREST] --> [~1879052032,~1879052032] --> OK [~0.18790519E10,TO_NEAREST] --> [~1879051904,~1879051904] --> OK [~0.18790518E10,TO_NEAREST] --> [~1879051776,~1879051776] --> OK [~0.18790516E10,TO_NEAREST] --> [~1879051648,~1879051648] --> OK [~0.18790515E10,TO_NEAREST] --> [~1879051520,~1879051520] --> OK [~0.18790514E10,TO_NEAREST] --> [~1879051392,~1879051392] --> OK [~0.18790513E10,TO_NEAREST] --> [~1879051264,~1879051264] --> OK [~0.18790511E10,TO_NEAREST] --> [~1879051136,~1879051136] --> OK [~0.1879051E10,TO_NEAREST] --> [~1879051008,~1879051008] --> OK [~0.18790509E10,TO_NEAREST] --> [~1879050880,~1879050880] --> OK [~0.18790508E10,TO_NEAREST] --> [~1879050752,~1879050752] --> OK [~0.18790506E10,TO_NEAREST] --> [~1879050624,~1879050624] --> OK [~0.18790505E10,TO_NEAREST] --> [~1879050496,~1879050496] --> OK [~0.18790504E10,TO_NEAREST] --> [~1879050368,~1879050368] --> OK [~0.18790502E10,TO_NEAREST] --> [~1879050240,~1879050240] --> OK [~0.18790501E10,TO_NEAREST] --> [~1879050112,~1879050112] --> OK [~0.187905E10,TO_NEAREST] --> [~1879049984,~1879049984] --> OK [~0.18790499E10,TO_NEAREST] --> [~1879049856,~1879049856] --> OK [~0.18790497E10,TO_NEAREST] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_NEAREST] --> [~1879049600,~1879049600] --> OK [~0.18790495E10,TO_NEAREST] --> [~1879049472,~1879049472] --> OK [~0.18790493E10,TO_NEAREST] --> [~1879049344,~1879049344] --> OK [~0.18790492E10,TO_NEAREST] --> [~1879049216,~1879049216] --> OK [~0.18790491E10,TO_NEAREST] --> [~1879049088,~1879049088] --> OK [~0.1879049E10,TO_NEAREST] --> [~1879048960,~1879048960] --> OK [~0.18790488E10,TO_NEAREST] --> [~1879048832,~1879048832] --> OK [~0.18790487E10,TO_NEAREST] --> [~1879048704,~1879048704] --> OK [~0.18790486E10,TO_NEAREST] --> [~1879048576,~1879048576] --> OK [~0.18790484E10,TO_NEAREST] --> [~1879048448,~1879048448] --> OK [~0.18790483E10,TO_NEAREST] --> [~1879048320,~1879048320] --> OK [~0.18790482E10,TO_NEAREST] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_NEAREST] --> [~1879040000,~1879040000] --> OK [~0.18790401E10,TO_NEAREST] --> [~1879040128,~1879040128] --> OK [~0.18790403E10,TO_NEAREST] --> [~1879040256,~1879040256] --> OK [~0.18790404E10,TO_NEAREST] --> [~1879040384,~1879040384] --> OK [~0.18790405E10,TO_NEAREST] --> [~1879040512,~1879040512] --> OK [~0.18790406E10,TO_NEAREST] --> [~1879040640,~1879040640] --> OK [~0.18790408E10,TO_NEAREST] --> [~1879040768,~1879040768] --> OK [~0.18790409E10,TO_NEAREST] --> [~1879040896,~1879040896] --> OK [~0.1879041E10,TO_NEAREST] --> [~1879041024,~1879041024] --> OK [~0.18790412E10,TO_NEAREST] --> [~1879041152,~1879041152] --> OK [~0.18790413E10,TO_NEAREST] --> [~1879041280,~1879041280] --> OK [~0.18790414E10,TO_NEAREST] --> [~1879041408,~1879041408] --> OK [~0.18790415E10,TO_NEAREST] --> [~1879041536,~1879041536] --> OK [~0.18790417E10,TO_NEAREST] --> [~1879041664,~1879041664] --> OK [~0.18790418E10,TO_NEAREST] --> [~1879041792,~1879041792] --> OK [~0.18790419E10,TO_NEAREST] --> [~1879041920,~1879041920] --> OK [~0.1879042E10,TO_NEAREST] --> [~1879042048,~1879042048] --> OK [~0.18790422E10,TO_NEAREST] --> [~1879042176,~1879042176] --> OK [~0.18790423E10,TO_NEAREST] --> [~1879042304,~1879042304] --> OK [~0.18790424E10,TO_NEAREST] --> [~1879042432,~1879042432] --> OK [~0.18790426E10,TO_NEAREST] --> [~1879042560,~1879042560] --> OK [~0.18790427E10,TO_NEAREST] --> [~1879042688,~1879042688] --> OK [~0.18790428E10,TO_NEAREST] --> [~1879042816,~1879042816] --> OK [~0.1879043E10,TO_NEAREST] --> [~1879042944,~1879042944] --> OK [~0.18790431E10,TO_NEAREST] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_NEAREST] --> [~1879043200,~1879043200] --> OK [~0.18790433E10,TO_NEAREST] --> [~1879043328,~1879043328] --> OK [~0.18790435E10,TO_NEAREST] --> [~1879043456,~1879043456] --> OK [~0.18790436E10,TO_NEAREST] --> [~1879043584,~1879043584] --> OK [~0.18790437E10,TO_NEAREST] --> [~1879043712,~1879043712] --> OK [~0.18790438E10,TO_NEAREST] --> [~1879043840,~1879043840] --> OK [~0.1879044E10,TO_NEAREST] --> [~1879043968,~1879043968] --> OK [~0.18790441E10,TO_NEAREST] --> [~1879044096,~1879044096] --> OK [~0.18790442E10,TO_NEAREST] --> [~1879044224,~1879044224] --> OK [~0.18790444E10,TO_NEAREST] --> [~1879044352,~1879044352] --> OK [~0.18790445E10,TO_NEAREST] --> [~1879044480,~1879044480] --> OK [~0.18790446E10,TO_NEAREST] --> [~1879044608,~1879044608] --> OK [~0.18790447E10,TO_NEAREST] --> [~1879044736,~1879044736] --> OK [~0.18790449E10,TO_NEAREST] --> [~1879044864,~1879044864] --> OK [~0.1879045E10,TO_NEAREST] --> [~1879044992,~1879044992] --> OK [~0.18790451E10,TO_NEAREST] --> [~1879045120,~1879045120] --> OK [~0.18790452E10,TO_NEAREST] --> [~1879045248,~1879045248] --> OK [~0.18790454E10,TO_NEAREST] --> [~1879045376,~1879045376] --> OK [~0.18790455E10,TO_NEAREST] --> [~1879045504,~1879045504] --> OK [~0.18790456E10,TO_NEAREST] --> [~1879045632,~1879045632] --> OK [~0.18790458E10,TO_NEAREST] --> [~1879045760,~1879045760] --> OK [~0.18790459E10,TO_NEAREST] --> [~1879045888,~1879045888] --> OK [~0.1879046E10,TO_NEAREST] --> [~1879046016,~1879046016] --> OK [~0.18790461E10,TO_NEAREST] --> [~1879046144,~1879046144] --> OK [~0.18790463E10,TO_NEAREST] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_NEAREST] --> [~1879046400,~1879046400] --> OK [~0.18790465E10,TO_NEAREST] --> [~1879046528,~1879046528] --> OK [~0.18790467E10,TO_NEAREST] --> [~1879046656,~1879046656] --> OK [~0.18790468E10,TO_NEAREST] --> [~1879046784,~1879046784] --> OK [~0.18790469E10,TO_NEAREST] --> [~1879046912,~1879046912] --> OK [~0.1879047E10,TO_NEAREST] --> [~1879047040,~1879047040] --> OK [~0.18790472E10,TO_NEAREST] --> [~1879047168,~1879047168] --> OK [~0.18790473E10,TO_NEAREST] --> [~1879047296,~1879047296] --> OK [~0.18790474E10,TO_NEAREST] --> [~1879047424,~1879047424] --> OK [~0.18790476E10,TO_NEAREST] --> [~1879047552,~1879047552] --> OK [~0.18790477E10,TO_NEAREST] --> [~1879047680,~1879047680] --> OK [~0.18790478E10,TO_NEAREST] --> [~1879047808,~1879047808] --> OK [~0.1879048E10,TO_NEAREST] --> [~1879047936,~1879047936] --> OK [~0.18790481E10,TO_NEAREST] --> [~1879048064,~1879048064] --> OK [~0.16106209E10,TO_NEAREST] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_NEAREST] --> [~1610620800,~1610620800] --> OK [~0.16106207E10,TO_NEAREST] --> [~1610620672,~1610620672] --> OK [~0.16106205E10,TO_NEAREST] --> [~1610620544,~1610620544] --> OK [~0.16106204E10,TO_NEAREST] --> [~1610620416,~1610620416] --> OK [~0.16106203E10,TO_NEAREST] --> [~1610620288,~1610620288] --> OK [~0.16106202E10,TO_NEAREST] --> [~1610620160,~1610620160] --> OK [~0.161062E10,TO_NEAREST] --> [~1610620032,~1610620032] --> OK [~0.16106199E10,TO_NEAREST] --> [~1610619904,~1610619904] --> OK [~0.16106198E10,TO_NEAREST] --> [~1610619776,~1610619776] --> OK [~0.16106196E10,TO_NEAREST] --> [~1610619648,~1610619648] --> OK [~0.16106195E10,TO_NEAREST] --> [~1610619520,~1610619520] --> OK [~0.16106194E10,TO_NEAREST] --> [~1610619392,~1610619392] --> OK [~0.16106193E10,TO_NEAREST] --> [~1610619264,~1610619264] --> OK [~0.16106191E10,TO_NEAREST] --> [~1610619136,~1610619136] --> OK [~0.1610619E10,TO_NEAREST] --> [~1610619008,~1610619008] --> OK [~0.16106189E10,TO_NEAREST] --> [~1610618880,~1610618880] --> OK [~0.16106188E10,TO_NEAREST] --> [~1610618752,~1610618752] --> OK [~0.16106186E10,TO_NEAREST] --> [~1610618624,~1610618624] --> OK [~0.16106185E10,TO_NEAREST] --> [~1610618496,~1610618496] --> OK [~0.16106184E10,TO_NEAREST] --> [~1610618368,~1610618368] --> OK [~0.16106182E10,TO_NEAREST] --> [~1610618240,~1610618240] --> OK [~0.16106181E10,TO_NEAREST] --> [~1610618112,~1610618112] --> OK [~0.1610618E10,TO_NEAREST] --> [~1610617984,~1610617984] --> OK [~0.16106179E10,TO_NEAREST] --> [~1610617856,~1610617856] --> OK [~0.16106177E10,TO_NEAREST] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_NEAREST] --> [~1610617600,~1610617600] --> OK [~0.16106175E10,TO_NEAREST] --> [~1610617472,~1610617472] --> OK [~0.16106173E10,TO_NEAREST] --> [~1610617344,~1610617344] --> OK [~0.16106172E10,TO_NEAREST] --> [~1610617216,~1610617216] --> OK [~0.16106171E10,TO_NEAREST] --> [~1610617088,~1610617088] --> OK [~0.1610617E10,TO_NEAREST] --> [~1610616960,~1610616960] --> OK [~0.16106168E10,TO_NEAREST] --> [~1610616832,~1610616832] --> OK [~0.16106167E10,TO_NEAREST] --> [~1610616704,~1610616704] --> OK [~0.16106166E10,TO_NEAREST] --> [~1610616576,~1610616576] --> OK [~0.16106164E10,TO_NEAREST] --> [~1610616448,~1610616448] --> OK [~0.16106163E10,TO_NEAREST] --> [~1610616320,~1610616320] --> OK [~0.16106162E10,TO_NEAREST] --> [~1610616192,~1610616192] --> OK [~0.1610616E10,TO_NEAREST] --> [~1610616064,~1610616064] --> OK [~0.16106159E10,TO_NEAREST] --> [~1610615936,~1610615936] --> OK [~0.16106158E10,TO_NEAREST] --> [~1610615808,~1610615808] --> OK [~0.16106157E10,TO_NEAREST] --> [~1610615680,~1610615680] --> OK [~0.16106156E10,TO_NEAREST] --> [~1610615552,~1610615552] --> OK [~0.16106154E10,TO_NEAREST] --> [~1610615424,~1610615424] --> OK [~0.16106153E10,TO_NEAREST] --> [~1610615296,~1610615296] --> OK [~0.16106152E10,TO_NEAREST] --> [~1610615168,~1610615168] --> OK [~0.1610615E10,TO_NEAREST] --> [~1610615040,~1610615040] --> OK [~0.16106149E10,TO_NEAREST] --> [~1610614912,~1610614912] --> OK [~0.16106148E10,TO_NEAREST] --> [~1610614784,~1610614784] --> OK [~0.16106147E10,TO_NEAREST] --> [~1610614656,~1610614656] --> OK [~0.16106145E10,TO_NEAREST] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_NEAREST] --> [~1610614400,~1610614400] --> OK [~0.16106143E10,TO_NEAREST] --> [~1610614272,~1610614272] --> OK [~0.16106141E10,TO_NEAREST] --> [~1610614144,~1610614144] --> OK [~0.1610614E10,TO_NEAREST] --> [~1610614016,~1610614016] --> OK [~0.16106139E10,TO_NEAREST] --> [~1610613888,~1610613888] --> OK [~0.16106138E10,TO_NEAREST] --> [~1610613760,~1610613760] --> OK [~0.16106136E10,TO_NEAREST] --> [~1610613632,~1610613632] --> OK [~0.16106135E10,TO_NEAREST] --> [~1610613504,~1610613504] --> OK [~0.16106134E10,TO_NEAREST] --> [~1610613376,~1610613376] --> OK [~0.16106132E10,TO_NEAREST] --> [~1610613248,~1610613248] --> OK [~0.16106131E10,TO_NEAREST] --> [~1610613120,~1610613120] --> OK [~0.1610613E10,TO_NEAREST] --> [~1610612992,~1610612992] --> OK [~0.16106129E10,TO_NEAREST] --> [~1610612864,~1610612864] --> OK [~0.16106127E10,TO_NEAREST] --> [~1610612736,~1610612736] --> OK [~0.16106045E10,TO_NEAREST] --> [~1610604544,~1610604544] --> OK [~0.16106047E10,TO_NEAREST] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_NEAREST] --> [~1610604800,~1610604800] --> OK [~0.16106049E10,TO_NEAREST] --> [~1610604928,~1610604928] --> OK [~0.1610605E10,TO_NEAREST] --> [~1610605056,~1610605056] --> OK [~0.16106052E10,TO_NEAREST] --> [~1610605184,~1610605184] --> OK [~0.16106053E10,TO_NEAREST] --> [~1610605312,~1610605312] --> OK [~0.16106054E10,TO_NEAREST] --> [~1610605440,~1610605440] --> OK [~0.16106056E10,TO_NEAREST] --> [~1610605568,~1610605568] --> OK [~0.16106057E10,TO_NEAREST] --> [~1610605696,~1610605696] --> OK [~0.16106058E10,TO_NEAREST] --> [~1610605824,~1610605824] --> OK [~0.1610606E10,TO_NEAREST] --> [~1610605952,~1610605952] --> OK [~0.16106061E10,TO_NEAREST] --> [~1610606080,~1610606080] --> OK [~0.16106062E10,TO_NEAREST] --> [~1610606208,~1610606208] --> OK [~0.16106063E10,TO_NEAREST] --> [~1610606336,~1610606336] --> OK [~0.16106065E10,TO_NEAREST] --> [~1610606464,~1610606464] --> OK [~0.16106066E10,TO_NEAREST] --> [~1610606592,~1610606592] --> OK [~0.16106067E10,TO_NEAREST] --> [~1610606720,~1610606720] --> OK [~0.16106068E10,TO_NEAREST] --> [~1610606848,~1610606848] --> OK [~0.1610607E10,TO_NEAREST] --> [~1610606976,~1610606976] --> OK [~0.16106071E10,TO_NEAREST] --> [~1610607104,~1610607104] --> OK [~0.16106072E10,TO_NEAREST] --> [~1610607232,~1610607232] --> OK [~0.16106074E10,TO_NEAREST] --> [~1610607360,~1610607360] --> OK [~0.16106075E10,TO_NEAREST] --> [~1610607488,~1610607488] --> OK [~0.16106076E10,TO_NEAREST] --> [~1610607616,~1610607616] --> OK [~0.16106077E10,TO_NEAREST] --> [~1610607744,~1610607744] --> OK [~0.16106079E10,TO_NEAREST] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_NEAREST] --> [~1610608000,~1610608000] --> OK [~0.16106081E10,TO_NEAREST] --> [~1610608128,~1610608128] --> OK [~0.16106083E10,TO_NEAREST] --> [~1610608256,~1610608256] --> OK [~0.16106084E10,TO_NEAREST] --> [~1610608384,~1610608384] --> OK [~0.16106085E10,TO_NEAREST] --> [~1610608512,~1610608512] --> OK [~0.16106086E10,TO_NEAREST] --> [~1610608640,~1610608640] --> OK [~0.16106088E10,TO_NEAREST] --> [~1610608768,~1610608768] --> OK [~0.16106089E10,TO_NEAREST] --> [~1610608896,~1610608896] --> OK [~0.1610609E10,TO_NEAREST] --> [~1610609024,~1610609024] --> OK [~0.16106092E10,TO_NEAREST] --> [~1610609152,~1610609152] --> OK [~0.16106093E10,TO_NEAREST] --> [~1610609280,~1610609280] --> OK [~0.16106094E10,TO_NEAREST] --> [~1610609408,~1610609408] --> OK [~0.16106095E10,TO_NEAREST] --> [~1610609536,~1610609536] --> OK [~0.16106097E10,TO_NEAREST] --> [~1610609664,~1610609664] --> OK [~0.16106098E10,TO_NEAREST] --> [~1610609792,~1610609792] --> OK [~0.16106099E10,TO_NEAREST] --> [~1610609920,~1610609920] --> OK [~0.161061E10,TO_NEAREST] --> [~1610610048,~1610610048] --> OK [~0.16106102E10,TO_NEAREST] --> [~1610610176,~1610610176] --> OK [~0.16106103E10,TO_NEAREST] --> [~1610610304,~1610610304] --> OK [~0.16106104E10,TO_NEAREST] --> [~1610610432,~1610610432] --> OK [~0.16106106E10,TO_NEAREST] --> [~1610610560,~1610610560] --> OK [~0.16106107E10,TO_NEAREST] --> [~1610610688,~1610610688] --> OK [~0.16106108E10,TO_NEAREST] --> [~1610610816,~1610610816] --> OK [~0.1610611E10,TO_NEAREST] --> [~1610610944,~1610610944] --> OK [~0.16106111E10,TO_NEAREST] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_NEAREST] --> [~1610611200,~1610611200] --> OK [~0.16106113E10,TO_NEAREST] --> [~1610611328,~1610611328] --> OK [~0.16106115E10,TO_NEAREST] --> [~1610611456,~1610611456] --> OK [~0.16106116E10,TO_NEAREST] --> [~1610611584,~1610611584] --> OK [~0.16106117E10,TO_NEAREST] --> [~1610611712,~1610611712] --> OK [~0.16106118E10,TO_NEAREST] --> [~1610611840,~1610611840] --> OK [~0.1610612E10,TO_NEAREST] --> [~1610611968,~1610611968] --> OK [~0.16106121E10,TO_NEAREST] --> [~1610612096,~1610612096] --> OK [~0.16106122E10,TO_NEAREST] --> [~1610612224,~1610612224] --> OK [~0.16106124E10,TO_NEAREST] --> [~1610612352,~1610612352] --> OK [~0.16106125E10,TO_NEAREST] --> [~1610612480,~1610612480] --> OK [~0.16106126E10,TO_NEAREST] --> [~1610612608,~1610612608] --> OK [~0.107375E10,TO_NEAREST] --> [~1073750016,~1073750016] --> OK [~0.10737499E10,TO_NEAREST] --> [~1073749888,~1073749888] --> OK [~0.10737498E10,TO_NEAREST] --> [~1073749760,~1073749760] --> OK [~0.10737496E10,TO_NEAREST] --> [~1073749632,~1073749632] --> OK [~0.10737495E10,TO_NEAREST] --> [~1073749504,~1073749504] --> OK [~0.10737494E10,TO_NEAREST] --> [~1073749376,~1073749376] --> OK [~0.10737492E10,TO_NEAREST] --> [~1073749248,~1073749248] --> OK [~0.10737491E10,TO_NEAREST] --> [~1073749120,~1073749120] --> OK [~0.1073749E10,TO_NEAREST] --> [~1073748992,~1073748992] --> OK [~0.10737489E10,TO_NEAREST] --> [~1073748864,~1073748864] --> OK [~0.10737487E10,TO_NEAREST] --> [~1073748736,~1073748736] --> OK [~0.10737486E10,TO_NEAREST] --> [~1073748608,~1073748608] --> OK [~0.10737485E10,TO_NEAREST] --> [~1073748480,~1073748480] --> OK [~0.10737484E10,TO_NEAREST] --> [~1073748352,~1073748352] --> OK [~0.10737482E10,TO_NEAREST] --> [~1073748224,~1073748224] --> OK [~0.10737481E10,TO_NEAREST] --> [~1073748096,~1073748096] --> OK [~0.1073748E10,TO_NEAREST] --> [~1073747968,~1073747968] --> OK [~0.10737478E10,TO_NEAREST] --> [~1073747840,~1073747840] --> OK [~0.10737477E10,TO_NEAREST] --> [~1073747712,~1073747712] --> OK [~0.10737476E10,TO_NEAREST] --> [~1073747584,~1073747584] --> OK [~0.10737475E10,TO_NEAREST] --> [~1073747456,~1073747456] --> OK [~0.10737473E10,TO_NEAREST] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_NEAREST] --> [~1073747200,~1073747200] --> OK [~0.10737471E10,TO_NEAREST] --> [~1073747072,~1073747072] --> OK [~0.1073747E10,TO_NEAREST] --> [~1073746944,~1073746944] --> OK [~0.10737468E10,TO_NEAREST] --> [~1073746816,~1073746816] --> OK [~0.10737467E10,TO_NEAREST] --> [~1073746688,~1073746688] --> OK [~0.10737466E10,TO_NEAREST] --> [~1073746560,~1073746560] --> OK [~0.10737464E10,TO_NEAREST] --> [~1073746432,~1073746432] --> OK [~0.10737463E10,TO_NEAREST] --> [~1073746304,~1073746304] --> OK [~0.10737462E10,TO_NEAREST] --> [~1073746176,~1073746176] --> OK [~0.1073746E10,TO_NEAREST] --> [~1073746048,~1073746048] --> OK [~0.10737459E10,TO_NEAREST] --> [~1073745920,~1073745920] --> OK [~0.10737458E10,TO_NEAREST] --> [~1073745792,~1073745792] --> OK [~0.10737457E10,TO_NEAREST] --> [~1073745664,~1073745664] --> OK [~0.10737455E10,TO_NEAREST] --> [~1073745536,~1073745536] --> OK [~0.10737454E10,TO_NEAREST] --> [~1073745408,~1073745408] --> OK [~0.10737453E10,TO_NEAREST] --> [~1073745280,~1073745280] --> OK [~0.10737452E10,TO_NEAREST] --> [~1073745152,~1073745152] --> OK [~0.1073745E10,TO_NEAREST] --> [~1073745024,~1073745024] --> OK [~0.10737449E10,TO_NEAREST] --> [~1073744896,~1073744896] --> OK [~0.10737448E10,TO_NEAREST] --> [~1073744768,~1073744768] --> OK [~0.10737446E10,TO_NEAREST] --> [~1073744640,~1073744640] --> OK [~0.10737445E10,TO_NEAREST] --> [~1073744512,~1073744512] --> OK [~0.10737444E10,TO_NEAREST] --> [~1073744384,~1073744384] --> OK [~0.10737443E10,TO_NEAREST] --> [~1073744256,~1073744256] --> OK [~0.10737441E10,TO_NEAREST] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_NEAREST] --> [~1073744000,~1073744000] --> OK [~0.10737439E10,TO_NEAREST] --> [~1073743872,~1073743872] --> OK [~0.10737437E10,TO_NEAREST] --> [~1073743744,~1073743744] --> OK [~0.10737436E10,TO_NEAREST] --> [~1073743616,~1073743616] --> OK [~0.10737435E10,TO_NEAREST] --> [~1073743488,~1073743488] --> OK [~0.10737434E10,TO_NEAREST] --> [~1073743360,~1073743360] --> OK [~0.10737432E10,TO_NEAREST] --> [~1073743232,~1073743232] --> OK [~0.10737431E10,TO_NEAREST] --> [~1073743104,~1073743104] --> OK [~0.1073743E10,TO_NEAREST] --> [~1073742976,~1073742976] --> OK [~0.10737428E10,TO_NEAREST] --> [~1073742848,~1073742848] --> OK [~0.10737427E10,TO_NEAREST] --> [~1073742720,~1073742720] --> OK [~0.10737426E10,TO_NEAREST] --> [~1073742592,~1073742592] --> OK [~0.10737425E10,TO_NEAREST] --> [~1073742464,~1073742464] --> OK [~0.10737423E10,TO_NEAREST] --> [~1073742336,~1073742336] --> OK [~0.10737422E10,TO_NEAREST] --> [~1073742208,~1073742208] --> OK [~0.10737421E10,TO_NEAREST] --> [~1073742080,~1073742080] --> OK [~0.1073742E10,TO_NEAREST] --> [~1073741952,~1073741952] --> OK [~0.10737418E10,TO_NEAREST] --> [~1073741824,~1073741824] --> OK [~0.10737377E10,TO_NEAREST] --> [~1073737728,~1073737728] --> OK [~0.10737378E10,TO_NEAREST] --> [~1073737792,~1073737792] --> OK [~0.107373786E10,TO_NEAREST] --> [~1073737856,~1073737856] --> OK [~0.10737379E10,TO_NEAREST] --> [~1073737920,~1073737920] --> OK [~0.1073738E10,TO_NEAREST] --> [~1073737984,~1073737984] --> OK [~0.107373805E10,TO_NEAREST] --> [~1073738048,~1073738048] --> OK [~0.10737381E10,TO_NEAREST] --> [~1073738112,~1073738112] --> OK [~0.10737382E10,TO_NEAREST] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_NEAREST] --> [~1073738240,~1073738240] --> OK [~0.10737383E10,TO_NEAREST] --> [~1073738304,~1073738304] --> OK [~0.10737384E10,TO_NEAREST] --> [~1073738368,~1073738368] --> OK [~0.107373843E10,TO_NEAREST] --> [~1073738432,~1073738432] --> OK [~0.10737385E10,TO_NEAREST] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_NEAREST] --> [~1073738560,~1073738560] --> OK [~0.10737386E10,TO_NEAREST] --> [~1073738624,~1073738624] --> OK [~0.10737387E10,TO_NEAREST] --> [~1073738688,~1073738688] --> OK [~0.107373875E10,TO_NEAREST] --> [~1073738752,~1073738752] --> OK [~0.10737388E10,TO_NEAREST] --> [~1073738816,~1073738816] --> OK [~0.10737389E10,TO_NEAREST] --> [~1073738880,~1073738880] --> OK [~0.107373894E10,TO_NEAREST] --> [~1073738944,~1073738944] --> OK [~0.1073739E10,TO_NEAREST] --> [~1073739008,~1073739008] --> OK [~0.10737391E10,TO_NEAREST] --> [~1073739072,~1073739072] --> OK [~0.107373914E10,TO_NEAREST] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_NEAREST] --> [~1073739200,~1073739200] --> OK [~0.107373926E10,TO_NEAREST] --> [~1073739264,~1073739264] --> OK [~0.10737393E10,TO_NEAREST] --> [~1073739328,~1073739328] --> OK [~0.10737394E10,TO_NEAREST] --> [~1073739392,~1073739392] --> OK [~0.107373946E10,TO_NEAREST] --> [~1073739456,~1073739456] --> OK [~0.10737395E10,TO_NEAREST] --> [~1073739520,~1073739520] --> OK [~0.10737396E10,TO_NEAREST] --> [~1073739584,~1073739584] --> OK [~0.107373965E10,TO_NEAREST] --> [~1073739648,~1073739648] --> OK [~0.10737397E10,TO_NEAREST] --> [~1073739712,~1073739712] --> OK [~0.10737398E10,TO_NEAREST] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_NEAREST] --> [~1073739840,~1073739840] --> OK [~0.10737399E10,TO_NEAREST] --> [~1073739904,~1073739904] --> OK [~0.107373997E10,TO_NEAREST] --> [~1073739968,~1073739968] --> OK [~0.107374E10,TO_NEAREST] --> [~1073740032,~1073740032] --> OK [~0.10737401E10,TO_NEAREST] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_NEAREST] --> [~1073740160,~1073740160] --> OK [~0.10737402E10,TO_NEAREST] --> [~1073740224,~1073740224] --> OK [~0.10737403E10,TO_NEAREST] --> [~1073740288,~1073740288] --> OK [~0.107374035E10,TO_NEAREST] --> [~1073740352,~1073740352] --> OK [~0.10737404E10,TO_NEAREST] --> [~1073740416,~1073740416] --> OK [~0.10737405E10,TO_NEAREST] --> [~1073740480,~1073740480] --> OK [~0.107374054E10,TO_NEAREST] --> [~1073740544,~1073740544] --> OK [~0.10737406E10,TO_NEAREST] --> [~1073740608,~1073740608] --> OK [~0.10737407E10,TO_NEAREST] --> [~1073740672,~1073740672] --> OK [~0.107374074E10,TO_NEAREST] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_NEAREST] --> [~1073740800,~1073740800] --> OK [~0.107374086E10,TO_NEAREST] --> [~1073740864,~1073740864] --> OK [~0.10737409E10,TO_NEAREST] --> [~1073740928,~1073740928] --> OK [~0.1073741E10,TO_NEAREST] --> [~1073740992,~1073740992] --> OK [~0.107374106E10,TO_NEAREST] --> [~1073741056,~1073741056] --> OK [~0.10737411E10,TO_NEAREST] --> [~1073741120,~1073741120] --> OK [~0.10737412E10,TO_NEAREST] --> [~1073741184,~1073741184] --> OK [~0.107374125E10,TO_NEAREST] --> [~1073741248,~1073741248] --> OK [~0.10737413E10,TO_NEAREST] --> [~1073741312,~1073741312] --> OK [~0.10737414E10,TO_NEAREST] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_NEAREST] --> [~1073741440,~1073741440] --> OK [~0.10737415E10,TO_NEAREST] --> [~1073741504,~1073741504] --> OK [~0.10737416E10,TO_NEAREST] --> [~1073741568,~1073741568] --> OK [~0.107374163E10,TO_NEAREST] --> [~1073741632,~1073741632] --> OK [~0.10737417E10,TO_NEAREST] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_NEAREST] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000015E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000148E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000145E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000143E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000138E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000136E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000134E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000129E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000126E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000124E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000122E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000117E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000114E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000112E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000011E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000107E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000105E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000103E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000098E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000095E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000093E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000009E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000088E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000086E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000083E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000008E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000079E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000076E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000074E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000072E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000067E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000064E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000062E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000006E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000057E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000055E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000052E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000048E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000045E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000043E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000038E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000036E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000033E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000003E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000029E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000026E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000024E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000021E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000017E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999847E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999985E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999852E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999855E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999857E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999862E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999864E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999866E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999871E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999874E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999876E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999878E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999883E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999886E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999888E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999989E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999893E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999895E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999897E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999902E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999905E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999907E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999991E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999912E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999914E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999917E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999992E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999921E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999924E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999926E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999928E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999933E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999936E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999938E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999994E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999943E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999945E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999948E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999952E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999955E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999957E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999962E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999964E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999967E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999997E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999971E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999974E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999976E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999979E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999983E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.20000153E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000015E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000148E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000145E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000143E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000138E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000136E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000134E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000129E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000126E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000124E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000122E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000117E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000114E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000112E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000011E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000107E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000105E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000103E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000098E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000095E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000093E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000009E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000088E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000086E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000083E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000008E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000079E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000076E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000074E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000072E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000067E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000064E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000062E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000006E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000057E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000055E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000052E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000048E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000045E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000043E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000038E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000036E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000033E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000003E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000029E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000026E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000024E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000021E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000017E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999924E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999925E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999926E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999927E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999928E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999931E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999932E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999933E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999934E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999936E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999937E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999938E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999939E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999942E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999943E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999944E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999945E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999946E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999948E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999949E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999951E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999952E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999954E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999955E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999956E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999957E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999958E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999961E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999962E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999963E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999964E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999965E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999967E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999968E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999969E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999997E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999971E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999973E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999974E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999975E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999976E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999977E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999979E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999981E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999982E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999983E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999985E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999986E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999988E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999989E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999992E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.10000076E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000075E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000074E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000073E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000072E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000069E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000068E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000067E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000066E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000064E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000063E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000062E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000061E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000058E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000057E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000056E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000055E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000054E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000052E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000051E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000049E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000048E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000046E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000045E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000044E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000043E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000042E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000039E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000038E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000037E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000036E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000035E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000033E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000032E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000031E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000003E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000029E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000027E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000026E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000025E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000024E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000023E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000021E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000019E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000018E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000017E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000015E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000014E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000012E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000011E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000008E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1E1,TO_NEAREST] --> [~1,~1] --> OK [~0.9999962,TO_NEAREST] --> [~1,~1] --> OK [~0.99999624,TO_NEAREST] --> [~1,~1] --> OK [~0.9999963,TO_NEAREST] --> [~1,~1] --> OK [~0.99999636,TO_NEAREST] --> [~1,~1] --> OK [~0.9999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999965,TO_NEAREST] --> [~1,~1] --> OK [~0.99999654,TO_NEAREST] --> [~1,~1] --> OK [~0.9999966,TO_NEAREST] --> [~1,~1] --> OK [~0.99999666,TO_NEAREST] --> [~1,~1] --> OK [~0.9999967,TO_NEAREST] --> [~1,~1] --> OK [~0.9999968,TO_NEAREST] --> [~1,~1] --> OK [~0.99999684,TO_NEAREST] --> [~1,~1] --> OK [~0.9999969,TO_NEAREST] --> [~1,~1] --> OK [~0.99999696,TO_NEAREST] --> [~1,~1] --> OK [~0.999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999971,TO_NEAREST] --> [~1,~1] --> OK [~0.99999714,TO_NEAREST] --> [~1,~1] --> OK [~0.9999972,TO_NEAREST] --> [~1,~1] --> OK [~0.99999726,TO_NEAREST] --> [~1,~1] --> OK [~0.9999973,TO_NEAREST] --> [~1,~1] --> OK [~0.9999974,TO_NEAREST] --> [~1,~1] --> OK [~0.99999744,TO_NEAREST] --> [~1,~1] --> OK [~0.9999975,TO_NEAREST] --> [~1,~1] --> OK [~0.99999756,TO_NEAREST] --> [~1,~1] --> OK [~0.9999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999977,TO_NEAREST] --> [~1,~1] --> OK [~0.99999774,TO_NEAREST] --> [~1,~1] --> OK [~0.9999978,TO_NEAREST] --> [~1,~1] --> OK [~0.99999785,TO_NEAREST] --> [~1,~1] --> OK [~0.9999979,TO_NEAREST] --> [~1,~1] --> OK [~0.999998,TO_NEAREST] --> [~1,~1] --> OK [~0.99999803,TO_NEAREST] --> [~1,~1] --> OK [~0.9999981,TO_NEAREST] --> [~1,~1] --> OK [~0.99999815,TO_NEAREST] --> [~1,~1] --> OK [~0.9999982,TO_NEAREST] --> [~1,~1] --> OK [~0.9999983,TO_NEAREST] --> [~1,~1] --> OK [~0.99999833,TO_NEAREST] --> [~1,~1] --> OK [~0.9999984,TO_NEAREST] --> [~1,~1] --> OK [~0.99999845,TO_NEAREST] --> [~1,~1] --> OK [~0.9999985,TO_NEAREST] --> [~1,~1] --> OK [~0.99999857,TO_NEAREST] --> [~1,~1] --> OK [~0.9999986,TO_NEAREST] --> [~1,~1] --> OK [~0.9999987,TO_NEAREST] --> [~1,~1] --> OK [~0.99999875,TO_NEAREST] --> [~1,~1] --> OK [~0.9999988,TO_NEAREST] --> [~1,~1] --> OK [~0.99999887,TO_NEAREST] --> [~1,~1] --> OK [~0.9999989,TO_NEAREST] --> [~1,~1] --> OK [~0.999999,TO_NEAREST] --> [~1,~1] --> OK [~0.99999905,TO_NEAREST] --> [~1,~1] --> OK [~0.9999991,TO_NEAREST] --> [~1,~1] --> OK [~0.99999917,TO_NEAREST] --> [~1,~1] --> OK [~0.9999992,TO_NEAREST] --> [~1,~1] --> OK [~0.9999993,TO_NEAREST] --> [~1,~1] --> OK [~0.99999934,TO_NEAREST] --> [~1,~1] --> OK [~0.9999994,TO_NEAREST] --> [~1,~1] --> OK [~0.99999946,TO_NEAREST] --> [~1,~1] --> OK [~0.9999995,TO_NEAREST] --> [~1,~1] --> OK [~0.9999996,TO_NEAREST] --> [~1,~1] --> OK [~0.99999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999997,TO_NEAREST] --> [~1,~1] --> OK [~0.99999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999,TO_NEAREST] --> [~1,~1] --> OK [~0.99999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9E~43,TO_NEAREST] --> [0,0] --> OK [~0.88E~43,TO_NEAREST] --> [0,0] --> OK [~0.87E~43,TO_NEAREST] --> [0,0] --> OK [~0.85E~43,TO_NEAREST] --> [0,0] --> OK [~0.84E~43,TO_NEAREST] --> [0,0] --> OK [~0.83E~43,TO_NEAREST] --> [0,0] --> OK [~0.81E~43,TO_NEAREST] --> [0,0] --> OK [~0.8E~43,TO_NEAREST] --> [0,0] --> OK [~0.78E~43,TO_NEAREST] --> [0,0] --> OK [~0.77E~43,TO_NEAREST] --> [0,0] --> OK [~0.76E~43,TO_NEAREST] --> [0,0] --> OK [~0.74E~43,TO_NEAREST] --> [0,0] --> OK [~0.73E~43,TO_NEAREST] --> [0,0] --> OK [~0.71E~43,TO_NEAREST] --> [0,0] --> OK [~0.7E~43,TO_NEAREST] --> [0,0] --> OK [~0.69E~43,TO_NEAREST] --> [0,0] --> OK [~0.67E~43,TO_NEAREST] --> [0,0] --> OK [~0.66E~43,TO_NEAREST] --> [0,0] --> OK [~0.64E~43,TO_NEAREST] --> [0,0] --> OK [~0.63E~43,TO_NEAREST] --> [0,0] --> OK [~0.62E~43,TO_NEAREST] --> [0,0] --> OK [~0.6E~43,TO_NEAREST] --> [0,0] --> OK [~0.59E~43,TO_NEAREST] --> [0,0] --> OK [~0.57E~43,TO_NEAREST] --> [0,0] --> OK [~0.56E~43,TO_NEAREST] --> [0,0] --> OK [~0.55E~43,TO_NEAREST] --> [0,0] --> OK [~0.53E~43,TO_NEAREST] --> [0,0] --> OK [~0.52E~43,TO_NEAREST] --> [0,0] --> OK [~0.5E~43,TO_NEAREST] --> [0,0] --> OK [~0.49E~43,TO_NEAREST] --> [0,0] --> OK [~0.48E~43,TO_NEAREST] --> [0,0] --> OK [~0.46E~43,TO_NEAREST] --> [0,0] --> OK [~0.45E~43,TO_NEAREST] --> [0,0] --> OK [~0.43E~43,TO_NEAREST] --> [0,0] --> OK [~0.42E~43,TO_NEAREST] --> [0,0] --> OK [~0.4E~43,TO_NEAREST] --> [0,0] --> OK [~0.39E~43,TO_NEAREST] --> [0,0] --> OK [~0.38E~43,TO_NEAREST] --> [0,0] --> OK [~0.36E~43,TO_NEAREST] --> [0,0] --> OK [~0.35E~43,TO_NEAREST] --> [0,0] --> OK [~0.34E~43,TO_NEAREST] --> [0,0] --> OK [~0.32E~43,TO_NEAREST] --> [0,0] --> OK [~0.31E~43,TO_NEAREST] --> [0,0] --> OK [~0.3E~43,TO_NEAREST] --> [0,0] --> OK [~0.28E~43,TO_NEAREST] --> [0,0] --> OK [~0.27E~43,TO_NEAREST] --> [0,0] --> OK [~0.25E~43,TO_NEAREST] --> [0,0] --> OK [~0.24E~43,TO_NEAREST] --> [0,0] --> OK [~0.22E~43,TO_NEAREST] --> [0,0] --> OK [~0.21E~43,TO_NEAREST] --> [0,0] --> OK [~0.2E~43,TO_NEAREST] --> [0,0] --> OK [~0.18E~43,TO_NEAREST] --> [0,0] --> OK [~0.17E~43,TO_NEAREST] --> [0,0] --> OK [~0.15E~43,TO_NEAREST] --> [0,0] --> OK [~0.14E~43,TO_NEAREST] --> [0,0] --> OK [~0.13E~43,TO_NEAREST] --> [0,0] --> OK [~0.11E~43,TO_NEAREST] --> [0,0] --> OK [~0.1E~43,TO_NEAREST] --> [0,0] --> OK [~0.8E~44,TO_NEAREST] --> [0,0] --> OK [~0.7E~44,TO_NEAREST] --> [0,0] --> OK [~0.6E~44,TO_NEAREST] --> [0,0] --> OK [~0.4E~44,TO_NEAREST] --> [0,0] --> OK [~0.3E~44,TO_NEAREST] --> [0,0] --> OK [~0.1E~44,TO_NEAREST] --> [0,0] --> OK [0.0,TO_NEAREST] --> [0,0] --> OK [0.9E~43,TO_NEAREST] --> [0,0] --> OK [0.88E~43,TO_NEAREST] --> [0,0] --> OK [0.87E~43,TO_NEAREST] --> [0,0] --> OK [0.85E~43,TO_NEAREST] --> [0,0] --> OK [0.84E~43,TO_NEAREST] --> [0,0] --> OK [0.83E~43,TO_NEAREST] --> [0,0] --> OK [0.81E~43,TO_NEAREST] --> [0,0] --> OK [0.8E~43,TO_NEAREST] --> [0,0] --> OK [0.78E~43,TO_NEAREST] --> [0,0] --> OK [0.77E~43,TO_NEAREST] --> [0,0] --> OK [0.76E~43,TO_NEAREST] --> [0,0] --> OK [0.74E~43,TO_NEAREST] --> [0,0] --> OK [0.73E~43,TO_NEAREST] --> [0,0] --> OK [0.71E~43,TO_NEAREST] --> [0,0] --> OK [0.7E~43,TO_NEAREST] --> [0,0] --> OK [0.69E~43,TO_NEAREST] --> [0,0] --> OK [0.67E~43,TO_NEAREST] --> [0,0] --> OK [0.66E~43,TO_NEAREST] --> [0,0] --> OK [0.64E~43,TO_NEAREST] --> [0,0] --> OK [0.63E~43,TO_NEAREST] --> [0,0] --> OK [0.62E~43,TO_NEAREST] --> [0,0] --> OK [0.6E~43,TO_NEAREST] --> [0,0] --> OK [0.59E~43,TO_NEAREST] --> [0,0] --> OK [0.57E~43,TO_NEAREST] --> [0,0] --> OK [0.56E~43,TO_NEAREST] --> [0,0] --> OK [0.55E~43,TO_NEAREST] --> [0,0] --> OK [0.53E~43,TO_NEAREST] --> [0,0] --> OK [0.52E~43,TO_NEAREST] --> [0,0] --> OK [0.5E~43,TO_NEAREST] --> [0,0] --> OK [0.49E~43,TO_NEAREST] --> [0,0] --> OK [0.48E~43,TO_NEAREST] --> [0,0] --> OK [0.46E~43,TO_NEAREST] --> [0,0] --> OK [0.45E~43,TO_NEAREST] --> [0,0] --> OK [0.43E~43,TO_NEAREST] --> [0,0] --> OK [0.42E~43,TO_NEAREST] --> [0,0] --> OK [0.4E~43,TO_NEAREST] --> [0,0] --> OK [0.39E~43,TO_NEAREST] --> [0,0] --> OK [0.38E~43,TO_NEAREST] --> [0,0] --> OK [0.36E~43,TO_NEAREST] --> [0,0] --> OK [0.35E~43,TO_NEAREST] --> [0,0] --> OK [0.34E~43,TO_NEAREST] --> [0,0] --> OK [0.32E~43,TO_NEAREST] --> [0,0] --> OK [0.31E~43,TO_NEAREST] --> [0,0] --> OK [0.3E~43,TO_NEAREST] --> [0,0] --> OK [0.28E~43,TO_NEAREST] --> [0,0] --> OK [0.27E~43,TO_NEAREST] --> [0,0] --> OK [0.25E~43,TO_NEAREST] --> [0,0] --> OK [0.24E~43,TO_NEAREST] --> [0,0] --> OK [0.22E~43,TO_NEAREST] --> [0,0] --> OK [0.21E~43,TO_NEAREST] --> [0,0] --> OK [0.2E~43,TO_NEAREST] --> [0,0] --> OK [0.18E~43,TO_NEAREST] --> [0,0] --> OK [0.17E~43,TO_NEAREST] --> [0,0] --> OK [0.15E~43,TO_NEAREST] --> [0,0] --> OK [0.14E~43,TO_NEAREST] --> [0,0] --> OK [0.13E~43,TO_NEAREST] --> [0,0] --> OK [0.11E~43,TO_NEAREST] --> [0,0] --> OK [0.1E~43,TO_NEAREST] --> [0,0] --> OK [0.8E~44,TO_NEAREST] --> [0,0] --> OK [0.7E~44,TO_NEAREST] --> [0,0] --> OK [0.6E~44,TO_NEAREST] --> [0,0] --> OK [0.4E~44,TO_NEAREST] --> [0,0] --> OK [0.3E~44,TO_NEAREST] --> [0,0] --> OK [0.1E~44,TO_NEAREST] --> [0,0] --> OK [0.9999962,TO_NEAREST] --> [1,1] --> OK [0.99999624,TO_NEAREST] --> [1,1] --> OK [0.9999963,TO_NEAREST] --> [1,1] --> OK [0.99999636,TO_NEAREST] --> [1,1] --> OK [0.9999964,TO_NEAREST] --> [1,1] --> OK [0.9999965,TO_NEAREST] --> [1,1] --> OK [0.99999654,TO_NEAREST] --> [1,1] --> OK [0.9999966,TO_NEAREST] --> [1,1] --> OK [0.99999666,TO_NEAREST] --> [1,1] --> OK [0.9999967,TO_NEAREST] --> [1,1] --> OK [0.9999968,TO_NEAREST] --> [1,1] --> OK [0.99999684,TO_NEAREST] --> [1,1] --> OK [0.9999969,TO_NEAREST] --> [1,1] --> OK [0.99999696,TO_NEAREST] --> [1,1] --> OK [0.999997,TO_NEAREST] --> [1,1] --> OK [0.9999971,TO_NEAREST] --> [1,1] --> OK [0.99999714,TO_NEAREST] --> [1,1] --> OK [0.9999972,TO_NEAREST] --> [1,1] --> OK [0.99999726,TO_NEAREST] --> [1,1] --> OK [0.9999973,TO_NEAREST] --> [1,1] --> OK [0.9999974,TO_NEAREST] --> [1,1] --> OK [0.99999744,TO_NEAREST] --> [1,1] --> OK [0.9999975,TO_NEAREST] --> [1,1] --> OK [0.99999756,TO_NEAREST] --> [1,1] --> OK [0.9999976,TO_NEAREST] --> [1,1] --> OK [0.9999977,TO_NEAREST] --> [1,1] --> OK [0.99999774,TO_NEAREST] --> [1,1] --> OK [0.9999978,TO_NEAREST] --> [1,1] --> OK [0.99999785,TO_NEAREST] --> [1,1] --> OK [0.9999979,TO_NEAREST] --> [1,1] --> OK [0.999998,TO_NEAREST] --> [1,1] --> OK [0.99999803,TO_NEAREST] --> [1,1] --> OK [0.9999981,TO_NEAREST] --> [1,1] --> OK [0.99999815,TO_NEAREST] --> [1,1] --> OK [0.9999982,TO_NEAREST] --> [1,1] --> OK [0.9999983,TO_NEAREST] --> [1,1] --> OK [0.99999833,TO_NEAREST] --> [1,1] --> OK [0.9999984,TO_NEAREST] --> [1,1] --> OK [0.99999845,TO_NEAREST] --> [1,1] --> OK [0.9999985,TO_NEAREST] --> [1,1] --> OK [0.99999857,TO_NEAREST] --> [1,1] --> OK [0.9999986,TO_NEAREST] --> [1,1] --> OK [0.9999987,TO_NEAREST] --> [1,1] --> OK [0.99999875,TO_NEAREST] --> [1,1] --> OK [0.9999988,TO_NEAREST] --> [1,1] --> OK [0.99999887,TO_NEAREST] --> [1,1] --> OK [0.9999989,TO_NEAREST] --> [1,1] --> OK [0.999999,TO_NEAREST] --> [1,1] --> OK [0.99999905,TO_NEAREST] --> [1,1] --> OK [0.9999991,TO_NEAREST] --> [1,1] --> OK [0.99999917,TO_NEAREST] --> [1,1] --> OK [0.9999992,TO_NEAREST] --> [1,1] --> OK [0.9999993,TO_NEAREST] --> [1,1] --> OK [0.99999934,TO_NEAREST] --> [1,1] --> OK [0.9999994,TO_NEAREST] --> [1,1] --> OK [0.99999946,TO_NEAREST] --> [1,1] --> OK [0.9999995,TO_NEAREST] --> [1,1] --> OK [0.9999996,TO_NEAREST] --> [1,1] --> OK [0.99999964,TO_NEAREST] --> [1,1] --> OK [0.9999997,TO_NEAREST] --> [1,1] --> OK [0.99999976,TO_NEAREST] --> [1,1] --> OK [0.9999998,TO_NEAREST] --> [1,1] --> OK [0.9999999,TO_NEAREST] --> [1,1] --> OK [0.99999994,TO_NEAREST] --> [1,1] --> OK [0.1E1,TO_NEAREST] --> [1,1] --> OK [0.10000076E1,TO_NEAREST] --> [1,1] --> OK [0.10000075E1,TO_NEAREST] --> [1,1] --> OK [0.10000074E1,TO_NEAREST] --> [1,1] --> OK [0.10000073E1,TO_NEAREST] --> [1,1] --> OK [0.10000072E1,TO_NEAREST] --> [1,1] --> OK [0.1000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000069E1,TO_NEAREST] --> [1,1] --> OK [0.10000068E1,TO_NEAREST] --> [1,1] --> OK [0.10000067E1,TO_NEAREST] --> [1,1] --> OK [0.10000066E1,TO_NEAREST] --> [1,1] --> OK [0.10000064E1,TO_NEAREST] --> [1,1] --> OK [0.10000063E1,TO_NEAREST] --> [1,1] --> OK [0.10000062E1,TO_NEAREST] --> [1,1] --> OK [0.10000061E1,TO_NEAREST] --> [1,1] --> OK [0.1000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000058E1,TO_NEAREST] --> [1,1] --> OK [0.10000057E1,TO_NEAREST] --> [1,1] --> OK [0.10000056E1,TO_NEAREST] --> [1,1] --> OK [0.10000055E1,TO_NEAREST] --> [1,1] --> OK [0.10000054E1,TO_NEAREST] --> [1,1] --> OK [0.10000052E1,TO_NEAREST] --> [1,1] --> OK [0.10000051E1,TO_NEAREST] --> [1,1] --> OK [0.1000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000049E1,TO_NEAREST] --> [1,1] --> OK [0.10000048E1,TO_NEAREST] --> [1,1] --> OK [0.10000046E1,TO_NEAREST] --> [1,1] --> OK [0.10000045E1,TO_NEAREST] --> [1,1] --> OK [0.10000044E1,TO_NEAREST] --> [1,1] --> OK [0.10000043E1,TO_NEAREST] --> [1,1] --> OK [0.10000042E1,TO_NEAREST] --> [1,1] --> OK [0.1000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000039E1,TO_NEAREST] --> [1,1] --> OK [0.10000038E1,TO_NEAREST] --> [1,1] --> OK [0.10000037E1,TO_NEAREST] --> [1,1] --> OK [0.10000036E1,TO_NEAREST] --> [1,1] --> OK [0.10000035E1,TO_NEAREST] --> [1,1] --> OK [0.10000033E1,TO_NEAREST] --> [1,1] --> OK [0.10000032E1,TO_NEAREST] --> [1,1] --> OK [0.10000031E1,TO_NEAREST] --> [1,1] --> OK [0.1000003E1,TO_NEAREST] --> [1,1] --> OK [0.10000029E1,TO_NEAREST] --> [1,1] --> OK [0.10000027E1,TO_NEAREST] --> [1,1] --> OK [0.10000026E1,TO_NEAREST] --> [1,1] --> OK [0.10000025E1,TO_NEAREST] --> [1,1] --> OK [0.10000024E1,TO_NEAREST] --> [1,1] --> OK [0.10000023E1,TO_NEAREST] --> [1,1] --> OK [0.10000021E1,TO_NEAREST] --> [1,1] --> OK [0.1000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000019E1,TO_NEAREST] --> [1,1] --> OK [0.10000018E1,TO_NEAREST] --> [1,1] --> OK [0.10000017E1,TO_NEAREST] --> [1,1] --> OK [0.10000015E1,TO_NEAREST] --> [1,1] --> OK [0.10000014E1,TO_NEAREST] --> [1,1] --> OK [0.10000013E1,TO_NEAREST] --> [1,1] --> OK [0.10000012E1,TO_NEAREST] --> [1,1] --> OK [0.10000011E1,TO_NEAREST] --> [1,1] --> OK [0.1000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000008E1,TO_NEAREST] --> [1,1] --> OK [0.10000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000001E1,TO_NEAREST] --> [1,1] --> OK [0.19999924E1,TO_NEAREST] --> [2,2] --> OK [0.19999925E1,TO_NEAREST] --> [2,2] --> OK [0.19999926E1,TO_NEAREST] --> [2,2] --> OK [0.19999927E1,TO_NEAREST] --> [2,2] --> OK [0.19999928E1,TO_NEAREST] --> [2,2] --> OK [0.1999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999931E1,TO_NEAREST] --> [2,2] --> OK [0.19999932E1,TO_NEAREST] --> [2,2] --> OK [0.19999933E1,TO_NEAREST] --> [2,2] --> OK [0.19999934E1,TO_NEAREST] --> [2,2] --> OK [0.19999936E1,TO_NEAREST] --> [2,2] --> OK [0.19999937E1,TO_NEAREST] --> [2,2] --> OK [0.19999938E1,TO_NEAREST] --> [2,2] --> OK [0.19999939E1,TO_NEAREST] --> [2,2] --> OK [0.1999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999942E1,TO_NEAREST] --> [2,2] --> OK [0.19999943E1,TO_NEAREST] --> [2,2] --> OK [0.19999944E1,TO_NEAREST] --> [2,2] --> OK [0.19999945E1,TO_NEAREST] --> [2,2] --> OK [0.19999946E1,TO_NEAREST] --> [2,2] --> OK [0.19999948E1,TO_NEAREST] --> [2,2] --> OK [0.19999949E1,TO_NEAREST] --> [2,2] --> OK [0.1999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999951E1,TO_NEAREST] --> [2,2] --> OK [0.19999952E1,TO_NEAREST] --> [2,2] --> OK [0.19999954E1,TO_NEAREST] --> [2,2] --> OK [0.19999955E1,TO_NEAREST] --> [2,2] --> OK [0.19999956E1,TO_NEAREST] --> [2,2] --> OK [0.19999957E1,TO_NEAREST] --> [2,2] --> OK [0.19999958E1,TO_NEAREST] --> [2,2] --> OK [0.1999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999961E1,TO_NEAREST] --> [2,2] --> OK [0.19999962E1,TO_NEAREST] --> [2,2] --> OK [0.19999963E1,TO_NEAREST] --> [2,2] --> OK [0.19999964E1,TO_NEAREST] --> [2,2] --> OK [0.19999965E1,TO_NEAREST] --> [2,2] --> OK [0.19999967E1,TO_NEAREST] --> [2,2] --> OK [0.19999968E1,TO_NEAREST] --> [2,2] --> OK [0.19999969E1,TO_NEAREST] --> [2,2] --> OK [0.1999997E1,TO_NEAREST] --> [2,2] --> OK [0.19999971E1,TO_NEAREST] --> [2,2] --> OK [0.19999973E1,TO_NEAREST] --> [2,2] --> OK [0.19999974E1,TO_NEAREST] --> [2,2] --> OK [0.19999975E1,TO_NEAREST] --> [2,2] --> OK [0.19999976E1,TO_NEAREST] --> [2,2] --> OK [0.19999977E1,TO_NEAREST] --> [2,2] --> OK [0.19999979E1,TO_NEAREST] --> [2,2] --> OK [0.1999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999981E1,TO_NEAREST] --> [2,2] --> OK [0.19999982E1,TO_NEAREST] --> [2,2] --> OK [0.19999983E1,TO_NEAREST] --> [2,2] --> OK [0.19999985E1,TO_NEAREST] --> [2,2] --> OK [0.19999986E1,TO_NEAREST] --> [2,2] --> OK [0.19999987E1,TO_NEAREST] --> [2,2] --> OK [0.19999988E1,TO_NEAREST] --> [2,2] --> OK [0.19999989E1,TO_NEAREST] --> [2,2] --> OK [0.1999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999992E1,TO_NEAREST] --> [2,2] --> OK [0.19999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999999E1,TO_NEAREST] --> [2,2] --> OK [0.2E1,TO_NEAREST] --> [2,2] --> OK [0.20000153E1,TO_NEAREST] --> [2,2] --> OK [0.2000015E1,TO_NEAREST] --> [2,2] --> OK [0.20000148E1,TO_NEAREST] --> [2,2] --> OK [0.20000145E1,TO_NEAREST] --> [2,2] --> OK [0.20000143E1,TO_NEAREST] --> [2,2] --> OK [0.2000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000138E1,TO_NEAREST] --> [2,2] --> OK [0.20000136E1,TO_NEAREST] --> [2,2] --> OK [0.20000134E1,TO_NEAREST] --> [2,2] --> OK [0.2000013E1,TO_NEAREST] --> [2,2] --> OK [0.20000129E1,TO_NEAREST] --> [2,2] --> OK [0.20000126E1,TO_NEAREST] --> [2,2] --> OK [0.20000124E1,TO_NEAREST] --> [2,2] --> OK [0.20000122E1,TO_NEAREST] --> [2,2] --> OK [0.2000012E1,TO_NEAREST] --> [2,2] --> OK [0.20000117E1,TO_NEAREST] --> [2,2] --> OK [0.20000114E1,TO_NEAREST] --> [2,2] --> OK [0.20000112E1,TO_NEAREST] --> [2,2] --> OK [0.2000011E1,TO_NEAREST] --> [2,2] --> OK [0.20000107E1,TO_NEAREST] --> [2,2] --> OK [0.20000105E1,TO_NEAREST] --> [2,2] --> OK [0.20000103E1,TO_NEAREST] --> [2,2] --> OK [0.200001E1,TO_NEAREST] --> [2,2] --> OK [0.20000098E1,TO_NEAREST] --> [2,2] --> OK [0.20000095E1,TO_NEAREST] --> [2,2] --> OK [0.20000093E1,TO_NEAREST] --> [2,2] --> OK [0.2000009E1,TO_NEAREST] --> [2,2] --> OK [0.20000088E1,TO_NEAREST] --> [2,2] --> OK [0.20000086E1,TO_NEAREST] --> [2,2] --> OK [0.20000083E1,TO_NEAREST] --> [2,2] --> OK [0.2000008E1,TO_NEAREST] --> [2,2] --> OK [0.20000079E1,TO_NEAREST] --> [2,2] --> OK [0.20000076E1,TO_NEAREST] --> [2,2] --> OK [0.20000074E1,TO_NEAREST] --> [2,2] --> OK [0.20000072E1,TO_NEAREST] --> [2,2] --> OK [0.2000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000067E1,TO_NEAREST] --> [2,2] --> OK [0.20000064E1,TO_NEAREST] --> [2,2] --> OK [0.20000062E1,TO_NEAREST] --> [2,2] --> OK [0.2000006E1,TO_NEAREST] --> [2,2] --> OK [0.20000057E1,TO_NEAREST] --> [2,2] --> OK [0.20000055E1,TO_NEAREST] --> [2,2] --> OK [0.20000052E1,TO_NEAREST] --> [2,2] --> OK [0.2000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000048E1,TO_NEAREST] --> [2,2] --> OK [0.20000045E1,TO_NEAREST] --> [2,2] --> OK [0.20000043E1,TO_NEAREST] --> [2,2] --> OK [0.2000004E1,TO_NEAREST] --> [2,2] --> OK [0.20000038E1,TO_NEAREST] --> [2,2] --> OK [0.20000036E1,TO_NEAREST] --> [2,2] --> OK [0.20000033E1,TO_NEAREST] --> [2,2] --> OK [0.2000003E1,TO_NEAREST] --> [2,2] --> OK [0.20000029E1,TO_NEAREST] --> [2,2] --> OK [0.20000026E1,TO_NEAREST] --> [2,2] --> OK [0.20000024E1,TO_NEAREST] --> [2,2] --> OK [0.20000021E1,TO_NEAREST] --> [2,2] --> OK [0.2000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000017E1,TO_NEAREST] --> [2,2] --> OK [0.20000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000012E1,TO_NEAREST] --> [2,2] --> OK [0.2000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000002E1,TO_NEAREST] --> [2,2] --> OK [0.29999847E1,TO_NEAREST] --> [3,3] --> OK [0.2999985E1,TO_NEAREST] --> [3,3] --> OK [0.29999852E1,TO_NEAREST] --> [3,3] --> OK [0.29999855E1,TO_NEAREST] --> [3,3] --> OK [0.29999857E1,TO_NEAREST] --> [3,3] --> OK [0.2999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999862E1,TO_NEAREST] --> [3,3] --> OK [0.29999864E1,TO_NEAREST] --> [3,3] --> OK [0.29999866E1,TO_NEAREST] --> [3,3] --> OK [0.2999987E1,TO_NEAREST] --> [3,3] --> OK [0.29999871E1,TO_NEAREST] --> [3,3] --> OK [0.29999874E1,TO_NEAREST] --> [3,3] --> OK [0.29999876E1,TO_NEAREST] --> [3,3] --> OK [0.29999878E1,TO_NEAREST] --> [3,3] --> OK [0.2999988E1,TO_NEAREST] --> [3,3] --> OK [0.29999883E1,TO_NEAREST] --> [3,3] --> OK [0.29999886E1,TO_NEAREST] --> [3,3] --> OK [0.29999888E1,TO_NEAREST] --> [3,3] --> OK [0.2999989E1,TO_NEAREST] --> [3,3] --> OK [0.29999893E1,TO_NEAREST] --> [3,3] --> OK [0.29999895E1,TO_NEAREST] --> [3,3] --> OK [0.29999897E1,TO_NEAREST] --> [3,3] --> OK [0.299999E1,TO_NEAREST] --> [3,3] --> OK [0.29999902E1,TO_NEAREST] --> [3,3] --> OK [0.29999905E1,TO_NEAREST] --> [3,3] --> OK [0.29999907E1,TO_NEAREST] --> [3,3] --> OK [0.2999991E1,TO_NEAREST] --> [3,3] --> OK [0.29999912E1,TO_NEAREST] --> [3,3] --> OK [0.29999914E1,TO_NEAREST] --> [3,3] --> OK [0.29999917E1,TO_NEAREST] --> [3,3] --> OK [0.2999992E1,TO_NEAREST] --> [3,3] --> OK [0.29999921E1,TO_NEAREST] --> [3,3] --> OK [0.29999924E1,TO_NEAREST] --> [3,3] --> OK [0.29999926E1,TO_NEAREST] --> [3,3] --> OK [0.29999928E1,TO_NEAREST] --> [3,3] --> OK [0.2999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999933E1,TO_NEAREST] --> [3,3] --> OK [0.29999936E1,TO_NEAREST] --> [3,3] --> OK [0.29999938E1,TO_NEAREST] --> [3,3] --> OK [0.2999994E1,TO_NEAREST] --> [3,3] --> OK [0.29999943E1,TO_NEAREST] --> [3,3] --> OK [0.29999945E1,TO_NEAREST] --> [3,3] --> OK [0.29999948E1,TO_NEAREST] --> [3,3] --> OK [0.2999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999952E1,TO_NEAREST] --> [3,3] --> OK [0.29999955E1,TO_NEAREST] --> [3,3] --> OK [0.29999957E1,TO_NEAREST] --> [3,3] --> OK [0.2999996E1,TO_NEAREST] --> [3,3] --> OK [0.29999962E1,TO_NEAREST] --> [3,3] --> OK [0.29999964E1,TO_NEAREST] --> [3,3] --> OK [0.29999967E1,TO_NEAREST] --> [3,3] --> OK [0.2999997E1,TO_NEAREST] --> [3,3] --> OK [0.29999971E1,TO_NEAREST] --> [3,3] --> OK [0.29999974E1,TO_NEAREST] --> [3,3] --> OK [0.29999976E1,TO_NEAREST] --> [3,3] --> OK [0.29999979E1,TO_NEAREST] --> [3,3] --> OK [0.2999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999983E1,TO_NEAREST] --> [3,3] --> OK [0.29999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999988E1,TO_NEAREST] --> [3,3] --> OK [0.2999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999998E1,TO_NEAREST] --> [3,3] --> OK [0.3E1,TO_NEAREST] --> [3,3] --> OK [0.30000153E1,TO_NEAREST] --> [3,3] --> OK [0.3000015E1,TO_NEAREST] --> [3,3] --> OK [0.30000148E1,TO_NEAREST] --> [3,3] --> OK [0.30000145E1,TO_NEAREST] --> [3,3] --> OK [0.30000143E1,TO_NEAREST] --> [3,3] --> OK [0.3000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000138E1,TO_NEAREST] --> [3,3] --> OK [0.30000136E1,TO_NEAREST] --> [3,3] --> OK [0.30000134E1,TO_NEAREST] --> [3,3] --> OK [0.3000013E1,TO_NEAREST] --> [3,3] --> OK [0.30000129E1,TO_NEAREST] --> [3,3] --> OK [0.30000126E1,TO_NEAREST] --> [3,3] --> OK [0.30000124E1,TO_NEAREST] --> [3,3] --> OK [0.30000122E1,TO_NEAREST] --> [3,3] --> OK [0.3000012E1,TO_NEAREST] --> [3,3] --> OK [0.30000117E1,TO_NEAREST] --> [3,3] --> OK [0.30000114E1,TO_NEAREST] --> [3,3] --> OK [0.30000112E1,TO_NEAREST] --> [3,3] --> OK [0.3000011E1,TO_NEAREST] --> [3,3] --> OK [0.30000107E1,TO_NEAREST] --> [3,3] --> OK [0.30000105E1,TO_NEAREST] --> [3,3] --> OK [0.30000103E1,TO_NEAREST] --> [3,3] --> OK [0.300001E1,TO_NEAREST] --> [3,3] --> OK [0.30000098E1,TO_NEAREST] --> [3,3] --> OK [0.30000095E1,TO_NEAREST] --> [3,3] --> OK [0.30000093E1,TO_NEAREST] --> [3,3] --> OK [0.3000009E1,TO_NEAREST] --> [3,3] --> OK [0.30000088E1,TO_NEAREST] --> [3,3] --> OK [0.30000086E1,TO_NEAREST] --> [3,3] --> OK [0.30000083E1,TO_NEAREST] --> [3,3] --> OK [0.3000008E1,TO_NEAREST] --> [3,3] --> OK [0.30000079E1,TO_NEAREST] --> [3,3] --> OK [0.30000076E1,TO_NEAREST] --> [3,3] --> OK [0.30000074E1,TO_NEAREST] --> [3,3] --> OK [0.30000072E1,TO_NEAREST] --> [3,3] --> OK [0.3000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000067E1,TO_NEAREST] --> [3,3] --> OK [0.30000064E1,TO_NEAREST] --> [3,3] --> OK [0.30000062E1,TO_NEAREST] --> [3,3] --> OK [0.3000006E1,TO_NEAREST] --> [3,3] --> OK [0.30000057E1,TO_NEAREST] --> [3,3] --> OK [0.30000055E1,TO_NEAREST] --> [3,3] --> OK [0.30000052E1,TO_NEAREST] --> [3,3] --> OK [0.3000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000048E1,TO_NEAREST] --> [3,3] --> OK [0.30000045E1,TO_NEAREST] --> [3,3] --> OK [0.30000043E1,TO_NEAREST] --> [3,3] --> OK [0.3000004E1,TO_NEAREST] --> [3,3] --> OK [0.30000038E1,TO_NEAREST] --> [3,3] --> OK [0.30000036E1,TO_NEAREST] --> [3,3] --> OK [0.30000033E1,TO_NEAREST] --> [3,3] --> OK [0.3000003E1,TO_NEAREST] --> [3,3] --> OK [0.30000029E1,TO_NEAREST] --> [3,3] --> OK [0.30000026E1,TO_NEAREST] --> [3,3] --> OK [0.30000024E1,TO_NEAREST] --> [3,3] --> OK [0.30000021E1,TO_NEAREST] --> [3,3] --> OK [0.3000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000017E1,TO_NEAREST] --> [3,3] --> OK [0.30000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000012E1,TO_NEAREST] --> [3,3] --> OK [0.3000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000002E1,TO_NEAREST] --> [3,3] --> OK [0.10737377E10,TO_NEAREST] --> [1073737728,1073737728] --> OK [0.10737378E10,TO_NEAREST] --> [1073737792,1073737792] --> OK [0.107373786E10,TO_NEAREST] --> [1073737856,1073737856] --> OK [0.10737379E10,TO_NEAREST] --> [1073737920,1073737920] --> OK [0.1073738E10,TO_NEAREST] --> [1073737984,1073737984] --> OK [0.107373805E10,TO_NEAREST] --> [1073738048,1073738048] --> OK [0.10737381E10,TO_NEAREST] --> [1073738112,1073738112] --> OK [0.10737382E10,TO_NEAREST] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_NEAREST] --> [1073738240,1073738240] --> OK [0.10737383E10,TO_NEAREST] --> [1073738304,1073738304] --> OK [0.10737384E10,TO_NEAREST] --> [1073738368,1073738368] --> OK [0.107373843E10,TO_NEAREST] --> [1073738432,1073738432] --> OK [0.10737385E10,TO_NEAREST] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_NEAREST] --> [1073738560,1073738560] --> OK [0.10737386E10,TO_NEAREST] --> [1073738624,1073738624] --> OK [0.10737387E10,TO_NEAREST] --> [1073738688,1073738688] --> OK [0.107373875E10,TO_NEAREST] --> [1073738752,1073738752] --> OK [0.10737388E10,TO_NEAREST] --> [1073738816,1073738816] --> OK [0.10737389E10,TO_NEAREST] --> [1073738880,1073738880] --> OK [0.107373894E10,TO_NEAREST] --> [1073738944,1073738944] --> OK [0.1073739E10,TO_NEAREST] --> [1073739008,1073739008] --> OK [0.10737391E10,TO_NEAREST] --> [1073739072,1073739072] --> OK [0.107373914E10,TO_NEAREST] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_NEAREST] --> [1073739200,1073739200] --> OK [0.107373926E10,TO_NEAREST] --> [1073739264,1073739264] --> OK [0.10737393E10,TO_NEAREST] --> [1073739328,1073739328] --> OK [0.10737394E10,TO_NEAREST] --> [1073739392,1073739392] --> OK [0.107373946E10,TO_NEAREST] --> [1073739456,1073739456] --> OK [0.10737395E10,TO_NEAREST] --> [1073739520,1073739520] --> OK [0.10737396E10,TO_NEAREST] --> [1073739584,1073739584] --> OK [0.107373965E10,TO_NEAREST] --> [1073739648,1073739648] --> OK [0.10737397E10,TO_NEAREST] --> [1073739712,1073739712] --> OK [0.10737398E10,TO_NEAREST] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_NEAREST] --> [1073739840,1073739840] --> OK [0.10737399E10,TO_NEAREST] --> [1073739904,1073739904] --> OK [0.107373997E10,TO_NEAREST] --> [1073739968,1073739968] --> OK [0.107374E10,TO_NEAREST] --> [1073740032,1073740032] --> OK [0.10737401E10,TO_NEAREST] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_NEAREST] --> [1073740160,1073740160] --> OK [0.10737402E10,TO_NEAREST] --> [1073740224,1073740224] --> OK [0.10737403E10,TO_NEAREST] --> [1073740288,1073740288] --> OK [0.107374035E10,TO_NEAREST] --> [1073740352,1073740352] --> OK [0.10737404E10,TO_NEAREST] --> [1073740416,1073740416] --> OK [0.10737405E10,TO_NEAREST] --> [1073740480,1073740480] --> OK [0.107374054E10,TO_NEAREST] --> [1073740544,1073740544] --> OK [0.10737406E10,TO_NEAREST] --> [1073740608,1073740608] --> OK [0.10737407E10,TO_NEAREST] --> [1073740672,1073740672] --> OK [0.107374074E10,TO_NEAREST] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_NEAREST] --> [1073740800,1073740800] --> OK [0.107374086E10,TO_NEAREST] --> [1073740864,1073740864] --> OK [0.10737409E10,TO_NEAREST] --> [1073740928,1073740928] --> OK [0.1073741E10,TO_NEAREST] --> [1073740992,1073740992] --> OK [0.107374106E10,TO_NEAREST] --> [1073741056,1073741056] --> OK [0.10737411E10,TO_NEAREST] --> [1073741120,1073741120] --> OK [0.10737412E10,TO_NEAREST] --> [1073741184,1073741184] --> OK [0.107374125E10,TO_NEAREST] --> [1073741248,1073741248] --> OK [0.10737413E10,TO_NEAREST] --> [1073741312,1073741312] --> OK [0.10737414E10,TO_NEAREST] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_NEAREST] --> [1073741440,1073741440] --> OK [0.10737415E10,TO_NEAREST] --> [1073741504,1073741504] --> OK [0.10737416E10,TO_NEAREST] --> [1073741568,1073741568] --> OK [0.107374163E10,TO_NEAREST] --> [1073741632,1073741632] --> OK [0.10737417E10,TO_NEAREST] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_NEAREST] --> [1073741760,1073741760] --> OK [0.10737418E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.107375E10,TO_NEAREST] --> [1073750016,1073750016] --> OK [0.10737499E10,TO_NEAREST] --> [1073749888,1073749888] --> OK [0.10737498E10,TO_NEAREST] --> [1073749760,1073749760] --> OK [0.10737496E10,TO_NEAREST] --> [1073749632,1073749632] --> OK [0.10737495E10,TO_NEAREST] --> [1073749504,1073749504] --> OK [0.10737494E10,TO_NEAREST] --> [1073749376,1073749376] --> OK [0.10737492E10,TO_NEAREST] --> [1073749248,1073749248] --> OK [0.10737491E10,TO_NEAREST] --> [1073749120,1073749120] --> OK [0.1073749E10,TO_NEAREST] --> [1073748992,1073748992] --> OK [0.10737489E10,TO_NEAREST] --> [1073748864,1073748864] --> OK [0.10737487E10,TO_NEAREST] --> [1073748736,1073748736] --> OK [0.10737486E10,TO_NEAREST] --> [1073748608,1073748608] --> OK [0.10737485E10,TO_NEAREST] --> [1073748480,1073748480] --> OK [0.10737484E10,TO_NEAREST] --> [1073748352,1073748352] --> OK [0.10737482E10,TO_NEAREST] --> [1073748224,1073748224] --> OK [0.10737481E10,TO_NEAREST] --> [1073748096,1073748096] --> OK [0.1073748E10,TO_NEAREST] --> [1073747968,1073747968] --> OK [0.10737478E10,TO_NEAREST] --> [1073747840,1073747840] --> OK [0.10737477E10,TO_NEAREST] --> [1073747712,1073747712] --> OK [0.10737476E10,TO_NEAREST] --> [1073747584,1073747584] --> OK [0.10737475E10,TO_NEAREST] --> [1073747456,1073747456] --> OK [0.10737473E10,TO_NEAREST] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_NEAREST] --> [1073747200,1073747200] --> OK [0.10737471E10,TO_NEAREST] --> [1073747072,1073747072] --> OK [0.1073747E10,TO_NEAREST] --> [1073746944,1073746944] --> OK [0.10737468E10,TO_NEAREST] --> [1073746816,1073746816] --> OK [0.10737467E10,TO_NEAREST] --> [1073746688,1073746688] --> OK [0.10737466E10,TO_NEAREST] --> [1073746560,1073746560] --> OK [0.10737464E10,TO_NEAREST] --> [1073746432,1073746432] --> OK [0.10737463E10,TO_NEAREST] --> [1073746304,1073746304] --> OK [0.10737462E10,TO_NEAREST] --> [1073746176,1073746176] --> OK [0.1073746E10,TO_NEAREST] --> [1073746048,1073746048] --> OK [0.10737459E10,TO_NEAREST] --> [1073745920,1073745920] --> OK [0.10737458E10,TO_NEAREST] --> [1073745792,1073745792] --> OK [0.10737457E10,TO_NEAREST] --> [1073745664,1073745664] --> OK [0.10737455E10,TO_NEAREST] --> [1073745536,1073745536] --> OK [0.10737454E10,TO_NEAREST] --> [1073745408,1073745408] --> OK [0.10737453E10,TO_NEAREST] --> [1073745280,1073745280] --> OK [0.10737452E10,TO_NEAREST] --> [1073745152,1073745152] --> OK [0.1073745E10,TO_NEAREST] --> [1073745024,1073745024] --> OK [0.10737449E10,TO_NEAREST] --> [1073744896,1073744896] --> OK [0.10737448E10,TO_NEAREST] --> [1073744768,1073744768] --> OK [0.10737446E10,TO_NEAREST] --> [1073744640,1073744640] --> OK [0.10737445E10,TO_NEAREST] --> [1073744512,1073744512] --> OK [0.10737444E10,TO_NEAREST] --> [1073744384,1073744384] --> OK [0.10737443E10,TO_NEAREST] --> [1073744256,1073744256] --> OK [0.10737441E10,TO_NEAREST] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_NEAREST] --> [1073744000,1073744000] --> OK [0.10737439E10,TO_NEAREST] --> [1073743872,1073743872] --> OK [0.10737437E10,TO_NEAREST] --> [1073743744,1073743744] --> OK [0.10737436E10,TO_NEAREST] --> [1073743616,1073743616] --> OK [0.10737435E10,TO_NEAREST] --> [1073743488,1073743488] --> OK [0.10737434E10,TO_NEAREST] --> [1073743360,1073743360] --> OK [0.10737432E10,TO_NEAREST] --> [1073743232,1073743232] --> OK [0.10737431E10,TO_NEAREST] --> [1073743104,1073743104] --> OK [0.1073743E10,TO_NEAREST] --> [1073742976,1073742976] --> OK [0.10737428E10,TO_NEAREST] --> [1073742848,1073742848] --> OK [0.10737427E10,TO_NEAREST] --> [1073742720,1073742720] --> OK [0.10737426E10,TO_NEAREST] --> [1073742592,1073742592] --> OK [0.10737425E10,TO_NEAREST] --> [1073742464,1073742464] --> OK [0.10737423E10,TO_NEAREST] --> [1073742336,1073742336] --> OK [0.10737422E10,TO_NEAREST] --> [1073742208,1073742208] --> OK [0.10737421E10,TO_NEAREST] --> [1073742080,1073742080] --> OK [0.1073742E10,TO_NEAREST] --> [1073741952,1073741952] --> OK [0.16106045E10,TO_NEAREST] --> [1610604544,1610604544] --> OK [0.16106047E10,TO_NEAREST] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_NEAREST] --> [1610604800,1610604800] --> OK [0.16106049E10,TO_NEAREST] --> [1610604928,1610604928] --> OK [0.1610605E10,TO_NEAREST] --> [1610605056,1610605056] --> OK [0.16106052E10,TO_NEAREST] --> [1610605184,1610605184] --> OK [0.16106053E10,TO_NEAREST] --> [1610605312,1610605312] --> OK [0.16106054E10,TO_NEAREST] --> [1610605440,1610605440] --> OK [0.16106056E10,TO_NEAREST] --> [1610605568,1610605568] --> OK [0.16106057E10,TO_NEAREST] --> [1610605696,1610605696] --> OK [0.16106058E10,TO_NEAREST] --> [1610605824,1610605824] --> OK [0.1610606E10,TO_NEAREST] --> [1610605952,1610605952] --> OK [0.16106061E10,TO_NEAREST] --> [1610606080,1610606080] --> OK [0.16106062E10,TO_NEAREST] --> [1610606208,1610606208] --> OK [0.16106063E10,TO_NEAREST] --> [1610606336,1610606336] --> OK [0.16106065E10,TO_NEAREST] --> [1610606464,1610606464] --> OK [0.16106066E10,TO_NEAREST] --> [1610606592,1610606592] --> OK [0.16106067E10,TO_NEAREST] --> [1610606720,1610606720] --> OK [0.16106068E10,TO_NEAREST] --> [1610606848,1610606848] --> OK [0.1610607E10,TO_NEAREST] --> [1610606976,1610606976] --> OK [0.16106071E10,TO_NEAREST] --> [1610607104,1610607104] --> OK [0.16106072E10,TO_NEAREST] --> [1610607232,1610607232] --> OK [0.16106074E10,TO_NEAREST] --> [1610607360,1610607360] --> OK [0.16106075E10,TO_NEAREST] --> [1610607488,1610607488] --> OK [0.16106076E10,TO_NEAREST] --> [1610607616,1610607616] --> OK [0.16106077E10,TO_NEAREST] --> [1610607744,1610607744] --> OK [0.16106079E10,TO_NEAREST] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_NEAREST] --> [1610608000,1610608000] --> OK [0.16106081E10,TO_NEAREST] --> [1610608128,1610608128] --> OK [0.16106083E10,TO_NEAREST] --> [1610608256,1610608256] --> OK [0.16106084E10,TO_NEAREST] --> [1610608384,1610608384] --> OK [0.16106085E10,TO_NEAREST] --> [1610608512,1610608512] --> OK [0.16106086E10,TO_NEAREST] --> [1610608640,1610608640] --> OK [0.16106088E10,TO_NEAREST] --> [1610608768,1610608768] --> OK [0.16106089E10,TO_NEAREST] --> [1610608896,1610608896] --> OK [0.1610609E10,TO_NEAREST] --> [1610609024,1610609024] --> OK [0.16106092E10,TO_NEAREST] --> [1610609152,1610609152] --> OK [0.16106093E10,TO_NEAREST] --> [1610609280,1610609280] --> OK [0.16106094E10,TO_NEAREST] --> [1610609408,1610609408] --> OK [0.16106095E10,TO_NEAREST] --> [1610609536,1610609536] --> OK [0.16106097E10,TO_NEAREST] --> [1610609664,1610609664] --> OK [0.16106098E10,TO_NEAREST] --> [1610609792,1610609792] --> OK [0.16106099E10,TO_NEAREST] --> [1610609920,1610609920] --> OK [0.161061E10,TO_NEAREST] --> [1610610048,1610610048] --> OK [0.16106102E10,TO_NEAREST] --> [1610610176,1610610176] --> OK [0.16106103E10,TO_NEAREST] --> [1610610304,1610610304] --> OK [0.16106104E10,TO_NEAREST] --> [1610610432,1610610432] --> OK [0.16106106E10,TO_NEAREST] --> [1610610560,1610610560] --> OK [0.16106107E10,TO_NEAREST] --> [1610610688,1610610688] --> OK [0.16106108E10,TO_NEAREST] --> [1610610816,1610610816] --> OK [0.1610611E10,TO_NEAREST] --> [1610610944,1610610944] --> OK [0.16106111E10,TO_NEAREST] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_NEAREST] --> [1610611200,1610611200] --> OK [0.16106113E10,TO_NEAREST] --> [1610611328,1610611328] --> OK [0.16106115E10,TO_NEAREST] --> [1610611456,1610611456] --> OK [0.16106116E10,TO_NEAREST] --> [1610611584,1610611584] --> OK [0.16106117E10,TO_NEAREST] --> [1610611712,1610611712] --> OK [0.16106118E10,TO_NEAREST] --> [1610611840,1610611840] --> OK [0.1610612E10,TO_NEAREST] --> [1610611968,1610611968] --> OK [0.16106121E10,TO_NEAREST] --> [1610612096,1610612096] --> OK [0.16106122E10,TO_NEAREST] --> [1610612224,1610612224] --> OK [0.16106124E10,TO_NEAREST] --> [1610612352,1610612352] --> OK [0.16106125E10,TO_NEAREST] --> [1610612480,1610612480] --> OK [0.16106126E10,TO_NEAREST] --> [1610612608,1610612608] --> OK [0.16106127E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106209E10,TO_NEAREST] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_NEAREST] --> [1610620800,1610620800] --> OK [0.16106207E10,TO_NEAREST] --> [1610620672,1610620672] --> OK [0.16106205E10,TO_NEAREST] --> [1610620544,1610620544] --> OK [0.16106204E10,TO_NEAREST] --> [1610620416,1610620416] --> OK [0.16106203E10,TO_NEAREST] --> [1610620288,1610620288] --> OK [0.16106202E10,TO_NEAREST] --> [1610620160,1610620160] --> OK [0.161062E10,TO_NEAREST] --> [1610620032,1610620032] --> OK [0.16106199E10,TO_NEAREST] --> [1610619904,1610619904] --> OK [0.16106198E10,TO_NEAREST] --> [1610619776,1610619776] --> OK [0.16106196E10,TO_NEAREST] --> [1610619648,1610619648] --> OK [0.16106195E10,TO_NEAREST] --> [1610619520,1610619520] --> OK [0.16106194E10,TO_NEAREST] --> [1610619392,1610619392] --> OK [0.16106193E10,TO_NEAREST] --> [1610619264,1610619264] --> OK [0.16106191E10,TO_NEAREST] --> [1610619136,1610619136] --> OK [0.1610619E10,TO_NEAREST] --> [1610619008,1610619008] --> OK [0.16106189E10,TO_NEAREST] --> [1610618880,1610618880] --> OK [0.16106188E10,TO_NEAREST] --> [1610618752,1610618752] --> OK [0.16106186E10,TO_NEAREST] --> [1610618624,1610618624] --> OK [0.16106185E10,TO_NEAREST] --> [1610618496,1610618496] --> OK [0.16106184E10,TO_NEAREST] --> [1610618368,1610618368] --> OK [0.16106182E10,TO_NEAREST] --> [1610618240,1610618240] --> OK [0.16106181E10,TO_NEAREST] --> [1610618112,1610618112] --> OK [0.1610618E10,TO_NEAREST] --> [1610617984,1610617984] --> OK [0.16106179E10,TO_NEAREST] --> [1610617856,1610617856] --> OK [0.16106177E10,TO_NEAREST] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_NEAREST] --> [1610617600,1610617600] --> OK [0.16106175E10,TO_NEAREST] --> [1610617472,1610617472] --> OK [0.16106173E10,TO_NEAREST] --> [1610617344,1610617344] --> OK [0.16106172E10,TO_NEAREST] --> [1610617216,1610617216] --> OK [0.16106171E10,TO_NEAREST] --> [1610617088,1610617088] --> OK [0.1610617E10,TO_NEAREST] --> [1610616960,1610616960] --> OK [0.16106168E10,TO_NEAREST] --> [1610616832,1610616832] --> OK [0.16106167E10,TO_NEAREST] --> [1610616704,1610616704] --> OK [0.16106166E10,TO_NEAREST] --> [1610616576,1610616576] --> OK [0.16106164E10,TO_NEAREST] --> [1610616448,1610616448] --> OK [0.16106163E10,TO_NEAREST] --> [1610616320,1610616320] --> OK [0.16106162E10,TO_NEAREST] --> [1610616192,1610616192] --> OK [0.1610616E10,TO_NEAREST] --> [1610616064,1610616064] --> OK [0.16106159E10,TO_NEAREST] --> [1610615936,1610615936] --> OK [0.16106158E10,TO_NEAREST] --> [1610615808,1610615808] --> OK [0.16106157E10,TO_NEAREST] --> [1610615680,1610615680] --> OK [0.16106156E10,TO_NEAREST] --> [1610615552,1610615552] --> OK [0.16106154E10,TO_NEAREST] --> [1610615424,1610615424] --> OK [0.16106153E10,TO_NEAREST] --> [1610615296,1610615296] --> OK [0.16106152E10,TO_NEAREST] --> [1610615168,1610615168] --> OK [0.1610615E10,TO_NEAREST] --> [1610615040,1610615040] --> OK [0.16106149E10,TO_NEAREST] --> [1610614912,1610614912] --> OK [0.16106148E10,TO_NEAREST] --> [1610614784,1610614784] --> OK [0.16106147E10,TO_NEAREST] --> [1610614656,1610614656] --> OK [0.16106145E10,TO_NEAREST] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_NEAREST] --> [1610614400,1610614400] --> OK [0.16106143E10,TO_NEAREST] --> [1610614272,1610614272] --> OK [0.16106141E10,TO_NEAREST] --> [1610614144,1610614144] --> OK [0.1610614E10,TO_NEAREST] --> [1610614016,1610614016] --> OK [0.16106139E10,TO_NEAREST] --> [1610613888,1610613888] --> OK [0.16106138E10,TO_NEAREST] --> [1610613760,1610613760] --> OK [0.16106136E10,TO_NEAREST] --> [1610613632,1610613632] --> OK [0.16106135E10,TO_NEAREST] --> [1610613504,1610613504] --> OK [0.16106134E10,TO_NEAREST] --> [1610613376,1610613376] --> OK [0.16106132E10,TO_NEAREST] --> [1610613248,1610613248] --> OK [0.16106131E10,TO_NEAREST] --> [1610613120,1610613120] --> OK [0.1610613E10,TO_NEAREST] --> [1610612992,1610612992] --> OK [0.16106129E10,TO_NEAREST] --> [1610612864,1610612864] --> OK [0.187904E10,TO_NEAREST] --> [1879040000,1879040000] --> OK [0.18790401E10,TO_NEAREST] --> [1879040128,1879040128] --> OK [0.18790403E10,TO_NEAREST] --> [1879040256,1879040256] --> OK [0.18790404E10,TO_NEAREST] --> [1879040384,1879040384] --> OK [0.18790405E10,TO_NEAREST] --> [1879040512,1879040512] --> OK [0.18790406E10,TO_NEAREST] --> [1879040640,1879040640] --> OK [0.18790408E10,TO_NEAREST] --> [1879040768,1879040768] --> OK [0.18790409E10,TO_NEAREST] --> [1879040896,1879040896] --> OK [0.1879041E10,TO_NEAREST] --> [1879041024,1879041024] --> OK [0.18790412E10,TO_NEAREST] --> [1879041152,1879041152] --> OK [0.18790413E10,TO_NEAREST] --> [1879041280,1879041280] --> OK [0.18790414E10,TO_NEAREST] --> [1879041408,1879041408] --> OK [0.18790415E10,TO_NEAREST] --> [1879041536,1879041536] --> OK [0.18790417E10,TO_NEAREST] --> [1879041664,1879041664] --> OK [0.18790418E10,TO_NEAREST] --> [1879041792,1879041792] --> OK [0.18790419E10,TO_NEAREST] --> [1879041920,1879041920] --> OK [0.1879042E10,TO_NEAREST] --> [1879042048,1879042048] --> OK [0.18790422E10,TO_NEAREST] --> [1879042176,1879042176] --> OK [0.18790423E10,TO_NEAREST] --> [1879042304,1879042304] --> OK [0.18790424E10,TO_NEAREST] --> [1879042432,1879042432] --> OK [0.18790426E10,TO_NEAREST] --> [1879042560,1879042560] --> OK [0.18790427E10,TO_NEAREST] --> [1879042688,1879042688] --> OK [0.18790428E10,TO_NEAREST] --> [1879042816,1879042816] --> OK [0.1879043E10,TO_NEAREST] --> [1879042944,1879042944] --> OK [0.18790431E10,TO_NEAREST] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_NEAREST] --> [1879043200,1879043200] --> OK [0.18790433E10,TO_NEAREST] --> [1879043328,1879043328] --> OK [0.18790435E10,TO_NEAREST] --> [1879043456,1879043456] --> OK [0.18790436E10,TO_NEAREST] --> [1879043584,1879043584] --> OK [0.18790437E10,TO_NEAREST] --> [1879043712,1879043712] --> OK [0.18790438E10,TO_NEAREST] --> [1879043840,1879043840] --> OK [0.1879044E10,TO_NEAREST] --> [1879043968,1879043968] --> OK [0.18790441E10,TO_NEAREST] --> [1879044096,1879044096] --> OK [0.18790442E10,TO_NEAREST] --> [1879044224,1879044224] --> OK [0.18790444E10,TO_NEAREST] --> [1879044352,1879044352] --> OK [0.18790445E10,TO_NEAREST] --> [1879044480,1879044480] --> OK [0.18790446E10,TO_NEAREST] --> [1879044608,1879044608] --> OK [0.18790447E10,TO_NEAREST] --> [1879044736,1879044736] --> OK [0.18790449E10,TO_NEAREST] --> [1879044864,1879044864] --> OK [0.1879045E10,TO_NEAREST] --> [1879044992,1879044992] --> OK [0.18790451E10,TO_NEAREST] --> [1879045120,1879045120] --> OK [0.18790452E10,TO_NEAREST] --> [1879045248,1879045248] --> OK [0.18790454E10,TO_NEAREST] --> [1879045376,1879045376] --> OK [0.18790455E10,TO_NEAREST] --> [1879045504,1879045504] --> OK [0.18790456E10,TO_NEAREST] --> [1879045632,1879045632] --> OK [0.18790458E10,TO_NEAREST] --> [1879045760,1879045760] --> OK [0.18790459E10,TO_NEAREST] --> [1879045888,1879045888] --> OK [0.1879046E10,TO_NEAREST] --> [1879046016,1879046016] --> OK [0.18790461E10,TO_NEAREST] --> [1879046144,1879046144] --> OK [0.18790463E10,TO_NEAREST] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_NEAREST] --> [1879046400,1879046400] --> OK [0.18790465E10,TO_NEAREST] --> [1879046528,1879046528] --> OK [0.18790467E10,TO_NEAREST] --> [1879046656,1879046656] --> OK [0.18790468E10,TO_NEAREST] --> [1879046784,1879046784] --> OK [0.18790469E10,TO_NEAREST] --> [1879046912,1879046912] --> OK [0.1879047E10,TO_NEAREST] --> [1879047040,1879047040] --> OK [0.18790472E10,TO_NEAREST] --> [1879047168,1879047168] --> OK [0.18790473E10,TO_NEAREST] --> [1879047296,1879047296] --> OK [0.18790474E10,TO_NEAREST] --> [1879047424,1879047424] --> OK [0.18790476E10,TO_NEAREST] --> [1879047552,1879047552] --> OK [0.18790477E10,TO_NEAREST] --> [1879047680,1879047680] --> OK [0.18790478E10,TO_NEAREST] --> [1879047808,1879047808] --> OK [0.1879048E10,TO_NEAREST] --> [1879047936,1879047936] --> OK [0.18790481E10,TO_NEAREST] --> [1879048064,1879048064] --> OK [0.18790482E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790564E10,TO_NEAREST] --> [1879056384,1879056384] --> OK [0.18790563E10,TO_NEAREST] --> [1879056256,1879056256] --> OK [0.18790561E10,TO_NEAREST] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_NEAREST] --> [1879056000,1879056000] --> OK [0.18790559E10,TO_NEAREST] --> [1879055872,1879055872] --> OK [0.18790557E10,TO_NEAREST] --> [1879055744,1879055744] --> OK [0.18790556E10,TO_NEAREST] --> [1879055616,1879055616] --> OK [0.18790555E10,TO_NEAREST] --> [1879055488,1879055488] --> OK [0.18790554E10,TO_NEAREST] --> [1879055360,1879055360] --> OK [0.18790552E10,TO_NEAREST] --> [1879055232,1879055232] --> OK [0.18790551E10,TO_NEAREST] --> [1879055104,1879055104] --> OK [0.1879055E10,TO_NEAREST] --> [1879054976,1879054976] --> OK [0.18790548E10,TO_NEAREST] --> [1879054848,1879054848] --> OK [0.18790547E10,TO_NEAREST] --> [1879054720,1879054720] --> OK [0.18790546E10,TO_NEAREST] --> [1879054592,1879054592] --> OK [0.18790545E10,TO_NEAREST] --> [1879054464,1879054464] --> OK [0.18790543E10,TO_NEAREST] --> [1879054336,1879054336] --> OK [0.18790542E10,TO_NEAREST] --> [1879054208,1879054208] --> OK [0.18790541E10,TO_NEAREST] --> [1879054080,1879054080] --> OK [0.1879054E10,TO_NEAREST] --> [1879053952,1879053952] --> OK [0.18790538E10,TO_NEAREST] --> [1879053824,1879053824] --> OK [0.18790537E10,TO_NEAREST] --> [1879053696,1879053696] --> OK [0.18790536E10,TO_NEAREST] --> [1879053568,1879053568] --> OK [0.18790534E10,TO_NEAREST] --> [1879053440,1879053440] --> OK [0.18790533E10,TO_NEAREST] --> [1879053312,1879053312] --> OK [0.18790532E10,TO_NEAREST] --> [1879053184,1879053184] --> OK [0.1879053E10,TO_NEAREST] --> [1879053056,1879053056] --> OK [0.18790529E10,TO_NEAREST] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_NEAREST] --> [1879052800,1879052800] --> OK [0.18790527E10,TO_NEAREST] --> [1879052672,1879052672] --> OK [0.18790525E10,TO_NEAREST] --> [1879052544,1879052544] --> OK [0.18790524E10,TO_NEAREST] --> [1879052416,1879052416] --> OK [0.18790523E10,TO_NEAREST] --> [1879052288,1879052288] --> OK [0.18790522E10,TO_NEAREST] --> [1879052160,1879052160] --> OK [0.1879052E10,TO_NEAREST] --> [1879052032,1879052032] --> OK [0.18790519E10,TO_NEAREST] --> [1879051904,1879051904] --> OK [0.18790518E10,TO_NEAREST] --> [1879051776,1879051776] --> OK [0.18790516E10,TO_NEAREST] --> [1879051648,1879051648] --> OK [0.18790515E10,TO_NEAREST] --> [1879051520,1879051520] --> OK [0.18790514E10,TO_NEAREST] --> [1879051392,1879051392] --> OK [0.18790513E10,TO_NEAREST] --> [1879051264,1879051264] --> OK [0.18790511E10,TO_NEAREST] --> [1879051136,1879051136] --> OK [0.1879051E10,TO_NEAREST] --> [1879051008,1879051008] --> OK [0.18790509E10,TO_NEAREST] --> [1879050880,1879050880] --> OK [0.18790508E10,TO_NEAREST] --> [1879050752,1879050752] --> OK [0.18790506E10,TO_NEAREST] --> [1879050624,1879050624] --> OK [0.18790505E10,TO_NEAREST] --> [1879050496,1879050496] --> OK [0.18790504E10,TO_NEAREST] --> [1879050368,1879050368] --> OK [0.18790502E10,TO_NEAREST] --> [1879050240,1879050240] --> OK [0.18790501E10,TO_NEAREST] --> [1879050112,1879050112] --> OK [0.187905E10,TO_NEAREST] --> [1879049984,1879049984] --> OK [0.18790499E10,TO_NEAREST] --> [1879049856,1879049856] --> OK [0.18790497E10,TO_NEAREST] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_NEAREST] --> [1879049600,1879049600] --> OK [0.18790495E10,TO_NEAREST] --> [1879049472,1879049472] --> OK [0.18790493E10,TO_NEAREST] --> [1879049344,1879049344] --> OK [0.18790492E10,TO_NEAREST] --> [1879049216,1879049216] --> OK [0.18790491E10,TO_NEAREST] --> [1879049088,1879049088] --> OK [0.1879049E10,TO_NEAREST] --> [1879048960,1879048960] --> OK [0.18790488E10,TO_NEAREST] --> [1879048832,1879048832] --> OK [0.18790487E10,TO_NEAREST] --> [1879048704,1879048704] --> OK [0.18790486E10,TO_NEAREST] --> [1879048576,1879048576] --> OK [0.18790484E10,TO_NEAREST] --> [1879048448,1879048448] --> OK [0.18790483E10,TO_NEAREST] --> [1879048320,1879048320] --> OK [0.20132577E10,TO_NEAREST] --> [2013257728,2013257728] --> OK [0.20132579E10,TO_NEAREST] --> [2013257856,2013257856] --> OK [0.2013258E10,TO_NEAREST] --> [2013257984,2013257984] --> OK [0.20132581E10,TO_NEAREST] --> [2013258112,2013258112] --> OK [0.20132582E10,TO_NEAREST] --> [2013258240,2013258240] --> OK [0.20132584E10,TO_NEAREST] --> [2013258368,2013258368] --> OK [0.20132585E10,TO_NEAREST] --> [2013258496,2013258496] --> OK [0.20132586E10,TO_NEAREST] --> [2013258624,2013258624] --> OK [0.20132588E10,TO_NEAREST] --> [2013258752,2013258752] --> OK [0.20132589E10,TO_NEAREST] --> [2013258880,2013258880] --> OK [0.2013259E10,TO_NEAREST] --> [2013259008,2013259008] --> OK [0.20132591E10,TO_NEAREST] --> [2013259136,2013259136] --> OK [0.20132593E10,TO_NEAREST] --> [2013259264,2013259264] --> OK [0.20132594E10,TO_NEAREST] --> [2013259392,2013259392] --> OK [0.20132595E10,TO_NEAREST] --> [2013259520,2013259520] --> OK [0.20132596E10,TO_NEAREST] --> [2013259648,2013259648] --> OK [0.20132598E10,TO_NEAREST] --> [2013259776,2013259776] --> OK [0.20132599E10,TO_NEAREST] --> [2013259904,2013259904] --> OK [0.201326E10,TO_NEAREST] --> [2013260032,2013260032] --> OK [0.20132602E10,TO_NEAREST] --> [2013260160,2013260160] --> OK [0.20132603E10,TO_NEAREST] --> [2013260288,2013260288] --> OK [0.20132604E10,TO_NEAREST] --> [2013260416,2013260416] --> OK [0.20132605E10,TO_NEAREST] --> [2013260544,2013260544] --> OK [0.20132607E10,TO_NEAREST] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_NEAREST] --> [2013260800,2013260800] --> OK [0.20132609E10,TO_NEAREST] --> [2013260928,2013260928] --> OK [0.2013261E10,TO_NEAREST] --> [2013261056,2013261056] --> OK [0.20132612E10,TO_NEAREST] --> [2013261184,2013261184] --> OK [0.20132613E10,TO_NEAREST] --> [2013261312,2013261312] --> OK [0.20132614E10,TO_NEAREST] --> [2013261440,2013261440] --> OK [0.20132616E10,TO_NEAREST] --> [2013261568,2013261568] --> OK [0.20132617E10,TO_NEAREST] --> [2013261696,2013261696] --> OK [0.20132618E10,TO_NEAREST] --> [2013261824,2013261824] --> OK [0.2013262E10,TO_NEAREST] --> [2013261952,2013261952] --> OK [0.20132621E10,TO_NEAREST] --> [2013262080,2013262080] --> OK [0.20132622E10,TO_NEAREST] --> [2013262208,2013262208] --> OK [0.20132623E10,TO_NEAREST] --> [2013262336,2013262336] --> OK [0.20132625E10,TO_NEAREST] --> [2013262464,2013262464] --> OK [0.20132626E10,TO_NEAREST] --> [2013262592,2013262592] --> OK [0.20132627E10,TO_NEAREST] --> [2013262720,2013262720] --> OK [0.20132628E10,TO_NEAREST] --> [2013262848,2013262848] --> OK [0.2013263E10,TO_NEAREST] --> [2013262976,2013262976] --> OK [0.20132631E10,TO_NEAREST] --> [2013263104,2013263104] --> OK [0.20132632E10,TO_NEAREST] --> [2013263232,2013263232] --> OK [0.20132634E10,TO_NEAREST] --> [2013263360,2013263360] --> OK [0.20132635E10,TO_NEAREST] --> [2013263488,2013263488] --> OK [0.20132636E10,TO_NEAREST] --> [2013263616,2013263616] --> OK [0.20132637E10,TO_NEAREST] --> [2013263744,2013263744] --> OK [0.20132639E10,TO_NEAREST] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_NEAREST] --> [2013264000,2013264000] --> OK [0.20132641E10,TO_NEAREST] --> [2013264128,2013264128] --> OK [0.20132643E10,TO_NEAREST] --> [2013264256,2013264256] --> OK [0.20132644E10,TO_NEAREST] --> [2013264384,2013264384] --> OK [0.20132645E10,TO_NEAREST] --> [2013264512,2013264512] --> OK [0.20132646E10,TO_NEAREST] --> [2013264640,2013264640] --> OK [0.20132648E10,TO_NEAREST] --> [2013264768,2013264768] --> OK [0.20132649E10,TO_NEAREST] --> [2013264896,2013264896] --> OK [0.2013265E10,TO_NEAREST] --> [2013265024,2013265024] --> OK [0.20132652E10,TO_NEAREST] --> [2013265152,2013265152] --> OK [0.20132653E10,TO_NEAREST] --> [2013265280,2013265280] --> OK [0.20132654E10,TO_NEAREST] --> [2013265408,2013265408] --> OK [0.20132655E10,TO_NEAREST] --> [2013265536,2013265536] --> OK [0.20132657E10,TO_NEAREST] --> [2013265664,2013265664] --> OK [0.20132658E10,TO_NEAREST] --> [2013265792,2013265792] --> OK [0.20132659E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132741E10,TO_NEAREST] --> [2013274112,2013274112] --> OK [0.2013274E10,TO_NEAREST] --> [2013273984,2013273984] --> OK [0.20132739E10,TO_NEAREST] --> [2013273856,2013273856] --> OK [0.20132737E10,TO_NEAREST] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_NEAREST] --> [2013273600,2013273600] --> OK [0.20132735E10,TO_NEAREST] --> [2013273472,2013273472] --> OK [0.20132733E10,TO_NEAREST] --> [2013273344,2013273344] --> OK [0.20132732E10,TO_NEAREST] --> [2013273216,2013273216] --> OK [0.20132731E10,TO_NEAREST] --> [2013273088,2013273088] --> OK [0.2013273E10,TO_NEAREST] --> [2013272960,2013272960] --> OK [0.20132728E10,TO_NEAREST] --> [2013272832,2013272832] --> OK [0.20132727E10,TO_NEAREST] --> [2013272704,2013272704] --> OK [0.20132726E10,TO_NEAREST] --> [2013272576,2013272576] --> OK [0.20132724E10,TO_NEAREST] --> [2013272448,2013272448] --> OK [0.20132723E10,TO_NEAREST] --> [2013272320,2013272320] --> OK [0.20132722E10,TO_NEAREST] --> [2013272192,2013272192] --> OK [0.2013272E10,TO_NEAREST] --> [2013272064,2013272064] --> OK [0.20132719E10,TO_NEAREST] --> [2013271936,2013271936] --> OK [0.20132718E10,TO_NEAREST] --> [2013271808,2013271808] --> OK [0.20132717E10,TO_NEAREST] --> [2013271680,2013271680] --> OK [0.20132716E10,TO_NEAREST] --> [2013271552,2013271552] --> OK [0.20132714E10,TO_NEAREST] --> [2013271424,2013271424] --> OK [0.20132713E10,TO_NEAREST] --> [2013271296,2013271296] --> OK [0.20132712E10,TO_NEAREST] --> [2013271168,2013271168] --> OK [0.2013271E10,TO_NEAREST] --> [2013271040,2013271040] --> OK [0.20132709E10,TO_NEAREST] --> [2013270912,2013270912] --> OK [0.20132708E10,TO_NEAREST] --> [2013270784,2013270784] --> OK [0.20132707E10,TO_NEAREST] --> [2013270656,2013270656] --> OK [0.20132705E10,TO_NEAREST] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_NEAREST] --> [2013270400,2013270400] --> OK [0.20132703E10,TO_NEAREST] --> [2013270272,2013270272] --> OK [0.20132701E10,TO_NEAREST] --> [2013270144,2013270144] --> OK [0.201327E10,TO_NEAREST] --> [2013270016,2013270016] --> OK [0.20132699E10,TO_NEAREST] --> [2013269888,2013269888] --> OK [0.20132698E10,TO_NEAREST] --> [2013269760,2013269760] --> OK [0.20132696E10,TO_NEAREST] --> [2013269632,2013269632] --> OK [0.20132695E10,TO_NEAREST] --> [2013269504,2013269504] --> OK [0.20132694E10,TO_NEAREST] --> [2013269376,2013269376] --> OK [0.20132692E10,TO_NEAREST] --> [2013269248,2013269248] --> OK [0.20132691E10,TO_NEAREST] --> [2013269120,2013269120] --> OK [0.2013269E10,TO_NEAREST] --> [2013268992,2013268992] --> OK [0.20132689E10,TO_NEAREST] --> [2013268864,2013268864] --> OK [0.20132687E10,TO_NEAREST] --> [2013268736,2013268736] --> OK [0.20132686E10,TO_NEAREST] --> [2013268608,2013268608] --> OK [0.20132685E10,TO_NEAREST] --> [2013268480,2013268480] --> OK [0.20132684E10,TO_NEAREST] --> [2013268352,2013268352] --> OK [0.20132682E10,TO_NEAREST] --> [2013268224,2013268224] --> OK [0.20132681E10,TO_NEAREST] --> [2013268096,2013268096] --> OK [0.2013268E10,TO_NEAREST] --> [2013267968,2013267968] --> OK [0.20132678E10,TO_NEAREST] --> [2013267840,2013267840] --> OK [0.20132677E10,TO_NEAREST] --> [2013267712,2013267712] --> OK [0.20132676E10,TO_NEAREST] --> [2013267584,2013267584] --> OK [0.20132675E10,TO_NEAREST] --> [2013267456,2013267456] --> OK [0.20132673E10,TO_NEAREST] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_NEAREST] --> [2013267200,2013267200] --> OK [0.20132671E10,TO_NEAREST] --> [2013267072,2013267072] --> OK [0.2013267E10,TO_NEAREST] --> [2013266944,2013266944] --> OK [0.20132668E10,TO_NEAREST] --> [2013266816,2013266816] --> OK [0.20132667E10,TO_NEAREST] --> [2013266688,2013266688] --> OK [0.20132666E10,TO_NEAREST] --> [2013266560,2013266560] --> OK [0.20132664E10,TO_NEAREST] --> [2013266432,2013266432] --> OK [0.20132663E10,TO_NEAREST] --> [2013266304,2013266304] --> OK [0.20132662E10,TO_NEAREST] --> [2013266176,2013266176] --> OK [0.2013266E10,TO_NEAREST] --> [2013266048,2013266048] --> OK [0.20803666E10,TO_NEAREST] --> [2080366592,2080366592] --> OK [0.20803667E10,TO_NEAREST] --> [2080366720,2080366720] --> OK [0.20803668E10,TO_NEAREST] --> [2080366848,2080366848] --> OK [0.2080367E10,TO_NEAREST] --> [2080366976,2080366976] --> OK [0.20803671E10,TO_NEAREST] --> [2080367104,2080367104] --> OK [0.20803672E10,TO_NEAREST] --> [2080367232,2080367232] --> OK [0.20803674E10,TO_NEAREST] --> [2080367360,2080367360] --> OK [0.20803675E10,TO_NEAREST] --> [2080367488,2080367488] --> OK [0.20803676E10,TO_NEAREST] --> [2080367616,2080367616] --> OK [0.20803677E10,TO_NEAREST] --> [2080367744,2080367744] --> OK [0.20803679E10,TO_NEAREST] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_NEAREST] --> [2080368000,2080368000] --> OK [0.20803681E10,TO_NEAREST] --> [2080368128,2080368128] --> OK [0.20803683E10,TO_NEAREST] --> [2080368256,2080368256] --> OK [0.20803684E10,TO_NEAREST] --> [2080368384,2080368384] --> OK [0.20803685E10,TO_NEAREST] --> [2080368512,2080368512] --> OK [0.20803686E10,TO_NEAREST] --> [2080368640,2080368640] --> OK [0.20803688E10,TO_NEAREST] --> [2080368768,2080368768] --> OK [0.20803689E10,TO_NEAREST] --> [2080368896,2080368896] --> OK [0.2080369E10,TO_NEAREST] --> [2080369024,2080369024] --> OK [0.20803692E10,TO_NEAREST] --> [2080369152,2080369152] --> OK [0.20803693E10,TO_NEAREST] --> [2080369280,2080369280] --> OK [0.20803694E10,TO_NEAREST] --> [2080369408,2080369408] --> OK [0.20803695E10,TO_NEAREST] --> [2080369536,2080369536] --> OK [0.20803697E10,TO_NEAREST] --> [2080369664,2080369664] --> OK [0.20803698E10,TO_NEAREST] --> [2080369792,2080369792] --> OK [0.20803699E10,TO_NEAREST] --> [2080369920,2080369920] --> OK [0.208037E10,TO_NEAREST] --> [2080370048,2080370048] --> OK [0.20803702E10,TO_NEAREST] --> [2080370176,2080370176] --> OK [0.20803703E10,TO_NEAREST] --> [2080370304,2080370304] --> OK [0.20803704E10,TO_NEAREST] --> [2080370432,2080370432] --> OK [0.20803706E10,TO_NEAREST] --> [2080370560,2080370560] --> OK [0.20803707E10,TO_NEAREST] --> [2080370688,2080370688] --> OK [0.20803708E10,TO_NEAREST] --> [2080370816,2080370816] --> OK [0.2080371E10,TO_NEAREST] --> [2080370944,2080370944] --> OK [0.20803711E10,TO_NEAREST] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_NEAREST] --> [2080371200,2080371200] --> OK [0.20803713E10,TO_NEAREST] --> [2080371328,2080371328] --> OK [0.20803715E10,TO_NEAREST] --> [2080371456,2080371456] --> OK [0.20803716E10,TO_NEAREST] --> [2080371584,2080371584] --> OK [0.20803717E10,TO_NEAREST] --> [2080371712,2080371712] --> OK [0.20803718E10,TO_NEAREST] --> [2080371840,2080371840] --> OK [0.2080372E10,TO_NEAREST] --> [2080371968,2080371968] --> OK [0.20803721E10,TO_NEAREST] --> [2080372096,2080372096] --> OK [0.20803722E10,TO_NEAREST] --> [2080372224,2080372224] --> OK [0.20803724E10,TO_NEAREST] --> [2080372352,2080372352] --> OK [0.20803725E10,TO_NEAREST] --> [2080372480,2080372480] --> OK [0.20803726E10,TO_NEAREST] --> [2080372608,2080372608] --> OK [0.20803727E10,TO_NEAREST] --> [2080372736,2080372736] --> OK [0.20803729E10,TO_NEAREST] --> [2080372864,2080372864] --> OK [0.2080373E10,TO_NEAREST] --> [2080372992,2080372992] --> OK [0.20803731E10,TO_NEAREST] --> [2080373120,2080373120] --> OK [0.20803732E10,TO_NEAREST] --> [2080373248,2080373248] --> OK [0.20803734E10,TO_NEAREST] --> [2080373376,2080373376] --> OK [0.20803735E10,TO_NEAREST] --> [2080373504,2080373504] --> OK [0.20803736E10,TO_NEAREST] --> [2080373632,2080373632] --> OK [0.20803738E10,TO_NEAREST] --> [2080373760,2080373760] --> OK [0.20803739E10,TO_NEAREST] --> [2080373888,2080373888] --> OK [0.2080374E10,TO_NEAREST] --> [2080374016,2080374016] --> OK [0.20803741E10,TO_NEAREST] --> [2080374144,2080374144] --> OK [0.20803743E10,TO_NEAREST] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_NEAREST] --> [2080374400,2080374400] --> OK [0.20803745E10,TO_NEAREST] --> [2080374528,2080374528] --> OK [0.20803747E10,TO_NEAREST] --> [2080374656,2080374656] --> OK [0.20803748E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080383E10,TO_NEAREST] --> [2080382976,2080382976] --> OK [0.20803828E10,TO_NEAREST] --> [2080382848,2080382848] --> OK [0.20803827E10,TO_NEAREST] --> [2080382720,2080382720] --> OK [0.20803826E10,TO_NEAREST] --> [2080382592,2080382592] --> OK [0.20803825E10,TO_NEAREST] --> [2080382464,2080382464] --> OK [0.20803823E10,TO_NEAREST] --> [2080382336,2080382336] --> OK [0.20803822E10,TO_NEAREST] --> [2080382208,2080382208] --> OK [0.20803821E10,TO_NEAREST] --> [2080382080,2080382080] --> OK [0.2080382E10,TO_NEAREST] --> [2080381952,2080381952] --> OK [0.20803818E10,TO_NEAREST] --> [2080381824,2080381824] --> OK [0.20803817E10,TO_NEAREST] --> [2080381696,2080381696] --> OK [0.20803816E10,TO_NEAREST] --> [2080381568,2080381568] --> OK [0.20803814E10,TO_NEAREST] --> [2080381440,2080381440] --> OK [0.20803813E10,TO_NEAREST] --> [2080381312,2080381312] --> OK [0.20803812E10,TO_NEAREST] --> [2080381184,2080381184] --> OK [0.2080381E10,TO_NEAREST] --> [2080381056,2080381056] --> OK [0.20803809E10,TO_NEAREST] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_NEAREST] --> [2080380800,2080380800] --> OK [0.20803807E10,TO_NEAREST] --> [2080380672,2080380672] --> OK [0.20803805E10,TO_NEAREST] --> [2080380544,2080380544] --> OK [0.20803804E10,TO_NEAREST] --> [2080380416,2080380416] --> OK [0.20803803E10,TO_NEAREST] --> [2080380288,2080380288] --> OK [0.20803802E10,TO_NEAREST] --> [2080380160,2080380160] --> OK [0.208038E10,TO_NEAREST] --> [2080380032,2080380032] --> OK [0.20803799E10,TO_NEAREST] --> [2080379904,2080379904] --> OK [0.20803798E10,TO_NEAREST] --> [2080379776,2080379776] --> OK [0.20803796E10,TO_NEAREST] --> [2080379648,2080379648] --> OK [0.20803795E10,TO_NEAREST] --> [2080379520,2080379520] --> OK [0.20803794E10,TO_NEAREST] --> [2080379392,2080379392] --> OK [0.20803793E10,TO_NEAREST] --> [2080379264,2080379264] --> OK [0.20803791E10,TO_NEAREST] --> [2080379136,2080379136] --> OK [0.2080379E10,TO_NEAREST] --> [2080379008,2080379008] --> OK [0.20803789E10,TO_NEAREST] --> [2080378880,2080378880] --> OK [0.20803788E10,TO_NEAREST] --> [2080378752,2080378752] --> OK [0.20803786E10,TO_NEAREST] --> [2080378624,2080378624] --> OK [0.20803785E10,TO_NEAREST] --> [2080378496,2080378496] --> OK [0.20803784E10,TO_NEAREST] --> [2080378368,2080378368] --> OK [0.20803782E10,TO_NEAREST] --> [2080378240,2080378240] --> OK [0.20803781E10,TO_NEAREST] --> [2080378112,2080378112] --> OK [0.2080378E10,TO_NEAREST] --> [2080377984,2080377984] --> OK [0.20803779E10,TO_NEAREST] --> [2080377856,2080377856] --> OK [0.20803777E10,TO_NEAREST] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_NEAREST] --> [2080377600,2080377600] --> OK [0.20803775E10,TO_NEAREST] --> [2080377472,2080377472] --> OK [0.20803773E10,TO_NEAREST] --> [2080377344,2080377344] --> OK [0.20803772E10,TO_NEAREST] --> [2080377216,2080377216] --> OK [0.20803771E10,TO_NEAREST] --> [2080377088,2080377088] --> OK [0.2080377E10,TO_NEAREST] --> [2080376960,2080376960] --> OK [0.20803768E10,TO_NEAREST] --> [2080376832,2080376832] --> OK [0.20803767E10,TO_NEAREST] --> [2080376704,2080376704] --> OK [0.20803766E10,TO_NEAREST] --> [2080376576,2080376576] --> OK [0.20803764E10,TO_NEAREST] --> [2080376448,2080376448] --> OK [0.20803763E10,TO_NEAREST] --> [2080376320,2080376320] --> OK [0.20803762E10,TO_NEAREST] --> [2080376192,2080376192] --> OK [0.2080376E10,TO_NEAREST] --> [2080376064,2080376064] --> OK [0.20803759E10,TO_NEAREST] --> [2080375936,2080375936] --> OK [0.20803758E10,TO_NEAREST] --> [2080375808,2080375808] --> OK [0.20803757E10,TO_NEAREST] --> [2080375680,2080375680] --> OK [0.20803756E10,TO_NEAREST] --> [2080375552,2080375552] --> OK [0.20803754E10,TO_NEAREST] --> [2080375424,2080375424] --> OK [0.20803753E10,TO_NEAREST] --> [2080375296,2080375296] --> OK [0.20803752E10,TO_NEAREST] --> [2080375168,2080375168] --> OK [0.2080375E10,TO_NEAREST] --> [2080375040,2080375040] --> OK [0.20803749E10,TO_NEAREST] --> [2080374912,2080374912] --> OK [0.2113921E10,TO_NEAREST] --> [2113921024,2113921024] --> OK [0.21139212E10,TO_NEAREST] --> [2113921152,2113921152] --> OK [0.21139213E10,TO_NEAREST] --> [2113921280,2113921280] --> OK [0.21139214E10,TO_NEAREST] --> [2113921408,2113921408] --> OK [0.21139215E10,TO_NEAREST] --> [2113921536,2113921536] --> OK [0.21139217E10,TO_NEAREST] --> [2113921664,2113921664] --> OK [0.21139218E10,TO_NEAREST] --> [2113921792,2113921792] --> OK [0.21139219E10,TO_NEAREST] --> [2113921920,2113921920] --> OK [0.2113922E10,TO_NEAREST] --> [2113922048,2113922048] --> OK [0.21139222E10,TO_NEAREST] --> [2113922176,2113922176] --> OK [0.21139223E10,TO_NEAREST] --> [2113922304,2113922304] --> OK [0.21139224E10,TO_NEAREST] --> [2113922432,2113922432] --> OK [0.21139226E10,TO_NEAREST] --> [2113922560,2113922560] --> OK [0.21139227E10,TO_NEAREST] --> [2113922688,2113922688] --> OK [0.21139228E10,TO_NEAREST] --> [2113922816,2113922816] --> OK [0.2113923E10,TO_NEAREST] --> [2113922944,2113922944] --> OK [0.21139231E10,TO_NEAREST] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_NEAREST] --> [2113923200,2113923200] --> OK [0.21139233E10,TO_NEAREST] --> [2113923328,2113923328] --> OK [0.21139235E10,TO_NEAREST] --> [2113923456,2113923456] --> OK [0.21139236E10,TO_NEAREST] --> [2113923584,2113923584] --> OK [0.21139237E10,TO_NEAREST] --> [2113923712,2113923712] --> OK [0.21139238E10,TO_NEAREST] --> [2113923840,2113923840] --> OK [0.2113924E10,TO_NEAREST] --> [2113923968,2113923968] --> OK [0.21139241E10,TO_NEAREST] --> [2113924096,2113924096] --> OK [0.21139242E10,TO_NEAREST] --> [2113924224,2113924224] --> OK [0.21139244E10,TO_NEAREST] --> [2113924352,2113924352] --> OK [0.21139245E10,TO_NEAREST] --> [2113924480,2113924480] --> OK [0.21139246E10,TO_NEAREST] --> [2113924608,2113924608] --> OK [0.21139247E10,TO_NEAREST] --> [2113924736,2113924736] --> OK [0.21139249E10,TO_NEAREST] --> [2113924864,2113924864] --> OK [0.2113925E10,TO_NEAREST] --> [2113924992,2113924992] --> OK [0.21139251E10,TO_NEAREST] --> [2113925120,2113925120] --> OK [0.21139252E10,TO_NEAREST] --> [2113925248,2113925248] --> OK [0.21139254E10,TO_NEAREST] --> [2113925376,2113925376] --> OK [0.21139255E10,TO_NEAREST] --> [2113925504,2113925504] --> OK [0.21139256E10,TO_NEAREST] --> [2113925632,2113925632] --> OK [0.21139258E10,TO_NEAREST] --> [2113925760,2113925760] --> OK [0.21139259E10,TO_NEAREST] --> [2113925888,2113925888] --> OK [0.2113926E10,TO_NEAREST] --> [2113926016,2113926016] --> OK [0.21139261E10,TO_NEAREST] --> [2113926144,2113926144] --> OK [0.21139263E10,TO_NEAREST] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_NEAREST] --> [2113926400,2113926400] --> OK [0.21139265E10,TO_NEAREST] --> [2113926528,2113926528] --> OK [0.21139267E10,TO_NEAREST] --> [2113926656,2113926656] --> OK [0.21139268E10,TO_NEAREST] --> [2113926784,2113926784] --> OK [0.21139269E10,TO_NEAREST] --> [2113926912,2113926912] --> OK [0.2113927E10,TO_NEAREST] --> [2113927040,2113927040] --> OK [0.21139272E10,TO_NEAREST] --> [2113927168,2113927168] --> OK [0.21139273E10,TO_NEAREST] --> [2113927296,2113927296] --> OK [0.21139274E10,TO_NEAREST] --> [2113927424,2113927424] --> OK [0.21139276E10,TO_NEAREST] --> [2113927552,2113927552] --> OK [0.21139277E10,TO_NEAREST] --> [2113927680,2113927680] --> OK [0.21139278E10,TO_NEAREST] --> [2113927808,2113927808] --> OK [0.2113928E10,TO_NEAREST] --> [2113927936,2113927936] --> OK [0.21139281E10,TO_NEAREST] --> [2113928064,2113928064] --> OK [0.21139282E10,TO_NEAREST] --> [2113928192,2113928192] --> OK [0.21139283E10,TO_NEAREST] --> [2113928320,2113928320] --> OK [0.21139284E10,TO_NEAREST] --> [2113928448,2113928448] --> OK [0.21139286E10,TO_NEAREST] --> [2113928576,2113928576] --> OK [0.21139287E10,TO_NEAREST] --> [2113928704,2113928704] --> OK [0.21139288E10,TO_NEAREST] --> [2113928832,2113928832] --> OK [0.2113929E10,TO_NEAREST] --> [2113928960,2113928960] --> OK [0.21139291E10,TO_NEAREST] --> [2113929088,2113929088] --> OK [0.21139292E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139374E10,TO_NEAREST] --> [2113937408,2113937408] --> OK [0.21139373E10,TO_NEAREST] --> [2113937280,2113937280] --> OK [0.21139372E10,TO_NEAREST] --> [2113937152,2113937152] --> OK [0.2113937E10,TO_NEAREST] --> [2113937024,2113937024] --> OK [0.21139369E10,TO_NEAREST] --> [2113936896,2113936896] --> OK [0.21139368E10,TO_NEAREST] --> [2113936768,2113936768] --> OK [0.21139366E10,TO_NEAREST] --> [2113936640,2113936640] --> OK [0.21139365E10,TO_NEAREST] --> [2113936512,2113936512] --> OK [0.21139364E10,TO_NEAREST] --> [2113936384,2113936384] --> OK [0.21139363E10,TO_NEAREST] --> [2113936256,2113936256] --> OK [0.21139361E10,TO_NEAREST] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_NEAREST] --> [2113936000,2113936000] --> OK [0.21139359E10,TO_NEAREST] --> [2113935872,2113935872] --> OK [0.21139357E10,TO_NEAREST] --> [2113935744,2113935744] --> OK [0.21139356E10,TO_NEAREST] --> [2113935616,2113935616] --> OK [0.21139355E10,TO_NEAREST] --> [2113935488,2113935488] --> OK [0.21139354E10,TO_NEAREST] --> [2113935360,2113935360] --> OK [0.21139352E10,TO_NEAREST] --> [2113935232,2113935232] --> OK [0.21139351E10,TO_NEAREST] --> [2113935104,2113935104] --> OK [0.2113935E10,TO_NEAREST] --> [2113934976,2113934976] --> OK [0.21139348E10,TO_NEAREST] --> [2113934848,2113934848] --> OK [0.21139347E10,TO_NEAREST] --> [2113934720,2113934720] --> OK [0.21139346E10,TO_NEAREST] --> [2113934592,2113934592] --> OK [0.21139345E10,TO_NEAREST] --> [2113934464,2113934464] --> OK [0.21139343E10,TO_NEAREST] --> [2113934336,2113934336] --> OK [0.21139342E10,TO_NEAREST] --> [2113934208,2113934208] --> OK [0.21139341E10,TO_NEAREST] --> [2113934080,2113934080] --> OK [0.2113934E10,TO_NEAREST] --> [2113933952,2113933952] --> OK [0.21139338E10,TO_NEAREST] --> [2113933824,2113933824] --> OK [0.21139337E10,TO_NEAREST] --> [2113933696,2113933696] --> OK [0.21139336E10,TO_NEAREST] --> [2113933568,2113933568] --> OK [0.21139334E10,TO_NEAREST] --> [2113933440,2113933440] --> OK [0.21139333E10,TO_NEAREST] --> [2113933312,2113933312] --> OK [0.21139332E10,TO_NEAREST] --> [2113933184,2113933184] --> OK [0.2113933E10,TO_NEAREST] --> [2113933056,2113933056] --> OK [0.21139329E10,TO_NEAREST] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_NEAREST] --> [2113932800,2113932800] --> OK [0.21139327E10,TO_NEAREST] --> [2113932672,2113932672] --> OK [0.21139325E10,TO_NEAREST] --> [2113932544,2113932544] --> OK [0.21139324E10,TO_NEAREST] --> [2113932416,2113932416] --> OK [0.21139323E10,TO_NEAREST] --> [2113932288,2113932288] --> OK [0.21139322E10,TO_NEAREST] --> [2113932160,2113932160] --> OK [0.2113932E10,TO_NEAREST] --> [2113932032,2113932032] --> OK [0.21139319E10,TO_NEAREST] --> [2113931904,2113931904] --> OK [0.21139318E10,TO_NEAREST] --> [2113931776,2113931776] --> OK [0.21139316E10,TO_NEAREST] --> [2113931648,2113931648] --> OK [0.21139315E10,TO_NEAREST] --> [2113931520,2113931520] --> OK [0.21139314E10,TO_NEAREST] --> [2113931392,2113931392] --> OK [0.21139313E10,TO_NEAREST] --> [2113931264,2113931264] --> OK [0.21139311E10,TO_NEAREST] --> [2113931136,2113931136] --> OK [0.2113931E10,TO_NEAREST] --> [2113931008,2113931008] --> OK [0.21139309E10,TO_NEAREST] --> [2113930880,2113930880] --> OK [0.21139308E10,TO_NEAREST] --> [2113930752,2113930752] --> OK [0.21139306E10,TO_NEAREST] --> [2113930624,2113930624] --> OK [0.21139305E10,TO_NEAREST] --> [2113930496,2113930496] --> OK [0.21139304E10,TO_NEAREST] --> [2113930368,2113930368] --> OK [0.21139302E10,TO_NEAREST] --> [2113930240,2113930240] --> OK [0.21139301E10,TO_NEAREST] --> [2113930112,2113930112] --> OK [0.211393E10,TO_NEAREST] --> [2113929984,2113929984] --> OK [0.21139299E10,TO_NEAREST] --> [2113929856,2113929856] --> OK [0.21139297E10,TO_NEAREST] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_NEAREST] --> [2113929600,2113929600] --> OK [0.21139295E10,TO_NEAREST] --> [2113929472,2113929472] --> OK [0.21139293E10,TO_NEAREST] --> [2113929344,2113929344] --> OK [0.21474755E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [~0.21475E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.21139374E10,TO_NEGINF] --> [~2113937408,~2113937408] --> OK [~0.21139373E10,TO_NEGINF] --> [~2113937280,~2113937280] --> OK [~0.21139372E10,TO_NEGINF] --> [~2113937152,~2113937152] --> OK [~0.2113937E10,TO_NEGINF] --> [~2113937024,~2113937024] --> OK [~0.21139369E10,TO_NEGINF] --> [~2113936896,~2113936896] --> OK [~0.21139368E10,TO_NEGINF] --> [~2113936768,~2113936768] --> OK [~0.21139366E10,TO_NEGINF] --> [~2113936640,~2113936640] --> OK [~0.21139365E10,TO_NEGINF] --> [~2113936512,~2113936512] --> OK [~0.21139364E10,TO_NEGINF] --> [~2113936384,~2113936384] --> OK [~0.21139363E10,TO_NEGINF] --> [~2113936256,~2113936256] --> OK [~0.21139361E10,TO_NEGINF] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_NEGINF] --> [~2113936000,~2113936000] --> OK [~0.21139359E10,TO_NEGINF] --> [~2113935872,~2113935872] --> OK [~0.21139357E10,TO_NEGINF] --> [~2113935744,~2113935744] --> OK [~0.21139356E10,TO_NEGINF] --> [~2113935616,~2113935616] --> OK [~0.21139355E10,TO_NEGINF] --> [~2113935488,~2113935488] --> OK [~0.21139354E10,TO_NEGINF] --> [~2113935360,~2113935360] --> OK [~0.21139352E10,TO_NEGINF] --> [~2113935232,~2113935232] --> OK [~0.21139351E10,TO_NEGINF] --> [~2113935104,~2113935104] --> OK [~0.2113935E10,TO_NEGINF] --> [~2113934976,~2113934976] --> OK [~0.21139348E10,TO_NEGINF] --> [~2113934848,~2113934848] --> OK [~0.21139347E10,TO_NEGINF] --> [~2113934720,~2113934720] --> OK [~0.21139346E10,TO_NEGINF] --> [~2113934592,~2113934592] --> OK [~0.21139345E10,TO_NEGINF] --> [~2113934464,~2113934464] --> OK [~0.21139343E10,TO_NEGINF] --> [~2113934336,~2113934336] --> OK [~0.21139342E10,TO_NEGINF] --> [~2113934208,~2113934208] --> OK [~0.21139341E10,TO_NEGINF] --> [~2113934080,~2113934080] --> OK [~0.2113934E10,TO_NEGINF] --> [~2113933952,~2113933952] --> OK [~0.21139338E10,TO_NEGINF] --> [~2113933824,~2113933824] --> OK [~0.21139337E10,TO_NEGINF] --> [~2113933696,~2113933696] --> OK [~0.21139336E10,TO_NEGINF] --> [~2113933568,~2113933568] --> OK [~0.21139334E10,TO_NEGINF] --> [~2113933440,~2113933440] --> OK [~0.21139333E10,TO_NEGINF] --> [~2113933312,~2113933312] --> OK [~0.21139332E10,TO_NEGINF] --> [~2113933184,~2113933184] --> OK [~0.2113933E10,TO_NEGINF] --> [~2113933056,~2113933056] --> OK [~0.21139329E10,TO_NEGINF] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_NEGINF] --> [~2113932800,~2113932800] --> OK [~0.21139327E10,TO_NEGINF] --> [~2113932672,~2113932672] --> OK [~0.21139325E10,TO_NEGINF] --> [~2113932544,~2113932544] --> OK [~0.21139324E10,TO_NEGINF] --> [~2113932416,~2113932416] --> OK [~0.21139323E10,TO_NEGINF] --> [~2113932288,~2113932288] --> OK [~0.21139322E10,TO_NEGINF] --> [~2113932160,~2113932160] --> OK [~0.2113932E10,TO_NEGINF] --> [~2113932032,~2113932032] --> OK [~0.21139319E10,TO_NEGINF] --> [~2113931904,~2113931904] --> OK [~0.21139318E10,TO_NEGINF] --> [~2113931776,~2113931776] --> OK [~0.21139316E10,TO_NEGINF] --> [~2113931648,~2113931648] --> OK [~0.21139315E10,TO_NEGINF] --> [~2113931520,~2113931520] --> OK [~0.21139314E10,TO_NEGINF] --> [~2113931392,~2113931392] --> OK [~0.21139313E10,TO_NEGINF] --> [~2113931264,~2113931264] --> OK [~0.21139311E10,TO_NEGINF] --> [~2113931136,~2113931136] --> OK [~0.2113931E10,TO_NEGINF] --> [~2113931008,~2113931008] --> OK [~0.21139309E10,TO_NEGINF] --> [~2113930880,~2113930880] --> OK [~0.21139308E10,TO_NEGINF] --> [~2113930752,~2113930752] --> OK [~0.21139306E10,TO_NEGINF] --> [~2113930624,~2113930624] --> OK [~0.21139305E10,TO_NEGINF] --> [~2113930496,~2113930496] --> OK [~0.21139304E10,TO_NEGINF] --> [~2113930368,~2113930368] --> OK [~0.21139302E10,TO_NEGINF] --> [~2113930240,~2113930240] --> OK [~0.21139301E10,TO_NEGINF] --> [~2113930112,~2113930112] --> OK [~0.211393E10,TO_NEGINF] --> [~2113929984,~2113929984] --> OK [~0.21139299E10,TO_NEGINF] --> [~2113929856,~2113929856] --> OK [~0.21139297E10,TO_NEGINF] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_NEGINF] --> [~2113929600,~2113929600] --> OK [~0.21139295E10,TO_NEGINF] --> [~2113929472,~2113929472] --> OK [~0.21139293E10,TO_NEGINF] --> [~2113929344,~2113929344] --> OK [~0.21139292E10,TO_NEGINF] --> [~2113929216,~2113929216] --> OK [~0.2113921E10,TO_NEGINF] --> [~2113921024,~2113921024] --> OK [~0.21139212E10,TO_NEGINF] --> [~2113921152,~2113921152] --> OK [~0.21139213E10,TO_NEGINF] --> [~2113921280,~2113921280] --> OK [~0.21139214E10,TO_NEGINF] --> [~2113921408,~2113921408] --> OK [~0.21139215E10,TO_NEGINF] --> [~2113921536,~2113921536] --> OK [~0.21139217E10,TO_NEGINF] --> [~2113921664,~2113921664] --> OK [~0.21139218E10,TO_NEGINF] --> [~2113921792,~2113921792] --> OK [~0.21139219E10,TO_NEGINF] --> [~2113921920,~2113921920] --> OK [~0.2113922E10,TO_NEGINF] --> [~2113922048,~2113922048] --> OK [~0.21139222E10,TO_NEGINF] --> [~2113922176,~2113922176] --> OK [~0.21139223E10,TO_NEGINF] --> [~2113922304,~2113922304] --> OK [~0.21139224E10,TO_NEGINF] --> [~2113922432,~2113922432] --> OK [~0.21139226E10,TO_NEGINF] --> [~2113922560,~2113922560] --> OK [~0.21139227E10,TO_NEGINF] --> [~2113922688,~2113922688] --> OK [~0.21139228E10,TO_NEGINF] --> [~2113922816,~2113922816] --> OK [~0.2113923E10,TO_NEGINF] --> [~2113922944,~2113922944] --> OK [~0.21139231E10,TO_NEGINF] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_NEGINF] --> [~2113923200,~2113923200] --> OK [~0.21139233E10,TO_NEGINF] --> [~2113923328,~2113923328] --> OK [~0.21139235E10,TO_NEGINF] --> [~2113923456,~2113923456] --> OK [~0.21139236E10,TO_NEGINF] --> [~2113923584,~2113923584] --> OK [~0.21139237E10,TO_NEGINF] --> [~2113923712,~2113923712] --> OK [~0.21139238E10,TO_NEGINF] --> [~2113923840,~2113923840] --> OK [~0.2113924E10,TO_NEGINF] --> [~2113923968,~2113923968] --> OK [~0.21139241E10,TO_NEGINF] --> [~2113924096,~2113924096] --> OK [~0.21139242E10,TO_NEGINF] --> [~2113924224,~2113924224] --> OK [~0.21139244E10,TO_NEGINF] --> [~2113924352,~2113924352] --> OK [~0.21139245E10,TO_NEGINF] --> [~2113924480,~2113924480] --> OK [~0.21139246E10,TO_NEGINF] --> [~2113924608,~2113924608] --> OK [~0.21139247E10,TO_NEGINF] --> [~2113924736,~2113924736] --> OK [~0.21139249E10,TO_NEGINF] --> [~2113924864,~2113924864] --> OK [~0.2113925E10,TO_NEGINF] --> [~2113924992,~2113924992] --> OK [~0.21139251E10,TO_NEGINF] --> [~2113925120,~2113925120] --> OK [~0.21139252E10,TO_NEGINF] --> [~2113925248,~2113925248] --> OK [~0.21139254E10,TO_NEGINF] --> [~2113925376,~2113925376] --> OK [~0.21139255E10,TO_NEGINF] --> [~2113925504,~2113925504] --> OK [~0.21139256E10,TO_NEGINF] --> [~2113925632,~2113925632] --> OK [~0.21139258E10,TO_NEGINF] --> [~2113925760,~2113925760] --> OK [~0.21139259E10,TO_NEGINF] --> [~2113925888,~2113925888] --> OK [~0.2113926E10,TO_NEGINF] --> [~2113926016,~2113926016] --> OK [~0.21139261E10,TO_NEGINF] --> [~2113926144,~2113926144] --> OK [~0.21139263E10,TO_NEGINF] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_NEGINF] --> [~2113926400,~2113926400] --> OK [~0.21139265E10,TO_NEGINF] --> [~2113926528,~2113926528] --> OK [~0.21139267E10,TO_NEGINF] --> [~2113926656,~2113926656] --> OK [~0.21139268E10,TO_NEGINF] --> [~2113926784,~2113926784] --> OK [~0.21139269E10,TO_NEGINF] --> [~2113926912,~2113926912] --> OK [~0.2113927E10,TO_NEGINF] --> [~2113927040,~2113927040] --> OK [~0.21139272E10,TO_NEGINF] --> [~2113927168,~2113927168] --> OK [~0.21139273E10,TO_NEGINF] --> [~2113927296,~2113927296] --> OK [~0.21139274E10,TO_NEGINF] --> [~2113927424,~2113927424] --> OK [~0.21139276E10,TO_NEGINF] --> [~2113927552,~2113927552] --> OK [~0.21139277E10,TO_NEGINF] --> [~2113927680,~2113927680] --> OK [~0.21139278E10,TO_NEGINF] --> [~2113927808,~2113927808] --> OK [~0.2113928E10,TO_NEGINF] --> [~2113927936,~2113927936] --> OK [~0.21139281E10,TO_NEGINF] --> [~2113928064,~2113928064] --> OK [~0.21139282E10,TO_NEGINF] --> [~2113928192,~2113928192] --> OK [~0.21139283E10,TO_NEGINF] --> [~2113928320,~2113928320] --> OK [~0.21139284E10,TO_NEGINF] --> [~2113928448,~2113928448] --> OK [~0.21139286E10,TO_NEGINF] --> [~2113928576,~2113928576] --> OK [~0.21139287E10,TO_NEGINF] --> [~2113928704,~2113928704] --> OK [~0.21139288E10,TO_NEGINF] --> [~2113928832,~2113928832] --> OK [~0.2113929E10,TO_NEGINF] --> [~2113928960,~2113928960] --> OK [~0.21139291E10,TO_NEGINF] --> [~2113929088,~2113929088] --> OK [~0.2080383E10,TO_NEGINF] --> [~2080382976,~2080382976] --> OK [~0.20803828E10,TO_NEGINF] --> [~2080382848,~2080382848] --> OK [~0.20803827E10,TO_NEGINF] --> [~2080382720,~2080382720] --> OK [~0.20803826E10,TO_NEGINF] --> [~2080382592,~2080382592] --> OK [~0.20803825E10,TO_NEGINF] --> [~2080382464,~2080382464] --> OK [~0.20803823E10,TO_NEGINF] --> [~2080382336,~2080382336] --> OK [~0.20803822E10,TO_NEGINF] --> [~2080382208,~2080382208] --> OK [~0.20803821E10,TO_NEGINF] --> [~2080382080,~2080382080] --> OK [~0.2080382E10,TO_NEGINF] --> [~2080381952,~2080381952] --> OK [~0.20803818E10,TO_NEGINF] --> [~2080381824,~2080381824] --> OK [~0.20803817E10,TO_NEGINF] --> [~2080381696,~2080381696] --> OK [~0.20803816E10,TO_NEGINF] --> [~2080381568,~2080381568] --> OK [~0.20803814E10,TO_NEGINF] --> [~2080381440,~2080381440] --> OK [~0.20803813E10,TO_NEGINF] --> [~2080381312,~2080381312] --> OK [~0.20803812E10,TO_NEGINF] --> [~2080381184,~2080381184] --> OK [~0.2080381E10,TO_NEGINF] --> [~2080381056,~2080381056] --> OK [~0.20803809E10,TO_NEGINF] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_NEGINF] --> [~2080380800,~2080380800] --> OK [~0.20803807E10,TO_NEGINF] --> [~2080380672,~2080380672] --> OK [~0.20803805E10,TO_NEGINF] --> [~2080380544,~2080380544] --> OK [~0.20803804E10,TO_NEGINF] --> [~2080380416,~2080380416] --> OK [~0.20803803E10,TO_NEGINF] --> [~2080380288,~2080380288] --> OK [~0.20803802E10,TO_NEGINF] --> [~2080380160,~2080380160] --> OK [~0.208038E10,TO_NEGINF] --> [~2080380032,~2080380032] --> OK [~0.20803799E10,TO_NEGINF] --> [~2080379904,~2080379904] --> OK [~0.20803798E10,TO_NEGINF] --> [~2080379776,~2080379776] --> OK [~0.20803796E10,TO_NEGINF] --> [~2080379648,~2080379648] --> OK [~0.20803795E10,TO_NEGINF] --> [~2080379520,~2080379520] --> OK [~0.20803794E10,TO_NEGINF] --> [~2080379392,~2080379392] --> OK [~0.20803793E10,TO_NEGINF] --> [~2080379264,~2080379264] --> OK [~0.20803791E10,TO_NEGINF] --> [~2080379136,~2080379136] --> OK [~0.2080379E10,TO_NEGINF] --> [~2080379008,~2080379008] --> OK [~0.20803789E10,TO_NEGINF] --> [~2080378880,~2080378880] --> OK [~0.20803788E10,TO_NEGINF] --> [~2080378752,~2080378752] --> OK [~0.20803786E10,TO_NEGINF] --> [~2080378624,~2080378624] --> OK [~0.20803785E10,TO_NEGINF] --> [~2080378496,~2080378496] --> OK [~0.20803784E10,TO_NEGINF] --> [~2080378368,~2080378368] --> OK [~0.20803782E10,TO_NEGINF] --> [~2080378240,~2080378240] --> OK [~0.20803781E10,TO_NEGINF] --> [~2080378112,~2080378112] --> OK [~0.2080378E10,TO_NEGINF] --> [~2080377984,~2080377984] --> OK [~0.20803779E10,TO_NEGINF] --> [~2080377856,~2080377856] --> OK [~0.20803777E10,TO_NEGINF] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_NEGINF] --> [~2080377600,~2080377600] --> OK [~0.20803775E10,TO_NEGINF] --> [~2080377472,~2080377472] --> OK [~0.20803773E10,TO_NEGINF] --> [~2080377344,~2080377344] --> OK [~0.20803772E10,TO_NEGINF] --> [~2080377216,~2080377216] --> OK [~0.20803771E10,TO_NEGINF] --> [~2080377088,~2080377088] --> OK [~0.2080377E10,TO_NEGINF] --> [~2080376960,~2080376960] --> OK [~0.20803768E10,TO_NEGINF] --> [~2080376832,~2080376832] --> OK [~0.20803767E10,TO_NEGINF] --> [~2080376704,~2080376704] --> OK [~0.20803766E10,TO_NEGINF] --> [~2080376576,~2080376576] --> OK [~0.20803764E10,TO_NEGINF] --> [~2080376448,~2080376448] --> OK [~0.20803763E10,TO_NEGINF] --> [~2080376320,~2080376320] --> OK [~0.20803762E10,TO_NEGINF] --> [~2080376192,~2080376192] --> OK [~0.2080376E10,TO_NEGINF] --> [~2080376064,~2080376064] --> OK [~0.20803759E10,TO_NEGINF] --> [~2080375936,~2080375936] --> OK [~0.20803758E10,TO_NEGINF] --> [~2080375808,~2080375808] --> OK [~0.20803757E10,TO_NEGINF] --> [~2080375680,~2080375680] --> OK [~0.20803756E10,TO_NEGINF] --> [~2080375552,~2080375552] --> OK [~0.20803754E10,TO_NEGINF] --> [~2080375424,~2080375424] --> OK [~0.20803753E10,TO_NEGINF] --> [~2080375296,~2080375296] --> OK [~0.20803752E10,TO_NEGINF] --> [~2080375168,~2080375168] --> OK [~0.2080375E10,TO_NEGINF] --> [~2080375040,~2080375040] --> OK [~0.20803749E10,TO_NEGINF] --> [~2080374912,~2080374912] --> OK [~0.20803748E10,TO_NEGINF] --> [~2080374784,~2080374784] --> OK [~0.20803666E10,TO_NEGINF] --> [~2080366592,~2080366592] --> OK [~0.20803667E10,TO_NEGINF] --> [~2080366720,~2080366720] --> OK [~0.20803668E10,TO_NEGINF] --> [~2080366848,~2080366848] --> OK [~0.2080367E10,TO_NEGINF] --> [~2080366976,~2080366976] --> OK [~0.20803671E10,TO_NEGINF] --> [~2080367104,~2080367104] --> OK [~0.20803672E10,TO_NEGINF] --> [~2080367232,~2080367232] --> OK [~0.20803674E10,TO_NEGINF] --> [~2080367360,~2080367360] --> OK [~0.20803675E10,TO_NEGINF] --> [~2080367488,~2080367488] --> OK [~0.20803676E10,TO_NEGINF] --> [~2080367616,~2080367616] --> OK [~0.20803677E10,TO_NEGINF] --> [~2080367744,~2080367744] --> OK [~0.20803679E10,TO_NEGINF] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_NEGINF] --> [~2080368000,~2080368000] --> OK [~0.20803681E10,TO_NEGINF] --> [~2080368128,~2080368128] --> OK [~0.20803683E10,TO_NEGINF] --> [~2080368256,~2080368256] --> OK [~0.20803684E10,TO_NEGINF] --> [~2080368384,~2080368384] --> OK [~0.20803685E10,TO_NEGINF] --> [~2080368512,~2080368512] --> OK [~0.20803686E10,TO_NEGINF] --> [~2080368640,~2080368640] --> OK [~0.20803688E10,TO_NEGINF] --> [~2080368768,~2080368768] --> OK [~0.20803689E10,TO_NEGINF] --> [~2080368896,~2080368896] --> OK [~0.2080369E10,TO_NEGINF] --> [~2080369024,~2080369024] --> OK [~0.20803692E10,TO_NEGINF] --> [~2080369152,~2080369152] --> OK [~0.20803693E10,TO_NEGINF] --> [~2080369280,~2080369280] --> OK [~0.20803694E10,TO_NEGINF] --> [~2080369408,~2080369408] --> OK [~0.20803695E10,TO_NEGINF] --> [~2080369536,~2080369536] --> OK [~0.20803697E10,TO_NEGINF] --> [~2080369664,~2080369664] --> OK [~0.20803698E10,TO_NEGINF] --> [~2080369792,~2080369792] --> OK [~0.20803699E10,TO_NEGINF] --> [~2080369920,~2080369920] --> OK [~0.208037E10,TO_NEGINF] --> [~2080370048,~2080370048] --> OK [~0.20803702E10,TO_NEGINF] --> [~2080370176,~2080370176] --> OK [~0.20803703E10,TO_NEGINF] --> [~2080370304,~2080370304] --> OK [~0.20803704E10,TO_NEGINF] --> [~2080370432,~2080370432] --> OK [~0.20803706E10,TO_NEGINF] --> [~2080370560,~2080370560] --> OK [~0.20803707E10,TO_NEGINF] --> [~2080370688,~2080370688] --> OK [~0.20803708E10,TO_NEGINF] --> [~2080370816,~2080370816] --> OK [~0.2080371E10,TO_NEGINF] --> [~2080370944,~2080370944] --> OK [~0.20803711E10,TO_NEGINF] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_NEGINF] --> [~2080371200,~2080371200] --> OK [~0.20803713E10,TO_NEGINF] --> [~2080371328,~2080371328] --> OK [~0.20803715E10,TO_NEGINF] --> [~2080371456,~2080371456] --> OK [~0.20803716E10,TO_NEGINF] --> [~2080371584,~2080371584] --> OK [~0.20803717E10,TO_NEGINF] --> [~2080371712,~2080371712] --> OK [~0.20803718E10,TO_NEGINF] --> [~2080371840,~2080371840] --> OK [~0.2080372E10,TO_NEGINF] --> [~2080371968,~2080371968] --> OK [~0.20803721E10,TO_NEGINF] --> [~2080372096,~2080372096] --> OK [~0.20803722E10,TO_NEGINF] --> [~2080372224,~2080372224] --> OK [~0.20803724E10,TO_NEGINF] --> [~2080372352,~2080372352] --> OK [~0.20803725E10,TO_NEGINF] --> [~2080372480,~2080372480] --> OK [~0.20803726E10,TO_NEGINF] --> [~2080372608,~2080372608] --> OK [~0.20803727E10,TO_NEGINF] --> [~2080372736,~2080372736] --> OK [~0.20803729E10,TO_NEGINF] --> [~2080372864,~2080372864] --> OK [~0.2080373E10,TO_NEGINF] --> [~2080372992,~2080372992] --> OK [~0.20803731E10,TO_NEGINF] --> [~2080373120,~2080373120] --> OK [~0.20803732E10,TO_NEGINF] --> [~2080373248,~2080373248] --> OK [~0.20803734E10,TO_NEGINF] --> [~2080373376,~2080373376] --> OK [~0.20803735E10,TO_NEGINF] --> [~2080373504,~2080373504] --> OK [~0.20803736E10,TO_NEGINF] --> [~2080373632,~2080373632] --> OK [~0.20803738E10,TO_NEGINF] --> [~2080373760,~2080373760] --> OK [~0.20803739E10,TO_NEGINF] --> [~2080373888,~2080373888] --> OK [~0.2080374E10,TO_NEGINF] --> [~2080374016,~2080374016] --> OK [~0.20803741E10,TO_NEGINF] --> [~2080374144,~2080374144] --> OK [~0.20803743E10,TO_NEGINF] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_NEGINF] --> [~2080374400,~2080374400] --> OK [~0.20803745E10,TO_NEGINF] --> [~2080374528,~2080374528] --> OK [~0.20803747E10,TO_NEGINF] --> [~2080374656,~2080374656] --> OK [~0.20132741E10,TO_NEGINF] --> [~2013274112,~2013274112] --> OK [~0.2013274E10,TO_NEGINF] --> [~2013273984,~2013273984] --> OK [~0.20132739E10,TO_NEGINF] --> [~2013273856,~2013273856] --> OK [~0.20132737E10,TO_NEGINF] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_NEGINF] --> [~2013273600,~2013273600] --> OK [~0.20132735E10,TO_NEGINF] --> [~2013273472,~2013273472] --> OK [~0.20132733E10,TO_NEGINF] --> [~2013273344,~2013273344] --> OK [~0.20132732E10,TO_NEGINF] --> [~2013273216,~2013273216] --> OK [~0.20132731E10,TO_NEGINF] --> [~2013273088,~2013273088] --> OK [~0.2013273E10,TO_NEGINF] --> [~2013272960,~2013272960] --> OK [~0.20132728E10,TO_NEGINF] --> [~2013272832,~2013272832] --> OK [~0.20132727E10,TO_NEGINF] --> [~2013272704,~2013272704] --> OK [~0.20132726E10,TO_NEGINF] --> [~2013272576,~2013272576] --> OK [~0.20132724E10,TO_NEGINF] --> [~2013272448,~2013272448] --> OK [~0.20132723E10,TO_NEGINF] --> [~2013272320,~2013272320] --> OK [~0.20132722E10,TO_NEGINF] --> [~2013272192,~2013272192] --> OK [~0.2013272E10,TO_NEGINF] --> [~2013272064,~2013272064] --> OK [~0.20132719E10,TO_NEGINF] --> [~2013271936,~2013271936] --> OK [~0.20132718E10,TO_NEGINF] --> [~2013271808,~2013271808] --> OK [~0.20132717E10,TO_NEGINF] --> [~2013271680,~2013271680] --> OK [~0.20132716E10,TO_NEGINF] --> [~2013271552,~2013271552] --> OK [~0.20132714E10,TO_NEGINF] --> [~2013271424,~2013271424] --> OK [~0.20132713E10,TO_NEGINF] --> [~2013271296,~2013271296] --> OK [~0.20132712E10,TO_NEGINF] --> [~2013271168,~2013271168] --> OK [~0.2013271E10,TO_NEGINF] --> [~2013271040,~2013271040] --> OK [~0.20132709E10,TO_NEGINF] --> [~2013270912,~2013270912] --> OK [~0.20132708E10,TO_NEGINF] --> [~2013270784,~2013270784] --> OK [~0.20132707E10,TO_NEGINF] --> [~2013270656,~2013270656] --> OK [~0.20132705E10,TO_NEGINF] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_NEGINF] --> [~2013270400,~2013270400] --> OK [~0.20132703E10,TO_NEGINF] --> [~2013270272,~2013270272] --> OK [~0.20132701E10,TO_NEGINF] --> [~2013270144,~2013270144] --> OK [~0.201327E10,TO_NEGINF] --> [~2013270016,~2013270016] --> OK [~0.20132699E10,TO_NEGINF] --> [~2013269888,~2013269888] --> OK [~0.20132698E10,TO_NEGINF] --> [~2013269760,~2013269760] --> OK [~0.20132696E10,TO_NEGINF] --> [~2013269632,~2013269632] --> OK [~0.20132695E10,TO_NEGINF] --> [~2013269504,~2013269504] --> OK [~0.20132694E10,TO_NEGINF] --> [~2013269376,~2013269376] --> OK [~0.20132692E10,TO_NEGINF] --> [~2013269248,~2013269248] --> OK [~0.20132691E10,TO_NEGINF] --> [~2013269120,~2013269120] --> OK [~0.2013269E10,TO_NEGINF] --> [~2013268992,~2013268992] --> OK [~0.20132689E10,TO_NEGINF] --> [~2013268864,~2013268864] --> OK [~0.20132687E10,TO_NEGINF] --> [~2013268736,~2013268736] --> OK [~0.20132686E10,TO_NEGINF] --> [~2013268608,~2013268608] --> OK [~0.20132685E10,TO_NEGINF] --> [~2013268480,~2013268480] --> OK [~0.20132684E10,TO_NEGINF] --> [~2013268352,~2013268352] --> OK [~0.20132682E10,TO_NEGINF] --> [~2013268224,~2013268224] --> OK [~0.20132681E10,TO_NEGINF] --> [~2013268096,~2013268096] --> OK [~0.2013268E10,TO_NEGINF] --> [~2013267968,~2013267968] --> OK [~0.20132678E10,TO_NEGINF] --> [~2013267840,~2013267840] --> OK [~0.20132677E10,TO_NEGINF] --> [~2013267712,~2013267712] --> OK [~0.20132676E10,TO_NEGINF] --> [~2013267584,~2013267584] --> OK [~0.20132675E10,TO_NEGINF] --> [~2013267456,~2013267456] --> OK [~0.20132673E10,TO_NEGINF] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_NEGINF] --> [~2013267200,~2013267200] --> OK [~0.20132671E10,TO_NEGINF] --> [~2013267072,~2013267072] --> OK [~0.2013267E10,TO_NEGINF] --> [~2013266944,~2013266944] --> OK [~0.20132668E10,TO_NEGINF] --> [~2013266816,~2013266816] --> OK [~0.20132667E10,TO_NEGINF] --> [~2013266688,~2013266688] --> OK [~0.20132666E10,TO_NEGINF] --> [~2013266560,~2013266560] --> OK [~0.20132664E10,TO_NEGINF] --> [~2013266432,~2013266432] --> OK [~0.20132663E10,TO_NEGINF] --> [~2013266304,~2013266304] --> OK [~0.20132662E10,TO_NEGINF] --> [~2013266176,~2013266176] --> OK [~0.2013266E10,TO_NEGINF] --> [~2013266048,~2013266048] --> OK [~0.20132659E10,TO_NEGINF] --> [~2013265920,~2013265920] --> OK [~0.20132577E10,TO_NEGINF] --> [~2013257728,~2013257728] --> OK [~0.20132579E10,TO_NEGINF] --> [~2013257856,~2013257856] --> OK [~0.2013258E10,TO_NEGINF] --> [~2013257984,~2013257984] --> OK [~0.20132581E10,TO_NEGINF] --> [~2013258112,~2013258112] --> OK [~0.20132582E10,TO_NEGINF] --> [~2013258240,~2013258240] --> OK [~0.20132584E10,TO_NEGINF] --> [~2013258368,~2013258368] --> OK [~0.20132585E10,TO_NEGINF] --> [~2013258496,~2013258496] --> OK [~0.20132586E10,TO_NEGINF] --> [~2013258624,~2013258624] --> OK [~0.20132588E10,TO_NEGINF] --> [~2013258752,~2013258752] --> OK [~0.20132589E10,TO_NEGINF] --> [~2013258880,~2013258880] --> OK [~0.2013259E10,TO_NEGINF] --> [~2013259008,~2013259008] --> OK [~0.20132591E10,TO_NEGINF] --> [~2013259136,~2013259136] --> OK [~0.20132593E10,TO_NEGINF] --> [~2013259264,~2013259264] --> OK [~0.20132594E10,TO_NEGINF] --> [~2013259392,~2013259392] --> OK [~0.20132595E10,TO_NEGINF] --> [~2013259520,~2013259520] --> OK [~0.20132596E10,TO_NEGINF] --> [~2013259648,~2013259648] --> OK [~0.20132598E10,TO_NEGINF] --> [~2013259776,~2013259776] --> OK [~0.20132599E10,TO_NEGINF] --> [~2013259904,~2013259904] --> OK [~0.201326E10,TO_NEGINF] --> [~2013260032,~2013260032] --> OK [~0.20132602E10,TO_NEGINF] --> [~2013260160,~2013260160] --> OK [~0.20132603E10,TO_NEGINF] --> [~2013260288,~2013260288] --> OK [~0.20132604E10,TO_NEGINF] --> [~2013260416,~2013260416] --> OK [~0.20132605E10,TO_NEGINF] --> [~2013260544,~2013260544] --> OK [~0.20132607E10,TO_NEGINF] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_NEGINF] --> [~2013260800,~2013260800] --> OK [~0.20132609E10,TO_NEGINF] --> [~2013260928,~2013260928] --> OK [~0.2013261E10,TO_NEGINF] --> [~2013261056,~2013261056] --> OK [~0.20132612E10,TO_NEGINF] --> [~2013261184,~2013261184] --> OK [~0.20132613E10,TO_NEGINF] --> [~2013261312,~2013261312] --> OK [~0.20132614E10,TO_NEGINF] --> [~2013261440,~2013261440] --> OK [~0.20132616E10,TO_NEGINF] --> [~2013261568,~2013261568] --> OK [~0.20132617E10,TO_NEGINF] --> [~2013261696,~2013261696] --> OK [~0.20132618E10,TO_NEGINF] --> [~2013261824,~2013261824] --> OK [~0.2013262E10,TO_NEGINF] --> [~2013261952,~2013261952] --> OK [~0.20132621E10,TO_NEGINF] --> [~2013262080,~2013262080] --> OK [~0.20132622E10,TO_NEGINF] --> [~2013262208,~2013262208] --> OK [~0.20132623E10,TO_NEGINF] --> [~2013262336,~2013262336] --> OK [~0.20132625E10,TO_NEGINF] --> [~2013262464,~2013262464] --> OK [~0.20132626E10,TO_NEGINF] --> [~2013262592,~2013262592] --> OK [~0.20132627E10,TO_NEGINF] --> [~2013262720,~2013262720] --> OK [~0.20132628E10,TO_NEGINF] --> [~2013262848,~2013262848] --> OK [~0.2013263E10,TO_NEGINF] --> [~2013262976,~2013262976] --> OK [~0.20132631E10,TO_NEGINF] --> [~2013263104,~2013263104] --> OK [~0.20132632E10,TO_NEGINF] --> [~2013263232,~2013263232] --> OK [~0.20132634E10,TO_NEGINF] --> [~2013263360,~2013263360] --> OK [~0.20132635E10,TO_NEGINF] --> [~2013263488,~2013263488] --> OK [~0.20132636E10,TO_NEGINF] --> [~2013263616,~2013263616] --> OK [~0.20132637E10,TO_NEGINF] --> [~2013263744,~2013263744] --> OK [~0.20132639E10,TO_NEGINF] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_NEGINF] --> [~2013264000,~2013264000] --> OK [~0.20132641E10,TO_NEGINF] --> [~2013264128,~2013264128] --> OK [~0.20132643E10,TO_NEGINF] --> [~2013264256,~2013264256] --> OK [~0.20132644E10,TO_NEGINF] --> [~2013264384,~2013264384] --> OK [~0.20132645E10,TO_NEGINF] --> [~2013264512,~2013264512] --> OK [~0.20132646E10,TO_NEGINF] --> [~2013264640,~2013264640] --> OK [~0.20132648E10,TO_NEGINF] --> [~2013264768,~2013264768] --> OK [~0.20132649E10,TO_NEGINF] --> [~2013264896,~2013264896] --> OK [~0.2013265E10,TO_NEGINF] --> [~2013265024,~2013265024] --> OK [~0.20132652E10,TO_NEGINF] --> [~2013265152,~2013265152] --> OK [~0.20132653E10,TO_NEGINF] --> [~2013265280,~2013265280] --> OK [~0.20132654E10,TO_NEGINF] --> [~2013265408,~2013265408] --> OK [~0.20132655E10,TO_NEGINF] --> [~2013265536,~2013265536] --> OK [~0.20132657E10,TO_NEGINF] --> [~2013265664,~2013265664] --> OK [~0.20132658E10,TO_NEGINF] --> [~2013265792,~2013265792] --> OK [~0.18790564E10,TO_NEGINF] --> [~1879056384,~1879056384] --> OK [~0.18790563E10,TO_NEGINF] --> [~1879056256,~1879056256] --> OK [~0.18790561E10,TO_NEGINF] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_NEGINF] --> [~1879056000,~1879056000] --> OK [~0.18790559E10,TO_NEGINF] --> [~1879055872,~1879055872] --> OK [~0.18790557E10,TO_NEGINF] --> [~1879055744,~1879055744] --> OK [~0.18790556E10,TO_NEGINF] --> [~1879055616,~1879055616] --> OK [~0.18790555E10,TO_NEGINF] --> [~1879055488,~1879055488] --> OK [~0.18790554E10,TO_NEGINF] --> [~1879055360,~1879055360] --> OK [~0.18790552E10,TO_NEGINF] --> [~1879055232,~1879055232] --> OK [~0.18790551E10,TO_NEGINF] --> [~1879055104,~1879055104] --> OK [~0.1879055E10,TO_NEGINF] --> [~1879054976,~1879054976] --> OK [~0.18790548E10,TO_NEGINF] --> [~1879054848,~1879054848] --> OK [~0.18790547E10,TO_NEGINF] --> [~1879054720,~1879054720] --> OK [~0.18790546E10,TO_NEGINF] --> [~1879054592,~1879054592] --> OK [~0.18790545E10,TO_NEGINF] --> [~1879054464,~1879054464] --> OK [~0.18790543E10,TO_NEGINF] --> [~1879054336,~1879054336] --> OK [~0.18790542E10,TO_NEGINF] --> [~1879054208,~1879054208] --> OK [~0.18790541E10,TO_NEGINF] --> [~1879054080,~1879054080] --> OK [~0.1879054E10,TO_NEGINF] --> [~1879053952,~1879053952] --> OK [~0.18790538E10,TO_NEGINF] --> [~1879053824,~1879053824] --> OK [~0.18790537E10,TO_NEGINF] --> [~1879053696,~1879053696] --> OK [~0.18790536E10,TO_NEGINF] --> [~1879053568,~1879053568] --> OK [~0.18790534E10,TO_NEGINF] --> [~1879053440,~1879053440] --> OK [~0.18790533E10,TO_NEGINF] --> [~1879053312,~1879053312] --> OK [~0.18790532E10,TO_NEGINF] --> [~1879053184,~1879053184] --> OK [~0.1879053E10,TO_NEGINF] --> [~1879053056,~1879053056] --> OK [~0.18790529E10,TO_NEGINF] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_NEGINF] --> [~1879052800,~1879052800] --> OK [~0.18790527E10,TO_NEGINF] --> [~1879052672,~1879052672] --> OK [~0.18790525E10,TO_NEGINF] --> [~1879052544,~1879052544] --> OK [~0.18790524E10,TO_NEGINF] --> [~1879052416,~1879052416] --> OK [~0.18790523E10,TO_NEGINF] --> [~1879052288,~1879052288] --> OK [~0.18790522E10,TO_NEGINF] --> [~1879052160,~1879052160] --> OK [~0.1879052E10,TO_NEGINF] --> [~1879052032,~1879052032] --> OK [~0.18790519E10,TO_NEGINF] --> [~1879051904,~1879051904] --> OK [~0.18790518E10,TO_NEGINF] --> [~1879051776,~1879051776] --> OK [~0.18790516E10,TO_NEGINF] --> [~1879051648,~1879051648] --> OK [~0.18790515E10,TO_NEGINF] --> [~1879051520,~1879051520] --> OK [~0.18790514E10,TO_NEGINF] --> [~1879051392,~1879051392] --> OK [~0.18790513E10,TO_NEGINF] --> [~1879051264,~1879051264] --> OK [~0.18790511E10,TO_NEGINF] --> [~1879051136,~1879051136] --> OK [~0.1879051E10,TO_NEGINF] --> [~1879051008,~1879051008] --> OK [~0.18790509E10,TO_NEGINF] --> [~1879050880,~1879050880] --> OK [~0.18790508E10,TO_NEGINF] --> [~1879050752,~1879050752] --> OK [~0.18790506E10,TO_NEGINF] --> [~1879050624,~1879050624] --> OK [~0.18790505E10,TO_NEGINF] --> [~1879050496,~1879050496] --> OK [~0.18790504E10,TO_NEGINF] --> [~1879050368,~1879050368] --> OK [~0.18790502E10,TO_NEGINF] --> [~1879050240,~1879050240] --> OK [~0.18790501E10,TO_NEGINF] --> [~1879050112,~1879050112] --> OK [~0.187905E10,TO_NEGINF] --> [~1879049984,~1879049984] --> OK [~0.18790499E10,TO_NEGINF] --> [~1879049856,~1879049856] --> OK [~0.18790497E10,TO_NEGINF] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_NEGINF] --> [~1879049600,~1879049600] --> OK [~0.18790495E10,TO_NEGINF] --> [~1879049472,~1879049472] --> OK [~0.18790493E10,TO_NEGINF] --> [~1879049344,~1879049344] --> OK [~0.18790492E10,TO_NEGINF] --> [~1879049216,~1879049216] --> OK [~0.18790491E10,TO_NEGINF] --> [~1879049088,~1879049088] --> OK [~0.1879049E10,TO_NEGINF] --> [~1879048960,~1879048960] --> OK [~0.18790488E10,TO_NEGINF] --> [~1879048832,~1879048832] --> OK [~0.18790487E10,TO_NEGINF] --> [~1879048704,~1879048704] --> OK [~0.18790486E10,TO_NEGINF] --> [~1879048576,~1879048576] --> OK [~0.18790484E10,TO_NEGINF] --> [~1879048448,~1879048448] --> OK [~0.18790483E10,TO_NEGINF] --> [~1879048320,~1879048320] --> OK [~0.18790482E10,TO_NEGINF] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_NEGINF] --> [~1879040000,~1879040000] --> OK [~0.18790401E10,TO_NEGINF] --> [~1879040128,~1879040128] --> OK [~0.18790403E10,TO_NEGINF] --> [~1879040256,~1879040256] --> OK [~0.18790404E10,TO_NEGINF] --> [~1879040384,~1879040384] --> OK [~0.18790405E10,TO_NEGINF] --> [~1879040512,~1879040512] --> OK [~0.18790406E10,TO_NEGINF] --> [~1879040640,~1879040640] --> OK [~0.18790408E10,TO_NEGINF] --> [~1879040768,~1879040768] --> OK [~0.18790409E10,TO_NEGINF] --> [~1879040896,~1879040896] --> OK [~0.1879041E10,TO_NEGINF] --> [~1879041024,~1879041024] --> OK [~0.18790412E10,TO_NEGINF] --> [~1879041152,~1879041152] --> OK [~0.18790413E10,TO_NEGINF] --> [~1879041280,~1879041280] --> OK [~0.18790414E10,TO_NEGINF] --> [~1879041408,~1879041408] --> OK [~0.18790415E10,TO_NEGINF] --> [~1879041536,~1879041536] --> OK [~0.18790417E10,TO_NEGINF] --> [~1879041664,~1879041664] --> OK [~0.18790418E10,TO_NEGINF] --> [~1879041792,~1879041792] --> OK [~0.18790419E10,TO_NEGINF] --> [~1879041920,~1879041920] --> OK [~0.1879042E10,TO_NEGINF] --> [~1879042048,~1879042048] --> OK [~0.18790422E10,TO_NEGINF] --> [~1879042176,~1879042176] --> OK [~0.18790423E10,TO_NEGINF] --> [~1879042304,~1879042304] --> OK [~0.18790424E10,TO_NEGINF] --> [~1879042432,~1879042432] --> OK [~0.18790426E10,TO_NEGINF] --> [~1879042560,~1879042560] --> OK [~0.18790427E10,TO_NEGINF] --> [~1879042688,~1879042688] --> OK [~0.18790428E10,TO_NEGINF] --> [~1879042816,~1879042816] --> OK [~0.1879043E10,TO_NEGINF] --> [~1879042944,~1879042944] --> OK [~0.18790431E10,TO_NEGINF] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_NEGINF] --> [~1879043200,~1879043200] --> OK [~0.18790433E10,TO_NEGINF] --> [~1879043328,~1879043328] --> OK [~0.18790435E10,TO_NEGINF] --> [~1879043456,~1879043456] --> OK [~0.18790436E10,TO_NEGINF] --> [~1879043584,~1879043584] --> OK [~0.18790437E10,TO_NEGINF] --> [~1879043712,~1879043712] --> OK [~0.18790438E10,TO_NEGINF] --> [~1879043840,~1879043840] --> OK [~0.1879044E10,TO_NEGINF] --> [~1879043968,~1879043968] --> OK [~0.18790441E10,TO_NEGINF] --> [~1879044096,~1879044096] --> OK [~0.18790442E10,TO_NEGINF] --> [~1879044224,~1879044224] --> OK [~0.18790444E10,TO_NEGINF] --> [~1879044352,~1879044352] --> OK [~0.18790445E10,TO_NEGINF] --> [~1879044480,~1879044480] --> OK [~0.18790446E10,TO_NEGINF] --> [~1879044608,~1879044608] --> OK [~0.18790447E10,TO_NEGINF] --> [~1879044736,~1879044736] --> OK [~0.18790449E10,TO_NEGINF] --> [~1879044864,~1879044864] --> OK [~0.1879045E10,TO_NEGINF] --> [~1879044992,~1879044992] --> OK [~0.18790451E10,TO_NEGINF] --> [~1879045120,~1879045120] --> OK [~0.18790452E10,TO_NEGINF] --> [~1879045248,~1879045248] --> OK [~0.18790454E10,TO_NEGINF] --> [~1879045376,~1879045376] --> OK [~0.18790455E10,TO_NEGINF] --> [~1879045504,~1879045504] --> OK [~0.18790456E10,TO_NEGINF] --> [~1879045632,~1879045632] --> OK [~0.18790458E10,TO_NEGINF] --> [~1879045760,~1879045760] --> OK [~0.18790459E10,TO_NEGINF] --> [~1879045888,~1879045888] --> OK [~0.1879046E10,TO_NEGINF] --> [~1879046016,~1879046016] --> OK [~0.18790461E10,TO_NEGINF] --> [~1879046144,~1879046144] --> OK [~0.18790463E10,TO_NEGINF] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_NEGINF] --> [~1879046400,~1879046400] --> OK [~0.18790465E10,TO_NEGINF] --> [~1879046528,~1879046528] --> OK [~0.18790467E10,TO_NEGINF] --> [~1879046656,~1879046656] --> OK [~0.18790468E10,TO_NEGINF] --> [~1879046784,~1879046784] --> OK [~0.18790469E10,TO_NEGINF] --> [~1879046912,~1879046912] --> OK [~0.1879047E10,TO_NEGINF] --> [~1879047040,~1879047040] --> OK [~0.18790472E10,TO_NEGINF] --> [~1879047168,~1879047168] --> OK [~0.18790473E10,TO_NEGINF] --> [~1879047296,~1879047296] --> OK [~0.18790474E10,TO_NEGINF] --> [~1879047424,~1879047424] --> OK [~0.18790476E10,TO_NEGINF] --> [~1879047552,~1879047552] --> OK [~0.18790477E10,TO_NEGINF] --> [~1879047680,~1879047680] --> OK [~0.18790478E10,TO_NEGINF] --> [~1879047808,~1879047808] --> OK [~0.1879048E10,TO_NEGINF] --> [~1879047936,~1879047936] --> OK [~0.18790481E10,TO_NEGINF] --> [~1879048064,~1879048064] --> OK [~0.16106209E10,TO_NEGINF] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_NEGINF] --> [~1610620800,~1610620800] --> OK [~0.16106207E10,TO_NEGINF] --> [~1610620672,~1610620672] --> OK [~0.16106205E10,TO_NEGINF] --> [~1610620544,~1610620544] --> OK [~0.16106204E10,TO_NEGINF] --> [~1610620416,~1610620416] --> OK [~0.16106203E10,TO_NEGINF] --> [~1610620288,~1610620288] --> OK [~0.16106202E10,TO_NEGINF] --> [~1610620160,~1610620160] --> OK [~0.161062E10,TO_NEGINF] --> [~1610620032,~1610620032] --> OK [~0.16106199E10,TO_NEGINF] --> [~1610619904,~1610619904] --> OK [~0.16106198E10,TO_NEGINF] --> [~1610619776,~1610619776] --> OK [~0.16106196E10,TO_NEGINF] --> [~1610619648,~1610619648] --> OK [~0.16106195E10,TO_NEGINF] --> [~1610619520,~1610619520] --> OK [~0.16106194E10,TO_NEGINF] --> [~1610619392,~1610619392] --> OK [~0.16106193E10,TO_NEGINF] --> [~1610619264,~1610619264] --> OK [~0.16106191E10,TO_NEGINF] --> [~1610619136,~1610619136] --> OK [~0.1610619E10,TO_NEGINF] --> [~1610619008,~1610619008] --> OK [~0.16106189E10,TO_NEGINF] --> [~1610618880,~1610618880] --> OK [~0.16106188E10,TO_NEGINF] --> [~1610618752,~1610618752] --> OK [~0.16106186E10,TO_NEGINF] --> [~1610618624,~1610618624] --> OK [~0.16106185E10,TO_NEGINF] --> [~1610618496,~1610618496] --> OK [~0.16106184E10,TO_NEGINF] --> [~1610618368,~1610618368] --> OK [~0.16106182E10,TO_NEGINF] --> [~1610618240,~1610618240] --> OK [~0.16106181E10,TO_NEGINF] --> [~1610618112,~1610618112] --> OK [~0.1610618E10,TO_NEGINF] --> [~1610617984,~1610617984] --> OK [~0.16106179E10,TO_NEGINF] --> [~1610617856,~1610617856] --> OK [~0.16106177E10,TO_NEGINF] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_NEGINF] --> [~1610617600,~1610617600] --> OK [~0.16106175E10,TO_NEGINF] --> [~1610617472,~1610617472] --> OK [~0.16106173E10,TO_NEGINF] --> [~1610617344,~1610617344] --> OK [~0.16106172E10,TO_NEGINF] --> [~1610617216,~1610617216] --> OK [~0.16106171E10,TO_NEGINF] --> [~1610617088,~1610617088] --> OK [~0.1610617E10,TO_NEGINF] --> [~1610616960,~1610616960] --> OK [~0.16106168E10,TO_NEGINF] --> [~1610616832,~1610616832] --> OK [~0.16106167E10,TO_NEGINF] --> [~1610616704,~1610616704] --> OK [~0.16106166E10,TO_NEGINF] --> [~1610616576,~1610616576] --> OK [~0.16106164E10,TO_NEGINF] --> [~1610616448,~1610616448] --> OK [~0.16106163E10,TO_NEGINF] --> [~1610616320,~1610616320] --> OK [~0.16106162E10,TO_NEGINF] --> [~1610616192,~1610616192] --> OK [~0.1610616E10,TO_NEGINF] --> [~1610616064,~1610616064] --> OK [~0.16106159E10,TO_NEGINF] --> [~1610615936,~1610615936] --> OK [~0.16106158E10,TO_NEGINF] --> [~1610615808,~1610615808] --> OK [~0.16106157E10,TO_NEGINF] --> [~1610615680,~1610615680] --> OK [~0.16106156E10,TO_NEGINF] --> [~1610615552,~1610615552] --> OK [~0.16106154E10,TO_NEGINF] --> [~1610615424,~1610615424] --> OK [~0.16106153E10,TO_NEGINF] --> [~1610615296,~1610615296] --> OK [~0.16106152E10,TO_NEGINF] --> [~1610615168,~1610615168] --> OK [~0.1610615E10,TO_NEGINF] --> [~1610615040,~1610615040] --> OK [~0.16106149E10,TO_NEGINF] --> [~1610614912,~1610614912] --> OK [~0.16106148E10,TO_NEGINF] --> [~1610614784,~1610614784] --> OK [~0.16106147E10,TO_NEGINF] --> [~1610614656,~1610614656] --> OK [~0.16106145E10,TO_NEGINF] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_NEGINF] --> [~1610614400,~1610614400] --> OK [~0.16106143E10,TO_NEGINF] --> [~1610614272,~1610614272] --> OK [~0.16106141E10,TO_NEGINF] --> [~1610614144,~1610614144] --> OK [~0.1610614E10,TO_NEGINF] --> [~1610614016,~1610614016] --> OK [~0.16106139E10,TO_NEGINF] --> [~1610613888,~1610613888] --> OK [~0.16106138E10,TO_NEGINF] --> [~1610613760,~1610613760] --> OK [~0.16106136E10,TO_NEGINF] --> [~1610613632,~1610613632] --> OK [~0.16106135E10,TO_NEGINF] --> [~1610613504,~1610613504] --> OK [~0.16106134E10,TO_NEGINF] --> [~1610613376,~1610613376] --> OK [~0.16106132E10,TO_NEGINF] --> [~1610613248,~1610613248] --> OK [~0.16106131E10,TO_NEGINF] --> [~1610613120,~1610613120] --> OK [~0.1610613E10,TO_NEGINF] --> [~1610612992,~1610612992] --> OK [~0.16106129E10,TO_NEGINF] --> [~1610612864,~1610612864] --> OK [~0.16106127E10,TO_NEGINF] --> [~1610612736,~1610612736] --> OK [~0.16106045E10,TO_NEGINF] --> [~1610604544,~1610604544] --> OK [~0.16106047E10,TO_NEGINF] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_NEGINF] --> [~1610604800,~1610604800] --> OK [~0.16106049E10,TO_NEGINF] --> [~1610604928,~1610604928] --> OK [~0.1610605E10,TO_NEGINF] --> [~1610605056,~1610605056] --> OK [~0.16106052E10,TO_NEGINF] --> [~1610605184,~1610605184] --> OK [~0.16106053E10,TO_NEGINF] --> [~1610605312,~1610605312] --> OK [~0.16106054E10,TO_NEGINF] --> [~1610605440,~1610605440] --> OK [~0.16106056E10,TO_NEGINF] --> [~1610605568,~1610605568] --> OK [~0.16106057E10,TO_NEGINF] --> [~1610605696,~1610605696] --> OK [~0.16106058E10,TO_NEGINF] --> [~1610605824,~1610605824] --> OK [~0.1610606E10,TO_NEGINF] --> [~1610605952,~1610605952] --> OK [~0.16106061E10,TO_NEGINF] --> [~1610606080,~1610606080] --> OK [~0.16106062E10,TO_NEGINF] --> [~1610606208,~1610606208] --> OK [~0.16106063E10,TO_NEGINF] --> [~1610606336,~1610606336] --> OK [~0.16106065E10,TO_NEGINF] --> [~1610606464,~1610606464] --> OK [~0.16106066E10,TO_NEGINF] --> [~1610606592,~1610606592] --> OK [~0.16106067E10,TO_NEGINF] --> [~1610606720,~1610606720] --> OK [~0.16106068E10,TO_NEGINF] --> [~1610606848,~1610606848] --> OK [~0.1610607E10,TO_NEGINF] --> [~1610606976,~1610606976] --> OK [~0.16106071E10,TO_NEGINF] --> [~1610607104,~1610607104] --> OK [~0.16106072E10,TO_NEGINF] --> [~1610607232,~1610607232] --> OK [~0.16106074E10,TO_NEGINF] --> [~1610607360,~1610607360] --> OK [~0.16106075E10,TO_NEGINF] --> [~1610607488,~1610607488] --> OK [~0.16106076E10,TO_NEGINF] --> [~1610607616,~1610607616] --> OK [~0.16106077E10,TO_NEGINF] --> [~1610607744,~1610607744] --> OK [~0.16106079E10,TO_NEGINF] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_NEGINF] --> [~1610608000,~1610608000] --> OK [~0.16106081E10,TO_NEGINF] --> [~1610608128,~1610608128] --> OK [~0.16106083E10,TO_NEGINF] --> [~1610608256,~1610608256] --> OK [~0.16106084E10,TO_NEGINF] --> [~1610608384,~1610608384] --> OK [~0.16106085E10,TO_NEGINF] --> [~1610608512,~1610608512] --> OK [~0.16106086E10,TO_NEGINF] --> [~1610608640,~1610608640] --> OK [~0.16106088E10,TO_NEGINF] --> [~1610608768,~1610608768] --> OK [~0.16106089E10,TO_NEGINF] --> [~1610608896,~1610608896] --> OK [~0.1610609E10,TO_NEGINF] --> [~1610609024,~1610609024] --> OK [~0.16106092E10,TO_NEGINF] --> [~1610609152,~1610609152] --> OK [~0.16106093E10,TO_NEGINF] --> [~1610609280,~1610609280] --> OK [~0.16106094E10,TO_NEGINF] --> [~1610609408,~1610609408] --> OK [~0.16106095E10,TO_NEGINF] --> [~1610609536,~1610609536] --> OK [~0.16106097E10,TO_NEGINF] --> [~1610609664,~1610609664] --> OK [~0.16106098E10,TO_NEGINF] --> [~1610609792,~1610609792] --> OK [~0.16106099E10,TO_NEGINF] --> [~1610609920,~1610609920] --> OK [~0.161061E10,TO_NEGINF] --> [~1610610048,~1610610048] --> OK [~0.16106102E10,TO_NEGINF] --> [~1610610176,~1610610176] --> OK [~0.16106103E10,TO_NEGINF] --> [~1610610304,~1610610304] --> OK [~0.16106104E10,TO_NEGINF] --> [~1610610432,~1610610432] --> OK [~0.16106106E10,TO_NEGINF] --> [~1610610560,~1610610560] --> OK [~0.16106107E10,TO_NEGINF] --> [~1610610688,~1610610688] --> OK [~0.16106108E10,TO_NEGINF] --> [~1610610816,~1610610816] --> OK [~0.1610611E10,TO_NEGINF] --> [~1610610944,~1610610944] --> OK [~0.16106111E10,TO_NEGINF] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_NEGINF] --> [~1610611200,~1610611200] --> OK [~0.16106113E10,TO_NEGINF] --> [~1610611328,~1610611328] --> OK [~0.16106115E10,TO_NEGINF] --> [~1610611456,~1610611456] --> OK [~0.16106116E10,TO_NEGINF] --> [~1610611584,~1610611584] --> OK [~0.16106117E10,TO_NEGINF] --> [~1610611712,~1610611712] --> OK [~0.16106118E10,TO_NEGINF] --> [~1610611840,~1610611840] --> OK [~0.1610612E10,TO_NEGINF] --> [~1610611968,~1610611968] --> OK [~0.16106121E10,TO_NEGINF] --> [~1610612096,~1610612096] --> OK [~0.16106122E10,TO_NEGINF] --> [~1610612224,~1610612224] --> OK [~0.16106124E10,TO_NEGINF] --> [~1610612352,~1610612352] --> OK [~0.16106125E10,TO_NEGINF] --> [~1610612480,~1610612480] --> OK [~0.16106126E10,TO_NEGINF] --> [~1610612608,~1610612608] --> OK [~0.107375E10,TO_NEGINF] --> [~1073750016,~1073750016] --> OK [~0.10737499E10,TO_NEGINF] --> [~1073749888,~1073749888] --> OK [~0.10737498E10,TO_NEGINF] --> [~1073749760,~1073749760] --> OK [~0.10737496E10,TO_NEGINF] --> [~1073749632,~1073749632] --> OK [~0.10737495E10,TO_NEGINF] --> [~1073749504,~1073749504] --> OK [~0.10737494E10,TO_NEGINF] --> [~1073749376,~1073749376] --> OK [~0.10737492E10,TO_NEGINF] --> [~1073749248,~1073749248] --> OK [~0.10737491E10,TO_NEGINF] --> [~1073749120,~1073749120] --> OK [~0.1073749E10,TO_NEGINF] --> [~1073748992,~1073748992] --> OK [~0.10737489E10,TO_NEGINF] --> [~1073748864,~1073748864] --> OK [~0.10737487E10,TO_NEGINF] --> [~1073748736,~1073748736] --> OK [~0.10737486E10,TO_NEGINF] --> [~1073748608,~1073748608] --> OK [~0.10737485E10,TO_NEGINF] --> [~1073748480,~1073748480] --> OK [~0.10737484E10,TO_NEGINF] --> [~1073748352,~1073748352] --> OK [~0.10737482E10,TO_NEGINF] --> [~1073748224,~1073748224] --> OK [~0.10737481E10,TO_NEGINF] --> [~1073748096,~1073748096] --> OK [~0.1073748E10,TO_NEGINF] --> [~1073747968,~1073747968] --> OK [~0.10737478E10,TO_NEGINF] --> [~1073747840,~1073747840] --> OK [~0.10737477E10,TO_NEGINF] --> [~1073747712,~1073747712] --> OK [~0.10737476E10,TO_NEGINF] --> [~1073747584,~1073747584] --> OK [~0.10737475E10,TO_NEGINF] --> [~1073747456,~1073747456] --> OK [~0.10737473E10,TO_NEGINF] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_NEGINF] --> [~1073747200,~1073747200] --> OK [~0.10737471E10,TO_NEGINF] --> [~1073747072,~1073747072] --> OK [~0.1073747E10,TO_NEGINF] --> [~1073746944,~1073746944] --> OK [~0.10737468E10,TO_NEGINF] --> [~1073746816,~1073746816] --> OK [~0.10737467E10,TO_NEGINF] --> [~1073746688,~1073746688] --> OK [~0.10737466E10,TO_NEGINF] --> [~1073746560,~1073746560] --> OK [~0.10737464E10,TO_NEGINF] --> [~1073746432,~1073746432] --> OK [~0.10737463E10,TO_NEGINF] --> [~1073746304,~1073746304] --> OK [~0.10737462E10,TO_NEGINF] --> [~1073746176,~1073746176] --> OK [~0.1073746E10,TO_NEGINF] --> [~1073746048,~1073746048] --> OK [~0.10737459E10,TO_NEGINF] --> [~1073745920,~1073745920] --> OK [~0.10737458E10,TO_NEGINF] --> [~1073745792,~1073745792] --> OK [~0.10737457E10,TO_NEGINF] --> [~1073745664,~1073745664] --> OK [~0.10737455E10,TO_NEGINF] --> [~1073745536,~1073745536] --> OK [~0.10737454E10,TO_NEGINF] --> [~1073745408,~1073745408] --> OK [~0.10737453E10,TO_NEGINF] --> [~1073745280,~1073745280] --> OK [~0.10737452E10,TO_NEGINF] --> [~1073745152,~1073745152] --> OK [~0.1073745E10,TO_NEGINF] --> [~1073745024,~1073745024] --> OK [~0.10737449E10,TO_NEGINF] --> [~1073744896,~1073744896] --> OK [~0.10737448E10,TO_NEGINF] --> [~1073744768,~1073744768] --> OK [~0.10737446E10,TO_NEGINF] --> [~1073744640,~1073744640] --> OK [~0.10737445E10,TO_NEGINF] --> [~1073744512,~1073744512] --> OK [~0.10737444E10,TO_NEGINF] --> [~1073744384,~1073744384] --> OK [~0.10737443E10,TO_NEGINF] --> [~1073744256,~1073744256] --> OK [~0.10737441E10,TO_NEGINF] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_NEGINF] --> [~1073744000,~1073744000] --> OK [~0.10737439E10,TO_NEGINF] --> [~1073743872,~1073743872] --> OK [~0.10737437E10,TO_NEGINF] --> [~1073743744,~1073743744] --> OK [~0.10737436E10,TO_NEGINF] --> [~1073743616,~1073743616] --> OK [~0.10737435E10,TO_NEGINF] --> [~1073743488,~1073743488] --> OK [~0.10737434E10,TO_NEGINF] --> [~1073743360,~1073743360] --> OK [~0.10737432E10,TO_NEGINF] --> [~1073743232,~1073743232] --> OK [~0.10737431E10,TO_NEGINF] --> [~1073743104,~1073743104] --> OK [~0.1073743E10,TO_NEGINF] --> [~1073742976,~1073742976] --> OK [~0.10737428E10,TO_NEGINF] --> [~1073742848,~1073742848] --> OK [~0.10737427E10,TO_NEGINF] --> [~1073742720,~1073742720] --> OK [~0.10737426E10,TO_NEGINF] --> [~1073742592,~1073742592] --> OK [~0.10737425E10,TO_NEGINF] --> [~1073742464,~1073742464] --> OK [~0.10737423E10,TO_NEGINF] --> [~1073742336,~1073742336] --> OK [~0.10737422E10,TO_NEGINF] --> [~1073742208,~1073742208] --> OK [~0.10737421E10,TO_NEGINF] --> [~1073742080,~1073742080] --> OK [~0.1073742E10,TO_NEGINF] --> [~1073741952,~1073741952] --> OK [~0.10737418E10,TO_NEGINF] --> [~1073741824,~1073741824] --> OK [~0.10737377E10,TO_NEGINF] --> [~1073737728,~1073737728] --> OK [~0.10737378E10,TO_NEGINF] --> [~1073737792,~1073737792] --> OK [~0.107373786E10,TO_NEGINF] --> [~1073737856,~1073737856] --> OK [~0.10737379E10,TO_NEGINF] --> [~1073737920,~1073737920] --> OK [~0.1073738E10,TO_NEGINF] --> [~1073737984,~1073737984] --> OK [~0.107373805E10,TO_NEGINF] --> [~1073738048,~1073738048] --> OK [~0.10737381E10,TO_NEGINF] --> [~1073738112,~1073738112] --> OK [~0.10737382E10,TO_NEGINF] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_NEGINF] --> [~1073738240,~1073738240] --> OK [~0.10737383E10,TO_NEGINF] --> [~1073738304,~1073738304] --> OK [~0.10737384E10,TO_NEGINF] --> [~1073738368,~1073738368] --> OK [~0.107373843E10,TO_NEGINF] --> [~1073738432,~1073738432] --> OK [~0.10737385E10,TO_NEGINF] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_NEGINF] --> [~1073738560,~1073738560] --> OK [~0.10737386E10,TO_NEGINF] --> [~1073738624,~1073738624] --> OK [~0.10737387E10,TO_NEGINF] --> [~1073738688,~1073738688] --> OK [~0.107373875E10,TO_NEGINF] --> [~1073738752,~1073738752] --> OK [~0.10737388E10,TO_NEGINF] --> [~1073738816,~1073738816] --> OK [~0.10737389E10,TO_NEGINF] --> [~1073738880,~1073738880] --> OK [~0.107373894E10,TO_NEGINF] --> [~1073738944,~1073738944] --> OK [~0.1073739E10,TO_NEGINF] --> [~1073739008,~1073739008] --> OK [~0.10737391E10,TO_NEGINF] --> [~1073739072,~1073739072] --> OK [~0.107373914E10,TO_NEGINF] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_NEGINF] --> [~1073739200,~1073739200] --> OK [~0.107373926E10,TO_NEGINF] --> [~1073739264,~1073739264] --> OK [~0.10737393E10,TO_NEGINF] --> [~1073739328,~1073739328] --> OK [~0.10737394E10,TO_NEGINF] --> [~1073739392,~1073739392] --> OK [~0.107373946E10,TO_NEGINF] --> [~1073739456,~1073739456] --> OK [~0.10737395E10,TO_NEGINF] --> [~1073739520,~1073739520] --> OK [~0.10737396E10,TO_NEGINF] --> [~1073739584,~1073739584] --> OK [~0.107373965E10,TO_NEGINF] --> [~1073739648,~1073739648] --> OK [~0.10737397E10,TO_NEGINF] --> [~1073739712,~1073739712] --> OK [~0.10737398E10,TO_NEGINF] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_NEGINF] --> [~1073739840,~1073739840] --> OK [~0.10737399E10,TO_NEGINF] --> [~1073739904,~1073739904] --> OK [~0.107373997E10,TO_NEGINF] --> [~1073739968,~1073739968] --> OK [~0.107374E10,TO_NEGINF] --> [~1073740032,~1073740032] --> OK [~0.10737401E10,TO_NEGINF] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_NEGINF] --> [~1073740160,~1073740160] --> OK [~0.10737402E10,TO_NEGINF] --> [~1073740224,~1073740224] --> OK [~0.10737403E10,TO_NEGINF] --> [~1073740288,~1073740288] --> OK [~0.107374035E10,TO_NEGINF] --> [~1073740352,~1073740352] --> OK [~0.10737404E10,TO_NEGINF] --> [~1073740416,~1073740416] --> OK [~0.10737405E10,TO_NEGINF] --> [~1073740480,~1073740480] --> OK [~0.107374054E10,TO_NEGINF] --> [~1073740544,~1073740544] --> OK [~0.10737406E10,TO_NEGINF] --> [~1073740608,~1073740608] --> OK [~0.10737407E10,TO_NEGINF] --> [~1073740672,~1073740672] --> OK [~0.107374074E10,TO_NEGINF] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_NEGINF] --> [~1073740800,~1073740800] --> OK [~0.107374086E10,TO_NEGINF] --> [~1073740864,~1073740864] --> OK [~0.10737409E10,TO_NEGINF] --> [~1073740928,~1073740928] --> OK [~0.1073741E10,TO_NEGINF] --> [~1073740992,~1073740992] --> OK [~0.107374106E10,TO_NEGINF] --> [~1073741056,~1073741056] --> OK [~0.10737411E10,TO_NEGINF] --> [~1073741120,~1073741120] --> OK [~0.10737412E10,TO_NEGINF] --> [~1073741184,~1073741184] --> OK [~0.107374125E10,TO_NEGINF] --> [~1073741248,~1073741248] --> OK [~0.10737413E10,TO_NEGINF] --> [~1073741312,~1073741312] --> OK [~0.10737414E10,TO_NEGINF] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_NEGINF] --> [~1073741440,~1073741440] --> OK [~0.10737415E10,TO_NEGINF] --> [~1073741504,~1073741504] --> OK [~0.10737416E10,TO_NEGINF] --> [~1073741568,~1073741568] --> OK [~0.107374163E10,TO_NEGINF] --> [~1073741632,~1073741632] --> OK [~0.10737417E10,TO_NEGINF] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_NEGINF] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000015E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000148E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000145E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000143E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000138E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000136E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000134E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000129E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000126E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000124E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000122E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000117E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000114E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000112E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000011E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000107E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000105E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000103E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000098E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000095E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000093E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000009E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000088E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000086E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000083E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000008E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000079E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000076E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000074E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000072E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000067E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000064E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000062E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000006E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000057E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000055E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000052E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000048E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000045E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000043E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000038E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000036E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000033E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000003E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000029E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000026E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000024E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000021E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000017E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999847E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999985E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999852E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999855E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999857E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999862E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999864E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999866E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999871E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999874E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999876E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999878E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999883E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999886E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999888E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999989E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999893E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999895E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999897E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999902E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999905E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999907E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999991E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999912E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999914E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999917E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999992E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999921E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999924E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999926E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999928E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999933E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999936E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999938E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999994E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999943E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999945E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999948E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999952E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999955E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999957E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999962E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999964E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999967E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999997E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999971E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999974E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999976E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999979E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999983E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000153E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000015E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000148E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000145E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000143E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000138E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000136E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000134E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000129E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000126E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000124E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000122E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000117E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000114E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000112E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000011E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000107E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000105E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000103E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000098E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000095E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000093E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000009E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000088E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000086E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000083E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000008E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000079E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000076E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000074E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000072E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000067E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000064E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000062E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000006E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000057E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000055E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000052E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000048E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000045E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000043E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000038E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000036E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000033E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000003E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000029E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000026E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000024E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000021E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000017E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999924E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999925E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999926E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999927E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999928E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999931E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999932E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999933E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999934E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999936E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999937E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999938E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999939E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999942E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999943E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999944E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999945E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999946E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999948E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999949E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999951E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999952E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999954E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999955E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999956E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999957E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999958E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999961E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999962E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999963E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999964E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999965E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999967E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999968E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999969E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999997E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999971E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999973E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999974E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999975E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999976E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999977E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999979E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999981E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999982E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999983E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999985E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999986E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999988E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999989E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999992E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000076E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000075E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000074E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000073E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000072E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000069E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000068E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000067E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000066E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000064E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000063E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000062E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000061E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000058E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000057E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000056E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000055E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000054E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000052E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000051E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000049E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000048E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000046E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000045E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000044E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000043E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000042E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000039E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000038E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000037E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000036E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000035E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000033E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000032E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000031E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000003E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000029E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000027E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000026E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000025E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000024E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000023E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000021E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000019E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000018E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000017E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000015E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000014E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000012E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000011E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000008E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1E1,TO_NEGINF] --> [~1,~1] --> OK [~0.9999962,TO_NEGINF] --> [~1,~1] --> OK [~0.99999624,TO_NEGINF] --> [~1,~1] --> OK [~0.9999963,TO_NEGINF] --> [~1,~1] --> OK [~0.99999636,TO_NEGINF] --> [~1,~1] --> OK [~0.9999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999965,TO_NEGINF] --> [~1,~1] --> OK [~0.99999654,TO_NEGINF] --> [~1,~1] --> OK [~0.9999966,TO_NEGINF] --> [~1,~1] --> OK [~0.99999666,TO_NEGINF] --> [~1,~1] --> OK [~0.9999967,TO_NEGINF] --> [~1,~1] --> OK [~0.9999968,TO_NEGINF] --> [~1,~1] --> OK [~0.99999684,TO_NEGINF] --> [~1,~1] --> OK [~0.9999969,TO_NEGINF] --> [~1,~1] --> OK [~0.99999696,TO_NEGINF] --> [~1,~1] --> OK [~0.999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999971,TO_NEGINF] --> [~1,~1] --> OK [~0.99999714,TO_NEGINF] --> [~1,~1] --> OK [~0.9999972,TO_NEGINF] --> [~1,~1] --> OK [~0.99999726,TO_NEGINF] --> [~1,~1] --> OK [~0.9999973,TO_NEGINF] --> [~1,~1] --> OK [~0.9999974,TO_NEGINF] --> [~1,~1] --> OK [~0.99999744,TO_NEGINF] --> [~1,~1] --> OK [~0.9999975,TO_NEGINF] --> [~1,~1] --> OK [~0.99999756,TO_NEGINF] --> [~1,~1] --> OK [~0.9999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999977,TO_NEGINF] --> [~1,~1] --> OK [~0.99999774,TO_NEGINF] --> [~1,~1] --> OK [~0.9999978,TO_NEGINF] --> [~1,~1] --> OK [~0.99999785,TO_NEGINF] --> [~1,~1] --> OK [~0.9999979,TO_NEGINF] --> [~1,~1] --> OK [~0.999998,TO_NEGINF] --> [~1,~1] --> OK [~0.99999803,TO_NEGINF] --> [~1,~1] --> OK [~0.9999981,TO_NEGINF] --> [~1,~1] --> OK [~0.99999815,TO_NEGINF] --> [~1,~1] --> OK [~0.9999982,TO_NEGINF] --> [~1,~1] --> OK [~0.9999983,TO_NEGINF] --> [~1,~1] --> OK [~0.99999833,TO_NEGINF] --> [~1,~1] --> OK [~0.9999984,TO_NEGINF] --> [~1,~1] --> OK [~0.99999845,TO_NEGINF] --> [~1,~1] --> OK [~0.9999985,TO_NEGINF] --> [~1,~1] --> OK [~0.99999857,TO_NEGINF] --> [~1,~1] --> OK [~0.9999986,TO_NEGINF] --> [~1,~1] --> OK [~0.9999987,TO_NEGINF] --> [~1,~1] --> OK [~0.99999875,TO_NEGINF] --> [~1,~1] --> OK [~0.9999988,TO_NEGINF] --> [~1,~1] --> OK [~0.99999887,TO_NEGINF] --> [~1,~1] --> OK [~0.9999989,TO_NEGINF] --> [~1,~1] --> OK [~0.999999,TO_NEGINF] --> [~1,~1] --> OK [~0.99999905,TO_NEGINF] --> [~1,~1] --> OK [~0.9999991,TO_NEGINF] --> [~1,~1] --> OK [~0.99999917,TO_NEGINF] --> [~1,~1] --> OK [~0.9999992,TO_NEGINF] --> [~1,~1] --> OK [~0.9999993,TO_NEGINF] --> [~1,~1] --> OK [~0.99999934,TO_NEGINF] --> [~1,~1] --> OK [~0.9999994,TO_NEGINF] --> [~1,~1] --> OK [~0.99999946,TO_NEGINF] --> [~1,~1] --> OK [~0.9999995,TO_NEGINF] --> [~1,~1] --> OK [~0.9999996,TO_NEGINF] --> [~1,~1] --> OK [~0.99999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999997,TO_NEGINF] --> [~1,~1] --> OK [~0.99999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999,TO_NEGINF] --> [~1,~1] --> OK [~0.99999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.88E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.87E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.85E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.84E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.83E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.81E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.78E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.77E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.76E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.74E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.73E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.71E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.69E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.67E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.66E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.64E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.63E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.62E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.59E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.57E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.56E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.55E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.53E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.52E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.49E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.48E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.46E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.45E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.43E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.42E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.39E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.38E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.36E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.35E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.34E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.32E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.31E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.28E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.27E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.24E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.22E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.21E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.18E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.17E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.14E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.13E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.11E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~44,TO_NEGINF] --> [~1,~1] --> OK [0.0,TO_NEGINF] --> [0,0] --> OK [0.9E~43,TO_NEGINF] --> [0,0] --> OK [0.88E~43,TO_NEGINF] --> [0,0] --> OK [0.87E~43,TO_NEGINF] --> [0,0] --> OK [0.85E~43,TO_NEGINF] --> [0,0] --> OK [0.84E~43,TO_NEGINF] --> [0,0] --> OK [0.83E~43,TO_NEGINF] --> [0,0] --> OK [0.81E~43,TO_NEGINF] --> [0,0] --> OK [0.8E~43,TO_NEGINF] --> [0,0] --> OK [0.78E~43,TO_NEGINF] --> [0,0] --> OK [0.77E~43,TO_NEGINF] --> [0,0] --> OK [0.76E~43,TO_NEGINF] --> [0,0] --> OK [0.74E~43,TO_NEGINF] --> [0,0] --> OK [0.73E~43,TO_NEGINF] --> [0,0] --> OK [0.71E~43,TO_NEGINF] --> [0,0] --> OK [0.7E~43,TO_NEGINF] --> [0,0] --> OK [0.69E~43,TO_NEGINF] --> [0,0] --> OK [0.67E~43,TO_NEGINF] --> [0,0] --> OK [0.66E~43,TO_NEGINF] --> [0,0] --> OK [0.64E~43,TO_NEGINF] --> [0,0] --> OK [0.63E~43,TO_NEGINF] --> [0,0] --> OK [0.62E~43,TO_NEGINF] --> [0,0] --> OK [0.6E~43,TO_NEGINF] --> [0,0] --> OK [0.59E~43,TO_NEGINF] --> [0,0] --> OK [0.57E~43,TO_NEGINF] --> [0,0] --> OK [0.56E~43,TO_NEGINF] --> [0,0] --> OK [0.55E~43,TO_NEGINF] --> [0,0] --> OK [0.53E~43,TO_NEGINF] --> [0,0] --> OK [0.52E~43,TO_NEGINF] --> [0,0] --> OK [0.5E~43,TO_NEGINF] --> [0,0] --> OK [0.49E~43,TO_NEGINF] --> [0,0] --> OK [0.48E~43,TO_NEGINF] --> [0,0] --> OK [0.46E~43,TO_NEGINF] --> [0,0] --> OK [0.45E~43,TO_NEGINF] --> [0,0] --> OK [0.43E~43,TO_NEGINF] --> [0,0] --> OK [0.42E~43,TO_NEGINF] --> [0,0] --> OK [0.4E~43,TO_NEGINF] --> [0,0] --> OK [0.39E~43,TO_NEGINF] --> [0,0] --> OK [0.38E~43,TO_NEGINF] --> [0,0] --> OK [0.36E~43,TO_NEGINF] --> [0,0] --> OK [0.35E~43,TO_NEGINF] --> [0,0] --> OK [0.34E~43,TO_NEGINF] --> [0,0] --> OK [0.32E~43,TO_NEGINF] --> [0,0] --> OK [0.31E~43,TO_NEGINF] --> [0,0] --> OK [0.3E~43,TO_NEGINF] --> [0,0] --> OK [0.28E~43,TO_NEGINF] --> [0,0] --> OK [0.27E~43,TO_NEGINF] --> [0,0] --> OK [0.25E~43,TO_NEGINF] --> [0,0] --> OK [0.24E~43,TO_NEGINF] --> [0,0] --> OK [0.22E~43,TO_NEGINF] --> [0,0] --> OK [0.21E~43,TO_NEGINF] --> [0,0] --> OK [0.2E~43,TO_NEGINF] --> [0,0] --> OK [0.18E~43,TO_NEGINF] --> [0,0] --> OK [0.17E~43,TO_NEGINF] --> [0,0] --> OK [0.15E~43,TO_NEGINF] --> [0,0] --> OK [0.14E~43,TO_NEGINF] --> [0,0] --> OK [0.13E~43,TO_NEGINF] --> [0,0] --> OK [0.11E~43,TO_NEGINF] --> [0,0] --> OK [0.1E~43,TO_NEGINF] --> [0,0] --> OK [0.8E~44,TO_NEGINF] --> [0,0] --> OK [0.7E~44,TO_NEGINF] --> [0,0] --> OK [0.6E~44,TO_NEGINF] --> [0,0] --> OK [0.4E~44,TO_NEGINF] --> [0,0] --> OK [0.3E~44,TO_NEGINF] --> [0,0] --> OK [0.1E~44,TO_NEGINF] --> [0,0] --> OK [0.9999962,TO_NEGINF] --> [0,0] --> OK [0.99999624,TO_NEGINF] --> [0,0] --> OK [0.9999963,TO_NEGINF] --> [0,0] --> OK [0.99999636,TO_NEGINF] --> [0,0] --> OK [0.9999964,TO_NEGINF] --> [0,0] --> OK [0.9999965,TO_NEGINF] --> [0,0] --> OK [0.99999654,TO_NEGINF] --> [0,0] --> OK [0.9999966,TO_NEGINF] --> [0,0] --> OK [0.99999666,TO_NEGINF] --> [0,0] --> OK [0.9999967,TO_NEGINF] --> [0,0] --> OK [0.9999968,TO_NEGINF] --> [0,0] --> OK [0.99999684,TO_NEGINF] --> [0,0] --> OK [0.9999969,TO_NEGINF] --> [0,0] --> OK [0.99999696,TO_NEGINF] --> [0,0] --> OK [0.999997,TO_NEGINF] --> [0,0] --> OK [0.9999971,TO_NEGINF] --> [0,0] --> OK [0.99999714,TO_NEGINF] --> [0,0] --> OK [0.9999972,TO_NEGINF] --> [0,0] --> OK [0.99999726,TO_NEGINF] --> [0,0] --> OK [0.9999973,TO_NEGINF] --> [0,0] --> OK [0.9999974,TO_NEGINF] --> [0,0] --> OK [0.99999744,TO_NEGINF] --> [0,0] --> OK [0.9999975,TO_NEGINF] --> [0,0] --> OK [0.99999756,TO_NEGINF] --> [0,0] --> OK [0.9999976,TO_NEGINF] --> [0,0] --> OK [0.9999977,TO_NEGINF] --> [0,0] --> OK [0.99999774,TO_NEGINF] --> [0,0] --> OK [0.9999978,TO_NEGINF] --> [0,0] --> OK [0.99999785,TO_NEGINF] --> [0,0] --> OK [0.9999979,TO_NEGINF] --> [0,0] --> OK [0.999998,TO_NEGINF] --> [0,0] --> OK [0.99999803,TO_NEGINF] --> [0,0] --> OK [0.9999981,TO_NEGINF] --> [0,0] --> OK [0.99999815,TO_NEGINF] --> [0,0] --> OK [0.9999982,TO_NEGINF] --> [0,0] --> OK [0.9999983,TO_NEGINF] --> [0,0] --> OK [0.99999833,TO_NEGINF] --> [0,0] --> OK [0.9999984,TO_NEGINF] --> [0,0] --> OK [0.99999845,TO_NEGINF] --> [0,0] --> OK [0.9999985,TO_NEGINF] --> [0,0] --> OK [0.99999857,TO_NEGINF] --> [0,0] --> OK [0.9999986,TO_NEGINF] --> [0,0] --> OK [0.9999987,TO_NEGINF] --> [0,0] --> OK [0.99999875,TO_NEGINF] --> [0,0] --> OK [0.9999988,TO_NEGINF] --> [0,0] --> OK [0.99999887,TO_NEGINF] --> [0,0] --> OK [0.9999989,TO_NEGINF] --> [0,0] --> OK [0.999999,TO_NEGINF] --> [0,0] --> OK [0.99999905,TO_NEGINF] --> [0,0] --> OK [0.9999991,TO_NEGINF] --> [0,0] --> OK [0.99999917,TO_NEGINF] --> [0,0] --> OK [0.9999992,TO_NEGINF] --> [0,0] --> OK [0.9999993,TO_NEGINF] --> [0,0] --> OK [0.99999934,TO_NEGINF] --> [0,0] --> OK [0.9999994,TO_NEGINF] --> [0,0] --> OK [0.99999946,TO_NEGINF] --> [0,0] --> OK [0.9999995,TO_NEGINF] --> [0,0] --> OK [0.9999996,TO_NEGINF] --> [0,0] --> OK [0.99999964,TO_NEGINF] --> [0,0] --> OK [0.9999997,TO_NEGINF] --> [0,0] --> OK [0.99999976,TO_NEGINF] --> [0,0] --> OK [0.9999998,TO_NEGINF] --> [0,0] --> OK [0.9999999,TO_NEGINF] --> [0,0] --> OK [0.99999994,TO_NEGINF] --> [0,0] --> OK [0.1E1,TO_NEGINF] --> [1,1] --> OK [0.10000076E1,TO_NEGINF] --> [1,1] --> OK [0.10000075E1,TO_NEGINF] --> [1,1] --> OK [0.10000074E1,TO_NEGINF] --> [1,1] --> OK [0.10000073E1,TO_NEGINF] --> [1,1] --> OK [0.10000072E1,TO_NEGINF] --> [1,1] --> OK [0.1000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000069E1,TO_NEGINF] --> [1,1] --> OK [0.10000068E1,TO_NEGINF] --> [1,1] --> OK [0.10000067E1,TO_NEGINF] --> [1,1] --> OK [0.10000066E1,TO_NEGINF] --> [1,1] --> OK [0.10000064E1,TO_NEGINF] --> [1,1] --> OK [0.10000063E1,TO_NEGINF] --> [1,1] --> OK [0.10000062E1,TO_NEGINF] --> [1,1] --> OK [0.10000061E1,TO_NEGINF] --> [1,1] --> OK [0.1000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000058E1,TO_NEGINF] --> [1,1] --> OK [0.10000057E1,TO_NEGINF] --> [1,1] --> OK [0.10000056E1,TO_NEGINF] --> [1,1] --> OK [0.10000055E1,TO_NEGINF] --> [1,1] --> OK [0.10000054E1,TO_NEGINF] --> [1,1] --> OK [0.10000052E1,TO_NEGINF] --> [1,1] --> OK [0.10000051E1,TO_NEGINF] --> [1,1] --> OK [0.1000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000049E1,TO_NEGINF] --> [1,1] --> OK [0.10000048E1,TO_NEGINF] --> [1,1] --> OK [0.10000046E1,TO_NEGINF] --> [1,1] --> OK [0.10000045E1,TO_NEGINF] --> [1,1] --> OK [0.10000044E1,TO_NEGINF] --> [1,1] --> OK [0.10000043E1,TO_NEGINF] --> [1,1] --> OK [0.10000042E1,TO_NEGINF] --> [1,1] --> OK [0.1000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000039E1,TO_NEGINF] --> [1,1] --> OK [0.10000038E1,TO_NEGINF] --> [1,1] --> OK [0.10000037E1,TO_NEGINF] --> [1,1] --> OK [0.10000036E1,TO_NEGINF] --> [1,1] --> OK [0.10000035E1,TO_NEGINF] --> [1,1] --> OK [0.10000033E1,TO_NEGINF] --> [1,1] --> OK [0.10000032E1,TO_NEGINF] --> [1,1] --> OK [0.10000031E1,TO_NEGINF] --> [1,1] --> OK [0.1000003E1,TO_NEGINF] --> [1,1] --> OK [0.10000029E1,TO_NEGINF] --> [1,1] --> OK [0.10000027E1,TO_NEGINF] --> [1,1] --> OK [0.10000026E1,TO_NEGINF] --> [1,1] --> OK [0.10000025E1,TO_NEGINF] --> [1,1] --> OK [0.10000024E1,TO_NEGINF] --> [1,1] --> OK [0.10000023E1,TO_NEGINF] --> [1,1] --> OK [0.10000021E1,TO_NEGINF] --> [1,1] --> OK [0.1000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000019E1,TO_NEGINF] --> [1,1] --> OK [0.10000018E1,TO_NEGINF] --> [1,1] --> OK [0.10000017E1,TO_NEGINF] --> [1,1] --> OK [0.10000015E1,TO_NEGINF] --> [1,1] --> OK [0.10000014E1,TO_NEGINF] --> [1,1] --> OK [0.10000013E1,TO_NEGINF] --> [1,1] --> OK [0.10000012E1,TO_NEGINF] --> [1,1] --> OK [0.10000011E1,TO_NEGINF] --> [1,1] --> OK [0.1000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000008E1,TO_NEGINF] --> [1,1] --> OK [0.10000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000001E1,TO_NEGINF] --> [1,1] --> OK [0.19999924E1,TO_NEGINF] --> [1,1] --> OK [0.19999925E1,TO_NEGINF] --> [1,1] --> OK [0.19999926E1,TO_NEGINF] --> [1,1] --> OK [0.19999927E1,TO_NEGINF] --> [1,1] --> OK [0.19999928E1,TO_NEGINF] --> [1,1] --> OK [0.1999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999931E1,TO_NEGINF] --> [1,1] --> OK [0.19999932E1,TO_NEGINF] --> [1,1] --> OK [0.19999933E1,TO_NEGINF] --> [1,1] --> OK [0.19999934E1,TO_NEGINF] --> [1,1] --> OK [0.19999936E1,TO_NEGINF] --> [1,1] --> OK [0.19999937E1,TO_NEGINF] --> [1,1] --> OK [0.19999938E1,TO_NEGINF] --> [1,1] --> OK [0.19999939E1,TO_NEGINF] --> [1,1] --> OK [0.1999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999942E1,TO_NEGINF] --> [1,1] --> OK [0.19999943E1,TO_NEGINF] --> [1,1] --> OK [0.19999944E1,TO_NEGINF] --> [1,1] --> OK [0.19999945E1,TO_NEGINF] --> [1,1] --> OK [0.19999946E1,TO_NEGINF] --> [1,1] --> OK [0.19999948E1,TO_NEGINF] --> [1,1] --> OK [0.19999949E1,TO_NEGINF] --> [1,1] --> OK [0.1999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999951E1,TO_NEGINF] --> [1,1] --> OK [0.19999952E1,TO_NEGINF] --> [1,1] --> OK [0.19999954E1,TO_NEGINF] --> [1,1] --> OK [0.19999955E1,TO_NEGINF] --> [1,1] --> OK [0.19999956E1,TO_NEGINF] --> [1,1] --> OK [0.19999957E1,TO_NEGINF] --> [1,1] --> OK [0.19999958E1,TO_NEGINF] --> [1,1] --> OK [0.1999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999961E1,TO_NEGINF] --> [1,1] --> OK [0.19999962E1,TO_NEGINF] --> [1,1] --> OK [0.19999963E1,TO_NEGINF] --> [1,1] --> OK [0.19999964E1,TO_NEGINF] --> [1,1] --> OK [0.19999965E1,TO_NEGINF] --> [1,1] --> OK [0.19999967E1,TO_NEGINF] --> [1,1] --> OK [0.19999968E1,TO_NEGINF] --> [1,1] --> OK [0.19999969E1,TO_NEGINF] --> [1,1] --> OK [0.1999997E1,TO_NEGINF] --> [1,1] --> OK [0.19999971E1,TO_NEGINF] --> [1,1] --> OK [0.19999973E1,TO_NEGINF] --> [1,1] --> OK [0.19999974E1,TO_NEGINF] --> [1,1] --> OK [0.19999975E1,TO_NEGINF] --> [1,1] --> OK [0.19999976E1,TO_NEGINF] --> [1,1] --> OK [0.19999977E1,TO_NEGINF] --> [1,1] --> OK [0.19999979E1,TO_NEGINF] --> [1,1] --> OK [0.1999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999981E1,TO_NEGINF] --> [1,1] --> OK [0.19999982E1,TO_NEGINF] --> [1,1] --> OK [0.19999983E1,TO_NEGINF] --> [1,1] --> OK [0.19999985E1,TO_NEGINF] --> [1,1] --> OK [0.19999986E1,TO_NEGINF] --> [1,1] --> OK [0.19999987E1,TO_NEGINF] --> [1,1] --> OK [0.19999988E1,TO_NEGINF] --> [1,1] --> OK [0.19999989E1,TO_NEGINF] --> [1,1] --> OK [0.1999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999992E1,TO_NEGINF] --> [1,1] --> OK [0.19999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999999E1,TO_NEGINF] --> [1,1] --> OK [0.2E1,TO_NEGINF] --> [2,2] --> OK [0.20000153E1,TO_NEGINF] --> [2,2] --> OK [0.2000015E1,TO_NEGINF] --> [2,2] --> OK [0.20000148E1,TO_NEGINF] --> [2,2] --> OK [0.20000145E1,TO_NEGINF] --> [2,2] --> OK [0.20000143E1,TO_NEGINF] --> [2,2] --> OK [0.2000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000138E1,TO_NEGINF] --> [2,2] --> OK [0.20000136E1,TO_NEGINF] --> [2,2] --> OK [0.20000134E1,TO_NEGINF] --> [2,2] --> OK [0.2000013E1,TO_NEGINF] --> [2,2] --> OK [0.20000129E1,TO_NEGINF] --> [2,2] --> OK [0.20000126E1,TO_NEGINF] --> [2,2] --> OK [0.20000124E1,TO_NEGINF] --> [2,2] --> OK [0.20000122E1,TO_NEGINF] --> [2,2] --> OK [0.2000012E1,TO_NEGINF] --> [2,2] --> OK [0.20000117E1,TO_NEGINF] --> [2,2] --> OK [0.20000114E1,TO_NEGINF] --> [2,2] --> OK [0.20000112E1,TO_NEGINF] --> [2,2] --> OK [0.2000011E1,TO_NEGINF] --> [2,2] --> OK [0.20000107E1,TO_NEGINF] --> [2,2] --> OK [0.20000105E1,TO_NEGINF] --> [2,2] --> OK [0.20000103E1,TO_NEGINF] --> [2,2] --> OK [0.200001E1,TO_NEGINF] --> [2,2] --> OK [0.20000098E1,TO_NEGINF] --> [2,2] --> OK [0.20000095E1,TO_NEGINF] --> [2,2] --> OK [0.20000093E1,TO_NEGINF] --> [2,2] --> OK [0.2000009E1,TO_NEGINF] --> [2,2] --> OK [0.20000088E1,TO_NEGINF] --> [2,2] --> OK [0.20000086E1,TO_NEGINF] --> [2,2] --> OK [0.20000083E1,TO_NEGINF] --> [2,2] --> OK [0.2000008E1,TO_NEGINF] --> [2,2] --> OK [0.20000079E1,TO_NEGINF] --> [2,2] --> OK [0.20000076E1,TO_NEGINF] --> [2,2] --> OK [0.20000074E1,TO_NEGINF] --> [2,2] --> OK [0.20000072E1,TO_NEGINF] --> [2,2] --> OK [0.2000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000067E1,TO_NEGINF] --> [2,2] --> OK [0.20000064E1,TO_NEGINF] --> [2,2] --> OK [0.20000062E1,TO_NEGINF] --> [2,2] --> OK [0.2000006E1,TO_NEGINF] --> [2,2] --> OK [0.20000057E1,TO_NEGINF] --> [2,2] --> OK [0.20000055E1,TO_NEGINF] --> [2,2] --> OK [0.20000052E1,TO_NEGINF] --> [2,2] --> OK [0.2000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000048E1,TO_NEGINF] --> [2,2] --> OK [0.20000045E1,TO_NEGINF] --> [2,2] --> OK [0.20000043E1,TO_NEGINF] --> [2,2] --> OK [0.2000004E1,TO_NEGINF] --> [2,2] --> OK [0.20000038E1,TO_NEGINF] --> [2,2] --> OK [0.20000036E1,TO_NEGINF] --> [2,2] --> OK [0.20000033E1,TO_NEGINF] --> [2,2] --> OK [0.2000003E1,TO_NEGINF] --> [2,2] --> OK [0.20000029E1,TO_NEGINF] --> [2,2] --> OK [0.20000026E1,TO_NEGINF] --> [2,2] --> OK [0.20000024E1,TO_NEGINF] --> [2,2] --> OK [0.20000021E1,TO_NEGINF] --> [2,2] --> OK [0.2000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000017E1,TO_NEGINF] --> [2,2] --> OK [0.20000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000012E1,TO_NEGINF] --> [2,2] --> OK [0.2000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000002E1,TO_NEGINF] --> [2,2] --> OK [0.29999847E1,TO_NEGINF] --> [2,2] --> OK [0.2999985E1,TO_NEGINF] --> [2,2] --> OK [0.29999852E1,TO_NEGINF] --> [2,2] --> OK [0.29999855E1,TO_NEGINF] --> [2,2] --> OK [0.29999857E1,TO_NEGINF] --> [2,2] --> OK [0.2999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999862E1,TO_NEGINF] --> [2,2] --> OK [0.29999864E1,TO_NEGINF] --> [2,2] --> OK [0.29999866E1,TO_NEGINF] --> [2,2] --> OK [0.2999987E1,TO_NEGINF] --> [2,2] --> OK [0.29999871E1,TO_NEGINF] --> [2,2] --> OK [0.29999874E1,TO_NEGINF] --> [2,2] --> OK [0.29999876E1,TO_NEGINF] --> [2,2] --> OK [0.29999878E1,TO_NEGINF] --> [2,2] --> OK [0.2999988E1,TO_NEGINF] --> [2,2] --> OK [0.29999883E1,TO_NEGINF] --> [2,2] --> OK [0.29999886E1,TO_NEGINF] --> [2,2] --> OK [0.29999888E1,TO_NEGINF] --> [2,2] --> OK [0.2999989E1,TO_NEGINF] --> [2,2] --> OK [0.29999893E1,TO_NEGINF] --> [2,2] --> OK [0.29999895E1,TO_NEGINF] --> [2,2] --> OK [0.29999897E1,TO_NEGINF] --> [2,2] --> OK [0.299999E1,TO_NEGINF] --> [2,2] --> OK [0.29999902E1,TO_NEGINF] --> [2,2] --> OK [0.29999905E1,TO_NEGINF] --> [2,2] --> OK [0.29999907E1,TO_NEGINF] --> [2,2] --> OK [0.2999991E1,TO_NEGINF] --> [2,2] --> OK [0.29999912E1,TO_NEGINF] --> [2,2] --> OK [0.29999914E1,TO_NEGINF] --> [2,2] --> OK [0.29999917E1,TO_NEGINF] --> [2,2] --> OK [0.2999992E1,TO_NEGINF] --> [2,2] --> OK [0.29999921E1,TO_NEGINF] --> [2,2] --> OK [0.29999924E1,TO_NEGINF] --> [2,2] --> OK [0.29999926E1,TO_NEGINF] --> [2,2] --> OK [0.29999928E1,TO_NEGINF] --> [2,2] --> OK [0.2999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999933E1,TO_NEGINF] --> [2,2] --> OK [0.29999936E1,TO_NEGINF] --> [2,2] --> OK [0.29999938E1,TO_NEGINF] --> [2,2] --> OK [0.2999994E1,TO_NEGINF] --> [2,2] --> OK [0.29999943E1,TO_NEGINF] --> [2,2] --> OK [0.29999945E1,TO_NEGINF] --> [2,2] --> OK [0.29999948E1,TO_NEGINF] --> [2,2] --> OK [0.2999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999952E1,TO_NEGINF] --> [2,2] --> OK [0.29999955E1,TO_NEGINF] --> [2,2] --> OK [0.29999957E1,TO_NEGINF] --> [2,2] --> OK [0.2999996E1,TO_NEGINF] --> [2,2] --> OK [0.29999962E1,TO_NEGINF] --> [2,2] --> OK [0.29999964E1,TO_NEGINF] --> [2,2] --> OK [0.29999967E1,TO_NEGINF] --> [2,2] --> OK [0.2999997E1,TO_NEGINF] --> [2,2] --> OK [0.29999971E1,TO_NEGINF] --> [2,2] --> OK [0.29999974E1,TO_NEGINF] --> [2,2] --> OK [0.29999976E1,TO_NEGINF] --> [2,2] --> OK [0.29999979E1,TO_NEGINF] --> [2,2] --> OK [0.2999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999983E1,TO_NEGINF] --> [2,2] --> OK [0.29999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999988E1,TO_NEGINF] --> [2,2] --> OK [0.2999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999998E1,TO_NEGINF] --> [2,2] --> OK [0.3E1,TO_NEGINF] --> [3,3] --> OK [0.30000153E1,TO_NEGINF] --> [3,3] --> OK [0.3000015E1,TO_NEGINF] --> [3,3] --> OK [0.30000148E1,TO_NEGINF] --> [3,3] --> OK [0.30000145E1,TO_NEGINF] --> [3,3] --> OK [0.30000143E1,TO_NEGINF] --> [3,3] --> OK [0.3000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000138E1,TO_NEGINF] --> [3,3] --> OK [0.30000136E1,TO_NEGINF] --> [3,3] --> OK [0.30000134E1,TO_NEGINF] --> [3,3] --> OK [0.3000013E1,TO_NEGINF] --> [3,3] --> OK [0.30000129E1,TO_NEGINF] --> [3,3] --> OK [0.30000126E1,TO_NEGINF] --> [3,3] --> OK [0.30000124E1,TO_NEGINF] --> [3,3] --> OK [0.30000122E1,TO_NEGINF] --> [3,3] --> OK [0.3000012E1,TO_NEGINF] --> [3,3] --> OK [0.30000117E1,TO_NEGINF] --> [3,3] --> OK [0.30000114E1,TO_NEGINF] --> [3,3] --> OK [0.30000112E1,TO_NEGINF] --> [3,3] --> OK [0.3000011E1,TO_NEGINF] --> [3,3] --> OK [0.30000107E1,TO_NEGINF] --> [3,3] --> OK [0.30000105E1,TO_NEGINF] --> [3,3] --> OK [0.30000103E1,TO_NEGINF] --> [3,3] --> OK [0.300001E1,TO_NEGINF] --> [3,3] --> OK [0.30000098E1,TO_NEGINF] --> [3,3] --> OK [0.30000095E1,TO_NEGINF] --> [3,3] --> OK [0.30000093E1,TO_NEGINF] --> [3,3] --> OK [0.3000009E1,TO_NEGINF] --> [3,3] --> OK [0.30000088E1,TO_NEGINF] --> [3,3] --> OK [0.30000086E1,TO_NEGINF] --> [3,3] --> OK [0.30000083E1,TO_NEGINF] --> [3,3] --> OK [0.3000008E1,TO_NEGINF] --> [3,3] --> OK [0.30000079E1,TO_NEGINF] --> [3,3] --> OK [0.30000076E1,TO_NEGINF] --> [3,3] --> OK [0.30000074E1,TO_NEGINF] --> [3,3] --> OK [0.30000072E1,TO_NEGINF] --> [3,3] --> OK [0.3000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000067E1,TO_NEGINF] --> [3,3] --> OK [0.30000064E1,TO_NEGINF] --> [3,3] --> OK [0.30000062E1,TO_NEGINF] --> [3,3] --> OK [0.3000006E1,TO_NEGINF] --> [3,3] --> OK [0.30000057E1,TO_NEGINF] --> [3,3] --> OK [0.30000055E1,TO_NEGINF] --> [3,3] --> OK [0.30000052E1,TO_NEGINF] --> [3,3] --> OK [0.3000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000048E1,TO_NEGINF] --> [3,3] --> OK [0.30000045E1,TO_NEGINF] --> [3,3] --> OK [0.30000043E1,TO_NEGINF] --> [3,3] --> OK [0.3000004E1,TO_NEGINF] --> [3,3] --> OK [0.30000038E1,TO_NEGINF] --> [3,3] --> OK [0.30000036E1,TO_NEGINF] --> [3,3] --> OK [0.30000033E1,TO_NEGINF] --> [3,3] --> OK [0.3000003E1,TO_NEGINF] --> [3,3] --> OK [0.30000029E1,TO_NEGINF] --> [3,3] --> OK [0.30000026E1,TO_NEGINF] --> [3,3] --> OK [0.30000024E1,TO_NEGINF] --> [3,3] --> OK [0.30000021E1,TO_NEGINF] --> [3,3] --> OK [0.3000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000017E1,TO_NEGINF] --> [3,3] --> OK [0.30000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000012E1,TO_NEGINF] --> [3,3] --> OK [0.3000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000002E1,TO_NEGINF] --> [3,3] --> OK [0.10737377E10,TO_NEGINF] --> [1073737728,1073737728] --> OK [0.10737378E10,TO_NEGINF] --> [1073737792,1073737792] --> OK [0.107373786E10,TO_NEGINF] --> [1073737856,1073737856] --> OK [0.10737379E10,TO_NEGINF] --> [1073737920,1073737920] --> OK [0.1073738E10,TO_NEGINF] --> [1073737984,1073737984] --> OK [0.107373805E10,TO_NEGINF] --> [1073738048,1073738048] --> OK [0.10737381E10,TO_NEGINF] --> [1073738112,1073738112] --> OK [0.10737382E10,TO_NEGINF] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_NEGINF] --> [1073738240,1073738240] --> OK [0.10737383E10,TO_NEGINF] --> [1073738304,1073738304] --> OK [0.10737384E10,TO_NEGINF] --> [1073738368,1073738368] --> OK [0.107373843E10,TO_NEGINF] --> [1073738432,1073738432] --> OK [0.10737385E10,TO_NEGINF] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_NEGINF] --> [1073738560,1073738560] --> OK [0.10737386E10,TO_NEGINF] --> [1073738624,1073738624] --> OK [0.10737387E10,TO_NEGINF] --> [1073738688,1073738688] --> OK [0.107373875E10,TO_NEGINF] --> [1073738752,1073738752] --> OK [0.10737388E10,TO_NEGINF] --> [1073738816,1073738816] --> OK [0.10737389E10,TO_NEGINF] --> [1073738880,1073738880] --> OK [0.107373894E10,TO_NEGINF] --> [1073738944,1073738944] --> OK [0.1073739E10,TO_NEGINF] --> [1073739008,1073739008] --> OK [0.10737391E10,TO_NEGINF] --> [1073739072,1073739072] --> OK [0.107373914E10,TO_NEGINF] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_NEGINF] --> [1073739200,1073739200] --> OK [0.107373926E10,TO_NEGINF] --> [1073739264,1073739264] --> OK [0.10737393E10,TO_NEGINF] --> [1073739328,1073739328] --> OK [0.10737394E10,TO_NEGINF] --> [1073739392,1073739392] --> OK [0.107373946E10,TO_NEGINF] --> [1073739456,1073739456] --> OK [0.10737395E10,TO_NEGINF] --> [1073739520,1073739520] --> OK [0.10737396E10,TO_NEGINF] --> [1073739584,1073739584] --> OK [0.107373965E10,TO_NEGINF] --> [1073739648,1073739648] --> OK [0.10737397E10,TO_NEGINF] --> [1073739712,1073739712] --> OK [0.10737398E10,TO_NEGINF] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_NEGINF] --> [1073739840,1073739840] --> OK [0.10737399E10,TO_NEGINF] --> [1073739904,1073739904] --> OK [0.107373997E10,TO_NEGINF] --> [1073739968,1073739968] --> OK [0.107374E10,TO_NEGINF] --> [1073740032,1073740032] --> OK [0.10737401E10,TO_NEGINF] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_NEGINF] --> [1073740160,1073740160] --> OK [0.10737402E10,TO_NEGINF] --> [1073740224,1073740224] --> OK [0.10737403E10,TO_NEGINF] --> [1073740288,1073740288] --> OK [0.107374035E10,TO_NEGINF] --> [1073740352,1073740352] --> OK [0.10737404E10,TO_NEGINF] --> [1073740416,1073740416] --> OK [0.10737405E10,TO_NEGINF] --> [1073740480,1073740480] --> OK [0.107374054E10,TO_NEGINF] --> [1073740544,1073740544] --> OK [0.10737406E10,TO_NEGINF] --> [1073740608,1073740608] --> OK [0.10737407E10,TO_NEGINF] --> [1073740672,1073740672] --> OK [0.107374074E10,TO_NEGINF] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_NEGINF] --> [1073740800,1073740800] --> OK [0.107374086E10,TO_NEGINF] --> [1073740864,1073740864] --> OK [0.10737409E10,TO_NEGINF] --> [1073740928,1073740928] --> OK [0.1073741E10,TO_NEGINF] --> [1073740992,1073740992] --> OK [0.107374106E10,TO_NEGINF] --> [1073741056,1073741056] --> OK [0.10737411E10,TO_NEGINF] --> [1073741120,1073741120] --> OK [0.10737412E10,TO_NEGINF] --> [1073741184,1073741184] --> OK [0.107374125E10,TO_NEGINF] --> [1073741248,1073741248] --> OK [0.10737413E10,TO_NEGINF] --> [1073741312,1073741312] --> OK [0.10737414E10,TO_NEGINF] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_NEGINF] --> [1073741440,1073741440] --> OK [0.10737415E10,TO_NEGINF] --> [1073741504,1073741504] --> OK [0.10737416E10,TO_NEGINF] --> [1073741568,1073741568] --> OK [0.107374163E10,TO_NEGINF] --> [1073741632,1073741632] --> OK [0.10737417E10,TO_NEGINF] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_NEGINF] --> [1073741760,1073741760] --> OK [0.10737418E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.107375E10,TO_NEGINF] --> [1073750016,1073750016] --> OK [0.10737499E10,TO_NEGINF] --> [1073749888,1073749888] --> OK [0.10737498E10,TO_NEGINF] --> [1073749760,1073749760] --> OK [0.10737496E10,TO_NEGINF] --> [1073749632,1073749632] --> OK [0.10737495E10,TO_NEGINF] --> [1073749504,1073749504] --> OK [0.10737494E10,TO_NEGINF] --> [1073749376,1073749376] --> OK [0.10737492E10,TO_NEGINF] --> [1073749248,1073749248] --> OK [0.10737491E10,TO_NEGINF] --> [1073749120,1073749120] --> OK [0.1073749E10,TO_NEGINF] --> [1073748992,1073748992] --> OK [0.10737489E10,TO_NEGINF] --> [1073748864,1073748864] --> OK [0.10737487E10,TO_NEGINF] --> [1073748736,1073748736] --> OK [0.10737486E10,TO_NEGINF] --> [1073748608,1073748608] --> OK [0.10737485E10,TO_NEGINF] --> [1073748480,1073748480] --> OK [0.10737484E10,TO_NEGINF] --> [1073748352,1073748352] --> OK [0.10737482E10,TO_NEGINF] --> [1073748224,1073748224] --> OK [0.10737481E10,TO_NEGINF] --> [1073748096,1073748096] --> OK [0.1073748E10,TO_NEGINF] --> [1073747968,1073747968] --> OK [0.10737478E10,TO_NEGINF] --> [1073747840,1073747840] --> OK [0.10737477E10,TO_NEGINF] --> [1073747712,1073747712] --> OK [0.10737476E10,TO_NEGINF] --> [1073747584,1073747584] --> OK [0.10737475E10,TO_NEGINF] --> [1073747456,1073747456] --> OK [0.10737473E10,TO_NEGINF] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_NEGINF] --> [1073747200,1073747200] --> OK [0.10737471E10,TO_NEGINF] --> [1073747072,1073747072] --> OK [0.1073747E10,TO_NEGINF] --> [1073746944,1073746944] --> OK [0.10737468E10,TO_NEGINF] --> [1073746816,1073746816] --> OK [0.10737467E10,TO_NEGINF] --> [1073746688,1073746688] --> OK [0.10737466E10,TO_NEGINF] --> [1073746560,1073746560] --> OK [0.10737464E10,TO_NEGINF] --> [1073746432,1073746432] --> OK [0.10737463E10,TO_NEGINF] --> [1073746304,1073746304] --> OK [0.10737462E10,TO_NEGINF] --> [1073746176,1073746176] --> OK [0.1073746E10,TO_NEGINF] --> [1073746048,1073746048] --> OK [0.10737459E10,TO_NEGINF] --> [1073745920,1073745920] --> OK [0.10737458E10,TO_NEGINF] --> [1073745792,1073745792] --> OK [0.10737457E10,TO_NEGINF] --> [1073745664,1073745664] --> OK [0.10737455E10,TO_NEGINF] --> [1073745536,1073745536] --> OK [0.10737454E10,TO_NEGINF] --> [1073745408,1073745408] --> OK [0.10737453E10,TO_NEGINF] --> [1073745280,1073745280] --> OK [0.10737452E10,TO_NEGINF] --> [1073745152,1073745152] --> OK [0.1073745E10,TO_NEGINF] --> [1073745024,1073745024] --> OK [0.10737449E10,TO_NEGINF] --> [1073744896,1073744896] --> OK [0.10737448E10,TO_NEGINF] --> [1073744768,1073744768] --> OK [0.10737446E10,TO_NEGINF] --> [1073744640,1073744640] --> OK [0.10737445E10,TO_NEGINF] --> [1073744512,1073744512] --> OK [0.10737444E10,TO_NEGINF] --> [1073744384,1073744384] --> OK [0.10737443E10,TO_NEGINF] --> [1073744256,1073744256] --> OK [0.10737441E10,TO_NEGINF] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_NEGINF] --> [1073744000,1073744000] --> OK [0.10737439E10,TO_NEGINF] --> [1073743872,1073743872] --> OK [0.10737437E10,TO_NEGINF] --> [1073743744,1073743744] --> OK [0.10737436E10,TO_NEGINF] --> [1073743616,1073743616] --> OK [0.10737435E10,TO_NEGINF] --> [1073743488,1073743488] --> OK [0.10737434E10,TO_NEGINF] --> [1073743360,1073743360] --> OK [0.10737432E10,TO_NEGINF] --> [1073743232,1073743232] --> OK [0.10737431E10,TO_NEGINF] --> [1073743104,1073743104] --> OK [0.1073743E10,TO_NEGINF] --> [1073742976,1073742976] --> OK [0.10737428E10,TO_NEGINF] --> [1073742848,1073742848] --> OK [0.10737427E10,TO_NEGINF] --> [1073742720,1073742720] --> OK [0.10737426E10,TO_NEGINF] --> [1073742592,1073742592] --> OK [0.10737425E10,TO_NEGINF] --> [1073742464,1073742464] --> OK [0.10737423E10,TO_NEGINF] --> [1073742336,1073742336] --> OK [0.10737422E10,TO_NEGINF] --> [1073742208,1073742208] --> OK [0.10737421E10,TO_NEGINF] --> [1073742080,1073742080] --> OK [0.1073742E10,TO_NEGINF] --> [1073741952,1073741952] --> OK [0.16106045E10,TO_NEGINF] --> [1610604544,1610604544] --> OK [0.16106047E10,TO_NEGINF] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_NEGINF] --> [1610604800,1610604800] --> OK [0.16106049E10,TO_NEGINF] --> [1610604928,1610604928] --> OK [0.1610605E10,TO_NEGINF] --> [1610605056,1610605056] --> OK [0.16106052E10,TO_NEGINF] --> [1610605184,1610605184] --> OK [0.16106053E10,TO_NEGINF] --> [1610605312,1610605312] --> OK [0.16106054E10,TO_NEGINF] --> [1610605440,1610605440] --> OK [0.16106056E10,TO_NEGINF] --> [1610605568,1610605568] --> OK [0.16106057E10,TO_NEGINF] --> [1610605696,1610605696] --> OK [0.16106058E10,TO_NEGINF] --> [1610605824,1610605824] --> OK [0.1610606E10,TO_NEGINF] --> [1610605952,1610605952] --> OK [0.16106061E10,TO_NEGINF] --> [1610606080,1610606080] --> OK [0.16106062E10,TO_NEGINF] --> [1610606208,1610606208] --> OK [0.16106063E10,TO_NEGINF] --> [1610606336,1610606336] --> OK [0.16106065E10,TO_NEGINF] --> [1610606464,1610606464] --> OK [0.16106066E10,TO_NEGINF] --> [1610606592,1610606592] --> OK [0.16106067E10,TO_NEGINF] --> [1610606720,1610606720] --> OK [0.16106068E10,TO_NEGINF] --> [1610606848,1610606848] --> OK [0.1610607E10,TO_NEGINF] --> [1610606976,1610606976] --> OK [0.16106071E10,TO_NEGINF] --> [1610607104,1610607104] --> OK [0.16106072E10,TO_NEGINF] --> [1610607232,1610607232] --> OK [0.16106074E10,TO_NEGINF] --> [1610607360,1610607360] --> OK [0.16106075E10,TO_NEGINF] --> [1610607488,1610607488] --> OK [0.16106076E10,TO_NEGINF] --> [1610607616,1610607616] --> OK [0.16106077E10,TO_NEGINF] --> [1610607744,1610607744] --> OK [0.16106079E10,TO_NEGINF] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_NEGINF] --> [1610608000,1610608000] --> OK [0.16106081E10,TO_NEGINF] --> [1610608128,1610608128] --> OK [0.16106083E10,TO_NEGINF] --> [1610608256,1610608256] --> OK [0.16106084E10,TO_NEGINF] --> [1610608384,1610608384] --> OK [0.16106085E10,TO_NEGINF] --> [1610608512,1610608512] --> OK [0.16106086E10,TO_NEGINF] --> [1610608640,1610608640] --> OK [0.16106088E10,TO_NEGINF] --> [1610608768,1610608768] --> OK [0.16106089E10,TO_NEGINF] --> [1610608896,1610608896] --> OK [0.1610609E10,TO_NEGINF] --> [1610609024,1610609024] --> OK [0.16106092E10,TO_NEGINF] --> [1610609152,1610609152] --> OK [0.16106093E10,TO_NEGINF] --> [1610609280,1610609280] --> OK [0.16106094E10,TO_NEGINF] --> [1610609408,1610609408] --> OK [0.16106095E10,TO_NEGINF] --> [1610609536,1610609536] --> OK [0.16106097E10,TO_NEGINF] --> [1610609664,1610609664] --> OK [0.16106098E10,TO_NEGINF] --> [1610609792,1610609792] --> OK [0.16106099E10,TO_NEGINF] --> [1610609920,1610609920] --> OK [0.161061E10,TO_NEGINF] --> [1610610048,1610610048] --> OK [0.16106102E10,TO_NEGINF] --> [1610610176,1610610176] --> OK [0.16106103E10,TO_NEGINF] --> [1610610304,1610610304] --> OK [0.16106104E10,TO_NEGINF] --> [1610610432,1610610432] --> OK [0.16106106E10,TO_NEGINF] --> [1610610560,1610610560] --> OK [0.16106107E10,TO_NEGINF] --> [1610610688,1610610688] --> OK [0.16106108E10,TO_NEGINF] --> [1610610816,1610610816] --> OK [0.1610611E10,TO_NEGINF] --> [1610610944,1610610944] --> OK [0.16106111E10,TO_NEGINF] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_NEGINF] --> [1610611200,1610611200] --> OK [0.16106113E10,TO_NEGINF] --> [1610611328,1610611328] --> OK [0.16106115E10,TO_NEGINF] --> [1610611456,1610611456] --> OK [0.16106116E10,TO_NEGINF] --> [1610611584,1610611584] --> OK [0.16106117E10,TO_NEGINF] --> [1610611712,1610611712] --> OK [0.16106118E10,TO_NEGINF] --> [1610611840,1610611840] --> OK [0.1610612E10,TO_NEGINF] --> [1610611968,1610611968] --> OK [0.16106121E10,TO_NEGINF] --> [1610612096,1610612096] --> OK [0.16106122E10,TO_NEGINF] --> [1610612224,1610612224] --> OK [0.16106124E10,TO_NEGINF] --> [1610612352,1610612352] --> OK [0.16106125E10,TO_NEGINF] --> [1610612480,1610612480] --> OK [0.16106126E10,TO_NEGINF] --> [1610612608,1610612608] --> OK [0.16106127E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106209E10,TO_NEGINF] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_NEGINF] --> [1610620800,1610620800] --> OK [0.16106207E10,TO_NEGINF] --> [1610620672,1610620672] --> OK [0.16106205E10,TO_NEGINF] --> [1610620544,1610620544] --> OK [0.16106204E10,TO_NEGINF] --> [1610620416,1610620416] --> OK [0.16106203E10,TO_NEGINF] --> [1610620288,1610620288] --> OK [0.16106202E10,TO_NEGINF] --> [1610620160,1610620160] --> OK [0.161062E10,TO_NEGINF] --> [1610620032,1610620032] --> OK [0.16106199E10,TO_NEGINF] --> [1610619904,1610619904] --> OK [0.16106198E10,TO_NEGINF] --> [1610619776,1610619776] --> OK [0.16106196E10,TO_NEGINF] --> [1610619648,1610619648] --> OK [0.16106195E10,TO_NEGINF] --> [1610619520,1610619520] --> OK [0.16106194E10,TO_NEGINF] --> [1610619392,1610619392] --> OK [0.16106193E10,TO_NEGINF] --> [1610619264,1610619264] --> OK [0.16106191E10,TO_NEGINF] --> [1610619136,1610619136] --> OK [0.1610619E10,TO_NEGINF] --> [1610619008,1610619008] --> OK [0.16106189E10,TO_NEGINF] --> [1610618880,1610618880] --> OK [0.16106188E10,TO_NEGINF] --> [1610618752,1610618752] --> OK [0.16106186E10,TO_NEGINF] --> [1610618624,1610618624] --> OK [0.16106185E10,TO_NEGINF] --> [1610618496,1610618496] --> OK [0.16106184E10,TO_NEGINF] --> [1610618368,1610618368] --> OK [0.16106182E10,TO_NEGINF] --> [1610618240,1610618240] --> OK [0.16106181E10,TO_NEGINF] --> [1610618112,1610618112] --> OK [0.1610618E10,TO_NEGINF] --> [1610617984,1610617984] --> OK [0.16106179E10,TO_NEGINF] --> [1610617856,1610617856] --> OK [0.16106177E10,TO_NEGINF] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_NEGINF] --> [1610617600,1610617600] --> OK [0.16106175E10,TO_NEGINF] --> [1610617472,1610617472] --> OK [0.16106173E10,TO_NEGINF] --> [1610617344,1610617344] --> OK [0.16106172E10,TO_NEGINF] --> [1610617216,1610617216] --> OK [0.16106171E10,TO_NEGINF] --> [1610617088,1610617088] --> OK [0.1610617E10,TO_NEGINF] --> [1610616960,1610616960] --> OK [0.16106168E10,TO_NEGINF] --> [1610616832,1610616832] --> OK [0.16106167E10,TO_NEGINF] --> [1610616704,1610616704] --> OK [0.16106166E10,TO_NEGINF] --> [1610616576,1610616576] --> OK [0.16106164E10,TO_NEGINF] --> [1610616448,1610616448] --> OK [0.16106163E10,TO_NEGINF] --> [1610616320,1610616320] --> OK [0.16106162E10,TO_NEGINF] --> [1610616192,1610616192] --> OK [0.1610616E10,TO_NEGINF] --> [1610616064,1610616064] --> OK [0.16106159E10,TO_NEGINF] --> [1610615936,1610615936] --> OK [0.16106158E10,TO_NEGINF] --> [1610615808,1610615808] --> OK [0.16106157E10,TO_NEGINF] --> [1610615680,1610615680] --> OK [0.16106156E10,TO_NEGINF] --> [1610615552,1610615552] --> OK [0.16106154E10,TO_NEGINF] --> [1610615424,1610615424] --> OK [0.16106153E10,TO_NEGINF] --> [1610615296,1610615296] --> OK [0.16106152E10,TO_NEGINF] --> [1610615168,1610615168] --> OK [0.1610615E10,TO_NEGINF] --> [1610615040,1610615040] --> OK [0.16106149E10,TO_NEGINF] --> [1610614912,1610614912] --> OK [0.16106148E10,TO_NEGINF] --> [1610614784,1610614784] --> OK [0.16106147E10,TO_NEGINF] --> [1610614656,1610614656] --> OK [0.16106145E10,TO_NEGINF] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_NEGINF] --> [1610614400,1610614400] --> OK [0.16106143E10,TO_NEGINF] --> [1610614272,1610614272] --> OK [0.16106141E10,TO_NEGINF] --> [1610614144,1610614144] --> OK [0.1610614E10,TO_NEGINF] --> [1610614016,1610614016] --> OK [0.16106139E10,TO_NEGINF] --> [1610613888,1610613888] --> OK [0.16106138E10,TO_NEGINF] --> [1610613760,1610613760] --> OK [0.16106136E10,TO_NEGINF] --> [1610613632,1610613632] --> OK [0.16106135E10,TO_NEGINF] --> [1610613504,1610613504] --> OK [0.16106134E10,TO_NEGINF] --> [1610613376,1610613376] --> OK [0.16106132E10,TO_NEGINF] --> [1610613248,1610613248] --> OK [0.16106131E10,TO_NEGINF] --> [1610613120,1610613120] --> OK [0.1610613E10,TO_NEGINF] --> [1610612992,1610612992] --> OK [0.16106129E10,TO_NEGINF] --> [1610612864,1610612864] --> OK [0.187904E10,TO_NEGINF] --> [1879040000,1879040000] --> OK [0.18790401E10,TO_NEGINF] --> [1879040128,1879040128] --> OK [0.18790403E10,TO_NEGINF] --> [1879040256,1879040256] --> OK [0.18790404E10,TO_NEGINF] --> [1879040384,1879040384] --> OK [0.18790405E10,TO_NEGINF] --> [1879040512,1879040512] --> OK [0.18790406E10,TO_NEGINF] --> [1879040640,1879040640] --> OK [0.18790408E10,TO_NEGINF] --> [1879040768,1879040768] --> OK [0.18790409E10,TO_NEGINF] --> [1879040896,1879040896] --> OK [0.1879041E10,TO_NEGINF] --> [1879041024,1879041024] --> OK [0.18790412E10,TO_NEGINF] --> [1879041152,1879041152] --> OK [0.18790413E10,TO_NEGINF] --> [1879041280,1879041280] --> OK [0.18790414E10,TO_NEGINF] --> [1879041408,1879041408] --> OK [0.18790415E10,TO_NEGINF] --> [1879041536,1879041536] --> OK [0.18790417E10,TO_NEGINF] --> [1879041664,1879041664] --> OK [0.18790418E10,TO_NEGINF] --> [1879041792,1879041792] --> OK [0.18790419E10,TO_NEGINF] --> [1879041920,1879041920] --> OK [0.1879042E10,TO_NEGINF] --> [1879042048,1879042048] --> OK [0.18790422E10,TO_NEGINF] --> [1879042176,1879042176] --> OK [0.18790423E10,TO_NEGINF] --> [1879042304,1879042304] --> OK [0.18790424E10,TO_NEGINF] --> [1879042432,1879042432] --> OK [0.18790426E10,TO_NEGINF] --> [1879042560,1879042560] --> OK [0.18790427E10,TO_NEGINF] --> [1879042688,1879042688] --> OK [0.18790428E10,TO_NEGINF] --> [1879042816,1879042816] --> OK [0.1879043E10,TO_NEGINF] --> [1879042944,1879042944] --> OK [0.18790431E10,TO_NEGINF] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_NEGINF] --> [1879043200,1879043200] --> OK [0.18790433E10,TO_NEGINF] --> [1879043328,1879043328] --> OK [0.18790435E10,TO_NEGINF] --> [1879043456,1879043456] --> OK [0.18790436E10,TO_NEGINF] --> [1879043584,1879043584] --> OK [0.18790437E10,TO_NEGINF] --> [1879043712,1879043712] --> OK [0.18790438E10,TO_NEGINF] --> [1879043840,1879043840] --> OK [0.1879044E10,TO_NEGINF] --> [1879043968,1879043968] --> OK [0.18790441E10,TO_NEGINF] --> [1879044096,1879044096] --> OK [0.18790442E10,TO_NEGINF] --> [1879044224,1879044224] --> OK [0.18790444E10,TO_NEGINF] --> [1879044352,1879044352] --> OK [0.18790445E10,TO_NEGINF] --> [1879044480,1879044480] --> OK [0.18790446E10,TO_NEGINF] --> [1879044608,1879044608] --> OK [0.18790447E10,TO_NEGINF] --> [1879044736,1879044736] --> OK [0.18790449E10,TO_NEGINF] --> [1879044864,1879044864] --> OK [0.1879045E10,TO_NEGINF] --> [1879044992,1879044992] --> OK [0.18790451E10,TO_NEGINF] --> [1879045120,1879045120] --> OK [0.18790452E10,TO_NEGINF] --> [1879045248,1879045248] --> OK [0.18790454E10,TO_NEGINF] --> [1879045376,1879045376] --> OK [0.18790455E10,TO_NEGINF] --> [1879045504,1879045504] --> OK [0.18790456E10,TO_NEGINF] --> [1879045632,1879045632] --> OK [0.18790458E10,TO_NEGINF] --> [1879045760,1879045760] --> OK [0.18790459E10,TO_NEGINF] --> [1879045888,1879045888] --> OK [0.1879046E10,TO_NEGINF] --> [1879046016,1879046016] --> OK [0.18790461E10,TO_NEGINF] --> [1879046144,1879046144] --> OK [0.18790463E10,TO_NEGINF] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_NEGINF] --> [1879046400,1879046400] --> OK [0.18790465E10,TO_NEGINF] --> [1879046528,1879046528] --> OK [0.18790467E10,TO_NEGINF] --> [1879046656,1879046656] --> OK [0.18790468E10,TO_NEGINF] --> [1879046784,1879046784] --> OK [0.18790469E10,TO_NEGINF] --> [1879046912,1879046912] --> OK [0.1879047E10,TO_NEGINF] --> [1879047040,1879047040] --> OK [0.18790472E10,TO_NEGINF] --> [1879047168,1879047168] --> OK [0.18790473E10,TO_NEGINF] --> [1879047296,1879047296] --> OK [0.18790474E10,TO_NEGINF] --> [1879047424,1879047424] --> OK [0.18790476E10,TO_NEGINF] --> [1879047552,1879047552] --> OK [0.18790477E10,TO_NEGINF] --> [1879047680,1879047680] --> OK [0.18790478E10,TO_NEGINF] --> [1879047808,1879047808] --> OK [0.1879048E10,TO_NEGINF] --> [1879047936,1879047936] --> OK [0.18790481E10,TO_NEGINF] --> [1879048064,1879048064] --> OK [0.18790482E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790564E10,TO_NEGINF] --> [1879056384,1879056384] --> OK [0.18790563E10,TO_NEGINF] --> [1879056256,1879056256] --> OK [0.18790561E10,TO_NEGINF] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_NEGINF] --> [1879056000,1879056000] --> OK [0.18790559E10,TO_NEGINF] --> [1879055872,1879055872] --> OK [0.18790557E10,TO_NEGINF] --> [1879055744,1879055744] --> OK [0.18790556E10,TO_NEGINF] --> [1879055616,1879055616] --> OK [0.18790555E10,TO_NEGINF] --> [1879055488,1879055488] --> OK [0.18790554E10,TO_NEGINF] --> [1879055360,1879055360] --> OK [0.18790552E10,TO_NEGINF] --> [1879055232,1879055232] --> OK [0.18790551E10,TO_NEGINF] --> [1879055104,1879055104] --> OK [0.1879055E10,TO_NEGINF] --> [1879054976,1879054976] --> OK [0.18790548E10,TO_NEGINF] --> [1879054848,1879054848] --> OK [0.18790547E10,TO_NEGINF] --> [1879054720,1879054720] --> OK [0.18790546E10,TO_NEGINF] --> [1879054592,1879054592] --> OK [0.18790545E10,TO_NEGINF] --> [1879054464,1879054464] --> OK [0.18790543E10,TO_NEGINF] --> [1879054336,1879054336] --> OK [0.18790542E10,TO_NEGINF] --> [1879054208,1879054208] --> OK [0.18790541E10,TO_NEGINF] --> [1879054080,1879054080] --> OK [0.1879054E10,TO_NEGINF] --> [1879053952,1879053952] --> OK [0.18790538E10,TO_NEGINF] --> [1879053824,1879053824] --> OK [0.18790537E10,TO_NEGINF] --> [1879053696,1879053696] --> OK [0.18790536E10,TO_NEGINF] --> [1879053568,1879053568] --> OK [0.18790534E10,TO_NEGINF] --> [1879053440,1879053440] --> OK [0.18790533E10,TO_NEGINF] --> [1879053312,1879053312] --> OK [0.18790532E10,TO_NEGINF] --> [1879053184,1879053184] --> OK [0.1879053E10,TO_NEGINF] --> [1879053056,1879053056] --> OK [0.18790529E10,TO_NEGINF] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_NEGINF] --> [1879052800,1879052800] --> OK [0.18790527E10,TO_NEGINF] --> [1879052672,1879052672] --> OK [0.18790525E10,TO_NEGINF] --> [1879052544,1879052544] --> OK [0.18790524E10,TO_NEGINF] --> [1879052416,1879052416] --> OK [0.18790523E10,TO_NEGINF] --> [1879052288,1879052288] --> OK [0.18790522E10,TO_NEGINF] --> [1879052160,1879052160] --> OK [0.1879052E10,TO_NEGINF] --> [1879052032,1879052032] --> OK [0.18790519E10,TO_NEGINF] --> [1879051904,1879051904] --> OK [0.18790518E10,TO_NEGINF] --> [1879051776,1879051776] --> OK [0.18790516E10,TO_NEGINF] --> [1879051648,1879051648] --> OK [0.18790515E10,TO_NEGINF] --> [1879051520,1879051520] --> OK [0.18790514E10,TO_NEGINF] --> [1879051392,1879051392] --> OK [0.18790513E10,TO_NEGINF] --> [1879051264,1879051264] --> OK [0.18790511E10,TO_NEGINF] --> [1879051136,1879051136] --> OK [0.1879051E10,TO_NEGINF] --> [1879051008,1879051008] --> OK [0.18790509E10,TO_NEGINF] --> [1879050880,1879050880] --> OK [0.18790508E10,TO_NEGINF] --> [1879050752,1879050752] --> OK [0.18790506E10,TO_NEGINF] --> [1879050624,1879050624] --> OK [0.18790505E10,TO_NEGINF] --> [1879050496,1879050496] --> OK [0.18790504E10,TO_NEGINF] --> [1879050368,1879050368] --> OK [0.18790502E10,TO_NEGINF] --> [1879050240,1879050240] --> OK [0.18790501E10,TO_NEGINF] --> [1879050112,1879050112] --> OK [0.187905E10,TO_NEGINF] --> [1879049984,1879049984] --> OK [0.18790499E10,TO_NEGINF] --> [1879049856,1879049856] --> OK [0.18790497E10,TO_NEGINF] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_NEGINF] --> [1879049600,1879049600] --> OK [0.18790495E10,TO_NEGINF] --> [1879049472,1879049472] --> OK [0.18790493E10,TO_NEGINF] --> [1879049344,1879049344] --> OK [0.18790492E10,TO_NEGINF] --> [1879049216,1879049216] --> OK [0.18790491E10,TO_NEGINF] --> [1879049088,1879049088] --> OK [0.1879049E10,TO_NEGINF] --> [1879048960,1879048960] --> OK [0.18790488E10,TO_NEGINF] --> [1879048832,1879048832] --> OK [0.18790487E10,TO_NEGINF] --> [1879048704,1879048704] --> OK [0.18790486E10,TO_NEGINF] --> [1879048576,1879048576] --> OK [0.18790484E10,TO_NEGINF] --> [1879048448,1879048448] --> OK [0.18790483E10,TO_NEGINF] --> [1879048320,1879048320] --> OK [0.20132577E10,TO_NEGINF] --> [2013257728,2013257728] --> OK [0.20132579E10,TO_NEGINF] --> [2013257856,2013257856] --> OK [0.2013258E10,TO_NEGINF] --> [2013257984,2013257984] --> OK [0.20132581E10,TO_NEGINF] --> [2013258112,2013258112] --> OK [0.20132582E10,TO_NEGINF] --> [2013258240,2013258240] --> OK [0.20132584E10,TO_NEGINF] --> [2013258368,2013258368] --> OK [0.20132585E10,TO_NEGINF] --> [2013258496,2013258496] --> OK [0.20132586E10,TO_NEGINF] --> [2013258624,2013258624] --> OK [0.20132588E10,TO_NEGINF] --> [2013258752,2013258752] --> OK [0.20132589E10,TO_NEGINF] --> [2013258880,2013258880] --> OK [0.2013259E10,TO_NEGINF] --> [2013259008,2013259008] --> OK [0.20132591E10,TO_NEGINF] --> [2013259136,2013259136] --> OK [0.20132593E10,TO_NEGINF] --> [2013259264,2013259264] --> OK [0.20132594E10,TO_NEGINF] --> [2013259392,2013259392] --> OK [0.20132595E10,TO_NEGINF] --> [2013259520,2013259520] --> OK [0.20132596E10,TO_NEGINF] --> [2013259648,2013259648] --> OK [0.20132598E10,TO_NEGINF] --> [2013259776,2013259776] --> OK [0.20132599E10,TO_NEGINF] --> [2013259904,2013259904] --> OK [0.201326E10,TO_NEGINF] --> [2013260032,2013260032] --> OK [0.20132602E10,TO_NEGINF] --> [2013260160,2013260160] --> OK [0.20132603E10,TO_NEGINF] --> [2013260288,2013260288] --> OK [0.20132604E10,TO_NEGINF] --> [2013260416,2013260416] --> OK [0.20132605E10,TO_NEGINF] --> [2013260544,2013260544] --> OK [0.20132607E10,TO_NEGINF] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_NEGINF] --> [2013260800,2013260800] --> OK [0.20132609E10,TO_NEGINF] --> [2013260928,2013260928] --> OK [0.2013261E10,TO_NEGINF] --> [2013261056,2013261056] --> OK [0.20132612E10,TO_NEGINF] --> [2013261184,2013261184] --> OK [0.20132613E10,TO_NEGINF] --> [2013261312,2013261312] --> OK [0.20132614E10,TO_NEGINF] --> [2013261440,2013261440] --> OK [0.20132616E10,TO_NEGINF] --> [2013261568,2013261568] --> OK [0.20132617E10,TO_NEGINF] --> [2013261696,2013261696] --> OK [0.20132618E10,TO_NEGINF] --> [2013261824,2013261824] --> OK [0.2013262E10,TO_NEGINF] --> [2013261952,2013261952] --> OK [0.20132621E10,TO_NEGINF] --> [2013262080,2013262080] --> OK [0.20132622E10,TO_NEGINF] --> [2013262208,2013262208] --> OK [0.20132623E10,TO_NEGINF] --> [2013262336,2013262336] --> OK [0.20132625E10,TO_NEGINF] --> [2013262464,2013262464] --> OK [0.20132626E10,TO_NEGINF] --> [2013262592,2013262592] --> OK [0.20132627E10,TO_NEGINF] --> [2013262720,2013262720] --> OK [0.20132628E10,TO_NEGINF] --> [2013262848,2013262848] --> OK [0.2013263E10,TO_NEGINF] --> [2013262976,2013262976] --> OK [0.20132631E10,TO_NEGINF] --> [2013263104,2013263104] --> OK [0.20132632E10,TO_NEGINF] --> [2013263232,2013263232] --> OK [0.20132634E10,TO_NEGINF] --> [2013263360,2013263360] --> OK [0.20132635E10,TO_NEGINF] --> [2013263488,2013263488] --> OK [0.20132636E10,TO_NEGINF] --> [2013263616,2013263616] --> OK [0.20132637E10,TO_NEGINF] --> [2013263744,2013263744] --> OK [0.20132639E10,TO_NEGINF] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_NEGINF] --> [2013264000,2013264000] --> OK [0.20132641E10,TO_NEGINF] --> [2013264128,2013264128] --> OK [0.20132643E10,TO_NEGINF] --> [2013264256,2013264256] --> OK [0.20132644E10,TO_NEGINF] --> [2013264384,2013264384] --> OK [0.20132645E10,TO_NEGINF] --> [2013264512,2013264512] --> OK [0.20132646E10,TO_NEGINF] --> [2013264640,2013264640] --> OK [0.20132648E10,TO_NEGINF] --> [2013264768,2013264768] --> OK [0.20132649E10,TO_NEGINF] --> [2013264896,2013264896] --> OK [0.2013265E10,TO_NEGINF] --> [2013265024,2013265024] --> OK [0.20132652E10,TO_NEGINF] --> [2013265152,2013265152] --> OK [0.20132653E10,TO_NEGINF] --> [2013265280,2013265280] --> OK [0.20132654E10,TO_NEGINF] --> [2013265408,2013265408] --> OK [0.20132655E10,TO_NEGINF] --> [2013265536,2013265536] --> OK [0.20132657E10,TO_NEGINF] --> [2013265664,2013265664] --> OK [0.20132658E10,TO_NEGINF] --> [2013265792,2013265792] --> OK [0.20132659E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132741E10,TO_NEGINF] --> [2013274112,2013274112] --> OK [0.2013274E10,TO_NEGINF] --> [2013273984,2013273984] --> OK [0.20132739E10,TO_NEGINF] --> [2013273856,2013273856] --> OK [0.20132737E10,TO_NEGINF] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_NEGINF] --> [2013273600,2013273600] --> OK [0.20132735E10,TO_NEGINF] --> [2013273472,2013273472] --> OK [0.20132733E10,TO_NEGINF] --> [2013273344,2013273344] --> OK [0.20132732E10,TO_NEGINF] --> [2013273216,2013273216] --> OK [0.20132731E10,TO_NEGINF] --> [2013273088,2013273088] --> OK [0.2013273E10,TO_NEGINF] --> [2013272960,2013272960] --> OK [0.20132728E10,TO_NEGINF] --> [2013272832,2013272832] --> OK [0.20132727E10,TO_NEGINF] --> [2013272704,2013272704] --> OK [0.20132726E10,TO_NEGINF] --> [2013272576,2013272576] --> OK [0.20132724E10,TO_NEGINF] --> [2013272448,2013272448] --> OK [0.20132723E10,TO_NEGINF] --> [2013272320,2013272320] --> OK [0.20132722E10,TO_NEGINF] --> [2013272192,2013272192] --> OK [0.2013272E10,TO_NEGINF] --> [2013272064,2013272064] --> OK [0.20132719E10,TO_NEGINF] --> [2013271936,2013271936] --> OK [0.20132718E10,TO_NEGINF] --> [2013271808,2013271808] --> OK [0.20132717E10,TO_NEGINF] --> [2013271680,2013271680] --> OK [0.20132716E10,TO_NEGINF] --> [2013271552,2013271552] --> OK [0.20132714E10,TO_NEGINF] --> [2013271424,2013271424] --> OK [0.20132713E10,TO_NEGINF] --> [2013271296,2013271296] --> OK [0.20132712E10,TO_NEGINF] --> [2013271168,2013271168] --> OK [0.2013271E10,TO_NEGINF] --> [2013271040,2013271040] --> OK [0.20132709E10,TO_NEGINF] --> [2013270912,2013270912] --> OK [0.20132708E10,TO_NEGINF] --> [2013270784,2013270784] --> OK [0.20132707E10,TO_NEGINF] --> [2013270656,2013270656] --> OK [0.20132705E10,TO_NEGINF] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_NEGINF] --> [2013270400,2013270400] --> OK [0.20132703E10,TO_NEGINF] --> [2013270272,2013270272] --> OK [0.20132701E10,TO_NEGINF] --> [2013270144,2013270144] --> OK [0.201327E10,TO_NEGINF] --> [2013270016,2013270016] --> OK [0.20132699E10,TO_NEGINF] --> [2013269888,2013269888] --> OK [0.20132698E10,TO_NEGINF] --> [2013269760,2013269760] --> OK [0.20132696E10,TO_NEGINF] --> [2013269632,2013269632] --> OK [0.20132695E10,TO_NEGINF] --> [2013269504,2013269504] --> OK [0.20132694E10,TO_NEGINF] --> [2013269376,2013269376] --> OK [0.20132692E10,TO_NEGINF] --> [2013269248,2013269248] --> OK [0.20132691E10,TO_NEGINF] --> [2013269120,2013269120] --> OK [0.2013269E10,TO_NEGINF] --> [2013268992,2013268992] --> OK [0.20132689E10,TO_NEGINF] --> [2013268864,2013268864] --> OK [0.20132687E10,TO_NEGINF] --> [2013268736,2013268736] --> OK [0.20132686E10,TO_NEGINF] --> [2013268608,2013268608] --> OK [0.20132685E10,TO_NEGINF] --> [2013268480,2013268480] --> OK [0.20132684E10,TO_NEGINF] --> [2013268352,2013268352] --> OK [0.20132682E10,TO_NEGINF] --> [2013268224,2013268224] --> OK [0.20132681E10,TO_NEGINF] --> [2013268096,2013268096] --> OK [0.2013268E10,TO_NEGINF] --> [2013267968,2013267968] --> OK [0.20132678E10,TO_NEGINF] --> [2013267840,2013267840] --> OK [0.20132677E10,TO_NEGINF] --> [2013267712,2013267712] --> OK [0.20132676E10,TO_NEGINF] --> [2013267584,2013267584] --> OK [0.20132675E10,TO_NEGINF] --> [2013267456,2013267456] --> OK [0.20132673E10,TO_NEGINF] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_NEGINF] --> [2013267200,2013267200] --> OK [0.20132671E10,TO_NEGINF] --> [2013267072,2013267072] --> OK [0.2013267E10,TO_NEGINF] --> [2013266944,2013266944] --> OK [0.20132668E10,TO_NEGINF] --> [2013266816,2013266816] --> OK [0.20132667E10,TO_NEGINF] --> [2013266688,2013266688] --> OK [0.20132666E10,TO_NEGINF] --> [2013266560,2013266560] --> OK [0.20132664E10,TO_NEGINF] --> [2013266432,2013266432] --> OK [0.20132663E10,TO_NEGINF] --> [2013266304,2013266304] --> OK [0.20132662E10,TO_NEGINF] --> [2013266176,2013266176] --> OK [0.2013266E10,TO_NEGINF] --> [2013266048,2013266048] --> OK [0.20803666E10,TO_NEGINF] --> [2080366592,2080366592] --> OK [0.20803667E10,TO_NEGINF] --> [2080366720,2080366720] --> OK [0.20803668E10,TO_NEGINF] --> [2080366848,2080366848] --> OK [0.2080367E10,TO_NEGINF] --> [2080366976,2080366976] --> OK [0.20803671E10,TO_NEGINF] --> [2080367104,2080367104] --> OK [0.20803672E10,TO_NEGINF] --> [2080367232,2080367232] --> OK [0.20803674E10,TO_NEGINF] --> [2080367360,2080367360] --> OK [0.20803675E10,TO_NEGINF] --> [2080367488,2080367488] --> OK [0.20803676E10,TO_NEGINF] --> [2080367616,2080367616] --> OK [0.20803677E10,TO_NEGINF] --> [2080367744,2080367744] --> OK [0.20803679E10,TO_NEGINF] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_NEGINF] --> [2080368000,2080368000] --> OK [0.20803681E10,TO_NEGINF] --> [2080368128,2080368128] --> OK [0.20803683E10,TO_NEGINF] --> [2080368256,2080368256] --> OK [0.20803684E10,TO_NEGINF] --> [2080368384,2080368384] --> OK [0.20803685E10,TO_NEGINF] --> [2080368512,2080368512] --> OK [0.20803686E10,TO_NEGINF] --> [2080368640,2080368640] --> OK [0.20803688E10,TO_NEGINF] --> [2080368768,2080368768] --> OK [0.20803689E10,TO_NEGINF] --> [2080368896,2080368896] --> OK [0.2080369E10,TO_NEGINF] --> [2080369024,2080369024] --> OK [0.20803692E10,TO_NEGINF] --> [2080369152,2080369152] --> OK [0.20803693E10,TO_NEGINF] --> [2080369280,2080369280] --> OK [0.20803694E10,TO_NEGINF] --> [2080369408,2080369408] --> OK [0.20803695E10,TO_NEGINF] --> [2080369536,2080369536] --> OK [0.20803697E10,TO_NEGINF] --> [2080369664,2080369664] --> OK [0.20803698E10,TO_NEGINF] --> [2080369792,2080369792] --> OK [0.20803699E10,TO_NEGINF] --> [2080369920,2080369920] --> OK [0.208037E10,TO_NEGINF] --> [2080370048,2080370048] --> OK [0.20803702E10,TO_NEGINF] --> [2080370176,2080370176] --> OK [0.20803703E10,TO_NEGINF] --> [2080370304,2080370304] --> OK [0.20803704E10,TO_NEGINF] --> [2080370432,2080370432] --> OK [0.20803706E10,TO_NEGINF] --> [2080370560,2080370560] --> OK [0.20803707E10,TO_NEGINF] --> [2080370688,2080370688] --> OK [0.20803708E10,TO_NEGINF] --> [2080370816,2080370816] --> OK [0.2080371E10,TO_NEGINF] --> [2080370944,2080370944] --> OK [0.20803711E10,TO_NEGINF] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_NEGINF] --> [2080371200,2080371200] --> OK [0.20803713E10,TO_NEGINF] --> [2080371328,2080371328] --> OK [0.20803715E10,TO_NEGINF] --> [2080371456,2080371456] --> OK [0.20803716E10,TO_NEGINF] --> [2080371584,2080371584] --> OK [0.20803717E10,TO_NEGINF] --> [2080371712,2080371712] --> OK [0.20803718E10,TO_NEGINF] --> [2080371840,2080371840] --> OK [0.2080372E10,TO_NEGINF] --> [2080371968,2080371968] --> OK [0.20803721E10,TO_NEGINF] --> [2080372096,2080372096] --> OK [0.20803722E10,TO_NEGINF] --> [2080372224,2080372224] --> OK [0.20803724E10,TO_NEGINF] --> [2080372352,2080372352] --> OK [0.20803725E10,TO_NEGINF] --> [2080372480,2080372480] --> OK [0.20803726E10,TO_NEGINF] --> [2080372608,2080372608] --> OK [0.20803727E10,TO_NEGINF] --> [2080372736,2080372736] --> OK [0.20803729E10,TO_NEGINF] --> [2080372864,2080372864] --> OK [0.2080373E10,TO_NEGINF] --> [2080372992,2080372992] --> OK [0.20803731E10,TO_NEGINF] --> [2080373120,2080373120] --> OK [0.20803732E10,TO_NEGINF] --> [2080373248,2080373248] --> OK [0.20803734E10,TO_NEGINF] --> [2080373376,2080373376] --> OK [0.20803735E10,TO_NEGINF] --> [2080373504,2080373504] --> OK [0.20803736E10,TO_NEGINF] --> [2080373632,2080373632] --> OK [0.20803738E10,TO_NEGINF] --> [2080373760,2080373760] --> OK [0.20803739E10,TO_NEGINF] --> [2080373888,2080373888] --> OK [0.2080374E10,TO_NEGINF] --> [2080374016,2080374016] --> OK [0.20803741E10,TO_NEGINF] --> [2080374144,2080374144] --> OK [0.20803743E10,TO_NEGINF] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_NEGINF] --> [2080374400,2080374400] --> OK [0.20803745E10,TO_NEGINF] --> [2080374528,2080374528] --> OK [0.20803747E10,TO_NEGINF] --> [2080374656,2080374656] --> OK [0.20803748E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080383E10,TO_NEGINF] --> [2080382976,2080382976] --> OK [0.20803828E10,TO_NEGINF] --> [2080382848,2080382848] --> OK [0.20803827E10,TO_NEGINF] --> [2080382720,2080382720] --> OK [0.20803826E10,TO_NEGINF] --> [2080382592,2080382592] --> OK [0.20803825E10,TO_NEGINF] --> [2080382464,2080382464] --> OK [0.20803823E10,TO_NEGINF] --> [2080382336,2080382336] --> OK [0.20803822E10,TO_NEGINF] --> [2080382208,2080382208] --> OK [0.20803821E10,TO_NEGINF] --> [2080382080,2080382080] --> OK [0.2080382E10,TO_NEGINF] --> [2080381952,2080381952] --> OK [0.20803818E10,TO_NEGINF] --> [2080381824,2080381824] --> OK [0.20803817E10,TO_NEGINF] --> [2080381696,2080381696] --> OK [0.20803816E10,TO_NEGINF] --> [2080381568,2080381568] --> OK [0.20803814E10,TO_NEGINF] --> [2080381440,2080381440] --> OK [0.20803813E10,TO_NEGINF] --> [2080381312,2080381312] --> OK [0.20803812E10,TO_NEGINF] --> [2080381184,2080381184] --> OK [0.2080381E10,TO_NEGINF] --> [2080381056,2080381056] --> OK [0.20803809E10,TO_NEGINF] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_NEGINF] --> [2080380800,2080380800] --> OK [0.20803807E10,TO_NEGINF] --> [2080380672,2080380672] --> OK [0.20803805E10,TO_NEGINF] --> [2080380544,2080380544] --> OK [0.20803804E10,TO_NEGINF] --> [2080380416,2080380416] --> OK [0.20803803E10,TO_NEGINF] --> [2080380288,2080380288] --> OK [0.20803802E10,TO_NEGINF] --> [2080380160,2080380160] --> OK [0.208038E10,TO_NEGINF] --> [2080380032,2080380032] --> OK [0.20803799E10,TO_NEGINF] --> [2080379904,2080379904] --> OK [0.20803798E10,TO_NEGINF] --> [2080379776,2080379776] --> OK [0.20803796E10,TO_NEGINF] --> [2080379648,2080379648] --> OK [0.20803795E10,TO_NEGINF] --> [2080379520,2080379520] --> OK [0.20803794E10,TO_NEGINF] --> [2080379392,2080379392] --> OK [0.20803793E10,TO_NEGINF] --> [2080379264,2080379264] --> OK [0.20803791E10,TO_NEGINF] --> [2080379136,2080379136] --> OK [0.2080379E10,TO_NEGINF] --> [2080379008,2080379008] --> OK [0.20803789E10,TO_NEGINF] --> [2080378880,2080378880] --> OK [0.20803788E10,TO_NEGINF] --> [2080378752,2080378752] --> OK [0.20803786E10,TO_NEGINF] --> [2080378624,2080378624] --> OK [0.20803785E10,TO_NEGINF] --> [2080378496,2080378496] --> OK [0.20803784E10,TO_NEGINF] --> [2080378368,2080378368] --> OK [0.20803782E10,TO_NEGINF] --> [2080378240,2080378240] --> OK [0.20803781E10,TO_NEGINF] --> [2080378112,2080378112] --> OK [0.2080378E10,TO_NEGINF] --> [2080377984,2080377984] --> OK [0.20803779E10,TO_NEGINF] --> [2080377856,2080377856] --> OK [0.20803777E10,TO_NEGINF] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_NEGINF] --> [2080377600,2080377600] --> OK [0.20803775E10,TO_NEGINF] --> [2080377472,2080377472] --> OK [0.20803773E10,TO_NEGINF] --> [2080377344,2080377344] --> OK [0.20803772E10,TO_NEGINF] --> [2080377216,2080377216] --> OK [0.20803771E10,TO_NEGINF] --> [2080377088,2080377088] --> OK [0.2080377E10,TO_NEGINF] --> [2080376960,2080376960] --> OK [0.20803768E10,TO_NEGINF] --> [2080376832,2080376832] --> OK [0.20803767E10,TO_NEGINF] --> [2080376704,2080376704] --> OK [0.20803766E10,TO_NEGINF] --> [2080376576,2080376576] --> OK [0.20803764E10,TO_NEGINF] --> [2080376448,2080376448] --> OK [0.20803763E10,TO_NEGINF] --> [2080376320,2080376320] --> OK [0.20803762E10,TO_NEGINF] --> [2080376192,2080376192] --> OK [0.2080376E10,TO_NEGINF] --> [2080376064,2080376064] --> OK [0.20803759E10,TO_NEGINF] --> [2080375936,2080375936] --> OK [0.20803758E10,TO_NEGINF] --> [2080375808,2080375808] --> OK [0.20803757E10,TO_NEGINF] --> [2080375680,2080375680] --> OK [0.20803756E10,TO_NEGINF] --> [2080375552,2080375552] --> OK [0.20803754E10,TO_NEGINF] --> [2080375424,2080375424] --> OK [0.20803753E10,TO_NEGINF] --> [2080375296,2080375296] --> OK [0.20803752E10,TO_NEGINF] --> [2080375168,2080375168] --> OK [0.2080375E10,TO_NEGINF] --> [2080375040,2080375040] --> OK [0.20803749E10,TO_NEGINF] --> [2080374912,2080374912] --> OK [0.2113921E10,TO_NEGINF] --> [2113921024,2113921024] --> OK [0.21139212E10,TO_NEGINF] --> [2113921152,2113921152] --> OK [0.21139213E10,TO_NEGINF] --> [2113921280,2113921280] --> OK [0.21139214E10,TO_NEGINF] --> [2113921408,2113921408] --> OK [0.21139215E10,TO_NEGINF] --> [2113921536,2113921536] --> OK [0.21139217E10,TO_NEGINF] --> [2113921664,2113921664] --> OK [0.21139218E10,TO_NEGINF] --> [2113921792,2113921792] --> OK [0.21139219E10,TO_NEGINF] --> [2113921920,2113921920] --> OK [0.2113922E10,TO_NEGINF] --> [2113922048,2113922048] --> OK [0.21139222E10,TO_NEGINF] --> [2113922176,2113922176] --> OK [0.21139223E10,TO_NEGINF] --> [2113922304,2113922304] --> OK [0.21139224E10,TO_NEGINF] --> [2113922432,2113922432] --> OK [0.21139226E10,TO_NEGINF] --> [2113922560,2113922560] --> OK [0.21139227E10,TO_NEGINF] --> [2113922688,2113922688] --> OK [0.21139228E10,TO_NEGINF] --> [2113922816,2113922816] --> OK [0.2113923E10,TO_NEGINF] --> [2113922944,2113922944] --> OK [0.21139231E10,TO_NEGINF] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_NEGINF] --> [2113923200,2113923200] --> OK [0.21139233E10,TO_NEGINF] --> [2113923328,2113923328] --> OK [0.21139235E10,TO_NEGINF] --> [2113923456,2113923456] --> OK [0.21139236E10,TO_NEGINF] --> [2113923584,2113923584] --> OK [0.21139237E10,TO_NEGINF] --> [2113923712,2113923712] --> OK [0.21139238E10,TO_NEGINF] --> [2113923840,2113923840] --> OK [0.2113924E10,TO_NEGINF] --> [2113923968,2113923968] --> OK [0.21139241E10,TO_NEGINF] --> [2113924096,2113924096] --> OK [0.21139242E10,TO_NEGINF] --> [2113924224,2113924224] --> OK [0.21139244E10,TO_NEGINF] --> [2113924352,2113924352] --> OK [0.21139245E10,TO_NEGINF] --> [2113924480,2113924480] --> OK [0.21139246E10,TO_NEGINF] --> [2113924608,2113924608] --> OK [0.21139247E10,TO_NEGINF] --> [2113924736,2113924736] --> OK [0.21139249E10,TO_NEGINF] --> [2113924864,2113924864] --> OK [0.2113925E10,TO_NEGINF] --> [2113924992,2113924992] --> OK [0.21139251E10,TO_NEGINF] --> [2113925120,2113925120] --> OK [0.21139252E10,TO_NEGINF] --> [2113925248,2113925248] --> OK [0.21139254E10,TO_NEGINF] --> [2113925376,2113925376] --> OK [0.21139255E10,TO_NEGINF] --> [2113925504,2113925504] --> OK [0.21139256E10,TO_NEGINF] --> [2113925632,2113925632] --> OK [0.21139258E10,TO_NEGINF] --> [2113925760,2113925760] --> OK [0.21139259E10,TO_NEGINF] --> [2113925888,2113925888] --> OK [0.2113926E10,TO_NEGINF] --> [2113926016,2113926016] --> OK [0.21139261E10,TO_NEGINF] --> [2113926144,2113926144] --> OK [0.21139263E10,TO_NEGINF] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_NEGINF] --> [2113926400,2113926400] --> OK [0.21139265E10,TO_NEGINF] --> [2113926528,2113926528] --> OK [0.21139267E10,TO_NEGINF] --> [2113926656,2113926656] --> OK [0.21139268E10,TO_NEGINF] --> [2113926784,2113926784] --> OK [0.21139269E10,TO_NEGINF] --> [2113926912,2113926912] --> OK [0.2113927E10,TO_NEGINF] --> [2113927040,2113927040] --> OK [0.21139272E10,TO_NEGINF] --> [2113927168,2113927168] --> OK [0.21139273E10,TO_NEGINF] --> [2113927296,2113927296] --> OK [0.21139274E10,TO_NEGINF] --> [2113927424,2113927424] --> OK [0.21139276E10,TO_NEGINF] --> [2113927552,2113927552] --> OK [0.21139277E10,TO_NEGINF] --> [2113927680,2113927680] --> OK [0.21139278E10,TO_NEGINF] --> [2113927808,2113927808] --> OK [0.2113928E10,TO_NEGINF] --> [2113927936,2113927936] --> OK [0.21139281E10,TO_NEGINF] --> [2113928064,2113928064] --> OK [0.21139282E10,TO_NEGINF] --> [2113928192,2113928192] --> OK [0.21139283E10,TO_NEGINF] --> [2113928320,2113928320] --> OK [0.21139284E10,TO_NEGINF] --> [2113928448,2113928448] --> OK [0.21139286E10,TO_NEGINF] --> [2113928576,2113928576] --> OK [0.21139287E10,TO_NEGINF] --> [2113928704,2113928704] --> OK [0.21139288E10,TO_NEGINF] --> [2113928832,2113928832] --> OK [0.2113929E10,TO_NEGINF] --> [2113928960,2113928960] --> OK [0.21139291E10,TO_NEGINF] --> [2113929088,2113929088] --> OK [0.21139292E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139374E10,TO_NEGINF] --> [2113937408,2113937408] --> OK [0.21139373E10,TO_NEGINF] --> [2113937280,2113937280] --> OK [0.21139372E10,TO_NEGINF] --> [2113937152,2113937152] --> OK [0.2113937E10,TO_NEGINF] --> [2113937024,2113937024] --> OK [0.21139369E10,TO_NEGINF] --> [2113936896,2113936896] --> OK [0.21139368E10,TO_NEGINF] --> [2113936768,2113936768] --> OK [0.21139366E10,TO_NEGINF] --> [2113936640,2113936640] --> OK [0.21139365E10,TO_NEGINF] --> [2113936512,2113936512] --> OK [0.21139364E10,TO_NEGINF] --> [2113936384,2113936384] --> OK [0.21139363E10,TO_NEGINF] --> [2113936256,2113936256] --> OK [0.21139361E10,TO_NEGINF] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_NEGINF] --> [2113936000,2113936000] --> OK [0.21139359E10,TO_NEGINF] --> [2113935872,2113935872] --> OK [0.21139357E10,TO_NEGINF] --> [2113935744,2113935744] --> OK [0.21139356E10,TO_NEGINF] --> [2113935616,2113935616] --> OK [0.21139355E10,TO_NEGINF] --> [2113935488,2113935488] --> OK [0.21139354E10,TO_NEGINF] --> [2113935360,2113935360] --> OK [0.21139352E10,TO_NEGINF] --> [2113935232,2113935232] --> OK [0.21139351E10,TO_NEGINF] --> [2113935104,2113935104] --> OK [0.2113935E10,TO_NEGINF] --> [2113934976,2113934976] --> OK [0.21139348E10,TO_NEGINF] --> [2113934848,2113934848] --> OK [0.21139347E10,TO_NEGINF] --> [2113934720,2113934720] --> OK [0.21139346E10,TO_NEGINF] --> [2113934592,2113934592] --> OK [0.21139345E10,TO_NEGINF] --> [2113934464,2113934464] --> OK [0.21139343E10,TO_NEGINF] --> [2113934336,2113934336] --> OK [0.21139342E10,TO_NEGINF] --> [2113934208,2113934208] --> OK [0.21139341E10,TO_NEGINF] --> [2113934080,2113934080] --> OK [0.2113934E10,TO_NEGINF] --> [2113933952,2113933952] --> OK [0.21139338E10,TO_NEGINF] --> [2113933824,2113933824] --> OK [0.21139337E10,TO_NEGINF] --> [2113933696,2113933696] --> OK [0.21139336E10,TO_NEGINF] --> [2113933568,2113933568] --> OK [0.21139334E10,TO_NEGINF] --> [2113933440,2113933440] --> OK [0.21139333E10,TO_NEGINF] --> [2113933312,2113933312] --> OK [0.21139332E10,TO_NEGINF] --> [2113933184,2113933184] --> OK [0.2113933E10,TO_NEGINF] --> [2113933056,2113933056] --> OK [0.21139329E10,TO_NEGINF] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_NEGINF] --> [2113932800,2113932800] --> OK [0.21139327E10,TO_NEGINF] --> [2113932672,2113932672] --> OK [0.21139325E10,TO_NEGINF] --> [2113932544,2113932544] --> OK [0.21139324E10,TO_NEGINF] --> [2113932416,2113932416] --> OK [0.21139323E10,TO_NEGINF] --> [2113932288,2113932288] --> OK [0.21139322E10,TO_NEGINF] --> [2113932160,2113932160] --> OK [0.2113932E10,TO_NEGINF] --> [2113932032,2113932032] --> OK [0.21139319E10,TO_NEGINF] --> [2113931904,2113931904] --> OK [0.21139318E10,TO_NEGINF] --> [2113931776,2113931776] --> OK [0.21139316E10,TO_NEGINF] --> [2113931648,2113931648] --> OK [0.21139315E10,TO_NEGINF] --> [2113931520,2113931520] --> OK [0.21139314E10,TO_NEGINF] --> [2113931392,2113931392] --> OK [0.21139313E10,TO_NEGINF] --> [2113931264,2113931264] --> OK [0.21139311E10,TO_NEGINF] --> [2113931136,2113931136] --> OK [0.2113931E10,TO_NEGINF] --> [2113931008,2113931008] --> OK [0.21139309E10,TO_NEGINF] --> [2113930880,2113930880] --> OK [0.21139308E10,TO_NEGINF] --> [2113930752,2113930752] --> OK [0.21139306E10,TO_NEGINF] --> [2113930624,2113930624] --> OK [0.21139305E10,TO_NEGINF] --> [2113930496,2113930496] --> OK [0.21139304E10,TO_NEGINF] --> [2113930368,2113930368] --> OK [0.21139302E10,TO_NEGINF] --> [2113930240,2113930240] --> OK [0.21139301E10,TO_NEGINF] --> [2113930112,2113930112] --> OK [0.211393E10,TO_NEGINF] --> [2113929984,2113929984] --> OK [0.21139299E10,TO_NEGINF] --> [2113929856,2113929856] --> OK [0.21139297E10,TO_NEGINF] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_NEGINF] --> [2113929600,2113929600] --> OK [0.21139295E10,TO_NEGINF] --> [2113929472,2113929472] --> OK [0.21139293E10,TO_NEGINF] --> [2113929344,2113929344] --> OK [0.21474755E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [~0.21475E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.21139374E10,TO_POSINF] --> [~2113937408,~2113937408] --> OK [~0.21139373E10,TO_POSINF] --> [~2113937280,~2113937280] --> OK [~0.21139372E10,TO_POSINF] --> [~2113937152,~2113937152] --> OK [~0.2113937E10,TO_POSINF] --> [~2113937024,~2113937024] --> OK [~0.21139369E10,TO_POSINF] --> [~2113936896,~2113936896] --> OK [~0.21139368E10,TO_POSINF] --> [~2113936768,~2113936768] --> OK [~0.21139366E10,TO_POSINF] --> [~2113936640,~2113936640] --> OK [~0.21139365E10,TO_POSINF] --> [~2113936512,~2113936512] --> OK [~0.21139364E10,TO_POSINF] --> [~2113936384,~2113936384] --> OK [~0.21139363E10,TO_POSINF] --> [~2113936256,~2113936256] --> OK [~0.21139361E10,TO_POSINF] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_POSINF] --> [~2113936000,~2113936000] --> OK [~0.21139359E10,TO_POSINF] --> [~2113935872,~2113935872] --> OK [~0.21139357E10,TO_POSINF] --> [~2113935744,~2113935744] --> OK [~0.21139356E10,TO_POSINF] --> [~2113935616,~2113935616] --> OK [~0.21139355E10,TO_POSINF] --> [~2113935488,~2113935488] --> OK [~0.21139354E10,TO_POSINF] --> [~2113935360,~2113935360] --> OK [~0.21139352E10,TO_POSINF] --> [~2113935232,~2113935232] --> OK [~0.21139351E10,TO_POSINF] --> [~2113935104,~2113935104] --> OK [~0.2113935E10,TO_POSINF] --> [~2113934976,~2113934976] --> OK [~0.21139348E10,TO_POSINF] --> [~2113934848,~2113934848] --> OK [~0.21139347E10,TO_POSINF] --> [~2113934720,~2113934720] --> OK [~0.21139346E10,TO_POSINF] --> [~2113934592,~2113934592] --> OK [~0.21139345E10,TO_POSINF] --> [~2113934464,~2113934464] --> OK [~0.21139343E10,TO_POSINF] --> [~2113934336,~2113934336] --> OK [~0.21139342E10,TO_POSINF] --> [~2113934208,~2113934208] --> OK [~0.21139341E10,TO_POSINF] --> [~2113934080,~2113934080] --> OK [~0.2113934E10,TO_POSINF] --> [~2113933952,~2113933952] --> OK [~0.21139338E10,TO_POSINF] --> [~2113933824,~2113933824] --> OK [~0.21139337E10,TO_POSINF] --> [~2113933696,~2113933696] --> OK [~0.21139336E10,TO_POSINF] --> [~2113933568,~2113933568] --> OK [~0.21139334E10,TO_POSINF] --> [~2113933440,~2113933440] --> OK [~0.21139333E10,TO_POSINF] --> [~2113933312,~2113933312] --> OK [~0.21139332E10,TO_POSINF] --> [~2113933184,~2113933184] --> OK [~0.2113933E10,TO_POSINF] --> [~2113933056,~2113933056] --> OK [~0.21139329E10,TO_POSINF] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_POSINF] --> [~2113932800,~2113932800] --> OK [~0.21139327E10,TO_POSINF] --> [~2113932672,~2113932672] --> OK [~0.21139325E10,TO_POSINF] --> [~2113932544,~2113932544] --> OK [~0.21139324E10,TO_POSINF] --> [~2113932416,~2113932416] --> OK [~0.21139323E10,TO_POSINF] --> [~2113932288,~2113932288] --> OK [~0.21139322E10,TO_POSINF] --> [~2113932160,~2113932160] --> OK [~0.2113932E10,TO_POSINF] --> [~2113932032,~2113932032] --> OK [~0.21139319E10,TO_POSINF] --> [~2113931904,~2113931904] --> OK [~0.21139318E10,TO_POSINF] --> [~2113931776,~2113931776] --> OK [~0.21139316E10,TO_POSINF] --> [~2113931648,~2113931648] --> OK [~0.21139315E10,TO_POSINF] --> [~2113931520,~2113931520] --> OK [~0.21139314E10,TO_POSINF] --> [~2113931392,~2113931392] --> OK [~0.21139313E10,TO_POSINF] --> [~2113931264,~2113931264] --> OK [~0.21139311E10,TO_POSINF] --> [~2113931136,~2113931136] --> OK [~0.2113931E10,TO_POSINF] --> [~2113931008,~2113931008] --> OK [~0.21139309E10,TO_POSINF] --> [~2113930880,~2113930880] --> OK [~0.21139308E10,TO_POSINF] --> [~2113930752,~2113930752] --> OK [~0.21139306E10,TO_POSINF] --> [~2113930624,~2113930624] --> OK [~0.21139305E10,TO_POSINF] --> [~2113930496,~2113930496] --> OK [~0.21139304E10,TO_POSINF] --> [~2113930368,~2113930368] --> OK [~0.21139302E10,TO_POSINF] --> [~2113930240,~2113930240] --> OK [~0.21139301E10,TO_POSINF] --> [~2113930112,~2113930112] --> OK [~0.211393E10,TO_POSINF] --> [~2113929984,~2113929984] --> OK [~0.21139299E10,TO_POSINF] --> [~2113929856,~2113929856] --> OK [~0.21139297E10,TO_POSINF] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_POSINF] --> [~2113929600,~2113929600] --> OK [~0.21139295E10,TO_POSINF] --> [~2113929472,~2113929472] --> OK [~0.21139293E10,TO_POSINF] --> [~2113929344,~2113929344] --> OK [~0.21139292E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113921E10,TO_POSINF] --> [~2113921024,~2113921024] --> OK [~0.21139212E10,TO_POSINF] --> [~2113921152,~2113921152] --> OK [~0.21139213E10,TO_POSINF] --> [~2113921280,~2113921280] --> OK [~0.21139214E10,TO_POSINF] --> [~2113921408,~2113921408] --> OK [~0.21139215E10,TO_POSINF] --> [~2113921536,~2113921536] --> OK [~0.21139217E10,TO_POSINF] --> [~2113921664,~2113921664] --> OK [~0.21139218E10,TO_POSINF] --> [~2113921792,~2113921792] --> OK [~0.21139219E10,TO_POSINF] --> [~2113921920,~2113921920] --> OK [~0.2113922E10,TO_POSINF] --> [~2113922048,~2113922048] --> OK [~0.21139222E10,TO_POSINF] --> [~2113922176,~2113922176] --> OK [~0.21139223E10,TO_POSINF] --> [~2113922304,~2113922304] --> OK [~0.21139224E10,TO_POSINF] --> [~2113922432,~2113922432] --> OK [~0.21139226E10,TO_POSINF] --> [~2113922560,~2113922560] --> OK [~0.21139227E10,TO_POSINF] --> [~2113922688,~2113922688] --> OK [~0.21139228E10,TO_POSINF] --> [~2113922816,~2113922816] --> OK [~0.2113923E10,TO_POSINF] --> [~2113922944,~2113922944] --> OK [~0.21139231E10,TO_POSINF] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_POSINF] --> [~2113923200,~2113923200] --> OK [~0.21139233E10,TO_POSINF] --> [~2113923328,~2113923328] --> OK [~0.21139235E10,TO_POSINF] --> [~2113923456,~2113923456] --> OK [~0.21139236E10,TO_POSINF] --> [~2113923584,~2113923584] --> OK [~0.21139237E10,TO_POSINF] --> [~2113923712,~2113923712] --> OK [~0.21139238E10,TO_POSINF] --> [~2113923840,~2113923840] --> OK [~0.2113924E10,TO_POSINF] --> [~2113923968,~2113923968] --> OK [~0.21139241E10,TO_POSINF] --> [~2113924096,~2113924096] --> OK [~0.21139242E10,TO_POSINF] --> [~2113924224,~2113924224] --> OK [~0.21139244E10,TO_POSINF] --> [~2113924352,~2113924352] --> OK [~0.21139245E10,TO_POSINF] --> [~2113924480,~2113924480] --> OK [~0.21139246E10,TO_POSINF] --> [~2113924608,~2113924608] --> OK [~0.21139247E10,TO_POSINF] --> [~2113924736,~2113924736] --> OK [~0.21139249E10,TO_POSINF] --> [~2113924864,~2113924864] --> OK [~0.2113925E10,TO_POSINF] --> [~2113924992,~2113924992] --> OK [~0.21139251E10,TO_POSINF] --> [~2113925120,~2113925120] --> OK [~0.21139252E10,TO_POSINF] --> [~2113925248,~2113925248] --> OK [~0.21139254E10,TO_POSINF] --> [~2113925376,~2113925376] --> OK [~0.21139255E10,TO_POSINF] --> [~2113925504,~2113925504] --> OK [~0.21139256E10,TO_POSINF] --> [~2113925632,~2113925632] --> OK [~0.21139258E10,TO_POSINF] --> [~2113925760,~2113925760] --> OK [~0.21139259E10,TO_POSINF] --> [~2113925888,~2113925888] --> OK [~0.2113926E10,TO_POSINF] --> [~2113926016,~2113926016] --> OK [~0.21139261E10,TO_POSINF] --> [~2113926144,~2113926144] --> OK [~0.21139263E10,TO_POSINF] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_POSINF] --> [~2113926400,~2113926400] --> OK [~0.21139265E10,TO_POSINF] --> [~2113926528,~2113926528] --> OK [~0.21139267E10,TO_POSINF] --> [~2113926656,~2113926656] --> OK [~0.21139268E10,TO_POSINF] --> [~2113926784,~2113926784] --> OK [~0.21139269E10,TO_POSINF] --> [~2113926912,~2113926912] --> OK [~0.2113927E10,TO_POSINF] --> [~2113927040,~2113927040] --> OK [~0.21139272E10,TO_POSINF] --> [~2113927168,~2113927168] --> OK [~0.21139273E10,TO_POSINF] --> [~2113927296,~2113927296] --> OK [~0.21139274E10,TO_POSINF] --> [~2113927424,~2113927424] --> OK [~0.21139276E10,TO_POSINF] --> [~2113927552,~2113927552] --> OK [~0.21139277E10,TO_POSINF] --> [~2113927680,~2113927680] --> OK [~0.21139278E10,TO_POSINF] --> [~2113927808,~2113927808] --> OK [~0.2113928E10,TO_POSINF] --> [~2113927936,~2113927936] --> OK [~0.21139281E10,TO_POSINF] --> [~2113928064,~2113928064] --> OK [~0.21139282E10,TO_POSINF] --> [~2113928192,~2113928192] --> OK [~0.21139283E10,TO_POSINF] --> [~2113928320,~2113928320] --> OK [~0.21139284E10,TO_POSINF] --> [~2113928448,~2113928448] --> OK [~0.21139286E10,TO_POSINF] --> [~2113928576,~2113928576] --> OK [~0.21139287E10,TO_POSINF] --> [~2113928704,~2113928704] --> OK [~0.21139288E10,TO_POSINF] --> [~2113928832,~2113928832] --> OK [~0.2113929E10,TO_POSINF] --> [~2113928960,~2113928960] --> OK [~0.21139291E10,TO_POSINF] --> [~2113929088,~2113929088] --> OK [~0.2080383E10,TO_POSINF] --> [~2080382976,~2080382976] --> OK [~0.20803828E10,TO_POSINF] --> [~2080382848,~2080382848] --> OK [~0.20803827E10,TO_POSINF] --> [~2080382720,~2080382720] --> OK [~0.20803826E10,TO_POSINF] --> [~2080382592,~2080382592] --> OK [~0.20803825E10,TO_POSINF] --> [~2080382464,~2080382464] --> OK [~0.20803823E10,TO_POSINF] --> [~2080382336,~2080382336] --> OK [~0.20803822E10,TO_POSINF] --> [~2080382208,~2080382208] --> OK [~0.20803821E10,TO_POSINF] --> [~2080382080,~2080382080] --> OK [~0.2080382E10,TO_POSINF] --> [~2080381952,~2080381952] --> OK [~0.20803818E10,TO_POSINF] --> [~2080381824,~2080381824] --> OK [~0.20803817E10,TO_POSINF] --> [~2080381696,~2080381696] --> OK [~0.20803816E10,TO_POSINF] --> [~2080381568,~2080381568] --> OK [~0.20803814E10,TO_POSINF] --> [~2080381440,~2080381440] --> OK [~0.20803813E10,TO_POSINF] --> [~2080381312,~2080381312] --> OK [~0.20803812E10,TO_POSINF] --> [~2080381184,~2080381184] --> OK [~0.2080381E10,TO_POSINF] --> [~2080381056,~2080381056] --> OK [~0.20803809E10,TO_POSINF] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_POSINF] --> [~2080380800,~2080380800] --> OK [~0.20803807E10,TO_POSINF] --> [~2080380672,~2080380672] --> OK [~0.20803805E10,TO_POSINF] --> [~2080380544,~2080380544] --> OK [~0.20803804E10,TO_POSINF] --> [~2080380416,~2080380416] --> OK [~0.20803803E10,TO_POSINF] --> [~2080380288,~2080380288] --> OK [~0.20803802E10,TO_POSINF] --> [~2080380160,~2080380160] --> OK [~0.208038E10,TO_POSINF] --> [~2080380032,~2080380032] --> OK [~0.20803799E10,TO_POSINF] --> [~2080379904,~2080379904] --> OK [~0.20803798E10,TO_POSINF] --> [~2080379776,~2080379776] --> OK [~0.20803796E10,TO_POSINF] --> [~2080379648,~2080379648] --> OK [~0.20803795E10,TO_POSINF] --> [~2080379520,~2080379520] --> OK [~0.20803794E10,TO_POSINF] --> [~2080379392,~2080379392] --> OK [~0.20803793E10,TO_POSINF] --> [~2080379264,~2080379264] --> OK [~0.20803791E10,TO_POSINF] --> [~2080379136,~2080379136] --> OK [~0.2080379E10,TO_POSINF] --> [~2080379008,~2080379008] --> OK [~0.20803789E10,TO_POSINF] --> [~2080378880,~2080378880] --> OK [~0.20803788E10,TO_POSINF] --> [~2080378752,~2080378752] --> OK [~0.20803786E10,TO_POSINF] --> [~2080378624,~2080378624] --> OK [~0.20803785E10,TO_POSINF] --> [~2080378496,~2080378496] --> OK [~0.20803784E10,TO_POSINF] --> [~2080378368,~2080378368] --> OK [~0.20803782E10,TO_POSINF] --> [~2080378240,~2080378240] --> OK [~0.20803781E10,TO_POSINF] --> [~2080378112,~2080378112] --> OK [~0.2080378E10,TO_POSINF] --> [~2080377984,~2080377984] --> OK [~0.20803779E10,TO_POSINF] --> [~2080377856,~2080377856] --> OK [~0.20803777E10,TO_POSINF] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_POSINF] --> [~2080377600,~2080377600] --> OK [~0.20803775E10,TO_POSINF] --> [~2080377472,~2080377472] --> OK [~0.20803773E10,TO_POSINF] --> [~2080377344,~2080377344] --> OK [~0.20803772E10,TO_POSINF] --> [~2080377216,~2080377216] --> OK [~0.20803771E10,TO_POSINF] --> [~2080377088,~2080377088] --> OK [~0.2080377E10,TO_POSINF] --> [~2080376960,~2080376960] --> OK [~0.20803768E10,TO_POSINF] --> [~2080376832,~2080376832] --> OK [~0.20803767E10,TO_POSINF] --> [~2080376704,~2080376704] --> OK [~0.20803766E10,TO_POSINF] --> [~2080376576,~2080376576] --> OK [~0.20803764E10,TO_POSINF] --> [~2080376448,~2080376448] --> OK [~0.20803763E10,TO_POSINF] --> [~2080376320,~2080376320] --> OK [~0.20803762E10,TO_POSINF] --> [~2080376192,~2080376192] --> OK [~0.2080376E10,TO_POSINF] --> [~2080376064,~2080376064] --> OK [~0.20803759E10,TO_POSINF] --> [~2080375936,~2080375936] --> OK [~0.20803758E10,TO_POSINF] --> [~2080375808,~2080375808] --> OK [~0.20803757E10,TO_POSINF] --> [~2080375680,~2080375680] --> OK [~0.20803756E10,TO_POSINF] --> [~2080375552,~2080375552] --> OK [~0.20803754E10,TO_POSINF] --> [~2080375424,~2080375424] --> OK [~0.20803753E10,TO_POSINF] --> [~2080375296,~2080375296] --> OK [~0.20803752E10,TO_POSINF] --> [~2080375168,~2080375168] --> OK [~0.2080375E10,TO_POSINF] --> [~2080375040,~2080375040] --> OK [~0.20803749E10,TO_POSINF] --> [~2080374912,~2080374912] --> OK [~0.20803748E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803666E10,TO_POSINF] --> [~2080366592,~2080366592] --> OK [~0.20803667E10,TO_POSINF] --> [~2080366720,~2080366720] --> OK [~0.20803668E10,TO_POSINF] --> [~2080366848,~2080366848] --> OK [~0.2080367E10,TO_POSINF] --> [~2080366976,~2080366976] --> OK [~0.20803671E10,TO_POSINF] --> [~2080367104,~2080367104] --> OK [~0.20803672E10,TO_POSINF] --> [~2080367232,~2080367232] --> OK [~0.20803674E10,TO_POSINF] --> [~2080367360,~2080367360] --> OK [~0.20803675E10,TO_POSINF] --> [~2080367488,~2080367488] --> OK [~0.20803676E10,TO_POSINF] --> [~2080367616,~2080367616] --> OK [~0.20803677E10,TO_POSINF] --> [~2080367744,~2080367744] --> OK [~0.20803679E10,TO_POSINF] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_POSINF] --> [~2080368000,~2080368000] --> OK [~0.20803681E10,TO_POSINF] --> [~2080368128,~2080368128] --> OK [~0.20803683E10,TO_POSINF] --> [~2080368256,~2080368256] --> OK [~0.20803684E10,TO_POSINF] --> [~2080368384,~2080368384] --> OK [~0.20803685E10,TO_POSINF] --> [~2080368512,~2080368512] --> OK [~0.20803686E10,TO_POSINF] --> [~2080368640,~2080368640] --> OK [~0.20803688E10,TO_POSINF] --> [~2080368768,~2080368768] --> OK [~0.20803689E10,TO_POSINF] --> [~2080368896,~2080368896] --> OK [~0.2080369E10,TO_POSINF] --> [~2080369024,~2080369024] --> OK [~0.20803692E10,TO_POSINF] --> [~2080369152,~2080369152] --> OK [~0.20803693E10,TO_POSINF] --> [~2080369280,~2080369280] --> OK [~0.20803694E10,TO_POSINF] --> [~2080369408,~2080369408] --> OK [~0.20803695E10,TO_POSINF] --> [~2080369536,~2080369536] --> OK [~0.20803697E10,TO_POSINF] --> [~2080369664,~2080369664] --> OK [~0.20803698E10,TO_POSINF] --> [~2080369792,~2080369792] --> OK [~0.20803699E10,TO_POSINF] --> [~2080369920,~2080369920] --> OK [~0.208037E10,TO_POSINF] --> [~2080370048,~2080370048] --> OK [~0.20803702E10,TO_POSINF] --> [~2080370176,~2080370176] --> OK [~0.20803703E10,TO_POSINF] --> [~2080370304,~2080370304] --> OK [~0.20803704E10,TO_POSINF] --> [~2080370432,~2080370432] --> OK [~0.20803706E10,TO_POSINF] --> [~2080370560,~2080370560] --> OK [~0.20803707E10,TO_POSINF] --> [~2080370688,~2080370688] --> OK [~0.20803708E10,TO_POSINF] --> [~2080370816,~2080370816] --> OK [~0.2080371E10,TO_POSINF] --> [~2080370944,~2080370944] --> OK [~0.20803711E10,TO_POSINF] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_POSINF] --> [~2080371200,~2080371200] --> OK [~0.20803713E10,TO_POSINF] --> [~2080371328,~2080371328] --> OK [~0.20803715E10,TO_POSINF] --> [~2080371456,~2080371456] --> OK [~0.20803716E10,TO_POSINF] --> [~2080371584,~2080371584] --> OK [~0.20803717E10,TO_POSINF] --> [~2080371712,~2080371712] --> OK [~0.20803718E10,TO_POSINF] --> [~2080371840,~2080371840] --> OK [~0.2080372E10,TO_POSINF] --> [~2080371968,~2080371968] --> OK [~0.20803721E10,TO_POSINF] --> [~2080372096,~2080372096] --> OK [~0.20803722E10,TO_POSINF] --> [~2080372224,~2080372224] --> OK [~0.20803724E10,TO_POSINF] --> [~2080372352,~2080372352] --> OK [~0.20803725E10,TO_POSINF] --> [~2080372480,~2080372480] --> OK [~0.20803726E10,TO_POSINF] --> [~2080372608,~2080372608] --> OK [~0.20803727E10,TO_POSINF] --> [~2080372736,~2080372736] --> OK [~0.20803729E10,TO_POSINF] --> [~2080372864,~2080372864] --> OK [~0.2080373E10,TO_POSINF] --> [~2080372992,~2080372992] --> OK [~0.20803731E10,TO_POSINF] --> [~2080373120,~2080373120] --> OK [~0.20803732E10,TO_POSINF] --> [~2080373248,~2080373248] --> OK [~0.20803734E10,TO_POSINF] --> [~2080373376,~2080373376] --> OK [~0.20803735E10,TO_POSINF] --> [~2080373504,~2080373504] --> OK [~0.20803736E10,TO_POSINF] --> [~2080373632,~2080373632] --> OK [~0.20803738E10,TO_POSINF] --> [~2080373760,~2080373760] --> OK [~0.20803739E10,TO_POSINF] --> [~2080373888,~2080373888] --> OK [~0.2080374E10,TO_POSINF] --> [~2080374016,~2080374016] --> OK [~0.20803741E10,TO_POSINF] --> [~2080374144,~2080374144] --> OK [~0.20803743E10,TO_POSINF] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_POSINF] --> [~2080374400,~2080374400] --> OK [~0.20803745E10,TO_POSINF] --> [~2080374528,~2080374528] --> OK [~0.20803747E10,TO_POSINF] --> [~2080374656,~2080374656] --> OK [~0.20132741E10,TO_POSINF] --> [~2013274112,~2013274112] --> OK [~0.2013274E10,TO_POSINF] --> [~2013273984,~2013273984] --> OK [~0.20132739E10,TO_POSINF] --> [~2013273856,~2013273856] --> OK [~0.20132737E10,TO_POSINF] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_POSINF] --> [~2013273600,~2013273600] --> OK [~0.20132735E10,TO_POSINF] --> [~2013273472,~2013273472] --> OK [~0.20132733E10,TO_POSINF] --> [~2013273344,~2013273344] --> OK [~0.20132732E10,TO_POSINF] --> [~2013273216,~2013273216] --> OK [~0.20132731E10,TO_POSINF] --> [~2013273088,~2013273088] --> OK [~0.2013273E10,TO_POSINF] --> [~2013272960,~2013272960] --> OK [~0.20132728E10,TO_POSINF] --> [~2013272832,~2013272832] --> OK [~0.20132727E10,TO_POSINF] --> [~2013272704,~2013272704] --> OK [~0.20132726E10,TO_POSINF] --> [~2013272576,~2013272576] --> OK [~0.20132724E10,TO_POSINF] --> [~2013272448,~2013272448] --> OK [~0.20132723E10,TO_POSINF] --> [~2013272320,~2013272320] --> OK [~0.20132722E10,TO_POSINF] --> [~2013272192,~2013272192] --> OK [~0.2013272E10,TO_POSINF] --> [~2013272064,~2013272064] --> OK [~0.20132719E10,TO_POSINF] --> [~2013271936,~2013271936] --> OK [~0.20132718E10,TO_POSINF] --> [~2013271808,~2013271808] --> OK [~0.20132717E10,TO_POSINF] --> [~2013271680,~2013271680] --> OK [~0.20132716E10,TO_POSINF] --> [~2013271552,~2013271552] --> OK [~0.20132714E10,TO_POSINF] --> [~2013271424,~2013271424] --> OK [~0.20132713E10,TO_POSINF] --> [~2013271296,~2013271296] --> OK [~0.20132712E10,TO_POSINF] --> [~2013271168,~2013271168] --> OK [~0.2013271E10,TO_POSINF] --> [~2013271040,~2013271040] --> OK [~0.20132709E10,TO_POSINF] --> [~2013270912,~2013270912] --> OK [~0.20132708E10,TO_POSINF] --> [~2013270784,~2013270784] --> OK [~0.20132707E10,TO_POSINF] --> [~2013270656,~2013270656] --> OK [~0.20132705E10,TO_POSINF] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_POSINF] --> [~2013270400,~2013270400] --> OK [~0.20132703E10,TO_POSINF] --> [~2013270272,~2013270272] --> OK [~0.20132701E10,TO_POSINF] --> [~2013270144,~2013270144] --> OK [~0.201327E10,TO_POSINF] --> [~2013270016,~2013270016] --> OK [~0.20132699E10,TO_POSINF] --> [~2013269888,~2013269888] --> OK [~0.20132698E10,TO_POSINF] --> [~2013269760,~2013269760] --> OK [~0.20132696E10,TO_POSINF] --> [~2013269632,~2013269632] --> OK [~0.20132695E10,TO_POSINF] --> [~2013269504,~2013269504] --> OK [~0.20132694E10,TO_POSINF] --> [~2013269376,~2013269376] --> OK [~0.20132692E10,TO_POSINF] --> [~2013269248,~2013269248] --> OK [~0.20132691E10,TO_POSINF] --> [~2013269120,~2013269120] --> OK [~0.2013269E10,TO_POSINF] --> [~2013268992,~2013268992] --> OK [~0.20132689E10,TO_POSINF] --> [~2013268864,~2013268864] --> OK [~0.20132687E10,TO_POSINF] --> [~2013268736,~2013268736] --> OK [~0.20132686E10,TO_POSINF] --> [~2013268608,~2013268608] --> OK [~0.20132685E10,TO_POSINF] --> [~2013268480,~2013268480] --> OK [~0.20132684E10,TO_POSINF] --> [~2013268352,~2013268352] --> OK [~0.20132682E10,TO_POSINF] --> [~2013268224,~2013268224] --> OK [~0.20132681E10,TO_POSINF] --> [~2013268096,~2013268096] --> OK [~0.2013268E10,TO_POSINF] --> [~2013267968,~2013267968] --> OK [~0.20132678E10,TO_POSINF] --> [~2013267840,~2013267840] --> OK [~0.20132677E10,TO_POSINF] --> [~2013267712,~2013267712] --> OK [~0.20132676E10,TO_POSINF] --> [~2013267584,~2013267584] --> OK [~0.20132675E10,TO_POSINF] --> [~2013267456,~2013267456] --> OK [~0.20132673E10,TO_POSINF] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_POSINF] --> [~2013267200,~2013267200] --> OK [~0.20132671E10,TO_POSINF] --> [~2013267072,~2013267072] --> OK [~0.2013267E10,TO_POSINF] --> [~2013266944,~2013266944] --> OK [~0.20132668E10,TO_POSINF] --> [~2013266816,~2013266816] --> OK [~0.20132667E10,TO_POSINF] --> [~2013266688,~2013266688] --> OK [~0.20132666E10,TO_POSINF] --> [~2013266560,~2013266560] --> OK [~0.20132664E10,TO_POSINF] --> [~2013266432,~2013266432] --> OK [~0.20132663E10,TO_POSINF] --> [~2013266304,~2013266304] --> OK [~0.20132662E10,TO_POSINF] --> [~2013266176,~2013266176] --> OK [~0.2013266E10,TO_POSINF] --> [~2013266048,~2013266048] --> OK [~0.20132659E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132577E10,TO_POSINF] --> [~2013257728,~2013257728] --> OK [~0.20132579E10,TO_POSINF] --> [~2013257856,~2013257856] --> OK [~0.2013258E10,TO_POSINF] --> [~2013257984,~2013257984] --> OK [~0.20132581E10,TO_POSINF] --> [~2013258112,~2013258112] --> OK [~0.20132582E10,TO_POSINF] --> [~2013258240,~2013258240] --> OK [~0.20132584E10,TO_POSINF] --> [~2013258368,~2013258368] --> OK [~0.20132585E10,TO_POSINF] --> [~2013258496,~2013258496] --> OK [~0.20132586E10,TO_POSINF] --> [~2013258624,~2013258624] --> OK [~0.20132588E10,TO_POSINF] --> [~2013258752,~2013258752] --> OK [~0.20132589E10,TO_POSINF] --> [~2013258880,~2013258880] --> OK [~0.2013259E10,TO_POSINF] --> [~2013259008,~2013259008] --> OK [~0.20132591E10,TO_POSINF] --> [~2013259136,~2013259136] --> OK [~0.20132593E10,TO_POSINF] --> [~2013259264,~2013259264] --> OK [~0.20132594E10,TO_POSINF] --> [~2013259392,~2013259392] --> OK [~0.20132595E10,TO_POSINF] --> [~2013259520,~2013259520] --> OK [~0.20132596E10,TO_POSINF] --> [~2013259648,~2013259648] --> OK [~0.20132598E10,TO_POSINF] --> [~2013259776,~2013259776] --> OK [~0.20132599E10,TO_POSINF] --> [~2013259904,~2013259904] --> OK [~0.201326E10,TO_POSINF] --> [~2013260032,~2013260032] --> OK [~0.20132602E10,TO_POSINF] --> [~2013260160,~2013260160] --> OK [~0.20132603E10,TO_POSINF] --> [~2013260288,~2013260288] --> OK [~0.20132604E10,TO_POSINF] --> [~2013260416,~2013260416] --> OK [~0.20132605E10,TO_POSINF] --> [~2013260544,~2013260544] --> OK [~0.20132607E10,TO_POSINF] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_POSINF] --> [~2013260800,~2013260800] --> OK [~0.20132609E10,TO_POSINF] --> [~2013260928,~2013260928] --> OK [~0.2013261E10,TO_POSINF] --> [~2013261056,~2013261056] --> OK [~0.20132612E10,TO_POSINF] --> [~2013261184,~2013261184] --> OK [~0.20132613E10,TO_POSINF] --> [~2013261312,~2013261312] --> OK [~0.20132614E10,TO_POSINF] --> [~2013261440,~2013261440] --> OK [~0.20132616E10,TO_POSINF] --> [~2013261568,~2013261568] --> OK [~0.20132617E10,TO_POSINF] --> [~2013261696,~2013261696] --> OK [~0.20132618E10,TO_POSINF] --> [~2013261824,~2013261824] --> OK [~0.2013262E10,TO_POSINF] --> [~2013261952,~2013261952] --> OK [~0.20132621E10,TO_POSINF] --> [~2013262080,~2013262080] --> OK [~0.20132622E10,TO_POSINF] --> [~2013262208,~2013262208] --> OK [~0.20132623E10,TO_POSINF] --> [~2013262336,~2013262336] --> OK [~0.20132625E10,TO_POSINF] --> [~2013262464,~2013262464] --> OK [~0.20132626E10,TO_POSINF] --> [~2013262592,~2013262592] --> OK [~0.20132627E10,TO_POSINF] --> [~2013262720,~2013262720] --> OK [~0.20132628E10,TO_POSINF] --> [~2013262848,~2013262848] --> OK [~0.2013263E10,TO_POSINF] --> [~2013262976,~2013262976] --> OK [~0.20132631E10,TO_POSINF] --> [~2013263104,~2013263104] --> OK [~0.20132632E10,TO_POSINF] --> [~2013263232,~2013263232] --> OK [~0.20132634E10,TO_POSINF] --> [~2013263360,~2013263360] --> OK [~0.20132635E10,TO_POSINF] --> [~2013263488,~2013263488] --> OK [~0.20132636E10,TO_POSINF] --> [~2013263616,~2013263616] --> OK [~0.20132637E10,TO_POSINF] --> [~2013263744,~2013263744] --> OK [~0.20132639E10,TO_POSINF] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_POSINF] --> [~2013264000,~2013264000] --> OK [~0.20132641E10,TO_POSINF] --> [~2013264128,~2013264128] --> OK [~0.20132643E10,TO_POSINF] --> [~2013264256,~2013264256] --> OK [~0.20132644E10,TO_POSINF] --> [~2013264384,~2013264384] --> OK [~0.20132645E10,TO_POSINF] --> [~2013264512,~2013264512] --> OK [~0.20132646E10,TO_POSINF] --> [~2013264640,~2013264640] --> OK [~0.20132648E10,TO_POSINF] --> [~2013264768,~2013264768] --> OK [~0.20132649E10,TO_POSINF] --> [~2013264896,~2013264896] --> OK [~0.2013265E10,TO_POSINF] --> [~2013265024,~2013265024] --> OK [~0.20132652E10,TO_POSINF] --> [~2013265152,~2013265152] --> OK [~0.20132653E10,TO_POSINF] --> [~2013265280,~2013265280] --> OK [~0.20132654E10,TO_POSINF] --> [~2013265408,~2013265408] --> OK [~0.20132655E10,TO_POSINF] --> [~2013265536,~2013265536] --> OK [~0.20132657E10,TO_POSINF] --> [~2013265664,~2013265664] --> OK [~0.20132658E10,TO_POSINF] --> [~2013265792,~2013265792] --> OK [~0.18790564E10,TO_POSINF] --> [~1879056384,~1879056384] --> OK [~0.18790563E10,TO_POSINF] --> [~1879056256,~1879056256] --> OK [~0.18790561E10,TO_POSINF] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_POSINF] --> [~1879056000,~1879056000] --> OK [~0.18790559E10,TO_POSINF] --> [~1879055872,~1879055872] --> OK [~0.18790557E10,TO_POSINF] --> [~1879055744,~1879055744] --> OK [~0.18790556E10,TO_POSINF] --> [~1879055616,~1879055616] --> OK [~0.18790555E10,TO_POSINF] --> [~1879055488,~1879055488] --> OK [~0.18790554E10,TO_POSINF] --> [~1879055360,~1879055360] --> OK [~0.18790552E10,TO_POSINF] --> [~1879055232,~1879055232] --> OK [~0.18790551E10,TO_POSINF] --> [~1879055104,~1879055104] --> OK [~0.1879055E10,TO_POSINF] --> [~1879054976,~1879054976] --> OK [~0.18790548E10,TO_POSINF] --> [~1879054848,~1879054848] --> OK [~0.18790547E10,TO_POSINF] --> [~1879054720,~1879054720] --> OK [~0.18790546E10,TO_POSINF] --> [~1879054592,~1879054592] --> OK [~0.18790545E10,TO_POSINF] --> [~1879054464,~1879054464] --> OK [~0.18790543E10,TO_POSINF] --> [~1879054336,~1879054336] --> OK [~0.18790542E10,TO_POSINF] --> [~1879054208,~1879054208] --> OK [~0.18790541E10,TO_POSINF] --> [~1879054080,~1879054080] --> OK [~0.1879054E10,TO_POSINF] --> [~1879053952,~1879053952] --> OK [~0.18790538E10,TO_POSINF] --> [~1879053824,~1879053824] --> OK [~0.18790537E10,TO_POSINF] --> [~1879053696,~1879053696] --> OK [~0.18790536E10,TO_POSINF] --> [~1879053568,~1879053568] --> OK [~0.18790534E10,TO_POSINF] --> [~1879053440,~1879053440] --> OK [~0.18790533E10,TO_POSINF] --> [~1879053312,~1879053312] --> OK [~0.18790532E10,TO_POSINF] --> [~1879053184,~1879053184] --> OK [~0.1879053E10,TO_POSINF] --> [~1879053056,~1879053056] --> OK [~0.18790529E10,TO_POSINF] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_POSINF] --> [~1879052800,~1879052800] --> OK [~0.18790527E10,TO_POSINF] --> [~1879052672,~1879052672] --> OK [~0.18790525E10,TO_POSINF] --> [~1879052544,~1879052544] --> OK [~0.18790524E10,TO_POSINF] --> [~1879052416,~1879052416] --> OK [~0.18790523E10,TO_POSINF] --> [~1879052288,~1879052288] --> OK [~0.18790522E10,TO_POSINF] --> [~1879052160,~1879052160] --> OK [~0.1879052E10,TO_POSINF] --> [~1879052032,~1879052032] --> OK [~0.18790519E10,TO_POSINF] --> [~1879051904,~1879051904] --> OK [~0.18790518E10,TO_POSINF] --> [~1879051776,~1879051776] --> OK [~0.18790516E10,TO_POSINF] --> [~1879051648,~1879051648] --> OK [~0.18790515E10,TO_POSINF] --> [~1879051520,~1879051520] --> OK [~0.18790514E10,TO_POSINF] --> [~1879051392,~1879051392] --> OK [~0.18790513E10,TO_POSINF] --> [~1879051264,~1879051264] --> OK [~0.18790511E10,TO_POSINF] --> [~1879051136,~1879051136] --> OK [~0.1879051E10,TO_POSINF] --> [~1879051008,~1879051008] --> OK [~0.18790509E10,TO_POSINF] --> [~1879050880,~1879050880] --> OK [~0.18790508E10,TO_POSINF] --> [~1879050752,~1879050752] --> OK [~0.18790506E10,TO_POSINF] --> [~1879050624,~1879050624] --> OK [~0.18790505E10,TO_POSINF] --> [~1879050496,~1879050496] --> OK [~0.18790504E10,TO_POSINF] --> [~1879050368,~1879050368] --> OK [~0.18790502E10,TO_POSINF] --> [~1879050240,~1879050240] --> OK [~0.18790501E10,TO_POSINF] --> [~1879050112,~1879050112] --> OK [~0.187905E10,TO_POSINF] --> [~1879049984,~1879049984] --> OK [~0.18790499E10,TO_POSINF] --> [~1879049856,~1879049856] --> OK [~0.18790497E10,TO_POSINF] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_POSINF] --> [~1879049600,~1879049600] --> OK [~0.18790495E10,TO_POSINF] --> [~1879049472,~1879049472] --> OK [~0.18790493E10,TO_POSINF] --> [~1879049344,~1879049344] --> OK [~0.18790492E10,TO_POSINF] --> [~1879049216,~1879049216] --> OK [~0.18790491E10,TO_POSINF] --> [~1879049088,~1879049088] --> OK [~0.1879049E10,TO_POSINF] --> [~1879048960,~1879048960] --> OK [~0.18790488E10,TO_POSINF] --> [~1879048832,~1879048832] --> OK [~0.18790487E10,TO_POSINF] --> [~1879048704,~1879048704] --> OK [~0.18790486E10,TO_POSINF] --> [~1879048576,~1879048576] --> OK [~0.18790484E10,TO_POSINF] --> [~1879048448,~1879048448] --> OK [~0.18790483E10,TO_POSINF] --> [~1879048320,~1879048320] --> OK [~0.18790482E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_POSINF] --> [~1879040000,~1879040000] --> OK [~0.18790401E10,TO_POSINF] --> [~1879040128,~1879040128] --> OK [~0.18790403E10,TO_POSINF] --> [~1879040256,~1879040256] --> OK [~0.18790404E10,TO_POSINF] --> [~1879040384,~1879040384] --> OK [~0.18790405E10,TO_POSINF] --> [~1879040512,~1879040512] --> OK [~0.18790406E10,TO_POSINF] --> [~1879040640,~1879040640] --> OK [~0.18790408E10,TO_POSINF] --> [~1879040768,~1879040768] --> OK [~0.18790409E10,TO_POSINF] --> [~1879040896,~1879040896] --> OK [~0.1879041E10,TO_POSINF] --> [~1879041024,~1879041024] --> OK [~0.18790412E10,TO_POSINF] --> [~1879041152,~1879041152] --> OK [~0.18790413E10,TO_POSINF] --> [~1879041280,~1879041280] --> OK [~0.18790414E10,TO_POSINF] --> [~1879041408,~1879041408] --> OK [~0.18790415E10,TO_POSINF] --> [~1879041536,~1879041536] --> OK [~0.18790417E10,TO_POSINF] --> [~1879041664,~1879041664] --> OK [~0.18790418E10,TO_POSINF] --> [~1879041792,~1879041792] --> OK [~0.18790419E10,TO_POSINF] --> [~1879041920,~1879041920] --> OK [~0.1879042E10,TO_POSINF] --> [~1879042048,~1879042048] --> OK [~0.18790422E10,TO_POSINF] --> [~1879042176,~1879042176] --> OK [~0.18790423E10,TO_POSINF] --> [~1879042304,~1879042304] --> OK [~0.18790424E10,TO_POSINF] --> [~1879042432,~1879042432] --> OK [~0.18790426E10,TO_POSINF] --> [~1879042560,~1879042560] --> OK [~0.18790427E10,TO_POSINF] --> [~1879042688,~1879042688] --> OK [~0.18790428E10,TO_POSINF] --> [~1879042816,~1879042816] --> OK [~0.1879043E10,TO_POSINF] --> [~1879042944,~1879042944] --> OK [~0.18790431E10,TO_POSINF] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_POSINF] --> [~1879043200,~1879043200] --> OK [~0.18790433E10,TO_POSINF] --> [~1879043328,~1879043328] --> OK [~0.18790435E10,TO_POSINF] --> [~1879043456,~1879043456] --> OK [~0.18790436E10,TO_POSINF] --> [~1879043584,~1879043584] --> OK [~0.18790437E10,TO_POSINF] --> [~1879043712,~1879043712] --> OK [~0.18790438E10,TO_POSINF] --> [~1879043840,~1879043840] --> OK [~0.1879044E10,TO_POSINF] --> [~1879043968,~1879043968] --> OK [~0.18790441E10,TO_POSINF] --> [~1879044096,~1879044096] --> OK [~0.18790442E10,TO_POSINF] --> [~1879044224,~1879044224] --> OK [~0.18790444E10,TO_POSINF] --> [~1879044352,~1879044352] --> OK [~0.18790445E10,TO_POSINF] --> [~1879044480,~1879044480] --> OK [~0.18790446E10,TO_POSINF] --> [~1879044608,~1879044608] --> OK [~0.18790447E10,TO_POSINF] --> [~1879044736,~1879044736] --> OK [~0.18790449E10,TO_POSINF] --> [~1879044864,~1879044864] --> OK [~0.1879045E10,TO_POSINF] --> [~1879044992,~1879044992] --> OK [~0.18790451E10,TO_POSINF] --> [~1879045120,~1879045120] --> OK [~0.18790452E10,TO_POSINF] --> [~1879045248,~1879045248] --> OK [~0.18790454E10,TO_POSINF] --> [~1879045376,~1879045376] --> OK [~0.18790455E10,TO_POSINF] --> [~1879045504,~1879045504] --> OK [~0.18790456E10,TO_POSINF] --> [~1879045632,~1879045632] --> OK [~0.18790458E10,TO_POSINF] --> [~1879045760,~1879045760] --> OK [~0.18790459E10,TO_POSINF] --> [~1879045888,~1879045888] --> OK [~0.1879046E10,TO_POSINF] --> [~1879046016,~1879046016] --> OK [~0.18790461E10,TO_POSINF] --> [~1879046144,~1879046144] --> OK [~0.18790463E10,TO_POSINF] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_POSINF] --> [~1879046400,~1879046400] --> OK [~0.18790465E10,TO_POSINF] --> [~1879046528,~1879046528] --> OK [~0.18790467E10,TO_POSINF] --> [~1879046656,~1879046656] --> OK [~0.18790468E10,TO_POSINF] --> [~1879046784,~1879046784] --> OK [~0.18790469E10,TO_POSINF] --> [~1879046912,~1879046912] --> OK [~0.1879047E10,TO_POSINF] --> [~1879047040,~1879047040] --> OK [~0.18790472E10,TO_POSINF] --> [~1879047168,~1879047168] --> OK [~0.18790473E10,TO_POSINF] --> [~1879047296,~1879047296] --> OK [~0.18790474E10,TO_POSINF] --> [~1879047424,~1879047424] --> OK [~0.18790476E10,TO_POSINF] --> [~1879047552,~1879047552] --> OK [~0.18790477E10,TO_POSINF] --> [~1879047680,~1879047680] --> OK [~0.18790478E10,TO_POSINF] --> [~1879047808,~1879047808] --> OK [~0.1879048E10,TO_POSINF] --> [~1879047936,~1879047936] --> OK [~0.18790481E10,TO_POSINF] --> [~1879048064,~1879048064] --> OK [~0.16106209E10,TO_POSINF] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_POSINF] --> [~1610620800,~1610620800] --> OK [~0.16106207E10,TO_POSINF] --> [~1610620672,~1610620672] --> OK [~0.16106205E10,TO_POSINF] --> [~1610620544,~1610620544] --> OK [~0.16106204E10,TO_POSINF] --> [~1610620416,~1610620416] --> OK [~0.16106203E10,TO_POSINF] --> [~1610620288,~1610620288] --> OK [~0.16106202E10,TO_POSINF] --> [~1610620160,~1610620160] --> OK [~0.161062E10,TO_POSINF] --> [~1610620032,~1610620032] --> OK [~0.16106199E10,TO_POSINF] --> [~1610619904,~1610619904] --> OK [~0.16106198E10,TO_POSINF] --> [~1610619776,~1610619776] --> OK [~0.16106196E10,TO_POSINF] --> [~1610619648,~1610619648] --> OK [~0.16106195E10,TO_POSINF] --> [~1610619520,~1610619520] --> OK [~0.16106194E10,TO_POSINF] --> [~1610619392,~1610619392] --> OK [~0.16106193E10,TO_POSINF] --> [~1610619264,~1610619264] --> OK [~0.16106191E10,TO_POSINF] --> [~1610619136,~1610619136] --> OK [~0.1610619E10,TO_POSINF] --> [~1610619008,~1610619008] --> OK [~0.16106189E10,TO_POSINF] --> [~1610618880,~1610618880] --> OK [~0.16106188E10,TO_POSINF] --> [~1610618752,~1610618752] --> OK [~0.16106186E10,TO_POSINF] --> [~1610618624,~1610618624] --> OK [~0.16106185E10,TO_POSINF] --> [~1610618496,~1610618496] --> OK [~0.16106184E10,TO_POSINF] --> [~1610618368,~1610618368] --> OK [~0.16106182E10,TO_POSINF] --> [~1610618240,~1610618240] --> OK [~0.16106181E10,TO_POSINF] --> [~1610618112,~1610618112] --> OK [~0.1610618E10,TO_POSINF] --> [~1610617984,~1610617984] --> OK [~0.16106179E10,TO_POSINF] --> [~1610617856,~1610617856] --> OK [~0.16106177E10,TO_POSINF] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_POSINF] --> [~1610617600,~1610617600] --> OK [~0.16106175E10,TO_POSINF] --> [~1610617472,~1610617472] --> OK [~0.16106173E10,TO_POSINF] --> [~1610617344,~1610617344] --> OK [~0.16106172E10,TO_POSINF] --> [~1610617216,~1610617216] --> OK [~0.16106171E10,TO_POSINF] --> [~1610617088,~1610617088] --> OK [~0.1610617E10,TO_POSINF] --> [~1610616960,~1610616960] --> OK [~0.16106168E10,TO_POSINF] --> [~1610616832,~1610616832] --> OK [~0.16106167E10,TO_POSINF] --> [~1610616704,~1610616704] --> OK [~0.16106166E10,TO_POSINF] --> [~1610616576,~1610616576] --> OK [~0.16106164E10,TO_POSINF] --> [~1610616448,~1610616448] --> OK [~0.16106163E10,TO_POSINF] --> [~1610616320,~1610616320] --> OK [~0.16106162E10,TO_POSINF] --> [~1610616192,~1610616192] --> OK [~0.1610616E10,TO_POSINF] --> [~1610616064,~1610616064] --> OK [~0.16106159E10,TO_POSINF] --> [~1610615936,~1610615936] --> OK [~0.16106158E10,TO_POSINF] --> [~1610615808,~1610615808] --> OK [~0.16106157E10,TO_POSINF] --> [~1610615680,~1610615680] --> OK [~0.16106156E10,TO_POSINF] --> [~1610615552,~1610615552] --> OK [~0.16106154E10,TO_POSINF] --> [~1610615424,~1610615424] --> OK [~0.16106153E10,TO_POSINF] --> [~1610615296,~1610615296] --> OK [~0.16106152E10,TO_POSINF] --> [~1610615168,~1610615168] --> OK [~0.1610615E10,TO_POSINF] --> [~1610615040,~1610615040] --> OK [~0.16106149E10,TO_POSINF] --> [~1610614912,~1610614912] --> OK [~0.16106148E10,TO_POSINF] --> [~1610614784,~1610614784] --> OK [~0.16106147E10,TO_POSINF] --> [~1610614656,~1610614656] --> OK [~0.16106145E10,TO_POSINF] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_POSINF] --> [~1610614400,~1610614400] --> OK [~0.16106143E10,TO_POSINF] --> [~1610614272,~1610614272] --> OK [~0.16106141E10,TO_POSINF] --> [~1610614144,~1610614144] --> OK [~0.1610614E10,TO_POSINF] --> [~1610614016,~1610614016] --> OK [~0.16106139E10,TO_POSINF] --> [~1610613888,~1610613888] --> OK [~0.16106138E10,TO_POSINF] --> [~1610613760,~1610613760] --> OK [~0.16106136E10,TO_POSINF] --> [~1610613632,~1610613632] --> OK [~0.16106135E10,TO_POSINF] --> [~1610613504,~1610613504] --> OK [~0.16106134E10,TO_POSINF] --> [~1610613376,~1610613376] --> OK [~0.16106132E10,TO_POSINF] --> [~1610613248,~1610613248] --> OK [~0.16106131E10,TO_POSINF] --> [~1610613120,~1610613120] --> OK [~0.1610613E10,TO_POSINF] --> [~1610612992,~1610612992] --> OK [~0.16106129E10,TO_POSINF] --> [~1610612864,~1610612864] --> OK [~0.16106127E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106045E10,TO_POSINF] --> [~1610604544,~1610604544] --> OK [~0.16106047E10,TO_POSINF] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_POSINF] --> [~1610604800,~1610604800] --> OK [~0.16106049E10,TO_POSINF] --> [~1610604928,~1610604928] --> OK [~0.1610605E10,TO_POSINF] --> [~1610605056,~1610605056] --> OK [~0.16106052E10,TO_POSINF] --> [~1610605184,~1610605184] --> OK [~0.16106053E10,TO_POSINF] --> [~1610605312,~1610605312] --> OK [~0.16106054E10,TO_POSINF] --> [~1610605440,~1610605440] --> OK [~0.16106056E10,TO_POSINF] --> [~1610605568,~1610605568] --> OK [~0.16106057E10,TO_POSINF] --> [~1610605696,~1610605696] --> OK [~0.16106058E10,TO_POSINF] --> [~1610605824,~1610605824] --> OK [~0.1610606E10,TO_POSINF] --> [~1610605952,~1610605952] --> OK [~0.16106061E10,TO_POSINF] --> [~1610606080,~1610606080] --> OK [~0.16106062E10,TO_POSINF] --> [~1610606208,~1610606208] --> OK [~0.16106063E10,TO_POSINF] --> [~1610606336,~1610606336] --> OK [~0.16106065E10,TO_POSINF] --> [~1610606464,~1610606464] --> OK [~0.16106066E10,TO_POSINF] --> [~1610606592,~1610606592] --> OK [~0.16106067E10,TO_POSINF] --> [~1610606720,~1610606720] --> OK [~0.16106068E10,TO_POSINF] --> [~1610606848,~1610606848] --> OK [~0.1610607E10,TO_POSINF] --> [~1610606976,~1610606976] --> OK [~0.16106071E10,TO_POSINF] --> [~1610607104,~1610607104] --> OK [~0.16106072E10,TO_POSINF] --> [~1610607232,~1610607232] --> OK [~0.16106074E10,TO_POSINF] --> [~1610607360,~1610607360] --> OK [~0.16106075E10,TO_POSINF] --> [~1610607488,~1610607488] --> OK [~0.16106076E10,TO_POSINF] --> [~1610607616,~1610607616] --> OK [~0.16106077E10,TO_POSINF] --> [~1610607744,~1610607744] --> OK [~0.16106079E10,TO_POSINF] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_POSINF] --> [~1610608000,~1610608000] --> OK [~0.16106081E10,TO_POSINF] --> [~1610608128,~1610608128] --> OK [~0.16106083E10,TO_POSINF] --> [~1610608256,~1610608256] --> OK [~0.16106084E10,TO_POSINF] --> [~1610608384,~1610608384] --> OK [~0.16106085E10,TO_POSINF] --> [~1610608512,~1610608512] --> OK [~0.16106086E10,TO_POSINF] --> [~1610608640,~1610608640] --> OK [~0.16106088E10,TO_POSINF] --> [~1610608768,~1610608768] --> OK [~0.16106089E10,TO_POSINF] --> [~1610608896,~1610608896] --> OK [~0.1610609E10,TO_POSINF] --> [~1610609024,~1610609024] --> OK [~0.16106092E10,TO_POSINF] --> [~1610609152,~1610609152] --> OK [~0.16106093E10,TO_POSINF] --> [~1610609280,~1610609280] --> OK [~0.16106094E10,TO_POSINF] --> [~1610609408,~1610609408] --> OK [~0.16106095E10,TO_POSINF] --> [~1610609536,~1610609536] --> OK [~0.16106097E10,TO_POSINF] --> [~1610609664,~1610609664] --> OK [~0.16106098E10,TO_POSINF] --> [~1610609792,~1610609792] --> OK [~0.16106099E10,TO_POSINF] --> [~1610609920,~1610609920] --> OK [~0.161061E10,TO_POSINF] --> [~1610610048,~1610610048] --> OK [~0.16106102E10,TO_POSINF] --> [~1610610176,~1610610176] --> OK [~0.16106103E10,TO_POSINF] --> [~1610610304,~1610610304] --> OK [~0.16106104E10,TO_POSINF] --> [~1610610432,~1610610432] --> OK [~0.16106106E10,TO_POSINF] --> [~1610610560,~1610610560] --> OK [~0.16106107E10,TO_POSINF] --> [~1610610688,~1610610688] --> OK [~0.16106108E10,TO_POSINF] --> [~1610610816,~1610610816] --> OK [~0.1610611E10,TO_POSINF] --> [~1610610944,~1610610944] --> OK [~0.16106111E10,TO_POSINF] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_POSINF] --> [~1610611200,~1610611200] --> OK [~0.16106113E10,TO_POSINF] --> [~1610611328,~1610611328] --> OK [~0.16106115E10,TO_POSINF] --> [~1610611456,~1610611456] --> OK [~0.16106116E10,TO_POSINF] --> [~1610611584,~1610611584] --> OK [~0.16106117E10,TO_POSINF] --> [~1610611712,~1610611712] --> OK [~0.16106118E10,TO_POSINF] --> [~1610611840,~1610611840] --> OK [~0.1610612E10,TO_POSINF] --> [~1610611968,~1610611968] --> OK [~0.16106121E10,TO_POSINF] --> [~1610612096,~1610612096] --> OK [~0.16106122E10,TO_POSINF] --> [~1610612224,~1610612224] --> OK [~0.16106124E10,TO_POSINF] --> [~1610612352,~1610612352] --> OK [~0.16106125E10,TO_POSINF] --> [~1610612480,~1610612480] --> OK [~0.16106126E10,TO_POSINF] --> [~1610612608,~1610612608] --> OK [~0.107375E10,TO_POSINF] --> [~1073750016,~1073750016] --> OK [~0.10737499E10,TO_POSINF] --> [~1073749888,~1073749888] --> OK [~0.10737498E10,TO_POSINF] --> [~1073749760,~1073749760] --> OK [~0.10737496E10,TO_POSINF] --> [~1073749632,~1073749632] --> OK [~0.10737495E10,TO_POSINF] --> [~1073749504,~1073749504] --> OK [~0.10737494E10,TO_POSINF] --> [~1073749376,~1073749376] --> OK [~0.10737492E10,TO_POSINF] --> [~1073749248,~1073749248] --> OK [~0.10737491E10,TO_POSINF] --> [~1073749120,~1073749120] --> OK [~0.1073749E10,TO_POSINF] --> [~1073748992,~1073748992] --> OK [~0.10737489E10,TO_POSINF] --> [~1073748864,~1073748864] --> OK [~0.10737487E10,TO_POSINF] --> [~1073748736,~1073748736] --> OK [~0.10737486E10,TO_POSINF] --> [~1073748608,~1073748608] --> OK [~0.10737485E10,TO_POSINF] --> [~1073748480,~1073748480] --> OK [~0.10737484E10,TO_POSINF] --> [~1073748352,~1073748352] --> OK [~0.10737482E10,TO_POSINF] --> [~1073748224,~1073748224] --> OK [~0.10737481E10,TO_POSINF] --> [~1073748096,~1073748096] --> OK [~0.1073748E10,TO_POSINF] --> [~1073747968,~1073747968] --> OK [~0.10737478E10,TO_POSINF] --> [~1073747840,~1073747840] --> OK [~0.10737477E10,TO_POSINF] --> [~1073747712,~1073747712] --> OK [~0.10737476E10,TO_POSINF] --> [~1073747584,~1073747584] --> OK [~0.10737475E10,TO_POSINF] --> [~1073747456,~1073747456] --> OK [~0.10737473E10,TO_POSINF] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_POSINF] --> [~1073747200,~1073747200] --> OK [~0.10737471E10,TO_POSINF] --> [~1073747072,~1073747072] --> OK [~0.1073747E10,TO_POSINF] --> [~1073746944,~1073746944] --> OK [~0.10737468E10,TO_POSINF] --> [~1073746816,~1073746816] --> OK [~0.10737467E10,TO_POSINF] --> [~1073746688,~1073746688] --> OK [~0.10737466E10,TO_POSINF] --> [~1073746560,~1073746560] --> OK [~0.10737464E10,TO_POSINF] --> [~1073746432,~1073746432] --> OK [~0.10737463E10,TO_POSINF] --> [~1073746304,~1073746304] --> OK [~0.10737462E10,TO_POSINF] --> [~1073746176,~1073746176] --> OK [~0.1073746E10,TO_POSINF] --> [~1073746048,~1073746048] --> OK [~0.10737459E10,TO_POSINF] --> [~1073745920,~1073745920] --> OK [~0.10737458E10,TO_POSINF] --> [~1073745792,~1073745792] --> OK [~0.10737457E10,TO_POSINF] --> [~1073745664,~1073745664] --> OK [~0.10737455E10,TO_POSINF] --> [~1073745536,~1073745536] --> OK [~0.10737454E10,TO_POSINF] --> [~1073745408,~1073745408] --> OK [~0.10737453E10,TO_POSINF] --> [~1073745280,~1073745280] --> OK [~0.10737452E10,TO_POSINF] --> [~1073745152,~1073745152] --> OK [~0.1073745E10,TO_POSINF] --> [~1073745024,~1073745024] --> OK [~0.10737449E10,TO_POSINF] --> [~1073744896,~1073744896] --> OK [~0.10737448E10,TO_POSINF] --> [~1073744768,~1073744768] --> OK [~0.10737446E10,TO_POSINF] --> [~1073744640,~1073744640] --> OK [~0.10737445E10,TO_POSINF] --> [~1073744512,~1073744512] --> OK [~0.10737444E10,TO_POSINF] --> [~1073744384,~1073744384] --> OK [~0.10737443E10,TO_POSINF] --> [~1073744256,~1073744256] --> OK [~0.10737441E10,TO_POSINF] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_POSINF] --> [~1073744000,~1073744000] --> OK [~0.10737439E10,TO_POSINF] --> [~1073743872,~1073743872] --> OK [~0.10737437E10,TO_POSINF] --> [~1073743744,~1073743744] --> OK [~0.10737436E10,TO_POSINF] --> [~1073743616,~1073743616] --> OK [~0.10737435E10,TO_POSINF] --> [~1073743488,~1073743488] --> OK [~0.10737434E10,TO_POSINF] --> [~1073743360,~1073743360] --> OK [~0.10737432E10,TO_POSINF] --> [~1073743232,~1073743232] --> OK [~0.10737431E10,TO_POSINF] --> [~1073743104,~1073743104] --> OK [~0.1073743E10,TO_POSINF] --> [~1073742976,~1073742976] --> OK [~0.10737428E10,TO_POSINF] --> [~1073742848,~1073742848] --> OK [~0.10737427E10,TO_POSINF] --> [~1073742720,~1073742720] --> OK [~0.10737426E10,TO_POSINF] --> [~1073742592,~1073742592] --> OK [~0.10737425E10,TO_POSINF] --> [~1073742464,~1073742464] --> OK [~0.10737423E10,TO_POSINF] --> [~1073742336,~1073742336] --> OK [~0.10737422E10,TO_POSINF] --> [~1073742208,~1073742208] --> OK [~0.10737421E10,TO_POSINF] --> [~1073742080,~1073742080] --> OK [~0.1073742E10,TO_POSINF] --> [~1073741952,~1073741952] --> OK [~0.10737418E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737377E10,TO_POSINF] --> [~1073737728,~1073737728] --> OK [~0.10737378E10,TO_POSINF] --> [~1073737792,~1073737792] --> OK [~0.107373786E10,TO_POSINF] --> [~1073737856,~1073737856] --> OK [~0.10737379E10,TO_POSINF] --> [~1073737920,~1073737920] --> OK [~0.1073738E10,TO_POSINF] --> [~1073737984,~1073737984] --> OK [~0.107373805E10,TO_POSINF] --> [~1073738048,~1073738048] --> OK [~0.10737381E10,TO_POSINF] --> [~1073738112,~1073738112] --> OK [~0.10737382E10,TO_POSINF] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_POSINF] --> [~1073738240,~1073738240] --> OK [~0.10737383E10,TO_POSINF] --> [~1073738304,~1073738304] --> OK [~0.10737384E10,TO_POSINF] --> [~1073738368,~1073738368] --> OK [~0.107373843E10,TO_POSINF] --> [~1073738432,~1073738432] --> OK [~0.10737385E10,TO_POSINF] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_POSINF] --> [~1073738560,~1073738560] --> OK [~0.10737386E10,TO_POSINF] --> [~1073738624,~1073738624] --> OK [~0.10737387E10,TO_POSINF] --> [~1073738688,~1073738688] --> OK [~0.107373875E10,TO_POSINF] --> [~1073738752,~1073738752] --> OK [~0.10737388E10,TO_POSINF] --> [~1073738816,~1073738816] --> OK [~0.10737389E10,TO_POSINF] --> [~1073738880,~1073738880] --> OK [~0.107373894E10,TO_POSINF] --> [~1073738944,~1073738944] --> OK [~0.1073739E10,TO_POSINF] --> [~1073739008,~1073739008] --> OK [~0.10737391E10,TO_POSINF] --> [~1073739072,~1073739072] --> OK [~0.107373914E10,TO_POSINF] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_POSINF] --> [~1073739200,~1073739200] --> OK [~0.107373926E10,TO_POSINF] --> [~1073739264,~1073739264] --> OK [~0.10737393E10,TO_POSINF] --> [~1073739328,~1073739328] --> OK [~0.10737394E10,TO_POSINF] --> [~1073739392,~1073739392] --> OK [~0.107373946E10,TO_POSINF] --> [~1073739456,~1073739456] --> OK [~0.10737395E10,TO_POSINF] --> [~1073739520,~1073739520] --> OK [~0.10737396E10,TO_POSINF] --> [~1073739584,~1073739584] --> OK [~0.107373965E10,TO_POSINF] --> [~1073739648,~1073739648] --> OK [~0.10737397E10,TO_POSINF] --> [~1073739712,~1073739712] --> OK [~0.10737398E10,TO_POSINF] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_POSINF] --> [~1073739840,~1073739840] --> OK [~0.10737399E10,TO_POSINF] --> [~1073739904,~1073739904] --> OK [~0.107373997E10,TO_POSINF] --> [~1073739968,~1073739968] --> OK [~0.107374E10,TO_POSINF] --> [~1073740032,~1073740032] --> OK [~0.10737401E10,TO_POSINF] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_POSINF] --> [~1073740160,~1073740160] --> OK [~0.10737402E10,TO_POSINF] --> [~1073740224,~1073740224] --> OK [~0.10737403E10,TO_POSINF] --> [~1073740288,~1073740288] --> OK [~0.107374035E10,TO_POSINF] --> [~1073740352,~1073740352] --> OK [~0.10737404E10,TO_POSINF] --> [~1073740416,~1073740416] --> OK [~0.10737405E10,TO_POSINF] --> [~1073740480,~1073740480] --> OK [~0.107374054E10,TO_POSINF] --> [~1073740544,~1073740544] --> OK [~0.10737406E10,TO_POSINF] --> [~1073740608,~1073740608] --> OK [~0.10737407E10,TO_POSINF] --> [~1073740672,~1073740672] --> OK [~0.107374074E10,TO_POSINF] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_POSINF] --> [~1073740800,~1073740800] --> OK [~0.107374086E10,TO_POSINF] --> [~1073740864,~1073740864] --> OK [~0.10737409E10,TO_POSINF] --> [~1073740928,~1073740928] --> OK [~0.1073741E10,TO_POSINF] --> [~1073740992,~1073740992] --> OK [~0.107374106E10,TO_POSINF] --> [~1073741056,~1073741056] --> OK [~0.10737411E10,TO_POSINF] --> [~1073741120,~1073741120] --> OK [~0.10737412E10,TO_POSINF] --> [~1073741184,~1073741184] --> OK [~0.107374125E10,TO_POSINF] --> [~1073741248,~1073741248] --> OK [~0.10737413E10,TO_POSINF] --> [~1073741312,~1073741312] --> OK [~0.10737414E10,TO_POSINF] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_POSINF] --> [~1073741440,~1073741440] --> OK [~0.10737415E10,TO_POSINF] --> [~1073741504,~1073741504] --> OK [~0.10737416E10,TO_POSINF] --> [~1073741568,~1073741568] --> OK [~0.107374163E10,TO_POSINF] --> [~1073741632,~1073741632] --> OK [~0.10737417E10,TO_POSINF] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_POSINF] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000015E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000148E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000145E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000143E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000138E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000136E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000134E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000129E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000126E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000124E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000122E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000117E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000114E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000112E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000011E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000107E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000105E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000103E1,TO_POSINF] --> [~3,~3] --> OK [~0.300001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000098E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000095E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000093E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000009E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000088E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000086E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000083E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000008E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000079E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000076E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000074E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000072E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000067E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000064E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000062E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000006E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000057E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000055E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000052E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000048E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000045E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000043E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000038E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000036E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000033E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000003E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000029E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000026E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000024E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000021E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000017E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.3E1,TO_POSINF] --> [~3,~3] --> OK [~0.29999847E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999985E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999852E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999855E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999857E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999862E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999864E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999866E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999871E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999874E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999876E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999878E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999883E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999886E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999888E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999989E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999893E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999895E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999897E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999902E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999905E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999907E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999991E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999912E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999914E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999917E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999992E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999921E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999924E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999926E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999928E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999933E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999936E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999938E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999994E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999943E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999945E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999948E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999952E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999955E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999957E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999962E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999964E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999967E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999997E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999971E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999974E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999976E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999979E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999983E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000153E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000015E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000148E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000145E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000143E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000138E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000136E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000134E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000129E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000126E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000124E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000122E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000117E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000114E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000112E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000011E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000107E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000105E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000103E1,TO_POSINF] --> [~2,~2] --> OK [~0.200001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000098E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000095E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000093E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000009E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000088E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000086E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000083E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000008E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000079E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000076E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000074E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000072E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000067E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000064E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000062E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000006E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000057E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000055E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000052E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000048E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000045E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000043E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000038E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000036E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000033E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000003E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000029E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000026E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000024E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000021E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000017E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.2E1,TO_POSINF] --> [~2,~2] --> OK [~0.19999924E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999925E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999926E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999927E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999928E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999931E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999932E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999933E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999934E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999936E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999937E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999938E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999939E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999942E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999943E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999944E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999945E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999946E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999948E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999949E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999951E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999952E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999954E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999955E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999956E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999957E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999958E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999961E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999962E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999963E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999964E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999965E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999967E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999968E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999969E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999997E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999971E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999973E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999974E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999975E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999976E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999977E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999979E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999981E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999982E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999983E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999985E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999986E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999988E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999989E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999992E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000076E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000075E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000074E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000073E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000072E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000069E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000068E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000067E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000066E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000064E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000063E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000062E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000061E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000058E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000057E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000056E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000055E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000054E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000052E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000051E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000049E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000048E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000046E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000045E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000044E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000043E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000042E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000039E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000038E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000037E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000036E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000035E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000033E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000032E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000031E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000003E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000029E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000027E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000026E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000025E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000024E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000023E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000021E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000019E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000018E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000017E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000015E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000014E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000012E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000011E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000008E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.1E1,TO_POSINF] --> [~1,~1] --> OK [~0.9999962,TO_POSINF] --> [0,0] --> OK [~0.99999624,TO_POSINF] --> [0,0] --> OK [~0.9999963,TO_POSINF] --> [0,0] --> OK [~0.99999636,TO_POSINF] --> [0,0] --> OK [~0.9999964,TO_POSINF] --> [0,0] --> OK [~0.9999965,TO_POSINF] --> [0,0] --> OK [~0.99999654,TO_POSINF] --> [0,0] --> OK [~0.9999966,TO_POSINF] --> [0,0] --> OK [~0.99999666,TO_POSINF] --> [0,0] --> OK [~0.9999967,TO_POSINF] --> [0,0] --> OK [~0.9999968,TO_POSINF] --> [0,0] --> OK [~0.99999684,TO_POSINF] --> [0,0] --> OK [~0.9999969,TO_POSINF] --> [0,0] --> OK [~0.99999696,TO_POSINF] --> [0,0] --> OK [~0.999997,TO_POSINF] --> [0,0] --> OK [~0.9999971,TO_POSINF] --> [0,0] --> OK [~0.99999714,TO_POSINF] --> [0,0] --> OK [~0.9999972,TO_POSINF] --> [0,0] --> OK [~0.99999726,TO_POSINF] --> [0,0] --> OK [~0.9999973,TO_POSINF] --> [0,0] --> OK [~0.9999974,TO_POSINF] --> [0,0] --> OK [~0.99999744,TO_POSINF] --> [0,0] --> OK [~0.9999975,TO_POSINF] --> [0,0] --> OK [~0.99999756,TO_POSINF] --> [0,0] --> OK [~0.9999976,TO_POSINF] --> [0,0] --> OK [~0.9999977,TO_POSINF] --> [0,0] --> OK [~0.99999774,TO_POSINF] --> [0,0] --> OK [~0.9999978,TO_POSINF] --> [0,0] --> OK [~0.99999785,TO_POSINF] --> [0,0] --> OK [~0.9999979,TO_POSINF] --> [0,0] --> OK [~0.999998,TO_POSINF] --> [0,0] --> OK [~0.99999803,TO_POSINF] --> [0,0] --> OK [~0.9999981,TO_POSINF] --> [0,0] --> OK [~0.99999815,TO_POSINF] --> [0,0] --> OK [~0.9999982,TO_POSINF] --> [0,0] --> OK [~0.9999983,TO_POSINF] --> [0,0] --> OK [~0.99999833,TO_POSINF] --> [0,0] --> OK [~0.9999984,TO_POSINF] --> [0,0] --> OK [~0.99999845,TO_POSINF] --> [0,0] --> OK [~0.9999985,TO_POSINF] --> [0,0] --> OK [~0.99999857,TO_POSINF] --> [0,0] --> OK [~0.9999986,TO_POSINF] --> [0,0] --> OK [~0.9999987,TO_POSINF] --> [0,0] --> OK [~0.99999875,TO_POSINF] --> [0,0] --> OK [~0.9999988,TO_POSINF] --> [0,0] --> OK [~0.99999887,TO_POSINF] --> [0,0] --> OK [~0.9999989,TO_POSINF] --> [0,0] --> OK [~0.999999,TO_POSINF] --> [0,0] --> OK [~0.99999905,TO_POSINF] --> [0,0] --> OK [~0.9999991,TO_POSINF] --> [0,0] --> OK [~0.99999917,TO_POSINF] --> [0,0] --> OK [~0.9999992,TO_POSINF] --> [0,0] --> OK [~0.9999993,TO_POSINF] --> [0,0] --> OK [~0.99999934,TO_POSINF] --> [0,0] --> OK [~0.9999994,TO_POSINF] --> [0,0] --> OK [~0.99999946,TO_POSINF] --> [0,0] --> OK [~0.9999995,TO_POSINF] --> [0,0] --> OK [~0.9999996,TO_POSINF] --> [0,0] --> OK [~0.99999964,TO_POSINF] --> [0,0] --> OK [~0.9999997,TO_POSINF] --> [0,0] --> OK [~0.99999976,TO_POSINF] --> [0,0] --> OK [~0.9999998,TO_POSINF] --> [0,0] --> OK [~0.9999999,TO_POSINF] --> [0,0] --> OK [~0.99999994,TO_POSINF] --> [0,0] --> OK [~0.9E~43,TO_POSINF] --> [0,0] --> OK [~0.88E~43,TO_POSINF] --> [0,0] --> OK [~0.87E~43,TO_POSINF] --> [0,0] --> OK [~0.85E~43,TO_POSINF] --> [0,0] --> OK [~0.84E~43,TO_POSINF] --> [0,0] --> OK [~0.83E~43,TO_POSINF] --> [0,0] --> OK [~0.81E~43,TO_POSINF] --> [0,0] --> OK [~0.8E~43,TO_POSINF] --> [0,0] --> OK [~0.78E~43,TO_POSINF] --> [0,0] --> OK [~0.77E~43,TO_POSINF] --> [0,0] --> OK [~0.76E~43,TO_POSINF] --> [0,0] --> OK [~0.74E~43,TO_POSINF] --> [0,0] --> OK [~0.73E~43,TO_POSINF] --> [0,0] --> OK [~0.71E~43,TO_POSINF] --> [0,0] --> OK [~0.7E~43,TO_POSINF] --> [0,0] --> OK [~0.69E~43,TO_POSINF] --> [0,0] --> OK [~0.67E~43,TO_POSINF] --> [0,0] --> OK [~0.66E~43,TO_POSINF] --> [0,0] --> OK [~0.64E~43,TO_POSINF] --> [0,0] --> OK [~0.63E~43,TO_POSINF] --> [0,0] --> OK [~0.62E~43,TO_POSINF] --> [0,0] --> OK [~0.6E~43,TO_POSINF] --> [0,0] --> OK [~0.59E~43,TO_POSINF] --> [0,0] --> OK [~0.57E~43,TO_POSINF] --> [0,0] --> OK [~0.56E~43,TO_POSINF] --> [0,0] --> OK [~0.55E~43,TO_POSINF] --> [0,0] --> OK [~0.53E~43,TO_POSINF] --> [0,0] --> OK [~0.52E~43,TO_POSINF] --> [0,0] --> OK [~0.5E~43,TO_POSINF] --> [0,0] --> OK [~0.49E~43,TO_POSINF] --> [0,0] --> OK [~0.48E~43,TO_POSINF] --> [0,0] --> OK [~0.46E~43,TO_POSINF] --> [0,0] --> OK [~0.45E~43,TO_POSINF] --> [0,0] --> OK [~0.43E~43,TO_POSINF] --> [0,0] --> OK [~0.42E~43,TO_POSINF] --> [0,0] --> OK [~0.4E~43,TO_POSINF] --> [0,0] --> OK [~0.39E~43,TO_POSINF] --> [0,0] --> OK [~0.38E~43,TO_POSINF] --> [0,0] --> OK [~0.36E~43,TO_POSINF] --> [0,0] --> OK [~0.35E~43,TO_POSINF] --> [0,0] --> OK [~0.34E~43,TO_POSINF] --> [0,0] --> OK [~0.32E~43,TO_POSINF] --> [0,0] --> OK [~0.31E~43,TO_POSINF] --> [0,0] --> OK [~0.3E~43,TO_POSINF] --> [0,0] --> OK [~0.28E~43,TO_POSINF] --> [0,0] --> OK [~0.27E~43,TO_POSINF] --> [0,0] --> OK [~0.25E~43,TO_POSINF] --> [0,0] --> OK [~0.24E~43,TO_POSINF] --> [0,0] --> OK [~0.22E~43,TO_POSINF] --> [0,0] --> OK [~0.21E~43,TO_POSINF] --> [0,0] --> OK [~0.2E~43,TO_POSINF] --> [0,0] --> OK [~0.18E~43,TO_POSINF] --> [0,0] --> OK [~0.17E~43,TO_POSINF] --> [0,0] --> OK [~0.15E~43,TO_POSINF] --> [0,0] --> OK [~0.14E~43,TO_POSINF] --> [0,0] --> OK [~0.13E~43,TO_POSINF] --> [0,0] --> OK [~0.11E~43,TO_POSINF] --> [0,0] --> OK [~0.1E~43,TO_POSINF] --> [0,0] --> OK [~0.8E~44,TO_POSINF] --> [0,0] --> OK [~0.7E~44,TO_POSINF] --> [0,0] --> OK [~0.6E~44,TO_POSINF] --> [0,0] --> OK [~0.4E~44,TO_POSINF] --> [0,0] --> OK [~0.3E~44,TO_POSINF] --> [0,0] --> OK [~0.1E~44,TO_POSINF] --> [0,0] --> OK [0.0,TO_POSINF] --> [0,0] --> OK [0.9E~43,TO_POSINF] --> [1,1] --> OK [0.88E~43,TO_POSINF] --> [1,1] --> OK [0.87E~43,TO_POSINF] --> [1,1] --> OK [0.85E~43,TO_POSINF] --> [1,1] --> OK [0.84E~43,TO_POSINF] --> [1,1] --> OK [0.83E~43,TO_POSINF] --> [1,1] --> OK [0.81E~43,TO_POSINF] --> [1,1] --> OK [0.8E~43,TO_POSINF] --> [1,1] --> OK [0.78E~43,TO_POSINF] --> [1,1] --> OK [0.77E~43,TO_POSINF] --> [1,1] --> OK [0.76E~43,TO_POSINF] --> [1,1] --> OK [0.74E~43,TO_POSINF] --> [1,1] --> OK [0.73E~43,TO_POSINF] --> [1,1] --> OK [0.71E~43,TO_POSINF] --> [1,1] --> OK [0.7E~43,TO_POSINF] --> [1,1] --> OK [0.69E~43,TO_POSINF] --> [1,1] --> OK [0.67E~43,TO_POSINF] --> [1,1] --> OK [0.66E~43,TO_POSINF] --> [1,1] --> OK [0.64E~43,TO_POSINF] --> [1,1] --> OK [0.63E~43,TO_POSINF] --> [1,1] --> OK [0.62E~43,TO_POSINF] --> [1,1] --> OK [0.6E~43,TO_POSINF] --> [1,1] --> OK [0.59E~43,TO_POSINF] --> [1,1] --> OK [0.57E~43,TO_POSINF] --> [1,1] --> OK [0.56E~43,TO_POSINF] --> [1,1] --> OK [0.55E~43,TO_POSINF] --> [1,1] --> OK [0.53E~43,TO_POSINF] --> [1,1] --> OK [0.52E~43,TO_POSINF] --> [1,1] --> OK [0.5E~43,TO_POSINF] --> [1,1] --> OK [0.49E~43,TO_POSINF] --> [1,1] --> OK [0.48E~43,TO_POSINF] --> [1,1] --> OK [0.46E~43,TO_POSINF] --> [1,1] --> OK [0.45E~43,TO_POSINF] --> [1,1] --> OK [0.43E~43,TO_POSINF] --> [1,1] --> OK [0.42E~43,TO_POSINF] --> [1,1] --> OK [0.4E~43,TO_POSINF] --> [1,1] --> OK [0.39E~43,TO_POSINF] --> [1,1] --> OK [0.38E~43,TO_POSINF] --> [1,1] --> OK [0.36E~43,TO_POSINF] --> [1,1] --> OK [0.35E~43,TO_POSINF] --> [1,1] --> OK [0.34E~43,TO_POSINF] --> [1,1] --> OK [0.32E~43,TO_POSINF] --> [1,1] --> OK [0.31E~43,TO_POSINF] --> [1,1] --> OK [0.3E~43,TO_POSINF] --> [1,1] --> OK [0.28E~43,TO_POSINF] --> [1,1] --> OK [0.27E~43,TO_POSINF] --> [1,1] --> OK [0.25E~43,TO_POSINF] --> [1,1] --> OK [0.24E~43,TO_POSINF] --> [1,1] --> OK [0.22E~43,TO_POSINF] --> [1,1] --> OK [0.21E~43,TO_POSINF] --> [1,1] --> OK [0.2E~43,TO_POSINF] --> [1,1] --> OK [0.18E~43,TO_POSINF] --> [1,1] --> OK [0.17E~43,TO_POSINF] --> [1,1] --> OK [0.15E~43,TO_POSINF] --> [1,1] --> OK [0.14E~43,TO_POSINF] --> [1,1] --> OK [0.13E~43,TO_POSINF] --> [1,1] --> OK [0.11E~43,TO_POSINF] --> [1,1] --> OK [0.1E~43,TO_POSINF] --> [1,1] --> OK [0.8E~44,TO_POSINF] --> [1,1] --> OK [0.7E~44,TO_POSINF] --> [1,1] --> OK [0.6E~44,TO_POSINF] --> [1,1] --> OK [0.4E~44,TO_POSINF] --> [1,1] --> OK [0.3E~44,TO_POSINF] --> [1,1] --> OK [0.1E~44,TO_POSINF] --> [1,1] --> OK [0.9999962,TO_POSINF] --> [1,1] --> OK [0.99999624,TO_POSINF] --> [1,1] --> OK [0.9999963,TO_POSINF] --> [1,1] --> OK [0.99999636,TO_POSINF] --> [1,1] --> OK [0.9999964,TO_POSINF] --> [1,1] --> OK [0.9999965,TO_POSINF] --> [1,1] --> OK [0.99999654,TO_POSINF] --> [1,1] --> OK [0.9999966,TO_POSINF] --> [1,1] --> OK [0.99999666,TO_POSINF] --> [1,1] --> OK [0.9999967,TO_POSINF] --> [1,1] --> OK [0.9999968,TO_POSINF] --> [1,1] --> OK [0.99999684,TO_POSINF] --> [1,1] --> OK [0.9999969,TO_POSINF] --> [1,1] --> OK [0.99999696,TO_POSINF] --> [1,1] --> OK [0.999997,TO_POSINF] --> [1,1] --> OK [0.9999971,TO_POSINF] --> [1,1] --> OK [0.99999714,TO_POSINF] --> [1,1] --> OK [0.9999972,TO_POSINF] --> [1,1] --> OK [0.99999726,TO_POSINF] --> [1,1] --> OK [0.9999973,TO_POSINF] --> [1,1] --> OK [0.9999974,TO_POSINF] --> [1,1] --> OK [0.99999744,TO_POSINF] --> [1,1] --> OK [0.9999975,TO_POSINF] --> [1,1] --> OK [0.99999756,TO_POSINF] --> [1,1] --> OK [0.9999976,TO_POSINF] --> [1,1] --> OK [0.9999977,TO_POSINF] --> [1,1] --> OK [0.99999774,TO_POSINF] --> [1,1] --> OK [0.9999978,TO_POSINF] --> [1,1] --> OK [0.99999785,TO_POSINF] --> [1,1] --> OK [0.9999979,TO_POSINF] --> [1,1] --> OK [0.999998,TO_POSINF] --> [1,1] --> OK [0.99999803,TO_POSINF] --> [1,1] --> OK [0.9999981,TO_POSINF] --> [1,1] --> OK [0.99999815,TO_POSINF] --> [1,1] --> OK [0.9999982,TO_POSINF] --> [1,1] --> OK [0.9999983,TO_POSINF] --> [1,1] --> OK [0.99999833,TO_POSINF] --> [1,1] --> OK [0.9999984,TO_POSINF] --> [1,1] --> OK [0.99999845,TO_POSINF] --> [1,1] --> OK [0.9999985,TO_POSINF] --> [1,1] --> OK [0.99999857,TO_POSINF] --> [1,1] --> OK [0.9999986,TO_POSINF] --> [1,1] --> OK [0.9999987,TO_POSINF] --> [1,1] --> OK [0.99999875,TO_POSINF] --> [1,1] --> OK [0.9999988,TO_POSINF] --> [1,1] --> OK [0.99999887,TO_POSINF] --> [1,1] --> OK [0.9999989,TO_POSINF] --> [1,1] --> OK [0.999999,TO_POSINF] --> [1,1] --> OK [0.99999905,TO_POSINF] --> [1,1] --> OK [0.9999991,TO_POSINF] --> [1,1] --> OK [0.99999917,TO_POSINF] --> [1,1] --> OK [0.9999992,TO_POSINF] --> [1,1] --> OK [0.9999993,TO_POSINF] --> [1,1] --> OK [0.99999934,TO_POSINF] --> [1,1] --> OK [0.9999994,TO_POSINF] --> [1,1] --> OK [0.99999946,TO_POSINF] --> [1,1] --> OK [0.9999995,TO_POSINF] --> [1,1] --> OK [0.9999996,TO_POSINF] --> [1,1] --> OK [0.99999964,TO_POSINF] --> [1,1] --> OK [0.9999997,TO_POSINF] --> [1,1] --> OK [0.99999976,TO_POSINF] --> [1,1] --> OK [0.9999998,TO_POSINF] --> [1,1] --> OK [0.9999999,TO_POSINF] --> [1,1] --> OK [0.99999994,TO_POSINF] --> [1,1] --> OK [0.1E1,TO_POSINF] --> [1,1] --> OK [0.10000076E1,TO_POSINF] --> [2,2] --> OK [0.10000075E1,TO_POSINF] --> [2,2] --> OK [0.10000074E1,TO_POSINF] --> [2,2] --> OK [0.10000073E1,TO_POSINF] --> [2,2] --> OK [0.10000072E1,TO_POSINF] --> [2,2] --> OK [0.1000007E1,TO_POSINF] --> [2,2] --> OK [0.10000069E1,TO_POSINF] --> [2,2] --> OK [0.10000068E1,TO_POSINF] --> [2,2] --> OK [0.10000067E1,TO_POSINF] --> [2,2] --> OK [0.10000066E1,TO_POSINF] --> [2,2] --> OK [0.10000064E1,TO_POSINF] --> [2,2] --> OK [0.10000063E1,TO_POSINF] --> [2,2] --> OK [0.10000062E1,TO_POSINF] --> [2,2] --> OK [0.10000061E1,TO_POSINF] --> [2,2] --> OK [0.1000006E1,TO_POSINF] --> [2,2] --> OK [0.10000058E1,TO_POSINF] --> [2,2] --> OK [0.10000057E1,TO_POSINF] --> [2,2] --> OK [0.10000056E1,TO_POSINF] --> [2,2] --> OK [0.10000055E1,TO_POSINF] --> [2,2] --> OK [0.10000054E1,TO_POSINF] --> [2,2] --> OK [0.10000052E1,TO_POSINF] --> [2,2] --> OK [0.10000051E1,TO_POSINF] --> [2,2] --> OK [0.1000005E1,TO_POSINF] --> [2,2] --> OK [0.10000049E1,TO_POSINF] --> [2,2] --> OK [0.10000048E1,TO_POSINF] --> [2,2] --> OK [0.10000046E1,TO_POSINF] --> [2,2] --> OK [0.10000045E1,TO_POSINF] --> [2,2] --> OK [0.10000044E1,TO_POSINF] --> [2,2] --> OK [0.10000043E1,TO_POSINF] --> [2,2] --> OK [0.10000042E1,TO_POSINF] --> [2,2] --> OK [0.1000004E1,TO_POSINF] --> [2,2] --> OK [0.10000039E1,TO_POSINF] --> [2,2] --> OK [0.10000038E1,TO_POSINF] --> [2,2] --> OK [0.10000037E1,TO_POSINF] --> [2,2] --> OK [0.10000036E1,TO_POSINF] --> [2,2] --> OK [0.10000035E1,TO_POSINF] --> [2,2] --> OK [0.10000033E1,TO_POSINF] --> [2,2] --> OK [0.10000032E1,TO_POSINF] --> [2,2] --> OK [0.10000031E1,TO_POSINF] --> [2,2] --> OK [0.1000003E1,TO_POSINF] --> [2,2] --> OK [0.10000029E1,TO_POSINF] --> [2,2] --> OK [0.10000027E1,TO_POSINF] --> [2,2] --> OK [0.10000026E1,TO_POSINF] --> [2,2] --> OK [0.10000025E1,TO_POSINF] --> [2,2] --> OK [0.10000024E1,TO_POSINF] --> [2,2] --> OK [0.10000023E1,TO_POSINF] --> [2,2] --> OK [0.10000021E1,TO_POSINF] --> [2,2] --> OK [0.1000002E1,TO_POSINF] --> [2,2] --> OK [0.10000019E1,TO_POSINF] --> [2,2] --> OK [0.10000018E1,TO_POSINF] --> [2,2] --> OK [0.10000017E1,TO_POSINF] --> [2,2] --> OK [0.10000015E1,TO_POSINF] --> [2,2] --> OK [0.10000014E1,TO_POSINF] --> [2,2] --> OK [0.10000013E1,TO_POSINF] --> [2,2] --> OK [0.10000012E1,TO_POSINF] --> [2,2] --> OK [0.10000011E1,TO_POSINF] --> [2,2] --> OK [0.1000001E1,TO_POSINF] --> [2,2] --> OK [0.10000008E1,TO_POSINF] --> [2,2] --> OK [0.10000007E1,TO_POSINF] --> [2,2] --> OK [0.10000006E1,TO_POSINF] --> [2,2] --> OK [0.10000005E1,TO_POSINF] --> [2,2] --> OK [0.10000004E1,TO_POSINF] --> [2,2] --> OK [0.10000002E1,TO_POSINF] --> [2,2] --> OK [0.10000001E1,TO_POSINF] --> [2,2] --> OK [0.19999924E1,TO_POSINF] --> [2,2] --> OK [0.19999925E1,TO_POSINF] --> [2,2] --> OK [0.19999926E1,TO_POSINF] --> [2,2] --> OK [0.19999927E1,TO_POSINF] --> [2,2] --> OK [0.19999928E1,TO_POSINF] --> [2,2] --> OK [0.1999993E1,TO_POSINF] --> [2,2] --> OK [0.19999931E1,TO_POSINF] --> [2,2] --> OK [0.19999932E1,TO_POSINF] --> [2,2] --> OK [0.19999933E1,TO_POSINF] --> [2,2] --> OK [0.19999934E1,TO_POSINF] --> [2,2] --> OK [0.19999936E1,TO_POSINF] --> [2,2] --> OK [0.19999937E1,TO_POSINF] --> [2,2] --> OK [0.19999938E1,TO_POSINF] --> [2,2] --> OK [0.19999939E1,TO_POSINF] --> [2,2] --> OK [0.1999994E1,TO_POSINF] --> [2,2] --> OK [0.19999942E1,TO_POSINF] --> [2,2] --> OK [0.19999943E1,TO_POSINF] --> [2,2] --> OK [0.19999944E1,TO_POSINF] --> [2,2] --> OK [0.19999945E1,TO_POSINF] --> [2,2] --> OK [0.19999946E1,TO_POSINF] --> [2,2] --> OK [0.19999948E1,TO_POSINF] --> [2,2] --> OK [0.19999949E1,TO_POSINF] --> [2,2] --> OK [0.1999995E1,TO_POSINF] --> [2,2] --> OK [0.19999951E1,TO_POSINF] --> [2,2] --> OK [0.19999952E1,TO_POSINF] --> [2,2] --> OK [0.19999954E1,TO_POSINF] --> [2,2] --> OK [0.19999955E1,TO_POSINF] --> [2,2] --> OK [0.19999956E1,TO_POSINF] --> [2,2] --> OK [0.19999957E1,TO_POSINF] --> [2,2] --> OK [0.19999958E1,TO_POSINF] --> [2,2] --> OK [0.1999996E1,TO_POSINF] --> [2,2] --> OK [0.19999961E1,TO_POSINF] --> [2,2] --> OK [0.19999962E1,TO_POSINF] --> [2,2] --> OK [0.19999963E1,TO_POSINF] --> [2,2] --> OK [0.19999964E1,TO_POSINF] --> [2,2] --> OK [0.19999965E1,TO_POSINF] --> [2,2] --> OK [0.19999967E1,TO_POSINF] --> [2,2] --> OK [0.19999968E1,TO_POSINF] --> [2,2] --> OK [0.19999969E1,TO_POSINF] --> [2,2] --> OK [0.1999997E1,TO_POSINF] --> [2,2] --> OK [0.19999971E1,TO_POSINF] --> [2,2] --> OK [0.19999973E1,TO_POSINF] --> [2,2] --> OK [0.19999974E1,TO_POSINF] --> [2,2] --> OK [0.19999975E1,TO_POSINF] --> [2,2] --> OK [0.19999976E1,TO_POSINF] --> [2,2] --> OK [0.19999977E1,TO_POSINF] --> [2,2] --> OK [0.19999979E1,TO_POSINF] --> [2,2] --> OK [0.1999998E1,TO_POSINF] --> [2,2] --> OK [0.19999981E1,TO_POSINF] --> [2,2] --> OK [0.19999982E1,TO_POSINF] --> [2,2] --> OK [0.19999983E1,TO_POSINF] --> [2,2] --> OK [0.19999985E1,TO_POSINF] --> [2,2] --> OK [0.19999986E1,TO_POSINF] --> [2,2] --> OK [0.19999987E1,TO_POSINF] --> [2,2] --> OK [0.19999988E1,TO_POSINF] --> [2,2] --> OK [0.19999989E1,TO_POSINF] --> [2,2] --> OK [0.1999999E1,TO_POSINF] --> [2,2] --> OK [0.19999992E1,TO_POSINF] --> [2,2] --> OK [0.19999993E1,TO_POSINF] --> [2,2] --> OK [0.19999994E1,TO_POSINF] --> [2,2] --> OK [0.19999995E1,TO_POSINF] --> [2,2] --> OK [0.19999996E1,TO_POSINF] --> [2,2] --> OK [0.19999998E1,TO_POSINF] --> [2,2] --> OK [0.19999999E1,TO_POSINF] --> [2,2] --> OK [0.2E1,TO_POSINF] --> [2,2] --> OK [0.20000153E1,TO_POSINF] --> [3,3] --> OK [0.2000015E1,TO_POSINF] --> [3,3] --> OK [0.20000148E1,TO_POSINF] --> [3,3] --> OK [0.20000145E1,TO_POSINF] --> [3,3] --> OK [0.20000143E1,TO_POSINF] --> [3,3] --> OK [0.2000014E1,TO_POSINF] --> [3,3] --> OK [0.20000138E1,TO_POSINF] --> [3,3] --> OK [0.20000136E1,TO_POSINF] --> [3,3] --> OK [0.20000134E1,TO_POSINF] --> [3,3] --> OK [0.2000013E1,TO_POSINF] --> [3,3] --> OK [0.20000129E1,TO_POSINF] --> [3,3] --> OK [0.20000126E1,TO_POSINF] --> [3,3] --> OK [0.20000124E1,TO_POSINF] --> [3,3] --> OK [0.20000122E1,TO_POSINF] --> [3,3] --> OK [0.2000012E1,TO_POSINF] --> [3,3] --> OK [0.20000117E1,TO_POSINF] --> [3,3] --> OK [0.20000114E1,TO_POSINF] --> [3,3] --> OK [0.20000112E1,TO_POSINF] --> [3,3] --> OK [0.2000011E1,TO_POSINF] --> [3,3] --> OK [0.20000107E1,TO_POSINF] --> [3,3] --> OK [0.20000105E1,TO_POSINF] --> [3,3] --> OK [0.20000103E1,TO_POSINF] --> [3,3] --> OK [0.200001E1,TO_POSINF] --> [3,3] --> OK [0.20000098E1,TO_POSINF] --> [3,3] --> OK [0.20000095E1,TO_POSINF] --> [3,3] --> OK [0.20000093E1,TO_POSINF] --> [3,3] --> OK [0.2000009E1,TO_POSINF] --> [3,3] --> OK [0.20000088E1,TO_POSINF] --> [3,3] --> OK [0.20000086E1,TO_POSINF] --> [3,3] --> OK [0.20000083E1,TO_POSINF] --> [3,3] --> OK [0.2000008E1,TO_POSINF] --> [3,3] --> OK [0.20000079E1,TO_POSINF] --> [3,3] --> OK [0.20000076E1,TO_POSINF] --> [3,3] --> OK [0.20000074E1,TO_POSINF] --> [3,3] --> OK [0.20000072E1,TO_POSINF] --> [3,3] --> OK [0.2000007E1,TO_POSINF] --> [3,3] --> OK [0.20000067E1,TO_POSINF] --> [3,3] --> OK [0.20000064E1,TO_POSINF] --> [3,3] --> OK [0.20000062E1,TO_POSINF] --> [3,3] --> OK [0.2000006E1,TO_POSINF] --> [3,3] --> OK [0.20000057E1,TO_POSINF] --> [3,3] --> OK [0.20000055E1,TO_POSINF] --> [3,3] --> OK [0.20000052E1,TO_POSINF] --> [3,3] --> OK [0.2000005E1,TO_POSINF] --> [3,3] --> OK [0.20000048E1,TO_POSINF] --> [3,3] --> OK [0.20000045E1,TO_POSINF] --> [3,3] --> OK [0.20000043E1,TO_POSINF] --> [3,3] --> OK [0.2000004E1,TO_POSINF] --> [3,3] --> OK [0.20000038E1,TO_POSINF] --> [3,3] --> OK [0.20000036E1,TO_POSINF] --> [3,3] --> OK [0.20000033E1,TO_POSINF] --> [3,3] --> OK [0.2000003E1,TO_POSINF] --> [3,3] --> OK [0.20000029E1,TO_POSINF] --> [3,3] --> OK [0.20000026E1,TO_POSINF] --> [3,3] --> OK [0.20000024E1,TO_POSINF] --> [3,3] --> OK [0.20000021E1,TO_POSINF] --> [3,3] --> OK [0.2000002E1,TO_POSINF] --> [3,3] --> OK [0.20000017E1,TO_POSINF] --> [3,3] --> OK [0.20000014E1,TO_POSINF] --> [3,3] --> OK [0.20000012E1,TO_POSINF] --> [3,3] --> OK [0.2000001E1,TO_POSINF] --> [3,3] --> OK [0.20000007E1,TO_POSINF] --> [3,3] --> OK [0.20000005E1,TO_POSINF] --> [3,3] --> OK [0.20000002E1,TO_POSINF] --> [3,3] --> OK [0.29999847E1,TO_POSINF] --> [3,3] --> OK [0.2999985E1,TO_POSINF] --> [3,3] --> OK [0.29999852E1,TO_POSINF] --> [3,3] --> OK [0.29999855E1,TO_POSINF] --> [3,3] --> OK [0.29999857E1,TO_POSINF] --> [3,3] --> OK [0.2999986E1,TO_POSINF] --> [3,3] --> OK [0.29999862E1,TO_POSINF] --> [3,3] --> OK [0.29999864E1,TO_POSINF] --> [3,3] --> OK [0.29999866E1,TO_POSINF] --> [3,3] --> OK [0.2999987E1,TO_POSINF] --> [3,3] --> OK [0.29999871E1,TO_POSINF] --> [3,3] --> OK [0.29999874E1,TO_POSINF] --> [3,3] --> OK [0.29999876E1,TO_POSINF] --> [3,3] --> OK [0.29999878E1,TO_POSINF] --> [3,3] --> OK [0.2999988E1,TO_POSINF] --> [3,3] --> OK [0.29999883E1,TO_POSINF] --> [3,3] --> OK [0.29999886E1,TO_POSINF] --> [3,3] --> OK [0.29999888E1,TO_POSINF] --> [3,3] --> OK [0.2999989E1,TO_POSINF] --> [3,3] --> OK [0.29999893E1,TO_POSINF] --> [3,3] --> OK [0.29999895E1,TO_POSINF] --> [3,3] --> OK [0.29999897E1,TO_POSINF] --> [3,3] --> OK [0.299999E1,TO_POSINF] --> [3,3] --> OK [0.29999902E1,TO_POSINF] --> [3,3] --> OK [0.29999905E1,TO_POSINF] --> [3,3] --> OK [0.29999907E1,TO_POSINF] --> [3,3] --> OK [0.2999991E1,TO_POSINF] --> [3,3] --> OK [0.29999912E1,TO_POSINF] --> [3,3] --> OK [0.29999914E1,TO_POSINF] --> [3,3] --> OK [0.29999917E1,TO_POSINF] --> [3,3] --> OK [0.2999992E1,TO_POSINF] --> [3,3] --> OK [0.29999921E1,TO_POSINF] --> [3,3] --> OK [0.29999924E1,TO_POSINF] --> [3,3] --> OK [0.29999926E1,TO_POSINF] --> [3,3] --> OK [0.29999928E1,TO_POSINF] --> [3,3] --> OK [0.2999993E1,TO_POSINF] --> [3,3] --> OK [0.29999933E1,TO_POSINF] --> [3,3] --> OK [0.29999936E1,TO_POSINF] --> [3,3] --> OK [0.29999938E1,TO_POSINF] --> [3,3] --> OK [0.2999994E1,TO_POSINF] --> [3,3] --> OK [0.29999943E1,TO_POSINF] --> [3,3] --> OK [0.29999945E1,TO_POSINF] --> [3,3] --> OK [0.29999948E1,TO_POSINF] --> [3,3] --> OK [0.2999995E1,TO_POSINF] --> [3,3] --> OK [0.29999952E1,TO_POSINF] --> [3,3] --> OK [0.29999955E1,TO_POSINF] --> [3,3] --> OK [0.29999957E1,TO_POSINF] --> [3,3] --> OK [0.2999996E1,TO_POSINF] --> [3,3] --> OK [0.29999962E1,TO_POSINF] --> [3,3] --> OK [0.29999964E1,TO_POSINF] --> [3,3] --> OK [0.29999967E1,TO_POSINF] --> [3,3] --> OK [0.2999997E1,TO_POSINF] --> [3,3] --> OK [0.29999971E1,TO_POSINF] --> [3,3] --> OK [0.29999974E1,TO_POSINF] --> [3,3] --> OK [0.29999976E1,TO_POSINF] --> [3,3] --> OK [0.29999979E1,TO_POSINF] --> [3,3] --> OK [0.2999998E1,TO_POSINF] --> [3,3] --> OK [0.29999983E1,TO_POSINF] --> [3,3] --> OK [0.29999986E1,TO_POSINF] --> [3,3] --> OK [0.29999988E1,TO_POSINF] --> [3,3] --> OK [0.2999999E1,TO_POSINF] --> [3,3] --> OK [0.29999993E1,TO_POSINF] --> [3,3] --> OK [0.29999995E1,TO_POSINF] --> [3,3] --> OK [0.29999998E1,TO_POSINF] --> [3,3] --> OK [0.3E1,TO_POSINF] --> [3,3] --> OK [0.30000153E1,TO_POSINF] --> [4,4] --> OK [0.3000015E1,TO_POSINF] --> [4,4] --> OK [0.30000148E1,TO_POSINF] --> [4,4] --> OK [0.30000145E1,TO_POSINF] --> [4,4] --> OK [0.30000143E1,TO_POSINF] --> [4,4] --> OK [0.3000014E1,TO_POSINF] --> [4,4] --> OK [0.30000138E1,TO_POSINF] --> [4,4] --> OK [0.30000136E1,TO_POSINF] --> [4,4] --> OK [0.30000134E1,TO_POSINF] --> [4,4] --> OK [0.3000013E1,TO_POSINF] --> [4,4] --> OK [0.30000129E1,TO_POSINF] --> [4,4] --> OK [0.30000126E1,TO_POSINF] --> [4,4] --> OK [0.30000124E1,TO_POSINF] --> [4,4] --> OK [0.30000122E1,TO_POSINF] --> [4,4] --> OK [0.3000012E1,TO_POSINF] --> [4,4] --> OK [0.30000117E1,TO_POSINF] --> [4,4] --> OK [0.30000114E1,TO_POSINF] --> [4,4] --> OK [0.30000112E1,TO_POSINF] --> [4,4] --> OK [0.3000011E1,TO_POSINF] --> [4,4] --> OK [0.30000107E1,TO_POSINF] --> [4,4] --> OK [0.30000105E1,TO_POSINF] --> [4,4] --> OK [0.30000103E1,TO_POSINF] --> [4,4] --> OK [0.300001E1,TO_POSINF] --> [4,4] --> OK [0.30000098E1,TO_POSINF] --> [4,4] --> OK [0.30000095E1,TO_POSINF] --> [4,4] --> OK [0.30000093E1,TO_POSINF] --> [4,4] --> OK [0.3000009E1,TO_POSINF] --> [4,4] --> OK [0.30000088E1,TO_POSINF] --> [4,4] --> OK [0.30000086E1,TO_POSINF] --> [4,4] --> OK [0.30000083E1,TO_POSINF] --> [4,4] --> OK [0.3000008E1,TO_POSINF] --> [4,4] --> OK [0.30000079E1,TO_POSINF] --> [4,4] --> OK [0.30000076E1,TO_POSINF] --> [4,4] --> OK [0.30000074E1,TO_POSINF] --> [4,4] --> OK [0.30000072E1,TO_POSINF] --> [4,4] --> OK [0.3000007E1,TO_POSINF] --> [4,4] --> OK [0.30000067E1,TO_POSINF] --> [4,4] --> OK [0.30000064E1,TO_POSINF] --> [4,4] --> OK [0.30000062E1,TO_POSINF] --> [4,4] --> OK [0.3000006E1,TO_POSINF] --> [4,4] --> OK [0.30000057E1,TO_POSINF] --> [4,4] --> OK [0.30000055E1,TO_POSINF] --> [4,4] --> OK [0.30000052E1,TO_POSINF] --> [4,4] --> OK [0.3000005E1,TO_POSINF] --> [4,4] --> OK [0.30000048E1,TO_POSINF] --> [4,4] --> OK [0.30000045E1,TO_POSINF] --> [4,4] --> OK [0.30000043E1,TO_POSINF] --> [4,4] --> OK [0.3000004E1,TO_POSINF] --> [4,4] --> OK [0.30000038E1,TO_POSINF] --> [4,4] --> OK [0.30000036E1,TO_POSINF] --> [4,4] --> OK [0.30000033E1,TO_POSINF] --> [4,4] --> OK [0.3000003E1,TO_POSINF] --> [4,4] --> OK [0.30000029E1,TO_POSINF] --> [4,4] --> OK [0.30000026E1,TO_POSINF] --> [4,4] --> OK [0.30000024E1,TO_POSINF] --> [4,4] --> OK [0.30000021E1,TO_POSINF] --> [4,4] --> OK [0.3000002E1,TO_POSINF] --> [4,4] --> OK [0.30000017E1,TO_POSINF] --> [4,4] --> OK [0.30000014E1,TO_POSINF] --> [4,4] --> OK [0.30000012E1,TO_POSINF] --> [4,4] --> OK [0.3000001E1,TO_POSINF] --> [4,4] --> OK [0.30000007E1,TO_POSINF] --> [4,4] --> OK [0.30000005E1,TO_POSINF] --> [4,4] --> OK [0.30000002E1,TO_POSINF] --> [4,4] --> OK [0.10737377E10,TO_POSINF] --> [1073737728,1073737728] --> OK [0.10737378E10,TO_POSINF] --> [1073737792,1073737792] --> OK [0.107373786E10,TO_POSINF] --> [1073737856,1073737856] --> OK [0.10737379E10,TO_POSINF] --> [1073737920,1073737920] --> OK [0.1073738E10,TO_POSINF] --> [1073737984,1073737984] --> OK [0.107373805E10,TO_POSINF] --> [1073738048,1073738048] --> OK [0.10737381E10,TO_POSINF] --> [1073738112,1073738112] --> OK [0.10737382E10,TO_POSINF] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_POSINF] --> [1073738240,1073738240] --> OK [0.10737383E10,TO_POSINF] --> [1073738304,1073738304] --> OK [0.10737384E10,TO_POSINF] --> [1073738368,1073738368] --> OK [0.107373843E10,TO_POSINF] --> [1073738432,1073738432] --> OK [0.10737385E10,TO_POSINF] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_POSINF] --> [1073738560,1073738560] --> OK [0.10737386E10,TO_POSINF] --> [1073738624,1073738624] --> OK [0.10737387E10,TO_POSINF] --> [1073738688,1073738688] --> OK [0.107373875E10,TO_POSINF] --> [1073738752,1073738752] --> OK [0.10737388E10,TO_POSINF] --> [1073738816,1073738816] --> OK [0.10737389E10,TO_POSINF] --> [1073738880,1073738880] --> OK [0.107373894E10,TO_POSINF] --> [1073738944,1073738944] --> OK [0.1073739E10,TO_POSINF] --> [1073739008,1073739008] --> OK [0.10737391E10,TO_POSINF] --> [1073739072,1073739072] --> OK [0.107373914E10,TO_POSINF] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_POSINF] --> [1073739200,1073739200] --> OK [0.107373926E10,TO_POSINF] --> [1073739264,1073739264] --> OK [0.10737393E10,TO_POSINF] --> [1073739328,1073739328] --> OK [0.10737394E10,TO_POSINF] --> [1073739392,1073739392] --> OK [0.107373946E10,TO_POSINF] --> [1073739456,1073739456] --> OK [0.10737395E10,TO_POSINF] --> [1073739520,1073739520] --> OK [0.10737396E10,TO_POSINF] --> [1073739584,1073739584] --> OK [0.107373965E10,TO_POSINF] --> [1073739648,1073739648] --> OK [0.10737397E10,TO_POSINF] --> [1073739712,1073739712] --> OK [0.10737398E10,TO_POSINF] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_POSINF] --> [1073739840,1073739840] --> OK [0.10737399E10,TO_POSINF] --> [1073739904,1073739904] --> OK [0.107373997E10,TO_POSINF] --> [1073739968,1073739968] --> OK [0.107374E10,TO_POSINF] --> [1073740032,1073740032] --> OK [0.10737401E10,TO_POSINF] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_POSINF] --> [1073740160,1073740160] --> OK [0.10737402E10,TO_POSINF] --> [1073740224,1073740224] --> OK [0.10737403E10,TO_POSINF] --> [1073740288,1073740288] --> OK [0.107374035E10,TO_POSINF] --> [1073740352,1073740352] --> OK [0.10737404E10,TO_POSINF] --> [1073740416,1073740416] --> OK [0.10737405E10,TO_POSINF] --> [1073740480,1073740480] --> OK [0.107374054E10,TO_POSINF] --> [1073740544,1073740544] --> OK [0.10737406E10,TO_POSINF] --> [1073740608,1073740608] --> OK [0.10737407E10,TO_POSINF] --> [1073740672,1073740672] --> OK [0.107374074E10,TO_POSINF] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_POSINF] --> [1073740800,1073740800] --> OK [0.107374086E10,TO_POSINF] --> [1073740864,1073740864] --> OK [0.10737409E10,TO_POSINF] --> [1073740928,1073740928] --> OK [0.1073741E10,TO_POSINF] --> [1073740992,1073740992] --> OK [0.107374106E10,TO_POSINF] --> [1073741056,1073741056] --> OK [0.10737411E10,TO_POSINF] --> [1073741120,1073741120] --> OK [0.10737412E10,TO_POSINF] --> [1073741184,1073741184] --> OK [0.107374125E10,TO_POSINF] --> [1073741248,1073741248] --> OK [0.10737413E10,TO_POSINF] --> [1073741312,1073741312] --> OK [0.10737414E10,TO_POSINF] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_POSINF] --> [1073741440,1073741440] --> OK [0.10737415E10,TO_POSINF] --> [1073741504,1073741504] --> OK [0.10737416E10,TO_POSINF] --> [1073741568,1073741568] --> OK [0.107374163E10,TO_POSINF] --> [1073741632,1073741632] --> OK [0.10737417E10,TO_POSINF] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_POSINF] --> [1073741760,1073741760] --> OK [0.10737418E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.107375E10,TO_POSINF] --> [1073750016,1073750016] --> OK [0.10737499E10,TO_POSINF] --> [1073749888,1073749888] --> OK [0.10737498E10,TO_POSINF] --> [1073749760,1073749760] --> OK [0.10737496E10,TO_POSINF] --> [1073749632,1073749632] --> OK [0.10737495E10,TO_POSINF] --> [1073749504,1073749504] --> OK [0.10737494E10,TO_POSINF] --> [1073749376,1073749376] --> OK [0.10737492E10,TO_POSINF] --> [1073749248,1073749248] --> OK [0.10737491E10,TO_POSINF] --> [1073749120,1073749120] --> OK [0.1073749E10,TO_POSINF] --> [1073748992,1073748992] --> OK [0.10737489E10,TO_POSINF] --> [1073748864,1073748864] --> OK [0.10737487E10,TO_POSINF] --> [1073748736,1073748736] --> OK [0.10737486E10,TO_POSINF] --> [1073748608,1073748608] --> OK [0.10737485E10,TO_POSINF] --> [1073748480,1073748480] --> OK [0.10737484E10,TO_POSINF] --> [1073748352,1073748352] --> OK [0.10737482E10,TO_POSINF] --> [1073748224,1073748224] --> OK [0.10737481E10,TO_POSINF] --> [1073748096,1073748096] --> OK [0.1073748E10,TO_POSINF] --> [1073747968,1073747968] --> OK [0.10737478E10,TO_POSINF] --> [1073747840,1073747840] --> OK [0.10737477E10,TO_POSINF] --> [1073747712,1073747712] --> OK [0.10737476E10,TO_POSINF] --> [1073747584,1073747584] --> OK [0.10737475E10,TO_POSINF] --> [1073747456,1073747456] --> OK [0.10737473E10,TO_POSINF] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_POSINF] --> [1073747200,1073747200] --> OK [0.10737471E10,TO_POSINF] --> [1073747072,1073747072] --> OK [0.1073747E10,TO_POSINF] --> [1073746944,1073746944] --> OK [0.10737468E10,TO_POSINF] --> [1073746816,1073746816] --> OK [0.10737467E10,TO_POSINF] --> [1073746688,1073746688] --> OK [0.10737466E10,TO_POSINF] --> [1073746560,1073746560] --> OK [0.10737464E10,TO_POSINF] --> [1073746432,1073746432] --> OK [0.10737463E10,TO_POSINF] --> [1073746304,1073746304] --> OK [0.10737462E10,TO_POSINF] --> [1073746176,1073746176] --> OK [0.1073746E10,TO_POSINF] --> [1073746048,1073746048] --> OK [0.10737459E10,TO_POSINF] --> [1073745920,1073745920] --> OK [0.10737458E10,TO_POSINF] --> [1073745792,1073745792] --> OK [0.10737457E10,TO_POSINF] --> [1073745664,1073745664] --> OK [0.10737455E10,TO_POSINF] --> [1073745536,1073745536] --> OK [0.10737454E10,TO_POSINF] --> [1073745408,1073745408] --> OK [0.10737453E10,TO_POSINF] --> [1073745280,1073745280] --> OK [0.10737452E10,TO_POSINF] --> [1073745152,1073745152] --> OK [0.1073745E10,TO_POSINF] --> [1073745024,1073745024] --> OK [0.10737449E10,TO_POSINF] --> [1073744896,1073744896] --> OK [0.10737448E10,TO_POSINF] --> [1073744768,1073744768] --> OK [0.10737446E10,TO_POSINF] --> [1073744640,1073744640] --> OK [0.10737445E10,TO_POSINF] --> [1073744512,1073744512] --> OK [0.10737444E10,TO_POSINF] --> [1073744384,1073744384] --> OK [0.10737443E10,TO_POSINF] --> [1073744256,1073744256] --> OK [0.10737441E10,TO_POSINF] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_POSINF] --> [1073744000,1073744000] --> OK [0.10737439E10,TO_POSINF] --> [1073743872,1073743872] --> OK [0.10737437E10,TO_POSINF] --> [1073743744,1073743744] --> OK [0.10737436E10,TO_POSINF] --> [1073743616,1073743616] --> OK [0.10737435E10,TO_POSINF] --> [1073743488,1073743488] --> OK [0.10737434E10,TO_POSINF] --> [1073743360,1073743360] --> OK [0.10737432E10,TO_POSINF] --> [1073743232,1073743232] --> OK [0.10737431E10,TO_POSINF] --> [1073743104,1073743104] --> OK [0.1073743E10,TO_POSINF] --> [1073742976,1073742976] --> OK [0.10737428E10,TO_POSINF] --> [1073742848,1073742848] --> OK [0.10737427E10,TO_POSINF] --> [1073742720,1073742720] --> OK [0.10737426E10,TO_POSINF] --> [1073742592,1073742592] --> OK [0.10737425E10,TO_POSINF] --> [1073742464,1073742464] --> OK [0.10737423E10,TO_POSINF] --> [1073742336,1073742336] --> OK [0.10737422E10,TO_POSINF] --> [1073742208,1073742208] --> OK [0.10737421E10,TO_POSINF] --> [1073742080,1073742080] --> OK [0.1073742E10,TO_POSINF] --> [1073741952,1073741952] --> OK [0.16106045E10,TO_POSINF] --> [1610604544,1610604544] --> OK [0.16106047E10,TO_POSINF] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_POSINF] --> [1610604800,1610604800] --> OK [0.16106049E10,TO_POSINF] --> [1610604928,1610604928] --> OK [0.1610605E10,TO_POSINF] --> [1610605056,1610605056] --> OK [0.16106052E10,TO_POSINF] --> [1610605184,1610605184] --> OK [0.16106053E10,TO_POSINF] --> [1610605312,1610605312] --> OK [0.16106054E10,TO_POSINF] --> [1610605440,1610605440] --> OK [0.16106056E10,TO_POSINF] --> [1610605568,1610605568] --> OK [0.16106057E10,TO_POSINF] --> [1610605696,1610605696] --> OK [0.16106058E10,TO_POSINF] --> [1610605824,1610605824] --> OK [0.1610606E10,TO_POSINF] --> [1610605952,1610605952] --> OK [0.16106061E10,TO_POSINF] --> [1610606080,1610606080] --> OK [0.16106062E10,TO_POSINF] --> [1610606208,1610606208] --> OK [0.16106063E10,TO_POSINF] --> [1610606336,1610606336] --> OK [0.16106065E10,TO_POSINF] --> [1610606464,1610606464] --> OK [0.16106066E10,TO_POSINF] --> [1610606592,1610606592] --> OK [0.16106067E10,TO_POSINF] --> [1610606720,1610606720] --> OK [0.16106068E10,TO_POSINF] --> [1610606848,1610606848] --> OK [0.1610607E10,TO_POSINF] --> [1610606976,1610606976] --> OK [0.16106071E10,TO_POSINF] --> [1610607104,1610607104] --> OK [0.16106072E10,TO_POSINF] --> [1610607232,1610607232] --> OK [0.16106074E10,TO_POSINF] --> [1610607360,1610607360] --> OK [0.16106075E10,TO_POSINF] --> [1610607488,1610607488] --> OK [0.16106076E10,TO_POSINF] --> [1610607616,1610607616] --> OK [0.16106077E10,TO_POSINF] --> [1610607744,1610607744] --> OK [0.16106079E10,TO_POSINF] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_POSINF] --> [1610608000,1610608000] --> OK [0.16106081E10,TO_POSINF] --> [1610608128,1610608128] --> OK [0.16106083E10,TO_POSINF] --> [1610608256,1610608256] --> OK [0.16106084E10,TO_POSINF] --> [1610608384,1610608384] --> OK [0.16106085E10,TO_POSINF] --> [1610608512,1610608512] --> OK [0.16106086E10,TO_POSINF] --> [1610608640,1610608640] --> OK [0.16106088E10,TO_POSINF] --> [1610608768,1610608768] --> OK [0.16106089E10,TO_POSINF] --> [1610608896,1610608896] --> OK [0.1610609E10,TO_POSINF] --> [1610609024,1610609024] --> OK [0.16106092E10,TO_POSINF] --> [1610609152,1610609152] --> OK [0.16106093E10,TO_POSINF] --> [1610609280,1610609280] --> OK [0.16106094E10,TO_POSINF] --> [1610609408,1610609408] --> OK [0.16106095E10,TO_POSINF] --> [1610609536,1610609536] --> OK [0.16106097E10,TO_POSINF] --> [1610609664,1610609664] --> OK [0.16106098E10,TO_POSINF] --> [1610609792,1610609792] --> OK [0.16106099E10,TO_POSINF] --> [1610609920,1610609920] --> OK [0.161061E10,TO_POSINF] --> [1610610048,1610610048] --> OK [0.16106102E10,TO_POSINF] --> [1610610176,1610610176] --> OK [0.16106103E10,TO_POSINF] --> [1610610304,1610610304] --> OK [0.16106104E10,TO_POSINF] --> [1610610432,1610610432] --> OK [0.16106106E10,TO_POSINF] --> [1610610560,1610610560] --> OK [0.16106107E10,TO_POSINF] --> [1610610688,1610610688] --> OK [0.16106108E10,TO_POSINF] --> [1610610816,1610610816] --> OK [0.1610611E10,TO_POSINF] --> [1610610944,1610610944] --> OK [0.16106111E10,TO_POSINF] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_POSINF] --> [1610611200,1610611200] --> OK [0.16106113E10,TO_POSINF] --> [1610611328,1610611328] --> OK [0.16106115E10,TO_POSINF] --> [1610611456,1610611456] --> OK [0.16106116E10,TO_POSINF] --> [1610611584,1610611584] --> OK [0.16106117E10,TO_POSINF] --> [1610611712,1610611712] --> OK [0.16106118E10,TO_POSINF] --> [1610611840,1610611840] --> OK [0.1610612E10,TO_POSINF] --> [1610611968,1610611968] --> OK [0.16106121E10,TO_POSINF] --> [1610612096,1610612096] --> OK [0.16106122E10,TO_POSINF] --> [1610612224,1610612224] --> OK [0.16106124E10,TO_POSINF] --> [1610612352,1610612352] --> OK [0.16106125E10,TO_POSINF] --> [1610612480,1610612480] --> OK [0.16106126E10,TO_POSINF] --> [1610612608,1610612608] --> OK [0.16106127E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106209E10,TO_POSINF] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_POSINF] --> [1610620800,1610620800] --> OK [0.16106207E10,TO_POSINF] --> [1610620672,1610620672] --> OK [0.16106205E10,TO_POSINF] --> [1610620544,1610620544] --> OK [0.16106204E10,TO_POSINF] --> [1610620416,1610620416] --> OK [0.16106203E10,TO_POSINF] --> [1610620288,1610620288] --> OK [0.16106202E10,TO_POSINF] --> [1610620160,1610620160] --> OK [0.161062E10,TO_POSINF] --> [1610620032,1610620032] --> OK [0.16106199E10,TO_POSINF] --> [1610619904,1610619904] --> OK [0.16106198E10,TO_POSINF] --> [1610619776,1610619776] --> OK [0.16106196E10,TO_POSINF] --> [1610619648,1610619648] --> OK [0.16106195E10,TO_POSINF] --> [1610619520,1610619520] --> OK [0.16106194E10,TO_POSINF] --> [1610619392,1610619392] --> OK [0.16106193E10,TO_POSINF] --> [1610619264,1610619264] --> OK [0.16106191E10,TO_POSINF] --> [1610619136,1610619136] --> OK [0.1610619E10,TO_POSINF] --> [1610619008,1610619008] --> OK [0.16106189E10,TO_POSINF] --> [1610618880,1610618880] --> OK [0.16106188E10,TO_POSINF] --> [1610618752,1610618752] --> OK [0.16106186E10,TO_POSINF] --> [1610618624,1610618624] --> OK [0.16106185E10,TO_POSINF] --> [1610618496,1610618496] --> OK [0.16106184E10,TO_POSINF] --> [1610618368,1610618368] --> OK [0.16106182E10,TO_POSINF] --> [1610618240,1610618240] --> OK [0.16106181E10,TO_POSINF] --> [1610618112,1610618112] --> OK [0.1610618E10,TO_POSINF] --> [1610617984,1610617984] --> OK [0.16106179E10,TO_POSINF] --> [1610617856,1610617856] --> OK [0.16106177E10,TO_POSINF] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_POSINF] --> [1610617600,1610617600] --> OK [0.16106175E10,TO_POSINF] --> [1610617472,1610617472] --> OK [0.16106173E10,TO_POSINF] --> [1610617344,1610617344] --> OK [0.16106172E10,TO_POSINF] --> [1610617216,1610617216] --> OK [0.16106171E10,TO_POSINF] --> [1610617088,1610617088] --> OK [0.1610617E10,TO_POSINF] --> [1610616960,1610616960] --> OK [0.16106168E10,TO_POSINF] --> [1610616832,1610616832] --> OK [0.16106167E10,TO_POSINF] --> [1610616704,1610616704] --> OK [0.16106166E10,TO_POSINF] --> [1610616576,1610616576] --> OK [0.16106164E10,TO_POSINF] --> [1610616448,1610616448] --> OK [0.16106163E10,TO_POSINF] --> [1610616320,1610616320] --> OK [0.16106162E10,TO_POSINF] --> [1610616192,1610616192] --> OK [0.1610616E10,TO_POSINF] --> [1610616064,1610616064] --> OK [0.16106159E10,TO_POSINF] --> [1610615936,1610615936] --> OK [0.16106158E10,TO_POSINF] --> [1610615808,1610615808] --> OK [0.16106157E10,TO_POSINF] --> [1610615680,1610615680] --> OK [0.16106156E10,TO_POSINF] --> [1610615552,1610615552] --> OK [0.16106154E10,TO_POSINF] --> [1610615424,1610615424] --> OK [0.16106153E10,TO_POSINF] --> [1610615296,1610615296] --> OK [0.16106152E10,TO_POSINF] --> [1610615168,1610615168] --> OK [0.1610615E10,TO_POSINF] --> [1610615040,1610615040] --> OK [0.16106149E10,TO_POSINF] --> [1610614912,1610614912] --> OK [0.16106148E10,TO_POSINF] --> [1610614784,1610614784] --> OK [0.16106147E10,TO_POSINF] --> [1610614656,1610614656] --> OK [0.16106145E10,TO_POSINF] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_POSINF] --> [1610614400,1610614400] --> OK [0.16106143E10,TO_POSINF] --> [1610614272,1610614272] --> OK [0.16106141E10,TO_POSINF] --> [1610614144,1610614144] --> OK [0.1610614E10,TO_POSINF] --> [1610614016,1610614016] --> OK [0.16106139E10,TO_POSINF] --> [1610613888,1610613888] --> OK [0.16106138E10,TO_POSINF] --> [1610613760,1610613760] --> OK [0.16106136E10,TO_POSINF] --> [1610613632,1610613632] --> OK [0.16106135E10,TO_POSINF] --> [1610613504,1610613504] --> OK [0.16106134E10,TO_POSINF] --> [1610613376,1610613376] --> OK [0.16106132E10,TO_POSINF] --> [1610613248,1610613248] --> OK [0.16106131E10,TO_POSINF] --> [1610613120,1610613120] --> OK [0.1610613E10,TO_POSINF] --> [1610612992,1610612992] --> OK [0.16106129E10,TO_POSINF] --> [1610612864,1610612864] --> OK [0.187904E10,TO_POSINF] --> [1879040000,1879040000] --> OK [0.18790401E10,TO_POSINF] --> [1879040128,1879040128] --> OK [0.18790403E10,TO_POSINF] --> [1879040256,1879040256] --> OK [0.18790404E10,TO_POSINF] --> [1879040384,1879040384] --> OK [0.18790405E10,TO_POSINF] --> [1879040512,1879040512] --> OK [0.18790406E10,TO_POSINF] --> [1879040640,1879040640] --> OK [0.18790408E10,TO_POSINF] --> [1879040768,1879040768] --> OK [0.18790409E10,TO_POSINF] --> [1879040896,1879040896] --> OK [0.1879041E10,TO_POSINF] --> [1879041024,1879041024] --> OK [0.18790412E10,TO_POSINF] --> [1879041152,1879041152] --> OK [0.18790413E10,TO_POSINF] --> [1879041280,1879041280] --> OK [0.18790414E10,TO_POSINF] --> [1879041408,1879041408] --> OK [0.18790415E10,TO_POSINF] --> [1879041536,1879041536] --> OK [0.18790417E10,TO_POSINF] --> [1879041664,1879041664] --> OK [0.18790418E10,TO_POSINF] --> [1879041792,1879041792] --> OK [0.18790419E10,TO_POSINF] --> [1879041920,1879041920] --> OK [0.1879042E10,TO_POSINF] --> [1879042048,1879042048] --> OK [0.18790422E10,TO_POSINF] --> [1879042176,1879042176] --> OK [0.18790423E10,TO_POSINF] --> [1879042304,1879042304] --> OK [0.18790424E10,TO_POSINF] --> [1879042432,1879042432] --> OK [0.18790426E10,TO_POSINF] --> [1879042560,1879042560] --> OK [0.18790427E10,TO_POSINF] --> [1879042688,1879042688] --> OK [0.18790428E10,TO_POSINF] --> [1879042816,1879042816] --> OK [0.1879043E10,TO_POSINF] --> [1879042944,1879042944] --> OK [0.18790431E10,TO_POSINF] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_POSINF] --> [1879043200,1879043200] --> OK [0.18790433E10,TO_POSINF] --> [1879043328,1879043328] --> OK [0.18790435E10,TO_POSINF] --> [1879043456,1879043456] --> OK [0.18790436E10,TO_POSINF] --> [1879043584,1879043584] --> OK [0.18790437E10,TO_POSINF] --> [1879043712,1879043712] --> OK [0.18790438E10,TO_POSINF] --> [1879043840,1879043840] --> OK [0.1879044E10,TO_POSINF] --> [1879043968,1879043968] --> OK [0.18790441E10,TO_POSINF] --> [1879044096,1879044096] --> OK [0.18790442E10,TO_POSINF] --> [1879044224,1879044224] --> OK [0.18790444E10,TO_POSINF] --> [1879044352,1879044352] --> OK [0.18790445E10,TO_POSINF] --> [1879044480,1879044480] --> OK [0.18790446E10,TO_POSINF] --> [1879044608,1879044608] --> OK [0.18790447E10,TO_POSINF] --> [1879044736,1879044736] --> OK [0.18790449E10,TO_POSINF] --> [1879044864,1879044864] --> OK [0.1879045E10,TO_POSINF] --> [1879044992,1879044992] --> OK [0.18790451E10,TO_POSINF] --> [1879045120,1879045120] --> OK [0.18790452E10,TO_POSINF] --> [1879045248,1879045248] --> OK [0.18790454E10,TO_POSINF] --> [1879045376,1879045376] --> OK [0.18790455E10,TO_POSINF] --> [1879045504,1879045504] --> OK [0.18790456E10,TO_POSINF] --> [1879045632,1879045632] --> OK [0.18790458E10,TO_POSINF] --> [1879045760,1879045760] --> OK [0.18790459E10,TO_POSINF] --> [1879045888,1879045888] --> OK [0.1879046E10,TO_POSINF] --> [1879046016,1879046016] --> OK [0.18790461E10,TO_POSINF] --> [1879046144,1879046144] --> OK [0.18790463E10,TO_POSINF] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_POSINF] --> [1879046400,1879046400] --> OK [0.18790465E10,TO_POSINF] --> [1879046528,1879046528] --> OK [0.18790467E10,TO_POSINF] --> [1879046656,1879046656] --> OK [0.18790468E10,TO_POSINF] --> [1879046784,1879046784] --> OK [0.18790469E10,TO_POSINF] --> [1879046912,1879046912] --> OK [0.1879047E10,TO_POSINF] --> [1879047040,1879047040] --> OK [0.18790472E10,TO_POSINF] --> [1879047168,1879047168] --> OK [0.18790473E10,TO_POSINF] --> [1879047296,1879047296] --> OK [0.18790474E10,TO_POSINF] --> [1879047424,1879047424] --> OK [0.18790476E10,TO_POSINF] --> [1879047552,1879047552] --> OK [0.18790477E10,TO_POSINF] --> [1879047680,1879047680] --> OK [0.18790478E10,TO_POSINF] --> [1879047808,1879047808] --> OK [0.1879048E10,TO_POSINF] --> [1879047936,1879047936] --> OK [0.18790481E10,TO_POSINF] --> [1879048064,1879048064] --> OK [0.18790482E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790564E10,TO_POSINF] --> [1879056384,1879056384] --> OK [0.18790563E10,TO_POSINF] --> [1879056256,1879056256] --> OK [0.18790561E10,TO_POSINF] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_POSINF] --> [1879056000,1879056000] --> OK [0.18790559E10,TO_POSINF] --> [1879055872,1879055872] --> OK [0.18790557E10,TO_POSINF] --> [1879055744,1879055744] --> OK [0.18790556E10,TO_POSINF] --> [1879055616,1879055616] --> OK [0.18790555E10,TO_POSINF] --> [1879055488,1879055488] --> OK [0.18790554E10,TO_POSINF] --> [1879055360,1879055360] --> OK [0.18790552E10,TO_POSINF] --> [1879055232,1879055232] --> OK [0.18790551E10,TO_POSINF] --> [1879055104,1879055104] --> OK [0.1879055E10,TO_POSINF] --> [1879054976,1879054976] --> OK [0.18790548E10,TO_POSINF] --> [1879054848,1879054848] --> OK [0.18790547E10,TO_POSINF] --> [1879054720,1879054720] --> OK [0.18790546E10,TO_POSINF] --> [1879054592,1879054592] --> OK [0.18790545E10,TO_POSINF] --> [1879054464,1879054464] --> OK [0.18790543E10,TO_POSINF] --> [1879054336,1879054336] --> OK [0.18790542E10,TO_POSINF] --> [1879054208,1879054208] --> OK [0.18790541E10,TO_POSINF] --> [1879054080,1879054080] --> OK [0.1879054E10,TO_POSINF] --> [1879053952,1879053952] --> OK [0.18790538E10,TO_POSINF] --> [1879053824,1879053824] --> OK [0.18790537E10,TO_POSINF] --> [1879053696,1879053696] --> OK [0.18790536E10,TO_POSINF] --> [1879053568,1879053568] --> OK [0.18790534E10,TO_POSINF] --> [1879053440,1879053440] --> OK [0.18790533E10,TO_POSINF] --> [1879053312,1879053312] --> OK [0.18790532E10,TO_POSINF] --> [1879053184,1879053184] --> OK [0.1879053E10,TO_POSINF] --> [1879053056,1879053056] --> OK [0.18790529E10,TO_POSINF] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_POSINF] --> [1879052800,1879052800] --> OK [0.18790527E10,TO_POSINF] --> [1879052672,1879052672] --> OK [0.18790525E10,TO_POSINF] --> [1879052544,1879052544] --> OK [0.18790524E10,TO_POSINF] --> [1879052416,1879052416] --> OK [0.18790523E10,TO_POSINF] --> [1879052288,1879052288] --> OK [0.18790522E10,TO_POSINF] --> [1879052160,1879052160] --> OK [0.1879052E10,TO_POSINF] --> [1879052032,1879052032] --> OK [0.18790519E10,TO_POSINF] --> [1879051904,1879051904] --> OK [0.18790518E10,TO_POSINF] --> [1879051776,1879051776] --> OK [0.18790516E10,TO_POSINF] --> [1879051648,1879051648] --> OK [0.18790515E10,TO_POSINF] --> [1879051520,1879051520] --> OK [0.18790514E10,TO_POSINF] --> [1879051392,1879051392] --> OK [0.18790513E10,TO_POSINF] --> [1879051264,1879051264] --> OK [0.18790511E10,TO_POSINF] --> [1879051136,1879051136] --> OK [0.1879051E10,TO_POSINF] --> [1879051008,1879051008] --> OK [0.18790509E10,TO_POSINF] --> [1879050880,1879050880] --> OK [0.18790508E10,TO_POSINF] --> [1879050752,1879050752] --> OK [0.18790506E10,TO_POSINF] --> [1879050624,1879050624] --> OK [0.18790505E10,TO_POSINF] --> [1879050496,1879050496] --> OK [0.18790504E10,TO_POSINF] --> [1879050368,1879050368] --> OK [0.18790502E10,TO_POSINF] --> [1879050240,1879050240] --> OK [0.18790501E10,TO_POSINF] --> [1879050112,1879050112] --> OK [0.187905E10,TO_POSINF] --> [1879049984,1879049984] --> OK [0.18790499E10,TO_POSINF] --> [1879049856,1879049856] --> OK [0.18790497E10,TO_POSINF] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_POSINF] --> [1879049600,1879049600] --> OK [0.18790495E10,TO_POSINF] --> [1879049472,1879049472] --> OK [0.18790493E10,TO_POSINF] --> [1879049344,1879049344] --> OK [0.18790492E10,TO_POSINF] --> [1879049216,1879049216] --> OK [0.18790491E10,TO_POSINF] --> [1879049088,1879049088] --> OK [0.1879049E10,TO_POSINF] --> [1879048960,1879048960] --> OK [0.18790488E10,TO_POSINF] --> [1879048832,1879048832] --> OK [0.18790487E10,TO_POSINF] --> [1879048704,1879048704] --> OK [0.18790486E10,TO_POSINF] --> [1879048576,1879048576] --> OK [0.18790484E10,TO_POSINF] --> [1879048448,1879048448] --> OK [0.18790483E10,TO_POSINF] --> [1879048320,1879048320] --> OK [0.20132577E10,TO_POSINF] --> [2013257728,2013257728] --> OK [0.20132579E10,TO_POSINF] --> [2013257856,2013257856] --> OK [0.2013258E10,TO_POSINF] --> [2013257984,2013257984] --> OK [0.20132581E10,TO_POSINF] --> [2013258112,2013258112] --> OK [0.20132582E10,TO_POSINF] --> [2013258240,2013258240] --> OK [0.20132584E10,TO_POSINF] --> [2013258368,2013258368] --> OK [0.20132585E10,TO_POSINF] --> [2013258496,2013258496] --> OK [0.20132586E10,TO_POSINF] --> [2013258624,2013258624] --> OK [0.20132588E10,TO_POSINF] --> [2013258752,2013258752] --> OK [0.20132589E10,TO_POSINF] --> [2013258880,2013258880] --> OK [0.2013259E10,TO_POSINF] --> [2013259008,2013259008] --> OK [0.20132591E10,TO_POSINF] --> [2013259136,2013259136] --> OK [0.20132593E10,TO_POSINF] --> [2013259264,2013259264] --> OK [0.20132594E10,TO_POSINF] --> [2013259392,2013259392] --> OK [0.20132595E10,TO_POSINF] --> [2013259520,2013259520] --> OK [0.20132596E10,TO_POSINF] --> [2013259648,2013259648] --> OK [0.20132598E10,TO_POSINF] --> [2013259776,2013259776] --> OK [0.20132599E10,TO_POSINF] --> [2013259904,2013259904] --> OK [0.201326E10,TO_POSINF] --> [2013260032,2013260032] --> OK [0.20132602E10,TO_POSINF] --> [2013260160,2013260160] --> OK [0.20132603E10,TO_POSINF] --> [2013260288,2013260288] --> OK [0.20132604E10,TO_POSINF] --> [2013260416,2013260416] --> OK [0.20132605E10,TO_POSINF] --> [2013260544,2013260544] --> OK [0.20132607E10,TO_POSINF] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_POSINF] --> [2013260800,2013260800] --> OK [0.20132609E10,TO_POSINF] --> [2013260928,2013260928] --> OK [0.2013261E10,TO_POSINF] --> [2013261056,2013261056] --> OK [0.20132612E10,TO_POSINF] --> [2013261184,2013261184] --> OK [0.20132613E10,TO_POSINF] --> [2013261312,2013261312] --> OK [0.20132614E10,TO_POSINF] --> [2013261440,2013261440] --> OK [0.20132616E10,TO_POSINF] --> [2013261568,2013261568] --> OK [0.20132617E10,TO_POSINF] --> [2013261696,2013261696] --> OK [0.20132618E10,TO_POSINF] --> [2013261824,2013261824] --> OK [0.2013262E10,TO_POSINF] --> [2013261952,2013261952] --> OK [0.20132621E10,TO_POSINF] --> [2013262080,2013262080] --> OK [0.20132622E10,TO_POSINF] --> [2013262208,2013262208] --> OK [0.20132623E10,TO_POSINF] --> [2013262336,2013262336] --> OK [0.20132625E10,TO_POSINF] --> [2013262464,2013262464] --> OK [0.20132626E10,TO_POSINF] --> [2013262592,2013262592] --> OK [0.20132627E10,TO_POSINF] --> [2013262720,2013262720] --> OK [0.20132628E10,TO_POSINF] --> [2013262848,2013262848] --> OK [0.2013263E10,TO_POSINF] --> [2013262976,2013262976] --> OK [0.20132631E10,TO_POSINF] --> [2013263104,2013263104] --> OK [0.20132632E10,TO_POSINF] --> [2013263232,2013263232] --> OK [0.20132634E10,TO_POSINF] --> [2013263360,2013263360] --> OK [0.20132635E10,TO_POSINF] --> [2013263488,2013263488] --> OK [0.20132636E10,TO_POSINF] --> [2013263616,2013263616] --> OK [0.20132637E10,TO_POSINF] --> [2013263744,2013263744] --> OK [0.20132639E10,TO_POSINF] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_POSINF] --> [2013264000,2013264000] --> OK [0.20132641E10,TO_POSINF] --> [2013264128,2013264128] --> OK [0.20132643E10,TO_POSINF] --> [2013264256,2013264256] --> OK [0.20132644E10,TO_POSINF] --> [2013264384,2013264384] --> OK [0.20132645E10,TO_POSINF] --> [2013264512,2013264512] --> OK [0.20132646E10,TO_POSINF] --> [2013264640,2013264640] --> OK [0.20132648E10,TO_POSINF] --> [2013264768,2013264768] --> OK [0.20132649E10,TO_POSINF] --> [2013264896,2013264896] --> OK [0.2013265E10,TO_POSINF] --> [2013265024,2013265024] --> OK [0.20132652E10,TO_POSINF] --> [2013265152,2013265152] --> OK [0.20132653E10,TO_POSINF] --> [2013265280,2013265280] --> OK [0.20132654E10,TO_POSINF] --> [2013265408,2013265408] --> OK [0.20132655E10,TO_POSINF] --> [2013265536,2013265536] --> OK [0.20132657E10,TO_POSINF] --> [2013265664,2013265664] --> OK [0.20132658E10,TO_POSINF] --> [2013265792,2013265792] --> OK [0.20132659E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132741E10,TO_POSINF] --> [2013274112,2013274112] --> OK [0.2013274E10,TO_POSINF] --> [2013273984,2013273984] --> OK [0.20132739E10,TO_POSINF] --> [2013273856,2013273856] --> OK [0.20132737E10,TO_POSINF] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_POSINF] --> [2013273600,2013273600] --> OK [0.20132735E10,TO_POSINF] --> [2013273472,2013273472] --> OK [0.20132733E10,TO_POSINF] --> [2013273344,2013273344] --> OK [0.20132732E10,TO_POSINF] --> [2013273216,2013273216] --> OK [0.20132731E10,TO_POSINF] --> [2013273088,2013273088] --> OK [0.2013273E10,TO_POSINF] --> [2013272960,2013272960] --> OK [0.20132728E10,TO_POSINF] --> [2013272832,2013272832] --> OK [0.20132727E10,TO_POSINF] --> [2013272704,2013272704] --> OK [0.20132726E10,TO_POSINF] --> [2013272576,2013272576] --> OK [0.20132724E10,TO_POSINF] --> [2013272448,2013272448] --> OK [0.20132723E10,TO_POSINF] --> [2013272320,2013272320] --> OK [0.20132722E10,TO_POSINF] --> [2013272192,2013272192] --> OK [0.2013272E10,TO_POSINF] --> [2013272064,2013272064] --> OK [0.20132719E10,TO_POSINF] --> [2013271936,2013271936] --> OK [0.20132718E10,TO_POSINF] --> [2013271808,2013271808] --> OK [0.20132717E10,TO_POSINF] --> [2013271680,2013271680] --> OK [0.20132716E10,TO_POSINF] --> [2013271552,2013271552] --> OK [0.20132714E10,TO_POSINF] --> [2013271424,2013271424] --> OK [0.20132713E10,TO_POSINF] --> [2013271296,2013271296] --> OK [0.20132712E10,TO_POSINF] --> [2013271168,2013271168] --> OK [0.2013271E10,TO_POSINF] --> [2013271040,2013271040] --> OK [0.20132709E10,TO_POSINF] --> [2013270912,2013270912] --> OK [0.20132708E10,TO_POSINF] --> [2013270784,2013270784] --> OK [0.20132707E10,TO_POSINF] --> [2013270656,2013270656] --> OK [0.20132705E10,TO_POSINF] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_POSINF] --> [2013270400,2013270400] --> OK [0.20132703E10,TO_POSINF] --> [2013270272,2013270272] --> OK [0.20132701E10,TO_POSINF] --> [2013270144,2013270144] --> OK [0.201327E10,TO_POSINF] --> [2013270016,2013270016] --> OK [0.20132699E10,TO_POSINF] --> [2013269888,2013269888] --> OK [0.20132698E10,TO_POSINF] --> [2013269760,2013269760] --> OK [0.20132696E10,TO_POSINF] --> [2013269632,2013269632] --> OK [0.20132695E10,TO_POSINF] --> [2013269504,2013269504] --> OK [0.20132694E10,TO_POSINF] --> [2013269376,2013269376] --> OK [0.20132692E10,TO_POSINF] --> [2013269248,2013269248] --> OK [0.20132691E10,TO_POSINF] --> [2013269120,2013269120] --> OK [0.2013269E10,TO_POSINF] --> [2013268992,2013268992] --> OK [0.20132689E10,TO_POSINF] --> [2013268864,2013268864] --> OK [0.20132687E10,TO_POSINF] --> [2013268736,2013268736] --> OK [0.20132686E10,TO_POSINF] --> [2013268608,2013268608] --> OK [0.20132685E10,TO_POSINF] --> [2013268480,2013268480] --> OK [0.20132684E10,TO_POSINF] --> [2013268352,2013268352] --> OK [0.20132682E10,TO_POSINF] --> [2013268224,2013268224] --> OK [0.20132681E10,TO_POSINF] --> [2013268096,2013268096] --> OK [0.2013268E10,TO_POSINF] --> [2013267968,2013267968] --> OK [0.20132678E10,TO_POSINF] --> [2013267840,2013267840] --> OK [0.20132677E10,TO_POSINF] --> [2013267712,2013267712] --> OK [0.20132676E10,TO_POSINF] --> [2013267584,2013267584] --> OK [0.20132675E10,TO_POSINF] --> [2013267456,2013267456] --> OK [0.20132673E10,TO_POSINF] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_POSINF] --> [2013267200,2013267200] --> OK [0.20132671E10,TO_POSINF] --> [2013267072,2013267072] --> OK [0.2013267E10,TO_POSINF] --> [2013266944,2013266944] --> OK [0.20132668E10,TO_POSINF] --> [2013266816,2013266816] --> OK [0.20132667E10,TO_POSINF] --> [2013266688,2013266688] --> OK [0.20132666E10,TO_POSINF] --> [2013266560,2013266560] --> OK [0.20132664E10,TO_POSINF] --> [2013266432,2013266432] --> OK [0.20132663E10,TO_POSINF] --> [2013266304,2013266304] --> OK [0.20132662E10,TO_POSINF] --> [2013266176,2013266176] --> OK [0.2013266E10,TO_POSINF] --> [2013266048,2013266048] --> OK [0.20803666E10,TO_POSINF] --> [2080366592,2080366592] --> OK [0.20803667E10,TO_POSINF] --> [2080366720,2080366720] --> OK [0.20803668E10,TO_POSINF] --> [2080366848,2080366848] --> OK [0.2080367E10,TO_POSINF] --> [2080366976,2080366976] --> OK [0.20803671E10,TO_POSINF] --> [2080367104,2080367104] --> OK [0.20803672E10,TO_POSINF] --> [2080367232,2080367232] --> OK [0.20803674E10,TO_POSINF] --> [2080367360,2080367360] --> OK [0.20803675E10,TO_POSINF] --> [2080367488,2080367488] --> OK [0.20803676E10,TO_POSINF] --> [2080367616,2080367616] --> OK [0.20803677E10,TO_POSINF] --> [2080367744,2080367744] --> OK [0.20803679E10,TO_POSINF] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_POSINF] --> [2080368000,2080368000] --> OK [0.20803681E10,TO_POSINF] --> [2080368128,2080368128] --> OK [0.20803683E10,TO_POSINF] --> [2080368256,2080368256] --> OK [0.20803684E10,TO_POSINF] --> [2080368384,2080368384] --> OK [0.20803685E10,TO_POSINF] --> [2080368512,2080368512] --> OK [0.20803686E10,TO_POSINF] --> [2080368640,2080368640] --> OK [0.20803688E10,TO_POSINF] --> [2080368768,2080368768] --> OK [0.20803689E10,TO_POSINF] --> [2080368896,2080368896] --> OK [0.2080369E10,TO_POSINF] --> [2080369024,2080369024] --> OK [0.20803692E10,TO_POSINF] --> [2080369152,2080369152] --> OK [0.20803693E10,TO_POSINF] --> [2080369280,2080369280] --> OK [0.20803694E10,TO_POSINF] --> [2080369408,2080369408] --> OK [0.20803695E10,TO_POSINF] --> [2080369536,2080369536] --> OK [0.20803697E10,TO_POSINF] --> [2080369664,2080369664] --> OK [0.20803698E10,TO_POSINF] --> [2080369792,2080369792] --> OK [0.20803699E10,TO_POSINF] --> [2080369920,2080369920] --> OK [0.208037E10,TO_POSINF] --> [2080370048,2080370048] --> OK [0.20803702E10,TO_POSINF] --> [2080370176,2080370176] --> OK [0.20803703E10,TO_POSINF] --> [2080370304,2080370304] --> OK [0.20803704E10,TO_POSINF] --> [2080370432,2080370432] --> OK [0.20803706E10,TO_POSINF] --> [2080370560,2080370560] --> OK [0.20803707E10,TO_POSINF] --> [2080370688,2080370688] --> OK [0.20803708E10,TO_POSINF] --> [2080370816,2080370816] --> OK [0.2080371E10,TO_POSINF] --> [2080370944,2080370944] --> OK [0.20803711E10,TO_POSINF] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_POSINF] --> [2080371200,2080371200] --> OK [0.20803713E10,TO_POSINF] --> [2080371328,2080371328] --> OK [0.20803715E10,TO_POSINF] --> [2080371456,2080371456] --> OK [0.20803716E10,TO_POSINF] --> [2080371584,2080371584] --> OK [0.20803717E10,TO_POSINF] --> [2080371712,2080371712] --> OK [0.20803718E10,TO_POSINF] --> [2080371840,2080371840] --> OK [0.2080372E10,TO_POSINF] --> [2080371968,2080371968] --> OK [0.20803721E10,TO_POSINF] --> [2080372096,2080372096] --> OK [0.20803722E10,TO_POSINF] --> [2080372224,2080372224] --> OK [0.20803724E10,TO_POSINF] --> [2080372352,2080372352] --> OK [0.20803725E10,TO_POSINF] --> [2080372480,2080372480] --> OK [0.20803726E10,TO_POSINF] --> [2080372608,2080372608] --> OK [0.20803727E10,TO_POSINF] --> [2080372736,2080372736] --> OK [0.20803729E10,TO_POSINF] --> [2080372864,2080372864] --> OK [0.2080373E10,TO_POSINF] --> [2080372992,2080372992] --> OK [0.20803731E10,TO_POSINF] --> [2080373120,2080373120] --> OK [0.20803732E10,TO_POSINF] --> [2080373248,2080373248] --> OK [0.20803734E10,TO_POSINF] --> [2080373376,2080373376] --> OK [0.20803735E10,TO_POSINF] --> [2080373504,2080373504] --> OK [0.20803736E10,TO_POSINF] --> [2080373632,2080373632] --> OK [0.20803738E10,TO_POSINF] --> [2080373760,2080373760] --> OK [0.20803739E10,TO_POSINF] --> [2080373888,2080373888] --> OK [0.2080374E10,TO_POSINF] --> [2080374016,2080374016] --> OK [0.20803741E10,TO_POSINF] --> [2080374144,2080374144] --> OK [0.20803743E10,TO_POSINF] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_POSINF] --> [2080374400,2080374400] --> OK [0.20803745E10,TO_POSINF] --> [2080374528,2080374528] --> OK [0.20803747E10,TO_POSINF] --> [2080374656,2080374656] --> OK [0.20803748E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080383E10,TO_POSINF] --> [2080382976,2080382976] --> OK [0.20803828E10,TO_POSINF] --> [2080382848,2080382848] --> OK [0.20803827E10,TO_POSINF] --> [2080382720,2080382720] --> OK [0.20803826E10,TO_POSINF] --> [2080382592,2080382592] --> OK [0.20803825E10,TO_POSINF] --> [2080382464,2080382464] --> OK [0.20803823E10,TO_POSINF] --> [2080382336,2080382336] --> OK [0.20803822E10,TO_POSINF] --> [2080382208,2080382208] --> OK [0.20803821E10,TO_POSINF] --> [2080382080,2080382080] --> OK [0.2080382E10,TO_POSINF] --> [2080381952,2080381952] --> OK [0.20803818E10,TO_POSINF] --> [2080381824,2080381824] --> OK [0.20803817E10,TO_POSINF] --> [2080381696,2080381696] --> OK [0.20803816E10,TO_POSINF] --> [2080381568,2080381568] --> OK [0.20803814E10,TO_POSINF] --> [2080381440,2080381440] --> OK [0.20803813E10,TO_POSINF] --> [2080381312,2080381312] --> OK [0.20803812E10,TO_POSINF] --> [2080381184,2080381184] --> OK [0.2080381E10,TO_POSINF] --> [2080381056,2080381056] --> OK [0.20803809E10,TO_POSINF] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_POSINF] --> [2080380800,2080380800] --> OK [0.20803807E10,TO_POSINF] --> [2080380672,2080380672] --> OK [0.20803805E10,TO_POSINF] --> [2080380544,2080380544] --> OK [0.20803804E10,TO_POSINF] --> [2080380416,2080380416] --> OK [0.20803803E10,TO_POSINF] --> [2080380288,2080380288] --> OK [0.20803802E10,TO_POSINF] --> [2080380160,2080380160] --> OK [0.208038E10,TO_POSINF] --> [2080380032,2080380032] --> OK [0.20803799E10,TO_POSINF] --> [2080379904,2080379904] --> OK [0.20803798E10,TO_POSINF] --> [2080379776,2080379776] --> OK [0.20803796E10,TO_POSINF] --> [2080379648,2080379648] --> OK [0.20803795E10,TO_POSINF] --> [2080379520,2080379520] --> OK [0.20803794E10,TO_POSINF] --> [2080379392,2080379392] --> OK [0.20803793E10,TO_POSINF] --> [2080379264,2080379264] --> OK [0.20803791E10,TO_POSINF] --> [2080379136,2080379136] --> OK [0.2080379E10,TO_POSINF] --> [2080379008,2080379008] --> OK [0.20803789E10,TO_POSINF] --> [2080378880,2080378880] --> OK [0.20803788E10,TO_POSINF] --> [2080378752,2080378752] --> OK [0.20803786E10,TO_POSINF] --> [2080378624,2080378624] --> OK [0.20803785E10,TO_POSINF] --> [2080378496,2080378496] --> OK [0.20803784E10,TO_POSINF] --> [2080378368,2080378368] --> OK [0.20803782E10,TO_POSINF] --> [2080378240,2080378240] --> OK [0.20803781E10,TO_POSINF] --> [2080378112,2080378112] --> OK [0.2080378E10,TO_POSINF] --> [2080377984,2080377984] --> OK [0.20803779E10,TO_POSINF] --> [2080377856,2080377856] --> OK [0.20803777E10,TO_POSINF] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_POSINF] --> [2080377600,2080377600] --> OK [0.20803775E10,TO_POSINF] --> [2080377472,2080377472] --> OK [0.20803773E10,TO_POSINF] --> [2080377344,2080377344] --> OK [0.20803772E10,TO_POSINF] --> [2080377216,2080377216] --> OK [0.20803771E10,TO_POSINF] --> [2080377088,2080377088] --> OK [0.2080377E10,TO_POSINF] --> [2080376960,2080376960] --> OK [0.20803768E10,TO_POSINF] --> [2080376832,2080376832] --> OK [0.20803767E10,TO_POSINF] --> [2080376704,2080376704] --> OK [0.20803766E10,TO_POSINF] --> [2080376576,2080376576] --> OK [0.20803764E10,TO_POSINF] --> [2080376448,2080376448] --> OK [0.20803763E10,TO_POSINF] --> [2080376320,2080376320] --> OK [0.20803762E10,TO_POSINF] --> [2080376192,2080376192] --> OK [0.2080376E10,TO_POSINF] --> [2080376064,2080376064] --> OK [0.20803759E10,TO_POSINF] --> [2080375936,2080375936] --> OK [0.20803758E10,TO_POSINF] --> [2080375808,2080375808] --> OK [0.20803757E10,TO_POSINF] --> [2080375680,2080375680] --> OK [0.20803756E10,TO_POSINF] --> [2080375552,2080375552] --> OK [0.20803754E10,TO_POSINF] --> [2080375424,2080375424] --> OK [0.20803753E10,TO_POSINF] --> [2080375296,2080375296] --> OK [0.20803752E10,TO_POSINF] --> [2080375168,2080375168] --> OK [0.2080375E10,TO_POSINF] --> [2080375040,2080375040] --> OK [0.20803749E10,TO_POSINF] --> [2080374912,2080374912] --> OK [0.2113921E10,TO_POSINF] --> [2113921024,2113921024] --> OK [0.21139212E10,TO_POSINF] --> [2113921152,2113921152] --> OK [0.21139213E10,TO_POSINF] --> [2113921280,2113921280] --> OK [0.21139214E10,TO_POSINF] --> [2113921408,2113921408] --> OK [0.21139215E10,TO_POSINF] --> [2113921536,2113921536] --> OK [0.21139217E10,TO_POSINF] --> [2113921664,2113921664] --> OK [0.21139218E10,TO_POSINF] --> [2113921792,2113921792] --> OK [0.21139219E10,TO_POSINF] --> [2113921920,2113921920] --> OK [0.2113922E10,TO_POSINF] --> [2113922048,2113922048] --> OK [0.21139222E10,TO_POSINF] --> [2113922176,2113922176] --> OK [0.21139223E10,TO_POSINF] --> [2113922304,2113922304] --> OK [0.21139224E10,TO_POSINF] --> [2113922432,2113922432] --> OK [0.21139226E10,TO_POSINF] --> [2113922560,2113922560] --> OK [0.21139227E10,TO_POSINF] --> [2113922688,2113922688] --> OK [0.21139228E10,TO_POSINF] --> [2113922816,2113922816] --> OK [0.2113923E10,TO_POSINF] --> [2113922944,2113922944] --> OK [0.21139231E10,TO_POSINF] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_POSINF] --> [2113923200,2113923200] --> OK [0.21139233E10,TO_POSINF] --> [2113923328,2113923328] --> OK [0.21139235E10,TO_POSINF] --> [2113923456,2113923456] --> OK [0.21139236E10,TO_POSINF] --> [2113923584,2113923584] --> OK [0.21139237E10,TO_POSINF] --> [2113923712,2113923712] --> OK [0.21139238E10,TO_POSINF] --> [2113923840,2113923840] --> OK [0.2113924E10,TO_POSINF] --> [2113923968,2113923968] --> OK [0.21139241E10,TO_POSINF] --> [2113924096,2113924096] --> OK [0.21139242E10,TO_POSINF] --> [2113924224,2113924224] --> OK [0.21139244E10,TO_POSINF] --> [2113924352,2113924352] --> OK [0.21139245E10,TO_POSINF] --> [2113924480,2113924480] --> OK [0.21139246E10,TO_POSINF] --> [2113924608,2113924608] --> OK [0.21139247E10,TO_POSINF] --> [2113924736,2113924736] --> OK [0.21139249E10,TO_POSINF] --> [2113924864,2113924864] --> OK [0.2113925E10,TO_POSINF] --> [2113924992,2113924992] --> OK [0.21139251E10,TO_POSINF] --> [2113925120,2113925120] --> OK [0.21139252E10,TO_POSINF] --> [2113925248,2113925248] --> OK [0.21139254E10,TO_POSINF] --> [2113925376,2113925376] --> OK [0.21139255E10,TO_POSINF] --> [2113925504,2113925504] --> OK [0.21139256E10,TO_POSINF] --> [2113925632,2113925632] --> OK [0.21139258E10,TO_POSINF] --> [2113925760,2113925760] --> OK [0.21139259E10,TO_POSINF] --> [2113925888,2113925888] --> OK [0.2113926E10,TO_POSINF] --> [2113926016,2113926016] --> OK [0.21139261E10,TO_POSINF] --> [2113926144,2113926144] --> OK [0.21139263E10,TO_POSINF] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_POSINF] --> [2113926400,2113926400] --> OK [0.21139265E10,TO_POSINF] --> [2113926528,2113926528] --> OK [0.21139267E10,TO_POSINF] --> [2113926656,2113926656] --> OK [0.21139268E10,TO_POSINF] --> [2113926784,2113926784] --> OK [0.21139269E10,TO_POSINF] --> [2113926912,2113926912] --> OK [0.2113927E10,TO_POSINF] --> [2113927040,2113927040] --> OK [0.21139272E10,TO_POSINF] --> [2113927168,2113927168] --> OK [0.21139273E10,TO_POSINF] --> [2113927296,2113927296] --> OK [0.21139274E10,TO_POSINF] --> [2113927424,2113927424] --> OK [0.21139276E10,TO_POSINF] --> [2113927552,2113927552] --> OK [0.21139277E10,TO_POSINF] --> [2113927680,2113927680] --> OK [0.21139278E10,TO_POSINF] --> [2113927808,2113927808] --> OK [0.2113928E10,TO_POSINF] --> [2113927936,2113927936] --> OK [0.21139281E10,TO_POSINF] --> [2113928064,2113928064] --> OK [0.21139282E10,TO_POSINF] --> [2113928192,2113928192] --> OK [0.21139283E10,TO_POSINF] --> [2113928320,2113928320] --> OK [0.21139284E10,TO_POSINF] --> [2113928448,2113928448] --> OK [0.21139286E10,TO_POSINF] --> [2113928576,2113928576] --> OK [0.21139287E10,TO_POSINF] --> [2113928704,2113928704] --> OK [0.21139288E10,TO_POSINF] --> [2113928832,2113928832] --> OK [0.2113929E10,TO_POSINF] --> [2113928960,2113928960] --> OK [0.21139291E10,TO_POSINF] --> [2113929088,2113929088] --> OK [0.21139292E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139374E10,TO_POSINF] --> [2113937408,2113937408] --> OK [0.21139373E10,TO_POSINF] --> [2113937280,2113937280] --> OK [0.21139372E10,TO_POSINF] --> [2113937152,2113937152] --> OK [0.2113937E10,TO_POSINF] --> [2113937024,2113937024] --> OK [0.21139369E10,TO_POSINF] --> [2113936896,2113936896] --> OK [0.21139368E10,TO_POSINF] --> [2113936768,2113936768] --> OK [0.21139366E10,TO_POSINF] --> [2113936640,2113936640] --> OK [0.21139365E10,TO_POSINF] --> [2113936512,2113936512] --> OK [0.21139364E10,TO_POSINF] --> [2113936384,2113936384] --> OK [0.21139363E10,TO_POSINF] --> [2113936256,2113936256] --> OK [0.21139361E10,TO_POSINF] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_POSINF] --> [2113936000,2113936000] --> OK [0.21139359E10,TO_POSINF] --> [2113935872,2113935872] --> OK [0.21139357E10,TO_POSINF] --> [2113935744,2113935744] --> OK [0.21139356E10,TO_POSINF] --> [2113935616,2113935616] --> OK [0.21139355E10,TO_POSINF] --> [2113935488,2113935488] --> OK [0.21139354E10,TO_POSINF] --> [2113935360,2113935360] --> OK [0.21139352E10,TO_POSINF] --> [2113935232,2113935232] --> OK [0.21139351E10,TO_POSINF] --> [2113935104,2113935104] --> OK [0.2113935E10,TO_POSINF] --> [2113934976,2113934976] --> OK [0.21139348E10,TO_POSINF] --> [2113934848,2113934848] --> OK [0.21139347E10,TO_POSINF] --> [2113934720,2113934720] --> OK [0.21139346E10,TO_POSINF] --> [2113934592,2113934592] --> OK [0.21139345E10,TO_POSINF] --> [2113934464,2113934464] --> OK [0.21139343E10,TO_POSINF] --> [2113934336,2113934336] --> OK [0.21139342E10,TO_POSINF] --> [2113934208,2113934208] --> OK [0.21139341E10,TO_POSINF] --> [2113934080,2113934080] --> OK [0.2113934E10,TO_POSINF] --> [2113933952,2113933952] --> OK [0.21139338E10,TO_POSINF] --> [2113933824,2113933824] --> OK [0.21139337E10,TO_POSINF] --> [2113933696,2113933696] --> OK [0.21139336E10,TO_POSINF] --> [2113933568,2113933568] --> OK [0.21139334E10,TO_POSINF] --> [2113933440,2113933440] --> OK [0.21139333E10,TO_POSINF] --> [2113933312,2113933312] --> OK [0.21139332E10,TO_POSINF] --> [2113933184,2113933184] --> OK [0.2113933E10,TO_POSINF] --> [2113933056,2113933056] --> OK [0.21139329E10,TO_POSINF] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_POSINF] --> [2113932800,2113932800] --> OK [0.21139327E10,TO_POSINF] --> [2113932672,2113932672] --> OK [0.21139325E10,TO_POSINF] --> [2113932544,2113932544] --> OK [0.21139324E10,TO_POSINF] --> [2113932416,2113932416] --> OK [0.21139323E10,TO_POSINF] --> [2113932288,2113932288] --> OK [0.21139322E10,TO_POSINF] --> [2113932160,2113932160] --> OK [0.2113932E10,TO_POSINF] --> [2113932032,2113932032] --> OK [0.21139319E10,TO_POSINF] --> [2113931904,2113931904] --> OK [0.21139318E10,TO_POSINF] --> [2113931776,2113931776] --> OK [0.21139316E10,TO_POSINF] --> [2113931648,2113931648] --> OK [0.21139315E10,TO_POSINF] --> [2113931520,2113931520] --> OK [0.21139314E10,TO_POSINF] --> [2113931392,2113931392] --> OK [0.21139313E10,TO_POSINF] --> [2113931264,2113931264] --> OK [0.21139311E10,TO_POSINF] --> [2113931136,2113931136] --> OK [0.2113931E10,TO_POSINF] --> [2113931008,2113931008] --> OK [0.21139309E10,TO_POSINF] --> [2113930880,2113930880] --> OK [0.21139308E10,TO_POSINF] --> [2113930752,2113930752] --> OK [0.21139306E10,TO_POSINF] --> [2113930624,2113930624] --> OK [0.21139305E10,TO_POSINF] --> [2113930496,2113930496] --> OK [0.21139304E10,TO_POSINF] --> [2113930368,2113930368] --> OK [0.21139302E10,TO_POSINF] --> [2113930240,2113930240] --> OK [0.21139301E10,TO_POSINF] --> [2113930112,2113930112] --> OK [0.211393E10,TO_POSINF] --> [2113929984,2113929984] --> OK [0.21139299E10,TO_POSINF] --> [2113929856,2113929856] --> OK [0.21139297E10,TO_POSINF] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_POSINF] --> [2113929600,2113929600] --> OK [0.21139295E10,TO_POSINF] --> [2113929472,2113929472] --> OK [0.21139293E10,TO_POSINF] --> [2113929344,2113929344] --> OK [0.21474755E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.214748E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21475E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.214749E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_POSINF] --> [Overflow,2147483904] --> OK [~0.21475E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.21475E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.21474998E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.21474995E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.21474993E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.21474988E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.21474985E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.21474982E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147498E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.21474977E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.21474975E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.21474972E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.2147497E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.21474967E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.21474964E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.21474962E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147496E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.21474957E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.21474954E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.21474952E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147495E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.21474947E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.21474941E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147494E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.21474936E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.21474934E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.2147493E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.21474929E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.21474926E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.21474924E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.21474918E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.21474916E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.21474913E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.21474908E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.21474906E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.21474903E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.214749E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.21474898E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.21474895E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.21474893E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.21474888E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.21474885E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.21474883E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.21474877E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.21474875E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.21474872E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147487E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.21474867E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.21474865E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.21474862E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147486E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.21474857E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.21474854E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.21474852E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147485E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.21474847E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.21474844E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.21474842E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147484E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.21474836E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474755E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.21474756E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.21474757E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.21474758E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147476E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.21474761E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.21474762E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.21474764E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.21474765E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.21474766E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.21474767E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.21474769E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147477E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.21474771E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.21474772E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.21474774E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.21474775E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.21474776E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.21474778E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.21474779E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.21474781E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.21474783E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.21474785E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.21474787E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.21474788E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.21474789E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.2147479E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.21474792E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.21474793E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.21474794E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.21474796E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.21474797E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.21474798E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.21474799E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.214748E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.21474802E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.21474803E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.21474804E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.21474806E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.21474807E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.21474808E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.2147481E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.21474811E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.21474812E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.21474813E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.21474815E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.21474817E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.21474819E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147482E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.21474821E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.21474822E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.21474824E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.21474825E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.21474826E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.21474828E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.21474829E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.21474831E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.21474833E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.21474834E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.21474835E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.21139374E10,TO_ZERO] --> [~2113937408,~2113937408] --> OK [~0.21139373E10,TO_ZERO] --> [~2113937280,~2113937280] --> OK [~0.21139372E10,TO_ZERO] --> [~2113937152,~2113937152] --> OK [~0.2113937E10,TO_ZERO] --> [~2113937024,~2113937024] --> OK [~0.21139369E10,TO_ZERO] --> [~2113936896,~2113936896] --> OK [~0.21139368E10,TO_ZERO] --> [~2113936768,~2113936768] --> OK [~0.21139366E10,TO_ZERO] --> [~2113936640,~2113936640] --> OK [~0.21139365E10,TO_ZERO] --> [~2113936512,~2113936512] --> OK [~0.21139364E10,TO_ZERO] --> [~2113936384,~2113936384] --> OK [~0.21139363E10,TO_ZERO] --> [~2113936256,~2113936256] --> OK [~0.21139361E10,TO_ZERO] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_ZERO] --> [~2113936000,~2113936000] --> OK [~0.21139359E10,TO_ZERO] --> [~2113935872,~2113935872] --> OK [~0.21139357E10,TO_ZERO] --> [~2113935744,~2113935744] --> OK [~0.21139356E10,TO_ZERO] --> [~2113935616,~2113935616] --> OK [~0.21139355E10,TO_ZERO] --> [~2113935488,~2113935488] --> OK [~0.21139354E10,TO_ZERO] --> [~2113935360,~2113935360] --> OK [~0.21139352E10,TO_ZERO] --> [~2113935232,~2113935232] --> OK [~0.21139351E10,TO_ZERO] --> [~2113935104,~2113935104] --> OK [~0.2113935E10,TO_ZERO] --> [~2113934976,~2113934976] --> OK [~0.21139348E10,TO_ZERO] --> [~2113934848,~2113934848] --> OK [~0.21139347E10,TO_ZERO] --> [~2113934720,~2113934720] --> OK [~0.21139346E10,TO_ZERO] --> [~2113934592,~2113934592] --> OK [~0.21139345E10,TO_ZERO] --> [~2113934464,~2113934464] --> OK [~0.21139343E10,TO_ZERO] --> [~2113934336,~2113934336] --> OK [~0.21139342E10,TO_ZERO] --> [~2113934208,~2113934208] --> OK [~0.21139341E10,TO_ZERO] --> [~2113934080,~2113934080] --> OK [~0.2113934E10,TO_ZERO] --> [~2113933952,~2113933952] --> OK [~0.21139338E10,TO_ZERO] --> [~2113933824,~2113933824] --> OK [~0.21139337E10,TO_ZERO] --> [~2113933696,~2113933696] --> OK [~0.21139336E10,TO_ZERO] --> [~2113933568,~2113933568] --> OK [~0.21139334E10,TO_ZERO] --> [~2113933440,~2113933440] --> OK [~0.21139333E10,TO_ZERO] --> [~2113933312,~2113933312] --> OK [~0.21139332E10,TO_ZERO] --> [~2113933184,~2113933184] --> OK [~0.2113933E10,TO_ZERO] --> [~2113933056,~2113933056] --> OK [~0.21139329E10,TO_ZERO] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_ZERO] --> [~2113932800,~2113932800] --> OK [~0.21139327E10,TO_ZERO] --> [~2113932672,~2113932672] --> OK [~0.21139325E10,TO_ZERO] --> [~2113932544,~2113932544] --> OK [~0.21139324E10,TO_ZERO] --> [~2113932416,~2113932416] --> OK [~0.21139323E10,TO_ZERO] --> [~2113932288,~2113932288] --> OK [~0.21139322E10,TO_ZERO] --> [~2113932160,~2113932160] --> OK [~0.2113932E10,TO_ZERO] --> [~2113932032,~2113932032] --> OK [~0.21139319E10,TO_ZERO] --> [~2113931904,~2113931904] --> OK [~0.21139318E10,TO_ZERO] --> [~2113931776,~2113931776] --> OK [~0.21139316E10,TO_ZERO] --> [~2113931648,~2113931648] --> OK [~0.21139315E10,TO_ZERO] --> [~2113931520,~2113931520] --> OK [~0.21139314E10,TO_ZERO] --> [~2113931392,~2113931392] --> OK [~0.21139313E10,TO_ZERO] --> [~2113931264,~2113931264] --> OK [~0.21139311E10,TO_ZERO] --> [~2113931136,~2113931136] --> OK [~0.2113931E10,TO_ZERO] --> [~2113931008,~2113931008] --> OK [~0.21139309E10,TO_ZERO] --> [~2113930880,~2113930880] --> OK [~0.21139308E10,TO_ZERO] --> [~2113930752,~2113930752] --> OK [~0.21139306E10,TO_ZERO] --> [~2113930624,~2113930624] --> OK [~0.21139305E10,TO_ZERO] --> [~2113930496,~2113930496] --> OK [~0.21139304E10,TO_ZERO] --> [~2113930368,~2113930368] --> OK [~0.21139302E10,TO_ZERO] --> [~2113930240,~2113930240] --> OK [~0.21139301E10,TO_ZERO] --> [~2113930112,~2113930112] --> OK [~0.211393E10,TO_ZERO] --> [~2113929984,~2113929984] --> OK [~0.21139299E10,TO_ZERO] --> [~2113929856,~2113929856] --> OK [~0.21139297E10,TO_ZERO] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_ZERO] --> [~2113929600,~2113929600] --> OK [~0.21139295E10,TO_ZERO] --> [~2113929472,~2113929472] --> OK [~0.21139293E10,TO_ZERO] --> [~2113929344,~2113929344] --> OK [~0.21139292E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113921E10,TO_ZERO] --> [~2113921024,~2113921024] --> OK [~0.21139212E10,TO_ZERO] --> [~2113921152,~2113921152] --> OK [~0.21139213E10,TO_ZERO] --> [~2113921280,~2113921280] --> OK [~0.21139214E10,TO_ZERO] --> [~2113921408,~2113921408] --> OK [~0.21139215E10,TO_ZERO] --> [~2113921536,~2113921536] --> OK [~0.21139217E10,TO_ZERO] --> [~2113921664,~2113921664] --> OK [~0.21139218E10,TO_ZERO] --> [~2113921792,~2113921792] --> OK [~0.21139219E10,TO_ZERO] --> [~2113921920,~2113921920] --> OK [~0.2113922E10,TO_ZERO] --> [~2113922048,~2113922048] --> OK [~0.21139222E10,TO_ZERO] --> [~2113922176,~2113922176] --> OK [~0.21139223E10,TO_ZERO] --> [~2113922304,~2113922304] --> OK [~0.21139224E10,TO_ZERO] --> [~2113922432,~2113922432] --> OK [~0.21139226E10,TO_ZERO] --> [~2113922560,~2113922560] --> OK [~0.21139227E10,TO_ZERO] --> [~2113922688,~2113922688] --> OK [~0.21139228E10,TO_ZERO] --> [~2113922816,~2113922816] --> OK [~0.2113923E10,TO_ZERO] --> [~2113922944,~2113922944] --> OK [~0.21139231E10,TO_ZERO] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_ZERO] --> [~2113923200,~2113923200] --> OK [~0.21139233E10,TO_ZERO] --> [~2113923328,~2113923328] --> OK [~0.21139235E10,TO_ZERO] --> [~2113923456,~2113923456] --> OK [~0.21139236E10,TO_ZERO] --> [~2113923584,~2113923584] --> OK [~0.21139237E10,TO_ZERO] --> [~2113923712,~2113923712] --> OK [~0.21139238E10,TO_ZERO] --> [~2113923840,~2113923840] --> OK [~0.2113924E10,TO_ZERO] --> [~2113923968,~2113923968] --> OK [~0.21139241E10,TO_ZERO] --> [~2113924096,~2113924096] --> OK [~0.21139242E10,TO_ZERO] --> [~2113924224,~2113924224] --> OK [~0.21139244E10,TO_ZERO] --> [~2113924352,~2113924352] --> OK [~0.21139245E10,TO_ZERO] --> [~2113924480,~2113924480] --> OK [~0.21139246E10,TO_ZERO] --> [~2113924608,~2113924608] --> OK [~0.21139247E10,TO_ZERO] --> [~2113924736,~2113924736] --> OK [~0.21139249E10,TO_ZERO] --> [~2113924864,~2113924864] --> OK [~0.2113925E10,TO_ZERO] --> [~2113924992,~2113924992] --> OK [~0.21139251E10,TO_ZERO] --> [~2113925120,~2113925120] --> OK [~0.21139252E10,TO_ZERO] --> [~2113925248,~2113925248] --> OK [~0.21139254E10,TO_ZERO] --> [~2113925376,~2113925376] --> OK [~0.21139255E10,TO_ZERO] --> [~2113925504,~2113925504] --> OK [~0.21139256E10,TO_ZERO] --> [~2113925632,~2113925632] --> OK [~0.21139258E10,TO_ZERO] --> [~2113925760,~2113925760] --> OK [~0.21139259E10,TO_ZERO] --> [~2113925888,~2113925888] --> OK [~0.2113926E10,TO_ZERO] --> [~2113926016,~2113926016] --> OK [~0.21139261E10,TO_ZERO] --> [~2113926144,~2113926144] --> OK [~0.21139263E10,TO_ZERO] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_ZERO] --> [~2113926400,~2113926400] --> OK [~0.21139265E10,TO_ZERO] --> [~2113926528,~2113926528] --> OK [~0.21139267E10,TO_ZERO] --> [~2113926656,~2113926656] --> OK [~0.21139268E10,TO_ZERO] --> [~2113926784,~2113926784] --> OK [~0.21139269E10,TO_ZERO] --> [~2113926912,~2113926912] --> OK [~0.2113927E10,TO_ZERO] --> [~2113927040,~2113927040] --> OK [~0.21139272E10,TO_ZERO] --> [~2113927168,~2113927168] --> OK [~0.21139273E10,TO_ZERO] --> [~2113927296,~2113927296] --> OK [~0.21139274E10,TO_ZERO] --> [~2113927424,~2113927424] --> OK [~0.21139276E10,TO_ZERO] --> [~2113927552,~2113927552] --> OK [~0.21139277E10,TO_ZERO] --> [~2113927680,~2113927680] --> OK [~0.21139278E10,TO_ZERO] --> [~2113927808,~2113927808] --> OK [~0.2113928E10,TO_ZERO] --> [~2113927936,~2113927936] --> OK [~0.21139281E10,TO_ZERO] --> [~2113928064,~2113928064] --> OK [~0.21139282E10,TO_ZERO] --> [~2113928192,~2113928192] --> OK [~0.21139283E10,TO_ZERO] --> [~2113928320,~2113928320] --> OK [~0.21139284E10,TO_ZERO] --> [~2113928448,~2113928448] --> OK [~0.21139286E10,TO_ZERO] --> [~2113928576,~2113928576] --> OK [~0.21139287E10,TO_ZERO] --> [~2113928704,~2113928704] --> OK [~0.21139288E10,TO_ZERO] --> [~2113928832,~2113928832] --> OK [~0.2113929E10,TO_ZERO] --> [~2113928960,~2113928960] --> OK [~0.21139291E10,TO_ZERO] --> [~2113929088,~2113929088] --> OK [~0.2080383E10,TO_ZERO] --> [~2080382976,~2080382976] --> OK [~0.20803828E10,TO_ZERO] --> [~2080382848,~2080382848] --> OK [~0.20803827E10,TO_ZERO] --> [~2080382720,~2080382720] --> OK [~0.20803826E10,TO_ZERO] --> [~2080382592,~2080382592] --> OK [~0.20803825E10,TO_ZERO] --> [~2080382464,~2080382464] --> OK [~0.20803823E10,TO_ZERO] --> [~2080382336,~2080382336] --> OK [~0.20803822E10,TO_ZERO] --> [~2080382208,~2080382208] --> OK [~0.20803821E10,TO_ZERO] --> [~2080382080,~2080382080] --> OK [~0.2080382E10,TO_ZERO] --> [~2080381952,~2080381952] --> OK [~0.20803818E10,TO_ZERO] --> [~2080381824,~2080381824] --> OK [~0.20803817E10,TO_ZERO] --> [~2080381696,~2080381696] --> OK [~0.20803816E10,TO_ZERO] --> [~2080381568,~2080381568] --> OK [~0.20803814E10,TO_ZERO] --> [~2080381440,~2080381440] --> OK [~0.20803813E10,TO_ZERO] --> [~2080381312,~2080381312] --> OK [~0.20803812E10,TO_ZERO] --> [~2080381184,~2080381184] --> OK [~0.2080381E10,TO_ZERO] --> [~2080381056,~2080381056] --> OK [~0.20803809E10,TO_ZERO] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_ZERO] --> [~2080380800,~2080380800] --> OK [~0.20803807E10,TO_ZERO] --> [~2080380672,~2080380672] --> OK [~0.20803805E10,TO_ZERO] --> [~2080380544,~2080380544] --> OK [~0.20803804E10,TO_ZERO] --> [~2080380416,~2080380416] --> OK [~0.20803803E10,TO_ZERO] --> [~2080380288,~2080380288] --> OK [~0.20803802E10,TO_ZERO] --> [~2080380160,~2080380160] --> OK [~0.208038E10,TO_ZERO] --> [~2080380032,~2080380032] --> OK [~0.20803799E10,TO_ZERO] --> [~2080379904,~2080379904] --> OK [~0.20803798E10,TO_ZERO] --> [~2080379776,~2080379776] --> OK [~0.20803796E10,TO_ZERO] --> [~2080379648,~2080379648] --> OK [~0.20803795E10,TO_ZERO] --> [~2080379520,~2080379520] --> OK [~0.20803794E10,TO_ZERO] --> [~2080379392,~2080379392] --> OK [~0.20803793E10,TO_ZERO] --> [~2080379264,~2080379264] --> OK [~0.20803791E10,TO_ZERO] --> [~2080379136,~2080379136] --> OK [~0.2080379E10,TO_ZERO] --> [~2080379008,~2080379008] --> OK [~0.20803789E10,TO_ZERO] --> [~2080378880,~2080378880] --> OK [~0.20803788E10,TO_ZERO] --> [~2080378752,~2080378752] --> OK [~0.20803786E10,TO_ZERO] --> [~2080378624,~2080378624] --> OK [~0.20803785E10,TO_ZERO] --> [~2080378496,~2080378496] --> OK [~0.20803784E10,TO_ZERO] --> [~2080378368,~2080378368] --> OK [~0.20803782E10,TO_ZERO] --> [~2080378240,~2080378240] --> OK [~0.20803781E10,TO_ZERO] --> [~2080378112,~2080378112] --> OK [~0.2080378E10,TO_ZERO] --> [~2080377984,~2080377984] --> OK [~0.20803779E10,TO_ZERO] --> [~2080377856,~2080377856] --> OK [~0.20803777E10,TO_ZERO] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_ZERO] --> [~2080377600,~2080377600] --> OK [~0.20803775E10,TO_ZERO] --> [~2080377472,~2080377472] --> OK [~0.20803773E10,TO_ZERO] --> [~2080377344,~2080377344] --> OK [~0.20803772E10,TO_ZERO] --> [~2080377216,~2080377216] --> OK [~0.20803771E10,TO_ZERO] --> [~2080377088,~2080377088] --> OK [~0.2080377E10,TO_ZERO] --> [~2080376960,~2080376960] --> OK [~0.20803768E10,TO_ZERO] --> [~2080376832,~2080376832] --> OK [~0.20803767E10,TO_ZERO] --> [~2080376704,~2080376704] --> OK [~0.20803766E10,TO_ZERO] --> [~2080376576,~2080376576] --> OK [~0.20803764E10,TO_ZERO] --> [~2080376448,~2080376448] --> OK [~0.20803763E10,TO_ZERO] --> [~2080376320,~2080376320] --> OK [~0.20803762E10,TO_ZERO] --> [~2080376192,~2080376192] --> OK [~0.2080376E10,TO_ZERO] --> [~2080376064,~2080376064] --> OK [~0.20803759E10,TO_ZERO] --> [~2080375936,~2080375936] --> OK [~0.20803758E10,TO_ZERO] --> [~2080375808,~2080375808] --> OK [~0.20803757E10,TO_ZERO] --> [~2080375680,~2080375680] --> OK [~0.20803756E10,TO_ZERO] --> [~2080375552,~2080375552] --> OK [~0.20803754E10,TO_ZERO] --> [~2080375424,~2080375424] --> OK [~0.20803753E10,TO_ZERO] --> [~2080375296,~2080375296] --> OK [~0.20803752E10,TO_ZERO] --> [~2080375168,~2080375168] --> OK [~0.2080375E10,TO_ZERO] --> [~2080375040,~2080375040] --> OK [~0.20803749E10,TO_ZERO] --> [~2080374912,~2080374912] --> OK [~0.20803748E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803666E10,TO_ZERO] --> [~2080366592,~2080366592] --> OK [~0.20803667E10,TO_ZERO] --> [~2080366720,~2080366720] --> OK [~0.20803668E10,TO_ZERO] --> [~2080366848,~2080366848] --> OK [~0.2080367E10,TO_ZERO] --> [~2080366976,~2080366976] --> OK [~0.20803671E10,TO_ZERO] --> [~2080367104,~2080367104] --> OK [~0.20803672E10,TO_ZERO] --> [~2080367232,~2080367232] --> OK [~0.20803674E10,TO_ZERO] --> [~2080367360,~2080367360] --> OK [~0.20803675E10,TO_ZERO] --> [~2080367488,~2080367488] --> OK [~0.20803676E10,TO_ZERO] --> [~2080367616,~2080367616] --> OK [~0.20803677E10,TO_ZERO] --> [~2080367744,~2080367744] --> OK [~0.20803679E10,TO_ZERO] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_ZERO] --> [~2080368000,~2080368000] --> OK [~0.20803681E10,TO_ZERO] --> [~2080368128,~2080368128] --> OK [~0.20803683E10,TO_ZERO] --> [~2080368256,~2080368256] --> OK [~0.20803684E10,TO_ZERO] --> [~2080368384,~2080368384] --> OK [~0.20803685E10,TO_ZERO] --> [~2080368512,~2080368512] --> OK [~0.20803686E10,TO_ZERO] --> [~2080368640,~2080368640] --> OK [~0.20803688E10,TO_ZERO] --> [~2080368768,~2080368768] --> OK [~0.20803689E10,TO_ZERO] --> [~2080368896,~2080368896] --> OK [~0.2080369E10,TO_ZERO] --> [~2080369024,~2080369024] --> OK [~0.20803692E10,TO_ZERO] --> [~2080369152,~2080369152] --> OK [~0.20803693E10,TO_ZERO] --> [~2080369280,~2080369280] --> OK [~0.20803694E10,TO_ZERO] --> [~2080369408,~2080369408] --> OK [~0.20803695E10,TO_ZERO] --> [~2080369536,~2080369536] --> OK [~0.20803697E10,TO_ZERO] --> [~2080369664,~2080369664] --> OK [~0.20803698E10,TO_ZERO] --> [~2080369792,~2080369792] --> OK [~0.20803699E10,TO_ZERO] --> [~2080369920,~2080369920] --> OK [~0.208037E10,TO_ZERO] --> [~2080370048,~2080370048] --> OK [~0.20803702E10,TO_ZERO] --> [~2080370176,~2080370176] --> OK [~0.20803703E10,TO_ZERO] --> [~2080370304,~2080370304] --> OK [~0.20803704E10,TO_ZERO] --> [~2080370432,~2080370432] --> OK [~0.20803706E10,TO_ZERO] --> [~2080370560,~2080370560] --> OK [~0.20803707E10,TO_ZERO] --> [~2080370688,~2080370688] --> OK [~0.20803708E10,TO_ZERO] --> [~2080370816,~2080370816] --> OK [~0.2080371E10,TO_ZERO] --> [~2080370944,~2080370944] --> OK [~0.20803711E10,TO_ZERO] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_ZERO] --> [~2080371200,~2080371200] --> OK [~0.20803713E10,TO_ZERO] --> [~2080371328,~2080371328] --> OK [~0.20803715E10,TO_ZERO] --> [~2080371456,~2080371456] --> OK [~0.20803716E10,TO_ZERO] --> [~2080371584,~2080371584] --> OK [~0.20803717E10,TO_ZERO] --> [~2080371712,~2080371712] --> OK [~0.20803718E10,TO_ZERO] --> [~2080371840,~2080371840] --> OK [~0.2080372E10,TO_ZERO] --> [~2080371968,~2080371968] --> OK [~0.20803721E10,TO_ZERO] --> [~2080372096,~2080372096] --> OK [~0.20803722E10,TO_ZERO] --> [~2080372224,~2080372224] --> OK [~0.20803724E10,TO_ZERO] --> [~2080372352,~2080372352] --> OK [~0.20803725E10,TO_ZERO] --> [~2080372480,~2080372480] --> OK [~0.20803726E10,TO_ZERO] --> [~2080372608,~2080372608] --> OK [~0.20803727E10,TO_ZERO] --> [~2080372736,~2080372736] --> OK [~0.20803729E10,TO_ZERO] --> [~2080372864,~2080372864] --> OK [~0.2080373E10,TO_ZERO] --> [~2080372992,~2080372992] --> OK [~0.20803731E10,TO_ZERO] --> [~2080373120,~2080373120] --> OK [~0.20803732E10,TO_ZERO] --> [~2080373248,~2080373248] --> OK [~0.20803734E10,TO_ZERO] --> [~2080373376,~2080373376] --> OK [~0.20803735E10,TO_ZERO] --> [~2080373504,~2080373504] --> OK [~0.20803736E10,TO_ZERO] --> [~2080373632,~2080373632] --> OK [~0.20803738E10,TO_ZERO] --> [~2080373760,~2080373760] --> OK [~0.20803739E10,TO_ZERO] --> [~2080373888,~2080373888] --> OK [~0.2080374E10,TO_ZERO] --> [~2080374016,~2080374016] --> OK [~0.20803741E10,TO_ZERO] --> [~2080374144,~2080374144] --> OK [~0.20803743E10,TO_ZERO] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_ZERO] --> [~2080374400,~2080374400] --> OK [~0.20803745E10,TO_ZERO] --> [~2080374528,~2080374528] --> OK [~0.20803747E10,TO_ZERO] --> [~2080374656,~2080374656] --> OK [~0.20132741E10,TO_ZERO] --> [~2013274112,~2013274112] --> OK [~0.2013274E10,TO_ZERO] --> [~2013273984,~2013273984] --> OK [~0.20132739E10,TO_ZERO] --> [~2013273856,~2013273856] --> OK [~0.20132737E10,TO_ZERO] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_ZERO] --> [~2013273600,~2013273600] --> OK [~0.20132735E10,TO_ZERO] --> [~2013273472,~2013273472] --> OK [~0.20132733E10,TO_ZERO] --> [~2013273344,~2013273344] --> OK [~0.20132732E10,TO_ZERO] --> [~2013273216,~2013273216] --> OK [~0.20132731E10,TO_ZERO] --> [~2013273088,~2013273088] --> OK [~0.2013273E10,TO_ZERO] --> [~2013272960,~2013272960] --> OK [~0.20132728E10,TO_ZERO] --> [~2013272832,~2013272832] --> OK [~0.20132727E10,TO_ZERO] --> [~2013272704,~2013272704] --> OK [~0.20132726E10,TO_ZERO] --> [~2013272576,~2013272576] --> OK [~0.20132724E10,TO_ZERO] --> [~2013272448,~2013272448] --> OK [~0.20132723E10,TO_ZERO] --> [~2013272320,~2013272320] --> OK [~0.20132722E10,TO_ZERO] --> [~2013272192,~2013272192] --> OK [~0.2013272E10,TO_ZERO] --> [~2013272064,~2013272064] --> OK [~0.20132719E10,TO_ZERO] --> [~2013271936,~2013271936] --> OK [~0.20132718E10,TO_ZERO] --> [~2013271808,~2013271808] --> OK [~0.20132717E10,TO_ZERO] --> [~2013271680,~2013271680] --> OK [~0.20132716E10,TO_ZERO] --> [~2013271552,~2013271552] --> OK [~0.20132714E10,TO_ZERO] --> [~2013271424,~2013271424] --> OK [~0.20132713E10,TO_ZERO] --> [~2013271296,~2013271296] --> OK [~0.20132712E10,TO_ZERO] --> [~2013271168,~2013271168] --> OK [~0.2013271E10,TO_ZERO] --> [~2013271040,~2013271040] --> OK [~0.20132709E10,TO_ZERO] --> [~2013270912,~2013270912] --> OK [~0.20132708E10,TO_ZERO] --> [~2013270784,~2013270784] --> OK [~0.20132707E10,TO_ZERO] --> [~2013270656,~2013270656] --> OK [~0.20132705E10,TO_ZERO] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_ZERO] --> [~2013270400,~2013270400] --> OK [~0.20132703E10,TO_ZERO] --> [~2013270272,~2013270272] --> OK [~0.20132701E10,TO_ZERO] --> [~2013270144,~2013270144] --> OK [~0.201327E10,TO_ZERO] --> [~2013270016,~2013270016] --> OK [~0.20132699E10,TO_ZERO] --> [~2013269888,~2013269888] --> OK [~0.20132698E10,TO_ZERO] --> [~2013269760,~2013269760] --> OK [~0.20132696E10,TO_ZERO] --> [~2013269632,~2013269632] --> OK [~0.20132695E10,TO_ZERO] --> [~2013269504,~2013269504] --> OK [~0.20132694E10,TO_ZERO] --> [~2013269376,~2013269376] --> OK [~0.20132692E10,TO_ZERO] --> [~2013269248,~2013269248] --> OK [~0.20132691E10,TO_ZERO] --> [~2013269120,~2013269120] --> OK [~0.2013269E10,TO_ZERO] --> [~2013268992,~2013268992] --> OK [~0.20132689E10,TO_ZERO] --> [~2013268864,~2013268864] --> OK [~0.20132687E10,TO_ZERO] --> [~2013268736,~2013268736] --> OK [~0.20132686E10,TO_ZERO] --> [~2013268608,~2013268608] --> OK [~0.20132685E10,TO_ZERO] --> [~2013268480,~2013268480] --> OK [~0.20132684E10,TO_ZERO] --> [~2013268352,~2013268352] --> OK [~0.20132682E10,TO_ZERO] --> [~2013268224,~2013268224] --> OK [~0.20132681E10,TO_ZERO] --> [~2013268096,~2013268096] --> OK [~0.2013268E10,TO_ZERO] --> [~2013267968,~2013267968] --> OK [~0.20132678E10,TO_ZERO] --> [~2013267840,~2013267840] --> OK [~0.20132677E10,TO_ZERO] --> [~2013267712,~2013267712] --> OK [~0.20132676E10,TO_ZERO] --> [~2013267584,~2013267584] --> OK [~0.20132675E10,TO_ZERO] --> [~2013267456,~2013267456] --> OK [~0.20132673E10,TO_ZERO] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_ZERO] --> [~2013267200,~2013267200] --> OK [~0.20132671E10,TO_ZERO] --> [~2013267072,~2013267072] --> OK [~0.2013267E10,TO_ZERO] --> [~2013266944,~2013266944] --> OK [~0.20132668E10,TO_ZERO] --> [~2013266816,~2013266816] --> OK [~0.20132667E10,TO_ZERO] --> [~2013266688,~2013266688] --> OK [~0.20132666E10,TO_ZERO] --> [~2013266560,~2013266560] --> OK [~0.20132664E10,TO_ZERO] --> [~2013266432,~2013266432] --> OK [~0.20132663E10,TO_ZERO] --> [~2013266304,~2013266304] --> OK [~0.20132662E10,TO_ZERO] --> [~2013266176,~2013266176] --> OK [~0.2013266E10,TO_ZERO] --> [~2013266048,~2013266048] --> OK [~0.20132659E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132577E10,TO_ZERO] --> [~2013257728,~2013257728] --> OK [~0.20132579E10,TO_ZERO] --> [~2013257856,~2013257856] --> OK [~0.2013258E10,TO_ZERO] --> [~2013257984,~2013257984] --> OK [~0.20132581E10,TO_ZERO] --> [~2013258112,~2013258112] --> OK [~0.20132582E10,TO_ZERO] --> [~2013258240,~2013258240] --> OK [~0.20132584E10,TO_ZERO] --> [~2013258368,~2013258368] --> OK [~0.20132585E10,TO_ZERO] --> [~2013258496,~2013258496] --> OK [~0.20132586E10,TO_ZERO] --> [~2013258624,~2013258624] --> OK [~0.20132588E10,TO_ZERO] --> [~2013258752,~2013258752] --> OK [~0.20132589E10,TO_ZERO] --> [~2013258880,~2013258880] --> OK [~0.2013259E10,TO_ZERO] --> [~2013259008,~2013259008] --> OK [~0.20132591E10,TO_ZERO] --> [~2013259136,~2013259136] --> OK [~0.20132593E10,TO_ZERO] --> [~2013259264,~2013259264] --> OK [~0.20132594E10,TO_ZERO] --> [~2013259392,~2013259392] --> OK [~0.20132595E10,TO_ZERO] --> [~2013259520,~2013259520] --> OK [~0.20132596E10,TO_ZERO] --> [~2013259648,~2013259648] --> OK [~0.20132598E10,TO_ZERO] --> [~2013259776,~2013259776] --> OK [~0.20132599E10,TO_ZERO] --> [~2013259904,~2013259904] --> OK [~0.201326E10,TO_ZERO] --> [~2013260032,~2013260032] --> OK [~0.20132602E10,TO_ZERO] --> [~2013260160,~2013260160] --> OK [~0.20132603E10,TO_ZERO] --> [~2013260288,~2013260288] --> OK [~0.20132604E10,TO_ZERO] --> [~2013260416,~2013260416] --> OK [~0.20132605E10,TO_ZERO] --> [~2013260544,~2013260544] --> OK [~0.20132607E10,TO_ZERO] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_ZERO] --> [~2013260800,~2013260800] --> OK [~0.20132609E10,TO_ZERO] --> [~2013260928,~2013260928] --> OK [~0.2013261E10,TO_ZERO] --> [~2013261056,~2013261056] --> OK [~0.20132612E10,TO_ZERO] --> [~2013261184,~2013261184] --> OK [~0.20132613E10,TO_ZERO] --> [~2013261312,~2013261312] --> OK [~0.20132614E10,TO_ZERO] --> [~2013261440,~2013261440] --> OK [~0.20132616E10,TO_ZERO] --> [~2013261568,~2013261568] --> OK [~0.20132617E10,TO_ZERO] --> [~2013261696,~2013261696] --> OK [~0.20132618E10,TO_ZERO] --> [~2013261824,~2013261824] --> OK [~0.2013262E10,TO_ZERO] --> [~2013261952,~2013261952] --> OK [~0.20132621E10,TO_ZERO] --> [~2013262080,~2013262080] --> OK [~0.20132622E10,TO_ZERO] --> [~2013262208,~2013262208] --> OK [~0.20132623E10,TO_ZERO] --> [~2013262336,~2013262336] --> OK [~0.20132625E10,TO_ZERO] --> [~2013262464,~2013262464] --> OK [~0.20132626E10,TO_ZERO] --> [~2013262592,~2013262592] --> OK [~0.20132627E10,TO_ZERO] --> [~2013262720,~2013262720] --> OK [~0.20132628E10,TO_ZERO] --> [~2013262848,~2013262848] --> OK [~0.2013263E10,TO_ZERO] --> [~2013262976,~2013262976] --> OK [~0.20132631E10,TO_ZERO] --> [~2013263104,~2013263104] --> OK [~0.20132632E10,TO_ZERO] --> [~2013263232,~2013263232] --> OK [~0.20132634E10,TO_ZERO] --> [~2013263360,~2013263360] --> OK [~0.20132635E10,TO_ZERO] --> [~2013263488,~2013263488] --> OK [~0.20132636E10,TO_ZERO] --> [~2013263616,~2013263616] --> OK [~0.20132637E10,TO_ZERO] --> [~2013263744,~2013263744] --> OK [~0.20132639E10,TO_ZERO] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_ZERO] --> [~2013264000,~2013264000] --> OK [~0.20132641E10,TO_ZERO] --> [~2013264128,~2013264128] --> OK [~0.20132643E10,TO_ZERO] --> [~2013264256,~2013264256] --> OK [~0.20132644E10,TO_ZERO] --> [~2013264384,~2013264384] --> OK [~0.20132645E10,TO_ZERO] --> [~2013264512,~2013264512] --> OK [~0.20132646E10,TO_ZERO] --> [~2013264640,~2013264640] --> OK [~0.20132648E10,TO_ZERO] --> [~2013264768,~2013264768] --> OK [~0.20132649E10,TO_ZERO] --> [~2013264896,~2013264896] --> OK [~0.2013265E10,TO_ZERO] --> [~2013265024,~2013265024] --> OK [~0.20132652E10,TO_ZERO] --> [~2013265152,~2013265152] --> OK [~0.20132653E10,TO_ZERO] --> [~2013265280,~2013265280] --> OK [~0.20132654E10,TO_ZERO] --> [~2013265408,~2013265408] --> OK [~0.20132655E10,TO_ZERO] --> [~2013265536,~2013265536] --> OK [~0.20132657E10,TO_ZERO] --> [~2013265664,~2013265664] --> OK [~0.20132658E10,TO_ZERO] --> [~2013265792,~2013265792] --> OK [~0.18790564E10,TO_ZERO] --> [~1879056384,~1879056384] --> OK [~0.18790563E10,TO_ZERO] --> [~1879056256,~1879056256] --> OK [~0.18790561E10,TO_ZERO] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_ZERO] --> [~1879056000,~1879056000] --> OK [~0.18790559E10,TO_ZERO] --> [~1879055872,~1879055872] --> OK [~0.18790557E10,TO_ZERO] --> [~1879055744,~1879055744] --> OK [~0.18790556E10,TO_ZERO] --> [~1879055616,~1879055616] --> OK [~0.18790555E10,TO_ZERO] --> [~1879055488,~1879055488] --> OK [~0.18790554E10,TO_ZERO] --> [~1879055360,~1879055360] --> OK [~0.18790552E10,TO_ZERO] --> [~1879055232,~1879055232] --> OK [~0.18790551E10,TO_ZERO] --> [~1879055104,~1879055104] --> OK [~0.1879055E10,TO_ZERO] --> [~1879054976,~1879054976] --> OK [~0.18790548E10,TO_ZERO] --> [~1879054848,~1879054848] --> OK [~0.18790547E10,TO_ZERO] --> [~1879054720,~1879054720] --> OK [~0.18790546E10,TO_ZERO] --> [~1879054592,~1879054592] --> OK [~0.18790545E10,TO_ZERO] --> [~1879054464,~1879054464] --> OK [~0.18790543E10,TO_ZERO] --> [~1879054336,~1879054336] --> OK [~0.18790542E10,TO_ZERO] --> [~1879054208,~1879054208] --> OK [~0.18790541E10,TO_ZERO] --> [~1879054080,~1879054080] --> OK [~0.1879054E10,TO_ZERO] --> [~1879053952,~1879053952] --> OK [~0.18790538E10,TO_ZERO] --> [~1879053824,~1879053824] --> OK [~0.18790537E10,TO_ZERO] --> [~1879053696,~1879053696] --> OK [~0.18790536E10,TO_ZERO] --> [~1879053568,~1879053568] --> OK [~0.18790534E10,TO_ZERO] --> [~1879053440,~1879053440] --> OK [~0.18790533E10,TO_ZERO] --> [~1879053312,~1879053312] --> OK [~0.18790532E10,TO_ZERO] --> [~1879053184,~1879053184] --> OK [~0.1879053E10,TO_ZERO] --> [~1879053056,~1879053056] --> OK [~0.18790529E10,TO_ZERO] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_ZERO] --> [~1879052800,~1879052800] --> OK [~0.18790527E10,TO_ZERO] --> [~1879052672,~1879052672] --> OK [~0.18790525E10,TO_ZERO] --> [~1879052544,~1879052544] --> OK [~0.18790524E10,TO_ZERO] --> [~1879052416,~1879052416] --> OK [~0.18790523E10,TO_ZERO] --> [~1879052288,~1879052288] --> OK [~0.18790522E10,TO_ZERO] --> [~1879052160,~1879052160] --> OK [~0.1879052E10,TO_ZERO] --> [~1879052032,~1879052032] --> OK [~0.18790519E10,TO_ZERO] --> [~1879051904,~1879051904] --> OK [~0.18790518E10,TO_ZERO] --> [~1879051776,~1879051776] --> OK [~0.18790516E10,TO_ZERO] --> [~1879051648,~1879051648] --> OK [~0.18790515E10,TO_ZERO] --> [~1879051520,~1879051520] --> OK [~0.18790514E10,TO_ZERO] --> [~1879051392,~1879051392] --> OK [~0.18790513E10,TO_ZERO] --> [~1879051264,~1879051264] --> OK [~0.18790511E10,TO_ZERO] --> [~1879051136,~1879051136] --> OK [~0.1879051E10,TO_ZERO] --> [~1879051008,~1879051008] --> OK [~0.18790509E10,TO_ZERO] --> [~1879050880,~1879050880] --> OK [~0.18790508E10,TO_ZERO] --> [~1879050752,~1879050752] --> OK [~0.18790506E10,TO_ZERO] --> [~1879050624,~1879050624] --> OK [~0.18790505E10,TO_ZERO] --> [~1879050496,~1879050496] --> OK [~0.18790504E10,TO_ZERO] --> [~1879050368,~1879050368] --> OK [~0.18790502E10,TO_ZERO] --> [~1879050240,~1879050240] --> OK [~0.18790501E10,TO_ZERO] --> [~1879050112,~1879050112] --> OK [~0.187905E10,TO_ZERO] --> [~1879049984,~1879049984] --> OK [~0.18790499E10,TO_ZERO] --> [~1879049856,~1879049856] --> OK [~0.18790497E10,TO_ZERO] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_ZERO] --> [~1879049600,~1879049600] --> OK [~0.18790495E10,TO_ZERO] --> [~1879049472,~1879049472] --> OK [~0.18790493E10,TO_ZERO] --> [~1879049344,~1879049344] --> OK [~0.18790492E10,TO_ZERO] --> [~1879049216,~1879049216] --> OK [~0.18790491E10,TO_ZERO] --> [~1879049088,~1879049088] --> OK [~0.1879049E10,TO_ZERO] --> [~1879048960,~1879048960] --> OK [~0.18790488E10,TO_ZERO] --> [~1879048832,~1879048832] --> OK [~0.18790487E10,TO_ZERO] --> [~1879048704,~1879048704] --> OK [~0.18790486E10,TO_ZERO] --> [~1879048576,~1879048576] --> OK [~0.18790484E10,TO_ZERO] --> [~1879048448,~1879048448] --> OK [~0.18790483E10,TO_ZERO] --> [~1879048320,~1879048320] --> OK [~0.18790482E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_ZERO] --> [~1879040000,~1879040000] --> OK [~0.18790401E10,TO_ZERO] --> [~1879040128,~1879040128] --> OK [~0.18790403E10,TO_ZERO] --> [~1879040256,~1879040256] --> OK [~0.18790404E10,TO_ZERO] --> [~1879040384,~1879040384] --> OK [~0.18790405E10,TO_ZERO] --> [~1879040512,~1879040512] --> OK [~0.18790406E10,TO_ZERO] --> [~1879040640,~1879040640] --> OK [~0.18790408E10,TO_ZERO] --> [~1879040768,~1879040768] --> OK [~0.18790409E10,TO_ZERO] --> [~1879040896,~1879040896] --> OK [~0.1879041E10,TO_ZERO] --> [~1879041024,~1879041024] --> OK [~0.18790412E10,TO_ZERO] --> [~1879041152,~1879041152] --> OK [~0.18790413E10,TO_ZERO] --> [~1879041280,~1879041280] --> OK [~0.18790414E10,TO_ZERO] --> [~1879041408,~1879041408] --> OK [~0.18790415E10,TO_ZERO] --> [~1879041536,~1879041536] --> OK [~0.18790417E10,TO_ZERO] --> [~1879041664,~1879041664] --> OK [~0.18790418E10,TO_ZERO] --> [~1879041792,~1879041792] --> OK [~0.18790419E10,TO_ZERO] --> [~1879041920,~1879041920] --> OK [~0.1879042E10,TO_ZERO] --> [~1879042048,~1879042048] --> OK [~0.18790422E10,TO_ZERO] --> [~1879042176,~1879042176] --> OK [~0.18790423E10,TO_ZERO] --> [~1879042304,~1879042304] --> OK [~0.18790424E10,TO_ZERO] --> [~1879042432,~1879042432] --> OK [~0.18790426E10,TO_ZERO] --> [~1879042560,~1879042560] --> OK [~0.18790427E10,TO_ZERO] --> [~1879042688,~1879042688] --> OK [~0.18790428E10,TO_ZERO] --> [~1879042816,~1879042816] --> OK [~0.1879043E10,TO_ZERO] --> [~1879042944,~1879042944] --> OK [~0.18790431E10,TO_ZERO] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_ZERO] --> [~1879043200,~1879043200] --> OK [~0.18790433E10,TO_ZERO] --> [~1879043328,~1879043328] --> OK [~0.18790435E10,TO_ZERO] --> [~1879043456,~1879043456] --> OK [~0.18790436E10,TO_ZERO] --> [~1879043584,~1879043584] --> OK [~0.18790437E10,TO_ZERO] --> [~1879043712,~1879043712] --> OK [~0.18790438E10,TO_ZERO] --> [~1879043840,~1879043840] --> OK [~0.1879044E10,TO_ZERO] --> [~1879043968,~1879043968] --> OK [~0.18790441E10,TO_ZERO] --> [~1879044096,~1879044096] --> OK [~0.18790442E10,TO_ZERO] --> [~1879044224,~1879044224] --> OK [~0.18790444E10,TO_ZERO] --> [~1879044352,~1879044352] --> OK [~0.18790445E10,TO_ZERO] --> [~1879044480,~1879044480] --> OK [~0.18790446E10,TO_ZERO] --> [~1879044608,~1879044608] --> OK [~0.18790447E10,TO_ZERO] --> [~1879044736,~1879044736] --> OK [~0.18790449E10,TO_ZERO] --> [~1879044864,~1879044864] --> OK [~0.1879045E10,TO_ZERO] --> [~1879044992,~1879044992] --> OK [~0.18790451E10,TO_ZERO] --> [~1879045120,~1879045120] --> OK [~0.18790452E10,TO_ZERO] --> [~1879045248,~1879045248] --> OK [~0.18790454E10,TO_ZERO] --> [~1879045376,~1879045376] --> OK [~0.18790455E10,TO_ZERO] --> [~1879045504,~1879045504] --> OK [~0.18790456E10,TO_ZERO] --> [~1879045632,~1879045632] --> OK [~0.18790458E10,TO_ZERO] --> [~1879045760,~1879045760] --> OK [~0.18790459E10,TO_ZERO] --> [~1879045888,~1879045888] --> OK [~0.1879046E10,TO_ZERO] --> [~1879046016,~1879046016] --> OK [~0.18790461E10,TO_ZERO] --> [~1879046144,~1879046144] --> OK [~0.18790463E10,TO_ZERO] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_ZERO] --> [~1879046400,~1879046400] --> OK [~0.18790465E10,TO_ZERO] --> [~1879046528,~1879046528] --> OK [~0.18790467E10,TO_ZERO] --> [~1879046656,~1879046656] --> OK [~0.18790468E10,TO_ZERO] --> [~1879046784,~1879046784] --> OK [~0.18790469E10,TO_ZERO] --> [~1879046912,~1879046912] --> OK [~0.1879047E10,TO_ZERO] --> [~1879047040,~1879047040] --> OK [~0.18790472E10,TO_ZERO] --> [~1879047168,~1879047168] --> OK [~0.18790473E10,TO_ZERO] --> [~1879047296,~1879047296] --> OK [~0.18790474E10,TO_ZERO] --> [~1879047424,~1879047424] --> OK [~0.18790476E10,TO_ZERO] --> [~1879047552,~1879047552] --> OK [~0.18790477E10,TO_ZERO] --> [~1879047680,~1879047680] --> OK [~0.18790478E10,TO_ZERO] --> [~1879047808,~1879047808] --> OK [~0.1879048E10,TO_ZERO] --> [~1879047936,~1879047936] --> OK [~0.18790481E10,TO_ZERO] --> [~1879048064,~1879048064] --> OK [~0.16106209E10,TO_ZERO] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_ZERO] --> [~1610620800,~1610620800] --> OK [~0.16106207E10,TO_ZERO] --> [~1610620672,~1610620672] --> OK [~0.16106205E10,TO_ZERO] --> [~1610620544,~1610620544] --> OK [~0.16106204E10,TO_ZERO] --> [~1610620416,~1610620416] --> OK [~0.16106203E10,TO_ZERO] --> [~1610620288,~1610620288] --> OK [~0.16106202E10,TO_ZERO] --> [~1610620160,~1610620160] --> OK [~0.161062E10,TO_ZERO] --> [~1610620032,~1610620032] --> OK [~0.16106199E10,TO_ZERO] --> [~1610619904,~1610619904] --> OK [~0.16106198E10,TO_ZERO] --> [~1610619776,~1610619776] --> OK [~0.16106196E10,TO_ZERO] --> [~1610619648,~1610619648] --> OK [~0.16106195E10,TO_ZERO] --> [~1610619520,~1610619520] --> OK [~0.16106194E10,TO_ZERO] --> [~1610619392,~1610619392] --> OK [~0.16106193E10,TO_ZERO] --> [~1610619264,~1610619264] --> OK [~0.16106191E10,TO_ZERO] --> [~1610619136,~1610619136] --> OK [~0.1610619E10,TO_ZERO] --> [~1610619008,~1610619008] --> OK [~0.16106189E10,TO_ZERO] --> [~1610618880,~1610618880] --> OK [~0.16106188E10,TO_ZERO] --> [~1610618752,~1610618752] --> OK [~0.16106186E10,TO_ZERO] --> [~1610618624,~1610618624] --> OK [~0.16106185E10,TO_ZERO] --> [~1610618496,~1610618496] --> OK [~0.16106184E10,TO_ZERO] --> [~1610618368,~1610618368] --> OK [~0.16106182E10,TO_ZERO] --> [~1610618240,~1610618240] --> OK [~0.16106181E10,TO_ZERO] --> [~1610618112,~1610618112] --> OK [~0.1610618E10,TO_ZERO] --> [~1610617984,~1610617984] --> OK [~0.16106179E10,TO_ZERO] --> [~1610617856,~1610617856] --> OK [~0.16106177E10,TO_ZERO] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_ZERO] --> [~1610617600,~1610617600] --> OK [~0.16106175E10,TO_ZERO] --> [~1610617472,~1610617472] --> OK [~0.16106173E10,TO_ZERO] --> [~1610617344,~1610617344] --> OK [~0.16106172E10,TO_ZERO] --> [~1610617216,~1610617216] --> OK [~0.16106171E10,TO_ZERO] --> [~1610617088,~1610617088] --> OK [~0.1610617E10,TO_ZERO] --> [~1610616960,~1610616960] --> OK [~0.16106168E10,TO_ZERO] --> [~1610616832,~1610616832] --> OK [~0.16106167E10,TO_ZERO] --> [~1610616704,~1610616704] --> OK [~0.16106166E10,TO_ZERO] --> [~1610616576,~1610616576] --> OK [~0.16106164E10,TO_ZERO] --> [~1610616448,~1610616448] --> OK [~0.16106163E10,TO_ZERO] --> [~1610616320,~1610616320] --> OK [~0.16106162E10,TO_ZERO] --> [~1610616192,~1610616192] --> OK [~0.1610616E10,TO_ZERO] --> [~1610616064,~1610616064] --> OK [~0.16106159E10,TO_ZERO] --> [~1610615936,~1610615936] --> OK [~0.16106158E10,TO_ZERO] --> [~1610615808,~1610615808] --> OK [~0.16106157E10,TO_ZERO] --> [~1610615680,~1610615680] --> OK [~0.16106156E10,TO_ZERO] --> [~1610615552,~1610615552] --> OK [~0.16106154E10,TO_ZERO] --> [~1610615424,~1610615424] --> OK [~0.16106153E10,TO_ZERO] --> [~1610615296,~1610615296] --> OK [~0.16106152E10,TO_ZERO] --> [~1610615168,~1610615168] --> OK [~0.1610615E10,TO_ZERO] --> [~1610615040,~1610615040] --> OK [~0.16106149E10,TO_ZERO] --> [~1610614912,~1610614912] --> OK [~0.16106148E10,TO_ZERO] --> [~1610614784,~1610614784] --> OK [~0.16106147E10,TO_ZERO] --> [~1610614656,~1610614656] --> OK [~0.16106145E10,TO_ZERO] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_ZERO] --> [~1610614400,~1610614400] --> OK [~0.16106143E10,TO_ZERO] --> [~1610614272,~1610614272] --> OK [~0.16106141E10,TO_ZERO] --> [~1610614144,~1610614144] --> OK [~0.1610614E10,TO_ZERO] --> [~1610614016,~1610614016] --> OK [~0.16106139E10,TO_ZERO] --> [~1610613888,~1610613888] --> OK [~0.16106138E10,TO_ZERO] --> [~1610613760,~1610613760] --> OK [~0.16106136E10,TO_ZERO] --> [~1610613632,~1610613632] --> OK [~0.16106135E10,TO_ZERO] --> [~1610613504,~1610613504] --> OK [~0.16106134E10,TO_ZERO] --> [~1610613376,~1610613376] --> OK [~0.16106132E10,TO_ZERO] --> [~1610613248,~1610613248] --> OK [~0.16106131E10,TO_ZERO] --> [~1610613120,~1610613120] --> OK [~0.1610613E10,TO_ZERO] --> [~1610612992,~1610612992] --> OK [~0.16106129E10,TO_ZERO] --> [~1610612864,~1610612864] --> OK [~0.16106127E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106045E10,TO_ZERO] --> [~1610604544,~1610604544] --> OK [~0.16106047E10,TO_ZERO] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_ZERO] --> [~1610604800,~1610604800] --> OK [~0.16106049E10,TO_ZERO] --> [~1610604928,~1610604928] --> OK [~0.1610605E10,TO_ZERO] --> [~1610605056,~1610605056] --> OK [~0.16106052E10,TO_ZERO] --> [~1610605184,~1610605184] --> OK [~0.16106053E10,TO_ZERO] --> [~1610605312,~1610605312] --> OK [~0.16106054E10,TO_ZERO] --> [~1610605440,~1610605440] --> OK [~0.16106056E10,TO_ZERO] --> [~1610605568,~1610605568] --> OK [~0.16106057E10,TO_ZERO] --> [~1610605696,~1610605696] --> OK [~0.16106058E10,TO_ZERO] --> [~1610605824,~1610605824] --> OK [~0.1610606E10,TO_ZERO] --> [~1610605952,~1610605952] --> OK [~0.16106061E10,TO_ZERO] --> [~1610606080,~1610606080] --> OK [~0.16106062E10,TO_ZERO] --> [~1610606208,~1610606208] --> OK [~0.16106063E10,TO_ZERO] --> [~1610606336,~1610606336] --> OK [~0.16106065E10,TO_ZERO] --> [~1610606464,~1610606464] --> OK [~0.16106066E10,TO_ZERO] --> [~1610606592,~1610606592] --> OK [~0.16106067E10,TO_ZERO] --> [~1610606720,~1610606720] --> OK [~0.16106068E10,TO_ZERO] --> [~1610606848,~1610606848] --> OK [~0.1610607E10,TO_ZERO] --> [~1610606976,~1610606976] --> OK [~0.16106071E10,TO_ZERO] --> [~1610607104,~1610607104] --> OK [~0.16106072E10,TO_ZERO] --> [~1610607232,~1610607232] --> OK [~0.16106074E10,TO_ZERO] --> [~1610607360,~1610607360] --> OK [~0.16106075E10,TO_ZERO] --> [~1610607488,~1610607488] --> OK [~0.16106076E10,TO_ZERO] --> [~1610607616,~1610607616] --> OK [~0.16106077E10,TO_ZERO] --> [~1610607744,~1610607744] --> OK [~0.16106079E10,TO_ZERO] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_ZERO] --> [~1610608000,~1610608000] --> OK [~0.16106081E10,TO_ZERO] --> [~1610608128,~1610608128] --> OK [~0.16106083E10,TO_ZERO] --> [~1610608256,~1610608256] --> OK [~0.16106084E10,TO_ZERO] --> [~1610608384,~1610608384] --> OK [~0.16106085E10,TO_ZERO] --> [~1610608512,~1610608512] --> OK [~0.16106086E10,TO_ZERO] --> [~1610608640,~1610608640] --> OK [~0.16106088E10,TO_ZERO] --> [~1610608768,~1610608768] --> OK [~0.16106089E10,TO_ZERO] --> [~1610608896,~1610608896] --> OK [~0.1610609E10,TO_ZERO] --> [~1610609024,~1610609024] --> OK [~0.16106092E10,TO_ZERO] --> [~1610609152,~1610609152] --> OK [~0.16106093E10,TO_ZERO] --> [~1610609280,~1610609280] --> OK [~0.16106094E10,TO_ZERO] --> [~1610609408,~1610609408] --> OK [~0.16106095E10,TO_ZERO] --> [~1610609536,~1610609536] --> OK [~0.16106097E10,TO_ZERO] --> [~1610609664,~1610609664] --> OK [~0.16106098E10,TO_ZERO] --> [~1610609792,~1610609792] --> OK [~0.16106099E10,TO_ZERO] --> [~1610609920,~1610609920] --> OK [~0.161061E10,TO_ZERO] --> [~1610610048,~1610610048] --> OK [~0.16106102E10,TO_ZERO] --> [~1610610176,~1610610176] --> OK [~0.16106103E10,TO_ZERO] --> [~1610610304,~1610610304] --> OK [~0.16106104E10,TO_ZERO] --> [~1610610432,~1610610432] --> OK [~0.16106106E10,TO_ZERO] --> [~1610610560,~1610610560] --> OK [~0.16106107E10,TO_ZERO] --> [~1610610688,~1610610688] --> OK [~0.16106108E10,TO_ZERO] --> [~1610610816,~1610610816] --> OK [~0.1610611E10,TO_ZERO] --> [~1610610944,~1610610944] --> OK [~0.16106111E10,TO_ZERO] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_ZERO] --> [~1610611200,~1610611200] --> OK [~0.16106113E10,TO_ZERO] --> [~1610611328,~1610611328] --> OK [~0.16106115E10,TO_ZERO] --> [~1610611456,~1610611456] --> OK [~0.16106116E10,TO_ZERO] --> [~1610611584,~1610611584] --> OK [~0.16106117E10,TO_ZERO] --> [~1610611712,~1610611712] --> OK [~0.16106118E10,TO_ZERO] --> [~1610611840,~1610611840] --> OK [~0.1610612E10,TO_ZERO] --> [~1610611968,~1610611968] --> OK [~0.16106121E10,TO_ZERO] --> [~1610612096,~1610612096] --> OK [~0.16106122E10,TO_ZERO] --> [~1610612224,~1610612224] --> OK [~0.16106124E10,TO_ZERO] --> [~1610612352,~1610612352] --> OK [~0.16106125E10,TO_ZERO] --> [~1610612480,~1610612480] --> OK [~0.16106126E10,TO_ZERO] --> [~1610612608,~1610612608] --> OK [~0.107375E10,TO_ZERO] --> [~1073750016,~1073750016] --> OK [~0.10737499E10,TO_ZERO] --> [~1073749888,~1073749888] --> OK [~0.10737498E10,TO_ZERO] --> [~1073749760,~1073749760] --> OK [~0.10737496E10,TO_ZERO] --> [~1073749632,~1073749632] --> OK [~0.10737495E10,TO_ZERO] --> [~1073749504,~1073749504] --> OK [~0.10737494E10,TO_ZERO] --> [~1073749376,~1073749376] --> OK [~0.10737492E10,TO_ZERO] --> [~1073749248,~1073749248] --> OK [~0.10737491E10,TO_ZERO] --> [~1073749120,~1073749120] --> OK [~0.1073749E10,TO_ZERO] --> [~1073748992,~1073748992] --> OK [~0.10737489E10,TO_ZERO] --> [~1073748864,~1073748864] --> OK [~0.10737487E10,TO_ZERO] --> [~1073748736,~1073748736] --> OK [~0.10737486E10,TO_ZERO] --> [~1073748608,~1073748608] --> OK [~0.10737485E10,TO_ZERO] --> [~1073748480,~1073748480] --> OK [~0.10737484E10,TO_ZERO] --> [~1073748352,~1073748352] --> OK [~0.10737482E10,TO_ZERO] --> [~1073748224,~1073748224] --> OK [~0.10737481E10,TO_ZERO] --> [~1073748096,~1073748096] --> OK [~0.1073748E10,TO_ZERO] --> [~1073747968,~1073747968] --> OK [~0.10737478E10,TO_ZERO] --> [~1073747840,~1073747840] --> OK [~0.10737477E10,TO_ZERO] --> [~1073747712,~1073747712] --> OK [~0.10737476E10,TO_ZERO] --> [~1073747584,~1073747584] --> OK [~0.10737475E10,TO_ZERO] --> [~1073747456,~1073747456] --> OK [~0.10737473E10,TO_ZERO] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_ZERO] --> [~1073747200,~1073747200] --> OK [~0.10737471E10,TO_ZERO] --> [~1073747072,~1073747072] --> OK [~0.1073747E10,TO_ZERO] --> [~1073746944,~1073746944] --> OK [~0.10737468E10,TO_ZERO] --> [~1073746816,~1073746816] --> OK [~0.10737467E10,TO_ZERO] --> [~1073746688,~1073746688] --> OK [~0.10737466E10,TO_ZERO] --> [~1073746560,~1073746560] --> OK [~0.10737464E10,TO_ZERO] --> [~1073746432,~1073746432] --> OK [~0.10737463E10,TO_ZERO] --> [~1073746304,~1073746304] --> OK [~0.10737462E10,TO_ZERO] --> [~1073746176,~1073746176] --> OK [~0.1073746E10,TO_ZERO] --> [~1073746048,~1073746048] --> OK [~0.10737459E10,TO_ZERO] --> [~1073745920,~1073745920] --> OK [~0.10737458E10,TO_ZERO] --> [~1073745792,~1073745792] --> OK [~0.10737457E10,TO_ZERO] --> [~1073745664,~1073745664] --> OK [~0.10737455E10,TO_ZERO] --> [~1073745536,~1073745536] --> OK [~0.10737454E10,TO_ZERO] --> [~1073745408,~1073745408] --> OK [~0.10737453E10,TO_ZERO] --> [~1073745280,~1073745280] --> OK [~0.10737452E10,TO_ZERO] --> [~1073745152,~1073745152] --> OK [~0.1073745E10,TO_ZERO] --> [~1073745024,~1073745024] --> OK [~0.10737449E10,TO_ZERO] --> [~1073744896,~1073744896] --> OK [~0.10737448E10,TO_ZERO] --> [~1073744768,~1073744768] --> OK [~0.10737446E10,TO_ZERO] --> [~1073744640,~1073744640] --> OK [~0.10737445E10,TO_ZERO] --> [~1073744512,~1073744512] --> OK [~0.10737444E10,TO_ZERO] --> [~1073744384,~1073744384] --> OK [~0.10737443E10,TO_ZERO] --> [~1073744256,~1073744256] --> OK [~0.10737441E10,TO_ZERO] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_ZERO] --> [~1073744000,~1073744000] --> OK [~0.10737439E10,TO_ZERO] --> [~1073743872,~1073743872] --> OK [~0.10737437E10,TO_ZERO] --> [~1073743744,~1073743744] --> OK [~0.10737436E10,TO_ZERO] --> [~1073743616,~1073743616] --> OK [~0.10737435E10,TO_ZERO] --> [~1073743488,~1073743488] --> OK [~0.10737434E10,TO_ZERO] --> [~1073743360,~1073743360] --> OK [~0.10737432E10,TO_ZERO] --> [~1073743232,~1073743232] --> OK [~0.10737431E10,TO_ZERO] --> [~1073743104,~1073743104] --> OK [~0.1073743E10,TO_ZERO] --> [~1073742976,~1073742976] --> OK [~0.10737428E10,TO_ZERO] --> [~1073742848,~1073742848] --> OK [~0.10737427E10,TO_ZERO] --> [~1073742720,~1073742720] --> OK [~0.10737426E10,TO_ZERO] --> [~1073742592,~1073742592] --> OK [~0.10737425E10,TO_ZERO] --> [~1073742464,~1073742464] --> OK [~0.10737423E10,TO_ZERO] --> [~1073742336,~1073742336] --> OK [~0.10737422E10,TO_ZERO] --> [~1073742208,~1073742208] --> OK [~0.10737421E10,TO_ZERO] --> [~1073742080,~1073742080] --> OK [~0.1073742E10,TO_ZERO] --> [~1073741952,~1073741952] --> OK [~0.10737418E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737377E10,TO_ZERO] --> [~1073737728,~1073737728] --> OK [~0.10737378E10,TO_ZERO] --> [~1073737792,~1073737792] --> OK [~0.107373786E10,TO_ZERO] --> [~1073737856,~1073737856] --> OK [~0.10737379E10,TO_ZERO] --> [~1073737920,~1073737920] --> OK [~0.1073738E10,TO_ZERO] --> [~1073737984,~1073737984] --> OK [~0.107373805E10,TO_ZERO] --> [~1073738048,~1073738048] --> OK [~0.10737381E10,TO_ZERO] --> [~1073738112,~1073738112] --> OK [~0.10737382E10,TO_ZERO] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_ZERO] --> [~1073738240,~1073738240] --> OK [~0.10737383E10,TO_ZERO] --> [~1073738304,~1073738304] --> OK [~0.10737384E10,TO_ZERO] --> [~1073738368,~1073738368] --> OK [~0.107373843E10,TO_ZERO] --> [~1073738432,~1073738432] --> OK [~0.10737385E10,TO_ZERO] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_ZERO] --> [~1073738560,~1073738560] --> OK [~0.10737386E10,TO_ZERO] --> [~1073738624,~1073738624] --> OK [~0.10737387E10,TO_ZERO] --> [~1073738688,~1073738688] --> OK [~0.107373875E10,TO_ZERO] --> [~1073738752,~1073738752] --> OK [~0.10737388E10,TO_ZERO] --> [~1073738816,~1073738816] --> OK [~0.10737389E10,TO_ZERO] --> [~1073738880,~1073738880] --> OK [~0.107373894E10,TO_ZERO] --> [~1073738944,~1073738944] --> OK [~0.1073739E10,TO_ZERO] --> [~1073739008,~1073739008] --> OK [~0.10737391E10,TO_ZERO] --> [~1073739072,~1073739072] --> OK [~0.107373914E10,TO_ZERO] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_ZERO] --> [~1073739200,~1073739200] --> OK [~0.107373926E10,TO_ZERO] --> [~1073739264,~1073739264] --> OK [~0.10737393E10,TO_ZERO] --> [~1073739328,~1073739328] --> OK [~0.10737394E10,TO_ZERO] --> [~1073739392,~1073739392] --> OK [~0.107373946E10,TO_ZERO] --> [~1073739456,~1073739456] --> OK [~0.10737395E10,TO_ZERO] --> [~1073739520,~1073739520] --> OK [~0.10737396E10,TO_ZERO] --> [~1073739584,~1073739584] --> OK [~0.107373965E10,TO_ZERO] --> [~1073739648,~1073739648] --> OK [~0.10737397E10,TO_ZERO] --> [~1073739712,~1073739712] --> OK [~0.10737398E10,TO_ZERO] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_ZERO] --> [~1073739840,~1073739840] --> OK [~0.10737399E10,TO_ZERO] --> [~1073739904,~1073739904] --> OK [~0.107373997E10,TO_ZERO] --> [~1073739968,~1073739968] --> OK [~0.107374E10,TO_ZERO] --> [~1073740032,~1073740032] --> OK [~0.10737401E10,TO_ZERO] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_ZERO] --> [~1073740160,~1073740160] --> OK [~0.10737402E10,TO_ZERO] --> [~1073740224,~1073740224] --> OK [~0.10737403E10,TO_ZERO] --> [~1073740288,~1073740288] --> OK [~0.107374035E10,TO_ZERO] --> [~1073740352,~1073740352] --> OK [~0.10737404E10,TO_ZERO] --> [~1073740416,~1073740416] --> OK [~0.10737405E10,TO_ZERO] --> [~1073740480,~1073740480] --> OK [~0.107374054E10,TO_ZERO] --> [~1073740544,~1073740544] --> OK [~0.10737406E10,TO_ZERO] --> [~1073740608,~1073740608] --> OK [~0.10737407E10,TO_ZERO] --> [~1073740672,~1073740672] --> OK [~0.107374074E10,TO_ZERO] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_ZERO] --> [~1073740800,~1073740800] --> OK [~0.107374086E10,TO_ZERO] --> [~1073740864,~1073740864] --> OK [~0.10737409E10,TO_ZERO] --> [~1073740928,~1073740928] --> OK [~0.1073741E10,TO_ZERO] --> [~1073740992,~1073740992] --> OK [~0.107374106E10,TO_ZERO] --> [~1073741056,~1073741056] --> OK [~0.10737411E10,TO_ZERO] --> [~1073741120,~1073741120] --> OK [~0.10737412E10,TO_ZERO] --> [~1073741184,~1073741184] --> OK [~0.107374125E10,TO_ZERO] --> [~1073741248,~1073741248] --> OK [~0.10737413E10,TO_ZERO] --> [~1073741312,~1073741312] --> OK [~0.10737414E10,TO_ZERO] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_ZERO] --> [~1073741440,~1073741440] --> OK [~0.10737415E10,TO_ZERO] --> [~1073741504,~1073741504] --> OK [~0.10737416E10,TO_ZERO] --> [~1073741568,~1073741568] --> OK [~0.107374163E10,TO_ZERO] --> [~1073741632,~1073741632] --> OK [~0.10737417E10,TO_ZERO] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_ZERO] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000015E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000148E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000145E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000143E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000138E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000136E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000134E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000129E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000126E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000124E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000122E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000117E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000114E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000112E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000011E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000107E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000105E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000103E1,TO_ZERO] --> [~3,~3] --> OK [~0.300001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000098E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000095E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000093E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000009E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000088E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000086E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000083E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000008E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000079E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000076E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000074E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000072E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000067E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000064E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000062E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000006E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000057E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000055E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000052E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000048E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000045E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000043E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000038E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000036E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000033E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000003E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000029E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000026E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000024E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000021E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000017E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.3E1,TO_ZERO] --> [~3,~3] --> OK [~0.29999847E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999985E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999852E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999855E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999857E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999862E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999864E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999866E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999871E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999874E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999876E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999878E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999883E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999886E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999888E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999989E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999893E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999895E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999897E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999902E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999905E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999907E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999991E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999912E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999914E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999917E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999992E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999921E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999924E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999926E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999928E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999933E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999936E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999938E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999994E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999943E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999945E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999948E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999952E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999955E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999957E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999962E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999964E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999967E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999997E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999971E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999974E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999976E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999979E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999983E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000153E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000015E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000148E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000145E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000143E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000138E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000136E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000134E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000129E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000126E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000124E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000122E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000117E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000114E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000112E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000011E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000107E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000105E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000103E1,TO_ZERO] --> [~2,~2] --> OK [~0.200001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000098E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000095E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000093E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000009E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000088E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000086E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000083E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000008E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000079E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000076E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000074E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000072E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000067E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000064E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000062E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000006E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000057E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000055E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000052E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000048E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000045E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000043E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000038E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000036E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000033E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000003E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000029E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000026E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000024E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000021E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000017E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.2E1,TO_ZERO] --> [~2,~2] --> OK [~0.19999924E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999925E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999926E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999927E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999928E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999931E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999932E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999933E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999934E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999936E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999937E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999938E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999939E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999942E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999943E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999944E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999945E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999946E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999948E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999949E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999951E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999952E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999954E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999955E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999956E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999957E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999958E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999961E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999962E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999963E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999964E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999965E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999967E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999968E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999969E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999997E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999971E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999973E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999974E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999975E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999976E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999977E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999979E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999981E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999982E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999983E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999985E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999986E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999988E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999989E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999992E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000076E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000075E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000074E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000073E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000072E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000069E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000068E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000067E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000066E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000064E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000063E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000062E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000061E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000058E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000057E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000056E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000055E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000054E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000052E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000051E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000049E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000048E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000046E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000045E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000044E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000043E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000042E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000039E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000038E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000037E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000036E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000035E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000033E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000032E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000031E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000003E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000029E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000027E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000026E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000025E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000024E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000023E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000021E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000019E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000018E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000017E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000015E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000014E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000012E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000011E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000008E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.1E1,TO_ZERO] --> [~1,~1] --> OK [~0.9999962,TO_ZERO] --> [0,0] --> OK [~0.99999624,TO_ZERO] --> [0,0] --> OK [~0.9999963,TO_ZERO] --> [0,0] --> OK [~0.99999636,TO_ZERO] --> [0,0] --> OK [~0.9999964,TO_ZERO] --> [0,0] --> OK [~0.9999965,TO_ZERO] --> [0,0] --> OK [~0.99999654,TO_ZERO] --> [0,0] --> OK [~0.9999966,TO_ZERO] --> [0,0] --> OK [~0.99999666,TO_ZERO] --> [0,0] --> OK [~0.9999967,TO_ZERO] --> [0,0] --> OK [~0.9999968,TO_ZERO] --> [0,0] --> OK [~0.99999684,TO_ZERO] --> [0,0] --> OK [~0.9999969,TO_ZERO] --> [0,0] --> OK [~0.99999696,TO_ZERO] --> [0,0] --> OK [~0.999997,TO_ZERO] --> [0,0] --> OK [~0.9999971,TO_ZERO] --> [0,0] --> OK [~0.99999714,TO_ZERO] --> [0,0] --> OK [~0.9999972,TO_ZERO] --> [0,0] --> OK [~0.99999726,TO_ZERO] --> [0,0] --> OK [~0.9999973,TO_ZERO] --> [0,0] --> OK [~0.9999974,TO_ZERO] --> [0,0] --> OK [~0.99999744,TO_ZERO] --> [0,0] --> OK [~0.9999975,TO_ZERO] --> [0,0] --> OK [~0.99999756,TO_ZERO] --> [0,0] --> OK [~0.9999976,TO_ZERO] --> [0,0] --> OK [~0.9999977,TO_ZERO] --> [0,0] --> OK [~0.99999774,TO_ZERO] --> [0,0] --> OK [~0.9999978,TO_ZERO] --> [0,0] --> OK [~0.99999785,TO_ZERO] --> [0,0] --> OK [~0.9999979,TO_ZERO] --> [0,0] --> OK [~0.999998,TO_ZERO] --> [0,0] --> OK [~0.99999803,TO_ZERO] --> [0,0] --> OK [~0.9999981,TO_ZERO] --> [0,0] --> OK [~0.99999815,TO_ZERO] --> [0,0] --> OK [~0.9999982,TO_ZERO] --> [0,0] --> OK [~0.9999983,TO_ZERO] --> [0,0] --> OK [~0.99999833,TO_ZERO] --> [0,0] --> OK [~0.9999984,TO_ZERO] --> [0,0] --> OK [~0.99999845,TO_ZERO] --> [0,0] --> OK [~0.9999985,TO_ZERO] --> [0,0] --> OK [~0.99999857,TO_ZERO] --> [0,0] --> OK [~0.9999986,TO_ZERO] --> [0,0] --> OK [~0.9999987,TO_ZERO] --> [0,0] --> OK [~0.99999875,TO_ZERO] --> [0,0] --> OK [~0.9999988,TO_ZERO] --> [0,0] --> OK [~0.99999887,TO_ZERO] --> [0,0] --> OK [~0.9999989,TO_ZERO] --> [0,0] --> OK [~0.999999,TO_ZERO] --> [0,0] --> OK [~0.99999905,TO_ZERO] --> [0,0] --> OK [~0.9999991,TO_ZERO] --> [0,0] --> OK [~0.99999917,TO_ZERO] --> [0,0] --> OK [~0.9999992,TO_ZERO] --> [0,0] --> OK [~0.9999993,TO_ZERO] --> [0,0] --> OK [~0.99999934,TO_ZERO] --> [0,0] --> OK [~0.9999994,TO_ZERO] --> [0,0] --> OK [~0.99999946,TO_ZERO] --> [0,0] --> OK [~0.9999995,TO_ZERO] --> [0,0] --> OK [~0.9999996,TO_ZERO] --> [0,0] --> OK [~0.99999964,TO_ZERO] --> [0,0] --> OK [~0.9999997,TO_ZERO] --> [0,0] --> OK [~0.99999976,TO_ZERO] --> [0,0] --> OK [~0.9999998,TO_ZERO] --> [0,0] --> OK [~0.9999999,TO_ZERO] --> [0,0] --> OK [~0.99999994,TO_ZERO] --> [0,0] --> OK [~0.9E~43,TO_ZERO] --> [0,0] --> OK [~0.88E~43,TO_ZERO] --> [0,0] --> OK [~0.87E~43,TO_ZERO] --> [0,0] --> OK [~0.85E~43,TO_ZERO] --> [0,0] --> OK [~0.84E~43,TO_ZERO] --> [0,0] --> OK [~0.83E~43,TO_ZERO] --> [0,0] --> OK [~0.81E~43,TO_ZERO] --> [0,0] --> OK [~0.8E~43,TO_ZERO] --> [0,0] --> OK [~0.78E~43,TO_ZERO] --> [0,0] --> OK [~0.77E~43,TO_ZERO] --> [0,0] --> OK [~0.76E~43,TO_ZERO] --> [0,0] --> OK [~0.74E~43,TO_ZERO] --> [0,0] --> OK [~0.73E~43,TO_ZERO] --> [0,0] --> OK [~0.71E~43,TO_ZERO] --> [0,0] --> OK [~0.7E~43,TO_ZERO] --> [0,0] --> OK [~0.69E~43,TO_ZERO] --> [0,0] --> OK [~0.67E~43,TO_ZERO] --> [0,0] --> OK [~0.66E~43,TO_ZERO] --> [0,0] --> OK [~0.64E~43,TO_ZERO] --> [0,0] --> OK [~0.63E~43,TO_ZERO] --> [0,0] --> OK [~0.62E~43,TO_ZERO] --> [0,0] --> OK [~0.6E~43,TO_ZERO] --> [0,0] --> OK [~0.59E~43,TO_ZERO] --> [0,0] --> OK [~0.57E~43,TO_ZERO] --> [0,0] --> OK [~0.56E~43,TO_ZERO] --> [0,0] --> OK [~0.55E~43,TO_ZERO] --> [0,0] --> OK [~0.53E~43,TO_ZERO] --> [0,0] --> OK [~0.52E~43,TO_ZERO] --> [0,0] --> OK [~0.5E~43,TO_ZERO] --> [0,0] --> OK [~0.49E~43,TO_ZERO] --> [0,0] --> OK [~0.48E~43,TO_ZERO] --> [0,0] --> OK [~0.46E~43,TO_ZERO] --> [0,0] --> OK [~0.45E~43,TO_ZERO] --> [0,0] --> OK [~0.43E~43,TO_ZERO] --> [0,0] --> OK [~0.42E~43,TO_ZERO] --> [0,0] --> OK [~0.4E~43,TO_ZERO] --> [0,0] --> OK [~0.39E~43,TO_ZERO] --> [0,0] --> OK [~0.38E~43,TO_ZERO] --> [0,0] --> OK [~0.36E~43,TO_ZERO] --> [0,0] --> OK [~0.35E~43,TO_ZERO] --> [0,0] --> OK [~0.34E~43,TO_ZERO] --> [0,0] --> OK [~0.32E~43,TO_ZERO] --> [0,0] --> OK [~0.31E~43,TO_ZERO] --> [0,0] --> OK [~0.3E~43,TO_ZERO] --> [0,0] --> OK [~0.28E~43,TO_ZERO] --> [0,0] --> OK [~0.27E~43,TO_ZERO] --> [0,0] --> OK [~0.25E~43,TO_ZERO] --> [0,0] --> OK [~0.24E~43,TO_ZERO] --> [0,0] --> OK [~0.22E~43,TO_ZERO] --> [0,0] --> OK [~0.21E~43,TO_ZERO] --> [0,0] --> OK [~0.2E~43,TO_ZERO] --> [0,0] --> OK [~0.18E~43,TO_ZERO] --> [0,0] --> OK [~0.17E~43,TO_ZERO] --> [0,0] --> OK [~0.15E~43,TO_ZERO] --> [0,0] --> OK [~0.14E~43,TO_ZERO] --> [0,0] --> OK [~0.13E~43,TO_ZERO] --> [0,0] --> OK [~0.11E~43,TO_ZERO] --> [0,0] --> OK [~0.1E~43,TO_ZERO] --> [0,0] --> OK [~0.8E~44,TO_ZERO] --> [0,0] --> OK [~0.7E~44,TO_ZERO] --> [0,0] --> OK [~0.6E~44,TO_ZERO] --> [0,0] --> OK [~0.4E~44,TO_ZERO] --> [0,0] --> OK [~0.3E~44,TO_ZERO] --> [0,0] --> OK [~0.1E~44,TO_ZERO] --> [0,0] --> OK [0.0,TO_ZERO] --> [0,0] --> OK [0.9E~43,TO_ZERO] --> [0,0] --> OK [0.88E~43,TO_ZERO] --> [0,0] --> OK [0.87E~43,TO_ZERO] --> [0,0] --> OK [0.85E~43,TO_ZERO] --> [0,0] --> OK [0.84E~43,TO_ZERO] --> [0,0] --> OK [0.83E~43,TO_ZERO] --> [0,0] --> OK [0.81E~43,TO_ZERO] --> [0,0] --> OK [0.8E~43,TO_ZERO] --> [0,0] --> OK [0.78E~43,TO_ZERO] --> [0,0] --> OK [0.77E~43,TO_ZERO] --> [0,0] --> OK [0.76E~43,TO_ZERO] --> [0,0] --> OK [0.74E~43,TO_ZERO] --> [0,0] --> OK [0.73E~43,TO_ZERO] --> [0,0] --> OK [0.71E~43,TO_ZERO] --> [0,0] --> OK [0.7E~43,TO_ZERO] --> [0,0] --> OK [0.69E~43,TO_ZERO] --> [0,0] --> OK [0.67E~43,TO_ZERO] --> [0,0] --> OK [0.66E~43,TO_ZERO] --> [0,0] --> OK [0.64E~43,TO_ZERO] --> [0,0] --> OK [0.63E~43,TO_ZERO] --> [0,0] --> OK [0.62E~43,TO_ZERO] --> [0,0] --> OK [0.6E~43,TO_ZERO] --> [0,0] --> OK [0.59E~43,TO_ZERO] --> [0,0] --> OK [0.57E~43,TO_ZERO] --> [0,0] --> OK [0.56E~43,TO_ZERO] --> [0,0] --> OK [0.55E~43,TO_ZERO] --> [0,0] --> OK [0.53E~43,TO_ZERO] --> [0,0] --> OK [0.52E~43,TO_ZERO] --> [0,0] --> OK [0.5E~43,TO_ZERO] --> [0,0] --> OK [0.49E~43,TO_ZERO] --> [0,0] --> OK [0.48E~43,TO_ZERO] --> [0,0] --> OK [0.46E~43,TO_ZERO] --> [0,0] --> OK [0.45E~43,TO_ZERO] --> [0,0] --> OK [0.43E~43,TO_ZERO] --> [0,0] --> OK [0.42E~43,TO_ZERO] --> [0,0] --> OK [0.4E~43,TO_ZERO] --> [0,0] --> OK [0.39E~43,TO_ZERO] --> [0,0] --> OK [0.38E~43,TO_ZERO] --> [0,0] --> OK [0.36E~43,TO_ZERO] --> [0,0] --> OK [0.35E~43,TO_ZERO] --> [0,0] --> OK [0.34E~43,TO_ZERO] --> [0,0] --> OK [0.32E~43,TO_ZERO] --> [0,0] --> OK [0.31E~43,TO_ZERO] --> [0,0] --> OK [0.3E~43,TO_ZERO] --> [0,0] --> OK [0.28E~43,TO_ZERO] --> [0,0] --> OK [0.27E~43,TO_ZERO] --> [0,0] --> OK [0.25E~43,TO_ZERO] --> [0,0] --> OK [0.24E~43,TO_ZERO] --> [0,0] --> OK [0.22E~43,TO_ZERO] --> [0,0] --> OK [0.21E~43,TO_ZERO] --> [0,0] --> OK [0.2E~43,TO_ZERO] --> [0,0] --> OK [0.18E~43,TO_ZERO] --> [0,0] --> OK [0.17E~43,TO_ZERO] --> [0,0] --> OK [0.15E~43,TO_ZERO] --> [0,0] --> OK [0.14E~43,TO_ZERO] --> [0,0] --> OK [0.13E~43,TO_ZERO] --> [0,0] --> OK [0.11E~43,TO_ZERO] --> [0,0] --> OK [0.1E~43,TO_ZERO] --> [0,0] --> OK [0.8E~44,TO_ZERO] --> [0,0] --> OK [0.7E~44,TO_ZERO] --> [0,0] --> OK [0.6E~44,TO_ZERO] --> [0,0] --> OK [0.4E~44,TO_ZERO] --> [0,0] --> OK [0.3E~44,TO_ZERO] --> [0,0] --> OK [0.1E~44,TO_ZERO] --> [0,0] --> OK [0.9999962,TO_ZERO] --> [0,0] --> OK [0.99999624,TO_ZERO] --> [0,0] --> OK [0.9999963,TO_ZERO] --> [0,0] --> OK [0.99999636,TO_ZERO] --> [0,0] --> OK [0.9999964,TO_ZERO] --> [0,0] --> OK [0.9999965,TO_ZERO] --> [0,0] --> OK [0.99999654,TO_ZERO] --> [0,0] --> OK [0.9999966,TO_ZERO] --> [0,0] --> OK [0.99999666,TO_ZERO] --> [0,0] --> OK [0.9999967,TO_ZERO] --> [0,0] --> OK [0.9999968,TO_ZERO] --> [0,0] --> OK [0.99999684,TO_ZERO] --> [0,0] --> OK [0.9999969,TO_ZERO] --> [0,0] --> OK [0.99999696,TO_ZERO] --> [0,0] --> OK [0.999997,TO_ZERO] --> [0,0] --> OK [0.9999971,TO_ZERO] --> [0,0] --> OK [0.99999714,TO_ZERO] --> [0,0] --> OK [0.9999972,TO_ZERO] --> [0,0] --> OK [0.99999726,TO_ZERO] --> [0,0] --> OK [0.9999973,TO_ZERO] --> [0,0] --> OK [0.9999974,TO_ZERO] --> [0,0] --> OK [0.99999744,TO_ZERO] --> [0,0] --> OK [0.9999975,TO_ZERO] --> [0,0] --> OK [0.99999756,TO_ZERO] --> [0,0] --> OK [0.9999976,TO_ZERO] --> [0,0] --> OK [0.9999977,TO_ZERO] --> [0,0] --> OK [0.99999774,TO_ZERO] --> [0,0] --> OK [0.9999978,TO_ZERO] --> [0,0] --> OK [0.99999785,TO_ZERO] --> [0,0] --> OK [0.9999979,TO_ZERO] --> [0,0] --> OK [0.999998,TO_ZERO] --> [0,0] --> OK [0.99999803,TO_ZERO] --> [0,0] --> OK [0.9999981,TO_ZERO] --> [0,0] --> OK [0.99999815,TO_ZERO] --> [0,0] --> OK [0.9999982,TO_ZERO] --> [0,0] --> OK [0.9999983,TO_ZERO] --> [0,0] --> OK [0.99999833,TO_ZERO] --> [0,0] --> OK [0.9999984,TO_ZERO] --> [0,0] --> OK [0.99999845,TO_ZERO] --> [0,0] --> OK [0.9999985,TO_ZERO] --> [0,0] --> OK [0.99999857,TO_ZERO] --> [0,0] --> OK [0.9999986,TO_ZERO] --> [0,0] --> OK [0.9999987,TO_ZERO] --> [0,0] --> OK [0.99999875,TO_ZERO] --> [0,0] --> OK [0.9999988,TO_ZERO] --> [0,0] --> OK [0.99999887,TO_ZERO] --> [0,0] --> OK [0.9999989,TO_ZERO] --> [0,0] --> OK [0.999999,TO_ZERO] --> [0,0] --> OK [0.99999905,TO_ZERO] --> [0,0] --> OK [0.9999991,TO_ZERO] --> [0,0] --> OK [0.99999917,TO_ZERO] --> [0,0] --> OK [0.9999992,TO_ZERO] --> [0,0] --> OK [0.9999993,TO_ZERO] --> [0,0] --> OK [0.99999934,TO_ZERO] --> [0,0] --> OK [0.9999994,TO_ZERO] --> [0,0] --> OK [0.99999946,TO_ZERO] --> [0,0] --> OK [0.9999995,TO_ZERO] --> [0,0] --> OK [0.9999996,TO_ZERO] --> [0,0] --> OK [0.99999964,TO_ZERO] --> [0,0] --> OK [0.9999997,TO_ZERO] --> [0,0] --> OK [0.99999976,TO_ZERO] --> [0,0] --> OK [0.9999998,TO_ZERO] --> [0,0] --> OK [0.9999999,TO_ZERO] --> [0,0] --> OK [0.99999994,TO_ZERO] --> [0,0] --> OK [0.1E1,TO_ZERO] --> [1,1] --> OK [0.10000076E1,TO_ZERO] --> [1,1] --> OK [0.10000075E1,TO_ZERO] --> [1,1] --> OK [0.10000074E1,TO_ZERO] --> [1,1] --> OK [0.10000073E1,TO_ZERO] --> [1,1] --> OK [0.10000072E1,TO_ZERO] --> [1,1] --> OK [0.1000007E1,TO_ZERO] --> [1,1] --> OK [0.10000069E1,TO_ZERO] --> [1,1] --> OK [0.10000068E1,TO_ZERO] --> [1,1] --> OK [0.10000067E1,TO_ZERO] --> [1,1] --> OK [0.10000066E1,TO_ZERO] --> [1,1] --> OK [0.10000064E1,TO_ZERO] --> [1,1] --> OK [0.10000063E1,TO_ZERO] --> [1,1] --> OK [0.10000062E1,TO_ZERO] --> [1,1] --> OK [0.10000061E1,TO_ZERO] --> [1,1] --> OK [0.1000006E1,TO_ZERO] --> [1,1] --> OK [0.10000058E1,TO_ZERO] --> [1,1] --> OK [0.10000057E1,TO_ZERO] --> [1,1] --> OK [0.10000056E1,TO_ZERO] --> [1,1] --> OK [0.10000055E1,TO_ZERO] --> [1,1] --> OK [0.10000054E1,TO_ZERO] --> [1,1] --> OK [0.10000052E1,TO_ZERO] --> [1,1] --> OK [0.10000051E1,TO_ZERO] --> [1,1] --> OK [0.1000005E1,TO_ZERO] --> [1,1] --> OK [0.10000049E1,TO_ZERO] --> [1,1] --> OK [0.10000048E1,TO_ZERO] --> [1,1] --> OK [0.10000046E1,TO_ZERO] --> [1,1] --> OK [0.10000045E1,TO_ZERO] --> [1,1] --> OK [0.10000044E1,TO_ZERO] --> [1,1] --> OK [0.10000043E1,TO_ZERO] --> [1,1] --> OK [0.10000042E1,TO_ZERO] --> [1,1] --> OK [0.1000004E1,TO_ZERO] --> [1,1] --> OK [0.10000039E1,TO_ZERO] --> [1,1] --> OK [0.10000038E1,TO_ZERO] --> [1,1] --> OK [0.10000037E1,TO_ZERO] --> [1,1] --> OK [0.10000036E1,TO_ZERO] --> [1,1] --> OK [0.10000035E1,TO_ZERO] --> [1,1] --> OK [0.10000033E1,TO_ZERO] --> [1,1] --> OK [0.10000032E1,TO_ZERO] --> [1,1] --> OK [0.10000031E1,TO_ZERO] --> [1,1] --> OK [0.1000003E1,TO_ZERO] --> [1,1] --> OK [0.10000029E1,TO_ZERO] --> [1,1] --> OK [0.10000027E1,TO_ZERO] --> [1,1] --> OK [0.10000026E1,TO_ZERO] --> [1,1] --> OK [0.10000025E1,TO_ZERO] --> [1,1] --> OK [0.10000024E1,TO_ZERO] --> [1,1] --> OK [0.10000023E1,TO_ZERO] --> [1,1] --> OK [0.10000021E1,TO_ZERO] --> [1,1] --> OK [0.1000002E1,TO_ZERO] --> [1,1] --> OK [0.10000019E1,TO_ZERO] --> [1,1] --> OK [0.10000018E1,TO_ZERO] --> [1,1] --> OK [0.10000017E1,TO_ZERO] --> [1,1] --> OK [0.10000015E1,TO_ZERO] --> [1,1] --> OK [0.10000014E1,TO_ZERO] --> [1,1] --> OK [0.10000013E1,TO_ZERO] --> [1,1] --> OK [0.10000012E1,TO_ZERO] --> [1,1] --> OK [0.10000011E1,TO_ZERO] --> [1,1] --> OK [0.1000001E1,TO_ZERO] --> [1,1] --> OK [0.10000008E1,TO_ZERO] --> [1,1] --> OK [0.10000007E1,TO_ZERO] --> [1,1] --> OK [0.10000006E1,TO_ZERO] --> [1,1] --> OK [0.10000005E1,TO_ZERO] --> [1,1] --> OK [0.10000004E1,TO_ZERO] --> [1,1] --> OK [0.10000002E1,TO_ZERO] --> [1,1] --> OK [0.10000001E1,TO_ZERO] --> [1,1] --> OK [0.19999924E1,TO_ZERO] --> [1,1] --> OK [0.19999925E1,TO_ZERO] --> [1,1] --> OK [0.19999926E1,TO_ZERO] --> [1,1] --> OK [0.19999927E1,TO_ZERO] --> [1,1] --> OK [0.19999928E1,TO_ZERO] --> [1,1] --> OK [0.1999993E1,TO_ZERO] --> [1,1] --> OK [0.19999931E1,TO_ZERO] --> [1,1] --> OK [0.19999932E1,TO_ZERO] --> [1,1] --> OK [0.19999933E1,TO_ZERO] --> [1,1] --> OK [0.19999934E1,TO_ZERO] --> [1,1] --> OK [0.19999936E1,TO_ZERO] --> [1,1] --> OK [0.19999937E1,TO_ZERO] --> [1,1] --> OK [0.19999938E1,TO_ZERO] --> [1,1] --> OK [0.19999939E1,TO_ZERO] --> [1,1] --> OK [0.1999994E1,TO_ZERO] --> [1,1] --> OK [0.19999942E1,TO_ZERO] --> [1,1] --> OK [0.19999943E1,TO_ZERO] --> [1,1] --> OK [0.19999944E1,TO_ZERO] --> [1,1] --> OK [0.19999945E1,TO_ZERO] --> [1,1] --> OK [0.19999946E1,TO_ZERO] --> [1,1] --> OK [0.19999948E1,TO_ZERO] --> [1,1] --> OK [0.19999949E1,TO_ZERO] --> [1,1] --> OK [0.1999995E1,TO_ZERO] --> [1,1] --> OK [0.19999951E1,TO_ZERO] --> [1,1] --> OK [0.19999952E1,TO_ZERO] --> [1,1] --> OK [0.19999954E1,TO_ZERO] --> [1,1] --> OK [0.19999955E1,TO_ZERO] --> [1,1] --> OK [0.19999956E1,TO_ZERO] --> [1,1] --> OK [0.19999957E1,TO_ZERO] --> [1,1] --> OK [0.19999958E1,TO_ZERO] --> [1,1] --> OK [0.1999996E1,TO_ZERO] --> [1,1] --> OK [0.19999961E1,TO_ZERO] --> [1,1] --> OK [0.19999962E1,TO_ZERO] --> [1,1] --> OK [0.19999963E1,TO_ZERO] --> [1,1] --> OK [0.19999964E1,TO_ZERO] --> [1,1] --> OK [0.19999965E1,TO_ZERO] --> [1,1] --> OK [0.19999967E1,TO_ZERO] --> [1,1] --> OK [0.19999968E1,TO_ZERO] --> [1,1] --> OK [0.19999969E1,TO_ZERO] --> [1,1] --> OK [0.1999997E1,TO_ZERO] --> [1,1] --> OK [0.19999971E1,TO_ZERO] --> [1,1] --> OK [0.19999973E1,TO_ZERO] --> [1,1] --> OK [0.19999974E1,TO_ZERO] --> [1,1] --> OK [0.19999975E1,TO_ZERO] --> [1,1] --> OK [0.19999976E1,TO_ZERO] --> [1,1] --> OK [0.19999977E1,TO_ZERO] --> [1,1] --> OK [0.19999979E1,TO_ZERO] --> [1,1] --> OK [0.1999998E1,TO_ZERO] --> [1,1] --> OK [0.19999981E1,TO_ZERO] --> [1,1] --> OK [0.19999982E1,TO_ZERO] --> [1,1] --> OK [0.19999983E1,TO_ZERO] --> [1,1] --> OK [0.19999985E1,TO_ZERO] --> [1,1] --> OK [0.19999986E1,TO_ZERO] --> [1,1] --> OK [0.19999987E1,TO_ZERO] --> [1,1] --> OK [0.19999988E1,TO_ZERO] --> [1,1] --> OK [0.19999989E1,TO_ZERO] --> [1,1] --> OK [0.1999999E1,TO_ZERO] --> [1,1] --> OK [0.19999992E1,TO_ZERO] --> [1,1] --> OK [0.19999993E1,TO_ZERO] --> [1,1] --> OK [0.19999994E1,TO_ZERO] --> [1,1] --> OK [0.19999995E1,TO_ZERO] --> [1,1] --> OK [0.19999996E1,TO_ZERO] --> [1,1] --> OK [0.19999998E1,TO_ZERO] --> [1,1] --> OK [0.19999999E1,TO_ZERO] --> [1,1] --> OK [0.2E1,TO_ZERO] --> [2,2] --> OK [0.20000153E1,TO_ZERO] --> [2,2] --> OK [0.2000015E1,TO_ZERO] --> [2,2] --> OK [0.20000148E1,TO_ZERO] --> [2,2] --> OK [0.20000145E1,TO_ZERO] --> [2,2] --> OK [0.20000143E1,TO_ZERO] --> [2,2] --> OK [0.2000014E1,TO_ZERO] --> [2,2] --> OK [0.20000138E1,TO_ZERO] --> [2,2] --> OK [0.20000136E1,TO_ZERO] --> [2,2] --> OK [0.20000134E1,TO_ZERO] --> [2,2] --> OK [0.2000013E1,TO_ZERO] --> [2,2] --> OK [0.20000129E1,TO_ZERO] --> [2,2] --> OK [0.20000126E1,TO_ZERO] --> [2,2] --> OK [0.20000124E1,TO_ZERO] --> [2,2] --> OK [0.20000122E1,TO_ZERO] --> [2,2] --> OK [0.2000012E1,TO_ZERO] --> [2,2] --> OK [0.20000117E1,TO_ZERO] --> [2,2] --> OK [0.20000114E1,TO_ZERO] --> [2,2] --> OK [0.20000112E1,TO_ZERO] --> [2,2] --> OK [0.2000011E1,TO_ZERO] --> [2,2] --> OK [0.20000107E1,TO_ZERO] --> [2,2] --> OK [0.20000105E1,TO_ZERO] --> [2,2] --> OK [0.20000103E1,TO_ZERO] --> [2,2] --> OK [0.200001E1,TO_ZERO] --> [2,2] --> OK [0.20000098E1,TO_ZERO] --> [2,2] --> OK [0.20000095E1,TO_ZERO] --> [2,2] --> OK [0.20000093E1,TO_ZERO] --> [2,2] --> OK [0.2000009E1,TO_ZERO] --> [2,2] --> OK [0.20000088E1,TO_ZERO] --> [2,2] --> OK [0.20000086E1,TO_ZERO] --> [2,2] --> OK [0.20000083E1,TO_ZERO] --> [2,2] --> OK [0.2000008E1,TO_ZERO] --> [2,2] --> OK [0.20000079E1,TO_ZERO] --> [2,2] --> OK [0.20000076E1,TO_ZERO] --> [2,2] --> OK [0.20000074E1,TO_ZERO] --> [2,2] --> OK [0.20000072E1,TO_ZERO] --> [2,2] --> OK [0.2000007E1,TO_ZERO] --> [2,2] --> OK [0.20000067E1,TO_ZERO] --> [2,2] --> OK [0.20000064E1,TO_ZERO] --> [2,2] --> OK [0.20000062E1,TO_ZERO] --> [2,2] --> OK [0.2000006E1,TO_ZERO] --> [2,2] --> OK [0.20000057E1,TO_ZERO] --> [2,2] --> OK [0.20000055E1,TO_ZERO] --> [2,2] --> OK [0.20000052E1,TO_ZERO] --> [2,2] --> OK [0.2000005E1,TO_ZERO] --> [2,2] --> OK [0.20000048E1,TO_ZERO] --> [2,2] --> OK [0.20000045E1,TO_ZERO] --> [2,2] --> OK [0.20000043E1,TO_ZERO] --> [2,2] --> OK [0.2000004E1,TO_ZERO] --> [2,2] --> OK [0.20000038E1,TO_ZERO] --> [2,2] --> OK [0.20000036E1,TO_ZERO] --> [2,2] --> OK [0.20000033E1,TO_ZERO] --> [2,2] --> OK [0.2000003E1,TO_ZERO] --> [2,2] --> OK [0.20000029E1,TO_ZERO] --> [2,2] --> OK [0.20000026E1,TO_ZERO] --> [2,2] --> OK [0.20000024E1,TO_ZERO] --> [2,2] --> OK [0.20000021E1,TO_ZERO] --> [2,2] --> OK [0.2000002E1,TO_ZERO] --> [2,2] --> OK [0.20000017E1,TO_ZERO] --> [2,2] --> OK [0.20000014E1,TO_ZERO] --> [2,2] --> OK [0.20000012E1,TO_ZERO] --> [2,2] --> OK [0.2000001E1,TO_ZERO] --> [2,2] --> OK [0.20000007E1,TO_ZERO] --> [2,2] --> OK [0.20000005E1,TO_ZERO] --> [2,2] --> OK [0.20000002E1,TO_ZERO] --> [2,2] --> OK [0.29999847E1,TO_ZERO] --> [2,2] --> OK [0.2999985E1,TO_ZERO] --> [2,2] --> OK [0.29999852E1,TO_ZERO] --> [2,2] --> OK [0.29999855E1,TO_ZERO] --> [2,2] --> OK [0.29999857E1,TO_ZERO] --> [2,2] --> OK [0.2999986E1,TO_ZERO] --> [2,2] --> OK [0.29999862E1,TO_ZERO] --> [2,2] --> OK [0.29999864E1,TO_ZERO] --> [2,2] --> OK [0.29999866E1,TO_ZERO] --> [2,2] --> OK [0.2999987E1,TO_ZERO] --> [2,2] --> OK [0.29999871E1,TO_ZERO] --> [2,2] --> OK [0.29999874E1,TO_ZERO] --> [2,2] --> OK [0.29999876E1,TO_ZERO] --> [2,2] --> OK [0.29999878E1,TO_ZERO] --> [2,2] --> OK [0.2999988E1,TO_ZERO] --> [2,2] --> OK [0.29999883E1,TO_ZERO] --> [2,2] --> OK [0.29999886E1,TO_ZERO] --> [2,2] --> OK [0.29999888E1,TO_ZERO] --> [2,2] --> OK [0.2999989E1,TO_ZERO] --> [2,2] --> OK [0.29999893E1,TO_ZERO] --> [2,2] --> OK [0.29999895E1,TO_ZERO] --> [2,2] --> OK [0.29999897E1,TO_ZERO] --> [2,2] --> OK [0.299999E1,TO_ZERO] --> [2,2] --> OK [0.29999902E1,TO_ZERO] --> [2,2] --> OK [0.29999905E1,TO_ZERO] --> [2,2] --> OK [0.29999907E1,TO_ZERO] --> [2,2] --> OK [0.2999991E1,TO_ZERO] --> [2,2] --> OK [0.29999912E1,TO_ZERO] --> [2,2] --> OK [0.29999914E1,TO_ZERO] --> [2,2] --> OK [0.29999917E1,TO_ZERO] --> [2,2] --> OK [0.2999992E1,TO_ZERO] --> [2,2] --> OK [0.29999921E1,TO_ZERO] --> [2,2] --> OK [0.29999924E1,TO_ZERO] --> [2,2] --> OK [0.29999926E1,TO_ZERO] --> [2,2] --> OK [0.29999928E1,TO_ZERO] --> [2,2] --> OK [0.2999993E1,TO_ZERO] --> [2,2] --> OK [0.29999933E1,TO_ZERO] --> [2,2] --> OK [0.29999936E1,TO_ZERO] --> [2,2] --> OK [0.29999938E1,TO_ZERO] --> [2,2] --> OK [0.2999994E1,TO_ZERO] --> [2,2] --> OK [0.29999943E1,TO_ZERO] --> [2,2] --> OK [0.29999945E1,TO_ZERO] --> [2,2] --> OK [0.29999948E1,TO_ZERO] --> [2,2] --> OK [0.2999995E1,TO_ZERO] --> [2,2] --> OK [0.29999952E1,TO_ZERO] --> [2,2] --> OK [0.29999955E1,TO_ZERO] --> [2,2] --> OK [0.29999957E1,TO_ZERO] --> [2,2] --> OK [0.2999996E1,TO_ZERO] --> [2,2] --> OK [0.29999962E1,TO_ZERO] --> [2,2] --> OK [0.29999964E1,TO_ZERO] --> [2,2] --> OK [0.29999967E1,TO_ZERO] --> [2,2] --> OK [0.2999997E1,TO_ZERO] --> [2,2] --> OK [0.29999971E1,TO_ZERO] --> [2,2] --> OK [0.29999974E1,TO_ZERO] --> [2,2] --> OK [0.29999976E1,TO_ZERO] --> [2,2] --> OK [0.29999979E1,TO_ZERO] --> [2,2] --> OK [0.2999998E1,TO_ZERO] --> [2,2] --> OK [0.29999983E1,TO_ZERO] --> [2,2] --> OK [0.29999986E1,TO_ZERO] --> [2,2] --> OK [0.29999988E1,TO_ZERO] --> [2,2] --> OK [0.2999999E1,TO_ZERO] --> [2,2] --> OK [0.29999993E1,TO_ZERO] --> [2,2] --> OK [0.29999995E1,TO_ZERO] --> [2,2] --> OK [0.29999998E1,TO_ZERO] --> [2,2] --> OK [0.3E1,TO_ZERO] --> [3,3] --> OK [0.30000153E1,TO_ZERO] --> [3,3] --> OK [0.3000015E1,TO_ZERO] --> [3,3] --> OK [0.30000148E1,TO_ZERO] --> [3,3] --> OK [0.30000145E1,TO_ZERO] --> [3,3] --> OK [0.30000143E1,TO_ZERO] --> [3,3] --> OK [0.3000014E1,TO_ZERO] --> [3,3] --> OK [0.30000138E1,TO_ZERO] --> [3,3] --> OK [0.30000136E1,TO_ZERO] --> [3,3] --> OK [0.30000134E1,TO_ZERO] --> [3,3] --> OK [0.3000013E1,TO_ZERO] --> [3,3] --> OK [0.30000129E1,TO_ZERO] --> [3,3] --> OK [0.30000126E1,TO_ZERO] --> [3,3] --> OK [0.30000124E1,TO_ZERO] --> [3,3] --> OK [0.30000122E1,TO_ZERO] --> [3,3] --> OK [0.3000012E1,TO_ZERO] --> [3,3] --> OK [0.30000117E1,TO_ZERO] --> [3,3] --> OK [0.30000114E1,TO_ZERO] --> [3,3] --> OK [0.30000112E1,TO_ZERO] --> [3,3] --> OK [0.3000011E1,TO_ZERO] --> [3,3] --> OK [0.30000107E1,TO_ZERO] --> [3,3] --> OK [0.30000105E1,TO_ZERO] --> [3,3] --> OK [0.30000103E1,TO_ZERO] --> [3,3] --> OK [0.300001E1,TO_ZERO] --> [3,3] --> OK [0.30000098E1,TO_ZERO] --> [3,3] --> OK [0.30000095E1,TO_ZERO] --> [3,3] --> OK [0.30000093E1,TO_ZERO] --> [3,3] --> OK [0.3000009E1,TO_ZERO] --> [3,3] --> OK [0.30000088E1,TO_ZERO] --> [3,3] --> OK [0.30000086E1,TO_ZERO] --> [3,3] --> OK [0.30000083E1,TO_ZERO] --> [3,3] --> OK [0.3000008E1,TO_ZERO] --> [3,3] --> OK [0.30000079E1,TO_ZERO] --> [3,3] --> OK [0.30000076E1,TO_ZERO] --> [3,3] --> OK [0.30000074E1,TO_ZERO] --> [3,3] --> OK [0.30000072E1,TO_ZERO] --> [3,3] --> OK [0.3000007E1,TO_ZERO] --> [3,3] --> OK [0.30000067E1,TO_ZERO] --> [3,3] --> OK [0.30000064E1,TO_ZERO] --> [3,3] --> OK [0.30000062E1,TO_ZERO] --> [3,3] --> OK [0.3000006E1,TO_ZERO] --> [3,3] --> OK [0.30000057E1,TO_ZERO] --> [3,3] --> OK [0.30000055E1,TO_ZERO] --> [3,3] --> OK [0.30000052E1,TO_ZERO] --> [3,3] --> OK [0.3000005E1,TO_ZERO] --> [3,3] --> OK [0.30000048E1,TO_ZERO] --> [3,3] --> OK [0.30000045E1,TO_ZERO] --> [3,3] --> OK [0.30000043E1,TO_ZERO] --> [3,3] --> OK [0.3000004E1,TO_ZERO] --> [3,3] --> OK [0.30000038E1,TO_ZERO] --> [3,3] --> OK [0.30000036E1,TO_ZERO] --> [3,3] --> OK [0.30000033E1,TO_ZERO] --> [3,3] --> OK [0.3000003E1,TO_ZERO] --> [3,3] --> OK [0.30000029E1,TO_ZERO] --> [3,3] --> OK [0.30000026E1,TO_ZERO] --> [3,3] --> OK [0.30000024E1,TO_ZERO] --> [3,3] --> OK [0.30000021E1,TO_ZERO] --> [3,3] --> OK [0.3000002E1,TO_ZERO] --> [3,3] --> OK [0.30000017E1,TO_ZERO] --> [3,3] --> OK [0.30000014E1,TO_ZERO] --> [3,3] --> OK [0.30000012E1,TO_ZERO] --> [3,3] --> OK [0.3000001E1,TO_ZERO] --> [3,3] --> OK [0.30000007E1,TO_ZERO] --> [3,3] --> OK [0.30000005E1,TO_ZERO] --> [3,3] --> OK [0.30000002E1,TO_ZERO] --> [3,3] --> OK [0.10737377E10,TO_ZERO] --> [1073737728,1073737728] --> OK [0.10737378E10,TO_ZERO] --> [1073737792,1073737792] --> OK [0.107373786E10,TO_ZERO] --> [1073737856,1073737856] --> OK [0.10737379E10,TO_ZERO] --> [1073737920,1073737920] --> OK [0.1073738E10,TO_ZERO] --> [1073737984,1073737984] --> OK [0.107373805E10,TO_ZERO] --> [1073738048,1073738048] --> OK [0.10737381E10,TO_ZERO] --> [1073738112,1073738112] --> OK [0.10737382E10,TO_ZERO] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_ZERO] --> [1073738240,1073738240] --> OK [0.10737383E10,TO_ZERO] --> [1073738304,1073738304] --> OK [0.10737384E10,TO_ZERO] --> [1073738368,1073738368] --> OK [0.107373843E10,TO_ZERO] --> [1073738432,1073738432] --> OK [0.10737385E10,TO_ZERO] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_ZERO] --> [1073738560,1073738560] --> OK [0.10737386E10,TO_ZERO] --> [1073738624,1073738624] --> OK [0.10737387E10,TO_ZERO] --> [1073738688,1073738688] --> OK [0.107373875E10,TO_ZERO] --> [1073738752,1073738752] --> OK [0.10737388E10,TO_ZERO] --> [1073738816,1073738816] --> OK [0.10737389E10,TO_ZERO] --> [1073738880,1073738880] --> OK [0.107373894E10,TO_ZERO] --> [1073738944,1073738944] --> OK [0.1073739E10,TO_ZERO] --> [1073739008,1073739008] --> OK [0.10737391E10,TO_ZERO] --> [1073739072,1073739072] --> OK [0.107373914E10,TO_ZERO] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_ZERO] --> [1073739200,1073739200] --> OK [0.107373926E10,TO_ZERO] --> [1073739264,1073739264] --> OK [0.10737393E10,TO_ZERO] --> [1073739328,1073739328] --> OK [0.10737394E10,TO_ZERO] --> [1073739392,1073739392] --> OK [0.107373946E10,TO_ZERO] --> [1073739456,1073739456] --> OK [0.10737395E10,TO_ZERO] --> [1073739520,1073739520] --> OK [0.10737396E10,TO_ZERO] --> [1073739584,1073739584] --> OK [0.107373965E10,TO_ZERO] --> [1073739648,1073739648] --> OK [0.10737397E10,TO_ZERO] --> [1073739712,1073739712] --> OK [0.10737398E10,TO_ZERO] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_ZERO] --> [1073739840,1073739840] --> OK [0.10737399E10,TO_ZERO] --> [1073739904,1073739904] --> OK [0.107373997E10,TO_ZERO] --> [1073739968,1073739968] --> OK [0.107374E10,TO_ZERO] --> [1073740032,1073740032] --> OK [0.10737401E10,TO_ZERO] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_ZERO] --> [1073740160,1073740160] --> OK [0.10737402E10,TO_ZERO] --> [1073740224,1073740224] --> OK [0.10737403E10,TO_ZERO] --> [1073740288,1073740288] --> OK [0.107374035E10,TO_ZERO] --> [1073740352,1073740352] --> OK [0.10737404E10,TO_ZERO] --> [1073740416,1073740416] --> OK [0.10737405E10,TO_ZERO] --> [1073740480,1073740480] --> OK [0.107374054E10,TO_ZERO] --> [1073740544,1073740544] --> OK [0.10737406E10,TO_ZERO] --> [1073740608,1073740608] --> OK [0.10737407E10,TO_ZERO] --> [1073740672,1073740672] --> OK [0.107374074E10,TO_ZERO] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_ZERO] --> [1073740800,1073740800] --> OK [0.107374086E10,TO_ZERO] --> [1073740864,1073740864] --> OK [0.10737409E10,TO_ZERO] --> [1073740928,1073740928] --> OK [0.1073741E10,TO_ZERO] --> [1073740992,1073740992] --> OK [0.107374106E10,TO_ZERO] --> [1073741056,1073741056] --> OK [0.10737411E10,TO_ZERO] --> [1073741120,1073741120] --> OK [0.10737412E10,TO_ZERO] --> [1073741184,1073741184] --> OK [0.107374125E10,TO_ZERO] --> [1073741248,1073741248] --> OK [0.10737413E10,TO_ZERO] --> [1073741312,1073741312] --> OK [0.10737414E10,TO_ZERO] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_ZERO] --> [1073741440,1073741440] --> OK [0.10737415E10,TO_ZERO] --> [1073741504,1073741504] --> OK [0.10737416E10,TO_ZERO] --> [1073741568,1073741568] --> OK [0.107374163E10,TO_ZERO] --> [1073741632,1073741632] --> OK [0.10737417E10,TO_ZERO] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_ZERO] --> [1073741760,1073741760] --> OK [0.10737418E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.107375E10,TO_ZERO] --> [1073750016,1073750016] --> OK [0.10737499E10,TO_ZERO] --> [1073749888,1073749888] --> OK [0.10737498E10,TO_ZERO] --> [1073749760,1073749760] --> OK [0.10737496E10,TO_ZERO] --> [1073749632,1073749632] --> OK [0.10737495E10,TO_ZERO] --> [1073749504,1073749504] --> OK [0.10737494E10,TO_ZERO] --> [1073749376,1073749376] --> OK [0.10737492E10,TO_ZERO] --> [1073749248,1073749248] --> OK [0.10737491E10,TO_ZERO] --> [1073749120,1073749120] --> OK [0.1073749E10,TO_ZERO] --> [1073748992,1073748992] --> OK [0.10737489E10,TO_ZERO] --> [1073748864,1073748864] --> OK [0.10737487E10,TO_ZERO] --> [1073748736,1073748736] --> OK [0.10737486E10,TO_ZERO] --> [1073748608,1073748608] --> OK [0.10737485E10,TO_ZERO] --> [1073748480,1073748480] --> OK [0.10737484E10,TO_ZERO] --> [1073748352,1073748352] --> OK [0.10737482E10,TO_ZERO] --> [1073748224,1073748224] --> OK [0.10737481E10,TO_ZERO] --> [1073748096,1073748096] --> OK [0.1073748E10,TO_ZERO] --> [1073747968,1073747968] --> OK [0.10737478E10,TO_ZERO] --> [1073747840,1073747840] --> OK [0.10737477E10,TO_ZERO] --> [1073747712,1073747712] --> OK [0.10737476E10,TO_ZERO] --> [1073747584,1073747584] --> OK [0.10737475E10,TO_ZERO] --> [1073747456,1073747456] --> OK [0.10737473E10,TO_ZERO] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_ZERO] --> [1073747200,1073747200] --> OK [0.10737471E10,TO_ZERO] --> [1073747072,1073747072] --> OK [0.1073747E10,TO_ZERO] --> [1073746944,1073746944] --> OK [0.10737468E10,TO_ZERO] --> [1073746816,1073746816] --> OK [0.10737467E10,TO_ZERO] --> [1073746688,1073746688] --> OK [0.10737466E10,TO_ZERO] --> [1073746560,1073746560] --> OK [0.10737464E10,TO_ZERO] --> [1073746432,1073746432] --> OK [0.10737463E10,TO_ZERO] --> [1073746304,1073746304] --> OK [0.10737462E10,TO_ZERO] --> [1073746176,1073746176] --> OK [0.1073746E10,TO_ZERO] --> [1073746048,1073746048] --> OK [0.10737459E10,TO_ZERO] --> [1073745920,1073745920] --> OK [0.10737458E10,TO_ZERO] --> [1073745792,1073745792] --> OK [0.10737457E10,TO_ZERO] --> [1073745664,1073745664] --> OK [0.10737455E10,TO_ZERO] --> [1073745536,1073745536] --> OK [0.10737454E10,TO_ZERO] --> [1073745408,1073745408] --> OK [0.10737453E10,TO_ZERO] --> [1073745280,1073745280] --> OK [0.10737452E10,TO_ZERO] --> [1073745152,1073745152] --> OK [0.1073745E10,TO_ZERO] --> [1073745024,1073745024] --> OK [0.10737449E10,TO_ZERO] --> [1073744896,1073744896] --> OK [0.10737448E10,TO_ZERO] --> [1073744768,1073744768] --> OK [0.10737446E10,TO_ZERO] --> [1073744640,1073744640] --> OK [0.10737445E10,TO_ZERO] --> [1073744512,1073744512] --> OK [0.10737444E10,TO_ZERO] --> [1073744384,1073744384] --> OK [0.10737443E10,TO_ZERO] --> [1073744256,1073744256] --> OK [0.10737441E10,TO_ZERO] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_ZERO] --> [1073744000,1073744000] --> OK [0.10737439E10,TO_ZERO] --> [1073743872,1073743872] --> OK [0.10737437E10,TO_ZERO] --> [1073743744,1073743744] --> OK [0.10737436E10,TO_ZERO] --> [1073743616,1073743616] --> OK [0.10737435E10,TO_ZERO] --> [1073743488,1073743488] --> OK [0.10737434E10,TO_ZERO] --> [1073743360,1073743360] --> OK [0.10737432E10,TO_ZERO] --> [1073743232,1073743232] --> OK [0.10737431E10,TO_ZERO] --> [1073743104,1073743104] --> OK [0.1073743E10,TO_ZERO] --> [1073742976,1073742976] --> OK [0.10737428E10,TO_ZERO] --> [1073742848,1073742848] --> OK [0.10737427E10,TO_ZERO] --> [1073742720,1073742720] --> OK [0.10737426E10,TO_ZERO] --> [1073742592,1073742592] --> OK [0.10737425E10,TO_ZERO] --> [1073742464,1073742464] --> OK [0.10737423E10,TO_ZERO] --> [1073742336,1073742336] --> OK [0.10737422E10,TO_ZERO] --> [1073742208,1073742208] --> OK [0.10737421E10,TO_ZERO] --> [1073742080,1073742080] --> OK [0.1073742E10,TO_ZERO] --> [1073741952,1073741952] --> OK [0.16106045E10,TO_ZERO] --> [1610604544,1610604544] --> OK [0.16106047E10,TO_ZERO] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_ZERO] --> [1610604800,1610604800] --> OK [0.16106049E10,TO_ZERO] --> [1610604928,1610604928] --> OK [0.1610605E10,TO_ZERO] --> [1610605056,1610605056] --> OK [0.16106052E10,TO_ZERO] --> [1610605184,1610605184] --> OK [0.16106053E10,TO_ZERO] --> [1610605312,1610605312] --> OK [0.16106054E10,TO_ZERO] --> [1610605440,1610605440] --> OK [0.16106056E10,TO_ZERO] --> [1610605568,1610605568] --> OK [0.16106057E10,TO_ZERO] --> [1610605696,1610605696] --> OK [0.16106058E10,TO_ZERO] --> [1610605824,1610605824] --> OK [0.1610606E10,TO_ZERO] --> [1610605952,1610605952] --> OK [0.16106061E10,TO_ZERO] --> [1610606080,1610606080] --> OK [0.16106062E10,TO_ZERO] --> [1610606208,1610606208] --> OK [0.16106063E10,TO_ZERO] --> [1610606336,1610606336] --> OK [0.16106065E10,TO_ZERO] --> [1610606464,1610606464] --> OK [0.16106066E10,TO_ZERO] --> [1610606592,1610606592] --> OK [0.16106067E10,TO_ZERO] --> [1610606720,1610606720] --> OK [0.16106068E10,TO_ZERO] --> [1610606848,1610606848] --> OK [0.1610607E10,TO_ZERO] --> [1610606976,1610606976] --> OK [0.16106071E10,TO_ZERO] --> [1610607104,1610607104] --> OK [0.16106072E10,TO_ZERO] --> [1610607232,1610607232] --> OK [0.16106074E10,TO_ZERO] --> [1610607360,1610607360] --> OK [0.16106075E10,TO_ZERO] --> [1610607488,1610607488] --> OK [0.16106076E10,TO_ZERO] --> [1610607616,1610607616] --> OK [0.16106077E10,TO_ZERO] --> [1610607744,1610607744] --> OK [0.16106079E10,TO_ZERO] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_ZERO] --> [1610608000,1610608000] --> OK [0.16106081E10,TO_ZERO] --> [1610608128,1610608128] --> OK [0.16106083E10,TO_ZERO] --> [1610608256,1610608256] --> OK [0.16106084E10,TO_ZERO] --> [1610608384,1610608384] --> OK [0.16106085E10,TO_ZERO] --> [1610608512,1610608512] --> OK [0.16106086E10,TO_ZERO] --> [1610608640,1610608640] --> OK [0.16106088E10,TO_ZERO] --> [1610608768,1610608768] --> OK [0.16106089E10,TO_ZERO] --> [1610608896,1610608896] --> OK [0.1610609E10,TO_ZERO] --> [1610609024,1610609024] --> OK [0.16106092E10,TO_ZERO] --> [1610609152,1610609152] --> OK [0.16106093E10,TO_ZERO] --> [1610609280,1610609280] --> OK [0.16106094E10,TO_ZERO] --> [1610609408,1610609408] --> OK [0.16106095E10,TO_ZERO] --> [1610609536,1610609536] --> OK [0.16106097E10,TO_ZERO] --> [1610609664,1610609664] --> OK [0.16106098E10,TO_ZERO] --> [1610609792,1610609792] --> OK [0.16106099E10,TO_ZERO] --> [1610609920,1610609920] --> OK [0.161061E10,TO_ZERO] --> [1610610048,1610610048] --> OK [0.16106102E10,TO_ZERO] --> [1610610176,1610610176] --> OK [0.16106103E10,TO_ZERO] --> [1610610304,1610610304] --> OK [0.16106104E10,TO_ZERO] --> [1610610432,1610610432] --> OK [0.16106106E10,TO_ZERO] --> [1610610560,1610610560] --> OK [0.16106107E10,TO_ZERO] --> [1610610688,1610610688] --> OK [0.16106108E10,TO_ZERO] --> [1610610816,1610610816] --> OK [0.1610611E10,TO_ZERO] --> [1610610944,1610610944] --> OK [0.16106111E10,TO_ZERO] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_ZERO] --> [1610611200,1610611200] --> OK [0.16106113E10,TO_ZERO] --> [1610611328,1610611328] --> OK [0.16106115E10,TO_ZERO] --> [1610611456,1610611456] --> OK [0.16106116E10,TO_ZERO] --> [1610611584,1610611584] --> OK [0.16106117E10,TO_ZERO] --> [1610611712,1610611712] --> OK [0.16106118E10,TO_ZERO] --> [1610611840,1610611840] --> OK [0.1610612E10,TO_ZERO] --> [1610611968,1610611968] --> OK [0.16106121E10,TO_ZERO] --> [1610612096,1610612096] --> OK [0.16106122E10,TO_ZERO] --> [1610612224,1610612224] --> OK [0.16106124E10,TO_ZERO] --> [1610612352,1610612352] --> OK [0.16106125E10,TO_ZERO] --> [1610612480,1610612480] --> OK [0.16106126E10,TO_ZERO] --> [1610612608,1610612608] --> OK [0.16106127E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106209E10,TO_ZERO] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_ZERO] --> [1610620800,1610620800] --> OK [0.16106207E10,TO_ZERO] --> [1610620672,1610620672] --> OK [0.16106205E10,TO_ZERO] --> [1610620544,1610620544] --> OK [0.16106204E10,TO_ZERO] --> [1610620416,1610620416] --> OK [0.16106203E10,TO_ZERO] --> [1610620288,1610620288] --> OK [0.16106202E10,TO_ZERO] --> [1610620160,1610620160] --> OK [0.161062E10,TO_ZERO] --> [1610620032,1610620032] --> OK [0.16106199E10,TO_ZERO] --> [1610619904,1610619904] --> OK [0.16106198E10,TO_ZERO] --> [1610619776,1610619776] --> OK [0.16106196E10,TO_ZERO] --> [1610619648,1610619648] --> OK [0.16106195E10,TO_ZERO] --> [1610619520,1610619520] --> OK [0.16106194E10,TO_ZERO] --> [1610619392,1610619392] --> OK [0.16106193E10,TO_ZERO] --> [1610619264,1610619264] --> OK [0.16106191E10,TO_ZERO] --> [1610619136,1610619136] --> OK [0.1610619E10,TO_ZERO] --> [1610619008,1610619008] --> OK [0.16106189E10,TO_ZERO] --> [1610618880,1610618880] --> OK [0.16106188E10,TO_ZERO] --> [1610618752,1610618752] --> OK [0.16106186E10,TO_ZERO] --> [1610618624,1610618624] --> OK [0.16106185E10,TO_ZERO] --> [1610618496,1610618496] --> OK [0.16106184E10,TO_ZERO] --> [1610618368,1610618368] --> OK [0.16106182E10,TO_ZERO] --> [1610618240,1610618240] --> OK [0.16106181E10,TO_ZERO] --> [1610618112,1610618112] --> OK [0.1610618E10,TO_ZERO] --> [1610617984,1610617984] --> OK [0.16106179E10,TO_ZERO] --> [1610617856,1610617856] --> OK [0.16106177E10,TO_ZERO] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_ZERO] --> [1610617600,1610617600] --> OK [0.16106175E10,TO_ZERO] --> [1610617472,1610617472] --> OK [0.16106173E10,TO_ZERO] --> [1610617344,1610617344] --> OK [0.16106172E10,TO_ZERO] --> [1610617216,1610617216] --> OK [0.16106171E10,TO_ZERO] --> [1610617088,1610617088] --> OK [0.1610617E10,TO_ZERO] --> [1610616960,1610616960] --> OK [0.16106168E10,TO_ZERO] --> [1610616832,1610616832] --> OK [0.16106167E10,TO_ZERO] --> [1610616704,1610616704] --> OK [0.16106166E10,TO_ZERO] --> [1610616576,1610616576] --> OK [0.16106164E10,TO_ZERO] --> [1610616448,1610616448] --> OK [0.16106163E10,TO_ZERO] --> [1610616320,1610616320] --> OK [0.16106162E10,TO_ZERO] --> [1610616192,1610616192] --> OK [0.1610616E10,TO_ZERO] --> [1610616064,1610616064] --> OK [0.16106159E10,TO_ZERO] --> [1610615936,1610615936] --> OK [0.16106158E10,TO_ZERO] --> [1610615808,1610615808] --> OK [0.16106157E10,TO_ZERO] --> [1610615680,1610615680] --> OK [0.16106156E10,TO_ZERO] --> [1610615552,1610615552] --> OK [0.16106154E10,TO_ZERO] --> [1610615424,1610615424] --> OK [0.16106153E10,TO_ZERO] --> [1610615296,1610615296] --> OK [0.16106152E10,TO_ZERO] --> [1610615168,1610615168] --> OK [0.1610615E10,TO_ZERO] --> [1610615040,1610615040] --> OK [0.16106149E10,TO_ZERO] --> [1610614912,1610614912] --> OK [0.16106148E10,TO_ZERO] --> [1610614784,1610614784] --> OK [0.16106147E10,TO_ZERO] --> [1610614656,1610614656] --> OK [0.16106145E10,TO_ZERO] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_ZERO] --> [1610614400,1610614400] --> OK [0.16106143E10,TO_ZERO] --> [1610614272,1610614272] --> OK [0.16106141E10,TO_ZERO] --> [1610614144,1610614144] --> OK [0.1610614E10,TO_ZERO] --> [1610614016,1610614016] --> OK [0.16106139E10,TO_ZERO] --> [1610613888,1610613888] --> OK [0.16106138E10,TO_ZERO] --> [1610613760,1610613760] --> OK [0.16106136E10,TO_ZERO] --> [1610613632,1610613632] --> OK [0.16106135E10,TO_ZERO] --> [1610613504,1610613504] --> OK [0.16106134E10,TO_ZERO] --> [1610613376,1610613376] --> OK [0.16106132E10,TO_ZERO] --> [1610613248,1610613248] --> OK [0.16106131E10,TO_ZERO] --> [1610613120,1610613120] --> OK [0.1610613E10,TO_ZERO] --> [1610612992,1610612992] --> OK [0.16106129E10,TO_ZERO] --> [1610612864,1610612864] --> OK [0.187904E10,TO_ZERO] --> [1879040000,1879040000] --> OK [0.18790401E10,TO_ZERO] --> [1879040128,1879040128] --> OK [0.18790403E10,TO_ZERO] --> [1879040256,1879040256] --> OK [0.18790404E10,TO_ZERO] --> [1879040384,1879040384] --> OK [0.18790405E10,TO_ZERO] --> [1879040512,1879040512] --> OK [0.18790406E10,TO_ZERO] --> [1879040640,1879040640] --> OK [0.18790408E10,TO_ZERO] --> [1879040768,1879040768] --> OK [0.18790409E10,TO_ZERO] --> [1879040896,1879040896] --> OK [0.1879041E10,TO_ZERO] --> [1879041024,1879041024] --> OK [0.18790412E10,TO_ZERO] --> [1879041152,1879041152] --> OK [0.18790413E10,TO_ZERO] --> [1879041280,1879041280] --> OK [0.18790414E10,TO_ZERO] --> [1879041408,1879041408] --> OK [0.18790415E10,TO_ZERO] --> [1879041536,1879041536] --> OK [0.18790417E10,TO_ZERO] --> [1879041664,1879041664] --> OK [0.18790418E10,TO_ZERO] --> [1879041792,1879041792] --> OK [0.18790419E10,TO_ZERO] --> [1879041920,1879041920] --> OK [0.1879042E10,TO_ZERO] --> [1879042048,1879042048] --> OK [0.18790422E10,TO_ZERO] --> [1879042176,1879042176] --> OK [0.18790423E10,TO_ZERO] --> [1879042304,1879042304] --> OK [0.18790424E10,TO_ZERO] --> [1879042432,1879042432] --> OK [0.18790426E10,TO_ZERO] --> [1879042560,1879042560] --> OK [0.18790427E10,TO_ZERO] --> [1879042688,1879042688] --> OK [0.18790428E10,TO_ZERO] --> [1879042816,1879042816] --> OK [0.1879043E10,TO_ZERO] --> [1879042944,1879042944] --> OK [0.18790431E10,TO_ZERO] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_ZERO] --> [1879043200,1879043200] --> OK [0.18790433E10,TO_ZERO] --> [1879043328,1879043328] --> OK [0.18790435E10,TO_ZERO] --> [1879043456,1879043456] --> OK [0.18790436E10,TO_ZERO] --> [1879043584,1879043584] --> OK [0.18790437E10,TO_ZERO] --> [1879043712,1879043712] --> OK [0.18790438E10,TO_ZERO] --> [1879043840,1879043840] --> OK [0.1879044E10,TO_ZERO] --> [1879043968,1879043968] --> OK [0.18790441E10,TO_ZERO] --> [1879044096,1879044096] --> OK [0.18790442E10,TO_ZERO] --> [1879044224,1879044224] --> OK [0.18790444E10,TO_ZERO] --> [1879044352,1879044352] --> OK [0.18790445E10,TO_ZERO] --> [1879044480,1879044480] --> OK [0.18790446E10,TO_ZERO] --> [1879044608,1879044608] --> OK [0.18790447E10,TO_ZERO] --> [1879044736,1879044736] --> OK [0.18790449E10,TO_ZERO] --> [1879044864,1879044864] --> OK [0.1879045E10,TO_ZERO] --> [1879044992,1879044992] --> OK [0.18790451E10,TO_ZERO] --> [1879045120,1879045120] --> OK [0.18790452E10,TO_ZERO] --> [1879045248,1879045248] --> OK [0.18790454E10,TO_ZERO] --> [1879045376,1879045376] --> OK [0.18790455E10,TO_ZERO] --> [1879045504,1879045504] --> OK [0.18790456E10,TO_ZERO] --> [1879045632,1879045632] --> OK [0.18790458E10,TO_ZERO] --> [1879045760,1879045760] --> OK [0.18790459E10,TO_ZERO] --> [1879045888,1879045888] --> OK [0.1879046E10,TO_ZERO] --> [1879046016,1879046016] --> OK [0.18790461E10,TO_ZERO] --> [1879046144,1879046144] --> OK [0.18790463E10,TO_ZERO] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_ZERO] --> [1879046400,1879046400] --> OK [0.18790465E10,TO_ZERO] --> [1879046528,1879046528] --> OK [0.18790467E10,TO_ZERO] --> [1879046656,1879046656] --> OK [0.18790468E10,TO_ZERO] --> [1879046784,1879046784] --> OK [0.18790469E10,TO_ZERO] --> [1879046912,1879046912] --> OK [0.1879047E10,TO_ZERO] --> [1879047040,1879047040] --> OK [0.18790472E10,TO_ZERO] --> [1879047168,1879047168] --> OK [0.18790473E10,TO_ZERO] --> [1879047296,1879047296] --> OK [0.18790474E10,TO_ZERO] --> [1879047424,1879047424] --> OK [0.18790476E10,TO_ZERO] --> [1879047552,1879047552] --> OK [0.18790477E10,TO_ZERO] --> [1879047680,1879047680] --> OK [0.18790478E10,TO_ZERO] --> [1879047808,1879047808] --> OK [0.1879048E10,TO_ZERO] --> [1879047936,1879047936] --> OK [0.18790481E10,TO_ZERO] --> [1879048064,1879048064] --> OK [0.18790482E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790564E10,TO_ZERO] --> [1879056384,1879056384] --> OK [0.18790563E10,TO_ZERO] --> [1879056256,1879056256] --> OK [0.18790561E10,TO_ZERO] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_ZERO] --> [1879056000,1879056000] --> OK [0.18790559E10,TO_ZERO] --> [1879055872,1879055872] --> OK [0.18790557E10,TO_ZERO] --> [1879055744,1879055744] --> OK [0.18790556E10,TO_ZERO] --> [1879055616,1879055616] --> OK [0.18790555E10,TO_ZERO] --> [1879055488,1879055488] --> OK [0.18790554E10,TO_ZERO] --> [1879055360,1879055360] --> OK [0.18790552E10,TO_ZERO] --> [1879055232,1879055232] --> OK [0.18790551E10,TO_ZERO] --> [1879055104,1879055104] --> OK [0.1879055E10,TO_ZERO] --> [1879054976,1879054976] --> OK [0.18790548E10,TO_ZERO] --> [1879054848,1879054848] --> OK [0.18790547E10,TO_ZERO] --> [1879054720,1879054720] --> OK [0.18790546E10,TO_ZERO] --> [1879054592,1879054592] --> OK [0.18790545E10,TO_ZERO] --> [1879054464,1879054464] --> OK [0.18790543E10,TO_ZERO] --> [1879054336,1879054336] --> OK [0.18790542E10,TO_ZERO] --> [1879054208,1879054208] --> OK [0.18790541E10,TO_ZERO] --> [1879054080,1879054080] --> OK [0.1879054E10,TO_ZERO] --> [1879053952,1879053952] --> OK [0.18790538E10,TO_ZERO] --> [1879053824,1879053824] --> OK [0.18790537E10,TO_ZERO] --> [1879053696,1879053696] --> OK [0.18790536E10,TO_ZERO] --> [1879053568,1879053568] --> OK [0.18790534E10,TO_ZERO] --> [1879053440,1879053440] --> OK [0.18790533E10,TO_ZERO] --> [1879053312,1879053312] --> OK [0.18790532E10,TO_ZERO] --> [1879053184,1879053184] --> OK [0.1879053E10,TO_ZERO] --> [1879053056,1879053056] --> OK [0.18790529E10,TO_ZERO] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_ZERO] --> [1879052800,1879052800] --> OK [0.18790527E10,TO_ZERO] --> [1879052672,1879052672] --> OK [0.18790525E10,TO_ZERO] --> [1879052544,1879052544] --> OK [0.18790524E10,TO_ZERO] --> [1879052416,1879052416] --> OK [0.18790523E10,TO_ZERO] --> [1879052288,1879052288] --> OK [0.18790522E10,TO_ZERO] --> [1879052160,1879052160] --> OK [0.1879052E10,TO_ZERO] --> [1879052032,1879052032] --> OK [0.18790519E10,TO_ZERO] --> [1879051904,1879051904] --> OK [0.18790518E10,TO_ZERO] --> [1879051776,1879051776] --> OK [0.18790516E10,TO_ZERO] --> [1879051648,1879051648] --> OK [0.18790515E10,TO_ZERO] --> [1879051520,1879051520] --> OK [0.18790514E10,TO_ZERO] --> [1879051392,1879051392] --> OK [0.18790513E10,TO_ZERO] --> [1879051264,1879051264] --> OK [0.18790511E10,TO_ZERO] --> [1879051136,1879051136] --> OK [0.1879051E10,TO_ZERO] --> [1879051008,1879051008] --> OK [0.18790509E10,TO_ZERO] --> [1879050880,1879050880] --> OK [0.18790508E10,TO_ZERO] --> [1879050752,1879050752] --> OK [0.18790506E10,TO_ZERO] --> [1879050624,1879050624] --> OK [0.18790505E10,TO_ZERO] --> [1879050496,1879050496] --> OK [0.18790504E10,TO_ZERO] --> [1879050368,1879050368] --> OK [0.18790502E10,TO_ZERO] --> [1879050240,1879050240] --> OK [0.18790501E10,TO_ZERO] --> [1879050112,1879050112] --> OK [0.187905E10,TO_ZERO] --> [1879049984,1879049984] --> OK [0.18790499E10,TO_ZERO] --> [1879049856,1879049856] --> OK [0.18790497E10,TO_ZERO] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_ZERO] --> [1879049600,1879049600] --> OK [0.18790495E10,TO_ZERO] --> [1879049472,1879049472] --> OK [0.18790493E10,TO_ZERO] --> [1879049344,1879049344] --> OK [0.18790492E10,TO_ZERO] --> [1879049216,1879049216] --> OK [0.18790491E10,TO_ZERO] --> [1879049088,1879049088] --> OK [0.1879049E10,TO_ZERO] --> [1879048960,1879048960] --> OK [0.18790488E10,TO_ZERO] --> [1879048832,1879048832] --> OK [0.18790487E10,TO_ZERO] --> [1879048704,1879048704] --> OK [0.18790486E10,TO_ZERO] --> [1879048576,1879048576] --> OK [0.18790484E10,TO_ZERO] --> [1879048448,1879048448] --> OK [0.18790483E10,TO_ZERO] --> [1879048320,1879048320] --> OK [0.20132577E10,TO_ZERO] --> [2013257728,2013257728] --> OK [0.20132579E10,TO_ZERO] --> [2013257856,2013257856] --> OK [0.2013258E10,TO_ZERO] --> [2013257984,2013257984] --> OK [0.20132581E10,TO_ZERO] --> [2013258112,2013258112] --> OK [0.20132582E10,TO_ZERO] --> [2013258240,2013258240] --> OK [0.20132584E10,TO_ZERO] --> [2013258368,2013258368] --> OK [0.20132585E10,TO_ZERO] --> [2013258496,2013258496] --> OK [0.20132586E10,TO_ZERO] --> [2013258624,2013258624] --> OK [0.20132588E10,TO_ZERO] --> [2013258752,2013258752] --> OK [0.20132589E10,TO_ZERO] --> [2013258880,2013258880] --> OK [0.2013259E10,TO_ZERO] --> [2013259008,2013259008] --> OK [0.20132591E10,TO_ZERO] --> [2013259136,2013259136] --> OK [0.20132593E10,TO_ZERO] --> [2013259264,2013259264] --> OK [0.20132594E10,TO_ZERO] --> [2013259392,2013259392] --> OK [0.20132595E10,TO_ZERO] --> [2013259520,2013259520] --> OK [0.20132596E10,TO_ZERO] --> [2013259648,2013259648] --> OK [0.20132598E10,TO_ZERO] --> [2013259776,2013259776] --> OK [0.20132599E10,TO_ZERO] --> [2013259904,2013259904] --> OK [0.201326E10,TO_ZERO] --> [2013260032,2013260032] --> OK [0.20132602E10,TO_ZERO] --> [2013260160,2013260160] --> OK [0.20132603E10,TO_ZERO] --> [2013260288,2013260288] --> OK [0.20132604E10,TO_ZERO] --> [2013260416,2013260416] --> OK [0.20132605E10,TO_ZERO] --> [2013260544,2013260544] --> OK [0.20132607E10,TO_ZERO] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_ZERO] --> [2013260800,2013260800] --> OK [0.20132609E10,TO_ZERO] --> [2013260928,2013260928] --> OK [0.2013261E10,TO_ZERO] --> [2013261056,2013261056] --> OK [0.20132612E10,TO_ZERO] --> [2013261184,2013261184] --> OK [0.20132613E10,TO_ZERO] --> [2013261312,2013261312] --> OK [0.20132614E10,TO_ZERO] --> [2013261440,2013261440] --> OK [0.20132616E10,TO_ZERO] --> [2013261568,2013261568] --> OK [0.20132617E10,TO_ZERO] --> [2013261696,2013261696] --> OK [0.20132618E10,TO_ZERO] --> [2013261824,2013261824] --> OK [0.2013262E10,TO_ZERO] --> [2013261952,2013261952] --> OK [0.20132621E10,TO_ZERO] --> [2013262080,2013262080] --> OK [0.20132622E10,TO_ZERO] --> [2013262208,2013262208] --> OK [0.20132623E10,TO_ZERO] --> [2013262336,2013262336] --> OK [0.20132625E10,TO_ZERO] --> [2013262464,2013262464] --> OK [0.20132626E10,TO_ZERO] --> [2013262592,2013262592] --> OK [0.20132627E10,TO_ZERO] --> [2013262720,2013262720] --> OK [0.20132628E10,TO_ZERO] --> [2013262848,2013262848] --> OK [0.2013263E10,TO_ZERO] --> [2013262976,2013262976] --> OK [0.20132631E10,TO_ZERO] --> [2013263104,2013263104] --> OK [0.20132632E10,TO_ZERO] --> [2013263232,2013263232] --> OK [0.20132634E10,TO_ZERO] --> [2013263360,2013263360] --> OK [0.20132635E10,TO_ZERO] --> [2013263488,2013263488] --> OK [0.20132636E10,TO_ZERO] --> [2013263616,2013263616] --> OK [0.20132637E10,TO_ZERO] --> [2013263744,2013263744] --> OK [0.20132639E10,TO_ZERO] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_ZERO] --> [2013264000,2013264000] --> OK [0.20132641E10,TO_ZERO] --> [2013264128,2013264128] --> OK [0.20132643E10,TO_ZERO] --> [2013264256,2013264256] --> OK [0.20132644E10,TO_ZERO] --> [2013264384,2013264384] --> OK [0.20132645E10,TO_ZERO] --> [2013264512,2013264512] --> OK [0.20132646E10,TO_ZERO] --> [2013264640,2013264640] --> OK [0.20132648E10,TO_ZERO] --> [2013264768,2013264768] --> OK [0.20132649E10,TO_ZERO] --> [2013264896,2013264896] --> OK [0.2013265E10,TO_ZERO] --> [2013265024,2013265024] --> OK [0.20132652E10,TO_ZERO] --> [2013265152,2013265152] --> OK [0.20132653E10,TO_ZERO] --> [2013265280,2013265280] --> OK [0.20132654E10,TO_ZERO] --> [2013265408,2013265408] --> OK [0.20132655E10,TO_ZERO] --> [2013265536,2013265536] --> OK [0.20132657E10,TO_ZERO] --> [2013265664,2013265664] --> OK [0.20132658E10,TO_ZERO] --> [2013265792,2013265792] --> OK [0.20132659E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132741E10,TO_ZERO] --> [2013274112,2013274112] --> OK [0.2013274E10,TO_ZERO] --> [2013273984,2013273984] --> OK [0.20132739E10,TO_ZERO] --> [2013273856,2013273856] --> OK [0.20132737E10,TO_ZERO] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_ZERO] --> [2013273600,2013273600] --> OK [0.20132735E10,TO_ZERO] --> [2013273472,2013273472] --> OK [0.20132733E10,TO_ZERO] --> [2013273344,2013273344] --> OK [0.20132732E10,TO_ZERO] --> [2013273216,2013273216] --> OK [0.20132731E10,TO_ZERO] --> [2013273088,2013273088] --> OK [0.2013273E10,TO_ZERO] --> [2013272960,2013272960] --> OK [0.20132728E10,TO_ZERO] --> [2013272832,2013272832] --> OK [0.20132727E10,TO_ZERO] --> [2013272704,2013272704] --> OK [0.20132726E10,TO_ZERO] --> [2013272576,2013272576] --> OK [0.20132724E10,TO_ZERO] --> [2013272448,2013272448] --> OK [0.20132723E10,TO_ZERO] --> [2013272320,2013272320] --> OK [0.20132722E10,TO_ZERO] --> [2013272192,2013272192] --> OK [0.2013272E10,TO_ZERO] --> [2013272064,2013272064] --> OK [0.20132719E10,TO_ZERO] --> [2013271936,2013271936] --> OK [0.20132718E10,TO_ZERO] --> [2013271808,2013271808] --> OK [0.20132717E10,TO_ZERO] --> [2013271680,2013271680] --> OK [0.20132716E10,TO_ZERO] --> [2013271552,2013271552] --> OK [0.20132714E10,TO_ZERO] --> [2013271424,2013271424] --> OK [0.20132713E10,TO_ZERO] --> [2013271296,2013271296] --> OK [0.20132712E10,TO_ZERO] --> [2013271168,2013271168] --> OK [0.2013271E10,TO_ZERO] --> [2013271040,2013271040] --> OK [0.20132709E10,TO_ZERO] --> [2013270912,2013270912] --> OK [0.20132708E10,TO_ZERO] --> [2013270784,2013270784] --> OK [0.20132707E10,TO_ZERO] --> [2013270656,2013270656] --> OK [0.20132705E10,TO_ZERO] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_ZERO] --> [2013270400,2013270400] --> OK [0.20132703E10,TO_ZERO] --> [2013270272,2013270272] --> OK [0.20132701E10,TO_ZERO] --> [2013270144,2013270144] --> OK [0.201327E10,TO_ZERO] --> [2013270016,2013270016] --> OK [0.20132699E10,TO_ZERO] --> [2013269888,2013269888] --> OK [0.20132698E10,TO_ZERO] --> [2013269760,2013269760] --> OK [0.20132696E10,TO_ZERO] --> [2013269632,2013269632] --> OK [0.20132695E10,TO_ZERO] --> [2013269504,2013269504] --> OK [0.20132694E10,TO_ZERO] --> [2013269376,2013269376] --> OK [0.20132692E10,TO_ZERO] --> [2013269248,2013269248] --> OK [0.20132691E10,TO_ZERO] --> [2013269120,2013269120] --> OK [0.2013269E10,TO_ZERO] --> [2013268992,2013268992] --> OK [0.20132689E10,TO_ZERO] --> [2013268864,2013268864] --> OK [0.20132687E10,TO_ZERO] --> [2013268736,2013268736] --> OK [0.20132686E10,TO_ZERO] --> [2013268608,2013268608] --> OK [0.20132685E10,TO_ZERO] --> [2013268480,2013268480] --> OK [0.20132684E10,TO_ZERO] --> [2013268352,2013268352] --> OK [0.20132682E10,TO_ZERO] --> [2013268224,2013268224] --> OK [0.20132681E10,TO_ZERO] --> [2013268096,2013268096] --> OK [0.2013268E10,TO_ZERO] --> [2013267968,2013267968] --> OK [0.20132678E10,TO_ZERO] --> [2013267840,2013267840] --> OK [0.20132677E10,TO_ZERO] --> [2013267712,2013267712] --> OK [0.20132676E10,TO_ZERO] --> [2013267584,2013267584] --> OK [0.20132675E10,TO_ZERO] --> [2013267456,2013267456] --> OK [0.20132673E10,TO_ZERO] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_ZERO] --> [2013267200,2013267200] --> OK [0.20132671E10,TO_ZERO] --> [2013267072,2013267072] --> OK [0.2013267E10,TO_ZERO] --> [2013266944,2013266944] --> OK [0.20132668E10,TO_ZERO] --> [2013266816,2013266816] --> OK [0.20132667E10,TO_ZERO] --> [2013266688,2013266688] --> OK [0.20132666E10,TO_ZERO] --> [2013266560,2013266560] --> OK [0.20132664E10,TO_ZERO] --> [2013266432,2013266432] --> OK [0.20132663E10,TO_ZERO] --> [2013266304,2013266304] --> OK [0.20132662E10,TO_ZERO] --> [2013266176,2013266176] --> OK [0.2013266E10,TO_ZERO] --> [2013266048,2013266048] --> OK [0.20803666E10,TO_ZERO] --> [2080366592,2080366592] --> OK [0.20803667E10,TO_ZERO] --> [2080366720,2080366720] --> OK [0.20803668E10,TO_ZERO] --> [2080366848,2080366848] --> OK [0.2080367E10,TO_ZERO] --> [2080366976,2080366976] --> OK [0.20803671E10,TO_ZERO] --> [2080367104,2080367104] --> OK [0.20803672E10,TO_ZERO] --> [2080367232,2080367232] --> OK [0.20803674E10,TO_ZERO] --> [2080367360,2080367360] --> OK [0.20803675E10,TO_ZERO] --> [2080367488,2080367488] --> OK [0.20803676E10,TO_ZERO] --> [2080367616,2080367616] --> OK [0.20803677E10,TO_ZERO] --> [2080367744,2080367744] --> OK [0.20803679E10,TO_ZERO] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_ZERO] --> [2080368000,2080368000] --> OK [0.20803681E10,TO_ZERO] --> [2080368128,2080368128] --> OK [0.20803683E10,TO_ZERO] --> [2080368256,2080368256] --> OK [0.20803684E10,TO_ZERO] --> [2080368384,2080368384] --> OK [0.20803685E10,TO_ZERO] --> [2080368512,2080368512] --> OK [0.20803686E10,TO_ZERO] --> [2080368640,2080368640] --> OK [0.20803688E10,TO_ZERO] --> [2080368768,2080368768] --> OK [0.20803689E10,TO_ZERO] --> [2080368896,2080368896] --> OK [0.2080369E10,TO_ZERO] --> [2080369024,2080369024] --> OK [0.20803692E10,TO_ZERO] --> [2080369152,2080369152] --> OK [0.20803693E10,TO_ZERO] --> [2080369280,2080369280] --> OK [0.20803694E10,TO_ZERO] --> [2080369408,2080369408] --> OK [0.20803695E10,TO_ZERO] --> [2080369536,2080369536] --> OK [0.20803697E10,TO_ZERO] --> [2080369664,2080369664] --> OK [0.20803698E10,TO_ZERO] --> [2080369792,2080369792] --> OK [0.20803699E10,TO_ZERO] --> [2080369920,2080369920] --> OK [0.208037E10,TO_ZERO] --> [2080370048,2080370048] --> OK [0.20803702E10,TO_ZERO] --> [2080370176,2080370176] --> OK [0.20803703E10,TO_ZERO] --> [2080370304,2080370304] --> OK [0.20803704E10,TO_ZERO] --> [2080370432,2080370432] --> OK [0.20803706E10,TO_ZERO] --> [2080370560,2080370560] --> OK [0.20803707E10,TO_ZERO] --> [2080370688,2080370688] --> OK [0.20803708E10,TO_ZERO] --> [2080370816,2080370816] --> OK [0.2080371E10,TO_ZERO] --> [2080370944,2080370944] --> OK [0.20803711E10,TO_ZERO] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_ZERO] --> [2080371200,2080371200] --> OK [0.20803713E10,TO_ZERO] --> [2080371328,2080371328] --> OK [0.20803715E10,TO_ZERO] --> [2080371456,2080371456] --> OK [0.20803716E10,TO_ZERO] --> [2080371584,2080371584] --> OK [0.20803717E10,TO_ZERO] --> [2080371712,2080371712] --> OK [0.20803718E10,TO_ZERO] --> [2080371840,2080371840] --> OK [0.2080372E10,TO_ZERO] --> [2080371968,2080371968] --> OK [0.20803721E10,TO_ZERO] --> [2080372096,2080372096] --> OK [0.20803722E10,TO_ZERO] --> [2080372224,2080372224] --> OK [0.20803724E10,TO_ZERO] --> [2080372352,2080372352] --> OK [0.20803725E10,TO_ZERO] --> [2080372480,2080372480] --> OK [0.20803726E10,TO_ZERO] --> [2080372608,2080372608] --> OK [0.20803727E10,TO_ZERO] --> [2080372736,2080372736] --> OK [0.20803729E10,TO_ZERO] --> [2080372864,2080372864] --> OK [0.2080373E10,TO_ZERO] --> [2080372992,2080372992] --> OK [0.20803731E10,TO_ZERO] --> [2080373120,2080373120] --> OK [0.20803732E10,TO_ZERO] --> [2080373248,2080373248] --> OK [0.20803734E10,TO_ZERO] --> [2080373376,2080373376] --> OK [0.20803735E10,TO_ZERO] --> [2080373504,2080373504] --> OK [0.20803736E10,TO_ZERO] --> [2080373632,2080373632] --> OK [0.20803738E10,TO_ZERO] --> [2080373760,2080373760] --> OK [0.20803739E10,TO_ZERO] --> [2080373888,2080373888] --> OK [0.2080374E10,TO_ZERO] --> [2080374016,2080374016] --> OK [0.20803741E10,TO_ZERO] --> [2080374144,2080374144] --> OK [0.20803743E10,TO_ZERO] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_ZERO] --> [2080374400,2080374400] --> OK [0.20803745E10,TO_ZERO] --> [2080374528,2080374528] --> OK [0.20803747E10,TO_ZERO] --> [2080374656,2080374656] --> OK [0.20803748E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080383E10,TO_ZERO] --> [2080382976,2080382976] --> OK [0.20803828E10,TO_ZERO] --> [2080382848,2080382848] --> OK [0.20803827E10,TO_ZERO] --> [2080382720,2080382720] --> OK [0.20803826E10,TO_ZERO] --> [2080382592,2080382592] --> OK [0.20803825E10,TO_ZERO] --> [2080382464,2080382464] --> OK [0.20803823E10,TO_ZERO] --> [2080382336,2080382336] --> OK [0.20803822E10,TO_ZERO] --> [2080382208,2080382208] --> OK [0.20803821E10,TO_ZERO] --> [2080382080,2080382080] --> OK [0.2080382E10,TO_ZERO] --> [2080381952,2080381952] --> OK [0.20803818E10,TO_ZERO] --> [2080381824,2080381824] --> OK [0.20803817E10,TO_ZERO] --> [2080381696,2080381696] --> OK [0.20803816E10,TO_ZERO] --> [2080381568,2080381568] --> OK [0.20803814E10,TO_ZERO] --> [2080381440,2080381440] --> OK [0.20803813E10,TO_ZERO] --> [2080381312,2080381312] --> OK [0.20803812E10,TO_ZERO] --> [2080381184,2080381184] --> OK [0.2080381E10,TO_ZERO] --> [2080381056,2080381056] --> OK [0.20803809E10,TO_ZERO] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_ZERO] --> [2080380800,2080380800] --> OK [0.20803807E10,TO_ZERO] --> [2080380672,2080380672] --> OK [0.20803805E10,TO_ZERO] --> [2080380544,2080380544] --> OK [0.20803804E10,TO_ZERO] --> [2080380416,2080380416] --> OK [0.20803803E10,TO_ZERO] --> [2080380288,2080380288] --> OK [0.20803802E10,TO_ZERO] --> [2080380160,2080380160] --> OK [0.208038E10,TO_ZERO] --> [2080380032,2080380032] --> OK [0.20803799E10,TO_ZERO] --> [2080379904,2080379904] --> OK [0.20803798E10,TO_ZERO] --> [2080379776,2080379776] --> OK [0.20803796E10,TO_ZERO] --> [2080379648,2080379648] --> OK [0.20803795E10,TO_ZERO] --> [2080379520,2080379520] --> OK [0.20803794E10,TO_ZERO] --> [2080379392,2080379392] --> OK [0.20803793E10,TO_ZERO] --> [2080379264,2080379264] --> OK [0.20803791E10,TO_ZERO] --> [2080379136,2080379136] --> OK [0.2080379E10,TO_ZERO] --> [2080379008,2080379008] --> OK [0.20803789E10,TO_ZERO] --> [2080378880,2080378880] --> OK [0.20803788E10,TO_ZERO] --> [2080378752,2080378752] --> OK [0.20803786E10,TO_ZERO] --> [2080378624,2080378624] --> OK [0.20803785E10,TO_ZERO] --> [2080378496,2080378496] --> OK [0.20803784E10,TO_ZERO] --> [2080378368,2080378368] --> OK [0.20803782E10,TO_ZERO] --> [2080378240,2080378240] --> OK [0.20803781E10,TO_ZERO] --> [2080378112,2080378112] --> OK [0.2080378E10,TO_ZERO] --> [2080377984,2080377984] --> OK [0.20803779E10,TO_ZERO] --> [2080377856,2080377856] --> OK [0.20803777E10,TO_ZERO] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_ZERO] --> [2080377600,2080377600] --> OK [0.20803775E10,TO_ZERO] --> [2080377472,2080377472] --> OK [0.20803773E10,TO_ZERO] --> [2080377344,2080377344] --> OK [0.20803772E10,TO_ZERO] --> [2080377216,2080377216] --> OK [0.20803771E10,TO_ZERO] --> [2080377088,2080377088] --> OK [0.2080377E10,TO_ZERO] --> [2080376960,2080376960] --> OK [0.20803768E10,TO_ZERO] --> [2080376832,2080376832] --> OK [0.20803767E10,TO_ZERO] --> [2080376704,2080376704] --> OK [0.20803766E10,TO_ZERO] --> [2080376576,2080376576] --> OK [0.20803764E10,TO_ZERO] --> [2080376448,2080376448] --> OK [0.20803763E10,TO_ZERO] --> [2080376320,2080376320] --> OK [0.20803762E10,TO_ZERO] --> [2080376192,2080376192] --> OK [0.2080376E10,TO_ZERO] --> [2080376064,2080376064] --> OK [0.20803759E10,TO_ZERO] --> [2080375936,2080375936] --> OK [0.20803758E10,TO_ZERO] --> [2080375808,2080375808] --> OK [0.20803757E10,TO_ZERO] --> [2080375680,2080375680] --> OK [0.20803756E10,TO_ZERO] --> [2080375552,2080375552] --> OK [0.20803754E10,TO_ZERO] --> [2080375424,2080375424] --> OK [0.20803753E10,TO_ZERO] --> [2080375296,2080375296] --> OK [0.20803752E10,TO_ZERO] --> [2080375168,2080375168] --> OK [0.2080375E10,TO_ZERO] --> [2080375040,2080375040] --> OK [0.20803749E10,TO_ZERO] --> [2080374912,2080374912] --> OK [0.2113921E10,TO_ZERO] --> [2113921024,2113921024] --> OK [0.21139212E10,TO_ZERO] --> [2113921152,2113921152] --> OK [0.21139213E10,TO_ZERO] --> [2113921280,2113921280] --> OK [0.21139214E10,TO_ZERO] --> [2113921408,2113921408] --> OK [0.21139215E10,TO_ZERO] --> [2113921536,2113921536] --> OK [0.21139217E10,TO_ZERO] --> [2113921664,2113921664] --> OK [0.21139218E10,TO_ZERO] --> [2113921792,2113921792] --> OK [0.21139219E10,TO_ZERO] --> [2113921920,2113921920] --> OK [0.2113922E10,TO_ZERO] --> [2113922048,2113922048] --> OK [0.21139222E10,TO_ZERO] --> [2113922176,2113922176] --> OK [0.21139223E10,TO_ZERO] --> [2113922304,2113922304] --> OK [0.21139224E10,TO_ZERO] --> [2113922432,2113922432] --> OK [0.21139226E10,TO_ZERO] --> [2113922560,2113922560] --> OK [0.21139227E10,TO_ZERO] --> [2113922688,2113922688] --> OK [0.21139228E10,TO_ZERO] --> [2113922816,2113922816] --> OK [0.2113923E10,TO_ZERO] --> [2113922944,2113922944] --> OK [0.21139231E10,TO_ZERO] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_ZERO] --> [2113923200,2113923200] --> OK [0.21139233E10,TO_ZERO] --> [2113923328,2113923328] --> OK [0.21139235E10,TO_ZERO] --> [2113923456,2113923456] --> OK [0.21139236E10,TO_ZERO] --> [2113923584,2113923584] --> OK [0.21139237E10,TO_ZERO] --> [2113923712,2113923712] --> OK [0.21139238E10,TO_ZERO] --> [2113923840,2113923840] --> OK [0.2113924E10,TO_ZERO] --> [2113923968,2113923968] --> OK [0.21139241E10,TO_ZERO] --> [2113924096,2113924096] --> OK [0.21139242E10,TO_ZERO] --> [2113924224,2113924224] --> OK [0.21139244E10,TO_ZERO] --> [2113924352,2113924352] --> OK [0.21139245E10,TO_ZERO] --> [2113924480,2113924480] --> OK [0.21139246E10,TO_ZERO] --> [2113924608,2113924608] --> OK [0.21139247E10,TO_ZERO] --> [2113924736,2113924736] --> OK [0.21139249E10,TO_ZERO] --> [2113924864,2113924864] --> OK [0.2113925E10,TO_ZERO] --> [2113924992,2113924992] --> OK [0.21139251E10,TO_ZERO] --> [2113925120,2113925120] --> OK [0.21139252E10,TO_ZERO] --> [2113925248,2113925248] --> OK [0.21139254E10,TO_ZERO] --> [2113925376,2113925376] --> OK [0.21139255E10,TO_ZERO] --> [2113925504,2113925504] --> OK [0.21139256E10,TO_ZERO] --> [2113925632,2113925632] --> OK [0.21139258E10,TO_ZERO] --> [2113925760,2113925760] --> OK [0.21139259E10,TO_ZERO] --> [2113925888,2113925888] --> OK [0.2113926E10,TO_ZERO] --> [2113926016,2113926016] --> OK [0.21139261E10,TO_ZERO] --> [2113926144,2113926144] --> OK [0.21139263E10,TO_ZERO] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_ZERO] --> [2113926400,2113926400] --> OK [0.21139265E10,TO_ZERO] --> [2113926528,2113926528] --> OK [0.21139267E10,TO_ZERO] --> [2113926656,2113926656] --> OK [0.21139268E10,TO_ZERO] --> [2113926784,2113926784] --> OK [0.21139269E10,TO_ZERO] --> [2113926912,2113926912] --> OK [0.2113927E10,TO_ZERO] --> [2113927040,2113927040] --> OK [0.21139272E10,TO_ZERO] --> [2113927168,2113927168] --> OK [0.21139273E10,TO_ZERO] --> [2113927296,2113927296] --> OK [0.21139274E10,TO_ZERO] --> [2113927424,2113927424] --> OK [0.21139276E10,TO_ZERO] --> [2113927552,2113927552] --> OK [0.21139277E10,TO_ZERO] --> [2113927680,2113927680] --> OK [0.21139278E10,TO_ZERO] --> [2113927808,2113927808] --> OK [0.2113928E10,TO_ZERO] --> [2113927936,2113927936] --> OK [0.21139281E10,TO_ZERO] --> [2113928064,2113928064] --> OK [0.21139282E10,TO_ZERO] --> [2113928192,2113928192] --> OK [0.21139283E10,TO_ZERO] --> [2113928320,2113928320] --> OK [0.21139284E10,TO_ZERO] --> [2113928448,2113928448] --> OK [0.21139286E10,TO_ZERO] --> [2113928576,2113928576] --> OK [0.21139287E10,TO_ZERO] --> [2113928704,2113928704] --> OK [0.21139288E10,TO_ZERO] --> [2113928832,2113928832] --> OK [0.2113929E10,TO_ZERO] --> [2113928960,2113928960] --> OK [0.21139291E10,TO_ZERO] --> [2113929088,2113929088] --> OK [0.21139292E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139374E10,TO_ZERO] --> [2113937408,2113937408] --> OK [0.21139373E10,TO_ZERO] --> [2113937280,2113937280] --> OK [0.21139372E10,TO_ZERO] --> [2113937152,2113937152] --> OK [0.2113937E10,TO_ZERO] --> [2113937024,2113937024] --> OK [0.21139369E10,TO_ZERO] --> [2113936896,2113936896] --> OK [0.21139368E10,TO_ZERO] --> [2113936768,2113936768] --> OK [0.21139366E10,TO_ZERO] --> [2113936640,2113936640] --> OK [0.21139365E10,TO_ZERO] --> [2113936512,2113936512] --> OK [0.21139364E10,TO_ZERO] --> [2113936384,2113936384] --> OK [0.21139363E10,TO_ZERO] --> [2113936256,2113936256] --> OK [0.21139361E10,TO_ZERO] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_ZERO] --> [2113936000,2113936000] --> OK [0.21139359E10,TO_ZERO] --> [2113935872,2113935872] --> OK [0.21139357E10,TO_ZERO] --> [2113935744,2113935744] --> OK [0.21139356E10,TO_ZERO] --> [2113935616,2113935616] --> OK [0.21139355E10,TO_ZERO] --> [2113935488,2113935488] --> OK [0.21139354E10,TO_ZERO] --> [2113935360,2113935360] --> OK [0.21139352E10,TO_ZERO] --> [2113935232,2113935232] --> OK [0.21139351E10,TO_ZERO] --> [2113935104,2113935104] --> OK [0.2113935E10,TO_ZERO] --> [2113934976,2113934976] --> OK [0.21139348E10,TO_ZERO] --> [2113934848,2113934848] --> OK [0.21139347E10,TO_ZERO] --> [2113934720,2113934720] --> OK [0.21139346E10,TO_ZERO] --> [2113934592,2113934592] --> OK [0.21139345E10,TO_ZERO] --> [2113934464,2113934464] --> OK [0.21139343E10,TO_ZERO] --> [2113934336,2113934336] --> OK [0.21139342E10,TO_ZERO] --> [2113934208,2113934208] --> OK [0.21139341E10,TO_ZERO] --> [2113934080,2113934080] --> OK [0.2113934E10,TO_ZERO] --> [2113933952,2113933952] --> OK [0.21139338E10,TO_ZERO] --> [2113933824,2113933824] --> OK [0.21139337E10,TO_ZERO] --> [2113933696,2113933696] --> OK [0.21139336E10,TO_ZERO] --> [2113933568,2113933568] --> OK [0.21139334E10,TO_ZERO] --> [2113933440,2113933440] --> OK [0.21139333E10,TO_ZERO] --> [2113933312,2113933312] --> OK [0.21139332E10,TO_ZERO] --> [2113933184,2113933184] --> OK [0.2113933E10,TO_ZERO] --> [2113933056,2113933056] --> OK [0.21139329E10,TO_ZERO] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_ZERO] --> [2113932800,2113932800] --> OK [0.21139327E10,TO_ZERO] --> [2113932672,2113932672] --> OK [0.21139325E10,TO_ZERO] --> [2113932544,2113932544] --> OK [0.21139324E10,TO_ZERO] --> [2113932416,2113932416] --> OK [0.21139323E10,TO_ZERO] --> [2113932288,2113932288] --> OK [0.21139322E10,TO_ZERO] --> [2113932160,2113932160] --> OK [0.2113932E10,TO_ZERO] --> [2113932032,2113932032] --> OK [0.21139319E10,TO_ZERO] --> [2113931904,2113931904] --> OK [0.21139318E10,TO_ZERO] --> [2113931776,2113931776] --> OK [0.21139316E10,TO_ZERO] --> [2113931648,2113931648] --> OK [0.21139315E10,TO_ZERO] --> [2113931520,2113931520] --> OK [0.21139314E10,TO_ZERO] --> [2113931392,2113931392] --> OK [0.21139313E10,TO_ZERO] --> [2113931264,2113931264] --> OK [0.21139311E10,TO_ZERO] --> [2113931136,2113931136] --> OK [0.2113931E10,TO_ZERO] --> [2113931008,2113931008] --> OK [0.21139309E10,TO_ZERO] --> [2113930880,2113930880] --> OK [0.21139308E10,TO_ZERO] --> [2113930752,2113930752] --> OK [0.21139306E10,TO_ZERO] --> [2113930624,2113930624] --> OK [0.21139305E10,TO_ZERO] --> [2113930496,2113930496] --> OK [0.21139304E10,TO_ZERO] --> [2113930368,2113930368] --> OK [0.21139302E10,TO_ZERO] --> [2113930240,2113930240] --> OK [0.21139301E10,TO_ZERO] --> [2113930112,2113930112] --> OK [0.211393E10,TO_ZERO] --> [2113929984,2113929984] --> OK [0.21139299E10,TO_ZERO] --> [2113929856,2113929856] --> OK [0.21139297E10,TO_ZERO] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_ZERO] --> [2113929600,2113929600] --> OK [0.21139295E10,TO_ZERO] --> [2113929472,2113929472] --> OK [0.21139293E10,TO_ZERO] --> [2113929344,2113929344] --> OK [0.21474755E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.214748E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.21475E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.214749E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.214748E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.21475E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.214749E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.214748E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.21475E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.214749E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.21474755E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.21474756E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.21474757E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.21474758E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147476E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.21474761E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.21474762E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.21474764E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.21474765E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.21474766E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.21474767E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.21474769E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147477E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.21474771E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.21474772E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.21474774E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.21474775E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.21474776E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.21474778E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.21474779E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.21474781E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.21474783E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.21474785E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.21474787E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.21474788E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.21474789E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.2147479E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.21474792E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.21474793E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.21474794E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.21474796E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.21474797E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.21474798E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.21474799E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.214748E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.21474802E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.21474803E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.21474804E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.21474806E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.21474807E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.21474808E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.2147481E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.21474811E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.21474812E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.21474813E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.21474815E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.21474817E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.21474819E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147482E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.21474821E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.21474822E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.21474824E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.21474825E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.21474826E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.21474828E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.21474829E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.21474831E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.21474833E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.21474834E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.21474835E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.21474836E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.21475E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.21474998E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.21474995E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.21474993E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.21474988E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.21474985E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.21474982E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147498E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.21474977E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.21474975E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.21474972E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.2147497E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.21474967E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.21474964E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.21474962E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147496E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.21474957E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.21474954E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.21474952E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147495E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.21474947E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.21474941E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147494E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.21474936E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.21474934E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.2147493E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.21474929E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.21474926E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.21474924E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.21474918E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.21474916E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.21474913E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.21474908E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.21474906E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.21474903E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.214749E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.21474898E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.21474895E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.21474893E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.21474888E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.21474885E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.21474883E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.21474877E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.21474875E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.21474872E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147487E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.21474867E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.21474865E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.21474862E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147486E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.21474857E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.21474854E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.21474852E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147485E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.21474847E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.21474844E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.21474842E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147484E10,TO_ZERO] --> [Overflow,2147483904] --> OK [~2147483648,~2147483648] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2147483647,~2147483647] --> [~0.2147483647E10,~0.2147483647E10] --> OK [~2147483646,~2147483646] --> [~0.2147483646E10,~0.2147483646E10] --> OK [~2147483645,~2147483645] --> [~0.2147483645E10,~0.2147483645E10] --> OK [~2113929217,~2113929217] --> [~0.2113929217E10,~0.2113929217E10] --> OK [~2080374785,~2080374785] --> [~0.2080374785E10,~0.2080374785E10] --> OK [~2013265921,~2013265921] --> [~0.2013265921E10,~0.2013265921E10] --> OK [~1879048193,~1879048193] --> [~0.1879048193E10,~0.1879048193E10] --> OK [~1610612737,~1610612737] --> [~0.1610612737E10,~0.1610612737E10] --> OK [~1073741825,~1073741825] --> [~0.1073741825E10,~0.1073741825E10] --> OK [~3,~3] --> [~0.3E1,~0.3E1] --> OK [~2,~2] --> [~0.2E1,~0.2E1] --> OK [~1,~1] --> [~0.1E1,~0.1E1] --> OK [0,0] --> [0.0,0.0] --> OK [1,1] --> [0.1E1,0.1E1] --> OK [2,2] --> [0.2E1,0.2E1] --> OK [3,3] --> [0.3E1,0.3E1] --> OK [1073741824,1073741824] --> [0.1073741824E10,0.1073741824E10] --> OK [1610612736,1610612736] --> [0.1610612736E10,0.1610612736E10] --> OK [1879048192,1879048192] --> [0.1879048192E10,0.1879048192E10] --> OK [2013265920,2013265920] --> [0.201326592E10,0.201326592E10] --> OK [2080374784,2080374784] --> [0.2080374784E10,0.2080374784E10] --> OK [2113929216,2113929216] --> [0.2113929216E10,0.2113929216E10] --> OK [2147483644,2147483644] --> [0.2147483644E10,0.2147483644E10] --> OK [2147483645,2147483645] --> [0.2147483645E10,0.2147483645E10] --> OK [2147483646,2147483646] --> [0.2147483646E10,0.2147483646E10] --> OK [2147483647,2147483647] --> [0.2147483647E10,0.2147483647E10] --> OK [~0.21474836480000305E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999985E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999852E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999855E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999857E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999986E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999862E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999864E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999866E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999987E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999871E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999874E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999876E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999878E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999988E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999883E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999886E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999888E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999989E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999893E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999895E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999897E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364799999E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999902E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999905E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999907E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999991E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999912E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999914E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999917E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999992E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999921E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999924E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999926E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999928E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999993E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999933E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999936E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999938E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999994E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999943E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999945E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999948E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999995E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999952E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999955E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999957E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999996E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999962E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999964E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999967E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999997E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999971E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999974E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999976E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999979E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999998E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999983E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999986E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999988E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999999E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999993E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999995E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999998E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836470000153E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999985E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999852E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999855E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999857E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999986E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999862E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999864E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999866E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999987E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999871E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999874E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999876E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999878E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999988E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999883E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999886E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999888E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999989E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999893E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999895E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999897E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.214748364699999E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999902E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999905E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999907E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999991E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999912E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999914E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999917E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999992E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999921E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999924E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999926E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999928E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999993E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999933E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999936E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999938E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999994E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999943E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999945E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999948E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999995E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999952E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999955E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999957E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999996E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999962E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999964E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999967E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999997E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999971E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999974E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999976E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999979E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999998E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999983E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999986E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999988E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999999E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999993E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999995E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999998E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836460000153E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999985E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999852E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999855E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999857E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999986E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999862E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999864E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999866E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999987E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999871E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999874E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999876E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999878E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999988E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999883E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999886E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999888E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999989E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999893E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999895E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999897E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.214748364599999E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999902E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999905E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999907E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999991E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999912E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999914E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999917E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999992E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999921E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999924E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999926E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999928E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999993E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999933E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999936E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999938E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999994E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999943E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999945E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999948E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999995E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999952E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999955E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999957E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999996E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999962E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999964E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999967E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999997E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999971E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999974E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999976E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999979E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999998E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999983E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999986E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999988E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999999E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999993E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999995E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999998E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836450000153E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999985E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999852E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999855E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999857E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999986E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999862E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999864E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999866E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999987E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999871E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999874E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999876E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999878E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999988E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999883E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999886E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999888E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999989E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999893E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999895E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999897E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.214748364499999E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999902E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999905E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999907E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999991E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999912E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999914E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999917E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999992E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999921E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999924E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999926E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999928E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999993E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999933E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999936E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999938E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999994E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999943E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999945E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999948E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999995E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999952E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999955E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999957E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999996E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999962E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999964E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999967E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999997E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999971E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999974E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999976E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999979E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999998E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999983E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999986E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999988E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999999E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999993E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999995E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999998E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21139292170000153E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999985E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999852E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999855E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999857E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999986E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999862E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999864E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999866E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999987E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999871E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999874E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999876E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999878E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999988E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999883E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999886E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999888E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999989E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999893E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999895E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999897E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.211392921699999E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999902E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999905E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999907E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999991E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999912E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999914E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999917E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999992E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999921E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999924E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999926E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999928E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999993E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999933E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999936E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999938E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999994E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999943E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999945E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999948E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999995E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999952E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999955E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999957E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999996E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999962E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999964E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999967E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999997E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999971E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999974E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999976E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999979E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999998E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999983E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999986E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999988E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999999E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999993E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999995E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999998E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.20803747850000153E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999985E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999852E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999855E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999857E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999986E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999862E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999864E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999866E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999987E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999871E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999874E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999876E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999878E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999988E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999883E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999886E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999888E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999989E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999893E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999895E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999897E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.208037478499999E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999902E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999905E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999907E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999991E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999912E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999914E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999917E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999992E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999921E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999924E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999926E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999928E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999993E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999933E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999936E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999938E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999994E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999943E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999945E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999948E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999995E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999952E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999955E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999957E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999996E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999962E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999964E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999967E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999997E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999971E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999974E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999976E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999979E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999998E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999983E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999986E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999988E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999999E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999993E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999995E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999998E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20132659210000153E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999985E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999852E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999855E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999857E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999986E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999862E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999864E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999866E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999987E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999871E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999874E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999876E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999878E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999988E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999883E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999886E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999888E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999989E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999893E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999895E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999897E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.201326592099999E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999902E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999905E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999907E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999991E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999912E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999914E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999917E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999992E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999921E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999924E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999926E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999928E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999993E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999933E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999936E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999938E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999994E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999943E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999945E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999948E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999995E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999952E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999955E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999957E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999996E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999962E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999964E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999967E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999997E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999971E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999974E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999976E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999979E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999998E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999983E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999986E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999988E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999999E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999993E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999995E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999998E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.18790481930000153E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999985E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999852E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999855E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999857E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999986E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999862E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999864E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999866E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999987E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999871E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999874E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999876E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999878E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999988E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999883E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999886E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999888E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999989E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999893E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999895E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999897E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.187904819299999E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999902E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999905E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999907E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999991E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999912E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999914E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999917E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999992E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999921E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999924E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999926E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999928E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999993E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999933E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999936E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999938E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999994E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999943E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999945E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999948E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999995E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999952E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999955E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999957E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999996E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999962E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999964E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999967E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999997E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999971E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999974E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999976E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999979E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999998E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999983E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999986E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999988E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999999E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999993E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999995E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999998E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.16106127370000153E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999985E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999852E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999855E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999857E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999986E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999862E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999864E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999866E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999987E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999871E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999874E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999876E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999878E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999988E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999883E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999886E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999888E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999989E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999893E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999895E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999897E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.161061273699999E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999902E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999905E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999907E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999991E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999912E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999914E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999917E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999992E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999921E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999924E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999926E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999928E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999993E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999933E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999936E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999938E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999994E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999943E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999945E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999948E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999995E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999952E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999955E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999957E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999996E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999962E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999964E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999967E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999997E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999971E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999974E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999976E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999979E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999998E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999983E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999986E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999988E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999999E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999993E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999995E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999998E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.10737418250000153E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999985E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999852E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999855E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999857E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999986E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999862E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999864E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999866E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999987E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999871E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999874E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999876E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999878E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999988E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999883E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999886E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999888E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999989E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999893E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999895E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999897E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.107374182499999E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999902E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999905E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999907E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999991E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999912E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999914E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999917E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999992E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999921E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999924E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999926E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999928E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999993E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999933E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999936E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999938E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999994E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999943E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999945E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999948E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999995E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999952E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999955E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999957E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999996E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999962E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999964E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999967E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999997E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999971E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999974E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999976E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999979E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999998E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999983E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999986E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999988E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999999E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999993E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999995E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999998E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.30000000000000284E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300000000000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300000000000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999972E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999725E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999973E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999734E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999974E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999742E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999747E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999975E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999756E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999976E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999765E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999977E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999774E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999978E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999782E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999787E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999979E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999796E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999999999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999805E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999981E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999813E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999982E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999822E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999827E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999983E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999836E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999984E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999845E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999985E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999853E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999862E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999867E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999876E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999885E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999989E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999893E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999999999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999902E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999907E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999991E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999916E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999992E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999925E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999933E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999994E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999942E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999947E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999956E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999964E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999997E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999973E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999982E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.20000000000000284E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200000000000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200000000000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999986E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999862E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999865E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999867E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999871E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999873E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999876E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999878E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999988E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999882E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999885E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999887E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999989E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999891E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999893E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999896E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999898E1,TO_NEAREST] --> [~2,~2] --> OK [~0.199999999999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999902E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999905E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999907E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999991E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999911E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999913E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999916E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999918E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999992E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999922E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999925E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999927E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999931E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999933E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999936E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999938E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999942E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999944E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999947E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999951E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999953E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999956E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999958E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999962E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999964E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999967E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999997E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999971E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999973E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999976E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999978E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999982E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999984E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999991E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.10000000000000142E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_NEAREST] --> [~1,~1] --> OK [~0.100000000000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1E1,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999929,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999993,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999931,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999932,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999933,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999934,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999936,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999937,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999938,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999939,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999941,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999942,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999943,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999944,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999946,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999947,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999948,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999949,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999995,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999951,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999952,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999953,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999954,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999956,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999957,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999958,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999959,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999996,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999961,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999962,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999963,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999966,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999967,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999968,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999969,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999971,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999972,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999973,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999974,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999977,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999978,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999979,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999981,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999982,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999983,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999984,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999986,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999987,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999988,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999989,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999999,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999991,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999992,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999993,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999996,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999999,TO_NEAREST] --> [~1,~1] --> OK [~0.316E~321,TO_NEAREST] --> [0,0] --> OK [~0.31E~321,TO_NEAREST] --> [0,0] --> OK [~0.306E~321,TO_NEAREST] --> [0,0] --> OK [~0.3E~321,TO_NEAREST] --> [0,0] --> OK [~0.296E~321,TO_NEAREST] --> [0,0] --> OK [~0.29E~321,TO_NEAREST] --> [0,0] --> OK [~0.287E~321,TO_NEAREST] --> [0,0] --> OK [~0.28E~321,TO_NEAREST] --> [0,0] --> OK [~0.277E~321,TO_NEAREST] --> [0,0] --> OK [~0.27E~321,TO_NEAREST] --> [0,0] --> OK [~0.267E~321,TO_NEAREST] --> [0,0] --> OK [~0.26E~321,TO_NEAREST] --> [0,0] --> OK [~0.257E~321,TO_NEAREST] --> [0,0] --> OK [~0.25E~321,TO_NEAREST] --> [0,0] --> OK [~0.247E~321,TO_NEAREST] --> [0,0] --> OK [~0.24E~321,TO_NEAREST] --> [0,0] --> OK [~0.237E~321,TO_NEAREST] --> [0,0] --> OK [~0.23E~321,TO_NEAREST] --> [0,0] --> OK [~0.227E~321,TO_NEAREST] --> [0,0] --> OK [~0.22E~321,TO_NEAREST] --> [0,0] --> OK [~0.217E~321,TO_NEAREST] --> [0,0] --> OK [~0.21E~321,TO_NEAREST] --> [0,0] --> OK [~0.208E~321,TO_NEAREST] --> [0,0] --> OK [~0.203E~321,TO_NEAREST] --> [0,0] --> OK [~0.2E~321,TO_NEAREST] --> [0,0] --> OK [~0.193E~321,TO_NEAREST] --> [0,0] --> OK [~0.19E~321,TO_NEAREST] --> [0,0] --> OK [~0.183E~321,TO_NEAREST] --> [0,0] --> OK [~0.18E~321,TO_NEAREST] --> [0,0] --> OK [~0.173E~321,TO_NEAREST] --> [0,0] --> OK [~0.17E~321,TO_NEAREST] --> [0,0] --> OK [~0.163E~321,TO_NEAREST] --> [0,0] --> OK [~0.16E~321,TO_NEAREST] --> [0,0] --> OK [~0.153E~321,TO_NEAREST] --> [0,0] --> OK [~0.15E~321,TO_NEAREST] --> [0,0] --> OK [~0.143E~321,TO_NEAREST] --> [0,0] --> OK [~0.14E~321,TO_NEAREST] --> [0,0] --> OK [~0.133E~321,TO_NEAREST] --> [0,0] --> OK [~0.13E~321,TO_NEAREST] --> [0,0] --> OK [~0.124E~321,TO_NEAREST] --> [0,0] --> OK [~0.12E~321,TO_NEAREST] --> [0,0] --> OK [~0.114E~321,TO_NEAREST] --> [0,0] --> OK [~0.11E~321,TO_NEAREST] --> [0,0] --> OK [~0.104E~321,TO_NEAREST] --> [0,0] --> OK [~0.1E~321,TO_NEAREST] --> [0,0] --> OK [~0.94E~322,TO_NEAREST] --> [0,0] --> OK [~0.9E~322,TO_NEAREST] --> [0,0] --> OK [~0.84E~322,TO_NEAREST] --> [0,0] --> OK [~0.8E~322,TO_NEAREST] --> [0,0] --> OK [~0.74E~322,TO_NEAREST] --> [0,0] --> OK [~0.7E~322,TO_NEAREST] --> [0,0] --> OK [~0.64E~322,TO_NEAREST] --> [0,0] --> OK [~0.6E~322,TO_NEAREST] --> [0,0] --> OK [~0.54E~322,TO_NEAREST] --> [0,0] --> OK [~0.5E~322,TO_NEAREST] --> [0,0] --> OK [~0.44E~322,TO_NEAREST] --> [0,0] --> OK [~0.4E~322,TO_NEAREST] --> [0,0] --> OK [~0.35E~322,TO_NEAREST] --> [0,0] --> OK [~0.3E~322,TO_NEAREST] --> [0,0] --> OK [~0.25E~322,TO_NEAREST] --> [0,0] --> OK [~0.2E~322,TO_NEAREST] --> [0,0] --> OK [~0.15E~322,TO_NEAREST] --> [0,0] --> OK [~0.1E~322,TO_NEAREST] --> [0,0] --> OK [~0.5E~323,TO_NEAREST] --> [0,0] --> OK [0.0,TO_NEAREST] --> [0,0] --> OK [0.316E~321,TO_NEAREST] --> [0,0] --> OK [0.31E~321,TO_NEAREST] --> [0,0] --> OK [0.306E~321,TO_NEAREST] --> [0,0] --> OK [0.3E~321,TO_NEAREST] --> [0,0] --> OK [0.296E~321,TO_NEAREST] --> [0,0] --> OK [0.29E~321,TO_NEAREST] --> [0,0] --> OK [0.287E~321,TO_NEAREST] --> [0,0] --> OK [0.28E~321,TO_NEAREST] --> [0,0] --> OK [0.277E~321,TO_NEAREST] --> [0,0] --> OK [0.27E~321,TO_NEAREST] --> [0,0] --> OK [0.267E~321,TO_NEAREST] --> [0,0] --> OK [0.26E~321,TO_NEAREST] --> [0,0] --> OK [0.257E~321,TO_NEAREST] --> [0,0] --> OK [0.25E~321,TO_NEAREST] --> [0,0] --> OK [0.247E~321,TO_NEAREST] --> [0,0] --> OK [0.24E~321,TO_NEAREST] --> [0,0] --> OK [0.237E~321,TO_NEAREST] --> [0,0] --> OK [0.23E~321,TO_NEAREST] --> [0,0] --> OK [0.227E~321,TO_NEAREST] --> [0,0] --> OK [0.22E~321,TO_NEAREST] --> [0,0] --> OK [0.217E~321,TO_NEAREST] --> [0,0] --> OK [0.21E~321,TO_NEAREST] --> [0,0] --> OK [0.208E~321,TO_NEAREST] --> [0,0] --> OK [0.203E~321,TO_NEAREST] --> [0,0] --> OK [0.2E~321,TO_NEAREST] --> [0,0] --> OK [0.193E~321,TO_NEAREST] --> [0,0] --> OK [0.19E~321,TO_NEAREST] --> [0,0] --> OK [0.183E~321,TO_NEAREST] --> [0,0] --> OK [0.18E~321,TO_NEAREST] --> [0,0] --> OK [0.173E~321,TO_NEAREST] --> [0,0] --> OK [0.17E~321,TO_NEAREST] --> [0,0] --> OK [0.163E~321,TO_NEAREST] --> [0,0] --> OK [0.16E~321,TO_NEAREST] --> [0,0] --> OK [0.153E~321,TO_NEAREST] --> [0,0] --> OK [0.15E~321,TO_NEAREST] --> [0,0] --> OK [0.143E~321,TO_NEAREST] --> [0,0] --> OK [0.14E~321,TO_NEAREST] --> [0,0] --> OK [0.133E~321,TO_NEAREST] --> [0,0] --> OK [0.13E~321,TO_NEAREST] --> [0,0] --> OK [0.124E~321,TO_NEAREST] --> [0,0] --> OK [0.12E~321,TO_NEAREST] --> [0,0] --> OK [0.114E~321,TO_NEAREST] --> [0,0] --> OK [0.11E~321,TO_NEAREST] --> [0,0] --> OK [0.104E~321,TO_NEAREST] --> [0,0] --> OK [0.1E~321,TO_NEAREST] --> [0,0] --> OK [0.94E~322,TO_NEAREST] --> [0,0] --> OK [0.9E~322,TO_NEAREST] --> [0,0] --> OK [0.84E~322,TO_NEAREST] --> [0,0] --> OK [0.8E~322,TO_NEAREST] --> [0,0] --> OK [0.74E~322,TO_NEAREST] --> [0,0] --> OK [0.7E~322,TO_NEAREST] --> [0,0] --> OK [0.64E~322,TO_NEAREST] --> [0,0] --> OK [0.6E~322,TO_NEAREST] --> [0,0] --> OK [0.54E~322,TO_NEAREST] --> [0,0] --> OK [0.5E~322,TO_NEAREST] --> [0,0] --> OK [0.44E~322,TO_NEAREST] --> [0,0] --> OK [0.4E~322,TO_NEAREST] --> [0,0] --> OK [0.35E~322,TO_NEAREST] --> [0,0] --> OK [0.3E~322,TO_NEAREST] --> [0,0] --> OK [0.25E~322,TO_NEAREST] --> [0,0] --> OK [0.2E~322,TO_NEAREST] --> [0,0] --> OK [0.15E~322,TO_NEAREST] --> [0,0] --> OK [0.1E~322,TO_NEAREST] --> [0,0] --> OK [0.5E~323,TO_NEAREST] --> [0,0] --> OK [0.9999999999999929,TO_NEAREST] --> [1,1] --> OK [0.999999999999993,TO_NEAREST] --> [1,1] --> OK [0.9999999999999931,TO_NEAREST] --> [1,1] --> OK [0.9999999999999932,TO_NEAREST] --> [1,1] --> OK [0.9999999999999933,TO_NEAREST] --> [1,1] --> OK [0.9999999999999934,TO_NEAREST] --> [1,1] --> OK [0.9999999999999936,TO_NEAREST] --> [1,1] --> OK [0.9999999999999937,TO_NEAREST] --> [1,1] --> OK [0.9999999999999938,TO_NEAREST] --> [1,1] --> OK [0.9999999999999939,TO_NEAREST] --> [1,1] --> OK [0.999999999999994,TO_NEAREST] --> [1,1] --> OK [0.9999999999999941,TO_NEAREST] --> [1,1] --> OK [0.9999999999999942,TO_NEAREST] --> [1,1] --> OK [0.9999999999999943,TO_NEAREST] --> [1,1] --> OK [0.9999999999999944,TO_NEAREST] --> [1,1] --> OK [0.9999999999999946,TO_NEAREST] --> [1,1] --> OK [0.9999999999999947,TO_NEAREST] --> [1,1] --> OK [0.9999999999999948,TO_NEAREST] --> [1,1] --> OK [0.9999999999999949,TO_NEAREST] --> [1,1] --> OK [0.999999999999995,TO_NEAREST] --> [1,1] --> OK [0.9999999999999951,TO_NEAREST] --> [1,1] --> OK [0.9999999999999952,TO_NEAREST] --> [1,1] --> OK [0.9999999999999953,TO_NEAREST] --> [1,1] --> OK [0.9999999999999954,TO_NEAREST] --> [1,1] --> OK [0.9999999999999956,TO_NEAREST] --> [1,1] --> OK [0.9999999999999957,TO_NEAREST] --> [1,1] --> OK [0.9999999999999958,TO_NEAREST] --> [1,1] --> OK [0.9999999999999959,TO_NEAREST] --> [1,1] --> OK [0.999999999999996,TO_NEAREST] --> [1,1] --> OK [0.9999999999999961,TO_NEAREST] --> [1,1] --> OK [0.9999999999999962,TO_NEAREST] --> [1,1] --> OK [0.9999999999999963,TO_NEAREST] --> [1,1] --> OK [0.9999999999999964,TO_NEAREST] --> [1,1] --> OK [0.9999999999999966,TO_NEAREST] --> [1,1] --> OK [0.9999999999999967,TO_NEAREST] --> [1,1] --> OK [0.9999999999999968,TO_NEAREST] --> [1,1] --> OK [0.9999999999999969,TO_NEAREST] --> [1,1] --> OK [0.999999999999997,TO_NEAREST] --> [1,1] --> OK [0.9999999999999971,TO_NEAREST] --> [1,1] --> OK [0.9999999999999972,TO_NEAREST] --> [1,1] --> OK [0.9999999999999973,TO_NEAREST] --> [1,1] --> OK [0.9999999999999974,TO_NEAREST] --> [1,1] --> OK [0.9999999999999976,TO_NEAREST] --> [1,1] --> OK [0.9999999999999977,TO_NEAREST] --> [1,1] --> OK [0.9999999999999978,TO_NEAREST] --> [1,1] --> OK [0.9999999999999979,TO_NEAREST] --> [1,1] --> OK [0.999999999999998,TO_NEAREST] --> [1,1] --> OK [0.9999999999999981,TO_NEAREST] --> [1,1] --> OK [0.9999999999999982,TO_NEAREST] --> [1,1] --> OK [0.9999999999999983,TO_NEAREST] --> [1,1] --> OK [0.9999999999999984,TO_NEAREST] --> [1,1] --> OK [0.9999999999999986,TO_NEAREST] --> [1,1] --> OK [0.9999999999999987,TO_NEAREST] --> [1,1] --> OK [0.9999999999999988,TO_NEAREST] --> [1,1] --> OK [0.9999999999999989,TO_NEAREST] --> [1,1] --> OK [0.999999999999999,TO_NEAREST] --> [1,1] --> OK [0.9999999999999991,TO_NEAREST] --> [1,1] --> OK [0.9999999999999992,TO_NEAREST] --> [1,1] --> OK [0.9999999999999993,TO_NEAREST] --> [1,1] --> OK [0.9999999999999994,TO_NEAREST] --> [1,1] --> OK [0.9999999999999996,TO_NEAREST] --> [1,1] --> OK [0.9999999999999997,TO_NEAREST] --> [1,1] --> OK [0.9999999999999998,TO_NEAREST] --> [1,1] --> OK [0.9999999999999999,TO_NEAREST] --> [1,1] --> OK [0.1E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000142E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000014E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000138E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000135E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000133E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000013E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000129E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000127E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000124E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000122E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000012E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000118E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000115E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000113E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000011E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000109E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000107E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000104E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000102E1,TO_NEAREST] --> [1,1] --> OK [0.100000000000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000098E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000095E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000093E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000009E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000089E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000087E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000084E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000082E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000008E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000078E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000075E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000073E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000069E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000067E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000064E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000062E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000058E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000056E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000053E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000049E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000047E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000044E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000042E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000038E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000036E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000033E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000003E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000029E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000027E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000024E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000022E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000018E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000016E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000013E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000009E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000002E1,TO_NEAREST] --> [1,1] --> OK [0.19999999999999858E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999986E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999862E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999865E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999867E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999987E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999871E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999873E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999876E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999878E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999988E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999882E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999885E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999887E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999989E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999891E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999893E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999896E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999898E1,TO_NEAREST] --> [2,2] --> OK [0.199999999999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999902E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999905E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999907E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999991E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999911E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999913E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999916E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999918E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999992E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999922E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999925E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999927E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999931E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999933E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999936E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999938E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999942E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999944E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999947E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999951E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999953E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999956E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999958E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999962E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999964E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999967E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999997E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999971E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999973E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999976E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999978E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999982E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999984E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999987E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999991E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999998E1,TO_NEAREST] --> [2,2] --> OK [0.2E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000284E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000028E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000275E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000027E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000266E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000026E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000258E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000253E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000025E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000244E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000024E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000235E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000023E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000226E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000022E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000218E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000213E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000021E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000204E1,TO_NEAREST] --> [2,2] --> OK [0.200000000000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000195E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000019E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000187E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000018E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000178E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000173E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000017E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000164E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000016E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000155E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000015E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000147E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000138E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000133E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000013E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000124E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000012E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000115E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000011E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000107E1,TO_NEAREST] --> [2,2] --> OK [0.200000000000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000098E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000093E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000009E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000084E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000008E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000075E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000067E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000006E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000058E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000053E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000044E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000004E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000036E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000003E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000027E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000018E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000013E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000004E1,TO_NEAREST] --> [2,2] --> OK [0.29999999999999716E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999972E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999725E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999973E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999734E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999974E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999742E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999747E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999975E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999756E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999976E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999765E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999977E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999774E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999978E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999782E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999787E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999979E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999796E1,TO_NEAREST] --> [3,3] --> OK [0.299999999999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999805E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999981E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999813E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999982E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999822E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999827E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999983E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999836E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999984E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999845E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999985E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999853E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999862E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999867E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999987E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999876E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999988E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999885E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999989E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999893E1,TO_NEAREST] --> [3,3] --> OK [0.299999999999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999902E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999907E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999991E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999916E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999992E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999925E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999933E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999994E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999942E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999947E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999956E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999996E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999964E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999997E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999973E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999982E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999987E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999996E1,TO_NEAREST] --> [3,3] --> OK [0.3E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000284E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000028E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000275E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000027E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000266E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000026E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000258E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000253E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000025E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000244E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000024E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000235E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000023E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000226E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000022E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000218E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000213E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000021E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000204E1,TO_NEAREST] --> [3,3] --> OK [0.300000000000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000195E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000019E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000187E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000018E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000178E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000173E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000017E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000164E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000016E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000155E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000015E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000147E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000138E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000133E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000013E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000124E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000012E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000115E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000011E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000107E1,TO_NEAREST] --> [3,3] --> OK [0.300000000000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000098E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000093E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000009E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000084E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000008E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000075E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000067E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000006E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000058E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000053E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000044E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000004E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000036E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000003E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000027E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000018E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000013E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000004E1,TO_NEAREST] --> [3,3] --> OK [0.10737418239999924E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999925E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999926E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999927E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999928E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999993E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999931E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999932E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999933E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999934E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999936E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999937E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999938E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999939E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999994E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999942E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999943E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999944E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999945E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999946E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999948E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999949E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999995E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999951E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999952E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999954E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999955E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999956E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999957E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999958E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999996E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999961E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999962E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999963E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999964E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999965E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999967E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999968E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999969E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999997E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999971E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999973E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999974E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999975E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999976E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999977E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999979E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999998E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999981E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999982E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999983E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999985E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999986E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999987E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999988E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999989E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999999E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999992E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999993E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999994E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999995E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999996E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999998E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999999E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999985E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999852E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999855E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999857E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999986E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999862E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999864E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999866E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999987E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999871E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999874E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999876E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999878E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999988E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999883E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999886E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999888E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999989E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999893E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999895E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999897E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.161061273599999E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999902E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999905E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999907E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999991E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999912E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999914E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999917E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999992E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999921E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999924E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999926E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999928E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999993E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999933E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999936E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999938E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999994E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999943E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999945E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999948E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999995E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999952E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999955E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999957E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999996E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999962E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999964E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999967E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999997E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999971E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999974E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999976E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999979E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999998E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999983E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999986E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999988E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999999E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999993E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999995E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999998E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999985E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999852E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999855E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999857E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999986E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999862E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999864E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999866E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999987E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999871E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999874E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999876E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999878E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999988E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999883E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999886E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999888E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999989E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999893E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999895E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999897E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.187904819199999E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999902E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999905E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999907E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999991E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999912E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999914E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999917E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999992E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999921E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999924E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999926E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999928E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999993E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999933E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999936E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999938E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999994E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999943E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999945E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999948E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999995E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999952E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999955E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999957E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999996E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999962E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999964E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999967E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999997E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999971E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999974E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999976E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999979E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999998E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999983E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999986E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999988E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999999E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999993E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999995E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999998E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999985E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999852E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999855E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999857E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999986E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999862E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999864E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999866E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999987E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999871E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999874E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999876E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999878E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999988E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999883E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999886E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999888E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999989E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999893E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999895E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999897E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326591999999E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999902E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999905E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999907E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999991E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999912E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999914E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999917E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999992E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999921E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999924E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999926E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999928E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999993E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999933E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999936E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999938E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999994E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999943E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999945E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999948E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999995E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999952E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999955E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999957E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999996E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999962E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999964E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999967E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999997E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999971E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999974E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999976E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999979E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999998E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999983E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999986E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999988E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999999E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999993E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999995E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999998E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326592E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999985E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999852E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999855E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999857E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999986E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999862E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999864E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999866E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999987E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999871E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999874E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999876E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999878E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999988E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999883E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999886E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999888E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999989E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999893E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999895E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999897E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.208037478399999E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999902E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999905E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999907E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999991E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999912E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999914E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999917E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999992E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999921E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999924E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999926E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999928E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999993E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999933E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999936E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999938E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999994E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999943E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999945E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999948E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999995E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999952E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999955E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999957E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999996E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999962E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999964E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999967E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999997E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999971E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999974E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999976E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999979E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999998E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999983E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999986E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999988E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999999E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999993E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999995E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999998E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999985E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999852E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999855E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999857E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999986E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999862E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999864E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999866E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999987E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999871E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999874E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999876E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999878E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999988E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999883E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999886E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999888E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999989E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999893E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999895E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999897E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.211392921599999E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999902E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999905E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999907E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999991E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999912E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999914E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999917E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999992E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999921E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999924E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999926E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999928E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999993E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999933E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999936E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999938E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999994E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999943E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999945E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999948E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999995E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999952E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999955E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999957E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999996E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999962E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999964E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999967E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999997E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999971E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999974E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999976E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999979E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999998E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999983E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999986E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999988E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999999E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999993E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999995E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999998E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999985E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999852E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999855E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999857E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999986E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999862E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999864E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999866E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999987E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999871E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999874E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999876E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999878E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999988E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999883E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999886E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999888E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999989E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999893E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999895E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999897E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.214748364399999E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999902E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999905E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999907E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999991E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999912E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999914E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999917E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999992E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999921E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999924E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999926E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999928E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999993E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999933E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999936E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999938E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999994E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999943E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999945E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999948E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999995E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999952E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999955E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999957E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999996E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999962E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999964E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999967E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999997E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999971E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999974E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999976E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999979E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999998E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999983E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999986E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999988E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999999E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999993E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999995E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999998E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999985E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999852E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999855E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999857E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999986E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999862E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999864E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999866E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999987E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999871E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999874E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999876E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999878E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999988E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999883E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999886E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999888E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999989E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999893E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999895E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999897E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.214748364499999E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999902E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999905E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999907E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999991E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999912E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999914E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999917E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999992E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999921E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999924E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999926E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999928E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999993E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999933E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999936E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999938E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999994E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999943E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999945E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999948E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999995E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999952E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999955E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999957E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999996E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999962E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999964E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999967E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999997E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999971E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999974E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999976E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999979E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999998E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999983E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999986E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999988E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999999E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999993E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999995E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999998E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999985E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999852E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999855E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999857E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999986E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999862E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999864E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999866E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999987E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999871E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999874E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999876E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999878E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999988E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999883E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999886E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999888E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999989E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999893E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999895E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999897E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.214748364599999E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999902E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999905E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999907E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999991E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999912E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999914E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999917E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999992E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999921E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999924E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999926E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999928E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999993E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999933E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999936E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999938E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999994E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999943E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999945E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999948E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999995E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999952E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999955E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999957E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999996E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999962E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999964E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999967E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999997E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999971E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999974E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999976E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999979E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999998E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999983E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999986E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999988E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999999E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999993E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999995E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999998E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999985E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999852E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999855E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999857E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999986E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999862E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999864E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999866E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999987E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999871E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999874E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999876E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999878E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999988E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999883E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999886E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999888E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999989E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999893E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999895E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999897E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.214748364699999E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999902E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999905E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999907E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999991E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999912E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999914E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999917E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999992E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999921E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999924E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999926E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999928E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999993E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999933E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999936E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999938E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999994E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999943E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999945E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999948E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999995E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999952E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999955E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999957E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999996E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999962E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999964E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999967E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999997E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999971E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999974E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999976E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999979E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999998E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999983E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999986E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999988E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999999E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999993E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999995E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999998E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [~0.21474836480000305E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800003E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000296E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000029E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000286E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000028E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000277E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000027E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000267E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000026E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000257E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000253E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000025E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000243E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000024E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000234E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000023E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000224E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000022E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000215E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000021E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000205E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800002E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000196E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000019E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000186E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000018E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000176E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000017E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000167E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000016E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000157E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000153E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000015E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000143E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000014E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000134E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000013E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000124E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000012E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000114E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000011E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000105E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800001E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000095E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000009E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000086E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000008E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000076E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000007E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000067E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000006E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000057E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000052E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000005E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000043E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000004E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000033E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000003E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000024E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000002E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000014E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000001E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000005E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999985E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999852E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999855E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999857E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999986E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999862E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999864E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999866E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999987E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999871E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999874E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999876E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999878E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999988E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999883E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999886E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999888E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999989E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999893E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999895E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999897E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.214748364799999E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999902E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999905E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999907E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999991E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999912E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999914E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999917E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999992E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999921E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999924E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999926E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999928E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999993E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999933E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999936E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999938E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999994E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999943E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999945E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999948E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999995E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999952E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999955E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999957E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999996E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999962E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999964E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999967E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999997E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999971E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999974E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999976E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999979E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999998E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999983E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999986E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999988E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999999E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999993E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999995E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999998E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000153E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000015E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000148E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000145E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000143E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000014E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000138E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000136E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000134E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000013E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000129E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000126E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000124E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000122E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000012E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000117E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000114E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000112E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000011E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000107E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000105E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000103E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.214748364700001E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000098E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000095E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000093E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000009E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000088E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000086E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000083E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000008E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000079E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000076E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000074E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000072E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000007E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000067E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000064E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000062E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000006E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000057E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000055E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000052E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000005E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000048E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000045E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000043E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000004E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000038E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000036E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000033E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000003E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000029E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000026E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000024E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000021E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000002E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000017E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000014E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000012E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000001E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000007E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000005E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000002E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999985E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999852E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999855E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999857E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999986E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999862E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999864E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999866E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999987E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999871E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999874E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999876E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999878E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999988E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999883E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999886E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999888E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999989E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999893E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999895E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999897E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.214748364699999E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999902E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999905E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999907E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999991E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999912E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999914E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999917E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999992E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999921E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999924E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999926E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999928E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999993E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999933E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999936E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999938E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999994E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999943E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999945E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999948E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999995E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999952E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999955E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999957E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999996E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999962E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999964E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999967E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999997E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999971E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999974E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999976E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999979E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999998E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999983E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999986E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999988E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999999E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999993E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999995E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999998E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000153E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000015E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000148E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000145E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000143E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000014E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000138E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000136E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000134E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000013E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000129E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000126E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000124E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000122E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000012E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000117E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000114E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000112E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000011E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000107E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000105E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000103E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.214748364600001E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000098E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000095E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000093E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000009E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000088E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000086E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000083E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000008E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000079E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000076E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000074E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000072E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000007E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000067E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000064E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000062E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000006E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000057E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000055E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000052E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000005E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000048E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000045E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000043E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000004E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000038E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000036E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000033E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000003E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000029E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000026E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000024E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000021E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000002E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000017E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000014E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000012E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000001E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000007E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000005E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000002E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999985E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999852E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999855E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999857E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999986E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999862E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999864E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999866E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999987E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999871E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999874E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999876E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999878E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999988E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999883E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999886E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999888E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999989E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999893E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999895E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999897E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.214748364599999E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999902E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999905E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999907E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999991E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999912E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999914E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999917E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999992E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999921E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999924E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999926E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999928E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999993E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999933E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999936E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999938E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999994E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999943E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999945E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999948E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999995E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999952E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999955E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999957E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999996E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999962E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999964E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999967E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999997E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999971E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999974E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999976E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999979E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999998E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999983E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999986E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999988E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999999E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999993E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999995E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999998E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000153E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000015E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000148E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000145E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000143E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000014E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000138E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000136E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000134E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000013E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000129E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000126E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000124E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000122E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000012E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000117E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000114E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000112E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000011E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000107E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000105E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000103E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.214748364500001E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000098E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000095E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000093E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000009E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000088E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000086E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000083E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000008E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000079E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000076E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000074E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000072E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000007E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000067E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000064E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000062E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000006E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000057E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000055E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000052E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000005E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000048E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000045E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000043E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000004E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000038E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000036E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000033E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000003E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000029E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000026E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000024E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000021E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000002E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000017E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000014E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000012E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000001E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000007E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000005E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000002E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999985E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999852E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999855E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999857E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999986E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999862E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999864E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999866E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999987E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999871E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999874E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999876E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999878E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999988E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999883E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999886E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999888E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999989E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999893E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999895E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999897E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.214748364499999E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999902E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999905E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999907E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999991E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999912E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999914E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999917E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999992E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999921E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999924E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999926E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999928E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999993E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999933E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999936E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999938E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999994E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999943E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999945E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999948E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999995E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999952E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999955E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999957E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999996E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999962E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999964E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999967E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999997E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999971E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999974E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999976E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999979E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999998E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999983E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999986E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999988E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999999E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999993E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999995E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999998E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21139292170000153E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000015E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000148E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000145E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000143E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000014E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000138E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000136E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000134E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000013E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000129E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000126E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000124E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000122E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000012E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000117E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000114E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000112E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000011E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000107E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000105E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000103E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.211392921700001E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000098E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000095E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000093E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000009E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000088E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000086E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000083E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000008E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000079E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000076E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000074E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000072E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000007E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000067E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000064E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000062E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000006E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000057E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000055E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000052E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000005E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000048E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000045E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000043E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000004E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000038E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000036E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000033E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000003E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000029E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000026E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000024E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000021E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000002E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000017E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000014E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000012E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000001E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000007E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000005E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000002E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999985E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999852E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999855E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999857E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999986E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999862E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999864E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999866E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999987E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999871E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999874E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999876E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999878E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999988E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999883E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999886E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999888E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999989E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999893E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999895E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999897E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.211392921699999E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999902E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999905E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999907E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999991E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999912E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999914E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999917E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999992E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999921E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999924E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999926E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999928E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999993E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999933E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999936E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999938E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999994E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999943E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999945E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999948E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999995E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999952E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999955E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999957E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999996E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999962E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999964E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999967E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999997E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999971E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999974E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999976E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999979E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999998E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999983E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999986E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999988E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999999E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999993E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999995E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999998E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.20803747850000153E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000015E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000148E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000145E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000143E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000014E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000138E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000136E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000134E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000013E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000129E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000126E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000124E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000122E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000012E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000117E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000114E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000112E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000011E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000107E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000105E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000103E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.208037478500001E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000098E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000095E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000093E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000009E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000088E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000086E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000083E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000008E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000079E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000076E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000074E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000072E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000007E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000067E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000064E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000062E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000006E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000057E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000055E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000052E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000005E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000048E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000045E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000043E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000004E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000038E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000036E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000033E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000003E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000029E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000026E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000024E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000021E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000002E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000017E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000014E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000012E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000001E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000007E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000005E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000002E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999985E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999852E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999855E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999857E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999986E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999862E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999864E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999866E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999987E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999871E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999874E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999876E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999878E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999988E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999883E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999886E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999888E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999989E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999893E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999895E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999897E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.208037478499999E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999902E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999905E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999907E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999991E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999912E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999914E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999917E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999992E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999921E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999924E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999926E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999928E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999993E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999933E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999936E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999938E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999994E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999943E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999945E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999948E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999995E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999952E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999955E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999957E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999996E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999962E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999964E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999967E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999997E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999971E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999974E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999976E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999979E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999998E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999983E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999986E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999988E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999999E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999993E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999995E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999998E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20132659210000153E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000015E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000148E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000145E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000143E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000014E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000138E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000136E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000134E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000013E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000129E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000126E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000124E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000122E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000012E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000117E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000114E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000112E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000011E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000107E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000105E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000103E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.201326592100001E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000098E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000095E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000093E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000009E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000088E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000086E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000083E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000008E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000079E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000076E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000074E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000072E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000007E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000067E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000064E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000062E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000006E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000057E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000055E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000052E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000005E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000048E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000045E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000043E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000004E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000038E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000036E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000033E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000003E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000029E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000026E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000024E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000021E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000002E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000017E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000014E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000012E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000001E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000007E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000005E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000002E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999985E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999852E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999855E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999857E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999986E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999862E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999864E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999866E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999987E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999871E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999874E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999876E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999878E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999988E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999883E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999886E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999888E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999989E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999893E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999895E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999897E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.201326592099999E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999902E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999905E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999907E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999991E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999912E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999914E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999917E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999992E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999921E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999924E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999926E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999928E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999993E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999933E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999936E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999938E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999994E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999943E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999945E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999948E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999995E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999952E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999955E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999957E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999996E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999962E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999964E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999967E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999997E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999971E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999974E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999976E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999979E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999998E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999983E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999986E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999988E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999999E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999993E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999995E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999998E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.18790481930000153E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000015E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000148E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000145E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000143E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000014E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000138E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000136E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000134E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000013E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000129E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000126E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000124E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000122E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000012E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000117E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000114E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000112E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000011E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000107E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000105E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000103E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.187904819300001E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000098E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000095E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000093E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000009E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000088E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000086E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000083E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000008E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000079E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000076E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000074E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000072E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000007E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000067E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000064E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000062E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000006E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000057E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000055E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000052E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000005E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000048E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000045E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000043E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000004E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000038E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000036E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000033E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000003E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000029E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000026E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000024E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000021E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000002E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000017E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000014E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000012E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000001E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000007E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000005E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000002E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999985E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999852E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999855E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999857E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999986E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999862E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999864E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999866E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999987E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999871E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999874E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999876E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999878E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999988E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999883E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999886E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999888E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999989E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999893E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999895E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999897E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.187904819299999E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999902E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999905E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999907E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999991E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999912E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999914E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999917E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999992E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999921E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999924E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999926E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999928E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999993E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999933E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999936E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999938E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999994E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999943E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999945E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999948E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999995E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999952E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999955E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999957E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999996E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999962E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999964E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999967E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999997E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999971E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999974E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999976E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999979E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999998E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999983E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999986E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999988E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999999E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999993E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999995E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999998E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.16106127370000153E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000015E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000148E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000145E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000143E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000014E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000138E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000136E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000134E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000013E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000129E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000126E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000124E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000122E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000012E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000117E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000114E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000112E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000011E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000107E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000105E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000103E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.161061273700001E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000098E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000095E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000093E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000009E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000088E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000086E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000083E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000008E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000079E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000076E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000074E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000072E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000007E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000067E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000064E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000062E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000006E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000057E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000055E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000052E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000005E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000048E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000045E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000043E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000004E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000038E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000036E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000033E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000003E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000029E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000026E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000024E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000021E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000002E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000017E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000014E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000012E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000001E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000007E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000005E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000002E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999985E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999852E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999855E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999857E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999986E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999862E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999864E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999866E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999987E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999871E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999874E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999876E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999878E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999988E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999883E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999886E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999888E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999989E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999893E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999895E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999897E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.161061273699999E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999902E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999905E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999907E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999991E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999912E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999914E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999917E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999992E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999921E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999924E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999926E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999928E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999993E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999933E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999936E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999938E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999994E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999943E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999945E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999948E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999995E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999952E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999955E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999957E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999996E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999962E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999964E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999967E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999997E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999971E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999974E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999976E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999979E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999998E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999983E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999986E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999988E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999999E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999993E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999995E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999998E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.10737418250000153E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000015E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000148E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000145E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000143E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000014E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000138E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000136E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000134E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000013E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000129E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000126E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000124E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000122E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000012E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000117E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000114E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000112E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000011E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000107E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000105E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000103E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.107374182500001E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000098E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000095E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000093E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000009E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000088E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000086E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000083E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000008E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000079E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000076E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000074E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000072E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000007E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000067E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000064E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000062E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000006E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000057E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000055E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000052E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000005E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000048E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000045E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000043E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000004E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000038E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000036E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000033E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000003E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000029E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000026E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000024E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000021E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000002E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000017E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000014E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000012E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000001E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000007E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000005E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000002E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999985E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999852E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999855E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999857E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999986E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999862E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999864E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999866E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999987E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999871E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999874E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999876E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999878E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999988E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999883E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999886E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999888E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999989E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999893E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999895E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999897E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.107374182499999E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999902E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999905E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999907E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999991E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999912E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999914E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999917E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999992E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999921E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999924E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999926E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999928E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999993E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999933E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999936E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999938E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999994E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999943E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999945E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999948E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999995E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999952E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999955E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999957E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999996E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999962E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999964E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999967E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999997E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999971E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999974E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999976E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999979E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999998E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999983E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999986E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999988E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999999E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999993E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999995E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999998E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.30000000000000284E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000028E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000275E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000027E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000266E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000026E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000258E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000253E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000025E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000244E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000024E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000235E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000023E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000226E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000022E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000218E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000213E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000021E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000204E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300000000000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000195E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000019E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000187E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000018E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000178E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000173E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000017E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000164E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000016E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000155E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000015E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000147E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000138E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000133E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000124E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000115E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000011E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000107E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300000000000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000098E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000093E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000009E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000084E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000008E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000075E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000067E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000006E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000058E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000053E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000044E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000036E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000003E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000027E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000018E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999972E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999725E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999973E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999734E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999974E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999742E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999747E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999975E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999756E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999976E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999765E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999977E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999774E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999978E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999782E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999787E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999979E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999796E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999999999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999805E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999981E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999813E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999982E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999822E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999827E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999983E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999836E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999984E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999845E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999985E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999853E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999862E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999867E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999876E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999885E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999989E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999893E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999999999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999902E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999907E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999991E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999916E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999992E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999925E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999933E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999994E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999942E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999947E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999956E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999964E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999997E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999973E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999982E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000284E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000028E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000275E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000027E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000266E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000026E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000258E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000253E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000025E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000244E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000024E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000235E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000023E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000226E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000022E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000218E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000213E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000021E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000204E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200000000000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000195E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000019E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000187E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000018E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000178E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000173E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000017E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000164E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000016E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000155E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000015E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000147E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000138E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000133E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000124E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000115E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000011E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000107E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200000000000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000098E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000093E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000009E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000084E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000008E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000075E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000067E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000006E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000058E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000053E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000044E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000036E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000003E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000027E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000018E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999986E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999862E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999865E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999867E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999871E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999873E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999876E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999878E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999988E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999882E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999885E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999887E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999989E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999891E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999893E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999896E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999898E1,TO_NEGINF] --> [~2,~2] --> OK [~0.199999999999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999902E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999905E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999907E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999991E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999911E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999913E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999916E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999918E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999992E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999922E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999925E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999927E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999931E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999933E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999936E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999938E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999942E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999944E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999947E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999951E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999953E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999956E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999958E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999962E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999964E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999967E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999997E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999971E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999973E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999976E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999978E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999982E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999984E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999991E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000142E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000014E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000138E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000135E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000133E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000129E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000127E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000124E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000122E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000012E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000118E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000115E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000113E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000011E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000109E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000107E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000104E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000102E1,TO_NEGINF] --> [~2,~2] --> OK [~0.100000000000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000098E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000095E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000093E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000009E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000089E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000087E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000084E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000082E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000008E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000078E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000075E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000073E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000069E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000067E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000064E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000062E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000058E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000056E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000053E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000049E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000047E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000044E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000042E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000038E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000036E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000033E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000003E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000029E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000027E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000024E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000022E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000018E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000016E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000009E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1E1,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999929,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999993,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999931,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999932,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999933,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999934,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999936,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999937,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999938,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999939,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999941,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999942,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999943,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999944,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999946,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999947,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999948,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999949,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999995,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999951,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999952,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999953,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999954,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999956,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999957,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999958,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999959,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999996,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999961,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999962,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999963,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999966,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999967,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999968,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999969,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999971,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999972,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999973,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999974,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999977,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999978,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999979,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999981,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999982,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999983,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999984,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999986,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999987,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999988,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999989,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999999,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999991,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999992,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999993,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999996,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999999,TO_NEGINF] --> [~1,~1] --> OK [~0.316E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.31E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.306E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.296E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.29E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.287E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.28E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.277E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.27E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.267E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.26E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.257E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.247E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.24E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.237E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.23E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.227E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.22E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.217E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.21E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.208E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.203E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.193E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.19E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.183E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.18E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.173E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.17E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.163E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.16E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.153E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.143E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.14E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.133E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.13E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.124E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.12E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.114E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.11E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.104E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.94E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.9E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.84E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.74E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.64E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.54E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.44E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.35E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~323,TO_NEGINF] --> [~1,~1] --> OK [0.0,TO_NEGINF] --> [0,0] --> OK [0.316E~321,TO_NEGINF] --> [0,0] --> OK [0.31E~321,TO_NEGINF] --> [0,0] --> OK [0.306E~321,TO_NEGINF] --> [0,0] --> OK [0.3E~321,TO_NEGINF] --> [0,0] --> OK [0.296E~321,TO_NEGINF] --> [0,0] --> OK [0.29E~321,TO_NEGINF] --> [0,0] --> OK [0.287E~321,TO_NEGINF] --> [0,0] --> OK [0.28E~321,TO_NEGINF] --> [0,0] --> OK [0.277E~321,TO_NEGINF] --> [0,0] --> OK [0.27E~321,TO_NEGINF] --> [0,0] --> OK [0.267E~321,TO_NEGINF] --> [0,0] --> OK [0.26E~321,TO_NEGINF] --> [0,0] --> OK [0.257E~321,TO_NEGINF] --> [0,0] --> OK [0.25E~321,TO_NEGINF] --> [0,0] --> OK [0.247E~321,TO_NEGINF] --> [0,0] --> OK [0.24E~321,TO_NEGINF] --> [0,0] --> OK [0.237E~321,TO_NEGINF] --> [0,0] --> OK [0.23E~321,TO_NEGINF] --> [0,0] --> OK [0.227E~321,TO_NEGINF] --> [0,0] --> OK [0.22E~321,TO_NEGINF] --> [0,0] --> OK [0.217E~321,TO_NEGINF] --> [0,0] --> OK [0.21E~321,TO_NEGINF] --> [0,0] --> OK [0.208E~321,TO_NEGINF] --> [0,0] --> OK [0.203E~321,TO_NEGINF] --> [0,0] --> OK [0.2E~321,TO_NEGINF] --> [0,0] --> OK [0.193E~321,TO_NEGINF] --> [0,0] --> OK [0.19E~321,TO_NEGINF] --> [0,0] --> OK [0.183E~321,TO_NEGINF] --> [0,0] --> OK [0.18E~321,TO_NEGINF] --> [0,0] --> OK [0.173E~321,TO_NEGINF] --> [0,0] --> OK [0.17E~321,TO_NEGINF] --> [0,0] --> OK [0.163E~321,TO_NEGINF] --> [0,0] --> OK [0.16E~321,TO_NEGINF] --> [0,0] --> OK [0.153E~321,TO_NEGINF] --> [0,0] --> OK [0.15E~321,TO_NEGINF] --> [0,0] --> OK [0.143E~321,TO_NEGINF] --> [0,0] --> OK [0.14E~321,TO_NEGINF] --> [0,0] --> OK [0.133E~321,TO_NEGINF] --> [0,0] --> OK [0.13E~321,TO_NEGINF] --> [0,0] --> OK [0.124E~321,TO_NEGINF] --> [0,0] --> OK [0.12E~321,TO_NEGINF] --> [0,0] --> OK [0.114E~321,TO_NEGINF] --> [0,0] --> OK [0.11E~321,TO_NEGINF] --> [0,0] --> OK [0.104E~321,TO_NEGINF] --> [0,0] --> OK [0.1E~321,TO_NEGINF] --> [0,0] --> OK [0.94E~322,TO_NEGINF] --> [0,0] --> OK [0.9E~322,TO_NEGINF] --> [0,0] --> OK [0.84E~322,TO_NEGINF] --> [0,0] --> OK [0.8E~322,TO_NEGINF] --> [0,0] --> OK [0.74E~322,TO_NEGINF] --> [0,0] --> OK [0.7E~322,TO_NEGINF] --> [0,0] --> OK [0.64E~322,TO_NEGINF] --> [0,0] --> OK [0.6E~322,TO_NEGINF] --> [0,0] --> OK [0.54E~322,TO_NEGINF] --> [0,0] --> OK [0.5E~322,TO_NEGINF] --> [0,0] --> OK [0.44E~322,TO_NEGINF] --> [0,0] --> OK [0.4E~322,TO_NEGINF] --> [0,0] --> OK [0.35E~322,TO_NEGINF] --> [0,0] --> OK [0.3E~322,TO_NEGINF] --> [0,0] --> OK [0.25E~322,TO_NEGINF] --> [0,0] --> OK [0.2E~322,TO_NEGINF] --> [0,0] --> OK [0.15E~322,TO_NEGINF] --> [0,0] --> OK [0.1E~322,TO_NEGINF] --> [0,0] --> OK [0.5E~323,TO_NEGINF] --> [0,0] --> OK [0.9999999999999929,TO_NEGINF] --> [0,0] --> OK [0.999999999999993,TO_NEGINF] --> [0,0] --> OK [0.9999999999999931,TO_NEGINF] --> [0,0] --> OK [0.9999999999999932,TO_NEGINF] --> [0,0] --> OK [0.9999999999999933,TO_NEGINF] --> [0,0] --> OK [0.9999999999999934,TO_NEGINF] --> [0,0] --> OK [0.9999999999999936,TO_NEGINF] --> [0,0] --> OK [0.9999999999999937,TO_NEGINF] --> [0,0] --> OK [0.9999999999999938,TO_NEGINF] --> [0,0] --> OK [0.9999999999999939,TO_NEGINF] --> [0,0] --> OK [0.999999999999994,TO_NEGINF] --> [0,0] --> OK [0.9999999999999941,TO_NEGINF] --> [0,0] --> OK [0.9999999999999942,TO_NEGINF] --> [0,0] --> OK [0.9999999999999943,TO_NEGINF] --> [0,0] --> OK [0.9999999999999944,TO_NEGINF] --> [0,0] --> OK [0.9999999999999946,TO_NEGINF] --> [0,0] --> OK [0.9999999999999947,TO_NEGINF] --> [0,0] --> OK [0.9999999999999948,TO_NEGINF] --> [0,0] --> OK [0.9999999999999949,TO_NEGINF] --> [0,0] --> OK [0.999999999999995,TO_NEGINF] --> [0,0] --> OK [0.9999999999999951,TO_NEGINF] --> [0,0] --> OK [0.9999999999999952,TO_NEGINF] --> [0,0] --> OK [0.9999999999999953,TO_NEGINF] --> [0,0] --> OK [0.9999999999999954,TO_NEGINF] --> [0,0] --> OK [0.9999999999999956,TO_NEGINF] --> [0,0] --> OK [0.9999999999999957,TO_NEGINF] --> [0,0] --> OK [0.9999999999999958,TO_NEGINF] --> [0,0] --> OK [0.9999999999999959,TO_NEGINF] --> [0,0] --> OK [0.999999999999996,TO_NEGINF] --> [0,0] --> OK [0.9999999999999961,TO_NEGINF] --> [0,0] --> OK [0.9999999999999962,TO_NEGINF] --> [0,0] --> OK [0.9999999999999963,TO_NEGINF] --> [0,0] --> OK [0.9999999999999964,TO_NEGINF] --> [0,0] --> OK [0.9999999999999966,TO_NEGINF] --> [0,0] --> OK [0.9999999999999967,TO_NEGINF] --> [0,0] --> OK [0.9999999999999968,TO_NEGINF] --> [0,0] --> OK [0.9999999999999969,TO_NEGINF] --> [0,0] --> OK [0.999999999999997,TO_NEGINF] --> [0,0] --> OK [0.9999999999999971,TO_NEGINF] --> [0,0] --> OK [0.9999999999999972,TO_NEGINF] --> [0,0] --> OK [0.9999999999999973,TO_NEGINF] --> [0,0] --> OK [0.9999999999999974,TO_NEGINF] --> [0,0] --> OK [0.9999999999999976,TO_NEGINF] --> [0,0] --> OK [0.9999999999999977,TO_NEGINF] --> [0,0] --> OK [0.9999999999999978,TO_NEGINF] --> [0,0] --> OK [0.9999999999999979,TO_NEGINF] --> [0,0] --> OK [0.999999999999998,TO_NEGINF] --> [0,0] --> OK [0.9999999999999981,TO_NEGINF] --> [0,0] --> OK [0.9999999999999982,TO_NEGINF] --> [0,0] --> OK [0.9999999999999983,TO_NEGINF] --> [0,0] --> OK [0.9999999999999984,TO_NEGINF] --> [0,0] --> OK [0.9999999999999986,TO_NEGINF] --> [0,0] --> OK [0.9999999999999987,TO_NEGINF] --> [0,0] --> OK [0.9999999999999988,TO_NEGINF] --> [0,0] --> OK [0.9999999999999989,TO_NEGINF] --> [0,0] --> OK [0.999999999999999,TO_NEGINF] --> [0,0] --> OK [0.9999999999999991,TO_NEGINF] --> [0,0] --> OK [0.9999999999999992,TO_NEGINF] --> [0,0] --> OK [0.9999999999999993,TO_NEGINF] --> [0,0] --> OK [0.9999999999999994,TO_NEGINF] --> [0,0] --> OK [0.9999999999999996,TO_NEGINF] --> [0,0] --> OK [0.9999999999999997,TO_NEGINF] --> [0,0] --> OK [0.9999999999999998,TO_NEGINF] --> [0,0] --> OK [0.9999999999999999,TO_NEGINF] --> [0,0] --> OK [0.1E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000142E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000014E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000138E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000135E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000133E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000013E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000129E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000127E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000124E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000122E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000012E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000118E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000115E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000113E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000011E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000109E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000107E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000104E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000102E1,TO_NEGINF] --> [1,1] --> OK [0.100000000000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000098E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000095E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000093E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000009E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000089E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000087E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000084E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000082E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000008E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000078E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000075E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000073E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000069E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000067E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000064E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000062E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000058E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000056E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000053E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000049E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000047E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000044E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000042E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000038E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000036E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000033E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000003E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000029E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000027E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000024E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000022E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000018E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000016E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000013E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000009E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000002E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999858E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999986E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999862E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999865E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999867E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999987E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999871E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999873E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999876E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999878E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999988E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999882E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999885E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999887E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999989E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999891E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999893E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999896E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999898E1,TO_NEGINF] --> [1,1] --> OK [0.199999999999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999902E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999905E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999907E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999991E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999911E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999913E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999916E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999918E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999992E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999922E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999925E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999927E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999931E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999933E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999936E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999938E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999942E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999944E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999947E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999951E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999953E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999956E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999958E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999962E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999964E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999967E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999997E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999971E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999973E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999976E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999978E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999982E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999984E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999987E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999991E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999998E1,TO_NEGINF] --> [1,1] --> OK [0.2E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000284E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000028E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000275E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000027E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000266E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000026E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000258E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000253E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000025E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000244E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000024E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000235E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000023E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000226E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000022E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000218E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000213E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000021E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000204E1,TO_NEGINF] --> [2,2] --> OK [0.200000000000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000195E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000019E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000187E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000018E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000178E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000173E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000017E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000164E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000016E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000155E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000015E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000147E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000138E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000133E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000013E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000124E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000012E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000115E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000011E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000107E1,TO_NEGINF] --> [2,2] --> OK [0.200000000000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000098E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000093E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000009E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000084E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000008E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000075E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000067E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000006E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000058E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000053E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000044E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000004E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000036E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000003E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000027E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000018E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000013E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000004E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999716E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999972E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999725E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999973E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999734E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999974E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999742E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999747E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999975E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999756E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999976E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999765E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999977E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999774E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999978E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999782E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999787E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999979E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999796E1,TO_NEGINF] --> [2,2] --> OK [0.299999999999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999805E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999981E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999813E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999982E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999822E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999827E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999983E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999836E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999984E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999845E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999985E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999853E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999862E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999867E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999987E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999876E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999988E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999885E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999989E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999893E1,TO_NEGINF] --> [2,2] --> OK [0.299999999999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999902E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999907E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999991E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999916E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999992E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999925E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999933E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999994E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999942E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999947E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999956E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999996E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999964E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999997E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999973E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999982E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999987E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999996E1,TO_NEGINF] --> [2,2] --> OK [0.3E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000284E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000028E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000275E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000027E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000266E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000026E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000258E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000253E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000025E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000244E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000024E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000235E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000023E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000226E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000022E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000218E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000213E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000021E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000204E1,TO_NEGINF] --> [3,3] --> OK [0.300000000000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000195E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000019E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000187E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000018E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000178E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000173E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000017E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000164E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000016E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000155E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000015E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000147E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000138E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000133E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000013E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000124E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000012E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000115E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000011E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000107E1,TO_NEGINF] --> [3,3] --> OK [0.300000000000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000098E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000093E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000009E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000084E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000008E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000075E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000067E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000006E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000058E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000053E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000044E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000004E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000036E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000003E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000027E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000018E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000013E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000004E1,TO_NEGINF] --> [3,3] --> OK [0.10737418239999924E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999925E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999926E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999927E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999928E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999993E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999931E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999932E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999933E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999934E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999936E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999937E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999938E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999939E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999994E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999942E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999943E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999944E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999945E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999946E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999948E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999949E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999995E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999951E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999952E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999954E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999955E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999956E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999957E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999958E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999996E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999961E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999962E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999963E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999964E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999965E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999967E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999968E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999969E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999997E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999971E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999973E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999974E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999975E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999976E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999977E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999979E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999998E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999981E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999982E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999983E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999985E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999986E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999987E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999988E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999989E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999999E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999992E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999993E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999994E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999995E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999996E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999998E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999999E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741824E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999985E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999852E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999855E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999857E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999986E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999862E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999864E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999866E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999987E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999871E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999874E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999876E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999878E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999988E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999883E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999886E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999888E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999989E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999893E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999895E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999897E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.161061273599999E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999902E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999905E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999907E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999991E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999912E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999914E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999917E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999992E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999921E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999924E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999926E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999928E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999993E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999933E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999936E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999938E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999994E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999943E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999945E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999948E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999995E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999952E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999955E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999957E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999996E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999962E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999964E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999967E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999997E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999971E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999974E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999976E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999979E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999998E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999983E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999986E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999988E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999999E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999993E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999995E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999998E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612736E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999985E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999852E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999855E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999857E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999986E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999862E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999864E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999866E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999987E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999871E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999874E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999876E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999878E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999988E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999883E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999886E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999888E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999989E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999893E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999895E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999897E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.187904819199999E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999902E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999905E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999907E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999991E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999912E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999914E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999917E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999992E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999921E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999924E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999926E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999928E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999993E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999933E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999936E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999938E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999994E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999943E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999945E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999948E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999995E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999952E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999955E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999957E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999996E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999962E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999964E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999967E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999997E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999971E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999974E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999976E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999979E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999998E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999983E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999986E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999988E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999999E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999993E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999995E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999998E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048192E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999985E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999852E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999855E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999857E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999986E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999862E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999864E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999866E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999987E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999871E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999874E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999876E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999878E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999988E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999883E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999886E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999888E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999989E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999893E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999895E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999897E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.201326591999999E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999902E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999905E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999907E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999991E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999912E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999914E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999917E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999992E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999921E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999924E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999926E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999928E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999993E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999933E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999936E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999938E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999994E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999943E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999945E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999948E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999995E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999952E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999955E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999957E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999996E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999962E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999964E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999967E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999997E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999971E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999974E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999976E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999979E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999998E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999983E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999986E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999988E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999999E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999993E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999995E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999998E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.201326592E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999985E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999852E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999855E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999857E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999986E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999862E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999864E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999866E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999987E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999871E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999874E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999876E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999878E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999988E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999883E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999886E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999888E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999989E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999893E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999895E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999897E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.208037478399999E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999902E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999905E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999907E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999991E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999912E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999914E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999917E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999992E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999921E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999924E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999926E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999928E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999993E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999933E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999936E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999938E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999994E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999943E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999945E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999948E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999995E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999952E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999955E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999957E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999996E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999962E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999964E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999967E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999997E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999971E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999974E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999976E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999979E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999998E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999983E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999986E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999988E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999999E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999993E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999995E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999998E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374784E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999985E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999852E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999855E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999857E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999986E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999862E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999864E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999866E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999987E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999871E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999874E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999876E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999878E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999988E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999883E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999886E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999888E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999989E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999893E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999895E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999897E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.211392921599999E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999902E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999905E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999907E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999991E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999912E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999914E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999917E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999992E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999921E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999924E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999926E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999928E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999993E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999933E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999936E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999938E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999994E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999943E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999945E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999948E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999995E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999952E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999955E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999957E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999996E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999962E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999964E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999967E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999997E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999971E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999974E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999976E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999979E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999998E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999983E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999986E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999988E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999999E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999993E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999995E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999998E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929216E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999985E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999852E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999855E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999857E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999986E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999862E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999864E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999866E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999987E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999871E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999874E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999876E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999878E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999988E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999883E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999886E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999888E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999989E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999893E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999895E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999897E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.214748364399999E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999902E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999905E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999907E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999991E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999912E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999914E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999917E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999992E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999921E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999924E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999926E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999928E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999993E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999933E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999936E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999938E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999994E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999943E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999945E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999948E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999995E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999952E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999955E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999957E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999996E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999962E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999964E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999967E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999997E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999971E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999974E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999976E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999979E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999998E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999983E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999986E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999988E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999999E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999993E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999995E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999998E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483644E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999985E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999852E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999855E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999857E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999986E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999862E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999864E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999866E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999987E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999871E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999874E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999876E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999878E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999988E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999883E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999886E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999888E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999989E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999893E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999895E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999897E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.214748364499999E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999902E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999905E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999907E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999991E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999912E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999914E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999917E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999992E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999921E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999924E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999926E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999928E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999993E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999933E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999936E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999938E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999994E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999943E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999945E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999948E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999995E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999952E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999955E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999957E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999996E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999962E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999964E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999967E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999997E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999971E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999974E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999976E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999979E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999998E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999983E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999986E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999988E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999999E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999993E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999995E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999998E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483645E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999985E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999852E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999855E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999857E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999986E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999862E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999864E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999866E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999987E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999871E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999874E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999876E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999878E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999988E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999883E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999886E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999888E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999989E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999893E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999895E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999897E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.214748364599999E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999902E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999905E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999907E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999991E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999912E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999914E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999917E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999992E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999921E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999924E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999926E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999928E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999993E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999933E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999936E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999938E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999994E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999943E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999945E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999948E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999995E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999952E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999955E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999957E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999996E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999962E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999964E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999967E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999997E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999971E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999974E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999976E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999979E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999998E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999983E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999986E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999988E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999999E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999993E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999995E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999998E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483646E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999985E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999852E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999855E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999857E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999986E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999862E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999864E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999866E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999987E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999871E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999874E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999876E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999878E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999988E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999883E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999886E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999888E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999989E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999893E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999895E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999897E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.214748364699999E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999902E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999905E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999907E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999991E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999912E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999914E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999917E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999992E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999921E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999924E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999926E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999928E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999993E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999933E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999936E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999938E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999994E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999943E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999945E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999948E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999995E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999952E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999955E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999957E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999996E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999962E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999964E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999967E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999997E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999971E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999974E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999976E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999979E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999998E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999983E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999986E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999988E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999999E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999993E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999995E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999998E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483647E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [~0.21474836480000305E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999985E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999852E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999855E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999857E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999986E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999862E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999864E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999866E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999987E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999871E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999874E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999876E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999878E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999988E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999883E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999886E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999888E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999989E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999893E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999895E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999897E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.214748364799999E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999902E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999905E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999907E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999991E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999912E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999914E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999917E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999992E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999921E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999924E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999926E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999928E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999993E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999933E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999936E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999938E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999994E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999943E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999945E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999948E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999995E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999952E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999955E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999957E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999996E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999962E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999964E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999967E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999997E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999971E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999974E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999976E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999979E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999998E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999983E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999986E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999988E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999999E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999993E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999995E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999998E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000153E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999985E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999852E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999855E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999857E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999986E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999862E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999864E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999866E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999987E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999871E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999874E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999876E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999878E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999988E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999883E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999886E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999888E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999989E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999893E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999895E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999897E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.214748364699999E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999902E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999905E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999907E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999991E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999912E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999914E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999917E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999992E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999921E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999924E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999926E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999928E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999993E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999933E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999936E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999938E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999994E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999943E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999945E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999948E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999995E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999952E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999955E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999957E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999996E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999962E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999964E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999967E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999997E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999971E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999974E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999976E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999979E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999998E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999983E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999986E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999988E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999999E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999993E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999995E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999998E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000153E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999985E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999852E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999855E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999857E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999986E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999862E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999864E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999866E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999987E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999871E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999874E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999876E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999878E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999988E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999883E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999886E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999888E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999989E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999893E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999895E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999897E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.214748364599999E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999902E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999905E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999907E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999991E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999912E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999914E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999917E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999992E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999921E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999924E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999926E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999928E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999993E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999933E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999936E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999938E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999994E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999943E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999945E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999948E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999995E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999952E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999955E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999957E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999996E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999962E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999964E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999967E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999997E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999971E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999974E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999976E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999979E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999998E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999983E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999986E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999988E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999999E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999993E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999995E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999998E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000153E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999985E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999852E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999855E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999857E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999986E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999862E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999864E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999866E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999987E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999871E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999874E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999876E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999878E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999988E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999883E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999886E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999888E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999989E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999893E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999895E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999897E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.214748364499999E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999902E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999905E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999907E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999991E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999912E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999914E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999917E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999992E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999921E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999924E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999926E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999928E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999993E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999933E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999936E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999938E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999994E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999943E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999945E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999948E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999995E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999952E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999955E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999957E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999996E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999962E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999964E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999967E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999997E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999971E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999974E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999976E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999979E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999998E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999983E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999986E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999988E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999999E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999993E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999995E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999998E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21139292170000153E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999985E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999852E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999855E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999857E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999986E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999862E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999864E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999866E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999987E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999871E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999874E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999876E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999878E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999988E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999883E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999886E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999888E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999989E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999893E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999895E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999897E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.211392921699999E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999902E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999905E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999907E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999991E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999912E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999914E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999917E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999992E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999921E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999924E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999926E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999928E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999993E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999933E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999936E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999938E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999994E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999943E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999945E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999948E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999995E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999952E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999955E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999957E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999996E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999962E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999964E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999967E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999997E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999971E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999974E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999976E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999979E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999998E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999983E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999986E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999988E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999999E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999993E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999995E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999998E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.20803747850000153E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999985E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999852E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999855E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999857E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999986E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999862E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999864E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999866E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999987E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999871E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999874E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999876E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999878E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999988E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999883E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999886E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999888E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999989E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999893E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999895E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999897E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.208037478499999E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999902E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999905E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999907E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999991E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999912E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999914E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999917E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999992E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999921E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999924E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999926E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999928E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999993E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999933E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999936E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999938E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999994E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999943E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999945E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999948E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999995E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999952E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999955E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999957E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999996E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999962E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999964E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999967E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999997E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999971E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999974E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999976E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999979E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999998E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999983E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999986E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999988E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999999E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999993E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999995E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999998E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20132659210000153E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999985E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999852E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999855E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999857E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999986E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999862E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999864E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999866E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999987E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999871E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999874E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999876E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999878E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999988E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999883E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999886E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999888E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999989E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999893E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999895E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999897E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.201326592099999E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999902E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999905E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999907E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999991E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999912E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999914E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999917E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999992E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999921E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999924E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999926E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999928E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999993E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999933E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999936E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999938E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999994E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999943E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999945E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999948E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999995E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999952E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999955E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999957E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999996E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999962E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999964E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999967E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999997E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999971E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999974E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999976E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999979E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999998E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999983E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999986E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999988E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999999E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999993E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999995E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999998E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.18790481930000153E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999985E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999852E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999855E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999857E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999986E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999862E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999864E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999866E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999987E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999871E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999874E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999876E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999878E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999988E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999883E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999886E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999888E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999989E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999893E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999895E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999897E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.187904819299999E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999902E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999905E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999907E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999991E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999912E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999914E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999917E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999992E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999921E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999924E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999926E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999928E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999993E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999933E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999936E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999938E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999994E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999943E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999945E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999948E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999995E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999952E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999955E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999957E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999996E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999962E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999964E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999967E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999997E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999971E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999974E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999976E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999979E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999998E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999983E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999986E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999988E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999999E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999993E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999995E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999998E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.16106127370000153E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999985E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999852E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999855E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999857E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999986E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999862E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999864E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999866E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999987E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999871E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999874E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999876E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999878E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999988E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999883E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999886E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999888E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999989E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999893E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999895E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999897E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.161061273699999E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999902E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999905E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999907E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999991E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999912E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999914E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999917E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999992E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999921E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999924E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999926E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999928E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999993E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999933E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999936E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999938E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999994E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999943E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999945E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999948E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999995E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999952E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999955E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999957E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999996E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999962E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999964E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999967E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999997E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999971E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999974E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999976E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999979E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999998E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999983E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999986E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999988E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999999E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999993E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999995E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999998E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.10737418250000153E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999985E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999852E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999855E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999857E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999986E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999862E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999864E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999866E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999987E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999871E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999874E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999876E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999878E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999988E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999883E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999886E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999888E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999989E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999893E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999895E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999897E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.107374182499999E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999902E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999905E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999907E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999991E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999912E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999914E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999917E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999992E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999921E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999924E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999926E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999928E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999993E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999933E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999936E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999938E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999994E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999943E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999945E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999948E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999995E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999952E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999955E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999957E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999996E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999962E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999964E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999967E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999997E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999971E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999974E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999976E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999979E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999998E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999983E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999986E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999988E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999999E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999993E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999995E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999998E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.30000000000000284E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_POSINF] --> [~3,~3] --> OK [~0.300000000000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_POSINF] --> [~3,~3] --> OK [~0.300000000000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.3E1,TO_POSINF] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999972E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999725E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999973E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999734E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999974E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999742E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999747E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999975E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999756E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999976E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999765E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999977E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999774E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999978E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999782E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999787E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999979E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999796E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999999999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999805E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999981E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999813E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999982E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999822E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999827E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999983E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999836E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999984E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999845E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999985E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999853E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999862E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999867E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999876E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999885E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999989E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999893E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999999999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999902E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999907E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999991E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999916E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999992E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999925E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999933E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999994E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999942E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999947E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999956E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999964E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999997E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999973E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999982E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000284E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_POSINF] --> [~2,~2] --> OK [~0.200000000000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_POSINF] --> [~2,~2] --> OK [~0.200000000000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.2E1,TO_POSINF] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999986E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999862E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999865E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999867E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999871E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999873E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999876E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999878E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999988E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999882E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999885E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999887E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999989E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999891E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999893E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999896E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999898E1,TO_POSINF] --> [~1,~1] --> OK [~0.199999999999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999902E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999905E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999907E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999991E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999911E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999913E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999916E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999918E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999992E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999922E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999925E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999927E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999931E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999933E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999936E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999938E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999942E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999944E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999947E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999951E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999953E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999956E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999958E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999962E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999964E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999967E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999997E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999971E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999973E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999976E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999978E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999982E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999984E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999991E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000142E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_POSINF] --> [~1,~1] --> OK [~0.100000000000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.1E1,TO_POSINF] --> [~1,~1] --> OK [~0.9999999999999929,TO_POSINF] --> [0,0] --> OK [~0.999999999999993,TO_POSINF] --> [0,0] --> OK [~0.9999999999999931,TO_POSINF] --> [0,0] --> OK [~0.9999999999999932,TO_POSINF] --> [0,0] --> OK [~0.9999999999999933,TO_POSINF] --> [0,0] --> OK [~0.9999999999999934,TO_POSINF] --> [0,0] --> OK [~0.9999999999999936,TO_POSINF] --> [0,0] --> OK [~0.9999999999999937,TO_POSINF] --> [0,0] --> OK [~0.9999999999999938,TO_POSINF] --> [0,0] --> OK [~0.9999999999999939,TO_POSINF] --> [0,0] --> OK [~0.999999999999994,TO_POSINF] --> [0,0] --> OK [~0.9999999999999941,TO_POSINF] --> [0,0] --> OK [~0.9999999999999942,TO_POSINF] --> [0,0] --> OK [~0.9999999999999943,TO_POSINF] --> [0,0] --> OK [~0.9999999999999944,TO_POSINF] --> [0,0] --> OK [~0.9999999999999946,TO_POSINF] --> [0,0] --> OK [~0.9999999999999947,TO_POSINF] --> [0,0] --> OK [~0.9999999999999948,TO_POSINF] --> [0,0] --> OK [~0.9999999999999949,TO_POSINF] --> [0,0] --> OK [~0.999999999999995,TO_POSINF] --> [0,0] --> OK [~0.9999999999999951,TO_POSINF] --> [0,0] --> OK [~0.9999999999999952,TO_POSINF] --> [0,0] --> OK [~0.9999999999999953,TO_POSINF] --> [0,0] --> OK [~0.9999999999999954,TO_POSINF] --> [0,0] --> OK [~0.9999999999999956,TO_POSINF] --> [0,0] --> OK [~0.9999999999999957,TO_POSINF] --> [0,0] --> OK [~0.9999999999999958,TO_POSINF] --> [0,0] --> OK [~0.9999999999999959,TO_POSINF] --> [0,0] --> OK [~0.999999999999996,TO_POSINF] --> [0,0] --> OK [~0.9999999999999961,TO_POSINF] --> [0,0] --> OK [~0.9999999999999962,TO_POSINF] --> [0,0] --> OK [~0.9999999999999963,TO_POSINF] --> [0,0] --> OK [~0.9999999999999964,TO_POSINF] --> [0,0] --> OK [~0.9999999999999966,TO_POSINF] --> [0,0] --> OK [~0.9999999999999967,TO_POSINF] --> [0,0] --> OK [~0.9999999999999968,TO_POSINF] --> [0,0] --> OK [~0.9999999999999969,TO_POSINF] --> [0,0] --> OK [~0.999999999999997,TO_POSINF] --> [0,0] --> OK [~0.9999999999999971,TO_POSINF] --> [0,0] --> OK [~0.9999999999999972,TO_POSINF] --> [0,0] --> OK [~0.9999999999999973,TO_POSINF] --> [0,0] --> OK [~0.9999999999999974,TO_POSINF] --> [0,0] --> OK [~0.9999999999999976,TO_POSINF] --> [0,0] --> OK [~0.9999999999999977,TO_POSINF] --> [0,0] --> OK [~0.9999999999999978,TO_POSINF] --> [0,0] --> OK [~0.9999999999999979,TO_POSINF] --> [0,0] --> OK [~0.999999999999998,TO_POSINF] --> [0,0] --> OK [~0.9999999999999981,TO_POSINF] --> [0,0] --> OK [~0.9999999999999982,TO_POSINF] --> [0,0] --> OK [~0.9999999999999983,TO_POSINF] --> [0,0] --> OK [~0.9999999999999984,TO_POSINF] --> [0,0] --> OK [~0.9999999999999986,TO_POSINF] --> [0,0] --> OK [~0.9999999999999987,TO_POSINF] --> [0,0] --> OK [~0.9999999999999988,TO_POSINF] --> [0,0] --> OK [~0.9999999999999989,TO_POSINF] --> [0,0] --> OK [~0.999999999999999,TO_POSINF] --> [0,0] --> OK [~0.9999999999999991,TO_POSINF] --> [0,0] --> OK [~0.9999999999999992,TO_POSINF] --> [0,0] --> OK [~0.9999999999999993,TO_POSINF] --> [0,0] --> OK [~0.9999999999999994,TO_POSINF] --> [0,0] --> OK [~0.9999999999999996,TO_POSINF] --> [0,0] --> OK [~0.9999999999999997,TO_POSINF] --> [0,0] --> OK [~0.9999999999999998,TO_POSINF] --> [0,0] --> OK [~0.9999999999999999,TO_POSINF] --> [0,0] --> OK [~0.316E~321,TO_POSINF] --> [0,0] --> OK [~0.31E~321,TO_POSINF] --> [0,0] --> OK [~0.306E~321,TO_POSINF] --> [0,0] --> OK [~0.3E~321,TO_POSINF] --> [0,0] --> OK [~0.296E~321,TO_POSINF] --> [0,0] --> OK [~0.29E~321,TO_POSINF] --> [0,0] --> OK [~0.287E~321,TO_POSINF] --> [0,0] --> OK [~0.28E~321,TO_POSINF] --> [0,0] --> OK [~0.277E~321,TO_POSINF] --> [0,0] --> OK [~0.27E~321,TO_POSINF] --> [0,0] --> OK [~0.267E~321,TO_POSINF] --> [0,0] --> OK [~0.26E~321,TO_POSINF] --> [0,0] --> OK [~0.257E~321,TO_POSINF] --> [0,0] --> OK [~0.25E~321,TO_POSINF] --> [0,0] --> OK [~0.247E~321,TO_POSINF] --> [0,0] --> OK [~0.24E~321,TO_POSINF] --> [0,0] --> OK [~0.237E~321,TO_POSINF] --> [0,0] --> OK [~0.23E~321,TO_POSINF] --> [0,0] --> OK [~0.227E~321,TO_POSINF] --> [0,0] --> OK [~0.22E~321,TO_POSINF] --> [0,0] --> OK [~0.217E~321,TO_POSINF] --> [0,0] --> OK [~0.21E~321,TO_POSINF] --> [0,0] --> OK [~0.208E~321,TO_POSINF] --> [0,0] --> OK [~0.203E~321,TO_POSINF] --> [0,0] --> OK [~0.2E~321,TO_POSINF] --> [0,0] --> OK [~0.193E~321,TO_POSINF] --> [0,0] --> OK [~0.19E~321,TO_POSINF] --> [0,0] --> OK [~0.183E~321,TO_POSINF] --> [0,0] --> OK [~0.18E~321,TO_POSINF] --> [0,0] --> OK [~0.173E~321,TO_POSINF] --> [0,0] --> OK [~0.17E~321,TO_POSINF] --> [0,0] --> OK [~0.163E~321,TO_POSINF] --> [0,0] --> OK [~0.16E~321,TO_POSINF] --> [0,0] --> OK [~0.153E~321,TO_POSINF] --> [0,0] --> OK [~0.15E~321,TO_POSINF] --> [0,0] --> OK [~0.143E~321,TO_POSINF] --> [0,0] --> OK [~0.14E~321,TO_POSINF] --> [0,0] --> OK [~0.133E~321,TO_POSINF] --> [0,0] --> OK [~0.13E~321,TO_POSINF] --> [0,0] --> OK [~0.124E~321,TO_POSINF] --> [0,0] --> OK [~0.12E~321,TO_POSINF] --> [0,0] --> OK [~0.114E~321,TO_POSINF] --> [0,0] --> OK [~0.11E~321,TO_POSINF] --> [0,0] --> OK [~0.104E~321,TO_POSINF] --> [0,0] --> OK [~0.1E~321,TO_POSINF] --> [0,0] --> OK [~0.94E~322,TO_POSINF] --> [0,0] --> OK [~0.9E~322,TO_POSINF] --> [0,0] --> OK [~0.84E~322,TO_POSINF] --> [0,0] --> OK [~0.8E~322,TO_POSINF] --> [0,0] --> OK [~0.74E~322,TO_POSINF] --> [0,0] --> OK [~0.7E~322,TO_POSINF] --> [0,0] --> OK [~0.64E~322,TO_POSINF] --> [0,0] --> OK [~0.6E~322,TO_POSINF] --> [0,0] --> OK [~0.54E~322,TO_POSINF] --> [0,0] --> OK [~0.5E~322,TO_POSINF] --> [0,0] --> OK [~0.44E~322,TO_POSINF] --> [0,0] --> OK [~0.4E~322,TO_POSINF] --> [0,0] --> OK [~0.35E~322,TO_POSINF] --> [0,0] --> OK [~0.3E~322,TO_POSINF] --> [0,0] --> OK [~0.25E~322,TO_POSINF] --> [0,0] --> OK [~0.2E~322,TO_POSINF] --> [0,0] --> OK [~0.15E~322,TO_POSINF] --> [0,0] --> OK [~0.1E~322,TO_POSINF] --> [0,0] --> OK [~0.5E~323,TO_POSINF] --> [0,0] --> OK [0.0,TO_POSINF] --> [0,0] --> OK [0.316E~321,TO_POSINF] --> [1,1] --> OK [0.31E~321,TO_POSINF] --> [1,1] --> OK [0.306E~321,TO_POSINF] --> [1,1] --> OK [0.3E~321,TO_POSINF] --> [1,1] --> OK [0.296E~321,TO_POSINF] --> [1,1] --> OK [0.29E~321,TO_POSINF] --> [1,1] --> OK [0.287E~321,TO_POSINF] --> [1,1] --> OK [0.28E~321,TO_POSINF] --> [1,1] --> OK [0.277E~321,TO_POSINF] --> [1,1] --> OK [0.27E~321,TO_POSINF] --> [1,1] --> OK [0.267E~321,TO_POSINF] --> [1,1] --> OK [0.26E~321,TO_POSINF] --> [1,1] --> OK [0.257E~321,TO_POSINF] --> [1,1] --> OK [0.25E~321,TO_POSINF] --> [1,1] --> OK [0.247E~321,TO_POSINF] --> [1,1] --> OK [0.24E~321,TO_POSINF] --> [1,1] --> OK [0.237E~321,TO_POSINF] --> [1,1] --> OK [0.23E~321,TO_POSINF] --> [1,1] --> OK [0.227E~321,TO_POSINF] --> [1,1] --> OK [0.22E~321,TO_POSINF] --> [1,1] --> OK [0.217E~321,TO_POSINF] --> [1,1] --> OK [0.21E~321,TO_POSINF] --> [1,1] --> OK [0.208E~321,TO_POSINF] --> [1,1] --> OK [0.203E~321,TO_POSINF] --> [1,1] --> OK [0.2E~321,TO_POSINF] --> [1,1] --> OK [0.193E~321,TO_POSINF] --> [1,1] --> OK [0.19E~321,TO_POSINF] --> [1,1] --> OK [0.183E~321,TO_POSINF] --> [1,1] --> OK [0.18E~321,TO_POSINF] --> [1,1] --> OK [0.173E~321,TO_POSINF] --> [1,1] --> OK [0.17E~321,TO_POSINF] --> [1,1] --> OK [0.163E~321,TO_POSINF] --> [1,1] --> OK [0.16E~321,TO_POSINF] --> [1,1] --> OK [0.153E~321,TO_POSINF] --> [1,1] --> OK [0.15E~321,TO_POSINF] --> [1,1] --> OK [0.143E~321,TO_POSINF] --> [1,1] --> OK [0.14E~321,TO_POSINF] --> [1,1] --> OK [0.133E~321,TO_POSINF] --> [1,1] --> OK [0.13E~321,TO_POSINF] --> [1,1] --> OK [0.124E~321,TO_POSINF] --> [1,1] --> OK [0.12E~321,TO_POSINF] --> [1,1] --> OK [0.114E~321,TO_POSINF] --> [1,1] --> OK [0.11E~321,TO_POSINF] --> [1,1] --> OK [0.104E~321,TO_POSINF] --> [1,1] --> OK [0.1E~321,TO_POSINF] --> [1,1] --> OK [0.94E~322,TO_POSINF] --> [1,1] --> OK [0.9E~322,TO_POSINF] --> [1,1] --> OK [0.84E~322,TO_POSINF] --> [1,1] --> OK [0.8E~322,TO_POSINF] --> [1,1] --> OK [0.74E~322,TO_POSINF] --> [1,1] --> OK [0.7E~322,TO_POSINF] --> [1,1] --> OK [0.64E~322,TO_POSINF] --> [1,1] --> OK [0.6E~322,TO_POSINF] --> [1,1] --> OK [0.54E~322,TO_POSINF] --> [1,1] --> OK [0.5E~322,TO_POSINF] --> [1,1] --> OK [0.44E~322,TO_POSINF] --> [1,1] --> OK [0.4E~322,TO_POSINF] --> [1,1] --> OK [0.35E~322,TO_POSINF] --> [1,1] --> OK [0.3E~322,TO_POSINF] --> [1,1] --> OK [0.25E~322,TO_POSINF] --> [1,1] --> OK [0.2E~322,TO_POSINF] --> [1,1] --> OK [0.15E~322,TO_POSINF] --> [1,1] --> OK [0.1E~322,TO_POSINF] --> [1,1] --> OK [0.5E~323,TO_POSINF] --> [1,1] --> OK [0.9999999999999929,TO_POSINF] --> [1,1] --> OK [0.999999999999993,TO_POSINF] --> [1,1] --> OK [0.9999999999999931,TO_POSINF] --> [1,1] --> OK [0.9999999999999932,TO_POSINF] --> [1,1] --> OK [0.9999999999999933,TO_POSINF] --> [1,1] --> OK [0.9999999999999934,TO_POSINF] --> [1,1] --> OK [0.9999999999999936,TO_POSINF] --> [1,1] --> OK [0.9999999999999937,TO_POSINF] --> [1,1] --> OK [0.9999999999999938,TO_POSINF] --> [1,1] --> OK [0.9999999999999939,TO_POSINF] --> [1,1] --> OK [0.999999999999994,TO_POSINF] --> [1,1] --> OK [0.9999999999999941,TO_POSINF] --> [1,1] --> OK [0.9999999999999942,TO_POSINF] --> [1,1] --> OK [0.9999999999999943,TO_POSINF] --> [1,1] --> OK [0.9999999999999944,TO_POSINF] --> [1,1] --> OK [0.9999999999999946,TO_POSINF] --> [1,1] --> OK [0.9999999999999947,TO_POSINF] --> [1,1] --> OK [0.9999999999999948,TO_POSINF] --> [1,1] --> OK [0.9999999999999949,TO_POSINF] --> [1,1] --> OK [0.999999999999995,TO_POSINF] --> [1,1] --> OK [0.9999999999999951,TO_POSINF] --> [1,1] --> OK [0.9999999999999952,TO_POSINF] --> [1,1] --> OK [0.9999999999999953,TO_POSINF] --> [1,1] --> OK [0.9999999999999954,TO_POSINF] --> [1,1] --> OK [0.9999999999999956,TO_POSINF] --> [1,1] --> OK [0.9999999999999957,TO_POSINF] --> [1,1] --> OK [0.9999999999999958,TO_POSINF] --> [1,1] --> OK [0.9999999999999959,TO_POSINF] --> [1,1] --> OK [0.999999999999996,TO_POSINF] --> [1,1] --> OK [0.9999999999999961,TO_POSINF] --> [1,1] --> OK [0.9999999999999962,TO_POSINF] --> [1,1] --> OK [0.9999999999999963,TO_POSINF] --> [1,1] --> OK [0.9999999999999964,TO_POSINF] --> [1,1] --> OK [0.9999999999999966,TO_POSINF] --> [1,1] --> OK [0.9999999999999967,TO_POSINF] --> [1,1] --> OK [0.9999999999999968,TO_POSINF] --> [1,1] --> OK [0.9999999999999969,TO_POSINF] --> [1,1] --> OK [0.999999999999997,TO_POSINF] --> [1,1] --> OK [0.9999999999999971,TO_POSINF] --> [1,1] --> OK [0.9999999999999972,TO_POSINF] --> [1,1] --> OK [0.9999999999999973,TO_POSINF] --> [1,1] --> OK [0.9999999999999974,TO_POSINF] --> [1,1] --> OK [0.9999999999999976,TO_POSINF] --> [1,1] --> OK [0.9999999999999977,TO_POSINF] --> [1,1] --> OK [0.9999999999999978,TO_POSINF] --> [1,1] --> OK [0.9999999999999979,TO_POSINF] --> [1,1] --> OK [0.999999999999998,TO_POSINF] --> [1,1] --> OK [0.9999999999999981,TO_POSINF] --> [1,1] --> OK [0.9999999999999982,TO_POSINF] --> [1,1] --> OK [0.9999999999999983,TO_POSINF] --> [1,1] --> OK [0.9999999999999984,TO_POSINF] --> [1,1] --> OK [0.9999999999999986,TO_POSINF] --> [1,1] --> OK [0.9999999999999987,TO_POSINF] --> [1,1] --> OK [0.9999999999999988,TO_POSINF] --> [1,1] --> OK [0.9999999999999989,TO_POSINF] --> [1,1] --> OK [0.999999999999999,TO_POSINF] --> [1,1] --> OK [0.9999999999999991,TO_POSINF] --> [1,1] --> OK [0.9999999999999992,TO_POSINF] --> [1,1] --> OK [0.9999999999999993,TO_POSINF] --> [1,1] --> OK [0.9999999999999994,TO_POSINF] --> [1,1] --> OK [0.9999999999999996,TO_POSINF] --> [1,1] --> OK [0.9999999999999997,TO_POSINF] --> [1,1] --> OK [0.9999999999999998,TO_POSINF] --> [1,1] --> OK [0.9999999999999999,TO_POSINF] --> [1,1] --> OK [0.1E1,TO_POSINF] --> [1,1] --> OK [0.10000000000000142E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000014E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000138E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000135E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000133E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000013E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000129E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000127E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000124E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000122E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000012E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000118E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000115E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000113E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000011E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000109E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000107E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000104E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000102E1,TO_POSINF] --> [2,2] --> OK [0.100000000000001E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000098E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000095E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000093E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000009E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000089E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000087E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000084E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000082E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000008E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000078E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000075E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000073E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000007E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000069E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000067E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000064E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000062E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000006E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000058E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000056E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000053E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000005E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000049E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000047E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000044E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000042E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000004E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000038E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000036E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000033E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000003E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000029E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000027E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000024E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000022E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000002E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000018E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000016E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000013E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000001E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000009E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000007E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000004E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000002E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999858E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999986E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999862E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999865E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999867E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999987E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999871E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999873E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999876E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999878E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999988E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999882E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999885E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999887E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999989E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999891E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999893E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999896E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999898E1,TO_POSINF] --> [2,2] --> OK [0.199999999999999E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999902E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999905E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999907E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999991E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999911E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999913E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999916E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999918E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999992E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999922E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999925E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999927E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999993E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999931E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999933E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999936E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999938E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999994E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999942E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999944E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999947E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999995E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999951E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999953E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999956E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999958E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999996E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999962E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999964E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999967E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999997E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999971E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999973E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999976E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999978E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999998E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999982E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999984E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999987E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999999E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999991E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999993E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999996E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999998E1,TO_POSINF] --> [2,2] --> OK [0.2E1,TO_POSINF] --> [2,2] --> OK [0.20000000000000284E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000028E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000275E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000027E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000266E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000026E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000258E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000253E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000025E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000244E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000024E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000235E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000023E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000226E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000022E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000218E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000213E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000021E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000204E1,TO_POSINF] --> [3,3] --> OK [0.200000000000002E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000195E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000019E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000187E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000018E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000178E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000173E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000017E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000164E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000016E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000155E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000015E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000147E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000014E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000138E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000133E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000013E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000124E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000012E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000115E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000011E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000107E1,TO_POSINF] --> [3,3] --> OK [0.200000000000001E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000098E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000093E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000009E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000084E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000008E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000075E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000007E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000067E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000006E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000058E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000053E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000005E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000044E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000004E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000036E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000003E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000027E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000002E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000018E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000013E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000001E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000004E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999716E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999972E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999725E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999973E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999734E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999974E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999742E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999747E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999975E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999756E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999976E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999765E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999977E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999774E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999978E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999782E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999787E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999979E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999796E1,TO_POSINF] --> [3,3] --> OK [0.299999999999998E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999805E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999981E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999813E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999982E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999822E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999827E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999983E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999836E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999984E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999845E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999985E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999853E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999986E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999862E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999867E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999987E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999876E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999988E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999885E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999989E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999893E1,TO_POSINF] --> [3,3] --> OK [0.299999999999999E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999902E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999907E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999991E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999916E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999992E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999925E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999993E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999933E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999994E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999942E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999947E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999995E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999956E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999996E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999964E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999997E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999973E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999998E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999982E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999987E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999999E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999996E1,TO_POSINF] --> [3,3] --> OK [0.3E1,TO_POSINF] --> [3,3] --> OK [0.30000000000000284E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000028E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000275E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000027E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000266E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000026E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000258E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000253E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000025E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000244E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000024E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000235E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000023E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000226E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000022E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000218E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000213E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000021E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000204E1,TO_POSINF] --> [4,4] --> OK [0.300000000000002E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000195E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000019E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000187E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000018E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000178E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000173E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000017E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000164E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000016E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000155E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000015E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000147E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000014E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000138E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000133E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000013E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000124E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000012E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000115E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000011E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000107E1,TO_POSINF] --> [4,4] --> OK [0.300000000000001E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000098E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000093E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000009E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000084E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000008E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000075E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000007E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000067E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000006E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000058E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000053E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000005E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000044E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000004E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000036E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000003E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000027E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000002E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000018E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000013E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000001E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000004E1,TO_POSINF] --> [4,4] --> OK [0.10737418239999924E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999925E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999926E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999927E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999928E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999993E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999931E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999932E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999933E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999934E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999936E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999937E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999938E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999939E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999994E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999942E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999943E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999944E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999945E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999946E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999948E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999949E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999995E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999951E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999952E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999954E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999955E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999956E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999957E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999958E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999996E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999961E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999962E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999963E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999964E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999965E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999967E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999968E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999969E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999997E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999971E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999973E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999974E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999975E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999976E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999977E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999979E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999998E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999981E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999982E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999983E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999985E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999986E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999987E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999988E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999989E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999999E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999992E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999993E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999994E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999995E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999996E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999998E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999999E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741824E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000015E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000148E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000145E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000143E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000014E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000138E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000136E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000134E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000013E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000129E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000126E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000124E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000122E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000012E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000117E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000114E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000112E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000011E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000107E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000105E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000103E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.107374182400001E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000098E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000095E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000093E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000009E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000088E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000086E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000083E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000008E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000079E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000076E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000074E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000072E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000007E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000067E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000064E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000062E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000006E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000057E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000055E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000052E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000005E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000048E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000045E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000043E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000004E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000038E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000036E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000033E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000003E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000029E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000026E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000024E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000021E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000002E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000017E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000014E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000012E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000001E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000007E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000005E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000002E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.16106127359999847E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999985E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999852E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999855E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999857E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999986E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999862E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999864E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999866E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999987E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999871E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999874E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999876E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999878E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999988E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999883E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999886E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999888E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999989E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999893E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999895E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999897E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.161061273599999E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999902E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999905E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999907E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999991E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999912E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999914E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999917E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999992E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999921E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999924E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999926E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999928E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999993E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999933E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999936E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999938E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999994E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999943E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999945E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999948E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999995E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999952E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999955E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999957E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999996E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999962E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999964E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999967E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999997E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999971E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999974E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999976E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999979E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999998E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999983E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999986E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999988E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999999E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999993E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999995E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999998E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612736E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000015E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000148E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000145E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000143E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000014E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000138E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000136E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000134E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000013E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000129E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000126E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000124E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000122E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000012E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000117E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000114E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000112E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000011E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000107E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000105E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000103E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.161061273600001E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000098E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000095E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000093E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000009E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000088E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000086E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000083E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000008E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000079E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000076E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000074E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000072E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000007E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000067E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000064E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000062E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000006E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000057E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000055E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000052E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000005E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000048E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000045E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000043E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000004E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000038E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000036E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000033E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000003E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000029E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000026E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000024E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000021E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000002E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000017E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000014E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000012E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000001E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000007E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000005E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000002E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.18790481919999847E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999985E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999852E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999855E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999857E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999986E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999862E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999864E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999866E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999987E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999871E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999874E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999876E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999878E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999988E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999883E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999886E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999888E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999989E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999893E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999895E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999897E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.187904819199999E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999902E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999905E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999907E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999991E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999912E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999914E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999917E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999992E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999921E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999924E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999926E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999928E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999993E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999933E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999936E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999938E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999994E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999943E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999945E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999948E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999995E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999952E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999955E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999957E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999996E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999962E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999964E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999967E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999997E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999971E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999974E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999976E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999979E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999998E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999983E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999986E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999988E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999999E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999993E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999995E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999998E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048192E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000015E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000148E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000145E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000143E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000014E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000138E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000136E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000134E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000013E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000129E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000126E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000124E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000122E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000012E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000117E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000114E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000112E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000011E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000107E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000105E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000103E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.187904819200001E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000098E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000095E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000093E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000009E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000088E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000086E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000083E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000008E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000079E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000076E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000074E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000072E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000007E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000067E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000064E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000062E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000006E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000057E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000055E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000052E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000005E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000048E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000045E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000043E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000004E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000038E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000036E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000033E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000003E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000029E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000026E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000024E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000021E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000002E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000017E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000014E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000012E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000001E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000007E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000005E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000002E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.20132659199999847E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999985E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999852E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999855E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999857E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999986E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999862E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999864E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999866E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999987E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999871E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999874E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999876E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999878E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999988E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999883E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999886E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999888E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999989E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999893E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999895E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999897E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.201326591999999E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999902E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999905E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999907E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999991E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999912E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999914E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999917E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999992E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999921E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999924E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999926E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999928E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999993E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999933E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999936E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999938E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999994E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999943E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999945E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999948E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999995E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999952E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999955E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999957E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999996E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999962E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999964E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999967E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999997E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999971E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999974E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999976E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999979E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999998E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999983E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999986E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999988E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999999E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999993E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999995E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999998E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.201326592E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000015E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000148E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000145E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000143E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000014E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000138E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000136E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000134E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000013E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000129E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000126E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000124E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000122E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000012E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000117E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000114E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000112E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000011E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000107E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000105E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000103E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.201326592000001E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000098E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000095E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000093E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000009E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000088E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000086E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000083E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000008E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000079E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000076E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000074E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000072E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000007E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000067E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000064E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000062E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000006E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000057E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000055E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000052E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000005E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000048E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000045E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000043E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000004E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000038E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000036E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000033E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000003E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000029E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000026E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000024E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000021E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000002E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000017E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000014E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000012E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000001E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000007E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000005E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000002E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20803747839999847E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999985E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999852E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999855E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999857E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999986E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999862E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999864E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999866E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999987E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999871E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999874E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999876E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999878E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999988E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999883E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999886E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999888E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999989E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999893E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999895E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999897E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.208037478399999E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999902E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999905E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999907E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999991E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999912E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999914E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999917E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999992E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999921E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999924E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999926E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999928E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999993E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999933E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999936E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999938E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999994E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999943E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999945E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999948E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999995E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999952E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999955E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999957E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999996E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999962E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999964E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999967E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999997E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999971E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999974E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999976E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999979E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999998E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999983E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999986E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999988E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999999E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999993E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999995E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999998E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374784E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000015E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000148E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000145E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000143E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000014E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000138E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000136E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000134E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000013E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000129E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000126E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000124E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000122E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000012E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000117E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000114E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000112E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000011E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000107E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000105E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000103E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.208037478400001E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000098E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000095E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000093E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000009E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000088E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000086E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000083E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000008E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000079E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000076E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000074E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000072E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000007E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000067E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000064E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000062E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000006E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000057E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000055E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000052E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000005E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000048E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000045E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000043E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000004E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000038E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000036E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000033E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000003E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000029E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000026E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000024E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000021E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000002E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000017E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000014E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000012E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000001E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000007E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000005E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000002E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.21139292159999847E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999985E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999852E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999855E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999857E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999986E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999862E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999864E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999866E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999987E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999871E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999874E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999876E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999878E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999988E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999883E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999886E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999888E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999989E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999893E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999895E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999897E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.211392921599999E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999902E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999905E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999907E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999991E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999912E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999914E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999917E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999992E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999921E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999924E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999926E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999928E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999993E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999933E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999936E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999938E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999994E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999943E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999945E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999948E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999995E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999952E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999955E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999957E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999996E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999962E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999964E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999967E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999997E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999971E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999974E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999976E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999979E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999998E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999983E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999986E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999988E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999999E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999993E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999995E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999998E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929216E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000015E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000148E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000145E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000143E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000014E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000138E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000136E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000134E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000013E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000129E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000126E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000124E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000122E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000012E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000117E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000114E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000112E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000011E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000107E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000105E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000103E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.211392921600001E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000098E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000095E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000093E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000009E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000088E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000086E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000083E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000008E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000079E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000076E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000074E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000072E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000007E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000067E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000064E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000062E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000006E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000057E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000055E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000052E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000005E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000048E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000045E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000043E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000004E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000038E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000036E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000033E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000003E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000029E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000026E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000024E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000021E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000002E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000017E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000014E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000012E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000001E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000007E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000005E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000002E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21474836439999847E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999985E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999852E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999855E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999857E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999986E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999862E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999864E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999866E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999987E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999871E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999874E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999876E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999878E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999988E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999883E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999886E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999888E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999989E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999893E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999895E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999897E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.214748364399999E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999902E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999905E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999907E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999991E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999912E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999914E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999917E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999992E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999921E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999924E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999926E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999928E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999993E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999933E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999936E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999938E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999994E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999943E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999945E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999948E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999995E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999952E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999955E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999957E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999996E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999962E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999964E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999967E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999997E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999971E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999974E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999976E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999979E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999998E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999983E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999986E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999988E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999999E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999993E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999995E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999998E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483644E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000015E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000148E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000145E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000143E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000014E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000138E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000136E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000134E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000013E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000129E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000126E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000124E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000122E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000012E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000117E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000114E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000112E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000011E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000107E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000105E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000103E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.214748364400001E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000098E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000095E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000093E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000009E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000088E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000086E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000083E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000008E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000079E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000076E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000074E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000072E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000007E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000067E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000064E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000062E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000006E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000057E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000055E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000052E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000005E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000048E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000045E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000043E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000004E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000038E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000036E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000033E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000003E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000029E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000026E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000024E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000021E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000002E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000017E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000014E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000012E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000001E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000007E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000005E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000002E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999847E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999985E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999852E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999855E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999857E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999986E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999862E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999864E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999866E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999987E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999871E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999874E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999876E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999878E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999988E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999883E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999886E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999888E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999989E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999893E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999895E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999897E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.214748364499999E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999902E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999905E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999907E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999991E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999912E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999914E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999917E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999992E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999921E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999924E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999926E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999928E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999993E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999933E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999936E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999938E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999994E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999943E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999945E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999948E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999995E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999952E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999955E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999957E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999996E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999962E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999964E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999967E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999997E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999971E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999974E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999976E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999979E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999998E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999983E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999986E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999988E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999999E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999993E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999995E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999998E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483645E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000015E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000148E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000145E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000143E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000014E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000138E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000136E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000134E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000013E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000129E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000126E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000124E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000122E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000012E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000117E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000114E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000112E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000011E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000107E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000105E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000103E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.214748364500001E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000098E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000095E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000093E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000009E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000088E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000086E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000083E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000008E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000079E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000076E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000074E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000072E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000007E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000067E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000064E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000062E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000006E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000057E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000055E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000052E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000005E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000048E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000045E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000043E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000004E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000038E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000036E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000033E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000003E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000029E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000026E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000024E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000021E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000002E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000017E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000014E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000012E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000001E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000007E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000005E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000002E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999847E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999985E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999852E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999855E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999857E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999986E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999862E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999864E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999866E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999987E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999871E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999874E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999876E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999878E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999988E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999883E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999886E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999888E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999989E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999893E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999895E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999897E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.214748364599999E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999902E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999905E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999907E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999991E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999912E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999914E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999917E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999992E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999921E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999924E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999926E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999928E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999993E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999933E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999936E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999938E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999994E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999943E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999945E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999948E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999995E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999952E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999955E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999957E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999996E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999962E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999964E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999967E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999997E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999971E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999974E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999976E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999979E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999998E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999983E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999986E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999988E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999999E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999993E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999995E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999998E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483646E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000015E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000148E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000145E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000143E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000014E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000138E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000136E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000134E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000013E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000129E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000126E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000124E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000122E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000012E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000117E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000114E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000112E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000011E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000107E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000105E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000103E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.214748364600001E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000098E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000095E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000093E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000009E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000088E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000086E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000083E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000008E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000079E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000076E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000074E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000072E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000007E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000067E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000064E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000062E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000006E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000057E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000055E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000052E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000005E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000048E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000045E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000043E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000004E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000038E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000036E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000033E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000003E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000029E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000026E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000024E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000021E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000002E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000017E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000014E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000012E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000001E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000007E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000005E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000002E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999847E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999985E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999852E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999855E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999857E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999986E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999862E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999864E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999866E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999987E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999871E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999874E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999876E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999878E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999988E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999883E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999886E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999888E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999989E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999893E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999895E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999897E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.214748364699999E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999902E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999905E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999907E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999991E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999912E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999914E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999917E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999992E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999921E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999924E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999926E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999928E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999993E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999933E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999936E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999938E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999994E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999943E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999945E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999948E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999995E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999952E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999955E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999957E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999996E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999962E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999964E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999967E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999997E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999971E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999974E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999976E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999979E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999998E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999983E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999986E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999988E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999999E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999993E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999995E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999998E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483647E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000015E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000148E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000145E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000143E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000014E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000138E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000136E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000134E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000013E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000129E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000126E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000124E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000122E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000012E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000117E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000114E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000112E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000011E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000107E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000105E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000103E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.214748364700001E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000098E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000095E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000093E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000009E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000088E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000086E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000083E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000008E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000079E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000076E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000074E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000072E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000007E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000067E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000064E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000062E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000006E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000057E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000055E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000052E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000005E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000048E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000045E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000043E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000004E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000038E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000036E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000033E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000003E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000029E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000026E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000024E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000021E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000002E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000017E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000014E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000012E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000001E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000007E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000005E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000002E10,TO_POSINF] --> [Overflow,2147483648] --> OK [~0.21474836480000305E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999985E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999852E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999855E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999857E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999986E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999862E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999864E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999866E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999987E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999871E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999874E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999876E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999878E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999988E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999883E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999886E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999888E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999989E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999893E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999895E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999897E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.214748364799999E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999902E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999905E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999907E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999991E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999912E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999914E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999917E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999992E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999921E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999924E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999926E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999928E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999993E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999933E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999936E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999938E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999994E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999943E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999945E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999948E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999995E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999952E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999955E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999957E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999996E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999962E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999964E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999967E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999997E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999971E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999974E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999976E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999979E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999998E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999983E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999986E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999988E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999999E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999993E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999995E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999998E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000153E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999985E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999852E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999855E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999857E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999986E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999862E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999864E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999866E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999987E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999871E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999874E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999876E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999878E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999988E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999883E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999886E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999888E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999989E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999893E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999895E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999897E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.214748364699999E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999902E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999905E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999907E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999991E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999912E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999914E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999917E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999992E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999921E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999924E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999926E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999928E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999993E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999933E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999936E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999938E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999994E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999943E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999945E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999948E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999995E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999952E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999955E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999957E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999996E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999962E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999964E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999967E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999997E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999971E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999974E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999976E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999979E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999998E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999983E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999986E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999988E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999999E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999993E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999995E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999998E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000153E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999985E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999852E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999855E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999857E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999986E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999862E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999864E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999866E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999987E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999871E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999874E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999876E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999878E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999988E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999883E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999886E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999888E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999989E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999893E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999895E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999897E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.214748364599999E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999902E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999905E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999907E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999991E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999912E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999914E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999917E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999992E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999921E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999924E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999926E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999928E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999993E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999933E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999936E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999938E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999994E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999943E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999945E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999948E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999995E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999952E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999955E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999957E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999996E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999962E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999964E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999967E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999997E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999971E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999974E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999976E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999979E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999998E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999983E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999986E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999988E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999999E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999993E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999995E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999998E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000153E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999985E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999852E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999855E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999857E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999986E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999862E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999864E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999866E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999987E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999871E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999874E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999876E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999878E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999988E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999883E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999886E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999888E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999989E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999893E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999895E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999897E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.214748364499999E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999902E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999905E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999907E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999991E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999912E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999914E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999917E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999992E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999921E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999924E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999926E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999928E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999993E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999933E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999936E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999938E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999994E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999943E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999945E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999948E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999995E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999952E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999955E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999957E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999996E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999962E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999964E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999967E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999997E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999971E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999974E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999976E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999979E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999998E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999983E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999986E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999988E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999999E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999993E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999995E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999998E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21139292170000153E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999985E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999852E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999855E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999857E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999986E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999862E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999864E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999866E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999987E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999871E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999874E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999876E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999878E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999988E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999883E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999886E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999888E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999989E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999893E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999895E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999897E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.211392921699999E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999902E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999905E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999907E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999991E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999912E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999914E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999917E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999992E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999921E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999924E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999926E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999928E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999993E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999933E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999936E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999938E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999994E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999943E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999945E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999948E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999995E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999952E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999955E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999957E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999996E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999962E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999964E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999967E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999997E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999971E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999974E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999976E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999979E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999998E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999983E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999986E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999988E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999999E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999993E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999995E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999998E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.20803747850000153E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999985E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999852E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999855E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999857E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999986E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999862E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999864E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999866E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999987E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999871E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999874E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999876E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999878E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999988E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999883E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999886E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999888E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999989E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999893E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999895E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999897E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.208037478499999E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999902E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999905E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999907E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999991E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999912E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999914E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999917E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999992E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999921E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999924E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999926E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999928E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999993E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999933E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999936E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999938E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999994E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999943E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999945E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999948E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999995E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999952E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999955E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999957E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999996E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999962E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999964E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999967E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999997E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999971E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999974E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999976E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999979E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999998E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999983E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999986E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999988E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999999E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999993E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999995E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999998E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20132659210000153E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999985E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999852E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999855E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999857E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999986E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999862E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999864E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999866E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999987E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999871E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999874E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999876E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999878E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999988E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999883E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999886E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999888E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999989E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999893E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999895E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999897E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.201326592099999E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999902E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999905E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999907E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999991E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999912E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999914E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999917E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999992E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999921E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999924E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999926E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999928E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999993E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999933E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999936E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999938E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999994E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999943E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999945E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999948E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999995E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999952E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999955E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999957E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999996E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999962E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999964E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999967E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999997E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999971E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999974E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999976E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999979E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999998E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999983E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999986E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999988E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999999E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999993E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999995E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999998E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.18790481930000153E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999985E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999852E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999855E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999857E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999986E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999862E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999864E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999866E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999987E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999871E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999874E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999876E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999878E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999988E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999883E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999886E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999888E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999989E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999893E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999895E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999897E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.187904819299999E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999902E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999905E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999907E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999991E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999912E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999914E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999917E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999992E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999921E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999924E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999926E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999928E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999993E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999933E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999936E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999938E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999994E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999943E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999945E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999948E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999995E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999952E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999955E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999957E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999996E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999962E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999964E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999967E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999997E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999971E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999974E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999976E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999979E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999998E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999983E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999986E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999988E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999999E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999993E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999995E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999998E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.16106127370000153E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999985E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999852E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999855E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999857E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999986E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999862E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999864E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999866E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999987E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999871E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999874E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999876E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999878E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999988E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999883E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999886E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999888E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999989E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999893E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999895E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999897E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.161061273699999E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999902E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999905E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999907E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999991E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999912E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999914E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999917E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999992E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999921E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999924E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999926E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999928E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999993E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999933E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999936E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999938E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999994E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999943E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999945E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999948E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999995E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999952E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999955E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999957E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999996E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999962E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999964E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999967E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999997E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999971E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999974E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999976E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999979E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999998E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999983E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999986E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999988E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999999E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999993E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999995E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999998E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.10737418250000153E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999985E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999852E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999855E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999857E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999986E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999862E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999864E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999866E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999987E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999871E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999874E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999876E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999878E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999988E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999883E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999886E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999888E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999989E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999893E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999895E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999897E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.107374182499999E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999902E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999905E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999907E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999991E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999912E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999914E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999917E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999992E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999921E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999924E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999926E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999928E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999993E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999933E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999936E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999938E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999994E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999943E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999945E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999948E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999995E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999952E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999955E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999957E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999996E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999962E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999964E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999967E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999997E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999971E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999974E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999976E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999979E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999998E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999983E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999986E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999988E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999999E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999993E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999995E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999998E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.30000000000000284E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_ZERO] --> [~3,~3] --> OK [~0.300000000000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_ZERO] --> [~3,~3] --> OK [~0.300000000000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.3E1,TO_ZERO] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999972E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999725E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999973E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999734E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999974E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999742E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999747E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999975E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999756E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999976E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999765E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999977E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999774E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999978E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999782E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999787E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999979E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999796E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999999999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999805E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999981E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999813E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999982E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999822E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999827E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999983E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999836E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999984E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999845E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999985E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999853E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999862E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999867E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999876E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999885E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999989E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999893E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999999999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999902E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999907E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999991E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999916E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999992E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999925E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999933E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999994E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999942E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999947E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999956E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999964E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999997E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999973E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999982E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000284E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_ZERO] --> [~2,~2] --> OK [~0.200000000000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_ZERO] --> [~2,~2] --> OK [~0.200000000000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.2E1,TO_ZERO] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999986E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999862E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999865E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999867E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999871E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999873E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999876E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999878E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999988E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999882E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999885E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999887E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999989E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999891E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999893E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999896E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999898E1,TO_ZERO] --> [~1,~1] --> OK [~0.199999999999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999902E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999905E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999907E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999991E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999911E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999913E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999916E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999918E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999992E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999922E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999925E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999927E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999931E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999933E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999936E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999938E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999942E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999944E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999947E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999951E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999953E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999956E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999958E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999962E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999964E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999967E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999997E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999971E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999973E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999976E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999978E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999982E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999984E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999991E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000142E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_ZERO] --> [~1,~1] --> OK [~0.100000000000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.1E1,TO_ZERO] --> [~1,~1] --> OK [~0.9999999999999929,TO_ZERO] --> [0,0] --> OK [~0.999999999999993,TO_ZERO] --> [0,0] --> OK [~0.9999999999999931,TO_ZERO] --> [0,0] --> OK [~0.9999999999999932,TO_ZERO] --> [0,0] --> OK [~0.9999999999999933,TO_ZERO] --> [0,0] --> OK [~0.9999999999999934,TO_ZERO] --> [0,0] --> OK [~0.9999999999999936,TO_ZERO] --> [0,0] --> OK [~0.9999999999999937,TO_ZERO] --> [0,0] --> OK [~0.9999999999999938,TO_ZERO] --> [0,0] --> OK [~0.9999999999999939,TO_ZERO] --> [0,0] --> OK [~0.999999999999994,TO_ZERO] --> [0,0] --> OK [~0.9999999999999941,TO_ZERO] --> [0,0] --> OK [~0.9999999999999942,TO_ZERO] --> [0,0] --> OK [~0.9999999999999943,TO_ZERO] --> [0,0] --> OK [~0.9999999999999944,TO_ZERO] --> [0,0] --> OK [~0.9999999999999946,TO_ZERO] --> [0,0] --> OK [~0.9999999999999947,TO_ZERO] --> [0,0] --> OK [~0.9999999999999948,TO_ZERO] --> [0,0] --> OK [~0.9999999999999949,TO_ZERO] --> [0,0] --> OK [~0.999999999999995,TO_ZERO] --> [0,0] --> OK [~0.9999999999999951,TO_ZERO] --> [0,0] --> OK [~0.9999999999999952,TO_ZERO] --> [0,0] --> OK [~0.9999999999999953,TO_ZERO] --> [0,0] --> OK [~0.9999999999999954,TO_ZERO] --> [0,0] --> OK [~0.9999999999999956,TO_ZERO] --> [0,0] --> OK [~0.9999999999999957,TO_ZERO] --> [0,0] --> OK [~0.9999999999999958,TO_ZERO] --> [0,0] --> OK [~0.9999999999999959,TO_ZERO] --> [0,0] --> OK [~0.999999999999996,TO_ZERO] --> [0,0] --> OK [~0.9999999999999961,TO_ZERO] --> [0,0] --> OK [~0.9999999999999962,TO_ZERO] --> [0,0] --> OK [~0.9999999999999963,TO_ZERO] --> [0,0] --> OK [~0.9999999999999964,TO_ZERO] --> [0,0] --> OK [~0.9999999999999966,TO_ZERO] --> [0,0] --> OK [~0.9999999999999967,TO_ZERO] --> [0,0] --> OK [~0.9999999999999968,TO_ZERO] --> [0,0] --> OK [~0.9999999999999969,TO_ZERO] --> [0,0] --> OK [~0.999999999999997,TO_ZERO] --> [0,0] --> OK [~0.9999999999999971,TO_ZERO] --> [0,0] --> OK [~0.9999999999999972,TO_ZERO] --> [0,0] --> OK [~0.9999999999999973,TO_ZERO] --> [0,0] --> OK [~0.9999999999999974,TO_ZERO] --> [0,0] --> OK [~0.9999999999999976,TO_ZERO] --> [0,0] --> OK [~0.9999999999999977,TO_ZERO] --> [0,0] --> OK [~0.9999999999999978,TO_ZERO] --> [0,0] --> OK [~0.9999999999999979,TO_ZERO] --> [0,0] --> OK [~0.999999999999998,TO_ZERO] --> [0,0] --> OK [~0.9999999999999981,TO_ZERO] --> [0,0] --> OK [~0.9999999999999982,TO_ZERO] --> [0,0] --> OK [~0.9999999999999983,TO_ZERO] --> [0,0] --> OK [~0.9999999999999984,TO_ZERO] --> [0,0] --> OK [~0.9999999999999986,TO_ZERO] --> [0,0] --> OK [~0.9999999999999987,TO_ZERO] --> [0,0] --> OK [~0.9999999999999988,TO_ZERO] --> [0,0] --> OK [~0.9999999999999989,TO_ZERO] --> [0,0] --> OK [~0.999999999999999,TO_ZERO] --> [0,0] --> OK [~0.9999999999999991,TO_ZERO] --> [0,0] --> OK [~0.9999999999999992,TO_ZERO] --> [0,0] --> OK [~0.9999999999999993,TO_ZERO] --> [0,0] --> OK [~0.9999999999999994,TO_ZERO] --> [0,0] --> OK [~0.9999999999999996,TO_ZERO] --> [0,0] --> OK [~0.9999999999999997,TO_ZERO] --> [0,0] --> OK [~0.9999999999999998,TO_ZERO] --> [0,0] --> OK [~0.9999999999999999,TO_ZERO] --> [0,0] --> OK [~0.316E~321,TO_ZERO] --> [0,0] --> OK [~0.31E~321,TO_ZERO] --> [0,0] --> OK [~0.306E~321,TO_ZERO] --> [0,0] --> OK [~0.3E~321,TO_ZERO] --> [0,0] --> OK [~0.296E~321,TO_ZERO] --> [0,0] --> OK [~0.29E~321,TO_ZERO] --> [0,0] --> OK [~0.287E~321,TO_ZERO] --> [0,0] --> OK [~0.28E~321,TO_ZERO] --> [0,0] --> OK [~0.277E~321,TO_ZERO] --> [0,0] --> OK [~0.27E~321,TO_ZERO] --> [0,0] --> OK [~0.267E~321,TO_ZERO] --> [0,0] --> OK [~0.26E~321,TO_ZERO] --> [0,0] --> OK [~0.257E~321,TO_ZERO] --> [0,0] --> OK [~0.25E~321,TO_ZERO] --> [0,0] --> OK [~0.247E~321,TO_ZERO] --> [0,0] --> OK [~0.24E~321,TO_ZERO] --> [0,0] --> OK [~0.237E~321,TO_ZERO] --> [0,0] --> OK [~0.23E~321,TO_ZERO] --> [0,0] --> OK [~0.227E~321,TO_ZERO] --> [0,0] --> OK [~0.22E~321,TO_ZERO] --> [0,0] --> OK [~0.217E~321,TO_ZERO] --> [0,0] --> OK [~0.21E~321,TO_ZERO] --> [0,0] --> OK [~0.208E~321,TO_ZERO] --> [0,0] --> OK [~0.203E~321,TO_ZERO] --> [0,0] --> OK [~0.2E~321,TO_ZERO] --> [0,0] --> OK [~0.193E~321,TO_ZERO] --> [0,0] --> OK [~0.19E~321,TO_ZERO] --> [0,0] --> OK [~0.183E~321,TO_ZERO] --> [0,0] --> OK [~0.18E~321,TO_ZERO] --> [0,0] --> OK [~0.173E~321,TO_ZERO] --> [0,0] --> OK [~0.17E~321,TO_ZERO] --> [0,0] --> OK [~0.163E~321,TO_ZERO] --> [0,0] --> OK [~0.16E~321,TO_ZERO] --> [0,0] --> OK [~0.153E~321,TO_ZERO] --> [0,0] --> OK [~0.15E~321,TO_ZERO] --> [0,0] --> OK [~0.143E~321,TO_ZERO] --> [0,0] --> OK [~0.14E~321,TO_ZERO] --> [0,0] --> OK [~0.133E~321,TO_ZERO] --> [0,0] --> OK [~0.13E~321,TO_ZERO] --> [0,0] --> OK [~0.124E~321,TO_ZERO] --> [0,0] --> OK [~0.12E~321,TO_ZERO] --> [0,0] --> OK [~0.114E~321,TO_ZERO] --> [0,0] --> OK [~0.11E~321,TO_ZERO] --> [0,0] --> OK [~0.104E~321,TO_ZERO] --> [0,0] --> OK [~0.1E~321,TO_ZERO] --> [0,0] --> OK [~0.94E~322,TO_ZERO] --> [0,0] --> OK [~0.9E~322,TO_ZERO] --> [0,0] --> OK [~0.84E~322,TO_ZERO] --> [0,0] --> OK [~0.8E~322,TO_ZERO] --> [0,0] --> OK [~0.74E~322,TO_ZERO] --> [0,0] --> OK [~0.7E~322,TO_ZERO] --> [0,0] --> OK [~0.64E~322,TO_ZERO] --> [0,0] --> OK [~0.6E~322,TO_ZERO] --> [0,0] --> OK [~0.54E~322,TO_ZERO] --> [0,0] --> OK [~0.5E~322,TO_ZERO] --> [0,0] --> OK [~0.44E~322,TO_ZERO] --> [0,0] --> OK [~0.4E~322,TO_ZERO] --> [0,0] --> OK [~0.35E~322,TO_ZERO] --> [0,0] --> OK [~0.3E~322,TO_ZERO] --> [0,0] --> OK [~0.25E~322,TO_ZERO] --> [0,0] --> OK [~0.2E~322,TO_ZERO] --> [0,0] --> OK [~0.15E~322,TO_ZERO] --> [0,0] --> OK [~0.1E~322,TO_ZERO] --> [0,0] --> OK [~0.5E~323,TO_ZERO] --> [0,0] --> OK [0.0,TO_ZERO] --> [0,0] --> OK [0.316E~321,TO_ZERO] --> [0,0] --> OK [0.31E~321,TO_ZERO] --> [0,0] --> OK [0.306E~321,TO_ZERO] --> [0,0] --> OK [0.3E~321,TO_ZERO] --> [0,0] --> OK [0.296E~321,TO_ZERO] --> [0,0] --> OK [0.29E~321,TO_ZERO] --> [0,0] --> OK [0.287E~321,TO_ZERO] --> [0,0] --> OK [0.28E~321,TO_ZERO] --> [0,0] --> OK [0.277E~321,TO_ZERO] --> [0,0] --> OK [0.27E~321,TO_ZERO] --> [0,0] --> OK [0.267E~321,TO_ZERO] --> [0,0] --> OK [0.26E~321,TO_ZERO] --> [0,0] --> OK [0.257E~321,TO_ZERO] --> [0,0] --> OK [0.25E~321,TO_ZERO] --> [0,0] --> OK [0.247E~321,TO_ZERO] --> [0,0] --> OK [0.24E~321,TO_ZERO] --> [0,0] --> OK [0.237E~321,TO_ZERO] --> [0,0] --> OK [0.23E~321,TO_ZERO] --> [0,0] --> OK [0.227E~321,TO_ZERO] --> [0,0] --> OK [0.22E~321,TO_ZERO] --> [0,0] --> OK [0.217E~321,TO_ZERO] --> [0,0] --> OK [0.21E~321,TO_ZERO] --> [0,0] --> OK [0.208E~321,TO_ZERO] --> [0,0] --> OK [0.203E~321,TO_ZERO] --> [0,0] --> OK [0.2E~321,TO_ZERO] --> [0,0] --> OK [0.193E~321,TO_ZERO] --> [0,0] --> OK [0.19E~321,TO_ZERO] --> [0,0] --> OK [0.183E~321,TO_ZERO] --> [0,0] --> OK [0.18E~321,TO_ZERO] --> [0,0] --> OK [0.173E~321,TO_ZERO] --> [0,0] --> OK [0.17E~321,TO_ZERO] --> [0,0] --> OK [0.163E~321,TO_ZERO] --> [0,0] --> OK [0.16E~321,TO_ZERO] --> [0,0] --> OK [0.153E~321,TO_ZERO] --> [0,0] --> OK [0.15E~321,TO_ZERO] --> [0,0] --> OK [0.143E~321,TO_ZERO] --> [0,0] --> OK [0.14E~321,TO_ZERO] --> [0,0] --> OK [0.133E~321,TO_ZERO] --> [0,0] --> OK [0.13E~321,TO_ZERO] --> [0,0] --> OK [0.124E~321,TO_ZERO] --> [0,0] --> OK [0.12E~321,TO_ZERO] --> [0,0] --> OK [0.114E~321,TO_ZERO] --> [0,0] --> OK [0.11E~321,TO_ZERO] --> [0,0] --> OK [0.104E~321,TO_ZERO] --> [0,0] --> OK [0.1E~321,TO_ZERO] --> [0,0] --> OK [0.94E~322,TO_ZERO] --> [0,0] --> OK [0.9E~322,TO_ZERO] --> [0,0] --> OK [0.84E~322,TO_ZERO] --> [0,0] --> OK [0.8E~322,TO_ZERO] --> [0,0] --> OK [0.74E~322,TO_ZERO] --> [0,0] --> OK [0.7E~322,TO_ZERO] --> [0,0] --> OK [0.64E~322,TO_ZERO] --> [0,0] --> OK [0.6E~322,TO_ZERO] --> [0,0] --> OK [0.54E~322,TO_ZERO] --> [0,0] --> OK [0.5E~322,TO_ZERO] --> [0,0] --> OK [0.44E~322,TO_ZERO] --> [0,0] --> OK [0.4E~322,TO_ZERO] --> [0,0] --> OK [0.35E~322,TO_ZERO] --> [0,0] --> OK [0.3E~322,TO_ZERO] --> [0,0] --> OK [0.25E~322,TO_ZERO] --> [0,0] --> OK [0.2E~322,TO_ZERO] --> [0,0] --> OK [0.15E~322,TO_ZERO] --> [0,0] --> OK [0.1E~322,TO_ZERO] --> [0,0] --> OK [0.5E~323,TO_ZERO] --> [0,0] --> OK [0.9999999999999929,TO_ZERO] --> [0,0] --> OK [0.999999999999993,TO_ZERO] --> [0,0] --> OK [0.9999999999999931,TO_ZERO] --> [0,0] --> OK [0.9999999999999932,TO_ZERO] --> [0,0] --> OK [0.9999999999999933,TO_ZERO] --> [0,0] --> OK [0.9999999999999934,TO_ZERO] --> [0,0] --> OK [0.9999999999999936,TO_ZERO] --> [0,0] --> OK [0.9999999999999937,TO_ZERO] --> [0,0] --> OK [0.9999999999999938,TO_ZERO] --> [0,0] --> OK [0.9999999999999939,TO_ZERO] --> [0,0] --> OK [0.999999999999994,TO_ZERO] --> [0,0] --> OK [0.9999999999999941,TO_ZERO] --> [0,0] --> OK [0.9999999999999942,TO_ZERO] --> [0,0] --> OK [0.9999999999999943,TO_ZERO] --> [0,0] --> OK [0.9999999999999944,TO_ZERO] --> [0,0] --> OK [0.9999999999999946,TO_ZERO] --> [0,0] --> OK [0.9999999999999947,TO_ZERO] --> [0,0] --> OK [0.9999999999999948,TO_ZERO] --> [0,0] --> OK [0.9999999999999949,TO_ZERO] --> [0,0] --> OK [0.999999999999995,TO_ZERO] --> [0,0] --> OK [0.9999999999999951,TO_ZERO] --> [0,0] --> OK [0.9999999999999952,TO_ZERO] --> [0,0] --> OK [0.9999999999999953,TO_ZERO] --> [0,0] --> OK [0.9999999999999954,TO_ZERO] --> [0,0] --> OK [0.9999999999999956,TO_ZERO] --> [0,0] --> OK [0.9999999999999957,TO_ZERO] --> [0,0] --> OK [0.9999999999999958,TO_ZERO] --> [0,0] --> OK [0.9999999999999959,TO_ZERO] --> [0,0] --> OK [0.999999999999996,TO_ZERO] --> [0,0] --> OK [0.9999999999999961,TO_ZERO] --> [0,0] --> OK [0.9999999999999962,TO_ZERO] --> [0,0] --> OK [0.9999999999999963,TO_ZERO] --> [0,0] --> OK [0.9999999999999964,TO_ZERO] --> [0,0] --> OK [0.9999999999999966,TO_ZERO] --> [0,0] --> OK [0.9999999999999967,TO_ZERO] --> [0,0] --> OK [0.9999999999999968,TO_ZERO] --> [0,0] --> OK [0.9999999999999969,TO_ZERO] --> [0,0] --> OK [0.999999999999997,TO_ZERO] --> [0,0] --> OK [0.9999999999999971,TO_ZERO] --> [0,0] --> OK [0.9999999999999972,TO_ZERO] --> [0,0] --> OK [0.9999999999999973,TO_ZERO] --> [0,0] --> OK [0.9999999999999974,TO_ZERO] --> [0,0] --> OK [0.9999999999999976,TO_ZERO] --> [0,0] --> OK [0.9999999999999977,TO_ZERO] --> [0,0] --> OK [0.9999999999999978,TO_ZERO] --> [0,0] --> OK [0.9999999999999979,TO_ZERO] --> [0,0] --> OK [0.999999999999998,TO_ZERO] --> [0,0] --> OK [0.9999999999999981,TO_ZERO] --> [0,0] --> OK [0.9999999999999982,TO_ZERO] --> [0,0] --> OK [0.9999999999999983,TO_ZERO] --> [0,0] --> OK [0.9999999999999984,TO_ZERO] --> [0,0] --> OK [0.9999999999999986,TO_ZERO] --> [0,0] --> OK [0.9999999999999987,TO_ZERO] --> [0,0] --> OK [0.9999999999999988,TO_ZERO] --> [0,0] --> OK [0.9999999999999989,TO_ZERO] --> [0,0] --> OK [0.999999999999999,TO_ZERO] --> [0,0] --> OK [0.9999999999999991,TO_ZERO] --> [0,0] --> OK [0.9999999999999992,TO_ZERO] --> [0,0] --> OK [0.9999999999999993,TO_ZERO] --> [0,0] --> OK [0.9999999999999994,TO_ZERO] --> [0,0] --> OK [0.9999999999999996,TO_ZERO] --> [0,0] --> OK [0.9999999999999997,TO_ZERO] --> [0,0] --> OK [0.9999999999999998,TO_ZERO] --> [0,0] --> OK [0.9999999999999999,TO_ZERO] --> [0,0] --> OK [0.1E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000142E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000014E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000138E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000135E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000133E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000013E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000129E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000127E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000124E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000122E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000012E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000118E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000115E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000113E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000011E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000109E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000107E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000104E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000102E1,TO_ZERO] --> [1,1] --> OK [0.100000000000001E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000098E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000095E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000093E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000009E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000089E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000087E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000084E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000082E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000008E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000078E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000075E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000073E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000007E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000069E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000067E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000064E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000062E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000006E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000058E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000056E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000053E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000005E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000049E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000047E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000044E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000042E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000004E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000038E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000036E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000033E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000003E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000029E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000027E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000024E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000022E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000002E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000018E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000016E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000013E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000001E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000009E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000007E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000004E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000002E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999858E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999986E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999862E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999865E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999867E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999987E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999871E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999873E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999876E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999878E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999988E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999882E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999885E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999887E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999989E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999891E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999893E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999896E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999898E1,TO_ZERO] --> [1,1] --> OK [0.199999999999999E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999902E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999905E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999907E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999991E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999911E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999913E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999916E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999918E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999992E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999922E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999925E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999927E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999993E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999931E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999933E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999936E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999938E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999994E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999942E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999944E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999947E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999995E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999951E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999953E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999956E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999958E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999996E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999962E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999964E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999967E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999997E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999971E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999973E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999976E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999978E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999998E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999982E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999984E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999987E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999999E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999991E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999993E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999996E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999998E1,TO_ZERO] --> [1,1] --> OK [0.2E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000284E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000028E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000275E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000027E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000266E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000026E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000258E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000253E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000025E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000244E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000024E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000235E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000023E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000226E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000022E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000218E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000213E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000021E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000204E1,TO_ZERO] --> [2,2] --> OK [0.200000000000002E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000195E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000019E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000187E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000018E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000178E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000173E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000017E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000164E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000016E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000155E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000015E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000147E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000014E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000138E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000133E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000013E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000124E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000012E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000115E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000011E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000107E1,TO_ZERO] --> [2,2] --> OK [0.200000000000001E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000098E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000093E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000009E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000084E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000008E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000075E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000007E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000067E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000006E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000058E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000053E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000005E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000044E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000004E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000036E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000003E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000027E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000002E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000018E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000013E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000001E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000004E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999716E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999972E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999725E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999973E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999734E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999974E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999742E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999747E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999975E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999756E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999976E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999765E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999977E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999774E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999978E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999782E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999787E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999979E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999796E1,TO_ZERO] --> [2,2] --> OK [0.299999999999998E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999805E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999981E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999813E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999982E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999822E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999827E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999983E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999836E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999984E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999845E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999985E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999853E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999986E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999862E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999867E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999987E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999876E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999988E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999885E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999989E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999893E1,TO_ZERO] --> [2,2] --> OK [0.299999999999999E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999902E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999907E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999991E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999916E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999992E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999925E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999993E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999933E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999994E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999942E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999947E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999995E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999956E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999996E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999964E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999997E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999973E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999998E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999982E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999987E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999999E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999996E1,TO_ZERO] --> [2,2] --> OK [0.3E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000284E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000028E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000275E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000027E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000266E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000026E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000258E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000253E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000025E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000244E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000024E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000235E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000023E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000226E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000022E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000218E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000213E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000021E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000204E1,TO_ZERO] --> [3,3] --> OK [0.300000000000002E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000195E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000019E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000187E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000018E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000178E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000173E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000017E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000164E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000016E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000155E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000015E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000147E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000014E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000138E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000133E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000013E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000124E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000012E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000115E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000011E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000107E1,TO_ZERO] --> [3,3] --> OK [0.300000000000001E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000098E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000093E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000009E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000084E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000008E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000075E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000007E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000067E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000006E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000058E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000053E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000005E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000044E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000004E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000036E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000003E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000027E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000002E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000018E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000013E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000001E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000004E1,TO_ZERO] --> [3,3] --> OK [0.10737418239999924E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999925E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999926E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999927E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999928E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999993E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999931E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999932E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999933E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999934E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999936E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999937E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999938E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999939E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999994E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999942E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999943E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999944E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999945E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999946E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999948E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999949E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999995E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999951E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999952E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999954E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999955E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999956E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999957E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999958E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999996E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999961E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999962E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999963E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999964E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999965E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999967E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999968E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999969E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999997E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999971E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999973E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999974E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999975E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999976E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999977E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999979E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999998E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999981E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999982E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999983E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999985E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999986E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999987E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999988E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999989E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999999E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999992E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999993E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999994E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999995E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999996E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999998E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999999E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741824E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999985E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999852E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999855E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999857E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999986E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999862E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999864E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999866E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999987E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999871E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999874E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999876E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999878E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999988E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999883E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999886E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999888E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999989E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999893E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999895E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999897E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.161061273599999E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999902E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999905E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999907E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999991E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999912E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999914E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999917E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999992E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999921E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999924E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999926E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999928E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999993E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999933E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999936E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999938E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999994E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999943E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999945E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999948E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999995E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999952E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999955E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999957E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999996E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999962E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999964E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999967E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999997E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999971E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999974E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999976E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999979E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999998E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999983E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999986E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999988E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999999E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999993E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999995E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999998E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612736E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999985E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999852E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999855E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999857E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999986E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999862E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999864E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999866E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999987E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999871E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999874E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999876E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999878E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999988E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999883E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999886E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999888E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999989E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999893E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999895E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999897E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.187904819199999E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999902E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999905E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999907E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999991E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999912E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999914E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999917E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999992E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999921E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999924E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999926E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999928E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999993E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999933E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999936E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999938E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999994E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999943E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999945E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999948E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999995E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999952E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999955E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999957E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999996E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999962E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999964E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999967E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999997E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999971E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999974E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999976E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999979E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999998E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999983E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999986E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999988E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999999E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999993E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999995E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999998E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048192E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999985E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999852E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999855E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999857E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999986E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999862E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999864E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999866E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999987E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999871E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999874E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999876E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999878E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999988E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999883E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999886E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999888E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999989E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999893E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999895E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999897E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.201326591999999E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999902E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999905E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999907E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999991E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999912E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999914E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999917E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999992E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999921E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999924E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999926E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999928E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999993E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999933E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999936E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999938E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999994E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999943E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999945E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999948E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999995E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999952E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999955E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999957E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999996E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999962E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999964E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999967E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999997E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999971E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999974E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999976E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999979E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999998E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999983E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999986E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999988E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999999E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999993E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999995E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999998E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.201326592E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999985E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999852E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999855E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999857E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999986E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999862E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999864E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999866E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999987E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999871E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999874E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999876E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999878E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999988E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999883E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999886E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999888E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999989E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999893E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999895E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999897E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.208037478399999E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999902E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999905E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999907E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999991E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999912E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999914E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999917E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999992E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999921E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999924E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999926E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999928E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999993E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999933E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999936E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999938E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999994E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999943E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999945E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999948E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999995E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999952E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999955E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999957E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999996E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999962E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999964E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999967E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999997E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999971E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999974E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999976E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999979E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999998E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999983E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999986E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999988E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999999E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999993E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999995E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999998E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374784E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999985E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999852E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999855E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999857E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999986E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999862E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999864E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999866E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999987E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999871E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999874E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999876E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999878E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999988E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999883E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999886E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999888E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999989E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999893E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999895E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999897E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.211392921599999E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999902E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999905E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999907E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999991E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999912E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999914E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999917E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999992E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999921E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999924E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999926E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999928E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999993E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999933E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999936E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999938E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999994E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999943E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999945E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999948E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999995E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999952E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999955E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999957E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999996E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999962E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999964E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999967E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999997E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999971E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999974E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999976E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999979E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999998E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999983E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999986E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999988E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999999E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999993E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999995E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999998E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929216E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999985E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999852E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999855E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999857E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999986E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999862E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999864E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999866E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999987E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999871E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999874E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999876E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999878E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999988E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999883E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999886E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999888E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999989E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999893E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999895E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999897E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.214748364399999E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999902E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999905E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999907E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999991E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999912E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999914E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999917E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999992E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999921E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999924E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999926E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999928E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999993E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999933E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999936E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999938E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999994E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999943E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999945E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999948E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999995E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999952E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999955E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999957E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999996E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999962E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999964E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999967E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999997E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999971E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999974E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999976E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999979E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999998E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999983E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999986E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999988E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999999E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999993E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999995E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999998E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483644E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999985E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999852E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999855E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999857E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999986E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999862E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999864E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999866E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999987E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999871E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999874E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999876E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999878E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999988E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999883E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999886E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999888E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999989E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999893E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999895E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999897E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.214748364499999E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999902E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999905E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999907E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999991E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999912E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999914E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999917E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999992E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999921E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999924E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999926E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999928E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999993E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999933E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999936E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999938E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999994E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999943E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999945E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999948E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999995E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999952E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999955E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999957E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999996E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999962E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999964E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999967E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999997E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999971E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999974E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999976E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999979E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999998E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999983E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999986E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999988E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999999E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999993E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999995E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999998E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483645E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999985E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999852E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999855E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999857E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999986E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999862E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999864E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999866E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999987E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999871E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999874E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999876E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999878E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999988E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999883E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999886E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999888E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999989E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999893E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999895E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999897E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.214748364599999E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999902E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999905E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999907E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999991E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999912E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999914E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999917E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999992E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999921E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999924E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999926E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999928E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999993E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999933E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999936E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999938E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999994E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999943E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999945E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999948E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999995E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999952E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999955E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999957E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999996E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999962E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999964E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999967E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999997E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999971E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999974E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999976E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999979E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999998E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999983E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999986E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999988E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999999E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999993E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999995E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999998E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483646E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999985E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999852E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999855E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999857E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999986E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999862E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999864E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999866E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999987E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999871E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999874E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999876E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999878E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999988E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999883E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999886E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999888E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999989E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999893E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999895E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999897E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.214748364699999E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999902E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999905E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999907E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999991E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999912E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999914E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999917E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999992E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999921E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999924E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999926E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999928E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999993E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999933E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999936E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999938E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999994E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999943E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999945E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999948E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999995E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999952E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999955E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999957E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999996E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999962E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999964E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999967E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999997E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999971E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999974E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999976E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999979E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999998E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999983E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999986E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999988E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999999E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999993E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999995E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999998E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483647E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_ZERO] --> [2147483647,2147483647] --> OK mlton-20210117+dfsg/regression/real-int.sml000066400000000000000000000072401416264345000204410ustar00rootroot00000000000000functor Test (structure Real : REAL) = struct datatype z = datatype IEEEReal.float_class datatype z = datatype IEEEReal.rounding_mode fun showReal r = print (Real.fmt StringCvt.EXACT r) fun showInt i = print (Int.fmt StringCvt.DEC i) fun showLargeInt li = print (LargeInt.fmt StringCvt.DEC li) fun showMode mode = case mode of TO_NEAREST => print "TO_NEAREST" | TO_NEGINF => print "TO_NEGINF" | TO_POSINF => print "TO_POSINF" | TO_ZERO => print "TO_ZERO" datatype 'a res = OK of 'a | OVERFLOW fun showRes showOk r = case r of OK x => showOk x | OVERFLOW => print "Overflow" fun wrap th = (OK (th ())) handle Overflow => OVERFLOW fun checkIntToReal i = let val li = Int.toLarge i val ri = Real.fromInt i val rli = Real.fromLargeInt li in () ; print "[" ; showInt i ; print "," ; showLargeInt li ; print "] --> [" ; showReal ri ; print "," ; showReal rli ; print "] --> " ; print (if Real.== (ri, rli) then "OK\n" else "BAD\n") ; () end fun checkRealToInt mode r = let val i = wrap (fn () => Real.toInt mode r) val li = Real.toLargeInt mode r in () ; print "[" ; showReal r ; print "," ; showMode mode ; print "] --> [" ; showRes showInt i ; print "," ; showLargeInt li ; print "] --> " ; print (if wrap (fn () => Int.fromLarge li) = i then "OK\n" else "BAD\n") ; () end val is : Int.int list = let val op + = Int.+ val op div = Int.div val op * = Int.* val ~ = Int.~ val op - = Int.- val minInt = valOf Int.minInt val maxInt = valOf Int.maxInt val (zero,one,two,three) = (Int.fromInt 0, Int.fromInt 1, Int.fromInt 2, Int.fromInt 3) val one_half = maxInt div two val four = two * two val one_fourth = maxInt div four val eight = four * two val one_eighth = maxInt div eight val sixteen = eight * two val one_sixteenth = maxInt div sixteen val thirtytwo = sixteen * two val one_thirtysecond = maxInt div thirtytwo val sixtyfour = thirtytwo * two val one_sixtyfourth = maxInt div sixtyfour in [minInt, minInt + one, minInt + two, minInt + three, minInt + one_sixtyfourth, minInt + one_thirtysecond, minInt + one_sixteenth, minInt + one_eighth, minInt + one_fourth, minInt + one_half, ~three,~two,~one,zero,one,two,three, maxInt - one_half, maxInt - one_fourth, maxInt - one_eighth, maxInt - one_sixteenth, maxInt - one_thirtysecond, maxInt - one_sixtyfourth, maxInt - three, maxInt - two, maxInt - one, maxInt] end val () = List.app checkIntToReal is val rs = List.map (fn i => let val r = Real.fromInt i fun make (fold,inf) = fold (fn (_,(r,l)) => let val r' = Real.nextAfter (r, inf) in (r',r'::l) end) (r,[]) (List.tabulate (64,fn _ => ())) val make = fn (fold,inf) => #2 (make (fold,inf)) in (make (foldl,Real.negInf)) @ [r] @ (make (foldr,Real.posInf)) end) is val rs = List.concat rs val () = List.app (checkRealToInt TO_NEAREST) rs val () = List.app (checkRealToInt TO_NEGINF) rs val () = List.app (checkRealToInt TO_POSINF) rs val () = List.app (checkRealToInt TO_ZERO) rs end structure Z = Test (structure Real = Real32) structure Z = Test (structure Real = Real64) mlton-20210117+dfsg/regression/real-sign.ok000066400000000000000000000031031416264345000204170ustar00rootroot00000000000000Testing Real32 sign(negNan) = raise Domain signBit(negNan) = true sign(abs(negNan)) = raise Domain signBit(abs(negNan)) = false sign(negInf) = ~1 signBit(negInf) = true sign(abs(negInf)) = 1 signBit(abs(negInf)) = false sign(negOne) = ~1 signBit(negOne) = true sign(abs(negOne)) = 1 signBit(abs(negOne)) = false sign(negZero) = 0 signBit(negZero) = true sign(abs(negZero)) = 0 signBit(abs(negZero)) = false sign(posZero) = 0 signBit(posZero) = false sign(abs(posZero)) = 0 signBit(abs(posZero)) = false sign(posOne) = 1 signBit(posOne) = false sign(abs(posOne)) = 1 signBit(abs(posOne)) = false sign(posInf) = 1 signBit(posInf) = false sign(abs(posInf)) = 1 signBit(abs(posInf)) = false sign(posNan) = raise Domain signBit(posNan) = false sign(abs(posNan)) = raise Domain signBit(abs(posNan)) = false Testing Real64 sign(negNan) = raise Domain signBit(negNan) = true sign(abs(negNan)) = raise Domain signBit(abs(negNan)) = false sign(negInf) = ~1 signBit(negInf) = true sign(abs(negInf)) = 1 signBit(abs(negInf)) = false sign(negOne) = ~1 signBit(negOne) = true sign(abs(negOne)) = 1 signBit(abs(negOne)) = false sign(negZero) = 0 signBit(negZero) = true sign(abs(negZero)) = 0 signBit(abs(negZero)) = false sign(posZero) = 0 signBit(posZero) = false sign(abs(posZero)) = 0 signBit(abs(posZero)) = false sign(posOne) = 1 signBit(posOne) = false sign(abs(posOne)) = 1 signBit(abs(posOne)) = false sign(posInf) = 1 signBit(posInf) = false sign(abs(posInf)) = 1 signBit(abs(posInf)) = false sign(posNan) = raise Domain signBit(posNan) = false sign(abs(posNan)) = raise Domain signBit(abs(posNan)) = false mlton-20210117+dfsg/regression/real-sign.sml000066400000000000000000000033111416264345000206020ustar00rootroot00000000000000 functor Test(structure Real: REAL val posZero: Real.real val posOne: Real.real val size: Int.int) = struct open Real val negZero = ~ posZero val negOne = ~ posOne val nan = posInf + negInf val posNan = copySign (nan, posOne) val negNan = copySign (nan, negOne) val _ = print (concat ["Testing Real", Int.toString size, "\n"]) fun test (name, r) = let val () = print (concat ["sign(", name, ") = ", (Int.toString (sign r)) handle Domain => "raise Domain", "\n"]) val () = print (concat ["signBit(", name, ") = ", Bool.toString (signBit r), "\n"]) val () = print (concat ["sign(abs(", name, ")) = ", (Int.toString (sign (abs r))) handle Domain => "raise Domain", "\n"]) val () = print (concat ["signBit(abs(", name, ")) = ", Bool.toString (signBit (abs r)), "\n"]) in () end val () = List.app test [("negNan", negNan), ("negInf", negInf), ("negOne", negOne), ("negZero", negZero), ("posZero", posZero), ("posOne", posOne), ("posInf", posInf), ("posNan", posNan)] end structure Z = Test(structure Real = Real32 val posZero : Real32.real = 0.0 val posOne : Real32.real = 1.0 val size = 32) val () = print "\n" structure Z = Test(structure Real = Real64 val posZero : Real64.real = 0.0 val posOne : Real64.real = 1.0 val size = 64) mlton-20210117+dfsg/regression/real-str.arm-linux.ok000066400000000000000000000001131416264345000222000ustar00rootroot00000000000000unhandled exception: SysErr: Invalid argument [inval] Nonzero exit status. mlton-20210117+dfsg/regression/real-str.ok000066400000000000000000000001621416264345000202710ustar00rootroot00000000000000YES BFB999999999999A BFB9999999999999 YES BFB999999999999A BFB9999999999999 YES 3FB999999999999A 3FB999999999999A mlton-20210117+dfsg/regression/real-str.sml000066400000000000000000000023271416264345000204600ustar00rootroot00000000000000 structure I = IEEEReal structure R = Real structure V = Word8Vector structure P = PackRealBig fun down() = I.setRoundingMode I.TO_NEGINF fun up() = I.setRoundingMode I.TO_POSINF fun word8vectorToString v = V.foldr (fn(w,s) => Word8.toString w ^ s) "" v val _ = down() val x = ~1.0/10.0 val _ = up() val y = ~1.0/10.0 val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") val s = "~0.1" val _ = down() val x = Option.valOf (Real.fromString s) val _ = up() val y = Option.valOf (Real.fromString s) val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") val da = {class = IEEEReal.NORMAL, sign = false, digits = [1], exp = 0} val _ = down() val x = Option.valOf (Real.fromDecimal da) val _ = up() val y = Option.valOf (Real.fromDecimal da) val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") mlton-20210117+dfsg/regression/real.amd64-darwin.ok000066400000000000000000041401551416264345000216720ustar00rootroot00000000000000 Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.34028235E39) = ~0.34028235E39 ~ (0.17014117E39) = ~0.17014117E39 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.31415927E1) = ~0.31415927E1 ~ (0.27182817E1) = ~0.27182817E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.11754944E~37) = ~0.11754944E~37 ~ (0.5877472E~38) = ~0.5877472E~38 ~ (0.1E~44) = ~0.1E~44 ~ (0.0) = ~0.0 ~ (~0.34028235E39) = 0.34028235E39 ~ (~0.17014117E39) = 0.17014117E39 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.31415927E1) = 0.31415927E1 ~ (~0.27182817E1) = 0.27182817E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.11754944E~37) = 0.11754944E~37 ~ (~0.5877472E~38) = 0.5877472E~38 ~ (~0.1E~44) = 0.1E~44 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.34028235E39, 0.34028235E39) = inf + (0.34028235E39, 0.34028235E39) = inf - (0.34028235E39, 0.34028235E39) = 0.0 / (0.34028235E39, 0.34028235E39) = 0.1E1 nextAfter (0.34028235E39, 0.34028235E39) = 0.34028235E39 rem (0.34028235E39, 0.34028235E39) = 0.0 * (0.34028235E39, 0.17014117E39) = inf + (0.34028235E39, 0.17014117E39) = inf - (0.34028235E39, 0.17014117E39) = 0.17014117E39 / (0.34028235E39, 0.17014117E39) = 0.2E1 nextAfter (0.34028235E39, 0.17014117E39) = 0.34028233E39 rem (0.34028235E39, 0.17014117E39) = 0.0 * (0.34028235E39, 0.123E4) = inf + (0.34028235E39, 0.123E4) = 0.34028235E39 - (0.34028235E39, 0.123E4) = 0.34028235E39 / (0.34028235E39, 0.123E4) = 0.2766523E36 nextAfter (0.34028235E39, 0.123E4) = 0.34028233E39 rem (0.34028235E39, 0.123E4) = 0.2028241E32 * (0.34028235E39, 0.123E2) = inf + (0.34028235E39, 0.123E2) = 0.34028235E39 - (0.34028235E39, 0.123E2) = 0.34028235E39 / (0.34028235E39, 0.123E2) = 0.27665232E38 nextAfter (0.34028235E39, 0.123E2) = 0.34028233E39 rem (0.34028235E39, 0.123E2) = ~inf * (0.34028235E39, 0.31415927E1) = inf + (0.34028235E39, 0.31415927E1) = 0.34028235E39 - (0.34028235E39, 0.31415927E1) = 0.34028235E39 / (0.34028235E39, 0.31415927E1) = 0.10831523E39 nextAfter (0.34028235E39, 0.31415927E1) = 0.34028233E39 rem (0.34028235E39, 0.31415927E1) = 0.2028241E32 * (0.34028235E39, 0.27182817E1) = inf + (0.34028235E39, 0.27182817E1) = 0.34028235E39 - (0.34028235E39, 0.27182817E1) = 0.34028235E39 / (0.34028235E39, 0.27182817E1) = 0.12518288E39 nextAfter (0.34028235E39, 0.27182817E1) = 0.34028233E39 rem (0.34028235E39, 0.27182817E1) = 0.0 * (0.34028235E39, 0.123E1) = inf + (0.34028235E39, 0.123E1) = 0.34028235E39 - (0.34028235E39, 0.123E1) = 0.34028235E39 / (0.34028235E39, 0.123E1) = 0.27665231E39 nextAfter (0.34028235E39, 0.123E1) = 0.34028233E39 rem (0.34028235E39, 0.123E1) = 0.0 * (0.34028235E39, 0.123) = 0.4185473E38 + (0.34028235E39, 0.123) = 0.34028235E39 - (0.34028235E39, 0.123) = 0.34028235E39 / (0.34028235E39, 0.123) = inf nextAfter (0.34028235E39, 0.123) = 0.34028233E39 rem (0.34028235E39, 0.123) = ~inf * (0.34028235E39, 0.123E~2) = 0.4185473E36 + (0.34028235E39, 0.123E~2) = 0.34028235E39 - (0.34028235E39, 0.123E~2) = 0.34028235E39 / (0.34028235E39, 0.123E~2) = inf nextAfter (0.34028235E39, 0.123E~2) = 0.34028233E39 rem (0.34028235E39, 0.123E~2) = ~inf * (0.34028235E39, 0.11754944E~37) = 0.39999998E1 + (0.34028235E39, 0.11754944E~37) = 0.34028235E39 - (0.34028235E39, 0.11754944E~37) = 0.34028235E39 / (0.34028235E39, 0.11754944E~37) = inf nextAfter (0.34028235E39, 0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, 0.11754944E~37) = ~inf * (0.34028235E39, 0.5877472E~38) = 0.19999999E1 + (0.34028235E39, 0.5877472E~38) = 0.34028235E39 - (0.34028235E39, 0.5877472E~38) = 0.34028235E39 / (0.34028235E39, 0.5877472E~38) = inf nextAfter (0.34028235E39, 0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, 0.5877472E~38) = ~inf * (0.34028235E39, 0.1E~44) = 0.47683713E~6 + (0.34028235E39, 0.1E~44) = 0.34028235E39 - (0.34028235E39, 0.1E~44) = 0.34028235E39 / (0.34028235E39, 0.1E~44) = inf nextAfter (0.34028235E39, 0.1E~44) = 0.34028233E39 rem (0.34028235E39, 0.1E~44) = ~inf * (0.34028235E39, 0.0) = 0.0 + (0.34028235E39, 0.0) = 0.34028235E39 - (0.34028235E39, 0.0) = 0.34028235E39 / (0.34028235E39, 0.0) = inf nextAfter (0.34028235E39, 0.0) = 0.34028233E39 rem (0.34028235E39, 0.0) = nan * (0.34028235E39, ~0.34028235E39) = ~inf + (0.34028235E39, ~0.34028235E39) = 0.0 - (0.34028235E39, ~0.34028235E39) = inf / (0.34028235E39, ~0.34028235E39) = ~0.1E1 nextAfter (0.34028235E39, ~0.34028235E39) = 0.34028233E39 rem (0.34028235E39, ~0.34028235E39) = 0.0 * (0.34028235E39, ~0.17014117E39) = ~inf + (0.34028235E39, ~0.17014117E39) = 0.17014117E39 - (0.34028235E39, ~0.17014117E39) = inf / (0.34028235E39, ~0.17014117E39) = ~0.2E1 nextAfter (0.34028235E39, ~0.17014117E39) = 0.34028233E39 rem (0.34028235E39, ~0.17014117E39) = 0.0 * (0.34028235E39, ~0.123E4) = ~inf + (0.34028235E39, ~0.123E4) = 0.34028235E39 - (0.34028235E39, ~0.123E4) = 0.34028235E39 / (0.34028235E39, ~0.123E4) = ~0.2766523E36 nextAfter (0.34028235E39, ~0.123E4) = 0.34028233E39 rem (0.34028235E39, ~0.123E4) = 0.2028241E32 * (0.34028235E39, ~0.123E2) = ~inf + (0.34028235E39, ~0.123E2) = 0.34028235E39 - (0.34028235E39, ~0.123E2) = 0.34028235E39 / (0.34028235E39, ~0.123E2) = ~0.27665232E38 nextAfter (0.34028235E39, ~0.123E2) = 0.34028233E39 rem (0.34028235E39, ~0.123E2) = ~inf * (0.34028235E39, ~0.31415927E1) = ~inf + (0.34028235E39, ~0.31415927E1) = 0.34028235E39 - (0.34028235E39, ~0.31415927E1) = 0.34028235E39 / (0.34028235E39, ~0.31415927E1) = ~0.10831523E39 nextAfter (0.34028235E39, ~0.31415927E1) = 0.34028233E39 rem (0.34028235E39, ~0.31415927E1) = 0.2028241E32 * (0.34028235E39, ~0.27182817E1) = ~inf + (0.34028235E39, ~0.27182817E1) = 0.34028235E39 - (0.34028235E39, ~0.27182817E1) = 0.34028235E39 / (0.34028235E39, ~0.27182817E1) = ~0.12518288E39 nextAfter (0.34028235E39, ~0.27182817E1) = 0.34028233E39 rem (0.34028235E39, ~0.27182817E1) = 0.0 * (0.34028235E39, ~0.123E1) = ~inf + (0.34028235E39, ~0.123E1) = 0.34028235E39 - (0.34028235E39, ~0.123E1) = 0.34028235E39 / (0.34028235E39, ~0.123E1) = ~0.27665231E39 nextAfter (0.34028235E39, ~0.123E1) = 0.34028233E39 rem (0.34028235E39, ~0.123E1) = 0.0 * (0.34028235E39, ~0.123) = ~0.4185473E38 + (0.34028235E39, ~0.123) = 0.34028235E39 - (0.34028235E39, ~0.123) = 0.34028235E39 / (0.34028235E39, ~0.123) = ~inf nextAfter (0.34028235E39, ~0.123) = 0.34028233E39 rem (0.34028235E39, ~0.123) = ~inf * (0.34028235E39, ~0.123E~2) = ~0.4185473E36 + (0.34028235E39, ~0.123E~2) = 0.34028235E39 - (0.34028235E39, ~0.123E~2) = 0.34028235E39 / (0.34028235E39, ~0.123E~2) = ~inf nextAfter (0.34028235E39, ~0.123E~2) = 0.34028233E39 rem (0.34028235E39, ~0.123E~2) = ~inf * (0.34028235E39, ~0.11754944E~37) = ~0.39999998E1 + (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 - (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 / (0.34028235E39, ~0.11754944E~37) = ~inf nextAfter (0.34028235E39, ~0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, ~0.11754944E~37) = ~inf * (0.34028235E39, ~0.5877472E~38) = ~0.19999999E1 + (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 - (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 / (0.34028235E39, ~0.5877472E~38) = ~inf nextAfter (0.34028235E39, ~0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, ~0.5877472E~38) = ~inf * (0.34028235E39, ~0.1E~44) = ~0.47683713E~6 + (0.34028235E39, ~0.1E~44) = 0.34028235E39 - (0.34028235E39, ~0.1E~44) = 0.34028235E39 / (0.34028235E39, ~0.1E~44) = ~inf nextAfter (0.34028235E39, ~0.1E~44) = 0.34028233E39 rem (0.34028235E39, ~0.1E~44) = ~inf * (0.34028235E39, ~0.0) = ~0.0 + (0.34028235E39, ~0.0) = 0.34028235E39 - (0.34028235E39, ~0.0) = 0.34028235E39 / (0.34028235E39, ~0.0) = ~inf nextAfter (0.34028235E39, ~0.0) = 0.34028233E39 rem (0.34028235E39, ~0.0) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.34028235E39, ~inf) = ~inf + (0.34028235E39, ~inf) = ~inf - (0.34028235E39, ~inf) = inf / (0.34028235E39, ~inf) = ~0.0 nextAfter (0.34028235E39, ~inf) = 0.34028233E39 rem (0.34028235E39, ~inf) = 0.34028235E39 * (0.34028235E39, nan) = nan + (0.34028235E39, nan) = nan - (0.34028235E39, nan) = nan / (0.34028235E39, nan) = nan nextAfter (0.34028235E39, nan) = nan rem (0.34028235E39, nan) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.17014117E39, 0.34028235E39) = inf + (0.17014117E39, 0.34028235E39) = inf - (0.17014117E39, 0.34028235E39) = ~0.17014117E39 / (0.17014117E39, 0.34028235E39) = 0.5 nextAfter (0.17014117E39, 0.34028235E39) = 0.17014118E39 rem (0.17014117E39, 0.34028235E39) = 0.17014117E39 * (0.17014117E39, 0.17014117E39) = inf + (0.17014117E39, 0.17014117E39) = 0.34028235E39 - (0.17014117E39, 0.17014117E39) = 0.0 / (0.17014117E39, 0.17014117E39) = 0.1E1 nextAfter (0.17014117E39, 0.17014117E39) = 0.17014117E39 rem (0.17014117E39, 0.17014117E39) = 0.0 * (0.17014117E39, 0.123E4) = inf + (0.17014117E39, 0.123E4) = 0.17014117E39 - (0.17014117E39, 0.123E4) = 0.17014117E39 / (0.17014117E39, 0.123E4) = 0.13832615E36 nextAfter (0.17014117E39, 0.123E4) = 0.17014116E39 rem (0.17014117E39, 0.123E4) = 0.10141205E32 * (0.17014117E39, 0.123E2) = inf + (0.17014117E39, 0.123E2) = 0.17014117E39 - (0.17014117E39, 0.123E2) = 0.17014117E39 / (0.17014117E39, 0.123E2) = 0.13832616E38 nextAfter (0.17014117E39, 0.123E2) = 0.17014116E39 rem (0.17014117E39, 0.123E2) = ~0.10141205E32 * (0.17014117E39, 0.31415927E1) = inf + (0.17014117E39, 0.31415927E1) = 0.17014117E39 - (0.17014117E39, 0.31415927E1) = 0.17014117E39 / (0.17014117E39, 0.31415927E1) = 0.54157613E38 nextAfter (0.17014117E39, 0.31415927E1) = 0.17014116E39 rem (0.17014117E39, 0.31415927E1) = 0.10141205E32 * (0.17014117E39, 0.27182817E1) = inf + (0.17014117E39, 0.27182817E1) = 0.17014117E39 - (0.17014117E39, 0.27182817E1) = 0.17014117E39 / (0.17014117E39, 0.27182817E1) = 0.6259144E38 nextAfter (0.17014117E39, 0.27182817E1) = 0.17014116E39 rem (0.17014117E39, 0.27182817E1) = 0.0 * (0.17014117E39, 0.123E1) = 0.20927364E39 + (0.17014117E39, 0.123E1) = 0.17014117E39 - (0.17014117E39, 0.123E1) = 0.17014117E39 / (0.17014117E39, 0.123E1) = 0.13832616E39 nextAfter (0.17014117E39, 0.123E1) = 0.17014116E39 rem (0.17014117E39, 0.123E1) = 0.0 * (0.17014117E39, 0.123) = 0.20927365E38 + (0.17014117E39, 0.123) = 0.17014117E39 - (0.17014117E39, 0.123) = 0.17014117E39 / (0.17014117E39, 0.123) = inf nextAfter (0.17014117E39, 0.123) = 0.17014116E39 rem (0.17014117E39, 0.123) = ~inf * (0.17014117E39, 0.123E~2) = 0.20927364E36 + (0.17014117E39, 0.123E~2) = 0.17014117E39 - (0.17014117E39, 0.123E~2) = 0.17014117E39 / (0.17014117E39, 0.123E~2) = inf nextAfter (0.17014117E39, 0.123E~2) = 0.17014116E39 rem (0.17014117E39, 0.123E~2) = ~inf * (0.17014117E39, 0.11754944E~37) = 0.19999999E1 + (0.17014117E39, 0.11754944E~37) = 0.17014117E39 - (0.17014117E39, 0.11754944E~37) = 0.17014117E39 / (0.17014117E39, 0.11754944E~37) = inf nextAfter (0.17014117E39, 0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, 0.11754944E~37) = ~inf * (0.17014117E39, 0.5877472E~38) = 0.99999994 + (0.17014117E39, 0.5877472E~38) = 0.17014117E39 - (0.17014117E39, 0.5877472E~38) = 0.17014117E39 / (0.17014117E39, 0.5877472E~38) = inf nextAfter (0.17014117E39, 0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, 0.5877472E~38) = ~inf * (0.17014117E39, 0.1E~44) = 0.23841856E~6 + (0.17014117E39, 0.1E~44) = 0.17014117E39 - (0.17014117E39, 0.1E~44) = 0.17014117E39 / (0.17014117E39, 0.1E~44) = inf nextAfter (0.17014117E39, 0.1E~44) = 0.17014116E39 rem (0.17014117E39, 0.1E~44) = ~inf * (0.17014117E39, 0.0) = 0.0 + (0.17014117E39, 0.0) = 0.17014117E39 - (0.17014117E39, 0.0) = 0.17014117E39 / (0.17014117E39, 0.0) = inf nextAfter (0.17014117E39, 0.0) = 0.17014116E39 rem (0.17014117E39, 0.0) = nan * (0.17014117E39, ~0.34028235E39) = ~inf + (0.17014117E39, ~0.34028235E39) = ~0.17014117E39 - (0.17014117E39, ~0.34028235E39) = inf / (0.17014117E39, ~0.34028235E39) = ~0.5 nextAfter (0.17014117E39, ~0.34028235E39) = 0.17014116E39 rem (0.17014117E39, ~0.34028235E39) = 0.17014117E39 * (0.17014117E39, ~0.17014117E39) = ~inf + (0.17014117E39, ~0.17014117E39) = 0.0 - (0.17014117E39, ~0.17014117E39) = 0.34028235E39 / (0.17014117E39, ~0.17014117E39) = ~0.1E1 nextAfter (0.17014117E39, ~0.17014117E39) = 0.17014116E39 rem (0.17014117E39, ~0.17014117E39) = 0.0 * (0.17014117E39, ~0.123E4) = ~inf + (0.17014117E39, ~0.123E4) = 0.17014117E39 - (0.17014117E39, ~0.123E4) = 0.17014117E39 / (0.17014117E39, ~0.123E4) = ~0.13832615E36 nextAfter (0.17014117E39, ~0.123E4) = 0.17014116E39 rem (0.17014117E39, ~0.123E4) = 0.10141205E32 * (0.17014117E39, ~0.123E2) = ~inf + (0.17014117E39, ~0.123E2) = 0.17014117E39 - (0.17014117E39, ~0.123E2) = 0.17014117E39 / (0.17014117E39, ~0.123E2) = ~0.13832616E38 nextAfter (0.17014117E39, ~0.123E2) = 0.17014116E39 rem (0.17014117E39, ~0.123E2) = ~0.10141205E32 * (0.17014117E39, ~0.31415927E1) = ~inf + (0.17014117E39, ~0.31415927E1) = 0.17014117E39 - (0.17014117E39, ~0.31415927E1) = 0.17014117E39 / (0.17014117E39, ~0.31415927E1) = ~0.54157613E38 nextAfter (0.17014117E39, ~0.31415927E1) = 0.17014116E39 rem (0.17014117E39, ~0.31415927E1) = 0.10141205E32 * (0.17014117E39, ~0.27182817E1) = ~inf + (0.17014117E39, ~0.27182817E1) = 0.17014117E39 - (0.17014117E39, ~0.27182817E1) = 0.17014117E39 / (0.17014117E39, ~0.27182817E1) = ~0.6259144E38 nextAfter (0.17014117E39, ~0.27182817E1) = 0.17014116E39 rem (0.17014117E39, ~0.27182817E1) = 0.0 * (0.17014117E39, ~0.123E1) = ~0.20927364E39 + (0.17014117E39, ~0.123E1) = 0.17014117E39 - (0.17014117E39, ~0.123E1) = 0.17014117E39 / (0.17014117E39, ~0.123E1) = ~0.13832616E39 nextAfter (0.17014117E39, ~0.123E1) = 0.17014116E39 rem (0.17014117E39, ~0.123E1) = 0.0 * (0.17014117E39, ~0.123) = ~0.20927365E38 + (0.17014117E39, ~0.123) = 0.17014117E39 - (0.17014117E39, ~0.123) = 0.17014117E39 / (0.17014117E39, ~0.123) = ~inf nextAfter (0.17014117E39, ~0.123) = 0.17014116E39 rem (0.17014117E39, ~0.123) = ~inf * (0.17014117E39, ~0.123E~2) = ~0.20927364E36 + (0.17014117E39, ~0.123E~2) = 0.17014117E39 - (0.17014117E39, ~0.123E~2) = 0.17014117E39 / (0.17014117E39, ~0.123E~2) = ~inf nextAfter (0.17014117E39, ~0.123E~2) = 0.17014116E39 rem (0.17014117E39, ~0.123E~2) = ~inf * (0.17014117E39, ~0.11754944E~37) = ~0.19999999E1 + (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 - (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 / (0.17014117E39, ~0.11754944E~37) = ~inf nextAfter (0.17014117E39, ~0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, ~0.11754944E~37) = ~inf * (0.17014117E39, ~0.5877472E~38) = ~0.99999994 + (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 - (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 / (0.17014117E39, ~0.5877472E~38) = ~inf nextAfter (0.17014117E39, ~0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, ~0.5877472E~38) = ~inf * (0.17014117E39, ~0.1E~44) = ~0.23841856E~6 + (0.17014117E39, ~0.1E~44) = 0.17014117E39 - (0.17014117E39, ~0.1E~44) = 0.17014117E39 / (0.17014117E39, ~0.1E~44) = ~inf nextAfter (0.17014117E39, ~0.1E~44) = 0.17014116E39 rem (0.17014117E39, ~0.1E~44) = ~inf * (0.17014117E39, ~0.0) = ~0.0 + (0.17014117E39, ~0.0) = 0.17014117E39 - (0.17014117E39, ~0.0) = 0.17014117E39 / (0.17014117E39, ~0.0) = ~inf nextAfter (0.17014117E39, ~0.0) = 0.17014116E39 rem (0.17014117E39, ~0.0) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.17014117E39, ~inf) = ~inf + (0.17014117E39, ~inf) = ~inf - (0.17014117E39, ~inf) = inf / (0.17014117E39, ~inf) = ~0.0 nextAfter (0.17014117E39, ~inf) = 0.17014116E39 rem (0.17014117E39, ~inf) = 0.17014117E39 * (0.17014117E39, nan) = nan + (0.17014117E39, nan) = nan - (0.17014117E39, nan) = nan / (0.17014117E39, nan) = nan nextAfter (0.17014117E39, nan) = nan rem (0.17014117E39, nan) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.123E4, 0.34028235E39) = inf + (0.123E4, 0.34028235E39) = 0.34028235E39 - (0.123E4, 0.34028235E39) = ~0.34028235E39 / (0.123E4, 0.34028235E39) = 0.36146455E~35 nextAfter (0.123E4, 0.34028235E39) = 0.12300001E4 rem (0.123E4, 0.34028235E39) = 0.123E4 * (0.123E4, 0.17014117E39) = inf + (0.123E4, 0.17014117E39) = 0.17014117E39 - (0.123E4, 0.17014117E39) = ~0.17014117E39 / (0.123E4, 0.17014117E39) = 0.7229291E~35 nextAfter (0.123E4, 0.17014117E39) = 0.12300001E4 rem (0.123E4, 0.17014117E39) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.31415927E1) = 0.38641592E4 + (0.123E4, 0.31415927E1) = 0.12331416E4 - (0.123E4, 0.31415927E1) = 0.12268584E4 / (0.123E4, 0.31415927E1) = 0.39152115E3 nextAfter (0.123E4, 0.31415927E1) = 0.12299999E4 rem (0.123E4, 0.31415927E1) = 0.1637207E1 * (0.123E4, 0.27182817E1) = 0.33434866E4 + (0.123E4, 0.27182817E1) = 0.12327183E4 - (0.123E4, 0.27182817E1) = 0.12272817E4 / (0.123E4, 0.27182817E1) = 0.45249173E3 nextAfter (0.123E4, 0.27182817E1) = 0.12299999E4 rem (0.123E4, 0.27182817E1) = 0.13366699E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129001E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129001E1 + (0.123E4, 0.123E~2) = 0.12300012E4 - (0.123E4, 0.123E~2) = 0.12299988E4 / (0.123E4, 0.123E~2) = 0.99999994E6 nextAfter (0.123E4, 0.123E~2) = 0.12299999E4 rem (0.123E4, 0.123E~2) = 0.12207031E~2 * (0.123E4, 0.11754944E~37) = 0.1445858E~34 + (0.123E4, 0.11754944E~37) = 0.123E4 - (0.123E4, 0.11754944E~37) = 0.123E4 / (0.123E4, 0.11754944E~37) = inf nextAfter (0.123E4, 0.11754944E~37) = 0.12299999E4 rem (0.123E4, 0.11754944E~37) = ~inf * (0.123E4, 0.5877472E~38) = 0.722929E~35 + (0.123E4, 0.5877472E~38) = 0.123E4 - (0.123E4, 0.5877472E~38) = 0.123E4 / (0.123E4, 0.5877472E~38) = inf nextAfter (0.123E4, 0.5877472E~38) = 0.12299999E4 rem (0.123E4, 0.5877472E~38) = ~inf * (0.123E4, 0.1E~44) = 0.1724E~41 + (0.123E4, 0.1E~44) = 0.123E4 - (0.123E4, 0.1E~44) = 0.123E4 / (0.123E4, 0.1E~44) = inf nextAfter (0.123E4, 0.1E~44) = 0.12299999E4 rem (0.123E4, 0.1E~44) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.34028235E39) = ~inf + (0.123E4, ~0.34028235E39) = ~0.34028235E39 - (0.123E4, ~0.34028235E39) = 0.34028235E39 / (0.123E4, ~0.34028235E39) = ~0.36146455E~35 nextAfter (0.123E4, ~0.34028235E39) = 0.12299999E4 rem (0.123E4, ~0.34028235E39) = 0.123E4 * (0.123E4, ~0.17014117E39) = ~inf + (0.123E4, ~0.17014117E39) = ~0.17014117E39 - (0.123E4, ~0.17014117E39) = 0.17014117E39 / (0.123E4, ~0.17014117E39) = ~0.7229291E~35 nextAfter (0.123E4, ~0.17014117E39) = 0.12299999E4 rem (0.123E4, ~0.17014117E39) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.31415927E1) = ~0.38641592E4 + (0.123E4, ~0.31415927E1) = 0.12268584E4 - (0.123E4, ~0.31415927E1) = 0.12331416E4 / (0.123E4, ~0.31415927E1) = ~0.39152115E3 nextAfter (0.123E4, ~0.31415927E1) = 0.12299999E4 rem (0.123E4, ~0.31415927E1) = 0.1637207E1 * (0.123E4, ~0.27182817E1) = ~0.33434866E4 + (0.123E4, ~0.27182817E1) = 0.12272817E4 - (0.123E4, ~0.27182817E1) = 0.12327183E4 / (0.123E4, ~0.27182817E1) = ~0.45249173E3 nextAfter (0.123E4, ~0.27182817E1) = 0.12299999E4 rem (0.123E4, ~0.27182817E1) = 0.13366699E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129001E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129001E1 + (0.123E4, ~0.123E~2) = 0.12299988E4 - (0.123E4, ~0.123E~2) = 0.12300012E4 / (0.123E4, ~0.123E~2) = ~0.99999994E6 nextAfter (0.123E4, ~0.123E~2) = 0.12299999E4 rem (0.123E4, ~0.123E~2) = 0.12207031E~2 * (0.123E4, ~0.11754944E~37) = ~0.1445858E~34 + (0.123E4, ~0.11754944E~37) = 0.123E4 - (0.123E4, ~0.11754944E~37) = 0.123E4 / (0.123E4, ~0.11754944E~37) = ~inf nextAfter (0.123E4, ~0.11754944E~37) = 0.12299999E4 rem (0.123E4, ~0.11754944E~37) = ~inf * (0.123E4, ~0.5877472E~38) = ~0.722929E~35 + (0.123E4, ~0.5877472E~38) = 0.123E4 - (0.123E4, ~0.5877472E~38) = 0.123E4 / (0.123E4, ~0.5877472E~38) = ~inf nextAfter (0.123E4, ~0.5877472E~38) = 0.12299999E4 rem (0.123E4, ~0.5877472E~38) = ~inf * (0.123E4, ~0.1E~44) = ~0.1724E~41 + (0.123E4, ~0.1E~44) = 0.123E4 - (0.123E4, ~0.1E~44) = 0.123E4 / (0.123E4, ~0.1E~44) = ~inf nextAfter (0.123E4, ~0.1E~44) = 0.12299999E4 rem (0.123E4, ~0.1E~44) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.34028235E39) = inf + (0.123E2, 0.34028235E39) = 0.34028235E39 - (0.123E2, 0.34028235E39) = ~0.34028235E39 / (0.123E2, 0.34028235E39) = 0.36146455E~37 nextAfter (0.123E2, 0.34028235E39) = 0.12300001E2 rem (0.123E2, 0.34028235E39) = 0.123E2 * (0.123E2, 0.17014117E39) = inf + (0.123E2, 0.17014117E39) = 0.17014117E39 - (0.123E2, 0.17014117E39) = ~0.17014117E39 / (0.123E2, 0.17014117E39) = 0.7229291E~37 nextAfter (0.123E2, 0.17014117E39) = 0.12300001E2 rem (0.123E2, 0.17014117E39) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300001E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129001E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.31415927E1) = 0.3864159E2 + (0.123E2, 0.31415927E1) = 0.15441593E2 - (0.123E2, 0.31415927E1) = 0.9158407E1 / (0.123E2, 0.31415927E1) = 0.39152114E1 nextAfter (0.123E2, 0.31415927E1) = 0.12299999E2 rem (0.123E2, 0.31415927E1) = 0.28752222E1 * (0.123E2, 0.27182817E1) = 0.33434868E2 + (0.123E2, 0.27182817E1) = 0.15018282E2 - (0.123E2, 0.27182817E1) = 0.9581718E1 / (0.123E2, 0.27182817E1) = 0.4524917E1 nextAfter (0.123E2, 0.27182817E1) = 0.12299999E2 rem (0.123E2, 0.27182817E1) = 0.14268732E1 * (0.123E2, 0.123E1) = 0.15129001E2 + (0.123E2, 0.123E1) = 0.13530001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177E2 / (0.123E2, 0.123) = 0.1E3 nextAfter (0.123E2, 0.123) = 0.12299999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129001E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.1229877E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999E2 rem (0.123E2, 0.123E~2) = 0.0 * (0.123E2, 0.11754944E~37) = 0.14458581E~36 + (0.123E2, 0.11754944E~37) = 0.123E2 - (0.123E2, 0.11754944E~37) = 0.123E2 / (0.123E2, 0.11754944E~37) = inf nextAfter (0.123E2, 0.11754944E~37) = 0.12299999E2 rem (0.123E2, 0.11754944E~37) = ~inf * (0.123E2, 0.5877472E~38) = 0.72292904E~37 + (0.123E2, 0.5877472E~38) = 0.123E2 - (0.123E2, 0.5877472E~38) = 0.123E2 / (0.123E2, 0.5877472E~38) = inf nextAfter (0.123E2, 0.5877472E~38) = 0.12299999E2 rem (0.123E2, 0.5877472E~38) = ~inf * (0.123E2, 0.1E~44) = 0.17E~43 + (0.123E2, 0.1E~44) = 0.123E2 - (0.123E2, 0.1E~44) = 0.123E2 / (0.123E2, 0.1E~44) = inf nextAfter (0.123E2, 0.1E~44) = 0.12299999E2 rem (0.123E2, 0.1E~44) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.34028235E39) = ~inf + (0.123E2, ~0.34028235E39) = ~0.34028235E39 - (0.123E2, ~0.34028235E39) = 0.34028235E39 / (0.123E2, ~0.34028235E39) = ~0.36146455E~37 nextAfter (0.123E2, ~0.34028235E39) = 0.12299999E2 rem (0.123E2, ~0.34028235E39) = 0.123E2 * (0.123E2, ~0.17014117E39) = ~inf + (0.123E2, ~0.17014117E39) = ~0.17014117E39 - (0.123E2, ~0.17014117E39) = 0.17014117E39 / (0.123E2, ~0.17014117E39) = ~0.7229291E~37 nextAfter (0.123E2, ~0.17014117E39) = 0.12299999E2 rem (0.123E2, ~0.17014117E39) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129001E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.31415927E1) = ~0.3864159E2 + (0.123E2, ~0.31415927E1) = 0.9158407E1 - (0.123E2, ~0.31415927E1) = 0.15441593E2 / (0.123E2, ~0.31415927E1) = ~0.39152114E1 nextAfter (0.123E2, ~0.31415927E1) = 0.12299999E2 rem (0.123E2, ~0.31415927E1) = 0.28752222E1 * (0.123E2, ~0.27182817E1) = ~0.33434868E2 + (0.123E2, ~0.27182817E1) = 0.9581718E1 - (0.123E2, ~0.27182817E1) = 0.15018282E2 / (0.123E2, ~0.27182817E1) = ~0.4524917E1 nextAfter (0.123E2, ~0.27182817E1) = 0.12299999E2 rem (0.123E2, ~0.27182817E1) = 0.14268732E1 * (0.123E2, ~0.123E1) = ~0.15129001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129001E1 + (0.123E2, ~0.123) = 0.12177E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.1E3 nextAfter (0.123E2, ~0.123) = 0.12299999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129001E~1 + (0.123E2, ~0.123E~2) = 0.1229877E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999E2 rem (0.123E2, ~0.123E~2) = 0.0 * (0.123E2, ~0.11754944E~37) = ~0.14458581E~36 + (0.123E2, ~0.11754944E~37) = 0.123E2 - (0.123E2, ~0.11754944E~37) = 0.123E2 / (0.123E2, ~0.11754944E~37) = ~inf nextAfter (0.123E2, ~0.11754944E~37) = 0.12299999E2 rem (0.123E2, ~0.11754944E~37) = ~inf * (0.123E2, ~0.5877472E~38) = ~0.72292904E~37 + (0.123E2, ~0.5877472E~38) = 0.123E2 - (0.123E2, ~0.5877472E~38) = 0.123E2 / (0.123E2, ~0.5877472E~38) = ~inf nextAfter (0.123E2, ~0.5877472E~38) = 0.12299999E2 rem (0.123E2, ~0.5877472E~38) = ~inf * (0.123E2, ~0.1E~44) = ~0.17E~43 + (0.123E2, ~0.1E~44) = 0.123E2 - (0.123E2, ~0.1E~44) = 0.123E2 / (0.123E2, ~0.1E~44) = ~inf nextAfter (0.123E2, ~0.1E~44) = 0.12299999E2 rem (0.123E2, ~0.1E~44) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.31415927E1, 0.34028235E39) = inf + (0.31415927E1, 0.34028235E39) = 0.34028235E39 - (0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (0.31415927E1, 0.34028235E39) = 0.9232312E~38 nextAfter (0.31415927E1, 0.34028235E39) = 0.3141593E1 rem (0.31415927E1, 0.34028235E39) = 0.31415927E1 * (0.31415927E1, 0.17014117E39) = inf + (0.31415927E1, 0.17014117E39) = 0.17014117E39 - (0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (0.31415927E1, 0.17014117E39) = 0.18464624E~37 nextAfter (0.31415927E1, 0.17014117E39) = 0.3141593E1 rem (0.31415927E1, 0.17014117E39) = 0.31415927E1 * (0.31415927E1, 0.123E4) = 0.38641592E4 + (0.31415927E1, 0.123E4) = 0.12331416E4 - (0.31415927E1, 0.123E4) = ~0.12268584E4 / (0.31415927E1, 0.123E4) = 0.25541405E~2 nextAfter (0.31415927E1, 0.123E4) = 0.3141593E1 rem (0.31415927E1, 0.123E4) = 0.31415927E1 * (0.31415927E1, 0.123E2) = 0.3864159E2 + (0.31415927E1, 0.123E2) = 0.15441593E2 - (0.31415927E1, 0.123E2) = ~0.9158407E1 / (0.31415927E1, 0.123E2) = 0.25541404 nextAfter (0.31415927E1, 0.123E2) = 0.3141593E1 rem (0.31415927E1, 0.123E2) = 0.31415927E1 * (0.31415927E1, 0.31415927E1) = 0.9869605E1 + (0.31415927E1, 0.31415927E1) = 0.62831855E1 - (0.31415927E1, 0.31415927E1) = 0.0 / (0.31415927E1, 0.31415927E1) = 0.1E1 nextAfter (0.31415927E1, 0.31415927E1) = 0.31415927E1 rem (0.31415927E1, 0.31415927E1) = 0.0 * (0.31415927E1, 0.27182817E1) = 0.8539734E1 + (0.31415927E1, 0.27182817E1) = 0.58598747E1 - (0.31415927E1, 0.27182817E1) = 0.423311 / (0.31415927E1, 0.27182817E1) = 0.11557274E1 nextAfter (0.31415927E1, 0.27182817E1) = 0.31415925E1 rem (0.31415927E1, 0.27182817E1) = 0.423311 * (0.31415927E1, 0.123E1) = 0.3864159E1 + (0.31415927E1, 0.123E1) = 0.43715925E1 - (0.31415927E1, 0.123E1) = 0.19115927E1 / (0.31415927E1, 0.123E1) = 0.25541403E1 nextAfter (0.31415927E1, 0.123E1) = 0.31415925E1 rem (0.31415927E1, 0.123E1) = 0.6815927 * (0.31415927E1, 0.123) = 0.38641593 + (0.31415927E1, 0.123) = 0.32645926E1 - (0.31415927E1, 0.123) = 0.30185928E1 / (0.31415927E1, 0.123) = 0.25541403E2 nextAfter (0.31415927E1, 0.123) = 0.31415925E1 rem (0.31415927E1, 0.123) = 0.6659269E~1 * (0.31415927E1, 0.123E~2) = 0.38641593E~2 + (0.31415927E1, 0.123E~2) = 0.31428227E1 - (0.31415927E1, 0.123E~2) = 0.31403627E1 / (0.31415927E1, 0.123E~2) = 0.25541404E4 nextAfter (0.31415927E1, 0.123E~2) = 0.31415925E1 rem (0.31415927E1, 0.123E~2) = 0.17261505E~3 * (0.31415927E1, 0.11754944E~37) = 0.36929245E~37 + (0.31415927E1, 0.11754944E~37) = 0.31415927E1 - (0.31415927E1, 0.11754944E~37) = 0.31415927E1 / (0.31415927E1, 0.11754944E~37) = 0.26725715E39 nextAfter (0.31415927E1, 0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, 0.11754944E~37) = 0.0 * (0.31415927E1, 0.5877472E~38) = 0.18464623E~37 + (0.31415927E1, 0.5877472E~38) = 0.31415927E1 - (0.31415927E1, 0.5877472E~38) = 0.31415927E1 / (0.31415927E1, 0.5877472E~38) = inf nextAfter (0.31415927E1, 0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, 0.5877472E~38) = ~inf * (0.31415927E1, 0.1E~44) = 0.4E~44 + (0.31415927E1, 0.1E~44) = 0.31415927E1 - (0.31415927E1, 0.1E~44) = 0.31415927E1 / (0.31415927E1, 0.1E~44) = inf nextAfter (0.31415927E1, 0.1E~44) = 0.31415925E1 rem (0.31415927E1, 0.1E~44) = ~inf * (0.31415927E1, 0.0) = 0.0 + (0.31415927E1, 0.0) = 0.31415927E1 - (0.31415927E1, 0.0) = 0.31415927E1 / (0.31415927E1, 0.0) = inf nextAfter (0.31415927E1, 0.0) = 0.31415925E1 rem (0.31415927E1, 0.0) = nan * (0.31415927E1, ~0.34028235E39) = ~inf + (0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (0.31415927E1, ~0.34028235E39) = ~0.9232312E~38 nextAfter (0.31415927E1, ~0.34028235E39) = 0.31415925E1 rem (0.31415927E1, ~0.34028235E39) = 0.31415927E1 * (0.31415927E1, ~0.17014117E39) = ~inf + (0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (0.31415927E1, ~0.17014117E39) = ~0.18464624E~37 nextAfter (0.31415927E1, ~0.17014117E39) = 0.31415925E1 rem (0.31415927E1, ~0.17014117E39) = 0.31415927E1 * (0.31415927E1, ~0.123E4) = ~0.38641592E4 + (0.31415927E1, ~0.123E4) = ~0.12268584E4 - (0.31415927E1, ~0.123E4) = 0.12331416E4 / (0.31415927E1, ~0.123E4) = ~0.25541405E~2 nextAfter (0.31415927E1, ~0.123E4) = 0.31415925E1 rem (0.31415927E1, ~0.123E4) = 0.31415927E1 * (0.31415927E1, ~0.123E2) = ~0.3864159E2 + (0.31415927E1, ~0.123E2) = ~0.9158407E1 - (0.31415927E1, ~0.123E2) = 0.15441593E2 / (0.31415927E1, ~0.123E2) = ~0.25541404 nextAfter (0.31415927E1, ~0.123E2) = 0.31415925E1 rem (0.31415927E1, ~0.123E2) = 0.31415927E1 * (0.31415927E1, ~0.31415927E1) = ~0.9869605E1 + (0.31415927E1, ~0.31415927E1) = 0.0 - (0.31415927E1, ~0.31415927E1) = 0.62831855E1 / (0.31415927E1, ~0.31415927E1) = ~0.1E1 nextAfter (0.31415927E1, ~0.31415927E1) = 0.31415925E1 rem (0.31415927E1, ~0.31415927E1) = 0.0 * (0.31415927E1, ~0.27182817E1) = ~0.8539734E1 + (0.31415927E1, ~0.27182817E1) = 0.423311 - (0.31415927E1, ~0.27182817E1) = 0.58598747E1 / (0.31415927E1, ~0.27182817E1) = ~0.11557274E1 nextAfter (0.31415927E1, ~0.27182817E1) = 0.31415925E1 rem (0.31415927E1, ~0.27182817E1) = 0.423311 * (0.31415927E1, ~0.123E1) = ~0.3864159E1 + (0.31415927E1, ~0.123E1) = 0.19115927E1 - (0.31415927E1, ~0.123E1) = 0.43715925E1 / (0.31415927E1, ~0.123E1) = ~0.25541403E1 nextAfter (0.31415927E1, ~0.123E1) = 0.31415925E1 rem (0.31415927E1, ~0.123E1) = 0.6815927 * (0.31415927E1, ~0.123) = ~0.38641593 + (0.31415927E1, ~0.123) = 0.30185928E1 - (0.31415927E1, ~0.123) = 0.32645926E1 / (0.31415927E1, ~0.123) = ~0.25541403E2 nextAfter (0.31415927E1, ~0.123) = 0.31415925E1 rem (0.31415927E1, ~0.123) = 0.6659269E~1 * (0.31415927E1, ~0.123E~2) = ~0.38641593E~2 + (0.31415927E1, ~0.123E~2) = 0.31403627E1 - (0.31415927E1, ~0.123E~2) = 0.31428227E1 / (0.31415927E1, ~0.123E~2) = ~0.25541404E4 nextAfter (0.31415927E1, ~0.123E~2) = 0.31415925E1 rem (0.31415927E1, ~0.123E~2) = 0.17261505E~3 * (0.31415927E1, ~0.11754944E~37) = ~0.36929245E~37 + (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 - (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 / (0.31415927E1, ~0.11754944E~37) = ~0.26725715E39 nextAfter (0.31415927E1, ~0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, ~0.11754944E~37) = 0.0 * (0.31415927E1, ~0.5877472E~38) = ~0.18464623E~37 + (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 - (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 / (0.31415927E1, ~0.5877472E~38) = ~inf nextAfter (0.31415927E1, ~0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, ~0.5877472E~38) = ~inf * (0.31415927E1, ~0.1E~44) = ~0.4E~44 + (0.31415927E1, ~0.1E~44) = 0.31415927E1 - (0.31415927E1, ~0.1E~44) = 0.31415927E1 / (0.31415927E1, ~0.1E~44) = ~inf nextAfter (0.31415927E1, ~0.1E~44) = 0.31415925E1 rem (0.31415927E1, ~0.1E~44) = ~inf * (0.31415927E1, ~0.0) = ~0.0 + (0.31415927E1, ~0.0) = 0.31415927E1 - (0.31415927E1, ~0.0) = 0.31415927E1 / (0.31415927E1, ~0.0) = ~inf nextAfter (0.31415927E1, ~0.0) = 0.31415925E1 rem (0.31415927E1, ~0.0) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.31415927E1, ~inf) = ~inf + (0.31415927E1, ~inf) = ~inf - (0.31415927E1, ~inf) = inf / (0.31415927E1, ~inf) = ~0.0 nextAfter (0.31415927E1, ~inf) = 0.31415925E1 rem (0.31415927E1, ~inf) = 0.31415927E1 * (0.31415927E1, nan) = nan + (0.31415927E1, nan) = nan - (0.31415927E1, nan) = nan / (0.31415927E1, nan) = nan nextAfter (0.31415927E1, nan) = nan rem (0.31415927E1, nan) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.27182817E1, 0.34028235E39) = inf + (0.27182817E1, 0.34028235E39) = 0.34028235E39 - (0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (0.27182817E1, 0.34028235E39) = 0.7988312E~38 nextAfter (0.27182817E1, 0.34028235E39) = 0.2718282E1 rem (0.27182817E1, 0.34028235E39) = 0.27182817E1 * (0.27182817E1, 0.17014117E39) = inf + (0.27182817E1, 0.17014117E39) = 0.17014117E39 - (0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (0.27182817E1, 0.17014117E39) = 0.15976626E~37 nextAfter (0.27182817E1, 0.17014117E39) = 0.2718282E1 rem (0.27182817E1, 0.17014117E39) = 0.27182817E1 * (0.27182817E1, 0.123E4) = 0.33434866E4 + (0.27182817E1, 0.123E4) = 0.12327183E4 - (0.27182817E1, 0.123E4) = ~0.12272817E4 / (0.27182817E1, 0.123E4) = 0.22099852E~2 nextAfter (0.27182817E1, 0.123E4) = 0.2718282E1 rem (0.27182817E1, 0.123E4) = 0.27182817E1 * (0.27182817E1, 0.123E2) = 0.33434868E2 + (0.27182817E1, 0.123E2) = 0.15018282E2 - (0.27182817E1, 0.123E2) = ~0.9581718E1 / (0.27182817E1, 0.123E2) = 0.22099851 nextAfter (0.27182817E1, 0.123E2) = 0.2718282E1 rem (0.27182817E1, 0.123E2) = 0.27182817E1 * (0.27182817E1, 0.31415927E1) = 0.8539734E1 + (0.27182817E1, 0.31415927E1) = 0.58598747E1 - (0.27182817E1, 0.31415927E1) = ~0.423311 / (0.27182817E1, 0.31415927E1) = 0.86525595 nextAfter (0.27182817E1, 0.31415927E1) = 0.2718282E1 rem (0.27182817E1, 0.31415927E1) = 0.27182817E1 * (0.27182817E1, 0.27182817E1) = 0.73890557E1 + (0.27182817E1, 0.27182817E1) = 0.54365635E1 - (0.27182817E1, 0.27182817E1) = 0.0 / (0.27182817E1, 0.27182817E1) = 0.1E1 nextAfter (0.27182817E1, 0.27182817E1) = 0.27182817E1 rem (0.27182817E1, 0.27182817E1) = 0.0 * (0.27182817E1, 0.123E1) = 0.33434865E1 + (0.27182817E1, 0.123E1) = 0.39482818E1 - (0.27182817E1, 0.123E1) = 0.14882817E1 / (0.27182817E1, 0.123E1) = 0.2209985E1 nextAfter (0.27182817E1, 0.123E1) = 0.27182815E1 rem (0.27182817E1, 0.123E1) = 0.2582817 * (0.27182817E1, 0.123) = 0.33434868 + (0.27182817E1, 0.123) = 0.28412817E1 - (0.27182817E1, 0.123) = 0.25952818E1 / (0.27182817E1, 0.123) = 0.22099852E2 nextAfter (0.27182817E1, 0.123) = 0.27182815E1 rem (0.27182817E1, 0.123) = 0.12281656E~1 * (0.27182817E1, 0.123E~2) = 0.33434867E~2 + (0.27182817E1, 0.123E~2) = 0.27195117E1 - (0.27182817E1, 0.123E~2) = 0.27170517E1 / (0.27182817E1, 0.123E~2) = 0.2209985E4 nextAfter (0.27182817E1, 0.123E~2) = 0.27182815E1 rem (0.27182817E1, 0.123E~2) = 0.12116432E~2 * (0.27182817E1, 0.11754944E~37) = 0.31953248E~37 + (0.27182817E1, 0.11754944E~37) = 0.27182817E1 - (0.27182817E1, 0.11754944E~37) = 0.27182817E1 / (0.27182817E1, 0.11754944E~37) = 0.23124584E39 nextAfter (0.27182817E1, 0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, 0.11754944E~37) = 0.0 * (0.27182817E1, 0.5877472E~38) = 0.15976624E~37 + (0.27182817E1, 0.5877472E~38) = 0.27182817E1 - (0.27182817E1, 0.5877472E~38) = 0.27182817E1 / (0.27182817E1, 0.5877472E~38) = inf nextAfter (0.27182817E1, 0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, 0.5877472E~38) = ~inf * (0.27182817E1, 0.1E~44) = 0.4E~44 + (0.27182817E1, 0.1E~44) = 0.27182817E1 - (0.27182817E1, 0.1E~44) = 0.27182817E1 / (0.27182817E1, 0.1E~44) = inf nextAfter (0.27182817E1, 0.1E~44) = 0.27182815E1 rem (0.27182817E1, 0.1E~44) = ~inf * (0.27182817E1, 0.0) = 0.0 + (0.27182817E1, 0.0) = 0.27182817E1 - (0.27182817E1, 0.0) = 0.27182817E1 / (0.27182817E1, 0.0) = inf nextAfter (0.27182817E1, 0.0) = 0.27182815E1 rem (0.27182817E1, 0.0) = nan * (0.27182817E1, ~0.34028235E39) = ~inf + (0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (0.27182817E1, ~0.34028235E39) = ~0.7988312E~38 nextAfter (0.27182817E1, ~0.34028235E39) = 0.27182815E1 rem (0.27182817E1, ~0.34028235E39) = 0.27182817E1 * (0.27182817E1, ~0.17014117E39) = ~inf + (0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (0.27182817E1, ~0.17014117E39) = ~0.15976626E~37 nextAfter (0.27182817E1, ~0.17014117E39) = 0.27182815E1 rem (0.27182817E1, ~0.17014117E39) = 0.27182817E1 * (0.27182817E1, ~0.123E4) = ~0.33434866E4 + (0.27182817E1, ~0.123E4) = ~0.12272817E4 - (0.27182817E1, ~0.123E4) = 0.12327183E4 / (0.27182817E1, ~0.123E4) = ~0.22099852E~2 nextAfter (0.27182817E1, ~0.123E4) = 0.27182815E1 rem (0.27182817E1, ~0.123E4) = 0.27182817E1 * (0.27182817E1, ~0.123E2) = ~0.33434868E2 + (0.27182817E1, ~0.123E2) = ~0.9581718E1 - (0.27182817E1, ~0.123E2) = 0.15018282E2 / (0.27182817E1, ~0.123E2) = ~0.22099851 nextAfter (0.27182817E1, ~0.123E2) = 0.27182815E1 rem (0.27182817E1, ~0.123E2) = 0.27182817E1 * (0.27182817E1, ~0.31415927E1) = ~0.8539734E1 + (0.27182817E1, ~0.31415927E1) = ~0.423311 - (0.27182817E1, ~0.31415927E1) = 0.58598747E1 / (0.27182817E1, ~0.31415927E1) = ~0.86525595 nextAfter (0.27182817E1, ~0.31415927E1) = 0.27182815E1 rem (0.27182817E1, ~0.31415927E1) = 0.27182817E1 * (0.27182817E1, ~0.27182817E1) = ~0.73890557E1 + (0.27182817E1, ~0.27182817E1) = 0.0 - (0.27182817E1, ~0.27182817E1) = 0.54365635E1 / (0.27182817E1, ~0.27182817E1) = ~0.1E1 nextAfter (0.27182817E1, ~0.27182817E1) = 0.27182815E1 rem (0.27182817E1, ~0.27182817E1) = 0.0 * (0.27182817E1, ~0.123E1) = ~0.33434865E1 + (0.27182817E1, ~0.123E1) = 0.14882817E1 - (0.27182817E1, ~0.123E1) = 0.39482818E1 / (0.27182817E1, ~0.123E1) = ~0.2209985E1 nextAfter (0.27182817E1, ~0.123E1) = 0.27182815E1 rem (0.27182817E1, ~0.123E1) = 0.2582817 * (0.27182817E1, ~0.123) = ~0.33434868 + (0.27182817E1, ~0.123) = 0.25952818E1 - (0.27182817E1, ~0.123) = 0.28412817E1 / (0.27182817E1, ~0.123) = ~0.22099852E2 nextAfter (0.27182817E1, ~0.123) = 0.27182815E1 rem (0.27182817E1, ~0.123) = 0.12281656E~1 * (0.27182817E1, ~0.123E~2) = ~0.33434867E~2 + (0.27182817E1, ~0.123E~2) = 0.27170517E1 - (0.27182817E1, ~0.123E~2) = 0.27195117E1 / (0.27182817E1, ~0.123E~2) = ~0.2209985E4 nextAfter (0.27182817E1, ~0.123E~2) = 0.27182815E1 rem (0.27182817E1, ~0.123E~2) = 0.12116432E~2 * (0.27182817E1, ~0.11754944E~37) = ~0.31953248E~37 + (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 - (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 / (0.27182817E1, ~0.11754944E~37) = ~0.23124584E39 nextAfter (0.27182817E1, ~0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, ~0.11754944E~37) = 0.0 * (0.27182817E1, ~0.5877472E~38) = ~0.15976624E~37 + (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 - (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 / (0.27182817E1, ~0.5877472E~38) = ~inf nextAfter (0.27182817E1, ~0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, ~0.5877472E~38) = ~inf * (0.27182817E1, ~0.1E~44) = ~0.4E~44 + (0.27182817E1, ~0.1E~44) = 0.27182817E1 - (0.27182817E1, ~0.1E~44) = 0.27182817E1 / (0.27182817E1, ~0.1E~44) = ~inf nextAfter (0.27182817E1, ~0.1E~44) = 0.27182815E1 rem (0.27182817E1, ~0.1E~44) = ~inf * (0.27182817E1, ~0.0) = ~0.0 + (0.27182817E1, ~0.0) = 0.27182817E1 - (0.27182817E1, ~0.0) = 0.27182817E1 / (0.27182817E1, ~0.0) = ~inf nextAfter (0.27182817E1, ~0.0) = 0.27182815E1 rem (0.27182817E1, ~0.0) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.27182817E1, ~inf) = ~inf + (0.27182817E1, ~inf) = ~inf - (0.27182817E1, ~inf) = inf / (0.27182817E1, ~inf) = ~0.0 nextAfter (0.27182817E1, ~inf) = 0.27182815E1 rem (0.27182817E1, ~inf) = 0.27182817E1 * (0.27182817E1, nan) = nan + (0.27182817E1, nan) = nan - (0.27182817E1, nan) = nan / (0.27182817E1, nan) = nan nextAfter (0.27182817E1, nan) = nan rem (0.27182817E1, nan) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.123E1, 0.34028235E39) = inf + (0.123E1, 0.34028235E39) = 0.34028235E39 - (0.123E1, 0.34028235E39) = ~0.34028235E39 / (0.123E1, 0.34028235E39) = 0.3614645E~38 nextAfter (0.123E1, 0.34028235E39) = 0.12300001E1 rem (0.123E1, 0.34028235E39) = 0.123E1 * (0.123E1, 0.17014117E39) = 0.20927364E39 + (0.123E1, 0.17014117E39) = 0.17014117E39 - (0.123E1, 0.17014117E39) = ~0.17014117E39 / (0.123E1, 0.17014117E39) = 0.722929E~38 nextAfter (0.123E1, 0.17014117E39) = 0.12300001E1 rem (0.123E1, 0.17014117E39) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300001E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129001E2 + (0.123E1, 0.123E2) = 0.13530001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.1 nextAfter (0.123E1, 0.123E2) = 0.12300001E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.31415927E1) = 0.3864159E1 + (0.123E1, 0.31415927E1) = 0.43715925E1 - (0.123E1, 0.31415927E1) = ~0.19115927E1 / (0.123E1, 0.31415927E1) = 0.39152116 nextAfter (0.123E1, 0.31415927E1) = 0.12300001E1 rem (0.123E1, 0.31415927E1) = 0.123E1 * (0.123E1, 0.27182817E1) = 0.33434865E1 + (0.123E1, 0.27182817E1) = 0.39482818E1 - (0.123E1, 0.27182817E1) = ~0.14882817E1 / (0.123E1, 0.27182817E1) = 0.45249173 nextAfter (0.123E1, 0.27182817E1) = 0.12300001E1 rem (0.123E1, 0.27182817E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129001E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.11754944E~37) = 0.14458581E~37 + (0.123E1, 0.11754944E~37) = 0.123E1 - (0.123E1, 0.11754944E~37) = 0.123E1 / (0.123E1, 0.11754944E~37) = 0.10463683E39 nextAfter (0.123E1, 0.11754944E~37) = 0.12299999E1 rem (0.123E1, 0.11754944E~37) = 0.0 * (0.123E1, 0.5877472E~38) = 0.722929E~38 + (0.123E1, 0.5877472E~38) = 0.123E1 - (0.123E1, 0.5877472E~38) = 0.123E1 / (0.123E1, 0.5877472E~38) = 0.20927366E39 nextAfter (0.123E1, 0.5877472E~38) = 0.12299999E1 rem (0.123E1, 0.5877472E~38) = 0.0 * (0.123E1, 0.1E~44) = 0.1E~44 + (0.123E1, 0.1E~44) = 0.123E1 - (0.123E1, 0.1E~44) = 0.123E1 / (0.123E1, 0.1E~44) = inf nextAfter (0.123E1, 0.1E~44) = 0.12299999E1 rem (0.123E1, 0.1E~44) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.34028235E39) = ~inf + (0.123E1, ~0.34028235E39) = ~0.34028235E39 - (0.123E1, ~0.34028235E39) = 0.34028235E39 / (0.123E1, ~0.34028235E39) = ~0.3614645E~38 nextAfter (0.123E1, ~0.34028235E39) = 0.12299999E1 rem (0.123E1, ~0.34028235E39) = 0.123E1 * (0.123E1, ~0.17014117E39) = ~0.20927364E39 + (0.123E1, ~0.17014117E39) = ~0.17014117E39 - (0.123E1, ~0.17014117E39) = 0.17014117E39 / (0.123E1, ~0.17014117E39) = ~0.722929E~38 nextAfter (0.123E1, ~0.17014117E39) = 0.12299999E1 rem (0.123E1, ~0.17014117E39) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530001E2 / (0.123E1, ~0.123E2) = ~0.1 nextAfter (0.123E1, ~0.123E2) = 0.12299999E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.31415927E1) = ~0.3864159E1 + (0.123E1, ~0.31415927E1) = ~0.19115927E1 - (0.123E1, ~0.31415927E1) = 0.43715925E1 / (0.123E1, ~0.31415927E1) = ~0.39152116 nextAfter (0.123E1, ~0.31415927E1) = 0.12299999E1 rem (0.123E1, ~0.31415927E1) = 0.123E1 * (0.123E1, ~0.27182817E1) = ~0.33434865E1 + (0.123E1, ~0.27182817E1) = ~0.14882817E1 - (0.123E1, ~0.27182817E1) = 0.39482818E1 / (0.123E1, ~0.27182817E1) = ~0.45249173 nextAfter (0.123E1, ~0.27182817E1) = 0.12299999E1 rem (0.123E1, ~0.27182817E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129001E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.11754944E~37) = ~0.14458581E~37 + (0.123E1, ~0.11754944E~37) = 0.123E1 - (0.123E1, ~0.11754944E~37) = 0.123E1 / (0.123E1, ~0.11754944E~37) = ~0.10463683E39 nextAfter (0.123E1, ~0.11754944E~37) = 0.12299999E1 rem (0.123E1, ~0.11754944E~37) = 0.0 * (0.123E1, ~0.5877472E~38) = ~0.722929E~38 + (0.123E1, ~0.5877472E~38) = 0.123E1 - (0.123E1, ~0.5877472E~38) = 0.123E1 / (0.123E1, ~0.5877472E~38) = ~0.20927366E39 nextAfter (0.123E1, ~0.5877472E~38) = 0.12299999E1 rem (0.123E1, ~0.5877472E~38) = 0.0 * (0.123E1, ~0.1E~44) = ~0.1E~44 + (0.123E1, ~0.1E~44) = 0.123E1 - (0.123E1, ~0.1E~44) = 0.123E1 / (0.123E1, ~0.1E~44) = ~inf nextAfter (0.123E1, ~0.1E~44) = 0.12299999E1 rem (0.123E1, ~0.1E~44) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.34028235E39) = 0.4185473E38 + (0.123, 0.34028235E39) = 0.34028235E39 - (0.123, 0.34028235E39) = ~0.34028235E39 / (0.123, 0.34028235E39) = 0.361465E~39 nextAfter (0.123, 0.34028235E39) = 0.12300001 rem (0.123, 0.34028235E39) = 0.123 * (0.123, 0.17014117E39) = 0.20927365E38 + (0.123, 0.17014117E39) = 0.17014117E39 - (0.123, 0.17014117E39) = ~0.17014117E39 / (0.123, 0.17014117E39) = 0.722928E~39 nextAfter (0.123, 0.17014117E39) = 0.12300001 rem (0.123, 0.17014117E39) = 0.123 * (0.123, 0.123E4) = 0.15129001E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.100000005E~3 nextAfter (0.123, 0.123E4) = 0.12300001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177E2 / (0.123, 0.123E2) = 0.1E~1 nextAfter (0.123, 0.123E2) = 0.12300001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.31415927E1) = 0.38641593 + (0.123, 0.31415927E1) = 0.32645926E1 - (0.123, 0.31415927E1) = ~0.30185928E1 / (0.123, 0.31415927E1) = 0.39152116E~1 nextAfter (0.123, 0.31415927E1) = 0.12300001 rem (0.123, 0.31415927E1) = 0.123 * (0.123, 0.27182817E1) = 0.33434868 + (0.123, 0.27182817E1) = 0.28412817E1 - (0.123, 0.27182817E1) = ~0.25952818E1 / (0.123, 0.27182817E1) = 0.45249175E~1 nextAfter (0.123, 0.27182817E1) = 0.12300001 rem (0.123, 0.27182817E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129001E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.124230005 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.122999996 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.11754944E~37) = 0.1445858E~38 + (0.123, 0.11754944E~37) = 0.123 - (0.123, 0.11754944E~37) = 0.123 / (0.123, 0.11754944E~37) = 0.10463683E38 nextAfter (0.123, 0.11754944E~37) = 0.122999996 rem (0.123, 0.11754944E~37) = 0.0 * (0.123, 0.5877472E~38) = 0.722928E~39 + (0.123, 0.5877472E~38) = 0.123 - (0.123, 0.5877472E~38) = 0.123 / (0.123, 0.5877472E~38) = 0.20927366E38 nextAfter (0.123, 0.5877472E~38) = 0.122999996 rem (0.123, 0.5877472E~38) = 0.0 * (0.123, 0.1E~44) = 0.0 + (0.123, 0.1E~44) = 0.123 - (0.123, 0.1E~44) = 0.123 / (0.123, 0.1E~44) = inf nextAfter (0.123, 0.1E~44) = 0.122999996 rem (0.123, 0.1E~44) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.122999996 rem (0.123, 0.0) = nan * (0.123, ~0.34028235E39) = ~0.4185473E38 + (0.123, ~0.34028235E39) = ~0.34028235E39 - (0.123, ~0.34028235E39) = 0.34028235E39 / (0.123, ~0.34028235E39) = ~0.361465E~39 nextAfter (0.123, ~0.34028235E39) = 0.122999996 rem (0.123, ~0.34028235E39) = 0.123 * (0.123, ~0.17014117E39) = ~0.20927365E38 + (0.123, ~0.17014117E39) = ~0.17014117E39 - (0.123, ~0.17014117E39) = 0.17014117E39 / (0.123, ~0.17014117E39) = ~0.722928E~39 nextAfter (0.123, ~0.17014117E39) = 0.122999996 rem (0.123, ~0.17014117E39) = 0.123 * (0.123, ~0.123E4) = ~0.15129001E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.100000005E~3 nextAfter (0.123, ~0.123E4) = 0.122999996 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129001E1 + (0.123, ~0.123E2) = ~0.12177E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.1E~1 nextAfter (0.123, ~0.123E2) = 0.122999996 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.31415927E1) = ~0.38641593 + (0.123, ~0.31415927E1) = ~0.30185928E1 - (0.123, ~0.31415927E1) = 0.32645926E1 / (0.123, ~0.31415927E1) = ~0.39152116E~1 nextAfter (0.123, ~0.31415927E1) = 0.122999996 rem (0.123, ~0.31415927E1) = 0.123 * (0.123, ~0.27182817E1) = ~0.33434868 + (0.123, ~0.27182817E1) = ~0.25952818E1 - (0.123, ~0.27182817E1) = 0.28412817E1 / (0.123, ~0.27182817E1) = ~0.45249175E~1 nextAfter (0.123, ~0.27182817E1) = 0.122999996 rem (0.123, ~0.27182817E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.122999996 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129001E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.122999996 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.124230005 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.122999996 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.11754944E~37) = ~0.1445858E~38 + (0.123, ~0.11754944E~37) = 0.123 - (0.123, ~0.11754944E~37) = 0.123 / (0.123, ~0.11754944E~37) = ~0.10463683E38 nextAfter (0.123, ~0.11754944E~37) = 0.122999996 rem (0.123, ~0.11754944E~37) = 0.0 * (0.123, ~0.5877472E~38) = ~0.722928E~39 + (0.123, ~0.5877472E~38) = 0.123 - (0.123, ~0.5877472E~38) = 0.123 / (0.123, ~0.5877472E~38) = ~0.20927366E38 nextAfter (0.123, ~0.5877472E~38) = 0.122999996 rem (0.123, ~0.5877472E~38) = 0.0 * (0.123, ~0.1E~44) = ~0.0 + (0.123, ~0.1E~44) = 0.123 - (0.123, ~0.1E~44) = 0.123 / (0.123, ~0.1E~44) = ~inf nextAfter (0.123, ~0.1E~44) = 0.122999996 rem (0.123, ~0.1E~44) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.122999996 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.122999996 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.34028235E39) = 0.4185473E36 + (0.123E~2, 0.34028235E39) = 0.34028235E39 - (0.123E~2, 0.34028235E39) = ~0.34028235E39 / (0.123E~2, 0.34028235E39) = 0.3614E~41 nextAfter (0.123E~2, 0.34028235E39) = 0.12300002E~2 rem (0.123E~2, 0.34028235E39) = 0.123E~2 * (0.123E~2, 0.17014117E39) = 0.20927364E36 + (0.123E~2, 0.17014117E39) = 0.17014117E39 - (0.123E~2, 0.17014117E39) = ~0.17014117E39 / (0.123E~2, 0.17014117E39) = 0.7229E~41 nextAfter (0.123E~2, 0.17014117E39) = 0.12300002E~2 rem (0.123E~2, 0.17014117E39) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129001E1 + (0.123E~2, 0.123E4) = 0.12300012E4 - (0.123E~2, 0.123E4) = ~0.12299988E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129001E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.1229877E2 / (0.123E~2, 0.123E2) = 0.100000005E~3 nextAfter (0.123E~2, 0.123E2) = 0.12300002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.31415927E1) = 0.38641593E~2 + (0.123E~2, 0.31415927E1) = 0.31428227E1 - (0.123E~2, 0.31415927E1) = ~0.31403627E1 / (0.123E~2, 0.31415927E1) = 0.39152117E~3 nextAfter (0.123E~2, 0.31415927E1) = 0.12300002E~2 rem (0.123E~2, 0.31415927E1) = 0.123E~2 * (0.123E~2, 0.27182817E1) = 0.33434867E~2 + (0.123E~2, 0.27182817E1) = 0.27195117E1 - (0.123E~2, 0.27182817E1) = ~0.27170517E1 / (0.123E~2, 0.27182817E1) = 0.45249175E~3 nextAfter (0.123E~2, 0.27182817E1) = 0.12300002E~2 rem (0.123E~2, 0.27182817E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129001E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.124230005 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129001E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.11754944E~37) = 0.14459E~40 + (0.123E~2, 0.11754944E~37) = 0.123E~2 - (0.123E~2, 0.11754944E~37) = 0.123E~2 / (0.123E~2, 0.11754944E~37) = 0.10463683E36 nextAfter (0.123E~2, 0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, 0.11754944E~37) = 0.0 * (0.123E~2, 0.5877472E~38) = 0.7229E~41 + (0.123E~2, 0.5877472E~38) = 0.123E~2 - (0.123E~2, 0.5877472E~38) = 0.123E~2 / (0.123E~2, 0.5877472E~38) = 0.20927366E36 nextAfter (0.123E~2, 0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, 0.5877472E~38) = 0.0 * (0.123E~2, 0.1E~44) = 0.0 + (0.123E~2, 0.1E~44) = 0.123E~2 - (0.123E~2, 0.1E~44) = 0.123E~2 / (0.123E~2, 0.1E~44) = inf nextAfter (0.123E~2, 0.1E~44) = 0.12299999E~2 rem (0.123E~2, 0.1E~44) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.34028235E39) = ~0.4185473E36 + (0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (0.123E~2, ~0.34028235E39) = 0.34028235E39 / (0.123E~2, ~0.34028235E39) = ~0.3614E~41 nextAfter (0.123E~2, ~0.34028235E39) = 0.12299999E~2 rem (0.123E~2, ~0.34028235E39) = 0.123E~2 * (0.123E~2, ~0.17014117E39) = ~0.20927364E36 + (0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (0.123E~2, ~0.17014117E39) = 0.17014117E39 / (0.123E~2, ~0.17014117E39) = ~0.7229E~41 nextAfter (0.123E~2, ~0.17014117E39) = 0.12299999E~2 rem (0.123E~2, ~0.17014117E39) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129001E1 + (0.123E~2, ~0.123E4) = ~0.12299988E4 - (0.123E~2, ~0.123E4) = 0.12300012E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129001E~1 + (0.123E~2, ~0.123E2) = ~0.1229877E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.100000005E~3 nextAfter (0.123E~2, ~0.123E2) = 0.12299999E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.31415927E1) = ~0.38641593E~2 + (0.123E~2, ~0.31415927E1) = ~0.31403627E1 - (0.123E~2, ~0.31415927E1) = 0.31428227E1 / (0.123E~2, ~0.31415927E1) = ~0.39152117E~3 nextAfter (0.123E~2, ~0.31415927E1) = 0.12299999E~2 rem (0.123E~2, ~0.31415927E1) = 0.123E~2 * (0.123E~2, ~0.27182817E1) = ~0.33434867E~2 + (0.123E~2, ~0.27182817E1) = ~0.27170517E1 - (0.123E~2, ~0.27182817E1) = 0.27195117E1 / (0.123E~2, ~0.27182817E1) = ~0.45249175E~3 nextAfter (0.123E~2, ~0.27182817E1) = 0.12299999E~2 rem (0.123E~2, ~0.27182817E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129001E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.124230005 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129001E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.11754944E~37) = ~0.14459E~40 + (0.123E~2, ~0.11754944E~37) = 0.123E~2 - (0.123E~2, ~0.11754944E~37) = 0.123E~2 / (0.123E~2, ~0.11754944E~37) = ~0.10463683E36 nextAfter (0.123E~2, ~0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, ~0.11754944E~37) = 0.0 * (0.123E~2, ~0.5877472E~38) = ~0.7229E~41 + (0.123E~2, ~0.5877472E~38) = 0.123E~2 - (0.123E~2, ~0.5877472E~38) = 0.123E~2 / (0.123E~2, ~0.5877472E~38) = ~0.20927366E36 nextAfter (0.123E~2, ~0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, ~0.5877472E~38) = 0.0 * (0.123E~2, ~0.1E~44) = ~0.0 + (0.123E~2, ~0.1E~44) = 0.123E~2 - (0.123E~2, ~0.1E~44) = 0.123E~2 / (0.123E~2, ~0.1E~44) = ~inf nextAfter (0.123E~2, ~0.1E~44) = 0.12299999E~2 rem (0.123E~2, ~0.1E~44) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.11754944E~37, 0.34028235E39) = 0.39999998E1 + (0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (0.11754944E~37, 0.34028235E39) = 0.0 nextAfter (0.11754944E~37, 0.34028235E39) = 0.11754945E~37 rem (0.11754944E~37, 0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, 0.17014117E39) = 0.19999999E1 + (0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (0.11754944E~37, 0.17014117E39) = 0.0 nextAfter (0.11754944E~37, 0.17014117E39) = 0.11754945E~37 rem (0.11754944E~37, 0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, 0.123E4) = 0.1445858E~34 + (0.11754944E~37, 0.123E4) = 0.123E4 - (0.11754944E~37, 0.123E4) = ~0.123E4 / (0.11754944E~37, 0.123E4) = 0.9557E~41 nextAfter (0.11754944E~37, 0.123E4) = 0.11754945E~37 rem (0.11754944E~37, 0.123E4) = 0.11754944E~37 * (0.11754944E~37, 0.123E2) = 0.14458581E~36 + (0.11754944E~37, 0.123E2) = 0.123E2 - (0.11754944E~37, 0.123E2) = ~0.123E2 / (0.11754944E~37, 0.123E2) = 0.955687E~39 nextAfter (0.11754944E~37, 0.123E2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E2) = 0.11754944E~37 * (0.11754944E~37, 0.31415927E1) = 0.36929245E~37 + (0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (0.11754944E~37, 0.31415927E1) = 0.3741715E~38 nextAfter (0.11754944E~37, 0.31415927E1) = 0.11754945E~37 rem (0.11754944E~37, 0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, 0.27182817E1) = 0.31953248E~37 + (0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (0.11754944E~37, 0.27182817E1) = 0.4324403E~38 nextAfter (0.11754944E~37, 0.27182817E1) = 0.11754945E~37 rem (0.11754944E~37, 0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, 0.123E1) = 0.14458581E~37 + (0.11754944E~37, 0.123E1) = 0.123E1 - (0.11754944E~37, 0.123E1) = ~0.123E1 / (0.11754944E~37, 0.123E1) = 0.9556864E~38 nextAfter (0.11754944E~37, 0.123E1) = 0.11754945E~37 rem (0.11754944E~37, 0.123E1) = 0.11754944E~37 * (0.11754944E~37, 0.123) = 0.1445858E~38 + (0.11754944E~37, 0.123) = 0.123 - (0.11754944E~37, 0.123) = ~0.123 / (0.11754944E~37, 0.123) = 0.9556864E~37 nextAfter (0.11754944E~37, 0.123) = 0.11754945E~37 rem (0.11754944E~37, 0.123) = 0.11754944E~37 * (0.11754944E~37, 0.123E~2) = 0.14459E~40 + (0.11754944E~37, 0.123E~2) = 0.123E~2 - (0.11754944E~37, 0.123E~2) = ~0.123E~2 / (0.11754944E~37, 0.123E~2) = 0.95568645E~35 nextAfter (0.11754944E~37, 0.123E~2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E~2) = 0.11754944E~37 * (0.11754944E~37, 0.11754944E~37) = 0.0 + (0.11754944E~37, 0.11754944E~37) = 0.23509887E~37 - (0.11754944E~37, 0.11754944E~37) = 0.0 / (0.11754944E~37, 0.11754944E~37) = 0.1E1 nextAfter (0.11754944E~37, 0.11754944E~37) = 0.11754944E~37 rem (0.11754944E~37, 0.11754944E~37) = 0.0 * (0.11754944E~37, 0.5877472E~38) = 0.0 + (0.11754944E~37, 0.5877472E~38) = 0.17632415E~37 - (0.11754944E~37, 0.5877472E~38) = 0.5877472E~38 / (0.11754944E~37, 0.5877472E~38) = 0.2E1 nextAfter (0.11754944E~37, 0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, 0.5877472E~38) = 0.0 * (0.11754944E~37, 0.1E~44) = 0.0 + (0.11754944E~37, 0.1E~44) = 0.11754945E~37 - (0.11754944E~37, 0.1E~44) = 0.11754942E~37 / (0.11754944E~37, 0.1E~44) = 0.8388608E7 nextAfter (0.11754944E~37, 0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, 0.1E~44) = 0.0 * (0.11754944E~37, 0.0) = 0.0 + (0.11754944E~37, 0.0) = 0.11754944E~37 - (0.11754944E~37, 0.0) = 0.11754944E~37 / (0.11754944E~37, 0.0) = inf nextAfter (0.11754944E~37, 0.0) = 0.11754942E~37 rem (0.11754944E~37, 0.0) = nan * (0.11754944E~37, ~0.34028235E39) = ~0.39999998E1 + (0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (0.11754944E~37, ~0.34028235E39) = ~0.0 nextAfter (0.11754944E~37, ~0.34028235E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, ~0.17014117E39) = ~0.19999999E1 + (0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (0.11754944E~37, ~0.17014117E39) = ~0.0 nextAfter (0.11754944E~37, ~0.17014117E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, ~0.123E4) = ~0.1445858E~34 + (0.11754944E~37, ~0.123E4) = ~0.123E4 - (0.11754944E~37, ~0.123E4) = 0.123E4 / (0.11754944E~37, ~0.123E4) = ~0.9557E~41 nextAfter (0.11754944E~37, ~0.123E4) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E4) = 0.11754944E~37 * (0.11754944E~37, ~0.123E2) = ~0.14458581E~36 + (0.11754944E~37, ~0.123E2) = ~0.123E2 - (0.11754944E~37, ~0.123E2) = 0.123E2 / (0.11754944E~37, ~0.123E2) = ~0.955687E~39 nextAfter (0.11754944E~37, ~0.123E2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E2) = 0.11754944E~37 * (0.11754944E~37, ~0.31415927E1) = ~0.36929245E~37 + (0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (0.11754944E~37, ~0.31415927E1) = ~0.3741715E~38 nextAfter (0.11754944E~37, ~0.31415927E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, ~0.27182817E1) = ~0.31953248E~37 + (0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (0.11754944E~37, ~0.27182817E1) = ~0.4324403E~38 nextAfter (0.11754944E~37, ~0.27182817E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123E1) = ~0.14458581E~37 + (0.11754944E~37, ~0.123E1) = ~0.123E1 - (0.11754944E~37, ~0.123E1) = 0.123E1 / (0.11754944E~37, ~0.123E1) = ~0.9556864E~38 nextAfter (0.11754944E~37, ~0.123E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123) = ~0.1445858E~38 + (0.11754944E~37, ~0.123) = ~0.123 - (0.11754944E~37, ~0.123) = 0.123 / (0.11754944E~37, ~0.123) = ~0.9556864E~37 nextAfter (0.11754944E~37, ~0.123) = 0.11754942E~37 rem (0.11754944E~37, ~0.123) = 0.11754944E~37 * (0.11754944E~37, ~0.123E~2) = ~0.14459E~40 + (0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (0.11754944E~37, ~0.123E~2) = 0.123E~2 / (0.11754944E~37, ~0.123E~2) = ~0.95568645E~35 nextAfter (0.11754944E~37, ~0.123E~2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E~2) = 0.11754944E~37 * (0.11754944E~37, ~0.11754944E~37) = ~0.0 + (0.11754944E~37, ~0.11754944E~37) = 0.0 - (0.11754944E~37, ~0.11754944E~37) = 0.23509887E~37 / (0.11754944E~37, ~0.11754944E~37) = ~0.1E1 nextAfter (0.11754944E~37, ~0.11754944E~37) = 0.11754942E~37 rem (0.11754944E~37, ~0.11754944E~37) = 0.0 * (0.11754944E~37, ~0.5877472E~38) = ~0.0 + (0.11754944E~37, ~0.5877472E~38) = 0.5877472E~38 - (0.11754944E~37, ~0.5877472E~38) = 0.17632415E~37 / (0.11754944E~37, ~0.5877472E~38) = ~0.2E1 nextAfter (0.11754944E~37, ~0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, ~0.5877472E~38) = 0.0 * (0.11754944E~37, ~0.1E~44) = ~0.0 + (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 - (0.11754944E~37, ~0.1E~44) = 0.11754945E~37 / (0.11754944E~37, ~0.1E~44) = ~0.8388608E7 nextAfter (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, ~0.1E~44) = 0.0 * (0.11754944E~37, ~0.0) = ~0.0 + (0.11754944E~37, ~0.0) = 0.11754944E~37 - (0.11754944E~37, ~0.0) = 0.11754944E~37 / (0.11754944E~37, ~0.0) = ~inf nextAfter (0.11754944E~37, ~0.0) = 0.11754942E~37 rem (0.11754944E~37, ~0.0) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.11754944E~37, ~inf) = ~inf + (0.11754944E~37, ~inf) = ~inf - (0.11754944E~37, ~inf) = inf / (0.11754944E~37, ~inf) = ~0.0 nextAfter (0.11754944E~37, ~inf) = 0.11754942E~37 rem (0.11754944E~37, ~inf) = 0.11754944E~37 * (0.11754944E~37, nan) = nan + (0.11754944E~37, nan) = nan - (0.11754944E~37, nan) = nan / (0.11754944E~37, nan) = nan nextAfter (0.11754944E~37, nan) = nan rem (0.11754944E~37, nan) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.5877472E~38, 0.34028235E39) = 0.19999999E1 + (0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (0.5877472E~38, 0.34028235E39) = 0.0 nextAfter (0.5877472E~38, 0.34028235E39) = 0.5877473E~38 rem (0.5877472E~38, 0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, 0.17014117E39) = 0.99999994 + (0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (0.5877472E~38, 0.17014117E39) = 0.0 nextAfter (0.5877472E~38, 0.17014117E39) = 0.5877473E~38 rem (0.5877472E~38, 0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, 0.123E4) = 0.722929E~35 + (0.5877472E~38, 0.123E4) = 0.123E4 - (0.5877472E~38, 0.123E4) = ~0.123E4 / (0.5877472E~38, 0.123E4) = 0.4778E~41 nextAfter (0.5877472E~38, 0.123E4) = 0.5877473E~38 rem (0.5877472E~38, 0.123E4) = 0.5877472E~38 * (0.5877472E~38, 0.123E2) = 0.72292904E~37 + (0.5877472E~38, 0.123E2) = 0.123E2 - (0.5877472E~38, 0.123E2) = ~0.123E2 / (0.5877472E~38, 0.123E2) = 0.477843E~39 nextAfter (0.5877472E~38, 0.123E2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E2) = 0.5877472E~38 * (0.5877472E~38, 0.31415927E1) = 0.18464623E~37 + (0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (0.5877472E~38, 0.31415927E1) = 0.1870857E~38 nextAfter (0.5877472E~38, 0.31415927E1) = 0.5877473E~38 rem (0.5877472E~38, 0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, 0.27182817E1) = 0.15976624E~37 + (0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (0.5877472E~38, 0.27182817E1) = 0.2162201E~38 nextAfter (0.5877472E~38, 0.27182817E1) = 0.5877473E~38 rem (0.5877472E~38, 0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, 0.123E1) = 0.722929E~38 + (0.5877472E~38, 0.123E1) = 0.123E1 - (0.5877472E~38, 0.123E1) = ~0.123E1 / (0.5877472E~38, 0.123E1) = 0.4778432E~38 nextAfter (0.5877472E~38, 0.123E1) = 0.5877473E~38 rem (0.5877472E~38, 0.123E1) = 0.5877472E~38 * (0.5877472E~38, 0.123) = 0.722928E~39 + (0.5877472E~38, 0.123) = 0.123 - (0.5877472E~38, 0.123) = ~0.123 / (0.5877472E~38, 0.123) = 0.4778432E~37 nextAfter (0.5877472E~38, 0.123) = 0.5877473E~38 rem (0.5877472E~38, 0.123) = 0.5877472E~38 * (0.5877472E~38, 0.123E~2) = 0.7229E~41 + (0.5877472E~38, 0.123E~2) = 0.123E~2 - (0.5877472E~38, 0.123E~2) = ~0.123E~2 / (0.5877472E~38, 0.123E~2) = 0.47784322E~35 nextAfter (0.5877472E~38, 0.123E~2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E~2) = 0.5877472E~38 * (0.5877472E~38, 0.11754944E~37) = 0.0 + (0.5877472E~38, 0.11754944E~37) = 0.17632415E~37 - (0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 / (0.5877472E~38, 0.11754944E~37) = 0.5 nextAfter (0.5877472E~38, 0.11754944E~37) = 0.5877473E~38 rem (0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, 0.5877472E~38) = 0.0 + (0.5877472E~38, 0.5877472E~38) = 0.11754944E~37 - (0.5877472E~38, 0.5877472E~38) = 0.0 / (0.5877472E~38, 0.5877472E~38) = 0.1E1 nextAfter (0.5877472E~38, 0.5877472E~38) = 0.5877472E~38 rem (0.5877472E~38, 0.5877472E~38) = 0.0 * (0.5877472E~38, 0.1E~44) = 0.0 + (0.5877472E~38, 0.1E~44) = 0.5877473E~38 - (0.5877472E~38, 0.1E~44) = 0.587747E~38 / (0.5877472E~38, 0.1E~44) = 0.4194304E7 nextAfter (0.5877472E~38, 0.1E~44) = 0.587747E~38 rem (0.5877472E~38, 0.1E~44) = 0.0 * (0.5877472E~38, 0.0) = 0.0 + (0.5877472E~38, 0.0) = 0.5877472E~38 - (0.5877472E~38, 0.0) = 0.5877472E~38 / (0.5877472E~38, 0.0) = inf nextAfter (0.5877472E~38, 0.0) = 0.587747E~38 rem (0.5877472E~38, 0.0) = nan * (0.5877472E~38, ~0.34028235E39) = ~0.19999999E1 + (0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (0.5877472E~38, ~0.34028235E39) = ~0.0 nextAfter (0.5877472E~38, ~0.34028235E39) = 0.587747E~38 rem (0.5877472E~38, ~0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, ~0.17014117E39) = ~0.99999994 + (0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (0.5877472E~38, ~0.17014117E39) = ~0.0 nextAfter (0.5877472E~38, ~0.17014117E39) = 0.587747E~38 rem (0.5877472E~38, ~0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, ~0.123E4) = ~0.722929E~35 + (0.5877472E~38, ~0.123E4) = ~0.123E4 - (0.5877472E~38, ~0.123E4) = 0.123E4 / (0.5877472E~38, ~0.123E4) = ~0.4778E~41 nextAfter (0.5877472E~38, ~0.123E4) = 0.587747E~38 rem (0.5877472E~38, ~0.123E4) = 0.5877472E~38 * (0.5877472E~38, ~0.123E2) = ~0.72292904E~37 + (0.5877472E~38, ~0.123E2) = ~0.123E2 - (0.5877472E~38, ~0.123E2) = 0.123E2 / (0.5877472E~38, ~0.123E2) = ~0.477843E~39 nextAfter (0.5877472E~38, ~0.123E2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E2) = 0.5877472E~38 * (0.5877472E~38, ~0.31415927E1) = ~0.18464623E~37 + (0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (0.5877472E~38, ~0.31415927E1) = ~0.1870857E~38 nextAfter (0.5877472E~38, ~0.31415927E1) = 0.587747E~38 rem (0.5877472E~38, ~0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, ~0.27182817E1) = ~0.15976624E~37 + (0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (0.5877472E~38, ~0.27182817E1) = ~0.2162201E~38 nextAfter (0.5877472E~38, ~0.27182817E1) = 0.587747E~38 rem (0.5877472E~38, ~0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123E1) = ~0.722929E~38 + (0.5877472E~38, ~0.123E1) = ~0.123E1 - (0.5877472E~38, ~0.123E1) = 0.123E1 / (0.5877472E~38, ~0.123E1) = ~0.4778432E~38 nextAfter (0.5877472E~38, ~0.123E1) = 0.587747E~38 rem (0.5877472E~38, ~0.123E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123) = ~0.722928E~39 + (0.5877472E~38, ~0.123) = ~0.123 - (0.5877472E~38, ~0.123) = 0.123 / (0.5877472E~38, ~0.123) = ~0.4778432E~37 nextAfter (0.5877472E~38, ~0.123) = 0.587747E~38 rem (0.5877472E~38, ~0.123) = 0.5877472E~38 * (0.5877472E~38, ~0.123E~2) = ~0.7229E~41 + (0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (0.5877472E~38, ~0.123E~2) = 0.123E~2 / (0.5877472E~38, ~0.123E~2) = ~0.47784322E~35 nextAfter (0.5877472E~38, ~0.123E~2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E~2) = 0.5877472E~38 * (0.5877472E~38, ~0.11754944E~37) = ~0.0 + (0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 - (0.5877472E~38, ~0.11754944E~37) = 0.17632415E~37 / (0.5877472E~38, ~0.11754944E~37) = ~0.5 nextAfter (0.5877472E~38, ~0.11754944E~37) = 0.587747E~38 rem (0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, ~0.5877472E~38) = ~0.0 + (0.5877472E~38, ~0.5877472E~38) = 0.0 - (0.5877472E~38, ~0.5877472E~38) = 0.11754944E~37 / (0.5877472E~38, ~0.5877472E~38) = ~0.1E1 nextAfter (0.5877472E~38, ~0.5877472E~38) = 0.587747E~38 rem (0.5877472E~38, ~0.5877472E~38) = 0.0 * (0.5877472E~38, ~0.1E~44) = ~0.0 + (0.5877472E~38, ~0.1E~44) = 0.587747E~38 - (0.5877472E~38, ~0.1E~44) = 0.5877473E~38 / (0.5877472E~38, ~0.1E~44) = ~0.4194304E7 nextAfter (0.5877472E~38, ~0.1E~44) = 0.587747E~38 rem (0.5877472E~38, ~0.1E~44) = 0.0 * (0.5877472E~38, ~0.0) = ~0.0 + (0.5877472E~38, ~0.0) = 0.5877472E~38 - (0.5877472E~38, ~0.0) = 0.5877472E~38 / (0.5877472E~38, ~0.0) = ~inf nextAfter (0.5877472E~38, ~0.0) = 0.587747E~38 rem (0.5877472E~38, ~0.0) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.5877472E~38, ~inf) = ~inf + (0.5877472E~38, ~inf) = ~inf - (0.5877472E~38, ~inf) = inf / (0.5877472E~38, ~inf) = ~0.0 nextAfter (0.5877472E~38, ~inf) = 0.587747E~38 rem (0.5877472E~38, ~inf) = 0.5877472E~38 * (0.5877472E~38, nan) = nan + (0.5877472E~38, nan) = nan - (0.5877472E~38, nan) = nan / (0.5877472E~38, nan) = nan nextAfter (0.5877472E~38, nan) = nan rem (0.5877472E~38, nan) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.1E~44, 0.34028235E39) = 0.47683713E~6 + (0.1E~44, 0.34028235E39) = 0.34028235E39 - (0.1E~44, 0.34028235E39) = ~0.34028235E39 / (0.1E~44, 0.34028235E39) = 0.0 nextAfter (0.1E~44, 0.34028235E39) = 0.3E~44 rem (0.1E~44, 0.34028235E39) = 0.1E~44 * (0.1E~44, 0.17014117E39) = 0.23841856E~6 + (0.1E~44, 0.17014117E39) = 0.17014117E39 - (0.1E~44, 0.17014117E39) = ~0.17014117E39 / (0.1E~44, 0.17014117E39) = 0.0 nextAfter (0.1E~44, 0.17014117E39) = 0.3E~44 rem (0.1E~44, 0.17014117E39) = 0.1E~44 * (0.1E~44, 0.123E4) = 0.1724E~41 + (0.1E~44, 0.123E4) = 0.123E4 - (0.1E~44, 0.123E4) = ~0.123E4 / (0.1E~44, 0.123E4) = 0.0 nextAfter (0.1E~44, 0.123E4) = 0.3E~44 rem (0.1E~44, 0.123E4) = 0.1E~44 * (0.1E~44, 0.123E2) = 0.17E~43 + (0.1E~44, 0.123E2) = 0.123E2 - (0.1E~44, 0.123E2) = ~0.123E2 / (0.1E~44, 0.123E2) = 0.0 nextAfter (0.1E~44, 0.123E2) = 0.3E~44 rem (0.1E~44, 0.123E2) = 0.1E~44 * (0.1E~44, 0.31415927E1) = 0.4E~44 + (0.1E~44, 0.31415927E1) = 0.31415927E1 - (0.1E~44, 0.31415927E1) = ~0.31415927E1 / (0.1E~44, 0.31415927E1) = 0.0 nextAfter (0.1E~44, 0.31415927E1) = 0.3E~44 rem (0.1E~44, 0.31415927E1) = 0.1E~44 * (0.1E~44, 0.27182817E1) = 0.4E~44 + (0.1E~44, 0.27182817E1) = 0.27182817E1 - (0.1E~44, 0.27182817E1) = ~0.27182817E1 / (0.1E~44, 0.27182817E1) = 0.0 nextAfter (0.1E~44, 0.27182817E1) = 0.3E~44 rem (0.1E~44, 0.27182817E1) = 0.1E~44 * (0.1E~44, 0.123E1) = 0.1E~44 + (0.1E~44, 0.123E1) = 0.123E1 - (0.1E~44, 0.123E1) = ~0.123E1 / (0.1E~44, 0.123E1) = 0.1E~44 nextAfter (0.1E~44, 0.123E1) = 0.3E~44 rem (0.1E~44, 0.123E1) = 0.1E~44 * (0.1E~44, 0.123) = 0.0 + (0.1E~44, 0.123) = 0.123 - (0.1E~44, 0.123) = ~0.123 / (0.1E~44, 0.123) = 0.11E~43 nextAfter (0.1E~44, 0.123) = 0.3E~44 rem (0.1E~44, 0.123) = 0.1E~44 * (0.1E~44, 0.123E~2) = 0.0 + (0.1E~44, 0.123E~2) = 0.123E~2 - (0.1E~44, 0.123E~2) = ~0.123E~2 / (0.1E~44, 0.123E~2) = 0.1139E~41 nextAfter (0.1E~44, 0.123E~2) = 0.3E~44 rem (0.1E~44, 0.123E~2) = 0.1E~44 * (0.1E~44, 0.11754944E~37) = 0.0 + (0.1E~44, 0.11754944E~37) = 0.11754945E~37 - (0.1E~44, 0.11754944E~37) = ~0.11754942E~37 / (0.1E~44, 0.11754944E~37) = 0.11920929E~6 nextAfter (0.1E~44, 0.11754944E~37) = 0.3E~44 rem (0.1E~44, 0.11754944E~37) = 0.1E~44 * (0.1E~44, 0.5877472E~38) = 0.0 + (0.1E~44, 0.5877472E~38) = 0.5877473E~38 - (0.1E~44, 0.5877472E~38) = ~0.587747E~38 / (0.1E~44, 0.5877472E~38) = 0.23841858E~6 nextAfter (0.1E~44, 0.5877472E~38) = 0.3E~44 rem (0.1E~44, 0.5877472E~38) = 0.1E~44 * (0.1E~44, 0.1E~44) = 0.0 + (0.1E~44, 0.1E~44) = 0.3E~44 - (0.1E~44, 0.1E~44) = 0.0 / (0.1E~44, 0.1E~44) = 0.1E1 nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 rem (0.1E~44, 0.1E~44) = 0.0 * (0.1E~44, 0.0) = 0.0 + (0.1E~44, 0.0) = 0.1E~44 - (0.1E~44, 0.0) = 0.1E~44 / (0.1E~44, 0.0) = inf nextAfter (0.1E~44, 0.0) = 0.0 rem (0.1E~44, 0.0) = nan * (0.1E~44, ~0.34028235E39) = ~0.47683713E~6 + (0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (0.1E~44, ~0.34028235E39) = 0.34028235E39 / (0.1E~44, ~0.34028235E39) = ~0.0 nextAfter (0.1E~44, ~0.34028235E39) = 0.0 rem (0.1E~44, ~0.34028235E39) = 0.1E~44 * (0.1E~44, ~0.17014117E39) = ~0.23841856E~6 + (0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (0.1E~44, ~0.17014117E39) = 0.17014117E39 / (0.1E~44, ~0.17014117E39) = ~0.0 nextAfter (0.1E~44, ~0.17014117E39) = 0.0 rem (0.1E~44, ~0.17014117E39) = 0.1E~44 * (0.1E~44, ~0.123E4) = ~0.1724E~41 + (0.1E~44, ~0.123E4) = ~0.123E4 - (0.1E~44, ~0.123E4) = 0.123E4 / (0.1E~44, ~0.123E4) = ~0.0 nextAfter (0.1E~44, ~0.123E4) = 0.0 rem (0.1E~44, ~0.123E4) = 0.1E~44 * (0.1E~44, ~0.123E2) = ~0.17E~43 + (0.1E~44, ~0.123E2) = ~0.123E2 - (0.1E~44, ~0.123E2) = 0.123E2 / (0.1E~44, ~0.123E2) = ~0.0 nextAfter (0.1E~44, ~0.123E2) = 0.0 rem (0.1E~44, ~0.123E2) = 0.1E~44 * (0.1E~44, ~0.31415927E1) = ~0.4E~44 + (0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (0.1E~44, ~0.31415927E1) = 0.31415927E1 / (0.1E~44, ~0.31415927E1) = ~0.0 nextAfter (0.1E~44, ~0.31415927E1) = 0.0 rem (0.1E~44, ~0.31415927E1) = 0.1E~44 * (0.1E~44, ~0.27182817E1) = ~0.4E~44 + (0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (0.1E~44, ~0.27182817E1) = 0.27182817E1 / (0.1E~44, ~0.27182817E1) = ~0.0 nextAfter (0.1E~44, ~0.27182817E1) = 0.0 rem (0.1E~44, ~0.27182817E1) = 0.1E~44 * (0.1E~44, ~0.123E1) = ~0.1E~44 + (0.1E~44, ~0.123E1) = ~0.123E1 - (0.1E~44, ~0.123E1) = 0.123E1 / (0.1E~44, ~0.123E1) = ~0.1E~44 nextAfter (0.1E~44, ~0.123E1) = 0.0 rem (0.1E~44, ~0.123E1) = 0.1E~44 * (0.1E~44, ~0.123) = ~0.0 + (0.1E~44, ~0.123) = ~0.123 - (0.1E~44, ~0.123) = 0.123 / (0.1E~44, ~0.123) = ~0.11E~43 nextAfter (0.1E~44, ~0.123) = 0.0 rem (0.1E~44, ~0.123) = 0.1E~44 * (0.1E~44, ~0.123E~2) = ~0.0 + (0.1E~44, ~0.123E~2) = ~0.123E~2 - (0.1E~44, ~0.123E~2) = 0.123E~2 / (0.1E~44, ~0.123E~2) = ~0.1139E~41 nextAfter (0.1E~44, ~0.123E~2) = 0.0 rem (0.1E~44, ~0.123E~2) = 0.1E~44 * (0.1E~44, ~0.11754944E~37) = ~0.0 + (0.1E~44, ~0.11754944E~37) = ~0.11754942E~37 - (0.1E~44, ~0.11754944E~37) = 0.11754945E~37 / (0.1E~44, ~0.11754944E~37) = ~0.11920929E~6 nextAfter (0.1E~44, ~0.11754944E~37) = 0.0 rem (0.1E~44, ~0.11754944E~37) = 0.1E~44 * (0.1E~44, ~0.5877472E~38) = ~0.0 + (0.1E~44, ~0.5877472E~38) = ~0.587747E~38 - (0.1E~44, ~0.5877472E~38) = 0.5877473E~38 / (0.1E~44, ~0.5877472E~38) = ~0.23841858E~6 nextAfter (0.1E~44, ~0.5877472E~38) = 0.0 rem (0.1E~44, ~0.5877472E~38) = 0.1E~44 * (0.1E~44, ~0.1E~44) = ~0.0 + (0.1E~44, ~0.1E~44) = 0.0 - (0.1E~44, ~0.1E~44) = 0.3E~44 / (0.1E~44, ~0.1E~44) = ~0.1E1 nextAfter (0.1E~44, ~0.1E~44) = 0.0 rem (0.1E~44, ~0.1E~44) = 0.0 * (0.1E~44, ~0.0) = ~0.0 + (0.1E~44, ~0.0) = 0.1E~44 - (0.1E~44, ~0.0) = 0.1E~44 / (0.1E~44, ~0.0) = ~inf nextAfter (0.1E~44, ~0.0) = 0.0 rem (0.1E~44, ~0.0) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.1E~44, ~inf) = ~inf + (0.1E~44, ~inf) = ~inf - (0.1E~44, ~inf) = inf / (0.1E~44, ~inf) = ~0.0 nextAfter (0.1E~44, ~inf) = 0.0 rem (0.1E~44, ~inf) = 0.1E~44 * (0.1E~44, nan) = nan + (0.1E~44, nan) = nan - (0.1E~44, nan) = nan / (0.1E~44, nan) = nan nextAfter (0.1E~44, nan) = nan rem (0.1E~44, nan) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.0, 0.34028235E39) = 0.0 + (0.0, 0.34028235E39) = 0.34028235E39 - (0.0, 0.34028235E39) = ~0.34028235E39 / (0.0, 0.34028235E39) = 0.0 nextAfter (0.0, 0.34028235E39) = 0.1E~44 rem (0.0, 0.34028235E39) = 0.0 * (0.0, 0.17014117E39) = 0.0 + (0.0, 0.17014117E39) = 0.17014117E39 - (0.0, 0.17014117E39) = ~0.17014117E39 / (0.0, 0.17014117E39) = 0.0 nextAfter (0.0, 0.17014117E39) = 0.1E~44 rem (0.0, 0.17014117E39) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.1E~44 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.1E~44 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.31415927E1) = 0.0 + (0.0, 0.31415927E1) = 0.31415927E1 - (0.0, 0.31415927E1) = ~0.31415927E1 / (0.0, 0.31415927E1) = 0.0 nextAfter (0.0, 0.31415927E1) = 0.1E~44 rem (0.0, 0.31415927E1) = 0.0 * (0.0, 0.27182817E1) = 0.0 + (0.0, 0.27182817E1) = 0.27182817E1 - (0.0, 0.27182817E1) = ~0.27182817E1 / (0.0, 0.27182817E1) = 0.0 nextAfter (0.0, 0.27182817E1) = 0.1E~44 rem (0.0, 0.27182817E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.1E~44 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.1E~44 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.1E~44 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.11754944E~37) = 0.0 + (0.0, 0.11754944E~37) = 0.11754944E~37 - (0.0, 0.11754944E~37) = ~0.11754944E~37 / (0.0, 0.11754944E~37) = 0.0 nextAfter (0.0, 0.11754944E~37) = 0.1E~44 rem (0.0, 0.11754944E~37) = 0.0 * (0.0, 0.5877472E~38) = 0.0 + (0.0, 0.5877472E~38) = 0.5877472E~38 - (0.0, 0.5877472E~38) = ~0.5877472E~38 / (0.0, 0.5877472E~38) = 0.0 nextAfter (0.0, 0.5877472E~38) = 0.1E~44 rem (0.0, 0.5877472E~38) = 0.0 * (0.0, 0.1E~44) = 0.0 + (0.0, 0.1E~44) = 0.1E~44 - (0.0, 0.1E~44) = ~0.1E~44 / (0.0, 0.1E~44) = 0.0 nextAfter (0.0, 0.1E~44) = 0.1E~44 rem (0.0, 0.1E~44) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.34028235E39) = ~0.0 + (0.0, ~0.34028235E39) = ~0.34028235E39 - (0.0, ~0.34028235E39) = 0.34028235E39 / (0.0, ~0.34028235E39) = ~0.0 nextAfter (0.0, ~0.34028235E39) = ~0.1E~44 rem (0.0, ~0.34028235E39) = 0.0 * (0.0, ~0.17014117E39) = ~0.0 + (0.0, ~0.17014117E39) = ~0.17014117E39 - (0.0, ~0.17014117E39) = 0.17014117E39 / (0.0, ~0.17014117E39) = ~0.0 nextAfter (0.0, ~0.17014117E39) = ~0.1E~44 rem (0.0, ~0.17014117E39) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.1E~44 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.1E~44 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.31415927E1) = ~0.0 + (0.0, ~0.31415927E1) = ~0.31415927E1 - (0.0, ~0.31415927E1) = 0.31415927E1 / (0.0, ~0.31415927E1) = ~0.0 nextAfter (0.0, ~0.31415927E1) = ~0.1E~44 rem (0.0, ~0.31415927E1) = 0.0 * (0.0, ~0.27182817E1) = ~0.0 + (0.0, ~0.27182817E1) = ~0.27182817E1 - (0.0, ~0.27182817E1) = 0.27182817E1 / (0.0, ~0.27182817E1) = ~0.0 nextAfter (0.0, ~0.27182817E1) = ~0.1E~44 rem (0.0, ~0.27182817E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.1E~44 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.1E~44 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.1E~44 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.11754944E~37) = ~0.0 + (0.0, ~0.11754944E~37) = ~0.11754944E~37 - (0.0, ~0.11754944E~37) = 0.11754944E~37 / (0.0, ~0.11754944E~37) = ~0.0 nextAfter (0.0, ~0.11754944E~37) = ~0.1E~44 rem (0.0, ~0.11754944E~37) = 0.0 * (0.0, ~0.5877472E~38) = ~0.0 + (0.0, ~0.5877472E~38) = ~0.5877472E~38 - (0.0, ~0.5877472E~38) = 0.5877472E~38 / (0.0, ~0.5877472E~38) = ~0.0 nextAfter (0.0, ~0.5877472E~38) = ~0.1E~44 rem (0.0, ~0.5877472E~38) = 0.0 * (0.0, ~0.1E~44) = ~0.0 + (0.0, ~0.1E~44) = ~0.1E~44 - (0.0, ~0.1E~44) = 0.1E~44 / (0.0, ~0.1E~44) = ~0.0 nextAfter (0.0, ~0.1E~44) = ~0.1E~44 rem (0.0, ~0.1E~44) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.1E~44 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (~0.34028235E39, 0.34028235E39) = ~inf + (~0.34028235E39, 0.34028235E39) = 0.0 - (~0.34028235E39, 0.34028235E39) = ~inf / (~0.34028235E39, 0.34028235E39) = ~0.1E1 nextAfter (~0.34028235E39, 0.34028235E39) = ~0.34028233E39 rem (~0.34028235E39, 0.34028235E39) = 0.0 * (~0.34028235E39, 0.17014117E39) = ~inf + (~0.34028235E39, 0.17014117E39) = ~0.17014117E39 - (~0.34028235E39, 0.17014117E39) = ~inf / (~0.34028235E39, 0.17014117E39) = ~0.2E1 nextAfter (~0.34028235E39, 0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, 0.17014117E39) = 0.0 * (~0.34028235E39, 0.123E4) = ~inf + (~0.34028235E39, 0.123E4) = ~0.34028235E39 - (~0.34028235E39, 0.123E4) = ~0.34028235E39 / (~0.34028235E39, 0.123E4) = ~0.2766523E36 nextAfter (~0.34028235E39, 0.123E4) = ~0.34028233E39 rem (~0.34028235E39, 0.123E4) = ~0.2028241E32 * (~0.34028235E39, 0.123E2) = ~inf + (~0.34028235E39, 0.123E2) = ~0.34028235E39 - (~0.34028235E39, 0.123E2) = ~0.34028235E39 / (~0.34028235E39, 0.123E2) = ~0.27665232E38 nextAfter (~0.34028235E39, 0.123E2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E2) = inf * (~0.34028235E39, 0.31415927E1) = ~inf + (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, 0.31415927E1) = ~0.10831523E39 nextAfter (~0.34028235E39, 0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, 0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, 0.27182817E1) = ~inf + (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, 0.27182817E1) = ~0.12518288E39 nextAfter (~0.34028235E39, 0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, 0.27182817E1) = 0.0 * (~0.34028235E39, 0.123E1) = ~inf + (~0.34028235E39, 0.123E1) = ~0.34028235E39 - (~0.34028235E39, 0.123E1) = ~0.34028235E39 / (~0.34028235E39, 0.123E1) = ~0.27665231E39 nextAfter (~0.34028235E39, 0.123E1) = ~0.34028233E39 rem (~0.34028235E39, 0.123E1) = 0.0 * (~0.34028235E39, 0.123) = ~0.4185473E38 + (~0.34028235E39, 0.123) = ~0.34028235E39 - (~0.34028235E39, 0.123) = ~0.34028235E39 / (~0.34028235E39, 0.123) = ~inf nextAfter (~0.34028235E39, 0.123) = ~0.34028233E39 rem (~0.34028235E39, 0.123) = inf * (~0.34028235E39, 0.123E~2) = ~0.4185473E36 + (~0.34028235E39, 0.123E~2) = ~0.34028235E39 - (~0.34028235E39, 0.123E~2) = ~0.34028235E39 / (~0.34028235E39, 0.123E~2) = ~inf nextAfter (~0.34028235E39, 0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E~2) = inf * (~0.34028235E39, 0.11754944E~37) = ~0.39999998E1 + (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, 0.11754944E~37) = ~inf nextAfter (~0.34028235E39, 0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, 0.11754944E~37) = inf * (~0.34028235E39, 0.5877472E~38) = ~0.19999999E1 + (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, 0.5877472E~38) = ~inf nextAfter (~0.34028235E39, 0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, 0.5877472E~38) = inf * (~0.34028235E39, 0.1E~44) = ~0.47683713E~6 + (~0.34028235E39, 0.1E~44) = ~0.34028235E39 - (~0.34028235E39, 0.1E~44) = ~0.34028235E39 / (~0.34028235E39, 0.1E~44) = ~inf nextAfter (~0.34028235E39, 0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, 0.1E~44) = inf * (~0.34028235E39, 0.0) = ~0.0 + (~0.34028235E39, 0.0) = ~0.34028235E39 - (~0.34028235E39, 0.0) = ~0.34028235E39 / (~0.34028235E39, 0.0) = ~inf nextAfter (~0.34028235E39, 0.0) = ~0.34028233E39 rem (~0.34028235E39, 0.0) = nan * (~0.34028235E39, ~0.34028235E39) = inf + (~0.34028235E39, ~0.34028235E39) = ~inf - (~0.34028235E39, ~0.34028235E39) = 0.0 / (~0.34028235E39, ~0.34028235E39) = 0.1E1 nextAfter (~0.34028235E39, ~0.34028235E39) = ~0.34028235E39 rem (~0.34028235E39, ~0.34028235E39) = 0.0 * (~0.34028235E39, ~0.17014117E39) = inf + (~0.34028235E39, ~0.17014117E39) = ~inf - (~0.34028235E39, ~0.17014117E39) = ~0.17014117E39 / (~0.34028235E39, ~0.17014117E39) = 0.2E1 nextAfter (~0.34028235E39, ~0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, ~0.17014117E39) = 0.0 * (~0.34028235E39, ~0.123E4) = inf + (~0.34028235E39, ~0.123E4) = ~0.34028235E39 - (~0.34028235E39, ~0.123E4) = ~0.34028235E39 / (~0.34028235E39, ~0.123E4) = 0.2766523E36 nextAfter (~0.34028235E39, ~0.123E4) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E4) = ~0.2028241E32 * (~0.34028235E39, ~0.123E2) = inf + (~0.34028235E39, ~0.123E2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E2) = 0.27665232E38 nextAfter (~0.34028235E39, ~0.123E2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E2) = inf * (~0.34028235E39, ~0.31415927E1) = inf + (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, ~0.31415927E1) = 0.10831523E39 nextAfter (~0.34028235E39, ~0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, ~0.27182817E1) = inf + (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, ~0.27182817E1) = 0.12518288E39 nextAfter (~0.34028235E39, ~0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.27182817E1) = 0.0 * (~0.34028235E39, ~0.123E1) = inf + (~0.34028235E39, ~0.123E1) = ~0.34028235E39 - (~0.34028235E39, ~0.123E1) = ~0.34028235E39 / (~0.34028235E39, ~0.123E1) = 0.27665231E39 nextAfter (~0.34028235E39, ~0.123E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E1) = 0.0 * (~0.34028235E39, ~0.123) = 0.4185473E38 + (~0.34028235E39, ~0.123) = ~0.34028235E39 - (~0.34028235E39, ~0.123) = ~0.34028235E39 / (~0.34028235E39, ~0.123) = inf nextAfter (~0.34028235E39, ~0.123) = ~0.34028233E39 rem (~0.34028235E39, ~0.123) = inf * (~0.34028235E39, ~0.123E~2) = 0.4185473E36 + (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E~2) = inf nextAfter (~0.34028235E39, ~0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E~2) = inf * (~0.34028235E39, ~0.11754944E~37) = 0.39999998E1 + (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, ~0.11754944E~37) = inf nextAfter (~0.34028235E39, ~0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, ~0.11754944E~37) = inf * (~0.34028235E39, ~0.5877472E~38) = 0.19999999E1 + (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, ~0.5877472E~38) = inf nextAfter (~0.34028235E39, ~0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, ~0.5877472E~38) = inf * (~0.34028235E39, ~0.1E~44) = 0.47683713E~6 + (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 - (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 / (~0.34028235E39, ~0.1E~44) = inf nextAfter (~0.34028235E39, ~0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, ~0.1E~44) = inf * (~0.34028235E39, ~0.0) = 0.0 + (~0.34028235E39, ~0.0) = ~0.34028235E39 - (~0.34028235E39, ~0.0) = ~0.34028235E39 / (~0.34028235E39, ~0.0) = inf nextAfter (~0.34028235E39, ~0.0) = ~0.34028233E39 rem (~0.34028235E39, ~0.0) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.34028235E39, ~inf) = inf + (~0.34028235E39, ~inf) = ~inf - (~0.34028235E39, ~inf) = inf / (~0.34028235E39, ~inf) = 0.0 nextAfter (~0.34028235E39, ~inf) = ~inf rem (~0.34028235E39, ~inf) = ~0.34028235E39 * (~0.34028235E39, nan) = nan + (~0.34028235E39, nan) = nan - (~0.34028235E39, nan) = nan / (~0.34028235E39, nan) = nan nextAfter (~0.34028235E39, nan) = nan rem (~0.34028235E39, nan) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.17014117E39, 0.34028235E39) = ~inf + (~0.17014117E39, 0.34028235E39) = 0.17014117E39 - (~0.17014117E39, 0.34028235E39) = ~inf / (~0.17014117E39, 0.34028235E39) = ~0.5 nextAfter (~0.17014117E39, 0.34028235E39) = ~0.17014116E39 rem (~0.17014117E39, 0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, 0.17014117E39) = ~inf + (~0.17014117E39, 0.17014117E39) = 0.0 - (~0.17014117E39, 0.17014117E39) = ~0.34028235E39 / (~0.17014117E39, 0.17014117E39) = ~0.1E1 nextAfter (~0.17014117E39, 0.17014117E39) = ~0.17014116E39 rem (~0.17014117E39, 0.17014117E39) = 0.0 * (~0.17014117E39, 0.123E4) = ~inf + (~0.17014117E39, 0.123E4) = ~0.17014117E39 - (~0.17014117E39, 0.123E4) = ~0.17014117E39 / (~0.17014117E39, 0.123E4) = ~0.13832615E36 nextAfter (~0.17014117E39, 0.123E4) = ~0.17014116E39 rem (~0.17014117E39, 0.123E4) = ~0.10141205E32 * (~0.17014117E39, 0.123E2) = ~inf + (~0.17014117E39, 0.123E2) = ~0.17014117E39 - (~0.17014117E39, 0.123E2) = ~0.17014117E39 / (~0.17014117E39, 0.123E2) = ~0.13832616E38 nextAfter (~0.17014117E39, 0.123E2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E2) = 0.10141205E32 * (~0.17014117E39, 0.31415927E1) = ~inf + (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, 0.31415927E1) = ~0.54157613E38 nextAfter (~0.17014117E39, 0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, 0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, 0.27182817E1) = ~inf + (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, 0.27182817E1) = ~0.6259144E38 nextAfter (~0.17014117E39, 0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, 0.27182817E1) = 0.0 * (~0.17014117E39, 0.123E1) = ~0.20927364E39 + (~0.17014117E39, 0.123E1) = ~0.17014117E39 - (~0.17014117E39, 0.123E1) = ~0.17014117E39 / (~0.17014117E39, 0.123E1) = ~0.13832616E39 nextAfter (~0.17014117E39, 0.123E1) = ~0.17014116E39 rem (~0.17014117E39, 0.123E1) = 0.0 * (~0.17014117E39, 0.123) = ~0.20927365E38 + (~0.17014117E39, 0.123) = ~0.17014117E39 - (~0.17014117E39, 0.123) = ~0.17014117E39 / (~0.17014117E39, 0.123) = ~inf nextAfter (~0.17014117E39, 0.123) = ~0.17014116E39 rem (~0.17014117E39, 0.123) = inf * (~0.17014117E39, 0.123E~2) = ~0.20927364E36 + (~0.17014117E39, 0.123E~2) = ~0.17014117E39 - (~0.17014117E39, 0.123E~2) = ~0.17014117E39 / (~0.17014117E39, 0.123E~2) = ~inf nextAfter (~0.17014117E39, 0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E~2) = inf * (~0.17014117E39, 0.11754944E~37) = ~0.19999999E1 + (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, 0.11754944E~37) = ~inf nextAfter (~0.17014117E39, 0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, 0.11754944E~37) = inf * (~0.17014117E39, 0.5877472E~38) = ~0.99999994 + (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, 0.5877472E~38) = ~inf nextAfter (~0.17014117E39, 0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, 0.5877472E~38) = inf * (~0.17014117E39, 0.1E~44) = ~0.23841856E~6 + (~0.17014117E39, 0.1E~44) = ~0.17014117E39 - (~0.17014117E39, 0.1E~44) = ~0.17014117E39 / (~0.17014117E39, 0.1E~44) = ~inf nextAfter (~0.17014117E39, 0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, 0.1E~44) = inf * (~0.17014117E39, 0.0) = ~0.0 + (~0.17014117E39, 0.0) = ~0.17014117E39 - (~0.17014117E39, 0.0) = ~0.17014117E39 / (~0.17014117E39, 0.0) = ~inf nextAfter (~0.17014117E39, 0.0) = ~0.17014116E39 rem (~0.17014117E39, 0.0) = nan * (~0.17014117E39, ~0.34028235E39) = inf + (~0.17014117E39, ~0.34028235E39) = ~inf - (~0.17014117E39, ~0.34028235E39) = 0.17014117E39 / (~0.17014117E39, ~0.34028235E39) = 0.5 nextAfter (~0.17014117E39, ~0.34028235E39) = ~0.17014118E39 rem (~0.17014117E39, ~0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, ~0.17014117E39) = inf + (~0.17014117E39, ~0.17014117E39) = ~0.34028235E39 - (~0.17014117E39, ~0.17014117E39) = 0.0 / (~0.17014117E39, ~0.17014117E39) = 0.1E1 nextAfter (~0.17014117E39, ~0.17014117E39) = ~0.17014117E39 rem (~0.17014117E39, ~0.17014117E39) = 0.0 * (~0.17014117E39, ~0.123E4) = inf + (~0.17014117E39, ~0.123E4) = ~0.17014117E39 - (~0.17014117E39, ~0.123E4) = ~0.17014117E39 / (~0.17014117E39, ~0.123E4) = 0.13832615E36 nextAfter (~0.17014117E39, ~0.123E4) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E4) = ~0.10141205E32 * (~0.17014117E39, ~0.123E2) = inf + (~0.17014117E39, ~0.123E2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E2) = 0.13832616E38 nextAfter (~0.17014117E39, ~0.123E2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E2) = 0.10141205E32 * (~0.17014117E39, ~0.31415927E1) = inf + (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, ~0.31415927E1) = 0.54157613E38 nextAfter (~0.17014117E39, ~0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, ~0.27182817E1) = inf + (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, ~0.27182817E1) = 0.6259144E38 nextAfter (~0.17014117E39, ~0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.27182817E1) = 0.0 * (~0.17014117E39, ~0.123E1) = 0.20927364E39 + (~0.17014117E39, ~0.123E1) = ~0.17014117E39 - (~0.17014117E39, ~0.123E1) = ~0.17014117E39 / (~0.17014117E39, ~0.123E1) = 0.13832616E39 nextAfter (~0.17014117E39, ~0.123E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E1) = 0.0 * (~0.17014117E39, ~0.123) = 0.20927365E38 + (~0.17014117E39, ~0.123) = ~0.17014117E39 - (~0.17014117E39, ~0.123) = ~0.17014117E39 / (~0.17014117E39, ~0.123) = inf nextAfter (~0.17014117E39, ~0.123) = ~0.17014116E39 rem (~0.17014117E39, ~0.123) = inf * (~0.17014117E39, ~0.123E~2) = 0.20927364E36 + (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E~2) = inf nextAfter (~0.17014117E39, ~0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E~2) = inf * (~0.17014117E39, ~0.11754944E~37) = 0.19999999E1 + (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, ~0.11754944E~37) = inf nextAfter (~0.17014117E39, ~0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, ~0.11754944E~37) = inf * (~0.17014117E39, ~0.5877472E~38) = 0.99999994 + (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, ~0.5877472E~38) = inf nextAfter (~0.17014117E39, ~0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, ~0.5877472E~38) = inf * (~0.17014117E39, ~0.1E~44) = 0.23841856E~6 + (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 - (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 / (~0.17014117E39, ~0.1E~44) = inf nextAfter (~0.17014117E39, ~0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, ~0.1E~44) = inf * (~0.17014117E39, ~0.0) = 0.0 + (~0.17014117E39, ~0.0) = ~0.17014117E39 - (~0.17014117E39, ~0.0) = ~0.17014117E39 / (~0.17014117E39, ~0.0) = inf nextAfter (~0.17014117E39, ~0.0) = ~0.17014116E39 rem (~0.17014117E39, ~0.0) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.17014117E39, ~inf) = inf + (~0.17014117E39, ~inf) = ~inf - (~0.17014117E39, ~inf) = inf / (~0.17014117E39, ~inf) = 0.0 nextAfter (~0.17014117E39, ~inf) = ~0.17014118E39 rem (~0.17014117E39, ~inf) = ~0.17014117E39 * (~0.17014117E39, nan) = nan + (~0.17014117E39, nan) = nan - (~0.17014117E39, nan) = nan / (~0.17014117E39, nan) = nan nextAfter (~0.17014117E39, nan) = nan rem (~0.17014117E39, nan) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.123E4, 0.34028235E39) = ~inf + (~0.123E4, 0.34028235E39) = 0.34028235E39 - (~0.123E4, 0.34028235E39) = ~0.34028235E39 / (~0.123E4, 0.34028235E39) = ~0.36146455E~35 nextAfter (~0.123E4, 0.34028235E39) = ~0.12299999E4 rem (~0.123E4, 0.34028235E39) = ~0.123E4 * (~0.123E4, 0.17014117E39) = ~inf + (~0.123E4, 0.17014117E39) = 0.17014117E39 - (~0.123E4, 0.17014117E39) = ~0.17014117E39 / (~0.123E4, 0.17014117E39) = ~0.7229291E~35 nextAfter (~0.123E4, 0.17014117E39) = ~0.12299999E4 rem (~0.123E4, 0.17014117E39) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.31415927E1) = ~0.38641592E4 + (~0.123E4, 0.31415927E1) = ~0.12268584E4 - (~0.123E4, 0.31415927E1) = ~0.12331416E4 / (~0.123E4, 0.31415927E1) = ~0.39152115E3 nextAfter (~0.123E4, 0.31415927E1) = ~0.12299999E4 rem (~0.123E4, 0.31415927E1) = ~0.1637207E1 * (~0.123E4, 0.27182817E1) = ~0.33434866E4 + (~0.123E4, 0.27182817E1) = ~0.12272817E4 - (~0.123E4, 0.27182817E1) = ~0.12327183E4 / (~0.123E4, 0.27182817E1) = ~0.45249173E3 nextAfter (~0.123E4, 0.27182817E1) = ~0.12299999E4 rem (~0.123E4, 0.27182817E1) = ~0.13366699E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129001E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129001E1 + (~0.123E4, 0.123E~2) = ~0.12299988E4 - (~0.123E4, 0.123E~2) = ~0.12300012E4 / (~0.123E4, 0.123E~2) = ~0.99999994E6 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999E4 rem (~0.123E4, 0.123E~2) = ~0.12207031E~2 * (~0.123E4, 0.11754944E~37) = ~0.1445858E~34 + (~0.123E4, 0.11754944E~37) = ~0.123E4 - (~0.123E4, 0.11754944E~37) = ~0.123E4 / (~0.123E4, 0.11754944E~37) = ~inf nextAfter (~0.123E4, 0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, 0.11754944E~37) = inf * (~0.123E4, 0.5877472E~38) = ~0.722929E~35 + (~0.123E4, 0.5877472E~38) = ~0.123E4 - (~0.123E4, 0.5877472E~38) = ~0.123E4 / (~0.123E4, 0.5877472E~38) = ~inf nextAfter (~0.123E4, 0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, 0.5877472E~38) = inf * (~0.123E4, 0.1E~44) = ~0.1724E~41 + (~0.123E4, 0.1E~44) = ~0.123E4 - (~0.123E4, 0.1E~44) = ~0.123E4 / (~0.123E4, 0.1E~44) = ~inf nextAfter (~0.123E4, 0.1E~44) = ~0.12299999E4 rem (~0.123E4, 0.1E~44) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.34028235E39) = inf + (~0.123E4, ~0.34028235E39) = ~0.34028235E39 - (~0.123E4, ~0.34028235E39) = 0.34028235E39 / (~0.123E4, ~0.34028235E39) = 0.36146455E~35 nextAfter (~0.123E4, ~0.34028235E39) = ~0.12300001E4 rem (~0.123E4, ~0.34028235E39) = ~0.123E4 * (~0.123E4, ~0.17014117E39) = inf + (~0.123E4, ~0.17014117E39) = ~0.17014117E39 - (~0.123E4, ~0.17014117E39) = 0.17014117E39 / (~0.123E4, ~0.17014117E39) = 0.7229291E~35 nextAfter (~0.123E4, ~0.17014117E39) = ~0.12300001E4 rem (~0.123E4, ~0.17014117E39) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.31415927E1) = 0.38641592E4 + (~0.123E4, ~0.31415927E1) = ~0.12331416E4 - (~0.123E4, ~0.31415927E1) = ~0.12268584E4 / (~0.123E4, ~0.31415927E1) = 0.39152115E3 nextAfter (~0.123E4, ~0.31415927E1) = ~0.12299999E4 rem (~0.123E4, ~0.31415927E1) = ~0.1637207E1 * (~0.123E4, ~0.27182817E1) = 0.33434866E4 + (~0.123E4, ~0.27182817E1) = ~0.12327183E4 - (~0.123E4, ~0.27182817E1) = ~0.12272817E4 / (~0.123E4, ~0.27182817E1) = 0.45249173E3 nextAfter (~0.123E4, ~0.27182817E1) = ~0.12299999E4 rem (~0.123E4, ~0.27182817E1) = ~0.13366699E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129001E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129001E1 + (~0.123E4, ~0.123E~2) = ~0.12300012E4 - (~0.123E4, ~0.123E~2) = ~0.12299988E4 / (~0.123E4, ~0.123E~2) = 0.99999994E6 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999E4 rem (~0.123E4, ~0.123E~2) = ~0.12207031E~2 * (~0.123E4, ~0.11754944E~37) = 0.1445858E~34 + (~0.123E4, ~0.11754944E~37) = ~0.123E4 - (~0.123E4, ~0.11754944E~37) = ~0.123E4 / (~0.123E4, ~0.11754944E~37) = inf nextAfter (~0.123E4, ~0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, ~0.11754944E~37) = inf * (~0.123E4, ~0.5877472E~38) = 0.722929E~35 + (~0.123E4, ~0.5877472E~38) = ~0.123E4 - (~0.123E4, ~0.5877472E~38) = ~0.123E4 / (~0.123E4, ~0.5877472E~38) = inf nextAfter (~0.123E4, ~0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, ~0.5877472E~38) = inf * (~0.123E4, ~0.1E~44) = 0.1724E~41 + (~0.123E4, ~0.1E~44) = ~0.123E4 - (~0.123E4, ~0.1E~44) = ~0.123E4 / (~0.123E4, ~0.1E~44) = inf nextAfter (~0.123E4, ~0.1E~44) = ~0.12299999E4 rem (~0.123E4, ~0.1E~44) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300001E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.34028235E39) = ~inf + (~0.123E2, 0.34028235E39) = 0.34028235E39 - (~0.123E2, 0.34028235E39) = ~0.34028235E39 / (~0.123E2, 0.34028235E39) = ~0.36146455E~37 nextAfter (~0.123E2, 0.34028235E39) = ~0.12299999E2 rem (~0.123E2, 0.34028235E39) = ~0.123E2 * (~0.123E2, 0.17014117E39) = ~inf + (~0.123E2, 0.17014117E39) = 0.17014117E39 - (~0.123E2, 0.17014117E39) = ~0.17014117E39 / (~0.123E2, 0.17014117E39) = ~0.7229291E~37 nextAfter (~0.123E2, 0.17014117E39) = ~0.12299999E2 rem (~0.123E2, 0.17014117E39) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129001E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.31415927E1) = ~0.3864159E2 + (~0.123E2, 0.31415927E1) = ~0.9158407E1 - (~0.123E2, 0.31415927E1) = ~0.15441593E2 / (~0.123E2, 0.31415927E1) = ~0.39152114E1 nextAfter (~0.123E2, 0.31415927E1) = ~0.12299999E2 rem (~0.123E2, 0.31415927E1) = ~0.28752222E1 * (~0.123E2, 0.27182817E1) = ~0.33434868E2 + (~0.123E2, 0.27182817E1) = ~0.9581718E1 - (~0.123E2, 0.27182817E1) = ~0.15018282E2 / (~0.123E2, 0.27182817E1) = ~0.4524917E1 nextAfter (~0.123E2, 0.27182817E1) = ~0.12299999E2 rem (~0.123E2, 0.27182817E1) = ~0.14268732E1 * (~0.123E2, 0.123E1) = ~0.15129001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129001E1 + (~0.123E2, 0.123) = ~0.12177E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.1E3 nextAfter (~0.123E2, 0.123) = ~0.12299999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129001E~1 + (~0.123E2, 0.123E~2) = ~0.1229877E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999E2 rem (~0.123E2, 0.123E~2) = 0.0 * (~0.123E2, 0.11754944E~37) = ~0.14458581E~36 + (~0.123E2, 0.11754944E~37) = ~0.123E2 - (~0.123E2, 0.11754944E~37) = ~0.123E2 / (~0.123E2, 0.11754944E~37) = ~inf nextAfter (~0.123E2, 0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, 0.11754944E~37) = inf * (~0.123E2, 0.5877472E~38) = ~0.72292904E~37 + (~0.123E2, 0.5877472E~38) = ~0.123E2 - (~0.123E2, 0.5877472E~38) = ~0.123E2 / (~0.123E2, 0.5877472E~38) = ~inf nextAfter (~0.123E2, 0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, 0.5877472E~38) = inf * (~0.123E2, 0.1E~44) = ~0.17E~43 + (~0.123E2, 0.1E~44) = ~0.123E2 - (~0.123E2, 0.1E~44) = ~0.123E2 / (~0.123E2, 0.1E~44) = ~inf nextAfter (~0.123E2, 0.1E~44) = ~0.12299999E2 rem (~0.123E2, 0.1E~44) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.34028235E39) = inf + (~0.123E2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E2, ~0.34028235E39) = 0.34028235E39 / (~0.123E2, ~0.34028235E39) = 0.36146455E~37 nextAfter (~0.123E2, ~0.34028235E39) = ~0.12300001E2 rem (~0.123E2, ~0.34028235E39) = ~0.123E2 * (~0.123E2, ~0.17014117E39) = inf + (~0.123E2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E2, ~0.17014117E39) = 0.17014117E39 / (~0.123E2, ~0.17014117E39) = 0.7229291E~37 nextAfter (~0.123E2, ~0.17014117E39) = ~0.12300001E2 rem (~0.123E2, ~0.17014117E39) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300001E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129001E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.31415927E1) = 0.3864159E2 + (~0.123E2, ~0.31415927E1) = ~0.15441593E2 - (~0.123E2, ~0.31415927E1) = ~0.9158407E1 / (~0.123E2, ~0.31415927E1) = 0.39152114E1 nextAfter (~0.123E2, ~0.31415927E1) = ~0.12299999E2 rem (~0.123E2, ~0.31415927E1) = ~0.28752222E1 * (~0.123E2, ~0.27182817E1) = 0.33434868E2 + (~0.123E2, ~0.27182817E1) = ~0.15018282E2 - (~0.123E2, ~0.27182817E1) = ~0.9581718E1 / (~0.123E2, ~0.27182817E1) = 0.4524917E1 nextAfter (~0.123E2, ~0.27182817E1) = ~0.12299999E2 rem (~0.123E2, ~0.27182817E1) = ~0.14268732E1 * (~0.123E2, ~0.123E1) = 0.15129001E2 + (~0.123E2, ~0.123E1) = ~0.13530001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177E2 / (~0.123E2, ~0.123) = 0.1E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129001E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.1229877E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999E2 rem (~0.123E2, ~0.123E~2) = 0.0 * (~0.123E2, ~0.11754944E~37) = 0.14458581E~36 + (~0.123E2, ~0.11754944E~37) = ~0.123E2 - (~0.123E2, ~0.11754944E~37) = ~0.123E2 / (~0.123E2, ~0.11754944E~37) = inf nextAfter (~0.123E2, ~0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, ~0.11754944E~37) = inf * (~0.123E2, ~0.5877472E~38) = 0.72292904E~37 + (~0.123E2, ~0.5877472E~38) = ~0.123E2 - (~0.123E2, ~0.5877472E~38) = ~0.123E2 / (~0.123E2, ~0.5877472E~38) = inf nextAfter (~0.123E2, ~0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, ~0.5877472E~38) = inf * (~0.123E2, ~0.1E~44) = 0.17E~43 + (~0.123E2, ~0.1E~44) = ~0.123E2 - (~0.123E2, ~0.1E~44) = ~0.123E2 / (~0.123E2, ~0.1E~44) = inf nextAfter (~0.123E2, ~0.1E~44) = ~0.12299999E2 rem (~0.123E2, ~0.1E~44) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300001E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.31415927E1, 0.34028235E39) = ~inf + (~0.31415927E1, 0.34028235E39) = 0.34028235E39 - (~0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (~0.31415927E1, 0.34028235E39) = ~0.9232312E~38 nextAfter (~0.31415927E1, 0.34028235E39) = ~0.31415925E1 rem (~0.31415927E1, 0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, 0.17014117E39) = ~inf + (~0.31415927E1, 0.17014117E39) = 0.17014117E39 - (~0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (~0.31415927E1, 0.17014117E39) = ~0.18464624E~37 nextAfter (~0.31415927E1, 0.17014117E39) = ~0.31415925E1 rem (~0.31415927E1, 0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, 0.123E4) = ~0.38641592E4 + (~0.31415927E1, 0.123E4) = 0.12268584E4 - (~0.31415927E1, 0.123E4) = ~0.12331416E4 / (~0.31415927E1, 0.123E4) = ~0.25541405E~2 nextAfter (~0.31415927E1, 0.123E4) = ~0.31415925E1 rem (~0.31415927E1, 0.123E4) = ~0.31415927E1 * (~0.31415927E1, 0.123E2) = ~0.3864159E2 + (~0.31415927E1, 0.123E2) = 0.9158407E1 - (~0.31415927E1, 0.123E2) = ~0.15441593E2 / (~0.31415927E1, 0.123E2) = ~0.25541404 nextAfter (~0.31415927E1, 0.123E2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E2) = ~0.31415927E1 * (~0.31415927E1, 0.31415927E1) = ~0.9869605E1 + (~0.31415927E1, 0.31415927E1) = 0.0 - (~0.31415927E1, 0.31415927E1) = ~0.62831855E1 / (~0.31415927E1, 0.31415927E1) = ~0.1E1 nextAfter (~0.31415927E1, 0.31415927E1) = ~0.31415925E1 rem (~0.31415927E1, 0.31415927E1) = 0.0 * (~0.31415927E1, 0.27182817E1) = ~0.8539734E1 + (~0.31415927E1, 0.27182817E1) = ~0.423311 - (~0.31415927E1, 0.27182817E1) = ~0.58598747E1 / (~0.31415927E1, 0.27182817E1) = ~0.11557274E1 nextAfter (~0.31415927E1, 0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, 0.27182817E1) = ~0.423311 * (~0.31415927E1, 0.123E1) = ~0.3864159E1 + (~0.31415927E1, 0.123E1) = ~0.19115927E1 - (~0.31415927E1, 0.123E1) = ~0.43715925E1 / (~0.31415927E1, 0.123E1) = ~0.25541403E1 nextAfter (~0.31415927E1, 0.123E1) = ~0.31415925E1 rem (~0.31415927E1, 0.123E1) = ~0.6815927 * (~0.31415927E1, 0.123) = ~0.38641593 + (~0.31415927E1, 0.123) = ~0.30185928E1 - (~0.31415927E1, 0.123) = ~0.32645926E1 / (~0.31415927E1, 0.123) = ~0.25541403E2 nextAfter (~0.31415927E1, 0.123) = ~0.31415925E1 rem (~0.31415927E1, 0.123) = ~0.6659269E~1 * (~0.31415927E1, 0.123E~2) = ~0.38641593E~2 + (~0.31415927E1, 0.123E~2) = ~0.31403627E1 - (~0.31415927E1, 0.123E~2) = ~0.31428227E1 / (~0.31415927E1, 0.123E~2) = ~0.25541404E4 nextAfter (~0.31415927E1, 0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, 0.11754944E~37) = ~0.36929245E~37 + (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, 0.11754944E~37) = ~0.26725715E39 nextAfter (~0.31415927E1, 0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, 0.11754944E~37) = 0.0 * (~0.31415927E1, 0.5877472E~38) = ~0.18464623E~37 + (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, 0.5877472E~38) = ~inf nextAfter (~0.31415927E1, 0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, 0.5877472E~38) = inf * (~0.31415927E1, 0.1E~44) = ~0.4E~44 + (~0.31415927E1, 0.1E~44) = ~0.31415927E1 - (~0.31415927E1, 0.1E~44) = ~0.31415927E1 / (~0.31415927E1, 0.1E~44) = ~inf nextAfter (~0.31415927E1, 0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, 0.1E~44) = inf * (~0.31415927E1, 0.0) = ~0.0 + (~0.31415927E1, 0.0) = ~0.31415927E1 - (~0.31415927E1, 0.0) = ~0.31415927E1 / (~0.31415927E1, 0.0) = ~inf nextAfter (~0.31415927E1, 0.0) = ~0.31415925E1 rem (~0.31415927E1, 0.0) = nan * (~0.31415927E1, ~0.34028235E39) = inf + (~0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (~0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (~0.31415927E1, ~0.34028235E39) = 0.9232312E~38 nextAfter (~0.31415927E1, ~0.34028235E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, ~0.17014117E39) = inf + (~0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (~0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (~0.31415927E1, ~0.17014117E39) = 0.18464624E~37 nextAfter (~0.31415927E1, ~0.17014117E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, ~0.123E4) = 0.38641592E4 + (~0.31415927E1, ~0.123E4) = ~0.12331416E4 - (~0.31415927E1, ~0.123E4) = 0.12268584E4 / (~0.31415927E1, ~0.123E4) = 0.25541405E~2 nextAfter (~0.31415927E1, ~0.123E4) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E4) = ~0.31415927E1 * (~0.31415927E1, ~0.123E2) = 0.3864159E2 + (~0.31415927E1, ~0.123E2) = ~0.15441593E2 - (~0.31415927E1, ~0.123E2) = 0.9158407E1 / (~0.31415927E1, ~0.123E2) = 0.25541404 nextAfter (~0.31415927E1, ~0.123E2) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E2) = ~0.31415927E1 * (~0.31415927E1, ~0.31415927E1) = 0.9869605E1 + (~0.31415927E1, ~0.31415927E1) = ~0.62831855E1 - (~0.31415927E1, ~0.31415927E1) = 0.0 / (~0.31415927E1, ~0.31415927E1) = 0.1E1 nextAfter (~0.31415927E1, ~0.31415927E1) = ~0.31415927E1 rem (~0.31415927E1, ~0.31415927E1) = 0.0 * (~0.31415927E1, ~0.27182817E1) = 0.8539734E1 + (~0.31415927E1, ~0.27182817E1) = ~0.58598747E1 - (~0.31415927E1, ~0.27182817E1) = ~0.423311 / (~0.31415927E1, ~0.27182817E1) = 0.11557274E1 nextAfter (~0.31415927E1, ~0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.27182817E1) = ~0.423311 * (~0.31415927E1, ~0.123E1) = 0.3864159E1 + (~0.31415927E1, ~0.123E1) = ~0.43715925E1 - (~0.31415927E1, ~0.123E1) = ~0.19115927E1 / (~0.31415927E1, ~0.123E1) = 0.25541403E1 nextAfter (~0.31415927E1, ~0.123E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E1) = ~0.6815927 * (~0.31415927E1, ~0.123) = 0.38641593 + (~0.31415927E1, ~0.123) = ~0.32645926E1 - (~0.31415927E1, ~0.123) = ~0.30185928E1 / (~0.31415927E1, ~0.123) = 0.25541403E2 nextAfter (~0.31415927E1, ~0.123) = ~0.31415925E1 rem (~0.31415927E1, ~0.123) = ~0.6659269E~1 * (~0.31415927E1, ~0.123E~2) = 0.38641593E~2 + (~0.31415927E1, ~0.123E~2) = ~0.31428227E1 - (~0.31415927E1, ~0.123E~2) = ~0.31403627E1 / (~0.31415927E1, ~0.123E~2) = 0.25541404E4 nextAfter (~0.31415927E1, ~0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, ~0.11754944E~37) = 0.36929245E~37 + (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, ~0.11754944E~37) = 0.26725715E39 nextAfter (~0.31415927E1, ~0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, ~0.11754944E~37) = 0.0 * (~0.31415927E1, ~0.5877472E~38) = 0.18464623E~37 + (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, ~0.5877472E~38) = inf nextAfter (~0.31415927E1, ~0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, ~0.5877472E~38) = inf * (~0.31415927E1, ~0.1E~44) = 0.4E~44 + (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 - (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 / (~0.31415927E1, ~0.1E~44) = inf nextAfter (~0.31415927E1, ~0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, ~0.1E~44) = inf * (~0.31415927E1, ~0.0) = 0.0 + (~0.31415927E1, ~0.0) = ~0.31415927E1 - (~0.31415927E1, ~0.0) = ~0.31415927E1 / (~0.31415927E1, ~0.0) = inf nextAfter (~0.31415927E1, ~0.0) = ~0.31415925E1 rem (~0.31415927E1, ~0.0) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.31415927E1, ~inf) = inf + (~0.31415927E1, ~inf) = ~inf - (~0.31415927E1, ~inf) = inf / (~0.31415927E1, ~inf) = 0.0 nextAfter (~0.31415927E1, ~inf) = ~0.3141593E1 rem (~0.31415927E1, ~inf) = ~0.31415927E1 * (~0.31415927E1, nan) = nan + (~0.31415927E1, nan) = nan - (~0.31415927E1, nan) = nan / (~0.31415927E1, nan) = nan nextAfter (~0.31415927E1, nan) = nan rem (~0.31415927E1, nan) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.27182817E1, 0.34028235E39) = ~inf + (~0.27182817E1, 0.34028235E39) = 0.34028235E39 - (~0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (~0.27182817E1, 0.34028235E39) = ~0.7988312E~38 nextAfter (~0.27182817E1, 0.34028235E39) = ~0.27182815E1 rem (~0.27182817E1, 0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, 0.17014117E39) = ~inf + (~0.27182817E1, 0.17014117E39) = 0.17014117E39 - (~0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (~0.27182817E1, 0.17014117E39) = ~0.15976626E~37 nextAfter (~0.27182817E1, 0.17014117E39) = ~0.27182815E1 rem (~0.27182817E1, 0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, 0.123E4) = ~0.33434866E4 + (~0.27182817E1, 0.123E4) = 0.12272817E4 - (~0.27182817E1, 0.123E4) = ~0.12327183E4 / (~0.27182817E1, 0.123E4) = ~0.22099852E~2 nextAfter (~0.27182817E1, 0.123E4) = ~0.27182815E1 rem (~0.27182817E1, 0.123E4) = ~0.27182817E1 * (~0.27182817E1, 0.123E2) = ~0.33434868E2 + (~0.27182817E1, 0.123E2) = 0.9581718E1 - (~0.27182817E1, 0.123E2) = ~0.15018282E2 / (~0.27182817E1, 0.123E2) = ~0.22099851 nextAfter (~0.27182817E1, 0.123E2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E2) = ~0.27182817E1 * (~0.27182817E1, 0.31415927E1) = ~0.8539734E1 + (~0.27182817E1, 0.31415927E1) = 0.423311 - (~0.27182817E1, 0.31415927E1) = ~0.58598747E1 / (~0.27182817E1, 0.31415927E1) = ~0.86525595 nextAfter (~0.27182817E1, 0.31415927E1) = ~0.27182815E1 rem (~0.27182817E1, 0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, 0.27182817E1) = ~0.73890557E1 + (~0.27182817E1, 0.27182817E1) = 0.0 - (~0.27182817E1, 0.27182817E1) = ~0.54365635E1 / (~0.27182817E1, 0.27182817E1) = ~0.1E1 nextAfter (~0.27182817E1, 0.27182817E1) = ~0.27182815E1 rem (~0.27182817E1, 0.27182817E1) = 0.0 * (~0.27182817E1, 0.123E1) = ~0.33434865E1 + (~0.27182817E1, 0.123E1) = ~0.14882817E1 - (~0.27182817E1, 0.123E1) = ~0.39482818E1 / (~0.27182817E1, 0.123E1) = ~0.2209985E1 nextAfter (~0.27182817E1, 0.123E1) = ~0.27182815E1 rem (~0.27182817E1, 0.123E1) = ~0.2582817 * (~0.27182817E1, 0.123) = ~0.33434868 + (~0.27182817E1, 0.123) = ~0.25952818E1 - (~0.27182817E1, 0.123) = ~0.28412817E1 / (~0.27182817E1, 0.123) = ~0.22099852E2 nextAfter (~0.27182817E1, 0.123) = ~0.27182815E1 rem (~0.27182817E1, 0.123) = ~0.12281656E~1 * (~0.27182817E1, 0.123E~2) = ~0.33434867E~2 + (~0.27182817E1, 0.123E~2) = ~0.27170517E1 - (~0.27182817E1, 0.123E~2) = ~0.27195117E1 / (~0.27182817E1, 0.123E~2) = ~0.2209985E4 nextAfter (~0.27182817E1, 0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, 0.11754944E~37) = ~0.31953248E~37 + (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, 0.11754944E~37) = ~0.23124584E39 nextAfter (~0.27182817E1, 0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, 0.11754944E~37) = 0.0 * (~0.27182817E1, 0.5877472E~38) = ~0.15976624E~37 + (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, 0.5877472E~38) = ~inf nextAfter (~0.27182817E1, 0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, 0.5877472E~38) = inf * (~0.27182817E1, 0.1E~44) = ~0.4E~44 + (~0.27182817E1, 0.1E~44) = ~0.27182817E1 - (~0.27182817E1, 0.1E~44) = ~0.27182817E1 / (~0.27182817E1, 0.1E~44) = ~inf nextAfter (~0.27182817E1, 0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, 0.1E~44) = inf * (~0.27182817E1, 0.0) = ~0.0 + (~0.27182817E1, 0.0) = ~0.27182817E1 - (~0.27182817E1, 0.0) = ~0.27182817E1 / (~0.27182817E1, 0.0) = ~inf nextAfter (~0.27182817E1, 0.0) = ~0.27182815E1 rem (~0.27182817E1, 0.0) = nan * (~0.27182817E1, ~0.34028235E39) = inf + (~0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (~0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (~0.27182817E1, ~0.34028235E39) = 0.7988312E~38 nextAfter (~0.27182817E1, ~0.34028235E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, ~0.17014117E39) = inf + (~0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (~0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (~0.27182817E1, ~0.17014117E39) = 0.15976626E~37 nextAfter (~0.27182817E1, ~0.17014117E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, ~0.123E4) = 0.33434866E4 + (~0.27182817E1, ~0.123E4) = ~0.12327183E4 - (~0.27182817E1, ~0.123E4) = 0.12272817E4 / (~0.27182817E1, ~0.123E4) = 0.22099852E~2 nextAfter (~0.27182817E1, ~0.123E4) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E4) = ~0.27182817E1 * (~0.27182817E1, ~0.123E2) = 0.33434868E2 + (~0.27182817E1, ~0.123E2) = ~0.15018282E2 - (~0.27182817E1, ~0.123E2) = 0.9581718E1 / (~0.27182817E1, ~0.123E2) = 0.22099851 nextAfter (~0.27182817E1, ~0.123E2) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E2) = ~0.27182817E1 * (~0.27182817E1, ~0.31415927E1) = 0.8539734E1 + (~0.27182817E1, ~0.31415927E1) = ~0.58598747E1 - (~0.27182817E1, ~0.31415927E1) = 0.423311 / (~0.27182817E1, ~0.31415927E1) = 0.86525595 nextAfter (~0.27182817E1, ~0.31415927E1) = ~0.2718282E1 rem (~0.27182817E1, ~0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, ~0.27182817E1) = 0.73890557E1 + (~0.27182817E1, ~0.27182817E1) = ~0.54365635E1 - (~0.27182817E1, ~0.27182817E1) = 0.0 / (~0.27182817E1, ~0.27182817E1) = 0.1E1 nextAfter (~0.27182817E1, ~0.27182817E1) = ~0.27182817E1 rem (~0.27182817E1, ~0.27182817E1) = 0.0 * (~0.27182817E1, ~0.123E1) = 0.33434865E1 + (~0.27182817E1, ~0.123E1) = ~0.39482818E1 - (~0.27182817E1, ~0.123E1) = ~0.14882817E1 / (~0.27182817E1, ~0.123E1) = 0.2209985E1 nextAfter (~0.27182817E1, ~0.123E1) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E1) = ~0.2582817 * (~0.27182817E1, ~0.123) = 0.33434868 + (~0.27182817E1, ~0.123) = ~0.28412817E1 - (~0.27182817E1, ~0.123) = ~0.25952818E1 / (~0.27182817E1, ~0.123) = 0.22099852E2 nextAfter (~0.27182817E1, ~0.123) = ~0.27182815E1 rem (~0.27182817E1, ~0.123) = ~0.12281656E~1 * (~0.27182817E1, ~0.123E~2) = 0.33434867E~2 + (~0.27182817E1, ~0.123E~2) = ~0.27195117E1 - (~0.27182817E1, ~0.123E~2) = ~0.27170517E1 / (~0.27182817E1, ~0.123E~2) = 0.2209985E4 nextAfter (~0.27182817E1, ~0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, ~0.11754944E~37) = 0.31953248E~37 + (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, ~0.11754944E~37) = 0.23124584E39 nextAfter (~0.27182817E1, ~0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, ~0.11754944E~37) = 0.0 * (~0.27182817E1, ~0.5877472E~38) = 0.15976624E~37 + (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, ~0.5877472E~38) = inf nextAfter (~0.27182817E1, ~0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, ~0.5877472E~38) = inf * (~0.27182817E1, ~0.1E~44) = 0.4E~44 + (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 - (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 / (~0.27182817E1, ~0.1E~44) = inf nextAfter (~0.27182817E1, ~0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, ~0.1E~44) = inf * (~0.27182817E1, ~0.0) = 0.0 + (~0.27182817E1, ~0.0) = ~0.27182817E1 - (~0.27182817E1, ~0.0) = ~0.27182817E1 / (~0.27182817E1, ~0.0) = inf nextAfter (~0.27182817E1, ~0.0) = ~0.27182815E1 rem (~0.27182817E1, ~0.0) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.27182817E1, ~inf) = inf + (~0.27182817E1, ~inf) = ~inf - (~0.27182817E1, ~inf) = inf / (~0.27182817E1, ~inf) = 0.0 nextAfter (~0.27182817E1, ~inf) = ~0.2718282E1 rem (~0.27182817E1, ~inf) = ~0.27182817E1 * (~0.27182817E1, nan) = nan + (~0.27182817E1, nan) = nan - (~0.27182817E1, nan) = nan / (~0.27182817E1, nan) = nan nextAfter (~0.27182817E1, nan) = nan rem (~0.27182817E1, nan) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.123E1, 0.34028235E39) = ~inf + (~0.123E1, 0.34028235E39) = 0.34028235E39 - (~0.123E1, 0.34028235E39) = ~0.34028235E39 / (~0.123E1, 0.34028235E39) = ~0.3614645E~38 nextAfter (~0.123E1, 0.34028235E39) = ~0.12299999E1 rem (~0.123E1, 0.34028235E39) = ~0.123E1 * (~0.123E1, 0.17014117E39) = ~0.20927364E39 + (~0.123E1, 0.17014117E39) = 0.17014117E39 - (~0.123E1, 0.17014117E39) = ~0.17014117E39 / (~0.123E1, 0.17014117E39) = ~0.722929E~38 nextAfter (~0.123E1, 0.17014117E39) = ~0.12299999E1 rem (~0.123E1, 0.17014117E39) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530001E2 / (~0.123E1, 0.123E2) = ~0.1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.31415927E1) = ~0.3864159E1 + (~0.123E1, 0.31415927E1) = 0.19115927E1 - (~0.123E1, 0.31415927E1) = ~0.43715925E1 / (~0.123E1, 0.31415927E1) = ~0.39152116 nextAfter (~0.123E1, 0.31415927E1) = ~0.12299999E1 rem (~0.123E1, 0.31415927E1) = ~0.123E1 * (~0.123E1, 0.27182817E1) = ~0.33434865E1 + (~0.123E1, 0.27182817E1) = 0.14882817E1 - (~0.123E1, 0.27182817E1) = ~0.39482818E1 / (~0.123E1, 0.27182817E1) = ~0.45249173 nextAfter (~0.123E1, 0.27182817E1) = ~0.12299999E1 rem (~0.123E1, 0.27182817E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129001E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.11754944E~37) = ~0.14458581E~37 + (~0.123E1, 0.11754944E~37) = ~0.123E1 - (~0.123E1, 0.11754944E~37) = ~0.123E1 / (~0.123E1, 0.11754944E~37) = ~0.10463683E39 nextAfter (~0.123E1, 0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, 0.11754944E~37) = 0.0 * (~0.123E1, 0.5877472E~38) = ~0.722929E~38 + (~0.123E1, 0.5877472E~38) = ~0.123E1 - (~0.123E1, 0.5877472E~38) = ~0.123E1 / (~0.123E1, 0.5877472E~38) = ~0.20927366E39 nextAfter (~0.123E1, 0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, 0.5877472E~38) = 0.0 * (~0.123E1, 0.1E~44) = ~0.1E~44 + (~0.123E1, 0.1E~44) = ~0.123E1 - (~0.123E1, 0.1E~44) = ~0.123E1 / (~0.123E1, 0.1E~44) = ~inf nextAfter (~0.123E1, 0.1E~44) = ~0.12299999E1 rem (~0.123E1, 0.1E~44) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.34028235E39) = inf + (~0.123E1, ~0.34028235E39) = ~0.34028235E39 - (~0.123E1, ~0.34028235E39) = 0.34028235E39 / (~0.123E1, ~0.34028235E39) = 0.3614645E~38 nextAfter (~0.123E1, ~0.34028235E39) = ~0.12300001E1 rem (~0.123E1, ~0.34028235E39) = ~0.123E1 * (~0.123E1, ~0.17014117E39) = 0.20927364E39 + (~0.123E1, ~0.17014117E39) = ~0.17014117E39 - (~0.123E1, ~0.17014117E39) = 0.17014117E39 / (~0.123E1, ~0.17014117E39) = 0.722929E~38 nextAfter (~0.123E1, ~0.17014117E39) = ~0.12300001E1 rem (~0.123E1, ~0.17014117E39) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300001E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129001E2 + (~0.123E1, ~0.123E2) = ~0.13530001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300001E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.31415927E1) = 0.3864159E1 + (~0.123E1, ~0.31415927E1) = ~0.43715925E1 - (~0.123E1, ~0.31415927E1) = 0.19115927E1 / (~0.123E1, ~0.31415927E1) = 0.39152116 nextAfter (~0.123E1, ~0.31415927E1) = ~0.12300001E1 rem (~0.123E1, ~0.31415927E1) = ~0.123E1 * (~0.123E1, ~0.27182817E1) = 0.33434865E1 + (~0.123E1, ~0.27182817E1) = ~0.39482818E1 - (~0.123E1, ~0.27182817E1) = 0.14882817E1 / (~0.123E1, ~0.27182817E1) = 0.45249173 nextAfter (~0.123E1, ~0.27182817E1) = ~0.12300001E1 rem (~0.123E1, ~0.27182817E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129001E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.11754944E~37) = 0.14458581E~37 + (~0.123E1, ~0.11754944E~37) = ~0.123E1 - (~0.123E1, ~0.11754944E~37) = ~0.123E1 / (~0.123E1, ~0.11754944E~37) = 0.10463683E39 nextAfter (~0.123E1, ~0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, ~0.11754944E~37) = 0.0 * (~0.123E1, ~0.5877472E~38) = 0.722929E~38 + (~0.123E1, ~0.5877472E~38) = ~0.123E1 - (~0.123E1, ~0.5877472E~38) = ~0.123E1 / (~0.123E1, ~0.5877472E~38) = 0.20927366E39 nextAfter (~0.123E1, ~0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, ~0.5877472E~38) = 0.0 * (~0.123E1, ~0.1E~44) = 0.1E~44 + (~0.123E1, ~0.1E~44) = ~0.123E1 - (~0.123E1, ~0.1E~44) = ~0.123E1 / (~0.123E1, ~0.1E~44) = inf nextAfter (~0.123E1, ~0.1E~44) = ~0.12299999E1 rem (~0.123E1, ~0.1E~44) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300001E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.34028235E39) = ~0.4185473E38 + (~0.123, 0.34028235E39) = 0.34028235E39 - (~0.123, 0.34028235E39) = ~0.34028235E39 / (~0.123, 0.34028235E39) = ~0.361465E~39 nextAfter (~0.123, 0.34028235E39) = ~0.122999996 rem (~0.123, 0.34028235E39) = ~0.123 * (~0.123, 0.17014117E39) = ~0.20927365E38 + (~0.123, 0.17014117E39) = 0.17014117E39 - (~0.123, 0.17014117E39) = ~0.17014117E39 / (~0.123, 0.17014117E39) = ~0.722928E~39 nextAfter (~0.123, 0.17014117E39) = ~0.122999996 rem (~0.123, 0.17014117E39) = ~0.123 * (~0.123, 0.123E4) = ~0.15129001E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.100000005E~3 nextAfter (~0.123, 0.123E4) = ~0.122999996 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129001E1 + (~0.123, 0.123E2) = 0.12177E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.1E~1 nextAfter (~0.123, 0.123E2) = ~0.122999996 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.31415927E1) = ~0.38641593 + (~0.123, 0.31415927E1) = 0.30185928E1 - (~0.123, 0.31415927E1) = ~0.32645926E1 / (~0.123, 0.31415927E1) = ~0.39152116E~1 nextAfter (~0.123, 0.31415927E1) = ~0.122999996 rem (~0.123, 0.31415927E1) = ~0.123 * (~0.123, 0.27182817E1) = ~0.33434868 + (~0.123, 0.27182817E1) = 0.25952818E1 - (~0.123, 0.27182817E1) = ~0.28412817E1 / (~0.123, 0.27182817E1) = ~0.45249175E~1 nextAfter (~0.123, 0.27182817E1) = ~0.122999996 rem (~0.123, 0.27182817E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.122999996 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129001E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.122999996 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.124230005 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.122999996 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.11754944E~37) = ~0.1445858E~38 + (~0.123, 0.11754944E~37) = ~0.123 - (~0.123, 0.11754944E~37) = ~0.123 / (~0.123, 0.11754944E~37) = ~0.10463683E38 nextAfter (~0.123, 0.11754944E~37) = ~0.122999996 rem (~0.123, 0.11754944E~37) = 0.0 * (~0.123, 0.5877472E~38) = ~0.722928E~39 + (~0.123, 0.5877472E~38) = ~0.123 - (~0.123, 0.5877472E~38) = ~0.123 / (~0.123, 0.5877472E~38) = ~0.20927366E38 nextAfter (~0.123, 0.5877472E~38) = ~0.122999996 rem (~0.123, 0.5877472E~38) = 0.0 * (~0.123, 0.1E~44) = ~0.0 + (~0.123, 0.1E~44) = ~0.123 - (~0.123, 0.1E~44) = ~0.123 / (~0.123, 0.1E~44) = ~inf nextAfter (~0.123, 0.1E~44) = ~0.122999996 rem (~0.123, 0.1E~44) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.122999996 rem (~0.123, 0.0) = nan * (~0.123, ~0.34028235E39) = 0.4185473E38 + (~0.123, ~0.34028235E39) = ~0.34028235E39 - (~0.123, ~0.34028235E39) = 0.34028235E39 / (~0.123, ~0.34028235E39) = 0.361465E~39 nextAfter (~0.123, ~0.34028235E39) = ~0.12300001 rem (~0.123, ~0.34028235E39) = ~0.123 * (~0.123, ~0.17014117E39) = 0.20927365E38 + (~0.123, ~0.17014117E39) = ~0.17014117E39 - (~0.123, ~0.17014117E39) = 0.17014117E39 / (~0.123, ~0.17014117E39) = 0.722928E~39 nextAfter (~0.123, ~0.17014117E39) = ~0.12300001 rem (~0.123, ~0.17014117E39) = ~0.123 * (~0.123, ~0.123E4) = 0.15129001E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.100000005E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177E2 / (~0.123, ~0.123E2) = 0.1E~1 nextAfter (~0.123, ~0.123E2) = ~0.12300001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.31415927E1) = 0.38641593 + (~0.123, ~0.31415927E1) = ~0.32645926E1 - (~0.123, ~0.31415927E1) = 0.30185928E1 / (~0.123, ~0.31415927E1) = 0.39152116E~1 nextAfter (~0.123, ~0.31415927E1) = ~0.12300001 rem (~0.123, ~0.31415927E1) = ~0.123 * (~0.123, ~0.27182817E1) = 0.33434868 + (~0.123, ~0.27182817E1) = ~0.28412817E1 - (~0.123, ~0.27182817E1) = 0.25952818E1 / (~0.123, ~0.27182817E1) = 0.45249175E~1 nextAfter (~0.123, ~0.27182817E1) = ~0.12300001 rem (~0.123, ~0.27182817E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129001E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.124230005 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.122999996 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.11754944E~37) = 0.1445858E~38 + (~0.123, ~0.11754944E~37) = ~0.123 - (~0.123, ~0.11754944E~37) = ~0.123 / (~0.123, ~0.11754944E~37) = 0.10463683E38 nextAfter (~0.123, ~0.11754944E~37) = ~0.122999996 rem (~0.123, ~0.11754944E~37) = 0.0 * (~0.123, ~0.5877472E~38) = 0.722928E~39 + (~0.123, ~0.5877472E~38) = ~0.123 - (~0.123, ~0.5877472E~38) = ~0.123 / (~0.123, ~0.5877472E~38) = 0.20927366E38 nextAfter (~0.123, ~0.5877472E~38) = ~0.122999996 rem (~0.123, ~0.5877472E~38) = 0.0 * (~0.123, ~0.1E~44) = 0.0 + (~0.123, ~0.1E~44) = ~0.123 - (~0.123, ~0.1E~44) = ~0.123 / (~0.123, ~0.1E~44) = inf nextAfter (~0.123, ~0.1E~44) = ~0.122999996 rem (~0.123, ~0.1E~44) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.122999996 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.34028235E39) = ~0.4185473E36 + (~0.123E~2, 0.34028235E39) = 0.34028235E39 - (~0.123E~2, 0.34028235E39) = ~0.34028235E39 / (~0.123E~2, 0.34028235E39) = ~0.3614E~41 nextAfter (~0.123E~2, 0.34028235E39) = ~0.12299999E~2 rem (~0.123E~2, 0.34028235E39) = ~0.123E~2 * (~0.123E~2, 0.17014117E39) = ~0.20927364E36 + (~0.123E~2, 0.17014117E39) = 0.17014117E39 - (~0.123E~2, 0.17014117E39) = ~0.17014117E39 / (~0.123E~2, 0.17014117E39) = ~0.7229E~41 nextAfter (~0.123E~2, 0.17014117E39) = ~0.12299999E~2 rem (~0.123E~2, 0.17014117E39) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129001E1 + (~0.123E~2, 0.123E4) = 0.12299988E4 - (~0.123E~2, 0.123E4) = ~0.12300012E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129001E~1 + (~0.123E~2, 0.123E2) = 0.1229877E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.100000005E~3 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.31415927E1) = ~0.38641593E~2 + (~0.123E~2, 0.31415927E1) = 0.31403627E1 - (~0.123E~2, 0.31415927E1) = ~0.31428227E1 / (~0.123E~2, 0.31415927E1) = ~0.39152117E~3 nextAfter (~0.123E~2, 0.31415927E1) = ~0.12299999E~2 rem (~0.123E~2, 0.31415927E1) = ~0.123E~2 * (~0.123E~2, 0.27182817E1) = ~0.33434867E~2 + (~0.123E~2, 0.27182817E1) = 0.27170517E1 - (~0.123E~2, 0.27182817E1) = ~0.27195117E1 / (~0.123E~2, 0.27182817E1) = ~0.45249175E~3 nextAfter (~0.123E~2, 0.27182817E1) = ~0.12299999E~2 rem (~0.123E~2, 0.27182817E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129001E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.124230005 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129001E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.11754944E~37) = ~0.14459E~40 + (~0.123E~2, 0.11754944E~37) = ~0.123E~2 - (~0.123E~2, 0.11754944E~37) = ~0.123E~2 / (~0.123E~2, 0.11754944E~37) = ~0.10463683E36 nextAfter (~0.123E~2, 0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, 0.11754944E~37) = 0.0 * (~0.123E~2, 0.5877472E~38) = ~0.7229E~41 + (~0.123E~2, 0.5877472E~38) = ~0.123E~2 - (~0.123E~2, 0.5877472E~38) = ~0.123E~2 / (~0.123E~2, 0.5877472E~38) = ~0.20927366E36 nextAfter (~0.123E~2, 0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, 0.5877472E~38) = 0.0 * (~0.123E~2, 0.1E~44) = ~0.0 + (~0.123E~2, 0.1E~44) = ~0.123E~2 - (~0.123E~2, 0.1E~44) = ~0.123E~2 / (~0.123E~2, 0.1E~44) = ~inf nextAfter (~0.123E~2, 0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, 0.1E~44) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.34028235E39) = 0.4185473E36 + (~0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E~2, ~0.34028235E39) = 0.34028235E39 / (~0.123E~2, ~0.34028235E39) = 0.3614E~41 nextAfter (~0.123E~2, ~0.34028235E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.34028235E39) = ~0.123E~2 * (~0.123E~2, ~0.17014117E39) = 0.20927364E36 + (~0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E~2, ~0.17014117E39) = 0.17014117E39 / (~0.123E~2, ~0.17014117E39) = 0.7229E~41 nextAfter (~0.123E~2, ~0.17014117E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.17014117E39) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129001E1 + (~0.123E~2, ~0.123E4) = ~0.12300012E4 - (~0.123E~2, ~0.123E4) = 0.12299988E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129001E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.1229877E2 / (~0.123E~2, ~0.123E2) = 0.100000005E~3 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.31415927E1) = 0.38641593E~2 + (~0.123E~2, ~0.31415927E1) = ~0.31428227E1 - (~0.123E~2, ~0.31415927E1) = 0.31403627E1 / (~0.123E~2, ~0.31415927E1) = 0.39152117E~3 nextAfter (~0.123E~2, ~0.31415927E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.31415927E1) = ~0.123E~2 * (~0.123E~2, ~0.27182817E1) = 0.33434867E~2 + (~0.123E~2, ~0.27182817E1) = ~0.27195117E1 - (~0.123E~2, ~0.27182817E1) = 0.27170517E1 / (~0.123E~2, ~0.27182817E1) = 0.45249175E~3 nextAfter (~0.123E~2, ~0.27182817E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.27182817E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129001E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.124230005 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129001E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.11754944E~37) = 0.14459E~40 + (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 - (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 / (~0.123E~2, ~0.11754944E~37) = 0.10463683E36 nextAfter (~0.123E~2, ~0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, ~0.11754944E~37) = 0.0 * (~0.123E~2, ~0.5877472E~38) = 0.7229E~41 + (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 - (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 / (~0.123E~2, ~0.5877472E~38) = 0.20927366E36 nextAfter (~0.123E~2, ~0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, ~0.5877472E~38) = 0.0 * (~0.123E~2, ~0.1E~44) = 0.0 + (~0.123E~2, ~0.1E~44) = ~0.123E~2 - (~0.123E~2, ~0.1E~44) = ~0.123E~2 / (~0.123E~2, ~0.1E~44) = inf nextAfter (~0.123E~2, ~0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, ~0.1E~44) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.11754944E~37, 0.34028235E39) = ~0.39999998E1 + (~0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (~0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (~0.11754944E~37, 0.34028235E39) = ~0.0 nextAfter (~0.11754944E~37, 0.34028235E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.17014117E39) = ~0.19999999E1 + (~0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (~0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (~0.11754944E~37, 0.17014117E39) = ~0.0 nextAfter (~0.11754944E~37, 0.17014117E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E4) = ~0.1445858E~34 + (~0.11754944E~37, 0.123E4) = 0.123E4 - (~0.11754944E~37, 0.123E4) = ~0.123E4 / (~0.11754944E~37, 0.123E4) = ~0.9557E~41 nextAfter (~0.11754944E~37, 0.123E4) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E2) = ~0.14458581E~36 + (~0.11754944E~37, 0.123E2) = 0.123E2 - (~0.11754944E~37, 0.123E2) = ~0.123E2 / (~0.11754944E~37, 0.123E2) = ~0.955687E~39 nextAfter (~0.11754944E~37, 0.123E2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, 0.31415927E1) = ~0.36929245E~37 + (~0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (~0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (~0.11754944E~37, 0.31415927E1) = ~0.3741715E~38 nextAfter (~0.11754944E~37, 0.31415927E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.27182817E1) = ~0.31953248E~37 + (~0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (~0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (~0.11754944E~37, 0.27182817E1) = ~0.4324403E~38 nextAfter (~0.11754944E~37, 0.27182817E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E1) = ~0.14458581E~37 + (~0.11754944E~37, 0.123E1) = 0.123E1 - (~0.11754944E~37, 0.123E1) = ~0.123E1 / (~0.11754944E~37, 0.123E1) = ~0.9556864E~38 nextAfter (~0.11754944E~37, 0.123E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123) = ~0.1445858E~38 + (~0.11754944E~37, 0.123) = 0.123 - (~0.11754944E~37, 0.123) = ~0.123 / (~0.11754944E~37, 0.123) = ~0.9556864E~37 nextAfter (~0.11754944E~37, 0.123) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E~2) = ~0.14459E~40 + (~0.11754944E~37, 0.123E~2) = 0.123E~2 - (~0.11754944E~37, 0.123E~2) = ~0.123E~2 / (~0.11754944E~37, 0.123E~2) = ~0.95568645E~35 nextAfter (~0.11754944E~37, 0.123E~2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, 0.11754944E~37) = ~0.0 + (~0.11754944E~37, 0.11754944E~37) = 0.0 - (~0.11754944E~37, 0.11754944E~37) = ~0.23509887E~37 / (~0.11754944E~37, 0.11754944E~37) = ~0.1E1 nextAfter (~0.11754944E~37, 0.11754944E~37) = ~0.11754942E~37 rem (~0.11754944E~37, 0.11754944E~37) = 0.0 * (~0.11754944E~37, 0.5877472E~38) = ~0.0 + (~0.11754944E~37, 0.5877472E~38) = ~0.5877472E~38 - (~0.11754944E~37, 0.5877472E~38) = ~0.17632415E~37 / (~0.11754944E~37, 0.5877472E~38) = ~0.2E1 nextAfter (~0.11754944E~37, 0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, 0.5877472E~38) = 0.0 * (~0.11754944E~37, 0.1E~44) = ~0.0 + (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 - (~0.11754944E~37, 0.1E~44) = ~0.11754945E~37 / (~0.11754944E~37, 0.1E~44) = ~0.8388608E7 nextAfter (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, 0.1E~44) = 0.0 * (~0.11754944E~37, 0.0) = ~0.0 + (~0.11754944E~37, 0.0) = ~0.11754944E~37 - (~0.11754944E~37, 0.0) = ~0.11754944E~37 / (~0.11754944E~37, 0.0) = ~inf nextAfter (~0.11754944E~37, 0.0) = ~0.11754942E~37 rem (~0.11754944E~37, 0.0) = nan * (~0.11754944E~37, ~0.34028235E39) = 0.39999998E1 + (~0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (~0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (~0.11754944E~37, ~0.34028235E39) = 0.0 nextAfter (~0.11754944E~37, ~0.34028235E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.17014117E39) = 0.19999999E1 + (~0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (~0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (~0.11754944E~37, ~0.17014117E39) = 0.0 nextAfter (~0.11754944E~37, ~0.17014117E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E4) = 0.1445858E~34 + (~0.11754944E~37, ~0.123E4) = ~0.123E4 - (~0.11754944E~37, ~0.123E4) = 0.123E4 / (~0.11754944E~37, ~0.123E4) = 0.9557E~41 nextAfter (~0.11754944E~37, ~0.123E4) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E2) = 0.14458581E~36 + (~0.11754944E~37, ~0.123E2) = ~0.123E2 - (~0.11754944E~37, ~0.123E2) = 0.123E2 / (~0.11754944E~37, ~0.123E2) = 0.955687E~39 nextAfter (~0.11754944E~37, ~0.123E2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.31415927E1) = 0.36929245E~37 + (~0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (~0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (~0.11754944E~37, ~0.31415927E1) = 0.3741715E~38 nextAfter (~0.11754944E~37, ~0.31415927E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.27182817E1) = 0.31953248E~37 + (~0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (~0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (~0.11754944E~37, ~0.27182817E1) = 0.4324403E~38 nextAfter (~0.11754944E~37, ~0.27182817E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E1) = 0.14458581E~37 + (~0.11754944E~37, ~0.123E1) = ~0.123E1 - (~0.11754944E~37, ~0.123E1) = 0.123E1 / (~0.11754944E~37, ~0.123E1) = 0.9556864E~38 nextAfter (~0.11754944E~37, ~0.123E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123) = 0.1445858E~38 + (~0.11754944E~37, ~0.123) = ~0.123 - (~0.11754944E~37, ~0.123) = 0.123 / (~0.11754944E~37, ~0.123) = 0.9556864E~37 nextAfter (~0.11754944E~37, ~0.123) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E~2) = 0.14459E~40 + (~0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (~0.11754944E~37, ~0.123E~2) = 0.123E~2 / (~0.11754944E~37, ~0.123E~2) = 0.95568645E~35 nextAfter (~0.11754944E~37, ~0.123E~2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.11754944E~37) = 0.0 + (~0.11754944E~37, ~0.11754944E~37) = ~0.23509887E~37 - (~0.11754944E~37, ~0.11754944E~37) = 0.0 / (~0.11754944E~37, ~0.11754944E~37) = 0.1E1 nextAfter (~0.11754944E~37, ~0.11754944E~37) = ~0.11754944E~37 rem (~0.11754944E~37, ~0.11754944E~37) = 0.0 * (~0.11754944E~37, ~0.5877472E~38) = 0.0 + (~0.11754944E~37, ~0.5877472E~38) = ~0.17632415E~37 - (~0.11754944E~37, ~0.5877472E~38) = ~0.5877472E~38 / (~0.11754944E~37, ~0.5877472E~38) = 0.2E1 nextAfter (~0.11754944E~37, ~0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.5877472E~38) = 0.0 * (~0.11754944E~37, ~0.1E~44) = 0.0 + (~0.11754944E~37, ~0.1E~44) = ~0.11754945E~37 - (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 / (~0.11754944E~37, ~0.1E~44) = 0.8388608E7 nextAfter (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.1E~44) = 0.0 * (~0.11754944E~37, ~0.0) = 0.0 + (~0.11754944E~37, ~0.0) = ~0.11754944E~37 - (~0.11754944E~37, ~0.0) = ~0.11754944E~37 / (~0.11754944E~37, ~0.0) = inf nextAfter (~0.11754944E~37, ~0.0) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.0) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.11754944E~37, ~inf) = inf + (~0.11754944E~37, ~inf) = ~inf - (~0.11754944E~37, ~inf) = inf / (~0.11754944E~37, ~inf) = 0.0 nextAfter (~0.11754944E~37, ~inf) = ~0.11754945E~37 rem (~0.11754944E~37, ~inf) = ~0.11754944E~37 * (~0.11754944E~37, nan) = nan + (~0.11754944E~37, nan) = nan - (~0.11754944E~37, nan) = nan / (~0.11754944E~37, nan) = nan nextAfter (~0.11754944E~37, nan) = nan rem (~0.11754944E~37, nan) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.5877472E~38, 0.34028235E39) = ~0.19999999E1 + (~0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (~0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (~0.5877472E~38, 0.34028235E39) = ~0.0 nextAfter (~0.5877472E~38, 0.34028235E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.17014117E39) = ~0.99999994 + (~0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (~0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (~0.5877472E~38, 0.17014117E39) = ~0.0 nextAfter (~0.5877472E~38, 0.17014117E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E4) = ~0.722929E~35 + (~0.5877472E~38, 0.123E4) = 0.123E4 - (~0.5877472E~38, 0.123E4) = ~0.123E4 / (~0.5877472E~38, 0.123E4) = ~0.4778E~41 nextAfter (~0.5877472E~38, 0.123E4) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E2) = ~0.72292904E~37 + (~0.5877472E~38, 0.123E2) = 0.123E2 - (~0.5877472E~38, 0.123E2) = ~0.123E2 / (~0.5877472E~38, 0.123E2) = ~0.477843E~39 nextAfter (~0.5877472E~38, 0.123E2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, 0.31415927E1) = ~0.18464623E~37 + (~0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (~0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (~0.5877472E~38, 0.31415927E1) = ~0.1870857E~38 nextAfter (~0.5877472E~38, 0.31415927E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.27182817E1) = ~0.15976624E~37 + (~0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (~0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (~0.5877472E~38, 0.27182817E1) = ~0.2162201E~38 nextAfter (~0.5877472E~38, 0.27182817E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E1) = ~0.722929E~38 + (~0.5877472E~38, 0.123E1) = 0.123E1 - (~0.5877472E~38, 0.123E1) = ~0.123E1 / (~0.5877472E~38, 0.123E1) = ~0.4778432E~38 nextAfter (~0.5877472E~38, 0.123E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123) = ~0.722928E~39 + (~0.5877472E~38, 0.123) = 0.123 - (~0.5877472E~38, 0.123) = ~0.123 / (~0.5877472E~38, 0.123) = ~0.4778432E~37 nextAfter (~0.5877472E~38, 0.123) = ~0.587747E~38 rem (~0.5877472E~38, 0.123) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E~2) = ~0.7229E~41 + (~0.5877472E~38, 0.123E~2) = 0.123E~2 - (~0.5877472E~38, 0.123E~2) = ~0.123E~2 / (~0.5877472E~38, 0.123E~2) = ~0.47784322E~35 nextAfter (~0.5877472E~38, 0.123E~2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, 0.11754944E~37) = ~0.0 + (~0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 - (~0.5877472E~38, 0.11754944E~37) = ~0.17632415E~37 / (~0.5877472E~38, 0.11754944E~37) = ~0.5 nextAfter (~0.5877472E~38, 0.11754944E~37) = ~0.587747E~38 rem (~0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, 0.5877472E~38) = ~0.0 + (~0.5877472E~38, 0.5877472E~38) = 0.0 - (~0.5877472E~38, 0.5877472E~38) = ~0.11754944E~37 / (~0.5877472E~38, 0.5877472E~38) = ~0.1E1 nextAfter (~0.5877472E~38, 0.5877472E~38) = ~0.587747E~38 rem (~0.5877472E~38, 0.5877472E~38) = 0.0 * (~0.5877472E~38, 0.1E~44) = ~0.0 + (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 - (~0.5877472E~38, 0.1E~44) = ~0.5877473E~38 / (~0.5877472E~38, 0.1E~44) = ~0.4194304E7 nextAfter (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, 0.1E~44) = 0.0 * (~0.5877472E~38, 0.0) = ~0.0 + (~0.5877472E~38, 0.0) = ~0.5877472E~38 - (~0.5877472E~38, 0.0) = ~0.5877472E~38 / (~0.5877472E~38, 0.0) = ~inf nextAfter (~0.5877472E~38, 0.0) = ~0.587747E~38 rem (~0.5877472E~38, 0.0) = nan * (~0.5877472E~38, ~0.34028235E39) = 0.19999999E1 + (~0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (~0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (~0.5877472E~38, ~0.34028235E39) = 0.0 nextAfter (~0.5877472E~38, ~0.34028235E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.17014117E39) = 0.99999994 + (~0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (~0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (~0.5877472E~38, ~0.17014117E39) = 0.0 nextAfter (~0.5877472E~38, ~0.17014117E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E4) = 0.722929E~35 + (~0.5877472E~38, ~0.123E4) = ~0.123E4 - (~0.5877472E~38, ~0.123E4) = 0.123E4 / (~0.5877472E~38, ~0.123E4) = 0.4778E~41 nextAfter (~0.5877472E~38, ~0.123E4) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E2) = 0.72292904E~37 + (~0.5877472E~38, ~0.123E2) = ~0.123E2 - (~0.5877472E~38, ~0.123E2) = 0.123E2 / (~0.5877472E~38, ~0.123E2) = 0.477843E~39 nextAfter (~0.5877472E~38, ~0.123E2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.31415927E1) = 0.18464623E~37 + (~0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (~0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (~0.5877472E~38, ~0.31415927E1) = 0.1870857E~38 nextAfter (~0.5877472E~38, ~0.31415927E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.27182817E1) = 0.15976624E~37 + (~0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (~0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (~0.5877472E~38, ~0.27182817E1) = 0.2162201E~38 nextAfter (~0.5877472E~38, ~0.27182817E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E1) = 0.722929E~38 + (~0.5877472E~38, ~0.123E1) = ~0.123E1 - (~0.5877472E~38, ~0.123E1) = 0.123E1 / (~0.5877472E~38, ~0.123E1) = 0.4778432E~38 nextAfter (~0.5877472E~38, ~0.123E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123) = 0.722928E~39 + (~0.5877472E~38, ~0.123) = ~0.123 - (~0.5877472E~38, ~0.123) = 0.123 / (~0.5877472E~38, ~0.123) = 0.4778432E~37 nextAfter (~0.5877472E~38, ~0.123) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E~2) = 0.7229E~41 + (~0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (~0.5877472E~38, ~0.123E~2) = 0.123E~2 / (~0.5877472E~38, ~0.123E~2) = 0.47784322E~35 nextAfter (~0.5877472E~38, ~0.123E~2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.11754944E~37) = 0.0 + (~0.5877472E~38, ~0.11754944E~37) = ~0.17632415E~37 - (~0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 / (~0.5877472E~38, ~0.11754944E~37) = 0.5 nextAfter (~0.5877472E~38, ~0.11754944E~37) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, ~0.5877472E~38) = 0.0 + (~0.5877472E~38, ~0.5877472E~38) = ~0.11754944E~37 - (~0.5877472E~38, ~0.5877472E~38) = 0.0 / (~0.5877472E~38, ~0.5877472E~38) = 0.1E1 nextAfter (~0.5877472E~38, ~0.5877472E~38) = ~0.5877472E~38 rem (~0.5877472E~38, ~0.5877472E~38) = 0.0 * (~0.5877472E~38, ~0.1E~44) = 0.0 + (~0.5877472E~38, ~0.1E~44) = ~0.5877473E~38 - (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 / (~0.5877472E~38, ~0.1E~44) = 0.4194304E7 nextAfter (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, ~0.1E~44) = 0.0 * (~0.5877472E~38, ~0.0) = 0.0 + (~0.5877472E~38, ~0.0) = ~0.5877472E~38 - (~0.5877472E~38, ~0.0) = ~0.5877472E~38 / (~0.5877472E~38, ~0.0) = inf nextAfter (~0.5877472E~38, ~0.0) = ~0.587747E~38 rem (~0.5877472E~38, ~0.0) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.5877472E~38, ~inf) = inf + (~0.5877472E~38, ~inf) = ~inf - (~0.5877472E~38, ~inf) = inf / (~0.5877472E~38, ~inf) = 0.0 nextAfter (~0.5877472E~38, ~inf) = ~0.5877473E~38 rem (~0.5877472E~38, ~inf) = ~0.5877472E~38 * (~0.5877472E~38, nan) = nan + (~0.5877472E~38, nan) = nan - (~0.5877472E~38, nan) = nan / (~0.5877472E~38, nan) = nan nextAfter (~0.5877472E~38, nan) = nan rem (~0.5877472E~38, nan) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.1E~44, 0.34028235E39) = ~0.47683713E~6 + (~0.1E~44, 0.34028235E39) = 0.34028235E39 - (~0.1E~44, 0.34028235E39) = ~0.34028235E39 / (~0.1E~44, 0.34028235E39) = ~0.0 nextAfter (~0.1E~44, 0.34028235E39) = ~0.0 rem (~0.1E~44, 0.34028235E39) = ~0.1E~44 * (~0.1E~44, 0.17014117E39) = ~0.23841856E~6 + (~0.1E~44, 0.17014117E39) = 0.17014117E39 - (~0.1E~44, 0.17014117E39) = ~0.17014117E39 / (~0.1E~44, 0.17014117E39) = ~0.0 nextAfter (~0.1E~44, 0.17014117E39) = ~0.0 rem (~0.1E~44, 0.17014117E39) = ~0.1E~44 * (~0.1E~44, 0.123E4) = ~0.1724E~41 + (~0.1E~44, 0.123E4) = 0.123E4 - (~0.1E~44, 0.123E4) = ~0.123E4 / (~0.1E~44, 0.123E4) = ~0.0 nextAfter (~0.1E~44, 0.123E4) = ~0.0 rem (~0.1E~44, 0.123E4) = ~0.1E~44 * (~0.1E~44, 0.123E2) = ~0.17E~43 + (~0.1E~44, 0.123E2) = 0.123E2 - (~0.1E~44, 0.123E2) = ~0.123E2 / (~0.1E~44, 0.123E2) = ~0.0 nextAfter (~0.1E~44, 0.123E2) = ~0.0 rem (~0.1E~44, 0.123E2) = ~0.1E~44 * (~0.1E~44, 0.31415927E1) = ~0.4E~44 + (~0.1E~44, 0.31415927E1) = 0.31415927E1 - (~0.1E~44, 0.31415927E1) = ~0.31415927E1 / (~0.1E~44, 0.31415927E1) = ~0.0 nextAfter (~0.1E~44, 0.31415927E1) = ~0.0 rem (~0.1E~44, 0.31415927E1) = ~0.1E~44 * (~0.1E~44, 0.27182817E1) = ~0.4E~44 + (~0.1E~44, 0.27182817E1) = 0.27182817E1 - (~0.1E~44, 0.27182817E1) = ~0.27182817E1 / (~0.1E~44, 0.27182817E1) = ~0.0 nextAfter (~0.1E~44, 0.27182817E1) = ~0.0 rem (~0.1E~44, 0.27182817E1) = ~0.1E~44 * (~0.1E~44, 0.123E1) = ~0.1E~44 + (~0.1E~44, 0.123E1) = 0.123E1 - (~0.1E~44, 0.123E1) = ~0.123E1 / (~0.1E~44, 0.123E1) = ~0.1E~44 nextAfter (~0.1E~44, 0.123E1) = ~0.0 rem (~0.1E~44, 0.123E1) = ~0.1E~44 * (~0.1E~44, 0.123) = ~0.0 + (~0.1E~44, 0.123) = 0.123 - (~0.1E~44, 0.123) = ~0.123 / (~0.1E~44, 0.123) = ~0.11E~43 nextAfter (~0.1E~44, 0.123) = ~0.0 rem (~0.1E~44, 0.123) = ~0.1E~44 * (~0.1E~44, 0.123E~2) = ~0.0 + (~0.1E~44, 0.123E~2) = 0.123E~2 - (~0.1E~44, 0.123E~2) = ~0.123E~2 / (~0.1E~44, 0.123E~2) = ~0.1139E~41 nextAfter (~0.1E~44, 0.123E~2) = ~0.0 rem (~0.1E~44, 0.123E~2) = ~0.1E~44 * (~0.1E~44, 0.11754944E~37) = ~0.0 + (~0.1E~44, 0.11754944E~37) = 0.11754942E~37 - (~0.1E~44, 0.11754944E~37) = ~0.11754945E~37 / (~0.1E~44, 0.11754944E~37) = ~0.11920929E~6 nextAfter (~0.1E~44, 0.11754944E~37) = ~0.0 rem (~0.1E~44, 0.11754944E~37) = ~0.1E~44 * (~0.1E~44, 0.5877472E~38) = ~0.0 + (~0.1E~44, 0.5877472E~38) = 0.587747E~38 - (~0.1E~44, 0.5877472E~38) = ~0.5877473E~38 / (~0.1E~44, 0.5877472E~38) = ~0.23841858E~6 nextAfter (~0.1E~44, 0.5877472E~38) = ~0.0 rem (~0.1E~44, 0.5877472E~38) = ~0.1E~44 * (~0.1E~44, 0.1E~44) = ~0.0 + (~0.1E~44, 0.1E~44) = 0.0 - (~0.1E~44, 0.1E~44) = ~0.3E~44 / (~0.1E~44, 0.1E~44) = ~0.1E1 nextAfter (~0.1E~44, 0.1E~44) = ~0.0 rem (~0.1E~44, 0.1E~44) = 0.0 * (~0.1E~44, 0.0) = ~0.0 + (~0.1E~44, 0.0) = ~0.1E~44 - (~0.1E~44, 0.0) = ~0.1E~44 / (~0.1E~44, 0.0) = ~inf nextAfter (~0.1E~44, 0.0) = ~0.0 rem (~0.1E~44, 0.0) = nan * (~0.1E~44, ~0.34028235E39) = 0.47683713E~6 + (~0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (~0.1E~44, ~0.34028235E39) = 0.34028235E39 / (~0.1E~44, ~0.34028235E39) = 0.0 nextAfter (~0.1E~44, ~0.34028235E39) = ~0.3E~44 rem (~0.1E~44, ~0.34028235E39) = ~0.1E~44 * (~0.1E~44, ~0.17014117E39) = 0.23841856E~6 + (~0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (~0.1E~44, ~0.17014117E39) = 0.17014117E39 / (~0.1E~44, ~0.17014117E39) = 0.0 nextAfter (~0.1E~44, ~0.17014117E39) = ~0.3E~44 rem (~0.1E~44, ~0.17014117E39) = ~0.1E~44 * (~0.1E~44, ~0.123E4) = 0.1724E~41 + (~0.1E~44, ~0.123E4) = ~0.123E4 - (~0.1E~44, ~0.123E4) = 0.123E4 / (~0.1E~44, ~0.123E4) = 0.0 nextAfter (~0.1E~44, ~0.123E4) = ~0.3E~44 rem (~0.1E~44, ~0.123E4) = ~0.1E~44 * (~0.1E~44, ~0.123E2) = 0.17E~43 + (~0.1E~44, ~0.123E2) = ~0.123E2 - (~0.1E~44, ~0.123E2) = 0.123E2 / (~0.1E~44, ~0.123E2) = 0.0 nextAfter (~0.1E~44, ~0.123E2) = ~0.3E~44 rem (~0.1E~44, ~0.123E2) = ~0.1E~44 * (~0.1E~44, ~0.31415927E1) = 0.4E~44 + (~0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (~0.1E~44, ~0.31415927E1) = 0.31415927E1 / (~0.1E~44, ~0.31415927E1) = 0.0 nextAfter (~0.1E~44, ~0.31415927E1) = ~0.3E~44 rem (~0.1E~44, ~0.31415927E1) = ~0.1E~44 * (~0.1E~44, ~0.27182817E1) = 0.4E~44 + (~0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (~0.1E~44, ~0.27182817E1) = 0.27182817E1 / (~0.1E~44, ~0.27182817E1) = 0.0 nextAfter (~0.1E~44, ~0.27182817E1) = ~0.3E~44 rem (~0.1E~44, ~0.27182817E1) = ~0.1E~44 * (~0.1E~44, ~0.123E1) = 0.1E~44 + (~0.1E~44, ~0.123E1) = ~0.123E1 - (~0.1E~44, ~0.123E1) = 0.123E1 / (~0.1E~44, ~0.123E1) = 0.1E~44 nextAfter (~0.1E~44, ~0.123E1) = ~0.3E~44 rem (~0.1E~44, ~0.123E1) = ~0.1E~44 * (~0.1E~44, ~0.123) = 0.0 + (~0.1E~44, ~0.123) = ~0.123 - (~0.1E~44, ~0.123) = 0.123 / (~0.1E~44, ~0.123) = 0.11E~43 nextAfter (~0.1E~44, ~0.123) = ~0.3E~44 rem (~0.1E~44, ~0.123) = ~0.1E~44 * (~0.1E~44, ~0.123E~2) = 0.0 + (~0.1E~44, ~0.123E~2) = ~0.123E~2 - (~0.1E~44, ~0.123E~2) = 0.123E~2 / (~0.1E~44, ~0.123E~2) = 0.1139E~41 nextAfter (~0.1E~44, ~0.123E~2) = ~0.3E~44 rem (~0.1E~44, ~0.123E~2) = ~0.1E~44 * (~0.1E~44, ~0.11754944E~37) = 0.0 + (~0.1E~44, ~0.11754944E~37) = ~0.11754945E~37 - (~0.1E~44, ~0.11754944E~37) = 0.11754942E~37 / (~0.1E~44, ~0.11754944E~37) = 0.11920929E~6 nextAfter (~0.1E~44, ~0.11754944E~37) = ~0.3E~44 rem (~0.1E~44, ~0.11754944E~37) = ~0.1E~44 * (~0.1E~44, ~0.5877472E~38) = 0.0 + (~0.1E~44, ~0.5877472E~38) = ~0.5877473E~38 - (~0.1E~44, ~0.5877472E~38) = 0.587747E~38 / (~0.1E~44, ~0.5877472E~38) = 0.23841858E~6 nextAfter (~0.1E~44, ~0.5877472E~38) = ~0.3E~44 rem (~0.1E~44, ~0.5877472E~38) = ~0.1E~44 * (~0.1E~44, ~0.1E~44) = 0.0 + (~0.1E~44, ~0.1E~44) = ~0.3E~44 - (~0.1E~44, ~0.1E~44) = 0.0 / (~0.1E~44, ~0.1E~44) = 0.1E1 nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 rem (~0.1E~44, ~0.1E~44) = 0.0 * (~0.1E~44, ~0.0) = 0.0 + (~0.1E~44, ~0.0) = ~0.1E~44 - (~0.1E~44, ~0.0) = ~0.1E~44 / (~0.1E~44, ~0.0) = inf nextAfter (~0.1E~44, ~0.0) = ~0.0 rem (~0.1E~44, ~0.0) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.1E~44, ~inf) = inf + (~0.1E~44, ~inf) = ~inf - (~0.1E~44, ~inf) = inf / (~0.1E~44, ~inf) = 0.0 nextAfter (~0.1E~44, ~inf) = ~0.3E~44 rem (~0.1E~44, ~inf) = ~0.1E~44 * (~0.1E~44, nan) = nan + (~0.1E~44, nan) = nan - (~0.1E~44, nan) = nan / (~0.1E~44, nan) = nan nextAfter (~0.1E~44, nan) = nan rem (~0.1E~44, nan) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.0, 0.34028235E39) = ~0.0 + (~0.0, 0.34028235E39) = 0.34028235E39 - (~0.0, 0.34028235E39) = ~0.34028235E39 / (~0.0, 0.34028235E39) = ~0.0 nextAfter (~0.0, 0.34028235E39) = 0.1E~44 rem (~0.0, 0.34028235E39) = 0.0 * (~0.0, 0.17014117E39) = ~0.0 + (~0.0, 0.17014117E39) = 0.17014117E39 - (~0.0, 0.17014117E39) = ~0.17014117E39 / (~0.0, 0.17014117E39) = ~0.0 nextAfter (~0.0, 0.17014117E39) = 0.1E~44 rem (~0.0, 0.17014117E39) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.1E~44 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.1E~44 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.31415927E1) = ~0.0 + (~0.0, 0.31415927E1) = 0.31415927E1 - (~0.0, 0.31415927E1) = ~0.31415927E1 / (~0.0, 0.31415927E1) = ~0.0 nextAfter (~0.0, 0.31415927E1) = 0.1E~44 rem (~0.0, 0.31415927E1) = 0.0 * (~0.0, 0.27182817E1) = ~0.0 + (~0.0, 0.27182817E1) = 0.27182817E1 - (~0.0, 0.27182817E1) = ~0.27182817E1 / (~0.0, 0.27182817E1) = ~0.0 nextAfter (~0.0, 0.27182817E1) = 0.1E~44 rem (~0.0, 0.27182817E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.1E~44 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.1E~44 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.1E~44 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.11754944E~37) = ~0.0 + (~0.0, 0.11754944E~37) = 0.11754944E~37 - (~0.0, 0.11754944E~37) = ~0.11754944E~37 / (~0.0, 0.11754944E~37) = ~0.0 nextAfter (~0.0, 0.11754944E~37) = 0.1E~44 rem (~0.0, 0.11754944E~37) = 0.0 * (~0.0, 0.5877472E~38) = ~0.0 + (~0.0, 0.5877472E~38) = 0.5877472E~38 - (~0.0, 0.5877472E~38) = ~0.5877472E~38 / (~0.0, 0.5877472E~38) = ~0.0 nextAfter (~0.0, 0.5877472E~38) = 0.1E~44 rem (~0.0, 0.5877472E~38) = 0.0 * (~0.0, 0.1E~44) = ~0.0 + (~0.0, 0.1E~44) = 0.1E~44 - (~0.0, 0.1E~44) = ~0.1E~44 / (~0.0, 0.1E~44) = ~0.0 nextAfter (~0.0, 0.1E~44) = 0.1E~44 rem (~0.0, 0.1E~44) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.34028235E39) = 0.0 + (~0.0, ~0.34028235E39) = ~0.34028235E39 - (~0.0, ~0.34028235E39) = 0.34028235E39 / (~0.0, ~0.34028235E39) = 0.0 nextAfter (~0.0, ~0.34028235E39) = ~0.1E~44 rem (~0.0, ~0.34028235E39) = 0.0 * (~0.0, ~0.17014117E39) = 0.0 + (~0.0, ~0.17014117E39) = ~0.17014117E39 - (~0.0, ~0.17014117E39) = 0.17014117E39 / (~0.0, ~0.17014117E39) = 0.0 nextAfter (~0.0, ~0.17014117E39) = ~0.1E~44 rem (~0.0, ~0.17014117E39) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.1E~44 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.1E~44 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.31415927E1) = 0.0 + (~0.0, ~0.31415927E1) = ~0.31415927E1 - (~0.0, ~0.31415927E1) = 0.31415927E1 / (~0.0, ~0.31415927E1) = 0.0 nextAfter (~0.0, ~0.31415927E1) = ~0.1E~44 rem (~0.0, ~0.31415927E1) = 0.0 * (~0.0, ~0.27182817E1) = 0.0 + (~0.0, ~0.27182817E1) = ~0.27182817E1 - (~0.0, ~0.27182817E1) = 0.27182817E1 / (~0.0, ~0.27182817E1) = 0.0 nextAfter (~0.0, ~0.27182817E1) = ~0.1E~44 rem (~0.0, ~0.27182817E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.1E~44 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.1E~44 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.1E~44 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.11754944E~37) = 0.0 + (~0.0, ~0.11754944E~37) = ~0.11754944E~37 - (~0.0, ~0.11754944E~37) = 0.11754944E~37 / (~0.0, ~0.11754944E~37) = 0.0 nextAfter (~0.0, ~0.11754944E~37) = ~0.1E~44 rem (~0.0, ~0.11754944E~37) = 0.0 * (~0.0, ~0.5877472E~38) = 0.0 + (~0.0, ~0.5877472E~38) = ~0.5877472E~38 - (~0.0, ~0.5877472E~38) = 0.5877472E~38 / (~0.0, ~0.5877472E~38) = 0.0 nextAfter (~0.0, ~0.5877472E~38) = ~0.1E~44 rem (~0.0, ~0.5877472E~38) = 0.0 * (~0.0, ~0.1E~44) = 0.0 + (~0.0, ~0.1E~44) = ~0.1E~44 - (~0.0, ~0.1E~44) = 0.1E~44 / (~0.0, ~0.1E~44) = 0.0 nextAfter (~0.0, ~0.1E~44) = ~0.1E~44 rem (~0.0, ~0.1E~44) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.1E~44 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.34028235E39) = ~inf + (~inf, 0.34028235E39) = ~inf - (~inf, 0.34028235E39) = ~inf / (~inf, 0.34028235E39) = ~inf nextAfter (~inf, 0.34028235E39) = ~inf rem (~inf, 0.34028235E39) = nan * (~inf, 0.17014117E39) = ~inf + (~inf, 0.17014117E39) = ~inf - (~inf, 0.17014117E39) = ~inf / (~inf, 0.17014117E39) = ~inf nextAfter (~inf, 0.17014117E39) = ~inf rem (~inf, 0.17014117E39) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.31415927E1) = ~inf + (~inf, 0.31415927E1) = ~inf - (~inf, 0.31415927E1) = ~inf / (~inf, 0.31415927E1) = ~inf nextAfter (~inf, 0.31415927E1) = ~inf rem (~inf, 0.31415927E1) = nan * (~inf, 0.27182817E1) = ~inf + (~inf, 0.27182817E1) = ~inf - (~inf, 0.27182817E1) = ~inf / (~inf, 0.27182817E1) = ~inf nextAfter (~inf, 0.27182817E1) = ~inf rem (~inf, 0.27182817E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.11754944E~37) = ~inf + (~inf, 0.11754944E~37) = ~inf - (~inf, 0.11754944E~37) = ~inf / (~inf, 0.11754944E~37) = ~inf nextAfter (~inf, 0.11754944E~37) = ~inf rem (~inf, 0.11754944E~37) = nan * (~inf, 0.5877472E~38) = ~inf + (~inf, 0.5877472E~38) = ~inf - (~inf, 0.5877472E~38) = ~inf / (~inf, 0.5877472E~38) = ~inf nextAfter (~inf, 0.5877472E~38) = ~inf rem (~inf, 0.5877472E~38) = nan * (~inf, 0.1E~44) = ~inf + (~inf, 0.1E~44) = ~inf - (~inf, 0.1E~44) = ~inf / (~inf, 0.1E~44) = ~inf nextAfter (~inf, 0.1E~44) = ~inf rem (~inf, 0.1E~44) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.34028235E39) = inf + (~inf, ~0.34028235E39) = ~inf - (~inf, ~0.34028235E39) = ~inf / (~inf, ~0.34028235E39) = inf nextAfter (~inf, ~0.34028235E39) = ~inf rem (~inf, ~0.34028235E39) = nan * (~inf, ~0.17014117E39) = inf + (~inf, ~0.17014117E39) = ~inf - (~inf, ~0.17014117E39) = ~inf / (~inf, ~0.17014117E39) = inf nextAfter (~inf, ~0.17014117E39) = ~inf rem (~inf, ~0.17014117E39) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.31415927E1) = inf + (~inf, ~0.31415927E1) = ~inf - (~inf, ~0.31415927E1) = ~inf / (~inf, ~0.31415927E1) = inf nextAfter (~inf, ~0.31415927E1) = ~inf rem (~inf, ~0.31415927E1) = nan * (~inf, ~0.27182817E1) = inf + (~inf, ~0.27182817E1) = ~inf - (~inf, ~0.27182817E1) = ~inf / (~inf, ~0.27182817E1) = inf nextAfter (~inf, ~0.27182817E1) = ~inf rem (~inf, ~0.27182817E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.11754944E~37) = inf + (~inf, ~0.11754944E~37) = ~inf - (~inf, ~0.11754944E~37) = ~inf / (~inf, ~0.11754944E~37) = inf nextAfter (~inf, ~0.11754944E~37) = ~inf rem (~inf, ~0.11754944E~37) = nan * (~inf, ~0.5877472E~38) = inf + (~inf, ~0.5877472E~38) = ~inf - (~inf, ~0.5877472E~38) = ~inf / (~inf, ~0.5877472E~38) = inf nextAfter (~inf, ~0.5877472E~38) = ~inf rem (~inf, ~0.5877472E~38) = nan * (~inf, ~0.1E~44) = inf + (~inf, ~0.1E~44) = ~inf - (~inf, ~0.1E~44) = ~inf / (~inf, ~0.1E~44) = inf nextAfter (~inf, ~0.1E~44) = ~inf rem (~inf, ~0.1E~44) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.34028235E39) = nan + (nan, 0.34028235E39) = nan - (nan, 0.34028235E39) = nan / (nan, 0.34028235E39) = nan nextAfter (nan, 0.34028235E39) = nan rem (nan, 0.34028235E39) = nan * (nan, 0.17014117E39) = nan + (nan, 0.17014117E39) = nan - (nan, 0.17014117E39) = nan / (nan, 0.17014117E39) = nan nextAfter (nan, 0.17014117E39) = nan rem (nan, 0.17014117E39) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.31415927E1) = nan + (nan, 0.31415927E1) = nan - (nan, 0.31415927E1) = nan / (nan, 0.31415927E1) = nan nextAfter (nan, 0.31415927E1) = nan rem (nan, 0.31415927E1) = nan * (nan, 0.27182817E1) = nan + (nan, 0.27182817E1) = nan - (nan, 0.27182817E1) = nan / (nan, 0.27182817E1) = nan nextAfter (nan, 0.27182817E1) = nan rem (nan, 0.27182817E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.11754944E~37) = nan + (nan, 0.11754944E~37) = nan - (nan, 0.11754944E~37) = nan / (nan, 0.11754944E~37) = nan nextAfter (nan, 0.11754944E~37) = nan rem (nan, 0.11754944E~37) = nan * (nan, 0.5877472E~38) = nan + (nan, 0.5877472E~38) = nan - (nan, 0.5877472E~38) = nan / (nan, 0.5877472E~38) = nan nextAfter (nan, 0.5877472E~38) = nan rem (nan, 0.5877472E~38) = nan * (nan, 0.1E~44) = nan + (nan, 0.1E~44) = nan - (nan, 0.1E~44) = nan / (nan, 0.1E~44) = nan nextAfter (nan, 0.1E~44) = nan rem (nan, 0.1E~44) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.34028235E39) = nan + (nan, ~0.34028235E39) = nan - (nan, ~0.34028235E39) = nan / (nan, ~0.34028235E39) = nan nextAfter (nan, ~0.34028235E39) = nan rem (nan, ~0.34028235E39) = nan * (nan, ~0.17014117E39) = nan + (nan, ~0.17014117E39) = nan - (nan, ~0.17014117E39) = nan / (nan, ~0.17014117E39) = nan nextAfter (nan, ~0.17014117E39) = nan rem (nan, ~0.17014117E39) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.31415927E1) = nan + (nan, ~0.31415927E1) = nan - (nan, ~0.31415927E1) = nan / (nan, ~0.31415927E1) = nan nextAfter (nan, ~0.31415927E1) = nan rem (nan, ~0.31415927E1) = nan * (nan, ~0.27182817E1) = nan + (nan, ~0.27182817E1) = nan - (nan, ~0.27182817E1) = nan / (nan, ~0.27182817E1) = nan nextAfter (nan, ~0.27182817E1) = nan rem (nan, ~0.27182817E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.11754944E~37) = nan + (nan, ~0.11754944E~37) = nan - (nan, ~0.11754944E~37) = nan / (nan, ~0.11754944E~37) = nan nextAfter (nan, ~0.11754944E~37) = nan rem (nan, ~0.11754944E~37) = nan * (nan, ~0.5877472E~38) = nan + (nan, ~0.5877472E~38) = nan - (nan, ~0.5877472E~38) = nan / (nan, ~0.5877472E~38) = nan nextAfter (nan, ~0.5877472E~38) = nan rem (nan, ~0.5877472E~38) = nan * (nan, ~0.1E~44) = nan + (nan, ~0.1E~44) = nan - (nan, ~0.1E~44) = nan / (nan, ~0.1E~44) = nan nextAfter (nan, ~0.1E~44) = nan rem (nan, ~0.1E~44) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.34028235E39) = nan asin (0.34028235E39) = nan atan (0.34028235E39) = 1.570796251 cos (0.34028235E39) = 0.8530210257 cosh (0.34028235E39) = inf exp (0.34028235E39) = inf ln (0.34028235E39) = 88.72283936 log10 (0.34028235E39) = 38.53184128 sin (0.34028235E39) = ~0.521876514 sinh (0.34028235E39) = inf sqrt (0.34028235E39) = 1.844674297E19 tan (0.34028235E39) = ~0.6117979288 tanh (0.34028235E39) = 1 acos (0.17014117E39) = nan asin (0.17014117E39) = nan atan (0.17014117E39) = 1.570796251 cos (0.17014117E39) = ~0.9625541568 cosh (0.17014117E39) = inf exp (0.17014117E39) = inf ln (0.17014117E39) = 88.0296936 log10 (0.17014117E39) = 38.23080826 sin (0.17014117E39) = 0.2710894346 sinh (0.17014117E39) = inf sqrt (0.17014117E39) = 1.30438176E19 tan (0.17014117E39) = ~0.281635493 tanh (0.17014117E39) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983363 cos (0.123E4) = 0.06642717123 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769459 log10 (0.123E4) = 3.089905024 sin (0.123E4) = ~0.9977912903 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135773 tan (0.123E4) = ~15.02083111 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673972 cos (0.123E2) = 0.9647326469 cosh (0.123E2) = 109848.0156 exp (0.123E2) = 219696.0312 ln (0.123E2) = 2.509599209 log10 (0.123E2) = 1.089905143 sin (0.123E2) = ~0.2632316053 sinh (0.123E2) = 109848.0156 sqrt (0.123E2) = 3.50713563 tan (0.123E2) = ~0.2728544474 tanh (0.123E2) = 1 acos (0.31415927E1) = nan asin (0.31415927E1) = nan atan (0.31415927E1) = 1.262627244 cos (0.31415927E1) = ~1 cosh (0.31415927E1) = 11.59195423 exp (0.31415927E1) = 23.14069557 ln (0.31415927E1) = 1.144729972 log10 (0.31415927E1) = 0.4971498847 sin (0.31415927E1) = ~8.742277657E~8 sinh (0.31415927E1) = 11.54874039 sqrt (0.31415927E1) = 1.772453904 tan (0.31415927E1) = 8.742277657E~8 tanh (0.31415927E1) = 0.9962720871 acos (0.27182817E1) = nan asin (0.27182817E1) = nan atan (0.27182817E1) = 1.218282938 cos (0.27182817E1) = ~0.9117338657 cosh (0.27182817E1) = 7.610124588 exp (0.27182817E1) = 15.15426064 ln (0.27182817E1) = 0.9999999404 log10 (0.27182817E1) = 0.4342944622 sin (0.27182817E1) = 0.4107813537 sinh (0.27182817E1) = 7.544136524 sqrt (0.27182817E1) = 1.648721218 tan (0.27182817E1) = ~0.4505496323 tanh (0.27182817E1) = 0.9913288951 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.888173759 cos (0.123E1) = 0.3342376947 cosh (0.123E1) = 1.856761098 exp (0.123E1) = 3.421229601 ln (0.123E1) = 0.2070141882 log10 (0.123E1) = 0.08990512043 sin (0.123E1) = 0.9424887896 sinh (0.123E1) = 1.564468503 sqrt (0.123E1) = 1.109053612 tan (0.123E1) = 2.819815874 tanh (0.123E1) = 0.8425793052 acos (0.123) = 1.447484016 asin (0.123) = 0.1233122796 atan (0.123) = 0.1223852858 cos (0.123) = 0.9924450517 cosh (0.123) = 1.007574081 exp (0.123) = 1.130884409 ln (0.123) = ~2.095570803 log10 (0.123) = ~0.9100948572 sin (0.123) = 0.1226900965 sinh (0.123) = 0.1233103797 sqrt (0.123) = 0.350713551 tan (0.123) = 0.1236240715 tanh (0.123) = 0.1223834455 acos (0.123E~2) = 1.569566369 asin (0.123E~2) = 0.001230000402 atan (0.123E~2) = 0.001229999471 cos (0.123E~2) = 0.9999992251 cosh (0.123E~2) = 1.000000715 exp (0.123E~2) = 1.001230717 ln (0.123E~2) = ~6.700741291 log10 (0.123E~2) = ~2.910094976 sin (0.123E~2) = 0.001229999703 sinh (0.123E~2) = 0.001230000402 sqrt (0.123E~2) = 0.03507135808 tan (0.123E~2) = 0.001230000635 tanh (0.123E~2) = 0.001229999471 acos (0.11754944E~37) = 1.570796371 asin (0.11754944E~37) = 1.175494351E~38 atan (0.11754944E~37) = 1.175494351E~38 cos (0.11754944E~37) = 1 cosh (0.11754944E~37) = 1 exp (0.11754944E~37) = 1 ln (0.11754944E~37) = ~87.33654785 log10 (0.11754944E~37) = ~37.92977905 sin (0.11754944E~37) = 1.175494351E~38 sinh (0.11754944E~37) = 1.175494351E~38 sqrt (0.11754944E~37) = 1.084202172E~19 tan (0.11754944E~37) = 1.175494351E~38 tanh (0.11754944E~37) = 1.175494351E~38 acos (0.5877472E~38) = 1.570796371 asin (0.5877472E~38) = 5.877471754E~39 atan (0.5877472E~38) = 5.877471754E~39 cos (0.5877472E~38) = 1 cosh (0.5877472E~38) = 1 exp (0.5877472E~38) = 1 ln (0.5877472E~38) = ~88.0296936 log10 (0.5877472E~38) = ~38.23080826 sin (0.5877472E~38) = 5.877471754E~39 sinh (0.5877472E~38) = 5.877471754E~39 sqrt (0.5877472E~38) = 7.666466952E~20 tan (0.5877472E~38) = 5.877471754E~39 tanh (0.5877472E~38) = 5.877471754E~39 acos (0.1E~44) = 1.570796371 asin (0.1E~44) = 1.401298464E~45 atan (0.1E~44) = 1.401298464E~45 cos (0.1E~44) = 1 cosh (0.1E~44) = 1 exp (0.1E~44) = 1 ln (0.1E~44) = ~103.2789307 log10 (0.1E~44) = ~44.85346985 sin (0.1E~44) = 1.401298464E~45 sinh (0.1E~44) = 1.401298464E~45 sqrt (0.1E~44) = 3.743392067E~23 tan (0.1E~44) = 1.401298464E~45 tanh (0.1E~44) = 1.401298464E~45 acos (0.0) = 1.570796371 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.34028235E39) = nan asin (~0.34028235E39) = nan atan (~0.34028235E39) = ~1.570796251 cos (~0.34028235E39) = 0.8530210257 cosh (~0.34028235E39) = inf exp (~0.34028235E39) = 0 ln (~0.34028235E39) = nan log10 (~0.34028235E39) = nan sin (~0.34028235E39) = 0.521876514 sinh (~0.34028235E39) = ~inf sqrt (~0.34028235E39) = nan tan (~0.34028235E39) = 0.6117979288 tanh (~0.34028235E39) = ~1 acos (~0.17014117E39) = nan asin (~0.17014117E39) = nan atan (~0.17014117E39) = ~1.570796251 cos (~0.17014117E39) = ~0.9625541568 cosh (~0.17014117E39) = inf exp (~0.17014117E39) = 0 ln (~0.17014117E39) = nan log10 (~0.17014117E39) = nan sin (~0.17014117E39) = ~0.2710894346 sinh (~0.17014117E39) = ~inf sqrt (~0.17014117E39) = nan tan (~0.17014117E39) = 0.281635493 tanh (~0.17014117E39) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983363 cos (~0.123E4) = 0.06642717123 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912903 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083111 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673972 cos (~0.123E2) = 0.9647326469 cosh (~0.123E2) = 109848.0156 exp (~0.123E2) = 4.551743586E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632316053 sinh (~0.123E2) = ~109848.0156 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.2728544474 tanh (~0.123E2) = ~1 acos (~0.31415927E1) = nan asin (~0.31415927E1) = nan atan (~0.31415927E1) = ~1.262627244 cos (~0.31415927E1) = ~1 cosh (~0.31415927E1) = 11.59195423 exp (~0.31415927E1) = 0.04321391508 ln (~0.31415927E1) = nan log10 (~0.31415927E1) = nan sin (~0.31415927E1) = 8.742277657E~8 sinh (~0.31415927E1) = ~11.54874039 sqrt (~0.31415927E1) = nan tan (~0.31415927E1) = ~8.742277657E~8 tanh (~0.31415927E1) = ~0.9962720871 acos (~0.27182817E1) = nan asin (~0.27182817E1) = nan atan (~0.27182817E1) = ~1.218282938 cos (~0.27182817E1) = ~0.9117338657 cosh (~0.27182817E1) = 7.610124588 exp (~0.27182817E1) = 0.06598804146 ln (~0.27182817E1) = nan log10 (~0.27182817E1) = nan sin (~0.27182817E1) = ~0.4107813537 sinh (~0.27182817E1) = ~7.544136524 sqrt (~0.27182817E1) = nan tan (~0.27182817E1) = 0.4505496323 tanh (~0.27182817E1) = ~0.9913288951 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.888173759 cos (~0.123E1) = 0.3342376947 cosh (~0.123E1) = 1.856761098 exp (~0.123E1) = 0.2922925651 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424887896 sinh (~0.123E1) = ~1.564468503 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815874 tanh (~0.123E1) = ~0.8425793052 acos (~0.123) = 1.694108605 asin (~0.123) = ~0.1233122796 atan (~0.123) = ~0.1223852858 cos (~0.123) = 0.9924450517 cosh (~0.123) = 1.007574081 exp (~0.123) = 0.8842636347 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.1226900965 sinh (~0.123) = ~0.1233103797 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240715 tanh (~0.123) = ~0.1223834455 acos (~0.123E~2) = 1.572026372 asin (~0.123E~2) = ~0.001230000402 atan (~0.123E~2) = ~0.001229999471 cos (~0.123E~2) = 0.9999992251 cosh (~0.123E~2) = 1.000000715 exp (~0.123E~2) = 0.9987707734 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.001229999703 sinh (~0.123E~2) = ~0.001230000402 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.001230000635 tanh (~0.123E~2) = ~0.001229999471 acos (~0.11754944E~37) = 1.570796371 asin (~0.11754944E~37) = ~1.175494351E~38 atan (~0.11754944E~37) = ~1.175494351E~38 cos (~0.11754944E~37) = 1 cosh (~0.11754944E~37) = 1 exp (~0.11754944E~37) = 1 ln (~0.11754944E~37) = nan log10 (~0.11754944E~37) = nan sin (~0.11754944E~37) = ~1.175494351E~38 sinh (~0.11754944E~37) = ~1.175494351E~38 sqrt (~0.11754944E~37) = nan tan (~0.11754944E~37) = ~1.175494351E~38 tanh (~0.11754944E~37) = ~1.175494351E~38 acos (~0.5877472E~38) = 1.570796371 asin (~0.5877472E~38) = ~5.877471754E~39 atan (~0.5877472E~38) = ~5.877471754E~39 cos (~0.5877472E~38) = 1 cosh (~0.5877472E~38) = 1 exp (~0.5877472E~38) = 1 ln (~0.5877472E~38) = nan log10 (~0.5877472E~38) = nan sin (~0.5877472E~38) = ~5.877471754E~39 sinh (~0.5877472E~38) = ~5.877471754E~39 sqrt (~0.5877472E~38) = nan tan (~0.5877472E~38) = ~5.877471754E~39 tanh (~0.5877472E~38) = ~5.877471754E~39 acos (~0.1E~44) = 1.570796371 asin (~0.1E~44) = ~1.401298464E~45 atan (~0.1E~44) = ~1.401298464E~45 cos (~0.1E~44) = 1 cosh (~0.1E~44) = 1 exp (~0.1E~44) = 1 ln (~0.1E~44) = nan log10 (~0.1E~44) = nan sin (~0.1E~44) = ~1.401298464E~45 sinh (~0.1E~44) = ~1.401298464E~45 sqrt (~0.1E~44) = nan tan (~0.1E~44) = ~1.401298464E~45 tanh (~0.1E~44) = ~1.401298464E~45 acos (~0.0) = 1.570796371 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796251 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796251 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796251 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.34028235E39, 0.34028235E39) = 0.7853981853 pow (0.34028235E39, 0.34028235E39) = inf atan2 (0.34028235E39, 0.17014117E39) = 1.107148767 pow (0.34028235E39, 0.17014117E39) = inf atan2 (0.34028235E39, 0.123E4) = 1.570796371 pow (0.34028235E39, 0.123E4) = inf atan2 (0.34028235E39, 0.123E2) = 1.570796371 pow (0.34028235E39, 0.123E2) = inf atan2 (0.34028235E39, 0.31415927E1) = 1.570796371 pow (0.34028235E39, 0.31415927E1) = inf atan2 (0.34028235E39, 0.27182817E1) = 1.570796371 pow (0.34028235E39, 0.27182817E1) = inf atan2 (0.34028235E39, 0.123E1) = 1.570796371 pow (0.34028235E39, 0.123E1) = inf atan2 (0.34028235E39, 0.123) = 1.570796371 pow (0.34028235E39, 0.123) = 54880.28906 atan2 (0.34028235E39, 0.123E~2) = 1.570796371 pow (0.34028235E39, 0.123E~2) = 1.115306377 atan2 (0.34028235E39, 0.11754944E~37) = 1.570796371 pow (0.34028235E39, 0.11754944E~37) = 1 atan2 (0.34028235E39, 0.5877472E~38) = 1.570796371 pow (0.34028235E39, 0.5877472E~38) = 1 atan2 (0.34028235E39, 0.1E~44) = 1.570796371 pow (0.34028235E39, 0.1E~44) = 1 atan2 (0.34028235E39, 0.0) = 1.570796371 pow (0.34028235E39, 0.0) = 1 atan2 (0.34028235E39, ~0.34028235E39) = 2.356194496 pow (0.34028235E39, ~0.34028235E39) = 0 atan2 (0.34028235E39, ~0.17014117E39) = 2.034443855 pow (0.34028235E39, ~0.17014117E39) = 0 atan2 (0.34028235E39, ~0.123E4) = 1.570796371 pow (0.34028235E39, ~0.123E4) = 0 atan2 (0.34028235E39, ~0.123E2) = 1.570796371 pow (0.34028235E39, ~0.123E2) = 0 atan2 (0.34028235E39, ~0.31415927E1) = 1.570796371 pow (0.34028235E39, ~0.31415927E1) = 0 atan2 (0.34028235E39, ~0.27182817E1) = 1.570796371 pow (0.34028235E39, ~0.27182817E1) = 0 atan2 (0.34028235E39, ~0.123E1) = 1.570796371 pow (0.34028235E39, ~0.123E1) = 0 atan2 (0.34028235E39, ~0.123) = 1.570796371 pow (0.34028235E39, ~0.123) = 1.822147897E~5 atan2 (0.34028235E39, ~0.123E~2) = 1.570796371 pow (0.34028235E39, ~0.123E~2) = 0.8966146708 atan2 (0.34028235E39, ~0.11754944E~37) = 1.570796371 pow (0.34028235E39, ~0.11754944E~37) = 1 atan2 (0.34028235E39, ~0.5877472E~38) = 1.570796371 pow (0.34028235E39, ~0.5877472E~38) = 1 atan2 (0.34028235E39, ~0.1E~44) = 1.570796371 pow (0.34028235E39, ~0.1E~44) = 1 atan2 (0.34028235E39, ~0.0) = 1.570796371 pow (0.34028235E39, ~0.0) = 1 atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.34028235E39, ~inf) = 3.141592503 pow (0.34028235E39, ~inf) = 0 atan2 (0.34028235E39, nan) = nan pow (0.34028235E39, nan) = nan atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.17014117E39, 0.34028235E39) = 0.463647604 pow (0.17014117E39, 0.34028235E39) = inf atan2 (0.17014117E39, 0.17014117E39) = 0.7853981853 pow (0.17014117E39, 0.17014117E39) = inf atan2 (0.17014117E39, 0.123E4) = 1.570796371 pow (0.17014117E39, 0.123E4) = inf atan2 (0.17014117E39, 0.123E2) = 1.570796371 pow (0.17014117E39, 0.123E2) = inf atan2 (0.17014117E39, 0.31415927E1) = 1.570796371 pow (0.17014117E39, 0.31415927E1) = inf atan2 (0.17014117E39, 0.27182817E1) = 1.570796371 pow (0.17014117E39, 0.27182817E1) = inf atan2 (0.17014117E39, 0.123E1) = 1.570796371 pow (0.17014117E39, 0.123E1) = inf atan2 (0.17014117E39, 0.123) = 1.570796371 pow (0.17014117E39, 0.123) = 50395.26172 atan2 (0.17014117E39, 0.123E~2) = 1.570796371 pow (0.17014117E39, 0.123E~2) = 1.114355803 atan2 (0.17014117E39, 0.11754944E~37) = 1.570796371 pow (0.17014117E39, 0.11754944E~37) = 1 atan2 (0.17014117E39, 0.5877472E~38) = 1.570796371 pow (0.17014117E39, 0.5877472E~38) = 1 atan2 (0.17014117E39, 0.1E~44) = 1.570796371 pow (0.17014117E39, 0.1E~44) = 1 atan2 (0.17014117E39, 0.0) = 1.570796371 pow (0.17014117E39, 0.0) = 1 atan2 (0.17014117E39, ~0.34028235E39) = 2.677945137 pow (0.17014117E39, ~0.34028235E39) = 0 atan2 (0.17014117E39, ~0.17014117E39) = 2.356194496 pow (0.17014117E39, ~0.17014117E39) = 0 atan2 (0.17014117E39, ~0.123E4) = 1.570796371 pow (0.17014117E39, ~0.123E4) = 0 atan2 (0.17014117E39, ~0.123E2) = 1.570796371 pow (0.17014117E39, ~0.123E2) = 0 atan2 (0.17014117E39, ~0.31415927E1) = 1.570796371 pow (0.17014117E39, ~0.31415927E1) = 0 atan2 (0.17014117E39, ~0.27182817E1) = 1.570796371 pow (0.17014117E39, ~0.27182817E1) = 0 atan2 (0.17014117E39, ~0.123E1) = 1.570796371 pow (0.17014117E39, ~0.123E1) = 0 atan2 (0.17014117E39, ~0.123) = 1.570796371 pow (0.17014117E39, ~0.123) = 1.984313531E~5 atan2 (0.17014117E39, ~0.123E~2) = 1.570796371 pow (0.17014117E39, ~0.123E~2) = 0.8973793983 atan2 (0.17014117E39, ~0.11754944E~37) = 1.570796371 pow (0.17014117E39, ~0.11754944E~37) = 1 atan2 (0.17014117E39, ~0.5877472E~38) = 1.570796371 pow (0.17014117E39, ~0.5877472E~38) = 1 atan2 (0.17014117E39, ~0.1E~44) = 1.570796371 pow (0.17014117E39, ~0.1E~44) = 1 atan2 (0.17014117E39, ~0.0) = 1.570796371 pow (0.17014117E39, ~0.0) = 1 atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.17014117E39, ~inf) = 3.141592503 pow (0.17014117E39, ~inf) = 0 atan2 (0.17014117E39, nan) = nan pow (0.17014117E39, nan) = nan atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.123E4, 0.34028235E39) = 3.614645488E~36 pow (0.123E4, 0.34028235E39) = inf atan2 (0.123E4, 0.17014117E39) = 7.229290975E~36 pow (0.123E4, 0.17014117E39) = inf atan2 (0.123E4, 0.123E4) = 0.7853981853 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.560796618 pow (0.123E4, 0.123E2) = 1.013522656E38 atan2 (0.123E4, 0.31415927E1) = 1.568242192 pow (0.123E4, 0.31415927E1) = 5095930368 atan2 (0.123E4, 0.27182817E1) = 1.568586349 pow (0.123E4, 0.27182817E1) = 250745216 atan2 (0.123E4, 0.123E1) = 1.569796324 pow (0.123E4, 0.123E1) = 6318.054199 atan2 (0.123E4, 0.123) = 1.570696354 pow (0.123E4, 0.123) = 2.39915514 atan2 (0.123E4, 0.123E~2) = 1.570795298 pow (0.123E4, 0.123E~2) = 1.008789539 atan2 (0.123E4, 0.11754944E~37) = 1.570796371 pow (0.123E4, 0.11754944E~37) = 1 atan2 (0.123E4, 0.5877472E~38) = 1.570796371 pow (0.123E4, 0.5877472E~38) = 1 atan2 (0.123E4, 0.1E~44) = 1.570796371 pow (0.123E4, 0.1E~44) = 1 atan2 (0.123E4, 0.0) = 1.570796371 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.34028235E39) = 3.141592503 pow (0.123E4, ~0.34028235E39) = 0 atan2 (0.123E4, ~0.17014117E39) = 3.141592503 pow (0.123E4, ~0.17014117E39) = 0 atan2 (0.123E4, ~0.123E4) = 2.356194496 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580796003 pow (0.123E4, ~0.123E2) = 9.86657752E~39 atan2 (0.123E4, ~0.31415927E1) = 1.57335043 pow (0.123E4, ~0.31415927E1) = 1.962350282E~10 atan2 (0.123E4, ~0.27182817E1) = 1.573006272 pow (0.123E4, ~0.27182817E1) = 3.988112063E~9 atan2 (0.123E4, ~0.123E1) = 1.571796298 pow (0.123E4, ~0.123E1) = 1.582765835E~4 atan2 (0.123E4, ~0.123) = 1.570896268 pow (0.123E4, ~0.123) = 0.4168134034 atan2 (0.123E4, ~0.123E~2) = 1.570797324 pow (0.123E4, ~0.123E~2) = 0.991286993 atan2 (0.123E4, ~0.11754944E~37) = 1.570796371 pow (0.123E4, ~0.11754944E~37) = 1 atan2 (0.123E4, ~0.5877472E~38) = 1.570796371 pow (0.123E4, ~0.5877472E~38) = 1 atan2 (0.123E4, ~0.1E~44) = 1.570796371 pow (0.123E4, ~0.1E~44) = 1 atan2 (0.123E4, ~0.0) = 1.570796371 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592503 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.34028235E39) = 3.614645465E~38 pow (0.123E2, 0.34028235E39) = inf atan2 (0.123E2, 0.17014117E39) = 7.22929093E~38 pow (0.123E2, 0.17014117E39) = inf atan2 (0.123E2, 0.123E4) = 0.009999667294 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981853 pow (0.123E2, 0.123E2) = 2.545852141E13 atan2 (0.123E2, 0.31415927E1) = 1.32072866 pow (0.123E2, 0.31415927E1) = 2654.837891 atan2 (0.123E2, 0.27182817E1) = 1.353293777 pow (0.123E2, 0.27182817E1) = 917.6333618 atan2 (0.123E2, 0.123E1) = 1.471127629 pow (0.123E2, 0.123E1) = 21.90702057 atan2 (0.123E2, 0.123) = 1.560796618 pow (0.123E2, 0.123) = 1.361627579 atan2 (0.123E2, 0.123E~2) = 1.570696354 pow (0.123E2, 0.123E~2) = 1.003091574 atan2 (0.123E2, 0.11754944E~37) = 1.570796371 pow (0.123E2, 0.11754944E~37) = 1 atan2 (0.123E2, 0.5877472E~38) = 1.570796371 pow (0.123E2, 0.5877472E~38) = 1 atan2 (0.123E2, 0.1E~44) = 1.570796371 pow (0.123E2, 0.1E~44) = 1 atan2 (0.123E2, 0.0) = 1.570796371 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.34028235E39) = 3.141592503 pow (0.123E2, ~0.34028235E39) = 0 atan2 (0.123E2, ~0.17014117E39) = 3.141592503 pow (0.123E2, ~0.17014117E39) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592989 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.356194496 pow (0.123E2, ~0.123E2) = 3.927958084E~14 atan2 (0.123E2, ~0.31415927E1) = 1.820864081 pow (0.123E2, ~0.31415927E1) = 3.766708251E~4 atan2 (0.123E2, ~0.27182817E1) = 1.788298845 pow (0.123E2, ~0.27182817E1) = 0.00108975987 atan2 (0.123E2, ~0.123E1) = 1.670464993 pow (0.123E2, ~0.123E1) = 0.04564746842 atan2 (0.123E2, ~0.123) = 1.580796003 pow (0.123E2, ~0.123) = 0.7344152331 atan2 (0.123E2, ~0.123E~2) = 1.570896268 pow (0.123E2, ~0.123E~2) = 0.996917963 atan2 (0.123E2, ~0.11754944E~37) = 1.570796371 pow (0.123E2, ~0.11754944E~37) = 1 atan2 (0.123E2, ~0.5877472E~38) = 1.570796371 pow (0.123E2, ~0.5877472E~38) = 1 atan2 (0.123E2, ~0.1E~44) = 1.570796371 pow (0.123E2, ~0.1E~44) = 1 atan2 (0.123E2, ~0.0) = 1.570796371 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592503 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.31415927E1, 0.34028235E39) = 9.232312E~39 pow (0.31415927E1, 0.34028235E39) = inf atan2 (0.31415927E1, 0.17014117E39) = 1.8464624E~38 pow (0.31415927E1, 0.17014117E39) = inf atan2 (0.31415927E1, 0.123E4) = 0.002554134931 pow (0.31415927E1, 0.123E4) = inf atan2 (0.31415927E1, 0.123E2) = 0.2500677109 pow (0.31415927E1, 0.123E2) = 1302997.75 atan2 (0.31415927E1, 0.31415927E1) = 0.7853981853 pow (0.31415927E1, 0.31415927E1) = 36.46216583 atan2 (0.31415927E1, 0.27182817E1) = 0.8575118184 pow (0.31415927E1, 0.27182817E1) = 22.45915794 atan2 (0.31415927E1, 0.123E1) = 1.19762063 pow (0.31415927E1, 0.123E1) = 4.087844372 atan2 (0.31415927E1, 0.123) = 1.531664252 pow (0.31415927E1, 0.123) = 1.15119648 atan2 (0.31415927E1, 0.123E~2) = 1.570404768 pow (0.31415927E1, 0.123E~2) = 1.001409054 atan2 (0.31415927E1, 0.11754944E~37) = 1.570796371 pow (0.31415927E1, 0.11754944E~37) = 1 atan2 (0.31415927E1, 0.5877472E~38) = 1.570796371 pow (0.31415927E1, 0.5877472E~38) = 1 atan2 (0.31415927E1, 0.1E~44) = 1.570796371 pow (0.31415927E1, 0.1E~44) = 1 atan2 (0.31415927E1, 0.0) = 1.570796371 pow (0.31415927E1, 0.0) = 1 atan2 (0.31415927E1, ~0.34028235E39) = 3.141592503 pow (0.31415927E1, ~0.34028235E39) = 0 atan2 (0.31415927E1, ~0.17014117E39) = 3.141592503 pow (0.31415927E1, ~0.17014117E39) = 0 atan2 (0.31415927E1, ~0.123E4) = 3.139038563 pow (0.31415927E1, ~0.123E4) = 0 atan2 (0.31415927E1, ~0.123E2) = 2.89152503 pow (0.31415927E1, ~0.123E2) = 7.674610174E~7 atan2 (0.31415927E1, ~0.31415927E1) = 2.356194496 pow (0.31415927E1, ~0.31415927E1) = 0.02742568776 atan2 (0.31415927E1, ~0.27182817E1) = 2.284080744 pow (0.31415927E1, ~0.27182817E1) = 0.04452526942 atan2 (0.31415927E1, ~0.123E1) = 1.943971992 pow (0.31415927E1, ~0.123E1) = 0.2446276993 atan2 (0.31415927E1, ~0.123) = 1.609928489 pow (0.31415927E1, ~0.123) = 0.8686614633 atan2 (0.31415927E1, ~0.123E~2) = 1.571187854 pow (0.31415927E1, ~0.123E~2) = 0.9985929728 atan2 (0.31415927E1, ~0.11754944E~37) = 1.570796371 pow (0.31415927E1, ~0.11754944E~37) = 1 atan2 (0.31415927E1, ~0.5877472E~38) = 1.570796371 pow (0.31415927E1, ~0.5877472E~38) = 1 atan2 (0.31415927E1, ~0.1E~44) = 1.570796371 pow (0.31415927E1, ~0.1E~44) = 1 atan2 (0.31415927E1, ~0.0) = 1.570796371 pow (0.31415927E1, ~0.0) = 1 atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.31415927E1, ~inf) = 3.141592503 pow (0.31415927E1, ~inf) = 0 atan2 (0.31415927E1, nan) = nan pow (0.31415927E1, nan) = nan atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.27182817E1, 0.34028235E39) = 7.988312091E~39 pow (0.27182817E1, 0.34028235E39) = inf atan2 (0.27182817E1, 0.17014117E39) = 1.597662558E~38 pow (0.27182817E1, 0.17014117E39) = inf atan2 (0.27182817E1, 0.123E4) = 0.002209981671 pow (0.27182817E1, 0.123E4) = inf atan2 (0.27182817E1, 0.123E2) = 0.2175025195 pow (0.27182817E1, 0.123E2) = 219695.9531 atan2 (0.27182817E1, 0.31415927E1) = 0.7132844925 pow (0.27182817E1, 0.31415927E1) = 23.14069176 atan2 (0.27182817E1, 0.27182817E1) = 0.7853981853 pow (0.27182817E1, 0.27182817E1) = 15.15425968 atan2 (0.27182817E1, 0.123E1) = 1.145872235 pow (0.27182817E1, 0.123E1) = 3.421229362 atan2 (0.27182817E1, 0.123) = 1.525578022 pow (0.27182817E1, 0.123) = 1.130884409 atan2 (0.27182817E1, 0.123E~2) = 1.570343852 pow (0.27182817E1, 0.123E~2) = 1.001230717 atan2 (0.27182817E1, 0.11754944E~37) = 1.570796371 pow (0.27182817E1, 0.11754944E~37) = 1 atan2 (0.27182817E1, 0.5877472E~38) = 1.570796371 pow (0.27182817E1, 0.5877472E~38) = 1 atan2 (0.27182817E1, 0.1E~44) = 1.570796371 pow (0.27182817E1, 0.1E~44) = 1 atan2 (0.27182817E1, 0.0) = 1.570796371 pow (0.27182817E1, 0.0) = 1 atan2 (0.27182817E1, ~0.34028235E39) = 3.141592503 pow (0.27182817E1, ~0.34028235E39) = 0 atan2 (0.27182817E1, ~0.17014117E39) = 3.141592503 pow (0.27182817E1, ~0.17014117E39) = 0 atan2 (0.27182817E1, ~0.123E4) = 3.139382601 pow (0.27182817E1, ~0.123E4) = 0 atan2 (0.27182817E1, ~0.123E2) = 2.924090147 pow (0.27182817E1, ~0.123E2) = 4.551745405E~6 atan2 (0.27182817E1, ~0.31415927E1) = 2.428308249 pow (0.27182817E1, ~0.31415927E1) = 0.04321391881 atan2 (0.27182817E1, ~0.27182817E1) = 2.356194496 pow (0.27182817E1, ~0.27182817E1) = 0.06598804891 atan2 (0.27182817E1, ~0.123E1) = 1.995720506 pow (0.27182817E1, ~0.123E1) = 0.2922925949 atan2 (0.27182817E1, ~0.123) = 1.6160146 pow (0.27182817E1, ~0.123) = 0.8842636347 atan2 (0.27182817E1, ~0.123E~2) = 1.57124877 pow (0.27182817E1, ~0.123E~2) = 0.9987707734 atan2 (0.27182817E1, ~0.11754944E~37) = 1.570796371 pow (0.27182817E1, ~0.11754944E~37) = 1 atan2 (0.27182817E1, ~0.5877472E~38) = 1.570796371 pow (0.27182817E1, ~0.5877472E~38) = 1 atan2 (0.27182817E1, ~0.1E~44) = 1.570796371 pow (0.27182817E1, ~0.1E~44) = 1 atan2 (0.27182817E1, ~0.0) = 1.570796371 pow (0.27182817E1, ~0.0) = 1 atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.27182817E1, ~inf) = 3.141592503 pow (0.27182817E1, ~inf) = 0 atan2 (0.27182817E1, nan) = nan pow (0.27182817E1, nan) = nan atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.123E1, 0.34028235E39) = 3.614645185E~39 pow (0.123E1, 0.34028235E39) = inf atan2 (0.123E1, 0.17014117E39) = 7.22929037E~39 pow (0.123E1, 0.17014117E39) = inf atan2 (0.123E1, 0.123E4) = 9.999996983E~4 pow (0.123E1, 0.123E4) = inf atan2 (0.123E1, 0.123E2) = 0.09966865182 pow (0.123E1, 0.123E2) = 12.75947952 atan2 (0.123E1, 0.31415927E1) = 0.3731757104 pow (0.123E1, 0.31415927E1) = 1.916219592 atan2 (0.123E1, 0.27182817E1) = 0.4249241352 pow (0.123E1, 0.27182817E1) = 1.755445838 atan2 (0.123E1, 0.123E1) = 0.7853981853 pow (0.123E1, 0.123E1) = 1.289981008 atan2 (0.123E1, 0.123) = 1.471127629 pow (0.123E1, 0.123) = 1.025789738 atan2 (0.123E1, 0.123E~2) = 1.569796324 pow (0.123E1, 0.123E~2) = 1.000254631 atan2 (0.123E1, 0.11754944E~37) = 1.570796371 pow (0.123E1, 0.11754944E~37) = 1 atan2 (0.123E1, 0.5877472E~38) = 1.570796371 pow (0.123E1, 0.5877472E~38) = 1 atan2 (0.123E1, 0.1E~44) = 1.570796371 pow (0.123E1, 0.1E~44) = 1 atan2 (0.123E1, 0.0) = 1.570796371 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.34028235E39) = 3.141592503 pow (0.123E1, ~0.34028235E39) = 0 atan2 (0.123E1, ~0.17014117E39) = 3.141592503 pow (0.123E1, ~0.17014117E39) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592575 pow (0.123E1, ~0.123E4) = 0 atan2 (0.123E1, ~0.123E2) = 3.041924 pow (0.123E1, ~0.123E2) = 0.07837310433 atan2 (0.123E1, ~0.31415927E1) = 2.768416882 pow (0.123E1, ~0.31415927E1) = 0.5218608975 atan2 (0.123E1, ~0.27182817E1) = 2.716668606 pow (0.123E1, ~0.27182817E1) = 0.5696558356 atan2 (0.123E1, ~0.123E1) = 2.356194496 pow (0.123E1, ~0.123E1) = 0.7752052546 atan2 (0.123E1, ~0.123) = 1.670464993 pow (0.123E1, ~0.123) = 0.9748587012 atan2 (0.123E1, ~0.123E~2) = 1.571796298 pow (0.123E1, ~0.123E~2) = 0.9997454286 atan2 (0.123E1, ~0.11754944E~37) = 1.570796371 pow (0.123E1, ~0.11754944E~37) = 1 atan2 (0.123E1, ~0.5877472E~38) = 1.570796371 pow (0.123E1, ~0.5877472E~38) = 1 atan2 (0.123E1, ~0.1E~44) = 1.570796371 pow (0.123E1, ~0.1E~44) = 1 atan2 (0.123E1, ~0.0) = 1.570796371 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592503 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.34028235E39) = 3.614649389E~40 pow (0.123, 0.34028235E39) = 0 atan2 (0.123, 0.17014117E39) = 7.229284764E~40 pow (0.123, 0.17014117E39) = 0 atan2 (0.123, 0.123E4) = 1.000000047E~4 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666363 pow (0.123, 0.123E2) = 6.394886357E~12 atan2 (0.123, 0.31415927E1) = 0.0391321294 pow (0.123, 0.31415927E1) = 0.001383096678 atan2 (0.123, 0.27182817E1) = 0.04521832988 pow (0.123, 0.27182817E1) = 0.00335819344 atan2 (0.123, 0.123E1) = 0.09966865182 pow (0.123, 0.123E1) = 0.07595970482 atan2 (0.123, 0.123) = 0.7853981853 pow (0.123, 0.123) = 0.7727843523 atan2 (0.123, 0.123E~2) = 1.560796618 pow (0.123, 0.123E~2) = 0.9974257946 atan2 (0.123, 0.11754944E~37) = 1.570796371 pow (0.123, 0.11754944E~37) = 1 atan2 (0.123, 0.5877472E~38) = 1.570796371 pow (0.123, 0.5877472E~38) = 1 atan2 (0.123, 0.1E~44) = 1.570796371 pow (0.123, 0.1E~44) = 1 atan2 (0.123, 0.0) = 1.570796371 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.34028235E39) = 3.141592503 pow (0.123, ~0.34028235E39) = inf atan2 (0.123, ~0.17014117E39) = 3.141592503 pow (0.123, ~0.17014117E39) = inf atan2 (0.123, ~0.123E4) = 3.141492605 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592989 pow (0.123, ~0.123E2) = 156374941700 atan2 (0.123, ~0.31415927E1) = 3.102460623 pow (0.123, ~0.31415927E1) = 723.0152588 atan2 (0.123, ~0.27182817E1) = 3.096374273 pow (0.123, ~0.27182817E1) = 297.7791443 atan2 (0.123, ~0.123E1) = 3.041924 pow (0.123, ~0.123E1) = 13.16487408 atan2 (0.123, ~0.123) = 2.356194496 pow (0.123, ~0.123) = 1.294022083 atan2 (0.123, ~0.123E~2) = 1.580796003 pow (0.123, ~0.123E~2) = 1.002580881 atan2 (0.123, ~0.11754944E~37) = 1.570796371 pow (0.123, ~0.11754944E~37) = 1 atan2 (0.123, ~0.5877472E~38) = 1.570796371 pow (0.123, ~0.5877472E~38) = 1 atan2 (0.123, ~0.1E~44) = 1.570796371 pow (0.123, ~0.1E~44) = 1 atan2 (0.123, ~0.0) = 1.570796371 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592503 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.34028235E39) = 3.613948739E~42 pow (0.123E~2, 0.34028235E39) = 0 atan2 (0.123E~2, 0.17014117E39) = 7.229298777E~42 pow (0.123E~2, 0.17014117E39) = 0 atan2 (0.123E~2, 0.123E4) = 9.999999975E~7 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 1.000000047E~4 pow (0.123E~2, 0.123E2) = 1.606321748E~36 atan2 (0.123E~2, 0.31415927E1) = 3.915211419E~4 pow (0.123E~2, 0.31415927E1) = 7.205548935E~10 atan2 (0.123E~2, 0.27182817E1) = 4.524917167E~4 pow (0.123E~2, 0.27182817E1) = 1.228972657E~8 atan2 (0.123E~2, 0.123E1) = 9.999996983E~4 pow (0.123E~2, 0.123E1) = 2.633802651E~4 atan2 (0.123E~2, 0.123) = 0.009999667294 pow (0.123E~2, 0.123) = 0.4385896027 atan2 (0.123E~2, 0.123E~2) = 0.7853981853 pow (0.123E~2, 0.123E~2) = 0.9917919636 atan2 (0.123E~2, 0.11754944E~37) = 1.570796371 pow (0.123E~2, 0.11754944E~37) = 1 atan2 (0.123E~2, 0.5877472E~38) = 1.570796371 pow (0.123E~2, 0.5877472E~38) = 1 atan2 (0.123E~2, 0.1E~44) = 1.570796371 pow (0.123E~2, 0.1E~44) = 1 atan2 (0.123E~2, 0.0) = 1.570796371 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.34028235E39) = 3.141592503 pow (0.123E~2, ~0.34028235E39) = inf atan2 (0.123E~2, ~0.17014117E39) = 3.141592503 pow (0.123E~2, ~0.17014117E39) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591549 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492605 pow (0.123E~2, ~0.123E2) = 6.225402783E35 atan2 (0.123E~2, ~0.31415927E1) = 3.141201019 pow (0.123E~2, ~0.31415927E1) = 1387819264 atan2 (0.123E~2, ~0.27182817E1) = 3.141140223 pow (0.123E~2, ~0.27182817E1) = 81368776 atan2 (0.123E~2, ~0.123E1) = 3.140592575 pow (0.123E~2, ~0.123E1) = 3796.791504 atan2 (0.123E~2, ~0.123) = 3.131592989 pow (0.123E~2, ~0.123) = 2.280035973 atan2 (0.123E~2, ~0.123E~2) = 2.356194496 pow (0.123E~2, ~0.123E~2) = 1.008275986 atan2 (0.123E~2, ~0.11754944E~37) = 1.570796371 pow (0.123E~2, ~0.11754944E~37) = 1 atan2 (0.123E~2, ~0.5877472E~38) = 1.570796371 pow (0.123E~2, ~0.5877472E~38) = 1 atan2 (0.123E~2, ~0.1E~44) = 1.570796371 pow (0.123E~2, ~0.1E~44) = 1 atan2 (0.123E~2, ~0.0) = 1.570796371 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592503 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.11754944E~37, 0.34028235E39) = 0 pow (0.11754944E~37, 0.34028235E39) = 0 atan2 (0.11754944E~37, 0.17014117E39) = 0 pow (0.11754944E~37, 0.17014117E39) = 0 atan2 (0.11754944E~37, 0.123E4) = 9.556855527E~42 pow (0.11754944E~37, 0.123E4) = 0 atan2 (0.11754944E~37, 0.123E2) = 9.55686954E~40 pow (0.11754944E~37, 0.123E2) = 0 atan2 (0.11754944E~37, 0.31415927E1) = 3.74171493E~39 pow (0.11754944E~37, 0.31415927E1) = 0 atan2 (0.11754944E~37, 0.27182817E1) = 4.324402857E~39 pow (0.11754944E~37, 0.27182817E1) = 0 atan2 (0.11754944E~37, 0.123E1) = 9.556863934E~39 pow (0.11754944E~37, 0.123E1) = 0 atan2 (0.11754944E~37, 0.123) = 9.556864495E~38 pow (0.11754944E~37, 0.123) = 2.160911572E~5 atan2 (0.11754944E~37, 0.123E~2) = 9.556864495E~36 pow (0.11754944E~37, 0.123E~2) = 0.8981448412 atan2 (0.11754944E~37, 0.11754944E~37) = 0.7853981853 pow (0.11754944E~37, 0.11754944E~37) = 1 atan2 (0.11754944E~37, 0.5877472E~38) = 1.107148767 pow (0.11754944E~37, 0.5877472E~38) = 1 atan2 (0.11754944E~37, 0.1E~44) = 1.570796251 pow (0.11754944E~37, 0.1E~44) = 1 atan2 (0.11754944E~37, 0.0) = 1.570796371 pow (0.11754944E~37, 0.0) = 1 atan2 (0.11754944E~37, ~0.34028235E39) = 3.141592503 pow (0.11754944E~37, ~0.34028235E39) = inf atan2 (0.11754944E~37, ~0.17014117E39) = 3.141592503 pow (0.11754944E~37, ~0.17014117E39) = inf atan2 (0.11754944E~37, ~0.123E4) = 3.141592503 pow (0.11754944E~37, ~0.123E4) = inf atan2 (0.11754944E~37, ~0.123E2) = 3.141592503 pow (0.11754944E~37, ~0.123E2) = inf atan2 (0.11754944E~37, ~0.31415927E1) = 3.141592503 pow (0.11754944E~37, ~0.31415927E1) = inf atan2 (0.11754944E~37, ~0.27182817E1) = 3.141592503 pow (0.11754944E~37, ~0.27182817E1) = inf atan2 (0.11754944E~37, ~0.123E1) = 3.141592503 pow (0.11754944E~37, ~0.123E1) = inf atan2 (0.11754944E~37, ~0.123) = 3.141592503 pow (0.11754944E~37, ~0.123) = 46276.76562 atan2 (0.11754944E~37, ~0.123E~2) = 3.141592503 pow (0.11754944E~37, ~0.123E~2) = 1.113406181 atan2 (0.11754944E~37, ~0.11754944E~37) = 2.356194496 pow (0.11754944E~37, ~0.11754944E~37) = 1 atan2 (0.11754944E~37, ~0.5877472E~38) = 2.034443855 pow (0.11754944E~37, ~0.5877472E~38) = 1 atan2 (0.11754944E~37, ~0.1E~44) = 1.57079649 pow (0.11754944E~37, ~0.1E~44) = 1 atan2 (0.11754944E~37, ~0.0) = 1.570796371 pow (0.11754944E~37, ~0.0) = 1 atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.11754944E~37, ~inf) = 3.141592503 pow (0.11754944E~37, ~inf) = inf atan2 (0.11754944E~37, nan) = nan pow (0.11754944E~37, nan) = nan atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.5877472E~38, 0.34028235E39) = 0 pow (0.5877472E~38, 0.34028235E39) = 0 atan2 (0.5877472E~38, 0.17014117E39) = 0 pow (0.5877472E~38, 0.17014117E39) = 0 atan2 (0.5877472E~38, 0.123E4) = 4.778427763E~42 pow (0.5877472E~38, 0.123E4) = 0 atan2 (0.5877472E~38, 0.123E2) = 4.778427763E~40 pow (0.5877472E~38, 0.123E2) = 0 atan2 (0.5877472E~38, 0.31415927E1) = 1.870856764E~39 pow (0.5877472E~38, 0.31415927E1) = 0 atan2 (0.5877472E~38, 0.27182817E1) = 2.162200728E~39 pow (0.5877472E~38, 0.27182817E1) = 0 atan2 (0.5877472E~38, 0.123E1) = 4.778431967E~39 pow (0.5877472E~38, 0.123E1) = 0 atan2 (0.5877472E~38, 0.123) = 4.778432248E~38 pow (0.5877472E~38, 0.123) = 1.984313531E~5 atan2 (0.5877472E~38, 0.123E~2) = 4.778432248E~36 pow (0.5877472E~38, 0.123E~2) = 0.8973793983 atan2 (0.5877472E~38, 0.11754944E~37) = 0.463647604 pow (0.5877472E~38, 0.11754944E~37) = 1 atan2 (0.5877472E~38, 0.5877472E~38) = 0.7853981853 pow (0.5877472E~38, 0.5877472E~38) = 1 atan2 (0.5877472E~38, 0.1E~44) = 1.570796132 pow (0.5877472E~38, 0.1E~44) = 1 atan2 (0.5877472E~38, 0.0) = 1.570796371 pow (0.5877472E~38, 0.0) = 1 atan2 (0.5877472E~38, ~0.34028235E39) = 3.141592503 pow (0.5877472E~38, ~0.34028235E39) = inf atan2 (0.5877472E~38, ~0.17014117E39) = 3.141592503 pow (0.5877472E~38, ~0.17014117E39) = inf atan2 (0.5877472E~38, ~0.123E4) = 3.141592503 pow (0.5877472E~38, ~0.123E4) = inf atan2 (0.5877472E~38, ~0.123E2) = 3.141592503 pow (0.5877472E~38, ~0.123E2) = inf atan2 (0.5877472E~38, ~0.31415927E1) = 3.141592503 pow (0.5877472E~38, ~0.31415927E1) = inf atan2 (0.5877472E~38, ~0.27182817E1) = 3.141592503 pow (0.5877472E~38, ~0.27182817E1) = inf atan2 (0.5877472E~38, ~0.123E1) = 3.141592503 pow (0.5877472E~38, ~0.123E1) = inf atan2 (0.5877472E~38, ~0.123) = 3.141592503 pow (0.5877472E~38, ~0.123) = 50395.26172 atan2 (0.5877472E~38, ~0.123E~2) = 3.141592503 pow (0.5877472E~38, ~0.123E~2) = 1.114355803 atan2 (0.5877472E~38, ~0.11754944E~37) = 2.677945137 pow (0.5877472E~38, ~0.11754944E~37) = 1 atan2 (0.5877472E~38, ~0.5877472E~38) = 2.356194496 pow (0.5877472E~38, ~0.5877472E~38) = 1 atan2 (0.5877472E~38, ~0.1E~44) = 1.570796609 pow (0.5877472E~38, ~0.1E~44) = 1 atan2 (0.5877472E~38, ~0.0) = 1.570796371 pow (0.5877472E~38, ~0.0) = 1 atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.5877472E~38, ~inf) = 3.141592503 pow (0.5877472E~38, ~inf) = inf atan2 (0.5877472E~38, nan) = nan pow (0.5877472E~38, nan) = nan atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.1E~44, 0.34028235E39) = 0 pow (0.1E~44, 0.34028235E39) = 0 atan2 (0.1E~44, 0.17014117E39) = 0 pow (0.1E~44, 0.17014117E39) = 0 atan2 (0.1E~44, 0.123E4) = 0 pow (0.1E~44, 0.123E4) = 0 atan2 (0.1E~44, 0.123E2) = 0 pow (0.1E~44, 0.123E2) = 0 atan2 (0.1E~44, 0.31415927E1) = 0 pow (0.1E~44, 0.31415927E1) = 0 atan2 (0.1E~44, 0.27182817E1) = 0 pow (0.1E~44, 0.27182817E1) = 0 atan2 (0.1E~44, 0.123E1) = 1.401298464E~45 pow (0.1E~44, 0.123E1) = 0 atan2 (0.1E~44, 0.123) = 1.121038771E~44 pow (0.1E~44, 0.123) = 3.041046966E~6 atan2 (0.1E~44, 0.123E~2) = 1.139255651E~42 pow (0.1E~44, 0.123E~2) = 0.8807045221 atan2 (0.1E~44, 0.11754944E~37) = 1.192092896E~7 pow (0.1E~44, 0.11754944E~37) = 1 atan2 (0.1E~44, 0.5877472E~38) = 2.384185791E~7 pow (0.1E~44, 0.5877472E~38) = 1 atan2 (0.1E~44, 0.1E~44) = 0.7853981853 pow (0.1E~44, 0.1E~44) = 1 atan2 (0.1E~44, 0.0) = 1.570796371 pow (0.1E~44, 0.0) = 1 atan2 (0.1E~44, ~0.34028235E39) = 3.141592503 pow (0.1E~44, ~0.34028235E39) = inf atan2 (0.1E~44, ~0.17014117E39) = 3.141592503 pow (0.1E~44, ~0.17014117E39) = inf atan2 (0.1E~44, ~0.123E4) = 3.141592503 pow (0.1E~44, ~0.123E4) = inf atan2 (0.1E~44, ~0.123E2) = 3.141592503 pow (0.1E~44, ~0.123E2) = inf atan2 (0.1E~44, ~0.31415927E1) = 3.141592503 pow (0.1E~44, ~0.31415927E1) = inf atan2 (0.1E~44, ~0.27182817E1) = 3.141592503 pow (0.1E~44, ~0.27182817E1) = inf atan2 (0.1E~44, ~0.123E1) = 3.141592503 pow (0.1E~44, ~0.123E1) = inf atan2 (0.1E~44, ~0.123) = 3.141592503 pow (0.1E~44, ~0.123) = 328834.125 atan2 (0.1E~44, ~0.123E~2) = 3.141592503 pow (0.1E~44, ~0.123E~2) = 1.135454535 atan2 (0.1E~44, ~0.11754944E~37) = 3.141592503 pow (0.1E~44, ~0.11754944E~37) = 1 atan2 (0.1E~44, ~0.5877472E~38) = 3.141592503 pow (0.1E~44, ~0.5877472E~38) = 1 atan2 (0.1E~44, ~0.1E~44) = 2.356194496 pow (0.1E~44, ~0.1E~44) = 1 atan2 (0.1E~44, ~0.0) = 1.570796371 pow (0.1E~44, ~0.0) = 1 atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.1E~44, ~inf) = 3.141592503 pow (0.1E~44, ~inf) = inf atan2 (0.1E~44, nan) = nan pow (0.1E~44, nan) = nan atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.0, 0.34028235E39) = 0 pow (0.0, 0.34028235E39) = 0 atan2 (0.0, 0.17014117E39) = 0 pow (0.0, 0.17014117E39) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.31415927E1) = 0 pow (0.0, 0.31415927E1) = 0 atan2 (0.0, 0.27182817E1) = 0 pow (0.0, 0.27182817E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.11754944E~37) = 0 pow (0.0, 0.11754944E~37) = 0 atan2 (0.0, 0.5877472E~38) = 0 pow (0.0, 0.5877472E~38) = 0 atan2 (0.0, 0.1E~44) = 0 pow (0.0, 0.1E~44) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.34028235E39) = 3.141592503 pow (0.0, ~0.34028235E39) = inf atan2 (0.0, ~0.17014117E39) = 3.141592503 pow (0.0, ~0.17014117E39) = inf atan2 (0.0, ~0.123E4) = 3.141592503 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592503 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.31415927E1) = 3.141592503 pow (0.0, ~0.31415927E1) = inf atan2 (0.0, ~0.27182817E1) = 3.141592503 pow (0.0, ~0.27182817E1) = inf atan2 (0.0, ~0.123E1) = 3.141592503 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592503 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592503 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.11754944E~37) = 3.141592503 pow (0.0, ~0.11754944E~37) = inf atan2 (0.0, ~0.5877472E~38) = 3.141592503 pow (0.0, ~0.5877472E~38) = inf atan2 (0.0, ~0.1E~44) = 3.141592503 pow (0.0, ~0.1E~44) = inf atan2 (0.0, ~0.0) = 3.141592503 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592503 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.34028235E39, 0.34028235E39) = ~0.7853981853 pow (~0.34028235E39, 0.34028235E39) = inf atan2 (~0.34028235E39, 0.17014117E39) = ~1.107148767 pow (~0.34028235E39, 0.17014117E39) = inf atan2 (~0.34028235E39, 0.123E4) = ~1.570796371 pow (~0.34028235E39, 0.123E4) = inf atan2 (~0.34028235E39, 0.123E2) = ~1.570796371 pow (~0.34028235E39, 0.123E2) = nan atan2 (~0.34028235E39, 0.31415927E1) = ~1.570796371 pow (~0.34028235E39, 0.31415927E1) = nan atan2 (~0.34028235E39, 0.27182817E1) = ~1.570796371 pow (~0.34028235E39, 0.27182817E1) = nan atan2 (~0.34028235E39, 0.123E1) = ~1.570796371 pow (~0.34028235E39, 0.123E1) = nan atan2 (~0.34028235E39, 0.123) = ~1.570796371 pow (~0.34028235E39, 0.123) = nan atan2 (~0.34028235E39, 0.123E~2) = ~1.570796371 pow (~0.34028235E39, 0.123E~2) = nan atan2 (~0.34028235E39, 0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, 0.11754944E~37) = nan atan2 (~0.34028235E39, 0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, 0.5877472E~38) = nan atan2 (~0.34028235E39, 0.1E~44) = ~1.570796371 pow (~0.34028235E39, 0.1E~44) = nan atan2 (~0.34028235E39, 0.0) = ~1.570796371 pow (~0.34028235E39, 0.0) = 1 atan2 (~0.34028235E39, ~0.34028235E39) = ~2.356194496 pow (~0.34028235E39, ~0.34028235E39) = 0 atan2 (~0.34028235E39, ~0.17014117E39) = ~2.034443855 pow (~0.34028235E39, ~0.17014117E39) = 0 atan2 (~0.34028235E39, ~0.123E4) = ~1.570796371 pow (~0.34028235E39, ~0.123E4) = 0 atan2 (~0.34028235E39, ~0.123E2) = ~1.570796371 pow (~0.34028235E39, ~0.123E2) = nan atan2 (~0.34028235E39, ~0.31415927E1) = ~1.570796371 pow (~0.34028235E39, ~0.31415927E1) = nan atan2 (~0.34028235E39, ~0.27182817E1) = ~1.570796371 pow (~0.34028235E39, ~0.27182817E1) = nan atan2 (~0.34028235E39, ~0.123E1) = ~1.570796371 pow (~0.34028235E39, ~0.123E1) = nan atan2 (~0.34028235E39, ~0.123) = ~1.570796371 pow (~0.34028235E39, ~0.123) = nan atan2 (~0.34028235E39, ~0.123E~2) = ~1.570796371 pow (~0.34028235E39, ~0.123E~2) = nan atan2 (~0.34028235E39, ~0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, ~0.11754944E~37) = nan atan2 (~0.34028235E39, ~0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, ~0.5877472E~38) = nan atan2 (~0.34028235E39, ~0.1E~44) = ~1.570796371 pow (~0.34028235E39, ~0.1E~44) = nan atan2 (~0.34028235E39, ~0.0) = ~1.570796371 pow (~0.34028235E39, ~0.0) = 1 atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.34028235E39, ~inf) = ~3.141592503 pow (~0.34028235E39, ~inf) = 0 atan2 (~0.34028235E39, nan) = nan pow (~0.34028235E39, nan) = nan atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.17014117E39, 0.34028235E39) = ~0.463647604 pow (~0.17014117E39, 0.34028235E39) = inf atan2 (~0.17014117E39, 0.17014117E39) = ~0.7853981853 pow (~0.17014117E39, 0.17014117E39) = inf atan2 (~0.17014117E39, 0.123E4) = ~1.570796371 pow (~0.17014117E39, 0.123E4) = inf atan2 (~0.17014117E39, 0.123E2) = ~1.570796371 pow (~0.17014117E39, 0.123E2) = nan atan2 (~0.17014117E39, 0.31415927E1) = ~1.570796371 pow (~0.17014117E39, 0.31415927E1) = nan atan2 (~0.17014117E39, 0.27182817E1) = ~1.570796371 pow (~0.17014117E39, 0.27182817E1) = nan atan2 (~0.17014117E39, 0.123E1) = ~1.570796371 pow (~0.17014117E39, 0.123E1) = nan atan2 (~0.17014117E39, 0.123) = ~1.570796371 pow (~0.17014117E39, 0.123) = nan atan2 (~0.17014117E39, 0.123E~2) = ~1.570796371 pow (~0.17014117E39, 0.123E~2) = nan atan2 (~0.17014117E39, 0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, 0.11754944E~37) = nan atan2 (~0.17014117E39, 0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, 0.5877472E~38) = nan atan2 (~0.17014117E39, 0.1E~44) = ~1.570796371 pow (~0.17014117E39, 0.1E~44) = nan atan2 (~0.17014117E39, 0.0) = ~1.570796371 pow (~0.17014117E39, 0.0) = 1 atan2 (~0.17014117E39, ~0.34028235E39) = ~2.677945137 pow (~0.17014117E39, ~0.34028235E39) = 0 atan2 (~0.17014117E39, ~0.17014117E39) = ~2.356194496 pow (~0.17014117E39, ~0.17014117E39) = 0 atan2 (~0.17014117E39, ~0.123E4) = ~1.570796371 pow (~0.17014117E39, ~0.123E4) = 0 atan2 (~0.17014117E39, ~0.123E2) = ~1.570796371 pow (~0.17014117E39, ~0.123E2) = nan atan2 (~0.17014117E39, ~0.31415927E1) = ~1.570796371 pow (~0.17014117E39, ~0.31415927E1) = nan atan2 (~0.17014117E39, ~0.27182817E1) = ~1.570796371 pow (~0.17014117E39, ~0.27182817E1) = nan atan2 (~0.17014117E39, ~0.123E1) = ~1.570796371 pow (~0.17014117E39, ~0.123E1) = nan atan2 (~0.17014117E39, ~0.123) = ~1.570796371 pow (~0.17014117E39, ~0.123) = nan atan2 (~0.17014117E39, ~0.123E~2) = ~1.570796371 pow (~0.17014117E39, ~0.123E~2) = nan atan2 (~0.17014117E39, ~0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, ~0.11754944E~37) = nan atan2 (~0.17014117E39, ~0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, ~0.5877472E~38) = nan atan2 (~0.17014117E39, ~0.1E~44) = ~1.570796371 pow (~0.17014117E39, ~0.1E~44) = nan atan2 (~0.17014117E39, ~0.0) = ~1.570796371 pow (~0.17014117E39, ~0.0) = 1 atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.17014117E39, ~inf) = ~3.141592503 pow (~0.17014117E39, ~inf) = 0 atan2 (~0.17014117E39, nan) = nan pow (~0.17014117E39, nan) = nan atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.123E4, 0.34028235E39) = ~3.614645488E~36 pow (~0.123E4, 0.34028235E39) = inf atan2 (~0.123E4, 0.17014117E39) = ~7.229290975E~36 pow (~0.123E4, 0.17014117E39) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981853 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.560796618 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.31415927E1) = ~1.568242192 pow (~0.123E4, 0.31415927E1) = nan atan2 (~0.123E4, 0.27182817E1) = ~1.568586349 pow (~0.123E4, 0.27182817E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796324 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696354 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795298 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.11754944E~37) = ~1.570796371 pow (~0.123E4, 0.11754944E~37) = nan atan2 (~0.123E4, 0.5877472E~38) = ~1.570796371 pow (~0.123E4, 0.5877472E~38) = nan atan2 (~0.123E4, 0.1E~44) = ~1.570796371 pow (~0.123E4, 0.1E~44) = nan atan2 (~0.123E4, 0.0) = ~1.570796371 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.34028235E39) = ~3.141592503 pow (~0.123E4, ~0.34028235E39) = 0 atan2 (~0.123E4, ~0.17014117E39) = ~3.141592503 pow (~0.123E4, ~0.17014117E39) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.356194496 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580796003 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.31415927E1) = ~1.57335043 pow (~0.123E4, ~0.31415927E1) = nan atan2 (~0.123E4, ~0.27182817E1) = ~1.573006272 pow (~0.123E4, ~0.27182817E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796298 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896268 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797324 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.11754944E~37) = ~1.570796371 pow (~0.123E4, ~0.11754944E~37) = nan atan2 (~0.123E4, ~0.5877472E~38) = ~1.570796371 pow (~0.123E4, ~0.5877472E~38) = nan atan2 (~0.123E4, ~0.1E~44) = ~1.570796371 pow (~0.123E4, ~0.1E~44) = nan atan2 (~0.123E4, ~0.0) = ~1.570796371 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592503 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.34028235E39) = ~3.614645465E~38 pow (~0.123E2, 0.34028235E39) = inf atan2 (~0.123E2, 0.17014117E39) = ~7.22929093E~38 pow (~0.123E2, 0.17014117E39) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999667294 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981853 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.31415927E1) = ~1.32072866 pow (~0.123E2, 0.31415927E1) = nan atan2 (~0.123E2, 0.27182817E1) = ~1.353293777 pow (~0.123E2, 0.27182817E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127629 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.560796618 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696354 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.11754944E~37) = ~1.570796371 pow (~0.123E2, 0.11754944E~37) = nan atan2 (~0.123E2, 0.5877472E~38) = ~1.570796371 pow (~0.123E2, 0.5877472E~38) = nan atan2 (~0.123E2, 0.1E~44) = ~1.570796371 pow (~0.123E2, 0.1E~44) = nan atan2 (~0.123E2, 0.0) = ~1.570796371 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.34028235E39) = ~3.141592503 pow (~0.123E2, ~0.34028235E39) = 0 atan2 (~0.123E2, ~0.17014117E39) = ~3.141592503 pow (~0.123E2, ~0.17014117E39) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592989 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.356194496 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.31415927E1) = ~1.820864081 pow (~0.123E2, ~0.31415927E1) = nan atan2 (~0.123E2, ~0.27182817E1) = ~1.788298845 pow (~0.123E2, ~0.27182817E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464993 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580796003 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896268 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.11754944E~37) = ~1.570796371 pow (~0.123E2, ~0.11754944E~37) = nan atan2 (~0.123E2, ~0.5877472E~38) = ~1.570796371 pow (~0.123E2, ~0.5877472E~38) = nan atan2 (~0.123E2, ~0.1E~44) = ~1.570796371 pow (~0.123E2, ~0.1E~44) = nan atan2 (~0.123E2, ~0.0) = ~1.570796371 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592503 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.31415927E1, 0.34028235E39) = ~9.232312E~39 pow (~0.31415927E1, 0.34028235E39) = inf atan2 (~0.31415927E1, 0.17014117E39) = ~1.8464624E~38 pow (~0.31415927E1, 0.17014117E39) = inf atan2 (~0.31415927E1, 0.123E4) = ~0.002554134931 pow (~0.31415927E1, 0.123E4) = inf atan2 (~0.31415927E1, 0.123E2) = ~0.2500677109 pow (~0.31415927E1, 0.123E2) = nan atan2 (~0.31415927E1, 0.31415927E1) = ~0.7853981853 pow (~0.31415927E1, 0.31415927E1) = nan atan2 (~0.31415927E1, 0.27182817E1) = ~0.8575118184 pow (~0.31415927E1, 0.27182817E1) = nan atan2 (~0.31415927E1, 0.123E1) = ~1.19762063 pow (~0.31415927E1, 0.123E1) = nan atan2 (~0.31415927E1, 0.123) = ~1.531664252 pow (~0.31415927E1, 0.123) = nan atan2 (~0.31415927E1, 0.123E~2) = ~1.570404768 pow (~0.31415927E1, 0.123E~2) = nan atan2 (~0.31415927E1, 0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, 0.11754944E~37) = nan atan2 (~0.31415927E1, 0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, 0.5877472E~38) = nan atan2 (~0.31415927E1, 0.1E~44) = ~1.570796371 pow (~0.31415927E1, 0.1E~44) = nan atan2 (~0.31415927E1, 0.0) = ~1.570796371 pow (~0.31415927E1, 0.0) = 1 atan2 (~0.31415927E1, ~0.34028235E39) = ~3.141592503 pow (~0.31415927E1, ~0.34028235E39) = 0 atan2 (~0.31415927E1, ~0.17014117E39) = ~3.141592503 pow (~0.31415927E1, ~0.17014117E39) = 0 atan2 (~0.31415927E1, ~0.123E4) = ~3.139038563 pow (~0.31415927E1, ~0.123E4) = 0 atan2 (~0.31415927E1, ~0.123E2) = ~2.89152503 pow (~0.31415927E1, ~0.123E2) = nan atan2 (~0.31415927E1, ~0.31415927E1) = ~2.356194496 pow (~0.31415927E1, ~0.31415927E1) = nan atan2 (~0.31415927E1, ~0.27182817E1) = ~2.284080744 pow (~0.31415927E1, ~0.27182817E1) = nan atan2 (~0.31415927E1, ~0.123E1) = ~1.943971992 pow (~0.31415927E1, ~0.123E1) = nan atan2 (~0.31415927E1, ~0.123) = ~1.609928489 pow (~0.31415927E1, ~0.123) = nan atan2 (~0.31415927E1, ~0.123E~2) = ~1.571187854 pow (~0.31415927E1, ~0.123E~2) = nan atan2 (~0.31415927E1, ~0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, ~0.11754944E~37) = nan atan2 (~0.31415927E1, ~0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, ~0.5877472E~38) = nan atan2 (~0.31415927E1, ~0.1E~44) = ~1.570796371 pow (~0.31415927E1, ~0.1E~44) = nan atan2 (~0.31415927E1, ~0.0) = ~1.570796371 pow (~0.31415927E1, ~0.0) = 1 atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.31415927E1, ~inf) = ~3.141592503 pow (~0.31415927E1, ~inf) = 0 atan2 (~0.31415927E1, nan) = nan pow (~0.31415927E1, nan) = nan atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.27182817E1, 0.34028235E39) = ~7.988312091E~39 pow (~0.27182817E1, 0.34028235E39) = inf atan2 (~0.27182817E1, 0.17014117E39) = ~1.597662558E~38 pow (~0.27182817E1, 0.17014117E39) = inf atan2 (~0.27182817E1, 0.123E4) = ~0.002209981671 pow (~0.27182817E1, 0.123E4) = inf atan2 (~0.27182817E1, 0.123E2) = ~0.2175025195 pow (~0.27182817E1, 0.123E2) = nan atan2 (~0.27182817E1, 0.31415927E1) = ~0.7132844925 pow (~0.27182817E1, 0.31415927E1) = nan atan2 (~0.27182817E1, 0.27182817E1) = ~0.7853981853 pow (~0.27182817E1, 0.27182817E1) = nan atan2 (~0.27182817E1, 0.123E1) = ~1.145872235 pow (~0.27182817E1, 0.123E1) = nan atan2 (~0.27182817E1, 0.123) = ~1.525578022 pow (~0.27182817E1, 0.123) = nan atan2 (~0.27182817E1, 0.123E~2) = ~1.570343852 pow (~0.27182817E1, 0.123E~2) = nan atan2 (~0.27182817E1, 0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, 0.11754944E~37) = nan atan2 (~0.27182817E1, 0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, 0.5877472E~38) = nan atan2 (~0.27182817E1, 0.1E~44) = ~1.570796371 pow (~0.27182817E1, 0.1E~44) = nan atan2 (~0.27182817E1, 0.0) = ~1.570796371 pow (~0.27182817E1, 0.0) = 1 atan2 (~0.27182817E1, ~0.34028235E39) = ~3.141592503 pow (~0.27182817E1, ~0.34028235E39) = 0 atan2 (~0.27182817E1, ~0.17014117E39) = ~3.141592503 pow (~0.27182817E1, ~0.17014117E39) = 0 atan2 (~0.27182817E1, ~0.123E4) = ~3.139382601 pow (~0.27182817E1, ~0.123E4) = 0 atan2 (~0.27182817E1, ~0.123E2) = ~2.924090147 pow (~0.27182817E1, ~0.123E2) = nan atan2 (~0.27182817E1, ~0.31415927E1) = ~2.428308249 pow (~0.27182817E1, ~0.31415927E1) = nan atan2 (~0.27182817E1, ~0.27182817E1) = ~2.356194496 pow (~0.27182817E1, ~0.27182817E1) = nan atan2 (~0.27182817E1, ~0.123E1) = ~1.995720506 pow (~0.27182817E1, ~0.123E1) = nan atan2 (~0.27182817E1, ~0.123) = ~1.6160146 pow (~0.27182817E1, ~0.123) = nan atan2 (~0.27182817E1, ~0.123E~2) = ~1.57124877 pow (~0.27182817E1, ~0.123E~2) = nan atan2 (~0.27182817E1, ~0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, ~0.11754944E~37) = nan atan2 (~0.27182817E1, ~0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, ~0.5877472E~38) = nan atan2 (~0.27182817E1, ~0.1E~44) = ~1.570796371 pow (~0.27182817E1, ~0.1E~44) = nan atan2 (~0.27182817E1, ~0.0) = ~1.570796371 pow (~0.27182817E1, ~0.0) = 1 atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.27182817E1, ~inf) = ~3.141592503 pow (~0.27182817E1, ~inf) = 0 atan2 (~0.27182817E1, nan) = nan pow (~0.27182817E1, nan) = nan atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.123E1, 0.34028235E39) = ~3.614645185E~39 pow (~0.123E1, 0.34028235E39) = inf atan2 (~0.123E1, 0.17014117E39) = ~7.22929037E~39 pow (~0.123E1, 0.17014117E39) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996983E~4 pow (~0.123E1, 0.123E4) = inf atan2 (~0.123E1, 0.123E2) = ~0.09966865182 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.31415927E1) = ~0.3731757104 pow (~0.123E1, 0.31415927E1) = nan atan2 (~0.123E1, 0.27182817E1) = ~0.4249241352 pow (~0.123E1, 0.27182817E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981853 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127629 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796324 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.11754944E~37) = ~1.570796371 pow (~0.123E1, 0.11754944E~37) = nan atan2 (~0.123E1, 0.5877472E~38) = ~1.570796371 pow (~0.123E1, 0.5877472E~38) = nan atan2 (~0.123E1, 0.1E~44) = ~1.570796371 pow (~0.123E1, 0.1E~44) = nan atan2 (~0.123E1, 0.0) = ~1.570796371 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.34028235E39) = ~3.141592503 pow (~0.123E1, ~0.34028235E39) = 0 atan2 (~0.123E1, ~0.17014117E39) = ~3.141592503 pow (~0.123E1, ~0.17014117E39) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592575 pow (~0.123E1, ~0.123E4) = 0 atan2 (~0.123E1, ~0.123E2) = ~3.041924 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.31415927E1) = ~2.768416882 pow (~0.123E1, ~0.31415927E1) = nan atan2 (~0.123E1, ~0.27182817E1) = ~2.716668606 pow (~0.123E1, ~0.27182817E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.356194496 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464993 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796298 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.11754944E~37) = ~1.570796371 pow (~0.123E1, ~0.11754944E~37) = nan atan2 (~0.123E1, ~0.5877472E~38) = ~1.570796371 pow (~0.123E1, ~0.5877472E~38) = nan atan2 (~0.123E1, ~0.1E~44) = ~1.570796371 pow (~0.123E1, ~0.1E~44) = nan atan2 (~0.123E1, ~0.0) = ~1.570796371 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592503 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.34028235E39) = ~3.614649389E~40 pow (~0.123, 0.34028235E39) = 0 atan2 (~0.123, 0.17014117E39) = ~7.229284764E~40 pow (~0.123, 0.17014117E39) = 0 atan2 (~0.123, 0.123E4) = ~1.000000047E~4 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666363 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.31415927E1) = ~0.0391321294 pow (~0.123, 0.31415927E1) = nan atan2 (~0.123, 0.27182817E1) = ~0.04521832988 pow (~0.123, 0.27182817E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865182 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981853 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.560796618 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.11754944E~37) = ~1.570796371 pow (~0.123, 0.11754944E~37) = nan atan2 (~0.123, 0.5877472E~38) = ~1.570796371 pow (~0.123, 0.5877472E~38) = nan atan2 (~0.123, 0.1E~44) = ~1.570796371 pow (~0.123, 0.1E~44) = nan atan2 (~0.123, 0.0) = ~1.570796371 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.34028235E39) = ~3.141592503 pow (~0.123, ~0.34028235E39) = inf atan2 (~0.123, ~0.17014117E39) = ~3.141592503 pow (~0.123, ~0.17014117E39) = inf atan2 (~0.123, ~0.123E4) = ~3.141492605 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592989 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.31415927E1) = ~3.102460623 pow (~0.123, ~0.31415927E1) = nan atan2 (~0.123, ~0.27182817E1) = ~3.096374273 pow (~0.123, ~0.27182817E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.356194496 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580796003 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.11754944E~37) = ~1.570796371 pow (~0.123, ~0.11754944E~37) = nan atan2 (~0.123, ~0.5877472E~38) = ~1.570796371 pow (~0.123, ~0.5877472E~38) = nan atan2 (~0.123, ~0.1E~44) = ~1.570796371 pow (~0.123, ~0.1E~44) = nan atan2 (~0.123, ~0.0) = ~1.570796371 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592503 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.34028235E39) = ~3.613948739E~42 pow (~0.123E~2, 0.34028235E39) = 0 atan2 (~0.123E~2, 0.17014117E39) = ~7.229298777E~42 pow (~0.123E~2, 0.17014117E39) = 0 atan2 (~0.123E~2, 0.123E4) = ~9.999999975E~7 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~1.000000047E~4 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.31415927E1) = ~3.915211419E~4 pow (~0.123E~2, 0.31415927E1) = nan atan2 (~0.123E~2, 0.27182817E1) = ~4.524917167E~4 pow (~0.123E~2, 0.27182817E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996983E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999667294 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981853 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.11754944E~37) = ~1.570796371 pow (~0.123E~2, 0.11754944E~37) = nan atan2 (~0.123E~2, 0.5877472E~38) = ~1.570796371 pow (~0.123E~2, 0.5877472E~38) = nan atan2 (~0.123E~2, 0.1E~44) = ~1.570796371 pow (~0.123E~2, 0.1E~44) = nan atan2 (~0.123E~2, 0.0) = ~1.570796371 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.34028235E39) = ~3.141592503 pow (~0.123E~2, ~0.34028235E39) = inf atan2 (~0.123E~2, ~0.17014117E39) = ~3.141592503 pow (~0.123E~2, ~0.17014117E39) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591549 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492605 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.31415927E1) = ~3.141201019 pow (~0.123E~2, ~0.31415927E1) = nan atan2 (~0.123E~2, ~0.27182817E1) = ~3.141140223 pow (~0.123E~2, ~0.27182817E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592575 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592989 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.356194496 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.11754944E~37) = ~1.570796371 pow (~0.123E~2, ~0.11754944E~37) = nan atan2 (~0.123E~2, ~0.5877472E~38) = ~1.570796371 pow (~0.123E~2, ~0.5877472E~38) = nan atan2 (~0.123E~2, ~0.1E~44) = ~1.570796371 pow (~0.123E~2, ~0.1E~44) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796371 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592503 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.11754944E~37, 0.34028235E39) = 0 pow (~0.11754944E~37, 0.34028235E39) = 0 atan2 (~0.11754944E~37, 0.17014117E39) = 0 pow (~0.11754944E~37, 0.17014117E39) = 0 atan2 (~0.11754944E~37, 0.123E4) = ~9.556855527E~42 pow (~0.11754944E~37, 0.123E4) = 0 atan2 (~0.11754944E~37, 0.123E2) = ~9.55686954E~40 pow (~0.11754944E~37, 0.123E2) = nan atan2 (~0.11754944E~37, 0.31415927E1) = ~3.74171493E~39 pow (~0.11754944E~37, 0.31415927E1) = nan atan2 (~0.11754944E~37, 0.27182817E1) = ~4.324402857E~39 pow (~0.11754944E~37, 0.27182817E1) = nan atan2 (~0.11754944E~37, 0.123E1) = ~9.556863934E~39 pow (~0.11754944E~37, 0.123E1) = nan atan2 (~0.11754944E~37, 0.123) = ~9.556864495E~38 pow (~0.11754944E~37, 0.123) = nan atan2 (~0.11754944E~37, 0.123E~2) = ~9.556864495E~36 pow (~0.11754944E~37, 0.123E~2) = nan atan2 (~0.11754944E~37, 0.11754944E~37) = ~0.7853981853 pow (~0.11754944E~37, 0.11754944E~37) = nan atan2 (~0.11754944E~37, 0.5877472E~38) = ~1.107148767 pow (~0.11754944E~37, 0.5877472E~38) = nan atan2 (~0.11754944E~37, 0.1E~44) = ~1.570796251 pow (~0.11754944E~37, 0.1E~44) = nan atan2 (~0.11754944E~37, 0.0) = ~1.570796371 pow (~0.11754944E~37, 0.0) = 1 atan2 (~0.11754944E~37, ~0.34028235E39) = ~3.141592503 pow (~0.11754944E~37, ~0.34028235E39) = inf atan2 (~0.11754944E~37, ~0.17014117E39) = ~3.141592503 pow (~0.11754944E~37, ~0.17014117E39) = inf atan2 (~0.11754944E~37, ~0.123E4) = ~3.141592503 pow (~0.11754944E~37, ~0.123E4) = inf atan2 (~0.11754944E~37, ~0.123E2) = ~3.141592503 pow (~0.11754944E~37, ~0.123E2) = nan atan2 (~0.11754944E~37, ~0.31415927E1) = ~3.141592503 pow (~0.11754944E~37, ~0.31415927E1) = nan atan2 (~0.11754944E~37, ~0.27182817E1) = ~3.141592503 pow (~0.11754944E~37, ~0.27182817E1) = nan atan2 (~0.11754944E~37, ~0.123E1) = ~3.141592503 pow (~0.11754944E~37, ~0.123E1) = nan atan2 (~0.11754944E~37, ~0.123) = ~3.141592503 pow (~0.11754944E~37, ~0.123) = nan atan2 (~0.11754944E~37, ~0.123E~2) = ~3.141592503 pow (~0.11754944E~37, ~0.123E~2) = nan atan2 (~0.11754944E~37, ~0.11754944E~37) = ~2.356194496 pow (~0.11754944E~37, ~0.11754944E~37) = nan atan2 (~0.11754944E~37, ~0.5877472E~38) = ~2.034443855 pow (~0.11754944E~37, ~0.5877472E~38) = nan atan2 (~0.11754944E~37, ~0.1E~44) = ~1.57079649 pow (~0.11754944E~37, ~0.1E~44) = nan atan2 (~0.11754944E~37, ~0.0) = ~1.570796371 pow (~0.11754944E~37, ~0.0) = 1 atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.11754944E~37, ~inf) = ~3.141592503 pow (~0.11754944E~37, ~inf) = inf atan2 (~0.11754944E~37, nan) = nan pow (~0.11754944E~37, nan) = nan atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.5877472E~38, 0.34028235E39) = 0 pow (~0.5877472E~38, 0.34028235E39) = 0 atan2 (~0.5877472E~38, 0.17014117E39) = 0 pow (~0.5877472E~38, 0.17014117E39) = 0 atan2 (~0.5877472E~38, 0.123E4) = ~4.778427763E~42 pow (~0.5877472E~38, 0.123E4) = 0 atan2 (~0.5877472E~38, 0.123E2) = ~4.778427763E~40 pow (~0.5877472E~38, 0.123E2) = nan atan2 (~0.5877472E~38, 0.31415927E1) = ~1.870856764E~39 pow (~0.5877472E~38, 0.31415927E1) = nan atan2 (~0.5877472E~38, 0.27182817E1) = ~2.162200728E~39 pow (~0.5877472E~38, 0.27182817E1) = nan atan2 (~0.5877472E~38, 0.123E1) = ~4.778431967E~39 pow (~0.5877472E~38, 0.123E1) = nan atan2 (~0.5877472E~38, 0.123) = ~4.778432248E~38 pow (~0.5877472E~38, 0.123) = nan atan2 (~0.5877472E~38, 0.123E~2) = ~4.778432248E~36 pow (~0.5877472E~38, 0.123E~2) = nan atan2 (~0.5877472E~38, 0.11754944E~37) = ~0.463647604 pow (~0.5877472E~38, 0.11754944E~37) = nan atan2 (~0.5877472E~38, 0.5877472E~38) = ~0.7853981853 pow (~0.5877472E~38, 0.5877472E~38) = nan atan2 (~0.5877472E~38, 0.1E~44) = ~1.570796132 pow (~0.5877472E~38, 0.1E~44) = nan atan2 (~0.5877472E~38, 0.0) = ~1.570796371 pow (~0.5877472E~38, 0.0) = 1 atan2 (~0.5877472E~38, ~0.34028235E39) = ~3.141592503 pow (~0.5877472E~38, ~0.34028235E39) = inf atan2 (~0.5877472E~38, ~0.17014117E39) = ~3.141592503 pow (~0.5877472E~38, ~0.17014117E39) = inf atan2 (~0.5877472E~38, ~0.123E4) = ~3.141592503 pow (~0.5877472E~38, ~0.123E4) = inf atan2 (~0.5877472E~38, ~0.123E2) = ~3.141592503 pow (~0.5877472E~38, ~0.123E2) = nan atan2 (~0.5877472E~38, ~0.31415927E1) = ~3.141592503 pow (~0.5877472E~38, ~0.31415927E1) = nan atan2 (~0.5877472E~38, ~0.27182817E1) = ~3.141592503 pow (~0.5877472E~38, ~0.27182817E1) = nan atan2 (~0.5877472E~38, ~0.123E1) = ~3.141592503 pow (~0.5877472E~38, ~0.123E1) = nan atan2 (~0.5877472E~38, ~0.123) = ~3.141592503 pow (~0.5877472E~38, ~0.123) = nan atan2 (~0.5877472E~38, ~0.123E~2) = ~3.141592503 pow (~0.5877472E~38, ~0.123E~2) = nan atan2 (~0.5877472E~38, ~0.11754944E~37) = ~2.677945137 pow (~0.5877472E~38, ~0.11754944E~37) = nan atan2 (~0.5877472E~38, ~0.5877472E~38) = ~2.356194496 pow (~0.5877472E~38, ~0.5877472E~38) = nan atan2 (~0.5877472E~38, ~0.1E~44) = ~1.570796609 pow (~0.5877472E~38, ~0.1E~44) = nan atan2 (~0.5877472E~38, ~0.0) = ~1.570796371 pow (~0.5877472E~38, ~0.0) = 1 atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.5877472E~38, ~inf) = ~3.141592503 pow (~0.5877472E~38, ~inf) = inf atan2 (~0.5877472E~38, nan) = nan pow (~0.5877472E~38, nan) = nan atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.1E~44, 0.34028235E39) = 0 pow (~0.1E~44, 0.34028235E39) = 0 atan2 (~0.1E~44, 0.17014117E39) = 0 pow (~0.1E~44, 0.17014117E39) = 0 atan2 (~0.1E~44, 0.123E4) = 0 pow (~0.1E~44, 0.123E4) = 0 atan2 (~0.1E~44, 0.123E2) = 0 pow (~0.1E~44, 0.123E2) = nan atan2 (~0.1E~44, 0.31415927E1) = 0 pow (~0.1E~44, 0.31415927E1) = nan atan2 (~0.1E~44, 0.27182817E1) = 0 pow (~0.1E~44, 0.27182817E1) = nan atan2 (~0.1E~44, 0.123E1) = ~1.401298464E~45 pow (~0.1E~44, 0.123E1) = nan atan2 (~0.1E~44, 0.123) = ~1.121038771E~44 pow (~0.1E~44, 0.123) = nan atan2 (~0.1E~44, 0.123E~2) = ~1.139255651E~42 pow (~0.1E~44, 0.123E~2) = nan atan2 (~0.1E~44, 0.11754944E~37) = ~1.192092896E~7 pow (~0.1E~44, 0.11754944E~37) = nan atan2 (~0.1E~44, 0.5877472E~38) = ~2.384185791E~7 pow (~0.1E~44, 0.5877472E~38) = nan atan2 (~0.1E~44, 0.1E~44) = ~0.7853981853 pow (~0.1E~44, 0.1E~44) = nan atan2 (~0.1E~44, 0.0) = ~1.570796371 pow (~0.1E~44, 0.0) = 1 atan2 (~0.1E~44, ~0.34028235E39) = ~3.141592503 pow (~0.1E~44, ~0.34028235E39) = inf atan2 (~0.1E~44, ~0.17014117E39) = ~3.141592503 pow (~0.1E~44, ~0.17014117E39) = inf atan2 (~0.1E~44, ~0.123E4) = ~3.141592503 pow (~0.1E~44, ~0.123E4) = inf atan2 (~0.1E~44, ~0.123E2) = ~3.141592503 pow (~0.1E~44, ~0.123E2) = nan atan2 (~0.1E~44, ~0.31415927E1) = ~3.141592503 pow (~0.1E~44, ~0.31415927E1) = nan atan2 (~0.1E~44, ~0.27182817E1) = ~3.141592503 pow (~0.1E~44, ~0.27182817E1) = nan atan2 (~0.1E~44, ~0.123E1) = ~3.141592503 pow (~0.1E~44, ~0.123E1) = nan atan2 (~0.1E~44, ~0.123) = ~3.141592503 pow (~0.1E~44, ~0.123) = nan atan2 (~0.1E~44, ~0.123E~2) = ~3.141592503 pow (~0.1E~44, ~0.123E~2) = nan atan2 (~0.1E~44, ~0.11754944E~37) = ~3.141592503 pow (~0.1E~44, ~0.11754944E~37) = nan atan2 (~0.1E~44, ~0.5877472E~38) = ~3.141592503 pow (~0.1E~44, ~0.5877472E~38) = nan atan2 (~0.1E~44, ~0.1E~44) = ~2.356194496 pow (~0.1E~44, ~0.1E~44) = nan atan2 (~0.1E~44, ~0.0) = ~1.570796371 pow (~0.1E~44, ~0.0) = 1 atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.1E~44, ~inf) = ~3.141592503 pow (~0.1E~44, ~inf) = inf atan2 (~0.1E~44, nan) = nan pow (~0.1E~44, nan) = nan atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.0, 0.34028235E39) = 0 pow (~0.0, 0.34028235E39) = 0 atan2 (~0.0, 0.17014117E39) = 0 pow (~0.0, 0.17014117E39) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.31415927E1) = 0 pow (~0.0, 0.31415927E1) = 0 atan2 (~0.0, 0.27182817E1) = 0 pow (~0.0, 0.27182817E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.11754944E~37) = 0 pow (~0.0, 0.11754944E~37) = 0 atan2 (~0.0, 0.5877472E~38) = 0 pow (~0.0, 0.5877472E~38) = 0 atan2 (~0.0, 0.1E~44) = 0 pow (~0.0, 0.1E~44) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.34028235E39) = ~3.141592503 pow (~0.0, ~0.34028235E39) = inf atan2 (~0.0, ~0.17014117E39) = ~3.141592503 pow (~0.0, ~0.17014117E39) = inf atan2 (~0.0, ~0.123E4) = ~3.141592503 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592503 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.31415927E1) = ~3.141592503 pow (~0.0, ~0.31415927E1) = inf atan2 (~0.0, ~0.27182817E1) = ~3.141592503 pow (~0.0, ~0.27182817E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592503 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592503 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592503 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.11754944E~37) = ~3.141592503 pow (~0.0, ~0.11754944E~37) = inf atan2 (~0.0, ~0.5877472E~38) = ~3.141592503 pow (~0.0, ~0.5877472E~38) = inf atan2 (~0.0, ~0.1E~44) = ~3.141592503 pow (~0.0, ~0.1E~44) = inf atan2 (~0.0, ~0.0) = ~3.141592503 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592503 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (~inf, 0.34028235E39) = ~1.570796371 pow (~inf, 0.34028235E39) = inf atan2 (~inf, 0.17014117E39) = ~1.570796371 pow (~inf, 0.17014117E39) = inf atan2 (~inf, 0.123E4) = ~1.570796371 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796371 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.31415927E1) = ~1.570796371 pow (~inf, 0.31415927E1) = inf atan2 (~inf, 0.27182817E1) = ~1.570796371 pow (~inf, 0.27182817E1) = inf atan2 (~inf, 0.123E1) = ~1.570796371 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796371 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796371 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.11754944E~37) = ~1.570796371 pow (~inf, 0.11754944E~37) = inf atan2 (~inf, 0.5877472E~38) = ~1.570796371 pow (~inf, 0.5877472E~38) = inf atan2 (~inf, 0.1E~44) = ~1.570796371 pow (~inf, 0.1E~44) = inf atan2 (~inf, 0.0) = ~1.570796371 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.34028235E39) = ~1.570796371 pow (~inf, ~0.34028235E39) = 0 atan2 (~inf, ~0.17014117E39) = ~1.570796371 pow (~inf, ~0.17014117E39) = 0 atan2 (~inf, ~0.123E4) = ~1.570796371 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796371 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.31415927E1) = ~1.570796371 pow (~inf, ~0.31415927E1) = 0 atan2 (~inf, ~0.27182817E1) = ~1.570796371 pow (~inf, ~0.27182817E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796371 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796371 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796371 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.11754944E~37) = ~1.570796371 pow (~inf, ~0.11754944E~37) = 0 atan2 (~inf, ~0.5877472E~38) = ~1.570796371 pow (~inf, ~0.5877472E~38) = 0 atan2 (~inf, ~0.1E~44) = ~1.570796371 pow (~inf, ~0.1E~44) = 0 atan2 (~inf, ~0.0) = ~1.570796371 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.356194496 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (nan, 0.34028235E39) = nan pow (nan, 0.34028235E39) = nan atan2 (nan, 0.17014117E39) = nan pow (nan, 0.17014117E39) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.31415927E1) = nan pow (nan, 0.31415927E1) = nan atan2 (nan, 0.27182817E1) = nan pow (nan, 0.27182817E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.11754944E~37) = nan pow (nan, 0.11754944E~37) = nan atan2 (nan, 0.5877472E~38) = nan pow (nan, 0.5877472E~38) = nan atan2 (nan, 0.1E~44) = nan pow (nan, 0.1E~44) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.34028235E39) = nan pow (nan, ~0.34028235E39) = nan atan2 (nan, ~0.17014117E39) = nan pow (nan, ~0.17014117E39) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.31415927E1) = nan pow (nan, ~0.31415927E1) = nan atan2 (nan, ~0.27182817E1) = nan pow (nan, ~0.27182817E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.11754944E~37) = nan pow (nan, ~0.11754944E~37) = nan atan2 (nan, ~0.5877472E~38) = nan pow (nan, ~0.5877472E~38) = nan atan2 (nan, ~0.1E~44) = nan pow (nan, ~0.1E~44) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.34028235E39, 0.123E1, ~0.34028235E39): 0.78264946E38 inf (0.34028235E39, 0.123E1, ~0.17014117E39): 0.24840611E39 inf (0.34028235E39, 0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.34028235E39, ~0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (0.34028235E39, ~0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (0.34028235E39, ~0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.17014117E39, 0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (0.17014117E39, 0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (0.17014117E39, 0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (0.17014117E39, 0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.17014117E39, 0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.17014117E39, 0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.17014117E39, ~0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (0.17014117E39, ~0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (0.17014117E39, ~0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (0.17014117E39, ~0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.17014117E39, ~0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.17014117E39, ~0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123E4, 0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E4, 0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E4, 0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (0.123E4, 0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (0.123E4, 0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.123E4, 0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (0.123E4, 0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E4, 0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E4, 0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E4, 0.123, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E4, 0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E4, 0.123E~2, 0.123): 0.16359E1 0.16359001E1 (0.123E4, 0.123E~2, ~0.123E1): 0.28290004 0.2829001 (0.123E4, ~0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E4, ~0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E4, ~0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.123E4, ~0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.123E4, ~0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.123E4, ~0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.123E4, ~0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E4, ~0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E4, ~0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E4, ~0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (0.123E4, ~0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E4, ~0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, 0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E2, 0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E2, 0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E2, 0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E2, 0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E2, 0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E2, 0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (0.123E2, 0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.123E2, 0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (0.123E2, 0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (0.123E2, 0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (0.123E2, 0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.123E2, 0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (0.123E2, 0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (0.123E2, 0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.123E2, 0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.123E2, 0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (0.123E2, 0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.123E2, 0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E2, 0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E2, 0.123, 0.123): 0.16359E1 0.16359001E1 (0.123E2, 0.123, ~0.123E1): 0.28290004 0.2829001 (0.123E2, 0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E2, ~0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E2, ~0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E2, ~0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E2, ~0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E2, ~0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E2, ~0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E2, ~0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.123E2, ~0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (0.123E2, ~0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.123E2, ~0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.123E2, ~0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.123E2, ~0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.123E2, ~0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.123E2, ~0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.123E2, ~0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.123E2, ~0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.123E2, ~0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.123E2, ~0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E2, ~0.123, 0.123E1): ~0.28290004 ~0.2829001 (0.123E2, ~0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E2, ~0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, ~0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.31415927E1, 0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (0.31415927E1, 0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (0.31415927E1, 0.123E4, 0.123): 0.3864282E4 0.38642822E4 (0.31415927E1, 0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.31415927E1, 0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (0.31415927E1, 0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (0.31415927E1, 0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.31415927E1, 0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (0.31415927E1, 0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (0.31415927E1, 0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (0.31415927E1, 0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (0.31415927E1, 0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.31415927E1, 0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.31415927E1, 0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.31415927E1, 0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.31415927E1, 0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.31415927E1, 0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.31415927E1, 0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.31415927E1, 0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.31415927E1, 0.123E1, 0.123): 0.39871593E1 0.3987159E1 (0.31415927E1, 0.123, ~0.123E1): ~0.8435841 ~0.84358406 (0.31415927E1, 0.123, ~0.123): 0.2634159 0.26341593 (0.31415927E1, ~0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (0.31415927E1, ~0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.31415927E1, ~0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.31415927E1, ~0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.31415927E1, ~0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.31415927E1, ~0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.31415927E1, ~0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (0.31415927E1, ~0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.31415927E1, ~0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.31415927E1, ~0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.31415927E1, ~0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (0.31415927E1, ~0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.31415927E1, ~0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.31415927E1, ~0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.31415927E1, ~0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.31415927E1, ~0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.31415927E1, ~0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.31415927E1, ~0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.31415927E1, ~0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.31415927E1, ~0.123, 0.123E1): 0.8435841 0.84358406 (0.31415927E1, ~0.123, 0.123): ~0.2634159 ~0.26341593 (0.27182817E1, 0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (0.27182817E1, 0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (0.27182817E1, 0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.27182817E1, 0.123E2, 0.123): 0.33557865E2 0.3355787E2 (0.27182817E1, 0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (0.27182817E1, 0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.27182817E1, 0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.27182817E1, 0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (0.27182817E1, 0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.27182817E1, 0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.27182817E1, 0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.27182817E1, 0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.27182817E1, 0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.27182817E1, 0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.27182817E1, 0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.27182817E1, 0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.27182817E1, 0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (0.27182817E1, 0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (0.27182817E1, 0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (0.27182817E1, 0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.27182817E1, 0.123E1, 0.123): 0.34664867E1 0.34664865E1 (0.27182817E1, 0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (0.27182817E1, 0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (0.27182817E1, 0.123, 0.123E~2): 0.33557865 0.33557868 (0.27182817E1, 0.123, ~0.123): 0.21134867 0.21134868 (0.27182817E1, ~0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (0.27182817E1, ~0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (0.27182817E1, ~0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.27182817E1, ~0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.27182817E1, ~0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.27182817E1, ~0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.27182817E1, ~0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.27182817E1, ~0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.27182817E1, ~0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.27182817E1, ~0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.27182817E1, ~0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.27182817E1, ~0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.27182817E1, ~0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.27182817E1, ~0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.27182817E1, ~0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.27182817E1, ~0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (0.27182817E1, ~0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (0.27182817E1, ~0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (0.27182817E1, ~0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.27182817E1, ~0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.27182817E1, ~0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.27182817E1, ~0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.27182817E1, ~0.123, 0.123): ~0.21134867 ~0.21134868 (0.27182817E1, ~0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123E1, 0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (0.123E1, 0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (0.123E1, 0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.123E1, 0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.123E1, 0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E1, 0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.123E1, 0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (0.123E1, 0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.123E1, 0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (0.123E1, 0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (0.123E1, 0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (0.123E1, 0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (0.123E1, 0.123E1, ~0.123E1): 0.28290004 0.28289998 (0.123E1, 0.123E1, ~0.123): 0.13899001E1 0.13899E1 (0.123E1, 0.123, 0.123E1): 0.13812901E1 0.138129E1 (0.123E1, 0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123E1, 0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123E1, 0.123, ~0.123E~2): 0.15006001 0.15006 (0.123E1, 0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E1, ~0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (0.123E1, ~0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (0.123E1, ~0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.123E1, ~0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.123E1, ~0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E1, ~0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.123E1, ~0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.123E1, ~0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.123E1, ~0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.123E1, ~0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.123E1, ~0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.123E1, ~0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (0.123E1, ~0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (0.123E1, ~0.123, 0.123E1): 0.107871E1 0.10787101E1 (0.123E1, ~0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123E1, ~0.123, 0.123E~2): ~0.15006001 ~0.15006 (0.123E1, ~0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E1, ~0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (0.123, 0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.123, 0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.123, 0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123, 0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123, 0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123, 0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (0.123, 0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123, 0.123E2, 0.123): 0.16359E1 0.16359001E1 (0.123, 0.123E2, ~0.123E1): 0.28290004 0.2829001 (0.123, 0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (0.123, 0.31415927E1, ~0.123): 0.2634159 0.26341593 (0.123, 0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (0.123, 0.27182817E1, ~0.123): 0.21134867 0.21134868 (0.123, 0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (0.123, 0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123, 0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123, 0.123E1, ~0.123E~2): 0.15006001 0.15006 (0.123, ~0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.123, ~0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123, ~0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123, ~0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123, ~0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123, ~0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123, ~0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (0.123, ~0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123, ~0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123, ~0.31415927E1, 0.123E1): 0.8435841 0.84358406 (0.123, ~0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (0.123, ~0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (0.123, ~0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123, ~0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (0.123, ~0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123, ~0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (0.123, ~0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E~2, 0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E~2, 0.123E4, 0.123): 0.16359E1 0.16359001E1 (0.123E~2, 0.123E4, ~0.123E1): 0.28290004 0.2829001 (0.123E~2, 0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E~2, 0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E~2, ~0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (0.123E~2, ~0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E~2, ~0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E~2, ~0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.123E~2, ~0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.34028235E39, 0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (~0.34028235E39, 0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (~0.34028235E39, 0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.34028235E39, ~0.123E1, ~0.34028235E39): 0.78264946E38 inf (~0.34028235E39, ~0.123E1, ~0.17014117E39): 0.24840611E39 inf (~0.34028235E39, ~0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.17014117E39, 0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (~0.17014117E39, 0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (~0.17014117E39, 0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (~0.17014117E39, 0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.17014117E39, 0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.17014117E39, 0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.17014117E39, ~0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (~0.17014117E39, ~0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (~0.17014117E39, ~0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (~0.17014117E39, ~0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.17014117E39, ~0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.17014117E39, ~0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123E4, 0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E4, 0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E4, 0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.123E4, 0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.123E4, 0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.123E4, 0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.123E4, 0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E4, 0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E4, 0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E4, 0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E4, 0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E4, 0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E4, ~0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E4, ~0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E4, ~0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (~0.123E4, ~0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (~0.123E4, ~0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.123E4, ~0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.123E4, ~0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E4, ~0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E4, ~0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E4, ~0.123, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E4, ~0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E4, ~0.123E~2, 0.123): 0.16359E1 0.16359001E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, 0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E2, 0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E2, 0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E2, 0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E2, 0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E2, 0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E2, 0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.123E2, 0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.123E2, 0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.123E2, 0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.123E2, 0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.123E2, 0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.123E2, 0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.123E2, 0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.123E2, 0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.123E2, 0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.123E2, 0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.123E2, 0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E2, 0.123, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E2, 0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E2, 0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E2, 0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E2, ~0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E2, ~0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E2, ~0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E2, ~0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E2, ~0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E2, ~0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E2, ~0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (~0.123E2, ~0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.123E2, ~0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.123E2, ~0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.123E2, ~0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (~0.123E2, ~0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.123E2, ~0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (~0.123E2, ~0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.123E2, ~0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.123E2, ~0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.123E2, ~0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.123E2, ~0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E2, ~0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E2, ~0.123, 0.123): 0.16359E1 0.16359001E1 (~0.123E2, ~0.123, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, ~0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.31415927E1, 0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (~0.31415927E1, 0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.31415927E1, 0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.31415927E1, 0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.31415927E1, 0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.31415927E1, 0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.31415927E1, 0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.31415927E1, 0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.31415927E1, 0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.31415927E1, 0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.31415927E1, 0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (~0.31415927E1, 0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.31415927E1, 0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.31415927E1, 0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.31415927E1, 0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.31415927E1, 0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.31415927E1, 0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.31415927E1, 0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.31415927E1, 0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.31415927E1, 0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.31415927E1, 0.123, 0.123E1): 0.8435841 0.84358406 (~0.31415927E1, 0.123, 0.123): ~0.2634159 ~0.26341593 (~0.31415927E1, ~0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (~0.31415927E1, ~0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (~0.31415927E1, ~0.123E4, 0.123): 0.3864282E4 0.38642822E4 (~0.31415927E1, ~0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.31415927E1, ~0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.31415927E1, ~0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (~0.31415927E1, ~0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.31415927E1, ~0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.31415927E1, ~0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.31415927E1, ~0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (~0.31415927E1, ~0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (~0.31415927E1, ~0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.31415927E1, ~0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.31415927E1, ~0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.31415927E1, ~0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.31415927E1, ~0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.31415927E1, ~0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.31415927E1, ~0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.31415927E1, ~0.123E1, 0.123): 0.39871593E1 0.3987159E1 (~0.31415927E1, ~0.123, ~0.123E1): ~0.8435841 ~0.84358406 (~0.31415927E1, ~0.123, ~0.123): 0.2634159 0.26341593 (~0.27182817E1, 0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (~0.27182817E1, 0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (~0.27182817E1, 0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.27182817E1, 0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.27182817E1, 0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.27182817E1, 0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.27182817E1, 0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.27182817E1, 0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.27182817E1, 0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.27182817E1, 0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.27182817E1, 0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.27182817E1, 0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.27182817E1, 0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.27182817E1, 0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.27182817E1, 0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.27182817E1, 0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.27182817E1, 0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (~0.27182817E1, 0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (~0.27182817E1, 0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (~0.27182817E1, 0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.27182817E1, 0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.27182817E1, 0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.27182817E1, 0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.27182817E1, 0.123, 0.123): ~0.21134867 ~0.21134868 (~0.27182817E1, 0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.27182817E1, ~0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (~0.27182817E1, ~0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (~0.27182817E1, ~0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.27182817E1, ~0.123E2, 0.123): 0.33557865E2 0.3355787E2 (~0.27182817E1, ~0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.27182817E1, ~0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.27182817E1, ~0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.27182817E1, ~0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.27182817E1, ~0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.27182817E1, ~0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.27182817E1, ~0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.27182817E1, ~0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.27182817E1, ~0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.27182817E1, ~0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.27182817E1, ~0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.27182817E1, ~0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (~0.27182817E1, ~0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (~0.27182817E1, ~0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (~0.27182817E1, ~0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.27182817E1, ~0.123E1, 0.123): 0.34664867E1 0.34664865E1 (~0.27182817E1, ~0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.27182817E1, ~0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.27182817E1, ~0.123, 0.123E~2): 0.33557865 0.33557868 (~0.27182817E1, ~0.123, ~0.123): 0.21134867 0.21134868 (~0.123E1, 0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (~0.123E1, 0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (~0.123E1, 0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.123E1, 0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.123E1, 0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E1, 0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.123E1, 0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.123E1, 0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.123E1, 0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.123E1, 0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.123E1, 0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.123E1, 0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (~0.123E1, 0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (~0.123E1, 0.123, 0.123E1): 0.107871E1 0.10787101E1 (~0.123E1, 0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123E1, 0.123, 0.123E~2): ~0.15006001 ~0.15006 (~0.123E1, 0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123E1, 0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E1, ~0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (~0.123E1, ~0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (~0.123E1, ~0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.123E1, ~0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.123E1, ~0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E1, ~0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.123E1, ~0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (~0.123E1, ~0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.123E1, ~0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (~0.123E1, ~0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.123E1, ~0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.123E1, ~0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.28290004 0.28289998 (~0.123E1, ~0.123E1, ~0.123): 0.13899001E1 0.13899E1 (~0.123E1, ~0.123, 0.123E1): 0.13812901E1 0.138129E1 (~0.123E1, ~0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123E1, ~0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123E1, ~0.123, ~0.123E~2): 0.15006001 0.15006 (~0.123E1, ~0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (~0.123, 0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.123, 0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.123, 0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123, 0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123, 0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123, 0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123, 0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123, 0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123, 0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123, 0.31415927E1, 0.123E1): 0.8435841 0.84358406 (~0.123, 0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (~0.123, 0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (~0.123, 0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.123, 0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (~0.123, 0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123, 0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (~0.123, 0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123, ~0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.123, ~0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123, ~0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123, ~0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123, ~0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123, ~0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123, ~0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123, ~0.123E2, 0.123): 0.16359E1 0.16359001E1 (~0.123, ~0.123E2, ~0.123E1): 0.28290004 0.2829001 (~0.123, ~0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (~0.123, ~0.31415927E1, ~0.123): 0.2634159 0.26341593 (~0.123, ~0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (~0.123, ~0.27182817E1, ~0.123): 0.21134867 0.21134868 (~0.123, ~0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (~0.123, ~0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123, ~0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123, ~0.123E1, ~0.123E~2): 0.15006001 0.15006 (~0.123E~2, 0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E~2, 0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E~2, 0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E~2, 0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E~2, 0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E~2, ~0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E~2, ~0.123E4, 0.123): 0.16359E1 0.16359001E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.28290004 0.2829001 (~0.123E~2, ~0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.123E~2, ~0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.34028235E39, 0.34028235E39) = false > (0.34028235E39, 0.34028235E39) = false == (0.34028235E39, 0.34028235E39) = true ?= (0.34028235E39, 0.34028235E39) = true < (0.34028235E39, 0.17014117E39) = false > (0.34028235E39, 0.17014117E39) = true == (0.34028235E39, 0.17014117E39) = false ?= (0.34028235E39, 0.17014117E39) = false < (0.34028235E39, 0.123E4) = false > (0.34028235E39, 0.123E4) = true == (0.34028235E39, 0.123E4) = false ?= (0.34028235E39, 0.123E4) = false < (0.34028235E39, 0.123E2) = false > (0.34028235E39, 0.123E2) = true == (0.34028235E39, 0.123E2) = false ?= (0.34028235E39, 0.123E2) = false < (0.34028235E39, 0.31415927E1) = false > (0.34028235E39, 0.31415927E1) = true == (0.34028235E39, 0.31415927E1) = false ?= (0.34028235E39, 0.31415927E1) = false < (0.34028235E39, 0.27182817E1) = false > (0.34028235E39, 0.27182817E1) = true == (0.34028235E39, 0.27182817E1) = false ?= (0.34028235E39, 0.27182817E1) = false < (0.34028235E39, 0.123E1) = false > (0.34028235E39, 0.123E1) = true == (0.34028235E39, 0.123E1) = false ?= (0.34028235E39, 0.123E1) = false < (0.34028235E39, 0.123) = false > (0.34028235E39, 0.123) = true == (0.34028235E39, 0.123) = false ?= (0.34028235E39, 0.123) = false < (0.34028235E39, 0.123E~2) = false > (0.34028235E39, 0.123E~2) = true == (0.34028235E39, 0.123E~2) = false ?= (0.34028235E39, 0.123E~2) = false < (0.34028235E39, 0.11754944E~37) = false > (0.34028235E39, 0.11754944E~37) = true == (0.34028235E39, 0.11754944E~37) = false ?= (0.34028235E39, 0.11754944E~37) = false < (0.34028235E39, 0.5877472E~38) = false > (0.34028235E39, 0.5877472E~38) = true == (0.34028235E39, 0.5877472E~38) = false ?= (0.34028235E39, 0.5877472E~38) = false < (0.34028235E39, 0.1E~44) = false > (0.34028235E39, 0.1E~44) = true == (0.34028235E39, 0.1E~44) = false ?= (0.34028235E39, 0.1E~44) = false < (0.34028235E39, 0.0) = false > (0.34028235E39, 0.0) = true == (0.34028235E39, 0.0) = false ?= (0.34028235E39, 0.0) = false < (0.34028235E39, ~0.34028235E39) = false > (0.34028235E39, ~0.34028235E39) = true == (0.34028235E39, ~0.34028235E39) = false ?= (0.34028235E39, ~0.34028235E39) = false < (0.34028235E39, ~0.17014117E39) = false > (0.34028235E39, ~0.17014117E39) = true == (0.34028235E39, ~0.17014117E39) = false ?= (0.34028235E39, ~0.17014117E39) = false < (0.34028235E39, ~0.123E4) = false > (0.34028235E39, ~0.123E4) = true == (0.34028235E39, ~0.123E4) = false ?= (0.34028235E39, ~0.123E4) = false < (0.34028235E39, ~0.123E2) = false > (0.34028235E39, ~0.123E2) = true == (0.34028235E39, ~0.123E2) = false ?= (0.34028235E39, ~0.123E2) = false < (0.34028235E39, ~0.31415927E1) = false > (0.34028235E39, ~0.31415927E1) = true == (0.34028235E39, ~0.31415927E1) = false ?= (0.34028235E39, ~0.31415927E1) = false < (0.34028235E39, ~0.27182817E1) = false > (0.34028235E39, ~0.27182817E1) = true == (0.34028235E39, ~0.27182817E1) = false ?= (0.34028235E39, ~0.27182817E1) = false < (0.34028235E39, ~0.123E1) = false > (0.34028235E39, ~0.123E1) = true == (0.34028235E39, ~0.123E1) = false ?= (0.34028235E39, ~0.123E1) = false < (0.34028235E39, ~0.123) = false > (0.34028235E39, ~0.123) = true == (0.34028235E39, ~0.123) = false ?= (0.34028235E39, ~0.123) = false < (0.34028235E39, ~0.123E~2) = false > (0.34028235E39, ~0.123E~2) = true == (0.34028235E39, ~0.123E~2) = false ?= (0.34028235E39, ~0.123E~2) = false < (0.34028235E39, ~0.11754944E~37) = false > (0.34028235E39, ~0.11754944E~37) = true == (0.34028235E39, ~0.11754944E~37) = false ?= (0.34028235E39, ~0.11754944E~37) = false < (0.34028235E39, ~0.5877472E~38) = false > (0.34028235E39, ~0.5877472E~38) = true == (0.34028235E39, ~0.5877472E~38) = false ?= (0.34028235E39, ~0.5877472E~38) = false < (0.34028235E39, ~0.1E~44) = false > (0.34028235E39, ~0.1E~44) = true == (0.34028235E39, ~0.1E~44) = false ?= (0.34028235E39, ~0.1E~44) = false < (0.34028235E39, ~0.0) = false > (0.34028235E39, ~0.0) = true == (0.34028235E39, ~0.0) = false ?= (0.34028235E39, ~0.0) = false < (0.17014117E39, 0.34028235E39) = true > (0.17014117E39, 0.34028235E39) = false == (0.17014117E39, 0.34028235E39) = false ?= (0.17014117E39, 0.34028235E39) = false < (0.17014117E39, 0.17014117E39) = false > (0.17014117E39, 0.17014117E39) = false == (0.17014117E39, 0.17014117E39) = true ?= (0.17014117E39, 0.17014117E39) = true < (0.17014117E39, 0.123E4) = false > (0.17014117E39, 0.123E4) = true == (0.17014117E39, 0.123E4) = false ?= (0.17014117E39, 0.123E4) = false < (0.17014117E39, 0.123E2) = false > (0.17014117E39, 0.123E2) = true == (0.17014117E39, 0.123E2) = false ?= (0.17014117E39, 0.123E2) = false < (0.17014117E39, 0.31415927E1) = false > (0.17014117E39, 0.31415927E1) = true == (0.17014117E39, 0.31415927E1) = false ?= (0.17014117E39, 0.31415927E1) = false < (0.17014117E39, 0.27182817E1) = false > (0.17014117E39, 0.27182817E1) = true == (0.17014117E39, 0.27182817E1) = false ?= (0.17014117E39, 0.27182817E1) = false < (0.17014117E39, 0.123E1) = false > (0.17014117E39, 0.123E1) = true == (0.17014117E39, 0.123E1) = false ?= (0.17014117E39, 0.123E1) = false < (0.17014117E39, 0.123) = false > (0.17014117E39, 0.123) = true == (0.17014117E39, 0.123) = false ?= (0.17014117E39, 0.123) = false < (0.17014117E39, 0.123E~2) = false > (0.17014117E39, 0.123E~2) = true == (0.17014117E39, 0.123E~2) = false ?= (0.17014117E39, 0.123E~2) = false < (0.17014117E39, 0.11754944E~37) = false > (0.17014117E39, 0.11754944E~37) = true == (0.17014117E39, 0.11754944E~37) = false ?= (0.17014117E39, 0.11754944E~37) = false < (0.17014117E39, 0.5877472E~38) = false > (0.17014117E39, 0.5877472E~38) = true == (0.17014117E39, 0.5877472E~38) = false ?= (0.17014117E39, 0.5877472E~38) = false < (0.17014117E39, 0.1E~44) = false > (0.17014117E39, 0.1E~44) = true == (0.17014117E39, 0.1E~44) = false ?= (0.17014117E39, 0.1E~44) = false < (0.17014117E39, 0.0) = false > (0.17014117E39, 0.0) = true == (0.17014117E39, 0.0) = false ?= (0.17014117E39, 0.0) = false < (0.17014117E39, ~0.34028235E39) = false > (0.17014117E39, ~0.34028235E39) = true == (0.17014117E39, ~0.34028235E39) = false ?= (0.17014117E39, ~0.34028235E39) = false < (0.17014117E39, ~0.17014117E39) = false > (0.17014117E39, ~0.17014117E39) = true == (0.17014117E39, ~0.17014117E39) = false ?= (0.17014117E39, ~0.17014117E39) = false < (0.17014117E39, ~0.123E4) = false > (0.17014117E39, ~0.123E4) = true == (0.17014117E39, ~0.123E4) = false ?= (0.17014117E39, ~0.123E4) = false < (0.17014117E39, ~0.123E2) = false > (0.17014117E39, ~0.123E2) = true == (0.17014117E39, ~0.123E2) = false ?= (0.17014117E39, ~0.123E2) = false < (0.17014117E39, ~0.31415927E1) = false > (0.17014117E39, ~0.31415927E1) = true == (0.17014117E39, ~0.31415927E1) = false ?= (0.17014117E39, ~0.31415927E1) = false < (0.17014117E39, ~0.27182817E1) = false > (0.17014117E39, ~0.27182817E1) = true == (0.17014117E39, ~0.27182817E1) = false ?= (0.17014117E39, ~0.27182817E1) = false < (0.17014117E39, ~0.123E1) = false > (0.17014117E39, ~0.123E1) = true == (0.17014117E39, ~0.123E1) = false ?= (0.17014117E39, ~0.123E1) = false < (0.17014117E39, ~0.123) = false > (0.17014117E39, ~0.123) = true == (0.17014117E39, ~0.123) = false ?= (0.17014117E39, ~0.123) = false < (0.17014117E39, ~0.123E~2) = false > (0.17014117E39, ~0.123E~2) = true == (0.17014117E39, ~0.123E~2) = false ?= (0.17014117E39, ~0.123E~2) = false < (0.17014117E39, ~0.11754944E~37) = false > (0.17014117E39, ~0.11754944E~37) = true == (0.17014117E39, ~0.11754944E~37) = false ?= (0.17014117E39, ~0.11754944E~37) = false < (0.17014117E39, ~0.5877472E~38) = false > (0.17014117E39, ~0.5877472E~38) = true == (0.17014117E39, ~0.5877472E~38) = false ?= (0.17014117E39, ~0.5877472E~38) = false < (0.17014117E39, ~0.1E~44) = false > (0.17014117E39, ~0.1E~44) = true == (0.17014117E39, ~0.1E~44) = false ?= (0.17014117E39, ~0.1E~44) = false < (0.17014117E39, ~0.0) = false > (0.17014117E39, ~0.0) = true == (0.17014117E39, ~0.0) = false ?= (0.17014117E39, ~0.0) = false < (0.123E4, 0.34028235E39) = true > (0.123E4, 0.34028235E39) = false == (0.123E4, 0.34028235E39) = false ?= (0.123E4, 0.34028235E39) = false < (0.123E4, 0.17014117E39) = true > (0.123E4, 0.17014117E39) = false == (0.123E4, 0.17014117E39) = false ?= (0.123E4, 0.17014117E39) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.31415927E1) = false > (0.123E4, 0.31415927E1) = true == (0.123E4, 0.31415927E1) = false ?= (0.123E4, 0.31415927E1) = false < (0.123E4, 0.27182817E1) = false > (0.123E4, 0.27182817E1) = true == (0.123E4, 0.27182817E1) = false ?= (0.123E4, 0.27182817E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.11754944E~37) = false > (0.123E4, 0.11754944E~37) = true == (0.123E4, 0.11754944E~37) = false ?= (0.123E4, 0.11754944E~37) = false < (0.123E4, 0.5877472E~38) = false > (0.123E4, 0.5877472E~38) = true == (0.123E4, 0.5877472E~38) = false ?= (0.123E4, 0.5877472E~38) = false < (0.123E4, 0.1E~44) = false > (0.123E4, 0.1E~44) = true == (0.123E4, 0.1E~44) = false ?= (0.123E4, 0.1E~44) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.34028235E39) = false > (0.123E4, ~0.34028235E39) = true == (0.123E4, ~0.34028235E39) = false ?= (0.123E4, ~0.34028235E39) = false < (0.123E4, ~0.17014117E39) = false > (0.123E4, ~0.17014117E39) = true == (0.123E4, ~0.17014117E39) = false ?= (0.123E4, ~0.17014117E39) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.31415927E1) = false > (0.123E4, ~0.31415927E1) = true == (0.123E4, ~0.31415927E1) = false ?= (0.123E4, ~0.31415927E1) = false < (0.123E4, ~0.27182817E1) = false > (0.123E4, ~0.27182817E1) = true == (0.123E4, ~0.27182817E1) = false ?= (0.123E4, ~0.27182817E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.11754944E~37) = false > (0.123E4, ~0.11754944E~37) = true == (0.123E4, ~0.11754944E~37) = false ?= (0.123E4, ~0.11754944E~37) = false < (0.123E4, ~0.5877472E~38) = false > (0.123E4, ~0.5877472E~38) = true == (0.123E4, ~0.5877472E~38) = false ?= (0.123E4, ~0.5877472E~38) = false < (0.123E4, ~0.1E~44) = false > (0.123E4, ~0.1E~44) = true == (0.123E4, ~0.1E~44) = false ?= (0.123E4, ~0.1E~44) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.34028235E39) = true > (0.123E2, 0.34028235E39) = false == (0.123E2, 0.34028235E39) = false ?= (0.123E2, 0.34028235E39) = false < (0.123E2, 0.17014117E39) = true > (0.123E2, 0.17014117E39) = false == (0.123E2, 0.17014117E39) = false ?= (0.123E2, 0.17014117E39) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.31415927E1) = false > (0.123E2, 0.31415927E1) = true == (0.123E2, 0.31415927E1) = false ?= (0.123E2, 0.31415927E1) = false < (0.123E2, 0.27182817E1) = false > (0.123E2, 0.27182817E1) = true == (0.123E2, 0.27182817E1) = false ?= (0.123E2, 0.27182817E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.11754944E~37) = false > (0.123E2, 0.11754944E~37) = true == (0.123E2, 0.11754944E~37) = false ?= (0.123E2, 0.11754944E~37) = false < (0.123E2, 0.5877472E~38) = false > (0.123E2, 0.5877472E~38) = true == (0.123E2, 0.5877472E~38) = false ?= (0.123E2, 0.5877472E~38) = false < (0.123E2, 0.1E~44) = false > (0.123E2, 0.1E~44) = true == (0.123E2, 0.1E~44) = false ?= (0.123E2, 0.1E~44) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.34028235E39) = false > (0.123E2, ~0.34028235E39) = true == (0.123E2, ~0.34028235E39) = false ?= (0.123E2, ~0.34028235E39) = false < (0.123E2, ~0.17014117E39) = false > (0.123E2, ~0.17014117E39) = true == (0.123E2, ~0.17014117E39) = false ?= (0.123E2, ~0.17014117E39) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.31415927E1) = false > (0.123E2, ~0.31415927E1) = true == (0.123E2, ~0.31415927E1) = false ?= (0.123E2, ~0.31415927E1) = false < (0.123E2, ~0.27182817E1) = false > (0.123E2, ~0.27182817E1) = true == (0.123E2, ~0.27182817E1) = false ?= (0.123E2, ~0.27182817E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.11754944E~37) = false > (0.123E2, ~0.11754944E~37) = true == (0.123E2, ~0.11754944E~37) = false ?= (0.123E2, ~0.11754944E~37) = false < (0.123E2, ~0.5877472E~38) = false > (0.123E2, ~0.5877472E~38) = true == (0.123E2, ~0.5877472E~38) = false ?= (0.123E2, ~0.5877472E~38) = false < (0.123E2, ~0.1E~44) = false > (0.123E2, ~0.1E~44) = true == (0.123E2, ~0.1E~44) = false ?= (0.123E2, ~0.1E~44) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.31415927E1, 0.34028235E39) = true > (0.31415927E1, 0.34028235E39) = false == (0.31415927E1, 0.34028235E39) = false ?= (0.31415927E1, 0.34028235E39) = false < (0.31415927E1, 0.17014117E39) = true > (0.31415927E1, 0.17014117E39) = false == (0.31415927E1, 0.17014117E39) = false ?= (0.31415927E1, 0.17014117E39) = false < (0.31415927E1, 0.123E4) = true > (0.31415927E1, 0.123E4) = false == (0.31415927E1, 0.123E4) = false ?= (0.31415927E1, 0.123E4) = false < (0.31415927E1, 0.123E2) = true > (0.31415927E1, 0.123E2) = false == (0.31415927E1, 0.123E2) = false ?= (0.31415927E1, 0.123E2) = false < (0.31415927E1, 0.31415927E1) = false > (0.31415927E1, 0.31415927E1) = false == (0.31415927E1, 0.31415927E1) = true ?= (0.31415927E1, 0.31415927E1) = true < (0.31415927E1, 0.27182817E1) = false > (0.31415927E1, 0.27182817E1) = true == (0.31415927E1, 0.27182817E1) = false ?= (0.31415927E1, 0.27182817E1) = false < (0.31415927E1, 0.123E1) = false > (0.31415927E1, 0.123E1) = true == (0.31415927E1, 0.123E1) = false ?= (0.31415927E1, 0.123E1) = false < (0.31415927E1, 0.123) = false > (0.31415927E1, 0.123) = true == (0.31415927E1, 0.123) = false ?= (0.31415927E1, 0.123) = false < (0.31415927E1, 0.123E~2) = false > (0.31415927E1, 0.123E~2) = true == (0.31415927E1, 0.123E~2) = false ?= (0.31415927E1, 0.123E~2) = false < (0.31415927E1, 0.11754944E~37) = false > (0.31415927E1, 0.11754944E~37) = true == (0.31415927E1, 0.11754944E~37) = false ?= (0.31415927E1, 0.11754944E~37) = false < (0.31415927E1, 0.5877472E~38) = false > (0.31415927E1, 0.5877472E~38) = true == (0.31415927E1, 0.5877472E~38) = false ?= (0.31415927E1, 0.5877472E~38) = false < (0.31415927E1, 0.1E~44) = false > (0.31415927E1, 0.1E~44) = true == (0.31415927E1, 0.1E~44) = false ?= (0.31415927E1, 0.1E~44) = false < (0.31415927E1, 0.0) = false > (0.31415927E1, 0.0) = true == (0.31415927E1, 0.0) = false ?= (0.31415927E1, 0.0) = false < (0.31415927E1, ~0.34028235E39) = false > (0.31415927E1, ~0.34028235E39) = true == (0.31415927E1, ~0.34028235E39) = false ?= (0.31415927E1, ~0.34028235E39) = false < (0.31415927E1, ~0.17014117E39) = false > (0.31415927E1, ~0.17014117E39) = true == (0.31415927E1, ~0.17014117E39) = false ?= (0.31415927E1, ~0.17014117E39) = false < (0.31415927E1, ~0.123E4) = false > (0.31415927E1, ~0.123E4) = true == (0.31415927E1, ~0.123E4) = false ?= (0.31415927E1, ~0.123E4) = false < (0.31415927E1, ~0.123E2) = false > (0.31415927E1, ~0.123E2) = true == (0.31415927E1, ~0.123E2) = false ?= (0.31415927E1, ~0.123E2) = false < (0.31415927E1, ~0.31415927E1) = false > (0.31415927E1, ~0.31415927E1) = true == (0.31415927E1, ~0.31415927E1) = false ?= (0.31415927E1, ~0.31415927E1) = false < (0.31415927E1, ~0.27182817E1) = false > (0.31415927E1, ~0.27182817E1) = true == (0.31415927E1, ~0.27182817E1) = false ?= (0.31415927E1, ~0.27182817E1) = false < (0.31415927E1, ~0.123E1) = false > (0.31415927E1, ~0.123E1) = true == (0.31415927E1, ~0.123E1) = false ?= (0.31415927E1, ~0.123E1) = false < (0.31415927E1, ~0.123) = false > (0.31415927E1, ~0.123) = true == (0.31415927E1, ~0.123) = false ?= (0.31415927E1, ~0.123) = false < (0.31415927E1, ~0.123E~2) = false > (0.31415927E1, ~0.123E~2) = true == (0.31415927E1, ~0.123E~2) = false ?= (0.31415927E1, ~0.123E~2) = false < (0.31415927E1, ~0.11754944E~37) = false > (0.31415927E1, ~0.11754944E~37) = true == (0.31415927E1, ~0.11754944E~37) = false ?= (0.31415927E1, ~0.11754944E~37) = false < (0.31415927E1, ~0.5877472E~38) = false > (0.31415927E1, ~0.5877472E~38) = true == (0.31415927E1, ~0.5877472E~38) = false ?= (0.31415927E1, ~0.5877472E~38) = false < (0.31415927E1, ~0.1E~44) = false > (0.31415927E1, ~0.1E~44) = true == (0.31415927E1, ~0.1E~44) = false ?= (0.31415927E1, ~0.1E~44) = false < (0.31415927E1, ~0.0) = false > (0.31415927E1, ~0.0) = true == (0.31415927E1, ~0.0) = false ?= (0.31415927E1, ~0.0) = false < (0.27182817E1, 0.34028235E39) = true > (0.27182817E1, 0.34028235E39) = false == (0.27182817E1, 0.34028235E39) = false ?= (0.27182817E1, 0.34028235E39) = false < (0.27182817E1, 0.17014117E39) = true > (0.27182817E1, 0.17014117E39) = false == (0.27182817E1, 0.17014117E39) = false ?= (0.27182817E1, 0.17014117E39) = false < (0.27182817E1, 0.123E4) = true > (0.27182817E1, 0.123E4) = false == (0.27182817E1, 0.123E4) = false ?= (0.27182817E1, 0.123E4) = false < (0.27182817E1, 0.123E2) = true > (0.27182817E1, 0.123E2) = false == (0.27182817E1, 0.123E2) = false ?= (0.27182817E1, 0.123E2) = false < (0.27182817E1, 0.31415927E1) = true > (0.27182817E1, 0.31415927E1) = false == (0.27182817E1, 0.31415927E1) = false ?= (0.27182817E1, 0.31415927E1) = false < (0.27182817E1, 0.27182817E1) = false > (0.27182817E1, 0.27182817E1) = false == (0.27182817E1, 0.27182817E1) = true ?= (0.27182817E1, 0.27182817E1) = true < (0.27182817E1, 0.123E1) = false > (0.27182817E1, 0.123E1) = true == (0.27182817E1, 0.123E1) = false ?= (0.27182817E1, 0.123E1) = false < (0.27182817E1, 0.123) = false > (0.27182817E1, 0.123) = true == (0.27182817E1, 0.123) = false ?= (0.27182817E1, 0.123) = false < (0.27182817E1, 0.123E~2) = false > (0.27182817E1, 0.123E~2) = true == (0.27182817E1, 0.123E~2) = false ?= (0.27182817E1, 0.123E~2) = false < (0.27182817E1, 0.11754944E~37) = false > (0.27182817E1, 0.11754944E~37) = true == (0.27182817E1, 0.11754944E~37) = false ?= (0.27182817E1, 0.11754944E~37) = false < (0.27182817E1, 0.5877472E~38) = false > (0.27182817E1, 0.5877472E~38) = true == (0.27182817E1, 0.5877472E~38) = false ?= (0.27182817E1, 0.5877472E~38) = false < (0.27182817E1, 0.1E~44) = false > (0.27182817E1, 0.1E~44) = true == (0.27182817E1, 0.1E~44) = false ?= (0.27182817E1, 0.1E~44) = false < (0.27182817E1, 0.0) = false > (0.27182817E1, 0.0) = true == (0.27182817E1, 0.0) = false ?= (0.27182817E1, 0.0) = false < (0.27182817E1, ~0.34028235E39) = false > (0.27182817E1, ~0.34028235E39) = true == (0.27182817E1, ~0.34028235E39) = false ?= (0.27182817E1, ~0.34028235E39) = false < (0.27182817E1, ~0.17014117E39) = false > (0.27182817E1, ~0.17014117E39) = true == (0.27182817E1, ~0.17014117E39) = false ?= (0.27182817E1, ~0.17014117E39) = false < (0.27182817E1, ~0.123E4) = false > (0.27182817E1, ~0.123E4) = true == (0.27182817E1, ~0.123E4) = false ?= (0.27182817E1, ~0.123E4) = false < (0.27182817E1, ~0.123E2) = false > (0.27182817E1, ~0.123E2) = true == (0.27182817E1, ~0.123E2) = false ?= (0.27182817E1, ~0.123E2) = false < (0.27182817E1, ~0.31415927E1) = false > (0.27182817E1, ~0.31415927E1) = true == (0.27182817E1, ~0.31415927E1) = false ?= (0.27182817E1, ~0.31415927E1) = false < (0.27182817E1, ~0.27182817E1) = false > (0.27182817E1, ~0.27182817E1) = true == (0.27182817E1, ~0.27182817E1) = false ?= (0.27182817E1, ~0.27182817E1) = false < (0.27182817E1, ~0.123E1) = false > (0.27182817E1, ~0.123E1) = true == (0.27182817E1, ~0.123E1) = false ?= (0.27182817E1, ~0.123E1) = false < (0.27182817E1, ~0.123) = false > (0.27182817E1, ~0.123) = true == (0.27182817E1, ~0.123) = false ?= (0.27182817E1, ~0.123) = false < (0.27182817E1, ~0.123E~2) = false > (0.27182817E1, ~0.123E~2) = true == (0.27182817E1, ~0.123E~2) = false ?= (0.27182817E1, ~0.123E~2) = false < (0.27182817E1, ~0.11754944E~37) = false > (0.27182817E1, ~0.11754944E~37) = true == (0.27182817E1, ~0.11754944E~37) = false ?= (0.27182817E1, ~0.11754944E~37) = false < (0.27182817E1, ~0.5877472E~38) = false > (0.27182817E1, ~0.5877472E~38) = true == (0.27182817E1, ~0.5877472E~38) = false ?= (0.27182817E1, ~0.5877472E~38) = false < (0.27182817E1, ~0.1E~44) = false > (0.27182817E1, ~0.1E~44) = true == (0.27182817E1, ~0.1E~44) = false ?= (0.27182817E1, ~0.1E~44) = false < (0.27182817E1, ~0.0) = false > (0.27182817E1, ~0.0) = true == (0.27182817E1, ~0.0) = false ?= (0.27182817E1, ~0.0) = false < (0.123E1, 0.34028235E39) = true > (0.123E1, 0.34028235E39) = false == (0.123E1, 0.34028235E39) = false ?= (0.123E1, 0.34028235E39) = false < (0.123E1, 0.17014117E39) = true > (0.123E1, 0.17014117E39) = false == (0.123E1, 0.17014117E39) = false ?= (0.123E1, 0.17014117E39) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.31415927E1) = true > (0.123E1, 0.31415927E1) = false == (0.123E1, 0.31415927E1) = false ?= (0.123E1, 0.31415927E1) = false < (0.123E1, 0.27182817E1) = true > (0.123E1, 0.27182817E1) = false == (0.123E1, 0.27182817E1) = false ?= (0.123E1, 0.27182817E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.11754944E~37) = false > (0.123E1, 0.11754944E~37) = true == (0.123E1, 0.11754944E~37) = false ?= (0.123E1, 0.11754944E~37) = false < (0.123E1, 0.5877472E~38) = false > (0.123E1, 0.5877472E~38) = true == (0.123E1, 0.5877472E~38) = false ?= (0.123E1, 0.5877472E~38) = false < (0.123E1, 0.1E~44) = false > (0.123E1, 0.1E~44) = true == (0.123E1, 0.1E~44) = false ?= (0.123E1, 0.1E~44) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.34028235E39) = false > (0.123E1, ~0.34028235E39) = true == (0.123E1, ~0.34028235E39) = false ?= (0.123E1, ~0.34028235E39) = false < (0.123E1, ~0.17014117E39) = false > (0.123E1, ~0.17014117E39) = true == (0.123E1, ~0.17014117E39) = false ?= (0.123E1, ~0.17014117E39) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.31415927E1) = false > (0.123E1, ~0.31415927E1) = true == (0.123E1, ~0.31415927E1) = false ?= (0.123E1, ~0.31415927E1) = false < (0.123E1, ~0.27182817E1) = false > (0.123E1, ~0.27182817E1) = true == (0.123E1, ~0.27182817E1) = false ?= (0.123E1, ~0.27182817E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.11754944E~37) = false > (0.123E1, ~0.11754944E~37) = true == (0.123E1, ~0.11754944E~37) = false ?= (0.123E1, ~0.11754944E~37) = false < (0.123E1, ~0.5877472E~38) = false > (0.123E1, ~0.5877472E~38) = true == (0.123E1, ~0.5877472E~38) = false ?= (0.123E1, ~0.5877472E~38) = false < (0.123E1, ~0.1E~44) = false > (0.123E1, ~0.1E~44) = true == (0.123E1, ~0.1E~44) = false ?= (0.123E1, ~0.1E~44) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.34028235E39) = true > (0.123, 0.34028235E39) = false == (0.123, 0.34028235E39) = false ?= (0.123, 0.34028235E39) = false < (0.123, 0.17014117E39) = true > (0.123, 0.17014117E39) = false == (0.123, 0.17014117E39) = false ?= (0.123, 0.17014117E39) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.31415927E1) = true > (0.123, 0.31415927E1) = false == (0.123, 0.31415927E1) = false ?= (0.123, 0.31415927E1) = false < (0.123, 0.27182817E1) = true > (0.123, 0.27182817E1) = false == (0.123, 0.27182817E1) = false ?= (0.123, 0.27182817E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.11754944E~37) = false > (0.123, 0.11754944E~37) = true == (0.123, 0.11754944E~37) = false ?= (0.123, 0.11754944E~37) = false < (0.123, 0.5877472E~38) = false > (0.123, 0.5877472E~38) = true == (0.123, 0.5877472E~38) = false ?= (0.123, 0.5877472E~38) = false < (0.123, 0.1E~44) = false > (0.123, 0.1E~44) = true == (0.123, 0.1E~44) = false ?= (0.123, 0.1E~44) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.34028235E39) = false > (0.123, ~0.34028235E39) = true == (0.123, ~0.34028235E39) = false ?= (0.123, ~0.34028235E39) = false < (0.123, ~0.17014117E39) = false > (0.123, ~0.17014117E39) = true == (0.123, ~0.17014117E39) = false ?= (0.123, ~0.17014117E39) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.31415927E1) = false > (0.123, ~0.31415927E1) = true == (0.123, ~0.31415927E1) = false ?= (0.123, ~0.31415927E1) = false < (0.123, ~0.27182817E1) = false > (0.123, ~0.27182817E1) = true == (0.123, ~0.27182817E1) = false ?= (0.123, ~0.27182817E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.11754944E~37) = false > (0.123, ~0.11754944E~37) = true == (0.123, ~0.11754944E~37) = false ?= (0.123, ~0.11754944E~37) = false < (0.123, ~0.5877472E~38) = false > (0.123, ~0.5877472E~38) = true == (0.123, ~0.5877472E~38) = false ?= (0.123, ~0.5877472E~38) = false < (0.123, ~0.1E~44) = false > (0.123, ~0.1E~44) = true == (0.123, ~0.1E~44) = false ?= (0.123, ~0.1E~44) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.34028235E39) = true > (0.123E~2, 0.34028235E39) = false == (0.123E~2, 0.34028235E39) = false ?= (0.123E~2, 0.34028235E39) = false < (0.123E~2, 0.17014117E39) = true > (0.123E~2, 0.17014117E39) = false == (0.123E~2, 0.17014117E39) = false ?= (0.123E~2, 0.17014117E39) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.31415927E1) = true > (0.123E~2, 0.31415927E1) = false == (0.123E~2, 0.31415927E1) = false ?= (0.123E~2, 0.31415927E1) = false < (0.123E~2, 0.27182817E1) = true > (0.123E~2, 0.27182817E1) = false == (0.123E~2, 0.27182817E1) = false ?= (0.123E~2, 0.27182817E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.11754944E~37) = false > (0.123E~2, 0.11754944E~37) = true == (0.123E~2, 0.11754944E~37) = false ?= (0.123E~2, 0.11754944E~37) = false < (0.123E~2, 0.5877472E~38) = false > (0.123E~2, 0.5877472E~38) = true == (0.123E~2, 0.5877472E~38) = false ?= (0.123E~2, 0.5877472E~38) = false < (0.123E~2, 0.1E~44) = false > (0.123E~2, 0.1E~44) = true == (0.123E~2, 0.1E~44) = false ?= (0.123E~2, 0.1E~44) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.34028235E39) = false > (0.123E~2, ~0.34028235E39) = true == (0.123E~2, ~0.34028235E39) = false ?= (0.123E~2, ~0.34028235E39) = false < (0.123E~2, ~0.17014117E39) = false > (0.123E~2, ~0.17014117E39) = true == (0.123E~2, ~0.17014117E39) = false ?= (0.123E~2, ~0.17014117E39) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.31415927E1) = false > (0.123E~2, ~0.31415927E1) = true == (0.123E~2, ~0.31415927E1) = false ?= (0.123E~2, ~0.31415927E1) = false < (0.123E~2, ~0.27182817E1) = false > (0.123E~2, ~0.27182817E1) = true == (0.123E~2, ~0.27182817E1) = false ?= (0.123E~2, ~0.27182817E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.11754944E~37) = false > (0.123E~2, ~0.11754944E~37) = true == (0.123E~2, ~0.11754944E~37) = false ?= (0.123E~2, ~0.11754944E~37) = false < (0.123E~2, ~0.5877472E~38) = false > (0.123E~2, ~0.5877472E~38) = true == (0.123E~2, ~0.5877472E~38) = false ?= (0.123E~2, ~0.5877472E~38) = false < (0.123E~2, ~0.1E~44) = false > (0.123E~2, ~0.1E~44) = true == (0.123E~2, ~0.1E~44) = false ?= (0.123E~2, ~0.1E~44) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.11754944E~37, 0.34028235E39) = true > (0.11754944E~37, 0.34028235E39) = false == (0.11754944E~37, 0.34028235E39) = false ?= (0.11754944E~37, 0.34028235E39) = false < (0.11754944E~37, 0.17014117E39) = true > (0.11754944E~37, 0.17014117E39) = false == (0.11754944E~37, 0.17014117E39) = false ?= (0.11754944E~37, 0.17014117E39) = false < (0.11754944E~37, 0.123E4) = true > (0.11754944E~37, 0.123E4) = false == (0.11754944E~37, 0.123E4) = false ?= (0.11754944E~37, 0.123E4) = false < (0.11754944E~37, 0.123E2) = true > (0.11754944E~37, 0.123E2) = false == (0.11754944E~37, 0.123E2) = false ?= (0.11754944E~37, 0.123E2) = false < (0.11754944E~37, 0.31415927E1) = true > (0.11754944E~37, 0.31415927E1) = false == (0.11754944E~37, 0.31415927E1) = false ?= (0.11754944E~37, 0.31415927E1) = false < (0.11754944E~37, 0.27182817E1) = true > (0.11754944E~37, 0.27182817E1) = false == (0.11754944E~37, 0.27182817E1) = false ?= (0.11754944E~37, 0.27182817E1) = false < (0.11754944E~37, 0.123E1) = true > (0.11754944E~37, 0.123E1) = false == (0.11754944E~37, 0.123E1) = false ?= (0.11754944E~37, 0.123E1) = false < (0.11754944E~37, 0.123) = true > (0.11754944E~37, 0.123) = false == (0.11754944E~37, 0.123) = false ?= (0.11754944E~37, 0.123) = false < (0.11754944E~37, 0.123E~2) = true > (0.11754944E~37, 0.123E~2) = false == (0.11754944E~37, 0.123E~2) = false ?= (0.11754944E~37, 0.123E~2) = false < (0.11754944E~37, 0.11754944E~37) = false > (0.11754944E~37, 0.11754944E~37) = false == (0.11754944E~37, 0.11754944E~37) = true ?= (0.11754944E~37, 0.11754944E~37) = true < (0.11754944E~37, 0.5877472E~38) = false > (0.11754944E~37, 0.5877472E~38) = true == (0.11754944E~37, 0.5877472E~38) = false ?= (0.11754944E~37, 0.5877472E~38) = false < (0.11754944E~37, 0.1E~44) = false > (0.11754944E~37, 0.1E~44) = true == (0.11754944E~37, 0.1E~44) = false ?= (0.11754944E~37, 0.1E~44) = false < (0.11754944E~37, 0.0) = false > (0.11754944E~37, 0.0) = true == (0.11754944E~37, 0.0) = false ?= (0.11754944E~37, 0.0) = false < (0.11754944E~37, ~0.34028235E39) = false > (0.11754944E~37, ~0.34028235E39) = true == (0.11754944E~37, ~0.34028235E39) = false ?= (0.11754944E~37, ~0.34028235E39) = false < (0.11754944E~37, ~0.17014117E39) = false > (0.11754944E~37, ~0.17014117E39) = true == (0.11754944E~37, ~0.17014117E39) = false ?= (0.11754944E~37, ~0.17014117E39) = false < (0.11754944E~37, ~0.123E4) = false > (0.11754944E~37, ~0.123E4) = true == (0.11754944E~37, ~0.123E4) = false ?= (0.11754944E~37, ~0.123E4) = false < (0.11754944E~37, ~0.123E2) = false > (0.11754944E~37, ~0.123E2) = true == (0.11754944E~37, ~0.123E2) = false ?= (0.11754944E~37, ~0.123E2) = false < (0.11754944E~37, ~0.31415927E1) = false > (0.11754944E~37, ~0.31415927E1) = true == (0.11754944E~37, ~0.31415927E1) = false ?= (0.11754944E~37, ~0.31415927E1) = false < (0.11754944E~37, ~0.27182817E1) = false > (0.11754944E~37, ~0.27182817E1) = true == (0.11754944E~37, ~0.27182817E1) = false ?= (0.11754944E~37, ~0.27182817E1) = false < (0.11754944E~37, ~0.123E1) = false > (0.11754944E~37, ~0.123E1) = true == (0.11754944E~37, ~0.123E1) = false ?= (0.11754944E~37, ~0.123E1) = false < (0.11754944E~37, ~0.123) = false > (0.11754944E~37, ~0.123) = true == (0.11754944E~37, ~0.123) = false ?= (0.11754944E~37, ~0.123) = false < (0.11754944E~37, ~0.123E~2) = false > (0.11754944E~37, ~0.123E~2) = true == (0.11754944E~37, ~0.123E~2) = false ?= (0.11754944E~37, ~0.123E~2) = false < (0.11754944E~37, ~0.11754944E~37) = false > (0.11754944E~37, ~0.11754944E~37) = true == (0.11754944E~37, ~0.11754944E~37) = false ?= (0.11754944E~37, ~0.11754944E~37) = false < (0.11754944E~37, ~0.5877472E~38) = false > (0.11754944E~37, ~0.5877472E~38) = true == (0.11754944E~37, ~0.5877472E~38) = false ?= (0.11754944E~37, ~0.5877472E~38) = false < (0.11754944E~37, ~0.1E~44) = false > (0.11754944E~37, ~0.1E~44) = true == (0.11754944E~37, ~0.1E~44) = false ?= (0.11754944E~37, ~0.1E~44) = false < (0.11754944E~37, ~0.0) = false > (0.11754944E~37, ~0.0) = true == (0.11754944E~37, ~0.0) = false ?= (0.11754944E~37, ~0.0) = false < (0.5877472E~38, 0.34028235E39) = true > (0.5877472E~38, 0.34028235E39) = false == (0.5877472E~38, 0.34028235E39) = false ?= (0.5877472E~38, 0.34028235E39) = false < (0.5877472E~38, 0.17014117E39) = true > (0.5877472E~38, 0.17014117E39) = false == (0.5877472E~38, 0.17014117E39) = false ?= (0.5877472E~38, 0.17014117E39) = false < (0.5877472E~38, 0.123E4) = true > (0.5877472E~38, 0.123E4) = false == (0.5877472E~38, 0.123E4) = false ?= (0.5877472E~38, 0.123E4) = false < (0.5877472E~38, 0.123E2) = true > (0.5877472E~38, 0.123E2) = false == (0.5877472E~38, 0.123E2) = false ?= (0.5877472E~38, 0.123E2) = false < (0.5877472E~38, 0.31415927E1) = true > (0.5877472E~38, 0.31415927E1) = false == (0.5877472E~38, 0.31415927E1) = false ?= (0.5877472E~38, 0.31415927E1) = false < (0.5877472E~38, 0.27182817E1) = true > (0.5877472E~38, 0.27182817E1) = false == (0.5877472E~38, 0.27182817E1) = false ?= (0.5877472E~38, 0.27182817E1) = false < (0.5877472E~38, 0.123E1) = true > (0.5877472E~38, 0.123E1) = false == (0.5877472E~38, 0.123E1) = false ?= (0.5877472E~38, 0.123E1) = false < (0.5877472E~38, 0.123) = true > (0.5877472E~38, 0.123) = false == (0.5877472E~38, 0.123) = false ?= (0.5877472E~38, 0.123) = false < (0.5877472E~38, 0.123E~2) = true > (0.5877472E~38, 0.123E~2) = false == (0.5877472E~38, 0.123E~2) = false ?= (0.5877472E~38, 0.123E~2) = false < (0.5877472E~38, 0.11754944E~37) = true > (0.5877472E~38, 0.11754944E~37) = false == (0.5877472E~38, 0.11754944E~37) = false ?= (0.5877472E~38, 0.11754944E~37) = false < (0.5877472E~38, 0.5877472E~38) = false > (0.5877472E~38, 0.5877472E~38) = false == (0.5877472E~38, 0.5877472E~38) = true ?= (0.5877472E~38, 0.5877472E~38) = true < (0.5877472E~38, 0.1E~44) = false > (0.5877472E~38, 0.1E~44) = true == (0.5877472E~38, 0.1E~44) = false ?= (0.5877472E~38, 0.1E~44) = false < (0.5877472E~38, 0.0) = false > (0.5877472E~38, 0.0) = true == (0.5877472E~38, 0.0) = false ?= (0.5877472E~38, 0.0) = false < (0.5877472E~38, ~0.34028235E39) = false > (0.5877472E~38, ~0.34028235E39) = true == (0.5877472E~38, ~0.34028235E39) = false ?= (0.5877472E~38, ~0.34028235E39) = false < (0.5877472E~38, ~0.17014117E39) = false > (0.5877472E~38, ~0.17014117E39) = true == (0.5877472E~38, ~0.17014117E39) = false ?= (0.5877472E~38, ~0.17014117E39) = false < (0.5877472E~38, ~0.123E4) = false > (0.5877472E~38, ~0.123E4) = true == (0.5877472E~38, ~0.123E4) = false ?= (0.5877472E~38, ~0.123E4) = false < (0.5877472E~38, ~0.123E2) = false > (0.5877472E~38, ~0.123E2) = true == (0.5877472E~38, ~0.123E2) = false ?= (0.5877472E~38, ~0.123E2) = false < (0.5877472E~38, ~0.31415927E1) = false > (0.5877472E~38, ~0.31415927E1) = true == (0.5877472E~38, ~0.31415927E1) = false ?= (0.5877472E~38, ~0.31415927E1) = false < (0.5877472E~38, ~0.27182817E1) = false > (0.5877472E~38, ~0.27182817E1) = true == (0.5877472E~38, ~0.27182817E1) = false ?= (0.5877472E~38, ~0.27182817E1) = false < (0.5877472E~38, ~0.123E1) = false > (0.5877472E~38, ~0.123E1) = true == (0.5877472E~38, ~0.123E1) = false ?= (0.5877472E~38, ~0.123E1) = false < (0.5877472E~38, ~0.123) = false > (0.5877472E~38, ~0.123) = true == (0.5877472E~38, ~0.123) = false ?= (0.5877472E~38, ~0.123) = false < (0.5877472E~38, ~0.123E~2) = false > (0.5877472E~38, ~0.123E~2) = true == (0.5877472E~38, ~0.123E~2) = false ?= (0.5877472E~38, ~0.123E~2) = false < (0.5877472E~38, ~0.11754944E~37) = false > (0.5877472E~38, ~0.11754944E~37) = true == (0.5877472E~38, ~0.11754944E~37) = false ?= (0.5877472E~38, ~0.11754944E~37) = false < (0.5877472E~38, ~0.5877472E~38) = false > (0.5877472E~38, ~0.5877472E~38) = true == (0.5877472E~38, ~0.5877472E~38) = false ?= (0.5877472E~38, ~0.5877472E~38) = false < (0.5877472E~38, ~0.1E~44) = false > (0.5877472E~38, ~0.1E~44) = true == (0.5877472E~38, ~0.1E~44) = false ?= (0.5877472E~38, ~0.1E~44) = false < (0.5877472E~38, ~0.0) = false > (0.5877472E~38, ~0.0) = true == (0.5877472E~38, ~0.0) = false ?= (0.5877472E~38, ~0.0) = false < (0.1E~44, 0.34028235E39) = true > (0.1E~44, 0.34028235E39) = false == (0.1E~44, 0.34028235E39) = false ?= (0.1E~44, 0.34028235E39) = false < (0.1E~44, 0.17014117E39) = true > (0.1E~44, 0.17014117E39) = false == (0.1E~44, 0.17014117E39) = false ?= (0.1E~44, 0.17014117E39) = false < (0.1E~44, 0.123E4) = true > (0.1E~44, 0.123E4) = false == (0.1E~44, 0.123E4) = false ?= (0.1E~44, 0.123E4) = false < (0.1E~44, 0.123E2) = true > (0.1E~44, 0.123E2) = false == (0.1E~44, 0.123E2) = false ?= (0.1E~44, 0.123E2) = false < (0.1E~44, 0.31415927E1) = true > (0.1E~44, 0.31415927E1) = false == (0.1E~44, 0.31415927E1) = false ?= (0.1E~44, 0.31415927E1) = false < (0.1E~44, 0.27182817E1) = true > (0.1E~44, 0.27182817E1) = false == (0.1E~44, 0.27182817E1) = false ?= (0.1E~44, 0.27182817E1) = false < (0.1E~44, 0.123E1) = true > (0.1E~44, 0.123E1) = false == (0.1E~44, 0.123E1) = false ?= (0.1E~44, 0.123E1) = false < (0.1E~44, 0.123) = true > (0.1E~44, 0.123) = false == (0.1E~44, 0.123) = false ?= (0.1E~44, 0.123) = false < (0.1E~44, 0.123E~2) = true > (0.1E~44, 0.123E~2) = false == (0.1E~44, 0.123E~2) = false ?= (0.1E~44, 0.123E~2) = false < (0.1E~44, 0.11754944E~37) = true > (0.1E~44, 0.11754944E~37) = false == (0.1E~44, 0.11754944E~37) = false ?= (0.1E~44, 0.11754944E~37) = false < (0.1E~44, 0.5877472E~38) = true > (0.1E~44, 0.5877472E~38) = false == (0.1E~44, 0.5877472E~38) = false ?= (0.1E~44, 0.5877472E~38) = false < (0.1E~44, 0.1E~44) = false > (0.1E~44, 0.1E~44) = false == (0.1E~44, 0.1E~44) = true ?= (0.1E~44, 0.1E~44) = true < (0.1E~44, 0.0) = false > (0.1E~44, 0.0) = true == (0.1E~44, 0.0) = false ?= (0.1E~44, 0.0) = false < (0.1E~44, ~0.34028235E39) = false > (0.1E~44, ~0.34028235E39) = true == (0.1E~44, ~0.34028235E39) = false ?= (0.1E~44, ~0.34028235E39) = false < (0.1E~44, ~0.17014117E39) = false > (0.1E~44, ~0.17014117E39) = true == (0.1E~44, ~0.17014117E39) = false ?= (0.1E~44, ~0.17014117E39) = false < (0.1E~44, ~0.123E4) = false > (0.1E~44, ~0.123E4) = true == (0.1E~44, ~0.123E4) = false ?= (0.1E~44, ~0.123E4) = false < (0.1E~44, ~0.123E2) = false > (0.1E~44, ~0.123E2) = true == (0.1E~44, ~0.123E2) = false ?= (0.1E~44, ~0.123E2) = false < (0.1E~44, ~0.31415927E1) = false > (0.1E~44, ~0.31415927E1) = true == (0.1E~44, ~0.31415927E1) = false ?= (0.1E~44, ~0.31415927E1) = false < (0.1E~44, ~0.27182817E1) = false > (0.1E~44, ~0.27182817E1) = true == (0.1E~44, ~0.27182817E1) = false ?= (0.1E~44, ~0.27182817E1) = false < (0.1E~44, ~0.123E1) = false > (0.1E~44, ~0.123E1) = true == (0.1E~44, ~0.123E1) = false ?= (0.1E~44, ~0.123E1) = false < (0.1E~44, ~0.123) = false > (0.1E~44, ~0.123) = true == (0.1E~44, ~0.123) = false ?= (0.1E~44, ~0.123) = false < (0.1E~44, ~0.123E~2) = false > (0.1E~44, ~0.123E~2) = true == (0.1E~44, ~0.123E~2) = false ?= (0.1E~44, ~0.123E~2) = false < (0.1E~44, ~0.11754944E~37) = false > (0.1E~44, ~0.11754944E~37) = true == (0.1E~44, ~0.11754944E~37) = false ?= (0.1E~44, ~0.11754944E~37) = false < (0.1E~44, ~0.5877472E~38) = false > (0.1E~44, ~0.5877472E~38) = true == (0.1E~44, ~0.5877472E~38) = false ?= (0.1E~44, ~0.5877472E~38) = false < (0.1E~44, ~0.1E~44) = false > (0.1E~44, ~0.1E~44) = true == (0.1E~44, ~0.1E~44) = false ?= (0.1E~44, ~0.1E~44) = false < (0.1E~44, ~0.0) = false > (0.1E~44, ~0.0) = true == (0.1E~44, ~0.0) = false ?= (0.1E~44, ~0.0) = false < (0.0, 0.34028235E39) = true > (0.0, 0.34028235E39) = false == (0.0, 0.34028235E39) = false ?= (0.0, 0.34028235E39) = false < (0.0, 0.17014117E39) = true > (0.0, 0.17014117E39) = false == (0.0, 0.17014117E39) = false ?= (0.0, 0.17014117E39) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.31415927E1) = true > (0.0, 0.31415927E1) = false == (0.0, 0.31415927E1) = false ?= (0.0, 0.31415927E1) = false < (0.0, 0.27182817E1) = true > (0.0, 0.27182817E1) = false == (0.0, 0.27182817E1) = false ?= (0.0, 0.27182817E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.11754944E~37) = true > (0.0, 0.11754944E~37) = false == (0.0, 0.11754944E~37) = false ?= (0.0, 0.11754944E~37) = false < (0.0, 0.5877472E~38) = true > (0.0, 0.5877472E~38) = false == (0.0, 0.5877472E~38) = false ?= (0.0, 0.5877472E~38) = false < (0.0, 0.1E~44) = true > (0.0, 0.1E~44) = false == (0.0, 0.1E~44) = false ?= (0.0, 0.1E~44) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.34028235E39) = false > (0.0, ~0.34028235E39) = true == (0.0, ~0.34028235E39) = false ?= (0.0, ~0.34028235E39) = false < (0.0, ~0.17014117E39) = false > (0.0, ~0.17014117E39) = true == (0.0, ~0.17014117E39) = false ?= (0.0, ~0.17014117E39) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.31415927E1) = false > (0.0, ~0.31415927E1) = true == (0.0, ~0.31415927E1) = false ?= (0.0, ~0.31415927E1) = false < (0.0, ~0.27182817E1) = false > (0.0, ~0.27182817E1) = true == (0.0, ~0.27182817E1) = false ?= (0.0, ~0.27182817E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.11754944E~37) = false > (0.0, ~0.11754944E~37) = true == (0.0, ~0.11754944E~37) = false ?= (0.0, ~0.11754944E~37) = false < (0.0, ~0.5877472E~38) = false > (0.0, ~0.5877472E~38) = true == (0.0, ~0.5877472E~38) = false ?= (0.0, ~0.5877472E~38) = false < (0.0, ~0.1E~44) = false > (0.0, ~0.1E~44) = true == (0.0, ~0.1E~44) = false ?= (0.0, ~0.1E~44) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.34028235E39, 0.34028235E39) = true > (~0.34028235E39, 0.34028235E39) = false == (~0.34028235E39, 0.34028235E39) = false ?= (~0.34028235E39, 0.34028235E39) = false < (~0.34028235E39, 0.17014117E39) = true > (~0.34028235E39, 0.17014117E39) = false == (~0.34028235E39, 0.17014117E39) = false ?= (~0.34028235E39, 0.17014117E39) = false < (~0.34028235E39, 0.123E4) = true > (~0.34028235E39, 0.123E4) = false == (~0.34028235E39, 0.123E4) = false ?= (~0.34028235E39, 0.123E4) = false < (~0.34028235E39, 0.123E2) = true > (~0.34028235E39, 0.123E2) = false == (~0.34028235E39, 0.123E2) = false ?= (~0.34028235E39, 0.123E2) = false < (~0.34028235E39, 0.31415927E1) = true > (~0.34028235E39, 0.31415927E1) = false == (~0.34028235E39, 0.31415927E1) = false ?= (~0.34028235E39, 0.31415927E1) = false < (~0.34028235E39, 0.27182817E1) = true > (~0.34028235E39, 0.27182817E1) = false == (~0.34028235E39, 0.27182817E1) = false ?= (~0.34028235E39, 0.27182817E1) = false < (~0.34028235E39, 0.123E1) = true > (~0.34028235E39, 0.123E1) = false == (~0.34028235E39, 0.123E1) = false ?= (~0.34028235E39, 0.123E1) = false < (~0.34028235E39, 0.123) = true > (~0.34028235E39, 0.123) = false == (~0.34028235E39, 0.123) = false ?= (~0.34028235E39, 0.123) = false < (~0.34028235E39, 0.123E~2) = true > (~0.34028235E39, 0.123E~2) = false == (~0.34028235E39, 0.123E~2) = false ?= (~0.34028235E39, 0.123E~2) = false < (~0.34028235E39, 0.11754944E~37) = true > (~0.34028235E39, 0.11754944E~37) = false == (~0.34028235E39, 0.11754944E~37) = false ?= (~0.34028235E39, 0.11754944E~37) = false < (~0.34028235E39, 0.5877472E~38) = true > (~0.34028235E39, 0.5877472E~38) = false == (~0.34028235E39, 0.5877472E~38) = false ?= (~0.34028235E39, 0.5877472E~38) = false < (~0.34028235E39, 0.1E~44) = true > (~0.34028235E39, 0.1E~44) = false == (~0.34028235E39, 0.1E~44) = false ?= (~0.34028235E39, 0.1E~44) = false < (~0.34028235E39, 0.0) = true > (~0.34028235E39, 0.0) = false == (~0.34028235E39, 0.0) = false ?= (~0.34028235E39, 0.0) = false < (~0.34028235E39, ~0.34028235E39) = false > (~0.34028235E39, ~0.34028235E39) = false == (~0.34028235E39, ~0.34028235E39) = true ?= (~0.34028235E39, ~0.34028235E39) = true < (~0.34028235E39, ~0.17014117E39) = true > (~0.34028235E39, ~0.17014117E39) = false == (~0.34028235E39, ~0.17014117E39) = false ?= (~0.34028235E39, ~0.17014117E39) = false < (~0.34028235E39, ~0.123E4) = true > (~0.34028235E39, ~0.123E4) = false == (~0.34028235E39, ~0.123E4) = false ?= (~0.34028235E39, ~0.123E4) = false < (~0.34028235E39, ~0.123E2) = true > (~0.34028235E39, ~0.123E2) = false == (~0.34028235E39, ~0.123E2) = false ?= (~0.34028235E39, ~0.123E2) = false < (~0.34028235E39, ~0.31415927E1) = true > (~0.34028235E39, ~0.31415927E1) = false == (~0.34028235E39, ~0.31415927E1) = false ?= (~0.34028235E39, ~0.31415927E1) = false < (~0.34028235E39, ~0.27182817E1) = true > (~0.34028235E39, ~0.27182817E1) = false == (~0.34028235E39, ~0.27182817E1) = false ?= (~0.34028235E39, ~0.27182817E1) = false < (~0.34028235E39, ~0.123E1) = true > (~0.34028235E39, ~0.123E1) = false == (~0.34028235E39, ~0.123E1) = false ?= (~0.34028235E39, ~0.123E1) = false < (~0.34028235E39, ~0.123) = true > (~0.34028235E39, ~0.123) = false == (~0.34028235E39, ~0.123) = false ?= (~0.34028235E39, ~0.123) = false < (~0.34028235E39, ~0.123E~2) = true > (~0.34028235E39, ~0.123E~2) = false == (~0.34028235E39, ~0.123E~2) = false ?= (~0.34028235E39, ~0.123E~2) = false < (~0.34028235E39, ~0.11754944E~37) = true > (~0.34028235E39, ~0.11754944E~37) = false == (~0.34028235E39, ~0.11754944E~37) = false ?= (~0.34028235E39, ~0.11754944E~37) = false < (~0.34028235E39, ~0.5877472E~38) = true > (~0.34028235E39, ~0.5877472E~38) = false == (~0.34028235E39, ~0.5877472E~38) = false ?= (~0.34028235E39, ~0.5877472E~38) = false < (~0.34028235E39, ~0.1E~44) = true > (~0.34028235E39, ~0.1E~44) = false == (~0.34028235E39, ~0.1E~44) = false ?= (~0.34028235E39, ~0.1E~44) = false < (~0.34028235E39, ~0.0) = true > (~0.34028235E39, ~0.0) = false == (~0.34028235E39, ~0.0) = false ?= (~0.34028235E39, ~0.0) = false < (~0.17014117E39, 0.34028235E39) = true > (~0.17014117E39, 0.34028235E39) = false == (~0.17014117E39, 0.34028235E39) = false ?= (~0.17014117E39, 0.34028235E39) = false < (~0.17014117E39, 0.17014117E39) = true > (~0.17014117E39, 0.17014117E39) = false == (~0.17014117E39, 0.17014117E39) = false ?= (~0.17014117E39, 0.17014117E39) = false < (~0.17014117E39, 0.123E4) = true > (~0.17014117E39, 0.123E4) = false == (~0.17014117E39, 0.123E4) = false ?= (~0.17014117E39, 0.123E4) = false < (~0.17014117E39, 0.123E2) = true > (~0.17014117E39, 0.123E2) = false == (~0.17014117E39, 0.123E2) = false ?= (~0.17014117E39, 0.123E2) = false < (~0.17014117E39, 0.31415927E1) = true > (~0.17014117E39, 0.31415927E1) = false == (~0.17014117E39, 0.31415927E1) = false ?= (~0.17014117E39, 0.31415927E1) = false < (~0.17014117E39, 0.27182817E1) = true > (~0.17014117E39, 0.27182817E1) = false == (~0.17014117E39, 0.27182817E1) = false ?= (~0.17014117E39, 0.27182817E1) = false < (~0.17014117E39, 0.123E1) = true > (~0.17014117E39, 0.123E1) = false == (~0.17014117E39, 0.123E1) = false ?= (~0.17014117E39, 0.123E1) = false < (~0.17014117E39, 0.123) = true > (~0.17014117E39, 0.123) = false == (~0.17014117E39, 0.123) = false ?= (~0.17014117E39, 0.123) = false < (~0.17014117E39, 0.123E~2) = true > (~0.17014117E39, 0.123E~2) = false == (~0.17014117E39, 0.123E~2) = false ?= (~0.17014117E39, 0.123E~2) = false < (~0.17014117E39, 0.11754944E~37) = true > (~0.17014117E39, 0.11754944E~37) = false == (~0.17014117E39, 0.11754944E~37) = false ?= (~0.17014117E39, 0.11754944E~37) = false < (~0.17014117E39, 0.5877472E~38) = true > (~0.17014117E39, 0.5877472E~38) = false == (~0.17014117E39, 0.5877472E~38) = false ?= (~0.17014117E39, 0.5877472E~38) = false < (~0.17014117E39, 0.1E~44) = true > (~0.17014117E39, 0.1E~44) = false == (~0.17014117E39, 0.1E~44) = false ?= (~0.17014117E39, 0.1E~44) = false < (~0.17014117E39, 0.0) = true > (~0.17014117E39, 0.0) = false == (~0.17014117E39, 0.0) = false ?= (~0.17014117E39, 0.0) = false < (~0.17014117E39, ~0.34028235E39) = false > (~0.17014117E39, ~0.34028235E39) = true == (~0.17014117E39, ~0.34028235E39) = false ?= (~0.17014117E39, ~0.34028235E39) = false < (~0.17014117E39, ~0.17014117E39) = false > (~0.17014117E39, ~0.17014117E39) = false == (~0.17014117E39, ~0.17014117E39) = true ?= (~0.17014117E39, ~0.17014117E39) = true < (~0.17014117E39, ~0.123E4) = true > (~0.17014117E39, ~0.123E4) = false == (~0.17014117E39, ~0.123E4) = false ?= (~0.17014117E39, ~0.123E4) = false < (~0.17014117E39, ~0.123E2) = true > (~0.17014117E39, ~0.123E2) = false == (~0.17014117E39, ~0.123E2) = false ?= (~0.17014117E39, ~0.123E2) = false < (~0.17014117E39, ~0.31415927E1) = true > (~0.17014117E39, ~0.31415927E1) = false == (~0.17014117E39, ~0.31415927E1) = false ?= (~0.17014117E39, ~0.31415927E1) = false < (~0.17014117E39, ~0.27182817E1) = true > (~0.17014117E39, ~0.27182817E1) = false == (~0.17014117E39, ~0.27182817E1) = false ?= (~0.17014117E39, ~0.27182817E1) = false < (~0.17014117E39, ~0.123E1) = true > (~0.17014117E39, ~0.123E1) = false == (~0.17014117E39, ~0.123E1) = false ?= (~0.17014117E39, ~0.123E1) = false < (~0.17014117E39, ~0.123) = true > (~0.17014117E39, ~0.123) = false == (~0.17014117E39, ~0.123) = false ?= (~0.17014117E39, ~0.123) = false < (~0.17014117E39, ~0.123E~2) = true > (~0.17014117E39, ~0.123E~2) = false == (~0.17014117E39, ~0.123E~2) = false ?= (~0.17014117E39, ~0.123E~2) = false < (~0.17014117E39, ~0.11754944E~37) = true > (~0.17014117E39, ~0.11754944E~37) = false == (~0.17014117E39, ~0.11754944E~37) = false ?= (~0.17014117E39, ~0.11754944E~37) = false < (~0.17014117E39, ~0.5877472E~38) = true > (~0.17014117E39, ~0.5877472E~38) = false == (~0.17014117E39, ~0.5877472E~38) = false ?= (~0.17014117E39, ~0.5877472E~38) = false < (~0.17014117E39, ~0.1E~44) = true > (~0.17014117E39, ~0.1E~44) = false == (~0.17014117E39, ~0.1E~44) = false ?= (~0.17014117E39, ~0.1E~44) = false < (~0.17014117E39, ~0.0) = true > (~0.17014117E39, ~0.0) = false == (~0.17014117E39, ~0.0) = false ?= (~0.17014117E39, ~0.0) = false < (~0.123E4, 0.34028235E39) = true > (~0.123E4, 0.34028235E39) = false == (~0.123E4, 0.34028235E39) = false ?= (~0.123E4, 0.34028235E39) = false < (~0.123E4, 0.17014117E39) = true > (~0.123E4, 0.17014117E39) = false == (~0.123E4, 0.17014117E39) = false ?= (~0.123E4, 0.17014117E39) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.31415927E1) = true > (~0.123E4, 0.31415927E1) = false == (~0.123E4, 0.31415927E1) = false ?= (~0.123E4, 0.31415927E1) = false < (~0.123E4, 0.27182817E1) = true > (~0.123E4, 0.27182817E1) = false == (~0.123E4, 0.27182817E1) = false ?= (~0.123E4, 0.27182817E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.11754944E~37) = true > (~0.123E4, 0.11754944E~37) = false == (~0.123E4, 0.11754944E~37) = false ?= (~0.123E4, 0.11754944E~37) = false < (~0.123E4, 0.5877472E~38) = true > (~0.123E4, 0.5877472E~38) = false == (~0.123E4, 0.5877472E~38) = false ?= (~0.123E4, 0.5877472E~38) = false < (~0.123E4, 0.1E~44) = true > (~0.123E4, 0.1E~44) = false == (~0.123E4, 0.1E~44) = false ?= (~0.123E4, 0.1E~44) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.34028235E39) = false > (~0.123E4, ~0.34028235E39) = true == (~0.123E4, ~0.34028235E39) = false ?= (~0.123E4, ~0.34028235E39) = false < (~0.123E4, ~0.17014117E39) = false > (~0.123E4, ~0.17014117E39) = true == (~0.123E4, ~0.17014117E39) = false ?= (~0.123E4, ~0.17014117E39) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.31415927E1) = true > (~0.123E4, ~0.31415927E1) = false == (~0.123E4, ~0.31415927E1) = false ?= (~0.123E4, ~0.31415927E1) = false < (~0.123E4, ~0.27182817E1) = true > (~0.123E4, ~0.27182817E1) = false == (~0.123E4, ~0.27182817E1) = false ?= (~0.123E4, ~0.27182817E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.11754944E~37) = true > (~0.123E4, ~0.11754944E~37) = false == (~0.123E4, ~0.11754944E~37) = false ?= (~0.123E4, ~0.11754944E~37) = false < (~0.123E4, ~0.5877472E~38) = true > (~0.123E4, ~0.5877472E~38) = false == (~0.123E4, ~0.5877472E~38) = false ?= (~0.123E4, ~0.5877472E~38) = false < (~0.123E4, ~0.1E~44) = true > (~0.123E4, ~0.1E~44) = false == (~0.123E4, ~0.1E~44) = false ?= (~0.123E4, ~0.1E~44) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.34028235E39) = true > (~0.123E2, 0.34028235E39) = false == (~0.123E2, 0.34028235E39) = false ?= (~0.123E2, 0.34028235E39) = false < (~0.123E2, 0.17014117E39) = true > (~0.123E2, 0.17014117E39) = false == (~0.123E2, 0.17014117E39) = false ?= (~0.123E2, 0.17014117E39) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.31415927E1) = true > (~0.123E2, 0.31415927E1) = false == (~0.123E2, 0.31415927E1) = false ?= (~0.123E2, 0.31415927E1) = false < (~0.123E2, 0.27182817E1) = true > (~0.123E2, 0.27182817E1) = false == (~0.123E2, 0.27182817E1) = false ?= (~0.123E2, 0.27182817E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.11754944E~37) = true > (~0.123E2, 0.11754944E~37) = false == (~0.123E2, 0.11754944E~37) = false ?= (~0.123E2, 0.11754944E~37) = false < (~0.123E2, 0.5877472E~38) = true > (~0.123E2, 0.5877472E~38) = false == (~0.123E2, 0.5877472E~38) = false ?= (~0.123E2, 0.5877472E~38) = false < (~0.123E2, 0.1E~44) = true > (~0.123E2, 0.1E~44) = false == (~0.123E2, 0.1E~44) = false ?= (~0.123E2, 0.1E~44) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.34028235E39) = false > (~0.123E2, ~0.34028235E39) = true == (~0.123E2, ~0.34028235E39) = false ?= (~0.123E2, ~0.34028235E39) = false < (~0.123E2, ~0.17014117E39) = false > (~0.123E2, ~0.17014117E39) = true == (~0.123E2, ~0.17014117E39) = false ?= (~0.123E2, ~0.17014117E39) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.31415927E1) = true > (~0.123E2, ~0.31415927E1) = false == (~0.123E2, ~0.31415927E1) = false ?= (~0.123E2, ~0.31415927E1) = false < (~0.123E2, ~0.27182817E1) = true > (~0.123E2, ~0.27182817E1) = false == (~0.123E2, ~0.27182817E1) = false ?= (~0.123E2, ~0.27182817E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.11754944E~37) = true > (~0.123E2, ~0.11754944E~37) = false == (~0.123E2, ~0.11754944E~37) = false ?= (~0.123E2, ~0.11754944E~37) = false < (~0.123E2, ~0.5877472E~38) = true > (~0.123E2, ~0.5877472E~38) = false == (~0.123E2, ~0.5877472E~38) = false ?= (~0.123E2, ~0.5877472E~38) = false < (~0.123E2, ~0.1E~44) = true > (~0.123E2, ~0.1E~44) = false == (~0.123E2, ~0.1E~44) = false ?= (~0.123E2, ~0.1E~44) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.31415927E1, 0.34028235E39) = true > (~0.31415927E1, 0.34028235E39) = false == (~0.31415927E1, 0.34028235E39) = false ?= (~0.31415927E1, 0.34028235E39) = false < (~0.31415927E1, 0.17014117E39) = true > (~0.31415927E1, 0.17014117E39) = false == (~0.31415927E1, 0.17014117E39) = false ?= (~0.31415927E1, 0.17014117E39) = false < (~0.31415927E1, 0.123E4) = true > (~0.31415927E1, 0.123E4) = false == (~0.31415927E1, 0.123E4) = false ?= (~0.31415927E1, 0.123E4) = false < (~0.31415927E1, 0.123E2) = true > (~0.31415927E1, 0.123E2) = false == (~0.31415927E1, 0.123E2) = false ?= (~0.31415927E1, 0.123E2) = false < (~0.31415927E1, 0.31415927E1) = true > (~0.31415927E1, 0.31415927E1) = false == (~0.31415927E1, 0.31415927E1) = false ?= (~0.31415927E1, 0.31415927E1) = false < (~0.31415927E1, 0.27182817E1) = true > (~0.31415927E1, 0.27182817E1) = false == (~0.31415927E1, 0.27182817E1) = false ?= (~0.31415927E1, 0.27182817E1) = false < (~0.31415927E1, 0.123E1) = true > (~0.31415927E1, 0.123E1) = false == (~0.31415927E1, 0.123E1) = false ?= (~0.31415927E1, 0.123E1) = false < (~0.31415927E1, 0.123) = true > (~0.31415927E1, 0.123) = false == (~0.31415927E1, 0.123) = false ?= (~0.31415927E1, 0.123) = false < (~0.31415927E1, 0.123E~2) = true > (~0.31415927E1, 0.123E~2) = false == (~0.31415927E1, 0.123E~2) = false ?= (~0.31415927E1, 0.123E~2) = false < (~0.31415927E1, 0.11754944E~37) = true > (~0.31415927E1, 0.11754944E~37) = false == (~0.31415927E1, 0.11754944E~37) = false ?= (~0.31415927E1, 0.11754944E~37) = false < (~0.31415927E1, 0.5877472E~38) = true > (~0.31415927E1, 0.5877472E~38) = false == (~0.31415927E1, 0.5877472E~38) = false ?= (~0.31415927E1, 0.5877472E~38) = false < (~0.31415927E1, 0.1E~44) = true > (~0.31415927E1, 0.1E~44) = false == (~0.31415927E1, 0.1E~44) = false ?= (~0.31415927E1, 0.1E~44) = false < (~0.31415927E1, 0.0) = true > (~0.31415927E1, 0.0) = false == (~0.31415927E1, 0.0) = false ?= (~0.31415927E1, 0.0) = false < (~0.31415927E1, ~0.34028235E39) = false > (~0.31415927E1, ~0.34028235E39) = true == (~0.31415927E1, ~0.34028235E39) = false ?= (~0.31415927E1, ~0.34028235E39) = false < (~0.31415927E1, ~0.17014117E39) = false > (~0.31415927E1, ~0.17014117E39) = true == (~0.31415927E1, ~0.17014117E39) = false ?= (~0.31415927E1, ~0.17014117E39) = false < (~0.31415927E1, ~0.123E4) = false > (~0.31415927E1, ~0.123E4) = true == (~0.31415927E1, ~0.123E4) = false ?= (~0.31415927E1, ~0.123E4) = false < (~0.31415927E1, ~0.123E2) = false > (~0.31415927E1, ~0.123E2) = true == (~0.31415927E1, ~0.123E2) = false ?= (~0.31415927E1, ~0.123E2) = false < (~0.31415927E1, ~0.31415927E1) = false > (~0.31415927E1, ~0.31415927E1) = false == (~0.31415927E1, ~0.31415927E1) = true ?= (~0.31415927E1, ~0.31415927E1) = true < (~0.31415927E1, ~0.27182817E1) = true > (~0.31415927E1, ~0.27182817E1) = false == (~0.31415927E1, ~0.27182817E1) = false ?= (~0.31415927E1, ~0.27182817E1) = false < (~0.31415927E1, ~0.123E1) = true > (~0.31415927E1, ~0.123E1) = false == (~0.31415927E1, ~0.123E1) = false ?= (~0.31415927E1, ~0.123E1) = false < (~0.31415927E1, ~0.123) = true > (~0.31415927E1, ~0.123) = false == (~0.31415927E1, ~0.123) = false ?= (~0.31415927E1, ~0.123) = false < (~0.31415927E1, ~0.123E~2) = true > (~0.31415927E1, ~0.123E~2) = false == (~0.31415927E1, ~0.123E~2) = false ?= (~0.31415927E1, ~0.123E~2) = false < (~0.31415927E1, ~0.11754944E~37) = true > (~0.31415927E1, ~0.11754944E~37) = false == (~0.31415927E1, ~0.11754944E~37) = false ?= (~0.31415927E1, ~0.11754944E~37) = false < (~0.31415927E1, ~0.5877472E~38) = true > (~0.31415927E1, ~0.5877472E~38) = false == (~0.31415927E1, ~0.5877472E~38) = false ?= (~0.31415927E1, ~0.5877472E~38) = false < (~0.31415927E1, ~0.1E~44) = true > (~0.31415927E1, ~0.1E~44) = false == (~0.31415927E1, ~0.1E~44) = false ?= (~0.31415927E1, ~0.1E~44) = false < (~0.31415927E1, ~0.0) = true > (~0.31415927E1, ~0.0) = false == (~0.31415927E1, ~0.0) = false ?= (~0.31415927E1, ~0.0) = false < (~0.27182817E1, 0.34028235E39) = true > (~0.27182817E1, 0.34028235E39) = false == (~0.27182817E1, 0.34028235E39) = false ?= (~0.27182817E1, 0.34028235E39) = false < (~0.27182817E1, 0.17014117E39) = true > (~0.27182817E1, 0.17014117E39) = false == (~0.27182817E1, 0.17014117E39) = false ?= (~0.27182817E1, 0.17014117E39) = false < (~0.27182817E1, 0.123E4) = true > (~0.27182817E1, 0.123E4) = false == (~0.27182817E1, 0.123E4) = false ?= (~0.27182817E1, 0.123E4) = false < (~0.27182817E1, 0.123E2) = true > (~0.27182817E1, 0.123E2) = false == (~0.27182817E1, 0.123E2) = false ?= (~0.27182817E1, 0.123E2) = false < (~0.27182817E1, 0.31415927E1) = true > (~0.27182817E1, 0.31415927E1) = false == (~0.27182817E1, 0.31415927E1) = false ?= (~0.27182817E1, 0.31415927E1) = false < (~0.27182817E1, 0.27182817E1) = true > (~0.27182817E1, 0.27182817E1) = false == (~0.27182817E1, 0.27182817E1) = false ?= (~0.27182817E1, 0.27182817E1) = false < (~0.27182817E1, 0.123E1) = true > (~0.27182817E1, 0.123E1) = false == (~0.27182817E1, 0.123E1) = false ?= (~0.27182817E1, 0.123E1) = false < (~0.27182817E1, 0.123) = true > (~0.27182817E1, 0.123) = false == (~0.27182817E1, 0.123) = false ?= (~0.27182817E1, 0.123) = false < (~0.27182817E1, 0.123E~2) = true > (~0.27182817E1, 0.123E~2) = false == (~0.27182817E1, 0.123E~2) = false ?= (~0.27182817E1, 0.123E~2) = false < (~0.27182817E1, 0.11754944E~37) = true > (~0.27182817E1, 0.11754944E~37) = false == (~0.27182817E1, 0.11754944E~37) = false ?= (~0.27182817E1, 0.11754944E~37) = false < (~0.27182817E1, 0.5877472E~38) = true > (~0.27182817E1, 0.5877472E~38) = false == (~0.27182817E1, 0.5877472E~38) = false ?= (~0.27182817E1, 0.5877472E~38) = false < (~0.27182817E1, 0.1E~44) = true > (~0.27182817E1, 0.1E~44) = false == (~0.27182817E1, 0.1E~44) = false ?= (~0.27182817E1, 0.1E~44) = false < (~0.27182817E1, 0.0) = true > (~0.27182817E1, 0.0) = false == (~0.27182817E1, 0.0) = false ?= (~0.27182817E1, 0.0) = false < (~0.27182817E1, ~0.34028235E39) = false > (~0.27182817E1, ~0.34028235E39) = true == (~0.27182817E1, ~0.34028235E39) = false ?= (~0.27182817E1, ~0.34028235E39) = false < (~0.27182817E1, ~0.17014117E39) = false > (~0.27182817E1, ~0.17014117E39) = true == (~0.27182817E1, ~0.17014117E39) = false ?= (~0.27182817E1, ~0.17014117E39) = false < (~0.27182817E1, ~0.123E4) = false > (~0.27182817E1, ~0.123E4) = true == (~0.27182817E1, ~0.123E4) = false ?= (~0.27182817E1, ~0.123E4) = false < (~0.27182817E1, ~0.123E2) = false > (~0.27182817E1, ~0.123E2) = true == (~0.27182817E1, ~0.123E2) = false ?= (~0.27182817E1, ~0.123E2) = false < (~0.27182817E1, ~0.31415927E1) = false > (~0.27182817E1, ~0.31415927E1) = true == (~0.27182817E1, ~0.31415927E1) = false ?= (~0.27182817E1, ~0.31415927E1) = false < (~0.27182817E1, ~0.27182817E1) = false > (~0.27182817E1, ~0.27182817E1) = false == (~0.27182817E1, ~0.27182817E1) = true ?= (~0.27182817E1, ~0.27182817E1) = true < (~0.27182817E1, ~0.123E1) = true > (~0.27182817E1, ~0.123E1) = false == (~0.27182817E1, ~0.123E1) = false ?= (~0.27182817E1, ~0.123E1) = false < (~0.27182817E1, ~0.123) = true > (~0.27182817E1, ~0.123) = false == (~0.27182817E1, ~0.123) = false ?= (~0.27182817E1, ~0.123) = false < (~0.27182817E1, ~0.123E~2) = true > (~0.27182817E1, ~0.123E~2) = false == (~0.27182817E1, ~0.123E~2) = false ?= (~0.27182817E1, ~0.123E~2) = false < (~0.27182817E1, ~0.11754944E~37) = true > (~0.27182817E1, ~0.11754944E~37) = false == (~0.27182817E1, ~0.11754944E~37) = false ?= (~0.27182817E1, ~0.11754944E~37) = false < (~0.27182817E1, ~0.5877472E~38) = true > (~0.27182817E1, ~0.5877472E~38) = false == (~0.27182817E1, ~0.5877472E~38) = false ?= (~0.27182817E1, ~0.5877472E~38) = false < (~0.27182817E1, ~0.1E~44) = true > (~0.27182817E1, ~0.1E~44) = false == (~0.27182817E1, ~0.1E~44) = false ?= (~0.27182817E1, ~0.1E~44) = false < (~0.27182817E1, ~0.0) = true > (~0.27182817E1, ~0.0) = false == (~0.27182817E1, ~0.0) = false ?= (~0.27182817E1, ~0.0) = false < (~0.123E1, 0.34028235E39) = true > (~0.123E1, 0.34028235E39) = false == (~0.123E1, 0.34028235E39) = false ?= (~0.123E1, 0.34028235E39) = false < (~0.123E1, 0.17014117E39) = true > (~0.123E1, 0.17014117E39) = false == (~0.123E1, 0.17014117E39) = false ?= (~0.123E1, 0.17014117E39) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.31415927E1) = true > (~0.123E1, 0.31415927E1) = false == (~0.123E1, 0.31415927E1) = false ?= (~0.123E1, 0.31415927E1) = false < (~0.123E1, 0.27182817E1) = true > (~0.123E1, 0.27182817E1) = false == (~0.123E1, 0.27182817E1) = false ?= (~0.123E1, 0.27182817E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.11754944E~37) = true > (~0.123E1, 0.11754944E~37) = false == (~0.123E1, 0.11754944E~37) = false ?= (~0.123E1, 0.11754944E~37) = false < (~0.123E1, 0.5877472E~38) = true > (~0.123E1, 0.5877472E~38) = false == (~0.123E1, 0.5877472E~38) = false ?= (~0.123E1, 0.5877472E~38) = false < (~0.123E1, 0.1E~44) = true > (~0.123E1, 0.1E~44) = false == (~0.123E1, 0.1E~44) = false ?= (~0.123E1, 0.1E~44) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.34028235E39) = false > (~0.123E1, ~0.34028235E39) = true == (~0.123E1, ~0.34028235E39) = false ?= (~0.123E1, ~0.34028235E39) = false < (~0.123E1, ~0.17014117E39) = false > (~0.123E1, ~0.17014117E39) = true == (~0.123E1, ~0.17014117E39) = false ?= (~0.123E1, ~0.17014117E39) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.31415927E1) = false > (~0.123E1, ~0.31415927E1) = true == (~0.123E1, ~0.31415927E1) = false ?= (~0.123E1, ~0.31415927E1) = false < (~0.123E1, ~0.27182817E1) = false > (~0.123E1, ~0.27182817E1) = true == (~0.123E1, ~0.27182817E1) = false ?= (~0.123E1, ~0.27182817E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.11754944E~37) = true > (~0.123E1, ~0.11754944E~37) = false == (~0.123E1, ~0.11754944E~37) = false ?= (~0.123E1, ~0.11754944E~37) = false < (~0.123E1, ~0.5877472E~38) = true > (~0.123E1, ~0.5877472E~38) = false == (~0.123E1, ~0.5877472E~38) = false ?= (~0.123E1, ~0.5877472E~38) = false < (~0.123E1, ~0.1E~44) = true > (~0.123E1, ~0.1E~44) = false == (~0.123E1, ~0.1E~44) = false ?= (~0.123E1, ~0.1E~44) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.34028235E39) = true > (~0.123, 0.34028235E39) = false == (~0.123, 0.34028235E39) = false ?= (~0.123, 0.34028235E39) = false < (~0.123, 0.17014117E39) = true > (~0.123, 0.17014117E39) = false == (~0.123, 0.17014117E39) = false ?= (~0.123, 0.17014117E39) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.31415927E1) = true > (~0.123, 0.31415927E1) = false == (~0.123, 0.31415927E1) = false ?= (~0.123, 0.31415927E1) = false < (~0.123, 0.27182817E1) = true > (~0.123, 0.27182817E1) = false == (~0.123, 0.27182817E1) = false ?= (~0.123, 0.27182817E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.11754944E~37) = true > (~0.123, 0.11754944E~37) = false == (~0.123, 0.11754944E~37) = false ?= (~0.123, 0.11754944E~37) = false < (~0.123, 0.5877472E~38) = true > (~0.123, 0.5877472E~38) = false == (~0.123, 0.5877472E~38) = false ?= (~0.123, 0.5877472E~38) = false < (~0.123, 0.1E~44) = true > (~0.123, 0.1E~44) = false == (~0.123, 0.1E~44) = false ?= (~0.123, 0.1E~44) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.34028235E39) = false > (~0.123, ~0.34028235E39) = true == (~0.123, ~0.34028235E39) = false ?= (~0.123, ~0.34028235E39) = false < (~0.123, ~0.17014117E39) = false > (~0.123, ~0.17014117E39) = true == (~0.123, ~0.17014117E39) = false ?= (~0.123, ~0.17014117E39) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.31415927E1) = false > (~0.123, ~0.31415927E1) = true == (~0.123, ~0.31415927E1) = false ?= (~0.123, ~0.31415927E1) = false < (~0.123, ~0.27182817E1) = false > (~0.123, ~0.27182817E1) = true == (~0.123, ~0.27182817E1) = false ?= (~0.123, ~0.27182817E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.11754944E~37) = true > (~0.123, ~0.11754944E~37) = false == (~0.123, ~0.11754944E~37) = false ?= (~0.123, ~0.11754944E~37) = false < (~0.123, ~0.5877472E~38) = true > (~0.123, ~0.5877472E~38) = false == (~0.123, ~0.5877472E~38) = false ?= (~0.123, ~0.5877472E~38) = false < (~0.123, ~0.1E~44) = true > (~0.123, ~0.1E~44) = false == (~0.123, ~0.1E~44) = false ?= (~0.123, ~0.1E~44) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.34028235E39) = true > (~0.123E~2, 0.34028235E39) = false == (~0.123E~2, 0.34028235E39) = false ?= (~0.123E~2, 0.34028235E39) = false < (~0.123E~2, 0.17014117E39) = true > (~0.123E~2, 0.17014117E39) = false == (~0.123E~2, 0.17014117E39) = false ?= (~0.123E~2, 0.17014117E39) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.31415927E1) = true > (~0.123E~2, 0.31415927E1) = false == (~0.123E~2, 0.31415927E1) = false ?= (~0.123E~2, 0.31415927E1) = false < (~0.123E~2, 0.27182817E1) = true > (~0.123E~2, 0.27182817E1) = false == (~0.123E~2, 0.27182817E1) = false ?= (~0.123E~2, 0.27182817E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.11754944E~37) = true > (~0.123E~2, 0.11754944E~37) = false == (~0.123E~2, 0.11754944E~37) = false ?= (~0.123E~2, 0.11754944E~37) = false < (~0.123E~2, 0.5877472E~38) = true > (~0.123E~2, 0.5877472E~38) = false == (~0.123E~2, 0.5877472E~38) = false ?= (~0.123E~2, 0.5877472E~38) = false < (~0.123E~2, 0.1E~44) = true > (~0.123E~2, 0.1E~44) = false == (~0.123E~2, 0.1E~44) = false ?= (~0.123E~2, 0.1E~44) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.34028235E39) = false > (~0.123E~2, ~0.34028235E39) = true == (~0.123E~2, ~0.34028235E39) = false ?= (~0.123E~2, ~0.34028235E39) = false < (~0.123E~2, ~0.17014117E39) = false > (~0.123E~2, ~0.17014117E39) = true == (~0.123E~2, ~0.17014117E39) = false ?= (~0.123E~2, ~0.17014117E39) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.31415927E1) = false > (~0.123E~2, ~0.31415927E1) = true == (~0.123E~2, ~0.31415927E1) = false ?= (~0.123E~2, ~0.31415927E1) = false < (~0.123E~2, ~0.27182817E1) = false > (~0.123E~2, ~0.27182817E1) = true == (~0.123E~2, ~0.27182817E1) = false ?= (~0.123E~2, ~0.27182817E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.11754944E~37) = true > (~0.123E~2, ~0.11754944E~37) = false == (~0.123E~2, ~0.11754944E~37) = false ?= (~0.123E~2, ~0.11754944E~37) = false < (~0.123E~2, ~0.5877472E~38) = true > (~0.123E~2, ~0.5877472E~38) = false == (~0.123E~2, ~0.5877472E~38) = false ?= (~0.123E~2, ~0.5877472E~38) = false < (~0.123E~2, ~0.1E~44) = true > (~0.123E~2, ~0.1E~44) = false == (~0.123E~2, ~0.1E~44) = false ?= (~0.123E~2, ~0.1E~44) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.11754944E~37, 0.34028235E39) = true > (~0.11754944E~37, 0.34028235E39) = false == (~0.11754944E~37, 0.34028235E39) = false ?= (~0.11754944E~37, 0.34028235E39) = false < (~0.11754944E~37, 0.17014117E39) = true > (~0.11754944E~37, 0.17014117E39) = false == (~0.11754944E~37, 0.17014117E39) = false ?= (~0.11754944E~37, 0.17014117E39) = false < (~0.11754944E~37, 0.123E4) = true > (~0.11754944E~37, 0.123E4) = false == (~0.11754944E~37, 0.123E4) = false ?= (~0.11754944E~37, 0.123E4) = false < (~0.11754944E~37, 0.123E2) = true > (~0.11754944E~37, 0.123E2) = false == (~0.11754944E~37, 0.123E2) = false ?= (~0.11754944E~37, 0.123E2) = false < (~0.11754944E~37, 0.31415927E1) = true > (~0.11754944E~37, 0.31415927E1) = false == (~0.11754944E~37, 0.31415927E1) = false ?= (~0.11754944E~37, 0.31415927E1) = false < (~0.11754944E~37, 0.27182817E1) = true > (~0.11754944E~37, 0.27182817E1) = false == (~0.11754944E~37, 0.27182817E1) = false ?= (~0.11754944E~37, 0.27182817E1) = false < (~0.11754944E~37, 0.123E1) = true > (~0.11754944E~37, 0.123E1) = false == (~0.11754944E~37, 0.123E1) = false ?= (~0.11754944E~37, 0.123E1) = false < (~0.11754944E~37, 0.123) = true > (~0.11754944E~37, 0.123) = false == (~0.11754944E~37, 0.123) = false ?= (~0.11754944E~37, 0.123) = false < (~0.11754944E~37, 0.123E~2) = true > (~0.11754944E~37, 0.123E~2) = false == (~0.11754944E~37, 0.123E~2) = false ?= (~0.11754944E~37, 0.123E~2) = false < (~0.11754944E~37, 0.11754944E~37) = true > (~0.11754944E~37, 0.11754944E~37) = false == (~0.11754944E~37, 0.11754944E~37) = false ?= (~0.11754944E~37, 0.11754944E~37) = false < (~0.11754944E~37, 0.5877472E~38) = true > (~0.11754944E~37, 0.5877472E~38) = false == (~0.11754944E~37, 0.5877472E~38) = false ?= (~0.11754944E~37, 0.5877472E~38) = false < (~0.11754944E~37, 0.1E~44) = true > (~0.11754944E~37, 0.1E~44) = false == (~0.11754944E~37, 0.1E~44) = false ?= (~0.11754944E~37, 0.1E~44) = false < (~0.11754944E~37, 0.0) = true > (~0.11754944E~37, 0.0) = false == (~0.11754944E~37, 0.0) = false ?= (~0.11754944E~37, 0.0) = false < (~0.11754944E~37, ~0.34028235E39) = false > (~0.11754944E~37, ~0.34028235E39) = true == (~0.11754944E~37, ~0.34028235E39) = false ?= (~0.11754944E~37, ~0.34028235E39) = false < (~0.11754944E~37, ~0.17014117E39) = false > (~0.11754944E~37, ~0.17014117E39) = true == (~0.11754944E~37, ~0.17014117E39) = false ?= (~0.11754944E~37, ~0.17014117E39) = false < (~0.11754944E~37, ~0.123E4) = false > (~0.11754944E~37, ~0.123E4) = true == (~0.11754944E~37, ~0.123E4) = false ?= (~0.11754944E~37, ~0.123E4) = false < (~0.11754944E~37, ~0.123E2) = false > (~0.11754944E~37, ~0.123E2) = true == (~0.11754944E~37, ~0.123E2) = false ?= (~0.11754944E~37, ~0.123E2) = false < (~0.11754944E~37, ~0.31415927E1) = false > (~0.11754944E~37, ~0.31415927E1) = true == (~0.11754944E~37, ~0.31415927E1) = false ?= (~0.11754944E~37, ~0.31415927E1) = false < (~0.11754944E~37, ~0.27182817E1) = false > (~0.11754944E~37, ~0.27182817E1) = true == (~0.11754944E~37, ~0.27182817E1) = false ?= (~0.11754944E~37, ~0.27182817E1) = false < (~0.11754944E~37, ~0.123E1) = false > (~0.11754944E~37, ~0.123E1) = true == (~0.11754944E~37, ~0.123E1) = false ?= (~0.11754944E~37, ~0.123E1) = false < (~0.11754944E~37, ~0.123) = false > (~0.11754944E~37, ~0.123) = true == (~0.11754944E~37, ~0.123) = false ?= (~0.11754944E~37, ~0.123) = false < (~0.11754944E~37, ~0.123E~2) = false > (~0.11754944E~37, ~0.123E~2) = true == (~0.11754944E~37, ~0.123E~2) = false ?= (~0.11754944E~37, ~0.123E~2) = false < (~0.11754944E~37, ~0.11754944E~37) = false > (~0.11754944E~37, ~0.11754944E~37) = false == (~0.11754944E~37, ~0.11754944E~37) = true ?= (~0.11754944E~37, ~0.11754944E~37) = true < (~0.11754944E~37, ~0.5877472E~38) = true > (~0.11754944E~37, ~0.5877472E~38) = false == (~0.11754944E~37, ~0.5877472E~38) = false ?= (~0.11754944E~37, ~0.5877472E~38) = false < (~0.11754944E~37, ~0.1E~44) = true > (~0.11754944E~37, ~0.1E~44) = false == (~0.11754944E~37, ~0.1E~44) = false ?= (~0.11754944E~37, ~0.1E~44) = false < (~0.11754944E~37, ~0.0) = true > (~0.11754944E~37, ~0.0) = false == (~0.11754944E~37, ~0.0) = false ?= (~0.11754944E~37, ~0.0) = false < (~0.5877472E~38, 0.34028235E39) = true > (~0.5877472E~38, 0.34028235E39) = false == (~0.5877472E~38, 0.34028235E39) = false ?= (~0.5877472E~38, 0.34028235E39) = false < (~0.5877472E~38, 0.17014117E39) = true > (~0.5877472E~38, 0.17014117E39) = false == (~0.5877472E~38, 0.17014117E39) = false ?= (~0.5877472E~38, 0.17014117E39) = false < (~0.5877472E~38, 0.123E4) = true > (~0.5877472E~38, 0.123E4) = false == (~0.5877472E~38, 0.123E4) = false ?= (~0.5877472E~38, 0.123E4) = false < (~0.5877472E~38, 0.123E2) = true > (~0.5877472E~38, 0.123E2) = false == (~0.5877472E~38, 0.123E2) = false ?= (~0.5877472E~38, 0.123E2) = false < (~0.5877472E~38, 0.31415927E1) = true > (~0.5877472E~38, 0.31415927E1) = false == (~0.5877472E~38, 0.31415927E1) = false ?= (~0.5877472E~38, 0.31415927E1) = false < (~0.5877472E~38, 0.27182817E1) = true > (~0.5877472E~38, 0.27182817E1) = false == (~0.5877472E~38, 0.27182817E1) = false ?= (~0.5877472E~38, 0.27182817E1) = false < (~0.5877472E~38, 0.123E1) = true > (~0.5877472E~38, 0.123E1) = false == (~0.5877472E~38, 0.123E1) = false ?= (~0.5877472E~38, 0.123E1) = false < (~0.5877472E~38, 0.123) = true > (~0.5877472E~38, 0.123) = false == (~0.5877472E~38, 0.123) = false ?= (~0.5877472E~38, 0.123) = false < (~0.5877472E~38, 0.123E~2) = true > (~0.5877472E~38, 0.123E~2) = false == (~0.5877472E~38, 0.123E~2) = false ?= (~0.5877472E~38, 0.123E~2) = false < (~0.5877472E~38, 0.11754944E~37) = true > (~0.5877472E~38, 0.11754944E~37) = false == (~0.5877472E~38, 0.11754944E~37) = false ?= (~0.5877472E~38, 0.11754944E~37) = false < (~0.5877472E~38, 0.5877472E~38) = true > (~0.5877472E~38, 0.5877472E~38) = false == (~0.5877472E~38, 0.5877472E~38) = false ?= (~0.5877472E~38, 0.5877472E~38) = false < (~0.5877472E~38, 0.1E~44) = true > (~0.5877472E~38, 0.1E~44) = false == (~0.5877472E~38, 0.1E~44) = false ?= (~0.5877472E~38, 0.1E~44) = false < (~0.5877472E~38, 0.0) = true > (~0.5877472E~38, 0.0) = false == (~0.5877472E~38, 0.0) = false ?= (~0.5877472E~38, 0.0) = false < (~0.5877472E~38, ~0.34028235E39) = false > (~0.5877472E~38, ~0.34028235E39) = true == (~0.5877472E~38, ~0.34028235E39) = false ?= (~0.5877472E~38, ~0.34028235E39) = false < (~0.5877472E~38, ~0.17014117E39) = false > (~0.5877472E~38, ~0.17014117E39) = true == (~0.5877472E~38, ~0.17014117E39) = false ?= (~0.5877472E~38, ~0.17014117E39) = false < (~0.5877472E~38, ~0.123E4) = false > (~0.5877472E~38, ~0.123E4) = true == (~0.5877472E~38, ~0.123E4) = false ?= (~0.5877472E~38, ~0.123E4) = false < (~0.5877472E~38, ~0.123E2) = false > (~0.5877472E~38, ~0.123E2) = true == (~0.5877472E~38, ~0.123E2) = false ?= (~0.5877472E~38, ~0.123E2) = false < (~0.5877472E~38, ~0.31415927E1) = false > (~0.5877472E~38, ~0.31415927E1) = true == (~0.5877472E~38, ~0.31415927E1) = false ?= (~0.5877472E~38, ~0.31415927E1) = false < (~0.5877472E~38, ~0.27182817E1) = false > (~0.5877472E~38, ~0.27182817E1) = true == (~0.5877472E~38, ~0.27182817E1) = false ?= (~0.5877472E~38, ~0.27182817E1) = false < (~0.5877472E~38, ~0.123E1) = false > (~0.5877472E~38, ~0.123E1) = true == (~0.5877472E~38, ~0.123E1) = false ?= (~0.5877472E~38, ~0.123E1) = false < (~0.5877472E~38, ~0.123) = false > (~0.5877472E~38, ~0.123) = true == (~0.5877472E~38, ~0.123) = false ?= (~0.5877472E~38, ~0.123) = false < (~0.5877472E~38, ~0.123E~2) = false > (~0.5877472E~38, ~0.123E~2) = true == (~0.5877472E~38, ~0.123E~2) = false ?= (~0.5877472E~38, ~0.123E~2) = false < (~0.5877472E~38, ~0.11754944E~37) = false > (~0.5877472E~38, ~0.11754944E~37) = true == (~0.5877472E~38, ~0.11754944E~37) = false ?= (~0.5877472E~38, ~0.11754944E~37) = false < (~0.5877472E~38, ~0.5877472E~38) = false > (~0.5877472E~38, ~0.5877472E~38) = false == (~0.5877472E~38, ~0.5877472E~38) = true ?= (~0.5877472E~38, ~0.5877472E~38) = true < (~0.5877472E~38, ~0.1E~44) = true > (~0.5877472E~38, ~0.1E~44) = false == (~0.5877472E~38, ~0.1E~44) = false ?= (~0.5877472E~38, ~0.1E~44) = false < (~0.5877472E~38, ~0.0) = true > (~0.5877472E~38, ~0.0) = false == (~0.5877472E~38, ~0.0) = false ?= (~0.5877472E~38, ~0.0) = false < (~0.1E~44, 0.34028235E39) = true > (~0.1E~44, 0.34028235E39) = false == (~0.1E~44, 0.34028235E39) = false ?= (~0.1E~44, 0.34028235E39) = false < (~0.1E~44, 0.17014117E39) = true > (~0.1E~44, 0.17014117E39) = false == (~0.1E~44, 0.17014117E39) = false ?= (~0.1E~44, 0.17014117E39) = false < (~0.1E~44, 0.123E4) = true > (~0.1E~44, 0.123E4) = false == (~0.1E~44, 0.123E4) = false ?= (~0.1E~44, 0.123E4) = false < (~0.1E~44, 0.123E2) = true > (~0.1E~44, 0.123E2) = false == (~0.1E~44, 0.123E2) = false ?= (~0.1E~44, 0.123E2) = false < (~0.1E~44, 0.31415927E1) = true > (~0.1E~44, 0.31415927E1) = false == (~0.1E~44, 0.31415927E1) = false ?= (~0.1E~44, 0.31415927E1) = false < (~0.1E~44, 0.27182817E1) = true > (~0.1E~44, 0.27182817E1) = false == (~0.1E~44, 0.27182817E1) = false ?= (~0.1E~44, 0.27182817E1) = false < (~0.1E~44, 0.123E1) = true > (~0.1E~44, 0.123E1) = false == (~0.1E~44, 0.123E1) = false ?= (~0.1E~44, 0.123E1) = false < (~0.1E~44, 0.123) = true > (~0.1E~44, 0.123) = false == (~0.1E~44, 0.123) = false ?= (~0.1E~44, 0.123) = false < (~0.1E~44, 0.123E~2) = true > (~0.1E~44, 0.123E~2) = false == (~0.1E~44, 0.123E~2) = false ?= (~0.1E~44, 0.123E~2) = false < (~0.1E~44, 0.11754944E~37) = true > (~0.1E~44, 0.11754944E~37) = false == (~0.1E~44, 0.11754944E~37) = false ?= (~0.1E~44, 0.11754944E~37) = false < (~0.1E~44, 0.5877472E~38) = true > (~0.1E~44, 0.5877472E~38) = false == (~0.1E~44, 0.5877472E~38) = false ?= (~0.1E~44, 0.5877472E~38) = false < (~0.1E~44, 0.1E~44) = true > (~0.1E~44, 0.1E~44) = false == (~0.1E~44, 0.1E~44) = false ?= (~0.1E~44, 0.1E~44) = false < (~0.1E~44, 0.0) = true > (~0.1E~44, 0.0) = false == (~0.1E~44, 0.0) = false ?= (~0.1E~44, 0.0) = false < (~0.1E~44, ~0.34028235E39) = false > (~0.1E~44, ~0.34028235E39) = true == (~0.1E~44, ~0.34028235E39) = false ?= (~0.1E~44, ~0.34028235E39) = false < (~0.1E~44, ~0.17014117E39) = false > (~0.1E~44, ~0.17014117E39) = true == (~0.1E~44, ~0.17014117E39) = false ?= (~0.1E~44, ~0.17014117E39) = false < (~0.1E~44, ~0.123E4) = false > (~0.1E~44, ~0.123E4) = true == (~0.1E~44, ~0.123E4) = false ?= (~0.1E~44, ~0.123E4) = false < (~0.1E~44, ~0.123E2) = false > (~0.1E~44, ~0.123E2) = true == (~0.1E~44, ~0.123E2) = false ?= (~0.1E~44, ~0.123E2) = false < (~0.1E~44, ~0.31415927E1) = false > (~0.1E~44, ~0.31415927E1) = true == (~0.1E~44, ~0.31415927E1) = false ?= (~0.1E~44, ~0.31415927E1) = false < (~0.1E~44, ~0.27182817E1) = false > (~0.1E~44, ~0.27182817E1) = true == (~0.1E~44, ~0.27182817E1) = false ?= (~0.1E~44, ~0.27182817E1) = false < (~0.1E~44, ~0.123E1) = false > (~0.1E~44, ~0.123E1) = true == (~0.1E~44, ~0.123E1) = false ?= (~0.1E~44, ~0.123E1) = false < (~0.1E~44, ~0.123) = false > (~0.1E~44, ~0.123) = true == (~0.1E~44, ~0.123) = false ?= (~0.1E~44, ~0.123) = false < (~0.1E~44, ~0.123E~2) = false > (~0.1E~44, ~0.123E~2) = true == (~0.1E~44, ~0.123E~2) = false ?= (~0.1E~44, ~0.123E~2) = false < (~0.1E~44, ~0.11754944E~37) = false > (~0.1E~44, ~0.11754944E~37) = true == (~0.1E~44, ~0.11754944E~37) = false ?= (~0.1E~44, ~0.11754944E~37) = false < (~0.1E~44, ~0.5877472E~38) = false > (~0.1E~44, ~0.5877472E~38) = true == (~0.1E~44, ~0.5877472E~38) = false ?= (~0.1E~44, ~0.5877472E~38) = false < (~0.1E~44, ~0.1E~44) = false > (~0.1E~44, ~0.1E~44) = false == (~0.1E~44, ~0.1E~44) = true ?= (~0.1E~44, ~0.1E~44) = true < (~0.1E~44, ~0.0) = true > (~0.1E~44, ~0.0) = false == (~0.1E~44, ~0.0) = false ?= (~0.1E~44, ~0.0) = false < (~0.0, 0.34028235E39) = true > (~0.0, 0.34028235E39) = false == (~0.0, 0.34028235E39) = false ?= (~0.0, 0.34028235E39) = false < (~0.0, 0.17014117E39) = true > (~0.0, 0.17014117E39) = false == (~0.0, 0.17014117E39) = false ?= (~0.0, 0.17014117E39) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.31415927E1) = true > (~0.0, 0.31415927E1) = false == (~0.0, 0.31415927E1) = false ?= (~0.0, 0.31415927E1) = false < (~0.0, 0.27182817E1) = true > (~0.0, 0.27182817E1) = false == (~0.0, 0.27182817E1) = false ?= (~0.0, 0.27182817E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.11754944E~37) = true > (~0.0, 0.11754944E~37) = false == (~0.0, 0.11754944E~37) = false ?= (~0.0, 0.11754944E~37) = false < (~0.0, 0.5877472E~38) = true > (~0.0, 0.5877472E~38) = false == (~0.0, 0.5877472E~38) = false ?= (~0.0, 0.5877472E~38) = false < (~0.0, 0.1E~44) = true > (~0.0, 0.1E~44) = false == (~0.0, 0.1E~44) = false ?= (~0.0, 0.1E~44) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.34028235E39) = false > (~0.0, ~0.34028235E39) = true == (~0.0, ~0.34028235E39) = false ?= (~0.0, ~0.34028235E39) = false < (~0.0, ~0.17014117E39) = false > (~0.0, ~0.17014117E39) = true == (~0.0, ~0.17014117E39) = false ?= (~0.0, ~0.17014117E39) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.31415927E1) = false > (~0.0, ~0.31415927E1) = true == (~0.0, ~0.31415927E1) = false ?= (~0.0, ~0.31415927E1) = false < (~0.0, ~0.27182817E1) = false > (~0.0, ~0.27182817E1) = true == (~0.0, ~0.27182817E1) = false ?= (~0.0, ~0.27182817E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.11754944E~37) = false > (~0.0, ~0.11754944E~37) = true == (~0.0, ~0.11754944E~37) = false ?= (~0.0, ~0.11754944E~37) = false < (~0.0, ~0.5877472E~38) = false > (~0.0, ~0.5877472E~38) = true == (~0.0, ~0.5877472E~38) = false ?= (~0.0, ~0.5877472E~38) = false < (~0.0, ~0.1E~44) = false > (~0.0, ~0.1E~44) = true == (~0.0, ~0.1E~44) = false ?= (~0.0, ~0.1E~44) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.34028235E39, 0.34028235E39) = EQUAL compareReal (0.34028235E39, 0.34028235E39) = EQUAL compare (0.34028235E39, 0.17014117E39) = GREATER compareReal (0.34028235E39, 0.17014117E39) = GREATER compare (0.34028235E39, 0.123E4) = GREATER compareReal (0.34028235E39, 0.123E4) = GREATER compare (0.34028235E39, 0.123E2) = GREATER compareReal (0.34028235E39, 0.123E2) = GREATER compare (0.34028235E39, 0.31415927E1) = GREATER compareReal (0.34028235E39, 0.31415927E1) = GREATER compare (0.34028235E39, 0.27182817E1) = GREATER compareReal (0.34028235E39, 0.27182817E1) = GREATER compare (0.34028235E39, 0.123E1) = GREATER compareReal (0.34028235E39, 0.123E1) = GREATER compare (0.34028235E39, 0.123) = GREATER compareReal (0.34028235E39, 0.123) = GREATER compare (0.34028235E39, 0.123E~2) = GREATER compareReal (0.34028235E39, 0.123E~2) = GREATER compare (0.34028235E39, 0.11754944E~37) = GREATER compareReal (0.34028235E39, 0.11754944E~37) = GREATER compare (0.34028235E39, 0.5877472E~38) = GREATER compareReal (0.34028235E39, 0.5877472E~38) = GREATER compare (0.34028235E39, 0.1E~44) = GREATER compareReal (0.34028235E39, 0.1E~44) = GREATER compare (0.34028235E39, 0.0) = GREATER compareReal (0.34028235E39, 0.0) = GREATER compare (0.34028235E39, ~0.34028235E39) = GREATER compareReal (0.34028235E39, ~0.34028235E39) = GREATER compare (0.34028235E39, ~0.17014117E39) = GREATER compareReal (0.34028235E39, ~0.17014117E39) = GREATER compare (0.34028235E39, ~0.123E4) = GREATER compareReal (0.34028235E39, ~0.123E4) = GREATER compare (0.34028235E39, ~0.123E2) = GREATER compareReal (0.34028235E39, ~0.123E2) = GREATER compare (0.34028235E39, ~0.31415927E1) = GREATER compareReal (0.34028235E39, ~0.31415927E1) = GREATER compare (0.34028235E39, ~0.27182817E1) = GREATER compareReal (0.34028235E39, ~0.27182817E1) = GREATER compare (0.34028235E39, ~0.123E1) = GREATER compareReal (0.34028235E39, ~0.123E1) = GREATER compare (0.34028235E39, ~0.123) = GREATER compareReal (0.34028235E39, ~0.123) = GREATER compare (0.34028235E39, ~0.123E~2) = GREATER compareReal (0.34028235E39, ~0.123E~2) = GREATER compare (0.34028235E39, ~0.11754944E~37) = GREATER compareReal (0.34028235E39, ~0.11754944E~37) = GREATER compare (0.34028235E39, ~0.5877472E~38) = GREATER compareReal (0.34028235E39, ~0.5877472E~38) = GREATER compare (0.34028235E39, ~0.1E~44) = GREATER compareReal (0.34028235E39, ~0.1E~44) = GREATER compare (0.34028235E39, ~0.0) = GREATER compareReal (0.34028235E39, ~0.0) = GREATER compare (0.17014117E39, 0.34028235E39) = LESS compareReal (0.17014117E39, 0.34028235E39) = LESS compare (0.17014117E39, 0.17014117E39) = EQUAL compareReal (0.17014117E39, 0.17014117E39) = EQUAL compare (0.17014117E39, 0.123E4) = GREATER compareReal (0.17014117E39, 0.123E4) = GREATER compare (0.17014117E39, 0.123E2) = GREATER compareReal (0.17014117E39, 0.123E2) = GREATER compare (0.17014117E39, 0.31415927E1) = GREATER compareReal (0.17014117E39, 0.31415927E1) = GREATER compare (0.17014117E39, 0.27182817E1) = GREATER compareReal (0.17014117E39, 0.27182817E1) = GREATER compare (0.17014117E39, 0.123E1) = GREATER compareReal (0.17014117E39, 0.123E1) = GREATER compare (0.17014117E39, 0.123) = GREATER compareReal (0.17014117E39, 0.123) = GREATER compare (0.17014117E39, 0.123E~2) = GREATER compareReal (0.17014117E39, 0.123E~2) = GREATER compare (0.17014117E39, 0.11754944E~37) = GREATER compareReal (0.17014117E39, 0.11754944E~37) = GREATER compare (0.17014117E39, 0.5877472E~38) = GREATER compareReal (0.17014117E39, 0.5877472E~38) = GREATER compare (0.17014117E39, 0.1E~44) = GREATER compareReal (0.17014117E39, 0.1E~44) = GREATER compare (0.17014117E39, 0.0) = GREATER compareReal (0.17014117E39, 0.0) = GREATER compare (0.17014117E39, ~0.34028235E39) = GREATER compareReal (0.17014117E39, ~0.34028235E39) = GREATER compare (0.17014117E39, ~0.17014117E39) = GREATER compareReal (0.17014117E39, ~0.17014117E39) = GREATER compare (0.17014117E39, ~0.123E4) = GREATER compareReal (0.17014117E39, ~0.123E4) = GREATER compare (0.17014117E39, ~0.123E2) = GREATER compareReal (0.17014117E39, ~0.123E2) = GREATER compare (0.17014117E39, ~0.31415927E1) = GREATER compareReal (0.17014117E39, ~0.31415927E1) = GREATER compare (0.17014117E39, ~0.27182817E1) = GREATER compareReal (0.17014117E39, ~0.27182817E1) = GREATER compare (0.17014117E39, ~0.123E1) = GREATER compareReal (0.17014117E39, ~0.123E1) = GREATER compare (0.17014117E39, ~0.123) = GREATER compareReal (0.17014117E39, ~0.123) = GREATER compare (0.17014117E39, ~0.123E~2) = GREATER compareReal (0.17014117E39, ~0.123E~2) = GREATER compare (0.17014117E39, ~0.11754944E~37) = GREATER compareReal (0.17014117E39, ~0.11754944E~37) = GREATER compare (0.17014117E39, ~0.5877472E~38) = GREATER compareReal (0.17014117E39, ~0.5877472E~38) = GREATER compare (0.17014117E39, ~0.1E~44) = GREATER compareReal (0.17014117E39, ~0.1E~44) = GREATER compare (0.17014117E39, ~0.0) = GREATER compareReal (0.17014117E39, ~0.0) = GREATER compare (0.123E4, 0.34028235E39) = LESS compareReal (0.123E4, 0.34028235E39) = LESS compare (0.123E4, 0.17014117E39) = LESS compareReal (0.123E4, 0.17014117E39) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.31415927E1) = GREATER compareReal (0.123E4, 0.31415927E1) = GREATER compare (0.123E4, 0.27182817E1) = GREATER compareReal (0.123E4, 0.27182817E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.11754944E~37) = GREATER compareReal (0.123E4, 0.11754944E~37) = GREATER compare (0.123E4, 0.5877472E~38) = GREATER compareReal (0.123E4, 0.5877472E~38) = GREATER compare (0.123E4, 0.1E~44) = GREATER compareReal (0.123E4, 0.1E~44) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.34028235E39) = GREATER compareReal (0.123E4, ~0.34028235E39) = GREATER compare (0.123E4, ~0.17014117E39) = GREATER compareReal (0.123E4, ~0.17014117E39) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.31415927E1) = GREATER compareReal (0.123E4, ~0.31415927E1) = GREATER compare (0.123E4, ~0.27182817E1) = GREATER compareReal (0.123E4, ~0.27182817E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.11754944E~37) = GREATER compareReal (0.123E4, ~0.11754944E~37) = GREATER compare (0.123E4, ~0.5877472E~38) = GREATER compareReal (0.123E4, ~0.5877472E~38) = GREATER compare (0.123E4, ~0.1E~44) = GREATER compareReal (0.123E4, ~0.1E~44) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.34028235E39) = LESS compareReal (0.123E2, 0.34028235E39) = LESS compare (0.123E2, 0.17014117E39) = LESS compareReal (0.123E2, 0.17014117E39) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.31415927E1) = GREATER compareReal (0.123E2, 0.31415927E1) = GREATER compare (0.123E2, 0.27182817E1) = GREATER compareReal (0.123E2, 0.27182817E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.11754944E~37) = GREATER compareReal (0.123E2, 0.11754944E~37) = GREATER compare (0.123E2, 0.5877472E~38) = GREATER compareReal (0.123E2, 0.5877472E~38) = GREATER compare (0.123E2, 0.1E~44) = GREATER compareReal (0.123E2, 0.1E~44) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.34028235E39) = GREATER compareReal (0.123E2, ~0.34028235E39) = GREATER compare (0.123E2, ~0.17014117E39) = GREATER compareReal (0.123E2, ~0.17014117E39) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.31415927E1) = GREATER compareReal (0.123E2, ~0.31415927E1) = GREATER compare (0.123E2, ~0.27182817E1) = GREATER compareReal (0.123E2, ~0.27182817E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.11754944E~37) = GREATER compareReal (0.123E2, ~0.11754944E~37) = GREATER compare (0.123E2, ~0.5877472E~38) = GREATER compareReal (0.123E2, ~0.5877472E~38) = GREATER compare (0.123E2, ~0.1E~44) = GREATER compareReal (0.123E2, ~0.1E~44) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.31415927E1, 0.34028235E39) = LESS compareReal (0.31415927E1, 0.34028235E39) = LESS compare (0.31415927E1, 0.17014117E39) = LESS compareReal (0.31415927E1, 0.17014117E39) = LESS compare (0.31415927E1, 0.123E4) = LESS compareReal (0.31415927E1, 0.123E4) = LESS compare (0.31415927E1, 0.123E2) = LESS compareReal (0.31415927E1, 0.123E2) = LESS compare (0.31415927E1, 0.31415927E1) = EQUAL compareReal (0.31415927E1, 0.31415927E1) = EQUAL compare (0.31415927E1, 0.27182817E1) = GREATER compareReal (0.31415927E1, 0.27182817E1) = GREATER compare (0.31415927E1, 0.123E1) = GREATER compareReal (0.31415927E1, 0.123E1) = GREATER compare (0.31415927E1, 0.123) = GREATER compareReal (0.31415927E1, 0.123) = GREATER compare (0.31415927E1, 0.123E~2) = GREATER compareReal (0.31415927E1, 0.123E~2) = GREATER compare (0.31415927E1, 0.11754944E~37) = GREATER compareReal (0.31415927E1, 0.11754944E~37) = GREATER compare (0.31415927E1, 0.5877472E~38) = GREATER compareReal (0.31415927E1, 0.5877472E~38) = GREATER compare (0.31415927E1, 0.1E~44) = GREATER compareReal (0.31415927E1, 0.1E~44) = GREATER compare (0.31415927E1, 0.0) = GREATER compareReal (0.31415927E1, 0.0) = GREATER compare (0.31415927E1, ~0.34028235E39) = GREATER compareReal (0.31415927E1, ~0.34028235E39) = GREATER compare (0.31415927E1, ~0.17014117E39) = GREATER compareReal (0.31415927E1, ~0.17014117E39) = GREATER compare (0.31415927E1, ~0.123E4) = GREATER compareReal (0.31415927E1, ~0.123E4) = GREATER compare (0.31415927E1, ~0.123E2) = GREATER compareReal (0.31415927E1, ~0.123E2) = GREATER compare (0.31415927E1, ~0.31415927E1) = GREATER compareReal (0.31415927E1, ~0.31415927E1) = GREATER compare (0.31415927E1, ~0.27182817E1) = GREATER compareReal (0.31415927E1, ~0.27182817E1) = GREATER compare (0.31415927E1, ~0.123E1) = GREATER compareReal (0.31415927E1, ~0.123E1) = GREATER compare (0.31415927E1, ~0.123) = GREATER compareReal (0.31415927E1, ~0.123) = GREATER compare (0.31415927E1, ~0.123E~2) = GREATER compareReal (0.31415927E1, ~0.123E~2) = GREATER compare (0.31415927E1, ~0.11754944E~37) = GREATER compareReal (0.31415927E1, ~0.11754944E~37) = GREATER compare (0.31415927E1, ~0.5877472E~38) = GREATER compareReal (0.31415927E1, ~0.5877472E~38) = GREATER compare (0.31415927E1, ~0.1E~44) = GREATER compareReal (0.31415927E1, ~0.1E~44) = GREATER compare (0.31415927E1, ~0.0) = GREATER compareReal (0.31415927E1, ~0.0) = GREATER compare (0.27182817E1, 0.34028235E39) = LESS compareReal (0.27182817E1, 0.34028235E39) = LESS compare (0.27182817E1, 0.17014117E39) = LESS compareReal (0.27182817E1, 0.17014117E39) = LESS compare (0.27182817E1, 0.123E4) = LESS compareReal (0.27182817E1, 0.123E4) = LESS compare (0.27182817E1, 0.123E2) = LESS compareReal (0.27182817E1, 0.123E2) = LESS compare (0.27182817E1, 0.31415927E1) = LESS compareReal (0.27182817E1, 0.31415927E1) = LESS compare (0.27182817E1, 0.27182817E1) = EQUAL compareReal (0.27182817E1, 0.27182817E1) = EQUAL compare (0.27182817E1, 0.123E1) = GREATER compareReal (0.27182817E1, 0.123E1) = GREATER compare (0.27182817E1, 0.123) = GREATER compareReal (0.27182817E1, 0.123) = GREATER compare (0.27182817E1, 0.123E~2) = GREATER compareReal (0.27182817E1, 0.123E~2) = GREATER compare (0.27182817E1, 0.11754944E~37) = GREATER compareReal (0.27182817E1, 0.11754944E~37) = GREATER compare (0.27182817E1, 0.5877472E~38) = GREATER compareReal (0.27182817E1, 0.5877472E~38) = GREATER compare (0.27182817E1, 0.1E~44) = GREATER compareReal (0.27182817E1, 0.1E~44) = GREATER compare (0.27182817E1, 0.0) = GREATER compareReal (0.27182817E1, 0.0) = GREATER compare (0.27182817E1, ~0.34028235E39) = GREATER compareReal (0.27182817E1, ~0.34028235E39) = GREATER compare (0.27182817E1, ~0.17014117E39) = GREATER compareReal (0.27182817E1, ~0.17014117E39) = GREATER compare (0.27182817E1, ~0.123E4) = GREATER compareReal (0.27182817E1, ~0.123E4) = GREATER compare (0.27182817E1, ~0.123E2) = GREATER compareReal (0.27182817E1, ~0.123E2) = GREATER compare (0.27182817E1, ~0.31415927E1) = GREATER compareReal (0.27182817E1, ~0.31415927E1) = GREATER compare (0.27182817E1, ~0.27182817E1) = GREATER compareReal (0.27182817E1, ~0.27182817E1) = GREATER compare (0.27182817E1, ~0.123E1) = GREATER compareReal (0.27182817E1, ~0.123E1) = GREATER compare (0.27182817E1, ~0.123) = GREATER compareReal (0.27182817E1, ~0.123) = GREATER compare (0.27182817E1, ~0.123E~2) = GREATER compareReal (0.27182817E1, ~0.123E~2) = GREATER compare (0.27182817E1, ~0.11754944E~37) = GREATER compareReal (0.27182817E1, ~0.11754944E~37) = GREATER compare (0.27182817E1, ~0.5877472E~38) = GREATER compareReal (0.27182817E1, ~0.5877472E~38) = GREATER compare (0.27182817E1, ~0.1E~44) = GREATER compareReal (0.27182817E1, ~0.1E~44) = GREATER compare (0.27182817E1, ~0.0) = GREATER compareReal (0.27182817E1, ~0.0) = GREATER compare (0.123E1, 0.34028235E39) = LESS compareReal (0.123E1, 0.34028235E39) = LESS compare (0.123E1, 0.17014117E39) = LESS compareReal (0.123E1, 0.17014117E39) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.31415927E1) = LESS compareReal (0.123E1, 0.31415927E1) = LESS compare (0.123E1, 0.27182817E1) = LESS compareReal (0.123E1, 0.27182817E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.11754944E~37) = GREATER compareReal (0.123E1, 0.11754944E~37) = GREATER compare (0.123E1, 0.5877472E~38) = GREATER compareReal (0.123E1, 0.5877472E~38) = GREATER compare (0.123E1, 0.1E~44) = GREATER compareReal (0.123E1, 0.1E~44) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.34028235E39) = GREATER compareReal (0.123E1, ~0.34028235E39) = GREATER compare (0.123E1, ~0.17014117E39) = GREATER compareReal (0.123E1, ~0.17014117E39) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.31415927E1) = GREATER compareReal (0.123E1, ~0.31415927E1) = GREATER compare (0.123E1, ~0.27182817E1) = GREATER compareReal (0.123E1, ~0.27182817E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.11754944E~37) = GREATER compareReal (0.123E1, ~0.11754944E~37) = GREATER compare (0.123E1, ~0.5877472E~38) = GREATER compareReal (0.123E1, ~0.5877472E~38) = GREATER compare (0.123E1, ~0.1E~44) = GREATER compareReal (0.123E1, ~0.1E~44) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.34028235E39) = LESS compareReal (0.123, 0.34028235E39) = LESS compare (0.123, 0.17014117E39) = LESS compareReal (0.123, 0.17014117E39) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.31415927E1) = LESS compareReal (0.123, 0.31415927E1) = LESS compare (0.123, 0.27182817E1) = LESS compareReal (0.123, 0.27182817E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.11754944E~37) = GREATER compareReal (0.123, 0.11754944E~37) = GREATER compare (0.123, 0.5877472E~38) = GREATER compareReal (0.123, 0.5877472E~38) = GREATER compare (0.123, 0.1E~44) = GREATER compareReal (0.123, 0.1E~44) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.34028235E39) = GREATER compareReal (0.123, ~0.34028235E39) = GREATER compare (0.123, ~0.17014117E39) = GREATER compareReal (0.123, ~0.17014117E39) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.31415927E1) = GREATER compareReal (0.123, ~0.31415927E1) = GREATER compare (0.123, ~0.27182817E1) = GREATER compareReal (0.123, ~0.27182817E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.11754944E~37) = GREATER compareReal (0.123, ~0.11754944E~37) = GREATER compare (0.123, ~0.5877472E~38) = GREATER compareReal (0.123, ~0.5877472E~38) = GREATER compare (0.123, ~0.1E~44) = GREATER compareReal (0.123, ~0.1E~44) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.34028235E39) = LESS compareReal (0.123E~2, 0.34028235E39) = LESS compare (0.123E~2, 0.17014117E39) = LESS compareReal (0.123E~2, 0.17014117E39) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.31415927E1) = LESS compareReal (0.123E~2, 0.31415927E1) = LESS compare (0.123E~2, 0.27182817E1) = LESS compareReal (0.123E~2, 0.27182817E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.11754944E~37) = GREATER compareReal (0.123E~2, 0.11754944E~37) = GREATER compare (0.123E~2, 0.5877472E~38) = GREATER compareReal (0.123E~2, 0.5877472E~38) = GREATER compare (0.123E~2, 0.1E~44) = GREATER compareReal (0.123E~2, 0.1E~44) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.34028235E39) = GREATER compareReal (0.123E~2, ~0.34028235E39) = GREATER compare (0.123E~2, ~0.17014117E39) = GREATER compareReal (0.123E~2, ~0.17014117E39) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.31415927E1) = GREATER compareReal (0.123E~2, ~0.31415927E1) = GREATER compare (0.123E~2, ~0.27182817E1) = GREATER compareReal (0.123E~2, ~0.27182817E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.11754944E~37) = GREATER compareReal (0.123E~2, ~0.11754944E~37) = GREATER compare (0.123E~2, ~0.5877472E~38) = GREATER compareReal (0.123E~2, ~0.5877472E~38) = GREATER compare (0.123E~2, ~0.1E~44) = GREATER compareReal (0.123E~2, ~0.1E~44) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.11754944E~37, 0.34028235E39) = LESS compareReal (0.11754944E~37, 0.34028235E39) = LESS compare (0.11754944E~37, 0.17014117E39) = LESS compareReal (0.11754944E~37, 0.17014117E39) = LESS compare (0.11754944E~37, 0.123E4) = LESS compareReal (0.11754944E~37, 0.123E4) = LESS compare (0.11754944E~37, 0.123E2) = LESS compareReal (0.11754944E~37, 0.123E2) = LESS compare (0.11754944E~37, 0.31415927E1) = LESS compareReal (0.11754944E~37, 0.31415927E1) = LESS compare (0.11754944E~37, 0.27182817E1) = LESS compareReal (0.11754944E~37, 0.27182817E1) = LESS compare (0.11754944E~37, 0.123E1) = LESS compareReal (0.11754944E~37, 0.123E1) = LESS compare (0.11754944E~37, 0.123) = LESS compareReal (0.11754944E~37, 0.123) = LESS compare (0.11754944E~37, 0.123E~2) = LESS compareReal (0.11754944E~37, 0.123E~2) = LESS compare (0.11754944E~37, 0.11754944E~37) = EQUAL compareReal (0.11754944E~37, 0.11754944E~37) = EQUAL compare (0.11754944E~37, 0.5877472E~38) = GREATER compareReal (0.11754944E~37, 0.5877472E~38) = GREATER compare (0.11754944E~37, 0.1E~44) = GREATER compareReal (0.11754944E~37, 0.1E~44) = GREATER compare (0.11754944E~37, 0.0) = GREATER compareReal (0.11754944E~37, 0.0) = GREATER compare (0.11754944E~37, ~0.34028235E39) = GREATER compareReal (0.11754944E~37, ~0.34028235E39) = GREATER compare (0.11754944E~37, ~0.17014117E39) = GREATER compareReal (0.11754944E~37, ~0.17014117E39) = GREATER compare (0.11754944E~37, ~0.123E4) = GREATER compareReal (0.11754944E~37, ~0.123E4) = GREATER compare (0.11754944E~37, ~0.123E2) = GREATER compareReal (0.11754944E~37, ~0.123E2) = GREATER compare (0.11754944E~37, ~0.31415927E1) = GREATER compareReal (0.11754944E~37, ~0.31415927E1) = GREATER compare (0.11754944E~37, ~0.27182817E1) = GREATER compareReal (0.11754944E~37, ~0.27182817E1) = GREATER compare (0.11754944E~37, ~0.123E1) = GREATER compareReal (0.11754944E~37, ~0.123E1) = GREATER compare (0.11754944E~37, ~0.123) = GREATER compareReal (0.11754944E~37, ~0.123) = GREATER compare (0.11754944E~37, ~0.123E~2) = GREATER compareReal (0.11754944E~37, ~0.123E~2) = GREATER compare (0.11754944E~37, ~0.11754944E~37) = GREATER compareReal (0.11754944E~37, ~0.11754944E~37) = GREATER compare (0.11754944E~37, ~0.5877472E~38) = GREATER compareReal (0.11754944E~37, ~0.5877472E~38) = GREATER compare (0.11754944E~37, ~0.1E~44) = GREATER compareReal (0.11754944E~37, ~0.1E~44) = GREATER compare (0.11754944E~37, ~0.0) = GREATER compareReal (0.11754944E~37, ~0.0) = GREATER compare (0.5877472E~38, 0.34028235E39) = LESS compareReal (0.5877472E~38, 0.34028235E39) = LESS compare (0.5877472E~38, 0.17014117E39) = LESS compareReal (0.5877472E~38, 0.17014117E39) = LESS compare (0.5877472E~38, 0.123E4) = LESS compareReal (0.5877472E~38, 0.123E4) = LESS compare (0.5877472E~38, 0.123E2) = LESS compareReal (0.5877472E~38, 0.123E2) = LESS compare (0.5877472E~38, 0.31415927E1) = LESS compareReal (0.5877472E~38, 0.31415927E1) = LESS compare (0.5877472E~38, 0.27182817E1) = LESS compareReal (0.5877472E~38, 0.27182817E1) = LESS compare (0.5877472E~38, 0.123E1) = LESS compareReal (0.5877472E~38, 0.123E1) = LESS compare (0.5877472E~38, 0.123) = LESS compareReal (0.5877472E~38, 0.123) = LESS compare (0.5877472E~38, 0.123E~2) = LESS compareReal (0.5877472E~38, 0.123E~2) = LESS compare (0.5877472E~38, 0.11754944E~37) = LESS compareReal (0.5877472E~38, 0.11754944E~37) = LESS compare (0.5877472E~38, 0.5877472E~38) = EQUAL compareReal (0.5877472E~38, 0.5877472E~38) = EQUAL compare (0.5877472E~38, 0.1E~44) = GREATER compareReal (0.5877472E~38, 0.1E~44) = GREATER compare (0.5877472E~38, 0.0) = GREATER compareReal (0.5877472E~38, 0.0) = GREATER compare (0.5877472E~38, ~0.34028235E39) = GREATER compareReal (0.5877472E~38, ~0.34028235E39) = GREATER compare (0.5877472E~38, ~0.17014117E39) = GREATER compareReal (0.5877472E~38, ~0.17014117E39) = GREATER compare (0.5877472E~38, ~0.123E4) = GREATER compareReal (0.5877472E~38, ~0.123E4) = GREATER compare (0.5877472E~38, ~0.123E2) = GREATER compareReal (0.5877472E~38, ~0.123E2) = GREATER compare (0.5877472E~38, ~0.31415927E1) = GREATER compareReal (0.5877472E~38, ~0.31415927E1) = GREATER compare (0.5877472E~38, ~0.27182817E1) = GREATER compareReal (0.5877472E~38, ~0.27182817E1) = GREATER compare (0.5877472E~38, ~0.123E1) = GREATER compareReal (0.5877472E~38, ~0.123E1) = GREATER compare (0.5877472E~38, ~0.123) = GREATER compareReal (0.5877472E~38, ~0.123) = GREATER compare (0.5877472E~38, ~0.123E~2) = GREATER compareReal (0.5877472E~38, ~0.123E~2) = GREATER compare (0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (0.5877472E~38, ~0.11754944E~37) = GREATER compare (0.5877472E~38, ~0.5877472E~38) = GREATER compareReal (0.5877472E~38, ~0.5877472E~38) = GREATER compare (0.5877472E~38, ~0.1E~44) = GREATER compareReal (0.5877472E~38, ~0.1E~44) = GREATER compare (0.5877472E~38, ~0.0) = GREATER compareReal (0.5877472E~38, ~0.0) = GREATER compare (0.1E~44, 0.34028235E39) = LESS compareReal (0.1E~44, 0.34028235E39) = LESS compare (0.1E~44, 0.17014117E39) = LESS compareReal (0.1E~44, 0.17014117E39) = LESS compare (0.1E~44, 0.123E4) = LESS compareReal (0.1E~44, 0.123E4) = LESS compare (0.1E~44, 0.123E2) = LESS compareReal (0.1E~44, 0.123E2) = LESS compare (0.1E~44, 0.31415927E1) = LESS compareReal (0.1E~44, 0.31415927E1) = LESS compare (0.1E~44, 0.27182817E1) = LESS compareReal (0.1E~44, 0.27182817E1) = LESS compare (0.1E~44, 0.123E1) = LESS compareReal (0.1E~44, 0.123E1) = LESS compare (0.1E~44, 0.123) = LESS compareReal (0.1E~44, 0.123) = LESS compare (0.1E~44, 0.123E~2) = LESS compareReal (0.1E~44, 0.123E~2) = LESS compare (0.1E~44, 0.11754944E~37) = LESS compareReal (0.1E~44, 0.11754944E~37) = LESS compare (0.1E~44, 0.5877472E~38) = LESS compareReal (0.1E~44, 0.5877472E~38) = LESS compare (0.1E~44, 0.1E~44) = EQUAL compareReal (0.1E~44, 0.1E~44) = EQUAL compare (0.1E~44, 0.0) = GREATER compareReal (0.1E~44, 0.0) = GREATER compare (0.1E~44, ~0.34028235E39) = GREATER compareReal (0.1E~44, ~0.34028235E39) = GREATER compare (0.1E~44, ~0.17014117E39) = GREATER compareReal (0.1E~44, ~0.17014117E39) = GREATER compare (0.1E~44, ~0.123E4) = GREATER compareReal (0.1E~44, ~0.123E4) = GREATER compare (0.1E~44, ~0.123E2) = GREATER compareReal (0.1E~44, ~0.123E2) = GREATER compare (0.1E~44, ~0.31415927E1) = GREATER compareReal (0.1E~44, ~0.31415927E1) = GREATER compare (0.1E~44, ~0.27182817E1) = GREATER compareReal (0.1E~44, ~0.27182817E1) = GREATER compare (0.1E~44, ~0.123E1) = GREATER compareReal (0.1E~44, ~0.123E1) = GREATER compare (0.1E~44, ~0.123) = GREATER compareReal (0.1E~44, ~0.123) = GREATER compare (0.1E~44, ~0.123E~2) = GREATER compareReal (0.1E~44, ~0.123E~2) = GREATER compare (0.1E~44, ~0.11754944E~37) = GREATER compareReal (0.1E~44, ~0.11754944E~37) = GREATER compare (0.1E~44, ~0.5877472E~38) = GREATER compareReal (0.1E~44, ~0.5877472E~38) = GREATER compare (0.1E~44, ~0.1E~44) = GREATER compareReal (0.1E~44, ~0.1E~44) = GREATER compare (0.1E~44, ~0.0) = GREATER compareReal (0.1E~44, ~0.0) = GREATER compare (0.0, 0.34028235E39) = LESS compareReal (0.0, 0.34028235E39) = LESS compare (0.0, 0.17014117E39) = LESS compareReal (0.0, 0.17014117E39) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.31415927E1) = LESS compareReal (0.0, 0.31415927E1) = LESS compare (0.0, 0.27182817E1) = LESS compareReal (0.0, 0.27182817E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.11754944E~37) = LESS compareReal (0.0, 0.11754944E~37) = LESS compare (0.0, 0.5877472E~38) = LESS compareReal (0.0, 0.5877472E~38) = LESS compare (0.0, 0.1E~44) = LESS compareReal (0.0, 0.1E~44) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.34028235E39) = GREATER compareReal (0.0, ~0.34028235E39) = GREATER compare (0.0, ~0.17014117E39) = GREATER compareReal (0.0, ~0.17014117E39) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.31415927E1) = GREATER compareReal (0.0, ~0.31415927E1) = GREATER compare (0.0, ~0.27182817E1) = GREATER compareReal (0.0, ~0.27182817E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.11754944E~37) = GREATER compareReal (0.0, ~0.11754944E~37) = GREATER compare (0.0, ~0.5877472E~38) = GREATER compareReal (0.0, ~0.5877472E~38) = GREATER compare (0.0, ~0.1E~44) = GREATER compareReal (0.0, ~0.1E~44) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.34028235E39, 0.34028235E39) = LESS compareReal (~0.34028235E39, 0.34028235E39) = LESS compare (~0.34028235E39, 0.17014117E39) = LESS compareReal (~0.34028235E39, 0.17014117E39) = LESS compare (~0.34028235E39, 0.123E4) = LESS compareReal (~0.34028235E39, 0.123E4) = LESS compare (~0.34028235E39, 0.123E2) = LESS compareReal (~0.34028235E39, 0.123E2) = LESS compare (~0.34028235E39, 0.31415927E1) = LESS compareReal (~0.34028235E39, 0.31415927E1) = LESS compare (~0.34028235E39, 0.27182817E1) = LESS compareReal (~0.34028235E39, 0.27182817E1) = LESS compare (~0.34028235E39, 0.123E1) = LESS compareReal (~0.34028235E39, 0.123E1) = LESS compare (~0.34028235E39, 0.123) = LESS compareReal (~0.34028235E39, 0.123) = LESS compare (~0.34028235E39, 0.123E~2) = LESS compareReal (~0.34028235E39, 0.123E~2) = LESS compare (~0.34028235E39, 0.11754944E~37) = LESS compareReal (~0.34028235E39, 0.11754944E~37) = LESS compare (~0.34028235E39, 0.5877472E~38) = LESS compareReal (~0.34028235E39, 0.5877472E~38) = LESS compare (~0.34028235E39, 0.1E~44) = LESS compareReal (~0.34028235E39, 0.1E~44) = LESS compare (~0.34028235E39, 0.0) = LESS compareReal (~0.34028235E39, 0.0) = LESS compare (~0.34028235E39, ~0.34028235E39) = EQUAL compareReal (~0.34028235E39, ~0.34028235E39) = EQUAL compare (~0.34028235E39, ~0.17014117E39) = LESS compareReal (~0.34028235E39, ~0.17014117E39) = LESS compare (~0.34028235E39, ~0.123E4) = LESS compareReal (~0.34028235E39, ~0.123E4) = LESS compare (~0.34028235E39, ~0.123E2) = LESS compareReal (~0.34028235E39, ~0.123E2) = LESS compare (~0.34028235E39, ~0.31415927E1) = LESS compareReal (~0.34028235E39, ~0.31415927E1) = LESS compare (~0.34028235E39, ~0.27182817E1) = LESS compareReal (~0.34028235E39, ~0.27182817E1) = LESS compare (~0.34028235E39, ~0.123E1) = LESS compareReal (~0.34028235E39, ~0.123E1) = LESS compare (~0.34028235E39, ~0.123) = LESS compareReal (~0.34028235E39, ~0.123) = LESS compare (~0.34028235E39, ~0.123E~2) = LESS compareReal (~0.34028235E39, ~0.123E~2) = LESS compare (~0.34028235E39, ~0.11754944E~37) = LESS compareReal (~0.34028235E39, ~0.11754944E~37) = LESS compare (~0.34028235E39, ~0.5877472E~38) = LESS compareReal (~0.34028235E39, ~0.5877472E~38) = LESS compare (~0.34028235E39, ~0.1E~44) = LESS compareReal (~0.34028235E39, ~0.1E~44) = LESS compare (~0.34028235E39, ~0.0) = LESS compareReal (~0.34028235E39, ~0.0) = LESS compare (~0.17014117E39, 0.34028235E39) = LESS compareReal (~0.17014117E39, 0.34028235E39) = LESS compare (~0.17014117E39, 0.17014117E39) = LESS compareReal (~0.17014117E39, 0.17014117E39) = LESS compare (~0.17014117E39, 0.123E4) = LESS compareReal (~0.17014117E39, 0.123E4) = LESS compare (~0.17014117E39, 0.123E2) = LESS compareReal (~0.17014117E39, 0.123E2) = LESS compare (~0.17014117E39, 0.31415927E1) = LESS compareReal (~0.17014117E39, 0.31415927E1) = LESS compare (~0.17014117E39, 0.27182817E1) = LESS compareReal (~0.17014117E39, 0.27182817E1) = LESS compare (~0.17014117E39, 0.123E1) = LESS compareReal (~0.17014117E39, 0.123E1) = LESS compare (~0.17014117E39, 0.123) = LESS compareReal (~0.17014117E39, 0.123) = LESS compare (~0.17014117E39, 0.123E~2) = LESS compareReal (~0.17014117E39, 0.123E~2) = LESS compare (~0.17014117E39, 0.11754944E~37) = LESS compareReal (~0.17014117E39, 0.11754944E~37) = LESS compare (~0.17014117E39, 0.5877472E~38) = LESS compareReal (~0.17014117E39, 0.5877472E~38) = LESS compare (~0.17014117E39, 0.1E~44) = LESS compareReal (~0.17014117E39, 0.1E~44) = LESS compare (~0.17014117E39, 0.0) = LESS compareReal (~0.17014117E39, 0.0) = LESS compare (~0.17014117E39, ~0.34028235E39) = GREATER compareReal (~0.17014117E39, ~0.34028235E39) = GREATER compare (~0.17014117E39, ~0.17014117E39) = EQUAL compareReal (~0.17014117E39, ~0.17014117E39) = EQUAL compare (~0.17014117E39, ~0.123E4) = LESS compareReal (~0.17014117E39, ~0.123E4) = LESS compare (~0.17014117E39, ~0.123E2) = LESS compareReal (~0.17014117E39, ~0.123E2) = LESS compare (~0.17014117E39, ~0.31415927E1) = LESS compareReal (~0.17014117E39, ~0.31415927E1) = LESS compare (~0.17014117E39, ~0.27182817E1) = LESS compareReal (~0.17014117E39, ~0.27182817E1) = LESS compare (~0.17014117E39, ~0.123E1) = LESS compareReal (~0.17014117E39, ~0.123E1) = LESS compare (~0.17014117E39, ~0.123) = LESS compareReal (~0.17014117E39, ~0.123) = LESS compare (~0.17014117E39, ~0.123E~2) = LESS compareReal (~0.17014117E39, ~0.123E~2) = LESS compare (~0.17014117E39, ~0.11754944E~37) = LESS compareReal (~0.17014117E39, ~0.11754944E~37) = LESS compare (~0.17014117E39, ~0.5877472E~38) = LESS compareReal (~0.17014117E39, ~0.5877472E~38) = LESS compare (~0.17014117E39, ~0.1E~44) = LESS compareReal (~0.17014117E39, ~0.1E~44) = LESS compare (~0.17014117E39, ~0.0) = LESS compareReal (~0.17014117E39, ~0.0) = LESS compare (~0.123E4, 0.34028235E39) = LESS compareReal (~0.123E4, 0.34028235E39) = LESS compare (~0.123E4, 0.17014117E39) = LESS compareReal (~0.123E4, 0.17014117E39) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.31415927E1) = LESS compareReal (~0.123E4, 0.31415927E1) = LESS compare (~0.123E4, 0.27182817E1) = LESS compareReal (~0.123E4, 0.27182817E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.11754944E~37) = LESS compareReal (~0.123E4, 0.11754944E~37) = LESS compare (~0.123E4, 0.5877472E~38) = LESS compareReal (~0.123E4, 0.5877472E~38) = LESS compare (~0.123E4, 0.1E~44) = LESS compareReal (~0.123E4, 0.1E~44) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.34028235E39) = GREATER compareReal (~0.123E4, ~0.34028235E39) = GREATER compare (~0.123E4, ~0.17014117E39) = GREATER compareReal (~0.123E4, ~0.17014117E39) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.31415927E1) = LESS compareReal (~0.123E4, ~0.31415927E1) = LESS compare (~0.123E4, ~0.27182817E1) = LESS compareReal (~0.123E4, ~0.27182817E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.11754944E~37) = LESS compareReal (~0.123E4, ~0.11754944E~37) = LESS compare (~0.123E4, ~0.5877472E~38) = LESS compareReal (~0.123E4, ~0.5877472E~38) = LESS compare (~0.123E4, ~0.1E~44) = LESS compareReal (~0.123E4, ~0.1E~44) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.34028235E39) = LESS compareReal (~0.123E2, 0.34028235E39) = LESS compare (~0.123E2, 0.17014117E39) = LESS compareReal (~0.123E2, 0.17014117E39) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.31415927E1) = LESS compareReal (~0.123E2, 0.31415927E1) = LESS compare (~0.123E2, 0.27182817E1) = LESS compareReal (~0.123E2, 0.27182817E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.11754944E~37) = LESS compareReal (~0.123E2, 0.11754944E~37) = LESS compare (~0.123E2, 0.5877472E~38) = LESS compareReal (~0.123E2, 0.5877472E~38) = LESS compare (~0.123E2, 0.1E~44) = LESS compareReal (~0.123E2, 0.1E~44) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.34028235E39) = GREATER compareReal (~0.123E2, ~0.34028235E39) = GREATER compare (~0.123E2, ~0.17014117E39) = GREATER compareReal (~0.123E2, ~0.17014117E39) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.31415927E1) = LESS compareReal (~0.123E2, ~0.31415927E1) = LESS compare (~0.123E2, ~0.27182817E1) = LESS compareReal (~0.123E2, ~0.27182817E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.11754944E~37) = LESS compareReal (~0.123E2, ~0.11754944E~37) = LESS compare (~0.123E2, ~0.5877472E~38) = LESS compareReal (~0.123E2, ~0.5877472E~38) = LESS compare (~0.123E2, ~0.1E~44) = LESS compareReal (~0.123E2, ~0.1E~44) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.31415927E1, 0.34028235E39) = LESS compareReal (~0.31415927E1, 0.34028235E39) = LESS compare (~0.31415927E1, 0.17014117E39) = LESS compareReal (~0.31415927E1, 0.17014117E39) = LESS compare (~0.31415927E1, 0.123E4) = LESS compareReal (~0.31415927E1, 0.123E4) = LESS compare (~0.31415927E1, 0.123E2) = LESS compareReal (~0.31415927E1, 0.123E2) = LESS compare (~0.31415927E1, 0.31415927E1) = LESS compareReal (~0.31415927E1, 0.31415927E1) = LESS compare (~0.31415927E1, 0.27182817E1) = LESS compareReal (~0.31415927E1, 0.27182817E1) = LESS compare (~0.31415927E1, 0.123E1) = LESS compareReal (~0.31415927E1, 0.123E1) = LESS compare (~0.31415927E1, 0.123) = LESS compareReal (~0.31415927E1, 0.123) = LESS compare (~0.31415927E1, 0.123E~2) = LESS compareReal (~0.31415927E1, 0.123E~2) = LESS compare (~0.31415927E1, 0.11754944E~37) = LESS compareReal (~0.31415927E1, 0.11754944E~37) = LESS compare (~0.31415927E1, 0.5877472E~38) = LESS compareReal (~0.31415927E1, 0.5877472E~38) = LESS compare (~0.31415927E1, 0.1E~44) = LESS compareReal (~0.31415927E1, 0.1E~44) = LESS compare (~0.31415927E1, 0.0) = LESS compareReal (~0.31415927E1, 0.0) = LESS compare (~0.31415927E1, ~0.34028235E39) = GREATER compareReal (~0.31415927E1, ~0.34028235E39) = GREATER compare (~0.31415927E1, ~0.17014117E39) = GREATER compareReal (~0.31415927E1, ~0.17014117E39) = GREATER compare (~0.31415927E1, ~0.123E4) = GREATER compareReal (~0.31415927E1, ~0.123E4) = GREATER compare (~0.31415927E1, ~0.123E2) = GREATER compareReal (~0.31415927E1, ~0.123E2) = GREATER compare (~0.31415927E1, ~0.31415927E1) = EQUAL compareReal (~0.31415927E1, ~0.31415927E1) = EQUAL compare (~0.31415927E1, ~0.27182817E1) = LESS compareReal (~0.31415927E1, ~0.27182817E1) = LESS compare (~0.31415927E1, ~0.123E1) = LESS compareReal (~0.31415927E1, ~0.123E1) = LESS compare (~0.31415927E1, ~0.123) = LESS compareReal (~0.31415927E1, ~0.123) = LESS compare (~0.31415927E1, ~0.123E~2) = LESS compareReal (~0.31415927E1, ~0.123E~2) = LESS compare (~0.31415927E1, ~0.11754944E~37) = LESS compareReal (~0.31415927E1, ~0.11754944E~37) = LESS compare (~0.31415927E1, ~0.5877472E~38) = LESS compareReal (~0.31415927E1, ~0.5877472E~38) = LESS compare (~0.31415927E1, ~0.1E~44) = LESS compareReal (~0.31415927E1, ~0.1E~44) = LESS compare (~0.31415927E1, ~0.0) = LESS compareReal (~0.31415927E1, ~0.0) = LESS compare (~0.27182817E1, 0.34028235E39) = LESS compareReal (~0.27182817E1, 0.34028235E39) = LESS compare (~0.27182817E1, 0.17014117E39) = LESS compareReal (~0.27182817E1, 0.17014117E39) = LESS compare (~0.27182817E1, 0.123E4) = LESS compareReal (~0.27182817E1, 0.123E4) = LESS compare (~0.27182817E1, 0.123E2) = LESS compareReal (~0.27182817E1, 0.123E2) = LESS compare (~0.27182817E1, 0.31415927E1) = LESS compareReal (~0.27182817E1, 0.31415927E1) = LESS compare (~0.27182817E1, 0.27182817E1) = LESS compareReal (~0.27182817E1, 0.27182817E1) = LESS compare (~0.27182817E1, 0.123E1) = LESS compareReal (~0.27182817E1, 0.123E1) = LESS compare (~0.27182817E1, 0.123) = LESS compareReal (~0.27182817E1, 0.123) = LESS compare (~0.27182817E1, 0.123E~2) = LESS compareReal (~0.27182817E1, 0.123E~2) = LESS compare (~0.27182817E1, 0.11754944E~37) = LESS compareReal (~0.27182817E1, 0.11754944E~37) = LESS compare (~0.27182817E1, 0.5877472E~38) = LESS compareReal (~0.27182817E1, 0.5877472E~38) = LESS compare (~0.27182817E1, 0.1E~44) = LESS compareReal (~0.27182817E1, 0.1E~44) = LESS compare (~0.27182817E1, 0.0) = LESS compareReal (~0.27182817E1, 0.0) = LESS compare (~0.27182817E1, ~0.34028235E39) = GREATER compareReal (~0.27182817E1, ~0.34028235E39) = GREATER compare (~0.27182817E1, ~0.17014117E39) = GREATER compareReal (~0.27182817E1, ~0.17014117E39) = GREATER compare (~0.27182817E1, ~0.123E4) = GREATER compareReal (~0.27182817E1, ~0.123E4) = GREATER compare (~0.27182817E1, ~0.123E2) = GREATER compareReal (~0.27182817E1, ~0.123E2) = GREATER compare (~0.27182817E1, ~0.31415927E1) = GREATER compareReal (~0.27182817E1, ~0.31415927E1) = GREATER compare (~0.27182817E1, ~0.27182817E1) = EQUAL compareReal (~0.27182817E1, ~0.27182817E1) = EQUAL compare (~0.27182817E1, ~0.123E1) = LESS compareReal (~0.27182817E1, ~0.123E1) = LESS compare (~0.27182817E1, ~0.123) = LESS compareReal (~0.27182817E1, ~0.123) = LESS compare (~0.27182817E1, ~0.123E~2) = LESS compareReal (~0.27182817E1, ~0.123E~2) = LESS compare (~0.27182817E1, ~0.11754944E~37) = LESS compareReal (~0.27182817E1, ~0.11754944E~37) = LESS compare (~0.27182817E1, ~0.5877472E~38) = LESS compareReal (~0.27182817E1, ~0.5877472E~38) = LESS compare (~0.27182817E1, ~0.1E~44) = LESS compareReal (~0.27182817E1, ~0.1E~44) = LESS compare (~0.27182817E1, ~0.0) = LESS compareReal (~0.27182817E1, ~0.0) = LESS compare (~0.123E1, 0.34028235E39) = LESS compareReal (~0.123E1, 0.34028235E39) = LESS compare (~0.123E1, 0.17014117E39) = LESS compareReal (~0.123E1, 0.17014117E39) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.31415927E1) = LESS compareReal (~0.123E1, 0.31415927E1) = LESS compare (~0.123E1, 0.27182817E1) = LESS compareReal (~0.123E1, 0.27182817E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.11754944E~37) = LESS compareReal (~0.123E1, 0.11754944E~37) = LESS compare (~0.123E1, 0.5877472E~38) = LESS compareReal (~0.123E1, 0.5877472E~38) = LESS compare (~0.123E1, 0.1E~44) = LESS compareReal (~0.123E1, 0.1E~44) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.34028235E39) = GREATER compareReal (~0.123E1, ~0.34028235E39) = GREATER compare (~0.123E1, ~0.17014117E39) = GREATER compareReal (~0.123E1, ~0.17014117E39) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.31415927E1) = GREATER compareReal (~0.123E1, ~0.31415927E1) = GREATER compare (~0.123E1, ~0.27182817E1) = GREATER compareReal (~0.123E1, ~0.27182817E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.11754944E~37) = LESS compareReal (~0.123E1, ~0.11754944E~37) = LESS compare (~0.123E1, ~0.5877472E~38) = LESS compareReal (~0.123E1, ~0.5877472E~38) = LESS compare (~0.123E1, ~0.1E~44) = LESS compareReal (~0.123E1, ~0.1E~44) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.34028235E39) = LESS compareReal (~0.123, 0.34028235E39) = LESS compare (~0.123, 0.17014117E39) = LESS compareReal (~0.123, 0.17014117E39) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.31415927E1) = LESS compareReal (~0.123, 0.31415927E1) = LESS compare (~0.123, 0.27182817E1) = LESS compareReal (~0.123, 0.27182817E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.11754944E~37) = LESS compareReal (~0.123, 0.11754944E~37) = LESS compare (~0.123, 0.5877472E~38) = LESS compareReal (~0.123, 0.5877472E~38) = LESS compare (~0.123, 0.1E~44) = LESS compareReal (~0.123, 0.1E~44) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.34028235E39) = GREATER compareReal (~0.123, ~0.34028235E39) = GREATER compare (~0.123, ~0.17014117E39) = GREATER compareReal (~0.123, ~0.17014117E39) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.31415927E1) = GREATER compareReal (~0.123, ~0.31415927E1) = GREATER compare (~0.123, ~0.27182817E1) = GREATER compareReal (~0.123, ~0.27182817E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.11754944E~37) = LESS compareReal (~0.123, ~0.11754944E~37) = LESS compare (~0.123, ~0.5877472E~38) = LESS compareReal (~0.123, ~0.5877472E~38) = LESS compare (~0.123, ~0.1E~44) = LESS compareReal (~0.123, ~0.1E~44) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.34028235E39) = LESS compareReal (~0.123E~2, 0.34028235E39) = LESS compare (~0.123E~2, 0.17014117E39) = LESS compareReal (~0.123E~2, 0.17014117E39) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.31415927E1) = LESS compareReal (~0.123E~2, 0.31415927E1) = LESS compare (~0.123E~2, 0.27182817E1) = LESS compareReal (~0.123E~2, 0.27182817E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.11754944E~37) = LESS compareReal (~0.123E~2, 0.11754944E~37) = LESS compare (~0.123E~2, 0.5877472E~38) = LESS compareReal (~0.123E~2, 0.5877472E~38) = LESS compare (~0.123E~2, 0.1E~44) = LESS compareReal (~0.123E~2, 0.1E~44) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.34028235E39) = GREATER compareReal (~0.123E~2, ~0.34028235E39) = GREATER compare (~0.123E~2, ~0.17014117E39) = GREATER compareReal (~0.123E~2, ~0.17014117E39) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.31415927E1) = GREATER compareReal (~0.123E~2, ~0.31415927E1) = GREATER compare (~0.123E~2, ~0.27182817E1) = GREATER compareReal (~0.123E~2, ~0.27182817E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.11754944E~37) = LESS compareReal (~0.123E~2, ~0.11754944E~37) = LESS compare (~0.123E~2, ~0.5877472E~38) = LESS compareReal (~0.123E~2, ~0.5877472E~38) = LESS compare (~0.123E~2, ~0.1E~44) = LESS compareReal (~0.123E~2, ~0.1E~44) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.11754944E~37, 0.34028235E39) = LESS compareReal (~0.11754944E~37, 0.34028235E39) = LESS compare (~0.11754944E~37, 0.17014117E39) = LESS compareReal (~0.11754944E~37, 0.17014117E39) = LESS compare (~0.11754944E~37, 0.123E4) = LESS compareReal (~0.11754944E~37, 0.123E4) = LESS compare (~0.11754944E~37, 0.123E2) = LESS compareReal (~0.11754944E~37, 0.123E2) = LESS compare (~0.11754944E~37, 0.31415927E1) = LESS compareReal (~0.11754944E~37, 0.31415927E1) = LESS compare (~0.11754944E~37, 0.27182817E1) = LESS compareReal (~0.11754944E~37, 0.27182817E1) = LESS compare (~0.11754944E~37, 0.123E1) = LESS compareReal (~0.11754944E~37, 0.123E1) = LESS compare (~0.11754944E~37, 0.123) = LESS compareReal (~0.11754944E~37, 0.123) = LESS compare (~0.11754944E~37, 0.123E~2) = LESS compareReal (~0.11754944E~37, 0.123E~2) = LESS compare (~0.11754944E~37, 0.11754944E~37) = LESS compareReal (~0.11754944E~37, 0.11754944E~37) = LESS compare (~0.11754944E~37, 0.5877472E~38) = LESS compareReal (~0.11754944E~37, 0.5877472E~38) = LESS compare (~0.11754944E~37, 0.1E~44) = LESS compareReal (~0.11754944E~37, 0.1E~44) = LESS compare (~0.11754944E~37, 0.0) = LESS compareReal (~0.11754944E~37, 0.0) = LESS compare (~0.11754944E~37, ~0.34028235E39) = GREATER compareReal (~0.11754944E~37, ~0.34028235E39) = GREATER compare (~0.11754944E~37, ~0.17014117E39) = GREATER compareReal (~0.11754944E~37, ~0.17014117E39) = GREATER compare (~0.11754944E~37, ~0.123E4) = GREATER compareReal (~0.11754944E~37, ~0.123E4) = GREATER compare (~0.11754944E~37, ~0.123E2) = GREATER compareReal (~0.11754944E~37, ~0.123E2) = GREATER compare (~0.11754944E~37, ~0.31415927E1) = GREATER compareReal (~0.11754944E~37, ~0.31415927E1) = GREATER compare (~0.11754944E~37, ~0.27182817E1) = GREATER compareReal (~0.11754944E~37, ~0.27182817E1) = GREATER compare (~0.11754944E~37, ~0.123E1) = GREATER compareReal (~0.11754944E~37, ~0.123E1) = GREATER compare (~0.11754944E~37, ~0.123) = GREATER compareReal (~0.11754944E~37, ~0.123) = GREATER compare (~0.11754944E~37, ~0.123E~2) = GREATER compareReal (~0.11754944E~37, ~0.123E~2) = GREATER compare (~0.11754944E~37, ~0.11754944E~37) = EQUAL compareReal (~0.11754944E~37, ~0.11754944E~37) = EQUAL compare (~0.11754944E~37, ~0.5877472E~38) = LESS compareReal (~0.11754944E~37, ~0.5877472E~38) = LESS compare (~0.11754944E~37, ~0.1E~44) = LESS compareReal (~0.11754944E~37, ~0.1E~44) = LESS compare (~0.11754944E~37, ~0.0) = LESS compareReal (~0.11754944E~37, ~0.0) = LESS compare (~0.5877472E~38, 0.34028235E39) = LESS compareReal (~0.5877472E~38, 0.34028235E39) = LESS compare (~0.5877472E~38, 0.17014117E39) = LESS compareReal (~0.5877472E~38, 0.17014117E39) = LESS compare (~0.5877472E~38, 0.123E4) = LESS compareReal (~0.5877472E~38, 0.123E4) = LESS compare (~0.5877472E~38, 0.123E2) = LESS compareReal (~0.5877472E~38, 0.123E2) = LESS compare (~0.5877472E~38, 0.31415927E1) = LESS compareReal (~0.5877472E~38, 0.31415927E1) = LESS compare (~0.5877472E~38, 0.27182817E1) = LESS compareReal (~0.5877472E~38, 0.27182817E1) = LESS compare (~0.5877472E~38, 0.123E1) = LESS compareReal (~0.5877472E~38, 0.123E1) = LESS compare (~0.5877472E~38, 0.123) = LESS compareReal (~0.5877472E~38, 0.123) = LESS compare (~0.5877472E~38, 0.123E~2) = LESS compareReal (~0.5877472E~38, 0.123E~2) = LESS compare (~0.5877472E~38, 0.11754944E~37) = LESS compareReal (~0.5877472E~38, 0.11754944E~37) = LESS compare (~0.5877472E~38, 0.5877472E~38) = LESS compareReal (~0.5877472E~38, 0.5877472E~38) = LESS compare (~0.5877472E~38, 0.1E~44) = LESS compareReal (~0.5877472E~38, 0.1E~44) = LESS compare (~0.5877472E~38, 0.0) = LESS compareReal (~0.5877472E~38, 0.0) = LESS compare (~0.5877472E~38, ~0.34028235E39) = GREATER compareReal (~0.5877472E~38, ~0.34028235E39) = GREATER compare (~0.5877472E~38, ~0.17014117E39) = GREATER compareReal (~0.5877472E~38, ~0.17014117E39) = GREATER compare (~0.5877472E~38, ~0.123E4) = GREATER compareReal (~0.5877472E~38, ~0.123E4) = GREATER compare (~0.5877472E~38, ~0.123E2) = GREATER compareReal (~0.5877472E~38, ~0.123E2) = GREATER compare (~0.5877472E~38, ~0.31415927E1) = GREATER compareReal (~0.5877472E~38, ~0.31415927E1) = GREATER compare (~0.5877472E~38, ~0.27182817E1) = GREATER compareReal (~0.5877472E~38, ~0.27182817E1) = GREATER compare (~0.5877472E~38, ~0.123E1) = GREATER compareReal (~0.5877472E~38, ~0.123E1) = GREATER compare (~0.5877472E~38, ~0.123) = GREATER compareReal (~0.5877472E~38, ~0.123) = GREATER compare (~0.5877472E~38, ~0.123E~2) = GREATER compareReal (~0.5877472E~38, ~0.123E~2) = GREATER compare (~0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (~0.5877472E~38, ~0.11754944E~37) = GREATER compare (~0.5877472E~38, ~0.5877472E~38) = EQUAL compareReal (~0.5877472E~38, ~0.5877472E~38) = EQUAL compare (~0.5877472E~38, ~0.1E~44) = LESS compareReal (~0.5877472E~38, ~0.1E~44) = LESS compare (~0.5877472E~38, ~0.0) = LESS compareReal (~0.5877472E~38, ~0.0) = LESS compare (~0.1E~44, 0.34028235E39) = LESS compareReal (~0.1E~44, 0.34028235E39) = LESS compare (~0.1E~44, 0.17014117E39) = LESS compareReal (~0.1E~44, 0.17014117E39) = LESS compare (~0.1E~44, 0.123E4) = LESS compareReal (~0.1E~44, 0.123E4) = LESS compare (~0.1E~44, 0.123E2) = LESS compareReal (~0.1E~44, 0.123E2) = LESS compare (~0.1E~44, 0.31415927E1) = LESS compareReal (~0.1E~44, 0.31415927E1) = LESS compare (~0.1E~44, 0.27182817E1) = LESS compareReal (~0.1E~44, 0.27182817E1) = LESS compare (~0.1E~44, 0.123E1) = LESS compareReal (~0.1E~44, 0.123E1) = LESS compare (~0.1E~44, 0.123) = LESS compareReal (~0.1E~44, 0.123) = LESS compare (~0.1E~44, 0.123E~2) = LESS compareReal (~0.1E~44, 0.123E~2) = LESS compare (~0.1E~44, 0.11754944E~37) = LESS compareReal (~0.1E~44, 0.11754944E~37) = LESS compare (~0.1E~44, 0.5877472E~38) = LESS compareReal (~0.1E~44, 0.5877472E~38) = LESS compare (~0.1E~44, 0.1E~44) = LESS compareReal (~0.1E~44, 0.1E~44) = LESS compare (~0.1E~44, 0.0) = LESS compareReal (~0.1E~44, 0.0) = LESS compare (~0.1E~44, ~0.34028235E39) = GREATER compareReal (~0.1E~44, ~0.34028235E39) = GREATER compare (~0.1E~44, ~0.17014117E39) = GREATER compareReal (~0.1E~44, ~0.17014117E39) = GREATER compare (~0.1E~44, ~0.123E4) = GREATER compareReal (~0.1E~44, ~0.123E4) = GREATER compare (~0.1E~44, ~0.123E2) = GREATER compareReal (~0.1E~44, ~0.123E2) = GREATER compare (~0.1E~44, ~0.31415927E1) = GREATER compareReal (~0.1E~44, ~0.31415927E1) = GREATER compare (~0.1E~44, ~0.27182817E1) = GREATER compareReal (~0.1E~44, ~0.27182817E1) = GREATER compare (~0.1E~44, ~0.123E1) = GREATER compareReal (~0.1E~44, ~0.123E1) = GREATER compare (~0.1E~44, ~0.123) = GREATER compareReal (~0.1E~44, ~0.123) = GREATER compare (~0.1E~44, ~0.123E~2) = GREATER compareReal (~0.1E~44, ~0.123E~2) = GREATER compare (~0.1E~44, ~0.11754944E~37) = GREATER compareReal (~0.1E~44, ~0.11754944E~37) = GREATER compare (~0.1E~44, ~0.5877472E~38) = GREATER compareReal (~0.1E~44, ~0.5877472E~38) = GREATER compare (~0.1E~44, ~0.1E~44) = EQUAL compareReal (~0.1E~44, ~0.1E~44) = EQUAL compare (~0.1E~44, ~0.0) = LESS compareReal (~0.1E~44, ~0.0) = LESS compare (~0.0, 0.34028235E39) = LESS compareReal (~0.0, 0.34028235E39) = LESS compare (~0.0, 0.17014117E39) = LESS compareReal (~0.0, 0.17014117E39) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.31415927E1) = LESS compareReal (~0.0, 0.31415927E1) = LESS compare (~0.0, 0.27182817E1) = LESS compareReal (~0.0, 0.27182817E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.11754944E~37) = LESS compareReal (~0.0, 0.11754944E~37) = LESS compare (~0.0, 0.5877472E~38) = LESS compareReal (~0.0, 0.5877472E~38) = LESS compare (~0.0, 0.1E~44) = LESS compareReal (~0.0, 0.1E~44) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.34028235E39) = GREATER compareReal (~0.0, ~0.34028235E39) = GREATER compare (~0.0, ~0.17014117E39) = GREATER compareReal (~0.0, ~0.17014117E39) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.31415927E1) = GREATER compareReal (~0.0, ~0.31415927E1) = GREATER compare (~0.0, ~0.27182817E1) = GREATER compareReal (~0.0, ~0.27182817E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.11754944E~37) = GREATER compareReal (~0.0, ~0.11754944E~37) = GREATER compare (~0.0, ~0.5877472E~38) = GREATER compareReal (~0.0, ~0.5877472E~38) = GREATER compare (~0.0, ~0.1E~44) = GREATER compareReal (~0.0, ~0.1E~44) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.17976931348623157E309) = ~0.17976931348623157E309 ~ (0.8988465674311579E308) = ~0.8988465674311579E308 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.3141592653589793E1) = ~0.3141592653589793E1 ~ (0.2718281828459045E1) = ~0.2718281828459045E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.22250738585072014E~307) = ~0.22250738585072014E~307 ~ (0.11125369292536007E~307) = ~0.11125369292536007E~307 ~ (0.5E~323) = ~0.5E~323 ~ (0.0) = ~0.0 ~ (~0.17976931348623157E309) = 0.17976931348623157E309 ~ (~0.8988465674311579E308) = 0.8988465674311579E308 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.3141592653589793E1) = 0.3141592653589793E1 ~ (~0.2718281828459045E1) = 0.2718281828459045E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.22250738585072014E~307) = 0.22250738585072014E~307 ~ (~0.11125369292536007E~307) = 0.11125369292536007E~307 ~ (~0.5E~323) = 0.5E~323 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.17976931348623157E309, 0.17976931348623157E309) = inf + (0.17976931348623157E309, 0.17976931348623157E309) = inf - (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 / (0.17976931348623157E309, 0.17976931348623157E309) = 0.1E1 nextAfter (0.17976931348623157E309, 0.17976931348623157E309) = 0.17976931348623157E309 rem (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, 0.8988465674311579E308) = inf + (0.17976931348623157E309, 0.8988465674311579E308) = inf - (0.17976931348623157E309, 0.8988465674311579E308) = 0.8988465674311579E308 / (0.17976931348623157E309, 0.8988465674311579E308) = 0.2E1 nextAfter (0.17976931348623157E309, 0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, 0.123E4) = inf + (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E4) = 0.1461539134034403E306 nextAfter (0.17976931348623157E309, 0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E4) = 0.0 * (0.17976931348623157E309, 0.123E2) = inf + (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E2) = 0.1461539134034403E308 nextAfter (0.17976931348623157E309, 0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E2) = 0.0 * (0.17976931348623157E309, 0.3141592653589793E1) = inf + (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, 0.2718281828459045E1) = inf + (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.2718281828459045E1) = 0.661334345850887E308 nextAfter (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123E1) = inf + (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E1) = 0.1461539134034403E309 nextAfter (0.17976931348623157E309, 0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123) = 0.22111625558806483E308 + (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123) = inf nextAfter (0.17976931348623157E309, 0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123) = ~inf * (0.17976931348623157E309, 0.123E~2) = 0.2211162555880648E306 + (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E~2) = inf nextAfter (0.17976931348623157E309, 0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E~2) = ~inf * (0.17976931348623157E309, 0.22250738585072014E~307) = 0.39999999999999996E1 + (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.22250738585072014E~307) = inf nextAfter (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, 0.11125369292536007E~307) = 0.19999999999999998E1 + (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.11125369292536007E~307) = inf nextAfter (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, 0.5E~323) = 0.8881784197001251E~15 + (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.5E~323) = inf nextAfter (0.17976931348623157E309, 0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.5E~323) = ~inf * (0.17976931348623157E309, 0.0) = 0.0 + (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.0) = inf nextAfter (0.17976931348623157E309, 0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.0) = nan * (0.17976931348623157E309, ~0.17976931348623157E309) = ~inf + (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 - (0.17976931348623157E309, ~0.17976931348623157E309) = inf / (0.17976931348623157E309, ~0.17976931348623157E309) = ~0.1E1 nextAfter (0.17976931348623157E309, ~0.17976931348623157E309) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, ~0.8988465674311579E308) = ~inf + (0.17976931348623157E309, ~0.8988465674311579E308) = 0.8988465674311579E308 - (0.17976931348623157E309, ~0.8988465674311579E308) = inf / (0.17976931348623157E309, ~0.8988465674311579E308) = ~0.2E1 nextAfter (0.17976931348623157E309, ~0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, ~0.123E4) = ~inf + (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E4) = ~0.1461539134034403E306 nextAfter (0.17976931348623157E309, ~0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E4) = 0.0 * (0.17976931348623157E309, ~0.123E2) = ~inf + (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E2) = ~0.1461539134034403E308 nextAfter (0.17976931348623157E309, ~0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E2) = 0.0 * (0.17976931348623157E309, ~0.3141592653589793E1) = ~inf + (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, ~0.2718281828459045E1) = ~inf + (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123E1) = ~inf + (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E1) = ~0.1461539134034403E309 nextAfter (0.17976931348623157E309, ~0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123) = ~0.22111625558806483E308 + (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123) = ~inf nextAfter (0.17976931348623157E309, ~0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123) = ~inf * (0.17976931348623157E309, ~0.123E~2) = ~0.2211162555880648E306 + (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E~2) = ~inf nextAfter (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E~2) = ~inf * (0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.39999999999999996E1 + (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.19999999999999998E1 + (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, ~0.5E~323) = ~0.8881784197001251E~15 + (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.5E~323) = ~inf nextAfter (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.5E~323) = ~inf * (0.17976931348623157E309, ~0.0) = ~0.0 + (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.0) = ~inf nextAfter (0.17976931348623157E309, ~0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.0) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.17976931348623157E309, ~inf) = ~inf + (0.17976931348623157E309, ~inf) = ~inf - (0.17976931348623157E309, ~inf) = inf / (0.17976931348623157E309, ~inf) = ~0.0 nextAfter (0.17976931348623157E309, ~inf) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~inf) = 0.17976931348623157E309 * (0.17976931348623157E309, nan) = nan + (0.17976931348623157E309, nan) = nan - (0.17976931348623157E309, nan) = nan / (0.17976931348623157E309, nan) = nan nextAfter (0.17976931348623157E309, nan) = nan rem (0.17976931348623157E309, nan) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.8988465674311579E308, 0.17976931348623157E309) = inf + (0.8988465674311579E308, 0.17976931348623157E309) = inf - (0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 / (0.8988465674311579E308, 0.17976931348623157E309) = 0.5 nextAfter (0.8988465674311579E308, 0.17976931348623157E309) = 0.898846567431158E308 rem (0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, 0.8988465674311579E308) = inf + (0.8988465674311579E308, 0.8988465674311579E308) = 0.17976931348623157E309 - (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 / (0.8988465674311579E308, 0.8988465674311579E308) = 0.1E1 nextAfter (0.8988465674311579E308, 0.8988465674311579E308) = 0.8988465674311579E308 rem (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, 0.123E4) = inf + (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E4) = 0.7307695670172015E305 nextAfter (0.8988465674311579E308, 0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E4) = 0.0 * (0.8988465674311579E308, 0.123E2) = inf + (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E2) = 0.7307695670172014E307 nextAfter (0.8988465674311579E308, 0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E2) = 0.0 * (0.8988465674311579E308, 0.3141592653589793E1) = inf + (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, 0.2718281828459045E1) = inf + (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123E1) = 0.1105581277940324E309 + (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E1) = 0.7307695670172015E308 nextAfter (0.8988465674311579E308, 0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123) = 0.11055812779403241E308 + (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123) = inf nextAfter (0.8988465674311579E308, 0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123) = ~inf * (0.8988465674311579E308, 0.123E~2) = 0.1105581277940324E306 + (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E~2) = inf nextAfter (0.8988465674311579E308, 0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E~2) = ~inf * (0.8988465674311579E308, 0.22250738585072014E~307) = 0.19999999999999998E1 + (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.22250738585072014E~307) = inf nextAfter (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, 0.11125369292536007E~307) = 0.9999999999999999 + (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.11125369292536007E~307) = inf nextAfter (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, 0.5E~323) = 0.44408920985006257E~15 + (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.5E~323) = inf nextAfter (0.8988465674311579E308, 0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.5E~323) = ~inf * (0.8988465674311579E308, 0.0) = 0.0 + (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.0) = inf nextAfter (0.8988465674311579E308, 0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.0) = nan * (0.8988465674311579E308, ~0.17976931348623157E309) = ~inf + (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 - (0.8988465674311579E308, ~0.17976931348623157E309) = inf / (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.5 nextAfter (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, ~0.8988465674311579E308) = ~inf + (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 - (0.8988465674311579E308, ~0.8988465674311579E308) = 0.17976931348623157E309 / (0.8988465674311579E308, ~0.8988465674311579E308) = ~0.1E1 nextAfter (0.8988465674311579E308, ~0.8988465674311579E308) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, ~0.123E4) = ~inf + (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E4) = ~0.7307695670172015E305 nextAfter (0.8988465674311579E308, ~0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E4) = 0.0 * (0.8988465674311579E308, ~0.123E2) = ~inf + (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E2) = ~0.7307695670172014E307 nextAfter (0.8988465674311579E308, ~0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E2) = 0.0 * (0.8988465674311579E308, ~0.3141592653589793E1) = ~inf + (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, ~0.2718281828459045E1) = ~inf + (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123E1) = ~0.1105581277940324E309 + (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E1) = ~0.7307695670172015E308 nextAfter (0.8988465674311579E308, ~0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123) = ~0.11055812779403241E308 + (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123) = ~inf nextAfter (0.8988465674311579E308, ~0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123) = ~inf * (0.8988465674311579E308, ~0.123E~2) = ~0.1105581277940324E306 + (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E~2) = ~inf nextAfter (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E~2) = ~inf * (0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.19999999999999998E1 + (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.9999999999999999 + (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, ~0.5E~323) = ~0.44408920985006257E~15 + (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.5E~323) = ~inf nextAfter (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.5E~323) = ~inf * (0.8988465674311579E308, ~0.0) = ~0.0 + (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.0) = ~inf nextAfter (0.8988465674311579E308, ~0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.0) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.8988465674311579E308, ~inf) = ~inf + (0.8988465674311579E308, ~inf) = ~inf - (0.8988465674311579E308, ~inf) = inf / (0.8988465674311579E308, ~inf) = ~0.0 nextAfter (0.8988465674311579E308, ~inf) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~inf) = 0.8988465674311579E308 * (0.8988465674311579E308, nan) = nan + (0.8988465674311579E308, nan) = nan - (0.8988465674311579E308, nan) = nan / (0.8988465674311579E308, nan) = nan nextAfter (0.8988465674311579E308, nan) = nan rem (0.8988465674311579E308, nan) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.123E4, 0.17976931348623157E309) = inf + (0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E4, 0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (0.123E4, 0.17976931348623157E309) = 0.12300000000000002E4 rem (0.123E4, 0.17976931348623157E309) = 0.123E4 * (0.123E4, 0.8988465674311579E308) = inf + (0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E4, 0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (0.123E4, 0.8988465674311579E308) = 0.12300000000000002E4 rem (0.123E4, 0.8988465674311579E308) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999999999998E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.3141592653589793E1) = 0.38641589639154454E4 + (0.123E4, 0.3141592653589793E1) = 0.123314159265359E4 - (0.123E4, 0.3141592653589793E1) = 0.122685840734641E4 / (0.123E4, 0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (0.123E4, 0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, 0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, 0.2718281828459045E1) = 0.33434866490046256E4 + (0.123E4, 0.2718281828459045E1) = 0.1232718281828459E4 - (0.123E4, 0.2718281828459045E1) = 0.1227281718171541E4 / (0.123E4, 0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (0.123E4, 0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, 0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999999999998E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999999999998E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129E1 + (0.123E4, 0.123E~2) = 0.123000123E4 - (0.123E4, 0.123E~2) = 0.122999877E4 / (0.123E4, 0.123E~2) = 0.1E7 nextAfter (0.123E4, 0.123E~2) = 0.12299999999999998E4 rem (0.123E4, 0.123E~2) = 0.0 * (0.123E4, 0.22250738585072014E~307) = 0.27368408459638577E~304 + (0.123E4, 0.22250738585072014E~307) = 0.123E4 - (0.123E4, 0.22250738585072014E~307) = 0.123E4 / (0.123E4, 0.22250738585072014E~307) = inf nextAfter (0.123E4, 0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, 0.22250738585072014E~307) = ~inf * (0.123E4, 0.11125369292536007E~307) = 0.13684204229819289E~304 + (0.123E4, 0.11125369292536007E~307) = 0.123E4 - (0.123E4, 0.11125369292536007E~307) = 0.123E4 / (0.123E4, 0.11125369292536007E~307) = inf nextAfter (0.123E4, 0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, 0.11125369292536007E~307) = ~inf * (0.123E4, 0.5E~323) = 0.6077E~320 + (0.123E4, 0.5E~323) = 0.123E4 - (0.123E4, 0.5E~323) = 0.123E4 / (0.123E4, 0.5E~323) = inf nextAfter (0.123E4, 0.5E~323) = 0.12299999999999998E4 rem (0.123E4, 0.5E~323) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999999999998E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.17976931348623157E309) = ~inf + (0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E4, ~0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (0.123E4, ~0.17976931348623157E309) = 0.12299999999999998E4 rem (0.123E4, ~0.17976931348623157E309) = 0.123E4 * (0.123E4, ~0.8988465674311579E308) = ~inf + (0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E4, ~0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (0.123E4, ~0.8988465674311579E308) = 0.12299999999999998E4 rem (0.123E4, ~0.8988465674311579E308) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999999999998E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.3141592653589793E1) = ~0.38641589639154454E4 + (0.123E4, ~0.3141592653589793E1) = 0.122685840734641E4 - (0.123E4, ~0.3141592653589793E1) = 0.123314159265359E4 / (0.123E4, ~0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (0.123E4, ~0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, ~0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, ~0.2718281828459045E1) = ~0.33434866490046256E4 + (0.123E4, ~0.2718281828459045E1) = 0.1227281718171541E4 - (0.123E4, ~0.2718281828459045E1) = 0.1232718281828459E4 / (0.123E4, ~0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (0.123E4, ~0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, ~0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999999999998E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999999999998E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129E1 + (0.123E4, ~0.123E~2) = 0.122999877E4 - (0.123E4, ~0.123E~2) = 0.123000123E4 / (0.123E4, ~0.123E~2) = ~0.1E7 nextAfter (0.123E4, ~0.123E~2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E~2) = 0.0 * (0.123E4, ~0.22250738585072014E~307) = ~0.27368408459638577E~304 + (0.123E4, ~0.22250738585072014E~307) = 0.123E4 - (0.123E4, ~0.22250738585072014E~307) = 0.123E4 / (0.123E4, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E4, ~0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.22250738585072014E~307) = ~inf * (0.123E4, ~0.11125369292536007E~307) = ~0.13684204229819289E~304 + (0.123E4, ~0.11125369292536007E~307) = 0.123E4 - (0.123E4, ~0.11125369292536007E~307) = 0.123E4 / (0.123E4, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E4, ~0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.11125369292536007E~307) = ~inf * (0.123E4, ~0.5E~323) = ~0.6077E~320 + (0.123E4, ~0.5E~323) = 0.123E4 - (0.123E4, ~0.5E~323) = 0.123E4 / (0.123E4, ~0.5E~323) = ~inf nextAfter (0.123E4, ~0.5E~323) = 0.12299999999999998E4 rem (0.123E4, ~0.5E~323) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999999999998E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999999999998E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.17976931348623157E309) = inf + (0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E2, 0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (0.123E2, 0.17976931348623157E309) = 0.12300000000000002E2 rem (0.123E2, 0.17976931348623157E309) = 0.123E2 * (0.123E2, 0.8988465674311579E308) = inf + (0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E2, 0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (0.123E2, 0.8988465674311579E308) = 0.12300000000000002E2 rem (0.123E2, 0.8988465674311579E308) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300000000000002E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129000000000002E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.3141592653589793E1) = 0.3864158963915446E2 + (0.123E2, 0.3141592653589793E1) = 0.15441592653589794E2 - (0.123E2, 0.3141592653589793E1) = 0.9158407346410208E1 / (0.123E2, 0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (0.123E2, 0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, 0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, 0.2718281828459045E1) = 0.33434866490046254E2 + (0.123E2, 0.2718281828459045E1) = 0.15018281828459045E2 - (0.123E2, 0.2718281828459045E1) = 0.9581718171540956E1 / (0.123E2, 0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (0.123E2, 0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, 0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, 0.123E1) = 0.15129000000000001E2 + (0.123E2, 0.123E1) = 0.13530000000000001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999999999999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129000000000001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177000000000001E2 / (0.123E2, 0.123) = 0.10000000000000001E3 nextAfter (0.123E2, 0.123) = 0.12299999999999999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.12298770000000001E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999999999999E2 rem (0.123E2, 0.123E~2) = 0.17763568394002505E~14 * (0.123E2, 0.22250738585072014E~307) = 0.2736840845963858E~306 + (0.123E2, 0.22250738585072014E~307) = 0.123E2 - (0.123E2, 0.22250738585072014E~307) = 0.123E2 / (0.123E2, 0.22250738585072014E~307) = inf nextAfter (0.123E2, 0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, 0.22250738585072014E~307) = ~inf * (0.123E2, 0.11125369292536007E~307) = 0.1368420422981929E~306 + (0.123E2, 0.11125369292536007E~307) = 0.123E2 - (0.123E2, 0.11125369292536007E~307) = 0.123E2 / (0.123E2, 0.11125369292536007E~307) = inf nextAfter (0.123E2, 0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, 0.11125369292536007E~307) = ~inf * (0.123E2, 0.5E~323) = 0.6E~322 + (0.123E2, 0.5E~323) = 0.123E2 - (0.123E2, 0.5E~323) = 0.123E2 / (0.123E2, 0.5E~323) = inf nextAfter (0.123E2, 0.5E~323) = 0.12299999999999999E2 rem (0.123E2, 0.5E~323) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999999999999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.17976931348623157E309) = ~inf + (0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E2, ~0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (0.123E2, ~0.17976931348623157E309) = 0.12299999999999999E2 rem (0.123E2, ~0.17976931348623157E309) = 0.123E2 * (0.123E2, ~0.8988465674311579E308) = ~inf + (0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E2, ~0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (0.123E2, ~0.8988465674311579E308) = 0.12299999999999999E2 rem (0.123E2, ~0.8988465674311579E308) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999999999999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129000000000002E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.3141592653589793E1) = ~0.3864158963915446E2 + (0.123E2, ~0.3141592653589793E1) = 0.9158407346410208E1 - (0.123E2, ~0.3141592653589793E1) = 0.15441592653589794E2 / (0.123E2, ~0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (0.123E2, ~0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, ~0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, ~0.2718281828459045E1) = ~0.33434866490046254E2 + (0.123E2, ~0.2718281828459045E1) = 0.9581718171540956E1 - (0.123E2, ~0.2718281828459045E1) = 0.15018281828459045E2 / (0.123E2, ~0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (0.123E2, ~0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, ~0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, ~0.123E1) = ~0.15129000000000001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530000000000001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999999999999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129000000000001E1 + (0.123E2, ~0.123) = 0.12177000000000001E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.10000000000000001E3 nextAfter (0.123E2, ~0.123) = 0.12299999999999999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129E~1 + (0.123E2, ~0.123E~2) = 0.12298770000000001E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E~2) = 0.17763568394002505E~14 * (0.123E2, ~0.22250738585072014E~307) = ~0.2736840845963858E~306 + (0.123E2, ~0.22250738585072014E~307) = 0.123E2 - (0.123E2, ~0.22250738585072014E~307) = 0.123E2 / (0.123E2, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E2, ~0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.22250738585072014E~307) = ~inf * (0.123E2, ~0.11125369292536007E~307) = ~0.1368420422981929E~306 + (0.123E2, ~0.11125369292536007E~307) = 0.123E2 - (0.123E2, ~0.11125369292536007E~307) = 0.123E2 / (0.123E2, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E2, ~0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.11125369292536007E~307) = ~inf * (0.123E2, ~0.5E~323) = ~0.6E~322 + (0.123E2, ~0.5E~323) = 0.123E2 - (0.123E2, ~0.5E~323) = 0.123E2 / (0.123E2, ~0.5E~323) = ~inf nextAfter (0.123E2, ~0.5E~323) = 0.12299999999999999E2 rem (0.123E2, ~0.5E~323) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999999999999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999999999999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.3141592653589793E1, 0.17976931348623157E309) = inf + (0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.3141592653589793E1, 0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (0.3141592653589793E1, 0.17976931348623157E309) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.8988465674311579E308) = inf + (0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.3141592653589793E1, 0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (0.3141592653589793E1, 0.8988465674311579E308) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E4) = 0.38641589639154454E4 + (0.3141592653589793E1, 0.123E4) = 0.123314159265359E4 - (0.3141592653589793E1, 0.123E4) = ~0.122685840734641E4 / (0.3141592653589793E1, 0.123E4) = 0.25541403687721893E~2 nextAfter (0.3141592653589793E1, 0.123E4) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E2) = 0.3864158963915446E2 + (0.3141592653589793E1, 0.123E2) = 0.15441592653589794E2 - (0.3141592653589793E1, 0.123E2) = ~0.9158407346410208E1 / (0.3141592653589793E1, 0.123E2) = 0.2554140368772189 nextAfter (0.3141592653589793E1, 0.123E2) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.3141592653589793E1) = 0.9869604401089358E1 + (0.3141592653589793E1, 0.3141592653589793E1) = 0.6283185307179586E1 - (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 / (0.3141592653589793E1, 0.3141592653589793E1) = 0.1E1 nextAfter (0.3141592653589793E1, 0.3141592653589793E1) = 0.3141592653589793E1 rem (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, 0.2718281828459045E1) = 0.8539734222673566E1 + (0.3141592653589793E1, 0.2718281828459045E1) = 0.5859874482048838E1 - (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 / (0.3141592653589793E1, 0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (0.3141592653589793E1, 0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, 0.123E1) = 0.38641589639154454E1 + (0.3141592653589793E1, 0.123E1) = 0.43715926535897935E1 - (0.3141592653589793E1, 0.123E1) = 0.19115926535897931E1 / (0.3141592653589793E1, 0.123E1) = 0.25541403687721895E1 nextAfter (0.3141592653589793E1, 0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, 0.123) = 0.38641589639154456 + (0.3141592653589793E1, 0.123) = 0.32645926535897933E1 - (0.3141592653589793E1, 0.123) = 0.3018592653589793E1 / (0.3141592653589793E1, 0.123) = 0.25541403687721896E2 nextAfter (0.3141592653589793E1, 0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, 0.123E~2) = 0.38641589639154456E~2 + (0.3141592653589793E1, 0.123E~2) = 0.3142822653589793E1 - (0.3141592653589793E1, 0.123E~2) = 0.3140362653589793E1 / (0.3141592653589793E1, 0.123E~2) = 0.25541403687721895E4 nextAfter (0.3141592653589793E1, 0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, 0.22250738585072014E~307) = 0.6990275687580919E~307 + (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (0.3141592653589793E1, 0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, 0.11125369292536007E~307) = 0.34951378437904593E~307 + (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.11125369292536007E~307) = inf nextAfter (0.3141592653589793E1, 0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, 0.5E~323) = 0.15E~322 + (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.5E~323) = inf nextAfter (0.3141592653589793E1, 0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.5E~323) = ~inf * (0.3141592653589793E1, 0.0) = 0.0 + (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.0) = inf nextAfter (0.3141592653589793E1, 0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.0) = nan * (0.3141592653589793E1, ~0.17976931348623157E309) = ~inf + (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (0.3141592653589793E1, ~0.17976931348623157E309) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.8988465674311579E308) = ~inf + (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (0.3141592653589793E1, ~0.8988465674311579E308) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E4) = ~0.38641589639154454E4 + (0.3141592653589793E1, ~0.123E4) = ~0.122685840734641E4 - (0.3141592653589793E1, ~0.123E4) = 0.123314159265359E4 / (0.3141592653589793E1, ~0.123E4) = ~0.25541403687721893E~2 nextAfter (0.3141592653589793E1, ~0.123E4) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E2) = ~0.3864158963915446E2 + (0.3141592653589793E1, ~0.123E2) = ~0.9158407346410208E1 - (0.3141592653589793E1, ~0.123E2) = 0.15441592653589794E2 / (0.3141592653589793E1, ~0.123E2) = ~0.2554140368772189 nextAfter (0.3141592653589793E1, ~0.123E2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.9869604401089358E1 + (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 - (0.3141592653589793E1, ~0.3141592653589793E1) = 0.6283185307179586E1 / (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.1E1 nextAfter (0.3141592653589793E1, ~0.3141592653589793E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.8539734222673566E1 + (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 - (0.3141592653589793E1, ~0.2718281828459045E1) = 0.5859874482048838E1 / (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (0.3141592653589793E1, ~0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, ~0.123E1) = ~0.38641589639154454E1 + (0.3141592653589793E1, ~0.123E1) = 0.19115926535897931E1 - (0.3141592653589793E1, ~0.123E1) = 0.43715926535897935E1 / (0.3141592653589793E1, ~0.123E1) = ~0.25541403687721895E1 nextAfter (0.3141592653589793E1, ~0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, ~0.123) = ~0.38641589639154456 + (0.3141592653589793E1, ~0.123) = 0.3018592653589793E1 - (0.3141592653589793E1, ~0.123) = 0.32645926535897933E1 / (0.3141592653589793E1, ~0.123) = ~0.25541403687721896E2 nextAfter (0.3141592653589793E1, ~0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, ~0.123E~2) = ~0.38641589639154456E~2 + (0.3141592653589793E1, ~0.123E~2) = 0.3140362653589793E1 - (0.3141592653589793E1, ~0.123E~2) = 0.3142822653589793E1 / (0.3141592653589793E1, ~0.123E~2) = ~0.25541403687721895E4 nextAfter (0.3141592653589793E1, ~0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.6990275687580919E~307 + (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.34951378437904593E~307 + (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, ~0.5E~323) = ~0.15E~322 + (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.5E~323) = ~inf nextAfter (0.3141592653589793E1, ~0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.5E~323) = ~inf * (0.3141592653589793E1, ~0.0) = ~0.0 + (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.0) = ~inf nextAfter (0.3141592653589793E1, ~0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.0) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.3141592653589793E1, ~inf) = ~inf + (0.3141592653589793E1, ~inf) = ~inf - (0.3141592653589793E1, ~inf) = inf / (0.3141592653589793E1, ~inf) = ~0.0 nextAfter (0.3141592653589793E1, ~inf) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~inf) = 0.3141592653589793E1 * (0.3141592653589793E1, nan) = nan + (0.3141592653589793E1, nan) = nan - (0.3141592653589793E1, nan) = nan / (0.3141592653589793E1, nan) = nan nextAfter (0.3141592653589793E1, nan) = nan rem (0.3141592653589793E1, nan) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.2718281828459045E1, 0.17976931348623157E309) = inf + (0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.2718281828459045E1, 0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (0.2718281828459045E1, 0.17976931348623157E309) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.8988465674311579E308) = inf + (0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.2718281828459045E1, 0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (0.2718281828459045E1, 0.8988465674311579E308) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E4) = 0.33434866490046256E4 + (0.2718281828459045E1, 0.123E4) = 0.1232718281828459E4 - (0.2718281828459045E1, 0.123E4) = ~0.1227281718171541E4 / (0.2718281828459045E1, 0.123E4) = 0.22099852263894678E~2 nextAfter (0.2718281828459045E1, 0.123E4) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E2) = 0.33434866490046254E2 + (0.2718281828459045E1, 0.123E2) = 0.15018281828459045E2 - (0.2718281828459045E1, 0.123E2) = ~0.9581718171540956E1 / (0.2718281828459045E1, 0.123E2) = 0.22099852263894673 nextAfter (0.2718281828459045E1, 0.123E2) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.3141592653589793E1) = 0.8539734222673566E1 + (0.2718281828459045E1, 0.3141592653589793E1) = 0.5859874482048838E1 - (0.2718281828459045E1, 0.3141592653589793E1) = ~0.423310825130748 / (0.2718281828459045E1, 0.3141592653589793E1) = 0.8652559794322651 nextAfter (0.2718281828459045E1, 0.3141592653589793E1) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.2718281828459045E1) = 0.73890560989306495E1 + (0.2718281828459045E1, 0.2718281828459045E1) = 0.543656365691809E1 - (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 / (0.2718281828459045E1, 0.2718281828459045E1) = 0.1E1 nextAfter (0.2718281828459045E1, 0.2718281828459045E1) = 0.2718281828459045E1 rem (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, 0.123E1) = 0.33434866490046256E1 + (0.2718281828459045E1, 0.123E1) = 0.3948281828459045E1 - (0.2718281828459045E1, 0.123E1) = 0.1488281828459045E1 / (0.2718281828459045E1, 0.123E1) = 0.22099852263894677E1 nextAfter (0.2718281828459045E1, 0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, 0.123) = 0.33434866490046256 + (0.2718281828459045E1, 0.123) = 0.2841281828459045E1 - (0.2718281828459045E1, 0.123) = 0.25952818284590453E1 / (0.2718281828459045E1, 0.123) = 0.22099852263894675E2 nextAfter (0.2718281828459045E1, 0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, 0.123E~2) = 0.33434866490046253E~2 + (0.2718281828459045E1, 0.123E~2) = 0.2719511828459045E1 - (0.2718281828459045E1, 0.123E~2) = 0.2717051828459045E1 / (0.2718281828459045E1, 0.123E~2) = 0.22099852263894677E4 nextAfter (0.2718281828459045E1, 0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, 0.22250738585072014E~307) = 0.6048377836559378E~307 + (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (0.2718281828459045E1, 0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, 0.11125369292536007E~307) = 0.3024188918279689E~307 + (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.11125369292536007E~307) = inf nextAfter (0.2718281828459045E1, 0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, 0.5E~323) = 0.15E~322 + (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.5E~323) = inf nextAfter (0.2718281828459045E1, 0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.5E~323) = ~inf * (0.2718281828459045E1, 0.0) = 0.0 + (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.0) = inf nextAfter (0.2718281828459045E1, 0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.0) = nan * (0.2718281828459045E1, ~0.17976931348623157E309) = ~inf + (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (0.2718281828459045E1, ~0.17976931348623157E309) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.8988465674311579E308) = ~inf + (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (0.2718281828459045E1, ~0.8988465674311579E308) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E4) = ~0.33434866490046256E4 + (0.2718281828459045E1, ~0.123E4) = ~0.1227281718171541E4 - (0.2718281828459045E1, ~0.123E4) = 0.1232718281828459E4 / (0.2718281828459045E1, ~0.123E4) = ~0.22099852263894678E~2 nextAfter (0.2718281828459045E1, ~0.123E4) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E2) = ~0.33434866490046254E2 + (0.2718281828459045E1, ~0.123E2) = ~0.9581718171540956E1 - (0.2718281828459045E1, ~0.123E2) = 0.15018281828459045E2 / (0.2718281828459045E1, ~0.123E2) = ~0.22099852263894673 nextAfter (0.2718281828459045E1, ~0.123E2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8539734222673566E1 + (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.423310825130748 - (0.2718281828459045E1, ~0.3141592653589793E1) = 0.5859874482048838E1 / (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8652559794322651 nextAfter (0.2718281828459045E1, ~0.3141592653589793E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.73890560989306495E1 + (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 - (0.2718281828459045E1, ~0.2718281828459045E1) = 0.543656365691809E1 / (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.1E1 nextAfter (0.2718281828459045E1, ~0.2718281828459045E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, ~0.123E1) = ~0.33434866490046256E1 + (0.2718281828459045E1, ~0.123E1) = 0.1488281828459045E1 - (0.2718281828459045E1, ~0.123E1) = 0.3948281828459045E1 / (0.2718281828459045E1, ~0.123E1) = ~0.22099852263894677E1 nextAfter (0.2718281828459045E1, ~0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, ~0.123) = ~0.33434866490046256 + (0.2718281828459045E1, ~0.123) = 0.25952818284590453E1 - (0.2718281828459045E1, ~0.123) = 0.2841281828459045E1 / (0.2718281828459045E1, ~0.123) = ~0.22099852263894675E2 nextAfter (0.2718281828459045E1, ~0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, ~0.123E~2) = ~0.33434866490046253E~2 + (0.2718281828459045E1, ~0.123E~2) = 0.2717051828459045E1 - (0.2718281828459045E1, ~0.123E~2) = 0.2719511828459045E1 / (0.2718281828459045E1, ~0.123E~2) = ~0.22099852263894677E4 nextAfter (0.2718281828459045E1, ~0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.6048377836559378E~307 + (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.3024188918279689E~307 + (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, ~0.5E~323) = ~0.15E~322 + (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.5E~323) = ~inf nextAfter (0.2718281828459045E1, ~0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.5E~323) = ~inf * (0.2718281828459045E1, ~0.0) = ~0.0 + (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.0) = ~inf nextAfter (0.2718281828459045E1, ~0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.0) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.2718281828459045E1, ~inf) = ~inf + (0.2718281828459045E1, ~inf) = ~inf - (0.2718281828459045E1, ~inf) = inf / (0.2718281828459045E1, ~inf) = ~0.0 nextAfter (0.2718281828459045E1, ~inf) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~inf) = 0.2718281828459045E1 * (0.2718281828459045E1, nan) = nan + (0.2718281828459045E1, nan) = nan - (0.2718281828459045E1, nan) = nan / (0.2718281828459045E1, nan) = nan nextAfter (0.2718281828459045E1, nan) = nan rem (0.2718281828459045E1, nan) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.123E1, 0.17976931348623157E309) = inf + (0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E1, 0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (0.123E1, 0.17976931348623157E309) = 0.12300000000000002E1 rem (0.123E1, 0.17976931348623157E309) = 0.123E1 * (0.123E1, 0.8988465674311579E308) = 0.1105581277940324E309 + (0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E1, 0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (0.123E1, 0.8988465674311579E308) = 0.12300000000000002E1 rem (0.123E1, 0.8988465674311579E308) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300000000000002E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129000000000001E2 + (0.123E1, 0.123E2) = 0.13530000000000001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.9999999999999999E~1 nextAfter (0.123E1, 0.123E2) = 0.12300000000000002E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.3141592653589793E1) = 0.38641589639154454E1 + (0.123E1, 0.3141592653589793E1) = 0.43715926535897935E1 - (0.123E1, 0.3141592653589793E1) = ~0.19115926535897931E1 / (0.123E1, 0.3141592653589793E1) = 0.3915211600060625 nextAfter (0.123E1, 0.3141592653589793E1) = 0.12300000000000002E1 rem (0.123E1, 0.3141592653589793E1) = 0.123E1 * (0.123E1, 0.2718281828459045E1) = 0.33434866490046256E1 + (0.123E1, 0.2718281828459045E1) = 0.3948281828459045E1 - (0.123E1, 0.2718281828459045E1) = ~0.1488281828459045E1 / (0.123E1, 0.2718281828459045E1) = 0.45249171264087407 nextAfter (0.123E1, 0.2718281828459045E1) = 0.12300000000000002E1 rem (0.123E1, 0.2718281828459045E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999999999998E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999999999998E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.22250738585072014E~307) = 0.27368408459638577E~307 + (0.123E1, 0.22250738585072014E~307) = 0.123E1 - (0.123E1, 0.22250738585072014E~307) = 0.123E1 / (0.123E1, 0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (0.123E1, 0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, 0.22250738585072014E~307) = 0.0 * (0.123E1, 0.11125369292536007E~307) = 0.1368420422981929E~307 + (0.123E1, 0.11125369292536007E~307) = 0.123E1 - (0.123E1, 0.11125369292536007E~307) = 0.123E1 / (0.123E1, 0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (0.123E1, 0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, 0.11125369292536007E~307) = 0.0 * (0.123E1, 0.5E~323) = 0.5E~323 + (0.123E1, 0.5E~323) = 0.123E1 - (0.123E1, 0.5E~323) = 0.123E1 / (0.123E1, 0.5E~323) = inf nextAfter (0.123E1, 0.5E~323) = 0.12299999999999998E1 rem (0.123E1, 0.5E~323) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999999999998E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.17976931348623157E309) = ~inf + (0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E1, ~0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (0.123E1, ~0.17976931348623157E309) = 0.12299999999999998E1 rem (0.123E1, ~0.17976931348623157E309) = 0.123E1 * (0.123E1, ~0.8988465674311579E308) = ~0.1105581277940324E309 + (0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E1, ~0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (0.123E1, ~0.8988465674311579E308) = 0.12299999999999998E1 rem (0.123E1, ~0.8988465674311579E308) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999999999998E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129000000000001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530000000000001E2 / (0.123E1, ~0.123E2) = ~0.9999999999999999E~1 nextAfter (0.123E1, ~0.123E2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.3141592653589793E1) = ~0.38641589639154454E1 + (0.123E1, ~0.3141592653589793E1) = ~0.19115926535897931E1 - (0.123E1, ~0.3141592653589793E1) = 0.43715926535897935E1 / (0.123E1, ~0.3141592653589793E1) = ~0.3915211600060625 nextAfter (0.123E1, ~0.3141592653589793E1) = 0.12299999999999998E1 rem (0.123E1, ~0.3141592653589793E1) = 0.123E1 * (0.123E1, ~0.2718281828459045E1) = ~0.33434866490046256E1 + (0.123E1, ~0.2718281828459045E1) = ~0.1488281828459045E1 - (0.123E1, ~0.2718281828459045E1) = 0.3948281828459045E1 / (0.123E1, ~0.2718281828459045E1) = ~0.45249171264087407 nextAfter (0.123E1, ~0.2718281828459045E1) = 0.12299999999999998E1 rem (0.123E1, ~0.2718281828459045E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999999999998E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999999999998E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.22250738585072014E~307) = ~0.27368408459638577E~307 + (0.123E1, ~0.22250738585072014E~307) = 0.123E1 - (0.123E1, ~0.22250738585072014E~307) = 0.123E1 / (0.123E1, ~0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (0.123E1, ~0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.22250738585072014E~307) = 0.0 * (0.123E1, ~0.11125369292536007E~307) = ~0.1368420422981929E~307 + (0.123E1, ~0.11125369292536007E~307) = 0.123E1 - (0.123E1, ~0.11125369292536007E~307) = 0.123E1 / (0.123E1, ~0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (0.123E1, ~0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.11125369292536007E~307) = 0.0 * (0.123E1, ~0.5E~323) = ~0.5E~323 + (0.123E1, ~0.5E~323) = 0.123E1 - (0.123E1, ~0.5E~323) = 0.123E1 / (0.123E1, ~0.5E~323) = ~inf nextAfter (0.123E1, ~0.5E~323) = 0.12299999999999998E1 rem (0.123E1, ~0.5E~323) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999999999998E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999999999998E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.17976931348623157E309) = 0.22111625558806483E308 + (0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123, 0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (0.123, 0.17976931348623157E309) = 0.12300000000000001 rem (0.123, 0.17976931348623157E309) = 0.123 * (0.123, 0.8988465674311579E308) = 0.11055812779403241E308 + (0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123, 0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (0.123, 0.8988465674311579E308) = 0.12300000000000001 rem (0.123, 0.8988465674311579E308) = 0.123 * (0.123, 0.123E4) = 0.15129E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.1E~3 nextAfter (0.123, 0.123E4) = 0.12300000000000001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129000000000001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177000000000001E2 / (0.123, 0.123E2) = 0.9999999999999998E~2 nextAfter (0.123, 0.123E2) = 0.12300000000000001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.3141592653589793E1) = 0.38641589639154456 + (0.123, 0.3141592653589793E1) = 0.32645926535897933E1 - (0.123, 0.3141592653589793E1) = ~0.3018592653589793E1 / (0.123, 0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (0.123, 0.3141592653589793E1) = 0.12300000000000001 rem (0.123, 0.3141592653589793E1) = 0.123 * (0.123, 0.2718281828459045E1) = 0.33434866490046256 + (0.123, 0.2718281828459045E1) = 0.2841281828459045E1 - (0.123, 0.2718281828459045E1) = ~0.25952818284590453E1 / (0.123, 0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (0.123, 0.2718281828459045E1) = 0.12300000000000001 rem (0.123, 0.2718281828459045E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300000000000001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.12423 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.12299999999999998 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.22250738585072014E~307) = 0.273684084596386E~308 + (0.123, 0.22250738585072014E~307) = 0.123 - (0.123, 0.22250738585072014E~307) = 0.123 / (0.123, 0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (0.123, 0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, 0.22250738585072014E~307) = 0.0 * (0.123, 0.11125369292536007E~307) = 0.136842042298193E~308 + (0.123, 0.11125369292536007E~307) = 0.123 - (0.123, 0.11125369292536007E~307) = 0.123 / (0.123, 0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (0.123, 0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, 0.11125369292536007E~307) = 0.0 * (0.123, 0.5E~323) = 0.0 + (0.123, 0.5E~323) = 0.123 - (0.123, 0.5E~323) = 0.123 / (0.123, 0.5E~323) = inf nextAfter (0.123, 0.5E~323) = 0.12299999999999998 rem (0.123, 0.5E~323) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.12299999999999998 rem (0.123, 0.0) = nan * (0.123, ~0.17976931348623157E309) = ~0.22111625558806483E308 + (0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123, ~0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (0.123, ~0.17976931348623157E309) = 0.12299999999999998 rem (0.123, ~0.17976931348623157E309) = 0.123 * (0.123, ~0.8988465674311579E308) = ~0.11055812779403241E308 + (0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123, ~0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (0.123, ~0.8988465674311579E308) = 0.12299999999999998 rem (0.123, ~0.8988465674311579E308) = 0.123 * (0.123, ~0.123E4) = ~0.15129E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.1E~3 nextAfter (0.123, ~0.123E4) = 0.12299999999999998 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129000000000001E1 + (0.123, ~0.123E2) = ~0.12177000000000001E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.9999999999999998E~2 nextAfter (0.123, ~0.123E2) = 0.12299999999999998 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.3141592653589793E1) = ~0.38641589639154456 + (0.123, ~0.3141592653589793E1) = ~0.3018592653589793E1 - (0.123, ~0.3141592653589793E1) = 0.32645926535897933E1 / (0.123, ~0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (0.123, ~0.3141592653589793E1) = 0.12299999999999998 rem (0.123, ~0.3141592653589793E1) = 0.123 * (0.123, ~0.2718281828459045E1) = ~0.33434866490046256 + (0.123, ~0.2718281828459045E1) = ~0.25952818284590453E1 - (0.123, ~0.2718281828459045E1) = 0.2841281828459045E1 / (0.123, ~0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (0.123, ~0.2718281828459045E1) = 0.12299999999999998 rem (0.123, ~0.2718281828459045E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.12299999999999998 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.12299999999999998 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.12423 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.12299999999999998 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.22250738585072014E~307) = ~0.273684084596386E~308 + (0.123, ~0.22250738585072014E~307) = 0.123 - (0.123, ~0.22250738585072014E~307) = 0.123 / (0.123, ~0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (0.123, ~0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, ~0.22250738585072014E~307) = 0.0 * (0.123, ~0.11125369292536007E~307) = ~0.136842042298193E~308 + (0.123, ~0.11125369292536007E~307) = 0.123 - (0.123, ~0.11125369292536007E~307) = 0.123 / (0.123, ~0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (0.123, ~0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, ~0.11125369292536007E~307) = 0.0 * (0.123, ~0.5E~323) = ~0.0 + (0.123, ~0.5E~323) = 0.123 - (0.123, ~0.5E~323) = 0.123 / (0.123, ~0.5E~323) = ~inf nextAfter (0.123, ~0.5E~323) = 0.12299999999999998 rem (0.123, ~0.5E~323) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.12299999999999998 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.12299999999999998 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.17976931348623157E309) = 0.2211162555880648E306 + (0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E~2, 0.17976931348623157E309) = 0.684210211491E~311 nextAfter (0.123E~2, 0.17976931348623157E309) = 0.12300000000000002E~2 rem (0.123E~2, 0.17976931348623157E309) = 0.123E~2 * (0.123E~2, 0.8988465674311579E308) = 0.1105581277940324E306 + (0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E~2, 0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (0.123E~2, 0.8988465674311579E308) = 0.12300000000000002E~2 rem (0.123E~2, 0.8988465674311579E308) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129E1 + (0.123E~2, 0.123E4) = 0.123000123E4 - (0.123E~2, 0.123E4) = ~0.122999877E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.12298770000000001E2 / (0.123E~2, 0.123E2) = 0.9999999999999999E~4 nextAfter (0.123E~2, 0.123E2) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.3141592653589793E1) = 0.38641589639154456E~2 + (0.123E~2, 0.3141592653589793E1) = 0.3142822653589793E1 - (0.123E~2, 0.3141592653589793E1) = ~0.3140362653589793E1 / (0.123E~2, 0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (0.123E~2, 0.3141592653589793E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.3141592653589793E1) = 0.123E~2 * (0.123E~2, 0.2718281828459045E1) = 0.33434866490046253E~2 + (0.123E~2, 0.2718281828459045E1) = 0.2719511828459045E1 - (0.123E~2, 0.2718281828459045E1) = ~0.2717051828459045E1 / (0.123E~2, 0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (0.123E~2, 0.2718281828459045E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.2718281828459045E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.12423 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300000000000002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.22250738585072014E~307) = 0.2736840845964E~310 + (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, 0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (0.123E~2, 0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.22250738585072014E~307) = 0.0 * (0.123E~2, 0.11125369292536007E~307) = 0.1368420422982E~310 + (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, 0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (0.123E~2, 0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.11125369292536007E~307) = 0.0 * (0.123E~2, 0.5E~323) = 0.0 + (0.123E~2, 0.5E~323) = 0.123E~2 - (0.123E~2, 0.5E~323) = 0.123E~2 / (0.123E~2, 0.5E~323) = inf nextAfter (0.123E~2, 0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, 0.5E~323) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999999999998E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.17976931348623157E309) = ~0.2211162555880648E306 + (0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E~2, ~0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (0.123E~2, ~0.17976931348623157E309) = 0.12299999999999998E~2 rem (0.123E~2, ~0.17976931348623157E309) = 0.123E~2 * (0.123E~2, ~0.8988465674311579E308) = ~0.1105581277940324E306 + (0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E~2, ~0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (0.123E~2, ~0.8988465674311579E308) = 0.12299999999999998E~2 rem (0.123E~2, ~0.8988465674311579E308) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129E1 + (0.123E~2, ~0.123E4) = ~0.122999877E4 - (0.123E~2, ~0.123E4) = 0.123000123E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129E~1 + (0.123E~2, ~0.123E2) = ~0.12298770000000001E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.9999999999999999E~4 nextAfter (0.123E~2, ~0.123E2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.3141592653589793E1) = ~0.38641589639154456E~2 + (0.123E~2, ~0.3141592653589793E1) = ~0.3140362653589793E1 - (0.123E~2, ~0.3141592653589793E1) = 0.3142822653589793E1 / (0.123E~2, ~0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (0.123E~2, ~0.3141592653589793E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.3141592653589793E1) = 0.123E~2 * (0.123E~2, ~0.2718281828459045E1) = ~0.33434866490046253E~2 + (0.123E~2, ~0.2718281828459045E1) = ~0.2717051828459045E1 - (0.123E~2, ~0.2718281828459045E1) = 0.2719511828459045E1 / (0.123E~2, ~0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (0.123E~2, ~0.2718281828459045E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.2718281828459045E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.12423 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.22250738585072014E~307) = ~0.2736840845964E~310 + (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, ~0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (0.123E~2, ~0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.22250738585072014E~307) = 0.0 * (0.123E~2, ~0.11125369292536007E~307) = ~0.1368420422982E~310 + (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, ~0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (0.123E~2, ~0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.11125369292536007E~307) = 0.0 * (0.123E~2, ~0.5E~323) = ~0.0 + (0.123E~2, ~0.5E~323) = 0.123E~2 - (0.123E~2, ~0.5E~323) = 0.123E~2 / (0.123E~2, ~0.5E~323) = ~inf nextAfter (0.123E~2, ~0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, ~0.5E~323) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999999999998E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999999999998E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.22250738585072014E~307, 0.17976931348623157E309) = 0.39999999999999996E1 + (0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.22250738585072014E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.22250738585072014E~307, 0.17976931348623157E309) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.8988465674311579E308) = 0.19999999999999998E1 + (0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.22250738585072014E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.22250738585072014E~307, 0.8988465674311579E308) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E4) = 0.27368408459638577E~304 + (0.22250738585072014E~307, 0.123E4) = 0.123E4 - (0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (0.22250738585072014E~307, 0.123E4) = 0.18090031369976E~310 nextAfter (0.22250738585072014E~307, 0.123E4) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E2) = 0.2736840845963858E~306 + (0.22250738585072014E~307, 0.123E2) = 0.123E2 - (0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (0.22250738585072014E~307, 0.123E2) = 0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, 0.123E2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.3141592653589793E1) = 0.6990275687580919E~307 + (0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.22250738585072014E~307, 0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, 0.3141592653589793E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.2718281828459045E1) = 0.6048377836559378E~307 + (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.22250738585072014E~307, 0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E1) = 0.27368408459638577E~307 + (0.22250738585072014E~307, 0.123E1) = 0.123E1 - (0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (0.22250738585072014E~307, 0.123E1) = 0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, 0.123E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123) = 0.273684084596386E~308 + (0.22250738585072014E~307, 0.123) = 0.123 - (0.22250738585072014E~307, 0.123) = ~0.123 / (0.22250738585072014E~307, 0.123) = 0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, 0.123) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E~2) = 0.2736840845964E~310 + (0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (0.22250738585072014E~307, 0.123E~2) = 0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, 0.123E~2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 + (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.4450147717014403E~307 - (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 / (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.1E1 nextAfter (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.22250738585072014E~307 rem (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 + (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.3337610787760802E~307 - (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2E1 nextAfter (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, 0.5E~323) = 0.0 + (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507202E~307 - (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 / (0.22250738585072014E~307, 0.5E~323) = 0.4503599627370496E16 nextAfter (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.5E~323) = 0.0 * (0.22250738585072014E~307, 0.0) = 0.0 + (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, 0.0) = inf nextAfter (0.22250738585072014E~307, 0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.0) = nan * (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.39999999999999996E1 + (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.19999999999999998E1 + (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E4) = ~0.27368408459638577E~304 + (0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (0.22250738585072014E~307, ~0.123E4) = ~0.18090031369976E~310 nextAfter (0.22250738585072014E~307, ~0.123E4) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E2) = ~0.2736840845963858E~306 + (0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (0.22250738585072014E~307, ~0.123E2) = ~0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, ~0.123E2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.6990275687580919E~307 + (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.6048377836559378E~307 + (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E1) = ~0.27368408459638577E~307 + (0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (0.22250738585072014E~307, ~0.123E1) = ~0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, ~0.123E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123) = ~0.273684084596386E~308 + (0.22250738585072014E~307, ~0.123) = ~0.123 - (0.22250738585072014E~307, ~0.123) = 0.123 / (0.22250738585072014E~307, ~0.123) = ~0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, ~0.123) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E~2) = ~0.2736840845964E~310 + (0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (0.22250738585072014E~307, ~0.123E~2) = ~0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, ~0.123E~2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.0 + (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 - (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.4450147717014403E~307 / (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.1E1 nextAfter (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.0 + (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.3337610787760802E~307 / (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2E1 nextAfter (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, ~0.5E~323) = ~0.0 + (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 - (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507202E~307 / (0.22250738585072014E~307, ~0.5E~323) = ~0.4503599627370496E16 nextAfter (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.5E~323) = 0.0 * (0.22250738585072014E~307, ~0.0) = ~0.0 + (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, ~0.0) = ~inf nextAfter (0.22250738585072014E~307, ~0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.0) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~inf) = ~inf + (0.22250738585072014E~307, ~inf) = ~inf - (0.22250738585072014E~307, ~inf) = inf / (0.22250738585072014E~307, ~inf) = ~0.0 nextAfter (0.22250738585072014E~307, ~inf) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, nan) = nan + (0.22250738585072014E~307, nan) = nan - (0.22250738585072014E~307, nan) = nan / (0.22250738585072014E~307, nan) = nan nextAfter (0.22250738585072014E~307, nan) = nan rem (0.22250738585072014E~307, nan) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.11125369292536007E~307, 0.17976931348623157E309) = 0.19999999999999998E1 + (0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.11125369292536007E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.11125369292536007E~307, 0.17976931348623157E309) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.8988465674311579E308) = 0.9999999999999999 + (0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.11125369292536007E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.11125369292536007E~307, 0.8988465674311579E308) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E4) = 0.13684204229819289E~304 + (0.11125369292536007E~307, 0.123E4) = 0.123E4 - (0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (0.11125369292536007E~307, 0.123E4) = 0.904501568499E~311 nextAfter (0.11125369292536007E~307, 0.123E4) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E2) = 0.1368420422981929E~306 + (0.11125369292536007E~307, 0.123E2) = 0.123E2 - (0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (0.11125369292536007E~307, 0.123E2) = 0.90450156849886E~309 nextAfter (0.11125369292536007E~307, 0.123E2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.3141592653589793E1) = 0.34951378437904593E~307 + (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, 0.3141592653589793E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.2718281828459045E1) = 0.3024188918279689E~307 + (0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.11125369292536007E~307, 0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (0.11125369292536007E~307, 0.2718281828459045E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E1) = 0.1368420422981929E~307 + (0.11125369292536007E~307, 0.123E1) = 0.123E1 - (0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (0.11125369292536007E~307, 0.123E1) = 0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, 0.123E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123) = 0.136842042298193E~308 + (0.11125369292536007E~307, 0.123) = 0.123 - (0.11125369292536007E~307, 0.123) = ~0.123 / (0.11125369292536007E~307, 0.123) = 0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, 0.123) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E~2) = 0.1368420422982E~310 + (0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (0.11125369292536007E~307, 0.123E~2) = 0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, 0.123E~2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.0 + (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.3337610787760802E~307 - (0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 / (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.5 nextAfter (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 + (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.22250738585072014E~307 - (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 / (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.1E1 nextAfter (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 rem (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, 0.5E~323) = 0.0 + (0.11125369292536007E~307, 0.5E~323) = 0.1112536929253601E~307 - (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 / (0.11125369292536007E~307, 0.5E~323) = 0.2251799813685248E16 nextAfter (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.5E~323) = 0.0 * (0.11125369292536007E~307, 0.0) = 0.0 + (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, 0.0) = inf nextAfter (0.11125369292536007E~307, 0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.0) = nan * (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.19999999999999998E1 + (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.9999999999999999 + (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E4) = ~0.13684204229819289E~304 + (0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (0.11125369292536007E~307, ~0.123E4) = ~0.904501568499E~311 nextAfter (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E2) = ~0.1368420422981929E~306 + (0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (0.11125369292536007E~307, ~0.123E2) = ~0.90450156849886E~309 nextAfter (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.34951378437904593E~307 + (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.3024188918279689E~307 + (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E1) = ~0.1368420422981929E~307 + (0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (0.11125369292536007E~307, ~0.123E1) = ~0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123) = ~0.136842042298193E~308 + (0.11125369292536007E~307, ~0.123) = ~0.123 - (0.11125369292536007E~307, ~0.123) = 0.123 / (0.11125369292536007E~307, ~0.123) = ~0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, ~0.123) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E~2) = ~0.1368420422982E~310 + (0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (0.11125369292536007E~307, ~0.123E~2) = ~0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.0 + (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.3337610787760802E~307 / (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.5 nextAfter (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.0 + (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 - (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.22250738585072014E~307 / (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.1E1 nextAfter (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, ~0.5E~323) = ~0.0 + (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 - (0.11125369292536007E~307, ~0.5E~323) = 0.1112536929253601E~307 / (0.11125369292536007E~307, ~0.5E~323) = ~0.2251799813685248E16 nextAfter (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.5E~323) = 0.0 * (0.11125369292536007E~307, ~0.0) = ~0.0 + (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, ~0.0) = ~inf nextAfter (0.11125369292536007E~307, ~0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.0) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~inf) = ~inf + (0.11125369292536007E~307, ~inf) = ~inf - (0.11125369292536007E~307, ~inf) = inf / (0.11125369292536007E~307, ~inf) = ~0.0 nextAfter (0.11125369292536007E~307, ~inf) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, nan) = nan + (0.11125369292536007E~307, nan) = nan - (0.11125369292536007E~307, nan) = nan / (0.11125369292536007E~307, nan) = nan nextAfter (0.11125369292536007E~307, nan) = nan rem (0.11125369292536007E~307, nan) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.5E~323, 0.17976931348623157E309) = 0.8881784197001251E~15 + (0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.5E~323, 0.17976931348623157E309) = 0.0 nextAfter (0.5E~323, 0.17976931348623157E309) = 0.1E~322 rem (0.5E~323, 0.17976931348623157E309) = 0.5E~323 * (0.5E~323, 0.8988465674311579E308) = 0.44408920985006257E~15 + (0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.5E~323, 0.8988465674311579E308) = 0.0 nextAfter (0.5E~323, 0.8988465674311579E308) = 0.1E~322 rem (0.5E~323, 0.8988465674311579E308) = 0.5E~323 * (0.5E~323, 0.123E4) = 0.6077E~320 + (0.5E~323, 0.123E4) = 0.123E4 - (0.5E~323, 0.123E4) = ~0.123E4 / (0.5E~323, 0.123E4) = 0.0 nextAfter (0.5E~323, 0.123E4) = 0.1E~322 rem (0.5E~323, 0.123E4) = 0.5E~323 * (0.5E~323, 0.123E2) = 0.6E~322 + (0.5E~323, 0.123E2) = 0.123E2 - (0.5E~323, 0.123E2) = ~0.123E2 / (0.5E~323, 0.123E2) = 0.0 nextAfter (0.5E~323, 0.123E2) = 0.1E~322 rem (0.5E~323, 0.123E2) = 0.5E~323 * (0.5E~323, 0.3141592653589793E1) = 0.15E~322 + (0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.5E~323, 0.3141592653589793E1) = 0.0 nextAfter (0.5E~323, 0.3141592653589793E1) = 0.1E~322 rem (0.5E~323, 0.3141592653589793E1) = 0.5E~323 * (0.5E~323, 0.2718281828459045E1) = 0.15E~322 + (0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.5E~323, 0.2718281828459045E1) = 0.0 nextAfter (0.5E~323, 0.2718281828459045E1) = 0.1E~322 rem (0.5E~323, 0.2718281828459045E1) = 0.5E~323 * (0.5E~323, 0.123E1) = 0.5E~323 + (0.5E~323, 0.123E1) = 0.123E1 - (0.5E~323, 0.123E1) = ~0.123E1 / (0.5E~323, 0.123E1) = 0.5E~323 nextAfter (0.5E~323, 0.123E1) = 0.1E~322 rem (0.5E~323, 0.123E1) = 0.5E~323 * (0.5E~323, 0.123) = 0.0 + (0.5E~323, 0.123) = 0.123 - (0.5E~323, 0.123) = ~0.123 / (0.5E~323, 0.123) = 0.4E~322 nextAfter (0.5E~323, 0.123) = 0.1E~322 rem (0.5E~323, 0.123) = 0.5E~323 * (0.5E~323, 0.123E~2) = 0.0 + (0.5E~323, 0.123E~2) = 0.123E~2 - (0.5E~323, 0.123E~2) = ~0.123E~2 / (0.5E~323, 0.123E~2) = 0.4017E~320 nextAfter (0.5E~323, 0.123E~2) = 0.1E~322 rem (0.5E~323, 0.123E~2) = 0.5E~323 * (0.5E~323, 0.22250738585072014E~307) = 0.0 + (0.5E~323, 0.22250738585072014E~307) = 0.2225073858507202E~307 - (0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507201E~307 / (0.5E~323, 0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (0.5E~323, 0.22250738585072014E~307) = 0.1E~322 rem (0.5E~323, 0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, 0.11125369292536007E~307) = 0.0 + (0.5E~323, 0.11125369292536007E~307) = 0.1112536929253601E~307 - (0.5E~323, 0.11125369292536007E~307) = ~0.11125369292536E~307 / (0.5E~323, 0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (0.5E~323, 0.11125369292536007E~307) = 0.1E~322 rem (0.5E~323, 0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, 0.5E~323) = 0.0 + (0.5E~323, 0.5E~323) = 0.1E~322 - (0.5E~323, 0.5E~323) = 0.0 / (0.5E~323, 0.5E~323) = 0.1E1 nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 rem (0.5E~323, 0.5E~323) = 0.0 * (0.5E~323, 0.0) = 0.0 + (0.5E~323, 0.0) = 0.5E~323 - (0.5E~323, 0.0) = 0.5E~323 / (0.5E~323, 0.0) = inf nextAfter (0.5E~323, 0.0) = 0.0 rem (0.5E~323, 0.0) = nan * (0.5E~323, ~0.17976931348623157E309) = ~0.8881784197001251E~15 + (0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.5E~323, ~0.17976931348623157E309) = ~0.0 nextAfter (0.5E~323, ~0.17976931348623157E309) = 0.0 rem (0.5E~323, ~0.17976931348623157E309) = 0.5E~323 * (0.5E~323, ~0.8988465674311579E308) = ~0.44408920985006257E~15 + (0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.5E~323, ~0.8988465674311579E308) = ~0.0 nextAfter (0.5E~323, ~0.8988465674311579E308) = 0.0 rem (0.5E~323, ~0.8988465674311579E308) = 0.5E~323 * (0.5E~323, ~0.123E4) = ~0.6077E~320 + (0.5E~323, ~0.123E4) = ~0.123E4 - (0.5E~323, ~0.123E4) = 0.123E4 / (0.5E~323, ~0.123E4) = ~0.0 nextAfter (0.5E~323, ~0.123E4) = 0.0 rem (0.5E~323, ~0.123E4) = 0.5E~323 * (0.5E~323, ~0.123E2) = ~0.6E~322 + (0.5E~323, ~0.123E2) = ~0.123E2 - (0.5E~323, ~0.123E2) = 0.123E2 / (0.5E~323, ~0.123E2) = ~0.0 nextAfter (0.5E~323, ~0.123E2) = 0.0 rem (0.5E~323, ~0.123E2) = 0.5E~323 * (0.5E~323, ~0.3141592653589793E1) = ~0.15E~322 + (0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.5E~323, ~0.3141592653589793E1) = ~0.0 nextAfter (0.5E~323, ~0.3141592653589793E1) = 0.0 rem (0.5E~323, ~0.3141592653589793E1) = 0.5E~323 * (0.5E~323, ~0.2718281828459045E1) = ~0.15E~322 + (0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.5E~323, ~0.2718281828459045E1) = ~0.0 nextAfter (0.5E~323, ~0.2718281828459045E1) = 0.0 rem (0.5E~323, ~0.2718281828459045E1) = 0.5E~323 * (0.5E~323, ~0.123E1) = ~0.5E~323 + (0.5E~323, ~0.123E1) = ~0.123E1 - (0.5E~323, ~0.123E1) = 0.123E1 / (0.5E~323, ~0.123E1) = ~0.5E~323 nextAfter (0.5E~323, ~0.123E1) = 0.0 rem (0.5E~323, ~0.123E1) = 0.5E~323 * (0.5E~323, ~0.123) = ~0.0 + (0.5E~323, ~0.123) = ~0.123 - (0.5E~323, ~0.123) = 0.123 / (0.5E~323, ~0.123) = ~0.4E~322 nextAfter (0.5E~323, ~0.123) = 0.0 rem (0.5E~323, ~0.123) = 0.5E~323 * (0.5E~323, ~0.123E~2) = ~0.0 + (0.5E~323, ~0.123E~2) = ~0.123E~2 - (0.5E~323, ~0.123E~2) = 0.123E~2 / (0.5E~323, ~0.123E~2) = ~0.4017E~320 nextAfter (0.5E~323, ~0.123E~2) = 0.0 rem (0.5E~323, ~0.123E~2) = 0.5E~323 * (0.5E~323, ~0.22250738585072014E~307) = ~0.0 + (0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507201E~307 - (0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507202E~307 / (0.5E~323, ~0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (0.5E~323, ~0.22250738585072014E~307) = 0.0 rem (0.5E~323, ~0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, ~0.11125369292536007E~307) = ~0.0 + (0.5E~323, ~0.11125369292536007E~307) = ~0.11125369292536E~307 - (0.5E~323, ~0.11125369292536007E~307) = 0.1112536929253601E~307 / (0.5E~323, ~0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (0.5E~323, ~0.11125369292536007E~307) = 0.0 rem (0.5E~323, ~0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, ~0.5E~323) = ~0.0 + (0.5E~323, ~0.5E~323) = 0.0 - (0.5E~323, ~0.5E~323) = 0.1E~322 / (0.5E~323, ~0.5E~323) = ~0.1E1 nextAfter (0.5E~323, ~0.5E~323) = 0.0 rem (0.5E~323, ~0.5E~323) = 0.0 * (0.5E~323, ~0.0) = ~0.0 + (0.5E~323, ~0.0) = 0.5E~323 - (0.5E~323, ~0.0) = 0.5E~323 / (0.5E~323, ~0.0) = ~inf nextAfter (0.5E~323, ~0.0) = 0.0 rem (0.5E~323, ~0.0) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.5E~323, ~inf) = ~inf + (0.5E~323, ~inf) = ~inf - (0.5E~323, ~inf) = inf / (0.5E~323, ~inf) = ~0.0 nextAfter (0.5E~323, ~inf) = 0.0 rem (0.5E~323, ~inf) = 0.5E~323 * (0.5E~323, nan) = nan + (0.5E~323, nan) = nan - (0.5E~323, nan) = nan / (0.5E~323, nan) = nan nextAfter (0.5E~323, nan) = nan rem (0.5E~323, nan) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.0, 0.17976931348623157E309) = 0.0 + (0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.0, 0.17976931348623157E309) = 0.0 nextAfter (0.0, 0.17976931348623157E309) = 0.5E~323 rem (0.0, 0.17976931348623157E309) = 0.0 * (0.0, 0.8988465674311579E308) = 0.0 + (0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.0, 0.8988465674311579E308) = 0.0 nextAfter (0.0, 0.8988465674311579E308) = 0.5E~323 rem (0.0, 0.8988465674311579E308) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.5E~323 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.5E~323 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.3141592653589793E1) = 0.0 + (0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.0, 0.3141592653589793E1) = 0.0 nextAfter (0.0, 0.3141592653589793E1) = 0.5E~323 rem (0.0, 0.3141592653589793E1) = 0.0 * (0.0, 0.2718281828459045E1) = 0.0 + (0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.0, 0.2718281828459045E1) = 0.0 nextAfter (0.0, 0.2718281828459045E1) = 0.5E~323 rem (0.0, 0.2718281828459045E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.5E~323 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.5E~323 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.5E~323 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.22250738585072014E~307) = 0.0 + (0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (0.0, 0.22250738585072014E~307) = 0.0 nextAfter (0.0, 0.22250738585072014E~307) = 0.5E~323 rem (0.0, 0.22250738585072014E~307) = 0.0 * (0.0, 0.11125369292536007E~307) = 0.0 + (0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (0.0, 0.11125369292536007E~307) = 0.0 nextAfter (0.0, 0.11125369292536007E~307) = 0.5E~323 rem (0.0, 0.11125369292536007E~307) = 0.0 * (0.0, 0.5E~323) = 0.0 + (0.0, 0.5E~323) = 0.5E~323 - (0.0, 0.5E~323) = ~0.5E~323 / (0.0, 0.5E~323) = 0.0 nextAfter (0.0, 0.5E~323) = 0.5E~323 rem (0.0, 0.5E~323) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.17976931348623157E309) = ~0.0 + (0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.0, ~0.17976931348623157E309) = ~0.0 nextAfter (0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (0.0, ~0.17976931348623157E309) = 0.0 * (0.0, ~0.8988465674311579E308) = ~0.0 + (0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.0, ~0.8988465674311579E308) = ~0.0 nextAfter (0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (0.0, ~0.8988465674311579E308) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.5E~323 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.5E~323 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.3141592653589793E1) = ~0.0 + (0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.0, ~0.3141592653589793E1) = ~0.0 nextAfter (0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (0.0, ~0.3141592653589793E1) = 0.0 * (0.0, ~0.2718281828459045E1) = ~0.0 + (0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.0, ~0.2718281828459045E1) = ~0.0 nextAfter (0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (0.0, ~0.2718281828459045E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.5E~323 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.5E~323 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.5E~323 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.22250738585072014E~307) = ~0.0 + (0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (0.0, ~0.22250738585072014E~307) = ~0.0 nextAfter (0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (0.0, ~0.22250738585072014E~307) = 0.0 * (0.0, ~0.11125369292536007E~307) = ~0.0 + (0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.0, ~0.11125369292536007E~307) = ~0.0 nextAfter (0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (0.0, ~0.11125369292536007E~307) = 0.0 * (0.0, ~0.5E~323) = ~0.0 + (0.0, ~0.5E~323) = ~0.5E~323 - (0.0, ~0.5E~323) = 0.5E~323 / (0.0, ~0.5E~323) = ~0.0 nextAfter (0.0, ~0.5E~323) = ~0.5E~323 rem (0.0, ~0.5E~323) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.5E~323 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf + (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 - (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf / (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.1E1 nextAfter (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf + (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf / (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.2E1 nextAfter (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, 0.123E4) = ~inf + (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E4) = ~0.1461539134034403E306 nextAfter (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E4) = 0.0 * (~0.17976931348623157E309, 0.123E2) = ~inf + (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E2) = ~0.1461539134034403E308 nextAfter (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E2) = 0.0 * (~0.17976931348623157E309, 0.3141592653589793E1) = ~inf + (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, 0.2718281828459045E1) = ~inf + (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123E1) = ~inf + (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E1) = ~0.1461539134034403E309 nextAfter (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123) = ~0.22111625558806483E308 + (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123) = ~inf nextAfter (~0.17976931348623157E309, 0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123) = inf * (~0.17976931348623157E309, 0.123E~2) = ~0.2211162555880648E306 + (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E~2) = ~inf nextAfter (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E~2) = inf * (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.39999999999999996E1 + (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.22250738585072014E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.22250738585072014E~307) = inf * (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.19999999999999998E1 + (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.11125369292536007E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.11125369292536007E~307) = inf * (~0.17976931348623157E309, 0.5E~323) = ~0.8881784197001251E~15 + (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.5E~323) = ~inf nextAfter (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.5E~323) = inf * (~0.17976931348623157E309, 0.0) = ~0.0 + (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.0) = ~inf nextAfter (~0.17976931348623157E309, 0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.0) = nan * (~0.17976931348623157E309, ~0.17976931348623157E309) = inf + (~0.17976931348623157E309, ~0.17976931348623157E309) = ~inf - (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 / (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.1E1 nextAfter (~0.17976931348623157E309, ~0.17976931348623157E309) = ~0.17976931348623157E309 rem (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, ~0.8988465674311579E308) = inf + (~0.17976931348623157E309, ~0.8988465674311579E308) = ~inf - (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.2E1 nextAfter (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, ~0.123E4) = inf + (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E4) = 0.1461539134034403E306 nextAfter (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E4) = 0.0 * (~0.17976931348623157E309, ~0.123E2) = inf + (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E2) = 0.1461539134034403E308 nextAfter (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E2) = 0.0 * (~0.17976931348623157E309, ~0.3141592653589793E1) = inf + (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, ~0.2718281828459045E1) = inf + (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.2718281828459045E1) = 0.661334345850887E308 nextAfter (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123E1) = inf + (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E1) = 0.1461539134034403E309 nextAfter (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123) = 0.22111625558806483E308 + (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123) = inf nextAfter (~0.17976931348623157E309, ~0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123) = inf * (~0.17976931348623157E309, ~0.123E~2) = 0.2211162555880648E306 + (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E~2) = inf nextAfter (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E~2) = inf * (~0.17976931348623157E309, ~0.22250738585072014E~307) = 0.39999999999999996E1 + (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf nextAfter (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf * (~0.17976931348623157E309, ~0.11125369292536007E~307) = 0.19999999999999998E1 + (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf nextAfter (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf * (~0.17976931348623157E309, ~0.5E~323) = 0.8881784197001251E~15 + (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.5E~323) = inf nextAfter (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.5E~323) = inf * (~0.17976931348623157E309, ~0.0) = 0.0 + (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.0) = inf nextAfter (~0.17976931348623157E309, ~0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.0) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, ~inf) = inf + (~0.17976931348623157E309, ~inf) = ~inf - (~0.17976931348623157E309, ~inf) = inf / (~0.17976931348623157E309, ~inf) = 0.0 nextAfter (~0.17976931348623157E309, ~inf) = ~inf rem (~0.17976931348623157E309, ~inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, nan) = nan + (~0.17976931348623157E309, nan) = nan - (~0.17976931348623157E309, nan) = nan / (~0.17976931348623157E309, nan) = nan nextAfter (~0.17976931348623157E309, nan) = nan rem (~0.17976931348623157E309, nan) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf + (~0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 - (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf / (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.5 nextAfter (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, 0.8988465674311579E308) = ~inf + (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 - (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.17976931348623157E309 / (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.1E1 nextAfter (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, 0.123E4) = ~inf + (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E4) = ~0.7307695670172015E305 nextAfter (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E4) = 0.0 * (~0.8988465674311579E308, 0.123E2) = ~inf + (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E2) = ~0.7307695670172014E307 nextAfter (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E2) = 0.0 * (~0.8988465674311579E308, 0.3141592653589793E1) = ~inf + (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, 0.2718281828459045E1) = ~inf + (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123E1) = ~0.1105581277940324E309 + (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E1) = ~0.7307695670172015E308 nextAfter (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123) = ~0.11055812779403241E308 + (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123) = ~inf nextAfter (~0.8988465674311579E308, 0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123) = inf * (~0.8988465674311579E308, 0.123E~2) = ~0.1105581277940324E306 + (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E~2) = ~inf nextAfter (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E~2) = inf * (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.19999999999999998E1 + (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.22250738585072014E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.22250738585072014E~307) = inf * (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.9999999999999999 + (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.11125369292536007E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.11125369292536007E~307) = inf * (~0.8988465674311579E308, 0.5E~323) = ~0.44408920985006257E~15 + (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.5E~323) = ~inf nextAfter (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.5E~323) = inf * (~0.8988465674311579E308, 0.0) = ~0.0 + (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.0) = ~inf nextAfter (~0.8988465674311579E308, 0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.0) = nan * (~0.8988465674311579E308, ~0.17976931348623157E309) = inf + (~0.8988465674311579E308, ~0.17976931348623157E309) = ~inf - (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 / (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.5 nextAfter (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~0.8988465674311579E308) = inf + (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.17976931348623157E309 - (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 / (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.1E1 nextAfter (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.8988465674311579E308 rem (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, ~0.123E4) = inf + (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E4) = 0.7307695670172015E305 nextAfter (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E4) = 0.0 * (~0.8988465674311579E308, ~0.123E2) = inf + (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E2) = 0.7307695670172014E307 nextAfter (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E2) = 0.0 * (~0.8988465674311579E308, ~0.3141592653589793E1) = inf + (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, ~0.2718281828459045E1) = inf + (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123E1) = 0.1105581277940324E309 + (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E1) = 0.7307695670172015E308 nextAfter (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123) = 0.11055812779403241E308 + (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123) = inf nextAfter (~0.8988465674311579E308, ~0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123) = inf * (~0.8988465674311579E308, ~0.123E~2) = 0.1105581277940324E306 + (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E~2) = inf nextAfter (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E~2) = inf * (~0.8988465674311579E308, ~0.22250738585072014E~307) = 0.19999999999999998E1 + (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf nextAfter (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf * (~0.8988465674311579E308, ~0.11125369292536007E~307) = 0.9999999999999999 + (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf nextAfter (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf * (~0.8988465674311579E308, ~0.5E~323) = 0.44408920985006257E~15 + (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.5E~323) = inf nextAfter (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.5E~323) = inf * (~0.8988465674311579E308, ~0.0) = 0.0 + (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.0) = inf nextAfter (~0.8988465674311579E308, ~0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.0) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~inf) = inf + (~0.8988465674311579E308, ~inf) = ~inf - (~0.8988465674311579E308, ~inf) = inf / (~0.8988465674311579E308, ~inf) = 0.0 nextAfter (~0.8988465674311579E308, ~inf) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, nan) = nan + (~0.8988465674311579E308, nan) = nan - (~0.8988465674311579E308, nan) = nan / (~0.8988465674311579E308, nan) = nan nextAfter (~0.8988465674311579E308, nan) = nan rem (~0.8988465674311579E308, nan) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.123E4, 0.17976931348623157E309) = ~inf + (~0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E4, 0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (~0.123E4, 0.17976931348623157E309) = ~0.12299999999999998E4 rem (~0.123E4, 0.17976931348623157E309) = ~0.123E4 * (~0.123E4, 0.8988465674311579E308) = ~inf + (~0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E4, 0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (~0.123E4, 0.8988465674311579E308) = ~0.12299999999999998E4 rem (~0.123E4, 0.8988465674311579E308) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.3141592653589793E1) = ~0.38641589639154454E4 + (~0.123E4, 0.3141592653589793E1) = ~0.122685840734641E4 - (~0.123E4, 0.3141592653589793E1) = ~0.123314159265359E4 / (~0.123E4, 0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (~0.123E4, 0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, 0.2718281828459045E1) = ~0.33434866490046256E4 + (~0.123E4, 0.2718281828459045E1) = ~0.1227281718171541E4 - (~0.123E4, 0.2718281828459045E1) = ~0.1232718281828459E4 / (~0.123E4, 0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (~0.123E4, 0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999999999998E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129E1 + (~0.123E4, 0.123E~2) = ~0.122999877E4 - (~0.123E4, 0.123E~2) = ~0.123000123E4 / (~0.123E4, 0.123E~2) = ~0.1E7 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E~2) = 0.0 * (~0.123E4, 0.22250738585072014E~307) = ~0.27368408459638577E~304 + (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E4, 0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.22250738585072014E~307) = inf * (~0.123E4, 0.11125369292536007E~307) = ~0.13684204229819289E~304 + (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E4, 0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.11125369292536007E~307) = inf * (~0.123E4, 0.5E~323) = ~0.6077E~320 + (~0.123E4, 0.5E~323) = ~0.123E4 - (~0.123E4, 0.5E~323) = ~0.123E4 / (~0.123E4, 0.5E~323) = ~inf nextAfter (~0.123E4, 0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, 0.5E~323) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999999999998E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.17976931348623157E309) = inf + (~0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E4, ~0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (~0.123E4, ~0.17976931348623157E309) = ~0.12300000000000002E4 rem (~0.123E4, ~0.17976931348623157E309) = ~0.123E4 * (~0.123E4, ~0.8988465674311579E308) = inf + (~0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E4, ~0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (~0.123E4, ~0.8988465674311579E308) = ~0.12300000000000002E4 rem (~0.123E4, ~0.8988465674311579E308) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.3141592653589793E1) = 0.38641589639154454E4 + (~0.123E4, ~0.3141592653589793E1) = ~0.123314159265359E4 - (~0.123E4, ~0.3141592653589793E1) = ~0.122685840734641E4 / (~0.123E4, ~0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (~0.123E4, ~0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, ~0.2718281828459045E1) = 0.33434866490046256E4 + (~0.123E4, ~0.2718281828459045E1) = ~0.1232718281828459E4 - (~0.123E4, ~0.2718281828459045E1) = ~0.1227281718171541E4 / (~0.123E4, ~0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (~0.123E4, ~0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129E1 + (~0.123E4, ~0.123E~2) = ~0.123000123E4 - (~0.123E4, ~0.123E~2) = ~0.122999877E4 / (~0.123E4, ~0.123E~2) = 0.1E7 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E~2) = 0.0 * (~0.123E4, ~0.22250738585072014E~307) = 0.27368408459638577E~304 + (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, ~0.22250738585072014E~307) = inf nextAfter (~0.123E4, ~0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.22250738585072014E~307) = inf * (~0.123E4, ~0.11125369292536007E~307) = 0.13684204229819289E~304 + (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, ~0.11125369292536007E~307) = inf nextAfter (~0.123E4, ~0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.11125369292536007E~307) = inf * (~0.123E4, ~0.5E~323) = 0.6077E~320 + (~0.123E4, ~0.5E~323) = ~0.123E4 - (~0.123E4, ~0.5E~323) = ~0.123E4 / (~0.123E4, ~0.5E~323) = inf nextAfter (~0.123E4, ~0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, ~0.5E~323) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999999999998E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300000000000002E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.17976931348623157E309) = ~inf + (~0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E2, 0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (~0.123E2, 0.17976931348623157E309) = ~0.12299999999999999E2 rem (~0.123E2, 0.17976931348623157E309) = ~0.123E2 * (~0.123E2, 0.8988465674311579E308) = ~inf + (~0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E2, 0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (~0.123E2, 0.8988465674311579E308) = ~0.12299999999999999E2 rem (~0.123E2, 0.8988465674311579E308) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129000000000002E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.3141592653589793E1) = ~0.3864158963915446E2 + (~0.123E2, 0.3141592653589793E1) = ~0.9158407346410208E1 - (~0.123E2, 0.3141592653589793E1) = ~0.15441592653589794E2 / (~0.123E2, 0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (~0.123E2, 0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, 0.2718281828459045E1) = ~0.33434866490046254E2 + (~0.123E2, 0.2718281828459045E1) = ~0.9581718171540956E1 - (~0.123E2, 0.2718281828459045E1) = ~0.15018281828459045E2 / (~0.123E2, 0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (~0.123E2, 0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, 0.123E1) = ~0.15129000000000001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530000000000001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129000000000001E1 + (~0.123E2, 0.123) = ~0.12177000000000001E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.10000000000000001E3 nextAfter (~0.123E2, 0.123) = ~0.12299999999999999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129E~1 + (~0.123E2, 0.123E~2) = ~0.12298770000000001E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, 0.22250738585072014E~307) = ~0.2736840845963858E~306 + (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E2, 0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.22250738585072014E~307) = inf * (~0.123E2, 0.11125369292536007E~307) = ~0.1368420422981929E~306 + (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E2, 0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.11125369292536007E~307) = inf * (~0.123E2, 0.5E~323) = ~0.6E~322 + (~0.123E2, 0.5E~323) = ~0.123E2 - (~0.123E2, 0.5E~323) = ~0.123E2 / (~0.123E2, 0.5E~323) = ~inf nextAfter (~0.123E2, 0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, 0.5E~323) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999999999999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.17976931348623157E309) = inf + (~0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E2, ~0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (~0.123E2, ~0.17976931348623157E309) = ~0.12300000000000002E2 rem (~0.123E2, ~0.17976931348623157E309) = ~0.123E2 * (~0.123E2, ~0.8988465674311579E308) = inf + (~0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E2, ~0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (~0.123E2, ~0.8988465674311579E308) = ~0.12300000000000002E2 rem (~0.123E2, ~0.8988465674311579E308) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300000000000002E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129000000000002E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.3141592653589793E1) = 0.3864158963915446E2 + (~0.123E2, ~0.3141592653589793E1) = ~0.15441592653589794E2 - (~0.123E2, ~0.3141592653589793E1) = ~0.9158407346410208E1 / (~0.123E2, ~0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (~0.123E2, ~0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, ~0.2718281828459045E1) = 0.33434866490046254E2 + (~0.123E2, ~0.2718281828459045E1) = ~0.15018281828459045E2 - (~0.123E2, ~0.2718281828459045E1) = ~0.9581718171540956E1 / (~0.123E2, ~0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (~0.123E2, ~0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, ~0.123E1) = 0.15129000000000001E2 + (~0.123E2, ~0.123E1) = ~0.13530000000000001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129000000000001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177000000000001E2 / (~0.123E2, ~0.123) = 0.10000000000000001E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.12298770000000001E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, ~0.22250738585072014E~307) = 0.2736840845963858E~306 + (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, ~0.22250738585072014E~307) = inf nextAfter (~0.123E2, ~0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.22250738585072014E~307) = inf * (~0.123E2, ~0.11125369292536007E~307) = 0.1368420422981929E~306 + (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, ~0.11125369292536007E~307) = inf nextAfter (~0.123E2, ~0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.11125369292536007E~307) = inf * (~0.123E2, ~0.5E~323) = 0.6E~322 + (~0.123E2, ~0.5E~323) = ~0.123E2 - (~0.123E2, ~0.5E~323) = ~0.123E2 / (~0.123E2, ~0.5E~323) = inf nextAfter (~0.123E2, ~0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, ~0.5E~323) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999999999999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300000000000002E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.3141592653589793E1, 0.17976931348623157E309) = ~inf + (~0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.8988465674311579E308) = ~inf + (~0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E4) = ~0.38641589639154454E4 + (~0.3141592653589793E1, 0.123E4) = 0.122685840734641E4 - (~0.3141592653589793E1, 0.123E4) = ~0.123314159265359E4 / (~0.3141592653589793E1, 0.123E4) = ~0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, 0.123E4) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E2) = ~0.3864158963915446E2 + (~0.3141592653589793E1, 0.123E2) = 0.9158407346410208E1 - (~0.3141592653589793E1, 0.123E2) = ~0.15441592653589794E2 / (~0.3141592653589793E1, 0.123E2) = ~0.2554140368772189 nextAfter (~0.3141592653589793E1, 0.123E2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.9869604401089358E1 + (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 - (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.6283185307179586E1 / (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.1E1 nextAfter (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8539734222673566E1 + (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 - (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.5859874482048838E1 / (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, 0.123E1) = ~0.38641589639154454E1 + (~0.3141592653589793E1, 0.123E1) = ~0.19115926535897931E1 - (~0.3141592653589793E1, 0.123E1) = ~0.43715926535897935E1 / (~0.3141592653589793E1, 0.123E1) = ~0.25541403687721895E1 nextAfter (~0.3141592653589793E1, 0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, 0.123) = ~0.38641589639154456 + (~0.3141592653589793E1, 0.123) = ~0.3018592653589793E1 - (~0.3141592653589793E1, 0.123) = ~0.32645926535897933E1 / (~0.3141592653589793E1, 0.123) = ~0.25541403687721896E2 nextAfter (~0.3141592653589793E1, 0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, 0.123E~2) = ~0.38641589639154456E~2 + (~0.3141592653589793E1, 0.123E~2) = ~0.3140362653589793E1 - (~0.3141592653589793E1, 0.123E~2) = ~0.3142822653589793E1 / (~0.3141592653589793E1, 0.123E~2) = ~0.25541403687721895E4 nextAfter (~0.3141592653589793E1, 0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.6990275687580919E~307 + (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.34951378437904593E~307 + (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.11125369292536007E~307) = inf * (~0.3141592653589793E1, 0.5E~323) = ~0.15E~322 + (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.5E~323) = ~inf nextAfter (~0.3141592653589793E1, 0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.5E~323) = inf * (~0.3141592653589793E1, 0.0) = ~0.0 + (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.0) = ~inf nextAfter (~0.3141592653589793E1, 0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.0) = nan * (~0.3141592653589793E1, ~0.17976931348623157E309) = inf + (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.8988465674311579E308) = inf + (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E4) = 0.38641589639154454E4 + (~0.3141592653589793E1, ~0.123E4) = ~0.123314159265359E4 - (~0.3141592653589793E1, ~0.123E4) = 0.122685840734641E4 / (~0.3141592653589793E1, ~0.123E4) = 0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, ~0.123E4) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E2) = 0.3864158963915446E2 + (~0.3141592653589793E1, ~0.123E2) = ~0.15441592653589794E2 - (~0.3141592653589793E1, ~0.123E2) = 0.9158407346410208E1 / (~0.3141592653589793E1, ~0.123E2) = 0.2554140368772189 nextAfter (~0.3141592653589793E1, ~0.123E2) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.9869604401089358E1 + (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.6283185307179586E1 - (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 / (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.1E1 nextAfter (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.3141592653589793E1 rem (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.8539734222673566E1 + (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.5859874482048838E1 - (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 / (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, ~0.123E1) = 0.38641589639154454E1 + (~0.3141592653589793E1, ~0.123E1) = ~0.43715926535897935E1 - (~0.3141592653589793E1, ~0.123E1) = ~0.19115926535897931E1 / (~0.3141592653589793E1, ~0.123E1) = 0.25541403687721895E1 nextAfter (~0.3141592653589793E1, ~0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, ~0.123) = 0.38641589639154456 + (~0.3141592653589793E1, ~0.123) = ~0.32645926535897933E1 - (~0.3141592653589793E1, ~0.123) = ~0.3018592653589793E1 / (~0.3141592653589793E1, ~0.123) = 0.25541403687721896E2 nextAfter (~0.3141592653589793E1, ~0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, ~0.123E~2) = 0.38641589639154456E~2 + (~0.3141592653589793E1, ~0.123E~2) = ~0.3142822653589793E1 - (~0.3141592653589793E1, ~0.123E~2) = ~0.3140362653589793E1 / (~0.3141592653589793E1, ~0.123E~2) = 0.25541403687721895E4 nextAfter (~0.3141592653589793E1, ~0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.6990275687580919E~307 + (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, ~0.11125369292536007E~307) = 0.34951378437904593E~307 + (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf nextAfter (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf * (~0.3141592653589793E1, ~0.5E~323) = 0.15E~322 + (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.5E~323) = inf nextAfter (~0.3141592653589793E1, ~0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.5E~323) = inf * (~0.3141592653589793E1, ~0.0) = 0.0 + (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.0) = inf nextAfter (~0.3141592653589793E1, ~0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.0) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~inf) = inf + (~0.3141592653589793E1, ~inf) = ~inf - (~0.3141592653589793E1, ~inf) = inf / (~0.3141592653589793E1, ~inf) = 0.0 nextAfter (~0.3141592653589793E1, ~inf) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, nan) = nan + (~0.3141592653589793E1, nan) = nan - (~0.3141592653589793E1, nan) = nan / (~0.3141592653589793E1, nan) = nan nextAfter (~0.3141592653589793E1, nan) = nan rem (~0.3141592653589793E1, nan) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.2718281828459045E1, 0.17976931348623157E309) = ~inf + (~0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.8988465674311579E308) = ~inf + (~0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E4) = ~0.33434866490046256E4 + (~0.2718281828459045E1, 0.123E4) = 0.1227281718171541E4 - (~0.2718281828459045E1, 0.123E4) = ~0.1232718281828459E4 / (~0.2718281828459045E1, 0.123E4) = ~0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, 0.123E4) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E2) = ~0.33434866490046254E2 + (~0.2718281828459045E1, 0.123E2) = 0.9581718171540956E1 - (~0.2718281828459045E1, 0.123E2) = ~0.15018281828459045E2 / (~0.2718281828459045E1, 0.123E2) = ~0.22099852263894673 nextAfter (~0.2718281828459045E1, 0.123E2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8539734222673566E1 + (~0.2718281828459045E1, 0.3141592653589793E1) = 0.423310825130748 - (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.5859874482048838E1 / (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8652559794322651 nextAfter (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.73890560989306495E1 + (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 - (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.543656365691809E1 / (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.1E1 nextAfter (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, 0.123E1) = ~0.33434866490046256E1 + (~0.2718281828459045E1, 0.123E1) = ~0.1488281828459045E1 - (~0.2718281828459045E1, 0.123E1) = ~0.3948281828459045E1 / (~0.2718281828459045E1, 0.123E1) = ~0.22099852263894677E1 nextAfter (~0.2718281828459045E1, 0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, 0.123) = ~0.33434866490046256 + (~0.2718281828459045E1, 0.123) = ~0.25952818284590453E1 - (~0.2718281828459045E1, 0.123) = ~0.2841281828459045E1 / (~0.2718281828459045E1, 0.123) = ~0.22099852263894675E2 nextAfter (~0.2718281828459045E1, 0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, 0.123E~2) = ~0.33434866490046253E~2 + (~0.2718281828459045E1, 0.123E~2) = ~0.2717051828459045E1 - (~0.2718281828459045E1, 0.123E~2) = ~0.2719511828459045E1 / (~0.2718281828459045E1, 0.123E~2) = ~0.22099852263894677E4 nextAfter (~0.2718281828459045E1, 0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.6048377836559378E~307 + (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.3024188918279689E~307 + (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.11125369292536007E~307) = inf * (~0.2718281828459045E1, 0.5E~323) = ~0.15E~322 + (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.5E~323) = ~inf nextAfter (~0.2718281828459045E1, 0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.5E~323) = inf * (~0.2718281828459045E1, 0.0) = ~0.0 + (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.0) = ~inf nextAfter (~0.2718281828459045E1, 0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.0) = nan * (~0.2718281828459045E1, ~0.17976931348623157E309) = inf + (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.8988465674311579E308) = inf + (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E4) = 0.33434866490046256E4 + (~0.2718281828459045E1, ~0.123E4) = ~0.1232718281828459E4 - (~0.2718281828459045E1, ~0.123E4) = 0.1227281718171541E4 / (~0.2718281828459045E1, ~0.123E4) = 0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, ~0.123E4) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E2) = 0.33434866490046254E2 + (~0.2718281828459045E1, ~0.123E2) = ~0.15018281828459045E2 - (~0.2718281828459045E1, ~0.123E2) = 0.9581718171540956E1 / (~0.2718281828459045E1, ~0.123E2) = 0.22099852263894673 nextAfter (~0.2718281828459045E1, ~0.123E2) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8539734222673566E1 + (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.5859874482048838E1 - (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.423310825130748 / (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8652559794322651 nextAfter (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.73890560989306495E1 + (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.543656365691809E1 - (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 / (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.1E1 nextAfter (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.2718281828459045E1 rem (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, ~0.123E1) = 0.33434866490046256E1 + (~0.2718281828459045E1, ~0.123E1) = ~0.3948281828459045E1 - (~0.2718281828459045E1, ~0.123E1) = ~0.1488281828459045E1 / (~0.2718281828459045E1, ~0.123E1) = 0.22099852263894677E1 nextAfter (~0.2718281828459045E1, ~0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, ~0.123) = 0.33434866490046256 + (~0.2718281828459045E1, ~0.123) = ~0.2841281828459045E1 - (~0.2718281828459045E1, ~0.123) = ~0.25952818284590453E1 / (~0.2718281828459045E1, ~0.123) = 0.22099852263894675E2 nextAfter (~0.2718281828459045E1, ~0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, ~0.123E~2) = 0.33434866490046253E~2 + (~0.2718281828459045E1, ~0.123E~2) = ~0.2719511828459045E1 - (~0.2718281828459045E1, ~0.123E~2) = ~0.2717051828459045E1 / (~0.2718281828459045E1, ~0.123E~2) = 0.22099852263894677E4 nextAfter (~0.2718281828459045E1, ~0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.6048377836559378E~307 + (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, ~0.11125369292536007E~307) = 0.3024188918279689E~307 + (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf nextAfter (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf * (~0.2718281828459045E1, ~0.5E~323) = 0.15E~322 + (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.5E~323) = inf nextAfter (~0.2718281828459045E1, ~0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.5E~323) = inf * (~0.2718281828459045E1, ~0.0) = 0.0 + (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.0) = inf nextAfter (~0.2718281828459045E1, ~0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.0) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~inf) = inf + (~0.2718281828459045E1, ~inf) = ~inf - (~0.2718281828459045E1, ~inf) = inf / (~0.2718281828459045E1, ~inf) = 0.0 nextAfter (~0.2718281828459045E1, ~inf) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, nan) = nan + (~0.2718281828459045E1, nan) = nan - (~0.2718281828459045E1, nan) = nan / (~0.2718281828459045E1, nan) = nan nextAfter (~0.2718281828459045E1, nan) = nan rem (~0.2718281828459045E1, nan) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.123E1, 0.17976931348623157E309) = ~inf + (~0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E1, 0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (~0.123E1, 0.17976931348623157E309) = ~0.12299999999999998E1 rem (~0.123E1, 0.17976931348623157E309) = ~0.123E1 * (~0.123E1, 0.8988465674311579E308) = ~0.1105581277940324E309 + (~0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E1, 0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (~0.123E1, 0.8988465674311579E308) = ~0.12299999999999998E1 rem (~0.123E1, 0.8988465674311579E308) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129000000000001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530000000000001E2 / (~0.123E1, 0.123E2) = ~0.9999999999999999E~1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.3141592653589793E1) = ~0.38641589639154454E1 + (~0.123E1, 0.3141592653589793E1) = 0.19115926535897931E1 - (~0.123E1, 0.3141592653589793E1) = ~0.43715926535897935E1 / (~0.123E1, 0.3141592653589793E1) = ~0.3915211600060625 nextAfter (~0.123E1, 0.3141592653589793E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.3141592653589793E1) = ~0.123E1 * (~0.123E1, 0.2718281828459045E1) = ~0.33434866490046256E1 + (~0.123E1, 0.2718281828459045E1) = 0.1488281828459045E1 - (~0.123E1, 0.2718281828459045E1) = ~0.3948281828459045E1 / (~0.123E1, 0.2718281828459045E1) = ~0.45249171264087407 nextAfter (~0.123E1, 0.2718281828459045E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.2718281828459045E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999999999998E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.22250738585072014E~307) = ~0.27368408459638577E~307 + (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, 0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (~0.123E1, 0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.22250738585072014E~307) = 0.0 * (~0.123E1, 0.11125369292536007E~307) = ~0.1368420422981929E~307 + (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, 0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (~0.123E1, 0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.11125369292536007E~307) = 0.0 * (~0.123E1, 0.5E~323) = ~0.5E~323 + (~0.123E1, 0.5E~323) = ~0.123E1 - (~0.123E1, 0.5E~323) = ~0.123E1 / (~0.123E1, 0.5E~323) = ~inf nextAfter (~0.123E1, 0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, 0.5E~323) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999999999998E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.17976931348623157E309) = inf + (~0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E1, ~0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (~0.123E1, ~0.17976931348623157E309) = ~0.12300000000000002E1 rem (~0.123E1, ~0.17976931348623157E309) = ~0.123E1 * (~0.123E1, ~0.8988465674311579E308) = 0.1105581277940324E309 + (~0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E1, ~0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (~0.123E1, ~0.8988465674311579E308) = ~0.12300000000000002E1 rem (~0.123E1, ~0.8988465674311579E308) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129000000000001E2 + (~0.123E1, ~0.123E2) = ~0.13530000000000001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.9999999999999999E~1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.3141592653589793E1) = 0.38641589639154454E1 + (~0.123E1, ~0.3141592653589793E1) = ~0.43715926535897935E1 - (~0.123E1, ~0.3141592653589793E1) = 0.19115926535897931E1 / (~0.123E1, ~0.3141592653589793E1) = 0.3915211600060625 nextAfter (~0.123E1, ~0.3141592653589793E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.3141592653589793E1) = ~0.123E1 * (~0.123E1, ~0.2718281828459045E1) = 0.33434866490046256E1 + (~0.123E1, ~0.2718281828459045E1) = ~0.3948281828459045E1 - (~0.123E1, ~0.2718281828459045E1) = 0.1488281828459045E1 / (~0.123E1, ~0.2718281828459045E1) = 0.45249171264087407 nextAfter (~0.123E1, ~0.2718281828459045E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.2718281828459045E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.22250738585072014E~307) = 0.27368408459638577E~307 + (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, ~0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (~0.123E1, ~0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.22250738585072014E~307) = 0.0 * (~0.123E1, ~0.11125369292536007E~307) = 0.1368420422981929E~307 + (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, ~0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (~0.123E1, ~0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.11125369292536007E~307) = 0.0 * (~0.123E1, ~0.5E~323) = 0.5E~323 + (~0.123E1, ~0.5E~323) = ~0.123E1 - (~0.123E1, ~0.5E~323) = ~0.123E1 / (~0.123E1, ~0.5E~323) = inf nextAfter (~0.123E1, ~0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, ~0.5E~323) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999999999998E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300000000000002E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.17976931348623157E309) = ~0.22111625558806483E308 + (~0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123, 0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (~0.123, 0.17976931348623157E309) = ~0.12299999999999998 rem (~0.123, 0.17976931348623157E309) = ~0.123 * (~0.123, 0.8988465674311579E308) = ~0.11055812779403241E308 + (~0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123, 0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (~0.123, 0.8988465674311579E308) = ~0.12299999999999998 rem (~0.123, 0.8988465674311579E308) = ~0.123 * (~0.123, 0.123E4) = ~0.15129E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.1E~3 nextAfter (~0.123, 0.123E4) = ~0.12299999999999998 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129000000000001E1 + (~0.123, 0.123E2) = 0.12177000000000001E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.9999999999999998E~2 nextAfter (~0.123, 0.123E2) = ~0.12299999999999998 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.3141592653589793E1) = ~0.38641589639154456 + (~0.123, 0.3141592653589793E1) = 0.3018592653589793E1 - (~0.123, 0.3141592653589793E1) = ~0.32645926535897933E1 / (~0.123, 0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (~0.123, 0.3141592653589793E1) = ~0.12299999999999998 rem (~0.123, 0.3141592653589793E1) = ~0.123 * (~0.123, 0.2718281828459045E1) = ~0.33434866490046256 + (~0.123, 0.2718281828459045E1) = 0.25952818284590453E1 - (~0.123, 0.2718281828459045E1) = ~0.2841281828459045E1 / (~0.123, 0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (~0.123, 0.2718281828459045E1) = ~0.12299999999999998 rem (~0.123, 0.2718281828459045E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.12299999999999998 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.12299999999999998 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.12423 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.12299999999999998 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.22250738585072014E~307) = ~0.273684084596386E~308 + (~0.123, 0.22250738585072014E~307) = ~0.123 - (~0.123, 0.22250738585072014E~307) = ~0.123 / (~0.123, 0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (~0.123, 0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, 0.22250738585072014E~307) = 0.0 * (~0.123, 0.11125369292536007E~307) = ~0.136842042298193E~308 + (~0.123, 0.11125369292536007E~307) = ~0.123 - (~0.123, 0.11125369292536007E~307) = ~0.123 / (~0.123, 0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (~0.123, 0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, 0.11125369292536007E~307) = 0.0 * (~0.123, 0.5E~323) = ~0.0 + (~0.123, 0.5E~323) = ~0.123 - (~0.123, 0.5E~323) = ~0.123 / (~0.123, 0.5E~323) = ~inf nextAfter (~0.123, 0.5E~323) = ~0.12299999999999998 rem (~0.123, 0.5E~323) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.12299999999999998 rem (~0.123, 0.0) = nan * (~0.123, ~0.17976931348623157E309) = 0.22111625558806483E308 + (~0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123, ~0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (~0.123, ~0.17976931348623157E309) = ~0.12300000000000001 rem (~0.123, ~0.17976931348623157E309) = ~0.123 * (~0.123, ~0.8988465674311579E308) = 0.11055812779403241E308 + (~0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123, ~0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (~0.123, ~0.8988465674311579E308) = ~0.12300000000000001 rem (~0.123, ~0.8988465674311579E308) = ~0.123 * (~0.123, ~0.123E4) = 0.15129E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.1E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300000000000001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129000000000001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177000000000001E2 / (~0.123, ~0.123E2) = 0.9999999999999998E~2 nextAfter (~0.123, ~0.123E2) = ~0.12300000000000001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.3141592653589793E1) = 0.38641589639154456 + (~0.123, ~0.3141592653589793E1) = ~0.32645926535897933E1 - (~0.123, ~0.3141592653589793E1) = 0.3018592653589793E1 / (~0.123, ~0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (~0.123, ~0.3141592653589793E1) = ~0.12300000000000001 rem (~0.123, ~0.3141592653589793E1) = ~0.123 * (~0.123, ~0.2718281828459045E1) = 0.33434866490046256 + (~0.123, ~0.2718281828459045E1) = ~0.2841281828459045E1 - (~0.123, ~0.2718281828459045E1) = 0.25952818284590453E1 / (~0.123, ~0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (~0.123, ~0.2718281828459045E1) = ~0.12300000000000001 rem (~0.123, ~0.2718281828459045E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300000000000001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.12423 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.12299999999999998 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.22250738585072014E~307) = 0.273684084596386E~308 + (~0.123, ~0.22250738585072014E~307) = ~0.123 - (~0.123, ~0.22250738585072014E~307) = ~0.123 / (~0.123, ~0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (~0.123, ~0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, ~0.22250738585072014E~307) = 0.0 * (~0.123, ~0.11125369292536007E~307) = 0.136842042298193E~308 + (~0.123, ~0.11125369292536007E~307) = ~0.123 - (~0.123, ~0.11125369292536007E~307) = ~0.123 / (~0.123, ~0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (~0.123, ~0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, ~0.11125369292536007E~307) = 0.0 * (~0.123, ~0.5E~323) = 0.0 + (~0.123, ~0.5E~323) = ~0.123 - (~0.123, ~0.5E~323) = ~0.123 / (~0.123, ~0.5E~323) = inf nextAfter (~0.123, ~0.5E~323) = ~0.12299999999999998 rem (~0.123, ~0.5E~323) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.12299999999999998 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300000000000001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.17976931348623157E309) = ~0.2211162555880648E306 + (~0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E~2, 0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (~0.123E~2, 0.17976931348623157E309) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, 0.8988465674311579E308) = ~0.1105581277940324E306 + (~0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E~2, 0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (~0.123E~2, 0.8988465674311579E308) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129E1 + (~0.123E~2, 0.123E4) = 0.122999877E4 - (~0.123E~2, 0.123E4) = ~0.123000123E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129E~1 + (~0.123E~2, 0.123E2) = 0.12298770000000001E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.9999999999999999E~4 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.3141592653589793E1) = ~0.38641589639154456E~2 + (~0.123E~2, 0.3141592653589793E1) = 0.3140362653589793E1 - (~0.123E~2, 0.3141592653589793E1) = ~0.3142822653589793E1 / (~0.123E~2, 0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (~0.123E~2, 0.3141592653589793E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, 0.2718281828459045E1) = ~0.33434866490046253E~2 + (~0.123E~2, 0.2718281828459045E1) = 0.2717051828459045E1 - (~0.123E~2, 0.2718281828459045E1) = ~0.2719511828459045E1 / (~0.123E~2, 0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (~0.123E~2, 0.2718281828459045E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.12423 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.22250738585072014E~307) = ~0.2736840845964E~310 + (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, 0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (~0.123E~2, 0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.22250738585072014E~307) = 0.0 * (~0.123E~2, 0.11125369292536007E~307) = ~0.1368420422982E~310 + (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, 0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (~0.123E~2, 0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.11125369292536007E~307) = 0.0 * (~0.123E~2, 0.5E~323) = ~0.0 + (~0.123E~2, 0.5E~323) = ~0.123E~2 - (~0.123E~2, 0.5E~323) = ~0.123E~2 / (~0.123E~2, 0.5E~323) = ~inf nextAfter (~0.123E~2, 0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.5E~323) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.17976931348623157E309) = 0.2211162555880648E306 + (~0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E~2, ~0.17976931348623157E309) = 0.684210211491E~311 nextAfter (~0.123E~2, ~0.17976931348623157E309) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, ~0.8988465674311579E308) = 0.1105581277940324E306 + (~0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E~2, ~0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (~0.123E~2, ~0.8988465674311579E308) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129E1 + (~0.123E~2, ~0.123E4) = ~0.123000123E4 - (~0.123E~2, ~0.123E4) = 0.122999877E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.12298770000000001E2 / (~0.123E~2, ~0.123E2) = 0.9999999999999999E~4 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.3141592653589793E1) = 0.38641589639154456E~2 + (~0.123E~2, ~0.3141592653589793E1) = ~0.3142822653589793E1 - (~0.123E~2, ~0.3141592653589793E1) = 0.3140362653589793E1 / (~0.123E~2, ~0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (~0.123E~2, ~0.3141592653589793E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, ~0.2718281828459045E1) = 0.33434866490046253E~2 + (~0.123E~2, ~0.2718281828459045E1) = ~0.2719511828459045E1 - (~0.123E~2, ~0.2718281828459045E1) = 0.2717051828459045E1 / (~0.123E~2, ~0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (~0.123E~2, ~0.2718281828459045E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.12423 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.22250738585072014E~307) = 0.2736840845964E~310 + (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, ~0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (~0.123E~2, ~0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.22250738585072014E~307) = 0.0 * (~0.123E~2, ~0.11125369292536007E~307) = 0.1368420422982E~310 + (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, ~0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (~0.123E~2, ~0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.11125369292536007E~307) = 0.0 * (~0.123E~2, ~0.5E~323) = 0.0 + (~0.123E~2, ~0.5E~323) = ~0.123E~2 - (~0.123E~2, ~0.5E~323) = ~0.123E~2 / (~0.123E~2, ~0.5E~323) = inf nextAfter (~0.123E~2, ~0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.5E~323) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300000000000002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.39999999999999996E1 + (~0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.19999999999999998E1 + (~0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E4) = ~0.27368408459638577E~304 + (~0.22250738585072014E~307, 0.123E4) = 0.123E4 - (~0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (~0.22250738585072014E~307, 0.123E4) = ~0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, 0.123E4) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E2) = ~0.2736840845963858E~306 + (~0.22250738585072014E~307, 0.123E2) = 0.123E2 - (~0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (~0.22250738585072014E~307, 0.123E2) = ~0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, 0.123E2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.6990275687580919E~307 + (~0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.6048377836559378E~307 + (~0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E1) = ~0.27368408459638577E~307 + (~0.22250738585072014E~307, 0.123E1) = 0.123E1 - (~0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (~0.22250738585072014E~307, 0.123E1) = ~0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, 0.123E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123) = ~0.273684084596386E~308 + (~0.22250738585072014E~307, 0.123) = 0.123 - (~0.22250738585072014E~307, 0.123) = ~0.123 / (~0.22250738585072014E~307, 0.123) = ~0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, 0.123) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E~2) = ~0.2736840845964E~310 + (~0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (~0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (~0.22250738585072014E~307, 0.123E~2) = ~0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, 0.123E~2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.0 + (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 - (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.4450147717014403E~307 / (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.1E1 nextAfter (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.0 + (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.3337610787760802E~307 / (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2E1 nextAfter (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, 0.5E~323) = ~0.0 + (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 - (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507202E~307 / (~0.22250738585072014E~307, 0.5E~323) = ~0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.5E~323) = 0.0 * (~0.22250738585072014E~307, 0.0) = ~0.0 + (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, 0.0) = ~inf nextAfter (~0.22250738585072014E~307, 0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.0) = nan * (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.39999999999999996E1 + (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.19999999999999998E1 + (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E4) = 0.27368408459638577E~304 + (~0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (~0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (~0.22250738585072014E~307, ~0.123E4) = 0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, ~0.123E4) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E2) = 0.2736840845963858E~306 + (~0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (~0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (~0.22250738585072014E~307, ~0.123E2) = 0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, ~0.123E2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.6990275687580919E~307 + (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.6048377836559378E~307 + (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E1) = 0.27368408459638577E~307 + (~0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (~0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (~0.22250738585072014E~307, ~0.123E1) = 0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, ~0.123E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123) = 0.273684084596386E~308 + (~0.22250738585072014E~307, ~0.123) = ~0.123 - (~0.22250738585072014E~307, ~0.123) = 0.123 / (~0.22250738585072014E~307, ~0.123) = 0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, ~0.123) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E~2) = 0.2736840845964E~310 + (~0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (~0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (~0.22250738585072014E~307, ~0.123E~2) = 0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, ~0.123E~2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 + (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.4450147717014403E~307 - (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 / (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.1E1 nextAfter (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 rem (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 + (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.3337610787760802E~307 - (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2E1 nextAfter (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, ~0.5E~323) = 0.0 + (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507202E~307 - (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 / (~0.22250738585072014E~307, ~0.5E~323) = 0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.5E~323) = 0.0 * (~0.22250738585072014E~307, ~0.0) = 0.0 + (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, ~0.0) = inf nextAfter (~0.22250738585072014E~307, ~0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.0) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~inf) = inf + (~0.22250738585072014E~307, ~inf) = ~inf - (~0.22250738585072014E~307, ~inf) = inf / (~0.22250738585072014E~307, ~inf) = 0.0 nextAfter (~0.22250738585072014E~307, ~inf) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, nan) = nan + (~0.22250738585072014E~307, nan) = nan - (~0.22250738585072014E~307, nan) = nan / (~0.22250738585072014E~307, nan) = nan nextAfter (~0.22250738585072014E~307, nan) = nan rem (~0.22250738585072014E~307, nan) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.19999999999999998E1 + (~0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.9999999999999999 + (~0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E4) = ~0.13684204229819289E~304 + (~0.11125369292536007E~307, 0.123E4) = 0.123E4 - (~0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (~0.11125369292536007E~307, 0.123E4) = ~0.904501568499E~311 nextAfter (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E2) = ~0.1368420422981929E~306 + (~0.11125369292536007E~307, 0.123E2) = 0.123E2 - (~0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (~0.11125369292536007E~307, 0.123E2) = ~0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.34951378437904593E~307 + (~0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.3024188918279689E~307 + (~0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E1) = ~0.1368420422981929E~307 + (~0.11125369292536007E~307, 0.123E1) = 0.123E1 - (~0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (~0.11125369292536007E~307, 0.123E1) = ~0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123) = ~0.136842042298193E~308 + (~0.11125369292536007E~307, 0.123) = 0.123 - (~0.11125369292536007E~307, 0.123) = ~0.123 / (~0.11125369292536007E~307, 0.123) = ~0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, 0.123) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E~2) = ~0.1368420422982E~310 + (~0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (~0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (~0.11125369292536007E~307, 0.123E~2) = ~0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.0 + (~0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.3337610787760802E~307 / (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.5 nextAfter (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.0 + (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 - (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.22250738585072014E~307 / (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.1E1 nextAfter (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, 0.5E~323) = ~0.0 + (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 - (~0.11125369292536007E~307, 0.5E~323) = ~0.1112536929253601E~307 / (~0.11125369292536007E~307, 0.5E~323) = ~0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.5E~323) = 0.0 * (~0.11125369292536007E~307, 0.0) = ~0.0 + (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, 0.0) = ~inf nextAfter (~0.11125369292536007E~307, 0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.0) = nan * (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.19999999999999998E1 + (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.9999999999999999 + (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E4) = 0.13684204229819289E~304 + (~0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (~0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (~0.11125369292536007E~307, ~0.123E4) = 0.904501568499E~311 nextAfter (~0.11125369292536007E~307, ~0.123E4) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E2) = 0.1368420422981929E~306 + (~0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (~0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (~0.11125369292536007E~307, ~0.123E2) = 0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, ~0.123E2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.34951378437904593E~307 + (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.3024188918279689E~307 + (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E1) = 0.1368420422981929E~307 + (~0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (~0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (~0.11125369292536007E~307, ~0.123E1) = 0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, ~0.123E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123) = 0.136842042298193E~308 + (~0.11125369292536007E~307, ~0.123) = ~0.123 - (~0.11125369292536007E~307, ~0.123) = 0.123 / (~0.11125369292536007E~307, ~0.123) = 0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, ~0.123) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E~2) = 0.1368420422982E~310 + (~0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (~0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (~0.11125369292536007E~307, ~0.123E~2) = 0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, ~0.123E~2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.0 + (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.3337610787760802E~307 - (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.5 nextAfter (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 + (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.22250738585072014E~307 - (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 / (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.1E1 nextAfter (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 rem (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, ~0.5E~323) = 0.0 + (~0.11125369292536007E~307, ~0.5E~323) = ~0.1112536929253601E~307 - (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 / (~0.11125369292536007E~307, ~0.5E~323) = 0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.5E~323) = 0.0 * (~0.11125369292536007E~307, ~0.0) = 0.0 + (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.0) = inf nextAfter (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.0) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~inf) = inf + (~0.11125369292536007E~307, ~inf) = ~inf - (~0.11125369292536007E~307, ~inf) = inf / (~0.11125369292536007E~307, ~inf) = 0.0 nextAfter (~0.11125369292536007E~307, ~inf) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, nan) = nan + (~0.11125369292536007E~307, nan) = nan - (~0.11125369292536007E~307, nan) = nan / (~0.11125369292536007E~307, nan) = nan nextAfter (~0.11125369292536007E~307, nan) = nan rem (~0.11125369292536007E~307, nan) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.5E~323, 0.17976931348623157E309) = ~0.8881784197001251E~15 + (~0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.5E~323, 0.17976931348623157E309) = ~0.0 nextAfter (~0.5E~323, 0.17976931348623157E309) = ~0.0 rem (~0.5E~323, 0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, 0.8988465674311579E308) = ~0.44408920985006257E~15 + (~0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.5E~323, 0.8988465674311579E308) = ~0.0 nextAfter (~0.5E~323, 0.8988465674311579E308) = ~0.0 rem (~0.5E~323, 0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, 0.123E4) = ~0.6077E~320 + (~0.5E~323, 0.123E4) = 0.123E4 - (~0.5E~323, 0.123E4) = ~0.123E4 / (~0.5E~323, 0.123E4) = ~0.0 nextAfter (~0.5E~323, 0.123E4) = ~0.0 rem (~0.5E~323, 0.123E4) = ~0.5E~323 * (~0.5E~323, 0.123E2) = ~0.6E~322 + (~0.5E~323, 0.123E2) = 0.123E2 - (~0.5E~323, 0.123E2) = ~0.123E2 / (~0.5E~323, 0.123E2) = ~0.0 nextAfter (~0.5E~323, 0.123E2) = ~0.0 rem (~0.5E~323, 0.123E2) = ~0.5E~323 * (~0.5E~323, 0.3141592653589793E1) = ~0.15E~322 + (~0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.5E~323, 0.3141592653589793E1) = ~0.0 nextAfter (~0.5E~323, 0.3141592653589793E1) = ~0.0 rem (~0.5E~323, 0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, 0.2718281828459045E1) = ~0.15E~322 + (~0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.5E~323, 0.2718281828459045E1) = ~0.0 nextAfter (~0.5E~323, 0.2718281828459045E1) = ~0.0 rem (~0.5E~323, 0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, 0.123E1) = ~0.5E~323 + (~0.5E~323, 0.123E1) = 0.123E1 - (~0.5E~323, 0.123E1) = ~0.123E1 / (~0.5E~323, 0.123E1) = ~0.5E~323 nextAfter (~0.5E~323, 0.123E1) = ~0.0 rem (~0.5E~323, 0.123E1) = ~0.5E~323 * (~0.5E~323, 0.123) = ~0.0 + (~0.5E~323, 0.123) = 0.123 - (~0.5E~323, 0.123) = ~0.123 / (~0.5E~323, 0.123) = ~0.4E~322 nextAfter (~0.5E~323, 0.123) = ~0.0 rem (~0.5E~323, 0.123) = ~0.5E~323 * (~0.5E~323, 0.123E~2) = ~0.0 + (~0.5E~323, 0.123E~2) = 0.123E~2 - (~0.5E~323, 0.123E~2) = ~0.123E~2 / (~0.5E~323, 0.123E~2) = ~0.4017E~320 nextAfter (~0.5E~323, 0.123E~2) = ~0.0 rem (~0.5E~323, 0.123E~2) = ~0.5E~323 * (~0.5E~323, 0.22250738585072014E~307) = ~0.0 + (~0.5E~323, 0.22250738585072014E~307) = 0.2225073858507201E~307 - (~0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507202E~307 / (~0.5E~323, 0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (~0.5E~323, 0.22250738585072014E~307) = ~0.0 rem (~0.5E~323, 0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, 0.11125369292536007E~307) = ~0.0 + (~0.5E~323, 0.11125369292536007E~307) = 0.11125369292536E~307 - (~0.5E~323, 0.11125369292536007E~307) = ~0.1112536929253601E~307 / (~0.5E~323, 0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (~0.5E~323, 0.11125369292536007E~307) = ~0.0 rem (~0.5E~323, 0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, 0.5E~323) = ~0.0 + (~0.5E~323, 0.5E~323) = 0.0 - (~0.5E~323, 0.5E~323) = ~0.1E~322 / (~0.5E~323, 0.5E~323) = ~0.1E1 nextAfter (~0.5E~323, 0.5E~323) = ~0.0 rem (~0.5E~323, 0.5E~323) = 0.0 * (~0.5E~323, 0.0) = ~0.0 + (~0.5E~323, 0.0) = ~0.5E~323 - (~0.5E~323, 0.0) = ~0.5E~323 / (~0.5E~323, 0.0) = ~inf nextAfter (~0.5E~323, 0.0) = ~0.0 rem (~0.5E~323, 0.0) = nan * (~0.5E~323, ~0.17976931348623157E309) = 0.8881784197001251E~15 + (~0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.5E~323, ~0.17976931348623157E309) = 0.0 nextAfter (~0.5E~323, ~0.17976931348623157E309) = ~0.1E~322 rem (~0.5E~323, ~0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, ~0.8988465674311579E308) = 0.44408920985006257E~15 + (~0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.5E~323, ~0.8988465674311579E308) = 0.0 nextAfter (~0.5E~323, ~0.8988465674311579E308) = ~0.1E~322 rem (~0.5E~323, ~0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, ~0.123E4) = 0.6077E~320 + (~0.5E~323, ~0.123E4) = ~0.123E4 - (~0.5E~323, ~0.123E4) = 0.123E4 / (~0.5E~323, ~0.123E4) = 0.0 nextAfter (~0.5E~323, ~0.123E4) = ~0.1E~322 rem (~0.5E~323, ~0.123E4) = ~0.5E~323 * (~0.5E~323, ~0.123E2) = 0.6E~322 + (~0.5E~323, ~0.123E2) = ~0.123E2 - (~0.5E~323, ~0.123E2) = 0.123E2 / (~0.5E~323, ~0.123E2) = 0.0 nextAfter (~0.5E~323, ~0.123E2) = ~0.1E~322 rem (~0.5E~323, ~0.123E2) = ~0.5E~323 * (~0.5E~323, ~0.3141592653589793E1) = 0.15E~322 + (~0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.5E~323, ~0.3141592653589793E1) = 0.0 nextAfter (~0.5E~323, ~0.3141592653589793E1) = ~0.1E~322 rem (~0.5E~323, ~0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, ~0.2718281828459045E1) = 0.15E~322 + (~0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.5E~323, ~0.2718281828459045E1) = 0.0 nextAfter (~0.5E~323, ~0.2718281828459045E1) = ~0.1E~322 rem (~0.5E~323, ~0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, ~0.123E1) = 0.5E~323 + (~0.5E~323, ~0.123E1) = ~0.123E1 - (~0.5E~323, ~0.123E1) = 0.123E1 / (~0.5E~323, ~0.123E1) = 0.5E~323 nextAfter (~0.5E~323, ~0.123E1) = ~0.1E~322 rem (~0.5E~323, ~0.123E1) = ~0.5E~323 * (~0.5E~323, ~0.123) = 0.0 + (~0.5E~323, ~0.123) = ~0.123 - (~0.5E~323, ~0.123) = 0.123 / (~0.5E~323, ~0.123) = 0.4E~322 nextAfter (~0.5E~323, ~0.123) = ~0.1E~322 rem (~0.5E~323, ~0.123) = ~0.5E~323 * (~0.5E~323, ~0.123E~2) = 0.0 + (~0.5E~323, ~0.123E~2) = ~0.123E~2 - (~0.5E~323, ~0.123E~2) = 0.123E~2 / (~0.5E~323, ~0.123E~2) = 0.4017E~320 nextAfter (~0.5E~323, ~0.123E~2) = ~0.1E~322 rem (~0.5E~323, ~0.123E~2) = ~0.5E~323 * (~0.5E~323, ~0.22250738585072014E~307) = 0.0 + (~0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507202E~307 - (~0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507201E~307 / (~0.5E~323, ~0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (~0.5E~323, ~0.22250738585072014E~307) = ~0.1E~322 rem (~0.5E~323, ~0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, ~0.11125369292536007E~307) = 0.0 + (~0.5E~323, ~0.11125369292536007E~307) = ~0.1112536929253601E~307 - (~0.5E~323, ~0.11125369292536007E~307) = 0.11125369292536E~307 / (~0.5E~323, ~0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (~0.5E~323, ~0.11125369292536007E~307) = ~0.1E~322 rem (~0.5E~323, ~0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, ~0.5E~323) = 0.0 + (~0.5E~323, ~0.5E~323) = ~0.1E~322 - (~0.5E~323, ~0.5E~323) = 0.0 / (~0.5E~323, ~0.5E~323) = 0.1E1 nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 rem (~0.5E~323, ~0.5E~323) = 0.0 * (~0.5E~323, ~0.0) = 0.0 + (~0.5E~323, ~0.0) = ~0.5E~323 - (~0.5E~323, ~0.0) = ~0.5E~323 / (~0.5E~323, ~0.0) = inf nextAfter (~0.5E~323, ~0.0) = ~0.0 rem (~0.5E~323, ~0.0) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.5E~323, ~inf) = inf + (~0.5E~323, ~inf) = ~inf - (~0.5E~323, ~inf) = inf / (~0.5E~323, ~inf) = 0.0 nextAfter (~0.5E~323, ~inf) = ~0.1E~322 rem (~0.5E~323, ~inf) = ~0.5E~323 * (~0.5E~323, nan) = nan + (~0.5E~323, nan) = nan - (~0.5E~323, nan) = nan / (~0.5E~323, nan) = nan nextAfter (~0.5E~323, nan) = nan rem (~0.5E~323, nan) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.0, 0.17976931348623157E309) = ~0.0 + (~0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.0, 0.17976931348623157E309) = ~0.0 nextAfter (~0.0, 0.17976931348623157E309) = 0.5E~323 rem (~0.0, 0.17976931348623157E309) = 0.0 * (~0.0, 0.8988465674311579E308) = ~0.0 + (~0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.0, 0.8988465674311579E308) = ~0.0 nextAfter (~0.0, 0.8988465674311579E308) = 0.5E~323 rem (~0.0, 0.8988465674311579E308) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.5E~323 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.5E~323 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.3141592653589793E1) = ~0.0 + (~0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.0, 0.3141592653589793E1) = ~0.0 nextAfter (~0.0, 0.3141592653589793E1) = 0.5E~323 rem (~0.0, 0.3141592653589793E1) = 0.0 * (~0.0, 0.2718281828459045E1) = ~0.0 + (~0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.0, 0.2718281828459045E1) = ~0.0 nextAfter (~0.0, 0.2718281828459045E1) = 0.5E~323 rem (~0.0, 0.2718281828459045E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.5E~323 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.5E~323 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.5E~323 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.22250738585072014E~307) = ~0.0 + (~0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (~0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (~0.0, 0.22250738585072014E~307) = ~0.0 nextAfter (~0.0, 0.22250738585072014E~307) = 0.5E~323 rem (~0.0, 0.22250738585072014E~307) = 0.0 * (~0.0, 0.11125369292536007E~307) = ~0.0 + (~0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (~0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.0, 0.11125369292536007E~307) = ~0.0 nextAfter (~0.0, 0.11125369292536007E~307) = 0.5E~323 rem (~0.0, 0.11125369292536007E~307) = 0.0 * (~0.0, 0.5E~323) = ~0.0 + (~0.0, 0.5E~323) = 0.5E~323 - (~0.0, 0.5E~323) = ~0.5E~323 / (~0.0, 0.5E~323) = ~0.0 nextAfter (~0.0, 0.5E~323) = 0.5E~323 rem (~0.0, 0.5E~323) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.17976931348623157E309) = 0.0 + (~0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.0, ~0.17976931348623157E309) = 0.0 nextAfter (~0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (~0.0, ~0.17976931348623157E309) = 0.0 * (~0.0, ~0.8988465674311579E308) = 0.0 + (~0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.0, ~0.8988465674311579E308) = 0.0 nextAfter (~0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (~0.0, ~0.8988465674311579E308) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.5E~323 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.5E~323 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.3141592653589793E1) = 0.0 + (~0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.0, ~0.3141592653589793E1) = 0.0 nextAfter (~0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (~0.0, ~0.3141592653589793E1) = 0.0 * (~0.0, ~0.2718281828459045E1) = 0.0 + (~0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.0, ~0.2718281828459045E1) = 0.0 nextAfter (~0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (~0.0, ~0.2718281828459045E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.5E~323 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.5E~323 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.5E~323 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.22250738585072014E~307) = 0.0 + (~0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (~0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (~0.0, ~0.22250738585072014E~307) = 0.0 nextAfter (~0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (~0.0, ~0.22250738585072014E~307) = 0.0 * (~0.0, ~0.11125369292536007E~307) = 0.0 + (~0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (~0.0, ~0.11125369292536007E~307) = 0.0 nextAfter (~0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (~0.0, ~0.11125369292536007E~307) = 0.0 * (~0.0, ~0.5E~323) = 0.0 + (~0.0, ~0.5E~323) = ~0.5E~323 - (~0.0, ~0.5E~323) = 0.5E~323 / (~0.0, ~0.5E~323) = 0.0 nextAfter (~0.0, ~0.5E~323) = ~0.5E~323 rem (~0.0, ~0.5E~323) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.5E~323 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.17976931348623157E309) = ~inf + (~inf, 0.17976931348623157E309) = ~inf - (~inf, 0.17976931348623157E309) = ~inf / (~inf, 0.17976931348623157E309) = ~inf nextAfter (~inf, 0.17976931348623157E309) = ~inf rem (~inf, 0.17976931348623157E309) = nan * (~inf, 0.8988465674311579E308) = ~inf + (~inf, 0.8988465674311579E308) = ~inf - (~inf, 0.8988465674311579E308) = ~inf / (~inf, 0.8988465674311579E308) = ~inf nextAfter (~inf, 0.8988465674311579E308) = ~inf rem (~inf, 0.8988465674311579E308) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.3141592653589793E1) = ~inf + (~inf, 0.3141592653589793E1) = ~inf - (~inf, 0.3141592653589793E1) = ~inf / (~inf, 0.3141592653589793E1) = ~inf nextAfter (~inf, 0.3141592653589793E1) = ~inf rem (~inf, 0.3141592653589793E1) = nan * (~inf, 0.2718281828459045E1) = ~inf + (~inf, 0.2718281828459045E1) = ~inf - (~inf, 0.2718281828459045E1) = ~inf / (~inf, 0.2718281828459045E1) = ~inf nextAfter (~inf, 0.2718281828459045E1) = ~inf rem (~inf, 0.2718281828459045E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.22250738585072014E~307) = ~inf + (~inf, 0.22250738585072014E~307) = ~inf - (~inf, 0.22250738585072014E~307) = ~inf / (~inf, 0.22250738585072014E~307) = ~inf nextAfter (~inf, 0.22250738585072014E~307) = ~inf rem (~inf, 0.22250738585072014E~307) = nan * (~inf, 0.11125369292536007E~307) = ~inf + (~inf, 0.11125369292536007E~307) = ~inf - (~inf, 0.11125369292536007E~307) = ~inf / (~inf, 0.11125369292536007E~307) = ~inf nextAfter (~inf, 0.11125369292536007E~307) = ~inf rem (~inf, 0.11125369292536007E~307) = nan * (~inf, 0.5E~323) = ~inf + (~inf, 0.5E~323) = ~inf - (~inf, 0.5E~323) = ~inf / (~inf, 0.5E~323) = ~inf nextAfter (~inf, 0.5E~323) = ~inf rem (~inf, 0.5E~323) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.17976931348623157E309) = inf + (~inf, ~0.17976931348623157E309) = ~inf - (~inf, ~0.17976931348623157E309) = ~inf / (~inf, ~0.17976931348623157E309) = inf nextAfter (~inf, ~0.17976931348623157E309) = ~inf rem (~inf, ~0.17976931348623157E309) = nan * (~inf, ~0.8988465674311579E308) = inf + (~inf, ~0.8988465674311579E308) = ~inf - (~inf, ~0.8988465674311579E308) = ~inf / (~inf, ~0.8988465674311579E308) = inf nextAfter (~inf, ~0.8988465674311579E308) = ~inf rem (~inf, ~0.8988465674311579E308) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.3141592653589793E1) = inf + (~inf, ~0.3141592653589793E1) = ~inf - (~inf, ~0.3141592653589793E1) = ~inf / (~inf, ~0.3141592653589793E1) = inf nextAfter (~inf, ~0.3141592653589793E1) = ~inf rem (~inf, ~0.3141592653589793E1) = nan * (~inf, ~0.2718281828459045E1) = inf + (~inf, ~0.2718281828459045E1) = ~inf - (~inf, ~0.2718281828459045E1) = ~inf / (~inf, ~0.2718281828459045E1) = inf nextAfter (~inf, ~0.2718281828459045E1) = ~inf rem (~inf, ~0.2718281828459045E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.22250738585072014E~307) = inf + (~inf, ~0.22250738585072014E~307) = ~inf - (~inf, ~0.22250738585072014E~307) = ~inf / (~inf, ~0.22250738585072014E~307) = inf nextAfter (~inf, ~0.22250738585072014E~307) = ~inf rem (~inf, ~0.22250738585072014E~307) = nan * (~inf, ~0.11125369292536007E~307) = inf + (~inf, ~0.11125369292536007E~307) = ~inf - (~inf, ~0.11125369292536007E~307) = ~inf / (~inf, ~0.11125369292536007E~307) = inf nextAfter (~inf, ~0.11125369292536007E~307) = ~inf rem (~inf, ~0.11125369292536007E~307) = nan * (~inf, ~0.5E~323) = inf + (~inf, ~0.5E~323) = ~inf - (~inf, ~0.5E~323) = ~inf / (~inf, ~0.5E~323) = inf nextAfter (~inf, ~0.5E~323) = ~inf rem (~inf, ~0.5E~323) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.17976931348623157E309) = nan + (nan, 0.17976931348623157E309) = nan - (nan, 0.17976931348623157E309) = nan / (nan, 0.17976931348623157E309) = nan nextAfter (nan, 0.17976931348623157E309) = nan rem (nan, 0.17976931348623157E309) = nan * (nan, 0.8988465674311579E308) = nan + (nan, 0.8988465674311579E308) = nan - (nan, 0.8988465674311579E308) = nan / (nan, 0.8988465674311579E308) = nan nextAfter (nan, 0.8988465674311579E308) = nan rem (nan, 0.8988465674311579E308) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.3141592653589793E1) = nan + (nan, 0.3141592653589793E1) = nan - (nan, 0.3141592653589793E1) = nan / (nan, 0.3141592653589793E1) = nan nextAfter (nan, 0.3141592653589793E1) = nan rem (nan, 0.3141592653589793E1) = nan * (nan, 0.2718281828459045E1) = nan + (nan, 0.2718281828459045E1) = nan - (nan, 0.2718281828459045E1) = nan / (nan, 0.2718281828459045E1) = nan nextAfter (nan, 0.2718281828459045E1) = nan rem (nan, 0.2718281828459045E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.22250738585072014E~307) = nan + (nan, 0.22250738585072014E~307) = nan - (nan, 0.22250738585072014E~307) = nan / (nan, 0.22250738585072014E~307) = nan nextAfter (nan, 0.22250738585072014E~307) = nan rem (nan, 0.22250738585072014E~307) = nan * (nan, 0.11125369292536007E~307) = nan + (nan, 0.11125369292536007E~307) = nan - (nan, 0.11125369292536007E~307) = nan / (nan, 0.11125369292536007E~307) = nan nextAfter (nan, 0.11125369292536007E~307) = nan rem (nan, 0.11125369292536007E~307) = nan * (nan, 0.5E~323) = nan + (nan, 0.5E~323) = nan - (nan, 0.5E~323) = nan / (nan, 0.5E~323) = nan nextAfter (nan, 0.5E~323) = nan rem (nan, 0.5E~323) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.17976931348623157E309) = nan + (nan, ~0.17976931348623157E309) = nan - (nan, ~0.17976931348623157E309) = nan / (nan, ~0.17976931348623157E309) = nan nextAfter (nan, ~0.17976931348623157E309) = nan rem (nan, ~0.17976931348623157E309) = nan * (nan, ~0.8988465674311579E308) = nan + (nan, ~0.8988465674311579E308) = nan - (nan, ~0.8988465674311579E308) = nan / (nan, ~0.8988465674311579E308) = nan nextAfter (nan, ~0.8988465674311579E308) = nan rem (nan, ~0.8988465674311579E308) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.3141592653589793E1) = nan + (nan, ~0.3141592653589793E1) = nan - (nan, ~0.3141592653589793E1) = nan / (nan, ~0.3141592653589793E1) = nan nextAfter (nan, ~0.3141592653589793E1) = nan rem (nan, ~0.3141592653589793E1) = nan * (nan, ~0.2718281828459045E1) = nan + (nan, ~0.2718281828459045E1) = nan - (nan, ~0.2718281828459045E1) = nan / (nan, ~0.2718281828459045E1) = nan nextAfter (nan, ~0.2718281828459045E1) = nan rem (nan, ~0.2718281828459045E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.22250738585072014E~307) = nan + (nan, ~0.22250738585072014E~307) = nan - (nan, ~0.22250738585072014E~307) = nan / (nan, ~0.22250738585072014E~307) = nan nextAfter (nan, ~0.22250738585072014E~307) = nan rem (nan, ~0.22250738585072014E~307) = nan * (nan, ~0.11125369292536007E~307) = nan + (nan, ~0.11125369292536007E~307) = nan - (nan, ~0.11125369292536007E~307) = nan / (nan, ~0.11125369292536007E~307) = nan nextAfter (nan, ~0.11125369292536007E~307) = nan rem (nan, ~0.11125369292536007E~307) = nan * (nan, ~0.5E~323) = nan + (nan, ~0.5E~323) = nan - (nan, ~0.5E~323) = nan / (nan, ~0.5E~323) = nan nextAfter (nan, ~0.5E~323) = nan rem (nan, ~0.5E~323) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.17976931348623157E309) = nan asin (0.17976931348623157E309) = nan atan (0.17976931348623157E309) = 1.570796327 cos (0.17976931348623157E309) = ~0.9999876894 cosh (0.17976931348623157E309) = inf exp (0.17976931348623157E309) = inf ln (0.17976931348623157E309) = 709.7827129 log10 (0.17976931348623157E309) = 308.2547156 sin (0.17976931348623157E309) = 0.004961954789 sinh (0.17976931348623157E309) = inf sqrt (0.17976931348623157E309) = 1.340780793E154 tan (0.17976931348623157E309) = ~0.004962015874 tanh (0.17976931348623157E309) = 1 acos (0.8988465674311579E308) = nan asin (0.8988465674311579E308) = nan atan (0.8988465674311579E308) = 1.570796327 cos (0.8988465674311579E308) = 0.00248098503 cosh (0.8988465674311579E308) = inf exp (0.8988465674311579E308) = inf ln (0.8988465674311579E308) = 709.0895657 log10 (0.8988465674311579E308) = 307.9536856 sin (0.8988465674311579E308) = 0.9999969224 sinh (0.8988465674311579E308) = inf sqrt (0.8988465674311579E308) = 9.480751908E153 tan (0.8988465674311579E308) = 403.0644725 tanh (0.8988465674311579E308) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983319 cos (0.123E4) = 0.06642716993 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769448 log10 (0.123E4) = 3.089905111 sin (0.123E4) = ~0.9977912763 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135583 tan (0.123E4) = ~15.02083074 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673935 cos (0.123E2) = 0.9647326179 cosh (0.123E2) = 109847.9943 exp (0.123E2) = 219695.9887 ln (0.123E2) = 2.509599262 log10 (0.123E2) = 1.089905111 sin (0.123E2) = ~0.2632317914 sinh (0.123E2) = 109847.9943 sqrt (0.123E2) = 3.507135583 tan (0.123E2) = ~0.272854661 tanh (0.123E2) = 1 acos (0.3141592653589793E1) = nan asin (0.3141592653589793E1) = nan atan (0.3141592653589793E1) = 1.262627256 cos (0.3141592653589793E1) = ~1 cosh (0.3141592653589793E1) = 11.59195328 exp (0.3141592653589793E1) = 23.14069263 ln (0.3141592653589793E1) = 1.144729886 log10 (0.3141592653589793E1) = 0.4971498727 sin (0.3141592653589793E1) = 1.224646799E~16 sinh (0.3141592653589793E1) = 11.54873936 sqrt (0.3141592653589793E1) = 1.772453851 tan (0.3141592653589793E1) = ~1.224646799E~16 tanh (0.3141592653589793E1) = 0.9962720762 acos (0.2718281828459045E1) = nan asin (0.2718281828459045E1) = nan atan (0.2718281828459045E1) = 1.218282905 cos (0.2718281828459045E1) = ~0.9117339148 cosh (0.2718281828459045E1) = 7.610125139 exp (0.2718281828459045E1) = 15.15426224 ln (0.2718281828459045E1) = 1 log10 (0.2718281828459045E1) = 0.4342944819 sin (0.2718281828459045E1) = 0.4107812905 sinh (0.2718281828459045E1) = 7.544137103 sqrt (0.2718281828459045E1) = 1.648721271 tan (0.2718281828459045E1) = ~0.4505495341 tanh (0.2718281828459045E1) = 0.9913289158 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.8881737744 cos (0.123E1) = 0.3342377271 cosh (0.123E1) = 1.856761057 exp (0.123E1) = 3.421229536 ln (0.123E1) = 0.2070141694 log10 (0.123E1) = 0.08990511144 sin (0.123E1) = 0.9424888019 sinh (0.123E1) = 1.564468479 sqrt (0.123E1) = 1.109053651 tan (0.123E1) = 2.819815734 tanh (0.123E1) = 0.8425793257 acos (0.123) = 1.447484052 asin (0.123) = 0.1233122752 atan (0.123) = 0.1223852815 cos (0.123) = 0.9924450321 cosh (0.123) = 1.007574042 exp (0.123) = 1.130884421 ln (0.123) = ~2.095570924 log10 (0.123) = ~0.9100948886 sin (0.123) = 0.12269009 sinh (0.123) = 0.1233103792 sqrt (0.123) = 0.3507135583 tan (0.123) = 0.1236240659 tanh (0.123) = 0.1223834419 acos (0.123E~2) = 1.569566326 asin (0.123E~2) = 0.00123000031 atan (0.123E~2) = 0.00122999938 cos (0.123E~2) = 0.9999992436 cosh (0.123E~2) = 1.000000756 exp (0.123E~2) = 1.001230757 ln (0.123E~2) = ~6.70074111 log10 (0.123E~2) = ~2.910094889 sin (0.123E~2) = 0.00122999969 sinh (0.123E~2) = 0.00123000031 sqrt (0.123E~2) = 0.03507135583 tan (0.123E~2) = 0.00123000062 tanh (0.123E~2) = 0.00122999938 acos (0.22250738585072014E~307) = 1.570796327 asin (0.22250738585072014E~307) = 2.225073859E~308 atan (0.22250738585072014E~307) = 2.225073859E~308 cos (0.22250738585072014E~307) = 1 cosh (0.22250738585072014E~307) = 1 exp (0.22250738585072014E~307) = 1 ln (0.22250738585072014E~307) = ~708.3964185 log10 (0.22250738585072014E~307) = ~307.6526556 sin (0.22250738585072014E~307) = 2.225073859E~308 sinh (0.22250738585072014E~307) = 2.225073859E~308 sqrt (0.22250738585072014E~307) = 1.491668146E~154 tan (0.22250738585072014E~307) = 2.225073859E~308 tanh (0.22250738585072014E~307) = 2.225073859E~308 acos (0.11125369292536007E~307) = 1.570796327 asin (0.11125369292536007E~307) = 1.112536929E~308 atan (0.11125369292536007E~307) = 1.112536929E~308 cos (0.11125369292536007E~307) = 1 cosh (0.11125369292536007E~307) = 1 exp (0.11125369292536007E~307) = 1 ln (0.11125369292536007E~307) = ~709.0895657 log10 (0.11125369292536007E~307) = ~307.9536856 sin (0.11125369292536007E~307) = 1.112536929E~308 sinh (0.11125369292536007E~307) = 1.112536929E~308 sqrt (0.11125369292536007E~307) = 1.054768661E~154 tan (0.11125369292536007E~307) = 1.112536929E~308 tanh (0.11125369292536007E~307) = 1.112536929E~308 acos (0.5E~323) = 1.570796327 asin (0.5E~323) = 4.940656458E~324 atan (0.5E~323) = 4.940656458E~324 cos (0.5E~323) = 1 cosh (0.5E~323) = 1 exp (0.5E~323) = 1 ln (0.5E~323) = ~744.4400719 log10 (0.5E~323) = ~323.3062153 sin (0.5E~323) = 4.940656458E~324 sinh (0.5E~323) = 4.940656458E~324 sqrt (0.5E~323) = 2.222758749E~162 tan (0.5E~323) = 4.940656458E~324 tanh (0.5E~323) = 4.940656458E~324 acos (0.0) = 1.570796327 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.17976931348623157E309) = nan asin (~0.17976931348623157E309) = nan atan (~0.17976931348623157E309) = ~1.570796327 cos (~0.17976931348623157E309) = ~0.9999876894 cosh (~0.17976931348623157E309) = inf exp (~0.17976931348623157E309) = 0 ln (~0.17976931348623157E309) = nan log10 (~0.17976931348623157E309) = nan sin (~0.17976931348623157E309) = ~0.004961954789 sinh (~0.17976931348623157E309) = ~inf sqrt (~0.17976931348623157E309) = nan tan (~0.17976931348623157E309) = 0.004962015874 tanh (~0.17976931348623157E309) = ~1 acos (~0.8988465674311579E308) = nan asin (~0.8988465674311579E308) = nan atan (~0.8988465674311579E308) = ~1.570796327 cos (~0.8988465674311579E308) = 0.00248098503 cosh (~0.8988465674311579E308) = inf exp (~0.8988465674311579E308) = 0 ln (~0.8988465674311579E308) = nan log10 (~0.8988465674311579E308) = nan sin (~0.8988465674311579E308) = ~0.9999969224 sinh (~0.8988465674311579E308) = ~inf sqrt (~0.8988465674311579E308) = nan tan (~0.8988465674311579E308) = ~403.0644725 tanh (~0.8988465674311579E308) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983319 cos (~0.123E4) = 0.06642716993 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912763 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083074 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673935 cos (~0.123E2) = 0.9647326179 cosh (~0.123E2) = 109847.9943 exp (~0.123E2) = 4.551744463E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632317914 sinh (~0.123E2) = ~109847.9943 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.272854661 tanh (~0.123E2) = ~1 acos (~0.3141592653589793E1) = nan asin (~0.3141592653589793E1) = nan atan (~0.3141592653589793E1) = ~1.262627256 cos (~0.3141592653589793E1) = ~1 cosh (~0.3141592653589793E1) = 11.59195328 exp (~0.3141592653589793E1) = 0.04321391826 ln (~0.3141592653589793E1) = nan log10 (~0.3141592653589793E1) = nan sin (~0.3141592653589793E1) = ~1.224646799E~16 sinh (~0.3141592653589793E1) = ~11.54873936 sqrt (~0.3141592653589793E1) = nan tan (~0.3141592653589793E1) = 1.224646799E~16 tanh (~0.3141592653589793E1) = ~0.9962720762 acos (~0.2718281828459045E1) = nan asin (~0.2718281828459045E1) = nan atan (~0.2718281828459045E1) = ~1.218282905 cos (~0.2718281828459045E1) = ~0.9117339148 cosh (~0.2718281828459045E1) = 7.610125139 exp (~0.2718281828459045E1) = 0.06598803585 ln (~0.2718281828459045E1) = nan log10 (~0.2718281828459045E1) = nan sin (~0.2718281828459045E1) = ~0.4107812905 sinh (~0.2718281828459045E1) = ~7.544137103 sqrt (~0.2718281828459045E1) = nan tan (~0.2718281828459045E1) = 0.4505495341 tanh (~0.2718281828459045E1) = ~0.9913289158 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.8881737744 cos (~0.123E1) = 0.3342377271 cosh (~0.123E1) = 1.856761057 exp (~0.123E1) = 0.2922925777 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424888019 sinh (~0.123E1) = ~1.564468479 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815734 tanh (~0.123E1) = ~0.8425793257 acos (~0.123) = 1.694108602 asin (~0.123) = ~0.1233122752 atan (~0.123) = ~0.1223852815 cos (~0.123) = 0.9924450321 cosh (~0.123) = 1.007574042 exp (~0.123) = 0.8842636626 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.12269009 sinh (~0.123) = ~0.1233103792 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240659 tanh (~0.123) = ~0.1223834419 acos (~0.123E~2) = 1.572026327 asin (~0.123E~2) = ~0.00123000031 atan (~0.123E~2) = ~0.00122999938 cos (~0.123E~2) = 0.9999992436 cosh (~0.123E~2) = 1.000000756 exp (~0.123E~2) = 0.9987707561 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.00122999969 sinh (~0.123E~2) = ~0.00123000031 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.00123000062 tanh (~0.123E~2) = ~0.00122999938 acos (~0.22250738585072014E~307) = 1.570796327 asin (~0.22250738585072014E~307) = ~2.225073859E~308 atan (~0.22250738585072014E~307) = ~2.225073859E~308 cos (~0.22250738585072014E~307) = 1 cosh (~0.22250738585072014E~307) = 1 exp (~0.22250738585072014E~307) = 1 ln (~0.22250738585072014E~307) = nan log10 (~0.22250738585072014E~307) = nan sin (~0.22250738585072014E~307) = ~2.225073859E~308 sinh (~0.22250738585072014E~307) = ~2.225073859E~308 sqrt (~0.22250738585072014E~307) = nan tan (~0.22250738585072014E~307) = ~2.225073859E~308 tanh (~0.22250738585072014E~307) = ~2.225073859E~308 acos (~0.11125369292536007E~307) = 1.570796327 asin (~0.11125369292536007E~307) = ~1.112536929E~308 atan (~0.11125369292536007E~307) = ~1.112536929E~308 cos (~0.11125369292536007E~307) = 1 cosh (~0.11125369292536007E~307) = 1 exp (~0.11125369292536007E~307) = 1 ln (~0.11125369292536007E~307) = nan log10 (~0.11125369292536007E~307) = nan sin (~0.11125369292536007E~307) = ~1.112536929E~308 sinh (~0.11125369292536007E~307) = ~1.112536929E~308 sqrt (~0.11125369292536007E~307) = nan tan (~0.11125369292536007E~307) = ~1.112536929E~308 tanh (~0.11125369292536007E~307) = ~1.112536929E~308 acos (~0.5E~323) = 1.570796327 asin (~0.5E~323) = ~4.940656458E~324 atan (~0.5E~323) = ~4.940656458E~324 cos (~0.5E~323) = 1 cosh (~0.5E~323) = 1 exp (~0.5E~323) = 1 ln (~0.5E~323) = nan log10 (~0.5E~323) = nan sin (~0.5E~323) = ~4.940656458E~324 sinh (~0.5E~323) = ~4.940656458E~324 sqrt (~0.5E~323) = nan tan (~0.5E~323) = ~4.940656458E~324 tanh (~0.5E~323) = ~4.940656458E~324 acos (~0.0) = 1.570796327 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796327 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.17976931348623157E309, 0.17976931348623157E309) = 0.7853981634 pow (0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (0.17976931348623157E309, 0.8988465674311579E308) = 1.107148718 pow (0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (0.17976931348623157E309, 0.123E4) = 1.570796327 pow (0.17976931348623157E309, 0.123E4) = inf atan2 (0.17976931348623157E309, 0.123E2) = 1.570796327 pow (0.17976931348623157E309, 0.123E2) = inf atan2 (0.17976931348623157E309, 0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, 0.3141592653589793E1) = inf atan2 (0.17976931348623157E309, 0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, 0.2718281828459045E1) = inf atan2 (0.17976931348623157E309, 0.123E1) = 1.570796327 pow (0.17976931348623157E309, 0.123E1) = inf atan2 (0.17976931348623157E309, 0.123) = 1.570796327 pow (0.17976931348623157E309, 0.123) = 8.228676973E37 atan2 (0.17976931348623157E309, 0.123E~2) = 1.570796327 pow (0.17976931348623157E309, 0.123E~2) = 2.394160714 atan2 (0.17976931348623157E309, 0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, 0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, 0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, 0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, 0.5E~323) = 1.570796327 pow (0.17976931348623157E309, 0.5E~323) = 1 atan2 (0.17976931348623157E309, 0.0) = 1.570796327 pow (0.17976931348623157E309, 0.0) = 1 atan2 (0.17976931348623157E309, ~0.17976931348623157E309) = 2.35619449 pow (0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (0.17976931348623157E309, ~0.8988465674311579E308) = 2.034443936 pow (0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (0.17976931348623157E309, ~0.123E4) = 1.570796327 pow (0.17976931348623157E309, ~0.123E4) = 0 atan2 (0.17976931348623157E309, ~0.123E2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E2) = 0 atan2 (0.17976931348623157E309, ~0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, ~0.3141592653589793E1) = 0 atan2 (0.17976931348623157E309, ~0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, ~0.2718281828459045E1) = 0 atan2 (0.17976931348623157E309, ~0.123E1) = 1.570796327 pow (0.17976931348623157E309, ~0.123E1) = 0 atan2 (0.17976931348623157E309, ~0.123) = 1.570796327 pow (0.17976931348623157E309, ~0.123) = 1.21526219E~38 atan2 (0.17976931348623157E309, ~0.123E~2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E~2) = 0.4176829041 atan2 (0.17976931348623157E309, ~0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, ~0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, ~0.5E~323) = 1.570796327 pow (0.17976931348623157E309, ~0.5E~323) = 1 atan2 (0.17976931348623157E309, ~0.0) = 1.570796327 pow (0.17976931348623157E309, ~0.0) = 1 atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.17976931348623157E309, ~inf) = 3.141592654 pow (0.17976931348623157E309, ~inf) = 0 atan2 (0.17976931348623157E309, nan) = nan pow (0.17976931348623157E309, nan) = nan atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.8988465674311579E308, 0.17976931348623157E309) = 0.463647609 pow (0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (0.8988465674311579E308, 0.8988465674311579E308) = 0.7853981634 pow (0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (0.8988465674311579E308, 0.123E4) = 1.570796327 pow (0.8988465674311579E308, 0.123E4) = inf atan2 (0.8988465674311579E308, 0.123E2) = 1.570796327 pow (0.8988465674311579E308, 0.123E2) = inf atan2 (0.8988465674311579E308, 0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, 0.3141592653589793E1) = inf atan2 (0.8988465674311579E308, 0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, 0.2718281828459045E1) = inf atan2 (0.8988465674311579E308, 0.123E1) = 1.570796327 pow (0.8988465674311579E308, 0.123E1) = inf atan2 (0.8988465674311579E308, 0.123) = 1.570796327 pow (0.8988465674311579E308, 0.123) = 7.556197911E37 atan2 (0.8988465674311579E308, 0.123E~2) = 1.570796327 pow (0.8988465674311579E308, 0.123E~2) = 2.392120392 atan2 (0.8988465674311579E308, 0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, 0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, 0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, 0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, 0.5E~323) = 1.570796327 pow (0.8988465674311579E308, 0.5E~323) = 1 atan2 (0.8988465674311579E308, 0.0) = 1.570796327 pow (0.8988465674311579E308, 0.0) = 1 atan2 (0.8988465674311579E308, ~0.17976931348623157E309) = 2.677945045 pow (0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (0.8988465674311579E308, ~0.8988465674311579E308) = 2.35619449 pow (0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (0.8988465674311579E308, ~0.123E4) = 1.570796327 pow (0.8988465674311579E308, ~0.123E4) = 0 atan2 (0.8988465674311579E308, ~0.123E2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E2) = 0 atan2 (0.8988465674311579E308, ~0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, ~0.3141592653589793E1) = 0 atan2 (0.8988465674311579E308, ~0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, ~0.2718281828459045E1) = 0 atan2 (0.8988465674311579E308, ~0.123E1) = 1.570796327 pow (0.8988465674311579E308, ~0.123E1) = 0 atan2 (0.8988465674311579E308, ~0.123) = 1.570796327 pow (0.8988465674311579E308, ~0.123) = 1.323416898E~38 atan2 (0.8988465674311579E308, ~0.123E~2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E~2) = 0.4180391603 atan2 (0.8988465674311579E308, ~0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, ~0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, ~0.5E~323) = 1.570796327 pow (0.8988465674311579E308, ~0.5E~323) = 1 atan2 (0.8988465674311579E308, ~0.0) = 1.570796327 pow (0.8988465674311579E308, ~0.0) = 1 atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.8988465674311579E308, ~inf) = 3.141592654 pow (0.8988465674311579E308, ~inf) = 0 atan2 (0.8988465674311579E308, nan) = nan pow (0.8988465674311579E308, nan) = nan atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.123E4, 0.17976931348623157E309) = 6.842102115E~306 pow (0.123E4, 0.17976931348623157E309) = inf atan2 (0.123E4, 0.8988465674311579E308) = 1.368420423E~305 pow (0.123E4, 0.8988465674311579E308) = inf atan2 (0.123E4, 0.123E4) = 0.7853981634 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.56079666 pow (0.123E4, 0.123E2) = 1.013521278E38 atan2 (0.123E4, 0.3141592653589793E1) = 1.568242192 pow (0.123E4, 0.3141592653589793E1) = 5095927004 atan2 (0.123E4, 0.2718281828459045E1) = 1.568586345 pow (0.123E4, 0.2718281828459045E1) = 250745366.3 atan2 (0.123E4, 0.123E1) = 1.569796327 pow (0.123E4, 0.123E1) = 6318.053325 atan2 (0.123E4, 0.123) = 1.570696327 pow (0.123E4, 0.123) = 2.39915512 atan2 (0.123E4, 0.123E~2) = 1.570795327 pow (0.123E4, 0.123E~2) = 1.00878957 atan2 (0.123E4, 0.22250738585072014E~307) = 1.570796327 pow (0.123E4, 0.22250738585072014E~307) = 1 atan2 (0.123E4, 0.11125369292536007E~307) = 1.570796327 pow (0.123E4, 0.11125369292536007E~307) = 1 atan2 (0.123E4, 0.5E~323) = 1.570796327 pow (0.123E4, 0.5E~323) = 1 atan2 (0.123E4, 0.0) = 1.570796327 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.17976931348623157E309) = 3.141592654 pow (0.123E4, ~0.17976931348623157E309) = 0 atan2 (0.123E4, ~0.8988465674311579E308) = 3.141592654 pow (0.123E4, ~0.8988465674311579E308) = 0 atan2 (0.123E4, ~0.123E4) = 2.35619449 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580795993 pow (0.123E4, ~0.123E2) = 9.86659108E~39 atan2 (0.123E4, ~0.3141592653589793E1) = 1.573350462 pow (0.123E4, ~0.3141592653589793E1) = 1.9623515E~10 atan2 (0.123E4, ~0.2718281828459045E1) = 1.573006308 pow (0.123E4, ~0.2718281828459045E1) = 3.98810959E~9 atan2 (0.123E4, ~0.123E1) = 1.571796326 pow (0.123E4, ~0.123E1) = 1.582766002E~4 atan2 (0.123E4, ~0.123) = 1.570896327 pow (0.123E4, ~0.123) = 0.4168133988 atan2 (0.123E4, ~0.123E~2) = 1.570797327 pow (0.123E4, ~0.123E~2) = 0.9912870136 atan2 (0.123E4, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E4, ~0.22250738585072014E~307) = 1 atan2 (0.123E4, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E4, ~0.11125369292536007E~307) = 1 atan2 (0.123E4, ~0.5E~323) = 1.570796327 pow (0.123E4, ~0.5E~323) = 1 atan2 (0.123E4, ~0.0) = 1.570796327 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592654 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.17976931348623157E309) = 6.842102115E~308 pow (0.123E2, 0.17976931348623157E309) = inf atan2 (0.123E2, 0.8988465674311579E308) = 1.368420423E~307 pow (0.123E2, 0.8988465674311579E308) = inf atan2 (0.123E2, 0.123E4) = 0.009999666687 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981634 pow (0.123E2, 0.123E2) = 2.545850346E13 atan2 (0.123E2, 0.3141592653589793E1) = 1.320728626 pow (0.123E2, 0.3141592653589793E1) = 2654.83718 atan2 (0.123E2, 0.2718281828459045E1) = 1.353293796 pow (0.123E2, 0.2718281828459045E1) = 917.6334984 atan2 (0.123E2, 0.123E1) = 1.471127674 pow (0.123E2, 0.123E1) = 21.90701911 atan2 (0.123E2, 0.123) = 1.56079666 pow (0.123E2, 0.123) = 1.361627546 atan2 (0.123E2, 0.123E~2) = 1.570696327 pow (0.123E2, 0.123E~2) = 1.003091576 atan2 (0.123E2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E2, 0.22250738585072014E~307) = 1 atan2 (0.123E2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E2, 0.11125369292536007E~307) = 1 atan2 (0.123E2, 0.5E~323) = 1.570796327 pow (0.123E2, 0.5E~323) = 1 atan2 (0.123E2, 0.0) = 1.570796327 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E2, ~0.17976931348623157E309) = 0 atan2 (0.123E2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E2, ~0.8988465674311579E308) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592987 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.35619449 pow (0.123E2, ~0.123E2) = 3.927960658E~14 atan2 (0.123E2, ~0.3141592653589793E1) = 1.820864027 pow (0.123E2, ~0.3141592653589793E1) = 3.766709339E~4 atan2 (0.123E2, ~0.2718281828459045E1) = 1.788298857 pow (0.123E2, ~0.2718281828459045E1) = 0.001089759694 atan2 (0.123E2, ~0.123E1) = 1.670464979 pow (0.123E2, ~0.123E1) = 0.04564747011 atan2 (0.123E2, ~0.123) = 1.580795993 pow (0.123E2, ~0.123) = 0.7344152246 atan2 (0.123E2, ~0.123E~2) = 1.570896327 pow (0.123E2, ~0.123E~2) = 0.9969179522 atan2 (0.123E2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E2, ~0.22250738585072014E~307) = 1 atan2 (0.123E2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E2, ~0.11125369292536007E~307) = 1 atan2 (0.123E2, ~0.5E~323) = 1.570796327 pow (0.123E2, ~0.5E~323) = 1 atan2 (0.123E2, ~0.0) = 1.570796327 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592654 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.3141592653589793E1, 0.17976931348623157E309) = 1.747568922E~308 pow (0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (0.3141592653589793E1, 0.8988465674311579E308) = 3.495137844E~308 pow (0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (0.3141592653589793E1, 0.123E4) = 0.002554134815 pow (0.3141592653589793E1, 0.123E4) = inf atan2 (0.3141592653589793E1, 0.123E2) = 0.2500677004 pow (0.3141592653589793E1, 0.123E2) = 1302997.055 atan2 (0.3141592653589793E1, 0.3141592653589793E1) = 0.7853981634 pow (0.3141592653589793E1, 0.3141592653589793E1) = 36.46215961 atan2 (0.3141592653589793E1, 0.2718281828459045E1) = 0.8575117864 pow (0.3141592653589793E1, 0.2718281828459045E1) = 22.45915772 atan2 (0.3141592653589793E1, 0.123E1) = 1.197620596 pow (0.3141592653589793E1, 0.123E1) = 4.087844278 atan2 (0.3141592653589793E1, 0.123) = 1.531664198 pow (0.3141592653589793E1, 0.123) = 1.151196431 atan2 (0.3141592653589793E1, 0.123E~2) = 1.570404806 pow (0.3141592653589793E1, 0.123E~2) = 1.001409009 atan2 (0.3141592653589793E1, 0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, 0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, 0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, 0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, 0.5E~323) = 1.570796327 pow (0.3141592653589793E1, 0.5E~323) = 1 atan2 (0.3141592653589793E1, 0.0) = 1.570796327 pow (0.3141592653589793E1, 0.0) = 1 atan2 (0.3141592653589793E1, ~0.17976931348623157E309) = 3.141592654 pow (0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (0.3141592653589793E1, ~0.8988465674311579E308) = 3.141592654 pow (0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (0.3141592653589793E1, ~0.123E4) = 3.139038519 pow (0.3141592653589793E1, ~0.123E4) = 0 atan2 (0.3141592653589793E1, ~0.123E2) = 2.891524953 pow (0.3141592653589793E1, ~0.123E2) = 7.674614429E~7 atan2 (0.3141592653589793E1, ~0.3141592653589793E1) = 2.35619449 pow (0.3141592653589793E1, ~0.3141592653589793E1) = 0.02742569312 atan2 (0.3141592653589793E1, ~0.2718281828459045E1) = 2.284080867 pow (0.3141592653589793E1, ~0.2718281828459045E1) = 0.04452526727 atan2 (0.3141592653589793E1, ~0.123E1) = 1.943972057 pow (0.3141592653589793E1, ~0.123E1) = 0.2446277138 atan2 (0.3141592653589793E1, ~0.123) = 1.609928456 pow (0.3141592653589793E1, ~0.123) = 0.8686614842 atan2 (0.3141592653589793E1, ~0.123E~2) = 1.571187848 pow (0.3141592653589793E1, ~0.123E~2) = 0.998592973 atan2 (0.3141592653589793E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, ~0.5E~323) = 1.570796327 pow (0.3141592653589793E1, ~0.5E~323) = 1 atan2 (0.3141592653589793E1, ~0.0) = 1.570796327 pow (0.3141592653589793E1, ~0.0) = 1 atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.3141592653589793E1, ~inf) = 3.141592654 pow (0.3141592653589793E1, ~inf) = 0 atan2 (0.3141592653589793E1, nan) = nan pow (0.3141592653589793E1, nan) = nan atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.2718281828459045E1, 0.17976931348623157E309) = 1.512094459E~308 pow (0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (0.2718281828459045E1, 0.8988465674311579E308) = 3.024188918E~308 pow (0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (0.2718281828459045E1, 0.123E4) = 0.002209981629 pow (0.2718281828459045E1, 0.123E4) = inf atan2 (0.2718281828459045E1, 0.123E2) = 0.2175025304 pow (0.2718281828459045E1, 0.123E2) = 219695.9887 atan2 (0.2718281828459045E1, 0.3141592653589793E1) = 0.7132845404 pow (0.2718281828459045E1, 0.3141592653589793E1) = 23.14069263 atan2 (0.2718281828459045E1, 0.2718281828459045E1) = 0.7853981634 pow (0.2718281828459045E1, 0.2718281828459045E1) = 15.15426224 atan2 (0.2718281828459045E1, 0.123E1) = 1.145872224 pow (0.2718281828459045E1, 0.123E1) = 3.421229536 atan2 (0.2718281828459045E1, 0.123) = 1.525578 pow (0.2718281828459045E1, 0.123) = 1.130884421 atan2 (0.2718281828459045E1, 0.123E~2) = 1.570343835 pow (0.2718281828459045E1, 0.123E~2) = 1.001230757 atan2 (0.2718281828459045E1, 0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, 0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, 0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, 0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, 0.5E~323) = 1.570796327 pow (0.2718281828459045E1, 0.5E~323) = 1 atan2 (0.2718281828459045E1, 0.0) = 1.570796327 pow (0.2718281828459045E1, 0.0) = 1 atan2 (0.2718281828459045E1, ~0.17976931348623157E309) = 3.141592654 pow (0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (0.2718281828459045E1, ~0.8988465674311579E308) = 3.141592654 pow (0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (0.2718281828459045E1, ~0.123E4) = 3.139382672 pow (0.2718281828459045E1, ~0.123E4) = 0 atan2 (0.2718281828459045E1, ~0.123E2) = 2.924090123 pow (0.2718281828459045E1, ~0.123E2) = 4.551744463E~6 atan2 (0.2718281828459045E1, ~0.3141592653589793E1) = 2.428308113 pow (0.2718281828459045E1, ~0.3141592653589793E1) = 0.04321391826 atan2 (0.2718281828459045E1, ~0.2718281828459045E1) = 2.35619449 pow (0.2718281828459045E1, ~0.2718281828459045E1) = 0.06598803585 atan2 (0.2718281828459045E1, ~0.123E1) = 1.99572043 pow (0.2718281828459045E1, ~0.123E1) = 0.2922925777 atan2 (0.2718281828459045E1, ~0.123) = 1.616014654 pow (0.2718281828459045E1, ~0.123) = 0.8842636626 atan2 (0.2718281828459045E1, ~0.123E~2) = 1.571248818 pow (0.2718281828459045E1, ~0.123E~2) = 0.9987707561 atan2 (0.2718281828459045E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, ~0.5E~323) = 1.570796327 pow (0.2718281828459045E1, ~0.5E~323) = 1 atan2 (0.2718281828459045E1, ~0.0) = 1.570796327 pow (0.2718281828459045E1, ~0.0) = 1 atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.2718281828459045E1, ~inf) = 3.141592654 pow (0.2718281828459045E1, ~inf) = 0 atan2 (0.2718281828459045E1, nan) = nan pow (0.2718281828459045E1, nan) = nan atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.123E1, 0.17976931348623157E309) = 6.842102115E~309 pow (0.123E1, 0.17976931348623157E309) = inf atan2 (0.123E1, 0.8988465674311579E308) = 1.368420423E~308 pow (0.123E1, 0.8988465674311579E308) = inf atan2 (0.123E1, 0.123E4) = 9.999996667E~4 pow (0.123E1, 0.123E4) = 3.830778757E110 atan2 (0.123E1, 0.123E2) = 0.09966865249 pow (0.123E1, 0.123E2) = 12.75947692 atan2 (0.123E1, 0.3141592653589793E1) = 0.3731757303 pow (0.123E1, 0.3141592653589793E1) = 1.916219422 atan2 (0.123E1, 0.2718281828459045E1) = 0.4249241031 pow (0.123E1, 0.2718281828459045E1) = 1.755445823 atan2 (0.123E1, 0.123E1) = 0.7853981634 pow (0.123E1, 0.123E1) = 1.289980921 atan2 (0.123E1, 0.123) = 1.471127674 pow (0.123E1, 0.123) = 1.025789688 atan2 (0.123E1, 0.123E~2) = 1.569796327 pow (0.123E1, 0.123E~2) = 1.00025466 atan2 (0.123E1, 0.22250738585072014E~307) = 1.570796327 pow (0.123E1, 0.22250738585072014E~307) = 1 atan2 (0.123E1, 0.11125369292536007E~307) = 1.570796327 pow (0.123E1, 0.11125369292536007E~307) = 1 atan2 (0.123E1, 0.5E~323) = 1.570796327 pow (0.123E1, 0.5E~323) = 1 atan2 (0.123E1, 0.0) = 1.570796327 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.17976931348623157E309) = 3.141592654 pow (0.123E1, ~0.17976931348623157E309) = 0 atan2 (0.123E1, ~0.8988465674311579E308) = 3.141592654 pow (0.123E1, ~0.8988465674311579E308) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592654 pow (0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (0.123E1, ~0.123E2) = 3.041924001 pow (0.123E1, ~0.123E2) = 0.07837311876 atan2 (0.123E1, ~0.3141592653589793E1) = 2.768416923 pow (0.123E1, ~0.3141592653589793E1) = 0.5218609042 atan2 (0.123E1, ~0.2718281828459045E1) = 2.71666855 pow (0.123E1, ~0.2718281828459045E1) = 0.56965586 atan2 (0.123E1, ~0.123E1) = 2.35619449 pow (0.123E1, ~0.123E1) = 0.7752052637 atan2 (0.123E1, ~0.123) = 1.670464979 pow (0.123E1, ~0.123) = 0.9748586988 atan2 (0.123E1, ~0.123E~2) = 1.571796326 pow (0.123E1, ~0.123E~2) = 0.999745405 atan2 (0.123E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E1, ~0.22250738585072014E~307) = 1 atan2 (0.123E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E1, ~0.11125369292536007E~307) = 1 atan2 (0.123E1, ~0.5E~323) = 1.570796327 pow (0.123E1, ~0.5E~323) = 1 atan2 (0.123E1, ~0.0) = 1.570796327 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592654 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.17976931348623157E309) = 6.842102115E~310 pow (0.123, 0.17976931348623157E309) = 0 atan2 (0.123, 0.8988465674311579E308) = 1.368420423E~309 pow (0.123, 0.8988465674311579E308) = 0 atan2 (0.123, 0.123E4) = 9.999999967E~5 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666687 pow (0.123, 0.123E2) = 6.394886941E~12 atan2 (0.123, 0.3141592653589793E1) = 0.03913212911 pow (0.123, 0.3141592653589793E1) = 0.001383096824 atan2 (0.123, 0.2718281828459045E1) = 0.04521832678 pow (0.123, 0.2718281828459045E1) = 0.003358192615 atan2 (0.123, 0.123E1) = 0.09966865249 pow (0.123, 0.123E1) = 0.07595970809 atan2 (0.123, 0.123) = 0.7853981634 pow (0.123, 0.123) = 0.7727843683 atan2 (0.123, 0.123E~2) = 1.56079666 pow (0.123, 0.123E~2) = 0.9974257668 atan2 (0.123, 0.22250738585072014E~307) = 1.570796327 pow (0.123, 0.22250738585072014E~307) = 1 atan2 (0.123, 0.11125369292536007E~307) = 1.570796327 pow (0.123, 0.11125369292536007E~307) = 1 atan2 (0.123, 0.5E~323) = 1.570796327 pow (0.123, 0.5E~323) = 1 atan2 (0.123, 0.0) = 1.570796327 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.17976931348623157E309) = 3.141592654 pow (0.123, ~0.17976931348623157E309) = inf atan2 (0.123, ~0.8988465674311579E308) = 3.141592654 pow (0.123, ~0.8988465674311579E308) = inf atan2 (0.123, ~0.123E4) = 3.141492654 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592987 pow (0.123, ~0.123E2) = 156374930400 atan2 (0.123, ~0.3141592653589793E1) = 3.102460524 pow (0.123, ~0.3141592653589793E1) = 723.0151807 atan2 (0.123, ~0.2718281828459045E1) = 3.096374327 pow (0.123, ~0.2718281828459045E1) = 297.7792267 atan2 (0.123, ~0.123E1) = 3.041924001 pow (0.123, ~0.123E1) = 13.16487418 atan2 (0.123, ~0.123) = 2.35619449 pow (0.123, ~0.123) = 1.294022034 atan2 (0.123, ~0.123E~2) = 1.580795993 pow (0.123, ~0.123E~2) = 1.002580877 atan2 (0.123, ~0.22250738585072014E~307) = 1.570796327 pow (0.123, ~0.22250738585072014E~307) = 1 atan2 (0.123, ~0.11125369292536007E~307) = 1.570796327 pow (0.123, ~0.11125369292536007E~307) = 1 atan2 (0.123, ~0.5E~323) = 1.570796327 pow (0.123, ~0.5E~323) = 1 atan2 (0.123, ~0.0) = 1.570796327 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592654 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.17976931348623157E309) = 6.842102115E~312 pow (0.123E~2, 0.17976931348623157E309) = 0 atan2 (0.123E~2, 0.8988465674311579E308) = 1.368420423E~311 pow (0.123E~2, 0.8988465674311579E308) = 0 atan2 (0.123E~2, 0.123E4) = 1E~6 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 9.999999967E~5 pow (0.123E~2, 0.123E2) = 1.606322974E~36 atan2 (0.123E~2, 0.3141592653589793E1) = 3.9152114E~4 pow (0.123E~2, 0.3141592653589793E1) = 7.205552335E~10 atan2 (0.123E~2, 0.2718281828459045E1) = 4.524916818E~4 pow (0.123E~2, 0.2718281828459045E1) = 1.228971878E~8 atan2 (0.123E~2, 0.123E1) = 9.999996667E~4 pow (0.123E~2, 0.123E1) = 2.633802994E~4 atan2 (0.123E~2, 0.123) = 0.009999666687 pow (0.123E~2, 0.123) = 0.4385895994 atan2 (0.123E~2, 0.123E~2) = 0.7853981634 pow (0.123E~2, 0.123E~2) = 0.9917919599 atan2 (0.123E~2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, 0.22250738585072014E~307) = 1 atan2 (0.123E~2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, 0.11125369292536007E~307) = 1 atan2 (0.123E~2, 0.5E~323) = 1.570796327 pow (0.123E~2, 0.5E~323) = 1 atan2 (0.123E~2, 0.0) = 1.570796327 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E~2, ~0.17976931348623157E309) = inf atan2 (0.123E~2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E~2, ~0.8988465674311579E308) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591654 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492654 pow (0.123E~2, ~0.123E2) = 6.225398107E35 atan2 (0.123E~2, ~0.3141592653589793E1) = 3.141201132 pow (0.123E~2, ~0.3141592653589793E1) = 1387818662 atan2 (0.123E~2, ~0.2718281828459045E1) = 3.141140162 pow (0.123E~2, ~0.2718281828459045E1) = 81368826.88 atan2 (0.123E~2, ~0.123E1) = 3.140592654 pow (0.123E~2, ~0.123E1) = 3796.791188 atan2 (0.123E~2, ~0.123) = 3.131592987 pow (0.123E~2, ~0.123) = 2.280035827 atan2 (0.123E~2, ~0.123E~2) = 2.35619449 pow (0.123E~2, ~0.123E~2) = 1.00827597 atan2 (0.123E~2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, ~0.22250738585072014E~307) = 1 atan2 (0.123E~2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, ~0.11125369292536007E~307) = 1 atan2 (0.123E~2, ~0.5E~323) = 1.570796327 pow (0.123E~2, ~0.5E~323) = 1 atan2 (0.123E~2, ~0.0) = 1.570796327 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592654 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (0.22250738585072014E~307, 0.123E4) = 1.809003137E~311 pow (0.22250738585072014E~307, 0.123E4) = 0 atan2 (0.22250738585072014E~307, 0.123E2) = 1.809003137E~309 pow (0.22250738585072014E~307, 0.123E2) = 0 atan2 (0.22250738585072014E~307, 0.3141592653589793E1) = 7.082630067E~309 pow (0.22250738585072014E~307, 0.3141592653589793E1) = 0 atan2 (0.22250738585072014E~307, 0.2718281828459045E1) = 8.185589276E~309 pow (0.22250738585072014E~307, 0.2718281828459045E1) = 0 atan2 (0.22250738585072014E~307, 0.123E1) = 1.809003137E~308 pow (0.22250738585072014E~307, 0.123E1) = 0 atan2 (0.22250738585072014E~307, 0.123) = 1.809003137E~307 pow (0.22250738585072014E~307, 0.123) = 1.441197052E~38 atan2 (0.22250738585072014E~307, 0.123E~2) = 1.809003137E~305 pow (0.22250738585072014E~307, 0.123E~2) = 0.4183957204 atan2 (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.7853981634 pow (0.22250738585072014E~307, 0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, 0.11125369292536007E~307) = 1.107148718 pow (0.22250738585072014E~307, 0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, 0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, 0.5E~323) = 1 atan2 (0.22250738585072014E~307, 0.0) = 1.570796327 pow (0.22250738585072014E~307, 0.0) = 1 atan2 (0.22250738585072014E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (0.22250738585072014E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (0.22250738585072014E~307, ~0.123E4) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E4) = inf atan2 (0.22250738585072014E~307, ~0.123E2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E2) = inf atan2 (0.22250738585072014E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.3141592653589793E1) = inf atan2 (0.22250738585072014E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.2718281828459045E1) = inf atan2 (0.22250738585072014E~307, ~0.123E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E1) = inf atan2 (0.22250738585072014E~307, ~0.123) = 3.141592654 pow (0.22250738585072014E~307, ~0.123) = 6.93867642E37 atan2 (0.22250738585072014E~307, ~0.123E~2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E~2) = 2.390081808 atan2 (0.22250738585072014E~307, ~0.22250738585072014E~307) = 2.35619449 pow (0.22250738585072014E~307, ~0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, ~0.11125369292536007E~307) = 2.034443936 pow (0.22250738585072014E~307, ~0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, ~0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, ~0.5E~323) = 1 atan2 (0.22250738585072014E~307, ~0.0) = 1.570796327 pow (0.22250738585072014E~307, ~0.0) = 1 atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.22250738585072014E~307, ~inf) = 3.141592654 pow (0.22250738585072014E~307, ~inf) = inf atan2 (0.22250738585072014E~307, nan) = nan pow (0.22250738585072014E~307, nan) = nan atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (0.11125369292536007E~307, 0.123E4) = 9.045015685E~312 pow (0.11125369292536007E~307, 0.123E4) = 0 atan2 (0.11125369292536007E~307, 0.123E2) = 9.045015685E~310 pow (0.11125369292536007E~307, 0.123E2) = 0 atan2 (0.11125369292536007E~307, 0.3141592653589793E1) = 3.541315033E~309 pow (0.11125369292536007E~307, 0.3141592653589793E1) = 0 atan2 (0.11125369292536007E~307, 0.2718281828459045E1) = 4.092794638E~309 pow (0.11125369292536007E~307, 0.2718281828459045E1) = 0 atan2 (0.11125369292536007E~307, 0.123E1) = 9.045015685E~309 pow (0.11125369292536007E~307, 0.123E1) = 0 atan2 (0.11125369292536007E~307, 0.123) = 9.045015685E~308 pow (0.11125369292536007E~307, 0.123) = 1.323416898E~38 atan2 (0.11125369292536007E~307, 0.123E~2) = 9.045015685E~306 pow (0.11125369292536007E~307, 0.123E~2) = 0.4180391603 atan2 (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.463647609 pow (0.11125369292536007E~307, 0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.7853981634 pow (0.11125369292536007E~307, 0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, 0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, 0.5E~323) = 1 atan2 (0.11125369292536007E~307, 0.0) = 1.570796327 pow (0.11125369292536007E~307, 0.0) = 1 atan2 (0.11125369292536007E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (0.11125369292536007E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (0.11125369292536007E~307, ~0.123E4) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E4) = inf atan2 (0.11125369292536007E~307, ~0.123E2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E2) = inf atan2 (0.11125369292536007E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.3141592653589793E1) = inf atan2 (0.11125369292536007E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.2718281828459045E1) = inf atan2 (0.11125369292536007E~307, ~0.123E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E1) = inf atan2 (0.11125369292536007E~307, ~0.123) = 3.141592654 pow (0.11125369292536007E~307, ~0.123) = 7.556197911E37 atan2 (0.11125369292536007E~307, ~0.123E~2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E~2) = 2.392120392 atan2 (0.11125369292536007E~307, ~0.22250738585072014E~307) = 2.677945045 pow (0.11125369292536007E~307, ~0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, ~0.11125369292536007E~307) = 2.35619449 pow (0.11125369292536007E~307, ~0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, ~0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, ~0.5E~323) = 1 atan2 (0.11125369292536007E~307, ~0.0) = 1.570796327 pow (0.11125369292536007E~307, ~0.0) = 1 atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.11125369292536007E~307, ~inf) = 3.141592654 pow (0.11125369292536007E~307, ~inf) = inf atan2 (0.11125369292536007E~307, nan) = nan pow (0.11125369292536007E~307, nan) = nan atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.5E~323, 0.17976931348623157E309) = 0 pow (0.5E~323, 0.17976931348623157E309) = 0 atan2 (0.5E~323, 0.8988465674311579E308) = 0 pow (0.5E~323, 0.8988465674311579E308) = 0 atan2 (0.5E~323, 0.123E4) = 0 pow (0.5E~323, 0.123E4) = 0 atan2 (0.5E~323, 0.123E2) = 0 pow (0.5E~323, 0.123E2) = 0 atan2 (0.5E~323, 0.3141592653589793E1) = 0 pow (0.5E~323, 0.3141592653589793E1) = 0 atan2 (0.5E~323, 0.2718281828459045E1) = 0 pow (0.5E~323, 0.2718281828459045E1) = 0 atan2 (0.5E~323, 0.123E1) = 4.940656458E~324 pow (0.5E~323, 0.123E1) = 0 atan2 (0.5E~323, 0.123) = 3.952525167E~323 pow (0.5E~323, 0.123) = 1.711336892E~40 atan2 (0.5E~323, 0.123E~2) = 4.016753701E~321 pow (0.5E~323, 0.123E~2) = 0.4002518566 atan2 (0.5E~323, 0.22250738585072014E~307) = 2.220446049E~16 pow (0.5E~323, 0.22250738585072014E~307) = 1 atan2 (0.5E~323, 0.11125369292536007E~307) = 4.440892099E~16 pow (0.5E~323, 0.11125369292536007E~307) = 1 atan2 (0.5E~323, 0.5E~323) = 0.7853981634 pow (0.5E~323, 0.5E~323) = 1 atan2 (0.5E~323, 0.0) = 1.570796327 pow (0.5E~323, 0.0) = 1 atan2 (0.5E~323, ~0.17976931348623157E309) = 3.141592654 pow (0.5E~323, ~0.17976931348623157E309) = inf atan2 (0.5E~323, ~0.8988465674311579E308) = 3.141592654 pow (0.5E~323, ~0.8988465674311579E308) = inf atan2 (0.5E~323, ~0.123E4) = 3.141592654 pow (0.5E~323, ~0.123E4) = inf atan2 (0.5E~323, ~0.123E2) = 3.141592654 pow (0.5E~323, ~0.123E2) = inf atan2 (0.5E~323, ~0.3141592653589793E1) = 3.141592654 pow (0.5E~323, ~0.3141592653589793E1) = inf atan2 (0.5E~323, ~0.2718281828459045E1) = 3.141592654 pow (0.5E~323, ~0.2718281828459045E1) = inf atan2 (0.5E~323, ~0.123E1) = 3.141592654 pow (0.5E~323, ~0.123E1) = inf atan2 (0.5E~323, ~0.123) = 3.141592654 pow (0.5E~323, ~0.123) = 5.843384809E39 atan2 (0.5E~323, ~0.123E~2) = 3.141592654 pow (0.5E~323, ~0.123E~2) = 2.498426887 atan2 (0.5E~323, ~0.22250738585072014E~307) = 3.141592654 pow (0.5E~323, ~0.22250738585072014E~307) = 1 atan2 (0.5E~323, ~0.11125369292536007E~307) = 3.141592654 pow (0.5E~323, ~0.11125369292536007E~307) = 1 atan2 (0.5E~323, ~0.5E~323) = 2.35619449 pow (0.5E~323, ~0.5E~323) = 1 atan2 (0.5E~323, ~0.0) = 1.570796327 pow (0.5E~323, ~0.0) = 1 atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.5E~323, ~inf) = 3.141592654 pow (0.5E~323, ~inf) = inf atan2 (0.5E~323, nan) = nan pow (0.5E~323, nan) = nan atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.0, 0.17976931348623157E309) = 0 pow (0.0, 0.17976931348623157E309) = 0 atan2 (0.0, 0.8988465674311579E308) = 0 pow (0.0, 0.8988465674311579E308) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.3141592653589793E1) = 0 pow (0.0, 0.3141592653589793E1) = 0 atan2 (0.0, 0.2718281828459045E1) = 0 pow (0.0, 0.2718281828459045E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.22250738585072014E~307) = 0 pow (0.0, 0.22250738585072014E~307) = 0 atan2 (0.0, 0.11125369292536007E~307) = 0 pow (0.0, 0.11125369292536007E~307) = 0 atan2 (0.0, 0.5E~323) = 0 pow (0.0, 0.5E~323) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.17976931348623157E309) = 3.141592654 pow (0.0, ~0.17976931348623157E309) = inf atan2 (0.0, ~0.8988465674311579E308) = 3.141592654 pow (0.0, ~0.8988465674311579E308) = inf atan2 (0.0, ~0.123E4) = 3.141592654 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592654 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.3141592653589793E1) = 3.141592654 pow (0.0, ~0.3141592653589793E1) = inf atan2 (0.0, ~0.2718281828459045E1) = 3.141592654 pow (0.0, ~0.2718281828459045E1) = inf atan2 (0.0, ~0.123E1) = 3.141592654 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592654 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592654 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.22250738585072014E~307) = 3.141592654 pow (0.0, ~0.22250738585072014E~307) = inf atan2 (0.0, ~0.11125369292536007E~307) = 3.141592654 pow (0.0, ~0.11125369292536007E~307) = inf atan2 (0.0, ~0.5E~323) = 3.141592654 pow (0.0, ~0.5E~323) = inf atan2 (0.0, ~0.0) = 3.141592654 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592654 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.7853981634 pow (~0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (~0.17976931348623157E309, 0.8988465674311579E308) = ~1.107148718 pow (~0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (~0.17976931348623157E309, 0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E4) = inf atan2 (~0.17976931348623157E309, 0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E2) = nan atan2 (~0.17976931348623157E309, 0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, 0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, 0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E1) = nan atan2 (~0.17976931348623157E309, 0.123) = ~1.570796327 pow (~0.17976931348623157E309, 0.123) = nan atan2 (~0.17976931348623157E309, 0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E~2) = nan atan2 (~0.17976931348623157E309, 0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, 0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, 0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, 0.5E~323) = nan atan2 (~0.17976931348623157E309, 0.0) = ~1.570796327 pow (~0.17976931348623157E309, 0.0) = 1 atan2 (~0.17976931348623157E309, ~0.17976931348623157E309) = ~2.35619449 pow (~0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (~0.17976931348623157E309, ~0.8988465674311579E308) = ~2.034443936 pow (~0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (~0.17976931348623157E309, ~0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E4) = 0 atan2 (~0.17976931348623157E309, ~0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E2) = nan atan2 (~0.17976931348623157E309, ~0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, ~0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, ~0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E1) = nan atan2 (~0.17976931348623157E309, ~0.123) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123) = nan atan2 (~0.17976931348623157E309, ~0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E~2) = nan atan2 (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, ~0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, ~0.5E~323) = nan atan2 (~0.17976931348623157E309, ~0.0) = ~1.570796327 pow (~0.17976931348623157E309, ~0.0) = 1 atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.17976931348623157E309, ~inf) = ~3.141592654 pow (~0.17976931348623157E309, ~inf) = 0 atan2 (~0.17976931348623157E309, nan) = nan pow (~0.17976931348623157E309, nan) = nan atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.463647609 pow (~0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.7853981634 pow (~0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (~0.8988465674311579E308, 0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E4) = inf atan2 (~0.8988465674311579E308, 0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E2) = nan atan2 (~0.8988465674311579E308, 0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, 0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, 0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E1) = nan atan2 (~0.8988465674311579E308, 0.123) = ~1.570796327 pow (~0.8988465674311579E308, 0.123) = nan atan2 (~0.8988465674311579E308, 0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E~2) = nan atan2 (~0.8988465674311579E308, 0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, 0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, 0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, 0.5E~323) = nan atan2 (~0.8988465674311579E308, 0.0) = ~1.570796327 pow (~0.8988465674311579E308, 0.0) = 1 atan2 (~0.8988465674311579E308, ~0.17976931348623157E309) = ~2.677945045 pow (~0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (~0.8988465674311579E308, ~0.8988465674311579E308) = ~2.35619449 pow (~0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (~0.8988465674311579E308, ~0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E4) = 0 atan2 (~0.8988465674311579E308, ~0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E2) = nan atan2 (~0.8988465674311579E308, ~0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, ~0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, ~0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E1) = nan atan2 (~0.8988465674311579E308, ~0.123) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123) = nan atan2 (~0.8988465674311579E308, ~0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E~2) = nan atan2 (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, ~0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, ~0.5E~323) = nan atan2 (~0.8988465674311579E308, ~0.0) = ~1.570796327 pow (~0.8988465674311579E308, ~0.0) = 1 atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.8988465674311579E308, ~inf) = ~3.141592654 pow (~0.8988465674311579E308, ~inf) = 0 atan2 (~0.8988465674311579E308, nan) = nan pow (~0.8988465674311579E308, nan) = nan atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.123E4, 0.17976931348623157E309) = ~6.842102115E~306 pow (~0.123E4, 0.17976931348623157E309) = inf atan2 (~0.123E4, 0.8988465674311579E308) = ~1.368420423E~305 pow (~0.123E4, 0.8988465674311579E308) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981634 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.56079666 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.3141592653589793E1) = ~1.568242192 pow (~0.123E4, 0.3141592653589793E1) = nan atan2 (~0.123E4, 0.2718281828459045E1) = ~1.568586345 pow (~0.123E4, 0.2718281828459045E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796327 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696327 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795327 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, 0.22250738585072014E~307) = nan atan2 (~0.123E4, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, 0.11125369292536007E~307) = nan atan2 (~0.123E4, 0.5E~323) = ~1.570796327 pow (~0.123E4, 0.5E~323) = nan atan2 (~0.123E4, 0.0) = ~1.570796327 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E4, ~0.17976931348623157E309) = 0 atan2 (~0.123E4, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E4, ~0.8988465674311579E308) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.35619449 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580795993 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.3141592653589793E1) = ~1.573350462 pow (~0.123E4, ~0.3141592653589793E1) = nan atan2 (~0.123E4, ~0.2718281828459045E1) = ~1.573006308 pow (~0.123E4, ~0.2718281828459045E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796326 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896327 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797327 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, ~0.22250738585072014E~307) = nan atan2 (~0.123E4, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, ~0.11125369292536007E~307) = nan atan2 (~0.123E4, ~0.5E~323) = ~1.570796327 pow (~0.123E4, ~0.5E~323) = nan atan2 (~0.123E4, ~0.0) = ~1.570796327 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592654 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.17976931348623157E309) = ~6.842102115E~308 pow (~0.123E2, 0.17976931348623157E309) = inf atan2 (~0.123E2, 0.8988465674311579E308) = ~1.368420423E~307 pow (~0.123E2, 0.8988465674311579E308) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666687 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981634 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.3141592653589793E1) = ~1.320728626 pow (~0.123E2, 0.3141592653589793E1) = nan atan2 (~0.123E2, 0.2718281828459045E1) = ~1.353293796 pow (~0.123E2, 0.2718281828459045E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127674 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.56079666 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696327 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, 0.22250738585072014E~307) = nan atan2 (~0.123E2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, 0.11125369292536007E~307) = nan atan2 (~0.123E2, 0.5E~323) = ~1.570796327 pow (~0.123E2, 0.5E~323) = nan atan2 (~0.123E2, 0.0) = ~1.570796327 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E2, ~0.17976931348623157E309) = 0 atan2 (~0.123E2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E2, ~0.8988465674311579E308) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592987 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.35619449 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.3141592653589793E1) = ~1.820864027 pow (~0.123E2, ~0.3141592653589793E1) = nan atan2 (~0.123E2, ~0.2718281828459045E1) = ~1.788298857 pow (~0.123E2, ~0.2718281828459045E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464979 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580795993 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896327 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, ~0.22250738585072014E~307) = nan atan2 (~0.123E2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, ~0.11125369292536007E~307) = nan atan2 (~0.123E2, ~0.5E~323) = ~1.570796327 pow (~0.123E2, ~0.5E~323) = nan atan2 (~0.123E2, ~0.0) = ~1.570796327 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592654 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.3141592653589793E1, 0.17976931348623157E309) = ~1.747568922E~308 pow (~0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (~0.3141592653589793E1, 0.8988465674311579E308) = ~3.495137844E~308 pow (~0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (~0.3141592653589793E1, 0.123E4) = ~0.002554134815 pow (~0.3141592653589793E1, 0.123E4) = inf atan2 (~0.3141592653589793E1, 0.123E2) = ~0.2500677004 pow (~0.3141592653589793E1, 0.123E2) = nan atan2 (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.7853981634 pow (~0.3141592653589793E1, 0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8575117864 pow (~0.3141592653589793E1, 0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, 0.123E1) = ~1.197620596 pow (~0.3141592653589793E1, 0.123E1) = nan atan2 (~0.3141592653589793E1, 0.123) = ~1.531664198 pow (~0.3141592653589793E1, 0.123) = nan atan2 (~0.3141592653589793E1, 0.123E~2) = ~1.570404806 pow (~0.3141592653589793E1, 0.123E~2) = nan atan2 (~0.3141592653589793E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, 0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, 0.5E~323) = nan atan2 (~0.3141592653589793E1, 0.0) = ~1.570796327 pow (~0.3141592653589793E1, 0.0) = 1 atan2 (~0.3141592653589793E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (~0.3141592653589793E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (~0.3141592653589793E1, ~0.123E4) = ~3.139038519 pow (~0.3141592653589793E1, ~0.123E4) = 0 atan2 (~0.3141592653589793E1, ~0.123E2) = ~2.891524953 pow (~0.3141592653589793E1, ~0.123E2) = nan atan2 (~0.3141592653589793E1, ~0.3141592653589793E1) = ~2.35619449 pow (~0.3141592653589793E1, ~0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, ~0.2718281828459045E1) = ~2.284080867 pow (~0.3141592653589793E1, ~0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, ~0.123E1) = ~1.943972057 pow (~0.3141592653589793E1, ~0.123E1) = nan atan2 (~0.3141592653589793E1, ~0.123) = ~1.609928456 pow (~0.3141592653589793E1, ~0.123) = nan atan2 (~0.3141592653589793E1, ~0.123E~2) = ~1.571187848 pow (~0.3141592653589793E1, ~0.123E~2) = nan atan2 (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, ~0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, ~0.5E~323) = nan atan2 (~0.3141592653589793E1, ~0.0) = ~1.570796327 pow (~0.3141592653589793E1, ~0.0) = 1 atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.3141592653589793E1, ~inf) = ~3.141592654 pow (~0.3141592653589793E1, ~inf) = 0 atan2 (~0.3141592653589793E1, nan) = nan pow (~0.3141592653589793E1, nan) = nan atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.2718281828459045E1, 0.17976931348623157E309) = ~1.512094459E~308 pow (~0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (~0.2718281828459045E1, 0.8988465674311579E308) = ~3.024188918E~308 pow (~0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (~0.2718281828459045E1, 0.123E4) = ~0.002209981629 pow (~0.2718281828459045E1, 0.123E4) = inf atan2 (~0.2718281828459045E1, 0.123E2) = ~0.2175025304 pow (~0.2718281828459045E1, 0.123E2) = nan atan2 (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.7132845404 pow (~0.2718281828459045E1, 0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.7853981634 pow (~0.2718281828459045E1, 0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, 0.123E1) = ~1.145872224 pow (~0.2718281828459045E1, 0.123E1) = nan atan2 (~0.2718281828459045E1, 0.123) = ~1.525578 pow (~0.2718281828459045E1, 0.123) = nan atan2 (~0.2718281828459045E1, 0.123E~2) = ~1.570343835 pow (~0.2718281828459045E1, 0.123E~2) = nan atan2 (~0.2718281828459045E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, 0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, 0.5E~323) = nan atan2 (~0.2718281828459045E1, 0.0) = ~1.570796327 pow (~0.2718281828459045E1, 0.0) = 1 atan2 (~0.2718281828459045E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (~0.2718281828459045E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (~0.2718281828459045E1, ~0.123E4) = ~3.139382672 pow (~0.2718281828459045E1, ~0.123E4) = 0 atan2 (~0.2718281828459045E1, ~0.123E2) = ~2.924090123 pow (~0.2718281828459045E1, ~0.123E2) = nan atan2 (~0.2718281828459045E1, ~0.3141592653589793E1) = ~2.428308113 pow (~0.2718281828459045E1, ~0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, ~0.2718281828459045E1) = ~2.35619449 pow (~0.2718281828459045E1, ~0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, ~0.123E1) = ~1.99572043 pow (~0.2718281828459045E1, ~0.123E1) = nan atan2 (~0.2718281828459045E1, ~0.123) = ~1.616014654 pow (~0.2718281828459045E1, ~0.123) = nan atan2 (~0.2718281828459045E1, ~0.123E~2) = ~1.571248818 pow (~0.2718281828459045E1, ~0.123E~2) = nan atan2 (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, ~0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, ~0.5E~323) = nan atan2 (~0.2718281828459045E1, ~0.0) = ~1.570796327 pow (~0.2718281828459045E1, ~0.0) = 1 atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.2718281828459045E1, ~inf) = ~3.141592654 pow (~0.2718281828459045E1, ~inf) = 0 atan2 (~0.2718281828459045E1, nan) = nan pow (~0.2718281828459045E1, nan) = nan atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.123E1, 0.17976931348623157E309) = ~6.842102115E~309 pow (~0.123E1, 0.17976931348623157E309) = inf atan2 (~0.123E1, 0.8988465674311579E308) = ~1.368420423E~308 pow (~0.123E1, 0.8988465674311579E308) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996667E~4 pow (~0.123E1, 0.123E4) = 3.830778757E110 atan2 (~0.123E1, 0.123E2) = ~0.09966865249 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.3141592653589793E1) = ~0.3731757303 pow (~0.123E1, 0.3141592653589793E1) = nan atan2 (~0.123E1, 0.2718281828459045E1) = ~0.4249241031 pow (~0.123E1, 0.2718281828459045E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981634 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127674 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796327 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, 0.22250738585072014E~307) = nan atan2 (~0.123E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, 0.11125369292536007E~307) = nan atan2 (~0.123E1, 0.5E~323) = ~1.570796327 pow (~0.123E1, 0.5E~323) = nan atan2 (~0.123E1, 0.0) = ~1.570796327 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E1, ~0.17976931348623157E309) = 0 atan2 (~0.123E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E1, ~0.8988465674311579E308) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592654 pow (~0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (~0.123E1, ~0.123E2) = ~3.041924001 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.3141592653589793E1) = ~2.768416923 pow (~0.123E1, ~0.3141592653589793E1) = nan atan2 (~0.123E1, ~0.2718281828459045E1) = ~2.71666855 pow (~0.123E1, ~0.2718281828459045E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.35619449 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464979 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796326 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, ~0.22250738585072014E~307) = nan atan2 (~0.123E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, ~0.11125369292536007E~307) = nan atan2 (~0.123E1, ~0.5E~323) = ~1.570796327 pow (~0.123E1, ~0.5E~323) = nan atan2 (~0.123E1, ~0.0) = ~1.570796327 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592654 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.17976931348623157E309) = ~6.842102115E~310 pow (~0.123, 0.17976931348623157E309) = 0 atan2 (~0.123, 0.8988465674311579E308) = ~1.368420423E~309 pow (~0.123, 0.8988465674311579E308) = 0 atan2 (~0.123, 0.123E4) = ~9.999999967E~5 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666687 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.3141592653589793E1) = ~0.03913212911 pow (~0.123, 0.3141592653589793E1) = nan atan2 (~0.123, 0.2718281828459045E1) = ~0.04521832678 pow (~0.123, 0.2718281828459045E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865249 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981634 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.56079666 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123, 0.22250738585072014E~307) = nan atan2 (~0.123, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123, 0.11125369292536007E~307) = nan atan2 (~0.123, 0.5E~323) = ~1.570796327 pow (~0.123, 0.5E~323) = nan atan2 (~0.123, 0.0) = ~1.570796327 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123, ~0.17976931348623157E309) = inf atan2 (~0.123, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123, ~0.8988465674311579E308) = inf atan2 (~0.123, ~0.123E4) = ~3.141492654 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592987 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.3141592653589793E1) = ~3.102460524 pow (~0.123, ~0.3141592653589793E1) = nan atan2 (~0.123, ~0.2718281828459045E1) = ~3.096374327 pow (~0.123, ~0.2718281828459045E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924001 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.35619449 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580795993 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123, ~0.22250738585072014E~307) = nan atan2 (~0.123, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123, ~0.11125369292536007E~307) = nan atan2 (~0.123, ~0.5E~323) = ~1.570796327 pow (~0.123, ~0.5E~323) = nan atan2 (~0.123, ~0.0) = ~1.570796327 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592654 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.17976931348623157E309) = ~6.842102115E~312 pow (~0.123E~2, 0.17976931348623157E309) = 0 atan2 (~0.123E~2, 0.8988465674311579E308) = ~1.368420423E~311 pow (~0.123E~2, 0.8988465674311579E308) = 0 atan2 (~0.123E~2, 0.123E4) = ~1E~6 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~9.999999967E~5 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.3141592653589793E1) = ~3.9152114E~4 pow (~0.123E~2, 0.3141592653589793E1) = nan atan2 (~0.123E~2, 0.2718281828459045E1) = ~4.524916818E~4 pow (~0.123E~2, 0.2718281828459045E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996667E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666687 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981634 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, 0.22250738585072014E~307) = nan atan2 (~0.123E~2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, 0.11125369292536007E~307) = nan atan2 (~0.123E~2, 0.5E~323) = ~1.570796327 pow (~0.123E~2, 0.5E~323) = nan atan2 (~0.123E~2, 0.0) = ~1.570796327 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E~2, ~0.17976931348623157E309) = inf atan2 (~0.123E~2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E~2, ~0.8988465674311579E308) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591654 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492654 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.3141592653589793E1) = ~3.141201132 pow (~0.123E~2, ~0.3141592653589793E1) = nan atan2 (~0.123E~2, ~0.2718281828459045E1) = ~3.141140162 pow (~0.123E~2, ~0.2718281828459045E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592654 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592987 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.35619449 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, ~0.22250738585072014E~307) = nan atan2 (~0.123E~2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, ~0.11125369292536007E~307) = nan atan2 (~0.123E~2, ~0.5E~323) = ~1.570796327 pow (~0.123E~2, ~0.5E~323) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796327 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592654 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (~0.22250738585072014E~307, 0.123E4) = ~1.809003137E~311 pow (~0.22250738585072014E~307, 0.123E4) = 0 atan2 (~0.22250738585072014E~307, 0.123E2) = ~1.809003137E~309 pow (~0.22250738585072014E~307, 0.123E2) = nan atan2 (~0.22250738585072014E~307, 0.3141592653589793E1) = ~7.082630067E~309 pow (~0.22250738585072014E~307, 0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, 0.2718281828459045E1) = ~8.185589276E~309 pow (~0.22250738585072014E~307, 0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, 0.123E1) = ~1.809003137E~308 pow (~0.22250738585072014E~307, 0.123E1) = nan atan2 (~0.22250738585072014E~307, 0.123) = ~1.809003137E~307 pow (~0.22250738585072014E~307, 0.123) = nan atan2 (~0.22250738585072014E~307, 0.123E~2) = ~1.809003137E~305 pow (~0.22250738585072014E~307, 0.123E~2) = nan atan2 (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.7853981634 pow (~0.22250738585072014E~307, 0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~1.107148718 pow (~0.22250738585072014E~307, 0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, 0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, 0.5E~323) = nan atan2 (~0.22250738585072014E~307, 0.0) = ~1.570796327 pow (~0.22250738585072014E~307, 0.0) = 1 atan2 (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (~0.22250738585072014E~307, ~0.123E4) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E4) = inf atan2 (~0.22250738585072014E~307, ~0.123E2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E2) = nan atan2 (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, ~0.123E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E1) = nan atan2 (~0.22250738585072014E~307, ~0.123) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123) = nan atan2 (~0.22250738585072014E~307, ~0.123E~2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E~2) = nan atan2 (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~2.35619449 pow (~0.22250738585072014E~307, ~0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~2.034443936 pow (~0.22250738585072014E~307, ~0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, ~0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.5E~323) = nan atan2 (~0.22250738585072014E~307, ~0.0) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.0) = 1 atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.22250738585072014E~307, ~inf) = ~3.141592654 pow (~0.22250738585072014E~307, ~inf) = inf atan2 (~0.22250738585072014E~307, nan) = nan pow (~0.22250738585072014E~307, nan) = nan atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (~0.11125369292536007E~307, 0.123E4) = ~9.045015685E~312 pow (~0.11125369292536007E~307, 0.123E4) = 0 atan2 (~0.11125369292536007E~307, 0.123E2) = ~9.045015685E~310 pow (~0.11125369292536007E~307, 0.123E2) = nan atan2 (~0.11125369292536007E~307, 0.3141592653589793E1) = ~3.541315033E~309 pow (~0.11125369292536007E~307, 0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, 0.2718281828459045E1) = ~4.092794638E~309 pow (~0.11125369292536007E~307, 0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, 0.123E1) = ~9.045015685E~309 pow (~0.11125369292536007E~307, 0.123E1) = nan atan2 (~0.11125369292536007E~307, 0.123) = ~9.045015685E~308 pow (~0.11125369292536007E~307, 0.123) = nan atan2 (~0.11125369292536007E~307, 0.123E~2) = ~9.045015685E~306 pow (~0.11125369292536007E~307, 0.123E~2) = nan atan2 (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.463647609 pow (~0.11125369292536007E~307, 0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.7853981634 pow (~0.11125369292536007E~307, 0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, 0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, 0.5E~323) = nan atan2 (~0.11125369292536007E~307, 0.0) = ~1.570796327 pow (~0.11125369292536007E~307, 0.0) = 1 atan2 (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (~0.11125369292536007E~307, ~0.123E4) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E4) = inf atan2 (~0.11125369292536007E~307, ~0.123E2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E2) = nan atan2 (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, ~0.123E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E1) = nan atan2 (~0.11125369292536007E~307, ~0.123) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123) = nan atan2 (~0.11125369292536007E~307, ~0.123E~2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E~2) = nan atan2 (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~2.677945045 pow (~0.11125369292536007E~307, ~0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~2.35619449 pow (~0.11125369292536007E~307, ~0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, ~0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.5E~323) = nan atan2 (~0.11125369292536007E~307, ~0.0) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.0) = 1 atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.11125369292536007E~307, ~inf) = ~3.141592654 pow (~0.11125369292536007E~307, ~inf) = inf atan2 (~0.11125369292536007E~307, nan) = nan pow (~0.11125369292536007E~307, nan) = nan atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.5E~323, 0.17976931348623157E309) = 0 pow (~0.5E~323, 0.17976931348623157E309) = 0 atan2 (~0.5E~323, 0.8988465674311579E308) = 0 pow (~0.5E~323, 0.8988465674311579E308) = 0 atan2 (~0.5E~323, 0.123E4) = 0 pow (~0.5E~323, 0.123E4) = 0 atan2 (~0.5E~323, 0.123E2) = 0 pow (~0.5E~323, 0.123E2) = nan atan2 (~0.5E~323, 0.3141592653589793E1) = 0 pow (~0.5E~323, 0.3141592653589793E1) = nan atan2 (~0.5E~323, 0.2718281828459045E1) = 0 pow (~0.5E~323, 0.2718281828459045E1) = nan atan2 (~0.5E~323, 0.123E1) = ~4.940656458E~324 pow (~0.5E~323, 0.123E1) = nan atan2 (~0.5E~323, 0.123) = ~3.952525167E~323 pow (~0.5E~323, 0.123) = nan atan2 (~0.5E~323, 0.123E~2) = ~4.016753701E~321 pow (~0.5E~323, 0.123E~2) = nan atan2 (~0.5E~323, 0.22250738585072014E~307) = ~2.220446049E~16 pow (~0.5E~323, 0.22250738585072014E~307) = nan atan2 (~0.5E~323, 0.11125369292536007E~307) = ~4.440892099E~16 pow (~0.5E~323, 0.11125369292536007E~307) = nan atan2 (~0.5E~323, 0.5E~323) = ~0.7853981634 pow (~0.5E~323, 0.5E~323) = nan atan2 (~0.5E~323, 0.0) = ~1.570796327 pow (~0.5E~323, 0.0) = 1 atan2 (~0.5E~323, ~0.17976931348623157E309) = ~3.141592654 pow (~0.5E~323, ~0.17976931348623157E309) = inf atan2 (~0.5E~323, ~0.8988465674311579E308) = ~3.141592654 pow (~0.5E~323, ~0.8988465674311579E308) = inf atan2 (~0.5E~323, ~0.123E4) = ~3.141592654 pow (~0.5E~323, ~0.123E4) = inf atan2 (~0.5E~323, ~0.123E2) = ~3.141592654 pow (~0.5E~323, ~0.123E2) = nan atan2 (~0.5E~323, ~0.3141592653589793E1) = ~3.141592654 pow (~0.5E~323, ~0.3141592653589793E1) = nan atan2 (~0.5E~323, ~0.2718281828459045E1) = ~3.141592654 pow (~0.5E~323, ~0.2718281828459045E1) = nan atan2 (~0.5E~323, ~0.123E1) = ~3.141592654 pow (~0.5E~323, ~0.123E1) = nan atan2 (~0.5E~323, ~0.123) = ~3.141592654 pow (~0.5E~323, ~0.123) = nan atan2 (~0.5E~323, ~0.123E~2) = ~3.141592654 pow (~0.5E~323, ~0.123E~2) = nan atan2 (~0.5E~323, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.5E~323, ~0.22250738585072014E~307) = nan atan2 (~0.5E~323, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.5E~323, ~0.11125369292536007E~307) = nan atan2 (~0.5E~323, ~0.5E~323) = ~2.35619449 pow (~0.5E~323, ~0.5E~323) = nan atan2 (~0.5E~323, ~0.0) = ~1.570796327 pow (~0.5E~323, ~0.0) = 1 atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.5E~323, ~inf) = ~3.141592654 pow (~0.5E~323, ~inf) = inf atan2 (~0.5E~323, nan) = nan pow (~0.5E~323, nan) = nan atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.0, 0.17976931348623157E309) = 0 pow (~0.0, 0.17976931348623157E309) = 0 atan2 (~0.0, 0.8988465674311579E308) = 0 pow (~0.0, 0.8988465674311579E308) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.3141592653589793E1) = 0 pow (~0.0, 0.3141592653589793E1) = 0 atan2 (~0.0, 0.2718281828459045E1) = 0 pow (~0.0, 0.2718281828459045E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.22250738585072014E~307) = 0 pow (~0.0, 0.22250738585072014E~307) = 0 atan2 (~0.0, 0.11125369292536007E~307) = 0 pow (~0.0, 0.11125369292536007E~307) = 0 atan2 (~0.0, 0.5E~323) = 0 pow (~0.0, 0.5E~323) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.17976931348623157E309) = ~3.141592654 pow (~0.0, ~0.17976931348623157E309) = inf atan2 (~0.0, ~0.8988465674311579E308) = ~3.141592654 pow (~0.0, ~0.8988465674311579E308) = inf atan2 (~0.0, ~0.123E4) = ~3.141592654 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592654 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.3141592653589793E1) = ~3.141592654 pow (~0.0, ~0.3141592653589793E1) = inf atan2 (~0.0, ~0.2718281828459045E1) = ~3.141592654 pow (~0.0, ~0.2718281828459045E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592654 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592654 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592654 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.0, ~0.22250738585072014E~307) = inf atan2 (~0.0, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.0, ~0.11125369292536007E~307) = inf atan2 (~0.0, ~0.5E~323) = ~3.141592654 pow (~0.0, ~0.5E~323) = inf atan2 (~0.0, ~0.0) = ~3.141592654 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592654 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (~inf, 0.17976931348623157E309) = ~1.570796327 pow (~inf, 0.17976931348623157E309) = inf atan2 (~inf, 0.8988465674311579E308) = ~1.570796327 pow (~inf, 0.8988465674311579E308) = inf atan2 (~inf, 0.123E4) = ~1.570796327 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796327 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.3141592653589793E1) = ~1.570796327 pow (~inf, 0.3141592653589793E1) = inf atan2 (~inf, 0.2718281828459045E1) = ~1.570796327 pow (~inf, 0.2718281828459045E1) = inf atan2 (~inf, 0.123E1) = ~1.570796327 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796327 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796327 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.22250738585072014E~307) = ~1.570796327 pow (~inf, 0.22250738585072014E~307) = inf atan2 (~inf, 0.11125369292536007E~307) = ~1.570796327 pow (~inf, 0.11125369292536007E~307) = inf atan2 (~inf, 0.5E~323) = ~1.570796327 pow (~inf, 0.5E~323) = inf atan2 (~inf, 0.0) = ~1.570796327 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.17976931348623157E309) = ~1.570796327 pow (~inf, ~0.17976931348623157E309) = 0 atan2 (~inf, ~0.8988465674311579E308) = ~1.570796327 pow (~inf, ~0.8988465674311579E308) = 0 atan2 (~inf, ~0.123E4) = ~1.570796327 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796327 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.3141592653589793E1) = ~1.570796327 pow (~inf, ~0.3141592653589793E1) = 0 atan2 (~inf, ~0.2718281828459045E1) = ~1.570796327 pow (~inf, ~0.2718281828459045E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796327 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796327 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796327 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.22250738585072014E~307) = ~1.570796327 pow (~inf, ~0.22250738585072014E~307) = 0 atan2 (~inf, ~0.11125369292536007E~307) = ~1.570796327 pow (~inf, ~0.11125369292536007E~307) = 0 atan2 (~inf, ~0.5E~323) = ~1.570796327 pow (~inf, ~0.5E~323) = 0 atan2 (~inf, ~0.0) = ~1.570796327 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.35619449 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (nan, 0.17976931348623157E309) = nan pow (nan, 0.17976931348623157E309) = nan atan2 (nan, 0.8988465674311579E308) = nan pow (nan, 0.8988465674311579E308) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.3141592653589793E1) = nan pow (nan, 0.3141592653589793E1) = nan atan2 (nan, 0.2718281828459045E1) = nan pow (nan, 0.2718281828459045E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.22250738585072014E~307) = nan pow (nan, 0.22250738585072014E~307) = nan atan2 (nan, 0.11125369292536007E~307) = nan pow (nan, 0.11125369292536007E~307) = nan atan2 (nan, 0.5E~323) = nan pow (nan, 0.5E~323) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.17976931348623157E309) = nan pow (nan, ~0.17976931348623157E309) = nan atan2 (nan, ~0.8988465674311579E308) = nan pow (nan, ~0.8988465674311579E308) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.3141592653589793E1) = nan pow (nan, ~0.3141592653589793E1) = nan atan2 (nan, ~0.2718281828459045E1) = nan pow (nan, ~0.2718281828459045E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.22250738585072014E~307) = nan pow (nan, ~0.22250738585072014E~307) = nan atan2 (nan, ~0.11125369292536007E~307) = nan pow (nan, ~0.11125369292536007E~307) = nan atan2 (nan, ~0.5E~323) = nan pow (nan, ~0.5E~323) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.17976931348623157E309, 0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.17976931348623157E309, 0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.17976931348623157E309, ~0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.17976931348623157E309, ~0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.8988465674311579E308, 0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.8988465674311579E308, 0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.8988465674311579E308, ~0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.8988465674311579E308, ~0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.8988465674311579E308, ~0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E4, 0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E4, 0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E4, 0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E4, 0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E4, 0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E4, 0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E4, 0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.123E4, 0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.123E4, 0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.123E4, 0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.123E4, 0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.123E4, 0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.123E4, 0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.123E4, 0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.123E4, 0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E4, 0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E4, 0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E4, 0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E4, 0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E4, 0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E4, 0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E4, 0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123E4, 0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123E4, 0.123, 0.123): 0.151413E3 0.15141299999999998E3 (0.123E4, 0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123E4, 0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123E4, 0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E4, 0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (0.123E4, 0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E4, ~0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E4, ~0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E4, ~0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E4, ~0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E4, ~0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E4, ~0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E4, ~0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.123E4, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.123E4, ~0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.123E4, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.123E4, ~0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.123E4, ~0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E4, ~0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E4, ~0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E4, ~0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E4, ~0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E4, ~0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E4, ~0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E4, ~0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123E4, ~0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123E4, ~0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123E4, ~0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123E4, ~0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E4, ~0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E4, ~0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E2, 0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E2, 0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E2, 0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E2, 0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E2, 0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E2, 0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E2, 0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.123E2, 0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.123E2, 0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.123E2, 0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.123E2, 0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.123E2, 0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.123E2, 0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.123E2, 0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.123E2, 0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E2, 0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E2, 0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E2, 0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E2, 0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123E2, 0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123E2, 0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E2, ~0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E2, ~0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E2, ~0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E2, ~0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E2, ~0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E2, ~0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E2, ~0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.123E2, ~0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.123E2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.123E2, ~0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.123E2, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.123E2, ~0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.123E2, ~0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E2, ~0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E2, ~0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E2, ~0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E2, ~0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123E2, ~0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123E2, ~0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.3141592653589793E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.3141592653589793E1, 0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.3141592653589793E1, 0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.3141592653589793E1, 0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.3141592653589793E1, 0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.3141592653589793E1, 0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.3141592653589793E1, 0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.3141592653589793E1, 0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.3141592653589793E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.3141592653589793E1, 0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.3141592653589793E1, 0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.3141592653589793E1, 0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.3141592653589793E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.3141592653589793E1, ~0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.3141592653589793E1, ~0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.3141592653589793E1, ~0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.3141592653589793E1, ~0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.3141592653589793E1, ~0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.3141592653589793E1, ~0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.3141592653589793E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.3141592653589793E1, ~0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.3141592653589793E1, ~0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.3141592653589793E1, ~0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.2718281828459045E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.2718281828459045E1, 0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.2718281828459045E1, 0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.2718281828459045E1, 0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.2718281828459045E1, 0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.2718281828459045E1, 0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.2718281828459045E1, 0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.2718281828459045E1, 0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.2718281828459045E1, 0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.2718281828459045E1, 0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.2718281828459045E1, 0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.2718281828459045E1, 0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.2718281828459045E1, 0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (0.2718281828459045E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.2718281828459045E1, ~0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.2718281828459045E1, ~0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.2718281828459045E1, ~0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.2718281828459045E1, ~0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.2718281828459045E1, ~0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.2718281828459045E1, ~0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (0.2718281828459045E1, ~0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.2718281828459045E1, ~0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.2718281828459045E1, ~0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123E1, 0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.123E1, 0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.123E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.123E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.123E1, 0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E1, 0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E1, 0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E1, 0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E1, 0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E1, 0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E1, 0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E1, 0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E1, 0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E1, 0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E1, 0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.123E1, 0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.123E1, 0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.123E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.123E1, 0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E1, 0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (0.123E1, 0.123, 0.123): 0.27429 0.27429000000000003 (0.123E1, 0.123, 0.123E~2): 0.15252 0.15252000000000002 (0.123E1, 0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.123E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.123E1, ~0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.123E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E1, ~0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E1, ~0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E1, ~0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E1, ~0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E1, ~0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E1, ~0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E1, ~0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E1, ~0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E1, ~0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E1, ~0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E1, ~0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.123E1, ~0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.123E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.123E1, ~0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.123E1, ~0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E1, ~0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123E1, ~0.123, ~0.123): ~0.27429 ~0.27429000000000003 (0.123E1, ~0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, 0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123, 0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123, 0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (0.123, 0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123, 0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123, 0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123, 0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123, 0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (0.123, 0.123E1, 0.123): 0.27429 0.27429000000000003 (0.123, 0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (0.123, 0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123, 0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.123, 0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.123, ~0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123, ~0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123, ~0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123, ~0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123, ~0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123, ~0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123, ~0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123, ~0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123, ~0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123, ~0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (0.123, ~0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, ~0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.123, ~0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (0.123E~2, 0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E~2, 0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (0.123E~2, 0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E~2, 0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E~2, 0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.123E~2, ~0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E~2, ~0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E~2, ~0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E~2, ~0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.123E~2, ~0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.11125369292536007E~307, 0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.11125369292536007E~307, 0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.17976931348623157E309, 0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.17976931348623157E309, 0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.17976931348623157E309, ~0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.17976931348623157E309, ~0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.8988465674311579E308, 0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.8988465674311579E308, 0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.8988465674311579E308, ~0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.8988465674311579E308, ~0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E4, 0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E4, 0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E4, 0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E4, 0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E4, 0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E4, 0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E4, 0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.123E4, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.123E4, 0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.123E4, 0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.123E4, 0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.123E4, 0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E4, 0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E4, 0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E4, 0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E4, 0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E4, 0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E4, 0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E4, 0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123E4, 0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123E4, 0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123E4, 0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123E4, 0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E4, 0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E4, 0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E4, ~0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E4, ~0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E4, ~0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E4, ~0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E4, ~0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E4, ~0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E4, ~0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.123E4, ~0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.123E4, ~0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.123E4, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.123E4, ~0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E4, ~0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E4, ~0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E4, ~0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E4, ~0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E4, ~0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E4, ~0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E4, ~0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123E4, ~0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123E4, ~0.123, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123E4, ~0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123E4, ~0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123E4, ~0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E4, ~0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E2, 0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E2, 0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E2, 0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E2, 0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E2, 0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E2, 0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E2, 0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.123E2, 0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.123E2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.123E2, 0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.123E2, 0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.123E2, 0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.123E2, 0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E2, 0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E2, 0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E2, 0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E2, 0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123E2, 0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123E2, 0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E2, ~0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E2, ~0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E2, ~0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E2, ~0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E2, ~0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E2, ~0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.123E2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.123E2, ~0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.123E2, ~0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.123E2, ~0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.123E2, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E2, ~0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E2, ~0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E2, ~0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E2, ~0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123E2, ~0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123E2, ~0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.3141592653589793E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.3141592653589793E1, 0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.3141592653589793E1, 0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.3141592653589793E1, 0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.3141592653589793E1, 0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.3141592653589793E1, 0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.3141592653589793E1, 0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.3141592653589793E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.3141592653589793E1, 0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.3141592653589793E1, 0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.3141592653589793E1, 0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.3141592653589793E1, ~0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.3141592653589793E1, ~0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.3141592653589793E1, ~0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.3141592653589793E1, ~0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.3141592653589793E1, ~0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.3141592653589793E1, ~0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.3141592653589793E1, ~0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.3141592653589793E1, ~0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.2718281828459045E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.2718281828459045E1, 0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.2718281828459045E1, 0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.2718281828459045E1, 0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.2718281828459045E1, 0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.2718281828459045E1, 0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.2718281828459045E1, 0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (~0.2718281828459045E1, 0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.2718281828459045E1, 0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.2718281828459045E1, 0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.2718281828459045E1, ~0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.2718281828459045E1, ~0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.2718281828459045E1, ~0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.2718281828459045E1, ~0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.2718281828459045E1, ~0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (~0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.2718281828459045E1, ~0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.2718281828459045E1, ~0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.2718281828459045E1, ~0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123E1, 0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.123E1, 0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.123E1, 0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.123E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.123E1, 0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E1, 0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E1, 0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E1, 0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E1, 0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E1, 0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E1, 0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E1, 0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E1, 0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E1, 0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E1, 0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.123E1, 0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.123E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.123E1, 0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.123E1, 0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E1, 0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123E1, 0.123, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123E1, 0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123E1, ~0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.123E1, ~0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.123E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.123E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E1, ~0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E1, ~0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E1, ~0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E1, ~0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E1, ~0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E1, ~0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E1, ~0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E1, ~0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E1, ~0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E1, ~0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E1, ~0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.123E1, ~0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.123E1, ~0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.123E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.123E1, ~0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E1, ~0.123, 0.123): 0.27429 0.27429000000000003 (~0.123E1, ~0.123, 0.123E~2): 0.15252 0.15252000000000002 (~0.123E1, ~0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, 0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123, 0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123, 0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123, 0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123, 0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123, 0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123, 0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123, 0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.123, 0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123, 0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123, 0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123, 0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.123, 0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.123, ~0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123, ~0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123, ~0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123, ~0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123, ~0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123, ~0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123, ~0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123, ~0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123, ~0.123E1, 0.123): 0.27429 0.27429000000000003 (~0.123, ~0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (~0.123, ~0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, ~0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.123, ~0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (~0.123E~2, 0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E~2, 0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E~2, 0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E~2, 0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E~2, 0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.123E~2, ~0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E~2, ~0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E~2, ~0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.123E~2, ~0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.11125369292536007E~307, 0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.11125369292536007E~307, 0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.17976931348623157E309, 0.17976931348623157E309) = false > (0.17976931348623157E309, 0.17976931348623157E309) = false == (0.17976931348623157E309, 0.17976931348623157E309) = true ?= (0.17976931348623157E309, 0.17976931348623157E309) = true < (0.17976931348623157E309, 0.8988465674311579E308) = false > (0.17976931348623157E309, 0.8988465674311579E308) = true == (0.17976931348623157E309, 0.8988465674311579E308) = false ?= (0.17976931348623157E309, 0.8988465674311579E308) = false < (0.17976931348623157E309, 0.123E4) = false > (0.17976931348623157E309, 0.123E4) = true == (0.17976931348623157E309, 0.123E4) = false ?= (0.17976931348623157E309, 0.123E4) = false < (0.17976931348623157E309, 0.123E2) = false > (0.17976931348623157E309, 0.123E2) = true == (0.17976931348623157E309, 0.123E2) = false ?= (0.17976931348623157E309, 0.123E2) = false < (0.17976931348623157E309, 0.3141592653589793E1) = false > (0.17976931348623157E309, 0.3141592653589793E1) = true == (0.17976931348623157E309, 0.3141592653589793E1) = false ?= (0.17976931348623157E309, 0.3141592653589793E1) = false < (0.17976931348623157E309, 0.2718281828459045E1) = false > (0.17976931348623157E309, 0.2718281828459045E1) = true == (0.17976931348623157E309, 0.2718281828459045E1) = false ?= (0.17976931348623157E309, 0.2718281828459045E1) = false < (0.17976931348623157E309, 0.123E1) = false > (0.17976931348623157E309, 0.123E1) = true == (0.17976931348623157E309, 0.123E1) = false ?= (0.17976931348623157E309, 0.123E1) = false < (0.17976931348623157E309, 0.123) = false > (0.17976931348623157E309, 0.123) = true == (0.17976931348623157E309, 0.123) = false ?= (0.17976931348623157E309, 0.123) = false < (0.17976931348623157E309, 0.123E~2) = false > (0.17976931348623157E309, 0.123E~2) = true == (0.17976931348623157E309, 0.123E~2) = false ?= (0.17976931348623157E309, 0.123E~2) = false < (0.17976931348623157E309, 0.22250738585072014E~307) = false > (0.17976931348623157E309, 0.22250738585072014E~307) = true == (0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (0.17976931348623157E309, 0.22250738585072014E~307) = false < (0.17976931348623157E309, 0.11125369292536007E~307) = false > (0.17976931348623157E309, 0.11125369292536007E~307) = true == (0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (0.17976931348623157E309, 0.11125369292536007E~307) = false < (0.17976931348623157E309, 0.5E~323) = false > (0.17976931348623157E309, 0.5E~323) = true == (0.17976931348623157E309, 0.5E~323) = false ?= (0.17976931348623157E309, 0.5E~323) = false < (0.17976931348623157E309, 0.0) = false > (0.17976931348623157E309, 0.0) = true == (0.17976931348623157E309, 0.0) = false ?= (0.17976931348623157E309, 0.0) = false < (0.17976931348623157E309, ~0.17976931348623157E309) = false > (0.17976931348623157E309, ~0.17976931348623157E309) = true == (0.17976931348623157E309, ~0.17976931348623157E309) = false ?= (0.17976931348623157E309, ~0.17976931348623157E309) = false < (0.17976931348623157E309, ~0.8988465674311579E308) = false > (0.17976931348623157E309, ~0.8988465674311579E308) = true == (0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (0.17976931348623157E309, ~0.8988465674311579E308) = false < (0.17976931348623157E309, ~0.123E4) = false > (0.17976931348623157E309, ~0.123E4) = true == (0.17976931348623157E309, ~0.123E4) = false ?= (0.17976931348623157E309, ~0.123E4) = false < (0.17976931348623157E309, ~0.123E2) = false > (0.17976931348623157E309, ~0.123E2) = true == (0.17976931348623157E309, ~0.123E2) = false ?= (0.17976931348623157E309, ~0.123E2) = false < (0.17976931348623157E309, ~0.3141592653589793E1) = false > (0.17976931348623157E309, ~0.3141592653589793E1) = true == (0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (0.17976931348623157E309, ~0.3141592653589793E1) = false < (0.17976931348623157E309, ~0.2718281828459045E1) = false > (0.17976931348623157E309, ~0.2718281828459045E1) = true == (0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (0.17976931348623157E309, ~0.2718281828459045E1) = false < (0.17976931348623157E309, ~0.123E1) = false > (0.17976931348623157E309, ~0.123E1) = true == (0.17976931348623157E309, ~0.123E1) = false ?= (0.17976931348623157E309, ~0.123E1) = false < (0.17976931348623157E309, ~0.123) = false > (0.17976931348623157E309, ~0.123) = true == (0.17976931348623157E309, ~0.123) = false ?= (0.17976931348623157E309, ~0.123) = false < (0.17976931348623157E309, ~0.123E~2) = false > (0.17976931348623157E309, ~0.123E~2) = true == (0.17976931348623157E309, ~0.123E~2) = false ?= (0.17976931348623157E309, ~0.123E~2) = false < (0.17976931348623157E309, ~0.22250738585072014E~307) = false > (0.17976931348623157E309, ~0.22250738585072014E~307) = true == (0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (0.17976931348623157E309, ~0.22250738585072014E~307) = false < (0.17976931348623157E309, ~0.11125369292536007E~307) = false > (0.17976931348623157E309, ~0.11125369292536007E~307) = true == (0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (0.17976931348623157E309, ~0.11125369292536007E~307) = false < (0.17976931348623157E309, ~0.5E~323) = false > (0.17976931348623157E309, ~0.5E~323) = true == (0.17976931348623157E309, ~0.5E~323) = false ?= (0.17976931348623157E309, ~0.5E~323) = false < (0.17976931348623157E309, ~0.0) = false > (0.17976931348623157E309, ~0.0) = true == (0.17976931348623157E309, ~0.0) = false ?= (0.17976931348623157E309, ~0.0) = false < (0.8988465674311579E308, 0.17976931348623157E309) = true > (0.8988465674311579E308, 0.17976931348623157E309) = false == (0.8988465674311579E308, 0.17976931348623157E309) = false ?= (0.8988465674311579E308, 0.17976931348623157E309) = false < (0.8988465674311579E308, 0.8988465674311579E308) = false > (0.8988465674311579E308, 0.8988465674311579E308) = false == (0.8988465674311579E308, 0.8988465674311579E308) = true ?= (0.8988465674311579E308, 0.8988465674311579E308) = true < (0.8988465674311579E308, 0.123E4) = false > (0.8988465674311579E308, 0.123E4) = true == (0.8988465674311579E308, 0.123E4) = false ?= (0.8988465674311579E308, 0.123E4) = false < (0.8988465674311579E308, 0.123E2) = false > (0.8988465674311579E308, 0.123E2) = true == (0.8988465674311579E308, 0.123E2) = false ?= (0.8988465674311579E308, 0.123E2) = false < (0.8988465674311579E308, 0.3141592653589793E1) = false > (0.8988465674311579E308, 0.3141592653589793E1) = true == (0.8988465674311579E308, 0.3141592653589793E1) = false ?= (0.8988465674311579E308, 0.3141592653589793E1) = false < (0.8988465674311579E308, 0.2718281828459045E1) = false > (0.8988465674311579E308, 0.2718281828459045E1) = true == (0.8988465674311579E308, 0.2718281828459045E1) = false ?= (0.8988465674311579E308, 0.2718281828459045E1) = false < (0.8988465674311579E308, 0.123E1) = false > (0.8988465674311579E308, 0.123E1) = true == (0.8988465674311579E308, 0.123E1) = false ?= (0.8988465674311579E308, 0.123E1) = false < (0.8988465674311579E308, 0.123) = false > (0.8988465674311579E308, 0.123) = true == (0.8988465674311579E308, 0.123) = false ?= (0.8988465674311579E308, 0.123) = false < (0.8988465674311579E308, 0.123E~2) = false > (0.8988465674311579E308, 0.123E~2) = true == (0.8988465674311579E308, 0.123E~2) = false ?= (0.8988465674311579E308, 0.123E~2) = false < (0.8988465674311579E308, 0.22250738585072014E~307) = false > (0.8988465674311579E308, 0.22250738585072014E~307) = true == (0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (0.8988465674311579E308, 0.22250738585072014E~307) = false < (0.8988465674311579E308, 0.11125369292536007E~307) = false > (0.8988465674311579E308, 0.11125369292536007E~307) = true == (0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (0.8988465674311579E308, 0.11125369292536007E~307) = false < (0.8988465674311579E308, 0.5E~323) = false > (0.8988465674311579E308, 0.5E~323) = true == (0.8988465674311579E308, 0.5E~323) = false ?= (0.8988465674311579E308, 0.5E~323) = false < (0.8988465674311579E308, 0.0) = false > (0.8988465674311579E308, 0.0) = true == (0.8988465674311579E308, 0.0) = false ?= (0.8988465674311579E308, 0.0) = false < (0.8988465674311579E308, ~0.17976931348623157E309) = false > (0.8988465674311579E308, ~0.17976931348623157E309) = true == (0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (0.8988465674311579E308, ~0.17976931348623157E309) = false < (0.8988465674311579E308, ~0.8988465674311579E308) = false > (0.8988465674311579E308, ~0.8988465674311579E308) = true == (0.8988465674311579E308, ~0.8988465674311579E308) = false ?= (0.8988465674311579E308, ~0.8988465674311579E308) = false < (0.8988465674311579E308, ~0.123E4) = false > (0.8988465674311579E308, ~0.123E4) = true == (0.8988465674311579E308, ~0.123E4) = false ?= (0.8988465674311579E308, ~0.123E4) = false < (0.8988465674311579E308, ~0.123E2) = false > (0.8988465674311579E308, ~0.123E2) = true == (0.8988465674311579E308, ~0.123E2) = false ?= (0.8988465674311579E308, ~0.123E2) = false < (0.8988465674311579E308, ~0.3141592653589793E1) = false > (0.8988465674311579E308, ~0.3141592653589793E1) = true == (0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (0.8988465674311579E308, ~0.3141592653589793E1) = false < (0.8988465674311579E308, ~0.2718281828459045E1) = false > (0.8988465674311579E308, ~0.2718281828459045E1) = true == (0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (0.8988465674311579E308, ~0.2718281828459045E1) = false < (0.8988465674311579E308, ~0.123E1) = false > (0.8988465674311579E308, ~0.123E1) = true == (0.8988465674311579E308, ~0.123E1) = false ?= (0.8988465674311579E308, ~0.123E1) = false < (0.8988465674311579E308, ~0.123) = false > (0.8988465674311579E308, ~0.123) = true == (0.8988465674311579E308, ~0.123) = false ?= (0.8988465674311579E308, ~0.123) = false < (0.8988465674311579E308, ~0.123E~2) = false > (0.8988465674311579E308, ~0.123E~2) = true == (0.8988465674311579E308, ~0.123E~2) = false ?= (0.8988465674311579E308, ~0.123E~2) = false < (0.8988465674311579E308, ~0.22250738585072014E~307) = false > (0.8988465674311579E308, ~0.22250738585072014E~307) = true == (0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (0.8988465674311579E308, ~0.22250738585072014E~307) = false < (0.8988465674311579E308, ~0.11125369292536007E~307) = false > (0.8988465674311579E308, ~0.11125369292536007E~307) = true == (0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (0.8988465674311579E308, ~0.11125369292536007E~307) = false < (0.8988465674311579E308, ~0.5E~323) = false > (0.8988465674311579E308, ~0.5E~323) = true == (0.8988465674311579E308, ~0.5E~323) = false ?= (0.8988465674311579E308, ~0.5E~323) = false < (0.8988465674311579E308, ~0.0) = false > (0.8988465674311579E308, ~0.0) = true == (0.8988465674311579E308, ~0.0) = false ?= (0.8988465674311579E308, ~0.0) = false < (0.123E4, 0.17976931348623157E309) = true > (0.123E4, 0.17976931348623157E309) = false == (0.123E4, 0.17976931348623157E309) = false ?= (0.123E4, 0.17976931348623157E309) = false < (0.123E4, 0.8988465674311579E308) = true > (0.123E4, 0.8988465674311579E308) = false == (0.123E4, 0.8988465674311579E308) = false ?= (0.123E4, 0.8988465674311579E308) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.3141592653589793E1) = false > (0.123E4, 0.3141592653589793E1) = true == (0.123E4, 0.3141592653589793E1) = false ?= (0.123E4, 0.3141592653589793E1) = false < (0.123E4, 0.2718281828459045E1) = false > (0.123E4, 0.2718281828459045E1) = true == (0.123E4, 0.2718281828459045E1) = false ?= (0.123E4, 0.2718281828459045E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.22250738585072014E~307) = false > (0.123E4, 0.22250738585072014E~307) = true == (0.123E4, 0.22250738585072014E~307) = false ?= (0.123E4, 0.22250738585072014E~307) = false < (0.123E4, 0.11125369292536007E~307) = false > (0.123E4, 0.11125369292536007E~307) = true == (0.123E4, 0.11125369292536007E~307) = false ?= (0.123E4, 0.11125369292536007E~307) = false < (0.123E4, 0.5E~323) = false > (0.123E4, 0.5E~323) = true == (0.123E4, 0.5E~323) = false ?= (0.123E4, 0.5E~323) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.17976931348623157E309) = false > (0.123E4, ~0.17976931348623157E309) = true == (0.123E4, ~0.17976931348623157E309) = false ?= (0.123E4, ~0.17976931348623157E309) = false < (0.123E4, ~0.8988465674311579E308) = false > (0.123E4, ~0.8988465674311579E308) = true == (0.123E4, ~0.8988465674311579E308) = false ?= (0.123E4, ~0.8988465674311579E308) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.3141592653589793E1) = false > (0.123E4, ~0.3141592653589793E1) = true == (0.123E4, ~0.3141592653589793E1) = false ?= (0.123E4, ~0.3141592653589793E1) = false < (0.123E4, ~0.2718281828459045E1) = false > (0.123E4, ~0.2718281828459045E1) = true == (0.123E4, ~0.2718281828459045E1) = false ?= (0.123E4, ~0.2718281828459045E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.22250738585072014E~307) = false > (0.123E4, ~0.22250738585072014E~307) = true == (0.123E4, ~0.22250738585072014E~307) = false ?= (0.123E4, ~0.22250738585072014E~307) = false < (0.123E4, ~0.11125369292536007E~307) = false > (0.123E4, ~0.11125369292536007E~307) = true == (0.123E4, ~0.11125369292536007E~307) = false ?= (0.123E4, ~0.11125369292536007E~307) = false < (0.123E4, ~0.5E~323) = false > (0.123E4, ~0.5E~323) = true == (0.123E4, ~0.5E~323) = false ?= (0.123E4, ~0.5E~323) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.17976931348623157E309) = true > (0.123E2, 0.17976931348623157E309) = false == (0.123E2, 0.17976931348623157E309) = false ?= (0.123E2, 0.17976931348623157E309) = false < (0.123E2, 0.8988465674311579E308) = true > (0.123E2, 0.8988465674311579E308) = false == (0.123E2, 0.8988465674311579E308) = false ?= (0.123E2, 0.8988465674311579E308) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.3141592653589793E1) = false > (0.123E2, 0.3141592653589793E1) = true == (0.123E2, 0.3141592653589793E1) = false ?= (0.123E2, 0.3141592653589793E1) = false < (0.123E2, 0.2718281828459045E1) = false > (0.123E2, 0.2718281828459045E1) = true == (0.123E2, 0.2718281828459045E1) = false ?= (0.123E2, 0.2718281828459045E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.22250738585072014E~307) = false > (0.123E2, 0.22250738585072014E~307) = true == (0.123E2, 0.22250738585072014E~307) = false ?= (0.123E2, 0.22250738585072014E~307) = false < (0.123E2, 0.11125369292536007E~307) = false > (0.123E2, 0.11125369292536007E~307) = true == (0.123E2, 0.11125369292536007E~307) = false ?= (0.123E2, 0.11125369292536007E~307) = false < (0.123E2, 0.5E~323) = false > (0.123E2, 0.5E~323) = true == (0.123E2, 0.5E~323) = false ?= (0.123E2, 0.5E~323) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.17976931348623157E309) = false > (0.123E2, ~0.17976931348623157E309) = true == (0.123E2, ~0.17976931348623157E309) = false ?= (0.123E2, ~0.17976931348623157E309) = false < (0.123E2, ~0.8988465674311579E308) = false > (0.123E2, ~0.8988465674311579E308) = true == (0.123E2, ~0.8988465674311579E308) = false ?= (0.123E2, ~0.8988465674311579E308) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.3141592653589793E1) = false > (0.123E2, ~0.3141592653589793E1) = true == (0.123E2, ~0.3141592653589793E1) = false ?= (0.123E2, ~0.3141592653589793E1) = false < (0.123E2, ~0.2718281828459045E1) = false > (0.123E2, ~0.2718281828459045E1) = true == (0.123E2, ~0.2718281828459045E1) = false ?= (0.123E2, ~0.2718281828459045E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.22250738585072014E~307) = false > (0.123E2, ~0.22250738585072014E~307) = true == (0.123E2, ~0.22250738585072014E~307) = false ?= (0.123E2, ~0.22250738585072014E~307) = false < (0.123E2, ~0.11125369292536007E~307) = false > (0.123E2, ~0.11125369292536007E~307) = true == (0.123E2, ~0.11125369292536007E~307) = false ?= (0.123E2, ~0.11125369292536007E~307) = false < (0.123E2, ~0.5E~323) = false > (0.123E2, ~0.5E~323) = true == (0.123E2, ~0.5E~323) = false ?= (0.123E2, ~0.5E~323) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.3141592653589793E1, 0.17976931348623157E309) = true > (0.3141592653589793E1, 0.17976931348623157E309) = false == (0.3141592653589793E1, 0.17976931348623157E309) = false ?= (0.3141592653589793E1, 0.17976931348623157E309) = false < (0.3141592653589793E1, 0.8988465674311579E308) = true > (0.3141592653589793E1, 0.8988465674311579E308) = false == (0.3141592653589793E1, 0.8988465674311579E308) = false ?= (0.3141592653589793E1, 0.8988465674311579E308) = false < (0.3141592653589793E1, 0.123E4) = true > (0.3141592653589793E1, 0.123E4) = false == (0.3141592653589793E1, 0.123E4) = false ?= (0.3141592653589793E1, 0.123E4) = false < (0.3141592653589793E1, 0.123E2) = true > (0.3141592653589793E1, 0.123E2) = false == (0.3141592653589793E1, 0.123E2) = false ?= (0.3141592653589793E1, 0.123E2) = false < (0.3141592653589793E1, 0.3141592653589793E1) = false > (0.3141592653589793E1, 0.3141592653589793E1) = false == (0.3141592653589793E1, 0.3141592653589793E1) = true ?= (0.3141592653589793E1, 0.3141592653589793E1) = true < (0.3141592653589793E1, 0.2718281828459045E1) = false > (0.3141592653589793E1, 0.2718281828459045E1) = true == (0.3141592653589793E1, 0.2718281828459045E1) = false ?= (0.3141592653589793E1, 0.2718281828459045E1) = false < (0.3141592653589793E1, 0.123E1) = false > (0.3141592653589793E1, 0.123E1) = true == (0.3141592653589793E1, 0.123E1) = false ?= (0.3141592653589793E1, 0.123E1) = false < (0.3141592653589793E1, 0.123) = false > (0.3141592653589793E1, 0.123) = true == (0.3141592653589793E1, 0.123) = false ?= (0.3141592653589793E1, 0.123) = false < (0.3141592653589793E1, 0.123E~2) = false > (0.3141592653589793E1, 0.123E~2) = true == (0.3141592653589793E1, 0.123E~2) = false ?= (0.3141592653589793E1, 0.123E~2) = false < (0.3141592653589793E1, 0.22250738585072014E~307) = false > (0.3141592653589793E1, 0.22250738585072014E~307) = true == (0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (0.3141592653589793E1, 0.22250738585072014E~307) = false < (0.3141592653589793E1, 0.11125369292536007E~307) = false > (0.3141592653589793E1, 0.11125369292536007E~307) = true == (0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (0.3141592653589793E1, 0.11125369292536007E~307) = false < (0.3141592653589793E1, 0.5E~323) = false > (0.3141592653589793E1, 0.5E~323) = true == (0.3141592653589793E1, 0.5E~323) = false ?= (0.3141592653589793E1, 0.5E~323) = false < (0.3141592653589793E1, 0.0) = false > (0.3141592653589793E1, 0.0) = true == (0.3141592653589793E1, 0.0) = false ?= (0.3141592653589793E1, 0.0) = false < (0.3141592653589793E1, ~0.17976931348623157E309) = false > (0.3141592653589793E1, ~0.17976931348623157E309) = true == (0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (0.3141592653589793E1, ~0.17976931348623157E309) = false < (0.3141592653589793E1, ~0.8988465674311579E308) = false > (0.3141592653589793E1, ~0.8988465674311579E308) = true == (0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (0.3141592653589793E1, ~0.8988465674311579E308) = false < (0.3141592653589793E1, ~0.123E4) = false > (0.3141592653589793E1, ~0.123E4) = true == (0.3141592653589793E1, ~0.123E4) = false ?= (0.3141592653589793E1, ~0.123E4) = false < (0.3141592653589793E1, ~0.123E2) = false > (0.3141592653589793E1, ~0.123E2) = true == (0.3141592653589793E1, ~0.123E2) = false ?= (0.3141592653589793E1, ~0.123E2) = false < (0.3141592653589793E1, ~0.3141592653589793E1) = false > (0.3141592653589793E1, ~0.3141592653589793E1) = true == (0.3141592653589793E1, ~0.3141592653589793E1) = false ?= (0.3141592653589793E1, ~0.3141592653589793E1) = false < (0.3141592653589793E1, ~0.2718281828459045E1) = false > (0.3141592653589793E1, ~0.2718281828459045E1) = true == (0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (0.3141592653589793E1, ~0.2718281828459045E1) = false < (0.3141592653589793E1, ~0.123E1) = false > (0.3141592653589793E1, ~0.123E1) = true == (0.3141592653589793E1, ~0.123E1) = false ?= (0.3141592653589793E1, ~0.123E1) = false < (0.3141592653589793E1, ~0.123) = false > (0.3141592653589793E1, ~0.123) = true == (0.3141592653589793E1, ~0.123) = false ?= (0.3141592653589793E1, ~0.123) = false < (0.3141592653589793E1, ~0.123E~2) = false > (0.3141592653589793E1, ~0.123E~2) = true == (0.3141592653589793E1, ~0.123E~2) = false ?= (0.3141592653589793E1, ~0.123E~2) = false < (0.3141592653589793E1, ~0.22250738585072014E~307) = false > (0.3141592653589793E1, ~0.22250738585072014E~307) = true == (0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (0.3141592653589793E1, ~0.22250738585072014E~307) = false < (0.3141592653589793E1, ~0.11125369292536007E~307) = false > (0.3141592653589793E1, ~0.11125369292536007E~307) = true == (0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (0.3141592653589793E1, ~0.11125369292536007E~307) = false < (0.3141592653589793E1, ~0.5E~323) = false > (0.3141592653589793E1, ~0.5E~323) = true == (0.3141592653589793E1, ~0.5E~323) = false ?= (0.3141592653589793E1, ~0.5E~323) = false < (0.3141592653589793E1, ~0.0) = false > (0.3141592653589793E1, ~0.0) = true == (0.3141592653589793E1, ~0.0) = false ?= (0.3141592653589793E1, ~0.0) = false < (0.2718281828459045E1, 0.17976931348623157E309) = true > (0.2718281828459045E1, 0.17976931348623157E309) = false == (0.2718281828459045E1, 0.17976931348623157E309) = false ?= (0.2718281828459045E1, 0.17976931348623157E309) = false < (0.2718281828459045E1, 0.8988465674311579E308) = true > (0.2718281828459045E1, 0.8988465674311579E308) = false == (0.2718281828459045E1, 0.8988465674311579E308) = false ?= (0.2718281828459045E1, 0.8988465674311579E308) = false < (0.2718281828459045E1, 0.123E4) = true > (0.2718281828459045E1, 0.123E4) = false == (0.2718281828459045E1, 0.123E4) = false ?= (0.2718281828459045E1, 0.123E4) = false < (0.2718281828459045E1, 0.123E2) = true > (0.2718281828459045E1, 0.123E2) = false == (0.2718281828459045E1, 0.123E2) = false ?= (0.2718281828459045E1, 0.123E2) = false < (0.2718281828459045E1, 0.3141592653589793E1) = true > (0.2718281828459045E1, 0.3141592653589793E1) = false == (0.2718281828459045E1, 0.3141592653589793E1) = false ?= (0.2718281828459045E1, 0.3141592653589793E1) = false < (0.2718281828459045E1, 0.2718281828459045E1) = false > (0.2718281828459045E1, 0.2718281828459045E1) = false == (0.2718281828459045E1, 0.2718281828459045E1) = true ?= (0.2718281828459045E1, 0.2718281828459045E1) = true < (0.2718281828459045E1, 0.123E1) = false > (0.2718281828459045E1, 0.123E1) = true == (0.2718281828459045E1, 0.123E1) = false ?= (0.2718281828459045E1, 0.123E1) = false < (0.2718281828459045E1, 0.123) = false > (0.2718281828459045E1, 0.123) = true == (0.2718281828459045E1, 0.123) = false ?= (0.2718281828459045E1, 0.123) = false < (0.2718281828459045E1, 0.123E~2) = false > (0.2718281828459045E1, 0.123E~2) = true == (0.2718281828459045E1, 0.123E~2) = false ?= (0.2718281828459045E1, 0.123E~2) = false < (0.2718281828459045E1, 0.22250738585072014E~307) = false > (0.2718281828459045E1, 0.22250738585072014E~307) = true == (0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (0.2718281828459045E1, 0.22250738585072014E~307) = false < (0.2718281828459045E1, 0.11125369292536007E~307) = false > (0.2718281828459045E1, 0.11125369292536007E~307) = true == (0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (0.2718281828459045E1, 0.11125369292536007E~307) = false < (0.2718281828459045E1, 0.5E~323) = false > (0.2718281828459045E1, 0.5E~323) = true == (0.2718281828459045E1, 0.5E~323) = false ?= (0.2718281828459045E1, 0.5E~323) = false < (0.2718281828459045E1, 0.0) = false > (0.2718281828459045E1, 0.0) = true == (0.2718281828459045E1, 0.0) = false ?= (0.2718281828459045E1, 0.0) = false < (0.2718281828459045E1, ~0.17976931348623157E309) = false > (0.2718281828459045E1, ~0.17976931348623157E309) = true == (0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (0.2718281828459045E1, ~0.17976931348623157E309) = false < (0.2718281828459045E1, ~0.8988465674311579E308) = false > (0.2718281828459045E1, ~0.8988465674311579E308) = true == (0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (0.2718281828459045E1, ~0.8988465674311579E308) = false < (0.2718281828459045E1, ~0.123E4) = false > (0.2718281828459045E1, ~0.123E4) = true == (0.2718281828459045E1, ~0.123E4) = false ?= (0.2718281828459045E1, ~0.123E4) = false < (0.2718281828459045E1, ~0.123E2) = false > (0.2718281828459045E1, ~0.123E2) = true == (0.2718281828459045E1, ~0.123E2) = false ?= (0.2718281828459045E1, ~0.123E2) = false < (0.2718281828459045E1, ~0.3141592653589793E1) = false > (0.2718281828459045E1, ~0.3141592653589793E1) = true == (0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (0.2718281828459045E1, ~0.3141592653589793E1) = false < (0.2718281828459045E1, ~0.2718281828459045E1) = false > (0.2718281828459045E1, ~0.2718281828459045E1) = true == (0.2718281828459045E1, ~0.2718281828459045E1) = false ?= (0.2718281828459045E1, ~0.2718281828459045E1) = false < (0.2718281828459045E1, ~0.123E1) = false > (0.2718281828459045E1, ~0.123E1) = true == (0.2718281828459045E1, ~0.123E1) = false ?= (0.2718281828459045E1, ~0.123E1) = false < (0.2718281828459045E1, ~0.123) = false > (0.2718281828459045E1, ~0.123) = true == (0.2718281828459045E1, ~0.123) = false ?= (0.2718281828459045E1, ~0.123) = false < (0.2718281828459045E1, ~0.123E~2) = false > (0.2718281828459045E1, ~0.123E~2) = true == (0.2718281828459045E1, ~0.123E~2) = false ?= (0.2718281828459045E1, ~0.123E~2) = false < (0.2718281828459045E1, ~0.22250738585072014E~307) = false > (0.2718281828459045E1, ~0.22250738585072014E~307) = true == (0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (0.2718281828459045E1, ~0.22250738585072014E~307) = false < (0.2718281828459045E1, ~0.11125369292536007E~307) = false > (0.2718281828459045E1, ~0.11125369292536007E~307) = true == (0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (0.2718281828459045E1, ~0.11125369292536007E~307) = false < (0.2718281828459045E1, ~0.5E~323) = false > (0.2718281828459045E1, ~0.5E~323) = true == (0.2718281828459045E1, ~0.5E~323) = false ?= (0.2718281828459045E1, ~0.5E~323) = false < (0.2718281828459045E1, ~0.0) = false > (0.2718281828459045E1, ~0.0) = true == (0.2718281828459045E1, ~0.0) = false ?= (0.2718281828459045E1, ~0.0) = false < (0.123E1, 0.17976931348623157E309) = true > (0.123E1, 0.17976931348623157E309) = false == (0.123E1, 0.17976931348623157E309) = false ?= (0.123E1, 0.17976931348623157E309) = false < (0.123E1, 0.8988465674311579E308) = true > (0.123E1, 0.8988465674311579E308) = false == (0.123E1, 0.8988465674311579E308) = false ?= (0.123E1, 0.8988465674311579E308) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.3141592653589793E1) = true > (0.123E1, 0.3141592653589793E1) = false == (0.123E1, 0.3141592653589793E1) = false ?= (0.123E1, 0.3141592653589793E1) = false < (0.123E1, 0.2718281828459045E1) = true > (0.123E1, 0.2718281828459045E1) = false == (0.123E1, 0.2718281828459045E1) = false ?= (0.123E1, 0.2718281828459045E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.22250738585072014E~307) = false > (0.123E1, 0.22250738585072014E~307) = true == (0.123E1, 0.22250738585072014E~307) = false ?= (0.123E1, 0.22250738585072014E~307) = false < (0.123E1, 0.11125369292536007E~307) = false > (0.123E1, 0.11125369292536007E~307) = true == (0.123E1, 0.11125369292536007E~307) = false ?= (0.123E1, 0.11125369292536007E~307) = false < (0.123E1, 0.5E~323) = false > (0.123E1, 0.5E~323) = true == (0.123E1, 0.5E~323) = false ?= (0.123E1, 0.5E~323) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.17976931348623157E309) = false > (0.123E1, ~0.17976931348623157E309) = true == (0.123E1, ~0.17976931348623157E309) = false ?= (0.123E1, ~0.17976931348623157E309) = false < (0.123E1, ~0.8988465674311579E308) = false > (0.123E1, ~0.8988465674311579E308) = true == (0.123E1, ~0.8988465674311579E308) = false ?= (0.123E1, ~0.8988465674311579E308) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.3141592653589793E1) = false > (0.123E1, ~0.3141592653589793E1) = true == (0.123E1, ~0.3141592653589793E1) = false ?= (0.123E1, ~0.3141592653589793E1) = false < (0.123E1, ~0.2718281828459045E1) = false > (0.123E1, ~0.2718281828459045E1) = true == (0.123E1, ~0.2718281828459045E1) = false ?= (0.123E1, ~0.2718281828459045E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.22250738585072014E~307) = false > (0.123E1, ~0.22250738585072014E~307) = true == (0.123E1, ~0.22250738585072014E~307) = false ?= (0.123E1, ~0.22250738585072014E~307) = false < (0.123E1, ~0.11125369292536007E~307) = false > (0.123E1, ~0.11125369292536007E~307) = true == (0.123E1, ~0.11125369292536007E~307) = false ?= (0.123E1, ~0.11125369292536007E~307) = false < (0.123E1, ~0.5E~323) = false > (0.123E1, ~0.5E~323) = true == (0.123E1, ~0.5E~323) = false ?= (0.123E1, ~0.5E~323) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.17976931348623157E309) = true > (0.123, 0.17976931348623157E309) = false == (0.123, 0.17976931348623157E309) = false ?= (0.123, 0.17976931348623157E309) = false < (0.123, 0.8988465674311579E308) = true > (0.123, 0.8988465674311579E308) = false == (0.123, 0.8988465674311579E308) = false ?= (0.123, 0.8988465674311579E308) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.3141592653589793E1) = true > (0.123, 0.3141592653589793E1) = false == (0.123, 0.3141592653589793E1) = false ?= (0.123, 0.3141592653589793E1) = false < (0.123, 0.2718281828459045E1) = true > (0.123, 0.2718281828459045E1) = false == (0.123, 0.2718281828459045E1) = false ?= (0.123, 0.2718281828459045E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.22250738585072014E~307) = false > (0.123, 0.22250738585072014E~307) = true == (0.123, 0.22250738585072014E~307) = false ?= (0.123, 0.22250738585072014E~307) = false < (0.123, 0.11125369292536007E~307) = false > (0.123, 0.11125369292536007E~307) = true == (0.123, 0.11125369292536007E~307) = false ?= (0.123, 0.11125369292536007E~307) = false < (0.123, 0.5E~323) = false > (0.123, 0.5E~323) = true == (0.123, 0.5E~323) = false ?= (0.123, 0.5E~323) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.17976931348623157E309) = false > (0.123, ~0.17976931348623157E309) = true == (0.123, ~0.17976931348623157E309) = false ?= (0.123, ~0.17976931348623157E309) = false < (0.123, ~0.8988465674311579E308) = false > (0.123, ~0.8988465674311579E308) = true == (0.123, ~0.8988465674311579E308) = false ?= (0.123, ~0.8988465674311579E308) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.3141592653589793E1) = false > (0.123, ~0.3141592653589793E1) = true == (0.123, ~0.3141592653589793E1) = false ?= (0.123, ~0.3141592653589793E1) = false < (0.123, ~0.2718281828459045E1) = false > (0.123, ~0.2718281828459045E1) = true == (0.123, ~0.2718281828459045E1) = false ?= (0.123, ~0.2718281828459045E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.22250738585072014E~307) = false > (0.123, ~0.22250738585072014E~307) = true == (0.123, ~0.22250738585072014E~307) = false ?= (0.123, ~0.22250738585072014E~307) = false < (0.123, ~0.11125369292536007E~307) = false > (0.123, ~0.11125369292536007E~307) = true == (0.123, ~0.11125369292536007E~307) = false ?= (0.123, ~0.11125369292536007E~307) = false < (0.123, ~0.5E~323) = false > (0.123, ~0.5E~323) = true == (0.123, ~0.5E~323) = false ?= (0.123, ~0.5E~323) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.17976931348623157E309) = true > (0.123E~2, 0.17976931348623157E309) = false == (0.123E~2, 0.17976931348623157E309) = false ?= (0.123E~2, 0.17976931348623157E309) = false < (0.123E~2, 0.8988465674311579E308) = true > (0.123E~2, 0.8988465674311579E308) = false == (0.123E~2, 0.8988465674311579E308) = false ?= (0.123E~2, 0.8988465674311579E308) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.3141592653589793E1) = true > (0.123E~2, 0.3141592653589793E1) = false == (0.123E~2, 0.3141592653589793E1) = false ?= (0.123E~2, 0.3141592653589793E1) = false < (0.123E~2, 0.2718281828459045E1) = true > (0.123E~2, 0.2718281828459045E1) = false == (0.123E~2, 0.2718281828459045E1) = false ?= (0.123E~2, 0.2718281828459045E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.22250738585072014E~307) = false > (0.123E~2, 0.22250738585072014E~307) = true == (0.123E~2, 0.22250738585072014E~307) = false ?= (0.123E~2, 0.22250738585072014E~307) = false < (0.123E~2, 0.11125369292536007E~307) = false > (0.123E~2, 0.11125369292536007E~307) = true == (0.123E~2, 0.11125369292536007E~307) = false ?= (0.123E~2, 0.11125369292536007E~307) = false < (0.123E~2, 0.5E~323) = false > (0.123E~2, 0.5E~323) = true == (0.123E~2, 0.5E~323) = false ?= (0.123E~2, 0.5E~323) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.17976931348623157E309) = false > (0.123E~2, ~0.17976931348623157E309) = true == (0.123E~2, ~0.17976931348623157E309) = false ?= (0.123E~2, ~0.17976931348623157E309) = false < (0.123E~2, ~0.8988465674311579E308) = false > (0.123E~2, ~0.8988465674311579E308) = true == (0.123E~2, ~0.8988465674311579E308) = false ?= (0.123E~2, ~0.8988465674311579E308) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.3141592653589793E1) = false > (0.123E~2, ~0.3141592653589793E1) = true == (0.123E~2, ~0.3141592653589793E1) = false ?= (0.123E~2, ~0.3141592653589793E1) = false < (0.123E~2, ~0.2718281828459045E1) = false > (0.123E~2, ~0.2718281828459045E1) = true == (0.123E~2, ~0.2718281828459045E1) = false ?= (0.123E~2, ~0.2718281828459045E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.22250738585072014E~307) = false > (0.123E~2, ~0.22250738585072014E~307) = true == (0.123E~2, ~0.22250738585072014E~307) = false ?= (0.123E~2, ~0.22250738585072014E~307) = false < (0.123E~2, ~0.11125369292536007E~307) = false > (0.123E~2, ~0.11125369292536007E~307) = true == (0.123E~2, ~0.11125369292536007E~307) = false ?= (0.123E~2, ~0.11125369292536007E~307) = false < (0.123E~2, ~0.5E~323) = false > (0.123E~2, ~0.5E~323) = true == (0.123E~2, ~0.5E~323) = false ?= (0.123E~2, ~0.5E~323) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.22250738585072014E~307, 0.17976931348623157E309) = true > (0.22250738585072014E~307, 0.17976931348623157E309) = false == (0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (0.22250738585072014E~307, 0.17976931348623157E309) = false < (0.22250738585072014E~307, 0.8988465674311579E308) = true > (0.22250738585072014E~307, 0.8988465674311579E308) = false == (0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (0.22250738585072014E~307, 0.8988465674311579E308) = false < (0.22250738585072014E~307, 0.123E4) = true > (0.22250738585072014E~307, 0.123E4) = false == (0.22250738585072014E~307, 0.123E4) = false ?= (0.22250738585072014E~307, 0.123E4) = false < (0.22250738585072014E~307, 0.123E2) = true > (0.22250738585072014E~307, 0.123E2) = false == (0.22250738585072014E~307, 0.123E2) = false ?= (0.22250738585072014E~307, 0.123E2) = false < (0.22250738585072014E~307, 0.3141592653589793E1) = true > (0.22250738585072014E~307, 0.3141592653589793E1) = false == (0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (0.22250738585072014E~307, 0.3141592653589793E1) = false < (0.22250738585072014E~307, 0.2718281828459045E1) = true > (0.22250738585072014E~307, 0.2718281828459045E1) = false == (0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (0.22250738585072014E~307, 0.2718281828459045E1) = false < (0.22250738585072014E~307, 0.123E1) = true > (0.22250738585072014E~307, 0.123E1) = false == (0.22250738585072014E~307, 0.123E1) = false ?= (0.22250738585072014E~307, 0.123E1) = false < (0.22250738585072014E~307, 0.123) = true > (0.22250738585072014E~307, 0.123) = false == (0.22250738585072014E~307, 0.123) = false ?= (0.22250738585072014E~307, 0.123) = false < (0.22250738585072014E~307, 0.123E~2) = true > (0.22250738585072014E~307, 0.123E~2) = false == (0.22250738585072014E~307, 0.123E~2) = false ?= (0.22250738585072014E~307, 0.123E~2) = false < (0.22250738585072014E~307, 0.22250738585072014E~307) = false > (0.22250738585072014E~307, 0.22250738585072014E~307) = false == (0.22250738585072014E~307, 0.22250738585072014E~307) = true ?= (0.22250738585072014E~307, 0.22250738585072014E~307) = true < (0.22250738585072014E~307, 0.11125369292536007E~307) = false > (0.22250738585072014E~307, 0.11125369292536007E~307) = true == (0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, 0.11125369292536007E~307) = false < (0.22250738585072014E~307, 0.5E~323) = false > (0.22250738585072014E~307, 0.5E~323) = true == (0.22250738585072014E~307, 0.5E~323) = false ?= (0.22250738585072014E~307, 0.5E~323) = false < (0.22250738585072014E~307, 0.0) = false > (0.22250738585072014E~307, 0.0) = true == (0.22250738585072014E~307, 0.0) = false ?= (0.22250738585072014E~307, 0.0) = false < (0.22250738585072014E~307, ~0.17976931348623157E309) = false > (0.22250738585072014E~307, ~0.17976931348623157E309) = true == (0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (0.22250738585072014E~307, ~0.17976931348623157E309) = false < (0.22250738585072014E~307, ~0.8988465674311579E308) = false > (0.22250738585072014E~307, ~0.8988465674311579E308) = true == (0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (0.22250738585072014E~307, ~0.8988465674311579E308) = false < (0.22250738585072014E~307, ~0.123E4) = false > (0.22250738585072014E~307, ~0.123E4) = true == (0.22250738585072014E~307, ~0.123E4) = false ?= (0.22250738585072014E~307, ~0.123E4) = false < (0.22250738585072014E~307, ~0.123E2) = false > (0.22250738585072014E~307, ~0.123E2) = true == (0.22250738585072014E~307, ~0.123E2) = false ?= (0.22250738585072014E~307, ~0.123E2) = false < (0.22250738585072014E~307, ~0.3141592653589793E1) = false > (0.22250738585072014E~307, ~0.3141592653589793E1) = true == (0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (0.22250738585072014E~307, ~0.3141592653589793E1) = false < (0.22250738585072014E~307, ~0.2718281828459045E1) = false > (0.22250738585072014E~307, ~0.2718281828459045E1) = true == (0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (0.22250738585072014E~307, ~0.2718281828459045E1) = false < (0.22250738585072014E~307, ~0.123E1) = false > (0.22250738585072014E~307, ~0.123E1) = true == (0.22250738585072014E~307, ~0.123E1) = false ?= (0.22250738585072014E~307, ~0.123E1) = false < (0.22250738585072014E~307, ~0.123) = false > (0.22250738585072014E~307, ~0.123) = true == (0.22250738585072014E~307, ~0.123) = false ?= (0.22250738585072014E~307, ~0.123) = false < (0.22250738585072014E~307, ~0.123E~2) = false > (0.22250738585072014E~307, ~0.123E~2) = true == (0.22250738585072014E~307, ~0.123E~2) = false ?= (0.22250738585072014E~307, ~0.123E~2) = false < (0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (0.22250738585072014E~307, ~0.22250738585072014E~307) = true == (0.22250738585072014E~307, ~0.22250738585072014E~307) = false ?= (0.22250738585072014E~307, ~0.22250738585072014E~307) = false < (0.22250738585072014E~307, ~0.11125369292536007E~307) = false > (0.22250738585072014E~307, ~0.11125369292536007E~307) = true == (0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (0.22250738585072014E~307, ~0.5E~323) = false > (0.22250738585072014E~307, ~0.5E~323) = true == (0.22250738585072014E~307, ~0.5E~323) = false ?= (0.22250738585072014E~307, ~0.5E~323) = false < (0.22250738585072014E~307, ~0.0) = false > (0.22250738585072014E~307, ~0.0) = true == (0.22250738585072014E~307, ~0.0) = false ?= (0.22250738585072014E~307, ~0.0) = false < (0.11125369292536007E~307, 0.17976931348623157E309) = true > (0.11125369292536007E~307, 0.17976931348623157E309) = false == (0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (0.11125369292536007E~307, 0.17976931348623157E309) = false < (0.11125369292536007E~307, 0.8988465674311579E308) = true > (0.11125369292536007E~307, 0.8988465674311579E308) = false == (0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (0.11125369292536007E~307, 0.8988465674311579E308) = false < (0.11125369292536007E~307, 0.123E4) = true > (0.11125369292536007E~307, 0.123E4) = false == (0.11125369292536007E~307, 0.123E4) = false ?= (0.11125369292536007E~307, 0.123E4) = false < (0.11125369292536007E~307, 0.123E2) = true > (0.11125369292536007E~307, 0.123E2) = false == (0.11125369292536007E~307, 0.123E2) = false ?= (0.11125369292536007E~307, 0.123E2) = false < (0.11125369292536007E~307, 0.3141592653589793E1) = true > (0.11125369292536007E~307, 0.3141592653589793E1) = false == (0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (0.11125369292536007E~307, 0.3141592653589793E1) = false < (0.11125369292536007E~307, 0.2718281828459045E1) = true > (0.11125369292536007E~307, 0.2718281828459045E1) = false == (0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (0.11125369292536007E~307, 0.2718281828459045E1) = false < (0.11125369292536007E~307, 0.123E1) = true > (0.11125369292536007E~307, 0.123E1) = false == (0.11125369292536007E~307, 0.123E1) = false ?= (0.11125369292536007E~307, 0.123E1) = false < (0.11125369292536007E~307, 0.123) = true > (0.11125369292536007E~307, 0.123) = false == (0.11125369292536007E~307, 0.123) = false ?= (0.11125369292536007E~307, 0.123) = false < (0.11125369292536007E~307, 0.123E~2) = true > (0.11125369292536007E~307, 0.123E~2) = false == (0.11125369292536007E~307, 0.123E~2) = false ?= (0.11125369292536007E~307, 0.123E~2) = false < (0.11125369292536007E~307, 0.22250738585072014E~307) = true > (0.11125369292536007E~307, 0.22250738585072014E~307) = false == (0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, 0.22250738585072014E~307) = false < (0.11125369292536007E~307, 0.11125369292536007E~307) = false > (0.11125369292536007E~307, 0.11125369292536007E~307) = false == (0.11125369292536007E~307, 0.11125369292536007E~307) = true ?= (0.11125369292536007E~307, 0.11125369292536007E~307) = true < (0.11125369292536007E~307, 0.5E~323) = false > (0.11125369292536007E~307, 0.5E~323) = true == (0.11125369292536007E~307, 0.5E~323) = false ?= (0.11125369292536007E~307, 0.5E~323) = false < (0.11125369292536007E~307, 0.0) = false > (0.11125369292536007E~307, 0.0) = true == (0.11125369292536007E~307, 0.0) = false ?= (0.11125369292536007E~307, 0.0) = false < (0.11125369292536007E~307, ~0.17976931348623157E309) = false > (0.11125369292536007E~307, ~0.17976931348623157E309) = true == (0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (0.11125369292536007E~307, ~0.17976931348623157E309) = false < (0.11125369292536007E~307, ~0.8988465674311579E308) = false > (0.11125369292536007E~307, ~0.8988465674311579E308) = true == (0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (0.11125369292536007E~307, ~0.8988465674311579E308) = false < (0.11125369292536007E~307, ~0.123E4) = false > (0.11125369292536007E~307, ~0.123E4) = true == (0.11125369292536007E~307, ~0.123E4) = false ?= (0.11125369292536007E~307, ~0.123E4) = false < (0.11125369292536007E~307, ~0.123E2) = false > (0.11125369292536007E~307, ~0.123E2) = true == (0.11125369292536007E~307, ~0.123E2) = false ?= (0.11125369292536007E~307, ~0.123E2) = false < (0.11125369292536007E~307, ~0.3141592653589793E1) = false > (0.11125369292536007E~307, ~0.3141592653589793E1) = true == (0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (0.11125369292536007E~307, ~0.3141592653589793E1) = false < (0.11125369292536007E~307, ~0.2718281828459045E1) = false > (0.11125369292536007E~307, ~0.2718281828459045E1) = true == (0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (0.11125369292536007E~307, ~0.2718281828459045E1) = false < (0.11125369292536007E~307, ~0.123E1) = false > (0.11125369292536007E~307, ~0.123E1) = true == (0.11125369292536007E~307, ~0.123E1) = false ?= (0.11125369292536007E~307, ~0.123E1) = false < (0.11125369292536007E~307, ~0.123) = false > (0.11125369292536007E~307, ~0.123) = true == (0.11125369292536007E~307, ~0.123) = false ?= (0.11125369292536007E~307, ~0.123) = false < (0.11125369292536007E~307, ~0.123E~2) = false > (0.11125369292536007E~307, ~0.123E~2) = true == (0.11125369292536007E~307, ~0.123E~2) = false ?= (0.11125369292536007E~307, ~0.123E~2) = false < (0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (0.11125369292536007E~307, ~0.11125369292536007E~307) = true == (0.11125369292536007E~307, ~0.11125369292536007E~307) = false ?= (0.11125369292536007E~307, ~0.11125369292536007E~307) = false < (0.11125369292536007E~307, ~0.5E~323) = false > (0.11125369292536007E~307, ~0.5E~323) = true == (0.11125369292536007E~307, ~0.5E~323) = false ?= (0.11125369292536007E~307, ~0.5E~323) = false < (0.11125369292536007E~307, ~0.0) = false > (0.11125369292536007E~307, ~0.0) = true == (0.11125369292536007E~307, ~0.0) = false ?= (0.11125369292536007E~307, ~0.0) = false < (0.5E~323, 0.17976931348623157E309) = true > (0.5E~323, 0.17976931348623157E309) = false == (0.5E~323, 0.17976931348623157E309) = false ?= (0.5E~323, 0.17976931348623157E309) = false < (0.5E~323, 0.8988465674311579E308) = true > (0.5E~323, 0.8988465674311579E308) = false == (0.5E~323, 0.8988465674311579E308) = false ?= (0.5E~323, 0.8988465674311579E308) = false < (0.5E~323, 0.123E4) = true > (0.5E~323, 0.123E4) = false == (0.5E~323, 0.123E4) = false ?= (0.5E~323, 0.123E4) = false < (0.5E~323, 0.123E2) = true > (0.5E~323, 0.123E2) = false == (0.5E~323, 0.123E2) = false ?= (0.5E~323, 0.123E2) = false < (0.5E~323, 0.3141592653589793E1) = true > (0.5E~323, 0.3141592653589793E1) = false == (0.5E~323, 0.3141592653589793E1) = false ?= (0.5E~323, 0.3141592653589793E1) = false < (0.5E~323, 0.2718281828459045E1) = true > (0.5E~323, 0.2718281828459045E1) = false == (0.5E~323, 0.2718281828459045E1) = false ?= (0.5E~323, 0.2718281828459045E1) = false < (0.5E~323, 0.123E1) = true > (0.5E~323, 0.123E1) = false == (0.5E~323, 0.123E1) = false ?= (0.5E~323, 0.123E1) = false < (0.5E~323, 0.123) = true > (0.5E~323, 0.123) = false == (0.5E~323, 0.123) = false ?= (0.5E~323, 0.123) = false < (0.5E~323, 0.123E~2) = true > (0.5E~323, 0.123E~2) = false == (0.5E~323, 0.123E~2) = false ?= (0.5E~323, 0.123E~2) = false < (0.5E~323, 0.22250738585072014E~307) = true > (0.5E~323, 0.22250738585072014E~307) = false == (0.5E~323, 0.22250738585072014E~307) = false ?= (0.5E~323, 0.22250738585072014E~307) = false < (0.5E~323, 0.11125369292536007E~307) = true > (0.5E~323, 0.11125369292536007E~307) = false == (0.5E~323, 0.11125369292536007E~307) = false ?= (0.5E~323, 0.11125369292536007E~307) = false < (0.5E~323, 0.5E~323) = false > (0.5E~323, 0.5E~323) = false == (0.5E~323, 0.5E~323) = true ?= (0.5E~323, 0.5E~323) = true < (0.5E~323, 0.0) = false > (0.5E~323, 0.0) = true == (0.5E~323, 0.0) = false ?= (0.5E~323, 0.0) = false < (0.5E~323, ~0.17976931348623157E309) = false > (0.5E~323, ~0.17976931348623157E309) = true == (0.5E~323, ~0.17976931348623157E309) = false ?= (0.5E~323, ~0.17976931348623157E309) = false < (0.5E~323, ~0.8988465674311579E308) = false > (0.5E~323, ~0.8988465674311579E308) = true == (0.5E~323, ~0.8988465674311579E308) = false ?= (0.5E~323, ~0.8988465674311579E308) = false < (0.5E~323, ~0.123E4) = false > (0.5E~323, ~0.123E4) = true == (0.5E~323, ~0.123E4) = false ?= (0.5E~323, ~0.123E4) = false < (0.5E~323, ~0.123E2) = false > (0.5E~323, ~0.123E2) = true == (0.5E~323, ~0.123E2) = false ?= (0.5E~323, ~0.123E2) = false < (0.5E~323, ~0.3141592653589793E1) = false > (0.5E~323, ~0.3141592653589793E1) = true == (0.5E~323, ~0.3141592653589793E1) = false ?= (0.5E~323, ~0.3141592653589793E1) = false < (0.5E~323, ~0.2718281828459045E1) = false > (0.5E~323, ~0.2718281828459045E1) = true == (0.5E~323, ~0.2718281828459045E1) = false ?= (0.5E~323, ~0.2718281828459045E1) = false < (0.5E~323, ~0.123E1) = false > (0.5E~323, ~0.123E1) = true == (0.5E~323, ~0.123E1) = false ?= (0.5E~323, ~0.123E1) = false < (0.5E~323, ~0.123) = false > (0.5E~323, ~0.123) = true == (0.5E~323, ~0.123) = false ?= (0.5E~323, ~0.123) = false < (0.5E~323, ~0.123E~2) = false > (0.5E~323, ~0.123E~2) = true == (0.5E~323, ~0.123E~2) = false ?= (0.5E~323, ~0.123E~2) = false < (0.5E~323, ~0.22250738585072014E~307) = false > (0.5E~323, ~0.22250738585072014E~307) = true == (0.5E~323, ~0.22250738585072014E~307) = false ?= (0.5E~323, ~0.22250738585072014E~307) = false < (0.5E~323, ~0.11125369292536007E~307) = false > (0.5E~323, ~0.11125369292536007E~307) = true == (0.5E~323, ~0.11125369292536007E~307) = false ?= (0.5E~323, ~0.11125369292536007E~307) = false < (0.5E~323, ~0.5E~323) = false > (0.5E~323, ~0.5E~323) = true == (0.5E~323, ~0.5E~323) = false ?= (0.5E~323, ~0.5E~323) = false < (0.5E~323, ~0.0) = false > (0.5E~323, ~0.0) = true == (0.5E~323, ~0.0) = false ?= (0.5E~323, ~0.0) = false < (0.0, 0.17976931348623157E309) = true > (0.0, 0.17976931348623157E309) = false == (0.0, 0.17976931348623157E309) = false ?= (0.0, 0.17976931348623157E309) = false < (0.0, 0.8988465674311579E308) = true > (0.0, 0.8988465674311579E308) = false == (0.0, 0.8988465674311579E308) = false ?= (0.0, 0.8988465674311579E308) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.3141592653589793E1) = true > (0.0, 0.3141592653589793E1) = false == (0.0, 0.3141592653589793E1) = false ?= (0.0, 0.3141592653589793E1) = false < (0.0, 0.2718281828459045E1) = true > (0.0, 0.2718281828459045E1) = false == (0.0, 0.2718281828459045E1) = false ?= (0.0, 0.2718281828459045E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.22250738585072014E~307) = true > (0.0, 0.22250738585072014E~307) = false == (0.0, 0.22250738585072014E~307) = false ?= (0.0, 0.22250738585072014E~307) = false < (0.0, 0.11125369292536007E~307) = true > (0.0, 0.11125369292536007E~307) = false == (0.0, 0.11125369292536007E~307) = false ?= (0.0, 0.11125369292536007E~307) = false < (0.0, 0.5E~323) = true > (0.0, 0.5E~323) = false == (0.0, 0.5E~323) = false ?= (0.0, 0.5E~323) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.17976931348623157E309) = false > (0.0, ~0.17976931348623157E309) = true == (0.0, ~0.17976931348623157E309) = false ?= (0.0, ~0.17976931348623157E309) = false < (0.0, ~0.8988465674311579E308) = false > (0.0, ~0.8988465674311579E308) = true == (0.0, ~0.8988465674311579E308) = false ?= (0.0, ~0.8988465674311579E308) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.3141592653589793E1) = false > (0.0, ~0.3141592653589793E1) = true == (0.0, ~0.3141592653589793E1) = false ?= (0.0, ~0.3141592653589793E1) = false < (0.0, ~0.2718281828459045E1) = false > (0.0, ~0.2718281828459045E1) = true == (0.0, ~0.2718281828459045E1) = false ?= (0.0, ~0.2718281828459045E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.22250738585072014E~307) = false > (0.0, ~0.22250738585072014E~307) = true == (0.0, ~0.22250738585072014E~307) = false ?= (0.0, ~0.22250738585072014E~307) = false < (0.0, ~0.11125369292536007E~307) = false > (0.0, ~0.11125369292536007E~307) = true == (0.0, ~0.11125369292536007E~307) = false ?= (0.0, ~0.11125369292536007E~307) = false < (0.0, ~0.5E~323) = false > (0.0, ~0.5E~323) = true == (0.0, ~0.5E~323) = false ?= (0.0, ~0.5E~323) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.17976931348623157E309, 0.17976931348623157E309) = true > (~0.17976931348623157E309, 0.17976931348623157E309) = false == (~0.17976931348623157E309, 0.17976931348623157E309) = false ?= (~0.17976931348623157E309, 0.17976931348623157E309) = false < (~0.17976931348623157E309, 0.8988465674311579E308) = true > (~0.17976931348623157E309, 0.8988465674311579E308) = false == (~0.17976931348623157E309, 0.8988465674311579E308) = false ?= (~0.17976931348623157E309, 0.8988465674311579E308) = false < (~0.17976931348623157E309, 0.123E4) = true > (~0.17976931348623157E309, 0.123E4) = false == (~0.17976931348623157E309, 0.123E4) = false ?= (~0.17976931348623157E309, 0.123E4) = false < (~0.17976931348623157E309, 0.123E2) = true > (~0.17976931348623157E309, 0.123E2) = false == (~0.17976931348623157E309, 0.123E2) = false ?= (~0.17976931348623157E309, 0.123E2) = false < (~0.17976931348623157E309, 0.3141592653589793E1) = true > (~0.17976931348623157E309, 0.3141592653589793E1) = false == (~0.17976931348623157E309, 0.3141592653589793E1) = false ?= (~0.17976931348623157E309, 0.3141592653589793E1) = false < (~0.17976931348623157E309, 0.2718281828459045E1) = true > (~0.17976931348623157E309, 0.2718281828459045E1) = false == (~0.17976931348623157E309, 0.2718281828459045E1) = false ?= (~0.17976931348623157E309, 0.2718281828459045E1) = false < (~0.17976931348623157E309, 0.123E1) = true > (~0.17976931348623157E309, 0.123E1) = false == (~0.17976931348623157E309, 0.123E1) = false ?= (~0.17976931348623157E309, 0.123E1) = false < (~0.17976931348623157E309, 0.123) = true > (~0.17976931348623157E309, 0.123) = false == (~0.17976931348623157E309, 0.123) = false ?= (~0.17976931348623157E309, 0.123) = false < (~0.17976931348623157E309, 0.123E~2) = true > (~0.17976931348623157E309, 0.123E~2) = false == (~0.17976931348623157E309, 0.123E~2) = false ?= (~0.17976931348623157E309, 0.123E~2) = false < (~0.17976931348623157E309, 0.22250738585072014E~307) = true > (~0.17976931348623157E309, 0.22250738585072014E~307) = false == (~0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, 0.22250738585072014E~307) = false < (~0.17976931348623157E309, 0.11125369292536007E~307) = true > (~0.17976931348623157E309, 0.11125369292536007E~307) = false == (~0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, 0.11125369292536007E~307) = false < (~0.17976931348623157E309, 0.5E~323) = true > (~0.17976931348623157E309, 0.5E~323) = false == (~0.17976931348623157E309, 0.5E~323) = false ?= (~0.17976931348623157E309, 0.5E~323) = false < (~0.17976931348623157E309, 0.0) = true > (~0.17976931348623157E309, 0.0) = false == (~0.17976931348623157E309, 0.0) = false ?= (~0.17976931348623157E309, 0.0) = false < (~0.17976931348623157E309, ~0.17976931348623157E309) = false > (~0.17976931348623157E309, ~0.17976931348623157E309) = false == (~0.17976931348623157E309, ~0.17976931348623157E309) = true ?= (~0.17976931348623157E309, ~0.17976931348623157E309) = true < (~0.17976931348623157E309, ~0.8988465674311579E308) = true > (~0.17976931348623157E309, ~0.8988465674311579E308) = false == (~0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (~0.17976931348623157E309, ~0.8988465674311579E308) = false < (~0.17976931348623157E309, ~0.123E4) = true > (~0.17976931348623157E309, ~0.123E4) = false == (~0.17976931348623157E309, ~0.123E4) = false ?= (~0.17976931348623157E309, ~0.123E4) = false < (~0.17976931348623157E309, ~0.123E2) = true > (~0.17976931348623157E309, ~0.123E2) = false == (~0.17976931348623157E309, ~0.123E2) = false ?= (~0.17976931348623157E309, ~0.123E2) = false < (~0.17976931348623157E309, ~0.3141592653589793E1) = true > (~0.17976931348623157E309, ~0.3141592653589793E1) = false == (~0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (~0.17976931348623157E309, ~0.3141592653589793E1) = false < (~0.17976931348623157E309, ~0.2718281828459045E1) = true > (~0.17976931348623157E309, ~0.2718281828459045E1) = false == (~0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (~0.17976931348623157E309, ~0.2718281828459045E1) = false < (~0.17976931348623157E309, ~0.123E1) = true > (~0.17976931348623157E309, ~0.123E1) = false == (~0.17976931348623157E309, ~0.123E1) = false ?= (~0.17976931348623157E309, ~0.123E1) = false < (~0.17976931348623157E309, ~0.123) = true > (~0.17976931348623157E309, ~0.123) = false == (~0.17976931348623157E309, ~0.123) = false ?= (~0.17976931348623157E309, ~0.123) = false < (~0.17976931348623157E309, ~0.123E~2) = true > (~0.17976931348623157E309, ~0.123E~2) = false == (~0.17976931348623157E309, ~0.123E~2) = false ?= (~0.17976931348623157E309, ~0.123E~2) = false < (~0.17976931348623157E309, ~0.22250738585072014E~307) = true > (~0.17976931348623157E309, ~0.22250738585072014E~307) = false == (~0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, ~0.22250738585072014E~307) = false < (~0.17976931348623157E309, ~0.11125369292536007E~307) = true > (~0.17976931348623157E309, ~0.11125369292536007E~307) = false == (~0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, ~0.11125369292536007E~307) = false < (~0.17976931348623157E309, ~0.5E~323) = true > (~0.17976931348623157E309, ~0.5E~323) = false == (~0.17976931348623157E309, ~0.5E~323) = false ?= (~0.17976931348623157E309, ~0.5E~323) = false < (~0.17976931348623157E309, ~0.0) = true > (~0.17976931348623157E309, ~0.0) = false == (~0.17976931348623157E309, ~0.0) = false ?= (~0.17976931348623157E309, ~0.0) = false < (~0.8988465674311579E308, 0.17976931348623157E309) = true > (~0.8988465674311579E308, 0.17976931348623157E309) = false == (~0.8988465674311579E308, 0.17976931348623157E309) = false ?= (~0.8988465674311579E308, 0.17976931348623157E309) = false < (~0.8988465674311579E308, 0.8988465674311579E308) = true > (~0.8988465674311579E308, 0.8988465674311579E308) = false == (~0.8988465674311579E308, 0.8988465674311579E308) = false ?= (~0.8988465674311579E308, 0.8988465674311579E308) = false < (~0.8988465674311579E308, 0.123E4) = true > (~0.8988465674311579E308, 0.123E4) = false == (~0.8988465674311579E308, 0.123E4) = false ?= (~0.8988465674311579E308, 0.123E4) = false < (~0.8988465674311579E308, 0.123E2) = true > (~0.8988465674311579E308, 0.123E2) = false == (~0.8988465674311579E308, 0.123E2) = false ?= (~0.8988465674311579E308, 0.123E2) = false < (~0.8988465674311579E308, 0.3141592653589793E1) = true > (~0.8988465674311579E308, 0.3141592653589793E1) = false == (~0.8988465674311579E308, 0.3141592653589793E1) = false ?= (~0.8988465674311579E308, 0.3141592653589793E1) = false < (~0.8988465674311579E308, 0.2718281828459045E1) = true > (~0.8988465674311579E308, 0.2718281828459045E1) = false == (~0.8988465674311579E308, 0.2718281828459045E1) = false ?= (~0.8988465674311579E308, 0.2718281828459045E1) = false < (~0.8988465674311579E308, 0.123E1) = true > (~0.8988465674311579E308, 0.123E1) = false == (~0.8988465674311579E308, 0.123E1) = false ?= (~0.8988465674311579E308, 0.123E1) = false < (~0.8988465674311579E308, 0.123) = true > (~0.8988465674311579E308, 0.123) = false == (~0.8988465674311579E308, 0.123) = false ?= (~0.8988465674311579E308, 0.123) = false < (~0.8988465674311579E308, 0.123E~2) = true > (~0.8988465674311579E308, 0.123E~2) = false == (~0.8988465674311579E308, 0.123E~2) = false ?= (~0.8988465674311579E308, 0.123E~2) = false < (~0.8988465674311579E308, 0.22250738585072014E~307) = true > (~0.8988465674311579E308, 0.22250738585072014E~307) = false == (~0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, 0.22250738585072014E~307) = false < (~0.8988465674311579E308, 0.11125369292536007E~307) = true > (~0.8988465674311579E308, 0.11125369292536007E~307) = false == (~0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, 0.11125369292536007E~307) = false < (~0.8988465674311579E308, 0.5E~323) = true > (~0.8988465674311579E308, 0.5E~323) = false == (~0.8988465674311579E308, 0.5E~323) = false ?= (~0.8988465674311579E308, 0.5E~323) = false < (~0.8988465674311579E308, 0.0) = true > (~0.8988465674311579E308, 0.0) = false == (~0.8988465674311579E308, 0.0) = false ?= (~0.8988465674311579E308, 0.0) = false < (~0.8988465674311579E308, ~0.17976931348623157E309) = false > (~0.8988465674311579E308, ~0.17976931348623157E309) = true == (~0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (~0.8988465674311579E308, ~0.17976931348623157E309) = false < (~0.8988465674311579E308, ~0.8988465674311579E308) = false > (~0.8988465674311579E308, ~0.8988465674311579E308) = false == (~0.8988465674311579E308, ~0.8988465674311579E308) = true ?= (~0.8988465674311579E308, ~0.8988465674311579E308) = true < (~0.8988465674311579E308, ~0.123E4) = true > (~0.8988465674311579E308, ~0.123E4) = false == (~0.8988465674311579E308, ~0.123E4) = false ?= (~0.8988465674311579E308, ~0.123E4) = false < (~0.8988465674311579E308, ~0.123E2) = true > (~0.8988465674311579E308, ~0.123E2) = false == (~0.8988465674311579E308, ~0.123E2) = false ?= (~0.8988465674311579E308, ~0.123E2) = false < (~0.8988465674311579E308, ~0.3141592653589793E1) = true > (~0.8988465674311579E308, ~0.3141592653589793E1) = false == (~0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (~0.8988465674311579E308, ~0.3141592653589793E1) = false < (~0.8988465674311579E308, ~0.2718281828459045E1) = true > (~0.8988465674311579E308, ~0.2718281828459045E1) = false == (~0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (~0.8988465674311579E308, ~0.2718281828459045E1) = false < (~0.8988465674311579E308, ~0.123E1) = true > (~0.8988465674311579E308, ~0.123E1) = false == (~0.8988465674311579E308, ~0.123E1) = false ?= (~0.8988465674311579E308, ~0.123E1) = false < (~0.8988465674311579E308, ~0.123) = true > (~0.8988465674311579E308, ~0.123) = false == (~0.8988465674311579E308, ~0.123) = false ?= (~0.8988465674311579E308, ~0.123) = false < (~0.8988465674311579E308, ~0.123E~2) = true > (~0.8988465674311579E308, ~0.123E~2) = false == (~0.8988465674311579E308, ~0.123E~2) = false ?= (~0.8988465674311579E308, ~0.123E~2) = false < (~0.8988465674311579E308, ~0.22250738585072014E~307) = true > (~0.8988465674311579E308, ~0.22250738585072014E~307) = false == (~0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, ~0.22250738585072014E~307) = false < (~0.8988465674311579E308, ~0.11125369292536007E~307) = true > (~0.8988465674311579E308, ~0.11125369292536007E~307) = false == (~0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, ~0.11125369292536007E~307) = false < (~0.8988465674311579E308, ~0.5E~323) = true > (~0.8988465674311579E308, ~0.5E~323) = false == (~0.8988465674311579E308, ~0.5E~323) = false ?= (~0.8988465674311579E308, ~0.5E~323) = false < (~0.8988465674311579E308, ~0.0) = true > (~0.8988465674311579E308, ~0.0) = false == (~0.8988465674311579E308, ~0.0) = false ?= (~0.8988465674311579E308, ~0.0) = false < (~0.123E4, 0.17976931348623157E309) = true > (~0.123E4, 0.17976931348623157E309) = false == (~0.123E4, 0.17976931348623157E309) = false ?= (~0.123E4, 0.17976931348623157E309) = false < (~0.123E4, 0.8988465674311579E308) = true > (~0.123E4, 0.8988465674311579E308) = false == (~0.123E4, 0.8988465674311579E308) = false ?= (~0.123E4, 0.8988465674311579E308) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.3141592653589793E1) = true > (~0.123E4, 0.3141592653589793E1) = false == (~0.123E4, 0.3141592653589793E1) = false ?= (~0.123E4, 0.3141592653589793E1) = false < (~0.123E4, 0.2718281828459045E1) = true > (~0.123E4, 0.2718281828459045E1) = false == (~0.123E4, 0.2718281828459045E1) = false ?= (~0.123E4, 0.2718281828459045E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.22250738585072014E~307) = true > (~0.123E4, 0.22250738585072014E~307) = false == (~0.123E4, 0.22250738585072014E~307) = false ?= (~0.123E4, 0.22250738585072014E~307) = false < (~0.123E4, 0.11125369292536007E~307) = true > (~0.123E4, 0.11125369292536007E~307) = false == (~0.123E4, 0.11125369292536007E~307) = false ?= (~0.123E4, 0.11125369292536007E~307) = false < (~0.123E4, 0.5E~323) = true > (~0.123E4, 0.5E~323) = false == (~0.123E4, 0.5E~323) = false ?= (~0.123E4, 0.5E~323) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.17976931348623157E309) = false > (~0.123E4, ~0.17976931348623157E309) = true == (~0.123E4, ~0.17976931348623157E309) = false ?= (~0.123E4, ~0.17976931348623157E309) = false < (~0.123E4, ~0.8988465674311579E308) = false > (~0.123E4, ~0.8988465674311579E308) = true == (~0.123E4, ~0.8988465674311579E308) = false ?= (~0.123E4, ~0.8988465674311579E308) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.3141592653589793E1) = true > (~0.123E4, ~0.3141592653589793E1) = false == (~0.123E4, ~0.3141592653589793E1) = false ?= (~0.123E4, ~0.3141592653589793E1) = false < (~0.123E4, ~0.2718281828459045E1) = true > (~0.123E4, ~0.2718281828459045E1) = false == (~0.123E4, ~0.2718281828459045E1) = false ?= (~0.123E4, ~0.2718281828459045E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.22250738585072014E~307) = true > (~0.123E4, ~0.22250738585072014E~307) = false == (~0.123E4, ~0.22250738585072014E~307) = false ?= (~0.123E4, ~0.22250738585072014E~307) = false < (~0.123E4, ~0.11125369292536007E~307) = true > (~0.123E4, ~0.11125369292536007E~307) = false == (~0.123E4, ~0.11125369292536007E~307) = false ?= (~0.123E4, ~0.11125369292536007E~307) = false < (~0.123E4, ~0.5E~323) = true > (~0.123E4, ~0.5E~323) = false == (~0.123E4, ~0.5E~323) = false ?= (~0.123E4, ~0.5E~323) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.17976931348623157E309) = true > (~0.123E2, 0.17976931348623157E309) = false == (~0.123E2, 0.17976931348623157E309) = false ?= (~0.123E2, 0.17976931348623157E309) = false < (~0.123E2, 0.8988465674311579E308) = true > (~0.123E2, 0.8988465674311579E308) = false == (~0.123E2, 0.8988465674311579E308) = false ?= (~0.123E2, 0.8988465674311579E308) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.3141592653589793E1) = true > (~0.123E2, 0.3141592653589793E1) = false == (~0.123E2, 0.3141592653589793E1) = false ?= (~0.123E2, 0.3141592653589793E1) = false < (~0.123E2, 0.2718281828459045E1) = true > (~0.123E2, 0.2718281828459045E1) = false == (~0.123E2, 0.2718281828459045E1) = false ?= (~0.123E2, 0.2718281828459045E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.22250738585072014E~307) = true > (~0.123E2, 0.22250738585072014E~307) = false == (~0.123E2, 0.22250738585072014E~307) = false ?= (~0.123E2, 0.22250738585072014E~307) = false < (~0.123E2, 0.11125369292536007E~307) = true > (~0.123E2, 0.11125369292536007E~307) = false == (~0.123E2, 0.11125369292536007E~307) = false ?= (~0.123E2, 0.11125369292536007E~307) = false < (~0.123E2, 0.5E~323) = true > (~0.123E2, 0.5E~323) = false == (~0.123E2, 0.5E~323) = false ?= (~0.123E2, 0.5E~323) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.17976931348623157E309) = false > (~0.123E2, ~0.17976931348623157E309) = true == (~0.123E2, ~0.17976931348623157E309) = false ?= (~0.123E2, ~0.17976931348623157E309) = false < (~0.123E2, ~0.8988465674311579E308) = false > (~0.123E2, ~0.8988465674311579E308) = true == (~0.123E2, ~0.8988465674311579E308) = false ?= (~0.123E2, ~0.8988465674311579E308) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.3141592653589793E1) = true > (~0.123E2, ~0.3141592653589793E1) = false == (~0.123E2, ~0.3141592653589793E1) = false ?= (~0.123E2, ~0.3141592653589793E1) = false < (~0.123E2, ~0.2718281828459045E1) = true > (~0.123E2, ~0.2718281828459045E1) = false == (~0.123E2, ~0.2718281828459045E1) = false ?= (~0.123E2, ~0.2718281828459045E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.22250738585072014E~307) = true > (~0.123E2, ~0.22250738585072014E~307) = false == (~0.123E2, ~0.22250738585072014E~307) = false ?= (~0.123E2, ~0.22250738585072014E~307) = false < (~0.123E2, ~0.11125369292536007E~307) = true > (~0.123E2, ~0.11125369292536007E~307) = false == (~0.123E2, ~0.11125369292536007E~307) = false ?= (~0.123E2, ~0.11125369292536007E~307) = false < (~0.123E2, ~0.5E~323) = true > (~0.123E2, ~0.5E~323) = false == (~0.123E2, ~0.5E~323) = false ?= (~0.123E2, ~0.5E~323) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.3141592653589793E1, 0.17976931348623157E309) = true > (~0.3141592653589793E1, 0.17976931348623157E309) = false == (~0.3141592653589793E1, 0.17976931348623157E309) = false ?= (~0.3141592653589793E1, 0.17976931348623157E309) = false < (~0.3141592653589793E1, 0.8988465674311579E308) = true > (~0.3141592653589793E1, 0.8988465674311579E308) = false == (~0.3141592653589793E1, 0.8988465674311579E308) = false ?= (~0.3141592653589793E1, 0.8988465674311579E308) = false < (~0.3141592653589793E1, 0.123E4) = true > (~0.3141592653589793E1, 0.123E4) = false == (~0.3141592653589793E1, 0.123E4) = false ?= (~0.3141592653589793E1, 0.123E4) = false < (~0.3141592653589793E1, 0.123E2) = true > (~0.3141592653589793E1, 0.123E2) = false == (~0.3141592653589793E1, 0.123E2) = false ?= (~0.3141592653589793E1, 0.123E2) = false < (~0.3141592653589793E1, 0.3141592653589793E1) = true > (~0.3141592653589793E1, 0.3141592653589793E1) = false == (~0.3141592653589793E1, 0.3141592653589793E1) = false ?= (~0.3141592653589793E1, 0.3141592653589793E1) = false < (~0.3141592653589793E1, 0.2718281828459045E1) = true > (~0.3141592653589793E1, 0.2718281828459045E1) = false == (~0.3141592653589793E1, 0.2718281828459045E1) = false ?= (~0.3141592653589793E1, 0.2718281828459045E1) = false < (~0.3141592653589793E1, 0.123E1) = true > (~0.3141592653589793E1, 0.123E1) = false == (~0.3141592653589793E1, 0.123E1) = false ?= (~0.3141592653589793E1, 0.123E1) = false < (~0.3141592653589793E1, 0.123) = true > (~0.3141592653589793E1, 0.123) = false == (~0.3141592653589793E1, 0.123) = false ?= (~0.3141592653589793E1, 0.123) = false < (~0.3141592653589793E1, 0.123E~2) = true > (~0.3141592653589793E1, 0.123E~2) = false == (~0.3141592653589793E1, 0.123E~2) = false ?= (~0.3141592653589793E1, 0.123E~2) = false < (~0.3141592653589793E1, 0.22250738585072014E~307) = true > (~0.3141592653589793E1, 0.22250738585072014E~307) = false == (~0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, 0.22250738585072014E~307) = false < (~0.3141592653589793E1, 0.11125369292536007E~307) = true > (~0.3141592653589793E1, 0.11125369292536007E~307) = false == (~0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, 0.11125369292536007E~307) = false < (~0.3141592653589793E1, 0.5E~323) = true > (~0.3141592653589793E1, 0.5E~323) = false == (~0.3141592653589793E1, 0.5E~323) = false ?= (~0.3141592653589793E1, 0.5E~323) = false < (~0.3141592653589793E1, 0.0) = true > (~0.3141592653589793E1, 0.0) = false == (~0.3141592653589793E1, 0.0) = false ?= (~0.3141592653589793E1, 0.0) = false < (~0.3141592653589793E1, ~0.17976931348623157E309) = false > (~0.3141592653589793E1, ~0.17976931348623157E309) = true == (~0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (~0.3141592653589793E1, ~0.17976931348623157E309) = false < (~0.3141592653589793E1, ~0.8988465674311579E308) = false > (~0.3141592653589793E1, ~0.8988465674311579E308) = true == (~0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (~0.3141592653589793E1, ~0.8988465674311579E308) = false < (~0.3141592653589793E1, ~0.123E4) = false > (~0.3141592653589793E1, ~0.123E4) = true == (~0.3141592653589793E1, ~0.123E4) = false ?= (~0.3141592653589793E1, ~0.123E4) = false < (~0.3141592653589793E1, ~0.123E2) = false > (~0.3141592653589793E1, ~0.123E2) = true == (~0.3141592653589793E1, ~0.123E2) = false ?= (~0.3141592653589793E1, ~0.123E2) = false < (~0.3141592653589793E1, ~0.3141592653589793E1) = false > (~0.3141592653589793E1, ~0.3141592653589793E1) = false == (~0.3141592653589793E1, ~0.3141592653589793E1) = true ?= (~0.3141592653589793E1, ~0.3141592653589793E1) = true < (~0.3141592653589793E1, ~0.2718281828459045E1) = true > (~0.3141592653589793E1, ~0.2718281828459045E1) = false == (~0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (~0.3141592653589793E1, ~0.2718281828459045E1) = false < (~0.3141592653589793E1, ~0.123E1) = true > (~0.3141592653589793E1, ~0.123E1) = false == (~0.3141592653589793E1, ~0.123E1) = false ?= (~0.3141592653589793E1, ~0.123E1) = false < (~0.3141592653589793E1, ~0.123) = true > (~0.3141592653589793E1, ~0.123) = false == (~0.3141592653589793E1, ~0.123) = false ?= (~0.3141592653589793E1, ~0.123) = false < (~0.3141592653589793E1, ~0.123E~2) = true > (~0.3141592653589793E1, ~0.123E~2) = false == (~0.3141592653589793E1, ~0.123E~2) = false ?= (~0.3141592653589793E1, ~0.123E~2) = false < (~0.3141592653589793E1, ~0.22250738585072014E~307) = true > (~0.3141592653589793E1, ~0.22250738585072014E~307) = false == (~0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, ~0.22250738585072014E~307) = false < (~0.3141592653589793E1, ~0.11125369292536007E~307) = true > (~0.3141592653589793E1, ~0.11125369292536007E~307) = false == (~0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, ~0.11125369292536007E~307) = false < (~0.3141592653589793E1, ~0.5E~323) = true > (~0.3141592653589793E1, ~0.5E~323) = false == (~0.3141592653589793E1, ~0.5E~323) = false ?= (~0.3141592653589793E1, ~0.5E~323) = false < (~0.3141592653589793E1, ~0.0) = true > (~0.3141592653589793E1, ~0.0) = false == (~0.3141592653589793E1, ~0.0) = false ?= (~0.3141592653589793E1, ~0.0) = false < (~0.2718281828459045E1, 0.17976931348623157E309) = true > (~0.2718281828459045E1, 0.17976931348623157E309) = false == (~0.2718281828459045E1, 0.17976931348623157E309) = false ?= (~0.2718281828459045E1, 0.17976931348623157E309) = false < (~0.2718281828459045E1, 0.8988465674311579E308) = true > (~0.2718281828459045E1, 0.8988465674311579E308) = false == (~0.2718281828459045E1, 0.8988465674311579E308) = false ?= (~0.2718281828459045E1, 0.8988465674311579E308) = false < (~0.2718281828459045E1, 0.123E4) = true > (~0.2718281828459045E1, 0.123E4) = false == (~0.2718281828459045E1, 0.123E4) = false ?= (~0.2718281828459045E1, 0.123E4) = false < (~0.2718281828459045E1, 0.123E2) = true > (~0.2718281828459045E1, 0.123E2) = false == (~0.2718281828459045E1, 0.123E2) = false ?= (~0.2718281828459045E1, 0.123E2) = false < (~0.2718281828459045E1, 0.3141592653589793E1) = true > (~0.2718281828459045E1, 0.3141592653589793E1) = false == (~0.2718281828459045E1, 0.3141592653589793E1) = false ?= (~0.2718281828459045E1, 0.3141592653589793E1) = false < (~0.2718281828459045E1, 0.2718281828459045E1) = true > (~0.2718281828459045E1, 0.2718281828459045E1) = false == (~0.2718281828459045E1, 0.2718281828459045E1) = false ?= (~0.2718281828459045E1, 0.2718281828459045E1) = false < (~0.2718281828459045E1, 0.123E1) = true > (~0.2718281828459045E1, 0.123E1) = false == (~0.2718281828459045E1, 0.123E1) = false ?= (~0.2718281828459045E1, 0.123E1) = false < (~0.2718281828459045E1, 0.123) = true > (~0.2718281828459045E1, 0.123) = false == (~0.2718281828459045E1, 0.123) = false ?= (~0.2718281828459045E1, 0.123) = false < (~0.2718281828459045E1, 0.123E~2) = true > (~0.2718281828459045E1, 0.123E~2) = false == (~0.2718281828459045E1, 0.123E~2) = false ?= (~0.2718281828459045E1, 0.123E~2) = false < (~0.2718281828459045E1, 0.22250738585072014E~307) = true > (~0.2718281828459045E1, 0.22250738585072014E~307) = false == (~0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, 0.22250738585072014E~307) = false < (~0.2718281828459045E1, 0.11125369292536007E~307) = true > (~0.2718281828459045E1, 0.11125369292536007E~307) = false == (~0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, 0.11125369292536007E~307) = false < (~0.2718281828459045E1, 0.5E~323) = true > (~0.2718281828459045E1, 0.5E~323) = false == (~0.2718281828459045E1, 0.5E~323) = false ?= (~0.2718281828459045E1, 0.5E~323) = false < (~0.2718281828459045E1, 0.0) = true > (~0.2718281828459045E1, 0.0) = false == (~0.2718281828459045E1, 0.0) = false ?= (~0.2718281828459045E1, 0.0) = false < (~0.2718281828459045E1, ~0.17976931348623157E309) = false > (~0.2718281828459045E1, ~0.17976931348623157E309) = true == (~0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (~0.2718281828459045E1, ~0.17976931348623157E309) = false < (~0.2718281828459045E1, ~0.8988465674311579E308) = false > (~0.2718281828459045E1, ~0.8988465674311579E308) = true == (~0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (~0.2718281828459045E1, ~0.8988465674311579E308) = false < (~0.2718281828459045E1, ~0.123E4) = false > (~0.2718281828459045E1, ~0.123E4) = true == (~0.2718281828459045E1, ~0.123E4) = false ?= (~0.2718281828459045E1, ~0.123E4) = false < (~0.2718281828459045E1, ~0.123E2) = false > (~0.2718281828459045E1, ~0.123E2) = true == (~0.2718281828459045E1, ~0.123E2) = false ?= (~0.2718281828459045E1, ~0.123E2) = false < (~0.2718281828459045E1, ~0.3141592653589793E1) = false > (~0.2718281828459045E1, ~0.3141592653589793E1) = true == (~0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (~0.2718281828459045E1, ~0.3141592653589793E1) = false < (~0.2718281828459045E1, ~0.2718281828459045E1) = false > (~0.2718281828459045E1, ~0.2718281828459045E1) = false == (~0.2718281828459045E1, ~0.2718281828459045E1) = true ?= (~0.2718281828459045E1, ~0.2718281828459045E1) = true < (~0.2718281828459045E1, ~0.123E1) = true > (~0.2718281828459045E1, ~0.123E1) = false == (~0.2718281828459045E1, ~0.123E1) = false ?= (~0.2718281828459045E1, ~0.123E1) = false < (~0.2718281828459045E1, ~0.123) = true > (~0.2718281828459045E1, ~0.123) = false == (~0.2718281828459045E1, ~0.123) = false ?= (~0.2718281828459045E1, ~0.123) = false < (~0.2718281828459045E1, ~0.123E~2) = true > (~0.2718281828459045E1, ~0.123E~2) = false == (~0.2718281828459045E1, ~0.123E~2) = false ?= (~0.2718281828459045E1, ~0.123E~2) = false < (~0.2718281828459045E1, ~0.22250738585072014E~307) = true > (~0.2718281828459045E1, ~0.22250738585072014E~307) = false == (~0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, ~0.22250738585072014E~307) = false < (~0.2718281828459045E1, ~0.11125369292536007E~307) = true > (~0.2718281828459045E1, ~0.11125369292536007E~307) = false == (~0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, ~0.11125369292536007E~307) = false < (~0.2718281828459045E1, ~0.5E~323) = true > (~0.2718281828459045E1, ~0.5E~323) = false == (~0.2718281828459045E1, ~0.5E~323) = false ?= (~0.2718281828459045E1, ~0.5E~323) = false < (~0.2718281828459045E1, ~0.0) = true > (~0.2718281828459045E1, ~0.0) = false == (~0.2718281828459045E1, ~0.0) = false ?= (~0.2718281828459045E1, ~0.0) = false < (~0.123E1, 0.17976931348623157E309) = true > (~0.123E1, 0.17976931348623157E309) = false == (~0.123E1, 0.17976931348623157E309) = false ?= (~0.123E1, 0.17976931348623157E309) = false < (~0.123E1, 0.8988465674311579E308) = true > (~0.123E1, 0.8988465674311579E308) = false == (~0.123E1, 0.8988465674311579E308) = false ?= (~0.123E1, 0.8988465674311579E308) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.3141592653589793E1) = true > (~0.123E1, 0.3141592653589793E1) = false == (~0.123E1, 0.3141592653589793E1) = false ?= (~0.123E1, 0.3141592653589793E1) = false < (~0.123E1, 0.2718281828459045E1) = true > (~0.123E1, 0.2718281828459045E1) = false == (~0.123E1, 0.2718281828459045E1) = false ?= (~0.123E1, 0.2718281828459045E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.22250738585072014E~307) = true > (~0.123E1, 0.22250738585072014E~307) = false == (~0.123E1, 0.22250738585072014E~307) = false ?= (~0.123E1, 0.22250738585072014E~307) = false < (~0.123E1, 0.11125369292536007E~307) = true > (~0.123E1, 0.11125369292536007E~307) = false == (~0.123E1, 0.11125369292536007E~307) = false ?= (~0.123E1, 0.11125369292536007E~307) = false < (~0.123E1, 0.5E~323) = true > (~0.123E1, 0.5E~323) = false == (~0.123E1, 0.5E~323) = false ?= (~0.123E1, 0.5E~323) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.17976931348623157E309) = false > (~0.123E1, ~0.17976931348623157E309) = true == (~0.123E1, ~0.17976931348623157E309) = false ?= (~0.123E1, ~0.17976931348623157E309) = false < (~0.123E1, ~0.8988465674311579E308) = false > (~0.123E1, ~0.8988465674311579E308) = true == (~0.123E1, ~0.8988465674311579E308) = false ?= (~0.123E1, ~0.8988465674311579E308) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.3141592653589793E1) = false > (~0.123E1, ~0.3141592653589793E1) = true == (~0.123E1, ~0.3141592653589793E1) = false ?= (~0.123E1, ~0.3141592653589793E1) = false < (~0.123E1, ~0.2718281828459045E1) = false > (~0.123E1, ~0.2718281828459045E1) = true == (~0.123E1, ~0.2718281828459045E1) = false ?= (~0.123E1, ~0.2718281828459045E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.22250738585072014E~307) = true > (~0.123E1, ~0.22250738585072014E~307) = false == (~0.123E1, ~0.22250738585072014E~307) = false ?= (~0.123E1, ~0.22250738585072014E~307) = false < (~0.123E1, ~0.11125369292536007E~307) = true > (~0.123E1, ~0.11125369292536007E~307) = false == (~0.123E1, ~0.11125369292536007E~307) = false ?= (~0.123E1, ~0.11125369292536007E~307) = false < (~0.123E1, ~0.5E~323) = true > (~0.123E1, ~0.5E~323) = false == (~0.123E1, ~0.5E~323) = false ?= (~0.123E1, ~0.5E~323) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.17976931348623157E309) = true > (~0.123, 0.17976931348623157E309) = false == (~0.123, 0.17976931348623157E309) = false ?= (~0.123, 0.17976931348623157E309) = false < (~0.123, 0.8988465674311579E308) = true > (~0.123, 0.8988465674311579E308) = false == (~0.123, 0.8988465674311579E308) = false ?= (~0.123, 0.8988465674311579E308) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.3141592653589793E1) = true > (~0.123, 0.3141592653589793E1) = false == (~0.123, 0.3141592653589793E1) = false ?= (~0.123, 0.3141592653589793E1) = false < (~0.123, 0.2718281828459045E1) = true > (~0.123, 0.2718281828459045E1) = false == (~0.123, 0.2718281828459045E1) = false ?= (~0.123, 0.2718281828459045E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.22250738585072014E~307) = true > (~0.123, 0.22250738585072014E~307) = false == (~0.123, 0.22250738585072014E~307) = false ?= (~0.123, 0.22250738585072014E~307) = false < (~0.123, 0.11125369292536007E~307) = true > (~0.123, 0.11125369292536007E~307) = false == (~0.123, 0.11125369292536007E~307) = false ?= (~0.123, 0.11125369292536007E~307) = false < (~0.123, 0.5E~323) = true > (~0.123, 0.5E~323) = false == (~0.123, 0.5E~323) = false ?= (~0.123, 0.5E~323) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.17976931348623157E309) = false > (~0.123, ~0.17976931348623157E309) = true == (~0.123, ~0.17976931348623157E309) = false ?= (~0.123, ~0.17976931348623157E309) = false < (~0.123, ~0.8988465674311579E308) = false > (~0.123, ~0.8988465674311579E308) = true == (~0.123, ~0.8988465674311579E308) = false ?= (~0.123, ~0.8988465674311579E308) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.3141592653589793E1) = false > (~0.123, ~0.3141592653589793E1) = true == (~0.123, ~0.3141592653589793E1) = false ?= (~0.123, ~0.3141592653589793E1) = false < (~0.123, ~0.2718281828459045E1) = false > (~0.123, ~0.2718281828459045E1) = true == (~0.123, ~0.2718281828459045E1) = false ?= (~0.123, ~0.2718281828459045E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.22250738585072014E~307) = true > (~0.123, ~0.22250738585072014E~307) = false == (~0.123, ~0.22250738585072014E~307) = false ?= (~0.123, ~0.22250738585072014E~307) = false < (~0.123, ~0.11125369292536007E~307) = true > (~0.123, ~0.11125369292536007E~307) = false == (~0.123, ~0.11125369292536007E~307) = false ?= (~0.123, ~0.11125369292536007E~307) = false < (~0.123, ~0.5E~323) = true > (~0.123, ~0.5E~323) = false == (~0.123, ~0.5E~323) = false ?= (~0.123, ~0.5E~323) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.17976931348623157E309) = true > (~0.123E~2, 0.17976931348623157E309) = false == (~0.123E~2, 0.17976931348623157E309) = false ?= (~0.123E~2, 0.17976931348623157E309) = false < (~0.123E~2, 0.8988465674311579E308) = true > (~0.123E~2, 0.8988465674311579E308) = false == (~0.123E~2, 0.8988465674311579E308) = false ?= (~0.123E~2, 0.8988465674311579E308) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.3141592653589793E1) = true > (~0.123E~2, 0.3141592653589793E1) = false == (~0.123E~2, 0.3141592653589793E1) = false ?= (~0.123E~2, 0.3141592653589793E1) = false < (~0.123E~2, 0.2718281828459045E1) = true > (~0.123E~2, 0.2718281828459045E1) = false == (~0.123E~2, 0.2718281828459045E1) = false ?= (~0.123E~2, 0.2718281828459045E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.22250738585072014E~307) = true > (~0.123E~2, 0.22250738585072014E~307) = false == (~0.123E~2, 0.22250738585072014E~307) = false ?= (~0.123E~2, 0.22250738585072014E~307) = false < (~0.123E~2, 0.11125369292536007E~307) = true > (~0.123E~2, 0.11125369292536007E~307) = false == (~0.123E~2, 0.11125369292536007E~307) = false ?= (~0.123E~2, 0.11125369292536007E~307) = false < (~0.123E~2, 0.5E~323) = true > (~0.123E~2, 0.5E~323) = false == (~0.123E~2, 0.5E~323) = false ?= (~0.123E~2, 0.5E~323) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.17976931348623157E309) = false > (~0.123E~2, ~0.17976931348623157E309) = true == (~0.123E~2, ~0.17976931348623157E309) = false ?= (~0.123E~2, ~0.17976931348623157E309) = false < (~0.123E~2, ~0.8988465674311579E308) = false > (~0.123E~2, ~0.8988465674311579E308) = true == (~0.123E~2, ~0.8988465674311579E308) = false ?= (~0.123E~2, ~0.8988465674311579E308) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.3141592653589793E1) = false > (~0.123E~2, ~0.3141592653589793E1) = true == (~0.123E~2, ~0.3141592653589793E1) = false ?= (~0.123E~2, ~0.3141592653589793E1) = false < (~0.123E~2, ~0.2718281828459045E1) = false > (~0.123E~2, ~0.2718281828459045E1) = true == (~0.123E~2, ~0.2718281828459045E1) = false ?= (~0.123E~2, ~0.2718281828459045E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.22250738585072014E~307) = true > (~0.123E~2, ~0.22250738585072014E~307) = false == (~0.123E~2, ~0.22250738585072014E~307) = false ?= (~0.123E~2, ~0.22250738585072014E~307) = false < (~0.123E~2, ~0.11125369292536007E~307) = true > (~0.123E~2, ~0.11125369292536007E~307) = false == (~0.123E~2, ~0.11125369292536007E~307) = false ?= (~0.123E~2, ~0.11125369292536007E~307) = false < (~0.123E~2, ~0.5E~323) = true > (~0.123E~2, ~0.5E~323) = false == (~0.123E~2, ~0.5E~323) = false ?= (~0.123E~2, ~0.5E~323) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.22250738585072014E~307, 0.17976931348623157E309) = true > (~0.22250738585072014E~307, 0.17976931348623157E309) = false == (~0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, 0.17976931348623157E309) = false < (~0.22250738585072014E~307, 0.8988465674311579E308) = true > (~0.22250738585072014E~307, 0.8988465674311579E308) = false == (~0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, 0.8988465674311579E308) = false < (~0.22250738585072014E~307, 0.123E4) = true > (~0.22250738585072014E~307, 0.123E4) = false == (~0.22250738585072014E~307, 0.123E4) = false ?= (~0.22250738585072014E~307, 0.123E4) = false < (~0.22250738585072014E~307, 0.123E2) = true > (~0.22250738585072014E~307, 0.123E2) = false == (~0.22250738585072014E~307, 0.123E2) = false ?= (~0.22250738585072014E~307, 0.123E2) = false < (~0.22250738585072014E~307, 0.3141592653589793E1) = true > (~0.22250738585072014E~307, 0.3141592653589793E1) = false == (~0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, 0.3141592653589793E1) = false < (~0.22250738585072014E~307, 0.2718281828459045E1) = true > (~0.22250738585072014E~307, 0.2718281828459045E1) = false == (~0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, 0.2718281828459045E1) = false < (~0.22250738585072014E~307, 0.123E1) = true > (~0.22250738585072014E~307, 0.123E1) = false == (~0.22250738585072014E~307, 0.123E1) = false ?= (~0.22250738585072014E~307, 0.123E1) = false < (~0.22250738585072014E~307, 0.123) = true > (~0.22250738585072014E~307, 0.123) = false == (~0.22250738585072014E~307, 0.123) = false ?= (~0.22250738585072014E~307, 0.123) = false < (~0.22250738585072014E~307, 0.123E~2) = true > (~0.22250738585072014E~307, 0.123E~2) = false == (~0.22250738585072014E~307, 0.123E~2) = false ?= (~0.22250738585072014E~307, 0.123E~2) = false < (~0.22250738585072014E~307, 0.22250738585072014E~307) = true > (~0.22250738585072014E~307, 0.22250738585072014E~307) = false == (~0.22250738585072014E~307, 0.22250738585072014E~307) = false ?= (~0.22250738585072014E~307, 0.22250738585072014E~307) = false < (~0.22250738585072014E~307, 0.11125369292536007E~307) = true > (~0.22250738585072014E~307, 0.11125369292536007E~307) = false == (~0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, 0.11125369292536007E~307) = false < (~0.22250738585072014E~307, 0.5E~323) = true > (~0.22250738585072014E~307, 0.5E~323) = false == (~0.22250738585072014E~307, 0.5E~323) = false ?= (~0.22250738585072014E~307, 0.5E~323) = false < (~0.22250738585072014E~307, 0.0) = true > (~0.22250738585072014E~307, 0.0) = false == (~0.22250738585072014E~307, 0.0) = false ?= (~0.22250738585072014E~307, 0.0) = false < (~0.22250738585072014E~307, ~0.17976931348623157E309) = false > (~0.22250738585072014E~307, ~0.17976931348623157E309) = true == (~0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, ~0.17976931348623157E309) = false < (~0.22250738585072014E~307, ~0.8988465674311579E308) = false > (~0.22250738585072014E~307, ~0.8988465674311579E308) = true == (~0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, ~0.8988465674311579E308) = false < (~0.22250738585072014E~307, ~0.123E4) = false > (~0.22250738585072014E~307, ~0.123E4) = true == (~0.22250738585072014E~307, ~0.123E4) = false ?= (~0.22250738585072014E~307, ~0.123E4) = false < (~0.22250738585072014E~307, ~0.123E2) = false > (~0.22250738585072014E~307, ~0.123E2) = true == (~0.22250738585072014E~307, ~0.123E2) = false ?= (~0.22250738585072014E~307, ~0.123E2) = false < (~0.22250738585072014E~307, ~0.3141592653589793E1) = false > (~0.22250738585072014E~307, ~0.3141592653589793E1) = true == (~0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, ~0.3141592653589793E1) = false < (~0.22250738585072014E~307, ~0.2718281828459045E1) = false > (~0.22250738585072014E~307, ~0.2718281828459045E1) = true == (~0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, ~0.2718281828459045E1) = false < (~0.22250738585072014E~307, ~0.123E1) = false > (~0.22250738585072014E~307, ~0.123E1) = true == (~0.22250738585072014E~307, ~0.123E1) = false ?= (~0.22250738585072014E~307, ~0.123E1) = false < (~0.22250738585072014E~307, ~0.123) = false > (~0.22250738585072014E~307, ~0.123) = true == (~0.22250738585072014E~307, ~0.123) = false ?= (~0.22250738585072014E~307, ~0.123) = false < (~0.22250738585072014E~307, ~0.123E~2) = false > (~0.22250738585072014E~307, ~0.123E~2) = true == (~0.22250738585072014E~307, ~0.123E~2) = false ?= (~0.22250738585072014E~307, ~0.123E~2) = false < (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false == (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true ?= (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true < (~0.22250738585072014E~307, ~0.11125369292536007E~307) = true > (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false == (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (~0.22250738585072014E~307, ~0.5E~323) = true > (~0.22250738585072014E~307, ~0.5E~323) = false == (~0.22250738585072014E~307, ~0.5E~323) = false ?= (~0.22250738585072014E~307, ~0.5E~323) = false < (~0.22250738585072014E~307, ~0.0) = true > (~0.22250738585072014E~307, ~0.0) = false == (~0.22250738585072014E~307, ~0.0) = false ?= (~0.22250738585072014E~307, ~0.0) = false < (~0.11125369292536007E~307, 0.17976931348623157E309) = true > (~0.11125369292536007E~307, 0.17976931348623157E309) = false == (~0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, 0.17976931348623157E309) = false < (~0.11125369292536007E~307, 0.8988465674311579E308) = true > (~0.11125369292536007E~307, 0.8988465674311579E308) = false == (~0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, 0.8988465674311579E308) = false < (~0.11125369292536007E~307, 0.123E4) = true > (~0.11125369292536007E~307, 0.123E4) = false == (~0.11125369292536007E~307, 0.123E4) = false ?= (~0.11125369292536007E~307, 0.123E4) = false < (~0.11125369292536007E~307, 0.123E2) = true > (~0.11125369292536007E~307, 0.123E2) = false == (~0.11125369292536007E~307, 0.123E2) = false ?= (~0.11125369292536007E~307, 0.123E2) = false < (~0.11125369292536007E~307, 0.3141592653589793E1) = true > (~0.11125369292536007E~307, 0.3141592653589793E1) = false == (~0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, 0.3141592653589793E1) = false < (~0.11125369292536007E~307, 0.2718281828459045E1) = true > (~0.11125369292536007E~307, 0.2718281828459045E1) = false == (~0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, 0.2718281828459045E1) = false < (~0.11125369292536007E~307, 0.123E1) = true > (~0.11125369292536007E~307, 0.123E1) = false == (~0.11125369292536007E~307, 0.123E1) = false ?= (~0.11125369292536007E~307, 0.123E1) = false < (~0.11125369292536007E~307, 0.123) = true > (~0.11125369292536007E~307, 0.123) = false == (~0.11125369292536007E~307, 0.123) = false ?= (~0.11125369292536007E~307, 0.123) = false < (~0.11125369292536007E~307, 0.123E~2) = true > (~0.11125369292536007E~307, 0.123E~2) = false == (~0.11125369292536007E~307, 0.123E~2) = false ?= (~0.11125369292536007E~307, 0.123E~2) = false < (~0.11125369292536007E~307, 0.22250738585072014E~307) = true > (~0.11125369292536007E~307, 0.22250738585072014E~307) = false == (~0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, 0.22250738585072014E~307) = false < (~0.11125369292536007E~307, 0.11125369292536007E~307) = true > (~0.11125369292536007E~307, 0.11125369292536007E~307) = false == (~0.11125369292536007E~307, 0.11125369292536007E~307) = false ?= (~0.11125369292536007E~307, 0.11125369292536007E~307) = false < (~0.11125369292536007E~307, 0.5E~323) = true > (~0.11125369292536007E~307, 0.5E~323) = false == (~0.11125369292536007E~307, 0.5E~323) = false ?= (~0.11125369292536007E~307, 0.5E~323) = false < (~0.11125369292536007E~307, 0.0) = true > (~0.11125369292536007E~307, 0.0) = false == (~0.11125369292536007E~307, 0.0) = false ?= (~0.11125369292536007E~307, 0.0) = false < (~0.11125369292536007E~307, ~0.17976931348623157E309) = false > (~0.11125369292536007E~307, ~0.17976931348623157E309) = true == (~0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, ~0.17976931348623157E309) = false < (~0.11125369292536007E~307, ~0.8988465674311579E308) = false > (~0.11125369292536007E~307, ~0.8988465674311579E308) = true == (~0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, ~0.8988465674311579E308) = false < (~0.11125369292536007E~307, ~0.123E4) = false > (~0.11125369292536007E~307, ~0.123E4) = true == (~0.11125369292536007E~307, ~0.123E4) = false ?= (~0.11125369292536007E~307, ~0.123E4) = false < (~0.11125369292536007E~307, ~0.123E2) = false > (~0.11125369292536007E~307, ~0.123E2) = true == (~0.11125369292536007E~307, ~0.123E2) = false ?= (~0.11125369292536007E~307, ~0.123E2) = false < (~0.11125369292536007E~307, ~0.3141592653589793E1) = false > (~0.11125369292536007E~307, ~0.3141592653589793E1) = true == (~0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, ~0.3141592653589793E1) = false < (~0.11125369292536007E~307, ~0.2718281828459045E1) = false > (~0.11125369292536007E~307, ~0.2718281828459045E1) = true == (~0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, ~0.2718281828459045E1) = false < (~0.11125369292536007E~307, ~0.123E1) = false > (~0.11125369292536007E~307, ~0.123E1) = true == (~0.11125369292536007E~307, ~0.123E1) = false ?= (~0.11125369292536007E~307, ~0.123E1) = false < (~0.11125369292536007E~307, ~0.123) = false > (~0.11125369292536007E~307, ~0.123) = true == (~0.11125369292536007E~307, ~0.123) = false ?= (~0.11125369292536007E~307, ~0.123) = false < (~0.11125369292536007E~307, ~0.123E~2) = false > (~0.11125369292536007E~307, ~0.123E~2) = true == (~0.11125369292536007E~307, ~0.123E~2) = false ?= (~0.11125369292536007E~307, ~0.123E~2) = false < (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (~0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false == (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true ?= (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true < (~0.11125369292536007E~307, ~0.5E~323) = true > (~0.11125369292536007E~307, ~0.5E~323) = false == (~0.11125369292536007E~307, ~0.5E~323) = false ?= (~0.11125369292536007E~307, ~0.5E~323) = false < (~0.11125369292536007E~307, ~0.0) = true > (~0.11125369292536007E~307, ~0.0) = false == (~0.11125369292536007E~307, ~0.0) = false ?= (~0.11125369292536007E~307, ~0.0) = false < (~0.5E~323, 0.17976931348623157E309) = true > (~0.5E~323, 0.17976931348623157E309) = false == (~0.5E~323, 0.17976931348623157E309) = false ?= (~0.5E~323, 0.17976931348623157E309) = false < (~0.5E~323, 0.8988465674311579E308) = true > (~0.5E~323, 0.8988465674311579E308) = false == (~0.5E~323, 0.8988465674311579E308) = false ?= (~0.5E~323, 0.8988465674311579E308) = false < (~0.5E~323, 0.123E4) = true > (~0.5E~323, 0.123E4) = false == (~0.5E~323, 0.123E4) = false ?= (~0.5E~323, 0.123E4) = false < (~0.5E~323, 0.123E2) = true > (~0.5E~323, 0.123E2) = false == (~0.5E~323, 0.123E2) = false ?= (~0.5E~323, 0.123E2) = false < (~0.5E~323, 0.3141592653589793E1) = true > (~0.5E~323, 0.3141592653589793E1) = false == (~0.5E~323, 0.3141592653589793E1) = false ?= (~0.5E~323, 0.3141592653589793E1) = false < (~0.5E~323, 0.2718281828459045E1) = true > (~0.5E~323, 0.2718281828459045E1) = false == (~0.5E~323, 0.2718281828459045E1) = false ?= (~0.5E~323, 0.2718281828459045E1) = false < (~0.5E~323, 0.123E1) = true > (~0.5E~323, 0.123E1) = false == (~0.5E~323, 0.123E1) = false ?= (~0.5E~323, 0.123E1) = false < (~0.5E~323, 0.123) = true > (~0.5E~323, 0.123) = false == (~0.5E~323, 0.123) = false ?= (~0.5E~323, 0.123) = false < (~0.5E~323, 0.123E~2) = true > (~0.5E~323, 0.123E~2) = false == (~0.5E~323, 0.123E~2) = false ?= (~0.5E~323, 0.123E~2) = false < (~0.5E~323, 0.22250738585072014E~307) = true > (~0.5E~323, 0.22250738585072014E~307) = false == (~0.5E~323, 0.22250738585072014E~307) = false ?= (~0.5E~323, 0.22250738585072014E~307) = false < (~0.5E~323, 0.11125369292536007E~307) = true > (~0.5E~323, 0.11125369292536007E~307) = false == (~0.5E~323, 0.11125369292536007E~307) = false ?= (~0.5E~323, 0.11125369292536007E~307) = false < (~0.5E~323, 0.5E~323) = true > (~0.5E~323, 0.5E~323) = false == (~0.5E~323, 0.5E~323) = false ?= (~0.5E~323, 0.5E~323) = false < (~0.5E~323, 0.0) = true > (~0.5E~323, 0.0) = false == (~0.5E~323, 0.0) = false ?= (~0.5E~323, 0.0) = false < (~0.5E~323, ~0.17976931348623157E309) = false > (~0.5E~323, ~0.17976931348623157E309) = true == (~0.5E~323, ~0.17976931348623157E309) = false ?= (~0.5E~323, ~0.17976931348623157E309) = false < (~0.5E~323, ~0.8988465674311579E308) = false > (~0.5E~323, ~0.8988465674311579E308) = true == (~0.5E~323, ~0.8988465674311579E308) = false ?= (~0.5E~323, ~0.8988465674311579E308) = false < (~0.5E~323, ~0.123E4) = false > (~0.5E~323, ~0.123E4) = true == (~0.5E~323, ~0.123E4) = false ?= (~0.5E~323, ~0.123E4) = false < (~0.5E~323, ~0.123E2) = false > (~0.5E~323, ~0.123E2) = true == (~0.5E~323, ~0.123E2) = false ?= (~0.5E~323, ~0.123E2) = false < (~0.5E~323, ~0.3141592653589793E1) = false > (~0.5E~323, ~0.3141592653589793E1) = true == (~0.5E~323, ~0.3141592653589793E1) = false ?= (~0.5E~323, ~0.3141592653589793E1) = false < (~0.5E~323, ~0.2718281828459045E1) = false > (~0.5E~323, ~0.2718281828459045E1) = true == (~0.5E~323, ~0.2718281828459045E1) = false ?= (~0.5E~323, ~0.2718281828459045E1) = false < (~0.5E~323, ~0.123E1) = false > (~0.5E~323, ~0.123E1) = true == (~0.5E~323, ~0.123E1) = false ?= (~0.5E~323, ~0.123E1) = false < (~0.5E~323, ~0.123) = false > (~0.5E~323, ~0.123) = true == (~0.5E~323, ~0.123) = false ?= (~0.5E~323, ~0.123) = false < (~0.5E~323, ~0.123E~2) = false > (~0.5E~323, ~0.123E~2) = true == (~0.5E~323, ~0.123E~2) = false ?= (~0.5E~323, ~0.123E~2) = false < (~0.5E~323, ~0.22250738585072014E~307) = false > (~0.5E~323, ~0.22250738585072014E~307) = true == (~0.5E~323, ~0.22250738585072014E~307) = false ?= (~0.5E~323, ~0.22250738585072014E~307) = false < (~0.5E~323, ~0.11125369292536007E~307) = false > (~0.5E~323, ~0.11125369292536007E~307) = true == (~0.5E~323, ~0.11125369292536007E~307) = false ?= (~0.5E~323, ~0.11125369292536007E~307) = false < (~0.5E~323, ~0.5E~323) = false > (~0.5E~323, ~0.5E~323) = false == (~0.5E~323, ~0.5E~323) = true ?= (~0.5E~323, ~0.5E~323) = true < (~0.5E~323, ~0.0) = true > (~0.5E~323, ~0.0) = false == (~0.5E~323, ~0.0) = false ?= (~0.5E~323, ~0.0) = false < (~0.0, 0.17976931348623157E309) = true > (~0.0, 0.17976931348623157E309) = false == (~0.0, 0.17976931348623157E309) = false ?= (~0.0, 0.17976931348623157E309) = false < (~0.0, 0.8988465674311579E308) = true > (~0.0, 0.8988465674311579E308) = false == (~0.0, 0.8988465674311579E308) = false ?= (~0.0, 0.8988465674311579E308) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.3141592653589793E1) = true > (~0.0, 0.3141592653589793E1) = false == (~0.0, 0.3141592653589793E1) = false ?= (~0.0, 0.3141592653589793E1) = false < (~0.0, 0.2718281828459045E1) = true > (~0.0, 0.2718281828459045E1) = false == (~0.0, 0.2718281828459045E1) = false ?= (~0.0, 0.2718281828459045E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.22250738585072014E~307) = true > (~0.0, 0.22250738585072014E~307) = false == (~0.0, 0.22250738585072014E~307) = false ?= (~0.0, 0.22250738585072014E~307) = false < (~0.0, 0.11125369292536007E~307) = true > (~0.0, 0.11125369292536007E~307) = false == (~0.0, 0.11125369292536007E~307) = false ?= (~0.0, 0.11125369292536007E~307) = false < (~0.0, 0.5E~323) = true > (~0.0, 0.5E~323) = false == (~0.0, 0.5E~323) = false ?= (~0.0, 0.5E~323) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.17976931348623157E309) = false > (~0.0, ~0.17976931348623157E309) = true == (~0.0, ~0.17976931348623157E309) = false ?= (~0.0, ~0.17976931348623157E309) = false < (~0.0, ~0.8988465674311579E308) = false > (~0.0, ~0.8988465674311579E308) = true == (~0.0, ~0.8988465674311579E308) = false ?= (~0.0, ~0.8988465674311579E308) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.3141592653589793E1) = false > (~0.0, ~0.3141592653589793E1) = true == (~0.0, ~0.3141592653589793E1) = false ?= (~0.0, ~0.3141592653589793E1) = false < (~0.0, ~0.2718281828459045E1) = false > (~0.0, ~0.2718281828459045E1) = true == (~0.0, ~0.2718281828459045E1) = false ?= (~0.0, ~0.2718281828459045E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.22250738585072014E~307) = false > (~0.0, ~0.22250738585072014E~307) = true == (~0.0, ~0.22250738585072014E~307) = false ?= (~0.0, ~0.22250738585072014E~307) = false < (~0.0, ~0.11125369292536007E~307) = false > (~0.0, ~0.11125369292536007E~307) = true == (~0.0, ~0.11125369292536007E~307) = false ?= (~0.0, ~0.11125369292536007E~307) = false < (~0.0, ~0.5E~323) = false > (~0.0, ~0.5E~323) = true == (~0.0, ~0.5E~323) = false ?= (~0.0, ~0.5E~323) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compareReal (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compare (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, 0.123E4) = GREATER compareReal (0.17976931348623157E309, 0.123E4) = GREATER compare (0.17976931348623157E309, 0.123E2) = GREATER compareReal (0.17976931348623157E309, 0.123E2) = GREATER compare (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, 0.123E1) = GREATER compareReal (0.17976931348623157E309, 0.123E1) = GREATER compare (0.17976931348623157E309, 0.123) = GREATER compareReal (0.17976931348623157E309, 0.123) = GREATER compare (0.17976931348623157E309, 0.123E~2) = GREATER compareReal (0.17976931348623157E309, 0.123E~2) = GREATER compare (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, 0.5E~323) = GREATER compareReal (0.17976931348623157E309, 0.5E~323) = GREATER compare (0.17976931348623157E309, 0.0) = GREATER compareReal (0.17976931348623157E309, 0.0) = GREATER compare (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compareReal (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compare (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, ~0.123E4) = GREATER compareReal (0.17976931348623157E309, ~0.123E4) = GREATER compare (0.17976931348623157E309, ~0.123E2) = GREATER compareReal (0.17976931348623157E309, ~0.123E2) = GREATER compare (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, ~0.123E1) = GREATER compareReal (0.17976931348623157E309, ~0.123E1) = GREATER compare (0.17976931348623157E309, ~0.123) = GREATER compareReal (0.17976931348623157E309, ~0.123) = GREATER compare (0.17976931348623157E309, ~0.123E~2) = GREATER compareReal (0.17976931348623157E309, ~0.123E~2) = GREATER compare (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, ~0.5E~323) = GREATER compareReal (0.17976931348623157E309, ~0.5E~323) = GREATER compare (0.17976931348623157E309, ~0.0) = GREATER compareReal (0.17976931348623157E309, ~0.0) = GREATER compare (0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compareReal (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compare (0.8988465674311579E308, 0.123E4) = GREATER compareReal (0.8988465674311579E308, 0.123E4) = GREATER compare (0.8988465674311579E308, 0.123E2) = GREATER compareReal (0.8988465674311579E308, 0.123E2) = GREATER compare (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, 0.123E1) = GREATER compareReal (0.8988465674311579E308, 0.123E1) = GREATER compare (0.8988465674311579E308, 0.123) = GREATER compareReal (0.8988465674311579E308, 0.123) = GREATER compare (0.8988465674311579E308, 0.123E~2) = GREATER compareReal (0.8988465674311579E308, 0.123E~2) = GREATER compare (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, 0.5E~323) = GREATER compareReal (0.8988465674311579E308, 0.5E~323) = GREATER compare (0.8988465674311579E308, 0.0) = GREATER compareReal (0.8988465674311579E308, 0.0) = GREATER compare (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compareReal (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compare (0.8988465674311579E308, ~0.123E4) = GREATER compareReal (0.8988465674311579E308, ~0.123E4) = GREATER compare (0.8988465674311579E308, ~0.123E2) = GREATER compareReal (0.8988465674311579E308, ~0.123E2) = GREATER compare (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, ~0.123E1) = GREATER compareReal (0.8988465674311579E308, ~0.123E1) = GREATER compare (0.8988465674311579E308, ~0.123) = GREATER compareReal (0.8988465674311579E308, ~0.123) = GREATER compare (0.8988465674311579E308, ~0.123E~2) = GREATER compareReal (0.8988465674311579E308, ~0.123E~2) = GREATER compare (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, ~0.5E~323) = GREATER compareReal (0.8988465674311579E308, ~0.5E~323) = GREATER compare (0.8988465674311579E308, ~0.0) = GREATER compareReal (0.8988465674311579E308, ~0.0) = GREATER compare (0.123E4, 0.17976931348623157E309) = LESS compareReal (0.123E4, 0.17976931348623157E309) = LESS compare (0.123E4, 0.8988465674311579E308) = LESS compareReal (0.123E4, 0.8988465674311579E308) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.3141592653589793E1) = GREATER compareReal (0.123E4, 0.3141592653589793E1) = GREATER compare (0.123E4, 0.2718281828459045E1) = GREATER compareReal (0.123E4, 0.2718281828459045E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.22250738585072014E~307) = GREATER compareReal (0.123E4, 0.22250738585072014E~307) = GREATER compare (0.123E4, 0.11125369292536007E~307) = GREATER compareReal (0.123E4, 0.11125369292536007E~307) = GREATER compare (0.123E4, 0.5E~323) = GREATER compareReal (0.123E4, 0.5E~323) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.17976931348623157E309) = GREATER compareReal (0.123E4, ~0.17976931348623157E309) = GREATER compare (0.123E4, ~0.8988465674311579E308) = GREATER compareReal (0.123E4, ~0.8988465674311579E308) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.3141592653589793E1) = GREATER compareReal (0.123E4, ~0.3141592653589793E1) = GREATER compare (0.123E4, ~0.2718281828459045E1) = GREATER compareReal (0.123E4, ~0.2718281828459045E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.22250738585072014E~307) = GREATER compareReal (0.123E4, ~0.22250738585072014E~307) = GREATER compare (0.123E4, ~0.11125369292536007E~307) = GREATER compareReal (0.123E4, ~0.11125369292536007E~307) = GREATER compare (0.123E4, ~0.5E~323) = GREATER compareReal (0.123E4, ~0.5E~323) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.17976931348623157E309) = LESS compareReal (0.123E2, 0.17976931348623157E309) = LESS compare (0.123E2, 0.8988465674311579E308) = LESS compareReal (0.123E2, 0.8988465674311579E308) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.3141592653589793E1) = GREATER compareReal (0.123E2, 0.3141592653589793E1) = GREATER compare (0.123E2, 0.2718281828459045E1) = GREATER compareReal (0.123E2, 0.2718281828459045E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.22250738585072014E~307) = GREATER compareReal (0.123E2, 0.22250738585072014E~307) = GREATER compare (0.123E2, 0.11125369292536007E~307) = GREATER compareReal (0.123E2, 0.11125369292536007E~307) = GREATER compare (0.123E2, 0.5E~323) = GREATER compareReal (0.123E2, 0.5E~323) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.17976931348623157E309) = GREATER compareReal (0.123E2, ~0.17976931348623157E309) = GREATER compare (0.123E2, ~0.8988465674311579E308) = GREATER compareReal (0.123E2, ~0.8988465674311579E308) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.3141592653589793E1) = GREATER compareReal (0.123E2, ~0.3141592653589793E1) = GREATER compare (0.123E2, ~0.2718281828459045E1) = GREATER compareReal (0.123E2, ~0.2718281828459045E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E2, ~0.22250738585072014E~307) = GREATER compare (0.123E2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E2, ~0.11125369292536007E~307) = GREATER compare (0.123E2, ~0.5E~323) = GREATER compareReal (0.123E2, ~0.5E~323) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (0.3141592653589793E1, 0.123E4) = LESS compareReal (0.3141592653589793E1, 0.123E4) = LESS compare (0.3141592653589793E1, 0.123E2) = LESS compareReal (0.3141592653589793E1, 0.123E2) = LESS compare (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compareReal (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compare (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, 0.123E1) = GREATER compareReal (0.3141592653589793E1, 0.123E1) = GREATER compare (0.3141592653589793E1, 0.123) = GREATER compareReal (0.3141592653589793E1, 0.123) = GREATER compare (0.3141592653589793E1, 0.123E~2) = GREATER compareReal (0.3141592653589793E1, 0.123E~2) = GREATER compare (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, 0.5E~323) = GREATER compareReal (0.3141592653589793E1, 0.5E~323) = GREATER compare (0.3141592653589793E1, 0.0) = GREATER compareReal (0.3141592653589793E1, 0.0) = GREATER compare (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (0.3141592653589793E1, ~0.123E4) = GREATER compareReal (0.3141592653589793E1, ~0.123E4) = GREATER compare (0.3141592653589793E1, ~0.123E2) = GREATER compareReal (0.3141592653589793E1, ~0.123E2) = GREATER compare (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compareReal (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compare (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, ~0.123E1) = GREATER compareReal (0.3141592653589793E1, ~0.123E1) = GREATER compare (0.3141592653589793E1, ~0.123) = GREATER compareReal (0.3141592653589793E1, ~0.123) = GREATER compare (0.3141592653589793E1, ~0.123E~2) = GREATER compareReal (0.3141592653589793E1, ~0.123E~2) = GREATER compare (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, ~0.5E~323) = GREATER compareReal (0.3141592653589793E1, ~0.5E~323) = GREATER compare (0.3141592653589793E1, ~0.0) = GREATER compareReal (0.3141592653589793E1, ~0.0) = GREATER compare (0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (0.2718281828459045E1, 0.123E4) = LESS compareReal (0.2718281828459045E1, 0.123E4) = LESS compare (0.2718281828459045E1, 0.123E2) = LESS compareReal (0.2718281828459045E1, 0.123E2) = LESS compare (0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compareReal (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compare (0.2718281828459045E1, 0.123E1) = GREATER compareReal (0.2718281828459045E1, 0.123E1) = GREATER compare (0.2718281828459045E1, 0.123) = GREATER compareReal (0.2718281828459045E1, 0.123) = GREATER compare (0.2718281828459045E1, 0.123E~2) = GREATER compareReal (0.2718281828459045E1, 0.123E~2) = GREATER compare (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, 0.5E~323) = GREATER compareReal (0.2718281828459045E1, 0.5E~323) = GREATER compare (0.2718281828459045E1, 0.0) = GREATER compareReal (0.2718281828459045E1, 0.0) = GREATER compare (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (0.2718281828459045E1, ~0.123E4) = GREATER compareReal (0.2718281828459045E1, ~0.123E4) = GREATER compare (0.2718281828459045E1, ~0.123E2) = GREATER compareReal (0.2718281828459045E1, ~0.123E2) = GREATER compare (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compareReal (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compare (0.2718281828459045E1, ~0.123E1) = GREATER compareReal (0.2718281828459045E1, ~0.123E1) = GREATER compare (0.2718281828459045E1, ~0.123) = GREATER compareReal (0.2718281828459045E1, ~0.123) = GREATER compare (0.2718281828459045E1, ~0.123E~2) = GREATER compareReal (0.2718281828459045E1, ~0.123E~2) = GREATER compare (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, ~0.5E~323) = GREATER compareReal (0.2718281828459045E1, ~0.5E~323) = GREATER compare (0.2718281828459045E1, ~0.0) = GREATER compareReal (0.2718281828459045E1, ~0.0) = GREATER compare (0.123E1, 0.17976931348623157E309) = LESS compareReal (0.123E1, 0.17976931348623157E309) = LESS compare (0.123E1, 0.8988465674311579E308) = LESS compareReal (0.123E1, 0.8988465674311579E308) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.3141592653589793E1) = LESS compareReal (0.123E1, 0.3141592653589793E1) = LESS compare (0.123E1, 0.2718281828459045E1) = LESS compareReal (0.123E1, 0.2718281828459045E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.22250738585072014E~307) = GREATER compareReal (0.123E1, 0.22250738585072014E~307) = GREATER compare (0.123E1, 0.11125369292536007E~307) = GREATER compareReal (0.123E1, 0.11125369292536007E~307) = GREATER compare (0.123E1, 0.5E~323) = GREATER compareReal (0.123E1, 0.5E~323) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.17976931348623157E309) = GREATER compareReal (0.123E1, ~0.17976931348623157E309) = GREATER compare (0.123E1, ~0.8988465674311579E308) = GREATER compareReal (0.123E1, ~0.8988465674311579E308) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.3141592653589793E1) = GREATER compareReal (0.123E1, ~0.3141592653589793E1) = GREATER compare (0.123E1, ~0.2718281828459045E1) = GREATER compareReal (0.123E1, ~0.2718281828459045E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.22250738585072014E~307) = GREATER compareReal (0.123E1, ~0.22250738585072014E~307) = GREATER compare (0.123E1, ~0.11125369292536007E~307) = GREATER compareReal (0.123E1, ~0.11125369292536007E~307) = GREATER compare (0.123E1, ~0.5E~323) = GREATER compareReal (0.123E1, ~0.5E~323) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.17976931348623157E309) = LESS compareReal (0.123, 0.17976931348623157E309) = LESS compare (0.123, 0.8988465674311579E308) = LESS compareReal (0.123, 0.8988465674311579E308) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.3141592653589793E1) = LESS compareReal (0.123, 0.3141592653589793E1) = LESS compare (0.123, 0.2718281828459045E1) = LESS compareReal (0.123, 0.2718281828459045E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.22250738585072014E~307) = GREATER compareReal (0.123, 0.22250738585072014E~307) = GREATER compare (0.123, 0.11125369292536007E~307) = GREATER compareReal (0.123, 0.11125369292536007E~307) = GREATER compare (0.123, 0.5E~323) = GREATER compareReal (0.123, 0.5E~323) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.17976931348623157E309) = GREATER compareReal (0.123, ~0.17976931348623157E309) = GREATER compare (0.123, ~0.8988465674311579E308) = GREATER compareReal (0.123, ~0.8988465674311579E308) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.3141592653589793E1) = GREATER compareReal (0.123, ~0.3141592653589793E1) = GREATER compare (0.123, ~0.2718281828459045E1) = GREATER compareReal (0.123, ~0.2718281828459045E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.22250738585072014E~307) = GREATER compareReal (0.123, ~0.22250738585072014E~307) = GREATER compare (0.123, ~0.11125369292536007E~307) = GREATER compareReal (0.123, ~0.11125369292536007E~307) = GREATER compare (0.123, ~0.5E~323) = GREATER compareReal (0.123, ~0.5E~323) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.17976931348623157E309) = LESS compareReal (0.123E~2, 0.17976931348623157E309) = LESS compare (0.123E~2, 0.8988465674311579E308) = LESS compareReal (0.123E~2, 0.8988465674311579E308) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.3141592653589793E1) = LESS compareReal (0.123E~2, 0.3141592653589793E1) = LESS compare (0.123E~2, 0.2718281828459045E1) = LESS compareReal (0.123E~2, 0.2718281828459045E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.22250738585072014E~307) = GREATER compareReal (0.123E~2, 0.22250738585072014E~307) = GREATER compare (0.123E~2, 0.11125369292536007E~307) = GREATER compareReal (0.123E~2, 0.11125369292536007E~307) = GREATER compare (0.123E~2, 0.5E~323) = GREATER compareReal (0.123E~2, 0.5E~323) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (0.123E~2, ~0.17976931348623157E309) = GREATER compare (0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (0.123E~2, ~0.8988465674311579E308) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (0.123E~2, ~0.3141592653589793E1) = GREATER compare (0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (0.123E~2, ~0.2718281828459045E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E~2, ~0.22250738585072014E~307) = GREATER compare (0.123E~2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E~2, ~0.11125369292536007E~307) = GREATER compare (0.123E~2, ~0.5E~323) = GREATER compareReal (0.123E~2, ~0.5E~323) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (0.22250738585072014E~307, 0.123E4) = LESS compareReal (0.22250738585072014E~307, 0.123E4) = LESS compare (0.22250738585072014E~307, 0.123E2) = LESS compareReal (0.22250738585072014E~307, 0.123E2) = LESS compare (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (0.22250738585072014E~307, 0.123E1) = LESS compareReal (0.22250738585072014E~307, 0.123E1) = LESS compare (0.22250738585072014E~307, 0.123) = LESS compareReal (0.22250738585072014E~307, 0.123) = LESS compare (0.22250738585072014E~307, 0.123E~2) = LESS compareReal (0.22250738585072014E~307, 0.123E~2) = LESS compare (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compareReal (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compare (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, 0.5E~323) = GREATER compareReal (0.22250738585072014E~307, 0.5E~323) = GREATER compare (0.22250738585072014E~307, 0.0) = GREATER compareReal (0.22250738585072014E~307, 0.0) = GREATER compare (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (0.22250738585072014E~307, ~0.123E4) = GREATER compare (0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E2) = GREATER compare (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (0.22250738585072014E~307, ~0.123E1) = GREATER compare (0.22250738585072014E~307, ~0.123) = GREATER compareReal (0.22250738585072014E~307, ~0.123) = GREATER compare (0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E~2) = GREATER compare (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compare (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, ~0.5E~323) = GREATER compareReal (0.22250738585072014E~307, ~0.5E~323) = GREATER compare (0.22250738585072014E~307, ~0.0) = GREATER compareReal (0.22250738585072014E~307, ~0.0) = GREATER compare (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (0.11125369292536007E~307, 0.123E4) = LESS compareReal (0.11125369292536007E~307, 0.123E4) = LESS compare (0.11125369292536007E~307, 0.123E2) = LESS compareReal (0.11125369292536007E~307, 0.123E2) = LESS compare (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (0.11125369292536007E~307, 0.123E1) = LESS compareReal (0.11125369292536007E~307, 0.123E1) = LESS compare (0.11125369292536007E~307, 0.123) = LESS compareReal (0.11125369292536007E~307, 0.123) = LESS compare (0.11125369292536007E~307, 0.123E~2) = LESS compareReal (0.11125369292536007E~307, 0.123E~2) = LESS compare (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compareReal (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compare (0.11125369292536007E~307, 0.5E~323) = GREATER compareReal (0.11125369292536007E~307, 0.5E~323) = GREATER compare (0.11125369292536007E~307, 0.0) = GREATER compareReal (0.11125369292536007E~307, 0.0) = GREATER compare (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (0.11125369292536007E~307, ~0.123E4) = GREATER compare (0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E2) = GREATER compare (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (0.11125369292536007E~307, ~0.123E1) = GREATER compare (0.11125369292536007E~307, ~0.123) = GREATER compareReal (0.11125369292536007E~307, ~0.123) = GREATER compare (0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E~2) = GREATER compare (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compare (0.11125369292536007E~307, ~0.5E~323) = GREATER compareReal (0.11125369292536007E~307, ~0.5E~323) = GREATER compare (0.11125369292536007E~307, ~0.0) = GREATER compareReal (0.11125369292536007E~307, ~0.0) = GREATER compare (0.5E~323, 0.17976931348623157E309) = LESS compareReal (0.5E~323, 0.17976931348623157E309) = LESS compare (0.5E~323, 0.8988465674311579E308) = LESS compareReal (0.5E~323, 0.8988465674311579E308) = LESS compare (0.5E~323, 0.123E4) = LESS compareReal (0.5E~323, 0.123E4) = LESS compare (0.5E~323, 0.123E2) = LESS compareReal (0.5E~323, 0.123E2) = LESS compare (0.5E~323, 0.3141592653589793E1) = LESS compareReal (0.5E~323, 0.3141592653589793E1) = LESS compare (0.5E~323, 0.2718281828459045E1) = LESS compareReal (0.5E~323, 0.2718281828459045E1) = LESS compare (0.5E~323, 0.123E1) = LESS compareReal (0.5E~323, 0.123E1) = LESS compare (0.5E~323, 0.123) = LESS compareReal (0.5E~323, 0.123) = LESS compare (0.5E~323, 0.123E~2) = LESS compareReal (0.5E~323, 0.123E~2) = LESS compare (0.5E~323, 0.22250738585072014E~307) = LESS compareReal (0.5E~323, 0.22250738585072014E~307) = LESS compare (0.5E~323, 0.11125369292536007E~307) = LESS compareReal (0.5E~323, 0.11125369292536007E~307) = LESS compare (0.5E~323, 0.5E~323) = EQUAL compareReal (0.5E~323, 0.5E~323) = EQUAL compare (0.5E~323, 0.0) = GREATER compareReal (0.5E~323, 0.0) = GREATER compare (0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (0.5E~323, ~0.17976931348623157E309) = GREATER compare (0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (0.5E~323, ~0.8988465674311579E308) = GREATER compare (0.5E~323, ~0.123E4) = GREATER compareReal (0.5E~323, ~0.123E4) = GREATER compare (0.5E~323, ~0.123E2) = GREATER compareReal (0.5E~323, ~0.123E2) = GREATER compare (0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (0.5E~323, ~0.3141592653589793E1) = GREATER compare (0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (0.5E~323, ~0.2718281828459045E1) = GREATER compare (0.5E~323, ~0.123E1) = GREATER compareReal (0.5E~323, ~0.123E1) = GREATER compare (0.5E~323, ~0.123) = GREATER compareReal (0.5E~323, ~0.123) = GREATER compare (0.5E~323, ~0.123E~2) = GREATER compareReal (0.5E~323, ~0.123E~2) = GREATER compare (0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (0.5E~323, ~0.22250738585072014E~307) = GREATER compare (0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (0.5E~323, ~0.11125369292536007E~307) = GREATER compare (0.5E~323, ~0.5E~323) = GREATER compareReal (0.5E~323, ~0.5E~323) = GREATER compare (0.5E~323, ~0.0) = GREATER compareReal (0.5E~323, ~0.0) = GREATER compare (0.0, 0.17976931348623157E309) = LESS compareReal (0.0, 0.17976931348623157E309) = LESS compare (0.0, 0.8988465674311579E308) = LESS compareReal (0.0, 0.8988465674311579E308) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.3141592653589793E1) = LESS compareReal (0.0, 0.3141592653589793E1) = LESS compare (0.0, 0.2718281828459045E1) = LESS compareReal (0.0, 0.2718281828459045E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.22250738585072014E~307) = LESS compareReal (0.0, 0.22250738585072014E~307) = LESS compare (0.0, 0.11125369292536007E~307) = LESS compareReal (0.0, 0.11125369292536007E~307) = LESS compare (0.0, 0.5E~323) = LESS compareReal (0.0, 0.5E~323) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.17976931348623157E309) = GREATER compareReal (0.0, ~0.17976931348623157E309) = GREATER compare (0.0, ~0.8988465674311579E308) = GREATER compareReal (0.0, ~0.8988465674311579E308) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.3141592653589793E1) = GREATER compareReal (0.0, ~0.3141592653589793E1) = GREATER compare (0.0, ~0.2718281828459045E1) = GREATER compareReal (0.0, ~0.2718281828459045E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.22250738585072014E~307) = GREATER compareReal (0.0, ~0.22250738585072014E~307) = GREATER compare (0.0, ~0.11125369292536007E~307) = GREATER compareReal (0.0, ~0.11125369292536007E~307) = GREATER compare (0.0, ~0.5E~323) = GREATER compareReal (0.0, ~0.5E~323) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compareReal (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compare (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, 0.123E4) = LESS compareReal (~0.17976931348623157E309, 0.123E4) = LESS compare (~0.17976931348623157E309, 0.123E2) = LESS compareReal (~0.17976931348623157E309, 0.123E2) = LESS compare (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, 0.123E1) = LESS compareReal (~0.17976931348623157E309, 0.123E1) = LESS compare (~0.17976931348623157E309, 0.123) = LESS compareReal (~0.17976931348623157E309, 0.123) = LESS compare (~0.17976931348623157E309, 0.123E~2) = LESS compareReal (~0.17976931348623157E309, 0.123E~2) = LESS compare (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, 0.5E~323) = LESS compareReal (~0.17976931348623157E309, 0.5E~323) = LESS compare (~0.17976931348623157E309, 0.0) = LESS compareReal (~0.17976931348623157E309, 0.0) = LESS compare (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compareReal (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compare (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, ~0.123E4) = LESS compareReal (~0.17976931348623157E309, ~0.123E4) = LESS compare (~0.17976931348623157E309, ~0.123E2) = LESS compareReal (~0.17976931348623157E309, ~0.123E2) = LESS compare (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, ~0.123E1) = LESS compareReal (~0.17976931348623157E309, ~0.123E1) = LESS compare (~0.17976931348623157E309, ~0.123) = LESS compareReal (~0.17976931348623157E309, ~0.123) = LESS compare (~0.17976931348623157E309, ~0.123E~2) = LESS compareReal (~0.17976931348623157E309, ~0.123E~2) = LESS compare (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, ~0.5E~323) = LESS compareReal (~0.17976931348623157E309, ~0.5E~323) = LESS compare (~0.17976931348623157E309, ~0.0) = LESS compareReal (~0.17976931348623157E309, ~0.0) = LESS compare (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compareReal (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compare (~0.8988465674311579E308, 0.123E4) = LESS compareReal (~0.8988465674311579E308, 0.123E4) = LESS compare (~0.8988465674311579E308, 0.123E2) = LESS compareReal (~0.8988465674311579E308, 0.123E2) = LESS compare (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, 0.123E1) = LESS compareReal (~0.8988465674311579E308, 0.123E1) = LESS compare (~0.8988465674311579E308, 0.123) = LESS compareReal (~0.8988465674311579E308, 0.123) = LESS compare (~0.8988465674311579E308, 0.123E~2) = LESS compareReal (~0.8988465674311579E308, 0.123E~2) = LESS compare (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, 0.5E~323) = LESS compareReal (~0.8988465674311579E308, 0.5E~323) = LESS compare (~0.8988465674311579E308, 0.0) = LESS compareReal (~0.8988465674311579E308, 0.0) = LESS compare (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compareReal (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compare (~0.8988465674311579E308, ~0.123E4) = LESS compareReal (~0.8988465674311579E308, ~0.123E4) = LESS compare (~0.8988465674311579E308, ~0.123E2) = LESS compareReal (~0.8988465674311579E308, ~0.123E2) = LESS compare (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, ~0.123E1) = LESS compareReal (~0.8988465674311579E308, ~0.123E1) = LESS compare (~0.8988465674311579E308, ~0.123) = LESS compareReal (~0.8988465674311579E308, ~0.123) = LESS compare (~0.8988465674311579E308, ~0.123E~2) = LESS compareReal (~0.8988465674311579E308, ~0.123E~2) = LESS compare (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, ~0.5E~323) = LESS compareReal (~0.8988465674311579E308, ~0.5E~323) = LESS compare (~0.8988465674311579E308, ~0.0) = LESS compareReal (~0.8988465674311579E308, ~0.0) = LESS compare (~0.123E4, 0.17976931348623157E309) = LESS compareReal (~0.123E4, 0.17976931348623157E309) = LESS compare (~0.123E4, 0.8988465674311579E308) = LESS compareReal (~0.123E4, 0.8988465674311579E308) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.3141592653589793E1) = LESS compareReal (~0.123E4, 0.3141592653589793E1) = LESS compare (~0.123E4, 0.2718281828459045E1) = LESS compareReal (~0.123E4, 0.2718281828459045E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.22250738585072014E~307) = LESS compareReal (~0.123E4, 0.22250738585072014E~307) = LESS compare (~0.123E4, 0.11125369292536007E~307) = LESS compareReal (~0.123E4, 0.11125369292536007E~307) = LESS compare (~0.123E4, 0.5E~323) = LESS compareReal (~0.123E4, 0.5E~323) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.17976931348623157E309) = GREATER compareReal (~0.123E4, ~0.17976931348623157E309) = GREATER compare (~0.123E4, ~0.8988465674311579E308) = GREATER compareReal (~0.123E4, ~0.8988465674311579E308) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.3141592653589793E1) = LESS compareReal (~0.123E4, ~0.3141592653589793E1) = LESS compare (~0.123E4, ~0.2718281828459045E1) = LESS compareReal (~0.123E4, ~0.2718281828459045E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.22250738585072014E~307) = LESS compareReal (~0.123E4, ~0.22250738585072014E~307) = LESS compare (~0.123E4, ~0.11125369292536007E~307) = LESS compareReal (~0.123E4, ~0.11125369292536007E~307) = LESS compare (~0.123E4, ~0.5E~323) = LESS compareReal (~0.123E4, ~0.5E~323) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.17976931348623157E309) = LESS compareReal (~0.123E2, 0.17976931348623157E309) = LESS compare (~0.123E2, 0.8988465674311579E308) = LESS compareReal (~0.123E2, 0.8988465674311579E308) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.3141592653589793E1) = LESS compareReal (~0.123E2, 0.3141592653589793E1) = LESS compare (~0.123E2, 0.2718281828459045E1) = LESS compareReal (~0.123E2, 0.2718281828459045E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.22250738585072014E~307) = LESS compareReal (~0.123E2, 0.22250738585072014E~307) = LESS compare (~0.123E2, 0.11125369292536007E~307) = LESS compareReal (~0.123E2, 0.11125369292536007E~307) = LESS compare (~0.123E2, 0.5E~323) = LESS compareReal (~0.123E2, 0.5E~323) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E2, ~0.17976931348623157E309) = GREATER compare (~0.123E2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E2, ~0.8988465674311579E308) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.3141592653589793E1) = LESS compareReal (~0.123E2, ~0.3141592653589793E1) = LESS compare (~0.123E2, ~0.2718281828459045E1) = LESS compareReal (~0.123E2, ~0.2718281828459045E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E2, ~0.22250738585072014E~307) = LESS compare (~0.123E2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E2, ~0.11125369292536007E~307) = LESS compare (~0.123E2, ~0.5E~323) = LESS compareReal (~0.123E2, ~0.5E~323) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (~0.3141592653589793E1, 0.123E4) = LESS compareReal (~0.3141592653589793E1, 0.123E4) = LESS compare (~0.3141592653589793E1, 0.123E2) = LESS compareReal (~0.3141592653589793E1, 0.123E2) = LESS compare (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compareReal (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compare (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, 0.123E1) = LESS compareReal (~0.3141592653589793E1, 0.123E1) = LESS compare (~0.3141592653589793E1, 0.123) = LESS compareReal (~0.3141592653589793E1, 0.123) = LESS compare (~0.3141592653589793E1, 0.123E~2) = LESS compareReal (~0.3141592653589793E1, 0.123E~2) = LESS compare (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, 0.5E~323) = LESS compareReal (~0.3141592653589793E1, 0.5E~323) = LESS compare (~0.3141592653589793E1, 0.0) = LESS compareReal (~0.3141592653589793E1, 0.0) = LESS compare (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (~0.3141592653589793E1, ~0.123E4) = GREATER compareReal (~0.3141592653589793E1, ~0.123E4) = GREATER compare (~0.3141592653589793E1, ~0.123E2) = GREATER compareReal (~0.3141592653589793E1, ~0.123E2) = GREATER compare (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compareReal (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compare (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, ~0.123E1) = LESS compareReal (~0.3141592653589793E1, ~0.123E1) = LESS compare (~0.3141592653589793E1, ~0.123) = LESS compareReal (~0.3141592653589793E1, ~0.123) = LESS compare (~0.3141592653589793E1, ~0.123E~2) = LESS compareReal (~0.3141592653589793E1, ~0.123E~2) = LESS compare (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, ~0.5E~323) = LESS compareReal (~0.3141592653589793E1, ~0.5E~323) = LESS compare (~0.3141592653589793E1, ~0.0) = LESS compareReal (~0.3141592653589793E1, ~0.0) = LESS compare (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (~0.2718281828459045E1, 0.123E4) = LESS compareReal (~0.2718281828459045E1, 0.123E4) = LESS compare (~0.2718281828459045E1, 0.123E2) = LESS compareReal (~0.2718281828459045E1, 0.123E2) = LESS compare (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compareReal (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compare (~0.2718281828459045E1, 0.123E1) = LESS compareReal (~0.2718281828459045E1, 0.123E1) = LESS compare (~0.2718281828459045E1, 0.123) = LESS compareReal (~0.2718281828459045E1, 0.123) = LESS compare (~0.2718281828459045E1, 0.123E~2) = LESS compareReal (~0.2718281828459045E1, 0.123E~2) = LESS compare (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, 0.5E~323) = LESS compareReal (~0.2718281828459045E1, 0.5E~323) = LESS compare (~0.2718281828459045E1, 0.0) = LESS compareReal (~0.2718281828459045E1, 0.0) = LESS compare (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (~0.2718281828459045E1, ~0.123E4) = GREATER compareReal (~0.2718281828459045E1, ~0.123E4) = GREATER compare (~0.2718281828459045E1, ~0.123E2) = GREATER compareReal (~0.2718281828459045E1, ~0.123E2) = GREATER compare (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compareReal (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compare (~0.2718281828459045E1, ~0.123E1) = LESS compareReal (~0.2718281828459045E1, ~0.123E1) = LESS compare (~0.2718281828459045E1, ~0.123) = LESS compareReal (~0.2718281828459045E1, ~0.123) = LESS compare (~0.2718281828459045E1, ~0.123E~2) = LESS compareReal (~0.2718281828459045E1, ~0.123E~2) = LESS compare (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, ~0.5E~323) = LESS compareReal (~0.2718281828459045E1, ~0.5E~323) = LESS compare (~0.2718281828459045E1, ~0.0) = LESS compareReal (~0.2718281828459045E1, ~0.0) = LESS compare (~0.123E1, 0.17976931348623157E309) = LESS compareReal (~0.123E1, 0.17976931348623157E309) = LESS compare (~0.123E1, 0.8988465674311579E308) = LESS compareReal (~0.123E1, 0.8988465674311579E308) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.3141592653589793E1) = LESS compareReal (~0.123E1, 0.3141592653589793E1) = LESS compare (~0.123E1, 0.2718281828459045E1) = LESS compareReal (~0.123E1, 0.2718281828459045E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.22250738585072014E~307) = LESS compareReal (~0.123E1, 0.22250738585072014E~307) = LESS compare (~0.123E1, 0.11125369292536007E~307) = LESS compareReal (~0.123E1, 0.11125369292536007E~307) = LESS compare (~0.123E1, 0.5E~323) = LESS compareReal (~0.123E1, 0.5E~323) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.17976931348623157E309) = GREATER compareReal (~0.123E1, ~0.17976931348623157E309) = GREATER compare (~0.123E1, ~0.8988465674311579E308) = GREATER compareReal (~0.123E1, ~0.8988465674311579E308) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.3141592653589793E1) = GREATER compareReal (~0.123E1, ~0.3141592653589793E1) = GREATER compare (~0.123E1, ~0.2718281828459045E1) = GREATER compareReal (~0.123E1, ~0.2718281828459045E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.22250738585072014E~307) = LESS compareReal (~0.123E1, ~0.22250738585072014E~307) = LESS compare (~0.123E1, ~0.11125369292536007E~307) = LESS compareReal (~0.123E1, ~0.11125369292536007E~307) = LESS compare (~0.123E1, ~0.5E~323) = LESS compareReal (~0.123E1, ~0.5E~323) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.17976931348623157E309) = LESS compareReal (~0.123, 0.17976931348623157E309) = LESS compare (~0.123, 0.8988465674311579E308) = LESS compareReal (~0.123, 0.8988465674311579E308) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.3141592653589793E1) = LESS compareReal (~0.123, 0.3141592653589793E1) = LESS compare (~0.123, 0.2718281828459045E1) = LESS compareReal (~0.123, 0.2718281828459045E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.22250738585072014E~307) = LESS compareReal (~0.123, 0.22250738585072014E~307) = LESS compare (~0.123, 0.11125369292536007E~307) = LESS compareReal (~0.123, 0.11125369292536007E~307) = LESS compare (~0.123, 0.5E~323) = LESS compareReal (~0.123, 0.5E~323) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.17976931348623157E309) = GREATER compareReal (~0.123, ~0.17976931348623157E309) = GREATER compare (~0.123, ~0.8988465674311579E308) = GREATER compareReal (~0.123, ~0.8988465674311579E308) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.3141592653589793E1) = GREATER compareReal (~0.123, ~0.3141592653589793E1) = GREATER compare (~0.123, ~0.2718281828459045E1) = GREATER compareReal (~0.123, ~0.2718281828459045E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.22250738585072014E~307) = LESS compareReal (~0.123, ~0.22250738585072014E~307) = LESS compare (~0.123, ~0.11125369292536007E~307) = LESS compareReal (~0.123, ~0.11125369292536007E~307) = LESS compare (~0.123, ~0.5E~323) = LESS compareReal (~0.123, ~0.5E~323) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.17976931348623157E309) = LESS compareReal (~0.123E~2, 0.17976931348623157E309) = LESS compare (~0.123E~2, 0.8988465674311579E308) = LESS compareReal (~0.123E~2, 0.8988465674311579E308) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.3141592653589793E1) = LESS compareReal (~0.123E~2, 0.3141592653589793E1) = LESS compare (~0.123E~2, 0.2718281828459045E1) = LESS compareReal (~0.123E~2, 0.2718281828459045E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.22250738585072014E~307) = LESS compareReal (~0.123E~2, 0.22250738585072014E~307) = LESS compare (~0.123E~2, 0.11125369292536007E~307) = LESS compareReal (~0.123E~2, 0.11125369292536007E~307) = LESS compare (~0.123E~2, 0.5E~323) = LESS compareReal (~0.123E~2, 0.5E~323) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E~2, ~0.17976931348623157E309) = GREATER compare (~0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E~2, ~0.8988465674311579E308) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (~0.123E~2, ~0.3141592653589793E1) = GREATER compare (~0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (~0.123E~2, ~0.2718281828459045E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E~2, ~0.22250738585072014E~307) = LESS compare (~0.123E~2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E~2, ~0.11125369292536007E~307) = LESS compare (~0.123E~2, ~0.5E~323) = LESS compareReal (~0.123E~2, ~0.5E~323) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (~0.22250738585072014E~307, 0.123E4) = LESS compareReal (~0.22250738585072014E~307, 0.123E4) = LESS compare (~0.22250738585072014E~307, 0.123E2) = LESS compareReal (~0.22250738585072014E~307, 0.123E2) = LESS compare (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (~0.22250738585072014E~307, 0.123E1) = LESS compareReal (~0.22250738585072014E~307, 0.123E1) = LESS compare (~0.22250738585072014E~307, 0.123) = LESS compareReal (~0.22250738585072014E~307, 0.123) = LESS compare (~0.22250738585072014E~307, 0.123E~2) = LESS compareReal (~0.22250738585072014E~307, 0.123E~2) = LESS compare (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compareReal (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compare (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, 0.5E~323) = LESS compareReal (~0.22250738585072014E~307, 0.5E~323) = LESS compare (~0.22250738585072014E~307, 0.0) = LESS compareReal (~0.22250738585072014E~307, 0.0) = LESS compare (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (~0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E4) = GREATER compare (~0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E2) = GREATER compare (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (~0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E1) = GREATER compare (~0.22250738585072014E~307, ~0.123) = GREATER compareReal (~0.22250738585072014E~307, ~0.123) = GREATER compare (~0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E~2) = GREATER compare (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compareReal (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compare (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, ~0.5E~323) = LESS compareReal (~0.22250738585072014E~307, ~0.5E~323) = LESS compare (~0.22250738585072014E~307, ~0.0) = LESS compareReal (~0.22250738585072014E~307, ~0.0) = LESS compare (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (~0.11125369292536007E~307, 0.123E4) = LESS compareReal (~0.11125369292536007E~307, 0.123E4) = LESS compare (~0.11125369292536007E~307, 0.123E2) = LESS compareReal (~0.11125369292536007E~307, 0.123E2) = LESS compare (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (~0.11125369292536007E~307, 0.123E1) = LESS compareReal (~0.11125369292536007E~307, 0.123E1) = LESS compare (~0.11125369292536007E~307, 0.123) = LESS compareReal (~0.11125369292536007E~307, 0.123) = LESS compare (~0.11125369292536007E~307, 0.123E~2) = LESS compareReal (~0.11125369292536007E~307, 0.123E~2) = LESS compare (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compareReal (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compare (~0.11125369292536007E~307, 0.5E~323) = LESS compareReal (~0.11125369292536007E~307, 0.5E~323) = LESS compare (~0.11125369292536007E~307, 0.0) = LESS compareReal (~0.11125369292536007E~307, 0.0) = LESS compare (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (~0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E4) = GREATER compare (~0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E2) = GREATER compare (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (~0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E1) = GREATER compare (~0.11125369292536007E~307, ~0.123) = GREATER compareReal (~0.11125369292536007E~307, ~0.123) = GREATER compare (~0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E~2) = GREATER compare (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compareReal (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compare (~0.11125369292536007E~307, ~0.5E~323) = LESS compareReal (~0.11125369292536007E~307, ~0.5E~323) = LESS compare (~0.11125369292536007E~307, ~0.0) = LESS compareReal (~0.11125369292536007E~307, ~0.0) = LESS compare (~0.5E~323, 0.17976931348623157E309) = LESS compareReal (~0.5E~323, 0.17976931348623157E309) = LESS compare (~0.5E~323, 0.8988465674311579E308) = LESS compareReal (~0.5E~323, 0.8988465674311579E308) = LESS compare (~0.5E~323, 0.123E4) = LESS compareReal (~0.5E~323, 0.123E4) = LESS compare (~0.5E~323, 0.123E2) = LESS compareReal (~0.5E~323, 0.123E2) = LESS compare (~0.5E~323, 0.3141592653589793E1) = LESS compareReal (~0.5E~323, 0.3141592653589793E1) = LESS compare (~0.5E~323, 0.2718281828459045E1) = LESS compareReal (~0.5E~323, 0.2718281828459045E1) = LESS compare (~0.5E~323, 0.123E1) = LESS compareReal (~0.5E~323, 0.123E1) = LESS compare (~0.5E~323, 0.123) = LESS compareReal (~0.5E~323, 0.123) = LESS compare (~0.5E~323, 0.123E~2) = LESS compareReal (~0.5E~323, 0.123E~2) = LESS compare (~0.5E~323, 0.22250738585072014E~307) = LESS compareReal (~0.5E~323, 0.22250738585072014E~307) = LESS compare (~0.5E~323, 0.11125369292536007E~307) = LESS compareReal (~0.5E~323, 0.11125369292536007E~307) = LESS compare (~0.5E~323, 0.5E~323) = LESS compareReal (~0.5E~323, 0.5E~323) = LESS compare (~0.5E~323, 0.0) = LESS compareReal (~0.5E~323, 0.0) = LESS compare (~0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (~0.5E~323, ~0.17976931348623157E309) = GREATER compare (~0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (~0.5E~323, ~0.8988465674311579E308) = GREATER compare (~0.5E~323, ~0.123E4) = GREATER compareReal (~0.5E~323, ~0.123E4) = GREATER compare (~0.5E~323, ~0.123E2) = GREATER compareReal (~0.5E~323, ~0.123E2) = GREATER compare (~0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (~0.5E~323, ~0.3141592653589793E1) = GREATER compare (~0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (~0.5E~323, ~0.2718281828459045E1) = GREATER compare (~0.5E~323, ~0.123E1) = GREATER compareReal (~0.5E~323, ~0.123E1) = GREATER compare (~0.5E~323, ~0.123) = GREATER compareReal (~0.5E~323, ~0.123) = GREATER compare (~0.5E~323, ~0.123E~2) = GREATER compareReal (~0.5E~323, ~0.123E~2) = GREATER compare (~0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (~0.5E~323, ~0.22250738585072014E~307) = GREATER compare (~0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (~0.5E~323, ~0.11125369292536007E~307) = GREATER compare (~0.5E~323, ~0.5E~323) = EQUAL compareReal (~0.5E~323, ~0.5E~323) = EQUAL compare (~0.5E~323, ~0.0) = LESS compareReal (~0.5E~323, ~0.0) = LESS compare (~0.0, 0.17976931348623157E309) = LESS compareReal (~0.0, 0.17976931348623157E309) = LESS compare (~0.0, 0.8988465674311579E308) = LESS compareReal (~0.0, 0.8988465674311579E308) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.3141592653589793E1) = LESS compareReal (~0.0, 0.3141592653589793E1) = LESS compare (~0.0, 0.2718281828459045E1) = LESS compareReal (~0.0, 0.2718281828459045E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.22250738585072014E~307) = LESS compareReal (~0.0, 0.22250738585072014E~307) = LESS compare (~0.0, 0.11125369292536007E~307) = LESS compareReal (~0.0, 0.11125369292536007E~307) = LESS compare (~0.0, 0.5E~323) = LESS compareReal (~0.0, 0.5E~323) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.17976931348623157E309) = GREATER compareReal (~0.0, ~0.17976931348623157E309) = GREATER compare (~0.0, ~0.8988465674311579E308) = GREATER compareReal (~0.0, ~0.8988465674311579E308) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.3141592653589793E1) = GREATER compareReal (~0.0, ~0.3141592653589793E1) = GREATER compare (~0.0, ~0.2718281828459045E1) = GREATER compareReal (~0.0, ~0.2718281828459045E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.22250738585072014E~307) = GREATER compareReal (~0.0, ~0.22250738585072014E~307) = GREATER compare (~0.0, ~0.11125369292536007E~307) = GREATER compareReal (~0.0, ~0.11125369292536007E~307) = GREATER compare (~0.0, ~0.5E~323) = GREATER compareReal (~0.0, ~0.5E~323) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20210117+dfsg/regression/real.amd64-linux.ok000066400000000000000000041401551416264345000215450ustar00rootroot00000000000000 Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.34028235E39) = ~0.34028235E39 ~ (0.17014117E39) = ~0.17014117E39 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.31415927E1) = ~0.31415927E1 ~ (0.27182817E1) = ~0.27182817E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.11754944E~37) = ~0.11754944E~37 ~ (0.5877472E~38) = ~0.5877472E~38 ~ (0.1E~44) = ~0.1E~44 ~ (0.0) = ~0.0 ~ (~0.34028235E39) = 0.34028235E39 ~ (~0.17014117E39) = 0.17014117E39 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.31415927E1) = 0.31415927E1 ~ (~0.27182817E1) = 0.27182817E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.11754944E~37) = 0.11754944E~37 ~ (~0.5877472E~38) = 0.5877472E~38 ~ (~0.1E~44) = 0.1E~44 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.34028235E39, 0.34028235E39) = inf + (0.34028235E39, 0.34028235E39) = inf - (0.34028235E39, 0.34028235E39) = 0.0 / (0.34028235E39, 0.34028235E39) = 0.1E1 nextAfter (0.34028235E39, 0.34028235E39) = 0.34028235E39 rem (0.34028235E39, 0.34028235E39) = 0.0 * (0.34028235E39, 0.17014117E39) = inf + (0.34028235E39, 0.17014117E39) = inf - (0.34028235E39, 0.17014117E39) = 0.17014117E39 / (0.34028235E39, 0.17014117E39) = 0.2E1 nextAfter (0.34028235E39, 0.17014117E39) = 0.34028233E39 rem (0.34028235E39, 0.17014117E39) = 0.0 * (0.34028235E39, 0.123E4) = inf + (0.34028235E39, 0.123E4) = 0.34028235E39 - (0.34028235E39, 0.123E4) = 0.34028235E39 / (0.34028235E39, 0.123E4) = 0.2766523E36 nextAfter (0.34028235E39, 0.123E4) = 0.34028233E39 rem (0.34028235E39, 0.123E4) = 0.2028241E32 * (0.34028235E39, 0.123E2) = inf + (0.34028235E39, 0.123E2) = 0.34028235E39 - (0.34028235E39, 0.123E2) = 0.34028235E39 / (0.34028235E39, 0.123E2) = 0.27665232E38 nextAfter (0.34028235E39, 0.123E2) = 0.34028233E39 rem (0.34028235E39, 0.123E2) = ~inf * (0.34028235E39, 0.31415927E1) = inf + (0.34028235E39, 0.31415927E1) = 0.34028235E39 - (0.34028235E39, 0.31415927E1) = 0.34028235E39 / (0.34028235E39, 0.31415927E1) = 0.10831523E39 nextAfter (0.34028235E39, 0.31415927E1) = 0.34028233E39 rem (0.34028235E39, 0.31415927E1) = 0.2028241E32 * (0.34028235E39, 0.27182817E1) = inf + (0.34028235E39, 0.27182817E1) = 0.34028235E39 - (0.34028235E39, 0.27182817E1) = 0.34028235E39 / (0.34028235E39, 0.27182817E1) = 0.12518288E39 nextAfter (0.34028235E39, 0.27182817E1) = 0.34028233E39 rem (0.34028235E39, 0.27182817E1) = 0.0 * (0.34028235E39, 0.123E1) = inf + (0.34028235E39, 0.123E1) = 0.34028235E39 - (0.34028235E39, 0.123E1) = 0.34028235E39 / (0.34028235E39, 0.123E1) = 0.27665231E39 nextAfter (0.34028235E39, 0.123E1) = 0.34028233E39 rem (0.34028235E39, 0.123E1) = 0.0 * (0.34028235E39, 0.123) = 0.4185473E38 + (0.34028235E39, 0.123) = 0.34028235E39 - (0.34028235E39, 0.123) = 0.34028235E39 / (0.34028235E39, 0.123) = inf nextAfter (0.34028235E39, 0.123) = 0.34028233E39 rem (0.34028235E39, 0.123) = ~inf * (0.34028235E39, 0.123E~2) = 0.4185473E36 + (0.34028235E39, 0.123E~2) = 0.34028235E39 - (0.34028235E39, 0.123E~2) = 0.34028235E39 / (0.34028235E39, 0.123E~2) = inf nextAfter (0.34028235E39, 0.123E~2) = 0.34028233E39 rem (0.34028235E39, 0.123E~2) = ~inf * (0.34028235E39, 0.11754944E~37) = 0.39999998E1 + (0.34028235E39, 0.11754944E~37) = 0.34028235E39 - (0.34028235E39, 0.11754944E~37) = 0.34028235E39 / (0.34028235E39, 0.11754944E~37) = inf nextAfter (0.34028235E39, 0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, 0.11754944E~37) = ~inf * (0.34028235E39, 0.5877472E~38) = 0.19999999E1 + (0.34028235E39, 0.5877472E~38) = 0.34028235E39 - (0.34028235E39, 0.5877472E~38) = 0.34028235E39 / (0.34028235E39, 0.5877472E~38) = inf nextAfter (0.34028235E39, 0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, 0.5877472E~38) = ~inf * (0.34028235E39, 0.1E~44) = 0.47683713E~6 + (0.34028235E39, 0.1E~44) = 0.34028235E39 - (0.34028235E39, 0.1E~44) = 0.34028235E39 / (0.34028235E39, 0.1E~44) = inf nextAfter (0.34028235E39, 0.1E~44) = 0.34028233E39 rem (0.34028235E39, 0.1E~44) = ~inf * (0.34028235E39, 0.0) = 0.0 + (0.34028235E39, 0.0) = 0.34028235E39 - (0.34028235E39, 0.0) = 0.34028235E39 / (0.34028235E39, 0.0) = inf nextAfter (0.34028235E39, 0.0) = 0.34028233E39 rem (0.34028235E39, 0.0) = nan * (0.34028235E39, ~0.34028235E39) = ~inf + (0.34028235E39, ~0.34028235E39) = 0.0 - (0.34028235E39, ~0.34028235E39) = inf / (0.34028235E39, ~0.34028235E39) = ~0.1E1 nextAfter (0.34028235E39, ~0.34028235E39) = 0.34028233E39 rem (0.34028235E39, ~0.34028235E39) = 0.0 * (0.34028235E39, ~0.17014117E39) = ~inf + (0.34028235E39, ~0.17014117E39) = 0.17014117E39 - (0.34028235E39, ~0.17014117E39) = inf / (0.34028235E39, ~0.17014117E39) = ~0.2E1 nextAfter (0.34028235E39, ~0.17014117E39) = 0.34028233E39 rem (0.34028235E39, ~0.17014117E39) = 0.0 * (0.34028235E39, ~0.123E4) = ~inf + (0.34028235E39, ~0.123E4) = 0.34028235E39 - (0.34028235E39, ~0.123E4) = 0.34028235E39 / (0.34028235E39, ~0.123E4) = ~0.2766523E36 nextAfter (0.34028235E39, ~0.123E4) = 0.34028233E39 rem (0.34028235E39, ~0.123E4) = 0.2028241E32 * (0.34028235E39, ~0.123E2) = ~inf + (0.34028235E39, ~0.123E2) = 0.34028235E39 - (0.34028235E39, ~0.123E2) = 0.34028235E39 / (0.34028235E39, ~0.123E2) = ~0.27665232E38 nextAfter (0.34028235E39, ~0.123E2) = 0.34028233E39 rem (0.34028235E39, ~0.123E2) = ~inf * (0.34028235E39, ~0.31415927E1) = ~inf + (0.34028235E39, ~0.31415927E1) = 0.34028235E39 - (0.34028235E39, ~0.31415927E1) = 0.34028235E39 / (0.34028235E39, ~0.31415927E1) = ~0.10831523E39 nextAfter (0.34028235E39, ~0.31415927E1) = 0.34028233E39 rem (0.34028235E39, ~0.31415927E1) = 0.2028241E32 * (0.34028235E39, ~0.27182817E1) = ~inf + (0.34028235E39, ~0.27182817E1) = 0.34028235E39 - (0.34028235E39, ~0.27182817E1) = 0.34028235E39 / (0.34028235E39, ~0.27182817E1) = ~0.12518288E39 nextAfter (0.34028235E39, ~0.27182817E1) = 0.34028233E39 rem (0.34028235E39, ~0.27182817E1) = 0.0 * (0.34028235E39, ~0.123E1) = ~inf + (0.34028235E39, ~0.123E1) = 0.34028235E39 - (0.34028235E39, ~0.123E1) = 0.34028235E39 / (0.34028235E39, ~0.123E1) = ~0.27665231E39 nextAfter (0.34028235E39, ~0.123E1) = 0.34028233E39 rem (0.34028235E39, ~0.123E1) = 0.0 * (0.34028235E39, ~0.123) = ~0.4185473E38 + (0.34028235E39, ~0.123) = 0.34028235E39 - (0.34028235E39, ~0.123) = 0.34028235E39 / (0.34028235E39, ~0.123) = ~inf nextAfter (0.34028235E39, ~0.123) = 0.34028233E39 rem (0.34028235E39, ~0.123) = ~inf * (0.34028235E39, ~0.123E~2) = ~0.4185473E36 + (0.34028235E39, ~0.123E~2) = 0.34028235E39 - (0.34028235E39, ~0.123E~2) = 0.34028235E39 / (0.34028235E39, ~0.123E~2) = ~inf nextAfter (0.34028235E39, ~0.123E~2) = 0.34028233E39 rem (0.34028235E39, ~0.123E~2) = ~inf * (0.34028235E39, ~0.11754944E~37) = ~0.39999998E1 + (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 - (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 / (0.34028235E39, ~0.11754944E~37) = ~inf nextAfter (0.34028235E39, ~0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, ~0.11754944E~37) = ~inf * (0.34028235E39, ~0.5877472E~38) = ~0.19999999E1 + (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 - (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 / (0.34028235E39, ~0.5877472E~38) = ~inf nextAfter (0.34028235E39, ~0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, ~0.5877472E~38) = ~inf * (0.34028235E39, ~0.1E~44) = ~0.47683713E~6 + (0.34028235E39, ~0.1E~44) = 0.34028235E39 - (0.34028235E39, ~0.1E~44) = 0.34028235E39 / (0.34028235E39, ~0.1E~44) = ~inf nextAfter (0.34028235E39, ~0.1E~44) = 0.34028233E39 rem (0.34028235E39, ~0.1E~44) = ~inf * (0.34028235E39, ~0.0) = ~0.0 + (0.34028235E39, ~0.0) = 0.34028235E39 - (0.34028235E39, ~0.0) = 0.34028235E39 / (0.34028235E39, ~0.0) = ~inf nextAfter (0.34028235E39, ~0.0) = 0.34028233E39 rem (0.34028235E39, ~0.0) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.34028235E39, ~inf) = ~inf + (0.34028235E39, ~inf) = ~inf - (0.34028235E39, ~inf) = inf / (0.34028235E39, ~inf) = ~0.0 nextAfter (0.34028235E39, ~inf) = 0.34028233E39 rem (0.34028235E39, ~inf) = 0.34028235E39 * (0.34028235E39, nan) = nan + (0.34028235E39, nan) = nan - (0.34028235E39, nan) = nan / (0.34028235E39, nan) = nan nextAfter (0.34028235E39, nan) = nan rem (0.34028235E39, nan) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.17014117E39, 0.34028235E39) = inf + (0.17014117E39, 0.34028235E39) = inf - (0.17014117E39, 0.34028235E39) = ~0.17014117E39 / (0.17014117E39, 0.34028235E39) = 0.5 nextAfter (0.17014117E39, 0.34028235E39) = 0.17014118E39 rem (0.17014117E39, 0.34028235E39) = 0.17014117E39 * (0.17014117E39, 0.17014117E39) = inf + (0.17014117E39, 0.17014117E39) = 0.34028235E39 - (0.17014117E39, 0.17014117E39) = 0.0 / (0.17014117E39, 0.17014117E39) = 0.1E1 nextAfter (0.17014117E39, 0.17014117E39) = 0.17014117E39 rem (0.17014117E39, 0.17014117E39) = 0.0 * (0.17014117E39, 0.123E4) = inf + (0.17014117E39, 0.123E4) = 0.17014117E39 - (0.17014117E39, 0.123E4) = 0.17014117E39 / (0.17014117E39, 0.123E4) = 0.13832615E36 nextAfter (0.17014117E39, 0.123E4) = 0.17014116E39 rem (0.17014117E39, 0.123E4) = 0.10141205E32 * (0.17014117E39, 0.123E2) = inf + (0.17014117E39, 0.123E2) = 0.17014117E39 - (0.17014117E39, 0.123E2) = 0.17014117E39 / (0.17014117E39, 0.123E2) = 0.13832616E38 nextAfter (0.17014117E39, 0.123E2) = 0.17014116E39 rem (0.17014117E39, 0.123E2) = ~0.10141205E32 * (0.17014117E39, 0.31415927E1) = inf + (0.17014117E39, 0.31415927E1) = 0.17014117E39 - (0.17014117E39, 0.31415927E1) = 0.17014117E39 / (0.17014117E39, 0.31415927E1) = 0.54157613E38 nextAfter (0.17014117E39, 0.31415927E1) = 0.17014116E39 rem (0.17014117E39, 0.31415927E1) = 0.10141205E32 * (0.17014117E39, 0.27182817E1) = inf + (0.17014117E39, 0.27182817E1) = 0.17014117E39 - (0.17014117E39, 0.27182817E1) = 0.17014117E39 / (0.17014117E39, 0.27182817E1) = 0.6259144E38 nextAfter (0.17014117E39, 0.27182817E1) = 0.17014116E39 rem (0.17014117E39, 0.27182817E1) = 0.0 * (0.17014117E39, 0.123E1) = 0.20927364E39 + (0.17014117E39, 0.123E1) = 0.17014117E39 - (0.17014117E39, 0.123E1) = 0.17014117E39 / (0.17014117E39, 0.123E1) = 0.13832616E39 nextAfter (0.17014117E39, 0.123E1) = 0.17014116E39 rem (0.17014117E39, 0.123E1) = 0.0 * (0.17014117E39, 0.123) = 0.20927365E38 + (0.17014117E39, 0.123) = 0.17014117E39 - (0.17014117E39, 0.123) = 0.17014117E39 / (0.17014117E39, 0.123) = inf nextAfter (0.17014117E39, 0.123) = 0.17014116E39 rem (0.17014117E39, 0.123) = ~inf * (0.17014117E39, 0.123E~2) = 0.20927364E36 + (0.17014117E39, 0.123E~2) = 0.17014117E39 - (0.17014117E39, 0.123E~2) = 0.17014117E39 / (0.17014117E39, 0.123E~2) = inf nextAfter (0.17014117E39, 0.123E~2) = 0.17014116E39 rem (0.17014117E39, 0.123E~2) = ~inf * (0.17014117E39, 0.11754944E~37) = 0.19999999E1 + (0.17014117E39, 0.11754944E~37) = 0.17014117E39 - (0.17014117E39, 0.11754944E~37) = 0.17014117E39 / (0.17014117E39, 0.11754944E~37) = inf nextAfter (0.17014117E39, 0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, 0.11754944E~37) = ~inf * (0.17014117E39, 0.5877472E~38) = 0.99999994 + (0.17014117E39, 0.5877472E~38) = 0.17014117E39 - (0.17014117E39, 0.5877472E~38) = 0.17014117E39 / (0.17014117E39, 0.5877472E~38) = inf nextAfter (0.17014117E39, 0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, 0.5877472E~38) = ~inf * (0.17014117E39, 0.1E~44) = 0.23841856E~6 + (0.17014117E39, 0.1E~44) = 0.17014117E39 - (0.17014117E39, 0.1E~44) = 0.17014117E39 / (0.17014117E39, 0.1E~44) = inf nextAfter (0.17014117E39, 0.1E~44) = 0.17014116E39 rem (0.17014117E39, 0.1E~44) = ~inf * (0.17014117E39, 0.0) = 0.0 + (0.17014117E39, 0.0) = 0.17014117E39 - (0.17014117E39, 0.0) = 0.17014117E39 / (0.17014117E39, 0.0) = inf nextAfter (0.17014117E39, 0.0) = 0.17014116E39 rem (0.17014117E39, 0.0) = nan * (0.17014117E39, ~0.34028235E39) = ~inf + (0.17014117E39, ~0.34028235E39) = ~0.17014117E39 - (0.17014117E39, ~0.34028235E39) = inf / (0.17014117E39, ~0.34028235E39) = ~0.5 nextAfter (0.17014117E39, ~0.34028235E39) = 0.17014116E39 rem (0.17014117E39, ~0.34028235E39) = 0.17014117E39 * (0.17014117E39, ~0.17014117E39) = ~inf + (0.17014117E39, ~0.17014117E39) = 0.0 - (0.17014117E39, ~0.17014117E39) = 0.34028235E39 / (0.17014117E39, ~0.17014117E39) = ~0.1E1 nextAfter (0.17014117E39, ~0.17014117E39) = 0.17014116E39 rem (0.17014117E39, ~0.17014117E39) = 0.0 * (0.17014117E39, ~0.123E4) = ~inf + (0.17014117E39, ~0.123E4) = 0.17014117E39 - (0.17014117E39, ~0.123E4) = 0.17014117E39 / (0.17014117E39, ~0.123E4) = ~0.13832615E36 nextAfter (0.17014117E39, ~0.123E4) = 0.17014116E39 rem (0.17014117E39, ~0.123E4) = 0.10141205E32 * (0.17014117E39, ~0.123E2) = ~inf + (0.17014117E39, ~0.123E2) = 0.17014117E39 - (0.17014117E39, ~0.123E2) = 0.17014117E39 / (0.17014117E39, ~0.123E2) = ~0.13832616E38 nextAfter (0.17014117E39, ~0.123E2) = 0.17014116E39 rem (0.17014117E39, ~0.123E2) = ~0.10141205E32 * (0.17014117E39, ~0.31415927E1) = ~inf + (0.17014117E39, ~0.31415927E1) = 0.17014117E39 - (0.17014117E39, ~0.31415927E1) = 0.17014117E39 / (0.17014117E39, ~0.31415927E1) = ~0.54157613E38 nextAfter (0.17014117E39, ~0.31415927E1) = 0.17014116E39 rem (0.17014117E39, ~0.31415927E1) = 0.10141205E32 * (0.17014117E39, ~0.27182817E1) = ~inf + (0.17014117E39, ~0.27182817E1) = 0.17014117E39 - (0.17014117E39, ~0.27182817E1) = 0.17014117E39 / (0.17014117E39, ~0.27182817E1) = ~0.6259144E38 nextAfter (0.17014117E39, ~0.27182817E1) = 0.17014116E39 rem (0.17014117E39, ~0.27182817E1) = 0.0 * (0.17014117E39, ~0.123E1) = ~0.20927364E39 + (0.17014117E39, ~0.123E1) = 0.17014117E39 - (0.17014117E39, ~0.123E1) = 0.17014117E39 / (0.17014117E39, ~0.123E1) = ~0.13832616E39 nextAfter (0.17014117E39, ~0.123E1) = 0.17014116E39 rem (0.17014117E39, ~0.123E1) = 0.0 * (0.17014117E39, ~0.123) = ~0.20927365E38 + (0.17014117E39, ~0.123) = 0.17014117E39 - (0.17014117E39, ~0.123) = 0.17014117E39 / (0.17014117E39, ~0.123) = ~inf nextAfter (0.17014117E39, ~0.123) = 0.17014116E39 rem (0.17014117E39, ~0.123) = ~inf * (0.17014117E39, ~0.123E~2) = ~0.20927364E36 + (0.17014117E39, ~0.123E~2) = 0.17014117E39 - (0.17014117E39, ~0.123E~2) = 0.17014117E39 / (0.17014117E39, ~0.123E~2) = ~inf nextAfter (0.17014117E39, ~0.123E~2) = 0.17014116E39 rem (0.17014117E39, ~0.123E~2) = ~inf * (0.17014117E39, ~0.11754944E~37) = ~0.19999999E1 + (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 - (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 / (0.17014117E39, ~0.11754944E~37) = ~inf nextAfter (0.17014117E39, ~0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, ~0.11754944E~37) = ~inf * (0.17014117E39, ~0.5877472E~38) = ~0.99999994 + (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 - (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 / (0.17014117E39, ~0.5877472E~38) = ~inf nextAfter (0.17014117E39, ~0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, ~0.5877472E~38) = ~inf * (0.17014117E39, ~0.1E~44) = ~0.23841856E~6 + (0.17014117E39, ~0.1E~44) = 0.17014117E39 - (0.17014117E39, ~0.1E~44) = 0.17014117E39 / (0.17014117E39, ~0.1E~44) = ~inf nextAfter (0.17014117E39, ~0.1E~44) = 0.17014116E39 rem (0.17014117E39, ~0.1E~44) = ~inf * (0.17014117E39, ~0.0) = ~0.0 + (0.17014117E39, ~0.0) = 0.17014117E39 - (0.17014117E39, ~0.0) = 0.17014117E39 / (0.17014117E39, ~0.0) = ~inf nextAfter (0.17014117E39, ~0.0) = 0.17014116E39 rem (0.17014117E39, ~0.0) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.17014117E39, ~inf) = ~inf + (0.17014117E39, ~inf) = ~inf - (0.17014117E39, ~inf) = inf / (0.17014117E39, ~inf) = ~0.0 nextAfter (0.17014117E39, ~inf) = 0.17014116E39 rem (0.17014117E39, ~inf) = 0.17014117E39 * (0.17014117E39, nan) = nan + (0.17014117E39, nan) = nan - (0.17014117E39, nan) = nan / (0.17014117E39, nan) = nan nextAfter (0.17014117E39, nan) = nan rem (0.17014117E39, nan) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.123E4, 0.34028235E39) = inf + (0.123E4, 0.34028235E39) = 0.34028235E39 - (0.123E4, 0.34028235E39) = ~0.34028235E39 / (0.123E4, 0.34028235E39) = 0.36146455E~35 nextAfter (0.123E4, 0.34028235E39) = 0.12300001E4 rem (0.123E4, 0.34028235E39) = 0.123E4 * (0.123E4, 0.17014117E39) = inf + (0.123E4, 0.17014117E39) = 0.17014117E39 - (0.123E4, 0.17014117E39) = ~0.17014117E39 / (0.123E4, 0.17014117E39) = 0.7229291E~35 nextAfter (0.123E4, 0.17014117E39) = 0.12300001E4 rem (0.123E4, 0.17014117E39) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.31415927E1) = 0.38641592E4 + (0.123E4, 0.31415927E1) = 0.12331416E4 - (0.123E4, 0.31415927E1) = 0.12268584E4 / (0.123E4, 0.31415927E1) = 0.39152115E3 nextAfter (0.123E4, 0.31415927E1) = 0.12299999E4 rem (0.123E4, 0.31415927E1) = 0.1637207E1 * (0.123E4, 0.27182817E1) = 0.33434866E4 + (0.123E4, 0.27182817E1) = 0.12327183E4 - (0.123E4, 0.27182817E1) = 0.12272817E4 / (0.123E4, 0.27182817E1) = 0.45249173E3 nextAfter (0.123E4, 0.27182817E1) = 0.12299999E4 rem (0.123E4, 0.27182817E1) = 0.13366699E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129001E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129001E1 + (0.123E4, 0.123E~2) = 0.12300012E4 - (0.123E4, 0.123E~2) = 0.12299988E4 / (0.123E4, 0.123E~2) = 0.99999994E6 nextAfter (0.123E4, 0.123E~2) = 0.12299999E4 rem (0.123E4, 0.123E~2) = 0.12207031E~2 * (0.123E4, 0.11754944E~37) = 0.1445858E~34 + (0.123E4, 0.11754944E~37) = 0.123E4 - (0.123E4, 0.11754944E~37) = 0.123E4 / (0.123E4, 0.11754944E~37) = inf nextAfter (0.123E4, 0.11754944E~37) = 0.12299999E4 rem (0.123E4, 0.11754944E~37) = ~inf * (0.123E4, 0.5877472E~38) = 0.722929E~35 + (0.123E4, 0.5877472E~38) = 0.123E4 - (0.123E4, 0.5877472E~38) = 0.123E4 / (0.123E4, 0.5877472E~38) = inf nextAfter (0.123E4, 0.5877472E~38) = 0.12299999E4 rem (0.123E4, 0.5877472E~38) = ~inf * (0.123E4, 0.1E~44) = 0.1724E~41 + (0.123E4, 0.1E~44) = 0.123E4 - (0.123E4, 0.1E~44) = 0.123E4 / (0.123E4, 0.1E~44) = inf nextAfter (0.123E4, 0.1E~44) = 0.12299999E4 rem (0.123E4, 0.1E~44) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.34028235E39) = ~inf + (0.123E4, ~0.34028235E39) = ~0.34028235E39 - (0.123E4, ~0.34028235E39) = 0.34028235E39 / (0.123E4, ~0.34028235E39) = ~0.36146455E~35 nextAfter (0.123E4, ~0.34028235E39) = 0.12299999E4 rem (0.123E4, ~0.34028235E39) = 0.123E4 * (0.123E4, ~0.17014117E39) = ~inf + (0.123E4, ~0.17014117E39) = ~0.17014117E39 - (0.123E4, ~0.17014117E39) = 0.17014117E39 / (0.123E4, ~0.17014117E39) = ~0.7229291E~35 nextAfter (0.123E4, ~0.17014117E39) = 0.12299999E4 rem (0.123E4, ~0.17014117E39) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.31415927E1) = ~0.38641592E4 + (0.123E4, ~0.31415927E1) = 0.12268584E4 - (0.123E4, ~0.31415927E1) = 0.12331416E4 / (0.123E4, ~0.31415927E1) = ~0.39152115E3 nextAfter (0.123E4, ~0.31415927E1) = 0.12299999E4 rem (0.123E4, ~0.31415927E1) = 0.1637207E1 * (0.123E4, ~0.27182817E1) = ~0.33434866E4 + (0.123E4, ~0.27182817E1) = 0.12272817E4 - (0.123E4, ~0.27182817E1) = 0.12327183E4 / (0.123E4, ~0.27182817E1) = ~0.45249173E3 nextAfter (0.123E4, ~0.27182817E1) = 0.12299999E4 rem (0.123E4, ~0.27182817E1) = 0.13366699E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129001E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129001E1 + (0.123E4, ~0.123E~2) = 0.12299988E4 - (0.123E4, ~0.123E~2) = 0.12300012E4 / (0.123E4, ~0.123E~2) = ~0.99999994E6 nextAfter (0.123E4, ~0.123E~2) = 0.12299999E4 rem (0.123E4, ~0.123E~2) = 0.12207031E~2 * (0.123E4, ~0.11754944E~37) = ~0.1445858E~34 + (0.123E4, ~0.11754944E~37) = 0.123E4 - (0.123E4, ~0.11754944E~37) = 0.123E4 / (0.123E4, ~0.11754944E~37) = ~inf nextAfter (0.123E4, ~0.11754944E~37) = 0.12299999E4 rem (0.123E4, ~0.11754944E~37) = ~inf * (0.123E4, ~0.5877472E~38) = ~0.722929E~35 + (0.123E4, ~0.5877472E~38) = 0.123E4 - (0.123E4, ~0.5877472E~38) = 0.123E4 / (0.123E4, ~0.5877472E~38) = ~inf nextAfter (0.123E4, ~0.5877472E~38) = 0.12299999E4 rem (0.123E4, ~0.5877472E~38) = ~inf * (0.123E4, ~0.1E~44) = ~0.1724E~41 + (0.123E4, ~0.1E~44) = 0.123E4 - (0.123E4, ~0.1E~44) = 0.123E4 / (0.123E4, ~0.1E~44) = ~inf nextAfter (0.123E4, ~0.1E~44) = 0.12299999E4 rem (0.123E4, ~0.1E~44) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.34028235E39) = inf + (0.123E2, 0.34028235E39) = 0.34028235E39 - (0.123E2, 0.34028235E39) = ~0.34028235E39 / (0.123E2, 0.34028235E39) = 0.36146455E~37 nextAfter (0.123E2, 0.34028235E39) = 0.12300001E2 rem (0.123E2, 0.34028235E39) = 0.123E2 * (0.123E2, 0.17014117E39) = inf + (0.123E2, 0.17014117E39) = 0.17014117E39 - (0.123E2, 0.17014117E39) = ~0.17014117E39 / (0.123E2, 0.17014117E39) = 0.7229291E~37 nextAfter (0.123E2, 0.17014117E39) = 0.12300001E2 rem (0.123E2, 0.17014117E39) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300001E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129001E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.31415927E1) = 0.3864159E2 + (0.123E2, 0.31415927E1) = 0.15441593E2 - (0.123E2, 0.31415927E1) = 0.9158407E1 / (0.123E2, 0.31415927E1) = 0.39152114E1 nextAfter (0.123E2, 0.31415927E1) = 0.12299999E2 rem (0.123E2, 0.31415927E1) = 0.28752222E1 * (0.123E2, 0.27182817E1) = 0.33434868E2 + (0.123E2, 0.27182817E1) = 0.15018282E2 - (0.123E2, 0.27182817E1) = 0.9581718E1 / (0.123E2, 0.27182817E1) = 0.4524917E1 nextAfter (0.123E2, 0.27182817E1) = 0.12299999E2 rem (0.123E2, 0.27182817E1) = 0.14268732E1 * (0.123E2, 0.123E1) = 0.15129001E2 + (0.123E2, 0.123E1) = 0.13530001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177E2 / (0.123E2, 0.123) = 0.1E3 nextAfter (0.123E2, 0.123) = 0.12299999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129001E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.1229877E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999E2 rem (0.123E2, 0.123E~2) = 0.0 * (0.123E2, 0.11754944E~37) = 0.14458581E~36 + (0.123E2, 0.11754944E~37) = 0.123E2 - (0.123E2, 0.11754944E~37) = 0.123E2 / (0.123E2, 0.11754944E~37) = inf nextAfter (0.123E2, 0.11754944E~37) = 0.12299999E2 rem (0.123E2, 0.11754944E~37) = ~inf * (0.123E2, 0.5877472E~38) = 0.72292904E~37 + (0.123E2, 0.5877472E~38) = 0.123E2 - (0.123E2, 0.5877472E~38) = 0.123E2 / (0.123E2, 0.5877472E~38) = inf nextAfter (0.123E2, 0.5877472E~38) = 0.12299999E2 rem (0.123E2, 0.5877472E~38) = ~inf * (0.123E2, 0.1E~44) = 0.17E~43 + (0.123E2, 0.1E~44) = 0.123E2 - (0.123E2, 0.1E~44) = 0.123E2 / (0.123E2, 0.1E~44) = inf nextAfter (0.123E2, 0.1E~44) = 0.12299999E2 rem (0.123E2, 0.1E~44) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.34028235E39) = ~inf + (0.123E2, ~0.34028235E39) = ~0.34028235E39 - (0.123E2, ~0.34028235E39) = 0.34028235E39 / (0.123E2, ~0.34028235E39) = ~0.36146455E~37 nextAfter (0.123E2, ~0.34028235E39) = 0.12299999E2 rem (0.123E2, ~0.34028235E39) = 0.123E2 * (0.123E2, ~0.17014117E39) = ~inf + (0.123E2, ~0.17014117E39) = ~0.17014117E39 - (0.123E2, ~0.17014117E39) = 0.17014117E39 / (0.123E2, ~0.17014117E39) = ~0.7229291E~37 nextAfter (0.123E2, ~0.17014117E39) = 0.12299999E2 rem (0.123E2, ~0.17014117E39) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129001E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.31415927E1) = ~0.3864159E2 + (0.123E2, ~0.31415927E1) = 0.9158407E1 - (0.123E2, ~0.31415927E1) = 0.15441593E2 / (0.123E2, ~0.31415927E1) = ~0.39152114E1 nextAfter (0.123E2, ~0.31415927E1) = 0.12299999E2 rem (0.123E2, ~0.31415927E1) = 0.28752222E1 * (0.123E2, ~0.27182817E1) = ~0.33434868E2 + (0.123E2, ~0.27182817E1) = 0.9581718E1 - (0.123E2, ~0.27182817E1) = 0.15018282E2 / (0.123E2, ~0.27182817E1) = ~0.4524917E1 nextAfter (0.123E2, ~0.27182817E1) = 0.12299999E2 rem (0.123E2, ~0.27182817E1) = 0.14268732E1 * (0.123E2, ~0.123E1) = ~0.15129001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129001E1 + (0.123E2, ~0.123) = 0.12177E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.1E3 nextAfter (0.123E2, ~0.123) = 0.12299999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129001E~1 + (0.123E2, ~0.123E~2) = 0.1229877E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999E2 rem (0.123E2, ~0.123E~2) = 0.0 * (0.123E2, ~0.11754944E~37) = ~0.14458581E~36 + (0.123E2, ~0.11754944E~37) = 0.123E2 - (0.123E2, ~0.11754944E~37) = 0.123E2 / (0.123E2, ~0.11754944E~37) = ~inf nextAfter (0.123E2, ~0.11754944E~37) = 0.12299999E2 rem (0.123E2, ~0.11754944E~37) = ~inf * (0.123E2, ~0.5877472E~38) = ~0.72292904E~37 + (0.123E2, ~0.5877472E~38) = 0.123E2 - (0.123E2, ~0.5877472E~38) = 0.123E2 / (0.123E2, ~0.5877472E~38) = ~inf nextAfter (0.123E2, ~0.5877472E~38) = 0.12299999E2 rem (0.123E2, ~0.5877472E~38) = ~inf * (0.123E2, ~0.1E~44) = ~0.17E~43 + (0.123E2, ~0.1E~44) = 0.123E2 - (0.123E2, ~0.1E~44) = 0.123E2 / (0.123E2, ~0.1E~44) = ~inf nextAfter (0.123E2, ~0.1E~44) = 0.12299999E2 rem (0.123E2, ~0.1E~44) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.31415927E1, 0.34028235E39) = inf + (0.31415927E1, 0.34028235E39) = 0.34028235E39 - (0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (0.31415927E1, 0.34028235E39) = 0.9232312E~38 nextAfter (0.31415927E1, 0.34028235E39) = 0.3141593E1 rem (0.31415927E1, 0.34028235E39) = 0.31415927E1 * (0.31415927E1, 0.17014117E39) = inf + (0.31415927E1, 0.17014117E39) = 0.17014117E39 - (0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (0.31415927E1, 0.17014117E39) = 0.18464624E~37 nextAfter (0.31415927E1, 0.17014117E39) = 0.3141593E1 rem (0.31415927E1, 0.17014117E39) = 0.31415927E1 * (0.31415927E1, 0.123E4) = 0.38641592E4 + (0.31415927E1, 0.123E4) = 0.12331416E4 - (0.31415927E1, 0.123E4) = ~0.12268584E4 / (0.31415927E1, 0.123E4) = 0.25541405E~2 nextAfter (0.31415927E1, 0.123E4) = 0.3141593E1 rem (0.31415927E1, 0.123E4) = 0.31415927E1 * (0.31415927E1, 0.123E2) = 0.3864159E2 + (0.31415927E1, 0.123E2) = 0.15441593E2 - (0.31415927E1, 0.123E2) = ~0.9158407E1 / (0.31415927E1, 0.123E2) = 0.25541404 nextAfter (0.31415927E1, 0.123E2) = 0.3141593E1 rem (0.31415927E1, 0.123E2) = 0.31415927E1 * (0.31415927E1, 0.31415927E1) = 0.9869605E1 + (0.31415927E1, 0.31415927E1) = 0.62831855E1 - (0.31415927E1, 0.31415927E1) = 0.0 / (0.31415927E1, 0.31415927E1) = 0.1E1 nextAfter (0.31415927E1, 0.31415927E1) = 0.31415927E1 rem (0.31415927E1, 0.31415927E1) = 0.0 * (0.31415927E1, 0.27182817E1) = 0.8539734E1 + (0.31415927E1, 0.27182817E1) = 0.58598747E1 - (0.31415927E1, 0.27182817E1) = 0.423311 / (0.31415927E1, 0.27182817E1) = 0.11557274E1 nextAfter (0.31415927E1, 0.27182817E1) = 0.31415925E1 rem (0.31415927E1, 0.27182817E1) = 0.423311 * (0.31415927E1, 0.123E1) = 0.3864159E1 + (0.31415927E1, 0.123E1) = 0.43715925E1 - (0.31415927E1, 0.123E1) = 0.19115927E1 / (0.31415927E1, 0.123E1) = 0.25541403E1 nextAfter (0.31415927E1, 0.123E1) = 0.31415925E1 rem (0.31415927E1, 0.123E1) = 0.6815927 * (0.31415927E1, 0.123) = 0.38641593 + (0.31415927E1, 0.123) = 0.32645926E1 - (0.31415927E1, 0.123) = 0.30185928E1 / (0.31415927E1, 0.123) = 0.25541403E2 nextAfter (0.31415927E1, 0.123) = 0.31415925E1 rem (0.31415927E1, 0.123) = 0.6659269E~1 * (0.31415927E1, 0.123E~2) = 0.38641593E~2 + (0.31415927E1, 0.123E~2) = 0.31428227E1 - (0.31415927E1, 0.123E~2) = 0.31403627E1 / (0.31415927E1, 0.123E~2) = 0.25541404E4 nextAfter (0.31415927E1, 0.123E~2) = 0.31415925E1 rem (0.31415927E1, 0.123E~2) = 0.17261505E~3 * (0.31415927E1, 0.11754944E~37) = 0.36929245E~37 + (0.31415927E1, 0.11754944E~37) = 0.31415927E1 - (0.31415927E1, 0.11754944E~37) = 0.31415927E1 / (0.31415927E1, 0.11754944E~37) = 0.26725715E39 nextAfter (0.31415927E1, 0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, 0.11754944E~37) = 0.0 * (0.31415927E1, 0.5877472E~38) = 0.18464623E~37 + (0.31415927E1, 0.5877472E~38) = 0.31415927E1 - (0.31415927E1, 0.5877472E~38) = 0.31415927E1 / (0.31415927E1, 0.5877472E~38) = inf nextAfter (0.31415927E1, 0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, 0.5877472E~38) = ~inf * (0.31415927E1, 0.1E~44) = 0.4E~44 + (0.31415927E1, 0.1E~44) = 0.31415927E1 - (0.31415927E1, 0.1E~44) = 0.31415927E1 / (0.31415927E1, 0.1E~44) = inf nextAfter (0.31415927E1, 0.1E~44) = 0.31415925E1 rem (0.31415927E1, 0.1E~44) = ~inf * (0.31415927E1, 0.0) = 0.0 + (0.31415927E1, 0.0) = 0.31415927E1 - (0.31415927E1, 0.0) = 0.31415927E1 / (0.31415927E1, 0.0) = inf nextAfter (0.31415927E1, 0.0) = 0.31415925E1 rem (0.31415927E1, 0.0) = nan * (0.31415927E1, ~0.34028235E39) = ~inf + (0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (0.31415927E1, ~0.34028235E39) = ~0.9232312E~38 nextAfter (0.31415927E1, ~0.34028235E39) = 0.31415925E1 rem (0.31415927E1, ~0.34028235E39) = 0.31415927E1 * (0.31415927E1, ~0.17014117E39) = ~inf + (0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (0.31415927E1, ~0.17014117E39) = ~0.18464624E~37 nextAfter (0.31415927E1, ~0.17014117E39) = 0.31415925E1 rem (0.31415927E1, ~0.17014117E39) = 0.31415927E1 * (0.31415927E1, ~0.123E4) = ~0.38641592E4 + (0.31415927E1, ~0.123E4) = ~0.12268584E4 - (0.31415927E1, ~0.123E4) = 0.12331416E4 / (0.31415927E1, ~0.123E4) = ~0.25541405E~2 nextAfter (0.31415927E1, ~0.123E4) = 0.31415925E1 rem (0.31415927E1, ~0.123E4) = 0.31415927E1 * (0.31415927E1, ~0.123E2) = ~0.3864159E2 + (0.31415927E1, ~0.123E2) = ~0.9158407E1 - (0.31415927E1, ~0.123E2) = 0.15441593E2 / (0.31415927E1, ~0.123E2) = ~0.25541404 nextAfter (0.31415927E1, ~0.123E2) = 0.31415925E1 rem (0.31415927E1, ~0.123E2) = 0.31415927E1 * (0.31415927E1, ~0.31415927E1) = ~0.9869605E1 + (0.31415927E1, ~0.31415927E1) = 0.0 - (0.31415927E1, ~0.31415927E1) = 0.62831855E1 / (0.31415927E1, ~0.31415927E1) = ~0.1E1 nextAfter (0.31415927E1, ~0.31415927E1) = 0.31415925E1 rem (0.31415927E1, ~0.31415927E1) = 0.0 * (0.31415927E1, ~0.27182817E1) = ~0.8539734E1 + (0.31415927E1, ~0.27182817E1) = 0.423311 - (0.31415927E1, ~0.27182817E1) = 0.58598747E1 / (0.31415927E1, ~0.27182817E1) = ~0.11557274E1 nextAfter (0.31415927E1, ~0.27182817E1) = 0.31415925E1 rem (0.31415927E1, ~0.27182817E1) = 0.423311 * (0.31415927E1, ~0.123E1) = ~0.3864159E1 + (0.31415927E1, ~0.123E1) = 0.19115927E1 - (0.31415927E1, ~0.123E1) = 0.43715925E1 / (0.31415927E1, ~0.123E1) = ~0.25541403E1 nextAfter (0.31415927E1, ~0.123E1) = 0.31415925E1 rem (0.31415927E1, ~0.123E1) = 0.6815927 * (0.31415927E1, ~0.123) = ~0.38641593 + (0.31415927E1, ~0.123) = 0.30185928E1 - (0.31415927E1, ~0.123) = 0.32645926E1 / (0.31415927E1, ~0.123) = ~0.25541403E2 nextAfter (0.31415927E1, ~0.123) = 0.31415925E1 rem (0.31415927E1, ~0.123) = 0.6659269E~1 * (0.31415927E1, ~0.123E~2) = ~0.38641593E~2 + (0.31415927E1, ~0.123E~2) = 0.31403627E1 - (0.31415927E1, ~0.123E~2) = 0.31428227E1 / (0.31415927E1, ~0.123E~2) = ~0.25541404E4 nextAfter (0.31415927E1, ~0.123E~2) = 0.31415925E1 rem (0.31415927E1, ~0.123E~2) = 0.17261505E~3 * (0.31415927E1, ~0.11754944E~37) = ~0.36929245E~37 + (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 - (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 / (0.31415927E1, ~0.11754944E~37) = ~0.26725715E39 nextAfter (0.31415927E1, ~0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, ~0.11754944E~37) = 0.0 * (0.31415927E1, ~0.5877472E~38) = ~0.18464623E~37 + (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 - (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 / (0.31415927E1, ~0.5877472E~38) = ~inf nextAfter (0.31415927E1, ~0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, ~0.5877472E~38) = ~inf * (0.31415927E1, ~0.1E~44) = ~0.4E~44 + (0.31415927E1, ~0.1E~44) = 0.31415927E1 - (0.31415927E1, ~0.1E~44) = 0.31415927E1 / (0.31415927E1, ~0.1E~44) = ~inf nextAfter (0.31415927E1, ~0.1E~44) = 0.31415925E1 rem (0.31415927E1, ~0.1E~44) = ~inf * (0.31415927E1, ~0.0) = ~0.0 + (0.31415927E1, ~0.0) = 0.31415927E1 - (0.31415927E1, ~0.0) = 0.31415927E1 / (0.31415927E1, ~0.0) = ~inf nextAfter (0.31415927E1, ~0.0) = 0.31415925E1 rem (0.31415927E1, ~0.0) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.31415927E1, ~inf) = ~inf + (0.31415927E1, ~inf) = ~inf - (0.31415927E1, ~inf) = inf / (0.31415927E1, ~inf) = ~0.0 nextAfter (0.31415927E1, ~inf) = 0.31415925E1 rem (0.31415927E1, ~inf) = 0.31415927E1 * (0.31415927E1, nan) = nan + (0.31415927E1, nan) = nan - (0.31415927E1, nan) = nan / (0.31415927E1, nan) = nan nextAfter (0.31415927E1, nan) = nan rem (0.31415927E1, nan) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.27182817E1, 0.34028235E39) = inf + (0.27182817E1, 0.34028235E39) = 0.34028235E39 - (0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (0.27182817E1, 0.34028235E39) = 0.7988312E~38 nextAfter (0.27182817E1, 0.34028235E39) = 0.2718282E1 rem (0.27182817E1, 0.34028235E39) = 0.27182817E1 * (0.27182817E1, 0.17014117E39) = inf + (0.27182817E1, 0.17014117E39) = 0.17014117E39 - (0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (0.27182817E1, 0.17014117E39) = 0.15976626E~37 nextAfter (0.27182817E1, 0.17014117E39) = 0.2718282E1 rem (0.27182817E1, 0.17014117E39) = 0.27182817E1 * (0.27182817E1, 0.123E4) = 0.33434866E4 + (0.27182817E1, 0.123E4) = 0.12327183E4 - (0.27182817E1, 0.123E4) = ~0.12272817E4 / (0.27182817E1, 0.123E4) = 0.22099852E~2 nextAfter (0.27182817E1, 0.123E4) = 0.2718282E1 rem (0.27182817E1, 0.123E4) = 0.27182817E1 * (0.27182817E1, 0.123E2) = 0.33434868E2 + (0.27182817E1, 0.123E2) = 0.15018282E2 - (0.27182817E1, 0.123E2) = ~0.9581718E1 / (0.27182817E1, 0.123E2) = 0.22099851 nextAfter (0.27182817E1, 0.123E2) = 0.2718282E1 rem (0.27182817E1, 0.123E2) = 0.27182817E1 * (0.27182817E1, 0.31415927E1) = 0.8539734E1 + (0.27182817E1, 0.31415927E1) = 0.58598747E1 - (0.27182817E1, 0.31415927E1) = ~0.423311 / (0.27182817E1, 0.31415927E1) = 0.86525595 nextAfter (0.27182817E1, 0.31415927E1) = 0.2718282E1 rem (0.27182817E1, 0.31415927E1) = 0.27182817E1 * (0.27182817E1, 0.27182817E1) = 0.73890557E1 + (0.27182817E1, 0.27182817E1) = 0.54365635E1 - (0.27182817E1, 0.27182817E1) = 0.0 / (0.27182817E1, 0.27182817E1) = 0.1E1 nextAfter (0.27182817E1, 0.27182817E1) = 0.27182817E1 rem (0.27182817E1, 0.27182817E1) = 0.0 * (0.27182817E1, 0.123E1) = 0.33434865E1 + (0.27182817E1, 0.123E1) = 0.39482818E1 - (0.27182817E1, 0.123E1) = 0.14882817E1 / (0.27182817E1, 0.123E1) = 0.2209985E1 nextAfter (0.27182817E1, 0.123E1) = 0.27182815E1 rem (0.27182817E1, 0.123E1) = 0.2582817 * (0.27182817E1, 0.123) = 0.33434868 + (0.27182817E1, 0.123) = 0.28412817E1 - (0.27182817E1, 0.123) = 0.25952818E1 / (0.27182817E1, 0.123) = 0.22099852E2 nextAfter (0.27182817E1, 0.123) = 0.27182815E1 rem (0.27182817E1, 0.123) = 0.12281656E~1 * (0.27182817E1, 0.123E~2) = 0.33434867E~2 + (0.27182817E1, 0.123E~2) = 0.27195117E1 - (0.27182817E1, 0.123E~2) = 0.27170517E1 / (0.27182817E1, 0.123E~2) = 0.2209985E4 nextAfter (0.27182817E1, 0.123E~2) = 0.27182815E1 rem (0.27182817E1, 0.123E~2) = 0.12116432E~2 * (0.27182817E1, 0.11754944E~37) = 0.31953248E~37 + (0.27182817E1, 0.11754944E~37) = 0.27182817E1 - (0.27182817E1, 0.11754944E~37) = 0.27182817E1 / (0.27182817E1, 0.11754944E~37) = 0.23124584E39 nextAfter (0.27182817E1, 0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, 0.11754944E~37) = 0.0 * (0.27182817E1, 0.5877472E~38) = 0.15976624E~37 + (0.27182817E1, 0.5877472E~38) = 0.27182817E1 - (0.27182817E1, 0.5877472E~38) = 0.27182817E1 / (0.27182817E1, 0.5877472E~38) = inf nextAfter (0.27182817E1, 0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, 0.5877472E~38) = ~inf * (0.27182817E1, 0.1E~44) = 0.4E~44 + (0.27182817E1, 0.1E~44) = 0.27182817E1 - (0.27182817E1, 0.1E~44) = 0.27182817E1 / (0.27182817E1, 0.1E~44) = inf nextAfter (0.27182817E1, 0.1E~44) = 0.27182815E1 rem (0.27182817E1, 0.1E~44) = ~inf * (0.27182817E1, 0.0) = 0.0 + (0.27182817E1, 0.0) = 0.27182817E1 - (0.27182817E1, 0.0) = 0.27182817E1 / (0.27182817E1, 0.0) = inf nextAfter (0.27182817E1, 0.0) = 0.27182815E1 rem (0.27182817E1, 0.0) = nan * (0.27182817E1, ~0.34028235E39) = ~inf + (0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (0.27182817E1, ~0.34028235E39) = ~0.7988312E~38 nextAfter (0.27182817E1, ~0.34028235E39) = 0.27182815E1 rem (0.27182817E1, ~0.34028235E39) = 0.27182817E1 * (0.27182817E1, ~0.17014117E39) = ~inf + (0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (0.27182817E1, ~0.17014117E39) = ~0.15976626E~37 nextAfter (0.27182817E1, ~0.17014117E39) = 0.27182815E1 rem (0.27182817E1, ~0.17014117E39) = 0.27182817E1 * (0.27182817E1, ~0.123E4) = ~0.33434866E4 + (0.27182817E1, ~0.123E4) = ~0.12272817E4 - (0.27182817E1, ~0.123E4) = 0.12327183E4 / (0.27182817E1, ~0.123E4) = ~0.22099852E~2 nextAfter (0.27182817E1, ~0.123E4) = 0.27182815E1 rem (0.27182817E1, ~0.123E4) = 0.27182817E1 * (0.27182817E1, ~0.123E2) = ~0.33434868E2 + (0.27182817E1, ~0.123E2) = ~0.9581718E1 - (0.27182817E1, ~0.123E2) = 0.15018282E2 / (0.27182817E1, ~0.123E2) = ~0.22099851 nextAfter (0.27182817E1, ~0.123E2) = 0.27182815E1 rem (0.27182817E1, ~0.123E2) = 0.27182817E1 * (0.27182817E1, ~0.31415927E1) = ~0.8539734E1 + (0.27182817E1, ~0.31415927E1) = ~0.423311 - (0.27182817E1, ~0.31415927E1) = 0.58598747E1 / (0.27182817E1, ~0.31415927E1) = ~0.86525595 nextAfter (0.27182817E1, ~0.31415927E1) = 0.27182815E1 rem (0.27182817E1, ~0.31415927E1) = 0.27182817E1 * (0.27182817E1, ~0.27182817E1) = ~0.73890557E1 + (0.27182817E1, ~0.27182817E1) = 0.0 - (0.27182817E1, ~0.27182817E1) = 0.54365635E1 / (0.27182817E1, ~0.27182817E1) = ~0.1E1 nextAfter (0.27182817E1, ~0.27182817E1) = 0.27182815E1 rem (0.27182817E1, ~0.27182817E1) = 0.0 * (0.27182817E1, ~0.123E1) = ~0.33434865E1 + (0.27182817E1, ~0.123E1) = 0.14882817E1 - (0.27182817E1, ~0.123E1) = 0.39482818E1 / (0.27182817E1, ~0.123E1) = ~0.2209985E1 nextAfter (0.27182817E1, ~0.123E1) = 0.27182815E1 rem (0.27182817E1, ~0.123E1) = 0.2582817 * (0.27182817E1, ~0.123) = ~0.33434868 + (0.27182817E1, ~0.123) = 0.25952818E1 - (0.27182817E1, ~0.123) = 0.28412817E1 / (0.27182817E1, ~0.123) = ~0.22099852E2 nextAfter (0.27182817E1, ~0.123) = 0.27182815E1 rem (0.27182817E1, ~0.123) = 0.12281656E~1 * (0.27182817E1, ~0.123E~2) = ~0.33434867E~2 + (0.27182817E1, ~0.123E~2) = 0.27170517E1 - (0.27182817E1, ~0.123E~2) = 0.27195117E1 / (0.27182817E1, ~0.123E~2) = ~0.2209985E4 nextAfter (0.27182817E1, ~0.123E~2) = 0.27182815E1 rem (0.27182817E1, ~0.123E~2) = 0.12116432E~2 * (0.27182817E1, ~0.11754944E~37) = ~0.31953248E~37 + (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 - (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 / (0.27182817E1, ~0.11754944E~37) = ~0.23124584E39 nextAfter (0.27182817E1, ~0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, ~0.11754944E~37) = 0.0 * (0.27182817E1, ~0.5877472E~38) = ~0.15976624E~37 + (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 - (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 / (0.27182817E1, ~0.5877472E~38) = ~inf nextAfter (0.27182817E1, ~0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, ~0.5877472E~38) = ~inf * (0.27182817E1, ~0.1E~44) = ~0.4E~44 + (0.27182817E1, ~0.1E~44) = 0.27182817E1 - (0.27182817E1, ~0.1E~44) = 0.27182817E1 / (0.27182817E1, ~0.1E~44) = ~inf nextAfter (0.27182817E1, ~0.1E~44) = 0.27182815E1 rem (0.27182817E1, ~0.1E~44) = ~inf * (0.27182817E1, ~0.0) = ~0.0 + (0.27182817E1, ~0.0) = 0.27182817E1 - (0.27182817E1, ~0.0) = 0.27182817E1 / (0.27182817E1, ~0.0) = ~inf nextAfter (0.27182817E1, ~0.0) = 0.27182815E1 rem (0.27182817E1, ~0.0) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.27182817E1, ~inf) = ~inf + (0.27182817E1, ~inf) = ~inf - (0.27182817E1, ~inf) = inf / (0.27182817E1, ~inf) = ~0.0 nextAfter (0.27182817E1, ~inf) = 0.27182815E1 rem (0.27182817E1, ~inf) = 0.27182817E1 * (0.27182817E1, nan) = nan + (0.27182817E1, nan) = nan - (0.27182817E1, nan) = nan / (0.27182817E1, nan) = nan nextAfter (0.27182817E1, nan) = nan rem (0.27182817E1, nan) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.123E1, 0.34028235E39) = inf + (0.123E1, 0.34028235E39) = 0.34028235E39 - (0.123E1, 0.34028235E39) = ~0.34028235E39 / (0.123E1, 0.34028235E39) = 0.3614645E~38 nextAfter (0.123E1, 0.34028235E39) = 0.12300001E1 rem (0.123E1, 0.34028235E39) = 0.123E1 * (0.123E1, 0.17014117E39) = 0.20927364E39 + (0.123E1, 0.17014117E39) = 0.17014117E39 - (0.123E1, 0.17014117E39) = ~0.17014117E39 / (0.123E1, 0.17014117E39) = 0.722929E~38 nextAfter (0.123E1, 0.17014117E39) = 0.12300001E1 rem (0.123E1, 0.17014117E39) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300001E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129001E2 + (0.123E1, 0.123E2) = 0.13530001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.1 nextAfter (0.123E1, 0.123E2) = 0.12300001E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.31415927E1) = 0.3864159E1 + (0.123E1, 0.31415927E1) = 0.43715925E1 - (0.123E1, 0.31415927E1) = ~0.19115927E1 / (0.123E1, 0.31415927E1) = 0.39152116 nextAfter (0.123E1, 0.31415927E1) = 0.12300001E1 rem (0.123E1, 0.31415927E1) = 0.123E1 * (0.123E1, 0.27182817E1) = 0.33434865E1 + (0.123E1, 0.27182817E1) = 0.39482818E1 - (0.123E1, 0.27182817E1) = ~0.14882817E1 / (0.123E1, 0.27182817E1) = 0.45249173 nextAfter (0.123E1, 0.27182817E1) = 0.12300001E1 rem (0.123E1, 0.27182817E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129001E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.11754944E~37) = 0.14458581E~37 + (0.123E1, 0.11754944E~37) = 0.123E1 - (0.123E1, 0.11754944E~37) = 0.123E1 / (0.123E1, 0.11754944E~37) = 0.10463683E39 nextAfter (0.123E1, 0.11754944E~37) = 0.12299999E1 rem (0.123E1, 0.11754944E~37) = 0.0 * (0.123E1, 0.5877472E~38) = 0.722929E~38 + (0.123E1, 0.5877472E~38) = 0.123E1 - (0.123E1, 0.5877472E~38) = 0.123E1 / (0.123E1, 0.5877472E~38) = 0.20927366E39 nextAfter (0.123E1, 0.5877472E~38) = 0.12299999E1 rem (0.123E1, 0.5877472E~38) = 0.0 * (0.123E1, 0.1E~44) = 0.1E~44 + (0.123E1, 0.1E~44) = 0.123E1 - (0.123E1, 0.1E~44) = 0.123E1 / (0.123E1, 0.1E~44) = inf nextAfter (0.123E1, 0.1E~44) = 0.12299999E1 rem (0.123E1, 0.1E~44) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.34028235E39) = ~inf + (0.123E1, ~0.34028235E39) = ~0.34028235E39 - (0.123E1, ~0.34028235E39) = 0.34028235E39 / (0.123E1, ~0.34028235E39) = ~0.3614645E~38 nextAfter (0.123E1, ~0.34028235E39) = 0.12299999E1 rem (0.123E1, ~0.34028235E39) = 0.123E1 * (0.123E1, ~0.17014117E39) = ~0.20927364E39 + (0.123E1, ~0.17014117E39) = ~0.17014117E39 - (0.123E1, ~0.17014117E39) = 0.17014117E39 / (0.123E1, ~0.17014117E39) = ~0.722929E~38 nextAfter (0.123E1, ~0.17014117E39) = 0.12299999E1 rem (0.123E1, ~0.17014117E39) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530001E2 / (0.123E1, ~0.123E2) = ~0.1 nextAfter (0.123E1, ~0.123E2) = 0.12299999E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.31415927E1) = ~0.3864159E1 + (0.123E1, ~0.31415927E1) = ~0.19115927E1 - (0.123E1, ~0.31415927E1) = 0.43715925E1 / (0.123E1, ~0.31415927E1) = ~0.39152116 nextAfter (0.123E1, ~0.31415927E1) = 0.12299999E1 rem (0.123E1, ~0.31415927E1) = 0.123E1 * (0.123E1, ~0.27182817E1) = ~0.33434865E1 + (0.123E1, ~0.27182817E1) = ~0.14882817E1 - (0.123E1, ~0.27182817E1) = 0.39482818E1 / (0.123E1, ~0.27182817E1) = ~0.45249173 nextAfter (0.123E1, ~0.27182817E1) = 0.12299999E1 rem (0.123E1, ~0.27182817E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129001E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.11754944E~37) = ~0.14458581E~37 + (0.123E1, ~0.11754944E~37) = 0.123E1 - (0.123E1, ~0.11754944E~37) = 0.123E1 / (0.123E1, ~0.11754944E~37) = ~0.10463683E39 nextAfter (0.123E1, ~0.11754944E~37) = 0.12299999E1 rem (0.123E1, ~0.11754944E~37) = 0.0 * (0.123E1, ~0.5877472E~38) = ~0.722929E~38 + (0.123E1, ~0.5877472E~38) = 0.123E1 - (0.123E1, ~0.5877472E~38) = 0.123E1 / (0.123E1, ~0.5877472E~38) = ~0.20927366E39 nextAfter (0.123E1, ~0.5877472E~38) = 0.12299999E1 rem (0.123E1, ~0.5877472E~38) = 0.0 * (0.123E1, ~0.1E~44) = ~0.1E~44 + (0.123E1, ~0.1E~44) = 0.123E1 - (0.123E1, ~0.1E~44) = 0.123E1 / (0.123E1, ~0.1E~44) = ~inf nextAfter (0.123E1, ~0.1E~44) = 0.12299999E1 rem (0.123E1, ~0.1E~44) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.34028235E39) = 0.4185473E38 + (0.123, 0.34028235E39) = 0.34028235E39 - (0.123, 0.34028235E39) = ~0.34028235E39 / (0.123, 0.34028235E39) = 0.361465E~39 nextAfter (0.123, 0.34028235E39) = 0.12300001 rem (0.123, 0.34028235E39) = 0.123 * (0.123, 0.17014117E39) = 0.20927365E38 + (0.123, 0.17014117E39) = 0.17014117E39 - (0.123, 0.17014117E39) = ~0.17014117E39 / (0.123, 0.17014117E39) = 0.722928E~39 nextAfter (0.123, 0.17014117E39) = 0.12300001 rem (0.123, 0.17014117E39) = 0.123 * (0.123, 0.123E4) = 0.15129001E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.100000005E~3 nextAfter (0.123, 0.123E4) = 0.12300001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177E2 / (0.123, 0.123E2) = 0.1E~1 nextAfter (0.123, 0.123E2) = 0.12300001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.31415927E1) = 0.38641593 + (0.123, 0.31415927E1) = 0.32645926E1 - (0.123, 0.31415927E1) = ~0.30185928E1 / (0.123, 0.31415927E1) = 0.39152116E~1 nextAfter (0.123, 0.31415927E1) = 0.12300001 rem (0.123, 0.31415927E1) = 0.123 * (0.123, 0.27182817E1) = 0.33434868 + (0.123, 0.27182817E1) = 0.28412817E1 - (0.123, 0.27182817E1) = ~0.25952818E1 / (0.123, 0.27182817E1) = 0.45249175E~1 nextAfter (0.123, 0.27182817E1) = 0.12300001 rem (0.123, 0.27182817E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129001E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.124230005 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.122999996 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.11754944E~37) = 0.1445858E~38 + (0.123, 0.11754944E~37) = 0.123 - (0.123, 0.11754944E~37) = 0.123 / (0.123, 0.11754944E~37) = 0.10463683E38 nextAfter (0.123, 0.11754944E~37) = 0.122999996 rem (0.123, 0.11754944E~37) = 0.0 * (0.123, 0.5877472E~38) = 0.722928E~39 + (0.123, 0.5877472E~38) = 0.123 - (0.123, 0.5877472E~38) = 0.123 / (0.123, 0.5877472E~38) = 0.20927366E38 nextAfter (0.123, 0.5877472E~38) = 0.122999996 rem (0.123, 0.5877472E~38) = 0.0 * (0.123, 0.1E~44) = 0.0 + (0.123, 0.1E~44) = 0.123 - (0.123, 0.1E~44) = 0.123 / (0.123, 0.1E~44) = inf nextAfter (0.123, 0.1E~44) = 0.122999996 rem (0.123, 0.1E~44) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.122999996 rem (0.123, 0.0) = nan * (0.123, ~0.34028235E39) = ~0.4185473E38 + (0.123, ~0.34028235E39) = ~0.34028235E39 - (0.123, ~0.34028235E39) = 0.34028235E39 / (0.123, ~0.34028235E39) = ~0.361465E~39 nextAfter (0.123, ~0.34028235E39) = 0.122999996 rem (0.123, ~0.34028235E39) = 0.123 * (0.123, ~0.17014117E39) = ~0.20927365E38 + (0.123, ~0.17014117E39) = ~0.17014117E39 - (0.123, ~0.17014117E39) = 0.17014117E39 / (0.123, ~0.17014117E39) = ~0.722928E~39 nextAfter (0.123, ~0.17014117E39) = 0.122999996 rem (0.123, ~0.17014117E39) = 0.123 * (0.123, ~0.123E4) = ~0.15129001E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.100000005E~3 nextAfter (0.123, ~0.123E4) = 0.122999996 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129001E1 + (0.123, ~0.123E2) = ~0.12177E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.1E~1 nextAfter (0.123, ~0.123E2) = 0.122999996 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.31415927E1) = ~0.38641593 + (0.123, ~0.31415927E1) = ~0.30185928E1 - (0.123, ~0.31415927E1) = 0.32645926E1 / (0.123, ~0.31415927E1) = ~0.39152116E~1 nextAfter (0.123, ~0.31415927E1) = 0.122999996 rem (0.123, ~0.31415927E1) = 0.123 * (0.123, ~0.27182817E1) = ~0.33434868 + (0.123, ~0.27182817E1) = ~0.25952818E1 - (0.123, ~0.27182817E1) = 0.28412817E1 / (0.123, ~0.27182817E1) = ~0.45249175E~1 nextAfter (0.123, ~0.27182817E1) = 0.122999996 rem (0.123, ~0.27182817E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.122999996 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129001E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.122999996 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.124230005 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.122999996 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.11754944E~37) = ~0.1445858E~38 + (0.123, ~0.11754944E~37) = 0.123 - (0.123, ~0.11754944E~37) = 0.123 / (0.123, ~0.11754944E~37) = ~0.10463683E38 nextAfter (0.123, ~0.11754944E~37) = 0.122999996 rem (0.123, ~0.11754944E~37) = 0.0 * (0.123, ~0.5877472E~38) = ~0.722928E~39 + (0.123, ~0.5877472E~38) = 0.123 - (0.123, ~0.5877472E~38) = 0.123 / (0.123, ~0.5877472E~38) = ~0.20927366E38 nextAfter (0.123, ~0.5877472E~38) = 0.122999996 rem (0.123, ~0.5877472E~38) = 0.0 * (0.123, ~0.1E~44) = ~0.0 + (0.123, ~0.1E~44) = 0.123 - (0.123, ~0.1E~44) = 0.123 / (0.123, ~0.1E~44) = ~inf nextAfter (0.123, ~0.1E~44) = 0.122999996 rem (0.123, ~0.1E~44) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.122999996 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.122999996 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.34028235E39) = 0.4185473E36 + (0.123E~2, 0.34028235E39) = 0.34028235E39 - (0.123E~2, 0.34028235E39) = ~0.34028235E39 / (0.123E~2, 0.34028235E39) = 0.3614E~41 nextAfter (0.123E~2, 0.34028235E39) = 0.12300002E~2 rem (0.123E~2, 0.34028235E39) = 0.123E~2 * (0.123E~2, 0.17014117E39) = 0.20927364E36 + (0.123E~2, 0.17014117E39) = 0.17014117E39 - (0.123E~2, 0.17014117E39) = ~0.17014117E39 / (0.123E~2, 0.17014117E39) = 0.7229E~41 nextAfter (0.123E~2, 0.17014117E39) = 0.12300002E~2 rem (0.123E~2, 0.17014117E39) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129001E1 + (0.123E~2, 0.123E4) = 0.12300012E4 - (0.123E~2, 0.123E4) = ~0.12299988E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129001E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.1229877E2 / (0.123E~2, 0.123E2) = 0.100000005E~3 nextAfter (0.123E~2, 0.123E2) = 0.12300002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.31415927E1) = 0.38641593E~2 + (0.123E~2, 0.31415927E1) = 0.31428227E1 - (0.123E~2, 0.31415927E1) = ~0.31403627E1 / (0.123E~2, 0.31415927E1) = 0.39152117E~3 nextAfter (0.123E~2, 0.31415927E1) = 0.12300002E~2 rem (0.123E~2, 0.31415927E1) = 0.123E~2 * (0.123E~2, 0.27182817E1) = 0.33434867E~2 + (0.123E~2, 0.27182817E1) = 0.27195117E1 - (0.123E~2, 0.27182817E1) = ~0.27170517E1 / (0.123E~2, 0.27182817E1) = 0.45249175E~3 nextAfter (0.123E~2, 0.27182817E1) = 0.12300002E~2 rem (0.123E~2, 0.27182817E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129001E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.124230005 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129001E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.11754944E~37) = 0.14459E~40 + (0.123E~2, 0.11754944E~37) = 0.123E~2 - (0.123E~2, 0.11754944E~37) = 0.123E~2 / (0.123E~2, 0.11754944E~37) = 0.10463683E36 nextAfter (0.123E~2, 0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, 0.11754944E~37) = 0.0 * (0.123E~2, 0.5877472E~38) = 0.7229E~41 + (0.123E~2, 0.5877472E~38) = 0.123E~2 - (0.123E~2, 0.5877472E~38) = 0.123E~2 / (0.123E~2, 0.5877472E~38) = 0.20927366E36 nextAfter (0.123E~2, 0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, 0.5877472E~38) = 0.0 * (0.123E~2, 0.1E~44) = 0.0 + (0.123E~2, 0.1E~44) = 0.123E~2 - (0.123E~2, 0.1E~44) = 0.123E~2 / (0.123E~2, 0.1E~44) = inf nextAfter (0.123E~2, 0.1E~44) = 0.12299999E~2 rem (0.123E~2, 0.1E~44) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.34028235E39) = ~0.4185473E36 + (0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (0.123E~2, ~0.34028235E39) = 0.34028235E39 / (0.123E~2, ~0.34028235E39) = ~0.3614E~41 nextAfter (0.123E~2, ~0.34028235E39) = 0.12299999E~2 rem (0.123E~2, ~0.34028235E39) = 0.123E~2 * (0.123E~2, ~0.17014117E39) = ~0.20927364E36 + (0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (0.123E~2, ~0.17014117E39) = 0.17014117E39 / (0.123E~2, ~0.17014117E39) = ~0.7229E~41 nextAfter (0.123E~2, ~0.17014117E39) = 0.12299999E~2 rem (0.123E~2, ~0.17014117E39) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129001E1 + (0.123E~2, ~0.123E4) = ~0.12299988E4 - (0.123E~2, ~0.123E4) = 0.12300012E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129001E~1 + (0.123E~2, ~0.123E2) = ~0.1229877E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.100000005E~3 nextAfter (0.123E~2, ~0.123E2) = 0.12299999E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.31415927E1) = ~0.38641593E~2 + (0.123E~2, ~0.31415927E1) = ~0.31403627E1 - (0.123E~2, ~0.31415927E1) = 0.31428227E1 / (0.123E~2, ~0.31415927E1) = ~0.39152117E~3 nextAfter (0.123E~2, ~0.31415927E1) = 0.12299999E~2 rem (0.123E~2, ~0.31415927E1) = 0.123E~2 * (0.123E~2, ~0.27182817E1) = ~0.33434867E~2 + (0.123E~2, ~0.27182817E1) = ~0.27170517E1 - (0.123E~2, ~0.27182817E1) = 0.27195117E1 / (0.123E~2, ~0.27182817E1) = ~0.45249175E~3 nextAfter (0.123E~2, ~0.27182817E1) = 0.12299999E~2 rem (0.123E~2, ~0.27182817E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129001E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.124230005 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129001E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.11754944E~37) = ~0.14459E~40 + (0.123E~2, ~0.11754944E~37) = 0.123E~2 - (0.123E~2, ~0.11754944E~37) = 0.123E~2 / (0.123E~2, ~0.11754944E~37) = ~0.10463683E36 nextAfter (0.123E~2, ~0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, ~0.11754944E~37) = 0.0 * (0.123E~2, ~0.5877472E~38) = ~0.7229E~41 + (0.123E~2, ~0.5877472E~38) = 0.123E~2 - (0.123E~2, ~0.5877472E~38) = 0.123E~2 / (0.123E~2, ~0.5877472E~38) = ~0.20927366E36 nextAfter (0.123E~2, ~0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, ~0.5877472E~38) = 0.0 * (0.123E~2, ~0.1E~44) = ~0.0 + (0.123E~2, ~0.1E~44) = 0.123E~2 - (0.123E~2, ~0.1E~44) = 0.123E~2 / (0.123E~2, ~0.1E~44) = ~inf nextAfter (0.123E~2, ~0.1E~44) = 0.12299999E~2 rem (0.123E~2, ~0.1E~44) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.11754944E~37, 0.34028235E39) = 0.39999998E1 + (0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (0.11754944E~37, 0.34028235E39) = 0.0 nextAfter (0.11754944E~37, 0.34028235E39) = 0.11754945E~37 rem (0.11754944E~37, 0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, 0.17014117E39) = 0.19999999E1 + (0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (0.11754944E~37, 0.17014117E39) = 0.0 nextAfter (0.11754944E~37, 0.17014117E39) = 0.11754945E~37 rem (0.11754944E~37, 0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, 0.123E4) = 0.1445858E~34 + (0.11754944E~37, 0.123E4) = 0.123E4 - (0.11754944E~37, 0.123E4) = ~0.123E4 / (0.11754944E~37, 0.123E4) = 0.9557E~41 nextAfter (0.11754944E~37, 0.123E4) = 0.11754945E~37 rem (0.11754944E~37, 0.123E4) = 0.11754944E~37 * (0.11754944E~37, 0.123E2) = 0.14458581E~36 + (0.11754944E~37, 0.123E2) = 0.123E2 - (0.11754944E~37, 0.123E2) = ~0.123E2 / (0.11754944E~37, 0.123E2) = 0.955687E~39 nextAfter (0.11754944E~37, 0.123E2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E2) = 0.11754944E~37 * (0.11754944E~37, 0.31415927E1) = 0.36929245E~37 + (0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (0.11754944E~37, 0.31415927E1) = 0.3741715E~38 nextAfter (0.11754944E~37, 0.31415927E1) = 0.11754945E~37 rem (0.11754944E~37, 0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, 0.27182817E1) = 0.31953248E~37 + (0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (0.11754944E~37, 0.27182817E1) = 0.4324403E~38 nextAfter (0.11754944E~37, 0.27182817E1) = 0.11754945E~37 rem (0.11754944E~37, 0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, 0.123E1) = 0.14458581E~37 + (0.11754944E~37, 0.123E1) = 0.123E1 - (0.11754944E~37, 0.123E1) = ~0.123E1 / (0.11754944E~37, 0.123E1) = 0.9556864E~38 nextAfter (0.11754944E~37, 0.123E1) = 0.11754945E~37 rem (0.11754944E~37, 0.123E1) = 0.11754944E~37 * (0.11754944E~37, 0.123) = 0.1445858E~38 + (0.11754944E~37, 0.123) = 0.123 - (0.11754944E~37, 0.123) = ~0.123 / (0.11754944E~37, 0.123) = 0.9556864E~37 nextAfter (0.11754944E~37, 0.123) = 0.11754945E~37 rem (0.11754944E~37, 0.123) = 0.11754944E~37 * (0.11754944E~37, 0.123E~2) = 0.14459E~40 + (0.11754944E~37, 0.123E~2) = 0.123E~2 - (0.11754944E~37, 0.123E~2) = ~0.123E~2 / (0.11754944E~37, 0.123E~2) = 0.95568645E~35 nextAfter (0.11754944E~37, 0.123E~2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E~2) = 0.11754944E~37 * (0.11754944E~37, 0.11754944E~37) = 0.0 + (0.11754944E~37, 0.11754944E~37) = 0.23509887E~37 - (0.11754944E~37, 0.11754944E~37) = 0.0 / (0.11754944E~37, 0.11754944E~37) = 0.1E1 nextAfter (0.11754944E~37, 0.11754944E~37) = 0.11754944E~37 rem (0.11754944E~37, 0.11754944E~37) = 0.0 * (0.11754944E~37, 0.5877472E~38) = 0.0 + (0.11754944E~37, 0.5877472E~38) = 0.17632415E~37 - (0.11754944E~37, 0.5877472E~38) = 0.5877472E~38 / (0.11754944E~37, 0.5877472E~38) = 0.2E1 nextAfter (0.11754944E~37, 0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, 0.5877472E~38) = 0.0 * (0.11754944E~37, 0.1E~44) = 0.0 + (0.11754944E~37, 0.1E~44) = 0.11754945E~37 - (0.11754944E~37, 0.1E~44) = 0.11754942E~37 / (0.11754944E~37, 0.1E~44) = 0.8388608E7 nextAfter (0.11754944E~37, 0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, 0.1E~44) = 0.0 * (0.11754944E~37, 0.0) = 0.0 + (0.11754944E~37, 0.0) = 0.11754944E~37 - (0.11754944E~37, 0.0) = 0.11754944E~37 / (0.11754944E~37, 0.0) = inf nextAfter (0.11754944E~37, 0.0) = 0.11754942E~37 rem (0.11754944E~37, 0.0) = nan * (0.11754944E~37, ~0.34028235E39) = ~0.39999998E1 + (0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (0.11754944E~37, ~0.34028235E39) = ~0.0 nextAfter (0.11754944E~37, ~0.34028235E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, ~0.17014117E39) = ~0.19999999E1 + (0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (0.11754944E~37, ~0.17014117E39) = ~0.0 nextAfter (0.11754944E~37, ~0.17014117E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, ~0.123E4) = ~0.1445858E~34 + (0.11754944E~37, ~0.123E4) = ~0.123E4 - (0.11754944E~37, ~0.123E4) = 0.123E4 / (0.11754944E~37, ~0.123E4) = ~0.9557E~41 nextAfter (0.11754944E~37, ~0.123E4) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E4) = 0.11754944E~37 * (0.11754944E~37, ~0.123E2) = ~0.14458581E~36 + (0.11754944E~37, ~0.123E2) = ~0.123E2 - (0.11754944E~37, ~0.123E2) = 0.123E2 / (0.11754944E~37, ~0.123E2) = ~0.955687E~39 nextAfter (0.11754944E~37, ~0.123E2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E2) = 0.11754944E~37 * (0.11754944E~37, ~0.31415927E1) = ~0.36929245E~37 + (0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (0.11754944E~37, ~0.31415927E1) = ~0.3741715E~38 nextAfter (0.11754944E~37, ~0.31415927E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, ~0.27182817E1) = ~0.31953248E~37 + (0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (0.11754944E~37, ~0.27182817E1) = ~0.4324403E~38 nextAfter (0.11754944E~37, ~0.27182817E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123E1) = ~0.14458581E~37 + (0.11754944E~37, ~0.123E1) = ~0.123E1 - (0.11754944E~37, ~0.123E1) = 0.123E1 / (0.11754944E~37, ~0.123E1) = ~0.9556864E~38 nextAfter (0.11754944E~37, ~0.123E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123) = ~0.1445858E~38 + (0.11754944E~37, ~0.123) = ~0.123 - (0.11754944E~37, ~0.123) = 0.123 / (0.11754944E~37, ~0.123) = ~0.9556864E~37 nextAfter (0.11754944E~37, ~0.123) = 0.11754942E~37 rem (0.11754944E~37, ~0.123) = 0.11754944E~37 * (0.11754944E~37, ~0.123E~2) = ~0.14459E~40 + (0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (0.11754944E~37, ~0.123E~2) = 0.123E~2 / (0.11754944E~37, ~0.123E~2) = ~0.95568645E~35 nextAfter (0.11754944E~37, ~0.123E~2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E~2) = 0.11754944E~37 * (0.11754944E~37, ~0.11754944E~37) = ~0.0 + (0.11754944E~37, ~0.11754944E~37) = 0.0 - (0.11754944E~37, ~0.11754944E~37) = 0.23509887E~37 / (0.11754944E~37, ~0.11754944E~37) = ~0.1E1 nextAfter (0.11754944E~37, ~0.11754944E~37) = 0.11754942E~37 rem (0.11754944E~37, ~0.11754944E~37) = 0.0 * (0.11754944E~37, ~0.5877472E~38) = ~0.0 + (0.11754944E~37, ~0.5877472E~38) = 0.5877472E~38 - (0.11754944E~37, ~0.5877472E~38) = 0.17632415E~37 / (0.11754944E~37, ~0.5877472E~38) = ~0.2E1 nextAfter (0.11754944E~37, ~0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, ~0.5877472E~38) = 0.0 * (0.11754944E~37, ~0.1E~44) = ~0.0 + (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 - (0.11754944E~37, ~0.1E~44) = 0.11754945E~37 / (0.11754944E~37, ~0.1E~44) = ~0.8388608E7 nextAfter (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, ~0.1E~44) = 0.0 * (0.11754944E~37, ~0.0) = ~0.0 + (0.11754944E~37, ~0.0) = 0.11754944E~37 - (0.11754944E~37, ~0.0) = 0.11754944E~37 / (0.11754944E~37, ~0.0) = ~inf nextAfter (0.11754944E~37, ~0.0) = 0.11754942E~37 rem (0.11754944E~37, ~0.0) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.11754944E~37, ~inf) = ~inf + (0.11754944E~37, ~inf) = ~inf - (0.11754944E~37, ~inf) = inf / (0.11754944E~37, ~inf) = ~0.0 nextAfter (0.11754944E~37, ~inf) = 0.11754942E~37 rem (0.11754944E~37, ~inf) = 0.11754944E~37 * (0.11754944E~37, nan) = nan + (0.11754944E~37, nan) = nan - (0.11754944E~37, nan) = nan / (0.11754944E~37, nan) = nan nextAfter (0.11754944E~37, nan) = nan rem (0.11754944E~37, nan) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.5877472E~38, 0.34028235E39) = 0.19999999E1 + (0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (0.5877472E~38, 0.34028235E39) = 0.0 nextAfter (0.5877472E~38, 0.34028235E39) = 0.5877473E~38 rem (0.5877472E~38, 0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, 0.17014117E39) = 0.99999994 + (0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (0.5877472E~38, 0.17014117E39) = 0.0 nextAfter (0.5877472E~38, 0.17014117E39) = 0.5877473E~38 rem (0.5877472E~38, 0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, 0.123E4) = 0.722929E~35 + (0.5877472E~38, 0.123E4) = 0.123E4 - (0.5877472E~38, 0.123E4) = ~0.123E4 / (0.5877472E~38, 0.123E4) = 0.4778E~41 nextAfter (0.5877472E~38, 0.123E4) = 0.5877473E~38 rem (0.5877472E~38, 0.123E4) = 0.5877472E~38 * (0.5877472E~38, 0.123E2) = 0.72292904E~37 + (0.5877472E~38, 0.123E2) = 0.123E2 - (0.5877472E~38, 0.123E2) = ~0.123E2 / (0.5877472E~38, 0.123E2) = 0.477843E~39 nextAfter (0.5877472E~38, 0.123E2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E2) = 0.5877472E~38 * (0.5877472E~38, 0.31415927E1) = 0.18464623E~37 + (0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (0.5877472E~38, 0.31415927E1) = 0.1870857E~38 nextAfter (0.5877472E~38, 0.31415927E1) = 0.5877473E~38 rem (0.5877472E~38, 0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, 0.27182817E1) = 0.15976624E~37 + (0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (0.5877472E~38, 0.27182817E1) = 0.2162201E~38 nextAfter (0.5877472E~38, 0.27182817E1) = 0.5877473E~38 rem (0.5877472E~38, 0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, 0.123E1) = 0.722929E~38 + (0.5877472E~38, 0.123E1) = 0.123E1 - (0.5877472E~38, 0.123E1) = ~0.123E1 / (0.5877472E~38, 0.123E1) = 0.4778432E~38 nextAfter (0.5877472E~38, 0.123E1) = 0.5877473E~38 rem (0.5877472E~38, 0.123E1) = 0.5877472E~38 * (0.5877472E~38, 0.123) = 0.722928E~39 + (0.5877472E~38, 0.123) = 0.123 - (0.5877472E~38, 0.123) = ~0.123 / (0.5877472E~38, 0.123) = 0.4778432E~37 nextAfter (0.5877472E~38, 0.123) = 0.5877473E~38 rem (0.5877472E~38, 0.123) = 0.5877472E~38 * (0.5877472E~38, 0.123E~2) = 0.7229E~41 + (0.5877472E~38, 0.123E~2) = 0.123E~2 - (0.5877472E~38, 0.123E~2) = ~0.123E~2 / (0.5877472E~38, 0.123E~2) = 0.47784322E~35 nextAfter (0.5877472E~38, 0.123E~2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E~2) = 0.5877472E~38 * (0.5877472E~38, 0.11754944E~37) = 0.0 + (0.5877472E~38, 0.11754944E~37) = 0.17632415E~37 - (0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 / (0.5877472E~38, 0.11754944E~37) = 0.5 nextAfter (0.5877472E~38, 0.11754944E~37) = 0.5877473E~38 rem (0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, 0.5877472E~38) = 0.0 + (0.5877472E~38, 0.5877472E~38) = 0.11754944E~37 - (0.5877472E~38, 0.5877472E~38) = 0.0 / (0.5877472E~38, 0.5877472E~38) = 0.1E1 nextAfter (0.5877472E~38, 0.5877472E~38) = 0.5877472E~38 rem (0.5877472E~38, 0.5877472E~38) = 0.0 * (0.5877472E~38, 0.1E~44) = 0.0 + (0.5877472E~38, 0.1E~44) = 0.5877473E~38 - (0.5877472E~38, 0.1E~44) = 0.587747E~38 / (0.5877472E~38, 0.1E~44) = 0.4194304E7 nextAfter (0.5877472E~38, 0.1E~44) = 0.587747E~38 rem (0.5877472E~38, 0.1E~44) = 0.0 * (0.5877472E~38, 0.0) = 0.0 + (0.5877472E~38, 0.0) = 0.5877472E~38 - (0.5877472E~38, 0.0) = 0.5877472E~38 / (0.5877472E~38, 0.0) = inf nextAfter (0.5877472E~38, 0.0) = 0.587747E~38 rem (0.5877472E~38, 0.0) = nan * (0.5877472E~38, ~0.34028235E39) = ~0.19999999E1 + (0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (0.5877472E~38, ~0.34028235E39) = ~0.0 nextAfter (0.5877472E~38, ~0.34028235E39) = 0.587747E~38 rem (0.5877472E~38, ~0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, ~0.17014117E39) = ~0.99999994 + (0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (0.5877472E~38, ~0.17014117E39) = ~0.0 nextAfter (0.5877472E~38, ~0.17014117E39) = 0.587747E~38 rem (0.5877472E~38, ~0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, ~0.123E4) = ~0.722929E~35 + (0.5877472E~38, ~0.123E4) = ~0.123E4 - (0.5877472E~38, ~0.123E4) = 0.123E4 / (0.5877472E~38, ~0.123E4) = ~0.4778E~41 nextAfter (0.5877472E~38, ~0.123E4) = 0.587747E~38 rem (0.5877472E~38, ~0.123E4) = 0.5877472E~38 * (0.5877472E~38, ~0.123E2) = ~0.72292904E~37 + (0.5877472E~38, ~0.123E2) = ~0.123E2 - (0.5877472E~38, ~0.123E2) = 0.123E2 / (0.5877472E~38, ~0.123E2) = ~0.477843E~39 nextAfter (0.5877472E~38, ~0.123E2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E2) = 0.5877472E~38 * (0.5877472E~38, ~0.31415927E1) = ~0.18464623E~37 + (0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (0.5877472E~38, ~0.31415927E1) = ~0.1870857E~38 nextAfter (0.5877472E~38, ~0.31415927E1) = 0.587747E~38 rem (0.5877472E~38, ~0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, ~0.27182817E1) = ~0.15976624E~37 + (0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (0.5877472E~38, ~0.27182817E1) = ~0.2162201E~38 nextAfter (0.5877472E~38, ~0.27182817E1) = 0.587747E~38 rem (0.5877472E~38, ~0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123E1) = ~0.722929E~38 + (0.5877472E~38, ~0.123E1) = ~0.123E1 - (0.5877472E~38, ~0.123E1) = 0.123E1 / (0.5877472E~38, ~0.123E1) = ~0.4778432E~38 nextAfter (0.5877472E~38, ~0.123E1) = 0.587747E~38 rem (0.5877472E~38, ~0.123E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123) = ~0.722928E~39 + (0.5877472E~38, ~0.123) = ~0.123 - (0.5877472E~38, ~0.123) = 0.123 / (0.5877472E~38, ~0.123) = ~0.4778432E~37 nextAfter (0.5877472E~38, ~0.123) = 0.587747E~38 rem (0.5877472E~38, ~0.123) = 0.5877472E~38 * (0.5877472E~38, ~0.123E~2) = ~0.7229E~41 + (0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (0.5877472E~38, ~0.123E~2) = 0.123E~2 / (0.5877472E~38, ~0.123E~2) = ~0.47784322E~35 nextAfter (0.5877472E~38, ~0.123E~2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E~2) = 0.5877472E~38 * (0.5877472E~38, ~0.11754944E~37) = ~0.0 + (0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 - (0.5877472E~38, ~0.11754944E~37) = 0.17632415E~37 / (0.5877472E~38, ~0.11754944E~37) = ~0.5 nextAfter (0.5877472E~38, ~0.11754944E~37) = 0.587747E~38 rem (0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, ~0.5877472E~38) = ~0.0 + (0.5877472E~38, ~0.5877472E~38) = 0.0 - (0.5877472E~38, ~0.5877472E~38) = 0.11754944E~37 / (0.5877472E~38, ~0.5877472E~38) = ~0.1E1 nextAfter (0.5877472E~38, ~0.5877472E~38) = 0.587747E~38 rem (0.5877472E~38, ~0.5877472E~38) = 0.0 * (0.5877472E~38, ~0.1E~44) = ~0.0 + (0.5877472E~38, ~0.1E~44) = 0.587747E~38 - (0.5877472E~38, ~0.1E~44) = 0.5877473E~38 / (0.5877472E~38, ~0.1E~44) = ~0.4194304E7 nextAfter (0.5877472E~38, ~0.1E~44) = 0.587747E~38 rem (0.5877472E~38, ~0.1E~44) = 0.0 * (0.5877472E~38, ~0.0) = ~0.0 + (0.5877472E~38, ~0.0) = 0.5877472E~38 - (0.5877472E~38, ~0.0) = 0.5877472E~38 / (0.5877472E~38, ~0.0) = ~inf nextAfter (0.5877472E~38, ~0.0) = 0.587747E~38 rem (0.5877472E~38, ~0.0) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.5877472E~38, ~inf) = ~inf + (0.5877472E~38, ~inf) = ~inf - (0.5877472E~38, ~inf) = inf / (0.5877472E~38, ~inf) = ~0.0 nextAfter (0.5877472E~38, ~inf) = 0.587747E~38 rem (0.5877472E~38, ~inf) = 0.5877472E~38 * (0.5877472E~38, nan) = nan + (0.5877472E~38, nan) = nan - (0.5877472E~38, nan) = nan / (0.5877472E~38, nan) = nan nextAfter (0.5877472E~38, nan) = nan rem (0.5877472E~38, nan) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.1E~44, 0.34028235E39) = 0.47683713E~6 + (0.1E~44, 0.34028235E39) = 0.34028235E39 - (0.1E~44, 0.34028235E39) = ~0.34028235E39 / (0.1E~44, 0.34028235E39) = 0.0 nextAfter (0.1E~44, 0.34028235E39) = 0.3E~44 rem (0.1E~44, 0.34028235E39) = 0.1E~44 * (0.1E~44, 0.17014117E39) = 0.23841856E~6 + (0.1E~44, 0.17014117E39) = 0.17014117E39 - (0.1E~44, 0.17014117E39) = ~0.17014117E39 / (0.1E~44, 0.17014117E39) = 0.0 nextAfter (0.1E~44, 0.17014117E39) = 0.3E~44 rem (0.1E~44, 0.17014117E39) = 0.1E~44 * (0.1E~44, 0.123E4) = 0.1724E~41 + (0.1E~44, 0.123E4) = 0.123E4 - (0.1E~44, 0.123E4) = ~0.123E4 / (0.1E~44, 0.123E4) = 0.0 nextAfter (0.1E~44, 0.123E4) = 0.3E~44 rem (0.1E~44, 0.123E4) = 0.1E~44 * (0.1E~44, 0.123E2) = 0.17E~43 + (0.1E~44, 0.123E2) = 0.123E2 - (0.1E~44, 0.123E2) = ~0.123E2 / (0.1E~44, 0.123E2) = 0.0 nextAfter (0.1E~44, 0.123E2) = 0.3E~44 rem (0.1E~44, 0.123E2) = 0.1E~44 * (0.1E~44, 0.31415927E1) = 0.4E~44 + (0.1E~44, 0.31415927E1) = 0.31415927E1 - (0.1E~44, 0.31415927E1) = ~0.31415927E1 / (0.1E~44, 0.31415927E1) = 0.0 nextAfter (0.1E~44, 0.31415927E1) = 0.3E~44 rem (0.1E~44, 0.31415927E1) = 0.1E~44 * (0.1E~44, 0.27182817E1) = 0.4E~44 + (0.1E~44, 0.27182817E1) = 0.27182817E1 - (0.1E~44, 0.27182817E1) = ~0.27182817E1 / (0.1E~44, 0.27182817E1) = 0.0 nextAfter (0.1E~44, 0.27182817E1) = 0.3E~44 rem (0.1E~44, 0.27182817E1) = 0.1E~44 * (0.1E~44, 0.123E1) = 0.1E~44 + (0.1E~44, 0.123E1) = 0.123E1 - (0.1E~44, 0.123E1) = ~0.123E1 / (0.1E~44, 0.123E1) = 0.1E~44 nextAfter (0.1E~44, 0.123E1) = 0.3E~44 rem (0.1E~44, 0.123E1) = 0.1E~44 * (0.1E~44, 0.123) = 0.0 + (0.1E~44, 0.123) = 0.123 - (0.1E~44, 0.123) = ~0.123 / (0.1E~44, 0.123) = 0.11E~43 nextAfter (0.1E~44, 0.123) = 0.3E~44 rem (0.1E~44, 0.123) = 0.1E~44 * (0.1E~44, 0.123E~2) = 0.0 + (0.1E~44, 0.123E~2) = 0.123E~2 - (0.1E~44, 0.123E~2) = ~0.123E~2 / (0.1E~44, 0.123E~2) = 0.1139E~41 nextAfter (0.1E~44, 0.123E~2) = 0.3E~44 rem (0.1E~44, 0.123E~2) = 0.1E~44 * (0.1E~44, 0.11754944E~37) = 0.0 + (0.1E~44, 0.11754944E~37) = 0.11754945E~37 - (0.1E~44, 0.11754944E~37) = ~0.11754942E~37 / (0.1E~44, 0.11754944E~37) = 0.11920929E~6 nextAfter (0.1E~44, 0.11754944E~37) = 0.3E~44 rem (0.1E~44, 0.11754944E~37) = 0.1E~44 * (0.1E~44, 0.5877472E~38) = 0.0 + (0.1E~44, 0.5877472E~38) = 0.5877473E~38 - (0.1E~44, 0.5877472E~38) = ~0.587747E~38 / (0.1E~44, 0.5877472E~38) = 0.23841858E~6 nextAfter (0.1E~44, 0.5877472E~38) = 0.3E~44 rem (0.1E~44, 0.5877472E~38) = 0.1E~44 * (0.1E~44, 0.1E~44) = 0.0 + (0.1E~44, 0.1E~44) = 0.3E~44 - (0.1E~44, 0.1E~44) = 0.0 / (0.1E~44, 0.1E~44) = 0.1E1 nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 rem (0.1E~44, 0.1E~44) = 0.0 * (0.1E~44, 0.0) = 0.0 + (0.1E~44, 0.0) = 0.1E~44 - (0.1E~44, 0.0) = 0.1E~44 / (0.1E~44, 0.0) = inf nextAfter (0.1E~44, 0.0) = 0.0 rem (0.1E~44, 0.0) = nan * (0.1E~44, ~0.34028235E39) = ~0.47683713E~6 + (0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (0.1E~44, ~0.34028235E39) = 0.34028235E39 / (0.1E~44, ~0.34028235E39) = ~0.0 nextAfter (0.1E~44, ~0.34028235E39) = 0.0 rem (0.1E~44, ~0.34028235E39) = 0.1E~44 * (0.1E~44, ~0.17014117E39) = ~0.23841856E~6 + (0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (0.1E~44, ~0.17014117E39) = 0.17014117E39 / (0.1E~44, ~0.17014117E39) = ~0.0 nextAfter (0.1E~44, ~0.17014117E39) = 0.0 rem (0.1E~44, ~0.17014117E39) = 0.1E~44 * (0.1E~44, ~0.123E4) = ~0.1724E~41 + (0.1E~44, ~0.123E4) = ~0.123E4 - (0.1E~44, ~0.123E4) = 0.123E4 / (0.1E~44, ~0.123E4) = ~0.0 nextAfter (0.1E~44, ~0.123E4) = 0.0 rem (0.1E~44, ~0.123E4) = 0.1E~44 * (0.1E~44, ~0.123E2) = ~0.17E~43 + (0.1E~44, ~0.123E2) = ~0.123E2 - (0.1E~44, ~0.123E2) = 0.123E2 / (0.1E~44, ~0.123E2) = ~0.0 nextAfter (0.1E~44, ~0.123E2) = 0.0 rem (0.1E~44, ~0.123E2) = 0.1E~44 * (0.1E~44, ~0.31415927E1) = ~0.4E~44 + (0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (0.1E~44, ~0.31415927E1) = 0.31415927E1 / (0.1E~44, ~0.31415927E1) = ~0.0 nextAfter (0.1E~44, ~0.31415927E1) = 0.0 rem (0.1E~44, ~0.31415927E1) = 0.1E~44 * (0.1E~44, ~0.27182817E1) = ~0.4E~44 + (0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (0.1E~44, ~0.27182817E1) = 0.27182817E1 / (0.1E~44, ~0.27182817E1) = ~0.0 nextAfter (0.1E~44, ~0.27182817E1) = 0.0 rem (0.1E~44, ~0.27182817E1) = 0.1E~44 * (0.1E~44, ~0.123E1) = ~0.1E~44 + (0.1E~44, ~0.123E1) = ~0.123E1 - (0.1E~44, ~0.123E1) = 0.123E1 / (0.1E~44, ~0.123E1) = ~0.1E~44 nextAfter (0.1E~44, ~0.123E1) = 0.0 rem (0.1E~44, ~0.123E1) = 0.1E~44 * (0.1E~44, ~0.123) = ~0.0 + (0.1E~44, ~0.123) = ~0.123 - (0.1E~44, ~0.123) = 0.123 / (0.1E~44, ~0.123) = ~0.11E~43 nextAfter (0.1E~44, ~0.123) = 0.0 rem (0.1E~44, ~0.123) = 0.1E~44 * (0.1E~44, ~0.123E~2) = ~0.0 + (0.1E~44, ~0.123E~2) = ~0.123E~2 - (0.1E~44, ~0.123E~2) = 0.123E~2 / (0.1E~44, ~0.123E~2) = ~0.1139E~41 nextAfter (0.1E~44, ~0.123E~2) = 0.0 rem (0.1E~44, ~0.123E~2) = 0.1E~44 * (0.1E~44, ~0.11754944E~37) = ~0.0 + (0.1E~44, ~0.11754944E~37) = ~0.11754942E~37 - (0.1E~44, ~0.11754944E~37) = 0.11754945E~37 / (0.1E~44, ~0.11754944E~37) = ~0.11920929E~6 nextAfter (0.1E~44, ~0.11754944E~37) = 0.0 rem (0.1E~44, ~0.11754944E~37) = 0.1E~44 * (0.1E~44, ~0.5877472E~38) = ~0.0 + (0.1E~44, ~0.5877472E~38) = ~0.587747E~38 - (0.1E~44, ~0.5877472E~38) = 0.5877473E~38 / (0.1E~44, ~0.5877472E~38) = ~0.23841858E~6 nextAfter (0.1E~44, ~0.5877472E~38) = 0.0 rem (0.1E~44, ~0.5877472E~38) = 0.1E~44 * (0.1E~44, ~0.1E~44) = ~0.0 + (0.1E~44, ~0.1E~44) = 0.0 - (0.1E~44, ~0.1E~44) = 0.3E~44 / (0.1E~44, ~0.1E~44) = ~0.1E1 nextAfter (0.1E~44, ~0.1E~44) = 0.0 rem (0.1E~44, ~0.1E~44) = 0.0 * (0.1E~44, ~0.0) = ~0.0 + (0.1E~44, ~0.0) = 0.1E~44 - (0.1E~44, ~0.0) = 0.1E~44 / (0.1E~44, ~0.0) = ~inf nextAfter (0.1E~44, ~0.0) = 0.0 rem (0.1E~44, ~0.0) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.1E~44, ~inf) = ~inf + (0.1E~44, ~inf) = ~inf - (0.1E~44, ~inf) = inf / (0.1E~44, ~inf) = ~0.0 nextAfter (0.1E~44, ~inf) = 0.0 rem (0.1E~44, ~inf) = 0.1E~44 * (0.1E~44, nan) = nan + (0.1E~44, nan) = nan - (0.1E~44, nan) = nan / (0.1E~44, nan) = nan nextAfter (0.1E~44, nan) = nan rem (0.1E~44, nan) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.0, 0.34028235E39) = 0.0 + (0.0, 0.34028235E39) = 0.34028235E39 - (0.0, 0.34028235E39) = ~0.34028235E39 / (0.0, 0.34028235E39) = 0.0 nextAfter (0.0, 0.34028235E39) = 0.1E~44 rem (0.0, 0.34028235E39) = 0.0 * (0.0, 0.17014117E39) = 0.0 + (0.0, 0.17014117E39) = 0.17014117E39 - (0.0, 0.17014117E39) = ~0.17014117E39 / (0.0, 0.17014117E39) = 0.0 nextAfter (0.0, 0.17014117E39) = 0.1E~44 rem (0.0, 0.17014117E39) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.1E~44 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.1E~44 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.31415927E1) = 0.0 + (0.0, 0.31415927E1) = 0.31415927E1 - (0.0, 0.31415927E1) = ~0.31415927E1 / (0.0, 0.31415927E1) = 0.0 nextAfter (0.0, 0.31415927E1) = 0.1E~44 rem (0.0, 0.31415927E1) = 0.0 * (0.0, 0.27182817E1) = 0.0 + (0.0, 0.27182817E1) = 0.27182817E1 - (0.0, 0.27182817E1) = ~0.27182817E1 / (0.0, 0.27182817E1) = 0.0 nextAfter (0.0, 0.27182817E1) = 0.1E~44 rem (0.0, 0.27182817E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.1E~44 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.1E~44 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.1E~44 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.11754944E~37) = 0.0 + (0.0, 0.11754944E~37) = 0.11754944E~37 - (0.0, 0.11754944E~37) = ~0.11754944E~37 / (0.0, 0.11754944E~37) = 0.0 nextAfter (0.0, 0.11754944E~37) = 0.1E~44 rem (0.0, 0.11754944E~37) = 0.0 * (0.0, 0.5877472E~38) = 0.0 + (0.0, 0.5877472E~38) = 0.5877472E~38 - (0.0, 0.5877472E~38) = ~0.5877472E~38 / (0.0, 0.5877472E~38) = 0.0 nextAfter (0.0, 0.5877472E~38) = 0.1E~44 rem (0.0, 0.5877472E~38) = 0.0 * (0.0, 0.1E~44) = 0.0 + (0.0, 0.1E~44) = 0.1E~44 - (0.0, 0.1E~44) = ~0.1E~44 / (0.0, 0.1E~44) = 0.0 nextAfter (0.0, 0.1E~44) = 0.1E~44 rem (0.0, 0.1E~44) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.34028235E39) = ~0.0 + (0.0, ~0.34028235E39) = ~0.34028235E39 - (0.0, ~0.34028235E39) = 0.34028235E39 / (0.0, ~0.34028235E39) = ~0.0 nextAfter (0.0, ~0.34028235E39) = ~0.1E~44 rem (0.0, ~0.34028235E39) = 0.0 * (0.0, ~0.17014117E39) = ~0.0 + (0.0, ~0.17014117E39) = ~0.17014117E39 - (0.0, ~0.17014117E39) = 0.17014117E39 / (0.0, ~0.17014117E39) = ~0.0 nextAfter (0.0, ~0.17014117E39) = ~0.1E~44 rem (0.0, ~0.17014117E39) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.1E~44 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.1E~44 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.31415927E1) = ~0.0 + (0.0, ~0.31415927E1) = ~0.31415927E1 - (0.0, ~0.31415927E1) = 0.31415927E1 / (0.0, ~0.31415927E1) = ~0.0 nextAfter (0.0, ~0.31415927E1) = ~0.1E~44 rem (0.0, ~0.31415927E1) = 0.0 * (0.0, ~0.27182817E1) = ~0.0 + (0.0, ~0.27182817E1) = ~0.27182817E1 - (0.0, ~0.27182817E1) = 0.27182817E1 / (0.0, ~0.27182817E1) = ~0.0 nextAfter (0.0, ~0.27182817E1) = ~0.1E~44 rem (0.0, ~0.27182817E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.1E~44 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.1E~44 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.1E~44 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.11754944E~37) = ~0.0 + (0.0, ~0.11754944E~37) = ~0.11754944E~37 - (0.0, ~0.11754944E~37) = 0.11754944E~37 / (0.0, ~0.11754944E~37) = ~0.0 nextAfter (0.0, ~0.11754944E~37) = ~0.1E~44 rem (0.0, ~0.11754944E~37) = 0.0 * (0.0, ~0.5877472E~38) = ~0.0 + (0.0, ~0.5877472E~38) = ~0.5877472E~38 - (0.0, ~0.5877472E~38) = 0.5877472E~38 / (0.0, ~0.5877472E~38) = ~0.0 nextAfter (0.0, ~0.5877472E~38) = ~0.1E~44 rem (0.0, ~0.5877472E~38) = 0.0 * (0.0, ~0.1E~44) = ~0.0 + (0.0, ~0.1E~44) = ~0.1E~44 - (0.0, ~0.1E~44) = 0.1E~44 / (0.0, ~0.1E~44) = ~0.0 nextAfter (0.0, ~0.1E~44) = ~0.1E~44 rem (0.0, ~0.1E~44) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.1E~44 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (~0.34028235E39, 0.34028235E39) = ~inf + (~0.34028235E39, 0.34028235E39) = 0.0 - (~0.34028235E39, 0.34028235E39) = ~inf / (~0.34028235E39, 0.34028235E39) = ~0.1E1 nextAfter (~0.34028235E39, 0.34028235E39) = ~0.34028233E39 rem (~0.34028235E39, 0.34028235E39) = 0.0 * (~0.34028235E39, 0.17014117E39) = ~inf + (~0.34028235E39, 0.17014117E39) = ~0.17014117E39 - (~0.34028235E39, 0.17014117E39) = ~inf / (~0.34028235E39, 0.17014117E39) = ~0.2E1 nextAfter (~0.34028235E39, 0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, 0.17014117E39) = 0.0 * (~0.34028235E39, 0.123E4) = ~inf + (~0.34028235E39, 0.123E4) = ~0.34028235E39 - (~0.34028235E39, 0.123E4) = ~0.34028235E39 / (~0.34028235E39, 0.123E4) = ~0.2766523E36 nextAfter (~0.34028235E39, 0.123E4) = ~0.34028233E39 rem (~0.34028235E39, 0.123E4) = ~0.2028241E32 * (~0.34028235E39, 0.123E2) = ~inf + (~0.34028235E39, 0.123E2) = ~0.34028235E39 - (~0.34028235E39, 0.123E2) = ~0.34028235E39 / (~0.34028235E39, 0.123E2) = ~0.27665232E38 nextAfter (~0.34028235E39, 0.123E2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E2) = inf * (~0.34028235E39, 0.31415927E1) = ~inf + (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, 0.31415927E1) = ~0.10831523E39 nextAfter (~0.34028235E39, 0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, 0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, 0.27182817E1) = ~inf + (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, 0.27182817E1) = ~0.12518288E39 nextAfter (~0.34028235E39, 0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, 0.27182817E1) = 0.0 * (~0.34028235E39, 0.123E1) = ~inf + (~0.34028235E39, 0.123E1) = ~0.34028235E39 - (~0.34028235E39, 0.123E1) = ~0.34028235E39 / (~0.34028235E39, 0.123E1) = ~0.27665231E39 nextAfter (~0.34028235E39, 0.123E1) = ~0.34028233E39 rem (~0.34028235E39, 0.123E1) = 0.0 * (~0.34028235E39, 0.123) = ~0.4185473E38 + (~0.34028235E39, 0.123) = ~0.34028235E39 - (~0.34028235E39, 0.123) = ~0.34028235E39 / (~0.34028235E39, 0.123) = ~inf nextAfter (~0.34028235E39, 0.123) = ~0.34028233E39 rem (~0.34028235E39, 0.123) = inf * (~0.34028235E39, 0.123E~2) = ~0.4185473E36 + (~0.34028235E39, 0.123E~2) = ~0.34028235E39 - (~0.34028235E39, 0.123E~2) = ~0.34028235E39 / (~0.34028235E39, 0.123E~2) = ~inf nextAfter (~0.34028235E39, 0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E~2) = inf * (~0.34028235E39, 0.11754944E~37) = ~0.39999998E1 + (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, 0.11754944E~37) = ~inf nextAfter (~0.34028235E39, 0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, 0.11754944E~37) = inf * (~0.34028235E39, 0.5877472E~38) = ~0.19999999E1 + (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, 0.5877472E~38) = ~inf nextAfter (~0.34028235E39, 0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, 0.5877472E~38) = inf * (~0.34028235E39, 0.1E~44) = ~0.47683713E~6 + (~0.34028235E39, 0.1E~44) = ~0.34028235E39 - (~0.34028235E39, 0.1E~44) = ~0.34028235E39 / (~0.34028235E39, 0.1E~44) = ~inf nextAfter (~0.34028235E39, 0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, 0.1E~44) = inf * (~0.34028235E39, 0.0) = ~0.0 + (~0.34028235E39, 0.0) = ~0.34028235E39 - (~0.34028235E39, 0.0) = ~0.34028235E39 / (~0.34028235E39, 0.0) = ~inf nextAfter (~0.34028235E39, 0.0) = ~0.34028233E39 rem (~0.34028235E39, 0.0) = nan * (~0.34028235E39, ~0.34028235E39) = inf + (~0.34028235E39, ~0.34028235E39) = ~inf - (~0.34028235E39, ~0.34028235E39) = 0.0 / (~0.34028235E39, ~0.34028235E39) = 0.1E1 nextAfter (~0.34028235E39, ~0.34028235E39) = ~0.34028235E39 rem (~0.34028235E39, ~0.34028235E39) = 0.0 * (~0.34028235E39, ~0.17014117E39) = inf + (~0.34028235E39, ~0.17014117E39) = ~inf - (~0.34028235E39, ~0.17014117E39) = ~0.17014117E39 / (~0.34028235E39, ~0.17014117E39) = 0.2E1 nextAfter (~0.34028235E39, ~0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, ~0.17014117E39) = 0.0 * (~0.34028235E39, ~0.123E4) = inf + (~0.34028235E39, ~0.123E4) = ~0.34028235E39 - (~0.34028235E39, ~0.123E4) = ~0.34028235E39 / (~0.34028235E39, ~0.123E4) = 0.2766523E36 nextAfter (~0.34028235E39, ~0.123E4) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E4) = ~0.2028241E32 * (~0.34028235E39, ~0.123E2) = inf + (~0.34028235E39, ~0.123E2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E2) = 0.27665232E38 nextAfter (~0.34028235E39, ~0.123E2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E2) = inf * (~0.34028235E39, ~0.31415927E1) = inf + (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, ~0.31415927E1) = 0.10831523E39 nextAfter (~0.34028235E39, ~0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, ~0.27182817E1) = inf + (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, ~0.27182817E1) = 0.12518288E39 nextAfter (~0.34028235E39, ~0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.27182817E1) = 0.0 * (~0.34028235E39, ~0.123E1) = inf + (~0.34028235E39, ~0.123E1) = ~0.34028235E39 - (~0.34028235E39, ~0.123E1) = ~0.34028235E39 / (~0.34028235E39, ~0.123E1) = 0.27665231E39 nextAfter (~0.34028235E39, ~0.123E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E1) = 0.0 * (~0.34028235E39, ~0.123) = 0.4185473E38 + (~0.34028235E39, ~0.123) = ~0.34028235E39 - (~0.34028235E39, ~0.123) = ~0.34028235E39 / (~0.34028235E39, ~0.123) = inf nextAfter (~0.34028235E39, ~0.123) = ~0.34028233E39 rem (~0.34028235E39, ~0.123) = inf * (~0.34028235E39, ~0.123E~2) = 0.4185473E36 + (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E~2) = inf nextAfter (~0.34028235E39, ~0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E~2) = inf * (~0.34028235E39, ~0.11754944E~37) = 0.39999998E1 + (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, ~0.11754944E~37) = inf nextAfter (~0.34028235E39, ~0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, ~0.11754944E~37) = inf * (~0.34028235E39, ~0.5877472E~38) = 0.19999999E1 + (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, ~0.5877472E~38) = inf nextAfter (~0.34028235E39, ~0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, ~0.5877472E~38) = inf * (~0.34028235E39, ~0.1E~44) = 0.47683713E~6 + (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 - (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 / (~0.34028235E39, ~0.1E~44) = inf nextAfter (~0.34028235E39, ~0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, ~0.1E~44) = inf * (~0.34028235E39, ~0.0) = 0.0 + (~0.34028235E39, ~0.0) = ~0.34028235E39 - (~0.34028235E39, ~0.0) = ~0.34028235E39 / (~0.34028235E39, ~0.0) = inf nextAfter (~0.34028235E39, ~0.0) = ~0.34028233E39 rem (~0.34028235E39, ~0.0) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.34028235E39, ~inf) = inf + (~0.34028235E39, ~inf) = ~inf - (~0.34028235E39, ~inf) = inf / (~0.34028235E39, ~inf) = 0.0 nextAfter (~0.34028235E39, ~inf) = ~inf rem (~0.34028235E39, ~inf) = ~0.34028235E39 * (~0.34028235E39, nan) = nan + (~0.34028235E39, nan) = nan - (~0.34028235E39, nan) = nan / (~0.34028235E39, nan) = nan nextAfter (~0.34028235E39, nan) = nan rem (~0.34028235E39, nan) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.17014117E39, 0.34028235E39) = ~inf + (~0.17014117E39, 0.34028235E39) = 0.17014117E39 - (~0.17014117E39, 0.34028235E39) = ~inf / (~0.17014117E39, 0.34028235E39) = ~0.5 nextAfter (~0.17014117E39, 0.34028235E39) = ~0.17014116E39 rem (~0.17014117E39, 0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, 0.17014117E39) = ~inf + (~0.17014117E39, 0.17014117E39) = 0.0 - (~0.17014117E39, 0.17014117E39) = ~0.34028235E39 / (~0.17014117E39, 0.17014117E39) = ~0.1E1 nextAfter (~0.17014117E39, 0.17014117E39) = ~0.17014116E39 rem (~0.17014117E39, 0.17014117E39) = 0.0 * (~0.17014117E39, 0.123E4) = ~inf + (~0.17014117E39, 0.123E4) = ~0.17014117E39 - (~0.17014117E39, 0.123E4) = ~0.17014117E39 / (~0.17014117E39, 0.123E4) = ~0.13832615E36 nextAfter (~0.17014117E39, 0.123E4) = ~0.17014116E39 rem (~0.17014117E39, 0.123E4) = ~0.10141205E32 * (~0.17014117E39, 0.123E2) = ~inf + (~0.17014117E39, 0.123E2) = ~0.17014117E39 - (~0.17014117E39, 0.123E2) = ~0.17014117E39 / (~0.17014117E39, 0.123E2) = ~0.13832616E38 nextAfter (~0.17014117E39, 0.123E2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E2) = 0.10141205E32 * (~0.17014117E39, 0.31415927E1) = ~inf + (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, 0.31415927E1) = ~0.54157613E38 nextAfter (~0.17014117E39, 0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, 0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, 0.27182817E1) = ~inf + (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, 0.27182817E1) = ~0.6259144E38 nextAfter (~0.17014117E39, 0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, 0.27182817E1) = 0.0 * (~0.17014117E39, 0.123E1) = ~0.20927364E39 + (~0.17014117E39, 0.123E1) = ~0.17014117E39 - (~0.17014117E39, 0.123E1) = ~0.17014117E39 / (~0.17014117E39, 0.123E1) = ~0.13832616E39 nextAfter (~0.17014117E39, 0.123E1) = ~0.17014116E39 rem (~0.17014117E39, 0.123E1) = 0.0 * (~0.17014117E39, 0.123) = ~0.20927365E38 + (~0.17014117E39, 0.123) = ~0.17014117E39 - (~0.17014117E39, 0.123) = ~0.17014117E39 / (~0.17014117E39, 0.123) = ~inf nextAfter (~0.17014117E39, 0.123) = ~0.17014116E39 rem (~0.17014117E39, 0.123) = inf * (~0.17014117E39, 0.123E~2) = ~0.20927364E36 + (~0.17014117E39, 0.123E~2) = ~0.17014117E39 - (~0.17014117E39, 0.123E~2) = ~0.17014117E39 / (~0.17014117E39, 0.123E~2) = ~inf nextAfter (~0.17014117E39, 0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E~2) = inf * (~0.17014117E39, 0.11754944E~37) = ~0.19999999E1 + (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, 0.11754944E~37) = ~inf nextAfter (~0.17014117E39, 0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, 0.11754944E~37) = inf * (~0.17014117E39, 0.5877472E~38) = ~0.99999994 + (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, 0.5877472E~38) = ~inf nextAfter (~0.17014117E39, 0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, 0.5877472E~38) = inf * (~0.17014117E39, 0.1E~44) = ~0.23841856E~6 + (~0.17014117E39, 0.1E~44) = ~0.17014117E39 - (~0.17014117E39, 0.1E~44) = ~0.17014117E39 / (~0.17014117E39, 0.1E~44) = ~inf nextAfter (~0.17014117E39, 0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, 0.1E~44) = inf * (~0.17014117E39, 0.0) = ~0.0 + (~0.17014117E39, 0.0) = ~0.17014117E39 - (~0.17014117E39, 0.0) = ~0.17014117E39 / (~0.17014117E39, 0.0) = ~inf nextAfter (~0.17014117E39, 0.0) = ~0.17014116E39 rem (~0.17014117E39, 0.0) = nan * (~0.17014117E39, ~0.34028235E39) = inf + (~0.17014117E39, ~0.34028235E39) = ~inf - (~0.17014117E39, ~0.34028235E39) = 0.17014117E39 / (~0.17014117E39, ~0.34028235E39) = 0.5 nextAfter (~0.17014117E39, ~0.34028235E39) = ~0.17014118E39 rem (~0.17014117E39, ~0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, ~0.17014117E39) = inf + (~0.17014117E39, ~0.17014117E39) = ~0.34028235E39 - (~0.17014117E39, ~0.17014117E39) = 0.0 / (~0.17014117E39, ~0.17014117E39) = 0.1E1 nextAfter (~0.17014117E39, ~0.17014117E39) = ~0.17014117E39 rem (~0.17014117E39, ~0.17014117E39) = 0.0 * (~0.17014117E39, ~0.123E4) = inf + (~0.17014117E39, ~0.123E4) = ~0.17014117E39 - (~0.17014117E39, ~0.123E4) = ~0.17014117E39 / (~0.17014117E39, ~0.123E4) = 0.13832615E36 nextAfter (~0.17014117E39, ~0.123E4) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E4) = ~0.10141205E32 * (~0.17014117E39, ~0.123E2) = inf + (~0.17014117E39, ~0.123E2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E2) = 0.13832616E38 nextAfter (~0.17014117E39, ~0.123E2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E2) = 0.10141205E32 * (~0.17014117E39, ~0.31415927E1) = inf + (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, ~0.31415927E1) = 0.54157613E38 nextAfter (~0.17014117E39, ~0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, ~0.27182817E1) = inf + (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, ~0.27182817E1) = 0.6259144E38 nextAfter (~0.17014117E39, ~0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.27182817E1) = 0.0 * (~0.17014117E39, ~0.123E1) = 0.20927364E39 + (~0.17014117E39, ~0.123E1) = ~0.17014117E39 - (~0.17014117E39, ~0.123E1) = ~0.17014117E39 / (~0.17014117E39, ~0.123E1) = 0.13832616E39 nextAfter (~0.17014117E39, ~0.123E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E1) = 0.0 * (~0.17014117E39, ~0.123) = 0.20927365E38 + (~0.17014117E39, ~0.123) = ~0.17014117E39 - (~0.17014117E39, ~0.123) = ~0.17014117E39 / (~0.17014117E39, ~0.123) = inf nextAfter (~0.17014117E39, ~0.123) = ~0.17014116E39 rem (~0.17014117E39, ~0.123) = inf * (~0.17014117E39, ~0.123E~2) = 0.20927364E36 + (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E~2) = inf nextAfter (~0.17014117E39, ~0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E~2) = inf * (~0.17014117E39, ~0.11754944E~37) = 0.19999999E1 + (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, ~0.11754944E~37) = inf nextAfter (~0.17014117E39, ~0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, ~0.11754944E~37) = inf * (~0.17014117E39, ~0.5877472E~38) = 0.99999994 + (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, ~0.5877472E~38) = inf nextAfter (~0.17014117E39, ~0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, ~0.5877472E~38) = inf * (~0.17014117E39, ~0.1E~44) = 0.23841856E~6 + (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 - (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 / (~0.17014117E39, ~0.1E~44) = inf nextAfter (~0.17014117E39, ~0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, ~0.1E~44) = inf * (~0.17014117E39, ~0.0) = 0.0 + (~0.17014117E39, ~0.0) = ~0.17014117E39 - (~0.17014117E39, ~0.0) = ~0.17014117E39 / (~0.17014117E39, ~0.0) = inf nextAfter (~0.17014117E39, ~0.0) = ~0.17014116E39 rem (~0.17014117E39, ~0.0) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.17014117E39, ~inf) = inf + (~0.17014117E39, ~inf) = ~inf - (~0.17014117E39, ~inf) = inf / (~0.17014117E39, ~inf) = 0.0 nextAfter (~0.17014117E39, ~inf) = ~0.17014118E39 rem (~0.17014117E39, ~inf) = ~0.17014117E39 * (~0.17014117E39, nan) = nan + (~0.17014117E39, nan) = nan - (~0.17014117E39, nan) = nan / (~0.17014117E39, nan) = nan nextAfter (~0.17014117E39, nan) = nan rem (~0.17014117E39, nan) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.123E4, 0.34028235E39) = ~inf + (~0.123E4, 0.34028235E39) = 0.34028235E39 - (~0.123E4, 0.34028235E39) = ~0.34028235E39 / (~0.123E4, 0.34028235E39) = ~0.36146455E~35 nextAfter (~0.123E4, 0.34028235E39) = ~0.12299999E4 rem (~0.123E4, 0.34028235E39) = ~0.123E4 * (~0.123E4, 0.17014117E39) = ~inf + (~0.123E4, 0.17014117E39) = 0.17014117E39 - (~0.123E4, 0.17014117E39) = ~0.17014117E39 / (~0.123E4, 0.17014117E39) = ~0.7229291E~35 nextAfter (~0.123E4, 0.17014117E39) = ~0.12299999E4 rem (~0.123E4, 0.17014117E39) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.31415927E1) = ~0.38641592E4 + (~0.123E4, 0.31415927E1) = ~0.12268584E4 - (~0.123E4, 0.31415927E1) = ~0.12331416E4 / (~0.123E4, 0.31415927E1) = ~0.39152115E3 nextAfter (~0.123E4, 0.31415927E1) = ~0.12299999E4 rem (~0.123E4, 0.31415927E1) = ~0.1637207E1 * (~0.123E4, 0.27182817E1) = ~0.33434866E4 + (~0.123E4, 0.27182817E1) = ~0.12272817E4 - (~0.123E4, 0.27182817E1) = ~0.12327183E4 / (~0.123E4, 0.27182817E1) = ~0.45249173E3 nextAfter (~0.123E4, 0.27182817E1) = ~0.12299999E4 rem (~0.123E4, 0.27182817E1) = ~0.13366699E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129001E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129001E1 + (~0.123E4, 0.123E~2) = ~0.12299988E4 - (~0.123E4, 0.123E~2) = ~0.12300012E4 / (~0.123E4, 0.123E~2) = ~0.99999994E6 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999E4 rem (~0.123E4, 0.123E~2) = ~0.12207031E~2 * (~0.123E4, 0.11754944E~37) = ~0.1445858E~34 + (~0.123E4, 0.11754944E~37) = ~0.123E4 - (~0.123E4, 0.11754944E~37) = ~0.123E4 / (~0.123E4, 0.11754944E~37) = ~inf nextAfter (~0.123E4, 0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, 0.11754944E~37) = inf * (~0.123E4, 0.5877472E~38) = ~0.722929E~35 + (~0.123E4, 0.5877472E~38) = ~0.123E4 - (~0.123E4, 0.5877472E~38) = ~0.123E4 / (~0.123E4, 0.5877472E~38) = ~inf nextAfter (~0.123E4, 0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, 0.5877472E~38) = inf * (~0.123E4, 0.1E~44) = ~0.1724E~41 + (~0.123E4, 0.1E~44) = ~0.123E4 - (~0.123E4, 0.1E~44) = ~0.123E4 / (~0.123E4, 0.1E~44) = ~inf nextAfter (~0.123E4, 0.1E~44) = ~0.12299999E4 rem (~0.123E4, 0.1E~44) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.34028235E39) = inf + (~0.123E4, ~0.34028235E39) = ~0.34028235E39 - (~0.123E4, ~0.34028235E39) = 0.34028235E39 / (~0.123E4, ~0.34028235E39) = 0.36146455E~35 nextAfter (~0.123E4, ~0.34028235E39) = ~0.12300001E4 rem (~0.123E4, ~0.34028235E39) = ~0.123E4 * (~0.123E4, ~0.17014117E39) = inf + (~0.123E4, ~0.17014117E39) = ~0.17014117E39 - (~0.123E4, ~0.17014117E39) = 0.17014117E39 / (~0.123E4, ~0.17014117E39) = 0.7229291E~35 nextAfter (~0.123E4, ~0.17014117E39) = ~0.12300001E4 rem (~0.123E4, ~0.17014117E39) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.31415927E1) = 0.38641592E4 + (~0.123E4, ~0.31415927E1) = ~0.12331416E4 - (~0.123E4, ~0.31415927E1) = ~0.12268584E4 / (~0.123E4, ~0.31415927E1) = 0.39152115E3 nextAfter (~0.123E4, ~0.31415927E1) = ~0.12299999E4 rem (~0.123E4, ~0.31415927E1) = ~0.1637207E1 * (~0.123E4, ~0.27182817E1) = 0.33434866E4 + (~0.123E4, ~0.27182817E1) = ~0.12327183E4 - (~0.123E4, ~0.27182817E1) = ~0.12272817E4 / (~0.123E4, ~0.27182817E1) = 0.45249173E3 nextAfter (~0.123E4, ~0.27182817E1) = ~0.12299999E4 rem (~0.123E4, ~0.27182817E1) = ~0.13366699E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129001E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129001E1 + (~0.123E4, ~0.123E~2) = ~0.12300012E4 - (~0.123E4, ~0.123E~2) = ~0.12299988E4 / (~0.123E4, ~0.123E~2) = 0.99999994E6 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999E4 rem (~0.123E4, ~0.123E~2) = ~0.12207031E~2 * (~0.123E4, ~0.11754944E~37) = 0.1445858E~34 + (~0.123E4, ~0.11754944E~37) = ~0.123E4 - (~0.123E4, ~0.11754944E~37) = ~0.123E4 / (~0.123E4, ~0.11754944E~37) = inf nextAfter (~0.123E4, ~0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, ~0.11754944E~37) = inf * (~0.123E4, ~0.5877472E~38) = 0.722929E~35 + (~0.123E4, ~0.5877472E~38) = ~0.123E4 - (~0.123E4, ~0.5877472E~38) = ~0.123E4 / (~0.123E4, ~0.5877472E~38) = inf nextAfter (~0.123E4, ~0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, ~0.5877472E~38) = inf * (~0.123E4, ~0.1E~44) = 0.1724E~41 + (~0.123E4, ~0.1E~44) = ~0.123E4 - (~0.123E4, ~0.1E~44) = ~0.123E4 / (~0.123E4, ~0.1E~44) = inf nextAfter (~0.123E4, ~0.1E~44) = ~0.12299999E4 rem (~0.123E4, ~0.1E~44) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300001E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.34028235E39) = ~inf + (~0.123E2, 0.34028235E39) = 0.34028235E39 - (~0.123E2, 0.34028235E39) = ~0.34028235E39 / (~0.123E2, 0.34028235E39) = ~0.36146455E~37 nextAfter (~0.123E2, 0.34028235E39) = ~0.12299999E2 rem (~0.123E2, 0.34028235E39) = ~0.123E2 * (~0.123E2, 0.17014117E39) = ~inf + (~0.123E2, 0.17014117E39) = 0.17014117E39 - (~0.123E2, 0.17014117E39) = ~0.17014117E39 / (~0.123E2, 0.17014117E39) = ~0.7229291E~37 nextAfter (~0.123E2, 0.17014117E39) = ~0.12299999E2 rem (~0.123E2, 0.17014117E39) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129001E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.31415927E1) = ~0.3864159E2 + (~0.123E2, 0.31415927E1) = ~0.9158407E1 - (~0.123E2, 0.31415927E1) = ~0.15441593E2 / (~0.123E2, 0.31415927E1) = ~0.39152114E1 nextAfter (~0.123E2, 0.31415927E1) = ~0.12299999E2 rem (~0.123E2, 0.31415927E1) = ~0.28752222E1 * (~0.123E2, 0.27182817E1) = ~0.33434868E2 + (~0.123E2, 0.27182817E1) = ~0.9581718E1 - (~0.123E2, 0.27182817E1) = ~0.15018282E2 / (~0.123E2, 0.27182817E1) = ~0.4524917E1 nextAfter (~0.123E2, 0.27182817E1) = ~0.12299999E2 rem (~0.123E2, 0.27182817E1) = ~0.14268732E1 * (~0.123E2, 0.123E1) = ~0.15129001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129001E1 + (~0.123E2, 0.123) = ~0.12177E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.1E3 nextAfter (~0.123E2, 0.123) = ~0.12299999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129001E~1 + (~0.123E2, 0.123E~2) = ~0.1229877E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999E2 rem (~0.123E2, 0.123E~2) = 0.0 * (~0.123E2, 0.11754944E~37) = ~0.14458581E~36 + (~0.123E2, 0.11754944E~37) = ~0.123E2 - (~0.123E2, 0.11754944E~37) = ~0.123E2 / (~0.123E2, 0.11754944E~37) = ~inf nextAfter (~0.123E2, 0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, 0.11754944E~37) = inf * (~0.123E2, 0.5877472E~38) = ~0.72292904E~37 + (~0.123E2, 0.5877472E~38) = ~0.123E2 - (~0.123E2, 0.5877472E~38) = ~0.123E2 / (~0.123E2, 0.5877472E~38) = ~inf nextAfter (~0.123E2, 0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, 0.5877472E~38) = inf * (~0.123E2, 0.1E~44) = ~0.17E~43 + (~0.123E2, 0.1E~44) = ~0.123E2 - (~0.123E2, 0.1E~44) = ~0.123E2 / (~0.123E2, 0.1E~44) = ~inf nextAfter (~0.123E2, 0.1E~44) = ~0.12299999E2 rem (~0.123E2, 0.1E~44) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.34028235E39) = inf + (~0.123E2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E2, ~0.34028235E39) = 0.34028235E39 / (~0.123E2, ~0.34028235E39) = 0.36146455E~37 nextAfter (~0.123E2, ~0.34028235E39) = ~0.12300001E2 rem (~0.123E2, ~0.34028235E39) = ~0.123E2 * (~0.123E2, ~0.17014117E39) = inf + (~0.123E2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E2, ~0.17014117E39) = 0.17014117E39 / (~0.123E2, ~0.17014117E39) = 0.7229291E~37 nextAfter (~0.123E2, ~0.17014117E39) = ~0.12300001E2 rem (~0.123E2, ~0.17014117E39) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300001E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129001E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.31415927E1) = 0.3864159E2 + (~0.123E2, ~0.31415927E1) = ~0.15441593E2 - (~0.123E2, ~0.31415927E1) = ~0.9158407E1 / (~0.123E2, ~0.31415927E1) = 0.39152114E1 nextAfter (~0.123E2, ~0.31415927E1) = ~0.12299999E2 rem (~0.123E2, ~0.31415927E1) = ~0.28752222E1 * (~0.123E2, ~0.27182817E1) = 0.33434868E2 + (~0.123E2, ~0.27182817E1) = ~0.15018282E2 - (~0.123E2, ~0.27182817E1) = ~0.9581718E1 / (~0.123E2, ~0.27182817E1) = 0.4524917E1 nextAfter (~0.123E2, ~0.27182817E1) = ~0.12299999E2 rem (~0.123E2, ~0.27182817E1) = ~0.14268732E1 * (~0.123E2, ~0.123E1) = 0.15129001E2 + (~0.123E2, ~0.123E1) = ~0.13530001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177E2 / (~0.123E2, ~0.123) = 0.1E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129001E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.1229877E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999E2 rem (~0.123E2, ~0.123E~2) = 0.0 * (~0.123E2, ~0.11754944E~37) = 0.14458581E~36 + (~0.123E2, ~0.11754944E~37) = ~0.123E2 - (~0.123E2, ~0.11754944E~37) = ~0.123E2 / (~0.123E2, ~0.11754944E~37) = inf nextAfter (~0.123E2, ~0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, ~0.11754944E~37) = inf * (~0.123E2, ~0.5877472E~38) = 0.72292904E~37 + (~0.123E2, ~0.5877472E~38) = ~0.123E2 - (~0.123E2, ~0.5877472E~38) = ~0.123E2 / (~0.123E2, ~0.5877472E~38) = inf nextAfter (~0.123E2, ~0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, ~0.5877472E~38) = inf * (~0.123E2, ~0.1E~44) = 0.17E~43 + (~0.123E2, ~0.1E~44) = ~0.123E2 - (~0.123E2, ~0.1E~44) = ~0.123E2 / (~0.123E2, ~0.1E~44) = inf nextAfter (~0.123E2, ~0.1E~44) = ~0.12299999E2 rem (~0.123E2, ~0.1E~44) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300001E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.31415927E1, 0.34028235E39) = ~inf + (~0.31415927E1, 0.34028235E39) = 0.34028235E39 - (~0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (~0.31415927E1, 0.34028235E39) = ~0.9232312E~38 nextAfter (~0.31415927E1, 0.34028235E39) = ~0.31415925E1 rem (~0.31415927E1, 0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, 0.17014117E39) = ~inf + (~0.31415927E1, 0.17014117E39) = 0.17014117E39 - (~0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (~0.31415927E1, 0.17014117E39) = ~0.18464624E~37 nextAfter (~0.31415927E1, 0.17014117E39) = ~0.31415925E1 rem (~0.31415927E1, 0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, 0.123E4) = ~0.38641592E4 + (~0.31415927E1, 0.123E4) = 0.12268584E4 - (~0.31415927E1, 0.123E4) = ~0.12331416E4 / (~0.31415927E1, 0.123E4) = ~0.25541405E~2 nextAfter (~0.31415927E1, 0.123E4) = ~0.31415925E1 rem (~0.31415927E1, 0.123E4) = ~0.31415927E1 * (~0.31415927E1, 0.123E2) = ~0.3864159E2 + (~0.31415927E1, 0.123E2) = 0.9158407E1 - (~0.31415927E1, 0.123E2) = ~0.15441593E2 / (~0.31415927E1, 0.123E2) = ~0.25541404 nextAfter (~0.31415927E1, 0.123E2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E2) = ~0.31415927E1 * (~0.31415927E1, 0.31415927E1) = ~0.9869605E1 + (~0.31415927E1, 0.31415927E1) = 0.0 - (~0.31415927E1, 0.31415927E1) = ~0.62831855E1 / (~0.31415927E1, 0.31415927E1) = ~0.1E1 nextAfter (~0.31415927E1, 0.31415927E1) = ~0.31415925E1 rem (~0.31415927E1, 0.31415927E1) = 0.0 * (~0.31415927E1, 0.27182817E1) = ~0.8539734E1 + (~0.31415927E1, 0.27182817E1) = ~0.423311 - (~0.31415927E1, 0.27182817E1) = ~0.58598747E1 / (~0.31415927E1, 0.27182817E1) = ~0.11557274E1 nextAfter (~0.31415927E1, 0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, 0.27182817E1) = ~0.423311 * (~0.31415927E1, 0.123E1) = ~0.3864159E1 + (~0.31415927E1, 0.123E1) = ~0.19115927E1 - (~0.31415927E1, 0.123E1) = ~0.43715925E1 / (~0.31415927E1, 0.123E1) = ~0.25541403E1 nextAfter (~0.31415927E1, 0.123E1) = ~0.31415925E1 rem (~0.31415927E1, 0.123E1) = ~0.6815927 * (~0.31415927E1, 0.123) = ~0.38641593 + (~0.31415927E1, 0.123) = ~0.30185928E1 - (~0.31415927E1, 0.123) = ~0.32645926E1 / (~0.31415927E1, 0.123) = ~0.25541403E2 nextAfter (~0.31415927E1, 0.123) = ~0.31415925E1 rem (~0.31415927E1, 0.123) = ~0.6659269E~1 * (~0.31415927E1, 0.123E~2) = ~0.38641593E~2 + (~0.31415927E1, 0.123E~2) = ~0.31403627E1 - (~0.31415927E1, 0.123E~2) = ~0.31428227E1 / (~0.31415927E1, 0.123E~2) = ~0.25541404E4 nextAfter (~0.31415927E1, 0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, 0.11754944E~37) = ~0.36929245E~37 + (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, 0.11754944E~37) = ~0.26725715E39 nextAfter (~0.31415927E1, 0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, 0.11754944E~37) = 0.0 * (~0.31415927E1, 0.5877472E~38) = ~0.18464623E~37 + (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, 0.5877472E~38) = ~inf nextAfter (~0.31415927E1, 0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, 0.5877472E~38) = inf * (~0.31415927E1, 0.1E~44) = ~0.4E~44 + (~0.31415927E1, 0.1E~44) = ~0.31415927E1 - (~0.31415927E1, 0.1E~44) = ~0.31415927E1 / (~0.31415927E1, 0.1E~44) = ~inf nextAfter (~0.31415927E1, 0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, 0.1E~44) = inf * (~0.31415927E1, 0.0) = ~0.0 + (~0.31415927E1, 0.0) = ~0.31415927E1 - (~0.31415927E1, 0.0) = ~0.31415927E1 / (~0.31415927E1, 0.0) = ~inf nextAfter (~0.31415927E1, 0.0) = ~0.31415925E1 rem (~0.31415927E1, 0.0) = nan * (~0.31415927E1, ~0.34028235E39) = inf + (~0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (~0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (~0.31415927E1, ~0.34028235E39) = 0.9232312E~38 nextAfter (~0.31415927E1, ~0.34028235E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, ~0.17014117E39) = inf + (~0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (~0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (~0.31415927E1, ~0.17014117E39) = 0.18464624E~37 nextAfter (~0.31415927E1, ~0.17014117E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, ~0.123E4) = 0.38641592E4 + (~0.31415927E1, ~0.123E4) = ~0.12331416E4 - (~0.31415927E1, ~0.123E4) = 0.12268584E4 / (~0.31415927E1, ~0.123E4) = 0.25541405E~2 nextAfter (~0.31415927E1, ~0.123E4) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E4) = ~0.31415927E1 * (~0.31415927E1, ~0.123E2) = 0.3864159E2 + (~0.31415927E1, ~0.123E2) = ~0.15441593E2 - (~0.31415927E1, ~0.123E2) = 0.9158407E1 / (~0.31415927E1, ~0.123E2) = 0.25541404 nextAfter (~0.31415927E1, ~0.123E2) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E2) = ~0.31415927E1 * (~0.31415927E1, ~0.31415927E1) = 0.9869605E1 + (~0.31415927E1, ~0.31415927E1) = ~0.62831855E1 - (~0.31415927E1, ~0.31415927E1) = 0.0 / (~0.31415927E1, ~0.31415927E1) = 0.1E1 nextAfter (~0.31415927E1, ~0.31415927E1) = ~0.31415927E1 rem (~0.31415927E1, ~0.31415927E1) = 0.0 * (~0.31415927E1, ~0.27182817E1) = 0.8539734E1 + (~0.31415927E1, ~0.27182817E1) = ~0.58598747E1 - (~0.31415927E1, ~0.27182817E1) = ~0.423311 / (~0.31415927E1, ~0.27182817E1) = 0.11557274E1 nextAfter (~0.31415927E1, ~0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.27182817E1) = ~0.423311 * (~0.31415927E1, ~0.123E1) = 0.3864159E1 + (~0.31415927E1, ~0.123E1) = ~0.43715925E1 - (~0.31415927E1, ~0.123E1) = ~0.19115927E1 / (~0.31415927E1, ~0.123E1) = 0.25541403E1 nextAfter (~0.31415927E1, ~0.123E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E1) = ~0.6815927 * (~0.31415927E1, ~0.123) = 0.38641593 + (~0.31415927E1, ~0.123) = ~0.32645926E1 - (~0.31415927E1, ~0.123) = ~0.30185928E1 / (~0.31415927E1, ~0.123) = 0.25541403E2 nextAfter (~0.31415927E1, ~0.123) = ~0.31415925E1 rem (~0.31415927E1, ~0.123) = ~0.6659269E~1 * (~0.31415927E1, ~0.123E~2) = 0.38641593E~2 + (~0.31415927E1, ~0.123E~2) = ~0.31428227E1 - (~0.31415927E1, ~0.123E~2) = ~0.31403627E1 / (~0.31415927E1, ~0.123E~2) = 0.25541404E4 nextAfter (~0.31415927E1, ~0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, ~0.11754944E~37) = 0.36929245E~37 + (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, ~0.11754944E~37) = 0.26725715E39 nextAfter (~0.31415927E1, ~0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, ~0.11754944E~37) = 0.0 * (~0.31415927E1, ~0.5877472E~38) = 0.18464623E~37 + (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, ~0.5877472E~38) = inf nextAfter (~0.31415927E1, ~0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, ~0.5877472E~38) = inf * (~0.31415927E1, ~0.1E~44) = 0.4E~44 + (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 - (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 / (~0.31415927E1, ~0.1E~44) = inf nextAfter (~0.31415927E1, ~0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, ~0.1E~44) = inf * (~0.31415927E1, ~0.0) = 0.0 + (~0.31415927E1, ~0.0) = ~0.31415927E1 - (~0.31415927E1, ~0.0) = ~0.31415927E1 / (~0.31415927E1, ~0.0) = inf nextAfter (~0.31415927E1, ~0.0) = ~0.31415925E1 rem (~0.31415927E1, ~0.0) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.31415927E1, ~inf) = inf + (~0.31415927E1, ~inf) = ~inf - (~0.31415927E1, ~inf) = inf / (~0.31415927E1, ~inf) = 0.0 nextAfter (~0.31415927E1, ~inf) = ~0.3141593E1 rem (~0.31415927E1, ~inf) = ~0.31415927E1 * (~0.31415927E1, nan) = nan + (~0.31415927E1, nan) = nan - (~0.31415927E1, nan) = nan / (~0.31415927E1, nan) = nan nextAfter (~0.31415927E1, nan) = nan rem (~0.31415927E1, nan) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.27182817E1, 0.34028235E39) = ~inf + (~0.27182817E1, 0.34028235E39) = 0.34028235E39 - (~0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (~0.27182817E1, 0.34028235E39) = ~0.7988312E~38 nextAfter (~0.27182817E1, 0.34028235E39) = ~0.27182815E1 rem (~0.27182817E1, 0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, 0.17014117E39) = ~inf + (~0.27182817E1, 0.17014117E39) = 0.17014117E39 - (~0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (~0.27182817E1, 0.17014117E39) = ~0.15976626E~37 nextAfter (~0.27182817E1, 0.17014117E39) = ~0.27182815E1 rem (~0.27182817E1, 0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, 0.123E4) = ~0.33434866E4 + (~0.27182817E1, 0.123E4) = 0.12272817E4 - (~0.27182817E1, 0.123E4) = ~0.12327183E4 / (~0.27182817E1, 0.123E4) = ~0.22099852E~2 nextAfter (~0.27182817E1, 0.123E4) = ~0.27182815E1 rem (~0.27182817E1, 0.123E4) = ~0.27182817E1 * (~0.27182817E1, 0.123E2) = ~0.33434868E2 + (~0.27182817E1, 0.123E2) = 0.9581718E1 - (~0.27182817E1, 0.123E2) = ~0.15018282E2 / (~0.27182817E1, 0.123E2) = ~0.22099851 nextAfter (~0.27182817E1, 0.123E2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E2) = ~0.27182817E1 * (~0.27182817E1, 0.31415927E1) = ~0.8539734E1 + (~0.27182817E1, 0.31415927E1) = 0.423311 - (~0.27182817E1, 0.31415927E1) = ~0.58598747E1 / (~0.27182817E1, 0.31415927E1) = ~0.86525595 nextAfter (~0.27182817E1, 0.31415927E1) = ~0.27182815E1 rem (~0.27182817E1, 0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, 0.27182817E1) = ~0.73890557E1 + (~0.27182817E1, 0.27182817E1) = 0.0 - (~0.27182817E1, 0.27182817E1) = ~0.54365635E1 / (~0.27182817E1, 0.27182817E1) = ~0.1E1 nextAfter (~0.27182817E1, 0.27182817E1) = ~0.27182815E1 rem (~0.27182817E1, 0.27182817E1) = 0.0 * (~0.27182817E1, 0.123E1) = ~0.33434865E1 + (~0.27182817E1, 0.123E1) = ~0.14882817E1 - (~0.27182817E1, 0.123E1) = ~0.39482818E1 / (~0.27182817E1, 0.123E1) = ~0.2209985E1 nextAfter (~0.27182817E1, 0.123E1) = ~0.27182815E1 rem (~0.27182817E1, 0.123E1) = ~0.2582817 * (~0.27182817E1, 0.123) = ~0.33434868 + (~0.27182817E1, 0.123) = ~0.25952818E1 - (~0.27182817E1, 0.123) = ~0.28412817E1 / (~0.27182817E1, 0.123) = ~0.22099852E2 nextAfter (~0.27182817E1, 0.123) = ~0.27182815E1 rem (~0.27182817E1, 0.123) = ~0.12281656E~1 * (~0.27182817E1, 0.123E~2) = ~0.33434867E~2 + (~0.27182817E1, 0.123E~2) = ~0.27170517E1 - (~0.27182817E1, 0.123E~2) = ~0.27195117E1 / (~0.27182817E1, 0.123E~2) = ~0.2209985E4 nextAfter (~0.27182817E1, 0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, 0.11754944E~37) = ~0.31953248E~37 + (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, 0.11754944E~37) = ~0.23124584E39 nextAfter (~0.27182817E1, 0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, 0.11754944E~37) = 0.0 * (~0.27182817E1, 0.5877472E~38) = ~0.15976624E~37 + (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, 0.5877472E~38) = ~inf nextAfter (~0.27182817E1, 0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, 0.5877472E~38) = inf * (~0.27182817E1, 0.1E~44) = ~0.4E~44 + (~0.27182817E1, 0.1E~44) = ~0.27182817E1 - (~0.27182817E1, 0.1E~44) = ~0.27182817E1 / (~0.27182817E1, 0.1E~44) = ~inf nextAfter (~0.27182817E1, 0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, 0.1E~44) = inf * (~0.27182817E1, 0.0) = ~0.0 + (~0.27182817E1, 0.0) = ~0.27182817E1 - (~0.27182817E1, 0.0) = ~0.27182817E1 / (~0.27182817E1, 0.0) = ~inf nextAfter (~0.27182817E1, 0.0) = ~0.27182815E1 rem (~0.27182817E1, 0.0) = nan * (~0.27182817E1, ~0.34028235E39) = inf + (~0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (~0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (~0.27182817E1, ~0.34028235E39) = 0.7988312E~38 nextAfter (~0.27182817E1, ~0.34028235E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, ~0.17014117E39) = inf + (~0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (~0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (~0.27182817E1, ~0.17014117E39) = 0.15976626E~37 nextAfter (~0.27182817E1, ~0.17014117E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, ~0.123E4) = 0.33434866E4 + (~0.27182817E1, ~0.123E4) = ~0.12327183E4 - (~0.27182817E1, ~0.123E4) = 0.12272817E4 / (~0.27182817E1, ~0.123E4) = 0.22099852E~2 nextAfter (~0.27182817E1, ~0.123E4) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E4) = ~0.27182817E1 * (~0.27182817E1, ~0.123E2) = 0.33434868E2 + (~0.27182817E1, ~0.123E2) = ~0.15018282E2 - (~0.27182817E1, ~0.123E2) = 0.9581718E1 / (~0.27182817E1, ~0.123E2) = 0.22099851 nextAfter (~0.27182817E1, ~0.123E2) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E2) = ~0.27182817E1 * (~0.27182817E1, ~0.31415927E1) = 0.8539734E1 + (~0.27182817E1, ~0.31415927E1) = ~0.58598747E1 - (~0.27182817E1, ~0.31415927E1) = 0.423311 / (~0.27182817E1, ~0.31415927E1) = 0.86525595 nextAfter (~0.27182817E1, ~0.31415927E1) = ~0.2718282E1 rem (~0.27182817E1, ~0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, ~0.27182817E1) = 0.73890557E1 + (~0.27182817E1, ~0.27182817E1) = ~0.54365635E1 - (~0.27182817E1, ~0.27182817E1) = 0.0 / (~0.27182817E1, ~0.27182817E1) = 0.1E1 nextAfter (~0.27182817E1, ~0.27182817E1) = ~0.27182817E1 rem (~0.27182817E1, ~0.27182817E1) = 0.0 * (~0.27182817E1, ~0.123E1) = 0.33434865E1 + (~0.27182817E1, ~0.123E1) = ~0.39482818E1 - (~0.27182817E1, ~0.123E1) = ~0.14882817E1 / (~0.27182817E1, ~0.123E1) = 0.2209985E1 nextAfter (~0.27182817E1, ~0.123E1) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E1) = ~0.2582817 * (~0.27182817E1, ~0.123) = 0.33434868 + (~0.27182817E1, ~0.123) = ~0.28412817E1 - (~0.27182817E1, ~0.123) = ~0.25952818E1 / (~0.27182817E1, ~0.123) = 0.22099852E2 nextAfter (~0.27182817E1, ~0.123) = ~0.27182815E1 rem (~0.27182817E1, ~0.123) = ~0.12281656E~1 * (~0.27182817E1, ~0.123E~2) = 0.33434867E~2 + (~0.27182817E1, ~0.123E~2) = ~0.27195117E1 - (~0.27182817E1, ~0.123E~2) = ~0.27170517E1 / (~0.27182817E1, ~0.123E~2) = 0.2209985E4 nextAfter (~0.27182817E1, ~0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, ~0.11754944E~37) = 0.31953248E~37 + (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, ~0.11754944E~37) = 0.23124584E39 nextAfter (~0.27182817E1, ~0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, ~0.11754944E~37) = 0.0 * (~0.27182817E1, ~0.5877472E~38) = 0.15976624E~37 + (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, ~0.5877472E~38) = inf nextAfter (~0.27182817E1, ~0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, ~0.5877472E~38) = inf * (~0.27182817E1, ~0.1E~44) = 0.4E~44 + (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 - (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 / (~0.27182817E1, ~0.1E~44) = inf nextAfter (~0.27182817E1, ~0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, ~0.1E~44) = inf * (~0.27182817E1, ~0.0) = 0.0 + (~0.27182817E1, ~0.0) = ~0.27182817E1 - (~0.27182817E1, ~0.0) = ~0.27182817E1 / (~0.27182817E1, ~0.0) = inf nextAfter (~0.27182817E1, ~0.0) = ~0.27182815E1 rem (~0.27182817E1, ~0.0) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.27182817E1, ~inf) = inf + (~0.27182817E1, ~inf) = ~inf - (~0.27182817E1, ~inf) = inf / (~0.27182817E1, ~inf) = 0.0 nextAfter (~0.27182817E1, ~inf) = ~0.2718282E1 rem (~0.27182817E1, ~inf) = ~0.27182817E1 * (~0.27182817E1, nan) = nan + (~0.27182817E1, nan) = nan - (~0.27182817E1, nan) = nan / (~0.27182817E1, nan) = nan nextAfter (~0.27182817E1, nan) = nan rem (~0.27182817E1, nan) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.123E1, 0.34028235E39) = ~inf + (~0.123E1, 0.34028235E39) = 0.34028235E39 - (~0.123E1, 0.34028235E39) = ~0.34028235E39 / (~0.123E1, 0.34028235E39) = ~0.3614645E~38 nextAfter (~0.123E1, 0.34028235E39) = ~0.12299999E1 rem (~0.123E1, 0.34028235E39) = ~0.123E1 * (~0.123E1, 0.17014117E39) = ~0.20927364E39 + (~0.123E1, 0.17014117E39) = 0.17014117E39 - (~0.123E1, 0.17014117E39) = ~0.17014117E39 / (~0.123E1, 0.17014117E39) = ~0.722929E~38 nextAfter (~0.123E1, 0.17014117E39) = ~0.12299999E1 rem (~0.123E1, 0.17014117E39) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530001E2 / (~0.123E1, 0.123E2) = ~0.1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.31415927E1) = ~0.3864159E1 + (~0.123E1, 0.31415927E1) = 0.19115927E1 - (~0.123E1, 0.31415927E1) = ~0.43715925E1 / (~0.123E1, 0.31415927E1) = ~0.39152116 nextAfter (~0.123E1, 0.31415927E1) = ~0.12299999E1 rem (~0.123E1, 0.31415927E1) = ~0.123E1 * (~0.123E1, 0.27182817E1) = ~0.33434865E1 + (~0.123E1, 0.27182817E1) = 0.14882817E1 - (~0.123E1, 0.27182817E1) = ~0.39482818E1 / (~0.123E1, 0.27182817E1) = ~0.45249173 nextAfter (~0.123E1, 0.27182817E1) = ~0.12299999E1 rem (~0.123E1, 0.27182817E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129001E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.11754944E~37) = ~0.14458581E~37 + (~0.123E1, 0.11754944E~37) = ~0.123E1 - (~0.123E1, 0.11754944E~37) = ~0.123E1 / (~0.123E1, 0.11754944E~37) = ~0.10463683E39 nextAfter (~0.123E1, 0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, 0.11754944E~37) = 0.0 * (~0.123E1, 0.5877472E~38) = ~0.722929E~38 + (~0.123E1, 0.5877472E~38) = ~0.123E1 - (~0.123E1, 0.5877472E~38) = ~0.123E1 / (~0.123E1, 0.5877472E~38) = ~0.20927366E39 nextAfter (~0.123E1, 0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, 0.5877472E~38) = 0.0 * (~0.123E1, 0.1E~44) = ~0.1E~44 + (~0.123E1, 0.1E~44) = ~0.123E1 - (~0.123E1, 0.1E~44) = ~0.123E1 / (~0.123E1, 0.1E~44) = ~inf nextAfter (~0.123E1, 0.1E~44) = ~0.12299999E1 rem (~0.123E1, 0.1E~44) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.34028235E39) = inf + (~0.123E1, ~0.34028235E39) = ~0.34028235E39 - (~0.123E1, ~0.34028235E39) = 0.34028235E39 / (~0.123E1, ~0.34028235E39) = 0.3614645E~38 nextAfter (~0.123E1, ~0.34028235E39) = ~0.12300001E1 rem (~0.123E1, ~0.34028235E39) = ~0.123E1 * (~0.123E1, ~0.17014117E39) = 0.20927364E39 + (~0.123E1, ~0.17014117E39) = ~0.17014117E39 - (~0.123E1, ~0.17014117E39) = 0.17014117E39 / (~0.123E1, ~0.17014117E39) = 0.722929E~38 nextAfter (~0.123E1, ~0.17014117E39) = ~0.12300001E1 rem (~0.123E1, ~0.17014117E39) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300001E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129001E2 + (~0.123E1, ~0.123E2) = ~0.13530001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300001E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.31415927E1) = 0.3864159E1 + (~0.123E1, ~0.31415927E1) = ~0.43715925E1 - (~0.123E1, ~0.31415927E1) = 0.19115927E1 / (~0.123E1, ~0.31415927E1) = 0.39152116 nextAfter (~0.123E1, ~0.31415927E1) = ~0.12300001E1 rem (~0.123E1, ~0.31415927E1) = ~0.123E1 * (~0.123E1, ~0.27182817E1) = 0.33434865E1 + (~0.123E1, ~0.27182817E1) = ~0.39482818E1 - (~0.123E1, ~0.27182817E1) = 0.14882817E1 / (~0.123E1, ~0.27182817E1) = 0.45249173 nextAfter (~0.123E1, ~0.27182817E1) = ~0.12300001E1 rem (~0.123E1, ~0.27182817E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129001E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.11754944E~37) = 0.14458581E~37 + (~0.123E1, ~0.11754944E~37) = ~0.123E1 - (~0.123E1, ~0.11754944E~37) = ~0.123E1 / (~0.123E1, ~0.11754944E~37) = 0.10463683E39 nextAfter (~0.123E1, ~0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, ~0.11754944E~37) = 0.0 * (~0.123E1, ~0.5877472E~38) = 0.722929E~38 + (~0.123E1, ~0.5877472E~38) = ~0.123E1 - (~0.123E1, ~0.5877472E~38) = ~0.123E1 / (~0.123E1, ~0.5877472E~38) = 0.20927366E39 nextAfter (~0.123E1, ~0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, ~0.5877472E~38) = 0.0 * (~0.123E1, ~0.1E~44) = 0.1E~44 + (~0.123E1, ~0.1E~44) = ~0.123E1 - (~0.123E1, ~0.1E~44) = ~0.123E1 / (~0.123E1, ~0.1E~44) = inf nextAfter (~0.123E1, ~0.1E~44) = ~0.12299999E1 rem (~0.123E1, ~0.1E~44) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300001E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.34028235E39) = ~0.4185473E38 + (~0.123, 0.34028235E39) = 0.34028235E39 - (~0.123, 0.34028235E39) = ~0.34028235E39 / (~0.123, 0.34028235E39) = ~0.361465E~39 nextAfter (~0.123, 0.34028235E39) = ~0.122999996 rem (~0.123, 0.34028235E39) = ~0.123 * (~0.123, 0.17014117E39) = ~0.20927365E38 + (~0.123, 0.17014117E39) = 0.17014117E39 - (~0.123, 0.17014117E39) = ~0.17014117E39 / (~0.123, 0.17014117E39) = ~0.722928E~39 nextAfter (~0.123, 0.17014117E39) = ~0.122999996 rem (~0.123, 0.17014117E39) = ~0.123 * (~0.123, 0.123E4) = ~0.15129001E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.100000005E~3 nextAfter (~0.123, 0.123E4) = ~0.122999996 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129001E1 + (~0.123, 0.123E2) = 0.12177E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.1E~1 nextAfter (~0.123, 0.123E2) = ~0.122999996 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.31415927E1) = ~0.38641593 + (~0.123, 0.31415927E1) = 0.30185928E1 - (~0.123, 0.31415927E1) = ~0.32645926E1 / (~0.123, 0.31415927E1) = ~0.39152116E~1 nextAfter (~0.123, 0.31415927E1) = ~0.122999996 rem (~0.123, 0.31415927E1) = ~0.123 * (~0.123, 0.27182817E1) = ~0.33434868 + (~0.123, 0.27182817E1) = 0.25952818E1 - (~0.123, 0.27182817E1) = ~0.28412817E1 / (~0.123, 0.27182817E1) = ~0.45249175E~1 nextAfter (~0.123, 0.27182817E1) = ~0.122999996 rem (~0.123, 0.27182817E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.122999996 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129001E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.122999996 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.124230005 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.122999996 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.11754944E~37) = ~0.1445858E~38 + (~0.123, 0.11754944E~37) = ~0.123 - (~0.123, 0.11754944E~37) = ~0.123 / (~0.123, 0.11754944E~37) = ~0.10463683E38 nextAfter (~0.123, 0.11754944E~37) = ~0.122999996 rem (~0.123, 0.11754944E~37) = 0.0 * (~0.123, 0.5877472E~38) = ~0.722928E~39 + (~0.123, 0.5877472E~38) = ~0.123 - (~0.123, 0.5877472E~38) = ~0.123 / (~0.123, 0.5877472E~38) = ~0.20927366E38 nextAfter (~0.123, 0.5877472E~38) = ~0.122999996 rem (~0.123, 0.5877472E~38) = 0.0 * (~0.123, 0.1E~44) = ~0.0 + (~0.123, 0.1E~44) = ~0.123 - (~0.123, 0.1E~44) = ~0.123 / (~0.123, 0.1E~44) = ~inf nextAfter (~0.123, 0.1E~44) = ~0.122999996 rem (~0.123, 0.1E~44) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.122999996 rem (~0.123, 0.0) = nan * (~0.123, ~0.34028235E39) = 0.4185473E38 + (~0.123, ~0.34028235E39) = ~0.34028235E39 - (~0.123, ~0.34028235E39) = 0.34028235E39 / (~0.123, ~0.34028235E39) = 0.361465E~39 nextAfter (~0.123, ~0.34028235E39) = ~0.12300001 rem (~0.123, ~0.34028235E39) = ~0.123 * (~0.123, ~0.17014117E39) = 0.20927365E38 + (~0.123, ~0.17014117E39) = ~0.17014117E39 - (~0.123, ~0.17014117E39) = 0.17014117E39 / (~0.123, ~0.17014117E39) = 0.722928E~39 nextAfter (~0.123, ~0.17014117E39) = ~0.12300001 rem (~0.123, ~0.17014117E39) = ~0.123 * (~0.123, ~0.123E4) = 0.15129001E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.100000005E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177E2 / (~0.123, ~0.123E2) = 0.1E~1 nextAfter (~0.123, ~0.123E2) = ~0.12300001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.31415927E1) = 0.38641593 + (~0.123, ~0.31415927E1) = ~0.32645926E1 - (~0.123, ~0.31415927E1) = 0.30185928E1 / (~0.123, ~0.31415927E1) = 0.39152116E~1 nextAfter (~0.123, ~0.31415927E1) = ~0.12300001 rem (~0.123, ~0.31415927E1) = ~0.123 * (~0.123, ~0.27182817E1) = 0.33434868 + (~0.123, ~0.27182817E1) = ~0.28412817E1 - (~0.123, ~0.27182817E1) = 0.25952818E1 / (~0.123, ~0.27182817E1) = 0.45249175E~1 nextAfter (~0.123, ~0.27182817E1) = ~0.12300001 rem (~0.123, ~0.27182817E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129001E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.124230005 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.122999996 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.11754944E~37) = 0.1445858E~38 + (~0.123, ~0.11754944E~37) = ~0.123 - (~0.123, ~0.11754944E~37) = ~0.123 / (~0.123, ~0.11754944E~37) = 0.10463683E38 nextAfter (~0.123, ~0.11754944E~37) = ~0.122999996 rem (~0.123, ~0.11754944E~37) = 0.0 * (~0.123, ~0.5877472E~38) = 0.722928E~39 + (~0.123, ~0.5877472E~38) = ~0.123 - (~0.123, ~0.5877472E~38) = ~0.123 / (~0.123, ~0.5877472E~38) = 0.20927366E38 nextAfter (~0.123, ~0.5877472E~38) = ~0.122999996 rem (~0.123, ~0.5877472E~38) = 0.0 * (~0.123, ~0.1E~44) = 0.0 + (~0.123, ~0.1E~44) = ~0.123 - (~0.123, ~0.1E~44) = ~0.123 / (~0.123, ~0.1E~44) = inf nextAfter (~0.123, ~0.1E~44) = ~0.122999996 rem (~0.123, ~0.1E~44) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.122999996 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.34028235E39) = ~0.4185473E36 + (~0.123E~2, 0.34028235E39) = 0.34028235E39 - (~0.123E~2, 0.34028235E39) = ~0.34028235E39 / (~0.123E~2, 0.34028235E39) = ~0.3614E~41 nextAfter (~0.123E~2, 0.34028235E39) = ~0.12299999E~2 rem (~0.123E~2, 0.34028235E39) = ~0.123E~2 * (~0.123E~2, 0.17014117E39) = ~0.20927364E36 + (~0.123E~2, 0.17014117E39) = 0.17014117E39 - (~0.123E~2, 0.17014117E39) = ~0.17014117E39 / (~0.123E~2, 0.17014117E39) = ~0.7229E~41 nextAfter (~0.123E~2, 0.17014117E39) = ~0.12299999E~2 rem (~0.123E~2, 0.17014117E39) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129001E1 + (~0.123E~2, 0.123E4) = 0.12299988E4 - (~0.123E~2, 0.123E4) = ~0.12300012E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129001E~1 + (~0.123E~2, 0.123E2) = 0.1229877E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.100000005E~3 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.31415927E1) = ~0.38641593E~2 + (~0.123E~2, 0.31415927E1) = 0.31403627E1 - (~0.123E~2, 0.31415927E1) = ~0.31428227E1 / (~0.123E~2, 0.31415927E1) = ~0.39152117E~3 nextAfter (~0.123E~2, 0.31415927E1) = ~0.12299999E~2 rem (~0.123E~2, 0.31415927E1) = ~0.123E~2 * (~0.123E~2, 0.27182817E1) = ~0.33434867E~2 + (~0.123E~2, 0.27182817E1) = 0.27170517E1 - (~0.123E~2, 0.27182817E1) = ~0.27195117E1 / (~0.123E~2, 0.27182817E1) = ~0.45249175E~3 nextAfter (~0.123E~2, 0.27182817E1) = ~0.12299999E~2 rem (~0.123E~2, 0.27182817E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129001E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.124230005 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129001E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.11754944E~37) = ~0.14459E~40 + (~0.123E~2, 0.11754944E~37) = ~0.123E~2 - (~0.123E~2, 0.11754944E~37) = ~0.123E~2 / (~0.123E~2, 0.11754944E~37) = ~0.10463683E36 nextAfter (~0.123E~2, 0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, 0.11754944E~37) = 0.0 * (~0.123E~2, 0.5877472E~38) = ~0.7229E~41 + (~0.123E~2, 0.5877472E~38) = ~0.123E~2 - (~0.123E~2, 0.5877472E~38) = ~0.123E~2 / (~0.123E~2, 0.5877472E~38) = ~0.20927366E36 nextAfter (~0.123E~2, 0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, 0.5877472E~38) = 0.0 * (~0.123E~2, 0.1E~44) = ~0.0 + (~0.123E~2, 0.1E~44) = ~0.123E~2 - (~0.123E~2, 0.1E~44) = ~0.123E~2 / (~0.123E~2, 0.1E~44) = ~inf nextAfter (~0.123E~2, 0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, 0.1E~44) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.34028235E39) = 0.4185473E36 + (~0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E~2, ~0.34028235E39) = 0.34028235E39 / (~0.123E~2, ~0.34028235E39) = 0.3614E~41 nextAfter (~0.123E~2, ~0.34028235E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.34028235E39) = ~0.123E~2 * (~0.123E~2, ~0.17014117E39) = 0.20927364E36 + (~0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E~2, ~0.17014117E39) = 0.17014117E39 / (~0.123E~2, ~0.17014117E39) = 0.7229E~41 nextAfter (~0.123E~2, ~0.17014117E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.17014117E39) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129001E1 + (~0.123E~2, ~0.123E4) = ~0.12300012E4 - (~0.123E~2, ~0.123E4) = 0.12299988E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129001E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.1229877E2 / (~0.123E~2, ~0.123E2) = 0.100000005E~3 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.31415927E1) = 0.38641593E~2 + (~0.123E~2, ~0.31415927E1) = ~0.31428227E1 - (~0.123E~2, ~0.31415927E1) = 0.31403627E1 / (~0.123E~2, ~0.31415927E1) = 0.39152117E~3 nextAfter (~0.123E~2, ~0.31415927E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.31415927E1) = ~0.123E~2 * (~0.123E~2, ~0.27182817E1) = 0.33434867E~2 + (~0.123E~2, ~0.27182817E1) = ~0.27195117E1 - (~0.123E~2, ~0.27182817E1) = 0.27170517E1 / (~0.123E~2, ~0.27182817E1) = 0.45249175E~3 nextAfter (~0.123E~2, ~0.27182817E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.27182817E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129001E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.124230005 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129001E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.11754944E~37) = 0.14459E~40 + (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 - (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 / (~0.123E~2, ~0.11754944E~37) = 0.10463683E36 nextAfter (~0.123E~2, ~0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, ~0.11754944E~37) = 0.0 * (~0.123E~2, ~0.5877472E~38) = 0.7229E~41 + (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 - (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 / (~0.123E~2, ~0.5877472E~38) = 0.20927366E36 nextAfter (~0.123E~2, ~0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, ~0.5877472E~38) = 0.0 * (~0.123E~2, ~0.1E~44) = 0.0 + (~0.123E~2, ~0.1E~44) = ~0.123E~2 - (~0.123E~2, ~0.1E~44) = ~0.123E~2 / (~0.123E~2, ~0.1E~44) = inf nextAfter (~0.123E~2, ~0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, ~0.1E~44) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.11754944E~37, 0.34028235E39) = ~0.39999998E1 + (~0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (~0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (~0.11754944E~37, 0.34028235E39) = ~0.0 nextAfter (~0.11754944E~37, 0.34028235E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.17014117E39) = ~0.19999999E1 + (~0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (~0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (~0.11754944E~37, 0.17014117E39) = ~0.0 nextAfter (~0.11754944E~37, 0.17014117E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E4) = ~0.1445858E~34 + (~0.11754944E~37, 0.123E4) = 0.123E4 - (~0.11754944E~37, 0.123E4) = ~0.123E4 / (~0.11754944E~37, 0.123E4) = ~0.9557E~41 nextAfter (~0.11754944E~37, 0.123E4) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E2) = ~0.14458581E~36 + (~0.11754944E~37, 0.123E2) = 0.123E2 - (~0.11754944E~37, 0.123E2) = ~0.123E2 / (~0.11754944E~37, 0.123E2) = ~0.955687E~39 nextAfter (~0.11754944E~37, 0.123E2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, 0.31415927E1) = ~0.36929245E~37 + (~0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (~0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (~0.11754944E~37, 0.31415927E1) = ~0.3741715E~38 nextAfter (~0.11754944E~37, 0.31415927E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.27182817E1) = ~0.31953248E~37 + (~0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (~0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (~0.11754944E~37, 0.27182817E1) = ~0.4324403E~38 nextAfter (~0.11754944E~37, 0.27182817E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E1) = ~0.14458581E~37 + (~0.11754944E~37, 0.123E1) = 0.123E1 - (~0.11754944E~37, 0.123E1) = ~0.123E1 / (~0.11754944E~37, 0.123E1) = ~0.9556864E~38 nextAfter (~0.11754944E~37, 0.123E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123) = ~0.1445858E~38 + (~0.11754944E~37, 0.123) = 0.123 - (~0.11754944E~37, 0.123) = ~0.123 / (~0.11754944E~37, 0.123) = ~0.9556864E~37 nextAfter (~0.11754944E~37, 0.123) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E~2) = ~0.14459E~40 + (~0.11754944E~37, 0.123E~2) = 0.123E~2 - (~0.11754944E~37, 0.123E~2) = ~0.123E~2 / (~0.11754944E~37, 0.123E~2) = ~0.95568645E~35 nextAfter (~0.11754944E~37, 0.123E~2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, 0.11754944E~37) = ~0.0 + (~0.11754944E~37, 0.11754944E~37) = 0.0 - (~0.11754944E~37, 0.11754944E~37) = ~0.23509887E~37 / (~0.11754944E~37, 0.11754944E~37) = ~0.1E1 nextAfter (~0.11754944E~37, 0.11754944E~37) = ~0.11754942E~37 rem (~0.11754944E~37, 0.11754944E~37) = 0.0 * (~0.11754944E~37, 0.5877472E~38) = ~0.0 + (~0.11754944E~37, 0.5877472E~38) = ~0.5877472E~38 - (~0.11754944E~37, 0.5877472E~38) = ~0.17632415E~37 / (~0.11754944E~37, 0.5877472E~38) = ~0.2E1 nextAfter (~0.11754944E~37, 0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, 0.5877472E~38) = 0.0 * (~0.11754944E~37, 0.1E~44) = ~0.0 + (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 - (~0.11754944E~37, 0.1E~44) = ~0.11754945E~37 / (~0.11754944E~37, 0.1E~44) = ~0.8388608E7 nextAfter (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, 0.1E~44) = 0.0 * (~0.11754944E~37, 0.0) = ~0.0 + (~0.11754944E~37, 0.0) = ~0.11754944E~37 - (~0.11754944E~37, 0.0) = ~0.11754944E~37 / (~0.11754944E~37, 0.0) = ~inf nextAfter (~0.11754944E~37, 0.0) = ~0.11754942E~37 rem (~0.11754944E~37, 0.0) = nan * (~0.11754944E~37, ~0.34028235E39) = 0.39999998E1 + (~0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (~0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (~0.11754944E~37, ~0.34028235E39) = 0.0 nextAfter (~0.11754944E~37, ~0.34028235E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.17014117E39) = 0.19999999E1 + (~0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (~0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (~0.11754944E~37, ~0.17014117E39) = 0.0 nextAfter (~0.11754944E~37, ~0.17014117E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E4) = 0.1445858E~34 + (~0.11754944E~37, ~0.123E4) = ~0.123E4 - (~0.11754944E~37, ~0.123E4) = 0.123E4 / (~0.11754944E~37, ~0.123E4) = 0.9557E~41 nextAfter (~0.11754944E~37, ~0.123E4) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E2) = 0.14458581E~36 + (~0.11754944E~37, ~0.123E2) = ~0.123E2 - (~0.11754944E~37, ~0.123E2) = 0.123E2 / (~0.11754944E~37, ~0.123E2) = 0.955687E~39 nextAfter (~0.11754944E~37, ~0.123E2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.31415927E1) = 0.36929245E~37 + (~0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (~0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (~0.11754944E~37, ~0.31415927E1) = 0.3741715E~38 nextAfter (~0.11754944E~37, ~0.31415927E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.27182817E1) = 0.31953248E~37 + (~0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (~0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (~0.11754944E~37, ~0.27182817E1) = 0.4324403E~38 nextAfter (~0.11754944E~37, ~0.27182817E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E1) = 0.14458581E~37 + (~0.11754944E~37, ~0.123E1) = ~0.123E1 - (~0.11754944E~37, ~0.123E1) = 0.123E1 / (~0.11754944E~37, ~0.123E1) = 0.9556864E~38 nextAfter (~0.11754944E~37, ~0.123E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123) = 0.1445858E~38 + (~0.11754944E~37, ~0.123) = ~0.123 - (~0.11754944E~37, ~0.123) = 0.123 / (~0.11754944E~37, ~0.123) = 0.9556864E~37 nextAfter (~0.11754944E~37, ~0.123) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E~2) = 0.14459E~40 + (~0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (~0.11754944E~37, ~0.123E~2) = 0.123E~2 / (~0.11754944E~37, ~0.123E~2) = 0.95568645E~35 nextAfter (~0.11754944E~37, ~0.123E~2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.11754944E~37) = 0.0 + (~0.11754944E~37, ~0.11754944E~37) = ~0.23509887E~37 - (~0.11754944E~37, ~0.11754944E~37) = 0.0 / (~0.11754944E~37, ~0.11754944E~37) = 0.1E1 nextAfter (~0.11754944E~37, ~0.11754944E~37) = ~0.11754944E~37 rem (~0.11754944E~37, ~0.11754944E~37) = 0.0 * (~0.11754944E~37, ~0.5877472E~38) = 0.0 + (~0.11754944E~37, ~0.5877472E~38) = ~0.17632415E~37 - (~0.11754944E~37, ~0.5877472E~38) = ~0.5877472E~38 / (~0.11754944E~37, ~0.5877472E~38) = 0.2E1 nextAfter (~0.11754944E~37, ~0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.5877472E~38) = 0.0 * (~0.11754944E~37, ~0.1E~44) = 0.0 + (~0.11754944E~37, ~0.1E~44) = ~0.11754945E~37 - (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 / (~0.11754944E~37, ~0.1E~44) = 0.8388608E7 nextAfter (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.1E~44) = 0.0 * (~0.11754944E~37, ~0.0) = 0.0 + (~0.11754944E~37, ~0.0) = ~0.11754944E~37 - (~0.11754944E~37, ~0.0) = ~0.11754944E~37 / (~0.11754944E~37, ~0.0) = inf nextAfter (~0.11754944E~37, ~0.0) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.0) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.11754944E~37, ~inf) = inf + (~0.11754944E~37, ~inf) = ~inf - (~0.11754944E~37, ~inf) = inf / (~0.11754944E~37, ~inf) = 0.0 nextAfter (~0.11754944E~37, ~inf) = ~0.11754945E~37 rem (~0.11754944E~37, ~inf) = ~0.11754944E~37 * (~0.11754944E~37, nan) = nan + (~0.11754944E~37, nan) = nan - (~0.11754944E~37, nan) = nan / (~0.11754944E~37, nan) = nan nextAfter (~0.11754944E~37, nan) = nan rem (~0.11754944E~37, nan) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.5877472E~38, 0.34028235E39) = ~0.19999999E1 + (~0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (~0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (~0.5877472E~38, 0.34028235E39) = ~0.0 nextAfter (~0.5877472E~38, 0.34028235E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.17014117E39) = ~0.99999994 + (~0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (~0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (~0.5877472E~38, 0.17014117E39) = ~0.0 nextAfter (~0.5877472E~38, 0.17014117E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E4) = ~0.722929E~35 + (~0.5877472E~38, 0.123E4) = 0.123E4 - (~0.5877472E~38, 0.123E4) = ~0.123E4 / (~0.5877472E~38, 0.123E4) = ~0.4778E~41 nextAfter (~0.5877472E~38, 0.123E4) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E2) = ~0.72292904E~37 + (~0.5877472E~38, 0.123E2) = 0.123E2 - (~0.5877472E~38, 0.123E2) = ~0.123E2 / (~0.5877472E~38, 0.123E2) = ~0.477843E~39 nextAfter (~0.5877472E~38, 0.123E2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, 0.31415927E1) = ~0.18464623E~37 + (~0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (~0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (~0.5877472E~38, 0.31415927E1) = ~0.1870857E~38 nextAfter (~0.5877472E~38, 0.31415927E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.27182817E1) = ~0.15976624E~37 + (~0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (~0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (~0.5877472E~38, 0.27182817E1) = ~0.2162201E~38 nextAfter (~0.5877472E~38, 0.27182817E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E1) = ~0.722929E~38 + (~0.5877472E~38, 0.123E1) = 0.123E1 - (~0.5877472E~38, 0.123E1) = ~0.123E1 / (~0.5877472E~38, 0.123E1) = ~0.4778432E~38 nextAfter (~0.5877472E~38, 0.123E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123) = ~0.722928E~39 + (~0.5877472E~38, 0.123) = 0.123 - (~0.5877472E~38, 0.123) = ~0.123 / (~0.5877472E~38, 0.123) = ~0.4778432E~37 nextAfter (~0.5877472E~38, 0.123) = ~0.587747E~38 rem (~0.5877472E~38, 0.123) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E~2) = ~0.7229E~41 + (~0.5877472E~38, 0.123E~2) = 0.123E~2 - (~0.5877472E~38, 0.123E~2) = ~0.123E~2 / (~0.5877472E~38, 0.123E~2) = ~0.47784322E~35 nextAfter (~0.5877472E~38, 0.123E~2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, 0.11754944E~37) = ~0.0 + (~0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 - (~0.5877472E~38, 0.11754944E~37) = ~0.17632415E~37 / (~0.5877472E~38, 0.11754944E~37) = ~0.5 nextAfter (~0.5877472E~38, 0.11754944E~37) = ~0.587747E~38 rem (~0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, 0.5877472E~38) = ~0.0 + (~0.5877472E~38, 0.5877472E~38) = 0.0 - (~0.5877472E~38, 0.5877472E~38) = ~0.11754944E~37 / (~0.5877472E~38, 0.5877472E~38) = ~0.1E1 nextAfter (~0.5877472E~38, 0.5877472E~38) = ~0.587747E~38 rem (~0.5877472E~38, 0.5877472E~38) = 0.0 * (~0.5877472E~38, 0.1E~44) = ~0.0 + (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 - (~0.5877472E~38, 0.1E~44) = ~0.5877473E~38 / (~0.5877472E~38, 0.1E~44) = ~0.4194304E7 nextAfter (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, 0.1E~44) = 0.0 * (~0.5877472E~38, 0.0) = ~0.0 + (~0.5877472E~38, 0.0) = ~0.5877472E~38 - (~0.5877472E~38, 0.0) = ~0.5877472E~38 / (~0.5877472E~38, 0.0) = ~inf nextAfter (~0.5877472E~38, 0.0) = ~0.587747E~38 rem (~0.5877472E~38, 0.0) = nan * (~0.5877472E~38, ~0.34028235E39) = 0.19999999E1 + (~0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (~0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (~0.5877472E~38, ~0.34028235E39) = 0.0 nextAfter (~0.5877472E~38, ~0.34028235E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.17014117E39) = 0.99999994 + (~0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (~0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (~0.5877472E~38, ~0.17014117E39) = 0.0 nextAfter (~0.5877472E~38, ~0.17014117E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E4) = 0.722929E~35 + (~0.5877472E~38, ~0.123E4) = ~0.123E4 - (~0.5877472E~38, ~0.123E4) = 0.123E4 / (~0.5877472E~38, ~0.123E4) = 0.4778E~41 nextAfter (~0.5877472E~38, ~0.123E4) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E2) = 0.72292904E~37 + (~0.5877472E~38, ~0.123E2) = ~0.123E2 - (~0.5877472E~38, ~0.123E2) = 0.123E2 / (~0.5877472E~38, ~0.123E2) = 0.477843E~39 nextAfter (~0.5877472E~38, ~0.123E2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.31415927E1) = 0.18464623E~37 + (~0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (~0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (~0.5877472E~38, ~0.31415927E1) = 0.1870857E~38 nextAfter (~0.5877472E~38, ~0.31415927E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.27182817E1) = 0.15976624E~37 + (~0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (~0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (~0.5877472E~38, ~0.27182817E1) = 0.2162201E~38 nextAfter (~0.5877472E~38, ~0.27182817E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E1) = 0.722929E~38 + (~0.5877472E~38, ~0.123E1) = ~0.123E1 - (~0.5877472E~38, ~0.123E1) = 0.123E1 / (~0.5877472E~38, ~0.123E1) = 0.4778432E~38 nextAfter (~0.5877472E~38, ~0.123E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123) = 0.722928E~39 + (~0.5877472E~38, ~0.123) = ~0.123 - (~0.5877472E~38, ~0.123) = 0.123 / (~0.5877472E~38, ~0.123) = 0.4778432E~37 nextAfter (~0.5877472E~38, ~0.123) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E~2) = 0.7229E~41 + (~0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (~0.5877472E~38, ~0.123E~2) = 0.123E~2 / (~0.5877472E~38, ~0.123E~2) = 0.47784322E~35 nextAfter (~0.5877472E~38, ~0.123E~2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.11754944E~37) = 0.0 + (~0.5877472E~38, ~0.11754944E~37) = ~0.17632415E~37 - (~0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 / (~0.5877472E~38, ~0.11754944E~37) = 0.5 nextAfter (~0.5877472E~38, ~0.11754944E~37) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, ~0.5877472E~38) = 0.0 + (~0.5877472E~38, ~0.5877472E~38) = ~0.11754944E~37 - (~0.5877472E~38, ~0.5877472E~38) = 0.0 / (~0.5877472E~38, ~0.5877472E~38) = 0.1E1 nextAfter (~0.5877472E~38, ~0.5877472E~38) = ~0.5877472E~38 rem (~0.5877472E~38, ~0.5877472E~38) = 0.0 * (~0.5877472E~38, ~0.1E~44) = 0.0 + (~0.5877472E~38, ~0.1E~44) = ~0.5877473E~38 - (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 / (~0.5877472E~38, ~0.1E~44) = 0.4194304E7 nextAfter (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, ~0.1E~44) = 0.0 * (~0.5877472E~38, ~0.0) = 0.0 + (~0.5877472E~38, ~0.0) = ~0.5877472E~38 - (~0.5877472E~38, ~0.0) = ~0.5877472E~38 / (~0.5877472E~38, ~0.0) = inf nextAfter (~0.5877472E~38, ~0.0) = ~0.587747E~38 rem (~0.5877472E~38, ~0.0) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.5877472E~38, ~inf) = inf + (~0.5877472E~38, ~inf) = ~inf - (~0.5877472E~38, ~inf) = inf / (~0.5877472E~38, ~inf) = 0.0 nextAfter (~0.5877472E~38, ~inf) = ~0.5877473E~38 rem (~0.5877472E~38, ~inf) = ~0.5877472E~38 * (~0.5877472E~38, nan) = nan + (~0.5877472E~38, nan) = nan - (~0.5877472E~38, nan) = nan / (~0.5877472E~38, nan) = nan nextAfter (~0.5877472E~38, nan) = nan rem (~0.5877472E~38, nan) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.1E~44, 0.34028235E39) = ~0.47683713E~6 + (~0.1E~44, 0.34028235E39) = 0.34028235E39 - (~0.1E~44, 0.34028235E39) = ~0.34028235E39 / (~0.1E~44, 0.34028235E39) = ~0.0 nextAfter (~0.1E~44, 0.34028235E39) = ~0.0 rem (~0.1E~44, 0.34028235E39) = ~0.1E~44 * (~0.1E~44, 0.17014117E39) = ~0.23841856E~6 + (~0.1E~44, 0.17014117E39) = 0.17014117E39 - (~0.1E~44, 0.17014117E39) = ~0.17014117E39 / (~0.1E~44, 0.17014117E39) = ~0.0 nextAfter (~0.1E~44, 0.17014117E39) = ~0.0 rem (~0.1E~44, 0.17014117E39) = ~0.1E~44 * (~0.1E~44, 0.123E4) = ~0.1724E~41 + (~0.1E~44, 0.123E4) = 0.123E4 - (~0.1E~44, 0.123E4) = ~0.123E4 / (~0.1E~44, 0.123E4) = ~0.0 nextAfter (~0.1E~44, 0.123E4) = ~0.0 rem (~0.1E~44, 0.123E4) = ~0.1E~44 * (~0.1E~44, 0.123E2) = ~0.17E~43 + (~0.1E~44, 0.123E2) = 0.123E2 - (~0.1E~44, 0.123E2) = ~0.123E2 / (~0.1E~44, 0.123E2) = ~0.0 nextAfter (~0.1E~44, 0.123E2) = ~0.0 rem (~0.1E~44, 0.123E2) = ~0.1E~44 * (~0.1E~44, 0.31415927E1) = ~0.4E~44 + (~0.1E~44, 0.31415927E1) = 0.31415927E1 - (~0.1E~44, 0.31415927E1) = ~0.31415927E1 / (~0.1E~44, 0.31415927E1) = ~0.0 nextAfter (~0.1E~44, 0.31415927E1) = ~0.0 rem (~0.1E~44, 0.31415927E1) = ~0.1E~44 * (~0.1E~44, 0.27182817E1) = ~0.4E~44 + (~0.1E~44, 0.27182817E1) = 0.27182817E1 - (~0.1E~44, 0.27182817E1) = ~0.27182817E1 / (~0.1E~44, 0.27182817E1) = ~0.0 nextAfter (~0.1E~44, 0.27182817E1) = ~0.0 rem (~0.1E~44, 0.27182817E1) = ~0.1E~44 * (~0.1E~44, 0.123E1) = ~0.1E~44 + (~0.1E~44, 0.123E1) = 0.123E1 - (~0.1E~44, 0.123E1) = ~0.123E1 / (~0.1E~44, 0.123E1) = ~0.1E~44 nextAfter (~0.1E~44, 0.123E1) = ~0.0 rem (~0.1E~44, 0.123E1) = ~0.1E~44 * (~0.1E~44, 0.123) = ~0.0 + (~0.1E~44, 0.123) = 0.123 - (~0.1E~44, 0.123) = ~0.123 / (~0.1E~44, 0.123) = ~0.11E~43 nextAfter (~0.1E~44, 0.123) = ~0.0 rem (~0.1E~44, 0.123) = ~0.1E~44 * (~0.1E~44, 0.123E~2) = ~0.0 + (~0.1E~44, 0.123E~2) = 0.123E~2 - (~0.1E~44, 0.123E~2) = ~0.123E~2 / (~0.1E~44, 0.123E~2) = ~0.1139E~41 nextAfter (~0.1E~44, 0.123E~2) = ~0.0 rem (~0.1E~44, 0.123E~2) = ~0.1E~44 * (~0.1E~44, 0.11754944E~37) = ~0.0 + (~0.1E~44, 0.11754944E~37) = 0.11754942E~37 - (~0.1E~44, 0.11754944E~37) = ~0.11754945E~37 / (~0.1E~44, 0.11754944E~37) = ~0.11920929E~6 nextAfter (~0.1E~44, 0.11754944E~37) = ~0.0 rem (~0.1E~44, 0.11754944E~37) = ~0.1E~44 * (~0.1E~44, 0.5877472E~38) = ~0.0 + (~0.1E~44, 0.5877472E~38) = 0.587747E~38 - (~0.1E~44, 0.5877472E~38) = ~0.5877473E~38 / (~0.1E~44, 0.5877472E~38) = ~0.23841858E~6 nextAfter (~0.1E~44, 0.5877472E~38) = ~0.0 rem (~0.1E~44, 0.5877472E~38) = ~0.1E~44 * (~0.1E~44, 0.1E~44) = ~0.0 + (~0.1E~44, 0.1E~44) = 0.0 - (~0.1E~44, 0.1E~44) = ~0.3E~44 / (~0.1E~44, 0.1E~44) = ~0.1E1 nextAfter (~0.1E~44, 0.1E~44) = ~0.0 rem (~0.1E~44, 0.1E~44) = 0.0 * (~0.1E~44, 0.0) = ~0.0 + (~0.1E~44, 0.0) = ~0.1E~44 - (~0.1E~44, 0.0) = ~0.1E~44 / (~0.1E~44, 0.0) = ~inf nextAfter (~0.1E~44, 0.0) = ~0.0 rem (~0.1E~44, 0.0) = nan * (~0.1E~44, ~0.34028235E39) = 0.47683713E~6 + (~0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (~0.1E~44, ~0.34028235E39) = 0.34028235E39 / (~0.1E~44, ~0.34028235E39) = 0.0 nextAfter (~0.1E~44, ~0.34028235E39) = ~0.3E~44 rem (~0.1E~44, ~0.34028235E39) = ~0.1E~44 * (~0.1E~44, ~0.17014117E39) = 0.23841856E~6 + (~0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (~0.1E~44, ~0.17014117E39) = 0.17014117E39 / (~0.1E~44, ~0.17014117E39) = 0.0 nextAfter (~0.1E~44, ~0.17014117E39) = ~0.3E~44 rem (~0.1E~44, ~0.17014117E39) = ~0.1E~44 * (~0.1E~44, ~0.123E4) = 0.1724E~41 + (~0.1E~44, ~0.123E4) = ~0.123E4 - (~0.1E~44, ~0.123E4) = 0.123E4 / (~0.1E~44, ~0.123E4) = 0.0 nextAfter (~0.1E~44, ~0.123E4) = ~0.3E~44 rem (~0.1E~44, ~0.123E4) = ~0.1E~44 * (~0.1E~44, ~0.123E2) = 0.17E~43 + (~0.1E~44, ~0.123E2) = ~0.123E2 - (~0.1E~44, ~0.123E2) = 0.123E2 / (~0.1E~44, ~0.123E2) = 0.0 nextAfter (~0.1E~44, ~0.123E2) = ~0.3E~44 rem (~0.1E~44, ~0.123E2) = ~0.1E~44 * (~0.1E~44, ~0.31415927E1) = 0.4E~44 + (~0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (~0.1E~44, ~0.31415927E1) = 0.31415927E1 / (~0.1E~44, ~0.31415927E1) = 0.0 nextAfter (~0.1E~44, ~0.31415927E1) = ~0.3E~44 rem (~0.1E~44, ~0.31415927E1) = ~0.1E~44 * (~0.1E~44, ~0.27182817E1) = 0.4E~44 + (~0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (~0.1E~44, ~0.27182817E1) = 0.27182817E1 / (~0.1E~44, ~0.27182817E1) = 0.0 nextAfter (~0.1E~44, ~0.27182817E1) = ~0.3E~44 rem (~0.1E~44, ~0.27182817E1) = ~0.1E~44 * (~0.1E~44, ~0.123E1) = 0.1E~44 + (~0.1E~44, ~0.123E1) = ~0.123E1 - (~0.1E~44, ~0.123E1) = 0.123E1 / (~0.1E~44, ~0.123E1) = 0.1E~44 nextAfter (~0.1E~44, ~0.123E1) = ~0.3E~44 rem (~0.1E~44, ~0.123E1) = ~0.1E~44 * (~0.1E~44, ~0.123) = 0.0 + (~0.1E~44, ~0.123) = ~0.123 - (~0.1E~44, ~0.123) = 0.123 / (~0.1E~44, ~0.123) = 0.11E~43 nextAfter (~0.1E~44, ~0.123) = ~0.3E~44 rem (~0.1E~44, ~0.123) = ~0.1E~44 * (~0.1E~44, ~0.123E~2) = 0.0 + (~0.1E~44, ~0.123E~2) = ~0.123E~2 - (~0.1E~44, ~0.123E~2) = 0.123E~2 / (~0.1E~44, ~0.123E~2) = 0.1139E~41 nextAfter (~0.1E~44, ~0.123E~2) = ~0.3E~44 rem (~0.1E~44, ~0.123E~2) = ~0.1E~44 * (~0.1E~44, ~0.11754944E~37) = 0.0 + (~0.1E~44, ~0.11754944E~37) = ~0.11754945E~37 - (~0.1E~44, ~0.11754944E~37) = 0.11754942E~37 / (~0.1E~44, ~0.11754944E~37) = 0.11920929E~6 nextAfter (~0.1E~44, ~0.11754944E~37) = ~0.3E~44 rem (~0.1E~44, ~0.11754944E~37) = ~0.1E~44 * (~0.1E~44, ~0.5877472E~38) = 0.0 + (~0.1E~44, ~0.5877472E~38) = ~0.5877473E~38 - (~0.1E~44, ~0.5877472E~38) = 0.587747E~38 / (~0.1E~44, ~0.5877472E~38) = 0.23841858E~6 nextAfter (~0.1E~44, ~0.5877472E~38) = ~0.3E~44 rem (~0.1E~44, ~0.5877472E~38) = ~0.1E~44 * (~0.1E~44, ~0.1E~44) = 0.0 + (~0.1E~44, ~0.1E~44) = ~0.3E~44 - (~0.1E~44, ~0.1E~44) = 0.0 / (~0.1E~44, ~0.1E~44) = 0.1E1 nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 rem (~0.1E~44, ~0.1E~44) = 0.0 * (~0.1E~44, ~0.0) = 0.0 + (~0.1E~44, ~0.0) = ~0.1E~44 - (~0.1E~44, ~0.0) = ~0.1E~44 / (~0.1E~44, ~0.0) = inf nextAfter (~0.1E~44, ~0.0) = ~0.0 rem (~0.1E~44, ~0.0) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.1E~44, ~inf) = inf + (~0.1E~44, ~inf) = ~inf - (~0.1E~44, ~inf) = inf / (~0.1E~44, ~inf) = 0.0 nextAfter (~0.1E~44, ~inf) = ~0.3E~44 rem (~0.1E~44, ~inf) = ~0.1E~44 * (~0.1E~44, nan) = nan + (~0.1E~44, nan) = nan - (~0.1E~44, nan) = nan / (~0.1E~44, nan) = nan nextAfter (~0.1E~44, nan) = nan rem (~0.1E~44, nan) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.0, 0.34028235E39) = ~0.0 + (~0.0, 0.34028235E39) = 0.34028235E39 - (~0.0, 0.34028235E39) = ~0.34028235E39 / (~0.0, 0.34028235E39) = ~0.0 nextAfter (~0.0, 0.34028235E39) = 0.1E~44 rem (~0.0, 0.34028235E39) = 0.0 * (~0.0, 0.17014117E39) = ~0.0 + (~0.0, 0.17014117E39) = 0.17014117E39 - (~0.0, 0.17014117E39) = ~0.17014117E39 / (~0.0, 0.17014117E39) = ~0.0 nextAfter (~0.0, 0.17014117E39) = 0.1E~44 rem (~0.0, 0.17014117E39) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.1E~44 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.1E~44 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.31415927E1) = ~0.0 + (~0.0, 0.31415927E1) = 0.31415927E1 - (~0.0, 0.31415927E1) = ~0.31415927E1 / (~0.0, 0.31415927E1) = ~0.0 nextAfter (~0.0, 0.31415927E1) = 0.1E~44 rem (~0.0, 0.31415927E1) = 0.0 * (~0.0, 0.27182817E1) = ~0.0 + (~0.0, 0.27182817E1) = 0.27182817E1 - (~0.0, 0.27182817E1) = ~0.27182817E1 / (~0.0, 0.27182817E1) = ~0.0 nextAfter (~0.0, 0.27182817E1) = 0.1E~44 rem (~0.0, 0.27182817E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.1E~44 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.1E~44 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.1E~44 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.11754944E~37) = ~0.0 + (~0.0, 0.11754944E~37) = 0.11754944E~37 - (~0.0, 0.11754944E~37) = ~0.11754944E~37 / (~0.0, 0.11754944E~37) = ~0.0 nextAfter (~0.0, 0.11754944E~37) = 0.1E~44 rem (~0.0, 0.11754944E~37) = 0.0 * (~0.0, 0.5877472E~38) = ~0.0 + (~0.0, 0.5877472E~38) = 0.5877472E~38 - (~0.0, 0.5877472E~38) = ~0.5877472E~38 / (~0.0, 0.5877472E~38) = ~0.0 nextAfter (~0.0, 0.5877472E~38) = 0.1E~44 rem (~0.0, 0.5877472E~38) = 0.0 * (~0.0, 0.1E~44) = ~0.0 + (~0.0, 0.1E~44) = 0.1E~44 - (~0.0, 0.1E~44) = ~0.1E~44 / (~0.0, 0.1E~44) = ~0.0 nextAfter (~0.0, 0.1E~44) = 0.1E~44 rem (~0.0, 0.1E~44) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.34028235E39) = 0.0 + (~0.0, ~0.34028235E39) = ~0.34028235E39 - (~0.0, ~0.34028235E39) = 0.34028235E39 / (~0.0, ~0.34028235E39) = 0.0 nextAfter (~0.0, ~0.34028235E39) = ~0.1E~44 rem (~0.0, ~0.34028235E39) = 0.0 * (~0.0, ~0.17014117E39) = 0.0 + (~0.0, ~0.17014117E39) = ~0.17014117E39 - (~0.0, ~0.17014117E39) = 0.17014117E39 / (~0.0, ~0.17014117E39) = 0.0 nextAfter (~0.0, ~0.17014117E39) = ~0.1E~44 rem (~0.0, ~0.17014117E39) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.1E~44 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.1E~44 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.31415927E1) = 0.0 + (~0.0, ~0.31415927E1) = ~0.31415927E1 - (~0.0, ~0.31415927E1) = 0.31415927E1 / (~0.0, ~0.31415927E1) = 0.0 nextAfter (~0.0, ~0.31415927E1) = ~0.1E~44 rem (~0.0, ~0.31415927E1) = 0.0 * (~0.0, ~0.27182817E1) = 0.0 + (~0.0, ~0.27182817E1) = ~0.27182817E1 - (~0.0, ~0.27182817E1) = 0.27182817E1 / (~0.0, ~0.27182817E1) = 0.0 nextAfter (~0.0, ~0.27182817E1) = ~0.1E~44 rem (~0.0, ~0.27182817E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.1E~44 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.1E~44 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.1E~44 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.11754944E~37) = 0.0 + (~0.0, ~0.11754944E~37) = ~0.11754944E~37 - (~0.0, ~0.11754944E~37) = 0.11754944E~37 / (~0.0, ~0.11754944E~37) = 0.0 nextAfter (~0.0, ~0.11754944E~37) = ~0.1E~44 rem (~0.0, ~0.11754944E~37) = 0.0 * (~0.0, ~0.5877472E~38) = 0.0 + (~0.0, ~0.5877472E~38) = ~0.5877472E~38 - (~0.0, ~0.5877472E~38) = 0.5877472E~38 / (~0.0, ~0.5877472E~38) = 0.0 nextAfter (~0.0, ~0.5877472E~38) = ~0.1E~44 rem (~0.0, ~0.5877472E~38) = 0.0 * (~0.0, ~0.1E~44) = 0.0 + (~0.0, ~0.1E~44) = ~0.1E~44 - (~0.0, ~0.1E~44) = 0.1E~44 / (~0.0, ~0.1E~44) = 0.0 nextAfter (~0.0, ~0.1E~44) = ~0.1E~44 rem (~0.0, ~0.1E~44) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.1E~44 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.34028235E39) = ~inf + (~inf, 0.34028235E39) = ~inf - (~inf, 0.34028235E39) = ~inf / (~inf, 0.34028235E39) = ~inf nextAfter (~inf, 0.34028235E39) = ~inf rem (~inf, 0.34028235E39) = nan * (~inf, 0.17014117E39) = ~inf + (~inf, 0.17014117E39) = ~inf - (~inf, 0.17014117E39) = ~inf / (~inf, 0.17014117E39) = ~inf nextAfter (~inf, 0.17014117E39) = ~inf rem (~inf, 0.17014117E39) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.31415927E1) = ~inf + (~inf, 0.31415927E1) = ~inf - (~inf, 0.31415927E1) = ~inf / (~inf, 0.31415927E1) = ~inf nextAfter (~inf, 0.31415927E1) = ~inf rem (~inf, 0.31415927E1) = nan * (~inf, 0.27182817E1) = ~inf + (~inf, 0.27182817E1) = ~inf - (~inf, 0.27182817E1) = ~inf / (~inf, 0.27182817E1) = ~inf nextAfter (~inf, 0.27182817E1) = ~inf rem (~inf, 0.27182817E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.11754944E~37) = ~inf + (~inf, 0.11754944E~37) = ~inf - (~inf, 0.11754944E~37) = ~inf / (~inf, 0.11754944E~37) = ~inf nextAfter (~inf, 0.11754944E~37) = ~inf rem (~inf, 0.11754944E~37) = nan * (~inf, 0.5877472E~38) = ~inf + (~inf, 0.5877472E~38) = ~inf - (~inf, 0.5877472E~38) = ~inf / (~inf, 0.5877472E~38) = ~inf nextAfter (~inf, 0.5877472E~38) = ~inf rem (~inf, 0.5877472E~38) = nan * (~inf, 0.1E~44) = ~inf + (~inf, 0.1E~44) = ~inf - (~inf, 0.1E~44) = ~inf / (~inf, 0.1E~44) = ~inf nextAfter (~inf, 0.1E~44) = ~inf rem (~inf, 0.1E~44) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.34028235E39) = inf + (~inf, ~0.34028235E39) = ~inf - (~inf, ~0.34028235E39) = ~inf / (~inf, ~0.34028235E39) = inf nextAfter (~inf, ~0.34028235E39) = ~inf rem (~inf, ~0.34028235E39) = nan * (~inf, ~0.17014117E39) = inf + (~inf, ~0.17014117E39) = ~inf - (~inf, ~0.17014117E39) = ~inf / (~inf, ~0.17014117E39) = inf nextAfter (~inf, ~0.17014117E39) = ~inf rem (~inf, ~0.17014117E39) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.31415927E1) = inf + (~inf, ~0.31415927E1) = ~inf - (~inf, ~0.31415927E1) = ~inf / (~inf, ~0.31415927E1) = inf nextAfter (~inf, ~0.31415927E1) = ~inf rem (~inf, ~0.31415927E1) = nan * (~inf, ~0.27182817E1) = inf + (~inf, ~0.27182817E1) = ~inf - (~inf, ~0.27182817E1) = ~inf / (~inf, ~0.27182817E1) = inf nextAfter (~inf, ~0.27182817E1) = ~inf rem (~inf, ~0.27182817E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.11754944E~37) = inf + (~inf, ~0.11754944E~37) = ~inf - (~inf, ~0.11754944E~37) = ~inf / (~inf, ~0.11754944E~37) = inf nextAfter (~inf, ~0.11754944E~37) = ~inf rem (~inf, ~0.11754944E~37) = nan * (~inf, ~0.5877472E~38) = inf + (~inf, ~0.5877472E~38) = ~inf - (~inf, ~0.5877472E~38) = ~inf / (~inf, ~0.5877472E~38) = inf nextAfter (~inf, ~0.5877472E~38) = ~inf rem (~inf, ~0.5877472E~38) = nan * (~inf, ~0.1E~44) = inf + (~inf, ~0.1E~44) = ~inf - (~inf, ~0.1E~44) = ~inf / (~inf, ~0.1E~44) = inf nextAfter (~inf, ~0.1E~44) = ~inf rem (~inf, ~0.1E~44) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.34028235E39) = nan + (nan, 0.34028235E39) = nan - (nan, 0.34028235E39) = nan / (nan, 0.34028235E39) = nan nextAfter (nan, 0.34028235E39) = nan rem (nan, 0.34028235E39) = nan * (nan, 0.17014117E39) = nan + (nan, 0.17014117E39) = nan - (nan, 0.17014117E39) = nan / (nan, 0.17014117E39) = nan nextAfter (nan, 0.17014117E39) = nan rem (nan, 0.17014117E39) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.31415927E1) = nan + (nan, 0.31415927E1) = nan - (nan, 0.31415927E1) = nan / (nan, 0.31415927E1) = nan nextAfter (nan, 0.31415927E1) = nan rem (nan, 0.31415927E1) = nan * (nan, 0.27182817E1) = nan + (nan, 0.27182817E1) = nan - (nan, 0.27182817E1) = nan / (nan, 0.27182817E1) = nan nextAfter (nan, 0.27182817E1) = nan rem (nan, 0.27182817E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.11754944E~37) = nan + (nan, 0.11754944E~37) = nan - (nan, 0.11754944E~37) = nan / (nan, 0.11754944E~37) = nan nextAfter (nan, 0.11754944E~37) = nan rem (nan, 0.11754944E~37) = nan * (nan, 0.5877472E~38) = nan + (nan, 0.5877472E~38) = nan - (nan, 0.5877472E~38) = nan / (nan, 0.5877472E~38) = nan nextAfter (nan, 0.5877472E~38) = nan rem (nan, 0.5877472E~38) = nan * (nan, 0.1E~44) = nan + (nan, 0.1E~44) = nan - (nan, 0.1E~44) = nan / (nan, 0.1E~44) = nan nextAfter (nan, 0.1E~44) = nan rem (nan, 0.1E~44) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.34028235E39) = nan + (nan, ~0.34028235E39) = nan - (nan, ~0.34028235E39) = nan / (nan, ~0.34028235E39) = nan nextAfter (nan, ~0.34028235E39) = nan rem (nan, ~0.34028235E39) = nan * (nan, ~0.17014117E39) = nan + (nan, ~0.17014117E39) = nan - (nan, ~0.17014117E39) = nan / (nan, ~0.17014117E39) = nan nextAfter (nan, ~0.17014117E39) = nan rem (nan, ~0.17014117E39) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.31415927E1) = nan + (nan, ~0.31415927E1) = nan - (nan, ~0.31415927E1) = nan / (nan, ~0.31415927E1) = nan nextAfter (nan, ~0.31415927E1) = nan rem (nan, ~0.31415927E1) = nan * (nan, ~0.27182817E1) = nan + (nan, ~0.27182817E1) = nan - (nan, ~0.27182817E1) = nan / (nan, ~0.27182817E1) = nan nextAfter (nan, ~0.27182817E1) = nan rem (nan, ~0.27182817E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.11754944E~37) = nan + (nan, ~0.11754944E~37) = nan - (nan, ~0.11754944E~37) = nan / (nan, ~0.11754944E~37) = nan nextAfter (nan, ~0.11754944E~37) = nan rem (nan, ~0.11754944E~37) = nan * (nan, ~0.5877472E~38) = nan + (nan, ~0.5877472E~38) = nan - (nan, ~0.5877472E~38) = nan / (nan, ~0.5877472E~38) = nan nextAfter (nan, ~0.5877472E~38) = nan rem (nan, ~0.5877472E~38) = nan * (nan, ~0.1E~44) = nan + (nan, ~0.1E~44) = nan - (nan, ~0.1E~44) = nan / (nan, ~0.1E~44) = nan nextAfter (nan, ~0.1E~44) = nan rem (nan, ~0.1E~44) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.34028235E39) = nan asin (0.34028235E39) = nan atan (0.34028235E39) = 1.570796371 cos (0.34028235E39) = 0.8530210257 cosh (0.34028235E39) = inf exp (0.34028235E39) = inf ln (0.34028235E39) = 88.72283936 log10 (0.34028235E39) = 38.53184128 sin (0.34028235E39) = ~0.521876514 sinh (0.34028235E39) = inf sqrt (0.34028235E39) = 1.844674297E19 tan (0.34028235E39) = ~0.6117979288 tanh (0.34028235E39) = 1 acos (0.17014117E39) = nan asin (0.17014117E39) = nan atan (0.17014117E39) = 1.570796371 cos (0.17014117E39) = ~0.9625541568 cosh (0.17014117E39) = inf exp (0.17014117E39) = inf ln (0.17014117E39) = 88.0296936 log10 (0.17014117E39) = 38.23080826 sin (0.17014117E39) = 0.2710894346 sinh (0.17014117E39) = inf sqrt (0.17014117E39) = 1.30438176E19 tan (0.17014117E39) = ~0.2816355228 tanh (0.17014117E39) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983363 cos (0.123E4) = 0.06642717123 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769459 log10 (0.123E4) = 3.089905024 sin (0.123E4) = ~0.9977912903 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135773 tan (0.123E4) = ~15.02083111 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673972 cos (0.123E2) = 0.9647326469 cosh (0.123E2) = 109848.0156 exp (0.123E2) = 219696.0312 ln (0.123E2) = 2.509599209 log10 (0.123E2) = 1.089905143 sin (0.123E2) = ~0.2632316053 sinh (0.123E2) = 109848.0156 sqrt (0.123E2) = 3.50713563 tan (0.123E2) = ~0.2728544474 tanh (0.123E2) = 1 acos (0.31415927E1) = nan asin (0.31415927E1) = nan atan (0.31415927E1) = 1.262627244 cos (0.31415927E1) = ~1 cosh (0.31415927E1) = 11.59195518 exp (0.31415927E1) = 23.14069557 ln (0.31415927E1) = 1.144729972 log10 (0.31415927E1) = 0.4971498847 sin (0.31415927E1) = ~8.742277657E~8 sinh (0.31415927E1) = 11.54873943 sqrt (0.31415927E1) = 1.772453904 tan (0.31415927E1) = 8.742277657E~8 tanh (0.31415927E1) = 0.9962720871 acos (0.27182817E1) = nan asin (0.27182817E1) = nan atan (0.27182817E1) = 1.218282938 cos (0.27182817E1) = ~0.9117338657 cosh (0.27182817E1) = 7.610124111 exp (0.27182817E1) = 15.15426064 ln (0.27182817E1) = 0.9999999404 log10 (0.27182817E1) = 0.4342944622 sin (0.27182817E1) = 0.4107813537 sinh (0.27182817E1) = 7.544136047 sqrt (0.27182817E1) = 1.648721218 tan (0.27182817E1) = ~0.4505496323 tanh (0.27182817E1) = 0.9913288951 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.888173759 cos (0.123E1) = 0.3342376947 cosh (0.123E1) = 1.856761098 exp (0.123E1) = 3.421229601 ln (0.123E1) = 0.2070141882 log10 (0.123E1) = 0.08990512043 sin (0.123E1) = 0.9424887896 sinh (0.123E1) = 1.564468503 sqrt (0.123E1) = 1.109053612 tan (0.123E1) = 2.819815874 tanh (0.123E1) = 0.8425793648 acos (0.123) = 1.447484016 asin (0.123) = 0.1233122796 atan (0.123) = 0.1223852858 cos (0.123) = 0.9924450517 cosh (0.123) = 1.007574081 exp (0.123) = 1.130884409 ln (0.123) = ~2.095570803 log10 (0.123) = ~0.9100948572 sin (0.123) = 0.1226900965 sinh (0.123) = 0.1233103797 sqrt (0.123) = 0.350713551 tan (0.123) = 0.1236240715 tanh (0.123) = 0.1223834455 acos (0.123E~2) = 1.569566369 asin (0.123E~2) = 0.001230000402 atan (0.123E~2) = 0.001229999471 cos (0.123E~2) = 0.9999992251 cosh (0.123E~2) = 1.000000715 exp (0.123E~2) = 1.001230717 ln (0.123E~2) = ~6.700741291 log10 (0.123E~2) = ~2.910094976 sin (0.123E~2) = 0.001229999703 sinh (0.123E~2) = 0.001230000402 sqrt (0.123E~2) = 0.03507135808 tan (0.123E~2) = 0.001230000635 tanh (0.123E~2) = 0.001229999471 acos (0.11754944E~37) = 1.570796371 asin (0.11754944E~37) = 1.175494351E~38 atan (0.11754944E~37) = 1.175494351E~38 cos (0.11754944E~37) = 1 cosh (0.11754944E~37) = 1 exp (0.11754944E~37) = 1 ln (0.11754944E~37) = ~87.33654785 log10 (0.11754944E~37) = ~37.92977905 sin (0.11754944E~37) = 1.175494351E~38 sinh (0.11754944E~37) = 1.175494351E~38 sqrt (0.11754944E~37) = 1.084202172E~19 tan (0.11754944E~37) = 1.175494351E~38 tanh (0.11754944E~37) = 1.175494351E~38 acos (0.5877472E~38) = 1.570796371 asin (0.5877472E~38) = 5.877471754E~39 atan (0.5877472E~38) = 5.877471754E~39 cos (0.5877472E~38) = 1 cosh (0.5877472E~38) = 1 exp (0.5877472E~38) = 1 ln (0.5877472E~38) = ~88.0296936 log10 (0.5877472E~38) = ~38.23080826 sin (0.5877472E~38) = 5.877471754E~39 sinh (0.5877472E~38) = 5.877471754E~39 sqrt (0.5877472E~38) = 7.666466952E~20 tan (0.5877472E~38) = 5.877471754E~39 tanh (0.5877472E~38) = 5.877471754E~39 acos (0.1E~44) = 1.570796371 asin (0.1E~44) = 1.401298464E~45 atan (0.1E~44) = 1.401298464E~45 cos (0.1E~44) = 1 cosh (0.1E~44) = 1 exp (0.1E~44) = 1 ln (0.1E~44) = ~103.2789307 log10 (0.1E~44) = ~44.85346985 sin (0.1E~44) = 1.401298464E~45 sinh (0.1E~44) = 1.401298464E~45 sqrt (0.1E~44) = 3.743392067E~23 tan (0.1E~44) = 1.401298464E~45 tanh (0.1E~44) = 1.401298464E~45 acos (0.0) = 1.570796371 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.34028235E39) = nan asin (~0.34028235E39) = nan atan (~0.34028235E39) = ~1.570796371 cos (~0.34028235E39) = 0.8530210257 cosh (~0.34028235E39) = inf exp (~0.34028235E39) = 0 ln (~0.34028235E39) = nan log10 (~0.34028235E39) = nan sin (~0.34028235E39) = 0.521876514 sinh (~0.34028235E39) = ~inf sqrt (~0.34028235E39) = nan tan (~0.34028235E39) = 0.6117979288 tanh (~0.34028235E39) = ~1 acos (~0.17014117E39) = nan asin (~0.17014117E39) = nan atan (~0.17014117E39) = ~1.570796371 cos (~0.17014117E39) = ~0.9625541568 cosh (~0.17014117E39) = inf exp (~0.17014117E39) = 0 ln (~0.17014117E39) = nan log10 (~0.17014117E39) = nan sin (~0.17014117E39) = ~0.2710894346 sinh (~0.17014117E39) = ~inf sqrt (~0.17014117E39) = nan tan (~0.17014117E39) = 0.2816355228 tanh (~0.17014117E39) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983363 cos (~0.123E4) = 0.06642717123 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912903 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083111 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673972 cos (~0.123E2) = 0.9647326469 cosh (~0.123E2) = 109848.0156 exp (~0.123E2) = 4.551743586E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632316053 sinh (~0.123E2) = ~109848.0156 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.2728544474 tanh (~0.123E2) = ~1 acos (~0.31415927E1) = nan asin (~0.31415927E1) = nan atan (~0.31415927E1) = ~1.262627244 cos (~0.31415927E1) = ~1 cosh (~0.31415927E1) = 11.59195518 exp (~0.31415927E1) = 0.04321391508 ln (~0.31415927E1) = nan log10 (~0.31415927E1) = nan sin (~0.31415927E1) = 8.742277657E~8 sinh (~0.31415927E1) = ~11.54873943 sqrt (~0.31415927E1) = nan tan (~0.31415927E1) = ~8.742277657E~8 tanh (~0.31415927E1) = ~0.9962720871 acos (~0.27182817E1) = nan asin (~0.27182817E1) = nan atan (~0.27182817E1) = ~1.218282938 cos (~0.27182817E1) = ~0.9117338657 cosh (~0.27182817E1) = 7.610124111 exp (~0.27182817E1) = 0.06598804146 ln (~0.27182817E1) = nan log10 (~0.27182817E1) = nan sin (~0.27182817E1) = ~0.4107813537 sinh (~0.27182817E1) = ~7.544136047 sqrt (~0.27182817E1) = nan tan (~0.27182817E1) = 0.4505496323 tanh (~0.27182817E1) = ~0.9913288951 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.888173759 cos (~0.123E1) = 0.3342376947 cosh (~0.123E1) = 1.856761098 exp (~0.123E1) = 0.2922925651 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424887896 sinh (~0.123E1) = ~1.564468503 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815874 tanh (~0.123E1) = ~0.8425793648 acos (~0.123) = 1.694108605 asin (~0.123) = ~0.1233122796 atan (~0.123) = ~0.1223852858 cos (~0.123) = 0.9924450517 cosh (~0.123) = 1.007574081 exp (~0.123) = 0.8842636347 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.1226900965 sinh (~0.123) = ~0.1233103797 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240715 tanh (~0.123) = ~0.1223834455 acos (~0.123E~2) = 1.572026372 asin (~0.123E~2) = ~0.001230000402 atan (~0.123E~2) = ~0.001229999471 cos (~0.123E~2) = 0.9999992251 cosh (~0.123E~2) = 1.000000715 exp (~0.123E~2) = 0.9987707734 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.001229999703 sinh (~0.123E~2) = ~0.001230000402 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.001230000635 tanh (~0.123E~2) = ~0.001229999471 acos (~0.11754944E~37) = 1.570796371 asin (~0.11754944E~37) = ~1.175494351E~38 atan (~0.11754944E~37) = ~1.175494351E~38 cos (~0.11754944E~37) = 1 cosh (~0.11754944E~37) = 1 exp (~0.11754944E~37) = 1 ln (~0.11754944E~37) = nan log10 (~0.11754944E~37) = nan sin (~0.11754944E~37) = ~1.175494351E~38 sinh (~0.11754944E~37) = ~1.175494351E~38 sqrt (~0.11754944E~37) = nan tan (~0.11754944E~37) = ~1.175494351E~38 tanh (~0.11754944E~37) = ~1.175494351E~38 acos (~0.5877472E~38) = 1.570796371 asin (~0.5877472E~38) = ~5.877471754E~39 atan (~0.5877472E~38) = ~5.877471754E~39 cos (~0.5877472E~38) = 1 cosh (~0.5877472E~38) = 1 exp (~0.5877472E~38) = 1 ln (~0.5877472E~38) = nan log10 (~0.5877472E~38) = nan sin (~0.5877472E~38) = ~5.877471754E~39 sinh (~0.5877472E~38) = ~5.877471754E~39 sqrt (~0.5877472E~38) = nan tan (~0.5877472E~38) = ~5.877471754E~39 tanh (~0.5877472E~38) = ~5.877471754E~39 acos (~0.1E~44) = 1.570796371 asin (~0.1E~44) = ~1.401298464E~45 atan (~0.1E~44) = ~1.401298464E~45 cos (~0.1E~44) = 1 cosh (~0.1E~44) = 1 exp (~0.1E~44) = 1 ln (~0.1E~44) = nan log10 (~0.1E~44) = nan sin (~0.1E~44) = ~1.401298464E~45 sinh (~0.1E~44) = ~1.401298464E~45 sqrt (~0.1E~44) = nan tan (~0.1E~44) = ~1.401298464E~45 tanh (~0.1E~44) = ~1.401298464E~45 acos (~0.0) = 1.570796371 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796371 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.34028235E39, 0.34028235E39) = 0.7853981853 pow (0.34028235E39, 0.34028235E39) = inf atan2 (0.34028235E39, 0.17014117E39) = 1.107148767 pow (0.34028235E39, 0.17014117E39) = inf atan2 (0.34028235E39, 0.123E4) = 1.570796371 pow (0.34028235E39, 0.123E4) = inf atan2 (0.34028235E39, 0.123E2) = 1.570796371 pow (0.34028235E39, 0.123E2) = inf atan2 (0.34028235E39, 0.31415927E1) = 1.570796371 pow (0.34028235E39, 0.31415927E1) = inf atan2 (0.34028235E39, 0.27182817E1) = 1.570796371 pow (0.34028235E39, 0.27182817E1) = inf atan2 (0.34028235E39, 0.123E1) = 1.570796371 pow (0.34028235E39, 0.123E1) = inf atan2 (0.34028235E39, 0.123) = 1.570796371 pow (0.34028235E39, 0.123) = 54880.28906 atan2 (0.34028235E39, 0.123E~2) = 1.570796371 pow (0.34028235E39, 0.123E~2) = 1.115306377 atan2 (0.34028235E39, 0.11754944E~37) = 1.570796371 pow (0.34028235E39, 0.11754944E~37) = 1 atan2 (0.34028235E39, 0.5877472E~38) = 1.570796371 pow (0.34028235E39, 0.5877472E~38) = 1 atan2 (0.34028235E39, 0.1E~44) = 1.570796371 pow (0.34028235E39, 0.1E~44) = 1 atan2 (0.34028235E39, 0.0) = 1.570796371 pow (0.34028235E39, 0.0) = 1 atan2 (0.34028235E39, ~0.34028235E39) = 2.356194496 pow (0.34028235E39, ~0.34028235E39) = 0 atan2 (0.34028235E39, ~0.17014117E39) = 2.034443855 pow (0.34028235E39, ~0.17014117E39) = 0 atan2 (0.34028235E39, ~0.123E4) = 1.570796251 pow (0.34028235E39, ~0.123E4) = 0 atan2 (0.34028235E39, ~0.123E2) = 1.570796251 pow (0.34028235E39, ~0.123E2) = 0 atan2 (0.34028235E39, ~0.31415927E1) = 1.570796251 pow (0.34028235E39, ~0.31415927E1) = 0 atan2 (0.34028235E39, ~0.27182817E1) = 1.570796251 pow (0.34028235E39, ~0.27182817E1) = 0 atan2 (0.34028235E39, ~0.123E1) = 1.570796251 pow (0.34028235E39, ~0.123E1) = 0 atan2 (0.34028235E39, ~0.123) = 1.570796251 pow (0.34028235E39, ~0.123) = 1.822147897E~5 atan2 (0.34028235E39, ~0.123E~2) = 1.570796251 pow (0.34028235E39, ~0.123E~2) = 0.8966146708 atan2 (0.34028235E39, ~0.11754944E~37) = 1.570796251 pow (0.34028235E39, ~0.11754944E~37) = 1 atan2 (0.34028235E39, ~0.5877472E~38) = 1.570796251 pow (0.34028235E39, ~0.5877472E~38) = 1 atan2 (0.34028235E39, ~0.1E~44) = 1.570796251 pow (0.34028235E39, ~0.1E~44) = 1 atan2 (0.34028235E39, ~0.0) = 1.570796371 pow (0.34028235E39, ~0.0) = 1 atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.34028235E39, ~inf) = 3.141592741 pow (0.34028235E39, ~inf) = 0 atan2 (0.34028235E39, nan) = nan pow (0.34028235E39, nan) = nan atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.17014117E39, 0.34028235E39) = 0.463647604 pow (0.17014117E39, 0.34028235E39) = inf atan2 (0.17014117E39, 0.17014117E39) = 0.7853981853 pow (0.17014117E39, 0.17014117E39) = inf atan2 (0.17014117E39, 0.123E4) = 1.570796371 pow (0.17014117E39, 0.123E4) = inf atan2 (0.17014117E39, 0.123E2) = 1.570796371 pow (0.17014117E39, 0.123E2) = inf atan2 (0.17014117E39, 0.31415927E1) = 1.570796371 pow (0.17014117E39, 0.31415927E1) = inf atan2 (0.17014117E39, 0.27182817E1) = 1.570796371 pow (0.17014117E39, 0.27182817E1) = inf atan2 (0.17014117E39, 0.123E1) = 1.570796371 pow (0.17014117E39, 0.123E1) = inf atan2 (0.17014117E39, 0.123) = 1.570796371 pow (0.17014117E39, 0.123) = 50395.26172 atan2 (0.17014117E39, 0.123E~2) = 1.570796371 pow (0.17014117E39, 0.123E~2) = 1.114355803 atan2 (0.17014117E39, 0.11754944E~37) = 1.570796371 pow (0.17014117E39, 0.11754944E~37) = 1 atan2 (0.17014117E39, 0.5877472E~38) = 1.570796371 pow (0.17014117E39, 0.5877472E~38) = 1 atan2 (0.17014117E39, 0.1E~44) = 1.570796371 pow (0.17014117E39, 0.1E~44) = 1 atan2 (0.17014117E39, 0.0) = 1.570796371 pow (0.17014117E39, 0.0) = 1 atan2 (0.17014117E39, ~0.34028235E39) = 2.677945137 pow (0.17014117E39, ~0.34028235E39) = 0 atan2 (0.17014117E39, ~0.17014117E39) = 2.356194496 pow (0.17014117E39, ~0.17014117E39) = 0 atan2 (0.17014117E39, ~0.123E4) = 1.570796251 pow (0.17014117E39, ~0.123E4) = 0 atan2 (0.17014117E39, ~0.123E2) = 1.570796251 pow (0.17014117E39, ~0.123E2) = 0 atan2 (0.17014117E39, ~0.31415927E1) = 1.570796251 pow (0.17014117E39, ~0.31415927E1) = 0 atan2 (0.17014117E39, ~0.27182817E1) = 1.570796251 pow (0.17014117E39, ~0.27182817E1) = 0 atan2 (0.17014117E39, ~0.123E1) = 1.570796251 pow (0.17014117E39, ~0.123E1) = 0 atan2 (0.17014117E39, ~0.123) = 1.570796251 pow (0.17014117E39, ~0.123) = 1.984313531E~5 atan2 (0.17014117E39, ~0.123E~2) = 1.570796251 pow (0.17014117E39, ~0.123E~2) = 0.8973793983 atan2 (0.17014117E39, ~0.11754944E~37) = 1.570796251 pow (0.17014117E39, ~0.11754944E~37) = 1 atan2 (0.17014117E39, ~0.5877472E~38) = 1.570796251 pow (0.17014117E39, ~0.5877472E~38) = 1 atan2 (0.17014117E39, ~0.1E~44) = 1.570796251 pow (0.17014117E39, ~0.1E~44) = 1 atan2 (0.17014117E39, ~0.0) = 1.570796371 pow (0.17014117E39, ~0.0) = 1 atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.17014117E39, ~inf) = 3.141592741 pow (0.17014117E39, ~inf) = 0 atan2 (0.17014117E39, nan) = nan pow (0.17014117E39, nan) = nan atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.123E4, 0.34028235E39) = 3.614645488E~36 pow (0.123E4, 0.34028235E39) = inf atan2 (0.123E4, 0.17014117E39) = 7.229290975E~36 pow (0.123E4, 0.17014117E39) = inf atan2 (0.123E4, 0.123E4) = 0.7853981853 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.560796618 pow (0.123E4, 0.123E2) = 1.013522656E38 atan2 (0.123E4, 0.31415927E1) = 1.568242192 pow (0.123E4, 0.31415927E1) = 5095930368 atan2 (0.123E4, 0.27182817E1) = 1.568586349 pow (0.123E4, 0.27182817E1) = 250745216 atan2 (0.123E4, 0.123E1) = 1.569796324 pow (0.123E4, 0.123E1) = 6318.054199 atan2 (0.123E4, 0.123) = 1.570696354 pow (0.123E4, 0.123) = 2.39915514 atan2 (0.123E4, 0.123E~2) = 1.570795298 pow (0.123E4, 0.123E~2) = 1.008789539 atan2 (0.123E4, 0.11754944E~37) = 1.570796371 pow (0.123E4, 0.11754944E~37) = 1 atan2 (0.123E4, 0.5877472E~38) = 1.570796371 pow (0.123E4, 0.5877472E~38) = 1 atan2 (0.123E4, 0.1E~44) = 1.570796371 pow (0.123E4, 0.1E~44) = 1 atan2 (0.123E4, 0.0) = 1.570796371 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.34028235E39) = 3.141592741 pow (0.123E4, ~0.34028235E39) = 0 atan2 (0.123E4, ~0.17014117E39) = 3.141592741 pow (0.123E4, ~0.17014117E39) = 0 atan2 (0.123E4, ~0.123E4) = 2.356194496 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580796003 pow (0.123E4, ~0.123E2) = 9.86657752E~39 atan2 (0.123E4, ~0.31415927E1) = 1.57335043 pow (0.123E4, ~0.31415927E1) = 1.962350282E~10 atan2 (0.123E4, ~0.27182817E1) = 1.573006272 pow (0.123E4, ~0.27182817E1) = 3.988112063E~9 atan2 (0.123E4, ~0.123E1) = 1.571796298 pow (0.123E4, ~0.123E1) = 1.582765835E~4 atan2 (0.123E4, ~0.123) = 1.570896268 pow (0.123E4, ~0.123) = 0.4168134034 atan2 (0.123E4, ~0.123E~2) = 1.570797324 pow (0.123E4, ~0.123E~2) = 0.991286993 atan2 (0.123E4, ~0.11754944E~37) = 1.570796251 pow (0.123E4, ~0.11754944E~37) = 1 atan2 (0.123E4, ~0.5877472E~38) = 1.570796251 pow (0.123E4, ~0.5877472E~38) = 1 atan2 (0.123E4, ~0.1E~44) = 1.570796251 pow (0.123E4, ~0.1E~44) = 1 atan2 (0.123E4, ~0.0) = 1.570796371 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592741 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.34028235E39) = 3.614645465E~38 pow (0.123E2, 0.34028235E39) = inf atan2 (0.123E2, 0.17014117E39) = 7.22929093E~38 pow (0.123E2, 0.17014117E39) = inf atan2 (0.123E2, 0.123E4) = 0.009999666363 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981853 pow (0.123E2, 0.123E2) = 2.545852141E13 atan2 (0.123E2, 0.31415927E1) = 1.32072866 pow (0.123E2, 0.31415927E1) = 2654.837891 atan2 (0.123E2, 0.27182817E1) = 1.353293777 pow (0.123E2, 0.27182817E1) = 917.6333618 atan2 (0.123E2, 0.123E1) = 1.471127629 pow (0.123E2, 0.123E1) = 21.90702057 atan2 (0.123E2, 0.123) = 1.560796618 pow (0.123E2, 0.123) = 1.361627579 atan2 (0.123E2, 0.123E~2) = 1.570696354 pow (0.123E2, 0.123E~2) = 1.003091574 atan2 (0.123E2, 0.11754944E~37) = 1.570796371 pow (0.123E2, 0.11754944E~37) = 1 atan2 (0.123E2, 0.5877472E~38) = 1.570796371 pow (0.123E2, 0.5877472E~38) = 1 atan2 (0.123E2, 0.1E~44) = 1.570796371 pow (0.123E2, 0.1E~44) = 1 atan2 (0.123E2, 0.0) = 1.570796371 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.34028235E39) = 3.141592741 pow (0.123E2, ~0.34028235E39) = 0 atan2 (0.123E2, ~0.17014117E39) = 3.141592741 pow (0.123E2, ~0.17014117E39) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592989 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.356194496 pow (0.123E2, ~0.123E2) = 3.927958084E~14 atan2 (0.123E2, ~0.31415927E1) = 1.820863962 pow (0.123E2, ~0.31415927E1) = 3.766708251E~4 atan2 (0.123E2, ~0.27182817E1) = 1.788298845 pow (0.123E2, ~0.27182817E1) = 0.00108975987 atan2 (0.123E2, ~0.123E1) = 1.670464993 pow (0.123E2, ~0.123E1) = 0.04564746842 atan2 (0.123E2, ~0.123) = 1.580796003 pow (0.123E2, ~0.123) = 0.7344152331 atan2 (0.123E2, ~0.123E~2) = 1.570896268 pow (0.123E2, ~0.123E~2) = 0.996917963 atan2 (0.123E2, ~0.11754944E~37) = 1.570796251 pow (0.123E2, ~0.11754944E~37) = 1 atan2 (0.123E2, ~0.5877472E~38) = 1.570796251 pow (0.123E2, ~0.5877472E~38) = 1 atan2 (0.123E2, ~0.1E~44) = 1.570796251 pow (0.123E2, ~0.1E~44) = 1 atan2 (0.123E2, ~0.0) = 1.570796371 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592741 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.31415927E1, 0.34028235E39) = 9.232312E~39 pow (0.31415927E1, 0.34028235E39) = inf atan2 (0.31415927E1, 0.17014117E39) = 1.8464624E~38 pow (0.31415927E1, 0.17014117E39) = inf atan2 (0.31415927E1, 0.123E4) = 0.002554134931 pow (0.31415927E1, 0.123E4) = inf atan2 (0.31415927E1, 0.123E2) = 0.2500677109 pow (0.31415927E1, 0.123E2) = 1302997.75 atan2 (0.31415927E1, 0.31415927E1) = 0.7853981853 pow (0.31415927E1, 0.31415927E1) = 36.46216583 atan2 (0.31415927E1, 0.27182817E1) = 0.8575118184 pow (0.31415927E1, 0.27182817E1) = 22.45915794 atan2 (0.31415927E1, 0.123E1) = 1.19762063 pow (0.31415927E1, 0.123E1) = 4.087844372 atan2 (0.31415927E1, 0.123) = 1.531664252 pow (0.31415927E1, 0.123) = 1.15119648 atan2 (0.31415927E1, 0.123E~2) = 1.570404768 pow (0.31415927E1, 0.123E~2) = 1.001409054 atan2 (0.31415927E1, 0.11754944E~37) = 1.570796371 pow (0.31415927E1, 0.11754944E~37) = 1 atan2 (0.31415927E1, 0.5877472E~38) = 1.570796371 pow (0.31415927E1, 0.5877472E~38) = 1 atan2 (0.31415927E1, 0.1E~44) = 1.570796371 pow (0.31415927E1, 0.1E~44) = 1 atan2 (0.31415927E1, 0.0) = 1.570796371 pow (0.31415927E1, 0.0) = 1 atan2 (0.31415927E1, ~0.34028235E39) = 3.141592741 pow (0.31415927E1, ~0.34028235E39) = 0 atan2 (0.31415927E1, ~0.17014117E39) = 3.141592741 pow (0.31415927E1, ~0.17014117E39) = 0 atan2 (0.31415927E1, ~0.123E4) = 3.139038563 pow (0.31415927E1, ~0.123E4) = 0 atan2 (0.31415927E1, ~0.123E2) = 2.89152503 pow (0.31415927E1, ~0.123E2) = 7.674610174E~7 atan2 (0.31415927E1, ~0.31415927E1) = 2.356194496 pow (0.31415927E1, ~0.31415927E1) = 0.02742568776 atan2 (0.31415927E1, ~0.27182817E1) = 2.284080982 pow (0.31415927E1, ~0.27182817E1) = 0.04452526942 atan2 (0.31415927E1, ~0.123E1) = 1.943971992 pow (0.31415927E1, ~0.123E1) = 0.2446276993 atan2 (0.31415927E1, ~0.123) = 1.60992837 pow (0.31415927E1, ~0.123) = 0.8686614633 atan2 (0.31415927E1, ~0.123E~2) = 1.571187854 pow (0.31415927E1, ~0.123E~2) = 0.9985929728 atan2 (0.31415927E1, ~0.11754944E~37) = 1.570796251 pow (0.31415927E1, ~0.11754944E~37) = 1 atan2 (0.31415927E1, ~0.5877472E~38) = 1.570796251 pow (0.31415927E1, ~0.5877472E~38) = 1 atan2 (0.31415927E1, ~0.1E~44) = 1.570796251 pow (0.31415927E1, ~0.1E~44) = 1 atan2 (0.31415927E1, ~0.0) = 1.570796371 pow (0.31415927E1, ~0.0) = 1 atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.31415927E1, ~inf) = 3.141592741 pow (0.31415927E1, ~inf) = 0 atan2 (0.31415927E1, nan) = nan pow (0.31415927E1, nan) = nan atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.27182817E1, 0.34028235E39) = 7.988312091E~39 pow (0.27182817E1, 0.34028235E39) = inf atan2 (0.27182817E1, 0.17014117E39) = 1.597662558E~38 pow (0.27182817E1, 0.17014117E39) = inf atan2 (0.27182817E1, 0.123E4) = 0.002209981671 pow (0.27182817E1, 0.123E4) = inf atan2 (0.27182817E1, 0.123E2) = 0.2175025195 pow (0.27182817E1, 0.123E2) = 219695.9531 atan2 (0.27182817E1, 0.31415927E1) = 0.7132844925 pow (0.27182817E1, 0.31415927E1) = 23.14069176 atan2 (0.27182817E1, 0.27182817E1) = 0.7853981853 pow (0.27182817E1, 0.27182817E1) = 15.15425968 atan2 (0.27182817E1, 0.123E1) = 1.145872235 pow (0.27182817E1, 0.123E1) = 3.421229362 atan2 (0.27182817E1, 0.123) = 1.525578022 pow (0.27182817E1, 0.123) = 1.130884409 atan2 (0.27182817E1, 0.123E~2) = 1.570343852 pow (0.27182817E1, 0.123E~2) = 1.001230717 atan2 (0.27182817E1, 0.11754944E~37) = 1.570796371 pow (0.27182817E1, 0.11754944E~37) = 1 atan2 (0.27182817E1, 0.5877472E~38) = 1.570796371 pow (0.27182817E1, 0.5877472E~38) = 1 atan2 (0.27182817E1, 0.1E~44) = 1.570796371 pow (0.27182817E1, 0.1E~44) = 1 atan2 (0.27182817E1, 0.0) = 1.570796371 pow (0.27182817E1, 0.0) = 1 atan2 (0.27182817E1, ~0.34028235E39) = 3.141592741 pow (0.27182817E1, ~0.34028235E39) = 0 atan2 (0.27182817E1, ~0.17014117E39) = 3.141592741 pow (0.27182817E1, ~0.17014117E39) = 0 atan2 (0.27182817E1, ~0.123E4) = 3.139382601 pow (0.27182817E1, ~0.123E4) = 0 atan2 (0.27182817E1, ~0.123E2) = 2.924090147 pow (0.27182817E1, ~0.123E2) = 4.551745405E~6 atan2 (0.27182817E1, ~0.31415927E1) = 2.428308249 pow (0.27182817E1, ~0.31415927E1) = 0.04321391881 atan2 (0.27182817E1, ~0.27182817E1) = 2.356194496 pow (0.27182817E1, ~0.27182817E1) = 0.06598804891 atan2 (0.27182817E1, ~0.123E1) = 1.995720387 pow (0.27182817E1, ~0.123E1) = 0.2922925949 atan2 (0.27182817E1, ~0.123) = 1.6160146 pow (0.27182817E1, ~0.123) = 0.8842636347 atan2 (0.27182817E1, ~0.123E~2) = 1.57124877 pow (0.27182817E1, ~0.123E~2) = 0.9987707734 atan2 (0.27182817E1, ~0.11754944E~37) = 1.570796251 pow (0.27182817E1, ~0.11754944E~37) = 1 atan2 (0.27182817E1, ~0.5877472E~38) = 1.570796251 pow (0.27182817E1, ~0.5877472E~38) = 1 atan2 (0.27182817E1, ~0.1E~44) = 1.570796251 pow (0.27182817E1, ~0.1E~44) = 1 atan2 (0.27182817E1, ~0.0) = 1.570796371 pow (0.27182817E1, ~0.0) = 1 atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.27182817E1, ~inf) = 3.141592741 pow (0.27182817E1, ~inf) = 0 atan2 (0.27182817E1, nan) = nan pow (0.27182817E1, nan) = nan atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.123E1, 0.34028235E39) = 3.614645185E~39 pow (0.123E1, 0.34028235E39) = inf atan2 (0.123E1, 0.17014117E39) = 7.22929037E~39 pow (0.123E1, 0.17014117E39) = inf atan2 (0.123E1, 0.123E4) = 9.999996983E~4 pow (0.123E1, 0.123E4) = inf atan2 (0.123E1, 0.123E2) = 0.09966865182 pow (0.123E1, 0.123E2) = 12.75947952 atan2 (0.123E1, 0.31415927E1) = 0.3731757402 pow (0.123E1, 0.31415927E1) = 1.916219592 atan2 (0.123E1, 0.27182817E1) = 0.4249241054 pow (0.123E1, 0.27182817E1) = 1.755445838 atan2 (0.123E1, 0.123E1) = 0.7853981853 pow (0.123E1, 0.123E1) = 1.289981008 atan2 (0.123E1, 0.123) = 1.471127629 pow (0.123E1, 0.123) = 1.025789738 atan2 (0.123E1, 0.123E~2) = 1.569796324 pow (0.123E1, 0.123E~2) = 1.000254631 atan2 (0.123E1, 0.11754944E~37) = 1.570796371 pow (0.123E1, 0.11754944E~37) = 1 atan2 (0.123E1, 0.5877472E~38) = 1.570796371 pow (0.123E1, 0.5877472E~38) = 1 atan2 (0.123E1, 0.1E~44) = 1.570796371 pow (0.123E1, 0.1E~44) = 1 atan2 (0.123E1, 0.0) = 1.570796371 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.34028235E39) = 3.141592741 pow (0.123E1, ~0.34028235E39) = 0 atan2 (0.123E1, ~0.17014117E39) = 3.141592741 pow (0.123E1, ~0.17014117E39) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592575 pow (0.123E1, ~0.123E4) = 0 atan2 (0.123E1, ~0.123E2) = 3.041924 pow (0.123E1, ~0.123E2) = 0.07837310433 atan2 (0.123E1, ~0.31415927E1) = 2.768416882 pow (0.123E1, ~0.31415927E1) = 0.5218608975 atan2 (0.123E1, ~0.27182817E1) = 2.716668606 pow (0.123E1, ~0.27182817E1) = 0.5696558356 atan2 (0.123E1, ~0.123E1) = 2.356194496 pow (0.123E1, ~0.123E1) = 0.7752052546 atan2 (0.123E1, ~0.123) = 1.670464993 pow (0.123E1, ~0.123) = 0.9748587012 atan2 (0.123E1, ~0.123E~2) = 1.571796298 pow (0.123E1, ~0.123E~2) = 0.9997454286 atan2 (0.123E1, ~0.11754944E~37) = 1.570796251 pow (0.123E1, ~0.11754944E~37) = 1 atan2 (0.123E1, ~0.5877472E~38) = 1.570796251 pow (0.123E1, ~0.5877472E~38) = 1 atan2 (0.123E1, ~0.1E~44) = 1.570796251 pow (0.123E1, ~0.1E~44) = 1 atan2 (0.123E1, ~0.0) = 1.570796371 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592741 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.34028235E39) = 3.614649389E~40 pow (0.123, 0.34028235E39) = 0 atan2 (0.123, 0.17014117E39) = 7.229284764E~40 pow (0.123, 0.17014117E39) = 0 atan2 (0.123, 0.123E4) = 1.000000047E~4 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666363 pow (0.123, 0.123E2) = 6.394886357E~12 atan2 (0.123, 0.31415927E1) = 0.0391321294 pow (0.123, 0.31415927E1) = 0.001383096678 atan2 (0.123, 0.27182817E1) = 0.04521832988 pow (0.123, 0.27182817E1) = 0.00335819344 atan2 (0.123, 0.123E1) = 0.09966865182 pow (0.123, 0.123E1) = 0.07595970482 atan2 (0.123, 0.123) = 0.7853981853 pow (0.123, 0.123) = 0.7727843523 atan2 (0.123, 0.123E~2) = 1.560796618 pow (0.123, 0.123E~2) = 0.9974257946 atan2 (0.123, 0.11754944E~37) = 1.570796371 pow (0.123, 0.11754944E~37) = 1 atan2 (0.123, 0.5877472E~38) = 1.570796371 pow (0.123, 0.5877472E~38) = 1 atan2 (0.123, 0.1E~44) = 1.570796371 pow (0.123, 0.1E~44) = 1 atan2 (0.123, 0.0) = 1.570796371 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.34028235E39) = 3.141592741 pow (0.123, ~0.34028235E39) = inf atan2 (0.123, ~0.17014117E39) = 3.141592741 pow (0.123, ~0.17014117E39) = inf atan2 (0.123, ~0.123E4) = 3.141492605 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592989 pow (0.123, ~0.123E2) = 156374941700 atan2 (0.123, ~0.31415927E1) = 3.102460623 pow (0.123, ~0.31415927E1) = 723.0152588 atan2 (0.123, ~0.27182817E1) = 3.096374273 pow (0.123, ~0.27182817E1) = 297.7791443 atan2 (0.123, ~0.123E1) = 3.041924 pow (0.123, ~0.123E1) = 13.16487408 atan2 (0.123, ~0.123) = 2.356194496 pow (0.123, ~0.123) = 1.294022083 atan2 (0.123, ~0.123E~2) = 1.580796003 pow (0.123, ~0.123E~2) = 1.002580881 atan2 (0.123, ~0.11754944E~37) = 1.570796251 pow (0.123, ~0.11754944E~37) = 1 atan2 (0.123, ~0.5877472E~38) = 1.570796251 pow (0.123, ~0.5877472E~38) = 1 atan2 (0.123, ~0.1E~44) = 1.570796251 pow (0.123, ~0.1E~44) = 1 atan2 (0.123, ~0.0) = 1.570796371 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592741 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.34028235E39) = 3.613948739E~42 pow (0.123E~2, 0.34028235E39) = 0 atan2 (0.123E~2, 0.17014117E39) = 7.229298777E~42 pow (0.123E~2, 0.17014117E39) = 0 atan2 (0.123E~2, 0.123E4) = 9.999999975E~7 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 1.000000047E~4 pow (0.123E~2, 0.123E2) = 1.606321748E~36 atan2 (0.123E~2, 0.31415927E1) = 3.915211419E~4 pow (0.123E~2, 0.31415927E1) = 7.205548935E~10 atan2 (0.123E~2, 0.27182817E1) = 4.524917167E~4 pow (0.123E~2, 0.27182817E1) = 1.228972657E~8 atan2 (0.123E~2, 0.123E1) = 9.999996983E~4 pow (0.123E~2, 0.123E1) = 2.633802651E~4 atan2 (0.123E~2, 0.123) = 0.009999666363 pow (0.123E~2, 0.123) = 0.4385896027 atan2 (0.123E~2, 0.123E~2) = 0.7853981853 pow (0.123E~2, 0.123E~2) = 0.9917919636 atan2 (0.123E~2, 0.11754944E~37) = 1.570796371 pow (0.123E~2, 0.11754944E~37) = 1 atan2 (0.123E~2, 0.5877472E~38) = 1.570796371 pow (0.123E~2, 0.5877472E~38) = 1 atan2 (0.123E~2, 0.1E~44) = 1.570796371 pow (0.123E~2, 0.1E~44) = 1 atan2 (0.123E~2, 0.0) = 1.570796371 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.34028235E39) = 3.141592741 pow (0.123E~2, ~0.34028235E39) = inf atan2 (0.123E~2, ~0.17014117E39) = 3.141592741 pow (0.123E~2, ~0.17014117E39) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591549 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492605 pow (0.123E~2, ~0.123E2) = 6.225402783E35 atan2 (0.123E~2, ~0.31415927E1) = 3.141201019 pow (0.123E~2, ~0.31415927E1) = 1387819264 atan2 (0.123E~2, ~0.27182817E1) = 3.141140223 pow (0.123E~2, ~0.27182817E1) = 81368776 atan2 (0.123E~2, ~0.123E1) = 3.140592575 pow (0.123E~2, ~0.123E1) = 3796.791504 atan2 (0.123E~2, ~0.123) = 3.131592989 pow (0.123E~2, ~0.123) = 2.280035973 atan2 (0.123E~2, ~0.123E~2) = 2.356194496 pow (0.123E~2, ~0.123E~2) = 1.008275986 atan2 (0.123E~2, ~0.11754944E~37) = 1.570796251 pow (0.123E~2, ~0.11754944E~37) = 1 atan2 (0.123E~2, ~0.5877472E~38) = 1.570796251 pow (0.123E~2, ~0.5877472E~38) = 1 atan2 (0.123E~2, ~0.1E~44) = 1.570796251 pow (0.123E~2, ~0.1E~44) = 1 atan2 (0.123E~2, ~0.0) = 1.570796371 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592741 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.11754944E~37, 0.34028235E39) = 0 pow (0.11754944E~37, 0.34028235E39) = 0 atan2 (0.11754944E~37, 0.17014117E39) = 0 pow (0.11754944E~37, 0.17014117E39) = 0 atan2 (0.11754944E~37, 0.123E4) = 9.556855527E~42 pow (0.11754944E~37, 0.123E4) = 0 atan2 (0.11754944E~37, 0.123E2) = 9.55686954E~40 pow (0.11754944E~37, 0.123E2) = 0 atan2 (0.11754944E~37, 0.31415927E1) = 3.74171493E~39 pow (0.11754944E~37, 0.31415927E1) = 0 atan2 (0.11754944E~37, 0.27182817E1) = 4.324402857E~39 pow (0.11754944E~37, 0.27182817E1) = 0 atan2 (0.11754944E~37, 0.123E1) = 9.556863934E~39 pow (0.11754944E~37, 0.123E1) = 0 atan2 (0.11754944E~37, 0.123) = 9.556864495E~38 pow (0.11754944E~37, 0.123) = 2.160911572E~5 atan2 (0.11754944E~37, 0.123E~2) = 9.556864495E~36 pow (0.11754944E~37, 0.123E~2) = 0.8981448412 atan2 (0.11754944E~37, 0.11754944E~37) = 0.7853981853 pow (0.11754944E~37, 0.11754944E~37) = 1 atan2 (0.11754944E~37, 0.5877472E~38) = 1.107148767 pow (0.11754944E~37, 0.5877472E~38) = 1 atan2 (0.11754944E~37, 0.1E~44) = 1.570796251 pow (0.11754944E~37, 0.1E~44) = 1 atan2 (0.11754944E~37, 0.0) = 1.570796371 pow (0.11754944E~37, 0.0) = 1 atan2 (0.11754944E~37, ~0.34028235E39) = 3.141592741 pow (0.11754944E~37, ~0.34028235E39) = inf atan2 (0.11754944E~37, ~0.17014117E39) = 3.141592741 pow (0.11754944E~37, ~0.17014117E39) = inf atan2 (0.11754944E~37, ~0.123E4) = 3.141592741 pow (0.11754944E~37, ~0.123E4) = inf atan2 (0.11754944E~37, ~0.123E2) = 3.141592741 pow (0.11754944E~37, ~0.123E2) = inf atan2 (0.11754944E~37, ~0.31415927E1) = 3.141592741 pow (0.11754944E~37, ~0.31415927E1) = inf atan2 (0.11754944E~37, ~0.27182817E1) = 3.141592741 pow (0.11754944E~37, ~0.27182817E1) = inf atan2 (0.11754944E~37, ~0.123E1) = 3.141592741 pow (0.11754944E~37, ~0.123E1) = inf atan2 (0.11754944E~37, ~0.123) = 3.141592741 pow (0.11754944E~37, ~0.123) = 46276.76562 atan2 (0.11754944E~37, ~0.123E~2) = 3.141592741 pow (0.11754944E~37, ~0.123E~2) = 1.113406181 atan2 (0.11754944E~37, ~0.11754944E~37) = 2.356194496 pow (0.11754944E~37, ~0.11754944E~37) = 1 atan2 (0.11754944E~37, ~0.5877472E~38) = 2.034443855 pow (0.11754944E~37, ~0.5877472E~38) = 1 atan2 (0.11754944E~37, ~0.1E~44) = 1.570796371 pow (0.11754944E~37, ~0.1E~44) = 1 atan2 (0.11754944E~37, ~0.0) = 1.570796371 pow (0.11754944E~37, ~0.0) = 1 atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.11754944E~37, ~inf) = 3.141592741 pow (0.11754944E~37, ~inf) = inf atan2 (0.11754944E~37, nan) = nan pow (0.11754944E~37, nan) = nan atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.5877472E~38, 0.34028235E39) = 0 pow (0.5877472E~38, 0.34028235E39) = 0 atan2 (0.5877472E~38, 0.17014117E39) = 0 pow (0.5877472E~38, 0.17014117E39) = 0 atan2 (0.5877472E~38, 0.123E4) = 4.778427763E~42 pow (0.5877472E~38, 0.123E4) = 0 atan2 (0.5877472E~38, 0.123E2) = 4.778427763E~40 pow (0.5877472E~38, 0.123E2) = 0 atan2 (0.5877472E~38, 0.31415927E1) = 1.870856764E~39 pow (0.5877472E~38, 0.31415927E1) = 0 atan2 (0.5877472E~38, 0.27182817E1) = 2.162200728E~39 pow (0.5877472E~38, 0.27182817E1) = 0 atan2 (0.5877472E~38, 0.123E1) = 4.778431967E~39 pow (0.5877472E~38, 0.123E1) = 0 atan2 (0.5877472E~38, 0.123) = 4.778432248E~38 pow (0.5877472E~38, 0.123) = 1.984313531E~5 atan2 (0.5877472E~38, 0.123E~2) = 4.778432248E~36 pow (0.5877472E~38, 0.123E~2) = 0.8973793983 atan2 (0.5877472E~38, 0.11754944E~37) = 0.463647604 pow (0.5877472E~38, 0.11754944E~37) = 1 atan2 (0.5877472E~38, 0.5877472E~38) = 0.7853981853 pow (0.5877472E~38, 0.5877472E~38) = 1 atan2 (0.5877472E~38, 0.1E~44) = 1.570796132 pow (0.5877472E~38, 0.1E~44) = 1 atan2 (0.5877472E~38, 0.0) = 1.570796371 pow (0.5877472E~38, 0.0) = 1 atan2 (0.5877472E~38, ~0.34028235E39) = 3.141592741 pow (0.5877472E~38, ~0.34028235E39) = inf atan2 (0.5877472E~38, ~0.17014117E39) = 3.141592741 pow (0.5877472E~38, ~0.17014117E39) = inf atan2 (0.5877472E~38, ~0.123E4) = 3.141592741 pow (0.5877472E~38, ~0.123E4) = inf atan2 (0.5877472E~38, ~0.123E2) = 3.141592741 pow (0.5877472E~38, ~0.123E2) = inf atan2 (0.5877472E~38, ~0.31415927E1) = 3.141592741 pow (0.5877472E~38, ~0.31415927E1) = inf atan2 (0.5877472E~38, ~0.27182817E1) = 3.141592741 pow (0.5877472E~38, ~0.27182817E1) = inf atan2 (0.5877472E~38, ~0.123E1) = 3.141592741 pow (0.5877472E~38, ~0.123E1) = inf atan2 (0.5877472E~38, ~0.123) = 3.141592741 pow (0.5877472E~38, ~0.123) = 50395.26172 atan2 (0.5877472E~38, ~0.123E~2) = 3.141592741 pow (0.5877472E~38, ~0.123E~2) = 1.114355803 atan2 (0.5877472E~38, ~0.11754944E~37) = 2.677945137 pow (0.5877472E~38, ~0.11754944E~37) = 1 atan2 (0.5877472E~38, ~0.5877472E~38) = 2.356194496 pow (0.5877472E~38, ~0.5877472E~38) = 1 atan2 (0.5877472E~38, ~0.1E~44) = 1.57079649 pow (0.5877472E~38, ~0.1E~44) = 1 atan2 (0.5877472E~38, ~0.0) = 1.570796371 pow (0.5877472E~38, ~0.0) = 1 atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.5877472E~38, ~inf) = 3.141592741 pow (0.5877472E~38, ~inf) = inf atan2 (0.5877472E~38, nan) = nan pow (0.5877472E~38, nan) = nan atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.1E~44, 0.34028235E39) = 0 pow (0.1E~44, 0.34028235E39) = 0 atan2 (0.1E~44, 0.17014117E39) = 0 pow (0.1E~44, 0.17014117E39) = 0 atan2 (0.1E~44, 0.123E4) = 0 pow (0.1E~44, 0.123E4) = 0 atan2 (0.1E~44, 0.123E2) = 0 pow (0.1E~44, 0.123E2) = 0 atan2 (0.1E~44, 0.31415927E1) = 0 pow (0.1E~44, 0.31415927E1) = 0 atan2 (0.1E~44, 0.27182817E1) = 0 pow (0.1E~44, 0.27182817E1) = 0 atan2 (0.1E~44, 0.123E1) = 1.401298464E~45 pow (0.1E~44, 0.123E1) = 0 atan2 (0.1E~44, 0.123) = 1.121038771E~44 pow (0.1E~44, 0.123) = 3.041046966E~6 atan2 (0.1E~44, 0.123E~2) = 1.139255651E~42 pow (0.1E~44, 0.123E~2) = 0.8807045221 atan2 (0.1E~44, 0.11754944E~37) = 1.192092896E~7 pow (0.1E~44, 0.11754944E~37) = 1 atan2 (0.1E~44, 0.5877472E~38) = 2.384185791E~7 pow (0.1E~44, 0.5877472E~38) = 1 atan2 (0.1E~44, 0.1E~44) = 0.7853981853 pow (0.1E~44, 0.1E~44) = 1 atan2 (0.1E~44, 0.0) = 1.570796371 pow (0.1E~44, 0.0) = 1 atan2 (0.1E~44, ~0.34028235E39) = 3.141592741 pow (0.1E~44, ~0.34028235E39) = inf atan2 (0.1E~44, ~0.17014117E39) = 3.141592741 pow (0.1E~44, ~0.17014117E39) = inf atan2 (0.1E~44, ~0.123E4) = 3.141592741 pow (0.1E~44, ~0.123E4) = inf atan2 (0.1E~44, ~0.123E2) = 3.141592741 pow (0.1E~44, ~0.123E2) = inf atan2 (0.1E~44, ~0.31415927E1) = 3.141592741 pow (0.1E~44, ~0.31415927E1) = inf atan2 (0.1E~44, ~0.27182817E1) = 3.141592741 pow (0.1E~44, ~0.27182817E1) = inf atan2 (0.1E~44, ~0.123E1) = 3.141592741 pow (0.1E~44, ~0.123E1) = inf atan2 (0.1E~44, ~0.123) = 3.141592741 pow (0.1E~44, ~0.123) = 328834.125 atan2 (0.1E~44, ~0.123E~2) = 3.141592741 pow (0.1E~44, ~0.123E~2) = 1.135454535 atan2 (0.1E~44, ~0.11754944E~37) = 3.141592503 pow (0.1E~44, ~0.11754944E~37) = 1 atan2 (0.1E~44, ~0.5877472E~38) = 3.141592503 pow (0.1E~44, ~0.5877472E~38) = 1 atan2 (0.1E~44, ~0.1E~44) = 2.356194496 pow (0.1E~44, ~0.1E~44) = 1 atan2 (0.1E~44, ~0.0) = 1.570796371 pow (0.1E~44, ~0.0) = 1 atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.1E~44, ~inf) = 3.141592741 pow (0.1E~44, ~inf) = inf atan2 (0.1E~44, nan) = nan pow (0.1E~44, nan) = nan atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.0, 0.34028235E39) = 0 pow (0.0, 0.34028235E39) = 0 atan2 (0.0, 0.17014117E39) = 0 pow (0.0, 0.17014117E39) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.31415927E1) = 0 pow (0.0, 0.31415927E1) = 0 atan2 (0.0, 0.27182817E1) = 0 pow (0.0, 0.27182817E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.11754944E~37) = 0 pow (0.0, 0.11754944E~37) = 0 atan2 (0.0, 0.5877472E~38) = 0 pow (0.0, 0.5877472E~38) = 0 atan2 (0.0, 0.1E~44) = 0 pow (0.0, 0.1E~44) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.34028235E39) = 3.141592741 pow (0.0, ~0.34028235E39) = inf atan2 (0.0, ~0.17014117E39) = 3.141592741 pow (0.0, ~0.17014117E39) = inf atan2 (0.0, ~0.123E4) = 3.141592741 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592741 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.31415927E1) = 3.141592741 pow (0.0, ~0.31415927E1) = inf atan2 (0.0, ~0.27182817E1) = 3.141592741 pow (0.0, ~0.27182817E1) = inf atan2 (0.0, ~0.123E1) = 3.141592741 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592741 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592741 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.11754944E~37) = 3.141592741 pow (0.0, ~0.11754944E~37) = inf atan2 (0.0, ~0.5877472E~38) = 3.141592741 pow (0.0, ~0.5877472E~38) = inf atan2 (0.0, ~0.1E~44) = 3.141592741 pow (0.0, ~0.1E~44) = inf atan2 (0.0, ~0.0) = 3.141592741 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592741 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.34028235E39, 0.34028235E39) = ~0.7853981853 pow (~0.34028235E39, 0.34028235E39) = inf atan2 (~0.34028235E39, 0.17014117E39) = ~1.107148767 pow (~0.34028235E39, 0.17014117E39) = inf atan2 (~0.34028235E39, 0.123E4) = ~1.570796371 pow (~0.34028235E39, 0.123E4) = inf atan2 (~0.34028235E39, 0.123E2) = ~1.570796371 pow (~0.34028235E39, 0.123E2) = nan atan2 (~0.34028235E39, 0.31415927E1) = ~1.570796371 pow (~0.34028235E39, 0.31415927E1) = nan atan2 (~0.34028235E39, 0.27182817E1) = ~1.570796371 pow (~0.34028235E39, 0.27182817E1) = nan atan2 (~0.34028235E39, 0.123E1) = ~1.570796371 pow (~0.34028235E39, 0.123E1) = nan atan2 (~0.34028235E39, 0.123) = ~1.570796371 pow (~0.34028235E39, 0.123) = nan atan2 (~0.34028235E39, 0.123E~2) = ~1.570796371 pow (~0.34028235E39, 0.123E~2) = nan atan2 (~0.34028235E39, 0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, 0.11754944E~37) = nan atan2 (~0.34028235E39, 0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, 0.5877472E~38) = nan atan2 (~0.34028235E39, 0.1E~44) = ~1.570796371 pow (~0.34028235E39, 0.1E~44) = nan atan2 (~0.34028235E39, 0.0) = ~1.570796371 pow (~0.34028235E39, 0.0) = 1 atan2 (~0.34028235E39, ~0.34028235E39) = ~2.356194496 pow (~0.34028235E39, ~0.34028235E39) = 0 atan2 (~0.34028235E39, ~0.17014117E39) = ~2.034443855 pow (~0.34028235E39, ~0.17014117E39) = 0 atan2 (~0.34028235E39, ~0.123E4) = ~1.570796251 pow (~0.34028235E39, ~0.123E4) = 0 atan2 (~0.34028235E39, ~0.123E2) = ~1.570796251 pow (~0.34028235E39, ~0.123E2) = nan atan2 (~0.34028235E39, ~0.31415927E1) = ~1.570796251 pow (~0.34028235E39, ~0.31415927E1) = nan atan2 (~0.34028235E39, ~0.27182817E1) = ~1.570796251 pow (~0.34028235E39, ~0.27182817E1) = nan atan2 (~0.34028235E39, ~0.123E1) = ~1.570796251 pow (~0.34028235E39, ~0.123E1) = nan atan2 (~0.34028235E39, ~0.123) = ~1.570796251 pow (~0.34028235E39, ~0.123) = nan atan2 (~0.34028235E39, ~0.123E~2) = ~1.570796251 pow (~0.34028235E39, ~0.123E~2) = nan atan2 (~0.34028235E39, ~0.11754944E~37) = ~1.570796251 pow (~0.34028235E39, ~0.11754944E~37) = nan atan2 (~0.34028235E39, ~0.5877472E~38) = ~1.570796251 pow (~0.34028235E39, ~0.5877472E~38) = nan atan2 (~0.34028235E39, ~0.1E~44) = ~1.570796251 pow (~0.34028235E39, ~0.1E~44) = nan atan2 (~0.34028235E39, ~0.0) = ~1.570796371 pow (~0.34028235E39, ~0.0) = 1 atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.34028235E39, ~inf) = ~3.141592741 pow (~0.34028235E39, ~inf) = 0 atan2 (~0.34028235E39, nan) = nan pow (~0.34028235E39, nan) = nan atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.17014117E39, 0.34028235E39) = ~0.463647604 pow (~0.17014117E39, 0.34028235E39) = inf atan2 (~0.17014117E39, 0.17014117E39) = ~0.7853981853 pow (~0.17014117E39, 0.17014117E39) = inf atan2 (~0.17014117E39, 0.123E4) = ~1.570796371 pow (~0.17014117E39, 0.123E4) = inf atan2 (~0.17014117E39, 0.123E2) = ~1.570796371 pow (~0.17014117E39, 0.123E2) = nan atan2 (~0.17014117E39, 0.31415927E1) = ~1.570796371 pow (~0.17014117E39, 0.31415927E1) = nan atan2 (~0.17014117E39, 0.27182817E1) = ~1.570796371 pow (~0.17014117E39, 0.27182817E1) = nan atan2 (~0.17014117E39, 0.123E1) = ~1.570796371 pow (~0.17014117E39, 0.123E1) = nan atan2 (~0.17014117E39, 0.123) = ~1.570796371 pow (~0.17014117E39, 0.123) = nan atan2 (~0.17014117E39, 0.123E~2) = ~1.570796371 pow (~0.17014117E39, 0.123E~2) = nan atan2 (~0.17014117E39, 0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, 0.11754944E~37) = nan atan2 (~0.17014117E39, 0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, 0.5877472E~38) = nan atan2 (~0.17014117E39, 0.1E~44) = ~1.570796371 pow (~0.17014117E39, 0.1E~44) = nan atan2 (~0.17014117E39, 0.0) = ~1.570796371 pow (~0.17014117E39, 0.0) = 1 atan2 (~0.17014117E39, ~0.34028235E39) = ~2.677945137 pow (~0.17014117E39, ~0.34028235E39) = 0 atan2 (~0.17014117E39, ~0.17014117E39) = ~2.356194496 pow (~0.17014117E39, ~0.17014117E39) = 0 atan2 (~0.17014117E39, ~0.123E4) = ~1.570796251 pow (~0.17014117E39, ~0.123E4) = 0 atan2 (~0.17014117E39, ~0.123E2) = ~1.570796251 pow (~0.17014117E39, ~0.123E2) = nan atan2 (~0.17014117E39, ~0.31415927E1) = ~1.570796251 pow (~0.17014117E39, ~0.31415927E1) = nan atan2 (~0.17014117E39, ~0.27182817E1) = ~1.570796251 pow (~0.17014117E39, ~0.27182817E1) = nan atan2 (~0.17014117E39, ~0.123E1) = ~1.570796251 pow (~0.17014117E39, ~0.123E1) = nan atan2 (~0.17014117E39, ~0.123) = ~1.570796251 pow (~0.17014117E39, ~0.123) = nan atan2 (~0.17014117E39, ~0.123E~2) = ~1.570796251 pow (~0.17014117E39, ~0.123E~2) = nan atan2 (~0.17014117E39, ~0.11754944E~37) = ~1.570796251 pow (~0.17014117E39, ~0.11754944E~37) = nan atan2 (~0.17014117E39, ~0.5877472E~38) = ~1.570796251 pow (~0.17014117E39, ~0.5877472E~38) = nan atan2 (~0.17014117E39, ~0.1E~44) = ~1.570796251 pow (~0.17014117E39, ~0.1E~44) = nan atan2 (~0.17014117E39, ~0.0) = ~1.570796371 pow (~0.17014117E39, ~0.0) = 1 atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.17014117E39, ~inf) = ~3.141592741 pow (~0.17014117E39, ~inf) = 0 atan2 (~0.17014117E39, nan) = nan pow (~0.17014117E39, nan) = nan atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.123E4, 0.34028235E39) = ~3.614645488E~36 pow (~0.123E4, 0.34028235E39) = inf atan2 (~0.123E4, 0.17014117E39) = ~7.229290975E~36 pow (~0.123E4, 0.17014117E39) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981853 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.560796618 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.31415927E1) = ~1.568242192 pow (~0.123E4, 0.31415927E1) = nan atan2 (~0.123E4, 0.27182817E1) = ~1.568586349 pow (~0.123E4, 0.27182817E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796324 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696354 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795298 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.11754944E~37) = ~1.570796371 pow (~0.123E4, 0.11754944E~37) = nan atan2 (~0.123E4, 0.5877472E~38) = ~1.570796371 pow (~0.123E4, 0.5877472E~38) = nan atan2 (~0.123E4, 0.1E~44) = ~1.570796371 pow (~0.123E4, 0.1E~44) = nan atan2 (~0.123E4, 0.0) = ~1.570796371 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.34028235E39) = ~3.141592741 pow (~0.123E4, ~0.34028235E39) = 0 atan2 (~0.123E4, ~0.17014117E39) = ~3.141592741 pow (~0.123E4, ~0.17014117E39) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.356194496 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580796003 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.31415927E1) = ~1.57335043 pow (~0.123E4, ~0.31415927E1) = nan atan2 (~0.123E4, ~0.27182817E1) = ~1.573006272 pow (~0.123E4, ~0.27182817E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796298 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896268 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797324 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.11754944E~37) = ~1.570796251 pow (~0.123E4, ~0.11754944E~37) = nan atan2 (~0.123E4, ~0.5877472E~38) = ~1.570796251 pow (~0.123E4, ~0.5877472E~38) = nan atan2 (~0.123E4, ~0.1E~44) = ~1.570796251 pow (~0.123E4, ~0.1E~44) = nan atan2 (~0.123E4, ~0.0) = ~1.570796371 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592741 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.34028235E39) = ~3.614645465E~38 pow (~0.123E2, 0.34028235E39) = inf atan2 (~0.123E2, 0.17014117E39) = ~7.22929093E~38 pow (~0.123E2, 0.17014117E39) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666363 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981853 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.31415927E1) = ~1.32072866 pow (~0.123E2, 0.31415927E1) = nan atan2 (~0.123E2, 0.27182817E1) = ~1.353293777 pow (~0.123E2, 0.27182817E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127629 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.560796618 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696354 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.11754944E~37) = ~1.570796371 pow (~0.123E2, 0.11754944E~37) = nan atan2 (~0.123E2, 0.5877472E~38) = ~1.570796371 pow (~0.123E2, 0.5877472E~38) = nan atan2 (~0.123E2, 0.1E~44) = ~1.570796371 pow (~0.123E2, 0.1E~44) = nan atan2 (~0.123E2, 0.0) = ~1.570796371 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.34028235E39) = ~3.141592741 pow (~0.123E2, ~0.34028235E39) = 0 atan2 (~0.123E2, ~0.17014117E39) = ~3.141592741 pow (~0.123E2, ~0.17014117E39) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592989 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.356194496 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.31415927E1) = ~1.820863962 pow (~0.123E2, ~0.31415927E1) = nan atan2 (~0.123E2, ~0.27182817E1) = ~1.788298845 pow (~0.123E2, ~0.27182817E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464993 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580796003 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896268 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.11754944E~37) = ~1.570796251 pow (~0.123E2, ~0.11754944E~37) = nan atan2 (~0.123E2, ~0.5877472E~38) = ~1.570796251 pow (~0.123E2, ~0.5877472E~38) = nan atan2 (~0.123E2, ~0.1E~44) = ~1.570796251 pow (~0.123E2, ~0.1E~44) = nan atan2 (~0.123E2, ~0.0) = ~1.570796371 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592741 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.31415927E1, 0.34028235E39) = ~9.232312E~39 pow (~0.31415927E1, 0.34028235E39) = inf atan2 (~0.31415927E1, 0.17014117E39) = ~1.8464624E~38 pow (~0.31415927E1, 0.17014117E39) = inf atan2 (~0.31415927E1, 0.123E4) = ~0.002554134931 pow (~0.31415927E1, 0.123E4) = inf atan2 (~0.31415927E1, 0.123E2) = ~0.2500677109 pow (~0.31415927E1, 0.123E2) = nan atan2 (~0.31415927E1, 0.31415927E1) = ~0.7853981853 pow (~0.31415927E1, 0.31415927E1) = nan atan2 (~0.31415927E1, 0.27182817E1) = ~0.8575118184 pow (~0.31415927E1, 0.27182817E1) = nan atan2 (~0.31415927E1, 0.123E1) = ~1.19762063 pow (~0.31415927E1, 0.123E1) = nan atan2 (~0.31415927E1, 0.123) = ~1.531664252 pow (~0.31415927E1, 0.123) = nan atan2 (~0.31415927E1, 0.123E~2) = ~1.570404768 pow (~0.31415927E1, 0.123E~2) = nan atan2 (~0.31415927E1, 0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, 0.11754944E~37) = nan atan2 (~0.31415927E1, 0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, 0.5877472E~38) = nan atan2 (~0.31415927E1, 0.1E~44) = ~1.570796371 pow (~0.31415927E1, 0.1E~44) = nan atan2 (~0.31415927E1, 0.0) = ~1.570796371 pow (~0.31415927E1, 0.0) = 1 atan2 (~0.31415927E1, ~0.34028235E39) = ~3.141592741 pow (~0.31415927E1, ~0.34028235E39) = 0 atan2 (~0.31415927E1, ~0.17014117E39) = ~3.141592741 pow (~0.31415927E1, ~0.17014117E39) = 0 atan2 (~0.31415927E1, ~0.123E4) = ~3.139038563 pow (~0.31415927E1, ~0.123E4) = 0 atan2 (~0.31415927E1, ~0.123E2) = ~2.89152503 pow (~0.31415927E1, ~0.123E2) = nan atan2 (~0.31415927E1, ~0.31415927E1) = ~2.356194496 pow (~0.31415927E1, ~0.31415927E1) = nan atan2 (~0.31415927E1, ~0.27182817E1) = ~2.284080982 pow (~0.31415927E1, ~0.27182817E1) = nan atan2 (~0.31415927E1, ~0.123E1) = ~1.943971992 pow (~0.31415927E1, ~0.123E1) = nan atan2 (~0.31415927E1, ~0.123) = ~1.60992837 pow (~0.31415927E1, ~0.123) = nan atan2 (~0.31415927E1, ~0.123E~2) = ~1.571187854 pow (~0.31415927E1, ~0.123E~2) = nan atan2 (~0.31415927E1, ~0.11754944E~37) = ~1.570796251 pow (~0.31415927E1, ~0.11754944E~37) = nan atan2 (~0.31415927E1, ~0.5877472E~38) = ~1.570796251 pow (~0.31415927E1, ~0.5877472E~38) = nan atan2 (~0.31415927E1, ~0.1E~44) = ~1.570796251 pow (~0.31415927E1, ~0.1E~44) = nan atan2 (~0.31415927E1, ~0.0) = ~1.570796371 pow (~0.31415927E1, ~0.0) = 1 atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.31415927E1, ~inf) = ~3.141592741 pow (~0.31415927E1, ~inf) = 0 atan2 (~0.31415927E1, nan) = nan pow (~0.31415927E1, nan) = nan atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.27182817E1, 0.34028235E39) = ~7.988312091E~39 pow (~0.27182817E1, 0.34028235E39) = inf atan2 (~0.27182817E1, 0.17014117E39) = ~1.597662558E~38 pow (~0.27182817E1, 0.17014117E39) = inf atan2 (~0.27182817E1, 0.123E4) = ~0.002209981671 pow (~0.27182817E1, 0.123E4) = inf atan2 (~0.27182817E1, 0.123E2) = ~0.2175025195 pow (~0.27182817E1, 0.123E2) = nan atan2 (~0.27182817E1, 0.31415927E1) = ~0.7132844925 pow (~0.27182817E1, 0.31415927E1) = nan atan2 (~0.27182817E1, 0.27182817E1) = ~0.7853981853 pow (~0.27182817E1, 0.27182817E1) = nan atan2 (~0.27182817E1, 0.123E1) = ~1.145872235 pow (~0.27182817E1, 0.123E1) = nan atan2 (~0.27182817E1, 0.123) = ~1.525578022 pow (~0.27182817E1, 0.123) = nan atan2 (~0.27182817E1, 0.123E~2) = ~1.570343852 pow (~0.27182817E1, 0.123E~2) = nan atan2 (~0.27182817E1, 0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, 0.11754944E~37) = nan atan2 (~0.27182817E1, 0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, 0.5877472E~38) = nan atan2 (~0.27182817E1, 0.1E~44) = ~1.570796371 pow (~0.27182817E1, 0.1E~44) = nan atan2 (~0.27182817E1, 0.0) = ~1.570796371 pow (~0.27182817E1, 0.0) = 1 atan2 (~0.27182817E1, ~0.34028235E39) = ~3.141592741 pow (~0.27182817E1, ~0.34028235E39) = 0 atan2 (~0.27182817E1, ~0.17014117E39) = ~3.141592741 pow (~0.27182817E1, ~0.17014117E39) = 0 atan2 (~0.27182817E1, ~0.123E4) = ~3.139382601 pow (~0.27182817E1, ~0.123E4) = 0 atan2 (~0.27182817E1, ~0.123E2) = ~2.924090147 pow (~0.27182817E1, ~0.123E2) = nan atan2 (~0.27182817E1, ~0.31415927E1) = ~2.428308249 pow (~0.27182817E1, ~0.31415927E1) = nan atan2 (~0.27182817E1, ~0.27182817E1) = ~2.356194496 pow (~0.27182817E1, ~0.27182817E1) = nan atan2 (~0.27182817E1, ~0.123E1) = ~1.995720387 pow (~0.27182817E1, ~0.123E1) = nan atan2 (~0.27182817E1, ~0.123) = ~1.6160146 pow (~0.27182817E1, ~0.123) = nan atan2 (~0.27182817E1, ~0.123E~2) = ~1.57124877 pow (~0.27182817E1, ~0.123E~2) = nan atan2 (~0.27182817E1, ~0.11754944E~37) = ~1.570796251 pow (~0.27182817E1, ~0.11754944E~37) = nan atan2 (~0.27182817E1, ~0.5877472E~38) = ~1.570796251 pow (~0.27182817E1, ~0.5877472E~38) = nan atan2 (~0.27182817E1, ~0.1E~44) = ~1.570796251 pow (~0.27182817E1, ~0.1E~44) = nan atan2 (~0.27182817E1, ~0.0) = ~1.570796371 pow (~0.27182817E1, ~0.0) = 1 atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.27182817E1, ~inf) = ~3.141592741 pow (~0.27182817E1, ~inf) = 0 atan2 (~0.27182817E1, nan) = nan pow (~0.27182817E1, nan) = nan atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.123E1, 0.34028235E39) = ~3.614645185E~39 pow (~0.123E1, 0.34028235E39) = inf atan2 (~0.123E1, 0.17014117E39) = ~7.22929037E~39 pow (~0.123E1, 0.17014117E39) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996983E~4 pow (~0.123E1, 0.123E4) = inf atan2 (~0.123E1, 0.123E2) = ~0.09966865182 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.31415927E1) = ~0.3731757402 pow (~0.123E1, 0.31415927E1) = nan atan2 (~0.123E1, 0.27182817E1) = ~0.4249241054 pow (~0.123E1, 0.27182817E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981853 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127629 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796324 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.11754944E~37) = ~1.570796371 pow (~0.123E1, 0.11754944E~37) = nan atan2 (~0.123E1, 0.5877472E~38) = ~1.570796371 pow (~0.123E1, 0.5877472E~38) = nan atan2 (~0.123E1, 0.1E~44) = ~1.570796371 pow (~0.123E1, 0.1E~44) = nan atan2 (~0.123E1, 0.0) = ~1.570796371 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.34028235E39) = ~3.141592741 pow (~0.123E1, ~0.34028235E39) = 0 atan2 (~0.123E1, ~0.17014117E39) = ~3.141592741 pow (~0.123E1, ~0.17014117E39) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592575 pow (~0.123E1, ~0.123E4) = 0 atan2 (~0.123E1, ~0.123E2) = ~3.041924 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.31415927E1) = ~2.768416882 pow (~0.123E1, ~0.31415927E1) = nan atan2 (~0.123E1, ~0.27182817E1) = ~2.716668606 pow (~0.123E1, ~0.27182817E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.356194496 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464993 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796298 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.11754944E~37) = ~1.570796251 pow (~0.123E1, ~0.11754944E~37) = nan atan2 (~0.123E1, ~0.5877472E~38) = ~1.570796251 pow (~0.123E1, ~0.5877472E~38) = nan atan2 (~0.123E1, ~0.1E~44) = ~1.570796251 pow (~0.123E1, ~0.1E~44) = nan atan2 (~0.123E1, ~0.0) = ~1.570796371 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592741 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.34028235E39) = ~3.614649389E~40 pow (~0.123, 0.34028235E39) = 0 atan2 (~0.123, 0.17014117E39) = ~7.229284764E~40 pow (~0.123, 0.17014117E39) = 0 atan2 (~0.123, 0.123E4) = ~1.000000047E~4 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666363 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.31415927E1) = ~0.0391321294 pow (~0.123, 0.31415927E1) = nan atan2 (~0.123, 0.27182817E1) = ~0.04521832988 pow (~0.123, 0.27182817E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865182 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981853 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.560796618 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.11754944E~37) = ~1.570796371 pow (~0.123, 0.11754944E~37) = nan atan2 (~0.123, 0.5877472E~38) = ~1.570796371 pow (~0.123, 0.5877472E~38) = nan atan2 (~0.123, 0.1E~44) = ~1.570796371 pow (~0.123, 0.1E~44) = nan atan2 (~0.123, 0.0) = ~1.570796371 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.34028235E39) = ~3.141592741 pow (~0.123, ~0.34028235E39) = inf atan2 (~0.123, ~0.17014117E39) = ~3.141592741 pow (~0.123, ~0.17014117E39) = inf atan2 (~0.123, ~0.123E4) = ~3.141492605 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592989 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.31415927E1) = ~3.102460623 pow (~0.123, ~0.31415927E1) = nan atan2 (~0.123, ~0.27182817E1) = ~3.096374273 pow (~0.123, ~0.27182817E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.356194496 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580796003 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.11754944E~37) = ~1.570796251 pow (~0.123, ~0.11754944E~37) = nan atan2 (~0.123, ~0.5877472E~38) = ~1.570796251 pow (~0.123, ~0.5877472E~38) = nan atan2 (~0.123, ~0.1E~44) = ~1.570796251 pow (~0.123, ~0.1E~44) = nan atan2 (~0.123, ~0.0) = ~1.570796371 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592741 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.34028235E39) = ~3.613948739E~42 pow (~0.123E~2, 0.34028235E39) = 0 atan2 (~0.123E~2, 0.17014117E39) = ~7.229298777E~42 pow (~0.123E~2, 0.17014117E39) = 0 atan2 (~0.123E~2, 0.123E4) = ~9.999999975E~7 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~1.000000047E~4 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.31415927E1) = ~3.915211419E~4 pow (~0.123E~2, 0.31415927E1) = nan atan2 (~0.123E~2, 0.27182817E1) = ~4.524917167E~4 pow (~0.123E~2, 0.27182817E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996983E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666363 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981853 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.11754944E~37) = ~1.570796371 pow (~0.123E~2, 0.11754944E~37) = nan atan2 (~0.123E~2, 0.5877472E~38) = ~1.570796371 pow (~0.123E~2, 0.5877472E~38) = nan atan2 (~0.123E~2, 0.1E~44) = ~1.570796371 pow (~0.123E~2, 0.1E~44) = nan atan2 (~0.123E~2, 0.0) = ~1.570796371 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.34028235E39) = ~3.141592741 pow (~0.123E~2, ~0.34028235E39) = inf atan2 (~0.123E~2, ~0.17014117E39) = ~3.141592741 pow (~0.123E~2, ~0.17014117E39) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591549 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492605 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.31415927E1) = ~3.141201019 pow (~0.123E~2, ~0.31415927E1) = nan atan2 (~0.123E~2, ~0.27182817E1) = ~3.141140223 pow (~0.123E~2, ~0.27182817E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592575 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592989 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.356194496 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.11754944E~37) = ~1.570796251 pow (~0.123E~2, ~0.11754944E~37) = nan atan2 (~0.123E~2, ~0.5877472E~38) = ~1.570796251 pow (~0.123E~2, ~0.5877472E~38) = nan atan2 (~0.123E~2, ~0.1E~44) = ~1.570796251 pow (~0.123E~2, ~0.1E~44) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796371 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592741 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.11754944E~37, 0.34028235E39) = 0 pow (~0.11754944E~37, 0.34028235E39) = 0 atan2 (~0.11754944E~37, 0.17014117E39) = 0 pow (~0.11754944E~37, 0.17014117E39) = 0 atan2 (~0.11754944E~37, 0.123E4) = ~9.556855527E~42 pow (~0.11754944E~37, 0.123E4) = 0 atan2 (~0.11754944E~37, 0.123E2) = ~9.55686954E~40 pow (~0.11754944E~37, 0.123E2) = nan atan2 (~0.11754944E~37, 0.31415927E1) = ~3.74171493E~39 pow (~0.11754944E~37, 0.31415927E1) = nan atan2 (~0.11754944E~37, 0.27182817E1) = ~4.324402857E~39 pow (~0.11754944E~37, 0.27182817E1) = nan atan2 (~0.11754944E~37, 0.123E1) = ~9.556863934E~39 pow (~0.11754944E~37, 0.123E1) = nan atan2 (~0.11754944E~37, 0.123) = ~9.556864495E~38 pow (~0.11754944E~37, 0.123) = nan atan2 (~0.11754944E~37, 0.123E~2) = ~9.556864495E~36 pow (~0.11754944E~37, 0.123E~2) = nan atan2 (~0.11754944E~37, 0.11754944E~37) = ~0.7853981853 pow (~0.11754944E~37, 0.11754944E~37) = nan atan2 (~0.11754944E~37, 0.5877472E~38) = ~1.107148767 pow (~0.11754944E~37, 0.5877472E~38) = nan atan2 (~0.11754944E~37, 0.1E~44) = ~1.570796251 pow (~0.11754944E~37, 0.1E~44) = nan atan2 (~0.11754944E~37, 0.0) = ~1.570796371 pow (~0.11754944E~37, 0.0) = 1 atan2 (~0.11754944E~37, ~0.34028235E39) = ~3.141592741 pow (~0.11754944E~37, ~0.34028235E39) = inf atan2 (~0.11754944E~37, ~0.17014117E39) = ~3.141592741 pow (~0.11754944E~37, ~0.17014117E39) = inf atan2 (~0.11754944E~37, ~0.123E4) = ~3.141592741 pow (~0.11754944E~37, ~0.123E4) = inf atan2 (~0.11754944E~37, ~0.123E2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E2) = nan atan2 (~0.11754944E~37, ~0.31415927E1) = ~3.141592741 pow (~0.11754944E~37, ~0.31415927E1) = nan atan2 (~0.11754944E~37, ~0.27182817E1) = ~3.141592741 pow (~0.11754944E~37, ~0.27182817E1) = nan atan2 (~0.11754944E~37, ~0.123E1) = ~3.141592741 pow (~0.11754944E~37, ~0.123E1) = nan atan2 (~0.11754944E~37, ~0.123) = ~3.141592741 pow (~0.11754944E~37, ~0.123) = nan atan2 (~0.11754944E~37, ~0.123E~2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E~2) = nan atan2 (~0.11754944E~37, ~0.11754944E~37) = ~2.356194496 pow (~0.11754944E~37, ~0.11754944E~37) = nan atan2 (~0.11754944E~37, ~0.5877472E~38) = ~2.034443855 pow (~0.11754944E~37, ~0.5877472E~38) = nan atan2 (~0.11754944E~37, ~0.1E~44) = ~1.570796371 pow (~0.11754944E~37, ~0.1E~44) = nan atan2 (~0.11754944E~37, ~0.0) = ~1.570796371 pow (~0.11754944E~37, ~0.0) = 1 atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.11754944E~37, ~inf) = ~3.141592741 pow (~0.11754944E~37, ~inf) = inf atan2 (~0.11754944E~37, nan) = nan pow (~0.11754944E~37, nan) = nan atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.5877472E~38, 0.34028235E39) = 0 pow (~0.5877472E~38, 0.34028235E39) = 0 atan2 (~0.5877472E~38, 0.17014117E39) = 0 pow (~0.5877472E~38, 0.17014117E39) = 0 atan2 (~0.5877472E~38, 0.123E4) = ~4.778427763E~42 pow (~0.5877472E~38, 0.123E4) = 0 atan2 (~0.5877472E~38, 0.123E2) = ~4.778427763E~40 pow (~0.5877472E~38, 0.123E2) = nan atan2 (~0.5877472E~38, 0.31415927E1) = ~1.870856764E~39 pow (~0.5877472E~38, 0.31415927E1) = nan atan2 (~0.5877472E~38, 0.27182817E1) = ~2.162200728E~39 pow (~0.5877472E~38, 0.27182817E1) = nan atan2 (~0.5877472E~38, 0.123E1) = ~4.778431967E~39 pow (~0.5877472E~38, 0.123E1) = nan atan2 (~0.5877472E~38, 0.123) = ~4.778432248E~38 pow (~0.5877472E~38, 0.123) = nan atan2 (~0.5877472E~38, 0.123E~2) = ~4.778432248E~36 pow (~0.5877472E~38, 0.123E~2) = nan atan2 (~0.5877472E~38, 0.11754944E~37) = ~0.463647604 pow (~0.5877472E~38, 0.11754944E~37) = nan atan2 (~0.5877472E~38, 0.5877472E~38) = ~0.7853981853 pow (~0.5877472E~38, 0.5877472E~38) = nan atan2 (~0.5877472E~38, 0.1E~44) = ~1.570796132 pow (~0.5877472E~38, 0.1E~44) = nan atan2 (~0.5877472E~38, 0.0) = ~1.570796371 pow (~0.5877472E~38, 0.0) = 1 atan2 (~0.5877472E~38, ~0.34028235E39) = ~3.141592741 pow (~0.5877472E~38, ~0.34028235E39) = inf atan2 (~0.5877472E~38, ~0.17014117E39) = ~3.141592741 pow (~0.5877472E~38, ~0.17014117E39) = inf atan2 (~0.5877472E~38, ~0.123E4) = ~3.141592741 pow (~0.5877472E~38, ~0.123E4) = inf atan2 (~0.5877472E~38, ~0.123E2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E2) = nan atan2 (~0.5877472E~38, ~0.31415927E1) = ~3.141592741 pow (~0.5877472E~38, ~0.31415927E1) = nan atan2 (~0.5877472E~38, ~0.27182817E1) = ~3.141592741 pow (~0.5877472E~38, ~0.27182817E1) = nan atan2 (~0.5877472E~38, ~0.123E1) = ~3.141592741 pow (~0.5877472E~38, ~0.123E1) = nan atan2 (~0.5877472E~38, ~0.123) = ~3.141592741 pow (~0.5877472E~38, ~0.123) = nan atan2 (~0.5877472E~38, ~0.123E~2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E~2) = nan atan2 (~0.5877472E~38, ~0.11754944E~37) = ~2.677945137 pow (~0.5877472E~38, ~0.11754944E~37) = nan atan2 (~0.5877472E~38, ~0.5877472E~38) = ~2.356194496 pow (~0.5877472E~38, ~0.5877472E~38) = nan atan2 (~0.5877472E~38, ~0.1E~44) = ~1.57079649 pow (~0.5877472E~38, ~0.1E~44) = nan atan2 (~0.5877472E~38, ~0.0) = ~1.570796371 pow (~0.5877472E~38, ~0.0) = 1 atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.5877472E~38, ~inf) = ~3.141592741 pow (~0.5877472E~38, ~inf) = inf atan2 (~0.5877472E~38, nan) = nan pow (~0.5877472E~38, nan) = nan atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.1E~44, 0.34028235E39) = 0 pow (~0.1E~44, 0.34028235E39) = 0 atan2 (~0.1E~44, 0.17014117E39) = 0 pow (~0.1E~44, 0.17014117E39) = 0 atan2 (~0.1E~44, 0.123E4) = 0 pow (~0.1E~44, 0.123E4) = 0 atan2 (~0.1E~44, 0.123E2) = 0 pow (~0.1E~44, 0.123E2) = nan atan2 (~0.1E~44, 0.31415927E1) = 0 pow (~0.1E~44, 0.31415927E1) = nan atan2 (~0.1E~44, 0.27182817E1) = 0 pow (~0.1E~44, 0.27182817E1) = nan atan2 (~0.1E~44, 0.123E1) = ~1.401298464E~45 pow (~0.1E~44, 0.123E1) = nan atan2 (~0.1E~44, 0.123) = ~1.121038771E~44 pow (~0.1E~44, 0.123) = nan atan2 (~0.1E~44, 0.123E~2) = ~1.139255651E~42 pow (~0.1E~44, 0.123E~2) = nan atan2 (~0.1E~44, 0.11754944E~37) = ~1.192092896E~7 pow (~0.1E~44, 0.11754944E~37) = nan atan2 (~0.1E~44, 0.5877472E~38) = ~2.384185791E~7 pow (~0.1E~44, 0.5877472E~38) = nan atan2 (~0.1E~44, 0.1E~44) = ~0.7853981853 pow (~0.1E~44, 0.1E~44) = nan atan2 (~0.1E~44, 0.0) = ~1.570796371 pow (~0.1E~44, 0.0) = 1 atan2 (~0.1E~44, ~0.34028235E39) = ~3.141592741 pow (~0.1E~44, ~0.34028235E39) = inf atan2 (~0.1E~44, ~0.17014117E39) = ~3.141592741 pow (~0.1E~44, ~0.17014117E39) = inf atan2 (~0.1E~44, ~0.123E4) = ~3.141592741 pow (~0.1E~44, ~0.123E4) = inf atan2 (~0.1E~44, ~0.123E2) = ~3.141592741 pow (~0.1E~44, ~0.123E2) = nan atan2 (~0.1E~44, ~0.31415927E1) = ~3.141592741 pow (~0.1E~44, ~0.31415927E1) = nan atan2 (~0.1E~44, ~0.27182817E1) = ~3.141592741 pow (~0.1E~44, ~0.27182817E1) = nan atan2 (~0.1E~44, ~0.123E1) = ~3.141592741 pow (~0.1E~44, ~0.123E1) = nan atan2 (~0.1E~44, ~0.123) = ~3.141592741 pow (~0.1E~44, ~0.123) = nan atan2 (~0.1E~44, ~0.123E~2) = ~3.141592741 pow (~0.1E~44, ~0.123E~2) = nan atan2 (~0.1E~44, ~0.11754944E~37) = ~3.141592503 pow (~0.1E~44, ~0.11754944E~37) = nan atan2 (~0.1E~44, ~0.5877472E~38) = ~3.141592503 pow (~0.1E~44, ~0.5877472E~38) = nan atan2 (~0.1E~44, ~0.1E~44) = ~2.356194496 pow (~0.1E~44, ~0.1E~44) = nan atan2 (~0.1E~44, ~0.0) = ~1.570796371 pow (~0.1E~44, ~0.0) = 1 atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.1E~44, ~inf) = ~3.141592741 pow (~0.1E~44, ~inf) = inf atan2 (~0.1E~44, nan) = nan pow (~0.1E~44, nan) = nan atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.0, 0.34028235E39) = 0 pow (~0.0, 0.34028235E39) = 0 atan2 (~0.0, 0.17014117E39) = 0 pow (~0.0, 0.17014117E39) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.31415927E1) = 0 pow (~0.0, 0.31415927E1) = 0 atan2 (~0.0, 0.27182817E1) = 0 pow (~0.0, 0.27182817E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.11754944E~37) = 0 pow (~0.0, 0.11754944E~37) = 0 atan2 (~0.0, 0.5877472E~38) = 0 pow (~0.0, 0.5877472E~38) = 0 atan2 (~0.0, 0.1E~44) = 0 pow (~0.0, 0.1E~44) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.34028235E39) = ~3.141592741 pow (~0.0, ~0.34028235E39) = inf atan2 (~0.0, ~0.17014117E39) = ~3.141592741 pow (~0.0, ~0.17014117E39) = inf atan2 (~0.0, ~0.123E4) = ~3.141592741 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592741 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.31415927E1) = ~3.141592741 pow (~0.0, ~0.31415927E1) = inf atan2 (~0.0, ~0.27182817E1) = ~3.141592741 pow (~0.0, ~0.27182817E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592741 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592741 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592741 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.11754944E~37) = ~3.141592741 pow (~0.0, ~0.11754944E~37) = inf atan2 (~0.0, ~0.5877472E~38) = ~3.141592741 pow (~0.0, ~0.5877472E~38) = inf atan2 (~0.0, ~0.1E~44) = ~3.141592741 pow (~0.0, ~0.1E~44) = inf atan2 (~0.0, ~0.0) = ~3.141592741 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592741 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (~inf, 0.34028235E39) = ~1.570796371 pow (~inf, 0.34028235E39) = inf atan2 (~inf, 0.17014117E39) = ~1.570796371 pow (~inf, 0.17014117E39) = inf atan2 (~inf, 0.123E4) = ~1.570796371 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796371 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.31415927E1) = ~1.570796371 pow (~inf, 0.31415927E1) = inf atan2 (~inf, 0.27182817E1) = ~1.570796371 pow (~inf, 0.27182817E1) = inf atan2 (~inf, 0.123E1) = ~1.570796371 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796371 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796371 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.11754944E~37) = ~1.570796371 pow (~inf, 0.11754944E~37) = inf atan2 (~inf, 0.5877472E~38) = ~1.570796371 pow (~inf, 0.5877472E~38) = inf atan2 (~inf, 0.1E~44) = ~1.570796371 pow (~inf, 0.1E~44) = inf atan2 (~inf, 0.0) = ~1.570796371 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.34028235E39) = ~1.570796371 pow (~inf, ~0.34028235E39) = 0 atan2 (~inf, ~0.17014117E39) = ~1.570796371 pow (~inf, ~0.17014117E39) = 0 atan2 (~inf, ~0.123E4) = ~1.570796371 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796371 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.31415927E1) = ~1.570796371 pow (~inf, ~0.31415927E1) = 0 atan2 (~inf, ~0.27182817E1) = ~1.570796371 pow (~inf, ~0.27182817E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796371 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796371 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796371 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.11754944E~37) = ~1.570796371 pow (~inf, ~0.11754944E~37) = 0 atan2 (~inf, ~0.5877472E~38) = ~1.570796371 pow (~inf, ~0.5877472E~38) = 0 atan2 (~inf, ~0.1E~44) = ~1.570796371 pow (~inf, ~0.1E~44) = 0 atan2 (~inf, ~0.0) = ~1.570796371 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.356194496 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (nan, 0.34028235E39) = nan pow (nan, 0.34028235E39) = nan atan2 (nan, 0.17014117E39) = nan pow (nan, 0.17014117E39) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.31415927E1) = nan pow (nan, 0.31415927E1) = nan atan2 (nan, 0.27182817E1) = nan pow (nan, 0.27182817E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.11754944E~37) = nan pow (nan, 0.11754944E~37) = nan atan2 (nan, 0.5877472E~38) = nan pow (nan, 0.5877472E~38) = nan atan2 (nan, 0.1E~44) = nan pow (nan, 0.1E~44) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.34028235E39) = nan pow (nan, ~0.34028235E39) = nan atan2 (nan, ~0.17014117E39) = nan pow (nan, ~0.17014117E39) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.31415927E1) = nan pow (nan, ~0.31415927E1) = nan atan2 (nan, ~0.27182817E1) = nan pow (nan, ~0.27182817E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.11754944E~37) = nan pow (nan, ~0.11754944E~37) = nan atan2 (nan, ~0.5877472E~38) = nan pow (nan, ~0.5877472E~38) = nan atan2 (nan, ~0.1E~44) = nan pow (nan, ~0.1E~44) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.34028235E39, 0.123E1, ~0.34028235E39): 0.78264946E38 inf (0.34028235E39, 0.123E1, ~0.17014117E39): 0.24840611E39 inf (0.34028235E39, 0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.34028235E39, ~0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (0.34028235E39, ~0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (0.34028235E39, ~0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.17014117E39, 0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (0.17014117E39, 0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (0.17014117E39, 0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (0.17014117E39, 0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.17014117E39, 0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.17014117E39, 0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.17014117E39, ~0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (0.17014117E39, ~0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (0.17014117E39, ~0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (0.17014117E39, ~0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.17014117E39, ~0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.17014117E39, ~0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123E4, 0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E4, 0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E4, 0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (0.123E4, 0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (0.123E4, 0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.123E4, 0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (0.123E4, 0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E4, 0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E4, 0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E4, 0.123, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E4, 0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E4, 0.123E~2, 0.123): 0.16359E1 0.16359001E1 (0.123E4, 0.123E~2, ~0.123E1): 0.28290004 0.2829001 (0.123E4, ~0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E4, ~0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E4, ~0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.123E4, ~0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.123E4, ~0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.123E4, ~0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.123E4, ~0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E4, ~0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E4, ~0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E4, ~0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (0.123E4, ~0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E4, ~0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, 0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E2, 0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E2, 0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E2, 0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E2, 0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E2, 0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E2, 0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (0.123E2, 0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.123E2, 0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (0.123E2, 0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (0.123E2, 0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (0.123E2, 0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.123E2, 0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (0.123E2, 0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (0.123E2, 0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.123E2, 0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.123E2, 0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (0.123E2, 0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.123E2, 0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E2, 0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E2, 0.123, 0.123): 0.16359E1 0.16359001E1 (0.123E2, 0.123, ~0.123E1): 0.28290004 0.2829001 (0.123E2, 0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E2, ~0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E2, ~0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E2, ~0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E2, ~0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E2, ~0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E2, ~0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E2, ~0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.123E2, ~0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (0.123E2, ~0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.123E2, ~0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.123E2, ~0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.123E2, ~0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.123E2, ~0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.123E2, ~0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.123E2, ~0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.123E2, ~0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.123E2, ~0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.123E2, ~0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E2, ~0.123, 0.123E1): ~0.28290004 ~0.2829001 (0.123E2, ~0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E2, ~0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, ~0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.31415927E1, 0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (0.31415927E1, 0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (0.31415927E1, 0.123E4, 0.123): 0.3864282E4 0.38642822E4 (0.31415927E1, 0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.31415927E1, 0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (0.31415927E1, 0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (0.31415927E1, 0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.31415927E1, 0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (0.31415927E1, 0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (0.31415927E1, 0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (0.31415927E1, 0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (0.31415927E1, 0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.31415927E1, 0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.31415927E1, 0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.31415927E1, 0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.31415927E1, 0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.31415927E1, 0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.31415927E1, 0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.31415927E1, 0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.31415927E1, 0.123E1, 0.123): 0.39871593E1 0.3987159E1 (0.31415927E1, 0.123, ~0.123E1): ~0.8435841 ~0.84358406 (0.31415927E1, 0.123, ~0.123): 0.2634159 0.26341593 (0.31415927E1, ~0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (0.31415927E1, ~0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.31415927E1, ~0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.31415927E1, ~0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.31415927E1, ~0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.31415927E1, ~0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.31415927E1, ~0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (0.31415927E1, ~0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.31415927E1, ~0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.31415927E1, ~0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.31415927E1, ~0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (0.31415927E1, ~0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.31415927E1, ~0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.31415927E1, ~0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.31415927E1, ~0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.31415927E1, ~0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.31415927E1, ~0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.31415927E1, ~0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.31415927E1, ~0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.31415927E1, ~0.123, 0.123E1): 0.8435841 0.84358406 (0.31415927E1, ~0.123, 0.123): ~0.2634159 ~0.26341593 (0.27182817E1, 0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (0.27182817E1, 0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (0.27182817E1, 0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.27182817E1, 0.123E2, 0.123): 0.33557865E2 0.3355787E2 (0.27182817E1, 0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (0.27182817E1, 0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.27182817E1, 0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.27182817E1, 0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (0.27182817E1, 0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.27182817E1, 0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.27182817E1, 0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.27182817E1, 0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.27182817E1, 0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.27182817E1, 0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.27182817E1, 0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.27182817E1, 0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.27182817E1, 0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (0.27182817E1, 0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (0.27182817E1, 0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (0.27182817E1, 0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.27182817E1, 0.123E1, 0.123): 0.34664867E1 0.34664865E1 (0.27182817E1, 0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (0.27182817E1, 0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (0.27182817E1, 0.123, 0.123E~2): 0.33557865 0.33557868 (0.27182817E1, 0.123, ~0.123): 0.21134867 0.21134868 (0.27182817E1, ~0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (0.27182817E1, ~0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (0.27182817E1, ~0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.27182817E1, ~0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.27182817E1, ~0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.27182817E1, ~0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.27182817E1, ~0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.27182817E1, ~0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.27182817E1, ~0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.27182817E1, ~0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.27182817E1, ~0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.27182817E1, ~0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.27182817E1, ~0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.27182817E1, ~0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.27182817E1, ~0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.27182817E1, ~0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (0.27182817E1, ~0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (0.27182817E1, ~0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (0.27182817E1, ~0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.27182817E1, ~0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.27182817E1, ~0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.27182817E1, ~0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.27182817E1, ~0.123, 0.123): ~0.21134867 ~0.21134868 (0.27182817E1, ~0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123E1, 0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (0.123E1, 0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (0.123E1, 0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.123E1, 0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.123E1, 0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E1, 0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.123E1, 0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (0.123E1, 0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.123E1, 0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (0.123E1, 0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (0.123E1, 0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (0.123E1, 0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (0.123E1, 0.123E1, ~0.123E1): 0.28290004 0.28289998 (0.123E1, 0.123E1, ~0.123): 0.13899001E1 0.13899E1 (0.123E1, 0.123, 0.123E1): 0.13812901E1 0.138129E1 (0.123E1, 0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123E1, 0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123E1, 0.123, ~0.123E~2): 0.15006001 0.15006 (0.123E1, 0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E1, ~0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (0.123E1, ~0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (0.123E1, ~0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.123E1, ~0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.123E1, ~0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E1, ~0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.123E1, ~0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.123E1, ~0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.123E1, ~0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.123E1, ~0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.123E1, ~0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.123E1, ~0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (0.123E1, ~0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (0.123E1, ~0.123, 0.123E1): 0.107871E1 0.10787101E1 (0.123E1, ~0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123E1, ~0.123, 0.123E~2): ~0.15006001 ~0.15006 (0.123E1, ~0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E1, ~0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (0.123, 0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.123, 0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.123, 0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123, 0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123, 0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123, 0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (0.123, 0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123, 0.123E2, 0.123): 0.16359E1 0.16359001E1 (0.123, 0.123E2, ~0.123E1): 0.28290004 0.2829001 (0.123, 0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (0.123, 0.31415927E1, ~0.123): 0.2634159 0.26341593 (0.123, 0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (0.123, 0.27182817E1, ~0.123): 0.21134867 0.21134868 (0.123, 0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (0.123, 0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123, 0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123, 0.123E1, ~0.123E~2): 0.15006001 0.15006 (0.123, ~0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.123, ~0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123, ~0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123, ~0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123, ~0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123, ~0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123, ~0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (0.123, ~0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123, ~0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123, ~0.31415927E1, 0.123E1): 0.8435841 0.84358406 (0.123, ~0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (0.123, ~0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (0.123, ~0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123, ~0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (0.123, ~0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123, ~0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (0.123, ~0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E~2, 0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E~2, 0.123E4, 0.123): 0.16359E1 0.16359001E1 (0.123E~2, 0.123E4, ~0.123E1): 0.28290004 0.2829001 (0.123E~2, 0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E~2, 0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E~2, ~0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (0.123E~2, ~0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E~2, ~0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E~2, ~0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.123E~2, ~0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.34028235E39, 0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (~0.34028235E39, 0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (~0.34028235E39, 0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.34028235E39, ~0.123E1, ~0.34028235E39): 0.78264946E38 inf (~0.34028235E39, ~0.123E1, ~0.17014117E39): 0.24840611E39 inf (~0.34028235E39, ~0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.17014117E39, 0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (~0.17014117E39, 0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (~0.17014117E39, 0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (~0.17014117E39, 0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.17014117E39, 0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.17014117E39, 0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.17014117E39, ~0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (~0.17014117E39, ~0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (~0.17014117E39, ~0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (~0.17014117E39, ~0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.17014117E39, ~0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.17014117E39, ~0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123E4, 0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E4, 0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E4, 0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.123E4, 0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.123E4, 0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.123E4, 0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.123E4, 0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E4, 0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E4, 0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E4, 0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E4, 0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E4, 0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E4, ~0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E4, ~0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E4, ~0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (~0.123E4, ~0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (~0.123E4, ~0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.123E4, ~0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.123E4, ~0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E4, ~0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E4, ~0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E4, ~0.123, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E4, ~0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E4, ~0.123E~2, 0.123): 0.16359E1 0.16359001E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, 0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E2, 0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E2, 0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E2, 0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E2, 0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E2, 0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E2, 0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.123E2, 0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.123E2, 0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.123E2, 0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.123E2, 0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.123E2, 0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.123E2, 0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.123E2, 0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.123E2, 0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.123E2, 0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.123E2, 0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.123E2, 0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E2, 0.123, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E2, 0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E2, 0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E2, 0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E2, ~0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E2, ~0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E2, ~0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E2, ~0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E2, ~0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E2, ~0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E2, ~0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (~0.123E2, ~0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.123E2, ~0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.123E2, ~0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.123E2, ~0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (~0.123E2, ~0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.123E2, ~0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (~0.123E2, ~0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.123E2, ~0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.123E2, ~0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.123E2, ~0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.123E2, ~0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E2, ~0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E2, ~0.123, 0.123): 0.16359E1 0.16359001E1 (~0.123E2, ~0.123, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, ~0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.31415927E1, 0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (~0.31415927E1, 0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.31415927E1, 0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.31415927E1, 0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.31415927E1, 0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.31415927E1, 0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.31415927E1, 0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.31415927E1, 0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.31415927E1, 0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.31415927E1, 0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.31415927E1, 0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (~0.31415927E1, 0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.31415927E1, 0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.31415927E1, 0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.31415927E1, 0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.31415927E1, 0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.31415927E1, 0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.31415927E1, 0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.31415927E1, 0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.31415927E1, 0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.31415927E1, 0.123, 0.123E1): 0.8435841 0.84358406 (~0.31415927E1, 0.123, 0.123): ~0.2634159 ~0.26341593 (~0.31415927E1, ~0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (~0.31415927E1, ~0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (~0.31415927E1, ~0.123E4, 0.123): 0.3864282E4 0.38642822E4 (~0.31415927E1, ~0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.31415927E1, ~0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.31415927E1, ~0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (~0.31415927E1, ~0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.31415927E1, ~0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.31415927E1, ~0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.31415927E1, ~0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (~0.31415927E1, ~0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (~0.31415927E1, ~0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.31415927E1, ~0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.31415927E1, ~0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.31415927E1, ~0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.31415927E1, ~0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.31415927E1, ~0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.31415927E1, ~0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.31415927E1, ~0.123E1, 0.123): 0.39871593E1 0.3987159E1 (~0.31415927E1, ~0.123, ~0.123E1): ~0.8435841 ~0.84358406 (~0.31415927E1, ~0.123, ~0.123): 0.2634159 0.26341593 (~0.27182817E1, 0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (~0.27182817E1, 0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (~0.27182817E1, 0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.27182817E1, 0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.27182817E1, 0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.27182817E1, 0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.27182817E1, 0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.27182817E1, 0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.27182817E1, 0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.27182817E1, 0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.27182817E1, 0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.27182817E1, 0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.27182817E1, 0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.27182817E1, 0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.27182817E1, 0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.27182817E1, 0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.27182817E1, 0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (~0.27182817E1, 0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (~0.27182817E1, 0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (~0.27182817E1, 0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.27182817E1, 0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.27182817E1, 0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.27182817E1, 0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.27182817E1, 0.123, 0.123): ~0.21134867 ~0.21134868 (~0.27182817E1, 0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.27182817E1, ~0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (~0.27182817E1, ~0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (~0.27182817E1, ~0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.27182817E1, ~0.123E2, 0.123): 0.33557865E2 0.3355787E2 (~0.27182817E1, ~0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.27182817E1, ~0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.27182817E1, ~0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.27182817E1, ~0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.27182817E1, ~0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.27182817E1, ~0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.27182817E1, ~0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.27182817E1, ~0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.27182817E1, ~0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.27182817E1, ~0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.27182817E1, ~0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.27182817E1, ~0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (~0.27182817E1, ~0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (~0.27182817E1, ~0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (~0.27182817E1, ~0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.27182817E1, ~0.123E1, 0.123): 0.34664867E1 0.34664865E1 (~0.27182817E1, ~0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.27182817E1, ~0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.27182817E1, ~0.123, 0.123E~2): 0.33557865 0.33557868 (~0.27182817E1, ~0.123, ~0.123): 0.21134867 0.21134868 (~0.123E1, 0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (~0.123E1, 0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (~0.123E1, 0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.123E1, 0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.123E1, 0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E1, 0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.123E1, 0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.123E1, 0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.123E1, 0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.123E1, 0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.123E1, 0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.123E1, 0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (~0.123E1, 0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (~0.123E1, 0.123, 0.123E1): 0.107871E1 0.10787101E1 (~0.123E1, 0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123E1, 0.123, 0.123E~2): ~0.15006001 ~0.15006 (~0.123E1, 0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123E1, 0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E1, ~0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (~0.123E1, ~0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (~0.123E1, ~0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.123E1, ~0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.123E1, ~0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E1, ~0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.123E1, ~0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (~0.123E1, ~0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.123E1, ~0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (~0.123E1, ~0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.123E1, ~0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.123E1, ~0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.28290004 0.28289998 (~0.123E1, ~0.123E1, ~0.123): 0.13899001E1 0.13899E1 (~0.123E1, ~0.123, 0.123E1): 0.13812901E1 0.138129E1 (~0.123E1, ~0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123E1, ~0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123E1, ~0.123, ~0.123E~2): 0.15006001 0.15006 (~0.123E1, ~0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (~0.123, 0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.123, 0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.123, 0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123, 0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123, 0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123, 0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123, 0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123, 0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123, 0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123, 0.31415927E1, 0.123E1): 0.8435841 0.84358406 (~0.123, 0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (~0.123, 0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (~0.123, 0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.123, 0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (~0.123, 0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123, 0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (~0.123, 0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123, ~0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.123, ~0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123, ~0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123, ~0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123, ~0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123, ~0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123, ~0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123, ~0.123E2, 0.123): 0.16359E1 0.16359001E1 (~0.123, ~0.123E2, ~0.123E1): 0.28290004 0.2829001 (~0.123, ~0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (~0.123, ~0.31415927E1, ~0.123): 0.2634159 0.26341593 (~0.123, ~0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (~0.123, ~0.27182817E1, ~0.123): 0.21134867 0.21134868 (~0.123, ~0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (~0.123, ~0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123, ~0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123, ~0.123E1, ~0.123E~2): 0.15006001 0.15006 (~0.123E~2, 0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E~2, 0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E~2, 0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E~2, 0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E~2, 0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E~2, ~0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E~2, ~0.123E4, 0.123): 0.16359E1 0.16359001E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.28290004 0.2829001 (~0.123E~2, ~0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.123E~2, ~0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.34028235E39, 0.34028235E39) = false > (0.34028235E39, 0.34028235E39) = false == (0.34028235E39, 0.34028235E39) = true ?= (0.34028235E39, 0.34028235E39) = true < (0.34028235E39, 0.17014117E39) = false > (0.34028235E39, 0.17014117E39) = true == (0.34028235E39, 0.17014117E39) = false ?= (0.34028235E39, 0.17014117E39) = false < (0.34028235E39, 0.123E4) = false > (0.34028235E39, 0.123E4) = true == (0.34028235E39, 0.123E4) = false ?= (0.34028235E39, 0.123E4) = false < (0.34028235E39, 0.123E2) = false > (0.34028235E39, 0.123E2) = true == (0.34028235E39, 0.123E2) = false ?= (0.34028235E39, 0.123E2) = false < (0.34028235E39, 0.31415927E1) = false > (0.34028235E39, 0.31415927E1) = true == (0.34028235E39, 0.31415927E1) = false ?= (0.34028235E39, 0.31415927E1) = false < (0.34028235E39, 0.27182817E1) = false > (0.34028235E39, 0.27182817E1) = true == (0.34028235E39, 0.27182817E1) = false ?= (0.34028235E39, 0.27182817E1) = false < (0.34028235E39, 0.123E1) = false > (0.34028235E39, 0.123E1) = true == (0.34028235E39, 0.123E1) = false ?= (0.34028235E39, 0.123E1) = false < (0.34028235E39, 0.123) = false > (0.34028235E39, 0.123) = true == (0.34028235E39, 0.123) = false ?= (0.34028235E39, 0.123) = false < (0.34028235E39, 0.123E~2) = false > (0.34028235E39, 0.123E~2) = true == (0.34028235E39, 0.123E~2) = false ?= (0.34028235E39, 0.123E~2) = false < (0.34028235E39, 0.11754944E~37) = false > (0.34028235E39, 0.11754944E~37) = true == (0.34028235E39, 0.11754944E~37) = false ?= (0.34028235E39, 0.11754944E~37) = false < (0.34028235E39, 0.5877472E~38) = false > (0.34028235E39, 0.5877472E~38) = true == (0.34028235E39, 0.5877472E~38) = false ?= (0.34028235E39, 0.5877472E~38) = false < (0.34028235E39, 0.1E~44) = false > (0.34028235E39, 0.1E~44) = true == (0.34028235E39, 0.1E~44) = false ?= (0.34028235E39, 0.1E~44) = false < (0.34028235E39, 0.0) = false > (0.34028235E39, 0.0) = true == (0.34028235E39, 0.0) = false ?= (0.34028235E39, 0.0) = false < (0.34028235E39, ~0.34028235E39) = false > (0.34028235E39, ~0.34028235E39) = true == (0.34028235E39, ~0.34028235E39) = false ?= (0.34028235E39, ~0.34028235E39) = false < (0.34028235E39, ~0.17014117E39) = false > (0.34028235E39, ~0.17014117E39) = true == (0.34028235E39, ~0.17014117E39) = false ?= (0.34028235E39, ~0.17014117E39) = false < (0.34028235E39, ~0.123E4) = false > (0.34028235E39, ~0.123E4) = true == (0.34028235E39, ~0.123E4) = false ?= (0.34028235E39, ~0.123E4) = false < (0.34028235E39, ~0.123E2) = false > (0.34028235E39, ~0.123E2) = true == (0.34028235E39, ~0.123E2) = false ?= (0.34028235E39, ~0.123E2) = false < (0.34028235E39, ~0.31415927E1) = false > (0.34028235E39, ~0.31415927E1) = true == (0.34028235E39, ~0.31415927E1) = false ?= (0.34028235E39, ~0.31415927E1) = false < (0.34028235E39, ~0.27182817E1) = false > (0.34028235E39, ~0.27182817E1) = true == (0.34028235E39, ~0.27182817E1) = false ?= (0.34028235E39, ~0.27182817E1) = false < (0.34028235E39, ~0.123E1) = false > (0.34028235E39, ~0.123E1) = true == (0.34028235E39, ~0.123E1) = false ?= (0.34028235E39, ~0.123E1) = false < (0.34028235E39, ~0.123) = false > (0.34028235E39, ~0.123) = true == (0.34028235E39, ~0.123) = false ?= (0.34028235E39, ~0.123) = false < (0.34028235E39, ~0.123E~2) = false > (0.34028235E39, ~0.123E~2) = true == (0.34028235E39, ~0.123E~2) = false ?= (0.34028235E39, ~0.123E~2) = false < (0.34028235E39, ~0.11754944E~37) = false > (0.34028235E39, ~0.11754944E~37) = true == (0.34028235E39, ~0.11754944E~37) = false ?= (0.34028235E39, ~0.11754944E~37) = false < (0.34028235E39, ~0.5877472E~38) = false > (0.34028235E39, ~0.5877472E~38) = true == (0.34028235E39, ~0.5877472E~38) = false ?= (0.34028235E39, ~0.5877472E~38) = false < (0.34028235E39, ~0.1E~44) = false > (0.34028235E39, ~0.1E~44) = true == (0.34028235E39, ~0.1E~44) = false ?= (0.34028235E39, ~0.1E~44) = false < (0.34028235E39, ~0.0) = false > (0.34028235E39, ~0.0) = true == (0.34028235E39, ~0.0) = false ?= (0.34028235E39, ~0.0) = false < (0.17014117E39, 0.34028235E39) = true > (0.17014117E39, 0.34028235E39) = false == (0.17014117E39, 0.34028235E39) = false ?= (0.17014117E39, 0.34028235E39) = false < (0.17014117E39, 0.17014117E39) = false > (0.17014117E39, 0.17014117E39) = false == (0.17014117E39, 0.17014117E39) = true ?= (0.17014117E39, 0.17014117E39) = true < (0.17014117E39, 0.123E4) = false > (0.17014117E39, 0.123E4) = true == (0.17014117E39, 0.123E4) = false ?= (0.17014117E39, 0.123E4) = false < (0.17014117E39, 0.123E2) = false > (0.17014117E39, 0.123E2) = true == (0.17014117E39, 0.123E2) = false ?= (0.17014117E39, 0.123E2) = false < (0.17014117E39, 0.31415927E1) = false > (0.17014117E39, 0.31415927E1) = true == (0.17014117E39, 0.31415927E1) = false ?= (0.17014117E39, 0.31415927E1) = false < (0.17014117E39, 0.27182817E1) = false > (0.17014117E39, 0.27182817E1) = true == (0.17014117E39, 0.27182817E1) = false ?= (0.17014117E39, 0.27182817E1) = false < (0.17014117E39, 0.123E1) = false > (0.17014117E39, 0.123E1) = true == (0.17014117E39, 0.123E1) = false ?= (0.17014117E39, 0.123E1) = false < (0.17014117E39, 0.123) = false > (0.17014117E39, 0.123) = true == (0.17014117E39, 0.123) = false ?= (0.17014117E39, 0.123) = false < (0.17014117E39, 0.123E~2) = false > (0.17014117E39, 0.123E~2) = true == (0.17014117E39, 0.123E~2) = false ?= (0.17014117E39, 0.123E~2) = false < (0.17014117E39, 0.11754944E~37) = false > (0.17014117E39, 0.11754944E~37) = true == (0.17014117E39, 0.11754944E~37) = false ?= (0.17014117E39, 0.11754944E~37) = false < (0.17014117E39, 0.5877472E~38) = false > (0.17014117E39, 0.5877472E~38) = true == (0.17014117E39, 0.5877472E~38) = false ?= (0.17014117E39, 0.5877472E~38) = false < (0.17014117E39, 0.1E~44) = false > (0.17014117E39, 0.1E~44) = true == (0.17014117E39, 0.1E~44) = false ?= (0.17014117E39, 0.1E~44) = false < (0.17014117E39, 0.0) = false > (0.17014117E39, 0.0) = true == (0.17014117E39, 0.0) = false ?= (0.17014117E39, 0.0) = false < (0.17014117E39, ~0.34028235E39) = false > (0.17014117E39, ~0.34028235E39) = true == (0.17014117E39, ~0.34028235E39) = false ?= (0.17014117E39, ~0.34028235E39) = false < (0.17014117E39, ~0.17014117E39) = false > (0.17014117E39, ~0.17014117E39) = true == (0.17014117E39, ~0.17014117E39) = false ?= (0.17014117E39, ~0.17014117E39) = false < (0.17014117E39, ~0.123E4) = false > (0.17014117E39, ~0.123E4) = true == (0.17014117E39, ~0.123E4) = false ?= (0.17014117E39, ~0.123E4) = false < (0.17014117E39, ~0.123E2) = false > (0.17014117E39, ~0.123E2) = true == (0.17014117E39, ~0.123E2) = false ?= (0.17014117E39, ~0.123E2) = false < (0.17014117E39, ~0.31415927E1) = false > (0.17014117E39, ~0.31415927E1) = true == (0.17014117E39, ~0.31415927E1) = false ?= (0.17014117E39, ~0.31415927E1) = false < (0.17014117E39, ~0.27182817E1) = false > (0.17014117E39, ~0.27182817E1) = true == (0.17014117E39, ~0.27182817E1) = false ?= (0.17014117E39, ~0.27182817E1) = false < (0.17014117E39, ~0.123E1) = false > (0.17014117E39, ~0.123E1) = true == (0.17014117E39, ~0.123E1) = false ?= (0.17014117E39, ~0.123E1) = false < (0.17014117E39, ~0.123) = false > (0.17014117E39, ~0.123) = true == (0.17014117E39, ~0.123) = false ?= (0.17014117E39, ~0.123) = false < (0.17014117E39, ~0.123E~2) = false > (0.17014117E39, ~0.123E~2) = true == (0.17014117E39, ~0.123E~2) = false ?= (0.17014117E39, ~0.123E~2) = false < (0.17014117E39, ~0.11754944E~37) = false > (0.17014117E39, ~0.11754944E~37) = true == (0.17014117E39, ~0.11754944E~37) = false ?= (0.17014117E39, ~0.11754944E~37) = false < (0.17014117E39, ~0.5877472E~38) = false > (0.17014117E39, ~0.5877472E~38) = true == (0.17014117E39, ~0.5877472E~38) = false ?= (0.17014117E39, ~0.5877472E~38) = false < (0.17014117E39, ~0.1E~44) = false > (0.17014117E39, ~0.1E~44) = true == (0.17014117E39, ~0.1E~44) = false ?= (0.17014117E39, ~0.1E~44) = false < (0.17014117E39, ~0.0) = false > (0.17014117E39, ~0.0) = true == (0.17014117E39, ~0.0) = false ?= (0.17014117E39, ~0.0) = false < (0.123E4, 0.34028235E39) = true > (0.123E4, 0.34028235E39) = false == (0.123E4, 0.34028235E39) = false ?= (0.123E4, 0.34028235E39) = false < (0.123E4, 0.17014117E39) = true > (0.123E4, 0.17014117E39) = false == (0.123E4, 0.17014117E39) = false ?= (0.123E4, 0.17014117E39) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.31415927E1) = false > (0.123E4, 0.31415927E1) = true == (0.123E4, 0.31415927E1) = false ?= (0.123E4, 0.31415927E1) = false < (0.123E4, 0.27182817E1) = false > (0.123E4, 0.27182817E1) = true == (0.123E4, 0.27182817E1) = false ?= (0.123E4, 0.27182817E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.11754944E~37) = false > (0.123E4, 0.11754944E~37) = true == (0.123E4, 0.11754944E~37) = false ?= (0.123E4, 0.11754944E~37) = false < (0.123E4, 0.5877472E~38) = false > (0.123E4, 0.5877472E~38) = true == (0.123E4, 0.5877472E~38) = false ?= (0.123E4, 0.5877472E~38) = false < (0.123E4, 0.1E~44) = false > (0.123E4, 0.1E~44) = true == (0.123E4, 0.1E~44) = false ?= (0.123E4, 0.1E~44) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.34028235E39) = false > (0.123E4, ~0.34028235E39) = true == (0.123E4, ~0.34028235E39) = false ?= (0.123E4, ~0.34028235E39) = false < (0.123E4, ~0.17014117E39) = false > (0.123E4, ~0.17014117E39) = true == (0.123E4, ~0.17014117E39) = false ?= (0.123E4, ~0.17014117E39) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.31415927E1) = false > (0.123E4, ~0.31415927E1) = true == (0.123E4, ~0.31415927E1) = false ?= (0.123E4, ~0.31415927E1) = false < (0.123E4, ~0.27182817E1) = false > (0.123E4, ~0.27182817E1) = true == (0.123E4, ~0.27182817E1) = false ?= (0.123E4, ~0.27182817E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.11754944E~37) = false > (0.123E4, ~0.11754944E~37) = true == (0.123E4, ~0.11754944E~37) = false ?= (0.123E4, ~0.11754944E~37) = false < (0.123E4, ~0.5877472E~38) = false > (0.123E4, ~0.5877472E~38) = true == (0.123E4, ~0.5877472E~38) = false ?= (0.123E4, ~0.5877472E~38) = false < (0.123E4, ~0.1E~44) = false > (0.123E4, ~0.1E~44) = true == (0.123E4, ~0.1E~44) = false ?= (0.123E4, ~0.1E~44) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.34028235E39) = true > (0.123E2, 0.34028235E39) = false == (0.123E2, 0.34028235E39) = false ?= (0.123E2, 0.34028235E39) = false < (0.123E2, 0.17014117E39) = true > (0.123E2, 0.17014117E39) = false == (0.123E2, 0.17014117E39) = false ?= (0.123E2, 0.17014117E39) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.31415927E1) = false > (0.123E2, 0.31415927E1) = true == (0.123E2, 0.31415927E1) = false ?= (0.123E2, 0.31415927E1) = false < (0.123E2, 0.27182817E1) = false > (0.123E2, 0.27182817E1) = true == (0.123E2, 0.27182817E1) = false ?= (0.123E2, 0.27182817E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.11754944E~37) = false > (0.123E2, 0.11754944E~37) = true == (0.123E2, 0.11754944E~37) = false ?= (0.123E2, 0.11754944E~37) = false < (0.123E2, 0.5877472E~38) = false > (0.123E2, 0.5877472E~38) = true == (0.123E2, 0.5877472E~38) = false ?= (0.123E2, 0.5877472E~38) = false < (0.123E2, 0.1E~44) = false > (0.123E2, 0.1E~44) = true == (0.123E2, 0.1E~44) = false ?= (0.123E2, 0.1E~44) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.34028235E39) = false > (0.123E2, ~0.34028235E39) = true == (0.123E2, ~0.34028235E39) = false ?= (0.123E2, ~0.34028235E39) = false < (0.123E2, ~0.17014117E39) = false > (0.123E2, ~0.17014117E39) = true == (0.123E2, ~0.17014117E39) = false ?= (0.123E2, ~0.17014117E39) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.31415927E1) = false > (0.123E2, ~0.31415927E1) = true == (0.123E2, ~0.31415927E1) = false ?= (0.123E2, ~0.31415927E1) = false < (0.123E2, ~0.27182817E1) = false > (0.123E2, ~0.27182817E1) = true == (0.123E2, ~0.27182817E1) = false ?= (0.123E2, ~0.27182817E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.11754944E~37) = false > (0.123E2, ~0.11754944E~37) = true == (0.123E2, ~0.11754944E~37) = false ?= (0.123E2, ~0.11754944E~37) = false < (0.123E2, ~0.5877472E~38) = false > (0.123E2, ~0.5877472E~38) = true == (0.123E2, ~0.5877472E~38) = false ?= (0.123E2, ~0.5877472E~38) = false < (0.123E2, ~0.1E~44) = false > (0.123E2, ~0.1E~44) = true == (0.123E2, ~0.1E~44) = false ?= (0.123E2, ~0.1E~44) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.31415927E1, 0.34028235E39) = true > (0.31415927E1, 0.34028235E39) = false == (0.31415927E1, 0.34028235E39) = false ?= (0.31415927E1, 0.34028235E39) = false < (0.31415927E1, 0.17014117E39) = true > (0.31415927E1, 0.17014117E39) = false == (0.31415927E1, 0.17014117E39) = false ?= (0.31415927E1, 0.17014117E39) = false < (0.31415927E1, 0.123E4) = true > (0.31415927E1, 0.123E4) = false == (0.31415927E1, 0.123E4) = false ?= (0.31415927E1, 0.123E4) = false < (0.31415927E1, 0.123E2) = true > (0.31415927E1, 0.123E2) = false == (0.31415927E1, 0.123E2) = false ?= (0.31415927E1, 0.123E2) = false < (0.31415927E1, 0.31415927E1) = false > (0.31415927E1, 0.31415927E1) = false == (0.31415927E1, 0.31415927E1) = true ?= (0.31415927E1, 0.31415927E1) = true < (0.31415927E1, 0.27182817E1) = false > (0.31415927E1, 0.27182817E1) = true == (0.31415927E1, 0.27182817E1) = false ?= (0.31415927E1, 0.27182817E1) = false < (0.31415927E1, 0.123E1) = false > (0.31415927E1, 0.123E1) = true == (0.31415927E1, 0.123E1) = false ?= (0.31415927E1, 0.123E1) = false < (0.31415927E1, 0.123) = false > (0.31415927E1, 0.123) = true == (0.31415927E1, 0.123) = false ?= (0.31415927E1, 0.123) = false < (0.31415927E1, 0.123E~2) = false > (0.31415927E1, 0.123E~2) = true == (0.31415927E1, 0.123E~2) = false ?= (0.31415927E1, 0.123E~2) = false < (0.31415927E1, 0.11754944E~37) = false > (0.31415927E1, 0.11754944E~37) = true == (0.31415927E1, 0.11754944E~37) = false ?= (0.31415927E1, 0.11754944E~37) = false < (0.31415927E1, 0.5877472E~38) = false > (0.31415927E1, 0.5877472E~38) = true == (0.31415927E1, 0.5877472E~38) = false ?= (0.31415927E1, 0.5877472E~38) = false < (0.31415927E1, 0.1E~44) = false > (0.31415927E1, 0.1E~44) = true == (0.31415927E1, 0.1E~44) = false ?= (0.31415927E1, 0.1E~44) = false < (0.31415927E1, 0.0) = false > (0.31415927E1, 0.0) = true == (0.31415927E1, 0.0) = false ?= (0.31415927E1, 0.0) = false < (0.31415927E1, ~0.34028235E39) = false > (0.31415927E1, ~0.34028235E39) = true == (0.31415927E1, ~0.34028235E39) = false ?= (0.31415927E1, ~0.34028235E39) = false < (0.31415927E1, ~0.17014117E39) = false > (0.31415927E1, ~0.17014117E39) = true == (0.31415927E1, ~0.17014117E39) = false ?= (0.31415927E1, ~0.17014117E39) = false < (0.31415927E1, ~0.123E4) = false > (0.31415927E1, ~0.123E4) = true == (0.31415927E1, ~0.123E4) = false ?= (0.31415927E1, ~0.123E4) = false < (0.31415927E1, ~0.123E2) = false > (0.31415927E1, ~0.123E2) = true == (0.31415927E1, ~0.123E2) = false ?= (0.31415927E1, ~0.123E2) = false < (0.31415927E1, ~0.31415927E1) = false > (0.31415927E1, ~0.31415927E1) = true == (0.31415927E1, ~0.31415927E1) = false ?= (0.31415927E1, ~0.31415927E1) = false < (0.31415927E1, ~0.27182817E1) = false > (0.31415927E1, ~0.27182817E1) = true == (0.31415927E1, ~0.27182817E1) = false ?= (0.31415927E1, ~0.27182817E1) = false < (0.31415927E1, ~0.123E1) = false > (0.31415927E1, ~0.123E1) = true == (0.31415927E1, ~0.123E1) = false ?= (0.31415927E1, ~0.123E1) = false < (0.31415927E1, ~0.123) = false > (0.31415927E1, ~0.123) = true == (0.31415927E1, ~0.123) = false ?= (0.31415927E1, ~0.123) = false < (0.31415927E1, ~0.123E~2) = false > (0.31415927E1, ~0.123E~2) = true == (0.31415927E1, ~0.123E~2) = false ?= (0.31415927E1, ~0.123E~2) = false < (0.31415927E1, ~0.11754944E~37) = false > (0.31415927E1, ~0.11754944E~37) = true == (0.31415927E1, ~0.11754944E~37) = false ?= (0.31415927E1, ~0.11754944E~37) = false < (0.31415927E1, ~0.5877472E~38) = false > (0.31415927E1, ~0.5877472E~38) = true == (0.31415927E1, ~0.5877472E~38) = false ?= (0.31415927E1, ~0.5877472E~38) = false < (0.31415927E1, ~0.1E~44) = false > (0.31415927E1, ~0.1E~44) = true == (0.31415927E1, ~0.1E~44) = false ?= (0.31415927E1, ~0.1E~44) = false < (0.31415927E1, ~0.0) = false > (0.31415927E1, ~0.0) = true == (0.31415927E1, ~0.0) = false ?= (0.31415927E1, ~0.0) = false < (0.27182817E1, 0.34028235E39) = true > (0.27182817E1, 0.34028235E39) = false == (0.27182817E1, 0.34028235E39) = false ?= (0.27182817E1, 0.34028235E39) = false < (0.27182817E1, 0.17014117E39) = true > (0.27182817E1, 0.17014117E39) = false == (0.27182817E1, 0.17014117E39) = false ?= (0.27182817E1, 0.17014117E39) = false < (0.27182817E1, 0.123E4) = true > (0.27182817E1, 0.123E4) = false == (0.27182817E1, 0.123E4) = false ?= (0.27182817E1, 0.123E4) = false < (0.27182817E1, 0.123E2) = true > (0.27182817E1, 0.123E2) = false == (0.27182817E1, 0.123E2) = false ?= (0.27182817E1, 0.123E2) = false < (0.27182817E1, 0.31415927E1) = true > (0.27182817E1, 0.31415927E1) = false == (0.27182817E1, 0.31415927E1) = false ?= (0.27182817E1, 0.31415927E1) = false < (0.27182817E1, 0.27182817E1) = false > (0.27182817E1, 0.27182817E1) = false == (0.27182817E1, 0.27182817E1) = true ?= (0.27182817E1, 0.27182817E1) = true < (0.27182817E1, 0.123E1) = false > (0.27182817E1, 0.123E1) = true == (0.27182817E1, 0.123E1) = false ?= (0.27182817E1, 0.123E1) = false < (0.27182817E1, 0.123) = false > (0.27182817E1, 0.123) = true == (0.27182817E1, 0.123) = false ?= (0.27182817E1, 0.123) = false < (0.27182817E1, 0.123E~2) = false > (0.27182817E1, 0.123E~2) = true == (0.27182817E1, 0.123E~2) = false ?= (0.27182817E1, 0.123E~2) = false < (0.27182817E1, 0.11754944E~37) = false > (0.27182817E1, 0.11754944E~37) = true == (0.27182817E1, 0.11754944E~37) = false ?= (0.27182817E1, 0.11754944E~37) = false < (0.27182817E1, 0.5877472E~38) = false > (0.27182817E1, 0.5877472E~38) = true == (0.27182817E1, 0.5877472E~38) = false ?= (0.27182817E1, 0.5877472E~38) = false < (0.27182817E1, 0.1E~44) = false > (0.27182817E1, 0.1E~44) = true == (0.27182817E1, 0.1E~44) = false ?= (0.27182817E1, 0.1E~44) = false < (0.27182817E1, 0.0) = false > (0.27182817E1, 0.0) = true == (0.27182817E1, 0.0) = false ?= (0.27182817E1, 0.0) = false < (0.27182817E1, ~0.34028235E39) = false > (0.27182817E1, ~0.34028235E39) = true == (0.27182817E1, ~0.34028235E39) = false ?= (0.27182817E1, ~0.34028235E39) = false < (0.27182817E1, ~0.17014117E39) = false > (0.27182817E1, ~0.17014117E39) = true == (0.27182817E1, ~0.17014117E39) = false ?= (0.27182817E1, ~0.17014117E39) = false < (0.27182817E1, ~0.123E4) = false > (0.27182817E1, ~0.123E4) = true == (0.27182817E1, ~0.123E4) = false ?= (0.27182817E1, ~0.123E4) = false < (0.27182817E1, ~0.123E2) = false > (0.27182817E1, ~0.123E2) = true == (0.27182817E1, ~0.123E2) = false ?= (0.27182817E1, ~0.123E2) = false < (0.27182817E1, ~0.31415927E1) = false > (0.27182817E1, ~0.31415927E1) = true == (0.27182817E1, ~0.31415927E1) = false ?= (0.27182817E1, ~0.31415927E1) = false < (0.27182817E1, ~0.27182817E1) = false > (0.27182817E1, ~0.27182817E1) = true == (0.27182817E1, ~0.27182817E1) = false ?= (0.27182817E1, ~0.27182817E1) = false < (0.27182817E1, ~0.123E1) = false > (0.27182817E1, ~0.123E1) = true == (0.27182817E1, ~0.123E1) = false ?= (0.27182817E1, ~0.123E1) = false < (0.27182817E1, ~0.123) = false > (0.27182817E1, ~0.123) = true == (0.27182817E1, ~0.123) = false ?= (0.27182817E1, ~0.123) = false < (0.27182817E1, ~0.123E~2) = false > (0.27182817E1, ~0.123E~2) = true == (0.27182817E1, ~0.123E~2) = false ?= (0.27182817E1, ~0.123E~2) = false < (0.27182817E1, ~0.11754944E~37) = false > (0.27182817E1, ~0.11754944E~37) = true == (0.27182817E1, ~0.11754944E~37) = false ?= (0.27182817E1, ~0.11754944E~37) = false < (0.27182817E1, ~0.5877472E~38) = false > (0.27182817E1, ~0.5877472E~38) = true == (0.27182817E1, ~0.5877472E~38) = false ?= (0.27182817E1, ~0.5877472E~38) = false < (0.27182817E1, ~0.1E~44) = false > (0.27182817E1, ~0.1E~44) = true == (0.27182817E1, ~0.1E~44) = false ?= (0.27182817E1, ~0.1E~44) = false < (0.27182817E1, ~0.0) = false > (0.27182817E1, ~0.0) = true == (0.27182817E1, ~0.0) = false ?= (0.27182817E1, ~0.0) = false < (0.123E1, 0.34028235E39) = true > (0.123E1, 0.34028235E39) = false == (0.123E1, 0.34028235E39) = false ?= (0.123E1, 0.34028235E39) = false < (0.123E1, 0.17014117E39) = true > (0.123E1, 0.17014117E39) = false == (0.123E1, 0.17014117E39) = false ?= (0.123E1, 0.17014117E39) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.31415927E1) = true > (0.123E1, 0.31415927E1) = false == (0.123E1, 0.31415927E1) = false ?= (0.123E1, 0.31415927E1) = false < (0.123E1, 0.27182817E1) = true > (0.123E1, 0.27182817E1) = false == (0.123E1, 0.27182817E1) = false ?= (0.123E1, 0.27182817E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.11754944E~37) = false > (0.123E1, 0.11754944E~37) = true == (0.123E1, 0.11754944E~37) = false ?= (0.123E1, 0.11754944E~37) = false < (0.123E1, 0.5877472E~38) = false > (0.123E1, 0.5877472E~38) = true == (0.123E1, 0.5877472E~38) = false ?= (0.123E1, 0.5877472E~38) = false < (0.123E1, 0.1E~44) = false > (0.123E1, 0.1E~44) = true == (0.123E1, 0.1E~44) = false ?= (0.123E1, 0.1E~44) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.34028235E39) = false > (0.123E1, ~0.34028235E39) = true == (0.123E1, ~0.34028235E39) = false ?= (0.123E1, ~0.34028235E39) = false < (0.123E1, ~0.17014117E39) = false > (0.123E1, ~0.17014117E39) = true == (0.123E1, ~0.17014117E39) = false ?= (0.123E1, ~0.17014117E39) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.31415927E1) = false > (0.123E1, ~0.31415927E1) = true == (0.123E1, ~0.31415927E1) = false ?= (0.123E1, ~0.31415927E1) = false < (0.123E1, ~0.27182817E1) = false > (0.123E1, ~0.27182817E1) = true == (0.123E1, ~0.27182817E1) = false ?= (0.123E1, ~0.27182817E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.11754944E~37) = false > (0.123E1, ~0.11754944E~37) = true == (0.123E1, ~0.11754944E~37) = false ?= (0.123E1, ~0.11754944E~37) = false < (0.123E1, ~0.5877472E~38) = false > (0.123E1, ~0.5877472E~38) = true == (0.123E1, ~0.5877472E~38) = false ?= (0.123E1, ~0.5877472E~38) = false < (0.123E1, ~0.1E~44) = false > (0.123E1, ~0.1E~44) = true == (0.123E1, ~0.1E~44) = false ?= (0.123E1, ~0.1E~44) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.34028235E39) = true > (0.123, 0.34028235E39) = false == (0.123, 0.34028235E39) = false ?= (0.123, 0.34028235E39) = false < (0.123, 0.17014117E39) = true > (0.123, 0.17014117E39) = false == (0.123, 0.17014117E39) = false ?= (0.123, 0.17014117E39) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.31415927E1) = true > (0.123, 0.31415927E1) = false == (0.123, 0.31415927E1) = false ?= (0.123, 0.31415927E1) = false < (0.123, 0.27182817E1) = true > (0.123, 0.27182817E1) = false == (0.123, 0.27182817E1) = false ?= (0.123, 0.27182817E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.11754944E~37) = false > (0.123, 0.11754944E~37) = true == (0.123, 0.11754944E~37) = false ?= (0.123, 0.11754944E~37) = false < (0.123, 0.5877472E~38) = false > (0.123, 0.5877472E~38) = true == (0.123, 0.5877472E~38) = false ?= (0.123, 0.5877472E~38) = false < (0.123, 0.1E~44) = false > (0.123, 0.1E~44) = true == (0.123, 0.1E~44) = false ?= (0.123, 0.1E~44) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.34028235E39) = false > (0.123, ~0.34028235E39) = true == (0.123, ~0.34028235E39) = false ?= (0.123, ~0.34028235E39) = false < (0.123, ~0.17014117E39) = false > (0.123, ~0.17014117E39) = true == (0.123, ~0.17014117E39) = false ?= (0.123, ~0.17014117E39) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.31415927E1) = false > (0.123, ~0.31415927E1) = true == (0.123, ~0.31415927E1) = false ?= (0.123, ~0.31415927E1) = false < (0.123, ~0.27182817E1) = false > (0.123, ~0.27182817E1) = true == (0.123, ~0.27182817E1) = false ?= (0.123, ~0.27182817E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.11754944E~37) = false > (0.123, ~0.11754944E~37) = true == (0.123, ~0.11754944E~37) = false ?= (0.123, ~0.11754944E~37) = false < (0.123, ~0.5877472E~38) = false > (0.123, ~0.5877472E~38) = true == (0.123, ~0.5877472E~38) = false ?= (0.123, ~0.5877472E~38) = false < (0.123, ~0.1E~44) = false > (0.123, ~0.1E~44) = true == (0.123, ~0.1E~44) = false ?= (0.123, ~0.1E~44) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.34028235E39) = true > (0.123E~2, 0.34028235E39) = false == (0.123E~2, 0.34028235E39) = false ?= (0.123E~2, 0.34028235E39) = false < (0.123E~2, 0.17014117E39) = true > (0.123E~2, 0.17014117E39) = false == (0.123E~2, 0.17014117E39) = false ?= (0.123E~2, 0.17014117E39) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.31415927E1) = true > (0.123E~2, 0.31415927E1) = false == (0.123E~2, 0.31415927E1) = false ?= (0.123E~2, 0.31415927E1) = false < (0.123E~2, 0.27182817E1) = true > (0.123E~2, 0.27182817E1) = false == (0.123E~2, 0.27182817E1) = false ?= (0.123E~2, 0.27182817E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.11754944E~37) = false > (0.123E~2, 0.11754944E~37) = true == (0.123E~2, 0.11754944E~37) = false ?= (0.123E~2, 0.11754944E~37) = false < (0.123E~2, 0.5877472E~38) = false > (0.123E~2, 0.5877472E~38) = true == (0.123E~2, 0.5877472E~38) = false ?= (0.123E~2, 0.5877472E~38) = false < (0.123E~2, 0.1E~44) = false > (0.123E~2, 0.1E~44) = true == (0.123E~2, 0.1E~44) = false ?= (0.123E~2, 0.1E~44) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.34028235E39) = false > (0.123E~2, ~0.34028235E39) = true == (0.123E~2, ~0.34028235E39) = false ?= (0.123E~2, ~0.34028235E39) = false < (0.123E~2, ~0.17014117E39) = false > (0.123E~2, ~0.17014117E39) = true == (0.123E~2, ~0.17014117E39) = false ?= (0.123E~2, ~0.17014117E39) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.31415927E1) = false > (0.123E~2, ~0.31415927E1) = true == (0.123E~2, ~0.31415927E1) = false ?= (0.123E~2, ~0.31415927E1) = false < (0.123E~2, ~0.27182817E1) = false > (0.123E~2, ~0.27182817E1) = true == (0.123E~2, ~0.27182817E1) = false ?= (0.123E~2, ~0.27182817E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.11754944E~37) = false > (0.123E~2, ~0.11754944E~37) = true == (0.123E~2, ~0.11754944E~37) = false ?= (0.123E~2, ~0.11754944E~37) = false < (0.123E~2, ~0.5877472E~38) = false > (0.123E~2, ~0.5877472E~38) = true == (0.123E~2, ~0.5877472E~38) = false ?= (0.123E~2, ~0.5877472E~38) = false < (0.123E~2, ~0.1E~44) = false > (0.123E~2, ~0.1E~44) = true == (0.123E~2, ~0.1E~44) = false ?= (0.123E~2, ~0.1E~44) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.11754944E~37, 0.34028235E39) = true > (0.11754944E~37, 0.34028235E39) = false == (0.11754944E~37, 0.34028235E39) = false ?= (0.11754944E~37, 0.34028235E39) = false < (0.11754944E~37, 0.17014117E39) = true > (0.11754944E~37, 0.17014117E39) = false == (0.11754944E~37, 0.17014117E39) = false ?= (0.11754944E~37, 0.17014117E39) = false < (0.11754944E~37, 0.123E4) = true > (0.11754944E~37, 0.123E4) = false == (0.11754944E~37, 0.123E4) = false ?= (0.11754944E~37, 0.123E4) = false < (0.11754944E~37, 0.123E2) = true > (0.11754944E~37, 0.123E2) = false == (0.11754944E~37, 0.123E2) = false ?= (0.11754944E~37, 0.123E2) = false < (0.11754944E~37, 0.31415927E1) = true > (0.11754944E~37, 0.31415927E1) = false == (0.11754944E~37, 0.31415927E1) = false ?= (0.11754944E~37, 0.31415927E1) = false < (0.11754944E~37, 0.27182817E1) = true > (0.11754944E~37, 0.27182817E1) = false == (0.11754944E~37, 0.27182817E1) = false ?= (0.11754944E~37, 0.27182817E1) = false < (0.11754944E~37, 0.123E1) = true > (0.11754944E~37, 0.123E1) = false == (0.11754944E~37, 0.123E1) = false ?= (0.11754944E~37, 0.123E1) = false < (0.11754944E~37, 0.123) = true > (0.11754944E~37, 0.123) = false == (0.11754944E~37, 0.123) = false ?= (0.11754944E~37, 0.123) = false < (0.11754944E~37, 0.123E~2) = true > (0.11754944E~37, 0.123E~2) = false == (0.11754944E~37, 0.123E~2) = false ?= (0.11754944E~37, 0.123E~2) = false < (0.11754944E~37, 0.11754944E~37) = false > (0.11754944E~37, 0.11754944E~37) = false == (0.11754944E~37, 0.11754944E~37) = true ?= (0.11754944E~37, 0.11754944E~37) = true < (0.11754944E~37, 0.5877472E~38) = false > (0.11754944E~37, 0.5877472E~38) = true == (0.11754944E~37, 0.5877472E~38) = false ?= (0.11754944E~37, 0.5877472E~38) = false < (0.11754944E~37, 0.1E~44) = false > (0.11754944E~37, 0.1E~44) = true == (0.11754944E~37, 0.1E~44) = false ?= (0.11754944E~37, 0.1E~44) = false < (0.11754944E~37, 0.0) = false > (0.11754944E~37, 0.0) = true == (0.11754944E~37, 0.0) = false ?= (0.11754944E~37, 0.0) = false < (0.11754944E~37, ~0.34028235E39) = false > (0.11754944E~37, ~0.34028235E39) = true == (0.11754944E~37, ~0.34028235E39) = false ?= (0.11754944E~37, ~0.34028235E39) = false < (0.11754944E~37, ~0.17014117E39) = false > (0.11754944E~37, ~0.17014117E39) = true == (0.11754944E~37, ~0.17014117E39) = false ?= (0.11754944E~37, ~0.17014117E39) = false < (0.11754944E~37, ~0.123E4) = false > (0.11754944E~37, ~0.123E4) = true == (0.11754944E~37, ~0.123E4) = false ?= (0.11754944E~37, ~0.123E4) = false < (0.11754944E~37, ~0.123E2) = false > (0.11754944E~37, ~0.123E2) = true == (0.11754944E~37, ~0.123E2) = false ?= (0.11754944E~37, ~0.123E2) = false < (0.11754944E~37, ~0.31415927E1) = false > (0.11754944E~37, ~0.31415927E1) = true == (0.11754944E~37, ~0.31415927E1) = false ?= (0.11754944E~37, ~0.31415927E1) = false < (0.11754944E~37, ~0.27182817E1) = false > (0.11754944E~37, ~0.27182817E1) = true == (0.11754944E~37, ~0.27182817E1) = false ?= (0.11754944E~37, ~0.27182817E1) = false < (0.11754944E~37, ~0.123E1) = false > (0.11754944E~37, ~0.123E1) = true == (0.11754944E~37, ~0.123E1) = false ?= (0.11754944E~37, ~0.123E1) = false < (0.11754944E~37, ~0.123) = false > (0.11754944E~37, ~0.123) = true == (0.11754944E~37, ~0.123) = false ?= (0.11754944E~37, ~0.123) = false < (0.11754944E~37, ~0.123E~2) = false > (0.11754944E~37, ~0.123E~2) = true == (0.11754944E~37, ~0.123E~2) = false ?= (0.11754944E~37, ~0.123E~2) = false < (0.11754944E~37, ~0.11754944E~37) = false > (0.11754944E~37, ~0.11754944E~37) = true == (0.11754944E~37, ~0.11754944E~37) = false ?= (0.11754944E~37, ~0.11754944E~37) = false < (0.11754944E~37, ~0.5877472E~38) = false > (0.11754944E~37, ~0.5877472E~38) = true == (0.11754944E~37, ~0.5877472E~38) = false ?= (0.11754944E~37, ~0.5877472E~38) = false < (0.11754944E~37, ~0.1E~44) = false > (0.11754944E~37, ~0.1E~44) = true == (0.11754944E~37, ~0.1E~44) = false ?= (0.11754944E~37, ~0.1E~44) = false < (0.11754944E~37, ~0.0) = false > (0.11754944E~37, ~0.0) = true == (0.11754944E~37, ~0.0) = false ?= (0.11754944E~37, ~0.0) = false < (0.5877472E~38, 0.34028235E39) = true > (0.5877472E~38, 0.34028235E39) = false == (0.5877472E~38, 0.34028235E39) = false ?= (0.5877472E~38, 0.34028235E39) = false < (0.5877472E~38, 0.17014117E39) = true > (0.5877472E~38, 0.17014117E39) = false == (0.5877472E~38, 0.17014117E39) = false ?= (0.5877472E~38, 0.17014117E39) = false < (0.5877472E~38, 0.123E4) = true > (0.5877472E~38, 0.123E4) = false == (0.5877472E~38, 0.123E4) = false ?= (0.5877472E~38, 0.123E4) = false < (0.5877472E~38, 0.123E2) = true > (0.5877472E~38, 0.123E2) = false == (0.5877472E~38, 0.123E2) = false ?= (0.5877472E~38, 0.123E2) = false < (0.5877472E~38, 0.31415927E1) = true > (0.5877472E~38, 0.31415927E1) = false == (0.5877472E~38, 0.31415927E1) = false ?= (0.5877472E~38, 0.31415927E1) = false < (0.5877472E~38, 0.27182817E1) = true > (0.5877472E~38, 0.27182817E1) = false == (0.5877472E~38, 0.27182817E1) = false ?= (0.5877472E~38, 0.27182817E1) = false < (0.5877472E~38, 0.123E1) = true > (0.5877472E~38, 0.123E1) = false == (0.5877472E~38, 0.123E1) = false ?= (0.5877472E~38, 0.123E1) = false < (0.5877472E~38, 0.123) = true > (0.5877472E~38, 0.123) = false == (0.5877472E~38, 0.123) = false ?= (0.5877472E~38, 0.123) = false < (0.5877472E~38, 0.123E~2) = true > (0.5877472E~38, 0.123E~2) = false == (0.5877472E~38, 0.123E~2) = false ?= (0.5877472E~38, 0.123E~2) = false < (0.5877472E~38, 0.11754944E~37) = true > (0.5877472E~38, 0.11754944E~37) = false == (0.5877472E~38, 0.11754944E~37) = false ?= (0.5877472E~38, 0.11754944E~37) = false < (0.5877472E~38, 0.5877472E~38) = false > (0.5877472E~38, 0.5877472E~38) = false == (0.5877472E~38, 0.5877472E~38) = true ?= (0.5877472E~38, 0.5877472E~38) = true < (0.5877472E~38, 0.1E~44) = false > (0.5877472E~38, 0.1E~44) = true == (0.5877472E~38, 0.1E~44) = false ?= (0.5877472E~38, 0.1E~44) = false < (0.5877472E~38, 0.0) = false > (0.5877472E~38, 0.0) = true == (0.5877472E~38, 0.0) = false ?= (0.5877472E~38, 0.0) = false < (0.5877472E~38, ~0.34028235E39) = false > (0.5877472E~38, ~0.34028235E39) = true == (0.5877472E~38, ~0.34028235E39) = false ?= (0.5877472E~38, ~0.34028235E39) = false < (0.5877472E~38, ~0.17014117E39) = false > (0.5877472E~38, ~0.17014117E39) = true == (0.5877472E~38, ~0.17014117E39) = false ?= (0.5877472E~38, ~0.17014117E39) = false < (0.5877472E~38, ~0.123E4) = false > (0.5877472E~38, ~0.123E4) = true == (0.5877472E~38, ~0.123E4) = false ?= (0.5877472E~38, ~0.123E4) = false < (0.5877472E~38, ~0.123E2) = false > (0.5877472E~38, ~0.123E2) = true == (0.5877472E~38, ~0.123E2) = false ?= (0.5877472E~38, ~0.123E2) = false < (0.5877472E~38, ~0.31415927E1) = false > (0.5877472E~38, ~0.31415927E1) = true == (0.5877472E~38, ~0.31415927E1) = false ?= (0.5877472E~38, ~0.31415927E1) = false < (0.5877472E~38, ~0.27182817E1) = false > (0.5877472E~38, ~0.27182817E1) = true == (0.5877472E~38, ~0.27182817E1) = false ?= (0.5877472E~38, ~0.27182817E1) = false < (0.5877472E~38, ~0.123E1) = false > (0.5877472E~38, ~0.123E1) = true == (0.5877472E~38, ~0.123E1) = false ?= (0.5877472E~38, ~0.123E1) = false < (0.5877472E~38, ~0.123) = false > (0.5877472E~38, ~0.123) = true == (0.5877472E~38, ~0.123) = false ?= (0.5877472E~38, ~0.123) = false < (0.5877472E~38, ~0.123E~2) = false > (0.5877472E~38, ~0.123E~2) = true == (0.5877472E~38, ~0.123E~2) = false ?= (0.5877472E~38, ~0.123E~2) = false < (0.5877472E~38, ~0.11754944E~37) = false > (0.5877472E~38, ~0.11754944E~37) = true == (0.5877472E~38, ~0.11754944E~37) = false ?= (0.5877472E~38, ~0.11754944E~37) = false < (0.5877472E~38, ~0.5877472E~38) = false > (0.5877472E~38, ~0.5877472E~38) = true == (0.5877472E~38, ~0.5877472E~38) = false ?= (0.5877472E~38, ~0.5877472E~38) = false < (0.5877472E~38, ~0.1E~44) = false > (0.5877472E~38, ~0.1E~44) = true == (0.5877472E~38, ~0.1E~44) = false ?= (0.5877472E~38, ~0.1E~44) = false < (0.5877472E~38, ~0.0) = false > (0.5877472E~38, ~0.0) = true == (0.5877472E~38, ~0.0) = false ?= (0.5877472E~38, ~0.0) = false < (0.1E~44, 0.34028235E39) = true > (0.1E~44, 0.34028235E39) = false == (0.1E~44, 0.34028235E39) = false ?= (0.1E~44, 0.34028235E39) = false < (0.1E~44, 0.17014117E39) = true > (0.1E~44, 0.17014117E39) = false == (0.1E~44, 0.17014117E39) = false ?= (0.1E~44, 0.17014117E39) = false < (0.1E~44, 0.123E4) = true > (0.1E~44, 0.123E4) = false == (0.1E~44, 0.123E4) = false ?= (0.1E~44, 0.123E4) = false < (0.1E~44, 0.123E2) = true > (0.1E~44, 0.123E2) = false == (0.1E~44, 0.123E2) = false ?= (0.1E~44, 0.123E2) = false < (0.1E~44, 0.31415927E1) = true > (0.1E~44, 0.31415927E1) = false == (0.1E~44, 0.31415927E1) = false ?= (0.1E~44, 0.31415927E1) = false < (0.1E~44, 0.27182817E1) = true > (0.1E~44, 0.27182817E1) = false == (0.1E~44, 0.27182817E1) = false ?= (0.1E~44, 0.27182817E1) = false < (0.1E~44, 0.123E1) = true > (0.1E~44, 0.123E1) = false == (0.1E~44, 0.123E1) = false ?= (0.1E~44, 0.123E1) = false < (0.1E~44, 0.123) = true > (0.1E~44, 0.123) = false == (0.1E~44, 0.123) = false ?= (0.1E~44, 0.123) = false < (0.1E~44, 0.123E~2) = true > (0.1E~44, 0.123E~2) = false == (0.1E~44, 0.123E~2) = false ?= (0.1E~44, 0.123E~2) = false < (0.1E~44, 0.11754944E~37) = true > (0.1E~44, 0.11754944E~37) = false == (0.1E~44, 0.11754944E~37) = false ?= (0.1E~44, 0.11754944E~37) = false < (0.1E~44, 0.5877472E~38) = true > (0.1E~44, 0.5877472E~38) = false == (0.1E~44, 0.5877472E~38) = false ?= (0.1E~44, 0.5877472E~38) = false < (0.1E~44, 0.1E~44) = false > (0.1E~44, 0.1E~44) = false == (0.1E~44, 0.1E~44) = true ?= (0.1E~44, 0.1E~44) = true < (0.1E~44, 0.0) = false > (0.1E~44, 0.0) = true == (0.1E~44, 0.0) = false ?= (0.1E~44, 0.0) = false < (0.1E~44, ~0.34028235E39) = false > (0.1E~44, ~0.34028235E39) = true == (0.1E~44, ~0.34028235E39) = false ?= (0.1E~44, ~0.34028235E39) = false < (0.1E~44, ~0.17014117E39) = false > (0.1E~44, ~0.17014117E39) = true == (0.1E~44, ~0.17014117E39) = false ?= (0.1E~44, ~0.17014117E39) = false < (0.1E~44, ~0.123E4) = false > (0.1E~44, ~0.123E4) = true == (0.1E~44, ~0.123E4) = false ?= (0.1E~44, ~0.123E4) = false < (0.1E~44, ~0.123E2) = false > (0.1E~44, ~0.123E2) = true == (0.1E~44, ~0.123E2) = false ?= (0.1E~44, ~0.123E2) = false < (0.1E~44, ~0.31415927E1) = false > (0.1E~44, ~0.31415927E1) = true == (0.1E~44, ~0.31415927E1) = false ?= (0.1E~44, ~0.31415927E1) = false < (0.1E~44, ~0.27182817E1) = false > (0.1E~44, ~0.27182817E1) = true == (0.1E~44, ~0.27182817E1) = false ?= (0.1E~44, ~0.27182817E1) = false < (0.1E~44, ~0.123E1) = false > (0.1E~44, ~0.123E1) = true == (0.1E~44, ~0.123E1) = false ?= (0.1E~44, ~0.123E1) = false < (0.1E~44, ~0.123) = false > (0.1E~44, ~0.123) = true == (0.1E~44, ~0.123) = false ?= (0.1E~44, ~0.123) = false < (0.1E~44, ~0.123E~2) = false > (0.1E~44, ~0.123E~2) = true == (0.1E~44, ~0.123E~2) = false ?= (0.1E~44, ~0.123E~2) = false < (0.1E~44, ~0.11754944E~37) = false > (0.1E~44, ~0.11754944E~37) = true == (0.1E~44, ~0.11754944E~37) = false ?= (0.1E~44, ~0.11754944E~37) = false < (0.1E~44, ~0.5877472E~38) = false > (0.1E~44, ~0.5877472E~38) = true == (0.1E~44, ~0.5877472E~38) = false ?= (0.1E~44, ~0.5877472E~38) = false < (0.1E~44, ~0.1E~44) = false > (0.1E~44, ~0.1E~44) = true == (0.1E~44, ~0.1E~44) = false ?= (0.1E~44, ~0.1E~44) = false < (0.1E~44, ~0.0) = false > (0.1E~44, ~0.0) = true == (0.1E~44, ~0.0) = false ?= (0.1E~44, ~0.0) = false < (0.0, 0.34028235E39) = true > (0.0, 0.34028235E39) = false == (0.0, 0.34028235E39) = false ?= (0.0, 0.34028235E39) = false < (0.0, 0.17014117E39) = true > (0.0, 0.17014117E39) = false == (0.0, 0.17014117E39) = false ?= (0.0, 0.17014117E39) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.31415927E1) = true > (0.0, 0.31415927E1) = false == (0.0, 0.31415927E1) = false ?= (0.0, 0.31415927E1) = false < (0.0, 0.27182817E1) = true > (0.0, 0.27182817E1) = false == (0.0, 0.27182817E1) = false ?= (0.0, 0.27182817E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.11754944E~37) = true > (0.0, 0.11754944E~37) = false == (0.0, 0.11754944E~37) = false ?= (0.0, 0.11754944E~37) = false < (0.0, 0.5877472E~38) = true > (0.0, 0.5877472E~38) = false == (0.0, 0.5877472E~38) = false ?= (0.0, 0.5877472E~38) = false < (0.0, 0.1E~44) = true > (0.0, 0.1E~44) = false == (0.0, 0.1E~44) = false ?= (0.0, 0.1E~44) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.34028235E39) = false > (0.0, ~0.34028235E39) = true == (0.0, ~0.34028235E39) = false ?= (0.0, ~0.34028235E39) = false < (0.0, ~0.17014117E39) = false > (0.0, ~0.17014117E39) = true == (0.0, ~0.17014117E39) = false ?= (0.0, ~0.17014117E39) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.31415927E1) = false > (0.0, ~0.31415927E1) = true == (0.0, ~0.31415927E1) = false ?= (0.0, ~0.31415927E1) = false < (0.0, ~0.27182817E1) = false > (0.0, ~0.27182817E1) = true == (0.0, ~0.27182817E1) = false ?= (0.0, ~0.27182817E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.11754944E~37) = false > (0.0, ~0.11754944E~37) = true == (0.0, ~0.11754944E~37) = false ?= (0.0, ~0.11754944E~37) = false < (0.0, ~0.5877472E~38) = false > (0.0, ~0.5877472E~38) = true == (0.0, ~0.5877472E~38) = false ?= (0.0, ~0.5877472E~38) = false < (0.0, ~0.1E~44) = false > (0.0, ~0.1E~44) = true == (0.0, ~0.1E~44) = false ?= (0.0, ~0.1E~44) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.34028235E39, 0.34028235E39) = true > (~0.34028235E39, 0.34028235E39) = false == (~0.34028235E39, 0.34028235E39) = false ?= (~0.34028235E39, 0.34028235E39) = false < (~0.34028235E39, 0.17014117E39) = true > (~0.34028235E39, 0.17014117E39) = false == (~0.34028235E39, 0.17014117E39) = false ?= (~0.34028235E39, 0.17014117E39) = false < (~0.34028235E39, 0.123E4) = true > (~0.34028235E39, 0.123E4) = false == (~0.34028235E39, 0.123E4) = false ?= (~0.34028235E39, 0.123E4) = false < (~0.34028235E39, 0.123E2) = true > (~0.34028235E39, 0.123E2) = false == (~0.34028235E39, 0.123E2) = false ?= (~0.34028235E39, 0.123E2) = false < (~0.34028235E39, 0.31415927E1) = true > (~0.34028235E39, 0.31415927E1) = false == (~0.34028235E39, 0.31415927E1) = false ?= (~0.34028235E39, 0.31415927E1) = false < (~0.34028235E39, 0.27182817E1) = true > (~0.34028235E39, 0.27182817E1) = false == (~0.34028235E39, 0.27182817E1) = false ?= (~0.34028235E39, 0.27182817E1) = false < (~0.34028235E39, 0.123E1) = true > (~0.34028235E39, 0.123E1) = false == (~0.34028235E39, 0.123E1) = false ?= (~0.34028235E39, 0.123E1) = false < (~0.34028235E39, 0.123) = true > (~0.34028235E39, 0.123) = false == (~0.34028235E39, 0.123) = false ?= (~0.34028235E39, 0.123) = false < (~0.34028235E39, 0.123E~2) = true > (~0.34028235E39, 0.123E~2) = false == (~0.34028235E39, 0.123E~2) = false ?= (~0.34028235E39, 0.123E~2) = false < (~0.34028235E39, 0.11754944E~37) = true > (~0.34028235E39, 0.11754944E~37) = false == (~0.34028235E39, 0.11754944E~37) = false ?= (~0.34028235E39, 0.11754944E~37) = false < (~0.34028235E39, 0.5877472E~38) = true > (~0.34028235E39, 0.5877472E~38) = false == (~0.34028235E39, 0.5877472E~38) = false ?= (~0.34028235E39, 0.5877472E~38) = false < (~0.34028235E39, 0.1E~44) = true > (~0.34028235E39, 0.1E~44) = false == (~0.34028235E39, 0.1E~44) = false ?= (~0.34028235E39, 0.1E~44) = false < (~0.34028235E39, 0.0) = true > (~0.34028235E39, 0.0) = false == (~0.34028235E39, 0.0) = false ?= (~0.34028235E39, 0.0) = false < (~0.34028235E39, ~0.34028235E39) = false > (~0.34028235E39, ~0.34028235E39) = false == (~0.34028235E39, ~0.34028235E39) = true ?= (~0.34028235E39, ~0.34028235E39) = true < (~0.34028235E39, ~0.17014117E39) = true > (~0.34028235E39, ~0.17014117E39) = false == (~0.34028235E39, ~0.17014117E39) = false ?= (~0.34028235E39, ~0.17014117E39) = false < (~0.34028235E39, ~0.123E4) = true > (~0.34028235E39, ~0.123E4) = false == (~0.34028235E39, ~0.123E4) = false ?= (~0.34028235E39, ~0.123E4) = false < (~0.34028235E39, ~0.123E2) = true > (~0.34028235E39, ~0.123E2) = false == (~0.34028235E39, ~0.123E2) = false ?= (~0.34028235E39, ~0.123E2) = false < (~0.34028235E39, ~0.31415927E1) = true > (~0.34028235E39, ~0.31415927E1) = false == (~0.34028235E39, ~0.31415927E1) = false ?= (~0.34028235E39, ~0.31415927E1) = false < (~0.34028235E39, ~0.27182817E1) = true > (~0.34028235E39, ~0.27182817E1) = false == (~0.34028235E39, ~0.27182817E1) = false ?= (~0.34028235E39, ~0.27182817E1) = false < (~0.34028235E39, ~0.123E1) = true > (~0.34028235E39, ~0.123E1) = false == (~0.34028235E39, ~0.123E1) = false ?= (~0.34028235E39, ~0.123E1) = false < (~0.34028235E39, ~0.123) = true > (~0.34028235E39, ~0.123) = false == (~0.34028235E39, ~0.123) = false ?= (~0.34028235E39, ~0.123) = false < (~0.34028235E39, ~0.123E~2) = true > (~0.34028235E39, ~0.123E~2) = false == (~0.34028235E39, ~0.123E~2) = false ?= (~0.34028235E39, ~0.123E~2) = false < (~0.34028235E39, ~0.11754944E~37) = true > (~0.34028235E39, ~0.11754944E~37) = false == (~0.34028235E39, ~0.11754944E~37) = false ?= (~0.34028235E39, ~0.11754944E~37) = false < (~0.34028235E39, ~0.5877472E~38) = true > (~0.34028235E39, ~0.5877472E~38) = false == (~0.34028235E39, ~0.5877472E~38) = false ?= (~0.34028235E39, ~0.5877472E~38) = false < (~0.34028235E39, ~0.1E~44) = true > (~0.34028235E39, ~0.1E~44) = false == (~0.34028235E39, ~0.1E~44) = false ?= (~0.34028235E39, ~0.1E~44) = false < (~0.34028235E39, ~0.0) = true > (~0.34028235E39, ~0.0) = false == (~0.34028235E39, ~0.0) = false ?= (~0.34028235E39, ~0.0) = false < (~0.17014117E39, 0.34028235E39) = true > (~0.17014117E39, 0.34028235E39) = false == (~0.17014117E39, 0.34028235E39) = false ?= (~0.17014117E39, 0.34028235E39) = false < (~0.17014117E39, 0.17014117E39) = true > (~0.17014117E39, 0.17014117E39) = false == (~0.17014117E39, 0.17014117E39) = false ?= (~0.17014117E39, 0.17014117E39) = false < (~0.17014117E39, 0.123E4) = true > (~0.17014117E39, 0.123E4) = false == (~0.17014117E39, 0.123E4) = false ?= (~0.17014117E39, 0.123E4) = false < (~0.17014117E39, 0.123E2) = true > (~0.17014117E39, 0.123E2) = false == (~0.17014117E39, 0.123E2) = false ?= (~0.17014117E39, 0.123E2) = false < (~0.17014117E39, 0.31415927E1) = true > (~0.17014117E39, 0.31415927E1) = false == (~0.17014117E39, 0.31415927E1) = false ?= (~0.17014117E39, 0.31415927E1) = false < (~0.17014117E39, 0.27182817E1) = true > (~0.17014117E39, 0.27182817E1) = false == (~0.17014117E39, 0.27182817E1) = false ?= (~0.17014117E39, 0.27182817E1) = false < (~0.17014117E39, 0.123E1) = true > (~0.17014117E39, 0.123E1) = false == (~0.17014117E39, 0.123E1) = false ?= (~0.17014117E39, 0.123E1) = false < (~0.17014117E39, 0.123) = true > (~0.17014117E39, 0.123) = false == (~0.17014117E39, 0.123) = false ?= (~0.17014117E39, 0.123) = false < (~0.17014117E39, 0.123E~2) = true > (~0.17014117E39, 0.123E~2) = false == (~0.17014117E39, 0.123E~2) = false ?= (~0.17014117E39, 0.123E~2) = false < (~0.17014117E39, 0.11754944E~37) = true > (~0.17014117E39, 0.11754944E~37) = false == (~0.17014117E39, 0.11754944E~37) = false ?= (~0.17014117E39, 0.11754944E~37) = false < (~0.17014117E39, 0.5877472E~38) = true > (~0.17014117E39, 0.5877472E~38) = false == (~0.17014117E39, 0.5877472E~38) = false ?= (~0.17014117E39, 0.5877472E~38) = false < (~0.17014117E39, 0.1E~44) = true > (~0.17014117E39, 0.1E~44) = false == (~0.17014117E39, 0.1E~44) = false ?= (~0.17014117E39, 0.1E~44) = false < (~0.17014117E39, 0.0) = true > (~0.17014117E39, 0.0) = false == (~0.17014117E39, 0.0) = false ?= (~0.17014117E39, 0.0) = false < (~0.17014117E39, ~0.34028235E39) = false > (~0.17014117E39, ~0.34028235E39) = true == (~0.17014117E39, ~0.34028235E39) = false ?= (~0.17014117E39, ~0.34028235E39) = false < (~0.17014117E39, ~0.17014117E39) = false > (~0.17014117E39, ~0.17014117E39) = false == (~0.17014117E39, ~0.17014117E39) = true ?= (~0.17014117E39, ~0.17014117E39) = true < (~0.17014117E39, ~0.123E4) = true > (~0.17014117E39, ~0.123E4) = false == (~0.17014117E39, ~0.123E4) = false ?= (~0.17014117E39, ~0.123E4) = false < (~0.17014117E39, ~0.123E2) = true > (~0.17014117E39, ~0.123E2) = false == (~0.17014117E39, ~0.123E2) = false ?= (~0.17014117E39, ~0.123E2) = false < (~0.17014117E39, ~0.31415927E1) = true > (~0.17014117E39, ~0.31415927E1) = false == (~0.17014117E39, ~0.31415927E1) = false ?= (~0.17014117E39, ~0.31415927E1) = false < (~0.17014117E39, ~0.27182817E1) = true > (~0.17014117E39, ~0.27182817E1) = false == (~0.17014117E39, ~0.27182817E1) = false ?= (~0.17014117E39, ~0.27182817E1) = false < (~0.17014117E39, ~0.123E1) = true > (~0.17014117E39, ~0.123E1) = false == (~0.17014117E39, ~0.123E1) = false ?= (~0.17014117E39, ~0.123E1) = false < (~0.17014117E39, ~0.123) = true > (~0.17014117E39, ~0.123) = false == (~0.17014117E39, ~0.123) = false ?= (~0.17014117E39, ~0.123) = false < (~0.17014117E39, ~0.123E~2) = true > (~0.17014117E39, ~0.123E~2) = false == (~0.17014117E39, ~0.123E~2) = false ?= (~0.17014117E39, ~0.123E~2) = false < (~0.17014117E39, ~0.11754944E~37) = true > (~0.17014117E39, ~0.11754944E~37) = false == (~0.17014117E39, ~0.11754944E~37) = false ?= (~0.17014117E39, ~0.11754944E~37) = false < (~0.17014117E39, ~0.5877472E~38) = true > (~0.17014117E39, ~0.5877472E~38) = false == (~0.17014117E39, ~0.5877472E~38) = false ?= (~0.17014117E39, ~0.5877472E~38) = false < (~0.17014117E39, ~0.1E~44) = true > (~0.17014117E39, ~0.1E~44) = false == (~0.17014117E39, ~0.1E~44) = false ?= (~0.17014117E39, ~0.1E~44) = false < (~0.17014117E39, ~0.0) = true > (~0.17014117E39, ~0.0) = false == (~0.17014117E39, ~0.0) = false ?= (~0.17014117E39, ~0.0) = false < (~0.123E4, 0.34028235E39) = true > (~0.123E4, 0.34028235E39) = false == (~0.123E4, 0.34028235E39) = false ?= (~0.123E4, 0.34028235E39) = false < (~0.123E4, 0.17014117E39) = true > (~0.123E4, 0.17014117E39) = false == (~0.123E4, 0.17014117E39) = false ?= (~0.123E4, 0.17014117E39) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.31415927E1) = true > (~0.123E4, 0.31415927E1) = false == (~0.123E4, 0.31415927E1) = false ?= (~0.123E4, 0.31415927E1) = false < (~0.123E4, 0.27182817E1) = true > (~0.123E4, 0.27182817E1) = false == (~0.123E4, 0.27182817E1) = false ?= (~0.123E4, 0.27182817E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.11754944E~37) = true > (~0.123E4, 0.11754944E~37) = false == (~0.123E4, 0.11754944E~37) = false ?= (~0.123E4, 0.11754944E~37) = false < (~0.123E4, 0.5877472E~38) = true > (~0.123E4, 0.5877472E~38) = false == (~0.123E4, 0.5877472E~38) = false ?= (~0.123E4, 0.5877472E~38) = false < (~0.123E4, 0.1E~44) = true > (~0.123E4, 0.1E~44) = false == (~0.123E4, 0.1E~44) = false ?= (~0.123E4, 0.1E~44) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.34028235E39) = false > (~0.123E4, ~0.34028235E39) = true == (~0.123E4, ~0.34028235E39) = false ?= (~0.123E4, ~0.34028235E39) = false < (~0.123E4, ~0.17014117E39) = false > (~0.123E4, ~0.17014117E39) = true == (~0.123E4, ~0.17014117E39) = false ?= (~0.123E4, ~0.17014117E39) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.31415927E1) = true > (~0.123E4, ~0.31415927E1) = false == (~0.123E4, ~0.31415927E1) = false ?= (~0.123E4, ~0.31415927E1) = false < (~0.123E4, ~0.27182817E1) = true > (~0.123E4, ~0.27182817E1) = false == (~0.123E4, ~0.27182817E1) = false ?= (~0.123E4, ~0.27182817E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.11754944E~37) = true > (~0.123E4, ~0.11754944E~37) = false == (~0.123E4, ~0.11754944E~37) = false ?= (~0.123E4, ~0.11754944E~37) = false < (~0.123E4, ~0.5877472E~38) = true > (~0.123E4, ~0.5877472E~38) = false == (~0.123E4, ~0.5877472E~38) = false ?= (~0.123E4, ~0.5877472E~38) = false < (~0.123E4, ~0.1E~44) = true > (~0.123E4, ~0.1E~44) = false == (~0.123E4, ~0.1E~44) = false ?= (~0.123E4, ~0.1E~44) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.34028235E39) = true > (~0.123E2, 0.34028235E39) = false == (~0.123E2, 0.34028235E39) = false ?= (~0.123E2, 0.34028235E39) = false < (~0.123E2, 0.17014117E39) = true > (~0.123E2, 0.17014117E39) = false == (~0.123E2, 0.17014117E39) = false ?= (~0.123E2, 0.17014117E39) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.31415927E1) = true > (~0.123E2, 0.31415927E1) = false == (~0.123E2, 0.31415927E1) = false ?= (~0.123E2, 0.31415927E1) = false < (~0.123E2, 0.27182817E1) = true > (~0.123E2, 0.27182817E1) = false == (~0.123E2, 0.27182817E1) = false ?= (~0.123E2, 0.27182817E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.11754944E~37) = true > (~0.123E2, 0.11754944E~37) = false == (~0.123E2, 0.11754944E~37) = false ?= (~0.123E2, 0.11754944E~37) = false < (~0.123E2, 0.5877472E~38) = true > (~0.123E2, 0.5877472E~38) = false == (~0.123E2, 0.5877472E~38) = false ?= (~0.123E2, 0.5877472E~38) = false < (~0.123E2, 0.1E~44) = true > (~0.123E2, 0.1E~44) = false == (~0.123E2, 0.1E~44) = false ?= (~0.123E2, 0.1E~44) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.34028235E39) = false > (~0.123E2, ~0.34028235E39) = true == (~0.123E2, ~0.34028235E39) = false ?= (~0.123E2, ~0.34028235E39) = false < (~0.123E2, ~0.17014117E39) = false > (~0.123E2, ~0.17014117E39) = true == (~0.123E2, ~0.17014117E39) = false ?= (~0.123E2, ~0.17014117E39) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.31415927E1) = true > (~0.123E2, ~0.31415927E1) = false == (~0.123E2, ~0.31415927E1) = false ?= (~0.123E2, ~0.31415927E1) = false < (~0.123E2, ~0.27182817E1) = true > (~0.123E2, ~0.27182817E1) = false == (~0.123E2, ~0.27182817E1) = false ?= (~0.123E2, ~0.27182817E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.11754944E~37) = true > (~0.123E2, ~0.11754944E~37) = false == (~0.123E2, ~0.11754944E~37) = false ?= (~0.123E2, ~0.11754944E~37) = false < (~0.123E2, ~0.5877472E~38) = true > (~0.123E2, ~0.5877472E~38) = false == (~0.123E2, ~0.5877472E~38) = false ?= (~0.123E2, ~0.5877472E~38) = false < (~0.123E2, ~0.1E~44) = true > (~0.123E2, ~0.1E~44) = false == (~0.123E2, ~0.1E~44) = false ?= (~0.123E2, ~0.1E~44) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.31415927E1, 0.34028235E39) = true > (~0.31415927E1, 0.34028235E39) = false == (~0.31415927E1, 0.34028235E39) = false ?= (~0.31415927E1, 0.34028235E39) = false < (~0.31415927E1, 0.17014117E39) = true > (~0.31415927E1, 0.17014117E39) = false == (~0.31415927E1, 0.17014117E39) = false ?= (~0.31415927E1, 0.17014117E39) = false < (~0.31415927E1, 0.123E4) = true > (~0.31415927E1, 0.123E4) = false == (~0.31415927E1, 0.123E4) = false ?= (~0.31415927E1, 0.123E4) = false < (~0.31415927E1, 0.123E2) = true > (~0.31415927E1, 0.123E2) = false == (~0.31415927E1, 0.123E2) = false ?= (~0.31415927E1, 0.123E2) = false < (~0.31415927E1, 0.31415927E1) = true > (~0.31415927E1, 0.31415927E1) = false == (~0.31415927E1, 0.31415927E1) = false ?= (~0.31415927E1, 0.31415927E1) = false < (~0.31415927E1, 0.27182817E1) = true > (~0.31415927E1, 0.27182817E1) = false == (~0.31415927E1, 0.27182817E1) = false ?= (~0.31415927E1, 0.27182817E1) = false < (~0.31415927E1, 0.123E1) = true > (~0.31415927E1, 0.123E1) = false == (~0.31415927E1, 0.123E1) = false ?= (~0.31415927E1, 0.123E1) = false < (~0.31415927E1, 0.123) = true > (~0.31415927E1, 0.123) = false == (~0.31415927E1, 0.123) = false ?= (~0.31415927E1, 0.123) = false < (~0.31415927E1, 0.123E~2) = true > (~0.31415927E1, 0.123E~2) = false == (~0.31415927E1, 0.123E~2) = false ?= (~0.31415927E1, 0.123E~2) = false < (~0.31415927E1, 0.11754944E~37) = true > (~0.31415927E1, 0.11754944E~37) = false == (~0.31415927E1, 0.11754944E~37) = false ?= (~0.31415927E1, 0.11754944E~37) = false < (~0.31415927E1, 0.5877472E~38) = true > (~0.31415927E1, 0.5877472E~38) = false == (~0.31415927E1, 0.5877472E~38) = false ?= (~0.31415927E1, 0.5877472E~38) = false < (~0.31415927E1, 0.1E~44) = true > (~0.31415927E1, 0.1E~44) = false == (~0.31415927E1, 0.1E~44) = false ?= (~0.31415927E1, 0.1E~44) = false < (~0.31415927E1, 0.0) = true > (~0.31415927E1, 0.0) = false == (~0.31415927E1, 0.0) = false ?= (~0.31415927E1, 0.0) = false < (~0.31415927E1, ~0.34028235E39) = false > (~0.31415927E1, ~0.34028235E39) = true == (~0.31415927E1, ~0.34028235E39) = false ?= (~0.31415927E1, ~0.34028235E39) = false < (~0.31415927E1, ~0.17014117E39) = false > (~0.31415927E1, ~0.17014117E39) = true == (~0.31415927E1, ~0.17014117E39) = false ?= (~0.31415927E1, ~0.17014117E39) = false < (~0.31415927E1, ~0.123E4) = false > (~0.31415927E1, ~0.123E4) = true == (~0.31415927E1, ~0.123E4) = false ?= (~0.31415927E1, ~0.123E4) = false < (~0.31415927E1, ~0.123E2) = false > (~0.31415927E1, ~0.123E2) = true == (~0.31415927E1, ~0.123E2) = false ?= (~0.31415927E1, ~0.123E2) = false < (~0.31415927E1, ~0.31415927E1) = false > (~0.31415927E1, ~0.31415927E1) = false == (~0.31415927E1, ~0.31415927E1) = true ?= (~0.31415927E1, ~0.31415927E1) = true < (~0.31415927E1, ~0.27182817E1) = true > (~0.31415927E1, ~0.27182817E1) = false == (~0.31415927E1, ~0.27182817E1) = false ?= (~0.31415927E1, ~0.27182817E1) = false < (~0.31415927E1, ~0.123E1) = true > (~0.31415927E1, ~0.123E1) = false == (~0.31415927E1, ~0.123E1) = false ?= (~0.31415927E1, ~0.123E1) = false < (~0.31415927E1, ~0.123) = true > (~0.31415927E1, ~0.123) = false == (~0.31415927E1, ~0.123) = false ?= (~0.31415927E1, ~0.123) = false < (~0.31415927E1, ~0.123E~2) = true > (~0.31415927E1, ~0.123E~2) = false == (~0.31415927E1, ~0.123E~2) = false ?= (~0.31415927E1, ~0.123E~2) = false < (~0.31415927E1, ~0.11754944E~37) = true > (~0.31415927E1, ~0.11754944E~37) = false == (~0.31415927E1, ~0.11754944E~37) = false ?= (~0.31415927E1, ~0.11754944E~37) = false < (~0.31415927E1, ~0.5877472E~38) = true > (~0.31415927E1, ~0.5877472E~38) = false == (~0.31415927E1, ~0.5877472E~38) = false ?= (~0.31415927E1, ~0.5877472E~38) = false < (~0.31415927E1, ~0.1E~44) = true > (~0.31415927E1, ~0.1E~44) = false == (~0.31415927E1, ~0.1E~44) = false ?= (~0.31415927E1, ~0.1E~44) = false < (~0.31415927E1, ~0.0) = true > (~0.31415927E1, ~0.0) = false == (~0.31415927E1, ~0.0) = false ?= (~0.31415927E1, ~0.0) = false < (~0.27182817E1, 0.34028235E39) = true > (~0.27182817E1, 0.34028235E39) = false == (~0.27182817E1, 0.34028235E39) = false ?= (~0.27182817E1, 0.34028235E39) = false < (~0.27182817E1, 0.17014117E39) = true > (~0.27182817E1, 0.17014117E39) = false == (~0.27182817E1, 0.17014117E39) = false ?= (~0.27182817E1, 0.17014117E39) = false < (~0.27182817E1, 0.123E4) = true > (~0.27182817E1, 0.123E4) = false == (~0.27182817E1, 0.123E4) = false ?= (~0.27182817E1, 0.123E4) = false < (~0.27182817E1, 0.123E2) = true > (~0.27182817E1, 0.123E2) = false == (~0.27182817E1, 0.123E2) = false ?= (~0.27182817E1, 0.123E2) = false < (~0.27182817E1, 0.31415927E1) = true > (~0.27182817E1, 0.31415927E1) = false == (~0.27182817E1, 0.31415927E1) = false ?= (~0.27182817E1, 0.31415927E1) = false < (~0.27182817E1, 0.27182817E1) = true > (~0.27182817E1, 0.27182817E1) = false == (~0.27182817E1, 0.27182817E1) = false ?= (~0.27182817E1, 0.27182817E1) = false < (~0.27182817E1, 0.123E1) = true > (~0.27182817E1, 0.123E1) = false == (~0.27182817E1, 0.123E1) = false ?= (~0.27182817E1, 0.123E1) = false < (~0.27182817E1, 0.123) = true > (~0.27182817E1, 0.123) = false == (~0.27182817E1, 0.123) = false ?= (~0.27182817E1, 0.123) = false < (~0.27182817E1, 0.123E~2) = true > (~0.27182817E1, 0.123E~2) = false == (~0.27182817E1, 0.123E~2) = false ?= (~0.27182817E1, 0.123E~2) = false < (~0.27182817E1, 0.11754944E~37) = true > (~0.27182817E1, 0.11754944E~37) = false == (~0.27182817E1, 0.11754944E~37) = false ?= (~0.27182817E1, 0.11754944E~37) = false < (~0.27182817E1, 0.5877472E~38) = true > (~0.27182817E1, 0.5877472E~38) = false == (~0.27182817E1, 0.5877472E~38) = false ?= (~0.27182817E1, 0.5877472E~38) = false < (~0.27182817E1, 0.1E~44) = true > (~0.27182817E1, 0.1E~44) = false == (~0.27182817E1, 0.1E~44) = false ?= (~0.27182817E1, 0.1E~44) = false < (~0.27182817E1, 0.0) = true > (~0.27182817E1, 0.0) = false == (~0.27182817E1, 0.0) = false ?= (~0.27182817E1, 0.0) = false < (~0.27182817E1, ~0.34028235E39) = false > (~0.27182817E1, ~0.34028235E39) = true == (~0.27182817E1, ~0.34028235E39) = false ?= (~0.27182817E1, ~0.34028235E39) = false < (~0.27182817E1, ~0.17014117E39) = false > (~0.27182817E1, ~0.17014117E39) = true == (~0.27182817E1, ~0.17014117E39) = false ?= (~0.27182817E1, ~0.17014117E39) = false < (~0.27182817E1, ~0.123E4) = false > (~0.27182817E1, ~0.123E4) = true == (~0.27182817E1, ~0.123E4) = false ?= (~0.27182817E1, ~0.123E4) = false < (~0.27182817E1, ~0.123E2) = false > (~0.27182817E1, ~0.123E2) = true == (~0.27182817E1, ~0.123E2) = false ?= (~0.27182817E1, ~0.123E2) = false < (~0.27182817E1, ~0.31415927E1) = false > (~0.27182817E1, ~0.31415927E1) = true == (~0.27182817E1, ~0.31415927E1) = false ?= (~0.27182817E1, ~0.31415927E1) = false < (~0.27182817E1, ~0.27182817E1) = false > (~0.27182817E1, ~0.27182817E1) = false == (~0.27182817E1, ~0.27182817E1) = true ?= (~0.27182817E1, ~0.27182817E1) = true < (~0.27182817E1, ~0.123E1) = true > (~0.27182817E1, ~0.123E1) = false == (~0.27182817E1, ~0.123E1) = false ?= (~0.27182817E1, ~0.123E1) = false < (~0.27182817E1, ~0.123) = true > (~0.27182817E1, ~0.123) = false == (~0.27182817E1, ~0.123) = false ?= (~0.27182817E1, ~0.123) = false < (~0.27182817E1, ~0.123E~2) = true > (~0.27182817E1, ~0.123E~2) = false == (~0.27182817E1, ~0.123E~2) = false ?= (~0.27182817E1, ~0.123E~2) = false < (~0.27182817E1, ~0.11754944E~37) = true > (~0.27182817E1, ~0.11754944E~37) = false == (~0.27182817E1, ~0.11754944E~37) = false ?= (~0.27182817E1, ~0.11754944E~37) = false < (~0.27182817E1, ~0.5877472E~38) = true > (~0.27182817E1, ~0.5877472E~38) = false == (~0.27182817E1, ~0.5877472E~38) = false ?= (~0.27182817E1, ~0.5877472E~38) = false < (~0.27182817E1, ~0.1E~44) = true > (~0.27182817E1, ~0.1E~44) = false == (~0.27182817E1, ~0.1E~44) = false ?= (~0.27182817E1, ~0.1E~44) = false < (~0.27182817E1, ~0.0) = true > (~0.27182817E1, ~0.0) = false == (~0.27182817E1, ~0.0) = false ?= (~0.27182817E1, ~0.0) = false < (~0.123E1, 0.34028235E39) = true > (~0.123E1, 0.34028235E39) = false == (~0.123E1, 0.34028235E39) = false ?= (~0.123E1, 0.34028235E39) = false < (~0.123E1, 0.17014117E39) = true > (~0.123E1, 0.17014117E39) = false == (~0.123E1, 0.17014117E39) = false ?= (~0.123E1, 0.17014117E39) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.31415927E1) = true > (~0.123E1, 0.31415927E1) = false == (~0.123E1, 0.31415927E1) = false ?= (~0.123E1, 0.31415927E1) = false < (~0.123E1, 0.27182817E1) = true > (~0.123E1, 0.27182817E1) = false == (~0.123E1, 0.27182817E1) = false ?= (~0.123E1, 0.27182817E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.11754944E~37) = true > (~0.123E1, 0.11754944E~37) = false == (~0.123E1, 0.11754944E~37) = false ?= (~0.123E1, 0.11754944E~37) = false < (~0.123E1, 0.5877472E~38) = true > (~0.123E1, 0.5877472E~38) = false == (~0.123E1, 0.5877472E~38) = false ?= (~0.123E1, 0.5877472E~38) = false < (~0.123E1, 0.1E~44) = true > (~0.123E1, 0.1E~44) = false == (~0.123E1, 0.1E~44) = false ?= (~0.123E1, 0.1E~44) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.34028235E39) = false > (~0.123E1, ~0.34028235E39) = true == (~0.123E1, ~0.34028235E39) = false ?= (~0.123E1, ~0.34028235E39) = false < (~0.123E1, ~0.17014117E39) = false > (~0.123E1, ~0.17014117E39) = true == (~0.123E1, ~0.17014117E39) = false ?= (~0.123E1, ~0.17014117E39) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.31415927E1) = false > (~0.123E1, ~0.31415927E1) = true == (~0.123E1, ~0.31415927E1) = false ?= (~0.123E1, ~0.31415927E1) = false < (~0.123E1, ~0.27182817E1) = false > (~0.123E1, ~0.27182817E1) = true == (~0.123E1, ~0.27182817E1) = false ?= (~0.123E1, ~0.27182817E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.11754944E~37) = true > (~0.123E1, ~0.11754944E~37) = false == (~0.123E1, ~0.11754944E~37) = false ?= (~0.123E1, ~0.11754944E~37) = false < (~0.123E1, ~0.5877472E~38) = true > (~0.123E1, ~0.5877472E~38) = false == (~0.123E1, ~0.5877472E~38) = false ?= (~0.123E1, ~0.5877472E~38) = false < (~0.123E1, ~0.1E~44) = true > (~0.123E1, ~0.1E~44) = false == (~0.123E1, ~0.1E~44) = false ?= (~0.123E1, ~0.1E~44) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.34028235E39) = true > (~0.123, 0.34028235E39) = false == (~0.123, 0.34028235E39) = false ?= (~0.123, 0.34028235E39) = false < (~0.123, 0.17014117E39) = true > (~0.123, 0.17014117E39) = false == (~0.123, 0.17014117E39) = false ?= (~0.123, 0.17014117E39) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.31415927E1) = true > (~0.123, 0.31415927E1) = false == (~0.123, 0.31415927E1) = false ?= (~0.123, 0.31415927E1) = false < (~0.123, 0.27182817E1) = true > (~0.123, 0.27182817E1) = false == (~0.123, 0.27182817E1) = false ?= (~0.123, 0.27182817E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.11754944E~37) = true > (~0.123, 0.11754944E~37) = false == (~0.123, 0.11754944E~37) = false ?= (~0.123, 0.11754944E~37) = false < (~0.123, 0.5877472E~38) = true > (~0.123, 0.5877472E~38) = false == (~0.123, 0.5877472E~38) = false ?= (~0.123, 0.5877472E~38) = false < (~0.123, 0.1E~44) = true > (~0.123, 0.1E~44) = false == (~0.123, 0.1E~44) = false ?= (~0.123, 0.1E~44) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.34028235E39) = false > (~0.123, ~0.34028235E39) = true == (~0.123, ~0.34028235E39) = false ?= (~0.123, ~0.34028235E39) = false < (~0.123, ~0.17014117E39) = false > (~0.123, ~0.17014117E39) = true == (~0.123, ~0.17014117E39) = false ?= (~0.123, ~0.17014117E39) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.31415927E1) = false > (~0.123, ~0.31415927E1) = true == (~0.123, ~0.31415927E1) = false ?= (~0.123, ~0.31415927E1) = false < (~0.123, ~0.27182817E1) = false > (~0.123, ~0.27182817E1) = true == (~0.123, ~0.27182817E1) = false ?= (~0.123, ~0.27182817E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.11754944E~37) = true > (~0.123, ~0.11754944E~37) = false == (~0.123, ~0.11754944E~37) = false ?= (~0.123, ~0.11754944E~37) = false < (~0.123, ~0.5877472E~38) = true > (~0.123, ~0.5877472E~38) = false == (~0.123, ~0.5877472E~38) = false ?= (~0.123, ~0.5877472E~38) = false < (~0.123, ~0.1E~44) = true > (~0.123, ~0.1E~44) = false == (~0.123, ~0.1E~44) = false ?= (~0.123, ~0.1E~44) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.34028235E39) = true > (~0.123E~2, 0.34028235E39) = false == (~0.123E~2, 0.34028235E39) = false ?= (~0.123E~2, 0.34028235E39) = false < (~0.123E~2, 0.17014117E39) = true > (~0.123E~2, 0.17014117E39) = false == (~0.123E~2, 0.17014117E39) = false ?= (~0.123E~2, 0.17014117E39) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.31415927E1) = true > (~0.123E~2, 0.31415927E1) = false == (~0.123E~2, 0.31415927E1) = false ?= (~0.123E~2, 0.31415927E1) = false < (~0.123E~2, 0.27182817E1) = true > (~0.123E~2, 0.27182817E1) = false == (~0.123E~2, 0.27182817E1) = false ?= (~0.123E~2, 0.27182817E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.11754944E~37) = true > (~0.123E~2, 0.11754944E~37) = false == (~0.123E~2, 0.11754944E~37) = false ?= (~0.123E~2, 0.11754944E~37) = false < (~0.123E~2, 0.5877472E~38) = true > (~0.123E~2, 0.5877472E~38) = false == (~0.123E~2, 0.5877472E~38) = false ?= (~0.123E~2, 0.5877472E~38) = false < (~0.123E~2, 0.1E~44) = true > (~0.123E~2, 0.1E~44) = false == (~0.123E~2, 0.1E~44) = false ?= (~0.123E~2, 0.1E~44) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.34028235E39) = false > (~0.123E~2, ~0.34028235E39) = true == (~0.123E~2, ~0.34028235E39) = false ?= (~0.123E~2, ~0.34028235E39) = false < (~0.123E~2, ~0.17014117E39) = false > (~0.123E~2, ~0.17014117E39) = true == (~0.123E~2, ~0.17014117E39) = false ?= (~0.123E~2, ~0.17014117E39) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.31415927E1) = false > (~0.123E~2, ~0.31415927E1) = true == (~0.123E~2, ~0.31415927E1) = false ?= (~0.123E~2, ~0.31415927E1) = false < (~0.123E~2, ~0.27182817E1) = false > (~0.123E~2, ~0.27182817E1) = true == (~0.123E~2, ~0.27182817E1) = false ?= (~0.123E~2, ~0.27182817E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.11754944E~37) = true > (~0.123E~2, ~0.11754944E~37) = false == (~0.123E~2, ~0.11754944E~37) = false ?= (~0.123E~2, ~0.11754944E~37) = false < (~0.123E~2, ~0.5877472E~38) = true > (~0.123E~2, ~0.5877472E~38) = false == (~0.123E~2, ~0.5877472E~38) = false ?= (~0.123E~2, ~0.5877472E~38) = false < (~0.123E~2, ~0.1E~44) = true > (~0.123E~2, ~0.1E~44) = false == (~0.123E~2, ~0.1E~44) = false ?= (~0.123E~2, ~0.1E~44) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.11754944E~37, 0.34028235E39) = true > (~0.11754944E~37, 0.34028235E39) = false == (~0.11754944E~37, 0.34028235E39) = false ?= (~0.11754944E~37, 0.34028235E39) = false < (~0.11754944E~37, 0.17014117E39) = true > (~0.11754944E~37, 0.17014117E39) = false == (~0.11754944E~37, 0.17014117E39) = false ?= (~0.11754944E~37, 0.17014117E39) = false < (~0.11754944E~37, 0.123E4) = true > (~0.11754944E~37, 0.123E4) = false == (~0.11754944E~37, 0.123E4) = false ?= (~0.11754944E~37, 0.123E4) = false < (~0.11754944E~37, 0.123E2) = true > (~0.11754944E~37, 0.123E2) = false == (~0.11754944E~37, 0.123E2) = false ?= (~0.11754944E~37, 0.123E2) = false < (~0.11754944E~37, 0.31415927E1) = true > (~0.11754944E~37, 0.31415927E1) = false == (~0.11754944E~37, 0.31415927E1) = false ?= (~0.11754944E~37, 0.31415927E1) = false < (~0.11754944E~37, 0.27182817E1) = true > (~0.11754944E~37, 0.27182817E1) = false == (~0.11754944E~37, 0.27182817E1) = false ?= (~0.11754944E~37, 0.27182817E1) = false < (~0.11754944E~37, 0.123E1) = true > (~0.11754944E~37, 0.123E1) = false == (~0.11754944E~37, 0.123E1) = false ?= (~0.11754944E~37, 0.123E1) = false < (~0.11754944E~37, 0.123) = true > (~0.11754944E~37, 0.123) = false == (~0.11754944E~37, 0.123) = false ?= (~0.11754944E~37, 0.123) = false < (~0.11754944E~37, 0.123E~2) = true > (~0.11754944E~37, 0.123E~2) = false == (~0.11754944E~37, 0.123E~2) = false ?= (~0.11754944E~37, 0.123E~2) = false < (~0.11754944E~37, 0.11754944E~37) = true > (~0.11754944E~37, 0.11754944E~37) = false == (~0.11754944E~37, 0.11754944E~37) = false ?= (~0.11754944E~37, 0.11754944E~37) = false < (~0.11754944E~37, 0.5877472E~38) = true > (~0.11754944E~37, 0.5877472E~38) = false == (~0.11754944E~37, 0.5877472E~38) = false ?= (~0.11754944E~37, 0.5877472E~38) = false < (~0.11754944E~37, 0.1E~44) = true > (~0.11754944E~37, 0.1E~44) = false == (~0.11754944E~37, 0.1E~44) = false ?= (~0.11754944E~37, 0.1E~44) = false < (~0.11754944E~37, 0.0) = true > (~0.11754944E~37, 0.0) = false == (~0.11754944E~37, 0.0) = false ?= (~0.11754944E~37, 0.0) = false < (~0.11754944E~37, ~0.34028235E39) = false > (~0.11754944E~37, ~0.34028235E39) = true == (~0.11754944E~37, ~0.34028235E39) = false ?= (~0.11754944E~37, ~0.34028235E39) = false < (~0.11754944E~37, ~0.17014117E39) = false > (~0.11754944E~37, ~0.17014117E39) = true == (~0.11754944E~37, ~0.17014117E39) = false ?= (~0.11754944E~37, ~0.17014117E39) = false < (~0.11754944E~37, ~0.123E4) = false > (~0.11754944E~37, ~0.123E4) = true == (~0.11754944E~37, ~0.123E4) = false ?= (~0.11754944E~37, ~0.123E4) = false < (~0.11754944E~37, ~0.123E2) = false > (~0.11754944E~37, ~0.123E2) = true == (~0.11754944E~37, ~0.123E2) = false ?= (~0.11754944E~37, ~0.123E2) = false < (~0.11754944E~37, ~0.31415927E1) = false > (~0.11754944E~37, ~0.31415927E1) = true == (~0.11754944E~37, ~0.31415927E1) = false ?= (~0.11754944E~37, ~0.31415927E1) = false < (~0.11754944E~37, ~0.27182817E1) = false > (~0.11754944E~37, ~0.27182817E1) = true == (~0.11754944E~37, ~0.27182817E1) = false ?= (~0.11754944E~37, ~0.27182817E1) = false < (~0.11754944E~37, ~0.123E1) = false > (~0.11754944E~37, ~0.123E1) = true == (~0.11754944E~37, ~0.123E1) = false ?= (~0.11754944E~37, ~0.123E1) = false < (~0.11754944E~37, ~0.123) = false > (~0.11754944E~37, ~0.123) = true == (~0.11754944E~37, ~0.123) = false ?= (~0.11754944E~37, ~0.123) = false < (~0.11754944E~37, ~0.123E~2) = false > (~0.11754944E~37, ~0.123E~2) = true == (~0.11754944E~37, ~0.123E~2) = false ?= (~0.11754944E~37, ~0.123E~2) = false < (~0.11754944E~37, ~0.11754944E~37) = false > (~0.11754944E~37, ~0.11754944E~37) = false == (~0.11754944E~37, ~0.11754944E~37) = true ?= (~0.11754944E~37, ~0.11754944E~37) = true < (~0.11754944E~37, ~0.5877472E~38) = true > (~0.11754944E~37, ~0.5877472E~38) = false == (~0.11754944E~37, ~0.5877472E~38) = false ?= (~0.11754944E~37, ~0.5877472E~38) = false < (~0.11754944E~37, ~0.1E~44) = true > (~0.11754944E~37, ~0.1E~44) = false == (~0.11754944E~37, ~0.1E~44) = false ?= (~0.11754944E~37, ~0.1E~44) = false < (~0.11754944E~37, ~0.0) = true > (~0.11754944E~37, ~0.0) = false == (~0.11754944E~37, ~0.0) = false ?= (~0.11754944E~37, ~0.0) = false < (~0.5877472E~38, 0.34028235E39) = true > (~0.5877472E~38, 0.34028235E39) = false == (~0.5877472E~38, 0.34028235E39) = false ?= (~0.5877472E~38, 0.34028235E39) = false < (~0.5877472E~38, 0.17014117E39) = true > (~0.5877472E~38, 0.17014117E39) = false == (~0.5877472E~38, 0.17014117E39) = false ?= (~0.5877472E~38, 0.17014117E39) = false < (~0.5877472E~38, 0.123E4) = true > (~0.5877472E~38, 0.123E4) = false == (~0.5877472E~38, 0.123E4) = false ?= (~0.5877472E~38, 0.123E4) = false < (~0.5877472E~38, 0.123E2) = true > (~0.5877472E~38, 0.123E2) = false == (~0.5877472E~38, 0.123E2) = false ?= (~0.5877472E~38, 0.123E2) = false < (~0.5877472E~38, 0.31415927E1) = true > (~0.5877472E~38, 0.31415927E1) = false == (~0.5877472E~38, 0.31415927E1) = false ?= (~0.5877472E~38, 0.31415927E1) = false < (~0.5877472E~38, 0.27182817E1) = true > (~0.5877472E~38, 0.27182817E1) = false == (~0.5877472E~38, 0.27182817E1) = false ?= (~0.5877472E~38, 0.27182817E1) = false < (~0.5877472E~38, 0.123E1) = true > (~0.5877472E~38, 0.123E1) = false == (~0.5877472E~38, 0.123E1) = false ?= (~0.5877472E~38, 0.123E1) = false < (~0.5877472E~38, 0.123) = true > (~0.5877472E~38, 0.123) = false == (~0.5877472E~38, 0.123) = false ?= (~0.5877472E~38, 0.123) = false < (~0.5877472E~38, 0.123E~2) = true > (~0.5877472E~38, 0.123E~2) = false == (~0.5877472E~38, 0.123E~2) = false ?= (~0.5877472E~38, 0.123E~2) = false < (~0.5877472E~38, 0.11754944E~37) = true > (~0.5877472E~38, 0.11754944E~37) = false == (~0.5877472E~38, 0.11754944E~37) = false ?= (~0.5877472E~38, 0.11754944E~37) = false < (~0.5877472E~38, 0.5877472E~38) = true > (~0.5877472E~38, 0.5877472E~38) = false == (~0.5877472E~38, 0.5877472E~38) = false ?= (~0.5877472E~38, 0.5877472E~38) = false < (~0.5877472E~38, 0.1E~44) = true > (~0.5877472E~38, 0.1E~44) = false == (~0.5877472E~38, 0.1E~44) = false ?= (~0.5877472E~38, 0.1E~44) = false < (~0.5877472E~38, 0.0) = true > (~0.5877472E~38, 0.0) = false == (~0.5877472E~38, 0.0) = false ?= (~0.5877472E~38, 0.0) = false < (~0.5877472E~38, ~0.34028235E39) = false > (~0.5877472E~38, ~0.34028235E39) = true == (~0.5877472E~38, ~0.34028235E39) = false ?= (~0.5877472E~38, ~0.34028235E39) = false < (~0.5877472E~38, ~0.17014117E39) = false > (~0.5877472E~38, ~0.17014117E39) = true == (~0.5877472E~38, ~0.17014117E39) = false ?= (~0.5877472E~38, ~0.17014117E39) = false < (~0.5877472E~38, ~0.123E4) = false > (~0.5877472E~38, ~0.123E4) = true == (~0.5877472E~38, ~0.123E4) = false ?= (~0.5877472E~38, ~0.123E4) = false < (~0.5877472E~38, ~0.123E2) = false > (~0.5877472E~38, ~0.123E2) = true == (~0.5877472E~38, ~0.123E2) = false ?= (~0.5877472E~38, ~0.123E2) = false < (~0.5877472E~38, ~0.31415927E1) = false > (~0.5877472E~38, ~0.31415927E1) = true == (~0.5877472E~38, ~0.31415927E1) = false ?= (~0.5877472E~38, ~0.31415927E1) = false < (~0.5877472E~38, ~0.27182817E1) = false > (~0.5877472E~38, ~0.27182817E1) = true == (~0.5877472E~38, ~0.27182817E1) = false ?= (~0.5877472E~38, ~0.27182817E1) = false < (~0.5877472E~38, ~0.123E1) = false > (~0.5877472E~38, ~0.123E1) = true == (~0.5877472E~38, ~0.123E1) = false ?= (~0.5877472E~38, ~0.123E1) = false < (~0.5877472E~38, ~0.123) = false > (~0.5877472E~38, ~0.123) = true == (~0.5877472E~38, ~0.123) = false ?= (~0.5877472E~38, ~0.123) = false < (~0.5877472E~38, ~0.123E~2) = false > (~0.5877472E~38, ~0.123E~2) = true == (~0.5877472E~38, ~0.123E~2) = false ?= (~0.5877472E~38, ~0.123E~2) = false < (~0.5877472E~38, ~0.11754944E~37) = false > (~0.5877472E~38, ~0.11754944E~37) = true == (~0.5877472E~38, ~0.11754944E~37) = false ?= (~0.5877472E~38, ~0.11754944E~37) = false < (~0.5877472E~38, ~0.5877472E~38) = false > (~0.5877472E~38, ~0.5877472E~38) = false == (~0.5877472E~38, ~0.5877472E~38) = true ?= (~0.5877472E~38, ~0.5877472E~38) = true < (~0.5877472E~38, ~0.1E~44) = true > (~0.5877472E~38, ~0.1E~44) = false == (~0.5877472E~38, ~0.1E~44) = false ?= (~0.5877472E~38, ~0.1E~44) = false < (~0.5877472E~38, ~0.0) = true > (~0.5877472E~38, ~0.0) = false == (~0.5877472E~38, ~0.0) = false ?= (~0.5877472E~38, ~0.0) = false < (~0.1E~44, 0.34028235E39) = true > (~0.1E~44, 0.34028235E39) = false == (~0.1E~44, 0.34028235E39) = false ?= (~0.1E~44, 0.34028235E39) = false < (~0.1E~44, 0.17014117E39) = true > (~0.1E~44, 0.17014117E39) = false == (~0.1E~44, 0.17014117E39) = false ?= (~0.1E~44, 0.17014117E39) = false < (~0.1E~44, 0.123E4) = true > (~0.1E~44, 0.123E4) = false == (~0.1E~44, 0.123E4) = false ?= (~0.1E~44, 0.123E4) = false < (~0.1E~44, 0.123E2) = true > (~0.1E~44, 0.123E2) = false == (~0.1E~44, 0.123E2) = false ?= (~0.1E~44, 0.123E2) = false < (~0.1E~44, 0.31415927E1) = true > (~0.1E~44, 0.31415927E1) = false == (~0.1E~44, 0.31415927E1) = false ?= (~0.1E~44, 0.31415927E1) = false < (~0.1E~44, 0.27182817E1) = true > (~0.1E~44, 0.27182817E1) = false == (~0.1E~44, 0.27182817E1) = false ?= (~0.1E~44, 0.27182817E1) = false < (~0.1E~44, 0.123E1) = true > (~0.1E~44, 0.123E1) = false == (~0.1E~44, 0.123E1) = false ?= (~0.1E~44, 0.123E1) = false < (~0.1E~44, 0.123) = true > (~0.1E~44, 0.123) = false == (~0.1E~44, 0.123) = false ?= (~0.1E~44, 0.123) = false < (~0.1E~44, 0.123E~2) = true > (~0.1E~44, 0.123E~2) = false == (~0.1E~44, 0.123E~2) = false ?= (~0.1E~44, 0.123E~2) = false < (~0.1E~44, 0.11754944E~37) = true > (~0.1E~44, 0.11754944E~37) = false == (~0.1E~44, 0.11754944E~37) = false ?= (~0.1E~44, 0.11754944E~37) = false < (~0.1E~44, 0.5877472E~38) = true > (~0.1E~44, 0.5877472E~38) = false == (~0.1E~44, 0.5877472E~38) = false ?= (~0.1E~44, 0.5877472E~38) = false < (~0.1E~44, 0.1E~44) = true > (~0.1E~44, 0.1E~44) = false == (~0.1E~44, 0.1E~44) = false ?= (~0.1E~44, 0.1E~44) = false < (~0.1E~44, 0.0) = true > (~0.1E~44, 0.0) = false == (~0.1E~44, 0.0) = false ?= (~0.1E~44, 0.0) = false < (~0.1E~44, ~0.34028235E39) = false > (~0.1E~44, ~0.34028235E39) = true == (~0.1E~44, ~0.34028235E39) = false ?= (~0.1E~44, ~0.34028235E39) = false < (~0.1E~44, ~0.17014117E39) = false > (~0.1E~44, ~0.17014117E39) = true == (~0.1E~44, ~0.17014117E39) = false ?= (~0.1E~44, ~0.17014117E39) = false < (~0.1E~44, ~0.123E4) = false > (~0.1E~44, ~0.123E4) = true == (~0.1E~44, ~0.123E4) = false ?= (~0.1E~44, ~0.123E4) = false < (~0.1E~44, ~0.123E2) = false > (~0.1E~44, ~0.123E2) = true == (~0.1E~44, ~0.123E2) = false ?= (~0.1E~44, ~0.123E2) = false < (~0.1E~44, ~0.31415927E1) = false > (~0.1E~44, ~0.31415927E1) = true == (~0.1E~44, ~0.31415927E1) = false ?= (~0.1E~44, ~0.31415927E1) = false < (~0.1E~44, ~0.27182817E1) = false > (~0.1E~44, ~0.27182817E1) = true == (~0.1E~44, ~0.27182817E1) = false ?= (~0.1E~44, ~0.27182817E1) = false < (~0.1E~44, ~0.123E1) = false > (~0.1E~44, ~0.123E1) = true == (~0.1E~44, ~0.123E1) = false ?= (~0.1E~44, ~0.123E1) = false < (~0.1E~44, ~0.123) = false > (~0.1E~44, ~0.123) = true == (~0.1E~44, ~0.123) = false ?= (~0.1E~44, ~0.123) = false < (~0.1E~44, ~0.123E~2) = false > (~0.1E~44, ~0.123E~2) = true == (~0.1E~44, ~0.123E~2) = false ?= (~0.1E~44, ~0.123E~2) = false < (~0.1E~44, ~0.11754944E~37) = false > (~0.1E~44, ~0.11754944E~37) = true == (~0.1E~44, ~0.11754944E~37) = false ?= (~0.1E~44, ~0.11754944E~37) = false < (~0.1E~44, ~0.5877472E~38) = false > (~0.1E~44, ~0.5877472E~38) = true == (~0.1E~44, ~0.5877472E~38) = false ?= (~0.1E~44, ~0.5877472E~38) = false < (~0.1E~44, ~0.1E~44) = false > (~0.1E~44, ~0.1E~44) = false == (~0.1E~44, ~0.1E~44) = true ?= (~0.1E~44, ~0.1E~44) = true < (~0.1E~44, ~0.0) = true > (~0.1E~44, ~0.0) = false == (~0.1E~44, ~0.0) = false ?= (~0.1E~44, ~0.0) = false < (~0.0, 0.34028235E39) = true > (~0.0, 0.34028235E39) = false == (~0.0, 0.34028235E39) = false ?= (~0.0, 0.34028235E39) = false < (~0.0, 0.17014117E39) = true > (~0.0, 0.17014117E39) = false == (~0.0, 0.17014117E39) = false ?= (~0.0, 0.17014117E39) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.31415927E1) = true > (~0.0, 0.31415927E1) = false == (~0.0, 0.31415927E1) = false ?= (~0.0, 0.31415927E1) = false < (~0.0, 0.27182817E1) = true > (~0.0, 0.27182817E1) = false == (~0.0, 0.27182817E1) = false ?= (~0.0, 0.27182817E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.11754944E~37) = true > (~0.0, 0.11754944E~37) = false == (~0.0, 0.11754944E~37) = false ?= (~0.0, 0.11754944E~37) = false < (~0.0, 0.5877472E~38) = true > (~0.0, 0.5877472E~38) = false == (~0.0, 0.5877472E~38) = false ?= (~0.0, 0.5877472E~38) = false < (~0.0, 0.1E~44) = true > (~0.0, 0.1E~44) = false == (~0.0, 0.1E~44) = false ?= (~0.0, 0.1E~44) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.34028235E39) = false > (~0.0, ~0.34028235E39) = true == (~0.0, ~0.34028235E39) = false ?= (~0.0, ~0.34028235E39) = false < (~0.0, ~0.17014117E39) = false > (~0.0, ~0.17014117E39) = true == (~0.0, ~0.17014117E39) = false ?= (~0.0, ~0.17014117E39) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.31415927E1) = false > (~0.0, ~0.31415927E1) = true == (~0.0, ~0.31415927E1) = false ?= (~0.0, ~0.31415927E1) = false < (~0.0, ~0.27182817E1) = false > (~0.0, ~0.27182817E1) = true == (~0.0, ~0.27182817E1) = false ?= (~0.0, ~0.27182817E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.11754944E~37) = false > (~0.0, ~0.11754944E~37) = true == (~0.0, ~0.11754944E~37) = false ?= (~0.0, ~0.11754944E~37) = false < (~0.0, ~0.5877472E~38) = false > (~0.0, ~0.5877472E~38) = true == (~0.0, ~0.5877472E~38) = false ?= (~0.0, ~0.5877472E~38) = false < (~0.0, ~0.1E~44) = false > (~0.0, ~0.1E~44) = true == (~0.0, ~0.1E~44) = false ?= (~0.0, ~0.1E~44) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.34028235E39, 0.34028235E39) = EQUAL compareReal (0.34028235E39, 0.34028235E39) = EQUAL compare (0.34028235E39, 0.17014117E39) = GREATER compareReal (0.34028235E39, 0.17014117E39) = GREATER compare (0.34028235E39, 0.123E4) = GREATER compareReal (0.34028235E39, 0.123E4) = GREATER compare (0.34028235E39, 0.123E2) = GREATER compareReal (0.34028235E39, 0.123E2) = GREATER compare (0.34028235E39, 0.31415927E1) = GREATER compareReal (0.34028235E39, 0.31415927E1) = GREATER compare (0.34028235E39, 0.27182817E1) = GREATER compareReal (0.34028235E39, 0.27182817E1) = GREATER compare (0.34028235E39, 0.123E1) = GREATER compareReal (0.34028235E39, 0.123E1) = GREATER compare (0.34028235E39, 0.123) = GREATER compareReal (0.34028235E39, 0.123) = GREATER compare (0.34028235E39, 0.123E~2) = GREATER compareReal (0.34028235E39, 0.123E~2) = GREATER compare (0.34028235E39, 0.11754944E~37) = GREATER compareReal (0.34028235E39, 0.11754944E~37) = GREATER compare (0.34028235E39, 0.5877472E~38) = GREATER compareReal (0.34028235E39, 0.5877472E~38) = GREATER compare (0.34028235E39, 0.1E~44) = GREATER compareReal (0.34028235E39, 0.1E~44) = GREATER compare (0.34028235E39, 0.0) = GREATER compareReal (0.34028235E39, 0.0) = GREATER compare (0.34028235E39, ~0.34028235E39) = GREATER compareReal (0.34028235E39, ~0.34028235E39) = GREATER compare (0.34028235E39, ~0.17014117E39) = GREATER compareReal (0.34028235E39, ~0.17014117E39) = GREATER compare (0.34028235E39, ~0.123E4) = GREATER compareReal (0.34028235E39, ~0.123E4) = GREATER compare (0.34028235E39, ~0.123E2) = GREATER compareReal (0.34028235E39, ~0.123E2) = GREATER compare (0.34028235E39, ~0.31415927E1) = GREATER compareReal (0.34028235E39, ~0.31415927E1) = GREATER compare (0.34028235E39, ~0.27182817E1) = GREATER compareReal (0.34028235E39, ~0.27182817E1) = GREATER compare (0.34028235E39, ~0.123E1) = GREATER compareReal (0.34028235E39, ~0.123E1) = GREATER compare (0.34028235E39, ~0.123) = GREATER compareReal (0.34028235E39, ~0.123) = GREATER compare (0.34028235E39, ~0.123E~2) = GREATER compareReal (0.34028235E39, ~0.123E~2) = GREATER compare (0.34028235E39, ~0.11754944E~37) = GREATER compareReal (0.34028235E39, ~0.11754944E~37) = GREATER compare (0.34028235E39, ~0.5877472E~38) = GREATER compareReal (0.34028235E39, ~0.5877472E~38) = GREATER compare (0.34028235E39, ~0.1E~44) = GREATER compareReal (0.34028235E39, ~0.1E~44) = GREATER compare (0.34028235E39, ~0.0) = GREATER compareReal (0.34028235E39, ~0.0) = GREATER compare (0.17014117E39, 0.34028235E39) = LESS compareReal (0.17014117E39, 0.34028235E39) = LESS compare (0.17014117E39, 0.17014117E39) = EQUAL compareReal (0.17014117E39, 0.17014117E39) = EQUAL compare (0.17014117E39, 0.123E4) = GREATER compareReal (0.17014117E39, 0.123E4) = GREATER compare (0.17014117E39, 0.123E2) = GREATER compareReal (0.17014117E39, 0.123E2) = GREATER compare (0.17014117E39, 0.31415927E1) = GREATER compareReal (0.17014117E39, 0.31415927E1) = GREATER compare (0.17014117E39, 0.27182817E1) = GREATER compareReal (0.17014117E39, 0.27182817E1) = GREATER compare (0.17014117E39, 0.123E1) = GREATER compareReal (0.17014117E39, 0.123E1) = GREATER compare (0.17014117E39, 0.123) = GREATER compareReal (0.17014117E39, 0.123) = GREATER compare (0.17014117E39, 0.123E~2) = GREATER compareReal (0.17014117E39, 0.123E~2) = GREATER compare (0.17014117E39, 0.11754944E~37) = GREATER compareReal (0.17014117E39, 0.11754944E~37) = GREATER compare (0.17014117E39, 0.5877472E~38) = GREATER compareReal (0.17014117E39, 0.5877472E~38) = GREATER compare (0.17014117E39, 0.1E~44) = GREATER compareReal (0.17014117E39, 0.1E~44) = GREATER compare (0.17014117E39, 0.0) = GREATER compareReal (0.17014117E39, 0.0) = GREATER compare (0.17014117E39, ~0.34028235E39) = GREATER compareReal (0.17014117E39, ~0.34028235E39) = GREATER compare (0.17014117E39, ~0.17014117E39) = GREATER compareReal (0.17014117E39, ~0.17014117E39) = GREATER compare (0.17014117E39, ~0.123E4) = GREATER compareReal (0.17014117E39, ~0.123E4) = GREATER compare (0.17014117E39, ~0.123E2) = GREATER compareReal (0.17014117E39, ~0.123E2) = GREATER compare (0.17014117E39, ~0.31415927E1) = GREATER compareReal (0.17014117E39, ~0.31415927E1) = GREATER compare (0.17014117E39, ~0.27182817E1) = GREATER compareReal (0.17014117E39, ~0.27182817E1) = GREATER compare (0.17014117E39, ~0.123E1) = GREATER compareReal (0.17014117E39, ~0.123E1) = GREATER compare (0.17014117E39, ~0.123) = GREATER compareReal (0.17014117E39, ~0.123) = GREATER compare (0.17014117E39, ~0.123E~2) = GREATER compareReal (0.17014117E39, ~0.123E~2) = GREATER compare (0.17014117E39, ~0.11754944E~37) = GREATER compareReal (0.17014117E39, ~0.11754944E~37) = GREATER compare (0.17014117E39, ~0.5877472E~38) = GREATER compareReal (0.17014117E39, ~0.5877472E~38) = GREATER compare (0.17014117E39, ~0.1E~44) = GREATER compareReal (0.17014117E39, ~0.1E~44) = GREATER compare (0.17014117E39, ~0.0) = GREATER compareReal (0.17014117E39, ~0.0) = GREATER compare (0.123E4, 0.34028235E39) = LESS compareReal (0.123E4, 0.34028235E39) = LESS compare (0.123E4, 0.17014117E39) = LESS compareReal (0.123E4, 0.17014117E39) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.31415927E1) = GREATER compareReal (0.123E4, 0.31415927E1) = GREATER compare (0.123E4, 0.27182817E1) = GREATER compareReal (0.123E4, 0.27182817E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.11754944E~37) = GREATER compareReal (0.123E4, 0.11754944E~37) = GREATER compare (0.123E4, 0.5877472E~38) = GREATER compareReal (0.123E4, 0.5877472E~38) = GREATER compare (0.123E4, 0.1E~44) = GREATER compareReal (0.123E4, 0.1E~44) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.34028235E39) = GREATER compareReal (0.123E4, ~0.34028235E39) = GREATER compare (0.123E4, ~0.17014117E39) = GREATER compareReal (0.123E4, ~0.17014117E39) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.31415927E1) = GREATER compareReal (0.123E4, ~0.31415927E1) = GREATER compare (0.123E4, ~0.27182817E1) = GREATER compareReal (0.123E4, ~0.27182817E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.11754944E~37) = GREATER compareReal (0.123E4, ~0.11754944E~37) = GREATER compare (0.123E4, ~0.5877472E~38) = GREATER compareReal (0.123E4, ~0.5877472E~38) = GREATER compare (0.123E4, ~0.1E~44) = GREATER compareReal (0.123E4, ~0.1E~44) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.34028235E39) = LESS compareReal (0.123E2, 0.34028235E39) = LESS compare (0.123E2, 0.17014117E39) = LESS compareReal (0.123E2, 0.17014117E39) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.31415927E1) = GREATER compareReal (0.123E2, 0.31415927E1) = GREATER compare (0.123E2, 0.27182817E1) = GREATER compareReal (0.123E2, 0.27182817E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.11754944E~37) = GREATER compareReal (0.123E2, 0.11754944E~37) = GREATER compare (0.123E2, 0.5877472E~38) = GREATER compareReal (0.123E2, 0.5877472E~38) = GREATER compare (0.123E2, 0.1E~44) = GREATER compareReal (0.123E2, 0.1E~44) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.34028235E39) = GREATER compareReal (0.123E2, ~0.34028235E39) = GREATER compare (0.123E2, ~0.17014117E39) = GREATER compareReal (0.123E2, ~0.17014117E39) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.31415927E1) = GREATER compareReal (0.123E2, ~0.31415927E1) = GREATER compare (0.123E2, ~0.27182817E1) = GREATER compareReal (0.123E2, ~0.27182817E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.11754944E~37) = GREATER compareReal (0.123E2, ~0.11754944E~37) = GREATER compare (0.123E2, ~0.5877472E~38) = GREATER compareReal (0.123E2, ~0.5877472E~38) = GREATER compare (0.123E2, ~0.1E~44) = GREATER compareReal (0.123E2, ~0.1E~44) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.31415927E1, 0.34028235E39) = LESS compareReal (0.31415927E1, 0.34028235E39) = LESS compare (0.31415927E1, 0.17014117E39) = LESS compareReal (0.31415927E1, 0.17014117E39) = LESS compare (0.31415927E1, 0.123E4) = LESS compareReal (0.31415927E1, 0.123E4) = LESS compare (0.31415927E1, 0.123E2) = LESS compareReal (0.31415927E1, 0.123E2) = LESS compare (0.31415927E1, 0.31415927E1) = EQUAL compareReal (0.31415927E1, 0.31415927E1) = EQUAL compare (0.31415927E1, 0.27182817E1) = GREATER compareReal (0.31415927E1, 0.27182817E1) = GREATER compare (0.31415927E1, 0.123E1) = GREATER compareReal (0.31415927E1, 0.123E1) = GREATER compare (0.31415927E1, 0.123) = GREATER compareReal (0.31415927E1, 0.123) = GREATER compare (0.31415927E1, 0.123E~2) = GREATER compareReal (0.31415927E1, 0.123E~2) = GREATER compare (0.31415927E1, 0.11754944E~37) = GREATER compareReal (0.31415927E1, 0.11754944E~37) = GREATER compare (0.31415927E1, 0.5877472E~38) = GREATER compareReal (0.31415927E1, 0.5877472E~38) = GREATER compare (0.31415927E1, 0.1E~44) = GREATER compareReal (0.31415927E1, 0.1E~44) = GREATER compare (0.31415927E1, 0.0) = GREATER compareReal (0.31415927E1, 0.0) = GREATER compare (0.31415927E1, ~0.34028235E39) = GREATER compareReal (0.31415927E1, ~0.34028235E39) = GREATER compare (0.31415927E1, ~0.17014117E39) = GREATER compareReal (0.31415927E1, ~0.17014117E39) = GREATER compare (0.31415927E1, ~0.123E4) = GREATER compareReal (0.31415927E1, ~0.123E4) = GREATER compare (0.31415927E1, ~0.123E2) = GREATER compareReal (0.31415927E1, ~0.123E2) = GREATER compare (0.31415927E1, ~0.31415927E1) = GREATER compareReal (0.31415927E1, ~0.31415927E1) = GREATER compare (0.31415927E1, ~0.27182817E1) = GREATER compareReal (0.31415927E1, ~0.27182817E1) = GREATER compare (0.31415927E1, ~0.123E1) = GREATER compareReal (0.31415927E1, ~0.123E1) = GREATER compare (0.31415927E1, ~0.123) = GREATER compareReal (0.31415927E1, ~0.123) = GREATER compare (0.31415927E1, ~0.123E~2) = GREATER compareReal (0.31415927E1, ~0.123E~2) = GREATER compare (0.31415927E1, ~0.11754944E~37) = GREATER compareReal (0.31415927E1, ~0.11754944E~37) = GREATER compare (0.31415927E1, ~0.5877472E~38) = GREATER compareReal (0.31415927E1, ~0.5877472E~38) = GREATER compare (0.31415927E1, ~0.1E~44) = GREATER compareReal (0.31415927E1, ~0.1E~44) = GREATER compare (0.31415927E1, ~0.0) = GREATER compareReal (0.31415927E1, ~0.0) = GREATER compare (0.27182817E1, 0.34028235E39) = LESS compareReal (0.27182817E1, 0.34028235E39) = LESS compare (0.27182817E1, 0.17014117E39) = LESS compareReal (0.27182817E1, 0.17014117E39) = LESS compare (0.27182817E1, 0.123E4) = LESS compareReal (0.27182817E1, 0.123E4) = LESS compare (0.27182817E1, 0.123E2) = LESS compareReal (0.27182817E1, 0.123E2) = LESS compare (0.27182817E1, 0.31415927E1) = LESS compareReal (0.27182817E1, 0.31415927E1) = LESS compare (0.27182817E1, 0.27182817E1) = EQUAL compareReal (0.27182817E1, 0.27182817E1) = EQUAL compare (0.27182817E1, 0.123E1) = GREATER compareReal (0.27182817E1, 0.123E1) = GREATER compare (0.27182817E1, 0.123) = GREATER compareReal (0.27182817E1, 0.123) = GREATER compare (0.27182817E1, 0.123E~2) = GREATER compareReal (0.27182817E1, 0.123E~2) = GREATER compare (0.27182817E1, 0.11754944E~37) = GREATER compareReal (0.27182817E1, 0.11754944E~37) = GREATER compare (0.27182817E1, 0.5877472E~38) = GREATER compareReal (0.27182817E1, 0.5877472E~38) = GREATER compare (0.27182817E1, 0.1E~44) = GREATER compareReal (0.27182817E1, 0.1E~44) = GREATER compare (0.27182817E1, 0.0) = GREATER compareReal (0.27182817E1, 0.0) = GREATER compare (0.27182817E1, ~0.34028235E39) = GREATER compareReal (0.27182817E1, ~0.34028235E39) = GREATER compare (0.27182817E1, ~0.17014117E39) = GREATER compareReal (0.27182817E1, ~0.17014117E39) = GREATER compare (0.27182817E1, ~0.123E4) = GREATER compareReal (0.27182817E1, ~0.123E4) = GREATER compare (0.27182817E1, ~0.123E2) = GREATER compareReal (0.27182817E1, ~0.123E2) = GREATER compare (0.27182817E1, ~0.31415927E1) = GREATER compareReal (0.27182817E1, ~0.31415927E1) = GREATER compare (0.27182817E1, ~0.27182817E1) = GREATER compareReal (0.27182817E1, ~0.27182817E1) = GREATER compare (0.27182817E1, ~0.123E1) = GREATER compareReal (0.27182817E1, ~0.123E1) = GREATER compare (0.27182817E1, ~0.123) = GREATER compareReal (0.27182817E1, ~0.123) = GREATER compare (0.27182817E1, ~0.123E~2) = GREATER compareReal (0.27182817E1, ~0.123E~2) = GREATER compare (0.27182817E1, ~0.11754944E~37) = GREATER compareReal (0.27182817E1, ~0.11754944E~37) = GREATER compare (0.27182817E1, ~0.5877472E~38) = GREATER compareReal (0.27182817E1, ~0.5877472E~38) = GREATER compare (0.27182817E1, ~0.1E~44) = GREATER compareReal (0.27182817E1, ~0.1E~44) = GREATER compare (0.27182817E1, ~0.0) = GREATER compareReal (0.27182817E1, ~0.0) = GREATER compare (0.123E1, 0.34028235E39) = LESS compareReal (0.123E1, 0.34028235E39) = LESS compare (0.123E1, 0.17014117E39) = LESS compareReal (0.123E1, 0.17014117E39) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.31415927E1) = LESS compareReal (0.123E1, 0.31415927E1) = LESS compare (0.123E1, 0.27182817E1) = LESS compareReal (0.123E1, 0.27182817E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.11754944E~37) = GREATER compareReal (0.123E1, 0.11754944E~37) = GREATER compare (0.123E1, 0.5877472E~38) = GREATER compareReal (0.123E1, 0.5877472E~38) = GREATER compare (0.123E1, 0.1E~44) = GREATER compareReal (0.123E1, 0.1E~44) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.34028235E39) = GREATER compareReal (0.123E1, ~0.34028235E39) = GREATER compare (0.123E1, ~0.17014117E39) = GREATER compareReal (0.123E1, ~0.17014117E39) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.31415927E1) = GREATER compareReal (0.123E1, ~0.31415927E1) = GREATER compare (0.123E1, ~0.27182817E1) = GREATER compareReal (0.123E1, ~0.27182817E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.11754944E~37) = GREATER compareReal (0.123E1, ~0.11754944E~37) = GREATER compare (0.123E1, ~0.5877472E~38) = GREATER compareReal (0.123E1, ~0.5877472E~38) = GREATER compare (0.123E1, ~0.1E~44) = GREATER compareReal (0.123E1, ~0.1E~44) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.34028235E39) = LESS compareReal (0.123, 0.34028235E39) = LESS compare (0.123, 0.17014117E39) = LESS compareReal (0.123, 0.17014117E39) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.31415927E1) = LESS compareReal (0.123, 0.31415927E1) = LESS compare (0.123, 0.27182817E1) = LESS compareReal (0.123, 0.27182817E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.11754944E~37) = GREATER compareReal (0.123, 0.11754944E~37) = GREATER compare (0.123, 0.5877472E~38) = GREATER compareReal (0.123, 0.5877472E~38) = GREATER compare (0.123, 0.1E~44) = GREATER compareReal (0.123, 0.1E~44) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.34028235E39) = GREATER compareReal (0.123, ~0.34028235E39) = GREATER compare (0.123, ~0.17014117E39) = GREATER compareReal (0.123, ~0.17014117E39) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.31415927E1) = GREATER compareReal (0.123, ~0.31415927E1) = GREATER compare (0.123, ~0.27182817E1) = GREATER compareReal (0.123, ~0.27182817E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.11754944E~37) = GREATER compareReal (0.123, ~0.11754944E~37) = GREATER compare (0.123, ~0.5877472E~38) = GREATER compareReal (0.123, ~0.5877472E~38) = GREATER compare (0.123, ~0.1E~44) = GREATER compareReal (0.123, ~0.1E~44) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.34028235E39) = LESS compareReal (0.123E~2, 0.34028235E39) = LESS compare (0.123E~2, 0.17014117E39) = LESS compareReal (0.123E~2, 0.17014117E39) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.31415927E1) = LESS compareReal (0.123E~2, 0.31415927E1) = LESS compare (0.123E~2, 0.27182817E1) = LESS compareReal (0.123E~2, 0.27182817E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.11754944E~37) = GREATER compareReal (0.123E~2, 0.11754944E~37) = GREATER compare (0.123E~2, 0.5877472E~38) = GREATER compareReal (0.123E~2, 0.5877472E~38) = GREATER compare (0.123E~2, 0.1E~44) = GREATER compareReal (0.123E~2, 0.1E~44) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.34028235E39) = GREATER compareReal (0.123E~2, ~0.34028235E39) = GREATER compare (0.123E~2, ~0.17014117E39) = GREATER compareReal (0.123E~2, ~0.17014117E39) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.31415927E1) = GREATER compareReal (0.123E~2, ~0.31415927E1) = GREATER compare (0.123E~2, ~0.27182817E1) = GREATER compareReal (0.123E~2, ~0.27182817E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.11754944E~37) = GREATER compareReal (0.123E~2, ~0.11754944E~37) = GREATER compare (0.123E~2, ~0.5877472E~38) = GREATER compareReal (0.123E~2, ~0.5877472E~38) = GREATER compare (0.123E~2, ~0.1E~44) = GREATER compareReal (0.123E~2, ~0.1E~44) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.11754944E~37, 0.34028235E39) = LESS compareReal (0.11754944E~37, 0.34028235E39) = LESS compare (0.11754944E~37, 0.17014117E39) = LESS compareReal (0.11754944E~37, 0.17014117E39) = LESS compare (0.11754944E~37, 0.123E4) = LESS compareReal (0.11754944E~37, 0.123E4) = LESS compare (0.11754944E~37, 0.123E2) = LESS compareReal (0.11754944E~37, 0.123E2) = LESS compare (0.11754944E~37, 0.31415927E1) = LESS compareReal (0.11754944E~37, 0.31415927E1) = LESS compare (0.11754944E~37, 0.27182817E1) = LESS compareReal (0.11754944E~37, 0.27182817E1) = LESS compare (0.11754944E~37, 0.123E1) = LESS compareReal (0.11754944E~37, 0.123E1) = LESS compare (0.11754944E~37, 0.123) = LESS compareReal (0.11754944E~37, 0.123) = LESS compare (0.11754944E~37, 0.123E~2) = LESS compareReal (0.11754944E~37, 0.123E~2) = LESS compare (0.11754944E~37, 0.11754944E~37) = EQUAL compareReal (0.11754944E~37, 0.11754944E~37) = EQUAL compare (0.11754944E~37, 0.5877472E~38) = GREATER compareReal (0.11754944E~37, 0.5877472E~38) = GREATER compare (0.11754944E~37, 0.1E~44) = GREATER compareReal (0.11754944E~37, 0.1E~44) = GREATER compare (0.11754944E~37, 0.0) = GREATER compareReal (0.11754944E~37, 0.0) = GREATER compare (0.11754944E~37, ~0.34028235E39) = GREATER compareReal (0.11754944E~37, ~0.34028235E39) = GREATER compare (0.11754944E~37, ~0.17014117E39) = GREATER compareReal (0.11754944E~37, ~0.17014117E39) = GREATER compare (0.11754944E~37, ~0.123E4) = GREATER compareReal (0.11754944E~37, ~0.123E4) = GREATER compare (0.11754944E~37, ~0.123E2) = GREATER compareReal (0.11754944E~37, ~0.123E2) = GREATER compare (0.11754944E~37, ~0.31415927E1) = GREATER compareReal (0.11754944E~37, ~0.31415927E1) = GREATER compare (0.11754944E~37, ~0.27182817E1) = GREATER compareReal (0.11754944E~37, ~0.27182817E1) = GREATER compare (0.11754944E~37, ~0.123E1) = GREATER compareReal (0.11754944E~37, ~0.123E1) = GREATER compare (0.11754944E~37, ~0.123) = GREATER compareReal (0.11754944E~37, ~0.123) = GREATER compare (0.11754944E~37, ~0.123E~2) = GREATER compareReal (0.11754944E~37, ~0.123E~2) = GREATER compare (0.11754944E~37, ~0.11754944E~37) = GREATER compareReal (0.11754944E~37, ~0.11754944E~37) = GREATER compare (0.11754944E~37, ~0.5877472E~38) = GREATER compareReal (0.11754944E~37, ~0.5877472E~38) = GREATER compare (0.11754944E~37, ~0.1E~44) = GREATER compareReal (0.11754944E~37, ~0.1E~44) = GREATER compare (0.11754944E~37, ~0.0) = GREATER compareReal (0.11754944E~37, ~0.0) = GREATER compare (0.5877472E~38, 0.34028235E39) = LESS compareReal (0.5877472E~38, 0.34028235E39) = LESS compare (0.5877472E~38, 0.17014117E39) = LESS compareReal (0.5877472E~38, 0.17014117E39) = LESS compare (0.5877472E~38, 0.123E4) = LESS compareReal (0.5877472E~38, 0.123E4) = LESS compare (0.5877472E~38, 0.123E2) = LESS compareReal (0.5877472E~38, 0.123E2) = LESS compare (0.5877472E~38, 0.31415927E1) = LESS compareReal (0.5877472E~38, 0.31415927E1) = LESS compare (0.5877472E~38, 0.27182817E1) = LESS compareReal (0.5877472E~38, 0.27182817E1) = LESS compare (0.5877472E~38, 0.123E1) = LESS compareReal (0.5877472E~38, 0.123E1) = LESS compare (0.5877472E~38, 0.123) = LESS compareReal (0.5877472E~38, 0.123) = LESS compare (0.5877472E~38, 0.123E~2) = LESS compareReal (0.5877472E~38, 0.123E~2) = LESS compare (0.5877472E~38, 0.11754944E~37) = LESS compareReal (0.5877472E~38, 0.11754944E~37) = LESS compare (0.5877472E~38, 0.5877472E~38) = EQUAL compareReal (0.5877472E~38, 0.5877472E~38) = EQUAL compare (0.5877472E~38, 0.1E~44) = GREATER compareReal (0.5877472E~38, 0.1E~44) = GREATER compare (0.5877472E~38, 0.0) = GREATER compareReal (0.5877472E~38, 0.0) = GREATER compare (0.5877472E~38, ~0.34028235E39) = GREATER compareReal (0.5877472E~38, ~0.34028235E39) = GREATER compare (0.5877472E~38, ~0.17014117E39) = GREATER compareReal (0.5877472E~38, ~0.17014117E39) = GREATER compare (0.5877472E~38, ~0.123E4) = GREATER compareReal (0.5877472E~38, ~0.123E4) = GREATER compare (0.5877472E~38, ~0.123E2) = GREATER compareReal (0.5877472E~38, ~0.123E2) = GREATER compare (0.5877472E~38, ~0.31415927E1) = GREATER compareReal (0.5877472E~38, ~0.31415927E1) = GREATER compare (0.5877472E~38, ~0.27182817E1) = GREATER compareReal (0.5877472E~38, ~0.27182817E1) = GREATER compare (0.5877472E~38, ~0.123E1) = GREATER compareReal (0.5877472E~38, ~0.123E1) = GREATER compare (0.5877472E~38, ~0.123) = GREATER compareReal (0.5877472E~38, ~0.123) = GREATER compare (0.5877472E~38, ~0.123E~2) = GREATER compareReal (0.5877472E~38, ~0.123E~2) = GREATER compare (0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (0.5877472E~38, ~0.11754944E~37) = GREATER compare (0.5877472E~38, ~0.5877472E~38) = GREATER compareReal (0.5877472E~38, ~0.5877472E~38) = GREATER compare (0.5877472E~38, ~0.1E~44) = GREATER compareReal (0.5877472E~38, ~0.1E~44) = GREATER compare (0.5877472E~38, ~0.0) = GREATER compareReal (0.5877472E~38, ~0.0) = GREATER compare (0.1E~44, 0.34028235E39) = LESS compareReal (0.1E~44, 0.34028235E39) = LESS compare (0.1E~44, 0.17014117E39) = LESS compareReal (0.1E~44, 0.17014117E39) = LESS compare (0.1E~44, 0.123E4) = LESS compareReal (0.1E~44, 0.123E4) = LESS compare (0.1E~44, 0.123E2) = LESS compareReal (0.1E~44, 0.123E2) = LESS compare (0.1E~44, 0.31415927E1) = LESS compareReal (0.1E~44, 0.31415927E1) = LESS compare (0.1E~44, 0.27182817E1) = LESS compareReal (0.1E~44, 0.27182817E1) = LESS compare (0.1E~44, 0.123E1) = LESS compareReal (0.1E~44, 0.123E1) = LESS compare (0.1E~44, 0.123) = LESS compareReal (0.1E~44, 0.123) = LESS compare (0.1E~44, 0.123E~2) = LESS compareReal (0.1E~44, 0.123E~2) = LESS compare (0.1E~44, 0.11754944E~37) = LESS compareReal (0.1E~44, 0.11754944E~37) = LESS compare (0.1E~44, 0.5877472E~38) = LESS compareReal (0.1E~44, 0.5877472E~38) = LESS compare (0.1E~44, 0.1E~44) = EQUAL compareReal (0.1E~44, 0.1E~44) = EQUAL compare (0.1E~44, 0.0) = GREATER compareReal (0.1E~44, 0.0) = GREATER compare (0.1E~44, ~0.34028235E39) = GREATER compareReal (0.1E~44, ~0.34028235E39) = GREATER compare (0.1E~44, ~0.17014117E39) = GREATER compareReal (0.1E~44, ~0.17014117E39) = GREATER compare (0.1E~44, ~0.123E4) = GREATER compareReal (0.1E~44, ~0.123E4) = GREATER compare (0.1E~44, ~0.123E2) = GREATER compareReal (0.1E~44, ~0.123E2) = GREATER compare (0.1E~44, ~0.31415927E1) = GREATER compareReal (0.1E~44, ~0.31415927E1) = GREATER compare (0.1E~44, ~0.27182817E1) = GREATER compareReal (0.1E~44, ~0.27182817E1) = GREATER compare (0.1E~44, ~0.123E1) = GREATER compareReal (0.1E~44, ~0.123E1) = GREATER compare (0.1E~44, ~0.123) = GREATER compareReal (0.1E~44, ~0.123) = GREATER compare (0.1E~44, ~0.123E~2) = GREATER compareReal (0.1E~44, ~0.123E~2) = GREATER compare (0.1E~44, ~0.11754944E~37) = GREATER compareReal (0.1E~44, ~0.11754944E~37) = GREATER compare (0.1E~44, ~0.5877472E~38) = GREATER compareReal (0.1E~44, ~0.5877472E~38) = GREATER compare (0.1E~44, ~0.1E~44) = GREATER compareReal (0.1E~44, ~0.1E~44) = GREATER compare (0.1E~44, ~0.0) = GREATER compareReal (0.1E~44, ~0.0) = GREATER compare (0.0, 0.34028235E39) = LESS compareReal (0.0, 0.34028235E39) = LESS compare (0.0, 0.17014117E39) = LESS compareReal (0.0, 0.17014117E39) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.31415927E1) = LESS compareReal (0.0, 0.31415927E1) = LESS compare (0.0, 0.27182817E1) = LESS compareReal (0.0, 0.27182817E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.11754944E~37) = LESS compareReal (0.0, 0.11754944E~37) = LESS compare (0.0, 0.5877472E~38) = LESS compareReal (0.0, 0.5877472E~38) = LESS compare (0.0, 0.1E~44) = LESS compareReal (0.0, 0.1E~44) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.34028235E39) = GREATER compareReal (0.0, ~0.34028235E39) = GREATER compare (0.0, ~0.17014117E39) = GREATER compareReal (0.0, ~0.17014117E39) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.31415927E1) = GREATER compareReal (0.0, ~0.31415927E1) = GREATER compare (0.0, ~0.27182817E1) = GREATER compareReal (0.0, ~0.27182817E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.11754944E~37) = GREATER compareReal (0.0, ~0.11754944E~37) = GREATER compare (0.0, ~0.5877472E~38) = GREATER compareReal (0.0, ~0.5877472E~38) = GREATER compare (0.0, ~0.1E~44) = GREATER compareReal (0.0, ~0.1E~44) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.34028235E39, 0.34028235E39) = LESS compareReal (~0.34028235E39, 0.34028235E39) = LESS compare (~0.34028235E39, 0.17014117E39) = LESS compareReal (~0.34028235E39, 0.17014117E39) = LESS compare (~0.34028235E39, 0.123E4) = LESS compareReal (~0.34028235E39, 0.123E4) = LESS compare (~0.34028235E39, 0.123E2) = LESS compareReal (~0.34028235E39, 0.123E2) = LESS compare (~0.34028235E39, 0.31415927E1) = LESS compareReal (~0.34028235E39, 0.31415927E1) = LESS compare (~0.34028235E39, 0.27182817E1) = LESS compareReal (~0.34028235E39, 0.27182817E1) = LESS compare (~0.34028235E39, 0.123E1) = LESS compareReal (~0.34028235E39, 0.123E1) = LESS compare (~0.34028235E39, 0.123) = LESS compareReal (~0.34028235E39, 0.123) = LESS compare (~0.34028235E39, 0.123E~2) = LESS compareReal (~0.34028235E39, 0.123E~2) = LESS compare (~0.34028235E39, 0.11754944E~37) = LESS compareReal (~0.34028235E39, 0.11754944E~37) = LESS compare (~0.34028235E39, 0.5877472E~38) = LESS compareReal (~0.34028235E39, 0.5877472E~38) = LESS compare (~0.34028235E39, 0.1E~44) = LESS compareReal (~0.34028235E39, 0.1E~44) = LESS compare (~0.34028235E39, 0.0) = LESS compareReal (~0.34028235E39, 0.0) = LESS compare (~0.34028235E39, ~0.34028235E39) = EQUAL compareReal (~0.34028235E39, ~0.34028235E39) = EQUAL compare (~0.34028235E39, ~0.17014117E39) = LESS compareReal (~0.34028235E39, ~0.17014117E39) = LESS compare (~0.34028235E39, ~0.123E4) = LESS compareReal (~0.34028235E39, ~0.123E4) = LESS compare (~0.34028235E39, ~0.123E2) = LESS compareReal (~0.34028235E39, ~0.123E2) = LESS compare (~0.34028235E39, ~0.31415927E1) = LESS compareReal (~0.34028235E39, ~0.31415927E1) = LESS compare (~0.34028235E39, ~0.27182817E1) = LESS compareReal (~0.34028235E39, ~0.27182817E1) = LESS compare (~0.34028235E39, ~0.123E1) = LESS compareReal (~0.34028235E39, ~0.123E1) = LESS compare (~0.34028235E39, ~0.123) = LESS compareReal (~0.34028235E39, ~0.123) = LESS compare (~0.34028235E39, ~0.123E~2) = LESS compareReal (~0.34028235E39, ~0.123E~2) = LESS compare (~0.34028235E39, ~0.11754944E~37) = LESS compareReal (~0.34028235E39, ~0.11754944E~37) = LESS compare (~0.34028235E39, ~0.5877472E~38) = LESS compareReal (~0.34028235E39, ~0.5877472E~38) = LESS compare (~0.34028235E39, ~0.1E~44) = LESS compareReal (~0.34028235E39, ~0.1E~44) = LESS compare (~0.34028235E39, ~0.0) = LESS compareReal (~0.34028235E39, ~0.0) = LESS compare (~0.17014117E39, 0.34028235E39) = LESS compareReal (~0.17014117E39, 0.34028235E39) = LESS compare (~0.17014117E39, 0.17014117E39) = LESS compareReal (~0.17014117E39, 0.17014117E39) = LESS compare (~0.17014117E39, 0.123E4) = LESS compareReal (~0.17014117E39, 0.123E4) = LESS compare (~0.17014117E39, 0.123E2) = LESS compareReal (~0.17014117E39, 0.123E2) = LESS compare (~0.17014117E39, 0.31415927E1) = LESS compareReal (~0.17014117E39, 0.31415927E1) = LESS compare (~0.17014117E39, 0.27182817E1) = LESS compareReal (~0.17014117E39, 0.27182817E1) = LESS compare (~0.17014117E39, 0.123E1) = LESS compareReal (~0.17014117E39, 0.123E1) = LESS compare (~0.17014117E39, 0.123) = LESS compareReal (~0.17014117E39, 0.123) = LESS compare (~0.17014117E39, 0.123E~2) = LESS compareReal (~0.17014117E39, 0.123E~2) = LESS compare (~0.17014117E39, 0.11754944E~37) = LESS compareReal (~0.17014117E39, 0.11754944E~37) = LESS compare (~0.17014117E39, 0.5877472E~38) = LESS compareReal (~0.17014117E39, 0.5877472E~38) = LESS compare (~0.17014117E39, 0.1E~44) = LESS compareReal (~0.17014117E39, 0.1E~44) = LESS compare (~0.17014117E39, 0.0) = LESS compareReal (~0.17014117E39, 0.0) = LESS compare (~0.17014117E39, ~0.34028235E39) = GREATER compareReal (~0.17014117E39, ~0.34028235E39) = GREATER compare (~0.17014117E39, ~0.17014117E39) = EQUAL compareReal (~0.17014117E39, ~0.17014117E39) = EQUAL compare (~0.17014117E39, ~0.123E4) = LESS compareReal (~0.17014117E39, ~0.123E4) = LESS compare (~0.17014117E39, ~0.123E2) = LESS compareReal (~0.17014117E39, ~0.123E2) = LESS compare (~0.17014117E39, ~0.31415927E1) = LESS compareReal (~0.17014117E39, ~0.31415927E1) = LESS compare (~0.17014117E39, ~0.27182817E1) = LESS compareReal (~0.17014117E39, ~0.27182817E1) = LESS compare (~0.17014117E39, ~0.123E1) = LESS compareReal (~0.17014117E39, ~0.123E1) = LESS compare (~0.17014117E39, ~0.123) = LESS compareReal (~0.17014117E39, ~0.123) = LESS compare (~0.17014117E39, ~0.123E~2) = LESS compareReal (~0.17014117E39, ~0.123E~2) = LESS compare (~0.17014117E39, ~0.11754944E~37) = LESS compareReal (~0.17014117E39, ~0.11754944E~37) = LESS compare (~0.17014117E39, ~0.5877472E~38) = LESS compareReal (~0.17014117E39, ~0.5877472E~38) = LESS compare (~0.17014117E39, ~0.1E~44) = LESS compareReal (~0.17014117E39, ~0.1E~44) = LESS compare (~0.17014117E39, ~0.0) = LESS compareReal (~0.17014117E39, ~0.0) = LESS compare (~0.123E4, 0.34028235E39) = LESS compareReal (~0.123E4, 0.34028235E39) = LESS compare (~0.123E4, 0.17014117E39) = LESS compareReal (~0.123E4, 0.17014117E39) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.31415927E1) = LESS compareReal (~0.123E4, 0.31415927E1) = LESS compare (~0.123E4, 0.27182817E1) = LESS compareReal (~0.123E4, 0.27182817E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.11754944E~37) = LESS compareReal (~0.123E4, 0.11754944E~37) = LESS compare (~0.123E4, 0.5877472E~38) = LESS compareReal (~0.123E4, 0.5877472E~38) = LESS compare (~0.123E4, 0.1E~44) = LESS compareReal (~0.123E4, 0.1E~44) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.34028235E39) = GREATER compareReal (~0.123E4, ~0.34028235E39) = GREATER compare (~0.123E4, ~0.17014117E39) = GREATER compareReal (~0.123E4, ~0.17014117E39) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.31415927E1) = LESS compareReal (~0.123E4, ~0.31415927E1) = LESS compare (~0.123E4, ~0.27182817E1) = LESS compareReal (~0.123E4, ~0.27182817E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.11754944E~37) = LESS compareReal (~0.123E4, ~0.11754944E~37) = LESS compare (~0.123E4, ~0.5877472E~38) = LESS compareReal (~0.123E4, ~0.5877472E~38) = LESS compare (~0.123E4, ~0.1E~44) = LESS compareReal (~0.123E4, ~0.1E~44) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.34028235E39) = LESS compareReal (~0.123E2, 0.34028235E39) = LESS compare (~0.123E2, 0.17014117E39) = LESS compareReal (~0.123E2, 0.17014117E39) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.31415927E1) = LESS compareReal (~0.123E2, 0.31415927E1) = LESS compare (~0.123E2, 0.27182817E1) = LESS compareReal (~0.123E2, 0.27182817E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.11754944E~37) = LESS compareReal (~0.123E2, 0.11754944E~37) = LESS compare (~0.123E2, 0.5877472E~38) = LESS compareReal (~0.123E2, 0.5877472E~38) = LESS compare (~0.123E2, 0.1E~44) = LESS compareReal (~0.123E2, 0.1E~44) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.34028235E39) = GREATER compareReal (~0.123E2, ~0.34028235E39) = GREATER compare (~0.123E2, ~0.17014117E39) = GREATER compareReal (~0.123E2, ~0.17014117E39) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.31415927E1) = LESS compareReal (~0.123E2, ~0.31415927E1) = LESS compare (~0.123E2, ~0.27182817E1) = LESS compareReal (~0.123E2, ~0.27182817E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.11754944E~37) = LESS compareReal (~0.123E2, ~0.11754944E~37) = LESS compare (~0.123E2, ~0.5877472E~38) = LESS compareReal (~0.123E2, ~0.5877472E~38) = LESS compare (~0.123E2, ~0.1E~44) = LESS compareReal (~0.123E2, ~0.1E~44) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.31415927E1, 0.34028235E39) = LESS compareReal (~0.31415927E1, 0.34028235E39) = LESS compare (~0.31415927E1, 0.17014117E39) = LESS compareReal (~0.31415927E1, 0.17014117E39) = LESS compare (~0.31415927E1, 0.123E4) = LESS compareReal (~0.31415927E1, 0.123E4) = LESS compare (~0.31415927E1, 0.123E2) = LESS compareReal (~0.31415927E1, 0.123E2) = LESS compare (~0.31415927E1, 0.31415927E1) = LESS compareReal (~0.31415927E1, 0.31415927E1) = LESS compare (~0.31415927E1, 0.27182817E1) = LESS compareReal (~0.31415927E1, 0.27182817E1) = LESS compare (~0.31415927E1, 0.123E1) = LESS compareReal (~0.31415927E1, 0.123E1) = LESS compare (~0.31415927E1, 0.123) = LESS compareReal (~0.31415927E1, 0.123) = LESS compare (~0.31415927E1, 0.123E~2) = LESS compareReal (~0.31415927E1, 0.123E~2) = LESS compare (~0.31415927E1, 0.11754944E~37) = LESS compareReal (~0.31415927E1, 0.11754944E~37) = LESS compare (~0.31415927E1, 0.5877472E~38) = LESS compareReal (~0.31415927E1, 0.5877472E~38) = LESS compare (~0.31415927E1, 0.1E~44) = LESS compareReal (~0.31415927E1, 0.1E~44) = LESS compare (~0.31415927E1, 0.0) = LESS compareReal (~0.31415927E1, 0.0) = LESS compare (~0.31415927E1, ~0.34028235E39) = GREATER compareReal (~0.31415927E1, ~0.34028235E39) = GREATER compare (~0.31415927E1, ~0.17014117E39) = GREATER compareReal (~0.31415927E1, ~0.17014117E39) = GREATER compare (~0.31415927E1, ~0.123E4) = GREATER compareReal (~0.31415927E1, ~0.123E4) = GREATER compare (~0.31415927E1, ~0.123E2) = GREATER compareReal (~0.31415927E1, ~0.123E2) = GREATER compare (~0.31415927E1, ~0.31415927E1) = EQUAL compareReal (~0.31415927E1, ~0.31415927E1) = EQUAL compare (~0.31415927E1, ~0.27182817E1) = LESS compareReal (~0.31415927E1, ~0.27182817E1) = LESS compare (~0.31415927E1, ~0.123E1) = LESS compareReal (~0.31415927E1, ~0.123E1) = LESS compare (~0.31415927E1, ~0.123) = LESS compareReal (~0.31415927E1, ~0.123) = LESS compare (~0.31415927E1, ~0.123E~2) = LESS compareReal (~0.31415927E1, ~0.123E~2) = LESS compare (~0.31415927E1, ~0.11754944E~37) = LESS compareReal (~0.31415927E1, ~0.11754944E~37) = LESS compare (~0.31415927E1, ~0.5877472E~38) = LESS compareReal (~0.31415927E1, ~0.5877472E~38) = LESS compare (~0.31415927E1, ~0.1E~44) = LESS compareReal (~0.31415927E1, ~0.1E~44) = LESS compare (~0.31415927E1, ~0.0) = LESS compareReal (~0.31415927E1, ~0.0) = LESS compare (~0.27182817E1, 0.34028235E39) = LESS compareReal (~0.27182817E1, 0.34028235E39) = LESS compare (~0.27182817E1, 0.17014117E39) = LESS compareReal (~0.27182817E1, 0.17014117E39) = LESS compare (~0.27182817E1, 0.123E4) = LESS compareReal (~0.27182817E1, 0.123E4) = LESS compare (~0.27182817E1, 0.123E2) = LESS compareReal (~0.27182817E1, 0.123E2) = LESS compare (~0.27182817E1, 0.31415927E1) = LESS compareReal (~0.27182817E1, 0.31415927E1) = LESS compare (~0.27182817E1, 0.27182817E1) = LESS compareReal (~0.27182817E1, 0.27182817E1) = LESS compare (~0.27182817E1, 0.123E1) = LESS compareReal (~0.27182817E1, 0.123E1) = LESS compare (~0.27182817E1, 0.123) = LESS compareReal (~0.27182817E1, 0.123) = LESS compare (~0.27182817E1, 0.123E~2) = LESS compareReal (~0.27182817E1, 0.123E~2) = LESS compare (~0.27182817E1, 0.11754944E~37) = LESS compareReal (~0.27182817E1, 0.11754944E~37) = LESS compare (~0.27182817E1, 0.5877472E~38) = LESS compareReal (~0.27182817E1, 0.5877472E~38) = LESS compare (~0.27182817E1, 0.1E~44) = LESS compareReal (~0.27182817E1, 0.1E~44) = LESS compare (~0.27182817E1, 0.0) = LESS compareReal (~0.27182817E1, 0.0) = LESS compare (~0.27182817E1, ~0.34028235E39) = GREATER compareReal (~0.27182817E1, ~0.34028235E39) = GREATER compare (~0.27182817E1, ~0.17014117E39) = GREATER compareReal (~0.27182817E1, ~0.17014117E39) = GREATER compare (~0.27182817E1, ~0.123E4) = GREATER compareReal (~0.27182817E1, ~0.123E4) = GREATER compare (~0.27182817E1, ~0.123E2) = GREATER compareReal (~0.27182817E1, ~0.123E2) = GREATER compare (~0.27182817E1, ~0.31415927E1) = GREATER compareReal (~0.27182817E1, ~0.31415927E1) = GREATER compare (~0.27182817E1, ~0.27182817E1) = EQUAL compareReal (~0.27182817E1, ~0.27182817E1) = EQUAL compare (~0.27182817E1, ~0.123E1) = LESS compareReal (~0.27182817E1, ~0.123E1) = LESS compare (~0.27182817E1, ~0.123) = LESS compareReal (~0.27182817E1, ~0.123) = LESS compare (~0.27182817E1, ~0.123E~2) = LESS compareReal (~0.27182817E1, ~0.123E~2) = LESS compare (~0.27182817E1, ~0.11754944E~37) = LESS compareReal (~0.27182817E1, ~0.11754944E~37) = LESS compare (~0.27182817E1, ~0.5877472E~38) = LESS compareReal (~0.27182817E1, ~0.5877472E~38) = LESS compare (~0.27182817E1, ~0.1E~44) = LESS compareReal (~0.27182817E1, ~0.1E~44) = LESS compare (~0.27182817E1, ~0.0) = LESS compareReal (~0.27182817E1, ~0.0) = LESS compare (~0.123E1, 0.34028235E39) = LESS compareReal (~0.123E1, 0.34028235E39) = LESS compare (~0.123E1, 0.17014117E39) = LESS compareReal (~0.123E1, 0.17014117E39) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.31415927E1) = LESS compareReal (~0.123E1, 0.31415927E1) = LESS compare (~0.123E1, 0.27182817E1) = LESS compareReal (~0.123E1, 0.27182817E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.11754944E~37) = LESS compareReal (~0.123E1, 0.11754944E~37) = LESS compare (~0.123E1, 0.5877472E~38) = LESS compareReal (~0.123E1, 0.5877472E~38) = LESS compare (~0.123E1, 0.1E~44) = LESS compareReal (~0.123E1, 0.1E~44) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.34028235E39) = GREATER compareReal (~0.123E1, ~0.34028235E39) = GREATER compare (~0.123E1, ~0.17014117E39) = GREATER compareReal (~0.123E1, ~0.17014117E39) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.31415927E1) = GREATER compareReal (~0.123E1, ~0.31415927E1) = GREATER compare (~0.123E1, ~0.27182817E1) = GREATER compareReal (~0.123E1, ~0.27182817E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.11754944E~37) = LESS compareReal (~0.123E1, ~0.11754944E~37) = LESS compare (~0.123E1, ~0.5877472E~38) = LESS compareReal (~0.123E1, ~0.5877472E~38) = LESS compare (~0.123E1, ~0.1E~44) = LESS compareReal (~0.123E1, ~0.1E~44) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.34028235E39) = LESS compareReal (~0.123, 0.34028235E39) = LESS compare (~0.123, 0.17014117E39) = LESS compareReal (~0.123, 0.17014117E39) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.31415927E1) = LESS compareReal (~0.123, 0.31415927E1) = LESS compare (~0.123, 0.27182817E1) = LESS compareReal (~0.123, 0.27182817E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.11754944E~37) = LESS compareReal (~0.123, 0.11754944E~37) = LESS compare (~0.123, 0.5877472E~38) = LESS compareReal (~0.123, 0.5877472E~38) = LESS compare (~0.123, 0.1E~44) = LESS compareReal (~0.123, 0.1E~44) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.34028235E39) = GREATER compareReal (~0.123, ~0.34028235E39) = GREATER compare (~0.123, ~0.17014117E39) = GREATER compareReal (~0.123, ~0.17014117E39) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.31415927E1) = GREATER compareReal (~0.123, ~0.31415927E1) = GREATER compare (~0.123, ~0.27182817E1) = GREATER compareReal (~0.123, ~0.27182817E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.11754944E~37) = LESS compareReal (~0.123, ~0.11754944E~37) = LESS compare (~0.123, ~0.5877472E~38) = LESS compareReal (~0.123, ~0.5877472E~38) = LESS compare (~0.123, ~0.1E~44) = LESS compareReal (~0.123, ~0.1E~44) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.34028235E39) = LESS compareReal (~0.123E~2, 0.34028235E39) = LESS compare (~0.123E~2, 0.17014117E39) = LESS compareReal (~0.123E~2, 0.17014117E39) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.31415927E1) = LESS compareReal (~0.123E~2, 0.31415927E1) = LESS compare (~0.123E~2, 0.27182817E1) = LESS compareReal (~0.123E~2, 0.27182817E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.11754944E~37) = LESS compareReal (~0.123E~2, 0.11754944E~37) = LESS compare (~0.123E~2, 0.5877472E~38) = LESS compareReal (~0.123E~2, 0.5877472E~38) = LESS compare (~0.123E~2, 0.1E~44) = LESS compareReal (~0.123E~2, 0.1E~44) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.34028235E39) = GREATER compareReal (~0.123E~2, ~0.34028235E39) = GREATER compare (~0.123E~2, ~0.17014117E39) = GREATER compareReal (~0.123E~2, ~0.17014117E39) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.31415927E1) = GREATER compareReal (~0.123E~2, ~0.31415927E1) = GREATER compare (~0.123E~2, ~0.27182817E1) = GREATER compareReal (~0.123E~2, ~0.27182817E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.11754944E~37) = LESS compareReal (~0.123E~2, ~0.11754944E~37) = LESS compare (~0.123E~2, ~0.5877472E~38) = LESS compareReal (~0.123E~2, ~0.5877472E~38) = LESS compare (~0.123E~2, ~0.1E~44) = LESS compareReal (~0.123E~2, ~0.1E~44) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.11754944E~37, 0.34028235E39) = LESS compareReal (~0.11754944E~37, 0.34028235E39) = LESS compare (~0.11754944E~37, 0.17014117E39) = LESS compareReal (~0.11754944E~37, 0.17014117E39) = LESS compare (~0.11754944E~37, 0.123E4) = LESS compareReal (~0.11754944E~37, 0.123E4) = LESS compare (~0.11754944E~37, 0.123E2) = LESS compareReal (~0.11754944E~37, 0.123E2) = LESS compare (~0.11754944E~37, 0.31415927E1) = LESS compareReal (~0.11754944E~37, 0.31415927E1) = LESS compare (~0.11754944E~37, 0.27182817E1) = LESS compareReal (~0.11754944E~37, 0.27182817E1) = LESS compare (~0.11754944E~37, 0.123E1) = LESS compareReal (~0.11754944E~37, 0.123E1) = LESS compare (~0.11754944E~37, 0.123) = LESS compareReal (~0.11754944E~37, 0.123) = LESS compare (~0.11754944E~37, 0.123E~2) = LESS compareReal (~0.11754944E~37, 0.123E~2) = LESS compare (~0.11754944E~37, 0.11754944E~37) = LESS compareReal (~0.11754944E~37, 0.11754944E~37) = LESS compare (~0.11754944E~37, 0.5877472E~38) = LESS compareReal (~0.11754944E~37, 0.5877472E~38) = LESS compare (~0.11754944E~37, 0.1E~44) = LESS compareReal (~0.11754944E~37, 0.1E~44) = LESS compare (~0.11754944E~37, 0.0) = LESS compareReal (~0.11754944E~37, 0.0) = LESS compare (~0.11754944E~37, ~0.34028235E39) = GREATER compareReal (~0.11754944E~37, ~0.34028235E39) = GREATER compare (~0.11754944E~37, ~0.17014117E39) = GREATER compareReal (~0.11754944E~37, ~0.17014117E39) = GREATER compare (~0.11754944E~37, ~0.123E4) = GREATER compareReal (~0.11754944E~37, ~0.123E4) = GREATER compare (~0.11754944E~37, ~0.123E2) = GREATER compareReal (~0.11754944E~37, ~0.123E2) = GREATER compare (~0.11754944E~37, ~0.31415927E1) = GREATER compareReal (~0.11754944E~37, ~0.31415927E1) = GREATER compare (~0.11754944E~37, ~0.27182817E1) = GREATER compareReal (~0.11754944E~37, ~0.27182817E1) = GREATER compare (~0.11754944E~37, ~0.123E1) = GREATER compareReal (~0.11754944E~37, ~0.123E1) = GREATER compare (~0.11754944E~37, ~0.123) = GREATER compareReal (~0.11754944E~37, ~0.123) = GREATER compare (~0.11754944E~37, ~0.123E~2) = GREATER compareReal (~0.11754944E~37, ~0.123E~2) = GREATER compare (~0.11754944E~37, ~0.11754944E~37) = EQUAL compareReal (~0.11754944E~37, ~0.11754944E~37) = EQUAL compare (~0.11754944E~37, ~0.5877472E~38) = LESS compareReal (~0.11754944E~37, ~0.5877472E~38) = LESS compare (~0.11754944E~37, ~0.1E~44) = LESS compareReal (~0.11754944E~37, ~0.1E~44) = LESS compare (~0.11754944E~37, ~0.0) = LESS compareReal (~0.11754944E~37, ~0.0) = LESS compare (~0.5877472E~38, 0.34028235E39) = LESS compareReal (~0.5877472E~38, 0.34028235E39) = LESS compare (~0.5877472E~38, 0.17014117E39) = LESS compareReal (~0.5877472E~38, 0.17014117E39) = LESS compare (~0.5877472E~38, 0.123E4) = LESS compareReal (~0.5877472E~38, 0.123E4) = LESS compare (~0.5877472E~38, 0.123E2) = LESS compareReal (~0.5877472E~38, 0.123E2) = LESS compare (~0.5877472E~38, 0.31415927E1) = LESS compareReal (~0.5877472E~38, 0.31415927E1) = LESS compare (~0.5877472E~38, 0.27182817E1) = LESS compareReal (~0.5877472E~38, 0.27182817E1) = LESS compare (~0.5877472E~38, 0.123E1) = LESS compareReal (~0.5877472E~38, 0.123E1) = LESS compare (~0.5877472E~38, 0.123) = LESS compareReal (~0.5877472E~38, 0.123) = LESS compare (~0.5877472E~38, 0.123E~2) = LESS compareReal (~0.5877472E~38, 0.123E~2) = LESS compare (~0.5877472E~38, 0.11754944E~37) = LESS compareReal (~0.5877472E~38, 0.11754944E~37) = LESS compare (~0.5877472E~38, 0.5877472E~38) = LESS compareReal (~0.5877472E~38, 0.5877472E~38) = LESS compare (~0.5877472E~38, 0.1E~44) = LESS compareReal (~0.5877472E~38, 0.1E~44) = LESS compare (~0.5877472E~38, 0.0) = LESS compareReal (~0.5877472E~38, 0.0) = LESS compare (~0.5877472E~38, ~0.34028235E39) = GREATER compareReal (~0.5877472E~38, ~0.34028235E39) = GREATER compare (~0.5877472E~38, ~0.17014117E39) = GREATER compareReal (~0.5877472E~38, ~0.17014117E39) = GREATER compare (~0.5877472E~38, ~0.123E4) = GREATER compareReal (~0.5877472E~38, ~0.123E4) = GREATER compare (~0.5877472E~38, ~0.123E2) = GREATER compareReal (~0.5877472E~38, ~0.123E2) = GREATER compare (~0.5877472E~38, ~0.31415927E1) = GREATER compareReal (~0.5877472E~38, ~0.31415927E1) = GREATER compare (~0.5877472E~38, ~0.27182817E1) = GREATER compareReal (~0.5877472E~38, ~0.27182817E1) = GREATER compare (~0.5877472E~38, ~0.123E1) = GREATER compareReal (~0.5877472E~38, ~0.123E1) = GREATER compare (~0.5877472E~38, ~0.123) = GREATER compareReal (~0.5877472E~38, ~0.123) = GREATER compare (~0.5877472E~38, ~0.123E~2) = GREATER compareReal (~0.5877472E~38, ~0.123E~2) = GREATER compare (~0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (~0.5877472E~38, ~0.11754944E~37) = GREATER compare (~0.5877472E~38, ~0.5877472E~38) = EQUAL compareReal (~0.5877472E~38, ~0.5877472E~38) = EQUAL compare (~0.5877472E~38, ~0.1E~44) = LESS compareReal (~0.5877472E~38, ~0.1E~44) = LESS compare (~0.5877472E~38, ~0.0) = LESS compareReal (~0.5877472E~38, ~0.0) = LESS compare (~0.1E~44, 0.34028235E39) = LESS compareReal (~0.1E~44, 0.34028235E39) = LESS compare (~0.1E~44, 0.17014117E39) = LESS compareReal (~0.1E~44, 0.17014117E39) = LESS compare (~0.1E~44, 0.123E4) = LESS compareReal (~0.1E~44, 0.123E4) = LESS compare (~0.1E~44, 0.123E2) = LESS compareReal (~0.1E~44, 0.123E2) = LESS compare (~0.1E~44, 0.31415927E1) = LESS compareReal (~0.1E~44, 0.31415927E1) = LESS compare (~0.1E~44, 0.27182817E1) = LESS compareReal (~0.1E~44, 0.27182817E1) = LESS compare (~0.1E~44, 0.123E1) = LESS compareReal (~0.1E~44, 0.123E1) = LESS compare (~0.1E~44, 0.123) = LESS compareReal (~0.1E~44, 0.123) = LESS compare (~0.1E~44, 0.123E~2) = LESS compareReal (~0.1E~44, 0.123E~2) = LESS compare (~0.1E~44, 0.11754944E~37) = LESS compareReal (~0.1E~44, 0.11754944E~37) = LESS compare (~0.1E~44, 0.5877472E~38) = LESS compareReal (~0.1E~44, 0.5877472E~38) = LESS compare (~0.1E~44, 0.1E~44) = LESS compareReal (~0.1E~44, 0.1E~44) = LESS compare (~0.1E~44, 0.0) = LESS compareReal (~0.1E~44, 0.0) = LESS compare (~0.1E~44, ~0.34028235E39) = GREATER compareReal (~0.1E~44, ~0.34028235E39) = GREATER compare (~0.1E~44, ~0.17014117E39) = GREATER compareReal (~0.1E~44, ~0.17014117E39) = GREATER compare (~0.1E~44, ~0.123E4) = GREATER compareReal (~0.1E~44, ~0.123E4) = GREATER compare (~0.1E~44, ~0.123E2) = GREATER compareReal (~0.1E~44, ~0.123E2) = GREATER compare (~0.1E~44, ~0.31415927E1) = GREATER compareReal (~0.1E~44, ~0.31415927E1) = GREATER compare (~0.1E~44, ~0.27182817E1) = GREATER compareReal (~0.1E~44, ~0.27182817E1) = GREATER compare (~0.1E~44, ~0.123E1) = GREATER compareReal (~0.1E~44, ~0.123E1) = GREATER compare (~0.1E~44, ~0.123) = GREATER compareReal (~0.1E~44, ~0.123) = GREATER compare (~0.1E~44, ~0.123E~2) = GREATER compareReal (~0.1E~44, ~0.123E~2) = GREATER compare (~0.1E~44, ~0.11754944E~37) = GREATER compareReal (~0.1E~44, ~0.11754944E~37) = GREATER compare (~0.1E~44, ~0.5877472E~38) = GREATER compareReal (~0.1E~44, ~0.5877472E~38) = GREATER compare (~0.1E~44, ~0.1E~44) = EQUAL compareReal (~0.1E~44, ~0.1E~44) = EQUAL compare (~0.1E~44, ~0.0) = LESS compareReal (~0.1E~44, ~0.0) = LESS compare (~0.0, 0.34028235E39) = LESS compareReal (~0.0, 0.34028235E39) = LESS compare (~0.0, 0.17014117E39) = LESS compareReal (~0.0, 0.17014117E39) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.31415927E1) = LESS compareReal (~0.0, 0.31415927E1) = LESS compare (~0.0, 0.27182817E1) = LESS compareReal (~0.0, 0.27182817E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.11754944E~37) = LESS compareReal (~0.0, 0.11754944E~37) = LESS compare (~0.0, 0.5877472E~38) = LESS compareReal (~0.0, 0.5877472E~38) = LESS compare (~0.0, 0.1E~44) = LESS compareReal (~0.0, 0.1E~44) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.34028235E39) = GREATER compareReal (~0.0, ~0.34028235E39) = GREATER compare (~0.0, ~0.17014117E39) = GREATER compareReal (~0.0, ~0.17014117E39) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.31415927E1) = GREATER compareReal (~0.0, ~0.31415927E1) = GREATER compare (~0.0, ~0.27182817E1) = GREATER compareReal (~0.0, ~0.27182817E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.11754944E~37) = GREATER compareReal (~0.0, ~0.11754944E~37) = GREATER compare (~0.0, ~0.5877472E~38) = GREATER compareReal (~0.0, ~0.5877472E~38) = GREATER compare (~0.0, ~0.1E~44) = GREATER compareReal (~0.0, ~0.1E~44) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.17976931348623157E309) = ~0.17976931348623157E309 ~ (0.8988465674311579E308) = ~0.8988465674311579E308 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.3141592653589793E1) = ~0.3141592653589793E1 ~ (0.2718281828459045E1) = ~0.2718281828459045E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.22250738585072014E~307) = ~0.22250738585072014E~307 ~ (0.11125369292536007E~307) = ~0.11125369292536007E~307 ~ (0.5E~323) = ~0.5E~323 ~ (0.0) = ~0.0 ~ (~0.17976931348623157E309) = 0.17976931348623157E309 ~ (~0.8988465674311579E308) = 0.8988465674311579E308 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.3141592653589793E1) = 0.3141592653589793E1 ~ (~0.2718281828459045E1) = 0.2718281828459045E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.22250738585072014E~307) = 0.22250738585072014E~307 ~ (~0.11125369292536007E~307) = 0.11125369292536007E~307 ~ (~0.5E~323) = 0.5E~323 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.17976931348623157E309, 0.17976931348623157E309) = inf + (0.17976931348623157E309, 0.17976931348623157E309) = inf - (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 / (0.17976931348623157E309, 0.17976931348623157E309) = 0.1E1 nextAfter (0.17976931348623157E309, 0.17976931348623157E309) = 0.17976931348623157E309 rem (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, 0.8988465674311579E308) = inf + (0.17976931348623157E309, 0.8988465674311579E308) = inf - (0.17976931348623157E309, 0.8988465674311579E308) = 0.8988465674311579E308 / (0.17976931348623157E309, 0.8988465674311579E308) = 0.2E1 nextAfter (0.17976931348623157E309, 0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, 0.123E4) = inf + (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E4) = 0.1461539134034403E306 nextAfter (0.17976931348623157E309, 0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E4) = 0.0 * (0.17976931348623157E309, 0.123E2) = inf + (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E2) = 0.1461539134034403E308 nextAfter (0.17976931348623157E309, 0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E2) = 0.0 * (0.17976931348623157E309, 0.3141592653589793E1) = inf + (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, 0.2718281828459045E1) = inf + (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.2718281828459045E1) = 0.661334345850887E308 nextAfter (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123E1) = inf + (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E1) = 0.1461539134034403E309 nextAfter (0.17976931348623157E309, 0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123) = 0.22111625558806483E308 + (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123) = inf nextAfter (0.17976931348623157E309, 0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123) = ~inf * (0.17976931348623157E309, 0.123E~2) = 0.2211162555880648E306 + (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E~2) = inf nextAfter (0.17976931348623157E309, 0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E~2) = ~inf * (0.17976931348623157E309, 0.22250738585072014E~307) = 0.39999999999999996E1 + (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.22250738585072014E~307) = inf nextAfter (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, 0.11125369292536007E~307) = 0.19999999999999998E1 + (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.11125369292536007E~307) = inf nextAfter (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, 0.5E~323) = 0.8881784197001251E~15 + (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.5E~323) = inf nextAfter (0.17976931348623157E309, 0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.5E~323) = ~inf * (0.17976931348623157E309, 0.0) = 0.0 + (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.0) = inf nextAfter (0.17976931348623157E309, 0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.0) = nan * (0.17976931348623157E309, ~0.17976931348623157E309) = ~inf + (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 - (0.17976931348623157E309, ~0.17976931348623157E309) = inf / (0.17976931348623157E309, ~0.17976931348623157E309) = ~0.1E1 nextAfter (0.17976931348623157E309, ~0.17976931348623157E309) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, ~0.8988465674311579E308) = ~inf + (0.17976931348623157E309, ~0.8988465674311579E308) = 0.8988465674311579E308 - (0.17976931348623157E309, ~0.8988465674311579E308) = inf / (0.17976931348623157E309, ~0.8988465674311579E308) = ~0.2E1 nextAfter (0.17976931348623157E309, ~0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, ~0.123E4) = ~inf + (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E4) = ~0.1461539134034403E306 nextAfter (0.17976931348623157E309, ~0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E4) = 0.0 * (0.17976931348623157E309, ~0.123E2) = ~inf + (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E2) = ~0.1461539134034403E308 nextAfter (0.17976931348623157E309, ~0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E2) = 0.0 * (0.17976931348623157E309, ~0.3141592653589793E1) = ~inf + (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, ~0.2718281828459045E1) = ~inf + (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123E1) = ~inf + (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E1) = ~0.1461539134034403E309 nextAfter (0.17976931348623157E309, ~0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123) = ~0.22111625558806483E308 + (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123) = ~inf nextAfter (0.17976931348623157E309, ~0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123) = ~inf * (0.17976931348623157E309, ~0.123E~2) = ~0.2211162555880648E306 + (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E~2) = ~inf nextAfter (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E~2) = ~inf * (0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.39999999999999996E1 + (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.19999999999999998E1 + (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, ~0.5E~323) = ~0.8881784197001251E~15 + (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.5E~323) = ~inf nextAfter (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.5E~323) = ~inf * (0.17976931348623157E309, ~0.0) = ~0.0 + (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.0) = ~inf nextAfter (0.17976931348623157E309, ~0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.0) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.17976931348623157E309, ~inf) = ~inf + (0.17976931348623157E309, ~inf) = ~inf - (0.17976931348623157E309, ~inf) = inf / (0.17976931348623157E309, ~inf) = ~0.0 nextAfter (0.17976931348623157E309, ~inf) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~inf) = 0.17976931348623157E309 * (0.17976931348623157E309, nan) = nan + (0.17976931348623157E309, nan) = nan - (0.17976931348623157E309, nan) = nan / (0.17976931348623157E309, nan) = nan nextAfter (0.17976931348623157E309, nan) = nan rem (0.17976931348623157E309, nan) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.8988465674311579E308, 0.17976931348623157E309) = inf + (0.8988465674311579E308, 0.17976931348623157E309) = inf - (0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 / (0.8988465674311579E308, 0.17976931348623157E309) = 0.5 nextAfter (0.8988465674311579E308, 0.17976931348623157E309) = 0.898846567431158E308 rem (0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, 0.8988465674311579E308) = inf + (0.8988465674311579E308, 0.8988465674311579E308) = 0.17976931348623157E309 - (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 / (0.8988465674311579E308, 0.8988465674311579E308) = 0.1E1 nextAfter (0.8988465674311579E308, 0.8988465674311579E308) = 0.8988465674311579E308 rem (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, 0.123E4) = inf + (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E4) = 0.7307695670172015E305 nextAfter (0.8988465674311579E308, 0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E4) = 0.0 * (0.8988465674311579E308, 0.123E2) = inf + (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E2) = 0.7307695670172014E307 nextAfter (0.8988465674311579E308, 0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E2) = 0.0 * (0.8988465674311579E308, 0.3141592653589793E1) = inf + (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, 0.2718281828459045E1) = inf + (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123E1) = 0.1105581277940324E309 + (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E1) = 0.7307695670172015E308 nextAfter (0.8988465674311579E308, 0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123) = 0.11055812779403241E308 + (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123) = inf nextAfter (0.8988465674311579E308, 0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123) = ~inf * (0.8988465674311579E308, 0.123E~2) = 0.1105581277940324E306 + (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E~2) = inf nextAfter (0.8988465674311579E308, 0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E~2) = ~inf * (0.8988465674311579E308, 0.22250738585072014E~307) = 0.19999999999999998E1 + (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.22250738585072014E~307) = inf nextAfter (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, 0.11125369292536007E~307) = 0.9999999999999999 + (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.11125369292536007E~307) = inf nextAfter (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, 0.5E~323) = 0.44408920985006257E~15 + (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.5E~323) = inf nextAfter (0.8988465674311579E308, 0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.5E~323) = ~inf * (0.8988465674311579E308, 0.0) = 0.0 + (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.0) = inf nextAfter (0.8988465674311579E308, 0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.0) = nan * (0.8988465674311579E308, ~0.17976931348623157E309) = ~inf + (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 - (0.8988465674311579E308, ~0.17976931348623157E309) = inf / (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.5 nextAfter (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, ~0.8988465674311579E308) = ~inf + (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 - (0.8988465674311579E308, ~0.8988465674311579E308) = 0.17976931348623157E309 / (0.8988465674311579E308, ~0.8988465674311579E308) = ~0.1E1 nextAfter (0.8988465674311579E308, ~0.8988465674311579E308) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, ~0.123E4) = ~inf + (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E4) = ~0.7307695670172015E305 nextAfter (0.8988465674311579E308, ~0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E4) = 0.0 * (0.8988465674311579E308, ~0.123E2) = ~inf + (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E2) = ~0.7307695670172014E307 nextAfter (0.8988465674311579E308, ~0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E2) = 0.0 * (0.8988465674311579E308, ~0.3141592653589793E1) = ~inf + (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, ~0.2718281828459045E1) = ~inf + (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123E1) = ~0.1105581277940324E309 + (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E1) = ~0.7307695670172015E308 nextAfter (0.8988465674311579E308, ~0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123) = ~0.11055812779403241E308 + (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123) = ~inf nextAfter (0.8988465674311579E308, ~0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123) = ~inf * (0.8988465674311579E308, ~0.123E~2) = ~0.1105581277940324E306 + (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E~2) = ~inf nextAfter (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E~2) = ~inf * (0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.19999999999999998E1 + (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.9999999999999999 + (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, ~0.5E~323) = ~0.44408920985006257E~15 + (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.5E~323) = ~inf nextAfter (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.5E~323) = ~inf * (0.8988465674311579E308, ~0.0) = ~0.0 + (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.0) = ~inf nextAfter (0.8988465674311579E308, ~0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.0) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.8988465674311579E308, ~inf) = ~inf + (0.8988465674311579E308, ~inf) = ~inf - (0.8988465674311579E308, ~inf) = inf / (0.8988465674311579E308, ~inf) = ~0.0 nextAfter (0.8988465674311579E308, ~inf) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~inf) = 0.8988465674311579E308 * (0.8988465674311579E308, nan) = nan + (0.8988465674311579E308, nan) = nan - (0.8988465674311579E308, nan) = nan / (0.8988465674311579E308, nan) = nan nextAfter (0.8988465674311579E308, nan) = nan rem (0.8988465674311579E308, nan) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.123E4, 0.17976931348623157E309) = inf + (0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E4, 0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (0.123E4, 0.17976931348623157E309) = 0.12300000000000002E4 rem (0.123E4, 0.17976931348623157E309) = 0.123E4 * (0.123E4, 0.8988465674311579E308) = inf + (0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E4, 0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (0.123E4, 0.8988465674311579E308) = 0.12300000000000002E4 rem (0.123E4, 0.8988465674311579E308) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999999999998E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.3141592653589793E1) = 0.38641589639154454E4 + (0.123E4, 0.3141592653589793E1) = 0.123314159265359E4 - (0.123E4, 0.3141592653589793E1) = 0.122685840734641E4 / (0.123E4, 0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (0.123E4, 0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, 0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, 0.2718281828459045E1) = 0.33434866490046256E4 + (0.123E4, 0.2718281828459045E1) = 0.1232718281828459E4 - (0.123E4, 0.2718281828459045E1) = 0.1227281718171541E4 / (0.123E4, 0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (0.123E4, 0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, 0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999999999998E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999999999998E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129E1 + (0.123E4, 0.123E~2) = 0.123000123E4 - (0.123E4, 0.123E~2) = 0.122999877E4 / (0.123E4, 0.123E~2) = 0.1E7 nextAfter (0.123E4, 0.123E~2) = 0.12299999999999998E4 rem (0.123E4, 0.123E~2) = 0.0 * (0.123E4, 0.22250738585072014E~307) = 0.27368408459638577E~304 + (0.123E4, 0.22250738585072014E~307) = 0.123E4 - (0.123E4, 0.22250738585072014E~307) = 0.123E4 / (0.123E4, 0.22250738585072014E~307) = inf nextAfter (0.123E4, 0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, 0.22250738585072014E~307) = ~inf * (0.123E4, 0.11125369292536007E~307) = 0.13684204229819289E~304 + (0.123E4, 0.11125369292536007E~307) = 0.123E4 - (0.123E4, 0.11125369292536007E~307) = 0.123E4 / (0.123E4, 0.11125369292536007E~307) = inf nextAfter (0.123E4, 0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, 0.11125369292536007E~307) = ~inf * (0.123E4, 0.5E~323) = 0.6077E~320 + (0.123E4, 0.5E~323) = 0.123E4 - (0.123E4, 0.5E~323) = 0.123E4 / (0.123E4, 0.5E~323) = inf nextAfter (0.123E4, 0.5E~323) = 0.12299999999999998E4 rem (0.123E4, 0.5E~323) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999999999998E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.17976931348623157E309) = ~inf + (0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E4, ~0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (0.123E4, ~0.17976931348623157E309) = 0.12299999999999998E4 rem (0.123E4, ~0.17976931348623157E309) = 0.123E4 * (0.123E4, ~0.8988465674311579E308) = ~inf + (0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E4, ~0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (0.123E4, ~0.8988465674311579E308) = 0.12299999999999998E4 rem (0.123E4, ~0.8988465674311579E308) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999999999998E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.3141592653589793E1) = ~0.38641589639154454E4 + (0.123E4, ~0.3141592653589793E1) = 0.122685840734641E4 - (0.123E4, ~0.3141592653589793E1) = 0.123314159265359E4 / (0.123E4, ~0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (0.123E4, ~0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, ~0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, ~0.2718281828459045E1) = ~0.33434866490046256E4 + (0.123E4, ~0.2718281828459045E1) = 0.1227281718171541E4 - (0.123E4, ~0.2718281828459045E1) = 0.1232718281828459E4 / (0.123E4, ~0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (0.123E4, ~0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, ~0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999999999998E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999999999998E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129E1 + (0.123E4, ~0.123E~2) = 0.122999877E4 - (0.123E4, ~0.123E~2) = 0.123000123E4 / (0.123E4, ~0.123E~2) = ~0.1E7 nextAfter (0.123E4, ~0.123E~2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E~2) = 0.0 * (0.123E4, ~0.22250738585072014E~307) = ~0.27368408459638577E~304 + (0.123E4, ~0.22250738585072014E~307) = 0.123E4 - (0.123E4, ~0.22250738585072014E~307) = 0.123E4 / (0.123E4, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E4, ~0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.22250738585072014E~307) = ~inf * (0.123E4, ~0.11125369292536007E~307) = ~0.13684204229819289E~304 + (0.123E4, ~0.11125369292536007E~307) = 0.123E4 - (0.123E4, ~0.11125369292536007E~307) = 0.123E4 / (0.123E4, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E4, ~0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.11125369292536007E~307) = ~inf * (0.123E4, ~0.5E~323) = ~0.6077E~320 + (0.123E4, ~0.5E~323) = 0.123E4 - (0.123E4, ~0.5E~323) = 0.123E4 / (0.123E4, ~0.5E~323) = ~inf nextAfter (0.123E4, ~0.5E~323) = 0.12299999999999998E4 rem (0.123E4, ~0.5E~323) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999999999998E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999999999998E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.17976931348623157E309) = inf + (0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E2, 0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (0.123E2, 0.17976931348623157E309) = 0.12300000000000002E2 rem (0.123E2, 0.17976931348623157E309) = 0.123E2 * (0.123E2, 0.8988465674311579E308) = inf + (0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E2, 0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (0.123E2, 0.8988465674311579E308) = 0.12300000000000002E2 rem (0.123E2, 0.8988465674311579E308) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300000000000002E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129000000000002E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.3141592653589793E1) = 0.3864158963915446E2 + (0.123E2, 0.3141592653589793E1) = 0.15441592653589794E2 - (0.123E2, 0.3141592653589793E1) = 0.9158407346410208E1 / (0.123E2, 0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (0.123E2, 0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, 0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, 0.2718281828459045E1) = 0.33434866490046254E2 + (0.123E2, 0.2718281828459045E1) = 0.15018281828459045E2 - (0.123E2, 0.2718281828459045E1) = 0.9581718171540956E1 / (0.123E2, 0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (0.123E2, 0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, 0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, 0.123E1) = 0.15129000000000001E2 + (0.123E2, 0.123E1) = 0.13530000000000001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999999999999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129000000000001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177000000000001E2 / (0.123E2, 0.123) = 0.10000000000000001E3 nextAfter (0.123E2, 0.123) = 0.12299999999999999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.12298770000000001E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999999999999E2 rem (0.123E2, 0.123E~2) = 0.17763568394002505E~14 * (0.123E2, 0.22250738585072014E~307) = 0.2736840845963858E~306 + (0.123E2, 0.22250738585072014E~307) = 0.123E2 - (0.123E2, 0.22250738585072014E~307) = 0.123E2 / (0.123E2, 0.22250738585072014E~307) = inf nextAfter (0.123E2, 0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, 0.22250738585072014E~307) = ~inf * (0.123E2, 0.11125369292536007E~307) = 0.1368420422981929E~306 + (0.123E2, 0.11125369292536007E~307) = 0.123E2 - (0.123E2, 0.11125369292536007E~307) = 0.123E2 / (0.123E2, 0.11125369292536007E~307) = inf nextAfter (0.123E2, 0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, 0.11125369292536007E~307) = ~inf * (0.123E2, 0.5E~323) = 0.6E~322 + (0.123E2, 0.5E~323) = 0.123E2 - (0.123E2, 0.5E~323) = 0.123E2 / (0.123E2, 0.5E~323) = inf nextAfter (0.123E2, 0.5E~323) = 0.12299999999999999E2 rem (0.123E2, 0.5E~323) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999999999999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.17976931348623157E309) = ~inf + (0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E2, ~0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (0.123E2, ~0.17976931348623157E309) = 0.12299999999999999E2 rem (0.123E2, ~0.17976931348623157E309) = 0.123E2 * (0.123E2, ~0.8988465674311579E308) = ~inf + (0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E2, ~0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (0.123E2, ~0.8988465674311579E308) = 0.12299999999999999E2 rem (0.123E2, ~0.8988465674311579E308) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999999999999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129000000000002E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.3141592653589793E1) = ~0.3864158963915446E2 + (0.123E2, ~0.3141592653589793E1) = 0.9158407346410208E1 - (0.123E2, ~0.3141592653589793E1) = 0.15441592653589794E2 / (0.123E2, ~0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (0.123E2, ~0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, ~0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, ~0.2718281828459045E1) = ~0.33434866490046254E2 + (0.123E2, ~0.2718281828459045E1) = 0.9581718171540956E1 - (0.123E2, ~0.2718281828459045E1) = 0.15018281828459045E2 / (0.123E2, ~0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (0.123E2, ~0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, ~0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, ~0.123E1) = ~0.15129000000000001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530000000000001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999999999999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129000000000001E1 + (0.123E2, ~0.123) = 0.12177000000000001E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.10000000000000001E3 nextAfter (0.123E2, ~0.123) = 0.12299999999999999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129E~1 + (0.123E2, ~0.123E~2) = 0.12298770000000001E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E~2) = 0.17763568394002505E~14 * (0.123E2, ~0.22250738585072014E~307) = ~0.2736840845963858E~306 + (0.123E2, ~0.22250738585072014E~307) = 0.123E2 - (0.123E2, ~0.22250738585072014E~307) = 0.123E2 / (0.123E2, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E2, ~0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.22250738585072014E~307) = ~inf * (0.123E2, ~0.11125369292536007E~307) = ~0.1368420422981929E~306 + (0.123E2, ~0.11125369292536007E~307) = 0.123E2 - (0.123E2, ~0.11125369292536007E~307) = 0.123E2 / (0.123E2, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E2, ~0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.11125369292536007E~307) = ~inf * (0.123E2, ~0.5E~323) = ~0.6E~322 + (0.123E2, ~0.5E~323) = 0.123E2 - (0.123E2, ~0.5E~323) = 0.123E2 / (0.123E2, ~0.5E~323) = ~inf nextAfter (0.123E2, ~0.5E~323) = 0.12299999999999999E2 rem (0.123E2, ~0.5E~323) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999999999999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999999999999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.3141592653589793E1, 0.17976931348623157E309) = inf + (0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.3141592653589793E1, 0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (0.3141592653589793E1, 0.17976931348623157E309) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.8988465674311579E308) = inf + (0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.3141592653589793E1, 0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (0.3141592653589793E1, 0.8988465674311579E308) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E4) = 0.38641589639154454E4 + (0.3141592653589793E1, 0.123E4) = 0.123314159265359E4 - (0.3141592653589793E1, 0.123E4) = ~0.122685840734641E4 / (0.3141592653589793E1, 0.123E4) = 0.25541403687721893E~2 nextAfter (0.3141592653589793E1, 0.123E4) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E2) = 0.3864158963915446E2 + (0.3141592653589793E1, 0.123E2) = 0.15441592653589794E2 - (0.3141592653589793E1, 0.123E2) = ~0.9158407346410208E1 / (0.3141592653589793E1, 0.123E2) = 0.2554140368772189 nextAfter (0.3141592653589793E1, 0.123E2) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.3141592653589793E1) = 0.9869604401089358E1 + (0.3141592653589793E1, 0.3141592653589793E1) = 0.6283185307179586E1 - (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 / (0.3141592653589793E1, 0.3141592653589793E1) = 0.1E1 nextAfter (0.3141592653589793E1, 0.3141592653589793E1) = 0.3141592653589793E1 rem (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, 0.2718281828459045E1) = 0.8539734222673566E1 + (0.3141592653589793E1, 0.2718281828459045E1) = 0.5859874482048838E1 - (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 / (0.3141592653589793E1, 0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (0.3141592653589793E1, 0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, 0.123E1) = 0.38641589639154454E1 + (0.3141592653589793E1, 0.123E1) = 0.43715926535897935E1 - (0.3141592653589793E1, 0.123E1) = 0.19115926535897931E1 / (0.3141592653589793E1, 0.123E1) = 0.25541403687721895E1 nextAfter (0.3141592653589793E1, 0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, 0.123) = 0.38641589639154456 + (0.3141592653589793E1, 0.123) = 0.32645926535897933E1 - (0.3141592653589793E1, 0.123) = 0.3018592653589793E1 / (0.3141592653589793E1, 0.123) = 0.25541403687721896E2 nextAfter (0.3141592653589793E1, 0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, 0.123E~2) = 0.38641589639154456E~2 + (0.3141592653589793E1, 0.123E~2) = 0.3142822653589793E1 - (0.3141592653589793E1, 0.123E~2) = 0.3140362653589793E1 / (0.3141592653589793E1, 0.123E~2) = 0.25541403687721895E4 nextAfter (0.3141592653589793E1, 0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, 0.22250738585072014E~307) = 0.6990275687580919E~307 + (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (0.3141592653589793E1, 0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, 0.11125369292536007E~307) = 0.34951378437904593E~307 + (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.11125369292536007E~307) = inf nextAfter (0.3141592653589793E1, 0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, 0.5E~323) = 0.15E~322 + (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.5E~323) = inf nextAfter (0.3141592653589793E1, 0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.5E~323) = ~inf * (0.3141592653589793E1, 0.0) = 0.0 + (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.0) = inf nextAfter (0.3141592653589793E1, 0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.0) = nan * (0.3141592653589793E1, ~0.17976931348623157E309) = ~inf + (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (0.3141592653589793E1, ~0.17976931348623157E309) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.8988465674311579E308) = ~inf + (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (0.3141592653589793E1, ~0.8988465674311579E308) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E4) = ~0.38641589639154454E4 + (0.3141592653589793E1, ~0.123E4) = ~0.122685840734641E4 - (0.3141592653589793E1, ~0.123E4) = 0.123314159265359E4 / (0.3141592653589793E1, ~0.123E4) = ~0.25541403687721893E~2 nextAfter (0.3141592653589793E1, ~0.123E4) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E2) = ~0.3864158963915446E2 + (0.3141592653589793E1, ~0.123E2) = ~0.9158407346410208E1 - (0.3141592653589793E1, ~0.123E2) = 0.15441592653589794E2 / (0.3141592653589793E1, ~0.123E2) = ~0.2554140368772189 nextAfter (0.3141592653589793E1, ~0.123E2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.9869604401089358E1 + (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 - (0.3141592653589793E1, ~0.3141592653589793E1) = 0.6283185307179586E1 / (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.1E1 nextAfter (0.3141592653589793E1, ~0.3141592653589793E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.8539734222673566E1 + (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 - (0.3141592653589793E1, ~0.2718281828459045E1) = 0.5859874482048838E1 / (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (0.3141592653589793E1, ~0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, ~0.123E1) = ~0.38641589639154454E1 + (0.3141592653589793E1, ~0.123E1) = 0.19115926535897931E1 - (0.3141592653589793E1, ~0.123E1) = 0.43715926535897935E1 / (0.3141592653589793E1, ~0.123E1) = ~0.25541403687721895E1 nextAfter (0.3141592653589793E1, ~0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, ~0.123) = ~0.38641589639154456 + (0.3141592653589793E1, ~0.123) = 0.3018592653589793E1 - (0.3141592653589793E1, ~0.123) = 0.32645926535897933E1 / (0.3141592653589793E1, ~0.123) = ~0.25541403687721896E2 nextAfter (0.3141592653589793E1, ~0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, ~0.123E~2) = ~0.38641589639154456E~2 + (0.3141592653589793E1, ~0.123E~2) = 0.3140362653589793E1 - (0.3141592653589793E1, ~0.123E~2) = 0.3142822653589793E1 / (0.3141592653589793E1, ~0.123E~2) = ~0.25541403687721895E4 nextAfter (0.3141592653589793E1, ~0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.6990275687580919E~307 + (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.34951378437904593E~307 + (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, ~0.5E~323) = ~0.15E~322 + (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.5E~323) = ~inf nextAfter (0.3141592653589793E1, ~0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.5E~323) = ~inf * (0.3141592653589793E1, ~0.0) = ~0.0 + (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.0) = ~inf nextAfter (0.3141592653589793E1, ~0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.0) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.3141592653589793E1, ~inf) = ~inf + (0.3141592653589793E1, ~inf) = ~inf - (0.3141592653589793E1, ~inf) = inf / (0.3141592653589793E1, ~inf) = ~0.0 nextAfter (0.3141592653589793E1, ~inf) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~inf) = 0.3141592653589793E1 * (0.3141592653589793E1, nan) = nan + (0.3141592653589793E1, nan) = nan - (0.3141592653589793E1, nan) = nan / (0.3141592653589793E1, nan) = nan nextAfter (0.3141592653589793E1, nan) = nan rem (0.3141592653589793E1, nan) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.2718281828459045E1, 0.17976931348623157E309) = inf + (0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.2718281828459045E1, 0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (0.2718281828459045E1, 0.17976931348623157E309) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.8988465674311579E308) = inf + (0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.2718281828459045E1, 0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (0.2718281828459045E1, 0.8988465674311579E308) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E4) = 0.33434866490046256E4 + (0.2718281828459045E1, 0.123E4) = 0.1232718281828459E4 - (0.2718281828459045E1, 0.123E4) = ~0.1227281718171541E4 / (0.2718281828459045E1, 0.123E4) = 0.22099852263894678E~2 nextAfter (0.2718281828459045E1, 0.123E4) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E2) = 0.33434866490046254E2 + (0.2718281828459045E1, 0.123E2) = 0.15018281828459045E2 - (0.2718281828459045E1, 0.123E2) = ~0.9581718171540956E1 / (0.2718281828459045E1, 0.123E2) = 0.22099852263894673 nextAfter (0.2718281828459045E1, 0.123E2) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.3141592653589793E1) = 0.8539734222673566E1 + (0.2718281828459045E1, 0.3141592653589793E1) = 0.5859874482048838E1 - (0.2718281828459045E1, 0.3141592653589793E1) = ~0.423310825130748 / (0.2718281828459045E1, 0.3141592653589793E1) = 0.8652559794322651 nextAfter (0.2718281828459045E1, 0.3141592653589793E1) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.2718281828459045E1) = 0.73890560989306495E1 + (0.2718281828459045E1, 0.2718281828459045E1) = 0.543656365691809E1 - (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 / (0.2718281828459045E1, 0.2718281828459045E1) = 0.1E1 nextAfter (0.2718281828459045E1, 0.2718281828459045E1) = 0.2718281828459045E1 rem (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, 0.123E1) = 0.33434866490046256E1 + (0.2718281828459045E1, 0.123E1) = 0.3948281828459045E1 - (0.2718281828459045E1, 0.123E1) = 0.1488281828459045E1 / (0.2718281828459045E1, 0.123E1) = 0.22099852263894677E1 nextAfter (0.2718281828459045E1, 0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, 0.123) = 0.33434866490046256 + (0.2718281828459045E1, 0.123) = 0.2841281828459045E1 - (0.2718281828459045E1, 0.123) = 0.25952818284590453E1 / (0.2718281828459045E1, 0.123) = 0.22099852263894675E2 nextAfter (0.2718281828459045E1, 0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, 0.123E~2) = 0.33434866490046253E~2 + (0.2718281828459045E1, 0.123E~2) = 0.2719511828459045E1 - (0.2718281828459045E1, 0.123E~2) = 0.2717051828459045E1 / (0.2718281828459045E1, 0.123E~2) = 0.22099852263894677E4 nextAfter (0.2718281828459045E1, 0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, 0.22250738585072014E~307) = 0.6048377836559378E~307 + (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (0.2718281828459045E1, 0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, 0.11125369292536007E~307) = 0.3024188918279689E~307 + (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.11125369292536007E~307) = inf nextAfter (0.2718281828459045E1, 0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, 0.5E~323) = 0.15E~322 + (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.5E~323) = inf nextAfter (0.2718281828459045E1, 0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.5E~323) = ~inf * (0.2718281828459045E1, 0.0) = 0.0 + (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.0) = inf nextAfter (0.2718281828459045E1, 0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.0) = nan * (0.2718281828459045E1, ~0.17976931348623157E309) = ~inf + (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (0.2718281828459045E1, ~0.17976931348623157E309) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.8988465674311579E308) = ~inf + (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (0.2718281828459045E1, ~0.8988465674311579E308) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E4) = ~0.33434866490046256E4 + (0.2718281828459045E1, ~0.123E4) = ~0.1227281718171541E4 - (0.2718281828459045E1, ~0.123E4) = 0.1232718281828459E4 / (0.2718281828459045E1, ~0.123E4) = ~0.22099852263894678E~2 nextAfter (0.2718281828459045E1, ~0.123E4) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E2) = ~0.33434866490046254E2 + (0.2718281828459045E1, ~0.123E2) = ~0.9581718171540956E1 - (0.2718281828459045E1, ~0.123E2) = 0.15018281828459045E2 / (0.2718281828459045E1, ~0.123E2) = ~0.22099852263894673 nextAfter (0.2718281828459045E1, ~0.123E2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8539734222673566E1 + (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.423310825130748 - (0.2718281828459045E1, ~0.3141592653589793E1) = 0.5859874482048838E1 / (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8652559794322651 nextAfter (0.2718281828459045E1, ~0.3141592653589793E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.73890560989306495E1 + (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 - (0.2718281828459045E1, ~0.2718281828459045E1) = 0.543656365691809E1 / (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.1E1 nextAfter (0.2718281828459045E1, ~0.2718281828459045E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, ~0.123E1) = ~0.33434866490046256E1 + (0.2718281828459045E1, ~0.123E1) = 0.1488281828459045E1 - (0.2718281828459045E1, ~0.123E1) = 0.3948281828459045E1 / (0.2718281828459045E1, ~0.123E1) = ~0.22099852263894677E1 nextAfter (0.2718281828459045E1, ~0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, ~0.123) = ~0.33434866490046256 + (0.2718281828459045E1, ~0.123) = 0.25952818284590453E1 - (0.2718281828459045E1, ~0.123) = 0.2841281828459045E1 / (0.2718281828459045E1, ~0.123) = ~0.22099852263894675E2 nextAfter (0.2718281828459045E1, ~0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, ~0.123E~2) = ~0.33434866490046253E~2 + (0.2718281828459045E1, ~0.123E~2) = 0.2717051828459045E1 - (0.2718281828459045E1, ~0.123E~2) = 0.2719511828459045E1 / (0.2718281828459045E1, ~0.123E~2) = ~0.22099852263894677E4 nextAfter (0.2718281828459045E1, ~0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.6048377836559378E~307 + (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.3024188918279689E~307 + (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, ~0.5E~323) = ~0.15E~322 + (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.5E~323) = ~inf nextAfter (0.2718281828459045E1, ~0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.5E~323) = ~inf * (0.2718281828459045E1, ~0.0) = ~0.0 + (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.0) = ~inf nextAfter (0.2718281828459045E1, ~0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.0) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.2718281828459045E1, ~inf) = ~inf + (0.2718281828459045E1, ~inf) = ~inf - (0.2718281828459045E1, ~inf) = inf / (0.2718281828459045E1, ~inf) = ~0.0 nextAfter (0.2718281828459045E1, ~inf) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~inf) = 0.2718281828459045E1 * (0.2718281828459045E1, nan) = nan + (0.2718281828459045E1, nan) = nan - (0.2718281828459045E1, nan) = nan / (0.2718281828459045E1, nan) = nan nextAfter (0.2718281828459045E1, nan) = nan rem (0.2718281828459045E1, nan) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.123E1, 0.17976931348623157E309) = inf + (0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E1, 0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (0.123E1, 0.17976931348623157E309) = 0.12300000000000002E1 rem (0.123E1, 0.17976931348623157E309) = 0.123E1 * (0.123E1, 0.8988465674311579E308) = 0.1105581277940324E309 + (0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E1, 0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (0.123E1, 0.8988465674311579E308) = 0.12300000000000002E1 rem (0.123E1, 0.8988465674311579E308) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300000000000002E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129000000000001E2 + (0.123E1, 0.123E2) = 0.13530000000000001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.9999999999999999E~1 nextAfter (0.123E1, 0.123E2) = 0.12300000000000002E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.3141592653589793E1) = 0.38641589639154454E1 + (0.123E1, 0.3141592653589793E1) = 0.43715926535897935E1 - (0.123E1, 0.3141592653589793E1) = ~0.19115926535897931E1 / (0.123E1, 0.3141592653589793E1) = 0.3915211600060625 nextAfter (0.123E1, 0.3141592653589793E1) = 0.12300000000000002E1 rem (0.123E1, 0.3141592653589793E1) = 0.123E1 * (0.123E1, 0.2718281828459045E1) = 0.33434866490046256E1 + (0.123E1, 0.2718281828459045E1) = 0.3948281828459045E1 - (0.123E1, 0.2718281828459045E1) = ~0.1488281828459045E1 / (0.123E1, 0.2718281828459045E1) = 0.45249171264087407 nextAfter (0.123E1, 0.2718281828459045E1) = 0.12300000000000002E1 rem (0.123E1, 0.2718281828459045E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999999999998E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999999999998E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.22250738585072014E~307) = 0.27368408459638577E~307 + (0.123E1, 0.22250738585072014E~307) = 0.123E1 - (0.123E1, 0.22250738585072014E~307) = 0.123E1 / (0.123E1, 0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (0.123E1, 0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, 0.22250738585072014E~307) = 0.0 * (0.123E1, 0.11125369292536007E~307) = 0.1368420422981929E~307 + (0.123E1, 0.11125369292536007E~307) = 0.123E1 - (0.123E1, 0.11125369292536007E~307) = 0.123E1 / (0.123E1, 0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (0.123E1, 0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, 0.11125369292536007E~307) = 0.0 * (0.123E1, 0.5E~323) = 0.5E~323 + (0.123E1, 0.5E~323) = 0.123E1 - (0.123E1, 0.5E~323) = 0.123E1 / (0.123E1, 0.5E~323) = inf nextAfter (0.123E1, 0.5E~323) = 0.12299999999999998E1 rem (0.123E1, 0.5E~323) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999999999998E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.17976931348623157E309) = ~inf + (0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E1, ~0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (0.123E1, ~0.17976931348623157E309) = 0.12299999999999998E1 rem (0.123E1, ~0.17976931348623157E309) = 0.123E1 * (0.123E1, ~0.8988465674311579E308) = ~0.1105581277940324E309 + (0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E1, ~0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (0.123E1, ~0.8988465674311579E308) = 0.12299999999999998E1 rem (0.123E1, ~0.8988465674311579E308) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999999999998E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129000000000001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530000000000001E2 / (0.123E1, ~0.123E2) = ~0.9999999999999999E~1 nextAfter (0.123E1, ~0.123E2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.3141592653589793E1) = ~0.38641589639154454E1 + (0.123E1, ~0.3141592653589793E1) = ~0.19115926535897931E1 - (0.123E1, ~0.3141592653589793E1) = 0.43715926535897935E1 / (0.123E1, ~0.3141592653589793E1) = ~0.3915211600060625 nextAfter (0.123E1, ~0.3141592653589793E1) = 0.12299999999999998E1 rem (0.123E1, ~0.3141592653589793E1) = 0.123E1 * (0.123E1, ~0.2718281828459045E1) = ~0.33434866490046256E1 + (0.123E1, ~0.2718281828459045E1) = ~0.1488281828459045E1 - (0.123E1, ~0.2718281828459045E1) = 0.3948281828459045E1 / (0.123E1, ~0.2718281828459045E1) = ~0.45249171264087407 nextAfter (0.123E1, ~0.2718281828459045E1) = 0.12299999999999998E1 rem (0.123E1, ~0.2718281828459045E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999999999998E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999999999998E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.22250738585072014E~307) = ~0.27368408459638577E~307 + (0.123E1, ~0.22250738585072014E~307) = 0.123E1 - (0.123E1, ~0.22250738585072014E~307) = 0.123E1 / (0.123E1, ~0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (0.123E1, ~0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.22250738585072014E~307) = 0.0 * (0.123E1, ~0.11125369292536007E~307) = ~0.1368420422981929E~307 + (0.123E1, ~0.11125369292536007E~307) = 0.123E1 - (0.123E1, ~0.11125369292536007E~307) = 0.123E1 / (0.123E1, ~0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (0.123E1, ~0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.11125369292536007E~307) = 0.0 * (0.123E1, ~0.5E~323) = ~0.5E~323 + (0.123E1, ~0.5E~323) = 0.123E1 - (0.123E1, ~0.5E~323) = 0.123E1 / (0.123E1, ~0.5E~323) = ~inf nextAfter (0.123E1, ~0.5E~323) = 0.12299999999999998E1 rem (0.123E1, ~0.5E~323) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999999999998E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999999999998E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.17976931348623157E309) = 0.22111625558806483E308 + (0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123, 0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (0.123, 0.17976931348623157E309) = 0.12300000000000001 rem (0.123, 0.17976931348623157E309) = 0.123 * (0.123, 0.8988465674311579E308) = 0.11055812779403241E308 + (0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123, 0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (0.123, 0.8988465674311579E308) = 0.12300000000000001 rem (0.123, 0.8988465674311579E308) = 0.123 * (0.123, 0.123E4) = 0.15129E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.1E~3 nextAfter (0.123, 0.123E4) = 0.12300000000000001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129000000000001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177000000000001E2 / (0.123, 0.123E2) = 0.9999999999999998E~2 nextAfter (0.123, 0.123E2) = 0.12300000000000001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.3141592653589793E1) = 0.38641589639154456 + (0.123, 0.3141592653589793E1) = 0.32645926535897933E1 - (0.123, 0.3141592653589793E1) = ~0.3018592653589793E1 / (0.123, 0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (0.123, 0.3141592653589793E1) = 0.12300000000000001 rem (0.123, 0.3141592653589793E1) = 0.123 * (0.123, 0.2718281828459045E1) = 0.33434866490046256 + (0.123, 0.2718281828459045E1) = 0.2841281828459045E1 - (0.123, 0.2718281828459045E1) = ~0.25952818284590453E1 / (0.123, 0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (0.123, 0.2718281828459045E1) = 0.12300000000000001 rem (0.123, 0.2718281828459045E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300000000000001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.12423 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.12299999999999998 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.22250738585072014E~307) = 0.273684084596386E~308 + (0.123, 0.22250738585072014E~307) = 0.123 - (0.123, 0.22250738585072014E~307) = 0.123 / (0.123, 0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (0.123, 0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, 0.22250738585072014E~307) = 0.0 * (0.123, 0.11125369292536007E~307) = 0.136842042298193E~308 + (0.123, 0.11125369292536007E~307) = 0.123 - (0.123, 0.11125369292536007E~307) = 0.123 / (0.123, 0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (0.123, 0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, 0.11125369292536007E~307) = 0.0 * (0.123, 0.5E~323) = 0.0 + (0.123, 0.5E~323) = 0.123 - (0.123, 0.5E~323) = 0.123 / (0.123, 0.5E~323) = inf nextAfter (0.123, 0.5E~323) = 0.12299999999999998 rem (0.123, 0.5E~323) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.12299999999999998 rem (0.123, 0.0) = nan * (0.123, ~0.17976931348623157E309) = ~0.22111625558806483E308 + (0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123, ~0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (0.123, ~0.17976931348623157E309) = 0.12299999999999998 rem (0.123, ~0.17976931348623157E309) = 0.123 * (0.123, ~0.8988465674311579E308) = ~0.11055812779403241E308 + (0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123, ~0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (0.123, ~0.8988465674311579E308) = 0.12299999999999998 rem (0.123, ~0.8988465674311579E308) = 0.123 * (0.123, ~0.123E4) = ~0.15129E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.1E~3 nextAfter (0.123, ~0.123E4) = 0.12299999999999998 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129000000000001E1 + (0.123, ~0.123E2) = ~0.12177000000000001E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.9999999999999998E~2 nextAfter (0.123, ~0.123E2) = 0.12299999999999998 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.3141592653589793E1) = ~0.38641589639154456 + (0.123, ~0.3141592653589793E1) = ~0.3018592653589793E1 - (0.123, ~0.3141592653589793E1) = 0.32645926535897933E1 / (0.123, ~0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (0.123, ~0.3141592653589793E1) = 0.12299999999999998 rem (0.123, ~0.3141592653589793E1) = 0.123 * (0.123, ~0.2718281828459045E1) = ~0.33434866490046256 + (0.123, ~0.2718281828459045E1) = ~0.25952818284590453E1 - (0.123, ~0.2718281828459045E1) = 0.2841281828459045E1 / (0.123, ~0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (0.123, ~0.2718281828459045E1) = 0.12299999999999998 rem (0.123, ~0.2718281828459045E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.12299999999999998 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.12299999999999998 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.12423 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.12299999999999998 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.22250738585072014E~307) = ~0.273684084596386E~308 + (0.123, ~0.22250738585072014E~307) = 0.123 - (0.123, ~0.22250738585072014E~307) = 0.123 / (0.123, ~0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (0.123, ~0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, ~0.22250738585072014E~307) = 0.0 * (0.123, ~0.11125369292536007E~307) = ~0.136842042298193E~308 + (0.123, ~0.11125369292536007E~307) = 0.123 - (0.123, ~0.11125369292536007E~307) = 0.123 / (0.123, ~0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (0.123, ~0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, ~0.11125369292536007E~307) = 0.0 * (0.123, ~0.5E~323) = ~0.0 + (0.123, ~0.5E~323) = 0.123 - (0.123, ~0.5E~323) = 0.123 / (0.123, ~0.5E~323) = ~inf nextAfter (0.123, ~0.5E~323) = 0.12299999999999998 rem (0.123, ~0.5E~323) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.12299999999999998 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.12299999999999998 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.17976931348623157E309) = 0.2211162555880648E306 + (0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E~2, 0.17976931348623157E309) = 0.684210211491E~311 nextAfter (0.123E~2, 0.17976931348623157E309) = 0.12300000000000002E~2 rem (0.123E~2, 0.17976931348623157E309) = 0.123E~2 * (0.123E~2, 0.8988465674311579E308) = 0.1105581277940324E306 + (0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E~2, 0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (0.123E~2, 0.8988465674311579E308) = 0.12300000000000002E~2 rem (0.123E~2, 0.8988465674311579E308) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129E1 + (0.123E~2, 0.123E4) = 0.123000123E4 - (0.123E~2, 0.123E4) = ~0.122999877E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.12298770000000001E2 / (0.123E~2, 0.123E2) = 0.9999999999999999E~4 nextAfter (0.123E~2, 0.123E2) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.3141592653589793E1) = 0.38641589639154456E~2 + (0.123E~2, 0.3141592653589793E1) = 0.3142822653589793E1 - (0.123E~2, 0.3141592653589793E1) = ~0.3140362653589793E1 / (0.123E~2, 0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (0.123E~2, 0.3141592653589793E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.3141592653589793E1) = 0.123E~2 * (0.123E~2, 0.2718281828459045E1) = 0.33434866490046253E~2 + (0.123E~2, 0.2718281828459045E1) = 0.2719511828459045E1 - (0.123E~2, 0.2718281828459045E1) = ~0.2717051828459045E1 / (0.123E~2, 0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (0.123E~2, 0.2718281828459045E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.2718281828459045E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.12423 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300000000000002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.22250738585072014E~307) = 0.2736840845964E~310 + (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, 0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (0.123E~2, 0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.22250738585072014E~307) = 0.0 * (0.123E~2, 0.11125369292536007E~307) = 0.1368420422982E~310 + (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, 0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (0.123E~2, 0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.11125369292536007E~307) = 0.0 * (0.123E~2, 0.5E~323) = 0.0 + (0.123E~2, 0.5E~323) = 0.123E~2 - (0.123E~2, 0.5E~323) = 0.123E~2 / (0.123E~2, 0.5E~323) = inf nextAfter (0.123E~2, 0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, 0.5E~323) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999999999998E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.17976931348623157E309) = ~0.2211162555880648E306 + (0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E~2, ~0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (0.123E~2, ~0.17976931348623157E309) = 0.12299999999999998E~2 rem (0.123E~2, ~0.17976931348623157E309) = 0.123E~2 * (0.123E~2, ~0.8988465674311579E308) = ~0.1105581277940324E306 + (0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E~2, ~0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (0.123E~2, ~0.8988465674311579E308) = 0.12299999999999998E~2 rem (0.123E~2, ~0.8988465674311579E308) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129E1 + (0.123E~2, ~0.123E4) = ~0.122999877E4 - (0.123E~2, ~0.123E4) = 0.123000123E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129E~1 + (0.123E~2, ~0.123E2) = ~0.12298770000000001E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.9999999999999999E~4 nextAfter (0.123E~2, ~0.123E2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.3141592653589793E1) = ~0.38641589639154456E~2 + (0.123E~2, ~0.3141592653589793E1) = ~0.3140362653589793E1 - (0.123E~2, ~0.3141592653589793E1) = 0.3142822653589793E1 / (0.123E~2, ~0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (0.123E~2, ~0.3141592653589793E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.3141592653589793E1) = 0.123E~2 * (0.123E~2, ~0.2718281828459045E1) = ~0.33434866490046253E~2 + (0.123E~2, ~0.2718281828459045E1) = ~0.2717051828459045E1 - (0.123E~2, ~0.2718281828459045E1) = 0.2719511828459045E1 / (0.123E~2, ~0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (0.123E~2, ~0.2718281828459045E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.2718281828459045E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.12423 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.22250738585072014E~307) = ~0.2736840845964E~310 + (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, ~0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (0.123E~2, ~0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.22250738585072014E~307) = 0.0 * (0.123E~2, ~0.11125369292536007E~307) = ~0.1368420422982E~310 + (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, ~0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (0.123E~2, ~0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.11125369292536007E~307) = 0.0 * (0.123E~2, ~0.5E~323) = ~0.0 + (0.123E~2, ~0.5E~323) = 0.123E~2 - (0.123E~2, ~0.5E~323) = 0.123E~2 / (0.123E~2, ~0.5E~323) = ~inf nextAfter (0.123E~2, ~0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, ~0.5E~323) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999999999998E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999999999998E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.22250738585072014E~307, 0.17976931348623157E309) = 0.39999999999999996E1 + (0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.22250738585072014E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.22250738585072014E~307, 0.17976931348623157E309) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.8988465674311579E308) = 0.19999999999999998E1 + (0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.22250738585072014E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.22250738585072014E~307, 0.8988465674311579E308) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E4) = 0.27368408459638577E~304 + (0.22250738585072014E~307, 0.123E4) = 0.123E4 - (0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (0.22250738585072014E~307, 0.123E4) = 0.18090031369976E~310 nextAfter (0.22250738585072014E~307, 0.123E4) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E2) = 0.2736840845963858E~306 + (0.22250738585072014E~307, 0.123E2) = 0.123E2 - (0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (0.22250738585072014E~307, 0.123E2) = 0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, 0.123E2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.3141592653589793E1) = 0.6990275687580919E~307 + (0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.22250738585072014E~307, 0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, 0.3141592653589793E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.2718281828459045E1) = 0.6048377836559378E~307 + (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.22250738585072014E~307, 0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E1) = 0.27368408459638577E~307 + (0.22250738585072014E~307, 0.123E1) = 0.123E1 - (0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (0.22250738585072014E~307, 0.123E1) = 0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, 0.123E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123) = 0.273684084596386E~308 + (0.22250738585072014E~307, 0.123) = 0.123 - (0.22250738585072014E~307, 0.123) = ~0.123 / (0.22250738585072014E~307, 0.123) = 0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, 0.123) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E~2) = 0.2736840845964E~310 + (0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (0.22250738585072014E~307, 0.123E~2) = 0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, 0.123E~2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 + (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.4450147717014403E~307 - (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 / (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.1E1 nextAfter (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.22250738585072014E~307 rem (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 + (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.3337610787760802E~307 - (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2E1 nextAfter (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, 0.5E~323) = 0.0 + (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507202E~307 - (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 / (0.22250738585072014E~307, 0.5E~323) = 0.4503599627370496E16 nextAfter (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.5E~323) = 0.0 * (0.22250738585072014E~307, 0.0) = 0.0 + (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, 0.0) = inf nextAfter (0.22250738585072014E~307, 0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.0) = nan * (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.39999999999999996E1 + (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.19999999999999998E1 + (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E4) = ~0.27368408459638577E~304 + (0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (0.22250738585072014E~307, ~0.123E4) = ~0.18090031369976E~310 nextAfter (0.22250738585072014E~307, ~0.123E4) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E2) = ~0.2736840845963858E~306 + (0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (0.22250738585072014E~307, ~0.123E2) = ~0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, ~0.123E2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.6990275687580919E~307 + (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.6048377836559378E~307 + (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E1) = ~0.27368408459638577E~307 + (0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (0.22250738585072014E~307, ~0.123E1) = ~0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, ~0.123E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123) = ~0.273684084596386E~308 + (0.22250738585072014E~307, ~0.123) = ~0.123 - (0.22250738585072014E~307, ~0.123) = 0.123 / (0.22250738585072014E~307, ~0.123) = ~0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, ~0.123) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E~2) = ~0.2736840845964E~310 + (0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (0.22250738585072014E~307, ~0.123E~2) = ~0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, ~0.123E~2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.0 + (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 - (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.4450147717014403E~307 / (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.1E1 nextAfter (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.0 + (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.3337610787760802E~307 / (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2E1 nextAfter (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, ~0.5E~323) = ~0.0 + (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 - (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507202E~307 / (0.22250738585072014E~307, ~0.5E~323) = ~0.4503599627370496E16 nextAfter (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.5E~323) = 0.0 * (0.22250738585072014E~307, ~0.0) = ~0.0 + (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, ~0.0) = ~inf nextAfter (0.22250738585072014E~307, ~0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.0) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~inf) = ~inf + (0.22250738585072014E~307, ~inf) = ~inf - (0.22250738585072014E~307, ~inf) = inf / (0.22250738585072014E~307, ~inf) = ~0.0 nextAfter (0.22250738585072014E~307, ~inf) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, nan) = nan + (0.22250738585072014E~307, nan) = nan - (0.22250738585072014E~307, nan) = nan / (0.22250738585072014E~307, nan) = nan nextAfter (0.22250738585072014E~307, nan) = nan rem (0.22250738585072014E~307, nan) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.11125369292536007E~307, 0.17976931348623157E309) = 0.19999999999999998E1 + (0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.11125369292536007E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.11125369292536007E~307, 0.17976931348623157E309) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.8988465674311579E308) = 0.9999999999999999 + (0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.11125369292536007E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.11125369292536007E~307, 0.8988465674311579E308) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E4) = 0.13684204229819289E~304 + (0.11125369292536007E~307, 0.123E4) = 0.123E4 - (0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (0.11125369292536007E~307, 0.123E4) = 0.904501568499E~311 nextAfter (0.11125369292536007E~307, 0.123E4) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E2) = 0.1368420422981929E~306 + (0.11125369292536007E~307, 0.123E2) = 0.123E2 - (0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (0.11125369292536007E~307, 0.123E2) = 0.90450156849886E~309 nextAfter (0.11125369292536007E~307, 0.123E2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.3141592653589793E1) = 0.34951378437904593E~307 + (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, 0.3141592653589793E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.2718281828459045E1) = 0.3024188918279689E~307 + (0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.11125369292536007E~307, 0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (0.11125369292536007E~307, 0.2718281828459045E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E1) = 0.1368420422981929E~307 + (0.11125369292536007E~307, 0.123E1) = 0.123E1 - (0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (0.11125369292536007E~307, 0.123E1) = 0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, 0.123E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123) = 0.136842042298193E~308 + (0.11125369292536007E~307, 0.123) = 0.123 - (0.11125369292536007E~307, 0.123) = ~0.123 / (0.11125369292536007E~307, 0.123) = 0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, 0.123) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E~2) = 0.1368420422982E~310 + (0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (0.11125369292536007E~307, 0.123E~2) = 0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, 0.123E~2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.0 + (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.3337610787760802E~307 - (0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 / (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.5 nextAfter (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 + (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.22250738585072014E~307 - (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 / (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.1E1 nextAfter (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 rem (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, 0.5E~323) = 0.0 + (0.11125369292536007E~307, 0.5E~323) = 0.1112536929253601E~307 - (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 / (0.11125369292536007E~307, 0.5E~323) = 0.2251799813685248E16 nextAfter (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.5E~323) = 0.0 * (0.11125369292536007E~307, 0.0) = 0.0 + (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, 0.0) = inf nextAfter (0.11125369292536007E~307, 0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.0) = nan * (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.19999999999999998E1 + (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.9999999999999999 + (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E4) = ~0.13684204229819289E~304 + (0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (0.11125369292536007E~307, ~0.123E4) = ~0.904501568499E~311 nextAfter (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E2) = ~0.1368420422981929E~306 + (0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (0.11125369292536007E~307, ~0.123E2) = ~0.90450156849886E~309 nextAfter (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.34951378437904593E~307 + (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.3024188918279689E~307 + (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E1) = ~0.1368420422981929E~307 + (0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (0.11125369292536007E~307, ~0.123E1) = ~0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123) = ~0.136842042298193E~308 + (0.11125369292536007E~307, ~0.123) = ~0.123 - (0.11125369292536007E~307, ~0.123) = 0.123 / (0.11125369292536007E~307, ~0.123) = ~0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, ~0.123) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E~2) = ~0.1368420422982E~310 + (0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (0.11125369292536007E~307, ~0.123E~2) = ~0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.0 + (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.3337610787760802E~307 / (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.5 nextAfter (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.0 + (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 - (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.22250738585072014E~307 / (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.1E1 nextAfter (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, ~0.5E~323) = ~0.0 + (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 - (0.11125369292536007E~307, ~0.5E~323) = 0.1112536929253601E~307 / (0.11125369292536007E~307, ~0.5E~323) = ~0.2251799813685248E16 nextAfter (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.5E~323) = 0.0 * (0.11125369292536007E~307, ~0.0) = ~0.0 + (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, ~0.0) = ~inf nextAfter (0.11125369292536007E~307, ~0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.0) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~inf) = ~inf + (0.11125369292536007E~307, ~inf) = ~inf - (0.11125369292536007E~307, ~inf) = inf / (0.11125369292536007E~307, ~inf) = ~0.0 nextAfter (0.11125369292536007E~307, ~inf) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, nan) = nan + (0.11125369292536007E~307, nan) = nan - (0.11125369292536007E~307, nan) = nan / (0.11125369292536007E~307, nan) = nan nextAfter (0.11125369292536007E~307, nan) = nan rem (0.11125369292536007E~307, nan) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.5E~323, 0.17976931348623157E309) = 0.8881784197001251E~15 + (0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.5E~323, 0.17976931348623157E309) = 0.0 nextAfter (0.5E~323, 0.17976931348623157E309) = 0.1E~322 rem (0.5E~323, 0.17976931348623157E309) = 0.5E~323 * (0.5E~323, 0.8988465674311579E308) = 0.44408920985006257E~15 + (0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.5E~323, 0.8988465674311579E308) = 0.0 nextAfter (0.5E~323, 0.8988465674311579E308) = 0.1E~322 rem (0.5E~323, 0.8988465674311579E308) = 0.5E~323 * (0.5E~323, 0.123E4) = 0.6077E~320 + (0.5E~323, 0.123E4) = 0.123E4 - (0.5E~323, 0.123E4) = ~0.123E4 / (0.5E~323, 0.123E4) = 0.0 nextAfter (0.5E~323, 0.123E4) = 0.1E~322 rem (0.5E~323, 0.123E4) = 0.5E~323 * (0.5E~323, 0.123E2) = 0.6E~322 + (0.5E~323, 0.123E2) = 0.123E2 - (0.5E~323, 0.123E2) = ~0.123E2 / (0.5E~323, 0.123E2) = 0.0 nextAfter (0.5E~323, 0.123E2) = 0.1E~322 rem (0.5E~323, 0.123E2) = 0.5E~323 * (0.5E~323, 0.3141592653589793E1) = 0.15E~322 + (0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.5E~323, 0.3141592653589793E1) = 0.0 nextAfter (0.5E~323, 0.3141592653589793E1) = 0.1E~322 rem (0.5E~323, 0.3141592653589793E1) = 0.5E~323 * (0.5E~323, 0.2718281828459045E1) = 0.15E~322 + (0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.5E~323, 0.2718281828459045E1) = 0.0 nextAfter (0.5E~323, 0.2718281828459045E1) = 0.1E~322 rem (0.5E~323, 0.2718281828459045E1) = 0.5E~323 * (0.5E~323, 0.123E1) = 0.5E~323 + (0.5E~323, 0.123E1) = 0.123E1 - (0.5E~323, 0.123E1) = ~0.123E1 / (0.5E~323, 0.123E1) = 0.5E~323 nextAfter (0.5E~323, 0.123E1) = 0.1E~322 rem (0.5E~323, 0.123E1) = 0.5E~323 * (0.5E~323, 0.123) = 0.0 + (0.5E~323, 0.123) = 0.123 - (0.5E~323, 0.123) = ~0.123 / (0.5E~323, 0.123) = 0.4E~322 nextAfter (0.5E~323, 0.123) = 0.1E~322 rem (0.5E~323, 0.123) = 0.5E~323 * (0.5E~323, 0.123E~2) = 0.0 + (0.5E~323, 0.123E~2) = 0.123E~2 - (0.5E~323, 0.123E~2) = ~0.123E~2 / (0.5E~323, 0.123E~2) = 0.4017E~320 nextAfter (0.5E~323, 0.123E~2) = 0.1E~322 rem (0.5E~323, 0.123E~2) = 0.5E~323 * (0.5E~323, 0.22250738585072014E~307) = 0.0 + (0.5E~323, 0.22250738585072014E~307) = 0.2225073858507202E~307 - (0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507201E~307 / (0.5E~323, 0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (0.5E~323, 0.22250738585072014E~307) = 0.1E~322 rem (0.5E~323, 0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, 0.11125369292536007E~307) = 0.0 + (0.5E~323, 0.11125369292536007E~307) = 0.1112536929253601E~307 - (0.5E~323, 0.11125369292536007E~307) = ~0.11125369292536E~307 / (0.5E~323, 0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (0.5E~323, 0.11125369292536007E~307) = 0.1E~322 rem (0.5E~323, 0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, 0.5E~323) = 0.0 + (0.5E~323, 0.5E~323) = 0.1E~322 - (0.5E~323, 0.5E~323) = 0.0 / (0.5E~323, 0.5E~323) = 0.1E1 nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 rem (0.5E~323, 0.5E~323) = 0.0 * (0.5E~323, 0.0) = 0.0 + (0.5E~323, 0.0) = 0.5E~323 - (0.5E~323, 0.0) = 0.5E~323 / (0.5E~323, 0.0) = inf nextAfter (0.5E~323, 0.0) = 0.0 rem (0.5E~323, 0.0) = nan * (0.5E~323, ~0.17976931348623157E309) = ~0.8881784197001251E~15 + (0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.5E~323, ~0.17976931348623157E309) = ~0.0 nextAfter (0.5E~323, ~0.17976931348623157E309) = 0.0 rem (0.5E~323, ~0.17976931348623157E309) = 0.5E~323 * (0.5E~323, ~0.8988465674311579E308) = ~0.44408920985006257E~15 + (0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.5E~323, ~0.8988465674311579E308) = ~0.0 nextAfter (0.5E~323, ~0.8988465674311579E308) = 0.0 rem (0.5E~323, ~0.8988465674311579E308) = 0.5E~323 * (0.5E~323, ~0.123E4) = ~0.6077E~320 + (0.5E~323, ~0.123E4) = ~0.123E4 - (0.5E~323, ~0.123E4) = 0.123E4 / (0.5E~323, ~0.123E4) = ~0.0 nextAfter (0.5E~323, ~0.123E4) = 0.0 rem (0.5E~323, ~0.123E4) = 0.5E~323 * (0.5E~323, ~0.123E2) = ~0.6E~322 + (0.5E~323, ~0.123E2) = ~0.123E2 - (0.5E~323, ~0.123E2) = 0.123E2 / (0.5E~323, ~0.123E2) = ~0.0 nextAfter (0.5E~323, ~0.123E2) = 0.0 rem (0.5E~323, ~0.123E2) = 0.5E~323 * (0.5E~323, ~0.3141592653589793E1) = ~0.15E~322 + (0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.5E~323, ~0.3141592653589793E1) = ~0.0 nextAfter (0.5E~323, ~0.3141592653589793E1) = 0.0 rem (0.5E~323, ~0.3141592653589793E1) = 0.5E~323 * (0.5E~323, ~0.2718281828459045E1) = ~0.15E~322 + (0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.5E~323, ~0.2718281828459045E1) = ~0.0 nextAfter (0.5E~323, ~0.2718281828459045E1) = 0.0 rem (0.5E~323, ~0.2718281828459045E1) = 0.5E~323 * (0.5E~323, ~0.123E1) = ~0.5E~323 + (0.5E~323, ~0.123E1) = ~0.123E1 - (0.5E~323, ~0.123E1) = 0.123E1 / (0.5E~323, ~0.123E1) = ~0.5E~323 nextAfter (0.5E~323, ~0.123E1) = 0.0 rem (0.5E~323, ~0.123E1) = 0.5E~323 * (0.5E~323, ~0.123) = ~0.0 + (0.5E~323, ~0.123) = ~0.123 - (0.5E~323, ~0.123) = 0.123 / (0.5E~323, ~0.123) = ~0.4E~322 nextAfter (0.5E~323, ~0.123) = 0.0 rem (0.5E~323, ~0.123) = 0.5E~323 * (0.5E~323, ~0.123E~2) = ~0.0 + (0.5E~323, ~0.123E~2) = ~0.123E~2 - (0.5E~323, ~0.123E~2) = 0.123E~2 / (0.5E~323, ~0.123E~2) = ~0.4017E~320 nextAfter (0.5E~323, ~0.123E~2) = 0.0 rem (0.5E~323, ~0.123E~2) = 0.5E~323 * (0.5E~323, ~0.22250738585072014E~307) = ~0.0 + (0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507201E~307 - (0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507202E~307 / (0.5E~323, ~0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (0.5E~323, ~0.22250738585072014E~307) = 0.0 rem (0.5E~323, ~0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, ~0.11125369292536007E~307) = ~0.0 + (0.5E~323, ~0.11125369292536007E~307) = ~0.11125369292536E~307 - (0.5E~323, ~0.11125369292536007E~307) = 0.1112536929253601E~307 / (0.5E~323, ~0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (0.5E~323, ~0.11125369292536007E~307) = 0.0 rem (0.5E~323, ~0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, ~0.5E~323) = ~0.0 + (0.5E~323, ~0.5E~323) = 0.0 - (0.5E~323, ~0.5E~323) = 0.1E~322 / (0.5E~323, ~0.5E~323) = ~0.1E1 nextAfter (0.5E~323, ~0.5E~323) = 0.0 rem (0.5E~323, ~0.5E~323) = 0.0 * (0.5E~323, ~0.0) = ~0.0 + (0.5E~323, ~0.0) = 0.5E~323 - (0.5E~323, ~0.0) = 0.5E~323 / (0.5E~323, ~0.0) = ~inf nextAfter (0.5E~323, ~0.0) = 0.0 rem (0.5E~323, ~0.0) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.5E~323, ~inf) = ~inf + (0.5E~323, ~inf) = ~inf - (0.5E~323, ~inf) = inf / (0.5E~323, ~inf) = ~0.0 nextAfter (0.5E~323, ~inf) = 0.0 rem (0.5E~323, ~inf) = 0.5E~323 * (0.5E~323, nan) = nan + (0.5E~323, nan) = nan - (0.5E~323, nan) = nan / (0.5E~323, nan) = nan nextAfter (0.5E~323, nan) = nan rem (0.5E~323, nan) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.0, 0.17976931348623157E309) = 0.0 + (0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.0, 0.17976931348623157E309) = 0.0 nextAfter (0.0, 0.17976931348623157E309) = 0.5E~323 rem (0.0, 0.17976931348623157E309) = 0.0 * (0.0, 0.8988465674311579E308) = 0.0 + (0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.0, 0.8988465674311579E308) = 0.0 nextAfter (0.0, 0.8988465674311579E308) = 0.5E~323 rem (0.0, 0.8988465674311579E308) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.5E~323 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.5E~323 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.3141592653589793E1) = 0.0 + (0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.0, 0.3141592653589793E1) = 0.0 nextAfter (0.0, 0.3141592653589793E1) = 0.5E~323 rem (0.0, 0.3141592653589793E1) = 0.0 * (0.0, 0.2718281828459045E1) = 0.0 + (0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.0, 0.2718281828459045E1) = 0.0 nextAfter (0.0, 0.2718281828459045E1) = 0.5E~323 rem (0.0, 0.2718281828459045E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.5E~323 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.5E~323 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.5E~323 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.22250738585072014E~307) = 0.0 + (0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (0.0, 0.22250738585072014E~307) = 0.0 nextAfter (0.0, 0.22250738585072014E~307) = 0.5E~323 rem (0.0, 0.22250738585072014E~307) = 0.0 * (0.0, 0.11125369292536007E~307) = 0.0 + (0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (0.0, 0.11125369292536007E~307) = 0.0 nextAfter (0.0, 0.11125369292536007E~307) = 0.5E~323 rem (0.0, 0.11125369292536007E~307) = 0.0 * (0.0, 0.5E~323) = 0.0 + (0.0, 0.5E~323) = 0.5E~323 - (0.0, 0.5E~323) = ~0.5E~323 / (0.0, 0.5E~323) = 0.0 nextAfter (0.0, 0.5E~323) = 0.5E~323 rem (0.0, 0.5E~323) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.17976931348623157E309) = ~0.0 + (0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.0, ~0.17976931348623157E309) = ~0.0 nextAfter (0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (0.0, ~0.17976931348623157E309) = 0.0 * (0.0, ~0.8988465674311579E308) = ~0.0 + (0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.0, ~0.8988465674311579E308) = ~0.0 nextAfter (0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (0.0, ~0.8988465674311579E308) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.5E~323 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.5E~323 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.3141592653589793E1) = ~0.0 + (0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.0, ~0.3141592653589793E1) = ~0.0 nextAfter (0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (0.0, ~0.3141592653589793E1) = 0.0 * (0.0, ~0.2718281828459045E1) = ~0.0 + (0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.0, ~0.2718281828459045E1) = ~0.0 nextAfter (0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (0.0, ~0.2718281828459045E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.5E~323 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.5E~323 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.5E~323 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.22250738585072014E~307) = ~0.0 + (0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (0.0, ~0.22250738585072014E~307) = ~0.0 nextAfter (0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (0.0, ~0.22250738585072014E~307) = 0.0 * (0.0, ~0.11125369292536007E~307) = ~0.0 + (0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.0, ~0.11125369292536007E~307) = ~0.0 nextAfter (0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (0.0, ~0.11125369292536007E~307) = 0.0 * (0.0, ~0.5E~323) = ~0.0 + (0.0, ~0.5E~323) = ~0.5E~323 - (0.0, ~0.5E~323) = 0.5E~323 / (0.0, ~0.5E~323) = ~0.0 nextAfter (0.0, ~0.5E~323) = ~0.5E~323 rem (0.0, ~0.5E~323) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.5E~323 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf + (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 - (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf / (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.1E1 nextAfter (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf + (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf / (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.2E1 nextAfter (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, 0.123E4) = ~inf + (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E4) = ~0.1461539134034403E306 nextAfter (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E4) = 0.0 * (~0.17976931348623157E309, 0.123E2) = ~inf + (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E2) = ~0.1461539134034403E308 nextAfter (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E2) = 0.0 * (~0.17976931348623157E309, 0.3141592653589793E1) = ~inf + (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, 0.2718281828459045E1) = ~inf + (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123E1) = ~inf + (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E1) = ~0.1461539134034403E309 nextAfter (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123) = ~0.22111625558806483E308 + (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123) = ~inf nextAfter (~0.17976931348623157E309, 0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123) = inf * (~0.17976931348623157E309, 0.123E~2) = ~0.2211162555880648E306 + (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E~2) = ~inf nextAfter (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E~2) = inf * (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.39999999999999996E1 + (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.22250738585072014E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.22250738585072014E~307) = inf * (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.19999999999999998E1 + (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.11125369292536007E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.11125369292536007E~307) = inf * (~0.17976931348623157E309, 0.5E~323) = ~0.8881784197001251E~15 + (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.5E~323) = ~inf nextAfter (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.5E~323) = inf * (~0.17976931348623157E309, 0.0) = ~0.0 + (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.0) = ~inf nextAfter (~0.17976931348623157E309, 0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.0) = nan * (~0.17976931348623157E309, ~0.17976931348623157E309) = inf + (~0.17976931348623157E309, ~0.17976931348623157E309) = ~inf - (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 / (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.1E1 nextAfter (~0.17976931348623157E309, ~0.17976931348623157E309) = ~0.17976931348623157E309 rem (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, ~0.8988465674311579E308) = inf + (~0.17976931348623157E309, ~0.8988465674311579E308) = ~inf - (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.2E1 nextAfter (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, ~0.123E4) = inf + (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E4) = 0.1461539134034403E306 nextAfter (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E4) = 0.0 * (~0.17976931348623157E309, ~0.123E2) = inf + (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E2) = 0.1461539134034403E308 nextAfter (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E2) = 0.0 * (~0.17976931348623157E309, ~0.3141592653589793E1) = inf + (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, ~0.2718281828459045E1) = inf + (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.2718281828459045E1) = 0.661334345850887E308 nextAfter (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123E1) = inf + (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E1) = 0.1461539134034403E309 nextAfter (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123) = 0.22111625558806483E308 + (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123) = inf nextAfter (~0.17976931348623157E309, ~0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123) = inf * (~0.17976931348623157E309, ~0.123E~2) = 0.2211162555880648E306 + (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E~2) = inf nextAfter (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E~2) = inf * (~0.17976931348623157E309, ~0.22250738585072014E~307) = 0.39999999999999996E1 + (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf nextAfter (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf * (~0.17976931348623157E309, ~0.11125369292536007E~307) = 0.19999999999999998E1 + (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf nextAfter (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf * (~0.17976931348623157E309, ~0.5E~323) = 0.8881784197001251E~15 + (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.5E~323) = inf nextAfter (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.5E~323) = inf * (~0.17976931348623157E309, ~0.0) = 0.0 + (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.0) = inf nextAfter (~0.17976931348623157E309, ~0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.0) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, ~inf) = inf + (~0.17976931348623157E309, ~inf) = ~inf - (~0.17976931348623157E309, ~inf) = inf / (~0.17976931348623157E309, ~inf) = 0.0 nextAfter (~0.17976931348623157E309, ~inf) = ~inf rem (~0.17976931348623157E309, ~inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, nan) = nan + (~0.17976931348623157E309, nan) = nan - (~0.17976931348623157E309, nan) = nan / (~0.17976931348623157E309, nan) = nan nextAfter (~0.17976931348623157E309, nan) = nan rem (~0.17976931348623157E309, nan) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf + (~0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 - (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf / (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.5 nextAfter (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, 0.8988465674311579E308) = ~inf + (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 - (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.17976931348623157E309 / (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.1E1 nextAfter (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, 0.123E4) = ~inf + (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E4) = ~0.7307695670172015E305 nextAfter (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E4) = 0.0 * (~0.8988465674311579E308, 0.123E2) = ~inf + (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E2) = ~0.7307695670172014E307 nextAfter (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E2) = 0.0 * (~0.8988465674311579E308, 0.3141592653589793E1) = ~inf + (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, 0.2718281828459045E1) = ~inf + (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123E1) = ~0.1105581277940324E309 + (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E1) = ~0.7307695670172015E308 nextAfter (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123) = ~0.11055812779403241E308 + (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123) = ~inf nextAfter (~0.8988465674311579E308, 0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123) = inf * (~0.8988465674311579E308, 0.123E~2) = ~0.1105581277940324E306 + (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E~2) = ~inf nextAfter (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E~2) = inf * (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.19999999999999998E1 + (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.22250738585072014E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.22250738585072014E~307) = inf * (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.9999999999999999 + (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.11125369292536007E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.11125369292536007E~307) = inf * (~0.8988465674311579E308, 0.5E~323) = ~0.44408920985006257E~15 + (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.5E~323) = ~inf nextAfter (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.5E~323) = inf * (~0.8988465674311579E308, 0.0) = ~0.0 + (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.0) = ~inf nextAfter (~0.8988465674311579E308, 0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.0) = nan * (~0.8988465674311579E308, ~0.17976931348623157E309) = inf + (~0.8988465674311579E308, ~0.17976931348623157E309) = ~inf - (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 / (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.5 nextAfter (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~0.8988465674311579E308) = inf + (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.17976931348623157E309 - (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 / (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.1E1 nextAfter (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.8988465674311579E308 rem (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, ~0.123E4) = inf + (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E4) = 0.7307695670172015E305 nextAfter (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E4) = 0.0 * (~0.8988465674311579E308, ~0.123E2) = inf + (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E2) = 0.7307695670172014E307 nextAfter (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E2) = 0.0 * (~0.8988465674311579E308, ~0.3141592653589793E1) = inf + (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, ~0.2718281828459045E1) = inf + (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123E1) = 0.1105581277940324E309 + (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E1) = 0.7307695670172015E308 nextAfter (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123) = 0.11055812779403241E308 + (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123) = inf nextAfter (~0.8988465674311579E308, ~0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123) = inf * (~0.8988465674311579E308, ~0.123E~2) = 0.1105581277940324E306 + (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E~2) = inf nextAfter (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E~2) = inf * (~0.8988465674311579E308, ~0.22250738585072014E~307) = 0.19999999999999998E1 + (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf nextAfter (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf * (~0.8988465674311579E308, ~0.11125369292536007E~307) = 0.9999999999999999 + (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf nextAfter (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf * (~0.8988465674311579E308, ~0.5E~323) = 0.44408920985006257E~15 + (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.5E~323) = inf nextAfter (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.5E~323) = inf * (~0.8988465674311579E308, ~0.0) = 0.0 + (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.0) = inf nextAfter (~0.8988465674311579E308, ~0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.0) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~inf) = inf + (~0.8988465674311579E308, ~inf) = ~inf - (~0.8988465674311579E308, ~inf) = inf / (~0.8988465674311579E308, ~inf) = 0.0 nextAfter (~0.8988465674311579E308, ~inf) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, nan) = nan + (~0.8988465674311579E308, nan) = nan - (~0.8988465674311579E308, nan) = nan / (~0.8988465674311579E308, nan) = nan nextAfter (~0.8988465674311579E308, nan) = nan rem (~0.8988465674311579E308, nan) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.123E4, 0.17976931348623157E309) = ~inf + (~0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E4, 0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (~0.123E4, 0.17976931348623157E309) = ~0.12299999999999998E4 rem (~0.123E4, 0.17976931348623157E309) = ~0.123E4 * (~0.123E4, 0.8988465674311579E308) = ~inf + (~0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E4, 0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (~0.123E4, 0.8988465674311579E308) = ~0.12299999999999998E4 rem (~0.123E4, 0.8988465674311579E308) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.3141592653589793E1) = ~0.38641589639154454E4 + (~0.123E4, 0.3141592653589793E1) = ~0.122685840734641E4 - (~0.123E4, 0.3141592653589793E1) = ~0.123314159265359E4 / (~0.123E4, 0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (~0.123E4, 0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, 0.2718281828459045E1) = ~0.33434866490046256E4 + (~0.123E4, 0.2718281828459045E1) = ~0.1227281718171541E4 - (~0.123E4, 0.2718281828459045E1) = ~0.1232718281828459E4 / (~0.123E4, 0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (~0.123E4, 0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999999999998E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129E1 + (~0.123E4, 0.123E~2) = ~0.122999877E4 - (~0.123E4, 0.123E~2) = ~0.123000123E4 / (~0.123E4, 0.123E~2) = ~0.1E7 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E~2) = 0.0 * (~0.123E4, 0.22250738585072014E~307) = ~0.27368408459638577E~304 + (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E4, 0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.22250738585072014E~307) = inf * (~0.123E4, 0.11125369292536007E~307) = ~0.13684204229819289E~304 + (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E4, 0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.11125369292536007E~307) = inf * (~0.123E4, 0.5E~323) = ~0.6077E~320 + (~0.123E4, 0.5E~323) = ~0.123E4 - (~0.123E4, 0.5E~323) = ~0.123E4 / (~0.123E4, 0.5E~323) = ~inf nextAfter (~0.123E4, 0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, 0.5E~323) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999999999998E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.17976931348623157E309) = inf + (~0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E4, ~0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (~0.123E4, ~0.17976931348623157E309) = ~0.12300000000000002E4 rem (~0.123E4, ~0.17976931348623157E309) = ~0.123E4 * (~0.123E4, ~0.8988465674311579E308) = inf + (~0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E4, ~0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (~0.123E4, ~0.8988465674311579E308) = ~0.12300000000000002E4 rem (~0.123E4, ~0.8988465674311579E308) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.3141592653589793E1) = 0.38641589639154454E4 + (~0.123E4, ~0.3141592653589793E1) = ~0.123314159265359E4 - (~0.123E4, ~0.3141592653589793E1) = ~0.122685840734641E4 / (~0.123E4, ~0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (~0.123E4, ~0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, ~0.2718281828459045E1) = 0.33434866490046256E4 + (~0.123E4, ~0.2718281828459045E1) = ~0.1232718281828459E4 - (~0.123E4, ~0.2718281828459045E1) = ~0.1227281718171541E4 / (~0.123E4, ~0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (~0.123E4, ~0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129E1 + (~0.123E4, ~0.123E~2) = ~0.123000123E4 - (~0.123E4, ~0.123E~2) = ~0.122999877E4 / (~0.123E4, ~0.123E~2) = 0.1E7 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E~2) = 0.0 * (~0.123E4, ~0.22250738585072014E~307) = 0.27368408459638577E~304 + (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, ~0.22250738585072014E~307) = inf nextAfter (~0.123E4, ~0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.22250738585072014E~307) = inf * (~0.123E4, ~0.11125369292536007E~307) = 0.13684204229819289E~304 + (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, ~0.11125369292536007E~307) = inf nextAfter (~0.123E4, ~0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.11125369292536007E~307) = inf * (~0.123E4, ~0.5E~323) = 0.6077E~320 + (~0.123E4, ~0.5E~323) = ~0.123E4 - (~0.123E4, ~0.5E~323) = ~0.123E4 / (~0.123E4, ~0.5E~323) = inf nextAfter (~0.123E4, ~0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, ~0.5E~323) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999999999998E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300000000000002E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.17976931348623157E309) = ~inf + (~0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E2, 0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (~0.123E2, 0.17976931348623157E309) = ~0.12299999999999999E2 rem (~0.123E2, 0.17976931348623157E309) = ~0.123E2 * (~0.123E2, 0.8988465674311579E308) = ~inf + (~0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E2, 0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (~0.123E2, 0.8988465674311579E308) = ~0.12299999999999999E2 rem (~0.123E2, 0.8988465674311579E308) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129000000000002E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.3141592653589793E1) = ~0.3864158963915446E2 + (~0.123E2, 0.3141592653589793E1) = ~0.9158407346410208E1 - (~0.123E2, 0.3141592653589793E1) = ~0.15441592653589794E2 / (~0.123E2, 0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (~0.123E2, 0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, 0.2718281828459045E1) = ~0.33434866490046254E2 + (~0.123E2, 0.2718281828459045E1) = ~0.9581718171540956E1 - (~0.123E2, 0.2718281828459045E1) = ~0.15018281828459045E2 / (~0.123E2, 0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (~0.123E2, 0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, 0.123E1) = ~0.15129000000000001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530000000000001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129000000000001E1 + (~0.123E2, 0.123) = ~0.12177000000000001E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.10000000000000001E3 nextAfter (~0.123E2, 0.123) = ~0.12299999999999999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129E~1 + (~0.123E2, 0.123E~2) = ~0.12298770000000001E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, 0.22250738585072014E~307) = ~0.2736840845963858E~306 + (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E2, 0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.22250738585072014E~307) = inf * (~0.123E2, 0.11125369292536007E~307) = ~0.1368420422981929E~306 + (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E2, 0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.11125369292536007E~307) = inf * (~0.123E2, 0.5E~323) = ~0.6E~322 + (~0.123E2, 0.5E~323) = ~0.123E2 - (~0.123E2, 0.5E~323) = ~0.123E2 / (~0.123E2, 0.5E~323) = ~inf nextAfter (~0.123E2, 0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, 0.5E~323) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999999999999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.17976931348623157E309) = inf + (~0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E2, ~0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (~0.123E2, ~0.17976931348623157E309) = ~0.12300000000000002E2 rem (~0.123E2, ~0.17976931348623157E309) = ~0.123E2 * (~0.123E2, ~0.8988465674311579E308) = inf + (~0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E2, ~0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (~0.123E2, ~0.8988465674311579E308) = ~0.12300000000000002E2 rem (~0.123E2, ~0.8988465674311579E308) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300000000000002E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129000000000002E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.3141592653589793E1) = 0.3864158963915446E2 + (~0.123E2, ~0.3141592653589793E1) = ~0.15441592653589794E2 - (~0.123E2, ~0.3141592653589793E1) = ~0.9158407346410208E1 / (~0.123E2, ~0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (~0.123E2, ~0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, ~0.2718281828459045E1) = 0.33434866490046254E2 + (~0.123E2, ~0.2718281828459045E1) = ~0.15018281828459045E2 - (~0.123E2, ~0.2718281828459045E1) = ~0.9581718171540956E1 / (~0.123E2, ~0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (~0.123E2, ~0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, ~0.123E1) = 0.15129000000000001E2 + (~0.123E2, ~0.123E1) = ~0.13530000000000001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129000000000001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177000000000001E2 / (~0.123E2, ~0.123) = 0.10000000000000001E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.12298770000000001E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, ~0.22250738585072014E~307) = 0.2736840845963858E~306 + (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, ~0.22250738585072014E~307) = inf nextAfter (~0.123E2, ~0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.22250738585072014E~307) = inf * (~0.123E2, ~0.11125369292536007E~307) = 0.1368420422981929E~306 + (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, ~0.11125369292536007E~307) = inf nextAfter (~0.123E2, ~0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.11125369292536007E~307) = inf * (~0.123E2, ~0.5E~323) = 0.6E~322 + (~0.123E2, ~0.5E~323) = ~0.123E2 - (~0.123E2, ~0.5E~323) = ~0.123E2 / (~0.123E2, ~0.5E~323) = inf nextAfter (~0.123E2, ~0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, ~0.5E~323) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999999999999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300000000000002E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.3141592653589793E1, 0.17976931348623157E309) = ~inf + (~0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.8988465674311579E308) = ~inf + (~0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E4) = ~0.38641589639154454E4 + (~0.3141592653589793E1, 0.123E4) = 0.122685840734641E4 - (~0.3141592653589793E1, 0.123E4) = ~0.123314159265359E4 / (~0.3141592653589793E1, 0.123E4) = ~0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, 0.123E4) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E2) = ~0.3864158963915446E2 + (~0.3141592653589793E1, 0.123E2) = 0.9158407346410208E1 - (~0.3141592653589793E1, 0.123E2) = ~0.15441592653589794E2 / (~0.3141592653589793E1, 0.123E2) = ~0.2554140368772189 nextAfter (~0.3141592653589793E1, 0.123E2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.9869604401089358E1 + (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 - (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.6283185307179586E1 / (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.1E1 nextAfter (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8539734222673566E1 + (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 - (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.5859874482048838E1 / (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, 0.123E1) = ~0.38641589639154454E1 + (~0.3141592653589793E1, 0.123E1) = ~0.19115926535897931E1 - (~0.3141592653589793E1, 0.123E1) = ~0.43715926535897935E1 / (~0.3141592653589793E1, 0.123E1) = ~0.25541403687721895E1 nextAfter (~0.3141592653589793E1, 0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, 0.123) = ~0.38641589639154456 + (~0.3141592653589793E1, 0.123) = ~0.3018592653589793E1 - (~0.3141592653589793E1, 0.123) = ~0.32645926535897933E1 / (~0.3141592653589793E1, 0.123) = ~0.25541403687721896E2 nextAfter (~0.3141592653589793E1, 0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, 0.123E~2) = ~0.38641589639154456E~2 + (~0.3141592653589793E1, 0.123E~2) = ~0.3140362653589793E1 - (~0.3141592653589793E1, 0.123E~2) = ~0.3142822653589793E1 / (~0.3141592653589793E1, 0.123E~2) = ~0.25541403687721895E4 nextAfter (~0.3141592653589793E1, 0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.6990275687580919E~307 + (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.34951378437904593E~307 + (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.11125369292536007E~307) = inf * (~0.3141592653589793E1, 0.5E~323) = ~0.15E~322 + (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.5E~323) = ~inf nextAfter (~0.3141592653589793E1, 0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.5E~323) = inf * (~0.3141592653589793E1, 0.0) = ~0.0 + (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.0) = ~inf nextAfter (~0.3141592653589793E1, 0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.0) = nan * (~0.3141592653589793E1, ~0.17976931348623157E309) = inf + (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.8988465674311579E308) = inf + (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E4) = 0.38641589639154454E4 + (~0.3141592653589793E1, ~0.123E4) = ~0.123314159265359E4 - (~0.3141592653589793E1, ~0.123E4) = 0.122685840734641E4 / (~0.3141592653589793E1, ~0.123E4) = 0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, ~0.123E4) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E2) = 0.3864158963915446E2 + (~0.3141592653589793E1, ~0.123E2) = ~0.15441592653589794E2 - (~0.3141592653589793E1, ~0.123E2) = 0.9158407346410208E1 / (~0.3141592653589793E1, ~0.123E2) = 0.2554140368772189 nextAfter (~0.3141592653589793E1, ~0.123E2) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.9869604401089358E1 + (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.6283185307179586E1 - (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 / (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.1E1 nextAfter (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.3141592653589793E1 rem (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.8539734222673566E1 + (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.5859874482048838E1 - (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 / (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, ~0.123E1) = 0.38641589639154454E1 + (~0.3141592653589793E1, ~0.123E1) = ~0.43715926535897935E1 - (~0.3141592653589793E1, ~0.123E1) = ~0.19115926535897931E1 / (~0.3141592653589793E1, ~0.123E1) = 0.25541403687721895E1 nextAfter (~0.3141592653589793E1, ~0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, ~0.123) = 0.38641589639154456 + (~0.3141592653589793E1, ~0.123) = ~0.32645926535897933E1 - (~0.3141592653589793E1, ~0.123) = ~0.3018592653589793E1 / (~0.3141592653589793E1, ~0.123) = 0.25541403687721896E2 nextAfter (~0.3141592653589793E1, ~0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, ~0.123E~2) = 0.38641589639154456E~2 + (~0.3141592653589793E1, ~0.123E~2) = ~0.3142822653589793E1 - (~0.3141592653589793E1, ~0.123E~2) = ~0.3140362653589793E1 / (~0.3141592653589793E1, ~0.123E~2) = 0.25541403687721895E4 nextAfter (~0.3141592653589793E1, ~0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.6990275687580919E~307 + (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, ~0.11125369292536007E~307) = 0.34951378437904593E~307 + (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf nextAfter (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf * (~0.3141592653589793E1, ~0.5E~323) = 0.15E~322 + (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.5E~323) = inf nextAfter (~0.3141592653589793E1, ~0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.5E~323) = inf * (~0.3141592653589793E1, ~0.0) = 0.0 + (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.0) = inf nextAfter (~0.3141592653589793E1, ~0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.0) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~inf) = inf + (~0.3141592653589793E1, ~inf) = ~inf - (~0.3141592653589793E1, ~inf) = inf / (~0.3141592653589793E1, ~inf) = 0.0 nextAfter (~0.3141592653589793E1, ~inf) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, nan) = nan + (~0.3141592653589793E1, nan) = nan - (~0.3141592653589793E1, nan) = nan / (~0.3141592653589793E1, nan) = nan nextAfter (~0.3141592653589793E1, nan) = nan rem (~0.3141592653589793E1, nan) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.2718281828459045E1, 0.17976931348623157E309) = ~inf + (~0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.8988465674311579E308) = ~inf + (~0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E4) = ~0.33434866490046256E4 + (~0.2718281828459045E1, 0.123E4) = 0.1227281718171541E4 - (~0.2718281828459045E1, 0.123E4) = ~0.1232718281828459E4 / (~0.2718281828459045E1, 0.123E4) = ~0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, 0.123E4) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E2) = ~0.33434866490046254E2 + (~0.2718281828459045E1, 0.123E2) = 0.9581718171540956E1 - (~0.2718281828459045E1, 0.123E2) = ~0.15018281828459045E2 / (~0.2718281828459045E1, 0.123E2) = ~0.22099852263894673 nextAfter (~0.2718281828459045E1, 0.123E2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8539734222673566E1 + (~0.2718281828459045E1, 0.3141592653589793E1) = 0.423310825130748 - (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.5859874482048838E1 / (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8652559794322651 nextAfter (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.73890560989306495E1 + (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 - (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.543656365691809E1 / (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.1E1 nextAfter (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, 0.123E1) = ~0.33434866490046256E1 + (~0.2718281828459045E1, 0.123E1) = ~0.1488281828459045E1 - (~0.2718281828459045E1, 0.123E1) = ~0.3948281828459045E1 / (~0.2718281828459045E1, 0.123E1) = ~0.22099852263894677E1 nextAfter (~0.2718281828459045E1, 0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, 0.123) = ~0.33434866490046256 + (~0.2718281828459045E1, 0.123) = ~0.25952818284590453E1 - (~0.2718281828459045E1, 0.123) = ~0.2841281828459045E1 / (~0.2718281828459045E1, 0.123) = ~0.22099852263894675E2 nextAfter (~0.2718281828459045E1, 0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, 0.123E~2) = ~0.33434866490046253E~2 + (~0.2718281828459045E1, 0.123E~2) = ~0.2717051828459045E1 - (~0.2718281828459045E1, 0.123E~2) = ~0.2719511828459045E1 / (~0.2718281828459045E1, 0.123E~2) = ~0.22099852263894677E4 nextAfter (~0.2718281828459045E1, 0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.6048377836559378E~307 + (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.3024188918279689E~307 + (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.11125369292536007E~307) = inf * (~0.2718281828459045E1, 0.5E~323) = ~0.15E~322 + (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.5E~323) = ~inf nextAfter (~0.2718281828459045E1, 0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.5E~323) = inf * (~0.2718281828459045E1, 0.0) = ~0.0 + (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.0) = ~inf nextAfter (~0.2718281828459045E1, 0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.0) = nan * (~0.2718281828459045E1, ~0.17976931348623157E309) = inf + (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.8988465674311579E308) = inf + (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E4) = 0.33434866490046256E4 + (~0.2718281828459045E1, ~0.123E4) = ~0.1232718281828459E4 - (~0.2718281828459045E1, ~0.123E4) = 0.1227281718171541E4 / (~0.2718281828459045E1, ~0.123E4) = 0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, ~0.123E4) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E2) = 0.33434866490046254E2 + (~0.2718281828459045E1, ~0.123E2) = ~0.15018281828459045E2 - (~0.2718281828459045E1, ~0.123E2) = 0.9581718171540956E1 / (~0.2718281828459045E1, ~0.123E2) = 0.22099852263894673 nextAfter (~0.2718281828459045E1, ~0.123E2) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8539734222673566E1 + (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.5859874482048838E1 - (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.423310825130748 / (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8652559794322651 nextAfter (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.73890560989306495E1 + (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.543656365691809E1 - (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 / (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.1E1 nextAfter (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.2718281828459045E1 rem (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, ~0.123E1) = 0.33434866490046256E1 + (~0.2718281828459045E1, ~0.123E1) = ~0.3948281828459045E1 - (~0.2718281828459045E1, ~0.123E1) = ~0.1488281828459045E1 / (~0.2718281828459045E1, ~0.123E1) = 0.22099852263894677E1 nextAfter (~0.2718281828459045E1, ~0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, ~0.123) = 0.33434866490046256 + (~0.2718281828459045E1, ~0.123) = ~0.2841281828459045E1 - (~0.2718281828459045E1, ~0.123) = ~0.25952818284590453E1 / (~0.2718281828459045E1, ~0.123) = 0.22099852263894675E2 nextAfter (~0.2718281828459045E1, ~0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, ~0.123E~2) = 0.33434866490046253E~2 + (~0.2718281828459045E1, ~0.123E~2) = ~0.2719511828459045E1 - (~0.2718281828459045E1, ~0.123E~2) = ~0.2717051828459045E1 / (~0.2718281828459045E1, ~0.123E~2) = 0.22099852263894677E4 nextAfter (~0.2718281828459045E1, ~0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.6048377836559378E~307 + (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, ~0.11125369292536007E~307) = 0.3024188918279689E~307 + (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf nextAfter (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf * (~0.2718281828459045E1, ~0.5E~323) = 0.15E~322 + (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.5E~323) = inf nextAfter (~0.2718281828459045E1, ~0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.5E~323) = inf * (~0.2718281828459045E1, ~0.0) = 0.0 + (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.0) = inf nextAfter (~0.2718281828459045E1, ~0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.0) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~inf) = inf + (~0.2718281828459045E1, ~inf) = ~inf - (~0.2718281828459045E1, ~inf) = inf / (~0.2718281828459045E1, ~inf) = 0.0 nextAfter (~0.2718281828459045E1, ~inf) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, nan) = nan + (~0.2718281828459045E1, nan) = nan - (~0.2718281828459045E1, nan) = nan / (~0.2718281828459045E1, nan) = nan nextAfter (~0.2718281828459045E1, nan) = nan rem (~0.2718281828459045E1, nan) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.123E1, 0.17976931348623157E309) = ~inf + (~0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E1, 0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (~0.123E1, 0.17976931348623157E309) = ~0.12299999999999998E1 rem (~0.123E1, 0.17976931348623157E309) = ~0.123E1 * (~0.123E1, 0.8988465674311579E308) = ~0.1105581277940324E309 + (~0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E1, 0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (~0.123E1, 0.8988465674311579E308) = ~0.12299999999999998E1 rem (~0.123E1, 0.8988465674311579E308) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129000000000001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530000000000001E2 / (~0.123E1, 0.123E2) = ~0.9999999999999999E~1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.3141592653589793E1) = ~0.38641589639154454E1 + (~0.123E1, 0.3141592653589793E1) = 0.19115926535897931E1 - (~0.123E1, 0.3141592653589793E1) = ~0.43715926535897935E1 / (~0.123E1, 0.3141592653589793E1) = ~0.3915211600060625 nextAfter (~0.123E1, 0.3141592653589793E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.3141592653589793E1) = ~0.123E1 * (~0.123E1, 0.2718281828459045E1) = ~0.33434866490046256E1 + (~0.123E1, 0.2718281828459045E1) = 0.1488281828459045E1 - (~0.123E1, 0.2718281828459045E1) = ~0.3948281828459045E1 / (~0.123E1, 0.2718281828459045E1) = ~0.45249171264087407 nextAfter (~0.123E1, 0.2718281828459045E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.2718281828459045E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999999999998E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.22250738585072014E~307) = ~0.27368408459638577E~307 + (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, 0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (~0.123E1, 0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.22250738585072014E~307) = 0.0 * (~0.123E1, 0.11125369292536007E~307) = ~0.1368420422981929E~307 + (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, 0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (~0.123E1, 0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.11125369292536007E~307) = 0.0 * (~0.123E1, 0.5E~323) = ~0.5E~323 + (~0.123E1, 0.5E~323) = ~0.123E1 - (~0.123E1, 0.5E~323) = ~0.123E1 / (~0.123E1, 0.5E~323) = ~inf nextAfter (~0.123E1, 0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, 0.5E~323) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999999999998E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.17976931348623157E309) = inf + (~0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E1, ~0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (~0.123E1, ~0.17976931348623157E309) = ~0.12300000000000002E1 rem (~0.123E1, ~0.17976931348623157E309) = ~0.123E1 * (~0.123E1, ~0.8988465674311579E308) = 0.1105581277940324E309 + (~0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E1, ~0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (~0.123E1, ~0.8988465674311579E308) = ~0.12300000000000002E1 rem (~0.123E1, ~0.8988465674311579E308) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129000000000001E2 + (~0.123E1, ~0.123E2) = ~0.13530000000000001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.9999999999999999E~1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.3141592653589793E1) = 0.38641589639154454E1 + (~0.123E1, ~0.3141592653589793E1) = ~0.43715926535897935E1 - (~0.123E1, ~0.3141592653589793E1) = 0.19115926535897931E1 / (~0.123E1, ~0.3141592653589793E1) = 0.3915211600060625 nextAfter (~0.123E1, ~0.3141592653589793E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.3141592653589793E1) = ~0.123E1 * (~0.123E1, ~0.2718281828459045E1) = 0.33434866490046256E1 + (~0.123E1, ~0.2718281828459045E1) = ~0.3948281828459045E1 - (~0.123E1, ~0.2718281828459045E1) = 0.1488281828459045E1 / (~0.123E1, ~0.2718281828459045E1) = 0.45249171264087407 nextAfter (~0.123E1, ~0.2718281828459045E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.2718281828459045E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.22250738585072014E~307) = 0.27368408459638577E~307 + (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, ~0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (~0.123E1, ~0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.22250738585072014E~307) = 0.0 * (~0.123E1, ~0.11125369292536007E~307) = 0.1368420422981929E~307 + (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, ~0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (~0.123E1, ~0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.11125369292536007E~307) = 0.0 * (~0.123E1, ~0.5E~323) = 0.5E~323 + (~0.123E1, ~0.5E~323) = ~0.123E1 - (~0.123E1, ~0.5E~323) = ~0.123E1 / (~0.123E1, ~0.5E~323) = inf nextAfter (~0.123E1, ~0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, ~0.5E~323) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999999999998E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300000000000002E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.17976931348623157E309) = ~0.22111625558806483E308 + (~0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123, 0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (~0.123, 0.17976931348623157E309) = ~0.12299999999999998 rem (~0.123, 0.17976931348623157E309) = ~0.123 * (~0.123, 0.8988465674311579E308) = ~0.11055812779403241E308 + (~0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123, 0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (~0.123, 0.8988465674311579E308) = ~0.12299999999999998 rem (~0.123, 0.8988465674311579E308) = ~0.123 * (~0.123, 0.123E4) = ~0.15129E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.1E~3 nextAfter (~0.123, 0.123E4) = ~0.12299999999999998 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129000000000001E1 + (~0.123, 0.123E2) = 0.12177000000000001E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.9999999999999998E~2 nextAfter (~0.123, 0.123E2) = ~0.12299999999999998 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.3141592653589793E1) = ~0.38641589639154456 + (~0.123, 0.3141592653589793E1) = 0.3018592653589793E1 - (~0.123, 0.3141592653589793E1) = ~0.32645926535897933E1 / (~0.123, 0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (~0.123, 0.3141592653589793E1) = ~0.12299999999999998 rem (~0.123, 0.3141592653589793E1) = ~0.123 * (~0.123, 0.2718281828459045E1) = ~0.33434866490046256 + (~0.123, 0.2718281828459045E1) = 0.25952818284590453E1 - (~0.123, 0.2718281828459045E1) = ~0.2841281828459045E1 / (~0.123, 0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (~0.123, 0.2718281828459045E1) = ~0.12299999999999998 rem (~0.123, 0.2718281828459045E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.12299999999999998 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.12299999999999998 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.12423 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.12299999999999998 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.22250738585072014E~307) = ~0.273684084596386E~308 + (~0.123, 0.22250738585072014E~307) = ~0.123 - (~0.123, 0.22250738585072014E~307) = ~0.123 / (~0.123, 0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (~0.123, 0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, 0.22250738585072014E~307) = 0.0 * (~0.123, 0.11125369292536007E~307) = ~0.136842042298193E~308 + (~0.123, 0.11125369292536007E~307) = ~0.123 - (~0.123, 0.11125369292536007E~307) = ~0.123 / (~0.123, 0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (~0.123, 0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, 0.11125369292536007E~307) = 0.0 * (~0.123, 0.5E~323) = ~0.0 + (~0.123, 0.5E~323) = ~0.123 - (~0.123, 0.5E~323) = ~0.123 / (~0.123, 0.5E~323) = ~inf nextAfter (~0.123, 0.5E~323) = ~0.12299999999999998 rem (~0.123, 0.5E~323) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.12299999999999998 rem (~0.123, 0.0) = nan * (~0.123, ~0.17976931348623157E309) = 0.22111625558806483E308 + (~0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123, ~0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (~0.123, ~0.17976931348623157E309) = ~0.12300000000000001 rem (~0.123, ~0.17976931348623157E309) = ~0.123 * (~0.123, ~0.8988465674311579E308) = 0.11055812779403241E308 + (~0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123, ~0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (~0.123, ~0.8988465674311579E308) = ~0.12300000000000001 rem (~0.123, ~0.8988465674311579E308) = ~0.123 * (~0.123, ~0.123E4) = 0.15129E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.1E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300000000000001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129000000000001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177000000000001E2 / (~0.123, ~0.123E2) = 0.9999999999999998E~2 nextAfter (~0.123, ~0.123E2) = ~0.12300000000000001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.3141592653589793E1) = 0.38641589639154456 + (~0.123, ~0.3141592653589793E1) = ~0.32645926535897933E1 - (~0.123, ~0.3141592653589793E1) = 0.3018592653589793E1 / (~0.123, ~0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (~0.123, ~0.3141592653589793E1) = ~0.12300000000000001 rem (~0.123, ~0.3141592653589793E1) = ~0.123 * (~0.123, ~0.2718281828459045E1) = 0.33434866490046256 + (~0.123, ~0.2718281828459045E1) = ~0.2841281828459045E1 - (~0.123, ~0.2718281828459045E1) = 0.25952818284590453E1 / (~0.123, ~0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (~0.123, ~0.2718281828459045E1) = ~0.12300000000000001 rem (~0.123, ~0.2718281828459045E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300000000000001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.12423 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.12299999999999998 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.22250738585072014E~307) = 0.273684084596386E~308 + (~0.123, ~0.22250738585072014E~307) = ~0.123 - (~0.123, ~0.22250738585072014E~307) = ~0.123 / (~0.123, ~0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (~0.123, ~0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, ~0.22250738585072014E~307) = 0.0 * (~0.123, ~0.11125369292536007E~307) = 0.136842042298193E~308 + (~0.123, ~0.11125369292536007E~307) = ~0.123 - (~0.123, ~0.11125369292536007E~307) = ~0.123 / (~0.123, ~0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (~0.123, ~0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, ~0.11125369292536007E~307) = 0.0 * (~0.123, ~0.5E~323) = 0.0 + (~0.123, ~0.5E~323) = ~0.123 - (~0.123, ~0.5E~323) = ~0.123 / (~0.123, ~0.5E~323) = inf nextAfter (~0.123, ~0.5E~323) = ~0.12299999999999998 rem (~0.123, ~0.5E~323) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.12299999999999998 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300000000000001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.17976931348623157E309) = ~0.2211162555880648E306 + (~0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E~2, 0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (~0.123E~2, 0.17976931348623157E309) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, 0.8988465674311579E308) = ~0.1105581277940324E306 + (~0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E~2, 0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (~0.123E~2, 0.8988465674311579E308) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129E1 + (~0.123E~2, 0.123E4) = 0.122999877E4 - (~0.123E~2, 0.123E4) = ~0.123000123E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129E~1 + (~0.123E~2, 0.123E2) = 0.12298770000000001E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.9999999999999999E~4 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.3141592653589793E1) = ~0.38641589639154456E~2 + (~0.123E~2, 0.3141592653589793E1) = 0.3140362653589793E1 - (~0.123E~2, 0.3141592653589793E1) = ~0.3142822653589793E1 / (~0.123E~2, 0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (~0.123E~2, 0.3141592653589793E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, 0.2718281828459045E1) = ~0.33434866490046253E~2 + (~0.123E~2, 0.2718281828459045E1) = 0.2717051828459045E1 - (~0.123E~2, 0.2718281828459045E1) = ~0.2719511828459045E1 / (~0.123E~2, 0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (~0.123E~2, 0.2718281828459045E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.12423 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.22250738585072014E~307) = ~0.2736840845964E~310 + (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, 0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (~0.123E~2, 0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.22250738585072014E~307) = 0.0 * (~0.123E~2, 0.11125369292536007E~307) = ~0.1368420422982E~310 + (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, 0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (~0.123E~2, 0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.11125369292536007E~307) = 0.0 * (~0.123E~2, 0.5E~323) = ~0.0 + (~0.123E~2, 0.5E~323) = ~0.123E~2 - (~0.123E~2, 0.5E~323) = ~0.123E~2 / (~0.123E~2, 0.5E~323) = ~inf nextAfter (~0.123E~2, 0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.5E~323) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.17976931348623157E309) = 0.2211162555880648E306 + (~0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E~2, ~0.17976931348623157E309) = 0.684210211491E~311 nextAfter (~0.123E~2, ~0.17976931348623157E309) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, ~0.8988465674311579E308) = 0.1105581277940324E306 + (~0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E~2, ~0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (~0.123E~2, ~0.8988465674311579E308) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129E1 + (~0.123E~2, ~0.123E4) = ~0.123000123E4 - (~0.123E~2, ~0.123E4) = 0.122999877E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.12298770000000001E2 / (~0.123E~2, ~0.123E2) = 0.9999999999999999E~4 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.3141592653589793E1) = 0.38641589639154456E~2 + (~0.123E~2, ~0.3141592653589793E1) = ~0.3142822653589793E1 - (~0.123E~2, ~0.3141592653589793E1) = 0.3140362653589793E1 / (~0.123E~2, ~0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (~0.123E~2, ~0.3141592653589793E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, ~0.2718281828459045E1) = 0.33434866490046253E~2 + (~0.123E~2, ~0.2718281828459045E1) = ~0.2719511828459045E1 - (~0.123E~2, ~0.2718281828459045E1) = 0.2717051828459045E1 / (~0.123E~2, ~0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (~0.123E~2, ~0.2718281828459045E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.12423 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.22250738585072014E~307) = 0.2736840845964E~310 + (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, ~0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (~0.123E~2, ~0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.22250738585072014E~307) = 0.0 * (~0.123E~2, ~0.11125369292536007E~307) = 0.1368420422982E~310 + (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, ~0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (~0.123E~2, ~0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.11125369292536007E~307) = 0.0 * (~0.123E~2, ~0.5E~323) = 0.0 + (~0.123E~2, ~0.5E~323) = ~0.123E~2 - (~0.123E~2, ~0.5E~323) = ~0.123E~2 / (~0.123E~2, ~0.5E~323) = inf nextAfter (~0.123E~2, ~0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.5E~323) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300000000000002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.39999999999999996E1 + (~0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.19999999999999998E1 + (~0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E4) = ~0.27368408459638577E~304 + (~0.22250738585072014E~307, 0.123E4) = 0.123E4 - (~0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (~0.22250738585072014E~307, 0.123E4) = ~0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, 0.123E4) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E2) = ~0.2736840845963858E~306 + (~0.22250738585072014E~307, 0.123E2) = 0.123E2 - (~0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (~0.22250738585072014E~307, 0.123E2) = ~0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, 0.123E2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.6990275687580919E~307 + (~0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.6048377836559378E~307 + (~0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E1) = ~0.27368408459638577E~307 + (~0.22250738585072014E~307, 0.123E1) = 0.123E1 - (~0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (~0.22250738585072014E~307, 0.123E1) = ~0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, 0.123E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123) = ~0.273684084596386E~308 + (~0.22250738585072014E~307, 0.123) = 0.123 - (~0.22250738585072014E~307, 0.123) = ~0.123 / (~0.22250738585072014E~307, 0.123) = ~0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, 0.123) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E~2) = ~0.2736840845964E~310 + (~0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (~0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (~0.22250738585072014E~307, 0.123E~2) = ~0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, 0.123E~2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.0 + (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 - (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.4450147717014403E~307 / (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.1E1 nextAfter (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.0 + (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.3337610787760802E~307 / (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2E1 nextAfter (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, 0.5E~323) = ~0.0 + (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 - (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507202E~307 / (~0.22250738585072014E~307, 0.5E~323) = ~0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.5E~323) = 0.0 * (~0.22250738585072014E~307, 0.0) = ~0.0 + (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, 0.0) = ~inf nextAfter (~0.22250738585072014E~307, 0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.0) = nan * (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.39999999999999996E1 + (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.19999999999999998E1 + (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E4) = 0.27368408459638577E~304 + (~0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (~0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (~0.22250738585072014E~307, ~0.123E4) = 0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, ~0.123E4) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E2) = 0.2736840845963858E~306 + (~0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (~0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (~0.22250738585072014E~307, ~0.123E2) = 0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, ~0.123E2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.6990275687580919E~307 + (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.6048377836559378E~307 + (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E1) = 0.27368408459638577E~307 + (~0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (~0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (~0.22250738585072014E~307, ~0.123E1) = 0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, ~0.123E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123) = 0.273684084596386E~308 + (~0.22250738585072014E~307, ~0.123) = ~0.123 - (~0.22250738585072014E~307, ~0.123) = 0.123 / (~0.22250738585072014E~307, ~0.123) = 0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, ~0.123) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E~2) = 0.2736840845964E~310 + (~0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (~0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (~0.22250738585072014E~307, ~0.123E~2) = 0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, ~0.123E~2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 + (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.4450147717014403E~307 - (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 / (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.1E1 nextAfter (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 rem (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 + (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.3337610787760802E~307 - (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2E1 nextAfter (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, ~0.5E~323) = 0.0 + (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507202E~307 - (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 / (~0.22250738585072014E~307, ~0.5E~323) = 0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.5E~323) = 0.0 * (~0.22250738585072014E~307, ~0.0) = 0.0 + (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, ~0.0) = inf nextAfter (~0.22250738585072014E~307, ~0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.0) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~inf) = inf + (~0.22250738585072014E~307, ~inf) = ~inf - (~0.22250738585072014E~307, ~inf) = inf / (~0.22250738585072014E~307, ~inf) = 0.0 nextAfter (~0.22250738585072014E~307, ~inf) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, nan) = nan + (~0.22250738585072014E~307, nan) = nan - (~0.22250738585072014E~307, nan) = nan / (~0.22250738585072014E~307, nan) = nan nextAfter (~0.22250738585072014E~307, nan) = nan rem (~0.22250738585072014E~307, nan) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.19999999999999998E1 + (~0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.9999999999999999 + (~0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E4) = ~0.13684204229819289E~304 + (~0.11125369292536007E~307, 0.123E4) = 0.123E4 - (~0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (~0.11125369292536007E~307, 0.123E4) = ~0.904501568499E~311 nextAfter (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E2) = ~0.1368420422981929E~306 + (~0.11125369292536007E~307, 0.123E2) = 0.123E2 - (~0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (~0.11125369292536007E~307, 0.123E2) = ~0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.34951378437904593E~307 + (~0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.3024188918279689E~307 + (~0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E1) = ~0.1368420422981929E~307 + (~0.11125369292536007E~307, 0.123E1) = 0.123E1 - (~0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (~0.11125369292536007E~307, 0.123E1) = ~0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123) = ~0.136842042298193E~308 + (~0.11125369292536007E~307, 0.123) = 0.123 - (~0.11125369292536007E~307, 0.123) = ~0.123 / (~0.11125369292536007E~307, 0.123) = ~0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, 0.123) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E~2) = ~0.1368420422982E~310 + (~0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (~0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (~0.11125369292536007E~307, 0.123E~2) = ~0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.0 + (~0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.3337610787760802E~307 / (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.5 nextAfter (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.0 + (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 - (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.22250738585072014E~307 / (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.1E1 nextAfter (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, 0.5E~323) = ~0.0 + (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 - (~0.11125369292536007E~307, 0.5E~323) = ~0.1112536929253601E~307 / (~0.11125369292536007E~307, 0.5E~323) = ~0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.5E~323) = 0.0 * (~0.11125369292536007E~307, 0.0) = ~0.0 + (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, 0.0) = ~inf nextAfter (~0.11125369292536007E~307, 0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.0) = nan * (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.19999999999999998E1 + (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.9999999999999999 + (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E4) = 0.13684204229819289E~304 + (~0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (~0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (~0.11125369292536007E~307, ~0.123E4) = 0.904501568499E~311 nextAfter (~0.11125369292536007E~307, ~0.123E4) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E2) = 0.1368420422981929E~306 + (~0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (~0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (~0.11125369292536007E~307, ~0.123E2) = 0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, ~0.123E2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.34951378437904593E~307 + (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.3024188918279689E~307 + (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E1) = 0.1368420422981929E~307 + (~0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (~0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (~0.11125369292536007E~307, ~0.123E1) = 0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, ~0.123E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123) = 0.136842042298193E~308 + (~0.11125369292536007E~307, ~0.123) = ~0.123 - (~0.11125369292536007E~307, ~0.123) = 0.123 / (~0.11125369292536007E~307, ~0.123) = 0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, ~0.123) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E~2) = 0.1368420422982E~310 + (~0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (~0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (~0.11125369292536007E~307, ~0.123E~2) = 0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, ~0.123E~2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.0 + (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.3337610787760802E~307 - (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.5 nextAfter (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 + (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.22250738585072014E~307 - (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 / (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.1E1 nextAfter (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 rem (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, ~0.5E~323) = 0.0 + (~0.11125369292536007E~307, ~0.5E~323) = ~0.1112536929253601E~307 - (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 / (~0.11125369292536007E~307, ~0.5E~323) = 0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.5E~323) = 0.0 * (~0.11125369292536007E~307, ~0.0) = 0.0 + (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.0) = inf nextAfter (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.0) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~inf) = inf + (~0.11125369292536007E~307, ~inf) = ~inf - (~0.11125369292536007E~307, ~inf) = inf / (~0.11125369292536007E~307, ~inf) = 0.0 nextAfter (~0.11125369292536007E~307, ~inf) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, nan) = nan + (~0.11125369292536007E~307, nan) = nan - (~0.11125369292536007E~307, nan) = nan / (~0.11125369292536007E~307, nan) = nan nextAfter (~0.11125369292536007E~307, nan) = nan rem (~0.11125369292536007E~307, nan) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.5E~323, 0.17976931348623157E309) = ~0.8881784197001251E~15 + (~0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.5E~323, 0.17976931348623157E309) = ~0.0 nextAfter (~0.5E~323, 0.17976931348623157E309) = ~0.0 rem (~0.5E~323, 0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, 0.8988465674311579E308) = ~0.44408920985006257E~15 + (~0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.5E~323, 0.8988465674311579E308) = ~0.0 nextAfter (~0.5E~323, 0.8988465674311579E308) = ~0.0 rem (~0.5E~323, 0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, 0.123E4) = ~0.6077E~320 + (~0.5E~323, 0.123E4) = 0.123E4 - (~0.5E~323, 0.123E4) = ~0.123E4 / (~0.5E~323, 0.123E4) = ~0.0 nextAfter (~0.5E~323, 0.123E4) = ~0.0 rem (~0.5E~323, 0.123E4) = ~0.5E~323 * (~0.5E~323, 0.123E2) = ~0.6E~322 + (~0.5E~323, 0.123E2) = 0.123E2 - (~0.5E~323, 0.123E2) = ~0.123E2 / (~0.5E~323, 0.123E2) = ~0.0 nextAfter (~0.5E~323, 0.123E2) = ~0.0 rem (~0.5E~323, 0.123E2) = ~0.5E~323 * (~0.5E~323, 0.3141592653589793E1) = ~0.15E~322 + (~0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.5E~323, 0.3141592653589793E1) = ~0.0 nextAfter (~0.5E~323, 0.3141592653589793E1) = ~0.0 rem (~0.5E~323, 0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, 0.2718281828459045E1) = ~0.15E~322 + (~0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.5E~323, 0.2718281828459045E1) = ~0.0 nextAfter (~0.5E~323, 0.2718281828459045E1) = ~0.0 rem (~0.5E~323, 0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, 0.123E1) = ~0.5E~323 + (~0.5E~323, 0.123E1) = 0.123E1 - (~0.5E~323, 0.123E1) = ~0.123E1 / (~0.5E~323, 0.123E1) = ~0.5E~323 nextAfter (~0.5E~323, 0.123E1) = ~0.0 rem (~0.5E~323, 0.123E1) = ~0.5E~323 * (~0.5E~323, 0.123) = ~0.0 + (~0.5E~323, 0.123) = 0.123 - (~0.5E~323, 0.123) = ~0.123 / (~0.5E~323, 0.123) = ~0.4E~322 nextAfter (~0.5E~323, 0.123) = ~0.0 rem (~0.5E~323, 0.123) = ~0.5E~323 * (~0.5E~323, 0.123E~2) = ~0.0 + (~0.5E~323, 0.123E~2) = 0.123E~2 - (~0.5E~323, 0.123E~2) = ~0.123E~2 / (~0.5E~323, 0.123E~2) = ~0.4017E~320 nextAfter (~0.5E~323, 0.123E~2) = ~0.0 rem (~0.5E~323, 0.123E~2) = ~0.5E~323 * (~0.5E~323, 0.22250738585072014E~307) = ~0.0 + (~0.5E~323, 0.22250738585072014E~307) = 0.2225073858507201E~307 - (~0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507202E~307 / (~0.5E~323, 0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (~0.5E~323, 0.22250738585072014E~307) = ~0.0 rem (~0.5E~323, 0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, 0.11125369292536007E~307) = ~0.0 + (~0.5E~323, 0.11125369292536007E~307) = 0.11125369292536E~307 - (~0.5E~323, 0.11125369292536007E~307) = ~0.1112536929253601E~307 / (~0.5E~323, 0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (~0.5E~323, 0.11125369292536007E~307) = ~0.0 rem (~0.5E~323, 0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, 0.5E~323) = ~0.0 + (~0.5E~323, 0.5E~323) = 0.0 - (~0.5E~323, 0.5E~323) = ~0.1E~322 / (~0.5E~323, 0.5E~323) = ~0.1E1 nextAfter (~0.5E~323, 0.5E~323) = ~0.0 rem (~0.5E~323, 0.5E~323) = 0.0 * (~0.5E~323, 0.0) = ~0.0 + (~0.5E~323, 0.0) = ~0.5E~323 - (~0.5E~323, 0.0) = ~0.5E~323 / (~0.5E~323, 0.0) = ~inf nextAfter (~0.5E~323, 0.0) = ~0.0 rem (~0.5E~323, 0.0) = nan * (~0.5E~323, ~0.17976931348623157E309) = 0.8881784197001251E~15 + (~0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.5E~323, ~0.17976931348623157E309) = 0.0 nextAfter (~0.5E~323, ~0.17976931348623157E309) = ~0.1E~322 rem (~0.5E~323, ~0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, ~0.8988465674311579E308) = 0.44408920985006257E~15 + (~0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.5E~323, ~0.8988465674311579E308) = 0.0 nextAfter (~0.5E~323, ~0.8988465674311579E308) = ~0.1E~322 rem (~0.5E~323, ~0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, ~0.123E4) = 0.6077E~320 + (~0.5E~323, ~0.123E4) = ~0.123E4 - (~0.5E~323, ~0.123E4) = 0.123E4 / (~0.5E~323, ~0.123E4) = 0.0 nextAfter (~0.5E~323, ~0.123E4) = ~0.1E~322 rem (~0.5E~323, ~0.123E4) = ~0.5E~323 * (~0.5E~323, ~0.123E2) = 0.6E~322 + (~0.5E~323, ~0.123E2) = ~0.123E2 - (~0.5E~323, ~0.123E2) = 0.123E2 / (~0.5E~323, ~0.123E2) = 0.0 nextAfter (~0.5E~323, ~0.123E2) = ~0.1E~322 rem (~0.5E~323, ~0.123E2) = ~0.5E~323 * (~0.5E~323, ~0.3141592653589793E1) = 0.15E~322 + (~0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.5E~323, ~0.3141592653589793E1) = 0.0 nextAfter (~0.5E~323, ~0.3141592653589793E1) = ~0.1E~322 rem (~0.5E~323, ~0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, ~0.2718281828459045E1) = 0.15E~322 + (~0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.5E~323, ~0.2718281828459045E1) = 0.0 nextAfter (~0.5E~323, ~0.2718281828459045E1) = ~0.1E~322 rem (~0.5E~323, ~0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, ~0.123E1) = 0.5E~323 + (~0.5E~323, ~0.123E1) = ~0.123E1 - (~0.5E~323, ~0.123E1) = 0.123E1 / (~0.5E~323, ~0.123E1) = 0.5E~323 nextAfter (~0.5E~323, ~0.123E1) = ~0.1E~322 rem (~0.5E~323, ~0.123E1) = ~0.5E~323 * (~0.5E~323, ~0.123) = 0.0 + (~0.5E~323, ~0.123) = ~0.123 - (~0.5E~323, ~0.123) = 0.123 / (~0.5E~323, ~0.123) = 0.4E~322 nextAfter (~0.5E~323, ~0.123) = ~0.1E~322 rem (~0.5E~323, ~0.123) = ~0.5E~323 * (~0.5E~323, ~0.123E~2) = 0.0 + (~0.5E~323, ~0.123E~2) = ~0.123E~2 - (~0.5E~323, ~0.123E~2) = 0.123E~2 / (~0.5E~323, ~0.123E~2) = 0.4017E~320 nextAfter (~0.5E~323, ~0.123E~2) = ~0.1E~322 rem (~0.5E~323, ~0.123E~2) = ~0.5E~323 * (~0.5E~323, ~0.22250738585072014E~307) = 0.0 + (~0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507202E~307 - (~0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507201E~307 / (~0.5E~323, ~0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (~0.5E~323, ~0.22250738585072014E~307) = ~0.1E~322 rem (~0.5E~323, ~0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, ~0.11125369292536007E~307) = 0.0 + (~0.5E~323, ~0.11125369292536007E~307) = ~0.1112536929253601E~307 - (~0.5E~323, ~0.11125369292536007E~307) = 0.11125369292536E~307 / (~0.5E~323, ~0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (~0.5E~323, ~0.11125369292536007E~307) = ~0.1E~322 rem (~0.5E~323, ~0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, ~0.5E~323) = 0.0 + (~0.5E~323, ~0.5E~323) = ~0.1E~322 - (~0.5E~323, ~0.5E~323) = 0.0 / (~0.5E~323, ~0.5E~323) = 0.1E1 nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 rem (~0.5E~323, ~0.5E~323) = 0.0 * (~0.5E~323, ~0.0) = 0.0 + (~0.5E~323, ~0.0) = ~0.5E~323 - (~0.5E~323, ~0.0) = ~0.5E~323 / (~0.5E~323, ~0.0) = inf nextAfter (~0.5E~323, ~0.0) = ~0.0 rem (~0.5E~323, ~0.0) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.5E~323, ~inf) = inf + (~0.5E~323, ~inf) = ~inf - (~0.5E~323, ~inf) = inf / (~0.5E~323, ~inf) = 0.0 nextAfter (~0.5E~323, ~inf) = ~0.1E~322 rem (~0.5E~323, ~inf) = ~0.5E~323 * (~0.5E~323, nan) = nan + (~0.5E~323, nan) = nan - (~0.5E~323, nan) = nan / (~0.5E~323, nan) = nan nextAfter (~0.5E~323, nan) = nan rem (~0.5E~323, nan) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.0, 0.17976931348623157E309) = ~0.0 + (~0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.0, 0.17976931348623157E309) = ~0.0 nextAfter (~0.0, 0.17976931348623157E309) = 0.5E~323 rem (~0.0, 0.17976931348623157E309) = 0.0 * (~0.0, 0.8988465674311579E308) = ~0.0 + (~0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.0, 0.8988465674311579E308) = ~0.0 nextAfter (~0.0, 0.8988465674311579E308) = 0.5E~323 rem (~0.0, 0.8988465674311579E308) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.5E~323 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.5E~323 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.3141592653589793E1) = ~0.0 + (~0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.0, 0.3141592653589793E1) = ~0.0 nextAfter (~0.0, 0.3141592653589793E1) = 0.5E~323 rem (~0.0, 0.3141592653589793E1) = 0.0 * (~0.0, 0.2718281828459045E1) = ~0.0 + (~0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.0, 0.2718281828459045E1) = ~0.0 nextAfter (~0.0, 0.2718281828459045E1) = 0.5E~323 rem (~0.0, 0.2718281828459045E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.5E~323 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.5E~323 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.5E~323 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.22250738585072014E~307) = ~0.0 + (~0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (~0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (~0.0, 0.22250738585072014E~307) = ~0.0 nextAfter (~0.0, 0.22250738585072014E~307) = 0.5E~323 rem (~0.0, 0.22250738585072014E~307) = 0.0 * (~0.0, 0.11125369292536007E~307) = ~0.0 + (~0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (~0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.0, 0.11125369292536007E~307) = ~0.0 nextAfter (~0.0, 0.11125369292536007E~307) = 0.5E~323 rem (~0.0, 0.11125369292536007E~307) = 0.0 * (~0.0, 0.5E~323) = ~0.0 + (~0.0, 0.5E~323) = 0.5E~323 - (~0.0, 0.5E~323) = ~0.5E~323 / (~0.0, 0.5E~323) = ~0.0 nextAfter (~0.0, 0.5E~323) = 0.5E~323 rem (~0.0, 0.5E~323) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.17976931348623157E309) = 0.0 + (~0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.0, ~0.17976931348623157E309) = 0.0 nextAfter (~0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (~0.0, ~0.17976931348623157E309) = 0.0 * (~0.0, ~0.8988465674311579E308) = 0.0 + (~0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.0, ~0.8988465674311579E308) = 0.0 nextAfter (~0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (~0.0, ~0.8988465674311579E308) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.5E~323 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.5E~323 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.3141592653589793E1) = 0.0 + (~0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.0, ~0.3141592653589793E1) = 0.0 nextAfter (~0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (~0.0, ~0.3141592653589793E1) = 0.0 * (~0.0, ~0.2718281828459045E1) = 0.0 + (~0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.0, ~0.2718281828459045E1) = 0.0 nextAfter (~0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (~0.0, ~0.2718281828459045E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.5E~323 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.5E~323 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.5E~323 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.22250738585072014E~307) = 0.0 + (~0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (~0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (~0.0, ~0.22250738585072014E~307) = 0.0 nextAfter (~0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (~0.0, ~0.22250738585072014E~307) = 0.0 * (~0.0, ~0.11125369292536007E~307) = 0.0 + (~0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (~0.0, ~0.11125369292536007E~307) = 0.0 nextAfter (~0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (~0.0, ~0.11125369292536007E~307) = 0.0 * (~0.0, ~0.5E~323) = 0.0 + (~0.0, ~0.5E~323) = ~0.5E~323 - (~0.0, ~0.5E~323) = 0.5E~323 / (~0.0, ~0.5E~323) = 0.0 nextAfter (~0.0, ~0.5E~323) = ~0.5E~323 rem (~0.0, ~0.5E~323) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.5E~323 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.17976931348623157E309) = ~inf + (~inf, 0.17976931348623157E309) = ~inf - (~inf, 0.17976931348623157E309) = ~inf / (~inf, 0.17976931348623157E309) = ~inf nextAfter (~inf, 0.17976931348623157E309) = ~inf rem (~inf, 0.17976931348623157E309) = nan * (~inf, 0.8988465674311579E308) = ~inf + (~inf, 0.8988465674311579E308) = ~inf - (~inf, 0.8988465674311579E308) = ~inf / (~inf, 0.8988465674311579E308) = ~inf nextAfter (~inf, 0.8988465674311579E308) = ~inf rem (~inf, 0.8988465674311579E308) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.3141592653589793E1) = ~inf + (~inf, 0.3141592653589793E1) = ~inf - (~inf, 0.3141592653589793E1) = ~inf / (~inf, 0.3141592653589793E1) = ~inf nextAfter (~inf, 0.3141592653589793E1) = ~inf rem (~inf, 0.3141592653589793E1) = nan * (~inf, 0.2718281828459045E1) = ~inf + (~inf, 0.2718281828459045E1) = ~inf - (~inf, 0.2718281828459045E1) = ~inf / (~inf, 0.2718281828459045E1) = ~inf nextAfter (~inf, 0.2718281828459045E1) = ~inf rem (~inf, 0.2718281828459045E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.22250738585072014E~307) = ~inf + (~inf, 0.22250738585072014E~307) = ~inf - (~inf, 0.22250738585072014E~307) = ~inf / (~inf, 0.22250738585072014E~307) = ~inf nextAfter (~inf, 0.22250738585072014E~307) = ~inf rem (~inf, 0.22250738585072014E~307) = nan * (~inf, 0.11125369292536007E~307) = ~inf + (~inf, 0.11125369292536007E~307) = ~inf - (~inf, 0.11125369292536007E~307) = ~inf / (~inf, 0.11125369292536007E~307) = ~inf nextAfter (~inf, 0.11125369292536007E~307) = ~inf rem (~inf, 0.11125369292536007E~307) = nan * (~inf, 0.5E~323) = ~inf + (~inf, 0.5E~323) = ~inf - (~inf, 0.5E~323) = ~inf / (~inf, 0.5E~323) = ~inf nextAfter (~inf, 0.5E~323) = ~inf rem (~inf, 0.5E~323) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.17976931348623157E309) = inf + (~inf, ~0.17976931348623157E309) = ~inf - (~inf, ~0.17976931348623157E309) = ~inf / (~inf, ~0.17976931348623157E309) = inf nextAfter (~inf, ~0.17976931348623157E309) = ~inf rem (~inf, ~0.17976931348623157E309) = nan * (~inf, ~0.8988465674311579E308) = inf + (~inf, ~0.8988465674311579E308) = ~inf - (~inf, ~0.8988465674311579E308) = ~inf / (~inf, ~0.8988465674311579E308) = inf nextAfter (~inf, ~0.8988465674311579E308) = ~inf rem (~inf, ~0.8988465674311579E308) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.3141592653589793E1) = inf + (~inf, ~0.3141592653589793E1) = ~inf - (~inf, ~0.3141592653589793E1) = ~inf / (~inf, ~0.3141592653589793E1) = inf nextAfter (~inf, ~0.3141592653589793E1) = ~inf rem (~inf, ~0.3141592653589793E1) = nan * (~inf, ~0.2718281828459045E1) = inf + (~inf, ~0.2718281828459045E1) = ~inf - (~inf, ~0.2718281828459045E1) = ~inf / (~inf, ~0.2718281828459045E1) = inf nextAfter (~inf, ~0.2718281828459045E1) = ~inf rem (~inf, ~0.2718281828459045E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.22250738585072014E~307) = inf + (~inf, ~0.22250738585072014E~307) = ~inf - (~inf, ~0.22250738585072014E~307) = ~inf / (~inf, ~0.22250738585072014E~307) = inf nextAfter (~inf, ~0.22250738585072014E~307) = ~inf rem (~inf, ~0.22250738585072014E~307) = nan * (~inf, ~0.11125369292536007E~307) = inf + (~inf, ~0.11125369292536007E~307) = ~inf - (~inf, ~0.11125369292536007E~307) = ~inf / (~inf, ~0.11125369292536007E~307) = inf nextAfter (~inf, ~0.11125369292536007E~307) = ~inf rem (~inf, ~0.11125369292536007E~307) = nan * (~inf, ~0.5E~323) = inf + (~inf, ~0.5E~323) = ~inf - (~inf, ~0.5E~323) = ~inf / (~inf, ~0.5E~323) = inf nextAfter (~inf, ~0.5E~323) = ~inf rem (~inf, ~0.5E~323) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.17976931348623157E309) = nan + (nan, 0.17976931348623157E309) = nan - (nan, 0.17976931348623157E309) = nan / (nan, 0.17976931348623157E309) = nan nextAfter (nan, 0.17976931348623157E309) = nan rem (nan, 0.17976931348623157E309) = nan * (nan, 0.8988465674311579E308) = nan + (nan, 0.8988465674311579E308) = nan - (nan, 0.8988465674311579E308) = nan / (nan, 0.8988465674311579E308) = nan nextAfter (nan, 0.8988465674311579E308) = nan rem (nan, 0.8988465674311579E308) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.3141592653589793E1) = nan + (nan, 0.3141592653589793E1) = nan - (nan, 0.3141592653589793E1) = nan / (nan, 0.3141592653589793E1) = nan nextAfter (nan, 0.3141592653589793E1) = nan rem (nan, 0.3141592653589793E1) = nan * (nan, 0.2718281828459045E1) = nan + (nan, 0.2718281828459045E1) = nan - (nan, 0.2718281828459045E1) = nan / (nan, 0.2718281828459045E1) = nan nextAfter (nan, 0.2718281828459045E1) = nan rem (nan, 0.2718281828459045E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.22250738585072014E~307) = nan + (nan, 0.22250738585072014E~307) = nan - (nan, 0.22250738585072014E~307) = nan / (nan, 0.22250738585072014E~307) = nan nextAfter (nan, 0.22250738585072014E~307) = nan rem (nan, 0.22250738585072014E~307) = nan * (nan, 0.11125369292536007E~307) = nan + (nan, 0.11125369292536007E~307) = nan - (nan, 0.11125369292536007E~307) = nan / (nan, 0.11125369292536007E~307) = nan nextAfter (nan, 0.11125369292536007E~307) = nan rem (nan, 0.11125369292536007E~307) = nan * (nan, 0.5E~323) = nan + (nan, 0.5E~323) = nan - (nan, 0.5E~323) = nan / (nan, 0.5E~323) = nan nextAfter (nan, 0.5E~323) = nan rem (nan, 0.5E~323) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.17976931348623157E309) = nan + (nan, ~0.17976931348623157E309) = nan - (nan, ~0.17976931348623157E309) = nan / (nan, ~0.17976931348623157E309) = nan nextAfter (nan, ~0.17976931348623157E309) = nan rem (nan, ~0.17976931348623157E309) = nan * (nan, ~0.8988465674311579E308) = nan + (nan, ~0.8988465674311579E308) = nan - (nan, ~0.8988465674311579E308) = nan / (nan, ~0.8988465674311579E308) = nan nextAfter (nan, ~0.8988465674311579E308) = nan rem (nan, ~0.8988465674311579E308) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.3141592653589793E1) = nan + (nan, ~0.3141592653589793E1) = nan - (nan, ~0.3141592653589793E1) = nan / (nan, ~0.3141592653589793E1) = nan nextAfter (nan, ~0.3141592653589793E1) = nan rem (nan, ~0.3141592653589793E1) = nan * (nan, ~0.2718281828459045E1) = nan + (nan, ~0.2718281828459045E1) = nan - (nan, ~0.2718281828459045E1) = nan / (nan, ~0.2718281828459045E1) = nan nextAfter (nan, ~0.2718281828459045E1) = nan rem (nan, ~0.2718281828459045E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.22250738585072014E~307) = nan + (nan, ~0.22250738585072014E~307) = nan - (nan, ~0.22250738585072014E~307) = nan / (nan, ~0.22250738585072014E~307) = nan nextAfter (nan, ~0.22250738585072014E~307) = nan rem (nan, ~0.22250738585072014E~307) = nan * (nan, ~0.11125369292536007E~307) = nan + (nan, ~0.11125369292536007E~307) = nan - (nan, ~0.11125369292536007E~307) = nan / (nan, ~0.11125369292536007E~307) = nan nextAfter (nan, ~0.11125369292536007E~307) = nan rem (nan, ~0.11125369292536007E~307) = nan * (nan, ~0.5E~323) = nan + (nan, ~0.5E~323) = nan - (nan, ~0.5E~323) = nan / (nan, ~0.5E~323) = nan nextAfter (nan, ~0.5E~323) = nan rem (nan, ~0.5E~323) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.17976931348623157E309) = nan asin (0.17976931348623157E309) = nan atan (0.17976931348623157E309) = 1.570796327 cos (0.17976931348623157E309) = ~0.9999876894 cosh (0.17976931348623157E309) = inf exp (0.17976931348623157E309) = inf ln (0.17976931348623157E309) = 709.7827129 log10 (0.17976931348623157E309) = 308.2547156 sin (0.17976931348623157E309) = 0.004961954789 sinh (0.17976931348623157E309) = inf sqrt (0.17976931348623157E309) = 1.340780793E154 tan (0.17976931348623157E309) = ~0.004962015874 tanh (0.17976931348623157E309) = 1 acos (0.8988465674311579E308) = nan asin (0.8988465674311579E308) = nan atan (0.8988465674311579E308) = 1.570796327 cos (0.8988465674311579E308) = 0.00248098503 cosh (0.8988465674311579E308) = inf exp (0.8988465674311579E308) = inf ln (0.8988465674311579E308) = 709.0895657 log10 (0.8988465674311579E308) = 307.9536856 sin (0.8988465674311579E308) = 0.9999969224 sinh (0.8988465674311579E308) = inf sqrt (0.8988465674311579E308) = 9.480751908E153 tan (0.8988465674311579E308) = 403.0644725 tanh (0.8988465674311579E308) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983319 cos (0.123E4) = 0.06642716993 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769448 log10 (0.123E4) = 3.089905111 sin (0.123E4) = ~0.9977912763 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135583 tan (0.123E4) = ~15.02083074 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673935 cos (0.123E2) = 0.9647326179 cosh (0.123E2) = 109847.9943 exp (0.123E2) = 219695.9887 ln (0.123E2) = 2.509599262 log10 (0.123E2) = 1.089905111 sin (0.123E2) = ~0.2632317914 sinh (0.123E2) = 109847.9943 sqrt (0.123E2) = 3.507135583 tan (0.123E2) = ~0.272854661 tanh (0.123E2) = 1 acos (0.3141592653589793E1) = nan asin (0.3141592653589793E1) = nan atan (0.3141592653589793E1) = 1.262627256 cos (0.3141592653589793E1) = ~1 cosh (0.3141592653589793E1) = 11.59195328 exp (0.3141592653589793E1) = 23.14069263 ln (0.3141592653589793E1) = 1.144729886 log10 (0.3141592653589793E1) = 0.4971498727 sin (0.3141592653589793E1) = 1.224646799E~16 sinh (0.3141592653589793E1) = 11.54873936 sqrt (0.3141592653589793E1) = 1.772453851 tan (0.3141592653589793E1) = ~1.224646799E~16 tanh (0.3141592653589793E1) = 0.9962720762 acos (0.2718281828459045E1) = nan asin (0.2718281828459045E1) = nan atan (0.2718281828459045E1) = 1.218282905 cos (0.2718281828459045E1) = ~0.9117339148 cosh (0.2718281828459045E1) = 7.610125139 exp (0.2718281828459045E1) = 15.15426224 ln (0.2718281828459045E1) = 1 log10 (0.2718281828459045E1) = 0.4342944819 sin (0.2718281828459045E1) = 0.4107812905 sinh (0.2718281828459045E1) = 7.544137103 sqrt (0.2718281828459045E1) = 1.648721271 tan (0.2718281828459045E1) = ~0.4505495341 tanh (0.2718281828459045E1) = 0.9913289158 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.8881737744 cos (0.123E1) = 0.3342377271 cosh (0.123E1) = 1.856761057 exp (0.123E1) = 3.421229536 ln (0.123E1) = 0.2070141694 log10 (0.123E1) = 0.08990511144 sin (0.123E1) = 0.9424888019 sinh (0.123E1) = 1.564468479 sqrt (0.123E1) = 1.109053651 tan (0.123E1) = 2.819815734 tanh (0.123E1) = 0.8425793257 acos (0.123) = 1.447484052 asin (0.123) = 0.1233122752 atan (0.123) = 0.1223852815 cos (0.123) = 0.9924450321 cosh (0.123) = 1.007574042 exp (0.123) = 1.130884421 ln (0.123) = ~2.095570924 log10 (0.123) = ~0.9100948886 sin (0.123) = 0.12269009 sinh (0.123) = 0.1233103792 sqrt (0.123) = 0.3507135583 tan (0.123) = 0.1236240659 tanh (0.123) = 0.1223834419 acos (0.123E~2) = 1.569566326 asin (0.123E~2) = 0.00123000031 atan (0.123E~2) = 0.00122999938 cos (0.123E~2) = 0.9999992436 cosh (0.123E~2) = 1.000000756 exp (0.123E~2) = 1.001230757 ln (0.123E~2) = ~6.70074111 log10 (0.123E~2) = ~2.910094889 sin (0.123E~2) = 0.00122999969 sinh (0.123E~2) = 0.00123000031 sqrt (0.123E~2) = 0.03507135583 tan (0.123E~2) = 0.00123000062 tanh (0.123E~2) = 0.00122999938 acos (0.22250738585072014E~307) = 1.570796327 asin (0.22250738585072014E~307) = 2.225073859E~308 atan (0.22250738585072014E~307) = 2.225073859E~308 cos (0.22250738585072014E~307) = 1 cosh (0.22250738585072014E~307) = 1 exp (0.22250738585072014E~307) = 1 ln (0.22250738585072014E~307) = ~708.3964185 log10 (0.22250738585072014E~307) = ~307.6526556 sin (0.22250738585072014E~307) = 2.225073859E~308 sinh (0.22250738585072014E~307) = 2.225073859E~308 sqrt (0.22250738585072014E~307) = 1.491668146E~154 tan (0.22250738585072014E~307) = 2.225073859E~308 tanh (0.22250738585072014E~307) = 2.225073859E~308 acos (0.11125369292536007E~307) = 1.570796327 asin (0.11125369292536007E~307) = 1.112536929E~308 atan (0.11125369292536007E~307) = 1.112536929E~308 cos (0.11125369292536007E~307) = 1 cosh (0.11125369292536007E~307) = 1 exp (0.11125369292536007E~307) = 1 ln (0.11125369292536007E~307) = ~709.0895657 log10 (0.11125369292536007E~307) = ~307.9536856 sin (0.11125369292536007E~307) = 1.112536929E~308 sinh (0.11125369292536007E~307) = 1.112536929E~308 sqrt (0.11125369292536007E~307) = 1.054768661E~154 tan (0.11125369292536007E~307) = 1.112536929E~308 tanh (0.11125369292536007E~307) = 1.112536929E~308 acos (0.5E~323) = 1.570796327 asin (0.5E~323) = 4.940656458E~324 atan (0.5E~323) = 4.940656458E~324 cos (0.5E~323) = 1 cosh (0.5E~323) = 1 exp (0.5E~323) = 1 ln (0.5E~323) = ~744.4400719 log10 (0.5E~323) = ~323.3062153 sin (0.5E~323) = 4.940656458E~324 sinh (0.5E~323) = 4.940656458E~324 sqrt (0.5E~323) = 2.222758749E~162 tan (0.5E~323) = 4.940656458E~324 tanh (0.5E~323) = 4.940656458E~324 acos (0.0) = 1.570796327 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.17976931348623157E309) = nan asin (~0.17976931348623157E309) = nan atan (~0.17976931348623157E309) = ~1.570796327 cos (~0.17976931348623157E309) = ~0.9999876894 cosh (~0.17976931348623157E309) = inf exp (~0.17976931348623157E309) = 0 ln (~0.17976931348623157E309) = nan log10 (~0.17976931348623157E309) = nan sin (~0.17976931348623157E309) = ~0.004961954789 sinh (~0.17976931348623157E309) = ~inf sqrt (~0.17976931348623157E309) = nan tan (~0.17976931348623157E309) = 0.004962015874 tanh (~0.17976931348623157E309) = ~1 acos (~0.8988465674311579E308) = nan asin (~0.8988465674311579E308) = nan atan (~0.8988465674311579E308) = ~1.570796327 cos (~0.8988465674311579E308) = 0.00248098503 cosh (~0.8988465674311579E308) = inf exp (~0.8988465674311579E308) = 0 ln (~0.8988465674311579E308) = nan log10 (~0.8988465674311579E308) = nan sin (~0.8988465674311579E308) = ~0.9999969224 sinh (~0.8988465674311579E308) = ~inf sqrt (~0.8988465674311579E308) = nan tan (~0.8988465674311579E308) = ~403.0644725 tanh (~0.8988465674311579E308) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983319 cos (~0.123E4) = 0.06642716993 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912763 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083074 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673935 cos (~0.123E2) = 0.9647326179 cosh (~0.123E2) = 109847.9943 exp (~0.123E2) = 4.551744463E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632317914 sinh (~0.123E2) = ~109847.9943 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.272854661 tanh (~0.123E2) = ~1 acos (~0.3141592653589793E1) = nan asin (~0.3141592653589793E1) = nan atan (~0.3141592653589793E1) = ~1.262627256 cos (~0.3141592653589793E1) = ~1 cosh (~0.3141592653589793E1) = 11.59195328 exp (~0.3141592653589793E1) = 0.04321391826 ln (~0.3141592653589793E1) = nan log10 (~0.3141592653589793E1) = nan sin (~0.3141592653589793E1) = ~1.224646799E~16 sinh (~0.3141592653589793E1) = ~11.54873936 sqrt (~0.3141592653589793E1) = nan tan (~0.3141592653589793E1) = 1.224646799E~16 tanh (~0.3141592653589793E1) = ~0.9962720762 acos (~0.2718281828459045E1) = nan asin (~0.2718281828459045E1) = nan atan (~0.2718281828459045E1) = ~1.218282905 cos (~0.2718281828459045E1) = ~0.9117339148 cosh (~0.2718281828459045E1) = 7.610125139 exp (~0.2718281828459045E1) = 0.06598803585 ln (~0.2718281828459045E1) = nan log10 (~0.2718281828459045E1) = nan sin (~0.2718281828459045E1) = ~0.4107812905 sinh (~0.2718281828459045E1) = ~7.544137103 sqrt (~0.2718281828459045E1) = nan tan (~0.2718281828459045E1) = 0.4505495341 tanh (~0.2718281828459045E1) = ~0.9913289158 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.8881737744 cos (~0.123E1) = 0.3342377271 cosh (~0.123E1) = 1.856761057 exp (~0.123E1) = 0.2922925777 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424888019 sinh (~0.123E1) = ~1.564468479 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815734 tanh (~0.123E1) = ~0.8425793257 acos (~0.123) = 1.694108602 asin (~0.123) = ~0.1233122752 atan (~0.123) = ~0.1223852815 cos (~0.123) = 0.9924450321 cosh (~0.123) = 1.007574042 exp (~0.123) = 0.8842636626 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.12269009 sinh (~0.123) = ~0.1233103792 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240659 tanh (~0.123) = ~0.1223834419 acos (~0.123E~2) = 1.572026327 asin (~0.123E~2) = ~0.00123000031 atan (~0.123E~2) = ~0.00122999938 cos (~0.123E~2) = 0.9999992436 cosh (~0.123E~2) = 1.000000756 exp (~0.123E~2) = 0.9987707561 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.00122999969 sinh (~0.123E~2) = ~0.00123000031 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.00123000062 tanh (~0.123E~2) = ~0.00122999938 acos (~0.22250738585072014E~307) = 1.570796327 asin (~0.22250738585072014E~307) = ~2.225073859E~308 atan (~0.22250738585072014E~307) = ~2.225073859E~308 cos (~0.22250738585072014E~307) = 1 cosh (~0.22250738585072014E~307) = 1 exp (~0.22250738585072014E~307) = 1 ln (~0.22250738585072014E~307) = nan log10 (~0.22250738585072014E~307) = nan sin (~0.22250738585072014E~307) = ~2.225073859E~308 sinh (~0.22250738585072014E~307) = ~2.225073859E~308 sqrt (~0.22250738585072014E~307) = nan tan (~0.22250738585072014E~307) = ~2.225073859E~308 tanh (~0.22250738585072014E~307) = ~2.225073859E~308 acos (~0.11125369292536007E~307) = 1.570796327 asin (~0.11125369292536007E~307) = ~1.112536929E~308 atan (~0.11125369292536007E~307) = ~1.112536929E~308 cos (~0.11125369292536007E~307) = 1 cosh (~0.11125369292536007E~307) = 1 exp (~0.11125369292536007E~307) = 1 ln (~0.11125369292536007E~307) = nan log10 (~0.11125369292536007E~307) = nan sin (~0.11125369292536007E~307) = ~1.112536929E~308 sinh (~0.11125369292536007E~307) = ~1.112536929E~308 sqrt (~0.11125369292536007E~307) = nan tan (~0.11125369292536007E~307) = ~1.112536929E~308 tanh (~0.11125369292536007E~307) = ~1.112536929E~308 acos (~0.5E~323) = 1.570796327 asin (~0.5E~323) = ~4.940656458E~324 atan (~0.5E~323) = ~4.940656458E~324 cos (~0.5E~323) = 1 cosh (~0.5E~323) = 1 exp (~0.5E~323) = 1 ln (~0.5E~323) = nan log10 (~0.5E~323) = nan sin (~0.5E~323) = ~4.940656458E~324 sinh (~0.5E~323) = ~4.940656458E~324 sqrt (~0.5E~323) = nan tan (~0.5E~323) = ~4.940656458E~324 tanh (~0.5E~323) = ~4.940656458E~324 acos (~0.0) = 1.570796327 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796327 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.17976931348623157E309, 0.17976931348623157E309) = 0.7853981634 pow (0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (0.17976931348623157E309, 0.8988465674311579E308) = 1.107148718 pow (0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (0.17976931348623157E309, 0.123E4) = 1.570796327 pow (0.17976931348623157E309, 0.123E4) = inf atan2 (0.17976931348623157E309, 0.123E2) = 1.570796327 pow (0.17976931348623157E309, 0.123E2) = inf atan2 (0.17976931348623157E309, 0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, 0.3141592653589793E1) = inf atan2 (0.17976931348623157E309, 0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, 0.2718281828459045E1) = inf atan2 (0.17976931348623157E309, 0.123E1) = 1.570796327 pow (0.17976931348623157E309, 0.123E1) = inf atan2 (0.17976931348623157E309, 0.123) = 1.570796327 pow (0.17976931348623157E309, 0.123) = 8.228676973E37 atan2 (0.17976931348623157E309, 0.123E~2) = 1.570796327 pow (0.17976931348623157E309, 0.123E~2) = 2.394160714 atan2 (0.17976931348623157E309, 0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, 0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, 0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, 0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, 0.5E~323) = 1.570796327 pow (0.17976931348623157E309, 0.5E~323) = 1 atan2 (0.17976931348623157E309, 0.0) = 1.570796327 pow (0.17976931348623157E309, 0.0) = 1 atan2 (0.17976931348623157E309, ~0.17976931348623157E309) = 2.35619449 pow (0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (0.17976931348623157E309, ~0.8988465674311579E308) = 2.034443936 pow (0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (0.17976931348623157E309, ~0.123E4) = 1.570796327 pow (0.17976931348623157E309, ~0.123E4) = 0 atan2 (0.17976931348623157E309, ~0.123E2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E2) = 0 atan2 (0.17976931348623157E309, ~0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, ~0.3141592653589793E1) = 0 atan2 (0.17976931348623157E309, ~0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, ~0.2718281828459045E1) = 0 atan2 (0.17976931348623157E309, ~0.123E1) = 1.570796327 pow (0.17976931348623157E309, ~0.123E1) = 0 atan2 (0.17976931348623157E309, ~0.123) = 1.570796327 pow (0.17976931348623157E309, ~0.123) = 1.21526219E~38 atan2 (0.17976931348623157E309, ~0.123E~2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E~2) = 0.4176829041 atan2 (0.17976931348623157E309, ~0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, ~0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, ~0.5E~323) = 1.570796327 pow (0.17976931348623157E309, ~0.5E~323) = 1 atan2 (0.17976931348623157E309, ~0.0) = 1.570796327 pow (0.17976931348623157E309, ~0.0) = 1 atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.17976931348623157E309, ~inf) = 3.141592654 pow (0.17976931348623157E309, ~inf) = 0 atan2 (0.17976931348623157E309, nan) = nan pow (0.17976931348623157E309, nan) = nan atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.8988465674311579E308, 0.17976931348623157E309) = 0.463647609 pow (0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (0.8988465674311579E308, 0.8988465674311579E308) = 0.7853981634 pow (0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (0.8988465674311579E308, 0.123E4) = 1.570796327 pow (0.8988465674311579E308, 0.123E4) = inf atan2 (0.8988465674311579E308, 0.123E2) = 1.570796327 pow (0.8988465674311579E308, 0.123E2) = inf atan2 (0.8988465674311579E308, 0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, 0.3141592653589793E1) = inf atan2 (0.8988465674311579E308, 0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, 0.2718281828459045E1) = inf atan2 (0.8988465674311579E308, 0.123E1) = 1.570796327 pow (0.8988465674311579E308, 0.123E1) = inf atan2 (0.8988465674311579E308, 0.123) = 1.570796327 pow (0.8988465674311579E308, 0.123) = 7.556197911E37 atan2 (0.8988465674311579E308, 0.123E~2) = 1.570796327 pow (0.8988465674311579E308, 0.123E~2) = 2.392120392 atan2 (0.8988465674311579E308, 0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, 0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, 0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, 0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, 0.5E~323) = 1.570796327 pow (0.8988465674311579E308, 0.5E~323) = 1 atan2 (0.8988465674311579E308, 0.0) = 1.570796327 pow (0.8988465674311579E308, 0.0) = 1 atan2 (0.8988465674311579E308, ~0.17976931348623157E309) = 2.677945045 pow (0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (0.8988465674311579E308, ~0.8988465674311579E308) = 2.35619449 pow (0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (0.8988465674311579E308, ~0.123E4) = 1.570796327 pow (0.8988465674311579E308, ~0.123E4) = 0 atan2 (0.8988465674311579E308, ~0.123E2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E2) = 0 atan2 (0.8988465674311579E308, ~0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, ~0.3141592653589793E1) = 0 atan2 (0.8988465674311579E308, ~0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, ~0.2718281828459045E1) = 0 atan2 (0.8988465674311579E308, ~0.123E1) = 1.570796327 pow (0.8988465674311579E308, ~0.123E1) = 0 atan2 (0.8988465674311579E308, ~0.123) = 1.570796327 pow (0.8988465674311579E308, ~0.123) = 1.323416898E~38 atan2 (0.8988465674311579E308, ~0.123E~2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E~2) = 0.4180391603 atan2 (0.8988465674311579E308, ~0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, ~0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, ~0.5E~323) = 1.570796327 pow (0.8988465674311579E308, ~0.5E~323) = 1 atan2 (0.8988465674311579E308, ~0.0) = 1.570796327 pow (0.8988465674311579E308, ~0.0) = 1 atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.8988465674311579E308, ~inf) = 3.141592654 pow (0.8988465674311579E308, ~inf) = 0 atan2 (0.8988465674311579E308, nan) = nan pow (0.8988465674311579E308, nan) = nan atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.123E4, 0.17976931348623157E309) = 6.842102115E~306 pow (0.123E4, 0.17976931348623157E309) = inf atan2 (0.123E4, 0.8988465674311579E308) = 1.368420423E~305 pow (0.123E4, 0.8988465674311579E308) = inf atan2 (0.123E4, 0.123E4) = 0.7853981634 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.56079666 pow (0.123E4, 0.123E2) = 1.013521278E38 atan2 (0.123E4, 0.3141592653589793E1) = 1.568242192 pow (0.123E4, 0.3141592653589793E1) = 5095927004 atan2 (0.123E4, 0.2718281828459045E1) = 1.568586345 pow (0.123E4, 0.2718281828459045E1) = 250745366.3 atan2 (0.123E4, 0.123E1) = 1.569796327 pow (0.123E4, 0.123E1) = 6318.053325 atan2 (0.123E4, 0.123) = 1.570696327 pow (0.123E4, 0.123) = 2.39915512 atan2 (0.123E4, 0.123E~2) = 1.570795327 pow (0.123E4, 0.123E~2) = 1.00878957 atan2 (0.123E4, 0.22250738585072014E~307) = 1.570796327 pow (0.123E4, 0.22250738585072014E~307) = 1 atan2 (0.123E4, 0.11125369292536007E~307) = 1.570796327 pow (0.123E4, 0.11125369292536007E~307) = 1 atan2 (0.123E4, 0.5E~323) = 1.570796327 pow (0.123E4, 0.5E~323) = 1 atan2 (0.123E4, 0.0) = 1.570796327 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.17976931348623157E309) = 3.141592654 pow (0.123E4, ~0.17976931348623157E309) = 0 atan2 (0.123E4, ~0.8988465674311579E308) = 3.141592654 pow (0.123E4, ~0.8988465674311579E308) = 0 atan2 (0.123E4, ~0.123E4) = 2.35619449 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580795993 pow (0.123E4, ~0.123E2) = 9.86659108E~39 atan2 (0.123E4, ~0.3141592653589793E1) = 1.573350462 pow (0.123E4, ~0.3141592653589793E1) = 1.9623515E~10 atan2 (0.123E4, ~0.2718281828459045E1) = 1.573006308 pow (0.123E4, ~0.2718281828459045E1) = 3.98810959E~9 atan2 (0.123E4, ~0.123E1) = 1.571796326 pow (0.123E4, ~0.123E1) = 1.582766002E~4 atan2 (0.123E4, ~0.123) = 1.570896327 pow (0.123E4, ~0.123) = 0.4168133988 atan2 (0.123E4, ~0.123E~2) = 1.570797327 pow (0.123E4, ~0.123E~2) = 0.9912870136 atan2 (0.123E4, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E4, ~0.22250738585072014E~307) = 1 atan2 (0.123E4, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E4, ~0.11125369292536007E~307) = 1 atan2 (0.123E4, ~0.5E~323) = 1.570796327 pow (0.123E4, ~0.5E~323) = 1 atan2 (0.123E4, ~0.0) = 1.570796327 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592654 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.17976931348623157E309) = 6.842102115E~308 pow (0.123E2, 0.17976931348623157E309) = inf atan2 (0.123E2, 0.8988465674311579E308) = 1.368420423E~307 pow (0.123E2, 0.8988465674311579E308) = inf atan2 (0.123E2, 0.123E4) = 0.009999666687 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981634 pow (0.123E2, 0.123E2) = 2.545850346E13 atan2 (0.123E2, 0.3141592653589793E1) = 1.320728626 pow (0.123E2, 0.3141592653589793E1) = 2654.83718 atan2 (0.123E2, 0.2718281828459045E1) = 1.353293796 pow (0.123E2, 0.2718281828459045E1) = 917.6334984 atan2 (0.123E2, 0.123E1) = 1.471127674 pow (0.123E2, 0.123E1) = 21.90701911 atan2 (0.123E2, 0.123) = 1.56079666 pow (0.123E2, 0.123) = 1.361627546 atan2 (0.123E2, 0.123E~2) = 1.570696327 pow (0.123E2, 0.123E~2) = 1.003091576 atan2 (0.123E2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E2, 0.22250738585072014E~307) = 1 atan2 (0.123E2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E2, 0.11125369292536007E~307) = 1 atan2 (0.123E2, 0.5E~323) = 1.570796327 pow (0.123E2, 0.5E~323) = 1 atan2 (0.123E2, 0.0) = 1.570796327 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E2, ~0.17976931348623157E309) = 0 atan2 (0.123E2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E2, ~0.8988465674311579E308) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592987 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.35619449 pow (0.123E2, ~0.123E2) = 3.927960658E~14 atan2 (0.123E2, ~0.3141592653589793E1) = 1.820864027 pow (0.123E2, ~0.3141592653589793E1) = 3.766709339E~4 atan2 (0.123E2, ~0.2718281828459045E1) = 1.788298857 pow (0.123E2, ~0.2718281828459045E1) = 0.001089759694 atan2 (0.123E2, ~0.123E1) = 1.670464979 pow (0.123E2, ~0.123E1) = 0.04564747011 atan2 (0.123E2, ~0.123) = 1.580795993 pow (0.123E2, ~0.123) = 0.7344152246 atan2 (0.123E2, ~0.123E~2) = 1.570896327 pow (0.123E2, ~0.123E~2) = 0.9969179522 atan2 (0.123E2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E2, ~0.22250738585072014E~307) = 1 atan2 (0.123E2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E2, ~0.11125369292536007E~307) = 1 atan2 (0.123E2, ~0.5E~323) = 1.570796327 pow (0.123E2, ~0.5E~323) = 1 atan2 (0.123E2, ~0.0) = 1.570796327 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592654 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.3141592653589793E1, 0.17976931348623157E309) = 1.747568922E~308 pow (0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (0.3141592653589793E1, 0.8988465674311579E308) = 3.495137844E~308 pow (0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (0.3141592653589793E1, 0.123E4) = 0.002554134815 pow (0.3141592653589793E1, 0.123E4) = inf atan2 (0.3141592653589793E1, 0.123E2) = 0.2500677004 pow (0.3141592653589793E1, 0.123E2) = 1302997.055 atan2 (0.3141592653589793E1, 0.3141592653589793E1) = 0.7853981634 pow (0.3141592653589793E1, 0.3141592653589793E1) = 36.46215961 atan2 (0.3141592653589793E1, 0.2718281828459045E1) = 0.8575117864 pow (0.3141592653589793E1, 0.2718281828459045E1) = 22.45915772 atan2 (0.3141592653589793E1, 0.123E1) = 1.197620596 pow (0.3141592653589793E1, 0.123E1) = 4.087844278 atan2 (0.3141592653589793E1, 0.123) = 1.531664198 pow (0.3141592653589793E1, 0.123) = 1.151196431 atan2 (0.3141592653589793E1, 0.123E~2) = 1.570404806 pow (0.3141592653589793E1, 0.123E~2) = 1.001409009 atan2 (0.3141592653589793E1, 0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, 0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, 0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, 0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, 0.5E~323) = 1.570796327 pow (0.3141592653589793E1, 0.5E~323) = 1 atan2 (0.3141592653589793E1, 0.0) = 1.570796327 pow (0.3141592653589793E1, 0.0) = 1 atan2 (0.3141592653589793E1, ~0.17976931348623157E309) = 3.141592654 pow (0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (0.3141592653589793E1, ~0.8988465674311579E308) = 3.141592654 pow (0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (0.3141592653589793E1, ~0.123E4) = 3.139038519 pow (0.3141592653589793E1, ~0.123E4) = 0 atan2 (0.3141592653589793E1, ~0.123E2) = 2.891524953 pow (0.3141592653589793E1, ~0.123E2) = 7.674614429E~7 atan2 (0.3141592653589793E1, ~0.3141592653589793E1) = 2.35619449 pow (0.3141592653589793E1, ~0.3141592653589793E1) = 0.02742569312 atan2 (0.3141592653589793E1, ~0.2718281828459045E1) = 2.284080867 pow (0.3141592653589793E1, ~0.2718281828459045E1) = 0.04452526727 atan2 (0.3141592653589793E1, ~0.123E1) = 1.943972057 pow (0.3141592653589793E1, ~0.123E1) = 0.2446277138 atan2 (0.3141592653589793E1, ~0.123) = 1.609928456 pow (0.3141592653589793E1, ~0.123) = 0.8686614842 atan2 (0.3141592653589793E1, ~0.123E~2) = 1.571187848 pow (0.3141592653589793E1, ~0.123E~2) = 0.998592973 atan2 (0.3141592653589793E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, ~0.5E~323) = 1.570796327 pow (0.3141592653589793E1, ~0.5E~323) = 1 atan2 (0.3141592653589793E1, ~0.0) = 1.570796327 pow (0.3141592653589793E1, ~0.0) = 1 atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.3141592653589793E1, ~inf) = 3.141592654 pow (0.3141592653589793E1, ~inf) = 0 atan2 (0.3141592653589793E1, nan) = nan pow (0.3141592653589793E1, nan) = nan atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.2718281828459045E1, 0.17976931348623157E309) = 1.512094459E~308 pow (0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (0.2718281828459045E1, 0.8988465674311579E308) = 3.024188918E~308 pow (0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (0.2718281828459045E1, 0.123E4) = 0.002209981629 pow (0.2718281828459045E1, 0.123E4) = inf atan2 (0.2718281828459045E1, 0.123E2) = 0.2175025304 pow (0.2718281828459045E1, 0.123E2) = 219695.9887 atan2 (0.2718281828459045E1, 0.3141592653589793E1) = 0.7132845404 pow (0.2718281828459045E1, 0.3141592653589793E1) = 23.14069263 atan2 (0.2718281828459045E1, 0.2718281828459045E1) = 0.7853981634 pow (0.2718281828459045E1, 0.2718281828459045E1) = 15.15426224 atan2 (0.2718281828459045E1, 0.123E1) = 1.145872224 pow (0.2718281828459045E1, 0.123E1) = 3.421229536 atan2 (0.2718281828459045E1, 0.123) = 1.525578 pow (0.2718281828459045E1, 0.123) = 1.130884421 atan2 (0.2718281828459045E1, 0.123E~2) = 1.570343835 pow (0.2718281828459045E1, 0.123E~2) = 1.001230757 atan2 (0.2718281828459045E1, 0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, 0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, 0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, 0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, 0.5E~323) = 1.570796327 pow (0.2718281828459045E1, 0.5E~323) = 1 atan2 (0.2718281828459045E1, 0.0) = 1.570796327 pow (0.2718281828459045E1, 0.0) = 1 atan2 (0.2718281828459045E1, ~0.17976931348623157E309) = 3.141592654 pow (0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (0.2718281828459045E1, ~0.8988465674311579E308) = 3.141592654 pow (0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (0.2718281828459045E1, ~0.123E4) = 3.139382672 pow (0.2718281828459045E1, ~0.123E4) = 0 atan2 (0.2718281828459045E1, ~0.123E2) = 2.924090123 pow (0.2718281828459045E1, ~0.123E2) = 4.551744463E~6 atan2 (0.2718281828459045E1, ~0.3141592653589793E1) = 2.428308113 pow (0.2718281828459045E1, ~0.3141592653589793E1) = 0.04321391826 atan2 (0.2718281828459045E1, ~0.2718281828459045E1) = 2.35619449 pow (0.2718281828459045E1, ~0.2718281828459045E1) = 0.06598803585 atan2 (0.2718281828459045E1, ~0.123E1) = 1.99572043 pow (0.2718281828459045E1, ~0.123E1) = 0.2922925777 atan2 (0.2718281828459045E1, ~0.123) = 1.616014654 pow (0.2718281828459045E1, ~0.123) = 0.8842636626 atan2 (0.2718281828459045E1, ~0.123E~2) = 1.571248818 pow (0.2718281828459045E1, ~0.123E~2) = 0.9987707561 atan2 (0.2718281828459045E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, ~0.5E~323) = 1.570796327 pow (0.2718281828459045E1, ~0.5E~323) = 1 atan2 (0.2718281828459045E1, ~0.0) = 1.570796327 pow (0.2718281828459045E1, ~0.0) = 1 atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.2718281828459045E1, ~inf) = 3.141592654 pow (0.2718281828459045E1, ~inf) = 0 atan2 (0.2718281828459045E1, nan) = nan pow (0.2718281828459045E1, nan) = nan atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.123E1, 0.17976931348623157E309) = 6.842102115E~309 pow (0.123E1, 0.17976931348623157E309) = inf atan2 (0.123E1, 0.8988465674311579E308) = 1.368420423E~308 pow (0.123E1, 0.8988465674311579E308) = inf atan2 (0.123E1, 0.123E4) = 9.999996667E~4 pow (0.123E1, 0.123E4) = 3.830778757E110 atan2 (0.123E1, 0.123E2) = 0.09966865249 pow (0.123E1, 0.123E2) = 12.75947692 atan2 (0.123E1, 0.3141592653589793E1) = 0.3731757303 pow (0.123E1, 0.3141592653589793E1) = 1.916219422 atan2 (0.123E1, 0.2718281828459045E1) = 0.4249241031 pow (0.123E1, 0.2718281828459045E1) = 1.755445823 atan2 (0.123E1, 0.123E1) = 0.7853981634 pow (0.123E1, 0.123E1) = 1.289980921 atan2 (0.123E1, 0.123) = 1.471127674 pow (0.123E1, 0.123) = 1.025789688 atan2 (0.123E1, 0.123E~2) = 1.569796327 pow (0.123E1, 0.123E~2) = 1.00025466 atan2 (0.123E1, 0.22250738585072014E~307) = 1.570796327 pow (0.123E1, 0.22250738585072014E~307) = 1 atan2 (0.123E1, 0.11125369292536007E~307) = 1.570796327 pow (0.123E1, 0.11125369292536007E~307) = 1 atan2 (0.123E1, 0.5E~323) = 1.570796327 pow (0.123E1, 0.5E~323) = 1 atan2 (0.123E1, 0.0) = 1.570796327 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.17976931348623157E309) = 3.141592654 pow (0.123E1, ~0.17976931348623157E309) = 0 atan2 (0.123E1, ~0.8988465674311579E308) = 3.141592654 pow (0.123E1, ~0.8988465674311579E308) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592654 pow (0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (0.123E1, ~0.123E2) = 3.041924001 pow (0.123E1, ~0.123E2) = 0.07837311876 atan2 (0.123E1, ~0.3141592653589793E1) = 2.768416923 pow (0.123E1, ~0.3141592653589793E1) = 0.5218609042 atan2 (0.123E1, ~0.2718281828459045E1) = 2.71666855 pow (0.123E1, ~0.2718281828459045E1) = 0.56965586 atan2 (0.123E1, ~0.123E1) = 2.35619449 pow (0.123E1, ~0.123E1) = 0.7752052637 atan2 (0.123E1, ~0.123) = 1.670464979 pow (0.123E1, ~0.123) = 0.9748586988 atan2 (0.123E1, ~0.123E~2) = 1.571796326 pow (0.123E1, ~0.123E~2) = 0.999745405 atan2 (0.123E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E1, ~0.22250738585072014E~307) = 1 atan2 (0.123E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E1, ~0.11125369292536007E~307) = 1 atan2 (0.123E1, ~0.5E~323) = 1.570796327 pow (0.123E1, ~0.5E~323) = 1 atan2 (0.123E1, ~0.0) = 1.570796327 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592654 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.17976931348623157E309) = 6.842102115E~310 pow (0.123, 0.17976931348623157E309) = 0 atan2 (0.123, 0.8988465674311579E308) = 1.368420423E~309 pow (0.123, 0.8988465674311579E308) = 0 atan2 (0.123, 0.123E4) = 9.999999967E~5 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666687 pow (0.123, 0.123E2) = 6.394886941E~12 atan2 (0.123, 0.3141592653589793E1) = 0.03913212911 pow (0.123, 0.3141592653589793E1) = 0.001383096824 atan2 (0.123, 0.2718281828459045E1) = 0.04521832678 pow (0.123, 0.2718281828459045E1) = 0.003358192615 atan2 (0.123, 0.123E1) = 0.09966865249 pow (0.123, 0.123E1) = 0.07595970809 atan2 (0.123, 0.123) = 0.7853981634 pow (0.123, 0.123) = 0.7727843683 atan2 (0.123, 0.123E~2) = 1.56079666 pow (0.123, 0.123E~2) = 0.9974257668 atan2 (0.123, 0.22250738585072014E~307) = 1.570796327 pow (0.123, 0.22250738585072014E~307) = 1 atan2 (0.123, 0.11125369292536007E~307) = 1.570796327 pow (0.123, 0.11125369292536007E~307) = 1 atan2 (0.123, 0.5E~323) = 1.570796327 pow (0.123, 0.5E~323) = 1 atan2 (0.123, 0.0) = 1.570796327 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.17976931348623157E309) = 3.141592654 pow (0.123, ~0.17976931348623157E309) = inf atan2 (0.123, ~0.8988465674311579E308) = 3.141592654 pow (0.123, ~0.8988465674311579E308) = inf atan2 (0.123, ~0.123E4) = 3.141492654 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592987 pow (0.123, ~0.123E2) = 156374930400 atan2 (0.123, ~0.3141592653589793E1) = 3.102460524 pow (0.123, ~0.3141592653589793E1) = 723.0151807 atan2 (0.123, ~0.2718281828459045E1) = 3.096374327 pow (0.123, ~0.2718281828459045E1) = 297.7792267 atan2 (0.123, ~0.123E1) = 3.041924001 pow (0.123, ~0.123E1) = 13.16487418 atan2 (0.123, ~0.123) = 2.35619449 pow (0.123, ~0.123) = 1.294022034 atan2 (0.123, ~0.123E~2) = 1.580795993 pow (0.123, ~0.123E~2) = 1.002580877 atan2 (0.123, ~0.22250738585072014E~307) = 1.570796327 pow (0.123, ~0.22250738585072014E~307) = 1 atan2 (0.123, ~0.11125369292536007E~307) = 1.570796327 pow (0.123, ~0.11125369292536007E~307) = 1 atan2 (0.123, ~0.5E~323) = 1.570796327 pow (0.123, ~0.5E~323) = 1 atan2 (0.123, ~0.0) = 1.570796327 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592654 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.17976931348623157E309) = 6.842102115E~312 pow (0.123E~2, 0.17976931348623157E309) = 0 atan2 (0.123E~2, 0.8988465674311579E308) = 1.368420423E~311 pow (0.123E~2, 0.8988465674311579E308) = 0 atan2 (0.123E~2, 0.123E4) = 1E~6 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 9.999999967E~5 pow (0.123E~2, 0.123E2) = 1.606322974E~36 atan2 (0.123E~2, 0.3141592653589793E1) = 3.9152114E~4 pow (0.123E~2, 0.3141592653589793E1) = 7.205552335E~10 atan2 (0.123E~2, 0.2718281828459045E1) = 4.524916818E~4 pow (0.123E~2, 0.2718281828459045E1) = 1.228971878E~8 atan2 (0.123E~2, 0.123E1) = 9.999996667E~4 pow (0.123E~2, 0.123E1) = 2.633802994E~4 atan2 (0.123E~2, 0.123) = 0.009999666687 pow (0.123E~2, 0.123) = 0.4385895994 atan2 (0.123E~2, 0.123E~2) = 0.7853981634 pow (0.123E~2, 0.123E~2) = 0.9917919599 atan2 (0.123E~2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, 0.22250738585072014E~307) = 1 atan2 (0.123E~2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, 0.11125369292536007E~307) = 1 atan2 (0.123E~2, 0.5E~323) = 1.570796327 pow (0.123E~2, 0.5E~323) = 1 atan2 (0.123E~2, 0.0) = 1.570796327 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E~2, ~0.17976931348623157E309) = inf atan2 (0.123E~2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E~2, ~0.8988465674311579E308) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591654 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492654 pow (0.123E~2, ~0.123E2) = 6.225398107E35 atan2 (0.123E~2, ~0.3141592653589793E1) = 3.141201132 pow (0.123E~2, ~0.3141592653589793E1) = 1387818662 atan2 (0.123E~2, ~0.2718281828459045E1) = 3.141140162 pow (0.123E~2, ~0.2718281828459045E1) = 81368826.88 atan2 (0.123E~2, ~0.123E1) = 3.140592654 pow (0.123E~2, ~0.123E1) = 3796.791188 atan2 (0.123E~2, ~0.123) = 3.131592987 pow (0.123E~2, ~0.123) = 2.280035827 atan2 (0.123E~2, ~0.123E~2) = 2.35619449 pow (0.123E~2, ~0.123E~2) = 1.00827597 atan2 (0.123E~2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, ~0.22250738585072014E~307) = 1 atan2 (0.123E~2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, ~0.11125369292536007E~307) = 1 atan2 (0.123E~2, ~0.5E~323) = 1.570796327 pow (0.123E~2, ~0.5E~323) = 1 atan2 (0.123E~2, ~0.0) = 1.570796327 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592654 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (0.22250738585072014E~307, 0.123E4) = 1.809003137E~311 pow (0.22250738585072014E~307, 0.123E4) = 0 atan2 (0.22250738585072014E~307, 0.123E2) = 1.809003137E~309 pow (0.22250738585072014E~307, 0.123E2) = 0 atan2 (0.22250738585072014E~307, 0.3141592653589793E1) = 7.082630067E~309 pow (0.22250738585072014E~307, 0.3141592653589793E1) = 0 atan2 (0.22250738585072014E~307, 0.2718281828459045E1) = 8.185589276E~309 pow (0.22250738585072014E~307, 0.2718281828459045E1) = 0 atan2 (0.22250738585072014E~307, 0.123E1) = 1.809003137E~308 pow (0.22250738585072014E~307, 0.123E1) = 0 atan2 (0.22250738585072014E~307, 0.123) = 1.809003137E~307 pow (0.22250738585072014E~307, 0.123) = 1.441197052E~38 atan2 (0.22250738585072014E~307, 0.123E~2) = 1.809003137E~305 pow (0.22250738585072014E~307, 0.123E~2) = 0.4183957204 atan2 (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.7853981634 pow (0.22250738585072014E~307, 0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, 0.11125369292536007E~307) = 1.107148718 pow (0.22250738585072014E~307, 0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, 0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, 0.5E~323) = 1 atan2 (0.22250738585072014E~307, 0.0) = 1.570796327 pow (0.22250738585072014E~307, 0.0) = 1 atan2 (0.22250738585072014E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (0.22250738585072014E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (0.22250738585072014E~307, ~0.123E4) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E4) = inf atan2 (0.22250738585072014E~307, ~0.123E2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E2) = inf atan2 (0.22250738585072014E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.3141592653589793E1) = inf atan2 (0.22250738585072014E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.2718281828459045E1) = inf atan2 (0.22250738585072014E~307, ~0.123E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E1) = inf atan2 (0.22250738585072014E~307, ~0.123) = 3.141592654 pow (0.22250738585072014E~307, ~0.123) = 6.93867642E37 atan2 (0.22250738585072014E~307, ~0.123E~2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E~2) = 2.390081808 atan2 (0.22250738585072014E~307, ~0.22250738585072014E~307) = 2.35619449 pow (0.22250738585072014E~307, ~0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, ~0.11125369292536007E~307) = 2.034443936 pow (0.22250738585072014E~307, ~0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, ~0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, ~0.5E~323) = 1 atan2 (0.22250738585072014E~307, ~0.0) = 1.570796327 pow (0.22250738585072014E~307, ~0.0) = 1 atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.22250738585072014E~307, ~inf) = 3.141592654 pow (0.22250738585072014E~307, ~inf) = inf atan2 (0.22250738585072014E~307, nan) = nan pow (0.22250738585072014E~307, nan) = nan atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (0.11125369292536007E~307, 0.123E4) = 9.045015685E~312 pow (0.11125369292536007E~307, 0.123E4) = 0 atan2 (0.11125369292536007E~307, 0.123E2) = 9.045015685E~310 pow (0.11125369292536007E~307, 0.123E2) = 0 atan2 (0.11125369292536007E~307, 0.3141592653589793E1) = 3.541315033E~309 pow (0.11125369292536007E~307, 0.3141592653589793E1) = 0 atan2 (0.11125369292536007E~307, 0.2718281828459045E1) = 4.092794638E~309 pow (0.11125369292536007E~307, 0.2718281828459045E1) = 0 atan2 (0.11125369292536007E~307, 0.123E1) = 9.045015685E~309 pow (0.11125369292536007E~307, 0.123E1) = 0 atan2 (0.11125369292536007E~307, 0.123) = 9.045015685E~308 pow (0.11125369292536007E~307, 0.123) = 1.323416898E~38 atan2 (0.11125369292536007E~307, 0.123E~2) = 9.045015685E~306 pow (0.11125369292536007E~307, 0.123E~2) = 0.4180391603 atan2 (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.463647609 pow (0.11125369292536007E~307, 0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.7853981634 pow (0.11125369292536007E~307, 0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, 0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, 0.5E~323) = 1 atan2 (0.11125369292536007E~307, 0.0) = 1.570796327 pow (0.11125369292536007E~307, 0.0) = 1 atan2 (0.11125369292536007E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (0.11125369292536007E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (0.11125369292536007E~307, ~0.123E4) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E4) = inf atan2 (0.11125369292536007E~307, ~0.123E2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E2) = inf atan2 (0.11125369292536007E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.3141592653589793E1) = inf atan2 (0.11125369292536007E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.2718281828459045E1) = inf atan2 (0.11125369292536007E~307, ~0.123E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E1) = inf atan2 (0.11125369292536007E~307, ~0.123) = 3.141592654 pow (0.11125369292536007E~307, ~0.123) = 7.556197911E37 atan2 (0.11125369292536007E~307, ~0.123E~2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E~2) = 2.392120392 atan2 (0.11125369292536007E~307, ~0.22250738585072014E~307) = 2.677945045 pow (0.11125369292536007E~307, ~0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, ~0.11125369292536007E~307) = 2.35619449 pow (0.11125369292536007E~307, ~0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, ~0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, ~0.5E~323) = 1 atan2 (0.11125369292536007E~307, ~0.0) = 1.570796327 pow (0.11125369292536007E~307, ~0.0) = 1 atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.11125369292536007E~307, ~inf) = 3.141592654 pow (0.11125369292536007E~307, ~inf) = inf atan2 (0.11125369292536007E~307, nan) = nan pow (0.11125369292536007E~307, nan) = nan atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.5E~323, 0.17976931348623157E309) = 0 pow (0.5E~323, 0.17976931348623157E309) = 0 atan2 (0.5E~323, 0.8988465674311579E308) = 0 pow (0.5E~323, 0.8988465674311579E308) = 0 atan2 (0.5E~323, 0.123E4) = 0 pow (0.5E~323, 0.123E4) = 0 atan2 (0.5E~323, 0.123E2) = 0 pow (0.5E~323, 0.123E2) = 0 atan2 (0.5E~323, 0.3141592653589793E1) = 0 pow (0.5E~323, 0.3141592653589793E1) = 0 atan2 (0.5E~323, 0.2718281828459045E1) = 0 pow (0.5E~323, 0.2718281828459045E1) = 0 atan2 (0.5E~323, 0.123E1) = 4.940656458E~324 pow (0.5E~323, 0.123E1) = 0 atan2 (0.5E~323, 0.123) = 3.952525167E~323 pow (0.5E~323, 0.123) = 1.711336892E~40 atan2 (0.5E~323, 0.123E~2) = 4.016753701E~321 pow (0.5E~323, 0.123E~2) = 0.4002518566 atan2 (0.5E~323, 0.22250738585072014E~307) = 2.220446049E~16 pow (0.5E~323, 0.22250738585072014E~307) = 1 atan2 (0.5E~323, 0.11125369292536007E~307) = 4.440892099E~16 pow (0.5E~323, 0.11125369292536007E~307) = 1 atan2 (0.5E~323, 0.5E~323) = 0.7853981634 pow (0.5E~323, 0.5E~323) = 1 atan2 (0.5E~323, 0.0) = 1.570796327 pow (0.5E~323, 0.0) = 1 atan2 (0.5E~323, ~0.17976931348623157E309) = 3.141592654 pow (0.5E~323, ~0.17976931348623157E309) = inf atan2 (0.5E~323, ~0.8988465674311579E308) = 3.141592654 pow (0.5E~323, ~0.8988465674311579E308) = inf atan2 (0.5E~323, ~0.123E4) = 3.141592654 pow (0.5E~323, ~0.123E4) = inf atan2 (0.5E~323, ~0.123E2) = 3.141592654 pow (0.5E~323, ~0.123E2) = inf atan2 (0.5E~323, ~0.3141592653589793E1) = 3.141592654 pow (0.5E~323, ~0.3141592653589793E1) = inf atan2 (0.5E~323, ~0.2718281828459045E1) = 3.141592654 pow (0.5E~323, ~0.2718281828459045E1) = inf atan2 (0.5E~323, ~0.123E1) = 3.141592654 pow (0.5E~323, ~0.123E1) = inf atan2 (0.5E~323, ~0.123) = 3.141592654 pow (0.5E~323, ~0.123) = 5.843384809E39 atan2 (0.5E~323, ~0.123E~2) = 3.141592654 pow (0.5E~323, ~0.123E~2) = 2.498426887 atan2 (0.5E~323, ~0.22250738585072014E~307) = 3.141592654 pow (0.5E~323, ~0.22250738585072014E~307) = 1 atan2 (0.5E~323, ~0.11125369292536007E~307) = 3.141592654 pow (0.5E~323, ~0.11125369292536007E~307) = 1 atan2 (0.5E~323, ~0.5E~323) = 2.35619449 pow (0.5E~323, ~0.5E~323) = 1 atan2 (0.5E~323, ~0.0) = 1.570796327 pow (0.5E~323, ~0.0) = 1 atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.5E~323, ~inf) = 3.141592654 pow (0.5E~323, ~inf) = inf atan2 (0.5E~323, nan) = nan pow (0.5E~323, nan) = nan atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.0, 0.17976931348623157E309) = 0 pow (0.0, 0.17976931348623157E309) = 0 atan2 (0.0, 0.8988465674311579E308) = 0 pow (0.0, 0.8988465674311579E308) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.3141592653589793E1) = 0 pow (0.0, 0.3141592653589793E1) = 0 atan2 (0.0, 0.2718281828459045E1) = 0 pow (0.0, 0.2718281828459045E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.22250738585072014E~307) = 0 pow (0.0, 0.22250738585072014E~307) = 0 atan2 (0.0, 0.11125369292536007E~307) = 0 pow (0.0, 0.11125369292536007E~307) = 0 atan2 (0.0, 0.5E~323) = 0 pow (0.0, 0.5E~323) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.17976931348623157E309) = 3.141592654 pow (0.0, ~0.17976931348623157E309) = inf atan2 (0.0, ~0.8988465674311579E308) = 3.141592654 pow (0.0, ~0.8988465674311579E308) = inf atan2 (0.0, ~0.123E4) = 3.141592654 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592654 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.3141592653589793E1) = 3.141592654 pow (0.0, ~0.3141592653589793E1) = inf atan2 (0.0, ~0.2718281828459045E1) = 3.141592654 pow (0.0, ~0.2718281828459045E1) = inf atan2 (0.0, ~0.123E1) = 3.141592654 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592654 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592654 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.22250738585072014E~307) = 3.141592654 pow (0.0, ~0.22250738585072014E~307) = inf atan2 (0.0, ~0.11125369292536007E~307) = 3.141592654 pow (0.0, ~0.11125369292536007E~307) = inf atan2 (0.0, ~0.5E~323) = 3.141592654 pow (0.0, ~0.5E~323) = inf atan2 (0.0, ~0.0) = 3.141592654 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592654 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.7853981634 pow (~0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (~0.17976931348623157E309, 0.8988465674311579E308) = ~1.107148718 pow (~0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (~0.17976931348623157E309, 0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E4) = inf atan2 (~0.17976931348623157E309, 0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E2) = nan atan2 (~0.17976931348623157E309, 0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, 0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, 0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E1) = nan atan2 (~0.17976931348623157E309, 0.123) = ~1.570796327 pow (~0.17976931348623157E309, 0.123) = nan atan2 (~0.17976931348623157E309, 0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E~2) = nan atan2 (~0.17976931348623157E309, 0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, 0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, 0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, 0.5E~323) = nan atan2 (~0.17976931348623157E309, 0.0) = ~1.570796327 pow (~0.17976931348623157E309, 0.0) = 1 atan2 (~0.17976931348623157E309, ~0.17976931348623157E309) = ~2.35619449 pow (~0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (~0.17976931348623157E309, ~0.8988465674311579E308) = ~2.034443936 pow (~0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (~0.17976931348623157E309, ~0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E4) = 0 atan2 (~0.17976931348623157E309, ~0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E2) = nan atan2 (~0.17976931348623157E309, ~0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, ~0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, ~0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E1) = nan atan2 (~0.17976931348623157E309, ~0.123) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123) = nan atan2 (~0.17976931348623157E309, ~0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E~2) = nan atan2 (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, ~0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, ~0.5E~323) = nan atan2 (~0.17976931348623157E309, ~0.0) = ~1.570796327 pow (~0.17976931348623157E309, ~0.0) = 1 atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.17976931348623157E309, ~inf) = ~3.141592654 pow (~0.17976931348623157E309, ~inf) = 0 atan2 (~0.17976931348623157E309, nan) = nan pow (~0.17976931348623157E309, nan) = nan atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.463647609 pow (~0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.7853981634 pow (~0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (~0.8988465674311579E308, 0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E4) = inf atan2 (~0.8988465674311579E308, 0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E2) = nan atan2 (~0.8988465674311579E308, 0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, 0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, 0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E1) = nan atan2 (~0.8988465674311579E308, 0.123) = ~1.570796327 pow (~0.8988465674311579E308, 0.123) = nan atan2 (~0.8988465674311579E308, 0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E~2) = nan atan2 (~0.8988465674311579E308, 0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, 0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, 0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, 0.5E~323) = nan atan2 (~0.8988465674311579E308, 0.0) = ~1.570796327 pow (~0.8988465674311579E308, 0.0) = 1 atan2 (~0.8988465674311579E308, ~0.17976931348623157E309) = ~2.677945045 pow (~0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (~0.8988465674311579E308, ~0.8988465674311579E308) = ~2.35619449 pow (~0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (~0.8988465674311579E308, ~0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E4) = 0 atan2 (~0.8988465674311579E308, ~0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E2) = nan atan2 (~0.8988465674311579E308, ~0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, ~0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, ~0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E1) = nan atan2 (~0.8988465674311579E308, ~0.123) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123) = nan atan2 (~0.8988465674311579E308, ~0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E~2) = nan atan2 (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, ~0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, ~0.5E~323) = nan atan2 (~0.8988465674311579E308, ~0.0) = ~1.570796327 pow (~0.8988465674311579E308, ~0.0) = 1 atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.8988465674311579E308, ~inf) = ~3.141592654 pow (~0.8988465674311579E308, ~inf) = 0 atan2 (~0.8988465674311579E308, nan) = nan pow (~0.8988465674311579E308, nan) = nan atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.123E4, 0.17976931348623157E309) = ~6.842102115E~306 pow (~0.123E4, 0.17976931348623157E309) = inf atan2 (~0.123E4, 0.8988465674311579E308) = ~1.368420423E~305 pow (~0.123E4, 0.8988465674311579E308) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981634 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.56079666 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.3141592653589793E1) = ~1.568242192 pow (~0.123E4, 0.3141592653589793E1) = nan atan2 (~0.123E4, 0.2718281828459045E1) = ~1.568586345 pow (~0.123E4, 0.2718281828459045E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796327 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696327 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795327 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, 0.22250738585072014E~307) = nan atan2 (~0.123E4, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, 0.11125369292536007E~307) = nan atan2 (~0.123E4, 0.5E~323) = ~1.570796327 pow (~0.123E4, 0.5E~323) = nan atan2 (~0.123E4, 0.0) = ~1.570796327 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E4, ~0.17976931348623157E309) = 0 atan2 (~0.123E4, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E4, ~0.8988465674311579E308) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.35619449 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580795993 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.3141592653589793E1) = ~1.573350462 pow (~0.123E4, ~0.3141592653589793E1) = nan atan2 (~0.123E4, ~0.2718281828459045E1) = ~1.573006308 pow (~0.123E4, ~0.2718281828459045E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796326 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896327 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797327 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, ~0.22250738585072014E~307) = nan atan2 (~0.123E4, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, ~0.11125369292536007E~307) = nan atan2 (~0.123E4, ~0.5E~323) = ~1.570796327 pow (~0.123E4, ~0.5E~323) = nan atan2 (~0.123E4, ~0.0) = ~1.570796327 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592654 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.17976931348623157E309) = ~6.842102115E~308 pow (~0.123E2, 0.17976931348623157E309) = inf atan2 (~0.123E2, 0.8988465674311579E308) = ~1.368420423E~307 pow (~0.123E2, 0.8988465674311579E308) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666687 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981634 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.3141592653589793E1) = ~1.320728626 pow (~0.123E2, 0.3141592653589793E1) = nan atan2 (~0.123E2, 0.2718281828459045E1) = ~1.353293796 pow (~0.123E2, 0.2718281828459045E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127674 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.56079666 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696327 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, 0.22250738585072014E~307) = nan atan2 (~0.123E2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, 0.11125369292536007E~307) = nan atan2 (~0.123E2, 0.5E~323) = ~1.570796327 pow (~0.123E2, 0.5E~323) = nan atan2 (~0.123E2, 0.0) = ~1.570796327 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E2, ~0.17976931348623157E309) = 0 atan2 (~0.123E2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E2, ~0.8988465674311579E308) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592987 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.35619449 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.3141592653589793E1) = ~1.820864027 pow (~0.123E2, ~0.3141592653589793E1) = nan atan2 (~0.123E2, ~0.2718281828459045E1) = ~1.788298857 pow (~0.123E2, ~0.2718281828459045E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464979 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580795993 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896327 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, ~0.22250738585072014E~307) = nan atan2 (~0.123E2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, ~0.11125369292536007E~307) = nan atan2 (~0.123E2, ~0.5E~323) = ~1.570796327 pow (~0.123E2, ~0.5E~323) = nan atan2 (~0.123E2, ~0.0) = ~1.570796327 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592654 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.3141592653589793E1, 0.17976931348623157E309) = ~1.747568922E~308 pow (~0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (~0.3141592653589793E1, 0.8988465674311579E308) = ~3.495137844E~308 pow (~0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (~0.3141592653589793E1, 0.123E4) = ~0.002554134815 pow (~0.3141592653589793E1, 0.123E4) = inf atan2 (~0.3141592653589793E1, 0.123E2) = ~0.2500677004 pow (~0.3141592653589793E1, 0.123E2) = nan atan2 (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.7853981634 pow (~0.3141592653589793E1, 0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8575117864 pow (~0.3141592653589793E1, 0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, 0.123E1) = ~1.197620596 pow (~0.3141592653589793E1, 0.123E1) = nan atan2 (~0.3141592653589793E1, 0.123) = ~1.531664198 pow (~0.3141592653589793E1, 0.123) = nan atan2 (~0.3141592653589793E1, 0.123E~2) = ~1.570404806 pow (~0.3141592653589793E1, 0.123E~2) = nan atan2 (~0.3141592653589793E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, 0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, 0.5E~323) = nan atan2 (~0.3141592653589793E1, 0.0) = ~1.570796327 pow (~0.3141592653589793E1, 0.0) = 1 atan2 (~0.3141592653589793E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (~0.3141592653589793E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (~0.3141592653589793E1, ~0.123E4) = ~3.139038519 pow (~0.3141592653589793E1, ~0.123E4) = 0 atan2 (~0.3141592653589793E1, ~0.123E2) = ~2.891524953 pow (~0.3141592653589793E1, ~0.123E2) = nan atan2 (~0.3141592653589793E1, ~0.3141592653589793E1) = ~2.35619449 pow (~0.3141592653589793E1, ~0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, ~0.2718281828459045E1) = ~2.284080867 pow (~0.3141592653589793E1, ~0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, ~0.123E1) = ~1.943972057 pow (~0.3141592653589793E1, ~0.123E1) = nan atan2 (~0.3141592653589793E1, ~0.123) = ~1.609928456 pow (~0.3141592653589793E1, ~0.123) = nan atan2 (~0.3141592653589793E1, ~0.123E~2) = ~1.571187848 pow (~0.3141592653589793E1, ~0.123E~2) = nan atan2 (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, ~0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, ~0.5E~323) = nan atan2 (~0.3141592653589793E1, ~0.0) = ~1.570796327 pow (~0.3141592653589793E1, ~0.0) = 1 atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.3141592653589793E1, ~inf) = ~3.141592654 pow (~0.3141592653589793E1, ~inf) = 0 atan2 (~0.3141592653589793E1, nan) = nan pow (~0.3141592653589793E1, nan) = nan atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.2718281828459045E1, 0.17976931348623157E309) = ~1.512094459E~308 pow (~0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (~0.2718281828459045E1, 0.8988465674311579E308) = ~3.024188918E~308 pow (~0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (~0.2718281828459045E1, 0.123E4) = ~0.002209981629 pow (~0.2718281828459045E1, 0.123E4) = inf atan2 (~0.2718281828459045E1, 0.123E2) = ~0.2175025304 pow (~0.2718281828459045E1, 0.123E2) = nan atan2 (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.7132845404 pow (~0.2718281828459045E1, 0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.7853981634 pow (~0.2718281828459045E1, 0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, 0.123E1) = ~1.145872224 pow (~0.2718281828459045E1, 0.123E1) = nan atan2 (~0.2718281828459045E1, 0.123) = ~1.525578 pow (~0.2718281828459045E1, 0.123) = nan atan2 (~0.2718281828459045E1, 0.123E~2) = ~1.570343835 pow (~0.2718281828459045E1, 0.123E~2) = nan atan2 (~0.2718281828459045E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, 0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, 0.5E~323) = nan atan2 (~0.2718281828459045E1, 0.0) = ~1.570796327 pow (~0.2718281828459045E1, 0.0) = 1 atan2 (~0.2718281828459045E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (~0.2718281828459045E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (~0.2718281828459045E1, ~0.123E4) = ~3.139382672 pow (~0.2718281828459045E1, ~0.123E4) = 0 atan2 (~0.2718281828459045E1, ~0.123E2) = ~2.924090123 pow (~0.2718281828459045E1, ~0.123E2) = nan atan2 (~0.2718281828459045E1, ~0.3141592653589793E1) = ~2.428308113 pow (~0.2718281828459045E1, ~0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, ~0.2718281828459045E1) = ~2.35619449 pow (~0.2718281828459045E1, ~0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, ~0.123E1) = ~1.99572043 pow (~0.2718281828459045E1, ~0.123E1) = nan atan2 (~0.2718281828459045E1, ~0.123) = ~1.616014654 pow (~0.2718281828459045E1, ~0.123) = nan atan2 (~0.2718281828459045E1, ~0.123E~2) = ~1.571248818 pow (~0.2718281828459045E1, ~0.123E~2) = nan atan2 (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, ~0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, ~0.5E~323) = nan atan2 (~0.2718281828459045E1, ~0.0) = ~1.570796327 pow (~0.2718281828459045E1, ~0.0) = 1 atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.2718281828459045E1, ~inf) = ~3.141592654 pow (~0.2718281828459045E1, ~inf) = 0 atan2 (~0.2718281828459045E1, nan) = nan pow (~0.2718281828459045E1, nan) = nan atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.123E1, 0.17976931348623157E309) = ~6.842102115E~309 pow (~0.123E1, 0.17976931348623157E309) = inf atan2 (~0.123E1, 0.8988465674311579E308) = ~1.368420423E~308 pow (~0.123E1, 0.8988465674311579E308) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996667E~4 pow (~0.123E1, 0.123E4) = 3.830778757E110 atan2 (~0.123E1, 0.123E2) = ~0.09966865249 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.3141592653589793E1) = ~0.3731757303 pow (~0.123E1, 0.3141592653589793E1) = nan atan2 (~0.123E1, 0.2718281828459045E1) = ~0.4249241031 pow (~0.123E1, 0.2718281828459045E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981634 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127674 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796327 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, 0.22250738585072014E~307) = nan atan2 (~0.123E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, 0.11125369292536007E~307) = nan atan2 (~0.123E1, 0.5E~323) = ~1.570796327 pow (~0.123E1, 0.5E~323) = nan atan2 (~0.123E1, 0.0) = ~1.570796327 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E1, ~0.17976931348623157E309) = 0 atan2 (~0.123E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E1, ~0.8988465674311579E308) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592654 pow (~0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (~0.123E1, ~0.123E2) = ~3.041924001 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.3141592653589793E1) = ~2.768416923 pow (~0.123E1, ~0.3141592653589793E1) = nan atan2 (~0.123E1, ~0.2718281828459045E1) = ~2.71666855 pow (~0.123E1, ~0.2718281828459045E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.35619449 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464979 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796326 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, ~0.22250738585072014E~307) = nan atan2 (~0.123E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, ~0.11125369292536007E~307) = nan atan2 (~0.123E1, ~0.5E~323) = ~1.570796327 pow (~0.123E1, ~0.5E~323) = nan atan2 (~0.123E1, ~0.0) = ~1.570796327 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592654 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.17976931348623157E309) = ~6.842102115E~310 pow (~0.123, 0.17976931348623157E309) = 0 atan2 (~0.123, 0.8988465674311579E308) = ~1.368420423E~309 pow (~0.123, 0.8988465674311579E308) = 0 atan2 (~0.123, 0.123E4) = ~9.999999967E~5 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666687 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.3141592653589793E1) = ~0.03913212911 pow (~0.123, 0.3141592653589793E1) = nan atan2 (~0.123, 0.2718281828459045E1) = ~0.04521832678 pow (~0.123, 0.2718281828459045E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865249 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981634 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.56079666 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123, 0.22250738585072014E~307) = nan atan2 (~0.123, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123, 0.11125369292536007E~307) = nan atan2 (~0.123, 0.5E~323) = ~1.570796327 pow (~0.123, 0.5E~323) = nan atan2 (~0.123, 0.0) = ~1.570796327 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123, ~0.17976931348623157E309) = inf atan2 (~0.123, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123, ~0.8988465674311579E308) = inf atan2 (~0.123, ~0.123E4) = ~3.141492654 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592987 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.3141592653589793E1) = ~3.102460524 pow (~0.123, ~0.3141592653589793E1) = nan atan2 (~0.123, ~0.2718281828459045E1) = ~3.096374327 pow (~0.123, ~0.2718281828459045E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924001 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.35619449 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580795993 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123, ~0.22250738585072014E~307) = nan atan2 (~0.123, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123, ~0.11125369292536007E~307) = nan atan2 (~0.123, ~0.5E~323) = ~1.570796327 pow (~0.123, ~0.5E~323) = nan atan2 (~0.123, ~0.0) = ~1.570796327 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592654 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.17976931348623157E309) = ~6.842102115E~312 pow (~0.123E~2, 0.17976931348623157E309) = 0 atan2 (~0.123E~2, 0.8988465674311579E308) = ~1.368420423E~311 pow (~0.123E~2, 0.8988465674311579E308) = 0 atan2 (~0.123E~2, 0.123E4) = ~1E~6 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~9.999999967E~5 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.3141592653589793E1) = ~3.9152114E~4 pow (~0.123E~2, 0.3141592653589793E1) = nan atan2 (~0.123E~2, 0.2718281828459045E1) = ~4.524916818E~4 pow (~0.123E~2, 0.2718281828459045E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996667E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666687 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981634 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, 0.22250738585072014E~307) = nan atan2 (~0.123E~2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, 0.11125369292536007E~307) = nan atan2 (~0.123E~2, 0.5E~323) = ~1.570796327 pow (~0.123E~2, 0.5E~323) = nan atan2 (~0.123E~2, 0.0) = ~1.570796327 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E~2, ~0.17976931348623157E309) = inf atan2 (~0.123E~2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E~2, ~0.8988465674311579E308) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591654 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492654 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.3141592653589793E1) = ~3.141201132 pow (~0.123E~2, ~0.3141592653589793E1) = nan atan2 (~0.123E~2, ~0.2718281828459045E1) = ~3.141140162 pow (~0.123E~2, ~0.2718281828459045E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592654 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592987 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.35619449 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, ~0.22250738585072014E~307) = nan atan2 (~0.123E~2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, ~0.11125369292536007E~307) = nan atan2 (~0.123E~2, ~0.5E~323) = ~1.570796327 pow (~0.123E~2, ~0.5E~323) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796327 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592654 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (~0.22250738585072014E~307, 0.123E4) = ~1.809003137E~311 pow (~0.22250738585072014E~307, 0.123E4) = 0 atan2 (~0.22250738585072014E~307, 0.123E2) = ~1.809003137E~309 pow (~0.22250738585072014E~307, 0.123E2) = nan atan2 (~0.22250738585072014E~307, 0.3141592653589793E1) = ~7.082630067E~309 pow (~0.22250738585072014E~307, 0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, 0.2718281828459045E1) = ~8.185589276E~309 pow (~0.22250738585072014E~307, 0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, 0.123E1) = ~1.809003137E~308 pow (~0.22250738585072014E~307, 0.123E1) = nan atan2 (~0.22250738585072014E~307, 0.123) = ~1.809003137E~307 pow (~0.22250738585072014E~307, 0.123) = nan atan2 (~0.22250738585072014E~307, 0.123E~2) = ~1.809003137E~305 pow (~0.22250738585072014E~307, 0.123E~2) = nan atan2 (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.7853981634 pow (~0.22250738585072014E~307, 0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~1.107148718 pow (~0.22250738585072014E~307, 0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, 0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, 0.5E~323) = nan atan2 (~0.22250738585072014E~307, 0.0) = ~1.570796327 pow (~0.22250738585072014E~307, 0.0) = 1 atan2 (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (~0.22250738585072014E~307, ~0.123E4) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E4) = inf atan2 (~0.22250738585072014E~307, ~0.123E2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E2) = nan atan2 (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, ~0.123E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E1) = nan atan2 (~0.22250738585072014E~307, ~0.123) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123) = nan atan2 (~0.22250738585072014E~307, ~0.123E~2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E~2) = nan atan2 (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~2.35619449 pow (~0.22250738585072014E~307, ~0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~2.034443936 pow (~0.22250738585072014E~307, ~0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, ~0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.5E~323) = nan atan2 (~0.22250738585072014E~307, ~0.0) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.0) = 1 atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.22250738585072014E~307, ~inf) = ~3.141592654 pow (~0.22250738585072014E~307, ~inf) = inf atan2 (~0.22250738585072014E~307, nan) = nan pow (~0.22250738585072014E~307, nan) = nan atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (~0.11125369292536007E~307, 0.123E4) = ~9.045015685E~312 pow (~0.11125369292536007E~307, 0.123E4) = 0 atan2 (~0.11125369292536007E~307, 0.123E2) = ~9.045015685E~310 pow (~0.11125369292536007E~307, 0.123E2) = nan atan2 (~0.11125369292536007E~307, 0.3141592653589793E1) = ~3.541315033E~309 pow (~0.11125369292536007E~307, 0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, 0.2718281828459045E1) = ~4.092794638E~309 pow (~0.11125369292536007E~307, 0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, 0.123E1) = ~9.045015685E~309 pow (~0.11125369292536007E~307, 0.123E1) = nan atan2 (~0.11125369292536007E~307, 0.123) = ~9.045015685E~308 pow (~0.11125369292536007E~307, 0.123) = nan atan2 (~0.11125369292536007E~307, 0.123E~2) = ~9.045015685E~306 pow (~0.11125369292536007E~307, 0.123E~2) = nan atan2 (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.463647609 pow (~0.11125369292536007E~307, 0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.7853981634 pow (~0.11125369292536007E~307, 0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, 0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, 0.5E~323) = nan atan2 (~0.11125369292536007E~307, 0.0) = ~1.570796327 pow (~0.11125369292536007E~307, 0.0) = 1 atan2 (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (~0.11125369292536007E~307, ~0.123E4) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E4) = inf atan2 (~0.11125369292536007E~307, ~0.123E2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E2) = nan atan2 (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, ~0.123E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E1) = nan atan2 (~0.11125369292536007E~307, ~0.123) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123) = nan atan2 (~0.11125369292536007E~307, ~0.123E~2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E~2) = nan atan2 (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~2.677945045 pow (~0.11125369292536007E~307, ~0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~2.35619449 pow (~0.11125369292536007E~307, ~0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, ~0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.5E~323) = nan atan2 (~0.11125369292536007E~307, ~0.0) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.0) = 1 atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.11125369292536007E~307, ~inf) = ~3.141592654 pow (~0.11125369292536007E~307, ~inf) = inf atan2 (~0.11125369292536007E~307, nan) = nan pow (~0.11125369292536007E~307, nan) = nan atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.5E~323, 0.17976931348623157E309) = 0 pow (~0.5E~323, 0.17976931348623157E309) = 0 atan2 (~0.5E~323, 0.8988465674311579E308) = 0 pow (~0.5E~323, 0.8988465674311579E308) = 0 atan2 (~0.5E~323, 0.123E4) = 0 pow (~0.5E~323, 0.123E4) = 0 atan2 (~0.5E~323, 0.123E2) = 0 pow (~0.5E~323, 0.123E2) = nan atan2 (~0.5E~323, 0.3141592653589793E1) = 0 pow (~0.5E~323, 0.3141592653589793E1) = nan atan2 (~0.5E~323, 0.2718281828459045E1) = 0 pow (~0.5E~323, 0.2718281828459045E1) = nan atan2 (~0.5E~323, 0.123E1) = ~4.940656458E~324 pow (~0.5E~323, 0.123E1) = nan atan2 (~0.5E~323, 0.123) = ~3.952525167E~323 pow (~0.5E~323, 0.123) = nan atan2 (~0.5E~323, 0.123E~2) = ~4.016753701E~321 pow (~0.5E~323, 0.123E~2) = nan atan2 (~0.5E~323, 0.22250738585072014E~307) = ~2.220446049E~16 pow (~0.5E~323, 0.22250738585072014E~307) = nan atan2 (~0.5E~323, 0.11125369292536007E~307) = ~4.440892099E~16 pow (~0.5E~323, 0.11125369292536007E~307) = nan atan2 (~0.5E~323, 0.5E~323) = ~0.7853981634 pow (~0.5E~323, 0.5E~323) = nan atan2 (~0.5E~323, 0.0) = ~1.570796327 pow (~0.5E~323, 0.0) = 1 atan2 (~0.5E~323, ~0.17976931348623157E309) = ~3.141592654 pow (~0.5E~323, ~0.17976931348623157E309) = inf atan2 (~0.5E~323, ~0.8988465674311579E308) = ~3.141592654 pow (~0.5E~323, ~0.8988465674311579E308) = inf atan2 (~0.5E~323, ~0.123E4) = ~3.141592654 pow (~0.5E~323, ~0.123E4) = inf atan2 (~0.5E~323, ~0.123E2) = ~3.141592654 pow (~0.5E~323, ~0.123E2) = nan atan2 (~0.5E~323, ~0.3141592653589793E1) = ~3.141592654 pow (~0.5E~323, ~0.3141592653589793E1) = nan atan2 (~0.5E~323, ~0.2718281828459045E1) = ~3.141592654 pow (~0.5E~323, ~0.2718281828459045E1) = nan atan2 (~0.5E~323, ~0.123E1) = ~3.141592654 pow (~0.5E~323, ~0.123E1) = nan atan2 (~0.5E~323, ~0.123) = ~3.141592654 pow (~0.5E~323, ~0.123) = nan atan2 (~0.5E~323, ~0.123E~2) = ~3.141592654 pow (~0.5E~323, ~0.123E~2) = nan atan2 (~0.5E~323, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.5E~323, ~0.22250738585072014E~307) = nan atan2 (~0.5E~323, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.5E~323, ~0.11125369292536007E~307) = nan atan2 (~0.5E~323, ~0.5E~323) = ~2.35619449 pow (~0.5E~323, ~0.5E~323) = nan atan2 (~0.5E~323, ~0.0) = ~1.570796327 pow (~0.5E~323, ~0.0) = 1 atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.5E~323, ~inf) = ~3.141592654 pow (~0.5E~323, ~inf) = inf atan2 (~0.5E~323, nan) = nan pow (~0.5E~323, nan) = nan atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.0, 0.17976931348623157E309) = 0 pow (~0.0, 0.17976931348623157E309) = 0 atan2 (~0.0, 0.8988465674311579E308) = 0 pow (~0.0, 0.8988465674311579E308) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.3141592653589793E1) = 0 pow (~0.0, 0.3141592653589793E1) = 0 atan2 (~0.0, 0.2718281828459045E1) = 0 pow (~0.0, 0.2718281828459045E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.22250738585072014E~307) = 0 pow (~0.0, 0.22250738585072014E~307) = 0 atan2 (~0.0, 0.11125369292536007E~307) = 0 pow (~0.0, 0.11125369292536007E~307) = 0 atan2 (~0.0, 0.5E~323) = 0 pow (~0.0, 0.5E~323) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.17976931348623157E309) = ~3.141592654 pow (~0.0, ~0.17976931348623157E309) = inf atan2 (~0.0, ~0.8988465674311579E308) = ~3.141592654 pow (~0.0, ~0.8988465674311579E308) = inf atan2 (~0.0, ~0.123E4) = ~3.141592654 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592654 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.3141592653589793E1) = ~3.141592654 pow (~0.0, ~0.3141592653589793E1) = inf atan2 (~0.0, ~0.2718281828459045E1) = ~3.141592654 pow (~0.0, ~0.2718281828459045E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592654 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592654 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592654 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.0, ~0.22250738585072014E~307) = inf atan2 (~0.0, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.0, ~0.11125369292536007E~307) = inf atan2 (~0.0, ~0.5E~323) = ~3.141592654 pow (~0.0, ~0.5E~323) = inf atan2 (~0.0, ~0.0) = ~3.141592654 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592654 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (~inf, 0.17976931348623157E309) = ~1.570796327 pow (~inf, 0.17976931348623157E309) = inf atan2 (~inf, 0.8988465674311579E308) = ~1.570796327 pow (~inf, 0.8988465674311579E308) = inf atan2 (~inf, 0.123E4) = ~1.570796327 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796327 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.3141592653589793E1) = ~1.570796327 pow (~inf, 0.3141592653589793E1) = inf atan2 (~inf, 0.2718281828459045E1) = ~1.570796327 pow (~inf, 0.2718281828459045E1) = inf atan2 (~inf, 0.123E1) = ~1.570796327 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796327 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796327 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.22250738585072014E~307) = ~1.570796327 pow (~inf, 0.22250738585072014E~307) = inf atan2 (~inf, 0.11125369292536007E~307) = ~1.570796327 pow (~inf, 0.11125369292536007E~307) = inf atan2 (~inf, 0.5E~323) = ~1.570796327 pow (~inf, 0.5E~323) = inf atan2 (~inf, 0.0) = ~1.570796327 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.17976931348623157E309) = ~1.570796327 pow (~inf, ~0.17976931348623157E309) = 0 atan2 (~inf, ~0.8988465674311579E308) = ~1.570796327 pow (~inf, ~0.8988465674311579E308) = 0 atan2 (~inf, ~0.123E4) = ~1.570796327 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796327 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.3141592653589793E1) = ~1.570796327 pow (~inf, ~0.3141592653589793E1) = 0 atan2 (~inf, ~0.2718281828459045E1) = ~1.570796327 pow (~inf, ~0.2718281828459045E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796327 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796327 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796327 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.22250738585072014E~307) = ~1.570796327 pow (~inf, ~0.22250738585072014E~307) = 0 atan2 (~inf, ~0.11125369292536007E~307) = ~1.570796327 pow (~inf, ~0.11125369292536007E~307) = 0 atan2 (~inf, ~0.5E~323) = ~1.570796327 pow (~inf, ~0.5E~323) = 0 atan2 (~inf, ~0.0) = ~1.570796327 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.35619449 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (nan, 0.17976931348623157E309) = nan pow (nan, 0.17976931348623157E309) = nan atan2 (nan, 0.8988465674311579E308) = nan pow (nan, 0.8988465674311579E308) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.3141592653589793E1) = nan pow (nan, 0.3141592653589793E1) = nan atan2 (nan, 0.2718281828459045E1) = nan pow (nan, 0.2718281828459045E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.22250738585072014E~307) = nan pow (nan, 0.22250738585072014E~307) = nan atan2 (nan, 0.11125369292536007E~307) = nan pow (nan, 0.11125369292536007E~307) = nan atan2 (nan, 0.5E~323) = nan pow (nan, 0.5E~323) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.17976931348623157E309) = nan pow (nan, ~0.17976931348623157E309) = nan atan2 (nan, ~0.8988465674311579E308) = nan pow (nan, ~0.8988465674311579E308) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.3141592653589793E1) = nan pow (nan, ~0.3141592653589793E1) = nan atan2 (nan, ~0.2718281828459045E1) = nan pow (nan, ~0.2718281828459045E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.22250738585072014E~307) = nan pow (nan, ~0.22250738585072014E~307) = nan atan2 (nan, ~0.11125369292536007E~307) = nan pow (nan, ~0.11125369292536007E~307) = nan atan2 (nan, ~0.5E~323) = nan pow (nan, ~0.5E~323) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.17976931348623157E309, 0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.17976931348623157E309, 0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.17976931348623157E309, ~0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.17976931348623157E309, ~0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.8988465674311579E308, 0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.8988465674311579E308, 0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.8988465674311579E308, ~0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.8988465674311579E308, ~0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.8988465674311579E308, ~0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E4, 0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E4, 0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E4, 0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E4, 0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E4, 0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E4, 0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E4, 0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.123E4, 0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.123E4, 0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.123E4, 0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.123E4, 0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.123E4, 0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.123E4, 0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.123E4, 0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.123E4, 0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E4, 0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E4, 0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E4, 0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E4, 0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E4, 0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E4, 0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E4, 0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123E4, 0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123E4, 0.123, 0.123): 0.151413E3 0.15141299999999998E3 (0.123E4, 0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123E4, 0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123E4, 0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E4, 0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (0.123E4, 0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E4, ~0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E4, ~0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E4, ~0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E4, ~0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E4, ~0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E4, ~0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E4, ~0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.123E4, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.123E4, ~0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.123E4, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.123E4, ~0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.123E4, ~0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E4, ~0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E4, ~0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E4, ~0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E4, ~0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E4, ~0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E4, ~0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E4, ~0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123E4, ~0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123E4, ~0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123E4, ~0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123E4, ~0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E4, ~0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E4, ~0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E2, 0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E2, 0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E2, 0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E2, 0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E2, 0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E2, 0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E2, 0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.123E2, 0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.123E2, 0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.123E2, 0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.123E2, 0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.123E2, 0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.123E2, 0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.123E2, 0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.123E2, 0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E2, 0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E2, 0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E2, 0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E2, 0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123E2, 0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123E2, 0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E2, ~0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E2, ~0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E2, ~0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E2, ~0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E2, ~0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E2, ~0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E2, ~0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.123E2, ~0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.123E2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.123E2, ~0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.123E2, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.123E2, ~0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.123E2, ~0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E2, ~0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E2, ~0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E2, ~0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E2, ~0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123E2, ~0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123E2, ~0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.3141592653589793E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.3141592653589793E1, 0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.3141592653589793E1, 0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.3141592653589793E1, 0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.3141592653589793E1, 0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.3141592653589793E1, 0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.3141592653589793E1, 0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.3141592653589793E1, 0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.3141592653589793E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.3141592653589793E1, 0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.3141592653589793E1, 0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.3141592653589793E1, 0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.3141592653589793E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.3141592653589793E1, ~0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.3141592653589793E1, ~0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.3141592653589793E1, ~0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.3141592653589793E1, ~0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.3141592653589793E1, ~0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.3141592653589793E1, ~0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.3141592653589793E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.3141592653589793E1, ~0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.3141592653589793E1, ~0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.3141592653589793E1, ~0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.2718281828459045E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.2718281828459045E1, 0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.2718281828459045E1, 0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.2718281828459045E1, 0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.2718281828459045E1, 0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.2718281828459045E1, 0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.2718281828459045E1, 0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.2718281828459045E1, 0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.2718281828459045E1, 0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.2718281828459045E1, 0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.2718281828459045E1, 0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.2718281828459045E1, 0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.2718281828459045E1, 0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (0.2718281828459045E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.2718281828459045E1, ~0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.2718281828459045E1, ~0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.2718281828459045E1, ~0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.2718281828459045E1, ~0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.2718281828459045E1, ~0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.2718281828459045E1, ~0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (0.2718281828459045E1, ~0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.2718281828459045E1, ~0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.2718281828459045E1, ~0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123E1, 0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.123E1, 0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.123E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.123E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.123E1, 0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E1, 0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E1, 0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E1, 0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E1, 0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E1, 0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E1, 0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E1, 0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E1, 0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E1, 0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E1, 0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.123E1, 0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.123E1, 0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.123E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.123E1, 0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E1, 0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (0.123E1, 0.123, 0.123): 0.27429 0.27429000000000003 (0.123E1, 0.123, 0.123E~2): 0.15252 0.15252000000000002 (0.123E1, 0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.123E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.123E1, ~0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.123E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E1, ~0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E1, ~0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E1, ~0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E1, ~0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E1, ~0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E1, ~0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E1, ~0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E1, ~0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E1, ~0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E1, ~0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E1, ~0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.123E1, ~0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.123E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.123E1, ~0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.123E1, ~0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E1, ~0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123E1, ~0.123, ~0.123): ~0.27429 ~0.27429000000000003 (0.123E1, ~0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, 0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123, 0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123, 0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (0.123, 0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123, 0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123, 0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123, 0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123, 0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (0.123, 0.123E1, 0.123): 0.27429 0.27429000000000003 (0.123, 0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (0.123, 0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123, 0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.123, 0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.123, ~0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123, ~0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123, ~0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123, ~0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123, ~0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123, ~0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123, ~0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123, ~0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123, ~0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123, ~0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (0.123, ~0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, ~0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.123, ~0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (0.123E~2, 0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E~2, 0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (0.123E~2, 0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E~2, 0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E~2, 0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.123E~2, ~0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E~2, ~0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E~2, ~0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E~2, ~0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.123E~2, ~0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.11125369292536007E~307, 0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.11125369292536007E~307, 0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.17976931348623157E309, 0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.17976931348623157E309, 0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.17976931348623157E309, ~0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.17976931348623157E309, ~0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.8988465674311579E308, 0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.8988465674311579E308, 0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.8988465674311579E308, ~0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.8988465674311579E308, ~0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E4, 0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E4, 0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E4, 0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E4, 0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E4, 0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E4, 0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E4, 0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.123E4, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.123E4, 0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.123E4, 0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.123E4, 0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.123E4, 0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E4, 0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E4, 0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E4, 0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E4, 0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E4, 0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E4, 0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E4, 0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123E4, 0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123E4, 0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123E4, 0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123E4, 0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E4, 0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E4, 0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E4, ~0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E4, ~0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E4, ~0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E4, ~0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E4, ~0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E4, ~0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E4, ~0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.123E4, ~0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.123E4, ~0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.123E4, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.123E4, ~0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E4, ~0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E4, ~0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E4, ~0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E4, ~0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E4, ~0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E4, ~0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E4, ~0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123E4, ~0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123E4, ~0.123, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123E4, ~0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123E4, ~0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123E4, ~0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E4, ~0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E2, 0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E2, 0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E2, 0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E2, 0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E2, 0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E2, 0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E2, 0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.123E2, 0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.123E2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.123E2, 0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.123E2, 0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.123E2, 0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.123E2, 0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E2, 0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E2, 0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E2, 0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E2, 0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123E2, 0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123E2, 0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E2, ~0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E2, ~0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E2, ~0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E2, ~0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E2, ~0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E2, ~0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.123E2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.123E2, ~0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.123E2, ~0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.123E2, ~0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.123E2, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E2, ~0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E2, ~0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E2, ~0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E2, ~0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123E2, ~0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123E2, ~0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.3141592653589793E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.3141592653589793E1, 0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.3141592653589793E1, 0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.3141592653589793E1, 0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.3141592653589793E1, 0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.3141592653589793E1, 0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.3141592653589793E1, 0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.3141592653589793E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.3141592653589793E1, 0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.3141592653589793E1, 0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.3141592653589793E1, 0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.3141592653589793E1, ~0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.3141592653589793E1, ~0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.3141592653589793E1, ~0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.3141592653589793E1, ~0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.3141592653589793E1, ~0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.3141592653589793E1, ~0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.3141592653589793E1, ~0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.3141592653589793E1, ~0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.2718281828459045E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.2718281828459045E1, 0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.2718281828459045E1, 0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.2718281828459045E1, 0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.2718281828459045E1, 0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.2718281828459045E1, 0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.2718281828459045E1, 0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (~0.2718281828459045E1, 0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.2718281828459045E1, 0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.2718281828459045E1, 0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.2718281828459045E1, ~0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.2718281828459045E1, ~0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.2718281828459045E1, ~0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.2718281828459045E1, ~0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.2718281828459045E1, ~0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (~0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.2718281828459045E1, ~0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.2718281828459045E1, ~0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.2718281828459045E1, ~0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123E1, 0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.123E1, 0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.123E1, 0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.123E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.123E1, 0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E1, 0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E1, 0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E1, 0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E1, 0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E1, 0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E1, 0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E1, 0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E1, 0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E1, 0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E1, 0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.123E1, 0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.123E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.123E1, 0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.123E1, 0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E1, 0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123E1, 0.123, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123E1, 0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123E1, ~0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.123E1, ~0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.123E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.123E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E1, ~0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E1, ~0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E1, ~0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E1, ~0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E1, ~0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E1, ~0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E1, ~0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E1, ~0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E1, ~0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E1, ~0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E1, ~0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.123E1, ~0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.123E1, ~0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.123E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.123E1, ~0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E1, ~0.123, 0.123): 0.27429 0.27429000000000003 (~0.123E1, ~0.123, 0.123E~2): 0.15252 0.15252000000000002 (~0.123E1, ~0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, 0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123, 0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123, 0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123, 0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123, 0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123, 0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123, 0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123, 0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.123, 0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123, 0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123, 0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123, 0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.123, 0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.123, ~0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123, ~0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123, ~0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123, ~0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123, ~0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123, ~0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123, ~0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123, ~0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123, ~0.123E1, 0.123): 0.27429 0.27429000000000003 (~0.123, ~0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (~0.123, ~0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, ~0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.123, ~0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (~0.123E~2, 0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E~2, 0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E~2, 0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E~2, 0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E~2, 0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.123E~2, ~0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E~2, ~0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E~2, ~0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.123E~2, ~0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.11125369292536007E~307, 0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.11125369292536007E~307, 0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.17976931348623157E309, 0.17976931348623157E309) = false > (0.17976931348623157E309, 0.17976931348623157E309) = false == (0.17976931348623157E309, 0.17976931348623157E309) = true ?= (0.17976931348623157E309, 0.17976931348623157E309) = true < (0.17976931348623157E309, 0.8988465674311579E308) = false > (0.17976931348623157E309, 0.8988465674311579E308) = true == (0.17976931348623157E309, 0.8988465674311579E308) = false ?= (0.17976931348623157E309, 0.8988465674311579E308) = false < (0.17976931348623157E309, 0.123E4) = false > (0.17976931348623157E309, 0.123E4) = true == (0.17976931348623157E309, 0.123E4) = false ?= (0.17976931348623157E309, 0.123E4) = false < (0.17976931348623157E309, 0.123E2) = false > (0.17976931348623157E309, 0.123E2) = true == (0.17976931348623157E309, 0.123E2) = false ?= (0.17976931348623157E309, 0.123E2) = false < (0.17976931348623157E309, 0.3141592653589793E1) = false > (0.17976931348623157E309, 0.3141592653589793E1) = true == (0.17976931348623157E309, 0.3141592653589793E1) = false ?= (0.17976931348623157E309, 0.3141592653589793E1) = false < (0.17976931348623157E309, 0.2718281828459045E1) = false > (0.17976931348623157E309, 0.2718281828459045E1) = true == (0.17976931348623157E309, 0.2718281828459045E1) = false ?= (0.17976931348623157E309, 0.2718281828459045E1) = false < (0.17976931348623157E309, 0.123E1) = false > (0.17976931348623157E309, 0.123E1) = true == (0.17976931348623157E309, 0.123E1) = false ?= (0.17976931348623157E309, 0.123E1) = false < (0.17976931348623157E309, 0.123) = false > (0.17976931348623157E309, 0.123) = true == (0.17976931348623157E309, 0.123) = false ?= (0.17976931348623157E309, 0.123) = false < (0.17976931348623157E309, 0.123E~2) = false > (0.17976931348623157E309, 0.123E~2) = true == (0.17976931348623157E309, 0.123E~2) = false ?= (0.17976931348623157E309, 0.123E~2) = false < (0.17976931348623157E309, 0.22250738585072014E~307) = false > (0.17976931348623157E309, 0.22250738585072014E~307) = true == (0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (0.17976931348623157E309, 0.22250738585072014E~307) = false < (0.17976931348623157E309, 0.11125369292536007E~307) = false > (0.17976931348623157E309, 0.11125369292536007E~307) = true == (0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (0.17976931348623157E309, 0.11125369292536007E~307) = false < (0.17976931348623157E309, 0.5E~323) = false > (0.17976931348623157E309, 0.5E~323) = true == (0.17976931348623157E309, 0.5E~323) = false ?= (0.17976931348623157E309, 0.5E~323) = false < (0.17976931348623157E309, 0.0) = false > (0.17976931348623157E309, 0.0) = true == (0.17976931348623157E309, 0.0) = false ?= (0.17976931348623157E309, 0.0) = false < (0.17976931348623157E309, ~0.17976931348623157E309) = false > (0.17976931348623157E309, ~0.17976931348623157E309) = true == (0.17976931348623157E309, ~0.17976931348623157E309) = false ?= (0.17976931348623157E309, ~0.17976931348623157E309) = false < (0.17976931348623157E309, ~0.8988465674311579E308) = false > (0.17976931348623157E309, ~0.8988465674311579E308) = true == (0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (0.17976931348623157E309, ~0.8988465674311579E308) = false < (0.17976931348623157E309, ~0.123E4) = false > (0.17976931348623157E309, ~0.123E4) = true == (0.17976931348623157E309, ~0.123E4) = false ?= (0.17976931348623157E309, ~0.123E4) = false < (0.17976931348623157E309, ~0.123E2) = false > (0.17976931348623157E309, ~0.123E2) = true == (0.17976931348623157E309, ~0.123E2) = false ?= (0.17976931348623157E309, ~0.123E2) = false < (0.17976931348623157E309, ~0.3141592653589793E1) = false > (0.17976931348623157E309, ~0.3141592653589793E1) = true == (0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (0.17976931348623157E309, ~0.3141592653589793E1) = false < (0.17976931348623157E309, ~0.2718281828459045E1) = false > (0.17976931348623157E309, ~0.2718281828459045E1) = true == (0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (0.17976931348623157E309, ~0.2718281828459045E1) = false < (0.17976931348623157E309, ~0.123E1) = false > (0.17976931348623157E309, ~0.123E1) = true == (0.17976931348623157E309, ~0.123E1) = false ?= (0.17976931348623157E309, ~0.123E1) = false < (0.17976931348623157E309, ~0.123) = false > (0.17976931348623157E309, ~0.123) = true == (0.17976931348623157E309, ~0.123) = false ?= (0.17976931348623157E309, ~0.123) = false < (0.17976931348623157E309, ~0.123E~2) = false > (0.17976931348623157E309, ~0.123E~2) = true == (0.17976931348623157E309, ~0.123E~2) = false ?= (0.17976931348623157E309, ~0.123E~2) = false < (0.17976931348623157E309, ~0.22250738585072014E~307) = false > (0.17976931348623157E309, ~0.22250738585072014E~307) = true == (0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (0.17976931348623157E309, ~0.22250738585072014E~307) = false < (0.17976931348623157E309, ~0.11125369292536007E~307) = false > (0.17976931348623157E309, ~0.11125369292536007E~307) = true == (0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (0.17976931348623157E309, ~0.11125369292536007E~307) = false < (0.17976931348623157E309, ~0.5E~323) = false > (0.17976931348623157E309, ~0.5E~323) = true == (0.17976931348623157E309, ~0.5E~323) = false ?= (0.17976931348623157E309, ~0.5E~323) = false < (0.17976931348623157E309, ~0.0) = false > (0.17976931348623157E309, ~0.0) = true == (0.17976931348623157E309, ~0.0) = false ?= (0.17976931348623157E309, ~0.0) = false < (0.8988465674311579E308, 0.17976931348623157E309) = true > (0.8988465674311579E308, 0.17976931348623157E309) = false == (0.8988465674311579E308, 0.17976931348623157E309) = false ?= (0.8988465674311579E308, 0.17976931348623157E309) = false < (0.8988465674311579E308, 0.8988465674311579E308) = false > (0.8988465674311579E308, 0.8988465674311579E308) = false == (0.8988465674311579E308, 0.8988465674311579E308) = true ?= (0.8988465674311579E308, 0.8988465674311579E308) = true < (0.8988465674311579E308, 0.123E4) = false > (0.8988465674311579E308, 0.123E4) = true == (0.8988465674311579E308, 0.123E4) = false ?= (0.8988465674311579E308, 0.123E4) = false < (0.8988465674311579E308, 0.123E2) = false > (0.8988465674311579E308, 0.123E2) = true == (0.8988465674311579E308, 0.123E2) = false ?= (0.8988465674311579E308, 0.123E2) = false < (0.8988465674311579E308, 0.3141592653589793E1) = false > (0.8988465674311579E308, 0.3141592653589793E1) = true == (0.8988465674311579E308, 0.3141592653589793E1) = false ?= (0.8988465674311579E308, 0.3141592653589793E1) = false < (0.8988465674311579E308, 0.2718281828459045E1) = false > (0.8988465674311579E308, 0.2718281828459045E1) = true == (0.8988465674311579E308, 0.2718281828459045E1) = false ?= (0.8988465674311579E308, 0.2718281828459045E1) = false < (0.8988465674311579E308, 0.123E1) = false > (0.8988465674311579E308, 0.123E1) = true == (0.8988465674311579E308, 0.123E1) = false ?= (0.8988465674311579E308, 0.123E1) = false < (0.8988465674311579E308, 0.123) = false > (0.8988465674311579E308, 0.123) = true == (0.8988465674311579E308, 0.123) = false ?= (0.8988465674311579E308, 0.123) = false < (0.8988465674311579E308, 0.123E~2) = false > (0.8988465674311579E308, 0.123E~2) = true == (0.8988465674311579E308, 0.123E~2) = false ?= (0.8988465674311579E308, 0.123E~2) = false < (0.8988465674311579E308, 0.22250738585072014E~307) = false > (0.8988465674311579E308, 0.22250738585072014E~307) = true == (0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (0.8988465674311579E308, 0.22250738585072014E~307) = false < (0.8988465674311579E308, 0.11125369292536007E~307) = false > (0.8988465674311579E308, 0.11125369292536007E~307) = true == (0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (0.8988465674311579E308, 0.11125369292536007E~307) = false < (0.8988465674311579E308, 0.5E~323) = false > (0.8988465674311579E308, 0.5E~323) = true == (0.8988465674311579E308, 0.5E~323) = false ?= (0.8988465674311579E308, 0.5E~323) = false < (0.8988465674311579E308, 0.0) = false > (0.8988465674311579E308, 0.0) = true == (0.8988465674311579E308, 0.0) = false ?= (0.8988465674311579E308, 0.0) = false < (0.8988465674311579E308, ~0.17976931348623157E309) = false > (0.8988465674311579E308, ~0.17976931348623157E309) = true == (0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (0.8988465674311579E308, ~0.17976931348623157E309) = false < (0.8988465674311579E308, ~0.8988465674311579E308) = false > (0.8988465674311579E308, ~0.8988465674311579E308) = true == (0.8988465674311579E308, ~0.8988465674311579E308) = false ?= (0.8988465674311579E308, ~0.8988465674311579E308) = false < (0.8988465674311579E308, ~0.123E4) = false > (0.8988465674311579E308, ~0.123E4) = true == (0.8988465674311579E308, ~0.123E4) = false ?= (0.8988465674311579E308, ~0.123E4) = false < (0.8988465674311579E308, ~0.123E2) = false > (0.8988465674311579E308, ~0.123E2) = true == (0.8988465674311579E308, ~0.123E2) = false ?= (0.8988465674311579E308, ~0.123E2) = false < (0.8988465674311579E308, ~0.3141592653589793E1) = false > (0.8988465674311579E308, ~0.3141592653589793E1) = true == (0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (0.8988465674311579E308, ~0.3141592653589793E1) = false < (0.8988465674311579E308, ~0.2718281828459045E1) = false > (0.8988465674311579E308, ~0.2718281828459045E1) = true == (0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (0.8988465674311579E308, ~0.2718281828459045E1) = false < (0.8988465674311579E308, ~0.123E1) = false > (0.8988465674311579E308, ~0.123E1) = true == (0.8988465674311579E308, ~0.123E1) = false ?= (0.8988465674311579E308, ~0.123E1) = false < (0.8988465674311579E308, ~0.123) = false > (0.8988465674311579E308, ~0.123) = true == (0.8988465674311579E308, ~0.123) = false ?= (0.8988465674311579E308, ~0.123) = false < (0.8988465674311579E308, ~0.123E~2) = false > (0.8988465674311579E308, ~0.123E~2) = true == (0.8988465674311579E308, ~0.123E~2) = false ?= (0.8988465674311579E308, ~0.123E~2) = false < (0.8988465674311579E308, ~0.22250738585072014E~307) = false > (0.8988465674311579E308, ~0.22250738585072014E~307) = true == (0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (0.8988465674311579E308, ~0.22250738585072014E~307) = false < (0.8988465674311579E308, ~0.11125369292536007E~307) = false > (0.8988465674311579E308, ~0.11125369292536007E~307) = true == (0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (0.8988465674311579E308, ~0.11125369292536007E~307) = false < (0.8988465674311579E308, ~0.5E~323) = false > (0.8988465674311579E308, ~0.5E~323) = true == (0.8988465674311579E308, ~0.5E~323) = false ?= (0.8988465674311579E308, ~0.5E~323) = false < (0.8988465674311579E308, ~0.0) = false > (0.8988465674311579E308, ~0.0) = true == (0.8988465674311579E308, ~0.0) = false ?= (0.8988465674311579E308, ~0.0) = false < (0.123E4, 0.17976931348623157E309) = true > (0.123E4, 0.17976931348623157E309) = false == (0.123E4, 0.17976931348623157E309) = false ?= (0.123E4, 0.17976931348623157E309) = false < (0.123E4, 0.8988465674311579E308) = true > (0.123E4, 0.8988465674311579E308) = false == (0.123E4, 0.8988465674311579E308) = false ?= (0.123E4, 0.8988465674311579E308) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.3141592653589793E1) = false > (0.123E4, 0.3141592653589793E1) = true == (0.123E4, 0.3141592653589793E1) = false ?= (0.123E4, 0.3141592653589793E1) = false < (0.123E4, 0.2718281828459045E1) = false > (0.123E4, 0.2718281828459045E1) = true == (0.123E4, 0.2718281828459045E1) = false ?= (0.123E4, 0.2718281828459045E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.22250738585072014E~307) = false > (0.123E4, 0.22250738585072014E~307) = true == (0.123E4, 0.22250738585072014E~307) = false ?= (0.123E4, 0.22250738585072014E~307) = false < (0.123E4, 0.11125369292536007E~307) = false > (0.123E4, 0.11125369292536007E~307) = true == (0.123E4, 0.11125369292536007E~307) = false ?= (0.123E4, 0.11125369292536007E~307) = false < (0.123E4, 0.5E~323) = false > (0.123E4, 0.5E~323) = true == (0.123E4, 0.5E~323) = false ?= (0.123E4, 0.5E~323) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.17976931348623157E309) = false > (0.123E4, ~0.17976931348623157E309) = true == (0.123E4, ~0.17976931348623157E309) = false ?= (0.123E4, ~0.17976931348623157E309) = false < (0.123E4, ~0.8988465674311579E308) = false > (0.123E4, ~0.8988465674311579E308) = true == (0.123E4, ~0.8988465674311579E308) = false ?= (0.123E4, ~0.8988465674311579E308) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.3141592653589793E1) = false > (0.123E4, ~0.3141592653589793E1) = true == (0.123E4, ~0.3141592653589793E1) = false ?= (0.123E4, ~0.3141592653589793E1) = false < (0.123E4, ~0.2718281828459045E1) = false > (0.123E4, ~0.2718281828459045E1) = true == (0.123E4, ~0.2718281828459045E1) = false ?= (0.123E4, ~0.2718281828459045E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.22250738585072014E~307) = false > (0.123E4, ~0.22250738585072014E~307) = true == (0.123E4, ~0.22250738585072014E~307) = false ?= (0.123E4, ~0.22250738585072014E~307) = false < (0.123E4, ~0.11125369292536007E~307) = false > (0.123E4, ~0.11125369292536007E~307) = true == (0.123E4, ~0.11125369292536007E~307) = false ?= (0.123E4, ~0.11125369292536007E~307) = false < (0.123E4, ~0.5E~323) = false > (0.123E4, ~0.5E~323) = true == (0.123E4, ~0.5E~323) = false ?= (0.123E4, ~0.5E~323) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.17976931348623157E309) = true > (0.123E2, 0.17976931348623157E309) = false == (0.123E2, 0.17976931348623157E309) = false ?= (0.123E2, 0.17976931348623157E309) = false < (0.123E2, 0.8988465674311579E308) = true > (0.123E2, 0.8988465674311579E308) = false == (0.123E2, 0.8988465674311579E308) = false ?= (0.123E2, 0.8988465674311579E308) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.3141592653589793E1) = false > (0.123E2, 0.3141592653589793E1) = true == (0.123E2, 0.3141592653589793E1) = false ?= (0.123E2, 0.3141592653589793E1) = false < (0.123E2, 0.2718281828459045E1) = false > (0.123E2, 0.2718281828459045E1) = true == (0.123E2, 0.2718281828459045E1) = false ?= (0.123E2, 0.2718281828459045E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.22250738585072014E~307) = false > (0.123E2, 0.22250738585072014E~307) = true == (0.123E2, 0.22250738585072014E~307) = false ?= (0.123E2, 0.22250738585072014E~307) = false < (0.123E2, 0.11125369292536007E~307) = false > (0.123E2, 0.11125369292536007E~307) = true == (0.123E2, 0.11125369292536007E~307) = false ?= (0.123E2, 0.11125369292536007E~307) = false < (0.123E2, 0.5E~323) = false > (0.123E2, 0.5E~323) = true == (0.123E2, 0.5E~323) = false ?= (0.123E2, 0.5E~323) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.17976931348623157E309) = false > (0.123E2, ~0.17976931348623157E309) = true == (0.123E2, ~0.17976931348623157E309) = false ?= (0.123E2, ~0.17976931348623157E309) = false < (0.123E2, ~0.8988465674311579E308) = false > (0.123E2, ~0.8988465674311579E308) = true == (0.123E2, ~0.8988465674311579E308) = false ?= (0.123E2, ~0.8988465674311579E308) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.3141592653589793E1) = false > (0.123E2, ~0.3141592653589793E1) = true == (0.123E2, ~0.3141592653589793E1) = false ?= (0.123E2, ~0.3141592653589793E1) = false < (0.123E2, ~0.2718281828459045E1) = false > (0.123E2, ~0.2718281828459045E1) = true == (0.123E2, ~0.2718281828459045E1) = false ?= (0.123E2, ~0.2718281828459045E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.22250738585072014E~307) = false > (0.123E2, ~0.22250738585072014E~307) = true == (0.123E2, ~0.22250738585072014E~307) = false ?= (0.123E2, ~0.22250738585072014E~307) = false < (0.123E2, ~0.11125369292536007E~307) = false > (0.123E2, ~0.11125369292536007E~307) = true == (0.123E2, ~0.11125369292536007E~307) = false ?= (0.123E2, ~0.11125369292536007E~307) = false < (0.123E2, ~0.5E~323) = false > (0.123E2, ~0.5E~323) = true == (0.123E2, ~0.5E~323) = false ?= (0.123E2, ~0.5E~323) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.3141592653589793E1, 0.17976931348623157E309) = true > (0.3141592653589793E1, 0.17976931348623157E309) = false == (0.3141592653589793E1, 0.17976931348623157E309) = false ?= (0.3141592653589793E1, 0.17976931348623157E309) = false < (0.3141592653589793E1, 0.8988465674311579E308) = true > (0.3141592653589793E1, 0.8988465674311579E308) = false == (0.3141592653589793E1, 0.8988465674311579E308) = false ?= (0.3141592653589793E1, 0.8988465674311579E308) = false < (0.3141592653589793E1, 0.123E4) = true > (0.3141592653589793E1, 0.123E4) = false == (0.3141592653589793E1, 0.123E4) = false ?= (0.3141592653589793E1, 0.123E4) = false < (0.3141592653589793E1, 0.123E2) = true > (0.3141592653589793E1, 0.123E2) = false == (0.3141592653589793E1, 0.123E2) = false ?= (0.3141592653589793E1, 0.123E2) = false < (0.3141592653589793E1, 0.3141592653589793E1) = false > (0.3141592653589793E1, 0.3141592653589793E1) = false == (0.3141592653589793E1, 0.3141592653589793E1) = true ?= (0.3141592653589793E1, 0.3141592653589793E1) = true < (0.3141592653589793E1, 0.2718281828459045E1) = false > (0.3141592653589793E1, 0.2718281828459045E1) = true == (0.3141592653589793E1, 0.2718281828459045E1) = false ?= (0.3141592653589793E1, 0.2718281828459045E1) = false < (0.3141592653589793E1, 0.123E1) = false > (0.3141592653589793E1, 0.123E1) = true == (0.3141592653589793E1, 0.123E1) = false ?= (0.3141592653589793E1, 0.123E1) = false < (0.3141592653589793E1, 0.123) = false > (0.3141592653589793E1, 0.123) = true == (0.3141592653589793E1, 0.123) = false ?= (0.3141592653589793E1, 0.123) = false < (0.3141592653589793E1, 0.123E~2) = false > (0.3141592653589793E1, 0.123E~2) = true == (0.3141592653589793E1, 0.123E~2) = false ?= (0.3141592653589793E1, 0.123E~2) = false < (0.3141592653589793E1, 0.22250738585072014E~307) = false > (0.3141592653589793E1, 0.22250738585072014E~307) = true == (0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (0.3141592653589793E1, 0.22250738585072014E~307) = false < (0.3141592653589793E1, 0.11125369292536007E~307) = false > (0.3141592653589793E1, 0.11125369292536007E~307) = true == (0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (0.3141592653589793E1, 0.11125369292536007E~307) = false < (0.3141592653589793E1, 0.5E~323) = false > (0.3141592653589793E1, 0.5E~323) = true == (0.3141592653589793E1, 0.5E~323) = false ?= (0.3141592653589793E1, 0.5E~323) = false < (0.3141592653589793E1, 0.0) = false > (0.3141592653589793E1, 0.0) = true == (0.3141592653589793E1, 0.0) = false ?= (0.3141592653589793E1, 0.0) = false < (0.3141592653589793E1, ~0.17976931348623157E309) = false > (0.3141592653589793E1, ~0.17976931348623157E309) = true == (0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (0.3141592653589793E1, ~0.17976931348623157E309) = false < (0.3141592653589793E1, ~0.8988465674311579E308) = false > (0.3141592653589793E1, ~0.8988465674311579E308) = true == (0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (0.3141592653589793E1, ~0.8988465674311579E308) = false < (0.3141592653589793E1, ~0.123E4) = false > (0.3141592653589793E1, ~0.123E4) = true == (0.3141592653589793E1, ~0.123E4) = false ?= (0.3141592653589793E1, ~0.123E4) = false < (0.3141592653589793E1, ~0.123E2) = false > (0.3141592653589793E1, ~0.123E2) = true == (0.3141592653589793E1, ~0.123E2) = false ?= (0.3141592653589793E1, ~0.123E2) = false < (0.3141592653589793E1, ~0.3141592653589793E1) = false > (0.3141592653589793E1, ~0.3141592653589793E1) = true == (0.3141592653589793E1, ~0.3141592653589793E1) = false ?= (0.3141592653589793E1, ~0.3141592653589793E1) = false < (0.3141592653589793E1, ~0.2718281828459045E1) = false > (0.3141592653589793E1, ~0.2718281828459045E1) = true == (0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (0.3141592653589793E1, ~0.2718281828459045E1) = false < (0.3141592653589793E1, ~0.123E1) = false > (0.3141592653589793E1, ~0.123E1) = true == (0.3141592653589793E1, ~0.123E1) = false ?= (0.3141592653589793E1, ~0.123E1) = false < (0.3141592653589793E1, ~0.123) = false > (0.3141592653589793E1, ~0.123) = true == (0.3141592653589793E1, ~0.123) = false ?= (0.3141592653589793E1, ~0.123) = false < (0.3141592653589793E1, ~0.123E~2) = false > (0.3141592653589793E1, ~0.123E~2) = true == (0.3141592653589793E1, ~0.123E~2) = false ?= (0.3141592653589793E1, ~0.123E~2) = false < (0.3141592653589793E1, ~0.22250738585072014E~307) = false > (0.3141592653589793E1, ~0.22250738585072014E~307) = true == (0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (0.3141592653589793E1, ~0.22250738585072014E~307) = false < (0.3141592653589793E1, ~0.11125369292536007E~307) = false > (0.3141592653589793E1, ~0.11125369292536007E~307) = true == (0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (0.3141592653589793E1, ~0.11125369292536007E~307) = false < (0.3141592653589793E1, ~0.5E~323) = false > (0.3141592653589793E1, ~0.5E~323) = true == (0.3141592653589793E1, ~0.5E~323) = false ?= (0.3141592653589793E1, ~0.5E~323) = false < (0.3141592653589793E1, ~0.0) = false > (0.3141592653589793E1, ~0.0) = true == (0.3141592653589793E1, ~0.0) = false ?= (0.3141592653589793E1, ~0.0) = false < (0.2718281828459045E1, 0.17976931348623157E309) = true > (0.2718281828459045E1, 0.17976931348623157E309) = false == (0.2718281828459045E1, 0.17976931348623157E309) = false ?= (0.2718281828459045E1, 0.17976931348623157E309) = false < (0.2718281828459045E1, 0.8988465674311579E308) = true > (0.2718281828459045E1, 0.8988465674311579E308) = false == (0.2718281828459045E1, 0.8988465674311579E308) = false ?= (0.2718281828459045E1, 0.8988465674311579E308) = false < (0.2718281828459045E1, 0.123E4) = true > (0.2718281828459045E1, 0.123E4) = false == (0.2718281828459045E1, 0.123E4) = false ?= (0.2718281828459045E1, 0.123E4) = false < (0.2718281828459045E1, 0.123E2) = true > (0.2718281828459045E1, 0.123E2) = false == (0.2718281828459045E1, 0.123E2) = false ?= (0.2718281828459045E1, 0.123E2) = false < (0.2718281828459045E1, 0.3141592653589793E1) = true > (0.2718281828459045E1, 0.3141592653589793E1) = false == (0.2718281828459045E1, 0.3141592653589793E1) = false ?= (0.2718281828459045E1, 0.3141592653589793E1) = false < (0.2718281828459045E1, 0.2718281828459045E1) = false > (0.2718281828459045E1, 0.2718281828459045E1) = false == (0.2718281828459045E1, 0.2718281828459045E1) = true ?= (0.2718281828459045E1, 0.2718281828459045E1) = true < (0.2718281828459045E1, 0.123E1) = false > (0.2718281828459045E1, 0.123E1) = true == (0.2718281828459045E1, 0.123E1) = false ?= (0.2718281828459045E1, 0.123E1) = false < (0.2718281828459045E1, 0.123) = false > (0.2718281828459045E1, 0.123) = true == (0.2718281828459045E1, 0.123) = false ?= (0.2718281828459045E1, 0.123) = false < (0.2718281828459045E1, 0.123E~2) = false > (0.2718281828459045E1, 0.123E~2) = true == (0.2718281828459045E1, 0.123E~2) = false ?= (0.2718281828459045E1, 0.123E~2) = false < (0.2718281828459045E1, 0.22250738585072014E~307) = false > (0.2718281828459045E1, 0.22250738585072014E~307) = true == (0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (0.2718281828459045E1, 0.22250738585072014E~307) = false < (0.2718281828459045E1, 0.11125369292536007E~307) = false > (0.2718281828459045E1, 0.11125369292536007E~307) = true == (0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (0.2718281828459045E1, 0.11125369292536007E~307) = false < (0.2718281828459045E1, 0.5E~323) = false > (0.2718281828459045E1, 0.5E~323) = true == (0.2718281828459045E1, 0.5E~323) = false ?= (0.2718281828459045E1, 0.5E~323) = false < (0.2718281828459045E1, 0.0) = false > (0.2718281828459045E1, 0.0) = true == (0.2718281828459045E1, 0.0) = false ?= (0.2718281828459045E1, 0.0) = false < (0.2718281828459045E1, ~0.17976931348623157E309) = false > (0.2718281828459045E1, ~0.17976931348623157E309) = true == (0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (0.2718281828459045E1, ~0.17976931348623157E309) = false < (0.2718281828459045E1, ~0.8988465674311579E308) = false > (0.2718281828459045E1, ~0.8988465674311579E308) = true == (0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (0.2718281828459045E1, ~0.8988465674311579E308) = false < (0.2718281828459045E1, ~0.123E4) = false > (0.2718281828459045E1, ~0.123E4) = true == (0.2718281828459045E1, ~0.123E4) = false ?= (0.2718281828459045E1, ~0.123E4) = false < (0.2718281828459045E1, ~0.123E2) = false > (0.2718281828459045E1, ~0.123E2) = true == (0.2718281828459045E1, ~0.123E2) = false ?= (0.2718281828459045E1, ~0.123E2) = false < (0.2718281828459045E1, ~0.3141592653589793E1) = false > (0.2718281828459045E1, ~0.3141592653589793E1) = true == (0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (0.2718281828459045E1, ~0.3141592653589793E1) = false < (0.2718281828459045E1, ~0.2718281828459045E1) = false > (0.2718281828459045E1, ~0.2718281828459045E1) = true == (0.2718281828459045E1, ~0.2718281828459045E1) = false ?= (0.2718281828459045E1, ~0.2718281828459045E1) = false < (0.2718281828459045E1, ~0.123E1) = false > (0.2718281828459045E1, ~0.123E1) = true == (0.2718281828459045E1, ~0.123E1) = false ?= (0.2718281828459045E1, ~0.123E1) = false < (0.2718281828459045E1, ~0.123) = false > (0.2718281828459045E1, ~0.123) = true == (0.2718281828459045E1, ~0.123) = false ?= (0.2718281828459045E1, ~0.123) = false < (0.2718281828459045E1, ~0.123E~2) = false > (0.2718281828459045E1, ~0.123E~2) = true == (0.2718281828459045E1, ~0.123E~2) = false ?= (0.2718281828459045E1, ~0.123E~2) = false < (0.2718281828459045E1, ~0.22250738585072014E~307) = false > (0.2718281828459045E1, ~0.22250738585072014E~307) = true == (0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (0.2718281828459045E1, ~0.22250738585072014E~307) = false < (0.2718281828459045E1, ~0.11125369292536007E~307) = false > (0.2718281828459045E1, ~0.11125369292536007E~307) = true == (0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (0.2718281828459045E1, ~0.11125369292536007E~307) = false < (0.2718281828459045E1, ~0.5E~323) = false > (0.2718281828459045E1, ~0.5E~323) = true == (0.2718281828459045E1, ~0.5E~323) = false ?= (0.2718281828459045E1, ~0.5E~323) = false < (0.2718281828459045E1, ~0.0) = false > (0.2718281828459045E1, ~0.0) = true == (0.2718281828459045E1, ~0.0) = false ?= (0.2718281828459045E1, ~0.0) = false < (0.123E1, 0.17976931348623157E309) = true > (0.123E1, 0.17976931348623157E309) = false == (0.123E1, 0.17976931348623157E309) = false ?= (0.123E1, 0.17976931348623157E309) = false < (0.123E1, 0.8988465674311579E308) = true > (0.123E1, 0.8988465674311579E308) = false == (0.123E1, 0.8988465674311579E308) = false ?= (0.123E1, 0.8988465674311579E308) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.3141592653589793E1) = true > (0.123E1, 0.3141592653589793E1) = false == (0.123E1, 0.3141592653589793E1) = false ?= (0.123E1, 0.3141592653589793E1) = false < (0.123E1, 0.2718281828459045E1) = true > (0.123E1, 0.2718281828459045E1) = false == (0.123E1, 0.2718281828459045E1) = false ?= (0.123E1, 0.2718281828459045E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.22250738585072014E~307) = false > (0.123E1, 0.22250738585072014E~307) = true == (0.123E1, 0.22250738585072014E~307) = false ?= (0.123E1, 0.22250738585072014E~307) = false < (0.123E1, 0.11125369292536007E~307) = false > (0.123E1, 0.11125369292536007E~307) = true == (0.123E1, 0.11125369292536007E~307) = false ?= (0.123E1, 0.11125369292536007E~307) = false < (0.123E1, 0.5E~323) = false > (0.123E1, 0.5E~323) = true == (0.123E1, 0.5E~323) = false ?= (0.123E1, 0.5E~323) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.17976931348623157E309) = false > (0.123E1, ~0.17976931348623157E309) = true == (0.123E1, ~0.17976931348623157E309) = false ?= (0.123E1, ~0.17976931348623157E309) = false < (0.123E1, ~0.8988465674311579E308) = false > (0.123E1, ~0.8988465674311579E308) = true == (0.123E1, ~0.8988465674311579E308) = false ?= (0.123E1, ~0.8988465674311579E308) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.3141592653589793E1) = false > (0.123E1, ~0.3141592653589793E1) = true == (0.123E1, ~0.3141592653589793E1) = false ?= (0.123E1, ~0.3141592653589793E1) = false < (0.123E1, ~0.2718281828459045E1) = false > (0.123E1, ~0.2718281828459045E1) = true == (0.123E1, ~0.2718281828459045E1) = false ?= (0.123E1, ~0.2718281828459045E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.22250738585072014E~307) = false > (0.123E1, ~0.22250738585072014E~307) = true == (0.123E1, ~0.22250738585072014E~307) = false ?= (0.123E1, ~0.22250738585072014E~307) = false < (0.123E1, ~0.11125369292536007E~307) = false > (0.123E1, ~0.11125369292536007E~307) = true == (0.123E1, ~0.11125369292536007E~307) = false ?= (0.123E1, ~0.11125369292536007E~307) = false < (0.123E1, ~0.5E~323) = false > (0.123E1, ~0.5E~323) = true == (0.123E1, ~0.5E~323) = false ?= (0.123E1, ~0.5E~323) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.17976931348623157E309) = true > (0.123, 0.17976931348623157E309) = false == (0.123, 0.17976931348623157E309) = false ?= (0.123, 0.17976931348623157E309) = false < (0.123, 0.8988465674311579E308) = true > (0.123, 0.8988465674311579E308) = false == (0.123, 0.8988465674311579E308) = false ?= (0.123, 0.8988465674311579E308) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.3141592653589793E1) = true > (0.123, 0.3141592653589793E1) = false == (0.123, 0.3141592653589793E1) = false ?= (0.123, 0.3141592653589793E1) = false < (0.123, 0.2718281828459045E1) = true > (0.123, 0.2718281828459045E1) = false == (0.123, 0.2718281828459045E1) = false ?= (0.123, 0.2718281828459045E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.22250738585072014E~307) = false > (0.123, 0.22250738585072014E~307) = true == (0.123, 0.22250738585072014E~307) = false ?= (0.123, 0.22250738585072014E~307) = false < (0.123, 0.11125369292536007E~307) = false > (0.123, 0.11125369292536007E~307) = true == (0.123, 0.11125369292536007E~307) = false ?= (0.123, 0.11125369292536007E~307) = false < (0.123, 0.5E~323) = false > (0.123, 0.5E~323) = true == (0.123, 0.5E~323) = false ?= (0.123, 0.5E~323) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.17976931348623157E309) = false > (0.123, ~0.17976931348623157E309) = true == (0.123, ~0.17976931348623157E309) = false ?= (0.123, ~0.17976931348623157E309) = false < (0.123, ~0.8988465674311579E308) = false > (0.123, ~0.8988465674311579E308) = true == (0.123, ~0.8988465674311579E308) = false ?= (0.123, ~0.8988465674311579E308) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.3141592653589793E1) = false > (0.123, ~0.3141592653589793E1) = true == (0.123, ~0.3141592653589793E1) = false ?= (0.123, ~0.3141592653589793E1) = false < (0.123, ~0.2718281828459045E1) = false > (0.123, ~0.2718281828459045E1) = true == (0.123, ~0.2718281828459045E1) = false ?= (0.123, ~0.2718281828459045E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.22250738585072014E~307) = false > (0.123, ~0.22250738585072014E~307) = true == (0.123, ~0.22250738585072014E~307) = false ?= (0.123, ~0.22250738585072014E~307) = false < (0.123, ~0.11125369292536007E~307) = false > (0.123, ~0.11125369292536007E~307) = true == (0.123, ~0.11125369292536007E~307) = false ?= (0.123, ~0.11125369292536007E~307) = false < (0.123, ~0.5E~323) = false > (0.123, ~0.5E~323) = true == (0.123, ~0.5E~323) = false ?= (0.123, ~0.5E~323) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.17976931348623157E309) = true > (0.123E~2, 0.17976931348623157E309) = false == (0.123E~2, 0.17976931348623157E309) = false ?= (0.123E~2, 0.17976931348623157E309) = false < (0.123E~2, 0.8988465674311579E308) = true > (0.123E~2, 0.8988465674311579E308) = false == (0.123E~2, 0.8988465674311579E308) = false ?= (0.123E~2, 0.8988465674311579E308) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.3141592653589793E1) = true > (0.123E~2, 0.3141592653589793E1) = false == (0.123E~2, 0.3141592653589793E1) = false ?= (0.123E~2, 0.3141592653589793E1) = false < (0.123E~2, 0.2718281828459045E1) = true > (0.123E~2, 0.2718281828459045E1) = false == (0.123E~2, 0.2718281828459045E1) = false ?= (0.123E~2, 0.2718281828459045E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.22250738585072014E~307) = false > (0.123E~2, 0.22250738585072014E~307) = true == (0.123E~2, 0.22250738585072014E~307) = false ?= (0.123E~2, 0.22250738585072014E~307) = false < (0.123E~2, 0.11125369292536007E~307) = false > (0.123E~2, 0.11125369292536007E~307) = true == (0.123E~2, 0.11125369292536007E~307) = false ?= (0.123E~2, 0.11125369292536007E~307) = false < (0.123E~2, 0.5E~323) = false > (0.123E~2, 0.5E~323) = true == (0.123E~2, 0.5E~323) = false ?= (0.123E~2, 0.5E~323) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.17976931348623157E309) = false > (0.123E~2, ~0.17976931348623157E309) = true == (0.123E~2, ~0.17976931348623157E309) = false ?= (0.123E~2, ~0.17976931348623157E309) = false < (0.123E~2, ~0.8988465674311579E308) = false > (0.123E~2, ~0.8988465674311579E308) = true == (0.123E~2, ~0.8988465674311579E308) = false ?= (0.123E~2, ~0.8988465674311579E308) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.3141592653589793E1) = false > (0.123E~2, ~0.3141592653589793E1) = true == (0.123E~2, ~0.3141592653589793E1) = false ?= (0.123E~2, ~0.3141592653589793E1) = false < (0.123E~2, ~0.2718281828459045E1) = false > (0.123E~2, ~0.2718281828459045E1) = true == (0.123E~2, ~0.2718281828459045E1) = false ?= (0.123E~2, ~0.2718281828459045E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.22250738585072014E~307) = false > (0.123E~2, ~0.22250738585072014E~307) = true == (0.123E~2, ~0.22250738585072014E~307) = false ?= (0.123E~2, ~0.22250738585072014E~307) = false < (0.123E~2, ~0.11125369292536007E~307) = false > (0.123E~2, ~0.11125369292536007E~307) = true == (0.123E~2, ~0.11125369292536007E~307) = false ?= (0.123E~2, ~0.11125369292536007E~307) = false < (0.123E~2, ~0.5E~323) = false > (0.123E~2, ~0.5E~323) = true == (0.123E~2, ~0.5E~323) = false ?= (0.123E~2, ~0.5E~323) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.22250738585072014E~307, 0.17976931348623157E309) = true > (0.22250738585072014E~307, 0.17976931348623157E309) = false == (0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (0.22250738585072014E~307, 0.17976931348623157E309) = false < (0.22250738585072014E~307, 0.8988465674311579E308) = true > (0.22250738585072014E~307, 0.8988465674311579E308) = false == (0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (0.22250738585072014E~307, 0.8988465674311579E308) = false < (0.22250738585072014E~307, 0.123E4) = true > (0.22250738585072014E~307, 0.123E4) = false == (0.22250738585072014E~307, 0.123E4) = false ?= (0.22250738585072014E~307, 0.123E4) = false < (0.22250738585072014E~307, 0.123E2) = true > (0.22250738585072014E~307, 0.123E2) = false == (0.22250738585072014E~307, 0.123E2) = false ?= (0.22250738585072014E~307, 0.123E2) = false < (0.22250738585072014E~307, 0.3141592653589793E1) = true > (0.22250738585072014E~307, 0.3141592653589793E1) = false == (0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (0.22250738585072014E~307, 0.3141592653589793E1) = false < (0.22250738585072014E~307, 0.2718281828459045E1) = true > (0.22250738585072014E~307, 0.2718281828459045E1) = false == (0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (0.22250738585072014E~307, 0.2718281828459045E1) = false < (0.22250738585072014E~307, 0.123E1) = true > (0.22250738585072014E~307, 0.123E1) = false == (0.22250738585072014E~307, 0.123E1) = false ?= (0.22250738585072014E~307, 0.123E1) = false < (0.22250738585072014E~307, 0.123) = true > (0.22250738585072014E~307, 0.123) = false == (0.22250738585072014E~307, 0.123) = false ?= (0.22250738585072014E~307, 0.123) = false < (0.22250738585072014E~307, 0.123E~2) = true > (0.22250738585072014E~307, 0.123E~2) = false == (0.22250738585072014E~307, 0.123E~2) = false ?= (0.22250738585072014E~307, 0.123E~2) = false < (0.22250738585072014E~307, 0.22250738585072014E~307) = false > (0.22250738585072014E~307, 0.22250738585072014E~307) = false == (0.22250738585072014E~307, 0.22250738585072014E~307) = true ?= (0.22250738585072014E~307, 0.22250738585072014E~307) = true < (0.22250738585072014E~307, 0.11125369292536007E~307) = false > (0.22250738585072014E~307, 0.11125369292536007E~307) = true == (0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, 0.11125369292536007E~307) = false < (0.22250738585072014E~307, 0.5E~323) = false > (0.22250738585072014E~307, 0.5E~323) = true == (0.22250738585072014E~307, 0.5E~323) = false ?= (0.22250738585072014E~307, 0.5E~323) = false < (0.22250738585072014E~307, 0.0) = false > (0.22250738585072014E~307, 0.0) = true == (0.22250738585072014E~307, 0.0) = false ?= (0.22250738585072014E~307, 0.0) = false < (0.22250738585072014E~307, ~0.17976931348623157E309) = false > (0.22250738585072014E~307, ~0.17976931348623157E309) = true == (0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (0.22250738585072014E~307, ~0.17976931348623157E309) = false < (0.22250738585072014E~307, ~0.8988465674311579E308) = false > (0.22250738585072014E~307, ~0.8988465674311579E308) = true == (0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (0.22250738585072014E~307, ~0.8988465674311579E308) = false < (0.22250738585072014E~307, ~0.123E4) = false > (0.22250738585072014E~307, ~0.123E4) = true == (0.22250738585072014E~307, ~0.123E4) = false ?= (0.22250738585072014E~307, ~0.123E4) = false < (0.22250738585072014E~307, ~0.123E2) = false > (0.22250738585072014E~307, ~0.123E2) = true == (0.22250738585072014E~307, ~0.123E2) = false ?= (0.22250738585072014E~307, ~0.123E2) = false < (0.22250738585072014E~307, ~0.3141592653589793E1) = false > (0.22250738585072014E~307, ~0.3141592653589793E1) = true == (0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (0.22250738585072014E~307, ~0.3141592653589793E1) = false < (0.22250738585072014E~307, ~0.2718281828459045E1) = false > (0.22250738585072014E~307, ~0.2718281828459045E1) = true == (0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (0.22250738585072014E~307, ~0.2718281828459045E1) = false < (0.22250738585072014E~307, ~0.123E1) = false > (0.22250738585072014E~307, ~0.123E1) = true == (0.22250738585072014E~307, ~0.123E1) = false ?= (0.22250738585072014E~307, ~0.123E1) = false < (0.22250738585072014E~307, ~0.123) = false > (0.22250738585072014E~307, ~0.123) = true == (0.22250738585072014E~307, ~0.123) = false ?= (0.22250738585072014E~307, ~0.123) = false < (0.22250738585072014E~307, ~0.123E~2) = false > (0.22250738585072014E~307, ~0.123E~2) = true == (0.22250738585072014E~307, ~0.123E~2) = false ?= (0.22250738585072014E~307, ~0.123E~2) = false < (0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (0.22250738585072014E~307, ~0.22250738585072014E~307) = true == (0.22250738585072014E~307, ~0.22250738585072014E~307) = false ?= (0.22250738585072014E~307, ~0.22250738585072014E~307) = false < (0.22250738585072014E~307, ~0.11125369292536007E~307) = false > (0.22250738585072014E~307, ~0.11125369292536007E~307) = true == (0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (0.22250738585072014E~307, ~0.5E~323) = false > (0.22250738585072014E~307, ~0.5E~323) = true == (0.22250738585072014E~307, ~0.5E~323) = false ?= (0.22250738585072014E~307, ~0.5E~323) = false < (0.22250738585072014E~307, ~0.0) = false > (0.22250738585072014E~307, ~0.0) = true == (0.22250738585072014E~307, ~0.0) = false ?= (0.22250738585072014E~307, ~0.0) = false < (0.11125369292536007E~307, 0.17976931348623157E309) = true > (0.11125369292536007E~307, 0.17976931348623157E309) = false == (0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (0.11125369292536007E~307, 0.17976931348623157E309) = false < (0.11125369292536007E~307, 0.8988465674311579E308) = true > (0.11125369292536007E~307, 0.8988465674311579E308) = false == (0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (0.11125369292536007E~307, 0.8988465674311579E308) = false < (0.11125369292536007E~307, 0.123E4) = true > (0.11125369292536007E~307, 0.123E4) = false == (0.11125369292536007E~307, 0.123E4) = false ?= (0.11125369292536007E~307, 0.123E4) = false < (0.11125369292536007E~307, 0.123E2) = true > (0.11125369292536007E~307, 0.123E2) = false == (0.11125369292536007E~307, 0.123E2) = false ?= (0.11125369292536007E~307, 0.123E2) = false < (0.11125369292536007E~307, 0.3141592653589793E1) = true > (0.11125369292536007E~307, 0.3141592653589793E1) = false == (0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (0.11125369292536007E~307, 0.3141592653589793E1) = false < (0.11125369292536007E~307, 0.2718281828459045E1) = true > (0.11125369292536007E~307, 0.2718281828459045E1) = false == (0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (0.11125369292536007E~307, 0.2718281828459045E1) = false < (0.11125369292536007E~307, 0.123E1) = true > (0.11125369292536007E~307, 0.123E1) = false == (0.11125369292536007E~307, 0.123E1) = false ?= (0.11125369292536007E~307, 0.123E1) = false < (0.11125369292536007E~307, 0.123) = true > (0.11125369292536007E~307, 0.123) = false == (0.11125369292536007E~307, 0.123) = false ?= (0.11125369292536007E~307, 0.123) = false < (0.11125369292536007E~307, 0.123E~2) = true > (0.11125369292536007E~307, 0.123E~2) = false == (0.11125369292536007E~307, 0.123E~2) = false ?= (0.11125369292536007E~307, 0.123E~2) = false < (0.11125369292536007E~307, 0.22250738585072014E~307) = true > (0.11125369292536007E~307, 0.22250738585072014E~307) = false == (0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, 0.22250738585072014E~307) = false < (0.11125369292536007E~307, 0.11125369292536007E~307) = false > (0.11125369292536007E~307, 0.11125369292536007E~307) = false == (0.11125369292536007E~307, 0.11125369292536007E~307) = true ?= (0.11125369292536007E~307, 0.11125369292536007E~307) = true < (0.11125369292536007E~307, 0.5E~323) = false > (0.11125369292536007E~307, 0.5E~323) = true == (0.11125369292536007E~307, 0.5E~323) = false ?= (0.11125369292536007E~307, 0.5E~323) = false < (0.11125369292536007E~307, 0.0) = false > (0.11125369292536007E~307, 0.0) = true == (0.11125369292536007E~307, 0.0) = false ?= (0.11125369292536007E~307, 0.0) = false < (0.11125369292536007E~307, ~0.17976931348623157E309) = false > (0.11125369292536007E~307, ~0.17976931348623157E309) = true == (0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (0.11125369292536007E~307, ~0.17976931348623157E309) = false < (0.11125369292536007E~307, ~0.8988465674311579E308) = false > (0.11125369292536007E~307, ~0.8988465674311579E308) = true == (0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (0.11125369292536007E~307, ~0.8988465674311579E308) = false < (0.11125369292536007E~307, ~0.123E4) = false > (0.11125369292536007E~307, ~0.123E4) = true == (0.11125369292536007E~307, ~0.123E4) = false ?= (0.11125369292536007E~307, ~0.123E4) = false < (0.11125369292536007E~307, ~0.123E2) = false > (0.11125369292536007E~307, ~0.123E2) = true == (0.11125369292536007E~307, ~0.123E2) = false ?= (0.11125369292536007E~307, ~0.123E2) = false < (0.11125369292536007E~307, ~0.3141592653589793E1) = false > (0.11125369292536007E~307, ~0.3141592653589793E1) = true == (0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (0.11125369292536007E~307, ~0.3141592653589793E1) = false < (0.11125369292536007E~307, ~0.2718281828459045E1) = false > (0.11125369292536007E~307, ~0.2718281828459045E1) = true == (0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (0.11125369292536007E~307, ~0.2718281828459045E1) = false < (0.11125369292536007E~307, ~0.123E1) = false > (0.11125369292536007E~307, ~0.123E1) = true == (0.11125369292536007E~307, ~0.123E1) = false ?= (0.11125369292536007E~307, ~0.123E1) = false < (0.11125369292536007E~307, ~0.123) = false > (0.11125369292536007E~307, ~0.123) = true == (0.11125369292536007E~307, ~0.123) = false ?= (0.11125369292536007E~307, ~0.123) = false < (0.11125369292536007E~307, ~0.123E~2) = false > (0.11125369292536007E~307, ~0.123E~2) = true == (0.11125369292536007E~307, ~0.123E~2) = false ?= (0.11125369292536007E~307, ~0.123E~2) = false < (0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (0.11125369292536007E~307, ~0.11125369292536007E~307) = true == (0.11125369292536007E~307, ~0.11125369292536007E~307) = false ?= (0.11125369292536007E~307, ~0.11125369292536007E~307) = false < (0.11125369292536007E~307, ~0.5E~323) = false > (0.11125369292536007E~307, ~0.5E~323) = true == (0.11125369292536007E~307, ~0.5E~323) = false ?= (0.11125369292536007E~307, ~0.5E~323) = false < (0.11125369292536007E~307, ~0.0) = false > (0.11125369292536007E~307, ~0.0) = true == (0.11125369292536007E~307, ~0.0) = false ?= (0.11125369292536007E~307, ~0.0) = false < (0.5E~323, 0.17976931348623157E309) = true > (0.5E~323, 0.17976931348623157E309) = false == (0.5E~323, 0.17976931348623157E309) = false ?= (0.5E~323, 0.17976931348623157E309) = false < (0.5E~323, 0.8988465674311579E308) = true > (0.5E~323, 0.8988465674311579E308) = false == (0.5E~323, 0.8988465674311579E308) = false ?= (0.5E~323, 0.8988465674311579E308) = false < (0.5E~323, 0.123E4) = true > (0.5E~323, 0.123E4) = false == (0.5E~323, 0.123E4) = false ?= (0.5E~323, 0.123E4) = false < (0.5E~323, 0.123E2) = true > (0.5E~323, 0.123E2) = false == (0.5E~323, 0.123E2) = false ?= (0.5E~323, 0.123E2) = false < (0.5E~323, 0.3141592653589793E1) = true > (0.5E~323, 0.3141592653589793E1) = false == (0.5E~323, 0.3141592653589793E1) = false ?= (0.5E~323, 0.3141592653589793E1) = false < (0.5E~323, 0.2718281828459045E1) = true > (0.5E~323, 0.2718281828459045E1) = false == (0.5E~323, 0.2718281828459045E1) = false ?= (0.5E~323, 0.2718281828459045E1) = false < (0.5E~323, 0.123E1) = true > (0.5E~323, 0.123E1) = false == (0.5E~323, 0.123E1) = false ?= (0.5E~323, 0.123E1) = false < (0.5E~323, 0.123) = true > (0.5E~323, 0.123) = false == (0.5E~323, 0.123) = false ?= (0.5E~323, 0.123) = false < (0.5E~323, 0.123E~2) = true > (0.5E~323, 0.123E~2) = false == (0.5E~323, 0.123E~2) = false ?= (0.5E~323, 0.123E~2) = false < (0.5E~323, 0.22250738585072014E~307) = true > (0.5E~323, 0.22250738585072014E~307) = false == (0.5E~323, 0.22250738585072014E~307) = false ?= (0.5E~323, 0.22250738585072014E~307) = false < (0.5E~323, 0.11125369292536007E~307) = true > (0.5E~323, 0.11125369292536007E~307) = false == (0.5E~323, 0.11125369292536007E~307) = false ?= (0.5E~323, 0.11125369292536007E~307) = false < (0.5E~323, 0.5E~323) = false > (0.5E~323, 0.5E~323) = false == (0.5E~323, 0.5E~323) = true ?= (0.5E~323, 0.5E~323) = true < (0.5E~323, 0.0) = false > (0.5E~323, 0.0) = true == (0.5E~323, 0.0) = false ?= (0.5E~323, 0.0) = false < (0.5E~323, ~0.17976931348623157E309) = false > (0.5E~323, ~0.17976931348623157E309) = true == (0.5E~323, ~0.17976931348623157E309) = false ?= (0.5E~323, ~0.17976931348623157E309) = false < (0.5E~323, ~0.8988465674311579E308) = false > (0.5E~323, ~0.8988465674311579E308) = true == (0.5E~323, ~0.8988465674311579E308) = false ?= (0.5E~323, ~0.8988465674311579E308) = false < (0.5E~323, ~0.123E4) = false > (0.5E~323, ~0.123E4) = true == (0.5E~323, ~0.123E4) = false ?= (0.5E~323, ~0.123E4) = false < (0.5E~323, ~0.123E2) = false > (0.5E~323, ~0.123E2) = true == (0.5E~323, ~0.123E2) = false ?= (0.5E~323, ~0.123E2) = false < (0.5E~323, ~0.3141592653589793E1) = false > (0.5E~323, ~0.3141592653589793E1) = true == (0.5E~323, ~0.3141592653589793E1) = false ?= (0.5E~323, ~0.3141592653589793E1) = false < (0.5E~323, ~0.2718281828459045E1) = false > (0.5E~323, ~0.2718281828459045E1) = true == (0.5E~323, ~0.2718281828459045E1) = false ?= (0.5E~323, ~0.2718281828459045E1) = false < (0.5E~323, ~0.123E1) = false > (0.5E~323, ~0.123E1) = true == (0.5E~323, ~0.123E1) = false ?= (0.5E~323, ~0.123E1) = false < (0.5E~323, ~0.123) = false > (0.5E~323, ~0.123) = true == (0.5E~323, ~0.123) = false ?= (0.5E~323, ~0.123) = false < (0.5E~323, ~0.123E~2) = false > (0.5E~323, ~0.123E~2) = true == (0.5E~323, ~0.123E~2) = false ?= (0.5E~323, ~0.123E~2) = false < (0.5E~323, ~0.22250738585072014E~307) = false > (0.5E~323, ~0.22250738585072014E~307) = true == (0.5E~323, ~0.22250738585072014E~307) = false ?= (0.5E~323, ~0.22250738585072014E~307) = false < (0.5E~323, ~0.11125369292536007E~307) = false > (0.5E~323, ~0.11125369292536007E~307) = true == (0.5E~323, ~0.11125369292536007E~307) = false ?= (0.5E~323, ~0.11125369292536007E~307) = false < (0.5E~323, ~0.5E~323) = false > (0.5E~323, ~0.5E~323) = true == (0.5E~323, ~0.5E~323) = false ?= (0.5E~323, ~0.5E~323) = false < (0.5E~323, ~0.0) = false > (0.5E~323, ~0.0) = true == (0.5E~323, ~0.0) = false ?= (0.5E~323, ~0.0) = false < (0.0, 0.17976931348623157E309) = true > (0.0, 0.17976931348623157E309) = false == (0.0, 0.17976931348623157E309) = false ?= (0.0, 0.17976931348623157E309) = false < (0.0, 0.8988465674311579E308) = true > (0.0, 0.8988465674311579E308) = false == (0.0, 0.8988465674311579E308) = false ?= (0.0, 0.8988465674311579E308) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.3141592653589793E1) = true > (0.0, 0.3141592653589793E1) = false == (0.0, 0.3141592653589793E1) = false ?= (0.0, 0.3141592653589793E1) = false < (0.0, 0.2718281828459045E1) = true > (0.0, 0.2718281828459045E1) = false == (0.0, 0.2718281828459045E1) = false ?= (0.0, 0.2718281828459045E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.22250738585072014E~307) = true > (0.0, 0.22250738585072014E~307) = false == (0.0, 0.22250738585072014E~307) = false ?= (0.0, 0.22250738585072014E~307) = false < (0.0, 0.11125369292536007E~307) = true > (0.0, 0.11125369292536007E~307) = false == (0.0, 0.11125369292536007E~307) = false ?= (0.0, 0.11125369292536007E~307) = false < (0.0, 0.5E~323) = true > (0.0, 0.5E~323) = false == (0.0, 0.5E~323) = false ?= (0.0, 0.5E~323) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.17976931348623157E309) = false > (0.0, ~0.17976931348623157E309) = true == (0.0, ~0.17976931348623157E309) = false ?= (0.0, ~0.17976931348623157E309) = false < (0.0, ~0.8988465674311579E308) = false > (0.0, ~0.8988465674311579E308) = true == (0.0, ~0.8988465674311579E308) = false ?= (0.0, ~0.8988465674311579E308) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.3141592653589793E1) = false > (0.0, ~0.3141592653589793E1) = true == (0.0, ~0.3141592653589793E1) = false ?= (0.0, ~0.3141592653589793E1) = false < (0.0, ~0.2718281828459045E1) = false > (0.0, ~0.2718281828459045E1) = true == (0.0, ~0.2718281828459045E1) = false ?= (0.0, ~0.2718281828459045E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.22250738585072014E~307) = false > (0.0, ~0.22250738585072014E~307) = true == (0.0, ~0.22250738585072014E~307) = false ?= (0.0, ~0.22250738585072014E~307) = false < (0.0, ~0.11125369292536007E~307) = false > (0.0, ~0.11125369292536007E~307) = true == (0.0, ~0.11125369292536007E~307) = false ?= (0.0, ~0.11125369292536007E~307) = false < (0.0, ~0.5E~323) = false > (0.0, ~0.5E~323) = true == (0.0, ~0.5E~323) = false ?= (0.0, ~0.5E~323) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.17976931348623157E309, 0.17976931348623157E309) = true > (~0.17976931348623157E309, 0.17976931348623157E309) = false == (~0.17976931348623157E309, 0.17976931348623157E309) = false ?= (~0.17976931348623157E309, 0.17976931348623157E309) = false < (~0.17976931348623157E309, 0.8988465674311579E308) = true > (~0.17976931348623157E309, 0.8988465674311579E308) = false == (~0.17976931348623157E309, 0.8988465674311579E308) = false ?= (~0.17976931348623157E309, 0.8988465674311579E308) = false < (~0.17976931348623157E309, 0.123E4) = true > (~0.17976931348623157E309, 0.123E4) = false == (~0.17976931348623157E309, 0.123E4) = false ?= (~0.17976931348623157E309, 0.123E4) = false < (~0.17976931348623157E309, 0.123E2) = true > (~0.17976931348623157E309, 0.123E2) = false == (~0.17976931348623157E309, 0.123E2) = false ?= (~0.17976931348623157E309, 0.123E2) = false < (~0.17976931348623157E309, 0.3141592653589793E1) = true > (~0.17976931348623157E309, 0.3141592653589793E1) = false == (~0.17976931348623157E309, 0.3141592653589793E1) = false ?= (~0.17976931348623157E309, 0.3141592653589793E1) = false < (~0.17976931348623157E309, 0.2718281828459045E1) = true > (~0.17976931348623157E309, 0.2718281828459045E1) = false == (~0.17976931348623157E309, 0.2718281828459045E1) = false ?= (~0.17976931348623157E309, 0.2718281828459045E1) = false < (~0.17976931348623157E309, 0.123E1) = true > (~0.17976931348623157E309, 0.123E1) = false == (~0.17976931348623157E309, 0.123E1) = false ?= (~0.17976931348623157E309, 0.123E1) = false < (~0.17976931348623157E309, 0.123) = true > (~0.17976931348623157E309, 0.123) = false == (~0.17976931348623157E309, 0.123) = false ?= (~0.17976931348623157E309, 0.123) = false < (~0.17976931348623157E309, 0.123E~2) = true > (~0.17976931348623157E309, 0.123E~2) = false == (~0.17976931348623157E309, 0.123E~2) = false ?= (~0.17976931348623157E309, 0.123E~2) = false < (~0.17976931348623157E309, 0.22250738585072014E~307) = true > (~0.17976931348623157E309, 0.22250738585072014E~307) = false == (~0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, 0.22250738585072014E~307) = false < (~0.17976931348623157E309, 0.11125369292536007E~307) = true > (~0.17976931348623157E309, 0.11125369292536007E~307) = false == (~0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, 0.11125369292536007E~307) = false < (~0.17976931348623157E309, 0.5E~323) = true > (~0.17976931348623157E309, 0.5E~323) = false == (~0.17976931348623157E309, 0.5E~323) = false ?= (~0.17976931348623157E309, 0.5E~323) = false < (~0.17976931348623157E309, 0.0) = true > (~0.17976931348623157E309, 0.0) = false == (~0.17976931348623157E309, 0.0) = false ?= (~0.17976931348623157E309, 0.0) = false < (~0.17976931348623157E309, ~0.17976931348623157E309) = false > (~0.17976931348623157E309, ~0.17976931348623157E309) = false == (~0.17976931348623157E309, ~0.17976931348623157E309) = true ?= (~0.17976931348623157E309, ~0.17976931348623157E309) = true < (~0.17976931348623157E309, ~0.8988465674311579E308) = true > (~0.17976931348623157E309, ~0.8988465674311579E308) = false == (~0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (~0.17976931348623157E309, ~0.8988465674311579E308) = false < (~0.17976931348623157E309, ~0.123E4) = true > (~0.17976931348623157E309, ~0.123E4) = false == (~0.17976931348623157E309, ~0.123E4) = false ?= (~0.17976931348623157E309, ~0.123E4) = false < (~0.17976931348623157E309, ~0.123E2) = true > (~0.17976931348623157E309, ~0.123E2) = false == (~0.17976931348623157E309, ~0.123E2) = false ?= (~0.17976931348623157E309, ~0.123E2) = false < (~0.17976931348623157E309, ~0.3141592653589793E1) = true > (~0.17976931348623157E309, ~0.3141592653589793E1) = false == (~0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (~0.17976931348623157E309, ~0.3141592653589793E1) = false < (~0.17976931348623157E309, ~0.2718281828459045E1) = true > (~0.17976931348623157E309, ~0.2718281828459045E1) = false == (~0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (~0.17976931348623157E309, ~0.2718281828459045E1) = false < (~0.17976931348623157E309, ~0.123E1) = true > (~0.17976931348623157E309, ~0.123E1) = false == (~0.17976931348623157E309, ~0.123E1) = false ?= (~0.17976931348623157E309, ~0.123E1) = false < (~0.17976931348623157E309, ~0.123) = true > (~0.17976931348623157E309, ~0.123) = false == (~0.17976931348623157E309, ~0.123) = false ?= (~0.17976931348623157E309, ~0.123) = false < (~0.17976931348623157E309, ~0.123E~2) = true > (~0.17976931348623157E309, ~0.123E~2) = false == (~0.17976931348623157E309, ~0.123E~2) = false ?= (~0.17976931348623157E309, ~0.123E~2) = false < (~0.17976931348623157E309, ~0.22250738585072014E~307) = true > (~0.17976931348623157E309, ~0.22250738585072014E~307) = false == (~0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, ~0.22250738585072014E~307) = false < (~0.17976931348623157E309, ~0.11125369292536007E~307) = true > (~0.17976931348623157E309, ~0.11125369292536007E~307) = false == (~0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, ~0.11125369292536007E~307) = false < (~0.17976931348623157E309, ~0.5E~323) = true > (~0.17976931348623157E309, ~0.5E~323) = false == (~0.17976931348623157E309, ~0.5E~323) = false ?= (~0.17976931348623157E309, ~0.5E~323) = false < (~0.17976931348623157E309, ~0.0) = true > (~0.17976931348623157E309, ~0.0) = false == (~0.17976931348623157E309, ~0.0) = false ?= (~0.17976931348623157E309, ~0.0) = false < (~0.8988465674311579E308, 0.17976931348623157E309) = true > (~0.8988465674311579E308, 0.17976931348623157E309) = false == (~0.8988465674311579E308, 0.17976931348623157E309) = false ?= (~0.8988465674311579E308, 0.17976931348623157E309) = false < (~0.8988465674311579E308, 0.8988465674311579E308) = true > (~0.8988465674311579E308, 0.8988465674311579E308) = false == (~0.8988465674311579E308, 0.8988465674311579E308) = false ?= (~0.8988465674311579E308, 0.8988465674311579E308) = false < (~0.8988465674311579E308, 0.123E4) = true > (~0.8988465674311579E308, 0.123E4) = false == (~0.8988465674311579E308, 0.123E4) = false ?= (~0.8988465674311579E308, 0.123E4) = false < (~0.8988465674311579E308, 0.123E2) = true > (~0.8988465674311579E308, 0.123E2) = false == (~0.8988465674311579E308, 0.123E2) = false ?= (~0.8988465674311579E308, 0.123E2) = false < (~0.8988465674311579E308, 0.3141592653589793E1) = true > (~0.8988465674311579E308, 0.3141592653589793E1) = false == (~0.8988465674311579E308, 0.3141592653589793E1) = false ?= (~0.8988465674311579E308, 0.3141592653589793E1) = false < (~0.8988465674311579E308, 0.2718281828459045E1) = true > (~0.8988465674311579E308, 0.2718281828459045E1) = false == (~0.8988465674311579E308, 0.2718281828459045E1) = false ?= (~0.8988465674311579E308, 0.2718281828459045E1) = false < (~0.8988465674311579E308, 0.123E1) = true > (~0.8988465674311579E308, 0.123E1) = false == (~0.8988465674311579E308, 0.123E1) = false ?= (~0.8988465674311579E308, 0.123E1) = false < (~0.8988465674311579E308, 0.123) = true > (~0.8988465674311579E308, 0.123) = false == (~0.8988465674311579E308, 0.123) = false ?= (~0.8988465674311579E308, 0.123) = false < (~0.8988465674311579E308, 0.123E~2) = true > (~0.8988465674311579E308, 0.123E~2) = false == (~0.8988465674311579E308, 0.123E~2) = false ?= (~0.8988465674311579E308, 0.123E~2) = false < (~0.8988465674311579E308, 0.22250738585072014E~307) = true > (~0.8988465674311579E308, 0.22250738585072014E~307) = false == (~0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, 0.22250738585072014E~307) = false < (~0.8988465674311579E308, 0.11125369292536007E~307) = true > (~0.8988465674311579E308, 0.11125369292536007E~307) = false == (~0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, 0.11125369292536007E~307) = false < (~0.8988465674311579E308, 0.5E~323) = true > (~0.8988465674311579E308, 0.5E~323) = false == (~0.8988465674311579E308, 0.5E~323) = false ?= (~0.8988465674311579E308, 0.5E~323) = false < (~0.8988465674311579E308, 0.0) = true > (~0.8988465674311579E308, 0.0) = false == (~0.8988465674311579E308, 0.0) = false ?= (~0.8988465674311579E308, 0.0) = false < (~0.8988465674311579E308, ~0.17976931348623157E309) = false > (~0.8988465674311579E308, ~0.17976931348623157E309) = true == (~0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (~0.8988465674311579E308, ~0.17976931348623157E309) = false < (~0.8988465674311579E308, ~0.8988465674311579E308) = false > (~0.8988465674311579E308, ~0.8988465674311579E308) = false == (~0.8988465674311579E308, ~0.8988465674311579E308) = true ?= (~0.8988465674311579E308, ~0.8988465674311579E308) = true < (~0.8988465674311579E308, ~0.123E4) = true > (~0.8988465674311579E308, ~0.123E4) = false == (~0.8988465674311579E308, ~0.123E4) = false ?= (~0.8988465674311579E308, ~0.123E4) = false < (~0.8988465674311579E308, ~0.123E2) = true > (~0.8988465674311579E308, ~0.123E2) = false == (~0.8988465674311579E308, ~0.123E2) = false ?= (~0.8988465674311579E308, ~0.123E2) = false < (~0.8988465674311579E308, ~0.3141592653589793E1) = true > (~0.8988465674311579E308, ~0.3141592653589793E1) = false == (~0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (~0.8988465674311579E308, ~0.3141592653589793E1) = false < (~0.8988465674311579E308, ~0.2718281828459045E1) = true > (~0.8988465674311579E308, ~0.2718281828459045E1) = false == (~0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (~0.8988465674311579E308, ~0.2718281828459045E1) = false < (~0.8988465674311579E308, ~0.123E1) = true > (~0.8988465674311579E308, ~0.123E1) = false == (~0.8988465674311579E308, ~0.123E1) = false ?= (~0.8988465674311579E308, ~0.123E1) = false < (~0.8988465674311579E308, ~0.123) = true > (~0.8988465674311579E308, ~0.123) = false == (~0.8988465674311579E308, ~0.123) = false ?= (~0.8988465674311579E308, ~0.123) = false < (~0.8988465674311579E308, ~0.123E~2) = true > (~0.8988465674311579E308, ~0.123E~2) = false == (~0.8988465674311579E308, ~0.123E~2) = false ?= (~0.8988465674311579E308, ~0.123E~2) = false < (~0.8988465674311579E308, ~0.22250738585072014E~307) = true > (~0.8988465674311579E308, ~0.22250738585072014E~307) = false == (~0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, ~0.22250738585072014E~307) = false < (~0.8988465674311579E308, ~0.11125369292536007E~307) = true > (~0.8988465674311579E308, ~0.11125369292536007E~307) = false == (~0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, ~0.11125369292536007E~307) = false < (~0.8988465674311579E308, ~0.5E~323) = true > (~0.8988465674311579E308, ~0.5E~323) = false == (~0.8988465674311579E308, ~0.5E~323) = false ?= (~0.8988465674311579E308, ~0.5E~323) = false < (~0.8988465674311579E308, ~0.0) = true > (~0.8988465674311579E308, ~0.0) = false == (~0.8988465674311579E308, ~0.0) = false ?= (~0.8988465674311579E308, ~0.0) = false < (~0.123E4, 0.17976931348623157E309) = true > (~0.123E4, 0.17976931348623157E309) = false == (~0.123E4, 0.17976931348623157E309) = false ?= (~0.123E4, 0.17976931348623157E309) = false < (~0.123E4, 0.8988465674311579E308) = true > (~0.123E4, 0.8988465674311579E308) = false == (~0.123E4, 0.8988465674311579E308) = false ?= (~0.123E4, 0.8988465674311579E308) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.3141592653589793E1) = true > (~0.123E4, 0.3141592653589793E1) = false == (~0.123E4, 0.3141592653589793E1) = false ?= (~0.123E4, 0.3141592653589793E1) = false < (~0.123E4, 0.2718281828459045E1) = true > (~0.123E4, 0.2718281828459045E1) = false == (~0.123E4, 0.2718281828459045E1) = false ?= (~0.123E4, 0.2718281828459045E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.22250738585072014E~307) = true > (~0.123E4, 0.22250738585072014E~307) = false == (~0.123E4, 0.22250738585072014E~307) = false ?= (~0.123E4, 0.22250738585072014E~307) = false < (~0.123E4, 0.11125369292536007E~307) = true > (~0.123E4, 0.11125369292536007E~307) = false == (~0.123E4, 0.11125369292536007E~307) = false ?= (~0.123E4, 0.11125369292536007E~307) = false < (~0.123E4, 0.5E~323) = true > (~0.123E4, 0.5E~323) = false == (~0.123E4, 0.5E~323) = false ?= (~0.123E4, 0.5E~323) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.17976931348623157E309) = false > (~0.123E4, ~0.17976931348623157E309) = true == (~0.123E4, ~0.17976931348623157E309) = false ?= (~0.123E4, ~0.17976931348623157E309) = false < (~0.123E4, ~0.8988465674311579E308) = false > (~0.123E4, ~0.8988465674311579E308) = true == (~0.123E4, ~0.8988465674311579E308) = false ?= (~0.123E4, ~0.8988465674311579E308) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.3141592653589793E1) = true > (~0.123E4, ~0.3141592653589793E1) = false == (~0.123E4, ~0.3141592653589793E1) = false ?= (~0.123E4, ~0.3141592653589793E1) = false < (~0.123E4, ~0.2718281828459045E1) = true > (~0.123E4, ~0.2718281828459045E1) = false == (~0.123E4, ~0.2718281828459045E1) = false ?= (~0.123E4, ~0.2718281828459045E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.22250738585072014E~307) = true > (~0.123E4, ~0.22250738585072014E~307) = false == (~0.123E4, ~0.22250738585072014E~307) = false ?= (~0.123E4, ~0.22250738585072014E~307) = false < (~0.123E4, ~0.11125369292536007E~307) = true > (~0.123E4, ~0.11125369292536007E~307) = false == (~0.123E4, ~0.11125369292536007E~307) = false ?= (~0.123E4, ~0.11125369292536007E~307) = false < (~0.123E4, ~0.5E~323) = true > (~0.123E4, ~0.5E~323) = false == (~0.123E4, ~0.5E~323) = false ?= (~0.123E4, ~0.5E~323) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.17976931348623157E309) = true > (~0.123E2, 0.17976931348623157E309) = false == (~0.123E2, 0.17976931348623157E309) = false ?= (~0.123E2, 0.17976931348623157E309) = false < (~0.123E2, 0.8988465674311579E308) = true > (~0.123E2, 0.8988465674311579E308) = false == (~0.123E2, 0.8988465674311579E308) = false ?= (~0.123E2, 0.8988465674311579E308) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.3141592653589793E1) = true > (~0.123E2, 0.3141592653589793E1) = false == (~0.123E2, 0.3141592653589793E1) = false ?= (~0.123E2, 0.3141592653589793E1) = false < (~0.123E2, 0.2718281828459045E1) = true > (~0.123E2, 0.2718281828459045E1) = false == (~0.123E2, 0.2718281828459045E1) = false ?= (~0.123E2, 0.2718281828459045E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.22250738585072014E~307) = true > (~0.123E2, 0.22250738585072014E~307) = false == (~0.123E2, 0.22250738585072014E~307) = false ?= (~0.123E2, 0.22250738585072014E~307) = false < (~0.123E2, 0.11125369292536007E~307) = true > (~0.123E2, 0.11125369292536007E~307) = false == (~0.123E2, 0.11125369292536007E~307) = false ?= (~0.123E2, 0.11125369292536007E~307) = false < (~0.123E2, 0.5E~323) = true > (~0.123E2, 0.5E~323) = false == (~0.123E2, 0.5E~323) = false ?= (~0.123E2, 0.5E~323) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.17976931348623157E309) = false > (~0.123E2, ~0.17976931348623157E309) = true == (~0.123E2, ~0.17976931348623157E309) = false ?= (~0.123E2, ~0.17976931348623157E309) = false < (~0.123E2, ~0.8988465674311579E308) = false > (~0.123E2, ~0.8988465674311579E308) = true == (~0.123E2, ~0.8988465674311579E308) = false ?= (~0.123E2, ~0.8988465674311579E308) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.3141592653589793E1) = true > (~0.123E2, ~0.3141592653589793E1) = false == (~0.123E2, ~0.3141592653589793E1) = false ?= (~0.123E2, ~0.3141592653589793E1) = false < (~0.123E2, ~0.2718281828459045E1) = true > (~0.123E2, ~0.2718281828459045E1) = false == (~0.123E2, ~0.2718281828459045E1) = false ?= (~0.123E2, ~0.2718281828459045E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.22250738585072014E~307) = true > (~0.123E2, ~0.22250738585072014E~307) = false == (~0.123E2, ~0.22250738585072014E~307) = false ?= (~0.123E2, ~0.22250738585072014E~307) = false < (~0.123E2, ~0.11125369292536007E~307) = true > (~0.123E2, ~0.11125369292536007E~307) = false == (~0.123E2, ~0.11125369292536007E~307) = false ?= (~0.123E2, ~0.11125369292536007E~307) = false < (~0.123E2, ~0.5E~323) = true > (~0.123E2, ~0.5E~323) = false == (~0.123E2, ~0.5E~323) = false ?= (~0.123E2, ~0.5E~323) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.3141592653589793E1, 0.17976931348623157E309) = true > (~0.3141592653589793E1, 0.17976931348623157E309) = false == (~0.3141592653589793E1, 0.17976931348623157E309) = false ?= (~0.3141592653589793E1, 0.17976931348623157E309) = false < (~0.3141592653589793E1, 0.8988465674311579E308) = true > (~0.3141592653589793E1, 0.8988465674311579E308) = false == (~0.3141592653589793E1, 0.8988465674311579E308) = false ?= (~0.3141592653589793E1, 0.8988465674311579E308) = false < (~0.3141592653589793E1, 0.123E4) = true > (~0.3141592653589793E1, 0.123E4) = false == (~0.3141592653589793E1, 0.123E4) = false ?= (~0.3141592653589793E1, 0.123E4) = false < (~0.3141592653589793E1, 0.123E2) = true > (~0.3141592653589793E1, 0.123E2) = false == (~0.3141592653589793E1, 0.123E2) = false ?= (~0.3141592653589793E1, 0.123E2) = false < (~0.3141592653589793E1, 0.3141592653589793E1) = true > (~0.3141592653589793E1, 0.3141592653589793E1) = false == (~0.3141592653589793E1, 0.3141592653589793E1) = false ?= (~0.3141592653589793E1, 0.3141592653589793E1) = false < (~0.3141592653589793E1, 0.2718281828459045E1) = true > (~0.3141592653589793E1, 0.2718281828459045E1) = false == (~0.3141592653589793E1, 0.2718281828459045E1) = false ?= (~0.3141592653589793E1, 0.2718281828459045E1) = false < (~0.3141592653589793E1, 0.123E1) = true > (~0.3141592653589793E1, 0.123E1) = false == (~0.3141592653589793E1, 0.123E1) = false ?= (~0.3141592653589793E1, 0.123E1) = false < (~0.3141592653589793E1, 0.123) = true > (~0.3141592653589793E1, 0.123) = false == (~0.3141592653589793E1, 0.123) = false ?= (~0.3141592653589793E1, 0.123) = false < (~0.3141592653589793E1, 0.123E~2) = true > (~0.3141592653589793E1, 0.123E~2) = false == (~0.3141592653589793E1, 0.123E~2) = false ?= (~0.3141592653589793E1, 0.123E~2) = false < (~0.3141592653589793E1, 0.22250738585072014E~307) = true > (~0.3141592653589793E1, 0.22250738585072014E~307) = false == (~0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, 0.22250738585072014E~307) = false < (~0.3141592653589793E1, 0.11125369292536007E~307) = true > (~0.3141592653589793E1, 0.11125369292536007E~307) = false == (~0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, 0.11125369292536007E~307) = false < (~0.3141592653589793E1, 0.5E~323) = true > (~0.3141592653589793E1, 0.5E~323) = false == (~0.3141592653589793E1, 0.5E~323) = false ?= (~0.3141592653589793E1, 0.5E~323) = false < (~0.3141592653589793E1, 0.0) = true > (~0.3141592653589793E1, 0.0) = false == (~0.3141592653589793E1, 0.0) = false ?= (~0.3141592653589793E1, 0.0) = false < (~0.3141592653589793E1, ~0.17976931348623157E309) = false > (~0.3141592653589793E1, ~0.17976931348623157E309) = true == (~0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (~0.3141592653589793E1, ~0.17976931348623157E309) = false < (~0.3141592653589793E1, ~0.8988465674311579E308) = false > (~0.3141592653589793E1, ~0.8988465674311579E308) = true == (~0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (~0.3141592653589793E1, ~0.8988465674311579E308) = false < (~0.3141592653589793E1, ~0.123E4) = false > (~0.3141592653589793E1, ~0.123E4) = true == (~0.3141592653589793E1, ~0.123E4) = false ?= (~0.3141592653589793E1, ~0.123E4) = false < (~0.3141592653589793E1, ~0.123E2) = false > (~0.3141592653589793E1, ~0.123E2) = true == (~0.3141592653589793E1, ~0.123E2) = false ?= (~0.3141592653589793E1, ~0.123E2) = false < (~0.3141592653589793E1, ~0.3141592653589793E1) = false > (~0.3141592653589793E1, ~0.3141592653589793E1) = false == (~0.3141592653589793E1, ~0.3141592653589793E1) = true ?= (~0.3141592653589793E1, ~0.3141592653589793E1) = true < (~0.3141592653589793E1, ~0.2718281828459045E1) = true > (~0.3141592653589793E1, ~0.2718281828459045E1) = false == (~0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (~0.3141592653589793E1, ~0.2718281828459045E1) = false < (~0.3141592653589793E1, ~0.123E1) = true > (~0.3141592653589793E1, ~0.123E1) = false == (~0.3141592653589793E1, ~0.123E1) = false ?= (~0.3141592653589793E1, ~0.123E1) = false < (~0.3141592653589793E1, ~0.123) = true > (~0.3141592653589793E1, ~0.123) = false == (~0.3141592653589793E1, ~0.123) = false ?= (~0.3141592653589793E1, ~0.123) = false < (~0.3141592653589793E1, ~0.123E~2) = true > (~0.3141592653589793E1, ~0.123E~2) = false == (~0.3141592653589793E1, ~0.123E~2) = false ?= (~0.3141592653589793E1, ~0.123E~2) = false < (~0.3141592653589793E1, ~0.22250738585072014E~307) = true > (~0.3141592653589793E1, ~0.22250738585072014E~307) = false == (~0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, ~0.22250738585072014E~307) = false < (~0.3141592653589793E1, ~0.11125369292536007E~307) = true > (~0.3141592653589793E1, ~0.11125369292536007E~307) = false == (~0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, ~0.11125369292536007E~307) = false < (~0.3141592653589793E1, ~0.5E~323) = true > (~0.3141592653589793E1, ~0.5E~323) = false == (~0.3141592653589793E1, ~0.5E~323) = false ?= (~0.3141592653589793E1, ~0.5E~323) = false < (~0.3141592653589793E1, ~0.0) = true > (~0.3141592653589793E1, ~0.0) = false == (~0.3141592653589793E1, ~0.0) = false ?= (~0.3141592653589793E1, ~0.0) = false < (~0.2718281828459045E1, 0.17976931348623157E309) = true > (~0.2718281828459045E1, 0.17976931348623157E309) = false == (~0.2718281828459045E1, 0.17976931348623157E309) = false ?= (~0.2718281828459045E1, 0.17976931348623157E309) = false < (~0.2718281828459045E1, 0.8988465674311579E308) = true > (~0.2718281828459045E1, 0.8988465674311579E308) = false == (~0.2718281828459045E1, 0.8988465674311579E308) = false ?= (~0.2718281828459045E1, 0.8988465674311579E308) = false < (~0.2718281828459045E1, 0.123E4) = true > (~0.2718281828459045E1, 0.123E4) = false == (~0.2718281828459045E1, 0.123E4) = false ?= (~0.2718281828459045E1, 0.123E4) = false < (~0.2718281828459045E1, 0.123E2) = true > (~0.2718281828459045E1, 0.123E2) = false == (~0.2718281828459045E1, 0.123E2) = false ?= (~0.2718281828459045E1, 0.123E2) = false < (~0.2718281828459045E1, 0.3141592653589793E1) = true > (~0.2718281828459045E1, 0.3141592653589793E1) = false == (~0.2718281828459045E1, 0.3141592653589793E1) = false ?= (~0.2718281828459045E1, 0.3141592653589793E1) = false < (~0.2718281828459045E1, 0.2718281828459045E1) = true > (~0.2718281828459045E1, 0.2718281828459045E1) = false == (~0.2718281828459045E1, 0.2718281828459045E1) = false ?= (~0.2718281828459045E1, 0.2718281828459045E1) = false < (~0.2718281828459045E1, 0.123E1) = true > (~0.2718281828459045E1, 0.123E1) = false == (~0.2718281828459045E1, 0.123E1) = false ?= (~0.2718281828459045E1, 0.123E1) = false < (~0.2718281828459045E1, 0.123) = true > (~0.2718281828459045E1, 0.123) = false == (~0.2718281828459045E1, 0.123) = false ?= (~0.2718281828459045E1, 0.123) = false < (~0.2718281828459045E1, 0.123E~2) = true > (~0.2718281828459045E1, 0.123E~2) = false == (~0.2718281828459045E1, 0.123E~2) = false ?= (~0.2718281828459045E1, 0.123E~2) = false < (~0.2718281828459045E1, 0.22250738585072014E~307) = true > (~0.2718281828459045E1, 0.22250738585072014E~307) = false == (~0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, 0.22250738585072014E~307) = false < (~0.2718281828459045E1, 0.11125369292536007E~307) = true > (~0.2718281828459045E1, 0.11125369292536007E~307) = false == (~0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, 0.11125369292536007E~307) = false < (~0.2718281828459045E1, 0.5E~323) = true > (~0.2718281828459045E1, 0.5E~323) = false == (~0.2718281828459045E1, 0.5E~323) = false ?= (~0.2718281828459045E1, 0.5E~323) = false < (~0.2718281828459045E1, 0.0) = true > (~0.2718281828459045E1, 0.0) = false == (~0.2718281828459045E1, 0.0) = false ?= (~0.2718281828459045E1, 0.0) = false < (~0.2718281828459045E1, ~0.17976931348623157E309) = false > (~0.2718281828459045E1, ~0.17976931348623157E309) = true == (~0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (~0.2718281828459045E1, ~0.17976931348623157E309) = false < (~0.2718281828459045E1, ~0.8988465674311579E308) = false > (~0.2718281828459045E1, ~0.8988465674311579E308) = true == (~0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (~0.2718281828459045E1, ~0.8988465674311579E308) = false < (~0.2718281828459045E1, ~0.123E4) = false > (~0.2718281828459045E1, ~0.123E4) = true == (~0.2718281828459045E1, ~0.123E4) = false ?= (~0.2718281828459045E1, ~0.123E4) = false < (~0.2718281828459045E1, ~0.123E2) = false > (~0.2718281828459045E1, ~0.123E2) = true == (~0.2718281828459045E1, ~0.123E2) = false ?= (~0.2718281828459045E1, ~0.123E2) = false < (~0.2718281828459045E1, ~0.3141592653589793E1) = false > (~0.2718281828459045E1, ~0.3141592653589793E1) = true == (~0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (~0.2718281828459045E1, ~0.3141592653589793E1) = false < (~0.2718281828459045E1, ~0.2718281828459045E1) = false > (~0.2718281828459045E1, ~0.2718281828459045E1) = false == (~0.2718281828459045E1, ~0.2718281828459045E1) = true ?= (~0.2718281828459045E1, ~0.2718281828459045E1) = true < (~0.2718281828459045E1, ~0.123E1) = true > (~0.2718281828459045E1, ~0.123E1) = false == (~0.2718281828459045E1, ~0.123E1) = false ?= (~0.2718281828459045E1, ~0.123E1) = false < (~0.2718281828459045E1, ~0.123) = true > (~0.2718281828459045E1, ~0.123) = false == (~0.2718281828459045E1, ~0.123) = false ?= (~0.2718281828459045E1, ~0.123) = false < (~0.2718281828459045E1, ~0.123E~2) = true > (~0.2718281828459045E1, ~0.123E~2) = false == (~0.2718281828459045E1, ~0.123E~2) = false ?= (~0.2718281828459045E1, ~0.123E~2) = false < (~0.2718281828459045E1, ~0.22250738585072014E~307) = true > (~0.2718281828459045E1, ~0.22250738585072014E~307) = false == (~0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, ~0.22250738585072014E~307) = false < (~0.2718281828459045E1, ~0.11125369292536007E~307) = true > (~0.2718281828459045E1, ~0.11125369292536007E~307) = false == (~0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, ~0.11125369292536007E~307) = false < (~0.2718281828459045E1, ~0.5E~323) = true > (~0.2718281828459045E1, ~0.5E~323) = false == (~0.2718281828459045E1, ~0.5E~323) = false ?= (~0.2718281828459045E1, ~0.5E~323) = false < (~0.2718281828459045E1, ~0.0) = true > (~0.2718281828459045E1, ~0.0) = false == (~0.2718281828459045E1, ~0.0) = false ?= (~0.2718281828459045E1, ~0.0) = false < (~0.123E1, 0.17976931348623157E309) = true > (~0.123E1, 0.17976931348623157E309) = false == (~0.123E1, 0.17976931348623157E309) = false ?= (~0.123E1, 0.17976931348623157E309) = false < (~0.123E1, 0.8988465674311579E308) = true > (~0.123E1, 0.8988465674311579E308) = false == (~0.123E1, 0.8988465674311579E308) = false ?= (~0.123E1, 0.8988465674311579E308) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.3141592653589793E1) = true > (~0.123E1, 0.3141592653589793E1) = false == (~0.123E1, 0.3141592653589793E1) = false ?= (~0.123E1, 0.3141592653589793E1) = false < (~0.123E1, 0.2718281828459045E1) = true > (~0.123E1, 0.2718281828459045E1) = false == (~0.123E1, 0.2718281828459045E1) = false ?= (~0.123E1, 0.2718281828459045E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.22250738585072014E~307) = true > (~0.123E1, 0.22250738585072014E~307) = false == (~0.123E1, 0.22250738585072014E~307) = false ?= (~0.123E1, 0.22250738585072014E~307) = false < (~0.123E1, 0.11125369292536007E~307) = true > (~0.123E1, 0.11125369292536007E~307) = false == (~0.123E1, 0.11125369292536007E~307) = false ?= (~0.123E1, 0.11125369292536007E~307) = false < (~0.123E1, 0.5E~323) = true > (~0.123E1, 0.5E~323) = false == (~0.123E1, 0.5E~323) = false ?= (~0.123E1, 0.5E~323) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.17976931348623157E309) = false > (~0.123E1, ~0.17976931348623157E309) = true == (~0.123E1, ~0.17976931348623157E309) = false ?= (~0.123E1, ~0.17976931348623157E309) = false < (~0.123E1, ~0.8988465674311579E308) = false > (~0.123E1, ~0.8988465674311579E308) = true == (~0.123E1, ~0.8988465674311579E308) = false ?= (~0.123E1, ~0.8988465674311579E308) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.3141592653589793E1) = false > (~0.123E1, ~0.3141592653589793E1) = true == (~0.123E1, ~0.3141592653589793E1) = false ?= (~0.123E1, ~0.3141592653589793E1) = false < (~0.123E1, ~0.2718281828459045E1) = false > (~0.123E1, ~0.2718281828459045E1) = true == (~0.123E1, ~0.2718281828459045E1) = false ?= (~0.123E1, ~0.2718281828459045E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.22250738585072014E~307) = true > (~0.123E1, ~0.22250738585072014E~307) = false == (~0.123E1, ~0.22250738585072014E~307) = false ?= (~0.123E1, ~0.22250738585072014E~307) = false < (~0.123E1, ~0.11125369292536007E~307) = true > (~0.123E1, ~0.11125369292536007E~307) = false == (~0.123E1, ~0.11125369292536007E~307) = false ?= (~0.123E1, ~0.11125369292536007E~307) = false < (~0.123E1, ~0.5E~323) = true > (~0.123E1, ~0.5E~323) = false == (~0.123E1, ~0.5E~323) = false ?= (~0.123E1, ~0.5E~323) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.17976931348623157E309) = true > (~0.123, 0.17976931348623157E309) = false == (~0.123, 0.17976931348623157E309) = false ?= (~0.123, 0.17976931348623157E309) = false < (~0.123, 0.8988465674311579E308) = true > (~0.123, 0.8988465674311579E308) = false == (~0.123, 0.8988465674311579E308) = false ?= (~0.123, 0.8988465674311579E308) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.3141592653589793E1) = true > (~0.123, 0.3141592653589793E1) = false == (~0.123, 0.3141592653589793E1) = false ?= (~0.123, 0.3141592653589793E1) = false < (~0.123, 0.2718281828459045E1) = true > (~0.123, 0.2718281828459045E1) = false == (~0.123, 0.2718281828459045E1) = false ?= (~0.123, 0.2718281828459045E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.22250738585072014E~307) = true > (~0.123, 0.22250738585072014E~307) = false == (~0.123, 0.22250738585072014E~307) = false ?= (~0.123, 0.22250738585072014E~307) = false < (~0.123, 0.11125369292536007E~307) = true > (~0.123, 0.11125369292536007E~307) = false == (~0.123, 0.11125369292536007E~307) = false ?= (~0.123, 0.11125369292536007E~307) = false < (~0.123, 0.5E~323) = true > (~0.123, 0.5E~323) = false == (~0.123, 0.5E~323) = false ?= (~0.123, 0.5E~323) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.17976931348623157E309) = false > (~0.123, ~0.17976931348623157E309) = true == (~0.123, ~0.17976931348623157E309) = false ?= (~0.123, ~0.17976931348623157E309) = false < (~0.123, ~0.8988465674311579E308) = false > (~0.123, ~0.8988465674311579E308) = true == (~0.123, ~0.8988465674311579E308) = false ?= (~0.123, ~0.8988465674311579E308) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.3141592653589793E1) = false > (~0.123, ~0.3141592653589793E1) = true == (~0.123, ~0.3141592653589793E1) = false ?= (~0.123, ~0.3141592653589793E1) = false < (~0.123, ~0.2718281828459045E1) = false > (~0.123, ~0.2718281828459045E1) = true == (~0.123, ~0.2718281828459045E1) = false ?= (~0.123, ~0.2718281828459045E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.22250738585072014E~307) = true > (~0.123, ~0.22250738585072014E~307) = false == (~0.123, ~0.22250738585072014E~307) = false ?= (~0.123, ~0.22250738585072014E~307) = false < (~0.123, ~0.11125369292536007E~307) = true > (~0.123, ~0.11125369292536007E~307) = false == (~0.123, ~0.11125369292536007E~307) = false ?= (~0.123, ~0.11125369292536007E~307) = false < (~0.123, ~0.5E~323) = true > (~0.123, ~0.5E~323) = false == (~0.123, ~0.5E~323) = false ?= (~0.123, ~0.5E~323) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.17976931348623157E309) = true > (~0.123E~2, 0.17976931348623157E309) = false == (~0.123E~2, 0.17976931348623157E309) = false ?= (~0.123E~2, 0.17976931348623157E309) = false < (~0.123E~2, 0.8988465674311579E308) = true > (~0.123E~2, 0.8988465674311579E308) = false == (~0.123E~2, 0.8988465674311579E308) = false ?= (~0.123E~2, 0.8988465674311579E308) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.3141592653589793E1) = true > (~0.123E~2, 0.3141592653589793E1) = false == (~0.123E~2, 0.3141592653589793E1) = false ?= (~0.123E~2, 0.3141592653589793E1) = false < (~0.123E~2, 0.2718281828459045E1) = true > (~0.123E~2, 0.2718281828459045E1) = false == (~0.123E~2, 0.2718281828459045E1) = false ?= (~0.123E~2, 0.2718281828459045E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.22250738585072014E~307) = true > (~0.123E~2, 0.22250738585072014E~307) = false == (~0.123E~2, 0.22250738585072014E~307) = false ?= (~0.123E~2, 0.22250738585072014E~307) = false < (~0.123E~2, 0.11125369292536007E~307) = true > (~0.123E~2, 0.11125369292536007E~307) = false == (~0.123E~2, 0.11125369292536007E~307) = false ?= (~0.123E~2, 0.11125369292536007E~307) = false < (~0.123E~2, 0.5E~323) = true > (~0.123E~2, 0.5E~323) = false == (~0.123E~2, 0.5E~323) = false ?= (~0.123E~2, 0.5E~323) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.17976931348623157E309) = false > (~0.123E~2, ~0.17976931348623157E309) = true == (~0.123E~2, ~0.17976931348623157E309) = false ?= (~0.123E~2, ~0.17976931348623157E309) = false < (~0.123E~2, ~0.8988465674311579E308) = false > (~0.123E~2, ~0.8988465674311579E308) = true == (~0.123E~2, ~0.8988465674311579E308) = false ?= (~0.123E~2, ~0.8988465674311579E308) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.3141592653589793E1) = false > (~0.123E~2, ~0.3141592653589793E1) = true == (~0.123E~2, ~0.3141592653589793E1) = false ?= (~0.123E~2, ~0.3141592653589793E1) = false < (~0.123E~2, ~0.2718281828459045E1) = false > (~0.123E~2, ~0.2718281828459045E1) = true == (~0.123E~2, ~0.2718281828459045E1) = false ?= (~0.123E~2, ~0.2718281828459045E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.22250738585072014E~307) = true > (~0.123E~2, ~0.22250738585072014E~307) = false == (~0.123E~2, ~0.22250738585072014E~307) = false ?= (~0.123E~2, ~0.22250738585072014E~307) = false < (~0.123E~2, ~0.11125369292536007E~307) = true > (~0.123E~2, ~0.11125369292536007E~307) = false == (~0.123E~2, ~0.11125369292536007E~307) = false ?= (~0.123E~2, ~0.11125369292536007E~307) = false < (~0.123E~2, ~0.5E~323) = true > (~0.123E~2, ~0.5E~323) = false == (~0.123E~2, ~0.5E~323) = false ?= (~0.123E~2, ~0.5E~323) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.22250738585072014E~307, 0.17976931348623157E309) = true > (~0.22250738585072014E~307, 0.17976931348623157E309) = false == (~0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, 0.17976931348623157E309) = false < (~0.22250738585072014E~307, 0.8988465674311579E308) = true > (~0.22250738585072014E~307, 0.8988465674311579E308) = false == (~0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, 0.8988465674311579E308) = false < (~0.22250738585072014E~307, 0.123E4) = true > (~0.22250738585072014E~307, 0.123E4) = false == (~0.22250738585072014E~307, 0.123E4) = false ?= (~0.22250738585072014E~307, 0.123E4) = false < (~0.22250738585072014E~307, 0.123E2) = true > (~0.22250738585072014E~307, 0.123E2) = false == (~0.22250738585072014E~307, 0.123E2) = false ?= (~0.22250738585072014E~307, 0.123E2) = false < (~0.22250738585072014E~307, 0.3141592653589793E1) = true > (~0.22250738585072014E~307, 0.3141592653589793E1) = false == (~0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, 0.3141592653589793E1) = false < (~0.22250738585072014E~307, 0.2718281828459045E1) = true > (~0.22250738585072014E~307, 0.2718281828459045E1) = false == (~0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, 0.2718281828459045E1) = false < (~0.22250738585072014E~307, 0.123E1) = true > (~0.22250738585072014E~307, 0.123E1) = false == (~0.22250738585072014E~307, 0.123E1) = false ?= (~0.22250738585072014E~307, 0.123E1) = false < (~0.22250738585072014E~307, 0.123) = true > (~0.22250738585072014E~307, 0.123) = false == (~0.22250738585072014E~307, 0.123) = false ?= (~0.22250738585072014E~307, 0.123) = false < (~0.22250738585072014E~307, 0.123E~2) = true > (~0.22250738585072014E~307, 0.123E~2) = false == (~0.22250738585072014E~307, 0.123E~2) = false ?= (~0.22250738585072014E~307, 0.123E~2) = false < (~0.22250738585072014E~307, 0.22250738585072014E~307) = true > (~0.22250738585072014E~307, 0.22250738585072014E~307) = false == (~0.22250738585072014E~307, 0.22250738585072014E~307) = false ?= (~0.22250738585072014E~307, 0.22250738585072014E~307) = false < (~0.22250738585072014E~307, 0.11125369292536007E~307) = true > (~0.22250738585072014E~307, 0.11125369292536007E~307) = false == (~0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, 0.11125369292536007E~307) = false < (~0.22250738585072014E~307, 0.5E~323) = true > (~0.22250738585072014E~307, 0.5E~323) = false == (~0.22250738585072014E~307, 0.5E~323) = false ?= (~0.22250738585072014E~307, 0.5E~323) = false < (~0.22250738585072014E~307, 0.0) = true > (~0.22250738585072014E~307, 0.0) = false == (~0.22250738585072014E~307, 0.0) = false ?= (~0.22250738585072014E~307, 0.0) = false < (~0.22250738585072014E~307, ~0.17976931348623157E309) = false > (~0.22250738585072014E~307, ~0.17976931348623157E309) = true == (~0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, ~0.17976931348623157E309) = false < (~0.22250738585072014E~307, ~0.8988465674311579E308) = false > (~0.22250738585072014E~307, ~0.8988465674311579E308) = true == (~0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, ~0.8988465674311579E308) = false < (~0.22250738585072014E~307, ~0.123E4) = false > (~0.22250738585072014E~307, ~0.123E4) = true == (~0.22250738585072014E~307, ~0.123E4) = false ?= (~0.22250738585072014E~307, ~0.123E4) = false < (~0.22250738585072014E~307, ~0.123E2) = false > (~0.22250738585072014E~307, ~0.123E2) = true == (~0.22250738585072014E~307, ~0.123E2) = false ?= (~0.22250738585072014E~307, ~0.123E2) = false < (~0.22250738585072014E~307, ~0.3141592653589793E1) = false > (~0.22250738585072014E~307, ~0.3141592653589793E1) = true == (~0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, ~0.3141592653589793E1) = false < (~0.22250738585072014E~307, ~0.2718281828459045E1) = false > (~0.22250738585072014E~307, ~0.2718281828459045E1) = true == (~0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, ~0.2718281828459045E1) = false < (~0.22250738585072014E~307, ~0.123E1) = false > (~0.22250738585072014E~307, ~0.123E1) = true == (~0.22250738585072014E~307, ~0.123E1) = false ?= (~0.22250738585072014E~307, ~0.123E1) = false < (~0.22250738585072014E~307, ~0.123) = false > (~0.22250738585072014E~307, ~0.123) = true == (~0.22250738585072014E~307, ~0.123) = false ?= (~0.22250738585072014E~307, ~0.123) = false < (~0.22250738585072014E~307, ~0.123E~2) = false > (~0.22250738585072014E~307, ~0.123E~2) = true == (~0.22250738585072014E~307, ~0.123E~2) = false ?= (~0.22250738585072014E~307, ~0.123E~2) = false < (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false == (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true ?= (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true < (~0.22250738585072014E~307, ~0.11125369292536007E~307) = true > (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false == (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (~0.22250738585072014E~307, ~0.5E~323) = true > (~0.22250738585072014E~307, ~0.5E~323) = false == (~0.22250738585072014E~307, ~0.5E~323) = false ?= (~0.22250738585072014E~307, ~0.5E~323) = false < (~0.22250738585072014E~307, ~0.0) = true > (~0.22250738585072014E~307, ~0.0) = false == (~0.22250738585072014E~307, ~0.0) = false ?= (~0.22250738585072014E~307, ~0.0) = false < (~0.11125369292536007E~307, 0.17976931348623157E309) = true > (~0.11125369292536007E~307, 0.17976931348623157E309) = false == (~0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, 0.17976931348623157E309) = false < (~0.11125369292536007E~307, 0.8988465674311579E308) = true > (~0.11125369292536007E~307, 0.8988465674311579E308) = false == (~0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, 0.8988465674311579E308) = false < (~0.11125369292536007E~307, 0.123E4) = true > (~0.11125369292536007E~307, 0.123E4) = false == (~0.11125369292536007E~307, 0.123E4) = false ?= (~0.11125369292536007E~307, 0.123E4) = false < (~0.11125369292536007E~307, 0.123E2) = true > (~0.11125369292536007E~307, 0.123E2) = false == (~0.11125369292536007E~307, 0.123E2) = false ?= (~0.11125369292536007E~307, 0.123E2) = false < (~0.11125369292536007E~307, 0.3141592653589793E1) = true > (~0.11125369292536007E~307, 0.3141592653589793E1) = false == (~0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, 0.3141592653589793E1) = false < (~0.11125369292536007E~307, 0.2718281828459045E1) = true > (~0.11125369292536007E~307, 0.2718281828459045E1) = false == (~0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, 0.2718281828459045E1) = false < (~0.11125369292536007E~307, 0.123E1) = true > (~0.11125369292536007E~307, 0.123E1) = false == (~0.11125369292536007E~307, 0.123E1) = false ?= (~0.11125369292536007E~307, 0.123E1) = false < (~0.11125369292536007E~307, 0.123) = true > (~0.11125369292536007E~307, 0.123) = false == (~0.11125369292536007E~307, 0.123) = false ?= (~0.11125369292536007E~307, 0.123) = false < (~0.11125369292536007E~307, 0.123E~2) = true > (~0.11125369292536007E~307, 0.123E~2) = false == (~0.11125369292536007E~307, 0.123E~2) = false ?= (~0.11125369292536007E~307, 0.123E~2) = false < (~0.11125369292536007E~307, 0.22250738585072014E~307) = true > (~0.11125369292536007E~307, 0.22250738585072014E~307) = false == (~0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, 0.22250738585072014E~307) = false < (~0.11125369292536007E~307, 0.11125369292536007E~307) = true > (~0.11125369292536007E~307, 0.11125369292536007E~307) = false == (~0.11125369292536007E~307, 0.11125369292536007E~307) = false ?= (~0.11125369292536007E~307, 0.11125369292536007E~307) = false < (~0.11125369292536007E~307, 0.5E~323) = true > (~0.11125369292536007E~307, 0.5E~323) = false == (~0.11125369292536007E~307, 0.5E~323) = false ?= (~0.11125369292536007E~307, 0.5E~323) = false < (~0.11125369292536007E~307, 0.0) = true > (~0.11125369292536007E~307, 0.0) = false == (~0.11125369292536007E~307, 0.0) = false ?= (~0.11125369292536007E~307, 0.0) = false < (~0.11125369292536007E~307, ~0.17976931348623157E309) = false > (~0.11125369292536007E~307, ~0.17976931348623157E309) = true == (~0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, ~0.17976931348623157E309) = false < (~0.11125369292536007E~307, ~0.8988465674311579E308) = false > (~0.11125369292536007E~307, ~0.8988465674311579E308) = true == (~0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, ~0.8988465674311579E308) = false < (~0.11125369292536007E~307, ~0.123E4) = false > (~0.11125369292536007E~307, ~0.123E4) = true == (~0.11125369292536007E~307, ~0.123E4) = false ?= (~0.11125369292536007E~307, ~0.123E4) = false < (~0.11125369292536007E~307, ~0.123E2) = false > (~0.11125369292536007E~307, ~0.123E2) = true == (~0.11125369292536007E~307, ~0.123E2) = false ?= (~0.11125369292536007E~307, ~0.123E2) = false < (~0.11125369292536007E~307, ~0.3141592653589793E1) = false > (~0.11125369292536007E~307, ~0.3141592653589793E1) = true == (~0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, ~0.3141592653589793E1) = false < (~0.11125369292536007E~307, ~0.2718281828459045E1) = false > (~0.11125369292536007E~307, ~0.2718281828459045E1) = true == (~0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, ~0.2718281828459045E1) = false < (~0.11125369292536007E~307, ~0.123E1) = false > (~0.11125369292536007E~307, ~0.123E1) = true == (~0.11125369292536007E~307, ~0.123E1) = false ?= (~0.11125369292536007E~307, ~0.123E1) = false < (~0.11125369292536007E~307, ~0.123) = false > (~0.11125369292536007E~307, ~0.123) = true == (~0.11125369292536007E~307, ~0.123) = false ?= (~0.11125369292536007E~307, ~0.123) = false < (~0.11125369292536007E~307, ~0.123E~2) = false > (~0.11125369292536007E~307, ~0.123E~2) = true == (~0.11125369292536007E~307, ~0.123E~2) = false ?= (~0.11125369292536007E~307, ~0.123E~2) = false < (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (~0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false == (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true ?= (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true < (~0.11125369292536007E~307, ~0.5E~323) = true > (~0.11125369292536007E~307, ~0.5E~323) = false == (~0.11125369292536007E~307, ~0.5E~323) = false ?= (~0.11125369292536007E~307, ~0.5E~323) = false < (~0.11125369292536007E~307, ~0.0) = true > (~0.11125369292536007E~307, ~0.0) = false == (~0.11125369292536007E~307, ~0.0) = false ?= (~0.11125369292536007E~307, ~0.0) = false < (~0.5E~323, 0.17976931348623157E309) = true > (~0.5E~323, 0.17976931348623157E309) = false == (~0.5E~323, 0.17976931348623157E309) = false ?= (~0.5E~323, 0.17976931348623157E309) = false < (~0.5E~323, 0.8988465674311579E308) = true > (~0.5E~323, 0.8988465674311579E308) = false == (~0.5E~323, 0.8988465674311579E308) = false ?= (~0.5E~323, 0.8988465674311579E308) = false < (~0.5E~323, 0.123E4) = true > (~0.5E~323, 0.123E4) = false == (~0.5E~323, 0.123E4) = false ?= (~0.5E~323, 0.123E4) = false < (~0.5E~323, 0.123E2) = true > (~0.5E~323, 0.123E2) = false == (~0.5E~323, 0.123E2) = false ?= (~0.5E~323, 0.123E2) = false < (~0.5E~323, 0.3141592653589793E1) = true > (~0.5E~323, 0.3141592653589793E1) = false == (~0.5E~323, 0.3141592653589793E1) = false ?= (~0.5E~323, 0.3141592653589793E1) = false < (~0.5E~323, 0.2718281828459045E1) = true > (~0.5E~323, 0.2718281828459045E1) = false == (~0.5E~323, 0.2718281828459045E1) = false ?= (~0.5E~323, 0.2718281828459045E1) = false < (~0.5E~323, 0.123E1) = true > (~0.5E~323, 0.123E1) = false == (~0.5E~323, 0.123E1) = false ?= (~0.5E~323, 0.123E1) = false < (~0.5E~323, 0.123) = true > (~0.5E~323, 0.123) = false == (~0.5E~323, 0.123) = false ?= (~0.5E~323, 0.123) = false < (~0.5E~323, 0.123E~2) = true > (~0.5E~323, 0.123E~2) = false == (~0.5E~323, 0.123E~2) = false ?= (~0.5E~323, 0.123E~2) = false < (~0.5E~323, 0.22250738585072014E~307) = true > (~0.5E~323, 0.22250738585072014E~307) = false == (~0.5E~323, 0.22250738585072014E~307) = false ?= (~0.5E~323, 0.22250738585072014E~307) = false < (~0.5E~323, 0.11125369292536007E~307) = true > (~0.5E~323, 0.11125369292536007E~307) = false == (~0.5E~323, 0.11125369292536007E~307) = false ?= (~0.5E~323, 0.11125369292536007E~307) = false < (~0.5E~323, 0.5E~323) = true > (~0.5E~323, 0.5E~323) = false == (~0.5E~323, 0.5E~323) = false ?= (~0.5E~323, 0.5E~323) = false < (~0.5E~323, 0.0) = true > (~0.5E~323, 0.0) = false == (~0.5E~323, 0.0) = false ?= (~0.5E~323, 0.0) = false < (~0.5E~323, ~0.17976931348623157E309) = false > (~0.5E~323, ~0.17976931348623157E309) = true == (~0.5E~323, ~0.17976931348623157E309) = false ?= (~0.5E~323, ~0.17976931348623157E309) = false < (~0.5E~323, ~0.8988465674311579E308) = false > (~0.5E~323, ~0.8988465674311579E308) = true == (~0.5E~323, ~0.8988465674311579E308) = false ?= (~0.5E~323, ~0.8988465674311579E308) = false < (~0.5E~323, ~0.123E4) = false > (~0.5E~323, ~0.123E4) = true == (~0.5E~323, ~0.123E4) = false ?= (~0.5E~323, ~0.123E4) = false < (~0.5E~323, ~0.123E2) = false > (~0.5E~323, ~0.123E2) = true == (~0.5E~323, ~0.123E2) = false ?= (~0.5E~323, ~0.123E2) = false < (~0.5E~323, ~0.3141592653589793E1) = false > (~0.5E~323, ~0.3141592653589793E1) = true == (~0.5E~323, ~0.3141592653589793E1) = false ?= (~0.5E~323, ~0.3141592653589793E1) = false < (~0.5E~323, ~0.2718281828459045E1) = false > (~0.5E~323, ~0.2718281828459045E1) = true == (~0.5E~323, ~0.2718281828459045E1) = false ?= (~0.5E~323, ~0.2718281828459045E1) = false < (~0.5E~323, ~0.123E1) = false > (~0.5E~323, ~0.123E1) = true == (~0.5E~323, ~0.123E1) = false ?= (~0.5E~323, ~0.123E1) = false < (~0.5E~323, ~0.123) = false > (~0.5E~323, ~0.123) = true == (~0.5E~323, ~0.123) = false ?= (~0.5E~323, ~0.123) = false < (~0.5E~323, ~0.123E~2) = false > (~0.5E~323, ~0.123E~2) = true == (~0.5E~323, ~0.123E~2) = false ?= (~0.5E~323, ~0.123E~2) = false < (~0.5E~323, ~0.22250738585072014E~307) = false > (~0.5E~323, ~0.22250738585072014E~307) = true == (~0.5E~323, ~0.22250738585072014E~307) = false ?= (~0.5E~323, ~0.22250738585072014E~307) = false < (~0.5E~323, ~0.11125369292536007E~307) = false > (~0.5E~323, ~0.11125369292536007E~307) = true == (~0.5E~323, ~0.11125369292536007E~307) = false ?= (~0.5E~323, ~0.11125369292536007E~307) = false < (~0.5E~323, ~0.5E~323) = false > (~0.5E~323, ~0.5E~323) = false == (~0.5E~323, ~0.5E~323) = true ?= (~0.5E~323, ~0.5E~323) = true < (~0.5E~323, ~0.0) = true > (~0.5E~323, ~0.0) = false == (~0.5E~323, ~0.0) = false ?= (~0.5E~323, ~0.0) = false < (~0.0, 0.17976931348623157E309) = true > (~0.0, 0.17976931348623157E309) = false == (~0.0, 0.17976931348623157E309) = false ?= (~0.0, 0.17976931348623157E309) = false < (~0.0, 0.8988465674311579E308) = true > (~0.0, 0.8988465674311579E308) = false == (~0.0, 0.8988465674311579E308) = false ?= (~0.0, 0.8988465674311579E308) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.3141592653589793E1) = true > (~0.0, 0.3141592653589793E1) = false == (~0.0, 0.3141592653589793E1) = false ?= (~0.0, 0.3141592653589793E1) = false < (~0.0, 0.2718281828459045E1) = true > (~0.0, 0.2718281828459045E1) = false == (~0.0, 0.2718281828459045E1) = false ?= (~0.0, 0.2718281828459045E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.22250738585072014E~307) = true > (~0.0, 0.22250738585072014E~307) = false == (~0.0, 0.22250738585072014E~307) = false ?= (~0.0, 0.22250738585072014E~307) = false < (~0.0, 0.11125369292536007E~307) = true > (~0.0, 0.11125369292536007E~307) = false == (~0.0, 0.11125369292536007E~307) = false ?= (~0.0, 0.11125369292536007E~307) = false < (~0.0, 0.5E~323) = true > (~0.0, 0.5E~323) = false == (~0.0, 0.5E~323) = false ?= (~0.0, 0.5E~323) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.17976931348623157E309) = false > (~0.0, ~0.17976931348623157E309) = true == (~0.0, ~0.17976931348623157E309) = false ?= (~0.0, ~0.17976931348623157E309) = false < (~0.0, ~0.8988465674311579E308) = false > (~0.0, ~0.8988465674311579E308) = true == (~0.0, ~0.8988465674311579E308) = false ?= (~0.0, ~0.8988465674311579E308) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.3141592653589793E1) = false > (~0.0, ~0.3141592653589793E1) = true == (~0.0, ~0.3141592653589793E1) = false ?= (~0.0, ~0.3141592653589793E1) = false < (~0.0, ~0.2718281828459045E1) = false > (~0.0, ~0.2718281828459045E1) = true == (~0.0, ~0.2718281828459045E1) = false ?= (~0.0, ~0.2718281828459045E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.22250738585072014E~307) = false > (~0.0, ~0.22250738585072014E~307) = true == (~0.0, ~0.22250738585072014E~307) = false ?= (~0.0, ~0.22250738585072014E~307) = false < (~0.0, ~0.11125369292536007E~307) = false > (~0.0, ~0.11125369292536007E~307) = true == (~0.0, ~0.11125369292536007E~307) = false ?= (~0.0, ~0.11125369292536007E~307) = false < (~0.0, ~0.5E~323) = false > (~0.0, ~0.5E~323) = true == (~0.0, ~0.5E~323) = false ?= (~0.0, ~0.5E~323) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compareReal (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compare (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, 0.123E4) = GREATER compareReal (0.17976931348623157E309, 0.123E4) = GREATER compare (0.17976931348623157E309, 0.123E2) = GREATER compareReal (0.17976931348623157E309, 0.123E2) = GREATER compare (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, 0.123E1) = GREATER compareReal (0.17976931348623157E309, 0.123E1) = GREATER compare (0.17976931348623157E309, 0.123) = GREATER compareReal (0.17976931348623157E309, 0.123) = GREATER compare (0.17976931348623157E309, 0.123E~2) = GREATER compareReal (0.17976931348623157E309, 0.123E~2) = GREATER compare (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, 0.5E~323) = GREATER compareReal (0.17976931348623157E309, 0.5E~323) = GREATER compare (0.17976931348623157E309, 0.0) = GREATER compareReal (0.17976931348623157E309, 0.0) = GREATER compare (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compareReal (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compare (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, ~0.123E4) = GREATER compareReal (0.17976931348623157E309, ~0.123E4) = GREATER compare (0.17976931348623157E309, ~0.123E2) = GREATER compareReal (0.17976931348623157E309, ~0.123E2) = GREATER compare (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, ~0.123E1) = GREATER compareReal (0.17976931348623157E309, ~0.123E1) = GREATER compare (0.17976931348623157E309, ~0.123) = GREATER compareReal (0.17976931348623157E309, ~0.123) = GREATER compare (0.17976931348623157E309, ~0.123E~2) = GREATER compareReal (0.17976931348623157E309, ~0.123E~2) = GREATER compare (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, ~0.5E~323) = GREATER compareReal (0.17976931348623157E309, ~0.5E~323) = GREATER compare (0.17976931348623157E309, ~0.0) = GREATER compareReal (0.17976931348623157E309, ~0.0) = GREATER compare (0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compareReal (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compare (0.8988465674311579E308, 0.123E4) = GREATER compareReal (0.8988465674311579E308, 0.123E4) = GREATER compare (0.8988465674311579E308, 0.123E2) = GREATER compareReal (0.8988465674311579E308, 0.123E2) = GREATER compare (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, 0.123E1) = GREATER compareReal (0.8988465674311579E308, 0.123E1) = GREATER compare (0.8988465674311579E308, 0.123) = GREATER compareReal (0.8988465674311579E308, 0.123) = GREATER compare (0.8988465674311579E308, 0.123E~2) = GREATER compareReal (0.8988465674311579E308, 0.123E~2) = GREATER compare (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, 0.5E~323) = GREATER compareReal (0.8988465674311579E308, 0.5E~323) = GREATER compare (0.8988465674311579E308, 0.0) = GREATER compareReal (0.8988465674311579E308, 0.0) = GREATER compare (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compareReal (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compare (0.8988465674311579E308, ~0.123E4) = GREATER compareReal (0.8988465674311579E308, ~0.123E4) = GREATER compare (0.8988465674311579E308, ~0.123E2) = GREATER compareReal (0.8988465674311579E308, ~0.123E2) = GREATER compare (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, ~0.123E1) = GREATER compareReal (0.8988465674311579E308, ~0.123E1) = GREATER compare (0.8988465674311579E308, ~0.123) = GREATER compareReal (0.8988465674311579E308, ~0.123) = GREATER compare (0.8988465674311579E308, ~0.123E~2) = GREATER compareReal (0.8988465674311579E308, ~0.123E~2) = GREATER compare (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, ~0.5E~323) = GREATER compareReal (0.8988465674311579E308, ~0.5E~323) = GREATER compare (0.8988465674311579E308, ~0.0) = GREATER compareReal (0.8988465674311579E308, ~0.0) = GREATER compare (0.123E4, 0.17976931348623157E309) = LESS compareReal (0.123E4, 0.17976931348623157E309) = LESS compare (0.123E4, 0.8988465674311579E308) = LESS compareReal (0.123E4, 0.8988465674311579E308) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.3141592653589793E1) = GREATER compareReal (0.123E4, 0.3141592653589793E1) = GREATER compare (0.123E4, 0.2718281828459045E1) = GREATER compareReal (0.123E4, 0.2718281828459045E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.22250738585072014E~307) = GREATER compareReal (0.123E4, 0.22250738585072014E~307) = GREATER compare (0.123E4, 0.11125369292536007E~307) = GREATER compareReal (0.123E4, 0.11125369292536007E~307) = GREATER compare (0.123E4, 0.5E~323) = GREATER compareReal (0.123E4, 0.5E~323) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.17976931348623157E309) = GREATER compareReal (0.123E4, ~0.17976931348623157E309) = GREATER compare (0.123E4, ~0.8988465674311579E308) = GREATER compareReal (0.123E4, ~0.8988465674311579E308) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.3141592653589793E1) = GREATER compareReal (0.123E4, ~0.3141592653589793E1) = GREATER compare (0.123E4, ~0.2718281828459045E1) = GREATER compareReal (0.123E4, ~0.2718281828459045E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.22250738585072014E~307) = GREATER compareReal (0.123E4, ~0.22250738585072014E~307) = GREATER compare (0.123E4, ~0.11125369292536007E~307) = GREATER compareReal (0.123E4, ~0.11125369292536007E~307) = GREATER compare (0.123E4, ~0.5E~323) = GREATER compareReal (0.123E4, ~0.5E~323) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.17976931348623157E309) = LESS compareReal (0.123E2, 0.17976931348623157E309) = LESS compare (0.123E2, 0.8988465674311579E308) = LESS compareReal (0.123E2, 0.8988465674311579E308) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.3141592653589793E1) = GREATER compareReal (0.123E2, 0.3141592653589793E1) = GREATER compare (0.123E2, 0.2718281828459045E1) = GREATER compareReal (0.123E2, 0.2718281828459045E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.22250738585072014E~307) = GREATER compareReal (0.123E2, 0.22250738585072014E~307) = GREATER compare (0.123E2, 0.11125369292536007E~307) = GREATER compareReal (0.123E2, 0.11125369292536007E~307) = GREATER compare (0.123E2, 0.5E~323) = GREATER compareReal (0.123E2, 0.5E~323) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.17976931348623157E309) = GREATER compareReal (0.123E2, ~0.17976931348623157E309) = GREATER compare (0.123E2, ~0.8988465674311579E308) = GREATER compareReal (0.123E2, ~0.8988465674311579E308) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.3141592653589793E1) = GREATER compareReal (0.123E2, ~0.3141592653589793E1) = GREATER compare (0.123E2, ~0.2718281828459045E1) = GREATER compareReal (0.123E2, ~0.2718281828459045E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E2, ~0.22250738585072014E~307) = GREATER compare (0.123E2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E2, ~0.11125369292536007E~307) = GREATER compare (0.123E2, ~0.5E~323) = GREATER compareReal (0.123E2, ~0.5E~323) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (0.3141592653589793E1, 0.123E4) = LESS compareReal (0.3141592653589793E1, 0.123E4) = LESS compare (0.3141592653589793E1, 0.123E2) = LESS compareReal (0.3141592653589793E1, 0.123E2) = LESS compare (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compareReal (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compare (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, 0.123E1) = GREATER compareReal (0.3141592653589793E1, 0.123E1) = GREATER compare (0.3141592653589793E1, 0.123) = GREATER compareReal (0.3141592653589793E1, 0.123) = GREATER compare (0.3141592653589793E1, 0.123E~2) = GREATER compareReal (0.3141592653589793E1, 0.123E~2) = GREATER compare (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, 0.5E~323) = GREATER compareReal (0.3141592653589793E1, 0.5E~323) = GREATER compare (0.3141592653589793E1, 0.0) = GREATER compareReal (0.3141592653589793E1, 0.0) = GREATER compare (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (0.3141592653589793E1, ~0.123E4) = GREATER compareReal (0.3141592653589793E1, ~0.123E4) = GREATER compare (0.3141592653589793E1, ~0.123E2) = GREATER compareReal (0.3141592653589793E1, ~0.123E2) = GREATER compare (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compareReal (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compare (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, ~0.123E1) = GREATER compareReal (0.3141592653589793E1, ~0.123E1) = GREATER compare (0.3141592653589793E1, ~0.123) = GREATER compareReal (0.3141592653589793E1, ~0.123) = GREATER compare (0.3141592653589793E1, ~0.123E~2) = GREATER compareReal (0.3141592653589793E1, ~0.123E~2) = GREATER compare (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, ~0.5E~323) = GREATER compareReal (0.3141592653589793E1, ~0.5E~323) = GREATER compare (0.3141592653589793E1, ~0.0) = GREATER compareReal (0.3141592653589793E1, ~0.0) = GREATER compare (0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (0.2718281828459045E1, 0.123E4) = LESS compareReal (0.2718281828459045E1, 0.123E4) = LESS compare (0.2718281828459045E1, 0.123E2) = LESS compareReal (0.2718281828459045E1, 0.123E2) = LESS compare (0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compareReal (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compare (0.2718281828459045E1, 0.123E1) = GREATER compareReal (0.2718281828459045E1, 0.123E1) = GREATER compare (0.2718281828459045E1, 0.123) = GREATER compareReal (0.2718281828459045E1, 0.123) = GREATER compare (0.2718281828459045E1, 0.123E~2) = GREATER compareReal (0.2718281828459045E1, 0.123E~2) = GREATER compare (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, 0.5E~323) = GREATER compareReal (0.2718281828459045E1, 0.5E~323) = GREATER compare (0.2718281828459045E1, 0.0) = GREATER compareReal (0.2718281828459045E1, 0.0) = GREATER compare (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (0.2718281828459045E1, ~0.123E4) = GREATER compareReal (0.2718281828459045E1, ~0.123E4) = GREATER compare (0.2718281828459045E1, ~0.123E2) = GREATER compareReal (0.2718281828459045E1, ~0.123E2) = GREATER compare (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compareReal (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compare (0.2718281828459045E1, ~0.123E1) = GREATER compareReal (0.2718281828459045E1, ~0.123E1) = GREATER compare (0.2718281828459045E1, ~0.123) = GREATER compareReal (0.2718281828459045E1, ~0.123) = GREATER compare (0.2718281828459045E1, ~0.123E~2) = GREATER compareReal (0.2718281828459045E1, ~0.123E~2) = GREATER compare (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, ~0.5E~323) = GREATER compareReal (0.2718281828459045E1, ~0.5E~323) = GREATER compare (0.2718281828459045E1, ~0.0) = GREATER compareReal (0.2718281828459045E1, ~0.0) = GREATER compare (0.123E1, 0.17976931348623157E309) = LESS compareReal (0.123E1, 0.17976931348623157E309) = LESS compare (0.123E1, 0.8988465674311579E308) = LESS compareReal (0.123E1, 0.8988465674311579E308) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.3141592653589793E1) = LESS compareReal (0.123E1, 0.3141592653589793E1) = LESS compare (0.123E1, 0.2718281828459045E1) = LESS compareReal (0.123E1, 0.2718281828459045E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.22250738585072014E~307) = GREATER compareReal (0.123E1, 0.22250738585072014E~307) = GREATER compare (0.123E1, 0.11125369292536007E~307) = GREATER compareReal (0.123E1, 0.11125369292536007E~307) = GREATER compare (0.123E1, 0.5E~323) = GREATER compareReal (0.123E1, 0.5E~323) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.17976931348623157E309) = GREATER compareReal (0.123E1, ~0.17976931348623157E309) = GREATER compare (0.123E1, ~0.8988465674311579E308) = GREATER compareReal (0.123E1, ~0.8988465674311579E308) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.3141592653589793E1) = GREATER compareReal (0.123E1, ~0.3141592653589793E1) = GREATER compare (0.123E1, ~0.2718281828459045E1) = GREATER compareReal (0.123E1, ~0.2718281828459045E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.22250738585072014E~307) = GREATER compareReal (0.123E1, ~0.22250738585072014E~307) = GREATER compare (0.123E1, ~0.11125369292536007E~307) = GREATER compareReal (0.123E1, ~0.11125369292536007E~307) = GREATER compare (0.123E1, ~0.5E~323) = GREATER compareReal (0.123E1, ~0.5E~323) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.17976931348623157E309) = LESS compareReal (0.123, 0.17976931348623157E309) = LESS compare (0.123, 0.8988465674311579E308) = LESS compareReal (0.123, 0.8988465674311579E308) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.3141592653589793E1) = LESS compareReal (0.123, 0.3141592653589793E1) = LESS compare (0.123, 0.2718281828459045E1) = LESS compareReal (0.123, 0.2718281828459045E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.22250738585072014E~307) = GREATER compareReal (0.123, 0.22250738585072014E~307) = GREATER compare (0.123, 0.11125369292536007E~307) = GREATER compareReal (0.123, 0.11125369292536007E~307) = GREATER compare (0.123, 0.5E~323) = GREATER compareReal (0.123, 0.5E~323) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.17976931348623157E309) = GREATER compareReal (0.123, ~0.17976931348623157E309) = GREATER compare (0.123, ~0.8988465674311579E308) = GREATER compareReal (0.123, ~0.8988465674311579E308) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.3141592653589793E1) = GREATER compareReal (0.123, ~0.3141592653589793E1) = GREATER compare (0.123, ~0.2718281828459045E1) = GREATER compareReal (0.123, ~0.2718281828459045E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.22250738585072014E~307) = GREATER compareReal (0.123, ~0.22250738585072014E~307) = GREATER compare (0.123, ~0.11125369292536007E~307) = GREATER compareReal (0.123, ~0.11125369292536007E~307) = GREATER compare (0.123, ~0.5E~323) = GREATER compareReal (0.123, ~0.5E~323) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.17976931348623157E309) = LESS compareReal (0.123E~2, 0.17976931348623157E309) = LESS compare (0.123E~2, 0.8988465674311579E308) = LESS compareReal (0.123E~2, 0.8988465674311579E308) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.3141592653589793E1) = LESS compareReal (0.123E~2, 0.3141592653589793E1) = LESS compare (0.123E~2, 0.2718281828459045E1) = LESS compareReal (0.123E~2, 0.2718281828459045E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.22250738585072014E~307) = GREATER compareReal (0.123E~2, 0.22250738585072014E~307) = GREATER compare (0.123E~2, 0.11125369292536007E~307) = GREATER compareReal (0.123E~2, 0.11125369292536007E~307) = GREATER compare (0.123E~2, 0.5E~323) = GREATER compareReal (0.123E~2, 0.5E~323) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (0.123E~2, ~0.17976931348623157E309) = GREATER compare (0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (0.123E~2, ~0.8988465674311579E308) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (0.123E~2, ~0.3141592653589793E1) = GREATER compare (0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (0.123E~2, ~0.2718281828459045E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E~2, ~0.22250738585072014E~307) = GREATER compare (0.123E~2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E~2, ~0.11125369292536007E~307) = GREATER compare (0.123E~2, ~0.5E~323) = GREATER compareReal (0.123E~2, ~0.5E~323) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (0.22250738585072014E~307, 0.123E4) = LESS compareReal (0.22250738585072014E~307, 0.123E4) = LESS compare (0.22250738585072014E~307, 0.123E2) = LESS compareReal (0.22250738585072014E~307, 0.123E2) = LESS compare (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (0.22250738585072014E~307, 0.123E1) = LESS compareReal (0.22250738585072014E~307, 0.123E1) = LESS compare (0.22250738585072014E~307, 0.123) = LESS compareReal (0.22250738585072014E~307, 0.123) = LESS compare (0.22250738585072014E~307, 0.123E~2) = LESS compareReal (0.22250738585072014E~307, 0.123E~2) = LESS compare (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compareReal (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compare (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, 0.5E~323) = GREATER compareReal (0.22250738585072014E~307, 0.5E~323) = GREATER compare (0.22250738585072014E~307, 0.0) = GREATER compareReal (0.22250738585072014E~307, 0.0) = GREATER compare (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (0.22250738585072014E~307, ~0.123E4) = GREATER compare (0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E2) = GREATER compare (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (0.22250738585072014E~307, ~0.123E1) = GREATER compare (0.22250738585072014E~307, ~0.123) = GREATER compareReal (0.22250738585072014E~307, ~0.123) = GREATER compare (0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E~2) = GREATER compare (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compare (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, ~0.5E~323) = GREATER compareReal (0.22250738585072014E~307, ~0.5E~323) = GREATER compare (0.22250738585072014E~307, ~0.0) = GREATER compareReal (0.22250738585072014E~307, ~0.0) = GREATER compare (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (0.11125369292536007E~307, 0.123E4) = LESS compareReal (0.11125369292536007E~307, 0.123E4) = LESS compare (0.11125369292536007E~307, 0.123E2) = LESS compareReal (0.11125369292536007E~307, 0.123E2) = LESS compare (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (0.11125369292536007E~307, 0.123E1) = LESS compareReal (0.11125369292536007E~307, 0.123E1) = LESS compare (0.11125369292536007E~307, 0.123) = LESS compareReal (0.11125369292536007E~307, 0.123) = LESS compare (0.11125369292536007E~307, 0.123E~2) = LESS compareReal (0.11125369292536007E~307, 0.123E~2) = LESS compare (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compareReal (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compare (0.11125369292536007E~307, 0.5E~323) = GREATER compareReal (0.11125369292536007E~307, 0.5E~323) = GREATER compare (0.11125369292536007E~307, 0.0) = GREATER compareReal (0.11125369292536007E~307, 0.0) = GREATER compare (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (0.11125369292536007E~307, ~0.123E4) = GREATER compare (0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E2) = GREATER compare (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (0.11125369292536007E~307, ~0.123E1) = GREATER compare (0.11125369292536007E~307, ~0.123) = GREATER compareReal (0.11125369292536007E~307, ~0.123) = GREATER compare (0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E~2) = GREATER compare (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compare (0.11125369292536007E~307, ~0.5E~323) = GREATER compareReal (0.11125369292536007E~307, ~0.5E~323) = GREATER compare (0.11125369292536007E~307, ~0.0) = GREATER compareReal (0.11125369292536007E~307, ~0.0) = GREATER compare (0.5E~323, 0.17976931348623157E309) = LESS compareReal (0.5E~323, 0.17976931348623157E309) = LESS compare (0.5E~323, 0.8988465674311579E308) = LESS compareReal (0.5E~323, 0.8988465674311579E308) = LESS compare (0.5E~323, 0.123E4) = LESS compareReal (0.5E~323, 0.123E4) = LESS compare (0.5E~323, 0.123E2) = LESS compareReal (0.5E~323, 0.123E2) = LESS compare (0.5E~323, 0.3141592653589793E1) = LESS compareReal (0.5E~323, 0.3141592653589793E1) = LESS compare (0.5E~323, 0.2718281828459045E1) = LESS compareReal (0.5E~323, 0.2718281828459045E1) = LESS compare (0.5E~323, 0.123E1) = LESS compareReal (0.5E~323, 0.123E1) = LESS compare (0.5E~323, 0.123) = LESS compareReal (0.5E~323, 0.123) = LESS compare (0.5E~323, 0.123E~2) = LESS compareReal (0.5E~323, 0.123E~2) = LESS compare (0.5E~323, 0.22250738585072014E~307) = LESS compareReal (0.5E~323, 0.22250738585072014E~307) = LESS compare (0.5E~323, 0.11125369292536007E~307) = LESS compareReal (0.5E~323, 0.11125369292536007E~307) = LESS compare (0.5E~323, 0.5E~323) = EQUAL compareReal (0.5E~323, 0.5E~323) = EQUAL compare (0.5E~323, 0.0) = GREATER compareReal (0.5E~323, 0.0) = GREATER compare (0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (0.5E~323, ~0.17976931348623157E309) = GREATER compare (0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (0.5E~323, ~0.8988465674311579E308) = GREATER compare (0.5E~323, ~0.123E4) = GREATER compareReal (0.5E~323, ~0.123E4) = GREATER compare (0.5E~323, ~0.123E2) = GREATER compareReal (0.5E~323, ~0.123E2) = GREATER compare (0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (0.5E~323, ~0.3141592653589793E1) = GREATER compare (0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (0.5E~323, ~0.2718281828459045E1) = GREATER compare (0.5E~323, ~0.123E1) = GREATER compareReal (0.5E~323, ~0.123E1) = GREATER compare (0.5E~323, ~0.123) = GREATER compareReal (0.5E~323, ~0.123) = GREATER compare (0.5E~323, ~0.123E~2) = GREATER compareReal (0.5E~323, ~0.123E~2) = GREATER compare (0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (0.5E~323, ~0.22250738585072014E~307) = GREATER compare (0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (0.5E~323, ~0.11125369292536007E~307) = GREATER compare (0.5E~323, ~0.5E~323) = GREATER compareReal (0.5E~323, ~0.5E~323) = GREATER compare (0.5E~323, ~0.0) = GREATER compareReal (0.5E~323, ~0.0) = GREATER compare (0.0, 0.17976931348623157E309) = LESS compareReal (0.0, 0.17976931348623157E309) = LESS compare (0.0, 0.8988465674311579E308) = LESS compareReal (0.0, 0.8988465674311579E308) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.3141592653589793E1) = LESS compareReal (0.0, 0.3141592653589793E1) = LESS compare (0.0, 0.2718281828459045E1) = LESS compareReal (0.0, 0.2718281828459045E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.22250738585072014E~307) = LESS compareReal (0.0, 0.22250738585072014E~307) = LESS compare (0.0, 0.11125369292536007E~307) = LESS compareReal (0.0, 0.11125369292536007E~307) = LESS compare (0.0, 0.5E~323) = LESS compareReal (0.0, 0.5E~323) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.17976931348623157E309) = GREATER compareReal (0.0, ~0.17976931348623157E309) = GREATER compare (0.0, ~0.8988465674311579E308) = GREATER compareReal (0.0, ~0.8988465674311579E308) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.3141592653589793E1) = GREATER compareReal (0.0, ~0.3141592653589793E1) = GREATER compare (0.0, ~0.2718281828459045E1) = GREATER compareReal (0.0, ~0.2718281828459045E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.22250738585072014E~307) = GREATER compareReal (0.0, ~0.22250738585072014E~307) = GREATER compare (0.0, ~0.11125369292536007E~307) = GREATER compareReal (0.0, ~0.11125369292536007E~307) = GREATER compare (0.0, ~0.5E~323) = GREATER compareReal (0.0, ~0.5E~323) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compareReal (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compare (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, 0.123E4) = LESS compareReal (~0.17976931348623157E309, 0.123E4) = LESS compare (~0.17976931348623157E309, 0.123E2) = LESS compareReal (~0.17976931348623157E309, 0.123E2) = LESS compare (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, 0.123E1) = LESS compareReal (~0.17976931348623157E309, 0.123E1) = LESS compare (~0.17976931348623157E309, 0.123) = LESS compareReal (~0.17976931348623157E309, 0.123) = LESS compare (~0.17976931348623157E309, 0.123E~2) = LESS compareReal (~0.17976931348623157E309, 0.123E~2) = LESS compare (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, 0.5E~323) = LESS compareReal (~0.17976931348623157E309, 0.5E~323) = LESS compare (~0.17976931348623157E309, 0.0) = LESS compareReal (~0.17976931348623157E309, 0.0) = LESS compare (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compareReal (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compare (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, ~0.123E4) = LESS compareReal (~0.17976931348623157E309, ~0.123E4) = LESS compare (~0.17976931348623157E309, ~0.123E2) = LESS compareReal (~0.17976931348623157E309, ~0.123E2) = LESS compare (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, ~0.123E1) = LESS compareReal (~0.17976931348623157E309, ~0.123E1) = LESS compare (~0.17976931348623157E309, ~0.123) = LESS compareReal (~0.17976931348623157E309, ~0.123) = LESS compare (~0.17976931348623157E309, ~0.123E~2) = LESS compareReal (~0.17976931348623157E309, ~0.123E~2) = LESS compare (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, ~0.5E~323) = LESS compareReal (~0.17976931348623157E309, ~0.5E~323) = LESS compare (~0.17976931348623157E309, ~0.0) = LESS compareReal (~0.17976931348623157E309, ~0.0) = LESS compare (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compareReal (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compare (~0.8988465674311579E308, 0.123E4) = LESS compareReal (~0.8988465674311579E308, 0.123E4) = LESS compare (~0.8988465674311579E308, 0.123E2) = LESS compareReal (~0.8988465674311579E308, 0.123E2) = LESS compare (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, 0.123E1) = LESS compareReal (~0.8988465674311579E308, 0.123E1) = LESS compare (~0.8988465674311579E308, 0.123) = LESS compareReal (~0.8988465674311579E308, 0.123) = LESS compare (~0.8988465674311579E308, 0.123E~2) = LESS compareReal (~0.8988465674311579E308, 0.123E~2) = LESS compare (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, 0.5E~323) = LESS compareReal (~0.8988465674311579E308, 0.5E~323) = LESS compare (~0.8988465674311579E308, 0.0) = LESS compareReal (~0.8988465674311579E308, 0.0) = LESS compare (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compareReal (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compare (~0.8988465674311579E308, ~0.123E4) = LESS compareReal (~0.8988465674311579E308, ~0.123E4) = LESS compare (~0.8988465674311579E308, ~0.123E2) = LESS compareReal (~0.8988465674311579E308, ~0.123E2) = LESS compare (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, ~0.123E1) = LESS compareReal (~0.8988465674311579E308, ~0.123E1) = LESS compare (~0.8988465674311579E308, ~0.123) = LESS compareReal (~0.8988465674311579E308, ~0.123) = LESS compare (~0.8988465674311579E308, ~0.123E~2) = LESS compareReal (~0.8988465674311579E308, ~0.123E~2) = LESS compare (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, ~0.5E~323) = LESS compareReal (~0.8988465674311579E308, ~0.5E~323) = LESS compare (~0.8988465674311579E308, ~0.0) = LESS compareReal (~0.8988465674311579E308, ~0.0) = LESS compare (~0.123E4, 0.17976931348623157E309) = LESS compareReal (~0.123E4, 0.17976931348623157E309) = LESS compare (~0.123E4, 0.8988465674311579E308) = LESS compareReal (~0.123E4, 0.8988465674311579E308) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.3141592653589793E1) = LESS compareReal (~0.123E4, 0.3141592653589793E1) = LESS compare (~0.123E4, 0.2718281828459045E1) = LESS compareReal (~0.123E4, 0.2718281828459045E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.22250738585072014E~307) = LESS compareReal (~0.123E4, 0.22250738585072014E~307) = LESS compare (~0.123E4, 0.11125369292536007E~307) = LESS compareReal (~0.123E4, 0.11125369292536007E~307) = LESS compare (~0.123E4, 0.5E~323) = LESS compareReal (~0.123E4, 0.5E~323) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.17976931348623157E309) = GREATER compareReal (~0.123E4, ~0.17976931348623157E309) = GREATER compare (~0.123E4, ~0.8988465674311579E308) = GREATER compareReal (~0.123E4, ~0.8988465674311579E308) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.3141592653589793E1) = LESS compareReal (~0.123E4, ~0.3141592653589793E1) = LESS compare (~0.123E4, ~0.2718281828459045E1) = LESS compareReal (~0.123E4, ~0.2718281828459045E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.22250738585072014E~307) = LESS compareReal (~0.123E4, ~0.22250738585072014E~307) = LESS compare (~0.123E4, ~0.11125369292536007E~307) = LESS compareReal (~0.123E4, ~0.11125369292536007E~307) = LESS compare (~0.123E4, ~0.5E~323) = LESS compareReal (~0.123E4, ~0.5E~323) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.17976931348623157E309) = LESS compareReal (~0.123E2, 0.17976931348623157E309) = LESS compare (~0.123E2, 0.8988465674311579E308) = LESS compareReal (~0.123E2, 0.8988465674311579E308) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.3141592653589793E1) = LESS compareReal (~0.123E2, 0.3141592653589793E1) = LESS compare (~0.123E2, 0.2718281828459045E1) = LESS compareReal (~0.123E2, 0.2718281828459045E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.22250738585072014E~307) = LESS compareReal (~0.123E2, 0.22250738585072014E~307) = LESS compare (~0.123E2, 0.11125369292536007E~307) = LESS compareReal (~0.123E2, 0.11125369292536007E~307) = LESS compare (~0.123E2, 0.5E~323) = LESS compareReal (~0.123E2, 0.5E~323) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E2, ~0.17976931348623157E309) = GREATER compare (~0.123E2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E2, ~0.8988465674311579E308) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.3141592653589793E1) = LESS compareReal (~0.123E2, ~0.3141592653589793E1) = LESS compare (~0.123E2, ~0.2718281828459045E1) = LESS compareReal (~0.123E2, ~0.2718281828459045E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E2, ~0.22250738585072014E~307) = LESS compare (~0.123E2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E2, ~0.11125369292536007E~307) = LESS compare (~0.123E2, ~0.5E~323) = LESS compareReal (~0.123E2, ~0.5E~323) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (~0.3141592653589793E1, 0.123E4) = LESS compareReal (~0.3141592653589793E1, 0.123E4) = LESS compare (~0.3141592653589793E1, 0.123E2) = LESS compareReal (~0.3141592653589793E1, 0.123E2) = LESS compare (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compareReal (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compare (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, 0.123E1) = LESS compareReal (~0.3141592653589793E1, 0.123E1) = LESS compare (~0.3141592653589793E1, 0.123) = LESS compareReal (~0.3141592653589793E1, 0.123) = LESS compare (~0.3141592653589793E1, 0.123E~2) = LESS compareReal (~0.3141592653589793E1, 0.123E~2) = LESS compare (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, 0.5E~323) = LESS compareReal (~0.3141592653589793E1, 0.5E~323) = LESS compare (~0.3141592653589793E1, 0.0) = LESS compareReal (~0.3141592653589793E1, 0.0) = LESS compare (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (~0.3141592653589793E1, ~0.123E4) = GREATER compareReal (~0.3141592653589793E1, ~0.123E4) = GREATER compare (~0.3141592653589793E1, ~0.123E2) = GREATER compareReal (~0.3141592653589793E1, ~0.123E2) = GREATER compare (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compareReal (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compare (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, ~0.123E1) = LESS compareReal (~0.3141592653589793E1, ~0.123E1) = LESS compare (~0.3141592653589793E1, ~0.123) = LESS compareReal (~0.3141592653589793E1, ~0.123) = LESS compare (~0.3141592653589793E1, ~0.123E~2) = LESS compareReal (~0.3141592653589793E1, ~0.123E~2) = LESS compare (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, ~0.5E~323) = LESS compareReal (~0.3141592653589793E1, ~0.5E~323) = LESS compare (~0.3141592653589793E1, ~0.0) = LESS compareReal (~0.3141592653589793E1, ~0.0) = LESS compare (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (~0.2718281828459045E1, 0.123E4) = LESS compareReal (~0.2718281828459045E1, 0.123E4) = LESS compare (~0.2718281828459045E1, 0.123E2) = LESS compareReal (~0.2718281828459045E1, 0.123E2) = LESS compare (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compareReal (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compare (~0.2718281828459045E1, 0.123E1) = LESS compareReal (~0.2718281828459045E1, 0.123E1) = LESS compare (~0.2718281828459045E1, 0.123) = LESS compareReal (~0.2718281828459045E1, 0.123) = LESS compare (~0.2718281828459045E1, 0.123E~2) = LESS compareReal (~0.2718281828459045E1, 0.123E~2) = LESS compare (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, 0.5E~323) = LESS compareReal (~0.2718281828459045E1, 0.5E~323) = LESS compare (~0.2718281828459045E1, 0.0) = LESS compareReal (~0.2718281828459045E1, 0.0) = LESS compare (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (~0.2718281828459045E1, ~0.123E4) = GREATER compareReal (~0.2718281828459045E1, ~0.123E4) = GREATER compare (~0.2718281828459045E1, ~0.123E2) = GREATER compareReal (~0.2718281828459045E1, ~0.123E2) = GREATER compare (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compareReal (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compare (~0.2718281828459045E1, ~0.123E1) = LESS compareReal (~0.2718281828459045E1, ~0.123E1) = LESS compare (~0.2718281828459045E1, ~0.123) = LESS compareReal (~0.2718281828459045E1, ~0.123) = LESS compare (~0.2718281828459045E1, ~0.123E~2) = LESS compareReal (~0.2718281828459045E1, ~0.123E~2) = LESS compare (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, ~0.5E~323) = LESS compareReal (~0.2718281828459045E1, ~0.5E~323) = LESS compare (~0.2718281828459045E1, ~0.0) = LESS compareReal (~0.2718281828459045E1, ~0.0) = LESS compare (~0.123E1, 0.17976931348623157E309) = LESS compareReal (~0.123E1, 0.17976931348623157E309) = LESS compare (~0.123E1, 0.8988465674311579E308) = LESS compareReal (~0.123E1, 0.8988465674311579E308) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.3141592653589793E1) = LESS compareReal (~0.123E1, 0.3141592653589793E1) = LESS compare (~0.123E1, 0.2718281828459045E1) = LESS compareReal (~0.123E1, 0.2718281828459045E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.22250738585072014E~307) = LESS compareReal (~0.123E1, 0.22250738585072014E~307) = LESS compare (~0.123E1, 0.11125369292536007E~307) = LESS compareReal (~0.123E1, 0.11125369292536007E~307) = LESS compare (~0.123E1, 0.5E~323) = LESS compareReal (~0.123E1, 0.5E~323) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.17976931348623157E309) = GREATER compareReal (~0.123E1, ~0.17976931348623157E309) = GREATER compare (~0.123E1, ~0.8988465674311579E308) = GREATER compareReal (~0.123E1, ~0.8988465674311579E308) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.3141592653589793E1) = GREATER compareReal (~0.123E1, ~0.3141592653589793E1) = GREATER compare (~0.123E1, ~0.2718281828459045E1) = GREATER compareReal (~0.123E1, ~0.2718281828459045E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.22250738585072014E~307) = LESS compareReal (~0.123E1, ~0.22250738585072014E~307) = LESS compare (~0.123E1, ~0.11125369292536007E~307) = LESS compareReal (~0.123E1, ~0.11125369292536007E~307) = LESS compare (~0.123E1, ~0.5E~323) = LESS compareReal (~0.123E1, ~0.5E~323) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.17976931348623157E309) = LESS compareReal (~0.123, 0.17976931348623157E309) = LESS compare (~0.123, 0.8988465674311579E308) = LESS compareReal (~0.123, 0.8988465674311579E308) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.3141592653589793E1) = LESS compareReal (~0.123, 0.3141592653589793E1) = LESS compare (~0.123, 0.2718281828459045E1) = LESS compareReal (~0.123, 0.2718281828459045E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.22250738585072014E~307) = LESS compareReal (~0.123, 0.22250738585072014E~307) = LESS compare (~0.123, 0.11125369292536007E~307) = LESS compareReal (~0.123, 0.11125369292536007E~307) = LESS compare (~0.123, 0.5E~323) = LESS compareReal (~0.123, 0.5E~323) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.17976931348623157E309) = GREATER compareReal (~0.123, ~0.17976931348623157E309) = GREATER compare (~0.123, ~0.8988465674311579E308) = GREATER compareReal (~0.123, ~0.8988465674311579E308) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.3141592653589793E1) = GREATER compareReal (~0.123, ~0.3141592653589793E1) = GREATER compare (~0.123, ~0.2718281828459045E1) = GREATER compareReal (~0.123, ~0.2718281828459045E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.22250738585072014E~307) = LESS compareReal (~0.123, ~0.22250738585072014E~307) = LESS compare (~0.123, ~0.11125369292536007E~307) = LESS compareReal (~0.123, ~0.11125369292536007E~307) = LESS compare (~0.123, ~0.5E~323) = LESS compareReal (~0.123, ~0.5E~323) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.17976931348623157E309) = LESS compareReal (~0.123E~2, 0.17976931348623157E309) = LESS compare (~0.123E~2, 0.8988465674311579E308) = LESS compareReal (~0.123E~2, 0.8988465674311579E308) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.3141592653589793E1) = LESS compareReal (~0.123E~2, 0.3141592653589793E1) = LESS compare (~0.123E~2, 0.2718281828459045E1) = LESS compareReal (~0.123E~2, 0.2718281828459045E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.22250738585072014E~307) = LESS compareReal (~0.123E~2, 0.22250738585072014E~307) = LESS compare (~0.123E~2, 0.11125369292536007E~307) = LESS compareReal (~0.123E~2, 0.11125369292536007E~307) = LESS compare (~0.123E~2, 0.5E~323) = LESS compareReal (~0.123E~2, 0.5E~323) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E~2, ~0.17976931348623157E309) = GREATER compare (~0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E~2, ~0.8988465674311579E308) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (~0.123E~2, ~0.3141592653589793E1) = GREATER compare (~0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (~0.123E~2, ~0.2718281828459045E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E~2, ~0.22250738585072014E~307) = LESS compare (~0.123E~2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E~2, ~0.11125369292536007E~307) = LESS compare (~0.123E~2, ~0.5E~323) = LESS compareReal (~0.123E~2, ~0.5E~323) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (~0.22250738585072014E~307, 0.123E4) = LESS compareReal (~0.22250738585072014E~307, 0.123E4) = LESS compare (~0.22250738585072014E~307, 0.123E2) = LESS compareReal (~0.22250738585072014E~307, 0.123E2) = LESS compare (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (~0.22250738585072014E~307, 0.123E1) = LESS compareReal (~0.22250738585072014E~307, 0.123E1) = LESS compare (~0.22250738585072014E~307, 0.123) = LESS compareReal (~0.22250738585072014E~307, 0.123) = LESS compare (~0.22250738585072014E~307, 0.123E~2) = LESS compareReal (~0.22250738585072014E~307, 0.123E~2) = LESS compare (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compareReal (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compare (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, 0.5E~323) = LESS compareReal (~0.22250738585072014E~307, 0.5E~323) = LESS compare (~0.22250738585072014E~307, 0.0) = LESS compareReal (~0.22250738585072014E~307, 0.0) = LESS compare (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (~0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E4) = GREATER compare (~0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E2) = GREATER compare (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (~0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E1) = GREATER compare (~0.22250738585072014E~307, ~0.123) = GREATER compareReal (~0.22250738585072014E~307, ~0.123) = GREATER compare (~0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E~2) = GREATER compare (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compareReal (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compare (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, ~0.5E~323) = LESS compareReal (~0.22250738585072014E~307, ~0.5E~323) = LESS compare (~0.22250738585072014E~307, ~0.0) = LESS compareReal (~0.22250738585072014E~307, ~0.0) = LESS compare (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (~0.11125369292536007E~307, 0.123E4) = LESS compareReal (~0.11125369292536007E~307, 0.123E4) = LESS compare (~0.11125369292536007E~307, 0.123E2) = LESS compareReal (~0.11125369292536007E~307, 0.123E2) = LESS compare (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (~0.11125369292536007E~307, 0.123E1) = LESS compareReal (~0.11125369292536007E~307, 0.123E1) = LESS compare (~0.11125369292536007E~307, 0.123) = LESS compareReal (~0.11125369292536007E~307, 0.123) = LESS compare (~0.11125369292536007E~307, 0.123E~2) = LESS compareReal (~0.11125369292536007E~307, 0.123E~2) = LESS compare (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compareReal (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compare (~0.11125369292536007E~307, 0.5E~323) = LESS compareReal (~0.11125369292536007E~307, 0.5E~323) = LESS compare (~0.11125369292536007E~307, 0.0) = LESS compareReal (~0.11125369292536007E~307, 0.0) = LESS compare (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (~0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E4) = GREATER compare (~0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E2) = GREATER compare (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (~0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E1) = GREATER compare (~0.11125369292536007E~307, ~0.123) = GREATER compareReal (~0.11125369292536007E~307, ~0.123) = GREATER compare (~0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E~2) = GREATER compare (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compareReal (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compare (~0.11125369292536007E~307, ~0.5E~323) = LESS compareReal (~0.11125369292536007E~307, ~0.5E~323) = LESS compare (~0.11125369292536007E~307, ~0.0) = LESS compareReal (~0.11125369292536007E~307, ~0.0) = LESS compare (~0.5E~323, 0.17976931348623157E309) = LESS compareReal (~0.5E~323, 0.17976931348623157E309) = LESS compare (~0.5E~323, 0.8988465674311579E308) = LESS compareReal (~0.5E~323, 0.8988465674311579E308) = LESS compare (~0.5E~323, 0.123E4) = LESS compareReal (~0.5E~323, 0.123E4) = LESS compare (~0.5E~323, 0.123E2) = LESS compareReal (~0.5E~323, 0.123E2) = LESS compare (~0.5E~323, 0.3141592653589793E1) = LESS compareReal (~0.5E~323, 0.3141592653589793E1) = LESS compare (~0.5E~323, 0.2718281828459045E1) = LESS compareReal (~0.5E~323, 0.2718281828459045E1) = LESS compare (~0.5E~323, 0.123E1) = LESS compareReal (~0.5E~323, 0.123E1) = LESS compare (~0.5E~323, 0.123) = LESS compareReal (~0.5E~323, 0.123) = LESS compare (~0.5E~323, 0.123E~2) = LESS compareReal (~0.5E~323, 0.123E~2) = LESS compare (~0.5E~323, 0.22250738585072014E~307) = LESS compareReal (~0.5E~323, 0.22250738585072014E~307) = LESS compare (~0.5E~323, 0.11125369292536007E~307) = LESS compareReal (~0.5E~323, 0.11125369292536007E~307) = LESS compare (~0.5E~323, 0.5E~323) = LESS compareReal (~0.5E~323, 0.5E~323) = LESS compare (~0.5E~323, 0.0) = LESS compareReal (~0.5E~323, 0.0) = LESS compare (~0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (~0.5E~323, ~0.17976931348623157E309) = GREATER compare (~0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (~0.5E~323, ~0.8988465674311579E308) = GREATER compare (~0.5E~323, ~0.123E4) = GREATER compareReal (~0.5E~323, ~0.123E4) = GREATER compare (~0.5E~323, ~0.123E2) = GREATER compareReal (~0.5E~323, ~0.123E2) = GREATER compare (~0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (~0.5E~323, ~0.3141592653589793E1) = GREATER compare (~0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (~0.5E~323, ~0.2718281828459045E1) = GREATER compare (~0.5E~323, ~0.123E1) = GREATER compareReal (~0.5E~323, ~0.123E1) = GREATER compare (~0.5E~323, ~0.123) = GREATER compareReal (~0.5E~323, ~0.123) = GREATER compare (~0.5E~323, ~0.123E~2) = GREATER compareReal (~0.5E~323, ~0.123E~2) = GREATER compare (~0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (~0.5E~323, ~0.22250738585072014E~307) = GREATER compare (~0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (~0.5E~323, ~0.11125369292536007E~307) = GREATER compare (~0.5E~323, ~0.5E~323) = EQUAL compareReal (~0.5E~323, ~0.5E~323) = EQUAL compare (~0.5E~323, ~0.0) = LESS compareReal (~0.5E~323, ~0.0) = LESS compare (~0.0, 0.17976931348623157E309) = LESS compareReal (~0.0, 0.17976931348623157E309) = LESS compare (~0.0, 0.8988465674311579E308) = LESS compareReal (~0.0, 0.8988465674311579E308) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.3141592653589793E1) = LESS compareReal (~0.0, 0.3141592653589793E1) = LESS compare (~0.0, 0.2718281828459045E1) = LESS compareReal (~0.0, 0.2718281828459045E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.22250738585072014E~307) = LESS compareReal (~0.0, 0.22250738585072014E~307) = LESS compare (~0.0, 0.11125369292536007E~307) = LESS compareReal (~0.0, 0.11125369292536007E~307) = LESS compare (~0.0, 0.5E~323) = LESS compareReal (~0.0, 0.5E~323) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.17976931348623157E309) = GREATER compareReal (~0.0, ~0.17976931348623157E309) = GREATER compare (~0.0, ~0.8988465674311579E308) = GREATER compareReal (~0.0, ~0.8988465674311579E308) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.3141592653589793E1) = GREATER compareReal (~0.0, ~0.3141592653589793E1) = GREATER compare (~0.0, ~0.2718281828459045E1) = GREATER compareReal (~0.0, ~0.2718281828459045E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.22250738585072014E~307) = GREATER compareReal (~0.0, ~0.22250738585072014E~307) = GREATER compare (~0.0, ~0.11125369292536007E~307) = GREATER compareReal (~0.0, ~0.11125369292536007E~307) = GREATER compare (~0.0, ~0.5E~323) = GREATER compareReal (~0.0, ~0.5E~323) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20210117+dfsg/regression/real.ok000066400000000000000000041401551416264345000174760ustar00rootroot00000000000000 Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.34028235E39) = ~0.34028235E39 ~ (0.17014117E39) = ~0.17014117E39 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.31415927E1) = ~0.31415927E1 ~ (0.27182817E1) = ~0.27182817E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.11754944E~37) = ~0.11754944E~37 ~ (0.5877472E~38) = ~0.5877472E~38 ~ (0.1E~44) = ~0.1E~44 ~ (0.0) = ~0.0 ~ (~0.34028235E39) = 0.34028235E39 ~ (~0.17014117E39) = 0.17014117E39 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.31415927E1) = 0.31415927E1 ~ (~0.27182817E1) = 0.27182817E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.11754944E~37) = 0.11754944E~37 ~ (~0.5877472E~38) = 0.5877472E~38 ~ (~0.1E~44) = 0.1E~44 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.34028235E39, 0.34028235E39) = inf + (0.34028235E39, 0.34028235E39) = inf - (0.34028235E39, 0.34028235E39) = 0.0 / (0.34028235E39, 0.34028235E39) = 0.1E1 nextAfter (0.34028235E39, 0.34028235E39) = 0.34028235E39 rem (0.34028235E39, 0.34028235E39) = 0.0 * (0.34028235E39, 0.17014117E39) = inf + (0.34028235E39, 0.17014117E39) = inf - (0.34028235E39, 0.17014117E39) = 0.17014117E39 / (0.34028235E39, 0.17014117E39) = 0.2E1 nextAfter (0.34028235E39, 0.17014117E39) = 0.34028233E39 rem (0.34028235E39, 0.17014117E39) = 0.0 * (0.34028235E39, 0.123E4) = inf + (0.34028235E39, 0.123E4) = 0.34028235E39 - (0.34028235E39, 0.123E4) = 0.34028235E39 / (0.34028235E39, 0.123E4) = 0.2766523E36 nextAfter (0.34028235E39, 0.123E4) = 0.34028233E39 rem (0.34028235E39, 0.123E4) = 0.2028241E32 * (0.34028235E39, 0.123E2) = inf + (0.34028235E39, 0.123E2) = 0.34028235E39 - (0.34028235E39, 0.123E2) = 0.34028235E39 / (0.34028235E39, 0.123E2) = 0.27665232E38 nextAfter (0.34028235E39, 0.123E2) = 0.34028233E39 rem (0.34028235E39, 0.123E2) = ~inf * (0.34028235E39, 0.31415927E1) = inf + (0.34028235E39, 0.31415927E1) = 0.34028235E39 - (0.34028235E39, 0.31415927E1) = 0.34028235E39 / (0.34028235E39, 0.31415927E1) = 0.10831523E39 nextAfter (0.34028235E39, 0.31415927E1) = 0.34028233E39 rem (0.34028235E39, 0.31415927E1) = 0.2028241E32 * (0.34028235E39, 0.27182817E1) = inf + (0.34028235E39, 0.27182817E1) = 0.34028235E39 - (0.34028235E39, 0.27182817E1) = 0.34028235E39 / (0.34028235E39, 0.27182817E1) = 0.12518288E39 nextAfter (0.34028235E39, 0.27182817E1) = 0.34028233E39 rem (0.34028235E39, 0.27182817E1) = 0.0 * (0.34028235E39, 0.123E1) = inf + (0.34028235E39, 0.123E1) = 0.34028235E39 - (0.34028235E39, 0.123E1) = 0.34028235E39 / (0.34028235E39, 0.123E1) = 0.27665231E39 nextAfter (0.34028235E39, 0.123E1) = 0.34028233E39 rem (0.34028235E39, 0.123E1) = 0.0 * (0.34028235E39, 0.123) = 0.4185473E38 + (0.34028235E39, 0.123) = 0.34028235E39 - (0.34028235E39, 0.123) = 0.34028235E39 / (0.34028235E39, 0.123) = inf nextAfter (0.34028235E39, 0.123) = 0.34028233E39 rem (0.34028235E39, 0.123) = ~inf * (0.34028235E39, 0.123E~2) = 0.4185473E36 + (0.34028235E39, 0.123E~2) = 0.34028235E39 - (0.34028235E39, 0.123E~2) = 0.34028235E39 / (0.34028235E39, 0.123E~2) = inf nextAfter (0.34028235E39, 0.123E~2) = 0.34028233E39 rem (0.34028235E39, 0.123E~2) = ~inf * (0.34028235E39, 0.11754944E~37) = 0.39999998E1 + (0.34028235E39, 0.11754944E~37) = 0.34028235E39 - (0.34028235E39, 0.11754944E~37) = 0.34028235E39 / (0.34028235E39, 0.11754944E~37) = inf nextAfter (0.34028235E39, 0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, 0.11754944E~37) = ~inf * (0.34028235E39, 0.5877472E~38) = 0.19999999E1 + (0.34028235E39, 0.5877472E~38) = 0.34028235E39 - (0.34028235E39, 0.5877472E~38) = 0.34028235E39 / (0.34028235E39, 0.5877472E~38) = inf nextAfter (0.34028235E39, 0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, 0.5877472E~38) = ~inf * (0.34028235E39, 0.1E~44) = 0.47683713E~6 + (0.34028235E39, 0.1E~44) = 0.34028235E39 - (0.34028235E39, 0.1E~44) = 0.34028235E39 / (0.34028235E39, 0.1E~44) = inf nextAfter (0.34028235E39, 0.1E~44) = 0.34028233E39 rem (0.34028235E39, 0.1E~44) = ~inf * (0.34028235E39, 0.0) = 0.0 + (0.34028235E39, 0.0) = 0.34028235E39 - (0.34028235E39, 0.0) = 0.34028235E39 / (0.34028235E39, 0.0) = inf nextAfter (0.34028235E39, 0.0) = 0.34028233E39 rem (0.34028235E39, 0.0) = nan * (0.34028235E39, ~0.34028235E39) = ~inf + (0.34028235E39, ~0.34028235E39) = 0.0 - (0.34028235E39, ~0.34028235E39) = inf / (0.34028235E39, ~0.34028235E39) = ~0.1E1 nextAfter (0.34028235E39, ~0.34028235E39) = 0.34028233E39 rem (0.34028235E39, ~0.34028235E39) = 0.0 * (0.34028235E39, ~0.17014117E39) = ~inf + (0.34028235E39, ~0.17014117E39) = 0.17014117E39 - (0.34028235E39, ~0.17014117E39) = inf / (0.34028235E39, ~0.17014117E39) = ~0.2E1 nextAfter (0.34028235E39, ~0.17014117E39) = 0.34028233E39 rem (0.34028235E39, ~0.17014117E39) = 0.0 * (0.34028235E39, ~0.123E4) = ~inf + (0.34028235E39, ~0.123E4) = 0.34028235E39 - (0.34028235E39, ~0.123E4) = 0.34028235E39 / (0.34028235E39, ~0.123E4) = ~0.2766523E36 nextAfter (0.34028235E39, ~0.123E4) = 0.34028233E39 rem (0.34028235E39, ~0.123E4) = 0.2028241E32 * (0.34028235E39, ~0.123E2) = ~inf + (0.34028235E39, ~0.123E2) = 0.34028235E39 - (0.34028235E39, ~0.123E2) = 0.34028235E39 / (0.34028235E39, ~0.123E2) = ~0.27665232E38 nextAfter (0.34028235E39, ~0.123E2) = 0.34028233E39 rem (0.34028235E39, ~0.123E2) = ~inf * (0.34028235E39, ~0.31415927E1) = ~inf + (0.34028235E39, ~0.31415927E1) = 0.34028235E39 - (0.34028235E39, ~0.31415927E1) = 0.34028235E39 / (0.34028235E39, ~0.31415927E1) = ~0.10831523E39 nextAfter (0.34028235E39, ~0.31415927E1) = 0.34028233E39 rem (0.34028235E39, ~0.31415927E1) = 0.2028241E32 * (0.34028235E39, ~0.27182817E1) = ~inf + (0.34028235E39, ~0.27182817E1) = 0.34028235E39 - (0.34028235E39, ~0.27182817E1) = 0.34028235E39 / (0.34028235E39, ~0.27182817E1) = ~0.12518288E39 nextAfter (0.34028235E39, ~0.27182817E1) = 0.34028233E39 rem (0.34028235E39, ~0.27182817E1) = 0.0 * (0.34028235E39, ~0.123E1) = ~inf + (0.34028235E39, ~0.123E1) = 0.34028235E39 - (0.34028235E39, ~0.123E1) = 0.34028235E39 / (0.34028235E39, ~0.123E1) = ~0.27665231E39 nextAfter (0.34028235E39, ~0.123E1) = 0.34028233E39 rem (0.34028235E39, ~0.123E1) = 0.0 * (0.34028235E39, ~0.123) = ~0.4185473E38 + (0.34028235E39, ~0.123) = 0.34028235E39 - (0.34028235E39, ~0.123) = 0.34028235E39 / (0.34028235E39, ~0.123) = ~inf nextAfter (0.34028235E39, ~0.123) = 0.34028233E39 rem (0.34028235E39, ~0.123) = ~inf * (0.34028235E39, ~0.123E~2) = ~0.4185473E36 + (0.34028235E39, ~0.123E~2) = 0.34028235E39 - (0.34028235E39, ~0.123E~2) = 0.34028235E39 / (0.34028235E39, ~0.123E~2) = ~inf nextAfter (0.34028235E39, ~0.123E~2) = 0.34028233E39 rem (0.34028235E39, ~0.123E~2) = ~inf * (0.34028235E39, ~0.11754944E~37) = ~0.39999998E1 + (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 - (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 / (0.34028235E39, ~0.11754944E~37) = ~inf nextAfter (0.34028235E39, ~0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, ~0.11754944E~37) = ~inf * (0.34028235E39, ~0.5877472E~38) = ~0.19999999E1 + (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 - (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 / (0.34028235E39, ~0.5877472E~38) = ~inf nextAfter (0.34028235E39, ~0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, ~0.5877472E~38) = ~inf * (0.34028235E39, ~0.1E~44) = ~0.47683713E~6 + (0.34028235E39, ~0.1E~44) = 0.34028235E39 - (0.34028235E39, ~0.1E~44) = 0.34028235E39 / (0.34028235E39, ~0.1E~44) = ~inf nextAfter (0.34028235E39, ~0.1E~44) = 0.34028233E39 rem (0.34028235E39, ~0.1E~44) = ~inf * (0.34028235E39, ~0.0) = ~0.0 + (0.34028235E39, ~0.0) = 0.34028235E39 - (0.34028235E39, ~0.0) = 0.34028235E39 / (0.34028235E39, ~0.0) = ~inf nextAfter (0.34028235E39, ~0.0) = 0.34028233E39 rem (0.34028235E39, ~0.0) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.34028235E39, ~inf) = ~inf + (0.34028235E39, ~inf) = ~inf - (0.34028235E39, ~inf) = inf / (0.34028235E39, ~inf) = ~0.0 nextAfter (0.34028235E39, ~inf) = 0.34028233E39 rem (0.34028235E39, ~inf) = 0.34028235E39 * (0.34028235E39, nan) = nan + (0.34028235E39, nan) = nan - (0.34028235E39, nan) = nan / (0.34028235E39, nan) = nan nextAfter (0.34028235E39, nan) = nan rem (0.34028235E39, nan) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.17014117E39, 0.34028235E39) = inf + (0.17014117E39, 0.34028235E39) = inf - (0.17014117E39, 0.34028235E39) = ~0.17014117E39 / (0.17014117E39, 0.34028235E39) = 0.5 nextAfter (0.17014117E39, 0.34028235E39) = 0.17014118E39 rem (0.17014117E39, 0.34028235E39) = 0.17014117E39 * (0.17014117E39, 0.17014117E39) = inf + (0.17014117E39, 0.17014117E39) = 0.34028235E39 - (0.17014117E39, 0.17014117E39) = 0.0 / (0.17014117E39, 0.17014117E39) = 0.1E1 nextAfter (0.17014117E39, 0.17014117E39) = 0.17014117E39 rem (0.17014117E39, 0.17014117E39) = 0.0 * (0.17014117E39, 0.123E4) = inf + (0.17014117E39, 0.123E4) = 0.17014117E39 - (0.17014117E39, 0.123E4) = 0.17014117E39 / (0.17014117E39, 0.123E4) = 0.13832615E36 nextAfter (0.17014117E39, 0.123E4) = 0.17014116E39 rem (0.17014117E39, 0.123E4) = 0.10141205E32 * (0.17014117E39, 0.123E2) = inf + (0.17014117E39, 0.123E2) = 0.17014117E39 - (0.17014117E39, 0.123E2) = 0.17014117E39 / (0.17014117E39, 0.123E2) = 0.13832616E38 nextAfter (0.17014117E39, 0.123E2) = 0.17014116E39 rem (0.17014117E39, 0.123E2) = ~0.10141205E32 * (0.17014117E39, 0.31415927E1) = inf + (0.17014117E39, 0.31415927E1) = 0.17014117E39 - (0.17014117E39, 0.31415927E1) = 0.17014117E39 / (0.17014117E39, 0.31415927E1) = 0.54157613E38 nextAfter (0.17014117E39, 0.31415927E1) = 0.17014116E39 rem (0.17014117E39, 0.31415927E1) = 0.10141205E32 * (0.17014117E39, 0.27182817E1) = inf + (0.17014117E39, 0.27182817E1) = 0.17014117E39 - (0.17014117E39, 0.27182817E1) = 0.17014117E39 / (0.17014117E39, 0.27182817E1) = 0.6259144E38 nextAfter (0.17014117E39, 0.27182817E1) = 0.17014116E39 rem (0.17014117E39, 0.27182817E1) = 0.0 * (0.17014117E39, 0.123E1) = 0.20927364E39 + (0.17014117E39, 0.123E1) = 0.17014117E39 - (0.17014117E39, 0.123E1) = 0.17014117E39 / (0.17014117E39, 0.123E1) = 0.13832616E39 nextAfter (0.17014117E39, 0.123E1) = 0.17014116E39 rem (0.17014117E39, 0.123E1) = 0.0 * (0.17014117E39, 0.123) = 0.20927365E38 + (0.17014117E39, 0.123) = 0.17014117E39 - (0.17014117E39, 0.123) = 0.17014117E39 / (0.17014117E39, 0.123) = inf nextAfter (0.17014117E39, 0.123) = 0.17014116E39 rem (0.17014117E39, 0.123) = ~inf * (0.17014117E39, 0.123E~2) = 0.20927364E36 + (0.17014117E39, 0.123E~2) = 0.17014117E39 - (0.17014117E39, 0.123E~2) = 0.17014117E39 / (0.17014117E39, 0.123E~2) = inf nextAfter (0.17014117E39, 0.123E~2) = 0.17014116E39 rem (0.17014117E39, 0.123E~2) = ~inf * (0.17014117E39, 0.11754944E~37) = 0.19999999E1 + (0.17014117E39, 0.11754944E~37) = 0.17014117E39 - (0.17014117E39, 0.11754944E~37) = 0.17014117E39 / (0.17014117E39, 0.11754944E~37) = inf nextAfter (0.17014117E39, 0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, 0.11754944E~37) = ~inf * (0.17014117E39, 0.5877472E~38) = 0.99999994 + (0.17014117E39, 0.5877472E~38) = 0.17014117E39 - (0.17014117E39, 0.5877472E~38) = 0.17014117E39 / (0.17014117E39, 0.5877472E~38) = inf nextAfter (0.17014117E39, 0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, 0.5877472E~38) = ~inf * (0.17014117E39, 0.1E~44) = 0.23841856E~6 + (0.17014117E39, 0.1E~44) = 0.17014117E39 - (0.17014117E39, 0.1E~44) = 0.17014117E39 / (0.17014117E39, 0.1E~44) = inf nextAfter (0.17014117E39, 0.1E~44) = 0.17014116E39 rem (0.17014117E39, 0.1E~44) = ~inf * (0.17014117E39, 0.0) = 0.0 + (0.17014117E39, 0.0) = 0.17014117E39 - (0.17014117E39, 0.0) = 0.17014117E39 / (0.17014117E39, 0.0) = inf nextAfter (0.17014117E39, 0.0) = 0.17014116E39 rem (0.17014117E39, 0.0) = nan * (0.17014117E39, ~0.34028235E39) = ~inf + (0.17014117E39, ~0.34028235E39) = ~0.17014117E39 - (0.17014117E39, ~0.34028235E39) = inf / (0.17014117E39, ~0.34028235E39) = ~0.5 nextAfter (0.17014117E39, ~0.34028235E39) = 0.17014116E39 rem (0.17014117E39, ~0.34028235E39) = 0.17014117E39 * (0.17014117E39, ~0.17014117E39) = ~inf + (0.17014117E39, ~0.17014117E39) = 0.0 - (0.17014117E39, ~0.17014117E39) = 0.34028235E39 / (0.17014117E39, ~0.17014117E39) = ~0.1E1 nextAfter (0.17014117E39, ~0.17014117E39) = 0.17014116E39 rem (0.17014117E39, ~0.17014117E39) = 0.0 * (0.17014117E39, ~0.123E4) = ~inf + (0.17014117E39, ~0.123E4) = 0.17014117E39 - (0.17014117E39, ~0.123E4) = 0.17014117E39 / (0.17014117E39, ~0.123E4) = ~0.13832615E36 nextAfter (0.17014117E39, ~0.123E4) = 0.17014116E39 rem (0.17014117E39, ~0.123E4) = 0.10141205E32 * (0.17014117E39, ~0.123E2) = ~inf + (0.17014117E39, ~0.123E2) = 0.17014117E39 - (0.17014117E39, ~0.123E2) = 0.17014117E39 / (0.17014117E39, ~0.123E2) = ~0.13832616E38 nextAfter (0.17014117E39, ~0.123E2) = 0.17014116E39 rem (0.17014117E39, ~0.123E2) = ~0.10141205E32 * (0.17014117E39, ~0.31415927E1) = ~inf + (0.17014117E39, ~0.31415927E1) = 0.17014117E39 - (0.17014117E39, ~0.31415927E1) = 0.17014117E39 / (0.17014117E39, ~0.31415927E1) = ~0.54157613E38 nextAfter (0.17014117E39, ~0.31415927E1) = 0.17014116E39 rem (0.17014117E39, ~0.31415927E1) = 0.10141205E32 * (0.17014117E39, ~0.27182817E1) = ~inf + (0.17014117E39, ~0.27182817E1) = 0.17014117E39 - (0.17014117E39, ~0.27182817E1) = 0.17014117E39 / (0.17014117E39, ~0.27182817E1) = ~0.6259144E38 nextAfter (0.17014117E39, ~0.27182817E1) = 0.17014116E39 rem (0.17014117E39, ~0.27182817E1) = 0.0 * (0.17014117E39, ~0.123E1) = ~0.20927364E39 + (0.17014117E39, ~0.123E1) = 0.17014117E39 - (0.17014117E39, ~0.123E1) = 0.17014117E39 / (0.17014117E39, ~0.123E1) = ~0.13832616E39 nextAfter (0.17014117E39, ~0.123E1) = 0.17014116E39 rem (0.17014117E39, ~0.123E1) = 0.0 * (0.17014117E39, ~0.123) = ~0.20927365E38 + (0.17014117E39, ~0.123) = 0.17014117E39 - (0.17014117E39, ~0.123) = 0.17014117E39 / (0.17014117E39, ~0.123) = ~inf nextAfter (0.17014117E39, ~0.123) = 0.17014116E39 rem (0.17014117E39, ~0.123) = ~inf * (0.17014117E39, ~0.123E~2) = ~0.20927364E36 + (0.17014117E39, ~0.123E~2) = 0.17014117E39 - (0.17014117E39, ~0.123E~2) = 0.17014117E39 / (0.17014117E39, ~0.123E~2) = ~inf nextAfter (0.17014117E39, ~0.123E~2) = 0.17014116E39 rem (0.17014117E39, ~0.123E~2) = ~inf * (0.17014117E39, ~0.11754944E~37) = ~0.19999999E1 + (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 - (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 / (0.17014117E39, ~0.11754944E~37) = ~inf nextAfter (0.17014117E39, ~0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, ~0.11754944E~37) = ~inf * (0.17014117E39, ~0.5877472E~38) = ~0.99999994 + (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 - (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 / (0.17014117E39, ~0.5877472E~38) = ~inf nextAfter (0.17014117E39, ~0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, ~0.5877472E~38) = ~inf * (0.17014117E39, ~0.1E~44) = ~0.23841856E~6 + (0.17014117E39, ~0.1E~44) = 0.17014117E39 - (0.17014117E39, ~0.1E~44) = 0.17014117E39 / (0.17014117E39, ~0.1E~44) = ~inf nextAfter (0.17014117E39, ~0.1E~44) = 0.17014116E39 rem (0.17014117E39, ~0.1E~44) = ~inf * (0.17014117E39, ~0.0) = ~0.0 + (0.17014117E39, ~0.0) = 0.17014117E39 - (0.17014117E39, ~0.0) = 0.17014117E39 / (0.17014117E39, ~0.0) = ~inf nextAfter (0.17014117E39, ~0.0) = 0.17014116E39 rem (0.17014117E39, ~0.0) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.17014117E39, ~inf) = ~inf + (0.17014117E39, ~inf) = ~inf - (0.17014117E39, ~inf) = inf / (0.17014117E39, ~inf) = ~0.0 nextAfter (0.17014117E39, ~inf) = 0.17014116E39 rem (0.17014117E39, ~inf) = 0.17014117E39 * (0.17014117E39, nan) = nan + (0.17014117E39, nan) = nan - (0.17014117E39, nan) = nan / (0.17014117E39, nan) = nan nextAfter (0.17014117E39, nan) = nan rem (0.17014117E39, nan) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.123E4, 0.34028235E39) = inf + (0.123E4, 0.34028235E39) = 0.34028235E39 - (0.123E4, 0.34028235E39) = ~0.34028235E39 / (0.123E4, 0.34028235E39) = 0.36146455E~35 nextAfter (0.123E4, 0.34028235E39) = 0.12300001E4 rem (0.123E4, 0.34028235E39) = 0.123E4 * (0.123E4, 0.17014117E39) = inf + (0.123E4, 0.17014117E39) = 0.17014117E39 - (0.123E4, 0.17014117E39) = ~0.17014117E39 / (0.123E4, 0.17014117E39) = 0.7229291E~35 nextAfter (0.123E4, 0.17014117E39) = 0.12300001E4 rem (0.123E4, 0.17014117E39) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.31415927E1) = 0.38641592E4 + (0.123E4, 0.31415927E1) = 0.12331416E4 - (0.123E4, 0.31415927E1) = 0.12268584E4 / (0.123E4, 0.31415927E1) = 0.39152115E3 nextAfter (0.123E4, 0.31415927E1) = 0.12299999E4 rem (0.123E4, 0.31415927E1) = 0.1637207E1 * (0.123E4, 0.27182817E1) = 0.33434866E4 + (0.123E4, 0.27182817E1) = 0.12327183E4 - (0.123E4, 0.27182817E1) = 0.12272817E4 / (0.123E4, 0.27182817E1) = 0.45249173E3 nextAfter (0.123E4, 0.27182817E1) = 0.12299999E4 rem (0.123E4, 0.27182817E1) = 0.13366699E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129001E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129001E1 + (0.123E4, 0.123E~2) = 0.12300012E4 - (0.123E4, 0.123E~2) = 0.12299988E4 / (0.123E4, 0.123E~2) = 0.99999994E6 nextAfter (0.123E4, 0.123E~2) = 0.12299999E4 rem (0.123E4, 0.123E~2) = 0.12207031E~2 * (0.123E4, 0.11754944E~37) = 0.1445858E~34 + (0.123E4, 0.11754944E~37) = 0.123E4 - (0.123E4, 0.11754944E~37) = 0.123E4 / (0.123E4, 0.11754944E~37) = inf nextAfter (0.123E4, 0.11754944E~37) = 0.12299999E4 rem (0.123E4, 0.11754944E~37) = ~inf * (0.123E4, 0.5877472E~38) = 0.722929E~35 + (0.123E4, 0.5877472E~38) = 0.123E4 - (0.123E4, 0.5877472E~38) = 0.123E4 / (0.123E4, 0.5877472E~38) = inf nextAfter (0.123E4, 0.5877472E~38) = 0.12299999E4 rem (0.123E4, 0.5877472E~38) = ~inf * (0.123E4, 0.1E~44) = 0.1724E~41 + (0.123E4, 0.1E~44) = 0.123E4 - (0.123E4, 0.1E~44) = 0.123E4 / (0.123E4, 0.1E~44) = inf nextAfter (0.123E4, 0.1E~44) = 0.12299999E4 rem (0.123E4, 0.1E~44) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.34028235E39) = ~inf + (0.123E4, ~0.34028235E39) = ~0.34028235E39 - (0.123E4, ~0.34028235E39) = 0.34028235E39 / (0.123E4, ~0.34028235E39) = ~0.36146455E~35 nextAfter (0.123E4, ~0.34028235E39) = 0.12299999E4 rem (0.123E4, ~0.34028235E39) = 0.123E4 * (0.123E4, ~0.17014117E39) = ~inf + (0.123E4, ~0.17014117E39) = ~0.17014117E39 - (0.123E4, ~0.17014117E39) = 0.17014117E39 / (0.123E4, ~0.17014117E39) = ~0.7229291E~35 nextAfter (0.123E4, ~0.17014117E39) = 0.12299999E4 rem (0.123E4, ~0.17014117E39) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.31415927E1) = ~0.38641592E4 + (0.123E4, ~0.31415927E1) = 0.12268584E4 - (0.123E4, ~0.31415927E1) = 0.12331416E4 / (0.123E4, ~0.31415927E1) = ~0.39152115E3 nextAfter (0.123E4, ~0.31415927E1) = 0.12299999E4 rem (0.123E4, ~0.31415927E1) = 0.1637207E1 * (0.123E4, ~0.27182817E1) = ~0.33434866E4 + (0.123E4, ~0.27182817E1) = 0.12272817E4 - (0.123E4, ~0.27182817E1) = 0.12327183E4 / (0.123E4, ~0.27182817E1) = ~0.45249173E3 nextAfter (0.123E4, ~0.27182817E1) = 0.12299999E4 rem (0.123E4, ~0.27182817E1) = 0.13366699E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129001E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129001E1 + (0.123E4, ~0.123E~2) = 0.12299988E4 - (0.123E4, ~0.123E~2) = 0.12300012E4 / (0.123E4, ~0.123E~2) = ~0.99999994E6 nextAfter (0.123E4, ~0.123E~2) = 0.12299999E4 rem (0.123E4, ~0.123E~2) = 0.12207031E~2 * (0.123E4, ~0.11754944E~37) = ~0.1445858E~34 + (0.123E4, ~0.11754944E~37) = 0.123E4 - (0.123E4, ~0.11754944E~37) = 0.123E4 / (0.123E4, ~0.11754944E~37) = ~inf nextAfter (0.123E4, ~0.11754944E~37) = 0.12299999E4 rem (0.123E4, ~0.11754944E~37) = ~inf * (0.123E4, ~0.5877472E~38) = ~0.722929E~35 + (0.123E4, ~0.5877472E~38) = 0.123E4 - (0.123E4, ~0.5877472E~38) = 0.123E4 / (0.123E4, ~0.5877472E~38) = ~inf nextAfter (0.123E4, ~0.5877472E~38) = 0.12299999E4 rem (0.123E4, ~0.5877472E~38) = ~inf * (0.123E4, ~0.1E~44) = ~0.1724E~41 + (0.123E4, ~0.1E~44) = 0.123E4 - (0.123E4, ~0.1E~44) = 0.123E4 / (0.123E4, ~0.1E~44) = ~inf nextAfter (0.123E4, ~0.1E~44) = 0.12299999E4 rem (0.123E4, ~0.1E~44) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.34028235E39) = inf + (0.123E2, 0.34028235E39) = 0.34028235E39 - (0.123E2, 0.34028235E39) = ~0.34028235E39 / (0.123E2, 0.34028235E39) = 0.36146455E~37 nextAfter (0.123E2, 0.34028235E39) = 0.12300001E2 rem (0.123E2, 0.34028235E39) = 0.123E2 * (0.123E2, 0.17014117E39) = inf + (0.123E2, 0.17014117E39) = 0.17014117E39 - (0.123E2, 0.17014117E39) = ~0.17014117E39 / (0.123E2, 0.17014117E39) = 0.7229291E~37 nextAfter (0.123E2, 0.17014117E39) = 0.12300001E2 rem (0.123E2, 0.17014117E39) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300001E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129001E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.31415927E1) = 0.3864159E2 + (0.123E2, 0.31415927E1) = 0.15441593E2 - (0.123E2, 0.31415927E1) = 0.9158407E1 / (0.123E2, 0.31415927E1) = 0.39152114E1 nextAfter (0.123E2, 0.31415927E1) = 0.12299999E2 rem (0.123E2, 0.31415927E1) = 0.28752222E1 * (0.123E2, 0.27182817E1) = 0.33434868E2 + (0.123E2, 0.27182817E1) = 0.15018282E2 - (0.123E2, 0.27182817E1) = 0.9581718E1 / (0.123E2, 0.27182817E1) = 0.4524917E1 nextAfter (0.123E2, 0.27182817E1) = 0.12299999E2 rem (0.123E2, 0.27182817E1) = 0.14268732E1 * (0.123E2, 0.123E1) = 0.15129001E2 + (0.123E2, 0.123E1) = 0.13530001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177E2 / (0.123E2, 0.123) = 0.1E3 nextAfter (0.123E2, 0.123) = 0.12299999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129001E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.1229877E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999E2 rem (0.123E2, 0.123E~2) = 0.0 * (0.123E2, 0.11754944E~37) = 0.14458581E~36 + (0.123E2, 0.11754944E~37) = 0.123E2 - (0.123E2, 0.11754944E~37) = 0.123E2 / (0.123E2, 0.11754944E~37) = inf nextAfter (0.123E2, 0.11754944E~37) = 0.12299999E2 rem (0.123E2, 0.11754944E~37) = ~inf * (0.123E2, 0.5877472E~38) = 0.72292904E~37 + (0.123E2, 0.5877472E~38) = 0.123E2 - (0.123E2, 0.5877472E~38) = 0.123E2 / (0.123E2, 0.5877472E~38) = inf nextAfter (0.123E2, 0.5877472E~38) = 0.12299999E2 rem (0.123E2, 0.5877472E~38) = ~inf * (0.123E2, 0.1E~44) = 0.17E~43 + (0.123E2, 0.1E~44) = 0.123E2 - (0.123E2, 0.1E~44) = 0.123E2 / (0.123E2, 0.1E~44) = inf nextAfter (0.123E2, 0.1E~44) = 0.12299999E2 rem (0.123E2, 0.1E~44) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.34028235E39) = ~inf + (0.123E2, ~0.34028235E39) = ~0.34028235E39 - (0.123E2, ~0.34028235E39) = 0.34028235E39 / (0.123E2, ~0.34028235E39) = ~0.36146455E~37 nextAfter (0.123E2, ~0.34028235E39) = 0.12299999E2 rem (0.123E2, ~0.34028235E39) = 0.123E2 * (0.123E2, ~0.17014117E39) = ~inf + (0.123E2, ~0.17014117E39) = ~0.17014117E39 - (0.123E2, ~0.17014117E39) = 0.17014117E39 / (0.123E2, ~0.17014117E39) = ~0.7229291E~37 nextAfter (0.123E2, ~0.17014117E39) = 0.12299999E2 rem (0.123E2, ~0.17014117E39) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129001E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.31415927E1) = ~0.3864159E2 + (0.123E2, ~0.31415927E1) = 0.9158407E1 - (0.123E2, ~0.31415927E1) = 0.15441593E2 / (0.123E2, ~0.31415927E1) = ~0.39152114E1 nextAfter (0.123E2, ~0.31415927E1) = 0.12299999E2 rem (0.123E2, ~0.31415927E1) = 0.28752222E1 * (0.123E2, ~0.27182817E1) = ~0.33434868E2 + (0.123E2, ~0.27182817E1) = 0.9581718E1 - (0.123E2, ~0.27182817E1) = 0.15018282E2 / (0.123E2, ~0.27182817E1) = ~0.4524917E1 nextAfter (0.123E2, ~0.27182817E1) = 0.12299999E2 rem (0.123E2, ~0.27182817E1) = 0.14268732E1 * (0.123E2, ~0.123E1) = ~0.15129001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129001E1 + (0.123E2, ~0.123) = 0.12177E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.1E3 nextAfter (0.123E2, ~0.123) = 0.12299999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129001E~1 + (0.123E2, ~0.123E~2) = 0.1229877E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999E2 rem (0.123E2, ~0.123E~2) = 0.0 * (0.123E2, ~0.11754944E~37) = ~0.14458581E~36 + (0.123E2, ~0.11754944E~37) = 0.123E2 - (0.123E2, ~0.11754944E~37) = 0.123E2 / (0.123E2, ~0.11754944E~37) = ~inf nextAfter (0.123E2, ~0.11754944E~37) = 0.12299999E2 rem (0.123E2, ~0.11754944E~37) = ~inf * (0.123E2, ~0.5877472E~38) = ~0.72292904E~37 + (0.123E2, ~0.5877472E~38) = 0.123E2 - (0.123E2, ~0.5877472E~38) = 0.123E2 / (0.123E2, ~0.5877472E~38) = ~inf nextAfter (0.123E2, ~0.5877472E~38) = 0.12299999E2 rem (0.123E2, ~0.5877472E~38) = ~inf * (0.123E2, ~0.1E~44) = ~0.17E~43 + (0.123E2, ~0.1E~44) = 0.123E2 - (0.123E2, ~0.1E~44) = 0.123E2 / (0.123E2, ~0.1E~44) = ~inf nextAfter (0.123E2, ~0.1E~44) = 0.12299999E2 rem (0.123E2, ~0.1E~44) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.31415927E1, 0.34028235E39) = inf + (0.31415927E1, 0.34028235E39) = 0.34028235E39 - (0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (0.31415927E1, 0.34028235E39) = 0.9232312E~38 nextAfter (0.31415927E1, 0.34028235E39) = 0.3141593E1 rem (0.31415927E1, 0.34028235E39) = 0.31415927E1 * (0.31415927E1, 0.17014117E39) = inf + (0.31415927E1, 0.17014117E39) = 0.17014117E39 - (0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (0.31415927E1, 0.17014117E39) = 0.18464624E~37 nextAfter (0.31415927E1, 0.17014117E39) = 0.3141593E1 rem (0.31415927E1, 0.17014117E39) = 0.31415927E1 * (0.31415927E1, 0.123E4) = 0.38641592E4 + (0.31415927E1, 0.123E4) = 0.12331416E4 - (0.31415927E1, 0.123E4) = ~0.12268584E4 / (0.31415927E1, 0.123E4) = 0.25541405E~2 nextAfter (0.31415927E1, 0.123E4) = 0.3141593E1 rem (0.31415927E1, 0.123E4) = 0.31415927E1 * (0.31415927E1, 0.123E2) = 0.3864159E2 + (0.31415927E1, 0.123E2) = 0.15441593E2 - (0.31415927E1, 0.123E2) = ~0.9158407E1 / (0.31415927E1, 0.123E2) = 0.25541404 nextAfter (0.31415927E1, 0.123E2) = 0.3141593E1 rem (0.31415927E1, 0.123E2) = 0.31415927E1 * (0.31415927E1, 0.31415927E1) = 0.9869605E1 + (0.31415927E1, 0.31415927E1) = 0.62831855E1 - (0.31415927E1, 0.31415927E1) = 0.0 / (0.31415927E1, 0.31415927E1) = 0.1E1 nextAfter (0.31415927E1, 0.31415927E1) = 0.31415927E1 rem (0.31415927E1, 0.31415927E1) = 0.0 * (0.31415927E1, 0.27182817E1) = 0.8539734E1 + (0.31415927E1, 0.27182817E1) = 0.58598747E1 - (0.31415927E1, 0.27182817E1) = 0.423311 / (0.31415927E1, 0.27182817E1) = 0.11557274E1 nextAfter (0.31415927E1, 0.27182817E1) = 0.31415925E1 rem (0.31415927E1, 0.27182817E1) = 0.423311 * (0.31415927E1, 0.123E1) = 0.3864159E1 + (0.31415927E1, 0.123E1) = 0.43715925E1 - (0.31415927E1, 0.123E1) = 0.19115927E1 / (0.31415927E1, 0.123E1) = 0.25541403E1 nextAfter (0.31415927E1, 0.123E1) = 0.31415925E1 rem (0.31415927E1, 0.123E1) = 0.6815927 * (0.31415927E1, 0.123) = 0.38641593 + (0.31415927E1, 0.123) = 0.32645926E1 - (0.31415927E1, 0.123) = 0.30185928E1 / (0.31415927E1, 0.123) = 0.25541403E2 nextAfter (0.31415927E1, 0.123) = 0.31415925E1 rem (0.31415927E1, 0.123) = 0.6659269E~1 * (0.31415927E1, 0.123E~2) = 0.38641593E~2 + (0.31415927E1, 0.123E~2) = 0.31428227E1 - (0.31415927E1, 0.123E~2) = 0.31403627E1 / (0.31415927E1, 0.123E~2) = 0.25541404E4 nextAfter (0.31415927E1, 0.123E~2) = 0.31415925E1 rem (0.31415927E1, 0.123E~2) = 0.17261505E~3 * (0.31415927E1, 0.11754944E~37) = 0.36929245E~37 + (0.31415927E1, 0.11754944E~37) = 0.31415927E1 - (0.31415927E1, 0.11754944E~37) = 0.31415927E1 / (0.31415927E1, 0.11754944E~37) = 0.26725715E39 nextAfter (0.31415927E1, 0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, 0.11754944E~37) = 0.0 * (0.31415927E1, 0.5877472E~38) = 0.18464623E~37 + (0.31415927E1, 0.5877472E~38) = 0.31415927E1 - (0.31415927E1, 0.5877472E~38) = 0.31415927E1 / (0.31415927E1, 0.5877472E~38) = inf nextAfter (0.31415927E1, 0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, 0.5877472E~38) = ~inf * (0.31415927E1, 0.1E~44) = 0.4E~44 + (0.31415927E1, 0.1E~44) = 0.31415927E1 - (0.31415927E1, 0.1E~44) = 0.31415927E1 / (0.31415927E1, 0.1E~44) = inf nextAfter (0.31415927E1, 0.1E~44) = 0.31415925E1 rem (0.31415927E1, 0.1E~44) = ~inf * (0.31415927E1, 0.0) = 0.0 + (0.31415927E1, 0.0) = 0.31415927E1 - (0.31415927E1, 0.0) = 0.31415927E1 / (0.31415927E1, 0.0) = inf nextAfter (0.31415927E1, 0.0) = 0.31415925E1 rem (0.31415927E1, 0.0) = nan * (0.31415927E1, ~0.34028235E39) = ~inf + (0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (0.31415927E1, ~0.34028235E39) = ~0.9232312E~38 nextAfter (0.31415927E1, ~0.34028235E39) = 0.31415925E1 rem (0.31415927E1, ~0.34028235E39) = 0.31415927E1 * (0.31415927E1, ~0.17014117E39) = ~inf + (0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (0.31415927E1, ~0.17014117E39) = ~0.18464624E~37 nextAfter (0.31415927E1, ~0.17014117E39) = 0.31415925E1 rem (0.31415927E1, ~0.17014117E39) = 0.31415927E1 * (0.31415927E1, ~0.123E4) = ~0.38641592E4 + (0.31415927E1, ~0.123E4) = ~0.12268584E4 - (0.31415927E1, ~0.123E4) = 0.12331416E4 / (0.31415927E1, ~0.123E4) = ~0.25541405E~2 nextAfter (0.31415927E1, ~0.123E4) = 0.31415925E1 rem (0.31415927E1, ~0.123E4) = 0.31415927E1 * (0.31415927E1, ~0.123E2) = ~0.3864159E2 + (0.31415927E1, ~0.123E2) = ~0.9158407E1 - (0.31415927E1, ~0.123E2) = 0.15441593E2 / (0.31415927E1, ~0.123E2) = ~0.25541404 nextAfter (0.31415927E1, ~0.123E2) = 0.31415925E1 rem (0.31415927E1, ~0.123E2) = 0.31415927E1 * (0.31415927E1, ~0.31415927E1) = ~0.9869605E1 + (0.31415927E1, ~0.31415927E1) = 0.0 - (0.31415927E1, ~0.31415927E1) = 0.62831855E1 / (0.31415927E1, ~0.31415927E1) = ~0.1E1 nextAfter (0.31415927E1, ~0.31415927E1) = 0.31415925E1 rem (0.31415927E1, ~0.31415927E1) = 0.0 * (0.31415927E1, ~0.27182817E1) = ~0.8539734E1 + (0.31415927E1, ~0.27182817E1) = 0.423311 - (0.31415927E1, ~0.27182817E1) = 0.58598747E1 / (0.31415927E1, ~0.27182817E1) = ~0.11557274E1 nextAfter (0.31415927E1, ~0.27182817E1) = 0.31415925E1 rem (0.31415927E1, ~0.27182817E1) = 0.423311 * (0.31415927E1, ~0.123E1) = ~0.3864159E1 + (0.31415927E1, ~0.123E1) = 0.19115927E1 - (0.31415927E1, ~0.123E1) = 0.43715925E1 / (0.31415927E1, ~0.123E1) = ~0.25541403E1 nextAfter (0.31415927E1, ~0.123E1) = 0.31415925E1 rem (0.31415927E1, ~0.123E1) = 0.6815927 * (0.31415927E1, ~0.123) = ~0.38641593 + (0.31415927E1, ~0.123) = 0.30185928E1 - (0.31415927E1, ~0.123) = 0.32645926E1 / (0.31415927E1, ~0.123) = ~0.25541403E2 nextAfter (0.31415927E1, ~0.123) = 0.31415925E1 rem (0.31415927E1, ~0.123) = 0.6659269E~1 * (0.31415927E1, ~0.123E~2) = ~0.38641593E~2 + (0.31415927E1, ~0.123E~2) = 0.31403627E1 - (0.31415927E1, ~0.123E~2) = 0.31428227E1 / (0.31415927E1, ~0.123E~2) = ~0.25541404E4 nextAfter (0.31415927E1, ~0.123E~2) = 0.31415925E1 rem (0.31415927E1, ~0.123E~2) = 0.17261505E~3 * (0.31415927E1, ~0.11754944E~37) = ~0.36929245E~37 + (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 - (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 / (0.31415927E1, ~0.11754944E~37) = ~0.26725715E39 nextAfter (0.31415927E1, ~0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, ~0.11754944E~37) = 0.0 * (0.31415927E1, ~0.5877472E~38) = ~0.18464623E~37 + (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 - (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 / (0.31415927E1, ~0.5877472E~38) = ~inf nextAfter (0.31415927E1, ~0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, ~0.5877472E~38) = ~inf * (0.31415927E1, ~0.1E~44) = ~0.4E~44 + (0.31415927E1, ~0.1E~44) = 0.31415927E1 - (0.31415927E1, ~0.1E~44) = 0.31415927E1 / (0.31415927E1, ~0.1E~44) = ~inf nextAfter (0.31415927E1, ~0.1E~44) = 0.31415925E1 rem (0.31415927E1, ~0.1E~44) = ~inf * (0.31415927E1, ~0.0) = ~0.0 + (0.31415927E1, ~0.0) = 0.31415927E1 - (0.31415927E1, ~0.0) = 0.31415927E1 / (0.31415927E1, ~0.0) = ~inf nextAfter (0.31415927E1, ~0.0) = 0.31415925E1 rem (0.31415927E1, ~0.0) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.31415927E1, ~inf) = ~inf + (0.31415927E1, ~inf) = ~inf - (0.31415927E1, ~inf) = inf / (0.31415927E1, ~inf) = ~0.0 nextAfter (0.31415927E1, ~inf) = 0.31415925E1 rem (0.31415927E1, ~inf) = 0.31415927E1 * (0.31415927E1, nan) = nan + (0.31415927E1, nan) = nan - (0.31415927E1, nan) = nan / (0.31415927E1, nan) = nan nextAfter (0.31415927E1, nan) = nan rem (0.31415927E1, nan) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.27182817E1, 0.34028235E39) = inf + (0.27182817E1, 0.34028235E39) = 0.34028235E39 - (0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (0.27182817E1, 0.34028235E39) = 0.7988312E~38 nextAfter (0.27182817E1, 0.34028235E39) = 0.2718282E1 rem (0.27182817E1, 0.34028235E39) = 0.27182817E1 * (0.27182817E1, 0.17014117E39) = inf + (0.27182817E1, 0.17014117E39) = 0.17014117E39 - (0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (0.27182817E1, 0.17014117E39) = 0.15976626E~37 nextAfter (0.27182817E1, 0.17014117E39) = 0.2718282E1 rem (0.27182817E1, 0.17014117E39) = 0.27182817E1 * (0.27182817E1, 0.123E4) = 0.33434866E4 + (0.27182817E1, 0.123E4) = 0.12327183E4 - (0.27182817E1, 0.123E4) = ~0.12272817E4 / (0.27182817E1, 0.123E4) = 0.22099852E~2 nextAfter (0.27182817E1, 0.123E4) = 0.2718282E1 rem (0.27182817E1, 0.123E4) = 0.27182817E1 * (0.27182817E1, 0.123E2) = 0.33434868E2 + (0.27182817E1, 0.123E2) = 0.15018282E2 - (0.27182817E1, 0.123E2) = ~0.9581718E1 / (0.27182817E1, 0.123E2) = 0.22099851 nextAfter (0.27182817E1, 0.123E2) = 0.2718282E1 rem (0.27182817E1, 0.123E2) = 0.27182817E1 * (0.27182817E1, 0.31415927E1) = 0.8539734E1 + (0.27182817E1, 0.31415927E1) = 0.58598747E1 - (0.27182817E1, 0.31415927E1) = ~0.423311 / (0.27182817E1, 0.31415927E1) = 0.86525595 nextAfter (0.27182817E1, 0.31415927E1) = 0.2718282E1 rem (0.27182817E1, 0.31415927E1) = 0.27182817E1 * (0.27182817E1, 0.27182817E1) = 0.73890557E1 + (0.27182817E1, 0.27182817E1) = 0.54365635E1 - (0.27182817E1, 0.27182817E1) = 0.0 / (0.27182817E1, 0.27182817E1) = 0.1E1 nextAfter (0.27182817E1, 0.27182817E1) = 0.27182817E1 rem (0.27182817E1, 0.27182817E1) = 0.0 * (0.27182817E1, 0.123E1) = 0.33434865E1 + (0.27182817E1, 0.123E1) = 0.39482818E1 - (0.27182817E1, 0.123E1) = 0.14882817E1 / (0.27182817E1, 0.123E1) = 0.2209985E1 nextAfter (0.27182817E1, 0.123E1) = 0.27182815E1 rem (0.27182817E1, 0.123E1) = 0.2582817 * (0.27182817E1, 0.123) = 0.33434868 + (0.27182817E1, 0.123) = 0.28412817E1 - (0.27182817E1, 0.123) = 0.25952818E1 / (0.27182817E1, 0.123) = 0.22099852E2 nextAfter (0.27182817E1, 0.123) = 0.27182815E1 rem (0.27182817E1, 0.123) = 0.12281656E~1 * (0.27182817E1, 0.123E~2) = 0.33434867E~2 + (0.27182817E1, 0.123E~2) = 0.27195117E1 - (0.27182817E1, 0.123E~2) = 0.27170517E1 / (0.27182817E1, 0.123E~2) = 0.2209985E4 nextAfter (0.27182817E1, 0.123E~2) = 0.27182815E1 rem (0.27182817E1, 0.123E~2) = 0.12116432E~2 * (0.27182817E1, 0.11754944E~37) = 0.31953248E~37 + (0.27182817E1, 0.11754944E~37) = 0.27182817E1 - (0.27182817E1, 0.11754944E~37) = 0.27182817E1 / (0.27182817E1, 0.11754944E~37) = 0.23124584E39 nextAfter (0.27182817E1, 0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, 0.11754944E~37) = 0.0 * (0.27182817E1, 0.5877472E~38) = 0.15976624E~37 + (0.27182817E1, 0.5877472E~38) = 0.27182817E1 - (0.27182817E1, 0.5877472E~38) = 0.27182817E1 / (0.27182817E1, 0.5877472E~38) = inf nextAfter (0.27182817E1, 0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, 0.5877472E~38) = ~inf * (0.27182817E1, 0.1E~44) = 0.4E~44 + (0.27182817E1, 0.1E~44) = 0.27182817E1 - (0.27182817E1, 0.1E~44) = 0.27182817E1 / (0.27182817E1, 0.1E~44) = inf nextAfter (0.27182817E1, 0.1E~44) = 0.27182815E1 rem (0.27182817E1, 0.1E~44) = ~inf * (0.27182817E1, 0.0) = 0.0 + (0.27182817E1, 0.0) = 0.27182817E1 - (0.27182817E1, 0.0) = 0.27182817E1 / (0.27182817E1, 0.0) = inf nextAfter (0.27182817E1, 0.0) = 0.27182815E1 rem (0.27182817E1, 0.0) = nan * (0.27182817E1, ~0.34028235E39) = ~inf + (0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (0.27182817E1, ~0.34028235E39) = ~0.7988312E~38 nextAfter (0.27182817E1, ~0.34028235E39) = 0.27182815E1 rem (0.27182817E1, ~0.34028235E39) = 0.27182817E1 * (0.27182817E1, ~0.17014117E39) = ~inf + (0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (0.27182817E1, ~0.17014117E39) = ~0.15976626E~37 nextAfter (0.27182817E1, ~0.17014117E39) = 0.27182815E1 rem (0.27182817E1, ~0.17014117E39) = 0.27182817E1 * (0.27182817E1, ~0.123E4) = ~0.33434866E4 + (0.27182817E1, ~0.123E4) = ~0.12272817E4 - (0.27182817E1, ~0.123E4) = 0.12327183E4 / (0.27182817E1, ~0.123E4) = ~0.22099852E~2 nextAfter (0.27182817E1, ~0.123E4) = 0.27182815E1 rem (0.27182817E1, ~0.123E4) = 0.27182817E1 * (0.27182817E1, ~0.123E2) = ~0.33434868E2 + (0.27182817E1, ~0.123E2) = ~0.9581718E1 - (0.27182817E1, ~0.123E2) = 0.15018282E2 / (0.27182817E1, ~0.123E2) = ~0.22099851 nextAfter (0.27182817E1, ~0.123E2) = 0.27182815E1 rem (0.27182817E1, ~0.123E2) = 0.27182817E1 * (0.27182817E1, ~0.31415927E1) = ~0.8539734E1 + (0.27182817E1, ~0.31415927E1) = ~0.423311 - (0.27182817E1, ~0.31415927E1) = 0.58598747E1 / (0.27182817E1, ~0.31415927E1) = ~0.86525595 nextAfter (0.27182817E1, ~0.31415927E1) = 0.27182815E1 rem (0.27182817E1, ~0.31415927E1) = 0.27182817E1 * (0.27182817E1, ~0.27182817E1) = ~0.73890557E1 + (0.27182817E1, ~0.27182817E1) = 0.0 - (0.27182817E1, ~0.27182817E1) = 0.54365635E1 / (0.27182817E1, ~0.27182817E1) = ~0.1E1 nextAfter (0.27182817E1, ~0.27182817E1) = 0.27182815E1 rem (0.27182817E1, ~0.27182817E1) = 0.0 * (0.27182817E1, ~0.123E1) = ~0.33434865E1 + (0.27182817E1, ~0.123E1) = 0.14882817E1 - (0.27182817E1, ~0.123E1) = 0.39482818E1 / (0.27182817E1, ~0.123E1) = ~0.2209985E1 nextAfter (0.27182817E1, ~0.123E1) = 0.27182815E1 rem (0.27182817E1, ~0.123E1) = 0.2582817 * (0.27182817E1, ~0.123) = ~0.33434868 + (0.27182817E1, ~0.123) = 0.25952818E1 - (0.27182817E1, ~0.123) = 0.28412817E1 / (0.27182817E1, ~0.123) = ~0.22099852E2 nextAfter (0.27182817E1, ~0.123) = 0.27182815E1 rem (0.27182817E1, ~0.123) = 0.12281656E~1 * (0.27182817E1, ~0.123E~2) = ~0.33434867E~2 + (0.27182817E1, ~0.123E~2) = 0.27170517E1 - (0.27182817E1, ~0.123E~2) = 0.27195117E1 / (0.27182817E1, ~0.123E~2) = ~0.2209985E4 nextAfter (0.27182817E1, ~0.123E~2) = 0.27182815E1 rem (0.27182817E1, ~0.123E~2) = 0.12116432E~2 * (0.27182817E1, ~0.11754944E~37) = ~0.31953248E~37 + (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 - (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 / (0.27182817E1, ~0.11754944E~37) = ~0.23124584E39 nextAfter (0.27182817E1, ~0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, ~0.11754944E~37) = 0.0 * (0.27182817E1, ~0.5877472E~38) = ~0.15976624E~37 + (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 - (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 / (0.27182817E1, ~0.5877472E~38) = ~inf nextAfter (0.27182817E1, ~0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, ~0.5877472E~38) = ~inf * (0.27182817E1, ~0.1E~44) = ~0.4E~44 + (0.27182817E1, ~0.1E~44) = 0.27182817E1 - (0.27182817E1, ~0.1E~44) = 0.27182817E1 / (0.27182817E1, ~0.1E~44) = ~inf nextAfter (0.27182817E1, ~0.1E~44) = 0.27182815E1 rem (0.27182817E1, ~0.1E~44) = ~inf * (0.27182817E1, ~0.0) = ~0.0 + (0.27182817E1, ~0.0) = 0.27182817E1 - (0.27182817E1, ~0.0) = 0.27182817E1 / (0.27182817E1, ~0.0) = ~inf nextAfter (0.27182817E1, ~0.0) = 0.27182815E1 rem (0.27182817E1, ~0.0) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.27182817E1, ~inf) = ~inf + (0.27182817E1, ~inf) = ~inf - (0.27182817E1, ~inf) = inf / (0.27182817E1, ~inf) = ~0.0 nextAfter (0.27182817E1, ~inf) = 0.27182815E1 rem (0.27182817E1, ~inf) = 0.27182817E1 * (0.27182817E1, nan) = nan + (0.27182817E1, nan) = nan - (0.27182817E1, nan) = nan / (0.27182817E1, nan) = nan nextAfter (0.27182817E1, nan) = nan rem (0.27182817E1, nan) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.123E1, 0.34028235E39) = inf + (0.123E1, 0.34028235E39) = 0.34028235E39 - (0.123E1, 0.34028235E39) = ~0.34028235E39 / (0.123E1, 0.34028235E39) = 0.3614645E~38 nextAfter (0.123E1, 0.34028235E39) = 0.12300001E1 rem (0.123E1, 0.34028235E39) = 0.123E1 * (0.123E1, 0.17014117E39) = 0.20927364E39 + (0.123E1, 0.17014117E39) = 0.17014117E39 - (0.123E1, 0.17014117E39) = ~0.17014117E39 / (0.123E1, 0.17014117E39) = 0.722929E~38 nextAfter (0.123E1, 0.17014117E39) = 0.12300001E1 rem (0.123E1, 0.17014117E39) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300001E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129001E2 + (0.123E1, 0.123E2) = 0.13530001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.1 nextAfter (0.123E1, 0.123E2) = 0.12300001E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.31415927E1) = 0.3864159E1 + (0.123E1, 0.31415927E1) = 0.43715925E1 - (0.123E1, 0.31415927E1) = ~0.19115927E1 / (0.123E1, 0.31415927E1) = 0.39152116 nextAfter (0.123E1, 0.31415927E1) = 0.12300001E1 rem (0.123E1, 0.31415927E1) = 0.123E1 * (0.123E1, 0.27182817E1) = 0.33434865E1 + (0.123E1, 0.27182817E1) = 0.39482818E1 - (0.123E1, 0.27182817E1) = ~0.14882817E1 / (0.123E1, 0.27182817E1) = 0.45249173 nextAfter (0.123E1, 0.27182817E1) = 0.12300001E1 rem (0.123E1, 0.27182817E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129001E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.11754944E~37) = 0.14458581E~37 + (0.123E1, 0.11754944E~37) = 0.123E1 - (0.123E1, 0.11754944E~37) = 0.123E1 / (0.123E1, 0.11754944E~37) = 0.10463683E39 nextAfter (0.123E1, 0.11754944E~37) = 0.12299999E1 rem (0.123E1, 0.11754944E~37) = 0.0 * (0.123E1, 0.5877472E~38) = 0.722929E~38 + (0.123E1, 0.5877472E~38) = 0.123E1 - (0.123E1, 0.5877472E~38) = 0.123E1 / (0.123E1, 0.5877472E~38) = 0.20927366E39 nextAfter (0.123E1, 0.5877472E~38) = 0.12299999E1 rem (0.123E1, 0.5877472E~38) = 0.0 * (0.123E1, 0.1E~44) = 0.1E~44 + (0.123E1, 0.1E~44) = 0.123E1 - (0.123E1, 0.1E~44) = 0.123E1 / (0.123E1, 0.1E~44) = inf nextAfter (0.123E1, 0.1E~44) = 0.12299999E1 rem (0.123E1, 0.1E~44) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.34028235E39) = ~inf + (0.123E1, ~0.34028235E39) = ~0.34028235E39 - (0.123E1, ~0.34028235E39) = 0.34028235E39 / (0.123E1, ~0.34028235E39) = ~0.3614645E~38 nextAfter (0.123E1, ~0.34028235E39) = 0.12299999E1 rem (0.123E1, ~0.34028235E39) = 0.123E1 * (0.123E1, ~0.17014117E39) = ~0.20927364E39 + (0.123E1, ~0.17014117E39) = ~0.17014117E39 - (0.123E1, ~0.17014117E39) = 0.17014117E39 / (0.123E1, ~0.17014117E39) = ~0.722929E~38 nextAfter (0.123E1, ~0.17014117E39) = 0.12299999E1 rem (0.123E1, ~0.17014117E39) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530001E2 / (0.123E1, ~0.123E2) = ~0.1 nextAfter (0.123E1, ~0.123E2) = 0.12299999E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.31415927E1) = ~0.3864159E1 + (0.123E1, ~0.31415927E1) = ~0.19115927E1 - (0.123E1, ~0.31415927E1) = 0.43715925E1 / (0.123E1, ~0.31415927E1) = ~0.39152116 nextAfter (0.123E1, ~0.31415927E1) = 0.12299999E1 rem (0.123E1, ~0.31415927E1) = 0.123E1 * (0.123E1, ~0.27182817E1) = ~0.33434865E1 + (0.123E1, ~0.27182817E1) = ~0.14882817E1 - (0.123E1, ~0.27182817E1) = 0.39482818E1 / (0.123E1, ~0.27182817E1) = ~0.45249173 nextAfter (0.123E1, ~0.27182817E1) = 0.12299999E1 rem (0.123E1, ~0.27182817E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129001E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.11754944E~37) = ~0.14458581E~37 + (0.123E1, ~0.11754944E~37) = 0.123E1 - (0.123E1, ~0.11754944E~37) = 0.123E1 / (0.123E1, ~0.11754944E~37) = ~0.10463683E39 nextAfter (0.123E1, ~0.11754944E~37) = 0.12299999E1 rem (0.123E1, ~0.11754944E~37) = 0.0 * (0.123E1, ~0.5877472E~38) = ~0.722929E~38 + (0.123E1, ~0.5877472E~38) = 0.123E1 - (0.123E1, ~0.5877472E~38) = 0.123E1 / (0.123E1, ~0.5877472E~38) = ~0.20927366E39 nextAfter (0.123E1, ~0.5877472E~38) = 0.12299999E1 rem (0.123E1, ~0.5877472E~38) = 0.0 * (0.123E1, ~0.1E~44) = ~0.1E~44 + (0.123E1, ~0.1E~44) = 0.123E1 - (0.123E1, ~0.1E~44) = 0.123E1 / (0.123E1, ~0.1E~44) = ~inf nextAfter (0.123E1, ~0.1E~44) = 0.12299999E1 rem (0.123E1, ~0.1E~44) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.34028235E39) = 0.4185473E38 + (0.123, 0.34028235E39) = 0.34028235E39 - (0.123, 0.34028235E39) = ~0.34028235E39 / (0.123, 0.34028235E39) = 0.361465E~39 nextAfter (0.123, 0.34028235E39) = 0.12300001 rem (0.123, 0.34028235E39) = 0.123 * (0.123, 0.17014117E39) = 0.20927365E38 + (0.123, 0.17014117E39) = 0.17014117E39 - (0.123, 0.17014117E39) = ~0.17014117E39 / (0.123, 0.17014117E39) = 0.722928E~39 nextAfter (0.123, 0.17014117E39) = 0.12300001 rem (0.123, 0.17014117E39) = 0.123 * (0.123, 0.123E4) = 0.15129001E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.100000005E~3 nextAfter (0.123, 0.123E4) = 0.12300001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177E2 / (0.123, 0.123E2) = 0.1E~1 nextAfter (0.123, 0.123E2) = 0.12300001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.31415927E1) = 0.38641593 + (0.123, 0.31415927E1) = 0.32645926E1 - (0.123, 0.31415927E1) = ~0.30185928E1 / (0.123, 0.31415927E1) = 0.39152116E~1 nextAfter (0.123, 0.31415927E1) = 0.12300001 rem (0.123, 0.31415927E1) = 0.123 * (0.123, 0.27182817E1) = 0.33434868 + (0.123, 0.27182817E1) = 0.28412817E1 - (0.123, 0.27182817E1) = ~0.25952818E1 / (0.123, 0.27182817E1) = 0.45249175E~1 nextAfter (0.123, 0.27182817E1) = 0.12300001 rem (0.123, 0.27182817E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129001E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.124230005 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.122999996 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.11754944E~37) = 0.1445858E~38 + (0.123, 0.11754944E~37) = 0.123 - (0.123, 0.11754944E~37) = 0.123 / (0.123, 0.11754944E~37) = 0.10463683E38 nextAfter (0.123, 0.11754944E~37) = 0.122999996 rem (0.123, 0.11754944E~37) = 0.0 * (0.123, 0.5877472E~38) = 0.722928E~39 + (0.123, 0.5877472E~38) = 0.123 - (0.123, 0.5877472E~38) = 0.123 / (0.123, 0.5877472E~38) = 0.20927366E38 nextAfter (0.123, 0.5877472E~38) = 0.122999996 rem (0.123, 0.5877472E~38) = 0.0 * (0.123, 0.1E~44) = 0.0 + (0.123, 0.1E~44) = 0.123 - (0.123, 0.1E~44) = 0.123 / (0.123, 0.1E~44) = inf nextAfter (0.123, 0.1E~44) = 0.122999996 rem (0.123, 0.1E~44) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.122999996 rem (0.123, 0.0) = nan * (0.123, ~0.34028235E39) = ~0.4185473E38 + (0.123, ~0.34028235E39) = ~0.34028235E39 - (0.123, ~0.34028235E39) = 0.34028235E39 / (0.123, ~0.34028235E39) = ~0.361465E~39 nextAfter (0.123, ~0.34028235E39) = 0.122999996 rem (0.123, ~0.34028235E39) = 0.123 * (0.123, ~0.17014117E39) = ~0.20927365E38 + (0.123, ~0.17014117E39) = ~0.17014117E39 - (0.123, ~0.17014117E39) = 0.17014117E39 / (0.123, ~0.17014117E39) = ~0.722928E~39 nextAfter (0.123, ~0.17014117E39) = 0.122999996 rem (0.123, ~0.17014117E39) = 0.123 * (0.123, ~0.123E4) = ~0.15129001E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.100000005E~3 nextAfter (0.123, ~0.123E4) = 0.122999996 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129001E1 + (0.123, ~0.123E2) = ~0.12177E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.1E~1 nextAfter (0.123, ~0.123E2) = 0.122999996 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.31415927E1) = ~0.38641593 + (0.123, ~0.31415927E1) = ~0.30185928E1 - (0.123, ~0.31415927E1) = 0.32645926E1 / (0.123, ~0.31415927E1) = ~0.39152116E~1 nextAfter (0.123, ~0.31415927E1) = 0.122999996 rem (0.123, ~0.31415927E1) = 0.123 * (0.123, ~0.27182817E1) = ~0.33434868 + (0.123, ~0.27182817E1) = ~0.25952818E1 - (0.123, ~0.27182817E1) = 0.28412817E1 / (0.123, ~0.27182817E1) = ~0.45249175E~1 nextAfter (0.123, ~0.27182817E1) = 0.122999996 rem (0.123, ~0.27182817E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.122999996 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129001E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.122999996 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.124230005 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.122999996 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.11754944E~37) = ~0.1445858E~38 + (0.123, ~0.11754944E~37) = 0.123 - (0.123, ~0.11754944E~37) = 0.123 / (0.123, ~0.11754944E~37) = ~0.10463683E38 nextAfter (0.123, ~0.11754944E~37) = 0.122999996 rem (0.123, ~0.11754944E~37) = 0.0 * (0.123, ~0.5877472E~38) = ~0.722928E~39 + (0.123, ~0.5877472E~38) = 0.123 - (0.123, ~0.5877472E~38) = 0.123 / (0.123, ~0.5877472E~38) = ~0.20927366E38 nextAfter (0.123, ~0.5877472E~38) = 0.122999996 rem (0.123, ~0.5877472E~38) = 0.0 * (0.123, ~0.1E~44) = ~0.0 + (0.123, ~0.1E~44) = 0.123 - (0.123, ~0.1E~44) = 0.123 / (0.123, ~0.1E~44) = ~inf nextAfter (0.123, ~0.1E~44) = 0.122999996 rem (0.123, ~0.1E~44) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.122999996 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.122999996 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.34028235E39) = 0.4185473E36 + (0.123E~2, 0.34028235E39) = 0.34028235E39 - (0.123E~2, 0.34028235E39) = ~0.34028235E39 / (0.123E~2, 0.34028235E39) = 0.3614E~41 nextAfter (0.123E~2, 0.34028235E39) = 0.12300002E~2 rem (0.123E~2, 0.34028235E39) = 0.123E~2 * (0.123E~2, 0.17014117E39) = 0.20927364E36 + (0.123E~2, 0.17014117E39) = 0.17014117E39 - (0.123E~2, 0.17014117E39) = ~0.17014117E39 / (0.123E~2, 0.17014117E39) = 0.7229E~41 nextAfter (0.123E~2, 0.17014117E39) = 0.12300002E~2 rem (0.123E~2, 0.17014117E39) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129001E1 + (0.123E~2, 0.123E4) = 0.12300012E4 - (0.123E~2, 0.123E4) = ~0.12299988E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129001E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.1229877E2 / (0.123E~2, 0.123E2) = 0.100000005E~3 nextAfter (0.123E~2, 0.123E2) = 0.12300002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.31415927E1) = 0.38641593E~2 + (0.123E~2, 0.31415927E1) = 0.31428227E1 - (0.123E~2, 0.31415927E1) = ~0.31403627E1 / (0.123E~2, 0.31415927E1) = 0.39152117E~3 nextAfter (0.123E~2, 0.31415927E1) = 0.12300002E~2 rem (0.123E~2, 0.31415927E1) = 0.123E~2 * (0.123E~2, 0.27182817E1) = 0.33434867E~2 + (0.123E~2, 0.27182817E1) = 0.27195117E1 - (0.123E~2, 0.27182817E1) = ~0.27170517E1 / (0.123E~2, 0.27182817E1) = 0.45249175E~3 nextAfter (0.123E~2, 0.27182817E1) = 0.12300002E~2 rem (0.123E~2, 0.27182817E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129001E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.124230005 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129001E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.11754944E~37) = 0.14459E~40 + (0.123E~2, 0.11754944E~37) = 0.123E~2 - (0.123E~2, 0.11754944E~37) = 0.123E~2 / (0.123E~2, 0.11754944E~37) = 0.10463683E36 nextAfter (0.123E~2, 0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, 0.11754944E~37) = 0.0 * (0.123E~2, 0.5877472E~38) = 0.7229E~41 + (0.123E~2, 0.5877472E~38) = 0.123E~2 - (0.123E~2, 0.5877472E~38) = 0.123E~2 / (0.123E~2, 0.5877472E~38) = 0.20927366E36 nextAfter (0.123E~2, 0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, 0.5877472E~38) = 0.0 * (0.123E~2, 0.1E~44) = 0.0 + (0.123E~2, 0.1E~44) = 0.123E~2 - (0.123E~2, 0.1E~44) = 0.123E~2 / (0.123E~2, 0.1E~44) = inf nextAfter (0.123E~2, 0.1E~44) = 0.12299999E~2 rem (0.123E~2, 0.1E~44) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.34028235E39) = ~0.4185473E36 + (0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (0.123E~2, ~0.34028235E39) = 0.34028235E39 / (0.123E~2, ~0.34028235E39) = ~0.3614E~41 nextAfter (0.123E~2, ~0.34028235E39) = 0.12299999E~2 rem (0.123E~2, ~0.34028235E39) = 0.123E~2 * (0.123E~2, ~0.17014117E39) = ~0.20927364E36 + (0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (0.123E~2, ~0.17014117E39) = 0.17014117E39 / (0.123E~2, ~0.17014117E39) = ~0.7229E~41 nextAfter (0.123E~2, ~0.17014117E39) = 0.12299999E~2 rem (0.123E~2, ~0.17014117E39) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129001E1 + (0.123E~2, ~0.123E4) = ~0.12299988E4 - (0.123E~2, ~0.123E4) = 0.12300012E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129001E~1 + (0.123E~2, ~0.123E2) = ~0.1229877E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.100000005E~3 nextAfter (0.123E~2, ~0.123E2) = 0.12299999E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.31415927E1) = ~0.38641593E~2 + (0.123E~2, ~0.31415927E1) = ~0.31403627E1 - (0.123E~2, ~0.31415927E1) = 0.31428227E1 / (0.123E~2, ~0.31415927E1) = ~0.39152117E~3 nextAfter (0.123E~2, ~0.31415927E1) = 0.12299999E~2 rem (0.123E~2, ~0.31415927E1) = 0.123E~2 * (0.123E~2, ~0.27182817E1) = ~0.33434867E~2 + (0.123E~2, ~0.27182817E1) = ~0.27170517E1 - (0.123E~2, ~0.27182817E1) = 0.27195117E1 / (0.123E~2, ~0.27182817E1) = ~0.45249175E~3 nextAfter (0.123E~2, ~0.27182817E1) = 0.12299999E~2 rem (0.123E~2, ~0.27182817E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129001E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.124230005 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129001E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.11754944E~37) = ~0.14459E~40 + (0.123E~2, ~0.11754944E~37) = 0.123E~2 - (0.123E~2, ~0.11754944E~37) = 0.123E~2 / (0.123E~2, ~0.11754944E~37) = ~0.10463683E36 nextAfter (0.123E~2, ~0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, ~0.11754944E~37) = 0.0 * (0.123E~2, ~0.5877472E~38) = ~0.7229E~41 + (0.123E~2, ~0.5877472E~38) = 0.123E~2 - (0.123E~2, ~0.5877472E~38) = 0.123E~2 / (0.123E~2, ~0.5877472E~38) = ~0.20927366E36 nextAfter (0.123E~2, ~0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, ~0.5877472E~38) = 0.0 * (0.123E~2, ~0.1E~44) = ~0.0 + (0.123E~2, ~0.1E~44) = 0.123E~2 - (0.123E~2, ~0.1E~44) = 0.123E~2 / (0.123E~2, ~0.1E~44) = ~inf nextAfter (0.123E~2, ~0.1E~44) = 0.12299999E~2 rem (0.123E~2, ~0.1E~44) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.11754944E~37, 0.34028235E39) = 0.39999998E1 + (0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (0.11754944E~37, 0.34028235E39) = 0.0 nextAfter (0.11754944E~37, 0.34028235E39) = 0.11754945E~37 rem (0.11754944E~37, 0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, 0.17014117E39) = 0.19999999E1 + (0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (0.11754944E~37, 0.17014117E39) = 0.0 nextAfter (0.11754944E~37, 0.17014117E39) = 0.11754945E~37 rem (0.11754944E~37, 0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, 0.123E4) = 0.1445858E~34 + (0.11754944E~37, 0.123E4) = 0.123E4 - (0.11754944E~37, 0.123E4) = ~0.123E4 / (0.11754944E~37, 0.123E4) = 0.9557E~41 nextAfter (0.11754944E~37, 0.123E4) = 0.11754945E~37 rem (0.11754944E~37, 0.123E4) = 0.11754944E~37 * (0.11754944E~37, 0.123E2) = 0.14458581E~36 + (0.11754944E~37, 0.123E2) = 0.123E2 - (0.11754944E~37, 0.123E2) = ~0.123E2 / (0.11754944E~37, 0.123E2) = 0.955687E~39 nextAfter (0.11754944E~37, 0.123E2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E2) = 0.11754944E~37 * (0.11754944E~37, 0.31415927E1) = 0.36929245E~37 + (0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (0.11754944E~37, 0.31415927E1) = 0.3741715E~38 nextAfter (0.11754944E~37, 0.31415927E1) = 0.11754945E~37 rem (0.11754944E~37, 0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, 0.27182817E1) = 0.31953248E~37 + (0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (0.11754944E~37, 0.27182817E1) = 0.4324403E~38 nextAfter (0.11754944E~37, 0.27182817E1) = 0.11754945E~37 rem (0.11754944E~37, 0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, 0.123E1) = 0.14458581E~37 + (0.11754944E~37, 0.123E1) = 0.123E1 - (0.11754944E~37, 0.123E1) = ~0.123E1 / (0.11754944E~37, 0.123E1) = 0.9556864E~38 nextAfter (0.11754944E~37, 0.123E1) = 0.11754945E~37 rem (0.11754944E~37, 0.123E1) = 0.11754944E~37 * (0.11754944E~37, 0.123) = 0.1445858E~38 + (0.11754944E~37, 0.123) = 0.123 - (0.11754944E~37, 0.123) = ~0.123 / (0.11754944E~37, 0.123) = 0.9556864E~37 nextAfter (0.11754944E~37, 0.123) = 0.11754945E~37 rem (0.11754944E~37, 0.123) = 0.11754944E~37 * (0.11754944E~37, 0.123E~2) = 0.14459E~40 + (0.11754944E~37, 0.123E~2) = 0.123E~2 - (0.11754944E~37, 0.123E~2) = ~0.123E~2 / (0.11754944E~37, 0.123E~2) = 0.95568645E~35 nextAfter (0.11754944E~37, 0.123E~2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E~2) = 0.11754944E~37 * (0.11754944E~37, 0.11754944E~37) = 0.0 + (0.11754944E~37, 0.11754944E~37) = 0.23509887E~37 - (0.11754944E~37, 0.11754944E~37) = 0.0 / (0.11754944E~37, 0.11754944E~37) = 0.1E1 nextAfter (0.11754944E~37, 0.11754944E~37) = 0.11754944E~37 rem (0.11754944E~37, 0.11754944E~37) = 0.0 * (0.11754944E~37, 0.5877472E~38) = 0.0 + (0.11754944E~37, 0.5877472E~38) = 0.17632415E~37 - (0.11754944E~37, 0.5877472E~38) = 0.5877472E~38 / (0.11754944E~37, 0.5877472E~38) = 0.2E1 nextAfter (0.11754944E~37, 0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, 0.5877472E~38) = 0.0 * (0.11754944E~37, 0.1E~44) = 0.0 + (0.11754944E~37, 0.1E~44) = 0.11754945E~37 - (0.11754944E~37, 0.1E~44) = 0.11754942E~37 / (0.11754944E~37, 0.1E~44) = 0.8388608E7 nextAfter (0.11754944E~37, 0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, 0.1E~44) = 0.0 * (0.11754944E~37, 0.0) = 0.0 + (0.11754944E~37, 0.0) = 0.11754944E~37 - (0.11754944E~37, 0.0) = 0.11754944E~37 / (0.11754944E~37, 0.0) = inf nextAfter (0.11754944E~37, 0.0) = 0.11754942E~37 rem (0.11754944E~37, 0.0) = nan * (0.11754944E~37, ~0.34028235E39) = ~0.39999998E1 + (0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (0.11754944E~37, ~0.34028235E39) = ~0.0 nextAfter (0.11754944E~37, ~0.34028235E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, ~0.17014117E39) = ~0.19999999E1 + (0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (0.11754944E~37, ~0.17014117E39) = ~0.0 nextAfter (0.11754944E~37, ~0.17014117E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, ~0.123E4) = ~0.1445858E~34 + (0.11754944E~37, ~0.123E4) = ~0.123E4 - (0.11754944E~37, ~0.123E4) = 0.123E4 / (0.11754944E~37, ~0.123E4) = ~0.9557E~41 nextAfter (0.11754944E~37, ~0.123E4) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E4) = 0.11754944E~37 * (0.11754944E~37, ~0.123E2) = ~0.14458581E~36 + (0.11754944E~37, ~0.123E2) = ~0.123E2 - (0.11754944E~37, ~0.123E2) = 0.123E2 / (0.11754944E~37, ~0.123E2) = ~0.955687E~39 nextAfter (0.11754944E~37, ~0.123E2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E2) = 0.11754944E~37 * (0.11754944E~37, ~0.31415927E1) = ~0.36929245E~37 + (0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (0.11754944E~37, ~0.31415927E1) = ~0.3741715E~38 nextAfter (0.11754944E~37, ~0.31415927E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, ~0.27182817E1) = ~0.31953248E~37 + (0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (0.11754944E~37, ~0.27182817E1) = ~0.4324403E~38 nextAfter (0.11754944E~37, ~0.27182817E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123E1) = ~0.14458581E~37 + (0.11754944E~37, ~0.123E1) = ~0.123E1 - (0.11754944E~37, ~0.123E1) = 0.123E1 / (0.11754944E~37, ~0.123E1) = ~0.9556864E~38 nextAfter (0.11754944E~37, ~0.123E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123) = ~0.1445858E~38 + (0.11754944E~37, ~0.123) = ~0.123 - (0.11754944E~37, ~0.123) = 0.123 / (0.11754944E~37, ~0.123) = ~0.9556864E~37 nextAfter (0.11754944E~37, ~0.123) = 0.11754942E~37 rem (0.11754944E~37, ~0.123) = 0.11754944E~37 * (0.11754944E~37, ~0.123E~2) = ~0.14459E~40 + (0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (0.11754944E~37, ~0.123E~2) = 0.123E~2 / (0.11754944E~37, ~0.123E~2) = ~0.95568645E~35 nextAfter (0.11754944E~37, ~0.123E~2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E~2) = 0.11754944E~37 * (0.11754944E~37, ~0.11754944E~37) = ~0.0 + (0.11754944E~37, ~0.11754944E~37) = 0.0 - (0.11754944E~37, ~0.11754944E~37) = 0.23509887E~37 / (0.11754944E~37, ~0.11754944E~37) = ~0.1E1 nextAfter (0.11754944E~37, ~0.11754944E~37) = 0.11754942E~37 rem (0.11754944E~37, ~0.11754944E~37) = 0.0 * (0.11754944E~37, ~0.5877472E~38) = ~0.0 + (0.11754944E~37, ~0.5877472E~38) = 0.5877472E~38 - (0.11754944E~37, ~0.5877472E~38) = 0.17632415E~37 / (0.11754944E~37, ~0.5877472E~38) = ~0.2E1 nextAfter (0.11754944E~37, ~0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, ~0.5877472E~38) = 0.0 * (0.11754944E~37, ~0.1E~44) = ~0.0 + (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 - (0.11754944E~37, ~0.1E~44) = 0.11754945E~37 / (0.11754944E~37, ~0.1E~44) = ~0.8388608E7 nextAfter (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, ~0.1E~44) = 0.0 * (0.11754944E~37, ~0.0) = ~0.0 + (0.11754944E~37, ~0.0) = 0.11754944E~37 - (0.11754944E~37, ~0.0) = 0.11754944E~37 / (0.11754944E~37, ~0.0) = ~inf nextAfter (0.11754944E~37, ~0.0) = 0.11754942E~37 rem (0.11754944E~37, ~0.0) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.11754944E~37, ~inf) = ~inf + (0.11754944E~37, ~inf) = ~inf - (0.11754944E~37, ~inf) = inf / (0.11754944E~37, ~inf) = ~0.0 nextAfter (0.11754944E~37, ~inf) = 0.11754942E~37 rem (0.11754944E~37, ~inf) = 0.11754944E~37 * (0.11754944E~37, nan) = nan + (0.11754944E~37, nan) = nan - (0.11754944E~37, nan) = nan / (0.11754944E~37, nan) = nan nextAfter (0.11754944E~37, nan) = nan rem (0.11754944E~37, nan) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.5877472E~38, 0.34028235E39) = 0.19999999E1 + (0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (0.5877472E~38, 0.34028235E39) = 0.0 nextAfter (0.5877472E~38, 0.34028235E39) = 0.5877473E~38 rem (0.5877472E~38, 0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, 0.17014117E39) = 0.99999994 + (0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (0.5877472E~38, 0.17014117E39) = 0.0 nextAfter (0.5877472E~38, 0.17014117E39) = 0.5877473E~38 rem (0.5877472E~38, 0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, 0.123E4) = 0.722929E~35 + (0.5877472E~38, 0.123E4) = 0.123E4 - (0.5877472E~38, 0.123E4) = ~0.123E4 / (0.5877472E~38, 0.123E4) = 0.4778E~41 nextAfter (0.5877472E~38, 0.123E4) = 0.5877473E~38 rem (0.5877472E~38, 0.123E4) = 0.5877472E~38 * (0.5877472E~38, 0.123E2) = 0.72292904E~37 + (0.5877472E~38, 0.123E2) = 0.123E2 - (0.5877472E~38, 0.123E2) = ~0.123E2 / (0.5877472E~38, 0.123E2) = 0.477843E~39 nextAfter (0.5877472E~38, 0.123E2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E2) = 0.5877472E~38 * (0.5877472E~38, 0.31415927E1) = 0.18464623E~37 + (0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (0.5877472E~38, 0.31415927E1) = 0.1870857E~38 nextAfter (0.5877472E~38, 0.31415927E1) = 0.5877473E~38 rem (0.5877472E~38, 0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, 0.27182817E1) = 0.15976624E~37 + (0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (0.5877472E~38, 0.27182817E1) = 0.2162201E~38 nextAfter (0.5877472E~38, 0.27182817E1) = 0.5877473E~38 rem (0.5877472E~38, 0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, 0.123E1) = 0.722929E~38 + (0.5877472E~38, 0.123E1) = 0.123E1 - (0.5877472E~38, 0.123E1) = ~0.123E1 / (0.5877472E~38, 0.123E1) = 0.4778432E~38 nextAfter (0.5877472E~38, 0.123E1) = 0.5877473E~38 rem (0.5877472E~38, 0.123E1) = 0.5877472E~38 * (0.5877472E~38, 0.123) = 0.722928E~39 + (0.5877472E~38, 0.123) = 0.123 - (0.5877472E~38, 0.123) = ~0.123 / (0.5877472E~38, 0.123) = 0.4778432E~37 nextAfter (0.5877472E~38, 0.123) = 0.5877473E~38 rem (0.5877472E~38, 0.123) = 0.5877472E~38 * (0.5877472E~38, 0.123E~2) = 0.7229E~41 + (0.5877472E~38, 0.123E~2) = 0.123E~2 - (0.5877472E~38, 0.123E~2) = ~0.123E~2 / (0.5877472E~38, 0.123E~2) = 0.47784322E~35 nextAfter (0.5877472E~38, 0.123E~2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E~2) = 0.5877472E~38 * (0.5877472E~38, 0.11754944E~37) = 0.0 + (0.5877472E~38, 0.11754944E~37) = 0.17632415E~37 - (0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 / (0.5877472E~38, 0.11754944E~37) = 0.5 nextAfter (0.5877472E~38, 0.11754944E~37) = 0.5877473E~38 rem (0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, 0.5877472E~38) = 0.0 + (0.5877472E~38, 0.5877472E~38) = 0.11754944E~37 - (0.5877472E~38, 0.5877472E~38) = 0.0 / (0.5877472E~38, 0.5877472E~38) = 0.1E1 nextAfter (0.5877472E~38, 0.5877472E~38) = 0.5877472E~38 rem (0.5877472E~38, 0.5877472E~38) = 0.0 * (0.5877472E~38, 0.1E~44) = 0.0 + (0.5877472E~38, 0.1E~44) = 0.5877473E~38 - (0.5877472E~38, 0.1E~44) = 0.587747E~38 / (0.5877472E~38, 0.1E~44) = 0.4194304E7 nextAfter (0.5877472E~38, 0.1E~44) = 0.587747E~38 rem (0.5877472E~38, 0.1E~44) = 0.0 * (0.5877472E~38, 0.0) = 0.0 + (0.5877472E~38, 0.0) = 0.5877472E~38 - (0.5877472E~38, 0.0) = 0.5877472E~38 / (0.5877472E~38, 0.0) = inf nextAfter (0.5877472E~38, 0.0) = 0.587747E~38 rem (0.5877472E~38, 0.0) = nan * (0.5877472E~38, ~0.34028235E39) = ~0.19999999E1 + (0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (0.5877472E~38, ~0.34028235E39) = ~0.0 nextAfter (0.5877472E~38, ~0.34028235E39) = 0.587747E~38 rem (0.5877472E~38, ~0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, ~0.17014117E39) = ~0.99999994 + (0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (0.5877472E~38, ~0.17014117E39) = ~0.0 nextAfter (0.5877472E~38, ~0.17014117E39) = 0.587747E~38 rem (0.5877472E~38, ~0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, ~0.123E4) = ~0.722929E~35 + (0.5877472E~38, ~0.123E4) = ~0.123E4 - (0.5877472E~38, ~0.123E4) = 0.123E4 / (0.5877472E~38, ~0.123E4) = ~0.4778E~41 nextAfter (0.5877472E~38, ~0.123E4) = 0.587747E~38 rem (0.5877472E~38, ~0.123E4) = 0.5877472E~38 * (0.5877472E~38, ~0.123E2) = ~0.72292904E~37 + (0.5877472E~38, ~0.123E2) = ~0.123E2 - (0.5877472E~38, ~0.123E2) = 0.123E2 / (0.5877472E~38, ~0.123E2) = ~0.477843E~39 nextAfter (0.5877472E~38, ~0.123E2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E2) = 0.5877472E~38 * (0.5877472E~38, ~0.31415927E1) = ~0.18464623E~37 + (0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (0.5877472E~38, ~0.31415927E1) = ~0.1870857E~38 nextAfter (0.5877472E~38, ~0.31415927E1) = 0.587747E~38 rem (0.5877472E~38, ~0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, ~0.27182817E1) = ~0.15976624E~37 + (0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (0.5877472E~38, ~0.27182817E1) = ~0.2162201E~38 nextAfter (0.5877472E~38, ~0.27182817E1) = 0.587747E~38 rem (0.5877472E~38, ~0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123E1) = ~0.722929E~38 + (0.5877472E~38, ~0.123E1) = ~0.123E1 - (0.5877472E~38, ~0.123E1) = 0.123E1 / (0.5877472E~38, ~0.123E1) = ~0.4778432E~38 nextAfter (0.5877472E~38, ~0.123E1) = 0.587747E~38 rem (0.5877472E~38, ~0.123E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123) = ~0.722928E~39 + (0.5877472E~38, ~0.123) = ~0.123 - (0.5877472E~38, ~0.123) = 0.123 / (0.5877472E~38, ~0.123) = ~0.4778432E~37 nextAfter (0.5877472E~38, ~0.123) = 0.587747E~38 rem (0.5877472E~38, ~0.123) = 0.5877472E~38 * (0.5877472E~38, ~0.123E~2) = ~0.7229E~41 + (0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (0.5877472E~38, ~0.123E~2) = 0.123E~2 / (0.5877472E~38, ~0.123E~2) = ~0.47784322E~35 nextAfter (0.5877472E~38, ~0.123E~2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E~2) = 0.5877472E~38 * (0.5877472E~38, ~0.11754944E~37) = ~0.0 + (0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 - (0.5877472E~38, ~0.11754944E~37) = 0.17632415E~37 / (0.5877472E~38, ~0.11754944E~37) = ~0.5 nextAfter (0.5877472E~38, ~0.11754944E~37) = 0.587747E~38 rem (0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, ~0.5877472E~38) = ~0.0 + (0.5877472E~38, ~0.5877472E~38) = 0.0 - (0.5877472E~38, ~0.5877472E~38) = 0.11754944E~37 / (0.5877472E~38, ~0.5877472E~38) = ~0.1E1 nextAfter (0.5877472E~38, ~0.5877472E~38) = 0.587747E~38 rem (0.5877472E~38, ~0.5877472E~38) = 0.0 * (0.5877472E~38, ~0.1E~44) = ~0.0 + (0.5877472E~38, ~0.1E~44) = 0.587747E~38 - (0.5877472E~38, ~0.1E~44) = 0.5877473E~38 / (0.5877472E~38, ~0.1E~44) = ~0.4194304E7 nextAfter (0.5877472E~38, ~0.1E~44) = 0.587747E~38 rem (0.5877472E~38, ~0.1E~44) = 0.0 * (0.5877472E~38, ~0.0) = ~0.0 + (0.5877472E~38, ~0.0) = 0.5877472E~38 - (0.5877472E~38, ~0.0) = 0.5877472E~38 / (0.5877472E~38, ~0.0) = ~inf nextAfter (0.5877472E~38, ~0.0) = 0.587747E~38 rem (0.5877472E~38, ~0.0) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.5877472E~38, ~inf) = ~inf + (0.5877472E~38, ~inf) = ~inf - (0.5877472E~38, ~inf) = inf / (0.5877472E~38, ~inf) = ~0.0 nextAfter (0.5877472E~38, ~inf) = 0.587747E~38 rem (0.5877472E~38, ~inf) = 0.5877472E~38 * (0.5877472E~38, nan) = nan + (0.5877472E~38, nan) = nan - (0.5877472E~38, nan) = nan / (0.5877472E~38, nan) = nan nextAfter (0.5877472E~38, nan) = nan rem (0.5877472E~38, nan) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.1E~44, 0.34028235E39) = 0.47683713E~6 + (0.1E~44, 0.34028235E39) = 0.34028235E39 - (0.1E~44, 0.34028235E39) = ~0.34028235E39 / (0.1E~44, 0.34028235E39) = 0.0 nextAfter (0.1E~44, 0.34028235E39) = 0.3E~44 rem (0.1E~44, 0.34028235E39) = 0.1E~44 * (0.1E~44, 0.17014117E39) = 0.23841856E~6 + (0.1E~44, 0.17014117E39) = 0.17014117E39 - (0.1E~44, 0.17014117E39) = ~0.17014117E39 / (0.1E~44, 0.17014117E39) = 0.0 nextAfter (0.1E~44, 0.17014117E39) = 0.3E~44 rem (0.1E~44, 0.17014117E39) = 0.1E~44 * (0.1E~44, 0.123E4) = 0.1724E~41 + (0.1E~44, 0.123E4) = 0.123E4 - (0.1E~44, 0.123E4) = ~0.123E4 / (0.1E~44, 0.123E4) = 0.0 nextAfter (0.1E~44, 0.123E4) = 0.3E~44 rem (0.1E~44, 0.123E4) = 0.1E~44 * (0.1E~44, 0.123E2) = 0.17E~43 + (0.1E~44, 0.123E2) = 0.123E2 - (0.1E~44, 0.123E2) = ~0.123E2 / (0.1E~44, 0.123E2) = 0.0 nextAfter (0.1E~44, 0.123E2) = 0.3E~44 rem (0.1E~44, 0.123E2) = 0.1E~44 * (0.1E~44, 0.31415927E1) = 0.4E~44 + (0.1E~44, 0.31415927E1) = 0.31415927E1 - (0.1E~44, 0.31415927E1) = ~0.31415927E1 / (0.1E~44, 0.31415927E1) = 0.0 nextAfter (0.1E~44, 0.31415927E1) = 0.3E~44 rem (0.1E~44, 0.31415927E1) = 0.1E~44 * (0.1E~44, 0.27182817E1) = 0.4E~44 + (0.1E~44, 0.27182817E1) = 0.27182817E1 - (0.1E~44, 0.27182817E1) = ~0.27182817E1 / (0.1E~44, 0.27182817E1) = 0.0 nextAfter (0.1E~44, 0.27182817E1) = 0.3E~44 rem (0.1E~44, 0.27182817E1) = 0.1E~44 * (0.1E~44, 0.123E1) = 0.1E~44 + (0.1E~44, 0.123E1) = 0.123E1 - (0.1E~44, 0.123E1) = ~0.123E1 / (0.1E~44, 0.123E1) = 0.1E~44 nextAfter (0.1E~44, 0.123E1) = 0.3E~44 rem (0.1E~44, 0.123E1) = 0.1E~44 * (0.1E~44, 0.123) = 0.0 + (0.1E~44, 0.123) = 0.123 - (0.1E~44, 0.123) = ~0.123 / (0.1E~44, 0.123) = 0.11E~43 nextAfter (0.1E~44, 0.123) = 0.3E~44 rem (0.1E~44, 0.123) = 0.1E~44 * (0.1E~44, 0.123E~2) = 0.0 + (0.1E~44, 0.123E~2) = 0.123E~2 - (0.1E~44, 0.123E~2) = ~0.123E~2 / (0.1E~44, 0.123E~2) = 0.1139E~41 nextAfter (0.1E~44, 0.123E~2) = 0.3E~44 rem (0.1E~44, 0.123E~2) = 0.1E~44 * (0.1E~44, 0.11754944E~37) = 0.0 + (0.1E~44, 0.11754944E~37) = 0.11754945E~37 - (0.1E~44, 0.11754944E~37) = ~0.11754942E~37 / (0.1E~44, 0.11754944E~37) = 0.11920929E~6 nextAfter (0.1E~44, 0.11754944E~37) = 0.3E~44 rem (0.1E~44, 0.11754944E~37) = 0.1E~44 * (0.1E~44, 0.5877472E~38) = 0.0 + (0.1E~44, 0.5877472E~38) = 0.5877473E~38 - (0.1E~44, 0.5877472E~38) = ~0.587747E~38 / (0.1E~44, 0.5877472E~38) = 0.23841858E~6 nextAfter (0.1E~44, 0.5877472E~38) = 0.3E~44 rem (0.1E~44, 0.5877472E~38) = 0.1E~44 * (0.1E~44, 0.1E~44) = 0.0 + (0.1E~44, 0.1E~44) = 0.3E~44 - (0.1E~44, 0.1E~44) = 0.0 / (0.1E~44, 0.1E~44) = 0.1E1 nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 rem (0.1E~44, 0.1E~44) = 0.0 * (0.1E~44, 0.0) = 0.0 + (0.1E~44, 0.0) = 0.1E~44 - (0.1E~44, 0.0) = 0.1E~44 / (0.1E~44, 0.0) = inf nextAfter (0.1E~44, 0.0) = 0.0 rem (0.1E~44, 0.0) = nan * (0.1E~44, ~0.34028235E39) = ~0.47683713E~6 + (0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (0.1E~44, ~0.34028235E39) = 0.34028235E39 / (0.1E~44, ~0.34028235E39) = ~0.0 nextAfter (0.1E~44, ~0.34028235E39) = 0.0 rem (0.1E~44, ~0.34028235E39) = 0.1E~44 * (0.1E~44, ~0.17014117E39) = ~0.23841856E~6 + (0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (0.1E~44, ~0.17014117E39) = 0.17014117E39 / (0.1E~44, ~0.17014117E39) = ~0.0 nextAfter (0.1E~44, ~0.17014117E39) = 0.0 rem (0.1E~44, ~0.17014117E39) = 0.1E~44 * (0.1E~44, ~0.123E4) = ~0.1724E~41 + (0.1E~44, ~0.123E4) = ~0.123E4 - (0.1E~44, ~0.123E4) = 0.123E4 / (0.1E~44, ~0.123E4) = ~0.0 nextAfter (0.1E~44, ~0.123E4) = 0.0 rem (0.1E~44, ~0.123E4) = 0.1E~44 * (0.1E~44, ~0.123E2) = ~0.17E~43 + (0.1E~44, ~0.123E2) = ~0.123E2 - (0.1E~44, ~0.123E2) = 0.123E2 / (0.1E~44, ~0.123E2) = ~0.0 nextAfter (0.1E~44, ~0.123E2) = 0.0 rem (0.1E~44, ~0.123E2) = 0.1E~44 * (0.1E~44, ~0.31415927E1) = ~0.4E~44 + (0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (0.1E~44, ~0.31415927E1) = 0.31415927E1 / (0.1E~44, ~0.31415927E1) = ~0.0 nextAfter (0.1E~44, ~0.31415927E1) = 0.0 rem (0.1E~44, ~0.31415927E1) = 0.1E~44 * (0.1E~44, ~0.27182817E1) = ~0.4E~44 + (0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (0.1E~44, ~0.27182817E1) = 0.27182817E1 / (0.1E~44, ~0.27182817E1) = ~0.0 nextAfter (0.1E~44, ~0.27182817E1) = 0.0 rem (0.1E~44, ~0.27182817E1) = 0.1E~44 * (0.1E~44, ~0.123E1) = ~0.1E~44 + (0.1E~44, ~0.123E1) = ~0.123E1 - (0.1E~44, ~0.123E1) = 0.123E1 / (0.1E~44, ~0.123E1) = ~0.1E~44 nextAfter (0.1E~44, ~0.123E1) = 0.0 rem (0.1E~44, ~0.123E1) = 0.1E~44 * (0.1E~44, ~0.123) = ~0.0 + (0.1E~44, ~0.123) = ~0.123 - (0.1E~44, ~0.123) = 0.123 / (0.1E~44, ~0.123) = ~0.11E~43 nextAfter (0.1E~44, ~0.123) = 0.0 rem (0.1E~44, ~0.123) = 0.1E~44 * (0.1E~44, ~0.123E~2) = ~0.0 + (0.1E~44, ~0.123E~2) = ~0.123E~2 - (0.1E~44, ~0.123E~2) = 0.123E~2 / (0.1E~44, ~0.123E~2) = ~0.1139E~41 nextAfter (0.1E~44, ~0.123E~2) = 0.0 rem (0.1E~44, ~0.123E~2) = 0.1E~44 * (0.1E~44, ~0.11754944E~37) = ~0.0 + (0.1E~44, ~0.11754944E~37) = ~0.11754942E~37 - (0.1E~44, ~0.11754944E~37) = 0.11754945E~37 / (0.1E~44, ~0.11754944E~37) = ~0.11920929E~6 nextAfter (0.1E~44, ~0.11754944E~37) = 0.0 rem (0.1E~44, ~0.11754944E~37) = 0.1E~44 * (0.1E~44, ~0.5877472E~38) = ~0.0 + (0.1E~44, ~0.5877472E~38) = ~0.587747E~38 - (0.1E~44, ~0.5877472E~38) = 0.5877473E~38 / (0.1E~44, ~0.5877472E~38) = ~0.23841858E~6 nextAfter (0.1E~44, ~0.5877472E~38) = 0.0 rem (0.1E~44, ~0.5877472E~38) = 0.1E~44 * (0.1E~44, ~0.1E~44) = ~0.0 + (0.1E~44, ~0.1E~44) = 0.0 - (0.1E~44, ~0.1E~44) = 0.3E~44 / (0.1E~44, ~0.1E~44) = ~0.1E1 nextAfter (0.1E~44, ~0.1E~44) = 0.0 rem (0.1E~44, ~0.1E~44) = 0.0 * (0.1E~44, ~0.0) = ~0.0 + (0.1E~44, ~0.0) = 0.1E~44 - (0.1E~44, ~0.0) = 0.1E~44 / (0.1E~44, ~0.0) = ~inf nextAfter (0.1E~44, ~0.0) = 0.0 rem (0.1E~44, ~0.0) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.1E~44, ~inf) = ~inf + (0.1E~44, ~inf) = ~inf - (0.1E~44, ~inf) = inf / (0.1E~44, ~inf) = ~0.0 nextAfter (0.1E~44, ~inf) = 0.0 rem (0.1E~44, ~inf) = 0.1E~44 * (0.1E~44, nan) = nan + (0.1E~44, nan) = nan - (0.1E~44, nan) = nan / (0.1E~44, nan) = nan nextAfter (0.1E~44, nan) = nan rem (0.1E~44, nan) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.0, 0.34028235E39) = 0.0 + (0.0, 0.34028235E39) = 0.34028235E39 - (0.0, 0.34028235E39) = ~0.34028235E39 / (0.0, 0.34028235E39) = 0.0 nextAfter (0.0, 0.34028235E39) = 0.1E~44 rem (0.0, 0.34028235E39) = 0.0 * (0.0, 0.17014117E39) = 0.0 + (0.0, 0.17014117E39) = 0.17014117E39 - (0.0, 0.17014117E39) = ~0.17014117E39 / (0.0, 0.17014117E39) = 0.0 nextAfter (0.0, 0.17014117E39) = 0.1E~44 rem (0.0, 0.17014117E39) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.1E~44 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.1E~44 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.31415927E1) = 0.0 + (0.0, 0.31415927E1) = 0.31415927E1 - (0.0, 0.31415927E1) = ~0.31415927E1 / (0.0, 0.31415927E1) = 0.0 nextAfter (0.0, 0.31415927E1) = 0.1E~44 rem (0.0, 0.31415927E1) = 0.0 * (0.0, 0.27182817E1) = 0.0 + (0.0, 0.27182817E1) = 0.27182817E1 - (0.0, 0.27182817E1) = ~0.27182817E1 / (0.0, 0.27182817E1) = 0.0 nextAfter (0.0, 0.27182817E1) = 0.1E~44 rem (0.0, 0.27182817E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.1E~44 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.1E~44 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.1E~44 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.11754944E~37) = 0.0 + (0.0, 0.11754944E~37) = 0.11754944E~37 - (0.0, 0.11754944E~37) = ~0.11754944E~37 / (0.0, 0.11754944E~37) = 0.0 nextAfter (0.0, 0.11754944E~37) = 0.1E~44 rem (0.0, 0.11754944E~37) = 0.0 * (0.0, 0.5877472E~38) = 0.0 + (0.0, 0.5877472E~38) = 0.5877472E~38 - (0.0, 0.5877472E~38) = ~0.5877472E~38 / (0.0, 0.5877472E~38) = 0.0 nextAfter (0.0, 0.5877472E~38) = 0.1E~44 rem (0.0, 0.5877472E~38) = 0.0 * (0.0, 0.1E~44) = 0.0 + (0.0, 0.1E~44) = 0.1E~44 - (0.0, 0.1E~44) = ~0.1E~44 / (0.0, 0.1E~44) = 0.0 nextAfter (0.0, 0.1E~44) = 0.1E~44 rem (0.0, 0.1E~44) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.34028235E39) = ~0.0 + (0.0, ~0.34028235E39) = ~0.34028235E39 - (0.0, ~0.34028235E39) = 0.34028235E39 / (0.0, ~0.34028235E39) = ~0.0 nextAfter (0.0, ~0.34028235E39) = ~0.1E~44 rem (0.0, ~0.34028235E39) = 0.0 * (0.0, ~0.17014117E39) = ~0.0 + (0.0, ~0.17014117E39) = ~0.17014117E39 - (0.0, ~0.17014117E39) = 0.17014117E39 / (0.0, ~0.17014117E39) = ~0.0 nextAfter (0.0, ~0.17014117E39) = ~0.1E~44 rem (0.0, ~0.17014117E39) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.1E~44 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.1E~44 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.31415927E1) = ~0.0 + (0.0, ~0.31415927E1) = ~0.31415927E1 - (0.0, ~0.31415927E1) = 0.31415927E1 / (0.0, ~0.31415927E1) = ~0.0 nextAfter (0.0, ~0.31415927E1) = ~0.1E~44 rem (0.0, ~0.31415927E1) = 0.0 * (0.0, ~0.27182817E1) = ~0.0 + (0.0, ~0.27182817E1) = ~0.27182817E1 - (0.0, ~0.27182817E1) = 0.27182817E1 / (0.0, ~0.27182817E1) = ~0.0 nextAfter (0.0, ~0.27182817E1) = ~0.1E~44 rem (0.0, ~0.27182817E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.1E~44 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.1E~44 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.1E~44 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.11754944E~37) = ~0.0 + (0.0, ~0.11754944E~37) = ~0.11754944E~37 - (0.0, ~0.11754944E~37) = 0.11754944E~37 / (0.0, ~0.11754944E~37) = ~0.0 nextAfter (0.0, ~0.11754944E~37) = ~0.1E~44 rem (0.0, ~0.11754944E~37) = 0.0 * (0.0, ~0.5877472E~38) = ~0.0 + (0.0, ~0.5877472E~38) = ~0.5877472E~38 - (0.0, ~0.5877472E~38) = 0.5877472E~38 / (0.0, ~0.5877472E~38) = ~0.0 nextAfter (0.0, ~0.5877472E~38) = ~0.1E~44 rem (0.0, ~0.5877472E~38) = 0.0 * (0.0, ~0.1E~44) = ~0.0 + (0.0, ~0.1E~44) = ~0.1E~44 - (0.0, ~0.1E~44) = 0.1E~44 / (0.0, ~0.1E~44) = ~0.0 nextAfter (0.0, ~0.1E~44) = ~0.1E~44 rem (0.0, ~0.1E~44) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.1E~44 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (~0.34028235E39, 0.34028235E39) = ~inf + (~0.34028235E39, 0.34028235E39) = 0.0 - (~0.34028235E39, 0.34028235E39) = ~inf / (~0.34028235E39, 0.34028235E39) = ~0.1E1 nextAfter (~0.34028235E39, 0.34028235E39) = ~0.34028233E39 rem (~0.34028235E39, 0.34028235E39) = 0.0 * (~0.34028235E39, 0.17014117E39) = ~inf + (~0.34028235E39, 0.17014117E39) = ~0.17014117E39 - (~0.34028235E39, 0.17014117E39) = ~inf / (~0.34028235E39, 0.17014117E39) = ~0.2E1 nextAfter (~0.34028235E39, 0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, 0.17014117E39) = 0.0 * (~0.34028235E39, 0.123E4) = ~inf + (~0.34028235E39, 0.123E4) = ~0.34028235E39 - (~0.34028235E39, 0.123E4) = ~0.34028235E39 / (~0.34028235E39, 0.123E4) = ~0.2766523E36 nextAfter (~0.34028235E39, 0.123E4) = ~0.34028233E39 rem (~0.34028235E39, 0.123E4) = ~0.2028241E32 * (~0.34028235E39, 0.123E2) = ~inf + (~0.34028235E39, 0.123E2) = ~0.34028235E39 - (~0.34028235E39, 0.123E2) = ~0.34028235E39 / (~0.34028235E39, 0.123E2) = ~0.27665232E38 nextAfter (~0.34028235E39, 0.123E2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E2) = inf * (~0.34028235E39, 0.31415927E1) = ~inf + (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, 0.31415927E1) = ~0.10831523E39 nextAfter (~0.34028235E39, 0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, 0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, 0.27182817E1) = ~inf + (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, 0.27182817E1) = ~0.12518288E39 nextAfter (~0.34028235E39, 0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, 0.27182817E1) = 0.0 * (~0.34028235E39, 0.123E1) = ~inf + (~0.34028235E39, 0.123E1) = ~0.34028235E39 - (~0.34028235E39, 0.123E1) = ~0.34028235E39 / (~0.34028235E39, 0.123E1) = ~0.27665231E39 nextAfter (~0.34028235E39, 0.123E1) = ~0.34028233E39 rem (~0.34028235E39, 0.123E1) = 0.0 * (~0.34028235E39, 0.123) = ~0.4185473E38 + (~0.34028235E39, 0.123) = ~0.34028235E39 - (~0.34028235E39, 0.123) = ~0.34028235E39 / (~0.34028235E39, 0.123) = ~inf nextAfter (~0.34028235E39, 0.123) = ~0.34028233E39 rem (~0.34028235E39, 0.123) = inf * (~0.34028235E39, 0.123E~2) = ~0.4185473E36 + (~0.34028235E39, 0.123E~2) = ~0.34028235E39 - (~0.34028235E39, 0.123E~2) = ~0.34028235E39 / (~0.34028235E39, 0.123E~2) = ~inf nextAfter (~0.34028235E39, 0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E~2) = inf * (~0.34028235E39, 0.11754944E~37) = ~0.39999998E1 + (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, 0.11754944E~37) = ~inf nextAfter (~0.34028235E39, 0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, 0.11754944E~37) = inf * (~0.34028235E39, 0.5877472E~38) = ~0.19999999E1 + (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, 0.5877472E~38) = ~inf nextAfter (~0.34028235E39, 0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, 0.5877472E~38) = inf * (~0.34028235E39, 0.1E~44) = ~0.47683713E~6 + (~0.34028235E39, 0.1E~44) = ~0.34028235E39 - (~0.34028235E39, 0.1E~44) = ~0.34028235E39 / (~0.34028235E39, 0.1E~44) = ~inf nextAfter (~0.34028235E39, 0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, 0.1E~44) = inf * (~0.34028235E39, 0.0) = ~0.0 + (~0.34028235E39, 0.0) = ~0.34028235E39 - (~0.34028235E39, 0.0) = ~0.34028235E39 / (~0.34028235E39, 0.0) = ~inf nextAfter (~0.34028235E39, 0.0) = ~0.34028233E39 rem (~0.34028235E39, 0.0) = nan * (~0.34028235E39, ~0.34028235E39) = inf + (~0.34028235E39, ~0.34028235E39) = ~inf - (~0.34028235E39, ~0.34028235E39) = 0.0 / (~0.34028235E39, ~0.34028235E39) = 0.1E1 nextAfter (~0.34028235E39, ~0.34028235E39) = ~0.34028235E39 rem (~0.34028235E39, ~0.34028235E39) = 0.0 * (~0.34028235E39, ~0.17014117E39) = inf + (~0.34028235E39, ~0.17014117E39) = ~inf - (~0.34028235E39, ~0.17014117E39) = ~0.17014117E39 / (~0.34028235E39, ~0.17014117E39) = 0.2E1 nextAfter (~0.34028235E39, ~0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, ~0.17014117E39) = 0.0 * (~0.34028235E39, ~0.123E4) = inf + (~0.34028235E39, ~0.123E4) = ~0.34028235E39 - (~0.34028235E39, ~0.123E4) = ~0.34028235E39 / (~0.34028235E39, ~0.123E4) = 0.2766523E36 nextAfter (~0.34028235E39, ~0.123E4) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E4) = ~0.2028241E32 * (~0.34028235E39, ~0.123E2) = inf + (~0.34028235E39, ~0.123E2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E2) = 0.27665232E38 nextAfter (~0.34028235E39, ~0.123E2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E2) = inf * (~0.34028235E39, ~0.31415927E1) = inf + (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, ~0.31415927E1) = 0.10831523E39 nextAfter (~0.34028235E39, ~0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.31415927E1) = ~0.2028241E32 * (~0.34028235E39, ~0.27182817E1) = inf + (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, ~0.27182817E1) = 0.12518288E39 nextAfter (~0.34028235E39, ~0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.27182817E1) = 0.0 * (~0.34028235E39, ~0.123E1) = inf + (~0.34028235E39, ~0.123E1) = ~0.34028235E39 - (~0.34028235E39, ~0.123E1) = ~0.34028235E39 / (~0.34028235E39, ~0.123E1) = 0.27665231E39 nextAfter (~0.34028235E39, ~0.123E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E1) = 0.0 * (~0.34028235E39, ~0.123) = 0.4185473E38 + (~0.34028235E39, ~0.123) = ~0.34028235E39 - (~0.34028235E39, ~0.123) = ~0.34028235E39 / (~0.34028235E39, ~0.123) = inf nextAfter (~0.34028235E39, ~0.123) = ~0.34028233E39 rem (~0.34028235E39, ~0.123) = inf * (~0.34028235E39, ~0.123E~2) = 0.4185473E36 + (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E~2) = inf nextAfter (~0.34028235E39, ~0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E~2) = inf * (~0.34028235E39, ~0.11754944E~37) = 0.39999998E1 + (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, ~0.11754944E~37) = inf nextAfter (~0.34028235E39, ~0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, ~0.11754944E~37) = inf * (~0.34028235E39, ~0.5877472E~38) = 0.19999999E1 + (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, ~0.5877472E~38) = inf nextAfter (~0.34028235E39, ~0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, ~0.5877472E~38) = inf * (~0.34028235E39, ~0.1E~44) = 0.47683713E~6 + (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 - (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 / (~0.34028235E39, ~0.1E~44) = inf nextAfter (~0.34028235E39, ~0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, ~0.1E~44) = inf * (~0.34028235E39, ~0.0) = 0.0 + (~0.34028235E39, ~0.0) = ~0.34028235E39 - (~0.34028235E39, ~0.0) = ~0.34028235E39 / (~0.34028235E39, ~0.0) = inf nextAfter (~0.34028235E39, ~0.0) = ~0.34028233E39 rem (~0.34028235E39, ~0.0) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.34028235E39, ~inf) = inf + (~0.34028235E39, ~inf) = ~inf - (~0.34028235E39, ~inf) = inf / (~0.34028235E39, ~inf) = 0.0 nextAfter (~0.34028235E39, ~inf) = ~inf rem (~0.34028235E39, ~inf) = ~0.34028235E39 * (~0.34028235E39, nan) = nan + (~0.34028235E39, nan) = nan - (~0.34028235E39, nan) = nan / (~0.34028235E39, nan) = nan nextAfter (~0.34028235E39, nan) = nan rem (~0.34028235E39, nan) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.17014117E39, 0.34028235E39) = ~inf + (~0.17014117E39, 0.34028235E39) = 0.17014117E39 - (~0.17014117E39, 0.34028235E39) = ~inf / (~0.17014117E39, 0.34028235E39) = ~0.5 nextAfter (~0.17014117E39, 0.34028235E39) = ~0.17014116E39 rem (~0.17014117E39, 0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, 0.17014117E39) = ~inf + (~0.17014117E39, 0.17014117E39) = 0.0 - (~0.17014117E39, 0.17014117E39) = ~0.34028235E39 / (~0.17014117E39, 0.17014117E39) = ~0.1E1 nextAfter (~0.17014117E39, 0.17014117E39) = ~0.17014116E39 rem (~0.17014117E39, 0.17014117E39) = 0.0 * (~0.17014117E39, 0.123E4) = ~inf + (~0.17014117E39, 0.123E4) = ~0.17014117E39 - (~0.17014117E39, 0.123E4) = ~0.17014117E39 / (~0.17014117E39, 0.123E4) = ~0.13832615E36 nextAfter (~0.17014117E39, 0.123E4) = ~0.17014116E39 rem (~0.17014117E39, 0.123E4) = ~0.10141205E32 * (~0.17014117E39, 0.123E2) = ~inf + (~0.17014117E39, 0.123E2) = ~0.17014117E39 - (~0.17014117E39, 0.123E2) = ~0.17014117E39 / (~0.17014117E39, 0.123E2) = ~0.13832616E38 nextAfter (~0.17014117E39, 0.123E2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E2) = 0.10141205E32 * (~0.17014117E39, 0.31415927E1) = ~inf + (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, 0.31415927E1) = ~0.54157613E38 nextAfter (~0.17014117E39, 0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, 0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, 0.27182817E1) = ~inf + (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, 0.27182817E1) = ~0.6259144E38 nextAfter (~0.17014117E39, 0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, 0.27182817E1) = 0.0 * (~0.17014117E39, 0.123E1) = ~0.20927364E39 + (~0.17014117E39, 0.123E1) = ~0.17014117E39 - (~0.17014117E39, 0.123E1) = ~0.17014117E39 / (~0.17014117E39, 0.123E1) = ~0.13832616E39 nextAfter (~0.17014117E39, 0.123E1) = ~0.17014116E39 rem (~0.17014117E39, 0.123E1) = 0.0 * (~0.17014117E39, 0.123) = ~0.20927365E38 + (~0.17014117E39, 0.123) = ~0.17014117E39 - (~0.17014117E39, 0.123) = ~0.17014117E39 / (~0.17014117E39, 0.123) = ~inf nextAfter (~0.17014117E39, 0.123) = ~0.17014116E39 rem (~0.17014117E39, 0.123) = inf * (~0.17014117E39, 0.123E~2) = ~0.20927364E36 + (~0.17014117E39, 0.123E~2) = ~0.17014117E39 - (~0.17014117E39, 0.123E~2) = ~0.17014117E39 / (~0.17014117E39, 0.123E~2) = ~inf nextAfter (~0.17014117E39, 0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E~2) = inf * (~0.17014117E39, 0.11754944E~37) = ~0.19999999E1 + (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, 0.11754944E~37) = ~inf nextAfter (~0.17014117E39, 0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, 0.11754944E~37) = inf * (~0.17014117E39, 0.5877472E~38) = ~0.99999994 + (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, 0.5877472E~38) = ~inf nextAfter (~0.17014117E39, 0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, 0.5877472E~38) = inf * (~0.17014117E39, 0.1E~44) = ~0.23841856E~6 + (~0.17014117E39, 0.1E~44) = ~0.17014117E39 - (~0.17014117E39, 0.1E~44) = ~0.17014117E39 / (~0.17014117E39, 0.1E~44) = ~inf nextAfter (~0.17014117E39, 0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, 0.1E~44) = inf * (~0.17014117E39, 0.0) = ~0.0 + (~0.17014117E39, 0.0) = ~0.17014117E39 - (~0.17014117E39, 0.0) = ~0.17014117E39 / (~0.17014117E39, 0.0) = ~inf nextAfter (~0.17014117E39, 0.0) = ~0.17014116E39 rem (~0.17014117E39, 0.0) = nan * (~0.17014117E39, ~0.34028235E39) = inf + (~0.17014117E39, ~0.34028235E39) = ~inf - (~0.17014117E39, ~0.34028235E39) = 0.17014117E39 / (~0.17014117E39, ~0.34028235E39) = 0.5 nextAfter (~0.17014117E39, ~0.34028235E39) = ~0.17014118E39 rem (~0.17014117E39, ~0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, ~0.17014117E39) = inf + (~0.17014117E39, ~0.17014117E39) = ~0.34028235E39 - (~0.17014117E39, ~0.17014117E39) = 0.0 / (~0.17014117E39, ~0.17014117E39) = 0.1E1 nextAfter (~0.17014117E39, ~0.17014117E39) = ~0.17014117E39 rem (~0.17014117E39, ~0.17014117E39) = 0.0 * (~0.17014117E39, ~0.123E4) = inf + (~0.17014117E39, ~0.123E4) = ~0.17014117E39 - (~0.17014117E39, ~0.123E4) = ~0.17014117E39 / (~0.17014117E39, ~0.123E4) = 0.13832615E36 nextAfter (~0.17014117E39, ~0.123E4) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E4) = ~0.10141205E32 * (~0.17014117E39, ~0.123E2) = inf + (~0.17014117E39, ~0.123E2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E2) = 0.13832616E38 nextAfter (~0.17014117E39, ~0.123E2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E2) = 0.10141205E32 * (~0.17014117E39, ~0.31415927E1) = inf + (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, ~0.31415927E1) = 0.54157613E38 nextAfter (~0.17014117E39, ~0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.31415927E1) = ~0.10141205E32 * (~0.17014117E39, ~0.27182817E1) = inf + (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, ~0.27182817E1) = 0.6259144E38 nextAfter (~0.17014117E39, ~0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.27182817E1) = 0.0 * (~0.17014117E39, ~0.123E1) = 0.20927364E39 + (~0.17014117E39, ~0.123E1) = ~0.17014117E39 - (~0.17014117E39, ~0.123E1) = ~0.17014117E39 / (~0.17014117E39, ~0.123E1) = 0.13832616E39 nextAfter (~0.17014117E39, ~0.123E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E1) = 0.0 * (~0.17014117E39, ~0.123) = 0.20927365E38 + (~0.17014117E39, ~0.123) = ~0.17014117E39 - (~0.17014117E39, ~0.123) = ~0.17014117E39 / (~0.17014117E39, ~0.123) = inf nextAfter (~0.17014117E39, ~0.123) = ~0.17014116E39 rem (~0.17014117E39, ~0.123) = inf * (~0.17014117E39, ~0.123E~2) = 0.20927364E36 + (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E~2) = inf nextAfter (~0.17014117E39, ~0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E~2) = inf * (~0.17014117E39, ~0.11754944E~37) = 0.19999999E1 + (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, ~0.11754944E~37) = inf nextAfter (~0.17014117E39, ~0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, ~0.11754944E~37) = inf * (~0.17014117E39, ~0.5877472E~38) = 0.99999994 + (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, ~0.5877472E~38) = inf nextAfter (~0.17014117E39, ~0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, ~0.5877472E~38) = inf * (~0.17014117E39, ~0.1E~44) = 0.23841856E~6 + (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 - (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 / (~0.17014117E39, ~0.1E~44) = inf nextAfter (~0.17014117E39, ~0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, ~0.1E~44) = inf * (~0.17014117E39, ~0.0) = 0.0 + (~0.17014117E39, ~0.0) = ~0.17014117E39 - (~0.17014117E39, ~0.0) = ~0.17014117E39 / (~0.17014117E39, ~0.0) = inf nextAfter (~0.17014117E39, ~0.0) = ~0.17014116E39 rem (~0.17014117E39, ~0.0) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.17014117E39, ~inf) = inf + (~0.17014117E39, ~inf) = ~inf - (~0.17014117E39, ~inf) = inf / (~0.17014117E39, ~inf) = 0.0 nextAfter (~0.17014117E39, ~inf) = ~0.17014118E39 rem (~0.17014117E39, ~inf) = ~0.17014117E39 * (~0.17014117E39, nan) = nan + (~0.17014117E39, nan) = nan - (~0.17014117E39, nan) = nan / (~0.17014117E39, nan) = nan nextAfter (~0.17014117E39, nan) = nan rem (~0.17014117E39, nan) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.123E4, 0.34028235E39) = ~inf + (~0.123E4, 0.34028235E39) = 0.34028235E39 - (~0.123E4, 0.34028235E39) = ~0.34028235E39 / (~0.123E4, 0.34028235E39) = ~0.36146455E~35 nextAfter (~0.123E4, 0.34028235E39) = ~0.12299999E4 rem (~0.123E4, 0.34028235E39) = ~0.123E4 * (~0.123E4, 0.17014117E39) = ~inf + (~0.123E4, 0.17014117E39) = 0.17014117E39 - (~0.123E4, 0.17014117E39) = ~0.17014117E39 / (~0.123E4, 0.17014117E39) = ~0.7229291E~35 nextAfter (~0.123E4, 0.17014117E39) = ~0.12299999E4 rem (~0.123E4, 0.17014117E39) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.31415927E1) = ~0.38641592E4 + (~0.123E4, 0.31415927E1) = ~0.12268584E4 - (~0.123E4, 0.31415927E1) = ~0.12331416E4 / (~0.123E4, 0.31415927E1) = ~0.39152115E3 nextAfter (~0.123E4, 0.31415927E1) = ~0.12299999E4 rem (~0.123E4, 0.31415927E1) = ~0.1637207E1 * (~0.123E4, 0.27182817E1) = ~0.33434866E4 + (~0.123E4, 0.27182817E1) = ~0.12272817E4 - (~0.123E4, 0.27182817E1) = ~0.12327183E4 / (~0.123E4, 0.27182817E1) = ~0.45249173E3 nextAfter (~0.123E4, 0.27182817E1) = ~0.12299999E4 rem (~0.123E4, 0.27182817E1) = ~0.13366699E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129001E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129001E1 + (~0.123E4, 0.123E~2) = ~0.12299988E4 - (~0.123E4, 0.123E~2) = ~0.12300012E4 / (~0.123E4, 0.123E~2) = ~0.99999994E6 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999E4 rem (~0.123E4, 0.123E~2) = ~0.12207031E~2 * (~0.123E4, 0.11754944E~37) = ~0.1445858E~34 + (~0.123E4, 0.11754944E~37) = ~0.123E4 - (~0.123E4, 0.11754944E~37) = ~0.123E4 / (~0.123E4, 0.11754944E~37) = ~inf nextAfter (~0.123E4, 0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, 0.11754944E~37) = inf * (~0.123E4, 0.5877472E~38) = ~0.722929E~35 + (~0.123E4, 0.5877472E~38) = ~0.123E4 - (~0.123E4, 0.5877472E~38) = ~0.123E4 / (~0.123E4, 0.5877472E~38) = ~inf nextAfter (~0.123E4, 0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, 0.5877472E~38) = inf * (~0.123E4, 0.1E~44) = ~0.1724E~41 + (~0.123E4, 0.1E~44) = ~0.123E4 - (~0.123E4, 0.1E~44) = ~0.123E4 / (~0.123E4, 0.1E~44) = ~inf nextAfter (~0.123E4, 0.1E~44) = ~0.12299999E4 rem (~0.123E4, 0.1E~44) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.34028235E39) = inf + (~0.123E4, ~0.34028235E39) = ~0.34028235E39 - (~0.123E4, ~0.34028235E39) = 0.34028235E39 / (~0.123E4, ~0.34028235E39) = 0.36146455E~35 nextAfter (~0.123E4, ~0.34028235E39) = ~0.12300001E4 rem (~0.123E4, ~0.34028235E39) = ~0.123E4 * (~0.123E4, ~0.17014117E39) = inf + (~0.123E4, ~0.17014117E39) = ~0.17014117E39 - (~0.123E4, ~0.17014117E39) = 0.17014117E39 / (~0.123E4, ~0.17014117E39) = 0.7229291E~35 nextAfter (~0.123E4, ~0.17014117E39) = ~0.12300001E4 rem (~0.123E4, ~0.17014117E39) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.31415927E1) = 0.38641592E4 + (~0.123E4, ~0.31415927E1) = ~0.12331416E4 - (~0.123E4, ~0.31415927E1) = ~0.12268584E4 / (~0.123E4, ~0.31415927E1) = 0.39152115E3 nextAfter (~0.123E4, ~0.31415927E1) = ~0.12299999E4 rem (~0.123E4, ~0.31415927E1) = ~0.1637207E1 * (~0.123E4, ~0.27182817E1) = 0.33434866E4 + (~0.123E4, ~0.27182817E1) = ~0.12327183E4 - (~0.123E4, ~0.27182817E1) = ~0.12272817E4 / (~0.123E4, ~0.27182817E1) = 0.45249173E3 nextAfter (~0.123E4, ~0.27182817E1) = ~0.12299999E4 rem (~0.123E4, ~0.27182817E1) = ~0.13366699E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129001E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129001E1 + (~0.123E4, ~0.123E~2) = ~0.12300012E4 - (~0.123E4, ~0.123E~2) = ~0.12299988E4 / (~0.123E4, ~0.123E~2) = 0.99999994E6 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999E4 rem (~0.123E4, ~0.123E~2) = ~0.12207031E~2 * (~0.123E4, ~0.11754944E~37) = 0.1445858E~34 + (~0.123E4, ~0.11754944E~37) = ~0.123E4 - (~0.123E4, ~0.11754944E~37) = ~0.123E4 / (~0.123E4, ~0.11754944E~37) = inf nextAfter (~0.123E4, ~0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, ~0.11754944E~37) = inf * (~0.123E4, ~0.5877472E~38) = 0.722929E~35 + (~0.123E4, ~0.5877472E~38) = ~0.123E4 - (~0.123E4, ~0.5877472E~38) = ~0.123E4 / (~0.123E4, ~0.5877472E~38) = inf nextAfter (~0.123E4, ~0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, ~0.5877472E~38) = inf * (~0.123E4, ~0.1E~44) = 0.1724E~41 + (~0.123E4, ~0.1E~44) = ~0.123E4 - (~0.123E4, ~0.1E~44) = ~0.123E4 / (~0.123E4, ~0.1E~44) = inf nextAfter (~0.123E4, ~0.1E~44) = ~0.12299999E4 rem (~0.123E4, ~0.1E~44) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300001E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.34028235E39) = ~inf + (~0.123E2, 0.34028235E39) = 0.34028235E39 - (~0.123E2, 0.34028235E39) = ~0.34028235E39 / (~0.123E2, 0.34028235E39) = ~0.36146455E~37 nextAfter (~0.123E2, 0.34028235E39) = ~0.12299999E2 rem (~0.123E2, 0.34028235E39) = ~0.123E2 * (~0.123E2, 0.17014117E39) = ~inf + (~0.123E2, 0.17014117E39) = 0.17014117E39 - (~0.123E2, 0.17014117E39) = ~0.17014117E39 / (~0.123E2, 0.17014117E39) = ~0.7229291E~37 nextAfter (~0.123E2, 0.17014117E39) = ~0.12299999E2 rem (~0.123E2, 0.17014117E39) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129001E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.31415927E1) = ~0.3864159E2 + (~0.123E2, 0.31415927E1) = ~0.9158407E1 - (~0.123E2, 0.31415927E1) = ~0.15441593E2 / (~0.123E2, 0.31415927E1) = ~0.39152114E1 nextAfter (~0.123E2, 0.31415927E1) = ~0.12299999E2 rem (~0.123E2, 0.31415927E1) = ~0.28752222E1 * (~0.123E2, 0.27182817E1) = ~0.33434868E2 + (~0.123E2, 0.27182817E1) = ~0.9581718E1 - (~0.123E2, 0.27182817E1) = ~0.15018282E2 / (~0.123E2, 0.27182817E1) = ~0.4524917E1 nextAfter (~0.123E2, 0.27182817E1) = ~0.12299999E2 rem (~0.123E2, 0.27182817E1) = ~0.14268732E1 * (~0.123E2, 0.123E1) = ~0.15129001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129001E1 + (~0.123E2, 0.123) = ~0.12177E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.1E3 nextAfter (~0.123E2, 0.123) = ~0.12299999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129001E~1 + (~0.123E2, 0.123E~2) = ~0.1229877E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999E2 rem (~0.123E2, 0.123E~2) = 0.0 * (~0.123E2, 0.11754944E~37) = ~0.14458581E~36 + (~0.123E2, 0.11754944E~37) = ~0.123E2 - (~0.123E2, 0.11754944E~37) = ~0.123E2 / (~0.123E2, 0.11754944E~37) = ~inf nextAfter (~0.123E2, 0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, 0.11754944E~37) = inf * (~0.123E2, 0.5877472E~38) = ~0.72292904E~37 + (~0.123E2, 0.5877472E~38) = ~0.123E2 - (~0.123E2, 0.5877472E~38) = ~0.123E2 / (~0.123E2, 0.5877472E~38) = ~inf nextAfter (~0.123E2, 0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, 0.5877472E~38) = inf * (~0.123E2, 0.1E~44) = ~0.17E~43 + (~0.123E2, 0.1E~44) = ~0.123E2 - (~0.123E2, 0.1E~44) = ~0.123E2 / (~0.123E2, 0.1E~44) = ~inf nextAfter (~0.123E2, 0.1E~44) = ~0.12299999E2 rem (~0.123E2, 0.1E~44) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.34028235E39) = inf + (~0.123E2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E2, ~0.34028235E39) = 0.34028235E39 / (~0.123E2, ~0.34028235E39) = 0.36146455E~37 nextAfter (~0.123E2, ~0.34028235E39) = ~0.12300001E2 rem (~0.123E2, ~0.34028235E39) = ~0.123E2 * (~0.123E2, ~0.17014117E39) = inf + (~0.123E2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E2, ~0.17014117E39) = 0.17014117E39 / (~0.123E2, ~0.17014117E39) = 0.7229291E~37 nextAfter (~0.123E2, ~0.17014117E39) = ~0.12300001E2 rem (~0.123E2, ~0.17014117E39) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300001E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129001E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.31415927E1) = 0.3864159E2 + (~0.123E2, ~0.31415927E1) = ~0.15441593E2 - (~0.123E2, ~0.31415927E1) = ~0.9158407E1 / (~0.123E2, ~0.31415927E1) = 0.39152114E1 nextAfter (~0.123E2, ~0.31415927E1) = ~0.12299999E2 rem (~0.123E2, ~0.31415927E1) = ~0.28752222E1 * (~0.123E2, ~0.27182817E1) = 0.33434868E2 + (~0.123E2, ~0.27182817E1) = ~0.15018282E2 - (~0.123E2, ~0.27182817E1) = ~0.9581718E1 / (~0.123E2, ~0.27182817E1) = 0.4524917E1 nextAfter (~0.123E2, ~0.27182817E1) = ~0.12299999E2 rem (~0.123E2, ~0.27182817E1) = ~0.14268732E1 * (~0.123E2, ~0.123E1) = 0.15129001E2 + (~0.123E2, ~0.123E1) = ~0.13530001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177E2 / (~0.123E2, ~0.123) = 0.1E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129001E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.1229877E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999E2 rem (~0.123E2, ~0.123E~2) = 0.0 * (~0.123E2, ~0.11754944E~37) = 0.14458581E~36 + (~0.123E2, ~0.11754944E~37) = ~0.123E2 - (~0.123E2, ~0.11754944E~37) = ~0.123E2 / (~0.123E2, ~0.11754944E~37) = inf nextAfter (~0.123E2, ~0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, ~0.11754944E~37) = inf * (~0.123E2, ~0.5877472E~38) = 0.72292904E~37 + (~0.123E2, ~0.5877472E~38) = ~0.123E2 - (~0.123E2, ~0.5877472E~38) = ~0.123E2 / (~0.123E2, ~0.5877472E~38) = inf nextAfter (~0.123E2, ~0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, ~0.5877472E~38) = inf * (~0.123E2, ~0.1E~44) = 0.17E~43 + (~0.123E2, ~0.1E~44) = ~0.123E2 - (~0.123E2, ~0.1E~44) = ~0.123E2 / (~0.123E2, ~0.1E~44) = inf nextAfter (~0.123E2, ~0.1E~44) = ~0.12299999E2 rem (~0.123E2, ~0.1E~44) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300001E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.31415927E1, 0.34028235E39) = ~inf + (~0.31415927E1, 0.34028235E39) = 0.34028235E39 - (~0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (~0.31415927E1, 0.34028235E39) = ~0.9232312E~38 nextAfter (~0.31415927E1, 0.34028235E39) = ~0.31415925E1 rem (~0.31415927E1, 0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, 0.17014117E39) = ~inf + (~0.31415927E1, 0.17014117E39) = 0.17014117E39 - (~0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (~0.31415927E1, 0.17014117E39) = ~0.18464624E~37 nextAfter (~0.31415927E1, 0.17014117E39) = ~0.31415925E1 rem (~0.31415927E1, 0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, 0.123E4) = ~0.38641592E4 + (~0.31415927E1, 0.123E4) = 0.12268584E4 - (~0.31415927E1, 0.123E4) = ~0.12331416E4 / (~0.31415927E1, 0.123E4) = ~0.25541405E~2 nextAfter (~0.31415927E1, 0.123E4) = ~0.31415925E1 rem (~0.31415927E1, 0.123E4) = ~0.31415927E1 * (~0.31415927E1, 0.123E2) = ~0.3864159E2 + (~0.31415927E1, 0.123E2) = 0.9158407E1 - (~0.31415927E1, 0.123E2) = ~0.15441593E2 / (~0.31415927E1, 0.123E2) = ~0.25541404 nextAfter (~0.31415927E1, 0.123E2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E2) = ~0.31415927E1 * (~0.31415927E1, 0.31415927E1) = ~0.9869605E1 + (~0.31415927E1, 0.31415927E1) = 0.0 - (~0.31415927E1, 0.31415927E1) = ~0.62831855E1 / (~0.31415927E1, 0.31415927E1) = ~0.1E1 nextAfter (~0.31415927E1, 0.31415927E1) = ~0.31415925E1 rem (~0.31415927E1, 0.31415927E1) = 0.0 * (~0.31415927E1, 0.27182817E1) = ~0.8539734E1 + (~0.31415927E1, 0.27182817E1) = ~0.423311 - (~0.31415927E1, 0.27182817E1) = ~0.58598747E1 / (~0.31415927E1, 0.27182817E1) = ~0.11557274E1 nextAfter (~0.31415927E1, 0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, 0.27182817E1) = ~0.423311 * (~0.31415927E1, 0.123E1) = ~0.3864159E1 + (~0.31415927E1, 0.123E1) = ~0.19115927E1 - (~0.31415927E1, 0.123E1) = ~0.43715925E1 / (~0.31415927E1, 0.123E1) = ~0.25541403E1 nextAfter (~0.31415927E1, 0.123E1) = ~0.31415925E1 rem (~0.31415927E1, 0.123E1) = ~0.6815927 * (~0.31415927E1, 0.123) = ~0.38641593 + (~0.31415927E1, 0.123) = ~0.30185928E1 - (~0.31415927E1, 0.123) = ~0.32645926E1 / (~0.31415927E1, 0.123) = ~0.25541403E2 nextAfter (~0.31415927E1, 0.123) = ~0.31415925E1 rem (~0.31415927E1, 0.123) = ~0.6659269E~1 * (~0.31415927E1, 0.123E~2) = ~0.38641593E~2 + (~0.31415927E1, 0.123E~2) = ~0.31403627E1 - (~0.31415927E1, 0.123E~2) = ~0.31428227E1 / (~0.31415927E1, 0.123E~2) = ~0.25541404E4 nextAfter (~0.31415927E1, 0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, 0.11754944E~37) = ~0.36929245E~37 + (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, 0.11754944E~37) = ~0.26725715E39 nextAfter (~0.31415927E1, 0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, 0.11754944E~37) = 0.0 * (~0.31415927E1, 0.5877472E~38) = ~0.18464623E~37 + (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, 0.5877472E~38) = ~inf nextAfter (~0.31415927E1, 0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, 0.5877472E~38) = inf * (~0.31415927E1, 0.1E~44) = ~0.4E~44 + (~0.31415927E1, 0.1E~44) = ~0.31415927E1 - (~0.31415927E1, 0.1E~44) = ~0.31415927E1 / (~0.31415927E1, 0.1E~44) = ~inf nextAfter (~0.31415927E1, 0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, 0.1E~44) = inf * (~0.31415927E1, 0.0) = ~0.0 + (~0.31415927E1, 0.0) = ~0.31415927E1 - (~0.31415927E1, 0.0) = ~0.31415927E1 / (~0.31415927E1, 0.0) = ~inf nextAfter (~0.31415927E1, 0.0) = ~0.31415925E1 rem (~0.31415927E1, 0.0) = nan * (~0.31415927E1, ~0.34028235E39) = inf + (~0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (~0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (~0.31415927E1, ~0.34028235E39) = 0.9232312E~38 nextAfter (~0.31415927E1, ~0.34028235E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, ~0.17014117E39) = inf + (~0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (~0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (~0.31415927E1, ~0.17014117E39) = 0.18464624E~37 nextAfter (~0.31415927E1, ~0.17014117E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, ~0.123E4) = 0.38641592E4 + (~0.31415927E1, ~0.123E4) = ~0.12331416E4 - (~0.31415927E1, ~0.123E4) = 0.12268584E4 / (~0.31415927E1, ~0.123E4) = 0.25541405E~2 nextAfter (~0.31415927E1, ~0.123E4) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E4) = ~0.31415927E1 * (~0.31415927E1, ~0.123E2) = 0.3864159E2 + (~0.31415927E1, ~0.123E2) = ~0.15441593E2 - (~0.31415927E1, ~0.123E2) = 0.9158407E1 / (~0.31415927E1, ~0.123E2) = 0.25541404 nextAfter (~0.31415927E1, ~0.123E2) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E2) = ~0.31415927E1 * (~0.31415927E1, ~0.31415927E1) = 0.9869605E1 + (~0.31415927E1, ~0.31415927E1) = ~0.62831855E1 - (~0.31415927E1, ~0.31415927E1) = 0.0 / (~0.31415927E1, ~0.31415927E1) = 0.1E1 nextAfter (~0.31415927E1, ~0.31415927E1) = ~0.31415927E1 rem (~0.31415927E1, ~0.31415927E1) = 0.0 * (~0.31415927E1, ~0.27182817E1) = 0.8539734E1 + (~0.31415927E1, ~0.27182817E1) = ~0.58598747E1 - (~0.31415927E1, ~0.27182817E1) = ~0.423311 / (~0.31415927E1, ~0.27182817E1) = 0.11557274E1 nextAfter (~0.31415927E1, ~0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.27182817E1) = ~0.423311 * (~0.31415927E1, ~0.123E1) = 0.3864159E1 + (~0.31415927E1, ~0.123E1) = ~0.43715925E1 - (~0.31415927E1, ~0.123E1) = ~0.19115927E1 / (~0.31415927E1, ~0.123E1) = 0.25541403E1 nextAfter (~0.31415927E1, ~0.123E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E1) = ~0.6815927 * (~0.31415927E1, ~0.123) = 0.38641593 + (~0.31415927E1, ~0.123) = ~0.32645926E1 - (~0.31415927E1, ~0.123) = ~0.30185928E1 / (~0.31415927E1, ~0.123) = 0.25541403E2 nextAfter (~0.31415927E1, ~0.123) = ~0.31415925E1 rem (~0.31415927E1, ~0.123) = ~0.6659269E~1 * (~0.31415927E1, ~0.123E~2) = 0.38641593E~2 + (~0.31415927E1, ~0.123E~2) = ~0.31428227E1 - (~0.31415927E1, ~0.123E~2) = ~0.31403627E1 / (~0.31415927E1, ~0.123E~2) = 0.25541404E4 nextAfter (~0.31415927E1, ~0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E~2) = ~0.17261505E~3 * (~0.31415927E1, ~0.11754944E~37) = 0.36929245E~37 + (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, ~0.11754944E~37) = 0.26725715E39 nextAfter (~0.31415927E1, ~0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, ~0.11754944E~37) = 0.0 * (~0.31415927E1, ~0.5877472E~38) = 0.18464623E~37 + (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, ~0.5877472E~38) = inf nextAfter (~0.31415927E1, ~0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, ~0.5877472E~38) = inf * (~0.31415927E1, ~0.1E~44) = 0.4E~44 + (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 - (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 / (~0.31415927E1, ~0.1E~44) = inf nextAfter (~0.31415927E1, ~0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, ~0.1E~44) = inf * (~0.31415927E1, ~0.0) = 0.0 + (~0.31415927E1, ~0.0) = ~0.31415927E1 - (~0.31415927E1, ~0.0) = ~0.31415927E1 / (~0.31415927E1, ~0.0) = inf nextAfter (~0.31415927E1, ~0.0) = ~0.31415925E1 rem (~0.31415927E1, ~0.0) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.31415927E1, ~inf) = inf + (~0.31415927E1, ~inf) = ~inf - (~0.31415927E1, ~inf) = inf / (~0.31415927E1, ~inf) = 0.0 nextAfter (~0.31415927E1, ~inf) = ~0.3141593E1 rem (~0.31415927E1, ~inf) = ~0.31415927E1 * (~0.31415927E1, nan) = nan + (~0.31415927E1, nan) = nan - (~0.31415927E1, nan) = nan / (~0.31415927E1, nan) = nan nextAfter (~0.31415927E1, nan) = nan rem (~0.31415927E1, nan) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.27182817E1, 0.34028235E39) = ~inf + (~0.27182817E1, 0.34028235E39) = 0.34028235E39 - (~0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (~0.27182817E1, 0.34028235E39) = ~0.7988312E~38 nextAfter (~0.27182817E1, 0.34028235E39) = ~0.27182815E1 rem (~0.27182817E1, 0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, 0.17014117E39) = ~inf + (~0.27182817E1, 0.17014117E39) = 0.17014117E39 - (~0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (~0.27182817E1, 0.17014117E39) = ~0.15976626E~37 nextAfter (~0.27182817E1, 0.17014117E39) = ~0.27182815E1 rem (~0.27182817E1, 0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, 0.123E4) = ~0.33434866E4 + (~0.27182817E1, 0.123E4) = 0.12272817E4 - (~0.27182817E1, 0.123E4) = ~0.12327183E4 / (~0.27182817E1, 0.123E4) = ~0.22099852E~2 nextAfter (~0.27182817E1, 0.123E4) = ~0.27182815E1 rem (~0.27182817E1, 0.123E4) = ~0.27182817E1 * (~0.27182817E1, 0.123E2) = ~0.33434868E2 + (~0.27182817E1, 0.123E2) = 0.9581718E1 - (~0.27182817E1, 0.123E2) = ~0.15018282E2 / (~0.27182817E1, 0.123E2) = ~0.22099851 nextAfter (~0.27182817E1, 0.123E2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E2) = ~0.27182817E1 * (~0.27182817E1, 0.31415927E1) = ~0.8539734E1 + (~0.27182817E1, 0.31415927E1) = 0.423311 - (~0.27182817E1, 0.31415927E1) = ~0.58598747E1 / (~0.27182817E1, 0.31415927E1) = ~0.86525595 nextAfter (~0.27182817E1, 0.31415927E1) = ~0.27182815E1 rem (~0.27182817E1, 0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, 0.27182817E1) = ~0.73890557E1 + (~0.27182817E1, 0.27182817E1) = 0.0 - (~0.27182817E1, 0.27182817E1) = ~0.54365635E1 / (~0.27182817E1, 0.27182817E1) = ~0.1E1 nextAfter (~0.27182817E1, 0.27182817E1) = ~0.27182815E1 rem (~0.27182817E1, 0.27182817E1) = 0.0 * (~0.27182817E1, 0.123E1) = ~0.33434865E1 + (~0.27182817E1, 0.123E1) = ~0.14882817E1 - (~0.27182817E1, 0.123E1) = ~0.39482818E1 / (~0.27182817E1, 0.123E1) = ~0.2209985E1 nextAfter (~0.27182817E1, 0.123E1) = ~0.27182815E1 rem (~0.27182817E1, 0.123E1) = ~0.2582817 * (~0.27182817E1, 0.123) = ~0.33434868 + (~0.27182817E1, 0.123) = ~0.25952818E1 - (~0.27182817E1, 0.123) = ~0.28412817E1 / (~0.27182817E1, 0.123) = ~0.22099852E2 nextAfter (~0.27182817E1, 0.123) = ~0.27182815E1 rem (~0.27182817E1, 0.123) = ~0.12281656E~1 * (~0.27182817E1, 0.123E~2) = ~0.33434867E~2 + (~0.27182817E1, 0.123E~2) = ~0.27170517E1 - (~0.27182817E1, 0.123E~2) = ~0.27195117E1 / (~0.27182817E1, 0.123E~2) = ~0.2209985E4 nextAfter (~0.27182817E1, 0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, 0.11754944E~37) = ~0.31953248E~37 + (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, 0.11754944E~37) = ~0.23124584E39 nextAfter (~0.27182817E1, 0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, 0.11754944E~37) = 0.0 * (~0.27182817E1, 0.5877472E~38) = ~0.15976624E~37 + (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, 0.5877472E~38) = ~inf nextAfter (~0.27182817E1, 0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, 0.5877472E~38) = inf * (~0.27182817E1, 0.1E~44) = ~0.4E~44 + (~0.27182817E1, 0.1E~44) = ~0.27182817E1 - (~0.27182817E1, 0.1E~44) = ~0.27182817E1 / (~0.27182817E1, 0.1E~44) = ~inf nextAfter (~0.27182817E1, 0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, 0.1E~44) = inf * (~0.27182817E1, 0.0) = ~0.0 + (~0.27182817E1, 0.0) = ~0.27182817E1 - (~0.27182817E1, 0.0) = ~0.27182817E1 / (~0.27182817E1, 0.0) = ~inf nextAfter (~0.27182817E1, 0.0) = ~0.27182815E1 rem (~0.27182817E1, 0.0) = nan * (~0.27182817E1, ~0.34028235E39) = inf + (~0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (~0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (~0.27182817E1, ~0.34028235E39) = 0.7988312E~38 nextAfter (~0.27182817E1, ~0.34028235E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, ~0.17014117E39) = inf + (~0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (~0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (~0.27182817E1, ~0.17014117E39) = 0.15976626E~37 nextAfter (~0.27182817E1, ~0.17014117E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, ~0.123E4) = 0.33434866E4 + (~0.27182817E1, ~0.123E4) = ~0.12327183E4 - (~0.27182817E1, ~0.123E4) = 0.12272817E4 / (~0.27182817E1, ~0.123E4) = 0.22099852E~2 nextAfter (~0.27182817E1, ~0.123E4) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E4) = ~0.27182817E1 * (~0.27182817E1, ~0.123E2) = 0.33434868E2 + (~0.27182817E1, ~0.123E2) = ~0.15018282E2 - (~0.27182817E1, ~0.123E2) = 0.9581718E1 / (~0.27182817E1, ~0.123E2) = 0.22099851 nextAfter (~0.27182817E1, ~0.123E2) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E2) = ~0.27182817E1 * (~0.27182817E1, ~0.31415927E1) = 0.8539734E1 + (~0.27182817E1, ~0.31415927E1) = ~0.58598747E1 - (~0.27182817E1, ~0.31415927E1) = 0.423311 / (~0.27182817E1, ~0.31415927E1) = 0.86525595 nextAfter (~0.27182817E1, ~0.31415927E1) = ~0.2718282E1 rem (~0.27182817E1, ~0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, ~0.27182817E1) = 0.73890557E1 + (~0.27182817E1, ~0.27182817E1) = ~0.54365635E1 - (~0.27182817E1, ~0.27182817E1) = 0.0 / (~0.27182817E1, ~0.27182817E1) = 0.1E1 nextAfter (~0.27182817E1, ~0.27182817E1) = ~0.27182817E1 rem (~0.27182817E1, ~0.27182817E1) = 0.0 * (~0.27182817E1, ~0.123E1) = 0.33434865E1 + (~0.27182817E1, ~0.123E1) = ~0.39482818E1 - (~0.27182817E1, ~0.123E1) = ~0.14882817E1 / (~0.27182817E1, ~0.123E1) = 0.2209985E1 nextAfter (~0.27182817E1, ~0.123E1) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E1) = ~0.2582817 * (~0.27182817E1, ~0.123) = 0.33434868 + (~0.27182817E1, ~0.123) = ~0.28412817E1 - (~0.27182817E1, ~0.123) = ~0.25952818E1 / (~0.27182817E1, ~0.123) = 0.22099852E2 nextAfter (~0.27182817E1, ~0.123) = ~0.27182815E1 rem (~0.27182817E1, ~0.123) = ~0.12281656E~1 * (~0.27182817E1, ~0.123E~2) = 0.33434867E~2 + (~0.27182817E1, ~0.123E~2) = ~0.27195117E1 - (~0.27182817E1, ~0.123E~2) = ~0.27170517E1 / (~0.27182817E1, ~0.123E~2) = 0.2209985E4 nextAfter (~0.27182817E1, ~0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E~2) = ~0.12116432E~2 * (~0.27182817E1, ~0.11754944E~37) = 0.31953248E~37 + (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, ~0.11754944E~37) = 0.23124584E39 nextAfter (~0.27182817E1, ~0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, ~0.11754944E~37) = 0.0 * (~0.27182817E1, ~0.5877472E~38) = 0.15976624E~37 + (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, ~0.5877472E~38) = inf nextAfter (~0.27182817E1, ~0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, ~0.5877472E~38) = inf * (~0.27182817E1, ~0.1E~44) = 0.4E~44 + (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 - (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 / (~0.27182817E1, ~0.1E~44) = inf nextAfter (~0.27182817E1, ~0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, ~0.1E~44) = inf * (~0.27182817E1, ~0.0) = 0.0 + (~0.27182817E1, ~0.0) = ~0.27182817E1 - (~0.27182817E1, ~0.0) = ~0.27182817E1 / (~0.27182817E1, ~0.0) = inf nextAfter (~0.27182817E1, ~0.0) = ~0.27182815E1 rem (~0.27182817E1, ~0.0) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.27182817E1, ~inf) = inf + (~0.27182817E1, ~inf) = ~inf - (~0.27182817E1, ~inf) = inf / (~0.27182817E1, ~inf) = 0.0 nextAfter (~0.27182817E1, ~inf) = ~0.2718282E1 rem (~0.27182817E1, ~inf) = ~0.27182817E1 * (~0.27182817E1, nan) = nan + (~0.27182817E1, nan) = nan - (~0.27182817E1, nan) = nan / (~0.27182817E1, nan) = nan nextAfter (~0.27182817E1, nan) = nan rem (~0.27182817E1, nan) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.123E1, 0.34028235E39) = ~inf + (~0.123E1, 0.34028235E39) = 0.34028235E39 - (~0.123E1, 0.34028235E39) = ~0.34028235E39 / (~0.123E1, 0.34028235E39) = ~0.3614645E~38 nextAfter (~0.123E1, 0.34028235E39) = ~0.12299999E1 rem (~0.123E1, 0.34028235E39) = ~0.123E1 * (~0.123E1, 0.17014117E39) = ~0.20927364E39 + (~0.123E1, 0.17014117E39) = 0.17014117E39 - (~0.123E1, 0.17014117E39) = ~0.17014117E39 / (~0.123E1, 0.17014117E39) = ~0.722929E~38 nextAfter (~0.123E1, 0.17014117E39) = ~0.12299999E1 rem (~0.123E1, 0.17014117E39) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530001E2 / (~0.123E1, 0.123E2) = ~0.1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.31415927E1) = ~0.3864159E1 + (~0.123E1, 0.31415927E1) = 0.19115927E1 - (~0.123E1, 0.31415927E1) = ~0.43715925E1 / (~0.123E1, 0.31415927E1) = ~0.39152116 nextAfter (~0.123E1, 0.31415927E1) = ~0.12299999E1 rem (~0.123E1, 0.31415927E1) = ~0.123E1 * (~0.123E1, 0.27182817E1) = ~0.33434865E1 + (~0.123E1, 0.27182817E1) = 0.14882817E1 - (~0.123E1, 0.27182817E1) = ~0.39482818E1 / (~0.123E1, 0.27182817E1) = ~0.45249173 nextAfter (~0.123E1, 0.27182817E1) = ~0.12299999E1 rem (~0.123E1, 0.27182817E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129001E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.11754944E~37) = ~0.14458581E~37 + (~0.123E1, 0.11754944E~37) = ~0.123E1 - (~0.123E1, 0.11754944E~37) = ~0.123E1 / (~0.123E1, 0.11754944E~37) = ~0.10463683E39 nextAfter (~0.123E1, 0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, 0.11754944E~37) = 0.0 * (~0.123E1, 0.5877472E~38) = ~0.722929E~38 + (~0.123E1, 0.5877472E~38) = ~0.123E1 - (~0.123E1, 0.5877472E~38) = ~0.123E1 / (~0.123E1, 0.5877472E~38) = ~0.20927366E39 nextAfter (~0.123E1, 0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, 0.5877472E~38) = 0.0 * (~0.123E1, 0.1E~44) = ~0.1E~44 + (~0.123E1, 0.1E~44) = ~0.123E1 - (~0.123E1, 0.1E~44) = ~0.123E1 / (~0.123E1, 0.1E~44) = ~inf nextAfter (~0.123E1, 0.1E~44) = ~0.12299999E1 rem (~0.123E1, 0.1E~44) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.34028235E39) = inf + (~0.123E1, ~0.34028235E39) = ~0.34028235E39 - (~0.123E1, ~0.34028235E39) = 0.34028235E39 / (~0.123E1, ~0.34028235E39) = 0.3614645E~38 nextAfter (~0.123E1, ~0.34028235E39) = ~0.12300001E1 rem (~0.123E1, ~0.34028235E39) = ~0.123E1 * (~0.123E1, ~0.17014117E39) = 0.20927364E39 + (~0.123E1, ~0.17014117E39) = ~0.17014117E39 - (~0.123E1, ~0.17014117E39) = 0.17014117E39 / (~0.123E1, ~0.17014117E39) = 0.722929E~38 nextAfter (~0.123E1, ~0.17014117E39) = ~0.12300001E1 rem (~0.123E1, ~0.17014117E39) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300001E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129001E2 + (~0.123E1, ~0.123E2) = ~0.13530001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300001E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.31415927E1) = 0.3864159E1 + (~0.123E1, ~0.31415927E1) = ~0.43715925E1 - (~0.123E1, ~0.31415927E1) = 0.19115927E1 / (~0.123E1, ~0.31415927E1) = 0.39152116 nextAfter (~0.123E1, ~0.31415927E1) = ~0.12300001E1 rem (~0.123E1, ~0.31415927E1) = ~0.123E1 * (~0.123E1, ~0.27182817E1) = 0.33434865E1 + (~0.123E1, ~0.27182817E1) = ~0.39482818E1 - (~0.123E1, ~0.27182817E1) = 0.14882817E1 / (~0.123E1, ~0.27182817E1) = 0.45249173 nextAfter (~0.123E1, ~0.27182817E1) = ~0.12300001E1 rem (~0.123E1, ~0.27182817E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129001E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.11754944E~37) = 0.14458581E~37 + (~0.123E1, ~0.11754944E~37) = ~0.123E1 - (~0.123E1, ~0.11754944E~37) = ~0.123E1 / (~0.123E1, ~0.11754944E~37) = 0.10463683E39 nextAfter (~0.123E1, ~0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, ~0.11754944E~37) = 0.0 * (~0.123E1, ~0.5877472E~38) = 0.722929E~38 + (~0.123E1, ~0.5877472E~38) = ~0.123E1 - (~0.123E1, ~0.5877472E~38) = ~0.123E1 / (~0.123E1, ~0.5877472E~38) = 0.20927366E39 nextAfter (~0.123E1, ~0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, ~0.5877472E~38) = 0.0 * (~0.123E1, ~0.1E~44) = 0.1E~44 + (~0.123E1, ~0.1E~44) = ~0.123E1 - (~0.123E1, ~0.1E~44) = ~0.123E1 / (~0.123E1, ~0.1E~44) = inf nextAfter (~0.123E1, ~0.1E~44) = ~0.12299999E1 rem (~0.123E1, ~0.1E~44) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300001E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.34028235E39) = ~0.4185473E38 + (~0.123, 0.34028235E39) = 0.34028235E39 - (~0.123, 0.34028235E39) = ~0.34028235E39 / (~0.123, 0.34028235E39) = ~0.361465E~39 nextAfter (~0.123, 0.34028235E39) = ~0.122999996 rem (~0.123, 0.34028235E39) = ~0.123 * (~0.123, 0.17014117E39) = ~0.20927365E38 + (~0.123, 0.17014117E39) = 0.17014117E39 - (~0.123, 0.17014117E39) = ~0.17014117E39 / (~0.123, 0.17014117E39) = ~0.722928E~39 nextAfter (~0.123, 0.17014117E39) = ~0.122999996 rem (~0.123, 0.17014117E39) = ~0.123 * (~0.123, 0.123E4) = ~0.15129001E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.100000005E~3 nextAfter (~0.123, 0.123E4) = ~0.122999996 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129001E1 + (~0.123, 0.123E2) = 0.12177E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.1E~1 nextAfter (~0.123, 0.123E2) = ~0.122999996 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.31415927E1) = ~0.38641593 + (~0.123, 0.31415927E1) = 0.30185928E1 - (~0.123, 0.31415927E1) = ~0.32645926E1 / (~0.123, 0.31415927E1) = ~0.39152116E~1 nextAfter (~0.123, 0.31415927E1) = ~0.122999996 rem (~0.123, 0.31415927E1) = ~0.123 * (~0.123, 0.27182817E1) = ~0.33434868 + (~0.123, 0.27182817E1) = 0.25952818E1 - (~0.123, 0.27182817E1) = ~0.28412817E1 / (~0.123, 0.27182817E1) = ~0.45249175E~1 nextAfter (~0.123, 0.27182817E1) = ~0.122999996 rem (~0.123, 0.27182817E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.122999996 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129001E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.122999996 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.124230005 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.122999996 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.11754944E~37) = ~0.1445858E~38 + (~0.123, 0.11754944E~37) = ~0.123 - (~0.123, 0.11754944E~37) = ~0.123 / (~0.123, 0.11754944E~37) = ~0.10463683E38 nextAfter (~0.123, 0.11754944E~37) = ~0.122999996 rem (~0.123, 0.11754944E~37) = 0.0 * (~0.123, 0.5877472E~38) = ~0.722928E~39 + (~0.123, 0.5877472E~38) = ~0.123 - (~0.123, 0.5877472E~38) = ~0.123 / (~0.123, 0.5877472E~38) = ~0.20927366E38 nextAfter (~0.123, 0.5877472E~38) = ~0.122999996 rem (~0.123, 0.5877472E~38) = 0.0 * (~0.123, 0.1E~44) = ~0.0 + (~0.123, 0.1E~44) = ~0.123 - (~0.123, 0.1E~44) = ~0.123 / (~0.123, 0.1E~44) = ~inf nextAfter (~0.123, 0.1E~44) = ~0.122999996 rem (~0.123, 0.1E~44) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.122999996 rem (~0.123, 0.0) = nan * (~0.123, ~0.34028235E39) = 0.4185473E38 + (~0.123, ~0.34028235E39) = ~0.34028235E39 - (~0.123, ~0.34028235E39) = 0.34028235E39 / (~0.123, ~0.34028235E39) = 0.361465E~39 nextAfter (~0.123, ~0.34028235E39) = ~0.12300001 rem (~0.123, ~0.34028235E39) = ~0.123 * (~0.123, ~0.17014117E39) = 0.20927365E38 + (~0.123, ~0.17014117E39) = ~0.17014117E39 - (~0.123, ~0.17014117E39) = 0.17014117E39 / (~0.123, ~0.17014117E39) = 0.722928E~39 nextAfter (~0.123, ~0.17014117E39) = ~0.12300001 rem (~0.123, ~0.17014117E39) = ~0.123 * (~0.123, ~0.123E4) = 0.15129001E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.100000005E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177E2 / (~0.123, ~0.123E2) = 0.1E~1 nextAfter (~0.123, ~0.123E2) = ~0.12300001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.31415927E1) = 0.38641593 + (~0.123, ~0.31415927E1) = ~0.32645926E1 - (~0.123, ~0.31415927E1) = 0.30185928E1 / (~0.123, ~0.31415927E1) = 0.39152116E~1 nextAfter (~0.123, ~0.31415927E1) = ~0.12300001 rem (~0.123, ~0.31415927E1) = ~0.123 * (~0.123, ~0.27182817E1) = 0.33434868 + (~0.123, ~0.27182817E1) = ~0.28412817E1 - (~0.123, ~0.27182817E1) = 0.25952818E1 / (~0.123, ~0.27182817E1) = 0.45249175E~1 nextAfter (~0.123, ~0.27182817E1) = ~0.12300001 rem (~0.123, ~0.27182817E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129001E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.124230005 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.122999996 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.11754944E~37) = 0.1445858E~38 + (~0.123, ~0.11754944E~37) = ~0.123 - (~0.123, ~0.11754944E~37) = ~0.123 / (~0.123, ~0.11754944E~37) = 0.10463683E38 nextAfter (~0.123, ~0.11754944E~37) = ~0.122999996 rem (~0.123, ~0.11754944E~37) = 0.0 * (~0.123, ~0.5877472E~38) = 0.722928E~39 + (~0.123, ~0.5877472E~38) = ~0.123 - (~0.123, ~0.5877472E~38) = ~0.123 / (~0.123, ~0.5877472E~38) = 0.20927366E38 nextAfter (~0.123, ~0.5877472E~38) = ~0.122999996 rem (~0.123, ~0.5877472E~38) = 0.0 * (~0.123, ~0.1E~44) = 0.0 + (~0.123, ~0.1E~44) = ~0.123 - (~0.123, ~0.1E~44) = ~0.123 / (~0.123, ~0.1E~44) = inf nextAfter (~0.123, ~0.1E~44) = ~0.122999996 rem (~0.123, ~0.1E~44) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.122999996 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.34028235E39) = ~0.4185473E36 + (~0.123E~2, 0.34028235E39) = 0.34028235E39 - (~0.123E~2, 0.34028235E39) = ~0.34028235E39 / (~0.123E~2, 0.34028235E39) = ~0.3614E~41 nextAfter (~0.123E~2, 0.34028235E39) = ~0.12299999E~2 rem (~0.123E~2, 0.34028235E39) = ~0.123E~2 * (~0.123E~2, 0.17014117E39) = ~0.20927364E36 + (~0.123E~2, 0.17014117E39) = 0.17014117E39 - (~0.123E~2, 0.17014117E39) = ~0.17014117E39 / (~0.123E~2, 0.17014117E39) = ~0.7229E~41 nextAfter (~0.123E~2, 0.17014117E39) = ~0.12299999E~2 rem (~0.123E~2, 0.17014117E39) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129001E1 + (~0.123E~2, 0.123E4) = 0.12299988E4 - (~0.123E~2, 0.123E4) = ~0.12300012E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129001E~1 + (~0.123E~2, 0.123E2) = 0.1229877E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.100000005E~3 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.31415927E1) = ~0.38641593E~2 + (~0.123E~2, 0.31415927E1) = 0.31403627E1 - (~0.123E~2, 0.31415927E1) = ~0.31428227E1 / (~0.123E~2, 0.31415927E1) = ~0.39152117E~3 nextAfter (~0.123E~2, 0.31415927E1) = ~0.12299999E~2 rem (~0.123E~2, 0.31415927E1) = ~0.123E~2 * (~0.123E~2, 0.27182817E1) = ~0.33434867E~2 + (~0.123E~2, 0.27182817E1) = 0.27170517E1 - (~0.123E~2, 0.27182817E1) = ~0.27195117E1 / (~0.123E~2, 0.27182817E1) = ~0.45249175E~3 nextAfter (~0.123E~2, 0.27182817E1) = ~0.12299999E~2 rem (~0.123E~2, 0.27182817E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129001E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.124230005 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129001E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.11754944E~37) = ~0.14459E~40 + (~0.123E~2, 0.11754944E~37) = ~0.123E~2 - (~0.123E~2, 0.11754944E~37) = ~0.123E~2 / (~0.123E~2, 0.11754944E~37) = ~0.10463683E36 nextAfter (~0.123E~2, 0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, 0.11754944E~37) = 0.0 * (~0.123E~2, 0.5877472E~38) = ~0.7229E~41 + (~0.123E~2, 0.5877472E~38) = ~0.123E~2 - (~0.123E~2, 0.5877472E~38) = ~0.123E~2 / (~0.123E~2, 0.5877472E~38) = ~0.20927366E36 nextAfter (~0.123E~2, 0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, 0.5877472E~38) = 0.0 * (~0.123E~2, 0.1E~44) = ~0.0 + (~0.123E~2, 0.1E~44) = ~0.123E~2 - (~0.123E~2, 0.1E~44) = ~0.123E~2 / (~0.123E~2, 0.1E~44) = ~inf nextAfter (~0.123E~2, 0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, 0.1E~44) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.34028235E39) = 0.4185473E36 + (~0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E~2, ~0.34028235E39) = 0.34028235E39 / (~0.123E~2, ~0.34028235E39) = 0.3614E~41 nextAfter (~0.123E~2, ~0.34028235E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.34028235E39) = ~0.123E~2 * (~0.123E~2, ~0.17014117E39) = 0.20927364E36 + (~0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E~2, ~0.17014117E39) = 0.17014117E39 / (~0.123E~2, ~0.17014117E39) = 0.7229E~41 nextAfter (~0.123E~2, ~0.17014117E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.17014117E39) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129001E1 + (~0.123E~2, ~0.123E4) = ~0.12300012E4 - (~0.123E~2, ~0.123E4) = 0.12299988E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129001E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.1229877E2 / (~0.123E~2, ~0.123E2) = 0.100000005E~3 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.31415927E1) = 0.38641593E~2 + (~0.123E~2, ~0.31415927E1) = ~0.31428227E1 - (~0.123E~2, ~0.31415927E1) = 0.31403627E1 / (~0.123E~2, ~0.31415927E1) = 0.39152117E~3 nextAfter (~0.123E~2, ~0.31415927E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.31415927E1) = ~0.123E~2 * (~0.123E~2, ~0.27182817E1) = 0.33434867E~2 + (~0.123E~2, ~0.27182817E1) = ~0.27195117E1 - (~0.123E~2, ~0.27182817E1) = 0.27170517E1 / (~0.123E~2, ~0.27182817E1) = 0.45249175E~3 nextAfter (~0.123E~2, ~0.27182817E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.27182817E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129001E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.124230005 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129001E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.11754944E~37) = 0.14459E~40 + (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 - (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 / (~0.123E~2, ~0.11754944E~37) = 0.10463683E36 nextAfter (~0.123E~2, ~0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, ~0.11754944E~37) = 0.0 * (~0.123E~2, ~0.5877472E~38) = 0.7229E~41 + (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 - (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 / (~0.123E~2, ~0.5877472E~38) = 0.20927366E36 nextAfter (~0.123E~2, ~0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, ~0.5877472E~38) = 0.0 * (~0.123E~2, ~0.1E~44) = 0.0 + (~0.123E~2, ~0.1E~44) = ~0.123E~2 - (~0.123E~2, ~0.1E~44) = ~0.123E~2 / (~0.123E~2, ~0.1E~44) = inf nextAfter (~0.123E~2, ~0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, ~0.1E~44) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.11754944E~37, 0.34028235E39) = ~0.39999998E1 + (~0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (~0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (~0.11754944E~37, 0.34028235E39) = ~0.0 nextAfter (~0.11754944E~37, 0.34028235E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.17014117E39) = ~0.19999999E1 + (~0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (~0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (~0.11754944E~37, 0.17014117E39) = ~0.0 nextAfter (~0.11754944E~37, 0.17014117E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E4) = ~0.1445858E~34 + (~0.11754944E~37, 0.123E4) = 0.123E4 - (~0.11754944E~37, 0.123E4) = ~0.123E4 / (~0.11754944E~37, 0.123E4) = ~0.9557E~41 nextAfter (~0.11754944E~37, 0.123E4) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E2) = ~0.14458581E~36 + (~0.11754944E~37, 0.123E2) = 0.123E2 - (~0.11754944E~37, 0.123E2) = ~0.123E2 / (~0.11754944E~37, 0.123E2) = ~0.955687E~39 nextAfter (~0.11754944E~37, 0.123E2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, 0.31415927E1) = ~0.36929245E~37 + (~0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (~0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (~0.11754944E~37, 0.31415927E1) = ~0.3741715E~38 nextAfter (~0.11754944E~37, 0.31415927E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.27182817E1) = ~0.31953248E~37 + (~0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (~0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (~0.11754944E~37, 0.27182817E1) = ~0.4324403E~38 nextAfter (~0.11754944E~37, 0.27182817E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E1) = ~0.14458581E~37 + (~0.11754944E~37, 0.123E1) = 0.123E1 - (~0.11754944E~37, 0.123E1) = ~0.123E1 / (~0.11754944E~37, 0.123E1) = ~0.9556864E~38 nextAfter (~0.11754944E~37, 0.123E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123) = ~0.1445858E~38 + (~0.11754944E~37, 0.123) = 0.123 - (~0.11754944E~37, 0.123) = ~0.123 / (~0.11754944E~37, 0.123) = ~0.9556864E~37 nextAfter (~0.11754944E~37, 0.123) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E~2) = ~0.14459E~40 + (~0.11754944E~37, 0.123E~2) = 0.123E~2 - (~0.11754944E~37, 0.123E~2) = ~0.123E~2 / (~0.11754944E~37, 0.123E~2) = ~0.95568645E~35 nextAfter (~0.11754944E~37, 0.123E~2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, 0.11754944E~37) = ~0.0 + (~0.11754944E~37, 0.11754944E~37) = 0.0 - (~0.11754944E~37, 0.11754944E~37) = ~0.23509887E~37 / (~0.11754944E~37, 0.11754944E~37) = ~0.1E1 nextAfter (~0.11754944E~37, 0.11754944E~37) = ~0.11754942E~37 rem (~0.11754944E~37, 0.11754944E~37) = 0.0 * (~0.11754944E~37, 0.5877472E~38) = ~0.0 + (~0.11754944E~37, 0.5877472E~38) = ~0.5877472E~38 - (~0.11754944E~37, 0.5877472E~38) = ~0.17632415E~37 / (~0.11754944E~37, 0.5877472E~38) = ~0.2E1 nextAfter (~0.11754944E~37, 0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, 0.5877472E~38) = 0.0 * (~0.11754944E~37, 0.1E~44) = ~0.0 + (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 - (~0.11754944E~37, 0.1E~44) = ~0.11754945E~37 / (~0.11754944E~37, 0.1E~44) = ~0.8388608E7 nextAfter (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, 0.1E~44) = 0.0 * (~0.11754944E~37, 0.0) = ~0.0 + (~0.11754944E~37, 0.0) = ~0.11754944E~37 - (~0.11754944E~37, 0.0) = ~0.11754944E~37 / (~0.11754944E~37, 0.0) = ~inf nextAfter (~0.11754944E~37, 0.0) = ~0.11754942E~37 rem (~0.11754944E~37, 0.0) = nan * (~0.11754944E~37, ~0.34028235E39) = 0.39999998E1 + (~0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (~0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (~0.11754944E~37, ~0.34028235E39) = 0.0 nextAfter (~0.11754944E~37, ~0.34028235E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.17014117E39) = 0.19999999E1 + (~0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (~0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (~0.11754944E~37, ~0.17014117E39) = 0.0 nextAfter (~0.11754944E~37, ~0.17014117E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E4) = 0.1445858E~34 + (~0.11754944E~37, ~0.123E4) = ~0.123E4 - (~0.11754944E~37, ~0.123E4) = 0.123E4 / (~0.11754944E~37, ~0.123E4) = 0.9557E~41 nextAfter (~0.11754944E~37, ~0.123E4) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E2) = 0.14458581E~36 + (~0.11754944E~37, ~0.123E2) = ~0.123E2 - (~0.11754944E~37, ~0.123E2) = 0.123E2 / (~0.11754944E~37, ~0.123E2) = 0.955687E~39 nextAfter (~0.11754944E~37, ~0.123E2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.31415927E1) = 0.36929245E~37 + (~0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (~0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (~0.11754944E~37, ~0.31415927E1) = 0.3741715E~38 nextAfter (~0.11754944E~37, ~0.31415927E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.27182817E1) = 0.31953248E~37 + (~0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (~0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (~0.11754944E~37, ~0.27182817E1) = 0.4324403E~38 nextAfter (~0.11754944E~37, ~0.27182817E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E1) = 0.14458581E~37 + (~0.11754944E~37, ~0.123E1) = ~0.123E1 - (~0.11754944E~37, ~0.123E1) = 0.123E1 / (~0.11754944E~37, ~0.123E1) = 0.9556864E~38 nextAfter (~0.11754944E~37, ~0.123E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123) = 0.1445858E~38 + (~0.11754944E~37, ~0.123) = ~0.123 - (~0.11754944E~37, ~0.123) = 0.123 / (~0.11754944E~37, ~0.123) = 0.9556864E~37 nextAfter (~0.11754944E~37, ~0.123) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E~2) = 0.14459E~40 + (~0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (~0.11754944E~37, ~0.123E~2) = 0.123E~2 / (~0.11754944E~37, ~0.123E~2) = 0.95568645E~35 nextAfter (~0.11754944E~37, ~0.123E~2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.11754944E~37) = 0.0 + (~0.11754944E~37, ~0.11754944E~37) = ~0.23509887E~37 - (~0.11754944E~37, ~0.11754944E~37) = 0.0 / (~0.11754944E~37, ~0.11754944E~37) = 0.1E1 nextAfter (~0.11754944E~37, ~0.11754944E~37) = ~0.11754944E~37 rem (~0.11754944E~37, ~0.11754944E~37) = 0.0 * (~0.11754944E~37, ~0.5877472E~38) = 0.0 + (~0.11754944E~37, ~0.5877472E~38) = ~0.17632415E~37 - (~0.11754944E~37, ~0.5877472E~38) = ~0.5877472E~38 / (~0.11754944E~37, ~0.5877472E~38) = 0.2E1 nextAfter (~0.11754944E~37, ~0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.5877472E~38) = 0.0 * (~0.11754944E~37, ~0.1E~44) = 0.0 + (~0.11754944E~37, ~0.1E~44) = ~0.11754945E~37 - (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 / (~0.11754944E~37, ~0.1E~44) = 0.8388608E7 nextAfter (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.1E~44) = 0.0 * (~0.11754944E~37, ~0.0) = 0.0 + (~0.11754944E~37, ~0.0) = ~0.11754944E~37 - (~0.11754944E~37, ~0.0) = ~0.11754944E~37 / (~0.11754944E~37, ~0.0) = inf nextAfter (~0.11754944E~37, ~0.0) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.0) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.11754944E~37, ~inf) = inf + (~0.11754944E~37, ~inf) = ~inf - (~0.11754944E~37, ~inf) = inf / (~0.11754944E~37, ~inf) = 0.0 nextAfter (~0.11754944E~37, ~inf) = ~0.11754945E~37 rem (~0.11754944E~37, ~inf) = ~0.11754944E~37 * (~0.11754944E~37, nan) = nan + (~0.11754944E~37, nan) = nan - (~0.11754944E~37, nan) = nan / (~0.11754944E~37, nan) = nan nextAfter (~0.11754944E~37, nan) = nan rem (~0.11754944E~37, nan) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.5877472E~38, 0.34028235E39) = ~0.19999999E1 + (~0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (~0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (~0.5877472E~38, 0.34028235E39) = ~0.0 nextAfter (~0.5877472E~38, 0.34028235E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.17014117E39) = ~0.99999994 + (~0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (~0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (~0.5877472E~38, 0.17014117E39) = ~0.0 nextAfter (~0.5877472E~38, 0.17014117E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E4) = ~0.722929E~35 + (~0.5877472E~38, 0.123E4) = 0.123E4 - (~0.5877472E~38, 0.123E4) = ~0.123E4 / (~0.5877472E~38, 0.123E4) = ~0.4778E~41 nextAfter (~0.5877472E~38, 0.123E4) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E2) = ~0.72292904E~37 + (~0.5877472E~38, 0.123E2) = 0.123E2 - (~0.5877472E~38, 0.123E2) = ~0.123E2 / (~0.5877472E~38, 0.123E2) = ~0.477843E~39 nextAfter (~0.5877472E~38, 0.123E2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, 0.31415927E1) = ~0.18464623E~37 + (~0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (~0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (~0.5877472E~38, 0.31415927E1) = ~0.1870857E~38 nextAfter (~0.5877472E~38, 0.31415927E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.27182817E1) = ~0.15976624E~37 + (~0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (~0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (~0.5877472E~38, 0.27182817E1) = ~0.2162201E~38 nextAfter (~0.5877472E~38, 0.27182817E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E1) = ~0.722929E~38 + (~0.5877472E~38, 0.123E1) = 0.123E1 - (~0.5877472E~38, 0.123E1) = ~0.123E1 / (~0.5877472E~38, 0.123E1) = ~0.4778432E~38 nextAfter (~0.5877472E~38, 0.123E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123) = ~0.722928E~39 + (~0.5877472E~38, 0.123) = 0.123 - (~0.5877472E~38, 0.123) = ~0.123 / (~0.5877472E~38, 0.123) = ~0.4778432E~37 nextAfter (~0.5877472E~38, 0.123) = ~0.587747E~38 rem (~0.5877472E~38, 0.123) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E~2) = ~0.7229E~41 + (~0.5877472E~38, 0.123E~2) = 0.123E~2 - (~0.5877472E~38, 0.123E~2) = ~0.123E~2 / (~0.5877472E~38, 0.123E~2) = ~0.47784322E~35 nextAfter (~0.5877472E~38, 0.123E~2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, 0.11754944E~37) = ~0.0 + (~0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 - (~0.5877472E~38, 0.11754944E~37) = ~0.17632415E~37 / (~0.5877472E~38, 0.11754944E~37) = ~0.5 nextAfter (~0.5877472E~38, 0.11754944E~37) = ~0.587747E~38 rem (~0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, 0.5877472E~38) = ~0.0 + (~0.5877472E~38, 0.5877472E~38) = 0.0 - (~0.5877472E~38, 0.5877472E~38) = ~0.11754944E~37 / (~0.5877472E~38, 0.5877472E~38) = ~0.1E1 nextAfter (~0.5877472E~38, 0.5877472E~38) = ~0.587747E~38 rem (~0.5877472E~38, 0.5877472E~38) = 0.0 * (~0.5877472E~38, 0.1E~44) = ~0.0 + (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 - (~0.5877472E~38, 0.1E~44) = ~0.5877473E~38 / (~0.5877472E~38, 0.1E~44) = ~0.4194304E7 nextAfter (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, 0.1E~44) = 0.0 * (~0.5877472E~38, 0.0) = ~0.0 + (~0.5877472E~38, 0.0) = ~0.5877472E~38 - (~0.5877472E~38, 0.0) = ~0.5877472E~38 / (~0.5877472E~38, 0.0) = ~inf nextAfter (~0.5877472E~38, 0.0) = ~0.587747E~38 rem (~0.5877472E~38, 0.0) = nan * (~0.5877472E~38, ~0.34028235E39) = 0.19999999E1 + (~0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (~0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (~0.5877472E~38, ~0.34028235E39) = 0.0 nextAfter (~0.5877472E~38, ~0.34028235E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.17014117E39) = 0.99999994 + (~0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (~0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (~0.5877472E~38, ~0.17014117E39) = 0.0 nextAfter (~0.5877472E~38, ~0.17014117E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E4) = 0.722929E~35 + (~0.5877472E~38, ~0.123E4) = ~0.123E4 - (~0.5877472E~38, ~0.123E4) = 0.123E4 / (~0.5877472E~38, ~0.123E4) = 0.4778E~41 nextAfter (~0.5877472E~38, ~0.123E4) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E2) = 0.72292904E~37 + (~0.5877472E~38, ~0.123E2) = ~0.123E2 - (~0.5877472E~38, ~0.123E2) = 0.123E2 / (~0.5877472E~38, ~0.123E2) = 0.477843E~39 nextAfter (~0.5877472E~38, ~0.123E2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.31415927E1) = 0.18464623E~37 + (~0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (~0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (~0.5877472E~38, ~0.31415927E1) = 0.1870857E~38 nextAfter (~0.5877472E~38, ~0.31415927E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.27182817E1) = 0.15976624E~37 + (~0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (~0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (~0.5877472E~38, ~0.27182817E1) = 0.2162201E~38 nextAfter (~0.5877472E~38, ~0.27182817E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E1) = 0.722929E~38 + (~0.5877472E~38, ~0.123E1) = ~0.123E1 - (~0.5877472E~38, ~0.123E1) = 0.123E1 / (~0.5877472E~38, ~0.123E1) = 0.4778432E~38 nextAfter (~0.5877472E~38, ~0.123E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123) = 0.722928E~39 + (~0.5877472E~38, ~0.123) = ~0.123 - (~0.5877472E~38, ~0.123) = 0.123 / (~0.5877472E~38, ~0.123) = 0.4778432E~37 nextAfter (~0.5877472E~38, ~0.123) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E~2) = 0.7229E~41 + (~0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (~0.5877472E~38, ~0.123E~2) = 0.123E~2 / (~0.5877472E~38, ~0.123E~2) = 0.47784322E~35 nextAfter (~0.5877472E~38, ~0.123E~2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.11754944E~37) = 0.0 + (~0.5877472E~38, ~0.11754944E~37) = ~0.17632415E~37 - (~0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 / (~0.5877472E~38, ~0.11754944E~37) = 0.5 nextAfter (~0.5877472E~38, ~0.11754944E~37) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, ~0.5877472E~38) = 0.0 + (~0.5877472E~38, ~0.5877472E~38) = ~0.11754944E~37 - (~0.5877472E~38, ~0.5877472E~38) = 0.0 / (~0.5877472E~38, ~0.5877472E~38) = 0.1E1 nextAfter (~0.5877472E~38, ~0.5877472E~38) = ~0.5877472E~38 rem (~0.5877472E~38, ~0.5877472E~38) = 0.0 * (~0.5877472E~38, ~0.1E~44) = 0.0 + (~0.5877472E~38, ~0.1E~44) = ~0.5877473E~38 - (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 / (~0.5877472E~38, ~0.1E~44) = 0.4194304E7 nextAfter (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, ~0.1E~44) = 0.0 * (~0.5877472E~38, ~0.0) = 0.0 + (~0.5877472E~38, ~0.0) = ~0.5877472E~38 - (~0.5877472E~38, ~0.0) = ~0.5877472E~38 / (~0.5877472E~38, ~0.0) = inf nextAfter (~0.5877472E~38, ~0.0) = ~0.587747E~38 rem (~0.5877472E~38, ~0.0) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.5877472E~38, ~inf) = inf + (~0.5877472E~38, ~inf) = ~inf - (~0.5877472E~38, ~inf) = inf / (~0.5877472E~38, ~inf) = 0.0 nextAfter (~0.5877472E~38, ~inf) = ~0.5877473E~38 rem (~0.5877472E~38, ~inf) = ~0.5877472E~38 * (~0.5877472E~38, nan) = nan + (~0.5877472E~38, nan) = nan - (~0.5877472E~38, nan) = nan / (~0.5877472E~38, nan) = nan nextAfter (~0.5877472E~38, nan) = nan rem (~0.5877472E~38, nan) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.1E~44, 0.34028235E39) = ~0.47683713E~6 + (~0.1E~44, 0.34028235E39) = 0.34028235E39 - (~0.1E~44, 0.34028235E39) = ~0.34028235E39 / (~0.1E~44, 0.34028235E39) = ~0.0 nextAfter (~0.1E~44, 0.34028235E39) = ~0.0 rem (~0.1E~44, 0.34028235E39) = ~0.1E~44 * (~0.1E~44, 0.17014117E39) = ~0.23841856E~6 + (~0.1E~44, 0.17014117E39) = 0.17014117E39 - (~0.1E~44, 0.17014117E39) = ~0.17014117E39 / (~0.1E~44, 0.17014117E39) = ~0.0 nextAfter (~0.1E~44, 0.17014117E39) = ~0.0 rem (~0.1E~44, 0.17014117E39) = ~0.1E~44 * (~0.1E~44, 0.123E4) = ~0.1724E~41 + (~0.1E~44, 0.123E4) = 0.123E4 - (~0.1E~44, 0.123E4) = ~0.123E4 / (~0.1E~44, 0.123E4) = ~0.0 nextAfter (~0.1E~44, 0.123E4) = ~0.0 rem (~0.1E~44, 0.123E4) = ~0.1E~44 * (~0.1E~44, 0.123E2) = ~0.17E~43 + (~0.1E~44, 0.123E2) = 0.123E2 - (~0.1E~44, 0.123E2) = ~0.123E2 / (~0.1E~44, 0.123E2) = ~0.0 nextAfter (~0.1E~44, 0.123E2) = ~0.0 rem (~0.1E~44, 0.123E2) = ~0.1E~44 * (~0.1E~44, 0.31415927E1) = ~0.4E~44 + (~0.1E~44, 0.31415927E1) = 0.31415927E1 - (~0.1E~44, 0.31415927E1) = ~0.31415927E1 / (~0.1E~44, 0.31415927E1) = ~0.0 nextAfter (~0.1E~44, 0.31415927E1) = ~0.0 rem (~0.1E~44, 0.31415927E1) = ~0.1E~44 * (~0.1E~44, 0.27182817E1) = ~0.4E~44 + (~0.1E~44, 0.27182817E1) = 0.27182817E1 - (~0.1E~44, 0.27182817E1) = ~0.27182817E1 / (~0.1E~44, 0.27182817E1) = ~0.0 nextAfter (~0.1E~44, 0.27182817E1) = ~0.0 rem (~0.1E~44, 0.27182817E1) = ~0.1E~44 * (~0.1E~44, 0.123E1) = ~0.1E~44 + (~0.1E~44, 0.123E1) = 0.123E1 - (~0.1E~44, 0.123E1) = ~0.123E1 / (~0.1E~44, 0.123E1) = ~0.1E~44 nextAfter (~0.1E~44, 0.123E1) = ~0.0 rem (~0.1E~44, 0.123E1) = ~0.1E~44 * (~0.1E~44, 0.123) = ~0.0 + (~0.1E~44, 0.123) = 0.123 - (~0.1E~44, 0.123) = ~0.123 / (~0.1E~44, 0.123) = ~0.11E~43 nextAfter (~0.1E~44, 0.123) = ~0.0 rem (~0.1E~44, 0.123) = ~0.1E~44 * (~0.1E~44, 0.123E~2) = ~0.0 + (~0.1E~44, 0.123E~2) = 0.123E~2 - (~0.1E~44, 0.123E~2) = ~0.123E~2 / (~0.1E~44, 0.123E~2) = ~0.1139E~41 nextAfter (~0.1E~44, 0.123E~2) = ~0.0 rem (~0.1E~44, 0.123E~2) = ~0.1E~44 * (~0.1E~44, 0.11754944E~37) = ~0.0 + (~0.1E~44, 0.11754944E~37) = 0.11754942E~37 - (~0.1E~44, 0.11754944E~37) = ~0.11754945E~37 / (~0.1E~44, 0.11754944E~37) = ~0.11920929E~6 nextAfter (~0.1E~44, 0.11754944E~37) = ~0.0 rem (~0.1E~44, 0.11754944E~37) = ~0.1E~44 * (~0.1E~44, 0.5877472E~38) = ~0.0 + (~0.1E~44, 0.5877472E~38) = 0.587747E~38 - (~0.1E~44, 0.5877472E~38) = ~0.5877473E~38 / (~0.1E~44, 0.5877472E~38) = ~0.23841858E~6 nextAfter (~0.1E~44, 0.5877472E~38) = ~0.0 rem (~0.1E~44, 0.5877472E~38) = ~0.1E~44 * (~0.1E~44, 0.1E~44) = ~0.0 + (~0.1E~44, 0.1E~44) = 0.0 - (~0.1E~44, 0.1E~44) = ~0.3E~44 / (~0.1E~44, 0.1E~44) = ~0.1E1 nextAfter (~0.1E~44, 0.1E~44) = ~0.0 rem (~0.1E~44, 0.1E~44) = 0.0 * (~0.1E~44, 0.0) = ~0.0 + (~0.1E~44, 0.0) = ~0.1E~44 - (~0.1E~44, 0.0) = ~0.1E~44 / (~0.1E~44, 0.0) = ~inf nextAfter (~0.1E~44, 0.0) = ~0.0 rem (~0.1E~44, 0.0) = nan * (~0.1E~44, ~0.34028235E39) = 0.47683713E~6 + (~0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (~0.1E~44, ~0.34028235E39) = 0.34028235E39 / (~0.1E~44, ~0.34028235E39) = 0.0 nextAfter (~0.1E~44, ~0.34028235E39) = ~0.3E~44 rem (~0.1E~44, ~0.34028235E39) = ~0.1E~44 * (~0.1E~44, ~0.17014117E39) = 0.23841856E~6 + (~0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (~0.1E~44, ~0.17014117E39) = 0.17014117E39 / (~0.1E~44, ~0.17014117E39) = 0.0 nextAfter (~0.1E~44, ~0.17014117E39) = ~0.3E~44 rem (~0.1E~44, ~0.17014117E39) = ~0.1E~44 * (~0.1E~44, ~0.123E4) = 0.1724E~41 + (~0.1E~44, ~0.123E4) = ~0.123E4 - (~0.1E~44, ~0.123E4) = 0.123E4 / (~0.1E~44, ~0.123E4) = 0.0 nextAfter (~0.1E~44, ~0.123E4) = ~0.3E~44 rem (~0.1E~44, ~0.123E4) = ~0.1E~44 * (~0.1E~44, ~0.123E2) = 0.17E~43 + (~0.1E~44, ~0.123E2) = ~0.123E2 - (~0.1E~44, ~0.123E2) = 0.123E2 / (~0.1E~44, ~0.123E2) = 0.0 nextAfter (~0.1E~44, ~0.123E2) = ~0.3E~44 rem (~0.1E~44, ~0.123E2) = ~0.1E~44 * (~0.1E~44, ~0.31415927E1) = 0.4E~44 + (~0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (~0.1E~44, ~0.31415927E1) = 0.31415927E1 / (~0.1E~44, ~0.31415927E1) = 0.0 nextAfter (~0.1E~44, ~0.31415927E1) = ~0.3E~44 rem (~0.1E~44, ~0.31415927E1) = ~0.1E~44 * (~0.1E~44, ~0.27182817E1) = 0.4E~44 + (~0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (~0.1E~44, ~0.27182817E1) = 0.27182817E1 / (~0.1E~44, ~0.27182817E1) = 0.0 nextAfter (~0.1E~44, ~0.27182817E1) = ~0.3E~44 rem (~0.1E~44, ~0.27182817E1) = ~0.1E~44 * (~0.1E~44, ~0.123E1) = 0.1E~44 + (~0.1E~44, ~0.123E1) = ~0.123E1 - (~0.1E~44, ~0.123E1) = 0.123E1 / (~0.1E~44, ~0.123E1) = 0.1E~44 nextAfter (~0.1E~44, ~0.123E1) = ~0.3E~44 rem (~0.1E~44, ~0.123E1) = ~0.1E~44 * (~0.1E~44, ~0.123) = 0.0 + (~0.1E~44, ~0.123) = ~0.123 - (~0.1E~44, ~0.123) = 0.123 / (~0.1E~44, ~0.123) = 0.11E~43 nextAfter (~0.1E~44, ~0.123) = ~0.3E~44 rem (~0.1E~44, ~0.123) = ~0.1E~44 * (~0.1E~44, ~0.123E~2) = 0.0 + (~0.1E~44, ~0.123E~2) = ~0.123E~2 - (~0.1E~44, ~0.123E~2) = 0.123E~2 / (~0.1E~44, ~0.123E~2) = 0.1139E~41 nextAfter (~0.1E~44, ~0.123E~2) = ~0.3E~44 rem (~0.1E~44, ~0.123E~2) = ~0.1E~44 * (~0.1E~44, ~0.11754944E~37) = 0.0 + (~0.1E~44, ~0.11754944E~37) = ~0.11754945E~37 - (~0.1E~44, ~0.11754944E~37) = 0.11754942E~37 / (~0.1E~44, ~0.11754944E~37) = 0.11920929E~6 nextAfter (~0.1E~44, ~0.11754944E~37) = ~0.3E~44 rem (~0.1E~44, ~0.11754944E~37) = ~0.1E~44 * (~0.1E~44, ~0.5877472E~38) = 0.0 + (~0.1E~44, ~0.5877472E~38) = ~0.5877473E~38 - (~0.1E~44, ~0.5877472E~38) = 0.587747E~38 / (~0.1E~44, ~0.5877472E~38) = 0.23841858E~6 nextAfter (~0.1E~44, ~0.5877472E~38) = ~0.3E~44 rem (~0.1E~44, ~0.5877472E~38) = ~0.1E~44 * (~0.1E~44, ~0.1E~44) = 0.0 + (~0.1E~44, ~0.1E~44) = ~0.3E~44 - (~0.1E~44, ~0.1E~44) = 0.0 / (~0.1E~44, ~0.1E~44) = 0.1E1 nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 rem (~0.1E~44, ~0.1E~44) = 0.0 * (~0.1E~44, ~0.0) = 0.0 + (~0.1E~44, ~0.0) = ~0.1E~44 - (~0.1E~44, ~0.0) = ~0.1E~44 / (~0.1E~44, ~0.0) = inf nextAfter (~0.1E~44, ~0.0) = ~0.0 rem (~0.1E~44, ~0.0) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.1E~44, ~inf) = inf + (~0.1E~44, ~inf) = ~inf - (~0.1E~44, ~inf) = inf / (~0.1E~44, ~inf) = 0.0 nextAfter (~0.1E~44, ~inf) = ~0.3E~44 rem (~0.1E~44, ~inf) = ~0.1E~44 * (~0.1E~44, nan) = nan + (~0.1E~44, nan) = nan - (~0.1E~44, nan) = nan / (~0.1E~44, nan) = nan nextAfter (~0.1E~44, nan) = nan rem (~0.1E~44, nan) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.0, 0.34028235E39) = ~0.0 + (~0.0, 0.34028235E39) = 0.34028235E39 - (~0.0, 0.34028235E39) = ~0.34028235E39 / (~0.0, 0.34028235E39) = ~0.0 nextAfter (~0.0, 0.34028235E39) = 0.1E~44 rem (~0.0, 0.34028235E39) = 0.0 * (~0.0, 0.17014117E39) = ~0.0 + (~0.0, 0.17014117E39) = 0.17014117E39 - (~0.0, 0.17014117E39) = ~0.17014117E39 / (~0.0, 0.17014117E39) = ~0.0 nextAfter (~0.0, 0.17014117E39) = 0.1E~44 rem (~0.0, 0.17014117E39) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.1E~44 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.1E~44 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.31415927E1) = ~0.0 + (~0.0, 0.31415927E1) = 0.31415927E1 - (~0.0, 0.31415927E1) = ~0.31415927E1 / (~0.0, 0.31415927E1) = ~0.0 nextAfter (~0.0, 0.31415927E1) = 0.1E~44 rem (~0.0, 0.31415927E1) = 0.0 * (~0.0, 0.27182817E1) = ~0.0 + (~0.0, 0.27182817E1) = 0.27182817E1 - (~0.0, 0.27182817E1) = ~0.27182817E1 / (~0.0, 0.27182817E1) = ~0.0 nextAfter (~0.0, 0.27182817E1) = 0.1E~44 rem (~0.0, 0.27182817E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.1E~44 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.1E~44 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.1E~44 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.11754944E~37) = ~0.0 + (~0.0, 0.11754944E~37) = 0.11754944E~37 - (~0.0, 0.11754944E~37) = ~0.11754944E~37 / (~0.0, 0.11754944E~37) = ~0.0 nextAfter (~0.0, 0.11754944E~37) = 0.1E~44 rem (~0.0, 0.11754944E~37) = 0.0 * (~0.0, 0.5877472E~38) = ~0.0 + (~0.0, 0.5877472E~38) = 0.5877472E~38 - (~0.0, 0.5877472E~38) = ~0.5877472E~38 / (~0.0, 0.5877472E~38) = ~0.0 nextAfter (~0.0, 0.5877472E~38) = 0.1E~44 rem (~0.0, 0.5877472E~38) = 0.0 * (~0.0, 0.1E~44) = ~0.0 + (~0.0, 0.1E~44) = 0.1E~44 - (~0.0, 0.1E~44) = ~0.1E~44 / (~0.0, 0.1E~44) = ~0.0 nextAfter (~0.0, 0.1E~44) = 0.1E~44 rem (~0.0, 0.1E~44) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.34028235E39) = 0.0 + (~0.0, ~0.34028235E39) = ~0.34028235E39 - (~0.0, ~0.34028235E39) = 0.34028235E39 / (~0.0, ~0.34028235E39) = 0.0 nextAfter (~0.0, ~0.34028235E39) = ~0.1E~44 rem (~0.0, ~0.34028235E39) = 0.0 * (~0.0, ~0.17014117E39) = 0.0 + (~0.0, ~0.17014117E39) = ~0.17014117E39 - (~0.0, ~0.17014117E39) = 0.17014117E39 / (~0.0, ~0.17014117E39) = 0.0 nextAfter (~0.0, ~0.17014117E39) = ~0.1E~44 rem (~0.0, ~0.17014117E39) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.1E~44 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.1E~44 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.31415927E1) = 0.0 + (~0.0, ~0.31415927E1) = ~0.31415927E1 - (~0.0, ~0.31415927E1) = 0.31415927E1 / (~0.0, ~0.31415927E1) = 0.0 nextAfter (~0.0, ~0.31415927E1) = ~0.1E~44 rem (~0.0, ~0.31415927E1) = 0.0 * (~0.0, ~0.27182817E1) = 0.0 + (~0.0, ~0.27182817E1) = ~0.27182817E1 - (~0.0, ~0.27182817E1) = 0.27182817E1 / (~0.0, ~0.27182817E1) = 0.0 nextAfter (~0.0, ~0.27182817E1) = ~0.1E~44 rem (~0.0, ~0.27182817E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.1E~44 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.1E~44 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.1E~44 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.11754944E~37) = 0.0 + (~0.0, ~0.11754944E~37) = ~0.11754944E~37 - (~0.0, ~0.11754944E~37) = 0.11754944E~37 / (~0.0, ~0.11754944E~37) = 0.0 nextAfter (~0.0, ~0.11754944E~37) = ~0.1E~44 rem (~0.0, ~0.11754944E~37) = 0.0 * (~0.0, ~0.5877472E~38) = 0.0 + (~0.0, ~0.5877472E~38) = ~0.5877472E~38 - (~0.0, ~0.5877472E~38) = 0.5877472E~38 / (~0.0, ~0.5877472E~38) = 0.0 nextAfter (~0.0, ~0.5877472E~38) = ~0.1E~44 rem (~0.0, ~0.5877472E~38) = 0.0 * (~0.0, ~0.1E~44) = 0.0 + (~0.0, ~0.1E~44) = ~0.1E~44 - (~0.0, ~0.1E~44) = 0.1E~44 / (~0.0, ~0.1E~44) = 0.0 nextAfter (~0.0, ~0.1E~44) = ~0.1E~44 rem (~0.0, ~0.1E~44) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.1E~44 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.34028235E39) = ~inf + (~inf, 0.34028235E39) = ~inf - (~inf, 0.34028235E39) = ~inf / (~inf, 0.34028235E39) = ~inf nextAfter (~inf, 0.34028235E39) = ~inf rem (~inf, 0.34028235E39) = nan * (~inf, 0.17014117E39) = ~inf + (~inf, 0.17014117E39) = ~inf - (~inf, 0.17014117E39) = ~inf / (~inf, 0.17014117E39) = ~inf nextAfter (~inf, 0.17014117E39) = ~inf rem (~inf, 0.17014117E39) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.31415927E1) = ~inf + (~inf, 0.31415927E1) = ~inf - (~inf, 0.31415927E1) = ~inf / (~inf, 0.31415927E1) = ~inf nextAfter (~inf, 0.31415927E1) = ~inf rem (~inf, 0.31415927E1) = nan * (~inf, 0.27182817E1) = ~inf + (~inf, 0.27182817E1) = ~inf - (~inf, 0.27182817E1) = ~inf / (~inf, 0.27182817E1) = ~inf nextAfter (~inf, 0.27182817E1) = ~inf rem (~inf, 0.27182817E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.11754944E~37) = ~inf + (~inf, 0.11754944E~37) = ~inf - (~inf, 0.11754944E~37) = ~inf / (~inf, 0.11754944E~37) = ~inf nextAfter (~inf, 0.11754944E~37) = ~inf rem (~inf, 0.11754944E~37) = nan * (~inf, 0.5877472E~38) = ~inf + (~inf, 0.5877472E~38) = ~inf - (~inf, 0.5877472E~38) = ~inf / (~inf, 0.5877472E~38) = ~inf nextAfter (~inf, 0.5877472E~38) = ~inf rem (~inf, 0.5877472E~38) = nan * (~inf, 0.1E~44) = ~inf + (~inf, 0.1E~44) = ~inf - (~inf, 0.1E~44) = ~inf / (~inf, 0.1E~44) = ~inf nextAfter (~inf, 0.1E~44) = ~inf rem (~inf, 0.1E~44) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.34028235E39) = inf + (~inf, ~0.34028235E39) = ~inf - (~inf, ~0.34028235E39) = ~inf / (~inf, ~0.34028235E39) = inf nextAfter (~inf, ~0.34028235E39) = ~inf rem (~inf, ~0.34028235E39) = nan * (~inf, ~0.17014117E39) = inf + (~inf, ~0.17014117E39) = ~inf - (~inf, ~0.17014117E39) = ~inf / (~inf, ~0.17014117E39) = inf nextAfter (~inf, ~0.17014117E39) = ~inf rem (~inf, ~0.17014117E39) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.31415927E1) = inf + (~inf, ~0.31415927E1) = ~inf - (~inf, ~0.31415927E1) = ~inf / (~inf, ~0.31415927E1) = inf nextAfter (~inf, ~0.31415927E1) = ~inf rem (~inf, ~0.31415927E1) = nan * (~inf, ~0.27182817E1) = inf + (~inf, ~0.27182817E1) = ~inf - (~inf, ~0.27182817E1) = ~inf / (~inf, ~0.27182817E1) = inf nextAfter (~inf, ~0.27182817E1) = ~inf rem (~inf, ~0.27182817E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.11754944E~37) = inf + (~inf, ~0.11754944E~37) = ~inf - (~inf, ~0.11754944E~37) = ~inf / (~inf, ~0.11754944E~37) = inf nextAfter (~inf, ~0.11754944E~37) = ~inf rem (~inf, ~0.11754944E~37) = nan * (~inf, ~0.5877472E~38) = inf + (~inf, ~0.5877472E~38) = ~inf - (~inf, ~0.5877472E~38) = ~inf / (~inf, ~0.5877472E~38) = inf nextAfter (~inf, ~0.5877472E~38) = ~inf rem (~inf, ~0.5877472E~38) = nan * (~inf, ~0.1E~44) = inf + (~inf, ~0.1E~44) = ~inf - (~inf, ~0.1E~44) = ~inf / (~inf, ~0.1E~44) = inf nextAfter (~inf, ~0.1E~44) = ~inf rem (~inf, ~0.1E~44) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.34028235E39) = nan + (nan, 0.34028235E39) = nan - (nan, 0.34028235E39) = nan / (nan, 0.34028235E39) = nan nextAfter (nan, 0.34028235E39) = nan rem (nan, 0.34028235E39) = nan * (nan, 0.17014117E39) = nan + (nan, 0.17014117E39) = nan - (nan, 0.17014117E39) = nan / (nan, 0.17014117E39) = nan nextAfter (nan, 0.17014117E39) = nan rem (nan, 0.17014117E39) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.31415927E1) = nan + (nan, 0.31415927E1) = nan - (nan, 0.31415927E1) = nan / (nan, 0.31415927E1) = nan nextAfter (nan, 0.31415927E1) = nan rem (nan, 0.31415927E1) = nan * (nan, 0.27182817E1) = nan + (nan, 0.27182817E1) = nan - (nan, 0.27182817E1) = nan / (nan, 0.27182817E1) = nan nextAfter (nan, 0.27182817E1) = nan rem (nan, 0.27182817E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.11754944E~37) = nan + (nan, 0.11754944E~37) = nan - (nan, 0.11754944E~37) = nan / (nan, 0.11754944E~37) = nan nextAfter (nan, 0.11754944E~37) = nan rem (nan, 0.11754944E~37) = nan * (nan, 0.5877472E~38) = nan + (nan, 0.5877472E~38) = nan - (nan, 0.5877472E~38) = nan / (nan, 0.5877472E~38) = nan nextAfter (nan, 0.5877472E~38) = nan rem (nan, 0.5877472E~38) = nan * (nan, 0.1E~44) = nan + (nan, 0.1E~44) = nan - (nan, 0.1E~44) = nan / (nan, 0.1E~44) = nan nextAfter (nan, 0.1E~44) = nan rem (nan, 0.1E~44) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.34028235E39) = nan + (nan, ~0.34028235E39) = nan - (nan, ~0.34028235E39) = nan / (nan, ~0.34028235E39) = nan nextAfter (nan, ~0.34028235E39) = nan rem (nan, ~0.34028235E39) = nan * (nan, ~0.17014117E39) = nan + (nan, ~0.17014117E39) = nan - (nan, ~0.17014117E39) = nan / (nan, ~0.17014117E39) = nan nextAfter (nan, ~0.17014117E39) = nan rem (nan, ~0.17014117E39) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.31415927E1) = nan + (nan, ~0.31415927E1) = nan - (nan, ~0.31415927E1) = nan / (nan, ~0.31415927E1) = nan nextAfter (nan, ~0.31415927E1) = nan rem (nan, ~0.31415927E1) = nan * (nan, ~0.27182817E1) = nan + (nan, ~0.27182817E1) = nan - (nan, ~0.27182817E1) = nan / (nan, ~0.27182817E1) = nan nextAfter (nan, ~0.27182817E1) = nan rem (nan, ~0.27182817E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.11754944E~37) = nan + (nan, ~0.11754944E~37) = nan - (nan, ~0.11754944E~37) = nan / (nan, ~0.11754944E~37) = nan nextAfter (nan, ~0.11754944E~37) = nan rem (nan, ~0.11754944E~37) = nan * (nan, ~0.5877472E~38) = nan + (nan, ~0.5877472E~38) = nan - (nan, ~0.5877472E~38) = nan / (nan, ~0.5877472E~38) = nan nextAfter (nan, ~0.5877472E~38) = nan rem (nan, ~0.5877472E~38) = nan * (nan, ~0.1E~44) = nan + (nan, ~0.1E~44) = nan - (nan, ~0.1E~44) = nan / (nan, ~0.1E~44) = nan nextAfter (nan, ~0.1E~44) = nan rem (nan, ~0.1E~44) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.34028235E39) = nan asin (0.34028235E39) = nan atan (0.34028235E39) = 1.570796371 cos (0.34028235E39) = 0.8530210257 cosh (0.34028235E39) = inf exp (0.34028235E39) = inf ln (0.34028235E39) = 88.72283936 log10 (0.34028235E39) = 38.53184128 sin (0.34028235E39) = ~0.521876514 sinh (0.34028235E39) = inf sqrt (0.34028235E39) = 1.844674297E19 tan (0.34028235E39) = ~0.6117979288 tanh (0.34028235E39) = 1 acos (0.17014117E39) = nan asin (0.17014117E39) = nan atan (0.17014117E39) = 1.570796371 cos (0.17014117E39) = ~0.9625541568 cosh (0.17014117E39) = inf exp (0.17014117E39) = inf ln (0.17014117E39) = 88.0296936 log10 (0.17014117E39) = 38.23080826 sin (0.17014117E39) = 0.2710894346 sinh (0.17014117E39) = inf sqrt (0.17014117E39) = 1.30438176E19 tan (0.17014117E39) = ~0.2816355228 tanh (0.17014117E39) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983363 cos (0.123E4) = 0.06642717123 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769459 log10 (0.123E4) = 3.089905024 sin (0.123E4) = ~0.9977912903 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135773 tan (0.123E4) = ~15.02083111 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673972 cos (0.123E2) = 0.9647326469 cosh (0.123E2) = 109848.0156 exp (0.123E2) = 219696.0312 ln (0.123E2) = 2.509599209 log10 (0.123E2) = 1.089905143 sin (0.123E2) = ~0.2632316053 sinh (0.123E2) = 109848.0156 sqrt (0.123E2) = 3.50713563 tan (0.123E2) = ~0.2728544474 tanh (0.123E2) = 1 acos (0.31415927E1) = nan asin (0.31415927E1) = nan atan (0.31415927E1) = 1.262627244 cos (0.31415927E1) = ~1 cosh (0.31415927E1) = 11.59195518 exp (0.31415927E1) = 23.14069557 ln (0.31415927E1) = 1.144729972 log10 (0.31415927E1) = 0.4971498847 sin (0.31415927E1) = ~8.742277657E~8 sinh (0.31415927E1) = 11.54873943 sqrt (0.31415927E1) = 1.772453904 tan (0.31415927E1) = 8.742277657E~8 tanh (0.31415927E1) = 0.9962720871 acos (0.27182817E1) = nan asin (0.27182817E1) = nan atan (0.27182817E1) = 1.218282938 cos (0.27182817E1) = ~0.9117338657 cosh (0.27182817E1) = 7.610124111 exp (0.27182817E1) = 15.15426064 ln (0.27182817E1) = 0.9999999404 log10 (0.27182817E1) = 0.4342944622 sin (0.27182817E1) = 0.4107813537 sinh (0.27182817E1) = 7.544136047 sqrt (0.27182817E1) = 1.648721218 tan (0.27182817E1) = ~0.4505496323 tanh (0.27182817E1) = 0.9913288951 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.888173759 cos (0.123E1) = 0.3342376947 cosh (0.123E1) = 1.856761098 exp (0.123E1) = 3.421229601 ln (0.123E1) = 0.2070141882 log10 (0.123E1) = 0.08990512043 sin (0.123E1) = 0.9424887896 sinh (0.123E1) = 1.564468503 sqrt (0.123E1) = 1.109053612 tan (0.123E1) = 2.819815874 tanh (0.123E1) = 0.8425793648 acos (0.123) = 1.447484016 asin (0.123) = 0.1233122796 atan (0.123) = 0.1223852858 cos (0.123) = 0.9924450517 cosh (0.123) = 1.007574081 exp (0.123) = 1.130884409 ln (0.123) = ~2.095570803 log10 (0.123) = ~0.9100948572 sin (0.123) = 0.1226900965 sinh (0.123) = 0.1233103797 sqrt (0.123) = 0.350713551 tan (0.123) = 0.1236240715 tanh (0.123) = 0.1223834455 acos (0.123E~2) = 1.569566369 asin (0.123E~2) = 0.001230000402 atan (0.123E~2) = 0.001229999471 cos (0.123E~2) = 0.9999992251 cosh (0.123E~2) = 1.000000715 exp (0.123E~2) = 1.001230717 ln (0.123E~2) = ~6.700741291 log10 (0.123E~2) = ~2.910094976 sin (0.123E~2) = 0.001229999703 sinh (0.123E~2) = 0.001230000402 sqrt (0.123E~2) = 0.03507135808 tan (0.123E~2) = 0.001230000635 tanh (0.123E~2) = 0.001229999471 acos (0.11754944E~37) = 1.570796371 asin (0.11754944E~37) = 1.175494351E~38 atan (0.11754944E~37) = 1.175494351E~38 cos (0.11754944E~37) = 1 cosh (0.11754944E~37) = 1 exp (0.11754944E~37) = 1 ln (0.11754944E~37) = ~87.33654785 log10 (0.11754944E~37) = ~37.92977905 sin (0.11754944E~37) = 1.175494351E~38 sinh (0.11754944E~37) = 1.175494351E~38 sqrt (0.11754944E~37) = 1.084202172E~19 tan (0.11754944E~37) = 1.175494351E~38 tanh (0.11754944E~37) = 1.175494351E~38 acos (0.5877472E~38) = 1.570796371 asin (0.5877472E~38) = 5.877471754E~39 atan (0.5877472E~38) = 5.877471754E~39 cos (0.5877472E~38) = 1 cosh (0.5877472E~38) = 1 exp (0.5877472E~38) = 1 ln (0.5877472E~38) = ~88.0296936 log10 (0.5877472E~38) = ~38.23080826 sin (0.5877472E~38) = 5.877471754E~39 sinh (0.5877472E~38) = 5.877471754E~39 sqrt (0.5877472E~38) = 7.666466952E~20 tan (0.5877472E~38) = 5.877471754E~39 tanh (0.5877472E~38) = 5.877471754E~39 acos (0.1E~44) = 1.570796371 asin (0.1E~44) = 1.401298464E~45 atan (0.1E~44) = 1.401298464E~45 cos (0.1E~44) = 1 cosh (0.1E~44) = 1 exp (0.1E~44) = 1 ln (0.1E~44) = ~103.2789307 log10 (0.1E~44) = ~44.85346985 sin (0.1E~44) = 1.401298464E~45 sinh (0.1E~44) = 1.401298464E~45 sqrt (0.1E~44) = 3.743392067E~23 tan (0.1E~44) = 1.401298464E~45 tanh (0.1E~44) = 1.401298464E~45 acos (0.0) = 1.570796371 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.34028235E39) = nan asin (~0.34028235E39) = nan atan (~0.34028235E39) = ~1.570796371 cos (~0.34028235E39) = 0.8530210257 cosh (~0.34028235E39) = inf exp (~0.34028235E39) = 0 ln (~0.34028235E39) = nan log10 (~0.34028235E39) = nan sin (~0.34028235E39) = 0.521876514 sinh (~0.34028235E39) = ~inf sqrt (~0.34028235E39) = nan tan (~0.34028235E39) = 0.6117979288 tanh (~0.34028235E39) = ~1 acos (~0.17014117E39) = nan asin (~0.17014117E39) = nan atan (~0.17014117E39) = ~1.570796371 cos (~0.17014117E39) = ~0.9625541568 cosh (~0.17014117E39) = inf exp (~0.17014117E39) = 0 ln (~0.17014117E39) = nan log10 (~0.17014117E39) = nan sin (~0.17014117E39) = ~0.2710894346 sinh (~0.17014117E39) = ~inf sqrt (~0.17014117E39) = nan tan (~0.17014117E39) = 0.2816355228 tanh (~0.17014117E39) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983363 cos (~0.123E4) = 0.06642717123 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912903 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083111 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673972 cos (~0.123E2) = 0.9647326469 cosh (~0.123E2) = 109848.0156 exp (~0.123E2) = 4.551743586E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632316053 sinh (~0.123E2) = ~109848.0156 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.2728544474 tanh (~0.123E2) = ~1 acos (~0.31415927E1) = nan asin (~0.31415927E1) = nan atan (~0.31415927E1) = ~1.262627244 cos (~0.31415927E1) = ~1 cosh (~0.31415927E1) = 11.59195518 exp (~0.31415927E1) = 0.04321391508 ln (~0.31415927E1) = nan log10 (~0.31415927E1) = nan sin (~0.31415927E1) = 8.742277657E~8 sinh (~0.31415927E1) = ~11.54873943 sqrt (~0.31415927E1) = nan tan (~0.31415927E1) = ~8.742277657E~8 tanh (~0.31415927E1) = ~0.9962720871 acos (~0.27182817E1) = nan asin (~0.27182817E1) = nan atan (~0.27182817E1) = ~1.218282938 cos (~0.27182817E1) = ~0.9117338657 cosh (~0.27182817E1) = 7.610124111 exp (~0.27182817E1) = 0.06598804146 ln (~0.27182817E1) = nan log10 (~0.27182817E1) = nan sin (~0.27182817E1) = ~0.4107813537 sinh (~0.27182817E1) = ~7.544136047 sqrt (~0.27182817E1) = nan tan (~0.27182817E1) = 0.4505496323 tanh (~0.27182817E1) = ~0.9913288951 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.888173759 cos (~0.123E1) = 0.3342376947 cosh (~0.123E1) = 1.856761098 exp (~0.123E1) = 0.2922925651 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424887896 sinh (~0.123E1) = ~1.564468503 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815874 tanh (~0.123E1) = ~0.8425793648 acos (~0.123) = 1.694108605 asin (~0.123) = ~0.1233122796 atan (~0.123) = ~0.1223852858 cos (~0.123) = 0.9924450517 cosh (~0.123) = 1.007574081 exp (~0.123) = 0.8842636347 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.1226900965 sinh (~0.123) = ~0.1233103797 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240715 tanh (~0.123) = ~0.1223834455 acos (~0.123E~2) = 1.572026372 asin (~0.123E~2) = ~0.001230000402 atan (~0.123E~2) = ~0.001229999471 cos (~0.123E~2) = 0.9999992251 cosh (~0.123E~2) = 1.000000715 exp (~0.123E~2) = 0.9987707734 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.001229999703 sinh (~0.123E~2) = ~0.001230000402 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.001230000635 tanh (~0.123E~2) = ~0.001229999471 acos (~0.11754944E~37) = 1.570796371 asin (~0.11754944E~37) = ~1.175494351E~38 atan (~0.11754944E~37) = ~1.175494351E~38 cos (~0.11754944E~37) = 1 cosh (~0.11754944E~37) = 1 exp (~0.11754944E~37) = 1 ln (~0.11754944E~37) = nan log10 (~0.11754944E~37) = nan sin (~0.11754944E~37) = ~1.175494351E~38 sinh (~0.11754944E~37) = ~1.175494351E~38 sqrt (~0.11754944E~37) = nan tan (~0.11754944E~37) = ~1.175494351E~38 tanh (~0.11754944E~37) = ~1.175494351E~38 acos (~0.5877472E~38) = 1.570796371 asin (~0.5877472E~38) = ~5.877471754E~39 atan (~0.5877472E~38) = ~5.877471754E~39 cos (~0.5877472E~38) = 1 cosh (~0.5877472E~38) = 1 exp (~0.5877472E~38) = 1 ln (~0.5877472E~38) = nan log10 (~0.5877472E~38) = nan sin (~0.5877472E~38) = ~5.877471754E~39 sinh (~0.5877472E~38) = ~5.877471754E~39 sqrt (~0.5877472E~38) = nan tan (~0.5877472E~38) = ~5.877471754E~39 tanh (~0.5877472E~38) = ~5.877471754E~39 acos (~0.1E~44) = 1.570796371 asin (~0.1E~44) = ~1.401298464E~45 atan (~0.1E~44) = ~1.401298464E~45 cos (~0.1E~44) = 1 cosh (~0.1E~44) = 1 exp (~0.1E~44) = 1 ln (~0.1E~44) = nan log10 (~0.1E~44) = nan sin (~0.1E~44) = ~1.401298464E~45 sinh (~0.1E~44) = ~1.401298464E~45 sqrt (~0.1E~44) = nan tan (~0.1E~44) = ~1.401298464E~45 tanh (~0.1E~44) = ~1.401298464E~45 acos (~0.0) = 1.570796371 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796371 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.34028235E39, 0.34028235E39) = 0.7853981853 pow (0.34028235E39, 0.34028235E39) = inf atan2 (0.34028235E39, 0.17014117E39) = 1.107148767 pow (0.34028235E39, 0.17014117E39) = inf atan2 (0.34028235E39, 0.123E4) = 1.570796371 pow (0.34028235E39, 0.123E4) = inf atan2 (0.34028235E39, 0.123E2) = 1.570796371 pow (0.34028235E39, 0.123E2) = inf atan2 (0.34028235E39, 0.31415927E1) = 1.570796371 pow (0.34028235E39, 0.31415927E1) = inf atan2 (0.34028235E39, 0.27182817E1) = 1.570796371 pow (0.34028235E39, 0.27182817E1) = inf atan2 (0.34028235E39, 0.123E1) = 1.570796371 pow (0.34028235E39, 0.123E1) = inf atan2 (0.34028235E39, 0.123) = 1.570796371 pow (0.34028235E39, 0.123) = 54880.28906 atan2 (0.34028235E39, 0.123E~2) = 1.570796371 pow (0.34028235E39, 0.123E~2) = 1.115306377 atan2 (0.34028235E39, 0.11754944E~37) = 1.570796371 pow (0.34028235E39, 0.11754944E~37) = 1 atan2 (0.34028235E39, 0.5877472E~38) = 1.570796371 pow (0.34028235E39, 0.5877472E~38) = 1 atan2 (0.34028235E39, 0.1E~44) = 1.570796371 pow (0.34028235E39, 0.1E~44) = 1 atan2 (0.34028235E39, 0.0) = 1.570796371 pow (0.34028235E39, 0.0) = 1 atan2 (0.34028235E39, ~0.34028235E39) = 2.356194496 pow (0.34028235E39, ~0.34028235E39) = 0 atan2 (0.34028235E39, ~0.17014117E39) = 2.034443855 pow (0.34028235E39, ~0.17014117E39) = 0 atan2 (0.34028235E39, ~0.123E4) = 1.570796251 pow (0.34028235E39, ~0.123E4) = 0 atan2 (0.34028235E39, ~0.123E2) = 1.570796251 pow (0.34028235E39, ~0.123E2) = 0 atan2 (0.34028235E39, ~0.31415927E1) = 1.570796251 pow (0.34028235E39, ~0.31415927E1) = 0 atan2 (0.34028235E39, ~0.27182817E1) = 1.570796251 pow (0.34028235E39, ~0.27182817E1) = 0 atan2 (0.34028235E39, ~0.123E1) = 1.570796251 pow (0.34028235E39, ~0.123E1) = 0 atan2 (0.34028235E39, ~0.123) = 1.570796251 pow (0.34028235E39, ~0.123) = 1.822147897E~5 atan2 (0.34028235E39, ~0.123E~2) = 1.570796251 pow (0.34028235E39, ~0.123E~2) = 0.8966146708 atan2 (0.34028235E39, ~0.11754944E~37) = 1.570796251 pow (0.34028235E39, ~0.11754944E~37) = 1 atan2 (0.34028235E39, ~0.5877472E~38) = 1.570796251 pow (0.34028235E39, ~0.5877472E~38) = 1 atan2 (0.34028235E39, ~0.1E~44) = 1.570796251 pow (0.34028235E39, ~0.1E~44) = 1 atan2 (0.34028235E39, ~0.0) = 1.570796371 pow (0.34028235E39, ~0.0) = 1 atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.34028235E39, ~inf) = 3.141592741 pow (0.34028235E39, ~inf) = 0 atan2 (0.34028235E39, nan) = nan pow (0.34028235E39, nan) = nan atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.17014117E39, 0.34028235E39) = 0.463647604 pow (0.17014117E39, 0.34028235E39) = inf atan2 (0.17014117E39, 0.17014117E39) = 0.7853981853 pow (0.17014117E39, 0.17014117E39) = inf atan2 (0.17014117E39, 0.123E4) = 1.570796371 pow (0.17014117E39, 0.123E4) = inf atan2 (0.17014117E39, 0.123E2) = 1.570796371 pow (0.17014117E39, 0.123E2) = inf atan2 (0.17014117E39, 0.31415927E1) = 1.570796371 pow (0.17014117E39, 0.31415927E1) = inf atan2 (0.17014117E39, 0.27182817E1) = 1.570796371 pow (0.17014117E39, 0.27182817E1) = inf atan2 (0.17014117E39, 0.123E1) = 1.570796371 pow (0.17014117E39, 0.123E1) = inf atan2 (0.17014117E39, 0.123) = 1.570796371 pow (0.17014117E39, 0.123) = 50395.26172 atan2 (0.17014117E39, 0.123E~2) = 1.570796371 pow (0.17014117E39, 0.123E~2) = 1.114355803 atan2 (0.17014117E39, 0.11754944E~37) = 1.570796371 pow (0.17014117E39, 0.11754944E~37) = 1 atan2 (0.17014117E39, 0.5877472E~38) = 1.570796371 pow (0.17014117E39, 0.5877472E~38) = 1 atan2 (0.17014117E39, 0.1E~44) = 1.570796371 pow (0.17014117E39, 0.1E~44) = 1 atan2 (0.17014117E39, 0.0) = 1.570796371 pow (0.17014117E39, 0.0) = 1 atan2 (0.17014117E39, ~0.34028235E39) = 2.677945137 pow (0.17014117E39, ~0.34028235E39) = 0 atan2 (0.17014117E39, ~0.17014117E39) = 2.356194496 pow (0.17014117E39, ~0.17014117E39) = 0 atan2 (0.17014117E39, ~0.123E4) = 1.570796251 pow (0.17014117E39, ~0.123E4) = 0 atan2 (0.17014117E39, ~0.123E2) = 1.570796251 pow (0.17014117E39, ~0.123E2) = 0 atan2 (0.17014117E39, ~0.31415927E1) = 1.570796251 pow (0.17014117E39, ~0.31415927E1) = 0 atan2 (0.17014117E39, ~0.27182817E1) = 1.570796251 pow (0.17014117E39, ~0.27182817E1) = 0 atan2 (0.17014117E39, ~0.123E1) = 1.570796251 pow (0.17014117E39, ~0.123E1) = 0 atan2 (0.17014117E39, ~0.123) = 1.570796251 pow (0.17014117E39, ~0.123) = 1.984313531E~5 atan2 (0.17014117E39, ~0.123E~2) = 1.570796251 pow (0.17014117E39, ~0.123E~2) = 0.8973793983 atan2 (0.17014117E39, ~0.11754944E~37) = 1.570796251 pow (0.17014117E39, ~0.11754944E~37) = 1 atan2 (0.17014117E39, ~0.5877472E~38) = 1.570796251 pow (0.17014117E39, ~0.5877472E~38) = 1 atan2 (0.17014117E39, ~0.1E~44) = 1.570796251 pow (0.17014117E39, ~0.1E~44) = 1 atan2 (0.17014117E39, ~0.0) = 1.570796371 pow (0.17014117E39, ~0.0) = 1 atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.17014117E39, ~inf) = 3.141592741 pow (0.17014117E39, ~inf) = 0 atan2 (0.17014117E39, nan) = nan pow (0.17014117E39, nan) = nan atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.123E4, 0.34028235E39) = 3.614645488E~36 pow (0.123E4, 0.34028235E39) = inf atan2 (0.123E4, 0.17014117E39) = 7.229290975E~36 pow (0.123E4, 0.17014117E39) = inf atan2 (0.123E4, 0.123E4) = 0.7853981853 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.560796618 pow (0.123E4, 0.123E2) = 1.013522656E38 atan2 (0.123E4, 0.31415927E1) = 1.568242192 pow (0.123E4, 0.31415927E1) = 5095930368 atan2 (0.123E4, 0.27182817E1) = 1.568586349 pow (0.123E4, 0.27182817E1) = 250745216 atan2 (0.123E4, 0.123E1) = 1.569796324 pow (0.123E4, 0.123E1) = 6318.054199 atan2 (0.123E4, 0.123) = 1.570696354 pow (0.123E4, 0.123) = 2.39915514 atan2 (0.123E4, 0.123E~2) = 1.570795298 pow (0.123E4, 0.123E~2) = 1.008789539 atan2 (0.123E4, 0.11754944E~37) = 1.570796371 pow (0.123E4, 0.11754944E~37) = 1 atan2 (0.123E4, 0.5877472E~38) = 1.570796371 pow (0.123E4, 0.5877472E~38) = 1 atan2 (0.123E4, 0.1E~44) = 1.570796371 pow (0.123E4, 0.1E~44) = 1 atan2 (0.123E4, 0.0) = 1.570796371 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.34028235E39) = 3.141592741 pow (0.123E4, ~0.34028235E39) = 0 atan2 (0.123E4, ~0.17014117E39) = 3.141592741 pow (0.123E4, ~0.17014117E39) = 0 atan2 (0.123E4, ~0.123E4) = 2.356194496 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580796003 pow (0.123E4, ~0.123E2) = 9.86657752E~39 atan2 (0.123E4, ~0.31415927E1) = 1.57335043 pow (0.123E4, ~0.31415927E1) = 1.962350282E~10 atan2 (0.123E4, ~0.27182817E1) = 1.573006272 pow (0.123E4, ~0.27182817E1) = 3.988112063E~9 atan2 (0.123E4, ~0.123E1) = 1.571796298 pow (0.123E4, ~0.123E1) = 1.582765835E~4 atan2 (0.123E4, ~0.123) = 1.570896268 pow (0.123E4, ~0.123) = 0.4168134034 atan2 (0.123E4, ~0.123E~2) = 1.570797324 pow (0.123E4, ~0.123E~2) = 0.991286993 atan2 (0.123E4, ~0.11754944E~37) = 1.570796251 pow (0.123E4, ~0.11754944E~37) = 1 atan2 (0.123E4, ~0.5877472E~38) = 1.570796251 pow (0.123E4, ~0.5877472E~38) = 1 atan2 (0.123E4, ~0.1E~44) = 1.570796251 pow (0.123E4, ~0.1E~44) = 1 atan2 (0.123E4, ~0.0) = 1.570796371 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592741 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.34028235E39) = 3.614645465E~38 pow (0.123E2, 0.34028235E39) = inf atan2 (0.123E2, 0.17014117E39) = 7.22929093E~38 pow (0.123E2, 0.17014117E39) = inf atan2 (0.123E2, 0.123E4) = 0.009999666363 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981853 pow (0.123E2, 0.123E2) = 2.545852141E13 atan2 (0.123E2, 0.31415927E1) = 1.32072866 pow (0.123E2, 0.31415927E1) = 2654.837891 atan2 (0.123E2, 0.27182817E1) = 1.353293777 pow (0.123E2, 0.27182817E1) = 917.6333618 atan2 (0.123E2, 0.123E1) = 1.471127629 pow (0.123E2, 0.123E1) = 21.90702057 atan2 (0.123E2, 0.123) = 1.560796618 pow (0.123E2, 0.123) = 1.361627579 atan2 (0.123E2, 0.123E~2) = 1.570696354 pow (0.123E2, 0.123E~2) = 1.003091574 atan2 (0.123E2, 0.11754944E~37) = 1.570796371 pow (0.123E2, 0.11754944E~37) = 1 atan2 (0.123E2, 0.5877472E~38) = 1.570796371 pow (0.123E2, 0.5877472E~38) = 1 atan2 (0.123E2, 0.1E~44) = 1.570796371 pow (0.123E2, 0.1E~44) = 1 atan2 (0.123E2, 0.0) = 1.570796371 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.34028235E39) = 3.141592741 pow (0.123E2, ~0.34028235E39) = 0 atan2 (0.123E2, ~0.17014117E39) = 3.141592741 pow (0.123E2, ~0.17014117E39) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592989 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.356194496 pow (0.123E2, ~0.123E2) = 3.927958084E~14 atan2 (0.123E2, ~0.31415927E1) = 1.820863962 pow (0.123E2, ~0.31415927E1) = 3.766708251E~4 atan2 (0.123E2, ~0.27182817E1) = 1.788298845 pow (0.123E2, ~0.27182817E1) = 0.00108975987 atan2 (0.123E2, ~0.123E1) = 1.670464993 pow (0.123E2, ~0.123E1) = 0.04564746842 atan2 (0.123E2, ~0.123) = 1.580796003 pow (0.123E2, ~0.123) = 0.7344152331 atan2 (0.123E2, ~0.123E~2) = 1.570896268 pow (0.123E2, ~0.123E~2) = 0.996917963 atan2 (0.123E2, ~0.11754944E~37) = 1.570796251 pow (0.123E2, ~0.11754944E~37) = 1 atan2 (0.123E2, ~0.5877472E~38) = 1.570796251 pow (0.123E2, ~0.5877472E~38) = 1 atan2 (0.123E2, ~0.1E~44) = 1.570796251 pow (0.123E2, ~0.1E~44) = 1 atan2 (0.123E2, ~0.0) = 1.570796371 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592741 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.31415927E1, 0.34028235E39) = 9.232312E~39 pow (0.31415927E1, 0.34028235E39) = inf atan2 (0.31415927E1, 0.17014117E39) = 1.8464624E~38 pow (0.31415927E1, 0.17014117E39) = inf atan2 (0.31415927E1, 0.123E4) = 0.002554134931 pow (0.31415927E1, 0.123E4) = inf atan2 (0.31415927E1, 0.123E2) = 0.2500677109 pow (0.31415927E1, 0.123E2) = 1302997.75 atan2 (0.31415927E1, 0.31415927E1) = 0.7853981853 pow (0.31415927E1, 0.31415927E1) = 36.46216583 atan2 (0.31415927E1, 0.27182817E1) = 0.8575118184 pow (0.31415927E1, 0.27182817E1) = 22.45915794 atan2 (0.31415927E1, 0.123E1) = 1.19762063 pow (0.31415927E1, 0.123E1) = 4.087844372 atan2 (0.31415927E1, 0.123) = 1.531664252 pow (0.31415927E1, 0.123) = 1.15119648 atan2 (0.31415927E1, 0.123E~2) = 1.570404768 pow (0.31415927E1, 0.123E~2) = 1.001409054 atan2 (0.31415927E1, 0.11754944E~37) = 1.570796371 pow (0.31415927E1, 0.11754944E~37) = 1 atan2 (0.31415927E1, 0.5877472E~38) = 1.570796371 pow (0.31415927E1, 0.5877472E~38) = 1 atan2 (0.31415927E1, 0.1E~44) = 1.570796371 pow (0.31415927E1, 0.1E~44) = 1 atan2 (0.31415927E1, 0.0) = 1.570796371 pow (0.31415927E1, 0.0) = 1 atan2 (0.31415927E1, ~0.34028235E39) = 3.141592741 pow (0.31415927E1, ~0.34028235E39) = 0 atan2 (0.31415927E1, ~0.17014117E39) = 3.141592741 pow (0.31415927E1, ~0.17014117E39) = 0 atan2 (0.31415927E1, ~0.123E4) = 3.139038563 pow (0.31415927E1, ~0.123E4) = 0 atan2 (0.31415927E1, ~0.123E2) = 2.89152503 pow (0.31415927E1, ~0.123E2) = 7.674610174E~7 atan2 (0.31415927E1, ~0.31415927E1) = 2.356194496 pow (0.31415927E1, ~0.31415927E1) = 0.02742568776 atan2 (0.31415927E1, ~0.27182817E1) = 2.284080982 pow (0.31415927E1, ~0.27182817E1) = 0.04452526942 atan2 (0.31415927E1, ~0.123E1) = 1.943971992 pow (0.31415927E1, ~0.123E1) = 0.2446276993 atan2 (0.31415927E1, ~0.123) = 1.60992837 pow (0.31415927E1, ~0.123) = 0.8686614633 atan2 (0.31415927E1, ~0.123E~2) = 1.571187854 pow (0.31415927E1, ~0.123E~2) = 0.9985929728 atan2 (0.31415927E1, ~0.11754944E~37) = 1.570796251 pow (0.31415927E1, ~0.11754944E~37) = 1 atan2 (0.31415927E1, ~0.5877472E~38) = 1.570796251 pow (0.31415927E1, ~0.5877472E~38) = 1 atan2 (0.31415927E1, ~0.1E~44) = 1.570796251 pow (0.31415927E1, ~0.1E~44) = 1 atan2 (0.31415927E1, ~0.0) = 1.570796371 pow (0.31415927E1, ~0.0) = 1 atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.31415927E1, ~inf) = 3.141592741 pow (0.31415927E1, ~inf) = 0 atan2 (0.31415927E1, nan) = nan pow (0.31415927E1, nan) = nan atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.27182817E1, 0.34028235E39) = 7.988312091E~39 pow (0.27182817E1, 0.34028235E39) = inf atan2 (0.27182817E1, 0.17014117E39) = 1.597662558E~38 pow (0.27182817E1, 0.17014117E39) = inf atan2 (0.27182817E1, 0.123E4) = 0.002209981671 pow (0.27182817E1, 0.123E4) = inf atan2 (0.27182817E1, 0.123E2) = 0.2175025195 pow (0.27182817E1, 0.123E2) = 219695.9531 atan2 (0.27182817E1, 0.31415927E1) = 0.7132844925 pow (0.27182817E1, 0.31415927E1) = 23.14069176 atan2 (0.27182817E1, 0.27182817E1) = 0.7853981853 pow (0.27182817E1, 0.27182817E1) = 15.15425968 atan2 (0.27182817E1, 0.123E1) = 1.145872235 pow (0.27182817E1, 0.123E1) = 3.421229362 atan2 (0.27182817E1, 0.123) = 1.525578022 pow (0.27182817E1, 0.123) = 1.130884409 atan2 (0.27182817E1, 0.123E~2) = 1.570343852 pow (0.27182817E1, 0.123E~2) = 1.001230717 atan2 (0.27182817E1, 0.11754944E~37) = 1.570796371 pow (0.27182817E1, 0.11754944E~37) = 1 atan2 (0.27182817E1, 0.5877472E~38) = 1.570796371 pow (0.27182817E1, 0.5877472E~38) = 1 atan2 (0.27182817E1, 0.1E~44) = 1.570796371 pow (0.27182817E1, 0.1E~44) = 1 atan2 (0.27182817E1, 0.0) = 1.570796371 pow (0.27182817E1, 0.0) = 1 atan2 (0.27182817E1, ~0.34028235E39) = 3.141592741 pow (0.27182817E1, ~0.34028235E39) = 0 atan2 (0.27182817E1, ~0.17014117E39) = 3.141592741 pow (0.27182817E1, ~0.17014117E39) = 0 atan2 (0.27182817E1, ~0.123E4) = 3.139382601 pow (0.27182817E1, ~0.123E4) = 0 atan2 (0.27182817E1, ~0.123E2) = 2.924090147 pow (0.27182817E1, ~0.123E2) = 4.551745405E~6 atan2 (0.27182817E1, ~0.31415927E1) = 2.428308249 pow (0.27182817E1, ~0.31415927E1) = 0.04321391881 atan2 (0.27182817E1, ~0.27182817E1) = 2.356194496 pow (0.27182817E1, ~0.27182817E1) = 0.06598804891 atan2 (0.27182817E1, ~0.123E1) = 1.995720387 pow (0.27182817E1, ~0.123E1) = 0.2922925949 atan2 (0.27182817E1, ~0.123) = 1.6160146 pow (0.27182817E1, ~0.123) = 0.8842636347 atan2 (0.27182817E1, ~0.123E~2) = 1.57124877 pow (0.27182817E1, ~0.123E~2) = 0.9987707734 atan2 (0.27182817E1, ~0.11754944E~37) = 1.570796251 pow (0.27182817E1, ~0.11754944E~37) = 1 atan2 (0.27182817E1, ~0.5877472E~38) = 1.570796251 pow (0.27182817E1, ~0.5877472E~38) = 1 atan2 (0.27182817E1, ~0.1E~44) = 1.570796251 pow (0.27182817E1, ~0.1E~44) = 1 atan2 (0.27182817E1, ~0.0) = 1.570796371 pow (0.27182817E1, ~0.0) = 1 atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.27182817E1, ~inf) = 3.141592741 pow (0.27182817E1, ~inf) = 0 atan2 (0.27182817E1, nan) = nan pow (0.27182817E1, nan) = nan atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.123E1, 0.34028235E39) = 3.614645185E~39 pow (0.123E1, 0.34028235E39) = inf atan2 (0.123E1, 0.17014117E39) = 7.22929037E~39 pow (0.123E1, 0.17014117E39) = inf atan2 (0.123E1, 0.123E4) = 9.999996983E~4 pow (0.123E1, 0.123E4) = inf atan2 (0.123E1, 0.123E2) = 0.09966865182 pow (0.123E1, 0.123E2) = 12.75947952 atan2 (0.123E1, 0.31415927E1) = 0.3731757402 pow (0.123E1, 0.31415927E1) = 1.916219592 atan2 (0.123E1, 0.27182817E1) = 0.4249241054 pow (0.123E1, 0.27182817E1) = 1.755445838 atan2 (0.123E1, 0.123E1) = 0.7853981853 pow (0.123E1, 0.123E1) = 1.289981008 atan2 (0.123E1, 0.123) = 1.471127629 pow (0.123E1, 0.123) = 1.025789738 atan2 (0.123E1, 0.123E~2) = 1.569796324 pow (0.123E1, 0.123E~2) = 1.000254631 atan2 (0.123E1, 0.11754944E~37) = 1.570796371 pow (0.123E1, 0.11754944E~37) = 1 atan2 (0.123E1, 0.5877472E~38) = 1.570796371 pow (0.123E1, 0.5877472E~38) = 1 atan2 (0.123E1, 0.1E~44) = 1.570796371 pow (0.123E1, 0.1E~44) = 1 atan2 (0.123E1, 0.0) = 1.570796371 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.34028235E39) = 3.141592741 pow (0.123E1, ~0.34028235E39) = 0 atan2 (0.123E1, ~0.17014117E39) = 3.141592741 pow (0.123E1, ~0.17014117E39) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592575 pow (0.123E1, ~0.123E4) = 0 atan2 (0.123E1, ~0.123E2) = 3.041924 pow (0.123E1, ~0.123E2) = 0.07837310433 atan2 (0.123E1, ~0.31415927E1) = 2.768416882 pow (0.123E1, ~0.31415927E1) = 0.5218608975 atan2 (0.123E1, ~0.27182817E1) = 2.716668606 pow (0.123E1, ~0.27182817E1) = 0.5696558356 atan2 (0.123E1, ~0.123E1) = 2.356194496 pow (0.123E1, ~0.123E1) = 0.7752052546 atan2 (0.123E1, ~0.123) = 1.670464993 pow (0.123E1, ~0.123) = 0.9748587012 atan2 (0.123E1, ~0.123E~2) = 1.571796298 pow (0.123E1, ~0.123E~2) = 0.9997454286 atan2 (0.123E1, ~0.11754944E~37) = 1.570796251 pow (0.123E1, ~0.11754944E~37) = 1 atan2 (0.123E1, ~0.5877472E~38) = 1.570796251 pow (0.123E1, ~0.5877472E~38) = 1 atan2 (0.123E1, ~0.1E~44) = 1.570796251 pow (0.123E1, ~0.1E~44) = 1 atan2 (0.123E1, ~0.0) = 1.570796371 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592741 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.34028235E39) = 3.614649389E~40 pow (0.123, 0.34028235E39) = 0 atan2 (0.123, 0.17014117E39) = 7.229284764E~40 pow (0.123, 0.17014117E39) = 0 atan2 (0.123, 0.123E4) = 1.000000047E~4 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666363 pow (0.123, 0.123E2) = 6.394886357E~12 atan2 (0.123, 0.31415927E1) = 0.0391321294 pow (0.123, 0.31415927E1) = 0.001383096678 atan2 (0.123, 0.27182817E1) = 0.04521832988 pow (0.123, 0.27182817E1) = 0.00335819344 atan2 (0.123, 0.123E1) = 0.09966865182 pow (0.123, 0.123E1) = 0.07595970482 atan2 (0.123, 0.123) = 0.7853981853 pow (0.123, 0.123) = 0.7727843523 atan2 (0.123, 0.123E~2) = 1.560796618 pow (0.123, 0.123E~2) = 0.9974257946 atan2 (0.123, 0.11754944E~37) = 1.570796371 pow (0.123, 0.11754944E~37) = 1 atan2 (0.123, 0.5877472E~38) = 1.570796371 pow (0.123, 0.5877472E~38) = 1 atan2 (0.123, 0.1E~44) = 1.570796371 pow (0.123, 0.1E~44) = 1 atan2 (0.123, 0.0) = 1.570796371 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.34028235E39) = 3.141592741 pow (0.123, ~0.34028235E39) = inf atan2 (0.123, ~0.17014117E39) = 3.141592741 pow (0.123, ~0.17014117E39) = inf atan2 (0.123, ~0.123E4) = 3.141492605 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592989 pow (0.123, ~0.123E2) = 156374941700 atan2 (0.123, ~0.31415927E1) = 3.102460623 pow (0.123, ~0.31415927E1) = 723.0152588 atan2 (0.123, ~0.27182817E1) = 3.096374273 pow (0.123, ~0.27182817E1) = 297.7791443 atan2 (0.123, ~0.123E1) = 3.041924 pow (0.123, ~0.123E1) = 13.16487408 atan2 (0.123, ~0.123) = 2.356194496 pow (0.123, ~0.123) = 1.294022083 atan2 (0.123, ~0.123E~2) = 1.580796003 pow (0.123, ~0.123E~2) = 1.002580881 atan2 (0.123, ~0.11754944E~37) = 1.570796251 pow (0.123, ~0.11754944E~37) = 1 atan2 (0.123, ~0.5877472E~38) = 1.570796251 pow (0.123, ~0.5877472E~38) = 1 atan2 (0.123, ~0.1E~44) = 1.570796251 pow (0.123, ~0.1E~44) = 1 atan2 (0.123, ~0.0) = 1.570796371 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592741 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.34028235E39) = 3.613948739E~42 pow (0.123E~2, 0.34028235E39) = 0 atan2 (0.123E~2, 0.17014117E39) = 7.229298777E~42 pow (0.123E~2, 0.17014117E39) = 0 atan2 (0.123E~2, 0.123E4) = 9.999999975E~7 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 1.000000047E~4 pow (0.123E~2, 0.123E2) = 1.606321748E~36 atan2 (0.123E~2, 0.31415927E1) = 3.915211419E~4 pow (0.123E~2, 0.31415927E1) = 7.205548935E~10 atan2 (0.123E~2, 0.27182817E1) = 4.524917167E~4 pow (0.123E~2, 0.27182817E1) = 1.228972657E~8 atan2 (0.123E~2, 0.123E1) = 9.999996983E~4 pow (0.123E~2, 0.123E1) = 2.633802651E~4 atan2 (0.123E~2, 0.123) = 0.009999666363 pow (0.123E~2, 0.123) = 0.4385896027 atan2 (0.123E~2, 0.123E~2) = 0.7853981853 pow (0.123E~2, 0.123E~2) = 0.9917919636 atan2 (0.123E~2, 0.11754944E~37) = 1.570796371 pow (0.123E~2, 0.11754944E~37) = 1 atan2 (0.123E~2, 0.5877472E~38) = 1.570796371 pow (0.123E~2, 0.5877472E~38) = 1 atan2 (0.123E~2, 0.1E~44) = 1.570796371 pow (0.123E~2, 0.1E~44) = 1 atan2 (0.123E~2, 0.0) = 1.570796371 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.34028235E39) = 3.141592741 pow (0.123E~2, ~0.34028235E39) = inf atan2 (0.123E~2, ~0.17014117E39) = 3.141592741 pow (0.123E~2, ~0.17014117E39) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591549 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492605 pow (0.123E~2, ~0.123E2) = 6.225402783E35 atan2 (0.123E~2, ~0.31415927E1) = 3.141201019 pow (0.123E~2, ~0.31415927E1) = 1387819264 atan2 (0.123E~2, ~0.27182817E1) = 3.141140223 pow (0.123E~2, ~0.27182817E1) = 81368776 atan2 (0.123E~2, ~0.123E1) = 3.140592575 pow (0.123E~2, ~0.123E1) = 3796.791504 atan2 (0.123E~2, ~0.123) = 3.131592989 pow (0.123E~2, ~0.123) = 2.280035973 atan2 (0.123E~2, ~0.123E~2) = 2.356194496 pow (0.123E~2, ~0.123E~2) = 1.008275986 atan2 (0.123E~2, ~0.11754944E~37) = 1.570796251 pow (0.123E~2, ~0.11754944E~37) = 1 atan2 (0.123E~2, ~0.5877472E~38) = 1.570796251 pow (0.123E~2, ~0.5877472E~38) = 1 atan2 (0.123E~2, ~0.1E~44) = 1.570796251 pow (0.123E~2, ~0.1E~44) = 1 atan2 (0.123E~2, ~0.0) = 1.570796371 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592741 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.11754944E~37, 0.34028235E39) = 0 pow (0.11754944E~37, 0.34028235E39) = 0 atan2 (0.11754944E~37, 0.17014117E39) = 0 pow (0.11754944E~37, 0.17014117E39) = 0 atan2 (0.11754944E~37, 0.123E4) = 9.556855527E~42 pow (0.11754944E~37, 0.123E4) = 0 atan2 (0.11754944E~37, 0.123E2) = 9.55686954E~40 pow (0.11754944E~37, 0.123E2) = 0 atan2 (0.11754944E~37, 0.31415927E1) = 3.74171493E~39 pow (0.11754944E~37, 0.31415927E1) = 0 atan2 (0.11754944E~37, 0.27182817E1) = 4.324402857E~39 pow (0.11754944E~37, 0.27182817E1) = 0 atan2 (0.11754944E~37, 0.123E1) = 9.556863934E~39 pow (0.11754944E~37, 0.123E1) = 0 atan2 (0.11754944E~37, 0.123) = 9.556864495E~38 pow (0.11754944E~37, 0.123) = 2.160911572E~5 atan2 (0.11754944E~37, 0.123E~2) = 9.556864495E~36 pow (0.11754944E~37, 0.123E~2) = 0.8981448412 atan2 (0.11754944E~37, 0.11754944E~37) = 0.7853981853 pow (0.11754944E~37, 0.11754944E~37) = 1 atan2 (0.11754944E~37, 0.5877472E~38) = 1.107148767 pow (0.11754944E~37, 0.5877472E~38) = 1 atan2 (0.11754944E~37, 0.1E~44) = 1.570796251 pow (0.11754944E~37, 0.1E~44) = 1 atan2 (0.11754944E~37, 0.0) = 1.570796371 pow (0.11754944E~37, 0.0) = 1 atan2 (0.11754944E~37, ~0.34028235E39) = 3.141592741 pow (0.11754944E~37, ~0.34028235E39) = inf atan2 (0.11754944E~37, ~0.17014117E39) = 3.141592741 pow (0.11754944E~37, ~0.17014117E39) = inf atan2 (0.11754944E~37, ~0.123E4) = 3.141592741 pow (0.11754944E~37, ~0.123E4) = inf atan2 (0.11754944E~37, ~0.123E2) = 3.141592741 pow (0.11754944E~37, ~0.123E2) = inf atan2 (0.11754944E~37, ~0.31415927E1) = 3.141592741 pow (0.11754944E~37, ~0.31415927E1) = inf atan2 (0.11754944E~37, ~0.27182817E1) = 3.141592741 pow (0.11754944E~37, ~0.27182817E1) = inf atan2 (0.11754944E~37, ~0.123E1) = 3.141592741 pow (0.11754944E~37, ~0.123E1) = inf atan2 (0.11754944E~37, ~0.123) = 3.141592741 pow (0.11754944E~37, ~0.123) = 46276.76562 atan2 (0.11754944E~37, ~0.123E~2) = 3.141592741 pow (0.11754944E~37, ~0.123E~2) = 1.113406181 atan2 (0.11754944E~37, ~0.11754944E~37) = 2.356194496 pow (0.11754944E~37, ~0.11754944E~37) = 1 atan2 (0.11754944E~37, ~0.5877472E~38) = 2.034443855 pow (0.11754944E~37, ~0.5877472E~38) = 1 atan2 (0.11754944E~37, ~0.1E~44) = 1.570796371 pow (0.11754944E~37, ~0.1E~44) = 1 atan2 (0.11754944E~37, ~0.0) = 1.570796371 pow (0.11754944E~37, ~0.0) = 1 atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.11754944E~37, ~inf) = 3.141592741 pow (0.11754944E~37, ~inf) = inf atan2 (0.11754944E~37, nan) = nan pow (0.11754944E~37, nan) = nan atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.5877472E~38, 0.34028235E39) = 0 pow (0.5877472E~38, 0.34028235E39) = 0 atan2 (0.5877472E~38, 0.17014117E39) = 0 pow (0.5877472E~38, 0.17014117E39) = 0 atan2 (0.5877472E~38, 0.123E4) = 4.778427763E~42 pow (0.5877472E~38, 0.123E4) = 0 atan2 (0.5877472E~38, 0.123E2) = 4.778427763E~40 pow (0.5877472E~38, 0.123E2) = 0 atan2 (0.5877472E~38, 0.31415927E1) = 1.870856764E~39 pow (0.5877472E~38, 0.31415927E1) = 0 atan2 (0.5877472E~38, 0.27182817E1) = 2.162200728E~39 pow (0.5877472E~38, 0.27182817E1) = 0 atan2 (0.5877472E~38, 0.123E1) = 4.778431967E~39 pow (0.5877472E~38, 0.123E1) = 0 atan2 (0.5877472E~38, 0.123) = 4.778432248E~38 pow (0.5877472E~38, 0.123) = 1.984313531E~5 atan2 (0.5877472E~38, 0.123E~2) = 4.778432248E~36 pow (0.5877472E~38, 0.123E~2) = 0.8973793983 atan2 (0.5877472E~38, 0.11754944E~37) = 0.463647604 pow (0.5877472E~38, 0.11754944E~37) = 1 atan2 (0.5877472E~38, 0.5877472E~38) = 0.7853981853 pow (0.5877472E~38, 0.5877472E~38) = 1 atan2 (0.5877472E~38, 0.1E~44) = 1.570796132 pow (0.5877472E~38, 0.1E~44) = 1 atan2 (0.5877472E~38, 0.0) = 1.570796371 pow (0.5877472E~38, 0.0) = 1 atan2 (0.5877472E~38, ~0.34028235E39) = 3.141592741 pow (0.5877472E~38, ~0.34028235E39) = inf atan2 (0.5877472E~38, ~0.17014117E39) = 3.141592741 pow (0.5877472E~38, ~0.17014117E39) = inf atan2 (0.5877472E~38, ~0.123E4) = 3.141592741 pow (0.5877472E~38, ~0.123E4) = inf atan2 (0.5877472E~38, ~0.123E2) = 3.141592741 pow (0.5877472E~38, ~0.123E2) = inf atan2 (0.5877472E~38, ~0.31415927E1) = 3.141592741 pow (0.5877472E~38, ~0.31415927E1) = inf atan2 (0.5877472E~38, ~0.27182817E1) = 3.141592741 pow (0.5877472E~38, ~0.27182817E1) = inf atan2 (0.5877472E~38, ~0.123E1) = 3.141592741 pow (0.5877472E~38, ~0.123E1) = inf atan2 (0.5877472E~38, ~0.123) = 3.141592741 pow (0.5877472E~38, ~0.123) = 50395.26172 atan2 (0.5877472E~38, ~0.123E~2) = 3.141592741 pow (0.5877472E~38, ~0.123E~2) = 1.114355803 atan2 (0.5877472E~38, ~0.11754944E~37) = 2.677945137 pow (0.5877472E~38, ~0.11754944E~37) = 1 atan2 (0.5877472E~38, ~0.5877472E~38) = 2.356194496 pow (0.5877472E~38, ~0.5877472E~38) = 1 atan2 (0.5877472E~38, ~0.1E~44) = 1.57079649 pow (0.5877472E~38, ~0.1E~44) = 1 atan2 (0.5877472E~38, ~0.0) = 1.570796371 pow (0.5877472E~38, ~0.0) = 1 atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.5877472E~38, ~inf) = 3.141592741 pow (0.5877472E~38, ~inf) = inf atan2 (0.5877472E~38, nan) = nan pow (0.5877472E~38, nan) = nan atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.1E~44, 0.34028235E39) = 0 pow (0.1E~44, 0.34028235E39) = 0 atan2 (0.1E~44, 0.17014117E39) = 0 pow (0.1E~44, 0.17014117E39) = 0 atan2 (0.1E~44, 0.123E4) = 0 pow (0.1E~44, 0.123E4) = 0 atan2 (0.1E~44, 0.123E2) = 0 pow (0.1E~44, 0.123E2) = 0 atan2 (0.1E~44, 0.31415927E1) = 0 pow (0.1E~44, 0.31415927E1) = 0 atan2 (0.1E~44, 0.27182817E1) = 0 pow (0.1E~44, 0.27182817E1) = 0 atan2 (0.1E~44, 0.123E1) = 1.401298464E~45 pow (0.1E~44, 0.123E1) = 0 atan2 (0.1E~44, 0.123) = 1.121038771E~44 pow (0.1E~44, 0.123) = 3.041046966E~6 atan2 (0.1E~44, 0.123E~2) = 1.139255651E~42 pow (0.1E~44, 0.123E~2) = 0.8807045221 atan2 (0.1E~44, 0.11754944E~37) = 1.192092896E~7 pow (0.1E~44, 0.11754944E~37) = 1 atan2 (0.1E~44, 0.5877472E~38) = 2.384185791E~7 pow (0.1E~44, 0.5877472E~38) = 1 atan2 (0.1E~44, 0.1E~44) = 0.7853981853 pow (0.1E~44, 0.1E~44) = 1 atan2 (0.1E~44, 0.0) = 1.570796371 pow (0.1E~44, 0.0) = 1 atan2 (0.1E~44, ~0.34028235E39) = 3.141592741 pow (0.1E~44, ~0.34028235E39) = inf atan2 (0.1E~44, ~0.17014117E39) = 3.141592741 pow (0.1E~44, ~0.17014117E39) = inf atan2 (0.1E~44, ~0.123E4) = 3.141592741 pow (0.1E~44, ~0.123E4) = inf atan2 (0.1E~44, ~0.123E2) = 3.141592741 pow (0.1E~44, ~0.123E2) = inf atan2 (0.1E~44, ~0.31415927E1) = 3.141592741 pow (0.1E~44, ~0.31415927E1) = inf atan2 (0.1E~44, ~0.27182817E1) = 3.141592741 pow (0.1E~44, ~0.27182817E1) = inf atan2 (0.1E~44, ~0.123E1) = 3.141592741 pow (0.1E~44, ~0.123E1) = inf atan2 (0.1E~44, ~0.123) = 3.141592741 pow (0.1E~44, ~0.123) = 328834.125 atan2 (0.1E~44, ~0.123E~2) = 3.141592741 pow (0.1E~44, ~0.123E~2) = 1.135454535 atan2 (0.1E~44, ~0.11754944E~37) = 3.141592503 pow (0.1E~44, ~0.11754944E~37) = 1 atan2 (0.1E~44, ~0.5877472E~38) = 3.141592503 pow (0.1E~44, ~0.5877472E~38) = 1 atan2 (0.1E~44, ~0.1E~44) = 2.356194496 pow (0.1E~44, ~0.1E~44) = 1 atan2 (0.1E~44, ~0.0) = 1.570796371 pow (0.1E~44, ~0.0) = 1 atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.1E~44, ~inf) = 3.141592741 pow (0.1E~44, ~inf) = inf atan2 (0.1E~44, nan) = nan pow (0.1E~44, nan) = nan atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.0, 0.34028235E39) = 0 pow (0.0, 0.34028235E39) = 0 atan2 (0.0, 0.17014117E39) = 0 pow (0.0, 0.17014117E39) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.31415927E1) = 0 pow (0.0, 0.31415927E1) = 0 atan2 (0.0, 0.27182817E1) = 0 pow (0.0, 0.27182817E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.11754944E~37) = 0 pow (0.0, 0.11754944E~37) = 0 atan2 (0.0, 0.5877472E~38) = 0 pow (0.0, 0.5877472E~38) = 0 atan2 (0.0, 0.1E~44) = 0 pow (0.0, 0.1E~44) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.34028235E39) = 3.141592741 pow (0.0, ~0.34028235E39) = inf atan2 (0.0, ~0.17014117E39) = 3.141592741 pow (0.0, ~0.17014117E39) = inf atan2 (0.0, ~0.123E4) = 3.141592741 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592741 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.31415927E1) = 3.141592741 pow (0.0, ~0.31415927E1) = inf atan2 (0.0, ~0.27182817E1) = 3.141592741 pow (0.0, ~0.27182817E1) = inf atan2 (0.0, ~0.123E1) = 3.141592741 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592741 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592741 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.11754944E~37) = 3.141592741 pow (0.0, ~0.11754944E~37) = inf atan2 (0.0, ~0.5877472E~38) = 3.141592741 pow (0.0, ~0.5877472E~38) = inf atan2 (0.0, ~0.1E~44) = 3.141592741 pow (0.0, ~0.1E~44) = inf atan2 (0.0, ~0.0) = 3.141592741 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592741 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.34028235E39, 0.34028235E39) = ~0.7853981853 pow (~0.34028235E39, 0.34028235E39) = inf atan2 (~0.34028235E39, 0.17014117E39) = ~1.107148767 pow (~0.34028235E39, 0.17014117E39) = inf atan2 (~0.34028235E39, 0.123E4) = ~1.570796371 pow (~0.34028235E39, 0.123E4) = inf atan2 (~0.34028235E39, 0.123E2) = ~1.570796371 pow (~0.34028235E39, 0.123E2) = nan atan2 (~0.34028235E39, 0.31415927E1) = ~1.570796371 pow (~0.34028235E39, 0.31415927E1) = nan atan2 (~0.34028235E39, 0.27182817E1) = ~1.570796371 pow (~0.34028235E39, 0.27182817E1) = nan atan2 (~0.34028235E39, 0.123E1) = ~1.570796371 pow (~0.34028235E39, 0.123E1) = nan atan2 (~0.34028235E39, 0.123) = ~1.570796371 pow (~0.34028235E39, 0.123) = nan atan2 (~0.34028235E39, 0.123E~2) = ~1.570796371 pow (~0.34028235E39, 0.123E~2) = nan atan2 (~0.34028235E39, 0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, 0.11754944E~37) = nan atan2 (~0.34028235E39, 0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, 0.5877472E~38) = nan atan2 (~0.34028235E39, 0.1E~44) = ~1.570796371 pow (~0.34028235E39, 0.1E~44) = nan atan2 (~0.34028235E39, 0.0) = ~1.570796371 pow (~0.34028235E39, 0.0) = 1 atan2 (~0.34028235E39, ~0.34028235E39) = ~2.356194496 pow (~0.34028235E39, ~0.34028235E39) = 0 atan2 (~0.34028235E39, ~0.17014117E39) = ~2.034443855 pow (~0.34028235E39, ~0.17014117E39) = 0 atan2 (~0.34028235E39, ~0.123E4) = ~1.570796251 pow (~0.34028235E39, ~0.123E4) = 0 atan2 (~0.34028235E39, ~0.123E2) = ~1.570796251 pow (~0.34028235E39, ~0.123E2) = nan atan2 (~0.34028235E39, ~0.31415927E1) = ~1.570796251 pow (~0.34028235E39, ~0.31415927E1) = nan atan2 (~0.34028235E39, ~0.27182817E1) = ~1.570796251 pow (~0.34028235E39, ~0.27182817E1) = nan atan2 (~0.34028235E39, ~0.123E1) = ~1.570796251 pow (~0.34028235E39, ~0.123E1) = nan atan2 (~0.34028235E39, ~0.123) = ~1.570796251 pow (~0.34028235E39, ~0.123) = nan atan2 (~0.34028235E39, ~0.123E~2) = ~1.570796251 pow (~0.34028235E39, ~0.123E~2) = nan atan2 (~0.34028235E39, ~0.11754944E~37) = ~1.570796251 pow (~0.34028235E39, ~0.11754944E~37) = nan atan2 (~0.34028235E39, ~0.5877472E~38) = ~1.570796251 pow (~0.34028235E39, ~0.5877472E~38) = nan atan2 (~0.34028235E39, ~0.1E~44) = ~1.570796251 pow (~0.34028235E39, ~0.1E~44) = nan atan2 (~0.34028235E39, ~0.0) = ~1.570796371 pow (~0.34028235E39, ~0.0) = 1 atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.34028235E39, ~inf) = ~3.141592741 pow (~0.34028235E39, ~inf) = 0 atan2 (~0.34028235E39, nan) = nan pow (~0.34028235E39, nan) = nan atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.17014117E39, 0.34028235E39) = ~0.463647604 pow (~0.17014117E39, 0.34028235E39) = inf atan2 (~0.17014117E39, 0.17014117E39) = ~0.7853981853 pow (~0.17014117E39, 0.17014117E39) = inf atan2 (~0.17014117E39, 0.123E4) = ~1.570796371 pow (~0.17014117E39, 0.123E4) = inf atan2 (~0.17014117E39, 0.123E2) = ~1.570796371 pow (~0.17014117E39, 0.123E2) = nan atan2 (~0.17014117E39, 0.31415927E1) = ~1.570796371 pow (~0.17014117E39, 0.31415927E1) = nan atan2 (~0.17014117E39, 0.27182817E1) = ~1.570796371 pow (~0.17014117E39, 0.27182817E1) = nan atan2 (~0.17014117E39, 0.123E1) = ~1.570796371 pow (~0.17014117E39, 0.123E1) = nan atan2 (~0.17014117E39, 0.123) = ~1.570796371 pow (~0.17014117E39, 0.123) = nan atan2 (~0.17014117E39, 0.123E~2) = ~1.570796371 pow (~0.17014117E39, 0.123E~2) = nan atan2 (~0.17014117E39, 0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, 0.11754944E~37) = nan atan2 (~0.17014117E39, 0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, 0.5877472E~38) = nan atan2 (~0.17014117E39, 0.1E~44) = ~1.570796371 pow (~0.17014117E39, 0.1E~44) = nan atan2 (~0.17014117E39, 0.0) = ~1.570796371 pow (~0.17014117E39, 0.0) = 1 atan2 (~0.17014117E39, ~0.34028235E39) = ~2.677945137 pow (~0.17014117E39, ~0.34028235E39) = 0 atan2 (~0.17014117E39, ~0.17014117E39) = ~2.356194496 pow (~0.17014117E39, ~0.17014117E39) = 0 atan2 (~0.17014117E39, ~0.123E4) = ~1.570796251 pow (~0.17014117E39, ~0.123E4) = 0 atan2 (~0.17014117E39, ~0.123E2) = ~1.570796251 pow (~0.17014117E39, ~0.123E2) = nan atan2 (~0.17014117E39, ~0.31415927E1) = ~1.570796251 pow (~0.17014117E39, ~0.31415927E1) = nan atan2 (~0.17014117E39, ~0.27182817E1) = ~1.570796251 pow (~0.17014117E39, ~0.27182817E1) = nan atan2 (~0.17014117E39, ~0.123E1) = ~1.570796251 pow (~0.17014117E39, ~0.123E1) = nan atan2 (~0.17014117E39, ~0.123) = ~1.570796251 pow (~0.17014117E39, ~0.123) = nan atan2 (~0.17014117E39, ~0.123E~2) = ~1.570796251 pow (~0.17014117E39, ~0.123E~2) = nan atan2 (~0.17014117E39, ~0.11754944E~37) = ~1.570796251 pow (~0.17014117E39, ~0.11754944E~37) = nan atan2 (~0.17014117E39, ~0.5877472E~38) = ~1.570796251 pow (~0.17014117E39, ~0.5877472E~38) = nan atan2 (~0.17014117E39, ~0.1E~44) = ~1.570796251 pow (~0.17014117E39, ~0.1E~44) = nan atan2 (~0.17014117E39, ~0.0) = ~1.570796371 pow (~0.17014117E39, ~0.0) = 1 atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.17014117E39, ~inf) = ~3.141592741 pow (~0.17014117E39, ~inf) = 0 atan2 (~0.17014117E39, nan) = nan pow (~0.17014117E39, nan) = nan atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.123E4, 0.34028235E39) = ~3.614645488E~36 pow (~0.123E4, 0.34028235E39) = inf atan2 (~0.123E4, 0.17014117E39) = ~7.229290975E~36 pow (~0.123E4, 0.17014117E39) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981853 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.560796618 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.31415927E1) = ~1.568242192 pow (~0.123E4, 0.31415927E1) = nan atan2 (~0.123E4, 0.27182817E1) = ~1.568586349 pow (~0.123E4, 0.27182817E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796324 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696354 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795298 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.11754944E~37) = ~1.570796371 pow (~0.123E4, 0.11754944E~37) = nan atan2 (~0.123E4, 0.5877472E~38) = ~1.570796371 pow (~0.123E4, 0.5877472E~38) = nan atan2 (~0.123E4, 0.1E~44) = ~1.570796371 pow (~0.123E4, 0.1E~44) = nan atan2 (~0.123E4, 0.0) = ~1.570796371 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.34028235E39) = ~3.141592741 pow (~0.123E4, ~0.34028235E39) = 0 atan2 (~0.123E4, ~0.17014117E39) = ~3.141592741 pow (~0.123E4, ~0.17014117E39) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.356194496 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580796003 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.31415927E1) = ~1.57335043 pow (~0.123E4, ~0.31415927E1) = nan atan2 (~0.123E4, ~0.27182817E1) = ~1.573006272 pow (~0.123E4, ~0.27182817E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796298 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896268 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797324 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.11754944E~37) = ~1.570796251 pow (~0.123E4, ~0.11754944E~37) = nan atan2 (~0.123E4, ~0.5877472E~38) = ~1.570796251 pow (~0.123E4, ~0.5877472E~38) = nan atan2 (~0.123E4, ~0.1E~44) = ~1.570796251 pow (~0.123E4, ~0.1E~44) = nan atan2 (~0.123E4, ~0.0) = ~1.570796371 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592741 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.34028235E39) = ~3.614645465E~38 pow (~0.123E2, 0.34028235E39) = inf atan2 (~0.123E2, 0.17014117E39) = ~7.22929093E~38 pow (~0.123E2, 0.17014117E39) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666363 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981853 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.31415927E1) = ~1.32072866 pow (~0.123E2, 0.31415927E1) = nan atan2 (~0.123E2, 0.27182817E1) = ~1.353293777 pow (~0.123E2, 0.27182817E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127629 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.560796618 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696354 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.11754944E~37) = ~1.570796371 pow (~0.123E2, 0.11754944E~37) = nan atan2 (~0.123E2, 0.5877472E~38) = ~1.570796371 pow (~0.123E2, 0.5877472E~38) = nan atan2 (~0.123E2, 0.1E~44) = ~1.570796371 pow (~0.123E2, 0.1E~44) = nan atan2 (~0.123E2, 0.0) = ~1.570796371 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.34028235E39) = ~3.141592741 pow (~0.123E2, ~0.34028235E39) = 0 atan2 (~0.123E2, ~0.17014117E39) = ~3.141592741 pow (~0.123E2, ~0.17014117E39) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592989 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.356194496 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.31415927E1) = ~1.820863962 pow (~0.123E2, ~0.31415927E1) = nan atan2 (~0.123E2, ~0.27182817E1) = ~1.788298845 pow (~0.123E2, ~0.27182817E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464993 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580796003 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896268 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.11754944E~37) = ~1.570796251 pow (~0.123E2, ~0.11754944E~37) = nan atan2 (~0.123E2, ~0.5877472E~38) = ~1.570796251 pow (~0.123E2, ~0.5877472E~38) = nan atan2 (~0.123E2, ~0.1E~44) = ~1.570796251 pow (~0.123E2, ~0.1E~44) = nan atan2 (~0.123E2, ~0.0) = ~1.570796371 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592741 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.31415927E1, 0.34028235E39) = ~9.232312E~39 pow (~0.31415927E1, 0.34028235E39) = inf atan2 (~0.31415927E1, 0.17014117E39) = ~1.8464624E~38 pow (~0.31415927E1, 0.17014117E39) = inf atan2 (~0.31415927E1, 0.123E4) = ~0.002554134931 pow (~0.31415927E1, 0.123E4) = inf atan2 (~0.31415927E1, 0.123E2) = ~0.2500677109 pow (~0.31415927E1, 0.123E2) = nan atan2 (~0.31415927E1, 0.31415927E1) = ~0.7853981853 pow (~0.31415927E1, 0.31415927E1) = nan atan2 (~0.31415927E1, 0.27182817E1) = ~0.8575118184 pow (~0.31415927E1, 0.27182817E1) = nan atan2 (~0.31415927E1, 0.123E1) = ~1.19762063 pow (~0.31415927E1, 0.123E1) = nan atan2 (~0.31415927E1, 0.123) = ~1.531664252 pow (~0.31415927E1, 0.123) = nan atan2 (~0.31415927E1, 0.123E~2) = ~1.570404768 pow (~0.31415927E1, 0.123E~2) = nan atan2 (~0.31415927E1, 0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, 0.11754944E~37) = nan atan2 (~0.31415927E1, 0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, 0.5877472E~38) = nan atan2 (~0.31415927E1, 0.1E~44) = ~1.570796371 pow (~0.31415927E1, 0.1E~44) = nan atan2 (~0.31415927E1, 0.0) = ~1.570796371 pow (~0.31415927E1, 0.0) = 1 atan2 (~0.31415927E1, ~0.34028235E39) = ~3.141592741 pow (~0.31415927E1, ~0.34028235E39) = 0 atan2 (~0.31415927E1, ~0.17014117E39) = ~3.141592741 pow (~0.31415927E1, ~0.17014117E39) = 0 atan2 (~0.31415927E1, ~0.123E4) = ~3.139038563 pow (~0.31415927E1, ~0.123E4) = 0 atan2 (~0.31415927E1, ~0.123E2) = ~2.89152503 pow (~0.31415927E1, ~0.123E2) = nan atan2 (~0.31415927E1, ~0.31415927E1) = ~2.356194496 pow (~0.31415927E1, ~0.31415927E1) = nan atan2 (~0.31415927E1, ~0.27182817E1) = ~2.284080982 pow (~0.31415927E1, ~0.27182817E1) = nan atan2 (~0.31415927E1, ~0.123E1) = ~1.943971992 pow (~0.31415927E1, ~0.123E1) = nan atan2 (~0.31415927E1, ~0.123) = ~1.60992837 pow (~0.31415927E1, ~0.123) = nan atan2 (~0.31415927E1, ~0.123E~2) = ~1.571187854 pow (~0.31415927E1, ~0.123E~2) = nan atan2 (~0.31415927E1, ~0.11754944E~37) = ~1.570796251 pow (~0.31415927E1, ~0.11754944E~37) = nan atan2 (~0.31415927E1, ~0.5877472E~38) = ~1.570796251 pow (~0.31415927E1, ~0.5877472E~38) = nan atan2 (~0.31415927E1, ~0.1E~44) = ~1.570796251 pow (~0.31415927E1, ~0.1E~44) = nan atan2 (~0.31415927E1, ~0.0) = ~1.570796371 pow (~0.31415927E1, ~0.0) = 1 atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.31415927E1, ~inf) = ~3.141592741 pow (~0.31415927E1, ~inf) = 0 atan2 (~0.31415927E1, nan) = nan pow (~0.31415927E1, nan) = nan atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.27182817E1, 0.34028235E39) = ~7.988312091E~39 pow (~0.27182817E1, 0.34028235E39) = inf atan2 (~0.27182817E1, 0.17014117E39) = ~1.597662558E~38 pow (~0.27182817E1, 0.17014117E39) = inf atan2 (~0.27182817E1, 0.123E4) = ~0.002209981671 pow (~0.27182817E1, 0.123E4) = inf atan2 (~0.27182817E1, 0.123E2) = ~0.2175025195 pow (~0.27182817E1, 0.123E2) = nan atan2 (~0.27182817E1, 0.31415927E1) = ~0.7132844925 pow (~0.27182817E1, 0.31415927E1) = nan atan2 (~0.27182817E1, 0.27182817E1) = ~0.7853981853 pow (~0.27182817E1, 0.27182817E1) = nan atan2 (~0.27182817E1, 0.123E1) = ~1.145872235 pow (~0.27182817E1, 0.123E1) = nan atan2 (~0.27182817E1, 0.123) = ~1.525578022 pow (~0.27182817E1, 0.123) = nan atan2 (~0.27182817E1, 0.123E~2) = ~1.570343852 pow (~0.27182817E1, 0.123E~2) = nan atan2 (~0.27182817E1, 0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, 0.11754944E~37) = nan atan2 (~0.27182817E1, 0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, 0.5877472E~38) = nan atan2 (~0.27182817E1, 0.1E~44) = ~1.570796371 pow (~0.27182817E1, 0.1E~44) = nan atan2 (~0.27182817E1, 0.0) = ~1.570796371 pow (~0.27182817E1, 0.0) = 1 atan2 (~0.27182817E1, ~0.34028235E39) = ~3.141592741 pow (~0.27182817E1, ~0.34028235E39) = 0 atan2 (~0.27182817E1, ~0.17014117E39) = ~3.141592741 pow (~0.27182817E1, ~0.17014117E39) = 0 atan2 (~0.27182817E1, ~0.123E4) = ~3.139382601 pow (~0.27182817E1, ~0.123E4) = 0 atan2 (~0.27182817E1, ~0.123E2) = ~2.924090147 pow (~0.27182817E1, ~0.123E2) = nan atan2 (~0.27182817E1, ~0.31415927E1) = ~2.428308249 pow (~0.27182817E1, ~0.31415927E1) = nan atan2 (~0.27182817E1, ~0.27182817E1) = ~2.356194496 pow (~0.27182817E1, ~0.27182817E1) = nan atan2 (~0.27182817E1, ~0.123E1) = ~1.995720387 pow (~0.27182817E1, ~0.123E1) = nan atan2 (~0.27182817E1, ~0.123) = ~1.6160146 pow (~0.27182817E1, ~0.123) = nan atan2 (~0.27182817E1, ~0.123E~2) = ~1.57124877 pow (~0.27182817E1, ~0.123E~2) = nan atan2 (~0.27182817E1, ~0.11754944E~37) = ~1.570796251 pow (~0.27182817E1, ~0.11754944E~37) = nan atan2 (~0.27182817E1, ~0.5877472E~38) = ~1.570796251 pow (~0.27182817E1, ~0.5877472E~38) = nan atan2 (~0.27182817E1, ~0.1E~44) = ~1.570796251 pow (~0.27182817E1, ~0.1E~44) = nan atan2 (~0.27182817E1, ~0.0) = ~1.570796371 pow (~0.27182817E1, ~0.0) = 1 atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.27182817E1, ~inf) = ~3.141592741 pow (~0.27182817E1, ~inf) = 0 atan2 (~0.27182817E1, nan) = nan pow (~0.27182817E1, nan) = nan atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.123E1, 0.34028235E39) = ~3.614645185E~39 pow (~0.123E1, 0.34028235E39) = inf atan2 (~0.123E1, 0.17014117E39) = ~7.22929037E~39 pow (~0.123E1, 0.17014117E39) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996983E~4 pow (~0.123E1, 0.123E4) = inf atan2 (~0.123E1, 0.123E2) = ~0.09966865182 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.31415927E1) = ~0.3731757402 pow (~0.123E1, 0.31415927E1) = nan atan2 (~0.123E1, 0.27182817E1) = ~0.4249241054 pow (~0.123E1, 0.27182817E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981853 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127629 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796324 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.11754944E~37) = ~1.570796371 pow (~0.123E1, 0.11754944E~37) = nan atan2 (~0.123E1, 0.5877472E~38) = ~1.570796371 pow (~0.123E1, 0.5877472E~38) = nan atan2 (~0.123E1, 0.1E~44) = ~1.570796371 pow (~0.123E1, 0.1E~44) = nan atan2 (~0.123E1, 0.0) = ~1.570796371 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.34028235E39) = ~3.141592741 pow (~0.123E1, ~0.34028235E39) = 0 atan2 (~0.123E1, ~0.17014117E39) = ~3.141592741 pow (~0.123E1, ~0.17014117E39) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592575 pow (~0.123E1, ~0.123E4) = 0 atan2 (~0.123E1, ~0.123E2) = ~3.041924 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.31415927E1) = ~2.768416882 pow (~0.123E1, ~0.31415927E1) = nan atan2 (~0.123E1, ~0.27182817E1) = ~2.716668606 pow (~0.123E1, ~0.27182817E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.356194496 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464993 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796298 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.11754944E~37) = ~1.570796251 pow (~0.123E1, ~0.11754944E~37) = nan atan2 (~0.123E1, ~0.5877472E~38) = ~1.570796251 pow (~0.123E1, ~0.5877472E~38) = nan atan2 (~0.123E1, ~0.1E~44) = ~1.570796251 pow (~0.123E1, ~0.1E~44) = nan atan2 (~0.123E1, ~0.0) = ~1.570796371 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592741 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.34028235E39) = ~3.614649389E~40 pow (~0.123, 0.34028235E39) = 0 atan2 (~0.123, 0.17014117E39) = ~7.229284764E~40 pow (~0.123, 0.17014117E39) = 0 atan2 (~0.123, 0.123E4) = ~1.000000047E~4 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666363 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.31415927E1) = ~0.0391321294 pow (~0.123, 0.31415927E1) = nan atan2 (~0.123, 0.27182817E1) = ~0.04521832988 pow (~0.123, 0.27182817E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865182 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981853 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.560796618 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.11754944E~37) = ~1.570796371 pow (~0.123, 0.11754944E~37) = nan atan2 (~0.123, 0.5877472E~38) = ~1.570796371 pow (~0.123, 0.5877472E~38) = nan atan2 (~0.123, 0.1E~44) = ~1.570796371 pow (~0.123, 0.1E~44) = nan atan2 (~0.123, 0.0) = ~1.570796371 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.34028235E39) = ~3.141592741 pow (~0.123, ~0.34028235E39) = inf atan2 (~0.123, ~0.17014117E39) = ~3.141592741 pow (~0.123, ~0.17014117E39) = inf atan2 (~0.123, ~0.123E4) = ~3.141492605 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592989 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.31415927E1) = ~3.102460623 pow (~0.123, ~0.31415927E1) = nan atan2 (~0.123, ~0.27182817E1) = ~3.096374273 pow (~0.123, ~0.27182817E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.356194496 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580796003 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.11754944E~37) = ~1.570796251 pow (~0.123, ~0.11754944E~37) = nan atan2 (~0.123, ~0.5877472E~38) = ~1.570796251 pow (~0.123, ~0.5877472E~38) = nan atan2 (~0.123, ~0.1E~44) = ~1.570796251 pow (~0.123, ~0.1E~44) = nan atan2 (~0.123, ~0.0) = ~1.570796371 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592741 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.34028235E39) = ~3.613948739E~42 pow (~0.123E~2, 0.34028235E39) = 0 atan2 (~0.123E~2, 0.17014117E39) = ~7.229298777E~42 pow (~0.123E~2, 0.17014117E39) = 0 atan2 (~0.123E~2, 0.123E4) = ~9.999999975E~7 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~1.000000047E~4 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.31415927E1) = ~3.915211419E~4 pow (~0.123E~2, 0.31415927E1) = nan atan2 (~0.123E~2, 0.27182817E1) = ~4.524917167E~4 pow (~0.123E~2, 0.27182817E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996983E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666363 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981853 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.11754944E~37) = ~1.570796371 pow (~0.123E~2, 0.11754944E~37) = nan atan2 (~0.123E~2, 0.5877472E~38) = ~1.570796371 pow (~0.123E~2, 0.5877472E~38) = nan atan2 (~0.123E~2, 0.1E~44) = ~1.570796371 pow (~0.123E~2, 0.1E~44) = nan atan2 (~0.123E~2, 0.0) = ~1.570796371 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.34028235E39) = ~3.141592741 pow (~0.123E~2, ~0.34028235E39) = inf atan2 (~0.123E~2, ~0.17014117E39) = ~3.141592741 pow (~0.123E~2, ~0.17014117E39) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591549 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492605 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.31415927E1) = ~3.141201019 pow (~0.123E~2, ~0.31415927E1) = nan atan2 (~0.123E~2, ~0.27182817E1) = ~3.141140223 pow (~0.123E~2, ~0.27182817E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592575 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592989 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.356194496 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.11754944E~37) = ~1.570796251 pow (~0.123E~2, ~0.11754944E~37) = nan atan2 (~0.123E~2, ~0.5877472E~38) = ~1.570796251 pow (~0.123E~2, ~0.5877472E~38) = nan atan2 (~0.123E~2, ~0.1E~44) = ~1.570796251 pow (~0.123E~2, ~0.1E~44) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796371 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592741 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.11754944E~37, 0.34028235E39) = 0 pow (~0.11754944E~37, 0.34028235E39) = 0 atan2 (~0.11754944E~37, 0.17014117E39) = 0 pow (~0.11754944E~37, 0.17014117E39) = 0 atan2 (~0.11754944E~37, 0.123E4) = ~9.556855527E~42 pow (~0.11754944E~37, 0.123E4) = 0 atan2 (~0.11754944E~37, 0.123E2) = ~9.55686954E~40 pow (~0.11754944E~37, 0.123E2) = nan atan2 (~0.11754944E~37, 0.31415927E1) = ~3.74171493E~39 pow (~0.11754944E~37, 0.31415927E1) = nan atan2 (~0.11754944E~37, 0.27182817E1) = ~4.324402857E~39 pow (~0.11754944E~37, 0.27182817E1) = nan atan2 (~0.11754944E~37, 0.123E1) = ~9.556863934E~39 pow (~0.11754944E~37, 0.123E1) = nan atan2 (~0.11754944E~37, 0.123) = ~9.556864495E~38 pow (~0.11754944E~37, 0.123) = nan atan2 (~0.11754944E~37, 0.123E~2) = ~9.556864495E~36 pow (~0.11754944E~37, 0.123E~2) = nan atan2 (~0.11754944E~37, 0.11754944E~37) = ~0.7853981853 pow (~0.11754944E~37, 0.11754944E~37) = nan atan2 (~0.11754944E~37, 0.5877472E~38) = ~1.107148767 pow (~0.11754944E~37, 0.5877472E~38) = nan atan2 (~0.11754944E~37, 0.1E~44) = ~1.570796251 pow (~0.11754944E~37, 0.1E~44) = nan atan2 (~0.11754944E~37, 0.0) = ~1.570796371 pow (~0.11754944E~37, 0.0) = 1 atan2 (~0.11754944E~37, ~0.34028235E39) = ~3.141592741 pow (~0.11754944E~37, ~0.34028235E39) = inf atan2 (~0.11754944E~37, ~0.17014117E39) = ~3.141592741 pow (~0.11754944E~37, ~0.17014117E39) = inf atan2 (~0.11754944E~37, ~0.123E4) = ~3.141592741 pow (~0.11754944E~37, ~0.123E4) = inf atan2 (~0.11754944E~37, ~0.123E2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E2) = nan atan2 (~0.11754944E~37, ~0.31415927E1) = ~3.141592741 pow (~0.11754944E~37, ~0.31415927E1) = nan atan2 (~0.11754944E~37, ~0.27182817E1) = ~3.141592741 pow (~0.11754944E~37, ~0.27182817E1) = nan atan2 (~0.11754944E~37, ~0.123E1) = ~3.141592741 pow (~0.11754944E~37, ~0.123E1) = nan atan2 (~0.11754944E~37, ~0.123) = ~3.141592741 pow (~0.11754944E~37, ~0.123) = nan atan2 (~0.11754944E~37, ~0.123E~2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E~2) = nan atan2 (~0.11754944E~37, ~0.11754944E~37) = ~2.356194496 pow (~0.11754944E~37, ~0.11754944E~37) = nan atan2 (~0.11754944E~37, ~0.5877472E~38) = ~2.034443855 pow (~0.11754944E~37, ~0.5877472E~38) = nan atan2 (~0.11754944E~37, ~0.1E~44) = ~1.570796371 pow (~0.11754944E~37, ~0.1E~44) = nan atan2 (~0.11754944E~37, ~0.0) = ~1.570796371 pow (~0.11754944E~37, ~0.0) = 1 atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.11754944E~37, ~inf) = ~3.141592741 pow (~0.11754944E~37, ~inf) = inf atan2 (~0.11754944E~37, nan) = nan pow (~0.11754944E~37, nan) = nan atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.5877472E~38, 0.34028235E39) = 0 pow (~0.5877472E~38, 0.34028235E39) = 0 atan2 (~0.5877472E~38, 0.17014117E39) = 0 pow (~0.5877472E~38, 0.17014117E39) = 0 atan2 (~0.5877472E~38, 0.123E4) = ~4.778427763E~42 pow (~0.5877472E~38, 0.123E4) = 0 atan2 (~0.5877472E~38, 0.123E2) = ~4.778427763E~40 pow (~0.5877472E~38, 0.123E2) = nan atan2 (~0.5877472E~38, 0.31415927E1) = ~1.870856764E~39 pow (~0.5877472E~38, 0.31415927E1) = nan atan2 (~0.5877472E~38, 0.27182817E1) = ~2.162200728E~39 pow (~0.5877472E~38, 0.27182817E1) = nan atan2 (~0.5877472E~38, 0.123E1) = ~4.778431967E~39 pow (~0.5877472E~38, 0.123E1) = nan atan2 (~0.5877472E~38, 0.123) = ~4.778432248E~38 pow (~0.5877472E~38, 0.123) = nan atan2 (~0.5877472E~38, 0.123E~2) = ~4.778432248E~36 pow (~0.5877472E~38, 0.123E~2) = nan atan2 (~0.5877472E~38, 0.11754944E~37) = ~0.463647604 pow (~0.5877472E~38, 0.11754944E~37) = nan atan2 (~0.5877472E~38, 0.5877472E~38) = ~0.7853981853 pow (~0.5877472E~38, 0.5877472E~38) = nan atan2 (~0.5877472E~38, 0.1E~44) = ~1.570796132 pow (~0.5877472E~38, 0.1E~44) = nan atan2 (~0.5877472E~38, 0.0) = ~1.570796371 pow (~0.5877472E~38, 0.0) = 1 atan2 (~0.5877472E~38, ~0.34028235E39) = ~3.141592741 pow (~0.5877472E~38, ~0.34028235E39) = inf atan2 (~0.5877472E~38, ~0.17014117E39) = ~3.141592741 pow (~0.5877472E~38, ~0.17014117E39) = inf atan2 (~0.5877472E~38, ~0.123E4) = ~3.141592741 pow (~0.5877472E~38, ~0.123E4) = inf atan2 (~0.5877472E~38, ~0.123E2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E2) = nan atan2 (~0.5877472E~38, ~0.31415927E1) = ~3.141592741 pow (~0.5877472E~38, ~0.31415927E1) = nan atan2 (~0.5877472E~38, ~0.27182817E1) = ~3.141592741 pow (~0.5877472E~38, ~0.27182817E1) = nan atan2 (~0.5877472E~38, ~0.123E1) = ~3.141592741 pow (~0.5877472E~38, ~0.123E1) = nan atan2 (~0.5877472E~38, ~0.123) = ~3.141592741 pow (~0.5877472E~38, ~0.123) = nan atan2 (~0.5877472E~38, ~0.123E~2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E~2) = nan atan2 (~0.5877472E~38, ~0.11754944E~37) = ~2.677945137 pow (~0.5877472E~38, ~0.11754944E~37) = nan atan2 (~0.5877472E~38, ~0.5877472E~38) = ~2.356194496 pow (~0.5877472E~38, ~0.5877472E~38) = nan atan2 (~0.5877472E~38, ~0.1E~44) = ~1.57079649 pow (~0.5877472E~38, ~0.1E~44) = nan atan2 (~0.5877472E~38, ~0.0) = ~1.570796371 pow (~0.5877472E~38, ~0.0) = 1 atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.5877472E~38, ~inf) = ~3.141592741 pow (~0.5877472E~38, ~inf) = inf atan2 (~0.5877472E~38, nan) = nan pow (~0.5877472E~38, nan) = nan atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.1E~44, 0.34028235E39) = 0 pow (~0.1E~44, 0.34028235E39) = 0 atan2 (~0.1E~44, 0.17014117E39) = 0 pow (~0.1E~44, 0.17014117E39) = 0 atan2 (~0.1E~44, 0.123E4) = 0 pow (~0.1E~44, 0.123E4) = 0 atan2 (~0.1E~44, 0.123E2) = 0 pow (~0.1E~44, 0.123E2) = nan atan2 (~0.1E~44, 0.31415927E1) = 0 pow (~0.1E~44, 0.31415927E1) = nan atan2 (~0.1E~44, 0.27182817E1) = 0 pow (~0.1E~44, 0.27182817E1) = nan atan2 (~0.1E~44, 0.123E1) = ~1.401298464E~45 pow (~0.1E~44, 0.123E1) = nan atan2 (~0.1E~44, 0.123) = ~1.121038771E~44 pow (~0.1E~44, 0.123) = nan atan2 (~0.1E~44, 0.123E~2) = ~1.139255651E~42 pow (~0.1E~44, 0.123E~2) = nan atan2 (~0.1E~44, 0.11754944E~37) = ~1.192092896E~7 pow (~0.1E~44, 0.11754944E~37) = nan atan2 (~0.1E~44, 0.5877472E~38) = ~2.384185791E~7 pow (~0.1E~44, 0.5877472E~38) = nan atan2 (~0.1E~44, 0.1E~44) = ~0.7853981853 pow (~0.1E~44, 0.1E~44) = nan atan2 (~0.1E~44, 0.0) = ~1.570796371 pow (~0.1E~44, 0.0) = 1 atan2 (~0.1E~44, ~0.34028235E39) = ~3.141592741 pow (~0.1E~44, ~0.34028235E39) = inf atan2 (~0.1E~44, ~0.17014117E39) = ~3.141592741 pow (~0.1E~44, ~0.17014117E39) = inf atan2 (~0.1E~44, ~0.123E4) = ~3.141592741 pow (~0.1E~44, ~0.123E4) = inf atan2 (~0.1E~44, ~0.123E2) = ~3.141592741 pow (~0.1E~44, ~0.123E2) = nan atan2 (~0.1E~44, ~0.31415927E1) = ~3.141592741 pow (~0.1E~44, ~0.31415927E1) = nan atan2 (~0.1E~44, ~0.27182817E1) = ~3.141592741 pow (~0.1E~44, ~0.27182817E1) = nan atan2 (~0.1E~44, ~0.123E1) = ~3.141592741 pow (~0.1E~44, ~0.123E1) = nan atan2 (~0.1E~44, ~0.123) = ~3.141592741 pow (~0.1E~44, ~0.123) = nan atan2 (~0.1E~44, ~0.123E~2) = ~3.141592741 pow (~0.1E~44, ~0.123E~2) = nan atan2 (~0.1E~44, ~0.11754944E~37) = ~3.141592503 pow (~0.1E~44, ~0.11754944E~37) = nan atan2 (~0.1E~44, ~0.5877472E~38) = ~3.141592503 pow (~0.1E~44, ~0.5877472E~38) = nan atan2 (~0.1E~44, ~0.1E~44) = ~2.356194496 pow (~0.1E~44, ~0.1E~44) = nan atan2 (~0.1E~44, ~0.0) = ~1.570796371 pow (~0.1E~44, ~0.0) = 1 atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.1E~44, ~inf) = ~3.141592741 pow (~0.1E~44, ~inf) = inf atan2 (~0.1E~44, nan) = nan pow (~0.1E~44, nan) = nan atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.0, 0.34028235E39) = 0 pow (~0.0, 0.34028235E39) = 0 atan2 (~0.0, 0.17014117E39) = 0 pow (~0.0, 0.17014117E39) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.31415927E1) = 0 pow (~0.0, 0.31415927E1) = 0 atan2 (~0.0, 0.27182817E1) = 0 pow (~0.0, 0.27182817E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.11754944E~37) = 0 pow (~0.0, 0.11754944E~37) = 0 atan2 (~0.0, 0.5877472E~38) = 0 pow (~0.0, 0.5877472E~38) = 0 atan2 (~0.0, 0.1E~44) = 0 pow (~0.0, 0.1E~44) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.34028235E39) = ~3.141592741 pow (~0.0, ~0.34028235E39) = inf atan2 (~0.0, ~0.17014117E39) = ~3.141592741 pow (~0.0, ~0.17014117E39) = inf atan2 (~0.0, ~0.123E4) = ~3.141592741 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592741 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.31415927E1) = ~3.141592741 pow (~0.0, ~0.31415927E1) = inf atan2 (~0.0, ~0.27182817E1) = ~3.141592741 pow (~0.0, ~0.27182817E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592741 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592741 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592741 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.11754944E~37) = ~3.141592741 pow (~0.0, ~0.11754944E~37) = inf atan2 (~0.0, ~0.5877472E~38) = ~3.141592741 pow (~0.0, ~0.5877472E~38) = inf atan2 (~0.0, ~0.1E~44) = ~3.141592741 pow (~0.0, ~0.1E~44) = inf atan2 (~0.0, ~0.0) = ~3.141592741 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592741 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (~inf, 0.34028235E39) = ~1.570796371 pow (~inf, 0.34028235E39) = inf atan2 (~inf, 0.17014117E39) = ~1.570796371 pow (~inf, 0.17014117E39) = inf atan2 (~inf, 0.123E4) = ~1.570796371 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796371 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.31415927E1) = ~1.570796371 pow (~inf, 0.31415927E1) = inf atan2 (~inf, 0.27182817E1) = ~1.570796371 pow (~inf, 0.27182817E1) = inf atan2 (~inf, 0.123E1) = ~1.570796371 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796371 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796371 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.11754944E~37) = ~1.570796371 pow (~inf, 0.11754944E~37) = inf atan2 (~inf, 0.5877472E~38) = ~1.570796371 pow (~inf, 0.5877472E~38) = inf atan2 (~inf, 0.1E~44) = ~1.570796371 pow (~inf, 0.1E~44) = inf atan2 (~inf, 0.0) = ~1.570796371 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.34028235E39) = ~1.570796371 pow (~inf, ~0.34028235E39) = 0 atan2 (~inf, ~0.17014117E39) = ~1.570796371 pow (~inf, ~0.17014117E39) = 0 atan2 (~inf, ~0.123E4) = ~1.570796371 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796371 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.31415927E1) = ~1.570796371 pow (~inf, ~0.31415927E1) = 0 atan2 (~inf, ~0.27182817E1) = ~1.570796371 pow (~inf, ~0.27182817E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796371 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796371 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796371 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.11754944E~37) = ~1.570796371 pow (~inf, ~0.11754944E~37) = 0 atan2 (~inf, ~0.5877472E~38) = ~1.570796371 pow (~inf, ~0.5877472E~38) = 0 atan2 (~inf, ~0.1E~44) = ~1.570796371 pow (~inf, ~0.1E~44) = 0 atan2 (~inf, ~0.0) = ~1.570796371 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.356194496 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (nan, 0.34028235E39) = nan pow (nan, 0.34028235E39) = nan atan2 (nan, 0.17014117E39) = nan pow (nan, 0.17014117E39) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.31415927E1) = nan pow (nan, 0.31415927E1) = nan atan2 (nan, 0.27182817E1) = nan pow (nan, 0.27182817E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.11754944E~37) = nan pow (nan, 0.11754944E~37) = nan atan2 (nan, 0.5877472E~38) = nan pow (nan, 0.5877472E~38) = nan atan2 (nan, 0.1E~44) = nan pow (nan, 0.1E~44) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.34028235E39) = nan pow (nan, ~0.34028235E39) = nan atan2 (nan, ~0.17014117E39) = nan pow (nan, ~0.17014117E39) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.31415927E1) = nan pow (nan, ~0.31415927E1) = nan atan2 (nan, ~0.27182817E1) = nan pow (nan, ~0.27182817E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.11754944E~37) = nan pow (nan, ~0.11754944E~37) = nan atan2 (nan, ~0.5877472E~38) = nan pow (nan, ~0.5877472E~38) = nan atan2 (nan, ~0.1E~44) = nan pow (nan, ~0.1E~44) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.34028235E39, 0.123E1, ~0.34028235E39): 0.78264946E38 inf (0.34028235E39, 0.123E1, ~0.17014117E39): 0.24840611E39 inf (0.34028235E39, 0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.34028235E39, ~0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (0.34028235E39, ~0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (0.34028235E39, ~0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.17014117E39, 0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (0.17014117E39, 0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (0.17014117E39, 0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (0.17014117E39, 0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.17014117E39, 0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.17014117E39, 0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.17014117E39, ~0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (0.17014117E39, ~0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (0.17014117E39, ~0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (0.17014117E39, ~0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.17014117E39, ~0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.17014117E39, ~0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123E4, 0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E4, 0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E4, 0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (0.123E4, 0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (0.123E4, 0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.123E4, 0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (0.123E4, 0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E4, 0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E4, 0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E4, 0.123, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E4, 0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E4, 0.123E~2, 0.123): 0.16359E1 0.16359001E1 (0.123E4, 0.123E~2, ~0.123E1): 0.28290004 0.2829001 (0.123E4, ~0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E4, ~0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E4, ~0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.123E4, ~0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.123E4, ~0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.123E4, ~0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.123E4, ~0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E4, ~0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E4, ~0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E4, ~0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (0.123E4, ~0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E4, ~0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, 0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (0.123E2, 0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (0.123E2, 0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123E2, 0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123E2, 0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123E2, 0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (0.123E2, 0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (0.123E2, 0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.123E2, 0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (0.123E2, 0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (0.123E2, 0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (0.123E2, 0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.123E2, 0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (0.123E2, 0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (0.123E2, 0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.123E2, 0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.123E2, 0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (0.123E2, 0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.123E2, 0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E2, 0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E2, 0.123, 0.123): 0.16359E1 0.16359001E1 (0.123E2, 0.123, ~0.123E1): 0.28290004 0.2829001 (0.123E2, 0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E2, ~0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (0.123E2, ~0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (0.123E2, ~0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123E2, ~0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123E2, ~0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123E2, ~0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123E2, ~0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.123E2, ~0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (0.123E2, ~0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.123E2, ~0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.123E2, ~0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.123E2, ~0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.123E2, ~0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.123E2, ~0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.123E2, ~0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.123E2, ~0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.123E2, ~0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.123E2, ~0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E2, ~0.123, 0.123E1): ~0.28290004 ~0.2829001 (0.123E2, ~0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E2, ~0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E2, ~0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.31415927E1, 0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (0.31415927E1, 0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (0.31415927E1, 0.123E4, 0.123): 0.3864282E4 0.38642822E4 (0.31415927E1, 0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (0.31415927E1, 0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (0.31415927E1, 0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (0.31415927E1, 0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (0.31415927E1, 0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (0.31415927E1, 0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (0.31415927E1, 0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (0.31415927E1, 0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (0.31415927E1, 0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.31415927E1, 0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.31415927E1, 0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.31415927E1, 0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.31415927E1, 0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.31415927E1, 0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.31415927E1, 0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.31415927E1, 0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.31415927E1, 0.123E1, 0.123): 0.39871593E1 0.3987159E1 (0.31415927E1, 0.123, ~0.123E1): ~0.8435841 ~0.84358406 (0.31415927E1, 0.123, ~0.123): 0.2634159 0.26341593 (0.31415927E1, ~0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (0.31415927E1, ~0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (0.31415927E1, ~0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (0.31415927E1, ~0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (0.31415927E1, ~0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (0.31415927E1, ~0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (0.31415927E1, ~0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (0.31415927E1, ~0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (0.31415927E1, ~0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (0.31415927E1, ~0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (0.31415927E1, ~0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (0.31415927E1, ~0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.31415927E1, ~0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.31415927E1, ~0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.31415927E1, ~0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.31415927E1, ~0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.31415927E1, ~0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.31415927E1, ~0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.31415927E1, ~0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.31415927E1, ~0.123, 0.123E1): 0.8435841 0.84358406 (0.31415927E1, ~0.123, 0.123): ~0.2634159 ~0.26341593 (0.27182817E1, 0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (0.27182817E1, 0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (0.27182817E1, 0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (0.27182817E1, 0.123E2, 0.123): 0.33557865E2 0.3355787E2 (0.27182817E1, 0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (0.27182817E1, 0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (0.27182817E1, 0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (0.27182817E1, 0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (0.27182817E1, 0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (0.27182817E1, 0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (0.27182817E1, 0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (0.27182817E1, 0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (0.27182817E1, 0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (0.27182817E1, 0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (0.27182817E1, 0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (0.27182817E1, 0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (0.27182817E1, 0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (0.27182817E1, 0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (0.27182817E1, 0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (0.27182817E1, 0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.27182817E1, 0.123E1, 0.123): 0.34664867E1 0.34664865E1 (0.27182817E1, 0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (0.27182817E1, 0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (0.27182817E1, 0.123, 0.123E~2): 0.33557865 0.33557868 (0.27182817E1, 0.123, ~0.123): 0.21134867 0.21134868 (0.27182817E1, ~0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (0.27182817E1, ~0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (0.27182817E1, ~0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (0.27182817E1, ~0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (0.27182817E1, ~0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (0.27182817E1, ~0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (0.27182817E1, ~0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (0.27182817E1, ~0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (0.27182817E1, ~0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (0.27182817E1, ~0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (0.27182817E1, ~0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (0.27182817E1, ~0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (0.27182817E1, ~0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (0.27182817E1, ~0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (0.27182817E1, ~0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (0.27182817E1, ~0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (0.27182817E1, ~0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (0.27182817E1, ~0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (0.27182817E1, ~0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.27182817E1, ~0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.27182817E1, ~0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.27182817E1, ~0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.27182817E1, ~0.123, 0.123): ~0.21134867 ~0.21134868 (0.27182817E1, ~0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123E1, 0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (0.123E1, 0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (0.123E1, 0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (0.123E1, 0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (0.123E1, 0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (0.123E1, 0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (0.123E1, 0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (0.123E1, 0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (0.123E1, 0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (0.123E1, 0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (0.123E1, 0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (0.123E1, 0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (0.123E1, 0.123E1, ~0.123E1): 0.28290004 0.28289998 (0.123E1, 0.123E1, ~0.123): 0.13899001E1 0.13899E1 (0.123E1, 0.123, 0.123E1): 0.13812901E1 0.138129E1 (0.123E1, 0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123E1, 0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123E1, 0.123, ~0.123E~2): 0.15006001 0.15006 (0.123E1, 0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E1, ~0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (0.123E1, ~0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (0.123E1, ~0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (0.123E1, ~0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (0.123E1, ~0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (0.123E1, ~0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (0.123E1, ~0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (0.123E1, ~0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (0.123E1, ~0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (0.123E1, ~0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (0.123E1, ~0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (0.123E1, ~0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (0.123E1, ~0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (0.123E1, ~0.123, 0.123E1): 0.107871E1 0.10787101E1 (0.123E1, ~0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123E1, ~0.123, 0.123E~2): ~0.15006001 ~0.15006 (0.123E1, ~0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E1, ~0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (0.123, 0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (0.123, 0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (0.123, 0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (0.123, 0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (0.123, 0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (0.123, 0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (0.123, 0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123, 0.123E2, 0.123): 0.16359E1 0.16359001E1 (0.123, 0.123E2, ~0.123E1): 0.28290004 0.2829001 (0.123, 0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (0.123, 0.31415927E1, ~0.123): 0.2634159 0.26341593 (0.123, 0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (0.123, 0.27182817E1, ~0.123): 0.21134867 0.21134868 (0.123, 0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (0.123, 0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (0.123, 0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (0.123, 0.123E1, ~0.123E~2): 0.15006001 0.15006 (0.123, ~0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (0.123, ~0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (0.123, ~0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (0.123, ~0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (0.123, ~0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (0.123, ~0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (0.123, ~0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (0.123, ~0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123, ~0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123, ~0.31415927E1, 0.123E1): 0.8435841 0.84358406 (0.123, ~0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (0.123, ~0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (0.123, ~0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (0.123, ~0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (0.123, ~0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (0.123, ~0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (0.123, ~0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (0.123E~2, 0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (0.123E~2, 0.123E4, 0.123): 0.16359E1 0.16359001E1 (0.123E~2, 0.123E4, ~0.123E1): 0.28290004 0.2829001 (0.123E~2, 0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (0.123E~2, 0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (0.123E~2, ~0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (0.123E~2, ~0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (0.123E~2, ~0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (0.123E~2, ~0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (0.123E~2, ~0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.34028235E39, 0.123E1, 0.34028235E39): ~0.78264946E38 ~inf (~0.34028235E39, 0.123E1, 0.17014117E39): ~0.24840611E39 ~inf (~0.34028235E39, 0.123, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.34028235E39, ~0.123E1, ~0.34028235E39): 0.78264946E38 inf (~0.34028235E39, ~0.123E1, ~0.17014117E39): 0.24840611E39 inf (~0.34028235E39, ~0.123, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.17014117E39, 0.31415927E1, 0.34028235E39): ~0.19423192E39 ~inf (~0.17014117E39, 0.27182817E1, 0.34028235E39): ~0.1222093E39 ~inf (~0.17014117E39, 0.27182817E1, 0.17014117E39): ~0.29235047E39 ~inf (~0.17014117E39, 0.123E1, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.17014117E39, 0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.17014117E39, 0.123, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.17014117E39, ~0.31415927E1, ~0.34028235E39): 0.19423192E39 inf (~0.17014117E39, ~0.27182817E1, ~0.34028235E39): 0.1222093E39 inf (~0.17014117E39, ~0.27182817E1, ~0.17014117E39): 0.29235047E39 inf (~0.17014117E39, ~0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.17014117E39, ~0.123E1, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.17014117E39, ~0.123, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123E4, 0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E4, 0.123E2, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E4, 0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.123E4, 0.31415927E1, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.123E4, 0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.123E4, 0.31415927E1, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.123E4, 0.123, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E4, 0.123, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E4, 0.123, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E4, 0.123, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E4, 0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E4, 0.123E~2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E4, ~0.123E2, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E4, ~0.123E2, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E4, ~0.31415927E1, 0.123E2): 0.3876459E4 0.38764592E4 (~0.123E4, ~0.31415927E1, 0.123): 0.3864282E4 0.38642822E4 (~0.123E4, ~0.31415927E1, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.123E4, ~0.31415927E1, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.123E4, ~0.123, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E4, ~0.123, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E4, ~0.123, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E4, ~0.123, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E4, ~0.123E~2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E4, ~0.123E~2, 0.123): 0.16359E1 0.16359001E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, 0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126281E5 (~0.123E2, 0.123E4, 0.123E1): ~0.151277705E5 ~0.1512777E5 (~0.123E2, 0.123E2, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123E2, 0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123E2, 0.123E2, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123E2, 0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123E2, 0.31415927E1, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.123E2, 0.31415927E1, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.123E2, 0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.123E2, 0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.123E2, 0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.123E2, 0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.123E2, 0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.123E2, 0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.123E2, 0.27182817E1, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.123E2, 0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.123E2, 0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.123E2, 0.27182817E1, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E2, 0.123, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E2, 0.123, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E2, 0.123, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E2, 0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E2, ~0.123E4, ~0.27182817E1): 0.15126282E5 0.15126281E5 (~0.123E2, ~0.123E4, ~0.123E1): 0.151277705E5 0.1512777E5 (~0.123E2, ~0.123E2, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123E2, ~0.123E2, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123E2, ~0.123E2, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123E2, ~0.123E2, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123E2, ~0.31415927E1, 0.123E2): 0.50941593E2 0.5094159E2 (~0.123E2, ~0.31415927E1, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.123E2, ~0.31415927E1, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.123E2, ~0.31415927E1, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.123E2, ~0.31415927E1, ~0.123): 0.38518593E2 0.3851859E2 (~0.123E2, ~0.27182817E1, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.123E2, ~0.27182817E1, 0.123): 0.33557865E2 0.3355787E2 (~0.123E2, ~0.27182817E1, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.123E2, ~0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.123E2, ~0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.123E2, ~0.27182817E1, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.123E2, ~0.27182817E1, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E2, ~0.123, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E2, ~0.123, 0.123): 0.16359E1 0.16359001E1 (~0.123E2, ~0.123, ~0.123E1): 0.28290004 0.2829001 (~0.123E2, ~0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.31415927E1, 0.17014117E39, 0.34028235E39): ~0.19423192E39 ~inf (~0.31415927E1, 0.123E4, 0.27182817E1): ~0.38614407E4 ~0.3861441E4 (~0.31415927E1, 0.123E4, 0.123E1): ~0.3862929E4 ~0.38629292E4 (~0.31415927E1, 0.123E4, ~0.123E2): ~0.3876459E4 ~0.38764592E4 (~0.31415927E1, 0.123E4, ~0.123): ~0.3864282E4 ~0.38642822E4 (~0.31415927E1, 0.123E2, 0.31415927E1): ~0.355E2 ~0.35499996E2 (~0.31415927E1, 0.123E2, 0.123): ~0.38518593E2 ~0.3851859E2 (~0.31415927E1, 0.123E2, ~0.123E2): ~0.50941593E2 ~0.5094159E2 (~0.31415927E1, 0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.4135987E2 (~0.31415927E1, 0.123E2, ~0.123E~2): ~0.38642822E2 ~0.3864282E2 (~0.31415927E1, 0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099606E2 (~0.31415927E1, 0.27182817E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.31415927E1, 0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.31415927E1, 0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.31415927E1, 0.27182817E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.31415927E1, 0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.31415927E1, 0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.31415927E1, 0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.31415927E1, 0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.31415927E1, 0.123E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.31415927E1, 0.123, 0.123E1): 0.8435841 0.84358406 (~0.31415927E1, 0.123, 0.123): ~0.2634159 ~0.26341593 (~0.31415927E1, ~0.17014117E39, ~0.34028235E39): 0.19423192E39 inf (~0.31415927E1, ~0.123E4, 0.123E2): 0.3876459E4 0.38764592E4 (~0.31415927E1, ~0.123E4, 0.123): 0.3864282E4 0.38642822E4 (~0.31415927E1, ~0.123E4, ~0.27182817E1): 0.38614407E4 0.3861441E4 (~0.31415927E1, ~0.123E4, ~0.123E1): 0.3862929E4 0.38629292E4 (~0.31415927E1, ~0.123E2, 0.123E2): 0.50941593E2 0.5094159E2 (~0.31415927E1, ~0.123E2, 0.27182817E1): 0.41359875E2 0.4135987E2 (~0.31415927E1, ~0.123E2, 0.123E~2): 0.38642822E2 0.3864282E2 (~0.31415927E1, ~0.123E2, ~0.31415927E1): 0.355E2 0.35499996E2 (~0.31415927E1, ~0.123E2, ~0.123): 0.38518593E2 0.3851859E2 (~0.31415927E1, ~0.31415927E1, 0.123E1): 0.11099605E2 0.11099606E2 (~0.31415927E1, ~0.27182817E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.31415927E1, ~0.27182817E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.31415927E1, ~0.27182817E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.31415927E1, ~0.27182817E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.31415927E1, ~0.27182817E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.31415927E1, ~0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.31415927E1, ~0.123E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.31415927E1, ~0.123E1, 0.123): 0.39871593E1 0.3987159E1 (~0.31415927E1, ~0.123, ~0.123E1): ~0.8435841 ~0.84358406 (~0.31415927E1, ~0.123, ~0.123): 0.2634159 0.26341593 (~0.27182817E1, 0.17014117E39, 0.34028235E39): ~0.1222093E39 ~inf (~0.27182817E1, 0.17014117E39, 0.17014117E39): ~0.29235047E39 ~inf (~0.27182817E1, 0.123E2, 0.123E2): ~0.21134867E2 ~0.21134869E2 (~0.27182817E1, 0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293276E2 (~0.27182817E1, 0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716587E2 (~0.27182817E1, 0.123E2, 0.123E1): ~0.32204865E2 ~0.3220487E2 (~0.27182817E1, 0.123E2, 0.123E~2): ~0.33433636E2 ~0.3343364E2 (~0.27182817E1, 0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.3657646E2 (~0.27182817E1, 0.123E2, ~0.123): ~0.33557865E2 ~0.3355787E2 (~0.27182817E1, 0.31415927E1, 0.123E2): 0.3760266E1 0.37602663E1 (~0.27182817E1, 0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.5398141E1 (~0.27182817E1, 0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.5821452E1 (~0.27182817E1, 0.31415927E1, 0.123E1): ~0.73097343E1 ~0.7309734E1 (~0.27182817E1, 0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538504E1 (~0.27182817E1, 0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839733E2 (~0.27182817E1, 0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769733E1 (~0.27182817E1, 0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.4247463E1 (~0.27182817E1, 0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.7387826E1 (~0.27182817E1, 0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107338E2 (~0.27182817E1, 0.123E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.27182817E1, 0.123E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.27182817E1, 0.123E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.27182817E1, 0.123E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.27182817E1, 0.123, 0.123): ~0.21134867 ~0.21134868 (~0.27182817E1, 0.123, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.27182817E1, ~0.17014117E39, ~0.34028235E39): 0.1222093E39 inf (~0.27182817E1, ~0.17014117E39, ~0.17014117E39): 0.29235047E39 inf (~0.27182817E1, ~0.123E2, 0.31415927E1): 0.36576458E2 0.3657646E2 (~0.27182817E1, ~0.123E2, 0.123): 0.33557865E2 0.3355787E2 (~0.27182817E1, ~0.123E2, ~0.123E2): 0.21134867E2 0.21134869E2 (~0.27182817E1, ~0.123E2, ~0.31415927E1): 0.30293274E2 0.30293276E2 (~0.27182817E1, ~0.123E2, ~0.27182817E1): 0.30716585E2 0.30716587E2 (~0.27182817E1, ~0.123E2, ~0.123E1): 0.32204865E2 0.3220487E2 (~0.27182817E1, ~0.123E2, ~0.123E~2): 0.33433636E2 0.3343364E2 (~0.27182817E1, ~0.31415927E1, 0.123E2): 0.20839735E2 0.20839733E2 (~0.27182817E1, ~0.31415927E1, 0.123E1): 0.9769734E1 0.9769733E1 (~0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.37602663E1 (~0.27182817E1, ~0.31415927E1, ~0.31415927E1): 0.53981414E1 0.5398141E1 (~0.27182817E1, ~0.31415927E1, ~0.27182817E1): 0.58214526E1 0.5821452E1 (~0.27182817E1, ~0.31415927E1, ~0.123E1): 0.73097343E1 0.7309734E1 (~0.27182817E1, ~0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538504E1 (~0.27182817E1, ~0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107338E2 (~0.27182817E1, ~0.27182817E1, ~0.31415927E1): 0.42474627E1 0.4247463E1 (~0.27182817E1, ~0.27182817E1, ~0.123E~2): 0.73878255E1 0.7387826E1 (~0.27182817E1, ~0.123E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.27182817E1, ~0.123E1, 0.123): 0.34664867E1 0.34664865E1 (~0.27182817E1, ~0.123E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.27182817E1, ~0.123E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.27182817E1, ~0.123, 0.123E~2): 0.33557865 0.33557868 (~0.27182817E1, ~0.123, ~0.123): 0.21134867 0.21134868 (~0.123E1, 0.34028235E39, 0.34028235E39): ~0.78264946E38 ~inf (~0.123E1, 0.34028235E39, 0.17014117E39): ~0.24840611E39 ~inf (~0.123E1, 0.17014117E39, 0.34028235E39): 0.1310087E39 0.13100871E39 (~0.123E1, 0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132465E38 (~0.123E1, 0.123E2, 0.123E2): ~0.28290002E1 ~0.28290005E1 (~0.123E1, 0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.70057516E1 (~0.123E1, 0.31415927E1, ~0.123): ~0.39871593E1 ~0.3987159E1 (~0.123E1, 0.27182817E1, 0.31415927E1): ~0.20189385 ~0.2018938 (~0.123E1, 0.27182817E1, 0.27182817E1): ~0.62520486 ~0.6252048 (~0.123E1, 0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.45734863E1 (~0.123E1, 0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664865E1 (~0.123E1, 0.123E1, 0.123E1): ~0.28290004 ~0.28289998 (~0.123E1, 0.123E1, 0.123): ~0.13899001E1 ~0.13899E1 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429E1 (~0.123E1, 0.123, 0.123E1): 0.107871E1 0.10787101E1 (~0.123E1, 0.123, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123E1, 0.123, 0.123E~2): ~0.15006001 ~0.15006 (~0.123E1, 0.123, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123E1, 0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E1, ~0.34028235E39, ~0.34028235E39): 0.78264946E38 inf (~0.123E1, ~0.34028235E39, ~0.17014117E39): 0.24840611E39 inf (~0.123E1, ~0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.13100871E39 (~0.123E1, ~0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132465E38 (~0.123E1, ~0.123E2, ~0.123E2): 0.28290002E1 0.28290005E1 (~0.123E1, ~0.31415927E1, 0.31415927E1): 0.7005752E1 0.70057516E1 (~0.123E1, ~0.31415927E1, 0.123): 0.39871593E1 0.3987159E1 (~0.123E1, ~0.27182817E1, 0.123E1): 0.4573487E1 0.45734863E1 (~0.123E1, ~0.27182817E1, 0.123): 0.34664867E1 0.34664865E1 (~0.123E1, ~0.27182817E1, ~0.31415927E1): 0.20189385 0.2018938 (~0.123E1, ~0.27182817E1, ~0.27182817E1): 0.62520486 0.6252048 (~0.123E1, ~0.123E1, 0.123E1): 0.27429001E1 0.27429E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.28290004 0.28289998 (~0.123E1, ~0.123E1, ~0.123): 0.13899001E1 0.13899E1 (~0.123E1, ~0.123, 0.123E1): 0.13812901E1 0.138129E1 (~0.123E1, ~0.123, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123E1, ~0.123, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123E1, ~0.123, ~0.123E~2): 0.15006001 0.15006 (~0.123E1, ~0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290006E~3 (~0.123, 0.34028235E39, 0.34028235E39): 0.2984276E39 0.29842763E39 (~0.123, 0.17014117E39, 0.17014117E39): 0.1492138E39 0.14921381E39 (~0.123, 0.123E4, 0.31415927E1): ~0.1481484E3 ~0.14814842E3 (~0.123, 0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857173E3 (~0.123, 0.123E4, 0.123E1): ~0.15006E3 ~0.15006001E3 (~0.123, 0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129124E3 (~0.123, 0.123E2, 0.123E1): ~0.28290004 ~0.2829001 (~0.123, 0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123, 0.123E2, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123, 0.31415927E1, 0.123E1): 0.8435841 0.84358406 (~0.123, 0.31415927E1, 0.123): ~0.2634159 ~0.26341593 (~0.123, 0.27182817E1, 0.123): ~0.21134867 ~0.21134868 (~0.123, 0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557868 (~0.123, 0.123E1, 0.123E1): 0.107871E1 0.10787101E1 (~0.123, 0.123E1, 0.123): ~0.28290004E~1 ~0.28289996E~1 (~0.123, 0.123E1, 0.123E~2): ~0.15006001 ~0.15006 (~0.123, 0.123E1, ~0.123E1): ~0.13812901E1 ~0.138129E1 (~0.123, ~0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.29842763E39 (~0.123, ~0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.14921381E39 (~0.123, ~0.123E4, 0.123E~2): 0.15129123E3 0.15129124E3 (~0.123, ~0.123E4, ~0.31415927E1): 0.1481484E3 0.14814842E3 (~0.123, ~0.123E4, ~0.27182817E1): 0.14857172E3 0.14857173E3 (~0.123, ~0.123E4, ~0.123E1): 0.15006E3 0.15006001E3 (~0.123, ~0.123E2, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123, ~0.123E2, 0.123): 0.16359E1 0.16359001E1 (~0.123, ~0.123E2, ~0.123E1): 0.28290004 0.2829001 (~0.123, ~0.31415927E1, ~0.123E1): ~0.8435841 ~0.84358406 (~0.123, ~0.31415927E1, ~0.123): 0.2634159 0.26341593 (~0.123, ~0.27182817E1, 0.123E~2): 0.33557865 0.33557868 (~0.123, ~0.27182817E1, ~0.123): 0.21134867 0.21134868 (~0.123, ~0.123E1, 0.123E1): 0.13812901E1 0.138129E1 (~0.123, ~0.123E1, ~0.123E1): ~0.107871E1 ~0.10787101E1 (~0.123, ~0.123E1, ~0.123): 0.28290004E~1 0.28289996E~1 (~0.123, ~0.123E1, ~0.123E~2): 0.15006001 0.15006 (~0.123E~2, 0.123E4, 0.123E1): ~0.28290004 ~0.2829001 (~0.123E~2, 0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.4231182E1 (~0.123E~2, 0.123E4, ~0.123): ~0.16359E1 ~0.16359001E1 (~0.123E~2, 0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899E~1 (~0.123E~2, 0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290006E~3 (~0.123E~2, ~0.123E4, 0.27182817E1): 0.42311816E1 0.4231182E1 (~0.123E~2, ~0.123E4, 0.123): 0.16359E1 0.16359001E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.28290004 0.2829001 (~0.123E~2, ~0.123E2, ~0.123E~2): 0.13899001E~1 0.13899E~1 (~0.123E~2, ~0.123E1, ~0.123E~2): 0.28290003E~3 0.28290006E~3 Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.34028235E39, 0.34028235E39) = false > (0.34028235E39, 0.34028235E39) = false == (0.34028235E39, 0.34028235E39) = true ?= (0.34028235E39, 0.34028235E39) = true < (0.34028235E39, 0.17014117E39) = false > (0.34028235E39, 0.17014117E39) = true == (0.34028235E39, 0.17014117E39) = false ?= (0.34028235E39, 0.17014117E39) = false < (0.34028235E39, 0.123E4) = false > (0.34028235E39, 0.123E4) = true == (0.34028235E39, 0.123E4) = false ?= (0.34028235E39, 0.123E4) = false < (0.34028235E39, 0.123E2) = false > (0.34028235E39, 0.123E2) = true == (0.34028235E39, 0.123E2) = false ?= (0.34028235E39, 0.123E2) = false < (0.34028235E39, 0.31415927E1) = false > (0.34028235E39, 0.31415927E1) = true == (0.34028235E39, 0.31415927E1) = false ?= (0.34028235E39, 0.31415927E1) = false < (0.34028235E39, 0.27182817E1) = false > (0.34028235E39, 0.27182817E1) = true == (0.34028235E39, 0.27182817E1) = false ?= (0.34028235E39, 0.27182817E1) = false < (0.34028235E39, 0.123E1) = false > (0.34028235E39, 0.123E1) = true == (0.34028235E39, 0.123E1) = false ?= (0.34028235E39, 0.123E1) = false < (0.34028235E39, 0.123) = false > (0.34028235E39, 0.123) = true == (0.34028235E39, 0.123) = false ?= (0.34028235E39, 0.123) = false < (0.34028235E39, 0.123E~2) = false > (0.34028235E39, 0.123E~2) = true == (0.34028235E39, 0.123E~2) = false ?= (0.34028235E39, 0.123E~2) = false < (0.34028235E39, 0.11754944E~37) = false > (0.34028235E39, 0.11754944E~37) = true == (0.34028235E39, 0.11754944E~37) = false ?= (0.34028235E39, 0.11754944E~37) = false < (0.34028235E39, 0.5877472E~38) = false > (0.34028235E39, 0.5877472E~38) = true == (0.34028235E39, 0.5877472E~38) = false ?= (0.34028235E39, 0.5877472E~38) = false < (0.34028235E39, 0.1E~44) = false > (0.34028235E39, 0.1E~44) = true == (0.34028235E39, 0.1E~44) = false ?= (0.34028235E39, 0.1E~44) = false < (0.34028235E39, 0.0) = false > (0.34028235E39, 0.0) = true == (0.34028235E39, 0.0) = false ?= (0.34028235E39, 0.0) = false < (0.34028235E39, ~0.34028235E39) = false > (0.34028235E39, ~0.34028235E39) = true == (0.34028235E39, ~0.34028235E39) = false ?= (0.34028235E39, ~0.34028235E39) = false < (0.34028235E39, ~0.17014117E39) = false > (0.34028235E39, ~0.17014117E39) = true == (0.34028235E39, ~0.17014117E39) = false ?= (0.34028235E39, ~0.17014117E39) = false < (0.34028235E39, ~0.123E4) = false > (0.34028235E39, ~0.123E4) = true == (0.34028235E39, ~0.123E4) = false ?= (0.34028235E39, ~0.123E4) = false < (0.34028235E39, ~0.123E2) = false > (0.34028235E39, ~0.123E2) = true == (0.34028235E39, ~0.123E2) = false ?= (0.34028235E39, ~0.123E2) = false < (0.34028235E39, ~0.31415927E1) = false > (0.34028235E39, ~0.31415927E1) = true == (0.34028235E39, ~0.31415927E1) = false ?= (0.34028235E39, ~0.31415927E1) = false < (0.34028235E39, ~0.27182817E1) = false > (0.34028235E39, ~0.27182817E1) = true == (0.34028235E39, ~0.27182817E1) = false ?= (0.34028235E39, ~0.27182817E1) = false < (0.34028235E39, ~0.123E1) = false > (0.34028235E39, ~0.123E1) = true == (0.34028235E39, ~0.123E1) = false ?= (0.34028235E39, ~0.123E1) = false < (0.34028235E39, ~0.123) = false > (0.34028235E39, ~0.123) = true == (0.34028235E39, ~0.123) = false ?= (0.34028235E39, ~0.123) = false < (0.34028235E39, ~0.123E~2) = false > (0.34028235E39, ~0.123E~2) = true == (0.34028235E39, ~0.123E~2) = false ?= (0.34028235E39, ~0.123E~2) = false < (0.34028235E39, ~0.11754944E~37) = false > (0.34028235E39, ~0.11754944E~37) = true == (0.34028235E39, ~0.11754944E~37) = false ?= (0.34028235E39, ~0.11754944E~37) = false < (0.34028235E39, ~0.5877472E~38) = false > (0.34028235E39, ~0.5877472E~38) = true == (0.34028235E39, ~0.5877472E~38) = false ?= (0.34028235E39, ~0.5877472E~38) = false < (0.34028235E39, ~0.1E~44) = false > (0.34028235E39, ~0.1E~44) = true == (0.34028235E39, ~0.1E~44) = false ?= (0.34028235E39, ~0.1E~44) = false < (0.34028235E39, ~0.0) = false > (0.34028235E39, ~0.0) = true == (0.34028235E39, ~0.0) = false ?= (0.34028235E39, ~0.0) = false < (0.17014117E39, 0.34028235E39) = true > (0.17014117E39, 0.34028235E39) = false == (0.17014117E39, 0.34028235E39) = false ?= (0.17014117E39, 0.34028235E39) = false < (0.17014117E39, 0.17014117E39) = false > (0.17014117E39, 0.17014117E39) = false == (0.17014117E39, 0.17014117E39) = true ?= (0.17014117E39, 0.17014117E39) = true < (0.17014117E39, 0.123E4) = false > (0.17014117E39, 0.123E4) = true == (0.17014117E39, 0.123E4) = false ?= (0.17014117E39, 0.123E4) = false < (0.17014117E39, 0.123E2) = false > (0.17014117E39, 0.123E2) = true == (0.17014117E39, 0.123E2) = false ?= (0.17014117E39, 0.123E2) = false < (0.17014117E39, 0.31415927E1) = false > (0.17014117E39, 0.31415927E1) = true == (0.17014117E39, 0.31415927E1) = false ?= (0.17014117E39, 0.31415927E1) = false < (0.17014117E39, 0.27182817E1) = false > (0.17014117E39, 0.27182817E1) = true == (0.17014117E39, 0.27182817E1) = false ?= (0.17014117E39, 0.27182817E1) = false < (0.17014117E39, 0.123E1) = false > (0.17014117E39, 0.123E1) = true == (0.17014117E39, 0.123E1) = false ?= (0.17014117E39, 0.123E1) = false < (0.17014117E39, 0.123) = false > (0.17014117E39, 0.123) = true == (0.17014117E39, 0.123) = false ?= (0.17014117E39, 0.123) = false < (0.17014117E39, 0.123E~2) = false > (0.17014117E39, 0.123E~2) = true == (0.17014117E39, 0.123E~2) = false ?= (0.17014117E39, 0.123E~2) = false < (0.17014117E39, 0.11754944E~37) = false > (0.17014117E39, 0.11754944E~37) = true == (0.17014117E39, 0.11754944E~37) = false ?= (0.17014117E39, 0.11754944E~37) = false < (0.17014117E39, 0.5877472E~38) = false > (0.17014117E39, 0.5877472E~38) = true == (0.17014117E39, 0.5877472E~38) = false ?= (0.17014117E39, 0.5877472E~38) = false < (0.17014117E39, 0.1E~44) = false > (0.17014117E39, 0.1E~44) = true == (0.17014117E39, 0.1E~44) = false ?= (0.17014117E39, 0.1E~44) = false < (0.17014117E39, 0.0) = false > (0.17014117E39, 0.0) = true == (0.17014117E39, 0.0) = false ?= (0.17014117E39, 0.0) = false < (0.17014117E39, ~0.34028235E39) = false > (0.17014117E39, ~0.34028235E39) = true == (0.17014117E39, ~0.34028235E39) = false ?= (0.17014117E39, ~0.34028235E39) = false < (0.17014117E39, ~0.17014117E39) = false > (0.17014117E39, ~0.17014117E39) = true == (0.17014117E39, ~0.17014117E39) = false ?= (0.17014117E39, ~0.17014117E39) = false < (0.17014117E39, ~0.123E4) = false > (0.17014117E39, ~0.123E4) = true == (0.17014117E39, ~0.123E4) = false ?= (0.17014117E39, ~0.123E4) = false < (0.17014117E39, ~0.123E2) = false > (0.17014117E39, ~0.123E2) = true == (0.17014117E39, ~0.123E2) = false ?= (0.17014117E39, ~0.123E2) = false < (0.17014117E39, ~0.31415927E1) = false > (0.17014117E39, ~0.31415927E1) = true == (0.17014117E39, ~0.31415927E1) = false ?= (0.17014117E39, ~0.31415927E1) = false < (0.17014117E39, ~0.27182817E1) = false > (0.17014117E39, ~0.27182817E1) = true == (0.17014117E39, ~0.27182817E1) = false ?= (0.17014117E39, ~0.27182817E1) = false < (0.17014117E39, ~0.123E1) = false > (0.17014117E39, ~0.123E1) = true == (0.17014117E39, ~0.123E1) = false ?= (0.17014117E39, ~0.123E1) = false < (0.17014117E39, ~0.123) = false > (0.17014117E39, ~0.123) = true == (0.17014117E39, ~0.123) = false ?= (0.17014117E39, ~0.123) = false < (0.17014117E39, ~0.123E~2) = false > (0.17014117E39, ~0.123E~2) = true == (0.17014117E39, ~0.123E~2) = false ?= (0.17014117E39, ~0.123E~2) = false < (0.17014117E39, ~0.11754944E~37) = false > (0.17014117E39, ~0.11754944E~37) = true == (0.17014117E39, ~0.11754944E~37) = false ?= (0.17014117E39, ~0.11754944E~37) = false < (0.17014117E39, ~0.5877472E~38) = false > (0.17014117E39, ~0.5877472E~38) = true == (0.17014117E39, ~0.5877472E~38) = false ?= (0.17014117E39, ~0.5877472E~38) = false < (0.17014117E39, ~0.1E~44) = false > (0.17014117E39, ~0.1E~44) = true == (0.17014117E39, ~0.1E~44) = false ?= (0.17014117E39, ~0.1E~44) = false < (0.17014117E39, ~0.0) = false > (0.17014117E39, ~0.0) = true == (0.17014117E39, ~0.0) = false ?= (0.17014117E39, ~0.0) = false < (0.123E4, 0.34028235E39) = true > (0.123E4, 0.34028235E39) = false == (0.123E4, 0.34028235E39) = false ?= (0.123E4, 0.34028235E39) = false < (0.123E4, 0.17014117E39) = true > (0.123E4, 0.17014117E39) = false == (0.123E4, 0.17014117E39) = false ?= (0.123E4, 0.17014117E39) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.31415927E1) = false > (0.123E4, 0.31415927E1) = true == (0.123E4, 0.31415927E1) = false ?= (0.123E4, 0.31415927E1) = false < (0.123E4, 0.27182817E1) = false > (0.123E4, 0.27182817E1) = true == (0.123E4, 0.27182817E1) = false ?= (0.123E4, 0.27182817E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.11754944E~37) = false > (0.123E4, 0.11754944E~37) = true == (0.123E4, 0.11754944E~37) = false ?= (0.123E4, 0.11754944E~37) = false < (0.123E4, 0.5877472E~38) = false > (0.123E4, 0.5877472E~38) = true == (0.123E4, 0.5877472E~38) = false ?= (0.123E4, 0.5877472E~38) = false < (0.123E4, 0.1E~44) = false > (0.123E4, 0.1E~44) = true == (0.123E4, 0.1E~44) = false ?= (0.123E4, 0.1E~44) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.34028235E39) = false > (0.123E4, ~0.34028235E39) = true == (0.123E4, ~0.34028235E39) = false ?= (0.123E4, ~0.34028235E39) = false < (0.123E4, ~0.17014117E39) = false > (0.123E4, ~0.17014117E39) = true == (0.123E4, ~0.17014117E39) = false ?= (0.123E4, ~0.17014117E39) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.31415927E1) = false > (0.123E4, ~0.31415927E1) = true == (0.123E4, ~0.31415927E1) = false ?= (0.123E4, ~0.31415927E1) = false < (0.123E4, ~0.27182817E1) = false > (0.123E4, ~0.27182817E1) = true == (0.123E4, ~0.27182817E1) = false ?= (0.123E4, ~0.27182817E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.11754944E~37) = false > (0.123E4, ~0.11754944E~37) = true == (0.123E4, ~0.11754944E~37) = false ?= (0.123E4, ~0.11754944E~37) = false < (0.123E4, ~0.5877472E~38) = false > (0.123E4, ~0.5877472E~38) = true == (0.123E4, ~0.5877472E~38) = false ?= (0.123E4, ~0.5877472E~38) = false < (0.123E4, ~0.1E~44) = false > (0.123E4, ~0.1E~44) = true == (0.123E4, ~0.1E~44) = false ?= (0.123E4, ~0.1E~44) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.34028235E39) = true > (0.123E2, 0.34028235E39) = false == (0.123E2, 0.34028235E39) = false ?= (0.123E2, 0.34028235E39) = false < (0.123E2, 0.17014117E39) = true > (0.123E2, 0.17014117E39) = false == (0.123E2, 0.17014117E39) = false ?= (0.123E2, 0.17014117E39) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.31415927E1) = false > (0.123E2, 0.31415927E1) = true == (0.123E2, 0.31415927E1) = false ?= (0.123E2, 0.31415927E1) = false < (0.123E2, 0.27182817E1) = false > (0.123E2, 0.27182817E1) = true == (0.123E2, 0.27182817E1) = false ?= (0.123E2, 0.27182817E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.11754944E~37) = false > (0.123E2, 0.11754944E~37) = true == (0.123E2, 0.11754944E~37) = false ?= (0.123E2, 0.11754944E~37) = false < (0.123E2, 0.5877472E~38) = false > (0.123E2, 0.5877472E~38) = true == (0.123E2, 0.5877472E~38) = false ?= (0.123E2, 0.5877472E~38) = false < (0.123E2, 0.1E~44) = false > (0.123E2, 0.1E~44) = true == (0.123E2, 0.1E~44) = false ?= (0.123E2, 0.1E~44) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.34028235E39) = false > (0.123E2, ~0.34028235E39) = true == (0.123E2, ~0.34028235E39) = false ?= (0.123E2, ~0.34028235E39) = false < (0.123E2, ~0.17014117E39) = false > (0.123E2, ~0.17014117E39) = true == (0.123E2, ~0.17014117E39) = false ?= (0.123E2, ~0.17014117E39) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.31415927E1) = false > (0.123E2, ~0.31415927E1) = true == (0.123E2, ~0.31415927E1) = false ?= (0.123E2, ~0.31415927E1) = false < (0.123E2, ~0.27182817E1) = false > (0.123E2, ~0.27182817E1) = true == (0.123E2, ~0.27182817E1) = false ?= (0.123E2, ~0.27182817E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.11754944E~37) = false > (0.123E2, ~0.11754944E~37) = true == (0.123E2, ~0.11754944E~37) = false ?= (0.123E2, ~0.11754944E~37) = false < (0.123E2, ~0.5877472E~38) = false > (0.123E2, ~0.5877472E~38) = true == (0.123E2, ~0.5877472E~38) = false ?= (0.123E2, ~0.5877472E~38) = false < (0.123E2, ~0.1E~44) = false > (0.123E2, ~0.1E~44) = true == (0.123E2, ~0.1E~44) = false ?= (0.123E2, ~0.1E~44) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.31415927E1, 0.34028235E39) = true > (0.31415927E1, 0.34028235E39) = false == (0.31415927E1, 0.34028235E39) = false ?= (0.31415927E1, 0.34028235E39) = false < (0.31415927E1, 0.17014117E39) = true > (0.31415927E1, 0.17014117E39) = false == (0.31415927E1, 0.17014117E39) = false ?= (0.31415927E1, 0.17014117E39) = false < (0.31415927E1, 0.123E4) = true > (0.31415927E1, 0.123E4) = false == (0.31415927E1, 0.123E4) = false ?= (0.31415927E1, 0.123E4) = false < (0.31415927E1, 0.123E2) = true > (0.31415927E1, 0.123E2) = false == (0.31415927E1, 0.123E2) = false ?= (0.31415927E1, 0.123E2) = false < (0.31415927E1, 0.31415927E1) = false > (0.31415927E1, 0.31415927E1) = false == (0.31415927E1, 0.31415927E1) = true ?= (0.31415927E1, 0.31415927E1) = true < (0.31415927E1, 0.27182817E1) = false > (0.31415927E1, 0.27182817E1) = true == (0.31415927E1, 0.27182817E1) = false ?= (0.31415927E1, 0.27182817E1) = false < (0.31415927E1, 0.123E1) = false > (0.31415927E1, 0.123E1) = true == (0.31415927E1, 0.123E1) = false ?= (0.31415927E1, 0.123E1) = false < (0.31415927E1, 0.123) = false > (0.31415927E1, 0.123) = true == (0.31415927E1, 0.123) = false ?= (0.31415927E1, 0.123) = false < (0.31415927E1, 0.123E~2) = false > (0.31415927E1, 0.123E~2) = true == (0.31415927E1, 0.123E~2) = false ?= (0.31415927E1, 0.123E~2) = false < (0.31415927E1, 0.11754944E~37) = false > (0.31415927E1, 0.11754944E~37) = true == (0.31415927E1, 0.11754944E~37) = false ?= (0.31415927E1, 0.11754944E~37) = false < (0.31415927E1, 0.5877472E~38) = false > (0.31415927E1, 0.5877472E~38) = true == (0.31415927E1, 0.5877472E~38) = false ?= (0.31415927E1, 0.5877472E~38) = false < (0.31415927E1, 0.1E~44) = false > (0.31415927E1, 0.1E~44) = true == (0.31415927E1, 0.1E~44) = false ?= (0.31415927E1, 0.1E~44) = false < (0.31415927E1, 0.0) = false > (0.31415927E1, 0.0) = true == (0.31415927E1, 0.0) = false ?= (0.31415927E1, 0.0) = false < (0.31415927E1, ~0.34028235E39) = false > (0.31415927E1, ~0.34028235E39) = true == (0.31415927E1, ~0.34028235E39) = false ?= (0.31415927E1, ~0.34028235E39) = false < (0.31415927E1, ~0.17014117E39) = false > (0.31415927E1, ~0.17014117E39) = true == (0.31415927E1, ~0.17014117E39) = false ?= (0.31415927E1, ~0.17014117E39) = false < (0.31415927E1, ~0.123E4) = false > (0.31415927E1, ~0.123E4) = true == (0.31415927E1, ~0.123E4) = false ?= (0.31415927E1, ~0.123E4) = false < (0.31415927E1, ~0.123E2) = false > (0.31415927E1, ~0.123E2) = true == (0.31415927E1, ~0.123E2) = false ?= (0.31415927E1, ~0.123E2) = false < (0.31415927E1, ~0.31415927E1) = false > (0.31415927E1, ~0.31415927E1) = true == (0.31415927E1, ~0.31415927E1) = false ?= (0.31415927E1, ~0.31415927E1) = false < (0.31415927E1, ~0.27182817E1) = false > (0.31415927E1, ~0.27182817E1) = true == (0.31415927E1, ~0.27182817E1) = false ?= (0.31415927E1, ~0.27182817E1) = false < (0.31415927E1, ~0.123E1) = false > (0.31415927E1, ~0.123E1) = true == (0.31415927E1, ~0.123E1) = false ?= (0.31415927E1, ~0.123E1) = false < (0.31415927E1, ~0.123) = false > (0.31415927E1, ~0.123) = true == (0.31415927E1, ~0.123) = false ?= (0.31415927E1, ~0.123) = false < (0.31415927E1, ~0.123E~2) = false > (0.31415927E1, ~0.123E~2) = true == (0.31415927E1, ~0.123E~2) = false ?= (0.31415927E1, ~0.123E~2) = false < (0.31415927E1, ~0.11754944E~37) = false > (0.31415927E1, ~0.11754944E~37) = true == (0.31415927E1, ~0.11754944E~37) = false ?= (0.31415927E1, ~0.11754944E~37) = false < (0.31415927E1, ~0.5877472E~38) = false > (0.31415927E1, ~0.5877472E~38) = true == (0.31415927E1, ~0.5877472E~38) = false ?= (0.31415927E1, ~0.5877472E~38) = false < (0.31415927E1, ~0.1E~44) = false > (0.31415927E1, ~0.1E~44) = true == (0.31415927E1, ~0.1E~44) = false ?= (0.31415927E1, ~0.1E~44) = false < (0.31415927E1, ~0.0) = false > (0.31415927E1, ~0.0) = true == (0.31415927E1, ~0.0) = false ?= (0.31415927E1, ~0.0) = false < (0.27182817E1, 0.34028235E39) = true > (0.27182817E1, 0.34028235E39) = false == (0.27182817E1, 0.34028235E39) = false ?= (0.27182817E1, 0.34028235E39) = false < (0.27182817E1, 0.17014117E39) = true > (0.27182817E1, 0.17014117E39) = false == (0.27182817E1, 0.17014117E39) = false ?= (0.27182817E1, 0.17014117E39) = false < (0.27182817E1, 0.123E4) = true > (0.27182817E1, 0.123E4) = false == (0.27182817E1, 0.123E4) = false ?= (0.27182817E1, 0.123E4) = false < (0.27182817E1, 0.123E2) = true > (0.27182817E1, 0.123E2) = false == (0.27182817E1, 0.123E2) = false ?= (0.27182817E1, 0.123E2) = false < (0.27182817E1, 0.31415927E1) = true > (0.27182817E1, 0.31415927E1) = false == (0.27182817E1, 0.31415927E1) = false ?= (0.27182817E1, 0.31415927E1) = false < (0.27182817E1, 0.27182817E1) = false > (0.27182817E1, 0.27182817E1) = false == (0.27182817E1, 0.27182817E1) = true ?= (0.27182817E1, 0.27182817E1) = true < (0.27182817E1, 0.123E1) = false > (0.27182817E1, 0.123E1) = true == (0.27182817E1, 0.123E1) = false ?= (0.27182817E1, 0.123E1) = false < (0.27182817E1, 0.123) = false > (0.27182817E1, 0.123) = true == (0.27182817E1, 0.123) = false ?= (0.27182817E1, 0.123) = false < (0.27182817E1, 0.123E~2) = false > (0.27182817E1, 0.123E~2) = true == (0.27182817E1, 0.123E~2) = false ?= (0.27182817E1, 0.123E~2) = false < (0.27182817E1, 0.11754944E~37) = false > (0.27182817E1, 0.11754944E~37) = true == (0.27182817E1, 0.11754944E~37) = false ?= (0.27182817E1, 0.11754944E~37) = false < (0.27182817E1, 0.5877472E~38) = false > (0.27182817E1, 0.5877472E~38) = true == (0.27182817E1, 0.5877472E~38) = false ?= (0.27182817E1, 0.5877472E~38) = false < (0.27182817E1, 0.1E~44) = false > (0.27182817E1, 0.1E~44) = true == (0.27182817E1, 0.1E~44) = false ?= (0.27182817E1, 0.1E~44) = false < (0.27182817E1, 0.0) = false > (0.27182817E1, 0.0) = true == (0.27182817E1, 0.0) = false ?= (0.27182817E1, 0.0) = false < (0.27182817E1, ~0.34028235E39) = false > (0.27182817E1, ~0.34028235E39) = true == (0.27182817E1, ~0.34028235E39) = false ?= (0.27182817E1, ~0.34028235E39) = false < (0.27182817E1, ~0.17014117E39) = false > (0.27182817E1, ~0.17014117E39) = true == (0.27182817E1, ~0.17014117E39) = false ?= (0.27182817E1, ~0.17014117E39) = false < (0.27182817E1, ~0.123E4) = false > (0.27182817E1, ~0.123E4) = true == (0.27182817E1, ~0.123E4) = false ?= (0.27182817E1, ~0.123E4) = false < (0.27182817E1, ~0.123E2) = false > (0.27182817E1, ~0.123E2) = true == (0.27182817E1, ~0.123E2) = false ?= (0.27182817E1, ~0.123E2) = false < (0.27182817E1, ~0.31415927E1) = false > (0.27182817E1, ~0.31415927E1) = true == (0.27182817E1, ~0.31415927E1) = false ?= (0.27182817E1, ~0.31415927E1) = false < (0.27182817E1, ~0.27182817E1) = false > (0.27182817E1, ~0.27182817E1) = true == (0.27182817E1, ~0.27182817E1) = false ?= (0.27182817E1, ~0.27182817E1) = false < (0.27182817E1, ~0.123E1) = false > (0.27182817E1, ~0.123E1) = true == (0.27182817E1, ~0.123E1) = false ?= (0.27182817E1, ~0.123E1) = false < (0.27182817E1, ~0.123) = false > (0.27182817E1, ~0.123) = true == (0.27182817E1, ~0.123) = false ?= (0.27182817E1, ~0.123) = false < (0.27182817E1, ~0.123E~2) = false > (0.27182817E1, ~0.123E~2) = true == (0.27182817E1, ~0.123E~2) = false ?= (0.27182817E1, ~0.123E~2) = false < (0.27182817E1, ~0.11754944E~37) = false > (0.27182817E1, ~0.11754944E~37) = true == (0.27182817E1, ~0.11754944E~37) = false ?= (0.27182817E1, ~0.11754944E~37) = false < (0.27182817E1, ~0.5877472E~38) = false > (0.27182817E1, ~0.5877472E~38) = true == (0.27182817E1, ~0.5877472E~38) = false ?= (0.27182817E1, ~0.5877472E~38) = false < (0.27182817E1, ~0.1E~44) = false > (0.27182817E1, ~0.1E~44) = true == (0.27182817E1, ~0.1E~44) = false ?= (0.27182817E1, ~0.1E~44) = false < (0.27182817E1, ~0.0) = false > (0.27182817E1, ~0.0) = true == (0.27182817E1, ~0.0) = false ?= (0.27182817E1, ~0.0) = false < (0.123E1, 0.34028235E39) = true > (0.123E1, 0.34028235E39) = false == (0.123E1, 0.34028235E39) = false ?= (0.123E1, 0.34028235E39) = false < (0.123E1, 0.17014117E39) = true > (0.123E1, 0.17014117E39) = false == (0.123E1, 0.17014117E39) = false ?= (0.123E1, 0.17014117E39) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.31415927E1) = true > (0.123E1, 0.31415927E1) = false == (0.123E1, 0.31415927E1) = false ?= (0.123E1, 0.31415927E1) = false < (0.123E1, 0.27182817E1) = true > (0.123E1, 0.27182817E1) = false == (0.123E1, 0.27182817E1) = false ?= (0.123E1, 0.27182817E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.11754944E~37) = false > (0.123E1, 0.11754944E~37) = true == (0.123E1, 0.11754944E~37) = false ?= (0.123E1, 0.11754944E~37) = false < (0.123E1, 0.5877472E~38) = false > (0.123E1, 0.5877472E~38) = true == (0.123E1, 0.5877472E~38) = false ?= (0.123E1, 0.5877472E~38) = false < (0.123E1, 0.1E~44) = false > (0.123E1, 0.1E~44) = true == (0.123E1, 0.1E~44) = false ?= (0.123E1, 0.1E~44) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.34028235E39) = false > (0.123E1, ~0.34028235E39) = true == (0.123E1, ~0.34028235E39) = false ?= (0.123E1, ~0.34028235E39) = false < (0.123E1, ~0.17014117E39) = false > (0.123E1, ~0.17014117E39) = true == (0.123E1, ~0.17014117E39) = false ?= (0.123E1, ~0.17014117E39) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.31415927E1) = false > (0.123E1, ~0.31415927E1) = true == (0.123E1, ~0.31415927E1) = false ?= (0.123E1, ~0.31415927E1) = false < (0.123E1, ~0.27182817E1) = false > (0.123E1, ~0.27182817E1) = true == (0.123E1, ~0.27182817E1) = false ?= (0.123E1, ~0.27182817E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.11754944E~37) = false > (0.123E1, ~0.11754944E~37) = true == (0.123E1, ~0.11754944E~37) = false ?= (0.123E1, ~0.11754944E~37) = false < (0.123E1, ~0.5877472E~38) = false > (0.123E1, ~0.5877472E~38) = true == (0.123E1, ~0.5877472E~38) = false ?= (0.123E1, ~0.5877472E~38) = false < (0.123E1, ~0.1E~44) = false > (0.123E1, ~0.1E~44) = true == (0.123E1, ~0.1E~44) = false ?= (0.123E1, ~0.1E~44) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.34028235E39) = true > (0.123, 0.34028235E39) = false == (0.123, 0.34028235E39) = false ?= (0.123, 0.34028235E39) = false < (0.123, 0.17014117E39) = true > (0.123, 0.17014117E39) = false == (0.123, 0.17014117E39) = false ?= (0.123, 0.17014117E39) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.31415927E1) = true > (0.123, 0.31415927E1) = false == (0.123, 0.31415927E1) = false ?= (0.123, 0.31415927E1) = false < (0.123, 0.27182817E1) = true > (0.123, 0.27182817E1) = false == (0.123, 0.27182817E1) = false ?= (0.123, 0.27182817E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.11754944E~37) = false > (0.123, 0.11754944E~37) = true == (0.123, 0.11754944E~37) = false ?= (0.123, 0.11754944E~37) = false < (0.123, 0.5877472E~38) = false > (0.123, 0.5877472E~38) = true == (0.123, 0.5877472E~38) = false ?= (0.123, 0.5877472E~38) = false < (0.123, 0.1E~44) = false > (0.123, 0.1E~44) = true == (0.123, 0.1E~44) = false ?= (0.123, 0.1E~44) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.34028235E39) = false > (0.123, ~0.34028235E39) = true == (0.123, ~0.34028235E39) = false ?= (0.123, ~0.34028235E39) = false < (0.123, ~0.17014117E39) = false > (0.123, ~0.17014117E39) = true == (0.123, ~0.17014117E39) = false ?= (0.123, ~0.17014117E39) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.31415927E1) = false > (0.123, ~0.31415927E1) = true == (0.123, ~0.31415927E1) = false ?= (0.123, ~0.31415927E1) = false < (0.123, ~0.27182817E1) = false > (0.123, ~0.27182817E1) = true == (0.123, ~0.27182817E1) = false ?= (0.123, ~0.27182817E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.11754944E~37) = false > (0.123, ~0.11754944E~37) = true == (0.123, ~0.11754944E~37) = false ?= (0.123, ~0.11754944E~37) = false < (0.123, ~0.5877472E~38) = false > (0.123, ~0.5877472E~38) = true == (0.123, ~0.5877472E~38) = false ?= (0.123, ~0.5877472E~38) = false < (0.123, ~0.1E~44) = false > (0.123, ~0.1E~44) = true == (0.123, ~0.1E~44) = false ?= (0.123, ~0.1E~44) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.34028235E39) = true > (0.123E~2, 0.34028235E39) = false == (0.123E~2, 0.34028235E39) = false ?= (0.123E~2, 0.34028235E39) = false < (0.123E~2, 0.17014117E39) = true > (0.123E~2, 0.17014117E39) = false == (0.123E~2, 0.17014117E39) = false ?= (0.123E~2, 0.17014117E39) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.31415927E1) = true > (0.123E~2, 0.31415927E1) = false == (0.123E~2, 0.31415927E1) = false ?= (0.123E~2, 0.31415927E1) = false < (0.123E~2, 0.27182817E1) = true > (0.123E~2, 0.27182817E1) = false == (0.123E~2, 0.27182817E1) = false ?= (0.123E~2, 0.27182817E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.11754944E~37) = false > (0.123E~2, 0.11754944E~37) = true == (0.123E~2, 0.11754944E~37) = false ?= (0.123E~2, 0.11754944E~37) = false < (0.123E~2, 0.5877472E~38) = false > (0.123E~2, 0.5877472E~38) = true == (0.123E~2, 0.5877472E~38) = false ?= (0.123E~2, 0.5877472E~38) = false < (0.123E~2, 0.1E~44) = false > (0.123E~2, 0.1E~44) = true == (0.123E~2, 0.1E~44) = false ?= (0.123E~2, 0.1E~44) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.34028235E39) = false > (0.123E~2, ~0.34028235E39) = true == (0.123E~2, ~0.34028235E39) = false ?= (0.123E~2, ~0.34028235E39) = false < (0.123E~2, ~0.17014117E39) = false > (0.123E~2, ~0.17014117E39) = true == (0.123E~2, ~0.17014117E39) = false ?= (0.123E~2, ~0.17014117E39) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.31415927E1) = false > (0.123E~2, ~0.31415927E1) = true == (0.123E~2, ~0.31415927E1) = false ?= (0.123E~2, ~0.31415927E1) = false < (0.123E~2, ~0.27182817E1) = false > (0.123E~2, ~0.27182817E1) = true == (0.123E~2, ~0.27182817E1) = false ?= (0.123E~2, ~0.27182817E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.11754944E~37) = false > (0.123E~2, ~0.11754944E~37) = true == (0.123E~2, ~0.11754944E~37) = false ?= (0.123E~2, ~0.11754944E~37) = false < (0.123E~2, ~0.5877472E~38) = false > (0.123E~2, ~0.5877472E~38) = true == (0.123E~2, ~0.5877472E~38) = false ?= (0.123E~2, ~0.5877472E~38) = false < (0.123E~2, ~0.1E~44) = false > (0.123E~2, ~0.1E~44) = true == (0.123E~2, ~0.1E~44) = false ?= (0.123E~2, ~0.1E~44) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.11754944E~37, 0.34028235E39) = true > (0.11754944E~37, 0.34028235E39) = false == (0.11754944E~37, 0.34028235E39) = false ?= (0.11754944E~37, 0.34028235E39) = false < (0.11754944E~37, 0.17014117E39) = true > (0.11754944E~37, 0.17014117E39) = false == (0.11754944E~37, 0.17014117E39) = false ?= (0.11754944E~37, 0.17014117E39) = false < (0.11754944E~37, 0.123E4) = true > (0.11754944E~37, 0.123E4) = false == (0.11754944E~37, 0.123E4) = false ?= (0.11754944E~37, 0.123E4) = false < (0.11754944E~37, 0.123E2) = true > (0.11754944E~37, 0.123E2) = false == (0.11754944E~37, 0.123E2) = false ?= (0.11754944E~37, 0.123E2) = false < (0.11754944E~37, 0.31415927E1) = true > (0.11754944E~37, 0.31415927E1) = false == (0.11754944E~37, 0.31415927E1) = false ?= (0.11754944E~37, 0.31415927E1) = false < (0.11754944E~37, 0.27182817E1) = true > (0.11754944E~37, 0.27182817E1) = false == (0.11754944E~37, 0.27182817E1) = false ?= (0.11754944E~37, 0.27182817E1) = false < (0.11754944E~37, 0.123E1) = true > (0.11754944E~37, 0.123E1) = false == (0.11754944E~37, 0.123E1) = false ?= (0.11754944E~37, 0.123E1) = false < (0.11754944E~37, 0.123) = true > (0.11754944E~37, 0.123) = false == (0.11754944E~37, 0.123) = false ?= (0.11754944E~37, 0.123) = false < (0.11754944E~37, 0.123E~2) = true > (0.11754944E~37, 0.123E~2) = false == (0.11754944E~37, 0.123E~2) = false ?= (0.11754944E~37, 0.123E~2) = false < (0.11754944E~37, 0.11754944E~37) = false > (0.11754944E~37, 0.11754944E~37) = false == (0.11754944E~37, 0.11754944E~37) = true ?= (0.11754944E~37, 0.11754944E~37) = true < (0.11754944E~37, 0.5877472E~38) = false > (0.11754944E~37, 0.5877472E~38) = true == (0.11754944E~37, 0.5877472E~38) = false ?= (0.11754944E~37, 0.5877472E~38) = false < (0.11754944E~37, 0.1E~44) = false > (0.11754944E~37, 0.1E~44) = true == (0.11754944E~37, 0.1E~44) = false ?= (0.11754944E~37, 0.1E~44) = false < (0.11754944E~37, 0.0) = false > (0.11754944E~37, 0.0) = true == (0.11754944E~37, 0.0) = false ?= (0.11754944E~37, 0.0) = false < (0.11754944E~37, ~0.34028235E39) = false > (0.11754944E~37, ~0.34028235E39) = true == (0.11754944E~37, ~0.34028235E39) = false ?= (0.11754944E~37, ~0.34028235E39) = false < (0.11754944E~37, ~0.17014117E39) = false > (0.11754944E~37, ~0.17014117E39) = true == (0.11754944E~37, ~0.17014117E39) = false ?= (0.11754944E~37, ~0.17014117E39) = false < (0.11754944E~37, ~0.123E4) = false > (0.11754944E~37, ~0.123E4) = true == (0.11754944E~37, ~0.123E4) = false ?= (0.11754944E~37, ~0.123E4) = false < (0.11754944E~37, ~0.123E2) = false > (0.11754944E~37, ~0.123E2) = true == (0.11754944E~37, ~0.123E2) = false ?= (0.11754944E~37, ~0.123E2) = false < (0.11754944E~37, ~0.31415927E1) = false > (0.11754944E~37, ~0.31415927E1) = true == (0.11754944E~37, ~0.31415927E1) = false ?= (0.11754944E~37, ~0.31415927E1) = false < (0.11754944E~37, ~0.27182817E1) = false > (0.11754944E~37, ~0.27182817E1) = true == (0.11754944E~37, ~0.27182817E1) = false ?= (0.11754944E~37, ~0.27182817E1) = false < (0.11754944E~37, ~0.123E1) = false > (0.11754944E~37, ~0.123E1) = true == (0.11754944E~37, ~0.123E1) = false ?= (0.11754944E~37, ~0.123E1) = false < (0.11754944E~37, ~0.123) = false > (0.11754944E~37, ~0.123) = true == (0.11754944E~37, ~0.123) = false ?= (0.11754944E~37, ~0.123) = false < (0.11754944E~37, ~0.123E~2) = false > (0.11754944E~37, ~0.123E~2) = true == (0.11754944E~37, ~0.123E~2) = false ?= (0.11754944E~37, ~0.123E~2) = false < (0.11754944E~37, ~0.11754944E~37) = false > (0.11754944E~37, ~0.11754944E~37) = true == (0.11754944E~37, ~0.11754944E~37) = false ?= (0.11754944E~37, ~0.11754944E~37) = false < (0.11754944E~37, ~0.5877472E~38) = false > (0.11754944E~37, ~0.5877472E~38) = true == (0.11754944E~37, ~0.5877472E~38) = false ?= (0.11754944E~37, ~0.5877472E~38) = false < (0.11754944E~37, ~0.1E~44) = false > (0.11754944E~37, ~0.1E~44) = true == (0.11754944E~37, ~0.1E~44) = false ?= (0.11754944E~37, ~0.1E~44) = false < (0.11754944E~37, ~0.0) = false > (0.11754944E~37, ~0.0) = true == (0.11754944E~37, ~0.0) = false ?= (0.11754944E~37, ~0.0) = false < (0.5877472E~38, 0.34028235E39) = true > (0.5877472E~38, 0.34028235E39) = false == (0.5877472E~38, 0.34028235E39) = false ?= (0.5877472E~38, 0.34028235E39) = false < (0.5877472E~38, 0.17014117E39) = true > (0.5877472E~38, 0.17014117E39) = false == (0.5877472E~38, 0.17014117E39) = false ?= (0.5877472E~38, 0.17014117E39) = false < (0.5877472E~38, 0.123E4) = true > (0.5877472E~38, 0.123E4) = false == (0.5877472E~38, 0.123E4) = false ?= (0.5877472E~38, 0.123E4) = false < (0.5877472E~38, 0.123E2) = true > (0.5877472E~38, 0.123E2) = false == (0.5877472E~38, 0.123E2) = false ?= (0.5877472E~38, 0.123E2) = false < (0.5877472E~38, 0.31415927E1) = true > (0.5877472E~38, 0.31415927E1) = false == (0.5877472E~38, 0.31415927E1) = false ?= (0.5877472E~38, 0.31415927E1) = false < (0.5877472E~38, 0.27182817E1) = true > (0.5877472E~38, 0.27182817E1) = false == (0.5877472E~38, 0.27182817E1) = false ?= (0.5877472E~38, 0.27182817E1) = false < (0.5877472E~38, 0.123E1) = true > (0.5877472E~38, 0.123E1) = false == (0.5877472E~38, 0.123E1) = false ?= (0.5877472E~38, 0.123E1) = false < (0.5877472E~38, 0.123) = true > (0.5877472E~38, 0.123) = false == (0.5877472E~38, 0.123) = false ?= (0.5877472E~38, 0.123) = false < (0.5877472E~38, 0.123E~2) = true > (0.5877472E~38, 0.123E~2) = false == (0.5877472E~38, 0.123E~2) = false ?= (0.5877472E~38, 0.123E~2) = false < (0.5877472E~38, 0.11754944E~37) = true > (0.5877472E~38, 0.11754944E~37) = false == (0.5877472E~38, 0.11754944E~37) = false ?= (0.5877472E~38, 0.11754944E~37) = false < (0.5877472E~38, 0.5877472E~38) = false > (0.5877472E~38, 0.5877472E~38) = false == (0.5877472E~38, 0.5877472E~38) = true ?= (0.5877472E~38, 0.5877472E~38) = true < (0.5877472E~38, 0.1E~44) = false > (0.5877472E~38, 0.1E~44) = true == (0.5877472E~38, 0.1E~44) = false ?= (0.5877472E~38, 0.1E~44) = false < (0.5877472E~38, 0.0) = false > (0.5877472E~38, 0.0) = true == (0.5877472E~38, 0.0) = false ?= (0.5877472E~38, 0.0) = false < (0.5877472E~38, ~0.34028235E39) = false > (0.5877472E~38, ~0.34028235E39) = true == (0.5877472E~38, ~0.34028235E39) = false ?= (0.5877472E~38, ~0.34028235E39) = false < (0.5877472E~38, ~0.17014117E39) = false > (0.5877472E~38, ~0.17014117E39) = true == (0.5877472E~38, ~0.17014117E39) = false ?= (0.5877472E~38, ~0.17014117E39) = false < (0.5877472E~38, ~0.123E4) = false > (0.5877472E~38, ~0.123E4) = true == (0.5877472E~38, ~0.123E4) = false ?= (0.5877472E~38, ~0.123E4) = false < (0.5877472E~38, ~0.123E2) = false > (0.5877472E~38, ~0.123E2) = true == (0.5877472E~38, ~0.123E2) = false ?= (0.5877472E~38, ~0.123E2) = false < (0.5877472E~38, ~0.31415927E1) = false > (0.5877472E~38, ~0.31415927E1) = true == (0.5877472E~38, ~0.31415927E1) = false ?= (0.5877472E~38, ~0.31415927E1) = false < (0.5877472E~38, ~0.27182817E1) = false > (0.5877472E~38, ~0.27182817E1) = true == (0.5877472E~38, ~0.27182817E1) = false ?= (0.5877472E~38, ~0.27182817E1) = false < (0.5877472E~38, ~0.123E1) = false > (0.5877472E~38, ~0.123E1) = true == (0.5877472E~38, ~0.123E1) = false ?= (0.5877472E~38, ~0.123E1) = false < (0.5877472E~38, ~0.123) = false > (0.5877472E~38, ~0.123) = true == (0.5877472E~38, ~0.123) = false ?= (0.5877472E~38, ~0.123) = false < (0.5877472E~38, ~0.123E~2) = false > (0.5877472E~38, ~0.123E~2) = true == (0.5877472E~38, ~0.123E~2) = false ?= (0.5877472E~38, ~0.123E~2) = false < (0.5877472E~38, ~0.11754944E~37) = false > (0.5877472E~38, ~0.11754944E~37) = true == (0.5877472E~38, ~0.11754944E~37) = false ?= (0.5877472E~38, ~0.11754944E~37) = false < (0.5877472E~38, ~0.5877472E~38) = false > (0.5877472E~38, ~0.5877472E~38) = true == (0.5877472E~38, ~0.5877472E~38) = false ?= (0.5877472E~38, ~0.5877472E~38) = false < (0.5877472E~38, ~0.1E~44) = false > (0.5877472E~38, ~0.1E~44) = true == (0.5877472E~38, ~0.1E~44) = false ?= (0.5877472E~38, ~0.1E~44) = false < (0.5877472E~38, ~0.0) = false > (0.5877472E~38, ~0.0) = true == (0.5877472E~38, ~0.0) = false ?= (0.5877472E~38, ~0.0) = false < (0.1E~44, 0.34028235E39) = true > (0.1E~44, 0.34028235E39) = false == (0.1E~44, 0.34028235E39) = false ?= (0.1E~44, 0.34028235E39) = false < (0.1E~44, 0.17014117E39) = true > (0.1E~44, 0.17014117E39) = false == (0.1E~44, 0.17014117E39) = false ?= (0.1E~44, 0.17014117E39) = false < (0.1E~44, 0.123E4) = true > (0.1E~44, 0.123E4) = false == (0.1E~44, 0.123E4) = false ?= (0.1E~44, 0.123E4) = false < (0.1E~44, 0.123E2) = true > (0.1E~44, 0.123E2) = false == (0.1E~44, 0.123E2) = false ?= (0.1E~44, 0.123E2) = false < (0.1E~44, 0.31415927E1) = true > (0.1E~44, 0.31415927E1) = false == (0.1E~44, 0.31415927E1) = false ?= (0.1E~44, 0.31415927E1) = false < (0.1E~44, 0.27182817E1) = true > (0.1E~44, 0.27182817E1) = false == (0.1E~44, 0.27182817E1) = false ?= (0.1E~44, 0.27182817E1) = false < (0.1E~44, 0.123E1) = true > (0.1E~44, 0.123E1) = false == (0.1E~44, 0.123E1) = false ?= (0.1E~44, 0.123E1) = false < (0.1E~44, 0.123) = true > (0.1E~44, 0.123) = false == (0.1E~44, 0.123) = false ?= (0.1E~44, 0.123) = false < (0.1E~44, 0.123E~2) = true > (0.1E~44, 0.123E~2) = false == (0.1E~44, 0.123E~2) = false ?= (0.1E~44, 0.123E~2) = false < (0.1E~44, 0.11754944E~37) = true > (0.1E~44, 0.11754944E~37) = false == (0.1E~44, 0.11754944E~37) = false ?= (0.1E~44, 0.11754944E~37) = false < (0.1E~44, 0.5877472E~38) = true > (0.1E~44, 0.5877472E~38) = false == (0.1E~44, 0.5877472E~38) = false ?= (0.1E~44, 0.5877472E~38) = false < (0.1E~44, 0.1E~44) = false > (0.1E~44, 0.1E~44) = false == (0.1E~44, 0.1E~44) = true ?= (0.1E~44, 0.1E~44) = true < (0.1E~44, 0.0) = false > (0.1E~44, 0.0) = true == (0.1E~44, 0.0) = false ?= (0.1E~44, 0.0) = false < (0.1E~44, ~0.34028235E39) = false > (0.1E~44, ~0.34028235E39) = true == (0.1E~44, ~0.34028235E39) = false ?= (0.1E~44, ~0.34028235E39) = false < (0.1E~44, ~0.17014117E39) = false > (0.1E~44, ~0.17014117E39) = true == (0.1E~44, ~0.17014117E39) = false ?= (0.1E~44, ~0.17014117E39) = false < (0.1E~44, ~0.123E4) = false > (0.1E~44, ~0.123E4) = true == (0.1E~44, ~0.123E4) = false ?= (0.1E~44, ~0.123E4) = false < (0.1E~44, ~0.123E2) = false > (0.1E~44, ~0.123E2) = true == (0.1E~44, ~0.123E2) = false ?= (0.1E~44, ~0.123E2) = false < (0.1E~44, ~0.31415927E1) = false > (0.1E~44, ~0.31415927E1) = true == (0.1E~44, ~0.31415927E1) = false ?= (0.1E~44, ~0.31415927E1) = false < (0.1E~44, ~0.27182817E1) = false > (0.1E~44, ~0.27182817E1) = true == (0.1E~44, ~0.27182817E1) = false ?= (0.1E~44, ~0.27182817E1) = false < (0.1E~44, ~0.123E1) = false > (0.1E~44, ~0.123E1) = true == (0.1E~44, ~0.123E1) = false ?= (0.1E~44, ~0.123E1) = false < (0.1E~44, ~0.123) = false > (0.1E~44, ~0.123) = true == (0.1E~44, ~0.123) = false ?= (0.1E~44, ~0.123) = false < (0.1E~44, ~0.123E~2) = false > (0.1E~44, ~0.123E~2) = true == (0.1E~44, ~0.123E~2) = false ?= (0.1E~44, ~0.123E~2) = false < (0.1E~44, ~0.11754944E~37) = false > (0.1E~44, ~0.11754944E~37) = true == (0.1E~44, ~0.11754944E~37) = false ?= (0.1E~44, ~0.11754944E~37) = false < (0.1E~44, ~0.5877472E~38) = false > (0.1E~44, ~0.5877472E~38) = true == (0.1E~44, ~0.5877472E~38) = false ?= (0.1E~44, ~0.5877472E~38) = false < (0.1E~44, ~0.1E~44) = false > (0.1E~44, ~0.1E~44) = true == (0.1E~44, ~0.1E~44) = false ?= (0.1E~44, ~0.1E~44) = false < (0.1E~44, ~0.0) = false > (0.1E~44, ~0.0) = true == (0.1E~44, ~0.0) = false ?= (0.1E~44, ~0.0) = false < (0.0, 0.34028235E39) = true > (0.0, 0.34028235E39) = false == (0.0, 0.34028235E39) = false ?= (0.0, 0.34028235E39) = false < (0.0, 0.17014117E39) = true > (0.0, 0.17014117E39) = false == (0.0, 0.17014117E39) = false ?= (0.0, 0.17014117E39) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.31415927E1) = true > (0.0, 0.31415927E1) = false == (0.0, 0.31415927E1) = false ?= (0.0, 0.31415927E1) = false < (0.0, 0.27182817E1) = true > (0.0, 0.27182817E1) = false == (0.0, 0.27182817E1) = false ?= (0.0, 0.27182817E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.11754944E~37) = true > (0.0, 0.11754944E~37) = false == (0.0, 0.11754944E~37) = false ?= (0.0, 0.11754944E~37) = false < (0.0, 0.5877472E~38) = true > (0.0, 0.5877472E~38) = false == (0.0, 0.5877472E~38) = false ?= (0.0, 0.5877472E~38) = false < (0.0, 0.1E~44) = true > (0.0, 0.1E~44) = false == (0.0, 0.1E~44) = false ?= (0.0, 0.1E~44) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.34028235E39) = false > (0.0, ~0.34028235E39) = true == (0.0, ~0.34028235E39) = false ?= (0.0, ~0.34028235E39) = false < (0.0, ~0.17014117E39) = false > (0.0, ~0.17014117E39) = true == (0.0, ~0.17014117E39) = false ?= (0.0, ~0.17014117E39) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.31415927E1) = false > (0.0, ~0.31415927E1) = true == (0.0, ~0.31415927E1) = false ?= (0.0, ~0.31415927E1) = false < (0.0, ~0.27182817E1) = false > (0.0, ~0.27182817E1) = true == (0.0, ~0.27182817E1) = false ?= (0.0, ~0.27182817E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.11754944E~37) = false > (0.0, ~0.11754944E~37) = true == (0.0, ~0.11754944E~37) = false ?= (0.0, ~0.11754944E~37) = false < (0.0, ~0.5877472E~38) = false > (0.0, ~0.5877472E~38) = true == (0.0, ~0.5877472E~38) = false ?= (0.0, ~0.5877472E~38) = false < (0.0, ~0.1E~44) = false > (0.0, ~0.1E~44) = true == (0.0, ~0.1E~44) = false ?= (0.0, ~0.1E~44) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.34028235E39, 0.34028235E39) = true > (~0.34028235E39, 0.34028235E39) = false == (~0.34028235E39, 0.34028235E39) = false ?= (~0.34028235E39, 0.34028235E39) = false < (~0.34028235E39, 0.17014117E39) = true > (~0.34028235E39, 0.17014117E39) = false == (~0.34028235E39, 0.17014117E39) = false ?= (~0.34028235E39, 0.17014117E39) = false < (~0.34028235E39, 0.123E4) = true > (~0.34028235E39, 0.123E4) = false == (~0.34028235E39, 0.123E4) = false ?= (~0.34028235E39, 0.123E4) = false < (~0.34028235E39, 0.123E2) = true > (~0.34028235E39, 0.123E2) = false == (~0.34028235E39, 0.123E2) = false ?= (~0.34028235E39, 0.123E2) = false < (~0.34028235E39, 0.31415927E1) = true > (~0.34028235E39, 0.31415927E1) = false == (~0.34028235E39, 0.31415927E1) = false ?= (~0.34028235E39, 0.31415927E1) = false < (~0.34028235E39, 0.27182817E1) = true > (~0.34028235E39, 0.27182817E1) = false == (~0.34028235E39, 0.27182817E1) = false ?= (~0.34028235E39, 0.27182817E1) = false < (~0.34028235E39, 0.123E1) = true > (~0.34028235E39, 0.123E1) = false == (~0.34028235E39, 0.123E1) = false ?= (~0.34028235E39, 0.123E1) = false < (~0.34028235E39, 0.123) = true > (~0.34028235E39, 0.123) = false == (~0.34028235E39, 0.123) = false ?= (~0.34028235E39, 0.123) = false < (~0.34028235E39, 0.123E~2) = true > (~0.34028235E39, 0.123E~2) = false == (~0.34028235E39, 0.123E~2) = false ?= (~0.34028235E39, 0.123E~2) = false < (~0.34028235E39, 0.11754944E~37) = true > (~0.34028235E39, 0.11754944E~37) = false == (~0.34028235E39, 0.11754944E~37) = false ?= (~0.34028235E39, 0.11754944E~37) = false < (~0.34028235E39, 0.5877472E~38) = true > (~0.34028235E39, 0.5877472E~38) = false == (~0.34028235E39, 0.5877472E~38) = false ?= (~0.34028235E39, 0.5877472E~38) = false < (~0.34028235E39, 0.1E~44) = true > (~0.34028235E39, 0.1E~44) = false == (~0.34028235E39, 0.1E~44) = false ?= (~0.34028235E39, 0.1E~44) = false < (~0.34028235E39, 0.0) = true > (~0.34028235E39, 0.0) = false == (~0.34028235E39, 0.0) = false ?= (~0.34028235E39, 0.0) = false < (~0.34028235E39, ~0.34028235E39) = false > (~0.34028235E39, ~0.34028235E39) = false == (~0.34028235E39, ~0.34028235E39) = true ?= (~0.34028235E39, ~0.34028235E39) = true < (~0.34028235E39, ~0.17014117E39) = true > (~0.34028235E39, ~0.17014117E39) = false == (~0.34028235E39, ~0.17014117E39) = false ?= (~0.34028235E39, ~0.17014117E39) = false < (~0.34028235E39, ~0.123E4) = true > (~0.34028235E39, ~0.123E4) = false == (~0.34028235E39, ~0.123E4) = false ?= (~0.34028235E39, ~0.123E4) = false < (~0.34028235E39, ~0.123E2) = true > (~0.34028235E39, ~0.123E2) = false == (~0.34028235E39, ~0.123E2) = false ?= (~0.34028235E39, ~0.123E2) = false < (~0.34028235E39, ~0.31415927E1) = true > (~0.34028235E39, ~0.31415927E1) = false == (~0.34028235E39, ~0.31415927E1) = false ?= (~0.34028235E39, ~0.31415927E1) = false < (~0.34028235E39, ~0.27182817E1) = true > (~0.34028235E39, ~0.27182817E1) = false == (~0.34028235E39, ~0.27182817E1) = false ?= (~0.34028235E39, ~0.27182817E1) = false < (~0.34028235E39, ~0.123E1) = true > (~0.34028235E39, ~0.123E1) = false == (~0.34028235E39, ~0.123E1) = false ?= (~0.34028235E39, ~0.123E1) = false < (~0.34028235E39, ~0.123) = true > (~0.34028235E39, ~0.123) = false == (~0.34028235E39, ~0.123) = false ?= (~0.34028235E39, ~0.123) = false < (~0.34028235E39, ~0.123E~2) = true > (~0.34028235E39, ~0.123E~2) = false == (~0.34028235E39, ~0.123E~2) = false ?= (~0.34028235E39, ~0.123E~2) = false < (~0.34028235E39, ~0.11754944E~37) = true > (~0.34028235E39, ~0.11754944E~37) = false == (~0.34028235E39, ~0.11754944E~37) = false ?= (~0.34028235E39, ~0.11754944E~37) = false < (~0.34028235E39, ~0.5877472E~38) = true > (~0.34028235E39, ~0.5877472E~38) = false == (~0.34028235E39, ~0.5877472E~38) = false ?= (~0.34028235E39, ~0.5877472E~38) = false < (~0.34028235E39, ~0.1E~44) = true > (~0.34028235E39, ~0.1E~44) = false == (~0.34028235E39, ~0.1E~44) = false ?= (~0.34028235E39, ~0.1E~44) = false < (~0.34028235E39, ~0.0) = true > (~0.34028235E39, ~0.0) = false == (~0.34028235E39, ~0.0) = false ?= (~0.34028235E39, ~0.0) = false < (~0.17014117E39, 0.34028235E39) = true > (~0.17014117E39, 0.34028235E39) = false == (~0.17014117E39, 0.34028235E39) = false ?= (~0.17014117E39, 0.34028235E39) = false < (~0.17014117E39, 0.17014117E39) = true > (~0.17014117E39, 0.17014117E39) = false == (~0.17014117E39, 0.17014117E39) = false ?= (~0.17014117E39, 0.17014117E39) = false < (~0.17014117E39, 0.123E4) = true > (~0.17014117E39, 0.123E4) = false == (~0.17014117E39, 0.123E4) = false ?= (~0.17014117E39, 0.123E4) = false < (~0.17014117E39, 0.123E2) = true > (~0.17014117E39, 0.123E2) = false == (~0.17014117E39, 0.123E2) = false ?= (~0.17014117E39, 0.123E2) = false < (~0.17014117E39, 0.31415927E1) = true > (~0.17014117E39, 0.31415927E1) = false == (~0.17014117E39, 0.31415927E1) = false ?= (~0.17014117E39, 0.31415927E1) = false < (~0.17014117E39, 0.27182817E1) = true > (~0.17014117E39, 0.27182817E1) = false == (~0.17014117E39, 0.27182817E1) = false ?= (~0.17014117E39, 0.27182817E1) = false < (~0.17014117E39, 0.123E1) = true > (~0.17014117E39, 0.123E1) = false == (~0.17014117E39, 0.123E1) = false ?= (~0.17014117E39, 0.123E1) = false < (~0.17014117E39, 0.123) = true > (~0.17014117E39, 0.123) = false == (~0.17014117E39, 0.123) = false ?= (~0.17014117E39, 0.123) = false < (~0.17014117E39, 0.123E~2) = true > (~0.17014117E39, 0.123E~2) = false == (~0.17014117E39, 0.123E~2) = false ?= (~0.17014117E39, 0.123E~2) = false < (~0.17014117E39, 0.11754944E~37) = true > (~0.17014117E39, 0.11754944E~37) = false == (~0.17014117E39, 0.11754944E~37) = false ?= (~0.17014117E39, 0.11754944E~37) = false < (~0.17014117E39, 0.5877472E~38) = true > (~0.17014117E39, 0.5877472E~38) = false == (~0.17014117E39, 0.5877472E~38) = false ?= (~0.17014117E39, 0.5877472E~38) = false < (~0.17014117E39, 0.1E~44) = true > (~0.17014117E39, 0.1E~44) = false == (~0.17014117E39, 0.1E~44) = false ?= (~0.17014117E39, 0.1E~44) = false < (~0.17014117E39, 0.0) = true > (~0.17014117E39, 0.0) = false == (~0.17014117E39, 0.0) = false ?= (~0.17014117E39, 0.0) = false < (~0.17014117E39, ~0.34028235E39) = false > (~0.17014117E39, ~0.34028235E39) = true == (~0.17014117E39, ~0.34028235E39) = false ?= (~0.17014117E39, ~0.34028235E39) = false < (~0.17014117E39, ~0.17014117E39) = false > (~0.17014117E39, ~0.17014117E39) = false == (~0.17014117E39, ~0.17014117E39) = true ?= (~0.17014117E39, ~0.17014117E39) = true < (~0.17014117E39, ~0.123E4) = true > (~0.17014117E39, ~0.123E4) = false == (~0.17014117E39, ~0.123E4) = false ?= (~0.17014117E39, ~0.123E4) = false < (~0.17014117E39, ~0.123E2) = true > (~0.17014117E39, ~0.123E2) = false == (~0.17014117E39, ~0.123E2) = false ?= (~0.17014117E39, ~0.123E2) = false < (~0.17014117E39, ~0.31415927E1) = true > (~0.17014117E39, ~0.31415927E1) = false == (~0.17014117E39, ~0.31415927E1) = false ?= (~0.17014117E39, ~0.31415927E1) = false < (~0.17014117E39, ~0.27182817E1) = true > (~0.17014117E39, ~0.27182817E1) = false == (~0.17014117E39, ~0.27182817E1) = false ?= (~0.17014117E39, ~0.27182817E1) = false < (~0.17014117E39, ~0.123E1) = true > (~0.17014117E39, ~0.123E1) = false == (~0.17014117E39, ~0.123E1) = false ?= (~0.17014117E39, ~0.123E1) = false < (~0.17014117E39, ~0.123) = true > (~0.17014117E39, ~0.123) = false == (~0.17014117E39, ~0.123) = false ?= (~0.17014117E39, ~0.123) = false < (~0.17014117E39, ~0.123E~2) = true > (~0.17014117E39, ~0.123E~2) = false == (~0.17014117E39, ~0.123E~2) = false ?= (~0.17014117E39, ~0.123E~2) = false < (~0.17014117E39, ~0.11754944E~37) = true > (~0.17014117E39, ~0.11754944E~37) = false == (~0.17014117E39, ~0.11754944E~37) = false ?= (~0.17014117E39, ~0.11754944E~37) = false < (~0.17014117E39, ~0.5877472E~38) = true > (~0.17014117E39, ~0.5877472E~38) = false == (~0.17014117E39, ~0.5877472E~38) = false ?= (~0.17014117E39, ~0.5877472E~38) = false < (~0.17014117E39, ~0.1E~44) = true > (~0.17014117E39, ~0.1E~44) = false == (~0.17014117E39, ~0.1E~44) = false ?= (~0.17014117E39, ~0.1E~44) = false < (~0.17014117E39, ~0.0) = true > (~0.17014117E39, ~0.0) = false == (~0.17014117E39, ~0.0) = false ?= (~0.17014117E39, ~0.0) = false < (~0.123E4, 0.34028235E39) = true > (~0.123E4, 0.34028235E39) = false == (~0.123E4, 0.34028235E39) = false ?= (~0.123E4, 0.34028235E39) = false < (~0.123E4, 0.17014117E39) = true > (~0.123E4, 0.17014117E39) = false == (~0.123E4, 0.17014117E39) = false ?= (~0.123E4, 0.17014117E39) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.31415927E1) = true > (~0.123E4, 0.31415927E1) = false == (~0.123E4, 0.31415927E1) = false ?= (~0.123E4, 0.31415927E1) = false < (~0.123E4, 0.27182817E1) = true > (~0.123E4, 0.27182817E1) = false == (~0.123E4, 0.27182817E1) = false ?= (~0.123E4, 0.27182817E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.11754944E~37) = true > (~0.123E4, 0.11754944E~37) = false == (~0.123E4, 0.11754944E~37) = false ?= (~0.123E4, 0.11754944E~37) = false < (~0.123E4, 0.5877472E~38) = true > (~0.123E4, 0.5877472E~38) = false == (~0.123E4, 0.5877472E~38) = false ?= (~0.123E4, 0.5877472E~38) = false < (~0.123E4, 0.1E~44) = true > (~0.123E4, 0.1E~44) = false == (~0.123E4, 0.1E~44) = false ?= (~0.123E4, 0.1E~44) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.34028235E39) = false > (~0.123E4, ~0.34028235E39) = true == (~0.123E4, ~0.34028235E39) = false ?= (~0.123E4, ~0.34028235E39) = false < (~0.123E4, ~0.17014117E39) = false > (~0.123E4, ~0.17014117E39) = true == (~0.123E4, ~0.17014117E39) = false ?= (~0.123E4, ~0.17014117E39) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.31415927E1) = true > (~0.123E4, ~0.31415927E1) = false == (~0.123E4, ~0.31415927E1) = false ?= (~0.123E4, ~0.31415927E1) = false < (~0.123E4, ~0.27182817E1) = true > (~0.123E4, ~0.27182817E1) = false == (~0.123E4, ~0.27182817E1) = false ?= (~0.123E4, ~0.27182817E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.11754944E~37) = true > (~0.123E4, ~0.11754944E~37) = false == (~0.123E4, ~0.11754944E~37) = false ?= (~0.123E4, ~0.11754944E~37) = false < (~0.123E4, ~0.5877472E~38) = true > (~0.123E4, ~0.5877472E~38) = false == (~0.123E4, ~0.5877472E~38) = false ?= (~0.123E4, ~0.5877472E~38) = false < (~0.123E4, ~0.1E~44) = true > (~0.123E4, ~0.1E~44) = false == (~0.123E4, ~0.1E~44) = false ?= (~0.123E4, ~0.1E~44) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.34028235E39) = true > (~0.123E2, 0.34028235E39) = false == (~0.123E2, 0.34028235E39) = false ?= (~0.123E2, 0.34028235E39) = false < (~0.123E2, 0.17014117E39) = true > (~0.123E2, 0.17014117E39) = false == (~0.123E2, 0.17014117E39) = false ?= (~0.123E2, 0.17014117E39) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.31415927E1) = true > (~0.123E2, 0.31415927E1) = false == (~0.123E2, 0.31415927E1) = false ?= (~0.123E2, 0.31415927E1) = false < (~0.123E2, 0.27182817E1) = true > (~0.123E2, 0.27182817E1) = false == (~0.123E2, 0.27182817E1) = false ?= (~0.123E2, 0.27182817E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.11754944E~37) = true > (~0.123E2, 0.11754944E~37) = false == (~0.123E2, 0.11754944E~37) = false ?= (~0.123E2, 0.11754944E~37) = false < (~0.123E2, 0.5877472E~38) = true > (~0.123E2, 0.5877472E~38) = false == (~0.123E2, 0.5877472E~38) = false ?= (~0.123E2, 0.5877472E~38) = false < (~0.123E2, 0.1E~44) = true > (~0.123E2, 0.1E~44) = false == (~0.123E2, 0.1E~44) = false ?= (~0.123E2, 0.1E~44) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.34028235E39) = false > (~0.123E2, ~0.34028235E39) = true == (~0.123E2, ~0.34028235E39) = false ?= (~0.123E2, ~0.34028235E39) = false < (~0.123E2, ~0.17014117E39) = false > (~0.123E2, ~0.17014117E39) = true == (~0.123E2, ~0.17014117E39) = false ?= (~0.123E2, ~0.17014117E39) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.31415927E1) = true > (~0.123E2, ~0.31415927E1) = false == (~0.123E2, ~0.31415927E1) = false ?= (~0.123E2, ~0.31415927E1) = false < (~0.123E2, ~0.27182817E1) = true > (~0.123E2, ~0.27182817E1) = false == (~0.123E2, ~0.27182817E1) = false ?= (~0.123E2, ~0.27182817E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.11754944E~37) = true > (~0.123E2, ~0.11754944E~37) = false == (~0.123E2, ~0.11754944E~37) = false ?= (~0.123E2, ~0.11754944E~37) = false < (~0.123E2, ~0.5877472E~38) = true > (~0.123E2, ~0.5877472E~38) = false == (~0.123E2, ~0.5877472E~38) = false ?= (~0.123E2, ~0.5877472E~38) = false < (~0.123E2, ~0.1E~44) = true > (~0.123E2, ~0.1E~44) = false == (~0.123E2, ~0.1E~44) = false ?= (~0.123E2, ~0.1E~44) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.31415927E1, 0.34028235E39) = true > (~0.31415927E1, 0.34028235E39) = false == (~0.31415927E1, 0.34028235E39) = false ?= (~0.31415927E1, 0.34028235E39) = false < (~0.31415927E1, 0.17014117E39) = true > (~0.31415927E1, 0.17014117E39) = false == (~0.31415927E1, 0.17014117E39) = false ?= (~0.31415927E1, 0.17014117E39) = false < (~0.31415927E1, 0.123E4) = true > (~0.31415927E1, 0.123E4) = false == (~0.31415927E1, 0.123E4) = false ?= (~0.31415927E1, 0.123E4) = false < (~0.31415927E1, 0.123E2) = true > (~0.31415927E1, 0.123E2) = false == (~0.31415927E1, 0.123E2) = false ?= (~0.31415927E1, 0.123E2) = false < (~0.31415927E1, 0.31415927E1) = true > (~0.31415927E1, 0.31415927E1) = false == (~0.31415927E1, 0.31415927E1) = false ?= (~0.31415927E1, 0.31415927E1) = false < (~0.31415927E1, 0.27182817E1) = true > (~0.31415927E1, 0.27182817E1) = false == (~0.31415927E1, 0.27182817E1) = false ?= (~0.31415927E1, 0.27182817E1) = false < (~0.31415927E1, 0.123E1) = true > (~0.31415927E1, 0.123E1) = false == (~0.31415927E1, 0.123E1) = false ?= (~0.31415927E1, 0.123E1) = false < (~0.31415927E1, 0.123) = true > (~0.31415927E1, 0.123) = false == (~0.31415927E1, 0.123) = false ?= (~0.31415927E1, 0.123) = false < (~0.31415927E1, 0.123E~2) = true > (~0.31415927E1, 0.123E~2) = false == (~0.31415927E1, 0.123E~2) = false ?= (~0.31415927E1, 0.123E~2) = false < (~0.31415927E1, 0.11754944E~37) = true > (~0.31415927E1, 0.11754944E~37) = false == (~0.31415927E1, 0.11754944E~37) = false ?= (~0.31415927E1, 0.11754944E~37) = false < (~0.31415927E1, 0.5877472E~38) = true > (~0.31415927E1, 0.5877472E~38) = false == (~0.31415927E1, 0.5877472E~38) = false ?= (~0.31415927E1, 0.5877472E~38) = false < (~0.31415927E1, 0.1E~44) = true > (~0.31415927E1, 0.1E~44) = false == (~0.31415927E1, 0.1E~44) = false ?= (~0.31415927E1, 0.1E~44) = false < (~0.31415927E1, 0.0) = true > (~0.31415927E1, 0.0) = false == (~0.31415927E1, 0.0) = false ?= (~0.31415927E1, 0.0) = false < (~0.31415927E1, ~0.34028235E39) = false > (~0.31415927E1, ~0.34028235E39) = true == (~0.31415927E1, ~0.34028235E39) = false ?= (~0.31415927E1, ~0.34028235E39) = false < (~0.31415927E1, ~0.17014117E39) = false > (~0.31415927E1, ~0.17014117E39) = true == (~0.31415927E1, ~0.17014117E39) = false ?= (~0.31415927E1, ~0.17014117E39) = false < (~0.31415927E1, ~0.123E4) = false > (~0.31415927E1, ~0.123E4) = true == (~0.31415927E1, ~0.123E4) = false ?= (~0.31415927E1, ~0.123E4) = false < (~0.31415927E1, ~0.123E2) = false > (~0.31415927E1, ~0.123E2) = true == (~0.31415927E1, ~0.123E2) = false ?= (~0.31415927E1, ~0.123E2) = false < (~0.31415927E1, ~0.31415927E1) = false > (~0.31415927E1, ~0.31415927E1) = false == (~0.31415927E1, ~0.31415927E1) = true ?= (~0.31415927E1, ~0.31415927E1) = true < (~0.31415927E1, ~0.27182817E1) = true > (~0.31415927E1, ~0.27182817E1) = false == (~0.31415927E1, ~0.27182817E1) = false ?= (~0.31415927E1, ~0.27182817E1) = false < (~0.31415927E1, ~0.123E1) = true > (~0.31415927E1, ~0.123E1) = false == (~0.31415927E1, ~0.123E1) = false ?= (~0.31415927E1, ~0.123E1) = false < (~0.31415927E1, ~0.123) = true > (~0.31415927E1, ~0.123) = false == (~0.31415927E1, ~0.123) = false ?= (~0.31415927E1, ~0.123) = false < (~0.31415927E1, ~0.123E~2) = true > (~0.31415927E1, ~0.123E~2) = false == (~0.31415927E1, ~0.123E~2) = false ?= (~0.31415927E1, ~0.123E~2) = false < (~0.31415927E1, ~0.11754944E~37) = true > (~0.31415927E1, ~0.11754944E~37) = false == (~0.31415927E1, ~0.11754944E~37) = false ?= (~0.31415927E1, ~0.11754944E~37) = false < (~0.31415927E1, ~0.5877472E~38) = true > (~0.31415927E1, ~0.5877472E~38) = false == (~0.31415927E1, ~0.5877472E~38) = false ?= (~0.31415927E1, ~0.5877472E~38) = false < (~0.31415927E1, ~0.1E~44) = true > (~0.31415927E1, ~0.1E~44) = false == (~0.31415927E1, ~0.1E~44) = false ?= (~0.31415927E1, ~0.1E~44) = false < (~0.31415927E1, ~0.0) = true > (~0.31415927E1, ~0.0) = false == (~0.31415927E1, ~0.0) = false ?= (~0.31415927E1, ~0.0) = false < (~0.27182817E1, 0.34028235E39) = true > (~0.27182817E1, 0.34028235E39) = false == (~0.27182817E1, 0.34028235E39) = false ?= (~0.27182817E1, 0.34028235E39) = false < (~0.27182817E1, 0.17014117E39) = true > (~0.27182817E1, 0.17014117E39) = false == (~0.27182817E1, 0.17014117E39) = false ?= (~0.27182817E1, 0.17014117E39) = false < (~0.27182817E1, 0.123E4) = true > (~0.27182817E1, 0.123E4) = false == (~0.27182817E1, 0.123E4) = false ?= (~0.27182817E1, 0.123E4) = false < (~0.27182817E1, 0.123E2) = true > (~0.27182817E1, 0.123E2) = false == (~0.27182817E1, 0.123E2) = false ?= (~0.27182817E1, 0.123E2) = false < (~0.27182817E1, 0.31415927E1) = true > (~0.27182817E1, 0.31415927E1) = false == (~0.27182817E1, 0.31415927E1) = false ?= (~0.27182817E1, 0.31415927E1) = false < (~0.27182817E1, 0.27182817E1) = true > (~0.27182817E1, 0.27182817E1) = false == (~0.27182817E1, 0.27182817E1) = false ?= (~0.27182817E1, 0.27182817E1) = false < (~0.27182817E1, 0.123E1) = true > (~0.27182817E1, 0.123E1) = false == (~0.27182817E1, 0.123E1) = false ?= (~0.27182817E1, 0.123E1) = false < (~0.27182817E1, 0.123) = true > (~0.27182817E1, 0.123) = false == (~0.27182817E1, 0.123) = false ?= (~0.27182817E1, 0.123) = false < (~0.27182817E1, 0.123E~2) = true > (~0.27182817E1, 0.123E~2) = false == (~0.27182817E1, 0.123E~2) = false ?= (~0.27182817E1, 0.123E~2) = false < (~0.27182817E1, 0.11754944E~37) = true > (~0.27182817E1, 0.11754944E~37) = false == (~0.27182817E1, 0.11754944E~37) = false ?= (~0.27182817E1, 0.11754944E~37) = false < (~0.27182817E1, 0.5877472E~38) = true > (~0.27182817E1, 0.5877472E~38) = false == (~0.27182817E1, 0.5877472E~38) = false ?= (~0.27182817E1, 0.5877472E~38) = false < (~0.27182817E1, 0.1E~44) = true > (~0.27182817E1, 0.1E~44) = false == (~0.27182817E1, 0.1E~44) = false ?= (~0.27182817E1, 0.1E~44) = false < (~0.27182817E1, 0.0) = true > (~0.27182817E1, 0.0) = false == (~0.27182817E1, 0.0) = false ?= (~0.27182817E1, 0.0) = false < (~0.27182817E1, ~0.34028235E39) = false > (~0.27182817E1, ~0.34028235E39) = true == (~0.27182817E1, ~0.34028235E39) = false ?= (~0.27182817E1, ~0.34028235E39) = false < (~0.27182817E1, ~0.17014117E39) = false > (~0.27182817E1, ~0.17014117E39) = true == (~0.27182817E1, ~0.17014117E39) = false ?= (~0.27182817E1, ~0.17014117E39) = false < (~0.27182817E1, ~0.123E4) = false > (~0.27182817E1, ~0.123E4) = true == (~0.27182817E1, ~0.123E4) = false ?= (~0.27182817E1, ~0.123E4) = false < (~0.27182817E1, ~0.123E2) = false > (~0.27182817E1, ~0.123E2) = true == (~0.27182817E1, ~0.123E2) = false ?= (~0.27182817E1, ~0.123E2) = false < (~0.27182817E1, ~0.31415927E1) = false > (~0.27182817E1, ~0.31415927E1) = true == (~0.27182817E1, ~0.31415927E1) = false ?= (~0.27182817E1, ~0.31415927E1) = false < (~0.27182817E1, ~0.27182817E1) = false > (~0.27182817E1, ~0.27182817E1) = false == (~0.27182817E1, ~0.27182817E1) = true ?= (~0.27182817E1, ~0.27182817E1) = true < (~0.27182817E1, ~0.123E1) = true > (~0.27182817E1, ~0.123E1) = false == (~0.27182817E1, ~0.123E1) = false ?= (~0.27182817E1, ~0.123E1) = false < (~0.27182817E1, ~0.123) = true > (~0.27182817E1, ~0.123) = false == (~0.27182817E1, ~0.123) = false ?= (~0.27182817E1, ~0.123) = false < (~0.27182817E1, ~0.123E~2) = true > (~0.27182817E1, ~0.123E~2) = false == (~0.27182817E1, ~0.123E~2) = false ?= (~0.27182817E1, ~0.123E~2) = false < (~0.27182817E1, ~0.11754944E~37) = true > (~0.27182817E1, ~0.11754944E~37) = false == (~0.27182817E1, ~0.11754944E~37) = false ?= (~0.27182817E1, ~0.11754944E~37) = false < (~0.27182817E1, ~0.5877472E~38) = true > (~0.27182817E1, ~0.5877472E~38) = false == (~0.27182817E1, ~0.5877472E~38) = false ?= (~0.27182817E1, ~0.5877472E~38) = false < (~0.27182817E1, ~0.1E~44) = true > (~0.27182817E1, ~0.1E~44) = false == (~0.27182817E1, ~0.1E~44) = false ?= (~0.27182817E1, ~0.1E~44) = false < (~0.27182817E1, ~0.0) = true > (~0.27182817E1, ~0.0) = false == (~0.27182817E1, ~0.0) = false ?= (~0.27182817E1, ~0.0) = false < (~0.123E1, 0.34028235E39) = true > (~0.123E1, 0.34028235E39) = false == (~0.123E1, 0.34028235E39) = false ?= (~0.123E1, 0.34028235E39) = false < (~0.123E1, 0.17014117E39) = true > (~0.123E1, 0.17014117E39) = false == (~0.123E1, 0.17014117E39) = false ?= (~0.123E1, 0.17014117E39) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.31415927E1) = true > (~0.123E1, 0.31415927E1) = false == (~0.123E1, 0.31415927E1) = false ?= (~0.123E1, 0.31415927E1) = false < (~0.123E1, 0.27182817E1) = true > (~0.123E1, 0.27182817E1) = false == (~0.123E1, 0.27182817E1) = false ?= (~0.123E1, 0.27182817E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.11754944E~37) = true > (~0.123E1, 0.11754944E~37) = false == (~0.123E1, 0.11754944E~37) = false ?= (~0.123E1, 0.11754944E~37) = false < (~0.123E1, 0.5877472E~38) = true > (~0.123E1, 0.5877472E~38) = false == (~0.123E1, 0.5877472E~38) = false ?= (~0.123E1, 0.5877472E~38) = false < (~0.123E1, 0.1E~44) = true > (~0.123E1, 0.1E~44) = false == (~0.123E1, 0.1E~44) = false ?= (~0.123E1, 0.1E~44) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.34028235E39) = false > (~0.123E1, ~0.34028235E39) = true == (~0.123E1, ~0.34028235E39) = false ?= (~0.123E1, ~0.34028235E39) = false < (~0.123E1, ~0.17014117E39) = false > (~0.123E1, ~0.17014117E39) = true == (~0.123E1, ~0.17014117E39) = false ?= (~0.123E1, ~0.17014117E39) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.31415927E1) = false > (~0.123E1, ~0.31415927E1) = true == (~0.123E1, ~0.31415927E1) = false ?= (~0.123E1, ~0.31415927E1) = false < (~0.123E1, ~0.27182817E1) = false > (~0.123E1, ~0.27182817E1) = true == (~0.123E1, ~0.27182817E1) = false ?= (~0.123E1, ~0.27182817E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.11754944E~37) = true > (~0.123E1, ~0.11754944E~37) = false == (~0.123E1, ~0.11754944E~37) = false ?= (~0.123E1, ~0.11754944E~37) = false < (~0.123E1, ~0.5877472E~38) = true > (~0.123E1, ~0.5877472E~38) = false == (~0.123E1, ~0.5877472E~38) = false ?= (~0.123E1, ~0.5877472E~38) = false < (~0.123E1, ~0.1E~44) = true > (~0.123E1, ~0.1E~44) = false == (~0.123E1, ~0.1E~44) = false ?= (~0.123E1, ~0.1E~44) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.34028235E39) = true > (~0.123, 0.34028235E39) = false == (~0.123, 0.34028235E39) = false ?= (~0.123, 0.34028235E39) = false < (~0.123, 0.17014117E39) = true > (~0.123, 0.17014117E39) = false == (~0.123, 0.17014117E39) = false ?= (~0.123, 0.17014117E39) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.31415927E1) = true > (~0.123, 0.31415927E1) = false == (~0.123, 0.31415927E1) = false ?= (~0.123, 0.31415927E1) = false < (~0.123, 0.27182817E1) = true > (~0.123, 0.27182817E1) = false == (~0.123, 0.27182817E1) = false ?= (~0.123, 0.27182817E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.11754944E~37) = true > (~0.123, 0.11754944E~37) = false == (~0.123, 0.11754944E~37) = false ?= (~0.123, 0.11754944E~37) = false < (~0.123, 0.5877472E~38) = true > (~0.123, 0.5877472E~38) = false == (~0.123, 0.5877472E~38) = false ?= (~0.123, 0.5877472E~38) = false < (~0.123, 0.1E~44) = true > (~0.123, 0.1E~44) = false == (~0.123, 0.1E~44) = false ?= (~0.123, 0.1E~44) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.34028235E39) = false > (~0.123, ~0.34028235E39) = true == (~0.123, ~0.34028235E39) = false ?= (~0.123, ~0.34028235E39) = false < (~0.123, ~0.17014117E39) = false > (~0.123, ~0.17014117E39) = true == (~0.123, ~0.17014117E39) = false ?= (~0.123, ~0.17014117E39) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.31415927E1) = false > (~0.123, ~0.31415927E1) = true == (~0.123, ~0.31415927E1) = false ?= (~0.123, ~0.31415927E1) = false < (~0.123, ~0.27182817E1) = false > (~0.123, ~0.27182817E1) = true == (~0.123, ~0.27182817E1) = false ?= (~0.123, ~0.27182817E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.11754944E~37) = true > (~0.123, ~0.11754944E~37) = false == (~0.123, ~0.11754944E~37) = false ?= (~0.123, ~0.11754944E~37) = false < (~0.123, ~0.5877472E~38) = true > (~0.123, ~0.5877472E~38) = false == (~0.123, ~0.5877472E~38) = false ?= (~0.123, ~0.5877472E~38) = false < (~0.123, ~0.1E~44) = true > (~0.123, ~0.1E~44) = false == (~0.123, ~0.1E~44) = false ?= (~0.123, ~0.1E~44) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.34028235E39) = true > (~0.123E~2, 0.34028235E39) = false == (~0.123E~2, 0.34028235E39) = false ?= (~0.123E~2, 0.34028235E39) = false < (~0.123E~2, 0.17014117E39) = true > (~0.123E~2, 0.17014117E39) = false == (~0.123E~2, 0.17014117E39) = false ?= (~0.123E~2, 0.17014117E39) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.31415927E1) = true > (~0.123E~2, 0.31415927E1) = false == (~0.123E~2, 0.31415927E1) = false ?= (~0.123E~2, 0.31415927E1) = false < (~0.123E~2, 0.27182817E1) = true > (~0.123E~2, 0.27182817E1) = false == (~0.123E~2, 0.27182817E1) = false ?= (~0.123E~2, 0.27182817E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.11754944E~37) = true > (~0.123E~2, 0.11754944E~37) = false == (~0.123E~2, 0.11754944E~37) = false ?= (~0.123E~2, 0.11754944E~37) = false < (~0.123E~2, 0.5877472E~38) = true > (~0.123E~2, 0.5877472E~38) = false == (~0.123E~2, 0.5877472E~38) = false ?= (~0.123E~2, 0.5877472E~38) = false < (~0.123E~2, 0.1E~44) = true > (~0.123E~2, 0.1E~44) = false == (~0.123E~2, 0.1E~44) = false ?= (~0.123E~2, 0.1E~44) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.34028235E39) = false > (~0.123E~2, ~0.34028235E39) = true == (~0.123E~2, ~0.34028235E39) = false ?= (~0.123E~2, ~0.34028235E39) = false < (~0.123E~2, ~0.17014117E39) = false > (~0.123E~2, ~0.17014117E39) = true == (~0.123E~2, ~0.17014117E39) = false ?= (~0.123E~2, ~0.17014117E39) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.31415927E1) = false > (~0.123E~2, ~0.31415927E1) = true == (~0.123E~2, ~0.31415927E1) = false ?= (~0.123E~2, ~0.31415927E1) = false < (~0.123E~2, ~0.27182817E1) = false > (~0.123E~2, ~0.27182817E1) = true == (~0.123E~2, ~0.27182817E1) = false ?= (~0.123E~2, ~0.27182817E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.11754944E~37) = true > (~0.123E~2, ~0.11754944E~37) = false == (~0.123E~2, ~0.11754944E~37) = false ?= (~0.123E~2, ~0.11754944E~37) = false < (~0.123E~2, ~0.5877472E~38) = true > (~0.123E~2, ~0.5877472E~38) = false == (~0.123E~2, ~0.5877472E~38) = false ?= (~0.123E~2, ~0.5877472E~38) = false < (~0.123E~2, ~0.1E~44) = true > (~0.123E~2, ~0.1E~44) = false == (~0.123E~2, ~0.1E~44) = false ?= (~0.123E~2, ~0.1E~44) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.11754944E~37, 0.34028235E39) = true > (~0.11754944E~37, 0.34028235E39) = false == (~0.11754944E~37, 0.34028235E39) = false ?= (~0.11754944E~37, 0.34028235E39) = false < (~0.11754944E~37, 0.17014117E39) = true > (~0.11754944E~37, 0.17014117E39) = false == (~0.11754944E~37, 0.17014117E39) = false ?= (~0.11754944E~37, 0.17014117E39) = false < (~0.11754944E~37, 0.123E4) = true > (~0.11754944E~37, 0.123E4) = false == (~0.11754944E~37, 0.123E4) = false ?= (~0.11754944E~37, 0.123E4) = false < (~0.11754944E~37, 0.123E2) = true > (~0.11754944E~37, 0.123E2) = false == (~0.11754944E~37, 0.123E2) = false ?= (~0.11754944E~37, 0.123E2) = false < (~0.11754944E~37, 0.31415927E1) = true > (~0.11754944E~37, 0.31415927E1) = false == (~0.11754944E~37, 0.31415927E1) = false ?= (~0.11754944E~37, 0.31415927E1) = false < (~0.11754944E~37, 0.27182817E1) = true > (~0.11754944E~37, 0.27182817E1) = false == (~0.11754944E~37, 0.27182817E1) = false ?= (~0.11754944E~37, 0.27182817E1) = false < (~0.11754944E~37, 0.123E1) = true > (~0.11754944E~37, 0.123E1) = false == (~0.11754944E~37, 0.123E1) = false ?= (~0.11754944E~37, 0.123E1) = false < (~0.11754944E~37, 0.123) = true > (~0.11754944E~37, 0.123) = false == (~0.11754944E~37, 0.123) = false ?= (~0.11754944E~37, 0.123) = false < (~0.11754944E~37, 0.123E~2) = true > (~0.11754944E~37, 0.123E~2) = false == (~0.11754944E~37, 0.123E~2) = false ?= (~0.11754944E~37, 0.123E~2) = false < (~0.11754944E~37, 0.11754944E~37) = true > (~0.11754944E~37, 0.11754944E~37) = false == (~0.11754944E~37, 0.11754944E~37) = false ?= (~0.11754944E~37, 0.11754944E~37) = false < (~0.11754944E~37, 0.5877472E~38) = true > (~0.11754944E~37, 0.5877472E~38) = false == (~0.11754944E~37, 0.5877472E~38) = false ?= (~0.11754944E~37, 0.5877472E~38) = false < (~0.11754944E~37, 0.1E~44) = true > (~0.11754944E~37, 0.1E~44) = false == (~0.11754944E~37, 0.1E~44) = false ?= (~0.11754944E~37, 0.1E~44) = false < (~0.11754944E~37, 0.0) = true > (~0.11754944E~37, 0.0) = false == (~0.11754944E~37, 0.0) = false ?= (~0.11754944E~37, 0.0) = false < (~0.11754944E~37, ~0.34028235E39) = false > (~0.11754944E~37, ~0.34028235E39) = true == (~0.11754944E~37, ~0.34028235E39) = false ?= (~0.11754944E~37, ~0.34028235E39) = false < (~0.11754944E~37, ~0.17014117E39) = false > (~0.11754944E~37, ~0.17014117E39) = true == (~0.11754944E~37, ~0.17014117E39) = false ?= (~0.11754944E~37, ~0.17014117E39) = false < (~0.11754944E~37, ~0.123E4) = false > (~0.11754944E~37, ~0.123E4) = true == (~0.11754944E~37, ~0.123E4) = false ?= (~0.11754944E~37, ~0.123E4) = false < (~0.11754944E~37, ~0.123E2) = false > (~0.11754944E~37, ~0.123E2) = true == (~0.11754944E~37, ~0.123E2) = false ?= (~0.11754944E~37, ~0.123E2) = false < (~0.11754944E~37, ~0.31415927E1) = false > (~0.11754944E~37, ~0.31415927E1) = true == (~0.11754944E~37, ~0.31415927E1) = false ?= (~0.11754944E~37, ~0.31415927E1) = false < (~0.11754944E~37, ~0.27182817E1) = false > (~0.11754944E~37, ~0.27182817E1) = true == (~0.11754944E~37, ~0.27182817E1) = false ?= (~0.11754944E~37, ~0.27182817E1) = false < (~0.11754944E~37, ~0.123E1) = false > (~0.11754944E~37, ~0.123E1) = true == (~0.11754944E~37, ~0.123E1) = false ?= (~0.11754944E~37, ~0.123E1) = false < (~0.11754944E~37, ~0.123) = false > (~0.11754944E~37, ~0.123) = true == (~0.11754944E~37, ~0.123) = false ?= (~0.11754944E~37, ~0.123) = false < (~0.11754944E~37, ~0.123E~2) = false > (~0.11754944E~37, ~0.123E~2) = true == (~0.11754944E~37, ~0.123E~2) = false ?= (~0.11754944E~37, ~0.123E~2) = false < (~0.11754944E~37, ~0.11754944E~37) = false > (~0.11754944E~37, ~0.11754944E~37) = false == (~0.11754944E~37, ~0.11754944E~37) = true ?= (~0.11754944E~37, ~0.11754944E~37) = true < (~0.11754944E~37, ~0.5877472E~38) = true > (~0.11754944E~37, ~0.5877472E~38) = false == (~0.11754944E~37, ~0.5877472E~38) = false ?= (~0.11754944E~37, ~0.5877472E~38) = false < (~0.11754944E~37, ~0.1E~44) = true > (~0.11754944E~37, ~0.1E~44) = false == (~0.11754944E~37, ~0.1E~44) = false ?= (~0.11754944E~37, ~0.1E~44) = false < (~0.11754944E~37, ~0.0) = true > (~0.11754944E~37, ~0.0) = false == (~0.11754944E~37, ~0.0) = false ?= (~0.11754944E~37, ~0.0) = false < (~0.5877472E~38, 0.34028235E39) = true > (~0.5877472E~38, 0.34028235E39) = false == (~0.5877472E~38, 0.34028235E39) = false ?= (~0.5877472E~38, 0.34028235E39) = false < (~0.5877472E~38, 0.17014117E39) = true > (~0.5877472E~38, 0.17014117E39) = false == (~0.5877472E~38, 0.17014117E39) = false ?= (~0.5877472E~38, 0.17014117E39) = false < (~0.5877472E~38, 0.123E4) = true > (~0.5877472E~38, 0.123E4) = false == (~0.5877472E~38, 0.123E4) = false ?= (~0.5877472E~38, 0.123E4) = false < (~0.5877472E~38, 0.123E2) = true > (~0.5877472E~38, 0.123E2) = false == (~0.5877472E~38, 0.123E2) = false ?= (~0.5877472E~38, 0.123E2) = false < (~0.5877472E~38, 0.31415927E1) = true > (~0.5877472E~38, 0.31415927E1) = false == (~0.5877472E~38, 0.31415927E1) = false ?= (~0.5877472E~38, 0.31415927E1) = false < (~0.5877472E~38, 0.27182817E1) = true > (~0.5877472E~38, 0.27182817E1) = false == (~0.5877472E~38, 0.27182817E1) = false ?= (~0.5877472E~38, 0.27182817E1) = false < (~0.5877472E~38, 0.123E1) = true > (~0.5877472E~38, 0.123E1) = false == (~0.5877472E~38, 0.123E1) = false ?= (~0.5877472E~38, 0.123E1) = false < (~0.5877472E~38, 0.123) = true > (~0.5877472E~38, 0.123) = false == (~0.5877472E~38, 0.123) = false ?= (~0.5877472E~38, 0.123) = false < (~0.5877472E~38, 0.123E~2) = true > (~0.5877472E~38, 0.123E~2) = false == (~0.5877472E~38, 0.123E~2) = false ?= (~0.5877472E~38, 0.123E~2) = false < (~0.5877472E~38, 0.11754944E~37) = true > (~0.5877472E~38, 0.11754944E~37) = false == (~0.5877472E~38, 0.11754944E~37) = false ?= (~0.5877472E~38, 0.11754944E~37) = false < (~0.5877472E~38, 0.5877472E~38) = true > (~0.5877472E~38, 0.5877472E~38) = false == (~0.5877472E~38, 0.5877472E~38) = false ?= (~0.5877472E~38, 0.5877472E~38) = false < (~0.5877472E~38, 0.1E~44) = true > (~0.5877472E~38, 0.1E~44) = false == (~0.5877472E~38, 0.1E~44) = false ?= (~0.5877472E~38, 0.1E~44) = false < (~0.5877472E~38, 0.0) = true > (~0.5877472E~38, 0.0) = false == (~0.5877472E~38, 0.0) = false ?= (~0.5877472E~38, 0.0) = false < (~0.5877472E~38, ~0.34028235E39) = false > (~0.5877472E~38, ~0.34028235E39) = true == (~0.5877472E~38, ~0.34028235E39) = false ?= (~0.5877472E~38, ~0.34028235E39) = false < (~0.5877472E~38, ~0.17014117E39) = false > (~0.5877472E~38, ~0.17014117E39) = true == (~0.5877472E~38, ~0.17014117E39) = false ?= (~0.5877472E~38, ~0.17014117E39) = false < (~0.5877472E~38, ~0.123E4) = false > (~0.5877472E~38, ~0.123E4) = true == (~0.5877472E~38, ~0.123E4) = false ?= (~0.5877472E~38, ~0.123E4) = false < (~0.5877472E~38, ~0.123E2) = false > (~0.5877472E~38, ~0.123E2) = true == (~0.5877472E~38, ~0.123E2) = false ?= (~0.5877472E~38, ~0.123E2) = false < (~0.5877472E~38, ~0.31415927E1) = false > (~0.5877472E~38, ~0.31415927E1) = true == (~0.5877472E~38, ~0.31415927E1) = false ?= (~0.5877472E~38, ~0.31415927E1) = false < (~0.5877472E~38, ~0.27182817E1) = false > (~0.5877472E~38, ~0.27182817E1) = true == (~0.5877472E~38, ~0.27182817E1) = false ?= (~0.5877472E~38, ~0.27182817E1) = false < (~0.5877472E~38, ~0.123E1) = false > (~0.5877472E~38, ~0.123E1) = true == (~0.5877472E~38, ~0.123E1) = false ?= (~0.5877472E~38, ~0.123E1) = false < (~0.5877472E~38, ~0.123) = false > (~0.5877472E~38, ~0.123) = true == (~0.5877472E~38, ~0.123) = false ?= (~0.5877472E~38, ~0.123) = false < (~0.5877472E~38, ~0.123E~2) = false > (~0.5877472E~38, ~0.123E~2) = true == (~0.5877472E~38, ~0.123E~2) = false ?= (~0.5877472E~38, ~0.123E~2) = false < (~0.5877472E~38, ~0.11754944E~37) = false > (~0.5877472E~38, ~0.11754944E~37) = true == (~0.5877472E~38, ~0.11754944E~37) = false ?= (~0.5877472E~38, ~0.11754944E~37) = false < (~0.5877472E~38, ~0.5877472E~38) = false > (~0.5877472E~38, ~0.5877472E~38) = false == (~0.5877472E~38, ~0.5877472E~38) = true ?= (~0.5877472E~38, ~0.5877472E~38) = true < (~0.5877472E~38, ~0.1E~44) = true > (~0.5877472E~38, ~0.1E~44) = false == (~0.5877472E~38, ~0.1E~44) = false ?= (~0.5877472E~38, ~0.1E~44) = false < (~0.5877472E~38, ~0.0) = true > (~0.5877472E~38, ~0.0) = false == (~0.5877472E~38, ~0.0) = false ?= (~0.5877472E~38, ~0.0) = false < (~0.1E~44, 0.34028235E39) = true > (~0.1E~44, 0.34028235E39) = false == (~0.1E~44, 0.34028235E39) = false ?= (~0.1E~44, 0.34028235E39) = false < (~0.1E~44, 0.17014117E39) = true > (~0.1E~44, 0.17014117E39) = false == (~0.1E~44, 0.17014117E39) = false ?= (~0.1E~44, 0.17014117E39) = false < (~0.1E~44, 0.123E4) = true > (~0.1E~44, 0.123E4) = false == (~0.1E~44, 0.123E4) = false ?= (~0.1E~44, 0.123E4) = false < (~0.1E~44, 0.123E2) = true > (~0.1E~44, 0.123E2) = false == (~0.1E~44, 0.123E2) = false ?= (~0.1E~44, 0.123E2) = false < (~0.1E~44, 0.31415927E1) = true > (~0.1E~44, 0.31415927E1) = false == (~0.1E~44, 0.31415927E1) = false ?= (~0.1E~44, 0.31415927E1) = false < (~0.1E~44, 0.27182817E1) = true > (~0.1E~44, 0.27182817E1) = false == (~0.1E~44, 0.27182817E1) = false ?= (~0.1E~44, 0.27182817E1) = false < (~0.1E~44, 0.123E1) = true > (~0.1E~44, 0.123E1) = false == (~0.1E~44, 0.123E1) = false ?= (~0.1E~44, 0.123E1) = false < (~0.1E~44, 0.123) = true > (~0.1E~44, 0.123) = false == (~0.1E~44, 0.123) = false ?= (~0.1E~44, 0.123) = false < (~0.1E~44, 0.123E~2) = true > (~0.1E~44, 0.123E~2) = false == (~0.1E~44, 0.123E~2) = false ?= (~0.1E~44, 0.123E~2) = false < (~0.1E~44, 0.11754944E~37) = true > (~0.1E~44, 0.11754944E~37) = false == (~0.1E~44, 0.11754944E~37) = false ?= (~0.1E~44, 0.11754944E~37) = false < (~0.1E~44, 0.5877472E~38) = true > (~0.1E~44, 0.5877472E~38) = false == (~0.1E~44, 0.5877472E~38) = false ?= (~0.1E~44, 0.5877472E~38) = false < (~0.1E~44, 0.1E~44) = true > (~0.1E~44, 0.1E~44) = false == (~0.1E~44, 0.1E~44) = false ?= (~0.1E~44, 0.1E~44) = false < (~0.1E~44, 0.0) = true > (~0.1E~44, 0.0) = false == (~0.1E~44, 0.0) = false ?= (~0.1E~44, 0.0) = false < (~0.1E~44, ~0.34028235E39) = false > (~0.1E~44, ~0.34028235E39) = true == (~0.1E~44, ~0.34028235E39) = false ?= (~0.1E~44, ~0.34028235E39) = false < (~0.1E~44, ~0.17014117E39) = false > (~0.1E~44, ~0.17014117E39) = true == (~0.1E~44, ~0.17014117E39) = false ?= (~0.1E~44, ~0.17014117E39) = false < (~0.1E~44, ~0.123E4) = false > (~0.1E~44, ~0.123E4) = true == (~0.1E~44, ~0.123E4) = false ?= (~0.1E~44, ~0.123E4) = false < (~0.1E~44, ~0.123E2) = false > (~0.1E~44, ~0.123E2) = true == (~0.1E~44, ~0.123E2) = false ?= (~0.1E~44, ~0.123E2) = false < (~0.1E~44, ~0.31415927E1) = false > (~0.1E~44, ~0.31415927E1) = true == (~0.1E~44, ~0.31415927E1) = false ?= (~0.1E~44, ~0.31415927E1) = false < (~0.1E~44, ~0.27182817E1) = false > (~0.1E~44, ~0.27182817E1) = true == (~0.1E~44, ~0.27182817E1) = false ?= (~0.1E~44, ~0.27182817E1) = false < (~0.1E~44, ~0.123E1) = false > (~0.1E~44, ~0.123E1) = true == (~0.1E~44, ~0.123E1) = false ?= (~0.1E~44, ~0.123E1) = false < (~0.1E~44, ~0.123) = false > (~0.1E~44, ~0.123) = true == (~0.1E~44, ~0.123) = false ?= (~0.1E~44, ~0.123) = false < (~0.1E~44, ~0.123E~2) = false > (~0.1E~44, ~0.123E~2) = true == (~0.1E~44, ~0.123E~2) = false ?= (~0.1E~44, ~0.123E~2) = false < (~0.1E~44, ~0.11754944E~37) = false > (~0.1E~44, ~0.11754944E~37) = true == (~0.1E~44, ~0.11754944E~37) = false ?= (~0.1E~44, ~0.11754944E~37) = false < (~0.1E~44, ~0.5877472E~38) = false > (~0.1E~44, ~0.5877472E~38) = true == (~0.1E~44, ~0.5877472E~38) = false ?= (~0.1E~44, ~0.5877472E~38) = false < (~0.1E~44, ~0.1E~44) = false > (~0.1E~44, ~0.1E~44) = false == (~0.1E~44, ~0.1E~44) = true ?= (~0.1E~44, ~0.1E~44) = true < (~0.1E~44, ~0.0) = true > (~0.1E~44, ~0.0) = false == (~0.1E~44, ~0.0) = false ?= (~0.1E~44, ~0.0) = false < (~0.0, 0.34028235E39) = true > (~0.0, 0.34028235E39) = false == (~0.0, 0.34028235E39) = false ?= (~0.0, 0.34028235E39) = false < (~0.0, 0.17014117E39) = true > (~0.0, 0.17014117E39) = false == (~0.0, 0.17014117E39) = false ?= (~0.0, 0.17014117E39) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.31415927E1) = true > (~0.0, 0.31415927E1) = false == (~0.0, 0.31415927E1) = false ?= (~0.0, 0.31415927E1) = false < (~0.0, 0.27182817E1) = true > (~0.0, 0.27182817E1) = false == (~0.0, 0.27182817E1) = false ?= (~0.0, 0.27182817E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.11754944E~37) = true > (~0.0, 0.11754944E~37) = false == (~0.0, 0.11754944E~37) = false ?= (~0.0, 0.11754944E~37) = false < (~0.0, 0.5877472E~38) = true > (~0.0, 0.5877472E~38) = false == (~0.0, 0.5877472E~38) = false ?= (~0.0, 0.5877472E~38) = false < (~0.0, 0.1E~44) = true > (~0.0, 0.1E~44) = false == (~0.0, 0.1E~44) = false ?= (~0.0, 0.1E~44) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.34028235E39) = false > (~0.0, ~0.34028235E39) = true == (~0.0, ~0.34028235E39) = false ?= (~0.0, ~0.34028235E39) = false < (~0.0, ~0.17014117E39) = false > (~0.0, ~0.17014117E39) = true == (~0.0, ~0.17014117E39) = false ?= (~0.0, ~0.17014117E39) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.31415927E1) = false > (~0.0, ~0.31415927E1) = true == (~0.0, ~0.31415927E1) = false ?= (~0.0, ~0.31415927E1) = false < (~0.0, ~0.27182817E1) = false > (~0.0, ~0.27182817E1) = true == (~0.0, ~0.27182817E1) = false ?= (~0.0, ~0.27182817E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.11754944E~37) = false > (~0.0, ~0.11754944E~37) = true == (~0.0, ~0.11754944E~37) = false ?= (~0.0, ~0.11754944E~37) = false < (~0.0, ~0.5877472E~38) = false > (~0.0, ~0.5877472E~38) = true == (~0.0, ~0.5877472E~38) = false ?= (~0.0, ~0.5877472E~38) = false < (~0.0, ~0.1E~44) = false > (~0.0, ~0.1E~44) = true == (~0.0, ~0.1E~44) = false ?= (~0.0, ~0.1E~44) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.34028235E39, 0.34028235E39) = EQUAL compareReal (0.34028235E39, 0.34028235E39) = EQUAL compare (0.34028235E39, 0.17014117E39) = GREATER compareReal (0.34028235E39, 0.17014117E39) = GREATER compare (0.34028235E39, 0.123E4) = GREATER compareReal (0.34028235E39, 0.123E4) = GREATER compare (0.34028235E39, 0.123E2) = GREATER compareReal (0.34028235E39, 0.123E2) = GREATER compare (0.34028235E39, 0.31415927E1) = GREATER compareReal (0.34028235E39, 0.31415927E1) = GREATER compare (0.34028235E39, 0.27182817E1) = GREATER compareReal (0.34028235E39, 0.27182817E1) = GREATER compare (0.34028235E39, 0.123E1) = GREATER compareReal (0.34028235E39, 0.123E1) = GREATER compare (0.34028235E39, 0.123) = GREATER compareReal (0.34028235E39, 0.123) = GREATER compare (0.34028235E39, 0.123E~2) = GREATER compareReal (0.34028235E39, 0.123E~2) = GREATER compare (0.34028235E39, 0.11754944E~37) = GREATER compareReal (0.34028235E39, 0.11754944E~37) = GREATER compare (0.34028235E39, 0.5877472E~38) = GREATER compareReal (0.34028235E39, 0.5877472E~38) = GREATER compare (0.34028235E39, 0.1E~44) = GREATER compareReal (0.34028235E39, 0.1E~44) = GREATER compare (0.34028235E39, 0.0) = GREATER compareReal (0.34028235E39, 0.0) = GREATER compare (0.34028235E39, ~0.34028235E39) = GREATER compareReal (0.34028235E39, ~0.34028235E39) = GREATER compare (0.34028235E39, ~0.17014117E39) = GREATER compareReal (0.34028235E39, ~0.17014117E39) = GREATER compare (0.34028235E39, ~0.123E4) = GREATER compareReal (0.34028235E39, ~0.123E4) = GREATER compare (0.34028235E39, ~0.123E2) = GREATER compareReal (0.34028235E39, ~0.123E2) = GREATER compare (0.34028235E39, ~0.31415927E1) = GREATER compareReal (0.34028235E39, ~0.31415927E1) = GREATER compare (0.34028235E39, ~0.27182817E1) = GREATER compareReal (0.34028235E39, ~0.27182817E1) = GREATER compare (0.34028235E39, ~0.123E1) = GREATER compareReal (0.34028235E39, ~0.123E1) = GREATER compare (0.34028235E39, ~0.123) = GREATER compareReal (0.34028235E39, ~0.123) = GREATER compare (0.34028235E39, ~0.123E~2) = GREATER compareReal (0.34028235E39, ~0.123E~2) = GREATER compare (0.34028235E39, ~0.11754944E~37) = GREATER compareReal (0.34028235E39, ~0.11754944E~37) = GREATER compare (0.34028235E39, ~0.5877472E~38) = GREATER compareReal (0.34028235E39, ~0.5877472E~38) = GREATER compare (0.34028235E39, ~0.1E~44) = GREATER compareReal (0.34028235E39, ~0.1E~44) = GREATER compare (0.34028235E39, ~0.0) = GREATER compareReal (0.34028235E39, ~0.0) = GREATER compare (0.17014117E39, 0.34028235E39) = LESS compareReal (0.17014117E39, 0.34028235E39) = LESS compare (0.17014117E39, 0.17014117E39) = EQUAL compareReal (0.17014117E39, 0.17014117E39) = EQUAL compare (0.17014117E39, 0.123E4) = GREATER compareReal (0.17014117E39, 0.123E4) = GREATER compare (0.17014117E39, 0.123E2) = GREATER compareReal (0.17014117E39, 0.123E2) = GREATER compare (0.17014117E39, 0.31415927E1) = GREATER compareReal (0.17014117E39, 0.31415927E1) = GREATER compare (0.17014117E39, 0.27182817E1) = GREATER compareReal (0.17014117E39, 0.27182817E1) = GREATER compare (0.17014117E39, 0.123E1) = GREATER compareReal (0.17014117E39, 0.123E1) = GREATER compare (0.17014117E39, 0.123) = GREATER compareReal (0.17014117E39, 0.123) = GREATER compare (0.17014117E39, 0.123E~2) = GREATER compareReal (0.17014117E39, 0.123E~2) = GREATER compare (0.17014117E39, 0.11754944E~37) = GREATER compareReal (0.17014117E39, 0.11754944E~37) = GREATER compare (0.17014117E39, 0.5877472E~38) = GREATER compareReal (0.17014117E39, 0.5877472E~38) = GREATER compare (0.17014117E39, 0.1E~44) = GREATER compareReal (0.17014117E39, 0.1E~44) = GREATER compare (0.17014117E39, 0.0) = GREATER compareReal (0.17014117E39, 0.0) = GREATER compare (0.17014117E39, ~0.34028235E39) = GREATER compareReal (0.17014117E39, ~0.34028235E39) = GREATER compare (0.17014117E39, ~0.17014117E39) = GREATER compareReal (0.17014117E39, ~0.17014117E39) = GREATER compare (0.17014117E39, ~0.123E4) = GREATER compareReal (0.17014117E39, ~0.123E4) = GREATER compare (0.17014117E39, ~0.123E2) = GREATER compareReal (0.17014117E39, ~0.123E2) = GREATER compare (0.17014117E39, ~0.31415927E1) = GREATER compareReal (0.17014117E39, ~0.31415927E1) = GREATER compare (0.17014117E39, ~0.27182817E1) = GREATER compareReal (0.17014117E39, ~0.27182817E1) = GREATER compare (0.17014117E39, ~0.123E1) = GREATER compareReal (0.17014117E39, ~0.123E1) = GREATER compare (0.17014117E39, ~0.123) = GREATER compareReal (0.17014117E39, ~0.123) = GREATER compare (0.17014117E39, ~0.123E~2) = GREATER compareReal (0.17014117E39, ~0.123E~2) = GREATER compare (0.17014117E39, ~0.11754944E~37) = GREATER compareReal (0.17014117E39, ~0.11754944E~37) = GREATER compare (0.17014117E39, ~0.5877472E~38) = GREATER compareReal (0.17014117E39, ~0.5877472E~38) = GREATER compare (0.17014117E39, ~0.1E~44) = GREATER compareReal (0.17014117E39, ~0.1E~44) = GREATER compare (0.17014117E39, ~0.0) = GREATER compareReal (0.17014117E39, ~0.0) = GREATER compare (0.123E4, 0.34028235E39) = LESS compareReal (0.123E4, 0.34028235E39) = LESS compare (0.123E4, 0.17014117E39) = LESS compareReal (0.123E4, 0.17014117E39) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.31415927E1) = GREATER compareReal (0.123E4, 0.31415927E1) = GREATER compare (0.123E4, 0.27182817E1) = GREATER compareReal (0.123E4, 0.27182817E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.11754944E~37) = GREATER compareReal (0.123E4, 0.11754944E~37) = GREATER compare (0.123E4, 0.5877472E~38) = GREATER compareReal (0.123E4, 0.5877472E~38) = GREATER compare (0.123E4, 0.1E~44) = GREATER compareReal (0.123E4, 0.1E~44) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.34028235E39) = GREATER compareReal (0.123E4, ~0.34028235E39) = GREATER compare (0.123E4, ~0.17014117E39) = GREATER compareReal (0.123E4, ~0.17014117E39) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.31415927E1) = GREATER compareReal (0.123E4, ~0.31415927E1) = GREATER compare (0.123E4, ~0.27182817E1) = GREATER compareReal (0.123E4, ~0.27182817E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.11754944E~37) = GREATER compareReal (0.123E4, ~0.11754944E~37) = GREATER compare (0.123E4, ~0.5877472E~38) = GREATER compareReal (0.123E4, ~0.5877472E~38) = GREATER compare (0.123E4, ~0.1E~44) = GREATER compareReal (0.123E4, ~0.1E~44) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.34028235E39) = LESS compareReal (0.123E2, 0.34028235E39) = LESS compare (0.123E2, 0.17014117E39) = LESS compareReal (0.123E2, 0.17014117E39) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.31415927E1) = GREATER compareReal (0.123E2, 0.31415927E1) = GREATER compare (0.123E2, 0.27182817E1) = GREATER compareReal (0.123E2, 0.27182817E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.11754944E~37) = GREATER compareReal (0.123E2, 0.11754944E~37) = GREATER compare (0.123E2, 0.5877472E~38) = GREATER compareReal (0.123E2, 0.5877472E~38) = GREATER compare (0.123E2, 0.1E~44) = GREATER compareReal (0.123E2, 0.1E~44) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.34028235E39) = GREATER compareReal (0.123E2, ~0.34028235E39) = GREATER compare (0.123E2, ~0.17014117E39) = GREATER compareReal (0.123E2, ~0.17014117E39) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.31415927E1) = GREATER compareReal (0.123E2, ~0.31415927E1) = GREATER compare (0.123E2, ~0.27182817E1) = GREATER compareReal (0.123E2, ~0.27182817E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.11754944E~37) = GREATER compareReal (0.123E2, ~0.11754944E~37) = GREATER compare (0.123E2, ~0.5877472E~38) = GREATER compareReal (0.123E2, ~0.5877472E~38) = GREATER compare (0.123E2, ~0.1E~44) = GREATER compareReal (0.123E2, ~0.1E~44) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.31415927E1, 0.34028235E39) = LESS compareReal (0.31415927E1, 0.34028235E39) = LESS compare (0.31415927E1, 0.17014117E39) = LESS compareReal (0.31415927E1, 0.17014117E39) = LESS compare (0.31415927E1, 0.123E4) = LESS compareReal (0.31415927E1, 0.123E4) = LESS compare (0.31415927E1, 0.123E2) = LESS compareReal (0.31415927E1, 0.123E2) = LESS compare (0.31415927E1, 0.31415927E1) = EQUAL compareReal (0.31415927E1, 0.31415927E1) = EQUAL compare (0.31415927E1, 0.27182817E1) = GREATER compareReal (0.31415927E1, 0.27182817E1) = GREATER compare (0.31415927E1, 0.123E1) = GREATER compareReal (0.31415927E1, 0.123E1) = GREATER compare (0.31415927E1, 0.123) = GREATER compareReal (0.31415927E1, 0.123) = GREATER compare (0.31415927E1, 0.123E~2) = GREATER compareReal (0.31415927E1, 0.123E~2) = GREATER compare (0.31415927E1, 0.11754944E~37) = GREATER compareReal (0.31415927E1, 0.11754944E~37) = GREATER compare (0.31415927E1, 0.5877472E~38) = GREATER compareReal (0.31415927E1, 0.5877472E~38) = GREATER compare (0.31415927E1, 0.1E~44) = GREATER compareReal (0.31415927E1, 0.1E~44) = GREATER compare (0.31415927E1, 0.0) = GREATER compareReal (0.31415927E1, 0.0) = GREATER compare (0.31415927E1, ~0.34028235E39) = GREATER compareReal (0.31415927E1, ~0.34028235E39) = GREATER compare (0.31415927E1, ~0.17014117E39) = GREATER compareReal (0.31415927E1, ~0.17014117E39) = GREATER compare (0.31415927E1, ~0.123E4) = GREATER compareReal (0.31415927E1, ~0.123E4) = GREATER compare (0.31415927E1, ~0.123E2) = GREATER compareReal (0.31415927E1, ~0.123E2) = GREATER compare (0.31415927E1, ~0.31415927E1) = GREATER compareReal (0.31415927E1, ~0.31415927E1) = GREATER compare (0.31415927E1, ~0.27182817E1) = GREATER compareReal (0.31415927E1, ~0.27182817E1) = GREATER compare (0.31415927E1, ~0.123E1) = GREATER compareReal (0.31415927E1, ~0.123E1) = GREATER compare (0.31415927E1, ~0.123) = GREATER compareReal (0.31415927E1, ~0.123) = GREATER compare (0.31415927E1, ~0.123E~2) = GREATER compareReal (0.31415927E1, ~0.123E~2) = GREATER compare (0.31415927E1, ~0.11754944E~37) = GREATER compareReal (0.31415927E1, ~0.11754944E~37) = GREATER compare (0.31415927E1, ~0.5877472E~38) = GREATER compareReal (0.31415927E1, ~0.5877472E~38) = GREATER compare (0.31415927E1, ~0.1E~44) = GREATER compareReal (0.31415927E1, ~0.1E~44) = GREATER compare (0.31415927E1, ~0.0) = GREATER compareReal (0.31415927E1, ~0.0) = GREATER compare (0.27182817E1, 0.34028235E39) = LESS compareReal (0.27182817E1, 0.34028235E39) = LESS compare (0.27182817E1, 0.17014117E39) = LESS compareReal (0.27182817E1, 0.17014117E39) = LESS compare (0.27182817E1, 0.123E4) = LESS compareReal (0.27182817E1, 0.123E4) = LESS compare (0.27182817E1, 0.123E2) = LESS compareReal (0.27182817E1, 0.123E2) = LESS compare (0.27182817E1, 0.31415927E1) = LESS compareReal (0.27182817E1, 0.31415927E1) = LESS compare (0.27182817E1, 0.27182817E1) = EQUAL compareReal (0.27182817E1, 0.27182817E1) = EQUAL compare (0.27182817E1, 0.123E1) = GREATER compareReal (0.27182817E1, 0.123E1) = GREATER compare (0.27182817E1, 0.123) = GREATER compareReal (0.27182817E1, 0.123) = GREATER compare (0.27182817E1, 0.123E~2) = GREATER compareReal (0.27182817E1, 0.123E~2) = GREATER compare (0.27182817E1, 0.11754944E~37) = GREATER compareReal (0.27182817E1, 0.11754944E~37) = GREATER compare (0.27182817E1, 0.5877472E~38) = GREATER compareReal (0.27182817E1, 0.5877472E~38) = GREATER compare (0.27182817E1, 0.1E~44) = GREATER compareReal (0.27182817E1, 0.1E~44) = GREATER compare (0.27182817E1, 0.0) = GREATER compareReal (0.27182817E1, 0.0) = GREATER compare (0.27182817E1, ~0.34028235E39) = GREATER compareReal (0.27182817E1, ~0.34028235E39) = GREATER compare (0.27182817E1, ~0.17014117E39) = GREATER compareReal (0.27182817E1, ~0.17014117E39) = GREATER compare (0.27182817E1, ~0.123E4) = GREATER compareReal (0.27182817E1, ~0.123E4) = GREATER compare (0.27182817E1, ~0.123E2) = GREATER compareReal (0.27182817E1, ~0.123E2) = GREATER compare (0.27182817E1, ~0.31415927E1) = GREATER compareReal (0.27182817E1, ~0.31415927E1) = GREATER compare (0.27182817E1, ~0.27182817E1) = GREATER compareReal (0.27182817E1, ~0.27182817E1) = GREATER compare (0.27182817E1, ~0.123E1) = GREATER compareReal (0.27182817E1, ~0.123E1) = GREATER compare (0.27182817E1, ~0.123) = GREATER compareReal (0.27182817E1, ~0.123) = GREATER compare (0.27182817E1, ~0.123E~2) = GREATER compareReal (0.27182817E1, ~0.123E~2) = GREATER compare (0.27182817E1, ~0.11754944E~37) = GREATER compareReal (0.27182817E1, ~0.11754944E~37) = GREATER compare (0.27182817E1, ~0.5877472E~38) = GREATER compareReal (0.27182817E1, ~0.5877472E~38) = GREATER compare (0.27182817E1, ~0.1E~44) = GREATER compareReal (0.27182817E1, ~0.1E~44) = GREATER compare (0.27182817E1, ~0.0) = GREATER compareReal (0.27182817E1, ~0.0) = GREATER compare (0.123E1, 0.34028235E39) = LESS compareReal (0.123E1, 0.34028235E39) = LESS compare (0.123E1, 0.17014117E39) = LESS compareReal (0.123E1, 0.17014117E39) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.31415927E1) = LESS compareReal (0.123E1, 0.31415927E1) = LESS compare (0.123E1, 0.27182817E1) = LESS compareReal (0.123E1, 0.27182817E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.11754944E~37) = GREATER compareReal (0.123E1, 0.11754944E~37) = GREATER compare (0.123E1, 0.5877472E~38) = GREATER compareReal (0.123E1, 0.5877472E~38) = GREATER compare (0.123E1, 0.1E~44) = GREATER compareReal (0.123E1, 0.1E~44) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.34028235E39) = GREATER compareReal (0.123E1, ~0.34028235E39) = GREATER compare (0.123E1, ~0.17014117E39) = GREATER compareReal (0.123E1, ~0.17014117E39) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.31415927E1) = GREATER compareReal (0.123E1, ~0.31415927E1) = GREATER compare (0.123E1, ~0.27182817E1) = GREATER compareReal (0.123E1, ~0.27182817E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.11754944E~37) = GREATER compareReal (0.123E1, ~0.11754944E~37) = GREATER compare (0.123E1, ~0.5877472E~38) = GREATER compareReal (0.123E1, ~0.5877472E~38) = GREATER compare (0.123E1, ~0.1E~44) = GREATER compareReal (0.123E1, ~0.1E~44) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.34028235E39) = LESS compareReal (0.123, 0.34028235E39) = LESS compare (0.123, 0.17014117E39) = LESS compareReal (0.123, 0.17014117E39) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.31415927E1) = LESS compareReal (0.123, 0.31415927E1) = LESS compare (0.123, 0.27182817E1) = LESS compareReal (0.123, 0.27182817E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.11754944E~37) = GREATER compareReal (0.123, 0.11754944E~37) = GREATER compare (0.123, 0.5877472E~38) = GREATER compareReal (0.123, 0.5877472E~38) = GREATER compare (0.123, 0.1E~44) = GREATER compareReal (0.123, 0.1E~44) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.34028235E39) = GREATER compareReal (0.123, ~0.34028235E39) = GREATER compare (0.123, ~0.17014117E39) = GREATER compareReal (0.123, ~0.17014117E39) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.31415927E1) = GREATER compareReal (0.123, ~0.31415927E1) = GREATER compare (0.123, ~0.27182817E1) = GREATER compareReal (0.123, ~0.27182817E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.11754944E~37) = GREATER compareReal (0.123, ~0.11754944E~37) = GREATER compare (0.123, ~0.5877472E~38) = GREATER compareReal (0.123, ~0.5877472E~38) = GREATER compare (0.123, ~0.1E~44) = GREATER compareReal (0.123, ~0.1E~44) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.34028235E39) = LESS compareReal (0.123E~2, 0.34028235E39) = LESS compare (0.123E~2, 0.17014117E39) = LESS compareReal (0.123E~2, 0.17014117E39) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.31415927E1) = LESS compareReal (0.123E~2, 0.31415927E1) = LESS compare (0.123E~2, 0.27182817E1) = LESS compareReal (0.123E~2, 0.27182817E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.11754944E~37) = GREATER compareReal (0.123E~2, 0.11754944E~37) = GREATER compare (0.123E~2, 0.5877472E~38) = GREATER compareReal (0.123E~2, 0.5877472E~38) = GREATER compare (0.123E~2, 0.1E~44) = GREATER compareReal (0.123E~2, 0.1E~44) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.34028235E39) = GREATER compareReal (0.123E~2, ~0.34028235E39) = GREATER compare (0.123E~2, ~0.17014117E39) = GREATER compareReal (0.123E~2, ~0.17014117E39) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.31415927E1) = GREATER compareReal (0.123E~2, ~0.31415927E1) = GREATER compare (0.123E~2, ~0.27182817E1) = GREATER compareReal (0.123E~2, ~0.27182817E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.11754944E~37) = GREATER compareReal (0.123E~2, ~0.11754944E~37) = GREATER compare (0.123E~2, ~0.5877472E~38) = GREATER compareReal (0.123E~2, ~0.5877472E~38) = GREATER compare (0.123E~2, ~0.1E~44) = GREATER compareReal (0.123E~2, ~0.1E~44) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.11754944E~37, 0.34028235E39) = LESS compareReal (0.11754944E~37, 0.34028235E39) = LESS compare (0.11754944E~37, 0.17014117E39) = LESS compareReal (0.11754944E~37, 0.17014117E39) = LESS compare (0.11754944E~37, 0.123E4) = LESS compareReal (0.11754944E~37, 0.123E4) = LESS compare (0.11754944E~37, 0.123E2) = LESS compareReal (0.11754944E~37, 0.123E2) = LESS compare (0.11754944E~37, 0.31415927E1) = LESS compareReal (0.11754944E~37, 0.31415927E1) = LESS compare (0.11754944E~37, 0.27182817E1) = LESS compareReal (0.11754944E~37, 0.27182817E1) = LESS compare (0.11754944E~37, 0.123E1) = LESS compareReal (0.11754944E~37, 0.123E1) = LESS compare (0.11754944E~37, 0.123) = LESS compareReal (0.11754944E~37, 0.123) = LESS compare (0.11754944E~37, 0.123E~2) = LESS compareReal (0.11754944E~37, 0.123E~2) = LESS compare (0.11754944E~37, 0.11754944E~37) = EQUAL compareReal (0.11754944E~37, 0.11754944E~37) = EQUAL compare (0.11754944E~37, 0.5877472E~38) = GREATER compareReal (0.11754944E~37, 0.5877472E~38) = GREATER compare (0.11754944E~37, 0.1E~44) = GREATER compareReal (0.11754944E~37, 0.1E~44) = GREATER compare (0.11754944E~37, 0.0) = GREATER compareReal (0.11754944E~37, 0.0) = GREATER compare (0.11754944E~37, ~0.34028235E39) = GREATER compareReal (0.11754944E~37, ~0.34028235E39) = GREATER compare (0.11754944E~37, ~0.17014117E39) = GREATER compareReal (0.11754944E~37, ~0.17014117E39) = GREATER compare (0.11754944E~37, ~0.123E4) = GREATER compareReal (0.11754944E~37, ~0.123E4) = GREATER compare (0.11754944E~37, ~0.123E2) = GREATER compareReal (0.11754944E~37, ~0.123E2) = GREATER compare (0.11754944E~37, ~0.31415927E1) = GREATER compareReal (0.11754944E~37, ~0.31415927E1) = GREATER compare (0.11754944E~37, ~0.27182817E1) = GREATER compareReal (0.11754944E~37, ~0.27182817E1) = GREATER compare (0.11754944E~37, ~0.123E1) = GREATER compareReal (0.11754944E~37, ~0.123E1) = GREATER compare (0.11754944E~37, ~0.123) = GREATER compareReal (0.11754944E~37, ~0.123) = GREATER compare (0.11754944E~37, ~0.123E~2) = GREATER compareReal (0.11754944E~37, ~0.123E~2) = GREATER compare (0.11754944E~37, ~0.11754944E~37) = GREATER compareReal (0.11754944E~37, ~0.11754944E~37) = GREATER compare (0.11754944E~37, ~0.5877472E~38) = GREATER compareReal (0.11754944E~37, ~0.5877472E~38) = GREATER compare (0.11754944E~37, ~0.1E~44) = GREATER compareReal (0.11754944E~37, ~0.1E~44) = GREATER compare (0.11754944E~37, ~0.0) = GREATER compareReal (0.11754944E~37, ~0.0) = GREATER compare (0.5877472E~38, 0.34028235E39) = LESS compareReal (0.5877472E~38, 0.34028235E39) = LESS compare (0.5877472E~38, 0.17014117E39) = LESS compareReal (0.5877472E~38, 0.17014117E39) = LESS compare (0.5877472E~38, 0.123E4) = LESS compareReal (0.5877472E~38, 0.123E4) = LESS compare (0.5877472E~38, 0.123E2) = LESS compareReal (0.5877472E~38, 0.123E2) = LESS compare (0.5877472E~38, 0.31415927E1) = LESS compareReal (0.5877472E~38, 0.31415927E1) = LESS compare (0.5877472E~38, 0.27182817E1) = LESS compareReal (0.5877472E~38, 0.27182817E1) = LESS compare (0.5877472E~38, 0.123E1) = LESS compareReal (0.5877472E~38, 0.123E1) = LESS compare (0.5877472E~38, 0.123) = LESS compareReal (0.5877472E~38, 0.123) = LESS compare (0.5877472E~38, 0.123E~2) = LESS compareReal (0.5877472E~38, 0.123E~2) = LESS compare (0.5877472E~38, 0.11754944E~37) = LESS compareReal (0.5877472E~38, 0.11754944E~37) = LESS compare (0.5877472E~38, 0.5877472E~38) = EQUAL compareReal (0.5877472E~38, 0.5877472E~38) = EQUAL compare (0.5877472E~38, 0.1E~44) = GREATER compareReal (0.5877472E~38, 0.1E~44) = GREATER compare (0.5877472E~38, 0.0) = GREATER compareReal (0.5877472E~38, 0.0) = GREATER compare (0.5877472E~38, ~0.34028235E39) = GREATER compareReal (0.5877472E~38, ~0.34028235E39) = GREATER compare (0.5877472E~38, ~0.17014117E39) = GREATER compareReal (0.5877472E~38, ~0.17014117E39) = GREATER compare (0.5877472E~38, ~0.123E4) = GREATER compareReal (0.5877472E~38, ~0.123E4) = GREATER compare (0.5877472E~38, ~0.123E2) = GREATER compareReal (0.5877472E~38, ~0.123E2) = GREATER compare (0.5877472E~38, ~0.31415927E1) = GREATER compareReal (0.5877472E~38, ~0.31415927E1) = GREATER compare (0.5877472E~38, ~0.27182817E1) = GREATER compareReal (0.5877472E~38, ~0.27182817E1) = GREATER compare (0.5877472E~38, ~0.123E1) = GREATER compareReal (0.5877472E~38, ~0.123E1) = GREATER compare (0.5877472E~38, ~0.123) = GREATER compareReal (0.5877472E~38, ~0.123) = GREATER compare (0.5877472E~38, ~0.123E~2) = GREATER compareReal (0.5877472E~38, ~0.123E~2) = GREATER compare (0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (0.5877472E~38, ~0.11754944E~37) = GREATER compare (0.5877472E~38, ~0.5877472E~38) = GREATER compareReal (0.5877472E~38, ~0.5877472E~38) = GREATER compare (0.5877472E~38, ~0.1E~44) = GREATER compareReal (0.5877472E~38, ~0.1E~44) = GREATER compare (0.5877472E~38, ~0.0) = GREATER compareReal (0.5877472E~38, ~0.0) = GREATER compare (0.1E~44, 0.34028235E39) = LESS compareReal (0.1E~44, 0.34028235E39) = LESS compare (0.1E~44, 0.17014117E39) = LESS compareReal (0.1E~44, 0.17014117E39) = LESS compare (0.1E~44, 0.123E4) = LESS compareReal (0.1E~44, 0.123E4) = LESS compare (0.1E~44, 0.123E2) = LESS compareReal (0.1E~44, 0.123E2) = LESS compare (0.1E~44, 0.31415927E1) = LESS compareReal (0.1E~44, 0.31415927E1) = LESS compare (0.1E~44, 0.27182817E1) = LESS compareReal (0.1E~44, 0.27182817E1) = LESS compare (0.1E~44, 0.123E1) = LESS compareReal (0.1E~44, 0.123E1) = LESS compare (0.1E~44, 0.123) = LESS compareReal (0.1E~44, 0.123) = LESS compare (0.1E~44, 0.123E~2) = LESS compareReal (0.1E~44, 0.123E~2) = LESS compare (0.1E~44, 0.11754944E~37) = LESS compareReal (0.1E~44, 0.11754944E~37) = LESS compare (0.1E~44, 0.5877472E~38) = LESS compareReal (0.1E~44, 0.5877472E~38) = LESS compare (0.1E~44, 0.1E~44) = EQUAL compareReal (0.1E~44, 0.1E~44) = EQUAL compare (0.1E~44, 0.0) = GREATER compareReal (0.1E~44, 0.0) = GREATER compare (0.1E~44, ~0.34028235E39) = GREATER compareReal (0.1E~44, ~0.34028235E39) = GREATER compare (0.1E~44, ~0.17014117E39) = GREATER compareReal (0.1E~44, ~0.17014117E39) = GREATER compare (0.1E~44, ~0.123E4) = GREATER compareReal (0.1E~44, ~0.123E4) = GREATER compare (0.1E~44, ~0.123E2) = GREATER compareReal (0.1E~44, ~0.123E2) = GREATER compare (0.1E~44, ~0.31415927E1) = GREATER compareReal (0.1E~44, ~0.31415927E1) = GREATER compare (0.1E~44, ~0.27182817E1) = GREATER compareReal (0.1E~44, ~0.27182817E1) = GREATER compare (0.1E~44, ~0.123E1) = GREATER compareReal (0.1E~44, ~0.123E1) = GREATER compare (0.1E~44, ~0.123) = GREATER compareReal (0.1E~44, ~0.123) = GREATER compare (0.1E~44, ~0.123E~2) = GREATER compareReal (0.1E~44, ~0.123E~2) = GREATER compare (0.1E~44, ~0.11754944E~37) = GREATER compareReal (0.1E~44, ~0.11754944E~37) = GREATER compare (0.1E~44, ~0.5877472E~38) = GREATER compareReal (0.1E~44, ~0.5877472E~38) = GREATER compare (0.1E~44, ~0.1E~44) = GREATER compareReal (0.1E~44, ~0.1E~44) = GREATER compare (0.1E~44, ~0.0) = GREATER compareReal (0.1E~44, ~0.0) = GREATER compare (0.0, 0.34028235E39) = LESS compareReal (0.0, 0.34028235E39) = LESS compare (0.0, 0.17014117E39) = LESS compareReal (0.0, 0.17014117E39) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.31415927E1) = LESS compareReal (0.0, 0.31415927E1) = LESS compare (0.0, 0.27182817E1) = LESS compareReal (0.0, 0.27182817E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.11754944E~37) = LESS compareReal (0.0, 0.11754944E~37) = LESS compare (0.0, 0.5877472E~38) = LESS compareReal (0.0, 0.5877472E~38) = LESS compare (0.0, 0.1E~44) = LESS compareReal (0.0, 0.1E~44) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.34028235E39) = GREATER compareReal (0.0, ~0.34028235E39) = GREATER compare (0.0, ~0.17014117E39) = GREATER compareReal (0.0, ~0.17014117E39) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.31415927E1) = GREATER compareReal (0.0, ~0.31415927E1) = GREATER compare (0.0, ~0.27182817E1) = GREATER compareReal (0.0, ~0.27182817E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.11754944E~37) = GREATER compareReal (0.0, ~0.11754944E~37) = GREATER compare (0.0, ~0.5877472E~38) = GREATER compareReal (0.0, ~0.5877472E~38) = GREATER compare (0.0, ~0.1E~44) = GREATER compareReal (0.0, ~0.1E~44) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.34028235E39, 0.34028235E39) = LESS compareReal (~0.34028235E39, 0.34028235E39) = LESS compare (~0.34028235E39, 0.17014117E39) = LESS compareReal (~0.34028235E39, 0.17014117E39) = LESS compare (~0.34028235E39, 0.123E4) = LESS compareReal (~0.34028235E39, 0.123E4) = LESS compare (~0.34028235E39, 0.123E2) = LESS compareReal (~0.34028235E39, 0.123E2) = LESS compare (~0.34028235E39, 0.31415927E1) = LESS compareReal (~0.34028235E39, 0.31415927E1) = LESS compare (~0.34028235E39, 0.27182817E1) = LESS compareReal (~0.34028235E39, 0.27182817E1) = LESS compare (~0.34028235E39, 0.123E1) = LESS compareReal (~0.34028235E39, 0.123E1) = LESS compare (~0.34028235E39, 0.123) = LESS compareReal (~0.34028235E39, 0.123) = LESS compare (~0.34028235E39, 0.123E~2) = LESS compareReal (~0.34028235E39, 0.123E~2) = LESS compare (~0.34028235E39, 0.11754944E~37) = LESS compareReal (~0.34028235E39, 0.11754944E~37) = LESS compare (~0.34028235E39, 0.5877472E~38) = LESS compareReal (~0.34028235E39, 0.5877472E~38) = LESS compare (~0.34028235E39, 0.1E~44) = LESS compareReal (~0.34028235E39, 0.1E~44) = LESS compare (~0.34028235E39, 0.0) = LESS compareReal (~0.34028235E39, 0.0) = LESS compare (~0.34028235E39, ~0.34028235E39) = EQUAL compareReal (~0.34028235E39, ~0.34028235E39) = EQUAL compare (~0.34028235E39, ~0.17014117E39) = LESS compareReal (~0.34028235E39, ~0.17014117E39) = LESS compare (~0.34028235E39, ~0.123E4) = LESS compareReal (~0.34028235E39, ~0.123E4) = LESS compare (~0.34028235E39, ~0.123E2) = LESS compareReal (~0.34028235E39, ~0.123E2) = LESS compare (~0.34028235E39, ~0.31415927E1) = LESS compareReal (~0.34028235E39, ~0.31415927E1) = LESS compare (~0.34028235E39, ~0.27182817E1) = LESS compareReal (~0.34028235E39, ~0.27182817E1) = LESS compare (~0.34028235E39, ~0.123E1) = LESS compareReal (~0.34028235E39, ~0.123E1) = LESS compare (~0.34028235E39, ~0.123) = LESS compareReal (~0.34028235E39, ~0.123) = LESS compare (~0.34028235E39, ~0.123E~2) = LESS compareReal (~0.34028235E39, ~0.123E~2) = LESS compare (~0.34028235E39, ~0.11754944E~37) = LESS compareReal (~0.34028235E39, ~0.11754944E~37) = LESS compare (~0.34028235E39, ~0.5877472E~38) = LESS compareReal (~0.34028235E39, ~0.5877472E~38) = LESS compare (~0.34028235E39, ~0.1E~44) = LESS compareReal (~0.34028235E39, ~0.1E~44) = LESS compare (~0.34028235E39, ~0.0) = LESS compareReal (~0.34028235E39, ~0.0) = LESS compare (~0.17014117E39, 0.34028235E39) = LESS compareReal (~0.17014117E39, 0.34028235E39) = LESS compare (~0.17014117E39, 0.17014117E39) = LESS compareReal (~0.17014117E39, 0.17014117E39) = LESS compare (~0.17014117E39, 0.123E4) = LESS compareReal (~0.17014117E39, 0.123E4) = LESS compare (~0.17014117E39, 0.123E2) = LESS compareReal (~0.17014117E39, 0.123E2) = LESS compare (~0.17014117E39, 0.31415927E1) = LESS compareReal (~0.17014117E39, 0.31415927E1) = LESS compare (~0.17014117E39, 0.27182817E1) = LESS compareReal (~0.17014117E39, 0.27182817E1) = LESS compare (~0.17014117E39, 0.123E1) = LESS compareReal (~0.17014117E39, 0.123E1) = LESS compare (~0.17014117E39, 0.123) = LESS compareReal (~0.17014117E39, 0.123) = LESS compare (~0.17014117E39, 0.123E~2) = LESS compareReal (~0.17014117E39, 0.123E~2) = LESS compare (~0.17014117E39, 0.11754944E~37) = LESS compareReal (~0.17014117E39, 0.11754944E~37) = LESS compare (~0.17014117E39, 0.5877472E~38) = LESS compareReal (~0.17014117E39, 0.5877472E~38) = LESS compare (~0.17014117E39, 0.1E~44) = LESS compareReal (~0.17014117E39, 0.1E~44) = LESS compare (~0.17014117E39, 0.0) = LESS compareReal (~0.17014117E39, 0.0) = LESS compare (~0.17014117E39, ~0.34028235E39) = GREATER compareReal (~0.17014117E39, ~0.34028235E39) = GREATER compare (~0.17014117E39, ~0.17014117E39) = EQUAL compareReal (~0.17014117E39, ~0.17014117E39) = EQUAL compare (~0.17014117E39, ~0.123E4) = LESS compareReal (~0.17014117E39, ~0.123E4) = LESS compare (~0.17014117E39, ~0.123E2) = LESS compareReal (~0.17014117E39, ~0.123E2) = LESS compare (~0.17014117E39, ~0.31415927E1) = LESS compareReal (~0.17014117E39, ~0.31415927E1) = LESS compare (~0.17014117E39, ~0.27182817E1) = LESS compareReal (~0.17014117E39, ~0.27182817E1) = LESS compare (~0.17014117E39, ~0.123E1) = LESS compareReal (~0.17014117E39, ~0.123E1) = LESS compare (~0.17014117E39, ~0.123) = LESS compareReal (~0.17014117E39, ~0.123) = LESS compare (~0.17014117E39, ~0.123E~2) = LESS compareReal (~0.17014117E39, ~0.123E~2) = LESS compare (~0.17014117E39, ~0.11754944E~37) = LESS compareReal (~0.17014117E39, ~0.11754944E~37) = LESS compare (~0.17014117E39, ~0.5877472E~38) = LESS compareReal (~0.17014117E39, ~0.5877472E~38) = LESS compare (~0.17014117E39, ~0.1E~44) = LESS compareReal (~0.17014117E39, ~0.1E~44) = LESS compare (~0.17014117E39, ~0.0) = LESS compareReal (~0.17014117E39, ~0.0) = LESS compare (~0.123E4, 0.34028235E39) = LESS compareReal (~0.123E4, 0.34028235E39) = LESS compare (~0.123E4, 0.17014117E39) = LESS compareReal (~0.123E4, 0.17014117E39) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.31415927E1) = LESS compareReal (~0.123E4, 0.31415927E1) = LESS compare (~0.123E4, 0.27182817E1) = LESS compareReal (~0.123E4, 0.27182817E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.11754944E~37) = LESS compareReal (~0.123E4, 0.11754944E~37) = LESS compare (~0.123E4, 0.5877472E~38) = LESS compareReal (~0.123E4, 0.5877472E~38) = LESS compare (~0.123E4, 0.1E~44) = LESS compareReal (~0.123E4, 0.1E~44) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.34028235E39) = GREATER compareReal (~0.123E4, ~0.34028235E39) = GREATER compare (~0.123E4, ~0.17014117E39) = GREATER compareReal (~0.123E4, ~0.17014117E39) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.31415927E1) = LESS compareReal (~0.123E4, ~0.31415927E1) = LESS compare (~0.123E4, ~0.27182817E1) = LESS compareReal (~0.123E4, ~0.27182817E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.11754944E~37) = LESS compareReal (~0.123E4, ~0.11754944E~37) = LESS compare (~0.123E4, ~0.5877472E~38) = LESS compareReal (~0.123E4, ~0.5877472E~38) = LESS compare (~0.123E4, ~0.1E~44) = LESS compareReal (~0.123E4, ~0.1E~44) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.34028235E39) = LESS compareReal (~0.123E2, 0.34028235E39) = LESS compare (~0.123E2, 0.17014117E39) = LESS compareReal (~0.123E2, 0.17014117E39) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.31415927E1) = LESS compareReal (~0.123E2, 0.31415927E1) = LESS compare (~0.123E2, 0.27182817E1) = LESS compareReal (~0.123E2, 0.27182817E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.11754944E~37) = LESS compareReal (~0.123E2, 0.11754944E~37) = LESS compare (~0.123E2, 0.5877472E~38) = LESS compareReal (~0.123E2, 0.5877472E~38) = LESS compare (~0.123E2, 0.1E~44) = LESS compareReal (~0.123E2, 0.1E~44) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.34028235E39) = GREATER compareReal (~0.123E2, ~0.34028235E39) = GREATER compare (~0.123E2, ~0.17014117E39) = GREATER compareReal (~0.123E2, ~0.17014117E39) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.31415927E1) = LESS compareReal (~0.123E2, ~0.31415927E1) = LESS compare (~0.123E2, ~0.27182817E1) = LESS compareReal (~0.123E2, ~0.27182817E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.11754944E~37) = LESS compareReal (~0.123E2, ~0.11754944E~37) = LESS compare (~0.123E2, ~0.5877472E~38) = LESS compareReal (~0.123E2, ~0.5877472E~38) = LESS compare (~0.123E2, ~0.1E~44) = LESS compareReal (~0.123E2, ~0.1E~44) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.31415927E1, 0.34028235E39) = LESS compareReal (~0.31415927E1, 0.34028235E39) = LESS compare (~0.31415927E1, 0.17014117E39) = LESS compareReal (~0.31415927E1, 0.17014117E39) = LESS compare (~0.31415927E1, 0.123E4) = LESS compareReal (~0.31415927E1, 0.123E4) = LESS compare (~0.31415927E1, 0.123E2) = LESS compareReal (~0.31415927E1, 0.123E2) = LESS compare (~0.31415927E1, 0.31415927E1) = LESS compareReal (~0.31415927E1, 0.31415927E1) = LESS compare (~0.31415927E1, 0.27182817E1) = LESS compareReal (~0.31415927E1, 0.27182817E1) = LESS compare (~0.31415927E1, 0.123E1) = LESS compareReal (~0.31415927E1, 0.123E1) = LESS compare (~0.31415927E1, 0.123) = LESS compareReal (~0.31415927E1, 0.123) = LESS compare (~0.31415927E1, 0.123E~2) = LESS compareReal (~0.31415927E1, 0.123E~2) = LESS compare (~0.31415927E1, 0.11754944E~37) = LESS compareReal (~0.31415927E1, 0.11754944E~37) = LESS compare (~0.31415927E1, 0.5877472E~38) = LESS compareReal (~0.31415927E1, 0.5877472E~38) = LESS compare (~0.31415927E1, 0.1E~44) = LESS compareReal (~0.31415927E1, 0.1E~44) = LESS compare (~0.31415927E1, 0.0) = LESS compareReal (~0.31415927E1, 0.0) = LESS compare (~0.31415927E1, ~0.34028235E39) = GREATER compareReal (~0.31415927E1, ~0.34028235E39) = GREATER compare (~0.31415927E1, ~0.17014117E39) = GREATER compareReal (~0.31415927E1, ~0.17014117E39) = GREATER compare (~0.31415927E1, ~0.123E4) = GREATER compareReal (~0.31415927E1, ~0.123E4) = GREATER compare (~0.31415927E1, ~0.123E2) = GREATER compareReal (~0.31415927E1, ~0.123E2) = GREATER compare (~0.31415927E1, ~0.31415927E1) = EQUAL compareReal (~0.31415927E1, ~0.31415927E1) = EQUAL compare (~0.31415927E1, ~0.27182817E1) = LESS compareReal (~0.31415927E1, ~0.27182817E1) = LESS compare (~0.31415927E1, ~0.123E1) = LESS compareReal (~0.31415927E1, ~0.123E1) = LESS compare (~0.31415927E1, ~0.123) = LESS compareReal (~0.31415927E1, ~0.123) = LESS compare (~0.31415927E1, ~0.123E~2) = LESS compareReal (~0.31415927E1, ~0.123E~2) = LESS compare (~0.31415927E1, ~0.11754944E~37) = LESS compareReal (~0.31415927E1, ~0.11754944E~37) = LESS compare (~0.31415927E1, ~0.5877472E~38) = LESS compareReal (~0.31415927E1, ~0.5877472E~38) = LESS compare (~0.31415927E1, ~0.1E~44) = LESS compareReal (~0.31415927E1, ~0.1E~44) = LESS compare (~0.31415927E1, ~0.0) = LESS compareReal (~0.31415927E1, ~0.0) = LESS compare (~0.27182817E1, 0.34028235E39) = LESS compareReal (~0.27182817E1, 0.34028235E39) = LESS compare (~0.27182817E1, 0.17014117E39) = LESS compareReal (~0.27182817E1, 0.17014117E39) = LESS compare (~0.27182817E1, 0.123E4) = LESS compareReal (~0.27182817E1, 0.123E4) = LESS compare (~0.27182817E1, 0.123E2) = LESS compareReal (~0.27182817E1, 0.123E2) = LESS compare (~0.27182817E1, 0.31415927E1) = LESS compareReal (~0.27182817E1, 0.31415927E1) = LESS compare (~0.27182817E1, 0.27182817E1) = LESS compareReal (~0.27182817E1, 0.27182817E1) = LESS compare (~0.27182817E1, 0.123E1) = LESS compareReal (~0.27182817E1, 0.123E1) = LESS compare (~0.27182817E1, 0.123) = LESS compareReal (~0.27182817E1, 0.123) = LESS compare (~0.27182817E1, 0.123E~2) = LESS compareReal (~0.27182817E1, 0.123E~2) = LESS compare (~0.27182817E1, 0.11754944E~37) = LESS compareReal (~0.27182817E1, 0.11754944E~37) = LESS compare (~0.27182817E1, 0.5877472E~38) = LESS compareReal (~0.27182817E1, 0.5877472E~38) = LESS compare (~0.27182817E1, 0.1E~44) = LESS compareReal (~0.27182817E1, 0.1E~44) = LESS compare (~0.27182817E1, 0.0) = LESS compareReal (~0.27182817E1, 0.0) = LESS compare (~0.27182817E1, ~0.34028235E39) = GREATER compareReal (~0.27182817E1, ~0.34028235E39) = GREATER compare (~0.27182817E1, ~0.17014117E39) = GREATER compareReal (~0.27182817E1, ~0.17014117E39) = GREATER compare (~0.27182817E1, ~0.123E4) = GREATER compareReal (~0.27182817E1, ~0.123E4) = GREATER compare (~0.27182817E1, ~0.123E2) = GREATER compareReal (~0.27182817E1, ~0.123E2) = GREATER compare (~0.27182817E1, ~0.31415927E1) = GREATER compareReal (~0.27182817E1, ~0.31415927E1) = GREATER compare (~0.27182817E1, ~0.27182817E1) = EQUAL compareReal (~0.27182817E1, ~0.27182817E1) = EQUAL compare (~0.27182817E1, ~0.123E1) = LESS compareReal (~0.27182817E1, ~0.123E1) = LESS compare (~0.27182817E1, ~0.123) = LESS compareReal (~0.27182817E1, ~0.123) = LESS compare (~0.27182817E1, ~0.123E~2) = LESS compareReal (~0.27182817E1, ~0.123E~2) = LESS compare (~0.27182817E1, ~0.11754944E~37) = LESS compareReal (~0.27182817E1, ~0.11754944E~37) = LESS compare (~0.27182817E1, ~0.5877472E~38) = LESS compareReal (~0.27182817E1, ~0.5877472E~38) = LESS compare (~0.27182817E1, ~0.1E~44) = LESS compareReal (~0.27182817E1, ~0.1E~44) = LESS compare (~0.27182817E1, ~0.0) = LESS compareReal (~0.27182817E1, ~0.0) = LESS compare (~0.123E1, 0.34028235E39) = LESS compareReal (~0.123E1, 0.34028235E39) = LESS compare (~0.123E1, 0.17014117E39) = LESS compareReal (~0.123E1, 0.17014117E39) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.31415927E1) = LESS compareReal (~0.123E1, 0.31415927E1) = LESS compare (~0.123E1, 0.27182817E1) = LESS compareReal (~0.123E1, 0.27182817E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.11754944E~37) = LESS compareReal (~0.123E1, 0.11754944E~37) = LESS compare (~0.123E1, 0.5877472E~38) = LESS compareReal (~0.123E1, 0.5877472E~38) = LESS compare (~0.123E1, 0.1E~44) = LESS compareReal (~0.123E1, 0.1E~44) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.34028235E39) = GREATER compareReal (~0.123E1, ~0.34028235E39) = GREATER compare (~0.123E1, ~0.17014117E39) = GREATER compareReal (~0.123E1, ~0.17014117E39) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.31415927E1) = GREATER compareReal (~0.123E1, ~0.31415927E1) = GREATER compare (~0.123E1, ~0.27182817E1) = GREATER compareReal (~0.123E1, ~0.27182817E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.11754944E~37) = LESS compareReal (~0.123E1, ~0.11754944E~37) = LESS compare (~0.123E1, ~0.5877472E~38) = LESS compareReal (~0.123E1, ~0.5877472E~38) = LESS compare (~0.123E1, ~0.1E~44) = LESS compareReal (~0.123E1, ~0.1E~44) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.34028235E39) = LESS compareReal (~0.123, 0.34028235E39) = LESS compare (~0.123, 0.17014117E39) = LESS compareReal (~0.123, 0.17014117E39) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.31415927E1) = LESS compareReal (~0.123, 0.31415927E1) = LESS compare (~0.123, 0.27182817E1) = LESS compareReal (~0.123, 0.27182817E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.11754944E~37) = LESS compareReal (~0.123, 0.11754944E~37) = LESS compare (~0.123, 0.5877472E~38) = LESS compareReal (~0.123, 0.5877472E~38) = LESS compare (~0.123, 0.1E~44) = LESS compareReal (~0.123, 0.1E~44) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.34028235E39) = GREATER compareReal (~0.123, ~0.34028235E39) = GREATER compare (~0.123, ~0.17014117E39) = GREATER compareReal (~0.123, ~0.17014117E39) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.31415927E1) = GREATER compareReal (~0.123, ~0.31415927E1) = GREATER compare (~0.123, ~0.27182817E1) = GREATER compareReal (~0.123, ~0.27182817E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.11754944E~37) = LESS compareReal (~0.123, ~0.11754944E~37) = LESS compare (~0.123, ~0.5877472E~38) = LESS compareReal (~0.123, ~0.5877472E~38) = LESS compare (~0.123, ~0.1E~44) = LESS compareReal (~0.123, ~0.1E~44) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.34028235E39) = LESS compareReal (~0.123E~2, 0.34028235E39) = LESS compare (~0.123E~2, 0.17014117E39) = LESS compareReal (~0.123E~2, 0.17014117E39) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.31415927E1) = LESS compareReal (~0.123E~2, 0.31415927E1) = LESS compare (~0.123E~2, 0.27182817E1) = LESS compareReal (~0.123E~2, 0.27182817E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.11754944E~37) = LESS compareReal (~0.123E~2, 0.11754944E~37) = LESS compare (~0.123E~2, 0.5877472E~38) = LESS compareReal (~0.123E~2, 0.5877472E~38) = LESS compare (~0.123E~2, 0.1E~44) = LESS compareReal (~0.123E~2, 0.1E~44) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.34028235E39) = GREATER compareReal (~0.123E~2, ~0.34028235E39) = GREATER compare (~0.123E~2, ~0.17014117E39) = GREATER compareReal (~0.123E~2, ~0.17014117E39) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.31415927E1) = GREATER compareReal (~0.123E~2, ~0.31415927E1) = GREATER compare (~0.123E~2, ~0.27182817E1) = GREATER compareReal (~0.123E~2, ~0.27182817E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.11754944E~37) = LESS compareReal (~0.123E~2, ~0.11754944E~37) = LESS compare (~0.123E~2, ~0.5877472E~38) = LESS compareReal (~0.123E~2, ~0.5877472E~38) = LESS compare (~0.123E~2, ~0.1E~44) = LESS compareReal (~0.123E~2, ~0.1E~44) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.11754944E~37, 0.34028235E39) = LESS compareReal (~0.11754944E~37, 0.34028235E39) = LESS compare (~0.11754944E~37, 0.17014117E39) = LESS compareReal (~0.11754944E~37, 0.17014117E39) = LESS compare (~0.11754944E~37, 0.123E4) = LESS compareReal (~0.11754944E~37, 0.123E4) = LESS compare (~0.11754944E~37, 0.123E2) = LESS compareReal (~0.11754944E~37, 0.123E2) = LESS compare (~0.11754944E~37, 0.31415927E1) = LESS compareReal (~0.11754944E~37, 0.31415927E1) = LESS compare (~0.11754944E~37, 0.27182817E1) = LESS compareReal (~0.11754944E~37, 0.27182817E1) = LESS compare (~0.11754944E~37, 0.123E1) = LESS compareReal (~0.11754944E~37, 0.123E1) = LESS compare (~0.11754944E~37, 0.123) = LESS compareReal (~0.11754944E~37, 0.123) = LESS compare (~0.11754944E~37, 0.123E~2) = LESS compareReal (~0.11754944E~37, 0.123E~2) = LESS compare (~0.11754944E~37, 0.11754944E~37) = LESS compareReal (~0.11754944E~37, 0.11754944E~37) = LESS compare (~0.11754944E~37, 0.5877472E~38) = LESS compareReal (~0.11754944E~37, 0.5877472E~38) = LESS compare (~0.11754944E~37, 0.1E~44) = LESS compareReal (~0.11754944E~37, 0.1E~44) = LESS compare (~0.11754944E~37, 0.0) = LESS compareReal (~0.11754944E~37, 0.0) = LESS compare (~0.11754944E~37, ~0.34028235E39) = GREATER compareReal (~0.11754944E~37, ~0.34028235E39) = GREATER compare (~0.11754944E~37, ~0.17014117E39) = GREATER compareReal (~0.11754944E~37, ~0.17014117E39) = GREATER compare (~0.11754944E~37, ~0.123E4) = GREATER compareReal (~0.11754944E~37, ~0.123E4) = GREATER compare (~0.11754944E~37, ~0.123E2) = GREATER compareReal (~0.11754944E~37, ~0.123E2) = GREATER compare (~0.11754944E~37, ~0.31415927E1) = GREATER compareReal (~0.11754944E~37, ~0.31415927E1) = GREATER compare (~0.11754944E~37, ~0.27182817E1) = GREATER compareReal (~0.11754944E~37, ~0.27182817E1) = GREATER compare (~0.11754944E~37, ~0.123E1) = GREATER compareReal (~0.11754944E~37, ~0.123E1) = GREATER compare (~0.11754944E~37, ~0.123) = GREATER compareReal (~0.11754944E~37, ~0.123) = GREATER compare (~0.11754944E~37, ~0.123E~2) = GREATER compareReal (~0.11754944E~37, ~0.123E~2) = GREATER compare (~0.11754944E~37, ~0.11754944E~37) = EQUAL compareReal (~0.11754944E~37, ~0.11754944E~37) = EQUAL compare (~0.11754944E~37, ~0.5877472E~38) = LESS compareReal (~0.11754944E~37, ~0.5877472E~38) = LESS compare (~0.11754944E~37, ~0.1E~44) = LESS compareReal (~0.11754944E~37, ~0.1E~44) = LESS compare (~0.11754944E~37, ~0.0) = LESS compareReal (~0.11754944E~37, ~0.0) = LESS compare (~0.5877472E~38, 0.34028235E39) = LESS compareReal (~0.5877472E~38, 0.34028235E39) = LESS compare (~0.5877472E~38, 0.17014117E39) = LESS compareReal (~0.5877472E~38, 0.17014117E39) = LESS compare (~0.5877472E~38, 0.123E4) = LESS compareReal (~0.5877472E~38, 0.123E4) = LESS compare (~0.5877472E~38, 0.123E2) = LESS compareReal (~0.5877472E~38, 0.123E2) = LESS compare (~0.5877472E~38, 0.31415927E1) = LESS compareReal (~0.5877472E~38, 0.31415927E1) = LESS compare (~0.5877472E~38, 0.27182817E1) = LESS compareReal (~0.5877472E~38, 0.27182817E1) = LESS compare (~0.5877472E~38, 0.123E1) = LESS compareReal (~0.5877472E~38, 0.123E1) = LESS compare (~0.5877472E~38, 0.123) = LESS compareReal (~0.5877472E~38, 0.123) = LESS compare (~0.5877472E~38, 0.123E~2) = LESS compareReal (~0.5877472E~38, 0.123E~2) = LESS compare (~0.5877472E~38, 0.11754944E~37) = LESS compareReal (~0.5877472E~38, 0.11754944E~37) = LESS compare (~0.5877472E~38, 0.5877472E~38) = LESS compareReal (~0.5877472E~38, 0.5877472E~38) = LESS compare (~0.5877472E~38, 0.1E~44) = LESS compareReal (~0.5877472E~38, 0.1E~44) = LESS compare (~0.5877472E~38, 0.0) = LESS compareReal (~0.5877472E~38, 0.0) = LESS compare (~0.5877472E~38, ~0.34028235E39) = GREATER compareReal (~0.5877472E~38, ~0.34028235E39) = GREATER compare (~0.5877472E~38, ~0.17014117E39) = GREATER compareReal (~0.5877472E~38, ~0.17014117E39) = GREATER compare (~0.5877472E~38, ~0.123E4) = GREATER compareReal (~0.5877472E~38, ~0.123E4) = GREATER compare (~0.5877472E~38, ~0.123E2) = GREATER compareReal (~0.5877472E~38, ~0.123E2) = GREATER compare (~0.5877472E~38, ~0.31415927E1) = GREATER compareReal (~0.5877472E~38, ~0.31415927E1) = GREATER compare (~0.5877472E~38, ~0.27182817E1) = GREATER compareReal (~0.5877472E~38, ~0.27182817E1) = GREATER compare (~0.5877472E~38, ~0.123E1) = GREATER compareReal (~0.5877472E~38, ~0.123E1) = GREATER compare (~0.5877472E~38, ~0.123) = GREATER compareReal (~0.5877472E~38, ~0.123) = GREATER compare (~0.5877472E~38, ~0.123E~2) = GREATER compareReal (~0.5877472E~38, ~0.123E~2) = GREATER compare (~0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (~0.5877472E~38, ~0.11754944E~37) = GREATER compare (~0.5877472E~38, ~0.5877472E~38) = EQUAL compareReal (~0.5877472E~38, ~0.5877472E~38) = EQUAL compare (~0.5877472E~38, ~0.1E~44) = LESS compareReal (~0.5877472E~38, ~0.1E~44) = LESS compare (~0.5877472E~38, ~0.0) = LESS compareReal (~0.5877472E~38, ~0.0) = LESS compare (~0.1E~44, 0.34028235E39) = LESS compareReal (~0.1E~44, 0.34028235E39) = LESS compare (~0.1E~44, 0.17014117E39) = LESS compareReal (~0.1E~44, 0.17014117E39) = LESS compare (~0.1E~44, 0.123E4) = LESS compareReal (~0.1E~44, 0.123E4) = LESS compare (~0.1E~44, 0.123E2) = LESS compareReal (~0.1E~44, 0.123E2) = LESS compare (~0.1E~44, 0.31415927E1) = LESS compareReal (~0.1E~44, 0.31415927E1) = LESS compare (~0.1E~44, 0.27182817E1) = LESS compareReal (~0.1E~44, 0.27182817E1) = LESS compare (~0.1E~44, 0.123E1) = LESS compareReal (~0.1E~44, 0.123E1) = LESS compare (~0.1E~44, 0.123) = LESS compareReal (~0.1E~44, 0.123) = LESS compare (~0.1E~44, 0.123E~2) = LESS compareReal (~0.1E~44, 0.123E~2) = LESS compare (~0.1E~44, 0.11754944E~37) = LESS compareReal (~0.1E~44, 0.11754944E~37) = LESS compare (~0.1E~44, 0.5877472E~38) = LESS compareReal (~0.1E~44, 0.5877472E~38) = LESS compare (~0.1E~44, 0.1E~44) = LESS compareReal (~0.1E~44, 0.1E~44) = LESS compare (~0.1E~44, 0.0) = LESS compareReal (~0.1E~44, 0.0) = LESS compare (~0.1E~44, ~0.34028235E39) = GREATER compareReal (~0.1E~44, ~0.34028235E39) = GREATER compare (~0.1E~44, ~0.17014117E39) = GREATER compareReal (~0.1E~44, ~0.17014117E39) = GREATER compare (~0.1E~44, ~0.123E4) = GREATER compareReal (~0.1E~44, ~0.123E4) = GREATER compare (~0.1E~44, ~0.123E2) = GREATER compareReal (~0.1E~44, ~0.123E2) = GREATER compare (~0.1E~44, ~0.31415927E1) = GREATER compareReal (~0.1E~44, ~0.31415927E1) = GREATER compare (~0.1E~44, ~0.27182817E1) = GREATER compareReal (~0.1E~44, ~0.27182817E1) = GREATER compare (~0.1E~44, ~0.123E1) = GREATER compareReal (~0.1E~44, ~0.123E1) = GREATER compare (~0.1E~44, ~0.123) = GREATER compareReal (~0.1E~44, ~0.123) = GREATER compare (~0.1E~44, ~0.123E~2) = GREATER compareReal (~0.1E~44, ~0.123E~2) = GREATER compare (~0.1E~44, ~0.11754944E~37) = GREATER compareReal (~0.1E~44, ~0.11754944E~37) = GREATER compare (~0.1E~44, ~0.5877472E~38) = GREATER compareReal (~0.1E~44, ~0.5877472E~38) = GREATER compare (~0.1E~44, ~0.1E~44) = EQUAL compareReal (~0.1E~44, ~0.1E~44) = EQUAL compare (~0.1E~44, ~0.0) = LESS compareReal (~0.1E~44, ~0.0) = LESS compare (~0.0, 0.34028235E39) = LESS compareReal (~0.0, 0.34028235E39) = LESS compare (~0.0, 0.17014117E39) = LESS compareReal (~0.0, 0.17014117E39) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.31415927E1) = LESS compareReal (~0.0, 0.31415927E1) = LESS compare (~0.0, 0.27182817E1) = LESS compareReal (~0.0, 0.27182817E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.11754944E~37) = LESS compareReal (~0.0, 0.11754944E~37) = LESS compare (~0.0, 0.5877472E~38) = LESS compareReal (~0.0, 0.5877472E~38) = LESS compare (~0.0, 0.1E~44) = LESS compareReal (~0.0, 0.1E~44) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.34028235E39) = GREATER compareReal (~0.0, ~0.34028235E39) = GREATER compare (~0.0, ~0.17014117E39) = GREATER compareReal (~0.0, ~0.17014117E39) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.31415927E1) = GREATER compareReal (~0.0, ~0.31415927E1) = GREATER compare (~0.0, ~0.27182817E1) = GREATER compareReal (~0.0, ~0.27182817E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.11754944E~37) = GREATER compareReal (~0.0, ~0.11754944E~37) = GREATER compare (~0.0, ~0.5877472E~38) = GREATER compareReal (~0.0, ~0.5877472E~38) = GREATER compare (~0.0, ~0.1E~44) = GREATER compareReal (~0.0, ~0.1E~44) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.17976931348623157E309) = ~0.17976931348623157E309 ~ (0.8988465674311579E308) = ~0.8988465674311579E308 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.3141592653589793E1) = ~0.3141592653589793E1 ~ (0.2718281828459045E1) = ~0.2718281828459045E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.22250738585072014E~307) = ~0.22250738585072014E~307 ~ (0.11125369292536007E~307) = ~0.11125369292536007E~307 ~ (0.5E~323) = ~0.5E~323 ~ (0.0) = ~0.0 ~ (~0.17976931348623157E309) = 0.17976931348623157E309 ~ (~0.8988465674311579E308) = 0.8988465674311579E308 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.3141592653589793E1) = 0.3141592653589793E1 ~ (~0.2718281828459045E1) = 0.2718281828459045E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.22250738585072014E~307) = 0.22250738585072014E~307 ~ (~0.11125369292536007E~307) = 0.11125369292536007E~307 ~ (~0.5E~323) = 0.5E~323 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.17976931348623157E309, 0.17976931348623157E309) = inf + (0.17976931348623157E309, 0.17976931348623157E309) = inf - (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 / (0.17976931348623157E309, 0.17976931348623157E309) = 0.1E1 nextAfter (0.17976931348623157E309, 0.17976931348623157E309) = 0.17976931348623157E309 rem (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, 0.8988465674311579E308) = inf + (0.17976931348623157E309, 0.8988465674311579E308) = inf - (0.17976931348623157E309, 0.8988465674311579E308) = 0.8988465674311579E308 / (0.17976931348623157E309, 0.8988465674311579E308) = 0.2E1 nextAfter (0.17976931348623157E309, 0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, 0.123E4) = inf + (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E4) = 0.1461539134034403E306 nextAfter (0.17976931348623157E309, 0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E4) = 0.0 * (0.17976931348623157E309, 0.123E2) = inf + (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E2) = 0.1461539134034403E308 nextAfter (0.17976931348623157E309, 0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E2) = 0.0 * (0.17976931348623157E309, 0.3141592653589793E1) = inf + (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, 0.2718281828459045E1) = inf + (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.2718281828459045E1) = 0.661334345850887E308 nextAfter (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123E1) = inf + (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E1) = 0.1461539134034403E309 nextAfter (0.17976931348623157E309, 0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, 0.123) = 0.22111625558806483E308 + (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123) = inf nextAfter (0.17976931348623157E309, 0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123) = ~inf * (0.17976931348623157E309, 0.123E~2) = 0.2211162555880648E306 + (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E~2) = inf nextAfter (0.17976931348623157E309, 0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E~2) = ~inf * (0.17976931348623157E309, 0.22250738585072014E~307) = 0.39999999999999996E1 + (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.22250738585072014E~307) = inf nextAfter (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, 0.11125369292536007E~307) = 0.19999999999999998E1 + (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.11125369292536007E~307) = inf nextAfter (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, 0.5E~323) = 0.8881784197001251E~15 + (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.5E~323) = inf nextAfter (0.17976931348623157E309, 0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.5E~323) = ~inf * (0.17976931348623157E309, 0.0) = 0.0 + (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.0) = inf nextAfter (0.17976931348623157E309, 0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.0) = nan * (0.17976931348623157E309, ~0.17976931348623157E309) = ~inf + (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 - (0.17976931348623157E309, ~0.17976931348623157E309) = inf / (0.17976931348623157E309, ~0.17976931348623157E309) = ~0.1E1 nextAfter (0.17976931348623157E309, ~0.17976931348623157E309) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, ~0.8988465674311579E308) = ~inf + (0.17976931348623157E309, ~0.8988465674311579E308) = 0.8988465674311579E308 - (0.17976931348623157E309, ~0.8988465674311579E308) = inf / (0.17976931348623157E309, ~0.8988465674311579E308) = ~0.2E1 nextAfter (0.17976931348623157E309, ~0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, ~0.123E4) = ~inf + (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E4) = ~0.1461539134034403E306 nextAfter (0.17976931348623157E309, ~0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E4) = 0.0 * (0.17976931348623157E309, ~0.123E2) = ~inf + (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E2) = ~0.1461539134034403E308 nextAfter (0.17976931348623157E309, ~0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E2) = 0.0 * (0.17976931348623157E309, ~0.3141592653589793E1) = ~inf + (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (0.17976931348623157E309, ~0.2718281828459045E1) = ~inf + (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.2718281828459045E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123E1) = ~inf + (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E1) = ~0.1461539134034403E309 nextAfter (0.17976931348623157E309, ~0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E1) = 0.199584030953472E293 * (0.17976931348623157E309, ~0.123) = ~0.22111625558806483E308 + (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123) = ~inf nextAfter (0.17976931348623157E309, ~0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123) = ~inf * (0.17976931348623157E309, ~0.123E~2) = ~0.2211162555880648E306 + (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E~2) = ~inf nextAfter (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E~2) = ~inf * (0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.39999999999999996E1 + (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.19999999999999998E1 + (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, ~0.5E~323) = ~0.8881784197001251E~15 + (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.5E~323) = ~inf nextAfter (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.5E~323) = ~inf * (0.17976931348623157E309, ~0.0) = ~0.0 + (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.0) = ~inf nextAfter (0.17976931348623157E309, ~0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.0) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.17976931348623157E309, ~inf) = ~inf + (0.17976931348623157E309, ~inf) = ~inf - (0.17976931348623157E309, ~inf) = inf / (0.17976931348623157E309, ~inf) = ~0.0 nextAfter (0.17976931348623157E309, ~inf) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~inf) = 0.17976931348623157E309 * (0.17976931348623157E309, nan) = nan + (0.17976931348623157E309, nan) = nan - (0.17976931348623157E309, nan) = nan / (0.17976931348623157E309, nan) = nan nextAfter (0.17976931348623157E309, nan) = nan rem (0.17976931348623157E309, nan) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.8988465674311579E308, 0.17976931348623157E309) = inf + (0.8988465674311579E308, 0.17976931348623157E309) = inf - (0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 / (0.8988465674311579E308, 0.17976931348623157E309) = 0.5 nextAfter (0.8988465674311579E308, 0.17976931348623157E309) = 0.898846567431158E308 rem (0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, 0.8988465674311579E308) = inf + (0.8988465674311579E308, 0.8988465674311579E308) = 0.17976931348623157E309 - (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 / (0.8988465674311579E308, 0.8988465674311579E308) = 0.1E1 nextAfter (0.8988465674311579E308, 0.8988465674311579E308) = 0.8988465674311579E308 rem (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, 0.123E4) = inf + (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E4) = 0.7307695670172015E305 nextAfter (0.8988465674311579E308, 0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E4) = 0.0 * (0.8988465674311579E308, 0.123E2) = inf + (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E2) = 0.7307695670172014E307 nextAfter (0.8988465674311579E308, 0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E2) = 0.0 * (0.8988465674311579E308, 0.3141592653589793E1) = inf + (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, 0.2718281828459045E1) = inf + (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123E1) = 0.1105581277940324E309 + (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E1) = 0.7307695670172015E308 nextAfter (0.8988465674311579E308, 0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, 0.123) = 0.11055812779403241E308 + (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123) = inf nextAfter (0.8988465674311579E308, 0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123) = ~inf * (0.8988465674311579E308, 0.123E~2) = 0.1105581277940324E306 + (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E~2) = inf nextAfter (0.8988465674311579E308, 0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E~2) = ~inf * (0.8988465674311579E308, 0.22250738585072014E~307) = 0.19999999999999998E1 + (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.22250738585072014E~307) = inf nextAfter (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, 0.11125369292536007E~307) = 0.9999999999999999 + (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.11125369292536007E~307) = inf nextAfter (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, 0.5E~323) = 0.44408920985006257E~15 + (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.5E~323) = inf nextAfter (0.8988465674311579E308, 0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.5E~323) = ~inf * (0.8988465674311579E308, 0.0) = 0.0 + (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.0) = inf nextAfter (0.8988465674311579E308, 0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.0) = nan * (0.8988465674311579E308, ~0.17976931348623157E309) = ~inf + (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 - (0.8988465674311579E308, ~0.17976931348623157E309) = inf / (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.5 nextAfter (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, ~0.8988465674311579E308) = ~inf + (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 - (0.8988465674311579E308, ~0.8988465674311579E308) = 0.17976931348623157E309 / (0.8988465674311579E308, ~0.8988465674311579E308) = ~0.1E1 nextAfter (0.8988465674311579E308, ~0.8988465674311579E308) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, ~0.123E4) = ~inf + (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E4) = ~0.7307695670172015E305 nextAfter (0.8988465674311579E308, ~0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E4) = 0.0 * (0.8988465674311579E308, ~0.123E2) = ~inf + (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E2) = ~0.7307695670172014E307 nextAfter (0.8988465674311579E308, ~0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E2) = 0.0 * (0.8988465674311579E308, ~0.3141592653589793E1) = ~inf + (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (0.8988465674311579E308, ~0.2718281828459045E1) = ~inf + (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.2718281828459045E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123E1) = ~0.1105581277940324E309 + (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E1) = ~0.7307695670172015E308 nextAfter (0.8988465674311579E308, ~0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E1) = 0.99792015476736E292 * (0.8988465674311579E308, ~0.123) = ~0.11055812779403241E308 + (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123) = ~inf nextAfter (0.8988465674311579E308, ~0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123) = ~inf * (0.8988465674311579E308, ~0.123E~2) = ~0.1105581277940324E306 + (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E~2) = ~inf nextAfter (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E~2) = ~inf * (0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.19999999999999998E1 + (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.9999999999999999 + (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, ~0.5E~323) = ~0.44408920985006257E~15 + (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.5E~323) = ~inf nextAfter (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.5E~323) = ~inf * (0.8988465674311579E308, ~0.0) = ~0.0 + (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.0) = ~inf nextAfter (0.8988465674311579E308, ~0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.0) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.8988465674311579E308, ~inf) = ~inf + (0.8988465674311579E308, ~inf) = ~inf - (0.8988465674311579E308, ~inf) = inf / (0.8988465674311579E308, ~inf) = ~0.0 nextAfter (0.8988465674311579E308, ~inf) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~inf) = 0.8988465674311579E308 * (0.8988465674311579E308, nan) = nan + (0.8988465674311579E308, nan) = nan - (0.8988465674311579E308, nan) = nan / (0.8988465674311579E308, nan) = nan nextAfter (0.8988465674311579E308, nan) = nan rem (0.8988465674311579E308, nan) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.123E4, 0.17976931348623157E309) = inf + (0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E4, 0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (0.123E4, 0.17976931348623157E309) = 0.12300000000000002E4 rem (0.123E4, 0.17976931348623157E309) = 0.123E4 * (0.123E4, 0.8988465674311579E308) = inf + (0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E4, 0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (0.123E4, 0.8988465674311579E308) = 0.12300000000000002E4 rem (0.123E4, 0.8988465674311579E308) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999999999998E4 rem (0.123E4, 0.123E2) = 0.0 * (0.123E4, 0.3141592653589793E1) = 0.38641589639154454E4 + (0.123E4, 0.3141592653589793E1) = 0.123314159265359E4 - (0.123E4, 0.3141592653589793E1) = 0.122685840734641E4 / (0.123E4, 0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (0.123E4, 0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, 0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, 0.2718281828459045E1) = 0.33434866490046256E4 + (0.123E4, 0.2718281828459045E1) = 0.1232718281828459E4 - (0.123E4, 0.2718281828459045E1) = 0.1227281718171541E4 / (0.123E4, 0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (0.123E4, 0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, 0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999999999998E4 rem (0.123E4, 0.123E1) = 0.0 * (0.123E4, 0.123) = 0.15129E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999999999998E4 rem (0.123E4, 0.123) = 0.0 * (0.123E4, 0.123E~2) = 0.15129E1 + (0.123E4, 0.123E~2) = 0.123000123E4 - (0.123E4, 0.123E~2) = 0.122999877E4 / (0.123E4, 0.123E~2) = 0.1E7 nextAfter (0.123E4, 0.123E~2) = 0.12299999999999998E4 rem (0.123E4, 0.123E~2) = 0.0 * (0.123E4, 0.22250738585072014E~307) = 0.27368408459638577E~304 + (0.123E4, 0.22250738585072014E~307) = 0.123E4 - (0.123E4, 0.22250738585072014E~307) = 0.123E4 / (0.123E4, 0.22250738585072014E~307) = inf nextAfter (0.123E4, 0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, 0.22250738585072014E~307) = ~inf * (0.123E4, 0.11125369292536007E~307) = 0.13684204229819289E~304 + (0.123E4, 0.11125369292536007E~307) = 0.123E4 - (0.123E4, 0.11125369292536007E~307) = 0.123E4 / (0.123E4, 0.11125369292536007E~307) = inf nextAfter (0.123E4, 0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, 0.11125369292536007E~307) = ~inf * (0.123E4, 0.5E~323) = 0.6077E~320 + (0.123E4, 0.5E~323) = 0.123E4 - (0.123E4, 0.5E~323) = 0.123E4 / (0.123E4, 0.5E~323) = inf nextAfter (0.123E4, 0.5E~323) = 0.12299999999999998E4 rem (0.123E4, 0.5E~323) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999999999998E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.17976931348623157E309) = ~inf + (0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E4, ~0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (0.123E4, ~0.17976931348623157E309) = 0.12299999999999998E4 rem (0.123E4, ~0.17976931348623157E309) = 0.123E4 * (0.123E4, ~0.8988465674311579E308) = ~inf + (0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E4, ~0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (0.123E4, ~0.8988465674311579E308) = 0.12299999999999998E4 rem (0.123E4, ~0.8988465674311579E308) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999999999998E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E2) = 0.0 * (0.123E4, ~0.3141592653589793E1) = ~0.38641589639154454E4 + (0.123E4, ~0.3141592653589793E1) = 0.122685840734641E4 - (0.123E4, ~0.3141592653589793E1) = 0.123314159265359E4 / (0.123E4, ~0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (0.123E4, ~0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, ~0.3141592653589793E1) = 0.16372724463908526E1 * (0.123E4, ~0.2718281828459045E1) = ~0.33434866490046256E4 + (0.123E4, ~0.2718281828459045E1) = 0.1227281718171541E4 - (0.123E4, ~0.2718281828459045E1) = 0.1232718281828459E4 / (0.123E4, ~0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (0.123E4, ~0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, ~0.2718281828459045E1) = 0.13366135365115497E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999999999998E4 rem (0.123E4, ~0.123E1) = 0.0 * (0.123E4, ~0.123) = ~0.15129E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999999999998E4 rem (0.123E4, ~0.123) = 0.0 * (0.123E4, ~0.123E~2) = ~0.15129E1 + (0.123E4, ~0.123E~2) = 0.122999877E4 - (0.123E4, ~0.123E~2) = 0.123000123E4 / (0.123E4, ~0.123E~2) = ~0.1E7 nextAfter (0.123E4, ~0.123E~2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E~2) = 0.0 * (0.123E4, ~0.22250738585072014E~307) = ~0.27368408459638577E~304 + (0.123E4, ~0.22250738585072014E~307) = 0.123E4 - (0.123E4, ~0.22250738585072014E~307) = 0.123E4 / (0.123E4, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E4, ~0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.22250738585072014E~307) = ~inf * (0.123E4, ~0.11125369292536007E~307) = ~0.13684204229819289E~304 + (0.123E4, ~0.11125369292536007E~307) = 0.123E4 - (0.123E4, ~0.11125369292536007E~307) = 0.123E4 / (0.123E4, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E4, ~0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.11125369292536007E~307) = ~inf * (0.123E4, ~0.5E~323) = ~0.6077E~320 + (0.123E4, ~0.5E~323) = 0.123E4 - (0.123E4, ~0.5E~323) = 0.123E4 / (0.123E4, ~0.5E~323) = ~inf nextAfter (0.123E4, ~0.5E~323) = 0.12299999999999998E4 rem (0.123E4, ~0.5E~323) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999999999998E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999999999998E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.17976931348623157E309) = inf + (0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E2, 0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (0.123E2, 0.17976931348623157E309) = 0.12300000000000002E2 rem (0.123E2, 0.17976931348623157E309) = 0.123E2 * (0.123E2, 0.8988465674311579E308) = inf + (0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E2, 0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (0.123E2, 0.8988465674311579E308) = 0.12300000000000002E2 rem (0.123E2, 0.8988465674311579E308) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300000000000002E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129000000000002E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.3141592653589793E1) = 0.3864158963915446E2 + (0.123E2, 0.3141592653589793E1) = 0.15441592653589794E2 - (0.123E2, 0.3141592653589793E1) = 0.9158407346410208E1 / (0.123E2, 0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (0.123E2, 0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, 0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, 0.2718281828459045E1) = 0.33434866490046254E2 + (0.123E2, 0.2718281828459045E1) = 0.15018281828459045E2 - (0.123E2, 0.2718281828459045E1) = 0.9581718171540956E1 / (0.123E2, 0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (0.123E2, 0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, 0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, 0.123E1) = 0.15129000000000001E2 + (0.123E2, 0.123E1) = 0.13530000000000001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999999999999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129000000000001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177000000000001E2 / (0.123E2, 0.123) = 0.10000000000000001E3 nextAfter (0.123E2, 0.123) = 0.12299999999999999E2 rem (0.123E2, 0.123) = 0.0 * (0.123E2, 0.123E~2) = 0.15129E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.12298770000000001E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999999999999E2 rem (0.123E2, 0.123E~2) = 0.17763568394002505E~14 * (0.123E2, 0.22250738585072014E~307) = 0.2736840845963858E~306 + (0.123E2, 0.22250738585072014E~307) = 0.123E2 - (0.123E2, 0.22250738585072014E~307) = 0.123E2 / (0.123E2, 0.22250738585072014E~307) = inf nextAfter (0.123E2, 0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, 0.22250738585072014E~307) = ~inf * (0.123E2, 0.11125369292536007E~307) = 0.1368420422981929E~306 + (0.123E2, 0.11125369292536007E~307) = 0.123E2 - (0.123E2, 0.11125369292536007E~307) = 0.123E2 / (0.123E2, 0.11125369292536007E~307) = inf nextAfter (0.123E2, 0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, 0.11125369292536007E~307) = ~inf * (0.123E2, 0.5E~323) = 0.6E~322 + (0.123E2, 0.5E~323) = 0.123E2 - (0.123E2, 0.5E~323) = 0.123E2 / (0.123E2, 0.5E~323) = inf nextAfter (0.123E2, 0.5E~323) = 0.12299999999999999E2 rem (0.123E2, 0.5E~323) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999999999999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.17976931348623157E309) = ~inf + (0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E2, ~0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (0.123E2, ~0.17976931348623157E309) = 0.12299999999999999E2 rem (0.123E2, ~0.17976931348623157E309) = 0.123E2 * (0.123E2, ~0.8988465674311579E308) = ~inf + (0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E2, ~0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (0.123E2, ~0.8988465674311579E308) = 0.12299999999999999E2 rem (0.123E2, ~0.8988465674311579E308) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999999999999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129000000000002E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.3141592653589793E1) = ~0.3864158963915446E2 + (0.123E2, ~0.3141592653589793E1) = 0.9158407346410208E1 - (0.123E2, ~0.3141592653589793E1) = 0.15441592653589794E2 / (0.123E2, ~0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (0.123E2, ~0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, ~0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, ~0.2718281828459045E1) = ~0.33434866490046254E2 + (0.123E2, ~0.2718281828459045E1) = 0.9581718171540956E1 - (0.123E2, ~0.2718281828459045E1) = 0.15018281828459045E2 / (0.123E2, ~0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (0.123E2, ~0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, ~0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, ~0.123E1) = ~0.15129000000000001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530000000000001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999999999999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129000000000001E1 + (0.123E2, ~0.123) = 0.12177000000000001E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.10000000000000001E3 nextAfter (0.123E2, ~0.123) = 0.12299999999999999E2 rem (0.123E2, ~0.123) = 0.0 * (0.123E2, ~0.123E~2) = ~0.15129E~1 + (0.123E2, ~0.123E~2) = 0.12298770000000001E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E~2) = 0.17763568394002505E~14 * (0.123E2, ~0.22250738585072014E~307) = ~0.2736840845963858E~306 + (0.123E2, ~0.22250738585072014E~307) = 0.123E2 - (0.123E2, ~0.22250738585072014E~307) = 0.123E2 / (0.123E2, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E2, ~0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.22250738585072014E~307) = ~inf * (0.123E2, ~0.11125369292536007E~307) = ~0.1368420422981929E~306 + (0.123E2, ~0.11125369292536007E~307) = 0.123E2 - (0.123E2, ~0.11125369292536007E~307) = 0.123E2 / (0.123E2, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E2, ~0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.11125369292536007E~307) = ~inf * (0.123E2, ~0.5E~323) = ~0.6E~322 + (0.123E2, ~0.5E~323) = 0.123E2 - (0.123E2, ~0.5E~323) = 0.123E2 / (0.123E2, ~0.5E~323) = ~inf nextAfter (0.123E2, ~0.5E~323) = 0.12299999999999999E2 rem (0.123E2, ~0.5E~323) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999999999999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999999999999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.3141592653589793E1, 0.17976931348623157E309) = inf + (0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.3141592653589793E1, 0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (0.3141592653589793E1, 0.17976931348623157E309) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.8988465674311579E308) = inf + (0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.3141592653589793E1, 0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (0.3141592653589793E1, 0.8988465674311579E308) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E4) = 0.38641589639154454E4 + (0.3141592653589793E1, 0.123E4) = 0.123314159265359E4 - (0.3141592653589793E1, 0.123E4) = ~0.122685840734641E4 / (0.3141592653589793E1, 0.123E4) = 0.25541403687721893E~2 nextAfter (0.3141592653589793E1, 0.123E4) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E2) = 0.3864158963915446E2 + (0.3141592653589793E1, 0.123E2) = 0.15441592653589794E2 - (0.3141592653589793E1, 0.123E2) = ~0.9158407346410208E1 / (0.3141592653589793E1, 0.123E2) = 0.2554140368772189 nextAfter (0.3141592653589793E1, 0.123E2) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.3141592653589793E1) = 0.9869604401089358E1 + (0.3141592653589793E1, 0.3141592653589793E1) = 0.6283185307179586E1 - (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 / (0.3141592653589793E1, 0.3141592653589793E1) = 0.1E1 nextAfter (0.3141592653589793E1, 0.3141592653589793E1) = 0.3141592653589793E1 rem (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, 0.2718281828459045E1) = 0.8539734222673566E1 + (0.3141592653589793E1, 0.2718281828459045E1) = 0.5859874482048838E1 - (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 / (0.3141592653589793E1, 0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (0.3141592653589793E1, 0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, 0.123E1) = 0.38641589639154454E1 + (0.3141592653589793E1, 0.123E1) = 0.43715926535897935E1 - (0.3141592653589793E1, 0.123E1) = 0.19115926535897931E1 / (0.3141592653589793E1, 0.123E1) = 0.25541403687721895E1 nextAfter (0.3141592653589793E1, 0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, 0.123) = 0.38641589639154456 + (0.3141592653589793E1, 0.123) = 0.32645926535897933E1 - (0.3141592653589793E1, 0.123) = 0.3018592653589793E1 / (0.3141592653589793E1, 0.123) = 0.25541403687721896E2 nextAfter (0.3141592653589793E1, 0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, 0.123E~2) = 0.38641589639154456E~2 + (0.3141592653589793E1, 0.123E~2) = 0.3142822653589793E1 - (0.3141592653589793E1, 0.123E~2) = 0.3140362653589793E1 / (0.3141592653589793E1, 0.123E~2) = 0.25541403687721895E4 nextAfter (0.3141592653589793E1, 0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, 0.22250738585072014E~307) = 0.6990275687580919E~307 + (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (0.3141592653589793E1, 0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, 0.11125369292536007E~307) = 0.34951378437904593E~307 + (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.11125369292536007E~307) = inf nextAfter (0.3141592653589793E1, 0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, 0.5E~323) = 0.15E~322 + (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.5E~323) = inf nextAfter (0.3141592653589793E1, 0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.5E~323) = ~inf * (0.3141592653589793E1, 0.0) = 0.0 + (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.0) = inf nextAfter (0.3141592653589793E1, 0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.0) = nan * (0.3141592653589793E1, ~0.17976931348623157E309) = ~inf + (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (0.3141592653589793E1, ~0.17976931348623157E309) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.8988465674311579E308) = ~inf + (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (0.3141592653589793E1, ~0.8988465674311579E308) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E4) = ~0.38641589639154454E4 + (0.3141592653589793E1, ~0.123E4) = ~0.122685840734641E4 - (0.3141592653589793E1, ~0.123E4) = 0.123314159265359E4 / (0.3141592653589793E1, ~0.123E4) = ~0.25541403687721893E~2 nextAfter (0.3141592653589793E1, ~0.123E4) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E2) = ~0.3864158963915446E2 + (0.3141592653589793E1, ~0.123E2) = ~0.9158407346410208E1 - (0.3141592653589793E1, ~0.123E2) = 0.15441592653589794E2 / (0.3141592653589793E1, ~0.123E2) = ~0.2554140368772189 nextAfter (0.3141592653589793E1, ~0.123E2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.9869604401089358E1 + (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 - (0.3141592653589793E1, ~0.3141592653589793E1) = 0.6283185307179586E1 / (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.1E1 nextAfter (0.3141592653589793E1, ~0.3141592653589793E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.8539734222673566E1 + (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 - (0.3141592653589793E1, ~0.2718281828459045E1) = 0.5859874482048838E1 / (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (0.3141592653589793E1, ~0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, ~0.123E1) = ~0.38641589639154454E1 + (0.3141592653589793E1, ~0.123E1) = 0.19115926535897931E1 - (0.3141592653589793E1, ~0.123E1) = 0.43715926535897935E1 / (0.3141592653589793E1, ~0.123E1) = ~0.25541403687721895E1 nextAfter (0.3141592653589793E1, ~0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, ~0.123) = ~0.38641589639154456 + (0.3141592653589793E1, ~0.123) = 0.3018592653589793E1 - (0.3141592653589793E1, ~0.123) = 0.32645926535897933E1 / (0.3141592653589793E1, ~0.123) = ~0.25541403687721896E2 nextAfter (0.3141592653589793E1, ~0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123) = 0.6659265358979294E~1 * (0.3141592653589793E1, ~0.123E~2) = ~0.38641589639154456E~2 + (0.3141592653589793E1, ~0.123E~2) = 0.3140362653589793E1 - (0.3141592653589793E1, ~0.123E~2) = 0.3142822653589793E1 / (0.3141592653589793E1, ~0.123E~2) = ~0.25541403687721895E4 nextAfter (0.3141592653589793E1, ~0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E~2) = 0.17265358979301482E~3 * (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.6990275687580919E~307 + (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.34951378437904593E~307 + (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, ~0.5E~323) = ~0.15E~322 + (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.5E~323) = ~inf nextAfter (0.3141592653589793E1, ~0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.5E~323) = ~inf * (0.3141592653589793E1, ~0.0) = ~0.0 + (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.0) = ~inf nextAfter (0.3141592653589793E1, ~0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.0) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.3141592653589793E1, ~inf) = ~inf + (0.3141592653589793E1, ~inf) = ~inf - (0.3141592653589793E1, ~inf) = inf / (0.3141592653589793E1, ~inf) = ~0.0 nextAfter (0.3141592653589793E1, ~inf) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~inf) = 0.3141592653589793E1 * (0.3141592653589793E1, nan) = nan + (0.3141592653589793E1, nan) = nan - (0.3141592653589793E1, nan) = nan / (0.3141592653589793E1, nan) = nan nextAfter (0.3141592653589793E1, nan) = nan rem (0.3141592653589793E1, nan) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.2718281828459045E1, 0.17976931348623157E309) = inf + (0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.2718281828459045E1, 0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (0.2718281828459045E1, 0.17976931348623157E309) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.8988465674311579E308) = inf + (0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.2718281828459045E1, 0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (0.2718281828459045E1, 0.8988465674311579E308) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E4) = 0.33434866490046256E4 + (0.2718281828459045E1, 0.123E4) = 0.1232718281828459E4 - (0.2718281828459045E1, 0.123E4) = ~0.1227281718171541E4 / (0.2718281828459045E1, 0.123E4) = 0.22099852263894678E~2 nextAfter (0.2718281828459045E1, 0.123E4) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E2) = 0.33434866490046254E2 + (0.2718281828459045E1, 0.123E2) = 0.15018281828459045E2 - (0.2718281828459045E1, 0.123E2) = ~0.9581718171540956E1 / (0.2718281828459045E1, 0.123E2) = 0.22099852263894673 nextAfter (0.2718281828459045E1, 0.123E2) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.3141592653589793E1) = 0.8539734222673566E1 + (0.2718281828459045E1, 0.3141592653589793E1) = 0.5859874482048838E1 - (0.2718281828459045E1, 0.3141592653589793E1) = ~0.423310825130748 / (0.2718281828459045E1, 0.3141592653589793E1) = 0.8652559794322651 nextAfter (0.2718281828459045E1, 0.3141592653589793E1) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.2718281828459045E1) = 0.73890560989306495E1 + (0.2718281828459045E1, 0.2718281828459045E1) = 0.543656365691809E1 - (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 / (0.2718281828459045E1, 0.2718281828459045E1) = 0.1E1 nextAfter (0.2718281828459045E1, 0.2718281828459045E1) = 0.2718281828459045E1 rem (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, 0.123E1) = 0.33434866490046256E1 + (0.2718281828459045E1, 0.123E1) = 0.3948281828459045E1 - (0.2718281828459045E1, 0.123E1) = 0.1488281828459045E1 / (0.2718281828459045E1, 0.123E1) = 0.22099852263894677E1 nextAfter (0.2718281828459045E1, 0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, 0.123) = 0.33434866490046256 + (0.2718281828459045E1, 0.123) = 0.2841281828459045E1 - (0.2718281828459045E1, 0.123) = 0.25952818284590453E1 / (0.2718281828459045E1, 0.123) = 0.22099852263894675E2 nextAfter (0.2718281828459045E1, 0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, 0.123E~2) = 0.33434866490046253E~2 + (0.2718281828459045E1, 0.123E~2) = 0.2719511828459045E1 - (0.2718281828459045E1, 0.123E~2) = 0.2717051828459045E1 / (0.2718281828459045E1, 0.123E~2) = 0.22099852263894677E4 nextAfter (0.2718281828459045E1, 0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, 0.22250738585072014E~307) = 0.6048377836559378E~307 + (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (0.2718281828459045E1, 0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, 0.11125369292536007E~307) = 0.3024188918279689E~307 + (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.11125369292536007E~307) = inf nextAfter (0.2718281828459045E1, 0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, 0.5E~323) = 0.15E~322 + (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.5E~323) = inf nextAfter (0.2718281828459045E1, 0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.5E~323) = ~inf * (0.2718281828459045E1, 0.0) = 0.0 + (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.0) = inf nextAfter (0.2718281828459045E1, 0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.0) = nan * (0.2718281828459045E1, ~0.17976931348623157E309) = ~inf + (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (0.2718281828459045E1, ~0.17976931348623157E309) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.8988465674311579E308) = ~inf + (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (0.2718281828459045E1, ~0.8988465674311579E308) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E4) = ~0.33434866490046256E4 + (0.2718281828459045E1, ~0.123E4) = ~0.1227281718171541E4 - (0.2718281828459045E1, ~0.123E4) = 0.1232718281828459E4 / (0.2718281828459045E1, ~0.123E4) = ~0.22099852263894678E~2 nextAfter (0.2718281828459045E1, ~0.123E4) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E2) = ~0.33434866490046254E2 + (0.2718281828459045E1, ~0.123E2) = ~0.9581718171540956E1 - (0.2718281828459045E1, ~0.123E2) = 0.15018281828459045E2 / (0.2718281828459045E1, ~0.123E2) = ~0.22099852263894673 nextAfter (0.2718281828459045E1, ~0.123E2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8539734222673566E1 + (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.423310825130748 - (0.2718281828459045E1, ~0.3141592653589793E1) = 0.5859874482048838E1 / (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8652559794322651 nextAfter (0.2718281828459045E1, ~0.3141592653589793E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.73890560989306495E1 + (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 - (0.2718281828459045E1, ~0.2718281828459045E1) = 0.543656365691809E1 / (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.1E1 nextAfter (0.2718281828459045E1, ~0.2718281828459045E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, ~0.123E1) = ~0.33434866490046256E1 + (0.2718281828459045E1, ~0.123E1) = 0.1488281828459045E1 - (0.2718281828459045E1, ~0.123E1) = 0.3948281828459045E1 / (0.2718281828459045E1, ~0.123E1) = ~0.22099852263894677E1 nextAfter (0.2718281828459045E1, ~0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, ~0.123) = ~0.33434866490046256 + (0.2718281828459045E1, ~0.123) = 0.25952818284590453E1 - (0.2718281828459045E1, ~0.123) = 0.2841281828459045E1 / (0.2718281828459045E1, ~0.123) = ~0.22099852263894675E2 nextAfter (0.2718281828459045E1, ~0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, ~0.123E~2) = ~0.33434866490046253E~2 + (0.2718281828459045E1, ~0.123E~2) = 0.2717051828459045E1 - (0.2718281828459045E1, ~0.123E~2) = 0.2719511828459045E1 / (0.2718281828459045E1, ~0.123E~2) = ~0.22099852263894677E4 nextAfter (0.2718281828459045E1, ~0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E~2) = 0.12118284590449946E~2 * (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.6048377836559378E~307 + (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.3024188918279689E~307 + (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, ~0.5E~323) = ~0.15E~322 + (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.5E~323) = ~inf nextAfter (0.2718281828459045E1, ~0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.5E~323) = ~inf * (0.2718281828459045E1, ~0.0) = ~0.0 + (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.0) = ~inf nextAfter (0.2718281828459045E1, ~0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.0) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.2718281828459045E1, ~inf) = ~inf + (0.2718281828459045E1, ~inf) = ~inf - (0.2718281828459045E1, ~inf) = inf / (0.2718281828459045E1, ~inf) = ~0.0 nextAfter (0.2718281828459045E1, ~inf) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~inf) = 0.2718281828459045E1 * (0.2718281828459045E1, nan) = nan + (0.2718281828459045E1, nan) = nan - (0.2718281828459045E1, nan) = nan / (0.2718281828459045E1, nan) = nan nextAfter (0.2718281828459045E1, nan) = nan rem (0.2718281828459045E1, nan) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.123E1, 0.17976931348623157E309) = inf + (0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E1, 0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (0.123E1, 0.17976931348623157E309) = 0.12300000000000002E1 rem (0.123E1, 0.17976931348623157E309) = 0.123E1 * (0.123E1, 0.8988465674311579E308) = 0.1105581277940324E309 + (0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E1, 0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (0.123E1, 0.8988465674311579E308) = 0.12300000000000002E1 rem (0.123E1, 0.8988465674311579E308) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300000000000002E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129000000000001E2 + (0.123E1, 0.123E2) = 0.13530000000000001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.9999999999999999E~1 nextAfter (0.123E1, 0.123E2) = 0.12300000000000002E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.3141592653589793E1) = 0.38641589639154454E1 + (0.123E1, 0.3141592653589793E1) = 0.43715926535897935E1 - (0.123E1, 0.3141592653589793E1) = ~0.19115926535897931E1 / (0.123E1, 0.3141592653589793E1) = 0.3915211600060625 nextAfter (0.123E1, 0.3141592653589793E1) = 0.12300000000000002E1 rem (0.123E1, 0.3141592653589793E1) = 0.123E1 * (0.123E1, 0.2718281828459045E1) = 0.33434866490046256E1 + (0.123E1, 0.2718281828459045E1) = 0.3948281828459045E1 - (0.123E1, 0.2718281828459045E1) = ~0.1488281828459045E1 / (0.123E1, 0.2718281828459045E1) = 0.45249171264087407 nextAfter (0.123E1, 0.2718281828459045E1) = 0.12300000000000002E1 rem (0.123E1, 0.2718281828459045E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999999999998E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999999999998E1 rem (0.123E1, 0.123E~2) = 0.0 * (0.123E1, 0.22250738585072014E~307) = 0.27368408459638577E~307 + (0.123E1, 0.22250738585072014E~307) = 0.123E1 - (0.123E1, 0.22250738585072014E~307) = 0.123E1 / (0.123E1, 0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (0.123E1, 0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, 0.22250738585072014E~307) = 0.0 * (0.123E1, 0.11125369292536007E~307) = 0.1368420422981929E~307 + (0.123E1, 0.11125369292536007E~307) = 0.123E1 - (0.123E1, 0.11125369292536007E~307) = 0.123E1 / (0.123E1, 0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (0.123E1, 0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, 0.11125369292536007E~307) = 0.0 * (0.123E1, 0.5E~323) = 0.5E~323 + (0.123E1, 0.5E~323) = 0.123E1 - (0.123E1, 0.5E~323) = 0.123E1 / (0.123E1, 0.5E~323) = inf nextAfter (0.123E1, 0.5E~323) = 0.12299999999999998E1 rem (0.123E1, 0.5E~323) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999999999998E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.17976931348623157E309) = ~inf + (0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E1, ~0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (0.123E1, ~0.17976931348623157E309) = 0.12299999999999998E1 rem (0.123E1, ~0.17976931348623157E309) = 0.123E1 * (0.123E1, ~0.8988465674311579E308) = ~0.1105581277940324E309 + (0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E1, ~0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (0.123E1, ~0.8988465674311579E308) = 0.12299999999999998E1 rem (0.123E1, ~0.8988465674311579E308) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999999999998E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129000000000001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530000000000001E2 / (0.123E1, ~0.123E2) = ~0.9999999999999999E~1 nextAfter (0.123E1, ~0.123E2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.3141592653589793E1) = ~0.38641589639154454E1 + (0.123E1, ~0.3141592653589793E1) = ~0.19115926535897931E1 - (0.123E1, ~0.3141592653589793E1) = 0.43715926535897935E1 / (0.123E1, ~0.3141592653589793E1) = ~0.3915211600060625 nextAfter (0.123E1, ~0.3141592653589793E1) = 0.12299999999999998E1 rem (0.123E1, ~0.3141592653589793E1) = 0.123E1 * (0.123E1, ~0.2718281828459045E1) = ~0.33434866490046256E1 + (0.123E1, ~0.2718281828459045E1) = ~0.1488281828459045E1 - (0.123E1, ~0.2718281828459045E1) = 0.3948281828459045E1 / (0.123E1, ~0.2718281828459045E1) = ~0.45249171264087407 nextAfter (0.123E1, ~0.2718281828459045E1) = 0.12299999999999998E1 rem (0.123E1, ~0.2718281828459045E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999999999998E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999999999998E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E~2) = 0.0 * (0.123E1, ~0.22250738585072014E~307) = ~0.27368408459638577E~307 + (0.123E1, ~0.22250738585072014E~307) = 0.123E1 - (0.123E1, ~0.22250738585072014E~307) = 0.123E1 / (0.123E1, ~0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (0.123E1, ~0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.22250738585072014E~307) = 0.0 * (0.123E1, ~0.11125369292536007E~307) = ~0.1368420422981929E~307 + (0.123E1, ~0.11125369292536007E~307) = 0.123E1 - (0.123E1, ~0.11125369292536007E~307) = 0.123E1 / (0.123E1, ~0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (0.123E1, ~0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.11125369292536007E~307) = 0.0 * (0.123E1, ~0.5E~323) = ~0.5E~323 + (0.123E1, ~0.5E~323) = 0.123E1 - (0.123E1, ~0.5E~323) = 0.123E1 / (0.123E1, ~0.5E~323) = ~inf nextAfter (0.123E1, ~0.5E~323) = 0.12299999999999998E1 rem (0.123E1, ~0.5E~323) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999999999998E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999999999998E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.17976931348623157E309) = 0.22111625558806483E308 + (0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123, 0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (0.123, 0.17976931348623157E309) = 0.12300000000000001 rem (0.123, 0.17976931348623157E309) = 0.123 * (0.123, 0.8988465674311579E308) = 0.11055812779403241E308 + (0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123, 0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (0.123, 0.8988465674311579E308) = 0.12300000000000001 rem (0.123, 0.8988465674311579E308) = 0.123 * (0.123, 0.123E4) = 0.15129E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.1E~3 nextAfter (0.123, 0.123E4) = 0.12300000000000001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129000000000001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177000000000001E2 / (0.123, 0.123E2) = 0.9999999999999998E~2 nextAfter (0.123, 0.123E2) = 0.12300000000000001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.3141592653589793E1) = 0.38641589639154456 + (0.123, 0.3141592653589793E1) = 0.32645926535897933E1 - (0.123, 0.3141592653589793E1) = ~0.3018592653589793E1 / (0.123, 0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (0.123, 0.3141592653589793E1) = 0.12300000000000001 rem (0.123, 0.3141592653589793E1) = 0.123 * (0.123, 0.2718281828459045E1) = 0.33434866490046256 + (0.123, 0.2718281828459045E1) = 0.2841281828459045E1 - (0.123, 0.2718281828459045E1) = ~0.25952818284590453E1 / (0.123, 0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (0.123, 0.2718281828459045E1) = 0.12300000000000001 rem (0.123, 0.2718281828459045E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300000000000001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.12423 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.12299999999999998 rem (0.123, 0.123E~2) = 0.0 * (0.123, 0.22250738585072014E~307) = 0.273684084596386E~308 + (0.123, 0.22250738585072014E~307) = 0.123 - (0.123, 0.22250738585072014E~307) = 0.123 / (0.123, 0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (0.123, 0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, 0.22250738585072014E~307) = 0.0 * (0.123, 0.11125369292536007E~307) = 0.136842042298193E~308 + (0.123, 0.11125369292536007E~307) = 0.123 - (0.123, 0.11125369292536007E~307) = 0.123 / (0.123, 0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (0.123, 0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, 0.11125369292536007E~307) = 0.0 * (0.123, 0.5E~323) = 0.0 + (0.123, 0.5E~323) = 0.123 - (0.123, 0.5E~323) = 0.123 / (0.123, 0.5E~323) = inf nextAfter (0.123, 0.5E~323) = 0.12299999999999998 rem (0.123, 0.5E~323) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.12299999999999998 rem (0.123, 0.0) = nan * (0.123, ~0.17976931348623157E309) = ~0.22111625558806483E308 + (0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123, ~0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (0.123, ~0.17976931348623157E309) = 0.12299999999999998 rem (0.123, ~0.17976931348623157E309) = 0.123 * (0.123, ~0.8988465674311579E308) = ~0.11055812779403241E308 + (0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123, ~0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (0.123, ~0.8988465674311579E308) = 0.12299999999999998 rem (0.123, ~0.8988465674311579E308) = 0.123 * (0.123, ~0.123E4) = ~0.15129E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.1E~3 nextAfter (0.123, ~0.123E4) = 0.12299999999999998 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129000000000001E1 + (0.123, ~0.123E2) = ~0.12177000000000001E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.9999999999999998E~2 nextAfter (0.123, ~0.123E2) = 0.12299999999999998 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.3141592653589793E1) = ~0.38641589639154456 + (0.123, ~0.3141592653589793E1) = ~0.3018592653589793E1 - (0.123, ~0.3141592653589793E1) = 0.32645926535897933E1 / (0.123, ~0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (0.123, ~0.3141592653589793E1) = 0.12299999999999998 rem (0.123, ~0.3141592653589793E1) = 0.123 * (0.123, ~0.2718281828459045E1) = ~0.33434866490046256 + (0.123, ~0.2718281828459045E1) = ~0.25952818284590453E1 - (0.123, ~0.2718281828459045E1) = 0.2841281828459045E1 / (0.123, ~0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (0.123, ~0.2718281828459045E1) = 0.12299999999999998 rem (0.123, ~0.2718281828459045E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.12299999999999998 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.12299999999999998 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.12423 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.12299999999999998 rem (0.123, ~0.123E~2) = 0.0 * (0.123, ~0.22250738585072014E~307) = ~0.273684084596386E~308 + (0.123, ~0.22250738585072014E~307) = 0.123 - (0.123, ~0.22250738585072014E~307) = 0.123 / (0.123, ~0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (0.123, ~0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, ~0.22250738585072014E~307) = 0.0 * (0.123, ~0.11125369292536007E~307) = ~0.136842042298193E~308 + (0.123, ~0.11125369292536007E~307) = 0.123 - (0.123, ~0.11125369292536007E~307) = 0.123 / (0.123, ~0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (0.123, ~0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, ~0.11125369292536007E~307) = 0.0 * (0.123, ~0.5E~323) = ~0.0 + (0.123, ~0.5E~323) = 0.123 - (0.123, ~0.5E~323) = 0.123 / (0.123, ~0.5E~323) = ~inf nextAfter (0.123, ~0.5E~323) = 0.12299999999999998 rem (0.123, ~0.5E~323) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.12299999999999998 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.12299999999999998 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.17976931348623157E309) = 0.2211162555880648E306 + (0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E~2, 0.17976931348623157E309) = 0.684210211491E~311 nextAfter (0.123E~2, 0.17976931348623157E309) = 0.12300000000000002E~2 rem (0.123E~2, 0.17976931348623157E309) = 0.123E~2 * (0.123E~2, 0.8988465674311579E308) = 0.1105581277940324E306 + (0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E~2, 0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (0.123E~2, 0.8988465674311579E308) = 0.12300000000000002E~2 rem (0.123E~2, 0.8988465674311579E308) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129E1 + (0.123E~2, 0.123E4) = 0.123000123E4 - (0.123E~2, 0.123E4) = ~0.122999877E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.12298770000000001E2 / (0.123E~2, 0.123E2) = 0.9999999999999999E~4 nextAfter (0.123E~2, 0.123E2) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.3141592653589793E1) = 0.38641589639154456E~2 + (0.123E~2, 0.3141592653589793E1) = 0.3142822653589793E1 - (0.123E~2, 0.3141592653589793E1) = ~0.3140362653589793E1 / (0.123E~2, 0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (0.123E~2, 0.3141592653589793E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.3141592653589793E1) = 0.123E~2 * (0.123E~2, 0.2718281828459045E1) = 0.33434866490046253E~2 + (0.123E~2, 0.2718281828459045E1) = 0.2719511828459045E1 - (0.123E~2, 0.2718281828459045E1) = ~0.2717051828459045E1 / (0.123E~2, 0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (0.123E~2, 0.2718281828459045E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.2718281828459045E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.12423 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300000000000002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.22250738585072014E~307) = 0.2736840845964E~310 + (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, 0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (0.123E~2, 0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.22250738585072014E~307) = 0.0 * (0.123E~2, 0.11125369292536007E~307) = 0.1368420422982E~310 + (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, 0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (0.123E~2, 0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.11125369292536007E~307) = 0.0 * (0.123E~2, 0.5E~323) = 0.0 + (0.123E~2, 0.5E~323) = 0.123E~2 - (0.123E~2, 0.5E~323) = 0.123E~2 / (0.123E~2, 0.5E~323) = inf nextAfter (0.123E~2, 0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, 0.5E~323) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999999999998E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.17976931348623157E309) = ~0.2211162555880648E306 + (0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E~2, ~0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (0.123E~2, ~0.17976931348623157E309) = 0.12299999999999998E~2 rem (0.123E~2, ~0.17976931348623157E309) = 0.123E~2 * (0.123E~2, ~0.8988465674311579E308) = ~0.1105581277940324E306 + (0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E~2, ~0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (0.123E~2, ~0.8988465674311579E308) = 0.12299999999999998E~2 rem (0.123E~2, ~0.8988465674311579E308) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129E1 + (0.123E~2, ~0.123E4) = ~0.122999877E4 - (0.123E~2, ~0.123E4) = 0.123000123E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129E~1 + (0.123E~2, ~0.123E2) = ~0.12298770000000001E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.9999999999999999E~4 nextAfter (0.123E~2, ~0.123E2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.3141592653589793E1) = ~0.38641589639154456E~2 + (0.123E~2, ~0.3141592653589793E1) = ~0.3140362653589793E1 - (0.123E~2, ~0.3141592653589793E1) = 0.3142822653589793E1 / (0.123E~2, ~0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (0.123E~2, ~0.3141592653589793E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.3141592653589793E1) = 0.123E~2 * (0.123E~2, ~0.2718281828459045E1) = ~0.33434866490046253E~2 + (0.123E~2, ~0.2718281828459045E1) = ~0.2717051828459045E1 - (0.123E~2, ~0.2718281828459045E1) = 0.2719511828459045E1 / (0.123E~2, ~0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (0.123E~2, ~0.2718281828459045E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.2718281828459045E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.12423 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.22250738585072014E~307) = ~0.2736840845964E~310 + (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, ~0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (0.123E~2, ~0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.22250738585072014E~307) = 0.0 * (0.123E~2, ~0.11125369292536007E~307) = ~0.1368420422982E~310 + (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, ~0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (0.123E~2, ~0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.11125369292536007E~307) = 0.0 * (0.123E~2, ~0.5E~323) = ~0.0 + (0.123E~2, ~0.5E~323) = 0.123E~2 - (0.123E~2, ~0.5E~323) = 0.123E~2 / (0.123E~2, ~0.5E~323) = ~inf nextAfter (0.123E~2, ~0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, ~0.5E~323) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999999999998E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999999999998E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.22250738585072014E~307, 0.17976931348623157E309) = 0.39999999999999996E1 + (0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.22250738585072014E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.22250738585072014E~307, 0.17976931348623157E309) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.8988465674311579E308) = 0.19999999999999998E1 + (0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.22250738585072014E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.22250738585072014E~307, 0.8988465674311579E308) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E4) = 0.27368408459638577E~304 + (0.22250738585072014E~307, 0.123E4) = 0.123E4 - (0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (0.22250738585072014E~307, 0.123E4) = 0.18090031369976E~310 nextAfter (0.22250738585072014E~307, 0.123E4) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E2) = 0.2736840845963858E~306 + (0.22250738585072014E~307, 0.123E2) = 0.123E2 - (0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (0.22250738585072014E~307, 0.123E2) = 0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, 0.123E2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.3141592653589793E1) = 0.6990275687580919E~307 + (0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.22250738585072014E~307, 0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, 0.3141592653589793E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.2718281828459045E1) = 0.6048377836559378E~307 + (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.22250738585072014E~307, 0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E1) = 0.27368408459638577E~307 + (0.22250738585072014E~307, 0.123E1) = 0.123E1 - (0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (0.22250738585072014E~307, 0.123E1) = 0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, 0.123E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123) = 0.273684084596386E~308 + (0.22250738585072014E~307, 0.123) = 0.123 - (0.22250738585072014E~307, 0.123) = ~0.123 / (0.22250738585072014E~307, 0.123) = 0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, 0.123) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E~2) = 0.2736840845964E~310 + (0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (0.22250738585072014E~307, 0.123E~2) = 0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, 0.123E~2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 + (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.4450147717014403E~307 - (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 / (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.1E1 nextAfter (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.22250738585072014E~307 rem (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 + (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.3337610787760802E~307 - (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2E1 nextAfter (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, 0.5E~323) = 0.0 + (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507202E~307 - (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 / (0.22250738585072014E~307, 0.5E~323) = 0.4503599627370496E16 nextAfter (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.5E~323) = 0.0 * (0.22250738585072014E~307, 0.0) = 0.0 + (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, 0.0) = inf nextAfter (0.22250738585072014E~307, 0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.0) = nan * (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.39999999999999996E1 + (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.19999999999999998E1 + (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E4) = ~0.27368408459638577E~304 + (0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (0.22250738585072014E~307, ~0.123E4) = ~0.18090031369976E~310 nextAfter (0.22250738585072014E~307, ~0.123E4) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E2) = ~0.2736840845963858E~306 + (0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (0.22250738585072014E~307, ~0.123E2) = ~0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, ~0.123E2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.6990275687580919E~307 + (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.6048377836559378E~307 + (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E1) = ~0.27368408459638577E~307 + (0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (0.22250738585072014E~307, ~0.123E1) = ~0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, ~0.123E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123) = ~0.273684084596386E~308 + (0.22250738585072014E~307, ~0.123) = ~0.123 - (0.22250738585072014E~307, ~0.123) = 0.123 / (0.22250738585072014E~307, ~0.123) = ~0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, ~0.123) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E~2) = ~0.2736840845964E~310 + (0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (0.22250738585072014E~307, ~0.123E~2) = ~0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, ~0.123E~2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.0 + (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 - (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.4450147717014403E~307 / (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.1E1 nextAfter (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.0 + (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.3337610787760802E~307 / (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2E1 nextAfter (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, ~0.5E~323) = ~0.0 + (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 - (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507202E~307 / (0.22250738585072014E~307, ~0.5E~323) = ~0.4503599627370496E16 nextAfter (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.5E~323) = 0.0 * (0.22250738585072014E~307, ~0.0) = ~0.0 + (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, ~0.0) = ~inf nextAfter (0.22250738585072014E~307, ~0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.0) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~inf) = ~inf + (0.22250738585072014E~307, ~inf) = ~inf - (0.22250738585072014E~307, ~inf) = inf / (0.22250738585072014E~307, ~inf) = ~0.0 nextAfter (0.22250738585072014E~307, ~inf) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, nan) = nan + (0.22250738585072014E~307, nan) = nan - (0.22250738585072014E~307, nan) = nan / (0.22250738585072014E~307, nan) = nan nextAfter (0.22250738585072014E~307, nan) = nan rem (0.22250738585072014E~307, nan) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.11125369292536007E~307, 0.17976931348623157E309) = 0.19999999999999998E1 + (0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.11125369292536007E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.11125369292536007E~307, 0.17976931348623157E309) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.8988465674311579E308) = 0.9999999999999999 + (0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.11125369292536007E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.11125369292536007E~307, 0.8988465674311579E308) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E4) = 0.13684204229819289E~304 + (0.11125369292536007E~307, 0.123E4) = 0.123E4 - (0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (0.11125369292536007E~307, 0.123E4) = 0.904501568499E~311 nextAfter (0.11125369292536007E~307, 0.123E4) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E2) = 0.1368420422981929E~306 + (0.11125369292536007E~307, 0.123E2) = 0.123E2 - (0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (0.11125369292536007E~307, 0.123E2) = 0.90450156849886E~309 nextAfter (0.11125369292536007E~307, 0.123E2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.3141592653589793E1) = 0.34951378437904593E~307 + (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, 0.3141592653589793E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.2718281828459045E1) = 0.3024188918279689E~307 + (0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.11125369292536007E~307, 0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (0.11125369292536007E~307, 0.2718281828459045E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E1) = 0.1368420422981929E~307 + (0.11125369292536007E~307, 0.123E1) = 0.123E1 - (0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (0.11125369292536007E~307, 0.123E1) = 0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, 0.123E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123) = 0.136842042298193E~308 + (0.11125369292536007E~307, 0.123) = 0.123 - (0.11125369292536007E~307, 0.123) = ~0.123 / (0.11125369292536007E~307, 0.123) = 0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, 0.123) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E~2) = 0.1368420422982E~310 + (0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (0.11125369292536007E~307, 0.123E~2) = 0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, 0.123E~2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.0 + (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.3337610787760802E~307 - (0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 / (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.5 nextAfter (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 + (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.22250738585072014E~307 - (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 / (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.1E1 nextAfter (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 rem (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, 0.5E~323) = 0.0 + (0.11125369292536007E~307, 0.5E~323) = 0.1112536929253601E~307 - (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 / (0.11125369292536007E~307, 0.5E~323) = 0.2251799813685248E16 nextAfter (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.5E~323) = 0.0 * (0.11125369292536007E~307, 0.0) = 0.0 + (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, 0.0) = inf nextAfter (0.11125369292536007E~307, 0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.0) = nan * (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.19999999999999998E1 + (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.9999999999999999 + (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E4) = ~0.13684204229819289E~304 + (0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (0.11125369292536007E~307, ~0.123E4) = ~0.904501568499E~311 nextAfter (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E2) = ~0.1368420422981929E~306 + (0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (0.11125369292536007E~307, ~0.123E2) = ~0.90450156849886E~309 nextAfter (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.34951378437904593E~307 + (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.3024188918279689E~307 + (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E1) = ~0.1368420422981929E~307 + (0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (0.11125369292536007E~307, ~0.123E1) = ~0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123) = ~0.136842042298193E~308 + (0.11125369292536007E~307, ~0.123) = ~0.123 - (0.11125369292536007E~307, ~0.123) = 0.123 / (0.11125369292536007E~307, ~0.123) = ~0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, ~0.123) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E~2) = ~0.1368420422982E~310 + (0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (0.11125369292536007E~307, ~0.123E~2) = ~0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.0 + (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.3337610787760802E~307 / (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.5 nextAfter (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.0 + (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 - (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.22250738585072014E~307 / (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.1E1 nextAfter (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, ~0.5E~323) = ~0.0 + (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 - (0.11125369292536007E~307, ~0.5E~323) = 0.1112536929253601E~307 / (0.11125369292536007E~307, ~0.5E~323) = ~0.2251799813685248E16 nextAfter (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.5E~323) = 0.0 * (0.11125369292536007E~307, ~0.0) = ~0.0 + (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, ~0.0) = ~inf nextAfter (0.11125369292536007E~307, ~0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.0) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~inf) = ~inf + (0.11125369292536007E~307, ~inf) = ~inf - (0.11125369292536007E~307, ~inf) = inf / (0.11125369292536007E~307, ~inf) = ~0.0 nextAfter (0.11125369292536007E~307, ~inf) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, nan) = nan + (0.11125369292536007E~307, nan) = nan - (0.11125369292536007E~307, nan) = nan / (0.11125369292536007E~307, nan) = nan nextAfter (0.11125369292536007E~307, nan) = nan rem (0.11125369292536007E~307, nan) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.5E~323, 0.17976931348623157E309) = 0.8881784197001251E~15 + (0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.5E~323, 0.17976931348623157E309) = 0.0 nextAfter (0.5E~323, 0.17976931348623157E309) = 0.1E~322 rem (0.5E~323, 0.17976931348623157E309) = 0.5E~323 * (0.5E~323, 0.8988465674311579E308) = 0.44408920985006257E~15 + (0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.5E~323, 0.8988465674311579E308) = 0.0 nextAfter (0.5E~323, 0.8988465674311579E308) = 0.1E~322 rem (0.5E~323, 0.8988465674311579E308) = 0.5E~323 * (0.5E~323, 0.123E4) = 0.6077E~320 + (0.5E~323, 0.123E4) = 0.123E4 - (0.5E~323, 0.123E4) = ~0.123E4 / (0.5E~323, 0.123E4) = 0.0 nextAfter (0.5E~323, 0.123E4) = 0.1E~322 rem (0.5E~323, 0.123E4) = 0.5E~323 * (0.5E~323, 0.123E2) = 0.6E~322 + (0.5E~323, 0.123E2) = 0.123E2 - (0.5E~323, 0.123E2) = ~0.123E2 / (0.5E~323, 0.123E2) = 0.0 nextAfter (0.5E~323, 0.123E2) = 0.1E~322 rem (0.5E~323, 0.123E2) = 0.5E~323 * (0.5E~323, 0.3141592653589793E1) = 0.15E~322 + (0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.5E~323, 0.3141592653589793E1) = 0.0 nextAfter (0.5E~323, 0.3141592653589793E1) = 0.1E~322 rem (0.5E~323, 0.3141592653589793E1) = 0.5E~323 * (0.5E~323, 0.2718281828459045E1) = 0.15E~322 + (0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.5E~323, 0.2718281828459045E1) = 0.0 nextAfter (0.5E~323, 0.2718281828459045E1) = 0.1E~322 rem (0.5E~323, 0.2718281828459045E1) = 0.5E~323 * (0.5E~323, 0.123E1) = 0.5E~323 + (0.5E~323, 0.123E1) = 0.123E1 - (0.5E~323, 0.123E1) = ~0.123E1 / (0.5E~323, 0.123E1) = 0.5E~323 nextAfter (0.5E~323, 0.123E1) = 0.1E~322 rem (0.5E~323, 0.123E1) = 0.5E~323 * (0.5E~323, 0.123) = 0.0 + (0.5E~323, 0.123) = 0.123 - (0.5E~323, 0.123) = ~0.123 / (0.5E~323, 0.123) = 0.4E~322 nextAfter (0.5E~323, 0.123) = 0.1E~322 rem (0.5E~323, 0.123) = 0.5E~323 * (0.5E~323, 0.123E~2) = 0.0 + (0.5E~323, 0.123E~2) = 0.123E~2 - (0.5E~323, 0.123E~2) = ~0.123E~2 / (0.5E~323, 0.123E~2) = 0.4017E~320 nextAfter (0.5E~323, 0.123E~2) = 0.1E~322 rem (0.5E~323, 0.123E~2) = 0.5E~323 * (0.5E~323, 0.22250738585072014E~307) = 0.0 + (0.5E~323, 0.22250738585072014E~307) = 0.2225073858507202E~307 - (0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507201E~307 / (0.5E~323, 0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (0.5E~323, 0.22250738585072014E~307) = 0.1E~322 rem (0.5E~323, 0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, 0.11125369292536007E~307) = 0.0 + (0.5E~323, 0.11125369292536007E~307) = 0.1112536929253601E~307 - (0.5E~323, 0.11125369292536007E~307) = ~0.11125369292536E~307 / (0.5E~323, 0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (0.5E~323, 0.11125369292536007E~307) = 0.1E~322 rem (0.5E~323, 0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, 0.5E~323) = 0.0 + (0.5E~323, 0.5E~323) = 0.1E~322 - (0.5E~323, 0.5E~323) = 0.0 / (0.5E~323, 0.5E~323) = 0.1E1 nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 rem (0.5E~323, 0.5E~323) = 0.0 * (0.5E~323, 0.0) = 0.0 + (0.5E~323, 0.0) = 0.5E~323 - (0.5E~323, 0.0) = 0.5E~323 / (0.5E~323, 0.0) = inf nextAfter (0.5E~323, 0.0) = 0.0 rem (0.5E~323, 0.0) = nan * (0.5E~323, ~0.17976931348623157E309) = ~0.8881784197001251E~15 + (0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.5E~323, ~0.17976931348623157E309) = ~0.0 nextAfter (0.5E~323, ~0.17976931348623157E309) = 0.0 rem (0.5E~323, ~0.17976931348623157E309) = 0.5E~323 * (0.5E~323, ~0.8988465674311579E308) = ~0.44408920985006257E~15 + (0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.5E~323, ~0.8988465674311579E308) = ~0.0 nextAfter (0.5E~323, ~0.8988465674311579E308) = 0.0 rem (0.5E~323, ~0.8988465674311579E308) = 0.5E~323 * (0.5E~323, ~0.123E4) = ~0.6077E~320 + (0.5E~323, ~0.123E4) = ~0.123E4 - (0.5E~323, ~0.123E4) = 0.123E4 / (0.5E~323, ~0.123E4) = ~0.0 nextAfter (0.5E~323, ~0.123E4) = 0.0 rem (0.5E~323, ~0.123E4) = 0.5E~323 * (0.5E~323, ~0.123E2) = ~0.6E~322 + (0.5E~323, ~0.123E2) = ~0.123E2 - (0.5E~323, ~0.123E2) = 0.123E2 / (0.5E~323, ~0.123E2) = ~0.0 nextAfter (0.5E~323, ~0.123E2) = 0.0 rem (0.5E~323, ~0.123E2) = 0.5E~323 * (0.5E~323, ~0.3141592653589793E1) = ~0.15E~322 + (0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.5E~323, ~0.3141592653589793E1) = ~0.0 nextAfter (0.5E~323, ~0.3141592653589793E1) = 0.0 rem (0.5E~323, ~0.3141592653589793E1) = 0.5E~323 * (0.5E~323, ~0.2718281828459045E1) = ~0.15E~322 + (0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.5E~323, ~0.2718281828459045E1) = ~0.0 nextAfter (0.5E~323, ~0.2718281828459045E1) = 0.0 rem (0.5E~323, ~0.2718281828459045E1) = 0.5E~323 * (0.5E~323, ~0.123E1) = ~0.5E~323 + (0.5E~323, ~0.123E1) = ~0.123E1 - (0.5E~323, ~0.123E1) = 0.123E1 / (0.5E~323, ~0.123E1) = ~0.5E~323 nextAfter (0.5E~323, ~0.123E1) = 0.0 rem (0.5E~323, ~0.123E1) = 0.5E~323 * (0.5E~323, ~0.123) = ~0.0 + (0.5E~323, ~0.123) = ~0.123 - (0.5E~323, ~0.123) = 0.123 / (0.5E~323, ~0.123) = ~0.4E~322 nextAfter (0.5E~323, ~0.123) = 0.0 rem (0.5E~323, ~0.123) = 0.5E~323 * (0.5E~323, ~0.123E~2) = ~0.0 + (0.5E~323, ~0.123E~2) = ~0.123E~2 - (0.5E~323, ~0.123E~2) = 0.123E~2 / (0.5E~323, ~0.123E~2) = ~0.4017E~320 nextAfter (0.5E~323, ~0.123E~2) = 0.0 rem (0.5E~323, ~0.123E~2) = 0.5E~323 * (0.5E~323, ~0.22250738585072014E~307) = ~0.0 + (0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507201E~307 - (0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507202E~307 / (0.5E~323, ~0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (0.5E~323, ~0.22250738585072014E~307) = 0.0 rem (0.5E~323, ~0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, ~0.11125369292536007E~307) = ~0.0 + (0.5E~323, ~0.11125369292536007E~307) = ~0.11125369292536E~307 - (0.5E~323, ~0.11125369292536007E~307) = 0.1112536929253601E~307 / (0.5E~323, ~0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (0.5E~323, ~0.11125369292536007E~307) = 0.0 rem (0.5E~323, ~0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, ~0.5E~323) = ~0.0 + (0.5E~323, ~0.5E~323) = 0.0 - (0.5E~323, ~0.5E~323) = 0.1E~322 / (0.5E~323, ~0.5E~323) = ~0.1E1 nextAfter (0.5E~323, ~0.5E~323) = 0.0 rem (0.5E~323, ~0.5E~323) = 0.0 * (0.5E~323, ~0.0) = ~0.0 + (0.5E~323, ~0.0) = 0.5E~323 - (0.5E~323, ~0.0) = 0.5E~323 / (0.5E~323, ~0.0) = ~inf nextAfter (0.5E~323, ~0.0) = 0.0 rem (0.5E~323, ~0.0) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.5E~323, ~inf) = ~inf + (0.5E~323, ~inf) = ~inf - (0.5E~323, ~inf) = inf / (0.5E~323, ~inf) = ~0.0 nextAfter (0.5E~323, ~inf) = 0.0 rem (0.5E~323, ~inf) = 0.5E~323 * (0.5E~323, nan) = nan + (0.5E~323, nan) = nan - (0.5E~323, nan) = nan / (0.5E~323, nan) = nan nextAfter (0.5E~323, nan) = nan rem (0.5E~323, nan) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.0, 0.17976931348623157E309) = 0.0 + (0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.0, 0.17976931348623157E309) = 0.0 nextAfter (0.0, 0.17976931348623157E309) = 0.5E~323 rem (0.0, 0.17976931348623157E309) = 0.0 * (0.0, 0.8988465674311579E308) = 0.0 + (0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.0, 0.8988465674311579E308) = 0.0 nextAfter (0.0, 0.8988465674311579E308) = 0.5E~323 rem (0.0, 0.8988465674311579E308) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.5E~323 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.5E~323 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.3141592653589793E1) = 0.0 + (0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.0, 0.3141592653589793E1) = 0.0 nextAfter (0.0, 0.3141592653589793E1) = 0.5E~323 rem (0.0, 0.3141592653589793E1) = 0.0 * (0.0, 0.2718281828459045E1) = 0.0 + (0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.0, 0.2718281828459045E1) = 0.0 nextAfter (0.0, 0.2718281828459045E1) = 0.5E~323 rem (0.0, 0.2718281828459045E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.5E~323 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.5E~323 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.5E~323 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.22250738585072014E~307) = 0.0 + (0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (0.0, 0.22250738585072014E~307) = 0.0 nextAfter (0.0, 0.22250738585072014E~307) = 0.5E~323 rem (0.0, 0.22250738585072014E~307) = 0.0 * (0.0, 0.11125369292536007E~307) = 0.0 + (0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (0.0, 0.11125369292536007E~307) = 0.0 nextAfter (0.0, 0.11125369292536007E~307) = 0.5E~323 rem (0.0, 0.11125369292536007E~307) = 0.0 * (0.0, 0.5E~323) = 0.0 + (0.0, 0.5E~323) = 0.5E~323 - (0.0, 0.5E~323) = ~0.5E~323 / (0.0, 0.5E~323) = 0.0 nextAfter (0.0, 0.5E~323) = 0.5E~323 rem (0.0, 0.5E~323) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.17976931348623157E309) = ~0.0 + (0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.0, ~0.17976931348623157E309) = ~0.0 nextAfter (0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (0.0, ~0.17976931348623157E309) = 0.0 * (0.0, ~0.8988465674311579E308) = ~0.0 + (0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.0, ~0.8988465674311579E308) = ~0.0 nextAfter (0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (0.0, ~0.8988465674311579E308) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.5E~323 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.5E~323 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.3141592653589793E1) = ~0.0 + (0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.0, ~0.3141592653589793E1) = ~0.0 nextAfter (0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (0.0, ~0.3141592653589793E1) = 0.0 * (0.0, ~0.2718281828459045E1) = ~0.0 + (0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.0, ~0.2718281828459045E1) = ~0.0 nextAfter (0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (0.0, ~0.2718281828459045E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.5E~323 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.5E~323 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.5E~323 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.22250738585072014E~307) = ~0.0 + (0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (0.0, ~0.22250738585072014E~307) = ~0.0 nextAfter (0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (0.0, ~0.22250738585072014E~307) = 0.0 * (0.0, ~0.11125369292536007E~307) = ~0.0 + (0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.0, ~0.11125369292536007E~307) = ~0.0 nextAfter (0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (0.0, ~0.11125369292536007E~307) = 0.0 * (0.0, ~0.5E~323) = ~0.0 + (0.0, ~0.5E~323) = ~0.5E~323 - (0.0, ~0.5E~323) = 0.5E~323 / (0.0, ~0.5E~323) = ~0.0 nextAfter (0.0, ~0.5E~323) = ~0.5E~323 rem (0.0, ~0.5E~323) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.5E~323 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf + (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 - (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf / (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.1E1 nextAfter (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf + (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf / (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.2E1 nextAfter (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, 0.123E4) = ~inf + (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E4) = ~0.1461539134034403E306 nextAfter (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E4) = 0.0 * (~0.17976931348623157E309, 0.123E2) = ~inf + (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E2) = ~0.1461539134034403E308 nextAfter (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E2) = 0.0 * (~0.17976931348623157E309, 0.3141592653589793E1) = ~inf + (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, 0.2718281828459045E1) = ~inf + (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123E1) = ~inf + (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E1) = ~0.1461539134034403E309 nextAfter (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, 0.123) = ~0.22111625558806483E308 + (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123) = ~inf nextAfter (~0.17976931348623157E309, 0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123) = inf * (~0.17976931348623157E309, 0.123E~2) = ~0.2211162555880648E306 + (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E~2) = ~inf nextAfter (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E~2) = inf * (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.39999999999999996E1 + (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.22250738585072014E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.22250738585072014E~307) = inf * (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.19999999999999998E1 + (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.11125369292536007E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.11125369292536007E~307) = inf * (~0.17976931348623157E309, 0.5E~323) = ~0.8881784197001251E~15 + (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.5E~323) = ~inf nextAfter (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.5E~323) = inf * (~0.17976931348623157E309, 0.0) = ~0.0 + (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.0) = ~inf nextAfter (~0.17976931348623157E309, 0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.0) = nan * (~0.17976931348623157E309, ~0.17976931348623157E309) = inf + (~0.17976931348623157E309, ~0.17976931348623157E309) = ~inf - (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 / (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.1E1 nextAfter (~0.17976931348623157E309, ~0.17976931348623157E309) = ~0.17976931348623157E309 rem (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, ~0.8988465674311579E308) = inf + (~0.17976931348623157E309, ~0.8988465674311579E308) = ~inf - (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.2E1 nextAfter (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, ~0.123E4) = inf + (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E4) = 0.1461539134034403E306 nextAfter (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E4) = 0.0 * (~0.17976931348623157E309, ~0.123E2) = inf + (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E2) = 0.1461539134034403E308 nextAfter (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E2) = 0.0 * (~0.17976931348623157E309, ~0.3141592653589793E1) = inf + (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.0 * (~0.17976931348623157E309, ~0.2718281828459045E1) = inf + (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.2718281828459045E1) = 0.661334345850887E308 nextAfter (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123E1) = inf + (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E1) = 0.1461539134034403E309 nextAfter (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E1) = ~0.199584030953472E293 * (~0.17976931348623157E309, ~0.123) = 0.22111625558806483E308 + (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123) = inf nextAfter (~0.17976931348623157E309, ~0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123) = inf * (~0.17976931348623157E309, ~0.123E~2) = 0.2211162555880648E306 + (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E~2) = inf nextAfter (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E~2) = inf * (~0.17976931348623157E309, ~0.22250738585072014E~307) = 0.39999999999999996E1 + (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf nextAfter (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf * (~0.17976931348623157E309, ~0.11125369292536007E~307) = 0.19999999999999998E1 + (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf nextAfter (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf * (~0.17976931348623157E309, ~0.5E~323) = 0.8881784197001251E~15 + (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.5E~323) = inf nextAfter (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.5E~323) = inf * (~0.17976931348623157E309, ~0.0) = 0.0 + (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.0) = inf nextAfter (~0.17976931348623157E309, ~0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.0) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, ~inf) = inf + (~0.17976931348623157E309, ~inf) = ~inf - (~0.17976931348623157E309, ~inf) = inf / (~0.17976931348623157E309, ~inf) = 0.0 nextAfter (~0.17976931348623157E309, ~inf) = ~inf rem (~0.17976931348623157E309, ~inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, nan) = nan + (~0.17976931348623157E309, nan) = nan - (~0.17976931348623157E309, nan) = nan / (~0.17976931348623157E309, nan) = nan nextAfter (~0.17976931348623157E309, nan) = nan rem (~0.17976931348623157E309, nan) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf + (~0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 - (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf / (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.5 nextAfter (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, 0.8988465674311579E308) = ~inf + (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 - (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.17976931348623157E309 / (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.1E1 nextAfter (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, 0.123E4) = ~inf + (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E4) = ~0.7307695670172015E305 nextAfter (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E4) = 0.0 * (~0.8988465674311579E308, 0.123E2) = ~inf + (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E2) = ~0.7307695670172014E307 nextAfter (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E2) = 0.0 * (~0.8988465674311579E308, 0.3141592653589793E1) = ~inf + (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, 0.2718281828459045E1) = ~inf + (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123E1) = ~0.1105581277940324E309 + (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E1) = ~0.7307695670172015E308 nextAfter (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, 0.123) = ~0.11055812779403241E308 + (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123) = ~inf nextAfter (~0.8988465674311579E308, 0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123) = inf * (~0.8988465674311579E308, 0.123E~2) = ~0.1105581277940324E306 + (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E~2) = ~inf nextAfter (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E~2) = inf * (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.19999999999999998E1 + (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.22250738585072014E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.22250738585072014E~307) = inf * (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.9999999999999999 + (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.11125369292536007E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.11125369292536007E~307) = inf * (~0.8988465674311579E308, 0.5E~323) = ~0.44408920985006257E~15 + (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.5E~323) = ~inf nextAfter (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.5E~323) = inf * (~0.8988465674311579E308, 0.0) = ~0.0 + (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.0) = ~inf nextAfter (~0.8988465674311579E308, 0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.0) = nan * (~0.8988465674311579E308, ~0.17976931348623157E309) = inf + (~0.8988465674311579E308, ~0.17976931348623157E309) = ~inf - (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 / (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.5 nextAfter (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~0.8988465674311579E308) = inf + (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.17976931348623157E309 - (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 / (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.1E1 nextAfter (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.8988465674311579E308 rem (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, ~0.123E4) = inf + (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E4) = 0.7307695670172015E305 nextAfter (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E4) = 0.0 * (~0.8988465674311579E308, ~0.123E2) = inf + (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E2) = 0.7307695670172014E307 nextAfter (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E2) = 0.0 * (~0.8988465674311579E308, ~0.3141592653589793E1) = inf + (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.0 * (~0.8988465674311579E308, ~0.2718281828459045E1) = inf + (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123E1) = 0.1105581277940324E309 + (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E1) = 0.7307695670172015E308 nextAfter (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E1) = ~0.99792015476736E292 * (~0.8988465674311579E308, ~0.123) = 0.11055812779403241E308 + (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123) = inf nextAfter (~0.8988465674311579E308, ~0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123) = inf * (~0.8988465674311579E308, ~0.123E~2) = 0.1105581277940324E306 + (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E~2) = inf nextAfter (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E~2) = inf * (~0.8988465674311579E308, ~0.22250738585072014E~307) = 0.19999999999999998E1 + (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf nextAfter (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf * (~0.8988465674311579E308, ~0.11125369292536007E~307) = 0.9999999999999999 + (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf nextAfter (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf * (~0.8988465674311579E308, ~0.5E~323) = 0.44408920985006257E~15 + (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.5E~323) = inf nextAfter (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.5E~323) = inf * (~0.8988465674311579E308, ~0.0) = 0.0 + (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.0) = inf nextAfter (~0.8988465674311579E308, ~0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.0) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~inf) = inf + (~0.8988465674311579E308, ~inf) = ~inf - (~0.8988465674311579E308, ~inf) = inf / (~0.8988465674311579E308, ~inf) = 0.0 nextAfter (~0.8988465674311579E308, ~inf) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, nan) = nan + (~0.8988465674311579E308, nan) = nan - (~0.8988465674311579E308, nan) = nan / (~0.8988465674311579E308, nan) = nan nextAfter (~0.8988465674311579E308, nan) = nan rem (~0.8988465674311579E308, nan) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.123E4, 0.17976931348623157E309) = ~inf + (~0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E4, 0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (~0.123E4, 0.17976931348623157E309) = ~0.12299999999999998E4 rem (~0.123E4, 0.17976931348623157E309) = ~0.123E4 * (~0.123E4, 0.8988465674311579E308) = ~inf + (~0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E4, 0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (~0.123E4, 0.8988465674311579E308) = ~0.12299999999999998E4 rem (~0.123E4, 0.8988465674311579E308) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E2) = 0.0 * (~0.123E4, 0.3141592653589793E1) = ~0.38641589639154454E4 + (~0.123E4, 0.3141592653589793E1) = ~0.122685840734641E4 - (~0.123E4, 0.3141592653589793E1) = ~0.123314159265359E4 / (~0.123E4, 0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (~0.123E4, 0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, 0.2718281828459045E1) = ~0.33434866490046256E4 + (~0.123E4, 0.2718281828459045E1) = ~0.1227281718171541E4 - (~0.123E4, 0.2718281828459045E1) = ~0.1232718281828459E4 / (~0.123E4, 0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (~0.123E4, 0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E1) = 0.0 * (~0.123E4, 0.123) = ~0.15129E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999999999998E4 rem (~0.123E4, 0.123) = 0.0 * (~0.123E4, 0.123E~2) = ~0.15129E1 + (~0.123E4, 0.123E~2) = ~0.122999877E4 - (~0.123E4, 0.123E~2) = ~0.123000123E4 / (~0.123E4, 0.123E~2) = ~0.1E7 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E~2) = 0.0 * (~0.123E4, 0.22250738585072014E~307) = ~0.27368408459638577E~304 + (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E4, 0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.22250738585072014E~307) = inf * (~0.123E4, 0.11125369292536007E~307) = ~0.13684204229819289E~304 + (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E4, 0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.11125369292536007E~307) = inf * (~0.123E4, 0.5E~323) = ~0.6077E~320 + (~0.123E4, 0.5E~323) = ~0.123E4 - (~0.123E4, 0.5E~323) = ~0.123E4 / (~0.123E4, 0.5E~323) = ~inf nextAfter (~0.123E4, 0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, 0.5E~323) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999999999998E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.17976931348623157E309) = inf + (~0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E4, ~0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (~0.123E4, ~0.17976931348623157E309) = ~0.12300000000000002E4 rem (~0.123E4, ~0.17976931348623157E309) = ~0.123E4 * (~0.123E4, ~0.8988465674311579E308) = inf + (~0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E4, ~0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (~0.123E4, ~0.8988465674311579E308) = ~0.12300000000000002E4 rem (~0.123E4, ~0.8988465674311579E308) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E2) = 0.0 * (~0.123E4, ~0.3141592653589793E1) = 0.38641589639154454E4 + (~0.123E4, ~0.3141592653589793E1) = ~0.123314159265359E4 - (~0.123E4, ~0.3141592653589793E1) = ~0.122685840734641E4 / (~0.123E4, ~0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (~0.123E4, ~0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.3141592653589793E1) = ~0.16372724463908526E1 * (~0.123E4, ~0.2718281828459045E1) = 0.33434866490046256E4 + (~0.123E4, ~0.2718281828459045E1) = ~0.1232718281828459E4 - (~0.123E4, ~0.2718281828459045E1) = ~0.1227281718171541E4 / (~0.123E4, ~0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (~0.123E4, ~0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.2718281828459045E1) = ~0.13366135365115497E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E1) = 0.0 * (~0.123E4, ~0.123) = 0.15129E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123) = 0.0 * (~0.123E4, ~0.123E~2) = 0.15129E1 + (~0.123E4, ~0.123E~2) = ~0.123000123E4 - (~0.123E4, ~0.123E~2) = ~0.122999877E4 / (~0.123E4, ~0.123E~2) = 0.1E7 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E~2) = 0.0 * (~0.123E4, ~0.22250738585072014E~307) = 0.27368408459638577E~304 + (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, ~0.22250738585072014E~307) = inf nextAfter (~0.123E4, ~0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.22250738585072014E~307) = inf * (~0.123E4, ~0.11125369292536007E~307) = 0.13684204229819289E~304 + (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, ~0.11125369292536007E~307) = inf nextAfter (~0.123E4, ~0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.11125369292536007E~307) = inf * (~0.123E4, ~0.5E~323) = 0.6077E~320 + (~0.123E4, ~0.5E~323) = ~0.123E4 - (~0.123E4, ~0.5E~323) = ~0.123E4 / (~0.123E4, ~0.5E~323) = inf nextAfter (~0.123E4, ~0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, ~0.5E~323) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999999999998E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300000000000002E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.17976931348623157E309) = ~inf + (~0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E2, 0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (~0.123E2, 0.17976931348623157E309) = ~0.12299999999999999E2 rem (~0.123E2, 0.17976931348623157E309) = ~0.123E2 * (~0.123E2, 0.8988465674311579E308) = ~inf + (~0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E2, 0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (~0.123E2, 0.8988465674311579E308) = ~0.12299999999999999E2 rem (~0.123E2, 0.8988465674311579E308) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129000000000002E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.3141592653589793E1) = ~0.3864158963915446E2 + (~0.123E2, 0.3141592653589793E1) = ~0.9158407346410208E1 - (~0.123E2, 0.3141592653589793E1) = ~0.15441592653589794E2 / (~0.123E2, 0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (~0.123E2, 0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, 0.2718281828459045E1) = ~0.33434866490046254E2 + (~0.123E2, 0.2718281828459045E1) = ~0.9581718171540956E1 - (~0.123E2, 0.2718281828459045E1) = ~0.15018281828459045E2 / (~0.123E2, 0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (~0.123E2, 0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, 0.123E1) = ~0.15129000000000001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530000000000001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129000000000001E1 + (~0.123E2, 0.123) = ~0.12177000000000001E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.10000000000000001E3 nextAfter (~0.123E2, 0.123) = ~0.12299999999999999E2 rem (~0.123E2, 0.123) = 0.0 * (~0.123E2, 0.123E~2) = ~0.15129E~1 + (~0.123E2, 0.123E~2) = ~0.12298770000000001E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, 0.22250738585072014E~307) = ~0.2736840845963858E~306 + (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E2, 0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.22250738585072014E~307) = inf * (~0.123E2, 0.11125369292536007E~307) = ~0.1368420422981929E~306 + (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E2, 0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.11125369292536007E~307) = inf * (~0.123E2, 0.5E~323) = ~0.6E~322 + (~0.123E2, 0.5E~323) = ~0.123E2 - (~0.123E2, 0.5E~323) = ~0.123E2 / (~0.123E2, 0.5E~323) = ~inf nextAfter (~0.123E2, 0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, 0.5E~323) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999999999999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.17976931348623157E309) = inf + (~0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E2, ~0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (~0.123E2, ~0.17976931348623157E309) = ~0.12300000000000002E2 rem (~0.123E2, ~0.17976931348623157E309) = ~0.123E2 * (~0.123E2, ~0.8988465674311579E308) = inf + (~0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E2, ~0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (~0.123E2, ~0.8988465674311579E308) = ~0.12300000000000002E2 rem (~0.123E2, ~0.8988465674311579E308) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300000000000002E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129000000000002E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.3141592653589793E1) = 0.3864158963915446E2 + (~0.123E2, ~0.3141592653589793E1) = ~0.15441592653589794E2 - (~0.123E2, ~0.3141592653589793E1) = ~0.9158407346410208E1 / (~0.123E2, ~0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (~0.123E2, ~0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, ~0.2718281828459045E1) = 0.33434866490046254E2 + (~0.123E2, ~0.2718281828459045E1) = ~0.15018281828459045E2 - (~0.123E2, ~0.2718281828459045E1) = ~0.9581718171540956E1 / (~0.123E2, ~0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (~0.123E2, ~0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, ~0.123E1) = 0.15129000000000001E2 + (~0.123E2, ~0.123E1) = ~0.13530000000000001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129000000000001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177000000000001E2 / (~0.123E2, ~0.123) = 0.10000000000000001E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123) = 0.0 * (~0.123E2, ~0.123E~2) = 0.15129E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.12298770000000001E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E~2) = ~0.17763568394002505E~14 * (~0.123E2, ~0.22250738585072014E~307) = 0.2736840845963858E~306 + (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, ~0.22250738585072014E~307) = inf nextAfter (~0.123E2, ~0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.22250738585072014E~307) = inf * (~0.123E2, ~0.11125369292536007E~307) = 0.1368420422981929E~306 + (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, ~0.11125369292536007E~307) = inf nextAfter (~0.123E2, ~0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.11125369292536007E~307) = inf * (~0.123E2, ~0.5E~323) = 0.6E~322 + (~0.123E2, ~0.5E~323) = ~0.123E2 - (~0.123E2, ~0.5E~323) = ~0.123E2 / (~0.123E2, ~0.5E~323) = inf nextAfter (~0.123E2, ~0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, ~0.5E~323) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999999999999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300000000000002E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.3141592653589793E1, 0.17976931348623157E309) = ~inf + (~0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.8988465674311579E308) = ~inf + (~0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E4) = ~0.38641589639154454E4 + (~0.3141592653589793E1, 0.123E4) = 0.122685840734641E4 - (~0.3141592653589793E1, 0.123E4) = ~0.123314159265359E4 / (~0.3141592653589793E1, 0.123E4) = ~0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, 0.123E4) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E2) = ~0.3864158963915446E2 + (~0.3141592653589793E1, 0.123E2) = 0.9158407346410208E1 - (~0.3141592653589793E1, 0.123E2) = ~0.15441592653589794E2 / (~0.3141592653589793E1, 0.123E2) = ~0.2554140368772189 nextAfter (~0.3141592653589793E1, 0.123E2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.9869604401089358E1 + (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 - (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.6283185307179586E1 / (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.1E1 nextAfter (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8539734222673566E1 + (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 - (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.5859874482048838E1 / (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, 0.123E1) = ~0.38641589639154454E1 + (~0.3141592653589793E1, 0.123E1) = ~0.19115926535897931E1 - (~0.3141592653589793E1, 0.123E1) = ~0.43715926535897935E1 / (~0.3141592653589793E1, 0.123E1) = ~0.25541403687721895E1 nextAfter (~0.3141592653589793E1, 0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, 0.123) = ~0.38641589639154456 + (~0.3141592653589793E1, 0.123) = ~0.3018592653589793E1 - (~0.3141592653589793E1, 0.123) = ~0.32645926535897933E1 / (~0.3141592653589793E1, 0.123) = ~0.25541403687721896E2 nextAfter (~0.3141592653589793E1, 0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, 0.123E~2) = ~0.38641589639154456E~2 + (~0.3141592653589793E1, 0.123E~2) = ~0.3140362653589793E1 - (~0.3141592653589793E1, 0.123E~2) = ~0.3142822653589793E1 / (~0.3141592653589793E1, 0.123E~2) = ~0.25541403687721895E4 nextAfter (~0.3141592653589793E1, 0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.6990275687580919E~307 + (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.34951378437904593E~307 + (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.11125369292536007E~307) = inf * (~0.3141592653589793E1, 0.5E~323) = ~0.15E~322 + (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.5E~323) = ~inf nextAfter (~0.3141592653589793E1, 0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.5E~323) = inf * (~0.3141592653589793E1, 0.0) = ~0.0 + (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.0) = ~inf nextAfter (~0.3141592653589793E1, 0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.0) = nan * (~0.3141592653589793E1, ~0.17976931348623157E309) = inf + (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.8988465674311579E308) = inf + (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E4) = 0.38641589639154454E4 + (~0.3141592653589793E1, ~0.123E4) = ~0.123314159265359E4 - (~0.3141592653589793E1, ~0.123E4) = 0.122685840734641E4 / (~0.3141592653589793E1, ~0.123E4) = 0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, ~0.123E4) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E2) = 0.3864158963915446E2 + (~0.3141592653589793E1, ~0.123E2) = ~0.15441592653589794E2 - (~0.3141592653589793E1, ~0.123E2) = 0.9158407346410208E1 / (~0.3141592653589793E1, ~0.123E2) = 0.2554140368772189 nextAfter (~0.3141592653589793E1, ~0.123E2) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.9869604401089358E1 + (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.6283185307179586E1 - (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 / (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.1E1 nextAfter (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.3141592653589793E1 rem (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.8539734222673566E1 + (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.5859874482048838E1 - (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 / (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, ~0.123E1) = 0.38641589639154454E1 + (~0.3141592653589793E1, ~0.123E1) = ~0.43715926535897935E1 - (~0.3141592653589793E1, ~0.123E1) = ~0.19115926535897931E1 / (~0.3141592653589793E1, ~0.123E1) = 0.25541403687721895E1 nextAfter (~0.3141592653589793E1, ~0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, ~0.123) = 0.38641589639154456 + (~0.3141592653589793E1, ~0.123) = ~0.32645926535897933E1 - (~0.3141592653589793E1, ~0.123) = ~0.3018592653589793E1 / (~0.3141592653589793E1, ~0.123) = 0.25541403687721896E2 nextAfter (~0.3141592653589793E1, ~0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123) = ~0.6659265358979294E~1 * (~0.3141592653589793E1, ~0.123E~2) = 0.38641589639154456E~2 + (~0.3141592653589793E1, ~0.123E~2) = ~0.3142822653589793E1 - (~0.3141592653589793E1, ~0.123E~2) = ~0.3140362653589793E1 / (~0.3141592653589793E1, ~0.123E~2) = 0.25541403687721895E4 nextAfter (~0.3141592653589793E1, ~0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E~2) = ~0.17265358979301482E~3 * (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.6990275687580919E~307 + (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, ~0.11125369292536007E~307) = 0.34951378437904593E~307 + (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf nextAfter (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf * (~0.3141592653589793E1, ~0.5E~323) = 0.15E~322 + (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.5E~323) = inf nextAfter (~0.3141592653589793E1, ~0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.5E~323) = inf * (~0.3141592653589793E1, ~0.0) = 0.0 + (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.0) = inf nextAfter (~0.3141592653589793E1, ~0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.0) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~inf) = inf + (~0.3141592653589793E1, ~inf) = ~inf - (~0.3141592653589793E1, ~inf) = inf / (~0.3141592653589793E1, ~inf) = 0.0 nextAfter (~0.3141592653589793E1, ~inf) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, nan) = nan + (~0.3141592653589793E1, nan) = nan - (~0.3141592653589793E1, nan) = nan / (~0.3141592653589793E1, nan) = nan nextAfter (~0.3141592653589793E1, nan) = nan rem (~0.3141592653589793E1, nan) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.2718281828459045E1, 0.17976931348623157E309) = ~inf + (~0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.8988465674311579E308) = ~inf + (~0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E4) = ~0.33434866490046256E4 + (~0.2718281828459045E1, 0.123E4) = 0.1227281718171541E4 - (~0.2718281828459045E1, 0.123E4) = ~0.1232718281828459E4 / (~0.2718281828459045E1, 0.123E4) = ~0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, 0.123E4) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E2) = ~0.33434866490046254E2 + (~0.2718281828459045E1, 0.123E2) = 0.9581718171540956E1 - (~0.2718281828459045E1, 0.123E2) = ~0.15018281828459045E2 / (~0.2718281828459045E1, 0.123E2) = ~0.22099852263894673 nextAfter (~0.2718281828459045E1, 0.123E2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8539734222673566E1 + (~0.2718281828459045E1, 0.3141592653589793E1) = 0.423310825130748 - (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.5859874482048838E1 / (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8652559794322651 nextAfter (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.73890560989306495E1 + (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 - (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.543656365691809E1 / (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.1E1 nextAfter (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, 0.123E1) = ~0.33434866490046256E1 + (~0.2718281828459045E1, 0.123E1) = ~0.1488281828459045E1 - (~0.2718281828459045E1, 0.123E1) = ~0.3948281828459045E1 / (~0.2718281828459045E1, 0.123E1) = ~0.22099852263894677E1 nextAfter (~0.2718281828459045E1, 0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, 0.123) = ~0.33434866490046256 + (~0.2718281828459045E1, 0.123) = ~0.25952818284590453E1 - (~0.2718281828459045E1, 0.123) = ~0.2841281828459045E1 / (~0.2718281828459045E1, 0.123) = ~0.22099852263894675E2 nextAfter (~0.2718281828459045E1, 0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, 0.123E~2) = ~0.33434866490046253E~2 + (~0.2718281828459045E1, 0.123E~2) = ~0.2717051828459045E1 - (~0.2718281828459045E1, 0.123E~2) = ~0.2719511828459045E1 / (~0.2718281828459045E1, 0.123E~2) = ~0.22099852263894677E4 nextAfter (~0.2718281828459045E1, 0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.6048377836559378E~307 + (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.3024188918279689E~307 + (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.11125369292536007E~307) = inf * (~0.2718281828459045E1, 0.5E~323) = ~0.15E~322 + (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.5E~323) = ~inf nextAfter (~0.2718281828459045E1, 0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.5E~323) = inf * (~0.2718281828459045E1, 0.0) = ~0.0 + (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.0) = ~inf nextAfter (~0.2718281828459045E1, 0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.0) = nan * (~0.2718281828459045E1, ~0.17976931348623157E309) = inf + (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.8988465674311579E308) = inf + (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E4) = 0.33434866490046256E4 + (~0.2718281828459045E1, ~0.123E4) = ~0.1232718281828459E4 - (~0.2718281828459045E1, ~0.123E4) = 0.1227281718171541E4 / (~0.2718281828459045E1, ~0.123E4) = 0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, ~0.123E4) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E2) = 0.33434866490046254E2 + (~0.2718281828459045E1, ~0.123E2) = ~0.15018281828459045E2 - (~0.2718281828459045E1, ~0.123E2) = 0.9581718171540956E1 / (~0.2718281828459045E1, ~0.123E2) = 0.22099852263894673 nextAfter (~0.2718281828459045E1, ~0.123E2) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8539734222673566E1 + (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.5859874482048838E1 - (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.423310825130748 / (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8652559794322651 nextAfter (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.73890560989306495E1 + (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.543656365691809E1 - (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 / (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.1E1 nextAfter (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.2718281828459045E1 rem (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, ~0.123E1) = 0.33434866490046256E1 + (~0.2718281828459045E1, ~0.123E1) = ~0.3948281828459045E1 - (~0.2718281828459045E1, ~0.123E1) = ~0.1488281828459045E1 / (~0.2718281828459045E1, ~0.123E1) = 0.22099852263894677E1 nextAfter (~0.2718281828459045E1, ~0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, ~0.123) = 0.33434866490046256 + (~0.2718281828459045E1, ~0.123) = ~0.2841281828459045E1 - (~0.2718281828459045E1, ~0.123) = ~0.25952818284590453E1 / (~0.2718281828459045E1, ~0.123) = 0.22099852263894675E2 nextAfter (~0.2718281828459045E1, ~0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, ~0.123E~2) = 0.33434866490046253E~2 + (~0.2718281828459045E1, ~0.123E~2) = ~0.2719511828459045E1 - (~0.2718281828459045E1, ~0.123E~2) = ~0.2717051828459045E1 / (~0.2718281828459045E1, ~0.123E~2) = 0.22099852263894677E4 nextAfter (~0.2718281828459045E1, ~0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E~2) = ~0.12118284590449946E~2 * (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.6048377836559378E~307 + (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, ~0.11125369292536007E~307) = 0.3024188918279689E~307 + (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf nextAfter (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf * (~0.2718281828459045E1, ~0.5E~323) = 0.15E~322 + (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.5E~323) = inf nextAfter (~0.2718281828459045E1, ~0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.5E~323) = inf * (~0.2718281828459045E1, ~0.0) = 0.0 + (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.0) = inf nextAfter (~0.2718281828459045E1, ~0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.0) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~inf) = inf + (~0.2718281828459045E1, ~inf) = ~inf - (~0.2718281828459045E1, ~inf) = inf / (~0.2718281828459045E1, ~inf) = 0.0 nextAfter (~0.2718281828459045E1, ~inf) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, nan) = nan + (~0.2718281828459045E1, nan) = nan - (~0.2718281828459045E1, nan) = nan / (~0.2718281828459045E1, nan) = nan nextAfter (~0.2718281828459045E1, nan) = nan rem (~0.2718281828459045E1, nan) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.123E1, 0.17976931348623157E309) = ~inf + (~0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E1, 0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (~0.123E1, 0.17976931348623157E309) = ~0.12299999999999998E1 rem (~0.123E1, 0.17976931348623157E309) = ~0.123E1 * (~0.123E1, 0.8988465674311579E308) = ~0.1105581277940324E309 + (~0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E1, 0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (~0.123E1, 0.8988465674311579E308) = ~0.12299999999999998E1 rem (~0.123E1, 0.8988465674311579E308) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129000000000001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530000000000001E2 / (~0.123E1, 0.123E2) = ~0.9999999999999999E~1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.3141592653589793E1) = ~0.38641589639154454E1 + (~0.123E1, 0.3141592653589793E1) = 0.19115926535897931E1 - (~0.123E1, 0.3141592653589793E1) = ~0.43715926535897935E1 / (~0.123E1, 0.3141592653589793E1) = ~0.3915211600060625 nextAfter (~0.123E1, 0.3141592653589793E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.3141592653589793E1) = ~0.123E1 * (~0.123E1, 0.2718281828459045E1) = ~0.33434866490046256E1 + (~0.123E1, 0.2718281828459045E1) = 0.1488281828459045E1 - (~0.123E1, 0.2718281828459045E1) = ~0.3948281828459045E1 / (~0.123E1, 0.2718281828459045E1) = ~0.45249171264087407 nextAfter (~0.123E1, 0.2718281828459045E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.2718281828459045E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999999999998E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E~2) = 0.0 * (~0.123E1, 0.22250738585072014E~307) = ~0.27368408459638577E~307 + (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, 0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (~0.123E1, 0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.22250738585072014E~307) = 0.0 * (~0.123E1, 0.11125369292536007E~307) = ~0.1368420422981929E~307 + (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, 0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (~0.123E1, 0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.11125369292536007E~307) = 0.0 * (~0.123E1, 0.5E~323) = ~0.5E~323 + (~0.123E1, 0.5E~323) = ~0.123E1 - (~0.123E1, 0.5E~323) = ~0.123E1 / (~0.123E1, 0.5E~323) = ~inf nextAfter (~0.123E1, 0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, 0.5E~323) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999999999998E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.17976931348623157E309) = inf + (~0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E1, ~0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (~0.123E1, ~0.17976931348623157E309) = ~0.12300000000000002E1 rem (~0.123E1, ~0.17976931348623157E309) = ~0.123E1 * (~0.123E1, ~0.8988465674311579E308) = 0.1105581277940324E309 + (~0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E1, ~0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (~0.123E1, ~0.8988465674311579E308) = ~0.12300000000000002E1 rem (~0.123E1, ~0.8988465674311579E308) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129000000000001E2 + (~0.123E1, ~0.123E2) = ~0.13530000000000001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.9999999999999999E~1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.3141592653589793E1) = 0.38641589639154454E1 + (~0.123E1, ~0.3141592653589793E1) = ~0.43715926535897935E1 - (~0.123E1, ~0.3141592653589793E1) = 0.19115926535897931E1 / (~0.123E1, ~0.3141592653589793E1) = 0.3915211600060625 nextAfter (~0.123E1, ~0.3141592653589793E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.3141592653589793E1) = ~0.123E1 * (~0.123E1, ~0.2718281828459045E1) = 0.33434866490046256E1 + (~0.123E1, ~0.2718281828459045E1) = ~0.3948281828459045E1 - (~0.123E1, ~0.2718281828459045E1) = 0.1488281828459045E1 / (~0.123E1, ~0.2718281828459045E1) = 0.45249171264087407 nextAfter (~0.123E1, ~0.2718281828459045E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.2718281828459045E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123E~2) = 0.0 * (~0.123E1, ~0.22250738585072014E~307) = 0.27368408459638577E~307 + (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, ~0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (~0.123E1, ~0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.22250738585072014E~307) = 0.0 * (~0.123E1, ~0.11125369292536007E~307) = 0.1368420422981929E~307 + (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, ~0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (~0.123E1, ~0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.11125369292536007E~307) = 0.0 * (~0.123E1, ~0.5E~323) = 0.5E~323 + (~0.123E1, ~0.5E~323) = ~0.123E1 - (~0.123E1, ~0.5E~323) = ~0.123E1 / (~0.123E1, ~0.5E~323) = inf nextAfter (~0.123E1, ~0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, ~0.5E~323) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999999999998E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300000000000002E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.17976931348623157E309) = ~0.22111625558806483E308 + (~0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123, 0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (~0.123, 0.17976931348623157E309) = ~0.12299999999999998 rem (~0.123, 0.17976931348623157E309) = ~0.123 * (~0.123, 0.8988465674311579E308) = ~0.11055812779403241E308 + (~0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123, 0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (~0.123, 0.8988465674311579E308) = ~0.12299999999999998 rem (~0.123, 0.8988465674311579E308) = ~0.123 * (~0.123, 0.123E4) = ~0.15129E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.1E~3 nextAfter (~0.123, 0.123E4) = ~0.12299999999999998 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129000000000001E1 + (~0.123, 0.123E2) = 0.12177000000000001E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.9999999999999998E~2 nextAfter (~0.123, 0.123E2) = ~0.12299999999999998 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.3141592653589793E1) = ~0.38641589639154456 + (~0.123, 0.3141592653589793E1) = 0.3018592653589793E1 - (~0.123, 0.3141592653589793E1) = ~0.32645926535897933E1 / (~0.123, 0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (~0.123, 0.3141592653589793E1) = ~0.12299999999999998 rem (~0.123, 0.3141592653589793E1) = ~0.123 * (~0.123, 0.2718281828459045E1) = ~0.33434866490046256 + (~0.123, 0.2718281828459045E1) = 0.25952818284590453E1 - (~0.123, 0.2718281828459045E1) = ~0.2841281828459045E1 / (~0.123, 0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (~0.123, 0.2718281828459045E1) = ~0.12299999999999998 rem (~0.123, 0.2718281828459045E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.12299999999999998 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.12299999999999998 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.12423 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.12299999999999998 rem (~0.123, 0.123E~2) = 0.0 * (~0.123, 0.22250738585072014E~307) = ~0.273684084596386E~308 + (~0.123, 0.22250738585072014E~307) = ~0.123 - (~0.123, 0.22250738585072014E~307) = ~0.123 / (~0.123, 0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (~0.123, 0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, 0.22250738585072014E~307) = 0.0 * (~0.123, 0.11125369292536007E~307) = ~0.136842042298193E~308 + (~0.123, 0.11125369292536007E~307) = ~0.123 - (~0.123, 0.11125369292536007E~307) = ~0.123 / (~0.123, 0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (~0.123, 0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, 0.11125369292536007E~307) = 0.0 * (~0.123, 0.5E~323) = ~0.0 + (~0.123, 0.5E~323) = ~0.123 - (~0.123, 0.5E~323) = ~0.123 / (~0.123, 0.5E~323) = ~inf nextAfter (~0.123, 0.5E~323) = ~0.12299999999999998 rem (~0.123, 0.5E~323) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.12299999999999998 rem (~0.123, 0.0) = nan * (~0.123, ~0.17976931348623157E309) = 0.22111625558806483E308 + (~0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123, ~0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (~0.123, ~0.17976931348623157E309) = ~0.12300000000000001 rem (~0.123, ~0.17976931348623157E309) = ~0.123 * (~0.123, ~0.8988465674311579E308) = 0.11055812779403241E308 + (~0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123, ~0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (~0.123, ~0.8988465674311579E308) = ~0.12300000000000001 rem (~0.123, ~0.8988465674311579E308) = ~0.123 * (~0.123, ~0.123E4) = 0.15129E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.1E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300000000000001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129000000000001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177000000000001E2 / (~0.123, ~0.123E2) = 0.9999999999999998E~2 nextAfter (~0.123, ~0.123E2) = ~0.12300000000000001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.3141592653589793E1) = 0.38641589639154456 + (~0.123, ~0.3141592653589793E1) = ~0.32645926535897933E1 - (~0.123, ~0.3141592653589793E1) = 0.3018592653589793E1 / (~0.123, ~0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (~0.123, ~0.3141592653589793E1) = ~0.12300000000000001 rem (~0.123, ~0.3141592653589793E1) = ~0.123 * (~0.123, ~0.2718281828459045E1) = 0.33434866490046256 + (~0.123, ~0.2718281828459045E1) = ~0.2841281828459045E1 - (~0.123, ~0.2718281828459045E1) = 0.25952818284590453E1 / (~0.123, ~0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (~0.123, ~0.2718281828459045E1) = ~0.12300000000000001 rem (~0.123, ~0.2718281828459045E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300000000000001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.12423 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.12299999999999998 rem (~0.123, ~0.123E~2) = 0.0 * (~0.123, ~0.22250738585072014E~307) = 0.273684084596386E~308 + (~0.123, ~0.22250738585072014E~307) = ~0.123 - (~0.123, ~0.22250738585072014E~307) = ~0.123 / (~0.123, ~0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (~0.123, ~0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, ~0.22250738585072014E~307) = 0.0 * (~0.123, ~0.11125369292536007E~307) = 0.136842042298193E~308 + (~0.123, ~0.11125369292536007E~307) = ~0.123 - (~0.123, ~0.11125369292536007E~307) = ~0.123 / (~0.123, ~0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (~0.123, ~0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, ~0.11125369292536007E~307) = 0.0 * (~0.123, ~0.5E~323) = 0.0 + (~0.123, ~0.5E~323) = ~0.123 - (~0.123, ~0.5E~323) = ~0.123 / (~0.123, ~0.5E~323) = inf nextAfter (~0.123, ~0.5E~323) = ~0.12299999999999998 rem (~0.123, ~0.5E~323) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.12299999999999998 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300000000000001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.17976931348623157E309) = ~0.2211162555880648E306 + (~0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E~2, 0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (~0.123E~2, 0.17976931348623157E309) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, 0.8988465674311579E308) = ~0.1105581277940324E306 + (~0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E~2, 0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (~0.123E~2, 0.8988465674311579E308) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129E1 + (~0.123E~2, 0.123E4) = 0.122999877E4 - (~0.123E~2, 0.123E4) = ~0.123000123E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129E~1 + (~0.123E~2, 0.123E2) = 0.12298770000000001E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.9999999999999999E~4 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.3141592653589793E1) = ~0.38641589639154456E~2 + (~0.123E~2, 0.3141592653589793E1) = 0.3140362653589793E1 - (~0.123E~2, 0.3141592653589793E1) = ~0.3142822653589793E1 / (~0.123E~2, 0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (~0.123E~2, 0.3141592653589793E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, 0.2718281828459045E1) = ~0.33434866490046253E~2 + (~0.123E~2, 0.2718281828459045E1) = 0.2717051828459045E1 - (~0.123E~2, 0.2718281828459045E1) = ~0.2719511828459045E1 / (~0.123E~2, 0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (~0.123E~2, 0.2718281828459045E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.12423 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.22250738585072014E~307) = ~0.2736840845964E~310 + (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, 0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (~0.123E~2, 0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.22250738585072014E~307) = 0.0 * (~0.123E~2, 0.11125369292536007E~307) = ~0.1368420422982E~310 + (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, 0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (~0.123E~2, 0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.11125369292536007E~307) = 0.0 * (~0.123E~2, 0.5E~323) = ~0.0 + (~0.123E~2, 0.5E~323) = ~0.123E~2 - (~0.123E~2, 0.5E~323) = ~0.123E~2 / (~0.123E~2, 0.5E~323) = ~inf nextAfter (~0.123E~2, 0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.5E~323) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.17976931348623157E309) = 0.2211162555880648E306 + (~0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E~2, ~0.17976931348623157E309) = 0.684210211491E~311 nextAfter (~0.123E~2, ~0.17976931348623157E309) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, ~0.8988465674311579E308) = 0.1105581277940324E306 + (~0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E~2, ~0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (~0.123E~2, ~0.8988465674311579E308) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129E1 + (~0.123E~2, ~0.123E4) = ~0.123000123E4 - (~0.123E~2, ~0.123E4) = 0.122999877E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.12298770000000001E2 / (~0.123E~2, ~0.123E2) = 0.9999999999999999E~4 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.3141592653589793E1) = 0.38641589639154456E~2 + (~0.123E~2, ~0.3141592653589793E1) = ~0.3142822653589793E1 - (~0.123E~2, ~0.3141592653589793E1) = 0.3140362653589793E1 / (~0.123E~2, ~0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (~0.123E~2, ~0.3141592653589793E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, ~0.2718281828459045E1) = 0.33434866490046253E~2 + (~0.123E~2, ~0.2718281828459045E1) = ~0.2719511828459045E1 - (~0.123E~2, ~0.2718281828459045E1) = 0.2717051828459045E1 / (~0.123E~2, ~0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (~0.123E~2, ~0.2718281828459045E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.12423 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.22250738585072014E~307) = 0.2736840845964E~310 + (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, ~0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (~0.123E~2, ~0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.22250738585072014E~307) = 0.0 * (~0.123E~2, ~0.11125369292536007E~307) = 0.1368420422982E~310 + (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, ~0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (~0.123E~2, ~0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.11125369292536007E~307) = 0.0 * (~0.123E~2, ~0.5E~323) = 0.0 + (~0.123E~2, ~0.5E~323) = ~0.123E~2 - (~0.123E~2, ~0.5E~323) = ~0.123E~2 / (~0.123E~2, ~0.5E~323) = inf nextAfter (~0.123E~2, ~0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.5E~323) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300000000000002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.39999999999999996E1 + (~0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.19999999999999998E1 + (~0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E4) = ~0.27368408459638577E~304 + (~0.22250738585072014E~307, 0.123E4) = 0.123E4 - (~0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (~0.22250738585072014E~307, 0.123E4) = ~0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, 0.123E4) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E2) = ~0.2736840845963858E~306 + (~0.22250738585072014E~307, 0.123E2) = 0.123E2 - (~0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (~0.22250738585072014E~307, 0.123E2) = ~0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, 0.123E2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.6990275687580919E~307 + (~0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.6048377836559378E~307 + (~0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E1) = ~0.27368408459638577E~307 + (~0.22250738585072014E~307, 0.123E1) = 0.123E1 - (~0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (~0.22250738585072014E~307, 0.123E1) = ~0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, 0.123E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123) = ~0.273684084596386E~308 + (~0.22250738585072014E~307, 0.123) = 0.123 - (~0.22250738585072014E~307, 0.123) = ~0.123 / (~0.22250738585072014E~307, 0.123) = ~0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, 0.123) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E~2) = ~0.2736840845964E~310 + (~0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (~0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (~0.22250738585072014E~307, 0.123E~2) = ~0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, 0.123E~2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.0 + (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 - (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.4450147717014403E~307 / (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.1E1 nextAfter (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.0 + (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.3337610787760802E~307 / (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2E1 nextAfter (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, 0.5E~323) = ~0.0 + (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 - (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507202E~307 / (~0.22250738585072014E~307, 0.5E~323) = ~0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.5E~323) = 0.0 * (~0.22250738585072014E~307, 0.0) = ~0.0 + (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, 0.0) = ~inf nextAfter (~0.22250738585072014E~307, 0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.0) = nan * (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.39999999999999996E1 + (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.19999999999999998E1 + (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E4) = 0.27368408459638577E~304 + (~0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (~0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (~0.22250738585072014E~307, ~0.123E4) = 0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, ~0.123E4) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E2) = 0.2736840845963858E~306 + (~0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (~0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (~0.22250738585072014E~307, ~0.123E2) = 0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, ~0.123E2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.6990275687580919E~307 + (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.6048377836559378E~307 + (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E1) = 0.27368408459638577E~307 + (~0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (~0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (~0.22250738585072014E~307, ~0.123E1) = 0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, ~0.123E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123) = 0.273684084596386E~308 + (~0.22250738585072014E~307, ~0.123) = ~0.123 - (~0.22250738585072014E~307, ~0.123) = 0.123 / (~0.22250738585072014E~307, ~0.123) = 0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, ~0.123) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E~2) = 0.2736840845964E~310 + (~0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (~0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (~0.22250738585072014E~307, ~0.123E~2) = 0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, ~0.123E~2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 + (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.4450147717014403E~307 - (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 / (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.1E1 nextAfter (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 rem (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 + (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.3337610787760802E~307 - (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2E1 nextAfter (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, ~0.5E~323) = 0.0 + (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507202E~307 - (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 / (~0.22250738585072014E~307, ~0.5E~323) = 0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.5E~323) = 0.0 * (~0.22250738585072014E~307, ~0.0) = 0.0 + (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, ~0.0) = inf nextAfter (~0.22250738585072014E~307, ~0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.0) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~inf) = inf + (~0.22250738585072014E~307, ~inf) = ~inf - (~0.22250738585072014E~307, ~inf) = inf / (~0.22250738585072014E~307, ~inf) = 0.0 nextAfter (~0.22250738585072014E~307, ~inf) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, nan) = nan + (~0.22250738585072014E~307, nan) = nan - (~0.22250738585072014E~307, nan) = nan / (~0.22250738585072014E~307, nan) = nan nextAfter (~0.22250738585072014E~307, nan) = nan rem (~0.22250738585072014E~307, nan) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.19999999999999998E1 + (~0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.9999999999999999 + (~0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E4) = ~0.13684204229819289E~304 + (~0.11125369292536007E~307, 0.123E4) = 0.123E4 - (~0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (~0.11125369292536007E~307, 0.123E4) = ~0.904501568499E~311 nextAfter (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E2) = ~0.1368420422981929E~306 + (~0.11125369292536007E~307, 0.123E2) = 0.123E2 - (~0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (~0.11125369292536007E~307, 0.123E2) = ~0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.34951378437904593E~307 + (~0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.3024188918279689E~307 + (~0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E1) = ~0.1368420422981929E~307 + (~0.11125369292536007E~307, 0.123E1) = 0.123E1 - (~0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (~0.11125369292536007E~307, 0.123E1) = ~0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123) = ~0.136842042298193E~308 + (~0.11125369292536007E~307, 0.123) = 0.123 - (~0.11125369292536007E~307, 0.123) = ~0.123 / (~0.11125369292536007E~307, 0.123) = ~0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, 0.123) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E~2) = ~0.1368420422982E~310 + (~0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (~0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (~0.11125369292536007E~307, 0.123E~2) = ~0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.0 + (~0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.3337610787760802E~307 / (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.5 nextAfter (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.0 + (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 - (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.22250738585072014E~307 / (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.1E1 nextAfter (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, 0.5E~323) = ~0.0 + (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 - (~0.11125369292536007E~307, 0.5E~323) = ~0.1112536929253601E~307 / (~0.11125369292536007E~307, 0.5E~323) = ~0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.5E~323) = 0.0 * (~0.11125369292536007E~307, 0.0) = ~0.0 + (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, 0.0) = ~inf nextAfter (~0.11125369292536007E~307, 0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.0) = nan * (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.19999999999999998E1 + (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.9999999999999999 + (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E4) = 0.13684204229819289E~304 + (~0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (~0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (~0.11125369292536007E~307, ~0.123E4) = 0.904501568499E~311 nextAfter (~0.11125369292536007E~307, ~0.123E4) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E2) = 0.1368420422981929E~306 + (~0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (~0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (~0.11125369292536007E~307, ~0.123E2) = 0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, ~0.123E2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.34951378437904593E~307 + (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.3024188918279689E~307 + (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E1) = 0.1368420422981929E~307 + (~0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (~0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (~0.11125369292536007E~307, ~0.123E1) = 0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, ~0.123E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123) = 0.136842042298193E~308 + (~0.11125369292536007E~307, ~0.123) = ~0.123 - (~0.11125369292536007E~307, ~0.123) = 0.123 / (~0.11125369292536007E~307, ~0.123) = 0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, ~0.123) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E~2) = 0.1368420422982E~310 + (~0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (~0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (~0.11125369292536007E~307, ~0.123E~2) = 0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, ~0.123E~2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.0 + (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.3337610787760802E~307 - (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.5 nextAfter (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 + (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.22250738585072014E~307 - (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 / (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.1E1 nextAfter (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 rem (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, ~0.5E~323) = 0.0 + (~0.11125369292536007E~307, ~0.5E~323) = ~0.1112536929253601E~307 - (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 / (~0.11125369292536007E~307, ~0.5E~323) = 0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.5E~323) = 0.0 * (~0.11125369292536007E~307, ~0.0) = 0.0 + (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.0) = inf nextAfter (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.0) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~inf) = inf + (~0.11125369292536007E~307, ~inf) = ~inf - (~0.11125369292536007E~307, ~inf) = inf / (~0.11125369292536007E~307, ~inf) = 0.0 nextAfter (~0.11125369292536007E~307, ~inf) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, nan) = nan + (~0.11125369292536007E~307, nan) = nan - (~0.11125369292536007E~307, nan) = nan / (~0.11125369292536007E~307, nan) = nan nextAfter (~0.11125369292536007E~307, nan) = nan rem (~0.11125369292536007E~307, nan) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.5E~323, 0.17976931348623157E309) = ~0.8881784197001251E~15 + (~0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.5E~323, 0.17976931348623157E309) = ~0.0 nextAfter (~0.5E~323, 0.17976931348623157E309) = ~0.0 rem (~0.5E~323, 0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, 0.8988465674311579E308) = ~0.44408920985006257E~15 + (~0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.5E~323, 0.8988465674311579E308) = ~0.0 nextAfter (~0.5E~323, 0.8988465674311579E308) = ~0.0 rem (~0.5E~323, 0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, 0.123E4) = ~0.6077E~320 + (~0.5E~323, 0.123E4) = 0.123E4 - (~0.5E~323, 0.123E4) = ~0.123E4 / (~0.5E~323, 0.123E4) = ~0.0 nextAfter (~0.5E~323, 0.123E4) = ~0.0 rem (~0.5E~323, 0.123E4) = ~0.5E~323 * (~0.5E~323, 0.123E2) = ~0.6E~322 + (~0.5E~323, 0.123E2) = 0.123E2 - (~0.5E~323, 0.123E2) = ~0.123E2 / (~0.5E~323, 0.123E2) = ~0.0 nextAfter (~0.5E~323, 0.123E2) = ~0.0 rem (~0.5E~323, 0.123E2) = ~0.5E~323 * (~0.5E~323, 0.3141592653589793E1) = ~0.15E~322 + (~0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.5E~323, 0.3141592653589793E1) = ~0.0 nextAfter (~0.5E~323, 0.3141592653589793E1) = ~0.0 rem (~0.5E~323, 0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, 0.2718281828459045E1) = ~0.15E~322 + (~0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.5E~323, 0.2718281828459045E1) = ~0.0 nextAfter (~0.5E~323, 0.2718281828459045E1) = ~0.0 rem (~0.5E~323, 0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, 0.123E1) = ~0.5E~323 + (~0.5E~323, 0.123E1) = 0.123E1 - (~0.5E~323, 0.123E1) = ~0.123E1 / (~0.5E~323, 0.123E1) = ~0.5E~323 nextAfter (~0.5E~323, 0.123E1) = ~0.0 rem (~0.5E~323, 0.123E1) = ~0.5E~323 * (~0.5E~323, 0.123) = ~0.0 + (~0.5E~323, 0.123) = 0.123 - (~0.5E~323, 0.123) = ~0.123 / (~0.5E~323, 0.123) = ~0.4E~322 nextAfter (~0.5E~323, 0.123) = ~0.0 rem (~0.5E~323, 0.123) = ~0.5E~323 * (~0.5E~323, 0.123E~2) = ~0.0 + (~0.5E~323, 0.123E~2) = 0.123E~2 - (~0.5E~323, 0.123E~2) = ~0.123E~2 / (~0.5E~323, 0.123E~2) = ~0.4017E~320 nextAfter (~0.5E~323, 0.123E~2) = ~0.0 rem (~0.5E~323, 0.123E~2) = ~0.5E~323 * (~0.5E~323, 0.22250738585072014E~307) = ~0.0 + (~0.5E~323, 0.22250738585072014E~307) = 0.2225073858507201E~307 - (~0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507202E~307 / (~0.5E~323, 0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (~0.5E~323, 0.22250738585072014E~307) = ~0.0 rem (~0.5E~323, 0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, 0.11125369292536007E~307) = ~0.0 + (~0.5E~323, 0.11125369292536007E~307) = 0.11125369292536E~307 - (~0.5E~323, 0.11125369292536007E~307) = ~0.1112536929253601E~307 / (~0.5E~323, 0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (~0.5E~323, 0.11125369292536007E~307) = ~0.0 rem (~0.5E~323, 0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, 0.5E~323) = ~0.0 + (~0.5E~323, 0.5E~323) = 0.0 - (~0.5E~323, 0.5E~323) = ~0.1E~322 / (~0.5E~323, 0.5E~323) = ~0.1E1 nextAfter (~0.5E~323, 0.5E~323) = ~0.0 rem (~0.5E~323, 0.5E~323) = 0.0 * (~0.5E~323, 0.0) = ~0.0 + (~0.5E~323, 0.0) = ~0.5E~323 - (~0.5E~323, 0.0) = ~0.5E~323 / (~0.5E~323, 0.0) = ~inf nextAfter (~0.5E~323, 0.0) = ~0.0 rem (~0.5E~323, 0.0) = nan * (~0.5E~323, ~0.17976931348623157E309) = 0.8881784197001251E~15 + (~0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.5E~323, ~0.17976931348623157E309) = 0.0 nextAfter (~0.5E~323, ~0.17976931348623157E309) = ~0.1E~322 rem (~0.5E~323, ~0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, ~0.8988465674311579E308) = 0.44408920985006257E~15 + (~0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.5E~323, ~0.8988465674311579E308) = 0.0 nextAfter (~0.5E~323, ~0.8988465674311579E308) = ~0.1E~322 rem (~0.5E~323, ~0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, ~0.123E4) = 0.6077E~320 + (~0.5E~323, ~0.123E4) = ~0.123E4 - (~0.5E~323, ~0.123E4) = 0.123E4 / (~0.5E~323, ~0.123E4) = 0.0 nextAfter (~0.5E~323, ~0.123E4) = ~0.1E~322 rem (~0.5E~323, ~0.123E4) = ~0.5E~323 * (~0.5E~323, ~0.123E2) = 0.6E~322 + (~0.5E~323, ~0.123E2) = ~0.123E2 - (~0.5E~323, ~0.123E2) = 0.123E2 / (~0.5E~323, ~0.123E2) = 0.0 nextAfter (~0.5E~323, ~0.123E2) = ~0.1E~322 rem (~0.5E~323, ~0.123E2) = ~0.5E~323 * (~0.5E~323, ~0.3141592653589793E1) = 0.15E~322 + (~0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.5E~323, ~0.3141592653589793E1) = 0.0 nextAfter (~0.5E~323, ~0.3141592653589793E1) = ~0.1E~322 rem (~0.5E~323, ~0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, ~0.2718281828459045E1) = 0.15E~322 + (~0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.5E~323, ~0.2718281828459045E1) = 0.0 nextAfter (~0.5E~323, ~0.2718281828459045E1) = ~0.1E~322 rem (~0.5E~323, ~0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, ~0.123E1) = 0.5E~323 + (~0.5E~323, ~0.123E1) = ~0.123E1 - (~0.5E~323, ~0.123E1) = 0.123E1 / (~0.5E~323, ~0.123E1) = 0.5E~323 nextAfter (~0.5E~323, ~0.123E1) = ~0.1E~322 rem (~0.5E~323, ~0.123E1) = ~0.5E~323 * (~0.5E~323, ~0.123) = 0.0 + (~0.5E~323, ~0.123) = ~0.123 - (~0.5E~323, ~0.123) = 0.123 / (~0.5E~323, ~0.123) = 0.4E~322 nextAfter (~0.5E~323, ~0.123) = ~0.1E~322 rem (~0.5E~323, ~0.123) = ~0.5E~323 * (~0.5E~323, ~0.123E~2) = 0.0 + (~0.5E~323, ~0.123E~2) = ~0.123E~2 - (~0.5E~323, ~0.123E~2) = 0.123E~2 / (~0.5E~323, ~0.123E~2) = 0.4017E~320 nextAfter (~0.5E~323, ~0.123E~2) = ~0.1E~322 rem (~0.5E~323, ~0.123E~2) = ~0.5E~323 * (~0.5E~323, ~0.22250738585072014E~307) = 0.0 + (~0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507202E~307 - (~0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507201E~307 / (~0.5E~323, ~0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (~0.5E~323, ~0.22250738585072014E~307) = ~0.1E~322 rem (~0.5E~323, ~0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, ~0.11125369292536007E~307) = 0.0 + (~0.5E~323, ~0.11125369292536007E~307) = ~0.1112536929253601E~307 - (~0.5E~323, ~0.11125369292536007E~307) = 0.11125369292536E~307 / (~0.5E~323, ~0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (~0.5E~323, ~0.11125369292536007E~307) = ~0.1E~322 rem (~0.5E~323, ~0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, ~0.5E~323) = 0.0 + (~0.5E~323, ~0.5E~323) = ~0.1E~322 - (~0.5E~323, ~0.5E~323) = 0.0 / (~0.5E~323, ~0.5E~323) = 0.1E1 nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 rem (~0.5E~323, ~0.5E~323) = 0.0 * (~0.5E~323, ~0.0) = 0.0 + (~0.5E~323, ~0.0) = ~0.5E~323 - (~0.5E~323, ~0.0) = ~0.5E~323 / (~0.5E~323, ~0.0) = inf nextAfter (~0.5E~323, ~0.0) = ~0.0 rem (~0.5E~323, ~0.0) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.5E~323, ~inf) = inf + (~0.5E~323, ~inf) = ~inf - (~0.5E~323, ~inf) = inf / (~0.5E~323, ~inf) = 0.0 nextAfter (~0.5E~323, ~inf) = ~0.1E~322 rem (~0.5E~323, ~inf) = ~0.5E~323 * (~0.5E~323, nan) = nan + (~0.5E~323, nan) = nan - (~0.5E~323, nan) = nan / (~0.5E~323, nan) = nan nextAfter (~0.5E~323, nan) = nan rem (~0.5E~323, nan) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.0, 0.17976931348623157E309) = ~0.0 + (~0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.0, 0.17976931348623157E309) = ~0.0 nextAfter (~0.0, 0.17976931348623157E309) = 0.5E~323 rem (~0.0, 0.17976931348623157E309) = 0.0 * (~0.0, 0.8988465674311579E308) = ~0.0 + (~0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.0, 0.8988465674311579E308) = ~0.0 nextAfter (~0.0, 0.8988465674311579E308) = 0.5E~323 rem (~0.0, 0.8988465674311579E308) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.5E~323 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.5E~323 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.3141592653589793E1) = ~0.0 + (~0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.0, 0.3141592653589793E1) = ~0.0 nextAfter (~0.0, 0.3141592653589793E1) = 0.5E~323 rem (~0.0, 0.3141592653589793E1) = 0.0 * (~0.0, 0.2718281828459045E1) = ~0.0 + (~0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.0, 0.2718281828459045E1) = ~0.0 nextAfter (~0.0, 0.2718281828459045E1) = 0.5E~323 rem (~0.0, 0.2718281828459045E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.5E~323 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.5E~323 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.5E~323 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.22250738585072014E~307) = ~0.0 + (~0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (~0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (~0.0, 0.22250738585072014E~307) = ~0.0 nextAfter (~0.0, 0.22250738585072014E~307) = 0.5E~323 rem (~0.0, 0.22250738585072014E~307) = 0.0 * (~0.0, 0.11125369292536007E~307) = ~0.0 + (~0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (~0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.0, 0.11125369292536007E~307) = ~0.0 nextAfter (~0.0, 0.11125369292536007E~307) = 0.5E~323 rem (~0.0, 0.11125369292536007E~307) = 0.0 * (~0.0, 0.5E~323) = ~0.0 + (~0.0, 0.5E~323) = 0.5E~323 - (~0.0, 0.5E~323) = ~0.5E~323 / (~0.0, 0.5E~323) = ~0.0 nextAfter (~0.0, 0.5E~323) = 0.5E~323 rem (~0.0, 0.5E~323) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.17976931348623157E309) = 0.0 + (~0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.0, ~0.17976931348623157E309) = 0.0 nextAfter (~0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (~0.0, ~0.17976931348623157E309) = 0.0 * (~0.0, ~0.8988465674311579E308) = 0.0 + (~0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.0, ~0.8988465674311579E308) = 0.0 nextAfter (~0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (~0.0, ~0.8988465674311579E308) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.5E~323 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.5E~323 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.3141592653589793E1) = 0.0 + (~0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.0, ~0.3141592653589793E1) = 0.0 nextAfter (~0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (~0.0, ~0.3141592653589793E1) = 0.0 * (~0.0, ~0.2718281828459045E1) = 0.0 + (~0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.0, ~0.2718281828459045E1) = 0.0 nextAfter (~0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (~0.0, ~0.2718281828459045E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.5E~323 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.5E~323 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.5E~323 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.22250738585072014E~307) = 0.0 + (~0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (~0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (~0.0, ~0.22250738585072014E~307) = 0.0 nextAfter (~0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (~0.0, ~0.22250738585072014E~307) = 0.0 * (~0.0, ~0.11125369292536007E~307) = 0.0 + (~0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (~0.0, ~0.11125369292536007E~307) = 0.0 nextAfter (~0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (~0.0, ~0.11125369292536007E~307) = 0.0 * (~0.0, ~0.5E~323) = 0.0 + (~0.0, ~0.5E~323) = ~0.5E~323 - (~0.0, ~0.5E~323) = 0.5E~323 / (~0.0, ~0.5E~323) = 0.0 nextAfter (~0.0, ~0.5E~323) = ~0.5E~323 rem (~0.0, ~0.5E~323) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.5E~323 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.17976931348623157E309) = ~inf + (~inf, 0.17976931348623157E309) = ~inf - (~inf, 0.17976931348623157E309) = ~inf / (~inf, 0.17976931348623157E309) = ~inf nextAfter (~inf, 0.17976931348623157E309) = ~inf rem (~inf, 0.17976931348623157E309) = nan * (~inf, 0.8988465674311579E308) = ~inf + (~inf, 0.8988465674311579E308) = ~inf - (~inf, 0.8988465674311579E308) = ~inf / (~inf, 0.8988465674311579E308) = ~inf nextAfter (~inf, 0.8988465674311579E308) = ~inf rem (~inf, 0.8988465674311579E308) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.3141592653589793E1) = ~inf + (~inf, 0.3141592653589793E1) = ~inf - (~inf, 0.3141592653589793E1) = ~inf / (~inf, 0.3141592653589793E1) = ~inf nextAfter (~inf, 0.3141592653589793E1) = ~inf rem (~inf, 0.3141592653589793E1) = nan * (~inf, 0.2718281828459045E1) = ~inf + (~inf, 0.2718281828459045E1) = ~inf - (~inf, 0.2718281828459045E1) = ~inf / (~inf, 0.2718281828459045E1) = ~inf nextAfter (~inf, 0.2718281828459045E1) = ~inf rem (~inf, 0.2718281828459045E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.22250738585072014E~307) = ~inf + (~inf, 0.22250738585072014E~307) = ~inf - (~inf, 0.22250738585072014E~307) = ~inf / (~inf, 0.22250738585072014E~307) = ~inf nextAfter (~inf, 0.22250738585072014E~307) = ~inf rem (~inf, 0.22250738585072014E~307) = nan * (~inf, 0.11125369292536007E~307) = ~inf + (~inf, 0.11125369292536007E~307) = ~inf - (~inf, 0.11125369292536007E~307) = ~inf / (~inf, 0.11125369292536007E~307) = ~inf nextAfter (~inf, 0.11125369292536007E~307) = ~inf rem (~inf, 0.11125369292536007E~307) = nan * (~inf, 0.5E~323) = ~inf + (~inf, 0.5E~323) = ~inf - (~inf, 0.5E~323) = ~inf / (~inf, 0.5E~323) = ~inf nextAfter (~inf, 0.5E~323) = ~inf rem (~inf, 0.5E~323) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.17976931348623157E309) = inf + (~inf, ~0.17976931348623157E309) = ~inf - (~inf, ~0.17976931348623157E309) = ~inf / (~inf, ~0.17976931348623157E309) = inf nextAfter (~inf, ~0.17976931348623157E309) = ~inf rem (~inf, ~0.17976931348623157E309) = nan * (~inf, ~0.8988465674311579E308) = inf + (~inf, ~0.8988465674311579E308) = ~inf - (~inf, ~0.8988465674311579E308) = ~inf / (~inf, ~0.8988465674311579E308) = inf nextAfter (~inf, ~0.8988465674311579E308) = ~inf rem (~inf, ~0.8988465674311579E308) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.3141592653589793E1) = inf + (~inf, ~0.3141592653589793E1) = ~inf - (~inf, ~0.3141592653589793E1) = ~inf / (~inf, ~0.3141592653589793E1) = inf nextAfter (~inf, ~0.3141592653589793E1) = ~inf rem (~inf, ~0.3141592653589793E1) = nan * (~inf, ~0.2718281828459045E1) = inf + (~inf, ~0.2718281828459045E1) = ~inf - (~inf, ~0.2718281828459045E1) = ~inf / (~inf, ~0.2718281828459045E1) = inf nextAfter (~inf, ~0.2718281828459045E1) = ~inf rem (~inf, ~0.2718281828459045E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.22250738585072014E~307) = inf + (~inf, ~0.22250738585072014E~307) = ~inf - (~inf, ~0.22250738585072014E~307) = ~inf / (~inf, ~0.22250738585072014E~307) = inf nextAfter (~inf, ~0.22250738585072014E~307) = ~inf rem (~inf, ~0.22250738585072014E~307) = nan * (~inf, ~0.11125369292536007E~307) = inf + (~inf, ~0.11125369292536007E~307) = ~inf - (~inf, ~0.11125369292536007E~307) = ~inf / (~inf, ~0.11125369292536007E~307) = inf nextAfter (~inf, ~0.11125369292536007E~307) = ~inf rem (~inf, ~0.11125369292536007E~307) = nan * (~inf, ~0.5E~323) = inf + (~inf, ~0.5E~323) = ~inf - (~inf, ~0.5E~323) = ~inf / (~inf, ~0.5E~323) = inf nextAfter (~inf, ~0.5E~323) = ~inf rem (~inf, ~0.5E~323) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.17976931348623157E309) = nan + (nan, 0.17976931348623157E309) = nan - (nan, 0.17976931348623157E309) = nan / (nan, 0.17976931348623157E309) = nan nextAfter (nan, 0.17976931348623157E309) = nan rem (nan, 0.17976931348623157E309) = nan * (nan, 0.8988465674311579E308) = nan + (nan, 0.8988465674311579E308) = nan - (nan, 0.8988465674311579E308) = nan / (nan, 0.8988465674311579E308) = nan nextAfter (nan, 0.8988465674311579E308) = nan rem (nan, 0.8988465674311579E308) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.3141592653589793E1) = nan + (nan, 0.3141592653589793E1) = nan - (nan, 0.3141592653589793E1) = nan / (nan, 0.3141592653589793E1) = nan nextAfter (nan, 0.3141592653589793E1) = nan rem (nan, 0.3141592653589793E1) = nan * (nan, 0.2718281828459045E1) = nan + (nan, 0.2718281828459045E1) = nan - (nan, 0.2718281828459045E1) = nan / (nan, 0.2718281828459045E1) = nan nextAfter (nan, 0.2718281828459045E1) = nan rem (nan, 0.2718281828459045E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.22250738585072014E~307) = nan + (nan, 0.22250738585072014E~307) = nan - (nan, 0.22250738585072014E~307) = nan / (nan, 0.22250738585072014E~307) = nan nextAfter (nan, 0.22250738585072014E~307) = nan rem (nan, 0.22250738585072014E~307) = nan * (nan, 0.11125369292536007E~307) = nan + (nan, 0.11125369292536007E~307) = nan - (nan, 0.11125369292536007E~307) = nan / (nan, 0.11125369292536007E~307) = nan nextAfter (nan, 0.11125369292536007E~307) = nan rem (nan, 0.11125369292536007E~307) = nan * (nan, 0.5E~323) = nan + (nan, 0.5E~323) = nan - (nan, 0.5E~323) = nan / (nan, 0.5E~323) = nan nextAfter (nan, 0.5E~323) = nan rem (nan, 0.5E~323) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.17976931348623157E309) = nan + (nan, ~0.17976931348623157E309) = nan - (nan, ~0.17976931348623157E309) = nan / (nan, ~0.17976931348623157E309) = nan nextAfter (nan, ~0.17976931348623157E309) = nan rem (nan, ~0.17976931348623157E309) = nan * (nan, ~0.8988465674311579E308) = nan + (nan, ~0.8988465674311579E308) = nan - (nan, ~0.8988465674311579E308) = nan / (nan, ~0.8988465674311579E308) = nan nextAfter (nan, ~0.8988465674311579E308) = nan rem (nan, ~0.8988465674311579E308) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.3141592653589793E1) = nan + (nan, ~0.3141592653589793E1) = nan - (nan, ~0.3141592653589793E1) = nan / (nan, ~0.3141592653589793E1) = nan nextAfter (nan, ~0.3141592653589793E1) = nan rem (nan, ~0.3141592653589793E1) = nan * (nan, ~0.2718281828459045E1) = nan + (nan, ~0.2718281828459045E1) = nan - (nan, ~0.2718281828459045E1) = nan / (nan, ~0.2718281828459045E1) = nan nextAfter (nan, ~0.2718281828459045E1) = nan rem (nan, ~0.2718281828459045E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.22250738585072014E~307) = nan + (nan, ~0.22250738585072014E~307) = nan - (nan, ~0.22250738585072014E~307) = nan / (nan, ~0.22250738585072014E~307) = nan nextAfter (nan, ~0.22250738585072014E~307) = nan rem (nan, ~0.22250738585072014E~307) = nan * (nan, ~0.11125369292536007E~307) = nan + (nan, ~0.11125369292536007E~307) = nan - (nan, ~0.11125369292536007E~307) = nan / (nan, ~0.11125369292536007E~307) = nan nextAfter (nan, ~0.11125369292536007E~307) = nan rem (nan, ~0.11125369292536007E~307) = nan * (nan, ~0.5E~323) = nan + (nan, ~0.5E~323) = nan - (nan, ~0.5E~323) = nan / (nan, ~0.5E~323) = nan nextAfter (nan, ~0.5E~323) = nan rem (nan, ~0.5E~323) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.17976931348623157E309) = nan asin (0.17976931348623157E309) = nan atan (0.17976931348623157E309) = 1.570796327 cos (0.17976931348623157E309) = ~0.9999876894 cosh (0.17976931348623157E309) = inf exp (0.17976931348623157E309) = inf ln (0.17976931348623157E309) = 709.7827129 log10 (0.17976931348623157E309) = 308.2547156 sin (0.17976931348623157E309) = 0.004961954789 sinh (0.17976931348623157E309) = inf sqrt (0.17976931348623157E309) = 1.340780793E154 tan (0.17976931348623157E309) = ~0.004962015874 tanh (0.17976931348623157E309) = 1 acos (0.8988465674311579E308) = nan asin (0.8988465674311579E308) = nan atan (0.8988465674311579E308) = 1.570796327 cos (0.8988465674311579E308) = 0.00248098503 cosh (0.8988465674311579E308) = inf exp (0.8988465674311579E308) = inf ln (0.8988465674311579E308) = 709.0895657 log10 (0.8988465674311579E308) = 307.9536856 sin (0.8988465674311579E308) = 0.9999969224 sinh (0.8988465674311579E308) = inf sqrt (0.8988465674311579E308) = 9.480751908E153 tan (0.8988465674311579E308) = 403.0644725 tanh (0.8988465674311579E308) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983319 cos (0.123E4) = 0.06642716993 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769448 log10 (0.123E4) = 3.089905111 sin (0.123E4) = ~0.9977912763 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135583 tan (0.123E4) = ~15.02083074 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673935 cos (0.123E2) = 0.9647326179 cosh (0.123E2) = 109847.9943 exp (0.123E2) = 219695.9887 ln (0.123E2) = 2.509599262 log10 (0.123E2) = 1.089905111 sin (0.123E2) = ~0.2632317914 sinh (0.123E2) = 109847.9943 sqrt (0.123E2) = 3.507135583 tan (0.123E2) = ~0.272854661 tanh (0.123E2) = 1 acos (0.3141592653589793E1) = nan asin (0.3141592653589793E1) = nan atan (0.3141592653589793E1) = 1.262627256 cos (0.3141592653589793E1) = ~1 cosh (0.3141592653589793E1) = 11.59195328 exp (0.3141592653589793E1) = 23.14069263 ln (0.3141592653589793E1) = 1.144729886 log10 (0.3141592653589793E1) = 0.4971498727 sin (0.3141592653589793E1) = 1.224646799E~16 sinh (0.3141592653589793E1) = 11.54873936 sqrt (0.3141592653589793E1) = 1.772453851 tan (0.3141592653589793E1) = ~1.224646799E~16 tanh (0.3141592653589793E1) = 0.9962720762 acos (0.2718281828459045E1) = nan asin (0.2718281828459045E1) = nan atan (0.2718281828459045E1) = 1.218282905 cos (0.2718281828459045E1) = ~0.9117339148 cosh (0.2718281828459045E1) = 7.610125139 exp (0.2718281828459045E1) = 15.15426224 ln (0.2718281828459045E1) = 1 log10 (0.2718281828459045E1) = 0.4342944819 sin (0.2718281828459045E1) = 0.4107812905 sinh (0.2718281828459045E1) = 7.544137103 sqrt (0.2718281828459045E1) = 1.648721271 tan (0.2718281828459045E1) = ~0.4505495341 tanh (0.2718281828459045E1) = 0.9913289158 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.8881737744 cos (0.123E1) = 0.3342377271 cosh (0.123E1) = 1.856761057 exp (0.123E1) = 3.421229536 ln (0.123E1) = 0.2070141694 log10 (0.123E1) = 0.08990511144 sin (0.123E1) = 0.9424888019 sinh (0.123E1) = 1.564468479 sqrt (0.123E1) = 1.109053651 tan (0.123E1) = 2.819815734 tanh (0.123E1) = 0.8425793257 acos (0.123) = 1.447484052 asin (0.123) = 0.1233122752 atan (0.123) = 0.1223852815 cos (0.123) = 0.9924450321 cosh (0.123) = 1.007574042 exp (0.123) = 1.130884421 ln (0.123) = ~2.095570924 log10 (0.123) = ~0.9100948886 sin (0.123) = 0.12269009 sinh (0.123) = 0.1233103792 sqrt (0.123) = 0.3507135583 tan (0.123) = 0.1236240659 tanh (0.123) = 0.1223834419 acos (0.123E~2) = 1.569566326 asin (0.123E~2) = 0.00123000031 atan (0.123E~2) = 0.00122999938 cos (0.123E~2) = 0.9999992436 cosh (0.123E~2) = 1.000000756 exp (0.123E~2) = 1.001230757 ln (0.123E~2) = ~6.70074111 log10 (0.123E~2) = ~2.910094889 sin (0.123E~2) = 0.00122999969 sinh (0.123E~2) = 0.00123000031 sqrt (0.123E~2) = 0.03507135583 tan (0.123E~2) = 0.00123000062 tanh (0.123E~2) = 0.00122999938 acos (0.22250738585072014E~307) = 1.570796327 asin (0.22250738585072014E~307) = 2.225073859E~308 atan (0.22250738585072014E~307) = 2.225073859E~308 cos (0.22250738585072014E~307) = 1 cosh (0.22250738585072014E~307) = 1 exp (0.22250738585072014E~307) = 1 ln (0.22250738585072014E~307) = ~708.3964185 log10 (0.22250738585072014E~307) = ~307.6526556 sin (0.22250738585072014E~307) = 2.225073859E~308 sinh (0.22250738585072014E~307) = 2.225073859E~308 sqrt (0.22250738585072014E~307) = 1.491668146E~154 tan (0.22250738585072014E~307) = 2.225073859E~308 tanh (0.22250738585072014E~307) = 2.225073859E~308 acos (0.11125369292536007E~307) = 1.570796327 asin (0.11125369292536007E~307) = 1.112536929E~308 atan (0.11125369292536007E~307) = 1.112536929E~308 cos (0.11125369292536007E~307) = 1 cosh (0.11125369292536007E~307) = 1 exp (0.11125369292536007E~307) = 1 ln (0.11125369292536007E~307) = ~709.0895657 log10 (0.11125369292536007E~307) = ~307.9536856 sin (0.11125369292536007E~307) = 1.112536929E~308 sinh (0.11125369292536007E~307) = 1.112536929E~308 sqrt (0.11125369292536007E~307) = 1.054768661E~154 tan (0.11125369292536007E~307) = 1.112536929E~308 tanh (0.11125369292536007E~307) = 1.112536929E~308 acos (0.5E~323) = 1.570796327 asin (0.5E~323) = 4.940656458E~324 atan (0.5E~323) = 4.940656458E~324 cos (0.5E~323) = 1 cosh (0.5E~323) = 1 exp (0.5E~323) = 1 ln (0.5E~323) = ~744.4400719 log10 (0.5E~323) = ~323.3062153 sin (0.5E~323) = 4.940656458E~324 sinh (0.5E~323) = 4.940656458E~324 sqrt (0.5E~323) = 2.222758749E~162 tan (0.5E~323) = 4.940656458E~324 tanh (0.5E~323) = 4.940656458E~324 acos (0.0) = 1.570796327 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.17976931348623157E309) = nan asin (~0.17976931348623157E309) = nan atan (~0.17976931348623157E309) = ~1.570796327 cos (~0.17976931348623157E309) = ~0.9999876894 cosh (~0.17976931348623157E309) = inf exp (~0.17976931348623157E309) = 0 ln (~0.17976931348623157E309) = nan log10 (~0.17976931348623157E309) = nan sin (~0.17976931348623157E309) = ~0.004961954789 sinh (~0.17976931348623157E309) = ~inf sqrt (~0.17976931348623157E309) = nan tan (~0.17976931348623157E309) = 0.004962015874 tanh (~0.17976931348623157E309) = ~1 acos (~0.8988465674311579E308) = nan asin (~0.8988465674311579E308) = nan atan (~0.8988465674311579E308) = ~1.570796327 cos (~0.8988465674311579E308) = 0.00248098503 cosh (~0.8988465674311579E308) = inf exp (~0.8988465674311579E308) = 0 ln (~0.8988465674311579E308) = nan log10 (~0.8988465674311579E308) = nan sin (~0.8988465674311579E308) = ~0.9999969224 sinh (~0.8988465674311579E308) = ~inf sqrt (~0.8988465674311579E308) = nan tan (~0.8988465674311579E308) = ~403.0644725 tanh (~0.8988465674311579E308) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983319 cos (~0.123E4) = 0.06642716993 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912763 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083074 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673935 cos (~0.123E2) = 0.9647326179 cosh (~0.123E2) = 109847.9943 exp (~0.123E2) = 4.551744463E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632317914 sinh (~0.123E2) = ~109847.9943 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.272854661 tanh (~0.123E2) = ~1 acos (~0.3141592653589793E1) = nan asin (~0.3141592653589793E1) = nan atan (~0.3141592653589793E1) = ~1.262627256 cos (~0.3141592653589793E1) = ~1 cosh (~0.3141592653589793E1) = 11.59195328 exp (~0.3141592653589793E1) = 0.04321391826 ln (~0.3141592653589793E1) = nan log10 (~0.3141592653589793E1) = nan sin (~0.3141592653589793E1) = ~1.224646799E~16 sinh (~0.3141592653589793E1) = ~11.54873936 sqrt (~0.3141592653589793E1) = nan tan (~0.3141592653589793E1) = 1.224646799E~16 tanh (~0.3141592653589793E1) = ~0.9962720762 acos (~0.2718281828459045E1) = nan asin (~0.2718281828459045E1) = nan atan (~0.2718281828459045E1) = ~1.218282905 cos (~0.2718281828459045E1) = ~0.9117339148 cosh (~0.2718281828459045E1) = 7.610125139 exp (~0.2718281828459045E1) = 0.06598803585 ln (~0.2718281828459045E1) = nan log10 (~0.2718281828459045E1) = nan sin (~0.2718281828459045E1) = ~0.4107812905 sinh (~0.2718281828459045E1) = ~7.544137103 sqrt (~0.2718281828459045E1) = nan tan (~0.2718281828459045E1) = 0.4505495341 tanh (~0.2718281828459045E1) = ~0.9913289158 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.8881737744 cos (~0.123E1) = 0.3342377271 cosh (~0.123E1) = 1.856761057 exp (~0.123E1) = 0.2922925777 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424888019 sinh (~0.123E1) = ~1.564468479 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815734 tanh (~0.123E1) = ~0.8425793257 acos (~0.123) = 1.694108602 asin (~0.123) = ~0.1233122752 atan (~0.123) = ~0.1223852815 cos (~0.123) = 0.9924450321 cosh (~0.123) = 1.007574042 exp (~0.123) = 0.8842636626 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.12269009 sinh (~0.123) = ~0.1233103792 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240659 tanh (~0.123) = ~0.1223834419 acos (~0.123E~2) = 1.572026327 asin (~0.123E~2) = ~0.00123000031 atan (~0.123E~2) = ~0.00122999938 cos (~0.123E~2) = 0.9999992436 cosh (~0.123E~2) = 1.000000756 exp (~0.123E~2) = 0.9987707561 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.00122999969 sinh (~0.123E~2) = ~0.00123000031 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.00123000062 tanh (~0.123E~2) = ~0.00122999938 acos (~0.22250738585072014E~307) = 1.570796327 asin (~0.22250738585072014E~307) = ~2.225073859E~308 atan (~0.22250738585072014E~307) = ~2.225073859E~308 cos (~0.22250738585072014E~307) = 1 cosh (~0.22250738585072014E~307) = 1 exp (~0.22250738585072014E~307) = 1 ln (~0.22250738585072014E~307) = nan log10 (~0.22250738585072014E~307) = nan sin (~0.22250738585072014E~307) = ~2.225073859E~308 sinh (~0.22250738585072014E~307) = ~2.225073859E~308 sqrt (~0.22250738585072014E~307) = nan tan (~0.22250738585072014E~307) = ~2.225073859E~308 tanh (~0.22250738585072014E~307) = ~2.225073859E~308 acos (~0.11125369292536007E~307) = 1.570796327 asin (~0.11125369292536007E~307) = ~1.112536929E~308 atan (~0.11125369292536007E~307) = ~1.112536929E~308 cos (~0.11125369292536007E~307) = 1 cosh (~0.11125369292536007E~307) = 1 exp (~0.11125369292536007E~307) = 1 ln (~0.11125369292536007E~307) = nan log10 (~0.11125369292536007E~307) = nan sin (~0.11125369292536007E~307) = ~1.112536929E~308 sinh (~0.11125369292536007E~307) = ~1.112536929E~308 sqrt (~0.11125369292536007E~307) = nan tan (~0.11125369292536007E~307) = ~1.112536929E~308 tanh (~0.11125369292536007E~307) = ~1.112536929E~308 acos (~0.5E~323) = 1.570796327 asin (~0.5E~323) = ~4.940656458E~324 atan (~0.5E~323) = ~4.940656458E~324 cos (~0.5E~323) = 1 cosh (~0.5E~323) = 1 exp (~0.5E~323) = 1 ln (~0.5E~323) = nan log10 (~0.5E~323) = nan sin (~0.5E~323) = ~4.940656458E~324 sinh (~0.5E~323) = ~4.940656458E~324 sqrt (~0.5E~323) = nan tan (~0.5E~323) = ~4.940656458E~324 tanh (~0.5E~323) = ~4.940656458E~324 acos (~0.0) = 1.570796327 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796327 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.17976931348623157E309, 0.17976931348623157E309) = 0.7853981634 pow (0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (0.17976931348623157E309, 0.8988465674311579E308) = 1.107148718 pow (0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (0.17976931348623157E309, 0.123E4) = 1.570796327 pow (0.17976931348623157E309, 0.123E4) = inf atan2 (0.17976931348623157E309, 0.123E2) = 1.570796327 pow (0.17976931348623157E309, 0.123E2) = inf atan2 (0.17976931348623157E309, 0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, 0.3141592653589793E1) = inf atan2 (0.17976931348623157E309, 0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, 0.2718281828459045E1) = inf atan2 (0.17976931348623157E309, 0.123E1) = 1.570796327 pow (0.17976931348623157E309, 0.123E1) = inf atan2 (0.17976931348623157E309, 0.123) = 1.570796327 pow (0.17976931348623157E309, 0.123) = 8.228676973E37 atan2 (0.17976931348623157E309, 0.123E~2) = 1.570796327 pow (0.17976931348623157E309, 0.123E~2) = 2.394160714 atan2 (0.17976931348623157E309, 0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, 0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, 0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, 0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, 0.5E~323) = 1.570796327 pow (0.17976931348623157E309, 0.5E~323) = 1 atan2 (0.17976931348623157E309, 0.0) = 1.570796327 pow (0.17976931348623157E309, 0.0) = 1 atan2 (0.17976931348623157E309, ~0.17976931348623157E309) = 2.35619449 pow (0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (0.17976931348623157E309, ~0.8988465674311579E308) = 2.034443936 pow (0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (0.17976931348623157E309, ~0.123E4) = 1.570796327 pow (0.17976931348623157E309, ~0.123E4) = 0 atan2 (0.17976931348623157E309, ~0.123E2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E2) = 0 atan2 (0.17976931348623157E309, ~0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, ~0.3141592653589793E1) = 0 atan2 (0.17976931348623157E309, ~0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, ~0.2718281828459045E1) = 0 atan2 (0.17976931348623157E309, ~0.123E1) = 1.570796327 pow (0.17976931348623157E309, ~0.123E1) = 0 atan2 (0.17976931348623157E309, ~0.123) = 1.570796327 pow (0.17976931348623157E309, ~0.123) = 1.21526219E~38 atan2 (0.17976931348623157E309, ~0.123E~2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E~2) = 0.4176829041 atan2 (0.17976931348623157E309, ~0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, ~0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, ~0.5E~323) = 1.570796327 pow (0.17976931348623157E309, ~0.5E~323) = 1 atan2 (0.17976931348623157E309, ~0.0) = 1.570796327 pow (0.17976931348623157E309, ~0.0) = 1 atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.17976931348623157E309, ~inf) = 3.141592654 pow (0.17976931348623157E309, ~inf) = 0 atan2 (0.17976931348623157E309, nan) = nan pow (0.17976931348623157E309, nan) = nan atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.8988465674311579E308, 0.17976931348623157E309) = 0.463647609 pow (0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (0.8988465674311579E308, 0.8988465674311579E308) = 0.7853981634 pow (0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (0.8988465674311579E308, 0.123E4) = 1.570796327 pow (0.8988465674311579E308, 0.123E4) = inf atan2 (0.8988465674311579E308, 0.123E2) = 1.570796327 pow (0.8988465674311579E308, 0.123E2) = inf atan2 (0.8988465674311579E308, 0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, 0.3141592653589793E1) = inf atan2 (0.8988465674311579E308, 0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, 0.2718281828459045E1) = inf atan2 (0.8988465674311579E308, 0.123E1) = 1.570796327 pow (0.8988465674311579E308, 0.123E1) = inf atan2 (0.8988465674311579E308, 0.123) = 1.570796327 pow (0.8988465674311579E308, 0.123) = 7.556197911E37 atan2 (0.8988465674311579E308, 0.123E~2) = 1.570796327 pow (0.8988465674311579E308, 0.123E~2) = 2.392120392 atan2 (0.8988465674311579E308, 0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, 0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, 0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, 0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, 0.5E~323) = 1.570796327 pow (0.8988465674311579E308, 0.5E~323) = 1 atan2 (0.8988465674311579E308, 0.0) = 1.570796327 pow (0.8988465674311579E308, 0.0) = 1 atan2 (0.8988465674311579E308, ~0.17976931348623157E309) = 2.677945045 pow (0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (0.8988465674311579E308, ~0.8988465674311579E308) = 2.35619449 pow (0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (0.8988465674311579E308, ~0.123E4) = 1.570796327 pow (0.8988465674311579E308, ~0.123E4) = 0 atan2 (0.8988465674311579E308, ~0.123E2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E2) = 0 atan2 (0.8988465674311579E308, ~0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, ~0.3141592653589793E1) = 0 atan2 (0.8988465674311579E308, ~0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, ~0.2718281828459045E1) = 0 atan2 (0.8988465674311579E308, ~0.123E1) = 1.570796327 pow (0.8988465674311579E308, ~0.123E1) = 0 atan2 (0.8988465674311579E308, ~0.123) = 1.570796327 pow (0.8988465674311579E308, ~0.123) = 1.323416898E~38 atan2 (0.8988465674311579E308, ~0.123E~2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E~2) = 0.4180391603 atan2 (0.8988465674311579E308, ~0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, ~0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, ~0.5E~323) = 1.570796327 pow (0.8988465674311579E308, ~0.5E~323) = 1 atan2 (0.8988465674311579E308, ~0.0) = 1.570796327 pow (0.8988465674311579E308, ~0.0) = 1 atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.8988465674311579E308, ~inf) = 3.141592654 pow (0.8988465674311579E308, ~inf) = 0 atan2 (0.8988465674311579E308, nan) = nan pow (0.8988465674311579E308, nan) = nan atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.123E4, 0.17976931348623157E309) = 6.842102115E~306 pow (0.123E4, 0.17976931348623157E309) = inf atan2 (0.123E4, 0.8988465674311579E308) = 1.368420423E~305 pow (0.123E4, 0.8988465674311579E308) = inf atan2 (0.123E4, 0.123E4) = 0.7853981634 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.56079666 pow (0.123E4, 0.123E2) = 1.013521278E38 atan2 (0.123E4, 0.3141592653589793E1) = 1.568242192 pow (0.123E4, 0.3141592653589793E1) = 5095927004 atan2 (0.123E4, 0.2718281828459045E1) = 1.568586345 pow (0.123E4, 0.2718281828459045E1) = 250745366.3 atan2 (0.123E4, 0.123E1) = 1.569796327 pow (0.123E4, 0.123E1) = 6318.053325 atan2 (0.123E4, 0.123) = 1.570696327 pow (0.123E4, 0.123) = 2.39915512 atan2 (0.123E4, 0.123E~2) = 1.570795327 pow (0.123E4, 0.123E~2) = 1.00878957 atan2 (0.123E4, 0.22250738585072014E~307) = 1.570796327 pow (0.123E4, 0.22250738585072014E~307) = 1 atan2 (0.123E4, 0.11125369292536007E~307) = 1.570796327 pow (0.123E4, 0.11125369292536007E~307) = 1 atan2 (0.123E4, 0.5E~323) = 1.570796327 pow (0.123E4, 0.5E~323) = 1 atan2 (0.123E4, 0.0) = 1.570796327 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.17976931348623157E309) = 3.141592654 pow (0.123E4, ~0.17976931348623157E309) = 0 atan2 (0.123E4, ~0.8988465674311579E308) = 3.141592654 pow (0.123E4, ~0.8988465674311579E308) = 0 atan2 (0.123E4, ~0.123E4) = 2.35619449 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580795993 pow (0.123E4, ~0.123E2) = 9.86659108E~39 atan2 (0.123E4, ~0.3141592653589793E1) = 1.573350462 pow (0.123E4, ~0.3141592653589793E1) = 1.9623515E~10 atan2 (0.123E4, ~0.2718281828459045E1) = 1.573006308 pow (0.123E4, ~0.2718281828459045E1) = 3.98810959E~9 atan2 (0.123E4, ~0.123E1) = 1.571796326 pow (0.123E4, ~0.123E1) = 1.582766002E~4 atan2 (0.123E4, ~0.123) = 1.570896327 pow (0.123E4, ~0.123) = 0.4168133988 atan2 (0.123E4, ~0.123E~2) = 1.570797327 pow (0.123E4, ~0.123E~2) = 0.9912870136 atan2 (0.123E4, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E4, ~0.22250738585072014E~307) = 1 atan2 (0.123E4, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E4, ~0.11125369292536007E~307) = 1 atan2 (0.123E4, ~0.5E~323) = 1.570796327 pow (0.123E4, ~0.5E~323) = 1 atan2 (0.123E4, ~0.0) = 1.570796327 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592654 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.17976931348623157E309) = 6.842102115E~308 pow (0.123E2, 0.17976931348623157E309) = inf atan2 (0.123E2, 0.8988465674311579E308) = 1.368420423E~307 pow (0.123E2, 0.8988465674311579E308) = inf atan2 (0.123E2, 0.123E4) = 0.009999666687 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981634 pow (0.123E2, 0.123E2) = 2.545850346E13 atan2 (0.123E2, 0.3141592653589793E1) = 1.320728626 pow (0.123E2, 0.3141592653589793E1) = 2654.83718 atan2 (0.123E2, 0.2718281828459045E1) = 1.353293796 pow (0.123E2, 0.2718281828459045E1) = 917.6334984 atan2 (0.123E2, 0.123E1) = 1.471127674 pow (0.123E2, 0.123E1) = 21.90701911 atan2 (0.123E2, 0.123) = 1.56079666 pow (0.123E2, 0.123) = 1.361627546 atan2 (0.123E2, 0.123E~2) = 1.570696327 pow (0.123E2, 0.123E~2) = 1.003091576 atan2 (0.123E2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E2, 0.22250738585072014E~307) = 1 atan2 (0.123E2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E2, 0.11125369292536007E~307) = 1 atan2 (0.123E2, 0.5E~323) = 1.570796327 pow (0.123E2, 0.5E~323) = 1 atan2 (0.123E2, 0.0) = 1.570796327 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E2, ~0.17976931348623157E309) = 0 atan2 (0.123E2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E2, ~0.8988465674311579E308) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592987 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.35619449 pow (0.123E2, ~0.123E2) = 3.927960658E~14 atan2 (0.123E2, ~0.3141592653589793E1) = 1.820864027 pow (0.123E2, ~0.3141592653589793E1) = 3.766709339E~4 atan2 (0.123E2, ~0.2718281828459045E1) = 1.788298857 pow (0.123E2, ~0.2718281828459045E1) = 0.001089759694 atan2 (0.123E2, ~0.123E1) = 1.670464979 pow (0.123E2, ~0.123E1) = 0.04564747011 atan2 (0.123E2, ~0.123) = 1.580795993 pow (0.123E2, ~0.123) = 0.7344152246 atan2 (0.123E2, ~0.123E~2) = 1.570896327 pow (0.123E2, ~0.123E~2) = 0.9969179522 atan2 (0.123E2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E2, ~0.22250738585072014E~307) = 1 atan2 (0.123E2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E2, ~0.11125369292536007E~307) = 1 atan2 (0.123E2, ~0.5E~323) = 1.570796327 pow (0.123E2, ~0.5E~323) = 1 atan2 (0.123E2, ~0.0) = 1.570796327 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592654 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.3141592653589793E1, 0.17976931348623157E309) = 1.747568922E~308 pow (0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (0.3141592653589793E1, 0.8988465674311579E308) = 3.495137844E~308 pow (0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (0.3141592653589793E1, 0.123E4) = 0.002554134815 pow (0.3141592653589793E1, 0.123E4) = inf atan2 (0.3141592653589793E1, 0.123E2) = 0.2500677004 pow (0.3141592653589793E1, 0.123E2) = 1302997.055 atan2 (0.3141592653589793E1, 0.3141592653589793E1) = 0.7853981634 pow (0.3141592653589793E1, 0.3141592653589793E1) = 36.46215961 atan2 (0.3141592653589793E1, 0.2718281828459045E1) = 0.8575117864 pow (0.3141592653589793E1, 0.2718281828459045E1) = 22.45915772 atan2 (0.3141592653589793E1, 0.123E1) = 1.197620596 pow (0.3141592653589793E1, 0.123E1) = 4.087844278 atan2 (0.3141592653589793E1, 0.123) = 1.531664198 pow (0.3141592653589793E1, 0.123) = 1.151196431 atan2 (0.3141592653589793E1, 0.123E~2) = 1.570404806 pow (0.3141592653589793E1, 0.123E~2) = 1.001409009 atan2 (0.3141592653589793E1, 0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, 0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, 0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, 0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, 0.5E~323) = 1.570796327 pow (0.3141592653589793E1, 0.5E~323) = 1 atan2 (0.3141592653589793E1, 0.0) = 1.570796327 pow (0.3141592653589793E1, 0.0) = 1 atan2 (0.3141592653589793E1, ~0.17976931348623157E309) = 3.141592654 pow (0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (0.3141592653589793E1, ~0.8988465674311579E308) = 3.141592654 pow (0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (0.3141592653589793E1, ~0.123E4) = 3.139038519 pow (0.3141592653589793E1, ~0.123E4) = 0 atan2 (0.3141592653589793E1, ~0.123E2) = 2.891524953 pow (0.3141592653589793E1, ~0.123E2) = 7.674614429E~7 atan2 (0.3141592653589793E1, ~0.3141592653589793E1) = 2.35619449 pow (0.3141592653589793E1, ~0.3141592653589793E1) = 0.02742569312 atan2 (0.3141592653589793E1, ~0.2718281828459045E1) = 2.284080867 pow (0.3141592653589793E1, ~0.2718281828459045E1) = 0.04452526727 atan2 (0.3141592653589793E1, ~0.123E1) = 1.943972057 pow (0.3141592653589793E1, ~0.123E1) = 0.2446277138 atan2 (0.3141592653589793E1, ~0.123) = 1.609928456 pow (0.3141592653589793E1, ~0.123) = 0.8686614842 atan2 (0.3141592653589793E1, ~0.123E~2) = 1.571187848 pow (0.3141592653589793E1, ~0.123E~2) = 0.998592973 atan2 (0.3141592653589793E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, ~0.5E~323) = 1.570796327 pow (0.3141592653589793E1, ~0.5E~323) = 1 atan2 (0.3141592653589793E1, ~0.0) = 1.570796327 pow (0.3141592653589793E1, ~0.0) = 1 atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.3141592653589793E1, ~inf) = 3.141592654 pow (0.3141592653589793E1, ~inf) = 0 atan2 (0.3141592653589793E1, nan) = nan pow (0.3141592653589793E1, nan) = nan atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.2718281828459045E1, 0.17976931348623157E309) = 1.512094459E~308 pow (0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (0.2718281828459045E1, 0.8988465674311579E308) = 3.024188918E~308 pow (0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (0.2718281828459045E1, 0.123E4) = 0.002209981629 pow (0.2718281828459045E1, 0.123E4) = inf atan2 (0.2718281828459045E1, 0.123E2) = 0.2175025304 pow (0.2718281828459045E1, 0.123E2) = 219695.9887 atan2 (0.2718281828459045E1, 0.3141592653589793E1) = 0.7132845404 pow (0.2718281828459045E1, 0.3141592653589793E1) = 23.14069263 atan2 (0.2718281828459045E1, 0.2718281828459045E1) = 0.7853981634 pow (0.2718281828459045E1, 0.2718281828459045E1) = 15.15426224 atan2 (0.2718281828459045E1, 0.123E1) = 1.145872224 pow (0.2718281828459045E1, 0.123E1) = 3.421229536 atan2 (0.2718281828459045E1, 0.123) = 1.525578 pow (0.2718281828459045E1, 0.123) = 1.130884421 atan2 (0.2718281828459045E1, 0.123E~2) = 1.570343835 pow (0.2718281828459045E1, 0.123E~2) = 1.001230757 atan2 (0.2718281828459045E1, 0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, 0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, 0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, 0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, 0.5E~323) = 1.570796327 pow (0.2718281828459045E1, 0.5E~323) = 1 atan2 (0.2718281828459045E1, 0.0) = 1.570796327 pow (0.2718281828459045E1, 0.0) = 1 atan2 (0.2718281828459045E1, ~0.17976931348623157E309) = 3.141592654 pow (0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (0.2718281828459045E1, ~0.8988465674311579E308) = 3.141592654 pow (0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (0.2718281828459045E1, ~0.123E4) = 3.139382672 pow (0.2718281828459045E1, ~0.123E4) = 0 atan2 (0.2718281828459045E1, ~0.123E2) = 2.924090123 pow (0.2718281828459045E1, ~0.123E2) = 4.551744463E~6 atan2 (0.2718281828459045E1, ~0.3141592653589793E1) = 2.428308113 pow (0.2718281828459045E1, ~0.3141592653589793E1) = 0.04321391826 atan2 (0.2718281828459045E1, ~0.2718281828459045E1) = 2.35619449 pow (0.2718281828459045E1, ~0.2718281828459045E1) = 0.06598803585 atan2 (0.2718281828459045E1, ~0.123E1) = 1.99572043 pow (0.2718281828459045E1, ~0.123E1) = 0.2922925777 atan2 (0.2718281828459045E1, ~0.123) = 1.616014654 pow (0.2718281828459045E1, ~0.123) = 0.8842636626 atan2 (0.2718281828459045E1, ~0.123E~2) = 1.571248818 pow (0.2718281828459045E1, ~0.123E~2) = 0.9987707561 atan2 (0.2718281828459045E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, ~0.5E~323) = 1.570796327 pow (0.2718281828459045E1, ~0.5E~323) = 1 atan2 (0.2718281828459045E1, ~0.0) = 1.570796327 pow (0.2718281828459045E1, ~0.0) = 1 atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.2718281828459045E1, ~inf) = 3.141592654 pow (0.2718281828459045E1, ~inf) = 0 atan2 (0.2718281828459045E1, nan) = nan pow (0.2718281828459045E1, nan) = nan atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.123E1, 0.17976931348623157E309) = 6.842102115E~309 pow (0.123E1, 0.17976931348623157E309) = inf atan2 (0.123E1, 0.8988465674311579E308) = 1.368420423E~308 pow (0.123E1, 0.8988465674311579E308) = inf atan2 (0.123E1, 0.123E4) = 9.999996667E~4 pow (0.123E1, 0.123E4) = 3.830778757E110 atan2 (0.123E1, 0.123E2) = 0.09966865249 pow (0.123E1, 0.123E2) = 12.75947692 atan2 (0.123E1, 0.3141592653589793E1) = 0.3731757303 pow (0.123E1, 0.3141592653589793E1) = 1.916219422 atan2 (0.123E1, 0.2718281828459045E1) = 0.4249241031 pow (0.123E1, 0.2718281828459045E1) = 1.755445823 atan2 (0.123E1, 0.123E1) = 0.7853981634 pow (0.123E1, 0.123E1) = 1.289980921 atan2 (0.123E1, 0.123) = 1.471127674 pow (0.123E1, 0.123) = 1.025789688 atan2 (0.123E1, 0.123E~2) = 1.569796327 pow (0.123E1, 0.123E~2) = 1.00025466 atan2 (0.123E1, 0.22250738585072014E~307) = 1.570796327 pow (0.123E1, 0.22250738585072014E~307) = 1 atan2 (0.123E1, 0.11125369292536007E~307) = 1.570796327 pow (0.123E1, 0.11125369292536007E~307) = 1 atan2 (0.123E1, 0.5E~323) = 1.570796327 pow (0.123E1, 0.5E~323) = 1 atan2 (0.123E1, 0.0) = 1.570796327 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.17976931348623157E309) = 3.141592654 pow (0.123E1, ~0.17976931348623157E309) = 0 atan2 (0.123E1, ~0.8988465674311579E308) = 3.141592654 pow (0.123E1, ~0.8988465674311579E308) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592654 pow (0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (0.123E1, ~0.123E2) = 3.041924001 pow (0.123E1, ~0.123E2) = 0.07837311876 atan2 (0.123E1, ~0.3141592653589793E1) = 2.768416923 pow (0.123E1, ~0.3141592653589793E1) = 0.5218609042 atan2 (0.123E1, ~0.2718281828459045E1) = 2.71666855 pow (0.123E1, ~0.2718281828459045E1) = 0.56965586 atan2 (0.123E1, ~0.123E1) = 2.35619449 pow (0.123E1, ~0.123E1) = 0.7752052637 atan2 (0.123E1, ~0.123) = 1.670464979 pow (0.123E1, ~0.123) = 0.9748586988 atan2 (0.123E1, ~0.123E~2) = 1.571796326 pow (0.123E1, ~0.123E~2) = 0.999745405 atan2 (0.123E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E1, ~0.22250738585072014E~307) = 1 atan2 (0.123E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E1, ~0.11125369292536007E~307) = 1 atan2 (0.123E1, ~0.5E~323) = 1.570796327 pow (0.123E1, ~0.5E~323) = 1 atan2 (0.123E1, ~0.0) = 1.570796327 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592654 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.17976931348623157E309) = 6.842102115E~310 pow (0.123, 0.17976931348623157E309) = 0 atan2 (0.123, 0.8988465674311579E308) = 1.368420423E~309 pow (0.123, 0.8988465674311579E308) = 0 atan2 (0.123, 0.123E4) = 9.999999967E~5 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666687 pow (0.123, 0.123E2) = 6.394886941E~12 atan2 (0.123, 0.3141592653589793E1) = 0.03913212911 pow (0.123, 0.3141592653589793E1) = 0.001383096824 atan2 (0.123, 0.2718281828459045E1) = 0.04521832678 pow (0.123, 0.2718281828459045E1) = 0.003358192615 atan2 (0.123, 0.123E1) = 0.09966865249 pow (0.123, 0.123E1) = 0.07595970809 atan2 (0.123, 0.123) = 0.7853981634 pow (0.123, 0.123) = 0.7727843683 atan2 (0.123, 0.123E~2) = 1.56079666 pow (0.123, 0.123E~2) = 0.9974257668 atan2 (0.123, 0.22250738585072014E~307) = 1.570796327 pow (0.123, 0.22250738585072014E~307) = 1 atan2 (0.123, 0.11125369292536007E~307) = 1.570796327 pow (0.123, 0.11125369292536007E~307) = 1 atan2 (0.123, 0.5E~323) = 1.570796327 pow (0.123, 0.5E~323) = 1 atan2 (0.123, 0.0) = 1.570796327 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.17976931348623157E309) = 3.141592654 pow (0.123, ~0.17976931348623157E309) = inf atan2 (0.123, ~0.8988465674311579E308) = 3.141592654 pow (0.123, ~0.8988465674311579E308) = inf atan2 (0.123, ~0.123E4) = 3.141492654 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592987 pow (0.123, ~0.123E2) = 156374930400 atan2 (0.123, ~0.3141592653589793E1) = 3.102460524 pow (0.123, ~0.3141592653589793E1) = 723.0151807 atan2 (0.123, ~0.2718281828459045E1) = 3.096374327 pow (0.123, ~0.2718281828459045E1) = 297.7792267 atan2 (0.123, ~0.123E1) = 3.041924001 pow (0.123, ~0.123E1) = 13.16487418 atan2 (0.123, ~0.123) = 2.35619449 pow (0.123, ~0.123) = 1.294022034 atan2 (0.123, ~0.123E~2) = 1.580795993 pow (0.123, ~0.123E~2) = 1.002580877 atan2 (0.123, ~0.22250738585072014E~307) = 1.570796327 pow (0.123, ~0.22250738585072014E~307) = 1 atan2 (0.123, ~0.11125369292536007E~307) = 1.570796327 pow (0.123, ~0.11125369292536007E~307) = 1 atan2 (0.123, ~0.5E~323) = 1.570796327 pow (0.123, ~0.5E~323) = 1 atan2 (0.123, ~0.0) = 1.570796327 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592654 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.17976931348623157E309) = 6.842102115E~312 pow (0.123E~2, 0.17976931348623157E309) = 0 atan2 (0.123E~2, 0.8988465674311579E308) = 1.368420423E~311 pow (0.123E~2, 0.8988465674311579E308) = 0 atan2 (0.123E~2, 0.123E4) = 1E~6 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 9.999999967E~5 pow (0.123E~2, 0.123E2) = 1.606322974E~36 atan2 (0.123E~2, 0.3141592653589793E1) = 3.9152114E~4 pow (0.123E~2, 0.3141592653589793E1) = 7.205552335E~10 atan2 (0.123E~2, 0.2718281828459045E1) = 4.524916818E~4 pow (0.123E~2, 0.2718281828459045E1) = 1.228971878E~8 atan2 (0.123E~2, 0.123E1) = 9.999996667E~4 pow (0.123E~2, 0.123E1) = 2.633802994E~4 atan2 (0.123E~2, 0.123) = 0.009999666687 pow (0.123E~2, 0.123) = 0.4385895994 atan2 (0.123E~2, 0.123E~2) = 0.7853981634 pow (0.123E~2, 0.123E~2) = 0.9917919599 atan2 (0.123E~2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, 0.22250738585072014E~307) = 1 atan2 (0.123E~2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, 0.11125369292536007E~307) = 1 atan2 (0.123E~2, 0.5E~323) = 1.570796327 pow (0.123E~2, 0.5E~323) = 1 atan2 (0.123E~2, 0.0) = 1.570796327 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E~2, ~0.17976931348623157E309) = inf atan2 (0.123E~2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E~2, ~0.8988465674311579E308) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591654 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492654 pow (0.123E~2, ~0.123E2) = 6.225398107E35 atan2 (0.123E~2, ~0.3141592653589793E1) = 3.141201132 pow (0.123E~2, ~0.3141592653589793E1) = 1387818662 atan2 (0.123E~2, ~0.2718281828459045E1) = 3.141140162 pow (0.123E~2, ~0.2718281828459045E1) = 81368826.88 atan2 (0.123E~2, ~0.123E1) = 3.140592654 pow (0.123E~2, ~0.123E1) = 3796.791188 atan2 (0.123E~2, ~0.123) = 3.131592987 pow (0.123E~2, ~0.123) = 2.280035827 atan2 (0.123E~2, ~0.123E~2) = 2.35619449 pow (0.123E~2, ~0.123E~2) = 1.00827597 atan2 (0.123E~2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, ~0.22250738585072014E~307) = 1 atan2 (0.123E~2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, ~0.11125369292536007E~307) = 1 atan2 (0.123E~2, ~0.5E~323) = 1.570796327 pow (0.123E~2, ~0.5E~323) = 1 atan2 (0.123E~2, ~0.0) = 1.570796327 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592654 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (0.22250738585072014E~307, 0.123E4) = 1.809003137E~311 pow (0.22250738585072014E~307, 0.123E4) = 0 atan2 (0.22250738585072014E~307, 0.123E2) = 1.809003137E~309 pow (0.22250738585072014E~307, 0.123E2) = 0 atan2 (0.22250738585072014E~307, 0.3141592653589793E1) = 7.082630067E~309 pow (0.22250738585072014E~307, 0.3141592653589793E1) = 0 atan2 (0.22250738585072014E~307, 0.2718281828459045E1) = 8.185589276E~309 pow (0.22250738585072014E~307, 0.2718281828459045E1) = 0 atan2 (0.22250738585072014E~307, 0.123E1) = 1.809003137E~308 pow (0.22250738585072014E~307, 0.123E1) = 0 atan2 (0.22250738585072014E~307, 0.123) = 1.809003137E~307 pow (0.22250738585072014E~307, 0.123) = 1.441197052E~38 atan2 (0.22250738585072014E~307, 0.123E~2) = 1.809003137E~305 pow (0.22250738585072014E~307, 0.123E~2) = 0.4183957204 atan2 (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.7853981634 pow (0.22250738585072014E~307, 0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, 0.11125369292536007E~307) = 1.107148718 pow (0.22250738585072014E~307, 0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, 0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, 0.5E~323) = 1 atan2 (0.22250738585072014E~307, 0.0) = 1.570796327 pow (0.22250738585072014E~307, 0.0) = 1 atan2 (0.22250738585072014E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (0.22250738585072014E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (0.22250738585072014E~307, ~0.123E4) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E4) = inf atan2 (0.22250738585072014E~307, ~0.123E2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E2) = inf atan2 (0.22250738585072014E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.3141592653589793E1) = inf atan2 (0.22250738585072014E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.2718281828459045E1) = inf atan2 (0.22250738585072014E~307, ~0.123E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E1) = inf atan2 (0.22250738585072014E~307, ~0.123) = 3.141592654 pow (0.22250738585072014E~307, ~0.123) = 6.93867642E37 atan2 (0.22250738585072014E~307, ~0.123E~2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E~2) = 2.390081808 atan2 (0.22250738585072014E~307, ~0.22250738585072014E~307) = 2.35619449 pow (0.22250738585072014E~307, ~0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, ~0.11125369292536007E~307) = 2.034443936 pow (0.22250738585072014E~307, ~0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, ~0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, ~0.5E~323) = 1 atan2 (0.22250738585072014E~307, ~0.0) = 1.570796327 pow (0.22250738585072014E~307, ~0.0) = 1 atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.22250738585072014E~307, ~inf) = 3.141592654 pow (0.22250738585072014E~307, ~inf) = inf atan2 (0.22250738585072014E~307, nan) = nan pow (0.22250738585072014E~307, nan) = nan atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (0.11125369292536007E~307, 0.123E4) = 9.045015685E~312 pow (0.11125369292536007E~307, 0.123E4) = 0 atan2 (0.11125369292536007E~307, 0.123E2) = 9.045015685E~310 pow (0.11125369292536007E~307, 0.123E2) = 0 atan2 (0.11125369292536007E~307, 0.3141592653589793E1) = 3.541315033E~309 pow (0.11125369292536007E~307, 0.3141592653589793E1) = 0 atan2 (0.11125369292536007E~307, 0.2718281828459045E1) = 4.092794638E~309 pow (0.11125369292536007E~307, 0.2718281828459045E1) = 0 atan2 (0.11125369292536007E~307, 0.123E1) = 9.045015685E~309 pow (0.11125369292536007E~307, 0.123E1) = 0 atan2 (0.11125369292536007E~307, 0.123) = 9.045015685E~308 pow (0.11125369292536007E~307, 0.123) = 1.323416898E~38 atan2 (0.11125369292536007E~307, 0.123E~2) = 9.045015685E~306 pow (0.11125369292536007E~307, 0.123E~2) = 0.4180391603 atan2 (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.463647609 pow (0.11125369292536007E~307, 0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.7853981634 pow (0.11125369292536007E~307, 0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, 0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, 0.5E~323) = 1 atan2 (0.11125369292536007E~307, 0.0) = 1.570796327 pow (0.11125369292536007E~307, 0.0) = 1 atan2 (0.11125369292536007E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (0.11125369292536007E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (0.11125369292536007E~307, ~0.123E4) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E4) = inf atan2 (0.11125369292536007E~307, ~0.123E2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E2) = inf atan2 (0.11125369292536007E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.3141592653589793E1) = inf atan2 (0.11125369292536007E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.2718281828459045E1) = inf atan2 (0.11125369292536007E~307, ~0.123E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E1) = inf atan2 (0.11125369292536007E~307, ~0.123) = 3.141592654 pow (0.11125369292536007E~307, ~0.123) = 7.556197911E37 atan2 (0.11125369292536007E~307, ~0.123E~2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E~2) = 2.392120392 atan2 (0.11125369292536007E~307, ~0.22250738585072014E~307) = 2.677945045 pow (0.11125369292536007E~307, ~0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, ~0.11125369292536007E~307) = 2.35619449 pow (0.11125369292536007E~307, ~0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, ~0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, ~0.5E~323) = 1 atan2 (0.11125369292536007E~307, ~0.0) = 1.570796327 pow (0.11125369292536007E~307, ~0.0) = 1 atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.11125369292536007E~307, ~inf) = 3.141592654 pow (0.11125369292536007E~307, ~inf) = inf atan2 (0.11125369292536007E~307, nan) = nan pow (0.11125369292536007E~307, nan) = nan atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.5E~323, 0.17976931348623157E309) = 0 pow (0.5E~323, 0.17976931348623157E309) = 0 atan2 (0.5E~323, 0.8988465674311579E308) = 0 pow (0.5E~323, 0.8988465674311579E308) = 0 atan2 (0.5E~323, 0.123E4) = 0 pow (0.5E~323, 0.123E4) = 0 atan2 (0.5E~323, 0.123E2) = 0 pow (0.5E~323, 0.123E2) = 0 atan2 (0.5E~323, 0.3141592653589793E1) = 0 pow (0.5E~323, 0.3141592653589793E1) = 0 atan2 (0.5E~323, 0.2718281828459045E1) = 0 pow (0.5E~323, 0.2718281828459045E1) = 0 atan2 (0.5E~323, 0.123E1) = 4.940656458E~324 pow (0.5E~323, 0.123E1) = 0 atan2 (0.5E~323, 0.123) = 3.952525167E~323 pow (0.5E~323, 0.123) = 1.711336892E~40 atan2 (0.5E~323, 0.123E~2) = 4.016753701E~321 pow (0.5E~323, 0.123E~2) = 0.4002518566 atan2 (0.5E~323, 0.22250738585072014E~307) = 2.220446049E~16 pow (0.5E~323, 0.22250738585072014E~307) = 1 atan2 (0.5E~323, 0.11125369292536007E~307) = 4.440892099E~16 pow (0.5E~323, 0.11125369292536007E~307) = 1 atan2 (0.5E~323, 0.5E~323) = 0.7853981634 pow (0.5E~323, 0.5E~323) = 1 atan2 (0.5E~323, 0.0) = 1.570796327 pow (0.5E~323, 0.0) = 1 atan2 (0.5E~323, ~0.17976931348623157E309) = 3.141592654 pow (0.5E~323, ~0.17976931348623157E309) = inf atan2 (0.5E~323, ~0.8988465674311579E308) = 3.141592654 pow (0.5E~323, ~0.8988465674311579E308) = inf atan2 (0.5E~323, ~0.123E4) = 3.141592654 pow (0.5E~323, ~0.123E4) = inf atan2 (0.5E~323, ~0.123E2) = 3.141592654 pow (0.5E~323, ~0.123E2) = inf atan2 (0.5E~323, ~0.3141592653589793E1) = 3.141592654 pow (0.5E~323, ~0.3141592653589793E1) = inf atan2 (0.5E~323, ~0.2718281828459045E1) = 3.141592654 pow (0.5E~323, ~0.2718281828459045E1) = inf atan2 (0.5E~323, ~0.123E1) = 3.141592654 pow (0.5E~323, ~0.123E1) = inf atan2 (0.5E~323, ~0.123) = 3.141592654 pow (0.5E~323, ~0.123) = 5.843384809E39 atan2 (0.5E~323, ~0.123E~2) = 3.141592654 pow (0.5E~323, ~0.123E~2) = 2.498426887 atan2 (0.5E~323, ~0.22250738585072014E~307) = 3.141592654 pow (0.5E~323, ~0.22250738585072014E~307) = 1 atan2 (0.5E~323, ~0.11125369292536007E~307) = 3.141592654 pow (0.5E~323, ~0.11125369292536007E~307) = 1 atan2 (0.5E~323, ~0.5E~323) = 2.35619449 pow (0.5E~323, ~0.5E~323) = 1 atan2 (0.5E~323, ~0.0) = 1.570796327 pow (0.5E~323, ~0.0) = 1 atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.5E~323, ~inf) = 3.141592654 pow (0.5E~323, ~inf) = inf atan2 (0.5E~323, nan) = nan pow (0.5E~323, nan) = nan atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.0, 0.17976931348623157E309) = 0 pow (0.0, 0.17976931348623157E309) = 0 atan2 (0.0, 0.8988465674311579E308) = 0 pow (0.0, 0.8988465674311579E308) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.3141592653589793E1) = 0 pow (0.0, 0.3141592653589793E1) = 0 atan2 (0.0, 0.2718281828459045E1) = 0 pow (0.0, 0.2718281828459045E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.22250738585072014E~307) = 0 pow (0.0, 0.22250738585072014E~307) = 0 atan2 (0.0, 0.11125369292536007E~307) = 0 pow (0.0, 0.11125369292536007E~307) = 0 atan2 (0.0, 0.5E~323) = 0 pow (0.0, 0.5E~323) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.17976931348623157E309) = 3.141592654 pow (0.0, ~0.17976931348623157E309) = inf atan2 (0.0, ~0.8988465674311579E308) = 3.141592654 pow (0.0, ~0.8988465674311579E308) = inf atan2 (0.0, ~0.123E4) = 3.141592654 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592654 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.3141592653589793E1) = 3.141592654 pow (0.0, ~0.3141592653589793E1) = inf atan2 (0.0, ~0.2718281828459045E1) = 3.141592654 pow (0.0, ~0.2718281828459045E1) = inf atan2 (0.0, ~0.123E1) = 3.141592654 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592654 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592654 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.22250738585072014E~307) = 3.141592654 pow (0.0, ~0.22250738585072014E~307) = inf atan2 (0.0, ~0.11125369292536007E~307) = 3.141592654 pow (0.0, ~0.11125369292536007E~307) = inf atan2 (0.0, ~0.5E~323) = 3.141592654 pow (0.0, ~0.5E~323) = inf atan2 (0.0, ~0.0) = 3.141592654 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592654 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.7853981634 pow (~0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (~0.17976931348623157E309, 0.8988465674311579E308) = ~1.107148718 pow (~0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (~0.17976931348623157E309, 0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E4) = inf atan2 (~0.17976931348623157E309, 0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E2) = nan atan2 (~0.17976931348623157E309, 0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, 0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, 0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E1) = nan atan2 (~0.17976931348623157E309, 0.123) = ~1.570796327 pow (~0.17976931348623157E309, 0.123) = nan atan2 (~0.17976931348623157E309, 0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E~2) = nan atan2 (~0.17976931348623157E309, 0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, 0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, 0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, 0.5E~323) = nan atan2 (~0.17976931348623157E309, 0.0) = ~1.570796327 pow (~0.17976931348623157E309, 0.0) = 1 atan2 (~0.17976931348623157E309, ~0.17976931348623157E309) = ~2.35619449 pow (~0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (~0.17976931348623157E309, ~0.8988465674311579E308) = ~2.034443936 pow (~0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (~0.17976931348623157E309, ~0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E4) = 0 atan2 (~0.17976931348623157E309, ~0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E2) = nan atan2 (~0.17976931348623157E309, ~0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, ~0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, ~0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E1) = nan atan2 (~0.17976931348623157E309, ~0.123) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123) = nan atan2 (~0.17976931348623157E309, ~0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E~2) = nan atan2 (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, ~0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, ~0.5E~323) = nan atan2 (~0.17976931348623157E309, ~0.0) = ~1.570796327 pow (~0.17976931348623157E309, ~0.0) = 1 atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.17976931348623157E309, ~inf) = ~3.141592654 pow (~0.17976931348623157E309, ~inf) = 0 atan2 (~0.17976931348623157E309, nan) = nan pow (~0.17976931348623157E309, nan) = nan atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.463647609 pow (~0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.7853981634 pow (~0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (~0.8988465674311579E308, 0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E4) = inf atan2 (~0.8988465674311579E308, 0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E2) = nan atan2 (~0.8988465674311579E308, 0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, 0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, 0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E1) = nan atan2 (~0.8988465674311579E308, 0.123) = ~1.570796327 pow (~0.8988465674311579E308, 0.123) = nan atan2 (~0.8988465674311579E308, 0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E~2) = nan atan2 (~0.8988465674311579E308, 0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, 0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, 0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, 0.5E~323) = nan atan2 (~0.8988465674311579E308, 0.0) = ~1.570796327 pow (~0.8988465674311579E308, 0.0) = 1 atan2 (~0.8988465674311579E308, ~0.17976931348623157E309) = ~2.677945045 pow (~0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (~0.8988465674311579E308, ~0.8988465674311579E308) = ~2.35619449 pow (~0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (~0.8988465674311579E308, ~0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E4) = 0 atan2 (~0.8988465674311579E308, ~0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E2) = nan atan2 (~0.8988465674311579E308, ~0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, ~0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, ~0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E1) = nan atan2 (~0.8988465674311579E308, ~0.123) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123) = nan atan2 (~0.8988465674311579E308, ~0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E~2) = nan atan2 (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, ~0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, ~0.5E~323) = nan atan2 (~0.8988465674311579E308, ~0.0) = ~1.570796327 pow (~0.8988465674311579E308, ~0.0) = 1 atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.8988465674311579E308, ~inf) = ~3.141592654 pow (~0.8988465674311579E308, ~inf) = 0 atan2 (~0.8988465674311579E308, nan) = nan pow (~0.8988465674311579E308, nan) = nan atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.123E4, 0.17976931348623157E309) = ~6.842102115E~306 pow (~0.123E4, 0.17976931348623157E309) = inf atan2 (~0.123E4, 0.8988465674311579E308) = ~1.368420423E~305 pow (~0.123E4, 0.8988465674311579E308) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981634 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.56079666 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.3141592653589793E1) = ~1.568242192 pow (~0.123E4, 0.3141592653589793E1) = nan atan2 (~0.123E4, 0.2718281828459045E1) = ~1.568586345 pow (~0.123E4, 0.2718281828459045E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796327 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696327 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795327 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, 0.22250738585072014E~307) = nan atan2 (~0.123E4, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, 0.11125369292536007E~307) = nan atan2 (~0.123E4, 0.5E~323) = ~1.570796327 pow (~0.123E4, 0.5E~323) = nan atan2 (~0.123E4, 0.0) = ~1.570796327 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E4, ~0.17976931348623157E309) = 0 atan2 (~0.123E4, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E4, ~0.8988465674311579E308) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.35619449 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580795993 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.3141592653589793E1) = ~1.573350462 pow (~0.123E4, ~0.3141592653589793E1) = nan atan2 (~0.123E4, ~0.2718281828459045E1) = ~1.573006308 pow (~0.123E4, ~0.2718281828459045E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796326 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896327 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797327 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, ~0.22250738585072014E~307) = nan atan2 (~0.123E4, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, ~0.11125369292536007E~307) = nan atan2 (~0.123E4, ~0.5E~323) = ~1.570796327 pow (~0.123E4, ~0.5E~323) = nan atan2 (~0.123E4, ~0.0) = ~1.570796327 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592654 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.17976931348623157E309) = ~6.842102115E~308 pow (~0.123E2, 0.17976931348623157E309) = inf atan2 (~0.123E2, 0.8988465674311579E308) = ~1.368420423E~307 pow (~0.123E2, 0.8988465674311579E308) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666687 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981634 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.3141592653589793E1) = ~1.320728626 pow (~0.123E2, 0.3141592653589793E1) = nan atan2 (~0.123E2, 0.2718281828459045E1) = ~1.353293796 pow (~0.123E2, 0.2718281828459045E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127674 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.56079666 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696327 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, 0.22250738585072014E~307) = nan atan2 (~0.123E2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, 0.11125369292536007E~307) = nan atan2 (~0.123E2, 0.5E~323) = ~1.570796327 pow (~0.123E2, 0.5E~323) = nan atan2 (~0.123E2, 0.0) = ~1.570796327 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E2, ~0.17976931348623157E309) = 0 atan2 (~0.123E2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E2, ~0.8988465674311579E308) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592987 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.35619449 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.3141592653589793E1) = ~1.820864027 pow (~0.123E2, ~0.3141592653589793E1) = nan atan2 (~0.123E2, ~0.2718281828459045E1) = ~1.788298857 pow (~0.123E2, ~0.2718281828459045E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464979 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580795993 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896327 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, ~0.22250738585072014E~307) = nan atan2 (~0.123E2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, ~0.11125369292536007E~307) = nan atan2 (~0.123E2, ~0.5E~323) = ~1.570796327 pow (~0.123E2, ~0.5E~323) = nan atan2 (~0.123E2, ~0.0) = ~1.570796327 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592654 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.3141592653589793E1, 0.17976931348623157E309) = ~1.747568922E~308 pow (~0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (~0.3141592653589793E1, 0.8988465674311579E308) = ~3.495137844E~308 pow (~0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (~0.3141592653589793E1, 0.123E4) = ~0.002554134815 pow (~0.3141592653589793E1, 0.123E4) = inf atan2 (~0.3141592653589793E1, 0.123E2) = ~0.2500677004 pow (~0.3141592653589793E1, 0.123E2) = nan atan2 (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.7853981634 pow (~0.3141592653589793E1, 0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8575117864 pow (~0.3141592653589793E1, 0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, 0.123E1) = ~1.197620596 pow (~0.3141592653589793E1, 0.123E1) = nan atan2 (~0.3141592653589793E1, 0.123) = ~1.531664198 pow (~0.3141592653589793E1, 0.123) = nan atan2 (~0.3141592653589793E1, 0.123E~2) = ~1.570404806 pow (~0.3141592653589793E1, 0.123E~2) = nan atan2 (~0.3141592653589793E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, 0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, 0.5E~323) = nan atan2 (~0.3141592653589793E1, 0.0) = ~1.570796327 pow (~0.3141592653589793E1, 0.0) = 1 atan2 (~0.3141592653589793E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (~0.3141592653589793E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (~0.3141592653589793E1, ~0.123E4) = ~3.139038519 pow (~0.3141592653589793E1, ~0.123E4) = 0 atan2 (~0.3141592653589793E1, ~0.123E2) = ~2.891524953 pow (~0.3141592653589793E1, ~0.123E2) = nan atan2 (~0.3141592653589793E1, ~0.3141592653589793E1) = ~2.35619449 pow (~0.3141592653589793E1, ~0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, ~0.2718281828459045E1) = ~2.284080867 pow (~0.3141592653589793E1, ~0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, ~0.123E1) = ~1.943972057 pow (~0.3141592653589793E1, ~0.123E1) = nan atan2 (~0.3141592653589793E1, ~0.123) = ~1.609928456 pow (~0.3141592653589793E1, ~0.123) = nan atan2 (~0.3141592653589793E1, ~0.123E~2) = ~1.571187848 pow (~0.3141592653589793E1, ~0.123E~2) = nan atan2 (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, ~0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, ~0.5E~323) = nan atan2 (~0.3141592653589793E1, ~0.0) = ~1.570796327 pow (~0.3141592653589793E1, ~0.0) = 1 atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.3141592653589793E1, ~inf) = ~3.141592654 pow (~0.3141592653589793E1, ~inf) = 0 atan2 (~0.3141592653589793E1, nan) = nan pow (~0.3141592653589793E1, nan) = nan atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.2718281828459045E1, 0.17976931348623157E309) = ~1.512094459E~308 pow (~0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (~0.2718281828459045E1, 0.8988465674311579E308) = ~3.024188918E~308 pow (~0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (~0.2718281828459045E1, 0.123E4) = ~0.002209981629 pow (~0.2718281828459045E1, 0.123E4) = inf atan2 (~0.2718281828459045E1, 0.123E2) = ~0.2175025304 pow (~0.2718281828459045E1, 0.123E2) = nan atan2 (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.7132845404 pow (~0.2718281828459045E1, 0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.7853981634 pow (~0.2718281828459045E1, 0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, 0.123E1) = ~1.145872224 pow (~0.2718281828459045E1, 0.123E1) = nan atan2 (~0.2718281828459045E1, 0.123) = ~1.525578 pow (~0.2718281828459045E1, 0.123) = nan atan2 (~0.2718281828459045E1, 0.123E~2) = ~1.570343835 pow (~0.2718281828459045E1, 0.123E~2) = nan atan2 (~0.2718281828459045E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, 0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, 0.5E~323) = nan atan2 (~0.2718281828459045E1, 0.0) = ~1.570796327 pow (~0.2718281828459045E1, 0.0) = 1 atan2 (~0.2718281828459045E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (~0.2718281828459045E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (~0.2718281828459045E1, ~0.123E4) = ~3.139382672 pow (~0.2718281828459045E1, ~0.123E4) = 0 atan2 (~0.2718281828459045E1, ~0.123E2) = ~2.924090123 pow (~0.2718281828459045E1, ~0.123E2) = nan atan2 (~0.2718281828459045E1, ~0.3141592653589793E1) = ~2.428308113 pow (~0.2718281828459045E1, ~0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, ~0.2718281828459045E1) = ~2.35619449 pow (~0.2718281828459045E1, ~0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, ~0.123E1) = ~1.99572043 pow (~0.2718281828459045E1, ~0.123E1) = nan atan2 (~0.2718281828459045E1, ~0.123) = ~1.616014654 pow (~0.2718281828459045E1, ~0.123) = nan atan2 (~0.2718281828459045E1, ~0.123E~2) = ~1.571248818 pow (~0.2718281828459045E1, ~0.123E~2) = nan atan2 (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, ~0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, ~0.5E~323) = nan atan2 (~0.2718281828459045E1, ~0.0) = ~1.570796327 pow (~0.2718281828459045E1, ~0.0) = 1 atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.2718281828459045E1, ~inf) = ~3.141592654 pow (~0.2718281828459045E1, ~inf) = 0 atan2 (~0.2718281828459045E1, nan) = nan pow (~0.2718281828459045E1, nan) = nan atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.123E1, 0.17976931348623157E309) = ~6.842102115E~309 pow (~0.123E1, 0.17976931348623157E309) = inf atan2 (~0.123E1, 0.8988465674311579E308) = ~1.368420423E~308 pow (~0.123E1, 0.8988465674311579E308) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996667E~4 pow (~0.123E1, 0.123E4) = 3.830778757E110 atan2 (~0.123E1, 0.123E2) = ~0.09966865249 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.3141592653589793E1) = ~0.3731757303 pow (~0.123E1, 0.3141592653589793E1) = nan atan2 (~0.123E1, 0.2718281828459045E1) = ~0.4249241031 pow (~0.123E1, 0.2718281828459045E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981634 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127674 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796327 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, 0.22250738585072014E~307) = nan atan2 (~0.123E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, 0.11125369292536007E~307) = nan atan2 (~0.123E1, 0.5E~323) = ~1.570796327 pow (~0.123E1, 0.5E~323) = nan atan2 (~0.123E1, 0.0) = ~1.570796327 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E1, ~0.17976931348623157E309) = 0 atan2 (~0.123E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E1, ~0.8988465674311579E308) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592654 pow (~0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (~0.123E1, ~0.123E2) = ~3.041924001 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.3141592653589793E1) = ~2.768416923 pow (~0.123E1, ~0.3141592653589793E1) = nan atan2 (~0.123E1, ~0.2718281828459045E1) = ~2.71666855 pow (~0.123E1, ~0.2718281828459045E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.35619449 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464979 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796326 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, ~0.22250738585072014E~307) = nan atan2 (~0.123E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, ~0.11125369292536007E~307) = nan atan2 (~0.123E1, ~0.5E~323) = ~1.570796327 pow (~0.123E1, ~0.5E~323) = nan atan2 (~0.123E1, ~0.0) = ~1.570796327 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592654 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.17976931348623157E309) = ~6.842102115E~310 pow (~0.123, 0.17976931348623157E309) = 0 atan2 (~0.123, 0.8988465674311579E308) = ~1.368420423E~309 pow (~0.123, 0.8988465674311579E308) = 0 atan2 (~0.123, 0.123E4) = ~9.999999967E~5 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666687 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.3141592653589793E1) = ~0.03913212911 pow (~0.123, 0.3141592653589793E1) = nan atan2 (~0.123, 0.2718281828459045E1) = ~0.04521832678 pow (~0.123, 0.2718281828459045E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865249 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981634 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.56079666 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123, 0.22250738585072014E~307) = nan atan2 (~0.123, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123, 0.11125369292536007E~307) = nan atan2 (~0.123, 0.5E~323) = ~1.570796327 pow (~0.123, 0.5E~323) = nan atan2 (~0.123, 0.0) = ~1.570796327 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123, ~0.17976931348623157E309) = inf atan2 (~0.123, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123, ~0.8988465674311579E308) = inf atan2 (~0.123, ~0.123E4) = ~3.141492654 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592987 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.3141592653589793E1) = ~3.102460524 pow (~0.123, ~0.3141592653589793E1) = nan atan2 (~0.123, ~0.2718281828459045E1) = ~3.096374327 pow (~0.123, ~0.2718281828459045E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924001 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.35619449 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580795993 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123, ~0.22250738585072014E~307) = nan atan2 (~0.123, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123, ~0.11125369292536007E~307) = nan atan2 (~0.123, ~0.5E~323) = ~1.570796327 pow (~0.123, ~0.5E~323) = nan atan2 (~0.123, ~0.0) = ~1.570796327 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592654 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.17976931348623157E309) = ~6.842102115E~312 pow (~0.123E~2, 0.17976931348623157E309) = 0 atan2 (~0.123E~2, 0.8988465674311579E308) = ~1.368420423E~311 pow (~0.123E~2, 0.8988465674311579E308) = 0 atan2 (~0.123E~2, 0.123E4) = ~1E~6 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~9.999999967E~5 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.3141592653589793E1) = ~3.9152114E~4 pow (~0.123E~2, 0.3141592653589793E1) = nan atan2 (~0.123E~2, 0.2718281828459045E1) = ~4.524916818E~4 pow (~0.123E~2, 0.2718281828459045E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996667E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666687 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981634 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, 0.22250738585072014E~307) = nan atan2 (~0.123E~2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, 0.11125369292536007E~307) = nan atan2 (~0.123E~2, 0.5E~323) = ~1.570796327 pow (~0.123E~2, 0.5E~323) = nan atan2 (~0.123E~2, 0.0) = ~1.570796327 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E~2, ~0.17976931348623157E309) = inf atan2 (~0.123E~2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E~2, ~0.8988465674311579E308) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591654 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492654 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.3141592653589793E1) = ~3.141201132 pow (~0.123E~2, ~0.3141592653589793E1) = nan atan2 (~0.123E~2, ~0.2718281828459045E1) = ~3.141140162 pow (~0.123E~2, ~0.2718281828459045E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592654 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592987 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.35619449 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, ~0.22250738585072014E~307) = nan atan2 (~0.123E~2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, ~0.11125369292536007E~307) = nan atan2 (~0.123E~2, ~0.5E~323) = ~1.570796327 pow (~0.123E~2, ~0.5E~323) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796327 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592654 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (~0.22250738585072014E~307, 0.123E4) = ~1.809003137E~311 pow (~0.22250738585072014E~307, 0.123E4) = 0 atan2 (~0.22250738585072014E~307, 0.123E2) = ~1.809003137E~309 pow (~0.22250738585072014E~307, 0.123E2) = nan atan2 (~0.22250738585072014E~307, 0.3141592653589793E1) = ~7.082630067E~309 pow (~0.22250738585072014E~307, 0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, 0.2718281828459045E1) = ~8.185589276E~309 pow (~0.22250738585072014E~307, 0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, 0.123E1) = ~1.809003137E~308 pow (~0.22250738585072014E~307, 0.123E1) = nan atan2 (~0.22250738585072014E~307, 0.123) = ~1.809003137E~307 pow (~0.22250738585072014E~307, 0.123) = nan atan2 (~0.22250738585072014E~307, 0.123E~2) = ~1.809003137E~305 pow (~0.22250738585072014E~307, 0.123E~2) = nan atan2 (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.7853981634 pow (~0.22250738585072014E~307, 0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~1.107148718 pow (~0.22250738585072014E~307, 0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, 0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, 0.5E~323) = nan atan2 (~0.22250738585072014E~307, 0.0) = ~1.570796327 pow (~0.22250738585072014E~307, 0.0) = 1 atan2 (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (~0.22250738585072014E~307, ~0.123E4) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E4) = inf atan2 (~0.22250738585072014E~307, ~0.123E2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E2) = nan atan2 (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, ~0.123E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E1) = nan atan2 (~0.22250738585072014E~307, ~0.123) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123) = nan atan2 (~0.22250738585072014E~307, ~0.123E~2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E~2) = nan atan2 (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~2.35619449 pow (~0.22250738585072014E~307, ~0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~2.034443936 pow (~0.22250738585072014E~307, ~0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, ~0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.5E~323) = nan atan2 (~0.22250738585072014E~307, ~0.0) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.0) = 1 atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.22250738585072014E~307, ~inf) = ~3.141592654 pow (~0.22250738585072014E~307, ~inf) = inf atan2 (~0.22250738585072014E~307, nan) = nan pow (~0.22250738585072014E~307, nan) = nan atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (~0.11125369292536007E~307, 0.123E4) = ~9.045015685E~312 pow (~0.11125369292536007E~307, 0.123E4) = 0 atan2 (~0.11125369292536007E~307, 0.123E2) = ~9.045015685E~310 pow (~0.11125369292536007E~307, 0.123E2) = nan atan2 (~0.11125369292536007E~307, 0.3141592653589793E1) = ~3.541315033E~309 pow (~0.11125369292536007E~307, 0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, 0.2718281828459045E1) = ~4.092794638E~309 pow (~0.11125369292536007E~307, 0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, 0.123E1) = ~9.045015685E~309 pow (~0.11125369292536007E~307, 0.123E1) = nan atan2 (~0.11125369292536007E~307, 0.123) = ~9.045015685E~308 pow (~0.11125369292536007E~307, 0.123) = nan atan2 (~0.11125369292536007E~307, 0.123E~2) = ~9.045015685E~306 pow (~0.11125369292536007E~307, 0.123E~2) = nan atan2 (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.463647609 pow (~0.11125369292536007E~307, 0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.7853981634 pow (~0.11125369292536007E~307, 0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, 0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, 0.5E~323) = nan atan2 (~0.11125369292536007E~307, 0.0) = ~1.570796327 pow (~0.11125369292536007E~307, 0.0) = 1 atan2 (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (~0.11125369292536007E~307, ~0.123E4) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E4) = inf atan2 (~0.11125369292536007E~307, ~0.123E2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E2) = nan atan2 (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, ~0.123E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E1) = nan atan2 (~0.11125369292536007E~307, ~0.123) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123) = nan atan2 (~0.11125369292536007E~307, ~0.123E~2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E~2) = nan atan2 (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~2.677945045 pow (~0.11125369292536007E~307, ~0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~2.35619449 pow (~0.11125369292536007E~307, ~0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, ~0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.5E~323) = nan atan2 (~0.11125369292536007E~307, ~0.0) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.0) = 1 atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.11125369292536007E~307, ~inf) = ~3.141592654 pow (~0.11125369292536007E~307, ~inf) = inf atan2 (~0.11125369292536007E~307, nan) = nan pow (~0.11125369292536007E~307, nan) = nan atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.5E~323, 0.17976931348623157E309) = 0 pow (~0.5E~323, 0.17976931348623157E309) = 0 atan2 (~0.5E~323, 0.8988465674311579E308) = 0 pow (~0.5E~323, 0.8988465674311579E308) = 0 atan2 (~0.5E~323, 0.123E4) = 0 pow (~0.5E~323, 0.123E4) = 0 atan2 (~0.5E~323, 0.123E2) = 0 pow (~0.5E~323, 0.123E2) = nan atan2 (~0.5E~323, 0.3141592653589793E1) = 0 pow (~0.5E~323, 0.3141592653589793E1) = nan atan2 (~0.5E~323, 0.2718281828459045E1) = 0 pow (~0.5E~323, 0.2718281828459045E1) = nan atan2 (~0.5E~323, 0.123E1) = ~4.940656458E~324 pow (~0.5E~323, 0.123E1) = nan atan2 (~0.5E~323, 0.123) = ~3.952525167E~323 pow (~0.5E~323, 0.123) = nan atan2 (~0.5E~323, 0.123E~2) = ~4.016753701E~321 pow (~0.5E~323, 0.123E~2) = nan atan2 (~0.5E~323, 0.22250738585072014E~307) = ~2.220446049E~16 pow (~0.5E~323, 0.22250738585072014E~307) = nan atan2 (~0.5E~323, 0.11125369292536007E~307) = ~4.440892099E~16 pow (~0.5E~323, 0.11125369292536007E~307) = nan atan2 (~0.5E~323, 0.5E~323) = ~0.7853981634 pow (~0.5E~323, 0.5E~323) = nan atan2 (~0.5E~323, 0.0) = ~1.570796327 pow (~0.5E~323, 0.0) = 1 atan2 (~0.5E~323, ~0.17976931348623157E309) = ~3.141592654 pow (~0.5E~323, ~0.17976931348623157E309) = inf atan2 (~0.5E~323, ~0.8988465674311579E308) = ~3.141592654 pow (~0.5E~323, ~0.8988465674311579E308) = inf atan2 (~0.5E~323, ~0.123E4) = ~3.141592654 pow (~0.5E~323, ~0.123E4) = inf atan2 (~0.5E~323, ~0.123E2) = ~3.141592654 pow (~0.5E~323, ~0.123E2) = nan atan2 (~0.5E~323, ~0.3141592653589793E1) = ~3.141592654 pow (~0.5E~323, ~0.3141592653589793E1) = nan atan2 (~0.5E~323, ~0.2718281828459045E1) = ~3.141592654 pow (~0.5E~323, ~0.2718281828459045E1) = nan atan2 (~0.5E~323, ~0.123E1) = ~3.141592654 pow (~0.5E~323, ~0.123E1) = nan atan2 (~0.5E~323, ~0.123) = ~3.141592654 pow (~0.5E~323, ~0.123) = nan atan2 (~0.5E~323, ~0.123E~2) = ~3.141592654 pow (~0.5E~323, ~0.123E~2) = nan atan2 (~0.5E~323, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.5E~323, ~0.22250738585072014E~307) = nan atan2 (~0.5E~323, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.5E~323, ~0.11125369292536007E~307) = nan atan2 (~0.5E~323, ~0.5E~323) = ~2.35619449 pow (~0.5E~323, ~0.5E~323) = nan atan2 (~0.5E~323, ~0.0) = ~1.570796327 pow (~0.5E~323, ~0.0) = 1 atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.5E~323, ~inf) = ~3.141592654 pow (~0.5E~323, ~inf) = inf atan2 (~0.5E~323, nan) = nan pow (~0.5E~323, nan) = nan atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.0, 0.17976931348623157E309) = 0 pow (~0.0, 0.17976931348623157E309) = 0 atan2 (~0.0, 0.8988465674311579E308) = 0 pow (~0.0, 0.8988465674311579E308) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.3141592653589793E1) = 0 pow (~0.0, 0.3141592653589793E1) = 0 atan2 (~0.0, 0.2718281828459045E1) = 0 pow (~0.0, 0.2718281828459045E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.22250738585072014E~307) = 0 pow (~0.0, 0.22250738585072014E~307) = 0 atan2 (~0.0, 0.11125369292536007E~307) = 0 pow (~0.0, 0.11125369292536007E~307) = 0 atan2 (~0.0, 0.5E~323) = 0 pow (~0.0, 0.5E~323) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.17976931348623157E309) = ~3.141592654 pow (~0.0, ~0.17976931348623157E309) = inf atan2 (~0.0, ~0.8988465674311579E308) = ~3.141592654 pow (~0.0, ~0.8988465674311579E308) = inf atan2 (~0.0, ~0.123E4) = ~3.141592654 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592654 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.3141592653589793E1) = ~3.141592654 pow (~0.0, ~0.3141592653589793E1) = inf atan2 (~0.0, ~0.2718281828459045E1) = ~3.141592654 pow (~0.0, ~0.2718281828459045E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592654 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592654 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592654 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.0, ~0.22250738585072014E~307) = inf atan2 (~0.0, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.0, ~0.11125369292536007E~307) = inf atan2 (~0.0, ~0.5E~323) = ~3.141592654 pow (~0.0, ~0.5E~323) = inf atan2 (~0.0, ~0.0) = ~3.141592654 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592654 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (~inf, 0.17976931348623157E309) = ~1.570796327 pow (~inf, 0.17976931348623157E309) = inf atan2 (~inf, 0.8988465674311579E308) = ~1.570796327 pow (~inf, 0.8988465674311579E308) = inf atan2 (~inf, 0.123E4) = ~1.570796327 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796327 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.3141592653589793E1) = ~1.570796327 pow (~inf, 0.3141592653589793E1) = inf atan2 (~inf, 0.2718281828459045E1) = ~1.570796327 pow (~inf, 0.2718281828459045E1) = inf atan2 (~inf, 0.123E1) = ~1.570796327 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796327 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796327 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.22250738585072014E~307) = ~1.570796327 pow (~inf, 0.22250738585072014E~307) = inf atan2 (~inf, 0.11125369292536007E~307) = ~1.570796327 pow (~inf, 0.11125369292536007E~307) = inf atan2 (~inf, 0.5E~323) = ~1.570796327 pow (~inf, 0.5E~323) = inf atan2 (~inf, 0.0) = ~1.570796327 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.17976931348623157E309) = ~1.570796327 pow (~inf, ~0.17976931348623157E309) = 0 atan2 (~inf, ~0.8988465674311579E308) = ~1.570796327 pow (~inf, ~0.8988465674311579E308) = 0 atan2 (~inf, ~0.123E4) = ~1.570796327 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796327 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.3141592653589793E1) = ~1.570796327 pow (~inf, ~0.3141592653589793E1) = 0 atan2 (~inf, ~0.2718281828459045E1) = ~1.570796327 pow (~inf, ~0.2718281828459045E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796327 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796327 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796327 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.22250738585072014E~307) = ~1.570796327 pow (~inf, ~0.22250738585072014E~307) = 0 atan2 (~inf, ~0.11125369292536007E~307) = ~1.570796327 pow (~inf, ~0.11125369292536007E~307) = 0 atan2 (~inf, ~0.5E~323) = ~1.570796327 pow (~inf, ~0.5E~323) = 0 atan2 (~inf, ~0.0) = ~1.570796327 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.35619449 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (nan, 0.17976931348623157E309) = nan pow (nan, 0.17976931348623157E309) = nan atan2 (nan, 0.8988465674311579E308) = nan pow (nan, 0.8988465674311579E308) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.3141592653589793E1) = nan pow (nan, 0.3141592653589793E1) = nan atan2 (nan, 0.2718281828459045E1) = nan pow (nan, 0.2718281828459045E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.22250738585072014E~307) = nan pow (nan, 0.22250738585072014E~307) = nan atan2 (nan, 0.11125369292536007E~307) = nan pow (nan, 0.11125369292536007E~307) = nan atan2 (nan, 0.5E~323) = nan pow (nan, 0.5E~323) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.17976931348623157E309) = nan pow (nan, ~0.17976931348623157E309) = nan atan2 (nan, ~0.8988465674311579E308) = nan pow (nan, ~0.8988465674311579E308) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.3141592653589793E1) = nan pow (nan, ~0.3141592653589793E1) = nan atan2 (nan, ~0.2718281828459045E1) = nan pow (nan, ~0.2718281828459045E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.22250738585072014E~307) = nan pow (nan, ~0.22250738585072014E~307) = nan atan2 (nan, ~0.11125369292536007E~307) = nan pow (nan, ~0.11125369292536007E~307) = nan atan2 (nan, ~0.5E~323) = nan pow (nan, ~0.5E~323) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.17976931348623157E309, 0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.17976931348623157E309, 0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.17976931348623157E309, ~0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.17976931348623157E309, ~0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.8988465674311579E308, 0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.8988465674311579E308, 0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.8988465674311579E308, ~0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.8988465674311579E308, ~0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.8988465674311579E308, ~0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E4, 0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E4, 0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E4, 0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E4, 0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E4, 0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E4, 0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E4, 0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.123E4, 0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.123E4, 0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.123E4, 0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.123E4, 0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.123E4, 0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.123E4, 0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.123E4, 0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.123E4, 0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E4, 0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E4, 0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E4, 0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E4, 0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E4, 0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E4, 0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E4, 0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123E4, 0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123E4, 0.123, 0.123): 0.151413E3 0.15141299999999998E3 (0.123E4, 0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123E4, 0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123E4, 0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E4, 0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (0.123E4, 0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E4, ~0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E4, ~0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E4, ~0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E4, ~0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E4, ~0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E4, ~0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E4, ~0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.123E4, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.123E4, ~0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.123E4, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.123E4, ~0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.123E4, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.123E4, ~0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E4, ~0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E4, ~0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E4, ~0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E4, ~0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E4, ~0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E4, ~0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E4, ~0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123E4, ~0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123E4, ~0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123E4, ~0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123E4, ~0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123E4, ~0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E4, ~0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E4, ~0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E2, 0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (0.123E2, 0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (0.123E2, 0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (0.123E2, 0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (0.123E2, 0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (0.123E2, 0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (0.123E2, 0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.123E2, 0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.123E2, 0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.123E2, 0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.123E2, 0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.123E2, 0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.123E2, 0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.123E2, 0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.123E2, 0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E2, 0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E2, 0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E2, 0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E2, 0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123E2, 0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123E2, 0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E2, ~0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (0.123E2, ~0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (0.123E2, ~0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (0.123E2, ~0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (0.123E2, ~0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (0.123E2, ~0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (0.123E2, ~0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.123E2, ~0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.123E2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.123E2, ~0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.123E2, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.123E2, ~0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.123E2, ~0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.123E2, ~0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E2, ~0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E2, ~0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E2, ~0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E2, ~0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123E2, ~0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123E2, ~0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.3141592653589793E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (0.3141592653589793E1, 0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (0.3141592653589793E1, 0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (0.3141592653589793E1, 0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (0.3141592653589793E1, 0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (0.3141592653589793E1, 0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (0.3141592653589793E1, 0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (0.3141592653589793E1, 0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (0.3141592653589793E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.3141592653589793E1, 0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.3141592653589793E1, 0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.3141592653589793E1, 0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.3141592653589793E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (0.3141592653589793E1, ~0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (0.3141592653589793E1, ~0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (0.3141592653589793E1, ~0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (0.3141592653589793E1, ~0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (0.3141592653589793E1, ~0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (0.3141592653589793E1, ~0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (0.3141592653589793E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.3141592653589793E1, ~0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.3141592653589793E1, ~0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.3141592653589793E1, ~0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.2718281828459045E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (0.2718281828459045E1, 0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (0.2718281828459045E1, 0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (0.2718281828459045E1, 0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (0.2718281828459045E1, 0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (0.2718281828459045E1, 0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (0.2718281828459045E1, 0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (0.2718281828459045E1, 0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (0.2718281828459045E1, 0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (0.2718281828459045E1, 0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.2718281828459045E1, 0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.2718281828459045E1, 0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.2718281828459045E1, 0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (0.2718281828459045E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (0.2718281828459045E1, ~0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (0.2718281828459045E1, ~0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (0.2718281828459045E1, ~0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (0.2718281828459045E1, ~0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (0.2718281828459045E1, ~0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (0.2718281828459045E1, ~0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (0.2718281828459045E1, ~0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (0.2718281828459045E1, ~0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.2718281828459045E1, ~0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.2718281828459045E1, ~0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123E1, 0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (0.123E1, 0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (0.123E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (0.123E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (0.123E1, 0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (0.123E1, 0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (0.123E1, 0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (0.123E1, 0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (0.123E1, 0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (0.123E1, 0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (0.123E1, 0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (0.123E1, 0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (0.123E1, 0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (0.123E1, 0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (0.123E1, 0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (0.123E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (0.123E1, 0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (0.123E1, 0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (0.123E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (0.123E1, 0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E1, 0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (0.123E1, 0.123, 0.123): 0.27429 0.27429000000000003 (0.123E1, 0.123, 0.123E~2): 0.15252 0.15252000000000002 (0.123E1, 0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (0.123E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (0.123E1, ~0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (0.123E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (0.123E1, ~0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (0.123E1, ~0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (0.123E1, ~0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (0.123E1, ~0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (0.123E1, ~0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (0.123E1, ~0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (0.123E1, ~0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (0.123E1, ~0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (0.123E1, ~0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (0.123E1, ~0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (0.123E1, ~0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (0.123E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (0.123E1, ~0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (0.123E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (0.123E1, ~0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (0.123E1, ~0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E1, ~0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123E1, ~0.123, ~0.123): ~0.27429 ~0.27429000000000003 (0.123E1, ~0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, 0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (0.123, 0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (0.123, 0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (0.123, 0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (0.123, 0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (0.123, 0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (0.123, 0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (0.123, 0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (0.123, 0.123E1, 0.123): 0.27429 0.27429000000000003 (0.123, 0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (0.123, 0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (0.123, 0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.123, 0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.123, ~0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (0.123, ~0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (0.123, ~0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (0.123, ~0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (0.123, ~0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (0.123, ~0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (0.123, ~0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (0.123, ~0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (0.123, ~0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (0.123, ~0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (0.123, ~0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (0.123, ~0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.123, ~0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (0.123E~2, 0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (0.123E~2, 0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (0.123E~2, 0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (0.123E~2, 0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (0.123E~2, 0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (0.123E~2, ~0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (0.123E~2, ~0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (0.123E~2, ~0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (0.123E~2, ~0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (0.123E~2, ~0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (0.11125369292536007E~307, 0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (0.11125369292536007E~307, 0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (0.11125369292536007E~307, ~0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.17976931348623157E309, 0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.17976931348623157E309, 0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.17976931348623157E309, ~0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.17976931348623157E309, ~0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.8988465674311579E308, 0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.8988465674311579E308, 0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.8988465674311579E308, ~0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.8988465674311579E308, ~0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E4, 0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E4, 0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E4, 0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E4, 0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E4, 0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E4, 0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E4, 0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.123E4, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.123E4, 0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.123E4, 0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.123E4, 0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.123E4, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.123E4, 0.123E1, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E4, 0.123E1, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E4, 0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E4, 0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E4, 0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E4, 0.123E1, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E4, 0.123E1, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E4, 0.123, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123E4, 0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123E4, 0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123E4, 0.123, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123E4, 0.123, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123E4, 0.123E~2, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E4, 0.123E~2, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E4, 0.123E~2, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E4, ~0.123E2, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E4, ~0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E4, ~0.123E2, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E4, ~0.123E2, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E4, ~0.123E2, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E4, ~0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E4, ~0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.123E4, ~0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.123E4, ~0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.123E4, ~0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.123E4, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.123E4, ~0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E4, ~0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E4, ~0.123E1, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E4, ~0.123E1, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E4, ~0.123E1, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E4, ~0.123E1, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E4, ~0.123E1, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E4, ~0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123E4, ~0.123, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123E4, ~0.123, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123E4, ~0.123, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123E4, ~0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123E4, ~0.123E~2, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E4, ~0.123E~2, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E2, 0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.1512585840734641E5 (~0.123E2, 0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.151413E5 (~0.123E2, 0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.15131718281828458E5 (~0.123E2, 0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.1513023E5 (~0.123E2, 0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123E5 (~0.123E2, 0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.1512900123E5 (~0.123E2, 0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.123E2, 0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.123E2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.123E2, 0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.123E2, 0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.123E2, 0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.123E2, 0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.123E2, 0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E2, 0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E2, 0.123E1, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E2, 0.123E1, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E2, 0.123, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123E2, 0.123, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123E2, 0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E2, ~0.123E4, 0.123E2): 0.15141300000000001E5 0.151413E5 (~0.123E2, ~0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.15131718281828458E5 (~0.123E2, ~0.123E4, 0.123E1): 0.15130230000000001E5 0.1513023E5 (~0.123E2, ~0.123E4, 0.123): 0.15129123000000001E5 0.15129123E5 (~0.123E2, ~0.123E4, 0.123E~2): 0.15129001230000002E5 0.1512900123E5 (~0.123E2, ~0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.1512585840734641E5 (~0.123E2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.123E2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.123E2, ~0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.123E2, ~0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.123E2, ~0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.123E2, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.123E2, ~0.123E1, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E2, ~0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E2, ~0.123E1, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E2, ~0.123E1, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E2, ~0.123, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123E2, ~0.123, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123E2, ~0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.3141592653589793E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~inf (~0.3141592653589793E1, 0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.3851858963915445E4 (~0.3141592653589793E1, 0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.3867300556569035E4 (~0.3141592653589793E1, 0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154452E4 (~0.3141592653589793E1, 0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.2634158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.37411589639154464E2 (~0.3141592653589793E1, 0.123E2, 0.123): ~0.38518589639154456E2 ~0.3851858963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274426E2 (~0.3141592653589793E1, 0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.4135987146761351E2 (~0.3141592653589793E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.7151322572630313E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.3141592653589793E1, 0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.3141592653589793E1, 0.123E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.3141592653589793E1, 0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 inf (~0.3141592653589793E1, ~0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.3867300556569035E4 (~0.3141592653589793E1, ~0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154452E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E2): 0.38518589639154457E4 0.3851858963915445E4 (~0.3141592653589793E1, ~0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274426E2 (~0.3141592653589793E1, ~0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.4135987146761351E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E2): 0.26341589639154456E2 0.2634158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E1): 0.3741158963915446E2 0.37411589639154464E2 (~0.3141592653589793E1, ~0.123E2, ~0.123): 0.38518589639154456E2 0.3851858963915446E2 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.7151322572630313E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.3141592653589793E1, ~0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.3141592653589793E1, ~0.123E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.3141592653589793E1, ~0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.2718281828459045E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~inf (~0.2718281828459045E1, 0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.3340345056351036E4 (~0.2718281828459045E1, 0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.3343485419004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.3355786649004626E4 (~0.2718281828459045E1, 0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330847E4 (~0.2718281828459045E1, 0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046253E2 (~0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.3029327383645646E2 (~0.2718281828459045E1, 0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.3071658466158721E2 (~0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363604E2 (~0.2718281828459045E1, 0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004625E2 (~0.2718281828459045E1, 0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004625E2 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264347E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.73097342226735655E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673565E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.615905609893065E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.738782609893065E1 (~0.2718281828459045E1, 0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.2718281828459045E1, 0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.2718281828459045E1, 0.123, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 inf (~0.2718281828459045E1, ~0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.123E2): 0.33557866490046254E4 0.3355786649004626E4 (~0.2718281828459045E1, ~0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330847E4 (~0.2718281828459045E1, ~0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.3340345056351036E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E~2): 0.33434854190046253E4 0.3343485419004626E4 (~0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363604E2 (~0.2718281828459045E1, ~0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004625E2 (~0.2718281828459045E1, ~0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004625E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046253E2 (~0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.3029327383645646E2 (~0.2718281828459045E1, ~0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.3071658466158721E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673565E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264347E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.73097342226735655E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.615905609893065E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.738782609893065E1 (~0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.2718281828459045E1, ~0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.2718281828459045E1, ~0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.2718281828459045E1, ~0.123, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123E1, 0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~inf (~0.123E1, 0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~inf (~0.123E1, 0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219916E308 (~0.123E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.20673471050916621E308 (~0.123E1, 0.123E4, 0.123E4): ~0.2829E3 ~0.2829000000000001E3 (~0.123E1, 0.123E4, 0.123E2): ~0.15006E4 ~0.15006000000000001E4 (~0.123E1, 0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.151604159265359E4 (~0.123E1, 0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.15156182818284592E4 (~0.123E1, 0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.151413E4 (~0.123E1, 0.123E4, ~0.123): ~0.1513023E4 ~0.15130230000000001E4 (~0.123E1, 0.123E4, ~0.123E~2): ~0.151290123E4 ~0.15129012300000002E4 (~0.123E1, 0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28290000000000006E1 (~0.123E1, 0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540957E2 (~0.123E1, 0.123E2, 0.123): ~0.15006E2 ~0.15006000000000002E2 (~0.123E1, 0.123E2, 0.123E~2): ~0.1512777E2 ~0.15127770000000002E2 (~0.123E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505238E1 (~0.123E1, 0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.3987158963915445E1 (~0.123E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.20189399541483244 (~0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455805 (~0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.6061768477463671E1 (~0.123E1, 0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046258E1 (~0.123E1, 0.123E1, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E1, 0.123, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123E1, 0.123, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123E1, 0.123, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123E1, ~0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 inf (~0.123E1, ~0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 inf (~0.123E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219916E308 (~0.123E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.20673471050916621E308 (~0.123E1, ~0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.151604159265359E4 (~0.123E1, ~0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.15156182818284592E4 (~0.123E1, ~0.123E4, 0.123E1): 0.15141299999999999E4 0.151413E4 (~0.123E1, ~0.123E4, 0.123): 0.1513023E4 0.15130230000000001E4 (~0.123E1, ~0.123E4, 0.123E~2): 0.151290123E4 0.15129012300000002E4 (~0.123E1, ~0.123E4, ~0.123E4): 0.2829E3 0.2829000000000001E3 (~0.123E1, ~0.123E4, ~0.123E2): 0.15006E4 0.15006000000000001E4 (~0.123E1, ~0.123E2, ~0.123E2): 0.28289999999999997E1 0.28290000000000006E1 (~0.123E1, ~0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540957E2 (~0.123E1, ~0.123E2, ~0.123): 0.15006E2 0.15006000000000002E2 (~0.123E1, ~0.123E2, ~0.123E~2): 0.1512777E2 0.15127770000000002E2 (~0.123E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505238E1 (~0.123E1, ~0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.3987158963915445E1 (~0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.6061768477463671E1 (~0.123E1, ~0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046258E1 (~0.123E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.20189399541483244 (~0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455805 (~0.123E1, ~0.123E1, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E1, ~0.123, 0.123): 0.27429 0.27429000000000003 (~0.123E1, ~0.123, 0.123E~2): 0.15252 0.15252000000000002 (~0.123E1, ~0.123, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, 0.123E4, 0.123E2): ~0.13899E3 ~0.13898999999999998E3 (~0.123, 0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154094E3 (~0.123, 0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.15443159265358977E3 (~0.123, 0.123E4, ~0.123E1): ~0.15252E3 ~0.15251999999999998E3 (~0.123, 0.123E4, ~0.123): ~0.151413E3 ~0.15141299999999998E3 (~0.123, 0.123E2, 0.123E1): ~0.2829000000000001 ~0.28290000000000015 (~0.123, 0.123E2, ~0.123E~2): ~0.151413E1 ~0.15141300000000002E1 (~0.123, 0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046256 (~0.123, 0.123E1, 0.123): ~0.28289999999999996E~1 ~0.2829000000000001E~1 (~0.123, 0.123E1, ~0.123): ~0.27429 ~0.27429000000000003 (~0.123, 0.123E1, ~0.123E~2): ~0.15252 ~0.15252000000000002 (~0.123, 0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.123, 0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.123, ~0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.15443159265358977E3 (~0.123, ~0.123E4, 0.123E1): 0.15252E3 0.15251999999999998E3 (~0.123, ~0.123E4, 0.123): 0.151413E3 0.15141299999999998E3 (~0.123, ~0.123E4, ~0.123E2): 0.13899E3 0.13898999999999998E3 (~0.123, ~0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154094E3 (~0.123, ~0.123E2, 0.123E~2): 0.151413E1 0.15141300000000002E1 (~0.123, ~0.123E2, ~0.123E1): 0.2829000000000001 0.28290000000000015 (~0.123, ~0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046256 (~0.123, ~0.123E1, 0.123): 0.27429 0.27429000000000003 (~0.123, ~0.123E1, 0.123E~2): 0.15252 0.15252000000000002 (~0.123, ~0.123E1, ~0.123): 0.28289999999999996E~1 0.2829000000000001E~1 (~0.123, ~0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.123, ~0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 (~0.123E~2, 0.123E4, 0.123E1): ~0.2829 ~0.28289999999999993 (~0.123E~2, 0.123E4, 0.123E~2): ~0.151167E1 ~0.15116699999999998E1 (~0.123E~2, 0.123E4, ~0.123E1): ~0.27429E1 ~0.27428999999999997E1 (~0.123E~2, 0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359E~1 (~0.123E~2, 0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.2634158963915446E~2 (~0.123E~2, ~0.123E4, 0.123E1): 0.27429E1 0.27428999999999997E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.2829 0.28289999999999993 (~0.123E~2, ~0.123E4, ~0.123E~2): 0.151167E1 0.15116699999999998E1 (~0.123E~2, ~0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359E~1 (~0.123E~2, ~0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.2634158963915446E~2 (~0.11125369292536007E~307, 0.123, 0.5E~323): ~0.136842042298192E~308 ~0.1368420422981926E~308 (~0.11125369292536007E~307, 0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, 0.5E~323): 0.136842042298193E~308 0.1368420422981936E~308 (~0.11125369292536007E~307, ~0.123, ~0.5E~323): 0.136842042298192E~308 0.1368420422981926E~308 Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.17976931348623157E309, 0.17976931348623157E309) = false > (0.17976931348623157E309, 0.17976931348623157E309) = false == (0.17976931348623157E309, 0.17976931348623157E309) = true ?= (0.17976931348623157E309, 0.17976931348623157E309) = true < (0.17976931348623157E309, 0.8988465674311579E308) = false > (0.17976931348623157E309, 0.8988465674311579E308) = true == (0.17976931348623157E309, 0.8988465674311579E308) = false ?= (0.17976931348623157E309, 0.8988465674311579E308) = false < (0.17976931348623157E309, 0.123E4) = false > (0.17976931348623157E309, 0.123E4) = true == (0.17976931348623157E309, 0.123E4) = false ?= (0.17976931348623157E309, 0.123E4) = false < (0.17976931348623157E309, 0.123E2) = false > (0.17976931348623157E309, 0.123E2) = true == (0.17976931348623157E309, 0.123E2) = false ?= (0.17976931348623157E309, 0.123E2) = false < (0.17976931348623157E309, 0.3141592653589793E1) = false > (0.17976931348623157E309, 0.3141592653589793E1) = true == (0.17976931348623157E309, 0.3141592653589793E1) = false ?= (0.17976931348623157E309, 0.3141592653589793E1) = false < (0.17976931348623157E309, 0.2718281828459045E1) = false > (0.17976931348623157E309, 0.2718281828459045E1) = true == (0.17976931348623157E309, 0.2718281828459045E1) = false ?= (0.17976931348623157E309, 0.2718281828459045E1) = false < (0.17976931348623157E309, 0.123E1) = false > (0.17976931348623157E309, 0.123E1) = true == (0.17976931348623157E309, 0.123E1) = false ?= (0.17976931348623157E309, 0.123E1) = false < (0.17976931348623157E309, 0.123) = false > (0.17976931348623157E309, 0.123) = true == (0.17976931348623157E309, 0.123) = false ?= (0.17976931348623157E309, 0.123) = false < (0.17976931348623157E309, 0.123E~2) = false > (0.17976931348623157E309, 0.123E~2) = true == (0.17976931348623157E309, 0.123E~2) = false ?= (0.17976931348623157E309, 0.123E~2) = false < (0.17976931348623157E309, 0.22250738585072014E~307) = false > (0.17976931348623157E309, 0.22250738585072014E~307) = true == (0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (0.17976931348623157E309, 0.22250738585072014E~307) = false < (0.17976931348623157E309, 0.11125369292536007E~307) = false > (0.17976931348623157E309, 0.11125369292536007E~307) = true == (0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (0.17976931348623157E309, 0.11125369292536007E~307) = false < (0.17976931348623157E309, 0.5E~323) = false > (0.17976931348623157E309, 0.5E~323) = true == (0.17976931348623157E309, 0.5E~323) = false ?= (0.17976931348623157E309, 0.5E~323) = false < (0.17976931348623157E309, 0.0) = false > (0.17976931348623157E309, 0.0) = true == (0.17976931348623157E309, 0.0) = false ?= (0.17976931348623157E309, 0.0) = false < (0.17976931348623157E309, ~0.17976931348623157E309) = false > (0.17976931348623157E309, ~0.17976931348623157E309) = true == (0.17976931348623157E309, ~0.17976931348623157E309) = false ?= (0.17976931348623157E309, ~0.17976931348623157E309) = false < (0.17976931348623157E309, ~0.8988465674311579E308) = false > (0.17976931348623157E309, ~0.8988465674311579E308) = true == (0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (0.17976931348623157E309, ~0.8988465674311579E308) = false < (0.17976931348623157E309, ~0.123E4) = false > (0.17976931348623157E309, ~0.123E4) = true == (0.17976931348623157E309, ~0.123E4) = false ?= (0.17976931348623157E309, ~0.123E4) = false < (0.17976931348623157E309, ~0.123E2) = false > (0.17976931348623157E309, ~0.123E2) = true == (0.17976931348623157E309, ~0.123E2) = false ?= (0.17976931348623157E309, ~0.123E2) = false < (0.17976931348623157E309, ~0.3141592653589793E1) = false > (0.17976931348623157E309, ~0.3141592653589793E1) = true == (0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (0.17976931348623157E309, ~0.3141592653589793E1) = false < (0.17976931348623157E309, ~0.2718281828459045E1) = false > (0.17976931348623157E309, ~0.2718281828459045E1) = true == (0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (0.17976931348623157E309, ~0.2718281828459045E1) = false < (0.17976931348623157E309, ~0.123E1) = false > (0.17976931348623157E309, ~0.123E1) = true == (0.17976931348623157E309, ~0.123E1) = false ?= (0.17976931348623157E309, ~0.123E1) = false < (0.17976931348623157E309, ~0.123) = false > (0.17976931348623157E309, ~0.123) = true == (0.17976931348623157E309, ~0.123) = false ?= (0.17976931348623157E309, ~0.123) = false < (0.17976931348623157E309, ~0.123E~2) = false > (0.17976931348623157E309, ~0.123E~2) = true == (0.17976931348623157E309, ~0.123E~2) = false ?= (0.17976931348623157E309, ~0.123E~2) = false < (0.17976931348623157E309, ~0.22250738585072014E~307) = false > (0.17976931348623157E309, ~0.22250738585072014E~307) = true == (0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (0.17976931348623157E309, ~0.22250738585072014E~307) = false < (0.17976931348623157E309, ~0.11125369292536007E~307) = false > (0.17976931348623157E309, ~0.11125369292536007E~307) = true == (0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (0.17976931348623157E309, ~0.11125369292536007E~307) = false < (0.17976931348623157E309, ~0.5E~323) = false > (0.17976931348623157E309, ~0.5E~323) = true == (0.17976931348623157E309, ~0.5E~323) = false ?= (0.17976931348623157E309, ~0.5E~323) = false < (0.17976931348623157E309, ~0.0) = false > (0.17976931348623157E309, ~0.0) = true == (0.17976931348623157E309, ~0.0) = false ?= (0.17976931348623157E309, ~0.0) = false < (0.8988465674311579E308, 0.17976931348623157E309) = true > (0.8988465674311579E308, 0.17976931348623157E309) = false == (0.8988465674311579E308, 0.17976931348623157E309) = false ?= (0.8988465674311579E308, 0.17976931348623157E309) = false < (0.8988465674311579E308, 0.8988465674311579E308) = false > (0.8988465674311579E308, 0.8988465674311579E308) = false == (0.8988465674311579E308, 0.8988465674311579E308) = true ?= (0.8988465674311579E308, 0.8988465674311579E308) = true < (0.8988465674311579E308, 0.123E4) = false > (0.8988465674311579E308, 0.123E4) = true == (0.8988465674311579E308, 0.123E4) = false ?= (0.8988465674311579E308, 0.123E4) = false < (0.8988465674311579E308, 0.123E2) = false > (0.8988465674311579E308, 0.123E2) = true == (0.8988465674311579E308, 0.123E2) = false ?= (0.8988465674311579E308, 0.123E2) = false < (0.8988465674311579E308, 0.3141592653589793E1) = false > (0.8988465674311579E308, 0.3141592653589793E1) = true == (0.8988465674311579E308, 0.3141592653589793E1) = false ?= (0.8988465674311579E308, 0.3141592653589793E1) = false < (0.8988465674311579E308, 0.2718281828459045E1) = false > (0.8988465674311579E308, 0.2718281828459045E1) = true == (0.8988465674311579E308, 0.2718281828459045E1) = false ?= (0.8988465674311579E308, 0.2718281828459045E1) = false < (0.8988465674311579E308, 0.123E1) = false > (0.8988465674311579E308, 0.123E1) = true == (0.8988465674311579E308, 0.123E1) = false ?= (0.8988465674311579E308, 0.123E1) = false < (0.8988465674311579E308, 0.123) = false > (0.8988465674311579E308, 0.123) = true == (0.8988465674311579E308, 0.123) = false ?= (0.8988465674311579E308, 0.123) = false < (0.8988465674311579E308, 0.123E~2) = false > (0.8988465674311579E308, 0.123E~2) = true == (0.8988465674311579E308, 0.123E~2) = false ?= (0.8988465674311579E308, 0.123E~2) = false < (0.8988465674311579E308, 0.22250738585072014E~307) = false > (0.8988465674311579E308, 0.22250738585072014E~307) = true == (0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (0.8988465674311579E308, 0.22250738585072014E~307) = false < (0.8988465674311579E308, 0.11125369292536007E~307) = false > (0.8988465674311579E308, 0.11125369292536007E~307) = true == (0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (0.8988465674311579E308, 0.11125369292536007E~307) = false < (0.8988465674311579E308, 0.5E~323) = false > (0.8988465674311579E308, 0.5E~323) = true == (0.8988465674311579E308, 0.5E~323) = false ?= (0.8988465674311579E308, 0.5E~323) = false < (0.8988465674311579E308, 0.0) = false > (0.8988465674311579E308, 0.0) = true == (0.8988465674311579E308, 0.0) = false ?= (0.8988465674311579E308, 0.0) = false < (0.8988465674311579E308, ~0.17976931348623157E309) = false > (0.8988465674311579E308, ~0.17976931348623157E309) = true == (0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (0.8988465674311579E308, ~0.17976931348623157E309) = false < (0.8988465674311579E308, ~0.8988465674311579E308) = false > (0.8988465674311579E308, ~0.8988465674311579E308) = true == (0.8988465674311579E308, ~0.8988465674311579E308) = false ?= (0.8988465674311579E308, ~0.8988465674311579E308) = false < (0.8988465674311579E308, ~0.123E4) = false > (0.8988465674311579E308, ~0.123E4) = true == (0.8988465674311579E308, ~0.123E4) = false ?= (0.8988465674311579E308, ~0.123E4) = false < (0.8988465674311579E308, ~0.123E2) = false > (0.8988465674311579E308, ~0.123E2) = true == (0.8988465674311579E308, ~0.123E2) = false ?= (0.8988465674311579E308, ~0.123E2) = false < (0.8988465674311579E308, ~0.3141592653589793E1) = false > (0.8988465674311579E308, ~0.3141592653589793E1) = true == (0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (0.8988465674311579E308, ~0.3141592653589793E1) = false < (0.8988465674311579E308, ~0.2718281828459045E1) = false > (0.8988465674311579E308, ~0.2718281828459045E1) = true == (0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (0.8988465674311579E308, ~0.2718281828459045E1) = false < (0.8988465674311579E308, ~0.123E1) = false > (0.8988465674311579E308, ~0.123E1) = true == (0.8988465674311579E308, ~0.123E1) = false ?= (0.8988465674311579E308, ~0.123E1) = false < (0.8988465674311579E308, ~0.123) = false > (0.8988465674311579E308, ~0.123) = true == (0.8988465674311579E308, ~0.123) = false ?= (0.8988465674311579E308, ~0.123) = false < (0.8988465674311579E308, ~0.123E~2) = false > (0.8988465674311579E308, ~0.123E~2) = true == (0.8988465674311579E308, ~0.123E~2) = false ?= (0.8988465674311579E308, ~0.123E~2) = false < (0.8988465674311579E308, ~0.22250738585072014E~307) = false > (0.8988465674311579E308, ~0.22250738585072014E~307) = true == (0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (0.8988465674311579E308, ~0.22250738585072014E~307) = false < (0.8988465674311579E308, ~0.11125369292536007E~307) = false > (0.8988465674311579E308, ~0.11125369292536007E~307) = true == (0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (0.8988465674311579E308, ~0.11125369292536007E~307) = false < (0.8988465674311579E308, ~0.5E~323) = false > (0.8988465674311579E308, ~0.5E~323) = true == (0.8988465674311579E308, ~0.5E~323) = false ?= (0.8988465674311579E308, ~0.5E~323) = false < (0.8988465674311579E308, ~0.0) = false > (0.8988465674311579E308, ~0.0) = true == (0.8988465674311579E308, ~0.0) = false ?= (0.8988465674311579E308, ~0.0) = false < (0.123E4, 0.17976931348623157E309) = true > (0.123E4, 0.17976931348623157E309) = false == (0.123E4, 0.17976931348623157E309) = false ?= (0.123E4, 0.17976931348623157E309) = false < (0.123E4, 0.8988465674311579E308) = true > (0.123E4, 0.8988465674311579E308) = false == (0.123E4, 0.8988465674311579E308) = false ?= (0.123E4, 0.8988465674311579E308) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.3141592653589793E1) = false > (0.123E4, 0.3141592653589793E1) = true == (0.123E4, 0.3141592653589793E1) = false ?= (0.123E4, 0.3141592653589793E1) = false < (0.123E4, 0.2718281828459045E1) = false > (0.123E4, 0.2718281828459045E1) = true == (0.123E4, 0.2718281828459045E1) = false ?= (0.123E4, 0.2718281828459045E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.22250738585072014E~307) = false > (0.123E4, 0.22250738585072014E~307) = true == (0.123E4, 0.22250738585072014E~307) = false ?= (0.123E4, 0.22250738585072014E~307) = false < (0.123E4, 0.11125369292536007E~307) = false > (0.123E4, 0.11125369292536007E~307) = true == (0.123E4, 0.11125369292536007E~307) = false ?= (0.123E4, 0.11125369292536007E~307) = false < (0.123E4, 0.5E~323) = false > (0.123E4, 0.5E~323) = true == (0.123E4, 0.5E~323) = false ?= (0.123E4, 0.5E~323) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.17976931348623157E309) = false > (0.123E4, ~0.17976931348623157E309) = true == (0.123E4, ~0.17976931348623157E309) = false ?= (0.123E4, ~0.17976931348623157E309) = false < (0.123E4, ~0.8988465674311579E308) = false > (0.123E4, ~0.8988465674311579E308) = true == (0.123E4, ~0.8988465674311579E308) = false ?= (0.123E4, ~0.8988465674311579E308) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.3141592653589793E1) = false > (0.123E4, ~0.3141592653589793E1) = true == (0.123E4, ~0.3141592653589793E1) = false ?= (0.123E4, ~0.3141592653589793E1) = false < (0.123E4, ~0.2718281828459045E1) = false > (0.123E4, ~0.2718281828459045E1) = true == (0.123E4, ~0.2718281828459045E1) = false ?= (0.123E4, ~0.2718281828459045E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.22250738585072014E~307) = false > (0.123E4, ~0.22250738585072014E~307) = true == (0.123E4, ~0.22250738585072014E~307) = false ?= (0.123E4, ~0.22250738585072014E~307) = false < (0.123E4, ~0.11125369292536007E~307) = false > (0.123E4, ~0.11125369292536007E~307) = true == (0.123E4, ~0.11125369292536007E~307) = false ?= (0.123E4, ~0.11125369292536007E~307) = false < (0.123E4, ~0.5E~323) = false > (0.123E4, ~0.5E~323) = true == (0.123E4, ~0.5E~323) = false ?= (0.123E4, ~0.5E~323) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.17976931348623157E309) = true > (0.123E2, 0.17976931348623157E309) = false == (0.123E2, 0.17976931348623157E309) = false ?= (0.123E2, 0.17976931348623157E309) = false < (0.123E2, 0.8988465674311579E308) = true > (0.123E2, 0.8988465674311579E308) = false == (0.123E2, 0.8988465674311579E308) = false ?= (0.123E2, 0.8988465674311579E308) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.3141592653589793E1) = false > (0.123E2, 0.3141592653589793E1) = true == (0.123E2, 0.3141592653589793E1) = false ?= (0.123E2, 0.3141592653589793E1) = false < (0.123E2, 0.2718281828459045E1) = false > (0.123E2, 0.2718281828459045E1) = true == (0.123E2, 0.2718281828459045E1) = false ?= (0.123E2, 0.2718281828459045E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.22250738585072014E~307) = false > (0.123E2, 0.22250738585072014E~307) = true == (0.123E2, 0.22250738585072014E~307) = false ?= (0.123E2, 0.22250738585072014E~307) = false < (0.123E2, 0.11125369292536007E~307) = false > (0.123E2, 0.11125369292536007E~307) = true == (0.123E2, 0.11125369292536007E~307) = false ?= (0.123E2, 0.11125369292536007E~307) = false < (0.123E2, 0.5E~323) = false > (0.123E2, 0.5E~323) = true == (0.123E2, 0.5E~323) = false ?= (0.123E2, 0.5E~323) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.17976931348623157E309) = false > (0.123E2, ~0.17976931348623157E309) = true == (0.123E2, ~0.17976931348623157E309) = false ?= (0.123E2, ~0.17976931348623157E309) = false < (0.123E2, ~0.8988465674311579E308) = false > (0.123E2, ~0.8988465674311579E308) = true == (0.123E2, ~0.8988465674311579E308) = false ?= (0.123E2, ~0.8988465674311579E308) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.3141592653589793E1) = false > (0.123E2, ~0.3141592653589793E1) = true == (0.123E2, ~0.3141592653589793E1) = false ?= (0.123E2, ~0.3141592653589793E1) = false < (0.123E2, ~0.2718281828459045E1) = false > (0.123E2, ~0.2718281828459045E1) = true == (0.123E2, ~0.2718281828459045E1) = false ?= (0.123E2, ~0.2718281828459045E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.22250738585072014E~307) = false > (0.123E2, ~0.22250738585072014E~307) = true == (0.123E2, ~0.22250738585072014E~307) = false ?= (0.123E2, ~0.22250738585072014E~307) = false < (0.123E2, ~0.11125369292536007E~307) = false > (0.123E2, ~0.11125369292536007E~307) = true == (0.123E2, ~0.11125369292536007E~307) = false ?= (0.123E2, ~0.11125369292536007E~307) = false < (0.123E2, ~0.5E~323) = false > (0.123E2, ~0.5E~323) = true == (0.123E2, ~0.5E~323) = false ?= (0.123E2, ~0.5E~323) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.3141592653589793E1, 0.17976931348623157E309) = true > (0.3141592653589793E1, 0.17976931348623157E309) = false == (0.3141592653589793E1, 0.17976931348623157E309) = false ?= (0.3141592653589793E1, 0.17976931348623157E309) = false < (0.3141592653589793E1, 0.8988465674311579E308) = true > (0.3141592653589793E1, 0.8988465674311579E308) = false == (0.3141592653589793E1, 0.8988465674311579E308) = false ?= (0.3141592653589793E1, 0.8988465674311579E308) = false < (0.3141592653589793E1, 0.123E4) = true > (0.3141592653589793E1, 0.123E4) = false == (0.3141592653589793E1, 0.123E4) = false ?= (0.3141592653589793E1, 0.123E4) = false < (0.3141592653589793E1, 0.123E2) = true > (0.3141592653589793E1, 0.123E2) = false == (0.3141592653589793E1, 0.123E2) = false ?= (0.3141592653589793E1, 0.123E2) = false < (0.3141592653589793E1, 0.3141592653589793E1) = false > (0.3141592653589793E1, 0.3141592653589793E1) = false == (0.3141592653589793E1, 0.3141592653589793E1) = true ?= (0.3141592653589793E1, 0.3141592653589793E1) = true < (0.3141592653589793E1, 0.2718281828459045E1) = false > (0.3141592653589793E1, 0.2718281828459045E1) = true == (0.3141592653589793E1, 0.2718281828459045E1) = false ?= (0.3141592653589793E1, 0.2718281828459045E1) = false < (0.3141592653589793E1, 0.123E1) = false > (0.3141592653589793E1, 0.123E1) = true == (0.3141592653589793E1, 0.123E1) = false ?= (0.3141592653589793E1, 0.123E1) = false < (0.3141592653589793E1, 0.123) = false > (0.3141592653589793E1, 0.123) = true == (0.3141592653589793E1, 0.123) = false ?= (0.3141592653589793E1, 0.123) = false < (0.3141592653589793E1, 0.123E~2) = false > (0.3141592653589793E1, 0.123E~2) = true == (0.3141592653589793E1, 0.123E~2) = false ?= (0.3141592653589793E1, 0.123E~2) = false < (0.3141592653589793E1, 0.22250738585072014E~307) = false > (0.3141592653589793E1, 0.22250738585072014E~307) = true == (0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (0.3141592653589793E1, 0.22250738585072014E~307) = false < (0.3141592653589793E1, 0.11125369292536007E~307) = false > (0.3141592653589793E1, 0.11125369292536007E~307) = true == (0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (0.3141592653589793E1, 0.11125369292536007E~307) = false < (0.3141592653589793E1, 0.5E~323) = false > (0.3141592653589793E1, 0.5E~323) = true == (0.3141592653589793E1, 0.5E~323) = false ?= (0.3141592653589793E1, 0.5E~323) = false < (0.3141592653589793E1, 0.0) = false > (0.3141592653589793E1, 0.0) = true == (0.3141592653589793E1, 0.0) = false ?= (0.3141592653589793E1, 0.0) = false < (0.3141592653589793E1, ~0.17976931348623157E309) = false > (0.3141592653589793E1, ~0.17976931348623157E309) = true == (0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (0.3141592653589793E1, ~0.17976931348623157E309) = false < (0.3141592653589793E1, ~0.8988465674311579E308) = false > (0.3141592653589793E1, ~0.8988465674311579E308) = true == (0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (0.3141592653589793E1, ~0.8988465674311579E308) = false < (0.3141592653589793E1, ~0.123E4) = false > (0.3141592653589793E1, ~0.123E4) = true == (0.3141592653589793E1, ~0.123E4) = false ?= (0.3141592653589793E1, ~0.123E4) = false < (0.3141592653589793E1, ~0.123E2) = false > (0.3141592653589793E1, ~0.123E2) = true == (0.3141592653589793E1, ~0.123E2) = false ?= (0.3141592653589793E1, ~0.123E2) = false < (0.3141592653589793E1, ~0.3141592653589793E1) = false > (0.3141592653589793E1, ~0.3141592653589793E1) = true == (0.3141592653589793E1, ~0.3141592653589793E1) = false ?= (0.3141592653589793E1, ~0.3141592653589793E1) = false < (0.3141592653589793E1, ~0.2718281828459045E1) = false > (0.3141592653589793E1, ~0.2718281828459045E1) = true == (0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (0.3141592653589793E1, ~0.2718281828459045E1) = false < (0.3141592653589793E1, ~0.123E1) = false > (0.3141592653589793E1, ~0.123E1) = true == (0.3141592653589793E1, ~0.123E1) = false ?= (0.3141592653589793E1, ~0.123E1) = false < (0.3141592653589793E1, ~0.123) = false > (0.3141592653589793E1, ~0.123) = true == (0.3141592653589793E1, ~0.123) = false ?= (0.3141592653589793E1, ~0.123) = false < (0.3141592653589793E1, ~0.123E~2) = false > (0.3141592653589793E1, ~0.123E~2) = true == (0.3141592653589793E1, ~0.123E~2) = false ?= (0.3141592653589793E1, ~0.123E~2) = false < (0.3141592653589793E1, ~0.22250738585072014E~307) = false > (0.3141592653589793E1, ~0.22250738585072014E~307) = true == (0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (0.3141592653589793E1, ~0.22250738585072014E~307) = false < (0.3141592653589793E1, ~0.11125369292536007E~307) = false > (0.3141592653589793E1, ~0.11125369292536007E~307) = true == (0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (0.3141592653589793E1, ~0.11125369292536007E~307) = false < (0.3141592653589793E1, ~0.5E~323) = false > (0.3141592653589793E1, ~0.5E~323) = true == (0.3141592653589793E1, ~0.5E~323) = false ?= (0.3141592653589793E1, ~0.5E~323) = false < (0.3141592653589793E1, ~0.0) = false > (0.3141592653589793E1, ~0.0) = true == (0.3141592653589793E1, ~0.0) = false ?= (0.3141592653589793E1, ~0.0) = false < (0.2718281828459045E1, 0.17976931348623157E309) = true > (0.2718281828459045E1, 0.17976931348623157E309) = false == (0.2718281828459045E1, 0.17976931348623157E309) = false ?= (0.2718281828459045E1, 0.17976931348623157E309) = false < (0.2718281828459045E1, 0.8988465674311579E308) = true > (0.2718281828459045E1, 0.8988465674311579E308) = false == (0.2718281828459045E1, 0.8988465674311579E308) = false ?= (0.2718281828459045E1, 0.8988465674311579E308) = false < (0.2718281828459045E1, 0.123E4) = true > (0.2718281828459045E1, 0.123E4) = false == (0.2718281828459045E1, 0.123E4) = false ?= (0.2718281828459045E1, 0.123E4) = false < (0.2718281828459045E1, 0.123E2) = true > (0.2718281828459045E1, 0.123E2) = false == (0.2718281828459045E1, 0.123E2) = false ?= (0.2718281828459045E1, 0.123E2) = false < (0.2718281828459045E1, 0.3141592653589793E1) = true > (0.2718281828459045E1, 0.3141592653589793E1) = false == (0.2718281828459045E1, 0.3141592653589793E1) = false ?= (0.2718281828459045E1, 0.3141592653589793E1) = false < (0.2718281828459045E1, 0.2718281828459045E1) = false > (0.2718281828459045E1, 0.2718281828459045E1) = false == (0.2718281828459045E1, 0.2718281828459045E1) = true ?= (0.2718281828459045E1, 0.2718281828459045E1) = true < (0.2718281828459045E1, 0.123E1) = false > (0.2718281828459045E1, 0.123E1) = true == (0.2718281828459045E1, 0.123E1) = false ?= (0.2718281828459045E1, 0.123E1) = false < (0.2718281828459045E1, 0.123) = false > (0.2718281828459045E1, 0.123) = true == (0.2718281828459045E1, 0.123) = false ?= (0.2718281828459045E1, 0.123) = false < (0.2718281828459045E1, 0.123E~2) = false > (0.2718281828459045E1, 0.123E~2) = true == (0.2718281828459045E1, 0.123E~2) = false ?= (0.2718281828459045E1, 0.123E~2) = false < (0.2718281828459045E1, 0.22250738585072014E~307) = false > (0.2718281828459045E1, 0.22250738585072014E~307) = true == (0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (0.2718281828459045E1, 0.22250738585072014E~307) = false < (0.2718281828459045E1, 0.11125369292536007E~307) = false > (0.2718281828459045E1, 0.11125369292536007E~307) = true == (0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (0.2718281828459045E1, 0.11125369292536007E~307) = false < (0.2718281828459045E1, 0.5E~323) = false > (0.2718281828459045E1, 0.5E~323) = true == (0.2718281828459045E1, 0.5E~323) = false ?= (0.2718281828459045E1, 0.5E~323) = false < (0.2718281828459045E1, 0.0) = false > (0.2718281828459045E1, 0.0) = true == (0.2718281828459045E1, 0.0) = false ?= (0.2718281828459045E1, 0.0) = false < (0.2718281828459045E1, ~0.17976931348623157E309) = false > (0.2718281828459045E1, ~0.17976931348623157E309) = true == (0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (0.2718281828459045E1, ~0.17976931348623157E309) = false < (0.2718281828459045E1, ~0.8988465674311579E308) = false > (0.2718281828459045E1, ~0.8988465674311579E308) = true == (0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (0.2718281828459045E1, ~0.8988465674311579E308) = false < (0.2718281828459045E1, ~0.123E4) = false > (0.2718281828459045E1, ~0.123E4) = true == (0.2718281828459045E1, ~0.123E4) = false ?= (0.2718281828459045E1, ~0.123E4) = false < (0.2718281828459045E1, ~0.123E2) = false > (0.2718281828459045E1, ~0.123E2) = true == (0.2718281828459045E1, ~0.123E2) = false ?= (0.2718281828459045E1, ~0.123E2) = false < (0.2718281828459045E1, ~0.3141592653589793E1) = false > (0.2718281828459045E1, ~0.3141592653589793E1) = true == (0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (0.2718281828459045E1, ~0.3141592653589793E1) = false < (0.2718281828459045E1, ~0.2718281828459045E1) = false > (0.2718281828459045E1, ~0.2718281828459045E1) = true == (0.2718281828459045E1, ~0.2718281828459045E1) = false ?= (0.2718281828459045E1, ~0.2718281828459045E1) = false < (0.2718281828459045E1, ~0.123E1) = false > (0.2718281828459045E1, ~0.123E1) = true == (0.2718281828459045E1, ~0.123E1) = false ?= (0.2718281828459045E1, ~0.123E1) = false < (0.2718281828459045E1, ~0.123) = false > (0.2718281828459045E1, ~0.123) = true == (0.2718281828459045E1, ~0.123) = false ?= (0.2718281828459045E1, ~0.123) = false < (0.2718281828459045E1, ~0.123E~2) = false > (0.2718281828459045E1, ~0.123E~2) = true == (0.2718281828459045E1, ~0.123E~2) = false ?= (0.2718281828459045E1, ~0.123E~2) = false < (0.2718281828459045E1, ~0.22250738585072014E~307) = false > (0.2718281828459045E1, ~0.22250738585072014E~307) = true == (0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (0.2718281828459045E1, ~0.22250738585072014E~307) = false < (0.2718281828459045E1, ~0.11125369292536007E~307) = false > (0.2718281828459045E1, ~0.11125369292536007E~307) = true == (0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (0.2718281828459045E1, ~0.11125369292536007E~307) = false < (0.2718281828459045E1, ~0.5E~323) = false > (0.2718281828459045E1, ~0.5E~323) = true == (0.2718281828459045E1, ~0.5E~323) = false ?= (0.2718281828459045E1, ~0.5E~323) = false < (0.2718281828459045E1, ~0.0) = false > (0.2718281828459045E1, ~0.0) = true == (0.2718281828459045E1, ~0.0) = false ?= (0.2718281828459045E1, ~0.0) = false < (0.123E1, 0.17976931348623157E309) = true > (0.123E1, 0.17976931348623157E309) = false == (0.123E1, 0.17976931348623157E309) = false ?= (0.123E1, 0.17976931348623157E309) = false < (0.123E1, 0.8988465674311579E308) = true > (0.123E1, 0.8988465674311579E308) = false == (0.123E1, 0.8988465674311579E308) = false ?= (0.123E1, 0.8988465674311579E308) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.3141592653589793E1) = true > (0.123E1, 0.3141592653589793E1) = false == (0.123E1, 0.3141592653589793E1) = false ?= (0.123E1, 0.3141592653589793E1) = false < (0.123E1, 0.2718281828459045E1) = true > (0.123E1, 0.2718281828459045E1) = false == (0.123E1, 0.2718281828459045E1) = false ?= (0.123E1, 0.2718281828459045E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.22250738585072014E~307) = false > (0.123E1, 0.22250738585072014E~307) = true == (0.123E1, 0.22250738585072014E~307) = false ?= (0.123E1, 0.22250738585072014E~307) = false < (0.123E1, 0.11125369292536007E~307) = false > (0.123E1, 0.11125369292536007E~307) = true == (0.123E1, 0.11125369292536007E~307) = false ?= (0.123E1, 0.11125369292536007E~307) = false < (0.123E1, 0.5E~323) = false > (0.123E1, 0.5E~323) = true == (0.123E1, 0.5E~323) = false ?= (0.123E1, 0.5E~323) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.17976931348623157E309) = false > (0.123E1, ~0.17976931348623157E309) = true == (0.123E1, ~0.17976931348623157E309) = false ?= (0.123E1, ~0.17976931348623157E309) = false < (0.123E1, ~0.8988465674311579E308) = false > (0.123E1, ~0.8988465674311579E308) = true == (0.123E1, ~0.8988465674311579E308) = false ?= (0.123E1, ~0.8988465674311579E308) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.3141592653589793E1) = false > (0.123E1, ~0.3141592653589793E1) = true == (0.123E1, ~0.3141592653589793E1) = false ?= (0.123E1, ~0.3141592653589793E1) = false < (0.123E1, ~0.2718281828459045E1) = false > (0.123E1, ~0.2718281828459045E1) = true == (0.123E1, ~0.2718281828459045E1) = false ?= (0.123E1, ~0.2718281828459045E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.22250738585072014E~307) = false > (0.123E1, ~0.22250738585072014E~307) = true == (0.123E1, ~0.22250738585072014E~307) = false ?= (0.123E1, ~0.22250738585072014E~307) = false < (0.123E1, ~0.11125369292536007E~307) = false > (0.123E1, ~0.11125369292536007E~307) = true == (0.123E1, ~0.11125369292536007E~307) = false ?= (0.123E1, ~0.11125369292536007E~307) = false < (0.123E1, ~0.5E~323) = false > (0.123E1, ~0.5E~323) = true == (0.123E1, ~0.5E~323) = false ?= (0.123E1, ~0.5E~323) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.17976931348623157E309) = true > (0.123, 0.17976931348623157E309) = false == (0.123, 0.17976931348623157E309) = false ?= (0.123, 0.17976931348623157E309) = false < (0.123, 0.8988465674311579E308) = true > (0.123, 0.8988465674311579E308) = false == (0.123, 0.8988465674311579E308) = false ?= (0.123, 0.8988465674311579E308) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.3141592653589793E1) = true > (0.123, 0.3141592653589793E1) = false == (0.123, 0.3141592653589793E1) = false ?= (0.123, 0.3141592653589793E1) = false < (0.123, 0.2718281828459045E1) = true > (0.123, 0.2718281828459045E1) = false == (0.123, 0.2718281828459045E1) = false ?= (0.123, 0.2718281828459045E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.22250738585072014E~307) = false > (0.123, 0.22250738585072014E~307) = true == (0.123, 0.22250738585072014E~307) = false ?= (0.123, 0.22250738585072014E~307) = false < (0.123, 0.11125369292536007E~307) = false > (0.123, 0.11125369292536007E~307) = true == (0.123, 0.11125369292536007E~307) = false ?= (0.123, 0.11125369292536007E~307) = false < (0.123, 0.5E~323) = false > (0.123, 0.5E~323) = true == (0.123, 0.5E~323) = false ?= (0.123, 0.5E~323) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.17976931348623157E309) = false > (0.123, ~0.17976931348623157E309) = true == (0.123, ~0.17976931348623157E309) = false ?= (0.123, ~0.17976931348623157E309) = false < (0.123, ~0.8988465674311579E308) = false > (0.123, ~0.8988465674311579E308) = true == (0.123, ~0.8988465674311579E308) = false ?= (0.123, ~0.8988465674311579E308) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.3141592653589793E1) = false > (0.123, ~0.3141592653589793E1) = true == (0.123, ~0.3141592653589793E1) = false ?= (0.123, ~0.3141592653589793E1) = false < (0.123, ~0.2718281828459045E1) = false > (0.123, ~0.2718281828459045E1) = true == (0.123, ~0.2718281828459045E1) = false ?= (0.123, ~0.2718281828459045E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.22250738585072014E~307) = false > (0.123, ~0.22250738585072014E~307) = true == (0.123, ~0.22250738585072014E~307) = false ?= (0.123, ~0.22250738585072014E~307) = false < (0.123, ~0.11125369292536007E~307) = false > (0.123, ~0.11125369292536007E~307) = true == (0.123, ~0.11125369292536007E~307) = false ?= (0.123, ~0.11125369292536007E~307) = false < (0.123, ~0.5E~323) = false > (0.123, ~0.5E~323) = true == (0.123, ~0.5E~323) = false ?= (0.123, ~0.5E~323) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.17976931348623157E309) = true > (0.123E~2, 0.17976931348623157E309) = false == (0.123E~2, 0.17976931348623157E309) = false ?= (0.123E~2, 0.17976931348623157E309) = false < (0.123E~2, 0.8988465674311579E308) = true > (0.123E~2, 0.8988465674311579E308) = false == (0.123E~2, 0.8988465674311579E308) = false ?= (0.123E~2, 0.8988465674311579E308) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.3141592653589793E1) = true > (0.123E~2, 0.3141592653589793E1) = false == (0.123E~2, 0.3141592653589793E1) = false ?= (0.123E~2, 0.3141592653589793E1) = false < (0.123E~2, 0.2718281828459045E1) = true > (0.123E~2, 0.2718281828459045E1) = false == (0.123E~2, 0.2718281828459045E1) = false ?= (0.123E~2, 0.2718281828459045E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.22250738585072014E~307) = false > (0.123E~2, 0.22250738585072014E~307) = true == (0.123E~2, 0.22250738585072014E~307) = false ?= (0.123E~2, 0.22250738585072014E~307) = false < (0.123E~2, 0.11125369292536007E~307) = false > (0.123E~2, 0.11125369292536007E~307) = true == (0.123E~2, 0.11125369292536007E~307) = false ?= (0.123E~2, 0.11125369292536007E~307) = false < (0.123E~2, 0.5E~323) = false > (0.123E~2, 0.5E~323) = true == (0.123E~2, 0.5E~323) = false ?= (0.123E~2, 0.5E~323) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.17976931348623157E309) = false > (0.123E~2, ~0.17976931348623157E309) = true == (0.123E~2, ~0.17976931348623157E309) = false ?= (0.123E~2, ~0.17976931348623157E309) = false < (0.123E~2, ~0.8988465674311579E308) = false > (0.123E~2, ~0.8988465674311579E308) = true == (0.123E~2, ~0.8988465674311579E308) = false ?= (0.123E~2, ~0.8988465674311579E308) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.3141592653589793E1) = false > (0.123E~2, ~0.3141592653589793E1) = true == (0.123E~2, ~0.3141592653589793E1) = false ?= (0.123E~2, ~0.3141592653589793E1) = false < (0.123E~2, ~0.2718281828459045E1) = false > (0.123E~2, ~0.2718281828459045E1) = true == (0.123E~2, ~0.2718281828459045E1) = false ?= (0.123E~2, ~0.2718281828459045E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.22250738585072014E~307) = false > (0.123E~2, ~0.22250738585072014E~307) = true == (0.123E~2, ~0.22250738585072014E~307) = false ?= (0.123E~2, ~0.22250738585072014E~307) = false < (0.123E~2, ~0.11125369292536007E~307) = false > (0.123E~2, ~0.11125369292536007E~307) = true == (0.123E~2, ~0.11125369292536007E~307) = false ?= (0.123E~2, ~0.11125369292536007E~307) = false < (0.123E~2, ~0.5E~323) = false > (0.123E~2, ~0.5E~323) = true == (0.123E~2, ~0.5E~323) = false ?= (0.123E~2, ~0.5E~323) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.22250738585072014E~307, 0.17976931348623157E309) = true > (0.22250738585072014E~307, 0.17976931348623157E309) = false == (0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (0.22250738585072014E~307, 0.17976931348623157E309) = false < (0.22250738585072014E~307, 0.8988465674311579E308) = true > (0.22250738585072014E~307, 0.8988465674311579E308) = false == (0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (0.22250738585072014E~307, 0.8988465674311579E308) = false < (0.22250738585072014E~307, 0.123E4) = true > (0.22250738585072014E~307, 0.123E4) = false == (0.22250738585072014E~307, 0.123E4) = false ?= (0.22250738585072014E~307, 0.123E4) = false < (0.22250738585072014E~307, 0.123E2) = true > (0.22250738585072014E~307, 0.123E2) = false == (0.22250738585072014E~307, 0.123E2) = false ?= (0.22250738585072014E~307, 0.123E2) = false < (0.22250738585072014E~307, 0.3141592653589793E1) = true > (0.22250738585072014E~307, 0.3141592653589793E1) = false == (0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (0.22250738585072014E~307, 0.3141592653589793E1) = false < (0.22250738585072014E~307, 0.2718281828459045E1) = true > (0.22250738585072014E~307, 0.2718281828459045E1) = false == (0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (0.22250738585072014E~307, 0.2718281828459045E1) = false < (0.22250738585072014E~307, 0.123E1) = true > (0.22250738585072014E~307, 0.123E1) = false == (0.22250738585072014E~307, 0.123E1) = false ?= (0.22250738585072014E~307, 0.123E1) = false < (0.22250738585072014E~307, 0.123) = true > (0.22250738585072014E~307, 0.123) = false == (0.22250738585072014E~307, 0.123) = false ?= (0.22250738585072014E~307, 0.123) = false < (0.22250738585072014E~307, 0.123E~2) = true > (0.22250738585072014E~307, 0.123E~2) = false == (0.22250738585072014E~307, 0.123E~2) = false ?= (0.22250738585072014E~307, 0.123E~2) = false < (0.22250738585072014E~307, 0.22250738585072014E~307) = false > (0.22250738585072014E~307, 0.22250738585072014E~307) = false == (0.22250738585072014E~307, 0.22250738585072014E~307) = true ?= (0.22250738585072014E~307, 0.22250738585072014E~307) = true < (0.22250738585072014E~307, 0.11125369292536007E~307) = false > (0.22250738585072014E~307, 0.11125369292536007E~307) = true == (0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, 0.11125369292536007E~307) = false < (0.22250738585072014E~307, 0.5E~323) = false > (0.22250738585072014E~307, 0.5E~323) = true == (0.22250738585072014E~307, 0.5E~323) = false ?= (0.22250738585072014E~307, 0.5E~323) = false < (0.22250738585072014E~307, 0.0) = false > (0.22250738585072014E~307, 0.0) = true == (0.22250738585072014E~307, 0.0) = false ?= (0.22250738585072014E~307, 0.0) = false < (0.22250738585072014E~307, ~0.17976931348623157E309) = false > (0.22250738585072014E~307, ~0.17976931348623157E309) = true == (0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (0.22250738585072014E~307, ~0.17976931348623157E309) = false < (0.22250738585072014E~307, ~0.8988465674311579E308) = false > (0.22250738585072014E~307, ~0.8988465674311579E308) = true == (0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (0.22250738585072014E~307, ~0.8988465674311579E308) = false < (0.22250738585072014E~307, ~0.123E4) = false > (0.22250738585072014E~307, ~0.123E4) = true == (0.22250738585072014E~307, ~0.123E4) = false ?= (0.22250738585072014E~307, ~0.123E4) = false < (0.22250738585072014E~307, ~0.123E2) = false > (0.22250738585072014E~307, ~0.123E2) = true == (0.22250738585072014E~307, ~0.123E2) = false ?= (0.22250738585072014E~307, ~0.123E2) = false < (0.22250738585072014E~307, ~0.3141592653589793E1) = false > (0.22250738585072014E~307, ~0.3141592653589793E1) = true == (0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (0.22250738585072014E~307, ~0.3141592653589793E1) = false < (0.22250738585072014E~307, ~0.2718281828459045E1) = false > (0.22250738585072014E~307, ~0.2718281828459045E1) = true == (0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (0.22250738585072014E~307, ~0.2718281828459045E1) = false < (0.22250738585072014E~307, ~0.123E1) = false > (0.22250738585072014E~307, ~0.123E1) = true == (0.22250738585072014E~307, ~0.123E1) = false ?= (0.22250738585072014E~307, ~0.123E1) = false < (0.22250738585072014E~307, ~0.123) = false > (0.22250738585072014E~307, ~0.123) = true == (0.22250738585072014E~307, ~0.123) = false ?= (0.22250738585072014E~307, ~0.123) = false < (0.22250738585072014E~307, ~0.123E~2) = false > (0.22250738585072014E~307, ~0.123E~2) = true == (0.22250738585072014E~307, ~0.123E~2) = false ?= (0.22250738585072014E~307, ~0.123E~2) = false < (0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (0.22250738585072014E~307, ~0.22250738585072014E~307) = true == (0.22250738585072014E~307, ~0.22250738585072014E~307) = false ?= (0.22250738585072014E~307, ~0.22250738585072014E~307) = false < (0.22250738585072014E~307, ~0.11125369292536007E~307) = false > (0.22250738585072014E~307, ~0.11125369292536007E~307) = true == (0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (0.22250738585072014E~307, ~0.5E~323) = false > (0.22250738585072014E~307, ~0.5E~323) = true == (0.22250738585072014E~307, ~0.5E~323) = false ?= (0.22250738585072014E~307, ~0.5E~323) = false < (0.22250738585072014E~307, ~0.0) = false > (0.22250738585072014E~307, ~0.0) = true == (0.22250738585072014E~307, ~0.0) = false ?= (0.22250738585072014E~307, ~0.0) = false < (0.11125369292536007E~307, 0.17976931348623157E309) = true > (0.11125369292536007E~307, 0.17976931348623157E309) = false == (0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (0.11125369292536007E~307, 0.17976931348623157E309) = false < (0.11125369292536007E~307, 0.8988465674311579E308) = true > (0.11125369292536007E~307, 0.8988465674311579E308) = false == (0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (0.11125369292536007E~307, 0.8988465674311579E308) = false < (0.11125369292536007E~307, 0.123E4) = true > (0.11125369292536007E~307, 0.123E4) = false == (0.11125369292536007E~307, 0.123E4) = false ?= (0.11125369292536007E~307, 0.123E4) = false < (0.11125369292536007E~307, 0.123E2) = true > (0.11125369292536007E~307, 0.123E2) = false == (0.11125369292536007E~307, 0.123E2) = false ?= (0.11125369292536007E~307, 0.123E2) = false < (0.11125369292536007E~307, 0.3141592653589793E1) = true > (0.11125369292536007E~307, 0.3141592653589793E1) = false == (0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (0.11125369292536007E~307, 0.3141592653589793E1) = false < (0.11125369292536007E~307, 0.2718281828459045E1) = true > (0.11125369292536007E~307, 0.2718281828459045E1) = false == (0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (0.11125369292536007E~307, 0.2718281828459045E1) = false < (0.11125369292536007E~307, 0.123E1) = true > (0.11125369292536007E~307, 0.123E1) = false == (0.11125369292536007E~307, 0.123E1) = false ?= (0.11125369292536007E~307, 0.123E1) = false < (0.11125369292536007E~307, 0.123) = true > (0.11125369292536007E~307, 0.123) = false == (0.11125369292536007E~307, 0.123) = false ?= (0.11125369292536007E~307, 0.123) = false < (0.11125369292536007E~307, 0.123E~2) = true > (0.11125369292536007E~307, 0.123E~2) = false == (0.11125369292536007E~307, 0.123E~2) = false ?= (0.11125369292536007E~307, 0.123E~2) = false < (0.11125369292536007E~307, 0.22250738585072014E~307) = true > (0.11125369292536007E~307, 0.22250738585072014E~307) = false == (0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, 0.22250738585072014E~307) = false < (0.11125369292536007E~307, 0.11125369292536007E~307) = false > (0.11125369292536007E~307, 0.11125369292536007E~307) = false == (0.11125369292536007E~307, 0.11125369292536007E~307) = true ?= (0.11125369292536007E~307, 0.11125369292536007E~307) = true < (0.11125369292536007E~307, 0.5E~323) = false > (0.11125369292536007E~307, 0.5E~323) = true == (0.11125369292536007E~307, 0.5E~323) = false ?= (0.11125369292536007E~307, 0.5E~323) = false < (0.11125369292536007E~307, 0.0) = false > (0.11125369292536007E~307, 0.0) = true == (0.11125369292536007E~307, 0.0) = false ?= (0.11125369292536007E~307, 0.0) = false < (0.11125369292536007E~307, ~0.17976931348623157E309) = false > (0.11125369292536007E~307, ~0.17976931348623157E309) = true == (0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (0.11125369292536007E~307, ~0.17976931348623157E309) = false < (0.11125369292536007E~307, ~0.8988465674311579E308) = false > (0.11125369292536007E~307, ~0.8988465674311579E308) = true == (0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (0.11125369292536007E~307, ~0.8988465674311579E308) = false < (0.11125369292536007E~307, ~0.123E4) = false > (0.11125369292536007E~307, ~0.123E4) = true == (0.11125369292536007E~307, ~0.123E4) = false ?= (0.11125369292536007E~307, ~0.123E4) = false < (0.11125369292536007E~307, ~0.123E2) = false > (0.11125369292536007E~307, ~0.123E2) = true == (0.11125369292536007E~307, ~0.123E2) = false ?= (0.11125369292536007E~307, ~0.123E2) = false < (0.11125369292536007E~307, ~0.3141592653589793E1) = false > (0.11125369292536007E~307, ~0.3141592653589793E1) = true == (0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (0.11125369292536007E~307, ~0.3141592653589793E1) = false < (0.11125369292536007E~307, ~0.2718281828459045E1) = false > (0.11125369292536007E~307, ~0.2718281828459045E1) = true == (0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (0.11125369292536007E~307, ~0.2718281828459045E1) = false < (0.11125369292536007E~307, ~0.123E1) = false > (0.11125369292536007E~307, ~0.123E1) = true == (0.11125369292536007E~307, ~0.123E1) = false ?= (0.11125369292536007E~307, ~0.123E1) = false < (0.11125369292536007E~307, ~0.123) = false > (0.11125369292536007E~307, ~0.123) = true == (0.11125369292536007E~307, ~0.123) = false ?= (0.11125369292536007E~307, ~0.123) = false < (0.11125369292536007E~307, ~0.123E~2) = false > (0.11125369292536007E~307, ~0.123E~2) = true == (0.11125369292536007E~307, ~0.123E~2) = false ?= (0.11125369292536007E~307, ~0.123E~2) = false < (0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (0.11125369292536007E~307, ~0.11125369292536007E~307) = true == (0.11125369292536007E~307, ~0.11125369292536007E~307) = false ?= (0.11125369292536007E~307, ~0.11125369292536007E~307) = false < (0.11125369292536007E~307, ~0.5E~323) = false > (0.11125369292536007E~307, ~0.5E~323) = true == (0.11125369292536007E~307, ~0.5E~323) = false ?= (0.11125369292536007E~307, ~0.5E~323) = false < (0.11125369292536007E~307, ~0.0) = false > (0.11125369292536007E~307, ~0.0) = true == (0.11125369292536007E~307, ~0.0) = false ?= (0.11125369292536007E~307, ~0.0) = false < (0.5E~323, 0.17976931348623157E309) = true > (0.5E~323, 0.17976931348623157E309) = false == (0.5E~323, 0.17976931348623157E309) = false ?= (0.5E~323, 0.17976931348623157E309) = false < (0.5E~323, 0.8988465674311579E308) = true > (0.5E~323, 0.8988465674311579E308) = false == (0.5E~323, 0.8988465674311579E308) = false ?= (0.5E~323, 0.8988465674311579E308) = false < (0.5E~323, 0.123E4) = true > (0.5E~323, 0.123E4) = false == (0.5E~323, 0.123E4) = false ?= (0.5E~323, 0.123E4) = false < (0.5E~323, 0.123E2) = true > (0.5E~323, 0.123E2) = false == (0.5E~323, 0.123E2) = false ?= (0.5E~323, 0.123E2) = false < (0.5E~323, 0.3141592653589793E1) = true > (0.5E~323, 0.3141592653589793E1) = false == (0.5E~323, 0.3141592653589793E1) = false ?= (0.5E~323, 0.3141592653589793E1) = false < (0.5E~323, 0.2718281828459045E1) = true > (0.5E~323, 0.2718281828459045E1) = false == (0.5E~323, 0.2718281828459045E1) = false ?= (0.5E~323, 0.2718281828459045E1) = false < (0.5E~323, 0.123E1) = true > (0.5E~323, 0.123E1) = false == (0.5E~323, 0.123E1) = false ?= (0.5E~323, 0.123E1) = false < (0.5E~323, 0.123) = true > (0.5E~323, 0.123) = false == (0.5E~323, 0.123) = false ?= (0.5E~323, 0.123) = false < (0.5E~323, 0.123E~2) = true > (0.5E~323, 0.123E~2) = false == (0.5E~323, 0.123E~2) = false ?= (0.5E~323, 0.123E~2) = false < (0.5E~323, 0.22250738585072014E~307) = true > (0.5E~323, 0.22250738585072014E~307) = false == (0.5E~323, 0.22250738585072014E~307) = false ?= (0.5E~323, 0.22250738585072014E~307) = false < (0.5E~323, 0.11125369292536007E~307) = true > (0.5E~323, 0.11125369292536007E~307) = false == (0.5E~323, 0.11125369292536007E~307) = false ?= (0.5E~323, 0.11125369292536007E~307) = false < (0.5E~323, 0.5E~323) = false > (0.5E~323, 0.5E~323) = false == (0.5E~323, 0.5E~323) = true ?= (0.5E~323, 0.5E~323) = true < (0.5E~323, 0.0) = false > (0.5E~323, 0.0) = true == (0.5E~323, 0.0) = false ?= (0.5E~323, 0.0) = false < (0.5E~323, ~0.17976931348623157E309) = false > (0.5E~323, ~0.17976931348623157E309) = true == (0.5E~323, ~0.17976931348623157E309) = false ?= (0.5E~323, ~0.17976931348623157E309) = false < (0.5E~323, ~0.8988465674311579E308) = false > (0.5E~323, ~0.8988465674311579E308) = true == (0.5E~323, ~0.8988465674311579E308) = false ?= (0.5E~323, ~0.8988465674311579E308) = false < (0.5E~323, ~0.123E4) = false > (0.5E~323, ~0.123E4) = true == (0.5E~323, ~0.123E4) = false ?= (0.5E~323, ~0.123E4) = false < (0.5E~323, ~0.123E2) = false > (0.5E~323, ~0.123E2) = true == (0.5E~323, ~0.123E2) = false ?= (0.5E~323, ~0.123E2) = false < (0.5E~323, ~0.3141592653589793E1) = false > (0.5E~323, ~0.3141592653589793E1) = true == (0.5E~323, ~0.3141592653589793E1) = false ?= (0.5E~323, ~0.3141592653589793E1) = false < (0.5E~323, ~0.2718281828459045E1) = false > (0.5E~323, ~0.2718281828459045E1) = true == (0.5E~323, ~0.2718281828459045E1) = false ?= (0.5E~323, ~0.2718281828459045E1) = false < (0.5E~323, ~0.123E1) = false > (0.5E~323, ~0.123E1) = true == (0.5E~323, ~0.123E1) = false ?= (0.5E~323, ~0.123E1) = false < (0.5E~323, ~0.123) = false > (0.5E~323, ~0.123) = true == (0.5E~323, ~0.123) = false ?= (0.5E~323, ~0.123) = false < (0.5E~323, ~0.123E~2) = false > (0.5E~323, ~0.123E~2) = true == (0.5E~323, ~0.123E~2) = false ?= (0.5E~323, ~0.123E~2) = false < (0.5E~323, ~0.22250738585072014E~307) = false > (0.5E~323, ~0.22250738585072014E~307) = true == (0.5E~323, ~0.22250738585072014E~307) = false ?= (0.5E~323, ~0.22250738585072014E~307) = false < (0.5E~323, ~0.11125369292536007E~307) = false > (0.5E~323, ~0.11125369292536007E~307) = true == (0.5E~323, ~0.11125369292536007E~307) = false ?= (0.5E~323, ~0.11125369292536007E~307) = false < (0.5E~323, ~0.5E~323) = false > (0.5E~323, ~0.5E~323) = true == (0.5E~323, ~0.5E~323) = false ?= (0.5E~323, ~0.5E~323) = false < (0.5E~323, ~0.0) = false > (0.5E~323, ~0.0) = true == (0.5E~323, ~0.0) = false ?= (0.5E~323, ~0.0) = false < (0.0, 0.17976931348623157E309) = true > (0.0, 0.17976931348623157E309) = false == (0.0, 0.17976931348623157E309) = false ?= (0.0, 0.17976931348623157E309) = false < (0.0, 0.8988465674311579E308) = true > (0.0, 0.8988465674311579E308) = false == (0.0, 0.8988465674311579E308) = false ?= (0.0, 0.8988465674311579E308) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.3141592653589793E1) = true > (0.0, 0.3141592653589793E1) = false == (0.0, 0.3141592653589793E1) = false ?= (0.0, 0.3141592653589793E1) = false < (0.0, 0.2718281828459045E1) = true > (0.0, 0.2718281828459045E1) = false == (0.0, 0.2718281828459045E1) = false ?= (0.0, 0.2718281828459045E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.22250738585072014E~307) = true > (0.0, 0.22250738585072014E~307) = false == (0.0, 0.22250738585072014E~307) = false ?= (0.0, 0.22250738585072014E~307) = false < (0.0, 0.11125369292536007E~307) = true > (0.0, 0.11125369292536007E~307) = false == (0.0, 0.11125369292536007E~307) = false ?= (0.0, 0.11125369292536007E~307) = false < (0.0, 0.5E~323) = true > (0.0, 0.5E~323) = false == (0.0, 0.5E~323) = false ?= (0.0, 0.5E~323) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.17976931348623157E309) = false > (0.0, ~0.17976931348623157E309) = true == (0.0, ~0.17976931348623157E309) = false ?= (0.0, ~0.17976931348623157E309) = false < (0.0, ~0.8988465674311579E308) = false > (0.0, ~0.8988465674311579E308) = true == (0.0, ~0.8988465674311579E308) = false ?= (0.0, ~0.8988465674311579E308) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.3141592653589793E1) = false > (0.0, ~0.3141592653589793E1) = true == (0.0, ~0.3141592653589793E1) = false ?= (0.0, ~0.3141592653589793E1) = false < (0.0, ~0.2718281828459045E1) = false > (0.0, ~0.2718281828459045E1) = true == (0.0, ~0.2718281828459045E1) = false ?= (0.0, ~0.2718281828459045E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.22250738585072014E~307) = false > (0.0, ~0.22250738585072014E~307) = true == (0.0, ~0.22250738585072014E~307) = false ?= (0.0, ~0.22250738585072014E~307) = false < (0.0, ~0.11125369292536007E~307) = false > (0.0, ~0.11125369292536007E~307) = true == (0.0, ~0.11125369292536007E~307) = false ?= (0.0, ~0.11125369292536007E~307) = false < (0.0, ~0.5E~323) = false > (0.0, ~0.5E~323) = true == (0.0, ~0.5E~323) = false ?= (0.0, ~0.5E~323) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.17976931348623157E309, 0.17976931348623157E309) = true > (~0.17976931348623157E309, 0.17976931348623157E309) = false == (~0.17976931348623157E309, 0.17976931348623157E309) = false ?= (~0.17976931348623157E309, 0.17976931348623157E309) = false < (~0.17976931348623157E309, 0.8988465674311579E308) = true > (~0.17976931348623157E309, 0.8988465674311579E308) = false == (~0.17976931348623157E309, 0.8988465674311579E308) = false ?= (~0.17976931348623157E309, 0.8988465674311579E308) = false < (~0.17976931348623157E309, 0.123E4) = true > (~0.17976931348623157E309, 0.123E4) = false == (~0.17976931348623157E309, 0.123E4) = false ?= (~0.17976931348623157E309, 0.123E4) = false < (~0.17976931348623157E309, 0.123E2) = true > (~0.17976931348623157E309, 0.123E2) = false == (~0.17976931348623157E309, 0.123E2) = false ?= (~0.17976931348623157E309, 0.123E2) = false < (~0.17976931348623157E309, 0.3141592653589793E1) = true > (~0.17976931348623157E309, 0.3141592653589793E1) = false == (~0.17976931348623157E309, 0.3141592653589793E1) = false ?= (~0.17976931348623157E309, 0.3141592653589793E1) = false < (~0.17976931348623157E309, 0.2718281828459045E1) = true > (~0.17976931348623157E309, 0.2718281828459045E1) = false == (~0.17976931348623157E309, 0.2718281828459045E1) = false ?= (~0.17976931348623157E309, 0.2718281828459045E1) = false < (~0.17976931348623157E309, 0.123E1) = true > (~0.17976931348623157E309, 0.123E1) = false == (~0.17976931348623157E309, 0.123E1) = false ?= (~0.17976931348623157E309, 0.123E1) = false < (~0.17976931348623157E309, 0.123) = true > (~0.17976931348623157E309, 0.123) = false == (~0.17976931348623157E309, 0.123) = false ?= (~0.17976931348623157E309, 0.123) = false < (~0.17976931348623157E309, 0.123E~2) = true > (~0.17976931348623157E309, 0.123E~2) = false == (~0.17976931348623157E309, 0.123E~2) = false ?= (~0.17976931348623157E309, 0.123E~2) = false < (~0.17976931348623157E309, 0.22250738585072014E~307) = true > (~0.17976931348623157E309, 0.22250738585072014E~307) = false == (~0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, 0.22250738585072014E~307) = false < (~0.17976931348623157E309, 0.11125369292536007E~307) = true > (~0.17976931348623157E309, 0.11125369292536007E~307) = false == (~0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, 0.11125369292536007E~307) = false < (~0.17976931348623157E309, 0.5E~323) = true > (~0.17976931348623157E309, 0.5E~323) = false == (~0.17976931348623157E309, 0.5E~323) = false ?= (~0.17976931348623157E309, 0.5E~323) = false < (~0.17976931348623157E309, 0.0) = true > (~0.17976931348623157E309, 0.0) = false == (~0.17976931348623157E309, 0.0) = false ?= (~0.17976931348623157E309, 0.0) = false < (~0.17976931348623157E309, ~0.17976931348623157E309) = false > (~0.17976931348623157E309, ~0.17976931348623157E309) = false == (~0.17976931348623157E309, ~0.17976931348623157E309) = true ?= (~0.17976931348623157E309, ~0.17976931348623157E309) = true < (~0.17976931348623157E309, ~0.8988465674311579E308) = true > (~0.17976931348623157E309, ~0.8988465674311579E308) = false == (~0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (~0.17976931348623157E309, ~0.8988465674311579E308) = false < (~0.17976931348623157E309, ~0.123E4) = true > (~0.17976931348623157E309, ~0.123E4) = false == (~0.17976931348623157E309, ~0.123E4) = false ?= (~0.17976931348623157E309, ~0.123E4) = false < (~0.17976931348623157E309, ~0.123E2) = true > (~0.17976931348623157E309, ~0.123E2) = false == (~0.17976931348623157E309, ~0.123E2) = false ?= (~0.17976931348623157E309, ~0.123E2) = false < (~0.17976931348623157E309, ~0.3141592653589793E1) = true > (~0.17976931348623157E309, ~0.3141592653589793E1) = false == (~0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (~0.17976931348623157E309, ~0.3141592653589793E1) = false < (~0.17976931348623157E309, ~0.2718281828459045E1) = true > (~0.17976931348623157E309, ~0.2718281828459045E1) = false == (~0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (~0.17976931348623157E309, ~0.2718281828459045E1) = false < (~0.17976931348623157E309, ~0.123E1) = true > (~0.17976931348623157E309, ~0.123E1) = false == (~0.17976931348623157E309, ~0.123E1) = false ?= (~0.17976931348623157E309, ~0.123E1) = false < (~0.17976931348623157E309, ~0.123) = true > (~0.17976931348623157E309, ~0.123) = false == (~0.17976931348623157E309, ~0.123) = false ?= (~0.17976931348623157E309, ~0.123) = false < (~0.17976931348623157E309, ~0.123E~2) = true > (~0.17976931348623157E309, ~0.123E~2) = false == (~0.17976931348623157E309, ~0.123E~2) = false ?= (~0.17976931348623157E309, ~0.123E~2) = false < (~0.17976931348623157E309, ~0.22250738585072014E~307) = true > (~0.17976931348623157E309, ~0.22250738585072014E~307) = false == (~0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, ~0.22250738585072014E~307) = false < (~0.17976931348623157E309, ~0.11125369292536007E~307) = true > (~0.17976931348623157E309, ~0.11125369292536007E~307) = false == (~0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, ~0.11125369292536007E~307) = false < (~0.17976931348623157E309, ~0.5E~323) = true > (~0.17976931348623157E309, ~0.5E~323) = false == (~0.17976931348623157E309, ~0.5E~323) = false ?= (~0.17976931348623157E309, ~0.5E~323) = false < (~0.17976931348623157E309, ~0.0) = true > (~0.17976931348623157E309, ~0.0) = false == (~0.17976931348623157E309, ~0.0) = false ?= (~0.17976931348623157E309, ~0.0) = false < (~0.8988465674311579E308, 0.17976931348623157E309) = true > (~0.8988465674311579E308, 0.17976931348623157E309) = false == (~0.8988465674311579E308, 0.17976931348623157E309) = false ?= (~0.8988465674311579E308, 0.17976931348623157E309) = false < (~0.8988465674311579E308, 0.8988465674311579E308) = true > (~0.8988465674311579E308, 0.8988465674311579E308) = false == (~0.8988465674311579E308, 0.8988465674311579E308) = false ?= (~0.8988465674311579E308, 0.8988465674311579E308) = false < (~0.8988465674311579E308, 0.123E4) = true > (~0.8988465674311579E308, 0.123E4) = false == (~0.8988465674311579E308, 0.123E4) = false ?= (~0.8988465674311579E308, 0.123E4) = false < (~0.8988465674311579E308, 0.123E2) = true > (~0.8988465674311579E308, 0.123E2) = false == (~0.8988465674311579E308, 0.123E2) = false ?= (~0.8988465674311579E308, 0.123E2) = false < (~0.8988465674311579E308, 0.3141592653589793E1) = true > (~0.8988465674311579E308, 0.3141592653589793E1) = false == (~0.8988465674311579E308, 0.3141592653589793E1) = false ?= (~0.8988465674311579E308, 0.3141592653589793E1) = false < (~0.8988465674311579E308, 0.2718281828459045E1) = true > (~0.8988465674311579E308, 0.2718281828459045E1) = false == (~0.8988465674311579E308, 0.2718281828459045E1) = false ?= (~0.8988465674311579E308, 0.2718281828459045E1) = false < (~0.8988465674311579E308, 0.123E1) = true > (~0.8988465674311579E308, 0.123E1) = false == (~0.8988465674311579E308, 0.123E1) = false ?= (~0.8988465674311579E308, 0.123E1) = false < (~0.8988465674311579E308, 0.123) = true > (~0.8988465674311579E308, 0.123) = false == (~0.8988465674311579E308, 0.123) = false ?= (~0.8988465674311579E308, 0.123) = false < (~0.8988465674311579E308, 0.123E~2) = true > (~0.8988465674311579E308, 0.123E~2) = false == (~0.8988465674311579E308, 0.123E~2) = false ?= (~0.8988465674311579E308, 0.123E~2) = false < (~0.8988465674311579E308, 0.22250738585072014E~307) = true > (~0.8988465674311579E308, 0.22250738585072014E~307) = false == (~0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, 0.22250738585072014E~307) = false < (~0.8988465674311579E308, 0.11125369292536007E~307) = true > (~0.8988465674311579E308, 0.11125369292536007E~307) = false == (~0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, 0.11125369292536007E~307) = false < (~0.8988465674311579E308, 0.5E~323) = true > (~0.8988465674311579E308, 0.5E~323) = false == (~0.8988465674311579E308, 0.5E~323) = false ?= (~0.8988465674311579E308, 0.5E~323) = false < (~0.8988465674311579E308, 0.0) = true > (~0.8988465674311579E308, 0.0) = false == (~0.8988465674311579E308, 0.0) = false ?= (~0.8988465674311579E308, 0.0) = false < (~0.8988465674311579E308, ~0.17976931348623157E309) = false > (~0.8988465674311579E308, ~0.17976931348623157E309) = true == (~0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (~0.8988465674311579E308, ~0.17976931348623157E309) = false < (~0.8988465674311579E308, ~0.8988465674311579E308) = false > (~0.8988465674311579E308, ~0.8988465674311579E308) = false == (~0.8988465674311579E308, ~0.8988465674311579E308) = true ?= (~0.8988465674311579E308, ~0.8988465674311579E308) = true < (~0.8988465674311579E308, ~0.123E4) = true > (~0.8988465674311579E308, ~0.123E4) = false == (~0.8988465674311579E308, ~0.123E4) = false ?= (~0.8988465674311579E308, ~0.123E4) = false < (~0.8988465674311579E308, ~0.123E2) = true > (~0.8988465674311579E308, ~0.123E2) = false == (~0.8988465674311579E308, ~0.123E2) = false ?= (~0.8988465674311579E308, ~0.123E2) = false < (~0.8988465674311579E308, ~0.3141592653589793E1) = true > (~0.8988465674311579E308, ~0.3141592653589793E1) = false == (~0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (~0.8988465674311579E308, ~0.3141592653589793E1) = false < (~0.8988465674311579E308, ~0.2718281828459045E1) = true > (~0.8988465674311579E308, ~0.2718281828459045E1) = false == (~0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (~0.8988465674311579E308, ~0.2718281828459045E1) = false < (~0.8988465674311579E308, ~0.123E1) = true > (~0.8988465674311579E308, ~0.123E1) = false == (~0.8988465674311579E308, ~0.123E1) = false ?= (~0.8988465674311579E308, ~0.123E1) = false < (~0.8988465674311579E308, ~0.123) = true > (~0.8988465674311579E308, ~0.123) = false == (~0.8988465674311579E308, ~0.123) = false ?= (~0.8988465674311579E308, ~0.123) = false < (~0.8988465674311579E308, ~0.123E~2) = true > (~0.8988465674311579E308, ~0.123E~2) = false == (~0.8988465674311579E308, ~0.123E~2) = false ?= (~0.8988465674311579E308, ~0.123E~2) = false < (~0.8988465674311579E308, ~0.22250738585072014E~307) = true > (~0.8988465674311579E308, ~0.22250738585072014E~307) = false == (~0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, ~0.22250738585072014E~307) = false < (~0.8988465674311579E308, ~0.11125369292536007E~307) = true > (~0.8988465674311579E308, ~0.11125369292536007E~307) = false == (~0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, ~0.11125369292536007E~307) = false < (~0.8988465674311579E308, ~0.5E~323) = true > (~0.8988465674311579E308, ~0.5E~323) = false == (~0.8988465674311579E308, ~0.5E~323) = false ?= (~0.8988465674311579E308, ~0.5E~323) = false < (~0.8988465674311579E308, ~0.0) = true > (~0.8988465674311579E308, ~0.0) = false == (~0.8988465674311579E308, ~0.0) = false ?= (~0.8988465674311579E308, ~0.0) = false < (~0.123E4, 0.17976931348623157E309) = true > (~0.123E4, 0.17976931348623157E309) = false == (~0.123E4, 0.17976931348623157E309) = false ?= (~0.123E4, 0.17976931348623157E309) = false < (~0.123E4, 0.8988465674311579E308) = true > (~0.123E4, 0.8988465674311579E308) = false == (~0.123E4, 0.8988465674311579E308) = false ?= (~0.123E4, 0.8988465674311579E308) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.3141592653589793E1) = true > (~0.123E4, 0.3141592653589793E1) = false == (~0.123E4, 0.3141592653589793E1) = false ?= (~0.123E4, 0.3141592653589793E1) = false < (~0.123E4, 0.2718281828459045E1) = true > (~0.123E4, 0.2718281828459045E1) = false == (~0.123E4, 0.2718281828459045E1) = false ?= (~0.123E4, 0.2718281828459045E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.22250738585072014E~307) = true > (~0.123E4, 0.22250738585072014E~307) = false == (~0.123E4, 0.22250738585072014E~307) = false ?= (~0.123E4, 0.22250738585072014E~307) = false < (~0.123E4, 0.11125369292536007E~307) = true > (~0.123E4, 0.11125369292536007E~307) = false == (~0.123E4, 0.11125369292536007E~307) = false ?= (~0.123E4, 0.11125369292536007E~307) = false < (~0.123E4, 0.5E~323) = true > (~0.123E4, 0.5E~323) = false == (~0.123E4, 0.5E~323) = false ?= (~0.123E4, 0.5E~323) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.17976931348623157E309) = false > (~0.123E4, ~0.17976931348623157E309) = true == (~0.123E4, ~0.17976931348623157E309) = false ?= (~0.123E4, ~0.17976931348623157E309) = false < (~0.123E4, ~0.8988465674311579E308) = false > (~0.123E4, ~0.8988465674311579E308) = true == (~0.123E4, ~0.8988465674311579E308) = false ?= (~0.123E4, ~0.8988465674311579E308) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.3141592653589793E1) = true > (~0.123E4, ~0.3141592653589793E1) = false == (~0.123E4, ~0.3141592653589793E1) = false ?= (~0.123E4, ~0.3141592653589793E1) = false < (~0.123E4, ~0.2718281828459045E1) = true > (~0.123E4, ~0.2718281828459045E1) = false == (~0.123E4, ~0.2718281828459045E1) = false ?= (~0.123E4, ~0.2718281828459045E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.22250738585072014E~307) = true > (~0.123E4, ~0.22250738585072014E~307) = false == (~0.123E4, ~0.22250738585072014E~307) = false ?= (~0.123E4, ~0.22250738585072014E~307) = false < (~0.123E4, ~0.11125369292536007E~307) = true > (~0.123E4, ~0.11125369292536007E~307) = false == (~0.123E4, ~0.11125369292536007E~307) = false ?= (~0.123E4, ~0.11125369292536007E~307) = false < (~0.123E4, ~0.5E~323) = true > (~0.123E4, ~0.5E~323) = false == (~0.123E4, ~0.5E~323) = false ?= (~0.123E4, ~0.5E~323) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.17976931348623157E309) = true > (~0.123E2, 0.17976931348623157E309) = false == (~0.123E2, 0.17976931348623157E309) = false ?= (~0.123E2, 0.17976931348623157E309) = false < (~0.123E2, 0.8988465674311579E308) = true > (~0.123E2, 0.8988465674311579E308) = false == (~0.123E2, 0.8988465674311579E308) = false ?= (~0.123E2, 0.8988465674311579E308) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.3141592653589793E1) = true > (~0.123E2, 0.3141592653589793E1) = false == (~0.123E2, 0.3141592653589793E1) = false ?= (~0.123E2, 0.3141592653589793E1) = false < (~0.123E2, 0.2718281828459045E1) = true > (~0.123E2, 0.2718281828459045E1) = false == (~0.123E2, 0.2718281828459045E1) = false ?= (~0.123E2, 0.2718281828459045E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.22250738585072014E~307) = true > (~0.123E2, 0.22250738585072014E~307) = false == (~0.123E2, 0.22250738585072014E~307) = false ?= (~0.123E2, 0.22250738585072014E~307) = false < (~0.123E2, 0.11125369292536007E~307) = true > (~0.123E2, 0.11125369292536007E~307) = false == (~0.123E2, 0.11125369292536007E~307) = false ?= (~0.123E2, 0.11125369292536007E~307) = false < (~0.123E2, 0.5E~323) = true > (~0.123E2, 0.5E~323) = false == (~0.123E2, 0.5E~323) = false ?= (~0.123E2, 0.5E~323) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.17976931348623157E309) = false > (~0.123E2, ~0.17976931348623157E309) = true == (~0.123E2, ~0.17976931348623157E309) = false ?= (~0.123E2, ~0.17976931348623157E309) = false < (~0.123E2, ~0.8988465674311579E308) = false > (~0.123E2, ~0.8988465674311579E308) = true == (~0.123E2, ~0.8988465674311579E308) = false ?= (~0.123E2, ~0.8988465674311579E308) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.3141592653589793E1) = true > (~0.123E2, ~0.3141592653589793E1) = false == (~0.123E2, ~0.3141592653589793E1) = false ?= (~0.123E2, ~0.3141592653589793E1) = false < (~0.123E2, ~0.2718281828459045E1) = true > (~0.123E2, ~0.2718281828459045E1) = false == (~0.123E2, ~0.2718281828459045E1) = false ?= (~0.123E2, ~0.2718281828459045E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.22250738585072014E~307) = true > (~0.123E2, ~0.22250738585072014E~307) = false == (~0.123E2, ~0.22250738585072014E~307) = false ?= (~0.123E2, ~0.22250738585072014E~307) = false < (~0.123E2, ~0.11125369292536007E~307) = true > (~0.123E2, ~0.11125369292536007E~307) = false == (~0.123E2, ~0.11125369292536007E~307) = false ?= (~0.123E2, ~0.11125369292536007E~307) = false < (~0.123E2, ~0.5E~323) = true > (~0.123E2, ~0.5E~323) = false == (~0.123E2, ~0.5E~323) = false ?= (~0.123E2, ~0.5E~323) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.3141592653589793E1, 0.17976931348623157E309) = true > (~0.3141592653589793E1, 0.17976931348623157E309) = false == (~0.3141592653589793E1, 0.17976931348623157E309) = false ?= (~0.3141592653589793E1, 0.17976931348623157E309) = false < (~0.3141592653589793E1, 0.8988465674311579E308) = true > (~0.3141592653589793E1, 0.8988465674311579E308) = false == (~0.3141592653589793E1, 0.8988465674311579E308) = false ?= (~0.3141592653589793E1, 0.8988465674311579E308) = false < (~0.3141592653589793E1, 0.123E4) = true > (~0.3141592653589793E1, 0.123E4) = false == (~0.3141592653589793E1, 0.123E4) = false ?= (~0.3141592653589793E1, 0.123E4) = false < (~0.3141592653589793E1, 0.123E2) = true > (~0.3141592653589793E1, 0.123E2) = false == (~0.3141592653589793E1, 0.123E2) = false ?= (~0.3141592653589793E1, 0.123E2) = false < (~0.3141592653589793E1, 0.3141592653589793E1) = true > (~0.3141592653589793E1, 0.3141592653589793E1) = false == (~0.3141592653589793E1, 0.3141592653589793E1) = false ?= (~0.3141592653589793E1, 0.3141592653589793E1) = false < (~0.3141592653589793E1, 0.2718281828459045E1) = true > (~0.3141592653589793E1, 0.2718281828459045E1) = false == (~0.3141592653589793E1, 0.2718281828459045E1) = false ?= (~0.3141592653589793E1, 0.2718281828459045E1) = false < (~0.3141592653589793E1, 0.123E1) = true > (~0.3141592653589793E1, 0.123E1) = false == (~0.3141592653589793E1, 0.123E1) = false ?= (~0.3141592653589793E1, 0.123E1) = false < (~0.3141592653589793E1, 0.123) = true > (~0.3141592653589793E1, 0.123) = false == (~0.3141592653589793E1, 0.123) = false ?= (~0.3141592653589793E1, 0.123) = false < (~0.3141592653589793E1, 0.123E~2) = true > (~0.3141592653589793E1, 0.123E~2) = false == (~0.3141592653589793E1, 0.123E~2) = false ?= (~0.3141592653589793E1, 0.123E~2) = false < (~0.3141592653589793E1, 0.22250738585072014E~307) = true > (~0.3141592653589793E1, 0.22250738585072014E~307) = false == (~0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, 0.22250738585072014E~307) = false < (~0.3141592653589793E1, 0.11125369292536007E~307) = true > (~0.3141592653589793E1, 0.11125369292536007E~307) = false == (~0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, 0.11125369292536007E~307) = false < (~0.3141592653589793E1, 0.5E~323) = true > (~0.3141592653589793E1, 0.5E~323) = false == (~0.3141592653589793E1, 0.5E~323) = false ?= (~0.3141592653589793E1, 0.5E~323) = false < (~0.3141592653589793E1, 0.0) = true > (~0.3141592653589793E1, 0.0) = false == (~0.3141592653589793E1, 0.0) = false ?= (~0.3141592653589793E1, 0.0) = false < (~0.3141592653589793E1, ~0.17976931348623157E309) = false > (~0.3141592653589793E1, ~0.17976931348623157E309) = true == (~0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (~0.3141592653589793E1, ~0.17976931348623157E309) = false < (~0.3141592653589793E1, ~0.8988465674311579E308) = false > (~0.3141592653589793E1, ~0.8988465674311579E308) = true == (~0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (~0.3141592653589793E1, ~0.8988465674311579E308) = false < (~0.3141592653589793E1, ~0.123E4) = false > (~0.3141592653589793E1, ~0.123E4) = true == (~0.3141592653589793E1, ~0.123E4) = false ?= (~0.3141592653589793E1, ~0.123E4) = false < (~0.3141592653589793E1, ~0.123E2) = false > (~0.3141592653589793E1, ~0.123E2) = true == (~0.3141592653589793E1, ~0.123E2) = false ?= (~0.3141592653589793E1, ~0.123E2) = false < (~0.3141592653589793E1, ~0.3141592653589793E1) = false > (~0.3141592653589793E1, ~0.3141592653589793E1) = false == (~0.3141592653589793E1, ~0.3141592653589793E1) = true ?= (~0.3141592653589793E1, ~0.3141592653589793E1) = true < (~0.3141592653589793E1, ~0.2718281828459045E1) = true > (~0.3141592653589793E1, ~0.2718281828459045E1) = false == (~0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (~0.3141592653589793E1, ~0.2718281828459045E1) = false < (~0.3141592653589793E1, ~0.123E1) = true > (~0.3141592653589793E1, ~0.123E1) = false == (~0.3141592653589793E1, ~0.123E1) = false ?= (~0.3141592653589793E1, ~0.123E1) = false < (~0.3141592653589793E1, ~0.123) = true > (~0.3141592653589793E1, ~0.123) = false == (~0.3141592653589793E1, ~0.123) = false ?= (~0.3141592653589793E1, ~0.123) = false < (~0.3141592653589793E1, ~0.123E~2) = true > (~0.3141592653589793E1, ~0.123E~2) = false == (~0.3141592653589793E1, ~0.123E~2) = false ?= (~0.3141592653589793E1, ~0.123E~2) = false < (~0.3141592653589793E1, ~0.22250738585072014E~307) = true > (~0.3141592653589793E1, ~0.22250738585072014E~307) = false == (~0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, ~0.22250738585072014E~307) = false < (~0.3141592653589793E1, ~0.11125369292536007E~307) = true > (~0.3141592653589793E1, ~0.11125369292536007E~307) = false == (~0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, ~0.11125369292536007E~307) = false < (~0.3141592653589793E1, ~0.5E~323) = true > (~0.3141592653589793E1, ~0.5E~323) = false == (~0.3141592653589793E1, ~0.5E~323) = false ?= (~0.3141592653589793E1, ~0.5E~323) = false < (~0.3141592653589793E1, ~0.0) = true > (~0.3141592653589793E1, ~0.0) = false == (~0.3141592653589793E1, ~0.0) = false ?= (~0.3141592653589793E1, ~0.0) = false < (~0.2718281828459045E1, 0.17976931348623157E309) = true > (~0.2718281828459045E1, 0.17976931348623157E309) = false == (~0.2718281828459045E1, 0.17976931348623157E309) = false ?= (~0.2718281828459045E1, 0.17976931348623157E309) = false < (~0.2718281828459045E1, 0.8988465674311579E308) = true > (~0.2718281828459045E1, 0.8988465674311579E308) = false == (~0.2718281828459045E1, 0.8988465674311579E308) = false ?= (~0.2718281828459045E1, 0.8988465674311579E308) = false < (~0.2718281828459045E1, 0.123E4) = true > (~0.2718281828459045E1, 0.123E4) = false == (~0.2718281828459045E1, 0.123E4) = false ?= (~0.2718281828459045E1, 0.123E4) = false < (~0.2718281828459045E1, 0.123E2) = true > (~0.2718281828459045E1, 0.123E2) = false == (~0.2718281828459045E1, 0.123E2) = false ?= (~0.2718281828459045E1, 0.123E2) = false < (~0.2718281828459045E1, 0.3141592653589793E1) = true > (~0.2718281828459045E1, 0.3141592653589793E1) = false == (~0.2718281828459045E1, 0.3141592653589793E1) = false ?= (~0.2718281828459045E1, 0.3141592653589793E1) = false < (~0.2718281828459045E1, 0.2718281828459045E1) = true > (~0.2718281828459045E1, 0.2718281828459045E1) = false == (~0.2718281828459045E1, 0.2718281828459045E1) = false ?= (~0.2718281828459045E1, 0.2718281828459045E1) = false < (~0.2718281828459045E1, 0.123E1) = true > (~0.2718281828459045E1, 0.123E1) = false == (~0.2718281828459045E1, 0.123E1) = false ?= (~0.2718281828459045E1, 0.123E1) = false < (~0.2718281828459045E1, 0.123) = true > (~0.2718281828459045E1, 0.123) = false == (~0.2718281828459045E1, 0.123) = false ?= (~0.2718281828459045E1, 0.123) = false < (~0.2718281828459045E1, 0.123E~2) = true > (~0.2718281828459045E1, 0.123E~2) = false == (~0.2718281828459045E1, 0.123E~2) = false ?= (~0.2718281828459045E1, 0.123E~2) = false < (~0.2718281828459045E1, 0.22250738585072014E~307) = true > (~0.2718281828459045E1, 0.22250738585072014E~307) = false == (~0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, 0.22250738585072014E~307) = false < (~0.2718281828459045E1, 0.11125369292536007E~307) = true > (~0.2718281828459045E1, 0.11125369292536007E~307) = false == (~0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, 0.11125369292536007E~307) = false < (~0.2718281828459045E1, 0.5E~323) = true > (~0.2718281828459045E1, 0.5E~323) = false == (~0.2718281828459045E1, 0.5E~323) = false ?= (~0.2718281828459045E1, 0.5E~323) = false < (~0.2718281828459045E1, 0.0) = true > (~0.2718281828459045E1, 0.0) = false == (~0.2718281828459045E1, 0.0) = false ?= (~0.2718281828459045E1, 0.0) = false < (~0.2718281828459045E1, ~0.17976931348623157E309) = false > (~0.2718281828459045E1, ~0.17976931348623157E309) = true == (~0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (~0.2718281828459045E1, ~0.17976931348623157E309) = false < (~0.2718281828459045E1, ~0.8988465674311579E308) = false > (~0.2718281828459045E1, ~0.8988465674311579E308) = true == (~0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (~0.2718281828459045E1, ~0.8988465674311579E308) = false < (~0.2718281828459045E1, ~0.123E4) = false > (~0.2718281828459045E1, ~0.123E4) = true == (~0.2718281828459045E1, ~0.123E4) = false ?= (~0.2718281828459045E1, ~0.123E4) = false < (~0.2718281828459045E1, ~0.123E2) = false > (~0.2718281828459045E1, ~0.123E2) = true == (~0.2718281828459045E1, ~0.123E2) = false ?= (~0.2718281828459045E1, ~0.123E2) = false < (~0.2718281828459045E1, ~0.3141592653589793E1) = false > (~0.2718281828459045E1, ~0.3141592653589793E1) = true == (~0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (~0.2718281828459045E1, ~0.3141592653589793E1) = false < (~0.2718281828459045E1, ~0.2718281828459045E1) = false > (~0.2718281828459045E1, ~0.2718281828459045E1) = false == (~0.2718281828459045E1, ~0.2718281828459045E1) = true ?= (~0.2718281828459045E1, ~0.2718281828459045E1) = true < (~0.2718281828459045E1, ~0.123E1) = true > (~0.2718281828459045E1, ~0.123E1) = false == (~0.2718281828459045E1, ~0.123E1) = false ?= (~0.2718281828459045E1, ~0.123E1) = false < (~0.2718281828459045E1, ~0.123) = true > (~0.2718281828459045E1, ~0.123) = false == (~0.2718281828459045E1, ~0.123) = false ?= (~0.2718281828459045E1, ~0.123) = false < (~0.2718281828459045E1, ~0.123E~2) = true > (~0.2718281828459045E1, ~0.123E~2) = false == (~0.2718281828459045E1, ~0.123E~2) = false ?= (~0.2718281828459045E1, ~0.123E~2) = false < (~0.2718281828459045E1, ~0.22250738585072014E~307) = true > (~0.2718281828459045E1, ~0.22250738585072014E~307) = false == (~0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, ~0.22250738585072014E~307) = false < (~0.2718281828459045E1, ~0.11125369292536007E~307) = true > (~0.2718281828459045E1, ~0.11125369292536007E~307) = false == (~0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, ~0.11125369292536007E~307) = false < (~0.2718281828459045E1, ~0.5E~323) = true > (~0.2718281828459045E1, ~0.5E~323) = false == (~0.2718281828459045E1, ~0.5E~323) = false ?= (~0.2718281828459045E1, ~0.5E~323) = false < (~0.2718281828459045E1, ~0.0) = true > (~0.2718281828459045E1, ~0.0) = false == (~0.2718281828459045E1, ~0.0) = false ?= (~0.2718281828459045E1, ~0.0) = false < (~0.123E1, 0.17976931348623157E309) = true > (~0.123E1, 0.17976931348623157E309) = false == (~0.123E1, 0.17976931348623157E309) = false ?= (~0.123E1, 0.17976931348623157E309) = false < (~0.123E1, 0.8988465674311579E308) = true > (~0.123E1, 0.8988465674311579E308) = false == (~0.123E1, 0.8988465674311579E308) = false ?= (~0.123E1, 0.8988465674311579E308) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.3141592653589793E1) = true > (~0.123E1, 0.3141592653589793E1) = false == (~0.123E1, 0.3141592653589793E1) = false ?= (~0.123E1, 0.3141592653589793E1) = false < (~0.123E1, 0.2718281828459045E1) = true > (~0.123E1, 0.2718281828459045E1) = false == (~0.123E1, 0.2718281828459045E1) = false ?= (~0.123E1, 0.2718281828459045E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.22250738585072014E~307) = true > (~0.123E1, 0.22250738585072014E~307) = false == (~0.123E1, 0.22250738585072014E~307) = false ?= (~0.123E1, 0.22250738585072014E~307) = false < (~0.123E1, 0.11125369292536007E~307) = true > (~0.123E1, 0.11125369292536007E~307) = false == (~0.123E1, 0.11125369292536007E~307) = false ?= (~0.123E1, 0.11125369292536007E~307) = false < (~0.123E1, 0.5E~323) = true > (~0.123E1, 0.5E~323) = false == (~0.123E1, 0.5E~323) = false ?= (~0.123E1, 0.5E~323) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.17976931348623157E309) = false > (~0.123E1, ~0.17976931348623157E309) = true == (~0.123E1, ~0.17976931348623157E309) = false ?= (~0.123E1, ~0.17976931348623157E309) = false < (~0.123E1, ~0.8988465674311579E308) = false > (~0.123E1, ~0.8988465674311579E308) = true == (~0.123E1, ~0.8988465674311579E308) = false ?= (~0.123E1, ~0.8988465674311579E308) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.3141592653589793E1) = false > (~0.123E1, ~0.3141592653589793E1) = true == (~0.123E1, ~0.3141592653589793E1) = false ?= (~0.123E1, ~0.3141592653589793E1) = false < (~0.123E1, ~0.2718281828459045E1) = false > (~0.123E1, ~0.2718281828459045E1) = true == (~0.123E1, ~0.2718281828459045E1) = false ?= (~0.123E1, ~0.2718281828459045E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.22250738585072014E~307) = true > (~0.123E1, ~0.22250738585072014E~307) = false == (~0.123E1, ~0.22250738585072014E~307) = false ?= (~0.123E1, ~0.22250738585072014E~307) = false < (~0.123E1, ~0.11125369292536007E~307) = true > (~0.123E1, ~0.11125369292536007E~307) = false == (~0.123E1, ~0.11125369292536007E~307) = false ?= (~0.123E1, ~0.11125369292536007E~307) = false < (~0.123E1, ~0.5E~323) = true > (~0.123E1, ~0.5E~323) = false == (~0.123E1, ~0.5E~323) = false ?= (~0.123E1, ~0.5E~323) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.17976931348623157E309) = true > (~0.123, 0.17976931348623157E309) = false == (~0.123, 0.17976931348623157E309) = false ?= (~0.123, 0.17976931348623157E309) = false < (~0.123, 0.8988465674311579E308) = true > (~0.123, 0.8988465674311579E308) = false == (~0.123, 0.8988465674311579E308) = false ?= (~0.123, 0.8988465674311579E308) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.3141592653589793E1) = true > (~0.123, 0.3141592653589793E1) = false == (~0.123, 0.3141592653589793E1) = false ?= (~0.123, 0.3141592653589793E1) = false < (~0.123, 0.2718281828459045E1) = true > (~0.123, 0.2718281828459045E1) = false == (~0.123, 0.2718281828459045E1) = false ?= (~0.123, 0.2718281828459045E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.22250738585072014E~307) = true > (~0.123, 0.22250738585072014E~307) = false == (~0.123, 0.22250738585072014E~307) = false ?= (~0.123, 0.22250738585072014E~307) = false < (~0.123, 0.11125369292536007E~307) = true > (~0.123, 0.11125369292536007E~307) = false == (~0.123, 0.11125369292536007E~307) = false ?= (~0.123, 0.11125369292536007E~307) = false < (~0.123, 0.5E~323) = true > (~0.123, 0.5E~323) = false == (~0.123, 0.5E~323) = false ?= (~0.123, 0.5E~323) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.17976931348623157E309) = false > (~0.123, ~0.17976931348623157E309) = true == (~0.123, ~0.17976931348623157E309) = false ?= (~0.123, ~0.17976931348623157E309) = false < (~0.123, ~0.8988465674311579E308) = false > (~0.123, ~0.8988465674311579E308) = true == (~0.123, ~0.8988465674311579E308) = false ?= (~0.123, ~0.8988465674311579E308) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.3141592653589793E1) = false > (~0.123, ~0.3141592653589793E1) = true == (~0.123, ~0.3141592653589793E1) = false ?= (~0.123, ~0.3141592653589793E1) = false < (~0.123, ~0.2718281828459045E1) = false > (~0.123, ~0.2718281828459045E1) = true == (~0.123, ~0.2718281828459045E1) = false ?= (~0.123, ~0.2718281828459045E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.22250738585072014E~307) = true > (~0.123, ~0.22250738585072014E~307) = false == (~0.123, ~0.22250738585072014E~307) = false ?= (~0.123, ~0.22250738585072014E~307) = false < (~0.123, ~0.11125369292536007E~307) = true > (~0.123, ~0.11125369292536007E~307) = false == (~0.123, ~0.11125369292536007E~307) = false ?= (~0.123, ~0.11125369292536007E~307) = false < (~0.123, ~0.5E~323) = true > (~0.123, ~0.5E~323) = false == (~0.123, ~0.5E~323) = false ?= (~0.123, ~0.5E~323) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.17976931348623157E309) = true > (~0.123E~2, 0.17976931348623157E309) = false == (~0.123E~2, 0.17976931348623157E309) = false ?= (~0.123E~2, 0.17976931348623157E309) = false < (~0.123E~2, 0.8988465674311579E308) = true > (~0.123E~2, 0.8988465674311579E308) = false == (~0.123E~2, 0.8988465674311579E308) = false ?= (~0.123E~2, 0.8988465674311579E308) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.3141592653589793E1) = true > (~0.123E~2, 0.3141592653589793E1) = false == (~0.123E~2, 0.3141592653589793E1) = false ?= (~0.123E~2, 0.3141592653589793E1) = false < (~0.123E~2, 0.2718281828459045E1) = true > (~0.123E~2, 0.2718281828459045E1) = false == (~0.123E~2, 0.2718281828459045E1) = false ?= (~0.123E~2, 0.2718281828459045E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.22250738585072014E~307) = true > (~0.123E~2, 0.22250738585072014E~307) = false == (~0.123E~2, 0.22250738585072014E~307) = false ?= (~0.123E~2, 0.22250738585072014E~307) = false < (~0.123E~2, 0.11125369292536007E~307) = true > (~0.123E~2, 0.11125369292536007E~307) = false == (~0.123E~2, 0.11125369292536007E~307) = false ?= (~0.123E~2, 0.11125369292536007E~307) = false < (~0.123E~2, 0.5E~323) = true > (~0.123E~2, 0.5E~323) = false == (~0.123E~2, 0.5E~323) = false ?= (~0.123E~2, 0.5E~323) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.17976931348623157E309) = false > (~0.123E~2, ~0.17976931348623157E309) = true == (~0.123E~2, ~0.17976931348623157E309) = false ?= (~0.123E~2, ~0.17976931348623157E309) = false < (~0.123E~2, ~0.8988465674311579E308) = false > (~0.123E~2, ~0.8988465674311579E308) = true == (~0.123E~2, ~0.8988465674311579E308) = false ?= (~0.123E~2, ~0.8988465674311579E308) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.3141592653589793E1) = false > (~0.123E~2, ~0.3141592653589793E1) = true == (~0.123E~2, ~0.3141592653589793E1) = false ?= (~0.123E~2, ~0.3141592653589793E1) = false < (~0.123E~2, ~0.2718281828459045E1) = false > (~0.123E~2, ~0.2718281828459045E1) = true == (~0.123E~2, ~0.2718281828459045E1) = false ?= (~0.123E~2, ~0.2718281828459045E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.22250738585072014E~307) = true > (~0.123E~2, ~0.22250738585072014E~307) = false == (~0.123E~2, ~0.22250738585072014E~307) = false ?= (~0.123E~2, ~0.22250738585072014E~307) = false < (~0.123E~2, ~0.11125369292536007E~307) = true > (~0.123E~2, ~0.11125369292536007E~307) = false == (~0.123E~2, ~0.11125369292536007E~307) = false ?= (~0.123E~2, ~0.11125369292536007E~307) = false < (~0.123E~2, ~0.5E~323) = true > (~0.123E~2, ~0.5E~323) = false == (~0.123E~2, ~0.5E~323) = false ?= (~0.123E~2, ~0.5E~323) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.22250738585072014E~307, 0.17976931348623157E309) = true > (~0.22250738585072014E~307, 0.17976931348623157E309) = false == (~0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, 0.17976931348623157E309) = false < (~0.22250738585072014E~307, 0.8988465674311579E308) = true > (~0.22250738585072014E~307, 0.8988465674311579E308) = false == (~0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, 0.8988465674311579E308) = false < (~0.22250738585072014E~307, 0.123E4) = true > (~0.22250738585072014E~307, 0.123E4) = false == (~0.22250738585072014E~307, 0.123E4) = false ?= (~0.22250738585072014E~307, 0.123E4) = false < (~0.22250738585072014E~307, 0.123E2) = true > (~0.22250738585072014E~307, 0.123E2) = false == (~0.22250738585072014E~307, 0.123E2) = false ?= (~0.22250738585072014E~307, 0.123E2) = false < (~0.22250738585072014E~307, 0.3141592653589793E1) = true > (~0.22250738585072014E~307, 0.3141592653589793E1) = false == (~0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, 0.3141592653589793E1) = false < (~0.22250738585072014E~307, 0.2718281828459045E1) = true > (~0.22250738585072014E~307, 0.2718281828459045E1) = false == (~0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, 0.2718281828459045E1) = false < (~0.22250738585072014E~307, 0.123E1) = true > (~0.22250738585072014E~307, 0.123E1) = false == (~0.22250738585072014E~307, 0.123E1) = false ?= (~0.22250738585072014E~307, 0.123E1) = false < (~0.22250738585072014E~307, 0.123) = true > (~0.22250738585072014E~307, 0.123) = false == (~0.22250738585072014E~307, 0.123) = false ?= (~0.22250738585072014E~307, 0.123) = false < (~0.22250738585072014E~307, 0.123E~2) = true > (~0.22250738585072014E~307, 0.123E~2) = false == (~0.22250738585072014E~307, 0.123E~2) = false ?= (~0.22250738585072014E~307, 0.123E~2) = false < (~0.22250738585072014E~307, 0.22250738585072014E~307) = true > (~0.22250738585072014E~307, 0.22250738585072014E~307) = false == (~0.22250738585072014E~307, 0.22250738585072014E~307) = false ?= (~0.22250738585072014E~307, 0.22250738585072014E~307) = false < (~0.22250738585072014E~307, 0.11125369292536007E~307) = true > (~0.22250738585072014E~307, 0.11125369292536007E~307) = false == (~0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, 0.11125369292536007E~307) = false < (~0.22250738585072014E~307, 0.5E~323) = true > (~0.22250738585072014E~307, 0.5E~323) = false == (~0.22250738585072014E~307, 0.5E~323) = false ?= (~0.22250738585072014E~307, 0.5E~323) = false < (~0.22250738585072014E~307, 0.0) = true > (~0.22250738585072014E~307, 0.0) = false == (~0.22250738585072014E~307, 0.0) = false ?= (~0.22250738585072014E~307, 0.0) = false < (~0.22250738585072014E~307, ~0.17976931348623157E309) = false > (~0.22250738585072014E~307, ~0.17976931348623157E309) = true == (~0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, ~0.17976931348623157E309) = false < (~0.22250738585072014E~307, ~0.8988465674311579E308) = false > (~0.22250738585072014E~307, ~0.8988465674311579E308) = true == (~0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, ~0.8988465674311579E308) = false < (~0.22250738585072014E~307, ~0.123E4) = false > (~0.22250738585072014E~307, ~0.123E4) = true == (~0.22250738585072014E~307, ~0.123E4) = false ?= (~0.22250738585072014E~307, ~0.123E4) = false < (~0.22250738585072014E~307, ~0.123E2) = false > (~0.22250738585072014E~307, ~0.123E2) = true == (~0.22250738585072014E~307, ~0.123E2) = false ?= (~0.22250738585072014E~307, ~0.123E2) = false < (~0.22250738585072014E~307, ~0.3141592653589793E1) = false > (~0.22250738585072014E~307, ~0.3141592653589793E1) = true == (~0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, ~0.3141592653589793E1) = false < (~0.22250738585072014E~307, ~0.2718281828459045E1) = false > (~0.22250738585072014E~307, ~0.2718281828459045E1) = true == (~0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, ~0.2718281828459045E1) = false < (~0.22250738585072014E~307, ~0.123E1) = false > (~0.22250738585072014E~307, ~0.123E1) = true == (~0.22250738585072014E~307, ~0.123E1) = false ?= (~0.22250738585072014E~307, ~0.123E1) = false < (~0.22250738585072014E~307, ~0.123) = false > (~0.22250738585072014E~307, ~0.123) = true == (~0.22250738585072014E~307, ~0.123) = false ?= (~0.22250738585072014E~307, ~0.123) = false < (~0.22250738585072014E~307, ~0.123E~2) = false > (~0.22250738585072014E~307, ~0.123E~2) = true == (~0.22250738585072014E~307, ~0.123E~2) = false ?= (~0.22250738585072014E~307, ~0.123E~2) = false < (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false == (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true ?= (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true < (~0.22250738585072014E~307, ~0.11125369292536007E~307) = true > (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false == (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (~0.22250738585072014E~307, ~0.5E~323) = true > (~0.22250738585072014E~307, ~0.5E~323) = false == (~0.22250738585072014E~307, ~0.5E~323) = false ?= (~0.22250738585072014E~307, ~0.5E~323) = false < (~0.22250738585072014E~307, ~0.0) = true > (~0.22250738585072014E~307, ~0.0) = false == (~0.22250738585072014E~307, ~0.0) = false ?= (~0.22250738585072014E~307, ~0.0) = false < (~0.11125369292536007E~307, 0.17976931348623157E309) = true > (~0.11125369292536007E~307, 0.17976931348623157E309) = false == (~0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, 0.17976931348623157E309) = false < (~0.11125369292536007E~307, 0.8988465674311579E308) = true > (~0.11125369292536007E~307, 0.8988465674311579E308) = false == (~0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, 0.8988465674311579E308) = false < (~0.11125369292536007E~307, 0.123E4) = true > (~0.11125369292536007E~307, 0.123E4) = false == (~0.11125369292536007E~307, 0.123E4) = false ?= (~0.11125369292536007E~307, 0.123E4) = false < (~0.11125369292536007E~307, 0.123E2) = true > (~0.11125369292536007E~307, 0.123E2) = false == (~0.11125369292536007E~307, 0.123E2) = false ?= (~0.11125369292536007E~307, 0.123E2) = false < (~0.11125369292536007E~307, 0.3141592653589793E1) = true > (~0.11125369292536007E~307, 0.3141592653589793E1) = false == (~0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, 0.3141592653589793E1) = false < (~0.11125369292536007E~307, 0.2718281828459045E1) = true > (~0.11125369292536007E~307, 0.2718281828459045E1) = false == (~0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, 0.2718281828459045E1) = false < (~0.11125369292536007E~307, 0.123E1) = true > (~0.11125369292536007E~307, 0.123E1) = false == (~0.11125369292536007E~307, 0.123E1) = false ?= (~0.11125369292536007E~307, 0.123E1) = false < (~0.11125369292536007E~307, 0.123) = true > (~0.11125369292536007E~307, 0.123) = false == (~0.11125369292536007E~307, 0.123) = false ?= (~0.11125369292536007E~307, 0.123) = false < (~0.11125369292536007E~307, 0.123E~2) = true > (~0.11125369292536007E~307, 0.123E~2) = false == (~0.11125369292536007E~307, 0.123E~2) = false ?= (~0.11125369292536007E~307, 0.123E~2) = false < (~0.11125369292536007E~307, 0.22250738585072014E~307) = true > (~0.11125369292536007E~307, 0.22250738585072014E~307) = false == (~0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, 0.22250738585072014E~307) = false < (~0.11125369292536007E~307, 0.11125369292536007E~307) = true > (~0.11125369292536007E~307, 0.11125369292536007E~307) = false == (~0.11125369292536007E~307, 0.11125369292536007E~307) = false ?= (~0.11125369292536007E~307, 0.11125369292536007E~307) = false < (~0.11125369292536007E~307, 0.5E~323) = true > (~0.11125369292536007E~307, 0.5E~323) = false == (~0.11125369292536007E~307, 0.5E~323) = false ?= (~0.11125369292536007E~307, 0.5E~323) = false < (~0.11125369292536007E~307, 0.0) = true > (~0.11125369292536007E~307, 0.0) = false == (~0.11125369292536007E~307, 0.0) = false ?= (~0.11125369292536007E~307, 0.0) = false < (~0.11125369292536007E~307, ~0.17976931348623157E309) = false > (~0.11125369292536007E~307, ~0.17976931348623157E309) = true == (~0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, ~0.17976931348623157E309) = false < (~0.11125369292536007E~307, ~0.8988465674311579E308) = false > (~0.11125369292536007E~307, ~0.8988465674311579E308) = true == (~0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, ~0.8988465674311579E308) = false < (~0.11125369292536007E~307, ~0.123E4) = false > (~0.11125369292536007E~307, ~0.123E4) = true == (~0.11125369292536007E~307, ~0.123E4) = false ?= (~0.11125369292536007E~307, ~0.123E4) = false < (~0.11125369292536007E~307, ~0.123E2) = false > (~0.11125369292536007E~307, ~0.123E2) = true == (~0.11125369292536007E~307, ~0.123E2) = false ?= (~0.11125369292536007E~307, ~0.123E2) = false < (~0.11125369292536007E~307, ~0.3141592653589793E1) = false > (~0.11125369292536007E~307, ~0.3141592653589793E1) = true == (~0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, ~0.3141592653589793E1) = false < (~0.11125369292536007E~307, ~0.2718281828459045E1) = false > (~0.11125369292536007E~307, ~0.2718281828459045E1) = true == (~0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, ~0.2718281828459045E1) = false < (~0.11125369292536007E~307, ~0.123E1) = false > (~0.11125369292536007E~307, ~0.123E1) = true == (~0.11125369292536007E~307, ~0.123E1) = false ?= (~0.11125369292536007E~307, ~0.123E1) = false < (~0.11125369292536007E~307, ~0.123) = false > (~0.11125369292536007E~307, ~0.123) = true == (~0.11125369292536007E~307, ~0.123) = false ?= (~0.11125369292536007E~307, ~0.123) = false < (~0.11125369292536007E~307, ~0.123E~2) = false > (~0.11125369292536007E~307, ~0.123E~2) = true == (~0.11125369292536007E~307, ~0.123E~2) = false ?= (~0.11125369292536007E~307, ~0.123E~2) = false < (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (~0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false == (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true ?= (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true < (~0.11125369292536007E~307, ~0.5E~323) = true > (~0.11125369292536007E~307, ~0.5E~323) = false == (~0.11125369292536007E~307, ~0.5E~323) = false ?= (~0.11125369292536007E~307, ~0.5E~323) = false < (~0.11125369292536007E~307, ~0.0) = true > (~0.11125369292536007E~307, ~0.0) = false == (~0.11125369292536007E~307, ~0.0) = false ?= (~0.11125369292536007E~307, ~0.0) = false < (~0.5E~323, 0.17976931348623157E309) = true > (~0.5E~323, 0.17976931348623157E309) = false == (~0.5E~323, 0.17976931348623157E309) = false ?= (~0.5E~323, 0.17976931348623157E309) = false < (~0.5E~323, 0.8988465674311579E308) = true > (~0.5E~323, 0.8988465674311579E308) = false == (~0.5E~323, 0.8988465674311579E308) = false ?= (~0.5E~323, 0.8988465674311579E308) = false < (~0.5E~323, 0.123E4) = true > (~0.5E~323, 0.123E4) = false == (~0.5E~323, 0.123E4) = false ?= (~0.5E~323, 0.123E4) = false < (~0.5E~323, 0.123E2) = true > (~0.5E~323, 0.123E2) = false == (~0.5E~323, 0.123E2) = false ?= (~0.5E~323, 0.123E2) = false < (~0.5E~323, 0.3141592653589793E1) = true > (~0.5E~323, 0.3141592653589793E1) = false == (~0.5E~323, 0.3141592653589793E1) = false ?= (~0.5E~323, 0.3141592653589793E1) = false < (~0.5E~323, 0.2718281828459045E1) = true > (~0.5E~323, 0.2718281828459045E1) = false == (~0.5E~323, 0.2718281828459045E1) = false ?= (~0.5E~323, 0.2718281828459045E1) = false < (~0.5E~323, 0.123E1) = true > (~0.5E~323, 0.123E1) = false == (~0.5E~323, 0.123E1) = false ?= (~0.5E~323, 0.123E1) = false < (~0.5E~323, 0.123) = true > (~0.5E~323, 0.123) = false == (~0.5E~323, 0.123) = false ?= (~0.5E~323, 0.123) = false < (~0.5E~323, 0.123E~2) = true > (~0.5E~323, 0.123E~2) = false == (~0.5E~323, 0.123E~2) = false ?= (~0.5E~323, 0.123E~2) = false < (~0.5E~323, 0.22250738585072014E~307) = true > (~0.5E~323, 0.22250738585072014E~307) = false == (~0.5E~323, 0.22250738585072014E~307) = false ?= (~0.5E~323, 0.22250738585072014E~307) = false < (~0.5E~323, 0.11125369292536007E~307) = true > (~0.5E~323, 0.11125369292536007E~307) = false == (~0.5E~323, 0.11125369292536007E~307) = false ?= (~0.5E~323, 0.11125369292536007E~307) = false < (~0.5E~323, 0.5E~323) = true > (~0.5E~323, 0.5E~323) = false == (~0.5E~323, 0.5E~323) = false ?= (~0.5E~323, 0.5E~323) = false < (~0.5E~323, 0.0) = true > (~0.5E~323, 0.0) = false == (~0.5E~323, 0.0) = false ?= (~0.5E~323, 0.0) = false < (~0.5E~323, ~0.17976931348623157E309) = false > (~0.5E~323, ~0.17976931348623157E309) = true == (~0.5E~323, ~0.17976931348623157E309) = false ?= (~0.5E~323, ~0.17976931348623157E309) = false < (~0.5E~323, ~0.8988465674311579E308) = false > (~0.5E~323, ~0.8988465674311579E308) = true == (~0.5E~323, ~0.8988465674311579E308) = false ?= (~0.5E~323, ~0.8988465674311579E308) = false < (~0.5E~323, ~0.123E4) = false > (~0.5E~323, ~0.123E4) = true == (~0.5E~323, ~0.123E4) = false ?= (~0.5E~323, ~0.123E4) = false < (~0.5E~323, ~0.123E2) = false > (~0.5E~323, ~0.123E2) = true == (~0.5E~323, ~0.123E2) = false ?= (~0.5E~323, ~0.123E2) = false < (~0.5E~323, ~0.3141592653589793E1) = false > (~0.5E~323, ~0.3141592653589793E1) = true == (~0.5E~323, ~0.3141592653589793E1) = false ?= (~0.5E~323, ~0.3141592653589793E1) = false < (~0.5E~323, ~0.2718281828459045E1) = false > (~0.5E~323, ~0.2718281828459045E1) = true == (~0.5E~323, ~0.2718281828459045E1) = false ?= (~0.5E~323, ~0.2718281828459045E1) = false < (~0.5E~323, ~0.123E1) = false > (~0.5E~323, ~0.123E1) = true == (~0.5E~323, ~0.123E1) = false ?= (~0.5E~323, ~0.123E1) = false < (~0.5E~323, ~0.123) = false > (~0.5E~323, ~0.123) = true == (~0.5E~323, ~0.123) = false ?= (~0.5E~323, ~0.123) = false < (~0.5E~323, ~0.123E~2) = false > (~0.5E~323, ~0.123E~2) = true == (~0.5E~323, ~0.123E~2) = false ?= (~0.5E~323, ~0.123E~2) = false < (~0.5E~323, ~0.22250738585072014E~307) = false > (~0.5E~323, ~0.22250738585072014E~307) = true == (~0.5E~323, ~0.22250738585072014E~307) = false ?= (~0.5E~323, ~0.22250738585072014E~307) = false < (~0.5E~323, ~0.11125369292536007E~307) = false > (~0.5E~323, ~0.11125369292536007E~307) = true == (~0.5E~323, ~0.11125369292536007E~307) = false ?= (~0.5E~323, ~0.11125369292536007E~307) = false < (~0.5E~323, ~0.5E~323) = false > (~0.5E~323, ~0.5E~323) = false == (~0.5E~323, ~0.5E~323) = true ?= (~0.5E~323, ~0.5E~323) = true < (~0.5E~323, ~0.0) = true > (~0.5E~323, ~0.0) = false == (~0.5E~323, ~0.0) = false ?= (~0.5E~323, ~0.0) = false < (~0.0, 0.17976931348623157E309) = true > (~0.0, 0.17976931348623157E309) = false == (~0.0, 0.17976931348623157E309) = false ?= (~0.0, 0.17976931348623157E309) = false < (~0.0, 0.8988465674311579E308) = true > (~0.0, 0.8988465674311579E308) = false == (~0.0, 0.8988465674311579E308) = false ?= (~0.0, 0.8988465674311579E308) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.3141592653589793E1) = true > (~0.0, 0.3141592653589793E1) = false == (~0.0, 0.3141592653589793E1) = false ?= (~0.0, 0.3141592653589793E1) = false < (~0.0, 0.2718281828459045E1) = true > (~0.0, 0.2718281828459045E1) = false == (~0.0, 0.2718281828459045E1) = false ?= (~0.0, 0.2718281828459045E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.22250738585072014E~307) = true > (~0.0, 0.22250738585072014E~307) = false == (~0.0, 0.22250738585072014E~307) = false ?= (~0.0, 0.22250738585072014E~307) = false < (~0.0, 0.11125369292536007E~307) = true > (~0.0, 0.11125369292536007E~307) = false == (~0.0, 0.11125369292536007E~307) = false ?= (~0.0, 0.11125369292536007E~307) = false < (~0.0, 0.5E~323) = true > (~0.0, 0.5E~323) = false == (~0.0, 0.5E~323) = false ?= (~0.0, 0.5E~323) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.17976931348623157E309) = false > (~0.0, ~0.17976931348623157E309) = true == (~0.0, ~0.17976931348623157E309) = false ?= (~0.0, ~0.17976931348623157E309) = false < (~0.0, ~0.8988465674311579E308) = false > (~0.0, ~0.8988465674311579E308) = true == (~0.0, ~0.8988465674311579E308) = false ?= (~0.0, ~0.8988465674311579E308) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.3141592653589793E1) = false > (~0.0, ~0.3141592653589793E1) = true == (~0.0, ~0.3141592653589793E1) = false ?= (~0.0, ~0.3141592653589793E1) = false < (~0.0, ~0.2718281828459045E1) = false > (~0.0, ~0.2718281828459045E1) = true == (~0.0, ~0.2718281828459045E1) = false ?= (~0.0, ~0.2718281828459045E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.22250738585072014E~307) = false > (~0.0, ~0.22250738585072014E~307) = true == (~0.0, ~0.22250738585072014E~307) = false ?= (~0.0, ~0.22250738585072014E~307) = false < (~0.0, ~0.11125369292536007E~307) = false > (~0.0, ~0.11125369292536007E~307) = true == (~0.0, ~0.11125369292536007E~307) = false ?= (~0.0, ~0.11125369292536007E~307) = false < (~0.0, ~0.5E~323) = false > (~0.0, ~0.5E~323) = true == (~0.0, ~0.5E~323) = false ?= (~0.0, ~0.5E~323) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compareReal (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compare (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, 0.123E4) = GREATER compareReal (0.17976931348623157E309, 0.123E4) = GREATER compare (0.17976931348623157E309, 0.123E2) = GREATER compareReal (0.17976931348623157E309, 0.123E2) = GREATER compare (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, 0.123E1) = GREATER compareReal (0.17976931348623157E309, 0.123E1) = GREATER compare (0.17976931348623157E309, 0.123) = GREATER compareReal (0.17976931348623157E309, 0.123) = GREATER compare (0.17976931348623157E309, 0.123E~2) = GREATER compareReal (0.17976931348623157E309, 0.123E~2) = GREATER compare (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, 0.5E~323) = GREATER compareReal (0.17976931348623157E309, 0.5E~323) = GREATER compare (0.17976931348623157E309, 0.0) = GREATER compareReal (0.17976931348623157E309, 0.0) = GREATER compare (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compareReal (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compare (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, ~0.123E4) = GREATER compareReal (0.17976931348623157E309, ~0.123E4) = GREATER compare (0.17976931348623157E309, ~0.123E2) = GREATER compareReal (0.17976931348623157E309, ~0.123E2) = GREATER compare (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, ~0.123E1) = GREATER compareReal (0.17976931348623157E309, ~0.123E1) = GREATER compare (0.17976931348623157E309, ~0.123) = GREATER compareReal (0.17976931348623157E309, ~0.123) = GREATER compare (0.17976931348623157E309, ~0.123E~2) = GREATER compareReal (0.17976931348623157E309, ~0.123E~2) = GREATER compare (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, ~0.5E~323) = GREATER compareReal (0.17976931348623157E309, ~0.5E~323) = GREATER compare (0.17976931348623157E309, ~0.0) = GREATER compareReal (0.17976931348623157E309, ~0.0) = GREATER compare (0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compareReal (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compare (0.8988465674311579E308, 0.123E4) = GREATER compareReal (0.8988465674311579E308, 0.123E4) = GREATER compare (0.8988465674311579E308, 0.123E2) = GREATER compareReal (0.8988465674311579E308, 0.123E2) = GREATER compare (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, 0.123E1) = GREATER compareReal (0.8988465674311579E308, 0.123E1) = GREATER compare (0.8988465674311579E308, 0.123) = GREATER compareReal (0.8988465674311579E308, 0.123) = GREATER compare (0.8988465674311579E308, 0.123E~2) = GREATER compareReal (0.8988465674311579E308, 0.123E~2) = GREATER compare (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, 0.5E~323) = GREATER compareReal (0.8988465674311579E308, 0.5E~323) = GREATER compare (0.8988465674311579E308, 0.0) = GREATER compareReal (0.8988465674311579E308, 0.0) = GREATER compare (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compareReal (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compare (0.8988465674311579E308, ~0.123E4) = GREATER compareReal (0.8988465674311579E308, ~0.123E4) = GREATER compare (0.8988465674311579E308, ~0.123E2) = GREATER compareReal (0.8988465674311579E308, ~0.123E2) = GREATER compare (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, ~0.123E1) = GREATER compareReal (0.8988465674311579E308, ~0.123E1) = GREATER compare (0.8988465674311579E308, ~0.123) = GREATER compareReal (0.8988465674311579E308, ~0.123) = GREATER compare (0.8988465674311579E308, ~0.123E~2) = GREATER compareReal (0.8988465674311579E308, ~0.123E~2) = GREATER compare (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, ~0.5E~323) = GREATER compareReal (0.8988465674311579E308, ~0.5E~323) = GREATER compare (0.8988465674311579E308, ~0.0) = GREATER compareReal (0.8988465674311579E308, ~0.0) = GREATER compare (0.123E4, 0.17976931348623157E309) = LESS compareReal (0.123E4, 0.17976931348623157E309) = LESS compare (0.123E4, 0.8988465674311579E308) = LESS compareReal (0.123E4, 0.8988465674311579E308) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.3141592653589793E1) = GREATER compareReal (0.123E4, 0.3141592653589793E1) = GREATER compare (0.123E4, 0.2718281828459045E1) = GREATER compareReal (0.123E4, 0.2718281828459045E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.22250738585072014E~307) = GREATER compareReal (0.123E4, 0.22250738585072014E~307) = GREATER compare (0.123E4, 0.11125369292536007E~307) = GREATER compareReal (0.123E4, 0.11125369292536007E~307) = GREATER compare (0.123E4, 0.5E~323) = GREATER compareReal (0.123E4, 0.5E~323) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.17976931348623157E309) = GREATER compareReal (0.123E4, ~0.17976931348623157E309) = GREATER compare (0.123E4, ~0.8988465674311579E308) = GREATER compareReal (0.123E4, ~0.8988465674311579E308) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.3141592653589793E1) = GREATER compareReal (0.123E4, ~0.3141592653589793E1) = GREATER compare (0.123E4, ~0.2718281828459045E1) = GREATER compareReal (0.123E4, ~0.2718281828459045E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.22250738585072014E~307) = GREATER compareReal (0.123E4, ~0.22250738585072014E~307) = GREATER compare (0.123E4, ~0.11125369292536007E~307) = GREATER compareReal (0.123E4, ~0.11125369292536007E~307) = GREATER compare (0.123E4, ~0.5E~323) = GREATER compareReal (0.123E4, ~0.5E~323) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.17976931348623157E309) = LESS compareReal (0.123E2, 0.17976931348623157E309) = LESS compare (0.123E2, 0.8988465674311579E308) = LESS compareReal (0.123E2, 0.8988465674311579E308) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.3141592653589793E1) = GREATER compareReal (0.123E2, 0.3141592653589793E1) = GREATER compare (0.123E2, 0.2718281828459045E1) = GREATER compareReal (0.123E2, 0.2718281828459045E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.22250738585072014E~307) = GREATER compareReal (0.123E2, 0.22250738585072014E~307) = GREATER compare (0.123E2, 0.11125369292536007E~307) = GREATER compareReal (0.123E2, 0.11125369292536007E~307) = GREATER compare (0.123E2, 0.5E~323) = GREATER compareReal (0.123E2, 0.5E~323) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.17976931348623157E309) = GREATER compareReal (0.123E2, ~0.17976931348623157E309) = GREATER compare (0.123E2, ~0.8988465674311579E308) = GREATER compareReal (0.123E2, ~0.8988465674311579E308) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.3141592653589793E1) = GREATER compareReal (0.123E2, ~0.3141592653589793E1) = GREATER compare (0.123E2, ~0.2718281828459045E1) = GREATER compareReal (0.123E2, ~0.2718281828459045E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E2, ~0.22250738585072014E~307) = GREATER compare (0.123E2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E2, ~0.11125369292536007E~307) = GREATER compare (0.123E2, ~0.5E~323) = GREATER compareReal (0.123E2, ~0.5E~323) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (0.3141592653589793E1, 0.123E4) = LESS compareReal (0.3141592653589793E1, 0.123E4) = LESS compare (0.3141592653589793E1, 0.123E2) = LESS compareReal (0.3141592653589793E1, 0.123E2) = LESS compare (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compareReal (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compare (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, 0.123E1) = GREATER compareReal (0.3141592653589793E1, 0.123E1) = GREATER compare (0.3141592653589793E1, 0.123) = GREATER compareReal (0.3141592653589793E1, 0.123) = GREATER compare (0.3141592653589793E1, 0.123E~2) = GREATER compareReal (0.3141592653589793E1, 0.123E~2) = GREATER compare (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, 0.5E~323) = GREATER compareReal (0.3141592653589793E1, 0.5E~323) = GREATER compare (0.3141592653589793E1, 0.0) = GREATER compareReal (0.3141592653589793E1, 0.0) = GREATER compare (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (0.3141592653589793E1, ~0.123E4) = GREATER compareReal (0.3141592653589793E1, ~0.123E4) = GREATER compare (0.3141592653589793E1, ~0.123E2) = GREATER compareReal (0.3141592653589793E1, ~0.123E2) = GREATER compare (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compareReal (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compare (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, ~0.123E1) = GREATER compareReal (0.3141592653589793E1, ~0.123E1) = GREATER compare (0.3141592653589793E1, ~0.123) = GREATER compareReal (0.3141592653589793E1, ~0.123) = GREATER compare (0.3141592653589793E1, ~0.123E~2) = GREATER compareReal (0.3141592653589793E1, ~0.123E~2) = GREATER compare (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, ~0.5E~323) = GREATER compareReal (0.3141592653589793E1, ~0.5E~323) = GREATER compare (0.3141592653589793E1, ~0.0) = GREATER compareReal (0.3141592653589793E1, ~0.0) = GREATER compare (0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (0.2718281828459045E1, 0.123E4) = LESS compareReal (0.2718281828459045E1, 0.123E4) = LESS compare (0.2718281828459045E1, 0.123E2) = LESS compareReal (0.2718281828459045E1, 0.123E2) = LESS compare (0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compareReal (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compare (0.2718281828459045E1, 0.123E1) = GREATER compareReal (0.2718281828459045E1, 0.123E1) = GREATER compare (0.2718281828459045E1, 0.123) = GREATER compareReal (0.2718281828459045E1, 0.123) = GREATER compare (0.2718281828459045E1, 0.123E~2) = GREATER compareReal (0.2718281828459045E1, 0.123E~2) = GREATER compare (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, 0.5E~323) = GREATER compareReal (0.2718281828459045E1, 0.5E~323) = GREATER compare (0.2718281828459045E1, 0.0) = GREATER compareReal (0.2718281828459045E1, 0.0) = GREATER compare (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (0.2718281828459045E1, ~0.123E4) = GREATER compareReal (0.2718281828459045E1, ~0.123E4) = GREATER compare (0.2718281828459045E1, ~0.123E2) = GREATER compareReal (0.2718281828459045E1, ~0.123E2) = GREATER compare (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compareReal (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compare (0.2718281828459045E1, ~0.123E1) = GREATER compareReal (0.2718281828459045E1, ~0.123E1) = GREATER compare (0.2718281828459045E1, ~0.123) = GREATER compareReal (0.2718281828459045E1, ~0.123) = GREATER compare (0.2718281828459045E1, ~0.123E~2) = GREATER compareReal (0.2718281828459045E1, ~0.123E~2) = GREATER compare (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, ~0.5E~323) = GREATER compareReal (0.2718281828459045E1, ~0.5E~323) = GREATER compare (0.2718281828459045E1, ~0.0) = GREATER compareReal (0.2718281828459045E1, ~0.0) = GREATER compare (0.123E1, 0.17976931348623157E309) = LESS compareReal (0.123E1, 0.17976931348623157E309) = LESS compare (0.123E1, 0.8988465674311579E308) = LESS compareReal (0.123E1, 0.8988465674311579E308) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.3141592653589793E1) = LESS compareReal (0.123E1, 0.3141592653589793E1) = LESS compare (0.123E1, 0.2718281828459045E1) = LESS compareReal (0.123E1, 0.2718281828459045E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.22250738585072014E~307) = GREATER compareReal (0.123E1, 0.22250738585072014E~307) = GREATER compare (0.123E1, 0.11125369292536007E~307) = GREATER compareReal (0.123E1, 0.11125369292536007E~307) = GREATER compare (0.123E1, 0.5E~323) = GREATER compareReal (0.123E1, 0.5E~323) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.17976931348623157E309) = GREATER compareReal (0.123E1, ~0.17976931348623157E309) = GREATER compare (0.123E1, ~0.8988465674311579E308) = GREATER compareReal (0.123E1, ~0.8988465674311579E308) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.3141592653589793E1) = GREATER compareReal (0.123E1, ~0.3141592653589793E1) = GREATER compare (0.123E1, ~0.2718281828459045E1) = GREATER compareReal (0.123E1, ~0.2718281828459045E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.22250738585072014E~307) = GREATER compareReal (0.123E1, ~0.22250738585072014E~307) = GREATER compare (0.123E1, ~0.11125369292536007E~307) = GREATER compareReal (0.123E1, ~0.11125369292536007E~307) = GREATER compare (0.123E1, ~0.5E~323) = GREATER compareReal (0.123E1, ~0.5E~323) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.17976931348623157E309) = LESS compareReal (0.123, 0.17976931348623157E309) = LESS compare (0.123, 0.8988465674311579E308) = LESS compareReal (0.123, 0.8988465674311579E308) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.3141592653589793E1) = LESS compareReal (0.123, 0.3141592653589793E1) = LESS compare (0.123, 0.2718281828459045E1) = LESS compareReal (0.123, 0.2718281828459045E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.22250738585072014E~307) = GREATER compareReal (0.123, 0.22250738585072014E~307) = GREATER compare (0.123, 0.11125369292536007E~307) = GREATER compareReal (0.123, 0.11125369292536007E~307) = GREATER compare (0.123, 0.5E~323) = GREATER compareReal (0.123, 0.5E~323) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.17976931348623157E309) = GREATER compareReal (0.123, ~0.17976931348623157E309) = GREATER compare (0.123, ~0.8988465674311579E308) = GREATER compareReal (0.123, ~0.8988465674311579E308) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.3141592653589793E1) = GREATER compareReal (0.123, ~0.3141592653589793E1) = GREATER compare (0.123, ~0.2718281828459045E1) = GREATER compareReal (0.123, ~0.2718281828459045E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.22250738585072014E~307) = GREATER compareReal (0.123, ~0.22250738585072014E~307) = GREATER compare (0.123, ~0.11125369292536007E~307) = GREATER compareReal (0.123, ~0.11125369292536007E~307) = GREATER compare (0.123, ~0.5E~323) = GREATER compareReal (0.123, ~0.5E~323) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.17976931348623157E309) = LESS compareReal (0.123E~2, 0.17976931348623157E309) = LESS compare (0.123E~2, 0.8988465674311579E308) = LESS compareReal (0.123E~2, 0.8988465674311579E308) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.3141592653589793E1) = LESS compareReal (0.123E~2, 0.3141592653589793E1) = LESS compare (0.123E~2, 0.2718281828459045E1) = LESS compareReal (0.123E~2, 0.2718281828459045E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.22250738585072014E~307) = GREATER compareReal (0.123E~2, 0.22250738585072014E~307) = GREATER compare (0.123E~2, 0.11125369292536007E~307) = GREATER compareReal (0.123E~2, 0.11125369292536007E~307) = GREATER compare (0.123E~2, 0.5E~323) = GREATER compareReal (0.123E~2, 0.5E~323) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (0.123E~2, ~0.17976931348623157E309) = GREATER compare (0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (0.123E~2, ~0.8988465674311579E308) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (0.123E~2, ~0.3141592653589793E1) = GREATER compare (0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (0.123E~2, ~0.2718281828459045E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E~2, ~0.22250738585072014E~307) = GREATER compare (0.123E~2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E~2, ~0.11125369292536007E~307) = GREATER compare (0.123E~2, ~0.5E~323) = GREATER compareReal (0.123E~2, ~0.5E~323) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (0.22250738585072014E~307, 0.123E4) = LESS compareReal (0.22250738585072014E~307, 0.123E4) = LESS compare (0.22250738585072014E~307, 0.123E2) = LESS compareReal (0.22250738585072014E~307, 0.123E2) = LESS compare (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (0.22250738585072014E~307, 0.123E1) = LESS compareReal (0.22250738585072014E~307, 0.123E1) = LESS compare (0.22250738585072014E~307, 0.123) = LESS compareReal (0.22250738585072014E~307, 0.123) = LESS compare (0.22250738585072014E~307, 0.123E~2) = LESS compareReal (0.22250738585072014E~307, 0.123E~2) = LESS compare (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compareReal (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compare (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, 0.5E~323) = GREATER compareReal (0.22250738585072014E~307, 0.5E~323) = GREATER compare (0.22250738585072014E~307, 0.0) = GREATER compareReal (0.22250738585072014E~307, 0.0) = GREATER compare (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (0.22250738585072014E~307, ~0.123E4) = GREATER compare (0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E2) = GREATER compare (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (0.22250738585072014E~307, ~0.123E1) = GREATER compare (0.22250738585072014E~307, ~0.123) = GREATER compareReal (0.22250738585072014E~307, ~0.123) = GREATER compare (0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E~2) = GREATER compare (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compare (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, ~0.5E~323) = GREATER compareReal (0.22250738585072014E~307, ~0.5E~323) = GREATER compare (0.22250738585072014E~307, ~0.0) = GREATER compareReal (0.22250738585072014E~307, ~0.0) = GREATER compare (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (0.11125369292536007E~307, 0.123E4) = LESS compareReal (0.11125369292536007E~307, 0.123E4) = LESS compare (0.11125369292536007E~307, 0.123E2) = LESS compareReal (0.11125369292536007E~307, 0.123E2) = LESS compare (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (0.11125369292536007E~307, 0.123E1) = LESS compareReal (0.11125369292536007E~307, 0.123E1) = LESS compare (0.11125369292536007E~307, 0.123) = LESS compareReal (0.11125369292536007E~307, 0.123) = LESS compare (0.11125369292536007E~307, 0.123E~2) = LESS compareReal (0.11125369292536007E~307, 0.123E~2) = LESS compare (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compareReal (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compare (0.11125369292536007E~307, 0.5E~323) = GREATER compareReal (0.11125369292536007E~307, 0.5E~323) = GREATER compare (0.11125369292536007E~307, 0.0) = GREATER compareReal (0.11125369292536007E~307, 0.0) = GREATER compare (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (0.11125369292536007E~307, ~0.123E4) = GREATER compare (0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E2) = GREATER compare (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (0.11125369292536007E~307, ~0.123E1) = GREATER compare (0.11125369292536007E~307, ~0.123) = GREATER compareReal (0.11125369292536007E~307, ~0.123) = GREATER compare (0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E~2) = GREATER compare (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compare (0.11125369292536007E~307, ~0.5E~323) = GREATER compareReal (0.11125369292536007E~307, ~0.5E~323) = GREATER compare (0.11125369292536007E~307, ~0.0) = GREATER compareReal (0.11125369292536007E~307, ~0.0) = GREATER compare (0.5E~323, 0.17976931348623157E309) = LESS compareReal (0.5E~323, 0.17976931348623157E309) = LESS compare (0.5E~323, 0.8988465674311579E308) = LESS compareReal (0.5E~323, 0.8988465674311579E308) = LESS compare (0.5E~323, 0.123E4) = LESS compareReal (0.5E~323, 0.123E4) = LESS compare (0.5E~323, 0.123E2) = LESS compareReal (0.5E~323, 0.123E2) = LESS compare (0.5E~323, 0.3141592653589793E1) = LESS compareReal (0.5E~323, 0.3141592653589793E1) = LESS compare (0.5E~323, 0.2718281828459045E1) = LESS compareReal (0.5E~323, 0.2718281828459045E1) = LESS compare (0.5E~323, 0.123E1) = LESS compareReal (0.5E~323, 0.123E1) = LESS compare (0.5E~323, 0.123) = LESS compareReal (0.5E~323, 0.123) = LESS compare (0.5E~323, 0.123E~2) = LESS compareReal (0.5E~323, 0.123E~2) = LESS compare (0.5E~323, 0.22250738585072014E~307) = LESS compareReal (0.5E~323, 0.22250738585072014E~307) = LESS compare (0.5E~323, 0.11125369292536007E~307) = LESS compareReal (0.5E~323, 0.11125369292536007E~307) = LESS compare (0.5E~323, 0.5E~323) = EQUAL compareReal (0.5E~323, 0.5E~323) = EQUAL compare (0.5E~323, 0.0) = GREATER compareReal (0.5E~323, 0.0) = GREATER compare (0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (0.5E~323, ~0.17976931348623157E309) = GREATER compare (0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (0.5E~323, ~0.8988465674311579E308) = GREATER compare (0.5E~323, ~0.123E4) = GREATER compareReal (0.5E~323, ~0.123E4) = GREATER compare (0.5E~323, ~0.123E2) = GREATER compareReal (0.5E~323, ~0.123E2) = GREATER compare (0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (0.5E~323, ~0.3141592653589793E1) = GREATER compare (0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (0.5E~323, ~0.2718281828459045E1) = GREATER compare (0.5E~323, ~0.123E1) = GREATER compareReal (0.5E~323, ~0.123E1) = GREATER compare (0.5E~323, ~0.123) = GREATER compareReal (0.5E~323, ~0.123) = GREATER compare (0.5E~323, ~0.123E~2) = GREATER compareReal (0.5E~323, ~0.123E~2) = GREATER compare (0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (0.5E~323, ~0.22250738585072014E~307) = GREATER compare (0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (0.5E~323, ~0.11125369292536007E~307) = GREATER compare (0.5E~323, ~0.5E~323) = GREATER compareReal (0.5E~323, ~0.5E~323) = GREATER compare (0.5E~323, ~0.0) = GREATER compareReal (0.5E~323, ~0.0) = GREATER compare (0.0, 0.17976931348623157E309) = LESS compareReal (0.0, 0.17976931348623157E309) = LESS compare (0.0, 0.8988465674311579E308) = LESS compareReal (0.0, 0.8988465674311579E308) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.3141592653589793E1) = LESS compareReal (0.0, 0.3141592653589793E1) = LESS compare (0.0, 0.2718281828459045E1) = LESS compareReal (0.0, 0.2718281828459045E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.22250738585072014E~307) = LESS compareReal (0.0, 0.22250738585072014E~307) = LESS compare (0.0, 0.11125369292536007E~307) = LESS compareReal (0.0, 0.11125369292536007E~307) = LESS compare (0.0, 0.5E~323) = LESS compareReal (0.0, 0.5E~323) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.17976931348623157E309) = GREATER compareReal (0.0, ~0.17976931348623157E309) = GREATER compare (0.0, ~0.8988465674311579E308) = GREATER compareReal (0.0, ~0.8988465674311579E308) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.3141592653589793E1) = GREATER compareReal (0.0, ~0.3141592653589793E1) = GREATER compare (0.0, ~0.2718281828459045E1) = GREATER compareReal (0.0, ~0.2718281828459045E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.22250738585072014E~307) = GREATER compareReal (0.0, ~0.22250738585072014E~307) = GREATER compare (0.0, ~0.11125369292536007E~307) = GREATER compareReal (0.0, ~0.11125369292536007E~307) = GREATER compare (0.0, ~0.5E~323) = GREATER compareReal (0.0, ~0.5E~323) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compareReal (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compare (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, 0.123E4) = LESS compareReal (~0.17976931348623157E309, 0.123E4) = LESS compare (~0.17976931348623157E309, 0.123E2) = LESS compareReal (~0.17976931348623157E309, 0.123E2) = LESS compare (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, 0.123E1) = LESS compareReal (~0.17976931348623157E309, 0.123E1) = LESS compare (~0.17976931348623157E309, 0.123) = LESS compareReal (~0.17976931348623157E309, 0.123) = LESS compare (~0.17976931348623157E309, 0.123E~2) = LESS compareReal (~0.17976931348623157E309, 0.123E~2) = LESS compare (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, 0.5E~323) = LESS compareReal (~0.17976931348623157E309, 0.5E~323) = LESS compare (~0.17976931348623157E309, 0.0) = LESS compareReal (~0.17976931348623157E309, 0.0) = LESS compare (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compareReal (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compare (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, ~0.123E4) = LESS compareReal (~0.17976931348623157E309, ~0.123E4) = LESS compare (~0.17976931348623157E309, ~0.123E2) = LESS compareReal (~0.17976931348623157E309, ~0.123E2) = LESS compare (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, ~0.123E1) = LESS compareReal (~0.17976931348623157E309, ~0.123E1) = LESS compare (~0.17976931348623157E309, ~0.123) = LESS compareReal (~0.17976931348623157E309, ~0.123) = LESS compare (~0.17976931348623157E309, ~0.123E~2) = LESS compareReal (~0.17976931348623157E309, ~0.123E~2) = LESS compare (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, ~0.5E~323) = LESS compareReal (~0.17976931348623157E309, ~0.5E~323) = LESS compare (~0.17976931348623157E309, ~0.0) = LESS compareReal (~0.17976931348623157E309, ~0.0) = LESS compare (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compareReal (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compare (~0.8988465674311579E308, 0.123E4) = LESS compareReal (~0.8988465674311579E308, 0.123E4) = LESS compare (~0.8988465674311579E308, 0.123E2) = LESS compareReal (~0.8988465674311579E308, 0.123E2) = LESS compare (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, 0.123E1) = LESS compareReal (~0.8988465674311579E308, 0.123E1) = LESS compare (~0.8988465674311579E308, 0.123) = LESS compareReal (~0.8988465674311579E308, 0.123) = LESS compare (~0.8988465674311579E308, 0.123E~2) = LESS compareReal (~0.8988465674311579E308, 0.123E~2) = LESS compare (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, 0.5E~323) = LESS compareReal (~0.8988465674311579E308, 0.5E~323) = LESS compare (~0.8988465674311579E308, 0.0) = LESS compareReal (~0.8988465674311579E308, 0.0) = LESS compare (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compareReal (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compare (~0.8988465674311579E308, ~0.123E4) = LESS compareReal (~0.8988465674311579E308, ~0.123E4) = LESS compare (~0.8988465674311579E308, ~0.123E2) = LESS compareReal (~0.8988465674311579E308, ~0.123E2) = LESS compare (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, ~0.123E1) = LESS compareReal (~0.8988465674311579E308, ~0.123E1) = LESS compare (~0.8988465674311579E308, ~0.123) = LESS compareReal (~0.8988465674311579E308, ~0.123) = LESS compare (~0.8988465674311579E308, ~0.123E~2) = LESS compareReal (~0.8988465674311579E308, ~0.123E~2) = LESS compare (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, ~0.5E~323) = LESS compareReal (~0.8988465674311579E308, ~0.5E~323) = LESS compare (~0.8988465674311579E308, ~0.0) = LESS compareReal (~0.8988465674311579E308, ~0.0) = LESS compare (~0.123E4, 0.17976931348623157E309) = LESS compareReal (~0.123E4, 0.17976931348623157E309) = LESS compare (~0.123E4, 0.8988465674311579E308) = LESS compareReal (~0.123E4, 0.8988465674311579E308) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.3141592653589793E1) = LESS compareReal (~0.123E4, 0.3141592653589793E1) = LESS compare (~0.123E4, 0.2718281828459045E1) = LESS compareReal (~0.123E4, 0.2718281828459045E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.22250738585072014E~307) = LESS compareReal (~0.123E4, 0.22250738585072014E~307) = LESS compare (~0.123E4, 0.11125369292536007E~307) = LESS compareReal (~0.123E4, 0.11125369292536007E~307) = LESS compare (~0.123E4, 0.5E~323) = LESS compareReal (~0.123E4, 0.5E~323) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.17976931348623157E309) = GREATER compareReal (~0.123E4, ~0.17976931348623157E309) = GREATER compare (~0.123E4, ~0.8988465674311579E308) = GREATER compareReal (~0.123E4, ~0.8988465674311579E308) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.3141592653589793E1) = LESS compareReal (~0.123E4, ~0.3141592653589793E1) = LESS compare (~0.123E4, ~0.2718281828459045E1) = LESS compareReal (~0.123E4, ~0.2718281828459045E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.22250738585072014E~307) = LESS compareReal (~0.123E4, ~0.22250738585072014E~307) = LESS compare (~0.123E4, ~0.11125369292536007E~307) = LESS compareReal (~0.123E4, ~0.11125369292536007E~307) = LESS compare (~0.123E4, ~0.5E~323) = LESS compareReal (~0.123E4, ~0.5E~323) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.17976931348623157E309) = LESS compareReal (~0.123E2, 0.17976931348623157E309) = LESS compare (~0.123E2, 0.8988465674311579E308) = LESS compareReal (~0.123E2, 0.8988465674311579E308) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.3141592653589793E1) = LESS compareReal (~0.123E2, 0.3141592653589793E1) = LESS compare (~0.123E2, 0.2718281828459045E1) = LESS compareReal (~0.123E2, 0.2718281828459045E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.22250738585072014E~307) = LESS compareReal (~0.123E2, 0.22250738585072014E~307) = LESS compare (~0.123E2, 0.11125369292536007E~307) = LESS compareReal (~0.123E2, 0.11125369292536007E~307) = LESS compare (~0.123E2, 0.5E~323) = LESS compareReal (~0.123E2, 0.5E~323) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E2, ~0.17976931348623157E309) = GREATER compare (~0.123E2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E2, ~0.8988465674311579E308) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.3141592653589793E1) = LESS compareReal (~0.123E2, ~0.3141592653589793E1) = LESS compare (~0.123E2, ~0.2718281828459045E1) = LESS compareReal (~0.123E2, ~0.2718281828459045E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E2, ~0.22250738585072014E~307) = LESS compare (~0.123E2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E2, ~0.11125369292536007E~307) = LESS compare (~0.123E2, ~0.5E~323) = LESS compareReal (~0.123E2, ~0.5E~323) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (~0.3141592653589793E1, 0.123E4) = LESS compareReal (~0.3141592653589793E1, 0.123E4) = LESS compare (~0.3141592653589793E1, 0.123E2) = LESS compareReal (~0.3141592653589793E1, 0.123E2) = LESS compare (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compareReal (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compare (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, 0.123E1) = LESS compareReal (~0.3141592653589793E1, 0.123E1) = LESS compare (~0.3141592653589793E1, 0.123) = LESS compareReal (~0.3141592653589793E1, 0.123) = LESS compare (~0.3141592653589793E1, 0.123E~2) = LESS compareReal (~0.3141592653589793E1, 0.123E~2) = LESS compare (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, 0.5E~323) = LESS compareReal (~0.3141592653589793E1, 0.5E~323) = LESS compare (~0.3141592653589793E1, 0.0) = LESS compareReal (~0.3141592653589793E1, 0.0) = LESS compare (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (~0.3141592653589793E1, ~0.123E4) = GREATER compareReal (~0.3141592653589793E1, ~0.123E4) = GREATER compare (~0.3141592653589793E1, ~0.123E2) = GREATER compareReal (~0.3141592653589793E1, ~0.123E2) = GREATER compare (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compareReal (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compare (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, ~0.123E1) = LESS compareReal (~0.3141592653589793E1, ~0.123E1) = LESS compare (~0.3141592653589793E1, ~0.123) = LESS compareReal (~0.3141592653589793E1, ~0.123) = LESS compare (~0.3141592653589793E1, ~0.123E~2) = LESS compareReal (~0.3141592653589793E1, ~0.123E~2) = LESS compare (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, ~0.5E~323) = LESS compareReal (~0.3141592653589793E1, ~0.5E~323) = LESS compare (~0.3141592653589793E1, ~0.0) = LESS compareReal (~0.3141592653589793E1, ~0.0) = LESS compare (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (~0.2718281828459045E1, 0.123E4) = LESS compareReal (~0.2718281828459045E1, 0.123E4) = LESS compare (~0.2718281828459045E1, 0.123E2) = LESS compareReal (~0.2718281828459045E1, 0.123E2) = LESS compare (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compareReal (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compare (~0.2718281828459045E1, 0.123E1) = LESS compareReal (~0.2718281828459045E1, 0.123E1) = LESS compare (~0.2718281828459045E1, 0.123) = LESS compareReal (~0.2718281828459045E1, 0.123) = LESS compare (~0.2718281828459045E1, 0.123E~2) = LESS compareReal (~0.2718281828459045E1, 0.123E~2) = LESS compare (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, 0.5E~323) = LESS compareReal (~0.2718281828459045E1, 0.5E~323) = LESS compare (~0.2718281828459045E1, 0.0) = LESS compareReal (~0.2718281828459045E1, 0.0) = LESS compare (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (~0.2718281828459045E1, ~0.123E4) = GREATER compareReal (~0.2718281828459045E1, ~0.123E4) = GREATER compare (~0.2718281828459045E1, ~0.123E2) = GREATER compareReal (~0.2718281828459045E1, ~0.123E2) = GREATER compare (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compareReal (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compare (~0.2718281828459045E1, ~0.123E1) = LESS compareReal (~0.2718281828459045E1, ~0.123E1) = LESS compare (~0.2718281828459045E1, ~0.123) = LESS compareReal (~0.2718281828459045E1, ~0.123) = LESS compare (~0.2718281828459045E1, ~0.123E~2) = LESS compareReal (~0.2718281828459045E1, ~0.123E~2) = LESS compare (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, ~0.5E~323) = LESS compareReal (~0.2718281828459045E1, ~0.5E~323) = LESS compare (~0.2718281828459045E1, ~0.0) = LESS compareReal (~0.2718281828459045E1, ~0.0) = LESS compare (~0.123E1, 0.17976931348623157E309) = LESS compareReal (~0.123E1, 0.17976931348623157E309) = LESS compare (~0.123E1, 0.8988465674311579E308) = LESS compareReal (~0.123E1, 0.8988465674311579E308) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.3141592653589793E1) = LESS compareReal (~0.123E1, 0.3141592653589793E1) = LESS compare (~0.123E1, 0.2718281828459045E1) = LESS compareReal (~0.123E1, 0.2718281828459045E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.22250738585072014E~307) = LESS compareReal (~0.123E1, 0.22250738585072014E~307) = LESS compare (~0.123E1, 0.11125369292536007E~307) = LESS compareReal (~0.123E1, 0.11125369292536007E~307) = LESS compare (~0.123E1, 0.5E~323) = LESS compareReal (~0.123E1, 0.5E~323) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.17976931348623157E309) = GREATER compareReal (~0.123E1, ~0.17976931348623157E309) = GREATER compare (~0.123E1, ~0.8988465674311579E308) = GREATER compareReal (~0.123E1, ~0.8988465674311579E308) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.3141592653589793E1) = GREATER compareReal (~0.123E1, ~0.3141592653589793E1) = GREATER compare (~0.123E1, ~0.2718281828459045E1) = GREATER compareReal (~0.123E1, ~0.2718281828459045E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.22250738585072014E~307) = LESS compareReal (~0.123E1, ~0.22250738585072014E~307) = LESS compare (~0.123E1, ~0.11125369292536007E~307) = LESS compareReal (~0.123E1, ~0.11125369292536007E~307) = LESS compare (~0.123E1, ~0.5E~323) = LESS compareReal (~0.123E1, ~0.5E~323) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.17976931348623157E309) = LESS compareReal (~0.123, 0.17976931348623157E309) = LESS compare (~0.123, 0.8988465674311579E308) = LESS compareReal (~0.123, 0.8988465674311579E308) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.3141592653589793E1) = LESS compareReal (~0.123, 0.3141592653589793E1) = LESS compare (~0.123, 0.2718281828459045E1) = LESS compareReal (~0.123, 0.2718281828459045E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.22250738585072014E~307) = LESS compareReal (~0.123, 0.22250738585072014E~307) = LESS compare (~0.123, 0.11125369292536007E~307) = LESS compareReal (~0.123, 0.11125369292536007E~307) = LESS compare (~0.123, 0.5E~323) = LESS compareReal (~0.123, 0.5E~323) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.17976931348623157E309) = GREATER compareReal (~0.123, ~0.17976931348623157E309) = GREATER compare (~0.123, ~0.8988465674311579E308) = GREATER compareReal (~0.123, ~0.8988465674311579E308) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.3141592653589793E1) = GREATER compareReal (~0.123, ~0.3141592653589793E1) = GREATER compare (~0.123, ~0.2718281828459045E1) = GREATER compareReal (~0.123, ~0.2718281828459045E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.22250738585072014E~307) = LESS compareReal (~0.123, ~0.22250738585072014E~307) = LESS compare (~0.123, ~0.11125369292536007E~307) = LESS compareReal (~0.123, ~0.11125369292536007E~307) = LESS compare (~0.123, ~0.5E~323) = LESS compareReal (~0.123, ~0.5E~323) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.17976931348623157E309) = LESS compareReal (~0.123E~2, 0.17976931348623157E309) = LESS compare (~0.123E~2, 0.8988465674311579E308) = LESS compareReal (~0.123E~2, 0.8988465674311579E308) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.3141592653589793E1) = LESS compareReal (~0.123E~2, 0.3141592653589793E1) = LESS compare (~0.123E~2, 0.2718281828459045E1) = LESS compareReal (~0.123E~2, 0.2718281828459045E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.22250738585072014E~307) = LESS compareReal (~0.123E~2, 0.22250738585072014E~307) = LESS compare (~0.123E~2, 0.11125369292536007E~307) = LESS compareReal (~0.123E~2, 0.11125369292536007E~307) = LESS compare (~0.123E~2, 0.5E~323) = LESS compareReal (~0.123E~2, 0.5E~323) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E~2, ~0.17976931348623157E309) = GREATER compare (~0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E~2, ~0.8988465674311579E308) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (~0.123E~2, ~0.3141592653589793E1) = GREATER compare (~0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (~0.123E~2, ~0.2718281828459045E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E~2, ~0.22250738585072014E~307) = LESS compare (~0.123E~2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E~2, ~0.11125369292536007E~307) = LESS compare (~0.123E~2, ~0.5E~323) = LESS compareReal (~0.123E~2, ~0.5E~323) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (~0.22250738585072014E~307, 0.123E4) = LESS compareReal (~0.22250738585072014E~307, 0.123E4) = LESS compare (~0.22250738585072014E~307, 0.123E2) = LESS compareReal (~0.22250738585072014E~307, 0.123E2) = LESS compare (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (~0.22250738585072014E~307, 0.123E1) = LESS compareReal (~0.22250738585072014E~307, 0.123E1) = LESS compare (~0.22250738585072014E~307, 0.123) = LESS compareReal (~0.22250738585072014E~307, 0.123) = LESS compare (~0.22250738585072014E~307, 0.123E~2) = LESS compareReal (~0.22250738585072014E~307, 0.123E~2) = LESS compare (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compareReal (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compare (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, 0.5E~323) = LESS compareReal (~0.22250738585072014E~307, 0.5E~323) = LESS compare (~0.22250738585072014E~307, 0.0) = LESS compareReal (~0.22250738585072014E~307, 0.0) = LESS compare (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (~0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E4) = GREATER compare (~0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E2) = GREATER compare (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (~0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E1) = GREATER compare (~0.22250738585072014E~307, ~0.123) = GREATER compareReal (~0.22250738585072014E~307, ~0.123) = GREATER compare (~0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E~2) = GREATER compare (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compareReal (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compare (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, ~0.5E~323) = LESS compareReal (~0.22250738585072014E~307, ~0.5E~323) = LESS compare (~0.22250738585072014E~307, ~0.0) = LESS compareReal (~0.22250738585072014E~307, ~0.0) = LESS compare (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (~0.11125369292536007E~307, 0.123E4) = LESS compareReal (~0.11125369292536007E~307, 0.123E4) = LESS compare (~0.11125369292536007E~307, 0.123E2) = LESS compareReal (~0.11125369292536007E~307, 0.123E2) = LESS compare (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (~0.11125369292536007E~307, 0.123E1) = LESS compareReal (~0.11125369292536007E~307, 0.123E1) = LESS compare (~0.11125369292536007E~307, 0.123) = LESS compareReal (~0.11125369292536007E~307, 0.123) = LESS compare (~0.11125369292536007E~307, 0.123E~2) = LESS compareReal (~0.11125369292536007E~307, 0.123E~2) = LESS compare (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compareReal (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compare (~0.11125369292536007E~307, 0.5E~323) = LESS compareReal (~0.11125369292536007E~307, 0.5E~323) = LESS compare (~0.11125369292536007E~307, 0.0) = LESS compareReal (~0.11125369292536007E~307, 0.0) = LESS compare (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (~0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E4) = GREATER compare (~0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E2) = GREATER compare (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (~0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E1) = GREATER compare (~0.11125369292536007E~307, ~0.123) = GREATER compareReal (~0.11125369292536007E~307, ~0.123) = GREATER compare (~0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E~2) = GREATER compare (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compareReal (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compare (~0.11125369292536007E~307, ~0.5E~323) = LESS compareReal (~0.11125369292536007E~307, ~0.5E~323) = LESS compare (~0.11125369292536007E~307, ~0.0) = LESS compareReal (~0.11125369292536007E~307, ~0.0) = LESS compare (~0.5E~323, 0.17976931348623157E309) = LESS compareReal (~0.5E~323, 0.17976931348623157E309) = LESS compare (~0.5E~323, 0.8988465674311579E308) = LESS compareReal (~0.5E~323, 0.8988465674311579E308) = LESS compare (~0.5E~323, 0.123E4) = LESS compareReal (~0.5E~323, 0.123E4) = LESS compare (~0.5E~323, 0.123E2) = LESS compareReal (~0.5E~323, 0.123E2) = LESS compare (~0.5E~323, 0.3141592653589793E1) = LESS compareReal (~0.5E~323, 0.3141592653589793E1) = LESS compare (~0.5E~323, 0.2718281828459045E1) = LESS compareReal (~0.5E~323, 0.2718281828459045E1) = LESS compare (~0.5E~323, 0.123E1) = LESS compareReal (~0.5E~323, 0.123E1) = LESS compare (~0.5E~323, 0.123) = LESS compareReal (~0.5E~323, 0.123) = LESS compare (~0.5E~323, 0.123E~2) = LESS compareReal (~0.5E~323, 0.123E~2) = LESS compare (~0.5E~323, 0.22250738585072014E~307) = LESS compareReal (~0.5E~323, 0.22250738585072014E~307) = LESS compare (~0.5E~323, 0.11125369292536007E~307) = LESS compareReal (~0.5E~323, 0.11125369292536007E~307) = LESS compare (~0.5E~323, 0.5E~323) = LESS compareReal (~0.5E~323, 0.5E~323) = LESS compare (~0.5E~323, 0.0) = LESS compareReal (~0.5E~323, 0.0) = LESS compare (~0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (~0.5E~323, ~0.17976931348623157E309) = GREATER compare (~0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (~0.5E~323, ~0.8988465674311579E308) = GREATER compare (~0.5E~323, ~0.123E4) = GREATER compareReal (~0.5E~323, ~0.123E4) = GREATER compare (~0.5E~323, ~0.123E2) = GREATER compareReal (~0.5E~323, ~0.123E2) = GREATER compare (~0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (~0.5E~323, ~0.3141592653589793E1) = GREATER compare (~0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (~0.5E~323, ~0.2718281828459045E1) = GREATER compare (~0.5E~323, ~0.123E1) = GREATER compareReal (~0.5E~323, ~0.123E1) = GREATER compare (~0.5E~323, ~0.123) = GREATER compareReal (~0.5E~323, ~0.123) = GREATER compare (~0.5E~323, ~0.123E~2) = GREATER compareReal (~0.5E~323, ~0.123E~2) = GREATER compare (~0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (~0.5E~323, ~0.22250738585072014E~307) = GREATER compare (~0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (~0.5E~323, ~0.11125369292536007E~307) = GREATER compare (~0.5E~323, ~0.5E~323) = EQUAL compareReal (~0.5E~323, ~0.5E~323) = EQUAL compare (~0.5E~323, ~0.0) = LESS compareReal (~0.5E~323, ~0.0) = LESS compare (~0.0, 0.17976931348623157E309) = LESS compareReal (~0.0, 0.17976931348623157E309) = LESS compare (~0.0, 0.8988465674311579E308) = LESS compareReal (~0.0, 0.8988465674311579E308) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.3141592653589793E1) = LESS compareReal (~0.0, 0.3141592653589793E1) = LESS compare (~0.0, 0.2718281828459045E1) = LESS compareReal (~0.0, 0.2718281828459045E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.22250738585072014E~307) = LESS compareReal (~0.0, 0.22250738585072014E~307) = LESS compare (~0.0, 0.11125369292536007E~307) = LESS compareReal (~0.0, 0.11125369292536007E~307) = LESS compare (~0.0, 0.5E~323) = LESS compareReal (~0.0, 0.5E~323) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.17976931348623157E309) = GREATER compareReal (~0.0, ~0.17976931348623157E309) = GREATER compare (~0.0, ~0.8988465674311579E308) = GREATER compareReal (~0.0, ~0.8988465674311579E308) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.3141592653589793E1) = GREATER compareReal (~0.0, ~0.3141592653589793E1) = GREATER compare (~0.0, ~0.2718281828459045E1) = GREATER compareReal (~0.0, ~0.2718281828459045E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.22250738585072014E~307) = GREATER compareReal (~0.0, ~0.22250738585072014E~307) = GREATER compare (~0.0, ~0.11125369292536007E~307) = GREATER compareReal (~0.0, ~0.11125369292536007E~307) = GREATER compare (~0.0, ~0.5E~323) = GREATER compareReal (~0.0, ~0.5E~323) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20210117+dfsg/regression/real.sml000066400000000000000000000643041416264345000176550ustar00rootroot00000000000000functor Test (structure Real: REAL val size: int) = struct open Real open Math infix == != datatype z = datatype IEEEReal.float_class datatype z = datatype IEEEReal.rounding_mode datatype z = datatype General.order val b2s = Bool.toString val i2s = Int.toString val exact = fmt StringCvt.EXACT val s2r = valOf o fromString val zero = s2r "0.0" val one = s2r "1.0" val two = s2r "2.0" val nan = posInf + negInf val halfMaxFinite = maxFinite / two val halfMinNormalPos = minNormalPos / two val reals = [maxFinite, halfMaxFinite, s2r "1.23E3", s2r "1.23E1", Math.pi, Math.e, s2r "1.23E0", s2r "1.23E~1", s2r "1.23E~3", minNormalPos, halfMinNormalPos, minPos, zero] fun for f = (List.app f reals; List.app (f o ~) reals) val reals' = [posInf, negInf, posInf + negInf, maxFinite * s2r "2.0"] fun for' f = (for f; List.app f reals') val _ = print (concat ["\nTesting Real", Int.toString size, "\n"]) val _ = print "\nTesting fmt\n" val _ = for (fn r => List.app (fn spec => print (concat [fmt spec r, "\n"])) let open StringCvt in [EXACT, SCI NONE, FIX NONE, GEN NONE, SCI (SOME 0), FIX (SOME 0), GEN (SOME 1), SCI (SOME 10), FIX (SOME 10), GEN (SOME 10)] end) val _ = let fun doit (r, s0, s1, s2, s6) = if (fmt (StringCvt.FIX (SOME 0)) r = s0 andalso fmt (StringCvt.FIX (SOME 1)) r = s1 andalso fmt (StringCvt.FIX (SOME 2)) r = s2 andalso fmt (StringCvt.FIX (SOME 6)) r = s6 andalso fmt (StringCvt.FIX NONE) r = s6) then () else print (concat ["fmt FIX bug: ", exact r, "\n", "\t", fmt (StringCvt.FIX (SOME 0)) r, " ", s0, "\n", "\t", fmt (StringCvt.FIX (SOME 1)) r, " ", s1, "\n", "\t", fmt (StringCvt.FIX (SOME 2)) r, " ", s2, "\n", "\t", fmt (StringCvt.FIX (SOME 6)) r, " ", s6, "\n", "\t", fmt (StringCvt.FIX NONE) r, " ", s6, "\n"]) in List.app (fn (r, s0, s1, s2, s6) => (doit (r, s0, s1, s2, s6) ; if r == zero then () else doit (~r, "~"^s0, "~"^s1, "~"^s2, "~"^s6))) [(s2r "0.0", "0", "0.0", "0.00", "0.000000"), (s2r "1.0", "1", "1.0", "1.00", "1.000000"), (s2r "1.4", "1", "1.4", "1.40", "1.400000"), (s2r "1.5", "2", "1.5", "1.50", "1.500000"), (s2r "2.5", "2", "2.5", "2.50", "2.500000"), (s2r "1.6", "2", "1.6", "1.60", "1.600000"), (s2r "3.141592653589", "3", "3.1", "3.14", "3.141593"), (s2r "91827365478400.0", "91827365478400", "91827365478400.0", "91827365478400.00", "91827365478400.000000")] end val _ = let fun doit (r, s0, s1, s2, s6) = if (fmt (StringCvt.SCI (SOME 0)) r = s0 andalso fmt (StringCvt.SCI (SOME 1)) r = s1 andalso fmt (StringCvt.SCI (SOME 2)) r = s2 andalso fmt (StringCvt.SCI (SOME 6)) r = s6 andalso fmt (StringCvt.SCI NONE) r = s6) then () else print (concat ["fmt SCI bug: ", exact r, "\n", "\t", fmt (StringCvt.SCI (SOME 0)) r, " ", s0, "\n", "\t", fmt (StringCvt.SCI (SOME 1)) r, " ", s1, "\n", "\t", fmt (StringCvt.SCI (SOME 2)) r, " ", s2, "\n", "\t", fmt (StringCvt.SCI (SOME 6)) r, " ", s6, "\n", "\t", fmt (StringCvt.SCI NONE) r, " ", s6, "\n"]) in List.app (fn (r, s0, s1, s2, s6) => (doit (r, s0, s1, s2, s6) ; if r == zero then () else doit (~r, "~"^s0, "~"^s1, "~"^s2, "~"^s6))) [(s2r "0.0", "0E0", "0.0E0", "0.00E0", "0.000000E0"), (s2r "0.0012345678", "1E~3", "1.2E~3", "1.23E~3", "1.234568E~3"), (s2r "1.0", "1E0", "1.0E0", "1.00E0", "1.000000E0"), (s2r "1.4", "1E0", "1.4E0", "1.40E0", "1.400000E0"), (s2r "1.5", "2E0", "1.5E0", "1.50E0", "1.500000E0"), (s2r "1.6", "2E0", "1.6E0", "1.60E0", "1.600000E0"), (s2r "3.141592653589", "3E0", "3.1E0", "3.14E0", "3.141593E0"), (s2r "91827365478400.0", "9E13", "9.2E13", "9.18E13", "9.182737E13")] end val _ = let fun doit (r, s1, s2, s6, s12) = if (fmt (StringCvt.GEN (SOME 1)) r = s1 andalso fmt (StringCvt.GEN (SOME 2)) r = s2 andalso fmt (StringCvt.GEN (SOME 6)) r = s6 andalso fmt (StringCvt.GEN (SOME 12)) r = s12 andalso fmt (StringCvt.GEN NONE) r = s12) then () else print (concat ["fmt GEN bug: ", exact r, "\n", "\t", fmt (StringCvt.GEN (SOME 1)) r, " ", s1, "\n", "\t", fmt (StringCvt.GEN (SOME 2)) r, " ", s2, "\n", "\t", fmt (StringCvt.GEN (SOME 6)) r, " ", s6, "\n", "\t", fmt (StringCvt.GEN (SOME 12)) r, " ", s12, "\n", "\t", fmt (StringCvt.GEN NONE) r, " ", s12, "\n"]) in List.app (fn (r, s1, s2, s6, s12) => (doit (r, s1, s2, s6, s12) ; if r == zero then () else doit (~r, "~"^s1, "~"^s2, "~"^s6, "~"^s12))) [(s2r "0.0", "0", "0", "0", "0"), (s2r "1.0", "1", "1", "1", "1"), (s2r "1.5", "2", "1.5", "1.5", "1.5"), (s2r "91827365478400.0", "9E13", "9.2E13", "9.18274E13", "91827365478400")] end val _ = print "\nTesting scan\n" val _ = for' (fn r => let val r' = valOf (StringCvt.scanString scan (exact r)) val _ = print (concat [exact r, "\t", exact r', "\n"]) in if r == r' orelse unordered (r, r') then () else print (concat ["scan bug ", exact r, "\n"]) end) val _ = print "\nTesting checkFloat\n" val _ = for' (fn r => if (case class r of INF => ((checkFloat r; false) handle Overflow => true | _ => false) | NAN => ((checkFloat r; false) handle Div => true | _ => false) | _ => (checkFloat r; true) handle _ => false) then () else print (concat ["checkFloat bug: ", exact r, "\n"])) val _ = print "\nTesting class, isFinite, isNan, isNormal\n" val _ = for' (fn r => let val c = case class r of INF => "inf" | NAN => "nan" | NORMAL => "normal" | SUBNORMAL => "subnormal" | ZERO => "zero" in print (concat [exact r, "\t", c, "\n", "\tisFinite = ", b2s (isFinite r), "\tisNan = ", b2s (isNan r), "\tisNormal = ", b2s (isNormal r), "\n"]) end) val _ = print "\nTesting maxFinite, minPos, minNormalPos\n" local val isNormal = Real.isNormal val isFinite = Real.isFinite val isPositive = fn r => case class r of NORMAL => r > zero | SUBNORMAL => r > zero | INF => r > zero | _ => false fun min (p: real -> bool): real = let fun loop (x: real): real = let val y = x / two in if p y then loop y else x end in loop one end in val minNormalPos = min isNormal val minPos = min isPositive val maxFinite = let fun up (x: real): real = let val y = x * two in if isFinite y then up y else x end fun down (x: real, y: real): real = let val y = y / two val z = x + y in if isFinite z then down (z, y) else x end val z = up one in down (z, z) end end val _ = print ((Real.toString maxFinite) ^ "\n") val _ = print ((Real.toString Real.maxFinite) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.maxFinite, maxFinite))) ^ "\n") val _ = print ((Real.toString minPos) ^ "\n") val _ = print ((Real.toString Real.minPos) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.minPos, minPos))) ^ "\n") val _ = print ((Real.toString minNormalPos) ^ "\n") val _ = print ((Real.toString Real.minNormalPos) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.minNormalPos, minNormalPos))) ^ "\n") val _ = print "\nTestring fromString\n" val _ = List.app (fn (s1, s2) => if valOf (fromString s1) == valOf (fromString s2) then () else print (concat ["fromString bug: ", s1, " ", exact (valOf (fromString s1)), " ", s2, " ", exact (valOf (fromString s2)), "\n"])) [("12.", "12.0"), ("12.E", "12.0"), ("12.E+", "12.0"), ("12.E-", "12.0"), ("12.E2", "12.0"), ("12.E+2", "12.0"), ("12.E-2", "12.0"), ("12E+", "12.0"), ("12E-", "12.0"), ("0", "0.0"), ("156", "156.0"), ("+156", "156.0"), ("~156", "~156.0"), ("-156", "~156.0"), ("156.25", "156.25"), ("+156.25", "156.25"), ("~156.25", "~156.25"), ("-156.25", "~156.25"), (".25", "0.25"), ("+.25", "0.25"), ("~.25", "~0.25"), ("-.25", "~0.25"), ("156E024", "156E024"), ("+156E024", "156E024"), ("~156E024", "~156E024"), ("-156E024", "~156E024"), ("156.25E024", "156.25E024"), ("+156.25E024", "156.25E024"), ("~156.25E024", "~156.25E024"), ("-156.25E024", "~156.25E024"), (".25E024", "0.25E024"), ("+.25E024", "0.25E024"), ("~.25E024", "~0.25E024"), ("-.25E024", "~0.25E024"), ("156E+024", "156E024"), ("+156E+024", "156E024"), ("~156E+024", "~156E024"), ("-156E+024", "~156E024"), ("156.25E+024", "156.25E024"), ("+156.25E+024", "156.25E024"), ("~156.25E+024", "~156.25E024"), ("-156.25E+024", "~156.25E024"), (".25E+024", "0.25E024"), ("+.25E+024", "0.25E024"), ("~.25E+024", "~0.25E024"), ("-.25E+024", "~0.25E024"), ("156E~024", "156E~024"), ("+156E~024", "156E~024"), ("~156E~024", "~156E~024"), ("-156E~024", "~156E~024"), ("156.25E~024", "156.25E~024"), ("+156.25E~024", "156.25E~024"), ("~156.25E~024", "~156.25E~024"), ("-156.25E~024", "~156.25E~024"), (".25E~024", "0.25E~024"), ("+.25E~024", "0.25E~024"), ("~.25E~024", "~0.25E~024"), ("-.25E~024", "~0.25E~024"), ("156E-024", "156E~024"), ("+156E-024", "156E~024"), ("~156E-024", "~156E~024"), ("-156E-024", "~156E~024"), ("156.25E-024", "156.25E~024"), ("+156.25E-024", "156.25E~024"), ("~156.25E-024", "~156.25E~024"), ("-156.25E-024", "~156.25E~024"), (".25E-024", "0.25E~024"), ("+.25E-024", "0.25E~024"), ("~.25E-024", "~0.25E~024"), ("-.25E-024", "~0.25E~024"), ("156e024", "156E024"), ("+156e024", "156E024"), ("~156e024", "~156E024"), ("-156e024", "~156E024"), ("156.25e024", "156.25E024"), ("+156.25e024", "156.25E024"), ("~156.25e024", "~156.25E024"), ("-156.25e024", "~156.25E024"), (".25e024", "0.25E024"), ("+.25e024", "0.25E024"), ("~.25e024", "~0.25E024"), ("-.25e024", "~0.25E024"), ("156e+024", "156E024"), ("+156e+024", "156E024"), ("~156e+024", "~156E024"), ("-156e+024", "~156E024"), ("156.25e+024", "156.25E024"), ("+156.25e+024", "156.25E024"), ("~156.25e+024", "~156.25E024"), ("-156.25e+024", "~156.25E024"), (".25e+024", "0.25E024"), ("+.25e+024", "0.25E024"), ("~.25e+024", "~0.25E024"), ("-.25e+024", "~0.25E024"), ("156e~024", "156E~024"), ("+156e~024", "156E~024"), ("~156e~024", "~156E~024"), ("-156e~024", "~156E~024"), ("156.25e~024", "156.25E~024"), ("+156.25e~024", "156.25E~024"), ("~156.25e~024", "~156.25E~024"), ("-156.25e~024", "~156.25E~024"), (".25e~024", "0.25E~024"), ("+.25e~024", "0.25E~024"), ("~.25e~024", "~0.25E~024"), ("-.25e~024", "~0.25E~024"), ("156e-024", "156E~024"), ("+156e-024", "156E~024"), ("~156e-024", "~156E~024"), ("-156e-024", "~156E~024"), ("156.25e-024", "156.25E~024"), ("+156.25e-024", "156.25E~024"), ("~156.25e-024", "~156.25E~024"), ("-156.25e-024", "~156.25E~024"), (".25e-024", "0.25E~024"), ("+.25e-024", "0.25E~024"), ("~.25e-024", "~0.25E~024"), ("-.25e-024", "~0.25E~024")] val _ = print "\nTesting {from,to}Decimal\n" val _ = List.app (fn r => let val da = valOf (IEEEReal.fromString r) val s1 = IEEEReal.toString da val x = valOf (fromDecimal da) val s2 = exact x val da' = toDecimal x val b = Bool.toString (da = da') in print (concat [s1, " ", s2, " ", b, "\n"]) end) ["inf", "+inF", "~iNf", "-Inf", "infinity", "+infinity", "~infinity", "-infinity", "nan", "+naN", "~nAn", "-Nan", "0", "0.0", "0.0E0", "~0", "15", "1.5", "~1.5e+1", "15.0", ".15e~2", ".15e-2", "000.0015e0", "1.2E999", "~1.2E999", "1E~999", "~1E~999", "1E12345678901234567890"] val _ = print "\nTesting {from,to}LargeInt\n" val _ = for (fn r => let val i = toLargeInt IEEEReal.TO_NEGINF r val r' = fromLargeInt i val _ = print (concat [exact r, "\t", LargeInt.toString i, "\t", exact r', "\n"]) in if r' == realFloor r then () else print (concat ["{from,to}LargeInt bug: ", exact r, "\n"]) end) val roundingModes = [(TO_NEAREST, "nearest"), (TO_NEGINF, "neginf"), (TO_POSINF, "posinf"), (TO_ZERO, "zero")] val _ = let fun doit (x, mode, name) = let val i = toLargeInt mode x in print (concat [name, "\t", exact x, "\t", LargeInt.toString i, "\n"]) end in List.app (fn (mode, name) => List.app (fn s => let val x = s2r s in doit (x, mode, name) ; doit (~ x, mode, name) ; doit (s2r "1E12" + x, mode, name) ; doit (s2r "~1E12" + x, mode, name) end) ["0.0", "0.25", "0.5", "0.75", "1.0", "1.25", "1.5", "1.75", "2.0", "2.5", "3.0"]) roundingModes end val _ = print "\nTesting fromInt\n" val _ = for (fn r => case SOME (round r) handle Overflow => NONE of NONE => () | SOME i => let val r = fromInt i in if r == fromInt (round r) then () else print (concat ["fromInt bug: ", exact r, "\n"]) end) val _ = print "\nTesting toInt\n" val _ = for (fn r => List.app (fn (mode, name) => case SOME (toInt mode r) handle Overflow => NONE of NONE => () | SOME i => if i = LargeInt.toInt (toLargeInt mode r) then () else print (concat ["toInt ", name, " bug: ", exact r, "\n"])) roundingModes) val _ = print "\nTesting ceil,floor,round,trunc\n" val _ = for (fn r => List.app (fn (mode, f, name) => case SOME (toInt mode r) handle Overflow => NONE of NONE => () | SOME i => if i = f r then () else print (concat [name, " bug: ", exact r, "\n"])) [(TO_NEAREST, round, "round"), (TO_NEGINF, floor, "floor"), (TO_POSINF, ceil, "ceil"), (TO_ZERO, trunc, "trunc")]) val _ = print "\nTesting copySign, sameSign, sign, signBit\n" val _ = for' (fn r1 => (for' (fn r2 => if unordered (r1, r2) orelse (if false then print (concat [b2s (signBit r1), "\t", b2s (signBit r2), "\t", i2s (sign r1), "\t", b2s (sameSign (r1, r2)), "\t", exact (copySign (r1, r2)), "\n"]) else () ; (signBit r1 = Int.< (sign r1, 0) orelse r1 == zero) andalso (sameSign (r1, r2)) = (signBit r1 = signBit r2) andalso sameSign (r2, copySign (r1, r2))) then () else print (concat ["copySign,sameSign,sign,signBit bug: ", exact r1, " ", exact r2, "\n"])))) val _ = print "\nTesting max, min\n" val _ = for' (fn r1 => for' (fn r2 => let val max = max (r1, r2) val min = min (r1, r2) in if (isNan r1 orelse (r1 <= max andalso min <= r1)) andalso (isNan r2 orelse (r2 <= max andalso min <= r2)) andalso (r1 == max orelse r2 == max orelse (isNan r1 andalso isNan r2)) andalso (r1 == min orelse r2 == min orelse (isNan r1 andalso isNan r2)) then () else print (concat ["max,min bug: ", exact r1, " ", exact r2, "\n"]) end)) val _ = print "\nTesting Real.{~,*,+,-,/,nextAfter,rem}\n" val _ = for' (fn r => List.app (fn (name, f, except) => if List.exists (fn r' => r == r') except then () else print (concat [name, " (", exact r, ") = ", exact (f r), "\n"])) [("~", ~, []) ]) val _ = for' (fn r1 => for' (fn r2 => List.app (fn (name, f, except) => if List.exists (fn (r1', r2') => r1 == r1' andalso r2 == r2') except then () else print (concat [name, " (", exact r1, ", ", exact r2, ") = ", exact (f (r1, r2)), "\n"])) [("*", op *, []), ("+", op +, []), ("-", op -, []), ("/", op /, []), ("nextAfter", nextAfter, []), ("rem", rem, []) ])) val _ = List.app (fn (r1, r2, name, f, chk) => if chk (f (r1, r2)) then () else print (concat [name, "(", exact r1, ",", exact r2, ") bug: ", exact (f (r1, r2)), "\n"])) [(posInf, posInf, "+", op +, fn x => x == posInf), (negInf, negInf, "+", op +, fn x => x == negInf), (posInf, negInf, "-", op -, fn x => x == posInf), (negInf, posInf, "-", op -, fn x => x == negInf), (nan, one, "+", op +, isNan), (nan, one, "-", op -, isNan), (nan, one, "*", op *, isNan), (nan, one, "/", op /, isNan), (posInf, negInf, "+", op +, isNan), (negInf, posInf, "+", op +, isNan), (posInf, posInf, "-", op -, isNan), (negInf, negInf, "-", op -, isNan)] val _ = print "\nTesting Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow}\n" val _ = for' (fn r => List.app (fn (name, f, except) => if List.exists (fn r' => r == r') except then () else print (concat [name, " (", exact r, ") = ", fmt (StringCvt.GEN (SOME 10)) (f r), "\n"])) let open Real.Math in [("acos", acos, []), ("asin", asin, []), ("atan", atan, []), ("cos", cos, []), ("cosh", cosh, []), ("exp", exp, []), ("ln", ln, []), ("log10", log10, []), ("sin", sin, []), ("sinh", sinh, []), ("sqrt", sqrt, []), ("tan", tan, []), ("tanh", tanh, [])] end) val _ = for' (fn r1 => for' (fn r2 => List.app (fn (name, f, except) => if List.exists (fn (r1', r2') => r1 == r1' andalso r2 == r2') except then () else print (concat [name, " (", exact r1, ", ", exact r2, ") = ", fmt (StringCvt.GEN (SOME 10)) (f (r1, r2)), "\n"])) let open Real.Math in [("atan2", atan2, []), ("pow", pow, [])] end)) val _ = print "\nTesting *+, *-\n" val fmaDiffs = ref false val _ = for (fn r1 => for (fn r2 => for (fn r3 => let val fma = *+ (r1, r2, r3) val std = r1 * r2 + r3 in if fma == std then () else (print o concat) [(if !fmaDiffs then "" else let val _ = fmaDiffs := true in concat["SOME *+ AND STANDARD RESULTS DIFFER\n", "(r1, r2, r3): *+(r1, r2, r3)\t(r1 * r2 + r3)\n", "--------------------------------------------\n"] end), "(", exact r1, ", ", exact r2, ", ", exact r3, "): ", exact fma, "\t", exact std, "\n"] end))) val _ = print "\nTesting Real.{realCeil,realFloor,realTrunc}\n" val _ = for (fn r => let val ceil = realCeil r val floor = realFloor r val trunc = realTrunc r val _ = print (concat [exact r, " ", exact ceil, " ", exact floor, " ", exact trunc, "\n"]) in if floor <= r andalso r <= ceil andalso abs trunc <= abs r then () else print (concat ["Real.{realCeil,realFloor,realTrunc} bug ", exact r, "\n"]) end) val _ = print "\nTesting Real.{<,<=,>,>=,==,!=,?=,unordered}\n" val _ = for (fn r1 => for (fn r2 => let val _ = List.app (fn (f, name) => print (concat [name, " (", exact r1, ", ", exact r2, ") = ", b2s (f (r1, r2)), "\n"])) [(Real.<, "<"), (Real.>, ">"), (Real.==, "=="), (Real.?=, "?=")] in if unordered (r1, r2) = (isNan r1 orelse isNan r2) andalso (r1 != r2) = not (r1 == r2) andalso if unordered (r1, r2) then (false = (r1 <= r2) andalso false = (r1 < r2) andalso false = (r1 >= r2) andalso false = (r1 > r2) andalso false = (r1 == r2) andalso if isNan r1 andalso isNan r2 then true = ?= (r1, r2) else true) else ((r1 < r2) = not (r1 >= r2) andalso (r1 > r2) = not (r1 <= r2)) then () else print (concat ["Real.{<,<=,>,>=,==,!=,?=,unordered} bug: ", exact r1, " ", exact r2, "\n"]) end)) val _ = print "\nTesting compare, compareReal\n" val _ = for (fn r => for (fn r' => let val c = case SOME (compare (r, r')) handle IEEEReal.Unordered => NONE of NONE => "Unordered" | SOME z => case z of EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" datatype z = datatype IEEEReal.real_order val cr = case compareReal (r, r') of EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" | UNORDERED => "UNORDERED" val _ = print (concat ["compare (", exact r, ", ", exact r', ") = ", c, "\n"]) val _ = print (concat ["compareReal (", exact r, ", ", exact r', ") = ", cr, "\n"]) in if compareReal (r, r') = (case compareReal (r', r) of EQUAL => EQUAL | GREATER => LESS | LESS => GREATER | UNORDERED => UNORDERED) then () else print (concat ["compareReal bug: ", exact r, " ", exact r', "\n"]) end)) val _ = print "\nTesting abs\n" val _ = for (fn r => if abs r == abs (~ r) then () else print (concat ["abs bug: ", exact r, "\n"])) val _ = print "\nTesting {from,to}ManExp\n" val _ = for (fn x => if List.exists (fn y => x == y) [halfMinNormalPos, minPos, ~halfMinNormalPos, ~minPos] then () else let val {exp, man} = toManExp x val _ = if true then print (concat [exact x, " = ", exact man, " * 2^", i2s exp, "\n"]) else () val x' = fromManExp {exp = exp, man = man} val _ = if true then print (concat ["\t = ", exact x', "\n"]) else () in if x == x' then () else print (concat ["{from,to}ManExp bug: ", exact x, "\n"]) end) val _ = print "\nTesting split\n" val _ = for (fn r => let val {whole, frac} = split r val _ = if false then print (concat ["split ", exact r, " = {whole = ", exact whole, ", frac = ", exact frac, "}\n", "realMod ", exact whole, " = ", exact (realMod whole), "\t", b2s (sameSign (r, whole)), "\t", b2s (sameSign (r, frac)), "\n"]) else () in if realMod r == frac andalso realMod whole == zero andalso abs frac < one andalso sameSign (r, whole) andalso sameSign (r, frac) andalso (case class r of INF => whole == r andalso frac == zero | NAN => isNan whole andalso isNan frac | _ => r == whole + frac) then () else print (concat ["split bug: ", exact r, "\n"]) end) val _ = print "\nTesting {from,to}Large\n" val _ = for (fn r => if r == fromLarge TO_NEAREST (toLarge r) then () else print (concat ["{from,to}Large bug: ", exact r, "\n"])) end structure Z = Test (structure Real = Real32 val size = 32) structure Z = Test (structure Real = Real64 val size = 64) mlton-20210117+dfsg/regression/real.x86-linux.ok000066400000000000000000104574611416264345000212670ustar00rootroot00000000000000 Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1E13 999999995904 nearest ~0.1E13 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1E13 999999995904 neginf ~0.1E13 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1E13 999999995904 posinf ~0.1E13 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1E13 999999995904 zero ~0.1E13 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.34028235E39) = ~0.34028235E39 ~ (0.17014117E39) = ~0.17014117E39 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.31415927E1) = ~0.31415927E1 ~ (0.27182817E1) = ~0.27182817E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.11754944E~37) = ~0.11754944E~37 ~ (0.5877472E~38) = ~0.5877472E~38 ~ (0.1E~44) = ~0.1E~44 ~ (0.0) = ~0.0 ~ (~0.34028235E39) = 0.34028235E39 ~ (~0.17014117E39) = 0.17014117E39 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.31415927E1) = 0.31415927E1 ~ (~0.27182817E1) = 0.27182817E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.11754944E~37) = 0.11754944E~37 ~ (~0.5877472E~38) = 0.5877472E~38 ~ (~0.1E~44) = 0.1E~44 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.34028235E39, 0.34028235E39) = inf + (0.34028235E39, 0.34028235E39) = inf - (0.34028235E39, 0.34028235E39) = 0.0 / (0.34028235E39, 0.34028235E39) = 0.1E1 nextAfter (0.34028235E39, 0.34028235E39) = 0.34028235E39 rem (0.34028235E39, 0.34028235E39) = 0.0 * (0.34028235E39, 0.17014117E39) = inf + (0.34028235E39, 0.17014117E39) = inf - (0.34028235E39, 0.17014117E39) = 0.17014117E39 / (0.34028235E39, 0.17014117E39) = 0.2E1 nextAfter (0.34028235E39, 0.17014117E39) = 0.34028233E39 rem (0.34028235E39, 0.17014117E39) = 0.0 * (0.34028235E39, 0.123E4) = inf + (0.34028235E39, 0.123E4) = 0.34028235E39 - (0.34028235E39, 0.123E4) = 0.34028235E39 / (0.34028235E39, 0.123E4) = 0.2766523E36 nextAfter (0.34028235E39, 0.123E4) = 0.34028233E39 rem (0.34028235E39, 0.123E4) = 0.11884224E32 * (0.34028235E39, 0.123E2) = inf + (0.34028235E39, 0.123E2) = 0.34028235E39 - (0.34028235E39, 0.123E2) = 0.34028235E39 / (0.34028235E39, 0.123E2) = 0.27665232E38 nextAfter (0.34028235E39, 0.123E2) = 0.34028233E39 rem (0.34028235E39, 0.123E2) = ~0.12882628E32 * (0.34028235E39, 0.31415927E1) = inf + (0.34028235E39, 0.31415927E1) = 0.34028235E39 - (0.34028235E39, 0.31415927E1) = 0.34028235E39 / (0.34028235E39, 0.31415927E1) = 0.10831523E39 nextAfter (0.34028235E39, 0.31415927E1) = 0.34028233E39 rem (0.34028235E39, 0.31415927E1) = 0.15835598E32 * (0.34028235E39, 0.27182817E1) = inf + (0.34028235E39, 0.27182817E1) = 0.34028235E39 - (0.34028235E39, 0.27182817E1) = 0.34028235E39 / (0.34028235E39, 0.27182817E1) = 0.12518288E39 nextAfter (0.34028235E39, 0.27182817E1) = 0.34028233E39 rem (0.34028235E39, 0.27182817E1) = 0.9154518E31 * (0.34028235E39, 0.123E1) = inf + (0.34028235E39, 0.123E1) = 0.34028235E39 - (0.34028235E39, 0.123E1) = 0.34028235E39 / (0.34028235E39, 0.123E1) = 0.27665231E39 nextAfter (0.34028235E39, 0.123E1) = 0.34028233E39 rem (0.34028235E39, 0.123E1) = ~0.40894575E30 * (0.34028235E39, 0.123) = 0.4185473E38 + (0.34028235E39, 0.123) = 0.34028235E39 - (0.34028235E39, 0.123) = 0.34028235E39 / (0.34028235E39, 0.123) = inf nextAfter (0.34028235E39, 0.123) = 0.34028233E39 rem (0.34028235E39, 0.123) = ~inf * (0.34028235E39, 0.123E~2) = 0.4185473E36 + (0.34028235E39, 0.123E~2) = 0.34028235E39 - (0.34028235E39, 0.123E~2) = 0.34028235E39 / (0.34028235E39, 0.123E~2) = inf nextAfter (0.34028235E39, 0.123E~2) = 0.34028233E39 rem (0.34028235E39, 0.123E~2) = ~inf * (0.34028235E39, 0.11754944E~37) = 0.39999998E1 + (0.34028235E39, 0.11754944E~37) = 0.34028235E39 - (0.34028235E39, 0.11754944E~37) = 0.34028235E39 / (0.34028235E39, 0.11754944E~37) = inf nextAfter (0.34028235E39, 0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, 0.11754944E~37) = ~inf * (0.34028235E39, 0.5877472E~38) = 0.19999999E1 + (0.34028235E39, 0.5877472E~38) = 0.34028235E39 - (0.34028235E39, 0.5877472E~38) = 0.34028235E39 / (0.34028235E39, 0.5877472E~38) = inf nextAfter (0.34028235E39, 0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, 0.5877472E~38) = ~inf * (0.34028235E39, 0.1E~44) = 0.47683713E~6 + (0.34028235E39, 0.1E~44) = 0.34028235E39 - (0.34028235E39, 0.1E~44) = 0.34028235E39 / (0.34028235E39, 0.1E~44) = inf nextAfter (0.34028235E39, 0.1E~44) = 0.34028233E39 rem (0.34028235E39, 0.1E~44) = ~inf * (0.34028235E39, 0.0) = 0.0 + (0.34028235E39, 0.0) = 0.34028235E39 - (0.34028235E39, 0.0) = 0.34028235E39 / (0.34028235E39, 0.0) = inf nextAfter (0.34028235E39, 0.0) = 0.34028233E39 rem (0.34028235E39, 0.0) = nan * (0.34028235E39, ~0.34028235E39) = ~inf + (0.34028235E39, ~0.34028235E39) = 0.0 - (0.34028235E39, ~0.34028235E39) = inf / (0.34028235E39, ~0.34028235E39) = ~0.1E1 nextAfter (0.34028235E39, ~0.34028235E39) = 0.34028233E39 rem (0.34028235E39, ~0.34028235E39) = 0.0 * (0.34028235E39, ~0.17014117E39) = ~inf + (0.34028235E39, ~0.17014117E39) = 0.17014117E39 - (0.34028235E39, ~0.17014117E39) = inf / (0.34028235E39, ~0.17014117E39) = ~0.2E1 nextAfter (0.34028235E39, ~0.17014117E39) = 0.34028233E39 rem (0.34028235E39, ~0.17014117E39) = 0.0 * (0.34028235E39, ~0.123E4) = ~inf + (0.34028235E39, ~0.123E4) = 0.34028235E39 - (0.34028235E39, ~0.123E4) = 0.34028235E39 / (0.34028235E39, ~0.123E4) = ~0.2766523E36 nextAfter (0.34028235E39, ~0.123E4) = 0.34028233E39 rem (0.34028235E39, ~0.123E4) = 0.11884224E32 * (0.34028235E39, ~0.123E2) = ~inf + (0.34028235E39, ~0.123E2) = 0.34028235E39 - (0.34028235E39, ~0.123E2) = 0.34028235E39 / (0.34028235E39, ~0.123E2) = ~0.27665232E38 nextAfter (0.34028235E39, ~0.123E2) = 0.34028233E39 rem (0.34028235E39, ~0.123E2) = ~0.12882628E32 * (0.34028235E39, ~0.31415927E1) = ~inf + (0.34028235E39, ~0.31415927E1) = 0.34028235E39 - (0.34028235E39, ~0.31415927E1) = 0.34028235E39 / (0.34028235E39, ~0.31415927E1) = ~0.10831523E39 nextAfter (0.34028235E39, ~0.31415927E1) = 0.34028233E39 rem (0.34028235E39, ~0.31415927E1) = 0.15835598E32 * (0.34028235E39, ~0.27182817E1) = ~inf + (0.34028235E39, ~0.27182817E1) = 0.34028235E39 - (0.34028235E39, ~0.27182817E1) = 0.34028235E39 / (0.34028235E39, ~0.27182817E1) = ~0.12518288E39 nextAfter (0.34028235E39, ~0.27182817E1) = 0.34028233E39 rem (0.34028235E39, ~0.27182817E1) = 0.9154518E31 * (0.34028235E39, ~0.123E1) = ~inf + (0.34028235E39, ~0.123E1) = 0.34028235E39 - (0.34028235E39, ~0.123E1) = 0.34028235E39 / (0.34028235E39, ~0.123E1) = ~0.27665231E39 nextAfter (0.34028235E39, ~0.123E1) = 0.34028233E39 rem (0.34028235E39, ~0.123E1) = ~0.40894575E30 * (0.34028235E39, ~0.123) = ~0.4185473E38 + (0.34028235E39, ~0.123) = 0.34028235E39 - (0.34028235E39, ~0.123) = 0.34028235E39 / (0.34028235E39, ~0.123) = ~inf nextAfter (0.34028235E39, ~0.123) = 0.34028233E39 rem (0.34028235E39, ~0.123) = ~inf * (0.34028235E39, ~0.123E~2) = ~0.4185473E36 + (0.34028235E39, ~0.123E~2) = 0.34028235E39 - (0.34028235E39, ~0.123E~2) = 0.34028235E39 / (0.34028235E39, ~0.123E~2) = ~inf nextAfter (0.34028235E39, ~0.123E~2) = 0.34028233E39 rem (0.34028235E39, ~0.123E~2) = ~inf * (0.34028235E39, ~0.11754944E~37) = ~0.39999998E1 + (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 - (0.34028235E39, ~0.11754944E~37) = 0.34028235E39 / (0.34028235E39, ~0.11754944E~37) = ~inf nextAfter (0.34028235E39, ~0.11754944E~37) = 0.34028233E39 rem (0.34028235E39, ~0.11754944E~37) = ~inf * (0.34028235E39, ~0.5877472E~38) = ~0.19999999E1 + (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 - (0.34028235E39, ~0.5877472E~38) = 0.34028235E39 / (0.34028235E39, ~0.5877472E~38) = ~inf nextAfter (0.34028235E39, ~0.5877472E~38) = 0.34028233E39 rem (0.34028235E39, ~0.5877472E~38) = ~inf * (0.34028235E39, ~0.1E~44) = ~0.47683713E~6 + (0.34028235E39, ~0.1E~44) = 0.34028235E39 - (0.34028235E39, ~0.1E~44) = 0.34028235E39 / (0.34028235E39, ~0.1E~44) = ~inf nextAfter (0.34028235E39, ~0.1E~44) = 0.34028233E39 rem (0.34028235E39, ~0.1E~44) = ~inf * (0.34028235E39, ~0.0) = ~0.0 + (0.34028235E39, ~0.0) = 0.34028235E39 - (0.34028235E39, ~0.0) = 0.34028235E39 / (0.34028235E39, ~0.0) = ~inf nextAfter (0.34028235E39, ~0.0) = 0.34028233E39 rem (0.34028235E39, ~0.0) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.34028235E39, ~inf) = ~inf + (0.34028235E39, ~inf) = ~inf - (0.34028235E39, ~inf) = inf / (0.34028235E39, ~inf) = ~0.0 nextAfter (0.34028235E39, ~inf) = 0.34028233E39 rem (0.34028235E39, ~inf) = 0.34028235E39 * (0.34028235E39, nan) = nan + (0.34028235E39, nan) = nan - (0.34028235E39, nan) = nan / (0.34028235E39, nan) = nan nextAfter (0.34028235E39, nan) = nan rem (0.34028235E39, nan) = nan * (0.34028235E39, inf) = inf + (0.34028235E39, inf) = inf - (0.34028235E39, inf) = ~inf / (0.34028235E39, inf) = 0.0 nextAfter (0.34028235E39, inf) = inf rem (0.34028235E39, inf) = 0.34028235E39 * (0.17014117E39, 0.34028235E39) = inf + (0.17014117E39, 0.34028235E39) = inf - (0.17014117E39, 0.34028235E39) = ~0.17014117E39 / (0.17014117E39, 0.34028235E39) = 0.5 nextAfter (0.17014117E39, 0.34028235E39) = 0.17014118E39 rem (0.17014117E39, 0.34028235E39) = 0.17014117E39 * (0.17014117E39, 0.17014117E39) = inf + (0.17014117E39, 0.17014117E39) = 0.34028235E39 - (0.17014117E39, 0.17014117E39) = 0.0 / (0.17014117E39, 0.17014117E39) = 0.1E1 nextAfter (0.17014117E39, 0.17014117E39) = 0.17014117E39 rem (0.17014117E39, 0.17014117E39) = 0.0 * (0.17014117E39, 0.123E4) = inf + (0.17014117E39, 0.123E4) = 0.17014117E39 - (0.17014117E39, 0.123E4) = 0.17014117E39 / (0.17014117E39, 0.123E4) = 0.13832615E36 nextAfter (0.17014117E39, 0.123E4) = 0.17014116E39 rem (0.17014117E39, 0.123E4) = 0.5942112E31 * (0.17014117E39, 0.123E2) = inf + (0.17014117E39, 0.123E2) = 0.17014117E39 - (0.17014117E39, 0.123E2) = 0.17014117E39 / (0.17014117E39, 0.123E2) = 0.13832616E38 nextAfter (0.17014117E39, 0.123E2) = 0.17014116E39 rem (0.17014117E39, 0.123E2) = ~0.6441314E31 * (0.17014117E39, 0.31415927E1) = inf + (0.17014117E39, 0.31415927E1) = 0.17014117E39 - (0.17014117E39, 0.31415927E1) = 0.17014117E39 / (0.17014117E39, 0.31415927E1) = 0.54157613E38 nextAfter (0.17014117E39, 0.31415927E1) = 0.17014116E39 rem (0.17014117E39, 0.31415927E1) = 0.7917799E31 * (0.17014117E39, 0.27182817E1) = inf + (0.17014117E39, 0.27182817E1) = 0.17014117E39 - (0.17014117E39, 0.27182817E1) = 0.17014117E39 / (0.17014117E39, 0.27182817E1) = 0.6259144E38 nextAfter (0.17014117E39, 0.27182817E1) = 0.17014116E39 rem (0.17014117E39, 0.27182817E1) = 0.4577259E31 * (0.17014117E39, 0.123E1) = 0.20927364E39 + (0.17014117E39, 0.123E1) = 0.17014117E39 - (0.17014117E39, 0.123E1) = 0.17014117E39 / (0.17014117E39, 0.123E1) = 0.13832616E39 nextAfter (0.17014117E39, 0.123E1) = 0.17014116E39 rem (0.17014117E39, 0.123E1) = ~0.20447288E30 * (0.17014117E39, 0.123) = 0.20927365E38 + (0.17014117E39, 0.123) = 0.17014117E39 - (0.17014117E39, 0.123) = 0.17014117E39 / (0.17014117E39, 0.123) = inf nextAfter (0.17014117E39, 0.123) = 0.17014116E39 rem (0.17014117E39, 0.123) = ~inf * (0.17014117E39, 0.123E~2) = 0.20927364E36 + (0.17014117E39, 0.123E~2) = 0.17014117E39 - (0.17014117E39, 0.123E~2) = 0.17014117E39 / (0.17014117E39, 0.123E~2) = inf nextAfter (0.17014117E39, 0.123E~2) = 0.17014116E39 rem (0.17014117E39, 0.123E~2) = ~inf * (0.17014117E39, 0.11754944E~37) = 0.19999999E1 + (0.17014117E39, 0.11754944E~37) = 0.17014117E39 - (0.17014117E39, 0.11754944E~37) = 0.17014117E39 / (0.17014117E39, 0.11754944E~37) = inf nextAfter (0.17014117E39, 0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, 0.11754944E~37) = ~inf * (0.17014117E39, 0.5877472E~38) = 0.99999994 + (0.17014117E39, 0.5877472E~38) = 0.17014117E39 - (0.17014117E39, 0.5877472E~38) = 0.17014117E39 / (0.17014117E39, 0.5877472E~38) = inf nextAfter (0.17014117E39, 0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, 0.5877472E~38) = ~inf * (0.17014117E39, 0.1E~44) = 0.23841856E~6 + (0.17014117E39, 0.1E~44) = 0.17014117E39 - (0.17014117E39, 0.1E~44) = 0.17014117E39 / (0.17014117E39, 0.1E~44) = inf nextAfter (0.17014117E39, 0.1E~44) = 0.17014116E39 rem (0.17014117E39, 0.1E~44) = ~inf * (0.17014117E39, 0.0) = 0.0 + (0.17014117E39, 0.0) = 0.17014117E39 - (0.17014117E39, 0.0) = 0.17014117E39 / (0.17014117E39, 0.0) = inf nextAfter (0.17014117E39, 0.0) = 0.17014116E39 rem (0.17014117E39, 0.0) = nan * (0.17014117E39, ~0.34028235E39) = ~inf + (0.17014117E39, ~0.34028235E39) = ~0.17014117E39 - (0.17014117E39, ~0.34028235E39) = inf / (0.17014117E39, ~0.34028235E39) = ~0.5 nextAfter (0.17014117E39, ~0.34028235E39) = 0.17014116E39 rem (0.17014117E39, ~0.34028235E39) = 0.17014117E39 * (0.17014117E39, ~0.17014117E39) = ~inf + (0.17014117E39, ~0.17014117E39) = 0.0 - (0.17014117E39, ~0.17014117E39) = 0.34028235E39 / (0.17014117E39, ~0.17014117E39) = ~0.1E1 nextAfter (0.17014117E39, ~0.17014117E39) = 0.17014116E39 rem (0.17014117E39, ~0.17014117E39) = 0.0 * (0.17014117E39, ~0.123E4) = ~inf + (0.17014117E39, ~0.123E4) = 0.17014117E39 - (0.17014117E39, ~0.123E4) = 0.17014117E39 / (0.17014117E39, ~0.123E4) = ~0.13832615E36 nextAfter (0.17014117E39, ~0.123E4) = 0.17014116E39 rem (0.17014117E39, ~0.123E4) = 0.5942112E31 * (0.17014117E39, ~0.123E2) = ~inf + (0.17014117E39, ~0.123E2) = 0.17014117E39 - (0.17014117E39, ~0.123E2) = 0.17014117E39 / (0.17014117E39, ~0.123E2) = ~0.13832616E38 nextAfter (0.17014117E39, ~0.123E2) = 0.17014116E39 rem (0.17014117E39, ~0.123E2) = ~0.6441314E31 * (0.17014117E39, ~0.31415927E1) = ~inf + (0.17014117E39, ~0.31415927E1) = 0.17014117E39 - (0.17014117E39, ~0.31415927E1) = 0.17014117E39 / (0.17014117E39, ~0.31415927E1) = ~0.54157613E38 nextAfter (0.17014117E39, ~0.31415927E1) = 0.17014116E39 rem (0.17014117E39, ~0.31415927E1) = 0.7917799E31 * (0.17014117E39, ~0.27182817E1) = ~inf + (0.17014117E39, ~0.27182817E1) = 0.17014117E39 - (0.17014117E39, ~0.27182817E1) = 0.17014117E39 / (0.17014117E39, ~0.27182817E1) = ~0.6259144E38 nextAfter (0.17014117E39, ~0.27182817E1) = 0.17014116E39 rem (0.17014117E39, ~0.27182817E1) = 0.4577259E31 * (0.17014117E39, ~0.123E1) = ~0.20927364E39 + (0.17014117E39, ~0.123E1) = 0.17014117E39 - (0.17014117E39, ~0.123E1) = 0.17014117E39 / (0.17014117E39, ~0.123E1) = ~0.13832616E39 nextAfter (0.17014117E39, ~0.123E1) = 0.17014116E39 rem (0.17014117E39, ~0.123E1) = ~0.20447288E30 * (0.17014117E39, ~0.123) = ~0.20927365E38 + (0.17014117E39, ~0.123) = 0.17014117E39 - (0.17014117E39, ~0.123) = 0.17014117E39 / (0.17014117E39, ~0.123) = ~inf nextAfter (0.17014117E39, ~0.123) = 0.17014116E39 rem (0.17014117E39, ~0.123) = ~inf * (0.17014117E39, ~0.123E~2) = ~0.20927364E36 + (0.17014117E39, ~0.123E~2) = 0.17014117E39 - (0.17014117E39, ~0.123E~2) = 0.17014117E39 / (0.17014117E39, ~0.123E~2) = ~inf nextAfter (0.17014117E39, ~0.123E~2) = 0.17014116E39 rem (0.17014117E39, ~0.123E~2) = ~inf * (0.17014117E39, ~0.11754944E~37) = ~0.19999999E1 + (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 - (0.17014117E39, ~0.11754944E~37) = 0.17014117E39 / (0.17014117E39, ~0.11754944E~37) = ~inf nextAfter (0.17014117E39, ~0.11754944E~37) = 0.17014116E39 rem (0.17014117E39, ~0.11754944E~37) = ~inf * (0.17014117E39, ~0.5877472E~38) = ~0.99999994 + (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 - (0.17014117E39, ~0.5877472E~38) = 0.17014117E39 / (0.17014117E39, ~0.5877472E~38) = ~inf nextAfter (0.17014117E39, ~0.5877472E~38) = 0.17014116E39 rem (0.17014117E39, ~0.5877472E~38) = ~inf * (0.17014117E39, ~0.1E~44) = ~0.23841856E~6 + (0.17014117E39, ~0.1E~44) = 0.17014117E39 - (0.17014117E39, ~0.1E~44) = 0.17014117E39 / (0.17014117E39, ~0.1E~44) = ~inf nextAfter (0.17014117E39, ~0.1E~44) = 0.17014116E39 rem (0.17014117E39, ~0.1E~44) = ~inf * (0.17014117E39, ~0.0) = ~0.0 + (0.17014117E39, ~0.0) = 0.17014117E39 - (0.17014117E39, ~0.0) = 0.17014117E39 / (0.17014117E39, ~0.0) = ~inf nextAfter (0.17014117E39, ~0.0) = 0.17014116E39 rem (0.17014117E39, ~0.0) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.17014117E39, ~inf) = ~inf + (0.17014117E39, ~inf) = ~inf - (0.17014117E39, ~inf) = inf / (0.17014117E39, ~inf) = ~0.0 nextAfter (0.17014117E39, ~inf) = 0.17014116E39 rem (0.17014117E39, ~inf) = 0.17014117E39 * (0.17014117E39, nan) = nan + (0.17014117E39, nan) = nan - (0.17014117E39, nan) = nan / (0.17014117E39, nan) = nan nextAfter (0.17014117E39, nan) = nan rem (0.17014117E39, nan) = nan * (0.17014117E39, inf) = inf + (0.17014117E39, inf) = inf - (0.17014117E39, inf) = ~inf / (0.17014117E39, inf) = 0.0 nextAfter (0.17014117E39, inf) = 0.17014118E39 rem (0.17014117E39, inf) = 0.17014117E39 * (0.123E4, 0.34028235E39) = inf + (0.123E4, 0.34028235E39) = 0.34028235E39 - (0.123E4, 0.34028235E39) = ~0.34028235E39 / (0.123E4, 0.34028235E39) = 0.36146455E~35 nextAfter (0.123E4, 0.34028235E39) = 0.12300001E4 rem (0.123E4, 0.34028235E39) = 0.123E4 * (0.123E4, 0.17014117E39) = inf + (0.123E4, 0.17014117E39) = 0.17014117E39 - (0.123E4, 0.17014117E39) = ~0.17014117E39 / (0.123E4, 0.17014117E39) = 0.7229291E~35 nextAfter (0.123E4, 0.17014117E39) = 0.12300001E4 rem (0.123E4, 0.17014117E39) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999E4 rem (0.123E4, 0.123E2) = ~0.19073486E~4 * (0.123E4, 0.31415927E1) = 0.38641592E4 + (0.123E4, 0.31415927E1) = 0.12331416E4 - (0.123E4, 0.31415927E1) = 0.12268584E4 / (0.123E4, 0.31415927E1) = 0.39152115E3 nextAfter (0.123E4, 0.31415927E1) = 0.12299999E4 rem (0.123E4, 0.31415927E1) = 0.16372383E1 * (0.123E4, 0.27182817E1) = 0.33434866E4 + (0.123E4, 0.27182817E1) = 0.12327183E4 - (0.123E4, 0.27182817E1) = 0.12272817E4 / (0.123E4, 0.27182817E1) = 0.45249173E3 nextAfter (0.123E4, 0.27182817E1) = 0.12299999E4 rem (0.123E4, 0.27182817E1) = 0.13366508E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999E4 rem (0.123E4, 0.123E1) = ~0.19073486E~4 * (0.123E4, 0.123) = 0.15129001E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999E4 rem (0.123E4, 0.123) = ~0.33974648E~4 * (0.123E4, 0.123E~2) = 0.15129001E1 + (0.123E4, 0.123E~2) = 0.12300012E4 - (0.123E4, 0.123E~2) = 0.12299988E4 / (0.123E4, 0.123E~2) = 0.99999994E6 nextAfter (0.123E4, 0.123E~2) = 0.12299999E4 rem (0.123E4, 0.123E~2) = 0.1177399E~2 * (0.123E4, 0.11754944E~37) = 0.1445858E~34 + (0.123E4, 0.11754944E~37) = 0.123E4 - (0.123E4, 0.11754944E~37) = 0.123E4 / (0.123E4, 0.11754944E~37) = inf nextAfter (0.123E4, 0.11754944E~37) = 0.12299999E4 rem (0.123E4, 0.11754944E~37) = ~inf * (0.123E4, 0.5877472E~38) = 0.722929E~35 + (0.123E4, 0.5877472E~38) = 0.123E4 - (0.123E4, 0.5877472E~38) = 0.123E4 / (0.123E4, 0.5877472E~38) = inf nextAfter (0.123E4, 0.5877472E~38) = 0.12299999E4 rem (0.123E4, 0.5877472E~38) = ~inf * (0.123E4, 0.1E~44) = 0.1724E~41 + (0.123E4, 0.1E~44) = 0.123E4 - (0.123E4, 0.1E~44) = 0.123E4 / (0.123E4, 0.1E~44) = inf nextAfter (0.123E4, 0.1E~44) = 0.12299999E4 rem (0.123E4, 0.1E~44) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.34028235E39) = ~inf + (0.123E4, ~0.34028235E39) = ~0.34028235E39 - (0.123E4, ~0.34028235E39) = 0.34028235E39 / (0.123E4, ~0.34028235E39) = ~0.36146455E~35 nextAfter (0.123E4, ~0.34028235E39) = 0.12299999E4 rem (0.123E4, ~0.34028235E39) = 0.123E4 * (0.123E4, ~0.17014117E39) = ~inf + (0.123E4, ~0.17014117E39) = ~0.17014117E39 - (0.123E4, ~0.17014117E39) = 0.17014117E39 / (0.123E4, ~0.17014117E39) = ~0.7229291E~35 nextAfter (0.123E4, ~0.17014117E39) = 0.12299999E4 rem (0.123E4, ~0.17014117E39) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999E4 rem (0.123E4, ~0.123E2) = ~0.19073486E~4 * (0.123E4, ~0.31415927E1) = ~0.38641592E4 + (0.123E4, ~0.31415927E1) = 0.12268584E4 - (0.123E4, ~0.31415927E1) = 0.12331416E4 / (0.123E4, ~0.31415927E1) = ~0.39152115E3 nextAfter (0.123E4, ~0.31415927E1) = 0.12299999E4 rem (0.123E4, ~0.31415927E1) = 0.16372383E1 * (0.123E4, ~0.27182817E1) = ~0.33434866E4 + (0.123E4, ~0.27182817E1) = 0.12272817E4 - (0.123E4, ~0.27182817E1) = 0.12327183E4 / (0.123E4, ~0.27182817E1) = ~0.45249173E3 nextAfter (0.123E4, ~0.27182817E1) = 0.12299999E4 rem (0.123E4, ~0.27182817E1) = 0.13366508E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999E4 rem (0.123E4, ~0.123E1) = ~0.19073486E~4 * (0.123E4, ~0.123) = ~0.15129001E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999E4 rem (0.123E4, ~0.123) = ~0.33974648E~4 * (0.123E4, ~0.123E~2) = ~0.15129001E1 + (0.123E4, ~0.123E~2) = 0.12299988E4 - (0.123E4, ~0.123E~2) = 0.12300012E4 / (0.123E4, ~0.123E~2) = ~0.99999994E6 nextAfter (0.123E4, ~0.123E~2) = 0.12299999E4 rem (0.123E4, ~0.123E~2) = 0.1177399E~2 * (0.123E4, ~0.11754944E~37) = ~0.1445858E~34 + (0.123E4, ~0.11754944E~37) = 0.123E4 - (0.123E4, ~0.11754944E~37) = 0.123E4 / (0.123E4, ~0.11754944E~37) = ~inf nextAfter (0.123E4, ~0.11754944E~37) = 0.12299999E4 rem (0.123E4, ~0.11754944E~37) = ~inf * (0.123E4, ~0.5877472E~38) = ~0.722929E~35 + (0.123E4, ~0.5877472E~38) = 0.123E4 - (0.123E4, ~0.5877472E~38) = 0.123E4 / (0.123E4, ~0.5877472E~38) = ~inf nextAfter (0.123E4, ~0.5877472E~38) = 0.12299999E4 rem (0.123E4, ~0.5877472E~38) = ~inf * (0.123E4, ~0.1E~44) = ~0.1724E~41 + (0.123E4, ~0.1E~44) = 0.123E4 - (0.123E4, ~0.1E~44) = 0.123E4 / (0.123E4, ~0.1E~44) = ~inf nextAfter (0.123E4, ~0.1E~44) = 0.12299999E4 rem (0.123E4, ~0.1E~44) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300001E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.34028235E39) = inf + (0.123E2, 0.34028235E39) = 0.34028235E39 - (0.123E2, 0.34028235E39) = ~0.34028235E39 / (0.123E2, 0.34028235E39) = 0.36146455E~37 nextAfter (0.123E2, 0.34028235E39) = 0.12300001E2 rem (0.123E2, 0.34028235E39) = 0.123E2 * (0.123E2, 0.17014117E39) = inf + (0.123E2, 0.17014117E39) = 0.17014117E39 - (0.123E2, 0.17014117E39) = ~0.17014117E39 / (0.123E2, 0.17014117E39) = 0.7229291E~37 nextAfter (0.123E2, 0.17014117E39) = 0.12300001E2 rem (0.123E2, 0.17014117E39) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300001E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129001E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.31415927E1) = 0.3864159E2 + (0.123E2, 0.31415927E1) = 0.15441593E2 - (0.123E2, 0.31415927E1) = 0.9158407E1 / (0.123E2, 0.31415927E1) = 0.39152114E1 nextAfter (0.123E2, 0.31415927E1) = 0.12299999E2 rem (0.123E2, 0.31415927E1) = 0.2875222E1 * (0.123E2, 0.27182817E1) = 0.33434868E2 + (0.123E2, 0.27182817E1) = 0.15018282E2 - (0.123E2, 0.27182817E1) = 0.9581718E1 / (0.123E2, 0.27182817E1) = 0.4524917E1 nextAfter (0.123E2, 0.27182817E1) = 0.12299999E2 rem (0.123E2, 0.27182817E1) = 0.14268732E1 * (0.123E2, 0.123E1) = 0.15129001E2 + (0.123E2, 0.123E1) = 0.13530001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999E2 rem (0.123E2, 0.123E1) = 0.0 * (0.123E2, 0.123) = 0.15129001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177E2 / (0.123E2, 0.123) = 0.1E3 nextAfter (0.123E2, 0.123) = 0.12299999E2 rem (0.123E2, 0.123) = ~0.14901161E~6 * (0.123E2, 0.123E~2) = 0.15129001E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.1229877E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999E2 rem (0.123E2, 0.123E~2) = ~0.33527613E~6 * (0.123E2, 0.11754944E~37) = 0.14458581E~36 + (0.123E2, 0.11754944E~37) = 0.123E2 - (0.123E2, 0.11754944E~37) = 0.123E2 / (0.123E2, 0.11754944E~37) = inf nextAfter (0.123E2, 0.11754944E~37) = 0.12299999E2 rem (0.123E2, 0.11754944E~37) = ~inf * (0.123E2, 0.5877472E~38) = 0.72292904E~37 + (0.123E2, 0.5877472E~38) = 0.123E2 - (0.123E2, 0.5877472E~38) = 0.123E2 / (0.123E2, 0.5877472E~38) = inf nextAfter (0.123E2, 0.5877472E~38) = 0.12299999E2 rem (0.123E2, 0.5877472E~38) = ~inf * (0.123E2, 0.1E~44) = 0.17E~43 + (0.123E2, 0.1E~44) = 0.123E2 - (0.123E2, 0.1E~44) = 0.123E2 / (0.123E2, 0.1E~44) = inf nextAfter (0.123E2, 0.1E~44) = 0.12299999E2 rem (0.123E2, 0.1E~44) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.34028235E39) = ~inf + (0.123E2, ~0.34028235E39) = ~0.34028235E39 - (0.123E2, ~0.34028235E39) = 0.34028235E39 / (0.123E2, ~0.34028235E39) = ~0.36146455E~37 nextAfter (0.123E2, ~0.34028235E39) = 0.12299999E2 rem (0.123E2, ~0.34028235E39) = 0.123E2 * (0.123E2, ~0.17014117E39) = ~inf + (0.123E2, ~0.17014117E39) = ~0.17014117E39 - (0.123E2, ~0.17014117E39) = 0.17014117E39 / (0.123E2, ~0.17014117E39) = ~0.7229291E~37 nextAfter (0.123E2, ~0.17014117E39) = 0.12299999E2 rem (0.123E2, ~0.17014117E39) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129001E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.31415927E1) = ~0.3864159E2 + (0.123E2, ~0.31415927E1) = 0.9158407E1 - (0.123E2, ~0.31415927E1) = 0.15441593E2 / (0.123E2, ~0.31415927E1) = ~0.39152114E1 nextAfter (0.123E2, ~0.31415927E1) = 0.12299999E2 rem (0.123E2, ~0.31415927E1) = 0.2875222E1 * (0.123E2, ~0.27182817E1) = ~0.33434868E2 + (0.123E2, ~0.27182817E1) = 0.9581718E1 - (0.123E2, ~0.27182817E1) = 0.15018282E2 / (0.123E2, ~0.27182817E1) = ~0.4524917E1 nextAfter (0.123E2, ~0.27182817E1) = 0.12299999E2 rem (0.123E2, ~0.27182817E1) = 0.14268732E1 * (0.123E2, ~0.123E1) = ~0.15129001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999E2 rem (0.123E2, ~0.123E1) = 0.0 * (0.123E2, ~0.123) = ~0.15129001E1 + (0.123E2, ~0.123) = 0.12177E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.1E3 nextAfter (0.123E2, ~0.123) = 0.12299999E2 rem (0.123E2, ~0.123) = ~0.14901161E~6 * (0.123E2, ~0.123E~2) = ~0.15129001E~1 + (0.123E2, ~0.123E~2) = 0.1229877E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999E2 rem (0.123E2, ~0.123E~2) = ~0.33527613E~6 * (0.123E2, ~0.11754944E~37) = ~0.14458581E~36 + (0.123E2, ~0.11754944E~37) = 0.123E2 - (0.123E2, ~0.11754944E~37) = 0.123E2 / (0.123E2, ~0.11754944E~37) = ~inf nextAfter (0.123E2, ~0.11754944E~37) = 0.12299999E2 rem (0.123E2, ~0.11754944E~37) = ~inf * (0.123E2, ~0.5877472E~38) = ~0.72292904E~37 + (0.123E2, ~0.5877472E~38) = 0.123E2 - (0.123E2, ~0.5877472E~38) = 0.123E2 / (0.123E2, ~0.5877472E~38) = ~inf nextAfter (0.123E2, ~0.5877472E~38) = 0.12299999E2 rem (0.123E2, ~0.5877472E~38) = ~inf * (0.123E2, ~0.1E~44) = ~0.17E~43 + (0.123E2, ~0.1E~44) = 0.123E2 - (0.123E2, ~0.1E~44) = 0.123E2 / (0.123E2, ~0.1E~44) = ~inf nextAfter (0.123E2, ~0.1E~44) = 0.12299999E2 rem (0.123E2, ~0.1E~44) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300001E2 rem (0.123E2, inf) = 0.123E2 * (0.31415927E1, 0.34028235E39) = inf + (0.31415927E1, 0.34028235E39) = 0.34028235E39 - (0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (0.31415927E1, 0.34028235E39) = 0.9232312E~38 nextAfter (0.31415927E1, 0.34028235E39) = 0.3141593E1 rem (0.31415927E1, 0.34028235E39) = 0.31415927E1 * (0.31415927E1, 0.17014117E39) = inf + (0.31415927E1, 0.17014117E39) = 0.17014117E39 - (0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (0.31415927E1, 0.17014117E39) = 0.18464624E~37 nextAfter (0.31415927E1, 0.17014117E39) = 0.3141593E1 rem (0.31415927E1, 0.17014117E39) = 0.31415927E1 * (0.31415927E1, 0.123E4) = 0.38641592E4 + (0.31415927E1, 0.123E4) = 0.12331416E4 - (0.31415927E1, 0.123E4) = ~0.12268584E4 / (0.31415927E1, 0.123E4) = 0.25541405E~2 nextAfter (0.31415927E1, 0.123E4) = 0.3141593E1 rem (0.31415927E1, 0.123E4) = 0.31415927E1 * (0.31415927E1, 0.123E2) = 0.3864159E2 + (0.31415927E1, 0.123E2) = 0.15441593E2 - (0.31415927E1, 0.123E2) = ~0.9158407E1 / (0.31415927E1, 0.123E2) = 0.25541404 nextAfter (0.31415927E1, 0.123E2) = 0.3141593E1 rem (0.31415927E1, 0.123E2) = 0.31415927E1 * (0.31415927E1, 0.31415927E1) = 0.9869605E1 + (0.31415927E1, 0.31415927E1) = 0.62831855E1 - (0.31415927E1, 0.31415927E1) = 0.0 / (0.31415927E1, 0.31415927E1) = 0.1E1 nextAfter (0.31415927E1, 0.31415927E1) = 0.31415927E1 rem (0.31415927E1, 0.31415927E1) = 0.0 * (0.31415927E1, 0.27182817E1) = 0.8539734E1 + (0.31415927E1, 0.27182817E1) = 0.58598747E1 - (0.31415927E1, 0.27182817E1) = 0.423311 / (0.31415927E1, 0.27182817E1) = 0.11557274E1 nextAfter (0.31415927E1, 0.27182817E1) = 0.31415925E1 rem (0.31415927E1, 0.27182817E1) = 0.423311 * (0.31415927E1, 0.123E1) = 0.3864159E1 + (0.31415927E1, 0.123E1) = 0.43715925E1 - (0.31415927E1, 0.123E1) = 0.19115927E1 / (0.31415927E1, 0.123E1) = 0.25541403E1 nextAfter (0.31415927E1, 0.123E1) = 0.31415925E1 rem (0.31415927E1, 0.123E1) = 0.6815927 * (0.31415927E1, 0.123) = 0.38641593 + (0.31415927E1, 0.123) = 0.32645926E1 - (0.31415927E1, 0.123) = 0.30185928E1 / (0.31415927E1, 0.123) = 0.25541403E2 nextAfter (0.31415927E1, 0.123) = 0.31415925E1 rem (0.31415927E1, 0.123) = 0.66592656E~1 * (0.31415927E1, 0.123E~2) = 0.38641593E~2 + (0.31415927E1, 0.123E~2) = 0.31428227E1 - (0.31415927E1, 0.123E~2) = 0.31403627E1 / (0.31415927E1, 0.123E~2) = 0.25541404E4 nextAfter (0.31415927E1, 0.123E~2) = 0.31415925E1 rem (0.31415927E1, 0.123E~2) = 0.17260667E~3 * (0.31415927E1, 0.11754944E~37) = 0.36929245E~37 + (0.31415927E1, 0.11754944E~37) = 0.31415927E1 - (0.31415927E1, 0.11754944E~37) = 0.31415927E1 / (0.31415927E1, 0.11754944E~37) = 0.26725715E39 nextAfter (0.31415927E1, 0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, 0.11754944E~37) = 0.0 * (0.31415927E1, 0.5877472E~38) = 0.18464623E~37 + (0.31415927E1, 0.5877472E~38) = 0.31415927E1 - (0.31415927E1, 0.5877472E~38) = 0.31415927E1 / (0.31415927E1, 0.5877472E~38) = inf nextAfter (0.31415927E1, 0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, 0.5877472E~38) = ~inf * (0.31415927E1, 0.1E~44) = 0.4E~44 + (0.31415927E1, 0.1E~44) = 0.31415927E1 - (0.31415927E1, 0.1E~44) = 0.31415927E1 / (0.31415927E1, 0.1E~44) = inf nextAfter (0.31415927E1, 0.1E~44) = 0.31415925E1 rem (0.31415927E1, 0.1E~44) = ~inf * (0.31415927E1, 0.0) = 0.0 + (0.31415927E1, 0.0) = 0.31415927E1 - (0.31415927E1, 0.0) = 0.31415927E1 / (0.31415927E1, 0.0) = inf nextAfter (0.31415927E1, 0.0) = 0.31415925E1 rem (0.31415927E1, 0.0) = nan * (0.31415927E1, ~0.34028235E39) = ~inf + (0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (0.31415927E1, ~0.34028235E39) = ~0.9232312E~38 nextAfter (0.31415927E1, ~0.34028235E39) = 0.31415925E1 rem (0.31415927E1, ~0.34028235E39) = 0.31415927E1 * (0.31415927E1, ~0.17014117E39) = ~inf + (0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (0.31415927E1, ~0.17014117E39) = ~0.18464624E~37 nextAfter (0.31415927E1, ~0.17014117E39) = 0.31415925E1 rem (0.31415927E1, ~0.17014117E39) = 0.31415927E1 * (0.31415927E1, ~0.123E4) = ~0.38641592E4 + (0.31415927E1, ~0.123E4) = ~0.12268584E4 - (0.31415927E1, ~0.123E4) = 0.12331416E4 / (0.31415927E1, ~0.123E4) = ~0.25541405E~2 nextAfter (0.31415927E1, ~0.123E4) = 0.31415925E1 rem (0.31415927E1, ~0.123E4) = 0.31415927E1 * (0.31415927E1, ~0.123E2) = ~0.3864159E2 + (0.31415927E1, ~0.123E2) = ~0.9158407E1 - (0.31415927E1, ~0.123E2) = 0.15441593E2 / (0.31415927E1, ~0.123E2) = ~0.25541404 nextAfter (0.31415927E1, ~0.123E2) = 0.31415925E1 rem (0.31415927E1, ~0.123E2) = 0.31415927E1 * (0.31415927E1, ~0.31415927E1) = ~0.9869605E1 + (0.31415927E1, ~0.31415927E1) = 0.0 - (0.31415927E1, ~0.31415927E1) = 0.62831855E1 / (0.31415927E1, ~0.31415927E1) = ~0.1E1 nextAfter (0.31415927E1, ~0.31415927E1) = 0.31415925E1 rem (0.31415927E1, ~0.31415927E1) = 0.0 * (0.31415927E1, ~0.27182817E1) = ~0.8539734E1 + (0.31415927E1, ~0.27182817E1) = 0.423311 - (0.31415927E1, ~0.27182817E1) = 0.58598747E1 / (0.31415927E1, ~0.27182817E1) = ~0.11557274E1 nextAfter (0.31415927E1, ~0.27182817E1) = 0.31415925E1 rem (0.31415927E1, ~0.27182817E1) = 0.423311 * (0.31415927E1, ~0.123E1) = ~0.3864159E1 + (0.31415927E1, ~0.123E1) = 0.19115927E1 - (0.31415927E1, ~0.123E1) = 0.43715925E1 / (0.31415927E1, ~0.123E1) = ~0.25541403E1 nextAfter (0.31415927E1, ~0.123E1) = 0.31415925E1 rem (0.31415927E1, ~0.123E1) = 0.6815927 * (0.31415927E1, ~0.123) = ~0.38641593 + (0.31415927E1, ~0.123) = 0.30185928E1 - (0.31415927E1, ~0.123) = 0.32645926E1 / (0.31415927E1, ~0.123) = ~0.25541403E2 nextAfter (0.31415927E1, ~0.123) = 0.31415925E1 rem (0.31415927E1, ~0.123) = 0.66592656E~1 * (0.31415927E1, ~0.123E~2) = ~0.38641593E~2 + (0.31415927E1, ~0.123E~2) = 0.31403627E1 - (0.31415927E1, ~0.123E~2) = 0.31428227E1 / (0.31415927E1, ~0.123E~2) = ~0.25541404E4 nextAfter (0.31415927E1, ~0.123E~2) = 0.31415925E1 rem (0.31415927E1, ~0.123E~2) = 0.17260667E~3 * (0.31415927E1, ~0.11754944E~37) = ~0.36929245E~37 + (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 - (0.31415927E1, ~0.11754944E~37) = 0.31415927E1 / (0.31415927E1, ~0.11754944E~37) = ~0.26725715E39 nextAfter (0.31415927E1, ~0.11754944E~37) = 0.31415925E1 rem (0.31415927E1, ~0.11754944E~37) = 0.0 * (0.31415927E1, ~0.5877472E~38) = ~0.18464623E~37 + (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 - (0.31415927E1, ~0.5877472E~38) = 0.31415927E1 / (0.31415927E1, ~0.5877472E~38) = ~inf nextAfter (0.31415927E1, ~0.5877472E~38) = 0.31415925E1 rem (0.31415927E1, ~0.5877472E~38) = ~inf * (0.31415927E1, ~0.1E~44) = ~0.4E~44 + (0.31415927E1, ~0.1E~44) = 0.31415927E1 - (0.31415927E1, ~0.1E~44) = 0.31415927E1 / (0.31415927E1, ~0.1E~44) = ~inf nextAfter (0.31415927E1, ~0.1E~44) = 0.31415925E1 rem (0.31415927E1, ~0.1E~44) = ~inf * (0.31415927E1, ~0.0) = ~0.0 + (0.31415927E1, ~0.0) = 0.31415927E1 - (0.31415927E1, ~0.0) = 0.31415927E1 / (0.31415927E1, ~0.0) = ~inf nextAfter (0.31415927E1, ~0.0) = 0.31415925E1 rem (0.31415927E1, ~0.0) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.31415927E1, ~inf) = ~inf + (0.31415927E1, ~inf) = ~inf - (0.31415927E1, ~inf) = inf / (0.31415927E1, ~inf) = ~0.0 nextAfter (0.31415927E1, ~inf) = 0.31415925E1 rem (0.31415927E1, ~inf) = 0.31415927E1 * (0.31415927E1, nan) = nan + (0.31415927E1, nan) = nan - (0.31415927E1, nan) = nan / (0.31415927E1, nan) = nan nextAfter (0.31415927E1, nan) = nan rem (0.31415927E1, nan) = nan * (0.31415927E1, inf) = inf + (0.31415927E1, inf) = inf - (0.31415927E1, inf) = ~inf / (0.31415927E1, inf) = 0.0 nextAfter (0.31415927E1, inf) = 0.3141593E1 rem (0.31415927E1, inf) = 0.31415927E1 * (0.27182817E1, 0.34028235E39) = inf + (0.27182817E1, 0.34028235E39) = 0.34028235E39 - (0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (0.27182817E1, 0.34028235E39) = 0.7988312E~38 nextAfter (0.27182817E1, 0.34028235E39) = 0.2718282E1 rem (0.27182817E1, 0.34028235E39) = 0.27182817E1 * (0.27182817E1, 0.17014117E39) = inf + (0.27182817E1, 0.17014117E39) = 0.17014117E39 - (0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (0.27182817E1, 0.17014117E39) = 0.15976626E~37 nextAfter (0.27182817E1, 0.17014117E39) = 0.2718282E1 rem (0.27182817E1, 0.17014117E39) = 0.27182817E1 * (0.27182817E1, 0.123E4) = 0.33434866E4 + (0.27182817E1, 0.123E4) = 0.12327183E4 - (0.27182817E1, 0.123E4) = ~0.12272817E4 / (0.27182817E1, 0.123E4) = 0.22099852E~2 nextAfter (0.27182817E1, 0.123E4) = 0.2718282E1 rem (0.27182817E1, 0.123E4) = 0.27182817E1 * (0.27182817E1, 0.123E2) = 0.33434868E2 + (0.27182817E1, 0.123E2) = 0.15018282E2 - (0.27182817E1, 0.123E2) = ~0.9581718E1 / (0.27182817E1, 0.123E2) = 0.22099851 nextAfter (0.27182817E1, 0.123E2) = 0.2718282E1 rem (0.27182817E1, 0.123E2) = 0.27182817E1 * (0.27182817E1, 0.31415927E1) = 0.8539734E1 + (0.27182817E1, 0.31415927E1) = 0.58598747E1 - (0.27182817E1, 0.31415927E1) = ~0.423311 / (0.27182817E1, 0.31415927E1) = 0.86525595 nextAfter (0.27182817E1, 0.31415927E1) = 0.2718282E1 rem (0.27182817E1, 0.31415927E1) = 0.27182817E1 * (0.27182817E1, 0.27182817E1) = 0.73890557E1 + (0.27182817E1, 0.27182817E1) = 0.54365635E1 - (0.27182817E1, 0.27182817E1) = 0.0 / (0.27182817E1, 0.27182817E1) = 0.1E1 nextAfter (0.27182817E1, 0.27182817E1) = 0.27182817E1 rem (0.27182817E1, 0.27182817E1) = 0.0 * (0.27182817E1, 0.123E1) = 0.33434865E1 + (0.27182817E1, 0.123E1) = 0.39482818E1 - (0.27182817E1, 0.123E1) = 0.14882817E1 / (0.27182817E1, 0.123E1) = 0.2209985E1 nextAfter (0.27182817E1, 0.123E1) = 0.27182815E1 rem (0.27182817E1, 0.123E1) = 0.2582817 * (0.27182817E1, 0.123) = 0.33434868 + (0.27182817E1, 0.123) = 0.28412817E1 - (0.27182817E1, 0.123) = 0.25952818E1 / (0.27182817E1, 0.123) = 0.22099852E2 nextAfter (0.27182817E1, 0.123) = 0.27182815E1 rem (0.27182817E1, 0.123) = 0.12281671E~1 * (0.27182817E1, 0.123E~2) = 0.33434867E~2 + (0.27182817E1, 0.123E~2) = 0.27195117E1 - (0.27182817E1, 0.123E~2) = 0.27170517E1 / (0.27182817E1, 0.123E~2) = 0.2209985E4 nextAfter (0.27182817E1, 0.123E~2) = 0.27182815E1 rem (0.27182817E1, 0.123E~2) = 0.12116297E~2 * (0.27182817E1, 0.11754944E~37) = 0.31953248E~37 + (0.27182817E1, 0.11754944E~37) = 0.27182817E1 - (0.27182817E1, 0.11754944E~37) = 0.27182817E1 / (0.27182817E1, 0.11754944E~37) = 0.23124584E39 nextAfter (0.27182817E1, 0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, 0.11754944E~37) = 0.0 * (0.27182817E1, 0.5877472E~38) = 0.15976624E~37 + (0.27182817E1, 0.5877472E~38) = 0.27182817E1 - (0.27182817E1, 0.5877472E~38) = 0.27182817E1 / (0.27182817E1, 0.5877472E~38) = inf nextAfter (0.27182817E1, 0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, 0.5877472E~38) = ~inf * (0.27182817E1, 0.1E~44) = 0.4E~44 + (0.27182817E1, 0.1E~44) = 0.27182817E1 - (0.27182817E1, 0.1E~44) = 0.27182817E1 / (0.27182817E1, 0.1E~44) = inf nextAfter (0.27182817E1, 0.1E~44) = 0.27182815E1 rem (0.27182817E1, 0.1E~44) = ~inf * (0.27182817E1, 0.0) = 0.0 + (0.27182817E1, 0.0) = 0.27182817E1 - (0.27182817E1, 0.0) = 0.27182817E1 / (0.27182817E1, 0.0) = inf nextAfter (0.27182817E1, 0.0) = 0.27182815E1 rem (0.27182817E1, 0.0) = nan * (0.27182817E1, ~0.34028235E39) = ~inf + (0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (0.27182817E1, ~0.34028235E39) = ~0.7988312E~38 nextAfter (0.27182817E1, ~0.34028235E39) = 0.27182815E1 rem (0.27182817E1, ~0.34028235E39) = 0.27182817E1 * (0.27182817E1, ~0.17014117E39) = ~inf + (0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (0.27182817E1, ~0.17014117E39) = ~0.15976626E~37 nextAfter (0.27182817E1, ~0.17014117E39) = 0.27182815E1 rem (0.27182817E1, ~0.17014117E39) = 0.27182817E1 * (0.27182817E1, ~0.123E4) = ~0.33434866E4 + (0.27182817E1, ~0.123E4) = ~0.12272817E4 - (0.27182817E1, ~0.123E4) = 0.12327183E4 / (0.27182817E1, ~0.123E4) = ~0.22099852E~2 nextAfter (0.27182817E1, ~0.123E4) = 0.27182815E1 rem (0.27182817E1, ~0.123E4) = 0.27182817E1 * (0.27182817E1, ~0.123E2) = ~0.33434868E2 + (0.27182817E1, ~0.123E2) = ~0.9581718E1 - (0.27182817E1, ~0.123E2) = 0.15018282E2 / (0.27182817E1, ~0.123E2) = ~0.22099851 nextAfter (0.27182817E1, ~0.123E2) = 0.27182815E1 rem (0.27182817E1, ~0.123E2) = 0.27182817E1 * (0.27182817E1, ~0.31415927E1) = ~0.8539734E1 + (0.27182817E1, ~0.31415927E1) = ~0.423311 - (0.27182817E1, ~0.31415927E1) = 0.58598747E1 / (0.27182817E1, ~0.31415927E1) = ~0.86525595 nextAfter (0.27182817E1, ~0.31415927E1) = 0.27182815E1 rem (0.27182817E1, ~0.31415927E1) = 0.27182817E1 * (0.27182817E1, ~0.27182817E1) = ~0.73890557E1 + (0.27182817E1, ~0.27182817E1) = 0.0 - (0.27182817E1, ~0.27182817E1) = 0.54365635E1 / (0.27182817E1, ~0.27182817E1) = ~0.1E1 nextAfter (0.27182817E1, ~0.27182817E1) = 0.27182815E1 rem (0.27182817E1, ~0.27182817E1) = 0.0 * (0.27182817E1, ~0.123E1) = ~0.33434865E1 + (0.27182817E1, ~0.123E1) = 0.14882817E1 - (0.27182817E1, ~0.123E1) = 0.39482818E1 / (0.27182817E1, ~0.123E1) = ~0.2209985E1 nextAfter (0.27182817E1, ~0.123E1) = 0.27182815E1 rem (0.27182817E1, ~0.123E1) = 0.2582817 * (0.27182817E1, ~0.123) = ~0.33434868 + (0.27182817E1, ~0.123) = 0.25952818E1 - (0.27182817E1, ~0.123) = 0.28412817E1 / (0.27182817E1, ~0.123) = ~0.22099852E2 nextAfter (0.27182817E1, ~0.123) = 0.27182815E1 rem (0.27182817E1, ~0.123) = 0.12281671E~1 * (0.27182817E1, ~0.123E~2) = ~0.33434867E~2 + (0.27182817E1, ~0.123E~2) = 0.27170517E1 - (0.27182817E1, ~0.123E~2) = 0.27195117E1 / (0.27182817E1, ~0.123E~2) = ~0.2209985E4 nextAfter (0.27182817E1, ~0.123E~2) = 0.27182815E1 rem (0.27182817E1, ~0.123E~2) = 0.12116297E~2 * (0.27182817E1, ~0.11754944E~37) = ~0.31953248E~37 + (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 - (0.27182817E1, ~0.11754944E~37) = 0.27182817E1 / (0.27182817E1, ~0.11754944E~37) = ~0.23124584E39 nextAfter (0.27182817E1, ~0.11754944E~37) = 0.27182815E1 rem (0.27182817E1, ~0.11754944E~37) = 0.0 * (0.27182817E1, ~0.5877472E~38) = ~0.15976624E~37 + (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 - (0.27182817E1, ~0.5877472E~38) = 0.27182817E1 / (0.27182817E1, ~0.5877472E~38) = ~inf nextAfter (0.27182817E1, ~0.5877472E~38) = 0.27182815E1 rem (0.27182817E1, ~0.5877472E~38) = ~inf * (0.27182817E1, ~0.1E~44) = ~0.4E~44 + (0.27182817E1, ~0.1E~44) = 0.27182817E1 - (0.27182817E1, ~0.1E~44) = 0.27182817E1 / (0.27182817E1, ~0.1E~44) = ~inf nextAfter (0.27182817E1, ~0.1E~44) = 0.27182815E1 rem (0.27182817E1, ~0.1E~44) = ~inf * (0.27182817E1, ~0.0) = ~0.0 + (0.27182817E1, ~0.0) = 0.27182817E1 - (0.27182817E1, ~0.0) = 0.27182817E1 / (0.27182817E1, ~0.0) = ~inf nextAfter (0.27182817E1, ~0.0) = 0.27182815E1 rem (0.27182817E1, ~0.0) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.27182817E1, ~inf) = ~inf + (0.27182817E1, ~inf) = ~inf - (0.27182817E1, ~inf) = inf / (0.27182817E1, ~inf) = ~0.0 nextAfter (0.27182817E1, ~inf) = 0.27182815E1 rem (0.27182817E1, ~inf) = 0.27182817E1 * (0.27182817E1, nan) = nan + (0.27182817E1, nan) = nan - (0.27182817E1, nan) = nan / (0.27182817E1, nan) = nan nextAfter (0.27182817E1, nan) = nan rem (0.27182817E1, nan) = nan * (0.27182817E1, inf) = inf + (0.27182817E1, inf) = inf - (0.27182817E1, inf) = ~inf / (0.27182817E1, inf) = 0.0 nextAfter (0.27182817E1, inf) = 0.2718282E1 rem (0.27182817E1, inf) = 0.27182817E1 * (0.123E1, 0.34028235E39) = inf + (0.123E1, 0.34028235E39) = 0.34028235E39 - (0.123E1, 0.34028235E39) = ~0.34028235E39 / (0.123E1, 0.34028235E39) = 0.3614645E~38 nextAfter (0.123E1, 0.34028235E39) = 0.12300001E1 rem (0.123E1, 0.34028235E39) = 0.123E1 * (0.123E1, 0.17014117E39) = 0.20927364E39 + (0.123E1, 0.17014117E39) = 0.17014117E39 - (0.123E1, 0.17014117E39) = ~0.17014117E39 / (0.123E1, 0.17014117E39) = 0.722929E~38 nextAfter (0.123E1, 0.17014117E39) = 0.12300001E1 rem (0.123E1, 0.17014117E39) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300001E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129001E2 + (0.123E1, 0.123E2) = 0.13530001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.1 nextAfter (0.123E1, 0.123E2) = 0.12300001E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.31415927E1) = 0.3864159E1 + (0.123E1, 0.31415927E1) = 0.43715925E1 - (0.123E1, 0.31415927E1) = ~0.19115927E1 / (0.123E1, 0.31415927E1) = 0.39152116 nextAfter (0.123E1, 0.31415927E1) = 0.12300001E1 rem (0.123E1, 0.31415927E1) = 0.123E1 * (0.123E1, 0.27182817E1) = 0.33434865E1 + (0.123E1, 0.27182817E1) = 0.39482818E1 - (0.123E1, 0.27182817E1) = ~0.14882817E1 / (0.123E1, 0.27182817E1) = 0.45249173 nextAfter (0.123E1, 0.27182817E1) = 0.12300001E1 rem (0.123E1, 0.27182817E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999E1 rem (0.123E1, 0.123) = ~0.14901161E~7 * (0.123E1, 0.123E~2) = 0.15129001E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999E1 rem (0.123E1, 0.123E~2) = ~0.33527613E~7 * (0.123E1, 0.11754944E~37) = 0.14458581E~37 + (0.123E1, 0.11754944E~37) = 0.123E1 - (0.123E1, 0.11754944E~37) = 0.123E1 / (0.123E1, 0.11754944E~37) = 0.10463683E39 nextAfter (0.123E1, 0.11754944E~37) = 0.12299999E1 rem (0.123E1, 0.11754944E~37) = 0.0 * (0.123E1, 0.5877472E~38) = 0.722929E~38 + (0.123E1, 0.5877472E~38) = 0.123E1 - (0.123E1, 0.5877472E~38) = 0.123E1 / (0.123E1, 0.5877472E~38) = 0.20927366E39 nextAfter (0.123E1, 0.5877472E~38) = 0.12299999E1 rem (0.123E1, 0.5877472E~38) = 0.0 * (0.123E1, 0.1E~44) = 0.1E~44 + (0.123E1, 0.1E~44) = 0.123E1 - (0.123E1, 0.1E~44) = 0.123E1 / (0.123E1, 0.1E~44) = inf nextAfter (0.123E1, 0.1E~44) = 0.12299999E1 rem (0.123E1, 0.1E~44) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.34028235E39) = ~inf + (0.123E1, ~0.34028235E39) = ~0.34028235E39 - (0.123E1, ~0.34028235E39) = 0.34028235E39 / (0.123E1, ~0.34028235E39) = ~0.3614645E~38 nextAfter (0.123E1, ~0.34028235E39) = 0.12299999E1 rem (0.123E1, ~0.34028235E39) = 0.123E1 * (0.123E1, ~0.17014117E39) = ~0.20927364E39 + (0.123E1, ~0.17014117E39) = ~0.17014117E39 - (0.123E1, ~0.17014117E39) = 0.17014117E39 / (0.123E1, ~0.17014117E39) = ~0.722929E~38 nextAfter (0.123E1, ~0.17014117E39) = 0.12299999E1 rem (0.123E1, ~0.17014117E39) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530001E2 / (0.123E1, ~0.123E2) = ~0.1 nextAfter (0.123E1, ~0.123E2) = 0.12299999E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.31415927E1) = ~0.3864159E1 + (0.123E1, ~0.31415927E1) = ~0.19115927E1 - (0.123E1, ~0.31415927E1) = 0.43715925E1 / (0.123E1, ~0.31415927E1) = ~0.39152116 nextAfter (0.123E1, ~0.31415927E1) = 0.12299999E1 rem (0.123E1, ~0.31415927E1) = 0.123E1 * (0.123E1, ~0.27182817E1) = ~0.33434865E1 + (0.123E1, ~0.27182817E1) = ~0.14882817E1 - (0.123E1, ~0.27182817E1) = 0.39482818E1 / (0.123E1, ~0.27182817E1) = ~0.45249173 nextAfter (0.123E1, ~0.27182817E1) = 0.12299999E1 rem (0.123E1, ~0.27182817E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999E1 rem (0.123E1, ~0.123) = ~0.14901161E~7 * (0.123E1, ~0.123E~2) = ~0.15129001E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999E1 rem (0.123E1, ~0.123E~2) = ~0.33527613E~7 * (0.123E1, ~0.11754944E~37) = ~0.14458581E~37 + (0.123E1, ~0.11754944E~37) = 0.123E1 - (0.123E1, ~0.11754944E~37) = 0.123E1 / (0.123E1, ~0.11754944E~37) = ~0.10463683E39 nextAfter (0.123E1, ~0.11754944E~37) = 0.12299999E1 rem (0.123E1, ~0.11754944E~37) = 0.0 * (0.123E1, ~0.5877472E~38) = ~0.722929E~38 + (0.123E1, ~0.5877472E~38) = 0.123E1 - (0.123E1, ~0.5877472E~38) = 0.123E1 / (0.123E1, ~0.5877472E~38) = ~0.20927366E39 nextAfter (0.123E1, ~0.5877472E~38) = 0.12299999E1 rem (0.123E1, ~0.5877472E~38) = 0.0 * (0.123E1, ~0.1E~44) = ~0.1E~44 + (0.123E1, ~0.1E~44) = 0.123E1 - (0.123E1, ~0.1E~44) = 0.123E1 / (0.123E1, ~0.1E~44) = ~inf nextAfter (0.123E1, ~0.1E~44) = 0.12299999E1 rem (0.123E1, ~0.1E~44) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300001E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.34028235E39) = 0.4185473E38 + (0.123, 0.34028235E39) = 0.34028235E39 - (0.123, 0.34028235E39) = ~0.34028235E39 / (0.123, 0.34028235E39) = 0.361465E~39 nextAfter (0.123, 0.34028235E39) = 0.12300001 rem (0.123, 0.34028235E39) = 0.123 * (0.123, 0.17014117E39) = 0.20927365E38 + (0.123, 0.17014117E39) = 0.17014117E39 - (0.123, 0.17014117E39) = ~0.17014117E39 / (0.123, 0.17014117E39) = 0.722928E~39 nextAfter (0.123, 0.17014117E39) = 0.12300001 rem (0.123, 0.17014117E39) = 0.123 * (0.123, 0.123E4) = 0.15129001E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.100000005E~3 nextAfter (0.123, 0.123E4) = 0.12300001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177E2 / (0.123, 0.123E2) = 0.1E~1 nextAfter (0.123, 0.123E2) = 0.12300001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.31415927E1) = 0.38641593 + (0.123, 0.31415927E1) = 0.32645926E1 - (0.123, 0.31415927E1) = ~0.30185928E1 / (0.123, 0.31415927E1) = 0.39152116E~1 nextAfter (0.123, 0.31415927E1) = 0.12300001 rem (0.123, 0.31415927E1) = 0.123 * (0.123, 0.27182817E1) = 0.33434868 + (0.123, 0.27182817E1) = 0.28412817E1 - (0.123, 0.27182817E1) = ~0.25952818E1 / (0.123, 0.27182817E1) = 0.45249175E~1 nextAfter (0.123, 0.27182817E1) = 0.12300001 rem (0.123, 0.27182817E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129001E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.124230005 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.122999996 rem (0.123, 0.123E~2) = ~0.18626451E~8 * (0.123, 0.11754944E~37) = 0.1445858E~38 + (0.123, 0.11754944E~37) = 0.123 - (0.123, 0.11754944E~37) = 0.123 / (0.123, 0.11754944E~37) = 0.10463683E38 nextAfter (0.123, 0.11754944E~37) = 0.122999996 rem (0.123, 0.11754944E~37) = 0.0 * (0.123, 0.5877472E~38) = 0.722928E~39 + (0.123, 0.5877472E~38) = 0.123 - (0.123, 0.5877472E~38) = 0.123 / (0.123, 0.5877472E~38) = 0.20927366E38 nextAfter (0.123, 0.5877472E~38) = 0.122999996 rem (0.123, 0.5877472E~38) = 0.0 * (0.123, 0.1E~44) = 0.0 + (0.123, 0.1E~44) = 0.123 - (0.123, 0.1E~44) = 0.123 / (0.123, 0.1E~44) = inf nextAfter (0.123, 0.1E~44) = 0.122999996 rem (0.123, 0.1E~44) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.122999996 rem (0.123, 0.0) = nan * (0.123, ~0.34028235E39) = ~0.4185473E38 + (0.123, ~0.34028235E39) = ~0.34028235E39 - (0.123, ~0.34028235E39) = 0.34028235E39 / (0.123, ~0.34028235E39) = ~0.361465E~39 nextAfter (0.123, ~0.34028235E39) = 0.122999996 rem (0.123, ~0.34028235E39) = 0.123 * (0.123, ~0.17014117E39) = ~0.20927365E38 + (0.123, ~0.17014117E39) = ~0.17014117E39 - (0.123, ~0.17014117E39) = 0.17014117E39 / (0.123, ~0.17014117E39) = ~0.722928E~39 nextAfter (0.123, ~0.17014117E39) = 0.122999996 rem (0.123, ~0.17014117E39) = 0.123 * (0.123, ~0.123E4) = ~0.15129001E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.100000005E~3 nextAfter (0.123, ~0.123E4) = 0.122999996 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129001E1 + (0.123, ~0.123E2) = ~0.12177E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.1E~1 nextAfter (0.123, ~0.123E2) = 0.122999996 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.31415927E1) = ~0.38641593 + (0.123, ~0.31415927E1) = ~0.30185928E1 - (0.123, ~0.31415927E1) = 0.32645926E1 / (0.123, ~0.31415927E1) = ~0.39152116E~1 nextAfter (0.123, ~0.31415927E1) = 0.122999996 rem (0.123, ~0.31415927E1) = 0.123 * (0.123, ~0.27182817E1) = ~0.33434868 + (0.123, ~0.27182817E1) = ~0.25952818E1 - (0.123, ~0.27182817E1) = 0.28412817E1 / (0.123, ~0.27182817E1) = ~0.45249175E~1 nextAfter (0.123, ~0.27182817E1) = 0.122999996 rem (0.123, ~0.27182817E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.122999996 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129001E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.122999996 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.124230005 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.122999996 rem (0.123, ~0.123E~2) = ~0.18626451E~8 * (0.123, ~0.11754944E~37) = ~0.1445858E~38 + (0.123, ~0.11754944E~37) = 0.123 - (0.123, ~0.11754944E~37) = 0.123 / (0.123, ~0.11754944E~37) = ~0.10463683E38 nextAfter (0.123, ~0.11754944E~37) = 0.122999996 rem (0.123, ~0.11754944E~37) = 0.0 * (0.123, ~0.5877472E~38) = ~0.722928E~39 + (0.123, ~0.5877472E~38) = 0.123 - (0.123, ~0.5877472E~38) = 0.123 / (0.123, ~0.5877472E~38) = ~0.20927366E38 nextAfter (0.123, ~0.5877472E~38) = 0.122999996 rem (0.123, ~0.5877472E~38) = 0.0 * (0.123, ~0.1E~44) = ~0.0 + (0.123, ~0.1E~44) = 0.123 - (0.123, ~0.1E~44) = 0.123 / (0.123, ~0.1E~44) = ~inf nextAfter (0.123, ~0.1E~44) = 0.122999996 rem (0.123, ~0.1E~44) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.122999996 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.122999996 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.34028235E39) = 0.4185473E36 + (0.123E~2, 0.34028235E39) = 0.34028235E39 - (0.123E~2, 0.34028235E39) = ~0.34028235E39 / (0.123E~2, 0.34028235E39) = 0.3614E~41 nextAfter (0.123E~2, 0.34028235E39) = 0.12300002E~2 rem (0.123E~2, 0.34028235E39) = 0.123E~2 * (0.123E~2, 0.17014117E39) = 0.20927364E36 + (0.123E~2, 0.17014117E39) = 0.17014117E39 - (0.123E~2, 0.17014117E39) = ~0.17014117E39 / (0.123E~2, 0.17014117E39) = 0.7229E~41 nextAfter (0.123E~2, 0.17014117E39) = 0.12300002E~2 rem (0.123E~2, 0.17014117E39) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129001E1 + (0.123E~2, 0.123E4) = 0.12300012E4 - (0.123E~2, 0.123E4) = ~0.12299988E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129001E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.1229877E2 / (0.123E~2, 0.123E2) = 0.100000005E~3 nextAfter (0.123E~2, 0.123E2) = 0.12300002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.31415927E1) = 0.38641593E~2 + (0.123E~2, 0.31415927E1) = 0.31428227E1 - (0.123E~2, 0.31415927E1) = ~0.31403627E1 / (0.123E~2, 0.31415927E1) = 0.39152117E~3 nextAfter (0.123E~2, 0.31415927E1) = 0.12300002E~2 rem (0.123E~2, 0.31415927E1) = 0.123E~2 * (0.123E~2, 0.27182817E1) = 0.33434867E~2 + (0.123E~2, 0.27182817E1) = 0.27195117E1 - (0.123E~2, 0.27182817E1) = ~0.27170517E1 / (0.123E~2, 0.27182817E1) = 0.45249175E~3 nextAfter (0.123E~2, 0.27182817E1) = 0.12300002E~2 rem (0.123E~2, 0.27182817E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129001E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.124230005 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129001E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.11754944E~37) = 0.14459E~40 + (0.123E~2, 0.11754944E~37) = 0.123E~2 - (0.123E~2, 0.11754944E~37) = 0.123E~2 / (0.123E~2, 0.11754944E~37) = 0.10463683E36 nextAfter (0.123E~2, 0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, 0.11754944E~37) = 0.0 * (0.123E~2, 0.5877472E~38) = 0.7229E~41 + (0.123E~2, 0.5877472E~38) = 0.123E~2 - (0.123E~2, 0.5877472E~38) = 0.123E~2 / (0.123E~2, 0.5877472E~38) = 0.20927366E36 nextAfter (0.123E~2, 0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, 0.5877472E~38) = 0.0 * (0.123E~2, 0.1E~44) = 0.0 + (0.123E~2, 0.1E~44) = 0.123E~2 - (0.123E~2, 0.1E~44) = 0.123E~2 / (0.123E~2, 0.1E~44) = inf nextAfter (0.123E~2, 0.1E~44) = 0.12299999E~2 rem (0.123E~2, 0.1E~44) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.34028235E39) = ~0.4185473E36 + (0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (0.123E~2, ~0.34028235E39) = 0.34028235E39 / (0.123E~2, ~0.34028235E39) = ~0.3614E~41 nextAfter (0.123E~2, ~0.34028235E39) = 0.12299999E~2 rem (0.123E~2, ~0.34028235E39) = 0.123E~2 * (0.123E~2, ~0.17014117E39) = ~0.20927364E36 + (0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (0.123E~2, ~0.17014117E39) = 0.17014117E39 / (0.123E~2, ~0.17014117E39) = ~0.7229E~41 nextAfter (0.123E~2, ~0.17014117E39) = 0.12299999E~2 rem (0.123E~2, ~0.17014117E39) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129001E1 + (0.123E~2, ~0.123E4) = ~0.12299988E4 - (0.123E~2, ~0.123E4) = 0.12300012E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129001E~1 + (0.123E~2, ~0.123E2) = ~0.1229877E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.100000005E~3 nextAfter (0.123E~2, ~0.123E2) = 0.12299999E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.31415927E1) = ~0.38641593E~2 + (0.123E~2, ~0.31415927E1) = ~0.31403627E1 - (0.123E~2, ~0.31415927E1) = 0.31428227E1 / (0.123E~2, ~0.31415927E1) = ~0.39152117E~3 nextAfter (0.123E~2, ~0.31415927E1) = 0.12299999E~2 rem (0.123E~2, ~0.31415927E1) = 0.123E~2 * (0.123E~2, ~0.27182817E1) = ~0.33434867E~2 + (0.123E~2, ~0.27182817E1) = ~0.27170517E1 - (0.123E~2, ~0.27182817E1) = 0.27195117E1 / (0.123E~2, ~0.27182817E1) = ~0.45249175E~3 nextAfter (0.123E~2, ~0.27182817E1) = 0.12299999E~2 rem (0.123E~2, ~0.27182817E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129001E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.124230005 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129001E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.11754944E~37) = ~0.14459E~40 + (0.123E~2, ~0.11754944E~37) = 0.123E~2 - (0.123E~2, ~0.11754944E~37) = 0.123E~2 / (0.123E~2, ~0.11754944E~37) = ~0.10463683E36 nextAfter (0.123E~2, ~0.11754944E~37) = 0.12299999E~2 rem (0.123E~2, ~0.11754944E~37) = 0.0 * (0.123E~2, ~0.5877472E~38) = ~0.7229E~41 + (0.123E~2, ~0.5877472E~38) = 0.123E~2 - (0.123E~2, ~0.5877472E~38) = 0.123E~2 / (0.123E~2, ~0.5877472E~38) = ~0.20927366E36 nextAfter (0.123E~2, ~0.5877472E~38) = 0.12299999E~2 rem (0.123E~2, ~0.5877472E~38) = 0.0 * (0.123E~2, ~0.1E~44) = ~0.0 + (0.123E~2, ~0.1E~44) = 0.123E~2 - (0.123E~2, ~0.1E~44) = 0.123E~2 / (0.123E~2, ~0.1E~44) = ~inf nextAfter (0.123E~2, ~0.1E~44) = 0.12299999E~2 rem (0.123E~2, ~0.1E~44) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.11754944E~37, 0.34028235E39) = 0.39999998E1 + (0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (0.11754944E~37, 0.34028235E39) = 0.0 nextAfter (0.11754944E~37, 0.34028235E39) = 0.11754945E~37 rem (0.11754944E~37, 0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, 0.17014117E39) = 0.19999999E1 + (0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (0.11754944E~37, 0.17014117E39) = 0.0 nextAfter (0.11754944E~37, 0.17014117E39) = 0.11754945E~37 rem (0.11754944E~37, 0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, 0.123E4) = 0.1445858E~34 + (0.11754944E~37, 0.123E4) = 0.123E4 - (0.11754944E~37, 0.123E4) = ~0.123E4 / (0.11754944E~37, 0.123E4) = 0.9557E~41 nextAfter (0.11754944E~37, 0.123E4) = 0.11754945E~37 rem (0.11754944E~37, 0.123E4) = 0.11754944E~37 * (0.11754944E~37, 0.123E2) = 0.14458581E~36 + (0.11754944E~37, 0.123E2) = 0.123E2 - (0.11754944E~37, 0.123E2) = ~0.123E2 / (0.11754944E~37, 0.123E2) = 0.955687E~39 nextAfter (0.11754944E~37, 0.123E2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E2) = 0.11754944E~37 * (0.11754944E~37, 0.31415927E1) = 0.36929245E~37 + (0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (0.11754944E~37, 0.31415927E1) = 0.3741715E~38 nextAfter (0.11754944E~37, 0.31415927E1) = 0.11754945E~37 rem (0.11754944E~37, 0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, 0.27182817E1) = 0.31953248E~37 + (0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (0.11754944E~37, 0.27182817E1) = 0.4324403E~38 nextAfter (0.11754944E~37, 0.27182817E1) = 0.11754945E~37 rem (0.11754944E~37, 0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, 0.123E1) = 0.14458581E~37 + (0.11754944E~37, 0.123E1) = 0.123E1 - (0.11754944E~37, 0.123E1) = ~0.123E1 / (0.11754944E~37, 0.123E1) = 0.9556864E~38 nextAfter (0.11754944E~37, 0.123E1) = 0.11754945E~37 rem (0.11754944E~37, 0.123E1) = 0.11754944E~37 * (0.11754944E~37, 0.123) = 0.1445858E~38 + (0.11754944E~37, 0.123) = 0.123 - (0.11754944E~37, 0.123) = ~0.123 / (0.11754944E~37, 0.123) = 0.9556864E~37 nextAfter (0.11754944E~37, 0.123) = 0.11754945E~37 rem (0.11754944E~37, 0.123) = 0.11754944E~37 * (0.11754944E~37, 0.123E~2) = 0.14459E~40 + (0.11754944E~37, 0.123E~2) = 0.123E~2 - (0.11754944E~37, 0.123E~2) = ~0.123E~2 / (0.11754944E~37, 0.123E~2) = 0.95568645E~35 nextAfter (0.11754944E~37, 0.123E~2) = 0.11754945E~37 rem (0.11754944E~37, 0.123E~2) = 0.11754944E~37 * (0.11754944E~37, 0.11754944E~37) = 0.0 + (0.11754944E~37, 0.11754944E~37) = 0.23509887E~37 - (0.11754944E~37, 0.11754944E~37) = 0.0 / (0.11754944E~37, 0.11754944E~37) = 0.1E1 nextAfter (0.11754944E~37, 0.11754944E~37) = 0.11754944E~37 rem (0.11754944E~37, 0.11754944E~37) = 0.0 * (0.11754944E~37, 0.5877472E~38) = 0.0 + (0.11754944E~37, 0.5877472E~38) = 0.17632415E~37 - (0.11754944E~37, 0.5877472E~38) = 0.5877472E~38 / (0.11754944E~37, 0.5877472E~38) = 0.2E1 nextAfter (0.11754944E~37, 0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, 0.5877472E~38) = 0.0 * (0.11754944E~37, 0.1E~44) = 0.0 + (0.11754944E~37, 0.1E~44) = 0.11754945E~37 - (0.11754944E~37, 0.1E~44) = 0.11754942E~37 / (0.11754944E~37, 0.1E~44) = 0.8388608E7 nextAfter (0.11754944E~37, 0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, 0.1E~44) = 0.0 * (0.11754944E~37, 0.0) = 0.0 + (0.11754944E~37, 0.0) = 0.11754944E~37 - (0.11754944E~37, 0.0) = 0.11754944E~37 / (0.11754944E~37, 0.0) = inf nextAfter (0.11754944E~37, 0.0) = 0.11754942E~37 rem (0.11754944E~37, 0.0) = nan * (0.11754944E~37, ~0.34028235E39) = ~0.39999998E1 + (0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (0.11754944E~37, ~0.34028235E39) = ~0.0 nextAfter (0.11754944E~37, ~0.34028235E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.34028235E39) = 0.11754944E~37 * (0.11754944E~37, ~0.17014117E39) = ~0.19999999E1 + (0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (0.11754944E~37, ~0.17014117E39) = ~0.0 nextAfter (0.11754944E~37, ~0.17014117E39) = 0.11754942E~37 rem (0.11754944E~37, ~0.17014117E39) = 0.11754944E~37 * (0.11754944E~37, ~0.123E4) = ~0.1445858E~34 + (0.11754944E~37, ~0.123E4) = ~0.123E4 - (0.11754944E~37, ~0.123E4) = 0.123E4 / (0.11754944E~37, ~0.123E4) = ~0.9557E~41 nextAfter (0.11754944E~37, ~0.123E4) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E4) = 0.11754944E~37 * (0.11754944E~37, ~0.123E2) = ~0.14458581E~36 + (0.11754944E~37, ~0.123E2) = ~0.123E2 - (0.11754944E~37, ~0.123E2) = 0.123E2 / (0.11754944E~37, ~0.123E2) = ~0.955687E~39 nextAfter (0.11754944E~37, ~0.123E2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E2) = 0.11754944E~37 * (0.11754944E~37, ~0.31415927E1) = ~0.36929245E~37 + (0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (0.11754944E~37, ~0.31415927E1) = ~0.3741715E~38 nextAfter (0.11754944E~37, ~0.31415927E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.31415927E1) = 0.11754944E~37 * (0.11754944E~37, ~0.27182817E1) = ~0.31953248E~37 + (0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (0.11754944E~37, ~0.27182817E1) = ~0.4324403E~38 nextAfter (0.11754944E~37, ~0.27182817E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.27182817E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123E1) = ~0.14458581E~37 + (0.11754944E~37, ~0.123E1) = ~0.123E1 - (0.11754944E~37, ~0.123E1) = 0.123E1 / (0.11754944E~37, ~0.123E1) = ~0.9556864E~38 nextAfter (0.11754944E~37, ~0.123E1) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E1) = 0.11754944E~37 * (0.11754944E~37, ~0.123) = ~0.1445858E~38 + (0.11754944E~37, ~0.123) = ~0.123 - (0.11754944E~37, ~0.123) = 0.123 / (0.11754944E~37, ~0.123) = ~0.9556864E~37 nextAfter (0.11754944E~37, ~0.123) = 0.11754942E~37 rem (0.11754944E~37, ~0.123) = 0.11754944E~37 * (0.11754944E~37, ~0.123E~2) = ~0.14459E~40 + (0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (0.11754944E~37, ~0.123E~2) = 0.123E~2 / (0.11754944E~37, ~0.123E~2) = ~0.95568645E~35 nextAfter (0.11754944E~37, ~0.123E~2) = 0.11754942E~37 rem (0.11754944E~37, ~0.123E~2) = 0.11754944E~37 * (0.11754944E~37, ~0.11754944E~37) = ~0.0 + (0.11754944E~37, ~0.11754944E~37) = 0.0 - (0.11754944E~37, ~0.11754944E~37) = 0.23509887E~37 / (0.11754944E~37, ~0.11754944E~37) = ~0.1E1 nextAfter (0.11754944E~37, ~0.11754944E~37) = 0.11754942E~37 rem (0.11754944E~37, ~0.11754944E~37) = 0.0 * (0.11754944E~37, ~0.5877472E~38) = ~0.0 + (0.11754944E~37, ~0.5877472E~38) = 0.5877472E~38 - (0.11754944E~37, ~0.5877472E~38) = 0.17632415E~37 / (0.11754944E~37, ~0.5877472E~38) = ~0.2E1 nextAfter (0.11754944E~37, ~0.5877472E~38) = 0.11754942E~37 rem (0.11754944E~37, ~0.5877472E~38) = 0.0 * (0.11754944E~37, ~0.1E~44) = ~0.0 + (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 - (0.11754944E~37, ~0.1E~44) = 0.11754945E~37 / (0.11754944E~37, ~0.1E~44) = ~0.8388608E7 nextAfter (0.11754944E~37, ~0.1E~44) = 0.11754942E~37 rem (0.11754944E~37, ~0.1E~44) = 0.0 * (0.11754944E~37, ~0.0) = ~0.0 + (0.11754944E~37, ~0.0) = 0.11754944E~37 - (0.11754944E~37, ~0.0) = 0.11754944E~37 / (0.11754944E~37, ~0.0) = ~inf nextAfter (0.11754944E~37, ~0.0) = 0.11754942E~37 rem (0.11754944E~37, ~0.0) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.11754944E~37, ~inf) = ~inf + (0.11754944E~37, ~inf) = ~inf - (0.11754944E~37, ~inf) = inf / (0.11754944E~37, ~inf) = ~0.0 nextAfter (0.11754944E~37, ~inf) = 0.11754942E~37 rem (0.11754944E~37, ~inf) = 0.11754944E~37 * (0.11754944E~37, nan) = nan + (0.11754944E~37, nan) = nan - (0.11754944E~37, nan) = nan / (0.11754944E~37, nan) = nan nextAfter (0.11754944E~37, nan) = nan rem (0.11754944E~37, nan) = nan * (0.11754944E~37, inf) = inf + (0.11754944E~37, inf) = inf - (0.11754944E~37, inf) = ~inf / (0.11754944E~37, inf) = 0.0 nextAfter (0.11754944E~37, inf) = 0.11754945E~37 rem (0.11754944E~37, inf) = 0.11754944E~37 * (0.5877472E~38, 0.34028235E39) = 0.19999999E1 + (0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (0.5877472E~38, 0.34028235E39) = 0.0 nextAfter (0.5877472E~38, 0.34028235E39) = 0.5877473E~38 rem (0.5877472E~38, 0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, 0.17014117E39) = 0.99999994 + (0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (0.5877472E~38, 0.17014117E39) = 0.0 nextAfter (0.5877472E~38, 0.17014117E39) = 0.5877473E~38 rem (0.5877472E~38, 0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, 0.123E4) = 0.722929E~35 + (0.5877472E~38, 0.123E4) = 0.123E4 - (0.5877472E~38, 0.123E4) = ~0.123E4 / (0.5877472E~38, 0.123E4) = 0.4778E~41 nextAfter (0.5877472E~38, 0.123E4) = 0.5877473E~38 rem (0.5877472E~38, 0.123E4) = 0.5877472E~38 * (0.5877472E~38, 0.123E2) = 0.72292904E~37 + (0.5877472E~38, 0.123E2) = 0.123E2 - (0.5877472E~38, 0.123E2) = ~0.123E2 / (0.5877472E~38, 0.123E2) = 0.477843E~39 nextAfter (0.5877472E~38, 0.123E2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E2) = 0.5877472E~38 * (0.5877472E~38, 0.31415927E1) = 0.18464623E~37 + (0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (0.5877472E~38, 0.31415927E1) = 0.1870857E~38 nextAfter (0.5877472E~38, 0.31415927E1) = 0.5877473E~38 rem (0.5877472E~38, 0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, 0.27182817E1) = 0.15976624E~37 + (0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (0.5877472E~38, 0.27182817E1) = 0.2162201E~38 nextAfter (0.5877472E~38, 0.27182817E1) = 0.5877473E~38 rem (0.5877472E~38, 0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, 0.123E1) = 0.722929E~38 + (0.5877472E~38, 0.123E1) = 0.123E1 - (0.5877472E~38, 0.123E1) = ~0.123E1 / (0.5877472E~38, 0.123E1) = 0.4778432E~38 nextAfter (0.5877472E~38, 0.123E1) = 0.5877473E~38 rem (0.5877472E~38, 0.123E1) = 0.5877472E~38 * (0.5877472E~38, 0.123) = 0.722928E~39 + (0.5877472E~38, 0.123) = 0.123 - (0.5877472E~38, 0.123) = ~0.123 / (0.5877472E~38, 0.123) = 0.4778432E~37 nextAfter (0.5877472E~38, 0.123) = 0.5877473E~38 rem (0.5877472E~38, 0.123) = 0.5877472E~38 * (0.5877472E~38, 0.123E~2) = 0.7229E~41 + (0.5877472E~38, 0.123E~2) = 0.123E~2 - (0.5877472E~38, 0.123E~2) = ~0.123E~2 / (0.5877472E~38, 0.123E~2) = 0.47784322E~35 nextAfter (0.5877472E~38, 0.123E~2) = 0.5877473E~38 rem (0.5877472E~38, 0.123E~2) = 0.5877472E~38 * (0.5877472E~38, 0.11754944E~37) = 0.0 + (0.5877472E~38, 0.11754944E~37) = 0.17632415E~37 - (0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 / (0.5877472E~38, 0.11754944E~37) = 0.5 nextAfter (0.5877472E~38, 0.11754944E~37) = 0.5877473E~38 rem (0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, 0.5877472E~38) = 0.0 + (0.5877472E~38, 0.5877472E~38) = 0.11754944E~37 - (0.5877472E~38, 0.5877472E~38) = 0.0 / (0.5877472E~38, 0.5877472E~38) = 0.1E1 nextAfter (0.5877472E~38, 0.5877472E~38) = 0.5877472E~38 rem (0.5877472E~38, 0.5877472E~38) = 0.0 * (0.5877472E~38, 0.1E~44) = 0.0 + (0.5877472E~38, 0.1E~44) = 0.5877473E~38 - (0.5877472E~38, 0.1E~44) = 0.587747E~38 / (0.5877472E~38, 0.1E~44) = 0.4194304E7 nextAfter (0.5877472E~38, 0.1E~44) = 0.587747E~38 rem (0.5877472E~38, 0.1E~44) = 0.0 * (0.5877472E~38, 0.0) = 0.0 + (0.5877472E~38, 0.0) = 0.5877472E~38 - (0.5877472E~38, 0.0) = 0.5877472E~38 / (0.5877472E~38, 0.0) = inf nextAfter (0.5877472E~38, 0.0) = 0.587747E~38 rem (0.5877472E~38, 0.0) = nan * (0.5877472E~38, ~0.34028235E39) = ~0.19999999E1 + (0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (0.5877472E~38, ~0.34028235E39) = ~0.0 nextAfter (0.5877472E~38, ~0.34028235E39) = 0.587747E~38 rem (0.5877472E~38, ~0.34028235E39) = 0.5877472E~38 * (0.5877472E~38, ~0.17014117E39) = ~0.99999994 + (0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (0.5877472E~38, ~0.17014117E39) = ~0.0 nextAfter (0.5877472E~38, ~0.17014117E39) = 0.587747E~38 rem (0.5877472E~38, ~0.17014117E39) = 0.5877472E~38 * (0.5877472E~38, ~0.123E4) = ~0.722929E~35 + (0.5877472E~38, ~0.123E4) = ~0.123E4 - (0.5877472E~38, ~0.123E4) = 0.123E4 / (0.5877472E~38, ~0.123E4) = ~0.4778E~41 nextAfter (0.5877472E~38, ~0.123E4) = 0.587747E~38 rem (0.5877472E~38, ~0.123E4) = 0.5877472E~38 * (0.5877472E~38, ~0.123E2) = ~0.72292904E~37 + (0.5877472E~38, ~0.123E2) = ~0.123E2 - (0.5877472E~38, ~0.123E2) = 0.123E2 / (0.5877472E~38, ~0.123E2) = ~0.477843E~39 nextAfter (0.5877472E~38, ~0.123E2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E2) = 0.5877472E~38 * (0.5877472E~38, ~0.31415927E1) = ~0.18464623E~37 + (0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (0.5877472E~38, ~0.31415927E1) = ~0.1870857E~38 nextAfter (0.5877472E~38, ~0.31415927E1) = 0.587747E~38 rem (0.5877472E~38, ~0.31415927E1) = 0.5877472E~38 * (0.5877472E~38, ~0.27182817E1) = ~0.15976624E~37 + (0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (0.5877472E~38, ~0.27182817E1) = ~0.2162201E~38 nextAfter (0.5877472E~38, ~0.27182817E1) = 0.587747E~38 rem (0.5877472E~38, ~0.27182817E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123E1) = ~0.722929E~38 + (0.5877472E~38, ~0.123E1) = ~0.123E1 - (0.5877472E~38, ~0.123E1) = 0.123E1 / (0.5877472E~38, ~0.123E1) = ~0.4778432E~38 nextAfter (0.5877472E~38, ~0.123E1) = 0.587747E~38 rem (0.5877472E~38, ~0.123E1) = 0.5877472E~38 * (0.5877472E~38, ~0.123) = ~0.722928E~39 + (0.5877472E~38, ~0.123) = ~0.123 - (0.5877472E~38, ~0.123) = 0.123 / (0.5877472E~38, ~0.123) = ~0.4778432E~37 nextAfter (0.5877472E~38, ~0.123) = 0.587747E~38 rem (0.5877472E~38, ~0.123) = 0.5877472E~38 * (0.5877472E~38, ~0.123E~2) = ~0.7229E~41 + (0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (0.5877472E~38, ~0.123E~2) = 0.123E~2 / (0.5877472E~38, ~0.123E~2) = ~0.47784322E~35 nextAfter (0.5877472E~38, ~0.123E~2) = 0.587747E~38 rem (0.5877472E~38, ~0.123E~2) = 0.5877472E~38 * (0.5877472E~38, ~0.11754944E~37) = ~0.0 + (0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 - (0.5877472E~38, ~0.11754944E~37) = 0.17632415E~37 / (0.5877472E~38, ~0.11754944E~37) = ~0.5 nextAfter (0.5877472E~38, ~0.11754944E~37) = 0.587747E~38 rem (0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 * (0.5877472E~38, ~0.5877472E~38) = ~0.0 + (0.5877472E~38, ~0.5877472E~38) = 0.0 - (0.5877472E~38, ~0.5877472E~38) = 0.11754944E~37 / (0.5877472E~38, ~0.5877472E~38) = ~0.1E1 nextAfter (0.5877472E~38, ~0.5877472E~38) = 0.587747E~38 rem (0.5877472E~38, ~0.5877472E~38) = 0.0 * (0.5877472E~38, ~0.1E~44) = ~0.0 + (0.5877472E~38, ~0.1E~44) = 0.587747E~38 - (0.5877472E~38, ~0.1E~44) = 0.5877473E~38 / (0.5877472E~38, ~0.1E~44) = ~0.4194304E7 nextAfter (0.5877472E~38, ~0.1E~44) = 0.587747E~38 rem (0.5877472E~38, ~0.1E~44) = 0.0 * (0.5877472E~38, ~0.0) = ~0.0 + (0.5877472E~38, ~0.0) = 0.5877472E~38 - (0.5877472E~38, ~0.0) = 0.5877472E~38 / (0.5877472E~38, ~0.0) = ~inf nextAfter (0.5877472E~38, ~0.0) = 0.587747E~38 rem (0.5877472E~38, ~0.0) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.5877472E~38, ~inf) = ~inf + (0.5877472E~38, ~inf) = ~inf - (0.5877472E~38, ~inf) = inf / (0.5877472E~38, ~inf) = ~0.0 nextAfter (0.5877472E~38, ~inf) = 0.587747E~38 rem (0.5877472E~38, ~inf) = 0.5877472E~38 * (0.5877472E~38, nan) = nan + (0.5877472E~38, nan) = nan - (0.5877472E~38, nan) = nan / (0.5877472E~38, nan) = nan nextAfter (0.5877472E~38, nan) = nan rem (0.5877472E~38, nan) = nan * (0.5877472E~38, inf) = inf + (0.5877472E~38, inf) = inf - (0.5877472E~38, inf) = ~inf / (0.5877472E~38, inf) = 0.0 nextAfter (0.5877472E~38, inf) = 0.5877473E~38 rem (0.5877472E~38, inf) = 0.5877472E~38 * (0.1E~44, 0.34028235E39) = 0.47683713E~6 + (0.1E~44, 0.34028235E39) = 0.34028235E39 - (0.1E~44, 0.34028235E39) = ~0.34028235E39 / (0.1E~44, 0.34028235E39) = 0.0 nextAfter (0.1E~44, 0.34028235E39) = 0.3E~44 rem (0.1E~44, 0.34028235E39) = 0.1E~44 * (0.1E~44, 0.17014117E39) = 0.23841856E~6 + (0.1E~44, 0.17014117E39) = 0.17014117E39 - (0.1E~44, 0.17014117E39) = ~0.17014117E39 / (0.1E~44, 0.17014117E39) = 0.0 nextAfter (0.1E~44, 0.17014117E39) = 0.3E~44 rem (0.1E~44, 0.17014117E39) = 0.1E~44 * (0.1E~44, 0.123E4) = 0.1724E~41 + (0.1E~44, 0.123E4) = 0.123E4 - (0.1E~44, 0.123E4) = ~0.123E4 / (0.1E~44, 0.123E4) = 0.0 nextAfter (0.1E~44, 0.123E4) = 0.3E~44 rem (0.1E~44, 0.123E4) = 0.1E~44 * (0.1E~44, 0.123E2) = 0.17E~43 + (0.1E~44, 0.123E2) = 0.123E2 - (0.1E~44, 0.123E2) = ~0.123E2 / (0.1E~44, 0.123E2) = 0.0 nextAfter (0.1E~44, 0.123E2) = 0.3E~44 rem (0.1E~44, 0.123E2) = 0.1E~44 * (0.1E~44, 0.31415927E1) = 0.4E~44 + (0.1E~44, 0.31415927E1) = 0.31415927E1 - (0.1E~44, 0.31415927E1) = ~0.31415927E1 / (0.1E~44, 0.31415927E1) = 0.0 nextAfter (0.1E~44, 0.31415927E1) = 0.3E~44 rem (0.1E~44, 0.31415927E1) = 0.1E~44 * (0.1E~44, 0.27182817E1) = 0.4E~44 + (0.1E~44, 0.27182817E1) = 0.27182817E1 - (0.1E~44, 0.27182817E1) = ~0.27182817E1 / (0.1E~44, 0.27182817E1) = 0.0 nextAfter (0.1E~44, 0.27182817E1) = 0.3E~44 rem (0.1E~44, 0.27182817E1) = 0.1E~44 * (0.1E~44, 0.123E1) = 0.1E~44 + (0.1E~44, 0.123E1) = 0.123E1 - (0.1E~44, 0.123E1) = ~0.123E1 / (0.1E~44, 0.123E1) = 0.1E~44 nextAfter (0.1E~44, 0.123E1) = 0.3E~44 rem (0.1E~44, 0.123E1) = 0.1E~44 * (0.1E~44, 0.123) = 0.0 + (0.1E~44, 0.123) = 0.123 - (0.1E~44, 0.123) = ~0.123 / (0.1E~44, 0.123) = 0.11E~43 nextAfter (0.1E~44, 0.123) = 0.3E~44 rem (0.1E~44, 0.123) = 0.1E~44 * (0.1E~44, 0.123E~2) = 0.0 + (0.1E~44, 0.123E~2) = 0.123E~2 - (0.1E~44, 0.123E~2) = ~0.123E~2 / (0.1E~44, 0.123E~2) = 0.1139E~41 nextAfter (0.1E~44, 0.123E~2) = 0.3E~44 rem (0.1E~44, 0.123E~2) = 0.1E~44 * (0.1E~44, 0.11754944E~37) = 0.0 + (0.1E~44, 0.11754944E~37) = 0.11754945E~37 - (0.1E~44, 0.11754944E~37) = ~0.11754942E~37 / (0.1E~44, 0.11754944E~37) = 0.11920929E~6 nextAfter (0.1E~44, 0.11754944E~37) = 0.3E~44 rem (0.1E~44, 0.11754944E~37) = 0.1E~44 * (0.1E~44, 0.5877472E~38) = 0.0 + (0.1E~44, 0.5877472E~38) = 0.5877473E~38 - (0.1E~44, 0.5877472E~38) = ~0.587747E~38 / (0.1E~44, 0.5877472E~38) = 0.23841858E~6 nextAfter (0.1E~44, 0.5877472E~38) = 0.3E~44 rem (0.1E~44, 0.5877472E~38) = 0.1E~44 * (0.1E~44, 0.1E~44) = 0.0 + (0.1E~44, 0.1E~44) = 0.3E~44 - (0.1E~44, 0.1E~44) = 0.0 / (0.1E~44, 0.1E~44) = 0.1E1 nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 rem (0.1E~44, 0.1E~44) = 0.0 * (0.1E~44, 0.0) = 0.0 + (0.1E~44, 0.0) = 0.1E~44 - (0.1E~44, 0.0) = 0.1E~44 / (0.1E~44, 0.0) = inf nextAfter (0.1E~44, 0.0) = 0.0 rem (0.1E~44, 0.0) = nan * (0.1E~44, ~0.34028235E39) = ~0.47683713E~6 + (0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (0.1E~44, ~0.34028235E39) = 0.34028235E39 / (0.1E~44, ~0.34028235E39) = ~0.0 nextAfter (0.1E~44, ~0.34028235E39) = 0.0 rem (0.1E~44, ~0.34028235E39) = 0.1E~44 * (0.1E~44, ~0.17014117E39) = ~0.23841856E~6 + (0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (0.1E~44, ~0.17014117E39) = 0.17014117E39 / (0.1E~44, ~0.17014117E39) = ~0.0 nextAfter (0.1E~44, ~0.17014117E39) = 0.0 rem (0.1E~44, ~0.17014117E39) = 0.1E~44 * (0.1E~44, ~0.123E4) = ~0.1724E~41 + (0.1E~44, ~0.123E4) = ~0.123E4 - (0.1E~44, ~0.123E4) = 0.123E4 / (0.1E~44, ~0.123E4) = ~0.0 nextAfter (0.1E~44, ~0.123E4) = 0.0 rem (0.1E~44, ~0.123E4) = 0.1E~44 * (0.1E~44, ~0.123E2) = ~0.17E~43 + (0.1E~44, ~0.123E2) = ~0.123E2 - (0.1E~44, ~0.123E2) = 0.123E2 / (0.1E~44, ~0.123E2) = ~0.0 nextAfter (0.1E~44, ~0.123E2) = 0.0 rem (0.1E~44, ~0.123E2) = 0.1E~44 * (0.1E~44, ~0.31415927E1) = ~0.4E~44 + (0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (0.1E~44, ~0.31415927E1) = 0.31415927E1 / (0.1E~44, ~0.31415927E1) = ~0.0 nextAfter (0.1E~44, ~0.31415927E1) = 0.0 rem (0.1E~44, ~0.31415927E1) = 0.1E~44 * (0.1E~44, ~0.27182817E1) = ~0.4E~44 + (0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (0.1E~44, ~0.27182817E1) = 0.27182817E1 / (0.1E~44, ~0.27182817E1) = ~0.0 nextAfter (0.1E~44, ~0.27182817E1) = 0.0 rem (0.1E~44, ~0.27182817E1) = 0.1E~44 * (0.1E~44, ~0.123E1) = ~0.1E~44 + (0.1E~44, ~0.123E1) = ~0.123E1 - (0.1E~44, ~0.123E1) = 0.123E1 / (0.1E~44, ~0.123E1) = ~0.1E~44 nextAfter (0.1E~44, ~0.123E1) = 0.0 rem (0.1E~44, ~0.123E1) = 0.1E~44 * (0.1E~44, ~0.123) = ~0.0 + (0.1E~44, ~0.123) = ~0.123 - (0.1E~44, ~0.123) = 0.123 / (0.1E~44, ~0.123) = ~0.11E~43 nextAfter (0.1E~44, ~0.123) = 0.0 rem (0.1E~44, ~0.123) = 0.1E~44 * (0.1E~44, ~0.123E~2) = ~0.0 + (0.1E~44, ~0.123E~2) = ~0.123E~2 - (0.1E~44, ~0.123E~2) = 0.123E~2 / (0.1E~44, ~0.123E~2) = ~0.1139E~41 nextAfter (0.1E~44, ~0.123E~2) = 0.0 rem (0.1E~44, ~0.123E~2) = 0.1E~44 * (0.1E~44, ~0.11754944E~37) = ~0.0 + (0.1E~44, ~0.11754944E~37) = ~0.11754942E~37 - (0.1E~44, ~0.11754944E~37) = 0.11754945E~37 / (0.1E~44, ~0.11754944E~37) = ~0.11920929E~6 nextAfter (0.1E~44, ~0.11754944E~37) = 0.0 rem (0.1E~44, ~0.11754944E~37) = 0.1E~44 * (0.1E~44, ~0.5877472E~38) = ~0.0 + (0.1E~44, ~0.5877472E~38) = ~0.587747E~38 - (0.1E~44, ~0.5877472E~38) = 0.5877473E~38 / (0.1E~44, ~0.5877472E~38) = ~0.23841858E~6 nextAfter (0.1E~44, ~0.5877472E~38) = 0.0 rem (0.1E~44, ~0.5877472E~38) = 0.1E~44 * (0.1E~44, ~0.1E~44) = ~0.0 + (0.1E~44, ~0.1E~44) = 0.0 - (0.1E~44, ~0.1E~44) = 0.3E~44 / (0.1E~44, ~0.1E~44) = ~0.1E1 nextAfter (0.1E~44, ~0.1E~44) = 0.0 rem (0.1E~44, ~0.1E~44) = 0.0 * (0.1E~44, ~0.0) = ~0.0 + (0.1E~44, ~0.0) = 0.1E~44 - (0.1E~44, ~0.0) = 0.1E~44 / (0.1E~44, ~0.0) = ~inf nextAfter (0.1E~44, ~0.0) = 0.0 rem (0.1E~44, ~0.0) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.1E~44, ~inf) = ~inf + (0.1E~44, ~inf) = ~inf - (0.1E~44, ~inf) = inf / (0.1E~44, ~inf) = ~0.0 nextAfter (0.1E~44, ~inf) = 0.0 rem (0.1E~44, ~inf) = 0.1E~44 * (0.1E~44, nan) = nan + (0.1E~44, nan) = nan - (0.1E~44, nan) = nan / (0.1E~44, nan) = nan nextAfter (0.1E~44, nan) = nan rem (0.1E~44, nan) = nan * (0.1E~44, inf) = inf + (0.1E~44, inf) = inf - (0.1E~44, inf) = ~inf / (0.1E~44, inf) = 0.0 nextAfter (0.1E~44, inf) = 0.3E~44 rem (0.1E~44, inf) = 0.1E~44 * (0.0, 0.34028235E39) = 0.0 + (0.0, 0.34028235E39) = 0.34028235E39 - (0.0, 0.34028235E39) = ~0.34028235E39 / (0.0, 0.34028235E39) = 0.0 nextAfter (0.0, 0.34028235E39) = 0.1E~44 rem (0.0, 0.34028235E39) = 0.0 * (0.0, 0.17014117E39) = 0.0 + (0.0, 0.17014117E39) = 0.17014117E39 - (0.0, 0.17014117E39) = ~0.17014117E39 / (0.0, 0.17014117E39) = 0.0 nextAfter (0.0, 0.17014117E39) = 0.1E~44 rem (0.0, 0.17014117E39) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.1E~44 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.1E~44 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.31415927E1) = 0.0 + (0.0, 0.31415927E1) = 0.31415927E1 - (0.0, 0.31415927E1) = ~0.31415927E1 / (0.0, 0.31415927E1) = 0.0 nextAfter (0.0, 0.31415927E1) = 0.1E~44 rem (0.0, 0.31415927E1) = 0.0 * (0.0, 0.27182817E1) = 0.0 + (0.0, 0.27182817E1) = 0.27182817E1 - (0.0, 0.27182817E1) = ~0.27182817E1 / (0.0, 0.27182817E1) = 0.0 nextAfter (0.0, 0.27182817E1) = 0.1E~44 rem (0.0, 0.27182817E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.1E~44 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.1E~44 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.1E~44 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.11754944E~37) = 0.0 + (0.0, 0.11754944E~37) = 0.11754944E~37 - (0.0, 0.11754944E~37) = ~0.11754944E~37 / (0.0, 0.11754944E~37) = 0.0 nextAfter (0.0, 0.11754944E~37) = 0.1E~44 rem (0.0, 0.11754944E~37) = 0.0 * (0.0, 0.5877472E~38) = 0.0 + (0.0, 0.5877472E~38) = 0.5877472E~38 - (0.0, 0.5877472E~38) = ~0.5877472E~38 / (0.0, 0.5877472E~38) = 0.0 nextAfter (0.0, 0.5877472E~38) = 0.1E~44 rem (0.0, 0.5877472E~38) = 0.0 * (0.0, 0.1E~44) = 0.0 + (0.0, 0.1E~44) = 0.1E~44 - (0.0, 0.1E~44) = ~0.1E~44 / (0.0, 0.1E~44) = 0.0 nextAfter (0.0, 0.1E~44) = 0.1E~44 rem (0.0, 0.1E~44) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.34028235E39) = ~0.0 + (0.0, ~0.34028235E39) = ~0.34028235E39 - (0.0, ~0.34028235E39) = 0.34028235E39 / (0.0, ~0.34028235E39) = ~0.0 nextAfter (0.0, ~0.34028235E39) = ~0.1E~44 rem (0.0, ~0.34028235E39) = 0.0 * (0.0, ~0.17014117E39) = ~0.0 + (0.0, ~0.17014117E39) = ~0.17014117E39 - (0.0, ~0.17014117E39) = 0.17014117E39 / (0.0, ~0.17014117E39) = ~0.0 nextAfter (0.0, ~0.17014117E39) = ~0.1E~44 rem (0.0, ~0.17014117E39) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.1E~44 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.1E~44 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.31415927E1) = ~0.0 + (0.0, ~0.31415927E1) = ~0.31415927E1 - (0.0, ~0.31415927E1) = 0.31415927E1 / (0.0, ~0.31415927E1) = ~0.0 nextAfter (0.0, ~0.31415927E1) = ~0.1E~44 rem (0.0, ~0.31415927E1) = 0.0 * (0.0, ~0.27182817E1) = ~0.0 + (0.0, ~0.27182817E1) = ~0.27182817E1 - (0.0, ~0.27182817E1) = 0.27182817E1 / (0.0, ~0.27182817E1) = ~0.0 nextAfter (0.0, ~0.27182817E1) = ~0.1E~44 rem (0.0, ~0.27182817E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.1E~44 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.1E~44 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.1E~44 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.11754944E~37) = ~0.0 + (0.0, ~0.11754944E~37) = ~0.11754944E~37 - (0.0, ~0.11754944E~37) = 0.11754944E~37 / (0.0, ~0.11754944E~37) = ~0.0 nextAfter (0.0, ~0.11754944E~37) = ~0.1E~44 rem (0.0, ~0.11754944E~37) = 0.0 * (0.0, ~0.5877472E~38) = ~0.0 + (0.0, ~0.5877472E~38) = ~0.5877472E~38 - (0.0, ~0.5877472E~38) = 0.5877472E~38 / (0.0, ~0.5877472E~38) = ~0.0 nextAfter (0.0, ~0.5877472E~38) = ~0.1E~44 rem (0.0, ~0.5877472E~38) = 0.0 * (0.0, ~0.1E~44) = ~0.0 + (0.0, ~0.1E~44) = ~0.1E~44 - (0.0, ~0.1E~44) = 0.1E~44 / (0.0, ~0.1E~44) = ~0.0 nextAfter (0.0, ~0.1E~44) = ~0.1E~44 rem (0.0, ~0.1E~44) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.1E~44 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.1E~44 rem (0.0, inf) = 0.0 * (~0.34028235E39, 0.34028235E39) = ~inf + (~0.34028235E39, 0.34028235E39) = 0.0 - (~0.34028235E39, 0.34028235E39) = ~inf / (~0.34028235E39, 0.34028235E39) = ~0.1E1 nextAfter (~0.34028235E39, 0.34028235E39) = ~0.34028233E39 rem (~0.34028235E39, 0.34028235E39) = 0.0 * (~0.34028235E39, 0.17014117E39) = ~inf + (~0.34028235E39, 0.17014117E39) = ~0.17014117E39 - (~0.34028235E39, 0.17014117E39) = ~inf / (~0.34028235E39, 0.17014117E39) = ~0.2E1 nextAfter (~0.34028235E39, 0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, 0.17014117E39) = 0.0 * (~0.34028235E39, 0.123E4) = ~inf + (~0.34028235E39, 0.123E4) = ~0.34028235E39 - (~0.34028235E39, 0.123E4) = ~0.34028235E39 / (~0.34028235E39, 0.123E4) = ~0.2766523E36 nextAfter (~0.34028235E39, 0.123E4) = ~0.34028233E39 rem (~0.34028235E39, 0.123E4) = ~0.11884224E32 * (~0.34028235E39, 0.123E2) = ~inf + (~0.34028235E39, 0.123E2) = ~0.34028235E39 - (~0.34028235E39, 0.123E2) = ~0.34028235E39 / (~0.34028235E39, 0.123E2) = ~0.27665232E38 nextAfter (~0.34028235E39, 0.123E2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E2) = 0.12882628E32 * (~0.34028235E39, 0.31415927E1) = ~inf + (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, 0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, 0.31415927E1) = ~0.10831523E39 nextAfter (~0.34028235E39, 0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, 0.31415927E1) = ~0.15835598E32 * (~0.34028235E39, 0.27182817E1) = ~inf + (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, 0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, 0.27182817E1) = ~0.12518288E39 nextAfter (~0.34028235E39, 0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, 0.27182817E1) = ~0.9154518E31 * (~0.34028235E39, 0.123E1) = ~inf + (~0.34028235E39, 0.123E1) = ~0.34028235E39 - (~0.34028235E39, 0.123E1) = ~0.34028235E39 / (~0.34028235E39, 0.123E1) = ~0.27665231E39 nextAfter (~0.34028235E39, 0.123E1) = ~0.34028233E39 rem (~0.34028235E39, 0.123E1) = 0.40894575E30 * (~0.34028235E39, 0.123) = ~0.4185473E38 + (~0.34028235E39, 0.123) = ~0.34028235E39 - (~0.34028235E39, 0.123) = ~0.34028235E39 / (~0.34028235E39, 0.123) = ~inf nextAfter (~0.34028235E39, 0.123) = ~0.34028233E39 rem (~0.34028235E39, 0.123) = inf * (~0.34028235E39, 0.123E~2) = ~0.4185473E36 + (~0.34028235E39, 0.123E~2) = ~0.34028235E39 - (~0.34028235E39, 0.123E~2) = ~0.34028235E39 / (~0.34028235E39, 0.123E~2) = ~inf nextAfter (~0.34028235E39, 0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, 0.123E~2) = inf * (~0.34028235E39, 0.11754944E~37) = ~0.39999998E1 + (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, 0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, 0.11754944E~37) = ~inf nextAfter (~0.34028235E39, 0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, 0.11754944E~37) = inf * (~0.34028235E39, 0.5877472E~38) = ~0.19999999E1 + (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, 0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, 0.5877472E~38) = ~inf nextAfter (~0.34028235E39, 0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, 0.5877472E~38) = inf * (~0.34028235E39, 0.1E~44) = ~0.47683713E~6 + (~0.34028235E39, 0.1E~44) = ~0.34028235E39 - (~0.34028235E39, 0.1E~44) = ~0.34028235E39 / (~0.34028235E39, 0.1E~44) = ~inf nextAfter (~0.34028235E39, 0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, 0.1E~44) = inf * (~0.34028235E39, 0.0) = ~0.0 + (~0.34028235E39, 0.0) = ~0.34028235E39 - (~0.34028235E39, 0.0) = ~0.34028235E39 / (~0.34028235E39, 0.0) = ~inf nextAfter (~0.34028235E39, 0.0) = ~0.34028233E39 rem (~0.34028235E39, 0.0) = nan * (~0.34028235E39, ~0.34028235E39) = inf + (~0.34028235E39, ~0.34028235E39) = ~inf - (~0.34028235E39, ~0.34028235E39) = 0.0 / (~0.34028235E39, ~0.34028235E39) = 0.1E1 nextAfter (~0.34028235E39, ~0.34028235E39) = ~0.34028235E39 rem (~0.34028235E39, ~0.34028235E39) = 0.0 * (~0.34028235E39, ~0.17014117E39) = inf + (~0.34028235E39, ~0.17014117E39) = ~inf - (~0.34028235E39, ~0.17014117E39) = ~0.17014117E39 / (~0.34028235E39, ~0.17014117E39) = 0.2E1 nextAfter (~0.34028235E39, ~0.17014117E39) = ~0.34028233E39 rem (~0.34028235E39, ~0.17014117E39) = 0.0 * (~0.34028235E39, ~0.123E4) = inf + (~0.34028235E39, ~0.123E4) = ~0.34028235E39 - (~0.34028235E39, ~0.123E4) = ~0.34028235E39 / (~0.34028235E39, ~0.123E4) = 0.2766523E36 nextAfter (~0.34028235E39, ~0.123E4) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E4) = ~0.11884224E32 * (~0.34028235E39, ~0.123E2) = inf + (~0.34028235E39, ~0.123E2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E2) = 0.27665232E38 nextAfter (~0.34028235E39, ~0.123E2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E2) = 0.12882628E32 * (~0.34028235E39, ~0.31415927E1) = inf + (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 - (~0.34028235E39, ~0.31415927E1) = ~0.34028235E39 / (~0.34028235E39, ~0.31415927E1) = 0.10831523E39 nextAfter (~0.34028235E39, ~0.31415927E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.31415927E1) = ~0.15835598E32 * (~0.34028235E39, ~0.27182817E1) = inf + (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 - (~0.34028235E39, ~0.27182817E1) = ~0.34028235E39 / (~0.34028235E39, ~0.27182817E1) = 0.12518288E39 nextAfter (~0.34028235E39, ~0.27182817E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.27182817E1) = ~0.9154518E31 * (~0.34028235E39, ~0.123E1) = inf + (~0.34028235E39, ~0.123E1) = ~0.34028235E39 - (~0.34028235E39, ~0.123E1) = ~0.34028235E39 / (~0.34028235E39, ~0.123E1) = 0.27665231E39 nextAfter (~0.34028235E39, ~0.123E1) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E1) = 0.40894575E30 * (~0.34028235E39, ~0.123) = 0.4185473E38 + (~0.34028235E39, ~0.123) = ~0.34028235E39 - (~0.34028235E39, ~0.123) = ~0.34028235E39 / (~0.34028235E39, ~0.123) = inf nextAfter (~0.34028235E39, ~0.123) = ~0.34028233E39 rem (~0.34028235E39, ~0.123) = inf * (~0.34028235E39, ~0.123E~2) = 0.4185473E36 + (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 - (~0.34028235E39, ~0.123E~2) = ~0.34028235E39 / (~0.34028235E39, ~0.123E~2) = inf nextAfter (~0.34028235E39, ~0.123E~2) = ~0.34028233E39 rem (~0.34028235E39, ~0.123E~2) = inf * (~0.34028235E39, ~0.11754944E~37) = 0.39999998E1 + (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 - (~0.34028235E39, ~0.11754944E~37) = ~0.34028235E39 / (~0.34028235E39, ~0.11754944E~37) = inf nextAfter (~0.34028235E39, ~0.11754944E~37) = ~0.34028233E39 rem (~0.34028235E39, ~0.11754944E~37) = inf * (~0.34028235E39, ~0.5877472E~38) = 0.19999999E1 + (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 - (~0.34028235E39, ~0.5877472E~38) = ~0.34028235E39 / (~0.34028235E39, ~0.5877472E~38) = inf nextAfter (~0.34028235E39, ~0.5877472E~38) = ~0.34028233E39 rem (~0.34028235E39, ~0.5877472E~38) = inf * (~0.34028235E39, ~0.1E~44) = 0.47683713E~6 + (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 - (~0.34028235E39, ~0.1E~44) = ~0.34028235E39 / (~0.34028235E39, ~0.1E~44) = inf nextAfter (~0.34028235E39, ~0.1E~44) = ~0.34028233E39 rem (~0.34028235E39, ~0.1E~44) = inf * (~0.34028235E39, ~0.0) = 0.0 + (~0.34028235E39, ~0.0) = ~0.34028235E39 - (~0.34028235E39, ~0.0) = ~0.34028235E39 / (~0.34028235E39, ~0.0) = inf nextAfter (~0.34028235E39, ~0.0) = ~0.34028233E39 rem (~0.34028235E39, ~0.0) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.34028235E39, ~inf) = inf + (~0.34028235E39, ~inf) = ~inf - (~0.34028235E39, ~inf) = inf / (~0.34028235E39, ~inf) = 0.0 nextAfter (~0.34028235E39, ~inf) = ~inf rem (~0.34028235E39, ~inf) = ~0.34028235E39 * (~0.34028235E39, nan) = nan + (~0.34028235E39, nan) = nan - (~0.34028235E39, nan) = nan / (~0.34028235E39, nan) = nan nextAfter (~0.34028235E39, nan) = nan rem (~0.34028235E39, nan) = nan * (~0.34028235E39, inf) = ~inf + (~0.34028235E39, inf) = inf - (~0.34028235E39, inf) = ~inf / (~0.34028235E39, inf) = ~0.0 nextAfter (~0.34028235E39, inf) = ~0.34028233E39 rem (~0.34028235E39, inf) = ~0.34028235E39 * (~0.17014117E39, 0.34028235E39) = ~inf + (~0.17014117E39, 0.34028235E39) = 0.17014117E39 - (~0.17014117E39, 0.34028235E39) = ~inf / (~0.17014117E39, 0.34028235E39) = ~0.5 nextAfter (~0.17014117E39, 0.34028235E39) = ~0.17014116E39 rem (~0.17014117E39, 0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, 0.17014117E39) = ~inf + (~0.17014117E39, 0.17014117E39) = 0.0 - (~0.17014117E39, 0.17014117E39) = ~0.34028235E39 / (~0.17014117E39, 0.17014117E39) = ~0.1E1 nextAfter (~0.17014117E39, 0.17014117E39) = ~0.17014116E39 rem (~0.17014117E39, 0.17014117E39) = 0.0 * (~0.17014117E39, 0.123E4) = ~inf + (~0.17014117E39, 0.123E4) = ~0.17014117E39 - (~0.17014117E39, 0.123E4) = ~0.17014117E39 / (~0.17014117E39, 0.123E4) = ~0.13832615E36 nextAfter (~0.17014117E39, 0.123E4) = ~0.17014116E39 rem (~0.17014117E39, 0.123E4) = ~0.5942112E31 * (~0.17014117E39, 0.123E2) = ~inf + (~0.17014117E39, 0.123E2) = ~0.17014117E39 - (~0.17014117E39, 0.123E2) = ~0.17014117E39 / (~0.17014117E39, 0.123E2) = ~0.13832616E38 nextAfter (~0.17014117E39, 0.123E2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E2) = 0.6441314E31 * (~0.17014117E39, 0.31415927E1) = ~inf + (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, 0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, 0.31415927E1) = ~0.54157613E38 nextAfter (~0.17014117E39, 0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, 0.31415927E1) = ~0.7917799E31 * (~0.17014117E39, 0.27182817E1) = ~inf + (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, 0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, 0.27182817E1) = ~0.6259144E38 nextAfter (~0.17014117E39, 0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, 0.27182817E1) = ~0.4577259E31 * (~0.17014117E39, 0.123E1) = ~0.20927364E39 + (~0.17014117E39, 0.123E1) = ~0.17014117E39 - (~0.17014117E39, 0.123E1) = ~0.17014117E39 / (~0.17014117E39, 0.123E1) = ~0.13832616E39 nextAfter (~0.17014117E39, 0.123E1) = ~0.17014116E39 rem (~0.17014117E39, 0.123E1) = 0.20447288E30 * (~0.17014117E39, 0.123) = ~0.20927365E38 + (~0.17014117E39, 0.123) = ~0.17014117E39 - (~0.17014117E39, 0.123) = ~0.17014117E39 / (~0.17014117E39, 0.123) = ~inf nextAfter (~0.17014117E39, 0.123) = ~0.17014116E39 rem (~0.17014117E39, 0.123) = inf * (~0.17014117E39, 0.123E~2) = ~0.20927364E36 + (~0.17014117E39, 0.123E~2) = ~0.17014117E39 - (~0.17014117E39, 0.123E~2) = ~0.17014117E39 / (~0.17014117E39, 0.123E~2) = ~inf nextAfter (~0.17014117E39, 0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, 0.123E~2) = inf * (~0.17014117E39, 0.11754944E~37) = ~0.19999999E1 + (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, 0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, 0.11754944E~37) = ~inf nextAfter (~0.17014117E39, 0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, 0.11754944E~37) = inf * (~0.17014117E39, 0.5877472E~38) = ~0.99999994 + (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, 0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, 0.5877472E~38) = ~inf nextAfter (~0.17014117E39, 0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, 0.5877472E~38) = inf * (~0.17014117E39, 0.1E~44) = ~0.23841856E~6 + (~0.17014117E39, 0.1E~44) = ~0.17014117E39 - (~0.17014117E39, 0.1E~44) = ~0.17014117E39 / (~0.17014117E39, 0.1E~44) = ~inf nextAfter (~0.17014117E39, 0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, 0.1E~44) = inf * (~0.17014117E39, 0.0) = ~0.0 + (~0.17014117E39, 0.0) = ~0.17014117E39 - (~0.17014117E39, 0.0) = ~0.17014117E39 / (~0.17014117E39, 0.0) = ~inf nextAfter (~0.17014117E39, 0.0) = ~0.17014116E39 rem (~0.17014117E39, 0.0) = nan * (~0.17014117E39, ~0.34028235E39) = inf + (~0.17014117E39, ~0.34028235E39) = ~inf - (~0.17014117E39, ~0.34028235E39) = 0.17014117E39 / (~0.17014117E39, ~0.34028235E39) = 0.5 nextAfter (~0.17014117E39, ~0.34028235E39) = ~0.17014118E39 rem (~0.17014117E39, ~0.34028235E39) = ~0.17014117E39 * (~0.17014117E39, ~0.17014117E39) = inf + (~0.17014117E39, ~0.17014117E39) = ~0.34028235E39 - (~0.17014117E39, ~0.17014117E39) = 0.0 / (~0.17014117E39, ~0.17014117E39) = 0.1E1 nextAfter (~0.17014117E39, ~0.17014117E39) = ~0.17014117E39 rem (~0.17014117E39, ~0.17014117E39) = 0.0 * (~0.17014117E39, ~0.123E4) = inf + (~0.17014117E39, ~0.123E4) = ~0.17014117E39 - (~0.17014117E39, ~0.123E4) = ~0.17014117E39 / (~0.17014117E39, ~0.123E4) = 0.13832615E36 nextAfter (~0.17014117E39, ~0.123E4) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E4) = ~0.5942112E31 * (~0.17014117E39, ~0.123E2) = inf + (~0.17014117E39, ~0.123E2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E2) = 0.13832616E38 nextAfter (~0.17014117E39, ~0.123E2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E2) = 0.6441314E31 * (~0.17014117E39, ~0.31415927E1) = inf + (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 - (~0.17014117E39, ~0.31415927E1) = ~0.17014117E39 / (~0.17014117E39, ~0.31415927E1) = 0.54157613E38 nextAfter (~0.17014117E39, ~0.31415927E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.31415927E1) = ~0.7917799E31 * (~0.17014117E39, ~0.27182817E1) = inf + (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 - (~0.17014117E39, ~0.27182817E1) = ~0.17014117E39 / (~0.17014117E39, ~0.27182817E1) = 0.6259144E38 nextAfter (~0.17014117E39, ~0.27182817E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.27182817E1) = ~0.4577259E31 * (~0.17014117E39, ~0.123E1) = 0.20927364E39 + (~0.17014117E39, ~0.123E1) = ~0.17014117E39 - (~0.17014117E39, ~0.123E1) = ~0.17014117E39 / (~0.17014117E39, ~0.123E1) = 0.13832616E39 nextAfter (~0.17014117E39, ~0.123E1) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E1) = 0.20447288E30 * (~0.17014117E39, ~0.123) = 0.20927365E38 + (~0.17014117E39, ~0.123) = ~0.17014117E39 - (~0.17014117E39, ~0.123) = ~0.17014117E39 / (~0.17014117E39, ~0.123) = inf nextAfter (~0.17014117E39, ~0.123) = ~0.17014116E39 rem (~0.17014117E39, ~0.123) = inf * (~0.17014117E39, ~0.123E~2) = 0.20927364E36 + (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 - (~0.17014117E39, ~0.123E~2) = ~0.17014117E39 / (~0.17014117E39, ~0.123E~2) = inf nextAfter (~0.17014117E39, ~0.123E~2) = ~0.17014116E39 rem (~0.17014117E39, ~0.123E~2) = inf * (~0.17014117E39, ~0.11754944E~37) = 0.19999999E1 + (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 - (~0.17014117E39, ~0.11754944E~37) = ~0.17014117E39 / (~0.17014117E39, ~0.11754944E~37) = inf nextAfter (~0.17014117E39, ~0.11754944E~37) = ~0.17014116E39 rem (~0.17014117E39, ~0.11754944E~37) = inf * (~0.17014117E39, ~0.5877472E~38) = 0.99999994 + (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 - (~0.17014117E39, ~0.5877472E~38) = ~0.17014117E39 / (~0.17014117E39, ~0.5877472E~38) = inf nextAfter (~0.17014117E39, ~0.5877472E~38) = ~0.17014116E39 rem (~0.17014117E39, ~0.5877472E~38) = inf * (~0.17014117E39, ~0.1E~44) = 0.23841856E~6 + (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 - (~0.17014117E39, ~0.1E~44) = ~0.17014117E39 / (~0.17014117E39, ~0.1E~44) = inf nextAfter (~0.17014117E39, ~0.1E~44) = ~0.17014116E39 rem (~0.17014117E39, ~0.1E~44) = inf * (~0.17014117E39, ~0.0) = 0.0 + (~0.17014117E39, ~0.0) = ~0.17014117E39 - (~0.17014117E39, ~0.0) = ~0.17014117E39 / (~0.17014117E39, ~0.0) = inf nextAfter (~0.17014117E39, ~0.0) = ~0.17014116E39 rem (~0.17014117E39, ~0.0) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.17014117E39, ~inf) = inf + (~0.17014117E39, ~inf) = ~inf - (~0.17014117E39, ~inf) = inf / (~0.17014117E39, ~inf) = 0.0 nextAfter (~0.17014117E39, ~inf) = ~0.17014118E39 rem (~0.17014117E39, ~inf) = ~0.17014117E39 * (~0.17014117E39, nan) = nan + (~0.17014117E39, nan) = nan - (~0.17014117E39, nan) = nan / (~0.17014117E39, nan) = nan nextAfter (~0.17014117E39, nan) = nan rem (~0.17014117E39, nan) = nan * (~0.17014117E39, inf) = ~inf + (~0.17014117E39, inf) = inf - (~0.17014117E39, inf) = ~inf / (~0.17014117E39, inf) = ~0.0 nextAfter (~0.17014117E39, inf) = ~0.17014116E39 rem (~0.17014117E39, inf) = ~0.17014117E39 * (~0.123E4, 0.34028235E39) = ~inf + (~0.123E4, 0.34028235E39) = 0.34028235E39 - (~0.123E4, 0.34028235E39) = ~0.34028235E39 / (~0.123E4, 0.34028235E39) = ~0.36146455E~35 nextAfter (~0.123E4, 0.34028235E39) = ~0.12299999E4 rem (~0.123E4, 0.34028235E39) = ~0.123E4 * (~0.123E4, 0.17014117E39) = ~inf + (~0.123E4, 0.17014117E39) = 0.17014117E39 - (~0.123E4, 0.17014117E39) = ~0.17014117E39 / (~0.123E4, 0.17014117E39) = ~0.7229291E~35 nextAfter (~0.123E4, 0.17014117E39) = ~0.12299999E4 rem (~0.123E4, 0.17014117E39) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999E4 rem (~0.123E4, 0.123E2) = 0.19073486E~4 * (~0.123E4, 0.31415927E1) = ~0.38641592E4 + (~0.123E4, 0.31415927E1) = ~0.12268584E4 - (~0.123E4, 0.31415927E1) = ~0.12331416E4 / (~0.123E4, 0.31415927E1) = ~0.39152115E3 nextAfter (~0.123E4, 0.31415927E1) = ~0.12299999E4 rem (~0.123E4, 0.31415927E1) = ~0.16372383E1 * (~0.123E4, 0.27182817E1) = ~0.33434866E4 + (~0.123E4, 0.27182817E1) = ~0.12272817E4 - (~0.123E4, 0.27182817E1) = ~0.12327183E4 / (~0.123E4, 0.27182817E1) = ~0.45249173E3 nextAfter (~0.123E4, 0.27182817E1) = ~0.12299999E4 rem (~0.123E4, 0.27182817E1) = ~0.13366508E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999E4 rem (~0.123E4, 0.123E1) = 0.19073486E~4 * (~0.123E4, 0.123) = ~0.15129001E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999E4 rem (~0.123E4, 0.123) = 0.33974648E~4 * (~0.123E4, 0.123E~2) = ~0.15129001E1 + (~0.123E4, 0.123E~2) = ~0.12299988E4 - (~0.123E4, 0.123E~2) = ~0.12300012E4 / (~0.123E4, 0.123E~2) = ~0.99999994E6 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999E4 rem (~0.123E4, 0.123E~2) = ~0.1177399E~2 * (~0.123E4, 0.11754944E~37) = ~0.1445858E~34 + (~0.123E4, 0.11754944E~37) = ~0.123E4 - (~0.123E4, 0.11754944E~37) = ~0.123E4 / (~0.123E4, 0.11754944E~37) = ~inf nextAfter (~0.123E4, 0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, 0.11754944E~37) = inf * (~0.123E4, 0.5877472E~38) = ~0.722929E~35 + (~0.123E4, 0.5877472E~38) = ~0.123E4 - (~0.123E4, 0.5877472E~38) = ~0.123E4 / (~0.123E4, 0.5877472E~38) = ~inf nextAfter (~0.123E4, 0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, 0.5877472E~38) = inf * (~0.123E4, 0.1E~44) = ~0.1724E~41 + (~0.123E4, 0.1E~44) = ~0.123E4 - (~0.123E4, 0.1E~44) = ~0.123E4 / (~0.123E4, 0.1E~44) = ~inf nextAfter (~0.123E4, 0.1E~44) = ~0.12299999E4 rem (~0.123E4, 0.1E~44) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.34028235E39) = inf + (~0.123E4, ~0.34028235E39) = ~0.34028235E39 - (~0.123E4, ~0.34028235E39) = 0.34028235E39 / (~0.123E4, ~0.34028235E39) = 0.36146455E~35 nextAfter (~0.123E4, ~0.34028235E39) = ~0.12300001E4 rem (~0.123E4, ~0.34028235E39) = ~0.123E4 * (~0.123E4, ~0.17014117E39) = inf + (~0.123E4, ~0.17014117E39) = ~0.17014117E39 - (~0.123E4, ~0.17014117E39) = 0.17014117E39 / (~0.123E4, ~0.17014117E39) = 0.7229291E~35 nextAfter (~0.123E4, ~0.17014117E39) = ~0.12300001E4 rem (~0.123E4, ~0.17014117E39) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999E4 rem (~0.123E4, ~0.123E2) = 0.19073486E~4 * (~0.123E4, ~0.31415927E1) = 0.38641592E4 + (~0.123E4, ~0.31415927E1) = ~0.12331416E4 - (~0.123E4, ~0.31415927E1) = ~0.12268584E4 / (~0.123E4, ~0.31415927E1) = 0.39152115E3 nextAfter (~0.123E4, ~0.31415927E1) = ~0.12299999E4 rem (~0.123E4, ~0.31415927E1) = ~0.16372383E1 * (~0.123E4, ~0.27182817E1) = 0.33434866E4 + (~0.123E4, ~0.27182817E1) = ~0.12327183E4 - (~0.123E4, ~0.27182817E1) = ~0.12272817E4 / (~0.123E4, ~0.27182817E1) = 0.45249173E3 nextAfter (~0.123E4, ~0.27182817E1) = ~0.12299999E4 rem (~0.123E4, ~0.27182817E1) = ~0.13366508E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999E4 rem (~0.123E4, ~0.123E1) = 0.19073486E~4 * (~0.123E4, ~0.123) = 0.15129001E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999E4 rem (~0.123E4, ~0.123) = 0.33974648E~4 * (~0.123E4, ~0.123E~2) = 0.15129001E1 + (~0.123E4, ~0.123E~2) = ~0.12300012E4 - (~0.123E4, ~0.123E~2) = ~0.12299988E4 / (~0.123E4, ~0.123E~2) = 0.99999994E6 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999E4 rem (~0.123E4, ~0.123E~2) = ~0.1177399E~2 * (~0.123E4, ~0.11754944E~37) = 0.1445858E~34 + (~0.123E4, ~0.11754944E~37) = ~0.123E4 - (~0.123E4, ~0.11754944E~37) = ~0.123E4 / (~0.123E4, ~0.11754944E~37) = inf nextAfter (~0.123E4, ~0.11754944E~37) = ~0.12299999E4 rem (~0.123E4, ~0.11754944E~37) = inf * (~0.123E4, ~0.5877472E~38) = 0.722929E~35 + (~0.123E4, ~0.5877472E~38) = ~0.123E4 - (~0.123E4, ~0.5877472E~38) = ~0.123E4 / (~0.123E4, ~0.5877472E~38) = inf nextAfter (~0.123E4, ~0.5877472E~38) = ~0.12299999E4 rem (~0.123E4, ~0.5877472E~38) = inf * (~0.123E4, ~0.1E~44) = 0.1724E~41 + (~0.123E4, ~0.1E~44) = ~0.123E4 - (~0.123E4, ~0.1E~44) = ~0.123E4 / (~0.123E4, ~0.1E~44) = inf nextAfter (~0.123E4, ~0.1E~44) = ~0.12299999E4 rem (~0.123E4, ~0.1E~44) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300001E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.34028235E39) = ~inf + (~0.123E2, 0.34028235E39) = 0.34028235E39 - (~0.123E2, 0.34028235E39) = ~0.34028235E39 / (~0.123E2, 0.34028235E39) = ~0.36146455E~37 nextAfter (~0.123E2, 0.34028235E39) = ~0.12299999E2 rem (~0.123E2, 0.34028235E39) = ~0.123E2 * (~0.123E2, 0.17014117E39) = ~inf + (~0.123E2, 0.17014117E39) = 0.17014117E39 - (~0.123E2, 0.17014117E39) = ~0.17014117E39 / (~0.123E2, 0.17014117E39) = ~0.7229291E~37 nextAfter (~0.123E2, 0.17014117E39) = ~0.12299999E2 rem (~0.123E2, 0.17014117E39) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129001E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.31415927E1) = ~0.3864159E2 + (~0.123E2, 0.31415927E1) = ~0.9158407E1 - (~0.123E2, 0.31415927E1) = ~0.15441593E2 / (~0.123E2, 0.31415927E1) = ~0.39152114E1 nextAfter (~0.123E2, 0.31415927E1) = ~0.12299999E2 rem (~0.123E2, 0.31415927E1) = ~0.2875222E1 * (~0.123E2, 0.27182817E1) = ~0.33434868E2 + (~0.123E2, 0.27182817E1) = ~0.9581718E1 - (~0.123E2, 0.27182817E1) = ~0.15018282E2 / (~0.123E2, 0.27182817E1) = ~0.4524917E1 nextAfter (~0.123E2, 0.27182817E1) = ~0.12299999E2 rem (~0.123E2, 0.27182817E1) = ~0.14268732E1 * (~0.123E2, 0.123E1) = ~0.15129001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999E2 rem (~0.123E2, 0.123E1) = 0.0 * (~0.123E2, 0.123) = ~0.15129001E1 + (~0.123E2, 0.123) = ~0.12177E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.1E3 nextAfter (~0.123E2, 0.123) = ~0.12299999E2 rem (~0.123E2, 0.123) = 0.14901161E~6 * (~0.123E2, 0.123E~2) = ~0.15129001E~1 + (~0.123E2, 0.123E~2) = ~0.1229877E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999E2 rem (~0.123E2, 0.123E~2) = 0.33527613E~6 * (~0.123E2, 0.11754944E~37) = ~0.14458581E~36 + (~0.123E2, 0.11754944E~37) = ~0.123E2 - (~0.123E2, 0.11754944E~37) = ~0.123E2 / (~0.123E2, 0.11754944E~37) = ~inf nextAfter (~0.123E2, 0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, 0.11754944E~37) = inf * (~0.123E2, 0.5877472E~38) = ~0.72292904E~37 + (~0.123E2, 0.5877472E~38) = ~0.123E2 - (~0.123E2, 0.5877472E~38) = ~0.123E2 / (~0.123E2, 0.5877472E~38) = ~inf nextAfter (~0.123E2, 0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, 0.5877472E~38) = inf * (~0.123E2, 0.1E~44) = ~0.17E~43 + (~0.123E2, 0.1E~44) = ~0.123E2 - (~0.123E2, 0.1E~44) = ~0.123E2 / (~0.123E2, 0.1E~44) = ~inf nextAfter (~0.123E2, 0.1E~44) = ~0.12299999E2 rem (~0.123E2, 0.1E~44) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.34028235E39) = inf + (~0.123E2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E2, ~0.34028235E39) = 0.34028235E39 / (~0.123E2, ~0.34028235E39) = 0.36146455E~37 nextAfter (~0.123E2, ~0.34028235E39) = ~0.12300001E2 rem (~0.123E2, ~0.34028235E39) = ~0.123E2 * (~0.123E2, ~0.17014117E39) = inf + (~0.123E2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E2, ~0.17014117E39) = 0.17014117E39 / (~0.123E2, ~0.17014117E39) = 0.7229291E~37 nextAfter (~0.123E2, ~0.17014117E39) = ~0.12300001E2 rem (~0.123E2, ~0.17014117E39) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300001E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129001E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.31415927E1) = 0.3864159E2 + (~0.123E2, ~0.31415927E1) = ~0.15441593E2 - (~0.123E2, ~0.31415927E1) = ~0.9158407E1 / (~0.123E2, ~0.31415927E1) = 0.39152114E1 nextAfter (~0.123E2, ~0.31415927E1) = ~0.12299999E2 rem (~0.123E2, ~0.31415927E1) = ~0.2875222E1 * (~0.123E2, ~0.27182817E1) = 0.33434868E2 + (~0.123E2, ~0.27182817E1) = ~0.15018282E2 - (~0.123E2, ~0.27182817E1) = ~0.9581718E1 / (~0.123E2, ~0.27182817E1) = 0.4524917E1 nextAfter (~0.123E2, ~0.27182817E1) = ~0.12299999E2 rem (~0.123E2, ~0.27182817E1) = ~0.14268732E1 * (~0.123E2, ~0.123E1) = 0.15129001E2 + (~0.123E2, ~0.123E1) = ~0.13530001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999E2 rem (~0.123E2, ~0.123E1) = 0.0 * (~0.123E2, ~0.123) = 0.15129001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177E2 / (~0.123E2, ~0.123) = 0.1E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999E2 rem (~0.123E2, ~0.123) = 0.14901161E~6 * (~0.123E2, ~0.123E~2) = 0.15129001E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.1229877E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999E2 rem (~0.123E2, ~0.123E~2) = 0.33527613E~6 * (~0.123E2, ~0.11754944E~37) = 0.14458581E~36 + (~0.123E2, ~0.11754944E~37) = ~0.123E2 - (~0.123E2, ~0.11754944E~37) = ~0.123E2 / (~0.123E2, ~0.11754944E~37) = inf nextAfter (~0.123E2, ~0.11754944E~37) = ~0.12299999E2 rem (~0.123E2, ~0.11754944E~37) = inf * (~0.123E2, ~0.5877472E~38) = 0.72292904E~37 + (~0.123E2, ~0.5877472E~38) = ~0.123E2 - (~0.123E2, ~0.5877472E~38) = ~0.123E2 / (~0.123E2, ~0.5877472E~38) = inf nextAfter (~0.123E2, ~0.5877472E~38) = ~0.12299999E2 rem (~0.123E2, ~0.5877472E~38) = inf * (~0.123E2, ~0.1E~44) = 0.17E~43 + (~0.123E2, ~0.1E~44) = ~0.123E2 - (~0.123E2, ~0.1E~44) = ~0.123E2 / (~0.123E2, ~0.1E~44) = inf nextAfter (~0.123E2, ~0.1E~44) = ~0.12299999E2 rem (~0.123E2, ~0.1E~44) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300001E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.31415927E1, 0.34028235E39) = ~inf + (~0.31415927E1, 0.34028235E39) = 0.34028235E39 - (~0.31415927E1, 0.34028235E39) = ~0.34028235E39 / (~0.31415927E1, 0.34028235E39) = ~0.9232312E~38 nextAfter (~0.31415927E1, 0.34028235E39) = ~0.31415925E1 rem (~0.31415927E1, 0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, 0.17014117E39) = ~inf + (~0.31415927E1, 0.17014117E39) = 0.17014117E39 - (~0.31415927E1, 0.17014117E39) = ~0.17014117E39 / (~0.31415927E1, 0.17014117E39) = ~0.18464624E~37 nextAfter (~0.31415927E1, 0.17014117E39) = ~0.31415925E1 rem (~0.31415927E1, 0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, 0.123E4) = ~0.38641592E4 + (~0.31415927E1, 0.123E4) = 0.12268584E4 - (~0.31415927E1, 0.123E4) = ~0.12331416E4 / (~0.31415927E1, 0.123E4) = ~0.25541405E~2 nextAfter (~0.31415927E1, 0.123E4) = ~0.31415925E1 rem (~0.31415927E1, 0.123E4) = ~0.31415927E1 * (~0.31415927E1, 0.123E2) = ~0.3864159E2 + (~0.31415927E1, 0.123E2) = 0.9158407E1 - (~0.31415927E1, 0.123E2) = ~0.15441593E2 / (~0.31415927E1, 0.123E2) = ~0.25541404 nextAfter (~0.31415927E1, 0.123E2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E2) = ~0.31415927E1 * (~0.31415927E1, 0.31415927E1) = ~0.9869605E1 + (~0.31415927E1, 0.31415927E1) = 0.0 - (~0.31415927E1, 0.31415927E1) = ~0.62831855E1 / (~0.31415927E1, 0.31415927E1) = ~0.1E1 nextAfter (~0.31415927E1, 0.31415927E1) = ~0.31415925E1 rem (~0.31415927E1, 0.31415927E1) = 0.0 * (~0.31415927E1, 0.27182817E1) = ~0.8539734E1 + (~0.31415927E1, 0.27182817E1) = ~0.423311 - (~0.31415927E1, 0.27182817E1) = ~0.58598747E1 / (~0.31415927E1, 0.27182817E1) = ~0.11557274E1 nextAfter (~0.31415927E1, 0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, 0.27182817E1) = ~0.423311 * (~0.31415927E1, 0.123E1) = ~0.3864159E1 + (~0.31415927E1, 0.123E1) = ~0.19115927E1 - (~0.31415927E1, 0.123E1) = ~0.43715925E1 / (~0.31415927E1, 0.123E1) = ~0.25541403E1 nextAfter (~0.31415927E1, 0.123E1) = ~0.31415925E1 rem (~0.31415927E1, 0.123E1) = ~0.6815927 * (~0.31415927E1, 0.123) = ~0.38641593 + (~0.31415927E1, 0.123) = ~0.30185928E1 - (~0.31415927E1, 0.123) = ~0.32645926E1 / (~0.31415927E1, 0.123) = ~0.25541403E2 nextAfter (~0.31415927E1, 0.123) = ~0.31415925E1 rem (~0.31415927E1, 0.123) = ~0.66592656E~1 * (~0.31415927E1, 0.123E~2) = ~0.38641593E~2 + (~0.31415927E1, 0.123E~2) = ~0.31403627E1 - (~0.31415927E1, 0.123E~2) = ~0.31428227E1 / (~0.31415927E1, 0.123E~2) = ~0.25541404E4 nextAfter (~0.31415927E1, 0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, 0.123E~2) = ~0.17260667E~3 * (~0.31415927E1, 0.11754944E~37) = ~0.36929245E~37 + (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, 0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, 0.11754944E~37) = ~0.26725715E39 nextAfter (~0.31415927E1, 0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, 0.11754944E~37) = 0.0 * (~0.31415927E1, 0.5877472E~38) = ~0.18464623E~37 + (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, 0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, 0.5877472E~38) = ~inf nextAfter (~0.31415927E1, 0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, 0.5877472E~38) = inf * (~0.31415927E1, 0.1E~44) = ~0.4E~44 + (~0.31415927E1, 0.1E~44) = ~0.31415927E1 - (~0.31415927E1, 0.1E~44) = ~0.31415927E1 / (~0.31415927E1, 0.1E~44) = ~inf nextAfter (~0.31415927E1, 0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, 0.1E~44) = inf * (~0.31415927E1, 0.0) = ~0.0 + (~0.31415927E1, 0.0) = ~0.31415927E1 - (~0.31415927E1, 0.0) = ~0.31415927E1 / (~0.31415927E1, 0.0) = ~inf nextAfter (~0.31415927E1, 0.0) = ~0.31415925E1 rem (~0.31415927E1, 0.0) = nan * (~0.31415927E1, ~0.34028235E39) = inf + (~0.31415927E1, ~0.34028235E39) = ~0.34028235E39 - (~0.31415927E1, ~0.34028235E39) = 0.34028235E39 / (~0.31415927E1, ~0.34028235E39) = 0.9232312E~38 nextAfter (~0.31415927E1, ~0.34028235E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.34028235E39) = ~0.31415927E1 * (~0.31415927E1, ~0.17014117E39) = inf + (~0.31415927E1, ~0.17014117E39) = ~0.17014117E39 - (~0.31415927E1, ~0.17014117E39) = 0.17014117E39 / (~0.31415927E1, ~0.17014117E39) = 0.18464624E~37 nextAfter (~0.31415927E1, ~0.17014117E39) = ~0.3141593E1 rem (~0.31415927E1, ~0.17014117E39) = ~0.31415927E1 * (~0.31415927E1, ~0.123E4) = 0.38641592E4 + (~0.31415927E1, ~0.123E4) = ~0.12331416E4 - (~0.31415927E1, ~0.123E4) = 0.12268584E4 / (~0.31415927E1, ~0.123E4) = 0.25541405E~2 nextAfter (~0.31415927E1, ~0.123E4) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E4) = ~0.31415927E1 * (~0.31415927E1, ~0.123E2) = 0.3864159E2 + (~0.31415927E1, ~0.123E2) = ~0.15441593E2 - (~0.31415927E1, ~0.123E2) = 0.9158407E1 / (~0.31415927E1, ~0.123E2) = 0.25541404 nextAfter (~0.31415927E1, ~0.123E2) = ~0.3141593E1 rem (~0.31415927E1, ~0.123E2) = ~0.31415927E1 * (~0.31415927E1, ~0.31415927E1) = 0.9869605E1 + (~0.31415927E1, ~0.31415927E1) = ~0.62831855E1 - (~0.31415927E1, ~0.31415927E1) = 0.0 / (~0.31415927E1, ~0.31415927E1) = 0.1E1 nextAfter (~0.31415927E1, ~0.31415927E1) = ~0.31415927E1 rem (~0.31415927E1, ~0.31415927E1) = 0.0 * (~0.31415927E1, ~0.27182817E1) = 0.8539734E1 + (~0.31415927E1, ~0.27182817E1) = ~0.58598747E1 - (~0.31415927E1, ~0.27182817E1) = ~0.423311 / (~0.31415927E1, ~0.27182817E1) = 0.11557274E1 nextAfter (~0.31415927E1, ~0.27182817E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.27182817E1) = ~0.423311 * (~0.31415927E1, ~0.123E1) = 0.3864159E1 + (~0.31415927E1, ~0.123E1) = ~0.43715925E1 - (~0.31415927E1, ~0.123E1) = ~0.19115927E1 / (~0.31415927E1, ~0.123E1) = 0.25541403E1 nextAfter (~0.31415927E1, ~0.123E1) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E1) = ~0.6815927 * (~0.31415927E1, ~0.123) = 0.38641593 + (~0.31415927E1, ~0.123) = ~0.32645926E1 - (~0.31415927E1, ~0.123) = ~0.30185928E1 / (~0.31415927E1, ~0.123) = 0.25541403E2 nextAfter (~0.31415927E1, ~0.123) = ~0.31415925E1 rem (~0.31415927E1, ~0.123) = ~0.66592656E~1 * (~0.31415927E1, ~0.123E~2) = 0.38641593E~2 + (~0.31415927E1, ~0.123E~2) = ~0.31428227E1 - (~0.31415927E1, ~0.123E~2) = ~0.31403627E1 / (~0.31415927E1, ~0.123E~2) = 0.25541404E4 nextAfter (~0.31415927E1, ~0.123E~2) = ~0.31415925E1 rem (~0.31415927E1, ~0.123E~2) = ~0.17260667E~3 * (~0.31415927E1, ~0.11754944E~37) = 0.36929245E~37 + (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 - (~0.31415927E1, ~0.11754944E~37) = ~0.31415927E1 / (~0.31415927E1, ~0.11754944E~37) = 0.26725715E39 nextAfter (~0.31415927E1, ~0.11754944E~37) = ~0.31415925E1 rem (~0.31415927E1, ~0.11754944E~37) = 0.0 * (~0.31415927E1, ~0.5877472E~38) = 0.18464623E~37 + (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 - (~0.31415927E1, ~0.5877472E~38) = ~0.31415927E1 / (~0.31415927E1, ~0.5877472E~38) = inf nextAfter (~0.31415927E1, ~0.5877472E~38) = ~0.31415925E1 rem (~0.31415927E1, ~0.5877472E~38) = inf * (~0.31415927E1, ~0.1E~44) = 0.4E~44 + (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 - (~0.31415927E1, ~0.1E~44) = ~0.31415927E1 / (~0.31415927E1, ~0.1E~44) = inf nextAfter (~0.31415927E1, ~0.1E~44) = ~0.31415925E1 rem (~0.31415927E1, ~0.1E~44) = inf * (~0.31415927E1, ~0.0) = 0.0 + (~0.31415927E1, ~0.0) = ~0.31415927E1 - (~0.31415927E1, ~0.0) = ~0.31415927E1 / (~0.31415927E1, ~0.0) = inf nextAfter (~0.31415927E1, ~0.0) = ~0.31415925E1 rem (~0.31415927E1, ~0.0) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.31415927E1, ~inf) = inf + (~0.31415927E1, ~inf) = ~inf - (~0.31415927E1, ~inf) = inf / (~0.31415927E1, ~inf) = 0.0 nextAfter (~0.31415927E1, ~inf) = ~0.3141593E1 rem (~0.31415927E1, ~inf) = ~0.31415927E1 * (~0.31415927E1, nan) = nan + (~0.31415927E1, nan) = nan - (~0.31415927E1, nan) = nan / (~0.31415927E1, nan) = nan nextAfter (~0.31415927E1, nan) = nan rem (~0.31415927E1, nan) = nan * (~0.31415927E1, inf) = ~inf + (~0.31415927E1, inf) = inf - (~0.31415927E1, inf) = ~inf / (~0.31415927E1, inf) = ~0.0 nextAfter (~0.31415927E1, inf) = ~0.31415925E1 rem (~0.31415927E1, inf) = ~0.31415927E1 * (~0.27182817E1, 0.34028235E39) = ~inf + (~0.27182817E1, 0.34028235E39) = 0.34028235E39 - (~0.27182817E1, 0.34028235E39) = ~0.34028235E39 / (~0.27182817E1, 0.34028235E39) = ~0.7988312E~38 nextAfter (~0.27182817E1, 0.34028235E39) = ~0.27182815E1 rem (~0.27182817E1, 0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, 0.17014117E39) = ~inf + (~0.27182817E1, 0.17014117E39) = 0.17014117E39 - (~0.27182817E1, 0.17014117E39) = ~0.17014117E39 / (~0.27182817E1, 0.17014117E39) = ~0.15976626E~37 nextAfter (~0.27182817E1, 0.17014117E39) = ~0.27182815E1 rem (~0.27182817E1, 0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, 0.123E4) = ~0.33434866E4 + (~0.27182817E1, 0.123E4) = 0.12272817E4 - (~0.27182817E1, 0.123E4) = ~0.12327183E4 / (~0.27182817E1, 0.123E4) = ~0.22099852E~2 nextAfter (~0.27182817E1, 0.123E4) = ~0.27182815E1 rem (~0.27182817E1, 0.123E4) = ~0.27182817E1 * (~0.27182817E1, 0.123E2) = ~0.33434868E2 + (~0.27182817E1, 0.123E2) = 0.9581718E1 - (~0.27182817E1, 0.123E2) = ~0.15018282E2 / (~0.27182817E1, 0.123E2) = ~0.22099851 nextAfter (~0.27182817E1, 0.123E2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E2) = ~0.27182817E1 * (~0.27182817E1, 0.31415927E1) = ~0.8539734E1 + (~0.27182817E1, 0.31415927E1) = 0.423311 - (~0.27182817E1, 0.31415927E1) = ~0.58598747E1 / (~0.27182817E1, 0.31415927E1) = ~0.86525595 nextAfter (~0.27182817E1, 0.31415927E1) = ~0.27182815E1 rem (~0.27182817E1, 0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, 0.27182817E1) = ~0.73890557E1 + (~0.27182817E1, 0.27182817E1) = 0.0 - (~0.27182817E1, 0.27182817E1) = ~0.54365635E1 / (~0.27182817E1, 0.27182817E1) = ~0.1E1 nextAfter (~0.27182817E1, 0.27182817E1) = ~0.27182815E1 rem (~0.27182817E1, 0.27182817E1) = 0.0 * (~0.27182817E1, 0.123E1) = ~0.33434865E1 + (~0.27182817E1, 0.123E1) = ~0.14882817E1 - (~0.27182817E1, 0.123E1) = ~0.39482818E1 / (~0.27182817E1, 0.123E1) = ~0.2209985E1 nextAfter (~0.27182817E1, 0.123E1) = ~0.27182815E1 rem (~0.27182817E1, 0.123E1) = ~0.2582817 * (~0.27182817E1, 0.123) = ~0.33434868 + (~0.27182817E1, 0.123) = ~0.25952818E1 - (~0.27182817E1, 0.123) = ~0.28412817E1 / (~0.27182817E1, 0.123) = ~0.22099852E2 nextAfter (~0.27182817E1, 0.123) = ~0.27182815E1 rem (~0.27182817E1, 0.123) = ~0.12281671E~1 * (~0.27182817E1, 0.123E~2) = ~0.33434867E~2 + (~0.27182817E1, 0.123E~2) = ~0.27170517E1 - (~0.27182817E1, 0.123E~2) = ~0.27195117E1 / (~0.27182817E1, 0.123E~2) = ~0.2209985E4 nextAfter (~0.27182817E1, 0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, 0.123E~2) = ~0.12116297E~2 * (~0.27182817E1, 0.11754944E~37) = ~0.31953248E~37 + (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, 0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, 0.11754944E~37) = ~0.23124584E39 nextAfter (~0.27182817E1, 0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, 0.11754944E~37) = 0.0 * (~0.27182817E1, 0.5877472E~38) = ~0.15976624E~37 + (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, 0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, 0.5877472E~38) = ~inf nextAfter (~0.27182817E1, 0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, 0.5877472E~38) = inf * (~0.27182817E1, 0.1E~44) = ~0.4E~44 + (~0.27182817E1, 0.1E~44) = ~0.27182817E1 - (~0.27182817E1, 0.1E~44) = ~0.27182817E1 / (~0.27182817E1, 0.1E~44) = ~inf nextAfter (~0.27182817E1, 0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, 0.1E~44) = inf * (~0.27182817E1, 0.0) = ~0.0 + (~0.27182817E1, 0.0) = ~0.27182817E1 - (~0.27182817E1, 0.0) = ~0.27182817E1 / (~0.27182817E1, 0.0) = ~inf nextAfter (~0.27182817E1, 0.0) = ~0.27182815E1 rem (~0.27182817E1, 0.0) = nan * (~0.27182817E1, ~0.34028235E39) = inf + (~0.27182817E1, ~0.34028235E39) = ~0.34028235E39 - (~0.27182817E1, ~0.34028235E39) = 0.34028235E39 / (~0.27182817E1, ~0.34028235E39) = 0.7988312E~38 nextAfter (~0.27182817E1, ~0.34028235E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.34028235E39) = ~0.27182817E1 * (~0.27182817E1, ~0.17014117E39) = inf + (~0.27182817E1, ~0.17014117E39) = ~0.17014117E39 - (~0.27182817E1, ~0.17014117E39) = 0.17014117E39 / (~0.27182817E1, ~0.17014117E39) = 0.15976626E~37 nextAfter (~0.27182817E1, ~0.17014117E39) = ~0.2718282E1 rem (~0.27182817E1, ~0.17014117E39) = ~0.27182817E1 * (~0.27182817E1, ~0.123E4) = 0.33434866E4 + (~0.27182817E1, ~0.123E4) = ~0.12327183E4 - (~0.27182817E1, ~0.123E4) = 0.12272817E4 / (~0.27182817E1, ~0.123E4) = 0.22099852E~2 nextAfter (~0.27182817E1, ~0.123E4) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E4) = ~0.27182817E1 * (~0.27182817E1, ~0.123E2) = 0.33434868E2 + (~0.27182817E1, ~0.123E2) = ~0.15018282E2 - (~0.27182817E1, ~0.123E2) = 0.9581718E1 / (~0.27182817E1, ~0.123E2) = 0.22099851 nextAfter (~0.27182817E1, ~0.123E2) = ~0.2718282E1 rem (~0.27182817E1, ~0.123E2) = ~0.27182817E1 * (~0.27182817E1, ~0.31415927E1) = 0.8539734E1 + (~0.27182817E1, ~0.31415927E1) = ~0.58598747E1 - (~0.27182817E1, ~0.31415927E1) = 0.423311 / (~0.27182817E1, ~0.31415927E1) = 0.86525595 nextAfter (~0.27182817E1, ~0.31415927E1) = ~0.2718282E1 rem (~0.27182817E1, ~0.31415927E1) = ~0.27182817E1 * (~0.27182817E1, ~0.27182817E1) = 0.73890557E1 + (~0.27182817E1, ~0.27182817E1) = ~0.54365635E1 - (~0.27182817E1, ~0.27182817E1) = 0.0 / (~0.27182817E1, ~0.27182817E1) = 0.1E1 nextAfter (~0.27182817E1, ~0.27182817E1) = ~0.27182817E1 rem (~0.27182817E1, ~0.27182817E1) = 0.0 * (~0.27182817E1, ~0.123E1) = 0.33434865E1 + (~0.27182817E1, ~0.123E1) = ~0.39482818E1 - (~0.27182817E1, ~0.123E1) = ~0.14882817E1 / (~0.27182817E1, ~0.123E1) = 0.2209985E1 nextAfter (~0.27182817E1, ~0.123E1) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E1) = ~0.2582817 * (~0.27182817E1, ~0.123) = 0.33434868 + (~0.27182817E1, ~0.123) = ~0.28412817E1 - (~0.27182817E1, ~0.123) = ~0.25952818E1 / (~0.27182817E1, ~0.123) = 0.22099852E2 nextAfter (~0.27182817E1, ~0.123) = ~0.27182815E1 rem (~0.27182817E1, ~0.123) = ~0.12281671E~1 * (~0.27182817E1, ~0.123E~2) = 0.33434867E~2 + (~0.27182817E1, ~0.123E~2) = ~0.27195117E1 - (~0.27182817E1, ~0.123E~2) = ~0.27170517E1 / (~0.27182817E1, ~0.123E~2) = 0.2209985E4 nextAfter (~0.27182817E1, ~0.123E~2) = ~0.27182815E1 rem (~0.27182817E1, ~0.123E~2) = ~0.12116297E~2 * (~0.27182817E1, ~0.11754944E~37) = 0.31953248E~37 + (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 - (~0.27182817E1, ~0.11754944E~37) = ~0.27182817E1 / (~0.27182817E1, ~0.11754944E~37) = 0.23124584E39 nextAfter (~0.27182817E1, ~0.11754944E~37) = ~0.27182815E1 rem (~0.27182817E1, ~0.11754944E~37) = 0.0 * (~0.27182817E1, ~0.5877472E~38) = 0.15976624E~37 + (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 - (~0.27182817E1, ~0.5877472E~38) = ~0.27182817E1 / (~0.27182817E1, ~0.5877472E~38) = inf nextAfter (~0.27182817E1, ~0.5877472E~38) = ~0.27182815E1 rem (~0.27182817E1, ~0.5877472E~38) = inf * (~0.27182817E1, ~0.1E~44) = 0.4E~44 + (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 - (~0.27182817E1, ~0.1E~44) = ~0.27182817E1 / (~0.27182817E1, ~0.1E~44) = inf nextAfter (~0.27182817E1, ~0.1E~44) = ~0.27182815E1 rem (~0.27182817E1, ~0.1E~44) = inf * (~0.27182817E1, ~0.0) = 0.0 + (~0.27182817E1, ~0.0) = ~0.27182817E1 - (~0.27182817E1, ~0.0) = ~0.27182817E1 / (~0.27182817E1, ~0.0) = inf nextAfter (~0.27182817E1, ~0.0) = ~0.27182815E1 rem (~0.27182817E1, ~0.0) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.27182817E1, ~inf) = inf + (~0.27182817E1, ~inf) = ~inf - (~0.27182817E1, ~inf) = inf / (~0.27182817E1, ~inf) = 0.0 nextAfter (~0.27182817E1, ~inf) = ~0.2718282E1 rem (~0.27182817E1, ~inf) = ~0.27182817E1 * (~0.27182817E1, nan) = nan + (~0.27182817E1, nan) = nan - (~0.27182817E1, nan) = nan / (~0.27182817E1, nan) = nan nextAfter (~0.27182817E1, nan) = nan rem (~0.27182817E1, nan) = nan * (~0.27182817E1, inf) = ~inf + (~0.27182817E1, inf) = inf - (~0.27182817E1, inf) = ~inf / (~0.27182817E1, inf) = ~0.0 nextAfter (~0.27182817E1, inf) = ~0.27182815E1 rem (~0.27182817E1, inf) = ~0.27182817E1 * (~0.123E1, 0.34028235E39) = ~inf + (~0.123E1, 0.34028235E39) = 0.34028235E39 - (~0.123E1, 0.34028235E39) = ~0.34028235E39 / (~0.123E1, 0.34028235E39) = ~0.3614645E~38 nextAfter (~0.123E1, 0.34028235E39) = ~0.12299999E1 rem (~0.123E1, 0.34028235E39) = ~0.123E1 * (~0.123E1, 0.17014117E39) = ~0.20927364E39 + (~0.123E1, 0.17014117E39) = 0.17014117E39 - (~0.123E1, 0.17014117E39) = ~0.17014117E39 / (~0.123E1, 0.17014117E39) = ~0.722929E~38 nextAfter (~0.123E1, 0.17014117E39) = ~0.12299999E1 rem (~0.123E1, 0.17014117E39) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530001E2 / (~0.123E1, 0.123E2) = ~0.1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.31415927E1) = ~0.3864159E1 + (~0.123E1, 0.31415927E1) = 0.19115927E1 - (~0.123E1, 0.31415927E1) = ~0.43715925E1 / (~0.123E1, 0.31415927E1) = ~0.39152116 nextAfter (~0.123E1, 0.31415927E1) = ~0.12299999E1 rem (~0.123E1, 0.31415927E1) = ~0.123E1 * (~0.123E1, 0.27182817E1) = ~0.33434865E1 + (~0.123E1, 0.27182817E1) = 0.14882817E1 - (~0.123E1, 0.27182817E1) = ~0.39482818E1 / (~0.123E1, 0.27182817E1) = ~0.45249173 nextAfter (~0.123E1, 0.27182817E1) = ~0.12299999E1 rem (~0.123E1, 0.27182817E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999E1 rem (~0.123E1, 0.123) = 0.14901161E~7 * (~0.123E1, 0.123E~2) = ~0.15129001E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999E1 rem (~0.123E1, 0.123E~2) = 0.33527613E~7 * (~0.123E1, 0.11754944E~37) = ~0.14458581E~37 + (~0.123E1, 0.11754944E~37) = ~0.123E1 - (~0.123E1, 0.11754944E~37) = ~0.123E1 / (~0.123E1, 0.11754944E~37) = ~0.10463683E39 nextAfter (~0.123E1, 0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, 0.11754944E~37) = 0.0 * (~0.123E1, 0.5877472E~38) = ~0.722929E~38 + (~0.123E1, 0.5877472E~38) = ~0.123E1 - (~0.123E1, 0.5877472E~38) = ~0.123E1 / (~0.123E1, 0.5877472E~38) = ~0.20927366E39 nextAfter (~0.123E1, 0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, 0.5877472E~38) = 0.0 * (~0.123E1, 0.1E~44) = ~0.1E~44 + (~0.123E1, 0.1E~44) = ~0.123E1 - (~0.123E1, 0.1E~44) = ~0.123E1 / (~0.123E1, 0.1E~44) = ~inf nextAfter (~0.123E1, 0.1E~44) = ~0.12299999E1 rem (~0.123E1, 0.1E~44) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.34028235E39) = inf + (~0.123E1, ~0.34028235E39) = ~0.34028235E39 - (~0.123E1, ~0.34028235E39) = 0.34028235E39 / (~0.123E1, ~0.34028235E39) = 0.3614645E~38 nextAfter (~0.123E1, ~0.34028235E39) = ~0.12300001E1 rem (~0.123E1, ~0.34028235E39) = ~0.123E1 * (~0.123E1, ~0.17014117E39) = 0.20927364E39 + (~0.123E1, ~0.17014117E39) = ~0.17014117E39 - (~0.123E1, ~0.17014117E39) = 0.17014117E39 / (~0.123E1, ~0.17014117E39) = 0.722929E~38 nextAfter (~0.123E1, ~0.17014117E39) = ~0.12300001E1 rem (~0.123E1, ~0.17014117E39) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300001E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129001E2 + (~0.123E1, ~0.123E2) = ~0.13530001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300001E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.31415927E1) = 0.3864159E1 + (~0.123E1, ~0.31415927E1) = ~0.43715925E1 - (~0.123E1, ~0.31415927E1) = 0.19115927E1 / (~0.123E1, ~0.31415927E1) = 0.39152116 nextAfter (~0.123E1, ~0.31415927E1) = ~0.12300001E1 rem (~0.123E1, ~0.31415927E1) = ~0.123E1 * (~0.123E1, ~0.27182817E1) = 0.33434865E1 + (~0.123E1, ~0.27182817E1) = ~0.39482818E1 - (~0.123E1, ~0.27182817E1) = 0.14882817E1 / (~0.123E1, ~0.27182817E1) = 0.45249173 nextAfter (~0.123E1, ~0.27182817E1) = ~0.12300001E1 rem (~0.123E1, ~0.27182817E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999E1 rem (~0.123E1, ~0.123) = 0.14901161E~7 * (~0.123E1, ~0.123E~2) = 0.15129001E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999E1 rem (~0.123E1, ~0.123E~2) = 0.33527613E~7 * (~0.123E1, ~0.11754944E~37) = 0.14458581E~37 + (~0.123E1, ~0.11754944E~37) = ~0.123E1 - (~0.123E1, ~0.11754944E~37) = ~0.123E1 / (~0.123E1, ~0.11754944E~37) = 0.10463683E39 nextAfter (~0.123E1, ~0.11754944E~37) = ~0.12299999E1 rem (~0.123E1, ~0.11754944E~37) = 0.0 * (~0.123E1, ~0.5877472E~38) = 0.722929E~38 + (~0.123E1, ~0.5877472E~38) = ~0.123E1 - (~0.123E1, ~0.5877472E~38) = ~0.123E1 / (~0.123E1, ~0.5877472E~38) = 0.20927366E39 nextAfter (~0.123E1, ~0.5877472E~38) = ~0.12299999E1 rem (~0.123E1, ~0.5877472E~38) = 0.0 * (~0.123E1, ~0.1E~44) = 0.1E~44 + (~0.123E1, ~0.1E~44) = ~0.123E1 - (~0.123E1, ~0.1E~44) = ~0.123E1 / (~0.123E1, ~0.1E~44) = inf nextAfter (~0.123E1, ~0.1E~44) = ~0.12299999E1 rem (~0.123E1, ~0.1E~44) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300001E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.34028235E39) = ~0.4185473E38 + (~0.123, 0.34028235E39) = 0.34028235E39 - (~0.123, 0.34028235E39) = ~0.34028235E39 / (~0.123, 0.34028235E39) = ~0.361465E~39 nextAfter (~0.123, 0.34028235E39) = ~0.122999996 rem (~0.123, 0.34028235E39) = ~0.123 * (~0.123, 0.17014117E39) = ~0.20927365E38 + (~0.123, 0.17014117E39) = 0.17014117E39 - (~0.123, 0.17014117E39) = ~0.17014117E39 / (~0.123, 0.17014117E39) = ~0.722928E~39 nextAfter (~0.123, 0.17014117E39) = ~0.122999996 rem (~0.123, 0.17014117E39) = ~0.123 * (~0.123, 0.123E4) = ~0.15129001E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.100000005E~3 nextAfter (~0.123, 0.123E4) = ~0.122999996 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129001E1 + (~0.123, 0.123E2) = 0.12177E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.1E~1 nextAfter (~0.123, 0.123E2) = ~0.122999996 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.31415927E1) = ~0.38641593 + (~0.123, 0.31415927E1) = 0.30185928E1 - (~0.123, 0.31415927E1) = ~0.32645926E1 / (~0.123, 0.31415927E1) = ~0.39152116E~1 nextAfter (~0.123, 0.31415927E1) = ~0.122999996 rem (~0.123, 0.31415927E1) = ~0.123 * (~0.123, 0.27182817E1) = ~0.33434868 + (~0.123, 0.27182817E1) = 0.25952818E1 - (~0.123, 0.27182817E1) = ~0.28412817E1 / (~0.123, 0.27182817E1) = ~0.45249175E~1 nextAfter (~0.123, 0.27182817E1) = ~0.122999996 rem (~0.123, 0.27182817E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.122999996 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129001E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.122999996 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.124230005 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.122999996 rem (~0.123, 0.123E~2) = 0.18626451E~8 * (~0.123, 0.11754944E~37) = ~0.1445858E~38 + (~0.123, 0.11754944E~37) = ~0.123 - (~0.123, 0.11754944E~37) = ~0.123 / (~0.123, 0.11754944E~37) = ~0.10463683E38 nextAfter (~0.123, 0.11754944E~37) = ~0.122999996 rem (~0.123, 0.11754944E~37) = 0.0 * (~0.123, 0.5877472E~38) = ~0.722928E~39 + (~0.123, 0.5877472E~38) = ~0.123 - (~0.123, 0.5877472E~38) = ~0.123 / (~0.123, 0.5877472E~38) = ~0.20927366E38 nextAfter (~0.123, 0.5877472E~38) = ~0.122999996 rem (~0.123, 0.5877472E~38) = 0.0 * (~0.123, 0.1E~44) = ~0.0 + (~0.123, 0.1E~44) = ~0.123 - (~0.123, 0.1E~44) = ~0.123 / (~0.123, 0.1E~44) = ~inf nextAfter (~0.123, 0.1E~44) = ~0.122999996 rem (~0.123, 0.1E~44) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.122999996 rem (~0.123, 0.0) = nan * (~0.123, ~0.34028235E39) = 0.4185473E38 + (~0.123, ~0.34028235E39) = ~0.34028235E39 - (~0.123, ~0.34028235E39) = 0.34028235E39 / (~0.123, ~0.34028235E39) = 0.361465E~39 nextAfter (~0.123, ~0.34028235E39) = ~0.12300001 rem (~0.123, ~0.34028235E39) = ~0.123 * (~0.123, ~0.17014117E39) = 0.20927365E38 + (~0.123, ~0.17014117E39) = ~0.17014117E39 - (~0.123, ~0.17014117E39) = 0.17014117E39 / (~0.123, ~0.17014117E39) = 0.722928E~39 nextAfter (~0.123, ~0.17014117E39) = ~0.12300001 rem (~0.123, ~0.17014117E39) = ~0.123 * (~0.123, ~0.123E4) = 0.15129001E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.100000005E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177E2 / (~0.123, ~0.123E2) = 0.1E~1 nextAfter (~0.123, ~0.123E2) = ~0.12300001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.31415927E1) = 0.38641593 + (~0.123, ~0.31415927E1) = ~0.32645926E1 - (~0.123, ~0.31415927E1) = 0.30185928E1 / (~0.123, ~0.31415927E1) = 0.39152116E~1 nextAfter (~0.123, ~0.31415927E1) = ~0.12300001 rem (~0.123, ~0.31415927E1) = ~0.123 * (~0.123, ~0.27182817E1) = 0.33434868 + (~0.123, ~0.27182817E1) = ~0.28412817E1 - (~0.123, ~0.27182817E1) = 0.25952818E1 / (~0.123, ~0.27182817E1) = 0.45249175E~1 nextAfter (~0.123, ~0.27182817E1) = ~0.12300001 rem (~0.123, ~0.27182817E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129001E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.124230005 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.122999996 rem (~0.123, ~0.123E~2) = 0.18626451E~8 * (~0.123, ~0.11754944E~37) = 0.1445858E~38 + (~0.123, ~0.11754944E~37) = ~0.123 - (~0.123, ~0.11754944E~37) = ~0.123 / (~0.123, ~0.11754944E~37) = 0.10463683E38 nextAfter (~0.123, ~0.11754944E~37) = ~0.122999996 rem (~0.123, ~0.11754944E~37) = 0.0 * (~0.123, ~0.5877472E~38) = 0.722928E~39 + (~0.123, ~0.5877472E~38) = ~0.123 - (~0.123, ~0.5877472E~38) = ~0.123 / (~0.123, ~0.5877472E~38) = 0.20927366E38 nextAfter (~0.123, ~0.5877472E~38) = ~0.122999996 rem (~0.123, ~0.5877472E~38) = 0.0 * (~0.123, ~0.1E~44) = 0.0 + (~0.123, ~0.1E~44) = ~0.123 - (~0.123, ~0.1E~44) = ~0.123 / (~0.123, ~0.1E~44) = inf nextAfter (~0.123, ~0.1E~44) = ~0.122999996 rem (~0.123, ~0.1E~44) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.122999996 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.122999996 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.34028235E39) = ~0.4185473E36 + (~0.123E~2, 0.34028235E39) = 0.34028235E39 - (~0.123E~2, 0.34028235E39) = ~0.34028235E39 / (~0.123E~2, 0.34028235E39) = ~0.3614E~41 nextAfter (~0.123E~2, 0.34028235E39) = ~0.12299999E~2 rem (~0.123E~2, 0.34028235E39) = ~0.123E~2 * (~0.123E~2, 0.17014117E39) = ~0.20927364E36 + (~0.123E~2, 0.17014117E39) = 0.17014117E39 - (~0.123E~2, 0.17014117E39) = ~0.17014117E39 / (~0.123E~2, 0.17014117E39) = ~0.7229E~41 nextAfter (~0.123E~2, 0.17014117E39) = ~0.12299999E~2 rem (~0.123E~2, 0.17014117E39) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129001E1 + (~0.123E~2, 0.123E4) = 0.12299988E4 - (~0.123E~2, 0.123E4) = ~0.12300012E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129001E~1 + (~0.123E~2, 0.123E2) = 0.1229877E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.100000005E~3 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.31415927E1) = ~0.38641593E~2 + (~0.123E~2, 0.31415927E1) = 0.31403627E1 - (~0.123E~2, 0.31415927E1) = ~0.31428227E1 / (~0.123E~2, 0.31415927E1) = ~0.39152117E~3 nextAfter (~0.123E~2, 0.31415927E1) = ~0.12299999E~2 rem (~0.123E~2, 0.31415927E1) = ~0.123E~2 * (~0.123E~2, 0.27182817E1) = ~0.33434867E~2 + (~0.123E~2, 0.27182817E1) = 0.27170517E1 - (~0.123E~2, 0.27182817E1) = ~0.27195117E1 / (~0.123E~2, 0.27182817E1) = ~0.45249175E~3 nextAfter (~0.123E~2, 0.27182817E1) = ~0.12299999E~2 rem (~0.123E~2, 0.27182817E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129001E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.124230005 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129001E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.11754944E~37) = ~0.14459E~40 + (~0.123E~2, 0.11754944E~37) = ~0.123E~2 - (~0.123E~2, 0.11754944E~37) = ~0.123E~2 / (~0.123E~2, 0.11754944E~37) = ~0.10463683E36 nextAfter (~0.123E~2, 0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, 0.11754944E~37) = 0.0 * (~0.123E~2, 0.5877472E~38) = ~0.7229E~41 + (~0.123E~2, 0.5877472E~38) = ~0.123E~2 - (~0.123E~2, 0.5877472E~38) = ~0.123E~2 / (~0.123E~2, 0.5877472E~38) = ~0.20927366E36 nextAfter (~0.123E~2, 0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, 0.5877472E~38) = 0.0 * (~0.123E~2, 0.1E~44) = ~0.0 + (~0.123E~2, 0.1E~44) = ~0.123E~2 - (~0.123E~2, 0.1E~44) = ~0.123E~2 / (~0.123E~2, 0.1E~44) = ~inf nextAfter (~0.123E~2, 0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, 0.1E~44) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.34028235E39) = 0.4185473E36 + (~0.123E~2, ~0.34028235E39) = ~0.34028235E39 - (~0.123E~2, ~0.34028235E39) = 0.34028235E39 / (~0.123E~2, ~0.34028235E39) = 0.3614E~41 nextAfter (~0.123E~2, ~0.34028235E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.34028235E39) = ~0.123E~2 * (~0.123E~2, ~0.17014117E39) = 0.20927364E36 + (~0.123E~2, ~0.17014117E39) = ~0.17014117E39 - (~0.123E~2, ~0.17014117E39) = 0.17014117E39 / (~0.123E~2, ~0.17014117E39) = 0.7229E~41 nextAfter (~0.123E~2, ~0.17014117E39) = ~0.12300002E~2 rem (~0.123E~2, ~0.17014117E39) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129001E1 + (~0.123E~2, ~0.123E4) = ~0.12300012E4 - (~0.123E~2, ~0.123E4) = 0.12299988E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129001E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.1229877E2 / (~0.123E~2, ~0.123E2) = 0.100000005E~3 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.31415927E1) = 0.38641593E~2 + (~0.123E~2, ~0.31415927E1) = ~0.31428227E1 - (~0.123E~2, ~0.31415927E1) = 0.31403627E1 / (~0.123E~2, ~0.31415927E1) = 0.39152117E~3 nextAfter (~0.123E~2, ~0.31415927E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.31415927E1) = ~0.123E~2 * (~0.123E~2, ~0.27182817E1) = 0.33434867E~2 + (~0.123E~2, ~0.27182817E1) = ~0.27195117E1 - (~0.123E~2, ~0.27182817E1) = 0.27170517E1 / (~0.123E~2, ~0.27182817E1) = 0.45249175E~3 nextAfter (~0.123E~2, ~0.27182817E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.27182817E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129001E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.124230005 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129001E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.11754944E~37) = 0.14459E~40 + (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 - (~0.123E~2, ~0.11754944E~37) = ~0.123E~2 / (~0.123E~2, ~0.11754944E~37) = 0.10463683E36 nextAfter (~0.123E~2, ~0.11754944E~37) = ~0.12299999E~2 rem (~0.123E~2, ~0.11754944E~37) = 0.0 * (~0.123E~2, ~0.5877472E~38) = 0.7229E~41 + (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 - (~0.123E~2, ~0.5877472E~38) = ~0.123E~2 / (~0.123E~2, ~0.5877472E~38) = 0.20927366E36 nextAfter (~0.123E~2, ~0.5877472E~38) = ~0.12299999E~2 rem (~0.123E~2, ~0.5877472E~38) = 0.0 * (~0.123E~2, ~0.1E~44) = 0.0 + (~0.123E~2, ~0.1E~44) = ~0.123E~2 - (~0.123E~2, ~0.1E~44) = ~0.123E~2 / (~0.123E~2, ~0.1E~44) = inf nextAfter (~0.123E~2, ~0.1E~44) = ~0.12299999E~2 rem (~0.123E~2, ~0.1E~44) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.11754944E~37, 0.34028235E39) = ~0.39999998E1 + (~0.11754944E~37, 0.34028235E39) = 0.34028235E39 - (~0.11754944E~37, 0.34028235E39) = ~0.34028235E39 / (~0.11754944E~37, 0.34028235E39) = ~0.0 nextAfter (~0.11754944E~37, 0.34028235E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.17014117E39) = ~0.19999999E1 + (~0.11754944E~37, 0.17014117E39) = 0.17014117E39 - (~0.11754944E~37, 0.17014117E39) = ~0.17014117E39 / (~0.11754944E~37, 0.17014117E39) = ~0.0 nextAfter (~0.11754944E~37, 0.17014117E39) = ~0.11754942E~37 rem (~0.11754944E~37, 0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E4) = ~0.1445858E~34 + (~0.11754944E~37, 0.123E4) = 0.123E4 - (~0.11754944E~37, 0.123E4) = ~0.123E4 / (~0.11754944E~37, 0.123E4) = ~0.9557E~41 nextAfter (~0.11754944E~37, 0.123E4) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E2) = ~0.14458581E~36 + (~0.11754944E~37, 0.123E2) = 0.123E2 - (~0.11754944E~37, 0.123E2) = ~0.123E2 / (~0.11754944E~37, 0.123E2) = ~0.955687E~39 nextAfter (~0.11754944E~37, 0.123E2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, 0.31415927E1) = ~0.36929245E~37 + (~0.11754944E~37, 0.31415927E1) = 0.31415927E1 - (~0.11754944E~37, 0.31415927E1) = ~0.31415927E1 / (~0.11754944E~37, 0.31415927E1) = ~0.3741715E~38 nextAfter (~0.11754944E~37, 0.31415927E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.27182817E1) = ~0.31953248E~37 + (~0.11754944E~37, 0.27182817E1) = 0.27182817E1 - (~0.11754944E~37, 0.27182817E1) = ~0.27182817E1 / (~0.11754944E~37, 0.27182817E1) = ~0.4324403E~38 nextAfter (~0.11754944E~37, 0.27182817E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E1) = ~0.14458581E~37 + (~0.11754944E~37, 0.123E1) = 0.123E1 - (~0.11754944E~37, 0.123E1) = ~0.123E1 / (~0.11754944E~37, 0.123E1) = ~0.9556864E~38 nextAfter (~0.11754944E~37, 0.123E1) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, 0.123) = ~0.1445858E~38 + (~0.11754944E~37, 0.123) = 0.123 - (~0.11754944E~37, 0.123) = ~0.123 / (~0.11754944E~37, 0.123) = ~0.9556864E~37 nextAfter (~0.11754944E~37, 0.123) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123) = ~0.11754944E~37 * (~0.11754944E~37, 0.123E~2) = ~0.14459E~40 + (~0.11754944E~37, 0.123E~2) = 0.123E~2 - (~0.11754944E~37, 0.123E~2) = ~0.123E~2 / (~0.11754944E~37, 0.123E~2) = ~0.95568645E~35 nextAfter (~0.11754944E~37, 0.123E~2) = ~0.11754942E~37 rem (~0.11754944E~37, 0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, 0.11754944E~37) = ~0.0 + (~0.11754944E~37, 0.11754944E~37) = 0.0 - (~0.11754944E~37, 0.11754944E~37) = ~0.23509887E~37 / (~0.11754944E~37, 0.11754944E~37) = ~0.1E1 nextAfter (~0.11754944E~37, 0.11754944E~37) = ~0.11754942E~37 rem (~0.11754944E~37, 0.11754944E~37) = 0.0 * (~0.11754944E~37, 0.5877472E~38) = ~0.0 + (~0.11754944E~37, 0.5877472E~38) = ~0.5877472E~38 - (~0.11754944E~37, 0.5877472E~38) = ~0.17632415E~37 / (~0.11754944E~37, 0.5877472E~38) = ~0.2E1 nextAfter (~0.11754944E~37, 0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, 0.5877472E~38) = 0.0 * (~0.11754944E~37, 0.1E~44) = ~0.0 + (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 - (~0.11754944E~37, 0.1E~44) = ~0.11754945E~37 / (~0.11754944E~37, 0.1E~44) = ~0.8388608E7 nextAfter (~0.11754944E~37, 0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, 0.1E~44) = 0.0 * (~0.11754944E~37, 0.0) = ~0.0 + (~0.11754944E~37, 0.0) = ~0.11754944E~37 - (~0.11754944E~37, 0.0) = ~0.11754944E~37 / (~0.11754944E~37, 0.0) = ~inf nextAfter (~0.11754944E~37, 0.0) = ~0.11754942E~37 rem (~0.11754944E~37, 0.0) = nan * (~0.11754944E~37, ~0.34028235E39) = 0.39999998E1 + (~0.11754944E~37, ~0.34028235E39) = ~0.34028235E39 - (~0.11754944E~37, ~0.34028235E39) = 0.34028235E39 / (~0.11754944E~37, ~0.34028235E39) = 0.0 nextAfter (~0.11754944E~37, ~0.34028235E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.34028235E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.17014117E39) = 0.19999999E1 + (~0.11754944E~37, ~0.17014117E39) = ~0.17014117E39 - (~0.11754944E~37, ~0.17014117E39) = 0.17014117E39 / (~0.11754944E~37, ~0.17014117E39) = 0.0 nextAfter (~0.11754944E~37, ~0.17014117E39) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.17014117E39) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E4) = 0.1445858E~34 + (~0.11754944E~37, ~0.123E4) = ~0.123E4 - (~0.11754944E~37, ~0.123E4) = 0.123E4 / (~0.11754944E~37, ~0.123E4) = 0.9557E~41 nextAfter (~0.11754944E~37, ~0.123E4) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E4) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E2) = 0.14458581E~36 + (~0.11754944E~37, ~0.123E2) = ~0.123E2 - (~0.11754944E~37, ~0.123E2) = 0.123E2 / (~0.11754944E~37, ~0.123E2) = 0.955687E~39 nextAfter (~0.11754944E~37, ~0.123E2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.31415927E1) = 0.36929245E~37 + (~0.11754944E~37, ~0.31415927E1) = ~0.31415927E1 - (~0.11754944E~37, ~0.31415927E1) = 0.31415927E1 / (~0.11754944E~37, ~0.31415927E1) = 0.3741715E~38 nextAfter (~0.11754944E~37, ~0.31415927E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.31415927E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.27182817E1) = 0.31953248E~37 + (~0.11754944E~37, ~0.27182817E1) = ~0.27182817E1 - (~0.11754944E~37, ~0.27182817E1) = 0.27182817E1 / (~0.11754944E~37, ~0.27182817E1) = 0.4324403E~38 nextAfter (~0.11754944E~37, ~0.27182817E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.27182817E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E1) = 0.14458581E~37 + (~0.11754944E~37, ~0.123E1) = ~0.123E1 - (~0.11754944E~37, ~0.123E1) = 0.123E1 / (~0.11754944E~37, ~0.123E1) = 0.9556864E~38 nextAfter (~0.11754944E~37, ~0.123E1) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E1) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123) = 0.1445858E~38 + (~0.11754944E~37, ~0.123) = ~0.123 - (~0.11754944E~37, ~0.123) = 0.123 / (~0.11754944E~37, ~0.123) = 0.9556864E~37 nextAfter (~0.11754944E~37, ~0.123) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123) = ~0.11754944E~37 * (~0.11754944E~37, ~0.123E~2) = 0.14459E~40 + (~0.11754944E~37, ~0.123E~2) = ~0.123E~2 - (~0.11754944E~37, ~0.123E~2) = 0.123E~2 / (~0.11754944E~37, ~0.123E~2) = 0.95568645E~35 nextAfter (~0.11754944E~37, ~0.123E~2) = ~0.11754945E~37 rem (~0.11754944E~37, ~0.123E~2) = ~0.11754944E~37 * (~0.11754944E~37, ~0.11754944E~37) = 0.0 + (~0.11754944E~37, ~0.11754944E~37) = ~0.23509887E~37 - (~0.11754944E~37, ~0.11754944E~37) = 0.0 / (~0.11754944E~37, ~0.11754944E~37) = 0.1E1 nextAfter (~0.11754944E~37, ~0.11754944E~37) = ~0.11754944E~37 rem (~0.11754944E~37, ~0.11754944E~37) = 0.0 * (~0.11754944E~37, ~0.5877472E~38) = 0.0 + (~0.11754944E~37, ~0.5877472E~38) = ~0.17632415E~37 - (~0.11754944E~37, ~0.5877472E~38) = ~0.5877472E~38 / (~0.11754944E~37, ~0.5877472E~38) = 0.2E1 nextAfter (~0.11754944E~37, ~0.5877472E~38) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.5877472E~38) = 0.0 * (~0.11754944E~37, ~0.1E~44) = 0.0 + (~0.11754944E~37, ~0.1E~44) = ~0.11754945E~37 - (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 / (~0.11754944E~37, ~0.1E~44) = 0.8388608E7 nextAfter (~0.11754944E~37, ~0.1E~44) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.1E~44) = 0.0 * (~0.11754944E~37, ~0.0) = 0.0 + (~0.11754944E~37, ~0.0) = ~0.11754944E~37 - (~0.11754944E~37, ~0.0) = ~0.11754944E~37 / (~0.11754944E~37, ~0.0) = inf nextAfter (~0.11754944E~37, ~0.0) = ~0.11754942E~37 rem (~0.11754944E~37, ~0.0) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.11754944E~37, ~inf) = inf + (~0.11754944E~37, ~inf) = ~inf - (~0.11754944E~37, ~inf) = inf / (~0.11754944E~37, ~inf) = 0.0 nextAfter (~0.11754944E~37, ~inf) = ~0.11754945E~37 rem (~0.11754944E~37, ~inf) = ~0.11754944E~37 * (~0.11754944E~37, nan) = nan + (~0.11754944E~37, nan) = nan - (~0.11754944E~37, nan) = nan / (~0.11754944E~37, nan) = nan nextAfter (~0.11754944E~37, nan) = nan rem (~0.11754944E~37, nan) = nan * (~0.11754944E~37, inf) = ~inf + (~0.11754944E~37, inf) = inf - (~0.11754944E~37, inf) = ~inf / (~0.11754944E~37, inf) = ~0.0 nextAfter (~0.11754944E~37, inf) = ~0.11754942E~37 rem (~0.11754944E~37, inf) = ~0.11754944E~37 * (~0.5877472E~38, 0.34028235E39) = ~0.19999999E1 + (~0.5877472E~38, 0.34028235E39) = 0.34028235E39 - (~0.5877472E~38, 0.34028235E39) = ~0.34028235E39 / (~0.5877472E~38, 0.34028235E39) = ~0.0 nextAfter (~0.5877472E~38, 0.34028235E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.17014117E39) = ~0.99999994 + (~0.5877472E~38, 0.17014117E39) = 0.17014117E39 - (~0.5877472E~38, 0.17014117E39) = ~0.17014117E39 / (~0.5877472E~38, 0.17014117E39) = ~0.0 nextAfter (~0.5877472E~38, 0.17014117E39) = ~0.587747E~38 rem (~0.5877472E~38, 0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E4) = ~0.722929E~35 + (~0.5877472E~38, 0.123E4) = 0.123E4 - (~0.5877472E~38, 0.123E4) = ~0.123E4 / (~0.5877472E~38, 0.123E4) = ~0.4778E~41 nextAfter (~0.5877472E~38, 0.123E4) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E2) = ~0.72292904E~37 + (~0.5877472E~38, 0.123E2) = 0.123E2 - (~0.5877472E~38, 0.123E2) = ~0.123E2 / (~0.5877472E~38, 0.123E2) = ~0.477843E~39 nextAfter (~0.5877472E~38, 0.123E2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, 0.31415927E1) = ~0.18464623E~37 + (~0.5877472E~38, 0.31415927E1) = 0.31415927E1 - (~0.5877472E~38, 0.31415927E1) = ~0.31415927E1 / (~0.5877472E~38, 0.31415927E1) = ~0.1870857E~38 nextAfter (~0.5877472E~38, 0.31415927E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.27182817E1) = ~0.15976624E~37 + (~0.5877472E~38, 0.27182817E1) = 0.27182817E1 - (~0.5877472E~38, 0.27182817E1) = ~0.27182817E1 / (~0.5877472E~38, 0.27182817E1) = ~0.2162201E~38 nextAfter (~0.5877472E~38, 0.27182817E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E1) = ~0.722929E~38 + (~0.5877472E~38, 0.123E1) = 0.123E1 - (~0.5877472E~38, 0.123E1) = ~0.123E1 / (~0.5877472E~38, 0.123E1) = ~0.4778432E~38 nextAfter (~0.5877472E~38, 0.123E1) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, 0.123) = ~0.722928E~39 + (~0.5877472E~38, 0.123) = 0.123 - (~0.5877472E~38, 0.123) = ~0.123 / (~0.5877472E~38, 0.123) = ~0.4778432E~37 nextAfter (~0.5877472E~38, 0.123) = ~0.587747E~38 rem (~0.5877472E~38, 0.123) = ~0.5877472E~38 * (~0.5877472E~38, 0.123E~2) = ~0.7229E~41 + (~0.5877472E~38, 0.123E~2) = 0.123E~2 - (~0.5877472E~38, 0.123E~2) = ~0.123E~2 / (~0.5877472E~38, 0.123E~2) = ~0.47784322E~35 nextAfter (~0.5877472E~38, 0.123E~2) = ~0.587747E~38 rem (~0.5877472E~38, 0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, 0.11754944E~37) = ~0.0 + (~0.5877472E~38, 0.11754944E~37) = 0.5877472E~38 - (~0.5877472E~38, 0.11754944E~37) = ~0.17632415E~37 / (~0.5877472E~38, 0.11754944E~37) = ~0.5 nextAfter (~0.5877472E~38, 0.11754944E~37) = ~0.587747E~38 rem (~0.5877472E~38, 0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, 0.5877472E~38) = ~0.0 + (~0.5877472E~38, 0.5877472E~38) = 0.0 - (~0.5877472E~38, 0.5877472E~38) = ~0.11754944E~37 / (~0.5877472E~38, 0.5877472E~38) = ~0.1E1 nextAfter (~0.5877472E~38, 0.5877472E~38) = ~0.587747E~38 rem (~0.5877472E~38, 0.5877472E~38) = 0.0 * (~0.5877472E~38, 0.1E~44) = ~0.0 + (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 - (~0.5877472E~38, 0.1E~44) = ~0.5877473E~38 / (~0.5877472E~38, 0.1E~44) = ~0.4194304E7 nextAfter (~0.5877472E~38, 0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, 0.1E~44) = 0.0 * (~0.5877472E~38, 0.0) = ~0.0 + (~0.5877472E~38, 0.0) = ~0.5877472E~38 - (~0.5877472E~38, 0.0) = ~0.5877472E~38 / (~0.5877472E~38, 0.0) = ~inf nextAfter (~0.5877472E~38, 0.0) = ~0.587747E~38 rem (~0.5877472E~38, 0.0) = nan * (~0.5877472E~38, ~0.34028235E39) = 0.19999999E1 + (~0.5877472E~38, ~0.34028235E39) = ~0.34028235E39 - (~0.5877472E~38, ~0.34028235E39) = 0.34028235E39 / (~0.5877472E~38, ~0.34028235E39) = 0.0 nextAfter (~0.5877472E~38, ~0.34028235E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.34028235E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.17014117E39) = 0.99999994 + (~0.5877472E~38, ~0.17014117E39) = ~0.17014117E39 - (~0.5877472E~38, ~0.17014117E39) = 0.17014117E39 / (~0.5877472E~38, ~0.17014117E39) = 0.0 nextAfter (~0.5877472E~38, ~0.17014117E39) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.17014117E39) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E4) = 0.722929E~35 + (~0.5877472E~38, ~0.123E4) = ~0.123E4 - (~0.5877472E~38, ~0.123E4) = 0.123E4 / (~0.5877472E~38, ~0.123E4) = 0.4778E~41 nextAfter (~0.5877472E~38, ~0.123E4) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E4) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E2) = 0.72292904E~37 + (~0.5877472E~38, ~0.123E2) = ~0.123E2 - (~0.5877472E~38, ~0.123E2) = 0.123E2 / (~0.5877472E~38, ~0.123E2) = 0.477843E~39 nextAfter (~0.5877472E~38, ~0.123E2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.31415927E1) = 0.18464623E~37 + (~0.5877472E~38, ~0.31415927E1) = ~0.31415927E1 - (~0.5877472E~38, ~0.31415927E1) = 0.31415927E1 / (~0.5877472E~38, ~0.31415927E1) = 0.1870857E~38 nextAfter (~0.5877472E~38, ~0.31415927E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.31415927E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.27182817E1) = 0.15976624E~37 + (~0.5877472E~38, ~0.27182817E1) = ~0.27182817E1 - (~0.5877472E~38, ~0.27182817E1) = 0.27182817E1 / (~0.5877472E~38, ~0.27182817E1) = 0.2162201E~38 nextAfter (~0.5877472E~38, ~0.27182817E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.27182817E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E1) = 0.722929E~38 + (~0.5877472E~38, ~0.123E1) = ~0.123E1 - (~0.5877472E~38, ~0.123E1) = 0.123E1 / (~0.5877472E~38, ~0.123E1) = 0.4778432E~38 nextAfter (~0.5877472E~38, ~0.123E1) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E1) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123) = 0.722928E~39 + (~0.5877472E~38, ~0.123) = ~0.123 - (~0.5877472E~38, ~0.123) = 0.123 / (~0.5877472E~38, ~0.123) = 0.4778432E~37 nextAfter (~0.5877472E~38, ~0.123) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123) = ~0.5877472E~38 * (~0.5877472E~38, ~0.123E~2) = 0.7229E~41 + (~0.5877472E~38, ~0.123E~2) = ~0.123E~2 - (~0.5877472E~38, ~0.123E~2) = 0.123E~2 / (~0.5877472E~38, ~0.123E~2) = 0.47784322E~35 nextAfter (~0.5877472E~38, ~0.123E~2) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.123E~2) = ~0.5877472E~38 * (~0.5877472E~38, ~0.11754944E~37) = 0.0 + (~0.5877472E~38, ~0.11754944E~37) = ~0.17632415E~37 - (~0.5877472E~38, ~0.11754944E~37) = 0.5877472E~38 / (~0.5877472E~38, ~0.11754944E~37) = 0.5 nextAfter (~0.5877472E~38, ~0.11754944E~37) = ~0.5877473E~38 rem (~0.5877472E~38, ~0.11754944E~37) = ~0.5877472E~38 * (~0.5877472E~38, ~0.5877472E~38) = 0.0 + (~0.5877472E~38, ~0.5877472E~38) = ~0.11754944E~37 - (~0.5877472E~38, ~0.5877472E~38) = 0.0 / (~0.5877472E~38, ~0.5877472E~38) = 0.1E1 nextAfter (~0.5877472E~38, ~0.5877472E~38) = ~0.5877472E~38 rem (~0.5877472E~38, ~0.5877472E~38) = 0.0 * (~0.5877472E~38, ~0.1E~44) = 0.0 + (~0.5877472E~38, ~0.1E~44) = ~0.5877473E~38 - (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 / (~0.5877472E~38, ~0.1E~44) = 0.4194304E7 nextAfter (~0.5877472E~38, ~0.1E~44) = ~0.587747E~38 rem (~0.5877472E~38, ~0.1E~44) = 0.0 * (~0.5877472E~38, ~0.0) = 0.0 + (~0.5877472E~38, ~0.0) = ~0.5877472E~38 - (~0.5877472E~38, ~0.0) = ~0.5877472E~38 / (~0.5877472E~38, ~0.0) = inf nextAfter (~0.5877472E~38, ~0.0) = ~0.587747E~38 rem (~0.5877472E~38, ~0.0) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.5877472E~38, ~inf) = inf + (~0.5877472E~38, ~inf) = ~inf - (~0.5877472E~38, ~inf) = inf / (~0.5877472E~38, ~inf) = 0.0 nextAfter (~0.5877472E~38, ~inf) = ~0.5877473E~38 rem (~0.5877472E~38, ~inf) = ~0.5877472E~38 * (~0.5877472E~38, nan) = nan + (~0.5877472E~38, nan) = nan - (~0.5877472E~38, nan) = nan / (~0.5877472E~38, nan) = nan nextAfter (~0.5877472E~38, nan) = nan rem (~0.5877472E~38, nan) = nan * (~0.5877472E~38, inf) = ~inf + (~0.5877472E~38, inf) = inf - (~0.5877472E~38, inf) = ~inf / (~0.5877472E~38, inf) = ~0.0 nextAfter (~0.5877472E~38, inf) = ~0.587747E~38 rem (~0.5877472E~38, inf) = ~0.5877472E~38 * (~0.1E~44, 0.34028235E39) = ~0.47683713E~6 + (~0.1E~44, 0.34028235E39) = 0.34028235E39 - (~0.1E~44, 0.34028235E39) = ~0.34028235E39 / (~0.1E~44, 0.34028235E39) = ~0.0 nextAfter (~0.1E~44, 0.34028235E39) = ~0.0 rem (~0.1E~44, 0.34028235E39) = ~0.1E~44 * (~0.1E~44, 0.17014117E39) = ~0.23841856E~6 + (~0.1E~44, 0.17014117E39) = 0.17014117E39 - (~0.1E~44, 0.17014117E39) = ~0.17014117E39 / (~0.1E~44, 0.17014117E39) = ~0.0 nextAfter (~0.1E~44, 0.17014117E39) = ~0.0 rem (~0.1E~44, 0.17014117E39) = ~0.1E~44 * (~0.1E~44, 0.123E4) = ~0.1724E~41 + (~0.1E~44, 0.123E4) = 0.123E4 - (~0.1E~44, 0.123E4) = ~0.123E4 / (~0.1E~44, 0.123E4) = ~0.0 nextAfter (~0.1E~44, 0.123E4) = ~0.0 rem (~0.1E~44, 0.123E4) = ~0.1E~44 * (~0.1E~44, 0.123E2) = ~0.17E~43 + (~0.1E~44, 0.123E2) = 0.123E2 - (~0.1E~44, 0.123E2) = ~0.123E2 / (~0.1E~44, 0.123E2) = ~0.0 nextAfter (~0.1E~44, 0.123E2) = ~0.0 rem (~0.1E~44, 0.123E2) = ~0.1E~44 * (~0.1E~44, 0.31415927E1) = ~0.4E~44 + (~0.1E~44, 0.31415927E1) = 0.31415927E1 - (~0.1E~44, 0.31415927E1) = ~0.31415927E1 / (~0.1E~44, 0.31415927E1) = ~0.0 nextAfter (~0.1E~44, 0.31415927E1) = ~0.0 rem (~0.1E~44, 0.31415927E1) = ~0.1E~44 * (~0.1E~44, 0.27182817E1) = ~0.4E~44 + (~0.1E~44, 0.27182817E1) = 0.27182817E1 - (~0.1E~44, 0.27182817E1) = ~0.27182817E1 / (~0.1E~44, 0.27182817E1) = ~0.0 nextAfter (~0.1E~44, 0.27182817E1) = ~0.0 rem (~0.1E~44, 0.27182817E1) = ~0.1E~44 * (~0.1E~44, 0.123E1) = ~0.1E~44 + (~0.1E~44, 0.123E1) = 0.123E1 - (~0.1E~44, 0.123E1) = ~0.123E1 / (~0.1E~44, 0.123E1) = ~0.1E~44 nextAfter (~0.1E~44, 0.123E1) = ~0.0 rem (~0.1E~44, 0.123E1) = ~0.1E~44 * (~0.1E~44, 0.123) = ~0.0 + (~0.1E~44, 0.123) = 0.123 - (~0.1E~44, 0.123) = ~0.123 / (~0.1E~44, 0.123) = ~0.11E~43 nextAfter (~0.1E~44, 0.123) = ~0.0 rem (~0.1E~44, 0.123) = ~0.1E~44 * (~0.1E~44, 0.123E~2) = ~0.0 + (~0.1E~44, 0.123E~2) = 0.123E~2 - (~0.1E~44, 0.123E~2) = ~0.123E~2 / (~0.1E~44, 0.123E~2) = ~0.1139E~41 nextAfter (~0.1E~44, 0.123E~2) = ~0.0 rem (~0.1E~44, 0.123E~2) = ~0.1E~44 * (~0.1E~44, 0.11754944E~37) = ~0.0 + (~0.1E~44, 0.11754944E~37) = 0.11754942E~37 - (~0.1E~44, 0.11754944E~37) = ~0.11754945E~37 / (~0.1E~44, 0.11754944E~37) = ~0.11920929E~6 nextAfter (~0.1E~44, 0.11754944E~37) = ~0.0 rem (~0.1E~44, 0.11754944E~37) = ~0.1E~44 * (~0.1E~44, 0.5877472E~38) = ~0.0 + (~0.1E~44, 0.5877472E~38) = 0.587747E~38 - (~0.1E~44, 0.5877472E~38) = ~0.5877473E~38 / (~0.1E~44, 0.5877472E~38) = ~0.23841858E~6 nextAfter (~0.1E~44, 0.5877472E~38) = ~0.0 rem (~0.1E~44, 0.5877472E~38) = ~0.1E~44 * (~0.1E~44, 0.1E~44) = ~0.0 + (~0.1E~44, 0.1E~44) = 0.0 - (~0.1E~44, 0.1E~44) = ~0.3E~44 / (~0.1E~44, 0.1E~44) = ~0.1E1 nextAfter (~0.1E~44, 0.1E~44) = ~0.0 rem (~0.1E~44, 0.1E~44) = 0.0 * (~0.1E~44, 0.0) = ~0.0 + (~0.1E~44, 0.0) = ~0.1E~44 - (~0.1E~44, 0.0) = ~0.1E~44 / (~0.1E~44, 0.0) = ~inf nextAfter (~0.1E~44, 0.0) = ~0.0 rem (~0.1E~44, 0.0) = nan * (~0.1E~44, ~0.34028235E39) = 0.47683713E~6 + (~0.1E~44, ~0.34028235E39) = ~0.34028235E39 - (~0.1E~44, ~0.34028235E39) = 0.34028235E39 / (~0.1E~44, ~0.34028235E39) = 0.0 nextAfter (~0.1E~44, ~0.34028235E39) = ~0.3E~44 rem (~0.1E~44, ~0.34028235E39) = ~0.1E~44 * (~0.1E~44, ~0.17014117E39) = 0.23841856E~6 + (~0.1E~44, ~0.17014117E39) = ~0.17014117E39 - (~0.1E~44, ~0.17014117E39) = 0.17014117E39 / (~0.1E~44, ~0.17014117E39) = 0.0 nextAfter (~0.1E~44, ~0.17014117E39) = ~0.3E~44 rem (~0.1E~44, ~0.17014117E39) = ~0.1E~44 * (~0.1E~44, ~0.123E4) = 0.1724E~41 + (~0.1E~44, ~0.123E4) = ~0.123E4 - (~0.1E~44, ~0.123E4) = 0.123E4 / (~0.1E~44, ~0.123E4) = 0.0 nextAfter (~0.1E~44, ~0.123E4) = ~0.3E~44 rem (~0.1E~44, ~0.123E4) = ~0.1E~44 * (~0.1E~44, ~0.123E2) = 0.17E~43 + (~0.1E~44, ~0.123E2) = ~0.123E2 - (~0.1E~44, ~0.123E2) = 0.123E2 / (~0.1E~44, ~0.123E2) = 0.0 nextAfter (~0.1E~44, ~0.123E2) = ~0.3E~44 rem (~0.1E~44, ~0.123E2) = ~0.1E~44 * (~0.1E~44, ~0.31415927E1) = 0.4E~44 + (~0.1E~44, ~0.31415927E1) = ~0.31415927E1 - (~0.1E~44, ~0.31415927E1) = 0.31415927E1 / (~0.1E~44, ~0.31415927E1) = 0.0 nextAfter (~0.1E~44, ~0.31415927E1) = ~0.3E~44 rem (~0.1E~44, ~0.31415927E1) = ~0.1E~44 * (~0.1E~44, ~0.27182817E1) = 0.4E~44 + (~0.1E~44, ~0.27182817E1) = ~0.27182817E1 - (~0.1E~44, ~0.27182817E1) = 0.27182817E1 / (~0.1E~44, ~0.27182817E1) = 0.0 nextAfter (~0.1E~44, ~0.27182817E1) = ~0.3E~44 rem (~0.1E~44, ~0.27182817E1) = ~0.1E~44 * (~0.1E~44, ~0.123E1) = 0.1E~44 + (~0.1E~44, ~0.123E1) = ~0.123E1 - (~0.1E~44, ~0.123E1) = 0.123E1 / (~0.1E~44, ~0.123E1) = 0.1E~44 nextAfter (~0.1E~44, ~0.123E1) = ~0.3E~44 rem (~0.1E~44, ~0.123E1) = ~0.1E~44 * (~0.1E~44, ~0.123) = 0.0 + (~0.1E~44, ~0.123) = ~0.123 - (~0.1E~44, ~0.123) = 0.123 / (~0.1E~44, ~0.123) = 0.11E~43 nextAfter (~0.1E~44, ~0.123) = ~0.3E~44 rem (~0.1E~44, ~0.123) = ~0.1E~44 * (~0.1E~44, ~0.123E~2) = 0.0 + (~0.1E~44, ~0.123E~2) = ~0.123E~2 - (~0.1E~44, ~0.123E~2) = 0.123E~2 / (~0.1E~44, ~0.123E~2) = 0.1139E~41 nextAfter (~0.1E~44, ~0.123E~2) = ~0.3E~44 rem (~0.1E~44, ~0.123E~2) = ~0.1E~44 * (~0.1E~44, ~0.11754944E~37) = 0.0 + (~0.1E~44, ~0.11754944E~37) = ~0.11754945E~37 - (~0.1E~44, ~0.11754944E~37) = 0.11754942E~37 / (~0.1E~44, ~0.11754944E~37) = 0.11920929E~6 nextAfter (~0.1E~44, ~0.11754944E~37) = ~0.3E~44 rem (~0.1E~44, ~0.11754944E~37) = ~0.1E~44 * (~0.1E~44, ~0.5877472E~38) = 0.0 + (~0.1E~44, ~0.5877472E~38) = ~0.5877473E~38 - (~0.1E~44, ~0.5877472E~38) = 0.587747E~38 / (~0.1E~44, ~0.5877472E~38) = 0.23841858E~6 nextAfter (~0.1E~44, ~0.5877472E~38) = ~0.3E~44 rem (~0.1E~44, ~0.5877472E~38) = ~0.1E~44 * (~0.1E~44, ~0.1E~44) = 0.0 + (~0.1E~44, ~0.1E~44) = ~0.3E~44 - (~0.1E~44, ~0.1E~44) = 0.0 / (~0.1E~44, ~0.1E~44) = 0.1E1 nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 rem (~0.1E~44, ~0.1E~44) = 0.0 * (~0.1E~44, ~0.0) = 0.0 + (~0.1E~44, ~0.0) = ~0.1E~44 - (~0.1E~44, ~0.0) = ~0.1E~44 / (~0.1E~44, ~0.0) = inf nextAfter (~0.1E~44, ~0.0) = ~0.0 rem (~0.1E~44, ~0.0) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.1E~44, ~inf) = inf + (~0.1E~44, ~inf) = ~inf - (~0.1E~44, ~inf) = inf / (~0.1E~44, ~inf) = 0.0 nextAfter (~0.1E~44, ~inf) = ~0.3E~44 rem (~0.1E~44, ~inf) = ~0.1E~44 * (~0.1E~44, nan) = nan + (~0.1E~44, nan) = nan - (~0.1E~44, nan) = nan / (~0.1E~44, nan) = nan nextAfter (~0.1E~44, nan) = nan rem (~0.1E~44, nan) = nan * (~0.1E~44, inf) = ~inf + (~0.1E~44, inf) = inf - (~0.1E~44, inf) = ~inf / (~0.1E~44, inf) = ~0.0 nextAfter (~0.1E~44, inf) = ~0.0 rem (~0.1E~44, inf) = ~0.1E~44 * (~0.0, 0.34028235E39) = ~0.0 + (~0.0, 0.34028235E39) = 0.34028235E39 - (~0.0, 0.34028235E39) = ~0.34028235E39 / (~0.0, 0.34028235E39) = ~0.0 nextAfter (~0.0, 0.34028235E39) = 0.1E~44 rem (~0.0, 0.34028235E39) = 0.0 * (~0.0, 0.17014117E39) = ~0.0 + (~0.0, 0.17014117E39) = 0.17014117E39 - (~0.0, 0.17014117E39) = ~0.17014117E39 / (~0.0, 0.17014117E39) = ~0.0 nextAfter (~0.0, 0.17014117E39) = 0.1E~44 rem (~0.0, 0.17014117E39) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.1E~44 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.1E~44 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.31415927E1) = ~0.0 + (~0.0, 0.31415927E1) = 0.31415927E1 - (~0.0, 0.31415927E1) = ~0.31415927E1 / (~0.0, 0.31415927E1) = ~0.0 nextAfter (~0.0, 0.31415927E1) = 0.1E~44 rem (~0.0, 0.31415927E1) = 0.0 * (~0.0, 0.27182817E1) = ~0.0 + (~0.0, 0.27182817E1) = 0.27182817E1 - (~0.0, 0.27182817E1) = ~0.27182817E1 / (~0.0, 0.27182817E1) = ~0.0 nextAfter (~0.0, 0.27182817E1) = 0.1E~44 rem (~0.0, 0.27182817E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.1E~44 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.1E~44 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.1E~44 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.11754944E~37) = ~0.0 + (~0.0, 0.11754944E~37) = 0.11754944E~37 - (~0.0, 0.11754944E~37) = ~0.11754944E~37 / (~0.0, 0.11754944E~37) = ~0.0 nextAfter (~0.0, 0.11754944E~37) = 0.1E~44 rem (~0.0, 0.11754944E~37) = 0.0 * (~0.0, 0.5877472E~38) = ~0.0 + (~0.0, 0.5877472E~38) = 0.5877472E~38 - (~0.0, 0.5877472E~38) = ~0.5877472E~38 / (~0.0, 0.5877472E~38) = ~0.0 nextAfter (~0.0, 0.5877472E~38) = 0.1E~44 rem (~0.0, 0.5877472E~38) = 0.0 * (~0.0, 0.1E~44) = ~0.0 + (~0.0, 0.1E~44) = 0.1E~44 - (~0.0, 0.1E~44) = ~0.1E~44 / (~0.0, 0.1E~44) = ~0.0 nextAfter (~0.0, 0.1E~44) = 0.1E~44 rem (~0.0, 0.1E~44) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.34028235E39) = 0.0 + (~0.0, ~0.34028235E39) = ~0.34028235E39 - (~0.0, ~0.34028235E39) = 0.34028235E39 / (~0.0, ~0.34028235E39) = 0.0 nextAfter (~0.0, ~0.34028235E39) = ~0.1E~44 rem (~0.0, ~0.34028235E39) = 0.0 * (~0.0, ~0.17014117E39) = 0.0 + (~0.0, ~0.17014117E39) = ~0.17014117E39 - (~0.0, ~0.17014117E39) = 0.17014117E39 / (~0.0, ~0.17014117E39) = 0.0 nextAfter (~0.0, ~0.17014117E39) = ~0.1E~44 rem (~0.0, ~0.17014117E39) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.1E~44 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.1E~44 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.31415927E1) = 0.0 + (~0.0, ~0.31415927E1) = ~0.31415927E1 - (~0.0, ~0.31415927E1) = 0.31415927E1 / (~0.0, ~0.31415927E1) = 0.0 nextAfter (~0.0, ~0.31415927E1) = ~0.1E~44 rem (~0.0, ~0.31415927E1) = 0.0 * (~0.0, ~0.27182817E1) = 0.0 + (~0.0, ~0.27182817E1) = ~0.27182817E1 - (~0.0, ~0.27182817E1) = 0.27182817E1 / (~0.0, ~0.27182817E1) = 0.0 nextAfter (~0.0, ~0.27182817E1) = ~0.1E~44 rem (~0.0, ~0.27182817E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.1E~44 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.1E~44 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.1E~44 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.11754944E~37) = 0.0 + (~0.0, ~0.11754944E~37) = ~0.11754944E~37 - (~0.0, ~0.11754944E~37) = 0.11754944E~37 / (~0.0, ~0.11754944E~37) = 0.0 nextAfter (~0.0, ~0.11754944E~37) = ~0.1E~44 rem (~0.0, ~0.11754944E~37) = 0.0 * (~0.0, ~0.5877472E~38) = 0.0 + (~0.0, ~0.5877472E~38) = ~0.5877472E~38 - (~0.0, ~0.5877472E~38) = 0.5877472E~38 / (~0.0, ~0.5877472E~38) = 0.0 nextAfter (~0.0, ~0.5877472E~38) = ~0.1E~44 rem (~0.0, ~0.5877472E~38) = 0.0 * (~0.0, ~0.1E~44) = 0.0 + (~0.0, ~0.1E~44) = ~0.1E~44 - (~0.0, ~0.1E~44) = 0.1E~44 / (~0.0, ~0.1E~44) = 0.0 nextAfter (~0.0, ~0.1E~44) = ~0.1E~44 rem (~0.0, ~0.1E~44) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.1E~44 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.1E~44 rem (~0.0, inf) = 0.0 * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.34028235E39) = ~inf + (~inf, 0.34028235E39) = ~inf - (~inf, 0.34028235E39) = ~inf / (~inf, 0.34028235E39) = ~inf nextAfter (~inf, 0.34028235E39) = ~inf rem (~inf, 0.34028235E39) = nan * (~inf, 0.17014117E39) = ~inf + (~inf, 0.17014117E39) = ~inf - (~inf, 0.17014117E39) = ~inf / (~inf, 0.17014117E39) = ~inf nextAfter (~inf, 0.17014117E39) = ~inf rem (~inf, 0.17014117E39) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.31415927E1) = ~inf + (~inf, 0.31415927E1) = ~inf - (~inf, 0.31415927E1) = ~inf / (~inf, 0.31415927E1) = ~inf nextAfter (~inf, 0.31415927E1) = ~inf rem (~inf, 0.31415927E1) = nan * (~inf, 0.27182817E1) = ~inf + (~inf, 0.27182817E1) = ~inf - (~inf, 0.27182817E1) = ~inf / (~inf, 0.27182817E1) = ~inf nextAfter (~inf, 0.27182817E1) = ~inf rem (~inf, 0.27182817E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.11754944E~37) = ~inf + (~inf, 0.11754944E~37) = ~inf - (~inf, 0.11754944E~37) = ~inf / (~inf, 0.11754944E~37) = ~inf nextAfter (~inf, 0.11754944E~37) = ~inf rem (~inf, 0.11754944E~37) = nan * (~inf, 0.5877472E~38) = ~inf + (~inf, 0.5877472E~38) = ~inf - (~inf, 0.5877472E~38) = ~inf / (~inf, 0.5877472E~38) = ~inf nextAfter (~inf, 0.5877472E~38) = ~inf rem (~inf, 0.5877472E~38) = nan * (~inf, 0.1E~44) = ~inf + (~inf, 0.1E~44) = ~inf - (~inf, 0.1E~44) = ~inf / (~inf, 0.1E~44) = ~inf nextAfter (~inf, 0.1E~44) = ~inf rem (~inf, 0.1E~44) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.34028235E39) = inf + (~inf, ~0.34028235E39) = ~inf - (~inf, ~0.34028235E39) = ~inf / (~inf, ~0.34028235E39) = inf nextAfter (~inf, ~0.34028235E39) = ~inf rem (~inf, ~0.34028235E39) = nan * (~inf, ~0.17014117E39) = inf + (~inf, ~0.17014117E39) = ~inf - (~inf, ~0.17014117E39) = ~inf / (~inf, ~0.17014117E39) = inf nextAfter (~inf, ~0.17014117E39) = ~inf rem (~inf, ~0.17014117E39) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.31415927E1) = inf + (~inf, ~0.31415927E1) = ~inf - (~inf, ~0.31415927E1) = ~inf / (~inf, ~0.31415927E1) = inf nextAfter (~inf, ~0.31415927E1) = ~inf rem (~inf, ~0.31415927E1) = nan * (~inf, ~0.27182817E1) = inf + (~inf, ~0.27182817E1) = ~inf - (~inf, ~0.27182817E1) = ~inf / (~inf, ~0.27182817E1) = inf nextAfter (~inf, ~0.27182817E1) = ~inf rem (~inf, ~0.27182817E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.11754944E~37) = inf + (~inf, ~0.11754944E~37) = ~inf - (~inf, ~0.11754944E~37) = ~inf / (~inf, ~0.11754944E~37) = inf nextAfter (~inf, ~0.11754944E~37) = ~inf rem (~inf, ~0.11754944E~37) = nan * (~inf, ~0.5877472E~38) = inf + (~inf, ~0.5877472E~38) = ~inf - (~inf, ~0.5877472E~38) = ~inf / (~inf, ~0.5877472E~38) = inf nextAfter (~inf, ~0.5877472E~38) = ~inf rem (~inf, ~0.5877472E~38) = nan * (~inf, ~0.1E~44) = inf + (~inf, ~0.1E~44) = ~inf - (~inf, ~0.1E~44) = ~inf / (~inf, ~0.1E~44) = inf nextAfter (~inf, ~0.1E~44) = ~inf rem (~inf, ~0.1E~44) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.34028235E39) = nan + (nan, 0.34028235E39) = nan - (nan, 0.34028235E39) = nan / (nan, 0.34028235E39) = nan nextAfter (nan, 0.34028235E39) = nan rem (nan, 0.34028235E39) = nan * (nan, 0.17014117E39) = nan + (nan, 0.17014117E39) = nan - (nan, 0.17014117E39) = nan / (nan, 0.17014117E39) = nan nextAfter (nan, 0.17014117E39) = nan rem (nan, 0.17014117E39) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.31415927E1) = nan + (nan, 0.31415927E1) = nan - (nan, 0.31415927E1) = nan / (nan, 0.31415927E1) = nan nextAfter (nan, 0.31415927E1) = nan rem (nan, 0.31415927E1) = nan * (nan, 0.27182817E1) = nan + (nan, 0.27182817E1) = nan - (nan, 0.27182817E1) = nan / (nan, 0.27182817E1) = nan nextAfter (nan, 0.27182817E1) = nan rem (nan, 0.27182817E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.11754944E~37) = nan + (nan, 0.11754944E~37) = nan - (nan, 0.11754944E~37) = nan / (nan, 0.11754944E~37) = nan nextAfter (nan, 0.11754944E~37) = nan rem (nan, 0.11754944E~37) = nan * (nan, 0.5877472E~38) = nan + (nan, 0.5877472E~38) = nan - (nan, 0.5877472E~38) = nan / (nan, 0.5877472E~38) = nan nextAfter (nan, 0.5877472E~38) = nan rem (nan, 0.5877472E~38) = nan * (nan, 0.1E~44) = nan + (nan, 0.1E~44) = nan - (nan, 0.1E~44) = nan / (nan, 0.1E~44) = nan nextAfter (nan, 0.1E~44) = nan rem (nan, 0.1E~44) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.34028235E39) = nan + (nan, ~0.34028235E39) = nan - (nan, ~0.34028235E39) = nan / (nan, ~0.34028235E39) = nan nextAfter (nan, ~0.34028235E39) = nan rem (nan, ~0.34028235E39) = nan * (nan, ~0.17014117E39) = nan + (nan, ~0.17014117E39) = nan - (nan, ~0.17014117E39) = nan / (nan, ~0.17014117E39) = nan nextAfter (nan, ~0.17014117E39) = nan rem (nan, ~0.17014117E39) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.31415927E1) = nan + (nan, ~0.31415927E1) = nan - (nan, ~0.31415927E1) = nan / (nan, ~0.31415927E1) = nan nextAfter (nan, ~0.31415927E1) = nan rem (nan, ~0.31415927E1) = nan * (nan, ~0.27182817E1) = nan + (nan, ~0.27182817E1) = nan - (nan, ~0.27182817E1) = nan / (nan, ~0.27182817E1) = nan nextAfter (nan, ~0.27182817E1) = nan rem (nan, ~0.27182817E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.11754944E~37) = nan + (nan, ~0.11754944E~37) = nan - (nan, ~0.11754944E~37) = nan / (nan, ~0.11754944E~37) = nan nextAfter (nan, ~0.11754944E~37) = nan rem (nan, ~0.11754944E~37) = nan * (nan, ~0.5877472E~38) = nan + (nan, ~0.5877472E~38) = nan - (nan, ~0.5877472E~38) = nan / (nan, ~0.5877472E~38) = nan nextAfter (nan, ~0.5877472E~38) = nan rem (nan, ~0.5877472E~38) = nan * (nan, ~0.1E~44) = nan + (nan, ~0.1E~44) = nan - (nan, ~0.1E~44) = nan / (nan, ~0.1E~44) = nan nextAfter (nan, ~0.1E~44) = nan rem (nan, ~0.1E~44) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.34028235E39) = inf + (inf, 0.34028235E39) = inf - (inf, 0.34028235E39) = inf / (inf, 0.34028235E39) = inf nextAfter (inf, 0.34028235E39) = inf rem (inf, 0.34028235E39) = nan * (inf, 0.17014117E39) = inf + (inf, 0.17014117E39) = inf - (inf, 0.17014117E39) = inf / (inf, 0.17014117E39) = inf nextAfter (inf, 0.17014117E39) = inf rem (inf, 0.17014117E39) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.31415927E1) = inf + (inf, 0.31415927E1) = inf - (inf, 0.31415927E1) = inf / (inf, 0.31415927E1) = inf nextAfter (inf, 0.31415927E1) = inf rem (inf, 0.31415927E1) = nan * (inf, 0.27182817E1) = inf + (inf, 0.27182817E1) = inf - (inf, 0.27182817E1) = inf / (inf, 0.27182817E1) = inf nextAfter (inf, 0.27182817E1) = inf rem (inf, 0.27182817E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.11754944E~37) = inf + (inf, 0.11754944E~37) = inf - (inf, 0.11754944E~37) = inf / (inf, 0.11754944E~37) = inf nextAfter (inf, 0.11754944E~37) = inf rem (inf, 0.11754944E~37) = nan * (inf, 0.5877472E~38) = inf + (inf, 0.5877472E~38) = inf - (inf, 0.5877472E~38) = inf / (inf, 0.5877472E~38) = inf nextAfter (inf, 0.5877472E~38) = inf rem (inf, 0.5877472E~38) = nan * (inf, 0.1E~44) = inf + (inf, 0.1E~44) = inf - (inf, 0.1E~44) = inf / (inf, 0.1E~44) = inf nextAfter (inf, 0.1E~44) = inf rem (inf, 0.1E~44) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.34028235E39) = ~inf + (inf, ~0.34028235E39) = inf - (inf, ~0.34028235E39) = inf / (inf, ~0.34028235E39) = ~inf nextAfter (inf, ~0.34028235E39) = inf rem (inf, ~0.34028235E39) = nan * (inf, ~0.17014117E39) = ~inf + (inf, ~0.17014117E39) = inf - (inf, ~0.17014117E39) = inf / (inf, ~0.17014117E39) = ~inf nextAfter (inf, ~0.17014117E39) = inf rem (inf, ~0.17014117E39) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.31415927E1) = ~inf + (inf, ~0.31415927E1) = inf - (inf, ~0.31415927E1) = inf / (inf, ~0.31415927E1) = ~inf nextAfter (inf, ~0.31415927E1) = inf rem (inf, ~0.31415927E1) = nan * (inf, ~0.27182817E1) = ~inf + (inf, ~0.27182817E1) = inf - (inf, ~0.27182817E1) = inf / (inf, ~0.27182817E1) = ~inf nextAfter (inf, ~0.27182817E1) = inf rem (inf, ~0.27182817E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.11754944E~37) = ~inf + (inf, ~0.11754944E~37) = inf - (inf, ~0.11754944E~37) = inf / (inf, ~0.11754944E~37) = ~inf nextAfter (inf, ~0.11754944E~37) = inf rem (inf, ~0.11754944E~37) = nan * (inf, ~0.5877472E~38) = ~inf + (inf, ~0.5877472E~38) = inf - (inf, ~0.5877472E~38) = inf / (inf, ~0.5877472E~38) = ~inf nextAfter (inf, ~0.5877472E~38) = inf rem (inf, ~0.5877472E~38) = nan * (inf, ~0.1E~44) = ~inf + (inf, ~0.1E~44) = inf - (inf, ~0.1E~44) = inf / (inf, ~0.1E~44) = ~inf nextAfter (inf, ~0.1E~44) = inf rem (inf, ~0.1E~44) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.34028235E39) = nan asin (0.34028235E39) = nan atan (0.34028235E39) = 1.570796371 cos (0.34028235E39) = 3.402823466E38 cosh (0.34028235E39) = inf exp (0.34028235E39) = inf ln (0.34028235E39) = 88.72283936 log10 (0.34028235E39) = 38.53184128 sin (0.34028235E39) = 3.402823466E38 sinh (0.34028235E39) = inf sqrt (0.34028235E39) = 1.844674297E19 tan (0.34028235E39) = nan tanh (0.34028235E39) = 1 acos (0.17014117E39) = nan asin (0.17014117E39) = nan atan (0.17014117E39) = 1.570796371 cos (0.17014117E39) = 1.701411733E38 cosh (0.17014117E39) = inf exp (0.17014117E39) = inf ln (0.17014117E39) = 88.0296936 log10 (0.17014117E39) = 38.23080826 sin (0.17014117E39) = 1.701411733E38 sinh (0.17014117E39) = inf sqrt (0.17014117E39) = 1.30438176E19 tan (0.17014117E39) = nan tanh (0.17014117E39) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983363 cos (0.123E4) = 0.06642717123 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769459 log10 (0.123E4) = 3.089905024 sin (0.123E4) = ~0.9977912903 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135773 tan (0.123E4) = ~15.02083111 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673972 cos (0.123E2) = 0.9647326469 cosh (0.123E2) = 109848.0156 exp (0.123E2) = 219696.0312 ln (0.123E2) = 2.509599209 log10 (0.123E2) = 1.089905143 sin (0.123E2) = ~0.2632316053 sinh (0.123E2) = 109848.0156 sqrt (0.123E2) = 3.50713563 tan (0.123E2) = ~0.2728544474 tanh (0.123E2) = 1 acos (0.31415927E1) = nan asin (0.31415927E1) = nan atan (0.31415927E1) = 1.262627244 cos (0.31415927E1) = ~1 cosh (0.31415927E1) = 11.59195518 exp (0.31415927E1) = 23.14069557 ln (0.31415927E1) = 1.144729972 log10 (0.31415927E1) = 0.4971498847 sin (0.31415927E1) = ~8.742277657E~8 sinh (0.31415927E1) = 11.54874039 sqrt (0.31415927E1) = 1.772453904 tan (0.31415927E1) = 8.742277657E~8 tanh (0.31415927E1) = 0.9962720871 acos (0.27182817E1) = nan asin (0.27182817E1) = nan atan (0.27182817E1) = 1.218282938 cos (0.27182817E1) = ~0.9117338657 cosh (0.27182817E1) = 7.610124111 exp (0.27182817E1) = 15.15426064 ln (0.27182817E1) = 0.9999999404 log10 (0.27182817E1) = 0.4342944622 sin (0.27182817E1) = 0.4107813537 sinh (0.27182817E1) = 7.544136524 sqrt (0.27182817E1) = 1.648721218 tan (0.27182817E1) = ~0.4505496323 tanh (0.27182817E1) = 0.9913288951 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.888173759 cos (0.123E1) = 0.3342376947 cosh (0.123E1) = 1.856761098 exp (0.123E1) = 3.421229601 ln (0.123E1) = 0.2070141882 log10 (0.123E1) = 0.08990512043 sin (0.123E1) = 0.9424887896 sinh (0.123E1) = 1.564468503 sqrt (0.123E1) = 1.109053612 tan (0.123E1) = 2.819815874 tanh (0.123E1) = 0.8425793052 acos (0.123) = 1.447484016 asin (0.123) = 0.1233122796 atan (0.123) = 0.1223852858 cos (0.123) = 0.9924450517 cosh (0.123) = 1.007574081 exp (0.123) = 1.130884409 ln (0.123) = ~2.095570803 log10 (0.123) = ~0.9100948572 sin (0.123) = 0.1226900965 sinh (0.123) = 0.1233103797 sqrt (0.123) = 0.350713551 tan (0.123) = 0.1236240715 tanh (0.123) = 0.1223834455 acos (0.123E~2) = 1.569566369 asin (0.123E~2) = 0.001230000402 atan (0.123E~2) = 0.001229999471 cos (0.123E~2) = 0.9999992251 cosh (0.123E~2) = 1.000000715 exp (0.123E~2) = 1.001230717 ln (0.123E~2) = ~6.700741291 log10 (0.123E~2) = ~2.910094976 sin (0.123E~2) = 0.001229999703 sinh (0.123E~2) = 0.001230000402 sqrt (0.123E~2) = 0.03507135808 tan (0.123E~2) = 0.001230000635 tanh (0.123E~2) = 0.001229999471 acos (0.11754944E~37) = 1.570796371 asin (0.11754944E~37) = 1.175494351E~38 atan (0.11754944E~37) = 1.175494351E~38 cos (0.11754944E~37) = 1 cosh (0.11754944E~37) = 1 exp (0.11754944E~37) = 1 ln (0.11754944E~37) = ~87.33654785 log10 (0.11754944E~37) = ~37.92977905 sin (0.11754944E~37) = 1.175494351E~38 sinh (0.11754944E~37) = 1.175494351E~38 sqrt (0.11754944E~37) = 1.084202172E~19 tan (0.11754944E~37) = 1.175494351E~38 tanh (0.11754944E~37) = 1.175494351E~38 acos (0.5877472E~38) = 1.570796371 asin (0.5877472E~38) = 5.877471754E~39 atan (0.5877472E~38) = 5.877471754E~39 cos (0.5877472E~38) = 1 cosh (0.5877472E~38) = 1 exp (0.5877472E~38) = 1 ln (0.5877472E~38) = ~88.0296936 log10 (0.5877472E~38) = ~38.23080826 sin (0.5877472E~38) = 5.877471754E~39 sinh (0.5877472E~38) = 5.877471754E~39 sqrt (0.5877472E~38) = 7.666466952E~20 tan (0.5877472E~38) = 5.877471754E~39 tanh (0.5877472E~38) = 5.877471754E~39 acos (0.1E~44) = 1.570796371 asin (0.1E~44) = 1.401298464E~45 atan (0.1E~44) = 1.401298464E~45 cos (0.1E~44) = 1 cosh (0.1E~44) = 1 exp (0.1E~44) = 1 ln (0.1E~44) = ~103.2789307 log10 (0.1E~44) = ~44.85346985 sin (0.1E~44) = 1.401298464E~45 sinh (0.1E~44) = 1.401298464E~45 sqrt (0.1E~44) = 3.743392067E~23 tan (0.1E~44) = 1.401298464E~45 tanh (0.1E~44) = 1.401298464E~45 acos (0.0) = 1.570796371 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.34028235E39) = nan asin (~0.34028235E39) = nan atan (~0.34028235E39) = ~1.570796371 cos (~0.34028235E39) = ~3.402823466E38 cosh (~0.34028235E39) = inf exp (~0.34028235E39) = 0 ln (~0.34028235E39) = nan log10 (~0.34028235E39) = nan sin (~0.34028235E39) = ~3.402823466E38 sinh (~0.34028235E39) = ~inf sqrt (~0.34028235E39) = nan tan (~0.34028235E39) = nan tanh (~0.34028235E39) = ~1 acos (~0.17014117E39) = nan asin (~0.17014117E39) = nan atan (~0.17014117E39) = ~1.570796371 cos (~0.17014117E39) = ~1.701411733E38 cosh (~0.17014117E39) = inf exp (~0.17014117E39) = 0 ln (~0.17014117E39) = nan log10 (~0.17014117E39) = nan sin (~0.17014117E39) = ~1.701411733E38 sinh (~0.17014117E39) = ~inf sqrt (~0.17014117E39) = nan tan (~0.17014117E39) = nan tanh (~0.17014117E39) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983363 cos (~0.123E4) = 0.06642717123 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912903 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083111 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673972 cos (~0.123E2) = 0.9647326469 cosh (~0.123E2) = 109848.0156 exp (~0.123E2) = 4.551743586E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632316053 sinh (~0.123E2) = ~109848.0156 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.2728544474 tanh (~0.123E2) = ~1 acos (~0.31415927E1) = nan asin (~0.31415927E1) = nan atan (~0.31415927E1) = ~1.262627244 cos (~0.31415927E1) = ~1 cosh (~0.31415927E1) = 11.59195518 exp (~0.31415927E1) = 0.04321391508 ln (~0.31415927E1) = nan log10 (~0.31415927E1) = nan sin (~0.31415927E1) = 8.742277657E~8 sinh (~0.31415927E1) = ~11.54874039 sqrt (~0.31415927E1) = nan tan (~0.31415927E1) = ~8.742277657E~8 tanh (~0.31415927E1) = ~0.9962720871 acos (~0.27182817E1) = nan asin (~0.27182817E1) = nan atan (~0.27182817E1) = ~1.218282938 cos (~0.27182817E1) = ~0.9117338657 cosh (~0.27182817E1) = 7.610124111 exp (~0.27182817E1) = 0.06598804146 ln (~0.27182817E1) = nan log10 (~0.27182817E1) = nan sin (~0.27182817E1) = ~0.4107813537 sinh (~0.27182817E1) = ~7.544136524 sqrt (~0.27182817E1) = nan tan (~0.27182817E1) = 0.4505496323 tanh (~0.27182817E1) = ~0.9913288951 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.888173759 cos (~0.123E1) = 0.3342376947 cosh (~0.123E1) = 1.856761098 exp (~0.123E1) = 0.2922925651 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424887896 sinh (~0.123E1) = ~1.564468503 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815874 tanh (~0.123E1) = ~0.8425793052 acos (~0.123) = 1.694108605 asin (~0.123) = ~0.1233122796 atan (~0.123) = ~0.1223852858 cos (~0.123) = 0.9924450517 cosh (~0.123) = 1.007574081 exp (~0.123) = 0.8842636347 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.1226900965 sinh (~0.123) = ~0.1233103797 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240715 tanh (~0.123) = ~0.1223834455 acos (~0.123E~2) = 1.572026372 asin (~0.123E~2) = ~0.001230000402 atan (~0.123E~2) = ~0.001229999471 cos (~0.123E~2) = 0.9999992251 cosh (~0.123E~2) = 1.000000715 exp (~0.123E~2) = 0.9987707734 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.001229999703 sinh (~0.123E~2) = ~0.001230000402 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.001230000635 tanh (~0.123E~2) = ~0.001229999471 acos (~0.11754944E~37) = 1.570796371 asin (~0.11754944E~37) = ~1.175494351E~38 atan (~0.11754944E~37) = ~1.175494351E~38 cos (~0.11754944E~37) = 1 cosh (~0.11754944E~37) = 1 exp (~0.11754944E~37) = 1 ln (~0.11754944E~37) = nan log10 (~0.11754944E~37) = nan sin (~0.11754944E~37) = ~1.175494351E~38 sinh (~0.11754944E~37) = ~1.175494351E~38 sqrt (~0.11754944E~37) = nan tan (~0.11754944E~37) = ~1.175494351E~38 tanh (~0.11754944E~37) = ~1.175494351E~38 acos (~0.5877472E~38) = 1.570796371 asin (~0.5877472E~38) = ~5.877471754E~39 atan (~0.5877472E~38) = ~5.877471754E~39 cos (~0.5877472E~38) = 1 cosh (~0.5877472E~38) = 1 exp (~0.5877472E~38) = 1 ln (~0.5877472E~38) = nan log10 (~0.5877472E~38) = nan sin (~0.5877472E~38) = ~5.877471754E~39 sinh (~0.5877472E~38) = ~5.877471754E~39 sqrt (~0.5877472E~38) = nan tan (~0.5877472E~38) = ~5.877471754E~39 tanh (~0.5877472E~38) = ~5.877471754E~39 acos (~0.1E~44) = 1.570796371 asin (~0.1E~44) = ~1.401298464E~45 atan (~0.1E~44) = ~1.401298464E~45 cos (~0.1E~44) = 1 cosh (~0.1E~44) = 1 exp (~0.1E~44) = 1 ln (~0.1E~44) = nan log10 (~0.1E~44) = nan sin (~0.1E~44) = ~1.401298464E~45 sinh (~0.1E~44) = ~1.401298464E~45 sqrt (~0.1E~44) = nan tan (~0.1E~44) = ~1.401298464E~45 tanh (~0.1E~44) = ~1.401298464E~45 acos (~0.0) = 1.570796371 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796371 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796371 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.34028235E39, 0.34028235E39) = 0.7853981853 pow (0.34028235E39, 0.34028235E39) = inf atan2 (0.34028235E39, 0.17014117E39) = 1.107148767 pow (0.34028235E39, 0.17014117E39) = inf atan2 (0.34028235E39, 0.123E4) = 1.570796371 pow (0.34028235E39, 0.123E4) = inf atan2 (0.34028235E39, 0.123E2) = 1.570796371 pow (0.34028235E39, 0.123E2) = inf atan2 (0.34028235E39, 0.31415927E1) = 1.570796371 pow (0.34028235E39, 0.31415927E1) = inf atan2 (0.34028235E39, 0.27182817E1) = 1.570796371 pow (0.34028235E39, 0.27182817E1) = inf atan2 (0.34028235E39, 0.123E1) = 1.570796371 pow (0.34028235E39, 0.123E1) = inf atan2 (0.34028235E39, 0.123) = 1.570796371 pow (0.34028235E39, 0.123) = 54880.28906 atan2 (0.34028235E39, 0.123E~2) = 1.570796371 pow (0.34028235E39, 0.123E~2) = 1.115306377 atan2 (0.34028235E39, 0.11754944E~37) = 1.570796371 pow (0.34028235E39, 0.11754944E~37) = 1 atan2 (0.34028235E39, 0.5877472E~38) = 1.570796371 pow (0.34028235E39, 0.5877472E~38) = 1 atan2 (0.34028235E39, 0.1E~44) = 1.570796371 pow (0.34028235E39, 0.1E~44) = 1 atan2 (0.34028235E39, 0.0) = 1.570796371 pow (0.34028235E39, 0.0) = 1 atan2 (0.34028235E39, ~0.34028235E39) = 2.356194496 pow (0.34028235E39, ~0.34028235E39) = 0 atan2 (0.34028235E39, ~0.17014117E39) = 2.034443855 pow (0.34028235E39, ~0.17014117E39) = 0 atan2 (0.34028235E39, ~0.123E4) = 1.570796371 pow (0.34028235E39, ~0.123E4) = 0 atan2 (0.34028235E39, ~0.123E2) = 1.570796371 pow (0.34028235E39, ~0.123E2) = 0 atan2 (0.34028235E39, ~0.31415927E1) = 1.570796371 pow (0.34028235E39, ~0.31415927E1) = 0 atan2 (0.34028235E39, ~0.27182817E1) = 1.570796371 pow (0.34028235E39, ~0.27182817E1) = 0 atan2 (0.34028235E39, ~0.123E1) = 1.570796371 pow (0.34028235E39, ~0.123E1) = 0 atan2 (0.34028235E39, ~0.123) = 1.570796371 pow (0.34028235E39, ~0.123) = 1.822147897E~5 atan2 (0.34028235E39, ~0.123E~2) = 1.570796371 pow (0.34028235E39, ~0.123E~2) = 0.8966146708 atan2 (0.34028235E39, ~0.11754944E~37) = 1.570796371 pow (0.34028235E39, ~0.11754944E~37) = 1 atan2 (0.34028235E39, ~0.5877472E~38) = 1.570796371 pow (0.34028235E39, ~0.5877472E~38) = 1 atan2 (0.34028235E39, ~0.1E~44) = 1.570796371 pow (0.34028235E39, ~0.1E~44) = 1 atan2 (0.34028235E39, ~0.0) = 1.570796371 pow (0.34028235E39, ~0.0) = 1 atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.34028235E39, ~inf) = 3.141592741 pow (0.34028235E39, ~inf) = 0 atan2 (0.34028235E39, nan) = nan pow (0.34028235E39, nan) = nan atan2 (0.34028235E39, inf) = 0 pow (0.34028235E39, inf) = inf atan2 (0.17014117E39, 0.34028235E39) = 0.463647604 pow (0.17014117E39, 0.34028235E39) = inf atan2 (0.17014117E39, 0.17014117E39) = 0.7853981853 pow (0.17014117E39, 0.17014117E39) = inf atan2 (0.17014117E39, 0.123E4) = 1.570796371 pow (0.17014117E39, 0.123E4) = inf atan2 (0.17014117E39, 0.123E2) = 1.570796371 pow (0.17014117E39, 0.123E2) = inf atan2 (0.17014117E39, 0.31415927E1) = 1.570796371 pow (0.17014117E39, 0.31415927E1) = inf atan2 (0.17014117E39, 0.27182817E1) = 1.570796371 pow (0.17014117E39, 0.27182817E1) = inf atan2 (0.17014117E39, 0.123E1) = 1.570796371 pow (0.17014117E39, 0.123E1) = inf atan2 (0.17014117E39, 0.123) = 1.570796371 pow (0.17014117E39, 0.123) = 50395.26172 atan2 (0.17014117E39, 0.123E~2) = 1.570796371 pow (0.17014117E39, 0.123E~2) = 1.114355803 atan2 (0.17014117E39, 0.11754944E~37) = 1.570796371 pow (0.17014117E39, 0.11754944E~37) = 1 atan2 (0.17014117E39, 0.5877472E~38) = 1.570796371 pow (0.17014117E39, 0.5877472E~38) = 1 atan2 (0.17014117E39, 0.1E~44) = 1.570796371 pow (0.17014117E39, 0.1E~44) = 1 atan2 (0.17014117E39, 0.0) = 1.570796371 pow (0.17014117E39, 0.0) = 1 atan2 (0.17014117E39, ~0.34028235E39) = 2.677945137 pow (0.17014117E39, ~0.34028235E39) = 0 atan2 (0.17014117E39, ~0.17014117E39) = 2.356194496 pow (0.17014117E39, ~0.17014117E39) = 0 atan2 (0.17014117E39, ~0.123E4) = 1.570796371 pow (0.17014117E39, ~0.123E4) = 0 atan2 (0.17014117E39, ~0.123E2) = 1.570796371 pow (0.17014117E39, ~0.123E2) = 0 atan2 (0.17014117E39, ~0.31415927E1) = 1.570796371 pow (0.17014117E39, ~0.31415927E1) = 0 atan2 (0.17014117E39, ~0.27182817E1) = 1.570796371 pow (0.17014117E39, ~0.27182817E1) = 0 atan2 (0.17014117E39, ~0.123E1) = 1.570796371 pow (0.17014117E39, ~0.123E1) = 0 atan2 (0.17014117E39, ~0.123) = 1.570796371 pow (0.17014117E39, ~0.123) = 1.984313531E~5 atan2 (0.17014117E39, ~0.123E~2) = 1.570796371 pow (0.17014117E39, ~0.123E~2) = 0.8973793983 atan2 (0.17014117E39, ~0.11754944E~37) = 1.570796371 pow (0.17014117E39, ~0.11754944E~37) = 1 atan2 (0.17014117E39, ~0.5877472E~38) = 1.570796371 pow (0.17014117E39, ~0.5877472E~38) = 1 atan2 (0.17014117E39, ~0.1E~44) = 1.570796371 pow (0.17014117E39, ~0.1E~44) = 1 atan2 (0.17014117E39, ~0.0) = 1.570796371 pow (0.17014117E39, ~0.0) = 1 atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.17014117E39, ~inf) = 3.141592741 pow (0.17014117E39, ~inf) = 0 atan2 (0.17014117E39, nan) = nan pow (0.17014117E39, nan) = nan atan2 (0.17014117E39, inf) = 0 pow (0.17014117E39, inf) = inf atan2 (0.123E4, 0.34028235E39) = 3.614645488E~36 pow (0.123E4, 0.34028235E39) = inf atan2 (0.123E4, 0.17014117E39) = 7.229290975E~36 pow (0.123E4, 0.17014117E39) = inf atan2 (0.123E4, 0.123E4) = 0.7853981853 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.560796618 pow (0.123E4, 0.123E2) = 1.013522656E38 atan2 (0.123E4, 0.31415927E1) = 1.568242192 pow (0.123E4, 0.31415927E1) = 5095930368 atan2 (0.123E4, 0.27182817E1) = 1.568586349 pow (0.123E4, 0.27182817E1) = 250745216 atan2 (0.123E4, 0.123E1) = 1.569796324 pow (0.123E4, 0.123E1) = 6318.054199 atan2 (0.123E4, 0.123) = 1.570696354 pow (0.123E4, 0.123) = 2.39915514 atan2 (0.123E4, 0.123E~2) = 1.570795298 pow (0.123E4, 0.123E~2) = 1.008789539 atan2 (0.123E4, 0.11754944E~37) = 1.570796371 pow (0.123E4, 0.11754944E~37) = 1 atan2 (0.123E4, 0.5877472E~38) = 1.570796371 pow (0.123E4, 0.5877472E~38) = 1 atan2 (0.123E4, 0.1E~44) = 1.570796371 pow (0.123E4, 0.1E~44) = 1 atan2 (0.123E4, 0.0) = 1.570796371 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.34028235E39) = 3.141592741 pow (0.123E4, ~0.34028235E39) = 0 atan2 (0.123E4, ~0.17014117E39) = 3.141592741 pow (0.123E4, ~0.17014117E39) = 0 atan2 (0.123E4, ~0.123E4) = 2.356194496 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580796003 pow (0.123E4, ~0.123E2) = 9.86657752E~39 atan2 (0.123E4, ~0.31415927E1) = 1.57335043 pow (0.123E4, ~0.31415927E1) = 1.962350282E~10 atan2 (0.123E4, ~0.27182817E1) = 1.573006272 pow (0.123E4, ~0.27182817E1) = 3.988112063E~9 atan2 (0.123E4, ~0.123E1) = 1.571796298 pow (0.123E4, ~0.123E1) = 1.582765835E~4 atan2 (0.123E4, ~0.123) = 1.570896268 pow (0.123E4, ~0.123) = 0.4168134034 atan2 (0.123E4, ~0.123E~2) = 1.570797324 pow (0.123E4, ~0.123E~2) = 0.991286993 atan2 (0.123E4, ~0.11754944E~37) = 1.570796371 pow (0.123E4, ~0.11754944E~37) = 1 atan2 (0.123E4, ~0.5877472E~38) = 1.570796371 pow (0.123E4, ~0.5877472E~38) = 1 atan2 (0.123E4, ~0.1E~44) = 1.570796371 pow (0.123E4, ~0.1E~44) = 1 atan2 (0.123E4, ~0.0) = 1.570796371 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592741 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.34028235E39) = 3.614645465E~38 pow (0.123E2, 0.34028235E39) = inf atan2 (0.123E2, 0.17014117E39) = 7.22929093E~38 pow (0.123E2, 0.17014117E39) = inf atan2 (0.123E2, 0.123E4) = 0.009999667294 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981853 pow (0.123E2, 0.123E2) = 2.545852141E13 atan2 (0.123E2, 0.31415927E1) = 1.32072866 pow (0.123E2, 0.31415927E1) = 2654.837891 atan2 (0.123E2, 0.27182817E1) = 1.353293777 pow (0.123E2, 0.27182817E1) = 917.6333618 atan2 (0.123E2, 0.123E1) = 1.471127629 pow (0.123E2, 0.123E1) = 21.90702057 atan2 (0.123E2, 0.123) = 1.560796618 pow (0.123E2, 0.123) = 1.361627579 atan2 (0.123E2, 0.123E~2) = 1.570696354 pow (0.123E2, 0.123E~2) = 1.003091574 atan2 (0.123E2, 0.11754944E~37) = 1.570796371 pow (0.123E2, 0.11754944E~37) = 1 atan2 (0.123E2, 0.5877472E~38) = 1.570796371 pow (0.123E2, 0.5877472E~38) = 1 atan2 (0.123E2, 0.1E~44) = 1.570796371 pow (0.123E2, 0.1E~44) = 1 atan2 (0.123E2, 0.0) = 1.570796371 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.34028235E39) = 3.141592741 pow (0.123E2, ~0.34028235E39) = 0 atan2 (0.123E2, ~0.17014117E39) = 3.141592741 pow (0.123E2, ~0.17014117E39) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592989 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.356194496 pow (0.123E2, ~0.123E2) = 3.927958084E~14 atan2 (0.123E2, ~0.31415927E1) = 1.820864081 pow (0.123E2, ~0.31415927E1) = 3.766708251E~4 atan2 (0.123E2, ~0.27182817E1) = 1.788298845 pow (0.123E2, ~0.27182817E1) = 0.00108975987 atan2 (0.123E2, ~0.123E1) = 1.670464993 pow (0.123E2, ~0.123E1) = 0.04564746842 atan2 (0.123E2, ~0.123) = 1.580796003 pow (0.123E2, ~0.123) = 0.7344152331 atan2 (0.123E2, ~0.123E~2) = 1.570896268 pow (0.123E2, ~0.123E~2) = 0.996917963 atan2 (0.123E2, ~0.11754944E~37) = 1.570796371 pow (0.123E2, ~0.11754944E~37) = 1 atan2 (0.123E2, ~0.5877472E~38) = 1.570796371 pow (0.123E2, ~0.5877472E~38) = 1 atan2 (0.123E2, ~0.1E~44) = 1.570796371 pow (0.123E2, ~0.1E~44) = 1 atan2 (0.123E2, ~0.0) = 1.570796371 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592741 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.31415927E1, 0.34028235E39) = 9.232312E~39 pow (0.31415927E1, 0.34028235E39) = inf atan2 (0.31415927E1, 0.17014117E39) = 1.8464624E~38 pow (0.31415927E1, 0.17014117E39) = inf atan2 (0.31415927E1, 0.123E4) = 0.002554134931 pow (0.31415927E1, 0.123E4) = inf atan2 (0.31415927E1, 0.123E2) = 0.2500677109 pow (0.31415927E1, 0.123E2) = 1302997.75 atan2 (0.31415927E1, 0.31415927E1) = 0.7853981853 pow (0.31415927E1, 0.31415927E1) = 36.46216583 atan2 (0.31415927E1, 0.27182817E1) = 0.8575118184 pow (0.31415927E1, 0.27182817E1) = 22.45915794 atan2 (0.31415927E1, 0.123E1) = 1.19762063 pow (0.31415927E1, 0.123E1) = 4.087844372 atan2 (0.31415927E1, 0.123) = 1.531664252 pow (0.31415927E1, 0.123) = 1.15119648 atan2 (0.31415927E1, 0.123E~2) = 1.570404768 pow (0.31415927E1, 0.123E~2) = 1.001409054 atan2 (0.31415927E1, 0.11754944E~37) = 1.570796371 pow (0.31415927E1, 0.11754944E~37) = 1 atan2 (0.31415927E1, 0.5877472E~38) = 1.570796371 pow (0.31415927E1, 0.5877472E~38) = 1 atan2 (0.31415927E1, 0.1E~44) = 1.570796371 pow (0.31415927E1, 0.1E~44) = 1 atan2 (0.31415927E1, 0.0) = 1.570796371 pow (0.31415927E1, 0.0) = 1 atan2 (0.31415927E1, ~0.34028235E39) = 3.141592741 pow (0.31415927E1, ~0.34028235E39) = 0 atan2 (0.31415927E1, ~0.17014117E39) = 3.141592741 pow (0.31415927E1, ~0.17014117E39) = 0 atan2 (0.31415927E1, ~0.123E4) = 3.139038563 pow (0.31415927E1, ~0.123E4) = 0 atan2 (0.31415927E1, ~0.123E2) = 2.89152503 pow (0.31415927E1, ~0.123E2) = 7.674610174E~7 atan2 (0.31415927E1, ~0.31415927E1) = 2.356194496 pow (0.31415927E1, ~0.31415927E1) = 0.02742568776 atan2 (0.31415927E1, ~0.27182817E1) = 2.284080744 pow (0.31415927E1, ~0.27182817E1) = 0.04452526942 atan2 (0.31415927E1, ~0.123E1) = 1.943972111 pow (0.31415927E1, ~0.123E1) = 0.2446276993 atan2 (0.31415927E1, ~0.123) = 1.609928489 pow (0.31415927E1, ~0.123) = 0.8686614633 atan2 (0.31415927E1, ~0.123E~2) = 1.571187854 pow (0.31415927E1, ~0.123E~2) = 0.9985929728 atan2 (0.31415927E1, ~0.11754944E~37) = 1.570796371 pow (0.31415927E1, ~0.11754944E~37) = 1 atan2 (0.31415927E1, ~0.5877472E~38) = 1.570796371 pow (0.31415927E1, ~0.5877472E~38) = 1 atan2 (0.31415927E1, ~0.1E~44) = 1.570796371 pow (0.31415927E1, ~0.1E~44) = 1 atan2 (0.31415927E1, ~0.0) = 1.570796371 pow (0.31415927E1, ~0.0) = 1 atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.31415927E1, ~inf) = 3.141592741 pow (0.31415927E1, ~inf) = 0 atan2 (0.31415927E1, nan) = nan pow (0.31415927E1, nan) = nan atan2 (0.31415927E1, inf) = 0 pow (0.31415927E1, inf) = inf atan2 (0.27182817E1, 0.34028235E39) = 7.988312091E~39 pow (0.27182817E1, 0.34028235E39) = inf atan2 (0.27182817E1, 0.17014117E39) = 1.597662558E~38 pow (0.27182817E1, 0.17014117E39) = inf atan2 (0.27182817E1, 0.123E4) = 0.002209981671 pow (0.27182817E1, 0.123E4) = inf atan2 (0.27182817E1, 0.123E2) = 0.2175025195 pow (0.27182817E1, 0.123E2) = 219695.9531 atan2 (0.27182817E1, 0.31415927E1) = 0.7132844925 pow (0.27182817E1, 0.31415927E1) = 23.14069176 atan2 (0.27182817E1, 0.27182817E1) = 0.7853981853 pow (0.27182817E1, 0.27182817E1) = 15.15425968 atan2 (0.27182817E1, 0.123E1) = 1.145872235 pow (0.27182817E1, 0.123E1) = 3.421229362 atan2 (0.27182817E1, 0.123) = 1.525578022 pow (0.27182817E1, 0.123) = 1.130884409 atan2 (0.27182817E1, 0.123E~2) = 1.570343852 pow (0.27182817E1, 0.123E~2) = 1.001230717 atan2 (0.27182817E1, 0.11754944E~37) = 1.570796371 pow (0.27182817E1, 0.11754944E~37) = 1 atan2 (0.27182817E1, 0.5877472E~38) = 1.570796371 pow (0.27182817E1, 0.5877472E~38) = 1 atan2 (0.27182817E1, 0.1E~44) = 1.570796371 pow (0.27182817E1, 0.1E~44) = 1 atan2 (0.27182817E1, 0.0) = 1.570796371 pow (0.27182817E1, 0.0) = 1 atan2 (0.27182817E1, ~0.34028235E39) = 3.141592741 pow (0.27182817E1, ~0.34028235E39) = 0 atan2 (0.27182817E1, ~0.17014117E39) = 3.141592741 pow (0.27182817E1, ~0.17014117E39) = 0 atan2 (0.27182817E1, ~0.123E4) = 3.139382601 pow (0.27182817E1, ~0.123E4) = 0 atan2 (0.27182817E1, ~0.123E2) = 2.924090147 pow (0.27182817E1, ~0.123E2) = 4.551745405E~6 atan2 (0.27182817E1, ~0.31415927E1) = 2.428308249 pow (0.27182817E1, ~0.31415927E1) = 0.04321391881 atan2 (0.27182817E1, ~0.27182817E1) = 2.356194496 pow (0.27182817E1, ~0.27182817E1) = 0.06598804891 atan2 (0.27182817E1, ~0.123E1) = 1.995720506 pow (0.27182817E1, ~0.123E1) = 0.2922925949 atan2 (0.27182817E1, ~0.123) = 1.6160146 pow (0.27182817E1, ~0.123) = 0.8842636347 atan2 (0.27182817E1, ~0.123E~2) = 1.57124877 pow (0.27182817E1, ~0.123E~2) = 0.9987707734 atan2 (0.27182817E1, ~0.11754944E~37) = 1.570796371 pow (0.27182817E1, ~0.11754944E~37) = 1 atan2 (0.27182817E1, ~0.5877472E~38) = 1.570796371 pow (0.27182817E1, ~0.5877472E~38) = 1 atan2 (0.27182817E1, ~0.1E~44) = 1.570796371 pow (0.27182817E1, ~0.1E~44) = 1 atan2 (0.27182817E1, ~0.0) = 1.570796371 pow (0.27182817E1, ~0.0) = 1 atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.27182817E1, ~inf) = 3.141592741 pow (0.27182817E1, ~inf) = 0 atan2 (0.27182817E1, nan) = nan pow (0.27182817E1, nan) = nan atan2 (0.27182817E1, inf) = 0 pow (0.27182817E1, inf) = inf atan2 (0.123E1, 0.34028235E39) = 3.614645185E~39 pow (0.123E1, 0.34028235E39) = inf atan2 (0.123E1, 0.17014117E39) = 7.22929037E~39 pow (0.123E1, 0.17014117E39) = inf atan2 (0.123E1, 0.123E4) = 9.999996983E~4 pow (0.123E1, 0.123E4) = inf atan2 (0.123E1, 0.123E2) = 0.09966865182 pow (0.123E1, 0.123E2) = 12.75947952 atan2 (0.123E1, 0.31415927E1) = 0.3731757402 pow (0.123E1, 0.31415927E1) = 1.916219592 atan2 (0.123E1, 0.27182817E1) = 0.4249241352 pow (0.123E1, 0.27182817E1) = 1.755445838 atan2 (0.123E1, 0.123E1) = 0.7853981853 pow (0.123E1, 0.123E1) = 1.289981008 atan2 (0.123E1, 0.123) = 1.471127629 pow (0.123E1, 0.123) = 1.025789738 atan2 (0.123E1, 0.123E~2) = 1.569796324 pow (0.123E1, 0.123E~2) = 1.000254631 atan2 (0.123E1, 0.11754944E~37) = 1.570796371 pow (0.123E1, 0.11754944E~37) = 1 atan2 (0.123E1, 0.5877472E~38) = 1.570796371 pow (0.123E1, 0.5877472E~38) = 1 atan2 (0.123E1, 0.1E~44) = 1.570796371 pow (0.123E1, 0.1E~44) = 1 atan2 (0.123E1, 0.0) = 1.570796371 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.34028235E39) = 3.141592741 pow (0.123E1, ~0.34028235E39) = 0 atan2 (0.123E1, ~0.17014117E39) = 3.141592741 pow (0.123E1, ~0.17014117E39) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592575 pow (0.123E1, ~0.123E4) = 0 atan2 (0.123E1, ~0.123E2) = 3.041924 pow (0.123E1, ~0.123E2) = 0.07837310433 atan2 (0.123E1, ~0.31415927E1) = 2.768416882 pow (0.123E1, ~0.31415927E1) = 0.5218608975 atan2 (0.123E1, ~0.27182817E1) = 2.716668606 pow (0.123E1, ~0.27182817E1) = 0.5696558356 atan2 (0.123E1, ~0.123E1) = 2.356194496 pow (0.123E1, ~0.123E1) = 0.7752052546 atan2 (0.123E1, ~0.123) = 1.670464993 pow (0.123E1, ~0.123) = 0.9748587012 atan2 (0.123E1, ~0.123E~2) = 1.571796298 pow (0.123E1, ~0.123E~2) = 0.9997454286 atan2 (0.123E1, ~0.11754944E~37) = 1.570796371 pow (0.123E1, ~0.11754944E~37) = 1 atan2 (0.123E1, ~0.5877472E~38) = 1.570796371 pow (0.123E1, ~0.5877472E~38) = 1 atan2 (0.123E1, ~0.1E~44) = 1.570796371 pow (0.123E1, ~0.1E~44) = 1 atan2 (0.123E1, ~0.0) = 1.570796371 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592741 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.34028235E39) = 3.614649389E~40 pow (0.123, 0.34028235E39) = 0 atan2 (0.123, 0.17014117E39) = 7.229284764E~40 pow (0.123, 0.17014117E39) = 0 atan2 (0.123, 0.123E4) = 1.000000047E~4 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666363 pow (0.123, 0.123E2) = 6.394886357E~12 atan2 (0.123, 0.31415927E1) = 0.0391321294 pow (0.123, 0.31415927E1) = 0.001383096678 atan2 (0.123, 0.27182817E1) = 0.04521832988 pow (0.123, 0.27182817E1) = 0.00335819344 atan2 (0.123, 0.123E1) = 0.09966865182 pow (0.123, 0.123E1) = 0.07595970482 atan2 (0.123, 0.123) = 0.7853981853 pow (0.123, 0.123) = 0.7727843523 atan2 (0.123, 0.123E~2) = 1.560796618 pow (0.123, 0.123E~2) = 0.9974257946 atan2 (0.123, 0.11754944E~37) = 1.570796371 pow (0.123, 0.11754944E~37) = 1 atan2 (0.123, 0.5877472E~38) = 1.570796371 pow (0.123, 0.5877472E~38) = 1 atan2 (0.123, 0.1E~44) = 1.570796371 pow (0.123, 0.1E~44) = 1 atan2 (0.123, 0.0) = 1.570796371 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.34028235E39) = 3.141592741 pow (0.123, ~0.34028235E39) = inf atan2 (0.123, ~0.17014117E39) = 3.141592741 pow (0.123, ~0.17014117E39) = inf atan2 (0.123, ~0.123E4) = 3.141492605 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592989 pow (0.123, ~0.123E2) = 156374941700 atan2 (0.123, ~0.31415927E1) = 3.102460623 pow (0.123, ~0.31415927E1) = 723.0152588 atan2 (0.123, ~0.27182817E1) = 3.096374273 pow (0.123, ~0.27182817E1) = 297.7791443 atan2 (0.123, ~0.123E1) = 3.041924 pow (0.123, ~0.123E1) = 13.16487408 atan2 (0.123, ~0.123) = 2.356194496 pow (0.123, ~0.123) = 1.294022083 atan2 (0.123, ~0.123E~2) = 1.580796003 pow (0.123, ~0.123E~2) = 1.002580881 atan2 (0.123, ~0.11754944E~37) = 1.570796371 pow (0.123, ~0.11754944E~37) = 1 atan2 (0.123, ~0.5877472E~38) = 1.570796371 pow (0.123, ~0.5877472E~38) = 1 atan2 (0.123, ~0.1E~44) = 1.570796371 pow (0.123, ~0.1E~44) = 1 atan2 (0.123, ~0.0) = 1.570796371 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592741 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.34028235E39) = 3.613948739E~42 pow (0.123E~2, 0.34028235E39) = 0 atan2 (0.123E~2, 0.17014117E39) = 7.229298777E~42 pow (0.123E~2, 0.17014117E39) = 0 atan2 (0.123E~2, 0.123E4) = 9.999999975E~7 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 1.000000047E~4 pow (0.123E~2, 0.123E2) = 1.606321748E~36 atan2 (0.123E~2, 0.31415927E1) = 3.915211419E~4 pow (0.123E~2, 0.31415927E1) = 7.205548935E~10 atan2 (0.123E~2, 0.27182817E1) = 4.524917167E~4 pow (0.123E~2, 0.27182817E1) = 1.228972657E~8 atan2 (0.123E~2, 0.123E1) = 9.999996983E~4 pow (0.123E~2, 0.123E1) = 2.633802651E~4 atan2 (0.123E~2, 0.123) = 0.009999667294 pow (0.123E~2, 0.123) = 0.4385896027 atan2 (0.123E~2, 0.123E~2) = 0.7853981853 pow (0.123E~2, 0.123E~2) = 0.9917919636 atan2 (0.123E~2, 0.11754944E~37) = 1.570796371 pow (0.123E~2, 0.11754944E~37) = 1 atan2 (0.123E~2, 0.5877472E~38) = 1.570796371 pow (0.123E~2, 0.5877472E~38) = 1 atan2 (0.123E~2, 0.1E~44) = 1.570796371 pow (0.123E~2, 0.1E~44) = 1 atan2 (0.123E~2, 0.0) = 1.570796371 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.34028235E39) = 3.141592741 pow (0.123E~2, ~0.34028235E39) = inf atan2 (0.123E~2, ~0.17014117E39) = 3.141592741 pow (0.123E~2, ~0.17014117E39) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591549 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492605 pow (0.123E~2, ~0.123E2) = 6.225402783E35 atan2 (0.123E~2, ~0.31415927E1) = 3.141201019 pow (0.123E~2, ~0.31415927E1) = 1387819264 atan2 (0.123E~2, ~0.27182817E1) = 3.141140223 pow (0.123E~2, ~0.27182817E1) = 81368776 atan2 (0.123E~2, ~0.123E1) = 3.140592575 pow (0.123E~2, ~0.123E1) = 3796.791504 atan2 (0.123E~2, ~0.123) = 3.131592989 pow (0.123E~2, ~0.123) = 2.280035973 atan2 (0.123E~2, ~0.123E~2) = 2.356194496 pow (0.123E~2, ~0.123E~2) = 1.008275986 atan2 (0.123E~2, ~0.11754944E~37) = 1.570796371 pow (0.123E~2, ~0.11754944E~37) = 1 atan2 (0.123E~2, ~0.5877472E~38) = 1.570796371 pow (0.123E~2, ~0.5877472E~38) = 1 atan2 (0.123E~2, ~0.1E~44) = 1.570796371 pow (0.123E~2, ~0.1E~44) = 1 atan2 (0.123E~2, ~0.0) = 1.570796371 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592741 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.11754944E~37, 0.34028235E39) = 0 pow (0.11754944E~37, 0.34028235E39) = 0 atan2 (0.11754944E~37, 0.17014117E39) = 0 pow (0.11754944E~37, 0.17014117E39) = 0 atan2 (0.11754944E~37, 0.123E4) = 9.556855527E~42 pow (0.11754944E~37, 0.123E4) = 0 atan2 (0.11754944E~37, 0.123E2) = 9.55686954E~40 pow (0.11754944E~37, 0.123E2) = 0 atan2 (0.11754944E~37, 0.31415927E1) = 3.74171493E~39 pow (0.11754944E~37, 0.31415927E1) = 0 atan2 (0.11754944E~37, 0.27182817E1) = 4.324402857E~39 pow (0.11754944E~37, 0.27182817E1) = 0 atan2 (0.11754944E~37, 0.123E1) = 9.556863934E~39 pow (0.11754944E~37, 0.123E1) = 0 atan2 (0.11754944E~37, 0.123) = 9.556864495E~38 pow (0.11754944E~37, 0.123) = 2.160911572E~5 atan2 (0.11754944E~37, 0.123E~2) = 9.556864495E~36 pow (0.11754944E~37, 0.123E~2) = 0.8981448412 atan2 (0.11754944E~37, 0.11754944E~37) = 0.7853981853 pow (0.11754944E~37, 0.11754944E~37) = 1 atan2 (0.11754944E~37, 0.5877472E~38) = 1.107148767 pow (0.11754944E~37, 0.5877472E~38) = 1 atan2 (0.11754944E~37, 0.1E~44) = 1.570796251 pow (0.11754944E~37, 0.1E~44) = 1 atan2 (0.11754944E~37, 0.0) = 1.570796371 pow (0.11754944E~37, 0.0) = 1 atan2 (0.11754944E~37, ~0.34028235E39) = 3.141592741 pow (0.11754944E~37, ~0.34028235E39) = inf atan2 (0.11754944E~37, ~0.17014117E39) = 3.141592741 pow (0.11754944E~37, ~0.17014117E39) = inf atan2 (0.11754944E~37, ~0.123E4) = 3.141592741 pow (0.11754944E~37, ~0.123E4) = inf atan2 (0.11754944E~37, ~0.123E2) = 3.141592741 pow (0.11754944E~37, ~0.123E2) = inf atan2 (0.11754944E~37, ~0.31415927E1) = 3.141592741 pow (0.11754944E~37, ~0.31415927E1) = inf atan2 (0.11754944E~37, ~0.27182817E1) = 3.141592741 pow (0.11754944E~37, ~0.27182817E1) = inf atan2 (0.11754944E~37, ~0.123E1) = 3.141592741 pow (0.11754944E~37, ~0.123E1) = inf atan2 (0.11754944E~37, ~0.123) = 3.141592741 pow (0.11754944E~37, ~0.123) = 46276.76562 atan2 (0.11754944E~37, ~0.123E~2) = 3.141592741 pow (0.11754944E~37, ~0.123E~2) = 1.113406181 atan2 (0.11754944E~37, ~0.11754944E~37) = 2.356194496 pow (0.11754944E~37, ~0.11754944E~37) = 1 atan2 (0.11754944E~37, ~0.5877472E~38) = 2.034443855 pow (0.11754944E~37, ~0.5877472E~38) = 1 atan2 (0.11754944E~37, ~0.1E~44) = 1.57079649 pow (0.11754944E~37, ~0.1E~44) = 1 atan2 (0.11754944E~37, ~0.0) = 1.570796371 pow (0.11754944E~37, ~0.0) = 1 atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.11754944E~37, ~inf) = 3.141592741 pow (0.11754944E~37, ~inf) = inf atan2 (0.11754944E~37, nan) = nan pow (0.11754944E~37, nan) = nan atan2 (0.11754944E~37, inf) = 0 pow (0.11754944E~37, inf) = 0 atan2 (0.5877472E~38, 0.34028235E39) = 0 pow (0.5877472E~38, 0.34028235E39) = 0 atan2 (0.5877472E~38, 0.17014117E39) = 0 pow (0.5877472E~38, 0.17014117E39) = 0 atan2 (0.5877472E~38, 0.123E4) = 4.778427763E~42 pow (0.5877472E~38, 0.123E4) = 0 atan2 (0.5877472E~38, 0.123E2) = 4.778427763E~40 pow (0.5877472E~38, 0.123E2) = 0 atan2 (0.5877472E~38, 0.31415927E1) = 1.870856764E~39 pow (0.5877472E~38, 0.31415927E1) = 0 atan2 (0.5877472E~38, 0.27182817E1) = 2.162200728E~39 pow (0.5877472E~38, 0.27182817E1) = 0 atan2 (0.5877472E~38, 0.123E1) = 4.778431967E~39 pow (0.5877472E~38, 0.123E1) = 0 atan2 (0.5877472E~38, 0.123) = 4.778432248E~38 pow (0.5877472E~38, 0.123) = 1.984313531E~5 atan2 (0.5877472E~38, 0.123E~2) = 4.778432248E~36 pow (0.5877472E~38, 0.123E~2) = 0.8973793983 atan2 (0.5877472E~38, 0.11754944E~37) = 0.463647604 pow (0.5877472E~38, 0.11754944E~37) = 1 atan2 (0.5877472E~38, 0.5877472E~38) = 0.7853981853 pow (0.5877472E~38, 0.5877472E~38) = 1 atan2 (0.5877472E~38, 0.1E~44) = 1.570796132 pow (0.5877472E~38, 0.1E~44) = 1 atan2 (0.5877472E~38, 0.0) = 1.570796371 pow (0.5877472E~38, 0.0) = 1 atan2 (0.5877472E~38, ~0.34028235E39) = 3.141592741 pow (0.5877472E~38, ~0.34028235E39) = inf atan2 (0.5877472E~38, ~0.17014117E39) = 3.141592741 pow (0.5877472E~38, ~0.17014117E39) = inf atan2 (0.5877472E~38, ~0.123E4) = 3.141592741 pow (0.5877472E~38, ~0.123E4) = inf atan2 (0.5877472E~38, ~0.123E2) = 3.141592741 pow (0.5877472E~38, ~0.123E2) = inf atan2 (0.5877472E~38, ~0.31415927E1) = 3.141592741 pow (0.5877472E~38, ~0.31415927E1) = inf atan2 (0.5877472E~38, ~0.27182817E1) = 3.141592741 pow (0.5877472E~38, ~0.27182817E1) = inf atan2 (0.5877472E~38, ~0.123E1) = 3.141592741 pow (0.5877472E~38, ~0.123E1) = inf atan2 (0.5877472E~38, ~0.123) = 3.141592741 pow (0.5877472E~38, ~0.123) = 50395.26172 atan2 (0.5877472E~38, ~0.123E~2) = 3.141592741 pow (0.5877472E~38, ~0.123E~2) = 1.114355803 atan2 (0.5877472E~38, ~0.11754944E~37) = 2.677945137 pow (0.5877472E~38, ~0.11754944E~37) = 1 atan2 (0.5877472E~38, ~0.5877472E~38) = 2.356194496 pow (0.5877472E~38, ~0.5877472E~38) = 1 atan2 (0.5877472E~38, ~0.1E~44) = 1.570796609 pow (0.5877472E~38, ~0.1E~44) = 1 atan2 (0.5877472E~38, ~0.0) = 1.570796371 pow (0.5877472E~38, ~0.0) = 1 atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.5877472E~38, ~inf) = 3.141592741 pow (0.5877472E~38, ~inf) = inf atan2 (0.5877472E~38, nan) = nan pow (0.5877472E~38, nan) = nan atan2 (0.5877472E~38, inf) = 0 pow (0.5877472E~38, inf) = 0 atan2 (0.1E~44, 0.34028235E39) = 0 pow (0.1E~44, 0.34028235E39) = 0 atan2 (0.1E~44, 0.17014117E39) = 0 pow (0.1E~44, 0.17014117E39) = 0 atan2 (0.1E~44, 0.123E4) = 0 pow (0.1E~44, 0.123E4) = 0 atan2 (0.1E~44, 0.123E2) = 0 pow (0.1E~44, 0.123E2) = 0 atan2 (0.1E~44, 0.31415927E1) = 0 pow (0.1E~44, 0.31415927E1) = 0 atan2 (0.1E~44, 0.27182817E1) = 0 pow (0.1E~44, 0.27182817E1) = 0 atan2 (0.1E~44, 0.123E1) = 1.401298464E~45 pow (0.1E~44, 0.123E1) = 0 atan2 (0.1E~44, 0.123) = 1.121038771E~44 pow (0.1E~44, 0.123) = 3.041046966E~6 atan2 (0.1E~44, 0.123E~2) = 1.139255651E~42 pow (0.1E~44, 0.123E~2) = 0.8807045221 atan2 (0.1E~44, 0.11754944E~37) = 1.192092896E~7 pow (0.1E~44, 0.11754944E~37) = 1 atan2 (0.1E~44, 0.5877472E~38) = 2.384185791E~7 pow (0.1E~44, 0.5877472E~38) = 1 atan2 (0.1E~44, 0.1E~44) = 0.7853981853 pow (0.1E~44, 0.1E~44) = 1 atan2 (0.1E~44, 0.0) = 1.570796371 pow (0.1E~44, 0.0) = 1 atan2 (0.1E~44, ~0.34028235E39) = 3.141592741 pow (0.1E~44, ~0.34028235E39) = inf atan2 (0.1E~44, ~0.17014117E39) = 3.141592741 pow (0.1E~44, ~0.17014117E39) = inf atan2 (0.1E~44, ~0.123E4) = 3.141592741 pow (0.1E~44, ~0.123E4) = inf atan2 (0.1E~44, ~0.123E2) = 3.141592741 pow (0.1E~44, ~0.123E2) = inf atan2 (0.1E~44, ~0.31415927E1) = 3.141592741 pow (0.1E~44, ~0.31415927E1) = inf atan2 (0.1E~44, ~0.27182817E1) = 3.141592741 pow (0.1E~44, ~0.27182817E1) = inf atan2 (0.1E~44, ~0.123E1) = 3.141592741 pow (0.1E~44, ~0.123E1) = inf atan2 (0.1E~44, ~0.123) = 3.141592741 pow (0.1E~44, ~0.123) = 328834.125 atan2 (0.1E~44, ~0.123E~2) = 3.141592741 pow (0.1E~44, ~0.123E~2) = 1.135454535 atan2 (0.1E~44, ~0.11754944E~37) = 3.141592503 pow (0.1E~44, ~0.11754944E~37) = 1 atan2 (0.1E~44, ~0.5877472E~38) = 3.141592503 pow (0.1E~44, ~0.5877472E~38) = 1 atan2 (0.1E~44, ~0.1E~44) = 2.356194496 pow (0.1E~44, ~0.1E~44) = 1 atan2 (0.1E~44, ~0.0) = 1.570796371 pow (0.1E~44, ~0.0) = 1 atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.1E~44, ~inf) = 3.141592741 pow (0.1E~44, ~inf) = inf atan2 (0.1E~44, nan) = nan pow (0.1E~44, nan) = nan atan2 (0.1E~44, inf) = 0 pow (0.1E~44, inf) = 0 atan2 (0.0, 0.34028235E39) = 0 pow (0.0, 0.34028235E39) = 0 atan2 (0.0, 0.17014117E39) = 0 pow (0.0, 0.17014117E39) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.31415927E1) = 0 pow (0.0, 0.31415927E1) = 0 atan2 (0.0, 0.27182817E1) = 0 pow (0.0, 0.27182817E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.11754944E~37) = 0 pow (0.0, 0.11754944E~37) = 0 atan2 (0.0, 0.5877472E~38) = 0 pow (0.0, 0.5877472E~38) = 0 atan2 (0.0, 0.1E~44) = 0 pow (0.0, 0.1E~44) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.34028235E39) = 3.141592741 pow (0.0, ~0.34028235E39) = inf atan2 (0.0, ~0.17014117E39) = 3.141592741 pow (0.0, ~0.17014117E39) = inf atan2 (0.0, ~0.123E4) = 3.141592741 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592741 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.31415927E1) = 3.141592741 pow (0.0, ~0.31415927E1) = inf atan2 (0.0, ~0.27182817E1) = 3.141592741 pow (0.0, ~0.27182817E1) = inf atan2 (0.0, ~0.123E1) = 3.141592741 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592741 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592741 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.11754944E~37) = 3.141592741 pow (0.0, ~0.11754944E~37) = inf atan2 (0.0, ~0.5877472E~38) = 3.141592741 pow (0.0, ~0.5877472E~38) = inf atan2 (0.0, ~0.1E~44) = 3.141592741 pow (0.0, ~0.1E~44) = inf atan2 (0.0, ~0.0) = 3.141592741 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592741 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.34028235E39, 0.34028235E39) = ~0.7853981853 pow (~0.34028235E39, 0.34028235E39) = inf atan2 (~0.34028235E39, 0.17014117E39) = ~1.107148767 pow (~0.34028235E39, 0.17014117E39) = inf atan2 (~0.34028235E39, 0.123E4) = ~1.570796371 pow (~0.34028235E39, 0.123E4) = inf atan2 (~0.34028235E39, 0.123E2) = ~1.570796371 pow (~0.34028235E39, 0.123E2) = nan atan2 (~0.34028235E39, 0.31415927E1) = ~1.570796371 pow (~0.34028235E39, 0.31415927E1) = nan atan2 (~0.34028235E39, 0.27182817E1) = ~1.570796371 pow (~0.34028235E39, 0.27182817E1) = nan atan2 (~0.34028235E39, 0.123E1) = ~1.570796371 pow (~0.34028235E39, 0.123E1) = nan atan2 (~0.34028235E39, 0.123) = ~1.570796371 pow (~0.34028235E39, 0.123) = nan atan2 (~0.34028235E39, 0.123E~2) = ~1.570796371 pow (~0.34028235E39, 0.123E~2) = nan atan2 (~0.34028235E39, 0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, 0.11754944E~37) = nan atan2 (~0.34028235E39, 0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, 0.5877472E~38) = nan atan2 (~0.34028235E39, 0.1E~44) = ~1.570796371 pow (~0.34028235E39, 0.1E~44) = nan atan2 (~0.34028235E39, 0.0) = ~1.570796371 pow (~0.34028235E39, 0.0) = 1 atan2 (~0.34028235E39, ~0.34028235E39) = ~2.356194496 pow (~0.34028235E39, ~0.34028235E39) = 0 atan2 (~0.34028235E39, ~0.17014117E39) = ~2.034443855 pow (~0.34028235E39, ~0.17014117E39) = 0 atan2 (~0.34028235E39, ~0.123E4) = ~1.570796371 pow (~0.34028235E39, ~0.123E4) = 0 atan2 (~0.34028235E39, ~0.123E2) = ~1.570796371 pow (~0.34028235E39, ~0.123E2) = nan atan2 (~0.34028235E39, ~0.31415927E1) = ~1.570796371 pow (~0.34028235E39, ~0.31415927E1) = nan atan2 (~0.34028235E39, ~0.27182817E1) = ~1.570796371 pow (~0.34028235E39, ~0.27182817E1) = nan atan2 (~0.34028235E39, ~0.123E1) = ~1.570796371 pow (~0.34028235E39, ~0.123E1) = nan atan2 (~0.34028235E39, ~0.123) = ~1.570796371 pow (~0.34028235E39, ~0.123) = nan atan2 (~0.34028235E39, ~0.123E~2) = ~1.570796371 pow (~0.34028235E39, ~0.123E~2) = nan atan2 (~0.34028235E39, ~0.11754944E~37) = ~1.570796371 pow (~0.34028235E39, ~0.11754944E~37) = nan atan2 (~0.34028235E39, ~0.5877472E~38) = ~1.570796371 pow (~0.34028235E39, ~0.5877472E~38) = nan atan2 (~0.34028235E39, ~0.1E~44) = ~1.570796371 pow (~0.34028235E39, ~0.1E~44) = nan atan2 (~0.34028235E39, ~0.0) = ~1.570796371 pow (~0.34028235E39, ~0.0) = 1 atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.34028235E39, ~inf) = ~3.141592741 pow (~0.34028235E39, ~inf) = 0 atan2 (~0.34028235E39, nan) = nan pow (~0.34028235E39, nan) = nan atan2 (~0.34028235E39, inf) = 0 pow (~0.34028235E39, inf) = inf atan2 (~0.17014117E39, 0.34028235E39) = ~0.463647604 pow (~0.17014117E39, 0.34028235E39) = inf atan2 (~0.17014117E39, 0.17014117E39) = ~0.7853981853 pow (~0.17014117E39, 0.17014117E39) = inf atan2 (~0.17014117E39, 0.123E4) = ~1.570796371 pow (~0.17014117E39, 0.123E4) = inf atan2 (~0.17014117E39, 0.123E2) = ~1.570796371 pow (~0.17014117E39, 0.123E2) = nan atan2 (~0.17014117E39, 0.31415927E1) = ~1.570796371 pow (~0.17014117E39, 0.31415927E1) = nan atan2 (~0.17014117E39, 0.27182817E1) = ~1.570796371 pow (~0.17014117E39, 0.27182817E1) = nan atan2 (~0.17014117E39, 0.123E1) = ~1.570796371 pow (~0.17014117E39, 0.123E1) = nan atan2 (~0.17014117E39, 0.123) = ~1.570796371 pow (~0.17014117E39, 0.123) = nan atan2 (~0.17014117E39, 0.123E~2) = ~1.570796371 pow (~0.17014117E39, 0.123E~2) = nan atan2 (~0.17014117E39, 0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, 0.11754944E~37) = nan atan2 (~0.17014117E39, 0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, 0.5877472E~38) = nan atan2 (~0.17014117E39, 0.1E~44) = ~1.570796371 pow (~0.17014117E39, 0.1E~44) = nan atan2 (~0.17014117E39, 0.0) = ~1.570796371 pow (~0.17014117E39, 0.0) = 1 atan2 (~0.17014117E39, ~0.34028235E39) = ~2.677945137 pow (~0.17014117E39, ~0.34028235E39) = 0 atan2 (~0.17014117E39, ~0.17014117E39) = ~2.356194496 pow (~0.17014117E39, ~0.17014117E39) = 0 atan2 (~0.17014117E39, ~0.123E4) = ~1.570796371 pow (~0.17014117E39, ~0.123E4) = 0 atan2 (~0.17014117E39, ~0.123E2) = ~1.570796371 pow (~0.17014117E39, ~0.123E2) = nan atan2 (~0.17014117E39, ~0.31415927E1) = ~1.570796371 pow (~0.17014117E39, ~0.31415927E1) = nan atan2 (~0.17014117E39, ~0.27182817E1) = ~1.570796371 pow (~0.17014117E39, ~0.27182817E1) = nan atan2 (~0.17014117E39, ~0.123E1) = ~1.570796371 pow (~0.17014117E39, ~0.123E1) = nan atan2 (~0.17014117E39, ~0.123) = ~1.570796371 pow (~0.17014117E39, ~0.123) = nan atan2 (~0.17014117E39, ~0.123E~2) = ~1.570796371 pow (~0.17014117E39, ~0.123E~2) = nan atan2 (~0.17014117E39, ~0.11754944E~37) = ~1.570796371 pow (~0.17014117E39, ~0.11754944E~37) = nan atan2 (~0.17014117E39, ~0.5877472E~38) = ~1.570796371 pow (~0.17014117E39, ~0.5877472E~38) = nan atan2 (~0.17014117E39, ~0.1E~44) = ~1.570796371 pow (~0.17014117E39, ~0.1E~44) = nan atan2 (~0.17014117E39, ~0.0) = ~1.570796371 pow (~0.17014117E39, ~0.0) = 1 atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.17014117E39, ~inf) = ~3.141592741 pow (~0.17014117E39, ~inf) = 0 atan2 (~0.17014117E39, nan) = nan pow (~0.17014117E39, nan) = nan atan2 (~0.17014117E39, inf) = 0 pow (~0.17014117E39, inf) = inf atan2 (~0.123E4, 0.34028235E39) = ~3.614645488E~36 pow (~0.123E4, 0.34028235E39) = inf atan2 (~0.123E4, 0.17014117E39) = ~7.229290975E~36 pow (~0.123E4, 0.17014117E39) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981853 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.560796618 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.31415927E1) = ~1.568242192 pow (~0.123E4, 0.31415927E1) = nan atan2 (~0.123E4, 0.27182817E1) = ~1.568586349 pow (~0.123E4, 0.27182817E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796324 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696354 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795298 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.11754944E~37) = ~1.570796371 pow (~0.123E4, 0.11754944E~37) = nan atan2 (~0.123E4, 0.5877472E~38) = ~1.570796371 pow (~0.123E4, 0.5877472E~38) = nan atan2 (~0.123E4, 0.1E~44) = ~1.570796371 pow (~0.123E4, 0.1E~44) = nan atan2 (~0.123E4, 0.0) = ~1.570796371 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.34028235E39) = ~3.141592741 pow (~0.123E4, ~0.34028235E39) = 0 atan2 (~0.123E4, ~0.17014117E39) = ~3.141592741 pow (~0.123E4, ~0.17014117E39) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.356194496 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580796003 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.31415927E1) = ~1.57335043 pow (~0.123E4, ~0.31415927E1) = nan atan2 (~0.123E4, ~0.27182817E1) = ~1.573006272 pow (~0.123E4, ~0.27182817E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796298 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896268 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797324 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.11754944E~37) = ~1.570796371 pow (~0.123E4, ~0.11754944E~37) = nan atan2 (~0.123E4, ~0.5877472E~38) = ~1.570796371 pow (~0.123E4, ~0.5877472E~38) = nan atan2 (~0.123E4, ~0.1E~44) = ~1.570796371 pow (~0.123E4, ~0.1E~44) = nan atan2 (~0.123E4, ~0.0) = ~1.570796371 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592741 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.34028235E39) = ~3.614645465E~38 pow (~0.123E2, 0.34028235E39) = inf atan2 (~0.123E2, 0.17014117E39) = ~7.22929093E~38 pow (~0.123E2, 0.17014117E39) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999667294 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981853 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.31415927E1) = ~1.32072866 pow (~0.123E2, 0.31415927E1) = nan atan2 (~0.123E2, 0.27182817E1) = ~1.353293777 pow (~0.123E2, 0.27182817E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127629 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.560796618 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696354 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.11754944E~37) = ~1.570796371 pow (~0.123E2, 0.11754944E~37) = nan atan2 (~0.123E2, 0.5877472E~38) = ~1.570796371 pow (~0.123E2, 0.5877472E~38) = nan atan2 (~0.123E2, 0.1E~44) = ~1.570796371 pow (~0.123E2, 0.1E~44) = nan atan2 (~0.123E2, 0.0) = ~1.570796371 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.34028235E39) = ~3.141592741 pow (~0.123E2, ~0.34028235E39) = 0 atan2 (~0.123E2, ~0.17014117E39) = ~3.141592741 pow (~0.123E2, ~0.17014117E39) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592989 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.356194496 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.31415927E1) = ~1.820864081 pow (~0.123E2, ~0.31415927E1) = nan atan2 (~0.123E2, ~0.27182817E1) = ~1.788298845 pow (~0.123E2, ~0.27182817E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464993 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580796003 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896268 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.11754944E~37) = ~1.570796371 pow (~0.123E2, ~0.11754944E~37) = nan atan2 (~0.123E2, ~0.5877472E~38) = ~1.570796371 pow (~0.123E2, ~0.5877472E~38) = nan atan2 (~0.123E2, ~0.1E~44) = ~1.570796371 pow (~0.123E2, ~0.1E~44) = nan atan2 (~0.123E2, ~0.0) = ~1.570796371 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592741 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.31415927E1, 0.34028235E39) = ~9.232312E~39 pow (~0.31415927E1, 0.34028235E39) = inf atan2 (~0.31415927E1, 0.17014117E39) = ~1.8464624E~38 pow (~0.31415927E1, 0.17014117E39) = inf atan2 (~0.31415927E1, 0.123E4) = ~0.002554134931 pow (~0.31415927E1, 0.123E4) = inf atan2 (~0.31415927E1, 0.123E2) = ~0.2500677109 pow (~0.31415927E1, 0.123E2) = nan atan2 (~0.31415927E1, 0.31415927E1) = ~0.7853981853 pow (~0.31415927E1, 0.31415927E1) = nan atan2 (~0.31415927E1, 0.27182817E1) = ~0.8575118184 pow (~0.31415927E1, 0.27182817E1) = nan atan2 (~0.31415927E1, 0.123E1) = ~1.19762063 pow (~0.31415927E1, 0.123E1) = nan atan2 (~0.31415927E1, 0.123) = ~1.531664252 pow (~0.31415927E1, 0.123) = nan atan2 (~0.31415927E1, 0.123E~2) = ~1.570404768 pow (~0.31415927E1, 0.123E~2) = nan atan2 (~0.31415927E1, 0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, 0.11754944E~37) = nan atan2 (~0.31415927E1, 0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, 0.5877472E~38) = nan atan2 (~0.31415927E1, 0.1E~44) = ~1.570796371 pow (~0.31415927E1, 0.1E~44) = nan atan2 (~0.31415927E1, 0.0) = ~1.570796371 pow (~0.31415927E1, 0.0) = 1 atan2 (~0.31415927E1, ~0.34028235E39) = ~3.141592741 pow (~0.31415927E1, ~0.34028235E39) = 0 atan2 (~0.31415927E1, ~0.17014117E39) = ~3.141592741 pow (~0.31415927E1, ~0.17014117E39) = 0 atan2 (~0.31415927E1, ~0.123E4) = ~3.139038563 pow (~0.31415927E1, ~0.123E4) = 0 atan2 (~0.31415927E1, ~0.123E2) = ~2.89152503 pow (~0.31415927E1, ~0.123E2) = nan atan2 (~0.31415927E1, ~0.31415927E1) = ~2.356194496 pow (~0.31415927E1, ~0.31415927E1) = nan atan2 (~0.31415927E1, ~0.27182817E1) = ~2.284080744 pow (~0.31415927E1, ~0.27182817E1) = nan atan2 (~0.31415927E1, ~0.123E1) = ~1.943972111 pow (~0.31415927E1, ~0.123E1) = nan atan2 (~0.31415927E1, ~0.123) = ~1.609928489 pow (~0.31415927E1, ~0.123) = nan atan2 (~0.31415927E1, ~0.123E~2) = ~1.571187854 pow (~0.31415927E1, ~0.123E~2) = nan atan2 (~0.31415927E1, ~0.11754944E~37) = ~1.570796371 pow (~0.31415927E1, ~0.11754944E~37) = nan atan2 (~0.31415927E1, ~0.5877472E~38) = ~1.570796371 pow (~0.31415927E1, ~0.5877472E~38) = nan atan2 (~0.31415927E1, ~0.1E~44) = ~1.570796371 pow (~0.31415927E1, ~0.1E~44) = nan atan2 (~0.31415927E1, ~0.0) = ~1.570796371 pow (~0.31415927E1, ~0.0) = 1 atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.31415927E1, ~inf) = ~3.141592741 pow (~0.31415927E1, ~inf) = 0 atan2 (~0.31415927E1, nan) = nan pow (~0.31415927E1, nan) = nan atan2 (~0.31415927E1, inf) = 0 pow (~0.31415927E1, inf) = inf atan2 (~0.27182817E1, 0.34028235E39) = ~7.988312091E~39 pow (~0.27182817E1, 0.34028235E39) = inf atan2 (~0.27182817E1, 0.17014117E39) = ~1.597662558E~38 pow (~0.27182817E1, 0.17014117E39) = inf atan2 (~0.27182817E1, 0.123E4) = ~0.002209981671 pow (~0.27182817E1, 0.123E4) = inf atan2 (~0.27182817E1, 0.123E2) = ~0.2175025195 pow (~0.27182817E1, 0.123E2) = nan atan2 (~0.27182817E1, 0.31415927E1) = ~0.7132844925 pow (~0.27182817E1, 0.31415927E1) = nan atan2 (~0.27182817E1, 0.27182817E1) = ~0.7853981853 pow (~0.27182817E1, 0.27182817E1) = nan atan2 (~0.27182817E1, 0.123E1) = ~1.145872235 pow (~0.27182817E1, 0.123E1) = nan atan2 (~0.27182817E1, 0.123) = ~1.525578022 pow (~0.27182817E1, 0.123) = nan atan2 (~0.27182817E1, 0.123E~2) = ~1.570343852 pow (~0.27182817E1, 0.123E~2) = nan atan2 (~0.27182817E1, 0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, 0.11754944E~37) = nan atan2 (~0.27182817E1, 0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, 0.5877472E~38) = nan atan2 (~0.27182817E1, 0.1E~44) = ~1.570796371 pow (~0.27182817E1, 0.1E~44) = nan atan2 (~0.27182817E1, 0.0) = ~1.570796371 pow (~0.27182817E1, 0.0) = 1 atan2 (~0.27182817E1, ~0.34028235E39) = ~3.141592741 pow (~0.27182817E1, ~0.34028235E39) = 0 atan2 (~0.27182817E1, ~0.17014117E39) = ~3.141592741 pow (~0.27182817E1, ~0.17014117E39) = 0 atan2 (~0.27182817E1, ~0.123E4) = ~3.139382601 pow (~0.27182817E1, ~0.123E4) = 0 atan2 (~0.27182817E1, ~0.123E2) = ~2.924090147 pow (~0.27182817E1, ~0.123E2) = nan atan2 (~0.27182817E1, ~0.31415927E1) = ~2.428308249 pow (~0.27182817E1, ~0.31415927E1) = nan atan2 (~0.27182817E1, ~0.27182817E1) = ~2.356194496 pow (~0.27182817E1, ~0.27182817E1) = nan atan2 (~0.27182817E1, ~0.123E1) = ~1.995720506 pow (~0.27182817E1, ~0.123E1) = nan atan2 (~0.27182817E1, ~0.123) = ~1.6160146 pow (~0.27182817E1, ~0.123) = nan atan2 (~0.27182817E1, ~0.123E~2) = ~1.57124877 pow (~0.27182817E1, ~0.123E~2) = nan atan2 (~0.27182817E1, ~0.11754944E~37) = ~1.570796371 pow (~0.27182817E1, ~0.11754944E~37) = nan atan2 (~0.27182817E1, ~0.5877472E~38) = ~1.570796371 pow (~0.27182817E1, ~0.5877472E~38) = nan atan2 (~0.27182817E1, ~0.1E~44) = ~1.570796371 pow (~0.27182817E1, ~0.1E~44) = nan atan2 (~0.27182817E1, ~0.0) = ~1.570796371 pow (~0.27182817E1, ~0.0) = 1 atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.27182817E1, ~inf) = ~3.141592741 pow (~0.27182817E1, ~inf) = 0 atan2 (~0.27182817E1, nan) = nan pow (~0.27182817E1, nan) = nan atan2 (~0.27182817E1, inf) = 0 pow (~0.27182817E1, inf) = inf atan2 (~0.123E1, 0.34028235E39) = ~3.614645185E~39 pow (~0.123E1, 0.34028235E39) = inf atan2 (~0.123E1, 0.17014117E39) = ~7.22929037E~39 pow (~0.123E1, 0.17014117E39) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996983E~4 pow (~0.123E1, 0.123E4) = inf atan2 (~0.123E1, 0.123E2) = ~0.09966865182 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.31415927E1) = ~0.3731757402 pow (~0.123E1, 0.31415927E1) = nan atan2 (~0.123E1, 0.27182817E1) = ~0.4249241352 pow (~0.123E1, 0.27182817E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981853 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127629 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796324 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.11754944E~37) = ~1.570796371 pow (~0.123E1, 0.11754944E~37) = nan atan2 (~0.123E1, 0.5877472E~38) = ~1.570796371 pow (~0.123E1, 0.5877472E~38) = nan atan2 (~0.123E1, 0.1E~44) = ~1.570796371 pow (~0.123E1, 0.1E~44) = nan atan2 (~0.123E1, 0.0) = ~1.570796371 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.34028235E39) = ~3.141592741 pow (~0.123E1, ~0.34028235E39) = 0 atan2 (~0.123E1, ~0.17014117E39) = ~3.141592741 pow (~0.123E1, ~0.17014117E39) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592575 pow (~0.123E1, ~0.123E4) = 0 atan2 (~0.123E1, ~0.123E2) = ~3.041924 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.31415927E1) = ~2.768416882 pow (~0.123E1, ~0.31415927E1) = nan atan2 (~0.123E1, ~0.27182817E1) = ~2.716668606 pow (~0.123E1, ~0.27182817E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.356194496 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464993 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796298 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.11754944E~37) = ~1.570796371 pow (~0.123E1, ~0.11754944E~37) = nan atan2 (~0.123E1, ~0.5877472E~38) = ~1.570796371 pow (~0.123E1, ~0.5877472E~38) = nan atan2 (~0.123E1, ~0.1E~44) = ~1.570796371 pow (~0.123E1, ~0.1E~44) = nan atan2 (~0.123E1, ~0.0) = ~1.570796371 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592741 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.34028235E39) = ~3.614649389E~40 pow (~0.123, 0.34028235E39) = 0 atan2 (~0.123, 0.17014117E39) = ~7.229284764E~40 pow (~0.123, 0.17014117E39) = 0 atan2 (~0.123, 0.123E4) = ~1.000000047E~4 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666363 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.31415927E1) = ~0.0391321294 pow (~0.123, 0.31415927E1) = nan atan2 (~0.123, 0.27182817E1) = ~0.04521832988 pow (~0.123, 0.27182817E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865182 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981853 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.560796618 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.11754944E~37) = ~1.570796371 pow (~0.123, 0.11754944E~37) = nan atan2 (~0.123, 0.5877472E~38) = ~1.570796371 pow (~0.123, 0.5877472E~38) = nan atan2 (~0.123, 0.1E~44) = ~1.570796371 pow (~0.123, 0.1E~44) = nan atan2 (~0.123, 0.0) = ~1.570796371 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.34028235E39) = ~3.141592741 pow (~0.123, ~0.34028235E39) = inf atan2 (~0.123, ~0.17014117E39) = ~3.141592741 pow (~0.123, ~0.17014117E39) = inf atan2 (~0.123, ~0.123E4) = ~3.141492605 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592989 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.31415927E1) = ~3.102460623 pow (~0.123, ~0.31415927E1) = nan atan2 (~0.123, ~0.27182817E1) = ~3.096374273 pow (~0.123, ~0.27182817E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.356194496 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580796003 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.11754944E~37) = ~1.570796371 pow (~0.123, ~0.11754944E~37) = nan atan2 (~0.123, ~0.5877472E~38) = ~1.570796371 pow (~0.123, ~0.5877472E~38) = nan atan2 (~0.123, ~0.1E~44) = ~1.570796371 pow (~0.123, ~0.1E~44) = nan atan2 (~0.123, ~0.0) = ~1.570796371 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592741 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.34028235E39) = ~3.613948739E~42 pow (~0.123E~2, 0.34028235E39) = 0 atan2 (~0.123E~2, 0.17014117E39) = ~7.229298777E~42 pow (~0.123E~2, 0.17014117E39) = 0 atan2 (~0.123E~2, 0.123E4) = ~9.999999975E~7 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~1.000000047E~4 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.31415927E1) = ~3.915211419E~4 pow (~0.123E~2, 0.31415927E1) = nan atan2 (~0.123E~2, 0.27182817E1) = ~4.524917167E~4 pow (~0.123E~2, 0.27182817E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996983E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999667294 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981853 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.11754944E~37) = ~1.570796371 pow (~0.123E~2, 0.11754944E~37) = nan atan2 (~0.123E~2, 0.5877472E~38) = ~1.570796371 pow (~0.123E~2, 0.5877472E~38) = nan atan2 (~0.123E~2, 0.1E~44) = ~1.570796371 pow (~0.123E~2, 0.1E~44) = nan atan2 (~0.123E~2, 0.0) = ~1.570796371 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.34028235E39) = ~3.141592741 pow (~0.123E~2, ~0.34028235E39) = inf atan2 (~0.123E~2, ~0.17014117E39) = ~3.141592741 pow (~0.123E~2, ~0.17014117E39) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591549 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492605 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.31415927E1) = ~3.141201019 pow (~0.123E~2, ~0.31415927E1) = nan atan2 (~0.123E~2, ~0.27182817E1) = ~3.141140223 pow (~0.123E~2, ~0.27182817E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592575 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592989 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.356194496 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.11754944E~37) = ~1.570796371 pow (~0.123E~2, ~0.11754944E~37) = nan atan2 (~0.123E~2, ~0.5877472E~38) = ~1.570796371 pow (~0.123E~2, ~0.5877472E~38) = nan atan2 (~0.123E~2, ~0.1E~44) = ~1.570796371 pow (~0.123E~2, ~0.1E~44) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796371 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592741 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.11754944E~37, 0.34028235E39) = 0 pow (~0.11754944E~37, 0.34028235E39) = 0 atan2 (~0.11754944E~37, 0.17014117E39) = 0 pow (~0.11754944E~37, 0.17014117E39) = 0 atan2 (~0.11754944E~37, 0.123E4) = ~9.556855527E~42 pow (~0.11754944E~37, 0.123E4) = 0 atan2 (~0.11754944E~37, 0.123E2) = ~9.55686954E~40 pow (~0.11754944E~37, 0.123E2) = nan atan2 (~0.11754944E~37, 0.31415927E1) = ~3.74171493E~39 pow (~0.11754944E~37, 0.31415927E1) = nan atan2 (~0.11754944E~37, 0.27182817E1) = ~4.324402857E~39 pow (~0.11754944E~37, 0.27182817E1) = nan atan2 (~0.11754944E~37, 0.123E1) = ~9.556863934E~39 pow (~0.11754944E~37, 0.123E1) = nan atan2 (~0.11754944E~37, 0.123) = ~9.556864495E~38 pow (~0.11754944E~37, 0.123) = nan atan2 (~0.11754944E~37, 0.123E~2) = ~9.556864495E~36 pow (~0.11754944E~37, 0.123E~2) = nan atan2 (~0.11754944E~37, 0.11754944E~37) = ~0.7853981853 pow (~0.11754944E~37, 0.11754944E~37) = nan atan2 (~0.11754944E~37, 0.5877472E~38) = ~1.107148767 pow (~0.11754944E~37, 0.5877472E~38) = nan atan2 (~0.11754944E~37, 0.1E~44) = ~1.570796251 pow (~0.11754944E~37, 0.1E~44) = nan atan2 (~0.11754944E~37, 0.0) = ~1.570796371 pow (~0.11754944E~37, 0.0) = 1 atan2 (~0.11754944E~37, ~0.34028235E39) = ~3.141592741 pow (~0.11754944E~37, ~0.34028235E39) = inf atan2 (~0.11754944E~37, ~0.17014117E39) = ~3.141592741 pow (~0.11754944E~37, ~0.17014117E39) = inf atan2 (~0.11754944E~37, ~0.123E4) = ~3.141592741 pow (~0.11754944E~37, ~0.123E4) = inf atan2 (~0.11754944E~37, ~0.123E2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E2) = nan atan2 (~0.11754944E~37, ~0.31415927E1) = ~3.141592741 pow (~0.11754944E~37, ~0.31415927E1) = nan atan2 (~0.11754944E~37, ~0.27182817E1) = ~3.141592741 pow (~0.11754944E~37, ~0.27182817E1) = nan atan2 (~0.11754944E~37, ~0.123E1) = ~3.141592741 pow (~0.11754944E~37, ~0.123E1) = nan atan2 (~0.11754944E~37, ~0.123) = ~3.141592741 pow (~0.11754944E~37, ~0.123) = nan atan2 (~0.11754944E~37, ~0.123E~2) = ~3.141592741 pow (~0.11754944E~37, ~0.123E~2) = nan atan2 (~0.11754944E~37, ~0.11754944E~37) = ~2.356194496 pow (~0.11754944E~37, ~0.11754944E~37) = nan atan2 (~0.11754944E~37, ~0.5877472E~38) = ~2.034443855 pow (~0.11754944E~37, ~0.5877472E~38) = nan atan2 (~0.11754944E~37, ~0.1E~44) = ~1.57079649 pow (~0.11754944E~37, ~0.1E~44) = nan atan2 (~0.11754944E~37, ~0.0) = ~1.570796371 pow (~0.11754944E~37, ~0.0) = 1 atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.11754944E~37, ~inf) = ~3.141592741 pow (~0.11754944E~37, ~inf) = inf atan2 (~0.11754944E~37, nan) = nan pow (~0.11754944E~37, nan) = nan atan2 (~0.11754944E~37, inf) = 0 pow (~0.11754944E~37, inf) = 0 atan2 (~0.5877472E~38, 0.34028235E39) = 0 pow (~0.5877472E~38, 0.34028235E39) = 0 atan2 (~0.5877472E~38, 0.17014117E39) = 0 pow (~0.5877472E~38, 0.17014117E39) = 0 atan2 (~0.5877472E~38, 0.123E4) = ~4.778427763E~42 pow (~0.5877472E~38, 0.123E4) = 0 atan2 (~0.5877472E~38, 0.123E2) = ~4.778427763E~40 pow (~0.5877472E~38, 0.123E2) = nan atan2 (~0.5877472E~38, 0.31415927E1) = ~1.870856764E~39 pow (~0.5877472E~38, 0.31415927E1) = nan atan2 (~0.5877472E~38, 0.27182817E1) = ~2.162200728E~39 pow (~0.5877472E~38, 0.27182817E1) = nan atan2 (~0.5877472E~38, 0.123E1) = ~4.778431967E~39 pow (~0.5877472E~38, 0.123E1) = nan atan2 (~0.5877472E~38, 0.123) = ~4.778432248E~38 pow (~0.5877472E~38, 0.123) = nan atan2 (~0.5877472E~38, 0.123E~2) = ~4.778432248E~36 pow (~0.5877472E~38, 0.123E~2) = nan atan2 (~0.5877472E~38, 0.11754944E~37) = ~0.463647604 pow (~0.5877472E~38, 0.11754944E~37) = nan atan2 (~0.5877472E~38, 0.5877472E~38) = ~0.7853981853 pow (~0.5877472E~38, 0.5877472E~38) = nan atan2 (~0.5877472E~38, 0.1E~44) = ~1.570796132 pow (~0.5877472E~38, 0.1E~44) = nan atan2 (~0.5877472E~38, 0.0) = ~1.570796371 pow (~0.5877472E~38, 0.0) = 1 atan2 (~0.5877472E~38, ~0.34028235E39) = ~3.141592741 pow (~0.5877472E~38, ~0.34028235E39) = inf atan2 (~0.5877472E~38, ~0.17014117E39) = ~3.141592741 pow (~0.5877472E~38, ~0.17014117E39) = inf atan2 (~0.5877472E~38, ~0.123E4) = ~3.141592741 pow (~0.5877472E~38, ~0.123E4) = inf atan2 (~0.5877472E~38, ~0.123E2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E2) = nan atan2 (~0.5877472E~38, ~0.31415927E1) = ~3.141592741 pow (~0.5877472E~38, ~0.31415927E1) = nan atan2 (~0.5877472E~38, ~0.27182817E1) = ~3.141592741 pow (~0.5877472E~38, ~0.27182817E1) = nan atan2 (~0.5877472E~38, ~0.123E1) = ~3.141592741 pow (~0.5877472E~38, ~0.123E1) = nan atan2 (~0.5877472E~38, ~0.123) = ~3.141592741 pow (~0.5877472E~38, ~0.123) = nan atan2 (~0.5877472E~38, ~0.123E~2) = ~3.141592741 pow (~0.5877472E~38, ~0.123E~2) = nan atan2 (~0.5877472E~38, ~0.11754944E~37) = ~2.677945137 pow (~0.5877472E~38, ~0.11754944E~37) = nan atan2 (~0.5877472E~38, ~0.5877472E~38) = ~2.356194496 pow (~0.5877472E~38, ~0.5877472E~38) = nan atan2 (~0.5877472E~38, ~0.1E~44) = ~1.570796609 pow (~0.5877472E~38, ~0.1E~44) = nan atan2 (~0.5877472E~38, ~0.0) = ~1.570796371 pow (~0.5877472E~38, ~0.0) = 1 atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.5877472E~38, ~inf) = ~3.141592741 pow (~0.5877472E~38, ~inf) = inf atan2 (~0.5877472E~38, nan) = nan pow (~0.5877472E~38, nan) = nan atan2 (~0.5877472E~38, inf) = 0 pow (~0.5877472E~38, inf) = 0 atan2 (~0.1E~44, 0.34028235E39) = 0 pow (~0.1E~44, 0.34028235E39) = 0 atan2 (~0.1E~44, 0.17014117E39) = 0 pow (~0.1E~44, 0.17014117E39) = 0 atan2 (~0.1E~44, 0.123E4) = 0 pow (~0.1E~44, 0.123E4) = 0 atan2 (~0.1E~44, 0.123E2) = 0 pow (~0.1E~44, 0.123E2) = nan atan2 (~0.1E~44, 0.31415927E1) = 0 pow (~0.1E~44, 0.31415927E1) = nan atan2 (~0.1E~44, 0.27182817E1) = 0 pow (~0.1E~44, 0.27182817E1) = nan atan2 (~0.1E~44, 0.123E1) = ~1.401298464E~45 pow (~0.1E~44, 0.123E1) = nan atan2 (~0.1E~44, 0.123) = ~1.121038771E~44 pow (~0.1E~44, 0.123) = nan atan2 (~0.1E~44, 0.123E~2) = ~1.139255651E~42 pow (~0.1E~44, 0.123E~2) = nan atan2 (~0.1E~44, 0.11754944E~37) = ~1.192092896E~7 pow (~0.1E~44, 0.11754944E~37) = nan atan2 (~0.1E~44, 0.5877472E~38) = ~2.384185791E~7 pow (~0.1E~44, 0.5877472E~38) = nan atan2 (~0.1E~44, 0.1E~44) = ~0.7853981853 pow (~0.1E~44, 0.1E~44) = nan atan2 (~0.1E~44, 0.0) = ~1.570796371 pow (~0.1E~44, 0.0) = 1 atan2 (~0.1E~44, ~0.34028235E39) = ~3.141592741 pow (~0.1E~44, ~0.34028235E39) = inf atan2 (~0.1E~44, ~0.17014117E39) = ~3.141592741 pow (~0.1E~44, ~0.17014117E39) = inf atan2 (~0.1E~44, ~0.123E4) = ~3.141592741 pow (~0.1E~44, ~0.123E4) = inf atan2 (~0.1E~44, ~0.123E2) = ~3.141592741 pow (~0.1E~44, ~0.123E2) = nan atan2 (~0.1E~44, ~0.31415927E1) = ~3.141592741 pow (~0.1E~44, ~0.31415927E1) = nan atan2 (~0.1E~44, ~0.27182817E1) = ~3.141592741 pow (~0.1E~44, ~0.27182817E1) = nan atan2 (~0.1E~44, ~0.123E1) = ~3.141592741 pow (~0.1E~44, ~0.123E1) = nan atan2 (~0.1E~44, ~0.123) = ~3.141592741 pow (~0.1E~44, ~0.123) = nan atan2 (~0.1E~44, ~0.123E~2) = ~3.141592741 pow (~0.1E~44, ~0.123E~2) = nan atan2 (~0.1E~44, ~0.11754944E~37) = ~3.141592503 pow (~0.1E~44, ~0.11754944E~37) = nan atan2 (~0.1E~44, ~0.5877472E~38) = ~3.141592503 pow (~0.1E~44, ~0.5877472E~38) = nan atan2 (~0.1E~44, ~0.1E~44) = ~2.356194496 pow (~0.1E~44, ~0.1E~44) = nan atan2 (~0.1E~44, ~0.0) = ~1.570796371 pow (~0.1E~44, ~0.0) = 1 atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.1E~44, ~inf) = ~3.141592741 pow (~0.1E~44, ~inf) = inf atan2 (~0.1E~44, nan) = nan pow (~0.1E~44, nan) = nan atan2 (~0.1E~44, inf) = 0 pow (~0.1E~44, inf) = 0 atan2 (~0.0, 0.34028235E39) = 0 pow (~0.0, 0.34028235E39) = 0 atan2 (~0.0, 0.17014117E39) = 0 pow (~0.0, 0.17014117E39) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.31415927E1) = 0 pow (~0.0, 0.31415927E1) = 0 atan2 (~0.0, 0.27182817E1) = 0 pow (~0.0, 0.27182817E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.11754944E~37) = 0 pow (~0.0, 0.11754944E~37) = 0 atan2 (~0.0, 0.5877472E~38) = 0 pow (~0.0, 0.5877472E~38) = 0 atan2 (~0.0, 0.1E~44) = 0 pow (~0.0, 0.1E~44) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.34028235E39) = ~3.141592741 pow (~0.0, ~0.34028235E39) = inf atan2 (~0.0, ~0.17014117E39) = ~3.141592741 pow (~0.0, ~0.17014117E39) = inf atan2 (~0.0, ~0.123E4) = ~3.141592741 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592741 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.31415927E1) = ~3.141592741 pow (~0.0, ~0.31415927E1) = inf atan2 (~0.0, ~0.27182817E1) = ~3.141592741 pow (~0.0, ~0.27182817E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592741 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592741 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592741 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.11754944E~37) = ~3.141592741 pow (~0.0, ~0.11754944E~37) = inf atan2 (~0.0, ~0.5877472E~38) = ~3.141592741 pow (~0.0, ~0.5877472E~38) = inf atan2 (~0.0, ~0.1E~44) = ~3.141592741 pow (~0.0, ~0.1E~44) = inf atan2 (~0.0, ~0.0) = ~3.141592741 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592741 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (~inf, 0.34028235E39) = ~1.570796371 pow (~inf, 0.34028235E39) = inf atan2 (~inf, 0.17014117E39) = ~1.570796371 pow (~inf, 0.17014117E39) = inf atan2 (~inf, 0.123E4) = ~1.570796371 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796371 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.31415927E1) = ~1.570796371 pow (~inf, 0.31415927E1) = inf atan2 (~inf, 0.27182817E1) = ~1.570796371 pow (~inf, 0.27182817E1) = inf atan2 (~inf, 0.123E1) = ~1.570796371 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796371 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796371 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.11754944E~37) = ~1.570796371 pow (~inf, 0.11754944E~37) = inf atan2 (~inf, 0.5877472E~38) = ~1.570796371 pow (~inf, 0.5877472E~38) = inf atan2 (~inf, 0.1E~44) = ~1.570796371 pow (~inf, 0.1E~44) = inf atan2 (~inf, 0.0) = ~1.570796371 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.34028235E39) = ~1.570796371 pow (~inf, ~0.34028235E39) = 0 atan2 (~inf, ~0.17014117E39) = ~1.570796371 pow (~inf, ~0.17014117E39) = 0 atan2 (~inf, ~0.123E4) = ~1.570796371 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796371 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.31415927E1) = ~1.570796371 pow (~inf, ~0.31415927E1) = 0 atan2 (~inf, ~0.27182817E1) = ~1.570796371 pow (~inf, ~0.27182817E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796371 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796371 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796371 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.11754944E~37) = ~1.570796371 pow (~inf, ~0.11754944E~37) = 0 atan2 (~inf, ~0.5877472E~38) = ~1.570796371 pow (~inf, ~0.5877472E~38) = 0 atan2 (~inf, ~0.1E~44) = ~1.570796371 pow (~inf, ~0.1E~44) = 0 atan2 (~inf, ~0.0) = ~1.570796371 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.356194496 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981853 pow (~inf, inf) = inf atan2 (nan, 0.34028235E39) = nan pow (nan, 0.34028235E39) = nan atan2 (nan, 0.17014117E39) = nan pow (nan, 0.17014117E39) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.31415927E1) = nan pow (nan, 0.31415927E1) = nan atan2 (nan, 0.27182817E1) = nan pow (nan, 0.27182817E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.11754944E~37) = nan pow (nan, 0.11754944E~37) = nan atan2 (nan, 0.5877472E~38) = nan pow (nan, 0.5877472E~38) = nan atan2 (nan, 0.1E~44) = nan pow (nan, 0.1E~44) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.34028235E39) = nan pow (nan, ~0.34028235E39) = nan atan2 (nan, ~0.17014117E39) = nan pow (nan, ~0.17014117E39) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.31415927E1) = nan pow (nan, ~0.31415927E1) = nan atan2 (nan, ~0.27182817E1) = nan pow (nan, ~0.27182817E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.11754944E~37) = nan pow (nan, ~0.11754944E~37) = nan atan2 (nan, ~0.5877472E~38) = nan pow (nan, ~0.5877472E~38) = nan atan2 (nan, ~0.1E~44) = nan pow (nan, ~0.1E~44) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.34028235E39) = 1.570796371 pow (inf, 0.34028235E39) = inf atan2 (inf, 0.17014117E39) = 1.570796371 pow (inf, 0.17014117E39) = inf atan2 (inf, 0.123E4) = 1.570796371 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796371 pow (inf, 0.123E2) = inf atan2 (inf, 0.31415927E1) = 1.570796371 pow (inf, 0.31415927E1) = inf atan2 (inf, 0.27182817E1) = 1.570796371 pow (inf, 0.27182817E1) = inf atan2 (inf, 0.123E1) = 1.570796371 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796371 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796371 pow (inf, 0.123E~2) = inf atan2 (inf, 0.11754944E~37) = 1.570796371 pow (inf, 0.11754944E~37) = inf atan2 (inf, 0.5877472E~38) = 1.570796371 pow (inf, 0.5877472E~38) = inf atan2 (inf, 0.1E~44) = 1.570796371 pow (inf, 0.1E~44) = inf atan2 (inf, 0.0) = 1.570796371 pow (inf, 0.0) = 1 atan2 (inf, ~0.34028235E39) = 1.570796371 pow (inf, ~0.34028235E39) = 0 atan2 (inf, ~0.17014117E39) = 1.570796371 pow (inf, ~0.17014117E39) = 0 atan2 (inf, ~0.123E4) = 1.570796371 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796371 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.31415927E1) = 1.570796371 pow (inf, ~0.31415927E1) = 0 atan2 (inf, ~0.27182817E1) = 1.570796371 pow (inf, ~0.27182817E1) = 0 atan2 (inf, ~0.123E1) = 1.570796371 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796371 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796371 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.11754944E~37) = 1.570796371 pow (inf, ~0.11754944E~37) = 0 atan2 (inf, ~0.5877472E~38) = 1.570796371 pow (inf, ~0.5877472E~38) = 0 atan2 (inf, ~0.1E~44) = 1.570796371 pow (inf, ~0.1E~44) = 0 atan2 (inf, ~0.0) = 1.570796371 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.356194496 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981853 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.34028235E39, 0.34028235E39, 0.34028235E39): inf inf (0.34028235E39, 0.34028235E39, 0.17014117E39): inf inf (0.34028235E39, 0.34028235E39, 0.123E4): inf inf (0.34028235E39, 0.34028235E39, 0.123E2): inf inf (0.34028235E39, 0.34028235E39, 0.31415927E1): inf inf (0.34028235E39, 0.34028235E39, 0.27182817E1): inf inf (0.34028235E39, 0.34028235E39, 0.123E1): inf inf (0.34028235E39, 0.34028235E39, 0.123): inf inf (0.34028235E39, 0.34028235E39, 0.123E~2): inf inf (0.34028235E39, 0.34028235E39, 0.11754944E~37): inf inf (0.34028235E39, 0.34028235E39, 0.5877472E~38): inf inf (0.34028235E39, 0.34028235E39, 0.1E~44): inf inf (0.34028235E39, 0.34028235E39, 0.0): inf inf (0.34028235E39, 0.34028235E39, ~0.34028235E39): inf inf (0.34028235E39, 0.34028235E39, ~0.17014117E39): inf inf (0.34028235E39, 0.34028235E39, ~0.123E4): inf inf (0.34028235E39, 0.34028235E39, ~0.123E2): inf inf (0.34028235E39, 0.34028235E39, ~0.31415927E1): inf inf (0.34028235E39, 0.34028235E39, ~0.27182817E1): inf inf (0.34028235E39, 0.34028235E39, ~0.123E1): inf inf (0.34028235E39, 0.34028235E39, ~0.123): inf inf (0.34028235E39, 0.34028235E39, ~0.123E~2): inf inf (0.34028235E39, 0.34028235E39, ~0.11754944E~37): inf inf (0.34028235E39, 0.34028235E39, ~0.5877472E~38): inf inf (0.34028235E39, 0.34028235E39, ~0.1E~44): inf inf (0.34028235E39, 0.34028235E39, ~0.0): inf inf (0.34028235E39, 0.17014117E39, 0.34028235E39): inf inf (0.34028235E39, 0.17014117E39, 0.17014117E39): inf inf (0.34028235E39, 0.17014117E39, 0.123E4): inf inf (0.34028235E39, 0.17014117E39, 0.123E2): inf inf (0.34028235E39, 0.17014117E39, 0.31415927E1): inf inf (0.34028235E39, 0.17014117E39, 0.27182817E1): inf inf (0.34028235E39, 0.17014117E39, 0.123E1): inf inf (0.34028235E39, 0.17014117E39, 0.123): inf inf (0.34028235E39, 0.17014117E39, 0.123E~2): inf inf (0.34028235E39, 0.17014117E39, 0.11754944E~37): inf inf (0.34028235E39, 0.17014117E39, 0.5877472E~38): inf inf (0.34028235E39, 0.17014117E39, 0.1E~44): inf inf (0.34028235E39, 0.17014117E39, 0.0): inf inf (0.34028235E39, 0.17014117E39, ~0.34028235E39): inf inf (0.34028235E39, 0.17014117E39, ~0.17014117E39): inf inf (0.34028235E39, 0.17014117E39, ~0.123E4): inf inf (0.34028235E39, 0.17014117E39, ~0.123E2): inf inf (0.34028235E39, 0.17014117E39, ~0.31415927E1): inf inf (0.34028235E39, 0.17014117E39, ~0.27182817E1): inf inf (0.34028235E39, 0.17014117E39, ~0.123E1): inf inf (0.34028235E39, 0.17014117E39, ~0.123): inf inf (0.34028235E39, 0.17014117E39, ~0.123E~2): inf inf (0.34028235E39, 0.17014117E39, ~0.11754944E~37): inf inf (0.34028235E39, 0.17014117E39, ~0.5877472E~38): inf inf (0.34028235E39, 0.17014117E39, ~0.1E~44): inf inf (0.34028235E39, 0.17014117E39, ~0.0): inf inf (0.34028235E39, 0.123E4, 0.34028235E39): inf inf (0.34028235E39, 0.123E4, 0.17014117E39): inf inf (0.34028235E39, 0.123E4, 0.123E4): inf inf (0.34028235E39, 0.123E4, 0.123E2): inf inf (0.34028235E39, 0.123E4, 0.31415927E1): inf inf (0.34028235E39, 0.123E4, 0.27182817E1): inf inf (0.34028235E39, 0.123E4, 0.123E1): inf inf (0.34028235E39, 0.123E4, 0.123): inf inf (0.34028235E39, 0.123E4, 0.123E~2): inf inf (0.34028235E39, 0.123E4, 0.11754944E~37): inf inf (0.34028235E39, 0.123E4, 0.5877472E~38): inf inf (0.34028235E39, 0.123E4, 0.1E~44): inf inf (0.34028235E39, 0.123E4, 0.0): inf inf (0.34028235E39, 0.123E4, ~0.34028235E39): inf inf (0.34028235E39, 0.123E4, ~0.17014117E39): inf inf (0.34028235E39, 0.123E4, ~0.123E4): inf inf (0.34028235E39, 0.123E4, ~0.123E2): inf inf (0.34028235E39, 0.123E4, ~0.31415927E1): inf inf (0.34028235E39, 0.123E4, ~0.27182817E1): inf inf (0.34028235E39, 0.123E4, ~0.123E1): inf inf (0.34028235E39, 0.123E4, ~0.123): inf inf (0.34028235E39, 0.123E4, ~0.123E~2): inf inf (0.34028235E39, 0.123E4, ~0.11754944E~37): inf inf (0.34028235E39, 0.123E4, ~0.5877472E~38): inf inf (0.34028235E39, 0.123E4, ~0.1E~44): inf inf (0.34028235E39, 0.123E4, ~0.0): inf inf (0.34028235E39, 0.123E2, 0.34028235E39): inf inf (0.34028235E39, 0.123E2, 0.17014117E39): inf inf (0.34028235E39, 0.123E2, 0.123E4): inf inf (0.34028235E39, 0.123E2, 0.123E2): inf inf (0.34028235E39, 0.123E2, 0.31415927E1): inf inf (0.34028235E39, 0.123E2, 0.27182817E1): inf inf (0.34028235E39, 0.123E2, 0.123E1): inf inf (0.34028235E39, 0.123E2, 0.123): inf inf (0.34028235E39, 0.123E2, 0.123E~2): inf inf (0.34028235E39, 0.123E2, 0.11754944E~37): inf inf (0.34028235E39, 0.123E2, 0.5877472E~38): inf inf (0.34028235E39, 0.123E2, 0.1E~44): inf inf (0.34028235E39, 0.123E2, 0.0): inf inf (0.34028235E39, 0.123E2, ~0.34028235E39): inf inf (0.34028235E39, 0.123E2, ~0.17014117E39): inf inf (0.34028235E39, 0.123E2, ~0.123E4): inf inf (0.34028235E39, 0.123E2, ~0.123E2): inf inf (0.34028235E39, 0.123E2, ~0.31415927E1): inf inf (0.34028235E39, 0.123E2, ~0.27182817E1): inf inf (0.34028235E39, 0.123E2, ~0.123E1): inf inf (0.34028235E39, 0.123E2, ~0.123): inf inf (0.34028235E39, 0.123E2, ~0.123E~2): inf inf (0.34028235E39, 0.123E2, ~0.11754944E~37): inf inf (0.34028235E39, 0.123E2, ~0.5877472E~38): inf inf (0.34028235E39, 0.123E2, ~0.1E~44): inf inf (0.34028235E39, 0.123E2, ~0.0): inf inf (0.34028235E39, 0.31415927E1, 0.34028235E39): inf inf (0.34028235E39, 0.31415927E1, 0.17014117E39): inf inf (0.34028235E39, 0.31415927E1, 0.123E4): inf inf (0.34028235E39, 0.31415927E1, 0.123E2): inf inf (0.34028235E39, 0.31415927E1, 0.31415927E1): inf inf (0.34028235E39, 0.31415927E1, 0.27182817E1): inf inf (0.34028235E39, 0.31415927E1, 0.123E1): inf inf (0.34028235E39, 0.31415927E1, 0.123): inf inf (0.34028235E39, 0.31415927E1, 0.123E~2): inf inf (0.34028235E39, 0.31415927E1, 0.11754944E~37): inf inf (0.34028235E39, 0.31415927E1, 0.5877472E~38): inf inf (0.34028235E39, 0.31415927E1, 0.1E~44): inf inf (0.34028235E39, 0.31415927E1, 0.0): inf inf (0.34028235E39, 0.31415927E1, ~0.34028235E39): inf inf (0.34028235E39, 0.31415927E1, ~0.17014117E39): inf inf (0.34028235E39, 0.31415927E1, ~0.123E4): inf inf (0.34028235E39, 0.31415927E1, ~0.123E2): inf inf (0.34028235E39, 0.31415927E1, ~0.31415927E1): inf inf (0.34028235E39, 0.31415927E1, ~0.27182817E1): inf inf (0.34028235E39, 0.31415927E1, ~0.123E1): inf inf (0.34028235E39, 0.31415927E1, ~0.123): inf inf (0.34028235E39, 0.31415927E1, ~0.123E~2): inf inf (0.34028235E39, 0.31415927E1, ~0.11754944E~37): inf inf (0.34028235E39, 0.31415927E1, ~0.5877472E~38): inf inf (0.34028235E39, 0.31415927E1, ~0.1E~44): inf inf (0.34028235E39, 0.31415927E1, ~0.0): inf inf (0.34028235E39, 0.27182817E1, 0.34028235E39): inf inf (0.34028235E39, 0.27182817E1, 0.17014117E39): inf inf (0.34028235E39, 0.27182817E1, 0.123E4): inf inf (0.34028235E39, 0.27182817E1, 0.123E2): inf inf (0.34028235E39, 0.27182817E1, 0.31415927E1): inf inf (0.34028235E39, 0.27182817E1, 0.27182817E1): inf inf (0.34028235E39, 0.27182817E1, 0.123E1): inf inf (0.34028235E39, 0.27182817E1, 0.123): inf inf (0.34028235E39, 0.27182817E1, 0.123E~2): inf inf (0.34028235E39, 0.27182817E1, 0.11754944E~37): inf inf (0.34028235E39, 0.27182817E1, 0.5877472E~38): inf inf (0.34028235E39, 0.27182817E1, 0.1E~44): inf inf (0.34028235E39, 0.27182817E1, 0.0): inf inf (0.34028235E39, 0.27182817E1, ~0.34028235E39): inf inf (0.34028235E39, 0.27182817E1, ~0.17014117E39): inf inf (0.34028235E39, 0.27182817E1, ~0.123E4): inf inf (0.34028235E39, 0.27182817E1, ~0.123E2): inf inf (0.34028235E39, 0.27182817E1, ~0.31415927E1): inf inf (0.34028235E39, 0.27182817E1, ~0.27182817E1): inf inf (0.34028235E39, 0.27182817E1, ~0.123E1): inf inf (0.34028235E39, 0.27182817E1, ~0.123): inf inf (0.34028235E39, 0.27182817E1, ~0.123E~2): inf inf (0.34028235E39, 0.27182817E1, ~0.11754944E~37): inf inf (0.34028235E39, 0.27182817E1, ~0.5877472E~38): inf inf (0.34028235E39, 0.27182817E1, ~0.1E~44): inf inf (0.34028235E39, 0.27182817E1, ~0.0): inf inf (0.34028235E39, 0.123E1, 0.34028235E39): inf inf (0.34028235E39, 0.123E1, 0.17014117E39): inf inf (0.34028235E39, 0.123E1, 0.123E4): inf inf (0.34028235E39, 0.123E1, 0.123E2): inf inf (0.34028235E39, 0.123E1, 0.31415927E1): inf inf (0.34028235E39, 0.123E1, 0.27182817E1): inf inf (0.34028235E39, 0.123E1, 0.123E1): inf inf (0.34028235E39, 0.123E1, 0.123): inf inf (0.34028235E39, 0.123E1, 0.123E~2): inf inf (0.34028235E39, 0.123E1, 0.11754944E~37): inf inf (0.34028235E39, 0.123E1, 0.5877472E~38): inf inf (0.34028235E39, 0.123E1, 0.1E~44): inf inf (0.34028235E39, 0.123E1, 0.0): inf inf (0.34028235E39, 0.123E1, ~0.34028235E39): 0.78264946E38 0.78264946E38 (0.34028235E39, 0.123E1, ~0.17014117E39): 0.24840611E39 0.24840611E39 (0.34028235E39, 0.123E1, ~0.123E4): inf inf (0.34028235E39, 0.123E1, ~0.123E2): inf inf (0.34028235E39, 0.123E1, ~0.31415927E1): inf inf (0.34028235E39, 0.123E1, ~0.27182817E1): inf inf (0.34028235E39, 0.123E1, ~0.123E1): inf inf (0.34028235E39, 0.123E1, ~0.123): inf inf (0.34028235E39, 0.123E1, ~0.123E~2): inf inf (0.34028235E39, 0.123E1, ~0.11754944E~37): inf inf (0.34028235E39, 0.123E1, ~0.5877472E~38): inf inf (0.34028235E39, 0.123E1, ~0.1E~44): inf inf (0.34028235E39, 0.123E1, ~0.0): inf inf (0.34028235E39, 0.123, 0.34028235E39): inf inf (0.34028235E39, 0.123, 0.17014117E39): 0.2119959E39 0.2119959E39 (0.34028235E39, 0.123, 0.123E4): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.123E2): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.31415927E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.27182817E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.123E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.123): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.123E~2): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.11754944E~37): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.5877472E~38): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.1E~44): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, 0.0): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.34028235E39): ~0.2984276E39 ~0.2984276E39 (0.34028235E39, 0.123, ~0.17014117E39): ~0.12828644E39 ~0.12828644E39 (0.34028235E39, 0.123, ~0.123E4): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.123E2): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.31415927E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.27182817E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.123E1): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.123): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.123E~2): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.11754944E~37): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.5877472E~38): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.1E~44): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123, ~0.0): 0.4185473E38 0.4185473E38 (0.34028235E39, 0.123E~2, 0.34028235E39): inf inf (0.34028235E39, 0.123E~2, 0.17014117E39): 0.17055971E39 0.17055971E39 (0.34028235E39, 0.123E~2, 0.123E4): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.123E2): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.31415927E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.27182817E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.123E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.123): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.123E~2): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.11754944E~37): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.5877472E~38): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.1E~44): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, 0.0): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.34028235E39): ~0.3398638E39 ~0.3398638E39 (0.34028235E39, 0.123E~2, ~0.17014117E39): ~0.16972263E39 ~0.16972263E39 (0.34028235E39, 0.123E~2, ~0.123E4): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.123E2): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.31415927E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.27182817E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.123E1): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.123): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.123E~2): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.11754944E~37): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.5877472E~38): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.1E~44): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.123E~2, ~0.0): 0.4185473E36 0.4185473E36 (0.34028235E39, 0.11754944E~37, 0.123E4): 0.1234E4 0.1234E4 (0.34028235E39, 0.11754944E~37, 0.123E2): 0.163E2 0.163E2 (0.34028235E39, 0.11754944E~37, 0.27182817E1): 0.67182817E1 0.67182817E1 (0.34028235E39, 0.11754944E~37, 0.123E1): 0.52299995E1 0.52299995E1 (0.34028235E39, 0.11754944E~37, 0.123): 0.41229997E1 0.41229997E1 (0.34028235E39, 0.11754944E~37, 0.123E~2): 0.400123E1 0.400123E1 (0.34028235E39, 0.11754944E~37, ~0.123E4): ~0.1226E4 ~0.1226E4 (0.34028235E39, 0.11754944E~37, ~0.123E2): ~0.83E1 ~0.83E1 (0.34028235E39, 0.11754944E~37, ~0.123): 0.38769999E1 0.38769999E1 (0.34028235E39, 0.11754944E~37, ~0.123E~2): 0.39987698E1 0.39987698E1 (0.34028235E39, 0.5877472E~38, 0.123E4): 0.1232E4 0.1232E4 (0.34028235E39, 0.5877472E~38, 0.123E2): 0.143E2 0.143E2 (0.34028235E39, 0.5877472E~38, 0.31415927E1): 0.51415925E1 0.51415925E1 (0.34028235E39, 0.5877472E~38, 0.27182817E1): 0.47182817E1 0.47182817E1 (0.34028235E39, 0.5877472E~38, 0.123E1): 0.323E1 0.323E1 (0.34028235E39, 0.5877472E~38, 0.123): 0.2123E1 0.2123E1 (0.34028235E39, 0.5877472E~38, 0.123E~2): 0.20012298E1 0.20012298E1 (0.34028235E39, 0.5877472E~38, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.34028235E39, 0.5877472E~38, ~0.123E2): ~0.103E2 ~0.103E2 (0.34028235E39, 0.5877472E~38, ~0.123): 0.18769999E1 0.18769999E1 (0.34028235E39, 0.5877472E~38, ~0.123E~2): 0.19987699E1 0.19987699E1 (0.34028235E39, 0.1E~44, 0.123E4): 0.123E4 0.123E4 (0.34028235E39, 0.1E~44, 0.123E2): 0.123E2 0.123E2 (0.34028235E39, 0.1E~44, 0.31415927E1): 0.31415932E1 0.31415932E1 (0.34028235E39, 0.1E~44, 0.27182817E1): 0.27182822E1 0.27182822E1 (0.34028235E39, 0.1E~44, 0.123E1): 0.12300005E1 0.12300005E1 (0.34028235E39, 0.1E~44, 0.123): 0.12300048 0.12300048 (0.34028235E39, 0.1E~44, 0.123E~2): 0.12304769E~2 0.12304769E~2 (0.34028235E39, 0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (0.34028235E39, 0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (0.34028235E39, 0.1E~44, ~0.31415927E1): ~0.31415923E1 ~0.31415923E1 (0.34028235E39, 0.1E~44, ~0.27182817E1): ~0.27182813E1 ~0.27182813E1 (0.34028235E39, 0.1E~44, ~0.123E1): ~0.12299995E1 ~0.12299995E1 (0.34028235E39, 0.1E~44, ~0.123): ~0.12299953 ~0.12299953 (0.34028235E39, 0.1E~44, ~0.123E~2): ~0.12295232E~2 ~0.12295232E~2 (0.34028235E39, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.123E4): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.123E2): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.123E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.123): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.34028235E39, 0.0): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.123): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.34028235E39, ~0.0): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.123E4): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.123E2): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.123E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.123): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.17014117E39, 0.0): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.123): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.17014117E39, ~0.0): ~inf ~inf (0.34028235E39, ~0.123E4, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E4, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.123E4, 0.123E4): ~inf ~inf (0.34028235E39, ~0.123E4, 0.123E2): ~inf ~inf (0.34028235E39, ~0.123E4, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E4, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E4, 0.123E1): ~inf ~inf (0.34028235E39, ~0.123E4, 0.123): ~inf ~inf (0.34028235E39, ~0.123E4, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E4, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E4, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E4, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E4, 0.0): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.123): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E4, ~0.0): ~inf ~inf (0.34028235E39, ~0.123E2, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E2, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.123E2, 0.123E4): ~inf ~inf (0.34028235E39, ~0.123E2, 0.123E2): ~inf ~inf (0.34028235E39, ~0.123E2, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E2, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E2, 0.123E1): ~inf ~inf (0.34028235E39, ~0.123E2, 0.123): ~inf ~inf (0.34028235E39, ~0.123E2, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E2, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E2, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E2, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E2, 0.0): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.123): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E2, ~0.0): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.123E4): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.123E2): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.123E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.123): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.31415927E1, 0.0): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.123): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.31415927E1, ~0.0): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.34028235E39): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.17014117E39): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.123E4): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.123E2): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.123E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.123): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.27182817E1, 0.0): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.123): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.27182817E1, ~0.0): ~inf ~inf (0.34028235E39, ~0.123E1, 0.34028235E39): ~0.78264946E38 ~0.78264946E38 (0.34028235E39, ~0.123E1, 0.17014117E39): ~0.24840611E39 ~0.24840611E39 (0.34028235E39, ~0.123E1, 0.123E4): ~inf ~inf (0.34028235E39, ~0.123E1, 0.123E2): ~inf ~inf (0.34028235E39, ~0.123E1, 0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E1, 0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E1, 0.123E1): ~inf ~inf (0.34028235E39, ~0.123E1, 0.123): ~inf ~inf (0.34028235E39, ~0.123E1, 0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E1, 0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E1, 0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E1, 0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E1, 0.0): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.17014117E39): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.123E4): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.123E2): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.31415927E1): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.27182817E1): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.123E1): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.123): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.123E~2): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.11754944E~37): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.5877472E~38): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.1E~44): ~inf ~inf (0.34028235E39, ~0.123E1, ~0.0): ~inf ~inf (0.34028235E39, ~0.123, 0.34028235E39): 0.2984276E39 0.2984276E39 (0.34028235E39, ~0.123, 0.17014117E39): 0.12828644E39 0.12828644E39 (0.34028235E39, ~0.123, 0.123E4): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.123E2): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.31415927E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.27182817E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.123E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.123): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.123E~2): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.1E~44): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, 0.0): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123, ~0.17014117E39): ~0.2119959E39 ~0.2119959E39 (0.34028235E39, ~0.123, ~0.123E4): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.123E2): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.31415927E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.27182817E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.123E1): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.123): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.123E~2): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.1E~44): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123, ~0.0): ~0.4185473E38 ~0.4185473E38 (0.34028235E39, ~0.123E~2, 0.34028235E39): 0.3398638E39 0.3398638E39 (0.34028235E39, ~0.123E~2, 0.17014117E39): 0.16972263E39 0.16972263E39 (0.34028235E39, ~0.123E~2, 0.123E4): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.123E2): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.31415927E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.27182817E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.123E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.123): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.123E~2): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.1E~44): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, 0.0): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.34028235E39): ~inf ~inf (0.34028235E39, ~0.123E~2, ~0.17014117E39): ~0.17055971E39 ~0.17055971E39 (0.34028235E39, ~0.123E~2, ~0.123E4): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.123E2): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.31415927E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.27182817E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.123E1): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.123): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.123E~2): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.1E~44): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.123E~2, ~0.0): ~0.4185473E36 ~0.4185473E36 (0.34028235E39, ~0.11754944E~37, 0.123E4): 0.1226E4 0.1226E4 (0.34028235E39, ~0.11754944E~37, 0.123E2): 0.83E1 0.83E1 (0.34028235E39, ~0.11754944E~37, 0.123): ~0.38769999E1 ~0.38769999E1 (0.34028235E39, ~0.11754944E~37, 0.123E~2): ~0.39987698E1 ~0.39987698E1 (0.34028235E39, ~0.11754944E~37, ~0.123E4): ~0.1234E4 ~0.1234E4 (0.34028235E39, ~0.11754944E~37, ~0.123E2): ~0.163E2 ~0.163E2 (0.34028235E39, ~0.11754944E~37, ~0.27182817E1): ~0.67182817E1 ~0.67182817E1 (0.34028235E39, ~0.11754944E~37, ~0.123E1): ~0.52299995E1 ~0.52299995E1 (0.34028235E39, ~0.11754944E~37, ~0.123): ~0.41229997E1 ~0.41229997E1 (0.34028235E39, ~0.11754944E~37, ~0.123E~2): ~0.400123E1 ~0.400123E1 (0.34028235E39, ~0.5877472E~38, 0.123E4): 0.1228E4 0.1228E4 (0.34028235E39, ~0.5877472E~38, 0.123E2): 0.103E2 0.103E2 (0.34028235E39, ~0.5877472E~38, 0.123): ~0.18769999E1 ~0.18769999E1 (0.34028235E39, ~0.5877472E~38, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (0.34028235E39, ~0.5877472E~38, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.34028235E39, ~0.5877472E~38, ~0.123E2): ~0.143E2 ~0.143E2 (0.34028235E39, ~0.5877472E~38, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (0.34028235E39, ~0.5877472E~38, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (0.34028235E39, ~0.5877472E~38, ~0.123E1): ~0.323E1 ~0.323E1 (0.34028235E39, ~0.5877472E~38, ~0.123): ~0.2123E1 ~0.2123E1 (0.34028235E39, ~0.5877472E~38, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (0.34028235E39, ~0.1E~44, 0.123E4): 0.123E4 0.123E4 (0.34028235E39, ~0.1E~44, 0.123E2): 0.123E2 0.123E2 (0.34028235E39, ~0.1E~44, 0.31415927E1): 0.31415923E1 0.31415923E1 (0.34028235E39, ~0.1E~44, 0.27182817E1): 0.27182813E1 0.27182813E1 (0.34028235E39, ~0.1E~44, 0.123E1): 0.12299995E1 0.12299995E1 (0.34028235E39, ~0.1E~44, 0.123): 0.12299953 0.12299953 (0.34028235E39, ~0.1E~44, 0.123E~2): 0.12295232E~2 0.12295232E~2 (0.34028235E39, ~0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (0.34028235E39, ~0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (0.34028235E39, ~0.1E~44, ~0.31415927E1): ~0.31415932E1 ~0.31415932E1 (0.34028235E39, ~0.1E~44, ~0.27182817E1): ~0.27182822E1 ~0.27182822E1 (0.34028235E39, ~0.1E~44, ~0.123E1): ~0.12300005E1 ~0.12300005E1 (0.34028235E39, ~0.1E~44, ~0.123): ~0.12300048 ~0.12300048 (0.34028235E39, ~0.1E~44, ~0.123E~2): ~0.12304769E~2 ~0.12304769E~2 (0.17014117E39, 0.34028235E39, 0.34028235E39): inf inf (0.17014117E39, 0.34028235E39, 0.17014117E39): inf inf (0.17014117E39, 0.34028235E39, 0.123E4): inf inf (0.17014117E39, 0.34028235E39, 0.123E2): inf inf (0.17014117E39, 0.34028235E39, 0.31415927E1): inf inf (0.17014117E39, 0.34028235E39, 0.27182817E1): inf inf (0.17014117E39, 0.34028235E39, 0.123E1): inf inf (0.17014117E39, 0.34028235E39, 0.123): inf inf (0.17014117E39, 0.34028235E39, 0.123E~2): inf inf (0.17014117E39, 0.34028235E39, 0.11754944E~37): inf inf (0.17014117E39, 0.34028235E39, 0.5877472E~38): inf inf (0.17014117E39, 0.34028235E39, 0.1E~44): inf inf (0.17014117E39, 0.34028235E39, 0.0): inf inf (0.17014117E39, 0.34028235E39, ~0.34028235E39): inf inf (0.17014117E39, 0.34028235E39, ~0.17014117E39): inf inf (0.17014117E39, 0.34028235E39, ~0.123E4): inf inf (0.17014117E39, 0.34028235E39, ~0.123E2): inf inf (0.17014117E39, 0.34028235E39, ~0.31415927E1): inf inf (0.17014117E39, 0.34028235E39, ~0.27182817E1): inf inf (0.17014117E39, 0.34028235E39, ~0.123E1): inf inf (0.17014117E39, 0.34028235E39, ~0.123): inf inf (0.17014117E39, 0.34028235E39, ~0.123E~2): inf inf (0.17014117E39, 0.34028235E39, ~0.11754944E~37): inf inf (0.17014117E39, 0.34028235E39, ~0.5877472E~38): inf inf (0.17014117E39, 0.34028235E39, ~0.1E~44): inf inf (0.17014117E39, 0.34028235E39, ~0.0): inf inf (0.17014117E39, 0.17014117E39, 0.34028235E39): inf inf (0.17014117E39, 0.17014117E39, 0.17014117E39): inf inf (0.17014117E39, 0.17014117E39, 0.123E4): inf inf (0.17014117E39, 0.17014117E39, 0.123E2): inf inf (0.17014117E39, 0.17014117E39, 0.31415927E1): inf inf (0.17014117E39, 0.17014117E39, 0.27182817E1): inf inf (0.17014117E39, 0.17014117E39, 0.123E1): inf inf (0.17014117E39, 0.17014117E39, 0.123): inf inf (0.17014117E39, 0.17014117E39, 0.123E~2): inf inf (0.17014117E39, 0.17014117E39, 0.11754944E~37): inf inf (0.17014117E39, 0.17014117E39, 0.5877472E~38): inf inf (0.17014117E39, 0.17014117E39, 0.1E~44): inf inf (0.17014117E39, 0.17014117E39, 0.0): inf inf (0.17014117E39, 0.17014117E39, ~0.34028235E39): inf inf (0.17014117E39, 0.17014117E39, ~0.17014117E39): inf inf (0.17014117E39, 0.17014117E39, ~0.123E4): inf inf (0.17014117E39, 0.17014117E39, ~0.123E2): inf inf (0.17014117E39, 0.17014117E39, ~0.31415927E1): inf inf (0.17014117E39, 0.17014117E39, ~0.27182817E1): inf inf (0.17014117E39, 0.17014117E39, ~0.123E1): inf inf (0.17014117E39, 0.17014117E39, ~0.123): inf inf (0.17014117E39, 0.17014117E39, ~0.123E~2): inf inf (0.17014117E39, 0.17014117E39, ~0.11754944E~37): inf inf (0.17014117E39, 0.17014117E39, ~0.5877472E~38): inf inf (0.17014117E39, 0.17014117E39, ~0.1E~44): inf inf (0.17014117E39, 0.17014117E39, ~0.0): inf inf (0.17014117E39, 0.123E4, 0.34028235E39): inf inf (0.17014117E39, 0.123E4, 0.17014117E39): inf inf (0.17014117E39, 0.123E4, 0.123E4): inf inf (0.17014117E39, 0.123E4, 0.123E2): inf inf (0.17014117E39, 0.123E4, 0.31415927E1): inf inf (0.17014117E39, 0.123E4, 0.27182817E1): inf inf (0.17014117E39, 0.123E4, 0.123E1): inf inf (0.17014117E39, 0.123E4, 0.123): inf inf (0.17014117E39, 0.123E4, 0.123E~2): inf inf (0.17014117E39, 0.123E4, 0.11754944E~37): inf inf (0.17014117E39, 0.123E4, 0.5877472E~38): inf inf (0.17014117E39, 0.123E4, 0.1E~44): inf inf (0.17014117E39, 0.123E4, 0.0): inf inf (0.17014117E39, 0.123E4, ~0.34028235E39): inf inf (0.17014117E39, 0.123E4, ~0.17014117E39): inf inf (0.17014117E39, 0.123E4, ~0.123E4): inf inf (0.17014117E39, 0.123E4, ~0.123E2): inf inf (0.17014117E39, 0.123E4, ~0.31415927E1): inf inf (0.17014117E39, 0.123E4, ~0.27182817E1): inf inf (0.17014117E39, 0.123E4, ~0.123E1): inf inf (0.17014117E39, 0.123E4, ~0.123): inf inf (0.17014117E39, 0.123E4, ~0.123E~2): inf inf (0.17014117E39, 0.123E4, ~0.11754944E~37): inf inf (0.17014117E39, 0.123E4, ~0.5877472E~38): inf inf (0.17014117E39, 0.123E4, ~0.1E~44): inf inf (0.17014117E39, 0.123E4, ~0.0): inf inf (0.17014117E39, 0.123E2, 0.34028235E39): inf inf (0.17014117E39, 0.123E2, 0.17014117E39): inf inf (0.17014117E39, 0.123E2, 0.123E4): inf inf (0.17014117E39, 0.123E2, 0.123E2): inf inf (0.17014117E39, 0.123E2, 0.31415927E1): inf inf (0.17014117E39, 0.123E2, 0.27182817E1): inf inf (0.17014117E39, 0.123E2, 0.123E1): inf inf (0.17014117E39, 0.123E2, 0.123): inf inf (0.17014117E39, 0.123E2, 0.123E~2): inf inf (0.17014117E39, 0.123E2, 0.11754944E~37): inf inf (0.17014117E39, 0.123E2, 0.5877472E~38): inf inf (0.17014117E39, 0.123E2, 0.1E~44): inf inf (0.17014117E39, 0.123E2, 0.0): inf inf (0.17014117E39, 0.123E2, ~0.34028235E39): inf inf (0.17014117E39, 0.123E2, ~0.17014117E39): inf inf (0.17014117E39, 0.123E2, ~0.123E4): inf inf (0.17014117E39, 0.123E2, ~0.123E2): inf inf (0.17014117E39, 0.123E2, ~0.31415927E1): inf inf (0.17014117E39, 0.123E2, ~0.27182817E1): inf inf (0.17014117E39, 0.123E2, ~0.123E1): inf inf (0.17014117E39, 0.123E2, ~0.123): inf inf (0.17014117E39, 0.123E2, ~0.123E~2): inf inf (0.17014117E39, 0.123E2, ~0.11754944E~37): inf inf (0.17014117E39, 0.123E2, ~0.5877472E~38): inf inf (0.17014117E39, 0.123E2, ~0.1E~44): inf inf (0.17014117E39, 0.123E2, ~0.0): inf inf (0.17014117E39, 0.31415927E1, 0.34028235E39): inf inf (0.17014117E39, 0.31415927E1, 0.17014117E39): inf inf (0.17014117E39, 0.31415927E1, 0.123E4): inf inf (0.17014117E39, 0.31415927E1, 0.123E2): inf inf (0.17014117E39, 0.31415927E1, 0.31415927E1): inf inf (0.17014117E39, 0.31415927E1, 0.27182817E1): inf inf (0.17014117E39, 0.31415927E1, 0.123E1): inf inf (0.17014117E39, 0.31415927E1, 0.123): inf inf (0.17014117E39, 0.31415927E1, 0.123E~2): inf inf (0.17014117E39, 0.31415927E1, 0.11754944E~37): inf inf (0.17014117E39, 0.31415927E1, 0.5877472E~38): inf inf (0.17014117E39, 0.31415927E1, 0.1E~44): inf inf (0.17014117E39, 0.31415927E1, 0.0): inf inf (0.17014117E39, 0.31415927E1, ~0.34028235E39): 0.19423192E39 0.19423192E39 (0.17014117E39, 0.31415927E1, ~0.17014117E39): inf inf (0.17014117E39, 0.31415927E1, ~0.123E4): inf inf (0.17014117E39, 0.31415927E1, ~0.123E2): inf inf (0.17014117E39, 0.31415927E1, ~0.31415927E1): inf inf (0.17014117E39, 0.31415927E1, ~0.27182817E1): inf inf (0.17014117E39, 0.31415927E1, ~0.123E1): inf inf (0.17014117E39, 0.31415927E1, ~0.123): inf inf (0.17014117E39, 0.31415927E1, ~0.123E~2): inf inf (0.17014117E39, 0.31415927E1, ~0.11754944E~37): inf inf (0.17014117E39, 0.31415927E1, ~0.5877472E~38): inf inf (0.17014117E39, 0.31415927E1, ~0.1E~44): inf inf (0.17014117E39, 0.31415927E1, ~0.0): inf inf (0.17014117E39, 0.27182817E1, 0.34028235E39): inf inf (0.17014117E39, 0.27182817E1, 0.17014117E39): inf inf (0.17014117E39, 0.27182817E1, 0.123E4): inf inf (0.17014117E39, 0.27182817E1, 0.123E2): inf inf (0.17014117E39, 0.27182817E1, 0.31415927E1): inf inf (0.17014117E39, 0.27182817E1, 0.27182817E1): inf inf (0.17014117E39, 0.27182817E1, 0.123E1): inf inf (0.17014117E39, 0.27182817E1, 0.123): inf inf (0.17014117E39, 0.27182817E1, 0.123E~2): inf inf (0.17014117E39, 0.27182817E1, 0.11754944E~37): inf inf (0.17014117E39, 0.27182817E1, 0.5877472E~38): inf inf (0.17014117E39, 0.27182817E1, 0.1E~44): inf inf (0.17014117E39, 0.27182817E1, 0.0): inf inf (0.17014117E39, 0.27182817E1, ~0.34028235E39): 0.1222093E39 0.1222093E39 (0.17014117E39, 0.27182817E1, ~0.17014117E39): 0.29235047E39 0.29235047E39 (0.17014117E39, 0.27182817E1, ~0.123E4): inf inf (0.17014117E39, 0.27182817E1, ~0.123E2): inf inf (0.17014117E39, 0.27182817E1, ~0.31415927E1): inf inf (0.17014117E39, 0.27182817E1, ~0.27182817E1): inf inf (0.17014117E39, 0.27182817E1, ~0.123E1): inf inf (0.17014117E39, 0.27182817E1, ~0.123): inf inf (0.17014117E39, 0.27182817E1, ~0.123E~2): inf inf (0.17014117E39, 0.27182817E1, ~0.11754944E~37): inf inf (0.17014117E39, 0.27182817E1, ~0.5877472E~38): inf inf (0.17014117E39, 0.27182817E1, ~0.1E~44): inf inf (0.17014117E39, 0.27182817E1, ~0.0): inf inf (0.17014117E39, 0.123E1, 0.34028235E39): inf inf (0.17014117E39, 0.123E1, 0.17014117E39): inf inf (0.17014117E39, 0.123E1, 0.123E4): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.123E2): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.31415927E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.27182817E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.123E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.123): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.123E~2): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.11754944E~37): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.5877472E~38): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.1E~44): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, 0.0): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.1310087E39 (0.17014117E39, 0.123E1, ~0.17014117E39): 0.39132473E38 0.39132473E38 (0.17014117E39, 0.123E1, ~0.123E4): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.123E2): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.31415927E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.27182817E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.123E1): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.123): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.123E~2): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.11754944E~37): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.5877472E~38): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.1E~44): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123E1, ~0.0): 0.20927364E39 0.20927364E39 (0.17014117E39, 0.123, 0.34028235E39): inf inf (0.17014117E39, 0.123, 0.17014117E39): 0.19106853E39 0.19106853E39 (0.17014117E39, 0.123, 0.123E4): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.123E2): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.31415927E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.27182817E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.123E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.123): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.123E~2): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.11754944E~37): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.5877472E~38): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.1E~44): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, 0.0): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.34028235E39): ~0.31935498E39 ~0.31935498E39 (0.17014117E39, 0.123, ~0.17014117E39): ~0.1492138E39 ~0.1492138E39 (0.17014117E39, 0.123, ~0.123E4): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.123E2): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.31415927E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.27182817E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.123E1): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.123): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.123E~2): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.11754944E~37): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.5877472E~38): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.1E~44): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123, ~0.0): 0.20927365E38 0.20927365E38 (0.17014117E39, 0.123E~2, 0.34028235E39): inf inf (0.17014117E39, 0.123E~2, 0.17014117E39): 0.17035044E39 0.17035044E39 (0.17014117E39, 0.123E~2, 0.123E4): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.123E2): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.31415927E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.27182817E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.123E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.123): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.123E~2): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.11754944E~37): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.5877472E~38): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.1E~44): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, 0.0): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.34028235E39): ~0.34007307E39 ~0.34007307E39 (0.17014117E39, 0.123E~2, ~0.17014117E39): ~0.1699319E39 ~0.1699319E39 (0.17014117E39, 0.123E~2, ~0.123E4): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.123E2): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.31415927E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.27182817E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.123E1): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.123): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.123E~2): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.11754944E~37): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.5877472E~38): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.1E~44): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.123E~2, ~0.0): 0.20927364E36 0.20927364E36 (0.17014117E39, 0.11754944E~37, 0.123E4): 0.1232E4 0.1232E4 (0.17014117E39, 0.11754944E~37, 0.123E2): 0.143E2 0.143E2 (0.17014117E39, 0.11754944E~37, 0.31415927E1): 0.51415925E1 0.51415925E1 (0.17014117E39, 0.11754944E~37, 0.27182817E1): 0.47182817E1 0.47182817E1 (0.17014117E39, 0.11754944E~37, 0.123E1): 0.323E1 0.323E1 (0.17014117E39, 0.11754944E~37, 0.123): 0.2123E1 0.2123E1 (0.17014117E39, 0.11754944E~37, 0.123E~2): 0.20012298E1 0.20012298E1 (0.17014117E39, 0.11754944E~37, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.17014117E39, 0.11754944E~37, ~0.123E2): ~0.103E2 ~0.103E2 (0.17014117E39, 0.11754944E~37, ~0.123): 0.18769999E1 0.18769999E1 (0.17014117E39, 0.11754944E~37, ~0.123E~2): 0.19987699E1 0.19987699E1 (0.17014117E39, 0.5877472E~38, 0.123E4): 0.1231E4 0.1231E4 (0.17014117E39, 0.5877472E~38, 0.123E2): 0.133E2 0.133E2 (0.17014117E39, 0.5877472E~38, 0.31415927E1): 0.41415925E1 0.41415925E1 (0.17014117E39, 0.5877472E~38, 0.27182817E1): 0.37182817E1 0.37182817E1 (0.17014117E39, 0.5877472E~38, 0.123E1): 0.223E1 0.223E1 (0.17014117E39, 0.5877472E~38, 0.123): 0.11229999E1 0.11229999E1 (0.17014117E39, 0.5877472E~38, 0.123E~2): 0.10012299E1 0.10012299E1 (0.17014117E39, 0.5877472E~38, ~0.123E4): ~0.1229E4 ~0.1229E4 (0.17014117E39, 0.5877472E~38, ~0.123E2): ~0.113E2 ~0.113E2 (0.17014117E39, 0.5877472E~38, ~0.31415927E1): ~0.21415927E1 ~0.21415927E1 (0.17014117E39, 0.5877472E~38, ~0.27182817E1): ~0.17182817E1 ~0.17182817E1 (0.17014117E39, 0.5877472E~38, ~0.123): 0.8769999 0.8769999 (0.17014117E39, 0.5877472E~38, ~0.123E~2): 0.99876994 0.99876994 (0.17014117E39, 0.1E~44, 0.123E4): 0.123E4 0.123E4 (0.17014117E39, 0.1E~44, 0.123E2): 0.123E2 0.123E2 (0.17014117E39, 0.1E~44, 0.31415927E1): 0.3141593E1 0.3141593E1 (0.17014117E39, 0.1E~44, 0.27182817E1): 0.2718282E1 0.2718282E1 (0.17014117E39, 0.1E~44, 0.123E1): 0.12300003E1 0.12300003E1 (0.17014117E39, 0.1E~44, 0.123): 0.12300024 0.12300024 (0.17014117E39, 0.1E~44, 0.123E~2): 0.12302385E~2 0.12302385E~2 (0.17014117E39, 0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (0.17014117E39, 0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (0.17014117E39, 0.1E~44, ~0.31415927E1): ~0.31415925E1 ~0.31415925E1 (0.17014117E39, 0.1E~44, ~0.27182817E1): ~0.27182815E1 ~0.27182815E1 (0.17014117E39, 0.1E~44, ~0.123E1): ~0.12299998E1 ~0.12299998E1 (0.17014117E39, 0.1E~44, ~0.123): ~0.122999765 ~0.122999765 (0.17014117E39, 0.1E~44, ~0.123E~2): ~0.12297616E~2 ~0.12297616E~2 (0.17014117E39, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.123E4): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.123E2): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.123E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.123): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.34028235E39, 0.0): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.123): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.34028235E39, ~0.0): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.34028235E39): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.17014117E39): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.123E4): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.123E2): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.123E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.123): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.17014117E39, 0.0): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.123): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.17014117E39, ~0.0): ~inf ~inf (0.17014117E39, ~0.123E4, 0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E4, 0.17014117E39): ~inf ~inf (0.17014117E39, ~0.123E4, 0.123E4): ~inf ~inf (0.17014117E39, ~0.123E4, 0.123E2): ~inf ~inf (0.17014117E39, ~0.123E4, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.123E4, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.123E4, 0.123E1): ~inf ~inf (0.17014117E39, ~0.123E4, 0.123): ~inf ~inf (0.17014117E39, ~0.123E4, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.123E4, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.123E4, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.123E4, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.123E4, 0.0): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.123): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.123E4, ~0.0): ~inf ~inf (0.17014117E39, ~0.123E2, 0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E2, 0.17014117E39): ~inf ~inf (0.17014117E39, ~0.123E2, 0.123E4): ~inf ~inf (0.17014117E39, ~0.123E2, 0.123E2): ~inf ~inf (0.17014117E39, ~0.123E2, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.123E2, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.123E2, 0.123E1): ~inf ~inf (0.17014117E39, ~0.123E2, 0.123): ~inf ~inf (0.17014117E39, ~0.123E2, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.123E2, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.123E2, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.123E2, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.123E2, 0.0): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.123): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.123E2, ~0.0): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.34028235E39): ~0.19423192E39 ~0.19423192E39 (0.17014117E39, ~0.31415927E1, 0.17014117E39): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.123E4): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.123E2): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.123E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.123): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.31415927E1, 0.0): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.123): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.31415927E1, ~0.0): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.34028235E39): ~0.1222093E39 ~0.1222093E39 (0.17014117E39, ~0.27182817E1, 0.17014117E39): ~0.29235047E39 ~0.29235047E39 (0.17014117E39, ~0.27182817E1, 0.123E4): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.123E2): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.31415927E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.27182817E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.123E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.123): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.123E~2): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.1E~44): ~inf ~inf (0.17014117E39, ~0.27182817E1, 0.0): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.123E4): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.123E2): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.31415927E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.27182817E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.123E1): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.123): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.123E~2): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.11754944E~37): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.5877472E~38): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.1E~44): ~inf ~inf (0.17014117E39, ~0.27182817E1, ~0.0): ~inf ~inf (0.17014117E39, ~0.123E1, 0.34028235E39): 0.1310087E39 0.1310087E39 (0.17014117E39, ~0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132473E38 (0.17014117E39, ~0.123E1, 0.123E4): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.123E2): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.31415927E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.27182817E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.123E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.123): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.123E~2): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.1E~44): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, 0.0): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E1, ~0.17014117E39): ~inf ~inf (0.17014117E39, ~0.123E1, ~0.123E4): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.123E2): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.31415927E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.27182817E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.123E1): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.123): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.123E~2): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.1E~44): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123E1, ~0.0): ~0.20927364E39 ~0.20927364E39 (0.17014117E39, ~0.123, 0.34028235E39): 0.31935498E39 0.31935498E39 (0.17014117E39, ~0.123, 0.17014117E39): 0.1492138E39 0.1492138E39 (0.17014117E39, ~0.123, 0.123E4): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.123E2): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.31415927E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.27182817E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.123E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.123): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.123E~2): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.1E~44): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, 0.0): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123, ~0.17014117E39): ~0.19106853E39 ~0.19106853E39 (0.17014117E39, ~0.123, ~0.123E4): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.123E2): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.31415927E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.27182817E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.123E1): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.123): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.123E~2): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.1E~44): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123, ~0.0): ~0.20927365E38 ~0.20927365E38 (0.17014117E39, ~0.123E~2, 0.34028235E39): 0.34007307E39 0.34007307E39 (0.17014117E39, ~0.123E~2, 0.17014117E39): 0.1699319E39 0.1699319E39 (0.17014117E39, ~0.123E~2, 0.123E4): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.123E2): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.31415927E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.27182817E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.123E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.123): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.123E~2): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.1E~44): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, 0.0): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.34028235E39): ~inf ~inf (0.17014117E39, ~0.123E~2, ~0.17014117E39): ~0.17035044E39 ~0.17035044E39 (0.17014117E39, ~0.123E~2, ~0.123E4): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.123E2): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.31415927E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.27182817E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.123E1): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.123): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.123E~2): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.1E~44): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.123E~2, ~0.0): ~0.20927364E36 ~0.20927364E36 (0.17014117E39, ~0.11754944E~37, 0.123E4): 0.1228E4 0.1228E4 (0.17014117E39, ~0.11754944E~37, 0.123E2): 0.103E2 0.103E2 (0.17014117E39, ~0.11754944E~37, 0.123): ~0.18769999E1 ~0.18769999E1 (0.17014117E39, ~0.11754944E~37, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (0.17014117E39, ~0.11754944E~37, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.17014117E39, ~0.11754944E~37, ~0.123E2): ~0.143E2 ~0.143E2 (0.17014117E39, ~0.11754944E~37, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (0.17014117E39, ~0.11754944E~37, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (0.17014117E39, ~0.11754944E~37, ~0.123E1): ~0.323E1 ~0.323E1 (0.17014117E39, ~0.11754944E~37, ~0.123): ~0.2123E1 ~0.2123E1 (0.17014117E39, ~0.11754944E~37, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (0.17014117E39, ~0.5877472E~38, 0.123E4): 0.1229E4 0.1229E4 (0.17014117E39, ~0.5877472E~38, 0.123E2): 0.113E2 0.113E2 (0.17014117E39, ~0.5877472E~38, 0.31415927E1): 0.21415927E1 0.21415927E1 (0.17014117E39, ~0.5877472E~38, 0.27182817E1): 0.17182817E1 0.17182817E1 (0.17014117E39, ~0.5877472E~38, 0.123): ~0.8769999 ~0.8769999 (0.17014117E39, ~0.5877472E~38, 0.123E~2): ~0.99876994 ~0.99876994 (0.17014117E39, ~0.5877472E~38, ~0.123E4): ~0.1231E4 ~0.1231E4 (0.17014117E39, ~0.5877472E~38, ~0.123E2): ~0.133E2 ~0.133E2 (0.17014117E39, ~0.5877472E~38, ~0.31415927E1): ~0.41415925E1 ~0.41415925E1 (0.17014117E39, ~0.5877472E~38, ~0.27182817E1): ~0.37182817E1 ~0.37182817E1 (0.17014117E39, ~0.5877472E~38, ~0.123E1): ~0.223E1 ~0.223E1 (0.17014117E39, ~0.5877472E~38, ~0.123): ~0.11229999E1 ~0.11229999E1 (0.17014117E39, ~0.5877472E~38, ~0.123E~2): ~0.10012299E1 ~0.10012299E1 (0.17014117E39, ~0.1E~44, 0.123E4): 0.123E4 0.123E4 (0.17014117E39, ~0.1E~44, 0.123E2): 0.123E2 0.123E2 (0.17014117E39, ~0.1E~44, 0.31415927E1): 0.31415925E1 0.31415925E1 (0.17014117E39, ~0.1E~44, 0.27182817E1): 0.27182815E1 0.27182815E1 (0.17014117E39, ~0.1E~44, 0.123E1): 0.12299998E1 0.12299998E1 (0.17014117E39, ~0.1E~44, 0.123): 0.122999765 0.122999765 (0.17014117E39, ~0.1E~44, 0.123E~2): 0.12297616E~2 0.12297616E~2 (0.17014117E39, ~0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (0.17014117E39, ~0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (0.17014117E39, ~0.1E~44, ~0.31415927E1): ~0.3141593E1 ~0.3141593E1 (0.17014117E39, ~0.1E~44, ~0.27182817E1): ~0.2718282E1 ~0.2718282E1 (0.17014117E39, ~0.1E~44, ~0.123E1): ~0.12300003E1 ~0.12300003E1 (0.17014117E39, ~0.1E~44, ~0.123): ~0.12300024 ~0.12300024 (0.17014117E39, ~0.1E~44, ~0.123E~2): ~0.12302385E~2 ~0.12302385E~2 (0.123E4, 0.34028235E39, 0.34028235E39): inf inf (0.123E4, 0.34028235E39, 0.17014117E39): inf inf (0.123E4, 0.34028235E39, 0.123E4): inf inf (0.123E4, 0.34028235E39, 0.123E2): inf inf (0.123E4, 0.34028235E39, 0.31415927E1): inf inf (0.123E4, 0.34028235E39, 0.27182817E1): inf inf (0.123E4, 0.34028235E39, 0.123E1): inf inf (0.123E4, 0.34028235E39, 0.123): inf inf (0.123E4, 0.34028235E39, 0.123E~2): inf inf (0.123E4, 0.34028235E39, 0.11754944E~37): inf inf (0.123E4, 0.34028235E39, 0.5877472E~38): inf inf (0.123E4, 0.34028235E39, 0.1E~44): inf inf (0.123E4, 0.34028235E39, 0.0): inf inf (0.123E4, 0.34028235E39, ~0.34028235E39): inf inf (0.123E4, 0.34028235E39, ~0.17014117E39): inf inf (0.123E4, 0.34028235E39, ~0.123E4): inf inf (0.123E4, 0.34028235E39, ~0.123E2): inf inf (0.123E4, 0.34028235E39, ~0.31415927E1): inf inf (0.123E4, 0.34028235E39, ~0.27182817E1): inf inf (0.123E4, 0.34028235E39, ~0.123E1): inf inf (0.123E4, 0.34028235E39, ~0.123): inf inf (0.123E4, 0.34028235E39, ~0.123E~2): inf inf (0.123E4, 0.34028235E39, ~0.11754944E~37): inf inf (0.123E4, 0.34028235E39, ~0.5877472E~38): inf inf (0.123E4, 0.34028235E39, ~0.1E~44): inf inf (0.123E4, 0.34028235E39, ~0.0): inf inf (0.123E4, 0.17014117E39, 0.34028235E39): inf inf (0.123E4, 0.17014117E39, 0.17014117E39): inf inf (0.123E4, 0.17014117E39, 0.123E4): inf inf (0.123E4, 0.17014117E39, 0.123E2): inf inf (0.123E4, 0.17014117E39, 0.31415927E1): inf inf (0.123E4, 0.17014117E39, 0.27182817E1): inf inf (0.123E4, 0.17014117E39, 0.123E1): inf inf (0.123E4, 0.17014117E39, 0.123): inf inf (0.123E4, 0.17014117E39, 0.123E~2): inf inf (0.123E4, 0.17014117E39, 0.11754944E~37): inf inf (0.123E4, 0.17014117E39, 0.5877472E~38): inf inf (0.123E4, 0.17014117E39, 0.1E~44): inf inf (0.123E4, 0.17014117E39, 0.0): inf inf (0.123E4, 0.17014117E39, ~0.34028235E39): inf inf (0.123E4, 0.17014117E39, ~0.17014117E39): inf inf (0.123E4, 0.17014117E39, ~0.123E4): inf inf (0.123E4, 0.17014117E39, ~0.123E2): inf inf (0.123E4, 0.17014117E39, ~0.31415927E1): inf inf (0.123E4, 0.17014117E39, ~0.27182817E1): inf inf (0.123E4, 0.17014117E39, ~0.123E1): inf inf (0.123E4, 0.17014117E39, ~0.123): inf inf (0.123E4, 0.17014117E39, ~0.123E~2): inf inf (0.123E4, 0.17014117E39, ~0.11754944E~37): inf inf (0.123E4, 0.17014117E39, ~0.5877472E~38): inf inf (0.123E4, 0.17014117E39, ~0.1E~44): inf inf (0.123E4, 0.17014117E39, ~0.0): inf inf (0.123E4, 0.123E4, 0.123E2): 0.15129122E7 0.15129122E7 (0.123E4, 0.123E4, 0.31415927E1): 0.15129031E7 0.15129031E7 (0.123E4, 0.123E4, 0.27182817E1): 0.15129028E7 0.15129028E7 (0.123E4, 0.123E4, 0.123E1): 0.15129012E7 0.15129012E7 (0.123E4, 0.123E4, 0.123): 0.15129001E7 0.15129001E7 (0.123E4, 0.123E4, 0.123E~2): 0.15129E7 0.15129E7 (0.123E4, 0.123E4, ~0.123E2): 0.15128878E7 0.15128878E7 (0.123E4, 0.123E4, ~0.31415927E1): 0.15128969E7 0.15128969E7 (0.123E4, 0.123E4, ~0.27182817E1): 0.15128972E7 0.15128972E7 (0.123E4, 0.123E4, ~0.123E1): 0.15128988E7 0.15128988E7 (0.123E4, 0.123E4, ~0.123): 0.15128999E7 0.15128999E7 (0.123E4, 0.123E4, ~0.123E~2): 0.15129E7 0.15129E7 (0.123E4, 0.123E2, 0.123E4): 0.16359E5 0.16359E5 (0.123E4, 0.123E2, 0.123E2): 0.151413E5 0.151413E5 (0.123E4, 0.123E2, 0.31415927E1): 0.15132142E5 0.15132142E5 (0.123E4, 0.123E2, 0.27182817E1): 0.15131719E5 0.15131719E5 (0.123E4, 0.123E2, 0.123E1): 0.1513023E5 0.1513023E5 (0.123E4, 0.123E2, 0.123): 0.15129123E5 0.15129123E5 (0.123E4, 0.123E2, 0.123E~2): 0.15129001E5 0.15129001E5 (0.123E4, 0.123E2, 0.11754944E~37): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.5877472E~38): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.1E~44): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.0): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.123E4): 0.13899E5 0.13899E5 (0.123E4, 0.123E2, ~0.123E2): 0.151167E5 0.151167E5 (0.123E4, 0.123E2, ~0.31415927E1): 0.15125858E5 0.15125858E5 (0.123E4, 0.123E2, ~0.27182817E1): 0.15126282E5 0.15126282E5 (0.123E4, 0.123E2, ~0.123E1): 0.151277705E5 0.151277705E5 (0.123E4, 0.123E2, ~0.123): 0.15128877E5 0.15128877E5 (0.123E4, 0.123E2, ~0.123E~2): 0.15128999E5 0.15128999E5 (0.123E4, 0.123E2, ~0.11754944E~37): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.5877472E~38): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.1E~44): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.0): 0.15129E5 0.15129E5 (0.123E4, 0.31415927E1, 0.123E4): 0.5094159E4 0.5094159E4 (0.123E4, 0.31415927E1, 0.123E2): 0.3876459E4 0.3876459E4 (0.123E4, 0.31415927E1, 0.31415927E1): 0.38673008E4 0.38673008E4 (0.123E4, 0.31415927E1, 0.27182817E1): 0.38668774E4 0.38668774E4 (0.123E4, 0.31415927E1, 0.123E1): 0.38653892E4 0.38653892E4 (0.123E4, 0.31415927E1, 0.123): 0.3864282E4 0.3864282E4 (0.123E4, 0.31415927E1, 0.123E~2): 0.38641604E4 0.38641604E4 (0.123E4, 0.31415927E1, 0.11754944E~37): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, 0.5877472E~38): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, 0.1E~44): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, 0.0): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, ~0.123E4): 0.26341592E4 0.26341592E4 (0.123E4, 0.31415927E1, ~0.123E2): 0.38518591E4 0.38518591E4 (0.123E4, 0.31415927E1, ~0.31415927E1): 0.38610176E4 0.38610176E4 (0.123E4, 0.31415927E1, ~0.27182817E1): 0.38614407E4 0.38614407E4 (0.123E4, 0.31415927E1, ~0.123E1): 0.3862929E4 0.3862929E4 (0.123E4, 0.31415927E1, ~0.123): 0.38640361E4 0.38640361E4 (0.123E4, 0.31415927E1, ~0.123E~2): 0.3864158E4 0.3864158E4 (0.123E4, 0.31415927E1, ~0.11754944E~37): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, ~0.5877472E~38): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, ~0.1E~44): 0.38641592E4 0.38641592E4 (0.123E4, 0.31415927E1, ~0.0): 0.38641592E4 0.38641592E4 (0.123E4, 0.27182817E1, 0.123E4): 0.45734863E4 0.45734863E4 (0.123E4, 0.27182817E1, 0.123E2): 0.33557866E4 0.33557866E4 (0.123E4, 0.27182817E1, 0.31415927E1): 0.33466282E4 0.33466282E4 (0.123E4, 0.27182817E1, 0.27182817E1): 0.33462048E4 0.33462048E4 (0.123E4, 0.27182817E1, 0.123E1): 0.33447166E4 0.33447166E4 (0.123E4, 0.27182817E1, 0.123): 0.33436096E4 0.33436096E4 (0.123E4, 0.27182817E1, 0.123E~2): 0.33434878E4 0.33434878E4 (0.123E4, 0.27182817E1, 0.11754944E~37): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, 0.5877472E~38): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, 0.1E~44): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, 0.0): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, ~0.123E4): 0.21134866E4 0.21134866E4 (0.123E4, 0.27182817E1, ~0.123E2): 0.33311865E4 0.33311865E4 (0.123E4, 0.27182817E1, ~0.31415927E1): 0.3340345E4 0.3340345E4 (0.123E4, 0.27182817E1, ~0.27182817E1): 0.33407683E4 0.33407683E4 (0.123E4, 0.27182817E1, ~0.123E1): 0.33422566E4 0.33422566E4 (0.123E4, 0.27182817E1, ~0.123): 0.33433635E4 0.33433635E4 (0.123E4, 0.27182817E1, ~0.123E~2): 0.33434854E4 0.33434854E4 (0.123E4, 0.27182817E1, ~0.11754944E~37): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, ~0.5877472E~38): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, ~0.1E~44): 0.33434866E4 0.33434866E4 (0.123E4, 0.27182817E1, ~0.0): 0.33434866E4 0.33434866E4 (0.123E4, 0.123E1, 0.123E4): 0.27429E4 0.27429E4 (0.123E4, 0.123E1, 0.123E2): 0.15252001E4 0.15252001E4 (0.123E4, 0.123E1, 0.31415927E1): 0.15160416E4 0.15160416E4 (0.123E4, 0.123E1, 0.27182817E1): 0.15156183E4 0.15156183E4 (0.123E4, 0.123E1, 0.123E1): 0.151413E4 0.151413E4 (0.123E4, 0.123E1, 0.123): 0.15130231E4 0.15130231E4 (0.123E4, 0.123E1, 0.123E~2): 0.15129012E4 0.15129012E4 (0.123E4, 0.123E1, 0.11754944E~37): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.5877472E~38): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.1E~44): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.0): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.123E4): 0.28290002E3 0.28290002E3 (0.123E4, 0.123E1, ~0.123E2): 0.15006E4 0.15006E4 (0.123E4, 0.123E1, ~0.31415927E1): 0.15097584E4 0.15097584E4 (0.123E4, 0.123E1, ~0.27182817E1): 0.15101818E4 0.15101818E4 (0.123E4, 0.123E1, ~0.123E1): 0.151167E4 0.151167E4 (0.123E4, 0.123E1, ~0.123): 0.1512777E4 0.1512777E4 (0.123E4, 0.123E1, ~0.123E~2): 0.15128988E4 0.15128988E4 (0.123E4, 0.123E1, ~0.11754944E~37): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.5877472E~38): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.1E~44): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.0): 0.15129E4 0.15129E4 (0.123E4, 0.123, 0.123E4): 0.138129E4 0.138129E4 (0.123E4, 0.123, 0.123E2): 0.16359001E3 0.16359001E3 (0.123E4, 0.123, 0.31415927E1): 0.1544316E3 0.1544316E3 (0.123E4, 0.123, 0.27182817E1): 0.15400829E3 0.15400829E3 (0.123E4, 0.123, 0.123E1): 0.15252E3 0.15252E3 (0.123E4, 0.123, 0.123): 0.15141301E3 0.15141301E3 (0.123E4, 0.123, 0.123E~2): 0.15129123E3 0.15129123E3 (0.123E4, 0.123, 0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, 0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, 0.1E~44): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, 0.0): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123E4, 0.123, ~0.123E2): 0.13899E3 0.13899E3 (0.123E4, 0.123, ~0.31415927E1): 0.1481484E3 0.1481484E3 (0.123E4, 0.123, ~0.27182817E1): 0.14857172E3 0.14857172E3 (0.123E4, 0.123, ~0.123E1): 0.15006E3 0.15006E3 (0.123E4, 0.123, ~0.123): 0.151167E3 0.151167E3 (0.123E4, 0.123, ~0.123E~2): 0.15128877E3 0.15128877E3 (0.123E4, 0.123, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, ~0.1E~44): 0.15129001E3 0.15129001E3 (0.123E4, 0.123, ~0.0): 0.15129001E3 0.15129001E3 (0.123E4, 0.123E~2, 0.123E4): 0.1231513E4 0.1231513E4 (0.123E4, 0.123E~2, 0.123E2): 0.13812901E2 0.13812901E2 (0.123E4, 0.123E~2, 0.31415927E1): 0.4654493E1 0.4654493E1 (0.123E4, 0.123E~2, 0.27182817E1): 0.42311816E1 0.42311816E1 (0.123E4, 0.123E~2, 0.123E1): 0.27429001E1 0.27429001E1 (0.123E4, 0.123E~2, 0.123): 0.16359E1 0.16359E1 (0.123E4, 0.123E~2, 0.123E~2): 0.15141301E1 0.15141301E1 (0.123E4, 0.123E~2, 0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, 0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, 0.1E~44): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, 0.0): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (0.123E4, 0.123E~2, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E4, 0.123E~2, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (0.123E4, 0.123E~2, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (0.123E4, 0.123E~2, ~0.123E1): 0.28290004 0.28290004 (0.123E4, 0.123E~2, ~0.123): 0.13899001E1 0.13899001E1 (0.123E4, 0.123E~2, ~0.123E~2): 0.15116701E1 0.15116701E1 (0.123E4, 0.123E~2, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, ~0.1E~44): 0.15129001E1 0.15129001E1 (0.123E4, 0.123E~2, ~0.0): 0.15129001E1 0.15129001E1 (0.123E4, 0.11754944E~37, 0.1E~44): 0.1445858E~34 0.1445858E~34 (0.123E4, 0.11754944E~37, ~0.1E~44): 0.1445858E~34 0.1445858E~34 (0.123E4, 0.5877472E~38, 0.1E~44): 0.722929E~35 0.722929E~35 (0.123E4, 0.5877472E~38, ~0.1E~44): 0.722929E~35 0.722929E~35 (0.123E4, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.123E4, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.123E4, ~0.34028235E39, 0.123E4): ~inf ~inf (0.123E4, ~0.34028235E39, 0.123E2): ~inf ~inf (0.123E4, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.123E4, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.123E4, ~0.34028235E39, 0.123E1): ~inf ~inf (0.123E4, ~0.34028235E39, 0.123): ~inf ~inf (0.123E4, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.123E4, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.123E4, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.123E4, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.123E4, ~0.34028235E39, 0.0): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.123): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.123E4, ~0.34028235E39, ~0.0): ~inf ~inf (0.123E4, ~0.17014117E39, 0.34028235E39): ~inf ~inf (0.123E4, ~0.17014117E39, 0.17014117E39): ~inf ~inf (0.123E4, ~0.17014117E39, 0.123E4): ~inf ~inf (0.123E4, ~0.17014117E39, 0.123E2): ~inf ~inf (0.123E4, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.123E4, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.123E4, ~0.17014117E39, 0.123E1): ~inf ~inf (0.123E4, ~0.17014117E39, 0.123): ~inf ~inf (0.123E4, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.123E4, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.123E4, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.123E4, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.123E4, ~0.17014117E39, 0.0): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.123): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.123E4, ~0.17014117E39, ~0.0): ~inf ~inf (0.123E4, ~0.123E4, 0.123E2): ~0.15128878E7 ~0.15128878E7 (0.123E4, ~0.123E4, 0.31415927E1): ~0.15128969E7 ~0.15128969E7 (0.123E4, ~0.123E4, 0.27182817E1): ~0.15128972E7 ~0.15128972E7 (0.123E4, ~0.123E4, 0.123E1): ~0.15128988E7 ~0.15128988E7 (0.123E4, ~0.123E4, 0.123): ~0.15128999E7 ~0.15128999E7 (0.123E4, ~0.123E4, 0.123E~2): ~0.15129E7 ~0.15129E7 (0.123E4, ~0.123E4, ~0.123E2): ~0.15129122E7 ~0.15129122E7 (0.123E4, ~0.123E4, ~0.31415927E1): ~0.15129031E7 ~0.15129031E7 (0.123E4, ~0.123E4, ~0.27182817E1): ~0.15129028E7 ~0.15129028E7 (0.123E4, ~0.123E4, ~0.123E1): ~0.15129012E7 ~0.15129012E7 (0.123E4, ~0.123E4, ~0.123): ~0.15129001E7 ~0.15129001E7 (0.123E4, ~0.123E4, ~0.123E~2): ~0.15129E7 ~0.15129E7 (0.123E4, ~0.123E2, 0.123E4): ~0.13899E5 ~0.13899E5 (0.123E4, ~0.123E2, 0.123E2): ~0.151167E5 ~0.151167E5 (0.123E4, ~0.123E2, 0.31415927E1): ~0.15125858E5 ~0.15125858E5 (0.123E4, ~0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126282E5 (0.123E4, ~0.123E2, 0.123E1): ~0.151277705E5 ~0.151277705E5 (0.123E4, ~0.123E2, 0.123): ~0.15128877E5 ~0.15128877E5 (0.123E4, ~0.123E2, 0.123E~2): ~0.15128999E5 ~0.15128999E5 (0.123E4, ~0.123E2, 0.11754944E~37): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.5877472E~38): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.1E~44): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.0): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.123E4): ~0.16359E5 ~0.16359E5 (0.123E4, ~0.123E2, ~0.123E2): ~0.151413E5 ~0.151413E5 (0.123E4, ~0.123E2, ~0.31415927E1): ~0.15132142E5 ~0.15132142E5 (0.123E4, ~0.123E2, ~0.27182817E1): ~0.15131719E5 ~0.15131719E5 (0.123E4, ~0.123E2, ~0.123E1): ~0.1513023E5 ~0.1513023E5 (0.123E4, ~0.123E2, ~0.123): ~0.15129123E5 ~0.15129123E5 (0.123E4, ~0.123E2, ~0.123E~2): ~0.15129001E5 ~0.15129001E5 (0.123E4, ~0.123E2, ~0.11754944E~37): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.5877472E~38): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.1E~44): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.0): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.31415927E1, 0.123E4): ~0.26341592E4 ~0.26341592E4 (0.123E4, ~0.31415927E1, 0.123E2): ~0.38518591E4 ~0.38518591E4 (0.123E4, ~0.31415927E1, 0.31415927E1): ~0.38610176E4 ~0.38610176E4 (0.123E4, ~0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.38614407E4 (0.123E4, ~0.31415927E1, 0.123E1): ~0.3862929E4 ~0.3862929E4 (0.123E4, ~0.31415927E1, 0.123): ~0.38640361E4 ~0.38640361E4 (0.123E4, ~0.31415927E1, 0.123E~2): ~0.3864158E4 ~0.3864158E4 (0.123E4, ~0.31415927E1, 0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, 0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, 0.1E~44): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, 0.0): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, ~0.123E4): ~0.5094159E4 ~0.5094159E4 (0.123E4, ~0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.3876459E4 (0.123E4, ~0.31415927E1, ~0.31415927E1): ~0.38673008E4 ~0.38673008E4 (0.123E4, ~0.31415927E1, ~0.27182817E1): ~0.38668774E4 ~0.38668774E4 (0.123E4, ~0.31415927E1, ~0.123E1): ~0.38653892E4 ~0.38653892E4 (0.123E4, ~0.31415927E1, ~0.123): ~0.3864282E4 ~0.3864282E4 (0.123E4, ~0.31415927E1, ~0.123E~2): ~0.38641604E4 ~0.38641604E4 (0.123E4, ~0.31415927E1, ~0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, ~0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, ~0.1E~44): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.31415927E1, ~0.0): ~0.38641592E4 ~0.38641592E4 (0.123E4, ~0.27182817E1, 0.123E4): ~0.21134866E4 ~0.21134866E4 (0.123E4, ~0.27182817E1, 0.123E2): ~0.33311865E4 ~0.33311865E4 (0.123E4, ~0.27182817E1, 0.31415927E1): ~0.3340345E4 ~0.3340345E4 (0.123E4, ~0.27182817E1, 0.27182817E1): ~0.33407683E4 ~0.33407683E4 (0.123E4, ~0.27182817E1, 0.123E1): ~0.33422566E4 ~0.33422566E4 (0.123E4, ~0.27182817E1, 0.123): ~0.33433635E4 ~0.33433635E4 (0.123E4, ~0.27182817E1, 0.123E~2): ~0.33434854E4 ~0.33434854E4 (0.123E4, ~0.27182817E1, 0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, 0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, 0.1E~44): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, 0.0): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, ~0.123E4): ~0.45734863E4 ~0.45734863E4 (0.123E4, ~0.27182817E1, ~0.123E2): ~0.33557866E4 ~0.33557866E4 (0.123E4, ~0.27182817E1, ~0.31415927E1): ~0.33466282E4 ~0.33466282E4 (0.123E4, ~0.27182817E1, ~0.27182817E1): ~0.33462048E4 ~0.33462048E4 (0.123E4, ~0.27182817E1, ~0.123E1): ~0.33447166E4 ~0.33447166E4 (0.123E4, ~0.27182817E1, ~0.123): ~0.33436096E4 ~0.33436096E4 (0.123E4, ~0.27182817E1, ~0.123E~2): ~0.33434878E4 ~0.33434878E4 (0.123E4, ~0.27182817E1, ~0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, ~0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, ~0.1E~44): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.27182817E1, ~0.0): ~0.33434866E4 ~0.33434866E4 (0.123E4, ~0.123E1, 0.123E4): ~0.28290002E3 ~0.28290002E3 (0.123E4, ~0.123E1, 0.123E2): ~0.15006E4 ~0.15006E4 (0.123E4, ~0.123E1, 0.31415927E1): ~0.15097584E4 ~0.15097584E4 (0.123E4, ~0.123E1, 0.27182817E1): ~0.15101818E4 ~0.15101818E4 (0.123E4, ~0.123E1, 0.123E1): ~0.151167E4 ~0.151167E4 (0.123E4, ~0.123E1, 0.123): ~0.1512777E4 ~0.1512777E4 (0.123E4, ~0.123E1, 0.123E~2): ~0.15128988E4 ~0.15128988E4 (0.123E4, ~0.123E1, 0.11754944E~37): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.5877472E~38): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.1E~44): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.0): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.123E4): ~0.27429E4 ~0.27429E4 (0.123E4, ~0.123E1, ~0.123E2): ~0.15252001E4 ~0.15252001E4 (0.123E4, ~0.123E1, ~0.31415927E1): ~0.15160416E4 ~0.15160416E4 (0.123E4, ~0.123E1, ~0.27182817E1): ~0.15156183E4 ~0.15156183E4 (0.123E4, ~0.123E1, ~0.123E1): ~0.151413E4 ~0.151413E4 (0.123E4, ~0.123E1, ~0.123): ~0.15130231E4 ~0.15130231E4 (0.123E4, ~0.123E1, ~0.123E~2): ~0.15129012E4 ~0.15129012E4 (0.123E4, ~0.123E1, ~0.11754944E~37): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.5877472E~38): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.1E~44): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.0): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123, 0.123E4): 0.107871E4 0.107871E4 (0.123E4, ~0.123, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123E4, ~0.123, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (0.123E4, ~0.123, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (0.123E4, ~0.123, 0.123E1): ~0.15006E3 ~0.15006E3 (0.123E4, ~0.123, 0.123): ~0.151167E3 ~0.151167E3 (0.123E4, ~0.123, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (0.123E4, ~0.123, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, 0.0): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123E4, ~0.123, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (0.123E4, ~0.123, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (0.123E4, ~0.123, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (0.123E4, ~0.123, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123E4, ~0.123, ~0.123): ~0.15141301E3 ~0.15141301E3 (0.123E4, ~0.123, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (0.123E4, ~0.123, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123, ~0.0): ~0.15129001E3 ~0.15129001E3 (0.123E4, ~0.123E~2, 0.123E4): 0.1228487E4 0.1228487E4 (0.123E4, ~0.123E~2, 0.123E2): 0.107871E2 0.107871E2 (0.123E4, ~0.123E~2, 0.31415927E1): 0.16286926E1 0.16286926E1 (0.123E4, ~0.123E~2, 0.27182817E1): 0.12053816E1 0.12053816E1 (0.123E4, ~0.123E~2, 0.123E1): ~0.28290004 ~0.28290004 (0.123E4, ~0.123E~2, 0.123): ~0.13899001E1 ~0.13899001E1 (0.123E4, ~0.123E~2, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (0.123E4, ~0.123E~2, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, 0.0): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (0.123E4, ~0.123E~2, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (0.123E4, ~0.123E~2, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (0.123E4, ~0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (0.123E4, ~0.123E~2, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (0.123E4, ~0.123E~2, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E4, ~0.123E~2, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (0.123E4, ~0.123E~2, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.123E~2, ~0.0): ~0.15129001E1 ~0.15129001E1 (0.123E4, ~0.11754944E~37, 0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (0.123E4, ~0.11754944E~37, ~0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (0.123E4, ~0.5877472E~38, 0.1E~44): ~0.722929E~35 ~0.722929E~35 (0.123E4, ~0.5877472E~38, ~0.1E~44): ~0.722929E~35 ~0.722929E~35 (0.123E2, 0.34028235E39, 0.34028235E39): inf inf (0.123E2, 0.34028235E39, 0.17014117E39): inf inf (0.123E2, 0.34028235E39, 0.123E4): inf inf (0.123E2, 0.34028235E39, 0.123E2): inf inf (0.123E2, 0.34028235E39, 0.31415927E1): inf inf (0.123E2, 0.34028235E39, 0.27182817E1): inf inf (0.123E2, 0.34028235E39, 0.123E1): inf inf (0.123E2, 0.34028235E39, 0.123): inf inf (0.123E2, 0.34028235E39, 0.123E~2): inf inf (0.123E2, 0.34028235E39, 0.11754944E~37): inf inf (0.123E2, 0.34028235E39, 0.5877472E~38): inf inf (0.123E2, 0.34028235E39, 0.1E~44): inf inf (0.123E2, 0.34028235E39, 0.0): inf inf (0.123E2, 0.34028235E39, ~0.34028235E39): inf inf (0.123E2, 0.34028235E39, ~0.17014117E39): inf inf (0.123E2, 0.34028235E39, ~0.123E4): inf inf (0.123E2, 0.34028235E39, ~0.123E2): inf inf (0.123E2, 0.34028235E39, ~0.31415927E1): inf inf (0.123E2, 0.34028235E39, ~0.27182817E1): inf inf (0.123E2, 0.34028235E39, ~0.123E1): inf inf (0.123E2, 0.34028235E39, ~0.123): inf inf (0.123E2, 0.34028235E39, ~0.123E~2): inf inf (0.123E2, 0.34028235E39, ~0.11754944E~37): inf inf (0.123E2, 0.34028235E39, ~0.5877472E~38): inf inf (0.123E2, 0.34028235E39, ~0.1E~44): inf inf (0.123E2, 0.34028235E39, ~0.0): inf inf (0.123E2, 0.17014117E39, 0.34028235E39): inf inf (0.123E2, 0.17014117E39, 0.17014117E39): inf inf (0.123E2, 0.17014117E39, 0.123E4): inf inf (0.123E2, 0.17014117E39, 0.123E2): inf inf (0.123E2, 0.17014117E39, 0.31415927E1): inf inf (0.123E2, 0.17014117E39, 0.27182817E1): inf inf (0.123E2, 0.17014117E39, 0.123E1): inf inf (0.123E2, 0.17014117E39, 0.123): inf inf (0.123E2, 0.17014117E39, 0.123E~2): inf inf (0.123E2, 0.17014117E39, 0.11754944E~37): inf inf (0.123E2, 0.17014117E39, 0.5877472E~38): inf inf (0.123E2, 0.17014117E39, 0.1E~44): inf inf (0.123E2, 0.17014117E39, 0.0): inf inf (0.123E2, 0.17014117E39, ~0.34028235E39): inf inf (0.123E2, 0.17014117E39, ~0.17014117E39): inf inf (0.123E2, 0.17014117E39, ~0.123E4): inf inf (0.123E2, 0.17014117E39, ~0.123E2): inf inf (0.123E2, 0.17014117E39, ~0.31415927E1): inf inf (0.123E2, 0.17014117E39, ~0.27182817E1): inf inf (0.123E2, 0.17014117E39, ~0.123E1): inf inf (0.123E2, 0.17014117E39, ~0.123): inf inf (0.123E2, 0.17014117E39, ~0.123E~2): inf inf (0.123E2, 0.17014117E39, ~0.11754944E~37): inf inf (0.123E2, 0.17014117E39, ~0.5877472E~38): inf inf (0.123E2, 0.17014117E39, ~0.1E~44): inf inf (0.123E2, 0.17014117E39, ~0.0): inf inf (0.123E2, 0.123E4, 0.123E4): 0.16359E5 0.16359E5 (0.123E2, 0.123E4, 0.123E2): 0.151413E5 0.151413E5 (0.123E2, 0.123E4, 0.31415927E1): 0.15132142E5 0.15132142E5 (0.123E2, 0.123E4, 0.27182817E1): 0.15131719E5 0.15131719E5 (0.123E2, 0.123E4, 0.123E1): 0.1513023E5 0.1513023E5 (0.123E2, 0.123E4, 0.123): 0.15129123E5 0.15129123E5 (0.123E2, 0.123E4, 0.123E~2): 0.15129001E5 0.15129001E5 (0.123E2, 0.123E4, 0.11754944E~37): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.5877472E~38): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.1E~44): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.0): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.123E4): 0.13899E5 0.13899E5 (0.123E2, 0.123E4, ~0.123E2): 0.151167E5 0.151167E5 (0.123E2, 0.123E4, ~0.31415927E1): 0.15125858E5 0.15125858E5 (0.123E2, 0.123E4, ~0.27182817E1): 0.15126282E5 0.15126282E5 (0.123E2, 0.123E4, ~0.123E1): 0.151277705E5 0.151277705E5 (0.123E2, 0.123E4, ~0.123): 0.15128877E5 0.15128877E5 (0.123E2, 0.123E4, ~0.123E~2): 0.15128999E5 0.15128999E5 (0.123E2, 0.123E4, ~0.11754944E~37): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.5877472E~38): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.1E~44): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.0): 0.15129E5 0.15129E5 (0.123E2, 0.123E2, 0.123E4): 0.138129E4 0.138129E4 (0.123E2, 0.123E2, 0.123E2): 0.16359001E3 0.16359001E3 (0.123E2, 0.123E2, 0.31415927E1): 0.1544316E3 0.1544316E3 (0.123E2, 0.123E2, 0.27182817E1): 0.15400829E3 0.15400829E3 (0.123E2, 0.123E2, 0.123E1): 0.15252E3 0.15252E3 (0.123E2, 0.123E2, 0.123): 0.15141301E3 0.15141301E3 (0.123E2, 0.123E2, 0.123E~2): 0.15129123E3 0.15129123E3 (0.123E2, 0.123E2, 0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, 0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, 0.1E~44): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, 0.0): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123E2, 0.123E2, ~0.123E2): 0.13899E3 0.13899E3 (0.123E2, 0.123E2, ~0.31415927E1): 0.1481484E3 0.1481484E3 (0.123E2, 0.123E2, ~0.27182817E1): 0.14857172E3 0.14857172E3 (0.123E2, 0.123E2, ~0.123E1): 0.15006E3 0.15006E3 (0.123E2, 0.123E2, ~0.123): 0.151167E3 0.151167E3 (0.123E2, 0.123E2, ~0.123E~2): 0.15128877E3 0.15128877E3 (0.123E2, 0.123E2, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, ~0.1E~44): 0.15129001E3 0.15129001E3 (0.123E2, 0.123E2, ~0.0): 0.15129001E3 0.15129001E3 (0.123E2, 0.31415927E1, 0.123E4): 0.12686416E4 0.12686416E4 (0.123E2, 0.31415927E1, 0.123E2): 0.50941593E2 0.50941593E2 (0.123E2, 0.31415927E1, 0.31415927E1): 0.41783184E2 0.41783184E2 (0.123E2, 0.31415927E1, 0.27182817E1): 0.41359875E2 0.41359875E2 (0.123E2, 0.31415927E1, 0.123E1): 0.3987159E2 0.3987159E2 (0.123E2, 0.31415927E1, 0.123): 0.3876459E2 0.3876459E2 (0.123E2, 0.31415927E1, 0.123E~2): 0.38642822E2 0.38642822E2 (0.123E2, 0.31415927E1, 0.11754944E~37): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, 0.5877472E~38): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, 0.1E~44): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, 0.0): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, ~0.123E4): ~0.11913584E4 ~0.11913584E4 (0.123E2, 0.31415927E1, ~0.123E2): 0.2634159E2 0.2634159E2 (0.123E2, 0.31415927E1, ~0.31415927E1): 0.355E2 0.355E2 (0.123E2, 0.31415927E1, ~0.27182817E1): 0.3592331E2 0.3592331E2 (0.123E2, 0.31415927E1, ~0.123E1): 0.3741159E2 0.3741159E2 (0.123E2, 0.31415927E1, ~0.123): 0.38518593E2 0.38518593E2 (0.123E2, 0.31415927E1, ~0.123E~2): 0.3864036E2 0.3864036E2 (0.123E2, 0.31415927E1, ~0.11754944E~37): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, ~0.5877472E~38): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, ~0.1E~44): 0.3864159E2 0.3864159E2 (0.123E2, 0.31415927E1, ~0.0): 0.3864159E2 0.3864159E2 (0.123E2, 0.27182817E1, 0.123E4): 0.12634348E4 0.12634348E4 (0.123E2, 0.27182817E1, 0.123E2): 0.45734867E2 0.45734867E2 (0.123E2, 0.27182817E1, 0.31415927E1): 0.36576458E2 0.36576458E2 (0.123E2, 0.27182817E1, 0.27182817E1): 0.3615315E2 0.3615315E2 (0.123E2, 0.27182817E1, 0.123E1): 0.34664867E2 0.34664867E2 (0.123E2, 0.27182817E1, 0.123): 0.33557865E2 0.33557865E2 (0.123E2, 0.27182817E1, 0.123E~2): 0.33436096E2 0.33436096E2 (0.123E2, 0.27182817E1, 0.11754944E~37): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, 0.5877472E~38): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, 0.1E~44): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, 0.0): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, ~0.123E4): ~0.11965652E4 ~0.11965652E4 (0.123E2, 0.27182817E1, ~0.123E2): 0.21134867E2 0.21134867E2 (0.123E2, 0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293274E2 (0.123E2, 0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716585E2 (0.123E2, 0.27182817E1, ~0.123E1): 0.32204865E2 0.32204865E2 (0.123E2, 0.27182817E1, ~0.123): 0.33311867E2 0.33311867E2 (0.123E2, 0.27182817E1, ~0.123E~2): 0.33433636E2 0.33433636E2 (0.123E2, 0.27182817E1, ~0.11754944E~37): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, ~0.5877472E~38): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, ~0.1E~44): 0.33434868E2 0.33434868E2 (0.123E2, 0.27182817E1, ~0.0): 0.33434868E2 0.33434868E2 (0.123E2, 0.123E1, 0.123E4): 0.1245129E4 0.1245129E4 (0.123E2, 0.123E1, 0.123E2): 0.27429E2 0.27429E2 (0.123E2, 0.123E1, 0.31415927E1): 0.18270594E2 0.18270594E2 (0.123E2, 0.123E1, 0.27182817E1): 0.17847282E2 0.17847282E2 (0.123E2, 0.123E1, 0.123E1): 0.16359001E2 0.16359001E2 (0.123E2, 0.123E1, 0.123): 0.15252001E2 0.15252001E2 (0.123E2, 0.123E1, 0.123E~2): 0.15130231E2 0.15130231E2 (0.123E2, 0.123E1, 0.11754944E~37): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, 0.5877472E~38): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, 0.1E~44): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, 0.0): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (0.123E2, 0.123E1, ~0.123E2): 0.28290002E1 0.28290002E1 (0.123E2, 0.123E1, ~0.31415927E1): 0.11987408E2 0.11987408E2 (0.123E2, 0.123E1, ~0.27182817E1): 0.12410719E2 0.12410719E2 (0.123E2, 0.123E1, ~0.123E1): 0.13899E2 0.13899E2 (0.123E2, 0.123E1, ~0.123): 0.150060005E2 0.150060005E2 (0.123E2, 0.123E1, ~0.123E~2): 0.1512777E2 0.1512777E2 (0.123E2, 0.123E1, ~0.11754944E~37): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, ~0.5877472E~38): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, ~0.1E~44): 0.15129001E2 0.15129001E2 (0.123E2, 0.123E1, ~0.0): 0.15129001E2 0.15129001E2 (0.123E2, 0.123, 0.123E4): 0.1231513E4 0.1231513E4 (0.123E2, 0.123, 0.123E2): 0.13812901E2 0.13812901E2 (0.123E2, 0.123, 0.31415927E1): 0.4654493E1 0.4654493E1 (0.123E2, 0.123, 0.27182817E1): 0.42311816E1 0.42311816E1 (0.123E2, 0.123, 0.123E1): 0.27429001E1 0.27429001E1 (0.123E2, 0.123, 0.123): 0.16359E1 0.16359E1 (0.123E2, 0.123, 0.123E~2): 0.15141301E1 0.15141301E1 (0.123E2, 0.123, 0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, 0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, 0.1E~44): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, 0.0): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (0.123E2, 0.123, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E2, 0.123, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (0.123E2, 0.123, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (0.123E2, 0.123, ~0.123E1): 0.28290004 0.28290004 (0.123E2, 0.123, ~0.123): 0.13899001E1 0.13899001E1 (0.123E2, 0.123, ~0.123E~2): 0.15116701E1 0.15116701E1 (0.123E2, 0.123, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, ~0.1E~44): 0.15129001E1 0.15129001E1 (0.123E2, 0.123, ~0.0): 0.15129001E1 0.15129001E1 (0.123E2, 0.123E~2, 0.123E4): 0.12300151E4 0.12300151E4 (0.123E2, 0.123E~2, 0.123E2): 0.12315129E2 0.12315129E2 (0.123E2, 0.123E~2, 0.31415927E1): 0.31567218E1 0.31567218E1 (0.123E2, 0.123E~2, 0.27182817E1): 0.27334108E1 0.27334108E1 (0.123E2, 0.123E~2, 0.123E1): 0.1245129E1 0.1245129E1 (0.123E2, 0.123E~2, 0.123): 0.13812901 0.13812901 (0.123E2, 0.123E~2, 0.123E~2): 0.16359001E~1 0.16359001E~1 (0.123E2, 0.123E~2, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, 0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, 0.0): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (0.123E2, 0.123E~2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123E2, 0.123E~2, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (0.123E2, 0.123E~2, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (0.123E2, 0.123E~2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123E2, 0.123E~2, ~0.123): ~0.107871 ~0.107871 (0.123E2, 0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899001E~1 (0.123E2, 0.123E~2, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.123E~2, ~0.0): 0.15129001E~1 0.15129001E~1 (0.123E2, 0.11754944E~37, 0.1E~44): 0.14458581E~36 0.14458581E~36 (0.123E2, 0.11754944E~37, ~0.1E~44): 0.14458581E~36 0.14458581E~36 (0.123E2, 0.5877472E~38, 0.1E~44): 0.72292904E~37 0.72292904E~37 (0.123E2, 0.5877472E~38, ~0.1E~44): 0.72292904E~37 0.72292904E~37 (0.123E2, 0.1E~44, 0.11754944E~37): 0.1175496E~37 0.1175496E~37 (0.123E2, 0.1E~44, 0.5877472E~38): 0.5877489E~38 0.5877489E~38 (0.123E2, 0.1E~44, 0.1E~44): 0.18E~43 0.18E~43 (0.123E2, 0.1E~44, 0.0): 0.17E~43 0.17E~43 (0.123E2, 0.1E~44, ~0.11754944E~37): ~0.11754927E~37 ~0.11754927E~37 (0.123E2, 0.1E~44, ~0.5877472E~38): ~0.5877455E~38 ~0.5877455E~38 (0.123E2, 0.1E~44, ~0.1E~44): 0.15E~43 0.15E~43 (0.123E2, 0.1E~44, ~0.0): 0.17E~43 0.17E~43 (0.123E2, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.123E2, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.123E2, ~0.34028235E39, 0.123E4): ~inf ~inf (0.123E2, ~0.34028235E39, 0.123E2): ~inf ~inf (0.123E2, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.123E2, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.123E2, ~0.34028235E39, 0.123E1): ~inf ~inf (0.123E2, ~0.34028235E39, 0.123): ~inf ~inf (0.123E2, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.123E2, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.123E2, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.123E2, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.123E2, ~0.34028235E39, 0.0): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.123): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.123E2, ~0.34028235E39, ~0.0): ~inf ~inf (0.123E2, ~0.17014117E39, 0.34028235E39): ~inf ~inf (0.123E2, ~0.17014117E39, 0.17014117E39): ~inf ~inf (0.123E2, ~0.17014117E39, 0.123E4): ~inf ~inf (0.123E2, ~0.17014117E39, 0.123E2): ~inf ~inf (0.123E2, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.123E2, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.123E2, ~0.17014117E39, 0.123E1): ~inf ~inf (0.123E2, ~0.17014117E39, 0.123): ~inf ~inf (0.123E2, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.123E2, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.123E2, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.123E2, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.123E2, ~0.17014117E39, 0.0): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.123): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.123E2, ~0.17014117E39, ~0.0): ~inf ~inf (0.123E2, ~0.123E4, 0.123E4): ~0.13899E5 ~0.13899E5 (0.123E2, ~0.123E4, 0.123E2): ~0.151167E5 ~0.151167E5 (0.123E2, ~0.123E4, 0.31415927E1): ~0.15125858E5 ~0.15125858E5 (0.123E2, ~0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126282E5 (0.123E2, ~0.123E4, 0.123E1): ~0.151277705E5 ~0.151277705E5 (0.123E2, ~0.123E4, 0.123): ~0.15128877E5 ~0.15128877E5 (0.123E2, ~0.123E4, 0.123E~2): ~0.15128999E5 ~0.15128999E5 (0.123E2, ~0.123E4, 0.11754944E~37): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.5877472E~38): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.1E~44): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.0): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.123E4): ~0.16359E5 ~0.16359E5 (0.123E2, ~0.123E4, ~0.123E2): ~0.151413E5 ~0.151413E5 (0.123E2, ~0.123E4, ~0.31415927E1): ~0.15132142E5 ~0.15132142E5 (0.123E2, ~0.123E4, ~0.27182817E1): ~0.15131719E5 ~0.15131719E5 (0.123E2, ~0.123E4, ~0.123E1): ~0.1513023E5 ~0.1513023E5 (0.123E2, ~0.123E4, ~0.123): ~0.15129123E5 ~0.15129123E5 (0.123E2, ~0.123E4, ~0.123E~2): ~0.15129001E5 ~0.15129001E5 (0.123E2, ~0.123E4, ~0.11754944E~37): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.5877472E~38): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.1E~44): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.0): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E2, 0.123E4): 0.107871E4 0.107871E4 (0.123E2, ~0.123E2, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123E2, ~0.123E2, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (0.123E2, ~0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (0.123E2, ~0.123E2, 0.123E1): ~0.15006E3 ~0.15006E3 (0.123E2, ~0.123E2, 0.123): ~0.151167E3 ~0.151167E3 (0.123E2, ~0.123E2, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (0.123E2, ~0.123E2, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, 0.0): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123E2, ~0.123E2, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (0.123E2, ~0.123E2, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (0.123E2, ~0.123E2, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (0.123E2, ~0.123E2, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123E2, ~0.123E2, ~0.123): ~0.15141301E3 ~0.15141301E3 (0.123E2, ~0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (0.123E2, ~0.123E2, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.123E2, ~0.0): ~0.15129001E3 ~0.15129001E3 (0.123E2, ~0.31415927E1, 0.123E4): 0.11913584E4 0.11913584E4 (0.123E2, ~0.31415927E1, 0.123E2): ~0.2634159E2 ~0.2634159E2 (0.123E2, ~0.31415927E1, 0.31415927E1): ~0.355E2 ~0.355E2 (0.123E2, ~0.31415927E1, 0.27182817E1): ~0.3592331E2 ~0.3592331E2 (0.123E2, ~0.31415927E1, 0.123E1): ~0.3741159E2 ~0.3741159E2 (0.123E2, ~0.31415927E1, 0.123): ~0.38518593E2 ~0.38518593E2 (0.123E2, ~0.31415927E1, 0.123E~2): ~0.3864036E2 ~0.3864036E2 (0.123E2, ~0.31415927E1, 0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, 0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, 0.1E~44): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, 0.0): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, ~0.123E4): ~0.12686416E4 ~0.12686416E4 (0.123E2, ~0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.50941593E2 (0.123E2, ~0.31415927E1, ~0.31415927E1): ~0.41783184E2 ~0.41783184E2 (0.123E2, ~0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.41359875E2 (0.123E2, ~0.31415927E1, ~0.123E1): ~0.3987159E2 ~0.3987159E2 (0.123E2, ~0.31415927E1, ~0.123): ~0.3876459E2 ~0.3876459E2 (0.123E2, ~0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.38642822E2 (0.123E2, ~0.31415927E1, ~0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, ~0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, ~0.1E~44): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.31415927E1, ~0.0): ~0.3864159E2 ~0.3864159E2 (0.123E2, ~0.27182817E1, 0.123E4): 0.11965652E4 0.11965652E4 (0.123E2, ~0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134867E2 (0.123E2, ~0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293274E2 (0.123E2, ~0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716585E2 (0.123E2, ~0.27182817E1, 0.123E1): ~0.32204865E2 ~0.32204865E2 (0.123E2, ~0.27182817E1, 0.123): ~0.33311867E2 ~0.33311867E2 (0.123E2, ~0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.33433636E2 (0.123E2, ~0.27182817E1, 0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, 0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, 0.1E~44): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, 0.0): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, ~0.123E4): ~0.12634348E4 ~0.12634348E4 (0.123E2, ~0.27182817E1, ~0.123E2): ~0.45734867E2 ~0.45734867E2 (0.123E2, ~0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.36576458E2 (0.123E2, ~0.27182817E1, ~0.27182817E1): ~0.3615315E2 ~0.3615315E2 (0.123E2, ~0.27182817E1, ~0.123E1): ~0.34664867E2 ~0.34664867E2 (0.123E2, ~0.27182817E1, ~0.123): ~0.33557865E2 ~0.33557865E2 (0.123E2, ~0.27182817E1, ~0.123E~2): ~0.33436096E2 ~0.33436096E2 (0.123E2, ~0.27182817E1, ~0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, ~0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, ~0.1E~44): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.27182817E1, ~0.0): ~0.33434868E2 ~0.33434868E2 (0.123E2, ~0.123E1, 0.123E4): 0.1214871E4 0.1214871E4 (0.123E2, ~0.123E1, 0.123E2): ~0.28290002E1 ~0.28290002E1 (0.123E2, ~0.123E1, 0.31415927E1): ~0.11987408E2 ~0.11987408E2 (0.123E2, ~0.123E1, 0.27182817E1): ~0.12410719E2 ~0.12410719E2 (0.123E2, ~0.123E1, 0.123E1): ~0.13899E2 ~0.13899E2 (0.123E2, ~0.123E1, 0.123): ~0.150060005E2 ~0.150060005E2 (0.123E2, ~0.123E1, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (0.123E2, ~0.123E1, 0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, 0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, 0.1E~44): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, 0.0): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (0.123E2, ~0.123E1, ~0.123E2): ~0.27429E2 ~0.27429E2 (0.123E2, ~0.123E1, ~0.31415927E1): ~0.18270594E2 ~0.18270594E2 (0.123E2, ~0.123E1, ~0.27182817E1): ~0.17847282E2 ~0.17847282E2 (0.123E2, ~0.123E1, ~0.123E1): ~0.16359001E2 ~0.16359001E2 (0.123E2, ~0.123E1, ~0.123): ~0.15252001E2 ~0.15252001E2 (0.123E2, ~0.123E1, ~0.123E~2): ~0.15130231E2 ~0.15130231E2 (0.123E2, ~0.123E1, ~0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, ~0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, ~0.1E~44): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123E1, ~0.0): ~0.15129001E2 ~0.15129001E2 (0.123E2, ~0.123, 0.123E4): 0.1228487E4 0.1228487E4 (0.123E2, ~0.123, 0.123E2): 0.107871E2 0.107871E2 (0.123E2, ~0.123, 0.31415927E1): 0.16286926E1 0.16286926E1 (0.123E2, ~0.123, 0.27182817E1): 0.12053816E1 0.12053816E1 (0.123E2, ~0.123, 0.123E1): ~0.28290004 ~0.28290004 (0.123E2, ~0.123, 0.123): ~0.13899001E1 ~0.13899001E1 (0.123E2, ~0.123, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (0.123E2, ~0.123, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, 0.0): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (0.123E2, ~0.123, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (0.123E2, ~0.123, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (0.123E2, ~0.123, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (0.123E2, ~0.123, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (0.123E2, ~0.123, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E2, ~0.123, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (0.123E2, ~0.123, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123, ~0.0): ~0.15129001E1 ~0.15129001E1 (0.123E2, ~0.123E~2, 0.123E4): 0.12299849E4 0.12299849E4 (0.123E2, ~0.123E~2, 0.123E2): 0.12284871E2 0.12284871E2 (0.123E2, ~0.123E~2, 0.31415927E1): 0.31264637E1 0.31264637E1 (0.123E2, ~0.123E~2, 0.27182817E1): 0.27031527E1 0.27031527E1 (0.123E2, ~0.123E~2, 0.123E1): 0.1214871E1 0.1214871E1 (0.123E2, ~0.123E~2, 0.123): 0.107871 0.107871 (0.123E2, ~0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899001E~1 (0.123E2, ~0.123E~2, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, 0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (0.123E2, ~0.123E~2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123E2, ~0.123E~2, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (0.123E2, ~0.123E~2, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (0.123E2, ~0.123E~2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123E2, ~0.123E~2, ~0.123): ~0.13812901 ~0.13812901 (0.123E2, ~0.123E~2, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (0.123E2, ~0.123E~2, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.123E~2, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123E2, ~0.11754944E~37, 0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (0.123E2, ~0.11754944E~37, ~0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (0.123E2, ~0.5877472E~38, 0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (0.123E2, ~0.5877472E~38, ~0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (0.123E2, ~0.1E~44, 0.11754944E~37): 0.11754927E~37 0.11754927E~37 (0.123E2, ~0.1E~44, 0.5877472E~38): 0.5877455E~38 0.5877455E~38 (0.123E2, ~0.1E~44, 0.1E~44): ~0.15E~43 ~0.15E~43 (0.123E2, ~0.1E~44, 0.0): ~0.17E~43 ~0.17E~43 (0.123E2, ~0.1E~44, ~0.11754944E~37): ~0.1175496E~37 ~0.1175496E~37 (0.123E2, ~0.1E~44, ~0.5877472E~38): ~0.5877489E~38 ~0.5877489E~38 (0.123E2, ~0.1E~44, ~0.1E~44): ~0.18E~43 ~0.18E~43 (0.123E2, ~0.1E~44, ~0.0): ~0.17E~43 ~0.17E~43 (0.31415927E1, 0.34028235E39, 0.34028235E39): inf inf (0.31415927E1, 0.34028235E39, 0.17014117E39): inf inf (0.31415927E1, 0.34028235E39, 0.123E4): inf inf (0.31415927E1, 0.34028235E39, 0.123E2): inf inf (0.31415927E1, 0.34028235E39, 0.31415927E1): inf inf (0.31415927E1, 0.34028235E39, 0.27182817E1): inf inf (0.31415927E1, 0.34028235E39, 0.123E1): inf inf (0.31415927E1, 0.34028235E39, 0.123): inf inf (0.31415927E1, 0.34028235E39, 0.123E~2): inf inf (0.31415927E1, 0.34028235E39, 0.11754944E~37): inf inf (0.31415927E1, 0.34028235E39, 0.5877472E~38): inf inf (0.31415927E1, 0.34028235E39, 0.1E~44): inf inf (0.31415927E1, 0.34028235E39, 0.0): inf inf (0.31415927E1, 0.34028235E39, ~0.34028235E39): inf inf (0.31415927E1, 0.34028235E39, ~0.17014117E39): inf inf (0.31415927E1, 0.34028235E39, ~0.123E4): inf inf (0.31415927E1, 0.34028235E39, ~0.123E2): inf inf (0.31415927E1, 0.34028235E39, ~0.31415927E1): inf inf (0.31415927E1, 0.34028235E39, ~0.27182817E1): inf inf (0.31415927E1, 0.34028235E39, ~0.123E1): inf inf (0.31415927E1, 0.34028235E39, ~0.123): inf inf (0.31415927E1, 0.34028235E39, ~0.123E~2): inf inf (0.31415927E1, 0.34028235E39, ~0.11754944E~37): inf inf (0.31415927E1, 0.34028235E39, ~0.5877472E~38): inf inf (0.31415927E1, 0.34028235E39, ~0.1E~44): inf inf (0.31415927E1, 0.34028235E39, ~0.0): inf inf (0.31415927E1, 0.17014117E39, 0.34028235E39): inf inf (0.31415927E1, 0.17014117E39, 0.17014117E39): inf inf (0.31415927E1, 0.17014117E39, 0.123E4): inf inf (0.31415927E1, 0.17014117E39, 0.123E2): inf inf (0.31415927E1, 0.17014117E39, 0.31415927E1): inf inf (0.31415927E1, 0.17014117E39, 0.27182817E1): inf inf (0.31415927E1, 0.17014117E39, 0.123E1): inf inf (0.31415927E1, 0.17014117E39, 0.123): inf inf (0.31415927E1, 0.17014117E39, 0.123E~2): inf inf (0.31415927E1, 0.17014117E39, 0.11754944E~37): inf inf (0.31415927E1, 0.17014117E39, 0.5877472E~38): inf inf (0.31415927E1, 0.17014117E39, 0.1E~44): inf inf (0.31415927E1, 0.17014117E39, 0.0): inf inf (0.31415927E1, 0.17014117E39, ~0.34028235E39): 0.19423192E39 0.19423192E39 (0.31415927E1, 0.17014117E39, ~0.17014117E39): inf inf (0.31415927E1, 0.17014117E39, ~0.123E4): inf inf (0.31415927E1, 0.17014117E39, ~0.123E2): inf inf (0.31415927E1, 0.17014117E39, ~0.31415927E1): inf inf (0.31415927E1, 0.17014117E39, ~0.27182817E1): inf inf (0.31415927E1, 0.17014117E39, ~0.123E1): inf inf (0.31415927E1, 0.17014117E39, ~0.123): inf inf (0.31415927E1, 0.17014117E39, ~0.123E~2): inf inf (0.31415927E1, 0.17014117E39, ~0.11754944E~37): inf inf (0.31415927E1, 0.17014117E39, ~0.5877472E~38): inf inf (0.31415927E1, 0.17014117E39, ~0.1E~44): inf inf (0.31415927E1, 0.17014117E39, ~0.0): inf inf (0.31415927E1, 0.123E4, 0.123E4): 0.5094159E4 0.5094159E4 (0.31415927E1, 0.123E4, 0.123E2): 0.3876459E4 0.3876459E4 (0.31415927E1, 0.123E4, 0.31415927E1): 0.38673008E4 0.38673008E4 (0.31415927E1, 0.123E4, 0.27182817E1): 0.38668774E4 0.38668774E4 (0.31415927E1, 0.123E4, 0.123E1): 0.38653892E4 0.38653892E4 (0.31415927E1, 0.123E4, 0.123): 0.3864282E4 0.3864282E4 (0.31415927E1, 0.123E4, 0.123E~2): 0.38641604E4 0.38641604E4 (0.31415927E1, 0.123E4, 0.11754944E~37): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, 0.5877472E~38): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, 0.1E~44): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, 0.0): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, ~0.123E4): 0.26341592E4 0.26341592E4 (0.31415927E1, 0.123E4, ~0.123E2): 0.38518591E4 0.38518591E4 (0.31415927E1, 0.123E4, ~0.31415927E1): 0.38610176E4 0.38610176E4 (0.31415927E1, 0.123E4, ~0.27182817E1): 0.38614407E4 0.38614407E4 (0.31415927E1, 0.123E4, ~0.123E1): 0.3862929E4 0.3862929E4 (0.31415927E1, 0.123E4, ~0.123): 0.38640361E4 0.38640361E4 (0.31415927E1, 0.123E4, ~0.123E~2): 0.3864158E4 0.3864158E4 (0.31415927E1, 0.123E4, ~0.11754944E~37): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, ~0.5877472E~38): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, ~0.1E~44): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E4, ~0.0): 0.38641592E4 0.38641592E4 (0.31415927E1, 0.123E2, 0.123E4): 0.12686416E4 0.12686416E4 (0.31415927E1, 0.123E2, 0.123E2): 0.50941593E2 0.50941593E2 (0.31415927E1, 0.123E2, 0.31415927E1): 0.41783184E2 0.41783184E2 (0.31415927E1, 0.123E2, 0.27182817E1): 0.41359875E2 0.41359875E2 (0.31415927E1, 0.123E2, 0.123E1): 0.3987159E2 0.3987159E2 (0.31415927E1, 0.123E2, 0.123): 0.3876459E2 0.3876459E2 (0.31415927E1, 0.123E2, 0.123E~2): 0.38642822E2 0.38642822E2 (0.31415927E1, 0.123E2, 0.11754944E~37): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, 0.5877472E~38): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, 0.1E~44): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, 0.0): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, ~0.123E4): ~0.11913584E4 ~0.11913584E4 (0.31415927E1, 0.123E2, ~0.123E2): 0.2634159E2 0.2634159E2 (0.31415927E1, 0.123E2, ~0.31415927E1): 0.355E2 0.355E2 (0.31415927E1, 0.123E2, ~0.27182817E1): 0.3592331E2 0.3592331E2 (0.31415927E1, 0.123E2, ~0.123E1): 0.3741159E2 0.3741159E2 (0.31415927E1, 0.123E2, ~0.123): 0.38518593E2 0.38518593E2 (0.31415927E1, 0.123E2, ~0.123E~2): 0.3864036E2 0.3864036E2 (0.31415927E1, 0.123E2, ~0.11754944E~37): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, ~0.5877472E~38): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, ~0.1E~44): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.123E2, ~0.0): 0.3864159E2 0.3864159E2 (0.31415927E1, 0.31415927E1, 0.123E4): 0.12398696E4 0.12398696E4 (0.31415927E1, 0.31415927E1, 0.123E2): 0.22169605E2 0.22169605E2 (0.31415927E1, 0.31415927E1, 0.31415927E1): 0.13011198E2 0.13011198E2 (0.31415927E1, 0.31415927E1, 0.27182817E1): 0.12587887E2 0.12587887E2 (0.31415927E1, 0.31415927E1, 0.123E1): 0.11099605E2 0.11099605E2 (0.31415927E1, 0.31415927E1, 0.123): 0.9992605E1 0.9992605E1 (0.31415927E1, 0.31415927E1, 0.123E~2): 0.9870835E1 0.9870835E1 (0.31415927E1, 0.31415927E1, 0.11754944E~37): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, 0.5877472E~38): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, 0.1E~44): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, 0.0): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, ~0.123E4): ~0.12201304E4 ~0.12201304E4 (0.31415927E1, 0.31415927E1, ~0.123E2): ~0.24303951E1 ~0.24303951E1 (0.31415927E1, 0.31415927E1, ~0.31415927E1): 0.6728012E1 0.6728012E1 (0.31415927E1, 0.31415927E1, ~0.27182817E1): 0.71513233E1 0.71513233E1 (0.31415927E1, 0.31415927E1, ~0.123E1): 0.8639605E1 0.8639605E1 (0.31415927E1, 0.31415927E1, ~0.123): 0.9746605E1 0.9746605E1 (0.31415927E1, 0.31415927E1, ~0.123E~2): 0.9868375E1 0.9868375E1 (0.31415927E1, 0.31415927E1, ~0.11754944E~37): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, ~0.5877472E~38): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, ~0.1E~44): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.31415927E1, ~0.0): 0.9869605E1 0.9869605E1 (0.31415927E1, 0.27182817E1, 0.123E4): 0.12385398E4 0.12385398E4 (0.31415927E1, 0.27182817E1, 0.123E2): 0.20839735E2 0.20839735E2 (0.31415927E1, 0.27182817E1, 0.31415927E1): 0.11681327E2 0.11681327E2 (0.31415927E1, 0.27182817E1, 0.27182817E1): 0.11258016E2 0.11258016E2 (0.31415927E1, 0.27182817E1, 0.123E1): 0.9769734E1 0.9769734E1 (0.31415927E1, 0.27182817E1, 0.123): 0.8662734E1 0.8662734E1 (0.31415927E1, 0.27182817E1, 0.123E~2): 0.8540964E1 0.8540964E1 (0.31415927E1, 0.27182817E1, 0.11754944E~37): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, 0.5877472E~38): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, 0.1E~44): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, 0.0): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, ~0.123E4): ~0.12214602E4 ~0.12214602E4 (0.31415927E1, 0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.3760266E1 (0.31415927E1, 0.27182817E1, ~0.31415927E1): 0.53981414E1 0.53981414E1 (0.31415927E1, 0.27182817E1, ~0.27182817E1): 0.58214526E1 0.58214526E1 (0.31415927E1, 0.27182817E1, ~0.123E1): 0.73097343E1 0.73097343E1 (0.31415927E1, 0.27182817E1, ~0.123): 0.8416734E1 0.8416734E1 (0.31415927E1, 0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538505E1 (0.31415927E1, 0.27182817E1, ~0.11754944E~37): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, ~0.5877472E~38): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, ~0.1E~44): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.27182817E1, ~0.0): 0.8539734E1 0.8539734E1 (0.31415927E1, 0.123E1, 0.123E4): 0.12338641E4 0.12338641E4 (0.31415927E1, 0.123E1, 0.123E2): 0.1616416E2 0.1616416E2 (0.31415927E1, 0.123E1, 0.31415927E1): 0.7005752E1 0.7005752E1 (0.31415927E1, 0.123E1, 0.27182817E1): 0.6582441E1 0.6582441E1 (0.31415927E1, 0.123E1, 0.123E1): 0.5094159E1 0.5094159E1 (0.31415927E1, 0.123E1, 0.123): 0.39871593E1 0.39871593E1 (0.31415927E1, 0.123E1, 0.123E~2): 0.3865389E1 0.3865389E1 (0.31415927E1, 0.123E1, 0.11754944E~37): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, 0.5877472E~38): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, 0.1E~44): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, 0.0): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, ~0.123E4): ~0.12261359E4 ~0.12261359E4 (0.31415927E1, 0.123E1, ~0.123E2): ~0.8435841E1 ~0.8435841E1 (0.31415927E1, 0.123E1, ~0.31415927E1): 0.72256637 0.72256637 (0.31415927E1, 0.123E1, ~0.27182817E1): 0.11458774E1 0.11458774E1 (0.31415927E1, 0.123E1, ~0.123E1): 0.2634159E1 0.2634159E1 (0.31415927E1, 0.123E1, ~0.123): 0.37411592E1 0.37411592E1 (0.31415927E1, 0.123E1, ~0.123E~2): 0.3862929E1 0.3862929E1 (0.31415927E1, 0.123E1, ~0.11754944E~37): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, ~0.5877472E~38): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, ~0.1E~44): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123E1, ~0.0): 0.3864159E1 0.3864159E1 (0.31415927E1, 0.123, 0.123E4): 0.12303865E4 0.12303865E4 (0.31415927E1, 0.123, 0.123E2): 0.12686416E2 0.12686416E2 (0.31415927E1, 0.123, 0.31415927E1): 0.35280087E1 0.35280087E1 (0.31415927E1, 0.123, 0.27182817E1): 0.31046977E1 0.31046977E1 (0.31415927E1, 0.123, 0.123E1): 0.1616416E1 0.1616416E1 (0.31415927E1, 0.123, 0.123): 0.5094159 0.5094159 (0.31415927E1, 0.123, 0.123E~2): 0.38764593 0.38764593 (0.31415927E1, 0.123, 0.11754944E~37): 0.38641593 0.38641593 (0.31415927E1, 0.123, 0.5877472E~38): 0.38641593 0.38641593 (0.31415927E1, 0.123, 0.1E~44): 0.38641593 0.38641593 (0.31415927E1, 0.123, 0.0): 0.38641593 0.38641593 (0.31415927E1, 0.123, ~0.123E4): ~0.12296135E4 ~0.12296135E4 (0.31415927E1, 0.123, ~0.123E2): ~0.11913585E2 ~0.11913585E2 (0.31415927E1, 0.123, ~0.31415927E1): ~0.27551768E1 ~0.27551768E1 (0.31415927E1, 0.123, ~0.27182817E1): ~0.23318658E1 ~0.23318658E1 (0.31415927E1, 0.123, ~0.123E1): ~0.8435841 ~0.8435841 (0.31415927E1, 0.123, ~0.123): 0.2634159 0.2634159 (0.31415927E1, 0.123, ~0.123E~2): 0.38518593 0.38518593 (0.31415927E1, 0.123, ~0.11754944E~37): 0.38641593 0.38641593 (0.31415927E1, 0.123, ~0.5877472E~38): 0.38641593 0.38641593 (0.31415927E1, 0.123, ~0.1E~44): 0.38641593 0.38641593 (0.31415927E1, 0.123, ~0.0): 0.38641593 0.38641593 (0.31415927E1, 0.123E~2, 0.123E4): 0.12300039E4 0.12300039E4 (0.31415927E1, 0.123E~2, 0.123E2): 0.123038645E2 0.123038645E2 (0.31415927E1, 0.123E~2, 0.31415927E1): 0.31454568E1 0.31454568E1 (0.31415927E1, 0.123E~2, 0.27182817E1): 0.27221458E1 0.27221458E1 (0.31415927E1, 0.123E~2, 0.123E1): 0.12338642E1 0.12338642E1 (0.31415927E1, 0.123E~2, 0.123): 0.12686417 0.12686417 (0.31415927E1, 0.123E~2, 0.123E~2): 0.50941594E~2 0.50941594E~2 (0.31415927E1, 0.123E~2, 0.11754944E~37): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, 0.5877472E~38): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, 0.1E~44): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, 0.0): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, ~0.123E4): ~0.12299961E4 ~0.12299961E4 (0.31415927E1, 0.123E~2, ~0.123E2): ~0.12296136E2 ~0.12296136E2 (0.31415927E1, 0.123E~2, ~0.31415927E1): ~0.31377287E1 ~0.31377287E1 (0.31415927E1, 0.123E~2, ~0.27182817E1): ~0.27144177E1 ~0.27144177E1 (0.31415927E1, 0.123E~2, ~0.123E1): ~0.12261358E1 ~0.12261358E1 (0.31415927E1, 0.123E~2, ~0.123): ~0.11913584 ~0.11913584 (0.31415927E1, 0.123E~2, ~0.123E~2): 0.26341593E~2 0.26341593E~2 (0.31415927E1, 0.123E~2, ~0.11754944E~37): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, ~0.5877472E~38): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, ~0.1E~44): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.123E~2, ~0.0): 0.38641593E~2 0.38641593E~2 (0.31415927E1, 0.11754944E~37, 0.11754944E~37): 0.4868419E~37 0.4868419E~37 (0.31415927E1, 0.11754944E~37, 0.1E~44): 0.36929248E~37 0.36929248E~37 (0.31415927E1, 0.11754944E~37, ~0.1E~44): 0.36929242E~37 0.36929242E~37 (0.31415927E1, 0.5877472E~38, 0.11754944E~37): 0.30219568E~37 0.30219568E~37 (0.31415927E1, 0.5877472E~38, 0.5877472E~38): 0.24342096E~37 0.24342096E~37 (0.31415927E1, 0.1E~44, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (0.31415927E1, 0.1E~44, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (0.31415927E1, 0.1E~44, 0.1E~44): 0.6E~44 0.6E~44 (0.31415927E1, 0.1E~44, 0.0): 0.4E~44 0.4E~44 (0.31415927E1, 0.1E~44, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (0.31415927E1, 0.1E~44, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (0.31415927E1, 0.1E~44, ~0.1E~44): 0.3E~44 0.3E~44 (0.31415927E1, 0.1E~44, ~0.0): 0.4E~44 0.4E~44 (0.31415927E1, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.123E4): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.123E2): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.123E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.123): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.31415927E1, ~0.34028235E39, 0.0): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.123): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.31415927E1, ~0.34028235E39, ~0.0): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.34028235E39): ~0.19423192E39 ~0.19423192E39 (0.31415927E1, ~0.17014117E39, 0.17014117E39): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.123E4): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.123E2): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.123E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.123): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.31415927E1, ~0.17014117E39, 0.0): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.123): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.31415927E1, ~0.17014117E39, ~0.0): ~inf ~inf (0.31415927E1, ~0.123E4, 0.123E4): ~0.26341592E4 ~0.26341592E4 (0.31415927E1, ~0.123E4, 0.123E2): ~0.38518591E4 ~0.38518591E4 (0.31415927E1, ~0.123E4, 0.31415927E1): ~0.38610176E4 ~0.38610176E4 (0.31415927E1, ~0.123E4, 0.27182817E1): ~0.38614407E4 ~0.38614407E4 (0.31415927E1, ~0.123E4, 0.123E1): ~0.3862929E4 ~0.3862929E4 (0.31415927E1, ~0.123E4, 0.123): ~0.38640361E4 ~0.38640361E4 (0.31415927E1, ~0.123E4, 0.123E~2): ~0.3864158E4 ~0.3864158E4 (0.31415927E1, ~0.123E4, 0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, 0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, 0.1E~44): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, 0.0): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, ~0.123E4): ~0.5094159E4 ~0.5094159E4 (0.31415927E1, ~0.123E4, ~0.123E2): ~0.3876459E4 ~0.3876459E4 (0.31415927E1, ~0.123E4, ~0.31415927E1): ~0.38673008E4 ~0.38673008E4 (0.31415927E1, ~0.123E4, ~0.27182817E1): ~0.38668774E4 ~0.38668774E4 (0.31415927E1, ~0.123E4, ~0.123E1): ~0.38653892E4 ~0.38653892E4 (0.31415927E1, ~0.123E4, ~0.123): ~0.3864282E4 ~0.3864282E4 (0.31415927E1, ~0.123E4, ~0.123E~2): ~0.38641604E4 ~0.38641604E4 (0.31415927E1, ~0.123E4, ~0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, ~0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, ~0.1E~44): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E4, ~0.0): ~0.38641592E4 ~0.38641592E4 (0.31415927E1, ~0.123E2, 0.123E4): 0.11913584E4 0.11913584E4 (0.31415927E1, ~0.123E2, 0.123E2): ~0.2634159E2 ~0.2634159E2 (0.31415927E1, ~0.123E2, 0.31415927E1): ~0.355E2 ~0.355E2 (0.31415927E1, ~0.123E2, 0.27182817E1): ~0.3592331E2 ~0.3592331E2 (0.31415927E1, ~0.123E2, 0.123E1): ~0.3741159E2 ~0.3741159E2 (0.31415927E1, ~0.123E2, 0.123): ~0.38518593E2 ~0.38518593E2 (0.31415927E1, ~0.123E2, 0.123E~2): ~0.3864036E2 ~0.3864036E2 (0.31415927E1, ~0.123E2, 0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, 0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, 0.1E~44): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, 0.0): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, ~0.123E4): ~0.12686416E4 ~0.12686416E4 (0.31415927E1, ~0.123E2, ~0.123E2): ~0.50941593E2 ~0.50941593E2 (0.31415927E1, ~0.123E2, ~0.31415927E1): ~0.41783184E2 ~0.41783184E2 (0.31415927E1, ~0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.41359875E2 (0.31415927E1, ~0.123E2, ~0.123E1): ~0.3987159E2 ~0.3987159E2 (0.31415927E1, ~0.123E2, ~0.123): ~0.3876459E2 ~0.3876459E2 (0.31415927E1, ~0.123E2, ~0.123E~2): ~0.38642822E2 ~0.38642822E2 (0.31415927E1, ~0.123E2, ~0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, ~0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, ~0.1E~44): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.123E2, ~0.0): ~0.3864159E2 ~0.3864159E2 (0.31415927E1, ~0.31415927E1, 0.123E4): 0.12201304E4 0.12201304E4 (0.31415927E1, ~0.31415927E1, 0.123E2): 0.24303951E1 0.24303951E1 (0.31415927E1, ~0.31415927E1, 0.31415927E1): ~0.6728012E1 ~0.6728012E1 (0.31415927E1, ~0.31415927E1, 0.27182817E1): ~0.71513233E1 ~0.71513233E1 (0.31415927E1, ~0.31415927E1, 0.123E1): ~0.8639605E1 ~0.8639605E1 (0.31415927E1, ~0.31415927E1, 0.123): ~0.9746605E1 ~0.9746605E1 (0.31415927E1, ~0.31415927E1, 0.123E~2): ~0.9868375E1 ~0.9868375E1 (0.31415927E1, ~0.31415927E1, 0.11754944E~37): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, 0.5877472E~38): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, 0.1E~44): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, 0.0): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, ~0.123E4): ~0.12398696E4 ~0.12398696E4 (0.31415927E1, ~0.31415927E1, ~0.123E2): ~0.22169605E2 ~0.22169605E2 (0.31415927E1, ~0.31415927E1, ~0.31415927E1): ~0.13011198E2 ~0.13011198E2 (0.31415927E1, ~0.31415927E1, ~0.27182817E1): ~0.12587887E2 ~0.12587887E2 (0.31415927E1, ~0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099605E2 (0.31415927E1, ~0.31415927E1, ~0.123): ~0.9992605E1 ~0.9992605E1 (0.31415927E1, ~0.31415927E1, ~0.123E~2): ~0.9870835E1 ~0.9870835E1 (0.31415927E1, ~0.31415927E1, ~0.11754944E~37): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, ~0.5877472E~38): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, ~0.1E~44): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.31415927E1, ~0.0): ~0.9869605E1 ~0.9869605E1 (0.31415927E1, ~0.27182817E1, 0.123E4): 0.12214602E4 0.12214602E4 (0.31415927E1, ~0.27182817E1, 0.123E2): 0.3760266E1 0.3760266E1 (0.31415927E1, ~0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.53981414E1 (0.31415927E1, ~0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.58214526E1 (0.31415927E1, ~0.27182817E1, 0.123E1): ~0.73097343E1 ~0.73097343E1 (0.31415927E1, ~0.27182817E1, 0.123): ~0.8416734E1 ~0.8416734E1 (0.31415927E1, ~0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538505E1 (0.31415927E1, ~0.27182817E1, 0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, 0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, 0.1E~44): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, 0.0): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, ~0.123E4): ~0.12385398E4 ~0.12385398E4 (0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839735E2 (0.31415927E1, ~0.27182817E1, ~0.31415927E1): ~0.11681327E2 ~0.11681327E2 (0.31415927E1, ~0.27182817E1, ~0.27182817E1): ~0.11258016E2 ~0.11258016E2 (0.31415927E1, ~0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769734E1 (0.31415927E1, ~0.27182817E1, ~0.123): ~0.8662734E1 ~0.8662734E1 (0.31415927E1, ~0.27182817E1, ~0.123E~2): ~0.8540964E1 ~0.8540964E1 (0.31415927E1, ~0.27182817E1, ~0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, ~0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, ~0.1E~44): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.27182817E1, ~0.0): ~0.8539734E1 ~0.8539734E1 (0.31415927E1, ~0.123E1, 0.123E4): 0.12261359E4 0.12261359E4 (0.31415927E1, ~0.123E1, 0.123E2): 0.8435841E1 0.8435841E1 (0.31415927E1, ~0.123E1, 0.31415927E1): ~0.72256637 ~0.72256637 (0.31415927E1, ~0.123E1, 0.27182817E1): ~0.11458774E1 ~0.11458774E1 (0.31415927E1, ~0.123E1, 0.123E1): ~0.2634159E1 ~0.2634159E1 (0.31415927E1, ~0.123E1, 0.123): ~0.37411592E1 ~0.37411592E1 (0.31415927E1, ~0.123E1, 0.123E~2): ~0.3862929E1 ~0.3862929E1 (0.31415927E1, ~0.123E1, 0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, 0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, 0.1E~44): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, 0.0): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, ~0.123E4): ~0.12338641E4 ~0.12338641E4 (0.31415927E1, ~0.123E1, ~0.123E2): ~0.1616416E2 ~0.1616416E2 (0.31415927E1, ~0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.7005752E1 (0.31415927E1, ~0.123E1, ~0.27182817E1): ~0.6582441E1 ~0.6582441E1 (0.31415927E1, ~0.123E1, ~0.123E1): ~0.5094159E1 ~0.5094159E1 (0.31415927E1, ~0.123E1, ~0.123): ~0.39871593E1 ~0.39871593E1 (0.31415927E1, ~0.123E1, ~0.123E~2): ~0.3865389E1 ~0.3865389E1 (0.31415927E1, ~0.123E1, ~0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, ~0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, ~0.1E~44): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123E1, ~0.0): ~0.3864159E1 ~0.3864159E1 (0.31415927E1, ~0.123, 0.123E4): 0.12296135E4 0.12296135E4 (0.31415927E1, ~0.123, 0.123E2): 0.11913585E2 0.11913585E2 (0.31415927E1, ~0.123, 0.31415927E1): 0.27551768E1 0.27551768E1 (0.31415927E1, ~0.123, 0.27182817E1): 0.23318658E1 0.23318658E1 (0.31415927E1, ~0.123, 0.123E1): 0.8435841 0.8435841 (0.31415927E1, ~0.123, 0.123): ~0.2634159 ~0.2634159 (0.31415927E1, ~0.123, 0.123E~2): ~0.38518593 ~0.38518593 (0.31415927E1, ~0.123, 0.11754944E~37): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, 0.5877472E~38): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, 0.1E~44): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, 0.0): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, ~0.123E4): ~0.12303865E4 ~0.12303865E4 (0.31415927E1, ~0.123, ~0.123E2): ~0.12686416E2 ~0.12686416E2 (0.31415927E1, ~0.123, ~0.31415927E1): ~0.35280087E1 ~0.35280087E1 (0.31415927E1, ~0.123, ~0.27182817E1): ~0.31046977E1 ~0.31046977E1 (0.31415927E1, ~0.123, ~0.123E1): ~0.1616416E1 ~0.1616416E1 (0.31415927E1, ~0.123, ~0.123): ~0.5094159 ~0.5094159 (0.31415927E1, ~0.123, ~0.123E~2): ~0.38764593 ~0.38764593 (0.31415927E1, ~0.123, ~0.11754944E~37): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, ~0.5877472E~38): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, ~0.1E~44): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123, ~0.0): ~0.38641593 ~0.38641593 (0.31415927E1, ~0.123E~2, 0.123E4): 0.12299961E4 0.12299961E4 (0.31415927E1, ~0.123E~2, 0.123E2): 0.12296136E2 0.12296136E2 (0.31415927E1, ~0.123E~2, 0.31415927E1): 0.31377287E1 0.31377287E1 (0.31415927E1, ~0.123E~2, 0.27182817E1): 0.27144177E1 0.27144177E1 (0.31415927E1, ~0.123E~2, 0.123E1): 0.12261358E1 0.12261358E1 (0.31415927E1, ~0.123E~2, 0.123): 0.11913584 0.11913584 (0.31415927E1, ~0.123E~2, 0.123E~2): ~0.26341593E~2 ~0.26341593E~2 (0.31415927E1, ~0.123E~2, 0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, 0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, 0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, 0.0): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, ~0.123E4): ~0.12300039E4 ~0.12300039E4 (0.31415927E1, ~0.123E~2, ~0.123E2): ~0.123038645E2 ~0.123038645E2 (0.31415927E1, ~0.123E~2, ~0.31415927E1): ~0.31454568E1 ~0.31454568E1 (0.31415927E1, ~0.123E~2, ~0.27182817E1): ~0.27221458E1 ~0.27221458E1 (0.31415927E1, ~0.123E~2, ~0.123E1): ~0.12338642E1 ~0.12338642E1 (0.31415927E1, ~0.123E~2, ~0.123): ~0.12686417 ~0.12686417 (0.31415927E1, ~0.123E~2, ~0.123E~2): ~0.50941594E~2 ~0.50941594E~2 (0.31415927E1, ~0.123E~2, ~0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, ~0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, ~0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.123E~2, ~0.0): ~0.38641593E~2 ~0.38641593E~2 (0.31415927E1, ~0.11754944E~37, 0.1E~44): ~0.36929242E~37 ~0.36929242E~37 (0.31415927E1, ~0.11754944E~37, ~0.11754944E~37): ~0.4868419E~37 ~0.4868419E~37 (0.31415927E1, ~0.11754944E~37, ~0.1E~44): ~0.36929248E~37 ~0.36929248E~37 (0.31415927E1, ~0.5877472E~38, ~0.11754944E~37): ~0.30219568E~37 ~0.30219568E~37 (0.31415927E1, ~0.5877472E~38, ~0.5877472E~38): ~0.24342096E~37 ~0.24342096E~37 (0.31415927E1, ~0.1E~44, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (0.31415927E1, ~0.1E~44, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (0.31415927E1, ~0.1E~44, 0.1E~44): ~0.3E~44 ~0.3E~44 (0.31415927E1, ~0.1E~44, 0.0): ~0.4E~44 ~0.4E~44 (0.31415927E1, ~0.1E~44, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (0.31415927E1, ~0.1E~44, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (0.31415927E1, ~0.1E~44, ~0.1E~44): ~0.6E~44 ~0.6E~44 (0.31415927E1, ~0.1E~44, ~0.0): ~0.4E~44 ~0.4E~44 (0.27182817E1, 0.34028235E39, 0.34028235E39): inf inf (0.27182817E1, 0.34028235E39, 0.17014117E39): inf inf (0.27182817E1, 0.34028235E39, 0.123E4): inf inf (0.27182817E1, 0.34028235E39, 0.123E2): inf inf (0.27182817E1, 0.34028235E39, 0.31415927E1): inf inf (0.27182817E1, 0.34028235E39, 0.27182817E1): inf inf (0.27182817E1, 0.34028235E39, 0.123E1): inf inf (0.27182817E1, 0.34028235E39, 0.123): inf inf (0.27182817E1, 0.34028235E39, 0.123E~2): inf inf (0.27182817E1, 0.34028235E39, 0.11754944E~37): inf inf (0.27182817E1, 0.34028235E39, 0.5877472E~38): inf inf (0.27182817E1, 0.34028235E39, 0.1E~44): inf inf (0.27182817E1, 0.34028235E39, 0.0): inf inf (0.27182817E1, 0.34028235E39, ~0.34028235E39): inf inf (0.27182817E1, 0.34028235E39, ~0.17014117E39): inf inf (0.27182817E1, 0.34028235E39, ~0.123E4): inf inf (0.27182817E1, 0.34028235E39, ~0.123E2): inf inf (0.27182817E1, 0.34028235E39, ~0.31415927E1): inf inf (0.27182817E1, 0.34028235E39, ~0.27182817E1): inf inf (0.27182817E1, 0.34028235E39, ~0.123E1): inf inf (0.27182817E1, 0.34028235E39, ~0.123): inf inf (0.27182817E1, 0.34028235E39, ~0.123E~2): inf inf (0.27182817E1, 0.34028235E39, ~0.11754944E~37): inf inf (0.27182817E1, 0.34028235E39, ~0.5877472E~38): inf inf (0.27182817E1, 0.34028235E39, ~0.1E~44): inf inf (0.27182817E1, 0.34028235E39, ~0.0): inf inf (0.27182817E1, 0.17014117E39, 0.34028235E39): inf inf (0.27182817E1, 0.17014117E39, 0.17014117E39): inf inf (0.27182817E1, 0.17014117E39, 0.123E4): inf inf (0.27182817E1, 0.17014117E39, 0.123E2): inf inf (0.27182817E1, 0.17014117E39, 0.31415927E1): inf inf (0.27182817E1, 0.17014117E39, 0.27182817E1): inf inf (0.27182817E1, 0.17014117E39, 0.123E1): inf inf (0.27182817E1, 0.17014117E39, 0.123): inf inf (0.27182817E1, 0.17014117E39, 0.123E~2): inf inf (0.27182817E1, 0.17014117E39, 0.11754944E~37): inf inf (0.27182817E1, 0.17014117E39, 0.5877472E~38): inf inf (0.27182817E1, 0.17014117E39, 0.1E~44): inf inf (0.27182817E1, 0.17014117E39, 0.0): inf inf (0.27182817E1, 0.17014117E39, ~0.34028235E39): 0.1222093E39 0.1222093E39 (0.27182817E1, 0.17014117E39, ~0.17014117E39): 0.29235047E39 0.29235047E39 (0.27182817E1, 0.17014117E39, ~0.123E4): inf inf (0.27182817E1, 0.17014117E39, ~0.123E2): inf inf (0.27182817E1, 0.17014117E39, ~0.31415927E1): inf inf (0.27182817E1, 0.17014117E39, ~0.27182817E1): inf inf (0.27182817E1, 0.17014117E39, ~0.123E1): inf inf (0.27182817E1, 0.17014117E39, ~0.123): inf inf (0.27182817E1, 0.17014117E39, ~0.123E~2): inf inf (0.27182817E1, 0.17014117E39, ~0.11754944E~37): inf inf (0.27182817E1, 0.17014117E39, ~0.5877472E~38): inf inf (0.27182817E1, 0.17014117E39, ~0.1E~44): inf inf (0.27182817E1, 0.17014117E39, ~0.0): inf inf (0.27182817E1, 0.123E4, 0.123E4): 0.45734863E4 0.45734863E4 (0.27182817E1, 0.123E4, 0.123E2): 0.33557866E4 0.33557866E4 (0.27182817E1, 0.123E4, 0.31415927E1): 0.33466282E4 0.33466282E4 (0.27182817E1, 0.123E4, 0.27182817E1): 0.33462048E4 0.33462048E4 (0.27182817E1, 0.123E4, 0.123E1): 0.33447166E4 0.33447166E4 (0.27182817E1, 0.123E4, 0.123): 0.33436096E4 0.33436096E4 (0.27182817E1, 0.123E4, 0.123E~2): 0.33434878E4 0.33434878E4 (0.27182817E1, 0.123E4, 0.11754944E~37): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, 0.5877472E~38): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, 0.1E~44): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, 0.0): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, ~0.123E4): 0.21134866E4 0.21134866E4 (0.27182817E1, 0.123E4, ~0.123E2): 0.33311865E4 0.33311865E4 (0.27182817E1, 0.123E4, ~0.31415927E1): 0.3340345E4 0.3340345E4 (0.27182817E1, 0.123E4, ~0.27182817E1): 0.33407683E4 0.33407683E4 (0.27182817E1, 0.123E4, ~0.123E1): 0.33422566E4 0.33422566E4 (0.27182817E1, 0.123E4, ~0.123): 0.33433635E4 0.33433635E4 (0.27182817E1, 0.123E4, ~0.123E~2): 0.33434854E4 0.33434854E4 (0.27182817E1, 0.123E4, ~0.11754944E~37): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, ~0.5877472E~38): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, ~0.1E~44): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E4, ~0.0): 0.33434866E4 0.33434866E4 (0.27182817E1, 0.123E2, 0.123E4): 0.12634348E4 0.12634348E4 (0.27182817E1, 0.123E2, 0.123E2): 0.45734867E2 0.45734867E2 (0.27182817E1, 0.123E2, 0.31415927E1): 0.36576458E2 0.36576458E2 (0.27182817E1, 0.123E2, 0.27182817E1): 0.3615315E2 0.3615315E2 (0.27182817E1, 0.123E2, 0.123E1): 0.34664867E2 0.34664867E2 (0.27182817E1, 0.123E2, 0.123): 0.33557865E2 0.33557865E2 (0.27182817E1, 0.123E2, 0.123E~2): 0.33436096E2 0.33436096E2 (0.27182817E1, 0.123E2, 0.11754944E~37): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, 0.5877472E~38): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, 0.1E~44): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, 0.0): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, ~0.123E4): ~0.11965652E4 ~0.11965652E4 (0.27182817E1, 0.123E2, ~0.123E2): 0.21134867E2 0.21134867E2 (0.27182817E1, 0.123E2, ~0.31415927E1): 0.30293274E2 0.30293274E2 (0.27182817E1, 0.123E2, ~0.27182817E1): 0.30716585E2 0.30716585E2 (0.27182817E1, 0.123E2, ~0.123E1): 0.32204865E2 0.32204865E2 (0.27182817E1, 0.123E2, ~0.123): 0.33311867E2 0.33311867E2 (0.27182817E1, 0.123E2, ~0.123E~2): 0.33433636E2 0.33433636E2 (0.27182817E1, 0.123E2, ~0.11754944E~37): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, ~0.5877472E~38): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, ~0.1E~44): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.123E2, ~0.0): 0.33434868E2 0.33434868E2 (0.27182817E1, 0.31415927E1, 0.123E4): 0.12385398E4 0.12385398E4 (0.27182817E1, 0.31415927E1, 0.123E2): 0.20839735E2 0.20839735E2 (0.27182817E1, 0.31415927E1, 0.31415927E1): 0.11681327E2 0.11681327E2 (0.27182817E1, 0.31415927E1, 0.27182817E1): 0.11258016E2 0.11258016E2 (0.27182817E1, 0.31415927E1, 0.123E1): 0.9769734E1 0.9769734E1 (0.27182817E1, 0.31415927E1, 0.123): 0.8662734E1 0.8662734E1 (0.27182817E1, 0.31415927E1, 0.123E~2): 0.8540964E1 0.8540964E1 (0.27182817E1, 0.31415927E1, 0.11754944E~37): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, 0.5877472E~38): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, 0.1E~44): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, 0.0): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, ~0.123E4): ~0.12214602E4 ~0.12214602E4 (0.27182817E1, 0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.3760266E1 (0.27182817E1, 0.31415927E1, ~0.31415927E1): 0.53981414E1 0.53981414E1 (0.27182817E1, 0.31415927E1, ~0.27182817E1): 0.58214526E1 0.58214526E1 (0.27182817E1, 0.31415927E1, ~0.123E1): 0.73097343E1 0.73097343E1 (0.27182817E1, 0.31415927E1, ~0.123): 0.8416734E1 0.8416734E1 (0.27182817E1, 0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538505E1 (0.27182817E1, 0.31415927E1, ~0.11754944E~37): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, ~0.5877472E~38): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, ~0.1E~44): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.31415927E1, ~0.0): 0.8539734E1 0.8539734E1 (0.27182817E1, 0.27182817E1, 0.123E4): 0.1237389E4 0.1237389E4 (0.27182817E1, 0.27182817E1, 0.123E2): 0.19689056E2 0.19689056E2 (0.27182817E1, 0.27182817E1, 0.31415927E1): 0.10530648E2 0.10530648E2 (0.27182817E1, 0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107337E2 (0.27182817E1, 0.27182817E1, 0.123E1): 0.8619056E1 0.8619056E1 (0.27182817E1, 0.27182817E1, 0.123): 0.7512056E1 0.7512056E1 (0.27182817E1, 0.27182817E1, 0.123E~2): 0.73902855E1 0.73902855E1 (0.27182817E1, 0.27182817E1, 0.11754944E~37): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, 0.5877472E~38): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, 0.1E~44): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, 0.0): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, ~0.123E4): ~0.1222611E4 ~0.1222611E4 (0.27182817E1, 0.27182817E1, ~0.123E2): ~0.49109445E1 ~0.49109445E1 (0.27182817E1, 0.27182817E1, ~0.31415927E1): 0.42474627E1 0.42474627E1 (0.27182817E1, 0.27182817E1, ~0.27182817E1): 0.4670774E1 0.4670774E1 (0.27182817E1, 0.27182817E1, ~0.123E1): 0.61590557E1 0.61590557E1 (0.27182817E1, 0.27182817E1, ~0.123): 0.72660556E1 0.72660556E1 (0.27182817E1, 0.27182817E1, ~0.123E~2): 0.73878255E1 0.73878255E1 (0.27182817E1, 0.27182817E1, ~0.11754944E~37): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, ~0.5877472E~38): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, ~0.1E~44): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.27182817E1, ~0.0): 0.73890557E1 0.73890557E1 (0.27182817E1, 0.123E1, 0.123E4): 0.12333435E4 0.12333435E4 (0.27182817E1, 0.123E1, 0.123E2): 0.15643487E2 0.15643487E2 (0.27182817E1, 0.123E1, 0.31415927E1): 0.64850793E1 0.64850793E1 (0.27182817E1, 0.123E1, 0.27182817E1): 0.60617685E1 0.60617685E1 (0.27182817E1, 0.123E1, 0.123E1): 0.4573487E1 0.4573487E1 (0.27182817E1, 0.123E1, 0.123): 0.34664867E1 0.34664867E1 (0.27182817E1, 0.123E1, 0.123E~2): 0.33447165E1 0.33447165E1 (0.27182817E1, 0.123E1, 0.11754944E~37): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, 0.5877472E~38): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, 0.1E~44): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, 0.0): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, ~0.123E4): ~0.12266565E4 ~0.12266565E4 (0.27182817E1, 0.123E1, ~0.123E2): ~0.8956513E1 ~0.8956513E1 (0.27182817E1, 0.123E1, ~0.31415927E1): 0.20189385 0.20189385 (0.27182817E1, 0.123E1, ~0.27182817E1): 0.62520486 0.62520486 (0.27182817E1, 0.123E1, ~0.123E1): 0.21134865E1 0.21134865E1 (0.27182817E1, 0.123E1, ~0.123): 0.32204866E1 0.32204866E1 (0.27182817E1, 0.123E1, ~0.123E~2): 0.33422565E1 0.33422565E1 (0.27182817E1, 0.123E1, ~0.11754944E~37): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, ~0.5877472E~38): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, ~0.1E~44): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123E1, ~0.0): 0.33434865E1 0.33434865E1 (0.27182817E1, 0.123, 0.123E4): 0.12303344E4 0.12303344E4 (0.27182817E1, 0.123, 0.123E2): 0.12634349E2 0.12634349E2 (0.27182817E1, 0.123, 0.31415927E1): 0.34759414E1 0.34759414E1 (0.27182817E1, 0.123, 0.27182817E1): 0.30526304E1 0.30526304E1 (0.27182817E1, 0.123, 0.123E1): 0.15643487E1 0.15643487E1 (0.27182817E1, 0.123, 0.123): 0.45734867 0.45734867 (0.27182817E1, 0.123, 0.123E~2): 0.33557865 0.33557865 (0.27182817E1, 0.123, 0.11754944E~37): 0.33434868 0.33434868 (0.27182817E1, 0.123, 0.5877472E~38): 0.33434868 0.33434868 (0.27182817E1, 0.123, 0.1E~44): 0.33434868 0.33434868 (0.27182817E1, 0.123, 0.0): 0.33434868 0.33434868 (0.27182817E1, 0.123, ~0.123E4): ~0.12296656E4 ~0.12296656E4 (0.27182817E1, 0.123, ~0.123E2): ~0.119656515E2 ~0.119656515E2 (0.27182817E1, 0.123, ~0.31415927E1): ~0.2807244E1 ~0.2807244E1 (0.27182817E1, 0.123, ~0.27182817E1): ~0.2383933E1 ~0.2383933E1 (0.27182817E1, 0.123, ~0.123E1): ~0.89565134 ~0.89565134 (0.27182817E1, 0.123, ~0.123): 0.21134867 0.21134867 (0.27182817E1, 0.123, ~0.123E~2): 0.33311868 0.33311868 (0.27182817E1, 0.123, ~0.11754944E~37): 0.33434868 0.33434868 (0.27182817E1, 0.123, ~0.5877472E~38): 0.33434868 0.33434868 (0.27182817E1, 0.123, ~0.1E~44): 0.33434868 0.33434868 (0.27182817E1, 0.123, ~0.0): 0.33434868 0.33434868 (0.27182817E1, 0.123E~2, 0.123E4): 0.12300033E4 0.12300033E4 (0.27182817E1, 0.123E~2, 0.123E2): 0.12303344E2 0.12303344E2 (0.27182817E1, 0.123E~2, 0.31415927E1): 0.31449363E1 0.31449363E1 (0.27182817E1, 0.123E~2, 0.27182817E1): 0.27216253E1 0.27216253E1 (0.27182817E1, 0.123E~2, 0.123E1): 0.12333435E1 0.12333435E1 (0.27182817E1, 0.123E~2, 0.123): 0.12634349 0.12634349 (0.27182817E1, 0.123E~2, 0.123E~2): 0.45734867E~2 0.45734867E~2 (0.27182817E1, 0.123E~2, 0.11754944E~37): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, 0.5877472E~38): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, 0.1E~44): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, 0.0): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, ~0.123E4): ~0.12299967E4 ~0.12299967E4 (0.27182817E1, 0.123E~2, ~0.123E2): ~0.12296657E2 ~0.12296657E2 (0.27182817E1, 0.123E~2, ~0.31415927E1): ~0.31382492E1 ~0.31382492E1 (0.27182817E1, 0.123E~2, ~0.27182817E1): ~0.27149382E1 ~0.27149382E1 (0.27182817E1, 0.123E~2, ~0.123E1): ~0.12266566E1 ~0.12266566E1 (0.27182817E1, 0.123E~2, ~0.123): ~0.11965652 ~0.11965652 (0.27182817E1, 0.123E~2, ~0.123E~2): 0.21134866E~2 0.21134866E~2 (0.27182817E1, 0.123E~2, ~0.11754944E~37): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, ~0.5877472E~38): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, ~0.1E~44): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.123E~2, ~0.0): 0.33434867E~2 0.33434867E~2 (0.27182817E1, 0.11754944E~37, 0.1E~44): 0.31953248E~37 0.31953248E~37 (0.27182817E1, 0.11754944E~37, ~0.1E~44): 0.31953248E~37 0.31953248E~37 (0.27182817E1, 0.1E~44, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (0.27182817E1, 0.1E~44, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (0.27182817E1, 0.1E~44, 0.1E~44): 0.6E~44 0.6E~44 (0.27182817E1, 0.1E~44, 0.0): 0.4E~44 0.4E~44 (0.27182817E1, 0.1E~44, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (0.27182817E1, 0.1E~44, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (0.27182817E1, 0.1E~44, ~0.1E~44): 0.3E~44 0.3E~44 (0.27182817E1, 0.1E~44, ~0.0): 0.4E~44 0.4E~44 (0.27182817E1, ~0.34028235E39, 0.34028235E39): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.17014117E39): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.123E4): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.123E2): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.123E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.123): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.27182817E1, ~0.34028235E39, 0.0): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.123): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.27182817E1, ~0.34028235E39, ~0.0): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.34028235E39): ~0.1222093E39 ~0.1222093E39 (0.27182817E1, ~0.17014117E39, 0.17014117E39): ~0.29235047E39 ~0.29235047E39 (0.27182817E1, ~0.17014117E39, 0.123E4): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.123E2): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.31415927E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.27182817E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.123E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.123): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.123E~2): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.11754944E~37): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.5877472E~38): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.1E~44): ~inf ~inf (0.27182817E1, ~0.17014117E39, 0.0): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.123E4): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.123E2): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.31415927E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.27182817E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.123E1): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.123): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.123E~2): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.11754944E~37): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.5877472E~38): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.1E~44): ~inf ~inf (0.27182817E1, ~0.17014117E39, ~0.0): ~inf ~inf (0.27182817E1, ~0.123E4, 0.123E4): ~0.21134866E4 ~0.21134866E4 (0.27182817E1, ~0.123E4, 0.123E2): ~0.33311865E4 ~0.33311865E4 (0.27182817E1, ~0.123E4, 0.31415927E1): ~0.3340345E4 ~0.3340345E4 (0.27182817E1, ~0.123E4, 0.27182817E1): ~0.33407683E4 ~0.33407683E4 (0.27182817E1, ~0.123E4, 0.123E1): ~0.33422566E4 ~0.33422566E4 (0.27182817E1, ~0.123E4, 0.123): ~0.33433635E4 ~0.33433635E4 (0.27182817E1, ~0.123E4, 0.123E~2): ~0.33434854E4 ~0.33434854E4 (0.27182817E1, ~0.123E4, 0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, 0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, 0.1E~44): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, 0.0): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, ~0.123E4): ~0.45734863E4 ~0.45734863E4 (0.27182817E1, ~0.123E4, ~0.123E2): ~0.33557866E4 ~0.33557866E4 (0.27182817E1, ~0.123E4, ~0.31415927E1): ~0.33466282E4 ~0.33466282E4 (0.27182817E1, ~0.123E4, ~0.27182817E1): ~0.33462048E4 ~0.33462048E4 (0.27182817E1, ~0.123E4, ~0.123E1): ~0.33447166E4 ~0.33447166E4 (0.27182817E1, ~0.123E4, ~0.123): ~0.33436096E4 ~0.33436096E4 (0.27182817E1, ~0.123E4, ~0.123E~2): ~0.33434878E4 ~0.33434878E4 (0.27182817E1, ~0.123E4, ~0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, ~0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, ~0.1E~44): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E4, ~0.0): ~0.33434866E4 ~0.33434866E4 (0.27182817E1, ~0.123E2, 0.123E4): 0.11965652E4 0.11965652E4 (0.27182817E1, ~0.123E2, 0.123E2): ~0.21134867E2 ~0.21134867E2 (0.27182817E1, ~0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293274E2 (0.27182817E1, ~0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716585E2 (0.27182817E1, ~0.123E2, 0.123E1): ~0.32204865E2 ~0.32204865E2 (0.27182817E1, ~0.123E2, 0.123): ~0.33311867E2 ~0.33311867E2 (0.27182817E1, ~0.123E2, 0.123E~2): ~0.33433636E2 ~0.33433636E2 (0.27182817E1, ~0.123E2, 0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, 0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, 0.1E~44): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, 0.0): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, ~0.123E4): ~0.12634348E4 ~0.12634348E4 (0.27182817E1, ~0.123E2, ~0.123E2): ~0.45734867E2 ~0.45734867E2 (0.27182817E1, ~0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.36576458E2 (0.27182817E1, ~0.123E2, ~0.27182817E1): ~0.3615315E2 ~0.3615315E2 (0.27182817E1, ~0.123E2, ~0.123E1): ~0.34664867E2 ~0.34664867E2 (0.27182817E1, ~0.123E2, ~0.123): ~0.33557865E2 ~0.33557865E2 (0.27182817E1, ~0.123E2, ~0.123E~2): ~0.33436096E2 ~0.33436096E2 (0.27182817E1, ~0.123E2, ~0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, ~0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, ~0.1E~44): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.123E2, ~0.0): ~0.33434868E2 ~0.33434868E2 (0.27182817E1, ~0.31415927E1, 0.123E4): 0.12214602E4 0.12214602E4 (0.27182817E1, ~0.31415927E1, 0.123E2): 0.3760266E1 0.3760266E1 (0.27182817E1, ~0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.53981414E1 (0.27182817E1, ~0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.58214526E1 (0.27182817E1, ~0.31415927E1, 0.123E1): ~0.73097343E1 ~0.73097343E1 (0.27182817E1, ~0.31415927E1, 0.123): ~0.8416734E1 ~0.8416734E1 (0.27182817E1, ~0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538505E1 (0.27182817E1, ~0.31415927E1, 0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, 0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, 0.1E~44): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, 0.0): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, ~0.123E4): ~0.12385398E4 ~0.12385398E4 (0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839735E2 (0.27182817E1, ~0.31415927E1, ~0.31415927E1): ~0.11681327E2 ~0.11681327E2 (0.27182817E1, ~0.31415927E1, ~0.27182817E1): ~0.11258016E2 ~0.11258016E2 (0.27182817E1, ~0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769734E1 (0.27182817E1, ~0.31415927E1, ~0.123): ~0.8662734E1 ~0.8662734E1 (0.27182817E1, ~0.31415927E1, ~0.123E~2): ~0.8540964E1 ~0.8540964E1 (0.27182817E1, ~0.31415927E1, ~0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, ~0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, ~0.1E~44): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.31415927E1, ~0.0): ~0.8539734E1 ~0.8539734E1 (0.27182817E1, ~0.27182817E1, 0.123E4): 0.1222611E4 0.1222611E4 (0.27182817E1, ~0.27182817E1, 0.123E2): 0.49109445E1 0.49109445E1 (0.27182817E1, ~0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.42474627E1 (0.27182817E1, ~0.27182817E1, 0.27182817E1): ~0.4670774E1 ~0.4670774E1 (0.27182817E1, ~0.27182817E1, 0.123E1): ~0.61590557E1 ~0.61590557E1 (0.27182817E1, ~0.27182817E1, 0.123): ~0.72660556E1 ~0.72660556E1 (0.27182817E1, ~0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.73878255E1 (0.27182817E1, ~0.27182817E1, 0.11754944E~37): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, 0.5877472E~38): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, 0.1E~44): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, 0.0): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, ~0.123E4): ~0.1237389E4 ~0.1237389E4 (0.27182817E1, ~0.27182817E1, ~0.123E2): ~0.19689056E2 ~0.19689056E2 (0.27182817E1, ~0.27182817E1, ~0.31415927E1): ~0.10530648E2 ~0.10530648E2 (0.27182817E1, ~0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107337E2 (0.27182817E1, ~0.27182817E1, ~0.123E1): ~0.8619056E1 ~0.8619056E1 (0.27182817E1, ~0.27182817E1, ~0.123): ~0.7512056E1 ~0.7512056E1 (0.27182817E1, ~0.27182817E1, ~0.123E~2): ~0.73902855E1 ~0.73902855E1 (0.27182817E1, ~0.27182817E1, ~0.11754944E~37): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, ~0.5877472E~38): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, ~0.1E~44): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.27182817E1, ~0.0): ~0.73890557E1 ~0.73890557E1 (0.27182817E1, ~0.123E1, 0.123E4): 0.12266565E4 0.12266565E4 (0.27182817E1, ~0.123E1, 0.123E2): 0.8956513E1 0.8956513E1 (0.27182817E1, ~0.123E1, 0.31415927E1): ~0.20189385 ~0.20189385 (0.27182817E1, ~0.123E1, 0.27182817E1): ~0.62520486 ~0.62520486 (0.27182817E1, ~0.123E1, 0.123E1): ~0.21134865E1 ~0.21134865E1 (0.27182817E1, ~0.123E1, 0.123): ~0.32204866E1 ~0.32204866E1 (0.27182817E1, ~0.123E1, 0.123E~2): ~0.33422565E1 ~0.33422565E1 (0.27182817E1, ~0.123E1, 0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, 0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, 0.1E~44): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, 0.0): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, ~0.123E4): ~0.12333435E4 ~0.12333435E4 (0.27182817E1, ~0.123E1, ~0.123E2): ~0.15643487E2 ~0.15643487E2 (0.27182817E1, ~0.123E1, ~0.31415927E1): ~0.64850793E1 ~0.64850793E1 (0.27182817E1, ~0.123E1, ~0.27182817E1): ~0.60617685E1 ~0.60617685E1 (0.27182817E1, ~0.123E1, ~0.123E1): ~0.4573487E1 ~0.4573487E1 (0.27182817E1, ~0.123E1, ~0.123): ~0.34664867E1 ~0.34664867E1 (0.27182817E1, ~0.123E1, ~0.123E~2): ~0.33447165E1 ~0.33447165E1 (0.27182817E1, ~0.123E1, ~0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, ~0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, ~0.1E~44): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123E1, ~0.0): ~0.33434865E1 ~0.33434865E1 (0.27182817E1, ~0.123, 0.123E4): 0.12296656E4 0.12296656E4 (0.27182817E1, ~0.123, 0.123E2): 0.119656515E2 0.119656515E2 (0.27182817E1, ~0.123, 0.31415927E1): 0.2807244E1 0.2807244E1 (0.27182817E1, ~0.123, 0.27182817E1): 0.2383933E1 0.2383933E1 (0.27182817E1, ~0.123, 0.123E1): 0.89565134 0.89565134 (0.27182817E1, ~0.123, 0.123): ~0.21134867 ~0.21134867 (0.27182817E1, ~0.123, 0.123E~2): ~0.33311868 ~0.33311868 (0.27182817E1, ~0.123, 0.11754944E~37): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, 0.5877472E~38): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, 0.1E~44): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, 0.0): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, ~0.123E4): ~0.12303344E4 ~0.12303344E4 (0.27182817E1, ~0.123, ~0.123E2): ~0.12634349E2 ~0.12634349E2 (0.27182817E1, ~0.123, ~0.31415927E1): ~0.34759414E1 ~0.34759414E1 (0.27182817E1, ~0.123, ~0.27182817E1): ~0.30526304E1 ~0.30526304E1 (0.27182817E1, ~0.123, ~0.123E1): ~0.15643487E1 ~0.15643487E1 (0.27182817E1, ~0.123, ~0.123): ~0.45734867 ~0.45734867 (0.27182817E1, ~0.123, ~0.123E~2): ~0.33557865 ~0.33557865 (0.27182817E1, ~0.123, ~0.11754944E~37): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, ~0.5877472E~38): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, ~0.1E~44): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123, ~0.0): ~0.33434868 ~0.33434868 (0.27182817E1, ~0.123E~2, 0.123E4): 0.12299967E4 0.12299967E4 (0.27182817E1, ~0.123E~2, 0.123E2): 0.12296657E2 0.12296657E2 (0.27182817E1, ~0.123E~2, 0.31415927E1): 0.31382492E1 0.31382492E1 (0.27182817E1, ~0.123E~2, 0.27182817E1): 0.27149382E1 0.27149382E1 (0.27182817E1, ~0.123E~2, 0.123E1): 0.12266566E1 0.12266566E1 (0.27182817E1, ~0.123E~2, 0.123): 0.11965652 0.11965652 (0.27182817E1, ~0.123E~2, 0.123E~2): ~0.21134866E~2 ~0.21134866E~2 (0.27182817E1, ~0.123E~2, 0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, 0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, 0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, 0.0): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, ~0.123E4): ~0.12300033E4 ~0.12300033E4 (0.27182817E1, ~0.123E~2, ~0.123E2): ~0.12303344E2 ~0.12303344E2 (0.27182817E1, ~0.123E~2, ~0.31415927E1): ~0.31449363E1 ~0.31449363E1 (0.27182817E1, ~0.123E~2, ~0.27182817E1): ~0.27216253E1 ~0.27216253E1 (0.27182817E1, ~0.123E~2, ~0.123E1): ~0.12333435E1 ~0.12333435E1 (0.27182817E1, ~0.123E~2, ~0.123): ~0.12634349 ~0.12634349 (0.27182817E1, ~0.123E~2, ~0.123E~2): ~0.45734867E~2 ~0.45734867E~2 (0.27182817E1, ~0.123E~2, ~0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, ~0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, ~0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.123E~2, ~0.0): ~0.33434867E~2 ~0.33434867E~2 (0.27182817E1, ~0.11754944E~37, 0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (0.27182817E1, ~0.11754944E~37, ~0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (0.27182817E1, ~0.1E~44, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (0.27182817E1, ~0.1E~44, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (0.27182817E1, ~0.1E~44, 0.1E~44): ~0.3E~44 ~0.3E~44 (0.27182817E1, ~0.1E~44, 0.0): ~0.4E~44 ~0.4E~44 (0.27182817E1, ~0.1E~44, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (0.27182817E1, ~0.1E~44, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (0.27182817E1, ~0.1E~44, ~0.1E~44): ~0.6E~44 ~0.6E~44 (0.27182817E1, ~0.1E~44, ~0.0): ~0.4E~44 ~0.4E~44 (0.123E1, 0.34028235E39, 0.34028235E39): inf inf (0.123E1, 0.34028235E39, 0.17014117E39): inf inf (0.123E1, 0.34028235E39, 0.123E4): inf inf (0.123E1, 0.34028235E39, 0.123E2): inf inf (0.123E1, 0.34028235E39, 0.31415927E1): inf inf (0.123E1, 0.34028235E39, 0.27182817E1): inf inf (0.123E1, 0.34028235E39, 0.123E1): inf inf (0.123E1, 0.34028235E39, 0.123): inf inf (0.123E1, 0.34028235E39, 0.123E~2): inf inf (0.123E1, 0.34028235E39, 0.11754944E~37): inf inf (0.123E1, 0.34028235E39, 0.5877472E~38): inf inf (0.123E1, 0.34028235E39, 0.1E~44): inf inf (0.123E1, 0.34028235E39, 0.0): inf inf (0.123E1, 0.34028235E39, ~0.34028235E39): 0.78264946E38 0.78264946E38 (0.123E1, 0.34028235E39, ~0.17014117E39): 0.24840611E39 0.24840611E39 (0.123E1, 0.34028235E39, ~0.123E4): inf inf (0.123E1, 0.34028235E39, ~0.123E2): inf inf (0.123E1, 0.34028235E39, ~0.31415927E1): inf inf (0.123E1, 0.34028235E39, ~0.27182817E1): inf inf (0.123E1, 0.34028235E39, ~0.123E1): inf inf (0.123E1, 0.34028235E39, ~0.123): inf inf (0.123E1, 0.34028235E39, ~0.123E~2): inf inf (0.123E1, 0.34028235E39, ~0.11754944E~37): inf inf (0.123E1, 0.34028235E39, ~0.5877472E~38): inf inf (0.123E1, 0.34028235E39, ~0.1E~44): inf inf (0.123E1, 0.34028235E39, ~0.0): inf inf (0.123E1, 0.17014117E39, 0.34028235E39): inf inf (0.123E1, 0.17014117E39, 0.17014117E39): inf inf (0.123E1, 0.17014117E39, 0.123E4): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.123E2): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.31415927E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.27182817E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.123E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.123): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.123E~2): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.11754944E~37): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.5877472E~38): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.1E~44): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, 0.0): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.1310087E39 (0.123E1, 0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132473E38 (0.123E1, 0.17014117E39, ~0.123E4): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.123E2): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.31415927E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.27182817E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.123E1): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.123): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.123E~2): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.11754944E~37): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.5877472E~38): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.1E~44): 0.20927364E39 0.20927364E39 (0.123E1, 0.17014117E39, ~0.0): 0.20927364E39 0.20927364E39 (0.123E1, 0.123E4, 0.123E4): 0.27429E4 0.27429E4 (0.123E1, 0.123E4, 0.123E2): 0.15252001E4 0.15252001E4 (0.123E1, 0.123E4, 0.31415927E1): 0.15160416E4 0.15160416E4 (0.123E1, 0.123E4, 0.27182817E1): 0.15156183E4 0.15156183E4 (0.123E1, 0.123E4, 0.123E1): 0.151413E4 0.151413E4 (0.123E1, 0.123E4, 0.123): 0.15130231E4 0.15130231E4 (0.123E1, 0.123E4, 0.123E~2): 0.15129012E4 0.15129012E4 (0.123E1, 0.123E4, 0.11754944E~37): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.5877472E~38): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.1E~44): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.0): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.123E4): 0.28290002E3 0.28290002E3 (0.123E1, 0.123E4, ~0.123E2): 0.15006E4 0.15006E4 (0.123E1, 0.123E4, ~0.31415927E1): 0.15097584E4 0.15097584E4 (0.123E1, 0.123E4, ~0.27182817E1): 0.15101818E4 0.15101818E4 (0.123E1, 0.123E4, ~0.123E1): 0.151167E4 0.151167E4 (0.123E1, 0.123E4, ~0.123): 0.1512777E4 0.1512777E4 (0.123E1, 0.123E4, ~0.123E~2): 0.15128988E4 0.15128988E4 (0.123E1, 0.123E4, ~0.11754944E~37): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.5877472E~38): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.1E~44): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.0): 0.15129E4 0.15129E4 (0.123E1, 0.123E2, 0.123E4): 0.1245129E4 0.1245129E4 (0.123E1, 0.123E2, 0.123E2): 0.27429E2 0.27429E2 (0.123E1, 0.123E2, 0.31415927E1): 0.18270594E2 0.18270594E2 (0.123E1, 0.123E2, 0.27182817E1): 0.17847282E2 0.17847282E2 (0.123E1, 0.123E2, 0.123E1): 0.16359001E2 0.16359001E2 (0.123E1, 0.123E2, 0.123): 0.15252001E2 0.15252001E2 (0.123E1, 0.123E2, 0.123E~2): 0.15130231E2 0.15130231E2 (0.123E1, 0.123E2, 0.11754944E~37): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, 0.5877472E~38): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, 0.1E~44): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, 0.0): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (0.123E1, 0.123E2, ~0.123E2): 0.28290002E1 0.28290002E1 (0.123E1, 0.123E2, ~0.31415927E1): 0.11987408E2 0.11987408E2 (0.123E1, 0.123E2, ~0.27182817E1): 0.12410719E2 0.12410719E2 (0.123E1, 0.123E2, ~0.123E1): 0.13899E2 0.13899E2 (0.123E1, 0.123E2, ~0.123): 0.150060005E2 0.150060005E2 (0.123E1, 0.123E2, ~0.123E~2): 0.1512777E2 0.1512777E2 (0.123E1, 0.123E2, ~0.11754944E~37): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, ~0.5877472E~38): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, ~0.1E~44): 0.15129001E2 0.15129001E2 (0.123E1, 0.123E2, ~0.0): 0.15129001E2 0.15129001E2 (0.123E1, 0.31415927E1, 0.123E4): 0.12338641E4 0.12338641E4 (0.123E1, 0.31415927E1, 0.123E2): 0.1616416E2 0.1616416E2 (0.123E1, 0.31415927E1, 0.31415927E1): 0.7005752E1 0.7005752E1 (0.123E1, 0.31415927E1, 0.27182817E1): 0.6582441E1 0.6582441E1 (0.123E1, 0.31415927E1, 0.123E1): 0.5094159E1 0.5094159E1 (0.123E1, 0.31415927E1, 0.123): 0.39871593E1 0.39871593E1 (0.123E1, 0.31415927E1, 0.123E~2): 0.3865389E1 0.3865389E1 (0.123E1, 0.31415927E1, 0.11754944E~37): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, 0.5877472E~38): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, 0.1E~44): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, 0.0): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, ~0.123E4): ~0.12261359E4 ~0.12261359E4 (0.123E1, 0.31415927E1, ~0.123E2): ~0.8435841E1 ~0.8435841E1 (0.123E1, 0.31415927E1, ~0.31415927E1): 0.72256637 0.72256637 (0.123E1, 0.31415927E1, ~0.27182817E1): 0.11458774E1 0.11458774E1 (0.123E1, 0.31415927E1, ~0.123E1): 0.2634159E1 0.2634159E1 (0.123E1, 0.31415927E1, ~0.123): 0.37411592E1 0.37411592E1 (0.123E1, 0.31415927E1, ~0.123E~2): 0.3862929E1 0.3862929E1 (0.123E1, 0.31415927E1, ~0.11754944E~37): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, ~0.5877472E~38): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, ~0.1E~44): 0.3864159E1 0.3864159E1 (0.123E1, 0.31415927E1, ~0.0): 0.3864159E1 0.3864159E1 (0.123E1, 0.27182817E1, 0.123E4): 0.12333435E4 0.12333435E4 (0.123E1, 0.27182817E1, 0.123E2): 0.15643487E2 0.15643487E2 (0.123E1, 0.27182817E1, 0.31415927E1): 0.64850793E1 0.64850793E1 (0.123E1, 0.27182817E1, 0.27182817E1): 0.60617685E1 0.60617685E1 (0.123E1, 0.27182817E1, 0.123E1): 0.4573487E1 0.4573487E1 (0.123E1, 0.27182817E1, 0.123): 0.34664867E1 0.34664867E1 (0.123E1, 0.27182817E1, 0.123E~2): 0.33447165E1 0.33447165E1 (0.123E1, 0.27182817E1, 0.11754944E~37): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, 0.5877472E~38): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, 0.1E~44): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, 0.0): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, ~0.123E4): ~0.12266565E4 ~0.12266565E4 (0.123E1, 0.27182817E1, ~0.123E2): ~0.8956513E1 ~0.8956513E1 (0.123E1, 0.27182817E1, ~0.31415927E1): 0.20189385 0.20189385 (0.123E1, 0.27182817E1, ~0.27182817E1): 0.62520486 0.62520486 (0.123E1, 0.27182817E1, ~0.123E1): 0.21134865E1 0.21134865E1 (0.123E1, 0.27182817E1, ~0.123): 0.32204866E1 0.32204866E1 (0.123E1, 0.27182817E1, ~0.123E~2): 0.33422565E1 0.33422565E1 (0.123E1, 0.27182817E1, ~0.11754944E~37): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, ~0.5877472E~38): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, ~0.1E~44): 0.33434865E1 0.33434865E1 (0.123E1, 0.27182817E1, ~0.0): 0.33434865E1 0.33434865E1 (0.123E1, 0.123E1, 0.123E4): 0.1231513E4 0.1231513E4 (0.123E1, 0.123E1, 0.123E2): 0.13812901E2 0.13812901E2 (0.123E1, 0.123E1, 0.31415927E1): 0.4654493E1 0.4654493E1 (0.123E1, 0.123E1, 0.27182817E1): 0.42311816E1 0.42311816E1 (0.123E1, 0.123E1, 0.123E1): 0.27429001E1 0.27429001E1 (0.123E1, 0.123E1, 0.123): 0.16359E1 0.16359E1 (0.123E1, 0.123E1, 0.123E~2): 0.151413E1 0.151413E1 (0.123E1, 0.123E1, 0.11754944E~37): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.5877472E~38): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.1E~44): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.0): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (0.123E1, 0.123E1, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E1, 0.123E1, ~0.31415927E1): ~0.16286927E1 ~0.16286927E1 (0.123E1, 0.123E1, ~0.27182817E1): ~0.12053818E1 ~0.12053818E1 (0.123E1, 0.123E1, ~0.123E1): 0.28290004 0.28290004 (0.123E1, 0.123E1, ~0.123): 0.13899001E1 0.13899001E1 (0.123E1, 0.123E1, ~0.123E~2): 0.151167E1 0.151167E1 (0.123E1, 0.123E1, ~0.11754944E~37): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.5877472E~38): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.1E~44): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.0): 0.15129E1 0.15129E1 (0.123E1, 0.123, 0.123E4): 0.12301512E4 0.12301512E4 (0.123E1, 0.123, 0.123E2): 0.1245129E2 0.1245129E2 (0.123E1, 0.123, 0.31415927E1): 0.32928827E1 0.32928827E1 (0.123E1, 0.123, 0.27182817E1): 0.28695717E1 0.28695717E1 (0.123E1, 0.123, 0.123E1): 0.13812901E1 0.13812901E1 (0.123E1, 0.123, 0.123): 0.27429 0.27429 (0.123E1, 0.123, 0.123E~2): 0.15252 0.15252 (0.123E1, 0.123, 0.11754944E~37): 0.15129 0.15129 (0.123E1, 0.123, 0.5877472E~38): 0.15129 0.15129 (0.123E1, 0.123, 0.1E~44): 0.15129 0.15129 (0.123E1, 0.123, 0.0): 0.15129 0.15129 (0.123E1, 0.123, ~0.123E4): ~0.12298488E4 ~0.12298488E4 (0.123E1, 0.123, ~0.123E2): ~0.1214871E2 ~0.1214871E2 (0.123E1, 0.123, ~0.31415927E1): ~0.29903028E1 ~0.29903028E1 (0.123E1, 0.123, ~0.27182817E1): ~0.25669918E1 ~0.25669918E1 (0.123E1, 0.123, ~0.123E1): ~0.107871E1 ~0.107871E1 (0.123E1, 0.123, ~0.123): 0.28290004E~1 0.28290004E~1 (0.123E1, 0.123, ~0.123E~2): 0.15006001 0.15006001 (0.123E1, 0.123, ~0.11754944E~37): 0.15129 0.15129 (0.123E1, 0.123, ~0.5877472E~38): 0.15129 0.15129 (0.123E1, 0.123, ~0.1E~44): 0.15129 0.15129 (0.123E1, 0.123, ~0.0): 0.15129 0.15129 (0.123E1, 0.123E~2, 0.123E4): 0.12300015E4 0.12300015E4 (0.123E1, 0.123E~2, 0.123E2): 0.12301513E2 0.12301513E2 (0.123E1, 0.123E~2, 0.31415927E1): 0.31431057E1 0.31431057E1 (0.123E1, 0.123E~2, 0.27182817E1): 0.27197948E1 0.27197948E1 (0.123E1, 0.123E~2, 0.123E1): 0.12315129E1 0.12315129E1 (0.123E1, 0.123E~2, 0.123): 0.1245129 0.1245129 (0.123E1, 0.123E~2, 0.123E~2): 0.27429E~2 0.27429E~2 (0.123E1, 0.123E~2, 0.11754944E~37): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, 0.5877472E~38): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, 0.1E~44): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, 0.0): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, ~0.123E4): ~0.12299985E4 ~0.12299985E4 (0.123E1, 0.123E~2, ~0.123E2): ~0.12298488E2 ~0.12298488E2 (0.123E1, 0.123E~2, ~0.31415927E1): ~0.31400797E1 ~0.31400797E1 (0.123E1, 0.123E~2, ~0.27182817E1): ~0.27167687E1 ~0.27167687E1 (0.123E1, 0.123E~2, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (0.123E1, 0.123E~2, ~0.123): ~0.1214871 ~0.1214871 (0.123E1, 0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290003E~3 (0.123E1, 0.123E~2, ~0.11754944E~37): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, ~0.5877472E~38): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, ~0.1E~44): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.123E~2, ~0.0): 0.15129001E~2 0.15129001E~2 (0.123E1, 0.1E~44, 0.11754944E~37): 0.11754945E~37 0.11754945E~37 (0.123E1, 0.1E~44, 0.5877472E~38): 0.5877473E~38 0.5877473E~38 (0.123E1, 0.1E~44, 0.1E~44): 0.3E~44 0.3E~44 (0.123E1, 0.1E~44, 0.0): 0.1E~44 0.1E~44 (0.123E1, 0.1E~44, ~0.11754944E~37): ~0.11754942E~37 ~0.11754942E~37 (0.123E1, 0.1E~44, ~0.5877472E~38): ~0.587747E~38 ~0.587747E~38 (0.123E1, 0.1E~44, ~0.1E~44): 0.0 0.0 (0.123E1, 0.1E~44, ~0.0): 0.1E~44 0.1E~44 (0.123E1, ~0.34028235E39, 0.34028235E39): ~0.78264946E38 ~0.78264946E38 (0.123E1, ~0.34028235E39, 0.17014117E39): ~0.24840611E39 ~0.24840611E39 (0.123E1, ~0.34028235E39, 0.123E4): ~inf ~inf (0.123E1, ~0.34028235E39, 0.123E2): ~inf ~inf (0.123E1, ~0.34028235E39, 0.31415927E1): ~inf ~inf (0.123E1, ~0.34028235E39, 0.27182817E1): ~inf ~inf (0.123E1, ~0.34028235E39, 0.123E1): ~inf ~inf (0.123E1, ~0.34028235E39, 0.123): ~inf ~inf (0.123E1, ~0.34028235E39, 0.123E~2): ~inf ~inf (0.123E1, ~0.34028235E39, 0.11754944E~37): ~inf ~inf (0.123E1, ~0.34028235E39, 0.5877472E~38): ~inf ~inf (0.123E1, ~0.34028235E39, 0.1E~44): ~inf ~inf (0.123E1, ~0.34028235E39, 0.0): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.17014117E39): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.123E4): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.123E2): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.31415927E1): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.27182817E1): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.123E1): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.123): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.123E~2): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.11754944E~37): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.5877472E~38): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.1E~44): ~inf ~inf (0.123E1, ~0.34028235E39, ~0.0): ~inf ~inf (0.123E1, ~0.17014117E39, 0.34028235E39): 0.1310087E39 0.1310087E39 (0.123E1, ~0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132473E38 (0.123E1, ~0.17014117E39, 0.123E4): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.123E2): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.31415927E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.27182817E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.123E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.123): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.123E~2): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.1E~44): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, 0.0): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.123E1, ~0.17014117E39, ~0.17014117E39): ~inf ~inf (0.123E1, ~0.17014117E39, ~0.123E4): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.123E2): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.31415927E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.27182817E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.123E1): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.123): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.123E~2): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.1E~44): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.17014117E39, ~0.0): ~0.20927364E39 ~0.20927364E39 (0.123E1, ~0.123E4, 0.123E4): ~0.28290002E3 ~0.28290002E3 (0.123E1, ~0.123E4, 0.123E2): ~0.15006E4 ~0.15006E4 (0.123E1, ~0.123E4, 0.31415927E1): ~0.15097584E4 ~0.15097584E4 (0.123E1, ~0.123E4, 0.27182817E1): ~0.15101818E4 ~0.15101818E4 (0.123E1, ~0.123E4, 0.123E1): ~0.151167E4 ~0.151167E4 (0.123E1, ~0.123E4, 0.123): ~0.1512777E4 ~0.1512777E4 (0.123E1, ~0.123E4, 0.123E~2): ~0.15128988E4 ~0.15128988E4 (0.123E1, ~0.123E4, 0.11754944E~37): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.5877472E~38): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.1E~44): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.0): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.123E4): ~0.27429E4 ~0.27429E4 (0.123E1, ~0.123E4, ~0.123E2): ~0.15252001E4 ~0.15252001E4 (0.123E1, ~0.123E4, ~0.31415927E1): ~0.15160416E4 ~0.15160416E4 (0.123E1, ~0.123E4, ~0.27182817E1): ~0.15156183E4 ~0.15156183E4 (0.123E1, ~0.123E4, ~0.123E1): ~0.151413E4 ~0.151413E4 (0.123E1, ~0.123E4, ~0.123): ~0.15130231E4 ~0.15130231E4 (0.123E1, ~0.123E4, ~0.123E~2): ~0.15129012E4 ~0.15129012E4 (0.123E1, ~0.123E4, ~0.11754944E~37): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.5877472E~38): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.1E~44): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.0): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E2, 0.123E4): 0.1214871E4 0.1214871E4 (0.123E1, ~0.123E2, 0.123E2): ~0.28290002E1 ~0.28290002E1 (0.123E1, ~0.123E2, 0.31415927E1): ~0.11987408E2 ~0.11987408E2 (0.123E1, ~0.123E2, 0.27182817E1): ~0.12410719E2 ~0.12410719E2 (0.123E1, ~0.123E2, 0.123E1): ~0.13899E2 ~0.13899E2 (0.123E1, ~0.123E2, 0.123): ~0.150060005E2 ~0.150060005E2 (0.123E1, ~0.123E2, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (0.123E1, ~0.123E2, 0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, 0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, 0.1E~44): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, 0.0): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (0.123E1, ~0.123E2, ~0.123E2): ~0.27429E2 ~0.27429E2 (0.123E1, ~0.123E2, ~0.31415927E1): ~0.18270594E2 ~0.18270594E2 (0.123E1, ~0.123E2, ~0.27182817E1): ~0.17847282E2 ~0.17847282E2 (0.123E1, ~0.123E2, ~0.123E1): ~0.16359001E2 ~0.16359001E2 (0.123E1, ~0.123E2, ~0.123): ~0.15252001E2 ~0.15252001E2 (0.123E1, ~0.123E2, ~0.123E~2): ~0.15130231E2 ~0.15130231E2 (0.123E1, ~0.123E2, ~0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, ~0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, ~0.1E~44): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.123E2, ~0.0): ~0.15129001E2 ~0.15129001E2 (0.123E1, ~0.31415927E1, 0.123E4): 0.12261359E4 0.12261359E4 (0.123E1, ~0.31415927E1, 0.123E2): 0.8435841E1 0.8435841E1 (0.123E1, ~0.31415927E1, 0.31415927E1): ~0.72256637 ~0.72256637 (0.123E1, ~0.31415927E1, 0.27182817E1): ~0.11458774E1 ~0.11458774E1 (0.123E1, ~0.31415927E1, 0.123E1): ~0.2634159E1 ~0.2634159E1 (0.123E1, ~0.31415927E1, 0.123): ~0.37411592E1 ~0.37411592E1 (0.123E1, ~0.31415927E1, 0.123E~2): ~0.3862929E1 ~0.3862929E1 (0.123E1, ~0.31415927E1, 0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, 0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, 0.1E~44): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, 0.0): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, ~0.123E4): ~0.12338641E4 ~0.12338641E4 (0.123E1, ~0.31415927E1, ~0.123E2): ~0.1616416E2 ~0.1616416E2 (0.123E1, ~0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.7005752E1 (0.123E1, ~0.31415927E1, ~0.27182817E1): ~0.6582441E1 ~0.6582441E1 (0.123E1, ~0.31415927E1, ~0.123E1): ~0.5094159E1 ~0.5094159E1 (0.123E1, ~0.31415927E1, ~0.123): ~0.39871593E1 ~0.39871593E1 (0.123E1, ~0.31415927E1, ~0.123E~2): ~0.3865389E1 ~0.3865389E1 (0.123E1, ~0.31415927E1, ~0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, ~0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, ~0.1E~44): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.31415927E1, ~0.0): ~0.3864159E1 ~0.3864159E1 (0.123E1, ~0.27182817E1, 0.123E4): 0.12266565E4 0.12266565E4 (0.123E1, ~0.27182817E1, 0.123E2): 0.8956513E1 0.8956513E1 (0.123E1, ~0.27182817E1, 0.31415927E1): ~0.20189385 ~0.20189385 (0.123E1, ~0.27182817E1, 0.27182817E1): ~0.62520486 ~0.62520486 (0.123E1, ~0.27182817E1, 0.123E1): ~0.21134865E1 ~0.21134865E1 (0.123E1, ~0.27182817E1, 0.123): ~0.32204866E1 ~0.32204866E1 (0.123E1, ~0.27182817E1, 0.123E~2): ~0.33422565E1 ~0.33422565E1 (0.123E1, ~0.27182817E1, 0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, 0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, 0.1E~44): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, 0.0): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, ~0.123E4): ~0.12333435E4 ~0.12333435E4 (0.123E1, ~0.27182817E1, ~0.123E2): ~0.15643487E2 ~0.15643487E2 (0.123E1, ~0.27182817E1, ~0.31415927E1): ~0.64850793E1 ~0.64850793E1 (0.123E1, ~0.27182817E1, ~0.27182817E1): ~0.60617685E1 ~0.60617685E1 (0.123E1, ~0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.4573487E1 (0.123E1, ~0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664867E1 (0.123E1, ~0.27182817E1, ~0.123E~2): ~0.33447165E1 ~0.33447165E1 (0.123E1, ~0.27182817E1, ~0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, ~0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, ~0.1E~44): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.27182817E1, ~0.0): ~0.33434865E1 ~0.33434865E1 (0.123E1, ~0.123E1, 0.123E4): 0.1228487E4 0.1228487E4 (0.123E1, ~0.123E1, 0.123E2): 0.107871E2 0.107871E2 (0.123E1, ~0.123E1, 0.31415927E1): 0.16286927E1 0.16286927E1 (0.123E1, ~0.123E1, 0.27182817E1): 0.12053818E1 0.12053818E1 (0.123E1, ~0.123E1, 0.123E1): ~0.28290004 ~0.28290004 (0.123E1, ~0.123E1, 0.123): ~0.13899001E1 ~0.13899001E1 (0.123E1, ~0.123E1, 0.123E~2): ~0.151167E1 ~0.151167E1 (0.123E1, ~0.123E1, 0.11754944E~37): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.5877472E~38): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.1E~44): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.0): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (0.123E1, ~0.123E1, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (0.123E1, ~0.123E1, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (0.123E1, ~0.123E1, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (0.123E1, ~0.123E1, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E1, ~0.123E1, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123E1, ~0.123E1, ~0.11754944E~37): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.5877472E~38): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.1E~44): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.0): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123, 0.123E4): 0.12298488E4 0.12298488E4 (0.123E1, ~0.123, 0.123E2): 0.1214871E2 0.1214871E2 (0.123E1, ~0.123, 0.31415927E1): 0.29903028E1 0.29903028E1 (0.123E1, ~0.123, 0.27182817E1): 0.25669918E1 0.25669918E1 (0.123E1, ~0.123, 0.123E1): 0.107871E1 0.107871E1 (0.123E1, ~0.123, 0.123): ~0.28290004E~1 ~0.28290004E~1 (0.123E1, ~0.123, 0.123E~2): ~0.15006001 ~0.15006001 (0.123E1, ~0.123, 0.11754944E~37): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.5877472E~38): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.1E~44): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.0): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.123E4): ~0.12301512E4 ~0.12301512E4 (0.123E1, ~0.123, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (0.123E1, ~0.123, ~0.31415927E1): ~0.32928827E1 ~0.32928827E1 (0.123E1, ~0.123, ~0.27182817E1): ~0.28695717E1 ~0.28695717E1 (0.123E1, ~0.123, ~0.123E1): ~0.13812901E1 ~0.13812901E1 (0.123E1, ~0.123, ~0.123): ~0.27429 ~0.27429 (0.123E1, ~0.123, ~0.123E~2): ~0.15252 ~0.15252 (0.123E1, ~0.123, ~0.11754944E~37): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.5877472E~38): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.1E~44): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.0): ~0.15129 ~0.15129 (0.123E1, ~0.123E~2, 0.123E4): 0.12299985E4 0.12299985E4 (0.123E1, ~0.123E~2, 0.123E2): 0.12298488E2 0.12298488E2 (0.123E1, ~0.123E~2, 0.31415927E1): 0.31400797E1 0.31400797E1 (0.123E1, ~0.123E~2, 0.27182817E1): 0.27167687E1 0.27167687E1 (0.123E1, ~0.123E~2, 0.123E1): 0.12284871E1 0.12284871E1 (0.123E1, ~0.123E~2, 0.123): 0.1214871 0.1214871 (0.123E1, ~0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290003E~3 (0.123E1, ~0.123E~2, 0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, 0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, 0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, 0.0): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, ~0.123E4): ~0.12300015E4 ~0.12300015E4 (0.123E1, ~0.123E~2, ~0.123E2): ~0.12301513E2 ~0.12301513E2 (0.123E1, ~0.123E~2, ~0.31415927E1): ~0.31431057E1 ~0.31431057E1 (0.123E1, ~0.123E~2, ~0.27182817E1): ~0.27197948E1 ~0.27197948E1 (0.123E1, ~0.123E~2, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (0.123E1, ~0.123E~2, ~0.123): ~0.1245129 ~0.1245129 (0.123E1, ~0.123E~2, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (0.123E1, ~0.123E~2, ~0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, ~0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, ~0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.123E~2, ~0.0): ~0.15129001E~2 ~0.15129001E~2 (0.123E1, ~0.1E~44, 0.11754944E~37): 0.11754942E~37 0.11754942E~37 (0.123E1, ~0.1E~44, 0.5877472E~38): 0.587747E~38 0.587747E~38 (0.123E1, ~0.1E~44, 0.1E~44): ~0.0 ~0.0 (0.123E1, ~0.1E~44, 0.0): ~0.1E~44 ~0.1E~44 (0.123E1, ~0.1E~44, ~0.11754944E~37): ~0.11754945E~37 ~0.11754945E~37 (0.123E1, ~0.1E~44, ~0.5877472E~38): ~0.5877473E~38 ~0.5877473E~38 (0.123E1, ~0.1E~44, ~0.1E~44): ~0.3E~44 ~0.3E~44 (0.123E1, ~0.1E~44, ~0.0): ~0.1E~44 ~0.1E~44 (0.123, 0.34028235E39, 0.34028235E39): inf inf (0.123, 0.34028235E39, 0.17014117E39): 0.2119959E39 0.2119959E39 (0.123, 0.34028235E39, 0.123E4): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.123E2): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.31415927E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.27182817E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.123E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.123): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.123E~2): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.11754944E~37): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.5877472E~38): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.1E~44): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, 0.0): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.2984276E39 (0.123, 0.34028235E39, ~0.17014117E39): ~0.12828644E39 ~0.12828644E39 (0.123, 0.34028235E39, ~0.123E4): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.123E2): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.31415927E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.27182817E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.123E1): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.123): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.123E~2): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.11754944E~37): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.5877472E~38): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.1E~44): 0.4185473E38 0.4185473E38 (0.123, 0.34028235E39, ~0.0): 0.4185473E38 0.4185473E38 (0.123, 0.17014117E39, 0.34028235E39): inf inf (0.123, 0.17014117E39, 0.17014117E39): 0.19106853E39 0.19106853E39 (0.123, 0.17014117E39, 0.123E4): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.123E2): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.31415927E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.27182817E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.123E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.123): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.123E~2): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.11754944E~37): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.5877472E~38): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.1E~44): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, 0.0): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.34028235E39): ~0.31935498E39 ~0.31935498E39 (0.123, 0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.1492138E39 (0.123, 0.17014117E39, ~0.123E4): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.123E2): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.31415927E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.27182817E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.123E1): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.123): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.123E~2): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.11754944E~37): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.5877472E~38): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.1E~44): 0.20927365E38 0.20927365E38 (0.123, 0.17014117E39, ~0.0): 0.20927365E38 0.20927365E38 (0.123, 0.123E4, 0.123E4): 0.138129E4 0.138129E4 (0.123, 0.123E4, 0.123E2): 0.16359001E3 0.16359001E3 (0.123, 0.123E4, 0.31415927E1): 0.1544316E3 0.1544316E3 (0.123, 0.123E4, 0.27182817E1): 0.15400829E3 0.15400829E3 (0.123, 0.123E4, 0.123E1): 0.15252E3 0.15252E3 (0.123, 0.123E4, 0.123): 0.15141301E3 0.15141301E3 (0.123, 0.123E4, 0.123E~2): 0.15129123E3 0.15129123E3 (0.123, 0.123E4, 0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, 0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, 0.1E~44): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, 0.0): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123, 0.123E4, ~0.123E2): 0.13899E3 0.13899E3 (0.123, 0.123E4, ~0.31415927E1): 0.1481484E3 0.1481484E3 (0.123, 0.123E4, ~0.27182817E1): 0.14857172E3 0.14857172E3 (0.123, 0.123E4, ~0.123E1): 0.15006E3 0.15006E3 (0.123, 0.123E4, ~0.123): 0.151167E3 0.151167E3 (0.123, 0.123E4, ~0.123E~2): 0.15128877E3 0.15128877E3 (0.123, 0.123E4, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, ~0.1E~44): 0.15129001E3 0.15129001E3 (0.123, 0.123E4, ~0.0): 0.15129001E3 0.15129001E3 (0.123, 0.123E2, 0.123E4): 0.1231513E4 0.1231513E4 (0.123, 0.123E2, 0.123E2): 0.13812901E2 0.13812901E2 (0.123, 0.123E2, 0.31415927E1): 0.4654493E1 0.4654493E1 (0.123, 0.123E2, 0.27182817E1): 0.42311816E1 0.42311816E1 (0.123, 0.123E2, 0.123E1): 0.27429001E1 0.27429001E1 (0.123, 0.123E2, 0.123): 0.16359E1 0.16359E1 (0.123, 0.123E2, 0.123E~2): 0.15141301E1 0.15141301E1 (0.123, 0.123E2, 0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, 0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, 0.1E~44): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, 0.0): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (0.123, 0.123E2, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123, 0.123E2, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (0.123, 0.123E2, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (0.123, 0.123E2, ~0.123E1): 0.28290004 0.28290004 (0.123, 0.123E2, ~0.123): 0.13899001E1 0.13899001E1 (0.123, 0.123E2, ~0.123E~2): 0.15116701E1 0.15116701E1 (0.123, 0.123E2, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, ~0.1E~44): 0.15129001E1 0.15129001E1 (0.123, 0.123E2, ~0.0): 0.15129001E1 0.15129001E1 (0.123, 0.31415927E1, 0.123E4): 0.12303865E4 0.12303865E4 (0.123, 0.31415927E1, 0.123E2): 0.12686416E2 0.12686416E2 (0.123, 0.31415927E1, 0.31415927E1): 0.35280087E1 0.35280087E1 (0.123, 0.31415927E1, 0.27182817E1): 0.31046977E1 0.31046977E1 (0.123, 0.31415927E1, 0.123E1): 0.1616416E1 0.1616416E1 (0.123, 0.31415927E1, 0.123): 0.5094159 0.5094159 (0.123, 0.31415927E1, 0.123E~2): 0.38764593 0.38764593 (0.123, 0.31415927E1, 0.11754944E~37): 0.38641593 0.38641593 (0.123, 0.31415927E1, 0.5877472E~38): 0.38641593 0.38641593 (0.123, 0.31415927E1, 0.1E~44): 0.38641593 0.38641593 (0.123, 0.31415927E1, 0.0): 0.38641593 0.38641593 (0.123, 0.31415927E1, ~0.123E4): ~0.12296135E4 ~0.12296135E4 (0.123, 0.31415927E1, ~0.123E2): ~0.11913585E2 ~0.11913585E2 (0.123, 0.31415927E1, ~0.31415927E1): ~0.27551768E1 ~0.27551768E1 (0.123, 0.31415927E1, ~0.27182817E1): ~0.23318658E1 ~0.23318658E1 (0.123, 0.31415927E1, ~0.123E1): ~0.8435841 ~0.8435841 (0.123, 0.31415927E1, ~0.123): 0.2634159 0.2634159 (0.123, 0.31415927E1, ~0.123E~2): 0.38518593 0.38518593 (0.123, 0.31415927E1, ~0.11754944E~37): 0.38641593 0.38641593 (0.123, 0.31415927E1, ~0.5877472E~38): 0.38641593 0.38641593 (0.123, 0.31415927E1, ~0.1E~44): 0.38641593 0.38641593 (0.123, 0.31415927E1, ~0.0): 0.38641593 0.38641593 (0.123, 0.27182817E1, 0.123E4): 0.12303344E4 0.12303344E4 (0.123, 0.27182817E1, 0.123E2): 0.12634349E2 0.12634349E2 (0.123, 0.27182817E1, 0.31415927E1): 0.34759414E1 0.34759414E1 (0.123, 0.27182817E1, 0.27182817E1): 0.30526304E1 0.30526304E1 (0.123, 0.27182817E1, 0.123E1): 0.15643487E1 0.15643487E1 (0.123, 0.27182817E1, 0.123): 0.45734867 0.45734867 (0.123, 0.27182817E1, 0.123E~2): 0.33557865 0.33557865 (0.123, 0.27182817E1, 0.11754944E~37): 0.33434868 0.33434868 (0.123, 0.27182817E1, 0.5877472E~38): 0.33434868 0.33434868 (0.123, 0.27182817E1, 0.1E~44): 0.33434868 0.33434868 (0.123, 0.27182817E1, 0.0): 0.33434868 0.33434868 (0.123, 0.27182817E1, ~0.123E4): ~0.12296656E4 ~0.12296656E4 (0.123, 0.27182817E1, ~0.123E2): ~0.119656515E2 ~0.119656515E2 (0.123, 0.27182817E1, ~0.31415927E1): ~0.2807244E1 ~0.2807244E1 (0.123, 0.27182817E1, ~0.27182817E1): ~0.2383933E1 ~0.2383933E1 (0.123, 0.27182817E1, ~0.123E1): ~0.89565134 ~0.89565134 (0.123, 0.27182817E1, ~0.123): 0.21134867 0.21134867 (0.123, 0.27182817E1, ~0.123E~2): 0.33311868 0.33311868 (0.123, 0.27182817E1, ~0.11754944E~37): 0.33434868 0.33434868 (0.123, 0.27182817E1, ~0.5877472E~38): 0.33434868 0.33434868 (0.123, 0.27182817E1, ~0.1E~44): 0.33434868 0.33434868 (0.123, 0.27182817E1, ~0.0): 0.33434868 0.33434868 (0.123, 0.123E1, 0.123E4): 0.12301512E4 0.12301512E4 (0.123, 0.123E1, 0.123E2): 0.1245129E2 0.1245129E2 (0.123, 0.123E1, 0.31415927E1): 0.32928827E1 0.32928827E1 (0.123, 0.123E1, 0.27182817E1): 0.28695717E1 0.28695717E1 (0.123, 0.123E1, 0.123E1): 0.13812901E1 0.13812901E1 (0.123, 0.123E1, 0.123): 0.27429 0.27429 (0.123, 0.123E1, 0.123E~2): 0.15252 0.15252 (0.123, 0.123E1, 0.11754944E~37): 0.15129 0.15129 (0.123, 0.123E1, 0.5877472E~38): 0.15129 0.15129 (0.123, 0.123E1, 0.1E~44): 0.15129 0.15129 (0.123, 0.123E1, 0.0): 0.15129 0.15129 (0.123, 0.123E1, ~0.123E4): ~0.12298488E4 ~0.12298488E4 (0.123, 0.123E1, ~0.123E2): ~0.1214871E2 ~0.1214871E2 (0.123, 0.123E1, ~0.31415927E1): ~0.29903028E1 ~0.29903028E1 (0.123, 0.123E1, ~0.27182817E1): ~0.25669918E1 ~0.25669918E1 (0.123, 0.123E1, ~0.123E1): ~0.107871E1 ~0.107871E1 (0.123, 0.123E1, ~0.123): 0.28290004E~1 0.28290004E~1 (0.123, 0.123E1, ~0.123E~2): 0.15006001 0.15006001 (0.123, 0.123E1, ~0.11754944E~37): 0.15129 0.15129 (0.123, 0.123E1, ~0.5877472E~38): 0.15129 0.15129 (0.123, 0.123E1, ~0.1E~44): 0.15129 0.15129 (0.123, 0.123E1, ~0.0): 0.15129 0.15129 (0.123, 0.123, 0.123E4): 0.12300151E4 0.12300151E4 (0.123, 0.123, 0.123E2): 0.12315129E2 0.12315129E2 (0.123, 0.123, 0.31415927E1): 0.31567218E1 0.31567218E1 (0.123, 0.123, 0.27182817E1): 0.27334108E1 0.27334108E1 (0.123, 0.123, 0.123E1): 0.1245129E1 0.1245129E1 (0.123, 0.123, 0.123): 0.13812901 0.13812901 (0.123, 0.123, 0.123E~2): 0.16359001E~1 0.16359001E~1 (0.123, 0.123, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, 0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, 0.0): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (0.123, 0.123, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123, 0.123, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (0.123, 0.123, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (0.123, 0.123, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123, 0.123, ~0.123): ~0.107871 ~0.107871 (0.123, 0.123, ~0.123E~2): 0.13899E~1 0.13899E~1 (0.123, 0.123, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123, 0.123, ~0.0): 0.15129001E~1 0.15129001E~1 (0.123, 0.123E~2, 0.123E4): 0.12300001E4 0.12300001E4 (0.123, 0.123E~2, 0.123E2): 0.12300152E2 0.12300152E2 (0.123, 0.123E~2, 0.31415927E1): 0.31417441E1 0.31417441E1 (0.123, 0.123E~2, 0.27182817E1): 0.27184331E1 0.27184331E1 (0.123, 0.123E~2, 0.123E1): 0.12301513E1 0.12301513E1 (0.123, 0.123E~2, 0.123): 0.123151295 0.123151295 (0.123, 0.123E~2, 0.123E~2): 0.138129E~2 0.138129E~2 (0.123, 0.123E~2, 0.11754944E~37): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.5877472E~38): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.1E~44): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.0): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.123E4): ~0.12299999E4 ~0.12299999E4 (0.123, 0.123E~2, ~0.123E2): ~0.12299849E2 ~0.12299849E2 (0.123, 0.123E~2, ~0.31415927E1): ~0.31414413E1 ~0.31414413E1 (0.123, 0.123E~2, ~0.27182817E1): ~0.27181304E1 ~0.27181304E1 (0.123, 0.123E~2, ~0.123E1): ~0.12298487E1 ~0.12298487E1 (0.123, 0.123E~2, ~0.123): ~0.12284871 ~0.12284871 (0.123, 0.123E~2, ~0.123E~2): ~0.10787101E~2 ~0.10787101E~2 (0.123, 0.123E~2, ~0.11754944E~37): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.5877472E~38): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.1E~44): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.0): 0.15129E~3 0.15129E~3 (0.123, 0.11754944E~37, 0.11754944E~37): 0.13200802E~37 0.13200802E~37 (0.123, 0.11754944E~37, 0.5877472E~38): 0.732333E~38 0.732333E~38 (0.123, 0.11754944E~37, 0.1E~44): 0.144586E~38 0.144586E~38 (0.123, 0.11754944E~37, 0.0): 0.1445858E~38 0.1445858E~38 (0.123, 0.11754944E~37, ~0.11754944E~37): ~0.10309085E~37 ~0.10309085E~37 (0.123, 0.11754944E~37, ~0.5877472E~38): ~0.4431613E~38 ~0.4431613E~38 (0.123, 0.11754944E~37, ~0.1E~44): 0.1445857E~38 0.1445857E~38 (0.123, 0.11754944E~37, ~0.0): 0.1445858E~38 0.1445858E~38 (0.123, 0.5877472E~38, 0.11754944E~37): 0.12477872E~37 0.12477872E~37 (0.123, 0.5877472E~38, 0.5877472E~38): 0.66004E~38 0.66004E~38 (0.123, 0.5877472E~38, 0.1E~44): 0.72293E~39 0.72293E~39 (0.123, 0.5877472E~38, 0.0): 0.722928E~39 0.722928E~39 (0.123, 0.5877472E~38, ~0.11754944E~37): ~0.11032015E~37 ~0.11032015E~37 (0.123, 0.5877472E~38, ~0.5877472E~38): ~0.5154543E~38 ~0.5154543E~38 (0.123, 0.5877472E~38, ~0.1E~44): 0.722927E~39 0.722927E~39 (0.123, 0.5877472E~38, ~0.0): 0.722928E~39 0.722928E~39 (0.123, 0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.123, 0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.123, 0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (0.123, 0.1E~44, 0.0): 0.0 0.0 (0.123, 0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.123, 0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.123, 0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.123, 0.1E~44, ~0.0): 0.0 0.0 (0.123, ~0.34028235E39, 0.34028235E39): 0.2984276E39 0.2984276E39 (0.123, ~0.34028235E39, 0.17014117E39): 0.12828644E39 0.12828644E39 (0.123, ~0.34028235E39, 0.123E4): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.123E2): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.31415927E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.27182817E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.123E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.123): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.123E~2): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.1E~44): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, 0.0): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.123, ~0.34028235E39, ~0.17014117E39): ~0.2119959E39 ~0.2119959E39 (0.123, ~0.34028235E39, ~0.123E4): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.123E2): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.31415927E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.27182817E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.123E1): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.123): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.123E~2): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.1E~44): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.34028235E39, ~0.0): ~0.4185473E38 ~0.4185473E38 (0.123, ~0.17014117E39, 0.34028235E39): 0.31935498E39 0.31935498E39 (0.123, ~0.17014117E39, 0.17014117E39): 0.1492138E39 0.1492138E39 (0.123, ~0.17014117E39, 0.123E4): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.123E2): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.31415927E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.27182817E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.123E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.123): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.123E~2): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.1E~44): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, 0.0): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.123, ~0.17014117E39, ~0.17014117E39): ~0.19106853E39 ~0.19106853E39 (0.123, ~0.17014117E39, ~0.123E4): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.123E2): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.31415927E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.27182817E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.123E1): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.123): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.123E~2): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.1E~44): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.17014117E39, ~0.0): ~0.20927365E38 ~0.20927365E38 (0.123, ~0.123E4, 0.123E4): 0.107871E4 0.107871E4 (0.123, ~0.123E4, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123, ~0.123E4, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (0.123, ~0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (0.123, ~0.123E4, 0.123E1): ~0.15006E3 ~0.15006E3 (0.123, ~0.123E4, 0.123): ~0.151167E3 ~0.151167E3 (0.123, ~0.123E4, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (0.123, ~0.123E4, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, 0.0): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123, ~0.123E4, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (0.123, ~0.123E4, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (0.123, ~0.123E4, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (0.123, ~0.123E4, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123, ~0.123E4, ~0.123): ~0.15141301E3 ~0.15141301E3 (0.123, ~0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (0.123, ~0.123E4, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E4, ~0.0): ~0.15129001E3 ~0.15129001E3 (0.123, ~0.123E2, 0.123E4): 0.1228487E4 0.1228487E4 (0.123, ~0.123E2, 0.123E2): 0.107871E2 0.107871E2 (0.123, ~0.123E2, 0.31415927E1): 0.16286926E1 0.16286926E1 (0.123, ~0.123E2, 0.27182817E1): 0.12053816E1 0.12053816E1 (0.123, ~0.123E2, 0.123E1): ~0.28290004 ~0.28290004 (0.123, ~0.123E2, 0.123): ~0.13899001E1 ~0.13899001E1 (0.123, ~0.123E2, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (0.123, ~0.123E2, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, 0.0): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (0.123, ~0.123E2, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (0.123, ~0.123E2, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (0.123, ~0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (0.123, ~0.123E2, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (0.123, ~0.123E2, ~0.123): ~0.16359E1 ~0.16359E1 (0.123, ~0.123E2, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (0.123, ~0.123E2, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.123E2, ~0.0): ~0.15129001E1 ~0.15129001E1 (0.123, ~0.31415927E1, 0.123E4): 0.12296135E4 0.12296135E4 (0.123, ~0.31415927E1, 0.123E2): 0.11913585E2 0.11913585E2 (0.123, ~0.31415927E1, 0.31415927E1): 0.27551768E1 0.27551768E1 (0.123, ~0.31415927E1, 0.27182817E1): 0.23318658E1 0.23318658E1 (0.123, ~0.31415927E1, 0.123E1): 0.8435841 0.8435841 (0.123, ~0.31415927E1, 0.123): ~0.2634159 ~0.2634159 (0.123, ~0.31415927E1, 0.123E~2): ~0.38518593 ~0.38518593 (0.123, ~0.31415927E1, 0.11754944E~37): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, 0.5877472E~38): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, 0.1E~44): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, 0.0): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, ~0.123E4): ~0.12303865E4 ~0.12303865E4 (0.123, ~0.31415927E1, ~0.123E2): ~0.12686416E2 ~0.12686416E2 (0.123, ~0.31415927E1, ~0.31415927E1): ~0.35280087E1 ~0.35280087E1 (0.123, ~0.31415927E1, ~0.27182817E1): ~0.31046977E1 ~0.31046977E1 (0.123, ~0.31415927E1, ~0.123E1): ~0.1616416E1 ~0.1616416E1 (0.123, ~0.31415927E1, ~0.123): ~0.5094159 ~0.5094159 (0.123, ~0.31415927E1, ~0.123E~2): ~0.38764593 ~0.38764593 (0.123, ~0.31415927E1, ~0.11754944E~37): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, ~0.5877472E~38): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, ~0.1E~44): ~0.38641593 ~0.38641593 (0.123, ~0.31415927E1, ~0.0): ~0.38641593 ~0.38641593 (0.123, ~0.27182817E1, 0.123E4): 0.12296656E4 0.12296656E4 (0.123, ~0.27182817E1, 0.123E2): 0.119656515E2 0.119656515E2 (0.123, ~0.27182817E1, 0.31415927E1): 0.2807244E1 0.2807244E1 (0.123, ~0.27182817E1, 0.27182817E1): 0.2383933E1 0.2383933E1 (0.123, ~0.27182817E1, 0.123E1): 0.89565134 0.89565134 (0.123, ~0.27182817E1, 0.123): ~0.21134867 ~0.21134867 (0.123, ~0.27182817E1, 0.123E~2): ~0.33311868 ~0.33311868 (0.123, ~0.27182817E1, 0.11754944E~37): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, 0.5877472E~38): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, 0.1E~44): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, 0.0): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, ~0.123E4): ~0.12303344E4 ~0.12303344E4 (0.123, ~0.27182817E1, ~0.123E2): ~0.12634349E2 ~0.12634349E2 (0.123, ~0.27182817E1, ~0.31415927E1): ~0.34759414E1 ~0.34759414E1 (0.123, ~0.27182817E1, ~0.27182817E1): ~0.30526304E1 ~0.30526304E1 (0.123, ~0.27182817E1, ~0.123E1): ~0.15643487E1 ~0.15643487E1 (0.123, ~0.27182817E1, ~0.123): ~0.45734867 ~0.45734867 (0.123, ~0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557865 (0.123, ~0.27182817E1, ~0.11754944E~37): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, ~0.5877472E~38): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, ~0.1E~44): ~0.33434868 ~0.33434868 (0.123, ~0.27182817E1, ~0.0): ~0.33434868 ~0.33434868 (0.123, ~0.123E1, 0.123E4): 0.12298488E4 0.12298488E4 (0.123, ~0.123E1, 0.123E2): 0.1214871E2 0.1214871E2 (0.123, ~0.123E1, 0.31415927E1): 0.29903028E1 0.29903028E1 (0.123, ~0.123E1, 0.27182817E1): 0.25669918E1 0.25669918E1 (0.123, ~0.123E1, 0.123E1): 0.107871E1 0.107871E1 (0.123, ~0.123E1, 0.123): ~0.28290004E~1 ~0.28290004E~1 (0.123, ~0.123E1, 0.123E~2): ~0.15006001 ~0.15006001 (0.123, ~0.123E1, 0.11754944E~37): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.5877472E~38): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.1E~44): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.0): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.123E4): ~0.12301512E4 ~0.12301512E4 (0.123, ~0.123E1, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (0.123, ~0.123E1, ~0.31415927E1): ~0.32928827E1 ~0.32928827E1 (0.123, ~0.123E1, ~0.27182817E1): ~0.28695717E1 ~0.28695717E1 (0.123, ~0.123E1, ~0.123E1): ~0.13812901E1 ~0.13812901E1 (0.123, ~0.123E1, ~0.123): ~0.27429 ~0.27429 (0.123, ~0.123E1, ~0.123E~2): ~0.15252 ~0.15252 (0.123, ~0.123E1, ~0.11754944E~37): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.5877472E~38): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.1E~44): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.0): ~0.15129 ~0.15129 (0.123, ~0.123, 0.123E4): 0.12299849E4 0.12299849E4 (0.123, ~0.123, 0.123E2): 0.12284871E2 0.12284871E2 (0.123, ~0.123, 0.31415927E1): 0.31264637E1 0.31264637E1 (0.123, ~0.123, 0.27182817E1): 0.27031527E1 0.27031527E1 (0.123, ~0.123, 0.123E1): 0.1214871E1 0.1214871E1 (0.123, ~0.123, 0.123): 0.107871 0.107871 (0.123, ~0.123, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (0.123, ~0.123, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, 0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (0.123, ~0.123, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123, ~0.123, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (0.123, ~0.123, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (0.123, ~0.123, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123, ~0.123, ~0.123): ~0.13812901 ~0.13812901 (0.123, ~0.123, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (0.123, ~0.123, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123, ~0.123E~2, 0.123E4): 0.12299999E4 0.12299999E4 (0.123, ~0.123E~2, 0.123E2): 0.12299849E2 0.12299849E2 (0.123, ~0.123E~2, 0.31415927E1): 0.31414413E1 0.31414413E1 (0.123, ~0.123E~2, 0.27182817E1): 0.27181304E1 0.27181304E1 (0.123, ~0.123E~2, 0.123E1): 0.12298487E1 0.12298487E1 (0.123, ~0.123E~2, 0.123): 0.12284871 0.12284871 (0.123, ~0.123E~2, 0.123E~2): 0.10787101E~2 0.10787101E~2 (0.123, ~0.123E~2, 0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.1E~44): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.0): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.123E4): ~0.12300001E4 ~0.12300001E4 (0.123, ~0.123E~2, ~0.123E2): ~0.12300152E2 ~0.12300152E2 (0.123, ~0.123E~2, ~0.31415927E1): ~0.31417441E1 ~0.31417441E1 (0.123, ~0.123E~2, ~0.27182817E1): ~0.27184331E1 ~0.27184331E1 (0.123, ~0.123E~2, ~0.123E1): ~0.12301513E1 ~0.12301513E1 (0.123, ~0.123E~2, ~0.123): ~0.123151295 ~0.123151295 (0.123, ~0.123E~2, ~0.123E~2): ~0.138129E~2 ~0.138129E~2 (0.123, ~0.123E~2, ~0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.1E~44): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.0): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.11754944E~37, 0.11754944E~37): 0.10309085E~37 0.10309085E~37 (0.123, ~0.11754944E~37, 0.5877472E~38): 0.4431613E~38 0.4431613E~38 (0.123, ~0.11754944E~37, 0.1E~44): ~0.1445857E~38 ~0.1445857E~38 (0.123, ~0.11754944E~37, 0.0): ~0.1445858E~38 ~0.1445858E~38 (0.123, ~0.11754944E~37, ~0.11754944E~37): ~0.13200802E~37 ~0.13200802E~37 (0.123, ~0.11754944E~37, ~0.5877472E~38): ~0.732333E~38 ~0.732333E~38 (0.123, ~0.11754944E~37, ~0.1E~44): ~0.144586E~38 ~0.144586E~38 (0.123, ~0.11754944E~37, ~0.0): ~0.1445858E~38 ~0.1445858E~38 (0.123, ~0.5877472E~38, 0.11754944E~37): 0.11032015E~37 0.11032015E~37 (0.123, ~0.5877472E~38, 0.5877472E~38): 0.5154543E~38 0.5154543E~38 (0.123, ~0.5877472E~38, 0.1E~44): ~0.722927E~39 ~0.722927E~39 (0.123, ~0.5877472E~38, 0.0): ~0.722928E~39 ~0.722928E~39 (0.123, ~0.5877472E~38, ~0.11754944E~37): ~0.12477872E~37 ~0.12477872E~37 (0.123, ~0.5877472E~38, ~0.5877472E~38): ~0.66004E~38 ~0.66004E~38 (0.123, ~0.5877472E~38, ~0.1E~44): ~0.72293E~39 ~0.72293E~39 (0.123, ~0.5877472E~38, ~0.0): ~0.722928E~39 ~0.722928E~39 (0.123, ~0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.123, ~0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.123, ~0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (0.123, ~0.1E~44, 0.0): ~0.0 ~0.0 (0.123, ~0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.123, ~0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.123, ~0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.123, ~0.1E~44, ~0.0): ~0.0 ~0.0 (0.123E~2, 0.34028235E39, 0.34028235E39): inf inf (0.123E~2, 0.34028235E39, 0.17014117E39): 0.17055971E39 0.17055971E39 (0.123E~2, 0.34028235E39, 0.123E4): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.123E2): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.31415927E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.27182817E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.123E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.123): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.123E~2): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.11754944E~37): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.5877472E~38): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.1E~44): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, 0.0): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.34028235E39): ~0.3398638E39 ~0.3398638E39 (0.123E~2, 0.34028235E39, ~0.17014117E39): ~0.16972263E39 ~0.16972263E39 (0.123E~2, 0.34028235E39, ~0.123E4): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.123E2): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.31415927E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.27182817E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.123E1): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.123): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.123E~2): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.11754944E~37): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.5877472E~38): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.1E~44): 0.4185473E36 0.4185473E36 (0.123E~2, 0.34028235E39, ~0.0): 0.4185473E36 0.4185473E36 (0.123E~2, 0.17014117E39, 0.34028235E39): inf inf (0.123E~2, 0.17014117E39, 0.17014117E39): 0.17035044E39 0.17035044E39 (0.123E~2, 0.17014117E39, 0.123E4): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.123E2): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.31415927E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.27182817E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.123E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.123): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.123E~2): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.11754944E~37): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.5877472E~38): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.1E~44): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, 0.0): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.34028235E39): ~0.34007307E39 ~0.34007307E39 (0.123E~2, 0.17014117E39, ~0.17014117E39): ~0.1699319E39 ~0.1699319E39 (0.123E~2, 0.17014117E39, ~0.123E4): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.123E2): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.31415927E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.27182817E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.123E1): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.123): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.123E~2): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.11754944E~37): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.5877472E~38): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.1E~44): 0.20927364E36 0.20927364E36 (0.123E~2, 0.17014117E39, ~0.0): 0.20927364E36 0.20927364E36 (0.123E~2, 0.123E4, 0.123E4): 0.1231513E4 0.1231513E4 (0.123E~2, 0.123E4, 0.123E2): 0.13812901E2 0.13812901E2 (0.123E~2, 0.123E4, 0.31415927E1): 0.4654493E1 0.4654493E1 (0.123E~2, 0.123E4, 0.27182817E1): 0.42311816E1 0.42311816E1 (0.123E~2, 0.123E4, 0.123E1): 0.27429001E1 0.27429001E1 (0.123E~2, 0.123E4, 0.123): 0.16359E1 0.16359E1 (0.123E~2, 0.123E4, 0.123E~2): 0.15141301E1 0.15141301E1 (0.123E~2, 0.123E4, 0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, 0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, 0.1E~44): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, 0.0): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (0.123E~2, 0.123E4, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E~2, 0.123E4, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (0.123E~2, 0.123E4, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (0.123E~2, 0.123E4, ~0.123E1): 0.28290004 0.28290004 (0.123E~2, 0.123E4, ~0.123): 0.13899001E1 0.13899001E1 (0.123E~2, 0.123E4, ~0.123E~2): 0.15116701E1 0.15116701E1 (0.123E~2, 0.123E4, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, ~0.1E~44): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E4, ~0.0): 0.15129001E1 0.15129001E1 (0.123E~2, 0.123E2, 0.123E4): 0.12300151E4 0.12300151E4 (0.123E~2, 0.123E2, 0.123E2): 0.12315129E2 0.12315129E2 (0.123E~2, 0.123E2, 0.31415927E1): 0.31567218E1 0.31567218E1 (0.123E~2, 0.123E2, 0.27182817E1): 0.27334108E1 0.27334108E1 (0.123E~2, 0.123E2, 0.123E1): 0.1245129E1 0.1245129E1 (0.123E~2, 0.123E2, 0.123): 0.13812901 0.13812901 (0.123E~2, 0.123E2, 0.123E~2): 0.16359001E~1 0.16359001E~1 (0.123E~2, 0.123E2, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, 0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, 0.0): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (0.123E~2, 0.123E2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123E~2, 0.123E2, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (0.123E~2, 0.123E2, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (0.123E~2, 0.123E2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123E~2, 0.123E2, ~0.123): ~0.107871 ~0.107871 (0.123E~2, 0.123E2, ~0.123E~2): 0.13899001E~1 0.13899001E~1 (0.123E~2, 0.123E2, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.123E2, ~0.0): 0.15129001E~1 0.15129001E~1 (0.123E~2, 0.31415927E1, 0.123E4): 0.12300039E4 0.12300039E4 (0.123E~2, 0.31415927E1, 0.123E2): 0.123038645E2 0.123038645E2 (0.123E~2, 0.31415927E1, 0.31415927E1): 0.31454568E1 0.31454568E1 (0.123E~2, 0.31415927E1, 0.27182817E1): 0.27221458E1 0.27221458E1 (0.123E~2, 0.31415927E1, 0.123E1): 0.12338642E1 0.12338642E1 (0.123E~2, 0.31415927E1, 0.123): 0.12686417 0.12686417 (0.123E~2, 0.31415927E1, 0.123E~2): 0.50941594E~2 0.50941594E~2 (0.123E~2, 0.31415927E1, 0.11754944E~37): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, 0.5877472E~38): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, 0.1E~44): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, 0.0): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, ~0.123E4): ~0.12299961E4 ~0.12299961E4 (0.123E~2, 0.31415927E1, ~0.123E2): ~0.12296136E2 ~0.12296136E2 (0.123E~2, 0.31415927E1, ~0.31415927E1): ~0.31377287E1 ~0.31377287E1 (0.123E~2, 0.31415927E1, ~0.27182817E1): ~0.27144177E1 ~0.27144177E1 (0.123E~2, 0.31415927E1, ~0.123E1): ~0.12261358E1 ~0.12261358E1 (0.123E~2, 0.31415927E1, ~0.123): ~0.11913584 ~0.11913584 (0.123E~2, 0.31415927E1, ~0.123E~2): 0.26341593E~2 0.26341593E~2 (0.123E~2, 0.31415927E1, ~0.11754944E~37): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, ~0.5877472E~38): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, ~0.1E~44): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.31415927E1, ~0.0): 0.38641593E~2 0.38641593E~2 (0.123E~2, 0.27182817E1, 0.123E4): 0.12300033E4 0.12300033E4 (0.123E~2, 0.27182817E1, 0.123E2): 0.12303344E2 0.12303344E2 (0.123E~2, 0.27182817E1, 0.31415927E1): 0.31449363E1 0.31449363E1 (0.123E~2, 0.27182817E1, 0.27182817E1): 0.27216253E1 0.27216253E1 (0.123E~2, 0.27182817E1, 0.123E1): 0.12333435E1 0.12333435E1 (0.123E~2, 0.27182817E1, 0.123): 0.12634349 0.12634349 (0.123E~2, 0.27182817E1, 0.123E~2): 0.45734867E~2 0.45734867E~2 (0.123E~2, 0.27182817E1, 0.11754944E~37): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, 0.5877472E~38): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, 0.1E~44): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, 0.0): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, ~0.123E4): ~0.12299967E4 ~0.12299967E4 (0.123E~2, 0.27182817E1, ~0.123E2): ~0.12296657E2 ~0.12296657E2 (0.123E~2, 0.27182817E1, ~0.31415927E1): ~0.31382492E1 ~0.31382492E1 (0.123E~2, 0.27182817E1, ~0.27182817E1): ~0.27149382E1 ~0.27149382E1 (0.123E~2, 0.27182817E1, ~0.123E1): ~0.12266566E1 ~0.12266566E1 (0.123E~2, 0.27182817E1, ~0.123): ~0.11965652 ~0.11965652 (0.123E~2, 0.27182817E1, ~0.123E~2): 0.21134866E~2 0.21134866E~2 (0.123E~2, 0.27182817E1, ~0.11754944E~37): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, ~0.5877472E~38): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, ~0.1E~44): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.27182817E1, ~0.0): 0.33434867E~2 0.33434867E~2 (0.123E~2, 0.123E1, 0.123E4): 0.12300015E4 0.12300015E4 (0.123E~2, 0.123E1, 0.123E2): 0.12301513E2 0.12301513E2 (0.123E~2, 0.123E1, 0.31415927E1): 0.31431057E1 0.31431057E1 (0.123E~2, 0.123E1, 0.27182817E1): 0.27197948E1 0.27197948E1 (0.123E~2, 0.123E1, 0.123E1): 0.12315129E1 0.12315129E1 (0.123E~2, 0.123E1, 0.123): 0.1245129 0.1245129 (0.123E~2, 0.123E1, 0.123E~2): 0.27429E~2 0.27429E~2 (0.123E~2, 0.123E1, 0.11754944E~37): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, 0.5877472E~38): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, 0.1E~44): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, 0.0): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, ~0.123E4): ~0.12299985E4 ~0.12299985E4 (0.123E~2, 0.123E1, ~0.123E2): ~0.12298488E2 ~0.12298488E2 (0.123E~2, 0.123E1, ~0.31415927E1): ~0.31400797E1 ~0.31400797E1 (0.123E~2, 0.123E1, ~0.27182817E1): ~0.27167687E1 ~0.27167687E1 (0.123E~2, 0.123E1, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (0.123E~2, 0.123E1, ~0.123): ~0.1214871 ~0.1214871 (0.123E~2, 0.123E1, ~0.123E~2): 0.28290003E~3 0.28290003E~3 (0.123E~2, 0.123E1, ~0.11754944E~37): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, ~0.5877472E~38): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, ~0.1E~44): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123E1, ~0.0): 0.15129001E~2 0.15129001E~2 (0.123E~2, 0.123, 0.123E4): 0.12300001E4 0.12300001E4 (0.123E~2, 0.123, 0.123E2): 0.12300152E2 0.12300152E2 (0.123E~2, 0.123, 0.31415927E1): 0.31417441E1 0.31417441E1 (0.123E~2, 0.123, 0.27182817E1): 0.27184331E1 0.27184331E1 (0.123E~2, 0.123, 0.123E1): 0.12301513E1 0.12301513E1 (0.123E~2, 0.123, 0.123): 0.123151295 0.123151295 (0.123E~2, 0.123, 0.123E~2): 0.138129E~2 0.138129E~2 (0.123E~2, 0.123, 0.11754944E~37): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.5877472E~38): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.1E~44): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.0): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.123E4): ~0.12299999E4 ~0.12299999E4 (0.123E~2, 0.123, ~0.123E2): ~0.12299849E2 ~0.12299849E2 (0.123E~2, 0.123, ~0.31415927E1): ~0.31414413E1 ~0.31414413E1 (0.123E~2, 0.123, ~0.27182817E1): ~0.27181304E1 ~0.27181304E1 (0.123E~2, 0.123, ~0.123E1): ~0.12298487E1 ~0.12298487E1 (0.123E~2, 0.123, ~0.123): ~0.12284871 ~0.12284871 (0.123E~2, 0.123, ~0.123E~2): ~0.10787101E~2 ~0.10787101E~2 (0.123E~2, 0.123, ~0.11754944E~37): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.5877472E~38): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.1E~44): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.0): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123E~2, 0.123E4): 0.123E4 0.123E4 (0.123E~2, 0.123E~2, 0.123E2): 0.12300002E2 0.12300002E2 (0.123E~2, 0.123E~2, 0.31415927E1): 0.31415942E1 0.31415942E1 (0.123E~2, 0.123E~2, 0.27182817E1): 0.27182832E1 0.27182832E1 (0.123E~2, 0.123E~2, 0.123E1): 0.12300016E1 0.12300016E1 (0.123E~2, 0.123E~2, 0.123): 0.123001516 0.123001516 (0.123E~2, 0.123E~2, 0.123E~2): 0.1231513E~2 0.1231513E~2 (0.123E~2, 0.123E~2, 0.11754944E~37): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, 0.5877472E~38): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, 0.1E~44): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, 0.0): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, ~0.123E4): ~0.123E4 ~0.123E4 (0.123E~2, 0.123E~2, ~0.123E2): ~0.12299998E2 ~0.12299998E2 (0.123E~2, 0.123E~2, ~0.31415927E1): ~0.31415913E1 ~0.31415913E1 (0.123E~2, 0.123E~2, ~0.27182817E1): ~0.27182803E1 ~0.27182803E1 (0.123E~2, 0.123E~2, ~0.123E1): ~0.12299985E1 ~0.12299985E1 (0.123E~2, 0.123E~2, ~0.123): ~0.12299849 ~0.12299849 (0.123E~2, 0.123E~2, ~0.123E~2): ~0.12284871E~2 ~0.12284871E~2 (0.123E~2, 0.123E~2, ~0.11754944E~37): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, ~0.5877472E~38): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, ~0.1E~44): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.123E~2, ~0.0): 0.15129001E~5 0.15129001E~5 (0.123E~2, 0.11754944E~37, 0.11754944E~37): 0.11769402E~37 0.11769402E~37 (0.123E~2, 0.11754944E~37, 0.5877472E~38): 0.589193E~38 0.589193E~38 (0.123E~2, 0.11754944E~37, 0.1E~44): 0.1446E~40 0.1446E~40 (0.123E~2, 0.11754944E~37, 0.0): 0.14459E~40 0.14459E~40 (0.123E~2, 0.11754944E~37, ~0.11754944E~37): ~0.11740485E~37 ~0.11740485E~37 (0.123E~2, 0.11754944E~37, ~0.5877472E~38): ~0.5863013E~38 ~0.5863013E~38 (0.123E~2, 0.11754944E~37, ~0.1E~44): 0.14457E~40 0.14457E~40 (0.123E~2, 0.11754944E~37, ~0.0): 0.14459E~40 0.14459E~40 (0.123E~2, 0.5877472E~38, 0.11754944E~37): 0.11762173E~37 0.11762173E~37 (0.123E~2, 0.5877472E~38, 0.5877472E~38): 0.5884701E~38 0.5884701E~38 (0.123E~2, 0.5877472E~38, 0.1E~44): 0.723E~41 0.723E~41 (0.123E~2, 0.5877472E~38, 0.0): 0.7229E~41 0.7229E~41 (0.123E~2, 0.5877472E~38, ~0.11754944E~37): ~0.11747714E~37 ~0.11747714E~37 (0.123E~2, 0.5877472E~38, ~0.5877472E~38): ~0.5870242E~38 ~0.5870242E~38 (0.123E~2, 0.5877472E~38, ~0.1E~44): 0.7228E~41 0.7228E~41 (0.123E~2, 0.5877472E~38, ~0.0): 0.7229E~41 0.7229E~41 (0.123E~2, 0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.123E~2, 0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.123E~2, 0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (0.123E~2, 0.1E~44, 0.0): 0.0 0.0 (0.123E~2, 0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.123E~2, 0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.123E~2, 0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.123E~2, 0.1E~44, ~0.0): 0.0 0.0 (0.123E~2, ~0.34028235E39, 0.34028235E39): 0.3398638E39 0.3398638E39 (0.123E~2, ~0.34028235E39, 0.17014117E39): 0.16972263E39 0.16972263E39 (0.123E~2, ~0.34028235E39, 0.123E4): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.123E2): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.31415927E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.27182817E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.123E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.123): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.123E~2): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.1E~44): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, 0.0): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.34028235E39): ~inf ~inf (0.123E~2, ~0.34028235E39, ~0.17014117E39): ~0.17055971E39 ~0.17055971E39 (0.123E~2, ~0.34028235E39, ~0.123E4): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.123E2): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.31415927E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.27182817E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.123E1): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.123): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.123E~2): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.1E~44): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.34028235E39, ~0.0): ~0.4185473E36 ~0.4185473E36 (0.123E~2, ~0.17014117E39, 0.34028235E39): 0.34007307E39 0.34007307E39 (0.123E~2, ~0.17014117E39, 0.17014117E39): 0.1699319E39 0.1699319E39 (0.123E~2, ~0.17014117E39, 0.123E4): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.123E2): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.31415927E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.27182817E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.123E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.123): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.123E~2): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.1E~44): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, 0.0): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.34028235E39): ~inf ~inf (0.123E~2, ~0.17014117E39, ~0.17014117E39): ~0.17035044E39 ~0.17035044E39 (0.123E~2, ~0.17014117E39, ~0.123E4): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.123E2): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.31415927E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.27182817E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.123E1): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.123): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.123E~2): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.1E~44): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.17014117E39, ~0.0): ~0.20927364E36 ~0.20927364E36 (0.123E~2, ~0.123E4, 0.123E4): 0.1228487E4 0.1228487E4 (0.123E~2, ~0.123E4, 0.123E2): 0.107871E2 0.107871E2 (0.123E~2, ~0.123E4, 0.31415927E1): 0.16286926E1 0.16286926E1 (0.123E~2, ~0.123E4, 0.27182817E1): 0.12053816E1 0.12053816E1 (0.123E~2, ~0.123E4, 0.123E1): ~0.28290004 ~0.28290004 (0.123E~2, ~0.123E4, 0.123): ~0.13899001E1 ~0.13899001E1 (0.123E~2, ~0.123E4, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (0.123E~2, ~0.123E4, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, 0.0): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (0.123E~2, ~0.123E4, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (0.123E~2, ~0.123E4, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (0.123E~2, ~0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (0.123E~2, ~0.123E4, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (0.123E~2, ~0.123E4, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E~2, ~0.123E4, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (0.123E~2, ~0.123E4, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E4, ~0.0): ~0.15129001E1 ~0.15129001E1 (0.123E~2, ~0.123E2, 0.123E4): 0.12299849E4 0.12299849E4 (0.123E~2, ~0.123E2, 0.123E2): 0.12284871E2 0.12284871E2 (0.123E~2, ~0.123E2, 0.31415927E1): 0.31264637E1 0.31264637E1 (0.123E~2, ~0.123E2, 0.27182817E1): 0.27031527E1 0.27031527E1 (0.123E~2, ~0.123E2, 0.123E1): 0.1214871E1 0.1214871E1 (0.123E~2, ~0.123E2, 0.123): 0.107871 0.107871 (0.123E~2, ~0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899001E~1 (0.123E~2, ~0.123E2, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, 0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (0.123E~2, ~0.123E2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123E~2, ~0.123E2, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (0.123E~2, ~0.123E2, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (0.123E~2, ~0.123E2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123E~2, ~0.123E2, ~0.123): ~0.13812901 ~0.13812901 (0.123E~2, ~0.123E2, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (0.123E~2, ~0.123E2, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.123E2, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (0.123E~2, ~0.31415927E1, 0.123E4): 0.12299961E4 0.12299961E4 (0.123E~2, ~0.31415927E1, 0.123E2): 0.12296136E2 0.12296136E2 (0.123E~2, ~0.31415927E1, 0.31415927E1): 0.31377287E1 0.31377287E1 (0.123E~2, ~0.31415927E1, 0.27182817E1): 0.27144177E1 0.27144177E1 (0.123E~2, ~0.31415927E1, 0.123E1): 0.12261358E1 0.12261358E1 (0.123E~2, ~0.31415927E1, 0.123): 0.11913584 0.11913584 (0.123E~2, ~0.31415927E1, 0.123E~2): ~0.26341593E~2 ~0.26341593E~2 (0.123E~2, ~0.31415927E1, 0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, 0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, 0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, 0.0): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, ~0.123E4): ~0.12300039E4 ~0.12300039E4 (0.123E~2, ~0.31415927E1, ~0.123E2): ~0.123038645E2 ~0.123038645E2 (0.123E~2, ~0.31415927E1, ~0.31415927E1): ~0.31454568E1 ~0.31454568E1 (0.123E~2, ~0.31415927E1, ~0.27182817E1): ~0.27221458E1 ~0.27221458E1 (0.123E~2, ~0.31415927E1, ~0.123E1): ~0.12338642E1 ~0.12338642E1 (0.123E~2, ~0.31415927E1, ~0.123): ~0.12686417 ~0.12686417 (0.123E~2, ~0.31415927E1, ~0.123E~2): ~0.50941594E~2 ~0.50941594E~2 (0.123E~2, ~0.31415927E1, ~0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, ~0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, ~0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.31415927E1, ~0.0): ~0.38641593E~2 ~0.38641593E~2 (0.123E~2, ~0.27182817E1, 0.123E4): 0.12299967E4 0.12299967E4 (0.123E~2, ~0.27182817E1, 0.123E2): 0.12296657E2 0.12296657E2 (0.123E~2, ~0.27182817E1, 0.31415927E1): 0.31382492E1 0.31382492E1 (0.123E~2, ~0.27182817E1, 0.27182817E1): 0.27149382E1 0.27149382E1 (0.123E~2, ~0.27182817E1, 0.123E1): 0.12266566E1 0.12266566E1 (0.123E~2, ~0.27182817E1, 0.123): 0.11965652 0.11965652 (0.123E~2, ~0.27182817E1, 0.123E~2): ~0.21134866E~2 ~0.21134866E~2 (0.123E~2, ~0.27182817E1, 0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, 0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, 0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, 0.0): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, ~0.123E4): ~0.12300033E4 ~0.12300033E4 (0.123E~2, ~0.27182817E1, ~0.123E2): ~0.12303344E2 ~0.12303344E2 (0.123E~2, ~0.27182817E1, ~0.31415927E1): ~0.31449363E1 ~0.31449363E1 (0.123E~2, ~0.27182817E1, ~0.27182817E1): ~0.27216253E1 ~0.27216253E1 (0.123E~2, ~0.27182817E1, ~0.123E1): ~0.12333435E1 ~0.12333435E1 (0.123E~2, ~0.27182817E1, ~0.123): ~0.12634349 ~0.12634349 (0.123E~2, ~0.27182817E1, ~0.123E~2): ~0.45734867E~2 ~0.45734867E~2 (0.123E~2, ~0.27182817E1, ~0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, ~0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, ~0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.27182817E1, ~0.0): ~0.33434867E~2 ~0.33434867E~2 (0.123E~2, ~0.123E1, 0.123E4): 0.12299985E4 0.12299985E4 (0.123E~2, ~0.123E1, 0.123E2): 0.12298488E2 0.12298488E2 (0.123E~2, ~0.123E1, 0.31415927E1): 0.31400797E1 0.31400797E1 (0.123E~2, ~0.123E1, 0.27182817E1): 0.27167687E1 0.27167687E1 (0.123E~2, ~0.123E1, 0.123E1): 0.12284871E1 0.12284871E1 (0.123E~2, ~0.123E1, 0.123): 0.1214871 0.1214871 (0.123E~2, ~0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290003E~3 (0.123E~2, ~0.123E1, 0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, 0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, 0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, 0.0): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, ~0.123E4): ~0.12300015E4 ~0.12300015E4 (0.123E~2, ~0.123E1, ~0.123E2): ~0.12301513E2 ~0.12301513E2 (0.123E~2, ~0.123E1, ~0.31415927E1): ~0.31431057E1 ~0.31431057E1 (0.123E~2, ~0.123E1, ~0.27182817E1): ~0.27197948E1 ~0.27197948E1 (0.123E~2, ~0.123E1, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (0.123E~2, ~0.123E1, ~0.123): ~0.1245129 ~0.1245129 (0.123E~2, ~0.123E1, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (0.123E~2, ~0.123E1, ~0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, ~0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, ~0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123E1, ~0.0): ~0.15129001E~2 ~0.15129001E~2 (0.123E~2, ~0.123, 0.123E4): 0.12299999E4 0.12299999E4 (0.123E~2, ~0.123, 0.123E2): 0.12299849E2 0.12299849E2 (0.123E~2, ~0.123, 0.31415927E1): 0.31414413E1 0.31414413E1 (0.123E~2, ~0.123, 0.27182817E1): 0.27181304E1 0.27181304E1 (0.123E~2, ~0.123, 0.123E1): 0.12298487E1 0.12298487E1 (0.123E~2, ~0.123, 0.123): 0.12284871 0.12284871 (0.123E~2, ~0.123, 0.123E~2): 0.10787101E~2 0.10787101E~2 (0.123E~2, ~0.123, 0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.1E~44): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.0): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.123E4): ~0.12300001E4 ~0.12300001E4 (0.123E~2, ~0.123, ~0.123E2): ~0.12300152E2 ~0.12300152E2 (0.123E~2, ~0.123, ~0.31415927E1): ~0.31417441E1 ~0.31417441E1 (0.123E~2, ~0.123, ~0.27182817E1): ~0.27184331E1 ~0.27184331E1 (0.123E~2, ~0.123, ~0.123E1): ~0.12301513E1 ~0.12301513E1 (0.123E~2, ~0.123, ~0.123): ~0.123151295 ~0.123151295 (0.123E~2, ~0.123, ~0.123E~2): ~0.138129E~2 ~0.138129E~2 (0.123E~2, ~0.123, ~0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.1E~44): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.0): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123E~2, 0.123E4): 0.123E4 0.123E4 (0.123E~2, ~0.123E~2, 0.123E2): 0.12299998E2 0.12299998E2 (0.123E~2, ~0.123E~2, 0.31415927E1): 0.31415913E1 0.31415913E1 (0.123E~2, ~0.123E~2, 0.27182817E1): 0.27182803E1 0.27182803E1 (0.123E~2, ~0.123E~2, 0.123E1): 0.12299985E1 0.12299985E1 (0.123E~2, ~0.123E~2, 0.123): 0.12299849 0.12299849 (0.123E~2, ~0.123E~2, 0.123E~2): 0.12284871E~2 0.12284871E~2 (0.123E~2, ~0.123E~2, 0.11754944E~37): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, 0.5877472E~38): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, 0.1E~44): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, 0.0): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, ~0.123E4): ~0.123E4 ~0.123E4 (0.123E~2, ~0.123E~2, ~0.123E2): ~0.12300002E2 ~0.12300002E2 (0.123E~2, ~0.123E~2, ~0.31415927E1): ~0.31415942E1 ~0.31415942E1 (0.123E~2, ~0.123E~2, ~0.27182817E1): ~0.27182832E1 ~0.27182832E1 (0.123E~2, ~0.123E~2, ~0.123E1): ~0.12300016E1 ~0.12300016E1 (0.123E~2, ~0.123E~2, ~0.123): ~0.123001516 ~0.123001516 (0.123E~2, ~0.123E~2, ~0.123E~2): ~0.1231513E~2 ~0.1231513E~2 (0.123E~2, ~0.123E~2, ~0.11754944E~37): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, ~0.5877472E~38): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, ~0.1E~44): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.123E~2, ~0.0): ~0.15129001E~5 ~0.15129001E~5 (0.123E~2, ~0.11754944E~37, 0.11754944E~37): 0.11740485E~37 0.11740485E~37 (0.123E~2, ~0.11754944E~37, 0.5877472E~38): 0.5863013E~38 0.5863013E~38 (0.123E~2, ~0.11754944E~37, 0.1E~44): ~0.14457E~40 ~0.14457E~40 (0.123E~2, ~0.11754944E~37, 0.0): ~0.14459E~40 ~0.14459E~40 (0.123E~2, ~0.11754944E~37, ~0.11754944E~37): ~0.11769402E~37 ~0.11769402E~37 (0.123E~2, ~0.11754944E~37, ~0.5877472E~38): ~0.589193E~38 ~0.589193E~38 (0.123E~2, ~0.11754944E~37, ~0.1E~44): ~0.1446E~40 ~0.1446E~40 (0.123E~2, ~0.11754944E~37, ~0.0): ~0.14459E~40 ~0.14459E~40 (0.123E~2, ~0.5877472E~38, 0.11754944E~37): 0.11747714E~37 0.11747714E~37 (0.123E~2, ~0.5877472E~38, 0.5877472E~38): 0.5870242E~38 0.5870242E~38 (0.123E~2, ~0.5877472E~38, 0.1E~44): ~0.7228E~41 ~0.7228E~41 (0.123E~2, ~0.5877472E~38, 0.0): ~0.7229E~41 ~0.7229E~41 (0.123E~2, ~0.5877472E~38, ~0.11754944E~37): ~0.11762173E~37 ~0.11762173E~37 (0.123E~2, ~0.5877472E~38, ~0.5877472E~38): ~0.5884701E~38 ~0.5884701E~38 (0.123E~2, ~0.5877472E~38, ~0.1E~44): ~0.723E~41 ~0.723E~41 (0.123E~2, ~0.5877472E~38, ~0.0): ~0.7229E~41 ~0.7229E~41 (0.123E~2, ~0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.123E~2, ~0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.123E~2, ~0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (0.123E~2, ~0.1E~44, 0.0): ~0.0 ~0.0 (0.123E~2, ~0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.123E~2, ~0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.123E~2, ~0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.123E~2, ~0.1E~44, ~0.0): ~0.0 ~0.0 (0.11754944E~37, 0.34028235E39, 0.123E4): 0.1234E4 0.1234E4 (0.11754944E~37, 0.34028235E39, 0.123E2): 0.163E2 0.163E2 (0.11754944E~37, 0.34028235E39, 0.27182817E1): 0.67182817E1 0.67182817E1 (0.11754944E~37, 0.34028235E39, 0.123E1): 0.52299995E1 0.52299995E1 (0.11754944E~37, 0.34028235E39, 0.123): 0.41229997E1 0.41229997E1 (0.11754944E~37, 0.34028235E39, 0.123E~2): 0.400123E1 0.400123E1 (0.11754944E~37, 0.34028235E39, ~0.123E4): ~0.1226E4 ~0.1226E4 (0.11754944E~37, 0.34028235E39, ~0.123E2): ~0.83E1 ~0.83E1 (0.11754944E~37, 0.34028235E39, ~0.123): 0.38769999E1 0.38769999E1 (0.11754944E~37, 0.34028235E39, ~0.123E~2): 0.39987698E1 0.39987698E1 (0.11754944E~37, 0.17014117E39, 0.123E4): 0.1232E4 0.1232E4 (0.11754944E~37, 0.17014117E39, 0.123E2): 0.143E2 0.143E2 (0.11754944E~37, 0.17014117E39, 0.31415927E1): 0.51415925E1 0.51415925E1 (0.11754944E~37, 0.17014117E39, 0.27182817E1): 0.47182817E1 0.47182817E1 (0.11754944E~37, 0.17014117E39, 0.123E1): 0.323E1 0.323E1 (0.11754944E~37, 0.17014117E39, 0.123): 0.2123E1 0.2123E1 (0.11754944E~37, 0.17014117E39, 0.123E~2): 0.20012298E1 0.20012298E1 (0.11754944E~37, 0.17014117E39, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.11754944E~37, 0.17014117E39, ~0.123E2): ~0.103E2 ~0.103E2 (0.11754944E~37, 0.17014117E39, ~0.123): 0.18769999E1 0.18769999E1 (0.11754944E~37, 0.17014117E39, ~0.123E~2): 0.19987699E1 0.19987699E1 (0.11754944E~37, 0.123E4, 0.1E~44): 0.1445858E~34 0.1445858E~34 (0.11754944E~37, 0.123E4, ~0.1E~44): 0.1445858E~34 0.1445858E~34 (0.11754944E~37, 0.123E2, 0.1E~44): 0.14458581E~36 0.14458581E~36 (0.11754944E~37, 0.123E2, ~0.1E~44): 0.14458581E~36 0.14458581E~36 (0.11754944E~37, 0.31415927E1, 0.11754944E~37): 0.4868419E~37 0.4868419E~37 (0.11754944E~37, 0.31415927E1, 0.1E~44): 0.36929248E~37 0.36929248E~37 (0.11754944E~37, 0.31415927E1, ~0.1E~44): 0.36929242E~37 0.36929242E~37 (0.11754944E~37, 0.27182817E1, 0.1E~44): 0.31953248E~37 0.31953248E~37 (0.11754944E~37, 0.27182817E1, ~0.1E~44): 0.31953248E~37 0.31953248E~37 (0.11754944E~37, 0.123, 0.11754944E~37): 0.13200802E~37 0.13200802E~37 (0.11754944E~37, 0.123, 0.5877472E~38): 0.732333E~38 0.732333E~38 (0.11754944E~37, 0.123, 0.1E~44): 0.144586E~38 0.144586E~38 (0.11754944E~37, 0.123, 0.0): 0.1445858E~38 0.1445858E~38 (0.11754944E~37, 0.123, ~0.11754944E~37): ~0.10309085E~37 ~0.10309085E~37 (0.11754944E~37, 0.123, ~0.5877472E~38): ~0.4431613E~38 ~0.4431613E~38 (0.11754944E~37, 0.123, ~0.1E~44): 0.1445857E~38 0.1445857E~38 (0.11754944E~37, 0.123, ~0.0): 0.1445858E~38 0.1445858E~38 (0.11754944E~37, 0.123E~2, 0.11754944E~37): 0.11769402E~37 0.11769402E~37 (0.11754944E~37, 0.123E~2, 0.5877472E~38): 0.589193E~38 0.589193E~38 (0.11754944E~37, 0.123E~2, 0.1E~44): 0.1446E~40 0.1446E~40 (0.11754944E~37, 0.123E~2, 0.0): 0.14459E~40 0.14459E~40 (0.11754944E~37, 0.123E~2, ~0.11754944E~37): ~0.11740485E~37 ~0.11740485E~37 (0.11754944E~37, 0.123E~2, ~0.5877472E~38): ~0.5863013E~38 ~0.5863013E~38 (0.11754944E~37, 0.123E~2, ~0.1E~44): 0.14457E~40 0.14457E~40 (0.11754944E~37, 0.123E~2, ~0.0): 0.14459E~40 0.14459E~40 (0.11754944E~37, 0.11754944E~37, 0.0): 0.0 0.0 (0.11754944E~37, 0.11754944E~37, ~0.0): 0.0 0.0 (0.11754944E~37, 0.5877472E~38, 0.0): 0.0 0.0 (0.11754944E~37, 0.5877472E~38, ~0.0): 0.0 0.0 (0.11754944E~37, 0.1E~44, 0.0): 0.0 0.0 (0.11754944E~37, 0.1E~44, ~0.0): 0.0 0.0 (0.11754944E~37, ~0.34028235E39, 0.123E4): 0.1226E4 0.1226E4 (0.11754944E~37, ~0.34028235E39, 0.123E2): 0.83E1 0.83E1 (0.11754944E~37, ~0.34028235E39, 0.123): ~0.38769999E1 ~0.38769999E1 (0.11754944E~37, ~0.34028235E39, 0.123E~2): ~0.39987698E1 ~0.39987698E1 (0.11754944E~37, ~0.34028235E39, ~0.123E4): ~0.1234E4 ~0.1234E4 (0.11754944E~37, ~0.34028235E39, ~0.123E2): ~0.163E2 ~0.163E2 (0.11754944E~37, ~0.34028235E39, ~0.27182817E1): ~0.67182817E1 ~0.67182817E1 (0.11754944E~37, ~0.34028235E39, ~0.123E1): ~0.52299995E1 ~0.52299995E1 (0.11754944E~37, ~0.34028235E39, ~0.123): ~0.41229997E1 ~0.41229997E1 (0.11754944E~37, ~0.34028235E39, ~0.123E~2): ~0.400123E1 ~0.400123E1 (0.11754944E~37, ~0.17014117E39, 0.123E4): 0.1228E4 0.1228E4 (0.11754944E~37, ~0.17014117E39, 0.123E2): 0.103E2 0.103E2 (0.11754944E~37, ~0.17014117E39, 0.123): ~0.18769999E1 ~0.18769999E1 (0.11754944E~37, ~0.17014117E39, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (0.11754944E~37, ~0.17014117E39, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.11754944E~37, ~0.17014117E39, ~0.123E2): ~0.143E2 ~0.143E2 (0.11754944E~37, ~0.17014117E39, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (0.11754944E~37, ~0.17014117E39, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (0.11754944E~37, ~0.17014117E39, ~0.123E1): ~0.323E1 ~0.323E1 (0.11754944E~37, ~0.17014117E39, ~0.123): ~0.2123E1 ~0.2123E1 (0.11754944E~37, ~0.17014117E39, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (0.11754944E~37, ~0.123E4, 0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (0.11754944E~37, ~0.123E4, ~0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (0.11754944E~37, ~0.123E2, 0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (0.11754944E~37, ~0.123E2, ~0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (0.11754944E~37, ~0.31415927E1, 0.1E~44): ~0.36929242E~37 ~0.36929242E~37 (0.11754944E~37, ~0.31415927E1, ~0.11754944E~37): ~0.4868419E~37 ~0.4868419E~37 (0.11754944E~37, ~0.31415927E1, ~0.1E~44): ~0.36929248E~37 ~0.36929248E~37 (0.11754944E~37, ~0.27182817E1, 0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (0.11754944E~37, ~0.27182817E1, ~0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (0.11754944E~37, ~0.123, 0.11754944E~37): 0.10309085E~37 0.10309085E~37 (0.11754944E~37, ~0.123, 0.5877472E~38): 0.4431613E~38 0.4431613E~38 (0.11754944E~37, ~0.123, 0.1E~44): ~0.1445857E~38 ~0.1445857E~38 (0.11754944E~37, ~0.123, 0.0): ~0.1445858E~38 ~0.1445858E~38 (0.11754944E~37, ~0.123, ~0.11754944E~37): ~0.13200802E~37 ~0.13200802E~37 (0.11754944E~37, ~0.123, ~0.5877472E~38): ~0.732333E~38 ~0.732333E~38 (0.11754944E~37, ~0.123, ~0.1E~44): ~0.144586E~38 ~0.144586E~38 (0.11754944E~37, ~0.123, ~0.0): ~0.1445858E~38 ~0.1445858E~38 (0.11754944E~37, ~0.123E~2, 0.11754944E~37): 0.11740485E~37 0.11740485E~37 (0.11754944E~37, ~0.123E~2, 0.5877472E~38): 0.5863013E~38 0.5863013E~38 (0.11754944E~37, ~0.123E~2, 0.1E~44): ~0.14457E~40 ~0.14457E~40 (0.11754944E~37, ~0.123E~2, 0.0): ~0.14459E~40 ~0.14459E~40 (0.11754944E~37, ~0.123E~2, ~0.11754944E~37): ~0.11769402E~37 ~0.11769402E~37 (0.11754944E~37, ~0.123E~2, ~0.5877472E~38): ~0.589193E~38 ~0.589193E~38 (0.11754944E~37, ~0.123E~2, ~0.1E~44): ~0.1446E~40 ~0.1446E~40 (0.11754944E~37, ~0.123E~2, ~0.0): ~0.14459E~40 ~0.14459E~40 (0.11754944E~37, ~0.11754944E~37, 0.0): ~0.0 ~0.0 (0.11754944E~37, ~0.11754944E~37, ~0.0): ~0.0 ~0.0 (0.11754944E~37, ~0.5877472E~38, 0.0): ~0.0 ~0.0 (0.11754944E~37, ~0.5877472E~38, ~0.0): ~0.0 ~0.0 (0.11754944E~37, ~0.1E~44, 0.0): ~0.0 ~0.0 (0.11754944E~37, ~0.1E~44, ~0.0): ~0.0 ~0.0 (0.5877472E~38, 0.34028235E39, 0.123E4): 0.1232E4 0.1232E4 (0.5877472E~38, 0.34028235E39, 0.123E2): 0.143E2 0.143E2 (0.5877472E~38, 0.34028235E39, 0.31415927E1): 0.51415925E1 0.51415925E1 (0.5877472E~38, 0.34028235E39, 0.27182817E1): 0.47182817E1 0.47182817E1 (0.5877472E~38, 0.34028235E39, 0.123E1): 0.323E1 0.323E1 (0.5877472E~38, 0.34028235E39, 0.123): 0.2123E1 0.2123E1 (0.5877472E~38, 0.34028235E39, 0.123E~2): 0.20012298E1 0.20012298E1 (0.5877472E~38, 0.34028235E39, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.5877472E~38, 0.34028235E39, ~0.123E2): ~0.103E2 ~0.103E2 (0.5877472E~38, 0.34028235E39, ~0.123): 0.18769999E1 0.18769999E1 (0.5877472E~38, 0.34028235E39, ~0.123E~2): 0.19987699E1 0.19987699E1 (0.5877472E~38, 0.17014117E39, 0.123E4): 0.1231E4 0.1231E4 (0.5877472E~38, 0.17014117E39, 0.123E2): 0.133E2 0.133E2 (0.5877472E~38, 0.17014117E39, 0.31415927E1): 0.41415925E1 0.41415925E1 (0.5877472E~38, 0.17014117E39, 0.27182817E1): 0.37182817E1 0.37182817E1 (0.5877472E~38, 0.17014117E39, 0.123E1): 0.223E1 0.223E1 (0.5877472E~38, 0.17014117E39, 0.123): 0.11229999E1 0.11229999E1 (0.5877472E~38, 0.17014117E39, 0.123E~2): 0.10012299E1 0.10012299E1 (0.5877472E~38, 0.17014117E39, ~0.123E4): ~0.1229E4 ~0.1229E4 (0.5877472E~38, 0.17014117E39, ~0.123E2): ~0.113E2 ~0.113E2 (0.5877472E~38, 0.17014117E39, ~0.31415927E1): ~0.21415927E1 ~0.21415927E1 (0.5877472E~38, 0.17014117E39, ~0.27182817E1): ~0.17182817E1 ~0.17182817E1 (0.5877472E~38, 0.17014117E39, ~0.123): 0.8769999 0.8769999 (0.5877472E~38, 0.17014117E39, ~0.123E~2): 0.99876994 0.99876994 (0.5877472E~38, 0.123E4, 0.1E~44): 0.722929E~35 0.722929E~35 (0.5877472E~38, 0.123E4, ~0.1E~44): 0.722929E~35 0.722929E~35 (0.5877472E~38, 0.123E2, 0.1E~44): 0.72292904E~37 0.72292904E~37 (0.5877472E~38, 0.123E2, ~0.1E~44): 0.72292904E~37 0.72292904E~37 (0.5877472E~38, 0.31415927E1, 0.11754944E~37): 0.30219568E~37 0.30219568E~37 (0.5877472E~38, 0.31415927E1, 0.5877472E~38): 0.24342096E~37 0.24342096E~37 (0.5877472E~38, 0.123, 0.11754944E~37): 0.12477872E~37 0.12477872E~37 (0.5877472E~38, 0.123, 0.5877472E~38): 0.66004E~38 0.66004E~38 (0.5877472E~38, 0.123, 0.1E~44): 0.72293E~39 0.72293E~39 (0.5877472E~38, 0.123, 0.0): 0.722928E~39 0.722928E~39 (0.5877472E~38, 0.123, ~0.11754944E~37): ~0.11032015E~37 ~0.11032015E~37 (0.5877472E~38, 0.123, ~0.5877472E~38): ~0.5154543E~38 ~0.5154543E~38 (0.5877472E~38, 0.123, ~0.1E~44): 0.722927E~39 0.722927E~39 (0.5877472E~38, 0.123, ~0.0): 0.722928E~39 0.722928E~39 (0.5877472E~38, 0.123E~2, 0.11754944E~37): 0.11762173E~37 0.11762173E~37 (0.5877472E~38, 0.123E~2, 0.5877472E~38): 0.5884701E~38 0.5884701E~38 (0.5877472E~38, 0.123E~2, 0.1E~44): 0.723E~41 0.723E~41 (0.5877472E~38, 0.123E~2, 0.0): 0.7229E~41 0.7229E~41 (0.5877472E~38, 0.123E~2, ~0.11754944E~37): ~0.11747714E~37 ~0.11747714E~37 (0.5877472E~38, 0.123E~2, ~0.5877472E~38): ~0.5870242E~38 ~0.5870242E~38 (0.5877472E~38, 0.123E~2, ~0.1E~44): 0.7228E~41 0.7228E~41 (0.5877472E~38, 0.123E~2, ~0.0): 0.7229E~41 0.7229E~41 (0.5877472E~38, 0.11754944E~37, 0.0): 0.0 0.0 (0.5877472E~38, 0.11754944E~37, ~0.0): 0.0 0.0 (0.5877472E~38, 0.5877472E~38, 0.0): 0.0 0.0 (0.5877472E~38, 0.5877472E~38, ~0.0): 0.0 0.0 (0.5877472E~38, 0.1E~44, 0.0): 0.0 0.0 (0.5877472E~38, 0.1E~44, ~0.0): 0.0 0.0 (0.5877472E~38, ~0.34028235E39, 0.123E4): 0.1228E4 0.1228E4 (0.5877472E~38, ~0.34028235E39, 0.123E2): 0.103E2 0.103E2 (0.5877472E~38, ~0.34028235E39, 0.123): ~0.18769999E1 ~0.18769999E1 (0.5877472E~38, ~0.34028235E39, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (0.5877472E~38, ~0.34028235E39, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.5877472E~38, ~0.34028235E39, ~0.123E2): ~0.143E2 ~0.143E2 (0.5877472E~38, ~0.34028235E39, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (0.5877472E~38, ~0.34028235E39, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (0.5877472E~38, ~0.34028235E39, ~0.123E1): ~0.323E1 ~0.323E1 (0.5877472E~38, ~0.34028235E39, ~0.123): ~0.2123E1 ~0.2123E1 (0.5877472E~38, ~0.34028235E39, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (0.5877472E~38, ~0.17014117E39, 0.123E4): 0.1229E4 0.1229E4 (0.5877472E~38, ~0.17014117E39, 0.123E2): 0.113E2 0.113E2 (0.5877472E~38, ~0.17014117E39, 0.31415927E1): 0.21415927E1 0.21415927E1 (0.5877472E~38, ~0.17014117E39, 0.27182817E1): 0.17182817E1 0.17182817E1 (0.5877472E~38, ~0.17014117E39, 0.123): ~0.8769999 ~0.8769999 (0.5877472E~38, ~0.17014117E39, 0.123E~2): ~0.99876994 ~0.99876994 (0.5877472E~38, ~0.17014117E39, ~0.123E4): ~0.1231E4 ~0.1231E4 (0.5877472E~38, ~0.17014117E39, ~0.123E2): ~0.133E2 ~0.133E2 (0.5877472E~38, ~0.17014117E39, ~0.31415927E1): ~0.41415925E1 ~0.41415925E1 (0.5877472E~38, ~0.17014117E39, ~0.27182817E1): ~0.37182817E1 ~0.37182817E1 (0.5877472E~38, ~0.17014117E39, ~0.123E1): ~0.223E1 ~0.223E1 (0.5877472E~38, ~0.17014117E39, ~0.123): ~0.11229999E1 ~0.11229999E1 (0.5877472E~38, ~0.17014117E39, ~0.123E~2): ~0.10012299E1 ~0.10012299E1 (0.5877472E~38, ~0.123E4, 0.1E~44): ~0.722929E~35 ~0.722929E~35 (0.5877472E~38, ~0.123E4, ~0.1E~44): ~0.722929E~35 ~0.722929E~35 (0.5877472E~38, ~0.123E2, 0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (0.5877472E~38, ~0.123E2, ~0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (0.5877472E~38, ~0.31415927E1, ~0.11754944E~37): ~0.30219568E~37 ~0.30219568E~37 (0.5877472E~38, ~0.31415927E1, ~0.5877472E~38): ~0.24342096E~37 ~0.24342096E~37 (0.5877472E~38, ~0.123, 0.11754944E~37): 0.11032015E~37 0.11032015E~37 (0.5877472E~38, ~0.123, 0.5877472E~38): 0.5154543E~38 0.5154543E~38 (0.5877472E~38, ~0.123, 0.1E~44): ~0.722927E~39 ~0.722927E~39 (0.5877472E~38, ~0.123, 0.0): ~0.722928E~39 ~0.722928E~39 (0.5877472E~38, ~0.123, ~0.11754944E~37): ~0.12477872E~37 ~0.12477872E~37 (0.5877472E~38, ~0.123, ~0.5877472E~38): ~0.66004E~38 ~0.66004E~38 (0.5877472E~38, ~0.123, ~0.1E~44): ~0.72293E~39 ~0.72293E~39 (0.5877472E~38, ~0.123, ~0.0): ~0.722928E~39 ~0.722928E~39 (0.5877472E~38, ~0.123E~2, 0.11754944E~37): 0.11747714E~37 0.11747714E~37 (0.5877472E~38, ~0.123E~2, 0.5877472E~38): 0.5870242E~38 0.5870242E~38 (0.5877472E~38, ~0.123E~2, 0.1E~44): ~0.7228E~41 ~0.7228E~41 (0.5877472E~38, ~0.123E~2, 0.0): ~0.7229E~41 ~0.7229E~41 (0.5877472E~38, ~0.123E~2, ~0.11754944E~37): ~0.11762173E~37 ~0.11762173E~37 (0.5877472E~38, ~0.123E~2, ~0.5877472E~38): ~0.5884701E~38 ~0.5884701E~38 (0.5877472E~38, ~0.123E~2, ~0.1E~44): ~0.723E~41 ~0.723E~41 (0.5877472E~38, ~0.123E~2, ~0.0): ~0.7229E~41 ~0.7229E~41 (0.5877472E~38, ~0.11754944E~37, 0.0): ~0.0 ~0.0 (0.5877472E~38, ~0.11754944E~37, ~0.0): ~0.0 ~0.0 (0.5877472E~38, ~0.5877472E~38, 0.0): ~0.0 ~0.0 (0.5877472E~38, ~0.5877472E~38, ~0.0): ~0.0 ~0.0 (0.5877472E~38, ~0.1E~44, 0.0): ~0.0 ~0.0 (0.5877472E~38, ~0.1E~44, ~0.0): ~0.0 ~0.0 (0.1E~44, 0.34028235E39, 0.123E4): 0.123E4 0.123E4 (0.1E~44, 0.34028235E39, 0.123E2): 0.123E2 0.123E2 (0.1E~44, 0.34028235E39, 0.31415927E1): 0.31415932E1 0.31415932E1 (0.1E~44, 0.34028235E39, 0.27182817E1): 0.27182822E1 0.27182822E1 (0.1E~44, 0.34028235E39, 0.123E1): 0.12300005E1 0.12300005E1 (0.1E~44, 0.34028235E39, 0.123): 0.12300048 0.12300048 (0.1E~44, 0.34028235E39, 0.123E~2): 0.12304769E~2 0.12304769E~2 (0.1E~44, 0.34028235E39, ~0.123E4): ~0.123E4 ~0.123E4 (0.1E~44, 0.34028235E39, ~0.123E2): ~0.123E2 ~0.123E2 (0.1E~44, 0.34028235E39, ~0.31415927E1): ~0.31415923E1 ~0.31415923E1 (0.1E~44, 0.34028235E39, ~0.27182817E1): ~0.27182813E1 ~0.27182813E1 (0.1E~44, 0.34028235E39, ~0.123E1): ~0.12299995E1 ~0.12299995E1 (0.1E~44, 0.34028235E39, ~0.123): ~0.12299953 ~0.12299953 (0.1E~44, 0.34028235E39, ~0.123E~2): ~0.12295232E~2 ~0.12295232E~2 (0.1E~44, 0.17014117E39, 0.123E4): 0.123E4 0.123E4 (0.1E~44, 0.17014117E39, 0.123E2): 0.123E2 0.123E2 (0.1E~44, 0.17014117E39, 0.31415927E1): 0.3141593E1 0.3141593E1 (0.1E~44, 0.17014117E39, 0.27182817E1): 0.2718282E1 0.2718282E1 (0.1E~44, 0.17014117E39, 0.123E1): 0.12300003E1 0.12300003E1 (0.1E~44, 0.17014117E39, 0.123): 0.12300024 0.12300024 (0.1E~44, 0.17014117E39, 0.123E~2): 0.12302385E~2 0.12302385E~2 (0.1E~44, 0.17014117E39, ~0.123E4): ~0.123E4 ~0.123E4 (0.1E~44, 0.17014117E39, ~0.123E2): ~0.123E2 ~0.123E2 (0.1E~44, 0.17014117E39, ~0.31415927E1): ~0.31415925E1 ~0.31415925E1 (0.1E~44, 0.17014117E39, ~0.27182817E1): ~0.27182815E1 ~0.27182815E1 (0.1E~44, 0.17014117E39, ~0.123E1): ~0.12299998E1 ~0.12299998E1 (0.1E~44, 0.17014117E39, ~0.123): ~0.122999765 ~0.122999765 (0.1E~44, 0.17014117E39, ~0.123E~2): ~0.12297616E~2 ~0.12297616E~2 (0.1E~44, 0.123E2, 0.11754944E~37): 0.1175496E~37 0.1175496E~37 (0.1E~44, 0.123E2, 0.5877472E~38): 0.5877489E~38 0.5877489E~38 (0.1E~44, 0.123E2, 0.1E~44): 0.18E~43 0.18E~43 (0.1E~44, 0.123E2, 0.0): 0.17E~43 0.17E~43 (0.1E~44, 0.123E2, ~0.11754944E~37): ~0.11754927E~37 ~0.11754927E~37 (0.1E~44, 0.123E2, ~0.5877472E~38): ~0.5877455E~38 ~0.5877455E~38 (0.1E~44, 0.123E2, ~0.1E~44): 0.15E~43 0.15E~43 (0.1E~44, 0.123E2, ~0.0): 0.17E~43 0.17E~43 (0.1E~44, 0.31415927E1, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (0.1E~44, 0.31415927E1, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (0.1E~44, 0.31415927E1, 0.1E~44): 0.6E~44 0.6E~44 (0.1E~44, 0.31415927E1, 0.0): 0.4E~44 0.4E~44 (0.1E~44, 0.31415927E1, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (0.1E~44, 0.31415927E1, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (0.1E~44, 0.31415927E1, ~0.1E~44): 0.3E~44 0.3E~44 (0.1E~44, 0.31415927E1, ~0.0): 0.4E~44 0.4E~44 (0.1E~44, 0.27182817E1, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (0.1E~44, 0.27182817E1, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (0.1E~44, 0.27182817E1, 0.1E~44): 0.6E~44 0.6E~44 (0.1E~44, 0.27182817E1, 0.0): 0.4E~44 0.4E~44 (0.1E~44, 0.27182817E1, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (0.1E~44, 0.27182817E1, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (0.1E~44, 0.27182817E1, ~0.1E~44): 0.3E~44 0.3E~44 (0.1E~44, 0.27182817E1, ~0.0): 0.4E~44 0.4E~44 (0.1E~44, 0.123E1, 0.11754944E~37): 0.11754945E~37 0.11754945E~37 (0.1E~44, 0.123E1, 0.5877472E~38): 0.5877473E~38 0.5877473E~38 (0.1E~44, 0.123E1, 0.1E~44): 0.3E~44 0.3E~44 (0.1E~44, 0.123E1, 0.0): 0.1E~44 0.1E~44 (0.1E~44, 0.123E1, ~0.11754944E~37): ~0.11754942E~37 ~0.11754942E~37 (0.1E~44, 0.123E1, ~0.5877472E~38): ~0.587747E~38 ~0.587747E~38 (0.1E~44, 0.123E1, ~0.1E~44): 0.0 0.0 (0.1E~44, 0.123E1, ~0.0): 0.1E~44 0.1E~44 (0.1E~44, 0.123, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.1E~44, 0.123, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.1E~44, 0.123, 0.1E~44): 0.1E~44 0.1E~44 (0.1E~44, 0.123, 0.0): 0.0 0.0 (0.1E~44, 0.123, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.1E~44, 0.123, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.1E~44, 0.123, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.1E~44, 0.123, ~0.0): 0.0 0.0 (0.1E~44, 0.123E~2, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.1E~44, 0.123E~2, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.1E~44, 0.123E~2, 0.1E~44): 0.1E~44 0.1E~44 (0.1E~44, 0.123E~2, 0.0): 0.0 0.0 (0.1E~44, 0.123E~2, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.1E~44, 0.123E~2, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.1E~44, 0.123E~2, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.1E~44, 0.123E~2, ~0.0): 0.0 0.0 (0.1E~44, 0.11754944E~37, 0.0): 0.0 0.0 (0.1E~44, 0.11754944E~37, ~0.0): 0.0 0.0 (0.1E~44, 0.5877472E~38, 0.0): 0.0 0.0 (0.1E~44, 0.5877472E~38, ~0.0): 0.0 0.0 (0.1E~44, 0.1E~44, 0.0): 0.0 0.0 (0.1E~44, 0.1E~44, ~0.0): 0.0 0.0 (0.1E~44, ~0.34028235E39, 0.123E4): 0.123E4 0.123E4 (0.1E~44, ~0.34028235E39, 0.123E2): 0.123E2 0.123E2 (0.1E~44, ~0.34028235E39, 0.31415927E1): 0.31415923E1 0.31415923E1 (0.1E~44, ~0.34028235E39, 0.27182817E1): 0.27182813E1 0.27182813E1 (0.1E~44, ~0.34028235E39, 0.123E1): 0.12299995E1 0.12299995E1 (0.1E~44, ~0.34028235E39, 0.123): 0.12299953 0.12299953 (0.1E~44, ~0.34028235E39, 0.123E~2): 0.12295232E~2 0.12295232E~2 (0.1E~44, ~0.34028235E39, ~0.123E4): ~0.123E4 ~0.123E4 (0.1E~44, ~0.34028235E39, ~0.123E2): ~0.123E2 ~0.123E2 (0.1E~44, ~0.34028235E39, ~0.31415927E1): ~0.31415932E1 ~0.31415932E1 (0.1E~44, ~0.34028235E39, ~0.27182817E1): ~0.27182822E1 ~0.27182822E1 (0.1E~44, ~0.34028235E39, ~0.123E1): ~0.12300005E1 ~0.12300005E1 (0.1E~44, ~0.34028235E39, ~0.123): ~0.12300048 ~0.12300048 (0.1E~44, ~0.34028235E39, ~0.123E~2): ~0.12304769E~2 ~0.12304769E~2 (0.1E~44, ~0.17014117E39, 0.123E4): 0.123E4 0.123E4 (0.1E~44, ~0.17014117E39, 0.123E2): 0.123E2 0.123E2 (0.1E~44, ~0.17014117E39, 0.31415927E1): 0.31415925E1 0.31415925E1 (0.1E~44, ~0.17014117E39, 0.27182817E1): 0.27182815E1 0.27182815E1 (0.1E~44, ~0.17014117E39, 0.123E1): 0.12299998E1 0.12299998E1 (0.1E~44, ~0.17014117E39, 0.123): 0.122999765 0.122999765 (0.1E~44, ~0.17014117E39, 0.123E~2): 0.12297616E~2 0.12297616E~2 (0.1E~44, ~0.17014117E39, ~0.123E4): ~0.123E4 ~0.123E4 (0.1E~44, ~0.17014117E39, ~0.123E2): ~0.123E2 ~0.123E2 (0.1E~44, ~0.17014117E39, ~0.31415927E1): ~0.3141593E1 ~0.3141593E1 (0.1E~44, ~0.17014117E39, ~0.27182817E1): ~0.2718282E1 ~0.2718282E1 (0.1E~44, ~0.17014117E39, ~0.123E1): ~0.12300003E1 ~0.12300003E1 (0.1E~44, ~0.17014117E39, ~0.123): ~0.12300024 ~0.12300024 (0.1E~44, ~0.17014117E39, ~0.123E~2): ~0.12302385E~2 ~0.12302385E~2 (0.1E~44, ~0.123E2, 0.11754944E~37): 0.11754927E~37 0.11754927E~37 (0.1E~44, ~0.123E2, 0.5877472E~38): 0.5877455E~38 0.5877455E~38 (0.1E~44, ~0.123E2, 0.1E~44): ~0.15E~43 ~0.15E~43 (0.1E~44, ~0.123E2, 0.0): ~0.17E~43 ~0.17E~43 (0.1E~44, ~0.123E2, ~0.11754944E~37): ~0.1175496E~37 ~0.1175496E~37 (0.1E~44, ~0.123E2, ~0.5877472E~38): ~0.5877489E~38 ~0.5877489E~38 (0.1E~44, ~0.123E2, ~0.1E~44): ~0.18E~43 ~0.18E~43 (0.1E~44, ~0.123E2, ~0.0): ~0.17E~43 ~0.17E~43 (0.1E~44, ~0.31415927E1, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (0.1E~44, ~0.31415927E1, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (0.1E~44, ~0.31415927E1, 0.1E~44): ~0.3E~44 ~0.3E~44 (0.1E~44, ~0.31415927E1, 0.0): ~0.4E~44 ~0.4E~44 (0.1E~44, ~0.31415927E1, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (0.1E~44, ~0.31415927E1, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (0.1E~44, ~0.31415927E1, ~0.1E~44): ~0.6E~44 ~0.6E~44 (0.1E~44, ~0.31415927E1, ~0.0): ~0.4E~44 ~0.4E~44 (0.1E~44, ~0.27182817E1, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (0.1E~44, ~0.27182817E1, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (0.1E~44, ~0.27182817E1, 0.1E~44): ~0.3E~44 ~0.3E~44 (0.1E~44, ~0.27182817E1, 0.0): ~0.4E~44 ~0.4E~44 (0.1E~44, ~0.27182817E1, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (0.1E~44, ~0.27182817E1, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (0.1E~44, ~0.27182817E1, ~0.1E~44): ~0.6E~44 ~0.6E~44 (0.1E~44, ~0.27182817E1, ~0.0): ~0.4E~44 ~0.4E~44 (0.1E~44, ~0.123E1, 0.11754944E~37): 0.11754942E~37 0.11754942E~37 (0.1E~44, ~0.123E1, 0.5877472E~38): 0.587747E~38 0.587747E~38 (0.1E~44, ~0.123E1, 0.1E~44): ~0.0 ~0.0 (0.1E~44, ~0.123E1, 0.0): ~0.1E~44 ~0.1E~44 (0.1E~44, ~0.123E1, ~0.11754944E~37): ~0.11754945E~37 ~0.11754945E~37 (0.1E~44, ~0.123E1, ~0.5877472E~38): ~0.5877473E~38 ~0.5877473E~38 (0.1E~44, ~0.123E1, ~0.1E~44): ~0.3E~44 ~0.3E~44 (0.1E~44, ~0.123E1, ~0.0): ~0.1E~44 ~0.1E~44 (0.1E~44, ~0.123, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.1E~44, ~0.123, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.1E~44, ~0.123, 0.1E~44): 0.1E~44 0.1E~44 (0.1E~44, ~0.123, 0.0): ~0.0 ~0.0 (0.1E~44, ~0.123, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.1E~44, ~0.123, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.1E~44, ~0.123, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.1E~44, ~0.123, ~0.0): ~0.0 ~0.0 (0.1E~44, ~0.123E~2, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (0.1E~44, ~0.123E~2, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (0.1E~44, ~0.123E~2, 0.1E~44): 0.1E~44 0.1E~44 (0.1E~44, ~0.123E~2, 0.0): ~0.0 ~0.0 (0.1E~44, ~0.123E~2, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (0.1E~44, ~0.123E~2, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (0.1E~44, ~0.123E~2, ~0.1E~44): ~0.1E~44 ~0.1E~44 (0.1E~44, ~0.123E~2, ~0.0): ~0.0 ~0.0 (0.1E~44, ~0.11754944E~37, 0.0): ~0.0 ~0.0 (0.1E~44, ~0.11754944E~37, ~0.0): ~0.0 ~0.0 (0.1E~44, ~0.5877472E~38, 0.0): ~0.0 ~0.0 (0.1E~44, ~0.5877472E~38, ~0.0): ~0.0 ~0.0 (0.1E~44, ~0.1E~44, 0.0): ~0.0 ~0.0 (0.1E~44, ~0.1E~44, ~0.0): ~0.0 ~0.0 (~0.34028235E39, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.123E4): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.123E2): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.123E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.123): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.34028235E39, 0.0): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.123): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.34028235E39, ~0.0): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.123E4): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.123E2): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.123E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.123): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.17014117E39, 0.0): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.123): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.17014117E39, ~0.0): ~inf ~inf (~0.34028235E39, 0.123E4, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E4, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.123E4, 0.123E4): ~inf ~inf (~0.34028235E39, 0.123E4, 0.123E2): ~inf ~inf (~0.34028235E39, 0.123E4, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E4, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E4, 0.123E1): ~inf ~inf (~0.34028235E39, 0.123E4, 0.123): ~inf ~inf (~0.34028235E39, 0.123E4, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E4, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E4, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E4, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E4, 0.0): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.123): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E4, ~0.0): ~inf ~inf (~0.34028235E39, 0.123E2, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E2, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.123E2, 0.123E4): ~inf ~inf (~0.34028235E39, 0.123E2, 0.123E2): ~inf ~inf (~0.34028235E39, 0.123E2, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E2, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E2, 0.123E1): ~inf ~inf (~0.34028235E39, 0.123E2, 0.123): ~inf ~inf (~0.34028235E39, 0.123E2, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E2, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E2, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E2, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E2, 0.0): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.123): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E2, ~0.0): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.123E4): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.123E2): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.123E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.123): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.31415927E1, 0.0): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.123): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.31415927E1, ~0.0): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.34028235E39): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.17014117E39): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.123E4): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.123E2): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.123E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.123): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.27182817E1, 0.0): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.123): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.27182817E1, ~0.0): ~inf ~inf (~0.34028235E39, 0.123E1, 0.34028235E39): ~0.78264946E38 ~0.78264946E38 (~0.34028235E39, 0.123E1, 0.17014117E39): ~0.24840611E39 ~0.24840611E39 (~0.34028235E39, 0.123E1, 0.123E4): ~inf ~inf (~0.34028235E39, 0.123E1, 0.123E2): ~inf ~inf (~0.34028235E39, 0.123E1, 0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E1, 0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E1, 0.123E1): ~inf ~inf (~0.34028235E39, 0.123E1, 0.123): ~inf ~inf (~0.34028235E39, 0.123E1, 0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E1, 0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E1, 0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E1, 0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E1, 0.0): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.17014117E39): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.123E4): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.123E2): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.31415927E1): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.27182817E1): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.123E1): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.123): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.123E~2): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.11754944E~37): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.5877472E~38): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.1E~44): ~inf ~inf (~0.34028235E39, 0.123E1, ~0.0): ~inf ~inf (~0.34028235E39, 0.123, 0.34028235E39): 0.2984276E39 0.2984276E39 (~0.34028235E39, 0.123, 0.17014117E39): 0.12828644E39 0.12828644E39 (~0.34028235E39, 0.123, 0.123E4): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.123E2): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.31415927E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.27182817E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.123E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.123): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.123E~2): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.1E~44): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, 0.0): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123, ~0.17014117E39): ~0.2119959E39 ~0.2119959E39 (~0.34028235E39, 0.123, ~0.123E4): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.123E2): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.31415927E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.27182817E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.123E1): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.123): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.123E~2): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.1E~44): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123, ~0.0): ~0.4185473E38 ~0.4185473E38 (~0.34028235E39, 0.123E~2, 0.34028235E39): 0.3398638E39 0.3398638E39 (~0.34028235E39, 0.123E~2, 0.17014117E39): 0.16972263E39 0.16972263E39 (~0.34028235E39, 0.123E~2, 0.123E4): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.123E2): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.31415927E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.27182817E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.123E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.123): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.123E~2): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.1E~44): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, 0.0): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.34028235E39): ~inf ~inf (~0.34028235E39, 0.123E~2, ~0.17014117E39): ~0.17055971E39 ~0.17055971E39 (~0.34028235E39, 0.123E~2, ~0.123E4): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.123E2): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.31415927E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.27182817E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.123E1): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.123): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.123E~2): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.1E~44): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.123E~2, ~0.0): ~0.4185473E36 ~0.4185473E36 (~0.34028235E39, 0.11754944E~37, 0.123E4): 0.1226E4 0.1226E4 (~0.34028235E39, 0.11754944E~37, 0.123E2): 0.83E1 0.83E1 (~0.34028235E39, 0.11754944E~37, 0.123): ~0.38769999E1 ~0.38769999E1 (~0.34028235E39, 0.11754944E~37, 0.123E~2): ~0.39987698E1 ~0.39987698E1 (~0.34028235E39, 0.11754944E~37, ~0.123E4): ~0.1234E4 ~0.1234E4 (~0.34028235E39, 0.11754944E~37, ~0.123E2): ~0.163E2 ~0.163E2 (~0.34028235E39, 0.11754944E~37, ~0.27182817E1): ~0.67182817E1 ~0.67182817E1 (~0.34028235E39, 0.11754944E~37, ~0.123E1): ~0.52299995E1 ~0.52299995E1 (~0.34028235E39, 0.11754944E~37, ~0.123): ~0.41229997E1 ~0.41229997E1 (~0.34028235E39, 0.11754944E~37, ~0.123E~2): ~0.400123E1 ~0.400123E1 (~0.34028235E39, 0.5877472E~38, 0.123E4): 0.1228E4 0.1228E4 (~0.34028235E39, 0.5877472E~38, 0.123E2): 0.103E2 0.103E2 (~0.34028235E39, 0.5877472E~38, 0.123): ~0.18769999E1 ~0.18769999E1 (~0.34028235E39, 0.5877472E~38, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (~0.34028235E39, 0.5877472E~38, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.34028235E39, 0.5877472E~38, ~0.123E2): ~0.143E2 ~0.143E2 (~0.34028235E39, 0.5877472E~38, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (~0.34028235E39, 0.5877472E~38, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (~0.34028235E39, 0.5877472E~38, ~0.123E1): ~0.323E1 ~0.323E1 (~0.34028235E39, 0.5877472E~38, ~0.123): ~0.2123E1 ~0.2123E1 (~0.34028235E39, 0.5877472E~38, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (~0.34028235E39, 0.1E~44, 0.123E4): 0.123E4 0.123E4 (~0.34028235E39, 0.1E~44, 0.123E2): 0.123E2 0.123E2 (~0.34028235E39, 0.1E~44, 0.31415927E1): 0.31415923E1 0.31415923E1 (~0.34028235E39, 0.1E~44, 0.27182817E1): 0.27182813E1 0.27182813E1 (~0.34028235E39, 0.1E~44, 0.123E1): 0.12299995E1 0.12299995E1 (~0.34028235E39, 0.1E~44, 0.123): 0.12299953 0.12299953 (~0.34028235E39, 0.1E~44, 0.123E~2): 0.12295232E~2 0.12295232E~2 (~0.34028235E39, 0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (~0.34028235E39, 0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (~0.34028235E39, 0.1E~44, ~0.31415927E1): ~0.31415932E1 ~0.31415932E1 (~0.34028235E39, 0.1E~44, ~0.27182817E1): ~0.27182822E1 ~0.27182822E1 (~0.34028235E39, 0.1E~44, ~0.123E1): ~0.12300005E1 ~0.12300005E1 (~0.34028235E39, 0.1E~44, ~0.123): ~0.12300048 ~0.12300048 (~0.34028235E39, 0.1E~44, ~0.123E~2): ~0.12304769E~2 ~0.12304769E~2 (~0.34028235E39, ~0.34028235E39, 0.34028235E39): inf inf (~0.34028235E39, ~0.34028235E39, 0.17014117E39): inf inf (~0.34028235E39, ~0.34028235E39, 0.123E4): inf inf (~0.34028235E39, ~0.34028235E39, 0.123E2): inf inf (~0.34028235E39, ~0.34028235E39, 0.31415927E1): inf inf (~0.34028235E39, ~0.34028235E39, 0.27182817E1): inf inf (~0.34028235E39, ~0.34028235E39, 0.123E1): inf inf (~0.34028235E39, ~0.34028235E39, 0.123): inf inf (~0.34028235E39, ~0.34028235E39, 0.123E~2): inf inf (~0.34028235E39, ~0.34028235E39, 0.11754944E~37): inf inf (~0.34028235E39, ~0.34028235E39, 0.5877472E~38): inf inf (~0.34028235E39, ~0.34028235E39, 0.1E~44): inf inf (~0.34028235E39, ~0.34028235E39, 0.0): inf inf (~0.34028235E39, ~0.34028235E39, ~0.34028235E39): inf inf (~0.34028235E39, ~0.34028235E39, ~0.17014117E39): inf inf (~0.34028235E39, ~0.34028235E39, ~0.123E4): inf inf (~0.34028235E39, ~0.34028235E39, ~0.123E2): inf inf (~0.34028235E39, ~0.34028235E39, ~0.31415927E1): inf inf (~0.34028235E39, ~0.34028235E39, ~0.27182817E1): inf inf (~0.34028235E39, ~0.34028235E39, ~0.123E1): inf inf (~0.34028235E39, ~0.34028235E39, ~0.123): inf inf (~0.34028235E39, ~0.34028235E39, ~0.123E~2): inf inf (~0.34028235E39, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.34028235E39, ~0.1E~44): inf inf (~0.34028235E39, ~0.34028235E39, ~0.0): inf inf (~0.34028235E39, ~0.17014117E39, 0.34028235E39): inf inf (~0.34028235E39, ~0.17014117E39, 0.17014117E39): inf inf (~0.34028235E39, ~0.17014117E39, 0.123E4): inf inf (~0.34028235E39, ~0.17014117E39, 0.123E2): inf inf (~0.34028235E39, ~0.17014117E39, 0.31415927E1): inf inf (~0.34028235E39, ~0.17014117E39, 0.27182817E1): inf inf (~0.34028235E39, ~0.17014117E39, 0.123E1): inf inf (~0.34028235E39, ~0.17014117E39, 0.123): inf inf (~0.34028235E39, ~0.17014117E39, 0.123E~2): inf inf (~0.34028235E39, ~0.17014117E39, 0.11754944E~37): inf inf (~0.34028235E39, ~0.17014117E39, 0.5877472E~38): inf inf (~0.34028235E39, ~0.17014117E39, 0.1E~44): inf inf (~0.34028235E39, ~0.17014117E39, 0.0): inf inf (~0.34028235E39, ~0.17014117E39, ~0.34028235E39): inf inf (~0.34028235E39, ~0.17014117E39, ~0.17014117E39): inf inf (~0.34028235E39, ~0.17014117E39, ~0.123E4): inf inf (~0.34028235E39, ~0.17014117E39, ~0.123E2): inf inf (~0.34028235E39, ~0.17014117E39, ~0.31415927E1): inf inf (~0.34028235E39, ~0.17014117E39, ~0.27182817E1): inf inf (~0.34028235E39, ~0.17014117E39, ~0.123E1): inf inf (~0.34028235E39, ~0.17014117E39, ~0.123): inf inf (~0.34028235E39, ~0.17014117E39, ~0.123E~2): inf inf (~0.34028235E39, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.17014117E39, ~0.1E~44): inf inf (~0.34028235E39, ~0.17014117E39, ~0.0): inf inf (~0.34028235E39, ~0.123E4, 0.34028235E39): inf inf (~0.34028235E39, ~0.123E4, 0.17014117E39): inf inf (~0.34028235E39, ~0.123E4, 0.123E4): inf inf (~0.34028235E39, ~0.123E4, 0.123E2): inf inf (~0.34028235E39, ~0.123E4, 0.31415927E1): inf inf (~0.34028235E39, ~0.123E4, 0.27182817E1): inf inf (~0.34028235E39, ~0.123E4, 0.123E1): inf inf (~0.34028235E39, ~0.123E4, 0.123): inf inf (~0.34028235E39, ~0.123E4, 0.123E~2): inf inf (~0.34028235E39, ~0.123E4, 0.11754944E~37): inf inf (~0.34028235E39, ~0.123E4, 0.5877472E~38): inf inf (~0.34028235E39, ~0.123E4, 0.1E~44): inf inf (~0.34028235E39, ~0.123E4, 0.0): inf inf (~0.34028235E39, ~0.123E4, ~0.34028235E39): inf inf (~0.34028235E39, ~0.123E4, ~0.17014117E39): inf inf (~0.34028235E39, ~0.123E4, ~0.123E4): inf inf (~0.34028235E39, ~0.123E4, ~0.123E2): inf inf (~0.34028235E39, ~0.123E4, ~0.31415927E1): inf inf (~0.34028235E39, ~0.123E4, ~0.27182817E1): inf inf (~0.34028235E39, ~0.123E4, ~0.123E1): inf inf (~0.34028235E39, ~0.123E4, ~0.123): inf inf (~0.34028235E39, ~0.123E4, ~0.123E~2): inf inf (~0.34028235E39, ~0.123E4, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.123E4, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.123E4, ~0.1E~44): inf inf (~0.34028235E39, ~0.123E4, ~0.0): inf inf (~0.34028235E39, ~0.123E2, 0.34028235E39): inf inf (~0.34028235E39, ~0.123E2, 0.17014117E39): inf inf (~0.34028235E39, ~0.123E2, 0.123E4): inf inf (~0.34028235E39, ~0.123E2, 0.123E2): inf inf (~0.34028235E39, ~0.123E2, 0.31415927E1): inf inf (~0.34028235E39, ~0.123E2, 0.27182817E1): inf inf (~0.34028235E39, ~0.123E2, 0.123E1): inf inf (~0.34028235E39, ~0.123E2, 0.123): inf inf (~0.34028235E39, ~0.123E2, 0.123E~2): inf inf (~0.34028235E39, ~0.123E2, 0.11754944E~37): inf inf (~0.34028235E39, ~0.123E2, 0.5877472E~38): inf inf (~0.34028235E39, ~0.123E2, 0.1E~44): inf inf (~0.34028235E39, ~0.123E2, 0.0): inf inf (~0.34028235E39, ~0.123E2, ~0.34028235E39): inf inf (~0.34028235E39, ~0.123E2, ~0.17014117E39): inf inf (~0.34028235E39, ~0.123E2, ~0.123E4): inf inf (~0.34028235E39, ~0.123E2, ~0.123E2): inf inf (~0.34028235E39, ~0.123E2, ~0.31415927E1): inf inf (~0.34028235E39, ~0.123E2, ~0.27182817E1): inf inf (~0.34028235E39, ~0.123E2, ~0.123E1): inf inf (~0.34028235E39, ~0.123E2, ~0.123): inf inf (~0.34028235E39, ~0.123E2, ~0.123E~2): inf inf (~0.34028235E39, ~0.123E2, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.123E2, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.123E2, ~0.1E~44): inf inf (~0.34028235E39, ~0.123E2, ~0.0): inf inf (~0.34028235E39, ~0.31415927E1, 0.34028235E39): inf inf (~0.34028235E39, ~0.31415927E1, 0.17014117E39): inf inf (~0.34028235E39, ~0.31415927E1, 0.123E4): inf inf (~0.34028235E39, ~0.31415927E1, 0.123E2): inf inf (~0.34028235E39, ~0.31415927E1, 0.31415927E1): inf inf (~0.34028235E39, ~0.31415927E1, 0.27182817E1): inf inf (~0.34028235E39, ~0.31415927E1, 0.123E1): inf inf (~0.34028235E39, ~0.31415927E1, 0.123): inf inf (~0.34028235E39, ~0.31415927E1, 0.123E~2): inf inf (~0.34028235E39, ~0.31415927E1, 0.11754944E~37): inf inf (~0.34028235E39, ~0.31415927E1, 0.5877472E~38): inf inf (~0.34028235E39, ~0.31415927E1, 0.1E~44): inf inf (~0.34028235E39, ~0.31415927E1, 0.0): inf inf (~0.34028235E39, ~0.31415927E1, ~0.34028235E39): inf inf (~0.34028235E39, ~0.31415927E1, ~0.17014117E39): inf inf (~0.34028235E39, ~0.31415927E1, ~0.123E4): inf inf (~0.34028235E39, ~0.31415927E1, ~0.123E2): inf inf (~0.34028235E39, ~0.31415927E1, ~0.31415927E1): inf inf (~0.34028235E39, ~0.31415927E1, ~0.27182817E1): inf inf (~0.34028235E39, ~0.31415927E1, ~0.123E1): inf inf (~0.34028235E39, ~0.31415927E1, ~0.123): inf inf (~0.34028235E39, ~0.31415927E1, ~0.123E~2): inf inf (~0.34028235E39, ~0.31415927E1, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.31415927E1, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.31415927E1, ~0.1E~44): inf inf (~0.34028235E39, ~0.31415927E1, ~0.0): inf inf (~0.34028235E39, ~0.27182817E1, 0.34028235E39): inf inf (~0.34028235E39, ~0.27182817E1, 0.17014117E39): inf inf (~0.34028235E39, ~0.27182817E1, 0.123E4): inf inf (~0.34028235E39, ~0.27182817E1, 0.123E2): inf inf (~0.34028235E39, ~0.27182817E1, 0.31415927E1): inf inf (~0.34028235E39, ~0.27182817E1, 0.27182817E1): inf inf (~0.34028235E39, ~0.27182817E1, 0.123E1): inf inf (~0.34028235E39, ~0.27182817E1, 0.123): inf inf (~0.34028235E39, ~0.27182817E1, 0.123E~2): inf inf (~0.34028235E39, ~0.27182817E1, 0.11754944E~37): inf inf (~0.34028235E39, ~0.27182817E1, 0.5877472E~38): inf inf (~0.34028235E39, ~0.27182817E1, 0.1E~44): inf inf (~0.34028235E39, ~0.27182817E1, 0.0): inf inf (~0.34028235E39, ~0.27182817E1, ~0.34028235E39): inf inf (~0.34028235E39, ~0.27182817E1, ~0.17014117E39): inf inf (~0.34028235E39, ~0.27182817E1, ~0.123E4): inf inf (~0.34028235E39, ~0.27182817E1, ~0.123E2): inf inf (~0.34028235E39, ~0.27182817E1, ~0.31415927E1): inf inf (~0.34028235E39, ~0.27182817E1, ~0.27182817E1): inf inf (~0.34028235E39, ~0.27182817E1, ~0.123E1): inf inf (~0.34028235E39, ~0.27182817E1, ~0.123): inf inf (~0.34028235E39, ~0.27182817E1, ~0.123E~2): inf inf (~0.34028235E39, ~0.27182817E1, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.27182817E1, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.27182817E1, ~0.1E~44): inf inf (~0.34028235E39, ~0.27182817E1, ~0.0): inf inf (~0.34028235E39, ~0.123E1, 0.34028235E39): inf inf (~0.34028235E39, ~0.123E1, 0.17014117E39): inf inf (~0.34028235E39, ~0.123E1, 0.123E4): inf inf (~0.34028235E39, ~0.123E1, 0.123E2): inf inf (~0.34028235E39, ~0.123E1, 0.31415927E1): inf inf (~0.34028235E39, ~0.123E1, 0.27182817E1): inf inf (~0.34028235E39, ~0.123E1, 0.123E1): inf inf (~0.34028235E39, ~0.123E1, 0.123): inf inf (~0.34028235E39, ~0.123E1, 0.123E~2): inf inf (~0.34028235E39, ~0.123E1, 0.11754944E~37): inf inf (~0.34028235E39, ~0.123E1, 0.5877472E~38): inf inf (~0.34028235E39, ~0.123E1, 0.1E~44): inf inf (~0.34028235E39, ~0.123E1, 0.0): inf inf (~0.34028235E39, ~0.123E1, ~0.34028235E39): 0.78264946E38 0.78264946E38 (~0.34028235E39, ~0.123E1, ~0.17014117E39): 0.24840611E39 0.24840611E39 (~0.34028235E39, ~0.123E1, ~0.123E4): inf inf (~0.34028235E39, ~0.123E1, ~0.123E2): inf inf (~0.34028235E39, ~0.123E1, ~0.31415927E1): inf inf (~0.34028235E39, ~0.123E1, ~0.27182817E1): inf inf (~0.34028235E39, ~0.123E1, ~0.123E1): inf inf (~0.34028235E39, ~0.123E1, ~0.123): inf inf (~0.34028235E39, ~0.123E1, ~0.123E~2): inf inf (~0.34028235E39, ~0.123E1, ~0.11754944E~37): inf inf (~0.34028235E39, ~0.123E1, ~0.5877472E~38): inf inf (~0.34028235E39, ~0.123E1, ~0.1E~44): inf inf (~0.34028235E39, ~0.123E1, ~0.0): inf inf (~0.34028235E39, ~0.123, 0.34028235E39): inf inf (~0.34028235E39, ~0.123, 0.17014117E39): 0.2119959E39 0.2119959E39 (~0.34028235E39, ~0.123, 0.123E4): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.123E2): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.31415927E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.27182817E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.123E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.123): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.123E~2): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.11754944E~37): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.5877472E~38): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.1E~44): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, 0.0): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.34028235E39): ~0.2984276E39 ~0.2984276E39 (~0.34028235E39, ~0.123, ~0.17014117E39): ~0.12828644E39 ~0.12828644E39 (~0.34028235E39, ~0.123, ~0.123E4): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.123E2): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.31415927E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.27182817E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.123E1): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.123): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.123E~2): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.11754944E~37): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.5877472E~38): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.1E~44): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123, ~0.0): 0.4185473E38 0.4185473E38 (~0.34028235E39, ~0.123E~2, 0.34028235E39): inf inf (~0.34028235E39, ~0.123E~2, 0.17014117E39): 0.17055971E39 0.17055971E39 (~0.34028235E39, ~0.123E~2, 0.123E4): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.123E2): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.31415927E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.27182817E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.123E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.123): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.123E~2): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.11754944E~37): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.5877472E~38): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.1E~44): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, 0.0): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.34028235E39): ~0.3398638E39 ~0.3398638E39 (~0.34028235E39, ~0.123E~2, ~0.17014117E39): ~0.16972263E39 ~0.16972263E39 (~0.34028235E39, ~0.123E~2, ~0.123E4): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.123E2): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.31415927E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.27182817E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.123E1): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.123): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.123E~2): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.11754944E~37): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.5877472E~38): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.1E~44): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.123E~2, ~0.0): 0.4185473E36 0.4185473E36 (~0.34028235E39, ~0.11754944E~37, 0.123E4): 0.1234E4 0.1234E4 (~0.34028235E39, ~0.11754944E~37, 0.123E2): 0.163E2 0.163E2 (~0.34028235E39, ~0.11754944E~37, 0.27182817E1): 0.67182817E1 0.67182817E1 (~0.34028235E39, ~0.11754944E~37, 0.123E1): 0.52299995E1 0.52299995E1 (~0.34028235E39, ~0.11754944E~37, 0.123): 0.41229997E1 0.41229997E1 (~0.34028235E39, ~0.11754944E~37, 0.123E~2): 0.400123E1 0.400123E1 (~0.34028235E39, ~0.11754944E~37, ~0.123E4): ~0.1226E4 ~0.1226E4 (~0.34028235E39, ~0.11754944E~37, ~0.123E2): ~0.83E1 ~0.83E1 (~0.34028235E39, ~0.11754944E~37, ~0.123): 0.38769999E1 0.38769999E1 (~0.34028235E39, ~0.11754944E~37, ~0.123E~2): 0.39987698E1 0.39987698E1 (~0.34028235E39, ~0.5877472E~38, 0.123E4): 0.1232E4 0.1232E4 (~0.34028235E39, ~0.5877472E~38, 0.123E2): 0.143E2 0.143E2 (~0.34028235E39, ~0.5877472E~38, 0.31415927E1): 0.51415925E1 0.51415925E1 (~0.34028235E39, ~0.5877472E~38, 0.27182817E1): 0.47182817E1 0.47182817E1 (~0.34028235E39, ~0.5877472E~38, 0.123E1): 0.323E1 0.323E1 (~0.34028235E39, ~0.5877472E~38, 0.123): 0.2123E1 0.2123E1 (~0.34028235E39, ~0.5877472E~38, 0.123E~2): 0.20012298E1 0.20012298E1 (~0.34028235E39, ~0.5877472E~38, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.34028235E39, ~0.5877472E~38, ~0.123E2): ~0.103E2 ~0.103E2 (~0.34028235E39, ~0.5877472E~38, ~0.123): 0.18769999E1 0.18769999E1 (~0.34028235E39, ~0.5877472E~38, ~0.123E~2): 0.19987699E1 0.19987699E1 (~0.34028235E39, ~0.1E~44, 0.123E4): 0.123E4 0.123E4 (~0.34028235E39, ~0.1E~44, 0.123E2): 0.123E2 0.123E2 (~0.34028235E39, ~0.1E~44, 0.31415927E1): 0.31415932E1 0.31415932E1 (~0.34028235E39, ~0.1E~44, 0.27182817E1): 0.27182822E1 0.27182822E1 (~0.34028235E39, ~0.1E~44, 0.123E1): 0.12300005E1 0.12300005E1 (~0.34028235E39, ~0.1E~44, 0.123): 0.12300048 0.12300048 (~0.34028235E39, ~0.1E~44, 0.123E~2): 0.12304769E~2 0.12304769E~2 (~0.34028235E39, ~0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (~0.34028235E39, ~0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (~0.34028235E39, ~0.1E~44, ~0.31415927E1): ~0.31415923E1 ~0.31415923E1 (~0.34028235E39, ~0.1E~44, ~0.27182817E1): ~0.27182813E1 ~0.27182813E1 (~0.34028235E39, ~0.1E~44, ~0.123E1): ~0.12299995E1 ~0.12299995E1 (~0.34028235E39, ~0.1E~44, ~0.123): ~0.12299953 ~0.12299953 (~0.34028235E39, ~0.1E~44, ~0.123E~2): ~0.12295232E~2 ~0.12295232E~2 (~0.17014117E39, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.123E4): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.123E2): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.123E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.123): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.34028235E39, 0.0): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.123): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.34028235E39, ~0.0): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.34028235E39): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.17014117E39): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.123E4): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.123E2): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.123E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.123): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.17014117E39, 0.0): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.123): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.17014117E39, ~0.0): ~inf ~inf (~0.17014117E39, 0.123E4, 0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E4, 0.17014117E39): ~inf ~inf (~0.17014117E39, 0.123E4, 0.123E4): ~inf ~inf (~0.17014117E39, 0.123E4, 0.123E2): ~inf ~inf (~0.17014117E39, 0.123E4, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.123E4, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.123E4, 0.123E1): ~inf ~inf (~0.17014117E39, 0.123E4, 0.123): ~inf ~inf (~0.17014117E39, 0.123E4, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.123E4, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.123E4, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.123E4, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.123E4, 0.0): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.123): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.123E4, ~0.0): ~inf ~inf (~0.17014117E39, 0.123E2, 0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E2, 0.17014117E39): ~inf ~inf (~0.17014117E39, 0.123E2, 0.123E4): ~inf ~inf (~0.17014117E39, 0.123E2, 0.123E2): ~inf ~inf (~0.17014117E39, 0.123E2, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.123E2, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.123E2, 0.123E1): ~inf ~inf (~0.17014117E39, 0.123E2, 0.123): ~inf ~inf (~0.17014117E39, 0.123E2, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.123E2, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.123E2, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.123E2, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.123E2, 0.0): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.123): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.123E2, ~0.0): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.34028235E39): ~0.19423192E39 ~0.19423192E39 (~0.17014117E39, 0.31415927E1, 0.17014117E39): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.123E4): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.123E2): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.123E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.123): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.31415927E1, 0.0): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.123): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.31415927E1, ~0.0): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.34028235E39): ~0.1222093E39 ~0.1222093E39 (~0.17014117E39, 0.27182817E1, 0.17014117E39): ~0.29235047E39 ~0.29235047E39 (~0.17014117E39, 0.27182817E1, 0.123E4): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.123E2): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.31415927E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.27182817E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.123E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.123): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.123E~2): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.1E~44): ~inf ~inf (~0.17014117E39, 0.27182817E1, 0.0): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.123E4): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.123E2): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.31415927E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.27182817E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.123E1): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.123): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.123E~2): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.11754944E~37): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.5877472E~38): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.1E~44): ~inf ~inf (~0.17014117E39, 0.27182817E1, ~0.0): ~inf ~inf (~0.17014117E39, 0.123E1, 0.34028235E39): 0.1310087E39 0.1310087E39 (~0.17014117E39, 0.123E1, 0.17014117E39): ~0.39132473E38 ~0.39132473E38 (~0.17014117E39, 0.123E1, 0.123E4): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.123E2): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.31415927E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.27182817E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.123E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.123): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.123E~2): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.1E~44): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, 0.0): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E1, ~0.17014117E39): ~inf ~inf (~0.17014117E39, 0.123E1, ~0.123E4): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.123E2): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.31415927E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.27182817E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.123E1): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.123): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.123E~2): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.1E~44): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123E1, ~0.0): ~0.20927364E39 ~0.20927364E39 (~0.17014117E39, 0.123, 0.34028235E39): 0.31935498E39 0.31935498E39 (~0.17014117E39, 0.123, 0.17014117E39): 0.1492138E39 0.1492138E39 (~0.17014117E39, 0.123, 0.123E4): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.123E2): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.31415927E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.27182817E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.123E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.123): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.123E~2): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.1E~44): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, 0.0): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123, ~0.17014117E39): ~0.19106853E39 ~0.19106853E39 (~0.17014117E39, 0.123, ~0.123E4): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.123E2): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.31415927E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.27182817E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.123E1): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.123): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.123E~2): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.1E~44): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123, ~0.0): ~0.20927365E38 ~0.20927365E38 (~0.17014117E39, 0.123E~2, 0.34028235E39): 0.34007307E39 0.34007307E39 (~0.17014117E39, 0.123E~2, 0.17014117E39): 0.1699319E39 0.1699319E39 (~0.17014117E39, 0.123E~2, 0.123E4): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.123E2): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.31415927E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.27182817E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.123E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.123): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.123E~2): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.1E~44): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, 0.0): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.34028235E39): ~inf ~inf (~0.17014117E39, 0.123E~2, ~0.17014117E39): ~0.17035044E39 ~0.17035044E39 (~0.17014117E39, 0.123E~2, ~0.123E4): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.123E2): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.31415927E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.27182817E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.123E1): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.123): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.123E~2): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.1E~44): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.123E~2, ~0.0): ~0.20927364E36 ~0.20927364E36 (~0.17014117E39, 0.11754944E~37, 0.123E4): 0.1228E4 0.1228E4 (~0.17014117E39, 0.11754944E~37, 0.123E2): 0.103E2 0.103E2 (~0.17014117E39, 0.11754944E~37, 0.123): ~0.18769999E1 ~0.18769999E1 (~0.17014117E39, 0.11754944E~37, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (~0.17014117E39, 0.11754944E~37, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.17014117E39, 0.11754944E~37, ~0.123E2): ~0.143E2 ~0.143E2 (~0.17014117E39, 0.11754944E~37, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (~0.17014117E39, 0.11754944E~37, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (~0.17014117E39, 0.11754944E~37, ~0.123E1): ~0.323E1 ~0.323E1 (~0.17014117E39, 0.11754944E~37, ~0.123): ~0.2123E1 ~0.2123E1 (~0.17014117E39, 0.11754944E~37, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (~0.17014117E39, 0.5877472E~38, 0.123E4): 0.1229E4 0.1229E4 (~0.17014117E39, 0.5877472E~38, 0.123E2): 0.113E2 0.113E2 (~0.17014117E39, 0.5877472E~38, 0.31415927E1): 0.21415927E1 0.21415927E1 (~0.17014117E39, 0.5877472E~38, 0.27182817E1): 0.17182817E1 0.17182817E1 (~0.17014117E39, 0.5877472E~38, 0.123): ~0.8769999 ~0.8769999 (~0.17014117E39, 0.5877472E~38, 0.123E~2): ~0.99876994 ~0.99876994 (~0.17014117E39, 0.5877472E~38, ~0.123E4): ~0.1231E4 ~0.1231E4 (~0.17014117E39, 0.5877472E~38, ~0.123E2): ~0.133E2 ~0.133E2 (~0.17014117E39, 0.5877472E~38, ~0.31415927E1): ~0.41415925E1 ~0.41415925E1 (~0.17014117E39, 0.5877472E~38, ~0.27182817E1): ~0.37182817E1 ~0.37182817E1 (~0.17014117E39, 0.5877472E~38, ~0.123E1): ~0.223E1 ~0.223E1 (~0.17014117E39, 0.5877472E~38, ~0.123): ~0.11229999E1 ~0.11229999E1 (~0.17014117E39, 0.5877472E~38, ~0.123E~2): ~0.10012299E1 ~0.10012299E1 (~0.17014117E39, 0.1E~44, 0.123E4): 0.123E4 0.123E4 (~0.17014117E39, 0.1E~44, 0.123E2): 0.123E2 0.123E2 (~0.17014117E39, 0.1E~44, 0.31415927E1): 0.31415925E1 0.31415925E1 (~0.17014117E39, 0.1E~44, 0.27182817E1): 0.27182815E1 0.27182815E1 (~0.17014117E39, 0.1E~44, 0.123E1): 0.12299998E1 0.12299998E1 (~0.17014117E39, 0.1E~44, 0.123): 0.122999765 0.122999765 (~0.17014117E39, 0.1E~44, 0.123E~2): 0.12297616E~2 0.12297616E~2 (~0.17014117E39, 0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (~0.17014117E39, 0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (~0.17014117E39, 0.1E~44, ~0.31415927E1): ~0.3141593E1 ~0.3141593E1 (~0.17014117E39, 0.1E~44, ~0.27182817E1): ~0.2718282E1 ~0.2718282E1 (~0.17014117E39, 0.1E~44, ~0.123E1): ~0.12300003E1 ~0.12300003E1 (~0.17014117E39, 0.1E~44, ~0.123): ~0.12300024 ~0.12300024 (~0.17014117E39, 0.1E~44, ~0.123E~2): ~0.12302385E~2 ~0.12302385E~2 (~0.17014117E39, ~0.34028235E39, 0.34028235E39): inf inf (~0.17014117E39, ~0.34028235E39, 0.17014117E39): inf inf (~0.17014117E39, ~0.34028235E39, 0.123E4): inf inf (~0.17014117E39, ~0.34028235E39, 0.123E2): inf inf (~0.17014117E39, ~0.34028235E39, 0.31415927E1): inf inf (~0.17014117E39, ~0.34028235E39, 0.27182817E1): inf inf (~0.17014117E39, ~0.34028235E39, 0.123E1): inf inf (~0.17014117E39, ~0.34028235E39, 0.123): inf inf (~0.17014117E39, ~0.34028235E39, 0.123E~2): inf inf (~0.17014117E39, ~0.34028235E39, 0.11754944E~37): inf inf (~0.17014117E39, ~0.34028235E39, 0.5877472E~38): inf inf (~0.17014117E39, ~0.34028235E39, 0.1E~44): inf inf (~0.17014117E39, ~0.34028235E39, 0.0): inf inf (~0.17014117E39, ~0.34028235E39, ~0.34028235E39): inf inf (~0.17014117E39, ~0.34028235E39, ~0.17014117E39): inf inf (~0.17014117E39, ~0.34028235E39, ~0.123E4): inf inf (~0.17014117E39, ~0.34028235E39, ~0.123E2): inf inf (~0.17014117E39, ~0.34028235E39, ~0.31415927E1): inf inf (~0.17014117E39, ~0.34028235E39, ~0.27182817E1): inf inf (~0.17014117E39, ~0.34028235E39, ~0.123E1): inf inf (~0.17014117E39, ~0.34028235E39, ~0.123): inf inf (~0.17014117E39, ~0.34028235E39, ~0.123E~2): inf inf (~0.17014117E39, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.34028235E39, ~0.1E~44): inf inf (~0.17014117E39, ~0.34028235E39, ~0.0): inf inf (~0.17014117E39, ~0.17014117E39, 0.34028235E39): inf inf (~0.17014117E39, ~0.17014117E39, 0.17014117E39): inf inf (~0.17014117E39, ~0.17014117E39, 0.123E4): inf inf (~0.17014117E39, ~0.17014117E39, 0.123E2): inf inf (~0.17014117E39, ~0.17014117E39, 0.31415927E1): inf inf (~0.17014117E39, ~0.17014117E39, 0.27182817E1): inf inf (~0.17014117E39, ~0.17014117E39, 0.123E1): inf inf (~0.17014117E39, ~0.17014117E39, 0.123): inf inf (~0.17014117E39, ~0.17014117E39, 0.123E~2): inf inf (~0.17014117E39, ~0.17014117E39, 0.11754944E~37): inf inf (~0.17014117E39, ~0.17014117E39, 0.5877472E~38): inf inf (~0.17014117E39, ~0.17014117E39, 0.1E~44): inf inf (~0.17014117E39, ~0.17014117E39, 0.0): inf inf (~0.17014117E39, ~0.17014117E39, ~0.34028235E39): inf inf (~0.17014117E39, ~0.17014117E39, ~0.17014117E39): inf inf (~0.17014117E39, ~0.17014117E39, ~0.123E4): inf inf (~0.17014117E39, ~0.17014117E39, ~0.123E2): inf inf (~0.17014117E39, ~0.17014117E39, ~0.31415927E1): inf inf (~0.17014117E39, ~0.17014117E39, ~0.27182817E1): inf inf (~0.17014117E39, ~0.17014117E39, ~0.123E1): inf inf (~0.17014117E39, ~0.17014117E39, ~0.123): inf inf (~0.17014117E39, ~0.17014117E39, ~0.123E~2): inf inf (~0.17014117E39, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.17014117E39, ~0.1E~44): inf inf (~0.17014117E39, ~0.17014117E39, ~0.0): inf inf (~0.17014117E39, ~0.123E4, 0.34028235E39): inf inf (~0.17014117E39, ~0.123E4, 0.17014117E39): inf inf (~0.17014117E39, ~0.123E4, 0.123E4): inf inf (~0.17014117E39, ~0.123E4, 0.123E2): inf inf (~0.17014117E39, ~0.123E4, 0.31415927E1): inf inf (~0.17014117E39, ~0.123E4, 0.27182817E1): inf inf (~0.17014117E39, ~0.123E4, 0.123E1): inf inf (~0.17014117E39, ~0.123E4, 0.123): inf inf (~0.17014117E39, ~0.123E4, 0.123E~2): inf inf (~0.17014117E39, ~0.123E4, 0.11754944E~37): inf inf (~0.17014117E39, ~0.123E4, 0.5877472E~38): inf inf (~0.17014117E39, ~0.123E4, 0.1E~44): inf inf (~0.17014117E39, ~0.123E4, 0.0): inf inf (~0.17014117E39, ~0.123E4, ~0.34028235E39): inf inf (~0.17014117E39, ~0.123E4, ~0.17014117E39): inf inf (~0.17014117E39, ~0.123E4, ~0.123E4): inf inf (~0.17014117E39, ~0.123E4, ~0.123E2): inf inf (~0.17014117E39, ~0.123E4, ~0.31415927E1): inf inf (~0.17014117E39, ~0.123E4, ~0.27182817E1): inf inf (~0.17014117E39, ~0.123E4, ~0.123E1): inf inf (~0.17014117E39, ~0.123E4, ~0.123): inf inf (~0.17014117E39, ~0.123E4, ~0.123E~2): inf inf (~0.17014117E39, ~0.123E4, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.123E4, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.123E4, ~0.1E~44): inf inf (~0.17014117E39, ~0.123E4, ~0.0): inf inf (~0.17014117E39, ~0.123E2, 0.34028235E39): inf inf (~0.17014117E39, ~0.123E2, 0.17014117E39): inf inf (~0.17014117E39, ~0.123E2, 0.123E4): inf inf (~0.17014117E39, ~0.123E2, 0.123E2): inf inf (~0.17014117E39, ~0.123E2, 0.31415927E1): inf inf (~0.17014117E39, ~0.123E2, 0.27182817E1): inf inf (~0.17014117E39, ~0.123E2, 0.123E1): inf inf (~0.17014117E39, ~0.123E2, 0.123): inf inf (~0.17014117E39, ~0.123E2, 0.123E~2): inf inf (~0.17014117E39, ~0.123E2, 0.11754944E~37): inf inf (~0.17014117E39, ~0.123E2, 0.5877472E~38): inf inf (~0.17014117E39, ~0.123E2, 0.1E~44): inf inf (~0.17014117E39, ~0.123E2, 0.0): inf inf (~0.17014117E39, ~0.123E2, ~0.34028235E39): inf inf (~0.17014117E39, ~0.123E2, ~0.17014117E39): inf inf (~0.17014117E39, ~0.123E2, ~0.123E4): inf inf (~0.17014117E39, ~0.123E2, ~0.123E2): inf inf (~0.17014117E39, ~0.123E2, ~0.31415927E1): inf inf (~0.17014117E39, ~0.123E2, ~0.27182817E1): inf inf (~0.17014117E39, ~0.123E2, ~0.123E1): inf inf (~0.17014117E39, ~0.123E2, ~0.123): inf inf (~0.17014117E39, ~0.123E2, ~0.123E~2): inf inf (~0.17014117E39, ~0.123E2, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.123E2, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.123E2, ~0.1E~44): inf inf (~0.17014117E39, ~0.123E2, ~0.0): inf inf (~0.17014117E39, ~0.31415927E1, 0.34028235E39): inf inf (~0.17014117E39, ~0.31415927E1, 0.17014117E39): inf inf (~0.17014117E39, ~0.31415927E1, 0.123E4): inf inf (~0.17014117E39, ~0.31415927E1, 0.123E2): inf inf (~0.17014117E39, ~0.31415927E1, 0.31415927E1): inf inf (~0.17014117E39, ~0.31415927E1, 0.27182817E1): inf inf (~0.17014117E39, ~0.31415927E1, 0.123E1): inf inf (~0.17014117E39, ~0.31415927E1, 0.123): inf inf (~0.17014117E39, ~0.31415927E1, 0.123E~2): inf inf (~0.17014117E39, ~0.31415927E1, 0.11754944E~37): inf inf (~0.17014117E39, ~0.31415927E1, 0.5877472E~38): inf inf (~0.17014117E39, ~0.31415927E1, 0.1E~44): inf inf (~0.17014117E39, ~0.31415927E1, 0.0): inf inf (~0.17014117E39, ~0.31415927E1, ~0.34028235E39): 0.19423192E39 0.19423192E39 (~0.17014117E39, ~0.31415927E1, ~0.17014117E39): inf inf (~0.17014117E39, ~0.31415927E1, ~0.123E4): inf inf (~0.17014117E39, ~0.31415927E1, ~0.123E2): inf inf (~0.17014117E39, ~0.31415927E1, ~0.31415927E1): inf inf (~0.17014117E39, ~0.31415927E1, ~0.27182817E1): inf inf (~0.17014117E39, ~0.31415927E1, ~0.123E1): inf inf (~0.17014117E39, ~0.31415927E1, ~0.123): inf inf (~0.17014117E39, ~0.31415927E1, ~0.123E~2): inf inf (~0.17014117E39, ~0.31415927E1, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.31415927E1, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.31415927E1, ~0.1E~44): inf inf (~0.17014117E39, ~0.31415927E1, ~0.0): inf inf (~0.17014117E39, ~0.27182817E1, 0.34028235E39): inf inf (~0.17014117E39, ~0.27182817E1, 0.17014117E39): inf inf (~0.17014117E39, ~0.27182817E1, 0.123E4): inf inf (~0.17014117E39, ~0.27182817E1, 0.123E2): inf inf (~0.17014117E39, ~0.27182817E1, 0.31415927E1): inf inf (~0.17014117E39, ~0.27182817E1, 0.27182817E1): inf inf (~0.17014117E39, ~0.27182817E1, 0.123E1): inf inf (~0.17014117E39, ~0.27182817E1, 0.123): inf inf (~0.17014117E39, ~0.27182817E1, 0.123E~2): inf inf (~0.17014117E39, ~0.27182817E1, 0.11754944E~37): inf inf (~0.17014117E39, ~0.27182817E1, 0.5877472E~38): inf inf (~0.17014117E39, ~0.27182817E1, 0.1E~44): inf inf (~0.17014117E39, ~0.27182817E1, 0.0): inf inf (~0.17014117E39, ~0.27182817E1, ~0.34028235E39): 0.1222093E39 0.1222093E39 (~0.17014117E39, ~0.27182817E1, ~0.17014117E39): 0.29235047E39 0.29235047E39 (~0.17014117E39, ~0.27182817E1, ~0.123E4): inf inf (~0.17014117E39, ~0.27182817E1, ~0.123E2): inf inf (~0.17014117E39, ~0.27182817E1, ~0.31415927E1): inf inf (~0.17014117E39, ~0.27182817E1, ~0.27182817E1): inf inf (~0.17014117E39, ~0.27182817E1, ~0.123E1): inf inf (~0.17014117E39, ~0.27182817E1, ~0.123): inf inf (~0.17014117E39, ~0.27182817E1, ~0.123E~2): inf inf (~0.17014117E39, ~0.27182817E1, ~0.11754944E~37): inf inf (~0.17014117E39, ~0.27182817E1, ~0.5877472E~38): inf inf (~0.17014117E39, ~0.27182817E1, ~0.1E~44): inf inf (~0.17014117E39, ~0.27182817E1, ~0.0): inf inf (~0.17014117E39, ~0.123E1, 0.34028235E39): inf inf (~0.17014117E39, ~0.123E1, 0.17014117E39): inf inf (~0.17014117E39, ~0.123E1, 0.123E4): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.123E2): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.31415927E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.27182817E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.123E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.123): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.123E~2): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.11754944E~37): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.5877472E~38): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.1E~44): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, 0.0): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.34028235E39): ~0.1310087E39 ~0.1310087E39 (~0.17014117E39, ~0.123E1, ~0.17014117E39): 0.39132473E38 0.39132473E38 (~0.17014117E39, ~0.123E1, ~0.123E4): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.123E2): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.31415927E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.27182817E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.123E1): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.123): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.123E~2): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.11754944E~37): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.5877472E~38): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.1E~44): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123E1, ~0.0): 0.20927364E39 0.20927364E39 (~0.17014117E39, ~0.123, 0.34028235E39): inf inf (~0.17014117E39, ~0.123, 0.17014117E39): 0.19106853E39 0.19106853E39 (~0.17014117E39, ~0.123, 0.123E4): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.123E2): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.31415927E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.27182817E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.123E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.123): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.123E~2): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.11754944E~37): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.5877472E~38): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.1E~44): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, 0.0): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.34028235E39): ~0.31935498E39 ~0.31935498E39 (~0.17014117E39, ~0.123, ~0.17014117E39): ~0.1492138E39 ~0.1492138E39 (~0.17014117E39, ~0.123, ~0.123E4): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.123E2): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.31415927E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.27182817E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.123E1): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.123): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.123E~2): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.11754944E~37): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.5877472E~38): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.1E~44): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123, ~0.0): 0.20927365E38 0.20927365E38 (~0.17014117E39, ~0.123E~2, 0.34028235E39): inf inf (~0.17014117E39, ~0.123E~2, 0.17014117E39): 0.17035044E39 0.17035044E39 (~0.17014117E39, ~0.123E~2, 0.123E4): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.123E2): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.31415927E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.27182817E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.123E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.123): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.123E~2): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.11754944E~37): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.5877472E~38): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.1E~44): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, 0.0): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.34028235E39): ~0.34007307E39 ~0.34007307E39 (~0.17014117E39, ~0.123E~2, ~0.17014117E39): ~0.1699319E39 ~0.1699319E39 (~0.17014117E39, ~0.123E~2, ~0.123E4): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.123E2): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.31415927E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.27182817E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.123E1): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.123): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.123E~2): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.11754944E~37): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.5877472E~38): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.1E~44): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.123E~2, ~0.0): 0.20927364E36 0.20927364E36 (~0.17014117E39, ~0.11754944E~37, 0.123E4): 0.1232E4 0.1232E4 (~0.17014117E39, ~0.11754944E~37, 0.123E2): 0.143E2 0.143E2 (~0.17014117E39, ~0.11754944E~37, 0.31415927E1): 0.51415925E1 0.51415925E1 (~0.17014117E39, ~0.11754944E~37, 0.27182817E1): 0.47182817E1 0.47182817E1 (~0.17014117E39, ~0.11754944E~37, 0.123E1): 0.323E1 0.323E1 (~0.17014117E39, ~0.11754944E~37, 0.123): 0.2123E1 0.2123E1 (~0.17014117E39, ~0.11754944E~37, 0.123E~2): 0.20012298E1 0.20012298E1 (~0.17014117E39, ~0.11754944E~37, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.17014117E39, ~0.11754944E~37, ~0.123E2): ~0.103E2 ~0.103E2 (~0.17014117E39, ~0.11754944E~37, ~0.123): 0.18769999E1 0.18769999E1 (~0.17014117E39, ~0.11754944E~37, ~0.123E~2): 0.19987699E1 0.19987699E1 (~0.17014117E39, ~0.5877472E~38, 0.123E4): 0.1231E4 0.1231E4 (~0.17014117E39, ~0.5877472E~38, 0.123E2): 0.133E2 0.133E2 (~0.17014117E39, ~0.5877472E~38, 0.31415927E1): 0.41415925E1 0.41415925E1 (~0.17014117E39, ~0.5877472E~38, 0.27182817E1): 0.37182817E1 0.37182817E1 (~0.17014117E39, ~0.5877472E~38, 0.123E1): 0.223E1 0.223E1 (~0.17014117E39, ~0.5877472E~38, 0.123): 0.11229999E1 0.11229999E1 (~0.17014117E39, ~0.5877472E~38, 0.123E~2): 0.10012299E1 0.10012299E1 (~0.17014117E39, ~0.5877472E~38, ~0.123E4): ~0.1229E4 ~0.1229E4 (~0.17014117E39, ~0.5877472E~38, ~0.123E2): ~0.113E2 ~0.113E2 (~0.17014117E39, ~0.5877472E~38, ~0.31415927E1): ~0.21415927E1 ~0.21415927E1 (~0.17014117E39, ~0.5877472E~38, ~0.27182817E1): ~0.17182817E1 ~0.17182817E1 (~0.17014117E39, ~0.5877472E~38, ~0.123): 0.8769999 0.8769999 (~0.17014117E39, ~0.5877472E~38, ~0.123E~2): 0.99876994 0.99876994 (~0.17014117E39, ~0.1E~44, 0.123E4): 0.123E4 0.123E4 (~0.17014117E39, ~0.1E~44, 0.123E2): 0.123E2 0.123E2 (~0.17014117E39, ~0.1E~44, 0.31415927E1): 0.3141593E1 0.3141593E1 (~0.17014117E39, ~0.1E~44, 0.27182817E1): 0.2718282E1 0.2718282E1 (~0.17014117E39, ~0.1E~44, 0.123E1): 0.12300003E1 0.12300003E1 (~0.17014117E39, ~0.1E~44, 0.123): 0.12300024 0.12300024 (~0.17014117E39, ~0.1E~44, 0.123E~2): 0.12302385E~2 0.12302385E~2 (~0.17014117E39, ~0.1E~44, ~0.123E4): ~0.123E4 ~0.123E4 (~0.17014117E39, ~0.1E~44, ~0.123E2): ~0.123E2 ~0.123E2 (~0.17014117E39, ~0.1E~44, ~0.31415927E1): ~0.31415925E1 ~0.31415925E1 (~0.17014117E39, ~0.1E~44, ~0.27182817E1): ~0.27182815E1 ~0.27182815E1 (~0.17014117E39, ~0.1E~44, ~0.123E1): ~0.12299998E1 ~0.12299998E1 (~0.17014117E39, ~0.1E~44, ~0.123): ~0.122999765 ~0.122999765 (~0.17014117E39, ~0.1E~44, ~0.123E~2): ~0.12297616E~2 ~0.12297616E~2 (~0.123E4, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.123E4, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.123E4, 0.34028235E39, 0.123E4): ~inf ~inf (~0.123E4, 0.34028235E39, 0.123E2): ~inf ~inf (~0.123E4, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.123E4, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.123E4, 0.34028235E39, 0.123E1): ~inf ~inf (~0.123E4, 0.34028235E39, 0.123): ~inf ~inf (~0.123E4, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.123E4, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.123E4, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.123E4, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.123E4, 0.34028235E39, 0.0): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.123): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.123E4, 0.34028235E39, ~0.0): ~inf ~inf (~0.123E4, 0.17014117E39, 0.34028235E39): ~inf ~inf (~0.123E4, 0.17014117E39, 0.17014117E39): ~inf ~inf (~0.123E4, 0.17014117E39, 0.123E4): ~inf ~inf (~0.123E4, 0.17014117E39, 0.123E2): ~inf ~inf (~0.123E4, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.123E4, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.123E4, 0.17014117E39, 0.123E1): ~inf ~inf (~0.123E4, 0.17014117E39, 0.123): ~inf ~inf (~0.123E4, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.123E4, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.123E4, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.123E4, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.123E4, 0.17014117E39, 0.0): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.123): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.123E4, 0.17014117E39, ~0.0): ~inf ~inf (~0.123E4, 0.123E4, 0.123E2): ~0.15128878E7 ~0.15128878E7 (~0.123E4, 0.123E4, 0.31415927E1): ~0.15128969E7 ~0.15128969E7 (~0.123E4, 0.123E4, 0.27182817E1): ~0.15128972E7 ~0.15128972E7 (~0.123E4, 0.123E4, 0.123E1): ~0.15128988E7 ~0.15128988E7 (~0.123E4, 0.123E4, 0.123): ~0.15128999E7 ~0.15128999E7 (~0.123E4, 0.123E4, 0.123E~2): ~0.15129E7 ~0.15129E7 (~0.123E4, 0.123E4, ~0.123E2): ~0.15129122E7 ~0.15129122E7 (~0.123E4, 0.123E4, ~0.31415927E1): ~0.15129031E7 ~0.15129031E7 (~0.123E4, 0.123E4, ~0.27182817E1): ~0.15129028E7 ~0.15129028E7 (~0.123E4, 0.123E4, ~0.123E1): ~0.15129012E7 ~0.15129012E7 (~0.123E4, 0.123E4, ~0.123): ~0.15129001E7 ~0.15129001E7 (~0.123E4, 0.123E4, ~0.123E~2): ~0.15129E7 ~0.15129E7 (~0.123E4, 0.123E2, 0.123E4): ~0.13899E5 ~0.13899E5 (~0.123E4, 0.123E2, 0.123E2): ~0.151167E5 ~0.151167E5 (~0.123E4, 0.123E2, 0.31415927E1): ~0.15125858E5 ~0.15125858E5 (~0.123E4, 0.123E2, 0.27182817E1): ~0.15126282E5 ~0.15126282E5 (~0.123E4, 0.123E2, 0.123E1): ~0.151277705E5 ~0.151277705E5 (~0.123E4, 0.123E2, 0.123): ~0.15128877E5 ~0.15128877E5 (~0.123E4, 0.123E2, 0.123E~2): ~0.15128999E5 ~0.15128999E5 (~0.123E4, 0.123E2, 0.11754944E~37): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.5877472E~38): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.1E~44): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.0): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.123E4): ~0.16359E5 ~0.16359E5 (~0.123E4, 0.123E2, ~0.123E2): ~0.151413E5 ~0.151413E5 (~0.123E4, 0.123E2, ~0.31415927E1): ~0.15132142E5 ~0.15132142E5 (~0.123E4, 0.123E2, ~0.27182817E1): ~0.15131719E5 ~0.15131719E5 (~0.123E4, 0.123E2, ~0.123E1): ~0.1513023E5 ~0.1513023E5 (~0.123E4, 0.123E2, ~0.123): ~0.15129123E5 ~0.15129123E5 (~0.123E4, 0.123E2, ~0.123E~2): ~0.15129001E5 ~0.15129001E5 (~0.123E4, 0.123E2, ~0.11754944E~37): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.5877472E~38): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.1E~44): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.0): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.31415927E1, 0.123E4): ~0.26341592E4 ~0.26341592E4 (~0.123E4, 0.31415927E1, 0.123E2): ~0.38518591E4 ~0.38518591E4 (~0.123E4, 0.31415927E1, 0.31415927E1): ~0.38610176E4 ~0.38610176E4 (~0.123E4, 0.31415927E1, 0.27182817E1): ~0.38614407E4 ~0.38614407E4 (~0.123E4, 0.31415927E1, 0.123E1): ~0.3862929E4 ~0.3862929E4 (~0.123E4, 0.31415927E1, 0.123): ~0.38640361E4 ~0.38640361E4 (~0.123E4, 0.31415927E1, 0.123E~2): ~0.3864158E4 ~0.3864158E4 (~0.123E4, 0.31415927E1, 0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, 0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, 0.1E~44): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, 0.0): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, ~0.123E4): ~0.5094159E4 ~0.5094159E4 (~0.123E4, 0.31415927E1, ~0.123E2): ~0.3876459E4 ~0.3876459E4 (~0.123E4, 0.31415927E1, ~0.31415927E1): ~0.38673008E4 ~0.38673008E4 (~0.123E4, 0.31415927E1, ~0.27182817E1): ~0.38668774E4 ~0.38668774E4 (~0.123E4, 0.31415927E1, ~0.123E1): ~0.38653892E4 ~0.38653892E4 (~0.123E4, 0.31415927E1, ~0.123): ~0.3864282E4 ~0.3864282E4 (~0.123E4, 0.31415927E1, ~0.123E~2): ~0.38641604E4 ~0.38641604E4 (~0.123E4, 0.31415927E1, ~0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, ~0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, ~0.1E~44): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.31415927E1, ~0.0): ~0.38641592E4 ~0.38641592E4 (~0.123E4, 0.27182817E1, 0.123E4): ~0.21134866E4 ~0.21134866E4 (~0.123E4, 0.27182817E1, 0.123E2): ~0.33311865E4 ~0.33311865E4 (~0.123E4, 0.27182817E1, 0.31415927E1): ~0.3340345E4 ~0.3340345E4 (~0.123E4, 0.27182817E1, 0.27182817E1): ~0.33407683E4 ~0.33407683E4 (~0.123E4, 0.27182817E1, 0.123E1): ~0.33422566E4 ~0.33422566E4 (~0.123E4, 0.27182817E1, 0.123): ~0.33433635E4 ~0.33433635E4 (~0.123E4, 0.27182817E1, 0.123E~2): ~0.33434854E4 ~0.33434854E4 (~0.123E4, 0.27182817E1, 0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, 0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, 0.1E~44): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, 0.0): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, ~0.123E4): ~0.45734863E4 ~0.45734863E4 (~0.123E4, 0.27182817E1, ~0.123E2): ~0.33557866E4 ~0.33557866E4 (~0.123E4, 0.27182817E1, ~0.31415927E1): ~0.33466282E4 ~0.33466282E4 (~0.123E4, 0.27182817E1, ~0.27182817E1): ~0.33462048E4 ~0.33462048E4 (~0.123E4, 0.27182817E1, ~0.123E1): ~0.33447166E4 ~0.33447166E4 (~0.123E4, 0.27182817E1, ~0.123): ~0.33436096E4 ~0.33436096E4 (~0.123E4, 0.27182817E1, ~0.123E~2): ~0.33434878E4 ~0.33434878E4 (~0.123E4, 0.27182817E1, ~0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, ~0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, ~0.1E~44): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.27182817E1, ~0.0): ~0.33434866E4 ~0.33434866E4 (~0.123E4, 0.123E1, 0.123E4): ~0.28290002E3 ~0.28290002E3 (~0.123E4, 0.123E1, 0.123E2): ~0.15006E4 ~0.15006E4 (~0.123E4, 0.123E1, 0.31415927E1): ~0.15097584E4 ~0.15097584E4 (~0.123E4, 0.123E1, 0.27182817E1): ~0.15101818E4 ~0.15101818E4 (~0.123E4, 0.123E1, 0.123E1): ~0.151167E4 ~0.151167E4 (~0.123E4, 0.123E1, 0.123): ~0.1512777E4 ~0.1512777E4 (~0.123E4, 0.123E1, 0.123E~2): ~0.15128988E4 ~0.15128988E4 (~0.123E4, 0.123E1, 0.11754944E~37): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.5877472E~38): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.1E~44): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.0): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.123E4): ~0.27429E4 ~0.27429E4 (~0.123E4, 0.123E1, ~0.123E2): ~0.15252001E4 ~0.15252001E4 (~0.123E4, 0.123E1, ~0.31415927E1): ~0.15160416E4 ~0.15160416E4 (~0.123E4, 0.123E1, ~0.27182817E1): ~0.15156183E4 ~0.15156183E4 (~0.123E4, 0.123E1, ~0.123E1): ~0.151413E4 ~0.151413E4 (~0.123E4, 0.123E1, ~0.123): ~0.15130231E4 ~0.15130231E4 (~0.123E4, 0.123E1, ~0.123E~2): ~0.15129012E4 ~0.15129012E4 (~0.123E4, 0.123E1, ~0.11754944E~37): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.5877472E~38): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.1E~44): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.0): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123, 0.123E4): 0.107871E4 0.107871E4 (~0.123E4, 0.123, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123E4, 0.123, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (~0.123E4, 0.123, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (~0.123E4, 0.123, 0.123E1): ~0.15006E3 ~0.15006E3 (~0.123E4, 0.123, 0.123): ~0.151167E3 ~0.151167E3 (~0.123E4, 0.123, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (~0.123E4, 0.123, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, 0.0): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123E4, 0.123, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (~0.123E4, 0.123, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (~0.123E4, 0.123, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (~0.123E4, 0.123, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123E4, 0.123, ~0.123): ~0.15141301E3 ~0.15141301E3 (~0.123E4, 0.123, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (~0.123E4, 0.123, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123, ~0.0): ~0.15129001E3 ~0.15129001E3 (~0.123E4, 0.123E~2, 0.123E4): 0.1228487E4 0.1228487E4 (~0.123E4, 0.123E~2, 0.123E2): 0.107871E2 0.107871E2 (~0.123E4, 0.123E~2, 0.31415927E1): 0.16286926E1 0.16286926E1 (~0.123E4, 0.123E~2, 0.27182817E1): 0.12053816E1 0.12053816E1 (~0.123E4, 0.123E~2, 0.123E1): ~0.28290004 ~0.28290004 (~0.123E4, 0.123E~2, 0.123): ~0.13899001E1 ~0.13899001E1 (~0.123E4, 0.123E~2, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (~0.123E4, 0.123E~2, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, 0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (~0.123E4, 0.123E~2, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (~0.123E4, 0.123E~2, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (~0.123E4, 0.123E~2, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (~0.123E4, 0.123E~2, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (~0.123E4, 0.123E~2, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E4, 0.123E~2, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (~0.123E4, 0.123E~2, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.123E~2, ~0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E4, 0.11754944E~37, 0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (~0.123E4, 0.11754944E~37, ~0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (~0.123E4, 0.5877472E~38, 0.1E~44): ~0.722929E~35 ~0.722929E~35 (~0.123E4, 0.5877472E~38, ~0.1E~44): ~0.722929E~35 ~0.722929E~35 (~0.123E4, ~0.34028235E39, 0.34028235E39): inf inf (~0.123E4, ~0.34028235E39, 0.17014117E39): inf inf (~0.123E4, ~0.34028235E39, 0.123E4): inf inf (~0.123E4, ~0.34028235E39, 0.123E2): inf inf (~0.123E4, ~0.34028235E39, 0.31415927E1): inf inf (~0.123E4, ~0.34028235E39, 0.27182817E1): inf inf (~0.123E4, ~0.34028235E39, 0.123E1): inf inf (~0.123E4, ~0.34028235E39, 0.123): inf inf (~0.123E4, ~0.34028235E39, 0.123E~2): inf inf (~0.123E4, ~0.34028235E39, 0.11754944E~37): inf inf (~0.123E4, ~0.34028235E39, 0.5877472E~38): inf inf (~0.123E4, ~0.34028235E39, 0.1E~44): inf inf (~0.123E4, ~0.34028235E39, 0.0): inf inf (~0.123E4, ~0.34028235E39, ~0.34028235E39): inf inf (~0.123E4, ~0.34028235E39, ~0.17014117E39): inf inf (~0.123E4, ~0.34028235E39, ~0.123E4): inf inf (~0.123E4, ~0.34028235E39, ~0.123E2): inf inf (~0.123E4, ~0.34028235E39, ~0.31415927E1): inf inf (~0.123E4, ~0.34028235E39, ~0.27182817E1): inf inf (~0.123E4, ~0.34028235E39, ~0.123E1): inf inf (~0.123E4, ~0.34028235E39, ~0.123): inf inf (~0.123E4, ~0.34028235E39, ~0.123E~2): inf inf (~0.123E4, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.123E4, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.123E4, ~0.34028235E39, ~0.1E~44): inf inf (~0.123E4, ~0.34028235E39, ~0.0): inf inf (~0.123E4, ~0.17014117E39, 0.34028235E39): inf inf (~0.123E4, ~0.17014117E39, 0.17014117E39): inf inf (~0.123E4, ~0.17014117E39, 0.123E4): inf inf (~0.123E4, ~0.17014117E39, 0.123E2): inf inf (~0.123E4, ~0.17014117E39, 0.31415927E1): inf inf (~0.123E4, ~0.17014117E39, 0.27182817E1): inf inf (~0.123E4, ~0.17014117E39, 0.123E1): inf inf (~0.123E4, ~0.17014117E39, 0.123): inf inf (~0.123E4, ~0.17014117E39, 0.123E~2): inf inf (~0.123E4, ~0.17014117E39, 0.11754944E~37): inf inf (~0.123E4, ~0.17014117E39, 0.5877472E~38): inf inf (~0.123E4, ~0.17014117E39, 0.1E~44): inf inf (~0.123E4, ~0.17014117E39, 0.0): inf inf (~0.123E4, ~0.17014117E39, ~0.34028235E39): inf inf (~0.123E4, ~0.17014117E39, ~0.17014117E39): inf inf (~0.123E4, ~0.17014117E39, ~0.123E4): inf inf (~0.123E4, ~0.17014117E39, ~0.123E2): inf inf (~0.123E4, ~0.17014117E39, ~0.31415927E1): inf inf (~0.123E4, ~0.17014117E39, ~0.27182817E1): inf inf (~0.123E4, ~0.17014117E39, ~0.123E1): inf inf (~0.123E4, ~0.17014117E39, ~0.123): inf inf (~0.123E4, ~0.17014117E39, ~0.123E~2): inf inf (~0.123E4, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.123E4, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.123E4, ~0.17014117E39, ~0.1E~44): inf inf (~0.123E4, ~0.17014117E39, ~0.0): inf inf (~0.123E4, ~0.123E4, 0.123E2): 0.15129122E7 0.15129122E7 (~0.123E4, ~0.123E4, 0.31415927E1): 0.15129031E7 0.15129031E7 (~0.123E4, ~0.123E4, 0.27182817E1): 0.15129028E7 0.15129028E7 (~0.123E4, ~0.123E4, 0.123E1): 0.15129012E7 0.15129012E7 (~0.123E4, ~0.123E4, 0.123): 0.15129001E7 0.15129001E7 (~0.123E4, ~0.123E4, 0.123E~2): 0.15129E7 0.15129E7 (~0.123E4, ~0.123E4, ~0.123E2): 0.15128878E7 0.15128878E7 (~0.123E4, ~0.123E4, ~0.31415927E1): 0.15128969E7 0.15128969E7 (~0.123E4, ~0.123E4, ~0.27182817E1): 0.15128972E7 0.15128972E7 (~0.123E4, ~0.123E4, ~0.123E1): 0.15128988E7 0.15128988E7 (~0.123E4, ~0.123E4, ~0.123): 0.15128999E7 0.15128999E7 (~0.123E4, ~0.123E4, ~0.123E~2): 0.15129E7 0.15129E7 (~0.123E4, ~0.123E2, 0.123E4): 0.16359E5 0.16359E5 (~0.123E4, ~0.123E2, 0.123E2): 0.151413E5 0.151413E5 (~0.123E4, ~0.123E2, 0.31415927E1): 0.15132142E5 0.15132142E5 (~0.123E4, ~0.123E2, 0.27182817E1): 0.15131719E5 0.15131719E5 (~0.123E4, ~0.123E2, 0.123E1): 0.1513023E5 0.1513023E5 (~0.123E4, ~0.123E2, 0.123): 0.15129123E5 0.15129123E5 (~0.123E4, ~0.123E2, 0.123E~2): 0.15129001E5 0.15129001E5 (~0.123E4, ~0.123E2, 0.11754944E~37): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.5877472E~38): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.1E~44): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.0): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.123E4): 0.13899E5 0.13899E5 (~0.123E4, ~0.123E2, ~0.123E2): 0.151167E5 0.151167E5 (~0.123E4, ~0.123E2, ~0.31415927E1): 0.15125858E5 0.15125858E5 (~0.123E4, ~0.123E2, ~0.27182817E1): 0.15126282E5 0.15126282E5 (~0.123E4, ~0.123E2, ~0.123E1): 0.151277705E5 0.151277705E5 (~0.123E4, ~0.123E2, ~0.123): 0.15128877E5 0.15128877E5 (~0.123E4, ~0.123E2, ~0.123E~2): 0.15128999E5 0.15128999E5 (~0.123E4, ~0.123E2, ~0.11754944E~37): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.5877472E~38): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.1E~44): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.0): 0.15129E5 0.15129E5 (~0.123E4, ~0.31415927E1, 0.123E4): 0.5094159E4 0.5094159E4 (~0.123E4, ~0.31415927E1, 0.123E2): 0.3876459E4 0.3876459E4 (~0.123E4, ~0.31415927E1, 0.31415927E1): 0.38673008E4 0.38673008E4 (~0.123E4, ~0.31415927E1, 0.27182817E1): 0.38668774E4 0.38668774E4 (~0.123E4, ~0.31415927E1, 0.123E1): 0.38653892E4 0.38653892E4 (~0.123E4, ~0.31415927E1, 0.123): 0.3864282E4 0.3864282E4 (~0.123E4, ~0.31415927E1, 0.123E~2): 0.38641604E4 0.38641604E4 (~0.123E4, ~0.31415927E1, 0.11754944E~37): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, 0.5877472E~38): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, 0.1E~44): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, 0.0): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, ~0.123E4): 0.26341592E4 0.26341592E4 (~0.123E4, ~0.31415927E1, ~0.123E2): 0.38518591E4 0.38518591E4 (~0.123E4, ~0.31415927E1, ~0.31415927E1): 0.38610176E4 0.38610176E4 (~0.123E4, ~0.31415927E1, ~0.27182817E1): 0.38614407E4 0.38614407E4 (~0.123E4, ~0.31415927E1, ~0.123E1): 0.3862929E4 0.3862929E4 (~0.123E4, ~0.31415927E1, ~0.123): 0.38640361E4 0.38640361E4 (~0.123E4, ~0.31415927E1, ~0.123E~2): 0.3864158E4 0.3864158E4 (~0.123E4, ~0.31415927E1, ~0.11754944E~37): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, ~0.5877472E~38): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, ~0.1E~44): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.31415927E1, ~0.0): 0.38641592E4 0.38641592E4 (~0.123E4, ~0.27182817E1, 0.123E4): 0.45734863E4 0.45734863E4 (~0.123E4, ~0.27182817E1, 0.123E2): 0.33557866E4 0.33557866E4 (~0.123E4, ~0.27182817E1, 0.31415927E1): 0.33466282E4 0.33466282E4 (~0.123E4, ~0.27182817E1, 0.27182817E1): 0.33462048E4 0.33462048E4 (~0.123E4, ~0.27182817E1, 0.123E1): 0.33447166E4 0.33447166E4 (~0.123E4, ~0.27182817E1, 0.123): 0.33436096E4 0.33436096E4 (~0.123E4, ~0.27182817E1, 0.123E~2): 0.33434878E4 0.33434878E4 (~0.123E4, ~0.27182817E1, 0.11754944E~37): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, 0.5877472E~38): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, 0.1E~44): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, 0.0): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, ~0.123E4): 0.21134866E4 0.21134866E4 (~0.123E4, ~0.27182817E1, ~0.123E2): 0.33311865E4 0.33311865E4 (~0.123E4, ~0.27182817E1, ~0.31415927E1): 0.3340345E4 0.3340345E4 (~0.123E4, ~0.27182817E1, ~0.27182817E1): 0.33407683E4 0.33407683E4 (~0.123E4, ~0.27182817E1, ~0.123E1): 0.33422566E4 0.33422566E4 (~0.123E4, ~0.27182817E1, ~0.123): 0.33433635E4 0.33433635E4 (~0.123E4, ~0.27182817E1, ~0.123E~2): 0.33434854E4 0.33434854E4 (~0.123E4, ~0.27182817E1, ~0.11754944E~37): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, ~0.5877472E~38): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, ~0.1E~44): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.27182817E1, ~0.0): 0.33434866E4 0.33434866E4 (~0.123E4, ~0.123E1, 0.123E4): 0.27429E4 0.27429E4 (~0.123E4, ~0.123E1, 0.123E2): 0.15252001E4 0.15252001E4 (~0.123E4, ~0.123E1, 0.31415927E1): 0.15160416E4 0.15160416E4 (~0.123E4, ~0.123E1, 0.27182817E1): 0.15156183E4 0.15156183E4 (~0.123E4, ~0.123E1, 0.123E1): 0.151413E4 0.151413E4 (~0.123E4, ~0.123E1, 0.123): 0.15130231E4 0.15130231E4 (~0.123E4, ~0.123E1, 0.123E~2): 0.15129012E4 0.15129012E4 (~0.123E4, ~0.123E1, 0.11754944E~37): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.5877472E~38): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.1E~44): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.0): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.123E4): 0.28290002E3 0.28290002E3 (~0.123E4, ~0.123E1, ~0.123E2): 0.15006E4 0.15006E4 (~0.123E4, ~0.123E1, ~0.31415927E1): 0.15097584E4 0.15097584E4 (~0.123E4, ~0.123E1, ~0.27182817E1): 0.15101818E4 0.15101818E4 (~0.123E4, ~0.123E1, ~0.123E1): 0.151167E4 0.151167E4 (~0.123E4, ~0.123E1, ~0.123): 0.1512777E4 0.1512777E4 (~0.123E4, ~0.123E1, ~0.123E~2): 0.15128988E4 0.15128988E4 (~0.123E4, ~0.123E1, ~0.11754944E~37): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.5877472E~38): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.1E~44): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.0): 0.15129E4 0.15129E4 (~0.123E4, ~0.123, 0.123E4): 0.138129E4 0.138129E4 (~0.123E4, ~0.123, 0.123E2): 0.16359001E3 0.16359001E3 (~0.123E4, ~0.123, 0.31415927E1): 0.1544316E3 0.1544316E3 (~0.123E4, ~0.123, 0.27182817E1): 0.15400829E3 0.15400829E3 (~0.123E4, ~0.123, 0.123E1): 0.15252E3 0.15252E3 (~0.123E4, ~0.123, 0.123): 0.15141301E3 0.15141301E3 (~0.123E4, ~0.123, 0.123E~2): 0.15129123E3 0.15129123E3 (~0.123E4, ~0.123, 0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, 0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, 0.1E~44): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, 0.0): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123E4, ~0.123, ~0.123E2): 0.13899E3 0.13899E3 (~0.123E4, ~0.123, ~0.31415927E1): 0.1481484E3 0.1481484E3 (~0.123E4, ~0.123, ~0.27182817E1): 0.14857172E3 0.14857172E3 (~0.123E4, ~0.123, ~0.123E1): 0.15006E3 0.15006E3 (~0.123E4, ~0.123, ~0.123): 0.151167E3 0.151167E3 (~0.123E4, ~0.123, ~0.123E~2): 0.15128877E3 0.15128877E3 (~0.123E4, ~0.123, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, ~0.1E~44): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123, ~0.0): 0.15129001E3 0.15129001E3 (~0.123E4, ~0.123E~2, 0.123E4): 0.1231513E4 0.1231513E4 (~0.123E4, ~0.123E~2, 0.123E2): 0.13812901E2 0.13812901E2 (~0.123E4, ~0.123E~2, 0.31415927E1): 0.4654493E1 0.4654493E1 (~0.123E4, ~0.123E~2, 0.27182817E1): 0.42311816E1 0.42311816E1 (~0.123E4, ~0.123E~2, 0.123E1): 0.27429001E1 0.27429001E1 (~0.123E4, ~0.123E~2, 0.123): 0.16359E1 0.16359E1 (~0.123E4, ~0.123E~2, 0.123E~2): 0.15141301E1 0.15141301E1 (~0.123E4, ~0.123E~2, 0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, 0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, 0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, 0.0): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (~0.123E4, ~0.123E~2, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E4, ~0.123E~2, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (~0.123E4, ~0.123E~2, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.28290004 0.28290004 (~0.123E4, ~0.123E~2, ~0.123): 0.13899001E1 0.13899001E1 (~0.123E4, ~0.123E~2, ~0.123E~2): 0.15116701E1 0.15116701E1 (~0.123E4, ~0.123E~2, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, ~0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.123E~2, ~0.0): 0.15129001E1 0.15129001E1 (~0.123E4, ~0.11754944E~37, 0.1E~44): 0.1445858E~34 0.1445858E~34 (~0.123E4, ~0.11754944E~37, ~0.1E~44): 0.1445858E~34 0.1445858E~34 (~0.123E4, ~0.5877472E~38, 0.1E~44): 0.722929E~35 0.722929E~35 (~0.123E4, ~0.5877472E~38, ~0.1E~44): 0.722929E~35 0.722929E~35 (~0.123E2, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.123E2, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.123E2, 0.34028235E39, 0.123E4): ~inf ~inf (~0.123E2, 0.34028235E39, 0.123E2): ~inf ~inf (~0.123E2, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.123E2, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.123E2, 0.34028235E39, 0.123E1): ~inf ~inf (~0.123E2, 0.34028235E39, 0.123): ~inf ~inf (~0.123E2, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.123E2, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.123E2, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.123E2, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.123E2, 0.34028235E39, 0.0): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.123): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.123E2, 0.34028235E39, ~0.0): ~inf ~inf (~0.123E2, 0.17014117E39, 0.34028235E39): ~inf ~inf (~0.123E2, 0.17014117E39, 0.17014117E39): ~inf ~inf (~0.123E2, 0.17014117E39, 0.123E4): ~inf ~inf (~0.123E2, 0.17014117E39, 0.123E2): ~inf ~inf (~0.123E2, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.123E2, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.123E2, 0.17014117E39, 0.123E1): ~inf ~inf (~0.123E2, 0.17014117E39, 0.123): ~inf ~inf (~0.123E2, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.123E2, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.123E2, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.123E2, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.123E2, 0.17014117E39, 0.0): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.123): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.123E2, 0.17014117E39, ~0.0): ~inf ~inf (~0.123E2, 0.123E4, 0.123E4): ~0.13899E5 ~0.13899E5 (~0.123E2, 0.123E4, 0.123E2): ~0.151167E5 ~0.151167E5 (~0.123E2, 0.123E4, 0.31415927E1): ~0.15125858E5 ~0.15125858E5 (~0.123E2, 0.123E4, 0.27182817E1): ~0.15126282E5 ~0.15126282E5 (~0.123E2, 0.123E4, 0.123E1): ~0.151277705E5 ~0.151277705E5 (~0.123E2, 0.123E4, 0.123): ~0.15128877E5 ~0.15128877E5 (~0.123E2, 0.123E4, 0.123E~2): ~0.15128999E5 ~0.15128999E5 (~0.123E2, 0.123E4, 0.11754944E~37): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.5877472E~38): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.1E~44): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.0): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.123E4): ~0.16359E5 ~0.16359E5 (~0.123E2, 0.123E4, ~0.123E2): ~0.151413E5 ~0.151413E5 (~0.123E2, 0.123E4, ~0.31415927E1): ~0.15132142E5 ~0.15132142E5 (~0.123E2, 0.123E4, ~0.27182817E1): ~0.15131719E5 ~0.15131719E5 (~0.123E2, 0.123E4, ~0.123E1): ~0.1513023E5 ~0.1513023E5 (~0.123E2, 0.123E4, ~0.123): ~0.15129123E5 ~0.15129123E5 (~0.123E2, 0.123E4, ~0.123E~2): ~0.15129001E5 ~0.15129001E5 (~0.123E2, 0.123E4, ~0.11754944E~37): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.5877472E~38): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.1E~44): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.0): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E2, 0.123E4): 0.107871E4 0.107871E4 (~0.123E2, 0.123E2, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123E2, 0.123E2, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (~0.123E2, 0.123E2, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (~0.123E2, 0.123E2, 0.123E1): ~0.15006E3 ~0.15006E3 (~0.123E2, 0.123E2, 0.123): ~0.151167E3 ~0.151167E3 (~0.123E2, 0.123E2, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (~0.123E2, 0.123E2, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, 0.0): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123E2, 0.123E2, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (~0.123E2, 0.123E2, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (~0.123E2, 0.123E2, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (~0.123E2, 0.123E2, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123E2, 0.123E2, ~0.123): ~0.15141301E3 ~0.15141301E3 (~0.123E2, 0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (~0.123E2, 0.123E2, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.123E2, ~0.0): ~0.15129001E3 ~0.15129001E3 (~0.123E2, 0.31415927E1, 0.123E4): 0.11913584E4 0.11913584E4 (~0.123E2, 0.31415927E1, 0.123E2): ~0.2634159E2 ~0.2634159E2 (~0.123E2, 0.31415927E1, 0.31415927E1): ~0.355E2 ~0.355E2 (~0.123E2, 0.31415927E1, 0.27182817E1): ~0.3592331E2 ~0.3592331E2 (~0.123E2, 0.31415927E1, 0.123E1): ~0.3741159E2 ~0.3741159E2 (~0.123E2, 0.31415927E1, 0.123): ~0.38518593E2 ~0.38518593E2 (~0.123E2, 0.31415927E1, 0.123E~2): ~0.3864036E2 ~0.3864036E2 (~0.123E2, 0.31415927E1, 0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, 0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, 0.1E~44): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, 0.0): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, ~0.123E4): ~0.12686416E4 ~0.12686416E4 (~0.123E2, 0.31415927E1, ~0.123E2): ~0.50941593E2 ~0.50941593E2 (~0.123E2, 0.31415927E1, ~0.31415927E1): ~0.41783184E2 ~0.41783184E2 (~0.123E2, 0.31415927E1, ~0.27182817E1): ~0.41359875E2 ~0.41359875E2 (~0.123E2, 0.31415927E1, ~0.123E1): ~0.3987159E2 ~0.3987159E2 (~0.123E2, 0.31415927E1, ~0.123): ~0.3876459E2 ~0.3876459E2 (~0.123E2, 0.31415927E1, ~0.123E~2): ~0.38642822E2 ~0.38642822E2 (~0.123E2, 0.31415927E1, ~0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, ~0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, ~0.1E~44): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.31415927E1, ~0.0): ~0.3864159E2 ~0.3864159E2 (~0.123E2, 0.27182817E1, 0.123E4): 0.11965652E4 0.11965652E4 (~0.123E2, 0.27182817E1, 0.123E2): ~0.21134867E2 ~0.21134867E2 (~0.123E2, 0.27182817E1, 0.31415927E1): ~0.30293274E2 ~0.30293274E2 (~0.123E2, 0.27182817E1, 0.27182817E1): ~0.30716585E2 ~0.30716585E2 (~0.123E2, 0.27182817E1, 0.123E1): ~0.32204865E2 ~0.32204865E2 (~0.123E2, 0.27182817E1, 0.123): ~0.33311867E2 ~0.33311867E2 (~0.123E2, 0.27182817E1, 0.123E~2): ~0.33433636E2 ~0.33433636E2 (~0.123E2, 0.27182817E1, 0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, 0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, 0.1E~44): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, 0.0): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, ~0.123E4): ~0.12634348E4 ~0.12634348E4 (~0.123E2, 0.27182817E1, ~0.123E2): ~0.45734867E2 ~0.45734867E2 (~0.123E2, 0.27182817E1, ~0.31415927E1): ~0.36576458E2 ~0.36576458E2 (~0.123E2, 0.27182817E1, ~0.27182817E1): ~0.3615315E2 ~0.3615315E2 (~0.123E2, 0.27182817E1, ~0.123E1): ~0.34664867E2 ~0.34664867E2 (~0.123E2, 0.27182817E1, ~0.123): ~0.33557865E2 ~0.33557865E2 (~0.123E2, 0.27182817E1, ~0.123E~2): ~0.33436096E2 ~0.33436096E2 (~0.123E2, 0.27182817E1, ~0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, ~0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, ~0.1E~44): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.27182817E1, ~0.0): ~0.33434868E2 ~0.33434868E2 (~0.123E2, 0.123E1, 0.123E4): 0.1214871E4 0.1214871E4 (~0.123E2, 0.123E1, 0.123E2): ~0.28290002E1 ~0.28290002E1 (~0.123E2, 0.123E1, 0.31415927E1): ~0.11987408E2 ~0.11987408E2 (~0.123E2, 0.123E1, 0.27182817E1): ~0.12410719E2 ~0.12410719E2 (~0.123E2, 0.123E1, 0.123E1): ~0.13899E2 ~0.13899E2 (~0.123E2, 0.123E1, 0.123): ~0.150060005E2 ~0.150060005E2 (~0.123E2, 0.123E1, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (~0.123E2, 0.123E1, 0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, 0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, 0.1E~44): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, 0.0): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (~0.123E2, 0.123E1, ~0.123E2): ~0.27429E2 ~0.27429E2 (~0.123E2, 0.123E1, ~0.31415927E1): ~0.18270594E2 ~0.18270594E2 (~0.123E2, 0.123E1, ~0.27182817E1): ~0.17847282E2 ~0.17847282E2 (~0.123E2, 0.123E1, ~0.123E1): ~0.16359001E2 ~0.16359001E2 (~0.123E2, 0.123E1, ~0.123): ~0.15252001E2 ~0.15252001E2 (~0.123E2, 0.123E1, ~0.123E~2): ~0.15130231E2 ~0.15130231E2 (~0.123E2, 0.123E1, ~0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, ~0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, ~0.1E~44): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123E1, ~0.0): ~0.15129001E2 ~0.15129001E2 (~0.123E2, 0.123, 0.123E4): 0.1228487E4 0.1228487E4 (~0.123E2, 0.123, 0.123E2): 0.107871E2 0.107871E2 (~0.123E2, 0.123, 0.31415927E1): 0.16286926E1 0.16286926E1 (~0.123E2, 0.123, 0.27182817E1): 0.12053816E1 0.12053816E1 (~0.123E2, 0.123, 0.123E1): ~0.28290004 ~0.28290004 (~0.123E2, 0.123, 0.123): ~0.13899001E1 ~0.13899001E1 (~0.123E2, 0.123, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (~0.123E2, 0.123, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, 0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (~0.123E2, 0.123, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (~0.123E2, 0.123, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (~0.123E2, 0.123, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (~0.123E2, 0.123, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (~0.123E2, 0.123, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E2, 0.123, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (~0.123E2, 0.123, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123, ~0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E2, 0.123E~2, 0.123E4): 0.12299849E4 0.12299849E4 (~0.123E2, 0.123E~2, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123E2, 0.123E~2, 0.31415927E1): 0.31264637E1 0.31264637E1 (~0.123E2, 0.123E~2, 0.27182817E1): 0.27031527E1 0.27031527E1 (~0.123E2, 0.123E~2, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123E2, 0.123E~2, 0.123): 0.107871 0.107871 (~0.123E2, 0.123E~2, 0.123E~2): ~0.13899001E~1 ~0.13899001E~1 (~0.123E2, 0.123E~2, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, 0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (~0.123E2, 0.123E~2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123E2, 0.123E~2, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (~0.123E2, 0.123E~2, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (~0.123E2, 0.123E~2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123E2, 0.123E~2, ~0.123): ~0.13812901 ~0.13812901 (~0.123E2, 0.123E~2, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (~0.123E2, 0.123E~2, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.123E~2, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123E2, 0.11754944E~37, 0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (~0.123E2, 0.11754944E~37, ~0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (~0.123E2, 0.5877472E~38, 0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (~0.123E2, 0.5877472E~38, ~0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (~0.123E2, 0.1E~44, 0.11754944E~37): 0.11754927E~37 0.11754927E~37 (~0.123E2, 0.1E~44, 0.5877472E~38): 0.5877455E~38 0.5877455E~38 (~0.123E2, 0.1E~44, 0.1E~44): ~0.15E~43 ~0.15E~43 (~0.123E2, 0.1E~44, 0.0): ~0.17E~43 ~0.17E~43 (~0.123E2, 0.1E~44, ~0.11754944E~37): ~0.1175496E~37 ~0.1175496E~37 (~0.123E2, 0.1E~44, ~0.5877472E~38): ~0.5877489E~38 ~0.5877489E~38 (~0.123E2, 0.1E~44, ~0.1E~44): ~0.18E~43 ~0.18E~43 (~0.123E2, 0.1E~44, ~0.0): ~0.17E~43 ~0.17E~43 (~0.123E2, ~0.34028235E39, 0.34028235E39): inf inf (~0.123E2, ~0.34028235E39, 0.17014117E39): inf inf (~0.123E2, ~0.34028235E39, 0.123E4): inf inf (~0.123E2, ~0.34028235E39, 0.123E2): inf inf (~0.123E2, ~0.34028235E39, 0.31415927E1): inf inf (~0.123E2, ~0.34028235E39, 0.27182817E1): inf inf (~0.123E2, ~0.34028235E39, 0.123E1): inf inf (~0.123E2, ~0.34028235E39, 0.123): inf inf (~0.123E2, ~0.34028235E39, 0.123E~2): inf inf (~0.123E2, ~0.34028235E39, 0.11754944E~37): inf inf (~0.123E2, ~0.34028235E39, 0.5877472E~38): inf inf (~0.123E2, ~0.34028235E39, 0.1E~44): inf inf (~0.123E2, ~0.34028235E39, 0.0): inf inf (~0.123E2, ~0.34028235E39, ~0.34028235E39): inf inf (~0.123E2, ~0.34028235E39, ~0.17014117E39): inf inf (~0.123E2, ~0.34028235E39, ~0.123E4): inf inf (~0.123E2, ~0.34028235E39, ~0.123E2): inf inf (~0.123E2, ~0.34028235E39, ~0.31415927E1): inf inf (~0.123E2, ~0.34028235E39, ~0.27182817E1): inf inf (~0.123E2, ~0.34028235E39, ~0.123E1): inf inf (~0.123E2, ~0.34028235E39, ~0.123): inf inf (~0.123E2, ~0.34028235E39, ~0.123E~2): inf inf (~0.123E2, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.123E2, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.123E2, ~0.34028235E39, ~0.1E~44): inf inf (~0.123E2, ~0.34028235E39, ~0.0): inf inf (~0.123E2, ~0.17014117E39, 0.34028235E39): inf inf (~0.123E2, ~0.17014117E39, 0.17014117E39): inf inf (~0.123E2, ~0.17014117E39, 0.123E4): inf inf (~0.123E2, ~0.17014117E39, 0.123E2): inf inf (~0.123E2, ~0.17014117E39, 0.31415927E1): inf inf (~0.123E2, ~0.17014117E39, 0.27182817E1): inf inf (~0.123E2, ~0.17014117E39, 0.123E1): inf inf (~0.123E2, ~0.17014117E39, 0.123): inf inf (~0.123E2, ~0.17014117E39, 0.123E~2): inf inf (~0.123E2, ~0.17014117E39, 0.11754944E~37): inf inf (~0.123E2, ~0.17014117E39, 0.5877472E~38): inf inf (~0.123E2, ~0.17014117E39, 0.1E~44): inf inf (~0.123E2, ~0.17014117E39, 0.0): inf inf (~0.123E2, ~0.17014117E39, ~0.34028235E39): inf inf (~0.123E2, ~0.17014117E39, ~0.17014117E39): inf inf (~0.123E2, ~0.17014117E39, ~0.123E4): inf inf (~0.123E2, ~0.17014117E39, ~0.123E2): inf inf (~0.123E2, ~0.17014117E39, ~0.31415927E1): inf inf (~0.123E2, ~0.17014117E39, ~0.27182817E1): inf inf (~0.123E2, ~0.17014117E39, ~0.123E1): inf inf (~0.123E2, ~0.17014117E39, ~0.123): inf inf (~0.123E2, ~0.17014117E39, ~0.123E~2): inf inf (~0.123E2, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.123E2, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.123E2, ~0.17014117E39, ~0.1E~44): inf inf (~0.123E2, ~0.17014117E39, ~0.0): inf inf (~0.123E2, ~0.123E4, 0.123E4): 0.16359E5 0.16359E5 (~0.123E2, ~0.123E4, 0.123E2): 0.151413E5 0.151413E5 (~0.123E2, ~0.123E4, 0.31415927E1): 0.15132142E5 0.15132142E5 (~0.123E2, ~0.123E4, 0.27182817E1): 0.15131719E5 0.15131719E5 (~0.123E2, ~0.123E4, 0.123E1): 0.1513023E5 0.1513023E5 (~0.123E2, ~0.123E4, 0.123): 0.15129123E5 0.15129123E5 (~0.123E2, ~0.123E4, 0.123E~2): 0.15129001E5 0.15129001E5 (~0.123E2, ~0.123E4, 0.11754944E~37): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.5877472E~38): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.1E~44): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.0): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.123E4): 0.13899E5 0.13899E5 (~0.123E2, ~0.123E4, ~0.123E2): 0.151167E5 0.151167E5 (~0.123E2, ~0.123E4, ~0.31415927E1): 0.15125858E5 0.15125858E5 (~0.123E2, ~0.123E4, ~0.27182817E1): 0.15126282E5 0.15126282E5 (~0.123E2, ~0.123E4, ~0.123E1): 0.151277705E5 0.151277705E5 (~0.123E2, ~0.123E4, ~0.123): 0.15128877E5 0.15128877E5 (~0.123E2, ~0.123E4, ~0.123E~2): 0.15128999E5 0.15128999E5 (~0.123E2, ~0.123E4, ~0.11754944E~37): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.5877472E~38): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.1E~44): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.0): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E2, 0.123E4): 0.138129E4 0.138129E4 (~0.123E2, ~0.123E2, 0.123E2): 0.16359001E3 0.16359001E3 (~0.123E2, ~0.123E2, 0.31415927E1): 0.1544316E3 0.1544316E3 (~0.123E2, ~0.123E2, 0.27182817E1): 0.15400829E3 0.15400829E3 (~0.123E2, ~0.123E2, 0.123E1): 0.15252E3 0.15252E3 (~0.123E2, ~0.123E2, 0.123): 0.15141301E3 0.15141301E3 (~0.123E2, ~0.123E2, 0.123E~2): 0.15129123E3 0.15129123E3 (~0.123E2, ~0.123E2, 0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, 0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, 0.1E~44): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, 0.0): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123E2, ~0.123E2, ~0.123E2): 0.13899E3 0.13899E3 (~0.123E2, ~0.123E2, ~0.31415927E1): 0.1481484E3 0.1481484E3 (~0.123E2, ~0.123E2, ~0.27182817E1): 0.14857172E3 0.14857172E3 (~0.123E2, ~0.123E2, ~0.123E1): 0.15006E3 0.15006E3 (~0.123E2, ~0.123E2, ~0.123): 0.151167E3 0.151167E3 (~0.123E2, ~0.123E2, ~0.123E~2): 0.15128877E3 0.15128877E3 (~0.123E2, ~0.123E2, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, ~0.1E~44): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.123E2, ~0.0): 0.15129001E3 0.15129001E3 (~0.123E2, ~0.31415927E1, 0.123E4): 0.12686416E4 0.12686416E4 (~0.123E2, ~0.31415927E1, 0.123E2): 0.50941593E2 0.50941593E2 (~0.123E2, ~0.31415927E1, 0.31415927E1): 0.41783184E2 0.41783184E2 (~0.123E2, ~0.31415927E1, 0.27182817E1): 0.41359875E2 0.41359875E2 (~0.123E2, ~0.31415927E1, 0.123E1): 0.3987159E2 0.3987159E2 (~0.123E2, ~0.31415927E1, 0.123): 0.3876459E2 0.3876459E2 (~0.123E2, ~0.31415927E1, 0.123E~2): 0.38642822E2 0.38642822E2 (~0.123E2, ~0.31415927E1, 0.11754944E~37): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, 0.5877472E~38): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, 0.1E~44): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, 0.0): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, ~0.123E4): ~0.11913584E4 ~0.11913584E4 (~0.123E2, ~0.31415927E1, ~0.123E2): 0.2634159E2 0.2634159E2 (~0.123E2, ~0.31415927E1, ~0.31415927E1): 0.355E2 0.355E2 (~0.123E2, ~0.31415927E1, ~0.27182817E1): 0.3592331E2 0.3592331E2 (~0.123E2, ~0.31415927E1, ~0.123E1): 0.3741159E2 0.3741159E2 (~0.123E2, ~0.31415927E1, ~0.123): 0.38518593E2 0.38518593E2 (~0.123E2, ~0.31415927E1, ~0.123E~2): 0.3864036E2 0.3864036E2 (~0.123E2, ~0.31415927E1, ~0.11754944E~37): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, ~0.5877472E~38): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, ~0.1E~44): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.31415927E1, ~0.0): 0.3864159E2 0.3864159E2 (~0.123E2, ~0.27182817E1, 0.123E4): 0.12634348E4 0.12634348E4 (~0.123E2, ~0.27182817E1, 0.123E2): 0.45734867E2 0.45734867E2 (~0.123E2, ~0.27182817E1, 0.31415927E1): 0.36576458E2 0.36576458E2 (~0.123E2, ~0.27182817E1, 0.27182817E1): 0.3615315E2 0.3615315E2 (~0.123E2, ~0.27182817E1, 0.123E1): 0.34664867E2 0.34664867E2 (~0.123E2, ~0.27182817E1, 0.123): 0.33557865E2 0.33557865E2 (~0.123E2, ~0.27182817E1, 0.123E~2): 0.33436096E2 0.33436096E2 (~0.123E2, ~0.27182817E1, 0.11754944E~37): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, 0.5877472E~38): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, 0.1E~44): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, 0.0): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, ~0.123E4): ~0.11965652E4 ~0.11965652E4 (~0.123E2, ~0.27182817E1, ~0.123E2): 0.21134867E2 0.21134867E2 (~0.123E2, ~0.27182817E1, ~0.31415927E1): 0.30293274E2 0.30293274E2 (~0.123E2, ~0.27182817E1, ~0.27182817E1): 0.30716585E2 0.30716585E2 (~0.123E2, ~0.27182817E1, ~0.123E1): 0.32204865E2 0.32204865E2 (~0.123E2, ~0.27182817E1, ~0.123): 0.33311867E2 0.33311867E2 (~0.123E2, ~0.27182817E1, ~0.123E~2): 0.33433636E2 0.33433636E2 (~0.123E2, ~0.27182817E1, ~0.11754944E~37): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, ~0.5877472E~38): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, ~0.1E~44): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.27182817E1, ~0.0): 0.33434868E2 0.33434868E2 (~0.123E2, ~0.123E1, 0.123E4): 0.1245129E4 0.1245129E4 (~0.123E2, ~0.123E1, 0.123E2): 0.27429E2 0.27429E2 (~0.123E2, ~0.123E1, 0.31415927E1): 0.18270594E2 0.18270594E2 (~0.123E2, ~0.123E1, 0.27182817E1): 0.17847282E2 0.17847282E2 (~0.123E2, ~0.123E1, 0.123E1): 0.16359001E2 0.16359001E2 (~0.123E2, ~0.123E1, 0.123): 0.15252001E2 0.15252001E2 (~0.123E2, ~0.123E1, 0.123E~2): 0.15130231E2 0.15130231E2 (~0.123E2, ~0.123E1, 0.11754944E~37): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, 0.5877472E~38): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, 0.1E~44): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, 0.0): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (~0.123E2, ~0.123E1, ~0.123E2): 0.28290002E1 0.28290002E1 (~0.123E2, ~0.123E1, ~0.31415927E1): 0.11987408E2 0.11987408E2 (~0.123E2, ~0.123E1, ~0.27182817E1): 0.12410719E2 0.12410719E2 (~0.123E2, ~0.123E1, ~0.123E1): 0.13899E2 0.13899E2 (~0.123E2, ~0.123E1, ~0.123): 0.150060005E2 0.150060005E2 (~0.123E2, ~0.123E1, ~0.123E~2): 0.1512777E2 0.1512777E2 (~0.123E2, ~0.123E1, ~0.11754944E~37): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, ~0.5877472E~38): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, ~0.1E~44): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123E1, ~0.0): 0.15129001E2 0.15129001E2 (~0.123E2, ~0.123, 0.123E4): 0.1231513E4 0.1231513E4 (~0.123E2, ~0.123, 0.123E2): 0.13812901E2 0.13812901E2 (~0.123E2, ~0.123, 0.31415927E1): 0.4654493E1 0.4654493E1 (~0.123E2, ~0.123, 0.27182817E1): 0.42311816E1 0.42311816E1 (~0.123E2, ~0.123, 0.123E1): 0.27429001E1 0.27429001E1 (~0.123E2, ~0.123, 0.123): 0.16359E1 0.16359E1 (~0.123E2, ~0.123, 0.123E~2): 0.15141301E1 0.15141301E1 (~0.123E2, ~0.123, 0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, 0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, 0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, 0.0): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (~0.123E2, ~0.123, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E2, ~0.123, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (~0.123E2, ~0.123, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (~0.123E2, ~0.123, ~0.123E1): 0.28290004 0.28290004 (~0.123E2, ~0.123, ~0.123): 0.13899001E1 0.13899001E1 (~0.123E2, ~0.123, ~0.123E~2): 0.15116701E1 0.15116701E1 (~0.123E2, ~0.123, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, ~0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123, ~0.0): 0.15129001E1 0.15129001E1 (~0.123E2, ~0.123E~2, 0.123E4): 0.12300151E4 0.12300151E4 (~0.123E2, ~0.123E~2, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123E2, ~0.123E~2, 0.31415927E1): 0.31567218E1 0.31567218E1 (~0.123E2, ~0.123E~2, 0.27182817E1): 0.27334108E1 0.27334108E1 (~0.123E2, ~0.123E~2, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123E2, ~0.123E~2, 0.123): 0.13812901 0.13812901 (~0.123E2, ~0.123E~2, 0.123E~2): 0.16359001E~1 0.16359001E~1 (~0.123E2, ~0.123E~2, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, 0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, 0.0): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (~0.123E2, ~0.123E~2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123E2, ~0.123E~2, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (~0.123E2, ~0.123E~2, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (~0.123E2, ~0.123E~2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123E2, ~0.123E~2, ~0.123): ~0.107871 ~0.107871 (~0.123E2, ~0.123E~2, ~0.123E~2): 0.13899001E~1 0.13899001E~1 (~0.123E2, ~0.123E~2, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.123E~2, ~0.0): 0.15129001E~1 0.15129001E~1 (~0.123E2, ~0.11754944E~37, 0.1E~44): 0.14458581E~36 0.14458581E~36 (~0.123E2, ~0.11754944E~37, ~0.1E~44): 0.14458581E~36 0.14458581E~36 (~0.123E2, ~0.5877472E~38, 0.1E~44): 0.72292904E~37 0.72292904E~37 (~0.123E2, ~0.5877472E~38, ~0.1E~44): 0.72292904E~37 0.72292904E~37 (~0.123E2, ~0.1E~44, 0.11754944E~37): 0.1175496E~37 0.1175496E~37 (~0.123E2, ~0.1E~44, 0.5877472E~38): 0.5877489E~38 0.5877489E~38 (~0.123E2, ~0.1E~44, 0.1E~44): 0.18E~43 0.18E~43 (~0.123E2, ~0.1E~44, 0.0): 0.17E~43 0.17E~43 (~0.123E2, ~0.1E~44, ~0.11754944E~37): ~0.11754927E~37 ~0.11754927E~37 (~0.123E2, ~0.1E~44, ~0.5877472E~38): ~0.5877455E~38 ~0.5877455E~38 (~0.123E2, ~0.1E~44, ~0.1E~44): 0.15E~43 0.15E~43 (~0.123E2, ~0.1E~44, ~0.0): 0.17E~43 0.17E~43 (~0.31415927E1, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.123E4): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.123E2): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.123E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.123): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.31415927E1, 0.34028235E39, 0.0): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.123): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.31415927E1, 0.34028235E39, ~0.0): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.34028235E39): ~0.19423192E39 ~0.19423192E39 (~0.31415927E1, 0.17014117E39, 0.17014117E39): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.123E4): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.123E2): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.123E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.123): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.31415927E1, 0.17014117E39, 0.0): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.123): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.31415927E1, 0.17014117E39, ~0.0): ~inf ~inf (~0.31415927E1, 0.123E4, 0.123E4): ~0.26341592E4 ~0.26341592E4 (~0.31415927E1, 0.123E4, 0.123E2): ~0.38518591E4 ~0.38518591E4 (~0.31415927E1, 0.123E4, 0.31415927E1): ~0.38610176E4 ~0.38610176E4 (~0.31415927E1, 0.123E4, 0.27182817E1): ~0.38614407E4 ~0.38614407E4 (~0.31415927E1, 0.123E4, 0.123E1): ~0.3862929E4 ~0.3862929E4 (~0.31415927E1, 0.123E4, 0.123): ~0.38640361E4 ~0.38640361E4 (~0.31415927E1, 0.123E4, 0.123E~2): ~0.3864158E4 ~0.3864158E4 (~0.31415927E1, 0.123E4, 0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, 0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, 0.1E~44): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, 0.0): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, ~0.123E4): ~0.5094159E4 ~0.5094159E4 (~0.31415927E1, 0.123E4, ~0.123E2): ~0.3876459E4 ~0.3876459E4 (~0.31415927E1, 0.123E4, ~0.31415927E1): ~0.38673008E4 ~0.38673008E4 (~0.31415927E1, 0.123E4, ~0.27182817E1): ~0.38668774E4 ~0.38668774E4 (~0.31415927E1, 0.123E4, ~0.123E1): ~0.38653892E4 ~0.38653892E4 (~0.31415927E1, 0.123E4, ~0.123): ~0.3864282E4 ~0.3864282E4 (~0.31415927E1, 0.123E4, ~0.123E~2): ~0.38641604E4 ~0.38641604E4 (~0.31415927E1, 0.123E4, ~0.11754944E~37): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, ~0.5877472E~38): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, ~0.1E~44): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E4, ~0.0): ~0.38641592E4 ~0.38641592E4 (~0.31415927E1, 0.123E2, 0.123E4): 0.11913584E4 0.11913584E4 (~0.31415927E1, 0.123E2, 0.123E2): ~0.2634159E2 ~0.2634159E2 (~0.31415927E1, 0.123E2, 0.31415927E1): ~0.355E2 ~0.355E2 (~0.31415927E1, 0.123E2, 0.27182817E1): ~0.3592331E2 ~0.3592331E2 (~0.31415927E1, 0.123E2, 0.123E1): ~0.3741159E2 ~0.3741159E2 (~0.31415927E1, 0.123E2, 0.123): ~0.38518593E2 ~0.38518593E2 (~0.31415927E1, 0.123E2, 0.123E~2): ~0.3864036E2 ~0.3864036E2 (~0.31415927E1, 0.123E2, 0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, 0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, 0.1E~44): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, 0.0): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, ~0.123E4): ~0.12686416E4 ~0.12686416E4 (~0.31415927E1, 0.123E2, ~0.123E2): ~0.50941593E2 ~0.50941593E2 (~0.31415927E1, 0.123E2, ~0.31415927E1): ~0.41783184E2 ~0.41783184E2 (~0.31415927E1, 0.123E2, ~0.27182817E1): ~0.41359875E2 ~0.41359875E2 (~0.31415927E1, 0.123E2, ~0.123E1): ~0.3987159E2 ~0.3987159E2 (~0.31415927E1, 0.123E2, ~0.123): ~0.3876459E2 ~0.3876459E2 (~0.31415927E1, 0.123E2, ~0.123E~2): ~0.38642822E2 ~0.38642822E2 (~0.31415927E1, 0.123E2, ~0.11754944E~37): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, ~0.5877472E~38): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, ~0.1E~44): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.123E2, ~0.0): ~0.3864159E2 ~0.3864159E2 (~0.31415927E1, 0.31415927E1, 0.123E4): 0.12201304E4 0.12201304E4 (~0.31415927E1, 0.31415927E1, 0.123E2): 0.24303951E1 0.24303951E1 (~0.31415927E1, 0.31415927E1, 0.31415927E1): ~0.6728012E1 ~0.6728012E1 (~0.31415927E1, 0.31415927E1, 0.27182817E1): ~0.71513233E1 ~0.71513233E1 (~0.31415927E1, 0.31415927E1, 0.123E1): ~0.8639605E1 ~0.8639605E1 (~0.31415927E1, 0.31415927E1, 0.123): ~0.9746605E1 ~0.9746605E1 (~0.31415927E1, 0.31415927E1, 0.123E~2): ~0.9868375E1 ~0.9868375E1 (~0.31415927E1, 0.31415927E1, 0.11754944E~37): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, 0.5877472E~38): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, 0.1E~44): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, 0.0): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, ~0.123E4): ~0.12398696E4 ~0.12398696E4 (~0.31415927E1, 0.31415927E1, ~0.123E2): ~0.22169605E2 ~0.22169605E2 (~0.31415927E1, 0.31415927E1, ~0.31415927E1): ~0.13011198E2 ~0.13011198E2 (~0.31415927E1, 0.31415927E1, ~0.27182817E1): ~0.12587887E2 ~0.12587887E2 (~0.31415927E1, 0.31415927E1, ~0.123E1): ~0.11099605E2 ~0.11099605E2 (~0.31415927E1, 0.31415927E1, ~0.123): ~0.9992605E1 ~0.9992605E1 (~0.31415927E1, 0.31415927E1, ~0.123E~2): ~0.9870835E1 ~0.9870835E1 (~0.31415927E1, 0.31415927E1, ~0.11754944E~37): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, ~0.5877472E~38): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, ~0.1E~44): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.31415927E1, ~0.0): ~0.9869605E1 ~0.9869605E1 (~0.31415927E1, 0.27182817E1, 0.123E4): 0.12214602E4 0.12214602E4 (~0.31415927E1, 0.27182817E1, 0.123E2): 0.3760266E1 0.3760266E1 (~0.31415927E1, 0.27182817E1, 0.31415927E1): ~0.53981414E1 ~0.53981414E1 (~0.31415927E1, 0.27182817E1, 0.27182817E1): ~0.58214526E1 ~0.58214526E1 (~0.31415927E1, 0.27182817E1, 0.123E1): ~0.73097343E1 ~0.73097343E1 (~0.31415927E1, 0.27182817E1, 0.123): ~0.8416734E1 ~0.8416734E1 (~0.31415927E1, 0.27182817E1, 0.123E~2): ~0.8538505E1 ~0.8538505E1 (~0.31415927E1, 0.27182817E1, 0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, 0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, 0.1E~44): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, 0.0): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, ~0.123E4): ~0.12385398E4 ~0.12385398E4 (~0.31415927E1, 0.27182817E1, ~0.123E2): ~0.20839735E2 ~0.20839735E2 (~0.31415927E1, 0.27182817E1, ~0.31415927E1): ~0.11681327E2 ~0.11681327E2 (~0.31415927E1, 0.27182817E1, ~0.27182817E1): ~0.11258016E2 ~0.11258016E2 (~0.31415927E1, 0.27182817E1, ~0.123E1): ~0.9769734E1 ~0.9769734E1 (~0.31415927E1, 0.27182817E1, ~0.123): ~0.8662734E1 ~0.8662734E1 (~0.31415927E1, 0.27182817E1, ~0.123E~2): ~0.8540964E1 ~0.8540964E1 (~0.31415927E1, 0.27182817E1, ~0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, ~0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, ~0.1E~44): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.27182817E1, ~0.0): ~0.8539734E1 ~0.8539734E1 (~0.31415927E1, 0.123E1, 0.123E4): 0.12261359E4 0.12261359E4 (~0.31415927E1, 0.123E1, 0.123E2): 0.8435841E1 0.8435841E1 (~0.31415927E1, 0.123E1, 0.31415927E1): ~0.72256637 ~0.72256637 (~0.31415927E1, 0.123E1, 0.27182817E1): ~0.11458774E1 ~0.11458774E1 (~0.31415927E1, 0.123E1, 0.123E1): ~0.2634159E1 ~0.2634159E1 (~0.31415927E1, 0.123E1, 0.123): ~0.37411592E1 ~0.37411592E1 (~0.31415927E1, 0.123E1, 0.123E~2): ~0.3862929E1 ~0.3862929E1 (~0.31415927E1, 0.123E1, 0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, 0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, 0.1E~44): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, 0.0): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, ~0.123E4): ~0.12338641E4 ~0.12338641E4 (~0.31415927E1, 0.123E1, ~0.123E2): ~0.1616416E2 ~0.1616416E2 (~0.31415927E1, 0.123E1, ~0.31415927E1): ~0.7005752E1 ~0.7005752E1 (~0.31415927E1, 0.123E1, ~0.27182817E1): ~0.6582441E1 ~0.6582441E1 (~0.31415927E1, 0.123E1, ~0.123E1): ~0.5094159E1 ~0.5094159E1 (~0.31415927E1, 0.123E1, ~0.123): ~0.39871593E1 ~0.39871593E1 (~0.31415927E1, 0.123E1, ~0.123E~2): ~0.3865389E1 ~0.3865389E1 (~0.31415927E1, 0.123E1, ~0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, ~0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, ~0.1E~44): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123E1, ~0.0): ~0.3864159E1 ~0.3864159E1 (~0.31415927E1, 0.123, 0.123E4): 0.12296135E4 0.12296135E4 (~0.31415927E1, 0.123, 0.123E2): 0.11913585E2 0.11913585E2 (~0.31415927E1, 0.123, 0.31415927E1): 0.27551768E1 0.27551768E1 (~0.31415927E1, 0.123, 0.27182817E1): 0.23318658E1 0.23318658E1 (~0.31415927E1, 0.123, 0.123E1): 0.8435841 0.8435841 (~0.31415927E1, 0.123, 0.123): ~0.2634159 ~0.2634159 (~0.31415927E1, 0.123, 0.123E~2): ~0.38518593 ~0.38518593 (~0.31415927E1, 0.123, 0.11754944E~37): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, 0.5877472E~38): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, 0.1E~44): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, 0.0): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, ~0.123E4): ~0.12303865E4 ~0.12303865E4 (~0.31415927E1, 0.123, ~0.123E2): ~0.12686416E2 ~0.12686416E2 (~0.31415927E1, 0.123, ~0.31415927E1): ~0.35280087E1 ~0.35280087E1 (~0.31415927E1, 0.123, ~0.27182817E1): ~0.31046977E1 ~0.31046977E1 (~0.31415927E1, 0.123, ~0.123E1): ~0.1616416E1 ~0.1616416E1 (~0.31415927E1, 0.123, ~0.123): ~0.5094159 ~0.5094159 (~0.31415927E1, 0.123, ~0.123E~2): ~0.38764593 ~0.38764593 (~0.31415927E1, 0.123, ~0.11754944E~37): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, ~0.5877472E~38): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, ~0.1E~44): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123, ~0.0): ~0.38641593 ~0.38641593 (~0.31415927E1, 0.123E~2, 0.123E4): 0.12299961E4 0.12299961E4 (~0.31415927E1, 0.123E~2, 0.123E2): 0.12296136E2 0.12296136E2 (~0.31415927E1, 0.123E~2, 0.31415927E1): 0.31377287E1 0.31377287E1 (~0.31415927E1, 0.123E~2, 0.27182817E1): 0.27144177E1 0.27144177E1 (~0.31415927E1, 0.123E~2, 0.123E1): 0.12261358E1 0.12261358E1 (~0.31415927E1, 0.123E~2, 0.123): 0.11913584 0.11913584 (~0.31415927E1, 0.123E~2, 0.123E~2): ~0.26341593E~2 ~0.26341593E~2 (~0.31415927E1, 0.123E~2, 0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, 0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, 0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, 0.0): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, ~0.123E4): ~0.12300039E4 ~0.12300039E4 (~0.31415927E1, 0.123E~2, ~0.123E2): ~0.123038645E2 ~0.123038645E2 (~0.31415927E1, 0.123E~2, ~0.31415927E1): ~0.31454568E1 ~0.31454568E1 (~0.31415927E1, 0.123E~2, ~0.27182817E1): ~0.27221458E1 ~0.27221458E1 (~0.31415927E1, 0.123E~2, ~0.123E1): ~0.12338642E1 ~0.12338642E1 (~0.31415927E1, 0.123E~2, ~0.123): ~0.12686417 ~0.12686417 (~0.31415927E1, 0.123E~2, ~0.123E~2): ~0.50941594E~2 ~0.50941594E~2 (~0.31415927E1, 0.123E~2, ~0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, ~0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, ~0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.123E~2, ~0.0): ~0.38641593E~2 ~0.38641593E~2 (~0.31415927E1, 0.11754944E~37, 0.1E~44): ~0.36929242E~37 ~0.36929242E~37 (~0.31415927E1, 0.11754944E~37, ~0.11754944E~37): ~0.4868419E~37 ~0.4868419E~37 (~0.31415927E1, 0.11754944E~37, ~0.1E~44): ~0.36929248E~37 ~0.36929248E~37 (~0.31415927E1, 0.5877472E~38, ~0.11754944E~37): ~0.30219568E~37 ~0.30219568E~37 (~0.31415927E1, 0.5877472E~38, ~0.5877472E~38): ~0.24342096E~37 ~0.24342096E~37 (~0.31415927E1, 0.1E~44, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (~0.31415927E1, 0.1E~44, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (~0.31415927E1, 0.1E~44, 0.1E~44): ~0.3E~44 ~0.3E~44 (~0.31415927E1, 0.1E~44, 0.0): ~0.4E~44 ~0.4E~44 (~0.31415927E1, 0.1E~44, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (~0.31415927E1, 0.1E~44, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (~0.31415927E1, 0.1E~44, ~0.1E~44): ~0.6E~44 ~0.6E~44 (~0.31415927E1, 0.1E~44, ~0.0): ~0.4E~44 ~0.4E~44 (~0.31415927E1, ~0.34028235E39, 0.34028235E39): inf inf (~0.31415927E1, ~0.34028235E39, 0.17014117E39): inf inf (~0.31415927E1, ~0.34028235E39, 0.123E4): inf inf (~0.31415927E1, ~0.34028235E39, 0.123E2): inf inf (~0.31415927E1, ~0.34028235E39, 0.31415927E1): inf inf (~0.31415927E1, ~0.34028235E39, 0.27182817E1): inf inf (~0.31415927E1, ~0.34028235E39, 0.123E1): inf inf (~0.31415927E1, ~0.34028235E39, 0.123): inf inf (~0.31415927E1, ~0.34028235E39, 0.123E~2): inf inf (~0.31415927E1, ~0.34028235E39, 0.11754944E~37): inf inf (~0.31415927E1, ~0.34028235E39, 0.5877472E~38): inf inf (~0.31415927E1, ~0.34028235E39, 0.1E~44): inf inf (~0.31415927E1, ~0.34028235E39, 0.0): inf inf (~0.31415927E1, ~0.34028235E39, ~0.34028235E39): inf inf (~0.31415927E1, ~0.34028235E39, ~0.17014117E39): inf inf (~0.31415927E1, ~0.34028235E39, ~0.123E4): inf inf (~0.31415927E1, ~0.34028235E39, ~0.123E2): inf inf (~0.31415927E1, ~0.34028235E39, ~0.31415927E1): inf inf (~0.31415927E1, ~0.34028235E39, ~0.27182817E1): inf inf (~0.31415927E1, ~0.34028235E39, ~0.123E1): inf inf (~0.31415927E1, ~0.34028235E39, ~0.123): inf inf (~0.31415927E1, ~0.34028235E39, ~0.123E~2): inf inf (~0.31415927E1, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.31415927E1, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.31415927E1, ~0.34028235E39, ~0.1E~44): inf inf (~0.31415927E1, ~0.34028235E39, ~0.0): inf inf (~0.31415927E1, ~0.17014117E39, 0.34028235E39): inf inf (~0.31415927E1, ~0.17014117E39, 0.17014117E39): inf inf (~0.31415927E1, ~0.17014117E39, 0.123E4): inf inf (~0.31415927E1, ~0.17014117E39, 0.123E2): inf inf (~0.31415927E1, ~0.17014117E39, 0.31415927E1): inf inf (~0.31415927E1, ~0.17014117E39, 0.27182817E1): inf inf (~0.31415927E1, ~0.17014117E39, 0.123E1): inf inf (~0.31415927E1, ~0.17014117E39, 0.123): inf inf (~0.31415927E1, ~0.17014117E39, 0.123E~2): inf inf (~0.31415927E1, ~0.17014117E39, 0.11754944E~37): inf inf (~0.31415927E1, ~0.17014117E39, 0.5877472E~38): inf inf (~0.31415927E1, ~0.17014117E39, 0.1E~44): inf inf (~0.31415927E1, ~0.17014117E39, 0.0): inf inf (~0.31415927E1, ~0.17014117E39, ~0.34028235E39): 0.19423192E39 0.19423192E39 (~0.31415927E1, ~0.17014117E39, ~0.17014117E39): inf inf (~0.31415927E1, ~0.17014117E39, ~0.123E4): inf inf (~0.31415927E1, ~0.17014117E39, ~0.123E2): inf inf (~0.31415927E1, ~0.17014117E39, ~0.31415927E1): inf inf (~0.31415927E1, ~0.17014117E39, ~0.27182817E1): inf inf (~0.31415927E1, ~0.17014117E39, ~0.123E1): inf inf (~0.31415927E1, ~0.17014117E39, ~0.123): inf inf (~0.31415927E1, ~0.17014117E39, ~0.123E~2): inf inf (~0.31415927E1, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.31415927E1, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.31415927E1, ~0.17014117E39, ~0.1E~44): inf inf (~0.31415927E1, ~0.17014117E39, ~0.0): inf inf (~0.31415927E1, ~0.123E4, 0.123E4): 0.5094159E4 0.5094159E4 (~0.31415927E1, ~0.123E4, 0.123E2): 0.3876459E4 0.3876459E4 (~0.31415927E1, ~0.123E4, 0.31415927E1): 0.38673008E4 0.38673008E4 (~0.31415927E1, ~0.123E4, 0.27182817E1): 0.38668774E4 0.38668774E4 (~0.31415927E1, ~0.123E4, 0.123E1): 0.38653892E4 0.38653892E4 (~0.31415927E1, ~0.123E4, 0.123): 0.3864282E4 0.3864282E4 (~0.31415927E1, ~0.123E4, 0.123E~2): 0.38641604E4 0.38641604E4 (~0.31415927E1, ~0.123E4, 0.11754944E~37): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, 0.5877472E~38): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, 0.1E~44): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, 0.0): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, ~0.123E4): 0.26341592E4 0.26341592E4 (~0.31415927E1, ~0.123E4, ~0.123E2): 0.38518591E4 0.38518591E4 (~0.31415927E1, ~0.123E4, ~0.31415927E1): 0.38610176E4 0.38610176E4 (~0.31415927E1, ~0.123E4, ~0.27182817E1): 0.38614407E4 0.38614407E4 (~0.31415927E1, ~0.123E4, ~0.123E1): 0.3862929E4 0.3862929E4 (~0.31415927E1, ~0.123E4, ~0.123): 0.38640361E4 0.38640361E4 (~0.31415927E1, ~0.123E4, ~0.123E~2): 0.3864158E4 0.3864158E4 (~0.31415927E1, ~0.123E4, ~0.11754944E~37): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, ~0.5877472E~38): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, ~0.1E~44): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E4, ~0.0): 0.38641592E4 0.38641592E4 (~0.31415927E1, ~0.123E2, 0.123E4): 0.12686416E4 0.12686416E4 (~0.31415927E1, ~0.123E2, 0.123E2): 0.50941593E2 0.50941593E2 (~0.31415927E1, ~0.123E2, 0.31415927E1): 0.41783184E2 0.41783184E2 (~0.31415927E1, ~0.123E2, 0.27182817E1): 0.41359875E2 0.41359875E2 (~0.31415927E1, ~0.123E2, 0.123E1): 0.3987159E2 0.3987159E2 (~0.31415927E1, ~0.123E2, 0.123): 0.3876459E2 0.3876459E2 (~0.31415927E1, ~0.123E2, 0.123E~2): 0.38642822E2 0.38642822E2 (~0.31415927E1, ~0.123E2, 0.11754944E~37): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, 0.5877472E~38): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, 0.1E~44): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, 0.0): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, ~0.123E4): ~0.11913584E4 ~0.11913584E4 (~0.31415927E1, ~0.123E2, ~0.123E2): 0.2634159E2 0.2634159E2 (~0.31415927E1, ~0.123E2, ~0.31415927E1): 0.355E2 0.355E2 (~0.31415927E1, ~0.123E2, ~0.27182817E1): 0.3592331E2 0.3592331E2 (~0.31415927E1, ~0.123E2, ~0.123E1): 0.3741159E2 0.3741159E2 (~0.31415927E1, ~0.123E2, ~0.123): 0.38518593E2 0.38518593E2 (~0.31415927E1, ~0.123E2, ~0.123E~2): 0.3864036E2 0.3864036E2 (~0.31415927E1, ~0.123E2, ~0.11754944E~37): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, ~0.5877472E~38): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, ~0.1E~44): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.123E2, ~0.0): 0.3864159E2 0.3864159E2 (~0.31415927E1, ~0.31415927E1, 0.123E4): 0.12398696E4 0.12398696E4 (~0.31415927E1, ~0.31415927E1, 0.123E2): 0.22169605E2 0.22169605E2 (~0.31415927E1, ~0.31415927E1, 0.31415927E1): 0.13011198E2 0.13011198E2 (~0.31415927E1, ~0.31415927E1, 0.27182817E1): 0.12587887E2 0.12587887E2 (~0.31415927E1, ~0.31415927E1, 0.123E1): 0.11099605E2 0.11099605E2 (~0.31415927E1, ~0.31415927E1, 0.123): 0.9992605E1 0.9992605E1 (~0.31415927E1, ~0.31415927E1, 0.123E~2): 0.9870835E1 0.9870835E1 (~0.31415927E1, ~0.31415927E1, 0.11754944E~37): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, 0.5877472E~38): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, 0.1E~44): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, 0.0): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, ~0.123E4): ~0.12201304E4 ~0.12201304E4 (~0.31415927E1, ~0.31415927E1, ~0.123E2): ~0.24303951E1 ~0.24303951E1 (~0.31415927E1, ~0.31415927E1, ~0.31415927E1): 0.6728012E1 0.6728012E1 (~0.31415927E1, ~0.31415927E1, ~0.27182817E1): 0.71513233E1 0.71513233E1 (~0.31415927E1, ~0.31415927E1, ~0.123E1): 0.8639605E1 0.8639605E1 (~0.31415927E1, ~0.31415927E1, ~0.123): 0.9746605E1 0.9746605E1 (~0.31415927E1, ~0.31415927E1, ~0.123E~2): 0.9868375E1 0.9868375E1 (~0.31415927E1, ~0.31415927E1, ~0.11754944E~37): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, ~0.5877472E~38): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, ~0.1E~44): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.31415927E1, ~0.0): 0.9869605E1 0.9869605E1 (~0.31415927E1, ~0.27182817E1, 0.123E4): 0.12385398E4 0.12385398E4 (~0.31415927E1, ~0.27182817E1, 0.123E2): 0.20839735E2 0.20839735E2 (~0.31415927E1, ~0.27182817E1, 0.31415927E1): 0.11681327E2 0.11681327E2 (~0.31415927E1, ~0.27182817E1, 0.27182817E1): 0.11258016E2 0.11258016E2 (~0.31415927E1, ~0.27182817E1, 0.123E1): 0.9769734E1 0.9769734E1 (~0.31415927E1, ~0.27182817E1, 0.123): 0.8662734E1 0.8662734E1 (~0.31415927E1, ~0.27182817E1, 0.123E~2): 0.8540964E1 0.8540964E1 (~0.31415927E1, ~0.27182817E1, 0.11754944E~37): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, 0.5877472E~38): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, 0.1E~44): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, 0.0): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, ~0.123E4): ~0.12214602E4 ~0.12214602E4 (~0.31415927E1, ~0.27182817E1, ~0.123E2): ~0.3760266E1 ~0.3760266E1 (~0.31415927E1, ~0.27182817E1, ~0.31415927E1): 0.53981414E1 0.53981414E1 (~0.31415927E1, ~0.27182817E1, ~0.27182817E1): 0.58214526E1 0.58214526E1 (~0.31415927E1, ~0.27182817E1, ~0.123E1): 0.73097343E1 0.73097343E1 (~0.31415927E1, ~0.27182817E1, ~0.123): 0.8416734E1 0.8416734E1 (~0.31415927E1, ~0.27182817E1, ~0.123E~2): 0.8538505E1 0.8538505E1 (~0.31415927E1, ~0.27182817E1, ~0.11754944E~37): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, ~0.5877472E~38): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, ~0.1E~44): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.27182817E1, ~0.0): 0.8539734E1 0.8539734E1 (~0.31415927E1, ~0.123E1, 0.123E4): 0.12338641E4 0.12338641E4 (~0.31415927E1, ~0.123E1, 0.123E2): 0.1616416E2 0.1616416E2 (~0.31415927E1, ~0.123E1, 0.31415927E1): 0.7005752E1 0.7005752E1 (~0.31415927E1, ~0.123E1, 0.27182817E1): 0.6582441E1 0.6582441E1 (~0.31415927E1, ~0.123E1, 0.123E1): 0.5094159E1 0.5094159E1 (~0.31415927E1, ~0.123E1, 0.123): 0.39871593E1 0.39871593E1 (~0.31415927E1, ~0.123E1, 0.123E~2): 0.3865389E1 0.3865389E1 (~0.31415927E1, ~0.123E1, 0.11754944E~37): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, 0.5877472E~38): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, 0.1E~44): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, 0.0): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, ~0.123E4): ~0.12261359E4 ~0.12261359E4 (~0.31415927E1, ~0.123E1, ~0.123E2): ~0.8435841E1 ~0.8435841E1 (~0.31415927E1, ~0.123E1, ~0.31415927E1): 0.72256637 0.72256637 (~0.31415927E1, ~0.123E1, ~0.27182817E1): 0.11458774E1 0.11458774E1 (~0.31415927E1, ~0.123E1, ~0.123E1): 0.2634159E1 0.2634159E1 (~0.31415927E1, ~0.123E1, ~0.123): 0.37411592E1 0.37411592E1 (~0.31415927E1, ~0.123E1, ~0.123E~2): 0.3862929E1 0.3862929E1 (~0.31415927E1, ~0.123E1, ~0.11754944E~37): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, ~0.5877472E~38): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, ~0.1E~44): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123E1, ~0.0): 0.3864159E1 0.3864159E1 (~0.31415927E1, ~0.123, 0.123E4): 0.12303865E4 0.12303865E4 (~0.31415927E1, ~0.123, 0.123E2): 0.12686416E2 0.12686416E2 (~0.31415927E1, ~0.123, 0.31415927E1): 0.35280087E1 0.35280087E1 (~0.31415927E1, ~0.123, 0.27182817E1): 0.31046977E1 0.31046977E1 (~0.31415927E1, ~0.123, 0.123E1): 0.1616416E1 0.1616416E1 (~0.31415927E1, ~0.123, 0.123): 0.5094159 0.5094159 (~0.31415927E1, ~0.123, 0.123E~2): 0.38764593 0.38764593 (~0.31415927E1, ~0.123, 0.11754944E~37): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, 0.5877472E~38): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, 0.1E~44): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, 0.0): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, ~0.123E4): ~0.12296135E4 ~0.12296135E4 (~0.31415927E1, ~0.123, ~0.123E2): ~0.11913585E2 ~0.11913585E2 (~0.31415927E1, ~0.123, ~0.31415927E1): ~0.27551768E1 ~0.27551768E1 (~0.31415927E1, ~0.123, ~0.27182817E1): ~0.23318658E1 ~0.23318658E1 (~0.31415927E1, ~0.123, ~0.123E1): ~0.8435841 ~0.8435841 (~0.31415927E1, ~0.123, ~0.123): 0.2634159 0.2634159 (~0.31415927E1, ~0.123, ~0.123E~2): 0.38518593 0.38518593 (~0.31415927E1, ~0.123, ~0.11754944E~37): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, ~0.5877472E~38): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, ~0.1E~44): 0.38641593 0.38641593 (~0.31415927E1, ~0.123, ~0.0): 0.38641593 0.38641593 (~0.31415927E1, ~0.123E~2, 0.123E4): 0.12300039E4 0.12300039E4 (~0.31415927E1, ~0.123E~2, 0.123E2): 0.123038645E2 0.123038645E2 (~0.31415927E1, ~0.123E~2, 0.31415927E1): 0.31454568E1 0.31454568E1 (~0.31415927E1, ~0.123E~2, 0.27182817E1): 0.27221458E1 0.27221458E1 (~0.31415927E1, ~0.123E~2, 0.123E1): 0.12338642E1 0.12338642E1 (~0.31415927E1, ~0.123E~2, 0.123): 0.12686417 0.12686417 (~0.31415927E1, ~0.123E~2, 0.123E~2): 0.50941594E~2 0.50941594E~2 (~0.31415927E1, ~0.123E~2, 0.11754944E~37): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, 0.5877472E~38): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, 0.1E~44): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, 0.0): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, ~0.123E4): ~0.12299961E4 ~0.12299961E4 (~0.31415927E1, ~0.123E~2, ~0.123E2): ~0.12296136E2 ~0.12296136E2 (~0.31415927E1, ~0.123E~2, ~0.31415927E1): ~0.31377287E1 ~0.31377287E1 (~0.31415927E1, ~0.123E~2, ~0.27182817E1): ~0.27144177E1 ~0.27144177E1 (~0.31415927E1, ~0.123E~2, ~0.123E1): ~0.12261358E1 ~0.12261358E1 (~0.31415927E1, ~0.123E~2, ~0.123): ~0.11913584 ~0.11913584 (~0.31415927E1, ~0.123E~2, ~0.123E~2): 0.26341593E~2 0.26341593E~2 (~0.31415927E1, ~0.123E~2, ~0.11754944E~37): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, ~0.5877472E~38): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, ~0.1E~44): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.123E~2, ~0.0): 0.38641593E~2 0.38641593E~2 (~0.31415927E1, ~0.11754944E~37, 0.11754944E~37): 0.4868419E~37 0.4868419E~37 (~0.31415927E1, ~0.11754944E~37, 0.1E~44): 0.36929248E~37 0.36929248E~37 (~0.31415927E1, ~0.11754944E~37, ~0.1E~44): 0.36929242E~37 0.36929242E~37 (~0.31415927E1, ~0.5877472E~38, 0.11754944E~37): 0.30219568E~37 0.30219568E~37 (~0.31415927E1, ~0.5877472E~38, 0.5877472E~38): 0.24342096E~37 0.24342096E~37 (~0.31415927E1, ~0.1E~44, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (~0.31415927E1, ~0.1E~44, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (~0.31415927E1, ~0.1E~44, 0.1E~44): 0.6E~44 0.6E~44 (~0.31415927E1, ~0.1E~44, 0.0): 0.4E~44 0.4E~44 (~0.31415927E1, ~0.1E~44, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (~0.31415927E1, ~0.1E~44, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (~0.31415927E1, ~0.1E~44, ~0.1E~44): 0.3E~44 0.3E~44 (~0.31415927E1, ~0.1E~44, ~0.0): 0.4E~44 0.4E~44 (~0.27182817E1, 0.34028235E39, 0.34028235E39): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.17014117E39): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.123E4): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.123E2): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.123E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.123): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.27182817E1, 0.34028235E39, 0.0): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.123): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.27182817E1, 0.34028235E39, ~0.0): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.34028235E39): ~0.1222093E39 ~0.1222093E39 (~0.27182817E1, 0.17014117E39, 0.17014117E39): ~0.29235047E39 ~0.29235047E39 (~0.27182817E1, 0.17014117E39, 0.123E4): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.123E2): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.31415927E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.27182817E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.123E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.123): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.123E~2): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.11754944E~37): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.5877472E~38): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.1E~44): ~inf ~inf (~0.27182817E1, 0.17014117E39, 0.0): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.123E4): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.123E2): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.31415927E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.27182817E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.123E1): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.123): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.123E~2): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.11754944E~37): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.5877472E~38): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.1E~44): ~inf ~inf (~0.27182817E1, 0.17014117E39, ~0.0): ~inf ~inf (~0.27182817E1, 0.123E4, 0.123E4): ~0.21134866E4 ~0.21134866E4 (~0.27182817E1, 0.123E4, 0.123E2): ~0.33311865E4 ~0.33311865E4 (~0.27182817E1, 0.123E4, 0.31415927E1): ~0.3340345E4 ~0.3340345E4 (~0.27182817E1, 0.123E4, 0.27182817E1): ~0.33407683E4 ~0.33407683E4 (~0.27182817E1, 0.123E4, 0.123E1): ~0.33422566E4 ~0.33422566E4 (~0.27182817E1, 0.123E4, 0.123): ~0.33433635E4 ~0.33433635E4 (~0.27182817E1, 0.123E4, 0.123E~2): ~0.33434854E4 ~0.33434854E4 (~0.27182817E1, 0.123E4, 0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, 0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, 0.1E~44): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, 0.0): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, ~0.123E4): ~0.45734863E4 ~0.45734863E4 (~0.27182817E1, 0.123E4, ~0.123E2): ~0.33557866E4 ~0.33557866E4 (~0.27182817E1, 0.123E4, ~0.31415927E1): ~0.33466282E4 ~0.33466282E4 (~0.27182817E1, 0.123E4, ~0.27182817E1): ~0.33462048E4 ~0.33462048E4 (~0.27182817E1, 0.123E4, ~0.123E1): ~0.33447166E4 ~0.33447166E4 (~0.27182817E1, 0.123E4, ~0.123): ~0.33436096E4 ~0.33436096E4 (~0.27182817E1, 0.123E4, ~0.123E~2): ~0.33434878E4 ~0.33434878E4 (~0.27182817E1, 0.123E4, ~0.11754944E~37): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, ~0.5877472E~38): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, ~0.1E~44): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E4, ~0.0): ~0.33434866E4 ~0.33434866E4 (~0.27182817E1, 0.123E2, 0.123E4): 0.11965652E4 0.11965652E4 (~0.27182817E1, 0.123E2, 0.123E2): ~0.21134867E2 ~0.21134867E2 (~0.27182817E1, 0.123E2, 0.31415927E1): ~0.30293274E2 ~0.30293274E2 (~0.27182817E1, 0.123E2, 0.27182817E1): ~0.30716585E2 ~0.30716585E2 (~0.27182817E1, 0.123E2, 0.123E1): ~0.32204865E2 ~0.32204865E2 (~0.27182817E1, 0.123E2, 0.123): ~0.33311867E2 ~0.33311867E2 (~0.27182817E1, 0.123E2, 0.123E~2): ~0.33433636E2 ~0.33433636E2 (~0.27182817E1, 0.123E2, 0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, 0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, 0.1E~44): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, 0.0): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, ~0.123E4): ~0.12634348E4 ~0.12634348E4 (~0.27182817E1, 0.123E2, ~0.123E2): ~0.45734867E2 ~0.45734867E2 (~0.27182817E1, 0.123E2, ~0.31415927E1): ~0.36576458E2 ~0.36576458E2 (~0.27182817E1, 0.123E2, ~0.27182817E1): ~0.3615315E2 ~0.3615315E2 (~0.27182817E1, 0.123E2, ~0.123E1): ~0.34664867E2 ~0.34664867E2 (~0.27182817E1, 0.123E2, ~0.123): ~0.33557865E2 ~0.33557865E2 (~0.27182817E1, 0.123E2, ~0.123E~2): ~0.33436096E2 ~0.33436096E2 (~0.27182817E1, 0.123E2, ~0.11754944E~37): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, ~0.5877472E~38): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, ~0.1E~44): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.123E2, ~0.0): ~0.33434868E2 ~0.33434868E2 (~0.27182817E1, 0.31415927E1, 0.123E4): 0.12214602E4 0.12214602E4 (~0.27182817E1, 0.31415927E1, 0.123E2): 0.3760266E1 0.3760266E1 (~0.27182817E1, 0.31415927E1, 0.31415927E1): ~0.53981414E1 ~0.53981414E1 (~0.27182817E1, 0.31415927E1, 0.27182817E1): ~0.58214526E1 ~0.58214526E1 (~0.27182817E1, 0.31415927E1, 0.123E1): ~0.73097343E1 ~0.73097343E1 (~0.27182817E1, 0.31415927E1, 0.123): ~0.8416734E1 ~0.8416734E1 (~0.27182817E1, 0.31415927E1, 0.123E~2): ~0.8538505E1 ~0.8538505E1 (~0.27182817E1, 0.31415927E1, 0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, 0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, 0.1E~44): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, 0.0): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, ~0.123E4): ~0.12385398E4 ~0.12385398E4 (~0.27182817E1, 0.31415927E1, ~0.123E2): ~0.20839735E2 ~0.20839735E2 (~0.27182817E1, 0.31415927E1, ~0.31415927E1): ~0.11681327E2 ~0.11681327E2 (~0.27182817E1, 0.31415927E1, ~0.27182817E1): ~0.11258016E2 ~0.11258016E2 (~0.27182817E1, 0.31415927E1, ~0.123E1): ~0.9769734E1 ~0.9769734E1 (~0.27182817E1, 0.31415927E1, ~0.123): ~0.8662734E1 ~0.8662734E1 (~0.27182817E1, 0.31415927E1, ~0.123E~2): ~0.8540964E1 ~0.8540964E1 (~0.27182817E1, 0.31415927E1, ~0.11754944E~37): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, ~0.5877472E~38): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, ~0.1E~44): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.31415927E1, ~0.0): ~0.8539734E1 ~0.8539734E1 (~0.27182817E1, 0.27182817E1, 0.123E4): 0.1222611E4 0.1222611E4 (~0.27182817E1, 0.27182817E1, 0.123E2): 0.49109445E1 0.49109445E1 (~0.27182817E1, 0.27182817E1, 0.31415927E1): ~0.42474627E1 ~0.42474627E1 (~0.27182817E1, 0.27182817E1, 0.27182817E1): ~0.4670774E1 ~0.4670774E1 (~0.27182817E1, 0.27182817E1, 0.123E1): ~0.61590557E1 ~0.61590557E1 (~0.27182817E1, 0.27182817E1, 0.123): ~0.72660556E1 ~0.72660556E1 (~0.27182817E1, 0.27182817E1, 0.123E~2): ~0.73878255E1 ~0.73878255E1 (~0.27182817E1, 0.27182817E1, 0.11754944E~37): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, 0.5877472E~38): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, 0.1E~44): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, 0.0): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, ~0.123E4): ~0.1237389E4 ~0.1237389E4 (~0.27182817E1, 0.27182817E1, ~0.123E2): ~0.19689056E2 ~0.19689056E2 (~0.27182817E1, 0.27182817E1, ~0.31415927E1): ~0.10530648E2 ~0.10530648E2 (~0.27182817E1, 0.27182817E1, ~0.27182817E1): ~0.10107337E2 ~0.10107337E2 (~0.27182817E1, 0.27182817E1, ~0.123E1): ~0.8619056E1 ~0.8619056E1 (~0.27182817E1, 0.27182817E1, ~0.123): ~0.7512056E1 ~0.7512056E1 (~0.27182817E1, 0.27182817E1, ~0.123E~2): ~0.73902855E1 ~0.73902855E1 (~0.27182817E1, 0.27182817E1, ~0.11754944E~37): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, ~0.5877472E~38): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, ~0.1E~44): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.27182817E1, ~0.0): ~0.73890557E1 ~0.73890557E1 (~0.27182817E1, 0.123E1, 0.123E4): 0.12266565E4 0.12266565E4 (~0.27182817E1, 0.123E1, 0.123E2): 0.8956513E1 0.8956513E1 (~0.27182817E1, 0.123E1, 0.31415927E1): ~0.20189385 ~0.20189385 (~0.27182817E1, 0.123E1, 0.27182817E1): ~0.62520486 ~0.62520486 (~0.27182817E1, 0.123E1, 0.123E1): ~0.21134865E1 ~0.21134865E1 (~0.27182817E1, 0.123E1, 0.123): ~0.32204866E1 ~0.32204866E1 (~0.27182817E1, 0.123E1, 0.123E~2): ~0.33422565E1 ~0.33422565E1 (~0.27182817E1, 0.123E1, 0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, 0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, 0.1E~44): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, 0.0): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, ~0.123E4): ~0.12333435E4 ~0.12333435E4 (~0.27182817E1, 0.123E1, ~0.123E2): ~0.15643487E2 ~0.15643487E2 (~0.27182817E1, 0.123E1, ~0.31415927E1): ~0.64850793E1 ~0.64850793E1 (~0.27182817E1, 0.123E1, ~0.27182817E1): ~0.60617685E1 ~0.60617685E1 (~0.27182817E1, 0.123E1, ~0.123E1): ~0.4573487E1 ~0.4573487E1 (~0.27182817E1, 0.123E1, ~0.123): ~0.34664867E1 ~0.34664867E1 (~0.27182817E1, 0.123E1, ~0.123E~2): ~0.33447165E1 ~0.33447165E1 (~0.27182817E1, 0.123E1, ~0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, ~0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, ~0.1E~44): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123E1, ~0.0): ~0.33434865E1 ~0.33434865E1 (~0.27182817E1, 0.123, 0.123E4): 0.12296656E4 0.12296656E4 (~0.27182817E1, 0.123, 0.123E2): 0.119656515E2 0.119656515E2 (~0.27182817E1, 0.123, 0.31415927E1): 0.2807244E1 0.2807244E1 (~0.27182817E1, 0.123, 0.27182817E1): 0.2383933E1 0.2383933E1 (~0.27182817E1, 0.123, 0.123E1): 0.89565134 0.89565134 (~0.27182817E1, 0.123, 0.123): ~0.21134867 ~0.21134867 (~0.27182817E1, 0.123, 0.123E~2): ~0.33311868 ~0.33311868 (~0.27182817E1, 0.123, 0.11754944E~37): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, 0.5877472E~38): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, 0.1E~44): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, 0.0): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, ~0.123E4): ~0.12303344E4 ~0.12303344E4 (~0.27182817E1, 0.123, ~0.123E2): ~0.12634349E2 ~0.12634349E2 (~0.27182817E1, 0.123, ~0.31415927E1): ~0.34759414E1 ~0.34759414E1 (~0.27182817E1, 0.123, ~0.27182817E1): ~0.30526304E1 ~0.30526304E1 (~0.27182817E1, 0.123, ~0.123E1): ~0.15643487E1 ~0.15643487E1 (~0.27182817E1, 0.123, ~0.123): ~0.45734867 ~0.45734867 (~0.27182817E1, 0.123, ~0.123E~2): ~0.33557865 ~0.33557865 (~0.27182817E1, 0.123, ~0.11754944E~37): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, ~0.5877472E~38): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, ~0.1E~44): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123, ~0.0): ~0.33434868 ~0.33434868 (~0.27182817E1, 0.123E~2, 0.123E4): 0.12299967E4 0.12299967E4 (~0.27182817E1, 0.123E~2, 0.123E2): 0.12296657E2 0.12296657E2 (~0.27182817E1, 0.123E~2, 0.31415927E1): 0.31382492E1 0.31382492E1 (~0.27182817E1, 0.123E~2, 0.27182817E1): 0.27149382E1 0.27149382E1 (~0.27182817E1, 0.123E~2, 0.123E1): 0.12266566E1 0.12266566E1 (~0.27182817E1, 0.123E~2, 0.123): 0.11965652 0.11965652 (~0.27182817E1, 0.123E~2, 0.123E~2): ~0.21134866E~2 ~0.21134866E~2 (~0.27182817E1, 0.123E~2, 0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, 0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, 0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, 0.0): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, ~0.123E4): ~0.12300033E4 ~0.12300033E4 (~0.27182817E1, 0.123E~2, ~0.123E2): ~0.12303344E2 ~0.12303344E2 (~0.27182817E1, 0.123E~2, ~0.31415927E1): ~0.31449363E1 ~0.31449363E1 (~0.27182817E1, 0.123E~2, ~0.27182817E1): ~0.27216253E1 ~0.27216253E1 (~0.27182817E1, 0.123E~2, ~0.123E1): ~0.12333435E1 ~0.12333435E1 (~0.27182817E1, 0.123E~2, ~0.123): ~0.12634349 ~0.12634349 (~0.27182817E1, 0.123E~2, ~0.123E~2): ~0.45734867E~2 ~0.45734867E~2 (~0.27182817E1, 0.123E~2, ~0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, ~0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, ~0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.123E~2, ~0.0): ~0.33434867E~2 ~0.33434867E~2 (~0.27182817E1, 0.11754944E~37, 0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (~0.27182817E1, 0.11754944E~37, ~0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (~0.27182817E1, 0.1E~44, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (~0.27182817E1, 0.1E~44, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (~0.27182817E1, 0.1E~44, 0.1E~44): ~0.3E~44 ~0.3E~44 (~0.27182817E1, 0.1E~44, 0.0): ~0.4E~44 ~0.4E~44 (~0.27182817E1, 0.1E~44, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (~0.27182817E1, 0.1E~44, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (~0.27182817E1, 0.1E~44, ~0.1E~44): ~0.6E~44 ~0.6E~44 (~0.27182817E1, 0.1E~44, ~0.0): ~0.4E~44 ~0.4E~44 (~0.27182817E1, ~0.34028235E39, 0.34028235E39): inf inf (~0.27182817E1, ~0.34028235E39, 0.17014117E39): inf inf (~0.27182817E1, ~0.34028235E39, 0.123E4): inf inf (~0.27182817E1, ~0.34028235E39, 0.123E2): inf inf (~0.27182817E1, ~0.34028235E39, 0.31415927E1): inf inf (~0.27182817E1, ~0.34028235E39, 0.27182817E1): inf inf (~0.27182817E1, ~0.34028235E39, 0.123E1): inf inf (~0.27182817E1, ~0.34028235E39, 0.123): inf inf (~0.27182817E1, ~0.34028235E39, 0.123E~2): inf inf (~0.27182817E1, ~0.34028235E39, 0.11754944E~37): inf inf (~0.27182817E1, ~0.34028235E39, 0.5877472E~38): inf inf (~0.27182817E1, ~0.34028235E39, 0.1E~44): inf inf (~0.27182817E1, ~0.34028235E39, 0.0): inf inf (~0.27182817E1, ~0.34028235E39, ~0.34028235E39): inf inf (~0.27182817E1, ~0.34028235E39, ~0.17014117E39): inf inf (~0.27182817E1, ~0.34028235E39, ~0.123E4): inf inf (~0.27182817E1, ~0.34028235E39, ~0.123E2): inf inf (~0.27182817E1, ~0.34028235E39, ~0.31415927E1): inf inf (~0.27182817E1, ~0.34028235E39, ~0.27182817E1): inf inf (~0.27182817E1, ~0.34028235E39, ~0.123E1): inf inf (~0.27182817E1, ~0.34028235E39, ~0.123): inf inf (~0.27182817E1, ~0.34028235E39, ~0.123E~2): inf inf (~0.27182817E1, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.27182817E1, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.27182817E1, ~0.34028235E39, ~0.1E~44): inf inf (~0.27182817E1, ~0.34028235E39, ~0.0): inf inf (~0.27182817E1, ~0.17014117E39, 0.34028235E39): inf inf (~0.27182817E1, ~0.17014117E39, 0.17014117E39): inf inf (~0.27182817E1, ~0.17014117E39, 0.123E4): inf inf (~0.27182817E1, ~0.17014117E39, 0.123E2): inf inf (~0.27182817E1, ~0.17014117E39, 0.31415927E1): inf inf (~0.27182817E1, ~0.17014117E39, 0.27182817E1): inf inf (~0.27182817E1, ~0.17014117E39, 0.123E1): inf inf (~0.27182817E1, ~0.17014117E39, 0.123): inf inf (~0.27182817E1, ~0.17014117E39, 0.123E~2): inf inf (~0.27182817E1, ~0.17014117E39, 0.11754944E~37): inf inf (~0.27182817E1, ~0.17014117E39, 0.5877472E~38): inf inf (~0.27182817E1, ~0.17014117E39, 0.1E~44): inf inf (~0.27182817E1, ~0.17014117E39, 0.0): inf inf (~0.27182817E1, ~0.17014117E39, ~0.34028235E39): 0.1222093E39 0.1222093E39 (~0.27182817E1, ~0.17014117E39, ~0.17014117E39): 0.29235047E39 0.29235047E39 (~0.27182817E1, ~0.17014117E39, ~0.123E4): inf inf (~0.27182817E1, ~0.17014117E39, ~0.123E2): inf inf (~0.27182817E1, ~0.17014117E39, ~0.31415927E1): inf inf (~0.27182817E1, ~0.17014117E39, ~0.27182817E1): inf inf (~0.27182817E1, ~0.17014117E39, ~0.123E1): inf inf (~0.27182817E1, ~0.17014117E39, ~0.123): inf inf (~0.27182817E1, ~0.17014117E39, ~0.123E~2): inf inf (~0.27182817E1, ~0.17014117E39, ~0.11754944E~37): inf inf (~0.27182817E1, ~0.17014117E39, ~0.5877472E~38): inf inf (~0.27182817E1, ~0.17014117E39, ~0.1E~44): inf inf (~0.27182817E1, ~0.17014117E39, ~0.0): inf inf (~0.27182817E1, ~0.123E4, 0.123E4): 0.45734863E4 0.45734863E4 (~0.27182817E1, ~0.123E4, 0.123E2): 0.33557866E4 0.33557866E4 (~0.27182817E1, ~0.123E4, 0.31415927E1): 0.33466282E4 0.33466282E4 (~0.27182817E1, ~0.123E4, 0.27182817E1): 0.33462048E4 0.33462048E4 (~0.27182817E1, ~0.123E4, 0.123E1): 0.33447166E4 0.33447166E4 (~0.27182817E1, ~0.123E4, 0.123): 0.33436096E4 0.33436096E4 (~0.27182817E1, ~0.123E4, 0.123E~2): 0.33434878E4 0.33434878E4 (~0.27182817E1, ~0.123E4, 0.11754944E~37): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, 0.5877472E~38): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, 0.1E~44): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, 0.0): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, ~0.123E4): 0.21134866E4 0.21134866E4 (~0.27182817E1, ~0.123E4, ~0.123E2): 0.33311865E4 0.33311865E4 (~0.27182817E1, ~0.123E4, ~0.31415927E1): 0.3340345E4 0.3340345E4 (~0.27182817E1, ~0.123E4, ~0.27182817E1): 0.33407683E4 0.33407683E4 (~0.27182817E1, ~0.123E4, ~0.123E1): 0.33422566E4 0.33422566E4 (~0.27182817E1, ~0.123E4, ~0.123): 0.33433635E4 0.33433635E4 (~0.27182817E1, ~0.123E4, ~0.123E~2): 0.33434854E4 0.33434854E4 (~0.27182817E1, ~0.123E4, ~0.11754944E~37): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, ~0.5877472E~38): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, ~0.1E~44): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E4, ~0.0): 0.33434866E4 0.33434866E4 (~0.27182817E1, ~0.123E2, 0.123E4): 0.12634348E4 0.12634348E4 (~0.27182817E1, ~0.123E2, 0.123E2): 0.45734867E2 0.45734867E2 (~0.27182817E1, ~0.123E2, 0.31415927E1): 0.36576458E2 0.36576458E2 (~0.27182817E1, ~0.123E2, 0.27182817E1): 0.3615315E2 0.3615315E2 (~0.27182817E1, ~0.123E2, 0.123E1): 0.34664867E2 0.34664867E2 (~0.27182817E1, ~0.123E2, 0.123): 0.33557865E2 0.33557865E2 (~0.27182817E1, ~0.123E2, 0.123E~2): 0.33436096E2 0.33436096E2 (~0.27182817E1, ~0.123E2, 0.11754944E~37): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, 0.5877472E~38): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, 0.1E~44): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, 0.0): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, ~0.123E4): ~0.11965652E4 ~0.11965652E4 (~0.27182817E1, ~0.123E2, ~0.123E2): 0.21134867E2 0.21134867E2 (~0.27182817E1, ~0.123E2, ~0.31415927E1): 0.30293274E2 0.30293274E2 (~0.27182817E1, ~0.123E2, ~0.27182817E1): 0.30716585E2 0.30716585E2 (~0.27182817E1, ~0.123E2, ~0.123E1): 0.32204865E2 0.32204865E2 (~0.27182817E1, ~0.123E2, ~0.123): 0.33311867E2 0.33311867E2 (~0.27182817E1, ~0.123E2, ~0.123E~2): 0.33433636E2 0.33433636E2 (~0.27182817E1, ~0.123E2, ~0.11754944E~37): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, ~0.5877472E~38): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, ~0.1E~44): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.123E2, ~0.0): 0.33434868E2 0.33434868E2 (~0.27182817E1, ~0.31415927E1, 0.123E4): 0.12385398E4 0.12385398E4 (~0.27182817E1, ~0.31415927E1, 0.123E2): 0.20839735E2 0.20839735E2 (~0.27182817E1, ~0.31415927E1, 0.31415927E1): 0.11681327E2 0.11681327E2 (~0.27182817E1, ~0.31415927E1, 0.27182817E1): 0.11258016E2 0.11258016E2 (~0.27182817E1, ~0.31415927E1, 0.123E1): 0.9769734E1 0.9769734E1 (~0.27182817E1, ~0.31415927E1, 0.123): 0.8662734E1 0.8662734E1 (~0.27182817E1, ~0.31415927E1, 0.123E~2): 0.8540964E1 0.8540964E1 (~0.27182817E1, ~0.31415927E1, 0.11754944E~37): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, 0.5877472E~38): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, 0.1E~44): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, 0.0): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, ~0.123E4): ~0.12214602E4 ~0.12214602E4 (~0.27182817E1, ~0.31415927E1, ~0.123E2): ~0.3760266E1 ~0.3760266E1 (~0.27182817E1, ~0.31415927E1, ~0.31415927E1): 0.53981414E1 0.53981414E1 (~0.27182817E1, ~0.31415927E1, ~0.27182817E1): 0.58214526E1 0.58214526E1 (~0.27182817E1, ~0.31415927E1, ~0.123E1): 0.73097343E1 0.73097343E1 (~0.27182817E1, ~0.31415927E1, ~0.123): 0.8416734E1 0.8416734E1 (~0.27182817E1, ~0.31415927E1, ~0.123E~2): 0.8538505E1 0.8538505E1 (~0.27182817E1, ~0.31415927E1, ~0.11754944E~37): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, ~0.5877472E~38): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, ~0.1E~44): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.31415927E1, ~0.0): 0.8539734E1 0.8539734E1 (~0.27182817E1, ~0.27182817E1, 0.123E4): 0.1237389E4 0.1237389E4 (~0.27182817E1, ~0.27182817E1, 0.123E2): 0.19689056E2 0.19689056E2 (~0.27182817E1, ~0.27182817E1, 0.31415927E1): 0.10530648E2 0.10530648E2 (~0.27182817E1, ~0.27182817E1, 0.27182817E1): 0.10107337E2 0.10107337E2 (~0.27182817E1, ~0.27182817E1, 0.123E1): 0.8619056E1 0.8619056E1 (~0.27182817E1, ~0.27182817E1, 0.123): 0.7512056E1 0.7512056E1 (~0.27182817E1, ~0.27182817E1, 0.123E~2): 0.73902855E1 0.73902855E1 (~0.27182817E1, ~0.27182817E1, 0.11754944E~37): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, 0.5877472E~38): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, 0.1E~44): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, 0.0): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, ~0.123E4): ~0.1222611E4 ~0.1222611E4 (~0.27182817E1, ~0.27182817E1, ~0.123E2): ~0.49109445E1 ~0.49109445E1 (~0.27182817E1, ~0.27182817E1, ~0.31415927E1): 0.42474627E1 0.42474627E1 (~0.27182817E1, ~0.27182817E1, ~0.27182817E1): 0.4670774E1 0.4670774E1 (~0.27182817E1, ~0.27182817E1, ~0.123E1): 0.61590557E1 0.61590557E1 (~0.27182817E1, ~0.27182817E1, ~0.123): 0.72660556E1 0.72660556E1 (~0.27182817E1, ~0.27182817E1, ~0.123E~2): 0.73878255E1 0.73878255E1 (~0.27182817E1, ~0.27182817E1, ~0.11754944E~37): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, ~0.5877472E~38): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, ~0.1E~44): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.27182817E1, ~0.0): 0.73890557E1 0.73890557E1 (~0.27182817E1, ~0.123E1, 0.123E4): 0.12333435E4 0.12333435E4 (~0.27182817E1, ~0.123E1, 0.123E2): 0.15643487E2 0.15643487E2 (~0.27182817E1, ~0.123E1, 0.31415927E1): 0.64850793E1 0.64850793E1 (~0.27182817E1, ~0.123E1, 0.27182817E1): 0.60617685E1 0.60617685E1 (~0.27182817E1, ~0.123E1, 0.123E1): 0.4573487E1 0.4573487E1 (~0.27182817E1, ~0.123E1, 0.123): 0.34664867E1 0.34664867E1 (~0.27182817E1, ~0.123E1, 0.123E~2): 0.33447165E1 0.33447165E1 (~0.27182817E1, ~0.123E1, 0.11754944E~37): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, 0.5877472E~38): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, 0.1E~44): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, 0.0): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, ~0.123E4): ~0.12266565E4 ~0.12266565E4 (~0.27182817E1, ~0.123E1, ~0.123E2): ~0.8956513E1 ~0.8956513E1 (~0.27182817E1, ~0.123E1, ~0.31415927E1): 0.20189385 0.20189385 (~0.27182817E1, ~0.123E1, ~0.27182817E1): 0.62520486 0.62520486 (~0.27182817E1, ~0.123E1, ~0.123E1): 0.21134865E1 0.21134865E1 (~0.27182817E1, ~0.123E1, ~0.123): 0.32204866E1 0.32204866E1 (~0.27182817E1, ~0.123E1, ~0.123E~2): 0.33422565E1 0.33422565E1 (~0.27182817E1, ~0.123E1, ~0.11754944E~37): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, ~0.5877472E~38): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, ~0.1E~44): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123E1, ~0.0): 0.33434865E1 0.33434865E1 (~0.27182817E1, ~0.123, 0.123E4): 0.12303344E4 0.12303344E4 (~0.27182817E1, ~0.123, 0.123E2): 0.12634349E2 0.12634349E2 (~0.27182817E1, ~0.123, 0.31415927E1): 0.34759414E1 0.34759414E1 (~0.27182817E1, ~0.123, 0.27182817E1): 0.30526304E1 0.30526304E1 (~0.27182817E1, ~0.123, 0.123E1): 0.15643487E1 0.15643487E1 (~0.27182817E1, ~0.123, 0.123): 0.45734867 0.45734867 (~0.27182817E1, ~0.123, 0.123E~2): 0.33557865 0.33557865 (~0.27182817E1, ~0.123, 0.11754944E~37): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, 0.5877472E~38): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, 0.1E~44): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, 0.0): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, ~0.123E4): ~0.12296656E4 ~0.12296656E4 (~0.27182817E1, ~0.123, ~0.123E2): ~0.119656515E2 ~0.119656515E2 (~0.27182817E1, ~0.123, ~0.31415927E1): ~0.2807244E1 ~0.2807244E1 (~0.27182817E1, ~0.123, ~0.27182817E1): ~0.2383933E1 ~0.2383933E1 (~0.27182817E1, ~0.123, ~0.123E1): ~0.89565134 ~0.89565134 (~0.27182817E1, ~0.123, ~0.123): 0.21134867 0.21134867 (~0.27182817E1, ~0.123, ~0.123E~2): 0.33311868 0.33311868 (~0.27182817E1, ~0.123, ~0.11754944E~37): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, ~0.5877472E~38): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, ~0.1E~44): 0.33434868 0.33434868 (~0.27182817E1, ~0.123, ~0.0): 0.33434868 0.33434868 (~0.27182817E1, ~0.123E~2, 0.123E4): 0.12300033E4 0.12300033E4 (~0.27182817E1, ~0.123E~2, 0.123E2): 0.12303344E2 0.12303344E2 (~0.27182817E1, ~0.123E~2, 0.31415927E1): 0.31449363E1 0.31449363E1 (~0.27182817E1, ~0.123E~2, 0.27182817E1): 0.27216253E1 0.27216253E1 (~0.27182817E1, ~0.123E~2, 0.123E1): 0.12333435E1 0.12333435E1 (~0.27182817E1, ~0.123E~2, 0.123): 0.12634349 0.12634349 (~0.27182817E1, ~0.123E~2, 0.123E~2): 0.45734867E~2 0.45734867E~2 (~0.27182817E1, ~0.123E~2, 0.11754944E~37): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, 0.5877472E~38): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, 0.1E~44): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, 0.0): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, ~0.123E4): ~0.12299967E4 ~0.12299967E4 (~0.27182817E1, ~0.123E~2, ~0.123E2): ~0.12296657E2 ~0.12296657E2 (~0.27182817E1, ~0.123E~2, ~0.31415927E1): ~0.31382492E1 ~0.31382492E1 (~0.27182817E1, ~0.123E~2, ~0.27182817E1): ~0.27149382E1 ~0.27149382E1 (~0.27182817E1, ~0.123E~2, ~0.123E1): ~0.12266566E1 ~0.12266566E1 (~0.27182817E1, ~0.123E~2, ~0.123): ~0.11965652 ~0.11965652 (~0.27182817E1, ~0.123E~2, ~0.123E~2): 0.21134866E~2 0.21134866E~2 (~0.27182817E1, ~0.123E~2, ~0.11754944E~37): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, ~0.5877472E~38): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, ~0.1E~44): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.123E~2, ~0.0): 0.33434867E~2 0.33434867E~2 (~0.27182817E1, ~0.11754944E~37, 0.1E~44): 0.31953248E~37 0.31953248E~37 (~0.27182817E1, ~0.11754944E~37, ~0.1E~44): 0.31953248E~37 0.31953248E~37 (~0.27182817E1, ~0.1E~44, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (~0.27182817E1, ~0.1E~44, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (~0.27182817E1, ~0.1E~44, 0.1E~44): 0.6E~44 0.6E~44 (~0.27182817E1, ~0.1E~44, 0.0): 0.4E~44 0.4E~44 (~0.27182817E1, ~0.1E~44, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (~0.27182817E1, ~0.1E~44, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (~0.27182817E1, ~0.1E~44, ~0.1E~44): 0.3E~44 0.3E~44 (~0.27182817E1, ~0.1E~44, ~0.0): 0.4E~44 0.4E~44 (~0.123E1, 0.34028235E39, 0.34028235E39): ~0.78264946E38 ~0.78264946E38 (~0.123E1, 0.34028235E39, 0.17014117E39): ~0.24840611E39 ~0.24840611E39 (~0.123E1, 0.34028235E39, 0.123E4): ~inf ~inf (~0.123E1, 0.34028235E39, 0.123E2): ~inf ~inf (~0.123E1, 0.34028235E39, 0.31415927E1): ~inf ~inf (~0.123E1, 0.34028235E39, 0.27182817E1): ~inf ~inf (~0.123E1, 0.34028235E39, 0.123E1): ~inf ~inf (~0.123E1, 0.34028235E39, 0.123): ~inf ~inf (~0.123E1, 0.34028235E39, 0.123E~2): ~inf ~inf (~0.123E1, 0.34028235E39, 0.11754944E~37): ~inf ~inf (~0.123E1, 0.34028235E39, 0.5877472E~38): ~inf ~inf (~0.123E1, 0.34028235E39, 0.1E~44): ~inf ~inf (~0.123E1, 0.34028235E39, 0.0): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.17014117E39): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.123E4): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.123E2): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.31415927E1): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.27182817E1): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.123E1): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.123): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.123E~2): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.11754944E~37): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.5877472E~38): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.1E~44): ~inf ~inf (~0.123E1, 0.34028235E39, ~0.0): ~inf ~inf (~0.123E1, 0.17014117E39, 0.34028235E39): 0.1310087E39 0.1310087E39 (~0.123E1, 0.17014117E39, 0.17014117E39): ~0.39132473E38 ~0.39132473E38 (~0.123E1, 0.17014117E39, 0.123E4): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.123E2): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.31415927E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.27182817E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.123E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.123): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.123E~2): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.1E~44): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, 0.0): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.123E1, 0.17014117E39, ~0.17014117E39): ~inf ~inf (~0.123E1, 0.17014117E39, ~0.123E4): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.123E2): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.31415927E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.27182817E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.123E1): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.123): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.123E~2): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.11754944E~37): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.5877472E~38): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.1E~44): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.17014117E39, ~0.0): ~0.20927364E39 ~0.20927364E39 (~0.123E1, 0.123E4, 0.123E4): ~0.28290002E3 ~0.28290002E3 (~0.123E1, 0.123E4, 0.123E2): ~0.15006E4 ~0.15006E4 (~0.123E1, 0.123E4, 0.31415927E1): ~0.15097584E4 ~0.15097584E4 (~0.123E1, 0.123E4, 0.27182817E1): ~0.15101818E4 ~0.15101818E4 (~0.123E1, 0.123E4, 0.123E1): ~0.151167E4 ~0.151167E4 (~0.123E1, 0.123E4, 0.123): ~0.1512777E4 ~0.1512777E4 (~0.123E1, 0.123E4, 0.123E~2): ~0.15128988E4 ~0.15128988E4 (~0.123E1, 0.123E4, 0.11754944E~37): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.5877472E~38): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.1E~44): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.0): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.123E4): ~0.27429E4 ~0.27429E4 (~0.123E1, 0.123E4, ~0.123E2): ~0.15252001E4 ~0.15252001E4 (~0.123E1, 0.123E4, ~0.31415927E1): ~0.15160416E4 ~0.15160416E4 (~0.123E1, 0.123E4, ~0.27182817E1): ~0.15156183E4 ~0.15156183E4 (~0.123E1, 0.123E4, ~0.123E1): ~0.151413E4 ~0.151413E4 (~0.123E1, 0.123E4, ~0.123): ~0.15130231E4 ~0.15130231E4 (~0.123E1, 0.123E4, ~0.123E~2): ~0.15129012E4 ~0.15129012E4 (~0.123E1, 0.123E4, ~0.11754944E~37): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.5877472E~38): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.1E~44): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.0): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E2, 0.123E4): 0.1214871E4 0.1214871E4 (~0.123E1, 0.123E2, 0.123E2): ~0.28290002E1 ~0.28290002E1 (~0.123E1, 0.123E2, 0.31415927E1): ~0.11987408E2 ~0.11987408E2 (~0.123E1, 0.123E2, 0.27182817E1): ~0.12410719E2 ~0.12410719E2 (~0.123E1, 0.123E2, 0.123E1): ~0.13899E2 ~0.13899E2 (~0.123E1, 0.123E2, 0.123): ~0.150060005E2 ~0.150060005E2 (~0.123E1, 0.123E2, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (~0.123E1, 0.123E2, 0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, 0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, 0.1E~44): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, 0.0): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (~0.123E1, 0.123E2, ~0.123E2): ~0.27429E2 ~0.27429E2 (~0.123E1, 0.123E2, ~0.31415927E1): ~0.18270594E2 ~0.18270594E2 (~0.123E1, 0.123E2, ~0.27182817E1): ~0.17847282E2 ~0.17847282E2 (~0.123E1, 0.123E2, ~0.123E1): ~0.16359001E2 ~0.16359001E2 (~0.123E1, 0.123E2, ~0.123): ~0.15252001E2 ~0.15252001E2 (~0.123E1, 0.123E2, ~0.123E~2): ~0.15130231E2 ~0.15130231E2 (~0.123E1, 0.123E2, ~0.11754944E~37): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, ~0.5877472E~38): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, ~0.1E~44): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.123E2, ~0.0): ~0.15129001E2 ~0.15129001E2 (~0.123E1, 0.31415927E1, 0.123E4): 0.12261359E4 0.12261359E4 (~0.123E1, 0.31415927E1, 0.123E2): 0.8435841E1 0.8435841E1 (~0.123E1, 0.31415927E1, 0.31415927E1): ~0.72256637 ~0.72256637 (~0.123E1, 0.31415927E1, 0.27182817E1): ~0.11458774E1 ~0.11458774E1 (~0.123E1, 0.31415927E1, 0.123E1): ~0.2634159E1 ~0.2634159E1 (~0.123E1, 0.31415927E1, 0.123): ~0.37411592E1 ~0.37411592E1 (~0.123E1, 0.31415927E1, 0.123E~2): ~0.3862929E1 ~0.3862929E1 (~0.123E1, 0.31415927E1, 0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, 0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, 0.1E~44): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, 0.0): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, ~0.123E4): ~0.12338641E4 ~0.12338641E4 (~0.123E1, 0.31415927E1, ~0.123E2): ~0.1616416E2 ~0.1616416E2 (~0.123E1, 0.31415927E1, ~0.31415927E1): ~0.7005752E1 ~0.7005752E1 (~0.123E1, 0.31415927E1, ~0.27182817E1): ~0.6582441E1 ~0.6582441E1 (~0.123E1, 0.31415927E1, ~0.123E1): ~0.5094159E1 ~0.5094159E1 (~0.123E1, 0.31415927E1, ~0.123): ~0.39871593E1 ~0.39871593E1 (~0.123E1, 0.31415927E1, ~0.123E~2): ~0.3865389E1 ~0.3865389E1 (~0.123E1, 0.31415927E1, ~0.11754944E~37): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, ~0.5877472E~38): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, ~0.1E~44): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.31415927E1, ~0.0): ~0.3864159E1 ~0.3864159E1 (~0.123E1, 0.27182817E1, 0.123E4): 0.12266565E4 0.12266565E4 (~0.123E1, 0.27182817E1, 0.123E2): 0.8956513E1 0.8956513E1 (~0.123E1, 0.27182817E1, 0.31415927E1): ~0.20189385 ~0.20189385 (~0.123E1, 0.27182817E1, 0.27182817E1): ~0.62520486 ~0.62520486 (~0.123E1, 0.27182817E1, 0.123E1): ~0.21134865E1 ~0.21134865E1 (~0.123E1, 0.27182817E1, 0.123): ~0.32204866E1 ~0.32204866E1 (~0.123E1, 0.27182817E1, 0.123E~2): ~0.33422565E1 ~0.33422565E1 (~0.123E1, 0.27182817E1, 0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, 0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, 0.1E~44): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, 0.0): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, ~0.123E4): ~0.12333435E4 ~0.12333435E4 (~0.123E1, 0.27182817E1, ~0.123E2): ~0.15643487E2 ~0.15643487E2 (~0.123E1, 0.27182817E1, ~0.31415927E1): ~0.64850793E1 ~0.64850793E1 (~0.123E1, 0.27182817E1, ~0.27182817E1): ~0.60617685E1 ~0.60617685E1 (~0.123E1, 0.27182817E1, ~0.123E1): ~0.4573487E1 ~0.4573487E1 (~0.123E1, 0.27182817E1, ~0.123): ~0.34664867E1 ~0.34664867E1 (~0.123E1, 0.27182817E1, ~0.123E~2): ~0.33447165E1 ~0.33447165E1 (~0.123E1, 0.27182817E1, ~0.11754944E~37): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, ~0.5877472E~38): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, ~0.1E~44): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.27182817E1, ~0.0): ~0.33434865E1 ~0.33434865E1 (~0.123E1, 0.123E1, 0.123E4): 0.1228487E4 0.1228487E4 (~0.123E1, 0.123E1, 0.123E2): 0.107871E2 0.107871E2 (~0.123E1, 0.123E1, 0.31415927E1): 0.16286927E1 0.16286927E1 (~0.123E1, 0.123E1, 0.27182817E1): 0.12053818E1 0.12053818E1 (~0.123E1, 0.123E1, 0.123E1): ~0.28290004 ~0.28290004 (~0.123E1, 0.123E1, 0.123): ~0.13899001E1 ~0.13899001E1 (~0.123E1, 0.123E1, 0.123E~2): ~0.151167E1 ~0.151167E1 (~0.123E1, 0.123E1, 0.11754944E~37): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.5877472E~38): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.1E~44): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.0): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (~0.123E1, 0.123E1, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (~0.123E1, 0.123E1, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (~0.123E1, 0.123E1, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (~0.123E1, 0.123E1, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E1, 0.123E1, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123E1, 0.123E1, ~0.11754944E~37): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.5877472E~38): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.1E~44): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.0): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123, 0.123E4): 0.12298488E4 0.12298488E4 (~0.123E1, 0.123, 0.123E2): 0.1214871E2 0.1214871E2 (~0.123E1, 0.123, 0.31415927E1): 0.29903028E1 0.29903028E1 (~0.123E1, 0.123, 0.27182817E1): 0.25669918E1 0.25669918E1 (~0.123E1, 0.123, 0.123E1): 0.107871E1 0.107871E1 (~0.123E1, 0.123, 0.123): ~0.28290004E~1 ~0.28290004E~1 (~0.123E1, 0.123, 0.123E~2): ~0.15006001 ~0.15006001 (~0.123E1, 0.123, 0.11754944E~37): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.5877472E~38): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.1E~44): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.0): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.123E4): ~0.12301512E4 ~0.12301512E4 (~0.123E1, 0.123, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (~0.123E1, 0.123, ~0.31415927E1): ~0.32928827E1 ~0.32928827E1 (~0.123E1, 0.123, ~0.27182817E1): ~0.28695717E1 ~0.28695717E1 (~0.123E1, 0.123, ~0.123E1): ~0.13812901E1 ~0.13812901E1 (~0.123E1, 0.123, ~0.123): ~0.27429 ~0.27429 (~0.123E1, 0.123, ~0.123E~2): ~0.15252 ~0.15252 (~0.123E1, 0.123, ~0.11754944E~37): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.5877472E~38): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.1E~44): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.0): ~0.15129 ~0.15129 (~0.123E1, 0.123E~2, 0.123E4): 0.12299985E4 0.12299985E4 (~0.123E1, 0.123E~2, 0.123E2): 0.12298488E2 0.12298488E2 (~0.123E1, 0.123E~2, 0.31415927E1): 0.31400797E1 0.31400797E1 (~0.123E1, 0.123E~2, 0.27182817E1): 0.27167687E1 0.27167687E1 (~0.123E1, 0.123E~2, 0.123E1): 0.12284871E1 0.12284871E1 (~0.123E1, 0.123E~2, 0.123): 0.1214871 0.1214871 (~0.123E1, 0.123E~2, 0.123E~2): ~0.28290003E~3 ~0.28290003E~3 (~0.123E1, 0.123E~2, 0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, 0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, 0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, 0.0): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, ~0.123E4): ~0.12300015E4 ~0.12300015E4 (~0.123E1, 0.123E~2, ~0.123E2): ~0.12301513E2 ~0.12301513E2 (~0.123E1, 0.123E~2, ~0.31415927E1): ~0.31431057E1 ~0.31431057E1 (~0.123E1, 0.123E~2, ~0.27182817E1): ~0.27197948E1 ~0.27197948E1 (~0.123E1, 0.123E~2, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (~0.123E1, 0.123E~2, ~0.123): ~0.1245129 ~0.1245129 (~0.123E1, 0.123E~2, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (~0.123E1, 0.123E~2, ~0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, ~0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, ~0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.123E~2, ~0.0): ~0.15129001E~2 ~0.15129001E~2 (~0.123E1, 0.1E~44, 0.11754944E~37): 0.11754942E~37 0.11754942E~37 (~0.123E1, 0.1E~44, 0.5877472E~38): 0.587747E~38 0.587747E~38 (~0.123E1, 0.1E~44, 0.1E~44): ~0.0 ~0.0 (~0.123E1, 0.1E~44, 0.0): ~0.1E~44 ~0.1E~44 (~0.123E1, 0.1E~44, ~0.11754944E~37): ~0.11754945E~37 ~0.11754945E~37 (~0.123E1, 0.1E~44, ~0.5877472E~38): ~0.5877473E~38 ~0.5877473E~38 (~0.123E1, 0.1E~44, ~0.1E~44): ~0.3E~44 ~0.3E~44 (~0.123E1, 0.1E~44, ~0.0): ~0.1E~44 ~0.1E~44 (~0.123E1, ~0.34028235E39, 0.34028235E39): inf inf (~0.123E1, ~0.34028235E39, 0.17014117E39): inf inf (~0.123E1, ~0.34028235E39, 0.123E4): inf inf (~0.123E1, ~0.34028235E39, 0.123E2): inf inf (~0.123E1, ~0.34028235E39, 0.31415927E1): inf inf (~0.123E1, ~0.34028235E39, 0.27182817E1): inf inf (~0.123E1, ~0.34028235E39, 0.123E1): inf inf (~0.123E1, ~0.34028235E39, 0.123): inf inf (~0.123E1, ~0.34028235E39, 0.123E~2): inf inf (~0.123E1, ~0.34028235E39, 0.11754944E~37): inf inf (~0.123E1, ~0.34028235E39, 0.5877472E~38): inf inf (~0.123E1, ~0.34028235E39, 0.1E~44): inf inf (~0.123E1, ~0.34028235E39, 0.0): inf inf (~0.123E1, ~0.34028235E39, ~0.34028235E39): 0.78264946E38 0.78264946E38 (~0.123E1, ~0.34028235E39, ~0.17014117E39): 0.24840611E39 0.24840611E39 (~0.123E1, ~0.34028235E39, ~0.123E4): inf inf (~0.123E1, ~0.34028235E39, ~0.123E2): inf inf (~0.123E1, ~0.34028235E39, ~0.31415927E1): inf inf (~0.123E1, ~0.34028235E39, ~0.27182817E1): inf inf (~0.123E1, ~0.34028235E39, ~0.123E1): inf inf (~0.123E1, ~0.34028235E39, ~0.123): inf inf (~0.123E1, ~0.34028235E39, ~0.123E~2): inf inf (~0.123E1, ~0.34028235E39, ~0.11754944E~37): inf inf (~0.123E1, ~0.34028235E39, ~0.5877472E~38): inf inf (~0.123E1, ~0.34028235E39, ~0.1E~44): inf inf (~0.123E1, ~0.34028235E39, ~0.0): inf inf (~0.123E1, ~0.17014117E39, 0.34028235E39): inf inf (~0.123E1, ~0.17014117E39, 0.17014117E39): inf inf (~0.123E1, ~0.17014117E39, 0.123E4): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.123E2): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.31415927E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.27182817E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.123E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.123): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.123E~2): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.11754944E~37): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.5877472E~38): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.1E~44): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, 0.0): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.34028235E39): ~0.1310087E39 ~0.1310087E39 (~0.123E1, ~0.17014117E39, ~0.17014117E39): 0.39132473E38 0.39132473E38 (~0.123E1, ~0.17014117E39, ~0.123E4): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.123E2): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.31415927E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.27182817E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.123E1): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.123): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.123E~2): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.11754944E~37): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.5877472E~38): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.1E~44): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.17014117E39, ~0.0): 0.20927364E39 0.20927364E39 (~0.123E1, ~0.123E4, 0.123E4): 0.27429E4 0.27429E4 (~0.123E1, ~0.123E4, 0.123E2): 0.15252001E4 0.15252001E4 (~0.123E1, ~0.123E4, 0.31415927E1): 0.15160416E4 0.15160416E4 (~0.123E1, ~0.123E4, 0.27182817E1): 0.15156183E4 0.15156183E4 (~0.123E1, ~0.123E4, 0.123E1): 0.151413E4 0.151413E4 (~0.123E1, ~0.123E4, 0.123): 0.15130231E4 0.15130231E4 (~0.123E1, ~0.123E4, 0.123E~2): 0.15129012E4 0.15129012E4 (~0.123E1, ~0.123E4, 0.11754944E~37): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.5877472E~38): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.1E~44): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.0): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.123E4): 0.28290002E3 0.28290002E3 (~0.123E1, ~0.123E4, ~0.123E2): 0.15006E4 0.15006E4 (~0.123E1, ~0.123E4, ~0.31415927E1): 0.15097584E4 0.15097584E4 (~0.123E1, ~0.123E4, ~0.27182817E1): 0.15101818E4 0.15101818E4 (~0.123E1, ~0.123E4, ~0.123E1): 0.151167E4 0.151167E4 (~0.123E1, ~0.123E4, ~0.123): 0.1512777E4 0.1512777E4 (~0.123E1, ~0.123E4, ~0.123E~2): 0.15128988E4 0.15128988E4 (~0.123E1, ~0.123E4, ~0.11754944E~37): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.5877472E~38): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.1E~44): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.0): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E2, 0.123E4): 0.1245129E4 0.1245129E4 (~0.123E1, ~0.123E2, 0.123E2): 0.27429E2 0.27429E2 (~0.123E1, ~0.123E2, 0.31415927E1): 0.18270594E2 0.18270594E2 (~0.123E1, ~0.123E2, 0.27182817E1): 0.17847282E2 0.17847282E2 (~0.123E1, ~0.123E2, 0.123E1): 0.16359001E2 0.16359001E2 (~0.123E1, ~0.123E2, 0.123): 0.15252001E2 0.15252001E2 (~0.123E1, ~0.123E2, 0.123E~2): 0.15130231E2 0.15130231E2 (~0.123E1, ~0.123E2, 0.11754944E~37): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, 0.5877472E~38): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, 0.1E~44): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, 0.0): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (~0.123E1, ~0.123E2, ~0.123E2): 0.28290002E1 0.28290002E1 (~0.123E1, ~0.123E2, ~0.31415927E1): 0.11987408E2 0.11987408E2 (~0.123E1, ~0.123E2, ~0.27182817E1): 0.12410719E2 0.12410719E2 (~0.123E1, ~0.123E2, ~0.123E1): 0.13899E2 0.13899E2 (~0.123E1, ~0.123E2, ~0.123): 0.150060005E2 0.150060005E2 (~0.123E1, ~0.123E2, ~0.123E~2): 0.1512777E2 0.1512777E2 (~0.123E1, ~0.123E2, ~0.11754944E~37): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, ~0.5877472E~38): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, ~0.1E~44): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.123E2, ~0.0): 0.15129001E2 0.15129001E2 (~0.123E1, ~0.31415927E1, 0.123E4): 0.12338641E4 0.12338641E4 (~0.123E1, ~0.31415927E1, 0.123E2): 0.1616416E2 0.1616416E2 (~0.123E1, ~0.31415927E1, 0.31415927E1): 0.7005752E1 0.7005752E1 (~0.123E1, ~0.31415927E1, 0.27182817E1): 0.6582441E1 0.6582441E1 (~0.123E1, ~0.31415927E1, 0.123E1): 0.5094159E1 0.5094159E1 (~0.123E1, ~0.31415927E1, 0.123): 0.39871593E1 0.39871593E1 (~0.123E1, ~0.31415927E1, 0.123E~2): 0.3865389E1 0.3865389E1 (~0.123E1, ~0.31415927E1, 0.11754944E~37): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, 0.5877472E~38): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, 0.1E~44): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, 0.0): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, ~0.123E4): ~0.12261359E4 ~0.12261359E4 (~0.123E1, ~0.31415927E1, ~0.123E2): ~0.8435841E1 ~0.8435841E1 (~0.123E1, ~0.31415927E1, ~0.31415927E1): 0.72256637 0.72256637 (~0.123E1, ~0.31415927E1, ~0.27182817E1): 0.11458774E1 0.11458774E1 (~0.123E1, ~0.31415927E1, ~0.123E1): 0.2634159E1 0.2634159E1 (~0.123E1, ~0.31415927E1, ~0.123): 0.37411592E1 0.37411592E1 (~0.123E1, ~0.31415927E1, ~0.123E~2): 0.3862929E1 0.3862929E1 (~0.123E1, ~0.31415927E1, ~0.11754944E~37): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, ~0.5877472E~38): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, ~0.1E~44): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.31415927E1, ~0.0): 0.3864159E1 0.3864159E1 (~0.123E1, ~0.27182817E1, 0.123E4): 0.12333435E4 0.12333435E4 (~0.123E1, ~0.27182817E1, 0.123E2): 0.15643487E2 0.15643487E2 (~0.123E1, ~0.27182817E1, 0.31415927E1): 0.64850793E1 0.64850793E1 (~0.123E1, ~0.27182817E1, 0.27182817E1): 0.60617685E1 0.60617685E1 (~0.123E1, ~0.27182817E1, 0.123E1): 0.4573487E1 0.4573487E1 (~0.123E1, ~0.27182817E1, 0.123): 0.34664867E1 0.34664867E1 (~0.123E1, ~0.27182817E1, 0.123E~2): 0.33447165E1 0.33447165E1 (~0.123E1, ~0.27182817E1, 0.11754944E~37): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, 0.5877472E~38): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, 0.1E~44): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, 0.0): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, ~0.123E4): ~0.12266565E4 ~0.12266565E4 (~0.123E1, ~0.27182817E1, ~0.123E2): ~0.8956513E1 ~0.8956513E1 (~0.123E1, ~0.27182817E1, ~0.31415927E1): 0.20189385 0.20189385 (~0.123E1, ~0.27182817E1, ~0.27182817E1): 0.62520486 0.62520486 (~0.123E1, ~0.27182817E1, ~0.123E1): 0.21134865E1 0.21134865E1 (~0.123E1, ~0.27182817E1, ~0.123): 0.32204866E1 0.32204866E1 (~0.123E1, ~0.27182817E1, ~0.123E~2): 0.33422565E1 0.33422565E1 (~0.123E1, ~0.27182817E1, ~0.11754944E~37): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, ~0.5877472E~38): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, ~0.1E~44): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.27182817E1, ~0.0): 0.33434865E1 0.33434865E1 (~0.123E1, ~0.123E1, 0.123E4): 0.1231513E4 0.1231513E4 (~0.123E1, ~0.123E1, 0.123E2): 0.13812901E2 0.13812901E2 (~0.123E1, ~0.123E1, 0.31415927E1): 0.4654493E1 0.4654493E1 (~0.123E1, ~0.123E1, 0.27182817E1): 0.42311816E1 0.42311816E1 (~0.123E1, ~0.123E1, 0.123E1): 0.27429001E1 0.27429001E1 (~0.123E1, ~0.123E1, 0.123): 0.16359E1 0.16359E1 (~0.123E1, ~0.123E1, 0.123E~2): 0.151413E1 0.151413E1 (~0.123E1, ~0.123E1, 0.11754944E~37): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.5877472E~38): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.1E~44): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.0): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (~0.123E1, ~0.123E1, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E1, ~0.123E1, ~0.31415927E1): ~0.16286927E1 ~0.16286927E1 (~0.123E1, ~0.123E1, ~0.27182817E1): ~0.12053818E1 ~0.12053818E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.28290004 0.28290004 (~0.123E1, ~0.123E1, ~0.123): 0.13899001E1 0.13899001E1 (~0.123E1, ~0.123E1, ~0.123E~2): 0.151167E1 0.151167E1 (~0.123E1, ~0.123E1, ~0.11754944E~37): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.5877472E~38): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.1E~44): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.0): 0.15129E1 0.15129E1 (~0.123E1, ~0.123, 0.123E4): 0.12301512E4 0.12301512E4 (~0.123E1, ~0.123, 0.123E2): 0.1245129E2 0.1245129E2 (~0.123E1, ~0.123, 0.31415927E1): 0.32928827E1 0.32928827E1 (~0.123E1, ~0.123, 0.27182817E1): 0.28695717E1 0.28695717E1 (~0.123E1, ~0.123, 0.123E1): 0.13812901E1 0.13812901E1 (~0.123E1, ~0.123, 0.123): 0.27429 0.27429 (~0.123E1, ~0.123, 0.123E~2): 0.15252 0.15252 (~0.123E1, ~0.123, 0.11754944E~37): 0.15129 0.15129 (~0.123E1, ~0.123, 0.5877472E~38): 0.15129 0.15129 (~0.123E1, ~0.123, 0.1E~44): 0.15129 0.15129 (~0.123E1, ~0.123, 0.0): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.123E4): ~0.12298488E4 ~0.12298488E4 (~0.123E1, ~0.123, ~0.123E2): ~0.1214871E2 ~0.1214871E2 (~0.123E1, ~0.123, ~0.31415927E1): ~0.29903028E1 ~0.29903028E1 (~0.123E1, ~0.123, ~0.27182817E1): ~0.25669918E1 ~0.25669918E1 (~0.123E1, ~0.123, ~0.123E1): ~0.107871E1 ~0.107871E1 (~0.123E1, ~0.123, ~0.123): 0.28290004E~1 0.28290004E~1 (~0.123E1, ~0.123, ~0.123E~2): 0.15006001 0.15006001 (~0.123E1, ~0.123, ~0.11754944E~37): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.5877472E~38): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.1E~44): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.0): 0.15129 0.15129 (~0.123E1, ~0.123E~2, 0.123E4): 0.12300015E4 0.12300015E4 (~0.123E1, ~0.123E~2, 0.123E2): 0.12301513E2 0.12301513E2 (~0.123E1, ~0.123E~2, 0.31415927E1): 0.31431057E1 0.31431057E1 (~0.123E1, ~0.123E~2, 0.27182817E1): 0.27197948E1 0.27197948E1 (~0.123E1, ~0.123E~2, 0.123E1): 0.12315129E1 0.12315129E1 (~0.123E1, ~0.123E~2, 0.123): 0.1245129 0.1245129 (~0.123E1, ~0.123E~2, 0.123E~2): 0.27429E~2 0.27429E~2 (~0.123E1, ~0.123E~2, 0.11754944E~37): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, 0.5877472E~38): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, 0.1E~44): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, 0.0): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, ~0.123E4): ~0.12299985E4 ~0.12299985E4 (~0.123E1, ~0.123E~2, ~0.123E2): ~0.12298488E2 ~0.12298488E2 (~0.123E1, ~0.123E~2, ~0.31415927E1): ~0.31400797E1 ~0.31400797E1 (~0.123E1, ~0.123E~2, ~0.27182817E1): ~0.27167687E1 ~0.27167687E1 (~0.123E1, ~0.123E~2, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (~0.123E1, ~0.123E~2, ~0.123): ~0.1214871 ~0.1214871 (~0.123E1, ~0.123E~2, ~0.123E~2): 0.28290003E~3 0.28290003E~3 (~0.123E1, ~0.123E~2, ~0.11754944E~37): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, ~0.5877472E~38): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, ~0.1E~44): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.123E~2, ~0.0): 0.15129001E~2 0.15129001E~2 (~0.123E1, ~0.1E~44, 0.11754944E~37): 0.11754945E~37 0.11754945E~37 (~0.123E1, ~0.1E~44, 0.5877472E~38): 0.5877473E~38 0.5877473E~38 (~0.123E1, ~0.1E~44, 0.1E~44): 0.3E~44 0.3E~44 (~0.123E1, ~0.1E~44, 0.0): 0.1E~44 0.1E~44 (~0.123E1, ~0.1E~44, ~0.11754944E~37): ~0.11754942E~37 ~0.11754942E~37 (~0.123E1, ~0.1E~44, ~0.5877472E~38): ~0.587747E~38 ~0.587747E~38 (~0.123E1, ~0.1E~44, ~0.1E~44): 0.0 0.0 (~0.123E1, ~0.1E~44, ~0.0): 0.1E~44 0.1E~44 (~0.123, 0.34028235E39, 0.34028235E39): 0.2984276E39 0.2984276E39 (~0.123, 0.34028235E39, 0.17014117E39): 0.12828644E39 0.12828644E39 (~0.123, 0.34028235E39, 0.123E4): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.123E2): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.31415927E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.27182817E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.123E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.123): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.123E~2): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.1E~44): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, 0.0): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.123, 0.34028235E39, ~0.17014117E39): ~0.2119959E39 ~0.2119959E39 (~0.123, 0.34028235E39, ~0.123E4): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.123E2): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.31415927E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.27182817E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.123E1): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.123): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.123E~2): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.11754944E~37): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.5877472E~38): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.1E~44): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.34028235E39, ~0.0): ~0.4185473E38 ~0.4185473E38 (~0.123, 0.17014117E39, 0.34028235E39): 0.31935498E39 0.31935498E39 (~0.123, 0.17014117E39, 0.17014117E39): 0.1492138E39 0.1492138E39 (~0.123, 0.17014117E39, 0.123E4): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.123E2): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.31415927E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.27182817E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.123E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.123): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.123E~2): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.1E~44): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, 0.0): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.123, 0.17014117E39, ~0.17014117E39): ~0.19106853E39 ~0.19106853E39 (~0.123, 0.17014117E39, ~0.123E4): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.123E2): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.31415927E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.27182817E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.123E1): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.123): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.123E~2): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.11754944E~37): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.5877472E~38): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.1E~44): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.17014117E39, ~0.0): ~0.20927365E38 ~0.20927365E38 (~0.123, 0.123E4, 0.123E4): 0.107871E4 0.107871E4 (~0.123, 0.123E4, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123, 0.123E4, 0.31415927E1): ~0.1481484E3 ~0.1481484E3 (~0.123, 0.123E4, 0.27182817E1): ~0.14857172E3 ~0.14857172E3 (~0.123, 0.123E4, 0.123E1): ~0.15006E3 ~0.15006E3 (~0.123, 0.123E4, 0.123): ~0.151167E3 ~0.151167E3 (~0.123, 0.123E4, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (~0.123, 0.123E4, 0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, 0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, 0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, 0.0): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123, 0.123E4, ~0.123E2): ~0.16359001E3 ~0.16359001E3 (~0.123, 0.123E4, ~0.31415927E1): ~0.1544316E3 ~0.1544316E3 (~0.123, 0.123E4, ~0.27182817E1): ~0.15400829E3 ~0.15400829E3 (~0.123, 0.123E4, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123, 0.123E4, ~0.123): ~0.15141301E3 ~0.15141301E3 (~0.123, 0.123E4, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (~0.123, 0.123E4, ~0.11754944E~37): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, ~0.5877472E~38): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, ~0.1E~44): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E4, ~0.0): ~0.15129001E3 ~0.15129001E3 (~0.123, 0.123E2, 0.123E4): 0.1228487E4 0.1228487E4 (~0.123, 0.123E2, 0.123E2): 0.107871E2 0.107871E2 (~0.123, 0.123E2, 0.31415927E1): 0.16286926E1 0.16286926E1 (~0.123, 0.123E2, 0.27182817E1): 0.12053816E1 0.12053816E1 (~0.123, 0.123E2, 0.123E1): ~0.28290004 ~0.28290004 (~0.123, 0.123E2, 0.123): ~0.13899001E1 ~0.13899001E1 (~0.123, 0.123E2, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (~0.123, 0.123E2, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, 0.0): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (~0.123, 0.123E2, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (~0.123, 0.123E2, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (~0.123, 0.123E2, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (~0.123, 0.123E2, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (~0.123, 0.123E2, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123, 0.123E2, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (~0.123, 0.123E2, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.123E2, ~0.0): ~0.15129001E1 ~0.15129001E1 (~0.123, 0.31415927E1, 0.123E4): 0.12296135E4 0.12296135E4 (~0.123, 0.31415927E1, 0.123E2): 0.11913585E2 0.11913585E2 (~0.123, 0.31415927E1, 0.31415927E1): 0.27551768E1 0.27551768E1 (~0.123, 0.31415927E1, 0.27182817E1): 0.23318658E1 0.23318658E1 (~0.123, 0.31415927E1, 0.123E1): 0.8435841 0.8435841 (~0.123, 0.31415927E1, 0.123): ~0.2634159 ~0.2634159 (~0.123, 0.31415927E1, 0.123E~2): ~0.38518593 ~0.38518593 (~0.123, 0.31415927E1, 0.11754944E~37): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, 0.5877472E~38): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, 0.1E~44): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, 0.0): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, ~0.123E4): ~0.12303865E4 ~0.12303865E4 (~0.123, 0.31415927E1, ~0.123E2): ~0.12686416E2 ~0.12686416E2 (~0.123, 0.31415927E1, ~0.31415927E1): ~0.35280087E1 ~0.35280087E1 (~0.123, 0.31415927E1, ~0.27182817E1): ~0.31046977E1 ~0.31046977E1 (~0.123, 0.31415927E1, ~0.123E1): ~0.1616416E1 ~0.1616416E1 (~0.123, 0.31415927E1, ~0.123): ~0.5094159 ~0.5094159 (~0.123, 0.31415927E1, ~0.123E~2): ~0.38764593 ~0.38764593 (~0.123, 0.31415927E1, ~0.11754944E~37): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, ~0.5877472E~38): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, ~0.1E~44): ~0.38641593 ~0.38641593 (~0.123, 0.31415927E1, ~0.0): ~0.38641593 ~0.38641593 (~0.123, 0.27182817E1, 0.123E4): 0.12296656E4 0.12296656E4 (~0.123, 0.27182817E1, 0.123E2): 0.119656515E2 0.119656515E2 (~0.123, 0.27182817E1, 0.31415927E1): 0.2807244E1 0.2807244E1 (~0.123, 0.27182817E1, 0.27182817E1): 0.2383933E1 0.2383933E1 (~0.123, 0.27182817E1, 0.123E1): 0.89565134 0.89565134 (~0.123, 0.27182817E1, 0.123): ~0.21134867 ~0.21134867 (~0.123, 0.27182817E1, 0.123E~2): ~0.33311868 ~0.33311868 (~0.123, 0.27182817E1, 0.11754944E~37): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, 0.5877472E~38): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, 0.1E~44): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, 0.0): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, ~0.123E4): ~0.12303344E4 ~0.12303344E4 (~0.123, 0.27182817E1, ~0.123E2): ~0.12634349E2 ~0.12634349E2 (~0.123, 0.27182817E1, ~0.31415927E1): ~0.34759414E1 ~0.34759414E1 (~0.123, 0.27182817E1, ~0.27182817E1): ~0.30526304E1 ~0.30526304E1 (~0.123, 0.27182817E1, ~0.123E1): ~0.15643487E1 ~0.15643487E1 (~0.123, 0.27182817E1, ~0.123): ~0.45734867 ~0.45734867 (~0.123, 0.27182817E1, ~0.123E~2): ~0.33557865 ~0.33557865 (~0.123, 0.27182817E1, ~0.11754944E~37): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, ~0.5877472E~38): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, ~0.1E~44): ~0.33434868 ~0.33434868 (~0.123, 0.27182817E1, ~0.0): ~0.33434868 ~0.33434868 (~0.123, 0.123E1, 0.123E4): 0.12298488E4 0.12298488E4 (~0.123, 0.123E1, 0.123E2): 0.1214871E2 0.1214871E2 (~0.123, 0.123E1, 0.31415927E1): 0.29903028E1 0.29903028E1 (~0.123, 0.123E1, 0.27182817E1): 0.25669918E1 0.25669918E1 (~0.123, 0.123E1, 0.123E1): 0.107871E1 0.107871E1 (~0.123, 0.123E1, 0.123): ~0.28290004E~1 ~0.28290004E~1 (~0.123, 0.123E1, 0.123E~2): ~0.15006001 ~0.15006001 (~0.123, 0.123E1, 0.11754944E~37): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.5877472E~38): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.1E~44): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.0): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.123E4): ~0.12301512E4 ~0.12301512E4 (~0.123, 0.123E1, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (~0.123, 0.123E1, ~0.31415927E1): ~0.32928827E1 ~0.32928827E1 (~0.123, 0.123E1, ~0.27182817E1): ~0.28695717E1 ~0.28695717E1 (~0.123, 0.123E1, ~0.123E1): ~0.13812901E1 ~0.13812901E1 (~0.123, 0.123E1, ~0.123): ~0.27429 ~0.27429 (~0.123, 0.123E1, ~0.123E~2): ~0.15252 ~0.15252 (~0.123, 0.123E1, ~0.11754944E~37): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.5877472E~38): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.1E~44): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.0): ~0.15129 ~0.15129 (~0.123, 0.123, 0.123E4): 0.12299849E4 0.12299849E4 (~0.123, 0.123, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123, 0.123, 0.31415927E1): 0.31264637E1 0.31264637E1 (~0.123, 0.123, 0.27182817E1): 0.27031527E1 0.27031527E1 (~0.123, 0.123, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123, 0.123, 0.123): 0.107871 0.107871 (~0.123, 0.123, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (~0.123, 0.123, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, 0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (~0.123, 0.123, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123, 0.123, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (~0.123, 0.123, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (~0.123, 0.123, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123, 0.123, ~0.123): ~0.13812901 ~0.13812901 (~0.123, 0.123, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (~0.123, 0.123, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123, 0.123E~2, 0.123E4): 0.12299999E4 0.12299999E4 (~0.123, 0.123E~2, 0.123E2): 0.12299849E2 0.12299849E2 (~0.123, 0.123E~2, 0.31415927E1): 0.31414413E1 0.31414413E1 (~0.123, 0.123E~2, 0.27182817E1): 0.27181304E1 0.27181304E1 (~0.123, 0.123E~2, 0.123E1): 0.12298487E1 0.12298487E1 (~0.123, 0.123E~2, 0.123): 0.12284871 0.12284871 (~0.123, 0.123E~2, 0.123E~2): 0.10787101E~2 0.10787101E~2 (~0.123, 0.123E~2, 0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.1E~44): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.0): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.123E4): ~0.12300001E4 ~0.12300001E4 (~0.123, 0.123E~2, ~0.123E2): ~0.12300152E2 ~0.12300152E2 (~0.123, 0.123E~2, ~0.31415927E1): ~0.31417441E1 ~0.31417441E1 (~0.123, 0.123E~2, ~0.27182817E1): ~0.27184331E1 ~0.27184331E1 (~0.123, 0.123E~2, ~0.123E1): ~0.12301513E1 ~0.12301513E1 (~0.123, 0.123E~2, ~0.123): ~0.123151295 ~0.123151295 (~0.123, 0.123E~2, ~0.123E~2): ~0.138129E~2 ~0.138129E~2 (~0.123, 0.123E~2, ~0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.1E~44): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.0): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.11754944E~37, 0.11754944E~37): 0.10309085E~37 0.10309085E~37 (~0.123, 0.11754944E~37, 0.5877472E~38): 0.4431613E~38 0.4431613E~38 (~0.123, 0.11754944E~37, 0.1E~44): ~0.1445857E~38 ~0.1445857E~38 (~0.123, 0.11754944E~37, 0.0): ~0.1445858E~38 ~0.1445858E~38 (~0.123, 0.11754944E~37, ~0.11754944E~37): ~0.13200802E~37 ~0.13200802E~37 (~0.123, 0.11754944E~37, ~0.5877472E~38): ~0.732333E~38 ~0.732333E~38 (~0.123, 0.11754944E~37, ~0.1E~44): ~0.144586E~38 ~0.144586E~38 (~0.123, 0.11754944E~37, ~0.0): ~0.1445858E~38 ~0.1445858E~38 (~0.123, 0.5877472E~38, 0.11754944E~37): 0.11032015E~37 0.11032015E~37 (~0.123, 0.5877472E~38, 0.5877472E~38): 0.5154543E~38 0.5154543E~38 (~0.123, 0.5877472E~38, 0.1E~44): ~0.722927E~39 ~0.722927E~39 (~0.123, 0.5877472E~38, 0.0): ~0.722928E~39 ~0.722928E~39 (~0.123, 0.5877472E~38, ~0.11754944E~37): ~0.12477872E~37 ~0.12477872E~37 (~0.123, 0.5877472E~38, ~0.5877472E~38): ~0.66004E~38 ~0.66004E~38 (~0.123, 0.5877472E~38, ~0.1E~44): ~0.72293E~39 ~0.72293E~39 (~0.123, 0.5877472E~38, ~0.0): ~0.722928E~39 ~0.722928E~39 (~0.123, 0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.123, 0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.123, 0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (~0.123, 0.1E~44, 0.0): ~0.0 ~0.0 (~0.123, 0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.123, 0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.123, 0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.123, 0.1E~44, ~0.0): ~0.0 ~0.0 (~0.123, ~0.34028235E39, 0.34028235E39): inf inf (~0.123, ~0.34028235E39, 0.17014117E39): 0.2119959E39 0.2119959E39 (~0.123, ~0.34028235E39, 0.123E4): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.123E2): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.31415927E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.27182817E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.123E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.123): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.123E~2): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.11754944E~37): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.5877472E~38): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.1E~44): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, 0.0): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.34028235E39): ~0.2984276E39 ~0.2984276E39 (~0.123, ~0.34028235E39, ~0.17014117E39): ~0.12828644E39 ~0.12828644E39 (~0.123, ~0.34028235E39, ~0.123E4): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.123E2): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.31415927E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.27182817E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.123E1): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.123): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.123E~2): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.11754944E~37): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.5877472E~38): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.1E~44): 0.4185473E38 0.4185473E38 (~0.123, ~0.34028235E39, ~0.0): 0.4185473E38 0.4185473E38 (~0.123, ~0.17014117E39, 0.34028235E39): inf inf (~0.123, ~0.17014117E39, 0.17014117E39): 0.19106853E39 0.19106853E39 (~0.123, ~0.17014117E39, 0.123E4): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.123E2): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.31415927E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.27182817E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.123E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.123): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.123E~2): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.11754944E~37): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.5877472E~38): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.1E~44): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, 0.0): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.34028235E39): ~0.31935498E39 ~0.31935498E39 (~0.123, ~0.17014117E39, ~0.17014117E39): ~0.1492138E39 ~0.1492138E39 (~0.123, ~0.17014117E39, ~0.123E4): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.123E2): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.31415927E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.27182817E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.123E1): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.123): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.123E~2): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.11754944E~37): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.5877472E~38): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.1E~44): 0.20927365E38 0.20927365E38 (~0.123, ~0.17014117E39, ~0.0): 0.20927365E38 0.20927365E38 (~0.123, ~0.123E4, 0.123E4): 0.138129E4 0.138129E4 (~0.123, ~0.123E4, 0.123E2): 0.16359001E3 0.16359001E3 (~0.123, ~0.123E4, 0.31415927E1): 0.1544316E3 0.1544316E3 (~0.123, ~0.123E4, 0.27182817E1): 0.15400829E3 0.15400829E3 (~0.123, ~0.123E4, 0.123E1): 0.15252E3 0.15252E3 (~0.123, ~0.123E4, 0.123): 0.15141301E3 0.15141301E3 (~0.123, ~0.123E4, 0.123E~2): 0.15129123E3 0.15129123E3 (~0.123, ~0.123E4, 0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, 0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, 0.1E~44): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, 0.0): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123, ~0.123E4, ~0.123E2): 0.13899E3 0.13899E3 (~0.123, ~0.123E4, ~0.31415927E1): 0.1481484E3 0.1481484E3 (~0.123, ~0.123E4, ~0.27182817E1): 0.14857172E3 0.14857172E3 (~0.123, ~0.123E4, ~0.123E1): 0.15006E3 0.15006E3 (~0.123, ~0.123E4, ~0.123): 0.151167E3 0.151167E3 (~0.123, ~0.123E4, ~0.123E~2): 0.15128877E3 0.15128877E3 (~0.123, ~0.123E4, ~0.11754944E~37): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, ~0.5877472E~38): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, ~0.1E~44): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E4, ~0.0): 0.15129001E3 0.15129001E3 (~0.123, ~0.123E2, 0.123E4): 0.1231513E4 0.1231513E4 (~0.123, ~0.123E2, 0.123E2): 0.13812901E2 0.13812901E2 (~0.123, ~0.123E2, 0.31415927E1): 0.4654493E1 0.4654493E1 (~0.123, ~0.123E2, 0.27182817E1): 0.42311816E1 0.42311816E1 (~0.123, ~0.123E2, 0.123E1): 0.27429001E1 0.27429001E1 (~0.123, ~0.123E2, 0.123): 0.16359E1 0.16359E1 (~0.123, ~0.123E2, 0.123E~2): 0.15141301E1 0.15141301E1 (~0.123, ~0.123E2, 0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, 0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, 0.1E~44): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, 0.0): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (~0.123, ~0.123E2, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123, ~0.123E2, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (~0.123, ~0.123E2, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (~0.123, ~0.123E2, ~0.123E1): 0.28290004 0.28290004 (~0.123, ~0.123E2, ~0.123): 0.13899001E1 0.13899001E1 (~0.123, ~0.123E2, ~0.123E~2): 0.15116701E1 0.15116701E1 (~0.123, ~0.123E2, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, ~0.1E~44): 0.15129001E1 0.15129001E1 (~0.123, ~0.123E2, ~0.0): 0.15129001E1 0.15129001E1 (~0.123, ~0.31415927E1, 0.123E4): 0.12303865E4 0.12303865E4 (~0.123, ~0.31415927E1, 0.123E2): 0.12686416E2 0.12686416E2 (~0.123, ~0.31415927E1, 0.31415927E1): 0.35280087E1 0.35280087E1 (~0.123, ~0.31415927E1, 0.27182817E1): 0.31046977E1 0.31046977E1 (~0.123, ~0.31415927E1, 0.123E1): 0.1616416E1 0.1616416E1 (~0.123, ~0.31415927E1, 0.123): 0.5094159 0.5094159 (~0.123, ~0.31415927E1, 0.123E~2): 0.38764593 0.38764593 (~0.123, ~0.31415927E1, 0.11754944E~37): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, 0.5877472E~38): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, 0.1E~44): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, 0.0): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, ~0.123E4): ~0.12296135E4 ~0.12296135E4 (~0.123, ~0.31415927E1, ~0.123E2): ~0.11913585E2 ~0.11913585E2 (~0.123, ~0.31415927E1, ~0.31415927E1): ~0.27551768E1 ~0.27551768E1 (~0.123, ~0.31415927E1, ~0.27182817E1): ~0.23318658E1 ~0.23318658E1 (~0.123, ~0.31415927E1, ~0.123E1): ~0.8435841 ~0.8435841 (~0.123, ~0.31415927E1, ~0.123): 0.2634159 0.2634159 (~0.123, ~0.31415927E1, ~0.123E~2): 0.38518593 0.38518593 (~0.123, ~0.31415927E1, ~0.11754944E~37): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, ~0.5877472E~38): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, ~0.1E~44): 0.38641593 0.38641593 (~0.123, ~0.31415927E1, ~0.0): 0.38641593 0.38641593 (~0.123, ~0.27182817E1, 0.123E4): 0.12303344E4 0.12303344E4 (~0.123, ~0.27182817E1, 0.123E2): 0.12634349E2 0.12634349E2 (~0.123, ~0.27182817E1, 0.31415927E1): 0.34759414E1 0.34759414E1 (~0.123, ~0.27182817E1, 0.27182817E1): 0.30526304E1 0.30526304E1 (~0.123, ~0.27182817E1, 0.123E1): 0.15643487E1 0.15643487E1 (~0.123, ~0.27182817E1, 0.123): 0.45734867 0.45734867 (~0.123, ~0.27182817E1, 0.123E~2): 0.33557865 0.33557865 (~0.123, ~0.27182817E1, 0.11754944E~37): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, 0.5877472E~38): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, 0.1E~44): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, 0.0): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, ~0.123E4): ~0.12296656E4 ~0.12296656E4 (~0.123, ~0.27182817E1, ~0.123E2): ~0.119656515E2 ~0.119656515E2 (~0.123, ~0.27182817E1, ~0.31415927E1): ~0.2807244E1 ~0.2807244E1 (~0.123, ~0.27182817E1, ~0.27182817E1): ~0.2383933E1 ~0.2383933E1 (~0.123, ~0.27182817E1, ~0.123E1): ~0.89565134 ~0.89565134 (~0.123, ~0.27182817E1, ~0.123): 0.21134867 0.21134867 (~0.123, ~0.27182817E1, ~0.123E~2): 0.33311868 0.33311868 (~0.123, ~0.27182817E1, ~0.11754944E~37): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, ~0.5877472E~38): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, ~0.1E~44): 0.33434868 0.33434868 (~0.123, ~0.27182817E1, ~0.0): 0.33434868 0.33434868 (~0.123, ~0.123E1, 0.123E4): 0.12301512E4 0.12301512E4 (~0.123, ~0.123E1, 0.123E2): 0.1245129E2 0.1245129E2 (~0.123, ~0.123E1, 0.31415927E1): 0.32928827E1 0.32928827E1 (~0.123, ~0.123E1, 0.27182817E1): 0.28695717E1 0.28695717E1 (~0.123, ~0.123E1, 0.123E1): 0.13812901E1 0.13812901E1 (~0.123, ~0.123E1, 0.123): 0.27429 0.27429 (~0.123, ~0.123E1, 0.123E~2): 0.15252 0.15252 (~0.123, ~0.123E1, 0.11754944E~37): 0.15129 0.15129 (~0.123, ~0.123E1, 0.5877472E~38): 0.15129 0.15129 (~0.123, ~0.123E1, 0.1E~44): 0.15129 0.15129 (~0.123, ~0.123E1, 0.0): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.123E4): ~0.12298488E4 ~0.12298488E4 (~0.123, ~0.123E1, ~0.123E2): ~0.1214871E2 ~0.1214871E2 (~0.123, ~0.123E1, ~0.31415927E1): ~0.29903028E1 ~0.29903028E1 (~0.123, ~0.123E1, ~0.27182817E1): ~0.25669918E1 ~0.25669918E1 (~0.123, ~0.123E1, ~0.123E1): ~0.107871E1 ~0.107871E1 (~0.123, ~0.123E1, ~0.123): 0.28290004E~1 0.28290004E~1 (~0.123, ~0.123E1, ~0.123E~2): 0.15006001 0.15006001 (~0.123, ~0.123E1, ~0.11754944E~37): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.5877472E~38): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.1E~44): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.0): 0.15129 0.15129 (~0.123, ~0.123, 0.123E4): 0.12300151E4 0.12300151E4 (~0.123, ~0.123, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123, ~0.123, 0.31415927E1): 0.31567218E1 0.31567218E1 (~0.123, ~0.123, 0.27182817E1): 0.27334108E1 0.27334108E1 (~0.123, ~0.123, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123, ~0.123, 0.123): 0.13812901 0.13812901 (~0.123, ~0.123, 0.123E~2): 0.16359001E~1 0.16359001E~1 (~0.123, ~0.123, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, 0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, 0.0): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (~0.123, ~0.123, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123, ~0.123, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (~0.123, ~0.123, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (~0.123, ~0.123, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123, ~0.123, ~0.123): ~0.107871 ~0.107871 (~0.123, ~0.123, ~0.123E~2): 0.13899E~1 0.13899E~1 (~0.123, ~0.123, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123, ~0.0): 0.15129001E~1 0.15129001E~1 (~0.123, ~0.123E~2, 0.123E4): 0.12300001E4 0.12300001E4 (~0.123, ~0.123E~2, 0.123E2): 0.12300152E2 0.12300152E2 (~0.123, ~0.123E~2, 0.31415927E1): 0.31417441E1 0.31417441E1 (~0.123, ~0.123E~2, 0.27182817E1): 0.27184331E1 0.27184331E1 (~0.123, ~0.123E~2, 0.123E1): 0.12301513E1 0.12301513E1 (~0.123, ~0.123E~2, 0.123): 0.123151295 0.123151295 (~0.123, ~0.123E~2, 0.123E~2): 0.138129E~2 0.138129E~2 (~0.123, ~0.123E~2, 0.11754944E~37): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.5877472E~38): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.1E~44): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.0): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.123E4): ~0.12299999E4 ~0.12299999E4 (~0.123, ~0.123E~2, ~0.123E2): ~0.12299849E2 ~0.12299849E2 (~0.123, ~0.123E~2, ~0.31415927E1): ~0.31414413E1 ~0.31414413E1 (~0.123, ~0.123E~2, ~0.27182817E1): ~0.27181304E1 ~0.27181304E1 (~0.123, ~0.123E~2, ~0.123E1): ~0.12298487E1 ~0.12298487E1 (~0.123, ~0.123E~2, ~0.123): ~0.12284871 ~0.12284871 (~0.123, ~0.123E~2, ~0.123E~2): ~0.10787101E~2 ~0.10787101E~2 (~0.123, ~0.123E~2, ~0.11754944E~37): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.5877472E~38): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.1E~44): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.0): 0.15129E~3 0.15129E~3 (~0.123, ~0.11754944E~37, 0.11754944E~37): 0.13200802E~37 0.13200802E~37 (~0.123, ~0.11754944E~37, 0.5877472E~38): 0.732333E~38 0.732333E~38 (~0.123, ~0.11754944E~37, 0.1E~44): 0.144586E~38 0.144586E~38 (~0.123, ~0.11754944E~37, 0.0): 0.1445858E~38 0.1445858E~38 (~0.123, ~0.11754944E~37, ~0.11754944E~37): ~0.10309085E~37 ~0.10309085E~37 (~0.123, ~0.11754944E~37, ~0.5877472E~38): ~0.4431613E~38 ~0.4431613E~38 (~0.123, ~0.11754944E~37, ~0.1E~44): 0.1445857E~38 0.1445857E~38 (~0.123, ~0.11754944E~37, ~0.0): 0.1445858E~38 0.1445858E~38 (~0.123, ~0.5877472E~38, 0.11754944E~37): 0.12477872E~37 0.12477872E~37 (~0.123, ~0.5877472E~38, 0.5877472E~38): 0.66004E~38 0.66004E~38 (~0.123, ~0.5877472E~38, 0.1E~44): 0.72293E~39 0.72293E~39 (~0.123, ~0.5877472E~38, 0.0): 0.722928E~39 0.722928E~39 (~0.123, ~0.5877472E~38, ~0.11754944E~37): ~0.11032015E~37 ~0.11032015E~37 (~0.123, ~0.5877472E~38, ~0.5877472E~38): ~0.5154543E~38 ~0.5154543E~38 (~0.123, ~0.5877472E~38, ~0.1E~44): 0.722927E~39 0.722927E~39 (~0.123, ~0.5877472E~38, ~0.0): 0.722928E~39 0.722928E~39 (~0.123, ~0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.123, ~0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.123, ~0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (~0.123, ~0.1E~44, 0.0): 0.0 0.0 (~0.123, ~0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.123, ~0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.123, ~0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.123, ~0.1E~44, ~0.0): 0.0 0.0 (~0.123E~2, 0.34028235E39, 0.34028235E39): 0.3398638E39 0.3398638E39 (~0.123E~2, 0.34028235E39, 0.17014117E39): 0.16972263E39 0.16972263E39 (~0.123E~2, 0.34028235E39, 0.123E4): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.123E2): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.31415927E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.27182817E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.123E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.123): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.123E~2): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.1E~44): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, 0.0): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.34028235E39): ~inf ~inf (~0.123E~2, 0.34028235E39, ~0.17014117E39): ~0.17055971E39 ~0.17055971E39 (~0.123E~2, 0.34028235E39, ~0.123E4): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.123E2): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.31415927E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.27182817E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.123E1): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.123): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.123E~2): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.11754944E~37): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.5877472E~38): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.1E~44): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.34028235E39, ~0.0): ~0.4185473E36 ~0.4185473E36 (~0.123E~2, 0.17014117E39, 0.34028235E39): 0.34007307E39 0.34007307E39 (~0.123E~2, 0.17014117E39, 0.17014117E39): 0.1699319E39 0.1699319E39 (~0.123E~2, 0.17014117E39, 0.123E4): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.123E2): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.31415927E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.27182817E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.123E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.123): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.123E~2): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.1E~44): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, 0.0): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.34028235E39): ~inf ~inf (~0.123E~2, 0.17014117E39, ~0.17014117E39): ~0.17035044E39 ~0.17035044E39 (~0.123E~2, 0.17014117E39, ~0.123E4): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.123E2): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.31415927E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.27182817E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.123E1): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.123): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.123E~2): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.11754944E~37): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.5877472E~38): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.1E~44): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.17014117E39, ~0.0): ~0.20927364E36 ~0.20927364E36 (~0.123E~2, 0.123E4, 0.123E4): 0.1228487E4 0.1228487E4 (~0.123E~2, 0.123E4, 0.123E2): 0.107871E2 0.107871E2 (~0.123E~2, 0.123E4, 0.31415927E1): 0.16286926E1 0.16286926E1 (~0.123E~2, 0.123E4, 0.27182817E1): 0.12053816E1 0.12053816E1 (~0.123E~2, 0.123E4, 0.123E1): ~0.28290004 ~0.28290004 (~0.123E~2, 0.123E4, 0.123): ~0.13899001E1 ~0.13899001E1 (~0.123E~2, 0.123E4, 0.123E~2): ~0.15116701E1 ~0.15116701E1 (~0.123E~2, 0.123E4, 0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, 0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, 0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, 0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, ~0.123E4): ~0.1231513E4 ~0.1231513E4 (~0.123E~2, 0.123E4, ~0.123E2): ~0.13812901E2 ~0.13812901E2 (~0.123E~2, 0.123E4, ~0.31415927E1): ~0.4654493E1 ~0.4654493E1 (~0.123E~2, 0.123E4, ~0.27182817E1): ~0.42311816E1 ~0.42311816E1 (~0.123E~2, 0.123E4, ~0.123E1): ~0.27429001E1 ~0.27429001E1 (~0.123E~2, 0.123E4, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E~2, 0.123E4, ~0.123E~2): ~0.15141301E1 ~0.15141301E1 (~0.123E~2, 0.123E4, ~0.11754944E~37): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, ~0.5877472E~38): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, ~0.1E~44): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E4, ~0.0): ~0.15129001E1 ~0.15129001E1 (~0.123E~2, 0.123E2, 0.123E4): 0.12299849E4 0.12299849E4 (~0.123E~2, 0.123E2, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123E~2, 0.123E2, 0.31415927E1): 0.31264637E1 0.31264637E1 (~0.123E~2, 0.123E2, 0.27182817E1): 0.27031527E1 0.27031527E1 (~0.123E~2, 0.123E2, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123E~2, 0.123E2, 0.123): 0.107871 0.107871 (~0.123E~2, 0.123E2, 0.123E~2): ~0.13899001E~1 ~0.13899001E~1 (~0.123E~2, 0.123E2, 0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, 0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, 0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, 0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, ~0.123E4): ~0.12300151E4 ~0.12300151E4 (~0.123E~2, 0.123E2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123E~2, 0.123E2, ~0.31415927E1): ~0.31567218E1 ~0.31567218E1 (~0.123E~2, 0.123E2, ~0.27182817E1): ~0.27334108E1 ~0.27334108E1 (~0.123E~2, 0.123E2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123E~2, 0.123E2, ~0.123): ~0.13812901 ~0.13812901 (~0.123E~2, 0.123E2, ~0.123E~2): ~0.16359001E~1 ~0.16359001E~1 (~0.123E~2, 0.123E2, ~0.11754944E~37): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, ~0.5877472E~38): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, ~0.1E~44): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.123E2, ~0.0): ~0.15129001E~1 ~0.15129001E~1 (~0.123E~2, 0.31415927E1, 0.123E4): 0.12299961E4 0.12299961E4 (~0.123E~2, 0.31415927E1, 0.123E2): 0.12296136E2 0.12296136E2 (~0.123E~2, 0.31415927E1, 0.31415927E1): 0.31377287E1 0.31377287E1 (~0.123E~2, 0.31415927E1, 0.27182817E1): 0.27144177E1 0.27144177E1 (~0.123E~2, 0.31415927E1, 0.123E1): 0.12261358E1 0.12261358E1 (~0.123E~2, 0.31415927E1, 0.123): 0.11913584 0.11913584 (~0.123E~2, 0.31415927E1, 0.123E~2): ~0.26341593E~2 ~0.26341593E~2 (~0.123E~2, 0.31415927E1, 0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, 0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, 0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, 0.0): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, ~0.123E4): ~0.12300039E4 ~0.12300039E4 (~0.123E~2, 0.31415927E1, ~0.123E2): ~0.123038645E2 ~0.123038645E2 (~0.123E~2, 0.31415927E1, ~0.31415927E1): ~0.31454568E1 ~0.31454568E1 (~0.123E~2, 0.31415927E1, ~0.27182817E1): ~0.27221458E1 ~0.27221458E1 (~0.123E~2, 0.31415927E1, ~0.123E1): ~0.12338642E1 ~0.12338642E1 (~0.123E~2, 0.31415927E1, ~0.123): ~0.12686417 ~0.12686417 (~0.123E~2, 0.31415927E1, ~0.123E~2): ~0.50941594E~2 ~0.50941594E~2 (~0.123E~2, 0.31415927E1, ~0.11754944E~37): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, ~0.5877472E~38): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, ~0.1E~44): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.31415927E1, ~0.0): ~0.38641593E~2 ~0.38641593E~2 (~0.123E~2, 0.27182817E1, 0.123E4): 0.12299967E4 0.12299967E4 (~0.123E~2, 0.27182817E1, 0.123E2): 0.12296657E2 0.12296657E2 (~0.123E~2, 0.27182817E1, 0.31415927E1): 0.31382492E1 0.31382492E1 (~0.123E~2, 0.27182817E1, 0.27182817E1): 0.27149382E1 0.27149382E1 (~0.123E~2, 0.27182817E1, 0.123E1): 0.12266566E1 0.12266566E1 (~0.123E~2, 0.27182817E1, 0.123): 0.11965652 0.11965652 (~0.123E~2, 0.27182817E1, 0.123E~2): ~0.21134866E~2 ~0.21134866E~2 (~0.123E~2, 0.27182817E1, 0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, 0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, 0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, 0.0): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, ~0.123E4): ~0.12300033E4 ~0.12300033E4 (~0.123E~2, 0.27182817E1, ~0.123E2): ~0.12303344E2 ~0.12303344E2 (~0.123E~2, 0.27182817E1, ~0.31415927E1): ~0.31449363E1 ~0.31449363E1 (~0.123E~2, 0.27182817E1, ~0.27182817E1): ~0.27216253E1 ~0.27216253E1 (~0.123E~2, 0.27182817E1, ~0.123E1): ~0.12333435E1 ~0.12333435E1 (~0.123E~2, 0.27182817E1, ~0.123): ~0.12634349 ~0.12634349 (~0.123E~2, 0.27182817E1, ~0.123E~2): ~0.45734867E~2 ~0.45734867E~2 (~0.123E~2, 0.27182817E1, ~0.11754944E~37): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, ~0.5877472E~38): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, ~0.1E~44): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.27182817E1, ~0.0): ~0.33434867E~2 ~0.33434867E~2 (~0.123E~2, 0.123E1, 0.123E4): 0.12299985E4 0.12299985E4 (~0.123E~2, 0.123E1, 0.123E2): 0.12298488E2 0.12298488E2 (~0.123E~2, 0.123E1, 0.31415927E1): 0.31400797E1 0.31400797E1 (~0.123E~2, 0.123E1, 0.27182817E1): 0.27167687E1 0.27167687E1 (~0.123E~2, 0.123E1, 0.123E1): 0.12284871E1 0.12284871E1 (~0.123E~2, 0.123E1, 0.123): 0.1214871 0.1214871 (~0.123E~2, 0.123E1, 0.123E~2): ~0.28290003E~3 ~0.28290003E~3 (~0.123E~2, 0.123E1, 0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, 0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, 0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, 0.0): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, ~0.123E4): ~0.12300015E4 ~0.12300015E4 (~0.123E~2, 0.123E1, ~0.123E2): ~0.12301513E2 ~0.12301513E2 (~0.123E~2, 0.123E1, ~0.31415927E1): ~0.31431057E1 ~0.31431057E1 (~0.123E~2, 0.123E1, ~0.27182817E1): ~0.27197948E1 ~0.27197948E1 (~0.123E~2, 0.123E1, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (~0.123E~2, 0.123E1, ~0.123): ~0.1245129 ~0.1245129 (~0.123E~2, 0.123E1, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (~0.123E~2, 0.123E1, ~0.11754944E~37): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, ~0.5877472E~38): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, ~0.1E~44): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123E1, ~0.0): ~0.15129001E~2 ~0.15129001E~2 (~0.123E~2, 0.123, 0.123E4): 0.12299999E4 0.12299999E4 (~0.123E~2, 0.123, 0.123E2): 0.12299849E2 0.12299849E2 (~0.123E~2, 0.123, 0.31415927E1): 0.31414413E1 0.31414413E1 (~0.123E~2, 0.123, 0.27182817E1): 0.27181304E1 0.27181304E1 (~0.123E~2, 0.123, 0.123E1): 0.12298487E1 0.12298487E1 (~0.123E~2, 0.123, 0.123): 0.12284871 0.12284871 (~0.123E~2, 0.123, 0.123E~2): 0.10787101E~2 0.10787101E~2 (~0.123E~2, 0.123, 0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.1E~44): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.0): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.123E4): ~0.12300001E4 ~0.12300001E4 (~0.123E~2, 0.123, ~0.123E2): ~0.12300152E2 ~0.12300152E2 (~0.123E~2, 0.123, ~0.31415927E1): ~0.31417441E1 ~0.31417441E1 (~0.123E~2, 0.123, ~0.27182817E1): ~0.27184331E1 ~0.27184331E1 (~0.123E~2, 0.123, ~0.123E1): ~0.12301513E1 ~0.12301513E1 (~0.123E~2, 0.123, ~0.123): ~0.123151295 ~0.123151295 (~0.123E~2, 0.123, ~0.123E~2): ~0.138129E~2 ~0.138129E~2 (~0.123E~2, 0.123, ~0.11754944E~37): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.5877472E~38): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.1E~44): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.0): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123E~2, 0.123E4): 0.123E4 0.123E4 (~0.123E~2, 0.123E~2, 0.123E2): 0.12299998E2 0.12299998E2 (~0.123E~2, 0.123E~2, 0.31415927E1): 0.31415913E1 0.31415913E1 (~0.123E~2, 0.123E~2, 0.27182817E1): 0.27182803E1 0.27182803E1 (~0.123E~2, 0.123E~2, 0.123E1): 0.12299985E1 0.12299985E1 (~0.123E~2, 0.123E~2, 0.123): 0.12299849 0.12299849 (~0.123E~2, 0.123E~2, 0.123E~2): 0.12284871E~2 0.12284871E~2 (~0.123E~2, 0.123E~2, 0.11754944E~37): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, 0.5877472E~38): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, 0.1E~44): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, 0.0): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, ~0.123E4): ~0.123E4 ~0.123E4 (~0.123E~2, 0.123E~2, ~0.123E2): ~0.12300002E2 ~0.12300002E2 (~0.123E~2, 0.123E~2, ~0.31415927E1): ~0.31415942E1 ~0.31415942E1 (~0.123E~2, 0.123E~2, ~0.27182817E1): ~0.27182832E1 ~0.27182832E1 (~0.123E~2, 0.123E~2, ~0.123E1): ~0.12300016E1 ~0.12300016E1 (~0.123E~2, 0.123E~2, ~0.123): ~0.123001516 ~0.123001516 (~0.123E~2, 0.123E~2, ~0.123E~2): ~0.1231513E~2 ~0.1231513E~2 (~0.123E~2, 0.123E~2, ~0.11754944E~37): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, ~0.5877472E~38): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, ~0.1E~44): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.123E~2, ~0.0): ~0.15129001E~5 ~0.15129001E~5 (~0.123E~2, 0.11754944E~37, 0.11754944E~37): 0.11740485E~37 0.11740485E~37 (~0.123E~2, 0.11754944E~37, 0.5877472E~38): 0.5863013E~38 0.5863013E~38 (~0.123E~2, 0.11754944E~37, 0.1E~44): ~0.14457E~40 ~0.14457E~40 (~0.123E~2, 0.11754944E~37, 0.0): ~0.14459E~40 ~0.14459E~40 (~0.123E~2, 0.11754944E~37, ~0.11754944E~37): ~0.11769402E~37 ~0.11769402E~37 (~0.123E~2, 0.11754944E~37, ~0.5877472E~38): ~0.589193E~38 ~0.589193E~38 (~0.123E~2, 0.11754944E~37, ~0.1E~44): ~0.1446E~40 ~0.1446E~40 (~0.123E~2, 0.11754944E~37, ~0.0): ~0.14459E~40 ~0.14459E~40 (~0.123E~2, 0.5877472E~38, 0.11754944E~37): 0.11747714E~37 0.11747714E~37 (~0.123E~2, 0.5877472E~38, 0.5877472E~38): 0.5870242E~38 0.5870242E~38 (~0.123E~2, 0.5877472E~38, 0.1E~44): ~0.7228E~41 ~0.7228E~41 (~0.123E~2, 0.5877472E~38, 0.0): ~0.7229E~41 ~0.7229E~41 (~0.123E~2, 0.5877472E~38, ~0.11754944E~37): ~0.11762173E~37 ~0.11762173E~37 (~0.123E~2, 0.5877472E~38, ~0.5877472E~38): ~0.5884701E~38 ~0.5884701E~38 (~0.123E~2, 0.5877472E~38, ~0.1E~44): ~0.723E~41 ~0.723E~41 (~0.123E~2, 0.5877472E~38, ~0.0): ~0.7229E~41 ~0.7229E~41 (~0.123E~2, 0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.123E~2, 0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.123E~2, 0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (~0.123E~2, 0.1E~44, 0.0): ~0.0 ~0.0 (~0.123E~2, 0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.123E~2, 0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.123E~2, 0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.123E~2, 0.1E~44, ~0.0): ~0.0 ~0.0 (~0.123E~2, ~0.34028235E39, 0.34028235E39): inf inf (~0.123E~2, ~0.34028235E39, 0.17014117E39): 0.17055971E39 0.17055971E39 (~0.123E~2, ~0.34028235E39, 0.123E4): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.123E2): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.31415927E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.27182817E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.123E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.123): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.123E~2): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.11754944E~37): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.5877472E~38): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.1E~44): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, 0.0): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.34028235E39): ~0.3398638E39 ~0.3398638E39 (~0.123E~2, ~0.34028235E39, ~0.17014117E39): ~0.16972263E39 ~0.16972263E39 (~0.123E~2, ~0.34028235E39, ~0.123E4): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.123E2): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.31415927E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.27182817E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.123E1): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.123): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.123E~2): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.11754944E~37): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.5877472E~38): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.1E~44): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.34028235E39, ~0.0): 0.4185473E36 0.4185473E36 (~0.123E~2, ~0.17014117E39, 0.34028235E39): inf inf (~0.123E~2, ~0.17014117E39, 0.17014117E39): 0.17035044E39 0.17035044E39 (~0.123E~2, ~0.17014117E39, 0.123E4): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.123E2): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.31415927E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.27182817E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.123E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.123): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.123E~2): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.11754944E~37): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.5877472E~38): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.1E~44): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, 0.0): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.34028235E39): ~0.34007307E39 ~0.34007307E39 (~0.123E~2, ~0.17014117E39, ~0.17014117E39): ~0.1699319E39 ~0.1699319E39 (~0.123E~2, ~0.17014117E39, ~0.123E4): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.123E2): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.31415927E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.27182817E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.123E1): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.123): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.123E~2): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.11754944E~37): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.5877472E~38): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.1E~44): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.17014117E39, ~0.0): 0.20927364E36 0.20927364E36 (~0.123E~2, ~0.123E4, 0.123E4): 0.1231513E4 0.1231513E4 (~0.123E~2, ~0.123E4, 0.123E2): 0.13812901E2 0.13812901E2 (~0.123E~2, ~0.123E4, 0.31415927E1): 0.4654493E1 0.4654493E1 (~0.123E~2, ~0.123E4, 0.27182817E1): 0.42311816E1 0.42311816E1 (~0.123E~2, ~0.123E4, 0.123E1): 0.27429001E1 0.27429001E1 (~0.123E~2, ~0.123E4, 0.123): 0.16359E1 0.16359E1 (~0.123E~2, ~0.123E4, 0.123E~2): 0.15141301E1 0.15141301E1 (~0.123E~2, ~0.123E4, 0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, 0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, 0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, 0.0): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, ~0.123E4): ~0.1228487E4 ~0.1228487E4 (~0.123E~2, ~0.123E4, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E~2, ~0.123E4, ~0.31415927E1): ~0.16286926E1 ~0.16286926E1 (~0.123E~2, ~0.123E4, ~0.27182817E1): ~0.12053816E1 ~0.12053816E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.28290004 0.28290004 (~0.123E~2, ~0.123E4, ~0.123): 0.13899001E1 0.13899001E1 (~0.123E~2, ~0.123E4, ~0.123E~2): 0.15116701E1 0.15116701E1 (~0.123E~2, ~0.123E4, ~0.11754944E~37): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, ~0.5877472E~38): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, ~0.1E~44): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E4, ~0.0): 0.15129001E1 0.15129001E1 (~0.123E~2, ~0.123E2, 0.123E4): 0.12300151E4 0.12300151E4 (~0.123E~2, ~0.123E2, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123E~2, ~0.123E2, 0.31415927E1): 0.31567218E1 0.31567218E1 (~0.123E~2, ~0.123E2, 0.27182817E1): 0.27334108E1 0.27334108E1 (~0.123E~2, ~0.123E2, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123E~2, ~0.123E2, 0.123): 0.13812901 0.13812901 (~0.123E~2, ~0.123E2, 0.123E~2): 0.16359001E~1 0.16359001E~1 (~0.123E~2, ~0.123E2, 0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, 0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, 0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, 0.0): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, ~0.123E4): ~0.12299849E4 ~0.12299849E4 (~0.123E~2, ~0.123E2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123E~2, ~0.123E2, ~0.31415927E1): ~0.31264637E1 ~0.31264637E1 (~0.123E~2, ~0.123E2, ~0.27182817E1): ~0.27031527E1 ~0.27031527E1 (~0.123E~2, ~0.123E2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123E~2, ~0.123E2, ~0.123): ~0.107871 ~0.107871 (~0.123E~2, ~0.123E2, ~0.123E~2): 0.13899001E~1 0.13899001E~1 (~0.123E~2, ~0.123E2, ~0.11754944E~37): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, ~0.5877472E~38): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, ~0.1E~44): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.123E2, ~0.0): 0.15129001E~1 0.15129001E~1 (~0.123E~2, ~0.31415927E1, 0.123E4): 0.12300039E4 0.12300039E4 (~0.123E~2, ~0.31415927E1, 0.123E2): 0.123038645E2 0.123038645E2 (~0.123E~2, ~0.31415927E1, 0.31415927E1): 0.31454568E1 0.31454568E1 (~0.123E~2, ~0.31415927E1, 0.27182817E1): 0.27221458E1 0.27221458E1 (~0.123E~2, ~0.31415927E1, 0.123E1): 0.12338642E1 0.12338642E1 (~0.123E~2, ~0.31415927E1, 0.123): 0.12686417 0.12686417 (~0.123E~2, ~0.31415927E1, 0.123E~2): 0.50941594E~2 0.50941594E~2 (~0.123E~2, ~0.31415927E1, 0.11754944E~37): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, 0.5877472E~38): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, 0.1E~44): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, 0.0): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, ~0.123E4): ~0.12299961E4 ~0.12299961E4 (~0.123E~2, ~0.31415927E1, ~0.123E2): ~0.12296136E2 ~0.12296136E2 (~0.123E~2, ~0.31415927E1, ~0.31415927E1): ~0.31377287E1 ~0.31377287E1 (~0.123E~2, ~0.31415927E1, ~0.27182817E1): ~0.27144177E1 ~0.27144177E1 (~0.123E~2, ~0.31415927E1, ~0.123E1): ~0.12261358E1 ~0.12261358E1 (~0.123E~2, ~0.31415927E1, ~0.123): ~0.11913584 ~0.11913584 (~0.123E~2, ~0.31415927E1, ~0.123E~2): 0.26341593E~2 0.26341593E~2 (~0.123E~2, ~0.31415927E1, ~0.11754944E~37): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, ~0.5877472E~38): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, ~0.1E~44): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.31415927E1, ~0.0): 0.38641593E~2 0.38641593E~2 (~0.123E~2, ~0.27182817E1, 0.123E4): 0.12300033E4 0.12300033E4 (~0.123E~2, ~0.27182817E1, 0.123E2): 0.12303344E2 0.12303344E2 (~0.123E~2, ~0.27182817E1, 0.31415927E1): 0.31449363E1 0.31449363E1 (~0.123E~2, ~0.27182817E1, 0.27182817E1): 0.27216253E1 0.27216253E1 (~0.123E~2, ~0.27182817E1, 0.123E1): 0.12333435E1 0.12333435E1 (~0.123E~2, ~0.27182817E1, 0.123): 0.12634349 0.12634349 (~0.123E~2, ~0.27182817E1, 0.123E~2): 0.45734867E~2 0.45734867E~2 (~0.123E~2, ~0.27182817E1, 0.11754944E~37): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, 0.5877472E~38): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, 0.1E~44): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, 0.0): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, ~0.123E4): ~0.12299967E4 ~0.12299967E4 (~0.123E~2, ~0.27182817E1, ~0.123E2): ~0.12296657E2 ~0.12296657E2 (~0.123E~2, ~0.27182817E1, ~0.31415927E1): ~0.31382492E1 ~0.31382492E1 (~0.123E~2, ~0.27182817E1, ~0.27182817E1): ~0.27149382E1 ~0.27149382E1 (~0.123E~2, ~0.27182817E1, ~0.123E1): ~0.12266566E1 ~0.12266566E1 (~0.123E~2, ~0.27182817E1, ~0.123): ~0.11965652 ~0.11965652 (~0.123E~2, ~0.27182817E1, ~0.123E~2): 0.21134866E~2 0.21134866E~2 (~0.123E~2, ~0.27182817E1, ~0.11754944E~37): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, ~0.5877472E~38): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, ~0.1E~44): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.27182817E1, ~0.0): 0.33434867E~2 0.33434867E~2 (~0.123E~2, ~0.123E1, 0.123E4): 0.12300015E4 0.12300015E4 (~0.123E~2, ~0.123E1, 0.123E2): 0.12301513E2 0.12301513E2 (~0.123E~2, ~0.123E1, 0.31415927E1): 0.31431057E1 0.31431057E1 (~0.123E~2, ~0.123E1, 0.27182817E1): 0.27197948E1 0.27197948E1 (~0.123E~2, ~0.123E1, 0.123E1): 0.12315129E1 0.12315129E1 (~0.123E~2, ~0.123E1, 0.123): 0.1245129 0.1245129 (~0.123E~2, ~0.123E1, 0.123E~2): 0.27429E~2 0.27429E~2 (~0.123E~2, ~0.123E1, 0.11754944E~37): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, 0.5877472E~38): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, 0.1E~44): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, 0.0): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, ~0.123E4): ~0.12299985E4 ~0.12299985E4 (~0.123E~2, ~0.123E1, ~0.123E2): ~0.12298488E2 ~0.12298488E2 (~0.123E~2, ~0.123E1, ~0.31415927E1): ~0.31400797E1 ~0.31400797E1 (~0.123E~2, ~0.123E1, ~0.27182817E1): ~0.27167687E1 ~0.27167687E1 (~0.123E~2, ~0.123E1, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (~0.123E~2, ~0.123E1, ~0.123): ~0.1214871 ~0.1214871 (~0.123E~2, ~0.123E1, ~0.123E~2): 0.28290003E~3 0.28290003E~3 (~0.123E~2, ~0.123E1, ~0.11754944E~37): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, ~0.5877472E~38): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, ~0.1E~44): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123E1, ~0.0): 0.15129001E~2 0.15129001E~2 (~0.123E~2, ~0.123, 0.123E4): 0.12300001E4 0.12300001E4 (~0.123E~2, ~0.123, 0.123E2): 0.12300152E2 0.12300152E2 (~0.123E~2, ~0.123, 0.31415927E1): 0.31417441E1 0.31417441E1 (~0.123E~2, ~0.123, 0.27182817E1): 0.27184331E1 0.27184331E1 (~0.123E~2, ~0.123, 0.123E1): 0.12301513E1 0.12301513E1 (~0.123E~2, ~0.123, 0.123): 0.123151295 0.123151295 (~0.123E~2, ~0.123, 0.123E~2): 0.138129E~2 0.138129E~2 (~0.123E~2, ~0.123, 0.11754944E~37): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.5877472E~38): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.1E~44): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.0): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.123E4): ~0.12299999E4 ~0.12299999E4 (~0.123E~2, ~0.123, ~0.123E2): ~0.12299849E2 ~0.12299849E2 (~0.123E~2, ~0.123, ~0.31415927E1): ~0.31414413E1 ~0.31414413E1 (~0.123E~2, ~0.123, ~0.27182817E1): ~0.27181304E1 ~0.27181304E1 (~0.123E~2, ~0.123, ~0.123E1): ~0.12298487E1 ~0.12298487E1 (~0.123E~2, ~0.123, ~0.123): ~0.12284871 ~0.12284871 (~0.123E~2, ~0.123, ~0.123E~2): ~0.10787101E~2 ~0.10787101E~2 (~0.123E~2, ~0.123, ~0.11754944E~37): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.5877472E~38): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.1E~44): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.0): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123E~2, 0.123E4): 0.123E4 0.123E4 (~0.123E~2, ~0.123E~2, 0.123E2): 0.12300002E2 0.12300002E2 (~0.123E~2, ~0.123E~2, 0.31415927E1): 0.31415942E1 0.31415942E1 (~0.123E~2, ~0.123E~2, 0.27182817E1): 0.27182832E1 0.27182832E1 (~0.123E~2, ~0.123E~2, 0.123E1): 0.12300016E1 0.12300016E1 (~0.123E~2, ~0.123E~2, 0.123): 0.123001516 0.123001516 (~0.123E~2, ~0.123E~2, 0.123E~2): 0.1231513E~2 0.1231513E~2 (~0.123E~2, ~0.123E~2, 0.11754944E~37): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, 0.5877472E~38): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, 0.1E~44): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, 0.0): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, ~0.123E4): ~0.123E4 ~0.123E4 (~0.123E~2, ~0.123E~2, ~0.123E2): ~0.12299998E2 ~0.12299998E2 (~0.123E~2, ~0.123E~2, ~0.31415927E1): ~0.31415913E1 ~0.31415913E1 (~0.123E~2, ~0.123E~2, ~0.27182817E1): ~0.27182803E1 ~0.27182803E1 (~0.123E~2, ~0.123E~2, ~0.123E1): ~0.12299985E1 ~0.12299985E1 (~0.123E~2, ~0.123E~2, ~0.123): ~0.12299849 ~0.12299849 (~0.123E~2, ~0.123E~2, ~0.123E~2): ~0.12284871E~2 ~0.12284871E~2 (~0.123E~2, ~0.123E~2, ~0.11754944E~37): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, ~0.5877472E~38): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, ~0.1E~44): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.123E~2, ~0.0): 0.15129001E~5 0.15129001E~5 (~0.123E~2, ~0.11754944E~37, 0.11754944E~37): 0.11769402E~37 0.11769402E~37 (~0.123E~2, ~0.11754944E~37, 0.5877472E~38): 0.589193E~38 0.589193E~38 (~0.123E~2, ~0.11754944E~37, 0.1E~44): 0.1446E~40 0.1446E~40 (~0.123E~2, ~0.11754944E~37, 0.0): 0.14459E~40 0.14459E~40 (~0.123E~2, ~0.11754944E~37, ~0.11754944E~37): ~0.11740485E~37 ~0.11740485E~37 (~0.123E~2, ~0.11754944E~37, ~0.5877472E~38): ~0.5863013E~38 ~0.5863013E~38 (~0.123E~2, ~0.11754944E~37, ~0.1E~44): 0.14457E~40 0.14457E~40 (~0.123E~2, ~0.11754944E~37, ~0.0): 0.14459E~40 0.14459E~40 (~0.123E~2, ~0.5877472E~38, 0.11754944E~37): 0.11762173E~37 0.11762173E~37 (~0.123E~2, ~0.5877472E~38, 0.5877472E~38): 0.5884701E~38 0.5884701E~38 (~0.123E~2, ~0.5877472E~38, 0.1E~44): 0.723E~41 0.723E~41 (~0.123E~2, ~0.5877472E~38, 0.0): 0.7229E~41 0.7229E~41 (~0.123E~2, ~0.5877472E~38, ~0.11754944E~37): ~0.11747714E~37 ~0.11747714E~37 (~0.123E~2, ~0.5877472E~38, ~0.5877472E~38): ~0.5870242E~38 ~0.5870242E~38 (~0.123E~2, ~0.5877472E~38, ~0.1E~44): 0.7228E~41 0.7228E~41 (~0.123E~2, ~0.5877472E~38, ~0.0): 0.7229E~41 0.7229E~41 (~0.123E~2, ~0.1E~44, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.123E~2, ~0.1E~44, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.123E~2, ~0.1E~44, 0.1E~44): 0.1E~44 0.1E~44 (~0.123E~2, ~0.1E~44, 0.0): 0.0 0.0 (~0.123E~2, ~0.1E~44, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.123E~2, ~0.1E~44, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.123E~2, ~0.1E~44, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.123E~2, ~0.1E~44, ~0.0): 0.0 0.0 (~0.11754944E~37, 0.34028235E39, 0.123E4): 0.1226E4 0.1226E4 (~0.11754944E~37, 0.34028235E39, 0.123E2): 0.83E1 0.83E1 (~0.11754944E~37, 0.34028235E39, 0.123): ~0.38769999E1 ~0.38769999E1 (~0.11754944E~37, 0.34028235E39, 0.123E~2): ~0.39987698E1 ~0.39987698E1 (~0.11754944E~37, 0.34028235E39, ~0.123E4): ~0.1234E4 ~0.1234E4 (~0.11754944E~37, 0.34028235E39, ~0.123E2): ~0.163E2 ~0.163E2 (~0.11754944E~37, 0.34028235E39, ~0.27182817E1): ~0.67182817E1 ~0.67182817E1 (~0.11754944E~37, 0.34028235E39, ~0.123E1): ~0.52299995E1 ~0.52299995E1 (~0.11754944E~37, 0.34028235E39, ~0.123): ~0.41229997E1 ~0.41229997E1 (~0.11754944E~37, 0.34028235E39, ~0.123E~2): ~0.400123E1 ~0.400123E1 (~0.11754944E~37, 0.17014117E39, 0.123E4): 0.1228E4 0.1228E4 (~0.11754944E~37, 0.17014117E39, 0.123E2): 0.103E2 0.103E2 (~0.11754944E~37, 0.17014117E39, 0.123): ~0.18769999E1 ~0.18769999E1 (~0.11754944E~37, 0.17014117E39, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (~0.11754944E~37, 0.17014117E39, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.11754944E~37, 0.17014117E39, ~0.123E2): ~0.143E2 ~0.143E2 (~0.11754944E~37, 0.17014117E39, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (~0.11754944E~37, 0.17014117E39, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (~0.11754944E~37, 0.17014117E39, ~0.123E1): ~0.323E1 ~0.323E1 (~0.11754944E~37, 0.17014117E39, ~0.123): ~0.2123E1 ~0.2123E1 (~0.11754944E~37, 0.17014117E39, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (~0.11754944E~37, 0.123E4, 0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (~0.11754944E~37, 0.123E4, ~0.1E~44): ~0.1445858E~34 ~0.1445858E~34 (~0.11754944E~37, 0.123E2, 0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (~0.11754944E~37, 0.123E2, ~0.1E~44): ~0.14458581E~36 ~0.14458581E~36 (~0.11754944E~37, 0.31415927E1, 0.1E~44): ~0.36929242E~37 ~0.36929242E~37 (~0.11754944E~37, 0.31415927E1, ~0.11754944E~37): ~0.4868419E~37 ~0.4868419E~37 (~0.11754944E~37, 0.31415927E1, ~0.1E~44): ~0.36929248E~37 ~0.36929248E~37 (~0.11754944E~37, 0.27182817E1, 0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (~0.11754944E~37, 0.27182817E1, ~0.1E~44): ~0.31953248E~37 ~0.31953248E~37 (~0.11754944E~37, 0.123, 0.11754944E~37): 0.10309085E~37 0.10309085E~37 (~0.11754944E~37, 0.123, 0.5877472E~38): 0.4431613E~38 0.4431613E~38 (~0.11754944E~37, 0.123, 0.1E~44): ~0.1445857E~38 ~0.1445857E~38 (~0.11754944E~37, 0.123, 0.0): ~0.1445858E~38 ~0.1445858E~38 (~0.11754944E~37, 0.123, ~0.11754944E~37): ~0.13200802E~37 ~0.13200802E~37 (~0.11754944E~37, 0.123, ~0.5877472E~38): ~0.732333E~38 ~0.732333E~38 (~0.11754944E~37, 0.123, ~0.1E~44): ~0.144586E~38 ~0.144586E~38 (~0.11754944E~37, 0.123, ~0.0): ~0.1445858E~38 ~0.1445858E~38 (~0.11754944E~37, 0.123E~2, 0.11754944E~37): 0.11740485E~37 0.11740485E~37 (~0.11754944E~37, 0.123E~2, 0.5877472E~38): 0.5863013E~38 0.5863013E~38 (~0.11754944E~37, 0.123E~2, 0.1E~44): ~0.14457E~40 ~0.14457E~40 (~0.11754944E~37, 0.123E~2, 0.0): ~0.14459E~40 ~0.14459E~40 (~0.11754944E~37, 0.123E~2, ~0.11754944E~37): ~0.11769402E~37 ~0.11769402E~37 (~0.11754944E~37, 0.123E~2, ~0.5877472E~38): ~0.589193E~38 ~0.589193E~38 (~0.11754944E~37, 0.123E~2, ~0.1E~44): ~0.1446E~40 ~0.1446E~40 (~0.11754944E~37, 0.123E~2, ~0.0): ~0.14459E~40 ~0.14459E~40 (~0.11754944E~37, 0.11754944E~37, 0.0): ~0.0 ~0.0 (~0.11754944E~37, 0.11754944E~37, ~0.0): ~0.0 ~0.0 (~0.11754944E~37, 0.5877472E~38, 0.0): ~0.0 ~0.0 (~0.11754944E~37, 0.5877472E~38, ~0.0): ~0.0 ~0.0 (~0.11754944E~37, 0.1E~44, 0.0): ~0.0 ~0.0 (~0.11754944E~37, 0.1E~44, ~0.0): ~0.0 ~0.0 (~0.11754944E~37, ~0.34028235E39, 0.123E4): 0.1234E4 0.1234E4 (~0.11754944E~37, ~0.34028235E39, 0.123E2): 0.163E2 0.163E2 (~0.11754944E~37, ~0.34028235E39, 0.27182817E1): 0.67182817E1 0.67182817E1 (~0.11754944E~37, ~0.34028235E39, 0.123E1): 0.52299995E1 0.52299995E1 (~0.11754944E~37, ~0.34028235E39, 0.123): 0.41229997E1 0.41229997E1 (~0.11754944E~37, ~0.34028235E39, 0.123E~2): 0.400123E1 0.400123E1 (~0.11754944E~37, ~0.34028235E39, ~0.123E4): ~0.1226E4 ~0.1226E4 (~0.11754944E~37, ~0.34028235E39, ~0.123E2): ~0.83E1 ~0.83E1 (~0.11754944E~37, ~0.34028235E39, ~0.123): 0.38769999E1 0.38769999E1 (~0.11754944E~37, ~0.34028235E39, ~0.123E~2): 0.39987698E1 0.39987698E1 (~0.11754944E~37, ~0.17014117E39, 0.123E4): 0.1232E4 0.1232E4 (~0.11754944E~37, ~0.17014117E39, 0.123E2): 0.143E2 0.143E2 (~0.11754944E~37, ~0.17014117E39, 0.31415927E1): 0.51415925E1 0.51415925E1 (~0.11754944E~37, ~0.17014117E39, 0.27182817E1): 0.47182817E1 0.47182817E1 (~0.11754944E~37, ~0.17014117E39, 0.123E1): 0.323E1 0.323E1 (~0.11754944E~37, ~0.17014117E39, 0.123): 0.2123E1 0.2123E1 (~0.11754944E~37, ~0.17014117E39, 0.123E~2): 0.20012298E1 0.20012298E1 (~0.11754944E~37, ~0.17014117E39, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.11754944E~37, ~0.17014117E39, ~0.123E2): ~0.103E2 ~0.103E2 (~0.11754944E~37, ~0.17014117E39, ~0.123): 0.18769999E1 0.18769999E1 (~0.11754944E~37, ~0.17014117E39, ~0.123E~2): 0.19987699E1 0.19987699E1 (~0.11754944E~37, ~0.123E4, 0.1E~44): 0.1445858E~34 0.1445858E~34 (~0.11754944E~37, ~0.123E4, ~0.1E~44): 0.1445858E~34 0.1445858E~34 (~0.11754944E~37, ~0.123E2, 0.1E~44): 0.14458581E~36 0.14458581E~36 (~0.11754944E~37, ~0.123E2, ~0.1E~44): 0.14458581E~36 0.14458581E~36 (~0.11754944E~37, ~0.31415927E1, 0.11754944E~37): 0.4868419E~37 0.4868419E~37 (~0.11754944E~37, ~0.31415927E1, 0.1E~44): 0.36929248E~37 0.36929248E~37 (~0.11754944E~37, ~0.31415927E1, ~0.1E~44): 0.36929242E~37 0.36929242E~37 (~0.11754944E~37, ~0.27182817E1, 0.1E~44): 0.31953248E~37 0.31953248E~37 (~0.11754944E~37, ~0.27182817E1, ~0.1E~44): 0.31953248E~37 0.31953248E~37 (~0.11754944E~37, ~0.123, 0.11754944E~37): 0.13200802E~37 0.13200802E~37 (~0.11754944E~37, ~0.123, 0.5877472E~38): 0.732333E~38 0.732333E~38 (~0.11754944E~37, ~0.123, 0.1E~44): 0.144586E~38 0.144586E~38 (~0.11754944E~37, ~0.123, 0.0): 0.1445858E~38 0.1445858E~38 (~0.11754944E~37, ~0.123, ~0.11754944E~37): ~0.10309085E~37 ~0.10309085E~37 (~0.11754944E~37, ~0.123, ~0.5877472E~38): ~0.4431613E~38 ~0.4431613E~38 (~0.11754944E~37, ~0.123, ~0.1E~44): 0.1445857E~38 0.1445857E~38 (~0.11754944E~37, ~0.123, ~0.0): 0.1445858E~38 0.1445858E~38 (~0.11754944E~37, ~0.123E~2, 0.11754944E~37): 0.11769402E~37 0.11769402E~37 (~0.11754944E~37, ~0.123E~2, 0.5877472E~38): 0.589193E~38 0.589193E~38 (~0.11754944E~37, ~0.123E~2, 0.1E~44): 0.1446E~40 0.1446E~40 (~0.11754944E~37, ~0.123E~2, 0.0): 0.14459E~40 0.14459E~40 (~0.11754944E~37, ~0.123E~2, ~0.11754944E~37): ~0.11740485E~37 ~0.11740485E~37 (~0.11754944E~37, ~0.123E~2, ~0.5877472E~38): ~0.5863013E~38 ~0.5863013E~38 (~0.11754944E~37, ~0.123E~2, ~0.1E~44): 0.14457E~40 0.14457E~40 (~0.11754944E~37, ~0.123E~2, ~0.0): 0.14459E~40 0.14459E~40 (~0.11754944E~37, ~0.11754944E~37, 0.0): 0.0 0.0 (~0.11754944E~37, ~0.11754944E~37, ~0.0): 0.0 0.0 (~0.11754944E~37, ~0.5877472E~38, 0.0): 0.0 0.0 (~0.11754944E~37, ~0.5877472E~38, ~0.0): 0.0 0.0 (~0.11754944E~37, ~0.1E~44, 0.0): 0.0 0.0 (~0.11754944E~37, ~0.1E~44, ~0.0): 0.0 0.0 (~0.5877472E~38, 0.34028235E39, 0.123E4): 0.1228E4 0.1228E4 (~0.5877472E~38, 0.34028235E39, 0.123E2): 0.103E2 0.103E2 (~0.5877472E~38, 0.34028235E39, 0.123): ~0.18769999E1 ~0.18769999E1 (~0.5877472E~38, 0.34028235E39, 0.123E~2): ~0.19987699E1 ~0.19987699E1 (~0.5877472E~38, 0.34028235E39, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.5877472E~38, 0.34028235E39, ~0.123E2): ~0.143E2 ~0.143E2 (~0.5877472E~38, 0.34028235E39, ~0.31415927E1): ~0.51415925E1 ~0.51415925E1 (~0.5877472E~38, 0.34028235E39, ~0.27182817E1): ~0.47182817E1 ~0.47182817E1 (~0.5877472E~38, 0.34028235E39, ~0.123E1): ~0.323E1 ~0.323E1 (~0.5877472E~38, 0.34028235E39, ~0.123): ~0.2123E1 ~0.2123E1 (~0.5877472E~38, 0.34028235E39, ~0.123E~2): ~0.20012298E1 ~0.20012298E1 (~0.5877472E~38, 0.17014117E39, 0.123E4): 0.1229E4 0.1229E4 (~0.5877472E~38, 0.17014117E39, 0.123E2): 0.113E2 0.113E2 (~0.5877472E~38, 0.17014117E39, 0.31415927E1): 0.21415927E1 0.21415927E1 (~0.5877472E~38, 0.17014117E39, 0.27182817E1): 0.17182817E1 0.17182817E1 (~0.5877472E~38, 0.17014117E39, 0.123): ~0.8769999 ~0.8769999 (~0.5877472E~38, 0.17014117E39, 0.123E~2): ~0.99876994 ~0.99876994 (~0.5877472E~38, 0.17014117E39, ~0.123E4): ~0.1231E4 ~0.1231E4 (~0.5877472E~38, 0.17014117E39, ~0.123E2): ~0.133E2 ~0.133E2 (~0.5877472E~38, 0.17014117E39, ~0.31415927E1): ~0.41415925E1 ~0.41415925E1 (~0.5877472E~38, 0.17014117E39, ~0.27182817E1): ~0.37182817E1 ~0.37182817E1 (~0.5877472E~38, 0.17014117E39, ~0.123E1): ~0.223E1 ~0.223E1 (~0.5877472E~38, 0.17014117E39, ~0.123): ~0.11229999E1 ~0.11229999E1 (~0.5877472E~38, 0.17014117E39, ~0.123E~2): ~0.10012299E1 ~0.10012299E1 (~0.5877472E~38, 0.123E4, 0.1E~44): ~0.722929E~35 ~0.722929E~35 (~0.5877472E~38, 0.123E4, ~0.1E~44): ~0.722929E~35 ~0.722929E~35 (~0.5877472E~38, 0.123E2, 0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (~0.5877472E~38, 0.123E2, ~0.1E~44): ~0.72292904E~37 ~0.72292904E~37 (~0.5877472E~38, 0.31415927E1, ~0.11754944E~37): ~0.30219568E~37 ~0.30219568E~37 (~0.5877472E~38, 0.31415927E1, ~0.5877472E~38): ~0.24342096E~37 ~0.24342096E~37 (~0.5877472E~38, 0.123, 0.11754944E~37): 0.11032015E~37 0.11032015E~37 (~0.5877472E~38, 0.123, 0.5877472E~38): 0.5154543E~38 0.5154543E~38 (~0.5877472E~38, 0.123, 0.1E~44): ~0.722927E~39 ~0.722927E~39 (~0.5877472E~38, 0.123, 0.0): ~0.722928E~39 ~0.722928E~39 (~0.5877472E~38, 0.123, ~0.11754944E~37): ~0.12477872E~37 ~0.12477872E~37 (~0.5877472E~38, 0.123, ~0.5877472E~38): ~0.66004E~38 ~0.66004E~38 (~0.5877472E~38, 0.123, ~0.1E~44): ~0.72293E~39 ~0.72293E~39 (~0.5877472E~38, 0.123, ~0.0): ~0.722928E~39 ~0.722928E~39 (~0.5877472E~38, 0.123E~2, 0.11754944E~37): 0.11747714E~37 0.11747714E~37 (~0.5877472E~38, 0.123E~2, 0.5877472E~38): 0.5870242E~38 0.5870242E~38 (~0.5877472E~38, 0.123E~2, 0.1E~44): ~0.7228E~41 ~0.7228E~41 (~0.5877472E~38, 0.123E~2, 0.0): ~0.7229E~41 ~0.7229E~41 (~0.5877472E~38, 0.123E~2, ~0.11754944E~37): ~0.11762173E~37 ~0.11762173E~37 (~0.5877472E~38, 0.123E~2, ~0.5877472E~38): ~0.5884701E~38 ~0.5884701E~38 (~0.5877472E~38, 0.123E~2, ~0.1E~44): ~0.723E~41 ~0.723E~41 (~0.5877472E~38, 0.123E~2, ~0.0): ~0.7229E~41 ~0.7229E~41 (~0.5877472E~38, 0.11754944E~37, 0.0): ~0.0 ~0.0 (~0.5877472E~38, 0.11754944E~37, ~0.0): ~0.0 ~0.0 (~0.5877472E~38, 0.5877472E~38, 0.0): ~0.0 ~0.0 (~0.5877472E~38, 0.5877472E~38, ~0.0): ~0.0 ~0.0 (~0.5877472E~38, 0.1E~44, 0.0): ~0.0 ~0.0 (~0.5877472E~38, 0.1E~44, ~0.0): ~0.0 ~0.0 (~0.5877472E~38, ~0.34028235E39, 0.123E4): 0.1232E4 0.1232E4 (~0.5877472E~38, ~0.34028235E39, 0.123E2): 0.143E2 0.143E2 (~0.5877472E~38, ~0.34028235E39, 0.31415927E1): 0.51415925E1 0.51415925E1 (~0.5877472E~38, ~0.34028235E39, 0.27182817E1): 0.47182817E1 0.47182817E1 (~0.5877472E~38, ~0.34028235E39, 0.123E1): 0.323E1 0.323E1 (~0.5877472E~38, ~0.34028235E39, 0.123): 0.2123E1 0.2123E1 (~0.5877472E~38, ~0.34028235E39, 0.123E~2): 0.20012298E1 0.20012298E1 (~0.5877472E~38, ~0.34028235E39, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.5877472E~38, ~0.34028235E39, ~0.123E2): ~0.103E2 ~0.103E2 (~0.5877472E~38, ~0.34028235E39, ~0.123): 0.18769999E1 0.18769999E1 (~0.5877472E~38, ~0.34028235E39, ~0.123E~2): 0.19987699E1 0.19987699E1 (~0.5877472E~38, ~0.17014117E39, 0.123E4): 0.1231E4 0.1231E4 (~0.5877472E~38, ~0.17014117E39, 0.123E2): 0.133E2 0.133E2 (~0.5877472E~38, ~0.17014117E39, 0.31415927E1): 0.41415925E1 0.41415925E1 (~0.5877472E~38, ~0.17014117E39, 0.27182817E1): 0.37182817E1 0.37182817E1 (~0.5877472E~38, ~0.17014117E39, 0.123E1): 0.223E1 0.223E1 (~0.5877472E~38, ~0.17014117E39, 0.123): 0.11229999E1 0.11229999E1 (~0.5877472E~38, ~0.17014117E39, 0.123E~2): 0.10012299E1 0.10012299E1 (~0.5877472E~38, ~0.17014117E39, ~0.123E4): ~0.1229E4 ~0.1229E4 (~0.5877472E~38, ~0.17014117E39, ~0.123E2): ~0.113E2 ~0.113E2 (~0.5877472E~38, ~0.17014117E39, ~0.31415927E1): ~0.21415927E1 ~0.21415927E1 (~0.5877472E~38, ~0.17014117E39, ~0.27182817E1): ~0.17182817E1 ~0.17182817E1 (~0.5877472E~38, ~0.17014117E39, ~0.123): 0.8769999 0.8769999 (~0.5877472E~38, ~0.17014117E39, ~0.123E~2): 0.99876994 0.99876994 (~0.5877472E~38, ~0.123E4, 0.1E~44): 0.722929E~35 0.722929E~35 (~0.5877472E~38, ~0.123E4, ~0.1E~44): 0.722929E~35 0.722929E~35 (~0.5877472E~38, ~0.123E2, 0.1E~44): 0.72292904E~37 0.72292904E~37 (~0.5877472E~38, ~0.123E2, ~0.1E~44): 0.72292904E~37 0.72292904E~37 (~0.5877472E~38, ~0.31415927E1, 0.11754944E~37): 0.30219568E~37 0.30219568E~37 (~0.5877472E~38, ~0.31415927E1, 0.5877472E~38): 0.24342096E~37 0.24342096E~37 (~0.5877472E~38, ~0.123, 0.11754944E~37): 0.12477872E~37 0.12477872E~37 (~0.5877472E~38, ~0.123, 0.5877472E~38): 0.66004E~38 0.66004E~38 (~0.5877472E~38, ~0.123, 0.1E~44): 0.72293E~39 0.72293E~39 (~0.5877472E~38, ~0.123, 0.0): 0.722928E~39 0.722928E~39 (~0.5877472E~38, ~0.123, ~0.11754944E~37): ~0.11032015E~37 ~0.11032015E~37 (~0.5877472E~38, ~0.123, ~0.5877472E~38): ~0.5154543E~38 ~0.5154543E~38 (~0.5877472E~38, ~0.123, ~0.1E~44): 0.722927E~39 0.722927E~39 (~0.5877472E~38, ~0.123, ~0.0): 0.722928E~39 0.722928E~39 (~0.5877472E~38, ~0.123E~2, 0.11754944E~37): 0.11762173E~37 0.11762173E~37 (~0.5877472E~38, ~0.123E~2, 0.5877472E~38): 0.5884701E~38 0.5884701E~38 (~0.5877472E~38, ~0.123E~2, 0.1E~44): 0.723E~41 0.723E~41 (~0.5877472E~38, ~0.123E~2, 0.0): 0.7229E~41 0.7229E~41 (~0.5877472E~38, ~0.123E~2, ~0.11754944E~37): ~0.11747714E~37 ~0.11747714E~37 (~0.5877472E~38, ~0.123E~2, ~0.5877472E~38): ~0.5870242E~38 ~0.5870242E~38 (~0.5877472E~38, ~0.123E~2, ~0.1E~44): 0.7228E~41 0.7228E~41 (~0.5877472E~38, ~0.123E~2, ~0.0): 0.7229E~41 0.7229E~41 (~0.5877472E~38, ~0.11754944E~37, 0.0): 0.0 0.0 (~0.5877472E~38, ~0.11754944E~37, ~0.0): 0.0 0.0 (~0.5877472E~38, ~0.5877472E~38, 0.0): 0.0 0.0 (~0.5877472E~38, ~0.5877472E~38, ~0.0): 0.0 0.0 (~0.5877472E~38, ~0.1E~44, 0.0): 0.0 0.0 (~0.5877472E~38, ~0.1E~44, ~0.0): 0.0 0.0 (~0.1E~44, 0.34028235E39, 0.123E4): 0.123E4 0.123E4 (~0.1E~44, 0.34028235E39, 0.123E2): 0.123E2 0.123E2 (~0.1E~44, 0.34028235E39, 0.31415927E1): 0.31415923E1 0.31415923E1 (~0.1E~44, 0.34028235E39, 0.27182817E1): 0.27182813E1 0.27182813E1 (~0.1E~44, 0.34028235E39, 0.123E1): 0.12299995E1 0.12299995E1 (~0.1E~44, 0.34028235E39, 0.123): 0.12299953 0.12299953 (~0.1E~44, 0.34028235E39, 0.123E~2): 0.12295232E~2 0.12295232E~2 (~0.1E~44, 0.34028235E39, ~0.123E4): ~0.123E4 ~0.123E4 (~0.1E~44, 0.34028235E39, ~0.123E2): ~0.123E2 ~0.123E2 (~0.1E~44, 0.34028235E39, ~0.31415927E1): ~0.31415932E1 ~0.31415932E1 (~0.1E~44, 0.34028235E39, ~0.27182817E1): ~0.27182822E1 ~0.27182822E1 (~0.1E~44, 0.34028235E39, ~0.123E1): ~0.12300005E1 ~0.12300005E1 (~0.1E~44, 0.34028235E39, ~0.123): ~0.12300048 ~0.12300048 (~0.1E~44, 0.34028235E39, ~0.123E~2): ~0.12304769E~2 ~0.12304769E~2 (~0.1E~44, 0.17014117E39, 0.123E4): 0.123E4 0.123E4 (~0.1E~44, 0.17014117E39, 0.123E2): 0.123E2 0.123E2 (~0.1E~44, 0.17014117E39, 0.31415927E1): 0.31415925E1 0.31415925E1 (~0.1E~44, 0.17014117E39, 0.27182817E1): 0.27182815E1 0.27182815E1 (~0.1E~44, 0.17014117E39, 0.123E1): 0.12299998E1 0.12299998E1 (~0.1E~44, 0.17014117E39, 0.123): 0.122999765 0.122999765 (~0.1E~44, 0.17014117E39, 0.123E~2): 0.12297616E~2 0.12297616E~2 (~0.1E~44, 0.17014117E39, ~0.123E4): ~0.123E4 ~0.123E4 (~0.1E~44, 0.17014117E39, ~0.123E2): ~0.123E2 ~0.123E2 (~0.1E~44, 0.17014117E39, ~0.31415927E1): ~0.3141593E1 ~0.3141593E1 (~0.1E~44, 0.17014117E39, ~0.27182817E1): ~0.2718282E1 ~0.2718282E1 (~0.1E~44, 0.17014117E39, ~0.123E1): ~0.12300003E1 ~0.12300003E1 (~0.1E~44, 0.17014117E39, ~0.123): ~0.12300024 ~0.12300024 (~0.1E~44, 0.17014117E39, ~0.123E~2): ~0.12302385E~2 ~0.12302385E~2 (~0.1E~44, 0.123E2, 0.11754944E~37): 0.11754927E~37 0.11754927E~37 (~0.1E~44, 0.123E2, 0.5877472E~38): 0.5877455E~38 0.5877455E~38 (~0.1E~44, 0.123E2, 0.1E~44): ~0.15E~43 ~0.15E~43 (~0.1E~44, 0.123E2, 0.0): ~0.17E~43 ~0.17E~43 (~0.1E~44, 0.123E2, ~0.11754944E~37): ~0.1175496E~37 ~0.1175496E~37 (~0.1E~44, 0.123E2, ~0.5877472E~38): ~0.5877489E~38 ~0.5877489E~38 (~0.1E~44, 0.123E2, ~0.1E~44): ~0.18E~43 ~0.18E~43 (~0.1E~44, 0.123E2, ~0.0): ~0.17E~43 ~0.17E~43 (~0.1E~44, 0.31415927E1, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (~0.1E~44, 0.31415927E1, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (~0.1E~44, 0.31415927E1, 0.1E~44): ~0.3E~44 ~0.3E~44 (~0.1E~44, 0.31415927E1, 0.0): ~0.4E~44 ~0.4E~44 (~0.1E~44, 0.31415927E1, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (~0.1E~44, 0.31415927E1, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (~0.1E~44, 0.31415927E1, ~0.1E~44): ~0.6E~44 ~0.6E~44 (~0.1E~44, 0.31415927E1, ~0.0): ~0.4E~44 ~0.4E~44 (~0.1E~44, 0.27182817E1, 0.11754944E~37): 0.1175494E~37 0.1175494E~37 (~0.1E~44, 0.27182817E1, 0.5877472E~38): 0.5877468E~38 0.5877468E~38 (~0.1E~44, 0.27182817E1, 0.1E~44): ~0.3E~44 ~0.3E~44 (~0.1E~44, 0.27182817E1, 0.0): ~0.4E~44 ~0.4E~44 (~0.1E~44, 0.27182817E1, ~0.11754944E~37): ~0.11754948E~37 ~0.11754948E~37 (~0.1E~44, 0.27182817E1, ~0.5877472E~38): ~0.5877476E~38 ~0.5877476E~38 (~0.1E~44, 0.27182817E1, ~0.1E~44): ~0.6E~44 ~0.6E~44 (~0.1E~44, 0.27182817E1, ~0.0): ~0.4E~44 ~0.4E~44 (~0.1E~44, 0.123E1, 0.11754944E~37): 0.11754942E~37 0.11754942E~37 (~0.1E~44, 0.123E1, 0.5877472E~38): 0.587747E~38 0.587747E~38 (~0.1E~44, 0.123E1, 0.1E~44): ~0.0 ~0.0 (~0.1E~44, 0.123E1, 0.0): ~0.1E~44 ~0.1E~44 (~0.1E~44, 0.123E1, ~0.11754944E~37): ~0.11754945E~37 ~0.11754945E~37 (~0.1E~44, 0.123E1, ~0.5877472E~38): ~0.5877473E~38 ~0.5877473E~38 (~0.1E~44, 0.123E1, ~0.1E~44): ~0.3E~44 ~0.3E~44 (~0.1E~44, 0.123E1, ~0.0): ~0.1E~44 ~0.1E~44 (~0.1E~44, 0.123, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.1E~44, 0.123, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.1E~44, 0.123, 0.1E~44): 0.1E~44 0.1E~44 (~0.1E~44, 0.123, 0.0): ~0.0 ~0.0 (~0.1E~44, 0.123, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.1E~44, 0.123, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.1E~44, 0.123, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.1E~44, 0.123, ~0.0): ~0.0 ~0.0 (~0.1E~44, 0.123E~2, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.1E~44, 0.123E~2, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.1E~44, 0.123E~2, 0.1E~44): 0.1E~44 0.1E~44 (~0.1E~44, 0.123E~2, 0.0): ~0.0 ~0.0 (~0.1E~44, 0.123E~2, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.1E~44, 0.123E~2, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.1E~44, 0.123E~2, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.1E~44, 0.123E~2, ~0.0): ~0.0 ~0.0 (~0.1E~44, 0.11754944E~37, 0.0): ~0.0 ~0.0 (~0.1E~44, 0.11754944E~37, ~0.0): ~0.0 ~0.0 (~0.1E~44, 0.5877472E~38, 0.0): ~0.0 ~0.0 (~0.1E~44, 0.5877472E~38, ~0.0): ~0.0 ~0.0 (~0.1E~44, 0.1E~44, 0.0): ~0.0 ~0.0 (~0.1E~44, 0.1E~44, ~0.0): ~0.0 ~0.0 (~0.1E~44, ~0.34028235E39, 0.123E4): 0.123E4 0.123E4 (~0.1E~44, ~0.34028235E39, 0.123E2): 0.123E2 0.123E2 (~0.1E~44, ~0.34028235E39, 0.31415927E1): 0.31415932E1 0.31415932E1 (~0.1E~44, ~0.34028235E39, 0.27182817E1): 0.27182822E1 0.27182822E1 (~0.1E~44, ~0.34028235E39, 0.123E1): 0.12300005E1 0.12300005E1 (~0.1E~44, ~0.34028235E39, 0.123): 0.12300048 0.12300048 (~0.1E~44, ~0.34028235E39, 0.123E~2): 0.12304769E~2 0.12304769E~2 (~0.1E~44, ~0.34028235E39, ~0.123E4): ~0.123E4 ~0.123E4 (~0.1E~44, ~0.34028235E39, ~0.123E2): ~0.123E2 ~0.123E2 (~0.1E~44, ~0.34028235E39, ~0.31415927E1): ~0.31415923E1 ~0.31415923E1 (~0.1E~44, ~0.34028235E39, ~0.27182817E1): ~0.27182813E1 ~0.27182813E1 (~0.1E~44, ~0.34028235E39, ~0.123E1): ~0.12299995E1 ~0.12299995E1 (~0.1E~44, ~0.34028235E39, ~0.123): ~0.12299953 ~0.12299953 (~0.1E~44, ~0.34028235E39, ~0.123E~2): ~0.12295232E~2 ~0.12295232E~2 (~0.1E~44, ~0.17014117E39, 0.123E4): 0.123E4 0.123E4 (~0.1E~44, ~0.17014117E39, 0.123E2): 0.123E2 0.123E2 (~0.1E~44, ~0.17014117E39, 0.31415927E1): 0.3141593E1 0.3141593E1 (~0.1E~44, ~0.17014117E39, 0.27182817E1): 0.2718282E1 0.2718282E1 (~0.1E~44, ~0.17014117E39, 0.123E1): 0.12300003E1 0.12300003E1 (~0.1E~44, ~0.17014117E39, 0.123): 0.12300024 0.12300024 (~0.1E~44, ~0.17014117E39, 0.123E~2): 0.12302385E~2 0.12302385E~2 (~0.1E~44, ~0.17014117E39, ~0.123E4): ~0.123E4 ~0.123E4 (~0.1E~44, ~0.17014117E39, ~0.123E2): ~0.123E2 ~0.123E2 (~0.1E~44, ~0.17014117E39, ~0.31415927E1): ~0.31415925E1 ~0.31415925E1 (~0.1E~44, ~0.17014117E39, ~0.27182817E1): ~0.27182815E1 ~0.27182815E1 (~0.1E~44, ~0.17014117E39, ~0.123E1): ~0.12299998E1 ~0.12299998E1 (~0.1E~44, ~0.17014117E39, ~0.123): ~0.122999765 ~0.122999765 (~0.1E~44, ~0.17014117E39, ~0.123E~2): ~0.12297616E~2 ~0.12297616E~2 (~0.1E~44, ~0.123E2, 0.11754944E~37): 0.1175496E~37 0.1175496E~37 (~0.1E~44, ~0.123E2, 0.5877472E~38): 0.5877489E~38 0.5877489E~38 (~0.1E~44, ~0.123E2, 0.1E~44): 0.18E~43 0.18E~43 (~0.1E~44, ~0.123E2, 0.0): 0.17E~43 0.17E~43 (~0.1E~44, ~0.123E2, ~0.11754944E~37): ~0.11754927E~37 ~0.11754927E~37 (~0.1E~44, ~0.123E2, ~0.5877472E~38): ~0.5877455E~38 ~0.5877455E~38 (~0.1E~44, ~0.123E2, ~0.1E~44): 0.15E~43 0.15E~43 (~0.1E~44, ~0.123E2, ~0.0): 0.17E~43 0.17E~43 (~0.1E~44, ~0.31415927E1, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (~0.1E~44, ~0.31415927E1, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (~0.1E~44, ~0.31415927E1, 0.1E~44): 0.6E~44 0.6E~44 (~0.1E~44, ~0.31415927E1, 0.0): 0.4E~44 0.4E~44 (~0.1E~44, ~0.31415927E1, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (~0.1E~44, ~0.31415927E1, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (~0.1E~44, ~0.31415927E1, ~0.1E~44): 0.3E~44 0.3E~44 (~0.1E~44, ~0.31415927E1, ~0.0): 0.4E~44 0.4E~44 (~0.1E~44, ~0.27182817E1, 0.11754944E~37): 0.11754948E~37 0.11754948E~37 (~0.1E~44, ~0.27182817E1, 0.5877472E~38): 0.5877476E~38 0.5877476E~38 (~0.1E~44, ~0.27182817E1, 0.1E~44): 0.6E~44 0.6E~44 (~0.1E~44, ~0.27182817E1, 0.0): 0.4E~44 0.4E~44 (~0.1E~44, ~0.27182817E1, ~0.11754944E~37): ~0.1175494E~37 ~0.1175494E~37 (~0.1E~44, ~0.27182817E1, ~0.5877472E~38): ~0.5877468E~38 ~0.5877468E~38 (~0.1E~44, ~0.27182817E1, ~0.1E~44): 0.3E~44 0.3E~44 (~0.1E~44, ~0.27182817E1, ~0.0): 0.4E~44 0.4E~44 (~0.1E~44, ~0.123E1, 0.11754944E~37): 0.11754945E~37 0.11754945E~37 (~0.1E~44, ~0.123E1, 0.5877472E~38): 0.5877473E~38 0.5877473E~38 (~0.1E~44, ~0.123E1, 0.1E~44): 0.3E~44 0.3E~44 (~0.1E~44, ~0.123E1, 0.0): 0.1E~44 0.1E~44 (~0.1E~44, ~0.123E1, ~0.11754944E~37): ~0.11754942E~37 ~0.11754942E~37 (~0.1E~44, ~0.123E1, ~0.5877472E~38): ~0.587747E~38 ~0.587747E~38 (~0.1E~44, ~0.123E1, ~0.1E~44): 0.0 0.0 (~0.1E~44, ~0.123E1, ~0.0): 0.1E~44 0.1E~44 (~0.1E~44, ~0.123, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.1E~44, ~0.123, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.1E~44, ~0.123, 0.1E~44): 0.1E~44 0.1E~44 (~0.1E~44, ~0.123, 0.0): 0.0 0.0 (~0.1E~44, ~0.123, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.1E~44, ~0.123, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.1E~44, ~0.123, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.1E~44, ~0.123, ~0.0): 0.0 0.0 (~0.1E~44, ~0.123E~2, 0.11754944E~37): 0.11754944E~37 0.11754944E~37 (~0.1E~44, ~0.123E~2, 0.5877472E~38): 0.5877472E~38 0.5877472E~38 (~0.1E~44, ~0.123E~2, 0.1E~44): 0.1E~44 0.1E~44 (~0.1E~44, ~0.123E~2, 0.0): 0.0 0.0 (~0.1E~44, ~0.123E~2, ~0.11754944E~37): ~0.11754944E~37 ~0.11754944E~37 (~0.1E~44, ~0.123E~2, ~0.5877472E~38): ~0.5877472E~38 ~0.5877472E~38 (~0.1E~44, ~0.123E~2, ~0.1E~44): ~0.1E~44 ~0.1E~44 (~0.1E~44, ~0.123E~2, ~0.0): 0.0 0.0 (~0.1E~44, ~0.11754944E~37, 0.0): 0.0 0.0 (~0.1E~44, ~0.11754944E~37, ~0.0): 0.0 0.0 (~0.1E~44, ~0.5877472E~38, 0.0): 0.0 0.0 (~0.1E~44, ~0.5877472E~38, ~0.0): 0.0 0.0 (~0.1E~44, ~0.1E~44, 0.0): 0.0 0.0 (~0.1E~44, ~0.1E~44, ~0.0): 0.0 0.0 Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.34028235E39, 0.34028235E39) = false > (0.34028235E39, 0.34028235E39) = false == (0.34028235E39, 0.34028235E39) = true ?= (0.34028235E39, 0.34028235E39) = true < (0.34028235E39, 0.17014117E39) = false > (0.34028235E39, 0.17014117E39) = true == (0.34028235E39, 0.17014117E39) = false ?= (0.34028235E39, 0.17014117E39) = false < (0.34028235E39, 0.123E4) = false > (0.34028235E39, 0.123E4) = true == (0.34028235E39, 0.123E4) = false ?= (0.34028235E39, 0.123E4) = false < (0.34028235E39, 0.123E2) = false > (0.34028235E39, 0.123E2) = true == (0.34028235E39, 0.123E2) = false ?= (0.34028235E39, 0.123E2) = false < (0.34028235E39, 0.31415927E1) = false > (0.34028235E39, 0.31415927E1) = true == (0.34028235E39, 0.31415927E1) = false ?= (0.34028235E39, 0.31415927E1) = false < (0.34028235E39, 0.27182817E1) = false > (0.34028235E39, 0.27182817E1) = true == (0.34028235E39, 0.27182817E1) = false ?= (0.34028235E39, 0.27182817E1) = false < (0.34028235E39, 0.123E1) = false > (0.34028235E39, 0.123E1) = true == (0.34028235E39, 0.123E1) = false ?= (0.34028235E39, 0.123E1) = false < (0.34028235E39, 0.123) = false > (0.34028235E39, 0.123) = true == (0.34028235E39, 0.123) = false ?= (0.34028235E39, 0.123) = false < (0.34028235E39, 0.123E~2) = false > (0.34028235E39, 0.123E~2) = true == (0.34028235E39, 0.123E~2) = false ?= (0.34028235E39, 0.123E~2) = false < (0.34028235E39, 0.11754944E~37) = false > (0.34028235E39, 0.11754944E~37) = true == (0.34028235E39, 0.11754944E~37) = false ?= (0.34028235E39, 0.11754944E~37) = false < (0.34028235E39, 0.5877472E~38) = false > (0.34028235E39, 0.5877472E~38) = true == (0.34028235E39, 0.5877472E~38) = false ?= (0.34028235E39, 0.5877472E~38) = false < (0.34028235E39, 0.1E~44) = false > (0.34028235E39, 0.1E~44) = true == (0.34028235E39, 0.1E~44) = false ?= (0.34028235E39, 0.1E~44) = false < (0.34028235E39, 0.0) = false > (0.34028235E39, 0.0) = true == (0.34028235E39, 0.0) = false ?= (0.34028235E39, 0.0) = false < (0.34028235E39, ~0.34028235E39) = false > (0.34028235E39, ~0.34028235E39) = true == (0.34028235E39, ~0.34028235E39) = false ?= (0.34028235E39, ~0.34028235E39) = false < (0.34028235E39, ~0.17014117E39) = false > (0.34028235E39, ~0.17014117E39) = true == (0.34028235E39, ~0.17014117E39) = false ?= (0.34028235E39, ~0.17014117E39) = false < (0.34028235E39, ~0.123E4) = false > (0.34028235E39, ~0.123E4) = true == (0.34028235E39, ~0.123E4) = false ?= (0.34028235E39, ~0.123E4) = false < (0.34028235E39, ~0.123E2) = false > (0.34028235E39, ~0.123E2) = true == (0.34028235E39, ~0.123E2) = false ?= (0.34028235E39, ~0.123E2) = false < (0.34028235E39, ~0.31415927E1) = false > (0.34028235E39, ~0.31415927E1) = true == (0.34028235E39, ~0.31415927E1) = false ?= (0.34028235E39, ~0.31415927E1) = false < (0.34028235E39, ~0.27182817E1) = false > (0.34028235E39, ~0.27182817E1) = true == (0.34028235E39, ~0.27182817E1) = false ?= (0.34028235E39, ~0.27182817E1) = false < (0.34028235E39, ~0.123E1) = false > (0.34028235E39, ~0.123E1) = true == (0.34028235E39, ~0.123E1) = false ?= (0.34028235E39, ~0.123E1) = false < (0.34028235E39, ~0.123) = false > (0.34028235E39, ~0.123) = true == (0.34028235E39, ~0.123) = false ?= (0.34028235E39, ~0.123) = false < (0.34028235E39, ~0.123E~2) = false > (0.34028235E39, ~0.123E~2) = true == (0.34028235E39, ~0.123E~2) = false ?= (0.34028235E39, ~0.123E~2) = false < (0.34028235E39, ~0.11754944E~37) = false > (0.34028235E39, ~0.11754944E~37) = true == (0.34028235E39, ~0.11754944E~37) = false ?= (0.34028235E39, ~0.11754944E~37) = false < (0.34028235E39, ~0.5877472E~38) = false > (0.34028235E39, ~0.5877472E~38) = true == (0.34028235E39, ~0.5877472E~38) = false ?= (0.34028235E39, ~0.5877472E~38) = false < (0.34028235E39, ~0.1E~44) = false > (0.34028235E39, ~0.1E~44) = true == (0.34028235E39, ~0.1E~44) = false ?= (0.34028235E39, ~0.1E~44) = false < (0.34028235E39, ~0.0) = false > (0.34028235E39, ~0.0) = true == (0.34028235E39, ~0.0) = false ?= (0.34028235E39, ~0.0) = false < (0.17014117E39, 0.34028235E39) = true > (0.17014117E39, 0.34028235E39) = false == (0.17014117E39, 0.34028235E39) = false ?= (0.17014117E39, 0.34028235E39) = false < (0.17014117E39, 0.17014117E39) = false > (0.17014117E39, 0.17014117E39) = false == (0.17014117E39, 0.17014117E39) = true ?= (0.17014117E39, 0.17014117E39) = true < (0.17014117E39, 0.123E4) = false > (0.17014117E39, 0.123E4) = true == (0.17014117E39, 0.123E4) = false ?= (0.17014117E39, 0.123E4) = false < (0.17014117E39, 0.123E2) = false > (0.17014117E39, 0.123E2) = true == (0.17014117E39, 0.123E2) = false ?= (0.17014117E39, 0.123E2) = false < (0.17014117E39, 0.31415927E1) = false > (0.17014117E39, 0.31415927E1) = true == (0.17014117E39, 0.31415927E1) = false ?= (0.17014117E39, 0.31415927E1) = false < (0.17014117E39, 0.27182817E1) = false > (0.17014117E39, 0.27182817E1) = true == (0.17014117E39, 0.27182817E1) = false ?= (0.17014117E39, 0.27182817E1) = false < (0.17014117E39, 0.123E1) = false > (0.17014117E39, 0.123E1) = true == (0.17014117E39, 0.123E1) = false ?= (0.17014117E39, 0.123E1) = false < (0.17014117E39, 0.123) = false > (0.17014117E39, 0.123) = true == (0.17014117E39, 0.123) = false ?= (0.17014117E39, 0.123) = false < (0.17014117E39, 0.123E~2) = false > (0.17014117E39, 0.123E~2) = true == (0.17014117E39, 0.123E~2) = false ?= (0.17014117E39, 0.123E~2) = false < (0.17014117E39, 0.11754944E~37) = false > (0.17014117E39, 0.11754944E~37) = true == (0.17014117E39, 0.11754944E~37) = false ?= (0.17014117E39, 0.11754944E~37) = false < (0.17014117E39, 0.5877472E~38) = false > (0.17014117E39, 0.5877472E~38) = true == (0.17014117E39, 0.5877472E~38) = false ?= (0.17014117E39, 0.5877472E~38) = false < (0.17014117E39, 0.1E~44) = false > (0.17014117E39, 0.1E~44) = true == (0.17014117E39, 0.1E~44) = false ?= (0.17014117E39, 0.1E~44) = false < (0.17014117E39, 0.0) = false > (0.17014117E39, 0.0) = true == (0.17014117E39, 0.0) = false ?= (0.17014117E39, 0.0) = false < (0.17014117E39, ~0.34028235E39) = false > (0.17014117E39, ~0.34028235E39) = true == (0.17014117E39, ~0.34028235E39) = false ?= (0.17014117E39, ~0.34028235E39) = false < (0.17014117E39, ~0.17014117E39) = false > (0.17014117E39, ~0.17014117E39) = true == (0.17014117E39, ~0.17014117E39) = false ?= (0.17014117E39, ~0.17014117E39) = false < (0.17014117E39, ~0.123E4) = false > (0.17014117E39, ~0.123E4) = true == (0.17014117E39, ~0.123E4) = false ?= (0.17014117E39, ~0.123E4) = false < (0.17014117E39, ~0.123E2) = false > (0.17014117E39, ~0.123E2) = true == (0.17014117E39, ~0.123E2) = false ?= (0.17014117E39, ~0.123E2) = false < (0.17014117E39, ~0.31415927E1) = false > (0.17014117E39, ~0.31415927E1) = true == (0.17014117E39, ~0.31415927E1) = false ?= (0.17014117E39, ~0.31415927E1) = false < (0.17014117E39, ~0.27182817E1) = false > (0.17014117E39, ~0.27182817E1) = true == (0.17014117E39, ~0.27182817E1) = false ?= (0.17014117E39, ~0.27182817E1) = false < (0.17014117E39, ~0.123E1) = false > (0.17014117E39, ~0.123E1) = true == (0.17014117E39, ~0.123E1) = false ?= (0.17014117E39, ~0.123E1) = false < (0.17014117E39, ~0.123) = false > (0.17014117E39, ~0.123) = true == (0.17014117E39, ~0.123) = false ?= (0.17014117E39, ~0.123) = false < (0.17014117E39, ~0.123E~2) = false > (0.17014117E39, ~0.123E~2) = true == (0.17014117E39, ~0.123E~2) = false ?= (0.17014117E39, ~0.123E~2) = false < (0.17014117E39, ~0.11754944E~37) = false > (0.17014117E39, ~0.11754944E~37) = true == (0.17014117E39, ~0.11754944E~37) = false ?= (0.17014117E39, ~0.11754944E~37) = false < (0.17014117E39, ~0.5877472E~38) = false > (0.17014117E39, ~0.5877472E~38) = true == (0.17014117E39, ~0.5877472E~38) = false ?= (0.17014117E39, ~0.5877472E~38) = false < (0.17014117E39, ~0.1E~44) = false > (0.17014117E39, ~0.1E~44) = true == (0.17014117E39, ~0.1E~44) = false ?= (0.17014117E39, ~0.1E~44) = false < (0.17014117E39, ~0.0) = false > (0.17014117E39, ~0.0) = true == (0.17014117E39, ~0.0) = false ?= (0.17014117E39, ~0.0) = false < (0.123E4, 0.34028235E39) = true > (0.123E4, 0.34028235E39) = false == (0.123E4, 0.34028235E39) = false ?= (0.123E4, 0.34028235E39) = false < (0.123E4, 0.17014117E39) = true > (0.123E4, 0.17014117E39) = false == (0.123E4, 0.17014117E39) = false ?= (0.123E4, 0.17014117E39) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.31415927E1) = false > (0.123E4, 0.31415927E1) = true == (0.123E4, 0.31415927E1) = false ?= (0.123E4, 0.31415927E1) = false < (0.123E4, 0.27182817E1) = false > (0.123E4, 0.27182817E1) = true == (0.123E4, 0.27182817E1) = false ?= (0.123E4, 0.27182817E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.11754944E~37) = false > (0.123E4, 0.11754944E~37) = true == (0.123E4, 0.11754944E~37) = false ?= (0.123E4, 0.11754944E~37) = false < (0.123E4, 0.5877472E~38) = false > (0.123E4, 0.5877472E~38) = true == (0.123E4, 0.5877472E~38) = false ?= (0.123E4, 0.5877472E~38) = false < (0.123E4, 0.1E~44) = false > (0.123E4, 0.1E~44) = true == (0.123E4, 0.1E~44) = false ?= (0.123E4, 0.1E~44) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.34028235E39) = false > (0.123E4, ~0.34028235E39) = true == (0.123E4, ~0.34028235E39) = false ?= (0.123E4, ~0.34028235E39) = false < (0.123E4, ~0.17014117E39) = false > (0.123E4, ~0.17014117E39) = true == (0.123E4, ~0.17014117E39) = false ?= (0.123E4, ~0.17014117E39) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.31415927E1) = false > (0.123E4, ~0.31415927E1) = true == (0.123E4, ~0.31415927E1) = false ?= (0.123E4, ~0.31415927E1) = false < (0.123E4, ~0.27182817E1) = false > (0.123E4, ~0.27182817E1) = true == (0.123E4, ~0.27182817E1) = false ?= (0.123E4, ~0.27182817E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.11754944E~37) = false > (0.123E4, ~0.11754944E~37) = true == (0.123E4, ~0.11754944E~37) = false ?= (0.123E4, ~0.11754944E~37) = false < (0.123E4, ~0.5877472E~38) = false > (0.123E4, ~0.5877472E~38) = true == (0.123E4, ~0.5877472E~38) = false ?= (0.123E4, ~0.5877472E~38) = false < (0.123E4, ~0.1E~44) = false > (0.123E4, ~0.1E~44) = true == (0.123E4, ~0.1E~44) = false ?= (0.123E4, ~0.1E~44) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.34028235E39) = true > (0.123E2, 0.34028235E39) = false == (0.123E2, 0.34028235E39) = false ?= (0.123E2, 0.34028235E39) = false < (0.123E2, 0.17014117E39) = true > (0.123E2, 0.17014117E39) = false == (0.123E2, 0.17014117E39) = false ?= (0.123E2, 0.17014117E39) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.31415927E1) = false > (0.123E2, 0.31415927E1) = true == (0.123E2, 0.31415927E1) = false ?= (0.123E2, 0.31415927E1) = false < (0.123E2, 0.27182817E1) = false > (0.123E2, 0.27182817E1) = true == (0.123E2, 0.27182817E1) = false ?= (0.123E2, 0.27182817E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.11754944E~37) = false > (0.123E2, 0.11754944E~37) = true == (0.123E2, 0.11754944E~37) = false ?= (0.123E2, 0.11754944E~37) = false < (0.123E2, 0.5877472E~38) = false > (0.123E2, 0.5877472E~38) = true == (0.123E2, 0.5877472E~38) = false ?= (0.123E2, 0.5877472E~38) = false < (0.123E2, 0.1E~44) = false > (0.123E2, 0.1E~44) = true == (0.123E2, 0.1E~44) = false ?= (0.123E2, 0.1E~44) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.34028235E39) = false > (0.123E2, ~0.34028235E39) = true == (0.123E2, ~0.34028235E39) = false ?= (0.123E2, ~0.34028235E39) = false < (0.123E2, ~0.17014117E39) = false > (0.123E2, ~0.17014117E39) = true == (0.123E2, ~0.17014117E39) = false ?= (0.123E2, ~0.17014117E39) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.31415927E1) = false > (0.123E2, ~0.31415927E1) = true == (0.123E2, ~0.31415927E1) = false ?= (0.123E2, ~0.31415927E1) = false < (0.123E2, ~0.27182817E1) = false > (0.123E2, ~0.27182817E1) = true == (0.123E2, ~0.27182817E1) = false ?= (0.123E2, ~0.27182817E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.11754944E~37) = false > (0.123E2, ~0.11754944E~37) = true == (0.123E2, ~0.11754944E~37) = false ?= (0.123E2, ~0.11754944E~37) = false < (0.123E2, ~0.5877472E~38) = false > (0.123E2, ~0.5877472E~38) = true == (0.123E2, ~0.5877472E~38) = false ?= (0.123E2, ~0.5877472E~38) = false < (0.123E2, ~0.1E~44) = false > (0.123E2, ~0.1E~44) = true == (0.123E2, ~0.1E~44) = false ?= (0.123E2, ~0.1E~44) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.31415927E1, 0.34028235E39) = true > (0.31415927E1, 0.34028235E39) = false == (0.31415927E1, 0.34028235E39) = false ?= (0.31415927E1, 0.34028235E39) = false < (0.31415927E1, 0.17014117E39) = true > (0.31415927E1, 0.17014117E39) = false == (0.31415927E1, 0.17014117E39) = false ?= (0.31415927E1, 0.17014117E39) = false < (0.31415927E1, 0.123E4) = true > (0.31415927E1, 0.123E4) = false == (0.31415927E1, 0.123E4) = false ?= (0.31415927E1, 0.123E4) = false < (0.31415927E1, 0.123E2) = true > (0.31415927E1, 0.123E2) = false == (0.31415927E1, 0.123E2) = false ?= (0.31415927E1, 0.123E2) = false < (0.31415927E1, 0.31415927E1) = false > (0.31415927E1, 0.31415927E1) = false == (0.31415927E1, 0.31415927E1) = true ?= (0.31415927E1, 0.31415927E1) = true < (0.31415927E1, 0.27182817E1) = false > (0.31415927E1, 0.27182817E1) = true == (0.31415927E1, 0.27182817E1) = false ?= (0.31415927E1, 0.27182817E1) = false < (0.31415927E1, 0.123E1) = false > (0.31415927E1, 0.123E1) = true == (0.31415927E1, 0.123E1) = false ?= (0.31415927E1, 0.123E1) = false < (0.31415927E1, 0.123) = false > (0.31415927E1, 0.123) = true == (0.31415927E1, 0.123) = false ?= (0.31415927E1, 0.123) = false < (0.31415927E1, 0.123E~2) = false > (0.31415927E1, 0.123E~2) = true == (0.31415927E1, 0.123E~2) = false ?= (0.31415927E1, 0.123E~2) = false < (0.31415927E1, 0.11754944E~37) = false > (0.31415927E1, 0.11754944E~37) = true == (0.31415927E1, 0.11754944E~37) = false ?= (0.31415927E1, 0.11754944E~37) = false < (0.31415927E1, 0.5877472E~38) = false > (0.31415927E1, 0.5877472E~38) = true == (0.31415927E1, 0.5877472E~38) = false ?= (0.31415927E1, 0.5877472E~38) = false < (0.31415927E1, 0.1E~44) = false > (0.31415927E1, 0.1E~44) = true == (0.31415927E1, 0.1E~44) = false ?= (0.31415927E1, 0.1E~44) = false < (0.31415927E1, 0.0) = false > (0.31415927E1, 0.0) = true == (0.31415927E1, 0.0) = false ?= (0.31415927E1, 0.0) = false < (0.31415927E1, ~0.34028235E39) = false > (0.31415927E1, ~0.34028235E39) = true == (0.31415927E1, ~0.34028235E39) = false ?= (0.31415927E1, ~0.34028235E39) = false < (0.31415927E1, ~0.17014117E39) = false > (0.31415927E1, ~0.17014117E39) = true == (0.31415927E1, ~0.17014117E39) = false ?= (0.31415927E1, ~0.17014117E39) = false < (0.31415927E1, ~0.123E4) = false > (0.31415927E1, ~0.123E4) = true == (0.31415927E1, ~0.123E4) = false ?= (0.31415927E1, ~0.123E4) = false < (0.31415927E1, ~0.123E2) = false > (0.31415927E1, ~0.123E2) = true == (0.31415927E1, ~0.123E2) = false ?= (0.31415927E1, ~0.123E2) = false < (0.31415927E1, ~0.31415927E1) = false > (0.31415927E1, ~0.31415927E1) = true == (0.31415927E1, ~0.31415927E1) = false ?= (0.31415927E1, ~0.31415927E1) = false < (0.31415927E1, ~0.27182817E1) = false > (0.31415927E1, ~0.27182817E1) = true == (0.31415927E1, ~0.27182817E1) = false ?= (0.31415927E1, ~0.27182817E1) = false < (0.31415927E1, ~0.123E1) = false > (0.31415927E1, ~0.123E1) = true == (0.31415927E1, ~0.123E1) = false ?= (0.31415927E1, ~0.123E1) = false < (0.31415927E1, ~0.123) = false > (0.31415927E1, ~0.123) = true == (0.31415927E1, ~0.123) = false ?= (0.31415927E1, ~0.123) = false < (0.31415927E1, ~0.123E~2) = false > (0.31415927E1, ~0.123E~2) = true == (0.31415927E1, ~0.123E~2) = false ?= (0.31415927E1, ~0.123E~2) = false < (0.31415927E1, ~0.11754944E~37) = false > (0.31415927E1, ~0.11754944E~37) = true == (0.31415927E1, ~0.11754944E~37) = false ?= (0.31415927E1, ~0.11754944E~37) = false < (0.31415927E1, ~0.5877472E~38) = false > (0.31415927E1, ~0.5877472E~38) = true == (0.31415927E1, ~0.5877472E~38) = false ?= (0.31415927E1, ~0.5877472E~38) = false < (0.31415927E1, ~0.1E~44) = false > (0.31415927E1, ~0.1E~44) = true == (0.31415927E1, ~0.1E~44) = false ?= (0.31415927E1, ~0.1E~44) = false < (0.31415927E1, ~0.0) = false > (0.31415927E1, ~0.0) = true == (0.31415927E1, ~0.0) = false ?= (0.31415927E1, ~0.0) = false < (0.27182817E1, 0.34028235E39) = true > (0.27182817E1, 0.34028235E39) = false == (0.27182817E1, 0.34028235E39) = false ?= (0.27182817E1, 0.34028235E39) = false < (0.27182817E1, 0.17014117E39) = true > (0.27182817E1, 0.17014117E39) = false == (0.27182817E1, 0.17014117E39) = false ?= (0.27182817E1, 0.17014117E39) = false < (0.27182817E1, 0.123E4) = true > (0.27182817E1, 0.123E4) = false == (0.27182817E1, 0.123E4) = false ?= (0.27182817E1, 0.123E4) = false < (0.27182817E1, 0.123E2) = true > (0.27182817E1, 0.123E2) = false == (0.27182817E1, 0.123E2) = false ?= (0.27182817E1, 0.123E2) = false < (0.27182817E1, 0.31415927E1) = true > (0.27182817E1, 0.31415927E1) = false == (0.27182817E1, 0.31415927E1) = false ?= (0.27182817E1, 0.31415927E1) = false < (0.27182817E1, 0.27182817E1) = false > (0.27182817E1, 0.27182817E1) = false == (0.27182817E1, 0.27182817E1) = true ?= (0.27182817E1, 0.27182817E1) = true < (0.27182817E1, 0.123E1) = false > (0.27182817E1, 0.123E1) = true == (0.27182817E1, 0.123E1) = false ?= (0.27182817E1, 0.123E1) = false < (0.27182817E1, 0.123) = false > (0.27182817E1, 0.123) = true == (0.27182817E1, 0.123) = false ?= (0.27182817E1, 0.123) = false < (0.27182817E1, 0.123E~2) = false > (0.27182817E1, 0.123E~2) = true == (0.27182817E1, 0.123E~2) = false ?= (0.27182817E1, 0.123E~2) = false < (0.27182817E1, 0.11754944E~37) = false > (0.27182817E1, 0.11754944E~37) = true == (0.27182817E1, 0.11754944E~37) = false ?= (0.27182817E1, 0.11754944E~37) = false < (0.27182817E1, 0.5877472E~38) = false > (0.27182817E1, 0.5877472E~38) = true == (0.27182817E1, 0.5877472E~38) = false ?= (0.27182817E1, 0.5877472E~38) = false < (0.27182817E1, 0.1E~44) = false > (0.27182817E1, 0.1E~44) = true == (0.27182817E1, 0.1E~44) = false ?= (0.27182817E1, 0.1E~44) = false < (0.27182817E1, 0.0) = false > (0.27182817E1, 0.0) = true == (0.27182817E1, 0.0) = false ?= (0.27182817E1, 0.0) = false < (0.27182817E1, ~0.34028235E39) = false > (0.27182817E1, ~0.34028235E39) = true == (0.27182817E1, ~0.34028235E39) = false ?= (0.27182817E1, ~0.34028235E39) = false < (0.27182817E1, ~0.17014117E39) = false > (0.27182817E1, ~0.17014117E39) = true == (0.27182817E1, ~0.17014117E39) = false ?= (0.27182817E1, ~0.17014117E39) = false < (0.27182817E1, ~0.123E4) = false > (0.27182817E1, ~0.123E4) = true == (0.27182817E1, ~0.123E4) = false ?= (0.27182817E1, ~0.123E4) = false < (0.27182817E1, ~0.123E2) = false > (0.27182817E1, ~0.123E2) = true == (0.27182817E1, ~0.123E2) = false ?= (0.27182817E1, ~0.123E2) = false < (0.27182817E1, ~0.31415927E1) = false > (0.27182817E1, ~0.31415927E1) = true == (0.27182817E1, ~0.31415927E1) = false ?= (0.27182817E1, ~0.31415927E1) = false < (0.27182817E1, ~0.27182817E1) = false > (0.27182817E1, ~0.27182817E1) = true == (0.27182817E1, ~0.27182817E1) = false ?= (0.27182817E1, ~0.27182817E1) = false < (0.27182817E1, ~0.123E1) = false > (0.27182817E1, ~0.123E1) = true == (0.27182817E1, ~0.123E1) = false ?= (0.27182817E1, ~0.123E1) = false < (0.27182817E1, ~0.123) = false > (0.27182817E1, ~0.123) = true == (0.27182817E1, ~0.123) = false ?= (0.27182817E1, ~0.123) = false < (0.27182817E1, ~0.123E~2) = false > (0.27182817E1, ~0.123E~2) = true == (0.27182817E1, ~0.123E~2) = false ?= (0.27182817E1, ~0.123E~2) = false < (0.27182817E1, ~0.11754944E~37) = false > (0.27182817E1, ~0.11754944E~37) = true == (0.27182817E1, ~0.11754944E~37) = false ?= (0.27182817E1, ~0.11754944E~37) = false < (0.27182817E1, ~0.5877472E~38) = false > (0.27182817E1, ~0.5877472E~38) = true == (0.27182817E1, ~0.5877472E~38) = false ?= (0.27182817E1, ~0.5877472E~38) = false < (0.27182817E1, ~0.1E~44) = false > (0.27182817E1, ~0.1E~44) = true == (0.27182817E1, ~0.1E~44) = false ?= (0.27182817E1, ~0.1E~44) = false < (0.27182817E1, ~0.0) = false > (0.27182817E1, ~0.0) = true == (0.27182817E1, ~0.0) = false ?= (0.27182817E1, ~0.0) = false < (0.123E1, 0.34028235E39) = true > (0.123E1, 0.34028235E39) = false == (0.123E1, 0.34028235E39) = false ?= (0.123E1, 0.34028235E39) = false < (0.123E1, 0.17014117E39) = true > (0.123E1, 0.17014117E39) = false == (0.123E1, 0.17014117E39) = false ?= (0.123E1, 0.17014117E39) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.31415927E1) = true > (0.123E1, 0.31415927E1) = false == (0.123E1, 0.31415927E1) = false ?= (0.123E1, 0.31415927E1) = false < (0.123E1, 0.27182817E1) = true > (0.123E1, 0.27182817E1) = false == (0.123E1, 0.27182817E1) = false ?= (0.123E1, 0.27182817E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.11754944E~37) = false > (0.123E1, 0.11754944E~37) = true == (0.123E1, 0.11754944E~37) = false ?= (0.123E1, 0.11754944E~37) = false < (0.123E1, 0.5877472E~38) = false > (0.123E1, 0.5877472E~38) = true == (0.123E1, 0.5877472E~38) = false ?= (0.123E1, 0.5877472E~38) = false < (0.123E1, 0.1E~44) = false > (0.123E1, 0.1E~44) = true == (0.123E1, 0.1E~44) = false ?= (0.123E1, 0.1E~44) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.34028235E39) = false > (0.123E1, ~0.34028235E39) = true == (0.123E1, ~0.34028235E39) = false ?= (0.123E1, ~0.34028235E39) = false < (0.123E1, ~0.17014117E39) = false > (0.123E1, ~0.17014117E39) = true == (0.123E1, ~0.17014117E39) = false ?= (0.123E1, ~0.17014117E39) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.31415927E1) = false > (0.123E1, ~0.31415927E1) = true == (0.123E1, ~0.31415927E1) = false ?= (0.123E1, ~0.31415927E1) = false < (0.123E1, ~0.27182817E1) = false > (0.123E1, ~0.27182817E1) = true == (0.123E1, ~0.27182817E1) = false ?= (0.123E1, ~0.27182817E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.11754944E~37) = false > (0.123E1, ~0.11754944E~37) = true == (0.123E1, ~0.11754944E~37) = false ?= (0.123E1, ~0.11754944E~37) = false < (0.123E1, ~0.5877472E~38) = false > (0.123E1, ~0.5877472E~38) = true == (0.123E1, ~0.5877472E~38) = false ?= (0.123E1, ~0.5877472E~38) = false < (0.123E1, ~0.1E~44) = false > (0.123E1, ~0.1E~44) = true == (0.123E1, ~0.1E~44) = false ?= (0.123E1, ~0.1E~44) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.34028235E39) = true > (0.123, 0.34028235E39) = false == (0.123, 0.34028235E39) = false ?= (0.123, 0.34028235E39) = false < (0.123, 0.17014117E39) = true > (0.123, 0.17014117E39) = false == (0.123, 0.17014117E39) = false ?= (0.123, 0.17014117E39) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.31415927E1) = true > (0.123, 0.31415927E1) = false == (0.123, 0.31415927E1) = false ?= (0.123, 0.31415927E1) = false < (0.123, 0.27182817E1) = true > (0.123, 0.27182817E1) = false == (0.123, 0.27182817E1) = false ?= (0.123, 0.27182817E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.11754944E~37) = false > (0.123, 0.11754944E~37) = true == (0.123, 0.11754944E~37) = false ?= (0.123, 0.11754944E~37) = false < (0.123, 0.5877472E~38) = false > (0.123, 0.5877472E~38) = true == (0.123, 0.5877472E~38) = false ?= (0.123, 0.5877472E~38) = false < (0.123, 0.1E~44) = false > (0.123, 0.1E~44) = true == (0.123, 0.1E~44) = false ?= (0.123, 0.1E~44) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.34028235E39) = false > (0.123, ~0.34028235E39) = true == (0.123, ~0.34028235E39) = false ?= (0.123, ~0.34028235E39) = false < (0.123, ~0.17014117E39) = false > (0.123, ~0.17014117E39) = true == (0.123, ~0.17014117E39) = false ?= (0.123, ~0.17014117E39) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.31415927E1) = false > (0.123, ~0.31415927E1) = true == (0.123, ~0.31415927E1) = false ?= (0.123, ~0.31415927E1) = false < (0.123, ~0.27182817E1) = false > (0.123, ~0.27182817E1) = true == (0.123, ~0.27182817E1) = false ?= (0.123, ~0.27182817E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.11754944E~37) = false > (0.123, ~0.11754944E~37) = true == (0.123, ~0.11754944E~37) = false ?= (0.123, ~0.11754944E~37) = false < (0.123, ~0.5877472E~38) = false > (0.123, ~0.5877472E~38) = true == (0.123, ~0.5877472E~38) = false ?= (0.123, ~0.5877472E~38) = false < (0.123, ~0.1E~44) = false > (0.123, ~0.1E~44) = true == (0.123, ~0.1E~44) = false ?= (0.123, ~0.1E~44) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.34028235E39) = true > (0.123E~2, 0.34028235E39) = false == (0.123E~2, 0.34028235E39) = false ?= (0.123E~2, 0.34028235E39) = false < (0.123E~2, 0.17014117E39) = true > (0.123E~2, 0.17014117E39) = false == (0.123E~2, 0.17014117E39) = false ?= (0.123E~2, 0.17014117E39) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.31415927E1) = true > (0.123E~2, 0.31415927E1) = false == (0.123E~2, 0.31415927E1) = false ?= (0.123E~2, 0.31415927E1) = false < (0.123E~2, 0.27182817E1) = true > (0.123E~2, 0.27182817E1) = false == (0.123E~2, 0.27182817E1) = false ?= (0.123E~2, 0.27182817E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.11754944E~37) = false > (0.123E~2, 0.11754944E~37) = true == (0.123E~2, 0.11754944E~37) = false ?= (0.123E~2, 0.11754944E~37) = false < (0.123E~2, 0.5877472E~38) = false > (0.123E~2, 0.5877472E~38) = true == (0.123E~2, 0.5877472E~38) = false ?= (0.123E~2, 0.5877472E~38) = false < (0.123E~2, 0.1E~44) = false > (0.123E~2, 0.1E~44) = true == (0.123E~2, 0.1E~44) = false ?= (0.123E~2, 0.1E~44) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.34028235E39) = false > (0.123E~2, ~0.34028235E39) = true == (0.123E~2, ~0.34028235E39) = false ?= (0.123E~2, ~0.34028235E39) = false < (0.123E~2, ~0.17014117E39) = false > (0.123E~2, ~0.17014117E39) = true == (0.123E~2, ~0.17014117E39) = false ?= (0.123E~2, ~0.17014117E39) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.31415927E1) = false > (0.123E~2, ~0.31415927E1) = true == (0.123E~2, ~0.31415927E1) = false ?= (0.123E~2, ~0.31415927E1) = false < (0.123E~2, ~0.27182817E1) = false > (0.123E~2, ~0.27182817E1) = true == (0.123E~2, ~0.27182817E1) = false ?= (0.123E~2, ~0.27182817E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.11754944E~37) = false > (0.123E~2, ~0.11754944E~37) = true == (0.123E~2, ~0.11754944E~37) = false ?= (0.123E~2, ~0.11754944E~37) = false < (0.123E~2, ~0.5877472E~38) = false > (0.123E~2, ~0.5877472E~38) = true == (0.123E~2, ~0.5877472E~38) = false ?= (0.123E~2, ~0.5877472E~38) = false < (0.123E~2, ~0.1E~44) = false > (0.123E~2, ~0.1E~44) = true == (0.123E~2, ~0.1E~44) = false ?= (0.123E~2, ~0.1E~44) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.11754944E~37, 0.34028235E39) = true > (0.11754944E~37, 0.34028235E39) = false == (0.11754944E~37, 0.34028235E39) = false ?= (0.11754944E~37, 0.34028235E39) = false < (0.11754944E~37, 0.17014117E39) = true > (0.11754944E~37, 0.17014117E39) = false == (0.11754944E~37, 0.17014117E39) = false ?= (0.11754944E~37, 0.17014117E39) = false < (0.11754944E~37, 0.123E4) = true > (0.11754944E~37, 0.123E4) = false == (0.11754944E~37, 0.123E4) = false ?= (0.11754944E~37, 0.123E4) = false < (0.11754944E~37, 0.123E2) = true > (0.11754944E~37, 0.123E2) = false == (0.11754944E~37, 0.123E2) = false ?= (0.11754944E~37, 0.123E2) = false < (0.11754944E~37, 0.31415927E1) = true > (0.11754944E~37, 0.31415927E1) = false == (0.11754944E~37, 0.31415927E1) = false ?= (0.11754944E~37, 0.31415927E1) = false < (0.11754944E~37, 0.27182817E1) = true > (0.11754944E~37, 0.27182817E1) = false == (0.11754944E~37, 0.27182817E1) = false ?= (0.11754944E~37, 0.27182817E1) = false < (0.11754944E~37, 0.123E1) = true > (0.11754944E~37, 0.123E1) = false == (0.11754944E~37, 0.123E1) = false ?= (0.11754944E~37, 0.123E1) = false < (0.11754944E~37, 0.123) = true > (0.11754944E~37, 0.123) = false == (0.11754944E~37, 0.123) = false ?= (0.11754944E~37, 0.123) = false < (0.11754944E~37, 0.123E~2) = true > (0.11754944E~37, 0.123E~2) = false == (0.11754944E~37, 0.123E~2) = false ?= (0.11754944E~37, 0.123E~2) = false < (0.11754944E~37, 0.11754944E~37) = false > (0.11754944E~37, 0.11754944E~37) = false == (0.11754944E~37, 0.11754944E~37) = true ?= (0.11754944E~37, 0.11754944E~37) = true < (0.11754944E~37, 0.5877472E~38) = false > (0.11754944E~37, 0.5877472E~38) = true == (0.11754944E~37, 0.5877472E~38) = false ?= (0.11754944E~37, 0.5877472E~38) = false < (0.11754944E~37, 0.1E~44) = false > (0.11754944E~37, 0.1E~44) = true == (0.11754944E~37, 0.1E~44) = false ?= (0.11754944E~37, 0.1E~44) = false < (0.11754944E~37, 0.0) = false > (0.11754944E~37, 0.0) = true == (0.11754944E~37, 0.0) = false ?= (0.11754944E~37, 0.0) = false < (0.11754944E~37, ~0.34028235E39) = false > (0.11754944E~37, ~0.34028235E39) = true == (0.11754944E~37, ~0.34028235E39) = false ?= (0.11754944E~37, ~0.34028235E39) = false < (0.11754944E~37, ~0.17014117E39) = false > (0.11754944E~37, ~0.17014117E39) = true == (0.11754944E~37, ~0.17014117E39) = false ?= (0.11754944E~37, ~0.17014117E39) = false < (0.11754944E~37, ~0.123E4) = false > (0.11754944E~37, ~0.123E4) = true == (0.11754944E~37, ~0.123E4) = false ?= (0.11754944E~37, ~0.123E4) = false < (0.11754944E~37, ~0.123E2) = false > (0.11754944E~37, ~0.123E2) = true == (0.11754944E~37, ~0.123E2) = false ?= (0.11754944E~37, ~0.123E2) = false < (0.11754944E~37, ~0.31415927E1) = false > (0.11754944E~37, ~0.31415927E1) = true == (0.11754944E~37, ~0.31415927E1) = false ?= (0.11754944E~37, ~0.31415927E1) = false < (0.11754944E~37, ~0.27182817E1) = false > (0.11754944E~37, ~0.27182817E1) = true == (0.11754944E~37, ~0.27182817E1) = false ?= (0.11754944E~37, ~0.27182817E1) = false < (0.11754944E~37, ~0.123E1) = false > (0.11754944E~37, ~0.123E1) = true == (0.11754944E~37, ~0.123E1) = false ?= (0.11754944E~37, ~0.123E1) = false < (0.11754944E~37, ~0.123) = false > (0.11754944E~37, ~0.123) = true == (0.11754944E~37, ~0.123) = false ?= (0.11754944E~37, ~0.123) = false < (0.11754944E~37, ~0.123E~2) = false > (0.11754944E~37, ~0.123E~2) = true == (0.11754944E~37, ~0.123E~2) = false ?= (0.11754944E~37, ~0.123E~2) = false < (0.11754944E~37, ~0.11754944E~37) = false > (0.11754944E~37, ~0.11754944E~37) = true == (0.11754944E~37, ~0.11754944E~37) = false ?= (0.11754944E~37, ~0.11754944E~37) = false < (0.11754944E~37, ~0.5877472E~38) = false > (0.11754944E~37, ~0.5877472E~38) = true == (0.11754944E~37, ~0.5877472E~38) = false ?= (0.11754944E~37, ~0.5877472E~38) = false < (0.11754944E~37, ~0.1E~44) = false > (0.11754944E~37, ~0.1E~44) = true == (0.11754944E~37, ~0.1E~44) = false ?= (0.11754944E~37, ~0.1E~44) = false < (0.11754944E~37, ~0.0) = false > (0.11754944E~37, ~0.0) = true == (0.11754944E~37, ~0.0) = false ?= (0.11754944E~37, ~0.0) = false < (0.5877472E~38, 0.34028235E39) = true > (0.5877472E~38, 0.34028235E39) = false == (0.5877472E~38, 0.34028235E39) = false ?= (0.5877472E~38, 0.34028235E39) = false < (0.5877472E~38, 0.17014117E39) = true > (0.5877472E~38, 0.17014117E39) = false == (0.5877472E~38, 0.17014117E39) = false ?= (0.5877472E~38, 0.17014117E39) = false < (0.5877472E~38, 0.123E4) = true > (0.5877472E~38, 0.123E4) = false == (0.5877472E~38, 0.123E4) = false ?= (0.5877472E~38, 0.123E4) = false < (0.5877472E~38, 0.123E2) = true > (0.5877472E~38, 0.123E2) = false == (0.5877472E~38, 0.123E2) = false ?= (0.5877472E~38, 0.123E2) = false < (0.5877472E~38, 0.31415927E1) = true > (0.5877472E~38, 0.31415927E1) = false == (0.5877472E~38, 0.31415927E1) = false ?= (0.5877472E~38, 0.31415927E1) = false < (0.5877472E~38, 0.27182817E1) = true > (0.5877472E~38, 0.27182817E1) = false == (0.5877472E~38, 0.27182817E1) = false ?= (0.5877472E~38, 0.27182817E1) = false < (0.5877472E~38, 0.123E1) = true > (0.5877472E~38, 0.123E1) = false == (0.5877472E~38, 0.123E1) = false ?= (0.5877472E~38, 0.123E1) = false < (0.5877472E~38, 0.123) = true > (0.5877472E~38, 0.123) = false == (0.5877472E~38, 0.123) = false ?= (0.5877472E~38, 0.123) = false < (0.5877472E~38, 0.123E~2) = true > (0.5877472E~38, 0.123E~2) = false == (0.5877472E~38, 0.123E~2) = false ?= (0.5877472E~38, 0.123E~2) = false < (0.5877472E~38, 0.11754944E~37) = true > (0.5877472E~38, 0.11754944E~37) = false == (0.5877472E~38, 0.11754944E~37) = false ?= (0.5877472E~38, 0.11754944E~37) = false < (0.5877472E~38, 0.5877472E~38) = false > (0.5877472E~38, 0.5877472E~38) = false == (0.5877472E~38, 0.5877472E~38) = true ?= (0.5877472E~38, 0.5877472E~38) = true < (0.5877472E~38, 0.1E~44) = false > (0.5877472E~38, 0.1E~44) = true == (0.5877472E~38, 0.1E~44) = false ?= (0.5877472E~38, 0.1E~44) = false < (0.5877472E~38, 0.0) = false > (0.5877472E~38, 0.0) = true == (0.5877472E~38, 0.0) = false ?= (0.5877472E~38, 0.0) = false < (0.5877472E~38, ~0.34028235E39) = false > (0.5877472E~38, ~0.34028235E39) = true == (0.5877472E~38, ~0.34028235E39) = false ?= (0.5877472E~38, ~0.34028235E39) = false < (0.5877472E~38, ~0.17014117E39) = false > (0.5877472E~38, ~0.17014117E39) = true == (0.5877472E~38, ~0.17014117E39) = false ?= (0.5877472E~38, ~0.17014117E39) = false < (0.5877472E~38, ~0.123E4) = false > (0.5877472E~38, ~0.123E4) = true == (0.5877472E~38, ~0.123E4) = false ?= (0.5877472E~38, ~0.123E4) = false < (0.5877472E~38, ~0.123E2) = false > (0.5877472E~38, ~0.123E2) = true == (0.5877472E~38, ~0.123E2) = false ?= (0.5877472E~38, ~0.123E2) = false < (0.5877472E~38, ~0.31415927E1) = false > (0.5877472E~38, ~0.31415927E1) = true == (0.5877472E~38, ~0.31415927E1) = false ?= (0.5877472E~38, ~0.31415927E1) = false < (0.5877472E~38, ~0.27182817E1) = false > (0.5877472E~38, ~0.27182817E1) = true == (0.5877472E~38, ~0.27182817E1) = false ?= (0.5877472E~38, ~0.27182817E1) = false < (0.5877472E~38, ~0.123E1) = false > (0.5877472E~38, ~0.123E1) = true == (0.5877472E~38, ~0.123E1) = false ?= (0.5877472E~38, ~0.123E1) = false < (0.5877472E~38, ~0.123) = false > (0.5877472E~38, ~0.123) = true == (0.5877472E~38, ~0.123) = false ?= (0.5877472E~38, ~0.123) = false < (0.5877472E~38, ~0.123E~2) = false > (0.5877472E~38, ~0.123E~2) = true == (0.5877472E~38, ~0.123E~2) = false ?= (0.5877472E~38, ~0.123E~2) = false < (0.5877472E~38, ~0.11754944E~37) = false > (0.5877472E~38, ~0.11754944E~37) = true == (0.5877472E~38, ~0.11754944E~37) = false ?= (0.5877472E~38, ~0.11754944E~37) = false < (0.5877472E~38, ~0.5877472E~38) = false > (0.5877472E~38, ~0.5877472E~38) = true == (0.5877472E~38, ~0.5877472E~38) = false ?= (0.5877472E~38, ~0.5877472E~38) = false < (0.5877472E~38, ~0.1E~44) = false > (0.5877472E~38, ~0.1E~44) = true == (0.5877472E~38, ~0.1E~44) = false ?= (0.5877472E~38, ~0.1E~44) = false < (0.5877472E~38, ~0.0) = false > (0.5877472E~38, ~0.0) = true == (0.5877472E~38, ~0.0) = false ?= (0.5877472E~38, ~0.0) = false < (0.1E~44, 0.34028235E39) = true > (0.1E~44, 0.34028235E39) = false == (0.1E~44, 0.34028235E39) = false ?= (0.1E~44, 0.34028235E39) = false < (0.1E~44, 0.17014117E39) = true > (0.1E~44, 0.17014117E39) = false == (0.1E~44, 0.17014117E39) = false ?= (0.1E~44, 0.17014117E39) = false < (0.1E~44, 0.123E4) = true > (0.1E~44, 0.123E4) = false == (0.1E~44, 0.123E4) = false ?= (0.1E~44, 0.123E4) = false < (0.1E~44, 0.123E2) = true > (0.1E~44, 0.123E2) = false == (0.1E~44, 0.123E2) = false ?= (0.1E~44, 0.123E2) = false < (0.1E~44, 0.31415927E1) = true > (0.1E~44, 0.31415927E1) = false == (0.1E~44, 0.31415927E1) = false ?= (0.1E~44, 0.31415927E1) = false < (0.1E~44, 0.27182817E1) = true > (0.1E~44, 0.27182817E1) = false == (0.1E~44, 0.27182817E1) = false ?= (0.1E~44, 0.27182817E1) = false < (0.1E~44, 0.123E1) = true > (0.1E~44, 0.123E1) = false == (0.1E~44, 0.123E1) = false ?= (0.1E~44, 0.123E1) = false < (0.1E~44, 0.123) = true > (0.1E~44, 0.123) = false == (0.1E~44, 0.123) = false ?= (0.1E~44, 0.123) = false < (0.1E~44, 0.123E~2) = true > (0.1E~44, 0.123E~2) = false == (0.1E~44, 0.123E~2) = false ?= (0.1E~44, 0.123E~2) = false < (0.1E~44, 0.11754944E~37) = true > (0.1E~44, 0.11754944E~37) = false == (0.1E~44, 0.11754944E~37) = false ?= (0.1E~44, 0.11754944E~37) = false < (0.1E~44, 0.5877472E~38) = true > (0.1E~44, 0.5877472E~38) = false == (0.1E~44, 0.5877472E~38) = false ?= (0.1E~44, 0.5877472E~38) = false < (0.1E~44, 0.1E~44) = false > (0.1E~44, 0.1E~44) = false == (0.1E~44, 0.1E~44) = true ?= (0.1E~44, 0.1E~44) = true < (0.1E~44, 0.0) = false > (0.1E~44, 0.0) = true == (0.1E~44, 0.0) = false ?= (0.1E~44, 0.0) = false < (0.1E~44, ~0.34028235E39) = false > (0.1E~44, ~0.34028235E39) = true == (0.1E~44, ~0.34028235E39) = false ?= (0.1E~44, ~0.34028235E39) = false < (0.1E~44, ~0.17014117E39) = false > (0.1E~44, ~0.17014117E39) = true == (0.1E~44, ~0.17014117E39) = false ?= (0.1E~44, ~0.17014117E39) = false < (0.1E~44, ~0.123E4) = false > (0.1E~44, ~0.123E4) = true == (0.1E~44, ~0.123E4) = false ?= (0.1E~44, ~0.123E4) = false < (0.1E~44, ~0.123E2) = false > (0.1E~44, ~0.123E2) = true == (0.1E~44, ~0.123E2) = false ?= (0.1E~44, ~0.123E2) = false < (0.1E~44, ~0.31415927E1) = false > (0.1E~44, ~0.31415927E1) = true == (0.1E~44, ~0.31415927E1) = false ?= (0.1E~44, ~0.31415927E1) = false < (0.1E~44, ~0.27182817E1) = false > (0.1E~44, ~0.27182817E1) = true == (0.1E~44, ~0.27182817E1) = false ?= (0.1E~44, ~0.27182817E1) = false < (0.1E~44, ~0.123E1) = false > (0.1E~44, ~0.123E1) = true == (0.1E~44, ~0.123E1) = false ?= (0.1E~44, ~0.123E1) = false < (0.1E~44, ~0.123) = false > (0.1E~44, ~0.123) = true == (0.1E~44, ~0.123) = false ?= (0.1E~44, ~0.123) = false < (0.1E~44, ~0.123E~2) = false > (0.1E~44, ~0.123E~2) = true == (0.1E~44, ~0.123E~2) = false ?= (0.1E~44, ~0.123E~2) = false < (0.1E~44, ~0.11754944E~37) = false > (0.1E~44, ~0.11754944E~37) = true == (0.1E~44, ~0.11754944E~37) = false ?= (0.1E~44, ~0.11754944E~37) = false < (0.1E~44, ~0.5877472E~38) = false > (0.1E~44, ~0.5877472E~38) = true == (0.1E~44, ~0.5877472E~38) = false ?= (0.1E~44, ~0.5877472E~38) = false < (0.1E~44, ~0.1E~44) = false > (0.1E~44, ~0.1E~44) = true == (0.1E~44, ~0.1E~44) = false ?= (0.1E~44, ~0.1E~44) = false < (0.1E~44, ~0.0) = false > (0.1E~44, ~0.0) = true == (0.1E~44, ~0.0) = false ?= (0.1E~44, ~0.0) = false < (0.0, 0.34028235E39) = true > (0.0, 0.34028235E39) = false == (0.0, 0.34028235E39) = false ?= (0.0, 0.34028235E39) = false < (0.0, 0.17014117E39) = true > (0.0, 0.17014117E39) = false == (0.0, 0.17014117E39) = false ?= (0.0, 0.17014117E39) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.31415927E1) = true > (0.0, 0.31415927E1) = false == (0.0, 0.31415927E1) = false ?= (0.0, 0.31415927E1) = false < (0.0, 0.27182817E1) = true > (0.0, 0.27182817E1) = false == (0.0, 0.27182817E1) = false ?= (0.0, 0.27182817E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.11754944E~37) = true > (0.0, 0.11754944E~37) = false == (0.0, 0.11754944E~37) = false ?= (0.0, 0.11754944E~37) = false < (0.0, 0.5877472E~38) = true > (0.0, 0.5877472E~38) = false == (0.0, 0.5877472E~38) = false ?= (0.0, 0.5877472E~38) = false < (0.0, 0.1E~44) = true > (0.0, 0.1E~44) = false == (0.0, 0.1E~44) = false ?= (0.0, 0.1E~44) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.34028235E39) = false > (0.0, ~0.34028235E39) = true == (0.0, ~0.34028235E39) = false ?= (0.0, ~0.34028235E39) = false < (0.0, ~0.17014117E39) = false > (0.0, ~0.17014117E39) = true == (0.0, ~0.17014117E39) = false ?= (0.0, ~0.17014117E39) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.31415927E1) = false > (0.0, ~0.31415927E1) = true == (0.0, ~0.31415927E1) = false ?= (0.0, ~0.31415927E1) = false < (0.0, ~0.27182817E1) = false > (0.0, ~0.27182817E1) = true == (0.0, ~0.27182817E1) = false ?= (0.0, ~0.27182817E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.11754944E~37) = false > (0.0, ~0.11754944E~37) = true == (0.0, ~0.11754944E~37) = false ?= (0.0, ~0.11754944E~37) = false < (0.0, ~0.5877472E~38) = false > (0.0, ~0.5877472E~38) = true == (0.0, ~0.5877472E~38) = false ?= (0.0, ~0.5877472E~38) = false < (0.0, ~0.1E~44) = false > (0.0, ~0.1E~44) = true == (0.0, ~0.1E~44) = false ?= (0.0, ~0.1E~44) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.34028235E39, 0.34028235E39) = true > (~0.34028235E39, 0.34028235E39) = false == (~0.34028235E39, 0.34028235E39) = false ?= (~0.34028235E39, 0.34028235E39) = false < (~0.34028235E39, 0.17014117E39) = true > (~0.34028235E39, 0.17014117E39) = false == (~0.34028235E39, 0.17014117E39) = false ?= (~0.34028235E39, 0.17014117E39) = false < (~0.34028235E39, 0.123E4) = true > (~0.34028235E39, 0.123E4) = false == (~0.34028235E39, 0.123E4) = false ?= (~0.34028235E39, 0.123E4) = false < (~0.34028235E39, 0.123E2) = true > (~0.34028235E39, 0.123E2) = false == (~0.34028235E39, 0.123E2) = false ?= (~0.34028235E39, 0.123E2) = false < (~0.34028235E39, 0.31415927E1) = true > (~0.34028235E39, 0.31415927E1) = false == (~0.34028235E39, 0.31415927E1) = false ?= (~0.34028235E39, 0.31415927E1) = false < (~0.34028235E39, 0.27182817E1) = true > (~0.34028235E39, 0.27182817E1) = false == (~0.34028235E39, 0.27182817E1) = false ?= (~0.34028235E39, 0.27182817E1) = false < (~0.34028235E39, 0.123E1) = true > (~0.34028235E39, 0.123E1) = false == (~0.34028235E39, 0.123E1) = false ?= (~0.34028235E39, 0.123E1) = false < (~0.34028235E39, 0.123) = true > (~0.34028235E39, 0.123) = false == (~0.34028235E39, 0.123) = false ?= (~0.34028235E39, 0.123) = false < (~0.34028235E39, 0.123E~2) = true > (~0.34028235E39, 0.123E~2) = false == (~0.34028235E39, 0.123E~2) = false ?= (~0.34028235E39, 0.123E~2) = false < (~0.34028235E39, 0.11754944E~37) = true > (~0.34028235E39, 0.11754944E~37) = false == (~0.34028235E39, 0.11754944E~37) = false ?= (~0.34028235E39, 0.11754944E~37) = false < (~0.34028235E39, 0.5877472E~38) = true > (~0.34028235E39, 0.5877472E~38) = false == (~0.34028235E39, 0.5877472E~38) = false ?= (~0.34028235E39, 0.5877472E~38) = false < (~0.34028235E39, 0.1E~44) = true > (~0.34028235E39, 0.1E~44) = false == (~0.34028235E39, 0.1E~44) = false ?= (~0.34028235E39, 0.1E~44) = false < (~0.34028235E39, 0.0) = true > (~0.34028235E39, 0.0) = false == (~0.34028235E39, 0.0) = false ?= (~0.34028235E39, 0.0) = false < (~0.34028235E39, ~0.34028235E39) = false > (~0.34028235E39, ~0.34028235E39) = false == (~0.34028235E39, ~0.34028235E39) = true ?= (~0.34028235E39, ~0.34028235E39) = true < (~0.34028235E39, ~0.17014117E39) = true > (~0.34028235E39, ~0.17014117E39) = false == (~0.34028235E39, ~0.17014117E39) = false ?= (~0.34028235E39, ~0.17014117E39) = false < (~0.34028235E39, ~0.123E4) = true > (~0.34028235E39, ~0.123E4) = false == (~0.34028235E39, ~0.123E4) = false ?= (~0.34028235E39, ~0.123E4) = false < (~0.34028235E39, ~0.123E2) = true > (~0.34028235E39, ~0.123E2) = false == (~0.34028235E39, ~0.123E2) = false ?= (~0.34028235E39, ~0.123E2) = false < (~0.34028235E39, ~0.31415927E1) = true > (~0.34028235E39, ~0.31415927E1) = false == (~0.34028235E39, ~0.31415927E1) = false ?= (~0.34028235E39, ~0.31415927E1) = false < (~0.34028235E39, ~0.27182817E1) = true > (~0.34028235E39, ~0.27182817E1) = false == (~0.34028235E39, ~0.27182817E1) = false ?= (~0.34028235E39, ~0.27182817E1) = false < (~0.34028235E39, ~0.123E1) = true > (~0.34028235E39, ~0.123E1) = false == (~0.34028235E39, ~0.123E1) = false ?= (~0.34028235E39, ~0.123E1) = false < (~0.34028235E39, ~0.123) = true > (~0.34028235E39, ~0.123) = false == (~0.34028235E39, ~0.123) = false ?= (~0.34028235E39, ~0.123) = false < (~0.34028235E39, ~0.123E~2) = true > (~0.34028235E39, ~0.123E~2) = false == (~0.34028235E39, ~0.123E~2) = false ?= (~0.34028235E39, ~0.123E~2) = false < (~0.34028235E39, ~0.11754944E~37) = true > (~0.34028235E39, ~0.11754944E~37) = false == (~0.34028235E39, ~0.11754944E~37) = false ?= (~0.34028235E39, ~0.11754944E~37) = false < (~0.34028235E39, ~0.5877472E~38) = true > (~0.34028235E39, ~0.5877472E~38) = false == (~0.34028235E39, ~0.5877472E~38) = false ?= (~0.34028235E39, ~0.5877472E~38) = false < (~0.34028235E39, ~0.1E~44) = true > (~0.34028235E39, ~0.1E~44) = false == (~0.34028235E39, ~0.1E~44) = false ?= (~0.34028235E39, ~0.1E~44) = false < (~0.34028235E39, ~0.0) = true > (~0.34028235E39, ~0.0) = false == (~0.34028235E39, ~0.0) = false ?= (~0.34028235E39, ~0.0) = false < (~0.17014117E39, 0.34028235E39) = true > (~0.17014117E39, 0.34028235E39) = false == (~0.17014117E39, 0.34028235E39) = false ?= (~0.17014117E39, 0.34028235E39) = false < (~0.17014117E39, 0.17014117E39) = true > (~0.17014117E39, 0.17014117E39) = false == (~0.17014117E39, 0.17014117E39) = false ?= (~0.17014117E39, 0.17014117E39) = false < (~0.17014117E39, 0.123E4) = true > (~0.17014117E39, 0.123E4) = false == (~0.17014117E39, 0.123E4) = false ?= (~0.17014117E39, 0.123E4) = false < (~0.17014117E39, 0.123E2) = true > (~0.17014117E39, 0.123E2) = false == (~0.17014117E39, 0.123E2) = false ?= (~0.17014117E39, 0.123E2) = false < (~0.17014117E39, 0.31415927E1) = true > (~0.17014117E39, 0.31415927E1) = false == (~0.17014117E39, 0.31415927E1) = false ?= (~0.17014117E39, 0.31415927E1) = false < (~0.17014117E39, 0.27182817E1) = true > (~0.17014117E39, 0.27182817E1) = false == (~0.17014117E39, 0.27182817E1) = false ?= (~0.17014117E39, 0.27182817E1) = false < (~0.17014117E39, 0.123E1) = true > (~0.17014117E39, 0.123E1) = false == (~0.17014117E39, 0.123E1) = false ?= (~0.17014117E39, 0.123E1) = false < (~0.17014117E39, 0.123) = true > (~0.17014117E39, 0.123) = false == (~0.17014117E39, 0.123) = false ?= (~0.17014117E39, 0.123) = false < (~0.17014117E39, 0.123E~2) = true > (~0.17014117E39, 0.123E~2) = false == (~0.17014117E39, 0.123E~2) = false ?= (~0.17014117E39, 0.123E~2) = false < (~0.17014117E39, 0.11754944E~37) = true > (~0.17014117E39, 0.11754944E~37) = false == (~0.17014117E39, 0.11754944E~37) = false ?= (~0.17014117E39, 0.11754944E~37) = false < (~0.17014117E39, 0.5877472E~38) = true > (~0.17014117E39, 0.5877472E~38) = false == (~0.17014117E39, 0.5877472E~38) = false ?= (~0.17014117E39, 0.5877472E~38) = false < (~0.17014117E39, 0.1E~44) = true > (~0.17014117E39, 0.1E~44) = false == (~0.17014117E39, 0.1E~44) = false ?= (~0.17014117E39, 0.1E~44) = false < (~0.17014117E39, 0.0) = true > (~0.17014117E39, 0.0) = false == (~0.17014117E39, 0.0) = false ?= (~0.17014117E39, 0.0) = false < (~0.17014117E39, ~0.34028235E39) = false > (~0.17014117E39, ~0.34028235E39) = true == (~0.17014117E39, ~0.34028235E39) = false ?= (~0.17014117E39, ~0.34028235E39) = false < (~0.17014117E39, ~0.17014117E39) = false > (~0.17014117E39, ~0.17014117E39) = false == (~0.17014117E39, ~0.17014117E39) = true ?= (~0.17014117E39, ~0.17014117E39) = true < (~0.17014117E39, ~0.123E4) = true > (~0.17014117E39, ~0.123E4) = false == (~0.17014117E39, ~0.123E4) = false ?= (~0.17014117E39, ~0.123E4) = false < (~0.17014117E39, ~0.123E2) = true > (~0.17014117E39, ~0.123E2) = false == (~0.17014117E39, ~0.123E2) = false ?= (~0.17014117E39, ~0.123E2) = false < (~0.17014117E39, ~0.31415927E1) = true > (~0.17014117E39, ~0.31415927E1) = false == (~0.17014117E39, ~0.31415927E1) = false ?= (~0.17014117E39, ~0.31415927E1) = false < (~0.17014117E39, ~0.27182817E1) = true > (~0.17014117E39, ~0.27182817E1) = false == (~0.17014117E39, ~0.27182817E1) = false ?= (~0.17014117E39, ~0.27182817E1) = false < (~0.17014117E39, ~0.123E1) = true > (~0.17014117E39, ~0.123E1) = false == (~0.17014117E39, ~0.123E1) = false ?= (~0.17014117E39, ~0.123E1) = false < (~0.17014117E39, ~0.123) = true > (~0.17014117E39, ~0.123) = false == (~0.17014117E39, ~0.123) = false ?= (~0.17014117E39, ~0.123) = false < (~0.17014117E39, ~0.123E~2) = true > (~0.17014117E39, ~0.123E~2) = false == (~0.17014117E39, ~0.123E~2) = false ?= (~0.17014117E39, ~0.123E~2) = false < (~0.17014117E39, ~0.11754944E~37) = true > (~0.17014117E39, ~0.11754944E~37) = false == (~0.17014117E39, ~0.11754944E~37) = false ?= (~0.17014117E39, ~0.11754944E~37) = false < (~0.17014117E39, ~0.5877472E~38) = true > (~0.17014117E39, ~0.5877472E~38) = false == (~0.17014117E39, ~0.5877472E~38) = false ?= (~0.17014117E39, ~0.5877472E~38) = false < (~0.17014117E39, ~0.1E~44) = true > (~0.17014117E39, ~0.1E~44) = false == (~0.17014117E39, ~0.1E~44) = false ?= (~0.17014117E39, ~0.1E~44) = false < (~0.17014117E39, ~0.0) = true > (~0.17014117E39, ~0.0) = false == (~0.17014117E39, ~0.0) = false ?= (~0.17014117E39, ~0.0) = false < (~0.123E4, 0.34028235E39) = true > (~0.123E4, 0.34028235E39) = false == (~0.123E4, 0.34028235E39) = false ?= (~0.123E4, 0.34028235E39) = false < (~0.123E4, 0.17014117E39) = true > (~0.123E4, 0.17014117E39) = false == (~0.123E4, 0.17014117E39) = false ?= (~0.123E4, 0.17014117E39) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.31415927E1) = true > (~0.123E4, 0.31415927E1) = false == (~0.123E4, 0.31415927E1) = false ?= (~0.123E4, 0.31415927E1) = false < (~0.123E4, 0.27182817E1) = true > (~0.123E4, 0.27182817E1) = false == (~0.123E4, 0.27182817E1) = false ?= (~0.123E4, 0.27182817E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.11754944E~37) = true > (~0.123E4, 0.11754944E~37) = false == (~0.123E4, 0.11754944E~37) = false ?= (~0.123E4, 0.11754944E~37) = false < (~0.123E4, 0.5877472E~38) = true > (~0.123E4, 0.5877472E~38) = false == (~0.123E4, 0.5877472E~38) = false ?= (~0.123E4, 0.5877472E~38) = false < (~0.123E4, 0.1E~44) = true > (~0.123E4, 0.1E~44) = false == (~0.123E4, 0.1E~44) = false ?= (~0.123E4, 0.1E~44) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.34028235E39) = false > (~0.123E4, ~0.34028235E39) = true == (~0.123E4, ~0.34028235E39) = false ?= (~0.123E4, ~0.34028235E39) = false < (~0.123E4, ~0.17014117E39) = false > (~0.123E4, ~0.17014117E39) = true == (~0.123E4, ~0.17014117E39) = false ?= (~0.123E4, ~0.17014117E39) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.31415927E1) = true > (~0.123E4, ~0.31415927E1) = false == (~0.123E4, ~0.31415927E1) = false ?= (~0.123E4, ~0.31415927E1) = false < (~0.123E4, ~0.27182817E1) = true > (~0.123E4, ~0.27182817E1) = false == (~0.123E4, ~0.27182817E1) = false ?= (~0.123E4, ~0.27182817E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.11754944E~37) = true > (~0.123E4, ~0.11754944E~37) = false == (~0.123E4, ~0.11754944E~37) = false ?= (~0.123E4, ~0.11754944E~37) = false < (~0.123E4, ~0.5877472E~38) = true > (~0.123E4, ~0.5877472E~38) = false == (~0.123E4, ~0.5877472E~38) = false ?= (~0.123E4, ~0.5877472E~38) = false < (~0.123E4, ~0.1E~44) = true > (~0.123E4, ~0.1E~44) = false == (~0.123E4, ~0.1E~44) = false ?= (~0.123E4, ~0.1E~44) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.34028235E39) = true > (~0.123E2, 0.34028235E39) = false == (~0.123E2, 0.34028235E39) = false ?= (~0.123E2, 0.34028235E39) = false < (~0.123E2, 0.17014117E39) = true > (~0.123E2, 0.17014117E39) = false == (~0.123E2, 0.17014117E39) = false ?= (~0.123E2, 0.17014117E39) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.31415927E1) = true > (~0.123E2, 0.31415927E1) = false == (~0.123E2, 0.31415927E1) = false ?= (~0.123E2, 0.31415927E1) = false < (~0.123E2, 0.27182817E1) = true > (~0.123E2, 0.27182817E1) = false == (~0.123E2, 0.27182817E1) = false ?= (~0.123E2, 0.27182817E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.11754944E~37) = true > (~0.123E2, 0.11754944E~37) = false == (~0.123E2, 0.11754944E~37) = false ?= (~0.123E2, 0.11754944E~37) = false < (~0.123E2, 0.5877472E~38) = true > (~0.123E2, 0.5877472E~38) = false == (~0.123E2, 0.5877472E~38) = false ?= (~0.123E2, 0.5877472E~38) = false < (~0.123E2, 0.1E~44) = true > (~0.123E2, 0.1E~44) = false == (~0.123E2, 0.1E~44) = false ?= (~0.123E2, 0.1E~44) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.34028235E39) = false > (~0.123E2, ~0.34028235E39) = true == (~0.123E2, ~0.34028235E39) = false ?= (~0.123E2, ~0.34028235E39) = false < (~0.123E2, ~0.17014117E39) = false > (~0.123E2, ~0.17014117E39) = true == (~0.123E2, ~0.17014117E39) = false ?= (~0.123E2, ~0.17014117E39) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.31415927E1) = true > (~0.123E2, ~0.31415927E1) = false == (~0.123E2, ~0.31415927E1) = false ?= (~0.123E2, ~0.31415927E1) = false < (~0.123E2, ~0.27182817E1) = true > (~0.123E2, ~0.27182817E1) = false == (~0.123E2, ~0.27182817E1) = false ?= (~0.123E2, ~0.27182817E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.11754944E~37) = true > (~0.123E2, ~0.11754944E~37) = false == (~0.123E2, ~0.11754944E~37) = false ?= (~0.123E2, ~0.11754944E~37) = false < (~0.123E2, ~0.5877472E~38) = true > (~0.123E2, ~0.5877472E~38) = false == (~0.123E2, ~0.5877472E~38) = false ?= (~0.123E2, ~0.5877472E~38) = false < (~0.123E2, ~0.1E~44) = true > (~0.123E2, ~0.1E~44) = false == (~0.123E2, ~0.1E~44) = false ?= (~0.123E2, ~0.1E~44) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.31415927E1, 0.34028235E39) = true > (~0.31415927E1, 0.34028235E39) = false == (~0.31415927E1, 0.34028235E39) = false ?= (~0.31415927E1, 0.34028235E39) = false < (~0.31415927E1, 0.17014117E39) = true > (~0.31415927E1, 0.17014117E39) = false == (~0.31415927E1, 0.17014117E39) = false ?= (~0.31415927E1, 0.17014117E39) = false < (~0.31415927E1, 0.123E4) = true > (~0.31415927E1, 0.123E4) = false == (~0.31415927E1, 0.123E4) = false ?= (~0.31415927E1, 0.123E4) = false < (~0.31415927E1, 0.123E2) = true > (~0.31415927E1, 0.123E2) = false == (~0.31415927E1, 0.123E2) = false ?= (~0.31415927E1, 0.123E2) = false < (~0.31415927E1, 0.31415927E1) = true > (~0.31415927E1, 0.31415927E1) = false == (~0.31415927E1, 0.31415927E1) = false ?= (~0.31415927E1, 0.31415927E1) = false < (~0.31415927E1, 0.27182817E1) = true > (~0.31415927E1, 0.27182817E1) = false == (~0.31415927E1, 0.27182817E1) = false ?= (~0.31415927E1, 0.27182817E1) = false < (~0.31415927E1, 0.123E1) = true > (~0.31415927E1, 0.123E1) = false == (~0.31415927E1, 0.123E1) = false ?= (~0.31415927E1, 0.123E1) = false < (~0.31415927E1, 0.123) = true > (~0.31415927E1, 0.123) = false == (~0.31415927E1, 0.123) = false ?= (~0.31415927E1, 0.123) = false < (~0.31415927E1, 0.123E~2) = true > (~0.31415927E1, 0.123E~2) = false == (~0.31415927E1, 0.123E~2) = false ?= (~0.31415927E1, 0.123E~2) = false < (~0.31415927E1, 0.11754944E~37) = true > (~0.31415927E1, 0.11754944E~37) = false == (~0.31415927E1, 0.11754944E~37) = false ?= (~0.31415927E1, 0.11754944E~37) = false < (~0.31415927E1, 0.5877472E~38) = true > (~0.31415927E1, 0.5877472E~38) = false == (~0.31415927E1, 0.5877472E~38) = false ?= (~0.31415927E1, 0.5877472E~38) = false < (~0.31415927E1, 0.1E~44) = true > (~0.31415927E1, 0.1E~44) = false == (~0.31415927E1, 0.1E~44) = false ?= (~0.31415927E1, 0.1E~44) = false < (~0.31415927E1, 0.0) = true > (~0.31415927E1, 0.0) = false == (~0.31415927E1, 0.0) = false ?= (~0.31415927E1, 0.0) = false < (~0.31415927E1, ~0.34028235E39) = false > (~0.31415927E1, ~0.34028235E39) = true == (~0.31415927E1, ~0.34028235E39) = false ?= (~0.31415927E1, ~0.34028235E39) = false < (~0.31415927E1, ~0.17014117E39) = false > (~0.31415927E1, ~0.17014117E39) = true == (~0.31415927E1, ~0.17014117E39) = false ?= (~0.31415927E1, ~0.17014117E39) = false < (~0.31415927E1, ~0.123E4) = false > (~0.31415927E1, ~0.123E4) = true == (~0.31415927E1, ~0.123E4) = false ?= (~0.31415927E1, ~0.123E4) = false < (~0.31415927E1, ~0.123E2) = false > (~0.31415927E1, ~0.123E2) = true == (~0.31415927E1, ~0.123E2) = false ?= (~0.31415927E1, ~0.123E2) = false < (~0.31415927E1, ~0.31415927E1) = false > (~0.31415927E1, ~0.31415927E1) = false == (~0.31415927E1, ~0.31415927E1) = true ?= (~0.31415927E1, ~0.31415927E1) = true < (~0.31415927E1, ~0.27182817E1) = true > (~0.31415927E1, ~0.27182817E1) = false == (~0.31415927E1, ~0.27182817E1) = false ?= (~0.31415927E1, ~0.27182817E1) = false < (~0.31415927E1, ~0.123E1) = true > (~0.31415927E1, ~0.123E1) = false == (~0.31415927E1, ~0.123E1) = false ?= (~0.31415927E1, ~0.123E1) = false < (~0.31415927E1, ~0.123) = true > (~0.31415927E1, ~0.123) = false == (~0.31415927E1, ~0.123) = false ?= (~0.31415927E1, ~0.123) = false < (~0.31415927E1, ~0.123E~2) = true > (~0.31415927E1, ~0.123E~2) = false == (~0.31415927E1, ~0.123E~2) = false ?= (~0.31415927E1, ~0.123E~2) = false < (~0.31415927E1, ~0.11754944E~37) = true > (~0.31415927E1, ~0.11754944E~37) = false == (~0.31415927E1, ~0.11754944E~37) = false ?= (~0.31415927E1, ~0.11754944E~37) = false < (~0.31415927E1, ~0.5877472E~38) = true > (~0.31415927E1, ~0.5877472E~38) = false == (~0.31415927E1, ~0.5877472E~38) = false ?= (~0.31415927E1, ~0.5877472E~38) = false < (~0.31415927E1, ~0.1E~44) = true > (~0.31415927E1, ~0.1E~44) = false == (~0.31415927E1, ~0.1E~44) = false ?= (~0.31415927E1, ~0.1E~44) = false < (~0.31415927E1, ~0.0) = true > (~0.31415927E1, ~0.0) = false == (~0.31415927E1, ~0.0) = false ?= (~0.31415927E1, ~0.0) = false < (~0.27182817E1, 0.34028235E39) = true > (~0.27182817E1, 0.34028235E39) = false == (~0.27182817E1, 0.34028235E39) = false ?= (~0.27182817E1, 0.34028235E39) = false < (~0.27182817E1, 0.17014117E39) = true > (~0.27182817E1, 0.17014117E39) = false == (~0.27182817E1, 0.17014117E39) = false ?= (~0.27182817E1, 0.17014117E39) = false < (~0.27182817E1, 0.123E4) = true > (~0.27182817E1, 0.123E4) = false == (~0.27182817E1, 0.123E4) = false ?= (~0.27182817E1, 0.123E4) = false < (~0.27182817E1, 0.123E2) = true > (~0.27182817E1, 0.123E2) = false == (~0.27182817E1, 0.123E2) = false ?= (~0.27182817E1, 0.123E2) = false < (~0.27182817E1, 0.31415927E1) = true > (~0.27182817E1, 0.31415927E1) = false == (~0.27182817E1, 0.31415927E1) = false ?= (~0.27182817E1, 0.31415927E1) = false < (~0.27182817E1, 0.27182817E1) = true > (~0.27182817E1, 0.27182817E1) = false == (~0.27182817E1, 0.27182817E1) = false ?= (~0.27182817E1, 0.27182817E1) = false < (~0.27182817E1, 0.123E1) = true > (~0.27182817E1, 0.123E1) = false == (~0.27182817E1, 0.123E1) = false ?= (~0.27182817E1, 0.123E1) = false < (~0.27182817E1, 0.123) = true > (~0.27182817E1, 0.123) = false == (~0.27182817E1, 0.123) = false ?= (~0.27182817E1, 0.123) = false < (~0.27182817E1, 0.123E~2) = true > (~0.27182817E1, 0.123E~2) = false == (~0.27182817E1, 0.123E~2) = false ?= (~0.27182817E1, 0.123E~2) = false < (~0.27182817E1, 0.11754944E~37) = true > (~0.27182817E1, 0.11754944E~37) = false == (~0.27182817E1, 0.11754944E~37) = false ?= (~0.27182817E1, 0.11754944E~37) = false < (~0.27182817E1, 0.5877472E~38) = true > (~0.27182817E1, 0.5877472E~38) = false == (~0.27182817E1, 0.5877472E~38) = false ?= (~0.27182817E1, 0.5877472E~38) = false < (~0.27182817E1, 0.1E~44) = true > (~0.27182817E1, 0.1E~44) = false == (~0.27182817E1, 0.1E~44) = false ?= (~0.27182817E1, 0.1E~44) = false < (~0.27182817E1, 0.0) = true > (~0.27182817E1, 0.0) = false == (~0.27182817E1, 0.0) = false ?= (~0.27182817E1, 0.0) = false < (~0.27182817E1, ~0.34028235E39) = false > (~0.27182817E1, ~0.34028235E39) = true == (~0.27182817E1, ~0.34028235E39) = false ?= (~0.27182817E1, ~0.34028235E39) = false < (~0.27182817E1, ~0.17014117E39) = false > (~0.27182817E1, ~0.17014117E39) = true == (~0.27182817E1, ~0.17014117E39) = false ?= (~0.27182817E1, ~0.17014117E39) = false < (~0.27182817E1, ~0.123E4) = false > (~0.27182817E1, ~0.123E4) = true == (~0.27182817E1, ~0.123E4) = false ?= (~0.27182817E1, ~0.123E4) = false < (~0.27182817E1, ~0.123E2) = false > (~0.27182817E1, ~0.123E2) = true == (~0.27182817E1, ~0.123E2) = false ?= (~0.27182817E1, ~0.123E2) = false < (~0.27182817E1, ~0.31415927E1) = false > (~0.27182817E1, ~0.31415927E1) = true == (~0.27182817E1, ~0.31415927E1) = false ?= (~0.27182817E1, ~0.31415927E1) = false < (~0.27182817E1, ~0.27182817E1) = false > (~0.27182817E1, ~0.27182817E1) = false == (~0.27182817E1, ~0.27182817E1) = true ?= (~0.27182817E1, ~0.27182817E1) = true < (~0.27182817E1, ~0.123E1) = true > (~0.27182817E1, ~0.123E1) = false == (~0.27182817E1, ~0.123E1) = false ?= (~0.27182817E1, ~0.123E1) = false < (~0.27182817E1, ~0.123) = true > (~0.27182817E1, ~0.123) = false == (~0.27182817E1, ~0.123) = false ?= (~0.27182817E1, ~0.123) = false < (~0.27182817E1, ~0.123E~2) = true > (~0.27182817E1, ~0.123E~2) = false == (~0.27182817E1, ~0.123E~2) = false ?= (~0.27182817E1, ~0.123E~2) = false < (~0.27182817E1, ~0.11754944E~37) = true > (~0.27182817E1, ~0.11754944E~37) = false == (~0.27182817E1, ~0.11754944E~37) = false ?= (~0.27182817E1, ~0.11754944E~37) = false < (~0.27182817E1, ~0.5877472E~38) = true > (~0.27182817E1, ~0.5877472E~38) = false == (~0.27182817E1, ~0.5877472E~38) = false ?= (~0.27182817E1, ~0.5877472E~38) = false < (~0.27182817E1, ~0.1E~44) = true > (~0.27182817E1, ~0.1E~44) = false == (~0.27182817E1, ~0.1E~44) = false ?= (~0.27182817E1, ~0.1E~44) = false < (~0.27182817E1, ~0.0) = true > (~0.27182817E1, ~0.0) = false == (~0.27182817E1, ~0.0) = false ?= (~0.27182817E1, ~0.0) = false < (~0.123E1, 0.34028235E39) = true > (~0.123E1, 0.34028235E39) = false == (~0.123E1, 0.34028235E39) = false ?= (~0.123E1, 0.34028235E39) = false < (~0.123E1, 0.17014117E39) = true > (~0.123E1, 0.17014117E39) = false == (~0.123E1, 0.17014117E39) = false ?= (~0.123E1, 0.17014117E39) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.31415927E1) = true > (~0.123E1, 0.31415927E1) = false == (~0.123E1, 0.31415927E1) = false ?= (~0.123E1, 0.31415927E1) = false < (~0.123E1, 0.27182817E1) = true > (~0.123E1, 0.27182817E1) = false == (~0.123E1, 0.27182817E1) = false ?= (~0.123E1, 0.27182817E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.11754944E~37) = true > (~0.123E1, 0.11754944E~37) = false == (~0.123E1, 0.11754944E~37) = false ?= (~0.123E1, 0.11754944E~37) = false < (~0.123E1, 0.5877472E~38) = true > (~0.123E1, 0.5877472E~38) = false == (~0.123E1, 0.5877472E~38) = false ?= (~0.123E1, 0.5877472E~38) = false < (~0.123E1, 0.1E~44) = true > (~0.123E1, 0.1E~44) = false == (~0.123E1, 0.1E~44) = false ?= (~0.123E1, 0.1E~44) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.34028235E39) = false > (~0.123E1, ~0.34028235E39) = true == (~0.123E1, ~0.34028235E39) = false ?= (~0.123E1, ~0.34028235E39) = false < (~0.123E1, ~0.17014117E39) = false > (~0.123E1, ~0.17014117E39) = true == (~0.123E1, ~0.17014117E39) = false ?= (~0.123E1, ~0.17014117E39) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.31415927E1) = false > (~0.123E1, ~0.31415927E1) = true == (~0.123E1, ~0.31415927E1) = false ?= (~0.123E1, ~0.31415927E1) = false < (~0.123E1, ~0.27182817E1) = false > (~0.123E1, ~0.27182817E1) = true == (~0.123E1, ~0.27182817E1) = false ?= (~0.123E1, ~0.27182817E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.11754944E~37) = true > (~0.123E1, ~0.11754944E~37) = false == (~0.123E1, ~0.11754944E~37) = false ?= (~0.123E1, ~0.11754944E~37) = false < (~0.123E1, ~0.5877472E~38) = true > (~0.123E1, ~0.5877472E~38) = false == (~0.123E1, ~0.5877472E~38) = false ?= (~0.123E1, ~0.5877472E~38) = false < (~0.123E1, ~0.1E~44) = true > (~0.123E1, ~0.1E~44) = false == (~0.123E1, ~0.1E~44) = false ?= (~0.123E1, ~0.1E~44) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.34028235E39) = true > (~0.123, 0.34028235E39) = false == (~0.123, 0.34028235E39) = false ?= (~0.123, 0.34028235E39) = false < (~0.123, 0.17014117E39) = true > (~0.123, 0.17014117E39) = false == (~0.123, 0.17014117E39) = false ?= (~0.123, 0.17014117E39) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.31415927E1) = true > (~0.123, 0.31415927E1) = false == (~0.123, 0.31415927E1) = false ?= (~0.123, 0.31415927E1) = false < (~0.123, 0.27182817E1) = true > (~0.123, 0.27182817E1) = false == (~0.123, 0.27182817E1) = false ?= (~0.123, 0.27182817E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.11754944E~37) = true > (~0.123, 0.11754944E~37) = false == (~0.123, 0.11754944E~37) = false ?= (~0.123, 0.11754944E~37) = false < (~0.123, 0.5877472E~38) = true > (~0.123, 0.5877472E~38) = false == (~0.123, 0.5877472E~38) = false ?= (~0.123, 0.5877472E~38) = false < (~0.123, 0.1E~44) = true > (~0.123, 0.1E~44) = false == (~0.123, 0.1E~44) = false ?= (~0.123, 0.1E~44) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.34028235E39) = false > (~0.123, ~0.34028235E39) = true == (~0.123, ~0.34028235E39) = false ?= (~0.123, ~0.34028235E39) = false < (~0.123, ~0.17014117E39) = false > (~0.123, ~0.17014117E39) = true == (~0.123, ~0.17014117E39) = false ?= (~0.123, ~0.17014117E39) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.31415927E1) = false > (~0.123, ~0.31415927E1) = true == (~0.123, ~0.31415927E1) = false ?= (~0.123, ~0.31415927E1) = false < (~0.123, ~0.27182817E1) = false > (~0.123, ~0.27182817E1) = true == (~0.123, ~0.27182817E1) = false ?= (~0.123, ~0.27182817E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.11754944E~37) = true > (~0.123, ~0.11754944E~37) = false == (~0.123, ~0.11754944E~37) = false ?= (~0.123, ~0.11754944E~37) = false < (~0.123, ~0.5877472E~38) = true > (~0.123, ~0.5877472E~38) = false == (~0.123, ~0.5877472E~38) = false ?= (~0.123, ~0.5877472E~38) = false < (~0.123, ~0.1E~44) = true > (~0.123, ~0.1E~44) = false == (~0.123, ~0.1E~44) = false ?= (~0.123, ~0.1E~44) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.34028235E39) = true > (~0.123E~2, 0.34028235E39) = false == (~0.123E~2, 0.34028235E39) = false ?= (~0.123E~2, 0.34028235E39) = false < (~0.123E~2, 0.17014117E39) = true > (~0.123E~2, 0.17014117E39) = false == (~0.123E~2, 0.17014117E39) = false ?= (~0.123E~2, 0.17014117E39) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.31415927E1) = true > (~0.123E~2, 0.31415927E1) = false == (~0.123E~2, 0.31415927E1) = false ?= (~0.123E~2, 0.31415927E1) = false < (~0.123E~2, 0.27182817E1) = true > (~0.123E~2, 0.27182817E1) = false == (~0.123E~2, 0.27182817E1) = false ?= (~0.123E~2, 0.27182817E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.11754944E~37) = true > (~0.123E~2, 0.11754944E~37) = false == (~0.123E~2, 0.11754944E~37) = false ?= (~0.123E~2, 0.11754944E~37) = false < (~0.123E~2, 0.5877472E~38) = true > (~0.123E~2, 0.5877472E~38) = false == (~0.123E~2, 0.5877472E~38) = false ?= (~0.123E~2, 0.5877472E~38) = false < (~0.123E~2, 0.1E~44) = true > (~0.123E~2, 0.1E~44) = false == (~0.123E~2, 0.1E~44) = false ?= (~0.123E~2, 0.1E~44) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.34028235E39) = false > (~0.123E~2, ~0.34028235E39) = true == (~0.123E~2, ~0.34028235E39) = false ?= (~0.123E~2, ~0.34028235E39) = false < (~0.123E~2, ~0.17014117E39) = false > (~0.123E~2, ~0.17014117E39) = true == (~0.123E~2, ~0.17014117E39) = false ?= (~0.123E~2, ~0.17014117E39) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.31415927E1) = false > (~0.123E~2, ~0.31415927E1) = true == (~0.123E~2, ~0.31415927E1) = false ?= (~0.123E~2, ~0.31415927E1) = false < (~0.123E~2, ~0.27182817E1) = false > (~0.123E~2, ~0.27182817E1) = true == (~0.123E~2, ~0.27182817E1) = false ?= (~0.123E~2, ~0.27182817E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.11754944E~37) = true > (~0.123E~2, ~0.11754944E~37) = false == (~0.123E~2, ~0.11754944E~37) = false ?= (~0.123E~2, ~0.11754944E~37) = false < (~0.123E~2, ~0.5877472E~38) = true > (~0.123E~2, ~0.5877472E~38) = false == (~0.123E~2, ~0.5877472E~38) = false ?= (~0.123E~2, ~0.5877472E~38) = false < (~0.123E~2, ~0.1E~44) = true > (~0.123E~2, ~0.1E~44) = false == (~0.123E~2, ~0.1E~44) = false ?= (~0.123E~2, ~0.1E~44) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.11754944E~37, 0.34028235E39) = true > (~0.11754944E~37, 0.34028235E39) = false == (~0.11754944E~37, 0.34028235E39) = false ?= (~0.11754944E~37, 0.34028235E39) = false < (~0.11754944E~37, 0.17014117E39) = true > (~0.11754944E~37, 0.17014117E39) = false == (~0.11754944E~37, 0.17014117E39) = false ?= (~0.11754944E~37, 0.17014117E39) = false < (~0.11754944E~37, 0.123E4) = true > (~0.11754944E~37, 0.123E4) = false == (~0.11754944E~37, 0.123E4) = false ?= (~0.11754944E~37, 0.123E4) = false < (~0.11754944E~37, 0.123E2) = true > (~0.11754944E~37, 0.123E2) = false == (~0.11754944E~37, 0.123E2) = false ?= (~0.11754944E~37, 0.123E2) = false < (~0.11754944E~37, 0.31415927E1) = true > (~0.11754944E~37, 0.31415927E1) = false == (~0.11754944E~37, 0.31415927E1) = false ?= (~0.11754944E~37, 0.31415927E1) = false < (~0.11754944E~37, 0.27182817E1) = true > (~0.11754944E~37, 0.27182817E1) = false == (~0.11754944E~37, 0.27182817E1) = false ?= (~0.11754944E~37, 0.27182817E1) = false < (~0.11754944E~37, 0.123E1) = true > (~0.11754944E~37, 0.123E1) = false == (~0.11754944E~37, 0.123E1) = false ?= (~0.11754944E~37, 0.123E1) = false < (~0.11754944E~37, 0.123) = true > (~0.11754944E~37, 0.123) = false == (~0.11754944E~37, 0.123) = false ?= (~0.11754944E~37, 0.123) = false < (~0.11754944E~37, 0.123E~2) = true > (~0.11754944E~37, 0.123E~2) = false == (~0.11754944E~37, 0.123E~2) = false ?= (~0.11754944E~37, 0.123E~2) = false < (~0.11754944E~37, 0.11754944E~37) = true > (~0.11754944E~37, 0.11754944E~37) = false == (~0.11754944E~37, 0.11754944E~37) = false ?= (~0.11754944E~37, 0.11754944E~37) = false < (~0.11754944E~37, 0.5877472E~38) = true > (~0.11754944E~37, 0.5877472E~38) = false == (~0.11754944E~37, 0.5877472E~38) = false ?= (~0.11754944E~37, 0.5877472E~38) = false < (~0.11754944E~37, 0.1E~44) = true > (~0.11754944E~37, 0.1E~44) = false == (~0.11754944E~37, 0.1E~44) = false ?= (~0.11754944E~37, 0.1E~44) = false < (~0.11754944E~37, 0.0) = true > (~0.11754944E~37, 0.0) = false == (~0.11754944E~37, 0.0) = false ?= (~0.11754944E~37, 0.0) = false < (~0.11754944E~37, ~0.34028235E39) = false > (~0.11754944E~37, ~0.34028235E39) = true == (~0.11754944E~37, ~0.34028235E39) = false ?= (~0.11754944E~37, ~0.34028235E39) = false < (~0.11754944E~37, ~0.17014117E39) = false > (~0.11754944E~37, ~0.17014117E39) = true == (~0.11754944E~37, ~0.17014117E39) = false ?= (~0.11754944E~37, ~0.17014117E39) = false < (~0.11754944E~37, ~0.123E4) = false > (~0.11754944E~37, ~0.123E4) = true == (~0.11754944E~37, ~0.123E4) = false ?= (~0.11754944E~37, ~0.123E4) = false < (~0.11754944E~37, ~0.123E2) = false > (~0.11754944E~37, ~0.123E2) = true == (~0.11754944E~37, ~0.123E2) = false ?= (~0.11754944E~37, ~0.123E2) = false < (~0.11754944E~37, ~0.31415927E1) = false > (~0.11754944E~37, ~0.31415927E1) = true == (~0.11754944E~37, ~0.31415927E1) = false ?= (~0.11754944E~37, ~0.31415927E1) = false < (~0.11754944E~37, ~0.27182817E1) = false > (~0.11754944E~37, ~0.27182817E1) = true == (~0.11754944E~37, ~0.27182817E1) = false ?= (~0.11754944E~37, ~0.27182817E1) = false < (~0.11754944E~37, ~0.123E1) = false > (~0.11754944E~37, ~0.123E1) = true == (~0.11754944E~37, ~0.123E1) = false ?= (~0.11754944E~37, ~0.123E1) = false < (~0.11754944E~37, ~0.123) = false > (~0.11754944E~37, ~0.123) = true == (~0.11754944E~37, ~0.123) = false ?= (~0.11754944E~37, ~0.123) = false < (~0.11754944E~37, ~0.123E~2) = false > (~0.11754944E~37, ~0.123E~2) = true == (~0.11754944E~37, ~0.123E~2) = false ?= (~0.11754944E~37, ~0.123E~2) = false < (~0.11754944E~37, ~0.11754944E~37) = false > (~0.11754944E~37, ~0.11754944E~37) = false == (~0.11754944E~37, ~0.11754944E~37) = true ?= (~0.11754944E~37, ~0.11754944E~37) = true < (~0.11754944E~37, ~0.5877472E~38) = true > (~0.11754944E~37, ~0.5877472E~38) = false == (~0.11754944E~37, ~0.5877472E~38) = false ?= (~0.11754944E~37, ~0.5877472E~38) = false < (~0.11754944E~37, ~0.1E~44) = true > (~0.11754944E~37, ~0.1E~44) = false == (~0.11754944E~37, ~0.1E~44) = false ?= (~0.11754944E~37, ~0.1E~44) = false < (~0.11754944E~37, ~0.0) = true > (~0.11754944E~37, ~0.0) = false == (~0.11754944E~37, ~0.0) = false ?= (~0.11754944E~37, ~0.0) = false < (~0.5877472E~38, 0.34028235E39) = true > (~0.5877472E~38, 0.34028235E39) = false == (~0.5877472E~38, 0.34028235E39) = false ?= (~0.5877472E~38, 0.34028235E39) = false < (~0.5877472E~38, 0.17014117E39) = true > (~0.5877472E~38, 0.17014117E39) = false == (~0.5877472E~38, 0.17014117E39) = false ?= (~0.5877472E~38, 0.17014117E39) = false < (~0.5877472E~38, 0.123E4) = true > (~0.5877472E~38, 0.123E4) = false == (~0.5877472E~38, 0.123E4) = false ?= (~0.5877472E~38, 0.123E4) = false < (~0.5877472E~38, 0.123E2) = true > (~0.5877472E~38, 0.123E2) = false == (~0.5877472E~38, 0.123E2) = false ?= (~0.5877472E~38, 0.123E2) = false < (~0.5877472E~38, 0.31415927E1) = true > (~0.5877472E~38, 0.31415927E1) = false == (~0.5877472E~38, 0.31415927E1) = false ?= (~0.5877472E~38, 0.31415927E1) = false < (~0.5877472E~38, 0.27182817E1) = true > (~0.5877472E~38, 0.27182817E1) = false == (~0.5877472E~38, 0.27182817E1) = false ?= (~0.5877472E~38, 0.27182817E1) = false < (~0.5877472E~38, 0.123E1) = true > (~0.5877472E~38, 0.123E1) = false == (~0.5877472E~38, 0.123E1) = false ?= (~0.5877472E~38, 0.123E1) = false < (~0.5877472E~38, 0.123) = true > (~0.5877472E~38, 0.123) = false == (~0.5877472E~38, 0.123) = false ?= (~0.5877472E~38, 0.123) = false < (~0.5877472E~38, 0.123E~2) = true > (~0.5877472E~38, 0.123E~2) = false == (~0.5877472E~38, 0.123E~2) = false ?= (~0.5877472E~38, 0.123E~2) = false < (~0.5877472E~38, 0.11754944E~37) = true > (~0.5877472E~38, 0.11754944E~37) = false == (~0.5877472E~38, 0.11754944E~37) = false ?= (~0.5877472E~38, 0.11754944E~37) = false < (~0.5877472E~38, 0.5877472E~38) = true > (~0.5877472E~38, 0.5877472E~38) = false == (~0.5877472E~38, 0.5877472E~38) = false ?= (~0.5877472E~38, 0.5877472E~38) = false < (~0.5877472E~38, 0.1E~44) = true > (~0.5877472E~38, 0.1E~44) = false == (~0.5877472E~38, 0.1E~44) = false ?= (~0.5877472E~38, 0.1E~44) = false < (~0.5877472E~38, 0.0) = true > (~0.5877472E~38, 0.0) = false == (~0.5877472E~38, 0.0) = false ?= (~0.5877472E~38, 0.0) = false < (~0.5877472E~38, ~0.34028235E39) = false > (~0.5877472E~38, ~0.34028235E39) = true == (~0.5877472E~38, ~0.34028235E39) = false ?= (~0.5877472E~38, ~0.34028235E39) = false < (~0.5877472E~38, ~0.17014117E39) = false > (~0.5877472E~38, ~0.17014117E39) = true == (~0.5877472E~38, ~0.17014117E39) = false ?= (~0.5877472E~38, ~0.17014117E39) = false < (~0.5877472E~38, ~0.123E4) = false > (~0.5877472E~38, ~0.123E4) = true == (~0.5877472E~38, ~0.123E4) = false ?= (~0.5877472E~38, ~0.123E4) = false < (~0.5877472E~38, ~0.123E2) = false > (~0.5877472E~38, ~0.123E2) = true == (~0.5877472E~38, ~0.123E2) = false ?= (~0.5877472E~38, ~0.123E2) = false < (~0.5877472E~38, ~0.31415927E1) = false > (~0.5877472E~38, ~0.31415927E1) = true == (~0.5877472E~38, ~0.31415927E1) = false ?= (~0.5877472E~38, ~0.31415927E1) = false < (~0.5877472E~38, ~0.27182817E1) = false > (~0.5877472E~38, ~0.27182817E1) = true == (~0.5877472E~38, ~0.27182817E1) = false ?= (~0.5877472E~38, ~0.27182817E1) = false < (~0.5877472E~38, ~0.123E1) = false > (~0.5877472E~38, ~0.123E1) = true == (~0.5877472E~38, ~0.123E1) = false ?= (~0.5877472E~38, ~0.123E1) = false < (~0.5877472E~38, ~0.123) = false > (~0.5877472E~38, ~0.123) = true == (~0.5877472E~38, ~0.123) = false ?= (~0.5877472E~38, ~0.123) = false < (~0.5877472E~38, ~0.123E~2) = false > (~0.5877472E~38, ~0.123E~2) = true == (~0.5877472E~38, ~0.123E~2) = false ?= (~0.5877472E~38, ~0.123E~2) = false < (~0.5877472E~38, ~0.11754944E~37) = false > (~0.5877472E~38, ~0.11754944E~37) = true == (~0.5877472E~38, ~0.11754944E~37) = false ?= (~0.5877472E~38, ~0.11754944E~37) = false < (~0.5877472E~38, ~0.5877472E~38) = false > (~0.5877472E~38, ~0.5877472E~38) = false == (~0.5877472E~38, ~0.5877472E~38) = true ?= (~0.5877472E~38, ~0.5877472E~38) = true < (~0.5877472E~38, ~0.1E~44) = true > (~0.5877472E~38, ~0.1E~44) = false == (~0.5877472E~38, ~0.1E~44) = false ?= (~0.5877472E~38, ~0.1E~44) = false < (~0.5877472E~38, ~0.0) = true > (~0.5877472E~38, ~0.0) = false == (~0.5877472E~38, ~0.0) = false ?= (~0.5877472E~38, ~0.0) = false < (~0.1E~44, 0.34028235E39) = true > (~0.1E~44, 0.34028235E39) = false == (~0.1E~44, 0.34028235E39) = false ?= (~0.1E~44, 0.34028235E39) = false < (~0.1E~44, 0.17014117E39) = true > (~0.1E~44, 0.17014117E39) = false == (~0.1E~44, 0.17014117E39) = false ?= (~0.1E~44, 0.17014117E39) = false < (~0.1E~44, 0.123E4) = true > (~0.1E~44, 0.123E4) = false == (~0.1E~44, 0.123E4) = false ?= (~0.1E~44, 0.123E4) = false < (~0.1E~44, 0.123E2) = true > (~0.1E~44, 0.123E2) = false == (~0.1E~44, 0.123E2) = false ?= (~0.1E~44, 0.123E2) = false < (~0.1E~44, 0.31415927E1) = true > (~0.1E~44, 0.31415927E1) = false == (~0.1E~44, 0.31415927E1) = false ?= (~0.1E~44, 0.31415927E1) = false < (~0.1E~44, 0.27182817E1) = true > (~0.1E~44, 0.27182817E1) = false == (~0.1E~44, 0.27182817E1) = false ?= (~0.1E~44, 0.27182817E1) = false < (~0.1E~44, 0.123E1) = true > (~0.1E~44, 0.123E1) = false == (~0.1E~44, 0.123E1) = false ?= (~0.1E~44, 0.123E1) = false < (~0.1E~44, 0.123) = true > (~0.1E~44, 0.123) = false == (~0.1E~44, 0.123) = false ?= (~0.1E~44, 0.123) = false < (~0.1E~44, 0.123E~2) = true > (~0.1E~44, 0.123E~2) = false == (~0.1E~44, 0.123E~2) = false ?= (~0.1E~44, 0.123E~2) = false < (~0.1E~44, 0.11754944E~37) = true > (~0.1E~44, 0.11754944E~37) = false == (~0.1E~44, 0.11754944E~37) = false ?= (~0.1E~44, 0.11754944E~37) = false < (~0.1E~44, 0.5877472E~38) = true > (~0.1E~44, 0.5877472E~38) = false == (~0.1E~44, 0.5877472E~38) = false ?= (~0.1E~44, 0.5877472E~38) = false < (~0.1E~44, 0.1E~44) = true > (~0.1E~44, 0.1E~44) = false == (~0.1E~44, 0.1E~44) = false ?= (~0.1E~44, 0.1E~44) = false < (~0.1E~44, 0.0) = true > (~0.1E~44, 0.0) = false == (~0.1E~44, 0.0) = false ?= (~0.1E~44, 0.0) = false < (~0.1E~44, ~0.34028235E39) = false > (~0.1E~44, ~0.34028235E39) = true == (~0.1E~44, ~0.34028235E39) = false ?= (~0.1E~44, ~0.34028235E39) = false < (~0.1E~44, ~0.17014117E39) = false > (~0.1E~44, ~0.17014117E39) = true == (~0.1E~44, ~0.17014117E39) = false ?= (~0.1E~44, ~0.17014117E39) = false < (~0.1E~44, ~0.123E4) = false > (~0.1E~44, ~0.123E4) = true == (~0.1E~44, ~0.123E4) = false ?= (~0.1E~44, ~0.123E4) = false < (~0.1E~44, ~0.123E2) = false > (~0.1E~44, ~0.123E2) = true == (~0.1E~44, ~0.123E2) = false ?= (~0.1E~44, ~0.123E2) = false < (~0.1E~44, ~0.31415927E1) = false > (~0.1E~44, ~0.31415927E1) = true == (~0.1E~44, ~0.31415927E1) = false ?= (~0.1E~44, ~0.31415927E1) = false < (~0.1E~44, ~0.27182817E1) = false > (~0.1E~44, ~0.27182817E1) = true == (~0.1E~44, ~0.27182817E1) = false ?= (~0.1E~44, ~0.27182817E1) = false < (~0.1E~44, ~0.123E1) = false > (~0.1E~44, ~0.123E1) = true == (~0.1E~44, ~0.123E1) = false ?= (~0.1E~44, ~0.123E1) = false < (~0.1E~44, ~0.123) = false > (~0.1E~44, ~0.123) = true == (~0.1E~44, ~0.123) = false ?= (~0.1E~44, ~0.123) = false < (~0.1E~44, ~0.123E~2) = false > (~0.1E~44, ~0.123E~2) = true == (~0.1E~44, ~0.123E~2) = false ?= (~0.1E~44, ~0.123E~2) = false < (~0.1E~44, ~0.11754944E~37) = false > (~0.1E~44, ~0.11754944E~37) = true == (~0.1E~44, ~0.11754944E~37) = false ?= (~0.1E~44, ~0.11754944E~37) = false < (~0.1E~44, ~0.5877472E~38) = false > (~0.1E~44, ~0.5877472E~38) = true == (~0.1E~44, ~0.5877472E~38) = false ?= (~0.1E~44, ~0.5877472E~38) = false < (~0.1E~44, ~0.1E~44) = false > (~0.1E~44, ~0.1E~44) = false == (~0.1E~44, ~0.1E~44) = true ?= (~0.1E~44, ~0.1E~44) = true < (~0.1E~44, ~0.0) = true > (~0.1E~44, ~0.0) = false == (~0.1E~44, ~0.0) = false ?= (~0.1E~44, ~0.0) = false < (~0.0, 0.34028235E39) = true > (~0.0, 0.34028235E39) = false == (~0.0, 0.34028235E39) = false ?= (~0.0, 0.34028235E39) = false < (~0.0, 0.17014117E39) = true > (~0.0, 0.17014117E39) = false == (~0.0, 0.17014117E39) = false ?= (~0.0, 0.17014117E39) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.31415927E1) = true > (~0.0, 0.31415927E1) = false == (~0.0, 0.31415927E1) = false ?= (~0.0, 0.31415927E1) = false < (~0.0, 0.27182817E1) = true > (~0.0, 0.27182817E1) = false == (~0.0, 0.27182817E1) = false ?= (~0.0, 0.27182817E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.11754944E~37) = true > (~0.0, 0.11754944E~37) = false == (~0.0, 0.11754944E~37) = false ?= (~0.0, 0.11754944E~37) = false < (~0.0, 0.5877472E~38) = true > (~0.0, 0.5877472E~38) = false == (~0.0, 0.5877472E~38) = false ?= (~0.0, 0.5877472E~38) = false < (~0.0, 0.1E~44) = true > (~0.0, 0.1E~44) = false == (~0.0, 0.1E~44) = false ?= (~0.0, 0.1E~44) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.34028235E39) = false > (~0.0, ~0.34028235E39) = true == (~0.0, ~0.34028235E39) = false ?= (~0.0, ~0.34028235E39) = false < (~0.0, ~0.17014117E39) = false > (~0.0, ~0.17014117E39) = true == (~0.0, ~0.17014117E39) = false ?= (~0.0, ~0.17014117E39) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.31415927E1) = false > (~0.0, ~0.31415927E1) = true == (~0.0, ~0.31415927E1) = false ?= (~0.0, ~0.31415927E1) = false < (~0.0, ~0.27182817E1) = false > (~0.0, ~0.27182817E1) = true == (~0.0, ~0.27182817E1) = false ?= (~0.0, ~0.27182817E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.11754944E~37) = false > (~0.0, ~0.11754944E~37) = true == (~0.0, ~0.11754944E~37) = false ?= (~0.0, ~0.11754944E~37) = false < (~0.0, ~0.5877472E~38) = false > (~0.0, ~0.5877472E~38) = true == (~0.0, ~0.5877472E~38) = false ?= (~0.0, ~0.5877472E~38) = false < (~0.0, ~0.1E~44) = false > (~0.0, ~0.1E~44) = true == (~0.0, ~0.1E~44) = false ?= (~0.0, ~0.1E~44) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.34028235E39, 0.34028235E39) = EQUAL compareReal (0.34028235E39, 0.34028235E39) = EQUAL compare (0.34028235E39, 0.17014117E39) = GREATER compareReal (0.34028235E39, 0.17014117E39) = GREATER compare (0.34028235E39, 0.123E4) = GREATER compareReal (0.34028235E39, 0.123E4) = GREATER compare (0.34028235E39, 0.123E2) = GREATER compareReal (0.34028235E39, 0.123E2) = GREATER compare (0.34028235E39, 0.31415927E1) = GREATER compareReal (0.34028235E39, 0.31415927E1) = GREATER compare (0.34028235E39, 0.27182817E1) = GREATER compareReal (0.34028235E39, 0.27182817E1) = GREATER compare (0.34028235E39, 0.123E1) = GREATER compareReal (0.34028235E39, 0.123E1) = GREATER compare (0.34028235E39, 0.123) = GREATER compareReal (0.34028235E39, 0.123) = GREATER compare (0.34028235E39, 0.123E~2) = GREATER compareReal (0.34028235E39, 0.123E~2) = GREATER compare (0.34028235E39, 0.11754944E~37) = GREATER compareReal (0.34028235E39, 0.11754944E~37) = GREATER compare (0.34028235E39, 0.5877472E~38) = GREATER compareReal (0.34028235E39, 0.5877472E~38) = GREATER compare (0.34028235E39, 0.1E~44) = GREATER compareReal (0.34028235E39, 0.1E~44) = GREATER compare (0.34028235E39, 0.0) = GREATER compareReal (0.34028235E39, 0.0) = GREATER compare (0.34028235E39, ~0.34028235E39) = GREATER compareReal (0.34028235E39, ~0.34028235E39) = GREATER compare (0.34028235E39, ~0.17014117E39) = GREATER compareReal (0.34028235E39, ~0.17014117E39) = GREATER compare (0.34028235E39, ~0.123E4) = GREATER compareReal (0.34028235E39, ~0.123E4) = GREATER compare (0.34028235E39, ~0.123E2) = GREATER compareReal (0.34028235E39, ~0.123E2) = GREATER compare (0.34028235E39, ~0.31415927E1) = GREATER compareReal (0.34028235E39, ~0.31415927E1) = GREATER compare (0.34028235E39, ~0.27182817E1) = GREATER compareReal (0.34028235E39, ~0.27182817E1) = GREATER compare (0.34028235E39, ~0.123E1) = GREATER compareReal (0.34028235E39, ~0.123E1) = GREATER compare (0.34028235E39, ~0.123) = GREATER compareReal (0.34028235E39, ~0.123) = GREATER compare (0.34028235E39, ~0.123E~2) = GREATER compareReal (0.34028235E39, ~0.123E~2) = GREATER compare (0.34028235E39, ~0.11754944E~37) = GREATER compareReal (0.34028235E39, ~0.11754944E~37) = GREATER compare (0.34028235E39, ~0.5877472E~38) = GREATER compareReal (0.34028235E39, ~0.5877472E~38) = GREATER compare (0.34028235E39, ~0.1E~44) = GREATER compareReal (0.34028235E39, ~0.1E~44) = GREATER compare (0.34028235E39, ~0.0) = GREATER compareReal (0.34028235E39, ~0.0) = GREATER compare (0.17014117E39, 0.34028235E39) = LESS compareReal (0.17014117E39, 0.34028235E39) = LESS compare (0.17014117E39, 0.17014117E39) = EQUAL compareReal (0.17014117E39, 0.17014117E39) = EQUAL compare (0.17014117E39, 0.123E4) = GREATER compareReal (0.17014117E39, 0.123E4) = GREATER compare (0.17014117E39, 0.123E2) = GREATER compareReal (0.17014117E39, 0.123E2) = GREATER compare (0.17014117E39, 0.31415927E1) = GREATER compareReal (0.17014117E39, 0.31415927E1) = GREATER compare (0.17014117E39, 0.27182817E1) = GREATER compareReal (0.17014117E39, 0.27182817E1) = GREATER compare (0.17014117E39, 0.123E1) = GREATER compareReal (0.17014117E39, 0.123E1) = GREATER compare (0.17014117E39, 0.123) = GREATER compareReal (0.17014117E39, 0.123) = GREATER compare (0.17014117E39, 0.123E~2) = GREATER compareReal (0.17014117E39, 0.123E~2) = GREATER compare (0.17014117E39, 0.11754944E~37) = GREATER compareReal (0.17014117E39, 0.11754944E~37) = GREATER compare (0.17014117E39, 0.5877472E~38) = GREATER compareReal (0.17014117E39, 0.5877472E~38) = GREATER compare (0.17014117E39, 0.1E~44) = GREATER compareReal (0.17014117E39, 0.1E~44) = GREATER compare (0.17014117E39, 0.0) = GREATER compareReal (0.17014117E39, 0.0) = GREATER compare (0.17014117E39, ~0.34028235E39) = GREATER compareReal (0.17014117E39, ~0.34028235E39) = GREATER compare (0.17014117E39, ~0.17014117E39) = GREATER compareReal (0.17014117E39, ~0.17014117E39) = GREATER compare (0.17014117E39, ~0.123E4) = GREATER compareReal (0.17014117E39, ~0.123E4) = GREATER compare (0.17014117E39, ~0.123E2) = GREATER compareReal (0.17014117E39, ~0.123E2) = GREATER compare (0.17014117E39, ~0.31415927E1) = GREATER compareReal (0.17014117E39, ~0.31415927E1) = GREATER compare (0.17014117E39, ~0.27182817E1) = GREATER compareReal (0.17014117E39, ~0.27182817E1) = GREATER compare (0.17014117E39, ~0.123E1) = GREATER compareReal (0.17014117E39, ~0.123E1) = GREATER compare (0.17014117E39, ~0.123) = GREATER compareReal (0.17014117E39, ~0.123) = GREATER compare (0.17014117E39, ~0.123E~2) = GREATER compareReal (0.17014117E39, ~0.123E~2) = GREATER compare (0.17014117E39, ~0.11754944E~37) = GREATER compareReal (0.17014117E39, ~0.11754944E~37) = GREATER compare (0.17014117E39, ~0.5877472E~38) = GREATER compareReal (0.17014117E39, ~0.5877472E~38) = GREATER compare (0.17014117E39, ~0.1E~44) = GREATER compareReal (0.17014117E39, ~0.1E~44) = GREATER compare (0.17014117E39, ~0.0) = GREATER compareReal (0.17014117E39, ~0.0) = GREATER compare (0.123E4, 0.34028235E39) = LESS compareReal (0.123E4, 0.34028235E39) = LESS compare (0.123E4, 0.17014117E39) = LESS compareReal (0.123E4, 0.17014117E39) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.31415927E1) = GREATER compareReal (0.123E4, 0.31415927E1) = GREATER compare (0.123E4, 0.27182817E1) = GREATER compareReal (0.123E4, 0.27182817E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.11754944E~37) = GREATER compareReal (0.123E4, 0.11754944E~37) = GREATER compare (0.123E4, 0.5877472E~38) = GREATER compareReal (0.123E4, 0.5877472E~38) = GREATER compare (0.123E4, 0.1E~44) = GREATER compareReal (0.123E4, 0.1E~44) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.34028235E39) = GREATER compareReal (0.123E4, ~0.34028235E39) = GREATER compare (0.123E4, ~0.17014117E39) = GREATER compareReal (0.123E4, ~0.17014117E39) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.31415927E1) = GREATER compareReal (0.123E4, ~0.31415927E1) = GREATER compare (0.123E4, ~0.27182817E1) = GREATER compareReal (0.123E4, ~0.27182817E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.11754944E~37) = GREATER compareReal (0.123E4, ~0.11754944E~37) = GREATER compare (0.123E4, ~0.5877472E~38) = GREATER compareReal (0.123E4, ~0.5877472E~38) = GREATER compare (0.123E4, ~0.1E~44) = GREATER compareReal (0.123E4, ~0.1E~44) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.34028235E39) = LESS compareReal (0.123E2, 0.34028235E39) = LESS compare (0.123E2, 0.17014117E39) = LESS compareReal (0.123E2, 0.17014117E39) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.31415927E1) = GREATER compareReal (0.123E2, 0.31415927E1) = GREATER compare (0.123E2, 0.27182817E1) = GREATER compareReal (0.123E2, 0.27182817E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.11754944E~37) = GREATER compareReal (0.123E2, 0.11754944E~37) = GREATER compare (0.123E2, 0.5877472E~38) = GREATER compareReal (0.123E2, 0.5877472E~38) = GREATER compare (0.123E2, 0.1E~44) = GREATER compareReal (0.123E2, 0.1E~44) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.34028235E39) = GREATER compareReal (0.123E2, ~0.34028235E39) = GREATER compare (0.123E2, ~0.17014117E39) = GREATER compareReal (0.123E2, ~0.17014117E39) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.31415927E1) = GREATER compareReal (0.123E2, ~0.31415927E1) = GREATER compare (0.123E2, ~0.27182817E1) = GREATER compareReal (0.123E2, ~0.27182817E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.11754944E~37) = GREATER compareReal (0.123E2, ~0.11754944E~37) = GREATER compare (0.123E2, ~0.5877472E~38) = GREATER compareReal (0.123E2, ~0.5877472E~38) = GREATER compare (0.123E2, ~0.1E~44) = GREATER compareReal (0.123E2, ~0.1E~44) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.31415927E1, 0.34028235E39) = LESS compareReal (0.31415927E1, 0.34028235E39) = LESS compare (0.31415927E1, 0.17014117E39) = LESS compareReal (0.31415927E1, 0.17014117E39) = LESS compare (0.31415927E1, 0.123E4) = LESS compareReal (0.31415927E1, 0.123E4) = LESS compare (0.31415927E1, 0.123E2) = LESS compareReal (0.31415927E1, 0.123E2) = LESS compare (0.31415927E1, 0.31415927E1) = EQUAL compareReal (0.31415927E1, 0.31415927E1) = EQUAL compare (0.31415927E1, 0.27182817E1) = GREATER compareReal (0.31415927E1, 0.27182817E1) = GREATER compare (0.31415927E1, 0.123E1) = GREATER compareReal (0.31415927E1, 0.123E1) = GREATER compare (0.31415927E1, 0.123) = GREATER compareReal (0.31415927E1, 0.123) = GREATER compare (0.31415927E1, 0.123E~2) = GREATER compareReal (0.31415927E1, 0.123E~2) = GREATER compare (0.31415927E1, 0.11754944E~37) = GREATER compareReal (0.31415927E1, 0.11754944E~37) = GREATER compare (0.31415927E1, 0.5877472E~38) = GREATER compareReal (0.31415927E1, 0.5877472E~38) = GREATER compare (0.31415927E1, 0.1E~44) = GREATER compareReal (0.31415927E1, 0.1E~44) = GREATER compare (0.31415927E1, 0.0) = GREATER compareReal (0.31415927E1, 0.0) = GREATER compare (0.31415927E1, ~0.34028235E39) = GREATER compareReal (0.31415927E1, ~0.34028235E39) = GREATER compare (0.31415927E1, ~0.17014117E39) = GREATER compareReal (0.31415927E1, ~0.17014117E39) = GREATER compare (0.31415927E1, ~0.123E4) = GREATER compareReal (0.31415927E1, ~0.123E4) = GREATER compare (0.31415927E1, ~0.123E2) = GREATER compareReal (0.31415927E1, ~0.123E2) = GREATER compare (0.31415927E1, ~0.31415927E1) = GREATER compareReal (0.31415927E1, ~0.31415927E1) = GREATER compare (0.31415927E1, ~0.27182817E1) = GREATER compareReal (0.31415927E1, ~0.27182817E1) = GREATER compare (0.31415927E1, ~0.123E1) = GREATER compareReal (0.31415927E1, ~0.123E1) = GREATER compare (0.31415927E1, ~0.123) = GREATER compareReal (0.31415927E1, ~0.123) = GREATER compare (0.31415927E1, ~0.123E~2) = GREATER compareReal (0.31415927E1, ~0.123E~2) = GREATER compare (0.31415927E1, ~0.11754944E~37) = GREATER compareReal (0.31415927E1, ~0.11754944E~37) = GREATER compare (0.31415927E1, ~0.5877472E~38) = GREATER compareReal (0.31415927E1, ~0.5877472E~38) = GREATER compare (0.31415927E1, ~0.1E~44) = GREATER compareReal (0.31415927E1, ~0.1E~44) = GREATER compare (0.31415927E1, ~0.0) = GREATER compareReal (0.31415927E1, ~0.0) = GREATER compare (0.27182817E1, 0.34028235E39) = LESS compareReal (0.27182817E1, 0.34028235E39) = LESS compare (0.27182817E1, 0.17014117E39) = LESS compareReal (0.27182817E1, 0.17014117E39) = LESS compare (0.27182817E1, 0.123E4) = LESS compareReal (0.27182817E1, 0.123E4) = LESS compare (0.27182817E1, 0.123E2) = LESS compareReal (0.27182817E1, 0.123E2) = LESS compare (0.27182817E1, 0.31415927E1) = LESS compareReal (0.27182817E1, 0.31415927E1) = LESS compare (0.27182817E1, 0.27182817E1) = EQUAL compareReal (0.27182817E1, 0.27182817E1) = EQUAL compare (0.27182817E1, 0.123E1) = GREATER compareReal (0.27182817E1, 0.123E1) = GREATER compare (0.27182817E1, 0.123) = GREATER compareReal (0.27182817E1, 0.123) = GREATER compare (0.27182817E1, 0.123E~2) = GREATER compareReal (0.27182817E1, 0.123E~2) = GREATER compare (0.27182817E1, 0.11754944E~37) = GREATER compareReal (0.27182817E1, 0.11754944E~37) = GREATER compare (0.27182817E1, 0.5877472E~38) = GREATER compareReal (0.27182817E1, 0.5877472E~38) = GREATER compare (0.27182817E1, 0.1E~44) = GREATER compareReal (0.27182817E1, 0.1E~44) = GREATER compare (0.27182817E1, 0.0) = GREATER compareReal (0.27182817E1, 0.0) = GREATER compare (0.27182817E1, ~0.34028235E39) = GREATER compareReal (0.27182817E1, ~0.34028235E39) = GREATER compare (0.27182817E1, ~0.17014117E39) = GREATER compareReal (0.27182817E1, ~0.17014117E39) = GREATER compare (0.27182817E1, ~0.123E4) = GREATER compareReal (0.27182817E1, ~0.123E4) = GREATER compare (0.27182817E1, ~0.123E2) = GREATER compareReal (0.27182817E1, ~0.123E2) = GREATER compare (0.27182817E1, ~0.31415927E1) = GREATER compareReal (0.27182817E1, ~0.31415927E1) = GREATER compare (0.27182817E1, ~0.27182817E1) = GREATER compareReal (0.27182817E1, ~0.27182817E1) = GREATER compare (0.27182817E1, ~0.123E1) = GREATER compareReal (0.27182817E1, ~0.123E1) = GREATER compare (0.27182817E1, ~0.123) = GREATER compareReal (0.27182817E1, ~0.123) = GREATER compare (0.27182817E1, ~0.123E~2) = GREATER compareReal (0.27182817E1, ~0.123E~2) = GREATER compare (0.27182817E1, ~0.11754944E~37) = GREATER compareReal (0.27182817E1, ~0.11754944E~37) = GREATER compare (0.27182817E1, ~0.5877472E~38) = GREATER compareReal (0.27182817E1, ~0.5877472E~38) = GREATER compare (0.27182817E1, ~0.1E~44) = GREATER compareReal (0.27182817E1, ~0.1E~44) = GREATER compare (0.27182817E1, ~0.0) = GREATER compareReal (0.27182817E1, ~0.0) = GREATER compare (0.123E1, 0.34028235E39) = LESS compareReal (0.123E1, 0.34028235E39) = LESS compare (0.123E1, 0.17014117E39) = LESS compareReal (0.123E1, 0.17014117E39) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.31415927E1) = LESS compareReal (0.123E1, 0.31415927E1) = LESS compare (0.123E1, 0.27182817E1) = LESS compareReal (0.123E1, 0.27182817E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.11754944E~37) = GREATER compareReal (0.123E1, 0.11754944E~37) = GREATER compare (0.123E1, 0.5877472E~38) = GREATER compareReal (0.123E1, 0.5877472E~38) = GREATER compare (0.123E1, 0.1E~44) = GREATER compareReal (0.123E1, 0.1E~44) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.34028235E39) = GREATER compareReal (0.123E1, ~0.34028235E39) = GREATER compare (0.123E1, ~0.17014117E39) = GREATER compareReal (0.123E1, ~0.17014117E39) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.31415927E1) = GREATER compareReal (0.123E1, ~0.31415927E1) = GREATER compare (0.123E1, ~0.27182817E1) = GREATER compareReal (0.123E1, ~0.27182817E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.11754944E~37) = GREATER compareReal (0.123E1, ~0.11754944E~37) = GREATER compare (0.123E1, ~0.5877472E~38) = GREATER compareReal (0.123E1, ~0.5877472E~38) = GREATER compare (0.123E1, ~0.1E~44) = GREATER compareReal (0.123E1, ~0.1E~44) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.34028235E39) = LESS compareReal (0.123, 0.34028235E39) = LESS compare (0.123, 0.17014117E39) = LESS compareReal (0.123, 0.17014117E39) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.31415927E1) = LESS compareReal (0.123, 0.31415927E1) = LESS compare (0.123, 0.27182817E1) = LESS compareReal (0.123, 0.27182817E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.11754944E~37) = GREATER compareReal (0.123, 0.11754944E~37) = GREATER compare (0.123, 0.5877472E~38) = GREATER compareReal (0.123, 0.5877472E~38) = GREATER compare (0.123, 0.1E~44) = GREATER compareReal (0.123, 0.1E~44) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.34028235E39) = GREATER compareReal (0.123, ~0.34028235E39) = GREATER compare (0.123, ~0.17014117E39) = GREATER compareReal (0.123, ~0.17014117E39) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.31415927E1) = GREATER compareReal (0.123, ~0.31415927E1) = GREATER compare (0.123, ~0.27182817E1) = GREATER compareReal (0.123, ~0.27182817E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.11754944E~37) = GREATER compareReal (0.123, ~0.11754944E~37) = GREATER compare (0.123, ~0.5877472E~38) = GREATER compareReal (0.123, ~0.5877472E~38) = GREATER compare (0.123, ~0.1E~44) = GREATER compareReal (0.123, ~0.1E~44) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.34028235E39) = LESS compareReal (0.123E~2, 0.34028235E39) = LESS compare (0.123E~2, 0.17014117E39) = LESS compareReal (0.123E~2, 0.17014117E39) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.31415927E1) = LESS compareReal (0.123E~2, 0.31415927E1) = LESS compare (0.123E~2, 0.27182817E1) = LESS compareReal (0.123E~2, 0.27182817E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.11754944E~37) = GREATER compareReal (0.123E~2, 0.11754944E~37) = GREATER compare (0.123E~2, 0.5877472E~38) = GREATER compareReal (0.123E~2, 0.5877472E~38) = GREATER compare (0.123E~2, 0.1E~44) = GREATER compareReal (0.123E~2, 0.1E~44) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.34028235E39) = GREATER compareReal (0.123E~2, ~0.34028235E39) = GREATER compare (0.123E~2, ~0.17014117E39) = GREATER compareReal (0.123E~2, ~0.17014117E39) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.31415927E1) = GREATER compareReal (0.123E~2, ~0.31415927E1) = GREATER compare (0.123E~2, ~0.27182817E1) = GREATER compareReal (0.123E~2, ~0.27182817E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.11754944E~37) = GREATER compareReal (0.123E~2, ~0.11754944E~37) = GREATER compare (0.123E~2, ~0.5877472E~38) = GREATER compareReal (0.123E~2, ~0.5877472E~38) = GREATER compare (0.123E~2, ~0.1E~44) = GREATER compareReal (0.123E~2, ~0.1E~44) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.11754944E~37, 0.34028235E39) = LESS compareReal (0.11754944E~37, 0.34028235E39) = LESS compare (0.11754944E~37, 0.17014117E39) = LESS compareReal (0.11754944E~37, 0.17014117E39) = LESS compare (0.11754944E~37, 0.123E4) = LESS compareReal (0.11754944E~37, 0.123E4) = LESS compare (0.11754944E~37, 0.123E2) = LESS compareReal (0.11754944E~37, 0.123E2) = LESS compare (0.11754944E~37, 0.31415927E1) = LESS compareReal (0.11754944E~37, 0.31415927E1) = LESS compare (0.11754944E~37, 0.27182817E1) = LESS compareReal (0.11754944E~37, 0.27182817E1) = LESS compare (0.11754944E~37, 0.123E1) = LESS compareReal (0.11754944E~37, 0.123E1) = LESS compare (0.11754944E~37, 0.123) = LESS compareReal (0.11754944E~37, 0.123) = LESS compare (0.11754944E~37, 0.123E~2) = LESS compareReal (0.11754944E~37, 0.123E~2) = LESS compare (0.11754944E~37, 0.11754944E~37) = EQUAL compareReal (0.11754944E~37, 0.11754944E~37) = EQUAL compare (0.11754944E~37, 0.5877472E~38) = GREATER compareReal (0.11754944E~37, 0.5877472E~38) = GREATER compare (0.11754944E~37, 0.1E~44) = GREATER compareReal (0.11754944E~37, 0.1E~44) = GREATER compare (0.11754944E~37, 0.0) = GREATER compareReal (0.11754944E~37, 0.0) = GREATER compare (0.11754944E~37, ~0.34028235E39) = GREATER compareReal (0.11754944E~37, ~0.34028235E39) = GREATER compare (0.11754944E~37, ~0.17014117E39) = GREATER compareReal (0.11754944E~37, ~0.17014117E39) = GREATER compare (0.11754944E~37, ~0.123E4) = GREATER compareReal (0.11754944E~37, ~0.123E4) = GREATER compare (0.11754944E~37, ~0.123E2) = GREATER compareReal (0.11754944E~37, ~0.123E2) = GREATER compare (0.11754944E~37, ~0.31415927E1) = GREATER compareReal (0.11754944E~37, ~0.31415927E1) = GREATER compare (0.11754944E~37, ~0.27182817E1) = GREATER compareReal (0.11754944E~37, ~0.27182817E1) = GREATER compare (0.11754944E~37, ~0.123E1) = GREATER compareReal (0.11754944E~37, ~0.123E1) = GREATER compare (0.11754944E~37, ~0.123) = GREATER compareReal (0.11754944E~37, ~0.123) = GREATER compare (0.11754944E~37, ~0.123E~2) = GREATER compareReal (0.11754944E~37, ~0.123E~2) = GREATER compare (0.11754944E~37, ~0.11754944E~37) = GREATER compareReal (0.11754944E~37, ~0.11754944E~37) = GREATER compare (0.11754944E~37, ~0.5877472E~38) = GREATER compareReal (0.11754944E~37, ~0.5877472E~38) = GREATER compare (0.11754944E~37, ~0.1E~44) = GREATER compareReal (0.11754944E~37, ~0.1E~44) = GREATER compare (0.11754944E~37, ~0.0) = GREATER compareReal (0.11754944E~37, ~0.0) = GREATER compare (0.5877472E~38, 0.34028235E39) = LESS compareReal (0.5877472E~38, 0.34028235E39) = LESS compare (0.5877472E~38, 0.17014117E39) = LESS compareReal (0.5877472E~38, 0.17014117E39) = LESS compare (0.5877472E~38, 0.123E4) = LESS compareReal (0.5877472E~38, 0.123E4) = LESS compare (0.5877472E~38, 0.123E2) = LESS compareReal (0.5877472E~38, 0.123E2) = LESS compare (0.5877472E~38, 0.31415927E1) = LESS compareReal (0.5877472E~38, 0.31415927E1) = LESS compare (0.5877472E~38, 0.27182817E1) = LESS compareReal (0.5877472E~38, 0.27182817E1) = LESS compare (0.5877472E~38, 0.123E1) = LESS compareReal (0.5877472E~38, 0.123E1) = LESS compare (0.5877472E~38, 0.123) = LESS compareReal (0.5877472E~38, 0.123) = LESS compare (0.5877472E~38, 0.123E~2) = LESS compareReal (0.5877472E~38, 0.123E~2) = LESS compare (0.5877472E~38, 0.11754944E~37) = LESS compareReal (0.5877472E~38, 0.11754944E~37) = LESS compare (0.5877472E~38, 0.5877472E~38) = EQUAL compareReal (0.5877472E~38, 0.5877472E~38) = EQUAL compare (0.5877472E~38, 0.1E~44) = GREATER compareReal (0.5877472E~38, 0.1E~44) = GREATER compare (0.5877472E~38, 0.0) = GREATER compareReal (0.5877472E~38, 0.0) = GREATER compare (0.5877472E~38, ~0.34028235E39) = GREATER compareReal (0.5877472E~38, ~0.34028235E39) = GREATER compare (0.5877472E~38, ~0.17014117E39) = GREATER compareReal (0.5877472E~38, ~0.17014117E39) = GREATER compare (0.5877472E~38, ~0.123E4) = GREATER compareReal (0.5877472E~38, ~0.123E4) = GREATER compare (0.5877472E~38, ~0.123E2) = GREATER compareReal (0.5877472E~38, ~0.123E2) = GREATER compare (0.5877472E~38, ~0.31415927E1) = GREATER compareReal (0.5877472E~38, ~0.31415927E1) = GREATER compare (0.5877472E~38, ~0.27182817E1) = GREATER compareReal (0.5877472E~38, ~0.27182817E1) = GREATER compare (0.5877472E~38, ~0.123E1) = GREATER compareReal (0.5877472E~38, ~0.123E1) = GREATER compare (0.5877472E~38, ~0.123) = GREATER compareReal (0.5877472E~38, ~0.123) = GREATER compare (0.5877472E~38, ~0.123E~2) = GREATER compareReal (0.5877472E~38, ~0.123E~2) = GREATER compare (0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (0.5877472E~38, ~0.11754944E~37) = GREATER compare (0.5877472E~38, ~0.5877472E~38) = GREATER compareReal (0.5877472E~38, ~0.5877472E~38) = GREATER compare (0.5877472E~38, ~0.1E~44) = GREATER compareReal (0.5877472E~38, ~0.1E~44) = GREATER compare (0.5877472E~38, ~0.0) = GREATER compareReal (0.5877472E~38, ~0.0) = GREATER compare (0.1E~44, 0.34028235E39) = LESS compareReal (0.1E~44, 0.34028235E39) = LESS compare (0.1E~44, 0.17014117E39) = LESS compareReal (0.1E~44, 0.17014117E39) = LESS compare (0.1E~44, 0.123E4) = LESS compareReal (0.1E~44, 0.123E4) = LESS compare (0.1E~44, 0.123E2) = LESS compareReal (0.1E~44, 0.123E2) = LESS compare (0.1E~44, 0.31415927E1) = LESS compareReal (0.1E~44, 0.31415927E1) = LESS compare (0.1E~44, 0.27182817E1) = LESS compareReal (0.1E~44, 0.27182817E1) = LESS compare (0.1E~44, 0.123E1) = LESS compareReal (0.1E~44, 0.123E1) = LESS compare (0.1E~44, 0.123) = LESS compareReal (0.1E~44, 0.123) = LESS compare (0.1E~44, 0.123E~2) = LESS compareReal (0.1E~44, 0.123E~2) = LESS compare (0.1E~44, 0.11754944E~37) = LESS compareReal (0.1E~44, 0.11754944E~37) = LESS compare (0.1E~44, 0.5877472E~38) = LESS compareReal (0.1E~44, 0.5877472E~38) = LESS compare (0.1E~44, 0.1E~44) = EQUAL compareReal (0.1E~44, 0.1E~44) = EQUAL compare (0.1E~44, 0.0) = GREATER compareReal (0.1E~44, 0.0) = GREATER compare (0.1E~44, ~0.34028235E39) = GREATER compareReal (0.1E~44, ~0.34028235E39) = GREATER compare (0.1E~44, ~0.17014117E39) = GREATER compareReal (0.1E~44, ~0.17014117E39) = GREATER compare (0.1E~44, ~0.123E4) = GREATER compareReal (0.1E~44, ~0.123E4) = GREATER compare (0.1E~44, ~0.123E2) = GREATER compareReal (0.1E~44, ~0.123E2) = GREATER compare (0.1E~44, ~0.31415927E1) = GREATER compareReal (0.1E~44, ~0.31415927E1) = GREATER compare (0.1E~44, ~0.27182817E1) = GREATER compareReal (0.1E~44, ~0.27182817E1) = GREATER compare (0.1E~44, ~0.123E1) = GREATER compareReal (0.1E~44, ~0.123E1) = GREATER compare (0.1E~44, ~0.123) = GREATER compareReal (0.1E~44, ~0.123) = GREATER compare (0.1E~44, ~0.123E~2) = GREATER compareReal (0.1E~44, ~0.123E~2) = GREATER compare (0.1E~44, ~0.11754944E~37) = GREATER compareReal (0.1E~44, ~0.11754944E~37) = GREATER compare (0.1E~44, ~0.5877472E~38) = GREATER compareReal (0.1E~44, ~0.5877472E~38) = GREATER compare (0.1E~44, ~0.1E~44) = GREATER compareReal (0.1E~44, ~0.1E~44) = GREATER compare (0.1E~44, ~0.0) = GREATER compareReal (0.1E~44, ~0.0) = GREATER compare (0.0, 0.34028235E39) = LESS compareReal (0.0, 0.34028235E39) = LESS compare (0.0, 0.17014117E39) = LESS compareReal (0.0, 0.17014117E39) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.31415927E1) = LESS compareReal (0.0, 0.31415927E1) = LESS compare (0.0, 0.27182817E1) = LESS compareReal (0.0, 0.27182817E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.11754944E~37) = LESS compareReal (0.0, 0.11754944E~37) = LESS compare (0.0, 0.5877472E~38) = LESS compareReal (0.0, 0.5877472E~38) = LESS compare (0.0, 0.1E~44) = LESS compareReal (0.0, 0.1E~44) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.34028235E39) = GREATER compareReal (0.0, ~0.34028235E39) = GREATER compare (0.0, ~0.17014117E39) = GREATER compareReal (0.0, ~0.17014117E39) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.31415927E1) = GREATER compareReal (0.0, ~0.31415927E1) = GREATER compare (0.0, ~0.27182817E1) = GREATER compareReal (0.0, ~0.27182817E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.11754944E~37) = GREATER compareReal (0.0, ~0.11754944E~37) = GREATER compare (0.0, ~0.5877472E~38) = GREATER compareReal (0.0, ~0.5877472E~38) = GREATER compare (0.0, ~0.1E~44) = GREATER compareReal (0.0, ~0.1E~44) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.34028235E39, 0.34028235E39) = LESS compareReal (~0.34028235E39, 0.34028235E39) = LESS compare (~0.34028235E39, 0.17014117E39) = LESS compareReal (~0.34028235E39, 0.17014117E39) = LESS compare (~0.34028235E39, 0.123E4) = LESS compareReal (~0.34028235E39, 0.123E4) = LESS compare (~0.34028235E39, 0.123E2) = LESS compareReal (~0.34028235E39, 0.123E2) = LESS compare (~0.34028235E39, 0.31415927E1) = LESS compareReal (~0.34028235E39, 0.31415927E1) = LESS compare (~0.34028235E39, 0.27182817E1) = LESS compareReal (~0.34028235E39, 0.27182817E1) = LESS compare (~0.34028235E39, 0.123E1) = LESS compareReal (~0.34028235E39, 0.123E1) = LESS compare (~0.34028235E39, 0.123) = LESS compareReal (~0.34028235E39, 0.123) = LESS compare (~0.34028235E39, 0.123E~2) = LESS compareReal (~0.34028235E39, 0.123E~2) = LESS compare (~0.34028235E39, 0.11754944E~37) = LESS compareReal (~0.34028235E39, 0.11754944E~37) = LESS compare (~0.34028235E39, 0.5877472E~38) = LESS compareReal (~0.34028235E39, 0.5877472E~38) = LESS compare (~0.34028235E39, 0.1E~44) = LESS compareReal (~0.34028235E39, 0.1E~44) = LESS compare (~0.34028235E39, 0.0) = LESS compareReal (~0.34028235E39, 0.0) = LESS compare (~0.34028235E39, ~0.34028235E39) = EQUAL compareReal (~0.34028235E39, ~0.34028235E39) = EQUAL compare (~0.34028235E39, ~0.17014117E39) = LESS compareReal (~0.34028235E39, ~0.17014117E39) = LESS compare (~0.34028235E39, ~0.123E4) = LESS compareReal (~0.34028235E39, ~0.123E4) = LESS compare (~0.34028235E39, ~0.123E2) = LESS compareReal (~0.34028235E39, ~0.123E2) = LESS compare (~0.34028235E39, ~0.31415927E1) = LESS compareReal (~0.34028235E39, ~0.31415927E1) = LESS compare (~0.34028235E39, ~0.27182817E1) = LESS compareReal (~0.34028235E39, ~0.27182817E1) = LESS compare (~0.34028235E39, ~0.123E1) = LESS compareReal (~0.34028235E39, ~0.123E1) = LESS compare (~0.34028235E39, ~0.123) = LESS compareReal (~0.34028235E39, ~0.123) = LESS compare (~0.34028235E39, ~0.123E~2) = LESS compareReal (~0.34028235E39, ~0.123E~2) = LESS compare (~0.34028235E39, ~0.11754944E~37) = LESS compareReal (~0.34028235E39, ~0.11754944E~37) = LESS compare (~0.34028235E39, ~0.5877472E~38) = LESS compareReal (~0.34028235E39, ~0.5877472E~38) = LESS compare (~0.34028235E39, ~0.1E~44) = LESS compareReal (~0.34028235E39, ~0.1E~44) = LESS compare (~0.34028235E39, ~0.0) = LESS compareReal (~0.34028235E39, ~0.0) = LESS compare (~0.17014117E39, 0.34028235E39) = LESS compareReal (~0.17014117E39, 0.34028235E39) = LESS compare (~0.17014117E39, 0.17014117E39) = LESS compareReal (~0.17014117E39, 0.17014117E39) = LESS compare (~0.17014117E39, 0.123E4) = LESS compareReal (~0.17014117E39, 0.123E4) = LESS compare (~0.17014117E39, 0.123E2) = LESS compareReal (~0.17014117E39, 0.123E2) = LESS compare (~0.17014117E39, 0.31415927E1) = LESS compareReal (~0.17014117E39, 0.31415927E1) = LESS compare (~0.17014117E39, 0.27182817E1) = LESS compareReal (~0.17014117E39, 0.27182817E1) = LESS compare (~0.17014117E39, 0.123E1) = LESS compareReal (~0.17014117E39, 0.123E1) = LESS compare (~0.17014117E39, 0.123) = LESS compareReal (~0.17014117E39, 0.123) = LESS compare (~0.17014117E39, 0.123E~2) = LESS compareReal (~0.17014117E39, 0.123E~2) = LESS compare (~0.17014117E39, 0.11754944E~37) = LESS compareReal (~0.17014117E39, 0.11754944E~37) = LESS compare (~0.17014117E39, 0.5877472E~38) = LESS compareReal (~0.17014117E39, 0.5877472E~38) = LESS compare (~0.17014117E39, 0.1E~44) = LESS compareReal (~0.17014117E39, 0.1E~44) = LESS compare (~0.17014117E39, 0.0) = LESS compareReal (~0.17014117E39, 0.0) = LESS compare (~0.17014117E39, ~0.34028235E39) = GREATER compareReal (~0.17014117E39, ~0.34028235E39) = GREATER compare (~0.17014117E39, ~0.17014117E39) = EQUAL compareReal (~0.17014117E39, ~0.17014117E39) = EQUAL compare (~0.17014117E39, ~0.123E4) = LESS compareReal (~0.17014117E39, ~0.123E4) = LESS compare (~0.17014117E39, ~0.123E2) = LESS compareReal (~0.17014117E39, ~0.123E2) = LESS compare (~0.17014117E39, ~0.31415927E1) = LESS compareReal (~0.17014117E39, ~0.31415927E1) = LESS compare (~0.17014117E39, ~0.27182817E1) = LESS compareReal (~0.17014117E39, ~0.27182817E1) = LESS compare (~0.17014117E39, ~0.123E1) = LESS compareReal (~0.17014117E39, ~0.123E1) = LESS compare (~0.17014117E39, ~0.123) = LESS compareReal (~0.17014117E39, ~0.123) = LESS compare (~0.17014117E39, ~0.123E~2) = LESS compareReal (~0.17014117E39, ~0.123E~2) = LESS compare (~0.17014117E39, ~0.11754944E~37) = LESS compareReal (~0.17014117E39, ~0.11754944E~37) = LESS compare (~0.17014117E39, ~0.5877472E~38) = LESS compareReal (~0.17014117E39, ~0.5877472E~38) = LESS compare (~0.17014117E39, ~0.1E~44) = LESS compareReal (~0.17014117E39, ~0.1E~44) = LESS compare (~0.17014117E39, ~0.0) = LESS compareReal (~0.17014117E39, ~0.0) = LESS compare (~0.123E4, 0.34028235E39) = LESS compareReal (~0.123E4, 0.34028235E39) = LESS compare (~0.123E4, 0.17014117E39) = LESS compareReal (~0.123E4, 0.17014117E39) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.31415927E1) = LESS compareReal (~0.123E4, 0.31415927E1) = LESS compare (~0.123E4, 0.27182817E1) = LESS compareReal (~0.123E4, 0.27182817E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.11754944E~37) = LESS compareReal (~0.123E4, 0.11754944E~37) = LESS compare (~0.123E4, 0.5877472E~38) = LESS compareReal (~0.123E4, 0.5877472E~38) = LESS compare (~0.123E4, 0.1E~44) = LESS compareReal (~0.123E4, 0.1E~44) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.34028235E39) = GREATER compareReal (~0.123E4, ~0.34028235E39) = GREATER compare (~0.123E4, ~0.17014117E39) = GREATER compareReal (~0.123E4, ~0.17014117E39) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.31415927E1) = LESS compareReal (~0.123E4, ~0.31415927E1) = LESS compare (~0.123E4, ~0.27182817E1) = LESS compareReal (~0.123E4, ~0.27182817E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.11754944E~37) = LESS compareReal (~0.123E4, ~0.11754944E~37) = LESS compare (~0.123E4, ~0.5877472E~38) = LESS compareReal (~0.123E4, ~0.5877472E~38) = LESS compare (~0.123E4, ~0.1E~44) = LESS compareReal (~0.123E4, ~0.1E~44) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.34028235E39) = LESS compareReal (~0.123E2, 0.34028235E39) = LESS compare (~0.123E2, 0.17014117E39) = LESS compareReal (~0.123E2, 0.17014117E39) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.31415927E1) = LESS compareReal (~0.123E2, 0.31415927E1) = LESS compare (~0.123E2, 0.27182817E1) = LESS compareReal (~0.123E2, 0.27182817E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.11754944E~37) = LESS compareReal (~0.123E2, 0.11754944E~37) = LESS compare (~0.123E2, 0.5877472E~38) = LESS compareReal (~0.123E2, 0.5877472E~38) = LESS compare (~0.123E2, 0.1E~44) = LESS compareReal (~0.123E2, 0.1E~44) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.34028235E39) = GREATER compareReal (~0.123E2, ~0.34028235E39) = GREATER compare (~0.123E2, ~0.17014117E39) = GREATER compareReal (~0.123E2, ~0.17014117E39) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.31415927E1) = LESS compareReal (~0.123E2, ~0.31415927E1) = LESS compare (~0.123E2, ~0.27182817E1) = LESS compareReal (~0.123E2, ~0.27182817E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.11754944E~37) = LESS compareReal (~0.123E2, ~0.11754944E~37) = LESS compare (~0.123E2, ~0.5877472E~38) = LESS compareReal (~0.123E2, ~0.5877472E~38) = LESS compare (~0.123E2, ~0.1E~44) = LESS compareReal (~0.123E2, ~0.1E~44) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.31415927E1, 0.34028235E39) = LESS compareReal (~0.31415927E1, 0.34028235E39) = LESS compare (~0.31415927E1, 0.17014117E39) = LESS compareReal (~0.31415927E1, 0.17014117E39) = LESS compare (~0.31415927E1, 0.123E4) = LESS compareReal (~0.31415927E1, 0.123E4) = LESS compare (~0.31415927E1, 0.123E2) = LESS compareReal (~0.31415927E1, 0.123E2) = LESS compare (~0.31415927E1, 0.31415927E1) = LESS compareReal (~0.31415927E1, 0.31415927E1) = LESS compare (~0.31415927E1, 0.27182817E1) = LESS compareReal (~0.31415927E1, 0.27182817E1) = LESS compare (~0.31415927E1, 0.123E1) = LESS compareReal (~0.31415927E1, 0.123E1) = LESS compare (~0.31415927E1, 0.123) = LESS compareReal (~0.31415927E1, 0.123) = LESS compare (~0.31415927E1, 0.123E~2) = LESS compareReal (~0.31415927E1, 0.123E~2) = LESS compare (~0.31415927E1, 0.11754944E~37) = LESS compareReal (~0.31415927E1, 0.11754944E~37) = LESS compare (~0.31415927E1, 0.5877472E~38) = LESS compareReal (~0.31415927E1, 0.5877472E~38) = LESS compare (~0.31415927E1, 0.1E~44) = LESS compareReal (~0.31415927E1, 0.1E~44) = LESS compare (~0.31415927E1, 0.0) = LESS compareReal (~0.31415927E1, 0.0) = LESS compare (~0.31415927E1, ~0.34028235E39) = GREATER compareReal (~0.31415927E1, ~0.34028235E39) = GREATER compare (~0.31415927E1, ~0.17014117E39) = GREATER compareReal (~0.31415927E1, ~0.17014117E39) = GREATER compare (~0.31415927E1, ~0.123E4) = GREATER compareReal (~0.31415927E1, ~0.123E4) = GREATER compare (~0.31415927E1, ~0.123E2) = GREATER compareReal (~0.31415927E1, ~0.123E2) = GREATER compare (~0.31415927E1, ~0.31415927E1) = EQUAL compareReal (~0.31415927E1, ~0.31415927E1) = EQUAL compare (~0.31415927E1, ~0.27182817E1) = LESS compareReal (~0.31415927E1, ~0.27182817E1) = LESS compare (~0.31415927E1, ~0.123E1) = LESS compareReal (~0.31415927E1, ~0.123E1) = LESS compare (~0.31415927E1, ~0.123) = LESS compareReal (~0.31415927E1, ~0.123) = LESS compare (~0.31415927E1, ~0.123E~2) = LESS compareReal (~0.31415927E1, ~0.123E~2) = LESS compare (~0.31415927E1, ~0.11754944E~37) = LESS compareReal (~0.31415927E1, ~0.11754944E~37) = LESS compare (~0.31415927E1, ~0.5877472E~38) = LESS compareReal (~0.31415927E1, ~0.5877472E~38) = LESS compare (~0.31415927E1, ~0.1E~44) = LESS compareReal (~0.31415927E1, ~0.1E~44) = LESS compare (~0.31415927E1, ~0.0) = LESS compareReal (~0.31415927E1, ~0.0) = LESS compare (~0.27182817E1, 0.34028235E39) = LESS compareReal (~0.27182817E1, 0.34028235E39) = LESS compare (~0.27182817E1, 0.17014117E39) = LESS compareReal (~0.27182817E1, 0.17014117E39) = LESS compare (~0.27182817E1, 0.123E4) = LESS compareReal (~0.27182817E1, 0.123E4) = LESS compare (~0.27182817E1, 0.123E2) = LESS compareReal (~0.27182817E1, 0.123E2) = LESS compare (~0.27182817E1, 0.31415927E1) = LESS compareReal (~0.27182817E1, 0.31415927E1) = LESS compare (~0.27182817E1, 0.27182817E1) = LESS compareReal (~0.27182817E1, 0.27182817E1) = LESS compare (~0.27182817E1, 0.123E1) = LESS compareReal (~0.27182817E1, 0.123E1) = LESS compare (~0.27182817E1, 0.123) = LESS compareReal (~0.27182817E1, 0.123) = LESS compare (~0.27182817E1, 0.123E~2) = LESS compareReal (~0.27182817E1, 0.123E~2) = LESS compare (~0.27182817E1, 0.11754944E~37) = LESS compareReal (~0.27182817E1, 0.11754944E~37) = LESS compare (~0.27182817E1, 0.5877472E~38) = LESS compareReal (~0.27182817E1, 0.5877472E~38) = LESS compare (~0.27182817E1, 0.1E~44) = LESS compareReal (~0.27182817E1, 0.1E~44) = LESS compare (~0.27182817E1, 0.0) = LESS compareReal (~0.27182817E1, 0.0) = LESS compare (~0.27182817E1, ~0.34028235E39) = GREATER compareReal (~0.27182817E1, ~0.34028235E39) = GREATER compare (~0.27182817E1, ~0.17014117E39) = GREATER compareReal (~0.27182817E1, ~0.17014117E39) = GREATER compare (~0.27182817E1, ~0.123E4) = GREATER compareReal (~0.27182817E1, ~0.123E4) = GREATER compare (~0.27182817E1, ~0.123E2) = GREATER compareReal (~0.27182817E1, ~0.123E2) = GREATER compare (~0.27182817E1, ~0.31415927E1) = GREATER compareReal (~0.27182817E1, ~0.31415927E1) = GREATER compare (~0.27182817E1, ~0.27182817E1) = EQUAL compareReal (~0.27182817E1, ~0.27182817E1) = EQUAL compare (~0.27182817E1, ~0.123E1) = LESS compareReal (~0.27182817E1, ~0.123E1) = LESS compare (~0.27182817E1, ~0.123) = LESS compareReal (~0.27182817E1, ~0.123) = LESS compare (~0.27182817E1, ~0.123E~2) = LESS compareReal (~0.27182817E1, ~0.123E~2) = LESS compare (~0.27182817E1, ~0.11754944E~37) = LESS compareReal (~0.27182817E1, ~0.11754944E~37) = LESS compare (~0.27182817E1, ~0.5877472E~38) = LESS compareReal (~0.27182817E1, ~0.5877472E~38) = LESS compare (~0.27182817E1, ~0.1E~44) = LESS compareReal (~0.27182817E1, ~0.1E~44) = LESS compare (~0.27182817E1, ~0.0) = LESS compareReal (~0.27182817E1, ~0.0) = LESS compare (~0.123E1, 0.34028235E39) = LESS compareReal (~0.123E1, 0.34028235E39) = LESS compare (~0.123E1, 0.17014117E39) = LESS compareReal (~0.123E1, 0.17014117E39) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.31415927E1) = LESS compareReal (~0.123E1, 0.31415927E1) = LESS compare (~0.123E1, 0.27182817E1) = LESS compareReal (~0.123E1, 0.27182817E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.11754944E~37) = LESS compareReal (~0.123E1, 0.11754944E~37) = LESS compare (~0.123E1, 0.5877472E~38) = LESS compareReal (~0.123E1, 0.5877472E~38) = LESS compare (~0.123E1, 0.1E~44) = LESS compareReal (~0.123E1, 0.1E~44) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.34028235E39) = GREATER compareReal (~0.123E1, ~0.34028235E39) = GREATER compare (~0.123E1, ~0.17014117E39) = GREATER compareReal (~0.123E1, ~0.17014117E39) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.31415927E1) = GREATER compareReal (~0.123E1, ~0.31415927E1) = GREATER compare (~0.123E1, ~0.27182817E1) = GREATER compareReal (~0.123E1, ~0.27182817E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.11754944E~37) = LESS compareReal (~0.123E1, ~0.11754944E~37) = LESS compare (~0.123E1, ~0.5877472E~38) = LESS compareReal (~0.123E1, ~0.5877472E~38) = LESS compare (~0.123E1, ~0.1E~44) = LESS compareReal (~0.123E1, ~0.1E~44) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.34028235E39) = LESS compareReal (~0.123, 0.34028235E39) = LESS compare (~0.123, 0.17014117E39) = LESS compareReal (~0.123, 0.17014117E39) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.31415927E1) = LESS compareReal (~0.123, 0.31415927E1) = LESS compare (~0.123, 0.27182817E1) = LESS compareReal (~0.123, 0.27182817E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.11754944E~37) = LESS compareReal (~0.123, 0.11754944E~37) = LESS compare (~0.123, 0.5877472E~38) = LESS compareReal (~0.123, 0.5877472E~38) = LESS compare (~0.123, 0.1E~44) = LESS compareReal (~0.123, 0.1E~44) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.34028235E39) = GREATER compareReal (~0.123, ~0.34028235E39) = GREATER compare (~0.123, ~0.17014117E39) = GREATER compareReal (~0.123, ~0.17014117E39) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.31415927E1) = GREATER compareReal (~0.123, ~0.31415927E1) = GREATER compare (~0.123, ~0.27182817E1) = GREATER compareReal (~0.123, ~0.27182817E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.11754944E~37) = LESS compareReal (~0.123, ~0.11754944E~37) = LESS compare (~0.123, ~0.5877472E~38) = LESS compareReal (~0.123, ~0.5877472E~38) = LESS compare (~0.123, ~0.1E~44) = LESS compareReal (~0.123, ~0.1E~44) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.34028235E39) = LESS compareReal (~0.123E~2, 0.34028235E39) = LESS compare (~0.123E~2, 0.17014117E39) = LESS compareReal (~0.123E~2, 0.17014117E39) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.31415927E1) = LESS compareReal (~0.123E~2, 0.31415927E1) = LESS compare (~0.123E~2, 0.27182817E1) = LESS compareReal (~0.123E~2, 0.27182817E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.11754944E~37) = LESS compareReal (~0.123E~2, 0.11754944E~37) = LESS compare (~0.123E~2, 0.5877472E~38) = LESS compareReal (~0.123E~2, 0.5877472E~38) = LESS compare (~0.123E~2, 0.1E~44) = LESS compareReal (~0.123E~2, 0.1E~44) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.34028235E39) = GREATER compareReal (~0.123E~2, ~0.34028235E39) = GREATER compare (~0.123E~2, ~0.17014117E39) = GREATER compareReal (~0.123E~2, ~0.17014117E39) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.31415927E1) = GREATER compareReal (~0.123E~2, ~0.31415927E1) = GREATER compare (~0.123E~2, ~0.27182817E1) = GREATER compareReal (~0.123E~2, ~0.27182817E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.11754944E~37) = LESS compareReal (~0.123E~2, ~0.11754944E~37) = LESS compare (~0.123E~2, ~0.5877472E~38) = LESS compareReal (~0.123E~2, ~0.5877472E~38) = LESS compare (~0.123E~2, ~0.1E~44) = LESS compareReal (~0.123E~2, ~0.1E~44) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.11754944E~37, 0.34028235E39) = LESS compareReal (~0.11754944E~37, 0.34028235E39) = LESS compare (~0.11754944E~37, 0.17014117E39) = LESS compareReal (~0.11754944E~37, 0.17014117E39) = LESS compare (~0.11754944E~37, 0.123E4) = LESS compareReal (~0.11754944E~37, 0.123E4) = LESS compare (~0.11754944E~37, 0.123E2) = LESS compareReal (~0.11754944E~37, 0.123E2) = LESS compare (~0.11754944E~37, 0.31415927E1) = LESS compareReal (~0.11754944E~37, 0.31415927E1) = LESS compare (~0.11754944E~37, 0.27182817E1) = LESS compareReal (~0.11754944E~37, 0.27182817E1) = LESS compare (~0.11754944E~37, 0.123E1) = LESS compareReal (~0.11754944E~37, 0.123E1) = LESS compare (~0.11754944E~37, 0.123) = LESS compareReal (~0.11754944E~37, 0.123) = LESS compare (~0.11754944E~37, 0.123E~2) = LESS compareReal (~0.11754944E~37, 0.123E~2) = LESS compare (~0.11754944E~37, 0.11754944E~37) = LESS compareReal (~0.11754944E~37, 0.11754944E~37) = LESS compare (~0.11754944E~37, 0.5877472E~38) = LESS compareReal (~0.11754944E~37, 0.5877472E~38) = LESS compare (~0.11754944E~37, 0.1E~44) = LESS compareReal (~0.11754944E~37, 0.1E~44) = LESS compare (~0.11754944E~37, 0.0) = LESS compareReal (~0.11754944E~37, 0.0) = LESS compare (~0.11754944E~37, ~0.34028235E39) = GREATER compareReal (~0.11754944E~37, ~0.34028235E39) = GREATER compare (~0.11754944E~37, ~0.17014117E39) = GREATER compareReal (~0.11754944E~37, ~0.17014117E39) = GREATER compare (~0.11754944E~37, ~0.123E4) = GREATER compareReal (~0.11754944E~37, ~0.123E4) = GREATER compare (~0.11754944E~37, ~0.123E2) = GREATER compareReal (~0.11754944E~37, ~0.123E2) = GREATER compare (~0.11754944E~37, ~0.31415927E1) = GREATER compareReal (~0.11754944E~37, ~0.31415927E1) = GREATER compare (~0.11754944E~37, ~0.27182817E1) = GREATER compareReal (~0.11754944E~37, ~0.27182817E1) = GREATER compare (~0.11754944E~37, ~0.123E1) = GREATER compareReal (~0.11754944E~37, ~0.123E1) = GREATER compare (~0.11754944E~37, ~0.123) = GREATER compareReal (~0.11754944E~37, ~0.123) = GREATER compare (~0.11754944E~37, ~0.123E~2) = GREATER compareReal (~0.11754944E~37, ~0.123E~2) = GREATER compare (~0.11754944E~37, ~0.11754944E~37) = EQUAL compareReal (~0.11754944E~37, ~0.11754944E~37) = EQUAL compare (~0.11754944E~37, ~0.5877472E~38) = LESS compareReal (~0.11754944E~37, ~0.5877472E~38) = LESS compare (~0.11754944E~37, ~0.1E~44) = LESS compareReal (~0.11754944E~37, ~0.1E~44) = LESS compare (~0.11754944E~37, ~0.0) = LESS compareReal (~0.11754944E~37, ~0.0) = LESS compare (~0.5877472E~38, 0.34028235E39) = LESS compareReal (~0.5877472E~38, 0.34028235E39) = LESS compare (~0.5877472E~38, 0.17014117E39) = LESS compareReal (~0.5877472E~38, 0.17014117E39) = LESS compare (~0.5877472E~38, 0.123E4) = LESS compareReal (~0.5877472E~38, 0.123E4) = LESS compare (~0.5877472E~38, 0.123E2) = LESS compareReal (~0.5877472E~38, 0.123E2) = LESS compare (~0.5877472E~38, 0.31415927E1) = LESS compareReal (~0.5877472E~38, 0.31415927E1) = LESS compare (~0.5877472E~38, 0.27182817E1) = LESS compareReal (~0.5877472E~38, 0.27182817E1) = LESS compare (~0.5877472E~38, 0.123E1) = LESS compareReal (~0.5877472E~38, 0.123E1) = LESS compare (~0.5877472E~38, 0.123) = LESS compareReal (~0.5877472E~38, 0.123) = LESS compare (~0.5877472E~38, 0.123E~2) = LESS compareReal (~0.5877472E~38, 0.123E~2) = LESS compare (~0.5877472E~38, 0.11754944E~37) = LESS compareReal (~0.5877472E~38, 0.11754944E~37) = LESS compare (~0.5877472E~38, 0.5877472E~38) = LESS compareReal (~0.5877472E~38, 0.5877472E~38) = LESS compare (~0.5877472E~38, 0.1E~44) = LESS compareReal (~0.5877472E~38, 0.1E~44) = LESS compare (~0.5877472E~38, 0.0) = LESS compareReal (~0.5877472E~38, 0.0) = LESS compare (~0.5877472E~38, ~0.34028235E39) = GREATER compareReal (~0.5877472E~38, ~0.34028235E39) = GREATER compare (~0.5877472E~38, ~0.17014117E39) = GREATER compareReal (~0.5877472E~38, ~0.17014117E39) = GREATER compare (~0.5877472E~38, ~0.123E4) = GREATER compareReal (~0.5877472E~38, ~0.123E4) = GREATER compare (~0.5877472E~38, ~0.123E2) = GREATER compareReal (~0.5877472E~38, ~0.123E2) = GREATER compare (~0.5877472E~38, ~0.31415927E1) = GREATER compareReal (~0.5877472E~38, ~0.31415927E1) = GREATER compare (~0.5877472E~38, ~0.27182817E1) = GREATER compareReal (~0.5877472E~38, ~0.27182817E1) = GREATER compare (~0.5877472E~38, ~0.123E1) = GREATER compareReal (~0.5877472E~38, ~0.123E1) = GREATER compare (~0.5877472E~38, ~0.123) = GREATER compareReal (~0.5877472E~38, ~0.123) = GREATER compare (~0.5877472E~38, ~0.123E~2) = GREATER compareReal (~0.5877472E~38, ~0.123E~2) = GREATER compare (~0.5877472E~38, ~0.11754944E~37) = GREATER compareReal (~0.5877472E~38, ~0.11754944E~37) = GREATER compare (~0.5877472E~38, ~0.5877472E~38) = EQUAL compareReal (~0.5877472E~38, ~0.5877472E~38) = EQUAL compare (~0.5877472E~38, ~0.1E~44) = LESS compareReal (~0.5877472E~38, ~0.1E~44) = LESS compare (~0.5877472E~38, ~0.0) = LESS compareReal (~0.5877472E~38, ~0.0) = LESS compare (~0.1E~44, 0.34028235E39) = LESS compareReal (~0.1E~44, 0.34028235E39) = LESS compare (~0.1E~44, 0.17014117E39) = LESS compareReal (~0.1E~44, 0.17014117E39) = LESS compare (~0.1E~44, 0.123E4) = LESS compareReal (~0.1E~44, 0.123E4) = LESS compare (~0.1E~44, 0.123E2) = LESS compareReal (~0.1E~44, 0.123E2) = LESS compare (~0.1E~44, 0.31415927E1) = LESS compareReal (~0.1E~44, 0.31415927E1) = LESS compare (~0.1E~44, 0.27182817E1) = LESS compareReal (~0.1E~44, 0.27182817E1) = LESS compare (~0.1E~44, 0.123E1) = LESS compareReal (~0.1E~44, 0.123E1) = LESS compare (~0.1E~44, 0.123) = LESS compareReal (~0.1E~44, 0.123) = LESS compare (~0.1E~44, 0.123E~2) = LESS compareReal (~0.1E~44, 0.123E~2) = LESS compare (~0.1E~44, 0.11754944E~37) = LESS compareReal (~0.1E~44, 0.11754944E~37) = LESS compare (~0.1E~44, 0.5877472E~38) = LESS compareReal (~0.1E~44, 0.5877472E~38) = LESS compare (~0.1E~44, 0.1E~44) = LESS compareReal (~0.1E~44, 0.1E~44) = LESS compare (~0.1E~44, 0.0) = LESS compareReal (~0.1E~44, 0.0) = LESS compare (~0.1E~44, ~0.34028235E39) = GREATER compareReal (~0.1E~44, ~0.34028235E39) = GREATER compare (~0.1E~44, ~0.17014117E39) = GREATER compareReal (~0.1E~44, ~0.17014117E39) = GREATER compare (~0.1E~44, ~0.123E4) = GREATER compareReal (~0.1E~44, ~0.123E4) = GREATER compare (~0.1E~44, ~0.123E2) = GREATER compareReal (~0.1E~44, ~0.123E2) = GREATER compare (~0.1E~44, ~0.31415927E1) = GREATER compareReal (~0.1E~44, ~0.31415927E1) = GREATER compare (~0.1E~44, ~0.27182817E1) = GREATER compareReal (~0.1E~44, ~0.27182817E1) = GREATER compare (~0.1E~44, ~0.123E1) = GREATER compareReal (~0.1E~44, ~0.123E1) = GREATER compare (~0.1E~44, ~0.123) = GREATER compareReal (~0.1E~44, ~0.123) = GREATER compare (~0.1E~44, ~0.123E~2) = GREATER compareReal (~0.1E~44, ~0.123E~2) = GREATER compare (~0.1E~44, ~0.11754944E~37) = GREATER compareReal (~0.1E~44, ~0.11754944E~37) = GREATER compare (~0.1E~44, ~0.5877472E~38) = GREATER compareReal (~0.1E~44, ~0.5877472E~38) = GREATER compare (~0.1E~44, ~0.1E~44) = EQUAL compareReal (~0.1E~44, ~0.1E~44) = EQUAL compare (~0.1E~44, ~0.0) = LESS compareReal (~0.1E~44, ~0.0) = LESS compare (~0.0, 0.34028235E39) = LESS compareReal (~0.0, 0.34028235E39) = LESS compare (~0.0, 0.17014117E39) = LESS compareReal (~0.0, 0.17014117E39) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.31415927E1) = LESS compareReal (~0.0, 0.31415927E1) = LESS compare (~0.0, 0.27182817E1) = LESS compareReal (~0.0, 0.27182817E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.11754944E~37) = LESS compareReal (~0.0, 0.11754944E~37) = LESS compare (~0.0, 0.5877472E~38) = LESS compareReal (~0.0, 0.5877472E~38) = LESS compare (~0.0, 0.1E~44) = LESS compareReal (~0.0, 0.1E~44) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.34028235E39) = GREATER compareReal (~0.0, ~0.34028235E39) = GREATER compare (~0.0, ~0.17014117E39) = GREATER compareReal (~0.0, ~0.17014117E39) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.31415927E1) = GREATER compareReal (~0.0, ~0.31415927E1) = GREATER compare (~0.0, ~0.27182817E1) = GREATER compareReal (~0.0, ~0.27182817E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.11754944E~37) = GREATER compareReal (~0.0, ~0.11754944E~37) = GREATER compare (~0.0, ~0.5877472E~38) = GREATER compareReal (~0.0, ~0.5877472E~38) = GREATER compare (~0.0, ~0.1E~44) = GREATER compareReal (~0.0, ~0.1E~44) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan true ~nan nan true 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.{~,*,+,-,/,nextAfter,rem} ~ (0.17976931348623157E309) = ~0.17976931348623157E309 ~ (0.8988465674311579E308) = ~0.8988465674311579E308 ~ (0.123E4) = ~0.123E4 ~ (0.123E2) = ~0.123E2 ~ (0.3141592653589793E1) = ~0.3141592653589793E1 ~ (0.2718281828459045E1) = ~0.2718281828459045E1 ~ (0.123E1) = ~0.123E1 ~ (0.123) = ~0.123 ~ (0.123E~2) = ~0.123E~2 ~ (0.22250738585072014E~307) = ~0.22250738585072014E~307 ~ (0.11125369292536007E~307) = ~0.11125369292536007E~307 ~ (0.5E~323) = ~0.5E~323 ~ (0.0) = ~0.0 ~ (~0.17976931348623157E309) = 0.17976931348623157E309 ~ (~0.8988465674311579E308) = 0.8988465674311579E308 ~ (~0.123E4) = 0.123E4 ~ (~0.123E2) = 0.123E2 ~ (~0.3141592653589793E1) = 0.3141592653589793E1 ~ (~0.2718281828459045E1) = 0.2718281828459045E1 ~ (~0.123E1) = 0.123E1 ~ (~0.123) = 0.123 ~ (~0.123E~2) = 0.123E~2 ~ (~0.22250738585072014E~307) = 0.22250738585072014E~307 ~ (~0.11125369292536007E~307) = 0.11125369292536007E~307 ~ (~0.5E~323) = 0.5E~323 ~ (~0.0) = 0.0 ~ (inf) = ~inf ~ (~inf) = inf ~ (nan) = nan ~ (inf) = ~inf * (0.17976931348623157E309, 0.17976931348623157E309) = inf + (0.17976931348623157E309, 0.17976931348623157E309) = inf - (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 / (0.17976931348623157E309, 0.17976931348623157E309) = 0.1E1 nextAfter (0.17976931348623157E309, 0.17976931348623157E309) = 0.17976931348623157E309 rem (0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, 0.8988465674311579E308) = inf + (0.17976931348623157E309, 0.8988465674311579E308) = inf - (0.17976931348623157E309, 0.8988465674311579E308) = 0.8988465674311579E308 / (0.17976931348623157E309, 0.8988465674311579E308) = 0.2E1 nextAfter (0.17976931348623157E309, 0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, 0.123E4) = inf + (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E4) = 0.1461539134034403E306 nextAfter (0.17976931348623157E309, 0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E4) = 0.41709943968791996E292 * (0.17976931348623157E309, 0.123E2) = inf + (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E2) = 0.1461539134034403E308 nextAfter (0.17976931348623157E309, 0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E2) = 0.43366647350729996E292 * (0.17976931348623157E309, 0.3141592653589793E1) = inf + (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (0.17976931348623157E309, 0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.3141592653589793E1) = 0.7289494880527199E292 * (0.17976931348623157E309, 0.2718281828459045E1) = inf + (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.2718281828459045E1) = 0.661334345850887E308 nextAfter (0.17976931348623157E309, 0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.2718281828459045E1) = 0.106516282144602E293 * (0.17976931348623157E309, 0.123E1) = inf + (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E1) = 0.1461539134034403E309 nextAfter (0.17976931348623157E309, 0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E1) = 0.111778751710758E293 * (0.17976931348623157E309, 0.123) = 0.22111625558806483E308 + (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123) = inf nextAfter (0.17976931348623157E309, 0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123) = ~inf * (0.17976931348623157E309, 0.123E~2) = 0.2211162555880648E306 + (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.123E~2) = inf nextAfter (0.17976931348623157E309, 0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.123E~2) = ~inf * (0.17976931348623157E309, 0.22250738585072014E~307) = 0.39999999999999996E1 + (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.22250738585072014E~307) = inf nextAfter (0.17976931348623157E309, 0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, 0.11125369292536007E~307) = 0.19999999999999998E1 + (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.11125369292536007E~307) = inf nextAfter (0.17976931348623157E309, 0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, 0.5E~323) = 0.8881784197001251E~15 + (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.5E~323) = inf nextAfter (0.17976931348623157E309, 0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.5E~323) = ~inf * (0.17976931348623157E309, 0.0) = 0.0 + (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, 0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, 0.0) = inf nextAfter (0.17976931348623157E309, 0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, 0.0) = nan * (0.17976931348623157E309, ~0.17976931348623157E309) = ~inf + (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 - (0.17976931348623157E309, ~0.17976931348623157E309) = inf / (0.17976931348623157E309, ~0.17976931348623157E309) = ~0.1E1 nextAfter (0.17976931348623157E309, ~0.17976931348623157E309) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (0.17976931348623157E309, ~0.8988465674311579E308) = ~inf + (0.17976931348623157E309, ~0.8988465674311579E308) = 0.8988465674311579E308 - (0.17976931348623157E309, ~0.8988465674311579E308) = inf / (0.17976931348623157E309, ~0.8988465674311579E308) = ~0.2E1 nextAfter (0.17976931348623157E309, ~0.8988465674311579E308) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (0.17976931348623157E309, ~0.123E4) = ~inf + (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E4) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E4) = ~0.1461539134034403E306 nextAfter (0.17976931348623157E309, ~0.123E4) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E4) = 0.41709943968791996E292 * (0.17976931348623157E309, ~0.123E2) = ~inf + (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E2) = ~0.1461539134034403E308 nextAfter (0.17976931348623157E309, ~0.123E2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E2) = 0.43366647350729996E292 * (0.17976931348623157E309, ~0.3141592653589793E1) = ~inf + (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (0.17976931348623157E309, ~0.3141592653589793E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.3141592653589793E1) = 0.7289494880527199E292 * (0.17976931348623157E309, ~0.2718281828459045E1) = ~inf + (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (0.17976931348623157E309, ~0.2718281828459045E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.2718281828459045E1) = 0.106516282144602E293 * (0.17976931348623157E309, ~0.123E1) = ~inf + (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E1) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E1) = ~0.1461539134034403E309 nextAfter (0.17976931348623157E309, ~0.123E1) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E1) = 0.111778751710758E293 * (0.17976931348623157E309, ~0.123) = ~0.22111625558806483E308 + (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123) = ~inf nextAfter (0.17976931348623157E309, ~0.123) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123) = ~inf * (0.17976931348623157E309, ~0.123E~2) = ~0.2211162555880648E306 + (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.123E~2) = ~inf nextAfter (0.17976931348623157E309, ~0.123E~2) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.123E~2) = ~inf * (0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.39999999999999996E1 + (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.22250738585072014E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.22250738585072014E~307) = ~inf * (0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.19999999999999998E1 + (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf nextAfter (0.17976931348623157E309, ~0.11125369292536007E~307) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.11125369292536007E~307) = ~inf * (0.17976931348623157E309, ~0.5E~323) = ~0.8881784197001251E~15 + (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.5E~323) = ~inf nextAfter (0.17976931348623157E309, ~0.5E~323) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.5E~323) = ~inf * (0.17976931348623157E309, ~0.0) = ~0.0 + (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 - (0.17976931348623157E309, ~0.0) = 0.17976931348623157E309 / (0.17976931348623157E309, ~0.0) = ~inf nextAfter (0.17976931348623157E309, ~0.0) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~0.0) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.17976931348623157E309, ~inf) = ~inf + (0.17976931348623157E309, ~inf) = ~inf - (0.17976931348623157E309, ~inf) = inf / (0.17976931348623157E309, ~inf) = ~0.0 nextAfter (0.17976931348623157E309, ~inf) = 0.17976931348623155E309 rem (0.17976931348623157E309, ~inf) = 0.17976931348623157E309 * (0.17976931348623157E309, nan) = nan + (0.17976931348623157E309, nan) = nan - (0.17976931348623157E309, nan) = nan / (0.17976931348623157E309, nan) = nan nextAfter (0.17976931348623157E309, nan) = nan rem (0.17976931348623157E309, nan) = nan * (0.17976931348623157E309, inf) = inf + (0.17976931348623157E309, inf) = inf - (0.17976931348623157E309, inf) = ~inf / (0.17976931348623157E309, inf) = 0.0 nextAfter (0.17976931348623157E309, inf) = inf rem (0.17976931348623157E309, inf) = 0.17976931348623157E309 * (0.8988465674311579E308, 0.17976931348623157E309) = inf + (0.8988465674311579E308, 0.17976931348623157E309) = inf - (0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 / (0.8988465674311579E308, 0.17976931348623157E309) = 0.5 nextAfter (0.8988465674311579E308, 0.17976931348623157E309) = 0.898846567431158E308 rem (0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, 0.8988465674311579E308) = inf + (0.8988465674311579E308, 0.8988465674311579E308) = 0.17976931348623157E309 - (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 / (0.8988465674311579E308, 0.8988465674311579E308) = 0.1E1 nextAfter (0.8988465674311579E308, 0.8988465674311579E308) = 0.8988465674311579E308 rem (0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, 0.123E4) = inf + (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E4) = 0.7307695670172015E305 nextAfter (0.8988465674311579E308, 0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E4) = 0.20854971984395998E292 * (0.8988465674311579E308, 0.123E2) = inf + (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E2) = 0.7307695670172014E307 nextAfter (0.8988465674311579E308, 0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E2) = 0.21683323675364998E292 * (0.8988465674311579E308, 0.3141592653589793E1) = inf + (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (0.8988465674311579E308, 0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.3141592653589793E1) = 0.36447474402635997E292 * (0.8988465674311579E308, 0.2718281828459045E1) = inf + (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (0.8988465674311579E308, 0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.2718281828459045E1) = 0.53258141072301E292 * (0.8988465674311579E308, 0.123E1) = 0.1105581277940324E309 + (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E1) = 0.7307695670172015E308 nextAfter (0.8988465674311579E308, 0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E1) = 0.55889375855379E292 * (0.8988465674311579E308, 0.123) = 0.11055812779403241E308 + (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123) = inf nextAfter (0.8988465674311579E308, 0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123) = ~inf * (0.8988465674311579E308, 0.123E~2) = 0.1105581277940324E306 + (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.123E~2) = inf nextAfter (0.8988465674311579E308, 0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.123E~2) = ~inf * (0.8988465674311579E308, 0.22250738585072014E~307) = 0.19999999999999998E1 + (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.22250738585072014E~307) = inf nextAfter (0.8988465674311579E308, 0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, 0.11125369292536007E~307) = 0.9999999999999999 + (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.11125369292536007E~307) = inf nextAfter (0.8988465674311579E308, 0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, 0.5E~323) = 0.44408920985006257E~15 + (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.5E~323) = inf nextAfter (0.8988465674311579E308, 0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.5E~323) = ~inf * (0.8988465674311579E308, 0.0) = 0.0 + (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, 0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, 0.0) = inf nextAfter (0.8988465674311579E308, 0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, 0.0) = nan * (0.8988465674311579E308, ~0.17976931348623157E309) = ~inf + (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 - (0.8988465674311579E308, ~0.17976931348623157E309) = inf / (0.8988465674311579E308, ~0.17976931348623157E309) = ~0.5 nextAfter (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 * (0.8988465674311579E308, ~0.8988465674311579E308) = ~inf + (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 - (0.8988465674311579E308, ~0.8988465674311579E308) = 0.17976931348623157E309 / (0.8988465674311579E308, ~0.8988465674311579E308) = ~0.1E1 nextAfter (0.8988465674311579E308, ~0.8988465674311579E308) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (0.8988465674311579E308, ~0.123E4) = ~inf + (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E4) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E4) = ~0.7307695670172015E305 nextAfter (0.8988465674311579E308, ~0.123E4) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E4) = 0.20854971984395998E292 * (0.8988465674311579E308, ~0.123E2) = ~inf + (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E2) = ~0.7307695670172014E307 nextAfter (0.8988465674311579E308, ~0.123E2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E2) = 0.21683323675364998E292 * (0.8988465674311579E308, ~0.3141592653589793E1) = ~inf + (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (0.8988465674311579E308, ~0.3141592653589793E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.3141592653589793E1) = 0.36447474402635997E292 * (0.8988465674311579E308, ~0.2718281828459045E1) = ~inf + (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (0.8988465674311579E308, ~0.2718281828459045E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.2718281828459045E1) = 0.53258141072301E292 * (0.8988465674311579E308, ~0.123E1) = ~0.1105581277940324E309 + (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E1) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E1) = ~0.7307695670172015E308 nextAfter (0.8988465674311579E308, ~0.123E1) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E1) = 0.55889375855379E292 * (0.8988465674311579E308, ~0.123) = ~0.11055812779403241E308 + (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123) = ~inf nextAfter (0.8988465674311579E308, ~0.123) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123) = ~inf * (0.8988465674311579E308, ~0.123E~2) = ~0.1105581277940324E306 + (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.123E~2) = ~inf nextAfter (0.8988465674311579E308, ~0.123E~2) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.123E~2) = ~inf * (0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.19999999999999998E1 + (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.22250738585072014E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.22250738585072014E~307) = ~inf * (0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.9999999999999999 + (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf nextAfter (0.8988465674311579E308, ~0.11125369292536007E~307) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.11125369292536007E~307) = ~inf * (0.8988465674311579E308, ~0.5E~323) = ~0.44408920985006257E~15 + (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.5E~323) = ~inf nextAfter (0.8988465674311579E308, ~0.5E~323) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.5E~323) = ~inf * (0.8988465674311579E308, ~0.0) = ~0.0 + (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 - (0.8988465674311579E308, ~0.0) = 0.8988465674311579E308 / (0.8988465674311579E308, ~0.0) = ~inf nextAfter (0.8988465674311579E308, ~0.0) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~0.0) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.8988465674311579E308, ~inf) = ~inf + (0.8988465674311579E308, ~inf) = ~inf - (0.8988465674311579E308, ~inf) = inf / (0.8988465674311579E308, ~inf) = ~0.0 nextAfter (0.8988465674311579E308, ~inf) = 0.8988465674311578E308 rem (0.8988465674311579E308, ~inf) = 0.8988465674311579E308 * (0.8988465674311579E308, nan) = nan + (0.8988465674311579E308, nan) = nan - (0.8988465674311579E308, nan) = nan / (0.8988465674311579E308, nan) = nan nextAfter (0.8988465674311579E308, nan) = nan rem (0.8988465674311579E308, nan) = nan * (0.8988465674311579E308, inf) = inf + (0.8988465674311579E308, inf) = inf - (0.8988465674311579E308, inf) = ~inf / (0.8988465674311579E308, inf) = 0.0 nextAfter (0.8988465674311579E308, inf) = 0.898846567431158E308 rem (0.8988465674311579E308, inf) = 0.8988465674311579E308 * (0.123E4, 0.17976931348623157E309) = inf + (0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E4, 0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (0.123E4, 0.17976931348623157E309) = 0.12300000000000002E4 rem (0.123E4, 0.17976931348623157E309) = 0.123E4 * (0.123E4, 0.8988465674311579E308) = inf + (0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E4, 0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (0.123E4, 0.8988465674311579E308) = 0.12300000000000002E4 rem (0.123E4, 0.8988465674311579E308) = 0.123E4 * (0.123E4, 0.123E4) = 0.15129E7 + (0.123E4, 0.123E4) = 0.246E4 - (0.123E4, 0.123E4) = 0.0 / (0.123E4, 0.123E4) = 0.1E1 nextAfter (0.123E4, 0.123E4) = 0.123E4 rem (0.123E4, 0.123E4) = 0.0 * (0.123E4, 0.123E2) = 0.15129E5 + (0.123E4, 0.123E2) = 0.12423E4 - (0.123E4, 0.123E2) = 0.12177E4 / (0.123E4, 0.123E2) = 0.1E3 nextAfter (0.123E4, 0.123E2) = 0.12299999999999998E4 rem (0.123E4, 0.123E2) = ~0.7105427357601002E~13 * (0.123E4, 0.3141592653589793E1) = 0.38641589639154454E4 + (0.123E4, 0.3141592653589793E1) = 0.123314159265359E4 - (0.123E4, 0.3141592653589793E1) = 0.122685840734641E4 / (0.123E4, 0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (0.123E4, 0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, 0.3141592653589793E1) = 0.16372724463908916E1 * (0.123E4, 0.2718281828459045E1) = 0.33434866490046256E4 + (0.123E4, 0.2718281828459045E1) = 0.1232718281828459E4 - (0.123E4, 0.2718281828459045E1) = 0.1227281718171541E4 / (0.123E4, 0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (0.123E4, 0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, 0.2718281828459045E1) = 0.1336613536511619E1 * (0.123E4, 0.123E1) = 0.15129E4 + (0.123E4, 0.123E1) = 0.123123E4 - (0.123E4, 0.123E1) = 0.122877E4 / (0.123E4, 0.123E1) = 0.1E4 nextAfter (0.123E4, 0.123E1) = 0.12299999999999998E4 rem (0.123E4, 0.123E1) = 0.17763568394002505E~13 * (0.123E4, 0.123) = 0.15129E3 + (0.123E4, 0.123) = 0.1230123E4 - (0.123E4, 0.123) = 0.1229877E4 / (0.123E4, 0.123) = 0.1E5 nextAfter (0.123E4, 0.123) = 0.12299999999999998E4 rem (0.123E4, 0.123) = 0.17763568394002505E~13 * (0.123E4, 0.123E~2) = 0.15129E1 + (0.123E4, 0.123E~2) = 0.123000123E4 - (0.123E4, 0.123E~2) = 0.122999877E4 / (0.123E4, 0.123E~2) = 0.1E7 nextAfter (0.123E4, 0.123E~2) = 0.12299999999999998E4 rem (0.123E4, 0.123E~2) = 0.26423307986078726E~13 * (0.123E4, 0.22250738585072014E~307) = 0.27368408459638577E~304 + (0.123E4, 0.22250738585072014E~307) = 0.123E4 - (0.123E4, 0.22250738585072014E~307) = 0.123E4 / (0.123E4, 0.22250738585072014E~307) = inf nextAfter (0.123E4, 0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, 0.22250738585072014E~307) = ~inf * (0.123E4, 0.11125369292536007E~307) = 0.13684204229819289E~304 + (0.123E4, 0.11125369292536007E~307) = 0.123E4 - (0.123E4, 0.11125369292536007E~307) = 0.123E4 / (0.123E4, 0.11125369292536007E~307) = inf nextAfter (0.123E4, 0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, 0.11125369292536007E~307) = ~inf * (0.123E4, 0.5E~323) = 0.6077E~320 + (0.123E4, 0.5E~323) = 0.123E4 - (0.123E4, 0.5E~323) = 0.123E4 / (0.123E4, 0.5E~323) = inf nextAfter (0.123E4, 0.5E~323) = 0.12299999999999998E4 rem (0.123E4, 0.5E~323) = ~inf * (0.123E4, 0.0) = 0.0 + (0.123E4, 0.0) = 0.123E4 - (0.123E4, 0.0) = 0.123E4 / (0.123E4, 0.0) = inf nextAfter (0.123E4, 0.0) = 0.12299999999999998E4 rem (0.123E4, 0.0) = nan * (0.123E4, ~0.17976931348623157E309) = ~inf + (0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E4, ~0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (0.123E4, ~0.17976931348623157E309) = 0.12299999999999998E4 rem (0.123E4, ~0.17976931348623157E309) = 0.123E4 * (0.123E4, ~0.8988465674311579E308) = ~inf + (0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E4, ~0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (0.123E4, ~0.8988465674311579E308) = 0.12299999999999998E4 rem (0.123E4, ~0.8988465674311579E308) = 0.123E4 * (0.123E4, ~0.123E4) = ~0.15129E7 + (0.123E4, ~0.123E4) = 0.0 - (0.123E4, ~0.123E4) = 0.246E4 / (0.123E4, ~0.123E4) = ~0.1E1 nextAfter (0.123E4, ~0.123E4) = 0.12299999999999998E4 rem (0.123E4, ~0.123E4) = 0.0 * (0.123E4, ~0.123E2) = ~0.15129E5 + (0.123E4, ~0.123E2) = 0.12177E4 - (0.123E4, ~0.123E2) = 0.12423E4 / (0.123E4, ~0.123E2) = ~0.1E3 nextAfter (0.123E4, ~0.123E2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E2) = ~0.7105427357601002E~13 * (0.123E4, ~0.3141592653589793E1) = ~0.38641589639154454E4 + (0.123E4, ~0.3141592653589793E1) = 0.122685840734641E4 - (0.123E4, ~0.3141592653589793E1) = 0.123314159265359E4 / (0.123E4, ~0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (0.123E4, ~0.3141592653589793E1) = 0.12299999999999998E4 rem (0.123E4, ~0.3141592653589793E1) = 0.16372724463908916E1 * (0.123E4, ~0.2718281828459045E1) = ~0.33434866490046256E4 + (0.123E4, ~0.2718281828459045E1) = 0.1227281718171541E4 - (0.123E4, ~0.2718281828459045E1) = 0.1232718281828459E4 / (0.123E4, ~0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (0.123E4, ~0.2718281828459045E1) = 0.12299999999999998E4 rem (0.123E4, ~0.2718281828459045E1) = 0.1336613536511619E1 * (0.123E4, ~0.123E1) = ~0.15129E4 + (0.123E4, ~0.123E1) = 0.122877E4 - (0.123E4, ~0.123E1) = 0.123123E4 / (0.123E4, ~0.123E1) = ~0.1E4 nextAfter (0.123E4, ~0.123E1) = 0.12299999999999998E4 rem (0.123E4, ~0.123E1) = 0.17763568394002505E~13 * (0.123E4, ~0.123) = ~0.15129E3 + (0.123E4, ~0.123) = 0.1229877E4 - (0.123E4, ~0.123) = 0.1230123E4 / (0.123E4, ~0.123) = ~0.1E5 nextAfter (0.123E4, ~0.123) = 0.12299999999999998E4 rem (0.123E4, ~0.123) = 0.17763568394002505E~13 * (0.123E4, ~0.123E~2) = ~0.15129E1 + (0.123E4, ~0.123E~2) = 0.122999877E4 - (0.123E4, ~0.123E~2) = 0.123000123E4 / (0.123E4, ~0.123E~2) = ~0.1E7 nextAfter (0.123E4, ~0.123E~2) = 0.12299999999999998E4 rem (0.123E4, ~0.123E~2) = 0.26423307986078726E~13 * (0.123E4, ~0.22250738585072014E~307) = ~0.27368408459638577E~304 + (0.123E4, ~0.22250738585072014E~307) = 0.123E4 - (0.123E4, ~0.22250738585072014E~307) = 0.123E4 / (0.123E4, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E4, ~0.22250738585072014E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.22250738585072014E~307) = ~inf * (0.123E4, ~0.11125369292536007E~307) = ~0.13684204229819289E~304 + (0.123E4, ~0.11125369292536007E~307) = 0.123E4 - (0.123E4, ~0.11125369292536007E~307) = 0.123E4 / (0.123E4, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E4, ~0.11125369292536007E~307) = 0.12299999999999998E4 rem (0.123E4, ~0.11125369292536007E~307) = ~inf * (0.123E4, ~0.5E~323) = ~0.6077E~320 + (0.123E4, ~0.5E~323) = 0.123E4 - (0.123E4, ~0.5E~323) = 0.123E4 / (0.123E4, ~0.5E~323) = ~inf nextAfter (0.123E4, ~0.5E~323) = 0.12299999999999998E4 rem (0.123E4, ~0.5E~323) = ~inf * (0.123E4, ~0.0) = ~0.0 + (0.123E4, ~0.0) = 0.123E4 - (0.123E4, ~0.0) = 0.123E4 / (0.123E4, ~0.0) = ~inf nextAfter (0.123E4, ~0.0) = 0.12299999999999998E4 rem (0.123E4, ~0.0) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E4, ~inf) = ~inf + (0.123E4, ~inf) = ~inf - (0.123E4, ~inf) = inf / (0.123E4, ~inf) = ~0.0 nextAfter (0.123E4, ~inf) = 0.12299999999999998E4 rem (0.123E4, ~inf) = 0.123E4 * (0.123E4, nan) = nan + (0.123E4, nan) = nan - (0.123E4, nan) = nan / (0.123E4, nan) = nan nextAfter (0.123E4, nan) = nan rem (0.123E4, nan) = nan * (0.123E4, inf) = inf + (0.123E4, inf) = inf - (0.123E4, inf) = ~inf / (0.123E4, inf) = 0.0 nextAfter (0.123E4, inf) = 0.12300000000000002E4 rem (0.123E4, inf) = 0.123E4 * (0.123E2, 0.17976931348623157E309) = inf + (0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E2, 0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (0.123E2, 0.17976931348623157E309) = 0.12300000000000002E2 rem (0.123E2, 0.17976931348623157E309) = 0.123E2 * (0.123E2, 0.8988465674311579E308) = inf + (0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E2, 0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (0.123E2, 0.8988465674311579E308) = 0.12300000000000002E2 rem (0.123E2, 0.8988465674311579E308) = 0.123E2 * (0.123E2, 0.123E4) = 0.15129E5 + (0.123E2, 0.123E4) = 0.12423E4 - (0.123E2, 0.123E4) = ~0.12177E4 / (0.123E2, 0.123E4) = 0.1E~1 nextAfter (0.123E2, 0.123E4) = 0.12300000000000002E2 rem (0.123E2, 0.123E4) = 0.123E2 * (0.123E2, 0.123E2) = 0.15129000000000002E3 + (0.123E2, 0.123E2) = 0.246E2 - (0.123E2, 0.123E2) = 0.0 / (0.123E2, 0.123E2) = 0.1E1 nextAfter (0.123E2, 0.123E2) = 0.123E2 rem (0.123E2, 0.123E2) = 0.0 * (0.123E2, 0.3141592653589793E1) = 0.3864158963915446E2 + (0.123E2, 0.3141592653589793E1) = 0.15441592653589794E2 - (0.123E2, 0.3141592653589793E1) = 0.9158407346410208E1 / (0.123E2, 0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (0.123E2, 0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, 0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, 0.2718281828459045E1) = 0.33434866490046254E2 + (0.123E2, 0.2718281828459045E1) = 0.15018281828459045E2 - (0.123E2, 0.2718281828459045E1) = 0.9581718171540956E1 / (0.123E2, 0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (0.123E2, 0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, 0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, 0.123E1) = 0.15129000000000001E2 + (0.123E2, 0.123E1) = 0.13530000000000001E2 - (0.123E2, 0.123E1) = 0.1107E2 / (0.123E2, 0.123E1) = 0.1E2 nextAfter (0.123E2, 0.123E1) = 0.12299999999999999E2 rem (0.123E2, 0.123E1) = 0.8881784197001252E~15 * (0.123E2, 0.123) = 0.15129000000000001E1 + (0.123E2, 0.123) = 0.12423E2 - (0.123E2, 0.123) = 0.12177000000000001E2 / (0.123E2, 0.123) = 0.10000000000000001E3 nextAfter (0.123E2, 0.123) = 0.12299999999999999E2 rem (0.123E2, 0.123) = 0.8881784197001252E~15 * (0.123E2, 0.123E~2) = 0.15129E~1 + (0.123E2, 0.123E~2) = 0.1230123E2 - (0.123E2, 0.123E~2) = 0.12298770000000001E2 / (0.123E2, 0.123E~2) = 0.1E5 nextAfter (0.123E2, 0.123E~2) = 0.12299999999999999E2 rem (0.123E2, 0.123E~2) = 0.9749145934989656E~15 * (0.123E2, 0.22250738585072014E~307) = 0.2736840845963858E~306 + (0.123E2, 0.22250738585072014E~307) = 0.123E2 - (0.123E2, 0.22250738585072014E~307) = 0.123E2 / (0.123E2, 0.22250738585072014E~307) = inf nextAfter (0.123E2, 0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, 0.22250738585072014E~307) = ~inf * (0.123E2, 0.11125369292536007E~307) = 0.1368420422981929E~306 + (0.123E2, 0.11125369292536007E~307) = 0.123E2 - (0.123E2, 0.11125369292536007E~307) = 0.123E2 / (0.123E2, 0.11125369292536007E~307) = inf nextAfter (0.123E2, 0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, 0.11125369292536007E~307) = ~inf * (0.123E2, 0.5E~323) = 0.6E~322 + (0.123E2, 0.5E~323) = 0.123E2 - (0.123E2, 0.5E~323) = 0.123E2 / (0.123E2, 0.5E~323) = inf nextAfter (0.123E2, 0.5E~323) = 0.12299999999999999E2 rem (0.123E2, 0.5E~323) = ~inf * (0.123E2, 0.0) = 0.0 + (0.123E2, 0.0) = 0.123E2 - (0.123E2, 0.0) = 0.123E2 / (0.123E2, 0.0) = inf nextAfter (0.123E2, 0.0) = 0.12299999999999999E2 rem (0.123E2, 0.0) = nan * (0.123E2, ~0.17976931348623157E309) = ~inf + (0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E2, ~0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (0.123E2, ~0.17976931348623157E309) = 0.12299999999999999E2 rem (0.123E2, ~0.17976931348623157E309) = 0.123E2 * (0.123E2, ~0.8988465674311579E308) = ~inf + (0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E2, ~0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (0.123E2, ~0.8988465674311579E308) = 0.12299999999999999E2 rem (0.123E2, ~0.8988465674311579E308) = 0.123E2 * (0.123E2, ~0.123E4) = ~0.15129E5 + (0.123E2, ~0.123E4) = ~0.12177E4 - (0.123E2, ~0.123E4) = 0.12423E4 / (0.123E2, ~0.123E4) = ~0.1E~1 nextAfter (0.123E2, ~0.123E4) = 0.12299999999999999E2 rem (0.123E2, ~0.123E4) = 0.123E2 * (0.123E2, ~0.123E2) = ~0.15129000000000002E3 + (0.123E2, ~0.123E2) = 0.0 - (0.123E2, ~0.123E2) = 0.246E2 / (0.123E2, ~0.123E2) = ~0.1E1 nextAfter (0.123E2, ~0.123E2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E2) = 0.0 * (0.123E2, ~0.3141592653589793E1) = ~0.3864158963915446E2 + (0.123E2, ~0.3141592653589793E1) = 0.9158407346410208E1 - (0.123E2, ~0.3141592653589793E1) = 0.15441592653589794E2 / (0.123E2, ~0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (0.123E2, ~0.3141592653589793E1) = 0.12299999999999999E2 rem (0.123E2, ~0.3141592653589793E1) = 0.28752220392306214E1 * (0.123E2, ~0.2718281828459045E1) = ~0.33434866490046254E2 + (0.123E2, ~0.2718281828459045E1) = 0.9581718171540956E1 - (0.123E2, ~0.2718281828459045E1) = 0.15018281828459045E2 / (0.123E2, ~0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (0.123E2, ~0.2718281828459045E1) = 0.12299999999999999E2 rem (0.123E2, ~0.2718281828459045E1) = 0.14268726861638203E1 * (0.123E2, ~0.123E1) = ~0.15129000000000001E2 + (0.123E2, ~0.123E1) = 0.1107E2 - (0.123E2, ~0.123E1) = 0.13530000000000001E2 / (0.123E2, ~0.123E1) = ~0.1E2 nextAfter (0.123E2, ~0.123E1) = 0.12299999999999999E2 rem (0.123E2, ~0.123E1) = 0.8881784197001252E~15 * (0.123E2, ~0.123) = ~0.15129000000000001E1 + (0.123E2, ~0.123) = 0.12177000000000001E2 - (0.123E2, ~0.123) = 0.12423E2 / (0.123E2, ~0.123) = ~0.10000000000000001E3 nextAfter (0.123E2, ~0.123) = 0.12299999999999999E2 rem (0.123E2, ~0.123) = 0.8881784197001252E~15 * (0.123E2, ~0.123E~2) = ~0.15129E~1 + (0.123E2, ~0.123E~2) = 0.12298770000000001E2 - (0.123E2, ~0.123E~2) = 0.1230123E2 / (0.123E2, ~0.123E~2) = ~0.1E5 nextAfter (0.123E2, ~0.123E~2) = 0.12299999999999999E2 rem (0.123E2, ~0.123E~2) = 0.9749145934989656E~15 * (0.123E2, ~0.22250738585072014E~307) = ~0.2736840845963858E~306 + (0.123E2, ~0.22250738585072014E~307) = 0.123E2 - (0.123E2, ~0.22250738585072014E~307) = 0.123E2 / (0.123E2, ~0.22250738585072014E~307) = ~inf nextAfter (0.123E2, ~0.22250738585072014E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.22250738585072014E~307) = ~inf * (0.123E2, ~0.11125369292536007E~307) = ~0.1368420422981929E~306 + (0.123E2, ~0.11125369292536007E~307) = 0.123E2 - (0.123E2, ~0.11125369292536007E~307) = 0.123E2 / (0.123E2, ~0.11125369292536007E~307) = ~inf nextAfter (0.123E2, ~0.11125369292536007E~307) = 0.12299999999999999E2 rem (0.123E2, ~0.11125369292536007E~307) = ~inf * (0.123E2, ~0.5E~323) = ~0.6E~322 + (0.123E2, ~0.5E~323) = 0.123E2 - (0.123E2, ~0.5E~323) = 0.123E2 / (0.123E2, ~0.5E~323) = ~inf nextAfter (0.123E2, ~0.5E~323) = 0.12299999999999999E2 rem (0.123E2, ~0.5E~323) = ~inf * (0.123E2, ~0.0) = ~0.0 + (0.123E2, ~0.0) = 0.123E2 - (0.123E2, ~0.0) = 0.123E2 / (0.123E2, ~0.0) = ~inf nextAfter (0.123E2, ~0.0) = 0.12299999999999999E2 rem (0.123E2, ~0.0) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.123E2, ~inf) = ~inf + (0.123E2, ~inf) = ~inf - (0.123E2, ~inf) = inf / (0.123E2, ~inf) = ~0.0 nextAfter (0.123E2, ~inf) = 0.12299999999999999E2 rem (0.123E2, ~inf) = 0.123E2 * (0.123E2, nan) = nan + (0.123E2, nan) = nan - (0.123E2, nan) = nan / (0.123E2, nan) = nan nextAfter (0.123E2, nan) = nan rem (0.123E2, nan) = nan * (0.123E2, inf) = inf + (0.123E2, inf) = inf - (0.123E2, inf) = ~inf / (0.123E2, inf) = 0.0 nextAfter (0.123E2, inf) = 0.12300000000000002E2 rem (0.123E2, inf) = 0.123E2 * (0.3141592653589793E1, 0.17976931348623157E309) = inf + (0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.3141592653589793E1, 0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (0.3141592653589793E1, 0.17976931348623157E309) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.8988465674311579E308) = inf + (0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.3141592653589793E1, 0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (0.3141592653589793E1, 0.8988465674311579E308) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E4) = 0.38641589639154454E4 + (0.3141592653589793E1, 0.123E4) = 0.123314159265359E4 - (0.3141592653589793E1, 0.123E4) = ~0.122685840734641E4 / (0.3141592653589793E1, 0.123E4) = 0.25541403687721893E~2 nextAfter (0.3141592653589793E1, 0.123E4) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.123E2) = 0.3864158963915446E2 + (0.3141592653589793E1, 0.123E2) = 0.15441592653589794E2 - (0.3141592653589793E1, 0.123E2) = ~0.9158407346410208E1 / (0.3141592653589793E1, 0.123E2) = 0.2554140368772189 nextAfter (0.3141592653589793E1, 0.123E2) = 0.31415926535897936E1 rem (0.3141592653589793E1, 0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, 0.3141592653589793E1) = 0.9869604401089358E1 + (0.3141592653589793E1, 0.3141592653589793E1) = 0.6283185307179586E1 - (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 / (0.3141592653589793E1, 0.3141592653589793E1) = 0.1E1 nextAfter (0.3141592653589793E1, 0.3141592653589793E1) = 0.3141592653589793E1 rem (0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, 0.2718281828459045E1) = 0.8539734222673566E1 + (0.3141592653589793E1, 0.2718281828459045E1) = 0.5859874482048838E1 - (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 / (0.3141592653589793E1, 0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (0.3141592653589793E1, 0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, 0.123E1) = 0.38641589639154454E1 + (0.3141592653589793E1, 0.123E1) = 0.43715926535897935E1 - (0.3141592653589793E1, 0.123E1) = 0.19115926535897931E1 / (0.3141592653589793E1, 0.123E1) = 0.25541403687721895E1 nextAfter (0.3141592653589793E1, 0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, 0.123) = 0.38641589639154456 + (0.3141592653589793E1, 0.123) = 0.32645926535897933E1 - (0.3141592653589793E1, 0.123) = 0.3018592653589793E1 / (0.3141592653589793E1, 0.123) = 0.25541403687721896E2 nextAfter (0.3141592653589793E1, 0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123) = 0.6659265358979316E~1 * (0.3141592653589793E1, 0.123E~2) = 0.38641589639154456E~2 + (0.3141592653589793E1, 0.123E~2) = 0.3142822653589793E1 - (0.3141592653589793E1, 0.123E~2) = 0.3140362653589793E1 / (0.3141592653589793E1, 0.123E~2) = 0.25541403687721895E4 nextAfter (0.3141592653589793E1, 0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.123E~2) = 0.17265358979318352E~3 * (0.3141592653589793E1, 0.22250738585072014E~307) = 0.6990275687580919E~307 + (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (0.3141592653589793E1, 0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, 0.11125369292536007E~307) = 0.34951378437904593E~307 + (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.11125369292536007E~307) = inf nextAfter (0.3141592653589793E1, 0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, 0.5E~323) = 0.15E~322 + (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.5E~323) = inf nextAfter (0.3141592653589793E1, 0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.5E~323) = ~inf * (0.3141592653589793E1, 0.0) = 0.0 + (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, 0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, 0.0) = inf nextAfter (0.3141592653589793E1, 0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, 0.0) = nan * (0.3141592653589793E1, ~0.17976931348623157E309) = ~inf + (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (0.3141592653589793E1, ~0.17976931348623157E309) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.17976931348623157E309) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.8988465674311579E308) = ~inf + (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.3141592653589793E1, ~0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (0.3141592653589793E1, ~0.8988465674311579E308) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.8988465674311579E308) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E4) = ~0.38641589639154454E4 + (0.3141592653589793E1, ~0.123E4) = ~0.122685840734641E4 - (0.3141592653589793E1, ~0.123E4) = 0.123314159265359E4 / (0.3141592653589793E1, ~0.123E4) = ~0.25541403687721893E~2 nextAfter (0.3141592653589793E1, ~0.123E4) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E4) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.123E2) = ~0.3864158963915446E2 + (0.3141592653589793E1, ~0.123E2) = ~0.9158407346410208E1 - (0.3141592653589793E1, ~0.123E2) = 0.15441592653589794E2 / (0.3141592653589793E1, ~0.123E2) = ~0.2554140368772189 nextAfter (0.3141592653589793E1, ~0.123E2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E2) = 0.3141592653589793E1 * (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.9869604401089358E1 + (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 - (0.3141592653589793E1, ~0.3141592653589793E1) = 0.6283185307179586E1 / (0.3141592653589793E1, ~0.3141592653589793E1) = ~0.1E1 nextAfter (0.3141592653589793E1, ~0.3141592653589793E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.8539734222673566E1 + (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 - (0.3141592653589793E1, ~0.2718281828459045E1) = 0.5859874482048838E1 / (0.3141592653589793E1, ~0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (0.3141592653589793E1, ~0.2718281828459045E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.2718281828459045E1) = 0.423310825130748 * (0.3141592653589793E1, ~0.123E1) = ~0.38641589639154454E1 + (0.3141592653589793E1, ~0.123E1) = 0.19115926535897931E1 - (0.3141592653589793E1, ~0.123E1) = 0.43715926535897935E1 / (0.3141592653589793E1, ~0.123E1) = ~0.25541403687721895E1 nextAfter (0.3141592653589793E1, ~0.123E1) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E1) = 0.6815926535897932 * (0.3141592653589793E1, ~0.123) = ~0.38641589639154456 + (0.3141592653589793E1, ~0.123) = 0.3018592653589793E1 - (0.3141592653589793E1, ~0.123) = 0.32645926535897933E1 / (0.3141592653589793E1, ~0.123) = ~0.25541403687721896E2 nextAfter (0.3141592653589793E1, ~0.123) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123) = 0.6659265358979316E~1 * (0.3141592653589793E1, ~0.123E~2) = ~0.38641589639154456E~2 + (0.3141592653589793E1, ~0.123E~2) = 0.3140362653589793E1 - (0.3141592653589793E1, ~0.123E~2) = 0.3142822653589793E1 / (0.3141592653589793E1, ~0.123E~2) = ~0.25541403687721895E4 nextAfter (0.3141592653589793E1, ~0.123E~2) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.123E~2) = 0.17265358979318352E~3 * (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.6990275687580919E~307 + (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.34951378437904593E~307 + (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.3141592653589793E1, ~0.11125369292536007E~307) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.11125369292536007E~307) = ~inf * (0.3141592653589793E1, ~0.5E~323) = ~0.15E~322 + (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.5E~323) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.5E~323) = ~inf nextAfter (0.3141592653589793E1, ~0.5E~323) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.5E~323) = ~inf * (0.3141592653589793E1, ~0.0) = ~0.0 + (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 - (0.3141592653589793E1, ~0.0) = 0.3141592653589793E1 / (0.3141592653589793E1, ~0.0) = ~inf nextAfter (0.3141592653589793E1, ~0.0) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~0.0) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.3141592653589793E1, ~inf) = ~inf + (0.3141592653589793E1, ~inf) = ~inf - (0.3141592653589793E1, ~inf) = inf / (0.3141592653589793E1, ~inf) = ~0.0 nextAfter (0.3141592653589793E1, ~inf) = 0.31415926535897927E1 rem (0.3141592653589793E1, ~inf) = 0.3141592653589793E1 * (0.3141592653589793E1, nan) = nan + (0.3141592653589793E1, nan) = nan - (0.3141592653589793E1, nan) = nan / (0.3141592653589793E1, nan) = nan nextAfter (0.3141592653589793E1, nan) = nan rem (0.3141592653589793E1, nan) = nan * (0.3141592653589793E1, inf) = inf + (0.3141592653589793E1, inf) = inf - (0.3141592653589793E1, inf) = ~inf / (0.3141592653589793E1, inf) = 0.0 nextAfter (0.3141592653589793E1, inf) = 0.31415926535897936E1 rem (0.3141592653589793E1, inf) = 0.3141592653589793E1 * (0.2718281828459045E1, 0.17976931348623157E309) = inf + (0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.2718281828459045E1, 0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (0.2718281828459045E1, 0.17976931348623157E309) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.8988465674311579E308) = inf + (0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.2718281828459045E1, 0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (0.2718281828459045E1, 0.8988465674311579E308) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E4) = 0.33434866490046256E4 + (0.2718281828459045E1, 0.123E4) = 0.1232718281828459E4 - (0.2718281828459045E1, 0.123E4) = ~0.1227281718171541E4 / (0.2718281828459045E1, 0.123E4) = 0.22099852263894678E~2 nextAfter (0.2718281828459045E1, 0.123E4) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.123E2) = 0.33434866490046254E2 + (0.2718281828459045E1, 0.123E2) = 0.15018281828459045E2 - (0.2718281828459045E1, 0.123E2) = ~0.9581718171540956E1 / (0.2718281828459045E1, 0.123E2) = 0.22099852263894673 nextAfter (0.2718281828459045E1, 0.123E2) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.3141592653589793E1) = 0.8539734222673566E1 + (0.2718281828459045E1, 0.3141592653589793E1) = 0.5859874482048838E1 - (0.2718281828459045E1, 0.3141592653589793E1) = ~0.423310825130748 / (0.2718281828459045E1, 0.3141592653589793E1) = 0.8652559794322651 nextAfter (0.2718281828459045E1, 0.3141592653589793E1) = 0.27182818284590455E1 rem (0.2718281828459045E1, 0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, 0.2718281828459045E1) = 0.73890560989306495E1 + (0.2718281828459045E1, 0.2718281828459045E1) = 0.543656365691809E1 - (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 / (0.2718281828459045E1, 0.2718281828459045E1) = 0.1E1 nextAfter (0.2718281828459045E1, 0.2718281828459045E1) = 0.2718281828459045E1 rem (0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, 0.123E1) = 0.33434866490046256E1 + (0.2718281828459045E1, 0.123E1) = 0.3948281828459045E1 - (0.2718281828459045E1, 0.123E1) = 0.1488281828459045E1 / (0.2718281828459045E1, 0.123E1) = 0.22099852263894677E1 nextAfter (0.2718281828459045E1, 0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, 0.123) = 0.33434866490046256 + (0.2718281828459045E1, 0.123) = 0.2841281828459045E1 - (0.2718281828459045E1, 0.123) = 0.25952818284590453E1 / (0.2718281828459045E1, 0.123) = 0.22099852263894675E2 nextAfter (0.2718281828459045E1, 0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, 0.123E~2) = 0.33434866490046253E~2 + (0.2718281828459045E1, 0.123E~2) = 0.2719511828459045E1 - (0.2718281828459045E1, 0.123E~2) = 0.2717051828459045E1 / (0.2718281828459045E1, 0.123E~2) = 0.22099852263894677E4 nextAfter (0.2718281828459045E1, 0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.123E~2) = 0.12118284590451492E~2 * (0.2718281828459045E1, 0.22250738585072014E~307) = 0.6048377836559378E~307 + (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (0.2718281828459045E1, 0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, 0.11125369292536007E~307) = 0.3024188918279689E~307 + (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.11125369292536007E~307) = inf nextAfter (0.2718281828459045E1, 0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, 0.5E~323) = 0.15E~322 + (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.5E~323) = inf nextAfter (0.2718281828459045E1, 0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.5E~323) = ~inf * (0.2718281828459045E1, 0.0) = 0.0 + (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, 0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, 0.0) = inf nextAfter (0.2718281828459045E1, 0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, 0.0) = nan * (0.2718281828459045E1, ~0.17976931348623157E309) = ~inf + (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.2718281828459045E1, ~0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (0.2718281828459045E1, ~0.17976931348623157E309) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.17976931348623157E309) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.8988465674311579E308) = ~inf + (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.2718281828459045E1, ~0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (0.2718281828459045E1, ~0.8988465674311579E308) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.8988465674311579E308) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E4) = ~0.33434866490046256E4 + (0.2718281828459045E1, ~0.123E4) = ~0.1227281718171541E4 - (0.2718281828459045E1, ~0.123E4) = 0.1232718281828459E4 / (0.2718281828459045E1, ~0.123E4) = ~0.22099852263894678E~2 nextAfter (0.2718281828459045E1, ~0.123E4) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E4) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.123E2) = ~0.33434866490046254E2 + (0.2718281828459045E1, ~0.123E2) = ~0.9581718171540956E1 - (0.2718281828459045E1, ~0.123E2) = 0.15018281828459045E2 / (0.2718281828459045E1, ~0.123E2) = ~0.22099852263894673 nextAfter (0.2718281828459045E1, ~0.123E2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E2) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8539734222673566E1 + (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.423310825130748 - (0.2718281828459045E1, ~0.3141592653589793E1) = 0.5859874482048838E1 / (0.2718281828459045E1, ~0.3141592653589793E1) = ~0.8652559794322651 nextAfter (0.2718281828459045E1, ~0.3141592653589793E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.3141592653589793E1) = 0.2718281828459045E1 * (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.73890560989306495E1 + (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 - (0.2718281828459045E1, ~0.2718281828459045E1) = 0.543656365691809E1 / (0.2718281828459045E1, ~0.2718281828459045E1) = ~0.1E1 nextAfter (0.2718281828459045E1, ~0.2718281828459045E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (0.2718281828459045E1, ~0.123E1) = ~0.33434866490046256E1 + (0.2718281828459045E1, ~0.123E1) = 0.1488281828459045E1 - (0.2718281828459045E1, ~0.123E1) = 0.3948281828459045E1 / (0.2718281828459045E1, ~0.123E1) = ~0.22099852263894677E1 nextAfter (0.2718281828459045E1, ~0.123E1) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E1) = 0.2582818284590451 * (0.2718281828459045E1, ~0.123) = ~0.33434866490046256 + (0.2718281828459045E1, ~0.123) = 0.25952818284590453E1 - (0.2718281828459045E1, ~0.123) = 0.2841281828459045E1 / (0.2718281828459045E1, ~0.123) = ~0.22099852263894675E2 nextAfter (0.2718281828459045E1, ~0.123) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123) = 0.1228182845904513E~1 * (0.2718281828459045E1, ~0.123E~2) = ~0.33434866490046253E~2 + (0.2718281828459045E1, ~0.123E~2) = 0.2717051828459045E1 - (0.2718281828459045E1, ~0.123E~2) = 0.2719511828459045E1 / (0.2718281828459045E1, ~0.123E~2) = ~0.22099852263894677E4 nextAfter (0.2718281828459045E1, ~0.123E~2) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.123E~2) = 0.12118284590451492E~2 * (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.6048377836559378E~307 + (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.3024188918279689E~307 + (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf nextAfter (0.2718281828459045E1, ~0.11125369292536007E~307) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.11125369292536007E~307) = ~inf * (0.2718281828459045E1, ~0.5E~323) = ~0.15E~322 + (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.5E~323) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.5E~323) = ~inf nextAfter (0.2718281828459045E1, ~0.5E~323) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.5E~323) = ~inf * (0.2718281828459045E1, ~0.0) = ~0.0 + (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 - (0.2718281828459045E1, ~0.0) = 0.2718281828459045E1 / (0.2718281828459045E1, ~0.0) = ~inf nextAfter (0.2718281828459045E1, ~0.0) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~0.0) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.2718281828459045E1, ~inf) = ~inf + (0.2718281828459045E1, ~inf) = ~inf - (0.2718281828459045E1, ~inf) = inf / (0.2718281828459045E1, ~inf) = ~0.0 nextAfter (0.2718281828459045E1, ~inf) = 0.27182818284590446E1 rem (0.2718281828459045E1, ~inf) = 0.2718281828459045E1 * (0.2718281828459045E1, nan) = nan + (0.2718281828459045E1, nan) = nan - (0.2718281828459045E1, nan) = nan / (0.2718281828459045E1, nan) = nan nextAfter (0.2718281828459045E1, nan) = nan rem (0.2718281828459045E1, nan) = nan * (0.2718281828459045E1, inf) = inf + (0.2718281828459045E1, inf) = inf - (0.2718281828459045E1, inf) = ~inf / (0.2718281828459045E1, inf) = 0.0 nextAfter (0.2718281828459045E1, inf) = 0.27182818284590455E1 rem (0.2718281828459045E1, inf) = 0.2718281828459045E1 * (0.123E1, 0.17976931348623157E309) = inf + (0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E1, 0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (0.123E1, 0.17976931348623157E309) = 0.12300000000000002E1 rem (0.123E1, 0.17976931348623157E309) = 0.123E1 * (0.123E1, 0.8988465674311579E308) = 0.1105581277940324E309 + (0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E1, 0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (0.123E1, 0.8988465674311579E308) = 0.12300000000000002E1 rem (0.123E1, 0.8988465674311579E308) = 0.123E1 * (0.123E1, 0.123E4) = 0.15129E4 + (0.123E1, 0.123E4) = 0.123123E4 - (0.123E1, 0.123E4) = ~0.122877E4 / (0.123E1, 0.123E4) = 0.1E~2 nextAfter (0.123E1, 0.123E4) = 0.12300000000000002E1 rem (0.123E1, 0.123E4) = 0.123E1 * (0.123E1, 0.123E2) = 0.15129000000000001E2 + (0.123E1, 0.123E2) = 0.13530000000000001E2 - (0.123E1, 0.123E2) = ~0.1107E2 / (0.123E1, 0.123E2) = 0.9999999999999999E~1 nextAfter (0.123E1, 0.123E2) = 0.12300000000000002E1 rem (0.123E1, 0.123E2) = 0.123E1 * (0.123E1, 0.3141592653589793E1) = 0.38641589639154454E1 + (0.123E1, 0.3141592653589793E1) = 0.43715926535897935E1 - (0.123E1, 0.3141592653589793E1) = ~0.19115926535897931E1 / (0.123E1, 0.3141592653589793E1) = 0.3915211600060625 nextAfter (0.123E1, 0.3141592653589793E1) = 0.12300000000000002E1 rem (0.123E1, 0.3141592653589793E1) = 0.123E1 * (0.123E1, 0.2718281828459045E1) = 0.33434866490046256E1 + (0.123E1, 0.2718281828459045E1) = 0.3948281828459045E1 - (0.123E1, 0.2718281828459045E1) = ~0.1488281828459045E1 / (0.123E1, 0.2718281828459045E1) = 0.45249171264087407 nextAfter (0.123E1, 0.2718281828459045E1) = 0.12300000000000002E1 rem (0.123E1, 0.2718281828459045E1) = 0.123E1 * (0.123E1, 0.123E1) = 0.15129E1 + (0.123E1, 0.123E1) = 0.246E1 - (0.123E1, 0.123E1) = 0.0 / (0.123E1, 0.123E1) = 0.1E1 nextAfter (0.123E1, 0.123E1) = 0.123E1 rem (0.123E1, 0.123E1) = 0.0 * (0.123E1, 0.123) = 0.15129 + (0.123E1, 0.123) = 0.1353E1 - (0.123E1, 0.123) = 0.1107E1 / (0.123E1, 0.123) = 0.1E2 nextAfter (0.123E1, 0.123) = 0.12299999999999998E1 rem (0.123E1, 0.123) = 0.0 * (0.123E1, 0.123E~2) = 0.15129E~2 + (0.123E1, 0.123E~2) = 0.123123E1 - (0.123E1, 0.123E~2) = 0.122877E1 / (0.123E1, 0.123E~2) = 0.1E4 nextAfter (0.123E1, 0.123E~2) = 0.12299999999999998E1 rem (0.123E1, 0.123E~2) = 0.8673617379884035E~17 * (0.123E1, 0.22250738585072014E~307) = 0.27368408459638577E~307 + (0.123E1, 0.22250738585072014E~307) = 0.123E1 - (0.123E1, 0.22250738585072014E~307) = 0.123E1 / (0.123E1, 0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (0.123E1, 0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, 0.22250738585072014E~307) = 0.0 * (0.123E1, 0.11125369292536007E~307) = 0.1368420422981929E~307 + (0.123E1, 0.11125369292536007E~307) = 0.123E1 - (0.123E1, 0.11125369292536007E~307) = 0.123E1 / (0.123E1, 0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (0.123E1, 0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, 0.11125369292536007E~307) = 0.0 * (0.123E1, 0.5E~323) = 0.5E~323 + (0.123E1, 0.5E~323) = 0.123E1 - (0.123E1, 0.5E~323) = 0.123E1 / (0.123E1, 0.5E~323) = inf nextAfter (0.123E1, 0.5E~323) = 0.12299999999999998E1 rem (0.123E1, 0.5E~323) = ~inf * (0.123E1, 0.0) = 0.0 + (0.123E1, 0.0) = 0.123E1 - (0.123E1, 0.0) = 0.123E1 / (0.123E1, 0.0) = inf nextAfter (0.123E1, 0.0) = 0.12299999999999998E1 rem (0.123E1, 0.0) = nan * (0.123E1, ~0.17976931348623157E309) = ~inf + (0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E1, ~0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (0.123E1, ~0.17976931348623157E309) = 0.12299999999999998E1 rem (0.123E1, ~0.17976931348623157E309) = 0.123E1 * (0.123E1, ~0.8988465674311579E308) = ~0.1105581277940324E309 + (0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E1, ~0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (0.123E1, ~0.8988465674311579E308) = 0.12299999999999998E1 rem (0.123E1, ~0.8988465674311579E308) = 0.123E1 * (0.123E1, ~0.123E4) = ~0.15129E4 + (0.123E1, ~0.123E4) = ~0.122877E4 - (0.123E1, ~0.123E4) = 0.123123E4 / (0.123E1, ~0.123E4) = ~0.1E~2 nextAfter (0.123E1, ~0.123E4) = 0.12299999999999998E1 rem (0.123E1, ~0.123E4) = 0.123E1 * (0.123E1, ~0.123E2) = ~0.15129000000000001E2 + (0.123E1, ~0.123E2) = ~0.1107E2 - (0.123E1, ~0.123E2) = 0.13530000000000001E2 / (0.123E1, ~0.123E2) = ~0.9999999999999999E~1 nextAfter (0.123E1, ~0.123E2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E2) = 0.123E1 * (0.123E1, ~0.3141592653589793E1) = ~0.38641589639154454E1 + (0.123E1, ~0.3141592653589793E1) = ~0.19115926535897931E1 - (0.123E1, ~0.3141592653589793E1) = 0.43715926535897935E1 / (0.123E1, ~0.3141592653589793E1) = ~0.3915211600060625 nextAfter (0.123E1, ~0.3141592653589793E1) = 0.12299999999999998E1 rem (0.123E1, ~0.3141592653589793E1) = 0.123E1 * (0.123E1, ~0.2718281828459045E1) = ~0.33434866490046256E1 + (0.123E1, ~0.2718281828459045E1) = ~0.1488281828459045E1 - (0.123E1, ~0.2718281828459045E1) = 0.3948281828459045E1 / (0.123E1, ~0.2718281828459045E1) = ~0.45249171264087407 nextAfter (0.123E1, ~0.2718281828459045E1) = 0.12299999999999998E1 rem (0.123E1, ~0.2718281828459045E1) = 0.123E1 * (0.123E1, ~0.123E1) = ~0.15129E1 + (0.123E1, ~0.123E1) = 0.0 - (0.123E1, ~0.123E1) = 0.246E1 / (0.123E1, ~0.123E1) = ~0.1E1 nextAfter (0.123E1, ~0.123E1) = 0.12299999999999998E1 rem (0.123E1, ~0.123E1) = 0.0 * (0.123E1, ~0.123) = ~0.15129 + (0.123E1, ~0.123) = 0.1107E1 - (0.123E1, ~0.123) = 0.1353E1 / (0.123E1, ~0.123) = ~0.1E2 nextAfter (0.123E1, ~0.123) = 0.12299999999999998E1 rem (0.123E1, ~0.123) = 0.0 * (0.123E1, ~0.123E~2) = ~0.15129E~2 + (0.123E1, ~0.123E~2) = 0.122877E1 - (0.123E1, ~0.123E~2) = 0.123123E1 / (0.123E1, ~0.123E~2) = ~0.1E4 nextAfter (0.123E1, ~0.123E~2) = 0.12299999999999998E1 rem (0.123E1, ~0.123E~2) = 0.8673617379884035E~17 * (0.123E1, ~0.22250738585072014E~307) = ~0.27368408459638577E~307 + (0.123E1, ~0.22250738585072014E~307) = 0.123E1 - (0.123E1, ~0.22250738585072014E~307) = 0.123E1 / (0.123E1, ~0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (0.123E1, ~0.22250738585072014E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.22250738585072014E~307) = 0.0 * (0.123E1, ~0.11125369292536007E~307) = ~0.1368420422981929E~307 + (0.123E1, ~0.11125369292536007E~307) = 0.123E1 - (0.123E1, ~0.11125369292536007E~307) = 0.123E1 / (0.123E1, ~0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (0.123E1, ~0.11125369292536007E~307) = 0.12299999999999998E1 rem (0.123E1, ~0.11125369292536007E~307) = 0.0 * (0.123E1, ~0.5E~323) = ~0.5E~323 + (0.123E1, ~0.5E~323) = 0.123E1 - (0.123E1, ~0.5E~323) = 0.123E1 / (0.123E1, ~0.5E~323) = ~inf nextAfter (0.123E1, ~0.5E~323) = 0.12299999999999998E1 rem (0.123E1, ~0.5E~323) = ~inf * (0.123E1, ~0.0) = ~0.0 + (0.123E1, ~0.0) = 0.123E1 - (0.123E1, ~0.0) = 0.123E1 / (0.123E1, ~0.0) = ~inf nextAfter (0.123E1, ~0.0) = 0.12299999999999998E1 rem (0.123E1, ~0.0) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123E1, ~inf) = ~inf + (0.123E1, ~inf) = ~inf - (0.123E1, ~inf) = inf / (0.123E1, ~inf) = ~0.0 nextAfter (0.123E1, ~inf) = 0.12299999999999998E1 rem (0.123E1, ~inf) = 0.123E1 * (0.123E1, nan) = nan + (0.123E1, nan) = nan - (0.123E1, nan) = nan / (0.123E1, nan) = nan nextAfter (0.123E1, nan) = nan rem (0.123E1, nan) = nan * (0.123E1, inf) = inf + (0.123E1, inf) = inf - (0.123E1, inf) = ~inf / (0.123E1, inf) = 0.0 nextAfter (0.123E1, inf) = 0.12300000000000002E1 rem (0.123E1, inf) = 0.123E1 * (0.123, 0.17976931348623157E309) = 0.22111625558806483E308 + (0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123, 0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (0.123, 0.17976931348623157E309) = 0.12300000000000001 rem (0.123, 0.17976931348623157E309) = 0.123 * (0.123, 0.8988465674311579E308) = 0.11055812779403241E308 + (0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123, 0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (0.123, 0.8988465674311579E308) = 0.12300000000000001 rem (0.123, 0.8988465674311579E308) = 0.123 * (0.123, 0.123E4) = 0.15129E3 + (0.123, 0.123E4) = 0.1230123E4 - (0.123, 0.123E4) = ~0.1229877E4 / (0.123, 0.123E4) = 0.1E~3 nextAfter (0.123, 0.123E4) = 0.12300000000000001 rem (0.123, 0.123E4) = 0.123 * (0.123, 0.123E2) = 0.15129000000000001E1 + (0.123, 0.123E2) = 0.12423E2 - (0.123, 0.123E2) = ~0.12177000000000001E2 / (0.123, 0.123E2) = 0.9999999999999998E~2 nextAfter (0.123, 0.123E2) = 0.12300000000000001 rem (0.123, 0.123E2) = 0.123 * (0.123, 0.3141592653589793E1) = 0.38641589639154456 + (0.123, 0.3141592653589793E1) = 0.32645926535897933E1 - (0.123, 0.3141592653589793E1) = ~0.3018592653589793E1 / (0.123, 0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (0.123, 0.3141592653589793E1) = 0.12300000000000001 rem (0.123, 0.3141592653589793E1) = 0.123 * (0.123, 0.2718281828459045E1) = 0.33434866490046256 + (0.123, 0.2718281828459045E1) = 0.2841281828459045E1 - (0.123, 0.2718281828459045E1) = ~0.25952818284590453E1 / (0.123, 0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (0.123, 0.2718281828459045E1) = 0.12300000000000001 rem (0.123, 0.2718281828459045E1) = 0.123 * (0.123, 0.123E1) = 0.15129 + (0.123, 0.123E1) = 0.1353E1 - (0.123, 0.123E1) = ~0.1107E1 / (0.123, 0.123E1) = 0.1 nextAfter (0.123, 0.123E1) = 0.12300000000000001 rem (0.123, 0.123E1) = 0.123 * (0.123, 0.123) = 0.15129E~1 + (0.123, 0.123) = 0.246 - (0.123, 0.123) = 0.0 / (0.123, 0.123) = 0.1E1 nextAfter (0.123, 0.123) = 0.123 rem (0.123, 0.123) = 0.0 * (0.123, 0.123E~2) = 0.15129E~3 + (0.123, 0.123E~2) = 0.12423 - (0.123, 0.123E~2) = 0.12177 / (0.123, 0.123E~2) = 0.1E3 nextAfter (0.123, 0.123E~2) = 0.12299999999999998 rem (0.123, 0.123E~2) = 0.8673617379884035E~18 * (0.123, 0.22250738585072014E~307) = 0.273684084596386E~308 + (0.123, 0.22250738585072014E~307) = 0.123 - (0.123, 0.22250738585072014E~307) = 0.123 / (0.123, 0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (0.123, 0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, 0.22250738585072014E~307) = 0.0 * (0.123, 0.11125369292536007E~307) = 0.136842042298193E~308 + (0.123, 0.11125369292536007E~307) = 0.123 - (0.123, 0.11125369292536007E~307) = 0.123 / (0.123, 0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (0.123, 0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, 0.11125369292536007E~307) = 0.0 * (0.123, 0.5E~323) = 0.0 + (0.123, 0.5E~323) = 0.123 - (0.123, 0.5E~323) = 0.123 / (0.123, 0.5E~323) = inf nextAfter (0.123, 0.5E~323) = 0.12299999999999998 rem (0.123, 0.5E~323) = ~inf * (0.123, 0.0) = 0.0 + (0.123, 0.0) = 0.123 - (0.123, 0.0) = 0.123 / (0.123, 0.0) = inf nextAfter (0.123, 0.0) = 0.12299999999999998 rem (0.123, 0.0) = nan * (0.123, ~0.17976931348623157E309) = ~0.22111625558806483E308 + (0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123, ~0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (0.123, ~0.17976931348623157E309) = 0.12299999999999998 rem (0.123, ~0.17976931348623157E309) = 0.123 * (0.123, ~0.8988465674311579E308) = ~0.11055812779403241E308 + (0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123, ~0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (0.123, ~0.8988465674311579E308) = 0.12299999999999998 rem (0.123, ~0.8988465674311579E308) = 0.123 * (0.123, ~0.123E4) = ~0.15129E3 + (0.123, ~0.123E4) = ~0.1229877E4 - (0.123, ~0.123E4) = 0.1230123E4 / (0.123, ~0.123E4) = ~0.1E~3 nextAfter (0.123, ~0.123E4) = 0.12299999999999998 rem (0.123, ~0.123E4) = 0.123 * (0.123, ~0.123E2) = ~0.15129000000000001E1 + (0.123, ~0.123E2) = ~0.12177000000000001E2 - (0.123, ~0.123E2) = 0.12423E2 / (0.123, ~0.123E2) = ~0.9999999999999998E~2 nextAfter (0.123, ~0.123E2) = 0.12299999999999998 rem (0.123, ~0.123E2) = 0.123 * (0.123, ~0.3141592653589793E1) = ~0.38641589639154456 + (0.123, ~0.3141592653589793E1) = ~0.3018592653589793E1 - (0.123, ~0.3141592653589793E1) = 0.32645926535897933E1 / (0.123, ~0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (0.123, ~0.3141592653589793E1) = 0.12299999999999998 rem (0.123, ~0.3141592653589793E1) = 0.123 * (0.123, ~0.2718281828459045E1) = ~0.33434866490046256 + (0.123, ~0.2718281828459045E1) = ~0.25952818284590453E1 - (0.123, ~0.2718281828459045E1) = 0.2841281828459045E1 / (0.123, ~0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (0.123, ~0.2718281828459045E1) = 0.12299999999999998 rem (0.123, ~0.2718281828459045E1) = 0.123 * (0.123, ~0.123E1) = ~0.15129 + (0.123, ~0.123E1) = ~0.1107E1 - (0.123, ~0.123E1) = 0.1353E1 / (0.123, ~0.123E1) = ~0.1 nextAfter (0.123, ~0.123E1) = 0.12299999999999998 rem (0.123, ~0.123E1) = 0.123 * (0.123, ~0.123) = ~0.15129E~1 + (0.123, ~0.123) = 0.0 - (0.123, ~0.123) = 0.246 / (0.123, ~0.123) = ~0.1E1 nextAfter (0.123, ~0.123) = 0.12299999999999998 rem (0.123, ~0.123) = 0.0 * (0.123, ~0.123E~2) = ~0.15129E~3 + (0.123, ~0.123E~2) = 0.12177 - (0.123, ~0.123E~2) = 0.12423 / (0.123, ~0.123E~2) = ~0.1E3 nextAfter (0.123, ~0.123E~2) = 0.12299999999999998 rem (0.123, ~0.123E~2) = 0.8673617379884035E~18 * (0.123, ~0.22250738585072014E~307) = ~0.273684084596386E~308 + (0.123, ~0.22250738585072014E~307) = 0.123 - (0.123, ~0.22250738585072014E~307) = 0.123 / (0.123, ~0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (0.123, ~0.22250738585072014E~307) = 0.12299999999999998 rem (0.123, ~0.22250738585072014E~307) = 0.0 * (0.123, ~0.11125369292536007E~307) = ~0.136842042298193E~308 + (0.123, ~0.11125369292536007E~307) = 0.123 - (0.123, ~0.11125369292536007E~307) = 0.123 / (0.123, ~0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (0.123, ~0.11125369292536007E~307) = 0.12299999999999998 rem (0.123, ~0.11125369292536007E~307) = 0.0 * (0.123, ~0.5E~323) = ~0.0 + (0.123, ~0.5E~323) = 0.123 - (0.123, ~0.5E~323) = 0.123 / (0.123, ~0.5E~323) = ~inf nextAfter (0.123, ~0.5E~323) = 0.12299999999999998 rem (0.123, ~0.5E~323) = ~inf * (0.123, ~0.0) = ~0.0 + (0.123, ~0.0) = 0.123 - (0.123, ~0.0) = 0.123 / (0.123, ~0.0) = ~inf nextAfter (0.123, ~0.0) = 0.12299999999999998 rem (0.123, ~0.0) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123, ~inf) = ~inf + (0.123, ~inf) = ~inf - (0.123, ~inf) = inf / (0.123, ~inf) = ~0.0 nextAfter (0.123, ~inf) = 0.12299999999999998 rem (0.123, ~inf) = 0.123 * (0.123, nan) = nan + (0.123, nan) = nan - (0.123, nan) = nan / (0.123, nan) = nan nextAfter (0.123, nan) = nan rem (0.123, nan) = nan * (0.123, inf) = inf + (0.123, inf) = inf - (0.123, inf) = ~inf / (0.123, inf) = 0.0 nextAfter (0.123, inf) = 0.12300000000000001 rem (0.123, inf) = 0.123 * (0.123E~2, 0.17976931348623157E309) = 0.2211162555880648E306 + (0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.123E~2, 0.17976931348623157E309) = 0.684210211491E~311 nextAfter (0.123E~2, 0.17976931348623157E309) = 0.12300000000000002E~2 rem (0.123E~2, 0.17976931348623157E309) = 0.123E~2 * (0.123E~2, 0.8988465674311579E308) = 0.1105581277940324E306 + (0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.123E~2, 0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (0.123E~2, 0.8988465674311579E308) = 0.12300000000000002E~2 rem (0.123E~2, 0.8988465674311579E308) = 0.123E~2 * (0.123E~2, 0.123E4) = 0.15129E1 + (0.123E~2, 0.123E4) = 0.123000123E4 - (0.123E~2, 0.123E4) = ~0.122999877E4 / (0.123E~2, 0.123E4) = 0.1E~5 nextAfter (0.123E~2, 0.123E4) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E4) = 0.123E~2 * (0.123E~2, 0.123E2) = 0.15129E~1 + (0.123E~2, 0.123E2) = 0.1230123E2 - (0.123E~2, 0.123E2) = ~0.12298770000000001E2 / (0.123E~2, 0.123E2) = 0.9999999999999999E~4 nextAfter (0.123E~2, 0.123E2) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E2) = 0.123E~2 * (0.123E~2, 0.3141592653589793E1) = 0.38641589639154456E~2 + (0.123E~2, 0.3141592653589793E1) = 0.3142822653589793E1 - (0.123E~2, 0.3141592653589793E1) = ~0.3140362653589793E1 / (0.123E~2, 0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (0.123E~2, 0.3141592653589793E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.3141592653589793E1) = 0.123E~2 * (0.123E~2, 0.2718281828459045E1) = 0.33434866490046253E~2 + (0.123E~2, 0.2718281828459045E1) = 0.2719511828459045E1 - (0.123E~2, 0.2718281828459045E1) = ~0.2717051828459045E1 / (0.123E~2, 0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (0.123E~2, 0.2718281828459045E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.2718281828459045E1) = 0.123E~2 * (0.123E~2, 0.123E1) = 0.15129E~2 + (0.123E~2, 0.123E1) = 0.123123E1 - (0.123E~2, 0.123E1) = ~0.122877E1 / (0.123E~2, 0.123E1) = 0.1E~2 nextAfter (0.123E~2, 0.123E1) = 0.12300000000000002E~2 rem (0.123E~2, 0.123E1) = 0.123E~2 * (0.123E~2, 0.123) = 0.15129E~3 + (0.123E~2, 0.123) = 0.12423 - (0.123E~2, 0.123) = ~0.12177 / (0.123E~2, 0.123) = 0.1E~1 nextAfter (0.123E~2, 0.123) = 0.12300000000000002E~2 rem (0.123E~2, 0.123) = 0.123E~2 * (0.123E~2, 0.123E~2) = 0.15129E~5 + (0.123E~2, 0.123E~2) = 0.246E~2 - (0.123E~2, 0.123E~2) = 0.0 / (0.123E~2, 0.123E~2) = 0.1E1 nextAfter (0.123E~2, 0.123E~2) = 0.123E~2 rem (0.123E~2, 0.123E~2) = 0.0 * (0.123E~2, 0.22250738585072014E~307) = 0.2736840845964E~310 + (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, 0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, 0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (0.123E~2, 0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.22250738585072014E~307) = 0.0 * (0.123E~2, 0.11125369292536007E~307) = 0.1368420422982E~310 + (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, 0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, 0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (0.123E~2, 0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, 0.11125369292536007E~307) = 0.0 * (0.123E~2, 0.5E~323) = 0.0 + (0.123E~2, 0.5E~323) = 0.123E~2 - (0.123E~2, 0.5E~323) = 0.123E~2 / (0.123E~2, 0.5E~323) = inf nextAfter (0.123E~2, 0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, 0.5E~323) = ~inf * (0.123E~2, 0.0) = 0.0 + (0.123E~2, 0.0) = 0.123E~2 - (0.123E~2, 0.0) = 0.123E~2 / (0.123E~2, 0.0) = inf nextAfter (0.123E~2, 0.0) = 0.12299999999999998E~2 rem (0.123E~2, 0.0) = nan * (0.123E~2, ~0.17976931348623157E309) = ~0.2211162555880648E306 + (0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.123E~2, ~0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (0.123E~2, ~0.17976931348623157E309) = 0.12299999999999998E~2 rem (0.123E~2, ~0.17976931348623157E309) = 0.123E~2 * (0.123E~2, ~0.8988465674311579E308) = ~0.1105581277940324E306 + (0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.123E~2, ~0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (0.123E~2, ~0.8988465674311579E308) = 0.12299999999999998E~2 rem (0.123E~2, ~0.8988465674311579E308) = 0.123E~2 * (0.123E~2, ~0.123E4) = ~0.15129E1 + (0.123E~2, ~0.123E4) = ~0.122999877E4 - (0.123E~2, ~0.123E4) = 0.123000123E4 / (0.123E~2, ~0.123E4) = ~0.1E~5 nextAfter (0.123E~2, ~0.123E4) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E4) = 0.123E~2 * (0.123E~2, ~0.123E2) = ~0.15129E~1 + (0.123E~2, ~0.123E2) = ~0.12298770000000001E2 - (0.123E~2, ~0.123E2) = 0.1230123E2 / (0.123E~2, ~0.123E2) = ~0.9999999999999999E~4 nextAfter (0.123E~2, ~0.123E2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E2) = 0.123E~2 * (0.123E~2, ~0.3141592653589793E1) = ~0.38641589639154456E~2 + (0.123E~2, ~0.3141592653589793E1) = ~0.3140362653589793E1 - (0.123E~2, ~0.3141592653589793E1) = 0.3142822653589793E1 / (0.123E~2, ~0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (0.123E~2, ~0.3141592653589793E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.3141592653589793E1) = 0.123E~2 * (0.123E~2, ~0.2718281828459045E1) = ~0.33434866490046253E~2 + (0.123E~2, ~0.2718281828459045E1) = ~0.2717051828459045E1 - (0.123E~2, ~0.2718281828459045E1) = 0.2719511828459045E1 / (0.123E~2, ~0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (0.123E~2, ~0.2718281828459045E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.2718281828459045E1) = 0.123E~2 * (0.123E~2, ~0.123E1) = ~0.15129E~2 + (0.123E~2, ~0.123E1) = ~0.122877E1 - (0.123E~2, ~0.123E1) = 0.123123E1 / (0.123E~2, ~0.123E1) = ~0.1E~2 nextAfter (0.123E~2, ~0.123E1) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E1) = 0.123E~2 * (0.123E~2, ~0.123) = ~0.15129E~3 + (0.123E~2, ~0.123) = ~0.12177 - (0.123E~2, ~0.123) = 0.12423 / (0.123E~2, ~0.123) = ~0.1E~1 nextAfter (0.123E~2, ~0.123) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123) = 0.123E~2 * (0.123E~2, ~0.123E~2) = ~0.15129E~5 + (0.123E~2, ~0.123E~2) = 0.0 - (0.123E~2, ~0.123E~2) = 0.246E~2 / (0.123E~2, ~0.123E~2) = ~0.1E1 nextAfter (0.123E~2, ~0.123E~2) = 0.12299999999999998E~2 rem (0.123E~2, ~0.123E~2) = 0.0 * (0.123E~2, ~0.22250738585072014E~307) = ~0.2736840845964E~310 + (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 - (0.123E~2, ~0.22250738585072014E~307) = 0.123E~2 / (0.123E~2, ~0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (0.123E~2, ~0.22250738585072014E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.22250738585072014E~307) = 0.0 * (0.123E~2, ~0.11125369292536007E~307) = ~0.1368420422982E~310 + (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 - (0.123E~2, ~0.11125369292536007E~307) = 0.123E~2 / (0.123E~2, ~0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (0.123E~2, ~0.11125369292536007E~307) = 0.12299999999999998E~2 rem (0.123E~2, ~0.11125369292536007E~307) = 0.0 * (0.123E~2, ~0.5E~323) = ~0.0 + (0.123E~2, ~0.5E~323) = 0.123E~2 - (0.123E~2, ~0.5E~323) = 0.123E~2 / (0.123E~2, ~0.5E~323) = ~inf nextAfter (0.123E~2, ~0.5E~323) = 0.12299999999999998E~2 rem (0.123E~2, ~0.5E~323) = ~inf * (0.123E~2, ~0.0) = ~0.0 + (0.123E~2, ~0.0) = 0.123E~2 - (0.123E~2, ~0.0) = 0.123E~2 / (0.123E~2, ~0.0) = ~inf nextAfter (0.123E~2, ~0.0) = 0.12299999999999998E~2 rem (0.123E~2, ~0.0) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.123E~2, ~inf) = ~inf + (0.123E~2, ~inf) = ~inf - (0.123E~2, ~inf) = inf / (0.123E~2, ~inf) = ~0.0 nextAfter (0.123E~2, ~inf) = 0.12299999999999998E~2 rem (0.123E~2, ~inf) = 0.123E~2 * (0.123E~2, nan) = nan + (0.123E~2, nan) = nan - (0.123E~2, nan) = nan / (0.123E~2, nan) = nan nextAfter (0.123E~2, nan) = nan rem (0.123E~2, nan) = nan * (0.123E~2, inf) = inf + (0.123E~2, inf) = inf - (0.123E~2, inf) = ~inf / (0.123E~2, inf) = 0.0 nextAfter (0.123E~2, inf) = 0.12300000000000002E~2 rem (0.123E~2, inf) = 0.123E~2 * (0.22250738585072014E~307, 0.17976931348623157E309) = 0.39999999999999996E1 + (0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.22250738585072014E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.22250738585072014E~307, 0.17976931348623157E309) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.8988465674311579E308) = 0.19999999999999998E1 + (0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.22250738585072014E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.22250738585072014E~307, 0.8988465674311579E308) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E4) = 0.27368408459638577E~304 + (0.22250738585072014E~307, 0.123E4) = 0.123E4 - (0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (0.22250738585072014E~307, 0.123E4) = 0.18090031369976E~310 nextAfter (0.22250738585072014E~307, 0.123E4) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E2) = 0.2736840845963858E~306 + (0.22250738585072014E~307, 0.123E2) = 0.123E2 - (0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (0.22250738585072014E~307, 0.123E2) = 0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, 0.123E2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.3141592653589793E1) = 0.6990275687580919E~307 + (0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.22250738585072014E~307, 0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, 0.3141592653589793E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.2718281828459045E1) = 0.6048377836559378E~307 + (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.22250738585072014E~307, 0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (0.22250738585072014E~307, 0.2718281828459045E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E1) = 0.27368408459638577E~307 + (0.22250738585072014E~307, 0.123E1) = 0.123E1 - (0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (0.22250738585072014E~307, 0.123E1) = 0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, 0.123E1) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123) = 0.273684084596386E~308 + (0.22250738585072014E~307, 0.123) = 0.123 - (0.22250738585072014E~307, 0.123) = ~0.123 / (0.22250738585072014E~307, 0.123) = 0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, 0.123) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.123E~2) = 0.2736840845964E~310 + (0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (0.22250738585072014E~307, 0.123E~2) = 0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, 0.123E~2) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, 0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 + (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.4450147717014403E~307 - (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 / (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.1E1 nextAfter (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.22250738585072014E~307 rem (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 + (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.3337610787760802E~307 - (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2E1 nextAfter (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, 0.5E~323) = 0.0 + (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507202E~307 - (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 / (0.22250738585072014E~307, 0.5E~323) = 0.4503599627370496E16 nextAfter (0.22250738585072014E~307, 0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.5E~323) = 0.0 * (0.22250738585072014E~307, 0.0) = 0.0 + (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, 0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, 0.0) = inf nextAfter (0.22250738585072014E~307, 0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, 0.0) = nan * (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.39999999999999996E1 + (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.17976931348623157E309) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.19999999999999998E1 + (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.8988465674311579E308) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E4) = ~0.27368408459638577E~304 + (0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (0.22250738585072014E~307, ~0.123E4) = ~0.18090031369976E~310 nextAfter (0.22250738585072014E~307, ~0.123E4) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E4) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E2) = ~0.2736840845963858E~306 + (0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (0.22250738585072014E~307, ~0.123E2) = ~0.1809003136997725E~308 nextAfter (0.22250738585072014E~307, ~0.123E2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.6990275687580919E~307 + (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.3141592653589793E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.6048377836559378E~307 + (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.2718281828459045E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E1) = ~0.27368408459638577E~307 + (0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (0.22250738585072014E~307, ~0.123E1) = ~0.18090031369977247E~307 nextAfter (0.22250738585072014E~307, ~0.123E1) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E1) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123) = ~0.273684084596386E~308 + (0.22250738585072014E~307, ~0.123) = ~0.123 - (0.22250738585072014E~307, ~0.123) = 0.123 / (0.22250738585072014E~307, ~0.123) = ~0.1809003136997725E~306 nextAfter (0.22250738585072014E~307, ~0.123) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.123E~2) = ~0.2736840845964E~310 + (0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (0.22250738585072014E~307, ~0.123E~2) = ~0.18090031369977247E~304 nextAfter (0.22250738585072014E~307, ~0.123E~2) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.123E~2) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.0 + (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 - (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.4450147717014403E~307 / (0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.1E1 nextAfter (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.0 + (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.3337610787760802E~307 / (0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2E1 nextAfter (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (0.22250738585072014E~307, ~0.5E~323) = ~0.0 + (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 - (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507202E~307 / (0.22250738585072014E~307, ~0.5E~323) = ~0.4503599627370496E16 nextAfter (0.22250738585072014E~307, ~0.5E~323) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.5E~323) = 0.0 * (0.22250738585072014E~307, ~0.0) = ~0.0 + (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 - (0.22250738585072014E~307, ~0.0) = 0.22250738585072014E~307 / (0.22250738585072014E~307, ~0.0) = ~inf nextAfter (0.22250738585072014E~307, ~0.0) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~0.0) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, ~inf) = ~inf + (0.22250738585072014E~307, ~inf) = ~inf - (0.22250738585072014E~307, ~inf) = inf / (0.22250738585072014E~307, ~inf) = ~0.0 nextAfter (0.22250738585072014E~307, ~inf) = 0.2225073858507201E~307 rem (0.22250738585072014E~307, ~inf) = 0.22250738585072014E~307 * (0.22250738585072014E~307, nan) = nan + (0.22250738585072014E~307, nan) = nan - (0.22250738585072014E~307, nan) = nan / (0.22250738585072014E~307, nan) = nan nextAfter (0.22250738585072014E~307, nan) = nan rem (0.22250738585072014E~307, nan) = nan * (0.22250738585072014E~307, inf) = inf + (0.22250738585072014E~307, inf) = inf - (0.22250738585072014E~307, inf) = ~inf / (0.22250738585072014E~307, inf) = 0.0 nextAfter (0.22250738585072014E~307, inf) = 0.2225073858507202E~307 rem (0.22250738585072014E~307, inf) = 0.22250738585072014E~307 * (0.11125369292536007E~307, 0.17976931348623157E309) = 0.19999999999999998E1 + (0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.11125369292536007E~307, 0.17976931348623157E309) = 0.0 nextAfter (0.11125369292536007E~307, 0.17976931348623157E309) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.8988465674311579E308) = 0.9999999999999999 + (0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.11125369292536007E~307, 0.8988465674311579E308) = 0.0 nextAfter (0.11125369292536007E~307, 0.8988465674311579E308) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E4) = 0.13684204229819289E~304 + (0.11125369292536007E~307, 0.123E4) = 0.123E4 - (0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (0.11125369292536007E~307, 0.123E4) = 0.904501568499E~311 nextAfter (0.11125369292536007E~307, 0.123E4) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E2) = 0.1368420422981929E~306 + (0.11125369292536007E~307, 0.123E2) = 0.123E2 - (0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (0.11125369292536007E~307, 0.123E2) = 0.90450156849886E~309 nextAfter (0.11125369292536007E~307, 0.123E2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.3141592653589793E1) = 0.34951378437904593E~307 + (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.11125369292536007E~307, 0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, 0.3141592653589793E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.2718281828459045E1) = 0.3024188918279689E~307 + (0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.11125369292536007E~307, 0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (0.11125369292536007E~307, 0.2718281828459045E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E1) = 0.1368420422981929E~307 + (0.11125369292536007E~307, 0.123E1) = 0.123E1 - (0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (0.11125369292536007E~307, 0.123E1) = 0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, 0.123E1) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123) = 0.136842042298193E~308 + (0.11125369292536007E~307, 0.123) = 0.123 - (0.11125369292536007E~307, 0.123) = ~0.123 / (0.11125369292536007E~307, 0.123) = 0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, 0.123) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.123E~2) = 0.1368420422982E~310 + (0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (0.11125369292536007E~307, 0.123E~2) = 0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, 0.123E~2) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.0 + (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.3337610787760802E~307 - (0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 / (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.5 nextAfter (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 + (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.22250738585072014E~307 - (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 / (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.1E1 nextAfter (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.11125369292536007E~307 rem (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, 0.5E~323) = 0.0 + (0.11125369292536007E~307, 0.5E~323) = 0.1112536929253601E~307 - (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 / (0.11125369292536007E~307, 0.5E~323) = 0.2251799813685248E16 nextAfter (0.11125369292536007E~307, 0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.5E~323) = 0.0 * (0.11125369292536007E~307, 0.0) = 0.0 + (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, 0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, 0.0) = inf nextAfter (0.11125369292536007E~307, 0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, 0.0) = nan * (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.19999999999999998E1 + (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.17976931348623157E309) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.9999999999999999 + (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.0 nextAfter (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.8988465674311579E308) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E4) = ~0.13684204229819289E~304 + (0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (0.11125369292536007E~307, ~0.123E4) = ~0.904501568499E~311 nextAfter (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E4) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E2) = ~0.1368420422981929E~306 + (0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (0.11125369292536007E~307, ~0.123E2) = ~0.90450156849886E~309 nextAfter (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.34951378437904593E~307 + (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.3141592653589793E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.3024188918279689E~307 + (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.2718281828459045E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E1) = ~0.1368420422981929E~307 + (0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (0.11125369292536007E~307, ~0.123E1) = ~0.9045015684988623E~308 nextAfter (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E1) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123) = ~0.136842042298193E~308 + (0.11125369292536007E~307, ~0.123) = ~0.123 - (0.11125369292536007E~307, ~0.123) = 0.123 / (0.11125369292536007E~307, ~0.123) = ~0.9045015684988624E~307 nextAfter (0.11125369292536007E~307, ~0.123) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.123E~2) = ~0.1368420422982E~310 + (0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (0.11125369292536007E~307, ~0.123E~2) = ~0.9045015684988623E~305 nextAfter (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.123E~2) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.0 + (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.3337610787760802E~307 / (0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.5 nextAfter (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.0 + (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 - (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.22250738585072014E~307 / (0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.1E1 nextAfter (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (0.11125369292536007E~307, ~0.5E~323) = ~0.0 + (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 - (0.11125369292536007E~307, ~0.5E~323) = 0.1112536929253601E~307 / (0.11125369292536007E~307, ~0.5E~323) = ~0.2251799813685248E16 nextAfter (0.11125369292536007E~307, ~0.5E~323) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.5E~323) = 0.0 * (0.11125369292536007E~307, ~0.0) = ~0.0 + (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 - (0.11125369292536007E~307, ~0.0) = 0.11125369292536007E~307 / (0.11125369292536007E~307, ~0.0) = ~inf nextAfter (0.11125369292536007E~307, ~0.0) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~0.0) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, ~inf) = ~inf + (0.11125369292536007E~307, ~inf) = ~inf - (0.11125369292536007E~307, ~inf) = inf / (0.11125369292536007E~307, ~inf) = ~0.0 nextAfter (0.11125369292536007E~307, ~inf) = 0.11125369292536E~307 rem (0.11125369292536007E~307, ~inf) = 0.11125369292536007E~307 * (0.11125369292536007E~307, nan) = nan + (0.11125369292536007E~307, nan) = nan - (0.11125369292536007E~307, nan) = nan / (0.11125369292536007E~307, nan) = nan nextAfter (0.11125369292536007E~307, nan) = nan rem (0.11125369292536007E~307, nan) = nan * (0.11125369292536007E~307, inf) = inf + (0.11125369292536007E~307, inf) = inf - (0.11125369292536007E~307, inf) = ~inf / (0.11125369292536007E~307, inf) = 0.0 nextAfter (0.11125369292536007E~307, inf) = 0.1112536929253601E~307 rem (0.11125369292536007E~307, inf) = 0.11125369292536007E~307 * (0.5E~323, 0.17976931348623157E309) = 0.8881784197001251E~15 + (0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.5E~323, 0.17976931348623157E309) = 0.0 nextAfter (0.5E~323, 0.17976931348623157E309) = 0.1E~322 rem (0.5E~323, 0.17976931348623157E309) = 0.5E~323 * (0.5E~323, 0.8988465674311579E308) = 0.44408920985006257E~15 + (0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.5E~323, 0.8988465674311579E308) = 0.0 nextAfter (0.5E~323, 0.8988465674311579E308) = 0.1E~322 rem (0.5E~323, 0.8988465674311579E308) = 0.5E~323 * (0.5E~323, 0.123E4) = 0.6077E~320 + (0.5E~323, 0.123E4) = 0.123E4 - (0.5E~323, 0.123E4) = ~0.123E4 / (0.5E~323, 0.123E4) = 0.0 nextAfter (0.5E~323, 0.123E4) = 0.1E~322 rem (0.5E~323, 0.123E4) = 0.5E~323 * (0.5E~323, 0.123E2) = 0.6E~322 + (0.5E~323, 0.123E2) = 0.123E2 - (0.5E~323, 0.123E2) = ~0.123E2 / (0.5E~323, 0.123E2) = 0.0 nextAfter (0.5E~323, 0.123E2) = 0.1E~322 rem (0.5E~323, 0.123E2) = 0.5E~323 * (0.5E~323, 0.3141592653589793E1) = 0.15E~322 + (0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.5E~323, 0.3141592653589793E1) = 0.0 nextAfter (0.5E~323, 0.3141592653589793E1) = 0.1E~322 rem (0.5E~323, 0.3141592653589793E1) = 0.5E~323 * (0.5E~323, 0.2718281828459045E1) = 0.15E~322 + (0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.5E~323, 0.2718281828459045E1) = 0.0 nextAfter (0.5E~323, 0.2718281828459045E1) = 0.1E~322 rem (0.5E~323, 0.2718281828459045E1) = 0.5E~323 * (0.5E~323, 0.123E1) = 0.5E~323 + (0.5E~323, 0.123E1) = 0.123E1 - (0.5E~323, 0.123E1) = ~0.123E1 / (0.5E~323, 0.123E1) = 0.5E~323 nextAfter (0.5E~323, 0.123E1) = 0.1E~322 rem (0.5E~323, 0.123E1) = 0.5E~323 * (0.5E~323, 0.123) = 0.0 + (0.5E~323, 0.123) = 0.123 - (0.5E~323, 0.123) = ~0.123 / (0.5E~323, 0.123) = 0.4E~322 nextAfter (0.5E~323, 0.123) = 0.1E~322 rem (0.5E~323, 0.123) = 0.5E~323 * (0.5E~323, 0.123E~2) = 0.0 + (0.5E~323, 0.123E~2) = 0.123E~2 - (0.5E~323, 0.123E~2) = ~0.123E~2 / (0.5E~323, 0.123E~2) = 0.4017E~320 nextAfter (0.5E~323, 0.123E~2) = 0.1E~322 rem (0.5E~323, 0.123E~2) = 0.5E~323 * (0.5E~323, 0.22250738585072014E~307) = 0.0 + (0.5E~323, 0.22250738585072014E~307) = 0.2225073858507202E~307 - (0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507201E~307 / (0.5E~323, 0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (0.5E~323, 0.22250738585072014E~307) = 0.1E~322 rem (0.5E~323, 0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, 0.11125369292536007E~307) = 0.0 + (0.5E~323, 0.11125369292536007E~307) = 0.1112536929253601E~307 - (0.5E~323, 0.11125369292536007E~307) = ~0.11125369292536E~307 / (0.5E~323, 0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (0.5E~323, 0.11125369292536007E~307) = 0.1E~322 rem (0.5E~323, 0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, 0.5E~323) = 0.0 + (0.5E~323, 0.5E~323) = 0.1E~322 - (0.5E~323, 0.5E~323) = 0.0 / (0.5E~323, 0.5E~323) = 0.1E1 nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 rem (0.5E~323, 0.5E~323) = 0.0 * (0.5E~323, 0.0) = 0.0 + (0.5E~323, 0.0) = 0.5E~323 - (0.5E~323, 0.0) = 0.5E~323 / (0.5E~323, 0.0) = inf nextAfter (0.5E~323, 0.0) = 0.0 rem (0.5E~323, 0.0) = nan * (0.5E~323, ~0.17976931348623157E309) = ~0.8881784197001251E~15 + (0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.5E~323, ~0.17976931348623157E309) = ~0.0 nextAfter (0.5E~323, ~0.17976931348623157E309) = 0.0 rem (0.5E~323, ~0.17976931348623157E309) = 0.5E~323 * (0.5E~323, ~0.8988465674311579E308) = ~0.44408920985006257E~15 + (0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.5E~323, ~0.8988465674311579E308) = ~0.0 nextAfter (0.5E~323, ~0.8988465674311579E308) = 0.0 rem (0.5E~323, ~0.8988465674311579E308) = 0.5E~323 * (0.5E~323, ~0.123E4) = ~0.6077E~320 + (0.5E~323, ~0.123E4) = ~0.123E4 - (0.5E~323, ~0.123E4) = 0.123E4 / (0.5E~323, ~0.123E4) = ~0.0 nextAfter (0.5E~323, ~0.123E4) = 0.0 rem (0.5E~323, ~0.123E4) = 0.5E~323 * (0.5E~323, ~0.123E2) = ~0.6E~322 + (0.5E~323, ~0.123E2) = ~0.123E2 - (0.5E~323, ~0.123E2) = 0.123E2 / (0.5E~323, ~0.123E2) = ~0.0 nextAfter (0.5E~323, ~0.123E2) = 0.0 rem (0.5E~323, ~0.123E2) = 0.5E~323 * (0.5E~323, ~0.3141592653589793E1) = ~0.15E~322 + (0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.5E~323, ~0.3141592653589793E1) = ~0.0 nextAfter (0.5E~323, ~0.3141592653589793E1) = 0.0 rem (0.5E~323, ~0.3141592653589793E1) = 0.5E~323 * (0.5E~323, ~0.2718281828459045E1) = ~0.15E~322 + (0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.5E~323, ~0.2718281828459045E1) = ~0.0 nextAfter (0.5E~323, ~0.2718281828459045E1) = 0.0 rem (0.5E~323, ~0.2718281828459045E1) = 0.5E~323 * (0.5E~323, ~0.123E1) = ~0.5E~323 + (0.5E~323, ~0.123E1) = ~0.123E1 - (0.5E~323, ~0.123E1) = 0.123E1 / (0.5E~323, ~0.123E1) = ~0.5E~323 nextAfter (0.5E~323, ~0.123E1) = 0.0 rem (0.5E~323, ~0.123E1) = 0.5E~323 * (0.5E~323, ~0.123) = ~0.0 + (0.5E~323, ~0.123) = ~0.123 - (0.5E~323, ~0.123) = 0.123 / (0.5E~323, ~0.123) = ~0.4E~322 nextAfter (0.5E~323, ~0.123) = 0.0 rem (0.5E~323, ~0.123) = 0.5E~323 * (0.5E~323, ~0.123E~2) = ~0.0 + (0.5E~323, ~0.123E~2) = ~0.123E~2 - (0.5E~323, ~0.123E~2) = 0.123E~2 / (0.5E~323, ~0.123E~2) = ~0.4017E~320 nextAfter (0.5E~323, ~0.123E~2) = 0.0 rem (0.5E~323, ~0.123E~2) = 0.5E~323 * (0.5E~323, ~0.22250738585072014E~307) = ~0.0 + (0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507201E~307 - (0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507202E~307 / (0.5E~323, ~0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (0.5E~323, ~0.22250738585072014E~307) = 0.0 rem (0.5E~323, ~0.22250738585072014E~307) = 0.5E~323 * (0.5E~323, ~0.11125369292536007E~307) = ~0.0 + (0.5E~323, ~0.11125369292536007E~307) = ~0.11125369292536E~307 - (0.5E~323, ~0.11125369292536007E~307) = 0.1112536929253601E~307 / (0.5E~323, ~0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (0.5E~323, ~0.11125369292536007E~307) = 0.0 rem (0.5E~323, ~0.11125369292536007E~307) = 0.5E~323 * (0.5E~323, ~0.5E~323) = ~0.0 + (0.5E~323, ~0.5E~323) = 0.0 - (0.5E~323, ~0.5E~323) = 0.1E~322 / (0.5E~323, ~0.5E~323) = ~0.1E1 nextAfter (0.5E~323, ~0.5E~323) = 0.0 rem (0.5E~323, ~0.5E~323) = 0.0 * (0.5E~323, ~0.0) = ~0.0 + (0.5E~323, ~0.0) = 0.5E~323 - (0.5E~323, ~0.0) = 0.5E~323 / (0.5E~323, ~0.0) = ~inf nextAfter (0.5E~323, ~0.0) = 0.0 rem (0.5E~323, ~0.0) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.5E~323, ~inf) = ~inf + (0.5E~323, ~inf) = ~inf - (0.5E~323, ~inf) = inf / (0.5E~323, ~inf) = ~0.0 nextAfter (0.5E~323, ~inf) = 0.0 rem (0.5E~323, ~inf) = 0.5E~323 * (0.5E~323, nan) = nan + (0.5E~323, nan) = nan - (0.5E~323, nan) = nan / (0.5E~323, nan) = nan nextAfter (0.5E~323, nan) = nan rem (0.5E~323, nan) = nan * (0.5E~323, inf) = inf + (0.5E~323, inf) = inf - (0.5E~323, inf) = ~inf / (0.5E~323, inf) = 0.0 nextAfter (0.5E~323, inf) = 0.1E~322 rem (0.5E~323, inf) = 0.5E~323 * (0.0, 0.17976931348623157E309) = 0.0 + (0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (0.0, 0.17976931348623157E309) = 0.0 nextAfter (0.0, 0.17976931348623157E309) = 0.5E~323 rem (0.0, 0.17976931348623157E309) = 0.0 * (0.0, 0.8988465674311579E308) = 0.0 + (0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (0.0, 0.8988465674311579E308) = 0.0 nextAfter (0.0, 0.8988465674311579E308) = 0.5E~323 rem (0.0, 0.8988465674311579E308) = 0.0 * (0.0, 0.123E4) = 0.0 + (0.0, 0.123E4) = 0.123E4 - (0.0, 0.123E4) = ~0.123E4 / (0.0, 0.123E4) = 0.0 nextAfter (0.0, 0.123E4) = 0.5E~323 rem (0.0, 0.123E4) = 0.0 * (0.0, 0.123E2) = 0.0 + (0.0, 0.123E2) = 0.123E2 - (0.0, 0.123E2) = ~0.123E2 / (0.0, 0.123E2) = 0.0 nextAfter (0.0, 0.123E2) = 0.5E~323 rem (0.0, 0.123E2) = 0.0 * (0.0, 0.3141592653589793E1) = 0.0 + (0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (0.0, 0.3141592653589793E1) = 0.0 nextAfter (0.0, 0.3141592653589793E1) = 0.5E~323 rem (0.0, 0.3141592653589793E1) = 0.0 * (0.0, 0.2718281828459045E1) = 0.0 + (0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (0.0, 0.2718281828459045E1) = 0.0 nextAfter (0.0, 0.2718281828459045E1) = 0.5E~323 rem (0.0, 0.2718281828459045E1) = 0.0 * (0.0, 0.123E1) = 0.0 + (0.0, 0.123E1) = 0.123E1 - (0.0, 0.123E1) = ~0.123E1 / (0.0, 0.123E1) = 0.0 nextAfter (0.0, 0.123E1) = 0.5E~323 rem (0.0, 0.123E1) = 0.0 * (0.0, 0.123) = 0.0 + (0.0, 0.123) = 0.123 - (0.0, 0.123) = ~0.123 / (0.0, 0.123) = 0.0 nextAfter (0.0, 0.123) = 0.5E~323 rem (0.0, 0.123) = 0.0 * (0.0, 0.123E~2) = 0.0 + (0.0, 0.123E~2) = 0.123E~2 - (0.0, 0.123E~2) = ~0.123E~2 / (0.0, 0.123E~2) = 0.0 nextAfter (0.0, 0.123E~2) = 0.5E~323 rem (0.0, 0.123E~2) = 0.0 * (0.0, 0.22250738585072014E~307) = 0.0 + (0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (0.0, 0.22250738585072014E~307) = 0.0 nextAfter (0.0, 0.22250738585072014E~307) = 0.5E~323 rem (0.0, 0.22250738585072014E~307) = 0.0 * (0.0, 0.11125369292536007E~307) = 0.0 + (0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (0.0, 0.11125369292536007E~307) = 0.0 nextAfter (0.0, 0.11125369292536007E~307) = 0.5E~323 rem (0.0, 0.11125369292536007E~307) = 0.0 * (0.0, 0.5E~323) = 0.0 + (0.0, 0.5E~323) = 0.5E~323 - (0.0, 0.5E~323) = ~0.5E~323 / (0.0, 0.5E~323) = 0.0 nextAfter (0.0, 0.5E~323) = 0.5E~323 rem (0.0, 0.5E~323) = 0.0 * (0.0, 0.0) = 0.0 + (0.0, 0.0) = 0.0 - (0.0, 0.0) = 0.0 / (0.0, 0.0) = nan nextAfter (0.0, 0.0) = 0.0 rem (0.0, 0.0) = 0.0 * (0.0, ~0.17976931348623157E309) = ~0.0 + (0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (0.0, ~0.17976931348623157E309) = ~0.0 nextAfter (0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (0.0, ~0.17976931348623157E309) = 0.0 * (0.0, ~0.8988465674311579E308) = ~0.0 + (0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (0.0, ~0.8988465674311579E308) = ~0.0 nextAfter (0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (0.0, ~0.8988465674311579E308) = 0.0 * (0.0, ~0.123E4) = ~0.0 + (0.0, ~0.123E4) = ~0.123E4 - (0.0, ~0.123E4) = 0.123E4 / (0.0, ~0.123E4) = ~0.0 nextAfter (0.0, ~0.123E4) = ~0.5E~323 rem (0.0, ~0.123E4) = 0.0 * (0.0, ~0.123E2) = ~0.0 + (0.0, ~0.123E2) = ~0.123E2 - (0.0, ~0.123E2) = 0.123E2 / (0.0, ~0.123E2) = ~0.0 nextAfter (0.0, ~0.123E2) = ~0.5E~323 rem (0.0, ~0.123E2) = 0.0 * (0.0, ~0.3141592653589793E1) = ~0.0 + (0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (0.0, ~0.3141592653589793E1) = ~0.0 nextAfter (0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (0.0, ~0.3141592653589793E1) = 0.0 * (0.0, ~0.2718281828459045E1) = ~0.0 + (0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (0.0, ~0.2718281828459045E1) = ~0.0 nextAfter (0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (0.0, ~0.2718281828459045E1) = 0.0 * (0.0, ~0.123E1) = ~0.0 + (0.0, ~0.123E1) = ~0.123E1 - (0.0, ~0.123E1) = 0.123E1 / (0.0, ~0.123E1) = ~0.0 nextAfter (0.0, ~0.123E1) = ~0.5E~323 rem (0.0, ~0.123E1) = 0.0 * (0.0, ~0.123) = ~0.0 + (0.0, ~0.123) = ~0.123 - (0.0, ~0.123) = 0.123 / (0.0, ~0.123) = ~0.0 nextAfter (0.0, ~0.123) = ~0.5E~323 rem (0.0, ~0.123) = 0.0 * (0.0, ~0.123E~2) = ~0.0 + (0.0, ~0.123E~2) = ~0.123E~2 - (0.0, ~0.123E~2) = 0.123E~2 / (0.0, ~0.123E~2) = ~0.0 nextAfter (0.0, ~0.123E~2) = ~0.5E~323 rem (0.0, ~0.123E~2) = 0.0 * (0.0, ~0.22250738585072014E~307) = ~0.0 + (0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (0.0, ~0.22250738585072014E~307) = ~0.0 nextAfter (0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (0.0, ~0.22250738585072014E~307) = 0.0 * (0.0, ~0.11125369292536007E~307) = ~0.0 + (0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (0.0, ~0.11125369292536007E~307) = ~0.0 nextAfter (0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (0.0, ~0.11125369292536007E~307) = 0.0 * (0.0, ~0.5E~323) = ~0.0 + (0.0, ~0.5E~323) = ~0.5E~323 - (0.0, ~0.5E~323) = 0.5E~323 / (0.0, ~0.5E~323) = ~0.0 nextAfter (0.0, ~0.5E~323) = ~0.5E~323 rem (0.0, ~0.5E~323) = 0.0 * (0.0, ~0.0) = ~0.0 + (0.0, ~0.0) = 0.0 - (0.0, ~0.0) = 0.0 / (0.0, ~0.0) = nan nextAfter (0.0, ~0.0) = ~0.0 rem (0.0, ~0.0) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (0.0, ~inf) = nan + (0.0, ~inf) = ~inf - (0.0, ~inf) = inf / (0.0, ~inf) = ~0.0 nextAfter (0.0, ~inf) = ~0.5E~323 rem (0.0, ~inf) = 0.0 * (0.0, nan) = nan + (0.0, nan) = nan - (0.0, nan) = nan / (0.0, nan) = nan nextAfter (0.0, nan) = nan rem (0.0, nan) = 0.0 * (0.0, inf) = nan + (0.0, inf) = inf - (0.0, inf) = ~inf / (0.0, inf) = 0.0 nextAfter (0.0, inf) = 0.5E~323 rem (0.0, inf) = 0.0 * (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf + (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 - (~0.17976931348623157E309, 0.17976931348623157E309) = ~inf / (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.1E1 nextAfter (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf + (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.17976931348623157E309, 0.8988465674311579E308) = ~inf / (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.2E1 nextAfter (~0.17976931348623157E309, 0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, 0.123E4) = ~inf + (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E4) = ~0.1461539134034403E306 nextAfter (~0.17976931348623157E309, 0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E4) = ~0.41709943968791996E292 * (~0.17976931348623157E309, 0.123E2) = ~inf + (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E2) = ~0.1461539134034403E308 nextAfter (~0.17976931348623157E309, 0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E2) = ~0.43366647350729996E292 * (~0.17976931348623157E309, 0.3141592653589793E1) = ~inf + (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.5722234971514056E308 nextAfter (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.3141592653589793E1) = ~0.7289494880527199E292 * (~0.17976931348623157E309, 0.2718281828459045E1) = ~inf + (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.661334345850887E308 nextAfter (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.2718281828459045E1) = ~0.106516282144602E293 * (~0.17976931348623157E309, 0.123E1) = ~inf + (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E1) = ~0.1461539134034403E309 nextAfter (~0.17976931348623157E309, 0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E1) = ~0.111778751710758E293 * (~0.17976931348623157E309, 0.123) = ~0.22111625558806483E308 + (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123) = ~inf nextAfter (~0.17976931348623157E309, 0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123) = inf * (~0.17976931348623157E309, 0.123E~2) = ~0.2211162555880648E306 + (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.123E~2) = ~inf nextAfter (~0.17976931348623157E309, 0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.123E~2) = inf * (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.39999999999999996E1 + (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.22250738585072014E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.22250738585072014E~307) = inf * (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.19999999999999998E1 + (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.11125369292536007E~307) = ~inf nextAfter (~0.17976931348623157E309, 0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.11125369292536007E~307) = inf * (~0.17976931348623157E309, 0.5E~323) = ~0.8881784197001251E~15 + (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.5E~323) = ~inf nextAfter (~0.17976931348623157E309, 0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.5E~323) = inf * (~0.17976931348623157E309, 0.0) = ~0.0 + (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, 0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, 0.0) = ~inf nextAfter (~0.17976931348623157E309, 0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, 0.0) = nan * (~0.17976931348623157E309, ~0.17976931348623157E309) = inf + (~0.17976931348623157E309, ~0.17976931348623157E309) = ~inf - (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 / (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.1E1 nextAfter (~0.17976931348623157E309, ~0.17976931348623157E309) = ~0.17976931348623157E309 rem (~0.17976931348623157E309, ~0.17976931348623157E309) = 0.0 * (~0.17976931348623157E309, ~0.8988465674311579E308) = inf + (~0.17976931348623157E309, ~0.8988465674311579E308) = ~inf - (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.2E1 nextAfter (~0.17976931348623157E309, ~0.8988465674311579E308) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.8988465674311579E308) = 0.0 * (~0.17976931348623157E309, ~0.123E4) = inf + (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E4) = 0.1461539134034403E306 nextAfter (~0.17976931348623157E309, ~0.123E4) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E4) = ~0.41709943968791996E292 * (~0.17976931348623157E309, ~0.123E2) = inf + (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E2) = 0.1461539134034403E308 nextAfter (~0.17976931348623157E309, ~0.123E2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E2) = ~0.43366647350729996E292 * (~0.17976931348623157E309, ~0.3141592653589793E1) = inf + (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.3141592653589793E1) = 0.5722234971514056E308 nextAfter (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.3141592653589793E1) = ~0.7289494880527199E292 * (~0.17976931348623157E309, ~0.2718281828459045E1) = inf + (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.2718281828459045E1) = 0.661334345850887E308 nextAfter (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.2718281828459045E1) = ~0.106516282144602E293 * (~0.17976931348623157E309, ~0.123E1) = inf + (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E1) = 0.1461539134034403E309 nextAfter (~0.17976931348623157E309, ~0.123E1) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E1) = ~0.111778751710758E293 * (~0.17976931348623157E309, ~0.123) = 0.22111625558806483E308 + (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123) = inf nextAfter (~0.17976931348623157E309, ~0.123) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123) = inf * (~0.17976931348623157E309, ~0.123E~2) = 0.2211162555880648E306 + (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.123E~2) = inf nextAfter (~0.17976931348623157E309, ~0.123E~2) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.123E~2) = inf * (~0.17976931348623157E309, ~0.22250738585072014E~307) = 0.39999999999999996E1 + (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf nextAfter (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.22250738585072014E~307) = inf * (~0.17976931348623157E309, ~0.11125369292536007E~307) = 0.19999999999999998E1 + (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf nextAfter (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.11125369292536007E~307) = inf * (~0.17976931348623157E309, ~0.5E~323) = 0.8881784197001251E~15 + (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.5E~323) = inf nextAfter (~0.17976931348623157E309, ~0.5E~323) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.5E~323) = inf * (~0.17976931348623157E309, ~0.0) = 0.0 + (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 - (~0.17976931348623157E309, ~0.0) = ~0.17976931348623157E309 / (~0.17976931348623157E309, ~0.0) = inf nextAfter (~0.17976931348623157E309, ~0.0) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, ~0.0) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, ~inf) = inf + (~0.17976931348623157E309, ~inf) = ~inf - (~0.17976931348623157E309, ~inf) = inf / (~0.17976931348623157E309, ~inf) = 0.0 nextAfter (~0.17976931348623157E309, ~inf) = ~inf rem (~0.17976931348623157E309, ~inf) = ~0.17976931348623157E309 * (~0.17976931348623157E309, nan) = nan + (~0.17976931348623157E309, nan) = nan - (~0.17976931348623157E309, nan) = nan / (~0.17976931348623157E309, nan) = nan nextAfter (~0.17976931348623157E309, nan) = nan rem (~0.17976931348623157E309, nan) = nan * (~0.17976931348623157E309, inf) = ~inf + (~0.17976931348623157E309, inf) = inf - (~0.17976931348623157E309, inf) = ~inf / (~0.17976931348623157E309, inf) = ~0.0 nextAfter (~0.17976931348623157E309, inf) = ~0.17976931348623155E309 rem (~0.17976931348623157E309, inf) = ~0.17976931348623157E309 * (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf + (~0.8988465674311579E308, 0.17976931348623157E309) = 0.8988465674311579E308 - (~0.8988465674311579E308, 0.17976931348623157E309) = ~inf / (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.5 nextAfter (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, 0.8988465674311579E308) = ~inf + (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 - (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.17976931348623157E309 / (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.1E1 nextAfter (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, 0.123E4) = ~inf + (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E4) = ~0.7307695670172015E305 nextAfter (~0.8988465674311579E308, 0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E4) = ~0.20854971984395998E292 * (~0.8988465674311579E308, 0.123E2) = ~inf + (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E2) = ~0.7307695670172014E307 nextAfter (~0.8988465674311579E308, 0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E2) = ~0.21683323675364998E292 * (~0.8988465674311579E308, 0.3141592653589793E1) = ~inf + (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.2861117485757028E308 nextAfter (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.3141592653589793E1) = ~0.36447474402635997E292 * (~0.8988465674311579E308, 0.2718281828459045E1) = ~inf + (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.3306671729254435E308 nextAfter (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.2718281828459045E1) = ~0.53258141072301E292 * (~0.8988465674311579E308, 0.123E1) = ~0.1105581277940324E309 + (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E1) = ~0.7307695670172015E308 nextAfter (~0.8988465674311579E308, 0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E1) = ~0.55889375855379E292 * (~0.8988465674311579E308, 0.123) = ~0.11055812779403241E308 + (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123) = ~inf nextAfter (~0.8988465674311579E308, 0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123) = inf * (~0.8988465674311579E308, 0.123E~2) = ~0.1105581277940324E306 + (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.123E~2) = ~inf nextAfter (~0.8988465674311579E308, 0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.123E~2) = inf * (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.19999999999999998E1 + (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.22250738585072014E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.22250738585072014E~307) = inf * (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.9999999999999999 + (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.11125369292536007E~307) = ~inf nextAfter (~0.8988465674311579E308, 0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.11125369292536007E~307) = inf * (~0.8988465674311579E308, 0.5E~323) = ~0.44408920985006257E~15 + (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.5E~323) = ~inf nextAfter (~0.8988465674311579E308, 0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.5E~323) = inf * (~0.8988465674311579E308, 0.0) = ~0.0 + (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, 0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, 0.0) = ~inf nextAfter (~0.8988465674311579E308, 0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, 0.0) = nan * (~0.8988465674311579E308, ~0.17976931348623157E309) = inf + (~0.8988465674311579E308, ~0.17976931348623157E309) = ~inf - (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.8988465674311579E308 / (~0.8988465674311579E308, ~0.17976931348623157E309) = 0.5 nextAfter (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~0.17976931348623157E309) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~0.8988465674311579E308) = inf + (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.17976931348623157E309 - (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 / (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.1E1 nextAfter (~0.8988465674311579E308, ~0.8988465674311579E308) = ~0.8988465674311579E308 rem (~0.8988465674311579E308, ~0.8988465674311579E308) = 0.0 * (~0.8988465674311579E308, ~0.123E4) = inf + (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E4) = 0.7307695670172015E305 nextAfter (~0.8988465674311579E308, ~0.123E4) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E4) = ~0.20854971984395998E292 * (~0.8988465674311579E308, ~0.123E2) = inf + (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E2) = 0.7307695670172014E307 nextAfter (~0.8988465674311579E308, ~0.123E2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E2) = ~0.21683323675364998E292 * (~0.8988465674311579E308, ~0.3141592653589793E1) = inf + (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.3141592653589793E1) = 0.2861117485757028E308 nextAfter (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.3141592653589793E1) = ~0.36447474402635997E292 * (~0.8988465674311579E308, ~0.2718281828459045E1) = inf + (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.2718281828459045E1) = 0.3306671729254435E308 nextAfter (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.2718281828459045E1) = ~0.53258141072301E292 * (~0.8988465674311579E308, ~0.123E1) = 0.1105581277940324E309 + (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E1) = 0.7307695670172015E308 nextAfter (~0.8988465674311579E308, ~0.123E1) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E1) = ~0.55889375855379E292 * (~0.8988465674311579E308, ~0.123) = 0.11055812779403241E308 + (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123) = inf nextAfter (~0.8988465674311579E308, ~0.123) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123) = inf * (~0.8988465674311579E308, ~0.123E~2) = 0.1105581277940324E306 + (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.123E~2) = inf nextAfter (~0.8988465674311579E308, ~0.123E~2) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.123E~2) = inf * (~0.8988465674311579E308, ~0.22250738585072014E~307) = 0.19999999999999998E1 + (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf nextAfter (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.22250738585072014E~307) = inf * (~0.8988465674311579E308, ~0.11125369292536007E~307) = 0.9999999999999999 + (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf nextAfter (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.11125369292536007E~307) = inf * (~0.8988465674311579E308, ~0.5E~323) = 0.44408920985006257E~15 + (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.5E~323) = inf nextAfter (~0.8988465674311579E308, ~0.5E~323) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.5E~323) = inf * (~0.8988465674311579E308, ~0.0) = 0.0 + (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 - (~0.8988465674311579E308, ~0.0) = ~0.8988465674311579E308 / (~0.8988465674311579E308, ~0.0) = inf nextAfter (~0.8988465674311579E308, ~0.0) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, ~0.0) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, ~inf) = inf + (~0.8988465674311579E308, ~inf) = ~inf - (~0.8988465674311579E308, ~inf) = inf / (~0.8988465674311579E308, ~inf) = 0.0 nextAfter (~0.8988465674311579E308, ~inf) = ~0.898846567431158E308 rem (~0.8988465674311579E308, ~inf) = ~0.8988465674311579E308 * (~0.8988465674311579E308, nan) = nan + (~0.8988465674311579E308, nan) = nan - (~0.8988465674311579E308, nan) = nan / (~0.8988465674311579E308, nan) = nan nextAfter (~0.8988465674311579E308, nan) = nan rem (~0.8988465674311579E308, nan) = nan * (~0.8988465674311579E308, inf) = ~inf + (~0.8988465674311579E308, inf) = inf - (~0.8988465674311579E308, inf) = ~inf / (~0.8988465674311579E308, inf) = ~0.0 nextAfter (~0.8988465674311579E308, inf) = ~0.8988465674311578E308 rem (~0.8988465674311579E308, inf) = ~0.8988465674311579E308 * (~0.123E4, 0.17976931348623157E309) = ~inf + (~0.123E4, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E4, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E4, 0.17976931348623157E309) = ~0.6842102114909646E~305 nextAfter (~0.123E4, 0.17976931348623157E309) = ~0.12299999999999998E4 rem (~0.123E4, 0.17976931348623157E309) = ~0.123E4 * (~0.123E4, 0.8988465674311579E308) = ~inf + (~0.123E4, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E4, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E4, 0.8988465674311579E308) = ~0.1368420422981929E~304 nextAfter (~0.123E4, 0.8988465674311579E308) = ~0.12299999999999998E4 rem (~0.123E4, 0.8988465674311579E308) = ~0.123E4 * (~0.123E4, 0.123E4) = ~0.15129E7 + (~0.123E4, 0.123E4) = 0.0 - (~0.123E4, 0.123E4) = ~0.246E4 / (~0.123E4, 0.123E4) = ~0.1E1 nextAfter (~0.123E4, 0.123E4) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E4) = 0.0 * (~0.123E4, 0.123E2) = ~0.15129E5 + (~0.123E4, 0.123E2) = ~0.12177E4 - (~0.123E4, 0.123E2) = ~0.12423E4 / (~0.123E4, 0.123E2) = ~0.1E3 nextAfter (~0.123E4, 0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E2) = 0.7105427357601002E~13 * (~0.123E4, 0.3141592653589793E1) = ~0.38641589639154454E4 + (~0.123E4, 0.3141592653589793E1) = ~0.122685840734641E4 - (~0.123E4, 0.3141592653589793E1) = ~0.123314159265359E4 / (~0.123E4, 0.3141592653589793E1) = ~0.39152116000606253E3 nextAfter (~0.123E4, 0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.3141592653589793E1) = ~0.16372724463908916E1 * (~0.123E4, 0.2718281828459045E1) = ~0.33434866490046256E4 + (~0.123E4, 0.2718281828459045E1) = ~0.1227281718171541E4 - (~0.123E4, 0.2718281828459045E1) = ~0.1232718281828459E4 / (~0.123E4, 0.2718281828459045E1) = ~0.4524917126408741E3 nextAfter (~0.123E4, 0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.2718281828459045E1) = ~0.1336613536511619E1 * (~0.123E4, 0.123E1) = ~0.15129E4 + (~0.123E4, 0.123E1) = ~0.122877E4 - (~0.123E4, 0.123E1) = ~0.123123E4 / (~0.123E4, 0.123E1) = ~0.1E4 nextAfter (~0.123E4, 0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E1) = ~0.17763568394002505E~13 * (~0.123E4, 0.123) = ~0.15129E3 + (~0.123E4, 0.123) = ~0.1229877E4 - (~0.123E4, 0.123) = ~0.1230123E4 / (~0.123E4, 0.123) = ~0.1E5 nextAfter (~0.123E4, 0.123) = ~0.12299999999999998E4 rem (~0.123E4, 0.123) = ~0.17763568394002505E~13 * (~0.123E4, 0.123E~2) = ~0.15129E1 + (~0.123E4, 0.123E~2) = ~0.122999877E4 - (~0.123E4, 0.123E~2) = ~0.123000123E4 / (~0.123E4, 0.123E~2) = ~0.1E7 nextAfter (~0.123E4, 0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, 0.123E~2) = ~0.26423307986078726E~13 * (~0.123E4, 0.22250738585072014E~307) = ~0.27368408459638577E~304 + (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, 0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E4, 0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.22250738585072014E~307) = inf * (~0.123E4, 0.11125369292536007E~307) = ~0.13684204229819289E~304 + (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, 0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E4, 0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, 0.11125369292536007E~307) = inf * (~0.123E4, 0.5E~323) = ~0.6077E~320 + (~0.123E4, 0.5E~323) = ~0.123E4 - (~0.123E4, 0.5E~323) = ~0.123E4 / (~0.123E4, 0.5E~323) = ~inf nextAfter (~0.123E4, 0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, 0.5E~323) = inf * (~0.123E4, 0.0) = ~0.0 + (~0.123E4, 0.0) = ~0.123E4 - (~0.123E4, 0.0) = ~0.123E4 / (~0.123E4, 0.0) = ~inf nextAfter (~0.123E4, 0.0) = ~0.12299999999999998E4 rem (~0.123E4, 0.0) = nan * (~0.123E4, ~0.17976931348623157E309) = inf + (~0.123E4, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E4, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E4, ~0.17976931348623157E309) = 0.6842102114909646E~305 nextAfter (~0.123E4, ~0.17976931348623157E309) = ~0.12300000000000002E4 rem (~0.123E4, ~0.17976931348623157E309) = ~0.123E4 * (~0.123E4, ~0.8988465674311579E308) = inf + (~0.123E4, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E4, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E4, ~0.8988465674311579E308) = 0.1368420422981929E~304 nextAfter (~0.123E4, ~0.8988465674311579E308) = ~0.12300000000000002E4 rem (~0.123E4, ~0.8988465674311579E308) = ~0.123E4 * (~0.123E4, ~0.123E4) = 0.15129E7 + (~0.123E4, ~0.123E4) = ~0.246E4 - (~0.123E4, ~0.123E4) = 0.0 / (~0.123E4, ~0.123E4) = 0.1E1 nextAfter (~0.123E4, ~0.123E4) = ~0.123E4 rem (~0.123E4, ~0.123E4) = 0.0 * (~0.123E4, ~0.123E2) = 0.15129E5 + (~0.123E4, ~0.123E2) = ~0.12423E4 - (~0.123E4, ~0.123E2) = ~0.12177E4 / (~0.123E4, ~0.123E2) = 0.1E3 nextAfter (~0.123E4, ~0.123E2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E2) = 0.7105427357601002E~13 * (~0.123E4, ~0.3141592653589793E1) = 0.38641589639154454E4 + (~0.123E4, ~0.3141592653589793E1) = ~0.123314159265359E4 - (~0.123E4, ~0.3141592653589793E1) = ~0.122685840734641E4 / (~0.123E4, ~0.3141592653589793E1) = 0.39152116000606253E3 nextAfter (~0.123E4, ~0.3141592653589793E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.3141592653589793E1) = ~0.16372724463908916E1 * (~0.123E4, ~0.2718281828459045E1) = 0.33434866490046256E4 + (~0.123E4, ~0.2718281828459045E1) = ~0.1232718281828459E4 - (~0.123E4, ~0.2718281828459045E1) = ~0.1227281718171541E4 / (~0.123E4, ~0.2718281828459045E1) = 0.4524917126408741E3 nextAfter (~0.123E4, ~0.2718281828459045E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.2718281828459045E1) = ~0.1336613536511619E1 * (~0.123E4, ~0.123E1) = 0.15129E4 + (~0.123E4, ~0.123E1) = ~0.123123E4 - (~0.123E4, ~0.123E1) = ~0.122877E4 / (~0.123E4, ~0.123E1) = 0.1E4 nextAfter (~0.123E4, ~0.123E1) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E1) = ~0.17763568394002505E~13 * (~0.123E4, ~0.123) = 0.15129E3 + (~0.123E4, ~0.123) = ~0.1230123E4 - (~0.123E4, ~0.123) = ~0.1229877E4 / (~0.123E4, ~0.123) = 0.1E5 nextAfter (~0.123E4, ~0.123) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123) = ~0.17763568394002505E~13 * (~0.123E4, ~0.123E~2) = 0.15129E1 + (~0.123E4, ~0.123E~2) = ~0.123000123E4 - (~0.123E4, ~0.123E~2) = ~0.122999877E4 / (~0.123E4, ~0.123E~2) = 0.1E7 nextAfter (~0.123E4, ~0.123E~2) = ~0.12299999999999998E4 rem (~0.123E4, ~0.123E~2) = ~0.26423307986078726E~13 * (~0.123E4, ~0.22250738585072014E~307) = 0.27368408459638577E~304 + (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 - (~0.123E4, ~0.22250738585072014E~307) = ~0.123E4 / (~0.123E4, ~0.22250738585072014E~307) = inf nextAfter (~0.123E4, ~0.22250738585072014E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.22250738585072014E~307) = inf * (~0.123E4, ~0.11125369292536007E~307) = 0.13684204229819289E~304 + (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 - (~0.123E4, ~0.11125369292536007E~307) = ~0.123E4 / (~0.123E4, ~0.11125369292536007E~307) = inf nextAfter (~0.123E4, ~0.11125369292536007E~307) = ~0.12299999999999998E4 rem (~0.123E4, ~0.11125369292536007E~307) = inf * (~0.123E4, ~0.5E~323) = 0.6077E~320 + (~0.123E4, ~0.5E~323) = ~0.123E4 - (~0.123E4, ~0.5E~323) = ~0.123E4 / (~0.123E4, ~0.5E~323) = inf nextAfter (~0.123E4, ~0.5E~323) = ~0.12299999999999998E4 rem (~0.123E4, ~0.5E~323) = inf * (~0.123E4, ~0.0) = 0.0 + (~0.123E4, ~0.0) = ~0.123E4 - (~0.123E4, ~0.0) = ~0.123E4 / (~0.123E4, ~0.0) = inf nextAfter (~0.123E4, ~0.0) = ~0.12299999999999998E4 rem (~0.123E4, ~0.0) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E4, ~inf) = inf + (~0.123E4, ~inf) = ~inf - (~0.123E4, ~inf) = inf / (~0.123E4, ~inf) = 0.0 nextAfter (~0.123E4, ~inf) = ~0.12300000000000002E4 rem (~0.123E4, ~inf) = ~0.123E4 * (~0.123E4, nan) = nan + (~0.123E4, nan) = nan - (~0.123E4, nan) = nan / (~0.123E4, nan) = nan nextAfter (~0.123E4, nan) = nan rem (~0.123E4, nan) = nan * (~0.123E4, inf) = ~inf + (~0.123E4, inf) = inf - (~0.123E4, inf) = ~inf / (~0.123E4, inf) = ~0.0 nextAfter (~0.123E4, inf) = ~0.12299999999999998E4 rem (~0.123E4, inf) = ~0.123E4 * (~0.123E2, 0.17976931348623157E309) = ~inf + (~0.123E2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E2, 0.17976931348623157E309) = ~0.6842102114909646E~307 nextAfter (~0.123E2, 0.17976931348623157E309) = ~0.12299999999999999E2 rem (~0.123E2, 0.17976931348623157E309) = ~0.123E2 * (~0.123E2, 0.8988465674311579E308) = ~inf + (~0.123E2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E2, 0.8988465674311579E308) = ~0.13684204229819291E~306 nextAfter (~0.123E2, 0.8988465674311579E308) = ~0.12299999999999999E2 rem (~0.123E2, 0.8988465674311579E308) = ~0.123E2 * (~0.123E2, 0.123E4) = ~0.15129E5 + (~0.123E2, 0.123E4) = 0.12177E4 - (~0.123E2, 0.123E4) = ~0.12423E4 / (~0.123E2, 0.123E4) = ~0.1E~1 nextAfter (~0.123E2, 0.123E4) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E4) = ~0.123E2 * (~0.123E2, 0.123E2) = ~0.15129000000000002E3 + (~0.123E2, 0.123E2) = 0.0 - (~0.123E2, 0.123E2) = ~0.246E2 / (~0.123E2, 0.123E2) = ~0.1E1 nextAfter (~0.123E2, 0.123E2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E2) = 0.0 * (~0.123E2, 0.3141592653589793E1) = ~0.3864158963915446E2 + (~0.123E2, 0.3141592653589793E1) = ~0.9158407346410208E1 - (~0.123E2, 0.3141592653589793E1) = ~0.15441592653589794E2 / (~0.123E2, 0.3141592653589793E1) = ~0.3915211600060626E1 nextAfter (~0.123E2, 0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, 0.2718281828459045E1) = ~0.33434866490046254E2 + (~0.123E2, 0.2718281828459045E1) = ~0.9581718171540956E1 - (~0.123E2, 0.2718281828459045E1) = ~0.15018281828459045E2 / (~0.123E2, 0.2718281828459045E1) = ~0.4524917126408741E1 nextAfter (~0.123E2, 0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, 0.123E1) = ~0.15129000000000001E2 + (~0.123E2, 0.123E1) = ~0.1107E2 - (~0.123E2, 0.123E1) = ~0.13530000000000001E2 / (~0.123E2, 0.123E1) = ~0.1E2 nextAfter (~0.123E2, 0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E1) = ~0.8881784197001252E~15 * (~0.123E2, 0.123) = ~0.15129000000000001E1 + (~0.123E2, 0.123) = ~0.12177000000000001E2 - (~0.123E2, 0.123) = ~0.12423E2 / (~0.123E2, 0.123) = ~0.10000000000000001E3 nextAfter (~0.123E2, 0.123) = ~0.12299999999999999E2 rem (~0.123E2, 0.123) = ~0.8881784197001252E~15 * (~0.123E2, 0.123E~2) = ~0.15129E~1 + (~0.123E2, 0.123E~2) = ~0.12298770000000001E2 - (~0.123E2, 0.123E~2) = ~0.1230123E2 / (~0.123E2, 0.123E~2) = ~0.1E5 nextAfter (~0.123E2, 0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, 0.123E~2) = ~0.9749145934989656E~15 * (~0.123E2, 0.22250738585072014E~307) = ~0.2736840845963858E~306 + (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, 0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, 0.22250738585072014E~307) = ~inf nextAfter (~0.123E2, 0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.22250738585072014E~307) = inf * (~0.123E2, 0.11125369292536007E~307) = ~0.1368420422981929E~306 + (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, 0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, 0.11125369292536007E~307) = ~inf nextAfter (~0.123E2, 0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, 0.11125369292536007E~307) = inf * (~0.123E2, 0.5E~323) = ~0.6E~322 + (~0.123E2, 0.5E~323) = ~0.123E2 - (~0.123E2, 0.5E~323) = ~0.123E2 / (~0.123E2, 0.5E~323) = ~inf nextAfter (~0.123E2, 0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, 0.5E~323) = inf * (~0.123E2, 0.0) = ~0.0 + (~0.123E2, 0.0) = ~0.123E2 - (~0.123E2, 0.0) = ~0.123E2 / (~0.123E2, 0.0) = ~inf nextAfter (~0.123E2, 0.0) = ~0.12299999999999999E2 rem (~0.123E2, 0.0) = nan * (~0.123E2, ~0.17976931348623157E309) = inf + (~0.123E2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E2, ~0.17976931348623157E309) = 0.6842102114909646E~307 nextAfter (~0.123E2, ~0.17976931348623157E309) = ~0.12300000000000002E2 rem (~0.123E2, ~0.17976931348623157E309) = ~0.123E2 * (~0.123E2, ~0.8988465674311579E308) = inf + (~0.123E2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E2, ~0.8988465674311579E308) = 0.13684204229819291E~306 nextAfter (~0.123E2, ~0.8988465674311579E308) = ~0.12300000000000002E2 rem (~0.123E2, ~0.8988465674311579E308) = ~0.123E2 * (~0.123E2, ~0.123E4) = 0.15129E5 + (~0.123E2, ~0.123E4) = ~0.12423E4 - (~0.123E2, ~0.123E4) = 0.12177E4 / (~0.123E2, ~0.123E4) = 0.1E~1 nextAfter (~0.123E2, ~0.123E4) = ~0.12300000000000002E2 rem (~0.123E2, ~0.123E4) = ~0.123E2 * (~0.123E2, ~0.123E2) = 0.15129000000000002E3 + (~0.123E2, ~0.123E2) = ~0.246E2 - (~0.123E2, ~0.123E2) = 0.0 / (~0.123E2, ~0.123E2) = 0.1E1 nextAfter (~0.123E2, ~0.123E2) = ~0.123E2 rem (~0.123E2, ~0.123E2) = 0.0 * (~0.123E2, ~0.3141592653589793E1) = 0.3864158963915446E2 + (~0.123E2, ~0.3141592653589793E1) = ~0.15441592653589794E2 - (~0.123E2, ~0.3141592653589793E1) = ~0.9158407346410208E1 / (~0.123E2, ~0.3141592653589793E1) = 0.3915211600060626E1 nextAfter (~0.123E2, ~0.3141592653589793E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.3141592653589793E1) = ~0.28752220392306214E1 * (~0.123E2, ~0.2718281828459045E1) = 0.33434866490046254E2 + (~0.123E2, ~0.2718281828459045E1) = ~0.15018281828459045E2 - (~0.123E2, ~0.2718281828459045E1) = ~0.9581718171540956E1 / (~0.123E2, ~0.2718281828459045E1) = 0.4524917126408741E1 nextAfter (~0.123E2, ~0.2718281828459045E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.2718281828459045E1) = ~0.14268726861638203E1 * (~0.123E2, ~0.123E1) = 0.15129000000000001E2 + (~0.123E2, ~0.123E1) = ~0.13530000000000001E2 - (~0.123E2, ~0.123E1) = ~0.1107E2 / (~0.123E2, ~0.123E1) = 0.1E2 nextAfter (~0.123E2, ~0.123E1) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E1) = ~0.8881784197001252E~15 * (~0.123E2, ~0.123) = 0.15129000000000001E1 + (~0.123E2, ~0.123) = ~0.12423E2 - (~0.123E2, ~0.123) = ~0.12177000000000001E2 / (~0.123E2, ~0.123) = 0.10000000000000001E3 nextAfter (~0.123E2, ~0.123) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123) = ~0.8881784197001252E~15 * (~0.123E2, ~0.123E~2) = 0.15129E~1 + (~0.123E2, ~0.123E~2) = ~0.1230123E2 - (~0.123E2, ~0.123E~2) = ~0.12298770000000001E2 / (~0.123E2, ~0.123E~2) = 0.1E5 nextAfter (~0.123E2, ~0.123E~2) = ~0.12299999999999999E2 rem (~0.123E2, ~0.123E~2) = ~0.9749145934989656E~15 * (~0.123E2, ~0.22250738585072014E~307) = 0.2736840845963858E~306 + (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 - (~0.123E2, ~0.22250738585072014E~307) = ~0.123E2 / (~0.123E2, ~0.22250738585072014E~307) = inf nextAfter (~0.123E2, ~0.22250738585072014E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.22250738585072014E~307) = inf * (~0.123E2, ~0.11125369292536007E~307) = 0.1368420422981929E~306 + (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 - (~0.123E2, ~0.11125369292536007E~307) = ~0.123E2 / (~0.123E2, ~0.11125369292536007E~307) = inf nextAfter (~0.123E2, ~0.11125369292536007E~307) = ~0.12299999999999999E2 rem (~0.123E2, ~0.11125369292536007E~307) = inf * (~0.123E2, ~0.5E~323) = 0.6E~322 + (~0.123E2, ~0.5E~323) = ~0.123E2 - (~0.123E2, ~0.5E~323) = ~0.123E2 / (~0.123E2, ~0.5E~323) = inf nextAfter (~0.123E2, ~0.5E~323) = ~0.12299999999999999E2 rem (~0.123E2, ~0.5E~323) = inf * (~0.123E2, ~0.0) = 0.0 + (~0.123E2, ~0.0) = ~0.123E2 - (~0.123E2, ~0.0) = ~0.123E2 / (~0.123E2, ~0.0) = inf nextAfter (~0.123E2, ~0.0) = ~0.12299999999999999E2 rem (~0.123E2, ~0.0) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.123E2, ~inf) = inf + (~0.123E2, ~inf) = ~inf - (~0.123E2, ~inf) = inf / (~0.123E2, ~inf) = 0.0 nextAfter (~0.123E2, ~inf) = ~0.12300000000000002E2 rem (~0.123E2, ~inf) = ~0.123E2 * (~0.123E2, nan) = nan + (~0.123E2, nan) = nan - (~0.123E2, nan) = nan / (~0.123E2, nan) = nan nextAfter (~0.123E2, nan) = nan rem (~0.123E2, nan) = nan * (~0.123E2, inf) = ~inf + (~0.123E2, inf) = inf - (~0.123E2, inf) = ~inf / (~0.123E2, inf) = ~0.0 nextAfter (~0.123E2, inf) = ~0.12299999999999999E2 rem (~0.123E2, inf) = ~0.123E2 * (~0.3141592653589793E1, 0.17976931348623157E309) = ~inf + (~0.3141592653589793E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.8988465674311579E308) = ~inf + (~0.3141592653589793E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.349513784379046E~307 nextAfter (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E4) = ~0.38641589639154454E4 + (~0.3141592653589793E1, 0.123E4) = 0.122685840734641E4 - (~0.3141592653589793E1, 0.123E4) = ~0.123314159265359E4 / (~0.3141592653589793E1, 0.123E4) = ~0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, 0.123E4) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.123E2) = ~0.3864158963915446E2 + (~0.3141592653589793E1, 0.123E2) = 0.9158407346410208E1 - (~0.3141592653589793E1, 0.123E2) = ~0.15441592653589794E2 / (~0.3141592653589793E1, 0.123E2) = ~0.2554140368772189 nextAfter (~0.3141592653589793E1, 0.123E2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.9869604401089358E1 + (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 - (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.6283185307179586E1 / (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.1E1 nextAfter (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8539734222673566E1 + (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 - (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.5859874482048838E1 / (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.11557273497909217E1 nextAfter (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, 0.123E1) = ~0.38641589639154454E1 + (~0.3141592653589793E1, 0.123E1) = ~0.19115926535897931E1 - (~0.3141592653589793E1, 0.123E1) = ~0.43715926535897935E1 / (~0.3141592653589793E1, 0.123E1) = ~0.25541403687721895E1 nextAfter (~0.3141592653589793E1, 0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, 0.123) = ~0.38641589639154456 + (~0.3141592653589793E1, 0.123) = ~0.3018592653589793E1 - (~0.3141592653589793E1, 0.123) = ~0.32645926535897933E1 / (~0.3141592653589793E1, 0.123) = ~0.25541403687721896E2 nextAfter (~0.3141592653589793E1, 0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123) = ~0.6659265358979316E~1 * (~0.3141592653589793E1, 0.123E~2) = ~0.38641589639154456E~2 + (~0.3141592653589793E1, 0.123E~2) = ~0.3140362653589793E1 - (~0.3141592653589793E1, 0.123E~2) = ~0.3142822653589793E1 / (~0.3141592653589793E1, 0.123E~2) = ~0.25541403687721895E4 nextAfter (~0.3141592653589793E1, 0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.123E~2) = ~0.17265358979318352E~3 * (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.6990275687580919E~307 + (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.14119048864730642E309 nextAfter (~0.3141592653589793E1, 0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.34951378437904593E~307 + (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.3141592653589793E1, 0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.11125369292536007E~307) = inf * (~0.3141592653589793E1, 0.5E~323) = ~0.15E~322 + (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.5E~323) = ~inf nextAfter (~0.3141592653589793E1, 0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.5E~323) = inf * (~0.3141592653589793E1, 0.0) = ~0.0 + (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, 0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, 0.0) = ~inf nextAfter (~0.3141592653589793E1, 0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, 0.0) = nan * (~0.3141592653589793E1, ~0.17976931348623157E309) = inf + (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.3141592653589793E1, ~0.17976931348623157E309) = 0.17475689218952297E~307 nextAfter (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.17976931348623157E309) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.8988465674311579E308) = inf + (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.3141592653589793E1, ~0.8988465674311579E308) = 0.349513784379046E~307 nextAfter (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.8988465674311579E308) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E4) = 0.38641589639154454E4 + (~0.3141592653589793E1, ~0.123E4) = ~0.123314159265359E4 - (~0.3141592653589793E1, ~0.123E4) = 0.122685840734641E4 / (~0.3141592653589793E1, ~0.123E4) = 0.25541403687721893E~2 nextAfter (~0.3141592653589793E1, ~0.123E4) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E4) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.123E2) = 0.3864158963915446E2 + (~0.3141592653589793E1, ~0.123E2) = ~0.15441592653589794E2 - (~0.3141592653589793E1, ~0.123E2) = 0.9158407346410208E1 / (~0.3141592653589793E1, ~0.123E2) = 0.2554140368772189 nextAfter (~0.3141592653589793E1, ~0.123E2) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~0.123E2) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.9869604401089358E1 + (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.6283185307179586E1 - (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 / (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.1E1 nextAfter (~0.3141592653589793E1, ~0.3141592653589793E1) = ~0.3141592653589793E1 rem (~0.3141592653589793E1, ~0.3141592653589793E1) = 0.0 * (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.8539734222673566E1 + (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.5859874482048838E1 - (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 / (~0.3141592653589793E1, ~0.2718281828459045E1) = 0.11557273497909217E1 nextAfter (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.2718281828459045E1) = ~0.423310825130748 * (~0.3141592653589793E1, ~0.123E1) = 0.38641589639154454E1 + (~0.3141592653589793E1, ~0.123E1) = ~0.43715926535897935E1 - (~0.3141592653589793E1, ~0.123E1) = ~0.19115926535897931E1 / (~0.3141592653589793E1, ~0.123E1) = 0.25541403687721895E1 nextAfter (~0.3141592653589793E1, ~0.123E1) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E1) = ~0.6815926535897932 * (~0.3141592653589793E1, ~0.123) = 0.38641589639154456 + (~0.3141592653589793E1, ~0.123) = ~0.32645926535897933E1 - (~0.3141592653589793E1, ~0.123) = ~0.3018592653589793E1 / (~0.3141592653589793E1, ~0.123) = 0.25541403687721896E2 nextAfter (~0.3141592653589793E1, ~0.123) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123) = ~0.6659265358979316E~1 * (~0.3141592653589793E1, ~0.123E~2) = 0.38641589639154456E~2 + (~0.3141592653589793E1, ~0.123E~2) = ~0.3142822653589793E1 - (~0.3141592653589793E1, ~0.123E~2) = ~0.3140362653589793E1 / (~0.3141592653589793E1, ~0.123E~2) = 0.25541403687721895E4 nextAfter (~0.3141592653589793E1, ~0.123E~2) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.123E~2) = ~0.17265358979318352E~3 * (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.6990275687580919E~307 + (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.14119048864730642E309 nextAfter (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.22250738585072014E~307) = 0.0 * (~0.3141592653589793E1, ~0.11125369292536007E~307) = 0.34951378437904593E~307 + (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf nextAfter (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.11125369292536007E~307) = inf * (~0.3141592653589793E1, ~0.5E~323) = 0.15E~322 + (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.5E~323) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.5E~323) = inf nextAfter (~0.3141592653589793E1, ~0.5E~323) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.5E~323) = inf * (~0.3141592653589793E1, ~0.0) = 0.0 + (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 - (~0.3141592653589793E1, ~0.0) = ~0.3141592653589793E1 / (~0.3141592653589793E1, ~0.0) = inf nextAfter (~0.3141592653589793E1, ~0.0) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, ~0.0) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, ~inf) = inf + (~0.3141592653589793E1, ~inf) = ~inf - (~0.3141592653589793E1, ~inf) = inf / (~0.3141592653589793E1, ~inf) = 0.0 nextAfter (~0.3141592653589793E1, ~inf) = ~0.31415926535897936E1 rem (~0.3141592653589793E1, ~inf) = ~0.3141592653589793E1 * (~0.3141592653589793E1, nan) = nan + (~0.3141592653589793E1, nan) = nan - (~0.3141592653589793E1, nan) = nan / (~0.3141592653589793E1, nan) = nan nextAfter (~0.3141592653589793E1, nan) = nan rem (~0.3141592653589793E1, nan) = nan * (~0.3141592653589793E1, inf) = ~inf + (~0.3141592653589793E1, inf) = inf - (~0.3141592653589793E1, inf) = ~inf / (~0.3141592653589793E1, inf) = ~0.0 nextAfter (~0.3141592653589793E1, inf) = ~0.31415926535897927E1 rem (~0.3141592653589793E1, inf) = ~0.3141592653589793E1 * (~0.2718281828459045E1, 0.17976931348623157E309) = ~inf + (~0.2718281828459045E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.8988465674311579E308) = ~inf + (~0.2718281828459045E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E4) = ~0.33434866490046256E4 + (~0.2718281828459045E1, 0.123E4) = 0.1227281718171541E4 - (~0.2718281828459045E1, 0.123E4) = ~0.1232718281828459E4 / (~0.2718281828459045E1, 0.123E4) = ~0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, 0.123E4) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.123E2) = ~0.33434866490046254E2 + (~0.2718281828459045E1, 0.123E2) = 0.9581718171540956E1 - (~0.2718281828459045E1, 0.123E2) = ~0.15018281828459045E2 / (~0.2718281828459045E1, 0.123E2) = ~0.22099852263894673 nextAfter (~0.2718281828459045E1, 0.123E2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8539734222673566E1 + (~0.2718281828459045E1, 0.3141592653589793E1) = 0.423310825130748 - (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.5859874482048838E1 / (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.8652559794322651 nextAfter (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.73890560989306495E1 + (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 - (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.543656365691809E1 / (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.1E1 nextAfter (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, 0.123E1) = ~0.33434866490046256E1 + (~0.2718281828459045E1, 0.123E1) = ~0.1488281828459045E1 - (~0.2718281828459045E1, 0.123E1) = ~0.3948281828459045E1 / (~0.2718281828459045E1, 0.123E1) = ~0.22099852263894677E1 nextAfter (~0.2718281828459045E1, 0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, 0.123) = ~0.33434866490046256 + (~0.2718281828459045E1, 0.123) = ~0.25952818284590453E1 - (~0.2718281828459045E1, 0.123) = ~0.2841281828459045E1 / (~0.2718281828459045E1, 0.123) = ~0.22099852263894675E2 nextAfter (~0.2718281828459045E1, 0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, 0.123E~2) = ~0.33434866490046253E~2 + (~0.2718281828459045E1, 0.123E~2) = ~0.2717051828459045E1 - (~0.2718281828459045E1, 0.123E~2) = ~0.2719511828459045E1 / (~0.2718281828459045E1, 0.123E~2) = ~0.22099852263894677E4 nextAfter (~0.2718281828459045E1, 0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.123E~2) = ~0.12118284590451492E~2 * (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.6048377836559378E~307 + (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.12216591454104522E309 nextAfter (~0.2718281828459045E1, 0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.3024188918279689E~307 + (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.11125369292536007E~307) = ~inf nextAfter (~0.2718281828459045E1, 0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.11125369292536007E~307) = inf * (~0.2718281828459045E1, 0.5E~323) = ~0.15E~322 + (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.5E~323) = ~inf nextAfter (~0.2718281828459045E1, 0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.5E~323) = inf * (~0.2718281828459045E1, 0.0) = ~0.0 + (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, 0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, 0.0) = ~inf nextAfter (~0.2718281828459045E1, 0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, 0.0) = nan * (~0.2718281828459045E1, ~0.17976931348623157E309) = inf + (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.2718281828459045E1, ~0.17976931348623157E309) = 0.15120944591398447E~307 nextAfter (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.17976931348623157E309) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.8988465674311579E308) = inf + (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.2718281828459045E1, ~0.8988465674311579E308) = 0.30241889182796895E~307 nextAfter (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.8988465674311579E308) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E4) = 0.33434866490046256E4 + (~0.2718281828459045E1, ~0.123E4) = ~0.1232718281828459E4 - (~0.2718281828459045E1, ~0.123E4) = 0.1227281718171541E4 / (~0.2718281828459045E1, ~0.123E4) = 0.22099852263894678E~2 nextAfter (~0.2718281828459045E1, ~0.123E4) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E4) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.123E2) = 0.33434866490046254E2 + (~0.2718281828459045E1, ~0.123E2) = ~0.15018281828459045E2 - (~0.2718281828459045E1, ~0.123E2) = 0.9581718171540956E1 / (~0.2718281828459045E1, ~0.123E2) = 0.22099852263894673 nextAfter (~0.2718281828459045E1, ~0.123E2) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.123E2) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8539734222673566E1 + (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.5859874482048838E1 - (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.423310825130748 / (~0.2718281828459045E1, ~0.3141592653589793E1) = 0.8652559794322651 nextAfter (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~0.3141592653589793E1) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.73890560989306495E1 + (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.543656365691809E1 - (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 / (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.1E1 nextAfter (~0.2718281828459045E1, ~0.2718281828459045E1) = ~0.2718281828459045E1 rem (~0.2718281828459045E1, ~0.2718281828459045E1) = 0.0 * (~0.2718281828459045E1, ~0.123E1) = 0.33434866490046256E1 + (~0.2718281828459045E1, ~0.123E1) = ~0.3948281828459045E1 - (~0.2718281828459045E1, ~0.123E1) = ~0.1488281828459045E1 / (~0.2718281828459045E1, ~0.123E1) = 0.22099852263894677E1 nextAfter (~0.2718281828459045E1, ~0.123E1) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E1) = ~0.2582818284590451 * (~0.2718281828459045E1, ~0.123) = 0.33434866490046256 + (~0.2718281828459045E1, ~0.123) = ~0.2841281828459045E1 - (~0.2718281828459045E1, ~0.123) = ~0.25952818284590453E1 / (~0.2718281828459045E1, ~0.123) = 0.22099852263894675E2 nextAfter (~0.2718281828459045E1, ~0.123) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123) = ~0.1228182845904513E~1 * (~0.2718281828459045E1, ~0.123E~2) = 0.33434866490046253E~2 + (~0.2718281828459045E1, ~0.123E~2) = ~0.2719511828459045E1 - (~0.2718281828459045E1, ~0.123E~2) = ~0.2717051828459045E1 / (~0.2718281828459045E1, ~0.123E~2) = 0.22099852263894677E4 nextAfter (~0.2718281828459045E1, ~0.123E~2) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.123E~2) = ~0.12118284590451492E~2 * (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.6048377836559378E~307 + (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.12216591454104522E309 nextAfter (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.22250738585072014E~307) = 0.0 * (~0.2718281828459045E1, ~0.11125369292536007E~307) = 0.3024188918279689E~307 + (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf nextAfter (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.11125369292536007E~307) = inf * (~0.2718281828459045E1, ~0.5E~323) = 0.15E~322 + (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.5E~323) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.5E~323) = inf nextAfter (~0.2718281828459045E1, ~0.5E~323) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.5E~323) = inf * (~0.2718281828459045E1, ~0.0) = 0.0 + (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 - (~0.2718281828459045E1, ~0.0) = ~0.2718281828459045E1 / (~0.2718281828459045E1, ~0.0) = inf nextAfter (~0.2718281828459045E1, ~0.0) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, ~0.0) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, ~inf) = inf + (~0.2718281828459045E1, ~inf) = ~inf - (~0.2718281828459045E1, ~inf) = inf / (~0.2718281828459045E1, ~inf) = 0.0 nextAfter (~0.2718281828459045E1, ~inf) = ~0.27182818284590455E1 rem (~0.2718281828459045E1, ~inf) = ~0.2718281828459045E1 * (~0.2718281828459045E1, nan) = nan + (~0.2718281828459045E1, nan) = nan - (~0.2718281828459045E1, nan) = nan / (~0.2718281828459045E1, nan) = nan nextAfter (~0.2718281828459045E1, nan) = nan rem (~0.2718281828459045E1, nan) = nan * (~0.2718281828459045E1, inf) = ~inf + (~0.2718281828459045E1, inf) = inf - (~0.2718281828459045E1, inf) = ~inf / (~0.2718281828459045E1, inf) = ~0.0 nextAfter (~0.2718281828459045E1, inf) = ~0.27182818284590446E1 rem (~0.2718281828459045E1, inf) = ~0.2718281828459045E1 * (~0.123E1, 0.17976931348623157E309) = ~inf + (~0.123E1, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E1, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E1, 0.17976931348623157E309) = ~0.6842102114909647E~308 nextAfter (~0.123E1, 0.17976931348623157E309) = ~0.12299999999999998E1 rem (~0.123E1, 0.17976931348623157E309) = ~0.123E1 * (~0.123E1, 0.8988465674311579E308) = ~0.1105581277940324E309 + (~0.123E1, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E1, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E1, 0.8988465674311579E308) = ~0.1368420422981929E~307 nextAfter (~0.123E1, 0.8988465674311579E308) = ~0.12299999999999998E1 rem (~0.123E1, 0.8988465674311579E308) = ~0.123E1 * (~0.123E1, 0.123E4) = ~0.15129E4 + (~0.123E1, 0.123E4) = 0.122877E4 - (~0.123E1, 0.123E4) = ~0.123123E4 / (~0.123E1, 0.123E4) = ~0.1E~2 nextAfter (~0.123E1, 0.123E4) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E4) = ~0.123E1 * (~0.123E1, 0.123E2) = ~0.15129000000000001E2 + (~0.123E1, 0.123E2) = 0.1107E2 - (~0.123E1, 0.123E2) = ~0.13530000000000001E2 / (~0.123E1, 0.123E2) = ~0.9999999999999999E~1 nextAfter (~0.123E1, 0.123E2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E2) = ~0.123E1 * (~0.123E1, 0.3141592653589793E1) = ~0.38641589639154454E1 + (~0.123E1, 0.3141592653589793E1) = 0.19115926535897931E1 - (~0.123E1, 0.3141592653589793E1) = ~0.43715926535897935E1 / (~0.123E1, 0.3141592653589793E1) = ~0.3915211600060625 nextAfter (~0.123E1, 0.3141592653589793E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.3141592653589793E1) = ~0.123E1 * (~0.123E1, 0.2718281828459045E1) = ~0.33434866490046256E1 + (~0.123E1, 0.2718281828459045E1) = 0.1488281828459045E1 - (~0.123E1, 0.2718281828459045E1) = ~0.3948281828459045E1 / (~0.123E1, 0.2718281828459045E1) = ~0.45249171264087407 nextAfter (~0.123E1, 0.2718281828459045E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.2718281828459045E1) = ~0.123E1 * (~0.123E1, 0.123E1) = ~0.15129E1 + (~0.123E1, 0.123E1) = 0.0 - (~0.123E1, 0.123E1) = ~0.246E1 / (~0.123E1, 0.123E1) = ~0.1E1 nextAfter (~0.123E1, 0.123E1) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E1) = 0.0 * (~0.123E1, 0.123) = ~0.15129 + (~0.123E1, 0.123) = ~0.1107E1 - (~0.123E1, 0.123) = ~0.1353E1 / (~0.123E1, 0.123) = ~0.1E2 nextAfter (~0.123E1, 0.123) = ~0.12299999999999998E1 rem (~0.123E1, 0.123) = 0.0 * (~0.123E1, 0.123E~2) = ~0.15129E~2 + (~0.123E1, 0.123E~2) = ~0.122877E1 - (~0.123E1, 0.123E~2) = ~0.123123E1 / (~0.123E1, 0.123E~2) = ~0.1E4 nextAfter (~0.123E1, 0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, 0.123E~2) = ~0.8673617379884035E~17 * (~0.123E1, 0.22250738585072014E~307) = ~0.27368408459638577E~307 + (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, 0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, 0.22250738585072014E~307) = ~0.5527906389701621E308 nextAfter (~0.123E1, 0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.22250738585072014E~307) = 0.0 * (~0.123E1, 0.11125369292536007E~307) = ~0.1368420422981929E~307 + (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, 0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, 0.11125369292536007E~307) = ~0.11055812779403243E309 nextAfter (~0.123E1, 0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, 0.11125369292536007E~307) = 0.0 * (~0.123E1, 0.5E~323) = ~0.5E~323 + (~0.123E1, 0.5E~323) = ~0.123E1 - (~0.123E1, 0.5E~323) = ~0.123E1 / (~0.123E1, 0.5E~323) = ~inf nextAfter (~0.123E1, 0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, 0.5E~323) = inf * (~0.123E1, 0.0) = ~0.0 + (~0.123E1, 0.0) = ~0.123E1 - (~0.123E1, 0.0) = ~0.123E1 / (~0.123E1, 0.0) = ~inf nextAfter (~0.123E1, 0.0) = ~0.12299999999999998E1 rem (~0.123E1, 0.0) = nan * (~0.123E1, ~0.17976931348623157E309) = inf + (~0.123E1, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E1, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E1, ~0.17976931348623157E309) = 0.6842102114909647E~308 nextAfter (~0.123E1, ~0.17976931348623157E309) = ~0.12300000000000002E1 rem (~0.123E1, ~0.17976931348623157E309) = ~0.123E1 * (~0.123E1, ~0.8988465674311579E308) = 0.1105581277940324E309 + (~0.123E1, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E1, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E1, ~0.8988465674311579E308) = 0.1368420422981929E~307 nextAfter (~0.123E1, ~0.8988465674311579E308) = ~0.12300000000000002E1 rem (~0.123E1, ~0.8988465674311579E308) = ~0.123E1 * (~0.123E1, ~0.123E4) = 0.15129E4 + (~0.123E1, ~0.123E4) = ~0.123123E4 - (~0.123E1, ~0.123E4) = 0.122877E4 / (~0.123E1, ~0.123E4) = 0.1E~2 nextAfter (~0.123E1, ~0.123E4) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E4) = ~0.123E1 * (~0.123E1, ~0.123E2) = 0.15129000000000001E2 + (~0.123E1, ~0.123E2) = ~0.13530000000000001E2 - (~0.123E1, ~0.123E2) = 0.1107E2 / (~0.123E1, ~0.123E2) = 0.9999999999999999E~1 nextAfter (~0.123E1, ~0.123E2) = ~0.12300000000000002E1 rem (~0.123E1, ~0.123E2) = ~0.123E1 * (~0.123E1, ~0.3141592653589793E1) = 0.38641589639154454E1 + (~0.123E1, ~0.3141592653589793E1) = ~0.43715926535897935E1 - (~0.123E1, ~0.3141592653589793E1) = 0.19115926535897931E1 / (~0.123E1, ~0.3141592653589793E1) = 0.3915211600060625 nextAfter (~0.123E1, ~0.3141592653589793E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.3141592653589793E1) = ~0.123E1 * (~0.123E1, ~0.2718281828459045E1) = 0.33434866490046256E1 + (~0.123E1, ~0.2718281828459045E1) = ~0.3948281828459045E1 - (~0.123E1, ~0.2718281828459045E1) = 0.1488281828459045E1 / (~0.123E1, ~0.2718281828459045E1) = 0.45249171264087407 nextAfter (~0.123E1, ~0.2718281828459045E1) = ~0.12300000000000002E1 rem (~0.123E1, ~0.2718281828459045E1) = ~0.123E1 * (~0.123E1, ~0.123E1) = 0.15129E1 + (~0.123E1, ~0.123E1) = ~0.246E1 - (~0.123E1, ~0.123E1) = 0.0 / (~0.123E1, ~0.123E1) = 0.1E1 nextAfter (~0.123E1, ~0.123E1) = ~0.123E1 rem (~0.123E1, ~0.123E1) = 0.0 * (~0.123E1, ~0.123) = 0.15129 + (~0.123E1, ~0.123) = ~0.1353E1 - (~0.123E1, ~0.123) = ~0.1107E1 / (~0.123E1, ~0.123) = 0.1E2 nextAfter (~0.123E1, ~0.123) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123) = 0.0 * (~0.123E1, ~0.123E~2) = 0.15129E~2 + (~0.123E1, ~0.123E~2) = ~0.123123E1 - (~0.123E1, ~0.123E~2) = ~0.122877E1 / (~0.123E1, ~0.123E~2) = 0.1E4 nextAfter (~0.123E1, ~0.123E~2) = ~0.12299999999999998E1 rem (~0.123E1, ~0.123E~2) = ~0.8673617379884035E~17 * (~0.123E1, ~0.22250738585072014E~307) = 0.27368408459638577E~307 + (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 - (~0.123E1, ~0.22250738585072014E~307) = ~0.123E1 / (~0.123E1, ~0.22250738585072014E~307) = 0.5527906389701621E308 nextAfter (~0.123E1, ~0.22250738585072014E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.22250738585072014E~307) = 0.0 * (~0.123E1, ~0.11125369292536007E~307) = 0.1368420422981929E~307 + (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 - (~0.123E1, ~0.11125369292536007E~307) = ~0.123E1 / (~0.123E1, ~0.11125369292536007E~307) = 0.11055812779403243E309 nextAfter (~0.123E1, ~0.11125369292536007E~307) = ~0.12299999999999998E1 rem (~0.123E1, ~0.11125369292536007E~307) = 0.0 * (~0.123E1, ~0.5E~323) = 0.5E~323 + (~0.123E1, ~0.5E~323) = ~0.123E1 - (~0.123E1, ~0.5E~323) = ~0.123E1 / (~0.123E1, ~0.5E~323) = inf nextAfter (~0.123E1, ~0.5E~323) = ~0.12299999999999998E1 rem (~0.123E1, ~0.5E~323) = inf * (~0.123E1, ~0.0) = 0.0 + (~0.123E1, ~0.0) = ~0.123E1 - (~0.123E1, ~0.0) = ~0.123E1 / (~0.123E1, ~0.0) = inf nextAfter (~0.123E1, ~0.0) = ~0.12299999999999998E1 rem (~0.123E1, ~0.0) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123E1, ~inf) = inf + (~0.123E1, ~inf) = ~inf - (~0.123E1, ~inf) = inf / (~0.123E1, ~inf) = 0.0 nextAfter (~0.123E1, ~inf) = ~0.12300000000000002E1 rem (~0.123E1, ~inf) = ~0.123E1 * (~0.123E1, nan) = nan + (~0.123E1, nan) = nan - (~0.123E1, nan) = nan / (~0.123E1, nan) = nan nextAfter (~0.123E1, nan) = nan rem (~0.123E1, nan) = nan * (~0.123E1, inf) = ~inf + (~0.123E1, inf) = inf - (~0.123E1, inf) = ~inf / (~0.123E1, inf) = ~0.0 nextAfter (~0.123E1, inf) = ~0.12299999999999998E1 rem (~0.123E1, inf) = ~0.123E1 * (~0.123, 0.17976931348623157E309) = ~0.22111625558806483E308 + (~0.123, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123, 0.17976931348623157E309) = ~0.684210211490966E~309 nextAfter (~0.123, 0.17976931348623157E309) = ~0.12299999999999998 rem (~0.123, 0.17976931348623157E309) = ~0.123 * (~0.123, 0.8988465674311579E308) = ~0.11055812779403241E308 + (~0.123, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123, 0.8988465674311579E308) = ~0.136842042298193E~308 nextAfter (~0.123, 0.8988465674311579E308) = ~0.12299999999999998 rem (~0.123, 0.8988465674311579E308) = ~0.123 * (~0.123, 0.123E4) = ~0.15129E3 + (~0.123, 0.123E4) = 0.1229877E4 - (~0.123, 0.123E4) = ~0.1230123E4 / (~0.123, 0.123E4) = ~0.1E~3 nextAfter (~0.123, 0.123E4) = ~0.12299999999999998 rem (~0.123, 0.123E4) = ~0.123 * (~0.123, 0.123E2) = ~0.15129000000000001E1 + (~0.123, 0.123E2) = 0.12177000000000001E2 - (~0.123, 0.123E2) = ~0.12423E2 / (~0.123, 0.123E2) = ~0.9999999999999998E~2 nextAfter (~0.123, 0.123E2) = ~0.12299999999999998 rem (~0.123, 0.123E2) = ~0.123 * (~0.123, 0.3141592653589793E1) = ~0.38641589639154456 + (~0.123, 0.3141592653589793E1) = 0.3018592653589793E1 - (~0.123, 0.3141592653589793E1) = ~0.32645926535897933E1 / (~0.123, 0.3141592653589793E1) = ~0.3915211600060625E~1 nextAfter (~0.123, 0.3141592653589793E1) = ~0.12299999999999998 rem (~0.123, 0.3141592653589793E1) = ~0.123 * (~0.123, 0.2718281828459045E1) = ~0.33434866490046256 + (~0.123, 0.2718281828459045E1) = 0.25952818284590453E1 - (~0.123, 0.2718281828459045E1) = ~0.2841281828459045E1 / (~0.123, 0.2718281828459045E1) = ~0.4524917126408741E~1 nextAfter (~0.123, 0.2718281828459045E1) = ~0.12299999999999998 rem (~0.123, 0.2718281828459045E1) = ~0.123 * (~0.123, 0.123E1) = ~0.15129 + (~0.123, 0.123E1) = 0.1107E1 - (~0.123, 0.123E1) = ~0.1353E1 / (~0.123, 0.123E1) = ~0.1 nextAfter (~0.123, 0.123E1) = ~0.12299999999999998 rem (~0.123, 0.123E1) = ~0.123 * (~0.123, 0.123) = ~0.15129E~1 + (~0.123, 0.123) = 0.0 - (~0.123, 0.123) = ~0.246 / (~0.123, 0.123) = ~0.1E1 nextAfter (~0.123, 0.123) = ~0.12299999999999998 rem (~0.123, 0.123) = 0.0 * (~0.123, 0.123E~2) = ~0.15129E~3 + (~0.123, 0.123E~2) = ~0.12177 - (~0.123, 0.123E~2) = ~0.12423 / (~0.123, 0.123E~2) = ~0.1E3 nextAfter (~0.123, 0.123E~2) = ~0.12299999999999998 rem (~0.123, 0.123E~2) = ~0.8673617379884035E~18 * (~0.123, 0.22250738585072014E~307) = ~0.273684084596386E~308 + (~0.123, 0.22250738585072014E~307) = ~0.123 - (~0.123, 0.22250738585072014E~307) = ~0.123 / (~0.123, 0.22250738585072014E~307) = ~0.55279063897016213E307 nextAfter (~0.123, 0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, 0.22250738585072014E~307) = 0.0 * (~0.123, 0.11125369292536007E~307) = ~0.136842042298193E~308 + (~0.123, 0.11125369292536007E~307) = ~0.123 - (~0.123, 0.11125369292536007E~307) = ~0.123 / (~0.123, 0.11125369292536007E~307) = ~0.11055812779403243E308 nextAfter (~0.123, 0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, 0.11125369292536007E~307) = 0.0 * (~0.123, 0.5E~323) = ~0.0 + (~0.123, 0.5E~323) = ~0.123 - (~0.123, 0.5E~323) = ~0.123 / (~0.123, 0.5E~323) = ~inf nextAfter (~0.123, 0.5E~323) = ~0.12299999999999998 rem (~0.123, 0.5E~323) = inf * (~0.123, 0.0) = ~0.0 + (~0.123, 0.0) = ~0.123 - (~0.123, 0.0) = ~0.123 / (~0.123, 0.0) = ~inf nextAfter (~0.123, 0.0) = ~0.12299999999999998 rem (~0.123, 0.0) = nan * (~0.123, ~0.17976931348623157E309) = 0.22111625558806483E308 + (~0.123, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123, ~0.17976931348623157E309) = 0.684210211490966E~309 nextAfter (~0.123, ~0.17976931348623157E309) = ~0.12300000000000001 rem (~0.123, ~0.17976931348623157E309) = ~0.123 * (~0.123, ~0.8988465674311579E308) = 0.11055812779403241E308 + (~0.123, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123, ~0.8988465674311579E308) = 0.136842042298193E~308 nextAfter (~0.123, ~0.8988465674311579E308) = ~0.12300000000000001 rem (~0.123, ~0.8988465674311579E308) = ~0.123 * (~0.123, ~0.123E4) = 0.15129E3 + (~0.123, ~0.123E4) = ~0.1230123E4 - (~0.123, ~0.123E4) = 0.1229877E4 / (~0.123, ~0.123E4) = 0.1E~3 nextAfter (~0.123, ~0.123E4) = ~0.12300000000000001 rem (~0.123, ~0.123E4) = ~0.123 * (~0.123, ~0.123E2) = 0.15129000000000001E1 + (~0.123, ~0.123E2) = ~0.12423E2 - (~0.123, ~0.123E2) = 0.12177000000000001E2 / (~0.123, ~0.123E2) = 0.9999999999999998E~2 nextAfter (~0.123, ~0.123E2) = ~0.12300000000000001 rem (~0.123, ~0.123E2) = ~0.123 * (~0.123, ~0.3141592653589793E1) = 0.38641589639154456 + (~0.123, ~0.3141592653589793E1) = ~0.32645926535897933E1 - (~0.123, ~0.3141592653589793E1) = 0.3018592653589793E1 / (~0.123, ~0.3141592653589793E1) = 0.3915211600060625E~1 nextAfter (~0.123, ~0.3141592653589793E1) = ~0.12300000000000001 rem (~0.123, ~0.3141592653589793E1) = ~0.123 * (~0.123, ~0.2718281828459045E1) = 0.33434866490046256 + (~0.123, ~0.2718281828459045E1) = ~0.2841281828459045E1 - (~0.123, ~0.2718281828459045E1) = 0.25952818284590453E1 / (~0.123, ~0.2718281828459045E1) = 0.4524917126408741E~1 nextAfter (~0.123, ~0.2718281828459045E1) = ~0.12300000000000001 rem (~0.123, ~0.2718281828459045E1) = ~0.123 * (~0.123, ~0.123E1) = 0.15129 + (~0.123, ~0.123E1) = ~0.1353E1 - (~0.123, ~0.123E1) = 0.1107E1 / (~0.123, ~0.123E1) = 0.1 nextAfter (~0.123, ~0.123E1) = ~0.12300000000000001 rem (~0.123, ~0.123E1) = ~0.123 * (~0.123, ~0.123) = 0.15129E~1 + (~0.123, ~0.123) = ~0.246 - (~0.123, ~0.123) = 0.0 / (~0.123, ~0.123) = 0.1E1 nextAfter (~0.123, ~0.123) = ~0.123 rem (~0.123, ~0.123) = 0.0 * (~0.123, ~0.123E~2) = 0.15129E~3 + (~0.123, ~0.123E~2) = ~0.12423 - (~0.123, ~0.123E~2) = ~0.12177 / (~0.123, ~0.123E~2) = 0.1E3 nextAfter (~0.123, ~0.123E~2) = ~0.12299999999999998 rem (~0.123, ~0.123E~2) = ~0.8673617379884035E~18 * (~0.123, ~0.22250738585072014E~307) = 0.273684084596386E~308 + (~0.123, ~0.22250738585072014E~307) = ~0.123 - (~0.123, ~0.22250738585072014E~307) = ~0.123 / (~0.123, ~0.22250738585072014E~307) = 0.55279063897016213E307 nextAfter (~0.123, ~0.22250738585072014E~307) = ~0.12299999999999998 rem (~0.123, ~0.22250738585072014E~307) = 0.0 * (~0.123, ~0.11125369292536007E~307) = 0.136842042298193E~308 + (~0.123, ~0.11125369292536007E~307) = ~0.123 - (~0.123, ~0.11125369292536007E~307) = ~0.123 / (~0.123, ~0.11125369292536007E~307) = 0.11055812779403243E308 nextAfter (~0.123, ~0.11125369292536007E~307) = ~0.12299999999999998 rem (~0.123, ~0.11125369292536007E~307) = 0.0 * (~0.123, ~0.5E~323) = 0.0 + (~0.123, ~0.5E~323) = ~0.123 - (~0.123, ~0.5E~323) = ~0.123 / (~0.123, ~0.5E~323) = inf nextAfter (~0.123, ~0.5E~323) = ~0.12299999999999998 rem (~0.123, ~0.5E~323) = inf * (~0.123, ~0.0) = 0.0 + (~0.123, ~0.0) = ~0.123 - (~0.123, ~0.0) = ~0.123 / (~0.123, ~0.0) = inf nextAfter (~0.123, ~0.0) = ~0.12299999999999998 rem (~0.123, ~0.0) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123, ~inf) = inf + (~0.123, ~inf) = ~inf - (~0.123, ~inf) = inf / (~0.123, ~inf) = 0.0 nextAfter (~0.123, ~inf) = ~0.12300000000000001 rem (~0.123, ~inf) = ~0.123 * (~0.123, nan) = nan + (~0.123, nan) = nan - (~0.123, nan) = nan / (~0.123, nan) = nan nextAfter (~0.123, nan) = nan rem (~0.123, nan) = nan * (~0.123, inf) = ~inf + (~0.123, inf) = inf - (~0.123, inf) = ~inf / (~0.123, inf) = ~0.0 nextAfter (~0.123, inf) = ~0.12299999999999998 rem (~0.123, inf) = ~0.123 * (~0.123E~2, 0.17976931348623157E309) = ~0.2211162555880648E306 + (~0.123E~2, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.123E~2, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.123E~2, 0.17976931348623157E309) = ~0.684210211491E~311 nextAfter (~0.123E~2, 0.17976931348623157E309) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, 0.8988465674311579E308) = ~0.1105581277940324E306 + (~0.123E~2, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.123E~2, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.123E~2, 0.8988465674311579E308) = ~0.1368420422982E~310 nextAfter (~0.123E~2, 0.8988465674311579E308) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, 0.123E4) = ~0.15129E1 + (~0.123E~2, 0.123E4) = 0.122999877E4 - (~0.123E~2, 0.123E4) = ~0.123000123E4 / (~0.123E~2, 0.123E4) = ~0.1E~5 nextAfter (~0.123E~2, 0.123E4) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E4) = ~0.123E~2 * (~0.123E~2, 0.123E2) = ~0.15129E~1 + (~0.123E~2, 0.123E2) = 0.12298770000000001E2 - (~0.123E~2, 0.123E2) = ~0.1230123E2 / (~0.123E~2, 0.123E2) = ~0.9999999999999999E~4 nextAfter (~0.123E~2, 0.123E2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E2) = ~0.123E~2 * (~0.123E~2, 0.3141592653589793E1) = ~0.38641589639154456E~2 + (~0.123E~2, 0.3141592653589793E1) = 0.3140362653589793E1 - (~0.123E~2, 0.3141592653589793E1) = ~0.3142822653589793E1 / (~0.123E~2, 0.3141592653589793E1) = ~0.3915211600060625E~3 nextAfter (~0.123E~2, 0.3141592653589793E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, 0.2718281828459045E1) = ~0.33434866490046253E~2 + (~0.123E~2, 0.2718281828459045E1) = 0.2717051828459045E1 - (~0.123E~2, 0.2718281828459045E1) = ~0.2719511828459045E1 / (~0.123E~2, 0.2718281828459045E1) = ~0.45249171264087406E~3 nextAfter (~0.123E~2, 0.2718281828459045E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, 0.123E1) = ~0.15129E~2 + (~0.123E~2, 0.123E1) = 0.122877E1 - (~0.123E~2, 0.123E1) = ~0.123123E1 / (~0.123E~2, 0.123E1) = ~0.1E~2 nextAfter (~0.123E~2, 0.123E1) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E1) = ~0.123E~2 * (~0.123E~2, 0.123) = ~0.15129E~3 + (~0.123E~2, 0.123) = 0.12177 - (~0.123E~2, 0.123) = ~0.12423 / (~0.123E~2, 0.123) = ~0.1E~1 nextAfter (~0.123E~2, 0.123) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123) = ~0.123E~2 * (~0.123E~2, 0.123E~2) = ~0.15129E~5 + (~0.123E~2, 0.123E~2) = 0.0 - (~0.123E~2, 0.123E~2) = ~0.246E~2 / (~0.123E~2, 0.123E~2) = ~0.1E1 nextAfter (~0.123E~2, 0.123E~2) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.123E~2) = 0.0 * (~0.123E~2, 0.22250738585072014E~307) = ~0.2736840845964E~310 + (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, 0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, 0.22250738585072014E~307) = ~0.5527906389701621E305 nextAfter (~0.123E~2, 0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.22250738585072014E~307) = 0.0 * (~0.123E~2, 0.11125369292536007E~307) = ~0.1368420422982E~310 + (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, 0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, 0.11125369292536007E~307) = ~0.11055812779403243E306 nextAfter (~0.123E~2, 0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.11125369292536007E~307) = 0.0 * (~0.123E~2, 0.5E~323) = ~0.0 + (~0.123E~2, 0.5E~323) = ~0.123E~2 - (~0.123E~2, 0.5E~323) = ~0.123E~2 / (~0.123E~2, 0.5E~323) = ~inf nextAfter (~0.123E~2, 0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.5E~323) = inf * (~0.123E~2, 0.0) = ~0.0 + (~0.123E~2, 0.0) = ~0.123E~2 - (~0.123E~2, 0.0) = ~0.123E~2 / (~0.123E~2, 0.0) = ~inf nextAfter (~0.123E~2, 0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, 0.0) = nan * (~0.123E~2, ~0.17976931348623157E309) = 0.2211162555880648E306 + (~0.123E~2, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.123E~2, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.123E~2, ~0.17976931348623157E309) = 0.684210211491E~311 nextAfter (~0.123E~2, ~0.17976931348623157E309) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.17976931348623157E309) = ~0.123E~2 * (~0.123E~2, ~0.8988465674311579E308) = 0.1105581277940324E306 + (~0.123E~2, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.123E~2, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.123E~2, ~0.8988465674311579E308) = 0.1368420422982E~310 nextAfter (~0.123E~2, ~0.8988465674311579E308) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.8988465674311579E308) = ~0.123E~2 * (~0.123E~2, ~0.123E4) = 0.15129E1 + (~0.123E~2, ~0.123E4) = ~0.123000123E4 - (~0.123E~2, ~0.123E4) = 0.122999877E4 / (~0.123E~2, ~0.123E4) = 0.1E~5 nextAfter (~0.123E~2, ~0.123E4) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E4) = ~0.123E~2 * (~0.123E~2, ~0.123E2) = 0.15129E~1 + (~0.123E~2, ~0.123E2) = ~0.1230123E2 - (~0.123E~2, ~0.123E2) = 0.12298770000000001E2 / (~0.123E~2, ~0.123E2) = 0.9999999999999999E~4 nextAfter (~0.123E~2, ~0.123E2) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E2) = ~0.123E~2 * (~0.123E~2, ~0.3141592653589793E1) = 0.38641589639154456E~2 + (~0.123E~2, ~0.3141592653589793E1) = ~0.3142822653589793E1 - (~0.123E~2, ~0.3141592653589793E1) = 0.3140362653589793E1 / (~0.123E~2, ~0.3141592653589793E1) = 0.3915211600060625E~3 nextAfter (~0.123E~2, ~0.3141592653589793E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.3141592653589793E1) = ~0.123E~2 * (~0.123E~2, ~0.2718281828459045E1) = 0.33434866490046253E~2 + (~0.123E~2, ~0.2718281828459045E1) = ~0.2719511828459045E1 - (~0.123E~2, ~0.2718281828459045E1) = 0.2717051828459045E1 / (~0.123E~2, ~0.2718281828459045E1) = 0.45249171264087406E~3 nextAfter (~0.123E~2, ~0.2718281828459045E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.2718281828459045E1) = ~0.123E~2 * (~0.123E~2, ~0.123E1) = 0.15129E~2 + (~0.123E~2, ~0.123E1) = ~0.123123E1 - (~0.123E~2, ~0.123E1) = 0.122877E1 / (~0.123E~2, ~0.123E1) = 0.1E~2 nextAfter (~0.123E~2, ~0.123E1) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123E1) = ~0.123E~2 * (~0.123E~2, ~0.123) = 0.15129E~3 + (~0.123E~2, ~0.123) = ~0.12423 - (~0.123E~2, ~0.123) = 0.12177 / (~0.123E~2, ~0.123) = 0.1E~1 nextAfter (~0.123E~2, ~0.123) = ~0.12300000000000002E~2 rem (~0.123E~2, ~0.123) = ~0.123E~2 * (~0.123E~2, ~0.123E~2) = 0.15129E~5 + (~0.123E~2, ~0.123E~2) = ~0.246E~2 - (~0.123E~2, ~0.123E~2) = 0.0 / (~0.123E~2, ~0.123E~2) = 0.1E1 nextAfter (~0.123E~2, ~0.123E~2) = ~0.123E~2 rem (~0.123E~2, ~0.123E~2) = 0.0 * (~0.123E~2, ~0.22250738585072014E~307) = 0.2736840845964E~310 + (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 - (~0.123E~2, ~0.22250738585072014E~307) = ~0.123E~2 / (~0.123E~2, ~0.22250738585072014E~307) = 0.5527906389701621E305 nextAfter (~0.123E~2, ~0.22250738585072014E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.22250738585072014E~307) = 0.0 * (~0.123E~2, ~0.11125369292536007E~307) = 0.1368420422982E~310 + (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 - (~0.123E~2, ~0.11125369292536007E~307) = ~0.123E~2 / (~0.123E~2, ~0.11125369292536007E~307) = 0.11055812779403243E306 nextAfter (~0.123E~2, ~0.11125369292536007E~307) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.11125369292536007E~307) = 0.0 * (~0.123E~2, ~0.5E~323) = 0.0 + (~0.123E~2, ~0.5E~323) = ~0.123E~2 - (~0.123E~2, ~0.5E~323) = ~0.123E~2 / (~0.123E~2, ~0.5E~323) = inf nextAfter (~0.123E~2, ~0.5E~323) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.5E~323) = inf * (~0.123E~2, ~0.0) = 0.0 + (~0.123E~2, ~0.0) = ~0.123E~2 - (~0.123E~2, ~0.0) = ~0.123E~2 / (~0.123E~2, ~0.0) = inf nextAfter (~0.123E~2, ~0.0) = ~0.12299999999999998E~2 rem (~0.123E~2, ~0.0) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.123E~2, ~inf) = inf + (~0.123E~2, ~inf) = ~inf - (~0.123E~2, ~inf) = inf / (~0.123E~2, ~inf) = 0.0 nextAfter (~0.123E~2, ~inf) = ~0.12300000000000002E~2 rem (~0.123E~2, ~inf) = ~0.123E~2 * (~0.123E~2, nan) = nan + (~0.123E~2, nan) = nan - (~0.123E~2, nan) = nan / (~0.123E~2, nan) = nan nextAfter (~0.123E~2, nan) = nan rem (~0.123E~2, nan) = nan * (~0.123E~2, inf) = ~inf + (~0.123E~2, inf) = inf - (~0.123E~2, inf) = ~inf / (~0.123E~2, inf) = ~0.0 nextAfter (~0.123E~2, inf) = ~0.12299999999999998E~2 rem (~0.123E~2, inf) = ~0.123E~2 * (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.39999999999999996E1 + (~0.22250738585072014E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.19999999999999998E1 + (~0.22250738585072014E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E4) = ~0.27368408459638577E~304 + (~0.22250738585072014E~307, 0.123E4) = 0.123E4 - (~0.22250738585072014E~307, 0.123E4) = ~0.123E4 / (~0.22250738585072014E~307, 0.123E4) = ~0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, 0.123E4) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E2) = ~0.2736840845963858E~306 + (~0.22250738585072014E~307, 0.123E2) = 0.123E2 - (~0.22250738585072014E~307, 0.123E2) = ~0.123E2 / (~0.22250738585072014E~307, 0.123E2) = ~0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, 0.123E2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.6990275687580919E~307 + (~0.22250738585072014E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.6048377836559378E~307 + (~0.22250738585072014E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E1) = ~0.27368408459638577E~307 + (~0.22250738585072014E~307, 0.123E1) = 0.123E1 - (~0.22250738585072014E~307, 0.123E1) = ~0.123E1 / (~0.22250738585072014E~307, 0.123E1) = ~0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, 0.123E1) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123) = ~0.273684084596386E~308 + (~0.22250738585072014E~307, 0.123) = 0.123 - (~0.22250738585072014E~307, 0.123) = ~0.123 / (~0.22250738585072014E~307, 0.123) = ~0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, 0.123) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.123E~2) = ~0.2736840845964E~310 + (~0.22250738585072014E~307, 0.123E~2) = 0.123E~2 - (~0.22250738585072014E~307, 0.123E~2) = ~0.123E~2 / (~0.22250738585072014E~307, 0.123E~2) = ~0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, 0.123E~2) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.0 + (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 - (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.4450147717014403E~307 / (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.1E1 nextAfter (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.0 + (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.3337610787760802E~307 / (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2E1 nextAfter (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, 0.5E~323) = ~0.0 + (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 - (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507202E~307 / (~0.22250738585072014E~307, 0.5E~323) = ~0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, 0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.5E~323) = 0.0 * (~0.22250738585072014E~307, 0.0) = ~0.0 + (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, 0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, 0.0) = ~inf nextAfter (~0.22250738585072014E~307, 0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, 0.0) = nan * (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.39999999999999996E1 + (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.22250738585072014E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.19999999999999998E1 + (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.22250738585072014E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E4) = 0.27368408459638577E~304 + (~0.22250738585072014E~307, ~0.123E4) = ~0.123E4 - (~0.22250738585072014E~307, ~0.123E4) = 0.123E4 / (~0.22250738585072014E~307, ~0.123E4) = 0.18090031369976E~310 nextAfter (~0.22250738585072014E~307, ~0.123E4) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E4) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E2) = 0.2736840845963858E~306 + (~0.22250738585072014E~307, ~0.123E2) = ~0.123E2 - (~0.22250738585072014E~307, ~0.123E2) = 0.123E2 / (~0.22250738585072014E~307, ~0.123E2) = 0.1809003136997725E~308 nextAfter (~0.22250738585072014E~307, ~0.123E2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.6990275687580919E~307 + (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.22250738585072014E~307, ~0.3141592653589793E1) = 0.7082630066519554E~308 nextAfter (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.6048377836559378E~307 + (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.22250738585072014E~307, ~0.2718281828459045E1) = 0.818558927632814E~308 nextAfter (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E1) = 0.27368408459638577E~307 + (~0.22250738585072014E~307, ~0.123E1) = ~0.123E1 - (~0.22250738585072014E~307, ~0.123E1) = 0.123E1 / (~0.22250738585072014E~307, ~0.123E1) = 0.18090031369977247E~307 nextAfter (~0.22250738585072014E~307, ~0.123E1) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E1) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123) = 0.273684084596386E~308 + (~0.22250738585072014E~307, ~0.123) = ~0.123 - (~0.22250738585072014E~307, ~0.123) = 0.123 / (~0.22250738585072014E~307, ~0.123) = 0.1809003136997725E~306 nextAfter (~0.22250738585072014E~307, ~0.123) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.123E~2) = 0.2736840845964E~310 + (~0.22250738585072014E~307, ~0.123E~2) = ~0.123E~2 - (~0.22250738585072014E~307, ~0.123E~2) = 0.123E~2 / (~0.22250738585072014E~307, ~0.123E~2) = 0.18090031369977247E~304 nextAfter (~0.22250738585072014E~307, ~0.123E~2) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~0.123E~2) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 + (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.4450147717014403E~307 - (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 / (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.1E1 nextAfter (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 rem (~0.22250738585072014E~307, ~0.22250738585072014E~307) = 0.0 * (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 + (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.3337610787760802E~307 - (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.2E1 nextAfter (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.11125369292536007E~307) = 0.0 * (~0.22250738585072014E~307, ~0.5E~323) = 0.0 + (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507202E~307 - (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 / (~0.22250738585072014E~307, ~0.5E~323) = 0.4503599627370496E16 nextAfter (~0.22250738585072014E~307, ~0.5E~323) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.5E~323) = 0.0 * (~0.22250738585072014E~307, ~0.0) = 0.0 + (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 - (~0.22250738585072014E~307, ~0.0) = ~0.22250738585072014E~307 / (~0.22250738585072014E~307, ~0.0) = inf nextAfter (~0.22250738585072014E~307, ~0.0) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, ~0.0) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, ~inf) = inf + (~0.22250738585072014E~307, ~inf) = ~inf - (~0.22250738585072014E~307, ~inf) = inf / (~0.22250738585072014E~307, ~inf) = 0.0 nextAfter (~0.22250738585072014E~307, ~inf) = ~0.2225073858507202E~307 rem (~0.22250738585072014E~307, ~inf) = ~0.22250738585072014E~307 * (~0.22250738585072014E~307, nan) = nan + (~0.22250738585072014E~307, nan) = nan - (~0.22250738585072014E~307, nan) = nan / (~0.22250738585072014E~307, nan) = nan nextAfter (~0.22250738585072014E~307, nan) = nan rem (~0.22250738585072014E~307, nan) = nan * (~0.22250738585072014E~307, inf) = ~inf + (~0.22250738585072014E~307, inf) = inf - (~0.22250738585072014E~307, inf) = ~inf / (~0.22250738585072014E~307, inf) = ~0.0 nextAfter (~0.22250738585072014E~307, inf) = ~0.2225073858507201E~307 rem (~0.22250738585072014E~307, inf) = ~0.22250738585072014E~307 * (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.19999999999999998E1 + (~0.11125369292536007E~307, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.9999999999999999 + (~0.11125369292536007E~307, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.0 nextAfter (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E4) = ~0.13684204229819289E~304 + (~0.11125369292536007E~307, 0.123E4) = 0.123E4 - (~0.11125369292536007E~307, 0.123E4) = ~0.123E4 / (~0.11125369292536007E~307, 0.123E4) = ~0.904501568499E~311 nextAfter (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E2) = ~0.1368420422981929E~306 + (~0.11125369292536007E~307, 0.123E2) = 0.123E2 - (~0.11125369292536007E~307, 0.123E2) = ~0.123E2 / (~0.11125369292536007E~307, 0.123E2) = ~0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.34951378437904593E~307 + (~0.11125369292536007E~307, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.3024188918279689E~307 + (~0.11125369292536007E~307, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E1) = ~0.1368420422981929E~307 + (~0.11125369292536007E~307, 0.123E1) = 0.123E1 - (~0.11125369292536007E~307, 0.123E1) = ~0.123E1 / (~0.11125369292536007E~307, 0.123E1) = ~0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123) = ~0.136842042298193E~308 + (~0.11125369292536007E~307, 0.123) = 0.123 - (~0.11125369292536007E~307, 0.123) = ~0.123 / (~0.11125369292536007E~307, 0.123) = ~0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, 0.123) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.123E~2) = ~0.1368420422982E~310 + (~0.11125369292536007E~307, 0.123E~2) = 0.123E~2 - (~0.11125369292536007E~307, 0.123E~2) = ~0.123E~2 / (~0.11125369292536007E~307, 0.123E~2) = ~0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.0 + (~0.11125369292536007E~307, 0.22250738585072014E~307) = 0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.3337610787760802E~307 / (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.5 nextAfter (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.0 + (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 - (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.22250738585072014E~307 / (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.1E1 nextAfter (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, 0.5E~323) = ~0.0 + (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 - (~0.11125369292536007E~307, 0.5E~323) = ~0.1112536929253601E~307 / (~0.11125369292536007E~307, 0.5E~323) = ~0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, 0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.5E~323) = 0.0 * (~0.11125369292536007E~307, 0.0) = ~0.0 + (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, 0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, 0.0) = ~inf nextAfter (~0.11125369292536007E~307, 0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, 0.0) = nan * (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.19999999999999998E1 + (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.11125369292536007E~307, ~0.17976931348623157E309) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.9999999999999999 + (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.11125369292536007E~307, ~0.8988465674311579E308) = 0.0 nextAfter (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E4) = 0.13684204229819289E~304 + (~0.11125369292536007E~307, ~0.123E4) = ~0.123E4 - (~0.11125369292536007E~307, ~0.123E4) = 0.123E4 / (~0.11125369292536007E~307, ~0.123E4) = 0.904501568499E~311 nextAfter (~0.11125369292536007E~307, ~0.123E4) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E4) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E2) = 0.1368420422981929E~306 + (~0.11125369292536007E~307, ~0.123E2) = ~0.123E2 - (~0.11125369292536007E~307, ~0.123E2) = 0.123E2 / (~0.11125369292536007E~307, ~0.123E2) = 0.90450156849886E~309 nextAfter (~0.11125369292536007E~307, ~0.123E2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.34951378437904593E~307 + (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.11125369292536007E~307, ~0.3141592653589793E1) = 0.3541315033259774E~308 nextAfter (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.3024188918279689E~307 + (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.11125369292536007E~307, ~0.2718281828459045E1) = 0.409279463816407E~308 nextAfter (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E1) = 0.1368420422981929E~307 + (~0.11125369292536007E~307, ~0.123E1) = ~0.123E1 - (~0.11125369292536007E~307, ~0.123E1) = 0.123E1 / (~0.11125369292536007E~307, ~0.123E1) = 0.9045015684988623E~308 nextAfter (~0.11125369292536007E~307, ~0.123E1) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E1) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123) = 0.136842042298193E~308 + (~0.11125369292536007E~307, ~0.123) = ~0.123 - (~0.11125369292536007E~307, ~0.123) = 0.123 / (~0.11125369292536007E~307, ~0.123) = 0.9045015684988624E~307 nextAfter (~0.11125369292536007E~307, ~0.123) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.123E~2) = 0.1368420422982E~310 + (~0.11125369292536007E~307, ~0.123E~2) = ~0.123E~2 - (~0.11125369292536007E~307, ~0.123E~2) = 0.123E~2 / (~0.11125369292536007E~307, ~0.123E~2) = 0.9045015684988623E~305 nextAfter (~0.11125369292536007E~307, ~0.123E~2) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.123E~2) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.0 + (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.3337610787760802E~307 - (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.22250738585072014E~307) = 0.5 nextAfter (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 + (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.22250738585072014E~307 - (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 / (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.1E1 nextAfter (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 rem (~0.11125369292536007E~307, ~0.11125369292536007E~307) = 0.0 * (~0.11125369292536007E~307, ~0.5E~323) = 0.0 + (~0.11125369292536007E~307, ~0.5E~323) = ~0.1112536929253601E~307 - (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 / (~0.11125369292536007E~307, ~0.5E~323) = 0.2251799813685248E16 nextAfter (~0.11125369292536007E~307, ~0.5E~323) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.5E~323) = 0.0 * (~0.11125369292536007E~307, ~0.0) = 0.0 + (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 - (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536007E~307 / (~0.11125369292536007E~307, ~0.0) = inf nextAfter (~0.11125369292536007E~307, ~0.0) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, ~0.0) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, ~inf) = inf + (~0.11125369292536007E~307, ~inf) = ~inf - (~0.11125369292536007E~307, ~inf) = inf / (~0.11125369292536007E~307, ~inf) = 0.0 nextAfter (~0.11125369292536007E~307, ~inf) = ~0.1112536929253601E~307 rem (~0.11125369292536007E~307, ~inf) = ~0.11125369292536007E~307 * (~0.11125369292536007E~307, nan) = nan + (~0.11125369292536007E~307, nan) = nan - (~0.11125369292536007E~307, nan) = nan / (~0.11125369292536007E~307, nan) = nan nextAfter (~0.11125369292536007E~307, nan) = nan rem (~0.11125369292536007E~307, nan) = nan * (~0.11125369292536007E~307, inf) = ~inf + (~0.11125369292536007E~307, inf) = inf - (~0.11125369292536007E~307, inf) = ~inf / (~0.11125369292536007E~307, inf) = ~0.0 nextAfter (~0.11125369292536007E~307, inf) = ~0.11125369292536E~307 rem (~0.11125369292536007E~307, inf) = ~0.11125369292536007E~307 * (~0.5E~323, 0.17976931348623157E309) = ~0.8881784197001251E~15 + (~0.5E~323, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.5E~323, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.5E~323, 0.17976931348623157E309) = ~0.0 nextAfter (~0.5E~323, 0.17976931348623157E309) = ~0.0 rem (~0.5E~323, 0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, 0.8988465674311579E308) = ~0.44408920985006257E~15 + (~0.5E~323, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.5E~323, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.5E~323, 0.8988465674311579E308) = ~0.0 nextAfter (~0.5E~323, 0.8988465674311579E308) = ~0.0 rem (~0.5E~323, 0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, 0.123E4) = ~0.6077E~320 + (~0.5E~323, 0.123E4) = 0.123E4 - (~0.5E~323, 0.123E4) = ~0.123E4 / (~0.5E~323, 0.123E4) = ~0.0 nextAfter (~0.5E~323, 0.123E4) = ~0.0 rem (~0.5E~323, 0.123E4) = ~0.5E~323 * (~0.5E~323, 0.123E2) = ~0.6E~322 + (~0.5E~323, 0.123E2) = 0.123E2 - (~0.5E~323, 0.123E2) = ~0.123E2 / (~0.5E~323, 0.123E2) = ~0.0 nextAfter (~0.5E~323, 0.123E2) = ~0.0 rem (~0.5E~323, 0.123E2) = ~0.5E~323 * (~0.5E~323, 0.3141592653589793E1) = ~0.15E~322 + (~0.5E~323, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.5E~323, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.5E~323, 0.3141592653589793E1) = ~0.0 nextAfter (~0.5E~323, 0.3141592653589793E1) = ~0.0 rem (~0.5E~323, 0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, 0.2718281828459045E1) = ~0.15E~322 + (~0.5E~323, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.5E~323, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.5E~323, 0.2718281828459045E1) = ~0.0 nextAfter (~0.5E~323, 0.2718281828459045E1) = ~0.0 rem (~0.5E~323, 0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, 0.123E1) = ~0.5E~323 + (~0.5E~323, 0.123E1) = 0.123E1 - (~0.5E~323, 0.123E1) = ~0.123E1 / (~0.5E~323, 0.123E1) = ~0.5E~323 nextAfter (~0.5E~323, 0.123E1) = ~0.0 rem (~0.5E~323, 0.123E1) = ~0.5E~323 * (~0.5E~323, 0.123) = ~0.0 + (~0.5E~323, 0.123) = 0.123 - (~0.5E~323, 0.123) = ~0.123 / (~0.5E~323, 0.123) = ~0.4E~322 nextAfter (~0.5E~323, 0.123) = ~0.0 rem (~0.5E~323, 0.123) = ~0.5E~323 * (~0.5E~323, 0.123E~2) = ~0.0 + (~0.5E~323, 0.123E~2) = 0.123E~2 - (~0.5E~323, 0.123E~2) = ~0.123E~2 / (~0.5E~323, 0.123E~2) = ~0.4017E~320 nextAfter (~0.5E~323, 0.123E~2) = ~0.0 rem (~0.5E~323, 0.123E~2) = ~0.5E~323 * (~0.5E~323, 0.22250738585072014E~307) = ~0.0 + (~0.5E~323, 0.22250738585072014E~307) = 0.2225073858507201E~307 - (~0.5E~323, 0.22250738585072014E~307) = ~0.2225073858507202E~307 / (~0.5E~323, 0.22250738585072014E~307) = ~0.2220446049250313E~15 nextAfter (~0.5E~323, 0.22250738585072014E~307) = ~0.0 rem (~0.5E~323, 0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, 0.11125369292536007E~307) = ~0.0 + (~0.5E~323, 0.11125369292536007E~307) = 0.11125369292536E~307 - (~0.5E~323, 0.11125369292536007E~307) = ~0.1112536929253601E~307 / (~0.5E~323, 0.11125369292536007E~307) = ~0.4440892098500626E~15 nextAfter (~0.5E~323, 0.11125369292536007E~307) = ~0.0 rem (~0.5E~323, 0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, 0.5E~323) = ~0.0 + (~0.5E~323, 0.5E~323) = 0.0 - (~0.5E~323, 0.5E~323) = ~0.1E~322 / (~0.5E~323, 0.5E~323) = ~0.1E1 nextAfter (~0.5E~323, 0.5E~323) = ~0.0 rem (~0.5E~323, 0.5E~323) = 0.0 * (~0.5E~323, 0.0) = ~0.0 + (~0.5E~323, 0.0) = ~0.5E~323 - (~0.5E~323, 0.0) = ~0.5E~323 / (~0.5E~323, 0.0) = ~inf nextAfter (~0.5E~323, 0.0) = ~0.0 rem (~0.5E~323, 0.0) = nan * (~0.5E~323, ~0.17976931348623157E309) = 0.8881784197001251E~15 + (~0.5E~323, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.5E~323, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.5E~323, ~0.17976931348623157E309) = 0.0 nextAfter (~0.5E~323, ~0.17976931348623157E309) = ~0.1E~322 rem (~0.5E~323, ~0.17976931348623157E309) = ~0.5E~323 * (~0.5E~323, ~0.8988465674311579E308) = 0.44408920985006257E~15 + (~0.5E~323, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.5E~323, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.5E~323, ~0.8988465674311579E308) = 0.0 nextAfter (~0.5E~323, ~0.8988465674311579E308) = ~0.1E~322 rem (~0.5E~323, ~0.8988465674311579E308) = ~0.5E~323 * (~0.5E~323, ~0.123E4) = 0.6077E~320 + (~0.5E~323, ~0.123E4) = ~0.123E4 - (~0.5E~323, ~0.123E4) = 0.123E4 / (~0.5E~323, ~0.123E4) = 0.0 nextAfter (~0.5E~323, ~0.123E4) = ~0.1E~322 rem (~0.5E~323, ~0.123E4) = ~0.5E~323 * (~0.5E~323, ~0.123E2) = 0.6E~322 + (~0.5E~323, ~0.123E2) = ~0.123E2 - (~0.5E~323, ~0.123E2) = 0.123E2 / (~0.5E~323, ~0.123E2) = 0.0 nextAfter (~0.5E~323, ~0.123E2) = ~0.1E~322 rem (~0.5E~323, ~0.123E2) = ~0.5E~323 * (~0.5E~323, ~0.3141592653589793E1) = 0.15E~322 + (~0.5E~323, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.5E~323, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.5E~323, ~0.3141592653589793E1) = 0.0 nextAfter (~0.5E~323, ~0.3141592653589793E1) = ~0.1E~322 rem (~0.5E~323, ~0.3141592653589793E1) = ~0.5E~323 * (~0.5E~323, ~0.2718281828459045E1) = 0.15E~322 + (~0.5E~323, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.5E~323, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.5E~323, ~0.2718281828459045E1) = 0.0 nextAfter (~0.5E~323, ~0.2718281828459045E1) = ~0.1E~322 rem (~0.5E~323, ~0.2718281828459045E1) = ~0.5E~323 * (~0.5E~323, ~0.123E1) = 0.5E~323 + (~0.5E~323, ~0.123E1) = ~0.123E1 - (~0.5E~323, ~0.123E1) = 0.123E1 / (~0.5E~323, ~0.123E1) = 0.5E~323 nextAfter (~0.5E~323, ~0.123E1) = ~0.1E~322 rem (~0.5E~323, ~0.123E1) = ~0.5E~323 * (~0.5E~323, ~0.123) = 0.0 + (~0.5E~323, ~0.123) = ~0.123 - (~0.5E~323, ~0.123) = 0.123 / (~0.5E~323, ~0.123) = 0.4E~322 nextAfter (~0.5E~323, ~0.123) = ~0.1E~322 rem (~0.5E~323, ~0.123) = ~0.5E~323 * (~0.5E~323, ~0.123E~2) = 0.0 + (~0.5E~323, ~0.123E~2) = ~0.123E~2 - (~0.5E~323, ~0.123E~2) = 0.123E~2 / (~0.5E~323, ~0.123E~2) = 0.4017E~320 nextAfter (~0.5E~323, ~0.123E~2) = ~0.1E~322 rem (~0.5E~323, ~0.123E~2) = ~0.5E~323 * (~0.5E~323, ~0.22250738585072014E~307) = 0.0 + (~0.5E~323, ~0.22250738585072014E~307) = ~0.2225073858507202E~307 - (~0.5E~323, ~0.22250738585072014E~307) = 0.2225073858507201E~307 / (~0.5E~323, ~0.22250738585072014E~307) = 0.2220446049250313E~15 nextAfter (~0.5E~323, ~0.22250738585072014E~307) = ~0.1E~322 rem (~0.5E~323, ~0.22250738585072014E~307) = ~0.5E~323 * (~0.5E~323, ~0.11125369292536007E~307) = 0.0 + (~0.5E~323, ~0.11125369292536007E~307) = ~0.1112536929253601E~307 - (~0.5E~323, ~0.11125369292536007E~307) = 0.11125369292536E~307 / (~0.5E~323, ~0.11125369292536007E~307) = 0.4440892098500626E~15 nextAfter (~0.5E~323, ~0.11125369292536007E~307) = ~0.1E~322 rem (~0.5E~323, ~0.11125369292536007E~307) = ~0.5E~323 * (~0.5E~323, ~0.5E~323) = 0.0 + (~0.5E~323, ~0.5E~323) = ~0.1E~322 - (~0.5E~323, ~0.5E~323) = 0.0 / (~0.5E~323, ~0.5E~323) = 0.1E1 nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 rem (~0.5E~323, ~0.5E~323) = 0.0 * (~0.5E~323, ~0.0) = 0.0 + (~0.5E~323, ~0.0) = ~0.5E~323 - (~0.5E~323, ~0.0) = ~0.5E~323 / (~0.5E~323, ~0.0) = inf nextAfter (~0.5E~323, ~0.0) = ~0.0 rem (~0.5E~323, ~0.0) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.5E~323, ~inf) = inf + (~0.5E~323, ~inf) = ~inf - (~0.5E~323, ~inf) = inf / (~0.5E~323, ~inf) = 0.0 nextAfter (~0.5E~323, ~inf) = ~0.1E~322 rem (~0.5E~323, ~inf) = ~0.5E~323 * (~0.5E~323, nan) = nan + (~0.5E~323, nan) = nan - (~0.5E~323, nan) = nan / (~0.5E~323, nan) = nan nextAfter (~0.5E~323, nan) = nan rem (~0.5E~323, nan) = nan * (~0.5E~323, inf) = ~inf + (~0.5E~323, inf) = inf - (~0.5E~323, inf) = ~inf / (~0.5E~323, inf) = ~0.0 nextAfter (~0.5E~323, inf) = ~0.0 rem (~0.5E~323, inf) = ~0.5E~323 * (~0.0, 0.17976931348623157E309) = ~0.0 + (~0.0, 0.17976931348623157E309) = 0.17976931348623157E309 - (~0.0, 0.17976931348623157E309) = ~0.17976931348623157E309 / (~0.0, 0.17976931348623157E309) = ~0.0 nextAfter (~0.0, 0.17976931348623157E309) = 0.5E~323 rem (~0.0, 0.17976931348623157E309) = 0.0 * (~0.0, 0.8988465674311579E308) = ~0.0 + (~0.0, 0.8988465674311579E308) = 0.8988465674311579E308 - (~0.0, 0.8988465674311579E308) = ~0.8988465674311579E308 / (~0.0, 0.8988465674311579E308) = ~0.0 nextAfter (~0.0, 0.8988465674311579E308) = 0.5E~323 rem (~0.0, 0.8988465674311579E308) = 0.0 * (~0.0, 0.123E4) = ~0.0 + (~0.0, 0.123E4) = 0.123E4 - (~0.0, 0.123E4) = ~0.123E4 / (~0.0, 0.123E4) = ~0.0 nextAfter (~0.0, 0.123E4) = 0.5E~323 rem (~0.0, 0.123E4) = 0.0 * (~0.0, 0.123E2) = ~0.0 + (~0.0, 0.123E2) = 0.123E2 - (~0.0, 0.123E2) = ~0.123E2 / (~0.0, 0.123E2) = ~0.0 nextAfter (~0.0, 0.123E2) = 0.5E~323 rem (~0.0, 0.123E2) = 0.0 * (~0.0, 0.3141592653589793E1) = ~0.0 + (~0.0, 0.3141592653589793E1) = 0.3141592653589793E1 - (~0.0, 0.3141592653589793E1) = ~0.3141592653589793E1 / (~0.0, 0.3141592653589793E1) = ~0.0 nextAfter (~0.0, 0.3141592653589793E1) = 0.5E~323 rem (~0.0, 0.3141592653589793E1) = 0.0 * (~0.0, 0.2718281828459045E1) = ~0.0 + (~0.0, 0.2718281828459045E1) = 0.2718281828459045E1 - (~0.0, 0.2718281828459045E1) = ~0.2718281828459045E1 / (~0.0, 0.2718281828459045E1) = ~0.0 nextAfter (~0.0, 0.2718281828459045E1) = 0.5E~323 rem (~0.0, 0.2718281828459045E1) = 0.0 * (~0.0, 0.123E1) = ~0.0 + (~0.0, 0.123E1) = 0.123E1 - (~0.0, 0.123E1) = ~0.123E1 / (~0.0, 0.123E1) = ~0.0 nextAfter (~0.0, 0.123E1) = 0.5E~323 rem (~0.0, 0.123E1) = 0.0 * (~0.0, 0.123) = ~0.0 + (~0.0, 0.123) = 0.123 - (~0.0, 0.123) = ~0.123 / (~0.0, 0.123) = ~0.0 nextAfter (~0.0, 0.123) = 0.5E~323 rem (~0.0, 0.123) = 0.0 * (~0.0, 0.123E~2) = ~0.0 + (~0.0, 0.123E~2) = 0.123E~2 - (~0.0, 0.123E~2) = ~0.123E~2 / (~0.0, 0.123E~2) = ~0.0 nextAfter (~0.0, 0.123E~2) = 0.5E~323 rem (~0.0, 0.123E~2) = 0.0 * (~0.0, 0.22250738585072014E~307) = ~0.0 + (~0.0, 0.22250738585072014E~307) = 0.22250738585072014E~307 - (~0.0, 0.22250738585072014E~307) = ~0.22250738585072014E~307 / (~0.0, 0.22250738585072014E~307) = ~0.0 nextAfter (~0.0, 0.22250738585072014E~307) = 0.5E~323 rem (~0.0, 0.22250738585072014E~307) = 0.0 * (~0.0, 0.11125369292536007E~307) = ~0.0 + (~0.0, 0.11125369292536007E~307) = 0.11125369292536007E~307 - (~0.0, 0.11125369292536007E~307) = ~0.11125369292536007E~307 / (~0.0, 0.11125369292536007E~307) = ~0.0 nextAfter (~0.0, 0.11125369292536007E~307) = 0.5E~323 rem (~0.0, 0.11125369292536007E~307) = 0.0 * (~0.0, 0.5E~323) = ~0.0 + (~0.0, 0.5E~323) = 0.5E~323 - (~0.0, 0.5E~323) = ~0.5E~323 / (~0.0, 0.5E~323) = ~0.0 nextAfter (~0.0, 0.5E~323) = 0.5E~323 rem (~0.0, 0.5E~323) = 0.0 * (~0.0, 0.0) = ~0.0 + (~0.0, 0.0) = 0.0 - (~0.0, 0.0) = ~0.0 / (~0.0, 0.0) = nan nextAfter (~0.0, 0.0) = 0.0 rem (~0.0, 0.0) = 0.0 * (~0.0, ~0.17976931348623157E309) = 0.0 + (~0.0, ~0.17976931348623157E309) = ~0.17976931348623157E309 - (~0.0, ~0.17976931348623157E309) = 0.17976931348623157E309 / (~0.0, ~0.17976931348623157E309) = 0.0 nextAfter (~0.0, ~0.17976931348623157E309) = ~0.5E~323 rem (~0.0, ~0.17976931348623157E309) = 0.0 * (~0.0, ~0.8988465674311579E308) = 0.0 + (~0.0, ~0.8988465674311579E308) = ~0.8988465674311579E308 - (~0.0, ~0.8988465674311579E308) = 0.8988465674311579E308 / (~0.0, ~0.8988465674311579E308) = 0.0 nextAfter (~0.0, ~0.8988465674311579E308) = ~0.5E~323 rem (~0.0, ~0.8988465674311579E308) = 0.0 * (~0.0, ~0.123E4) = 0.0 + (~0.0, ~0.123E4) = ~0.123E4 - (~0.0, ~0.123E4) = 0.123E4 / (~0.0, ~0.123E4) = 0.0 nextAfter (~0.0, ~0.123E4) = ~0.5E~323 rem (~0.0, ~0.123E4) = 0.0 * (~0.0, ~0.123E2) = 0.0 + (~0.0, ~0.123E2) = ~0.123E2 - (~0.0, ~0.123E2) = 0.123E2 / (~0.0, ~0.123E2) = 0.0 nextAfter (~0.0, ~0.123E2) = ~0.5E~323 rem (~0.0, ~0.123E2) = 0.0 * (~0.0, ~0.3141592653589793E1) = 0.0 + (~0.0, ~0.3141592653589793E1) = ~0.3141592653589793E1 - (~0.0, ~0.3141592653589793E1) = 0.3141592653589793E1 / (~0.0, ~0.3141592653589793E1) = 0.0 nextAfter (~0.0, ~0.3141592653589793E1) = ~0.5E~323 rem (~0.0, ~0.3141592653589793E1) = 0.0 * (~0.0, ~0.2718281828459045E1) = 0.0 + (~0.0, ~0.2718281828459045E1) = ~0.2718281828459045E1 - (~0.0, ~0.2718281828459045E1) = 0.2718281828459045E1 / (~0.0, ~0.2718281828459045E1) = 0.0 nextAfter (~0.0, ~0.2718281828459045E1) = ~0.5E~323 rem (~0.0, ~0.2718281828459045E1) = 0.0 * (~0.0, ~0.123E1) = 0.0 + (~0.0, ~0.123E1) = ~0.123E1 - (~0.0, ~0.123E1) = 0.123E1 / (~0.0, ~0.123E1) = 0.0 nextAfter (~0.0, ~0.123E1) = ~0.5E~323 rem (~0.0, ~0.123E1) = 0.0 * (~0.0, ~0.123) = 0.0 + (~0.0, ~0.123) = ~0.123 - (~0.0, ~0.123) = 0.123 / (~0.0, ~0.123) = 0.0 nextAfter (~0.0, ~0.123) = ~0.5E~323 rem (~0.0, ~0.123) = 0.0 * (~0.0, ~0.123E~2) = 0.0 + (~0.0, ~0.123E~2) = ~0.123E~2 - (~0.0, ~0.123E~2) = 0.123E~2 / (~0.0, ~0.123E~2) = 0.0 nextAfter (~0.0, ~0.123E~2) = ~0.5E~323 rem (~0.0, ~0.123E~2) = 0.0 * (~0.0, ~0.22250738585072014E~307) = 0.0 + (~0.0, ~0.22250738585072014E~307) = ~0.22250738585072014E~307 - (~0.0, ~0.22250738585072014E~307) = 0.22250738585072014E~307 / (~0.0, ~0.22250738585072014E~307) = 0.0 nextAfter (~0.0, ~0.22250738585072014E~307) = ~0.5E~323 rem (~0.0, ~0.22250738585072014E~307) = 0.0 * (~0.0, ~0.11125369292536007E~307) = 0.0 + (~0.0, ~0.11125369292536007E~307) = ~0.11125369292536007E~307 - (~0.0, ~0.11125369292536007E~307) = 0.11125369292536007E~307 / (~0.0, ~0.11125369292536007E~307) = 0.0 nextAfter (~0.0, ~0.11125369292536007E~307) = ~0.5E~323 rem (~0.0, ~0.11125369292536007E~307) = 0.0 * (~0.0, ~0.5E~323) = 0.0 + (~0.0, ~0.5E~323) = ~0.5E~323 - (~0.0, ~0.5E~323) = 0.5E~323 / (~0.0, ~0.5E~323) = 0.0 nextAfter (~0.0, ~0.5E~323) = ~0.5E~323 rem (~0.0, ~0.5E~323) = 0.0 * (~0.0, ~0.0) = 0.0 + (~0.0, ~0.0) = ~0.0 - (~0.0, ~0.0) = 0.0 / (~0.0, ~0.0) = nan nextAfter (~0.0, ~0.0) = ~0.0 rem (~0.0, ~0.0) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (~0.0, ~inf) = nan + (~0.0, ~inf) = ~inf - (~0.0, ~inf) = inf / (~0.0, ~inf) = 0.0 nextAfter (~0.0, ~inf) = ~0.5E~323 rem (~0.0, ~inf) = 0.0 * (~0.0, nan) = nan + (~0.0, nan) = nan - (~0.0, nan) = nan / (~0.0, nan) = nan nextAfter (~0.0, nan) = nan rem (~0.0, nan) = 0.0 * (~0.0, inf) = nan + (~0.0, inf) = inf - (~0.0, inf) = ~inf / (~0.0, inf) = ~0.0 nextAfter (~0.0, inf) = 0.5E~323 rem (~0.0, inf) = 0.0 * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (~inf, 0.17976931348623157E309) = ~inf + (~inf, 0.17976931348623157E309) = ~inf - (~inf, 0.17976931348623157E309) = ~inf / (~inf, 0.17976931348623157E309) = ~inf nextAfter (~inf, 0.17976931348623157E309) = ~inf rem (~inf, 0.17976931348623157E309) = nan * (~inf, 0.8988465674311579E308) = ~inf + (~inf, 0.8988465674311579E308) = ~inf - (~inf, 0.8988465674311579E308) = ~inf / (~inf, 0.8988465674311579E308) = ~inf nextAfter (~inf, 0.8988465674311579E308) = ~inf rem (~inf, 0.8988465674311579E308) = nan * (~inf, 0.123E4) = ~inf + (~inf, 0.123E4) = ~inf - (~inf, 0.123E4) = ~inf / (~inf, 0.123E4) = ~inf nextAfter (~inf, 0.123E4) = ~inf rem (~inf, 0.123E4) = nan * (~inf, 0.123E2) = ~inf + (~inf, 0.123E2) = ~inf - (~inf, 0.123E2) = ~inf / (~inf, 0.123E2) = ~inf nextAfter (~inf, 0.123E2) = ~inf rem (~inf, 0.123E2) = nan * (~inf, 0.3141592653589793E1) = ~inf + (~inf, 0.3141592653589793E1) = ~inf - (~inf, 0.3141592653589793E1) = ~inf / (~inf, 0.3141592653589793E1) = ~inf nextAfter (~inf, 0.3141592653589793E1) = ~inf rem (~inf, 0.3141592653589793E1) = nan * (~inf, 0.2718281828459045E1) = ~inf + (~inf, 0.2718281828459045E1) = ~inf - (~inf, 0.2718281828459045E1) = ~inf / (~inf, 0.2718281828459045E1) = ~inf nextAfter (~inf, 0.2718281828459045E1) = ~inf rem (~inf, 0.2718281828459045E1) = nan * (~inf, 0.123E1) = ~inf + (~inf, 0.123E1) = ~inf - (~inf, 0.123E1) = ~inf / (~inf, 0.123E1) = ~inf nextAfter (~inf, 0.123E1) = ~inf rem (~inf, 0.123E1) = nan * (~inf, 0.123) = ~inf + (~inf, 0.123) = ~inf - (~inf, 0.123) = ~inf / (~inf, 0.123) = ~inf nextAfter (~inf, 0.123) = ~inf rem (~inf, 0.123) = nan * (~inf, 0.123E~2) = ~inf + (~inf, 0.123E~2) = ~inf - (~inf, 0.123E~2) = ~inf / (~inf, 0.123E~2) = ~inf nextAfter (~inf, 0.123E~2) = ~inf rem (~inf, 0.123E~2) = nan * (~inf, 0.22250738585072014E~307) = ~inf + (~inf, 0.22250738585072014E~307) = ~inf - (~inf, 0.22250738585072014E~307) = ~inf / (~inf, 0.22250738585072014E~307) = ~inf nextAfter (~inf, 0.22250738585072014E~307) = ~inf rem (~inf, 0.22250738585072014E~307) = nan * (~inf, 0.11125369292536007E~307) = ~inf + (~inf, 0.11125369292536007E~307) = ~inf - (~inf, 0.11125369292536007E~307) = ~inf / (~inf, 0.11125369292536007E~307) = ~inf nextAfter (~inf, 0.11125369292536007E~307) = ~inf rem (~inf, 0.11125369292536007E~307) = nan * (~inf, 0.5E~323) = ~inf + (~inf, 0.5E~323) = ~inf - (~inf, 0.5E~323) = ~inf / (~inf, 0.5E~323) = ~inf nextAfter (~inf, 0.5E~323) = ~inf rem (~inf, 0.5E~323) = nan * (~inf, 0.0) = nan + (~inf, 0.0) = ~inf - (~inf, 0.0) = ~inf / (~inf, 0.0) = ~inf nextAfter (~inf, 0.0) = ~inf rem (~inf, 0.0) = nan * (~inf, ~0.17976931348623157E309) = inf + (~inf, ~0.17976931348623157E309) = ~inf - (~inf, ~0.17976931348623157E309) = ~inf / (~inf, ~0.17976931348623157E309) = inf nextAfter (~inf, ~0.17976931348623157E309) = ~inf rem (~inf, ~0.17976931348623157E309) = nan * (~inf, ~0.8988465674311579E308) = inf + (~inf, ~0.8988465674311579E308) = ~inf - (~inf, ~0.8988465674311579E308) = ~inf / (~inf, ~0.8988465674311579E308) = inf nextAfter (~inf, ~0.8988465674311579E308) = ~inf rem (~inf, ~0.8988465674311579E308) = nan * (~inf, ~0.123E4) = inf + (~inf, ~0.123E4) = ~inf - (~inf, ~0.123E4) = ~inf / (~inf, ~0.123E4) = inf nextAfter (~inf, ~0.123E4) = ~inf rem (~inf, ~0.123E4) = nan * (~inf, ~0.123E2) = inf + (~inf, ~0.123E2) = ~inf - (~inf, ~0.123E2) = ~inf / (~inf, ~0.123E2) = inf nextAfter (~inf, ~0.123E2) = ~inf rem (~inf, ~0.123E2) = nan * (~inf, ~0.3141592653589793E1) = inf + (~inf, ~0.3141592653589793E1) = ~inf - (~inf, ~0.3141592653589793E1) = ~inf / (~inf, ~0.3141592653589793E1) = inf nextAfter (~inf, ~0.3141592653589793E1) = ~inf rem (~inf, ~0.3141592653589793E1) = nan * (~inf, ~0.2718281828459045E1) = inf + (~inf, ~0.2718281828459045E1) = ~inf - (~inf, ~0.2718281828459045E1) = ~inf / (~inf, ~0.2718281828459045E1) = inf nextAfter (~inf, ~0.2718281828459045E1) = ~inf rem (~inf, ~0.2718281828459045E1) = nan * (~inf, ~0.123E1) = inf + (~inf, ~0.123E1) = ~inf - (~inf, ~0.123E1) = ~inf / (~inf, ~0.123E1) = inf nextAfter (~inf, ~0.123E1) = ~inf rem (~inf, ~0.123E1) = nan * (~inf, ~0.123) = inf + (~inf, ~0.123) = ~inf - (~inf, ~0.123) = ~inf / (~inf, ~0.123) = inf nextAfter (~inf, ~0.123) = ~inf rem (~inf, ~0.123) = nan * (~inf, ~0.123E~2) = inf + (~inf, ~0.123E~2) = ~inf - (~inf, ~0.123E~2) = ~inf / (~inf, ~0.123E~2) = inf nextAfter (~inf, ~0.123E~2) = ~inf rem (~inf, ~0.123E~2) = nan * (~inf, ~0.22250738585072014E~307) = inf + (~inf, ~0.22250738585072014E~307) = ~inf - (~inf, ~0.22250738585072014E~307) = ~inf / (~inf, ~0.22250738585072014E~307) = inf nextAfter (~inf, ~0.22250738585072014E~307) = ~inf rem (~inf, ~0.22250738585072014E~307) = nan * (~inf, ~0.11125369292536007E~307) = inf + (~inf, ~0.11125369292536007E~307) = ~inf - (~inf, ~0.11125369292536007E~307) = ~inf / (~inf, ~0.11125369292536007E~307) = inf nextAfter (~inf, ~0.11125369292536007E~307) = ~inf rem (~inf, ~0.11125369292536007E~307) = nan * (~inf, ~0.5E~323) = inf + (~inf, ~0.5E~323) = ~inf - (~inf, ~0.5E~323) = ~inf / (~inf, ~0.5E~323) = inf nextAfter (~inf, ~0.5E~323) = ~inf rem (~inf, ~0.5E~323) = nan * (~inf, ~0.0) = nan + (~inf, ~0.0) = ~inf - (~inf, ~0.0) = ~inf / (~inf, ~0.0) = inf nextAfter (~inf, ~0.0) = ~inf rem (~inf, ~0.0) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (~inf, ~inf) = inf + (~inf, ~inf) = ~inf - (~inf, ~inf) = nan / (~inf, ~inf) = nan nextAfter (~inf, ~inf) = ~inf rem (~inf, ~inf) = nan * (~inf, nan) = nan + (~inf, nan) = nan - (~inf, nan) = nan / (~inf, nan) = nan nextAfter (~inf, nan) = nan rem (~inf, nan) = nan * (~inf, inf) = ~inf + (~inf, inf) = nan - (~inf, inf) = ~inf / (~inf, inf) = nan nextAfter (~inf, inf) = ~inf rem (~inf, inf) = nan * (nan, 0.17976931348623157E309) = nan + (nan, 0.17976931348623157E309) = nan - (nan, 0.17976931348623157E309) = nan / (nan, 0.17976931348623157E309) = nan nextAfter (nan, 0.17976931348623157E309) = nan rem (nan, 0.17976931348623157E309) = nan * (nan, 0.8988465674311579E308) = nan + (nan, 0.8988465674311579E308) = nan - (nan, 0.8988465674311579E308) = nan / (nan, 0.8988465674311579E308) = nan nextAfter (nan, 0.8988465674311579E308) = nan rem (nan, 0.8988465674311579E308) = nan * (nan, 0.123E4) = nan + (nan, 0.123E4) = nan - (nan, 0.123E4) = nan / (nan, 0.123E4) = nan nextAfter (nan, 0.123E4) = nan rem (nan, 0.123E4) = nan * (nan, 0.123E2) = nan + (nan, 0.123E2) = nan - (nan, 0.123E2) = nan / (nan, 0.123E2) = nan nextAfter (nan, 0.123E2) = nan rem (nan, 0.123E2) = nan * (nan, 0.3141592653589793E1) = nan + (nan, 0.3141592653589793E1) = nan - (nan, 0.3141592653589793E1) = nan / (nan, 0.3141592653589793E1) = nan nextAfter (nan, 0.3141592653589793E1) = nan rem (nan, 0.3141592653589793E1) = nan * (nan, 0.2718281828459045E1) = nan + (nan, 0.2718281828459045E1) = nan - (nan, 0.2718281828459045E1) = nan / (nan, 0.2718281828459045E1) = nan nextAfter (nan, 0.2718281828459045E1) = nan rem (nan, 0.2718281828459045E1) = nan * (nan, 0.123E1) = nan + (nan, 0.123E1) = nan - (nan, 0.123E1) = nan / (nan, 0.123E1) = nan nextAfter (nan, 0.123E1) = nan rem (nan, 0.123E1) = nan * (nan, 0.123) = nan + (nan, 0.123) = nan - (nan, 0.123) = nan / (nan, 0.123) = nan nextAfter (nan, 0.123) = nan rem (nan, 0.123) = nan * (nan, 0.123E~2) = nan + (nan, 0.123E~2) = nan - (nan, 0.123E~2) = nan / (nan, 0.123E~2) = nan nextAfter (nan, 0.123E~2) = nan rem (nan, 0.123E~2) = nan * (nan, 0.22250738585072014E~307) = nan + (nan, 0.22250738585072014E~307) = nan - (nan, 0.22250738585072014E~307) = nan / (nan, 0.22250738585072014E~307) = nan nextAfter (nan, 0.22250738585072014E~307) = nan rem (nan, 0.22250738585072014E~307) = nan * (nan, 0.11125369292536007E~307) = nan + (nan, 0.11125369292536007E~307) = nan - (nan, 0.11125369292536007E~307) = nan / (nan, 0.11125369292536007E~307) = nan nextAfter (nan, 0.11125369292536007E~307) = nan rem (nan, 0.11125369292536007E~307) = nan * (nan, 0.5E~323) = nan + (nan, 0.5E~323) = nan - (nan, 0.5E~323) = nan / (nan, 0.5E~323) = nan nextAfter (nan, 0.5E~323) = nan rem (nan, 0.5E~323) = nan * (nan, 0.0) = nan + (nan, 0.0) = nan - (nan, 0.0) = nan / (nan, 0.0) = nan nextAfter (nan, 0.0) = nan rem (nan, 0.0) = nan * (nan, ~0.17976931348623157E309) = nan + (nan, ~0.17976931348623157E309) = nan - (nan, ~0.17976931348623157E309) = nan / (nan, ~0.17976931348623157E309) = nan nextAfter (nan, ~0.17976931348623157E309) = nan rem (nan, ~0.17976931348623157E309) = nan * (nan, ~0.8988465674311579E308) = nan + (nan, ~0.8988465674311579E308) = nan - (nan, ~0.8988465674311579E308) = nan / (nan, ~0.8988465674311579E308) = nan nextAfter (nan, ~0.8988465674311579E308) = nan rem (nan, ~0.8988465674311579E308) = nan * (nan, ~0.123E4) = nan + (nan, ~0.123E4) = nan - (nan, ~0.123E4) = nan / (nan, ~0.123E4) = nan nextAfter (nan, ~0.123E4) = nan rem (nan, ~0.123E4) = nan * (nan, ~0.123E2) = nan + (nan, ~0.123E2) = nan - (nan, ~0.123E2) = nan / (nan, ~0.123E2) = nan nextAfter (nan, ~0.123E2) = nan rem (nan, ~0.123E2) = nan * (nan, ~0.3141592653589793E1) = nan + (nan, ~0.3141592653589793E1) = nan - (nan, ~0.3141592653589793E1) = nan / (nan, ~0.3141592653589793E1) = nan nextAfter (nan, ~0.3141592653589793E1) = nan rem (nan, ~0.3141592653589793E1) = nan * (nan, ~0.2718281828459045E1) = nan + (nan, ~0.2718281828459045E1) = nan - (nan, ~0.2718281828459045E1) = nan / (nan, ~0.2718281828459045E1) = nan nextAfter (nan, ~0.2718281828459045E1) = nan rem (nan, ~0.2718281828459045E1) = nan * (nan, ~0.123E1) = nan + (nan, ~0.123E1) = nan - (nan, ~0.123E1) = nan / (nan, ~0.123E1) = nan nextAfter (nan, ~0.123E1) = nan rem (nan, ~0.123E1) = nan * (nan, ~0.123) = nan + (nan, ~0.123) = nan - (nan, ~0.123) = nan / (nan, ~0.123) = nan nextAfter (nan, ~0.123) = nan rem (nan, ~0.123) = nan * (nan, ~0.123E~2) = nan + (nan, ~0.123E~2) = nan - (nan, ~0.123E~2) = nan / (nan, ~0.123E~2) = nan nextAfter (nan, ~0.123E~2) = nan rem (nan, ~0.123E~2) = nan * (nan, ~0.22250738585072014E~307) = nan + (nan, ~0.22250738585072014E~307) = nan - (nan, ~0.22250738585072014E~307) = nan / (nan, ~0.22250738585072014E~307) = nan nextAfter (nan, ~0.22250738585072014E~307) = nan rem (nan, ~0.22250738585072014E~307) = nan * (nan, ~0.11125369292536007E~307) = nan + (nan, ~0.11125369292536007E~307) = nan - (nan, ~0.11125369292536007E~307) = nan / (nan, ~0.11125369292536007E~307) = nan nextAfter (nan, ~0.11125369292536007E~307) = nan rem (nan, ~0.11125369292536007E~307) = nan * (nan, ~0.5E~323) = nan + (nan, ~0.5E~323) = nan - (nan, ~0.5E~323) = nan / (nan, ~0.5E~323) = nan nextAfter (nan, ~0.5E~323) = nan rem (nan, ~0.5E~323) = nan * (nan, ~0.0) = nan + (nan, ~0.0) = nan - (nan, ~0.0) = nan / (nan, ~0.0) = nan nextAfter (nan, ~0.0) = nan rem (nan, ~0.0) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (nan, ~inf) = nan + (nan, ~inf) = nan - (nan, ~inf) = nan / (nan, ~inf) = nan nextAfter (nan, ~inf) = nan rem (nan, ~inf) = nan * (nan, nan) = nan + (nan, nan) = nan - (nan, nan) = nan / (nan, nan) = nan nextAfter (nan, nan) = nan rem (nan, nan) = nan * (nan, inf) = nan + (nan, inf) = nan - (nan, inf) = nan / (nan, inf) = nan nextAfter (nan, inf) = nan rem (nan, inf) = nan * (inf, 0.17976931348623157E309) = inf + (inf, 0.17976931348623157E309) = inf - (inf, 0.17976931348623157E309) = inf / (inf, 0.17976931348623157E309) = inf nextAfter (inf, 0.17976931348623157E309) = inf rem (inf, 0.17976931348623157E309) = nan * (inf, 0.8988465674311579E308) = inf + (inf, 0.8988465674311579E308) = inf - (inf, 0.8988465674311579E308) = inf / (inf, 0.8988465674311579E308) = inf nextAfter (inf, 0.8988465674311579E308) = inf rem (inf, 0.8988465674311579E308) = nan * (inf, 0.123E4) = inf + (inf, 0.123E4) = inf - (inf, 0.123E4) = inf / (inf, 0.123E4) = inf nextAfter (inf, 0.123E4) = inf rem (inf, 0.123E4) = nan * (inf, 0.123E2) = inf + (inf, 0.123E2) = inf - (inf, 0.123E2) = inf / (inf, 0.123E2) = inf nextAfter (inf, 0.123E2) = inf rem (inf, 0.123E2) = nan * (inf, 0.3141592653589793E1) = inf + (inf, 0.3141592653589793E1) = inf - (inf, 0.3141592653589793E1) = inf / (inf, 0.3141592653589793E1) = inf nextAfter (inf, 0.3141592653589793E1) = inf rem (inf, 0.3141592653589793E1) = nan * (inf, 0.2718281828459045E1) = inf + (inf, 0.2718281828459045E1) = inf - (inf, 0.2718281828459045E1) = inf / (inf, 0.2718281828459045E1) = inf nextAfter (inf, 0.2718281828459045E1) = inf rem (inf, 0.2718281828459045E1) = nan * (inf, 0.123E1) = inf + (inf, 0.123E1) = inf - (inf, 0.123E1) = inf / (inf, 0.123E1) = inf nextAfter (inf, 0.123E1) = inf rem (inf, 0.123E1) = nan * (inf, 0.123) = inf + (inf, 0.123) = inf - (inf, 0.123) = inf / (inf, 0.123) = inf nextAfter (inf, 0.123) = inf rem (inf, 0.123) = nan * (inf, 0.123E~2) = inf + (inf, 0.123E~2) = inf - (inf, 0.123E~2) = inf / (inf, 0.123E~2) = inf nextAfter (inf, 0.123E~2) = inf rem (inf, 0.123E~2) = nan * (inf, 0.22250738585072014E~307) = inf + (inf, 0.22250738585072014E~307) = inf - (inf, 0.22250738585072014E~307) = inf / (inf, 0.22250738585072014E~307) = inf nextAfter (inf, 0.22250738585072014E~307) = inf rem (inf, 0.22250738585072014E~307) = nan * (inf, 0.11125369292536007E~307) = inf + (inf, 0.11125369292536007E~307) = inf - (inf, 0.11125369292536007E~307) = inf / (inf, 0.11125369292536007E~307) = inf nextAfter (inf, 0.11125369292536007E~307) = inf rem (inf, 0.11125369292536007E~307) = nan * (inf, 0.5E~323) = inf + (inf, 0.5E~323) = inf - (inf, 0.5E~323) = inf / (inf, 0.5E~323) = inf nextAfter (inf, 0.5E~323) = inf rem (inf, 0.5E~323) = nan * (inf, 0.0) = nan + (inf, 0.0) = inf - (inf, 0.0) = inf / (inf, 0.0) = inf nextAfter (inf, 0.0) = inf rem (inf, 0.0) = nan * (inf, ~0.17976931348623157E309) = ~inf + (inf, ~0.17976931348623157E309) = inf - (inf, ~0.17976931348623157E309) = inf / (inf, ~0.17976931348623157E309) = ~inf nextAfter (inf, ~0.17976931348623157E309) = inf rem (inf, ~0.17976931348623157E309) = nan * (inf, ~0.8988465674311579E308) = ~inf + (inf, ~0.8988465674311579E308) = inf - (inf, ~0.8988465674311579E308) = inf / (inf, ~0.8988465674311579E308) = ~inf nextAfter (inf, ~0.8988465674311579E308) = inf rem (inf, ~0.8988465674311579E308) = nan * (inf, ~0.123E4) = ~inf + (inf, ~0.123E4) = inf - (inf, ~0.123E4) = inf / (inf, ~0.123E4) = ~inf nextAfter (inf, ~0.123E4) = inf rem (inf, ~0.123E4) = nan * (inf, ~0.123E2) = ~inf + (inf, ~0.123E2) = inf - (inf, ~0.123E2) = inf / (inf, ~0.123E2) = ~inf nextAfter (inf, ~0.123E2) = inf rem (inf, ~0.123E2) = nan * (inf, ~0.3141592653589793E1) = ~inf + (inf, ~0.3141592653589793E1) = inf - (inf, ~0.3141592653589793E1) = inf / (inf, ~0.3141592653589793E1) = ~inf nextAfter (inf, ~0.3141592653589793E1) = inf rem (inf, ~0.3141592653589793E1) = nan * (inf, ~0.2718281828459045E1) = ~inf + (inf, ~0.2718281828459045E1) = inf - (inf, ~0.2718281828459045E1) = inf / (inf, ~0.2718281828459045E1) = ~inf nextAfter (inf, ~0.2718281828459045E1) = inf rem (inf, ~0.2718281828459045E1) = nan * (inf, ~0.123E1) = ~inf + (inf, ~0.123E1) = inf - (inf, ~0.123E1) = inf / (inf, ~0.123E1) = ~inf nextAfter (inf, ~0.123E1) = inf rem (inf, ~0.123E1) = nan * (inf, ~0.123) = ~inf + (inf, ~0.123) = inf - (inf, ~0.123) = inf / (inf, ~0.123) = ~inf nextAfter (inf, ~0.123) = inf rem (inf, ~0.123) = nan * (inf, ~0.123E~2) = ~inf + (inf, ~0.123E~2) = inf - (inf, ~0.123E~2) = inf / (inf, ~0.123E~2) = ~inf nextAfter (inf, ~0.123E~2) = inf rem (inf, ~0.123E~2) = nan * (inf, ~0.22250738585072014E~307) = ~inf + (inf, ~0.22250738585072014E~307) = inf - (inf, ~0.22250738585072014E~307) = inf / (inf, ~0.22250738585072014E~307) = ~inf nextAfter (inf, ~0.22250738585072014E~307) = inf rem (inf, ~0.22250738585072014E~307) = nan * (inf, ~0.11125369292536007E~307) = ~inf + (inf, ~0.11125369292536007E~307) = inf - (inf, ~0.11125369292536007E~307) = inf / (inf, ~0.11125369292536007E~307) = ~inf nextAfter (inf, ~0.11125369292536007E~307) = inf rem (inf, ~0.11125369292536007E~307) = nan * (inf, ~0.5E~323) = ~inf + (inf, ~0.5E~323) = inf - (inf, ~0.5E~323) = inf / (inf, ~0.5E~323) = ~inf nextAfter (inf, ~0.5E~323) = inf rem (inf, ~0.5E~323) = nan * (inf, ~0.0) = nan + (inf, ~0.0) = inf - (inf, ~0.0) = inf / (inf, ~0.0) = ~inf nextAfter (inf, ~0.0) = inf rem (inf, ~0.0) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan * (inf, ~inf) = ~inf + (inf, ~inf) = nan - (inf, ~inf) = inf / (inf, ~inf) = nan nextAfter (inf, ~inf) = inf rem (inf, ~inf) = nan * (inf, nan) = nan + (inf, nan) = nan - (inf, nan) = nan / (inf, nan) = nan nextAfter (inf, nan) = nan rem (inf, nan) = nan * (inf, inf) = inf + (inf, inf) = inf - (inf, inf) = nan / (inf, inf) = nan nextAfter (inf, inf) = inf rem (inf, inf) = nan Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh,atan2,pow} acos (0.17976931348623157E309) = nan asin (0.17976931348623157E309) = nan atan (0.17976931348623157E309) = 1.570796327 cos (0.17976931348623157E309) = 1.797693135E308 cosh (0.17976931348623157E309) = inf exp (0.17976931348623157E309) = inf ln (0.17976931348623157E309) = 709.7827129 log10 (0.17976931348623157E309) = 308.2547156 sin (0.17976931348623157E309) = 1.797693135E308 sinh (0.17976931348623157E309) = inf sqrt (0.17976931348623157E309) = 1.340780793E154 tan (0.17976931348623157E309) = nan tanh (0.17976931348623157E309) = 1 acos (0.8988465674311579E308) = nan asin (0.8988465674311579E308) = nan atan (0.8988465674311579E308) = 1.570796327 cos (0.8988465674311579E308) = 8.988465674E307 cosh (0.8988465674311579E308) = inf exp (0.8988465674311579E308) = inf ln (0.8988465674311579E308) = 709.0895657 log10 (0.8988465674311579E308) = 307.9536856 sin (0.8988465674311579E308) = 8.988465674E307 sinh (0.8988465674311579E308) = inf sqrt (0.8988465674311579E308) = 9.480751908E153 tan (0.8988465674311579E308) = nan tanh (0.8988465674311579E308) = 1 acos (0.123E4) = nan asin (0.123E4) = nan atan (0.123E4) = 1.569983319 cos (0.123E4) = 0.06642716993 cosh (0.123E4) = inf exp (0.123E4) = inf ln (0.123E4) = 7.114769448 log10 (0.123E4) = 3.089905111 sin (0.123E4) = ~0.9977912763 sinh (0.123E4) = inf sqrt (0.123E4) = 35.07135583 tan (0.123E4) = ~15.02083074 tanh (0.123E4) = 1 acos (0.123E2) = nan asin (0.123E2) = nan atan (0.123E2) = 1.489673935 cos (0.123E2) = 0.9647326179 cosh (0.123E2) = 109847.9943 exp (0.123E2) = 219695.9887 ln (0.123E2) = 2.509599262 log10 (0.123E2) = 1.089905111 sin (0.123E2) = ~0.2632317914 sinh (0.123E2) = 109847.9943 sqrt (0.123E2) = 3.507135583 tan (0.123E2) = ~0.272854661 tanh (0.123E2) = 1 acos (0.3141592653589793E1) = nan asin (0.3141592653589793E1) = nan atan (0.3141592653589793E1) = 1.262627256 cos (0.3141592653589793E1) = ~1 cosh (0.3141592653589793E1) = 11.59195328 exp (0.3141592653589793E1) = 23.14069263 ln (0.3141592653589793E1) = 1.144729886 log10 (0.3141592653589793E1) = 0.4971498727 sin (0.3141592653589793E1) = 1.224606354E~16 sinh (0.3141592653589793E1) = 11.54873936 sqrt (0.3141592653589793E1) = 1.772453851 tan (0.3141592653589793E1) = ~1.224606354E~16 tanh (0.3141592653589793E1) = 0.9962720762 acos (0.2718281828459045E1) = nan asin (0.2718281828459045E1) = nan atan (0.2718281828459045E1) = 1.218282905 cos (0.2718281828459045E1) = ~0.9117339148 cosh (0.2718281828459045E1) = 7.610125139 exp (0.2718281828459045E1) = 15.15426224 ln (0.2718281828459045E1) = 1 log10 (0.2718281828459045E1) = 0.4342944819 sin (0.2718281828459045E1) = 0.4107812905 sinh (0.2718281828459045E1) = 7.544137103 sqrt (0.2718281828459045E1) = 1.648721271 tan (0.2718281828459045E1) = ~0.4505495341 tanh (0.2718281828459045E1) = 0.9913289158 acos (0.123E1) = nan asin (0.123E1) = nan atan (0.123E1) = 0.8881737744 cos (0.123E1) = 0.3342377271 cosh (0.123E1) = 1.856761057 exp (0.123E1) = 3.421229536 ln (0.123E1) = 0.2070141694 log10 (0.123E1) = 0.08990511144 sin (0.123E1) = 0.9424888019 sinh (0.123E1) = 1.564468479 sqrt (0.123E1) = 1.109053651 tan (0.123E1) = 2.819815734 tanh (0.123E1) = 0.8425793257 acos (0.123) = 1.447484052 asin (0.123) = 0.1233122752 atan (0.123) = 0.1223852815 cos (0.123) = 0.9924450321 cosh (0.123) = 1.007574042 exp (0.123) = 1.130884421 ln (0.123) = ~2.095570924 log10 (0.123) = ~0.9100948886 sin (0.123) = 0.12269009 sinh (0.123) = 0.1233103792 sqrt (0.123) = 0.3507135583 tan (0.123) = 0.1236240659 tanh (0.123) = 0.1223834419 acos (0.123E~2) = 1.569566326 asin (0.123E~2) = 0.00123000031 atan (0.123E~2) = 0.00122999938 cos (0.123E~2) = 0.9999992436 cosh (0.123E~2) = 1.000000756 exp (0.123E~2) = 1.001230757 ln (0.123E~2) = ~6.70074111 log10 (0.123E~2) = ~2.910094889 sin (0.123E~2) = 0.00122999969 sinh (0.123E~2) = 0.00123000031 sqrt (0.123E~2) = 0.03507135583 tan (0.123E~2) = 0.00123000062 tanh (0.123E~2) = 0.00122999938 acos (0.22250738585072014E~307) = 1.570796327 asin (0.22250738585072014E~307) = 2.225073859E~308 atan (0.22250738585072014E~307) = 2.225073859E~308 cos (0.22250738585072014E~307) = 1 cosh (0.22250738585072014E~307) = 1 exp (0.22250738585072014E~307) = 1 ln (0.22250738585072014E~307) = ~708.3964185 log10 (0.22250738585072014E~307) = ~307.6526556 sin (0.22250738585072014E~307) = 2.225073859E~308 sinh (0.22250738585072014E~307) = 2.225073859E~308 sqrt (0.22250738585072014E~307) = 1.491668146E~154 tan (0.22250738585072014E~307) = 2.225073859E~308 tanh (0.22250738585072014E~307) = 2.225073859E~308 acos (0.11125369292536007E~307) = 1.570796327 asin (0.11125369292536007E~307) = 1.112536929E~308 atan (0.11125369292536007E~307) = 1.112536929E~308 cos (0.11125369292536007E~307) = 1 cosh (0.11125369292536007E~307) = 1 exp (0.11125369292536007E~307) = 1 ln (0.11125369292536007E~307) = ~709.0895657 log10 (0.11125369292536007E~307) = ~307.9536856 sin (0.11125369292536007E~307) = 1.112536929E~308 sinh (0.11125369292536007E~307) = 1.112536929E~308 sqrt (0.11125369292536007E~307) = 1.054768661E~154 tan (0.11125369292536007E~307) = 1.112536929E~308 tanh (0.11125369292536007E~307) = 1.112536929E~308 acos (0.5E~323) = 1.570796327 asin (0.5E~323) = 4.940656458E~324 atan (0.5E~323) = 4.940656458E~324 cos (0.5E~323) = 1 cosh (0.5E~323) = 1 exp (0.5E~323) = 1 ln (0.5E~323) = ~744.4400719 log10 (0.5E~323) = ~323.3062153 sin (0.5E~323) = 4.940656458E~324 sinh (0.5E~323) = 4.940656458E~324 sqrt (0.5E~323) = 2.222758749E~162 tan (0.5E~323) = 4.940656458E~324 tanh (0.5E~323) = 4.940656458E~324 acos (0.0) = 1.570796327 asin (0.0) = 0 atan (0.0) = 0 cos (0.0) = 1 cosh (0.0) = 1 exp (0.0) = 1 ln (0.0) = ~inf log10 (0.0) = ~inf sin (0.0) = 0 sinh (0.0) = 0 sqrt (0.0) = 0 tan (0.0) = 0 tanh (0.0) = 0 acos (~0.17976931348623157E309) = nan asin (~0.17976931348623157E309) = nan atan (~0.17976931348623157E309) = ~1.570796327 cos (~0.17976931348623157E309) = ~1.797693135E308 cosh (~0.17976931348623157E309) = inf exp (~0.17976931348623157E309) = 0 ln (~0.17976931348623157E309) = nan log10 (~0.17976931348623157E309) = nan sin (~0.17976931348623157E309) = ~1.797693135E308 sinh (~0.17976931348623157E309) = ~inf sqrt (~0.17976931348623157E309) = nan tan (~0.17976931348623157E309) = nan tanh (~0.17976931348623157E309) = ~1 acos (~0.8988465674311579E308) = nan asin (~0.8988465674311579E308) = nan atan (~0.8988465674311579E308) = ~1.570796327 cos (~0.8988465674311579E308) = ~8.988465674E307 cosh (~0.8988465674311579E308) = inf exp (~0.8988465674311579E308) = 0 ln (~0.8988465674311579E308) = nan log10 (~0.8988465674311579E308) = nan sin (~0.8988465674311579E308) = ~8.988465674E307 sinh (~0.8988465674311579E308) = ~inf sqrt (~0.8988465674311579E308) = nan tan (~0.8988465674311579E308) = nan tanh (~0.8988465674311579E308) = ~1 acos (~0.123E4) = nan asin (~0.123E4) = nan atan (~0.123E4) = ~1.569983319 cos (~0.123E4) = 0.06642716993 cosh (~0.123E4) = inf exp (~0.123E4) = 0 ln (~0.123E4) = nan log10 (~0.123E4) = nan sin (~0.123E4) = 0.9977912763 sinh (~0.123E4) = ~inf sqrt (~0.123E4) = nan tan (~0.123E4) = 15.02083074 tanh (~0.123E4) = ~1 acos (~0.123E2) = nan asin (~0.123E2) = nan atan (~0.123E2) = ~1.489673935 cos (~0.123E2) = 0.9647326179 cosh (~0.123E2) = 109847.9943 exp (~0.123E2) = 4.551744463E~6 ln (~0.123E2) = nan log10 (~0.123E2) = nan sin (~0.123E2) = 0.2632317914 sinh (~0.123E2) = ~109847.9943 sqrt (~0.123E2) = nan tan (~0.123E2) = 0.272854661 tanh (~0.123E2) = ~1 acos (~0.3141592653589793E1) = nan asin (~0.3141592653589793E1) = nan atan (~0.3141592653589793E1) = ~1.262627256 cos (~0.3141592653589793E1) = ~1 cosh (~0.3141592653589793E1) = 11.59195328 exp (~0.3141592653589793E1) = 0.04321391826 ln (~0.3141592653589793E1) = nan log10 (~0.3141592653589793E1) = nan sin (~0.3141592653589793E1) = ~1.224606354E~16 sinh (~0.3141592653589793E1) = ~11.54873936 sqrt (~0.3141592653589793E1) = nan tan (~0.3141592653589793E1) = 1.224606354E~16 tanh (~0.3141592653589793E1) = ~0.9962720762 acos (~0.2718281828459045E1) = nan asin (~0.2718281828459045E1) = nan atan (~0.2718281828459045E1) = ~1.218282905 cos (~0.2718281828459045E1) = ~0.9117339148 cosh (~0.2718281828459045E1) = 7.610125139 exp (~0.2718281828459045E1) = 0.06598803585 ln (~0.2718281828459045E1) = nan log10 (~0.2718281828459045E1) = nan sin (~0.2718281828459045E1) = ~0.4107812905 sinh (~0.2718281828459045E1) = ~7.544137103 sqrt (~0.2718281828459045E1) = nan tan (~0.2718281828459045E1) = 0.4505495341 tanh (~0.2718281828459045E1) = ~0.9913289158 acos (~0.123E1) = nan asin (~0.123E1) = nan atan (~0.123E1) = ~0.8881737744 cos (~0.123E1) = 0.3342377271 cosh (~0.123E1) = 1.856761057 exp (~0.123E1) = 0.2922925777 ln (~0.123E1) = nan log10 (~0.123E1) = nan sin (~0.123E1) = ~0.9424888019 sinh (~0.123E1) = ~1.564468479 sqrt (~0.123E1) = nan tan (~0.123E1) = ~2.819815734 tanh (~0.123E1) = ~0.8425793257 acos (~0.123) = 1.694108602 asin (~0.123) = ~0.1233122752 atan (~0.123) = ~0.1223852815 cos (~0.123) = 0.9924450321 cosh (~0.123) = 1.007574042 exp (~0.123) = 0.8842636626 ln (~0.123) = nan log10 (~0.123) = nan sin (~0.123) = ~0.12269009 sinh (~0.123) = ~0.1233103792 sqrt (~0.123) = nan tan (~0.123) = ~0.1236240659 tanh (~0.123) = ~0.1223834419 acos (~0.123E~2) = 1.572026327 asin (~0.123E~2) = ~0.00123000031 atan (~0.123E~2) = ~0.00122999938 cos (~0.123E~2) = 0.9999992436 cosh (~0.123E~2) = 1.000000756 exp (~0.123E~2) = 0.9987707561 ln (~0.123E~2) = nan log10 (~0.123E~2) = nan sin (~0.123E~2) = ~0.00122999969 sinh (~0.123E~2) = ~0.00123000031 sqrt (~0.123E~2) = nan tan (~0.123E~2) = ~0.00123000062 tanh (~0.123E~2) = ~0.00122999938 acos (~0.22250738585072014E~307) = 1.570796327 asin (~0.22250738585072014E~307) = ~2.225073859E~308 atan (~0.22250738585072014E~307) = ~2.225073859E~308 cos (~0.22250738585072014E~307) = 1 cosh (~0.22250738585072014E~307) = 1 exp (~0.22250738585072014E~307) = 1 ln (~0.22250738585072014E~307) = nan log10 (~0.22250738585072014E~307) = nan sin (~0.22250738585072014E~307) = ~2.225073859E~308 sinh (~0.22250738585072014E~307) = ~2.225073859E~308 sqrt (~0.22250738585072014E~307) = nan tan (~0.22250738585072014E~307) = ~2.225073859E~308 tanh (~0.22250738585072014E~307) = ~2.225073859E~308 acos (~0.11125369292536007E~307) = 1.570796327 asin (~0.11125369292536007E~307) = ~1.112536929E~308 atan (~0.11125369292536007E~307) = ~1.112536929E~308 cos (~0.11125369292536007E~307) = 1 cosh (~0.11125369292536007E~307) = 1 exp (~0.11125369292536007E~307) = 1 ln (~0.11125369292536007E~307) = nan log10 (~0.11125369292536007E~307) = nan sin (~0.11125369292536007E~307) = ~1.112536929E~308 sinh (~0.11125369292536007E~307) = ~1.112536929E~308 sqrt (~0.11125369292536007E~307) = nan tan (~0.11125369292536007E~307) = ~1.112536929E~308 tanh (~0.11125369292536007E~307) = ~1.112536929E~308 acos (~0.5E~323) = 1.570796327 asin (~0.5E~323) = ~4.940656458E~324 atan (~0.5E~323) = ~4.940656458E~324 cos (~0.5E~323) = 1 cosh (~0.5E~323) = 1 exp (~0.5E~323) = 1 ln (~0.5E~323) = nan log10 (~0.5E~323) = nan sin (~0.5E~323) = ~4.940656458E~324 sinh (~0.5E~323) = ~4.940656458E~324 sqrt (~0.5E~323) = nan tan (~0.5E~323) = ~4.940656458E~324 tanh (~0.5E~323) = ~4.940656458E~324 acos (~0.0) = 1.570796327 asin (~0.0) = 0 atan (~0.0) = 0 cos (~0.0) = 1 cosh (~0.0) = 1 exp (~0.0) = 1 ln (~0.0) = ~inf log10 (~0.0) = ~inf sin (~0.0) = 0 sinh (~0.0) = 0 sqrt (~0.0) = 0 tan (~0.0) = 0 tanh (~0.0) = 0 acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 acos (~inf) = nan asin (~inf) = nan atan (~inf) = ~1.570796327 cos (~inf) = nan cosh (~inf) = ~inf exp (~inf) = 0 ln (~inf) = nan log10 (~inf) = nan sin (~inf) = nan sinh (~inf) = ~inf sqrt (~inf) = nan tan (~inf) = nan tanh (~inf) = ~1 acos (nan) = nan asin (nan) = nan atan (nan) = nan cos (nan) = nan cosh (nan) = nan exp (nan) = nan ln (nan) = nan log10 (nan) = nan sin (nan) = nan sinh (nan) = nan sqrt (nan) = nan tan (nan) = nan tanh (nan) = nan acos (inf) = nan asin (inf) = nan atan (inf) = 1.570796327 cos (inf) = nan cosh (inf) = inf exp (inf) = inf ln (inf) = inf log10 (inf) = inf sin (inf) = nan sinh (inf) = inf sqrt (inf) = inf tan (inf) = nan tanh (inf) = 1 atan2 (0.17976931348623157E309, 0.17976931348623157E309) = 0.7853981634 pow (0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (0.17976931348623157E309, 0.8988465674311579E308) = 1.107148718 pow (0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (0.17976931348623157E309, 0.123E4) = 1.570796327 pow (0.17976931348623157E309, 0.123E4) = inf atan2 (0.17976931348623157E309, 0.123E2) = 1.570796327 pow (0.17976931348623157E309, 0.123E2) = inf atan2 (0.17976931348623157E309, 0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, 0.3141592653589793E1) = inf atan2 (0.17976931348623157E309, 0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, 0.2718281828459045E1) = inf atan2 (0.17976931348623157E309, 0.123E1) = 1.570796327 pow (0.17976931348623157E309, 0.123E1) = inf atan2 (0.17976931348623157E309, 0.123) = 1.570796327 pow (0.17976931348623157E309, 0.123) = 8.228676973E37 atan2 (0.17976931348623157E309, 0.123E~2) = 1.570796327 pow (0.17976931348623157E309, 0.123E~2) = 2.394160714 atan2 (0.17976931348623157E309, 0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, 0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, 0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, 0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, 0.5E~323) = 1.570796327 pow (0.17976931348623157E309, 0.5E~323) = 1 atan2 (0.17976931348623157E309, 0.0) = 1.570796327 pow (0.17976931348623157E309, 0.0) = 1 atan2 (0.17976931348623157E309, ~0.17976931348623157E309) = 2.35619449 pow (0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (0.17976931348623157E309, ~0.8988465674311579E308) = 2.034443936 pow (0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (0.17976931348623157E309, ~0.123E4) = 1.570796327 pow (0.17976931348623157E309, ~0.123E4) = 0 atan2 (0.17976931348623157E309, ~0.123E2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E2) = 0 atan2 (0.17976931348623157E309, ~0.3141592653589793E1) = 1.570796327 pow (0.17976931348623157E309, ~0.3141592653589793E1) = 0 atan2 (0.17976931348623157E309, ~0.2718281828459045E1) = 1.570796327 pow (0.17976931348623157E309, ~0.2718281828459045E1) = 0 atan2 (0.17976931348623157E309, ~0.123E1) = 1.570796327 pow (0.17976931348623157E309, ~0.123E1) = 0 atan2 (0.17976931348623157E309, ~0.123) = 1.570796327 pow (0.17976931348623157E309, ~0.123) = 1.21526219E~38 atan2 (0.17976931348623157E309, ~0.123E~2) = 1.570796327 pow (0.17976931348623157E309, ~0.123E~2) = 0.4176829041 atan2 (0.17976931348623157E309, ~0.22250738585072014E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.22250738585072014E~307) = 1 atan2 (0.17976931348623157E309, ~0.11125369292536007E~307) = 1.570796327 pow (0.17976931348623157E309, ~0.11125369292536007E~307) = 1 atan2 (0.17976931348623157E309, ~0.5E~323) = 1.570796327 pow (0.17976931348623157E309, ~0.5E~323) = 1 atan2 (0.17976931348623157E309, ~0.0) = 1.570796327 pow (0.17976931348623157E309, ~0.0) = 1 atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.17976931348623157E309, ~inf) = 3.141592654 pow (0.17976931348623157E309, ~inf) = 0 atan2 (0.17976931348623157E309, nan) = nan pow (0.17976931348623157E309, nan) = nan atan2 (0.17976931348623157E309, inf) = 0 pow (0.17976931348623157E309, inf) = inf atan2 (0.8988465674311579E308, 0.17976931348623157E309) = 0.463647609 pow (0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (0.8988465674311579E308, 0.8988465674311579E308) = 0.7853981634 pow (0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (0.8988465674311579E308, 0.123E4) = 1.570796327 pow (0.8988465674311579E308, 0.123E4) = inf atan2 (0.8988465674311579E308, 0.123E2) = 1.570796327 pow (0.8988465674311579E308, 0.123E2) = inf atan2 (0.8988465674311579E308, 0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, 0.3141592653589793E1) = inf atan2 (0.8988465674311579E308, 0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, 0.2718281828459045E1) = inf atan2 (0.8988465674311579E308, 0.123E1) = 1.570796327 pow (0.8988465674311579E308, 0.123E1) = inf atan2 (0.8988465674311579E308, 0.123) = 1.570796327 pow (0.8988465674311579E308, 0.123) = 7.556197911E37 atan2 (0.8988465674311579E308, 0.123E~2) = 1.570796327 pow (0.8988465674311579E308, 0.123E~2) = 2.392120392 atan2 (0.8988465674311579E308, 0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, 0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, 0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, 0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, 0.5E~323) = 1.570796327 pow (0.8988465674311579E308, 0.5E~323) = 1 atan2 (0.8988465674311579E308, 0.0) = 1.570796327 pow (0.8988465674311579E308, 0.0) = 1 atan2 (0.8988465674311579E308, ~0.17976931348623157E309) = 2.677945045 pow (0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (0.8988465674311579E308, ~0.8988465674311579E308) = 2.35619449 pow (0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (0.8988465674311579E308, ~0.123E4) = 1.570796327 pow (0.8988465674311579E308, ~0.123E4) = 0 atan2 (0.8988465674311579E308, ~0.123E2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E2) = 0 atan2 (0.8988465674311579E308, ~0.3141592653589793E1) = 1.570796327 pow (0.8988465674311579E308, ~0.3141592653589793E1) = 0 atan2 (0.8988465674311579E308, ~0.2718281828459045E1) = 1.570796327 pow (0.8988465674311579E308, ~0.2718281828459045E1) = 0 atan2 (0.8988465674311579E308, ~0.123E1) = 1.570796327 pow (0.8988465674311579E308, ~0.123E1) = 0 atan2 (0.8988465674311579E308, ~0.123) = 1.570796327 pow (0.8988465674311579E308, ~0.123) = 1.323416898E~38 atan2 (0.8988465674311579E308, ~0.123E~2) = 1.570796327 pow (0.8988465674311579E308, ~0.123E~2) = 0.4180391603 atan2 (0.8988465674311579E308, ~0.22250738585072014E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.22250738585072014E~307) = 1 atan2 (0.8988465674311579E308, ~0.11125369292536007E~307) = 1.570796327 pow (0.8988465674311579E308, ~0.11125369292536007E~307) = 1 atan2 (0.8988465674311579E308, ~0.5E~323) = 1.570796327 pow (0.8988465674311579E308, ~0.5E~323) = 1 atan2 (0.8988465674311579E308, ~0.0) = 1.570796327 pow (0.8988465674311579E308, ~0.0) = 1 atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.8988465674311579E308, ~inf) = 3.141592654 pow (0.8988465674311579E308, ~inf) = 0 atan2 (0.8988465674311579E308, nan) = nan pow (0.8988465674311579E308, nan) = nan atan2 (0.8988465674311579E308, inf) = 0 pow (0.8988465674311579E308, inf) = inf atan2 (0.123E4, 0.17976931348623157E309) = 6.842102115E~306 pow (0.123E4, 0.17976931348623157E309) = inf atan2 (0.123E4, 0.8988465674311579E308) = 1.368420423E~305 pow (0.123E4, 0.8988465674311579E308) = inf atan2 (0.123E4, 0.123E4) = 0.7853981634 pow (0.123E4, 0.123E4) = inf atan2 (0.123E4, 0.123E2) = 1.56079666 pow (0.123E4, 0.123E2) = 1.013521278E38 atan2 (0.123E4, 0.3141592653589793E1) = 1.568242192 pow (0.123E4, 0.3141592653589793E1) = 5095927004 atan2 (0.123E4, 0.2718281828459045E1) = 1.568586345 pow (0.123E4, 0.2718281828459045E1) = 250745366.3 atan2 (0.123E4, 0.123E1) = 1.569796327 pow (0.123E4, 0.123E1) = 6318.053325 atan2 (0.123E4, 0.123) = 1.570696327 pow (0.123E4, 0.123) = 2.39915512 atan2 (0.123E4, 0.123E~2) = 1.570795327 pow (0.123E4, 0.123E~2) = 1.00878957 atan2 (0.123E4, 0.22250738585072014E~307) = 1.570796327 pow (0.123E4, 0.22250738585072014E~307) = 1 atan2 (0.123E4, 0.11125369292536007E~307) = 1.570796327 pow (0.123E4, 0.11125369292536007E~307) = 1 atan2 (0.123E4, 0.5E~323) = 1.570796327 pow (0.123E4, 0.5E~323) = 1 atan2 (0.123E4, 0.0) = 1.570796327 pow (0.123E4, 0.0) = 1 atan2 (0.123E4, ~0.17976931348623157E309) = 3.141592654 pow (0.123E4, ~0.17976931348623157E309) = 0 atan2 (0.123E4, ~0.8988465674311579E308) = 3.141592654 pow (0.123E4, ~0.8988465674311579E308) = 0 atan2 (0.123E4, ~0.123E4) = 2.35619449 pow (0.123E4, ~0.123E4) = 0 atan2 (0.123E4, ~0.123E2) = 1.580795993 pow (0.123E4, ~0.123E2) = 9.86659108E~39 atan2 (0.123E4, ~0.3141592653589793E1) = 1.573350462 pow (0.123E4, ~0.3141592653589793E1) = 1.9623515E~10 atan2 (0.123E4, ~0.2718281828459045E1) = 1.573006308 pow (0.123E4, ~0.2718281828459045E1) = 3.98810959E~9 atan2 (0.123E4, ~0.123E1) = 1.571796326 pow (0.123E4, ~0.123E1) = 1.582766002E~4 atan2 (0.123E4, ~0.123) = 1.570896327 pow (0.123E4, ~0.123) = 0.4168133988 atan2 (0.123E4, ~0.123E~2) = 1.570797327 pow (0.123E4, ~0.123E~2) = 0.9912870136 atan2 (0.123E4, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E4, ~0.22250738585072014E~307) = 1 atan2 (0.123E4, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E4, ~0.11125369292536007E~307) = 1 atan2 (0.123E4, ~0.5E~323) = 1.570796327 pow (0.123E4, ~0.5E~323) = 1 atan2 (0.123E4, ~0.0) = 1.570796327 pow (0.123E4, ~0.0) = 1 atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E4, ~inf) = 3.141592654 pow (0.123E4, ~inf) = 0 atan2 (0.123E4, nan) = nan pow (0.123E4, nan) = nan atan2 (0.123E4, inf) = 0 pow (0.123E4, inf) = inf atan2 (0.123E2, 0.17976931348623157E309) = 6.842102115E~308 pow (0.123E2, 0.17976931348623157E309) = inf atan2 (0.123E2, 0.8988465674311579E308) = 1.368420423E~307 pow (0.123E2, 0.8988465674311579E308) = inf atan2 (0.123E2, 0.123E4) = 0.009999666687 pow (0.123E2, 0.123E4) = inf atan2 (0.123E2, 0.123E2) = 0.7853981634 pow (0.123E2, 0.123E2) = 2.545850346E13 atan2 (0.123E2, 0.3141592653589793E1) = 1.320728626 pow (0.123E2, 0.3141592653589793E1) = 2654.83718 atan2 (0.123E2, 0.2718281828459045E1) = 1.353293796 pow (0.123E2, 0.2718281828459045E1) = 917.6334984 atan2 (0.123E2, 0.123E1) = 1.471127674 pow (0.123E2, 0.123E1) = 21.90701911 atan2 (0.123E2, 0.123) = 1.56079666 pow (0.123E2, 0.123) = 1.361627546 atan2 (0.123E2, 0.123E~2) = 1.570696327 pow (0.123E2, 0.123E~2) = 1.003091576 atan2 (0.123E2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E2, 0.22250738585072014E~307) = 1 atan2 (0.123E2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E2, 0.11125369292536007E~307) = 1 atan2 (0.123E2, 0.5E~323) = 1.570796327 pow (0.123E2, 0.5E~323) = 1 atan2 (0.123E2, 0.0) = 1.570796327 pow (0.123E2, 0.0) = 1 atan2 (0.123E2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E2, ~0.17976931348623157E309) = 0 atan2 (0.123E2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E2, ~0.8988465674311579E308) = 0 atan2 (0.123E2, ~0.123E4) = 3.131592987 pow (0.123E2, ~0.123E4) = 0 atan2 (0.123E2, ~0.123E2) = 2.35619449 pow (0.123E2, ~0.123E2) = 3.927960658E~14 atan2 (0.123E2, ~0.3141592653589793E1) = 1.820864027 pow (0.123E2, ~0.3141592653589793E1) = 3.766709339E~4 atan2 (0.123E2, ~0.2718281828459045E1) = 1.788298857 pow (0.123E2, ~0.2718281828459045E1) = 0.001089759694 atan2 (0.123E2, ~0.123E1) = 1.670464979 pow (0.123E2, ~0.123E1) = 0.04564747011 atan2 (0.123E2, ~0.123) = 1.580795993 pow (0.123E2, ~0.123) = 0.7344152246 atan2 (0.123E2, ~0.123E~2) = 1.570896327 pow (0.123E2, ~0.123E~2) = 0.9969179522 atan2 (0.123E2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E2, ~0.22250738585072014E~307) = 1 atan2 (0.123E2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E2, ~0.11125369292536007E~307) = 1 atan2 (0.123E2, ~0.5E~323) = 1.570796327 pow (0.123E2, ~0.5E~323) = 1 atan2 (0.123E2, ~0.0) = 1.570796327 pow (0.123E2, ~0.0) = 1 atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.123E2, ~inf) = 3.141592654 pow (0.123E2, ~inf) = 0 atan2 (0.123E2, nan) = nan pow (0.123E2, nan) = nan atan2 (0.123E2, inf) = 0 pow (0.123E2, inf) = inf atan2 (0.3141592653589793E1, 0.17976931348623157E309) = 1.747568922E~308 pow (0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (0.3141592653589793E1, 0.8988465674311579E308) = 3.495137844E~308 pow (0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (0.3141592653589793E1, 0.123E4) = 0.002554134815 pow (0.3141592653589793E1, 0.123E4) = inf atan2 (0.3141592653589793E1, 0.123E2) = 0.2500677004 pow (0.3141592653589793E1, 0.123E2) = 1302997.055 atan2 (0.3141592653589793E1, 0.3141592653589793E1) = 0.7853981634 pow (0.3141592653589793E1, 0.3141592653589793E1) = 36.46215961 atan2 (0.3141592653589793E1, 0.2718281828459045E1) = 0.8575117864 pow (0.3141592653589793E1, 0.2718281828459045E1) = 22.45915772 atan2 (0.3141592653589793E1, 0.123E1) = 1.197620596 pow (0.3141592653589793E1, 0.123E1) = 4.087844278 atan2 (0.3141592653589793E1, 0.123) = 1.531664198 pow (0.3141592653589793E1, 0.123) = 1.151196431 atan2 (0.3141592653589793E1, 0.123E~2) = 1.570404806 pow (0.3141592653589793E1, 0.123E~2) = 1.001409009 atan2 (0.3141592653589793E1, 0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, 0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, 0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, 0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, 0.5E~323) = 1.570796327 pow (0.3141592653589793E1, 0.5E~323) = 1 atan2 (0.3141592653589793E1, 0.0) = 1.570796327 pow (0.3141592653589793E1, 0.0) = 1 atan2 (0.3141592653589793E1, ~0.17976931348623157E309) = 3.141592654 pow (0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (0.3141592653589793E1, ~0.8988465674311579E308) = 3.141592654 pow (0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (0.3141592653589793E1, ~0.123E4) = 3.139038519 pow (0.3141592653589793E1, ~0.123E4) = 0 atan2 (0.3141592653589793E1, ~0.123E2) = 2.891524953 pow (0.3141592653589793E1, ~0.123E2) = 7.674614429E~7 atan2 (0.3141592653589793E1, ~0.3141592653589793E1) = 2.35619449 pow (0.3141592653589793E1, ~0.3141592653589793E1) = 0.02742569312 atan2 (0.3141592653589793E1, ~0.2718281828459045E1) = 2.284080867 pow (0.3141592653589793E1, ~0.2718281828459045E1) = 0.04452526727 atan2 (0.3141592653589793E1, ~0.123E1) = 1.943972057 pow (0.3141592653589793E1, ~0.123E1) = 0.2446277138 atan2 (0.3141592653589793E1, ~0.123) = 1.609928456 pow (0.3141592653589793E1, ~0.123) = 0.8686614842 atan2 (0.3141592653589793E1, ~0.123E~2) = 1.571187848 pow (0.3141592653589793E1, ~0.123E~2) = 0.998592973 atan2 (0.3141592653589793E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.22250738585072014E~307) = 1 atan2 (0.3141592653589793E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.3141592653589793E1, ~0.11125369292536007E~307) = 1 atan2 (0.3141592653589793E1, ~0.5E~323) = 1.570796327 pow (0.3141592653589793E1, ~0.5E~323) = 1 atan2 (0.3141592653589793E1, ~0.0) = 1.570796327 pow (0.3141592653589793E1, ~0.0) = 1 atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.3141592653589793E1, ~inf) = 3.141592654 pow (0.3141592653589793E1, ~inf) = 0 atan2 (0.3141592653589793E1, nan) = nan pow (0.3141592653589793E1, nan) = nan atan2 (0.3141592653589793E1, inf) = 0 pow (0.3141592653589793E1, inf) = inf atan2 (0.2718281828459045E1, 0.17976931348623157E309) = 1.512094459E~308 pow (0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (0.2718281828459045E1, 0.8988465674311579E308) = 3.024188918E~308 pow (0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (0.2718281828459045E1, 0.123E4) = 0.002209981629 pow (0.2718281828459045E1, 0.123E4) = inf atan2 (0.2718281828459045E1, 0.123E2) = 0.2175025304 pow (0.2718281828459045E1, 0.123E2) = 219695.9887 atan2 (0.2718281828459045E1, 0.3141592653589793E1) = 0.7132845404 pow (0.2718281828459045E1, 0.3141592653589793E1) = 23.14069263 atan2 (0.2718281828459045E1, 0.2718281828459045E1) = 0.7853981634 pow (0.2718281828459045E1, 0.2718281828459045E1) = 15.15426224 atan2 (0.2718281828459045E1, 0.123E1) = 1.145872224 pow (0.2718281828459045E1, 0.123E1) = 3.421229536 atan2 (0.2718281828459045E1, 0.123) = 1.525578 pow (0.2718281828459045E1, 0.123) = 1.130884421 atan2 (0.2718281828459045E1, 0.123E~2) = 1.570343835 pow (0.2718281828459045E1, 0.123E~2) = 1.001230757 atan2 (0.2718281828459045E1, 0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, 0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, 0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, 0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, 0.5E~323) = 1.570796327 pow (0.2718281828459045E1, 0.5E~323) = 1 atan2 (0.2718281828459045E1, 0.0) = 1.570796327 pow (0.2718281828459045E1, 0.0) = 1 atan2 (0.2718281828459045E1, ~0.17976931348623157E309) = 3.141592654 pow (0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (0.2718281828459045E1, ~0.8988465674311579E308) = 3.141592654 pow (0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (0.2718281828459045E1, ~0.123E4) = 3.139382672 pow (0.2718281828459045E1, ~0.123E4) = 0 atan2 (0.2718281828459045E1, ~0.123E2) = 2.924090123 pow (0.2718281828459045E1, ~0.123E2) = 4.551744463E~6 atan2 (0.2718281828459045E1, ~0.3141592653589793E1) = 2.428308113 pow (0.2718281828459045E1, ~0.3141592653589793E1) = 0.04321391826 atan2 (0.2718281828459045E1, ~0.2718281828459045E1) = 2.35619449 pow (0.2718281828459045E1, ~0.2718281828459045E1) = 0.06598803585 atan2 (0.2718281828459045E1, ~0.123E1) = 1.99572043 pow (0.2718281828459045E1, ~0.123E1) = 0.2922925777 atan2 (0.2718281828459045E1, ~0.123) = 1.616014654 pow (0.2718281828459045E1, ~0.123) = 0.8842636626 atan2 (0.2718281828459045E1, ~0.123E~2) = 1.571248818 pow (0.2718281828459045E1, ~0.123E~2) = 0.9987707561 atan2 (0.2718281828459045E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.22250738585072014E~307) = 1 atan2 (0.2718281828459045E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.2718281828459045E1, ~0.11125369292536007E~307) = 1 atan2 (0.2718281828459045E1, ~0.5E~323) = 1.570796327 pow (0.2718281828459045E1, ~0.5E~323) = 1 atan2 (0.2718281828459045E1, ~0.0) = 1.570796327 pow (0.2718281828459045E1, ~0.0) = 1 atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.2718281828459045E1, ~inf) = 3.141592654 pow (0.2718281828459045E1, ~inf) = 0 atan2 (0.2718281828459045E1, nan) = nan pow (0.2718281828459045E1, nan) = nan atan2 (0.2718281828459045E1, inf) = 0 pow (0.2718281828459045E1, inf) = inf atan2 (0.123E1, 0.17976931348623157E309) = 6.842102115E~309 pow (0.123E1, 0.17976931348623157E309) = inf atan2 (0.123E1, 0.8988465674311579E308) = 1.368420423E~308 pow (0.123E1, 0.8988465674311579E308) = inf atan2 (0.123E1, 0.123E4) = 9.999996667E~4 pow (0.123E1, 0.123E4) = 3.830778757E110 atan2 (0.123E1, 0.123E2) = 0.09966865249 pow (0.123E1, 0.123E2) = 12.75947692 atan2 (0.123E1, 0.3141592653589793E1) = 0.3731757303 pow (0.123E1, 0.3141592653589793E1) = 1.916219422 atan2 (0.123E1, 0.2718281828459045E1) = 0.4249241031 pow (0.123E1, 0.2718281828459045E1) = 1.755445823 atan2 (0.123E1, 0.123E1) = 0.7853981634 pow (0.123E1, 0.123E1) = 1.289980921 atan2 (0.123E1, 0.123) = 1.471127674 pow (0.123E1, 0.123) = 1.025789688 atan2 (0.123E1, 0.123E~2) = 1.569796327 pow (0.123E1, 0.123E~2) = 1.00025466 atan2 (0.123E1, 0.22250738585072014E~307) = 1.570796327 pow (0.123E1, 0.22250738585072014E~307) = 1 atan2 (0.123E1, 0.11125369292536007E~307) = 1.570796327 pow (0.123E1, 0.11125369292536007E~307) = 1 atan2 (0.123E1, 0.5E~323) = 1.570796327 pow (0.123E1, 0.5E~323) = 1 atan2 (0.123E1, 0.0) = 1.570796327 pow (0.123E1, 0.0) = 1 atan2 (0.123E1, ~0.17976931348623157E309) = 3.141592654 pow (0.123E1, ~0.17976931348623157E309) = 0 atan2 (0.123E1, ~0.8988465674311579E308) = 3.141592654 pow (0.123E1, ~0.8988465674311579E308) = 0 atan2 (0.123E1, ~0.123E4) = 3.140592654 pow (0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (0.123E1, ~0.123E2) = 3.041924001 pow (0.123E1, ~0.123E2) = 0.07837311876 atan2 (0.123E1, ~0.3141592653589793E1) = 2.768416923 pow (0.123E1, ~0.3141592653589793E1) = 0.5218609042 atan2 (0.123E1, ~0.2718281828459045E1) = 2.71666855 pow (0.123E1, ~0.2718281828459045E1) = 0.56965586 atan2 (0.123E1, ~0.123E1) = 2.35619449 pow (0.123E1, ~0.123E1) = 0.7752052637 atan2 (0.123E1, ~0.123) = 1.670464979 pow (0.123E1, ~0.123) = 0.9748586988 atan2 (0.123E1, ~0.123E~2) = 1.571796326 pow (0.123E1, ~0.123E~2) = 0.999745405 atan2 (0.123E1, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E1, ~0.22250738585072014E~307) = 1 atan2 (0.123E1, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E1, ~0.11125369292536007E~307) = 1 atan2 (0.123E1, ~0.5E~323) = 1.570796327 pow (0.123E1, ~0.5E~323) = 1 atan2 (0.123E1, ~0.0) = 1.570796327 pow (0.123E1, ~0.0) = 1 atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123E1, ~inf) = 3.141592654 pow (0.123E1, ~inf) = 0 atan2 (0.123E1, nan) = nan pow (0.123E1, nan) = nan atan2 (0.123E1, inf) = 0 pow (0.123E1, inf) = inf atan2 (0.123, 0.17976931348623157E309) = 6.842102115E~310 pow (0.123, 0.17976931348623157E309) = 0 atan2 (0.123, 0.8988465674311579E308) = 1.368420423E~309 pow (0.123, 0.8988465674311579E308) = 0 atan2 (0.123, 0.123E4) = 9.999999967E~5 pow (0.123, 0.123E4) = 0 atan2 (0.123, 0.123E2) = 0.009999666687 pow (0.123, 0.123E2) = 6.394886941E~12 atan2 (0.123, 0.3141592653589793E1) = 0.03913212911 pow (0.123, 0.3141592653589793E1) = 0.001383096824 atan2 (0.123, 0.2718281828459045E1) = 0.04521832678 pow (0.123, 0.2718281828459045E1) = 0.003358192615 atan2 (0.123, 0.123E1) = 0.09966865249 pow (0.123, 0.123E1) = 0.07595970809 atan2 (0.123, 0.123) = 0.7853981634 pow (0.123, 0.123) = 0.7727843683 atan2 (0.123, 0.123E~2) = 1.56079666 pow (0.123, 0.123E~2) = 0.9974257668 atan2 (0.123, 0.22250738585072014E~307) = 1.570796327 pow (0.123, 0.22250738585072014E~307) = 1 atan2 (0.123, 0.11125369292536007E~307) = 1.570796327 pow (0.123, 0.11125369292536007E~307) = 1 atan2 (0.123, 0.5E~323) = 1.570796327 pow (0.123, 0.5E~323) = 1 atan2 (0.123, 0.0) = 1.570796327 pow (0.123, 0.0) = 1 atan2 (0.123, ~0.17976931348623157E309) = 3.141592654 pow (0.123, ~0.17976931348623157E309) = inf atan2 (0.123, ~0.8988465674311579E308) = 3.141592654 pow (0.123, ~0.8988465674311579E308) = inf atan2 (0.123, ~0.123E4) = 3.141492654 pow (0.123, ~0.123E4) = inf atan2 (0.123, ~0.123E2) = 3.131592987 pow (0.123, ~0.123E2) = 156374930400 atan2 (0.123, ~0.3141592653589793E1) = 3.102460524 pow (0.123, ~0.3141592653589793E1) = 723.0151807 atan2 (0.123, ~0.2718281828459045E1) = 3.096374327 pow (0.123, ~0.2718281828459045E1) = 297.7792267 atan2 (0.123, ~0.123E1) = 3.041924001 pow (0.123, ~0.123E1) = 13.16487418 atan2 (0.123, ~0.123) = 2.35619449 pow (0.123, ~0.123) = 1.294022034 atan2 (0.123, ~0.123E~2) = 1.580795993 pow (0.123, ~0.123E~2) = 1.002580877 atan2 (0.123, ~0.22250738585072014E~307) = 1.570796327 pow (0.123, ~0.22250738585072014E~307) = 1 atan2 (0.123, ~0.11125369292536007E~307) = 1.570796327 pow (0.123, ~0.11125369292536007E~307) = 1 atan2 (0.123, ~0.5E~323) = 1.570796327 pow (0.123, ~0.5E~323) = 1 atan2 (0.123, ~0.0) = 1.570796327 pow (0.123, ~0.0) = 1 atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123, ~inf) = 3.141592654 pow (0.123, ~inf) = inf atan2 (0.123, nan) = nan pow (0.123, nan) = nan atan2 (0.123, inf) = 0 pow (0.123, inf) = 0 atan2 (0.123E~2, 0.17976931348623157E309) = 6.842102115E~312 pow (0.123E~2, 0.17976931348623157E309) = 0 atan2 (0.123E~2, 0.8988465674311579E308) = 1.368420423E~311 pow (0.123E~2, 0.8988465674311579E308) = 0 atan2 (0.123E~2, 0.123E4) = 1E~6 pow (0.123E~2, 0.123E4) = 0 atan2 (0.123E~2, 0.123E2) = 9.999999967E~5 pow (0.123E~2, 0.123E2) = 1.606322974E~36 atan2 (0.123E~2, 0.3141592653589793E1) = 3.9152114E~4 pow (0.123E~2, 0.3141592653589793E1) = 7.205552335E~10 atan2 (0.123E~2, 0.2718281828459045E1) = 4.524916818E~4 pow (0.123E~2, 0.2718281828459045E1) = 1.228971878E~8 atan2 (0.123E~2, 0.123E1) = 9.999996667E~4 pow (0.123E~2, 0.123E1) = 2.633802994E~4 atan2 (0.123E~2, 0.123) = 0.009999666687 pow (0.123E~2, 0.123) = 0.4385895994 atan2 (0.123E~2, 0.123E~2) = 0.7853981634 pow (0.123E~2, 0.123E~2) = 0.9917919599 atan2 (0.123E~2, 0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, 0.22250738585072014E~307) = 1 atan2 (0.123E~2, 0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, 0.11125369292536007E~307) = 1 atan2 (0.123E~2, 0.5E~323) = 1.570796327 pow (0.123E~2, 0.5E~323) = 1 atan2 (0.123E~2, 0.0) = 1.570796327 pow (0.123E~2, 0.0) = 1 atan2 (0.123E~2, ~0.17976931348623157E309) = 3.141592654 pow (0.123E~2, ~0.17976931348623157E309) = inf atan2 (0.123E~2, ~0.8988465674311579E308) = 3.141592654 pow (0.123E~2, ~0.8988465674311579E308) = inf atan2 (0.123E~2, ~0.123E4) = 3.141591654 pow (0.123E~2, ~0.123E4) = inf atan2 (0.123E~2, ~0.123E2) = 3.141492654 pow (0.123E~2, ~0.123E2) = 6.225398107E35 atan2 (0.123E~2, ~0.3141592653589793E1) = 3.141201132 pow (0.123E~2, ~0.3141592653589793E1) = 1387818662 atan2 (0.123E~2, ~0.2718281828459045E1) = 3.141140162 pow (0.123E~2, ~0.2718281828459045E1) = 81368826.88 atan2 (0.123E~2, ~0.123E1) = 3.140592654 pow (0.123E~2, ~0.123E1) = 3796.791188 atan2 (0.123E~2, ~0.123) = 3.131592987 pow (0.123E~2, ~0.123) = 2.280035827 atan2 (0.123E~2, ~0.123E~2) = 2.35619449 pow (0.123E~2, ~0.123E~2) = 1.00827597 atan2 (0.123E~2, ~0.22250738585072014E~307) = 1.570796327 pow (0.123E~2, ~0.22250738585072014E~307) = 1 atan2 (0.123E~2, ~0.11125369292536007E~307) = 1.570796327 pow (0.123E~2, ~0.11125369292536007E~307) = 1 atan2 (0.123E~2, ~0.5E~323) = 1.570796327 pow (0.123E~2, ~0.5E~323) = 1 atan2 (0.123E~2, ~0.0) = 1.570796327 pow (0.123E~2, ~0.0) = 1 atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.123E~2, ~inf) = 3.141592654 pow (0.123E~2, ~inf) = inf atan2 (0.123E~2, nan) = nan pow (0.123E~2, nan) = nan atan2 (0.123E~2, inf) = 0 pow (0.123E~2, inf) = 0 atan2 (0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (0.22250738585072014E~307, 0.123E4) = 1.809003137E~311 pow (0.22250738585072014E~307, 0.123E4) = 0 atan2 (0.22250738585072014E~307, 0.123E2) = 1.809003137E~309 pow (0.22250738585072014E~307, 0.123E2) = 0 atan2 (0.22250738585072014E~307, 0.3141592653589793E1) = 7.082630067E~309 pow (0.22250738585072014E~307, 0.3141592653589793E1) = 0 atan2 (0.22250738585072014E~307, 0.2718281828459045E1) = 8.185589276E~309 pow (0.22250738585072014E~307, 0.2718281828459045E1) = 0 atan2 (0.22250738585072014E~307, 0.123E1) = 1.809003137E~308 pow (0.22250738585072014E~307, 0.123E1) = 0 atan2 (0.22250738585072014E~307, 0.123) = 1.809003137E~307 pow (0.22250738585072014E~307, 0.123) = 1.441197052E~38 atan2 (0.22250738585072014E~307, 0.123E~2) = 1.809003137E~305 pow (0.22250738585072014E~307, 0.123E~2) = 0.4183957204 atan2 (0.22250738585072014E~307, 0.22250738585072014E~307) = 0.7853981634 pow (0.22250738585072014E~307, 0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, 0.11125369292536007E~307) = 1.107148718 pow (0.22250738585072014E~307, 0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, 0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, 0.5E~323) = 1 atan2 (0.22250738585072014E~307, 0.0) = 1.570796327 pow (0.22250738585072014E~307, 0.0) = 1 atan2 (0.22250738585072014E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (0.22250738585072014E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (0.22250738585072014E~307, ~0.123E4) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E4) = inf atan2 (0.22250738585072014E~307, ~0.123E2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E2) = inf atan2 (0.22250738585072014E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.3141592653589793E1) = inf atan2 (0.22250738585072014E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.2718281828459045E1) = inf atan2 (0.22250738585072014E~307, ~0.123E1) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E1) = inf atan2 (0.22250738585072014E~307, ~0.123) = 3.141592654 pow (0.22250738585072014E~307, ~0.123) = 6.93867642E37 atan2 (0.22250738585072014E~307, ~0.123E~2) = 3.141592654 pow (0.22250738585072014E~307, ~0.123E~2) = 2.390081808 atan2 (0.22250738585072014E~307, ~0.22250738585072014E~307) = 2.35619449 pow (0.22250738585072014E~307, ~0.22250738585072014E~307) = 1 atan2 (0.22250738585072014E~307, ~0.11125369292536007E~307) = 2.034443936 pow (0.22250738585072014E~307, ~0.11125369292536007E~307) = 1 atan2 (0.22250738585072014E~307, ~0.5E~323) = 1.570796327 pow (0.22250738585072014E~307, ~0.5E~323) = 1 atan2 (0.22250738585072014E~307, ~0.0) = 1.570796327 pow (0.22250738585072014E~307, ~0.0) = 1 atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.22250738585072014E~307, ~inf) = 3.141592654 pow (0.22250738585072014E~307, ~inf) = inf atan2 (0.22250738585072014E~307, nan) = nan pow (0.22250738585072014E~307, nan) = nan atan2 (0.22250738585072014E~307, inf) = 0 pow (0.22250738585072014E~307, inf) = 0 atan2 (0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (0.11125369292536007E~307, 0.123E4) = 9.045015685E~312 pow (0.11125369292536007E~307, 0.123E4) = 0 atan2 (0.11125369292536007E~307, 0.123E2) = 9.045015685E~310 pow (0.11125369292536007E~307, 0.123E2) = 0 atan2 (0.11125369292536007E~307, 0.3141592653589793E1) = 3.541315033E~309 pow (0.11125369292536007E~307, 0.3141592653589793E1) = 0 atan2 (0.11125369292536007E~307, 0.2718281828459045E1) = 4.092794638E~309 pow (0.11125369292536007E~307, 0.2718281828459045E1) = 0 atan2 (0.11125369292536007E~307, 0.123E1) = 9.045015685E~309 pow (0.11125369292536007E~307, 0.123E1) = 0 atan2 (0.11125369292536007E~307, 0.123) = 9.045015685E~308 pow (0.11125369292536007E~307, 0.123) = 1.323416898E~38 atan2 (0.11125369292536007E~307, 0.123E~2) = 9.045015685E~306 pow (0.11125369292536007E~307, 0.123E~2) = 0.4180391603 atan2 (0.11125369292536007E~307, 0.22250738585072014E~307) = 0.463647609 pow (0.11125369292536007E~307, 0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, 0.11125369292536007E~307) = 0.7853981634 pow (0.11125369292536007E~307, 0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, 0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, 0.5E~323) = 1 atan2 (0.11125369292536007E~307, 0.0) = 1.570796327 pow (0.11125369292536007E~307, 0.0) = 1 atan2 (0.11125369292536007E~307, ~0.17976931348623157E309) = 3.141592654 pow (0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (0.11125369292536007E~307, ~0.8988465674311579E308) = 3.141592654 pow (0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (0.11125369292536007E~307, ~0.123E4) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E4) = inf atan2 (0.11125369292536007E~307, ~0.123E2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E2) = inf atan2 (0.11125369292536007E~307, ~0.3141592653589793E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.3141592653589793E1) = inf atan2 (0.11125369292536007E~307, ~0.2718281828459045E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.2718281828459045E1) = inf atan2 (0.11125369292536007E~307, ~0.123E1) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E1) = inf atan2 (0.11125369292536007E~307, ~0.123) = 3.141592654 pow (0.11125369292536007E~307, ~0.123) = 7.556197911E37 atan2 (0.11125369292536007E~307, ~0.123E~2) = 3.141592654 pow (0.11125369292536007E~307, ~0.123E~2) = 2.392120392 atan2 (0.11125369292536007E~307, ~0.22250738585072014E~307) = 2.677945045 pow (0.11125369292536007E~307, ~0.22250738585072014E~307) = 1 atan2 (0.11125369292536007E~307, ~0.11125369292536007E~307) = 2.35619449 pow (0.11125369292536007E~307, ~0.11125369292536007E~307) = 1 atan2 (0.11125369292536007E~307, ~0.5E~323) = 1.570796327 pow (0.11125369292536007E~307, ~0.5E~323) = 1 atan2 (0.11125369292536007E~307, ~0.0) = 1.570796327 pow (0.11125369292536007E~307, ~0.0) = 1 atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.11125369292536007E~307, ~inf) = 3.141592654 pow (0.11125369292536007E~307, ~inf) = inf atan2 (0.11125369292536007E~307, nan) = nan pow (0.11125369292536007E~307, nan) = nan atan2 (0.11125369292536007E~307, inf) = 0 pow (0.11125369292536007E~307, inf) = 0 atan2 (0.5E~323, 0.17976931348623157E309) = 0 pow (0.5E~323, 0.17976931348623157E309) = 0 atan2 (0.5E~323, 0.8988465674311579E308) = 0 pow (0.5E~323, 0.8988465674311579E308) = 0 atan2 (0.5E~323, 0.123E4) = 0 pow (0.5E~323, 0.123E4) = 0 atan2 (0.5E~323, 0.123E2) = 0 pow (0.5E~323, 0.123E2) = 0 atan2 (0.5E~323, 0.3141592653589793E1) = 0 pow (0.5E~323, 0.3141592653589793E1) = 0 atan2 (0.5E~323, 0.2718281828459045E1) = 0 pow (0.5E~323, 0.2718281828459045E1) = 0 atan2 (0.5E~323, 0.123E1) = 4.940656458E~324 pow (0.5E~323, 0.123E1) = 0 atan2 (0.5E~323, 0.123) = 3.952525167E~323 pow (0.5E~323, 0.123) = 1.711336892E~40 atan2 (0.5E~323, 0.123E~2) = 4.016753701E~321 pow (0.5E~323, 0.123E~2) = 0.4002518566 atan2 (0.5E~323, 0.22250738585072014E~307) = 2.220446049E~16 pow (0.5E~323, 0.22250738585072014E~307) = 1 atan2 (0.5E~323, 0.11125369292536007E~307) = 4.440892099E~16 pow (0.5E~323, 0.11125369292536007E~307) = 1 atan2 (0.5E~323, 0.5E~323) = 0.7853981634 pow (0.5E~323, 0.5E~323) = 1 atan2 (0.5E~323, 0.0) = 1.570796327 pow (0.5E~323, 0.0) = 1 atan2 (0.5E~323, ~0.17976931348623157E309) = 3.141592654 pow (0.5E~323, ~0.17976931348623157E309) = inf atan2 (0.5E~323, ~0.8988465674311579E308) = 3.141592654 pow (0.5E~323, ~0.8988465674311579E308) = inf atan2 (0.5E~323, ~0.123E4) = 3.141592654 pow (0.5E~323, ~0.123E4) = inf atan2 (0.5E~323, ~0.123E2) = 3.141592654 pow (0.5E~323, ~0.123E2) = inf atan2 (0.5E~323, ~0.3141592653589793E1) = 3.141592654 pow (0.5E~323, ~0.3141592653589793E1) = inf atan2 (0.5E~323, ~0.2718281828459045E1) = 3.141592654 pow (0.5E~323, ~0.2718281828459045E1) = inf atan2 (0.5E~323, ~0.123E1) = 3.141592654 pow (0.5E~323, ~0.123E1) = inf atan2 (0.5E~323, ~0.123) = 3.141592654 pow (0.5E~323, ~0.123) = 5.843384809E39 atan2 (0.5E~323, ~0.123E~2) = 3.141592654 pow (0.5E~323, ~0.123E~2) = 2.498426887 atan2 (0.5E~323, ~0.22250738585072014E~307) = 3.141592654 pow (0.5E~323, ~0.22250738585072014E~307) = 1 atan2 (0.5E~323, ~0.11125369292536007E~307) = 3.141592654 pow (0.5E~323, ~0.11125369292536007E~307) = 1 atan2 (0.5E~323, ~0.5E~323) = 2.35619449 pow (0.5E~323, ~0.5E~323) = 1 atan2 (0.5E~323, ~0.0) = 1.570796327 pow (0.5E~323, ~0.0) = 1 atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.5E~323, ~inf) = 3.141592654 pow (0.5E~323, ~inf) = inf atan2 (0.5E~323, nan) = nan pow (0.5E~323, nan) = nan atan2 (0.5E~323, inf) = 0 pow (0.5E~323, inf) = 0 atan2 (0.0, 0.17976931348623157E309) = 0 pow (0.0, 0.17976931348623157E309) = 0 atan2 (0.0, 0.8988465674311579E308) = 0 pow (0.0, 0.8988465674311579E308) = 0 atan2 (0.0, 0.123E4) = 0 pow (0.0, 0.123E4) = 0 atan2 (0.0, 0.123E2) = 0 pow (0.0, 0.123E2) = 0 atan2 (0.0, 0.3141592653589793E1) = 0 pow (0.0, 0.3141592653589793E1) = 0 atan2 (0.0, 0.2718281828459045E1) = 0 pow (0.0, 0.2718281828459045E1) = 0 atan2 (0.0, 0.123E1) = 0 pow (0.0, 0.123E1) = 0 atan2 (0.0, 0.123) = 0 pow (0.0, 0.123) = 0 atan2 (0.0, 0.123E~2) = 0 pow (0.0, 0.123E~2) = 0 atan2 (0.0, 0.22250738585072014E~307) = 0 pow (0.0, 0.22250738585072014E~307) = 0 atan2 (0.0, 0.11125369292536007E~307) = 0 pow (0.0, 0.11125369292536007E~307) = 0 atan2 (0.0, 0.5E~323) = 0 pow (0.0, 0.5E~323) = 0 atan2 (0.0, 0.0) = 0 pow (0.0, 0.0) = 1 atan2 (0.0, ~0.17976931348623157E309) = 3.141592654 pow (0.0, ~0.17976931348623157E309) = inf atan2 (0.0, ~0.8988465674311579E308) = 3.141592654 pow (0.0, ~0.8988465674311579E308) = inf atan2 (0.0, ~0.123E4) = 3.141592654 pow (0.0, ~0.123E4) = inf atan2 (0.0, ~0.123E2) = 3.141592654 pow (0.0, ~0.123E2) = inf atan2 (0.0, ~0.3141592653589793E1) = 3.141592654 pow (0.0, ~0.3141592653589793E1) = inf atan2 (0.0, ~0.2718281828459045E1) = 3.141592654 pow (0.0, ~0.2718281828459045E1) = inf atan2 (0.0, ~0.123E1) = 3.141592654 pow (0.0, ~0.123E1) = inf atan2 (0.0, ~0.123) = 3.141592654 pow (0.0, ~0.123) = inf atan2 (0.0, ~0.123E~2) = 3.141592654 pow (0.0, ~0.123E~2) = inf atan2 (0.0, ~0.22250738585072014E~307) = 3.141592654 pow (0.0, ~0.22250738585072014E~307) = inf atan2 (0.0, ~0.11125369292536007E~307) = 3.141592654 pow (0.0, ~0.11125369292536007E~307) = inf atan2 (0.0, ~0.5E~323) = 3.141592654 pow (0.0, ~0.5E~323) = inf atan2 (0.0, ~0.0) = 3.141592654 pow (0.0, ~0.0) = 1 atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (0.0, ~inf) = 3.141592654 pow (0.0, ~inf) = inf atan2 (0.0, nan) = nan pow (0.0, nan) = nan atan2 (0.0, inf) = 0 pow (0.0, inf) = 0 atan2 (~0.17976931348623157E309, 0.17976931348623157E309) = ~0.7853981634 pow (~0.17976931348623157E309, 0.17976931348623157E309) = inf atan2 (~0.17976931348623157E309, 0.8988465674311579E308) = ~1.107148718 pow (~0.17976931348623157E309, 0.8988465674311579E308) = inf atan2 (~0.17976931348623157E309, 0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E4) = inf atan2 (~0.17976931348623157E309, 0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E2) = nan atan2 (~0.17976931348623157E309, 0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, 0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, 0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E1) = nan atan2 (~0.17976931348623157E309, 0.123) = ~1.570796327 pow (~0.17976931348623157E309, 0.123) = nan atan2 (~0.17976931348623157E309, 0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, 0.123E~2) = nan atan2 (~0.17976931348623157E309, 0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, 0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, 0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, 0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, 0.5E~323) = nan atan2 (~0.17976931348623157E309, 0.0) = ~1.570796327 pow (~0.17976931348623157E309, 0.0) = 1 atan2 (~0.17976931348623157E309, ~0.17976931348623157E309) = ~2.35619449 pow (~0.17976931348623157E309, ~0.17976931348623157E309) = 0 atan2 (~0.17976931348623157E309, ~0.8988465674311579E308) = ~2.034443936 pow (~0.17976931348623157E309, ~0.8988465674311579E308) = 0 atan2 (~0.17976931348623157E309, ~0.123E4) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E4) = 0 atan2 (~0.17976931348623157E309, ~0.123E2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E2) = nan atan2 (~0.17976931348623157E309, ~0.3141592653589793E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.3141592653589793E1) = nan atan2 (~0.17976931348623157E309, ~0.2718281828459045E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.2718281828459045E1) = nan atan2 (~0.17976931348623157E309, ~0.123E1) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E1) = nan atan2 (~0.17976931348623157E309, ~0.123) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123) = nan atan2 (~0.17976931348623157E309, ~0.123E~2) = ~1.570796327 pow (~0.17976931348623157E309, ~0.123E~2) = nan atan2 (~0.17976931348623157E309, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.22250738585072014E~307) = nan atan2 (~0.17976931348623157E309, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.17976931348623157E309, ~0.11125369292536007E~307) = nan atan2 (~0.17976931348623157E309, ~0.5E~323) = ~1.570796327 pow (~0.17976931348623157E309, ~0.5E~323) = nan atan2 (~0.17976931348623157E309, ~0.0) = ~1.570796327 pow (~0.17976931348623157E309, ~0.0) = 1 atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.17976931348623157E309, ~inf) = ~3.141592654 pow (~0.17976931348623157E309, ~inf) = 0 atan2 (~0.17976931348623157E309, nan) = nan pow (~0.17976931348623157E309, nan) = nan atan2 (~0.17976931348623157E309, inf) = 0 pow (~0.17976931348623157E309, inf) = inf atan2 (~0.8988465674311579E308, 0.17976931348623157E309) = ~0.463647609 pow (~0.8988465674311579E308, 0.17976931348623157E309) = inf atan2 (~0.8988465674311579E308, 0.8988465674311579E308) = ~0.7853981634 pow (~0.8988465674311579E308, 0.8988465674311579E308) = inf atan2 (~0.8988465674311579E308, 0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E4) = inf atan2 (~0.8988465674311579E308, 0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E2) = nan atan2 (~0.8988465674311579E308, 0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, 0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, 0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E1) = nan atan2 (~0.8988465674311579E308, 0.123) = ~1.570796327 pow (~0.8988465674311579E308, 0.123) = nan atan2 (~0.8988465674311579E308, 0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, 0.123E~2) = nan atan2 (~0.8988465674311579E308, 0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, 0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, 0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, 0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, 0.5E~323) = nan atan2 (~0.8988465674311579E308, 0.0) = ~1.570796327 pow (~0.8988465674311579E308, 0.0) = 1 atan2 (~0.8988465674311579E308, ~0.17976931348623157E309) = ~2.677945045 pow (~0.8988465674311579E308, ~0.17976931348623157E309) = 0 atan2 (~0.8988465674311579E308, ~0.8988465674311579E308) = ~2.35619449 pow (~0.8988465674311579E308, ~0.8988465674311579E308) = 0 atan2 (~0.8988465674311579E308, ~0.123E4) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E4) = 0 atan2 (~0.8988465674311579E308, ~0.123E2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E2) = nan atan2 (~0.8988465674311579E308, ~0.3141592653589793E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.3141592653589793E1) = nan atan2 (~0.8988465674311579E308, ~0.2718281828459045E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.2718281828459045E1) = nan atan2 (~0.8988465674311579E308, ~0.123E1) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E1) = nan atan2 (~0.8988465674311579E308, ~0.123) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123) = nan atan2 (~0.8988465674311579E308, ~0.123E~2) = ~1.570796327 pow (~0.8988465674311579E308, ~0.123E~2) = nan atan2 (~0.8988465674311579E308, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.22250738585072014E~307) = nan atan2 (~0.8988465674311579E308, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.8988465674311579E308, ~0.11125369292536007E~307) = nan atan2 (~0.8988465674311579E308, ~0.5E~323) = ~1.570796327 pow (~0.8988465674311579E308, ~0.5E~323) = nan atan2 (~0.8988465674311579E308, ~0.0) = ~1.570796327 pow (~0.8988465674311579E308, ~0.0) = 1 atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.8988465674311579E308, ~inf) = ~3.141592654 pow (~0.8988465674311579E308, ~inf) = 0 atan2 (~0.8988465674311579E308, nan) = nan pow (~0.8988465674311579E308, nan) = nan atan2 (~0.8988465674311579E308, inf) = 0 pow (~0.8988465674311579E308, inf) = inf atan2 (~0.123E4, 0.17976931348623157E309) = ~6.842102115E~306 pow (~0.123E4, 0.17976931348623157E309) = inf atan2 (~0.123E4, 0.8988465674311579E308) = ~1.368420423E~305 pow (~0.123E4, 0.8988465674311579E308) = inf atan2 (~0.123E4, 0.123E4) = ~0.7853981634 pow (~0.123E4, 0.123E4) = inf atan2 (~0.123E4, 0.123E2) = ~1.56079666 pow (~0.123E4, 0.123E2) = nan atan2 (~0.123E4, 0.3141592653589793E1) = ~1.568242192 pow (~0.123E4, 0.3141592653589793E1) = nan atan2 (~0.123E4, 0.2718281828459045E1) = ~1.568586345 pow (~0.123E4, 0.2718281828459045E1) = nan atan2 (~0.123E4, 0.123E1) = ~1.569796327 pow (~0.123E4, 0.123E1) = nan atan2 (~0.123E4, 0.123) = ~1.570696327 pow (~0.123E4, 0.123) = nan atan2 (~0.123E4, 0.123E~2) = ~1.570795327 pow (~0.123E4, 0.123E~2) = nan atan2 (~0.123E4, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, 0.22250738585072014E~307) = nan atan2 (~0.123E4, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, 0.11125369292536007E~307) = nan atan2 (~0.123E4, 0.5E~323) = ~1.570796327 pow (~0.123E4, 0.5E~323) = nan atan2 (~0.123E4, 0.0) = ~1.570796327 pow (~0.123E4, 0.0) = 1 atan2 (~0.123E4, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E4, ~0.17976931348623157E309) = 0 atan2 (~0.123E4, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E4, ~0.8988465674311579E308) = 0 atan2 (~0.123E4, ~0.123E4) = ~2.35619449 pow (~0.123E4, ~0.123E4) = 0 atan2 (~0.123E4, ~0.123E2) = ~1.580795993 pow (~0.123E4, ~0.123E2) = nan atan2 (~0.123E4, ~0.3141592653589793E1) = ~1.573350462 pow (~0.123E4, ~0.3141592653589793E1) = nan atan2 (~0.123E4, ~0.2718281828459045E1) = ~1.573006308 pow (~0.123E4, ~0.2718281828459045E1) = nan atan2 (~0.123E4, ~0.123E1) = ~1.571796326 pow (~0.123E4, ~0.123E1) = nan atan2 (~0.123E4, ~0.123) = ~1.570896327 pow (~0.123E4, ~0.123) = nan atan2 (~0.123E4, ~0.123E~2) = ~1.570797327 pow (~0.123E4, ~0.123E~2) = nan atan2 (~0.123E4, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E4, ~0.22250738585072014E~307) = nan atan2 (~0.123E4, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E4, ~0.11125369292536007E~307) = nan atan2 (~0.123E4, ~0.5E~323) = ~1.570796327 pow (~0.123E4, ~0.5E~323) = nan atan2 (~0.123E4, ~0.0) = ~1.570796327 pow (~0.123E4, ~0.0) = 1 atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E4, ~inf) = ~3.141592654 pow (~0.123E4, ~inf) = 0 atan2 (~0.123E4, nan) = nan pow (~0.123E4, nan) = nan atan2 (~0.123E4, inf) = 0 pow (~0.123E4, inf) = inf atan2 (~0.123E2, 0.17976931348623157E309) = ~6.842102115E~308 pow (~0.123E2, 0.17976931348623157E309) = inf atan2 (~0.123E2, 0.8988465674311579E308) = ~1.368420423E~307 pow (~0.123E2, 0.8988465674311579E308) = inf atan2 (~0.123E2, 0.123E4) = ~0.009999666687 pow (~0.123E2, 0.123E4) = inf atan2 (~0.123E2, 0.123E2) = ~0.7853981634 pow (~0.123E2, 0.123E2) = nan atan2 (~0.123E2, 0.3141592653589793E1) = ~1.320728626 pow (~0.123E2, 0.3141592653589793E1) = nan atan2 (~0.123E2, 0.2718281828459045E1) = ~1.353293796 pow (~0.123E2, 0.2718281828459045E1) = nan atan2 (~0.123E2, 0.123E1) = ~1.471127674 pow (~0.123E2, 0.123E1) = nan atan2 (~0.123E2, 0.123) = ~1.56079666 pow (~0.123E2, 0.123) = nan atan2 (~0.123E2, 0.123E~2) = ~1.570696327 pow (~0.123E2, 0.123E~2) = nan atan2 (~0.123E2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, 0.22250738585072014E~307) = nan atan2 (~0.123E2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, 0.11125369292536007E~307) = nan atan2 (~0.123E2, 0.5E~323) = ~1.570796327 pow (~0.123E2, 0.5E~323) = nan atan2 (~0.123E2, 0.0) = ~1.570796327 pow (~0.123E2, 0.0) = 1 atan2 (~0.123E2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E2, ~0.17976931348623157E309) = 0 atan2 (~0.123E2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E2, ~0.8988465674311579E308) = 0 atan2 (~0.123E2, ~0.123E4) = ~3.131592987 pow (~0.123E2, ~0.123E4) = 0 atan2 (~0.123E2, ~0.123E2) = ~2.35619449 pow (~0.123E2, ~0.123E2) = nan atan2 (~0.123E2, ~0.3141592653589793E1) = ~1.820864027 pow (~0.123E2, ~0.3141592653589793E1) = nan atan2 (~0.123E2, ~0.2718281828459045E1) = ~1.788298857 pow (~0.123E2, ~0.2718281828459045E1) = nan atan2 (~0.123E2, ~0.123E1) = ~1.670464979 pow (~0.123E2, ~0.123E1) = nan atan2 (~0.123E2, ~0.123) = ~1.580795993 pow (~0.123E2, ~0.123) = nan atan2 (~0.123E2, ~0.123E~2) = ~1.570896327 pow (~0.123E2, ~0.123E~2) = nan atan2 (~0.123E2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E2, ~0.22250738585072014E~307) = nan atan2 (~0.123E2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E2, ~0.11125369292536007E~307) = nan atan2 (~0.123E2, ~0.5E~323) = ~1.570796327 pow (~0.123E2, ~0.5E~323) = nan atan2 (~0.123E2, ~0.0) = ~1.570796327 pow (~0.123E2, ~0.0) = 1 atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.123E2, ~inf) = ~3.141592654 pow (~0.123E2, ~inf) = 0 atan2 (~0.123E2, nan) = nan pow (~0.123E2, nan) = nan atan2 (~0.123E2, inf) = 0 pow (~0.123E2, inf) = inf atan2 (~0.3141592653589793E1, 0.17976931348623157E309) = ~1.747568922E~308 pow (~0.3141592653589793E1, 0.17976931348623157E309) = inf atan2 (~0.3141592653589793E1, 0.8988465674311579E308) = ~3.495137844E~308 pow (~0.3141592653589793E1, 0.8988465674311579E308) = inf atan2 (~0.3141592653589793E1, 0.123E4) = ~0.002554134815 pow (~0.3141592653589793E1, 0.123E4) = inf atan2 (~0.3141592653589793E1, 0.123E2) = ~0.2500677004 pow (~0.3141592653589793E1, 0.123E2) = nan atan2 (~0.3141592653589793E1, 0.3141592653589793E1) = ~0.7853981634 pow (~0.3141592653589793E1, 0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, 0.2718281828459045E1) = ~0.8575117864 pow (~0.3141592653589793E1, 0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, 0.123E1) = ~1.197620596 pow (~0.3141592653589793E1, 0.123E1) = nan atan2 (~0.3141592653589793E1, 0.123) = ~1.531664198 pow (~0.3141592653589793E1, 0.123) = nan atan2 (~0.3141592653589793E1, 0.123E~2) = ~1.570404806 pow (~0.3141592653589793E1, 0.123E~2) = nan atan2 (~0.3141592653589793E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, 0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, 0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, 0.5E~323) = nan atan2 (~0.3141592653589793E1, 0.0) = ~1.570796327 pow (~0.3141592653589793E1, 0.0) = 1 atan2 (~0.3141592653589793E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.3141592653589793E1, ~0.17976931348623157E309) = 0 atan2 (~0.3141592653589793E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.3141592653589793E1, ~0.8988465674311579E308) = 0 atan2 (~0.3141592653589793E1, ~0.123E4) = ~3.139038519 pow (~0.3141592653589793E1, ~0.123E4) = 0 atan2 (~0.3141592653589793E1, ~0.123E2) = ~2.891524953 pow (~0.3141592653589793E1, ~0.123E2) = nan atan2 (~0.3141592653589793E1, ~0.3141592653589793E1) = ~2.35619449 pow (~0.3141592653589793E1, ~0.3141592653589793E1) = nan atan2 (~0.3141592653589793E1, ~0.2718281828459045E1) = ~2.284080867 pow (~0.3141592653589793E1, ~0.2718281828459045E1) = nan atan2 (~0.3141592653589793E1, ~0.123E1) = ~1.943972057 pow (~0.3141592653589793E1, ~0.123E1) = nan atan2 (~0.3141592653589793E1, ~0.123) = ~1.609928456 pow (~0.3141592653589793E1, ~0.123) = nan atan2 (~0.3141592653589793E1, ~0.123E~2) = ~1.571187848 pow (~0.3141592653589793E1, ~0.123E~2) = nan atan2 (~0.3141592653589793E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.22250738585072014E~307) = nan atan2 (~0.3141592653589793E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.3141592653589793E1, ~0.11125369292536007E~307) = nan atan2 (~0.3141592653589793E1, ~0.5E~323) = ~1.570796327 pow (~0.3141592653589793E1, ~0.5E~323) = nan atan2 (~0.3141592653589793E1, ~0.0) = ~1.570796327 pow (~0.3141592653589793E1, ~0.0) = 1 atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.3141592653589793E1, ~inf) = ~3.141592654 pow (~0.3141592653589793E1, ~inf) = 0 atan2 (~0.3141592653589793E1, nan) = nan pow (~0.3141592653589793E1, nan) = nan atan2 (~0.3141592653589793E1, inf) = 0 pow (~0.3141592653589793E1, inf) = inf atan2 (~0.2718281828459045E1, 0.17976931348623157E309) = ~1.512094459E~308 pow (~0.2718281828459045E1, 0.17976931348623157E309) = inf atan2 (~0.2718281828459045E1, 0.8988465674311579E308) = ~3.024188918E~308 pow (~0.2718281828459045E1, 0.8988465674311579E308) = inf atan2 (~0.2718281828459045E1, 0.123E4) = ~0.002209981629 pow (~0.2718281828459045E1, 0.123E4) = inf atan2 (~0.2718281828459045E1, 0.123E2) = ~0.2175025304 pow (~0.2718281828459045E1, 0.123E2) = nan atan2 (~0.2718281828459045E1, 0.3141592653589793E1) = ~0.7132845404 pow (~0.2718281828459045E1, 0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, 0.2718281828459045E1) = ~0.7853981634 pow (~0.2718281828459045E1, 0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, 0.123E1) = ~1.145872224 pow (~0.2718281828459045E1, 0.123E1) = nan atan2 (~0.2718281828459045E1, 0.123) = ~1.525578 pow (~0.2718281828459045E1, 0.123) = nan atan2 (~0.2718281828459045E1, 0.123E~2) = ~1.570343835 pow (~0.2718281828459045E1, 0.123E~2) = nan atan2 (~0.2718281828459045E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, 0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, 0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, 0.5E~323) = nan atan2 (~0.2718281828459045E1, 0.0) = ~1.570796327 pow (~0.2718281828459045E1, 0.0) = 1 atan2 (~0.2718281828459045E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.2718281828459045E1, ~0.17976931348623157E309) = 0 atan2 (~0.2718281828459045E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.2718281828459045E1, ~0.8988465674311579E308) = 0 atan2 (~0.2718281828459045E1, ~0.123E4) = ~3.139382672 pow (~0.2718281828459045E1, ~0.123E4) = 0 atan2 (~0.2718281828459045E1, ~0.123E2) = ~2.924090123 pow (~0.2718281828459045E1, ~0.123E2) = nan atan2 (~0.2718281828459045E1, ~0.3141592653589793E1) = ~2.428308113 pow (~0.2718281828459045E1, ~0.3141592653589793E1) = nan atan2 (~0.2718281828459045E1, ~0.2718281828459045E1) = ~2.35619449 pow (~0.2718281828459045E1, ~0.2718281828459045E1) = nan atan2 (~0.2718281828459045E1, ~0.123E1) = ~1.99572043 pow (~0.2718281828459045E1, ~0.123E1) = nan atan2 (~0.2718281828459045E1, ~0.123) = ~1.616014654 pow (~0.2718281828459045E1, ~0.123) = nan atan2 (~0.2718281828459045E1, ~0.123E~2) = ~1.571248818 pow (~0.2718281828459045E1, ~0.123E~2) = nan atan2 (~0.2718281828459045E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.22250738585072014E~307) = nan atan2 (~0.2718281828459045E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.2718281828459045E1, ~0.11125369292536007E~307) = nan atan2 (~0.2718281828459045E1, ~0.5E~323) = ~1.570796327 pow (~0.2718281828459045E1, ~0.5E~323) = nan atan2 (~0.2718281828459045E1, ~0.0) = ~1.570796327 pow (~0.2718281828459045E1, ~0.0) = 1 atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.2718281828459045E1, ~inf) = ~3.141592654 pow (~0.2718281828459045E1, ~inf) = 0 atan2 (~0.2718281828459045E1, nan) = nan pow (~0.2718281828459045E1, nan) = nan atan2 (~0.2718281828459045E1, inf) = 0 pow (~0.2718281828459045E1, inf) = inf atan2 (~0.123E1, 0.17976931348623157E309) = ~6.842102115E~309 pow (~0.123E1, 0.17976931348623157E309) = inf atan2 (~0.123E1, 0.8988465674311579E308) = ~1.368420423E~308 pow (~0.123E1, 0.8988465674311579E308) = inf atan2 (~0.123E1, 0.123E4) = ~9.999996667E~4 pow (~0.123E1, 0.123E4) = 3.830778757E110 atan2 (~0.123E1, 0.123E2) = ~0.09966865249 pow (~0.123E1, 0.123E2) = nan atan2 (~0.123E1, 0.3141592653589793E1) = ~0.3731757303 pow (~0.123E1, 0.3141592653589793E1) = nan atan2 (~0.123E1, 0.2718281828459045E1) = ~0.4249241031 pow (~0.123E1, 0.2718281828459045E1) = nan atan2 (~0.123E1, 0.123E1) = ~0.7853981634 pow (~0.123E1, 0.123E1) = nan atan2 (~0.123E1, 0.123) = ~1.471127674 pow (~0.123E1, 0.123) = nan atan2 (~0.123E1, 0.123E~2) = ~1.569796327 pow (~0.123E1, 0.123E~2) = nan atan2 (~0.123E1, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, 0.22250738585072014E~307) = nan atan2 (~0.123E1, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, 0.11125369292536007E~307) = nan atan2 (~0.123E1, 0.5E~323) = ~1.570796327 pow (~0.123E1, 0.5E~323) = nan atan2 (~0.123E1, 0.0) = ~1.570796327 pow (~0.123E1, 0.0) = 1 atan2 (~0.123E1, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E1, ~0.17976931348623157E309) = 0 atan2 (~0.123E1, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E1, ~0.8988465674311579E308) = 0 atan2 (~0.123E1, ~0.123E4) = ~3.140592654 pow (~0.123E1, ~0.123E4) = 2.610435275E~111 atan2 (~0.123E1, ~0.123E2) = ~3.041924001 pow (~0.123E1, ~0.123E2) = nan atan2 (~0.123E1, ~0.3141592653589793E1) = ~2.768416923 pow (~0.123E1, ~0.3141592653589793E1) = nan atan2 (~0.123E1, ~0.2718281828459045E1) = ~2.71666855 pow (~0.123E1, ~0.2718281828459045E1) = nan atan2 (~0.123E1, ~0.123E1) = ~2.35619449 pow (~0.123E1, ~0.123E1) = nan atan2 (~0.123E1, ~0.123) = ~1.670464979 pow (~0.123E1, ~0.123) = nan atan2 (~0.123E1, ~0.123E~2) = ~1.571796326 pow (~0.123E1, ~0.123E~2) = nan atan2 (~0.123E1, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E1, ~0.22250738585072014E~307) = nan atan2 (~0.123E1, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E1, ~0.11125369292536007E~307) = nan atan2 (~0.123E1, ~0.5E~323) = ~1.570796327 pow (~0.123E1, ~0.5E~323) = nan atan2 (~0.123E1, ~0.0) = ~1.570796327 pow (~0.123E1, ~0.0) = 1 atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123E1, ~inf) = ~3.141592654 pow (~0.123E1, ~inf) = 0 atan2 (~0.123E1, nan) = nan pow (~0.123E1, nan) = nan atan2 (~0.123E1, inf) = 0 pow (~0.123E1, inf) = inf atan2 (~0.123, 0.17976931348623157E309) = ~6.842102115E~310 pow (~0.123, 0.17976931348623157E309) = 0 atan2 (~0.123, 0.8988465674311579E308) = ~1.368420423E~309 pow (~0.123, 0.8988465674311579E308) = 0 atan2 (~0.123, 0.123E4) = ~9.999999967E~5 pow (~0.123, 0.123E4) = 0 atan2 (~0.123, 0.123E2) = ~0.009999666687 pow (~0.123, 0.123E2) = nan atan2 (~0.123, 0.3141592653589793E1) = ~0.03913212911 pow (~0.123, 0.3141592653589793E1) = nan atan2 (~0.123, 0.2718281828459045E1) = ~0.04521832678 pow (~0.123, 0.2718281828459045E1) = nan atan2 (~0.123, 0.123E1) = ~0.09966865249 pow (~0.123, 0.123E1) = nan atan2 (~0.123, 0.123) = ~0.7853981634 pow (~0.123, 0.123) = nan atan2 (~0.123, 0.123E~2) = ~1.56079666 pow (~0.123, 0.123E~2) = nan atan2 (~0.123, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123, 0.22250738585072014E~307) = nan atan2 (~0.123, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123, 0.11125369292536007E~307) = nan atan2 (~0.123, 0.5E~323) = ~1.570796327 pow (~0.123, 0.5E~323) = nan atan2 (~0.123, 0.0) = ~1.570796327 pow (~0.123, 0.0) = 1 atan2 (~0.123, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123, ~0.17976931348623157E309) = inf atan2 (~0.123, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123, ~0.8988465674311579E308) = inf atan2 (~0.123, ~0.123E4) = ~3.141492654 pow (~0.123, ~0.123E4) = inf atan2 (~0.123, ~0.123E2) = ~3.131592987 pow (~0.123, ~0.123E2) = nan atan2 (~0.123, ~0.3141592653589793E1) = ~3.102460524 pow (~0.123, ~0.3141592653589793E1) = nan atan2 (~0.123, ~0.2718281828459045E1) = ~3.096374327 pow (~0.123, ~0.2718281828459045E1) = nan atan2 (~0.123, ~0.123E1) = ~3.041924001 pow (~0.123, ~0.123E1) = nan atan2 (~0.123, ~0.123) = ~2.35619449 pow (~0.123, ~0.123) = nan atan2 (~0.123, ~0.123E~2) = ~1.580795993 pow (~0.123, ~0.123E~2) = nan atan2 (~0.123, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123, ~0.22250738585072014E~307) = nan atan2 (~0.123, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123, ~0.11125369292536007E~307) = nan atan2 (~0.123, ~0.5E~323) = ~1.570796327 pow (~0.123, ~0.5E~323) = nan atan2 (~0.123, ~0.0) = ~1.570796327 pow (~0.123, ~0.0) = 1 atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123, ~inf) = ~3.141592654 pow (~0.123, ~inf) = inf atan2 (~0.123, nan) = nan pow (~0.123, nan) = nan atan2 (~0.123, inf) = 0 pow (~0.123, inf) = 0 atan2 (~0.123E~2, 0.17976931348623157E309) = ~6.842102115E~312 pow (~0.123E~2, 0.17976931348623157E309) = 0 atan2 (~0.123E~2, 0.8988465674311579E308) = ~1.368420423E~311 pow (~0.123E~2, 0.8988465674311579E308) = 0 atan2 (~0.123E~2, 0.123E4) = ~1E~6 pow (~0.123E~2, 0.123E4) = 0 atan2 (~0.123E~2, 0.123E2) = ~9.999999967E~5 pow (~0.123E~2, 0.123E2) = nan atan2 (~0.123E~2, 0.3141592653589793E1) = ~3.9152114E~4 pow (~0.123E~2, 0.3141592653589793E1) = nan atan2 (~0.123E~2, 0.2718281828459045E1) = ~4.524916818E~4 pow (~0.123E~2, 0.2718281828459045E1) = nan atan2 (~0.123E~2, 0.123E1) = ~9.999996667E~4 pow (~0.123E~2, 0.123E1) = nan atan2 (~0.123E~2, 0.123) = ~0.009999666687 pow (~0.123E~2, 0.123) = nan atan2 (~0.123E~2, 0.123E~2) = ~0.7853981634 pow (~0.123E~2, 0.123E~2) = nan atan2 (~0.123E~2, 0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, 0.22250738585072014E~307) = nan atan2 (~0.123E~2, 0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, 0.11125369292536007E~307) = nan atan2 (~0.123E~2, 0.5E~323) = ~1.570796327 pow (~0.123E~2, 0.5E~323) = nan atan2 (~0.123E~2, 0.0) = ~1.570796327 pow (~0.123E~2, 0.0) = 1 atan2 (~0.123E~2, ~0.17976931348623157E309) = ~3.141592654 pow (~0.123E~2, ~0.17976931348623157E309) = inf atan2 (~0.123E~2, ~0.8988465674311579E308) = ~3.141592654 pow (~0.123E~2, ~0.8988465674311579E308) = inf atan2 (~0.123E~2, ~0.123E4) = ~3.141591654 pow (~0.123E~2, ~0.123E4) = inf atan2 (~0.123E~2, ~0.123E2) = ~3.141492654 pow (~0.123E~2, ~0.123E2) = nan atan2 (~0.123E~2, ~0.3141592653589793E1) = ~3.141201132 pow (~0.123E~2, ~0.3141592653589793E1) = nan atan2 (~0.123E~2, ~0.2718281828459045E1) = ~3.141140162 pow (~0.123E~2, ~0.2718281828459045E1) = nan atan2 (~0.123E~2, ~0.123E1) = ~3.140592654 pow (~0.123E~2, ~0.123E1) = nan atan2 (~0.123E~2, ~0.123) = ~3.131592987 pow (~0.123E~2, ~0.123) = nan atan2 (~0.123E~2, ~0.123E~2) = ~2.35619449 pow (~0.123E~2, ~0.123E~2) = nan atan2 (~0.123E~2, ~0.22250738585072014E~307) = ~1.570796327 pow (~0.123E~2, ~0.22250738585072014E~307) = nan atan2 (~0.123E~2, ~0.11125369292536007E~307) = ~1.570796327 pow (~0.123E~2, ~0.11125369292536007E~307) = nan atan2 (~0.123E~2, ~0.5E~323) = ~1.570796327 pow (~0.123E~2, ~0.5E~323) = nan atan2 (~0.123E~2, ~0.0) = ~1.570796327 pow (~0.123E~2, ~0.0) = 1 atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.123E~2, ~inf) = ~3.141592654 pow (~0.123E~2, ~inf) = inf atan2 (~0.123E~2, nan) = nan pow (~0.123E~2, nan) = nan atan2 (~0.123E~2, inf) = 0 pow (~0.123E~2, inf) = 0 atan2 (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 pow (~0.22250738585072014E~307, 0.17976931348623157E309) = 0 atan2 (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 pow (~0.22250738585072014E~307, 0.8988465674311579E308) = 0 atan2 (~0.22250738585072014E~307, 0.123E4) = ~1.809003137E~311 pow (~0.22250738585072014E~307, 0.123E4) = 0 atan2 (~0.22250738585072014E~307, 0.123E2) = ~1.809003137E~309 pow (~0.22250738585072014E~307, 0.123E2) = nan atan2 (~0.22250738585072014E~307, 0.3141592653589793E1) = ~7.082630067E~309 pow (~0.22250738585072014E~307, 0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, 0.2718281828459045E1) = ~8.185589276E~309 pow (~0.22250738585072014E~307, 0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, 0.123E1) = ~1.809003137E~308 pow (~0.22250738585072014E~307, 0.123E1) = nan atan2 (~0.22250738585072014E~307, 0.123) = ~1.809003137E~307 pow (~0.22250738585072014E~307, 0.123) = nan atan2 (~0.22250738585072014E~307, 0.123E~2) = ~1.809003137E~305 pow (~0.22250738585072014E~307, 0.123E~2) = nan atan2 (~0.22250738585072014E~307, 0.22250738585072014E~307) = ~0.7853981634 pow (~0.22250738585072014E~307, 0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, 0.11125369292536007E~307) = ~1.107148718 pow (~0.22250738585072014E~307, 0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, 0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, 0.5E~323) = nan atan2 (~0.22250738585072014E~307, 0.0) = ~1.570796327 pow (~0.22250738585072014E~307, 0.0) = 1 atan2 (~0.22250738585072014E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.17976931348623157E309) = inf atan2 (~0.22250738585072014E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.8988465674311579E308) = inf atan2 (~0.22250738585072014E~307, ~0.123E4) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E4) = inf atan2 (~0.22250738585072014E~307, ~0.123E2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E2) = nan atan2 (~0.22250738585072014E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.3141592653589793E1) = nan atan2 (~0.22250738585072014E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.2718281828459045E1) = nan atan2 (~0.22250738585072014E~307, ~0.123E1) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E1) = nan atan2 (~0.22250738585072014E~307, ~0.123) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123) = nan atan2 (~0.22250738585072014E~307, ~0.123E~2) = ~3.141592654 pow (~0.22250738585072014E~307, ~0.123E~2) = nan atan2 (~0.22250738585072014E~307, ~0.22250738585072014E~307) = ~2.35619449 pow (~0.22250738585072014E~307, ~0.22250738585072014E~307) = nan atan2 (~0.22250738585072014E~307, ~0.11125369292536007E~307) = ~2.034443936 pow (~0.22250738585072014E~307, ~0.11125369292536007E~307) = nan atan2 (~0.22250738585072014E~307, ~0.5E~323) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.5E~323) = nan atan2 (~0.22250738585072014E~307, ~0.0) = ~1.570796327 pow (~0.22250738585072014E~307, ~0.0) = 1 atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.22250738585072014E~307, ~inf) = ~3.141592654 pow (~0.22250738585072014E~307, ~inf) = inf atan2 (~0.22250738585072014E~307, nan) = nan pow (~0.22250738585072014E~307, nan) = nan atan2 (~0.22250738585072014E~307, inf) = 0 pow (~0.22250738585072014E~307, inf) = 0 atan2 (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 pow (~0.11125369292536007E~307, 0.17976931348623157E309) = 0 atan2 (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 pow (~0.11125369292536007E~307, 0.8988465674311579E308) = 0 atan2 (~0.11125369292536007E~307, 0.123E4) = ~9.045015685E~312 pow (~0.11125369292536007E~307, 0.123E4) = 0 atan2 (~0.11125369292536007E~307, 0.123E2) = ~9.045015685E~310 pow (~0.11125369292536007E~307, 0.123E2) = nan atan2 (~0.11125369292536007E~307, 0.3141592653589793E1) = ~3.541315033E~309 pow (~0.11125369292536007E~307, 0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, 0.2718281828459045E1) = ~4.092794638E~309 pow (~0.11125369292536007E~307, 0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, 0.123E1) = ~9.045015685E~309 pow (~0.11125369292536007E~307, 0.123E1) = nan atan2 (~0.11125369292536007E~307, 0.123) = ~9.045015685E~308 pow (~0.11125369292536007E~307, 0.123) = nan atan2 (~0.11125369292536007E~307, 0.123E~2) = ~9.045015685E~306 pow (~0.11125369292536007E~307, 0.123E~2) = nan atan2 (~0.11125369292536007E~307, 0.22250738585072014E~307) = ~0.463647609 pow (~0.11125369292536007E~307, 0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, 0.11125369292536007E~307) = ~0.7853981634 pow (~0.11125369292536007E~307, 0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, 0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, 0.5E~323) = nan atan2 (~0.11125369292536007E~307, 0.0) = ~1.570796327 pow (~0.11125369292536007E~307, 0.0) = 1 atan2 (~0.11125369292536007E~307, ~0.17976931348623157E309) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.17976931348623157E309) = inf atan2 (~0.11125369292536007E~307, ~0.8988465674311579E308) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.8988465674311579E308) = inf atan2 (~0.11125369292536007E~307, ~0.123E4) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E4) = inf atan2 (~0.11125369292536007E~307, ~0.123E2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E2) = nan atan2 (~0.11125369292536007E~307, ~0.3141592653589793E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.3141592653589793E1) = nan atan2 (~0.11125369292536007E~307, ~0.2718281828459045E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.2718281828459045E1) = nan atan2 (~0.11125369292536007E~307, ~0.123E1) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E1) = nan atan2 (~0.11125369292536007E~307, ~0.123) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123) = nan atan2 (~0.11125369292536007E~307, ~0.123E~2) = ~3.141592654 pow (~0.11125369292536007E~307, ~0.123E~2) = nan atan2 (~0.11125369292536007E~307, ~0.22250738585072014E~307) = ~2.677945045 pow (~0.11125369292536007E~307, ~0.22250738585072014E~307) = nan atan2 (~0.11125369292536007E~307, ~0.11125369292536007E~307) = ~2.35619449 pow (~0.11125369292536007E~307, ~0.11125369292536007E~307) = nan atan2 (~0.11125369292536007E~307, ~0.5E~323) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.5E~323) = nan atan2 (~0.11125369292536007E~307, ~0.0) = ~1.570796327 pow (~0.11125369292536007E~307, ~0.0) = 1 atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.11125369292536007E~307, ~inf) = ~3.141592654 pow (~0.11125369292536007E~307, ~inf) = inf atan2 (~0.11125369292536007E~307, nan) = nan pow (~0.11125369292536007E~307, nan) = nan atan2 (~0.11125369292536007E~307, inf) = 0 pow (~0.11125369292536007E~307, inf) = 0 atan2 (~0.5E~323, 0.17976931348623157E309) = 0 pow (~0.5E~323, 0.17976931348623157E309) = 0 atan2 (~0.5E~323, 0.8988465674311579E308) = 0 pow (~0.5E~323, 0.8988465674311579E308) = 0 atan2 (~0.5E~323, 0.123E4) = 0 pow (~0.5E~323, 0.123E4) = 0 atan2 (~0.5E~323, 0.123E2) = 0 pow (~0.5E~323, 0.123E2) = nan atan2 (~0.5E~323, 0.3141592653589793E1) = 0 pow (~0.5E~323, 0.3141592653589793E1) = nan atan2 (~0.5E~323, 0.2718281828459045E1) = 0 pow (~0.5E~323, 0.2718281828459045E1) = nan atan2 (~0.5E~323, 0.123E1) = ~4.940656458E~324 pow (~0.5E~323, 0.123E1) = nan atan2 (~0.5E~323, 0.123) = ~3.952525167E~323 pow (~0.5E~323, 0.123) = nan atan2 (~0.5E~323, 0.123E~2) = ~4.016753701E~321 pow (~0.5E~323, 0.123E~2) = nan atan2 (~0.5E~323, 0.22250738585072014E~307) = ~2.220446049E~16 pow (~0.5E~323, 0.22250738585072014E~307) = nan atan2 (~0.5E~323, 0.11125369292536007E~307) = ~4.440892099E~16 pow (~0.5E~323, 0.11125369292536007E~307) = nan atan2 (~0.5E~323, 0.5E~323) = ~0.7853981634 pow (~0.5E~323, 0.5E~323) = nan atan2 (~0.5E~323, 0.0) = ~1.570796327 pow (~0.5E~323, 0.0) = 1 atan2 (~0.5E~323, ~0.17976931348623157E309) = ~3.141592654 pow (~0.5E~323, ~0.17976931348623157E309) = inf atan2 (~0.5E~323, ~0.8988465674311579E308) = ~3.141592654 pow (~0.5E~323, ~0.8988465674311579E308) = inf atan2 (~0.5E~323, ~0.123E4) = ~3.141592654 pow (~0.5E~323, ~0.123E4) = inf atan2 (~0.5E~323, ~0.123E2) = ~3.141592654 pow (~0.5E~323, ~0.123E2) = nan atan2 (~0.5E~323, ~0.3141592653589793E1) = ~3.141592654 pow (~0.5E~323, ~0.3141592653589793E1) = nan atan2 (~0.5E~323, ~0.2718281828459045E1) = ~3.141592654 pow (~0.5E~323, ~0.2718281828459045E1) = nan atan2 (~0.5E~323, ~0.123E1) = ~3.141592654 pow (~0.5E~323, ~0.123E1) = nan atan2 (~0.5E~323, ~0.123) = ~3.141592654 pow (~0.5E~323, ~0.123) = nan atan2 (~0.5E~323, ~0.123E~2) = ~3.141592654 pow (~0.5E~323, ~0.123E~2) = nan atan2 (~0.5E~323, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.5E~323, ~0.22250738585072014E~307) = nan atan2 (~0.5E~323, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.5E~323, ~0.11125369292536007E~307) = nan atan2 (~0.5E~323, ~0.5E~323) = ~2.35619449 pow (~0.5E~323, ~0.5E~323) = nan atan2 (~0.5E~323, ~0.0) = ~1.570796327 pow (~0.5E~323, ~0.0) = 1 atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.5E~323, ~inf) = ~3.141592654 pow (~0.5E~323, ~inf) = inf atan2 (~0.5E~323, nan) = nan pow (~0.5E~323, nan) = nan atan2 (~0.5E~323, inf) = 0 pow (~0.5E~323, inf) = 0 atan2 (~0.0, 0.17976931348623157E309) = 0 pow (~0.0, 0.17976931348623157E309) = 0 atan2 (~0.0, 0.8988465674311579E308) = 0 pow (~0.0, 0.8988465674311579E308) = 0 atan2 (~0.0, 0.123E4) = 0 pow (~0.0, 0.123E4) = 0 atan2 (~0.0, 0.123E2) = 0 pow (~0.0, 0.123E2) = 0 atan2 (~0.0, 0.3141592653589793E1) = 0 pow (~0.0, 0.3141592653589793E1) = 0 atan2 (~0.0, 0.2718281828459045E1) = 0 pow (~0.0, 0.2718281828459045E1) = 0 atan2 (~0.0, 0.123E1) = 0 pow (~0.0, 0.123E1) = 0 atan2 (~0.0, 0.123) = 0 pow (~0.0, 0.123) = 0 atan2 (~0.0, 0.123E~2) = 0 pow (~0.0, 0.123E~2) = 0 atan2 (~0.0, 0.22250738585072014E~307) = 0 pow (~0.0, 0.22250738585072014E~307) = 0 atan2 (~0.0, 0.11125369292536007E~307) = 0 pow (~0.0, 0.11125369292536007E~307) = 0 atan2 (~0.0, 0.5E~323) = 0 pow (~0.0, 0.5E~323) = 0 atan2 (~0.0, 0.0) = 0 pow (~0.0, 0.0) = 1 atan2 (~0.0, ~0.17976931348623157E309) = ~3.141592654 pow (~0.0, ~0.17976931348623157E309) = inf atan2 (~0.0, ~0.8988465674311579E308) = ~3.141592654 pow (~0.0, ~0.8988465674311579E308) = inf atan2 (~0.0, ~0.123E4) = ~3.141592654 pow (~0.0, ~0.123E4) = inf atan2 (~0.0, ~0.123E2) = ~3.141592654 pow (~0.0, ~0.123E2) = inf atan2 (~0.0, ~0.3141592653589793E1) = ~3.141592654 pow (~0.0, ~0.3141592653589793E1) = inf atan2 (~0.0, ~0.2718281828459045E1) = ~3.141592654 pow (~0.0, ~0.2718281828459045E1) = inf atan2 (~0.0, ~0.123E1) = ~3.141592654 pow (~0.0, ~0.123E1) = inf atan2 (~0.0, ~0.123) = ~3.141592654 pow (~0.0, ~0.123) = inf atan2 (~0.0, ~0.123E~2) = ~3.141592654 pow (~0.0, ~0.123E~2) = inf atan2 (~0.0, ~0.22250738585072014E~307) = ~3.141592654 pow (~0.0, ~0.22250738585072014E~307) = inf atan2 (~0.0, ~0.11125369292536007E~307) = ~3.141592654 pow (~0.0, ~0.11125369292536007E~307) = inf atan2 (~0.0, ~0.5E~323) = ~3.141592654 pow (~0.0, ~0.5E~323) = inf atan2 (~0.0, ~0.0) = ~3.141592654 pow (~0.0, ~0.0) = 1 atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (~0.0, ~inf) = ~3.141592654 pow (~0.0, ~inf) = inf atan2 (~0.0, nan) = nan pow (~0.0, nan) = nan atan2 (~0.0, inf) = 0 pow (~0.0, inf) = 0 atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (~inf, 0.17976931348623157E309) = ~1.570796327 pow (~inf, 0.17976931348623157E309) = inf atan2 (~inf, 0.8988465674311579E308) = ~1.570796327 pow (~inf, 0.8988465674311579E308) = inf atan2 (~inf, 0.123E4) = ~1.570796327 pow (~inf, 0.123E4) = inf atan2 (~inf, 0.123E2) = ~1.570796327 pow (~inf, 0.123E2) = inf atan2 (~inf, 0.3141592653589793E1) = ~1.570796327 pow (~inf, 0.3141592653589793E1) = inf atan2 (~inf, 0.2718281828459045E1) = ~1.570796327 pow (~inf, 0.2718281828459045E1) = inf atan2 (~inf, 0.123E1) = ~1.570796327 pow (~inf, 0.123E1) = inf atan2 (~inf, 0.123) = ~1.570796327 pow (~inf, 0.123) = inf atan2 (~inf, 0.123E~2) = ~1.570796327 pow (~inf, 0.123E~2) = inf atan2 (~inf, 0.22250738585072014E~307) = ~1.570796327 pow (~inf, 0.22250738585072014E~307) = inf atan2 (~inf, 0.11125369292536007E~307) = ~1.570796327 pow (~inf, 0.11125369292536007E~307) = inf atan2 (~inf, 0.5E~323) = ~1.570796327 pow (~inf, 0.5E~323) = inf atan2 (~inf, 0.0) = ~1.570796327 pow (~inf, 0.0) = 1 atan2 (~inf, ~0.17976931348623157E309) = ~1.570796327 pow (~inf, ~0.17976931348623157E309) = 0 atan2 (~inf, ~0.8988465674311579E308) = ~1.570796327 pow (~inf, ~0.8988465674311579E308) = 0 atan2 (~inf, ~0.123E4) = ~1.570796327 pow (~inf, ~0.123E4) = 0 atan2 (~inf, ~0.123E2) = ~1.570796327 pow (~inf, ~0.123E2) = 0 atan2 (~inf, ~0.3141592653589793E1) = ~1.570796327 pow (~inf, ~0.3141592653589793E1) = 0 atan2 (~inf, ~0.2718281828459045E1) = ~1.570796327 pow (~inf, ~0.2718281828459045E1) = 0 atan2 (~inf, ~0.123E1) = ~1.570796327 pow (~inf, ~0.123E1) = 0 atan2 (~inf, ~0.123) = ~1.570796327 pow (~inf, ~0.123) = 0 atan2 (~inf, ~0.123E~2) = ~1.570796327 pow (~inf, ~0.123E~2) = 0 atan2 (~inf, ~0.22250738585072014E~307) = ~1.570796327 pow (~inf, ~0.22250738585072014E~307) = 0 atan2 (~inf, ~0.11125369292536007E~307) = ~1.570796327 pow (~inf, ~0.11125369292536007E~307) = 0 atan2 (~inf, ~0.5E~323) = ~1.570796327 pow (~inf, ~0.5E~323) = 0 atan2 (~inf, ~0.0) = ~1.570796327 pow (~inf, ~0.0) = 1 atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (~inf, ~inf) = ~2.35619449 pow (~inf, ~inf) = 0 atan2 (~inf, nan) = nan pow (~inf, nan) = nan atan2 (~inf, inf) = ~0.7853981634 pow (~inf, inf) = inf atan2 (nan, 0.17976931348623157E309) = nan pow (nan, 0.17976931348623157E309) = nan atan2 (nan, 0.8988465674311579E308) = nan pow (nan, 0.8988465674311579E308) = nan atan2 (nan, 0.123E4) = nan pow (nan, 0.123E4) = nan atan2 (nan, 0.123E2) = nan pow (nan, 0.123E2) = nan atan2 (nan, 0.3141592653589793E1) = nan pow (nan, 0.3141592653589793E1) = nan atan2 (nan, 0.2718281828459045E1) = nan pow (nan, 0.2718281828459045E1) = nan atan2 (nan, 0.123E1) = nan pow (nan, 0.123E1) = nan atan2 (nan, 0.123) = nan pow (nan, 0.123) = nan atan2 (nan, 0.123E~2) = nan pow (nan, 0.123E~2) = nan atan2 (nan, 0.22250738585072014E~307) = nan pow (nan, 0.22250738585072014E~307) = nan atan2 (nan, 0.11125369292536007E~307) = nan pow (nan, 0.11125369292536007E~307) = nan atan2 (nan, 0.5E~323) = nan pow (nan, 0.5E~323) = nan atan2 (nan, 0.0) = nan pow (nan, 0.0) = 1 atan2 (nan, ~0.17976931348623157E309) = nan pow (nan, ~0.17976931348623157E309) = nan atan2 (nan, ~0.8988465674311579E308) = nan pow (nan, ~0.8988465674311579E308) = nan atan2 (nan, ~0.123E4) = nan pow (nan, ~0.123E4) = nan atan2 (nan, ~0.123E2) = nan pow (nan, ~0.123E2) = nan atan2 (nan, ~0.3141592653589793E1) = nan pow (nan, ~0.3141592653589793E1) = nan atan2 (nan, ~0.2718281828459045E1) = nan pow (nan, ~0.2718281828459045E1) = nan atan2 (nan, ~0.123E1) = nan pow (nan, ~0.123E1) = nan atan2 (nan, ~0.123) = nan pow (nan, ~0.123) = nan atan2 (nan, ~0.123E~2) = nan pow (nan, ~0.123E~2) = nan atan2 (nan, ~0.22250738585072014E~307) = nan pow (nan, ~0.22250738585072014E~307) = nan atan2 (nan, ~0.11125369292536007E~307) = nan pow (nan, ~0.11125369292536007E~307) = nan atan2 (nan, ~0.5E~323) = nan pow (nan, ~0.5E~323) = nan atan2 (nan, ~0.0) = nan pow (nan, ~0.0) = 1 atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (nan, ~inf) = nan pow (nan, ~inf) = nan atan2 (nan, nan) = nan pow (nan, nan) = nan atan2 (nan, inf) = nan pow (nan, inf) = nan atan2 (inf, 0.17976931348623157E309) = 1.570796327 pow (inf, 0.17976931348623157E309) = inf atan2 (inf, 0.8988465674311579E308) = 1.570796327 pow (inf, 0.8988465674311579E308) = inf atan2 (inf, 0.123E4) = 1.570796327 pow (inf, 0.123E4) = inf atan2 (inf, 0.123E2) = 1.570796327 pow (inf, 0.123E2) = inf atan2 (inf, 0.3141592653589793E1) = 1.570796327 pow (inf, 0.3141592653589793E1) = inf atan2 (inf, 0.2718281828459045E1) = 1.570796327 pow (inf, 0.2718281828459045E1) = inf atan2 (inf, 0.123E1) = 1.570796327 pow (inf, 0.123E1) = inf atan2 (inf, 0.123) = 1.570796327 pow (inf, 0.123) = inf atan2 (inf, 0.123E~2) = 1.570796327 pow (inf, 0.123E~2) = inf atan2 (inf, 0.22250738585072014E~307) = 1.570796327 pow (inf, 0.22250738585072014E~307) = inf atan2 (inf, 0.11125369292536007E~307) = 1.570796327 pow (inf, 0.11125369292536007E~307) = inf atan2 (inf, 0.5E~323) = 1.570796327 pow (inf, 0.5E~323) = inf atan2 (inf, 0.0) = 1.570796327 pow (inf, 0.0) = 1 atan2 (inf, ~0.17976931348623157E309) = 1.570796327 pow (inf, ~0.17976931348623157E309) = 0 atan2 (inf, ~0.8988465674311579E308) = 1.570796327 pow (inf, ~0.8988465674311579E308) = 0 atan2 (inf, ~0.123E4) = 1.570796327 pow (inf, ~0.123E4) = 0 atan2 (inf, ~0.123E2) = 1.570796327 pow (inf, ~0.123E2) = 0 atan2 (inf, ~0.3141592653589793E1) = 1.570796327 pow (inf, ~0.3141592653589793E1) = 0 atan2 (inf, ~0.2718281828459045E1) = 1.570796327 pow (inf, ~0.2718281828459045E1) = 0 atan2 (inf, ~0.123E1) = 1.570796327 pow (inf, ~0.123E1) = 0 atan2 (inf, ~0.123) = 1.570796327 pow (inf, ~0.123) = 0 atan2 (inf, ~0.123E~2) = 1.570796327 pow (inf, ~0.123E~2) = 0 atan2 (inf, ~0.22250738585072014E~307) = 1.570796327 pow (inf, ~0.22250738585072014E~307) = 0 atan2 (inf, ~0.11125369292536007E~307) = 1.570796327 pow (inf, ~0.11125369292536007E~307) = 0 atan2 (inf, ~0.5E~323) = 1.570796327 pow (inf, ~0.5E~323) = 0 atan2 (inf, ~0.0) = 1.570796327 pow (inf, ~0.0) = 1 atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf atan2 (inf, ~inf) = 2.35619449 pow (inf, ~inf) = 0 atan2 (inf, nan) = nan pow (inf, nan) = nan atan2 (inf, inf) = 0.7853981634 pow (inf, inf) = inf Testing *+, *- SOME *+ AND STANDARD RESULTS DIFFER (r1, r2, r3): *+(r1, r2, r3) (r1 * r2 + r3) -------------------------------------------- (0.17976931348623157E309, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.123E4): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.123E2): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.123E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.123): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.123E~2): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.5E~323): inf inf (0.17976931348623157E309, 0.17976931348623157E309, 0.0): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.123E4): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.123E2): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.123E1): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.123): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.123E~2): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.5E~323): inf inf (0.17976931348623157E309, 0.17976931348623157E309, ~0.0): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.123E4): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.123E2): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.123E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.123): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.123E~2): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.5E~323): inf inf (0.17976931348623157E309, 0.8988465674311579E308, 0.0): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.123E4): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.123E2): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.123E1): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.123): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.123E~2): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.5E~323): inf inf (0.17976931348623157E309, 0.8988465674311579E308, ~0.0): inf inf (0.17976931348623157E309, 0.123E4, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E4, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.123E4, 0.123E4): inf inf (0.17976931348623157E309, 0.123E4, 0.123E2): inf inf (0.17976931348623157E309, 0.123E4, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E4, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E4, 0.123E1): inf inf (0.17976931348623157E309, 0.123E4, 0.123): inf inf (0.17976931348623157E309, 0.123E4, 0.123E~2): inf inf (0.17976931348623157E309, 0.123E4, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E4, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E4, 0.5E~323): inf inf (0.17976931348623157E309, 0.123E4, 0.0): inf inf (0.17976931348623157E309, 0.123E4, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E4, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.123E4, ~0.123E4): inf inf (0.17976931348623157E309, 0.123E4, ~0.123E2): inf inf (0.17976931348623157E309, 0.123E4, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E4, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E4, ~0.123E1): inf inf (0.17976931348623157E309, 0.123E4, ~0.123): inf inf (0.17976931348623157E309, 0.123E4, ~0.123E~2): inf inf (0.17976931348623157E309, 0.123E4, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E4, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E4, ~0.5E~323): inf inf (0.17976931348623157E309, 0.123E4, ~0.0): inf inf (0.17976931348623157E309, 0.123E2, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E2, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.123E2, 0.123E4): inf inf (0.17976931348623157E309, 0.123E2, 0.123E2): inf inf (0.17976931348623157E309, 0.123E2, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E2, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E2, 0.123E1): inf inf (0.17976931348623157E309, 0.123E2, 0.123): inf inf (0.17976931348623157E309, 0.123E2, 0.123E~2): inf inf (0.17976931348623157E309, 0.123E2, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E2, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E2, 0.5E~323): inf inf (0.17976931348623157E309, 0.123E2, 0.0): inf inf (0.17976931348623157E309, 0.123E2, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E2, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.123E2, ~0.123E4): inf inf (0.17976931348623157E309, 0.123E2, ~0.123E2): inf inf (0.17976931348623157E309, 0.123E2, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E2, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E2, ~0.123E1): inf inf (0.17976931348623157E309, 0.123E2, ~0.123): inf inf (0.17976931348623157E309, 0.123E2, ~0.123E~2): inf inf (0.17976931348623157E309, 0.123E2, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E2, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E2, ~0.5E~323): inf inf (0.17976931348623157E309, 0.123E2, ~0.0): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.123E4): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.123E2): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.123E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.123): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.123E~2): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.5E~323): inf inf (0.17976931348623157E309, 0.3141592653589793E1, 0.0): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.123E4): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.123E2): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.123E1): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.123): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.123E~2): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.5E~323): inf inf (0.17976931348623157E309, 0.3141592653589793E1, ~0.0): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.123E4): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.123E2): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.123E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.123): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.123E~2): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.5E~323): inf inf (0.17976931348623157E309, 0.2718281828459045E1, 0.0): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.123E4): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.123E2): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.123E1): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.123): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.123E~2): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.5E~323): inf inf (0.17976931348623157E309, 0.2718281828459045E1, ~0.0): inf inf (0.17976931348623157E309, 0.123E1, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E1, 0.8988465674311579E308): inf inf (0.17976931348623157E309, 0.123E1, 0.123E4): inf inf (0.17976931348623157E309, 0.123E1, 0.123E2): inf inf (0.17976931348623157E309, 0.123E1, 0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E1, 0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E1, 0.123E1): inf inf (0.17976931348623157E309, 0.123E1, 0.123): inf inf (0.17976931348623157E309, 0.123E1, 0.123E~2): inf inf (0.17976931348623157E309, 0.123E1, 0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E1, 0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E1, 0.5E~323): inf inf (0.17976931348623157E309, 0.123E1, 0.0): inf inf (0.17976931348623157E309, 0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 0.4134694210183326E308 (0.17976931348623157E309, 0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 0.13123159884494904E309 (0.17976931348623157E309, 0.123E1, ~0.123E4): inf inf (0.17976931348623157E309, 0.123E1, ~0.123E2): inf inf (0.17976931348623157E309, 0.123E1, ~0.3141592653589793E1): inf inf (0.17976931348623157E309, 0.123E1, ~0.2718281828459045E1): inf inf (0.17976931348623157E309, 0.123E1, ~0.123E1): inf inf (0.17976931348623157E309, 0.123E1, ~0.123): inf inf (0.17976931348623157E309, 0.123E1, ~0.123E~2): inf inf (0.17976931348623157E309, 0.123E1, ~0.22250738585072014E~307): inf inf (0.17976931348623157E309, 0.123E1, ~0.11125369292536007E~307): inf inf (0.17976931348623157E309, 0.123E1, ~0.5E~323): inf inf (0.17976931348623157E309, 0.123E1, ~0.0): inf inf (0.17976931348623157E309, 0.123, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123, 0.8988465674311579E308): 0.11199628230192226E309 0.11199628230192226E309 (0.17976931348623157E309, 0.123, 0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.123): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, 0.0): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.17976931348623157E309): ~0.15765768792742509E309 ~0.15765768792742509E309 (0.17976931348623157E309, 0.123, ~0.8988465674311579E308): ~0.677730311843093E308 ~0.677730311843093E308 (0.17976931348623157E309, 0.123, ~0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.123): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123, ~0.0): 0.22111625558806483E308 0.22111625558806483E308 (0.17976931348623157E309, 0.123E~2, 0.17976931348623157E309): inf inf (0.17976931348623157E309, 0.123E~2, 0.8988465674311579E308): 0.9010577299870385E308 0.9010577299870385E308 (0.17976931348623157E309, 0.123E~2, 0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.123): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, 0.0): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.17976931348623157E309): ~0.17954819723064351E309 ~0.17954819723064351E309 (0.17976931348623157E309, 0.123E~2, ~0.8988465674311579E308): ~0.8966354048752772E308 ~0.8966354048752772E308 (0.17976931348623157E309, 0.123E~2, ~0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.123): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.123E~2, ~0.0): 0.2211162555880648E306 0.2211162555880648E306 (0.17976931348623157E309, 0.22250738585072014E~307, 0.123E4): 0.1234E4 0.1234E4 (0.17976931348623157E309, 0.22250738585072014E~307, 0.123E2): 0.163E2 0.163E2 (0.17976931348623157E309, 0.22250738585072014E~307, 0.3141592653589793E1): 0.7141592653589793E1 0.7141592653589793E1 (0.17976931348623157E309, 0.22250738585072014E~307, 0.123): 0.4122999999999999E1 0.4122999999999999E1 (0.17976931348623157E309, 0.22250738585072014E~307, 0.123E~2): 0.400123E1 0.400123E1 (0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E4): ~0.1226E4 ~0.1226E4 (0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E2): ~0.83E1 ~0.83E1 (0.17976931348623157E309, 0.22250738585072014E~307, ~0.123): 0.3877E1 0.3877E1 (0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E~2): 0.39987699999999995E1 0.39987699999999995E1 (0.17976931348623157E309, 0.11125369292536007E~307, 0.123E4): 0.1232E4 0.1232E4 (0.17976931348623157E309, 0.11125369292536007E~307, 0.123E2): 0.143E2 0.143E2 (0.17976931348623157E309, 0.11125369292536007E~307, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (0.17976931348623157E309, 0.11125369292536007E~307, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (0.17976931348623157E309, 0.11125369292536007E~307, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (0.17976931348623157E309, 0.11125369292536007E~307, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E2): ~0.103E2 ~0.103E2 (0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (0.17976931348623157E309, 0.5E~323, 0.123E4): 0.123E4 0.123E4 (0.17976931348623157E309, 0.5E~323, 0.123E2): 0.123E2 0.123E2 (0.17976931348623157E309, 0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (0.17976931348623157E309, 0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (0.17976931348623157E309, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E4, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E4, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E2, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E2, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.3141592653589793E1, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.2718281828459045E1, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~0.4134694210183326E308 (0.17976931348623157E309, ~0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~0.13123159884494904E309 (0.17976931348623157E309, ~0.123E1, 0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E1, 0.0): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.8988465674311579E308): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.123E4): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.123E2): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.3141592653589793E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.2718281828459045E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.123E1): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.123): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.123E~2): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.22250738585072014E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.11125369292536007E~307): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.5E~323): ~inf ~inf (0.17976931348623157E309, ~0.123E1, ~0.0): ~inf ~inf (0.17976931348623157E309, ~0.123, 0.17976931348623157E309): 0.15765768792742509E309 0.15765768792742509E309 (0.17976931348623157E309, ~0.123, 0.8988465674311579E308): 0.677730311843093E308 0.677730311843093E308 (0.17976931348623157E309, ~0.123, 0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, 0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123, ~0.8988465674311579E308): ~0.11199628230192226E309 ~0.11199628230192226E309 (0.17976931348623157E309, ~0.123, ~0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123, ~0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.17976931348623157E309, ~0.123E~2, 0.17976931348623157E309): 0.17954819723064351E309 0.17954819723064351E309 (0.17976931348623157E309, ~0.123E~2, 0.8988465674311579E308): 0.8966354048752772E308 0.8966354048752772E308 (0.17976931348623157E309, ~0.123E~2, 0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, 0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.17976931348623157E309): ~inf ~inf (0.17976931348623157E309, ~0.123E~2, ~0.8988465674311579E308): ~0.9010577299870385E308 ~0.9010577299870385E308 (0.17976931348623157E309, ~0.123E~2, ~0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.123E~2, ~0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E4): 0.1226E4 0.1226E4 (0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E2): 0.83E1 0.83E1 (0.17976931348623157E309, ~0.22250738585072014E~307, 0.123): ~0.3877E1 ~0.3877E1 (0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E~2): ~0.39987699999999995E1 ~0.39987699999999995E1 (0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E4): ~0.1234E4 ~0.1234E4 (0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E2): ~0.163E2 ~0.163E2 (0.17976931348623157E309, ~0.22250738585072014E~307, ~0.3141592653589793E1): ~0.7141592653589793E1 ~0.7141592653589793E1 (0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123): ~0.4122999999999999E1 ~0.4122999999999999E1 (0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E~2): ~0.400123E1 ~0.400123E1 (0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E4): 0.1228E4 0.1228E4 (0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E2): 0.103E2 0.103E2 (0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E2): ~0.143E2 ~0.143E2 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (0.17976931348623157E309, ~0.5E~323, 0.123E4): 0.123E4 0.123E4 (0.17976931348623157E309, ~0.5E~323, 0.123E2): 0.123E2 0.123E2 (0.17976931348623157E309, ~0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (0.17976931348623157E309, ~0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (0.8988465674311579E308, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.123E4): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.123E2): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.123E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.123): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.123E~2): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.5E~323): inf inf (0.8988465674311579E308, 0.17976931348623157E309, 0.0): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.123E4): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.123E2): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.123E1): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.123): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.123E~2): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.5E~323): inf inf (0.8988465674311579E308, 0.17976931348623157E309, ~0.0): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.123E4): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.123E2): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.123E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.123): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.123E~2): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.5E~323): inf inf (0.8988465674311579E308, 0.8988465674311579E308, 0.0): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.123E4): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.123E2): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.123E1): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.123): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.123E~2): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.5E~323): inf inf (0.8988465674311579E308, 0.8988465674311579E308, ~0.0): inf inf (0.8988465674311579E308, 0.123E4, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E4, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.123E4, 0.123E4): inf inf (0.8988465674311579E308, 0.123E4, 0.123E2): inf inf (0.8988465674311579E308, 0.123E4, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.123E4, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.123E4, 0.123E1): inf inf (0.8988465674311579E308, 0.123E4, 0.123): inf inf (0.8988465674311579E308, 0.123E4, 0.123E~2): inf inf (0.8988465674311579E308, 0.123E4, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.123E4, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.123E4, 0.5E~323): inf inf (0.8988465674311579E308, 0.123E4, 0.0): inf inf (0.8988465674311579E308, 0.123E4, ~0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E4, ~0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.123E4, ~0.123E4): inf inf (0.8988465674311579E308, 0.123E4, ~0.123E2): inf inf (0.8988465674311579E308, 0.123E4, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.123E4, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.123E4, ~0.123E1): inf inf (0.8988465674311579E308, 0.123E4, ~0.123): inf inf (0.8988465674311579E308, 0.123E4, ~0.123E~2): inf inf (0.8988465674311579E308, 0.123E4, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.123E4, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.123E4, ~0.5E~323): inf inf (0.8988465674311579E308, 0.123E4, ~0.0): inf inf (0.8988465674311579E308, 0.123E2, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E2, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.123E2, 0.123E4): inf inf (0.8988465674311579E308, 0.123E2, 0.123E2): inf inf (0.8988465674311579E308, 0.123E2, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.123E2, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.123E2, 0.123E1): inf inf (0.8988465674311579E308, 0.123E2, 0.123): inf inf (0.8988465674311579E308, 0.123E2, 0.123E~2): inf inf (0.8988465674311579E308, 0.123E2, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.123E2, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.123E2, 0.5E~323): inf inf (0.8988465674311579E308, 0.123E2, 0.0): inf inf (0.8988465674311579E308, 0.123E2, ~0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E2, ~0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.123E2, ~0.123E4): inf inf (0.8988465674311579E308, 0.123E2, ~0.123E2): inf inf (0.8988465674311579E308, 0.123E2, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.123E2, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.123E2, ~0.123E1): inf inf (0.8988465674311579E308, 0.123E2, ~0.123): inf inf (0.8988465674311579E308, 0.123E2, ~0.123E~2): inf inf (0.8988465674311579E308, 0.123E2, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.123E2, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.123E2, ~0.5E~323): inf inf (0.8988465674311579E308, 0.123E2, ~0.0): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.123E4): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.123E2): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.123E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.123): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.123E~2): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.5E~323): inf inf (0.8988465674311579E308, 0.3141592653589793E1, 0.0): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 0.10261166380838123E309 (0.8988465674311579E308, 0.3141592653589793E1, ~0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.123E4): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.123E2): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.123E1): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.123): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.123E~2): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.5E~323): inf inf (0.8988465674311579E308, 0.3141592653589793E1, ~0.0): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.123E4): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.123E2): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.123E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.123): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.123E~2): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.5E~323): inf inf (0.8988465674311579E308, 0.2718281828459045E1, 0.0): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 0.6456251559585884E308 (0.8988465674311579E308, 0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 0.15444717233897463E309 (0.8988465674311579E308, 0.2718281828459045E1, ~0.123E4): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.123E2): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.3141592653589793E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.2718281828459045E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.123E1): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.123): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.123E~2): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.22250738585072014E~307): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.11125369292536007E~307): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.5E~323): inf inf (0.8988465674311579E308, 0.2718281828459045E1, ~0.0): inf inf (0.8988465674311579E308, 0.123E1, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E1, 0.8988465674311579E308): inf inf (0.8988465674311579E308, 0.123E1, 0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.123): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, 0.0): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219915E308 (0.8988465674311579E308, 0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.2067347105091663E308 (0.8988465674311579E308, 0.123E1, ~0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.123): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123E1, ~0.0): 0.1105581277940324E309 0.1105581277940324E309 (0.8988465674311579E308, 0.123, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123, 0.8988465674311579E308): 0.10094046952251902E309 0.10094046952251902E309 (0.8988465674311579E308, 0.123, 0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.123): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, 0.0): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.17976931348623157E309): ~0.16871350070682833E309 ~0.16871350070682833E309 (0.8988465674311579E308, 0.123, ~0.8988465674311579E308): ~0.7882884396371254E308 ~0.7882884396371254E308 (0.8988465674311579E308, 0.123, ~0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.123): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123, ~0.0): 0.11055812779403241E308 0.11055812779403241E308 (0.8988465674311579E308, 0.123E~2, 0.17976931348623157E309): inf inf (0.8988465674311579E308, 0.123E~2, 0.8988465674311579E308): 0.8999521487090981E308 0.8999521487090981E308 (0.8988465674311579E308, 0.123E~2, 0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.123): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, 0.0): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.17976931348623157E309): ~0.17965875535843753E309 ~0.17965875535843753E309 (0.8988465674311579E308, 0.123E~2, ~0.8988465674311579E308): ~0.8977409861532176E308 ~0.8977409861532176E308 (0.8988465674311579E308, 0.123E~2, ~0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.123): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.123E~2, ~0.0): 0.1105581277940324E306 0.1105581277940324E306 (0.8988465674311579E308, 0.22250738585072014E~307, 0.123E4): 0.1232E4 0.1232E4 (0.8988465674311579E308, 0.22250738585072014E~307, 0.123E2): 0.143E2 0.143E2 (0.8988465674311579E308, 0.22250738585072014E~307, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (0.8988465674311579E308, 0.22250738585072014E~307, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (0.8988465674311579E308, 0.22250738585072014E~307, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (0.8988465674311579E308, 0.22250738585072014E~307, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E2): ~0.103E2 ~0.103E2 (0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (0.8988465674311579E308, 0.11125369292536007E~307, 0.123E4): 0.1231E4 0.1231E4 (0.8988465674311579E308, 0.11125369292536007E~307, 0.123E2): 0.133E2 0.133E2 (0.8988465674311579E308, 0.11125369292536007E~307, 0.3141592653589793E1): 0.4141592653589793E1 0.4141592653589793E1 (0.8988465674311579E308, 0.11125369292536007E~307, 0.2718281828459045E1): 0.3718281828459045E1 0.3718281828459045E1 (0.8988465674311579E308, 0.11125369292536007E~307, 0.123E1): 0.223E1 0.223E1 (0.8988465674311579E308, 0.11125369292536007E~307, 0.123): 0.11229999999999998E1 0.11229999999999998E1 (0.8988465674311579E308, 0.11125369292536007E~307, 0.123E~2): 0.10012299999999998E1 0.10012299999999998E1 (0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E4): ~0.1229E4 ~0.1229E4 (0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E2): ~0.113E2 ~0.113E2 (0.8988465674311579E308, 0.11125369292536007E~307, ~0.3141592653589793E1): ~0.2141592653589793E1 ~0.2141592653589793E1 (0.8988465674311579E308, 0.11125369292536007E~307, ~0.2718281828459045E1): ~0.1718281828459045E1 ~0.1718281828459045E1 (0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E~2): 0.9987699999999999 0.9987699999999999 (0.8988465674311579E308, 0.5E~323, 0.123E4): 0.123E4 0.123E4 (0.8988465674311579E308, 0.5E~323, 0.123E2): 0.123E2 0.123E2 (0.8988465674311579E308, 0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (0.8988465674311579E308, 0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (0.8988465674311579E308, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.123E4, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.123E4, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.123E2, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.123E2, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~0.10261166380838123E309 (0.8988465674311579E308, ~0.3141592653589793E1, 0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.3141592653589793E1, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~0.6456251559585884E308 (0.8988465674311579E308, ~0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~0.15444717233897463E309 (0.8988465674311579E308, ~0.2718281828459045E1, 0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.123): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, 0.0): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E4): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E2): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.3141592653589793E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.2718281828459045E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E1): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.123): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E~2): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.5E~323): ~inf ~inf (0.8988465674311579E308, ~0.2718281828459045E1, ~0.0): ~inf ~inf (0.8988465674311579E308, ~0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219915E308 (0.8988465674311579E308, ~0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.2067347105091663E308 (0.8988465674311579E308, ~0.123E1, 0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, 0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E1, ~0.8988465674311579E308): ~inf ~inf (0.8988465674311579E308, ~0.123E1, ~0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123E1, ~0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.8988465674311579E308, ~0.123, 0.17976931348623157E309): 0.16871350070682833E309 0.16871350070682833E309 (0.8988465674311579E308, ~0.123, 0.8988465674311579E308): 0.7882884396371254E308 0.7882884396371254E308 (0.8988465674311579E308, ~0.123, 0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, 0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123, ~0.8988465674311579E308): ~0.10094046952251902E309 ~0.10094046952251902E309 (0.8988465674311579E308, ~0.123, ~0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123, ~0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.8988465674311579E308, ~0.123E~2, 0.17976931348623157E309): 0.17965875535843753E309 0.17965875535843753E309 (0.8988465674311579E308, ~0.123E~2, 0.8988465674311579E308): 0.8977409861532176E308 0.8977409861532176E308 (0.8988465674311579E308, ~0.123E~2, 0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, 0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.17976931348623157E309): ~inf ~inf (0.8988465674311579E308, ~0.123E~2, ~0.8988465674311579E308): ~0.8999521487090981E308 ~0.8999521487090981E308 (0.8988465674311579E308, ~0.123E~2, ~0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.123E~2, ~0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E4): 0.1228E4 0.1228E4 (0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E2): 0.103E2 0.103E2 (0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E2): ~0.143E2 ~0.143E2 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E4): 0.1229E4 0.1229E4 (0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E2): 0.113E2 0.113E2 (0.8988465674311579E308, ~0.11125369292536007E~307, 0.3141592653589793E1): 0.2141592653589793E1 0.2141592653589793E1 (0.8988465674311579E308, ~0.11125369292536007E~307, 0.2718281828459045E1): 0.1718281828459045E1 0.1718281828459045E1 (0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E~2): ~0.9987699999999999 ~0.9987699999999999 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E4): ~0.1231E4 ~0.1231E4 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E2): ~0.133E2 ~0.133E2 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.3141592653589793E1): ~0.4141592653589793E1 ~0.4141592653589793E1 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.2718281828459045E1): ~0.3718281828459045E1 ~0.3718281828459045E1 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E1): ~0.223E1 ~0.223E1 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123): ~0.11229999999999998E1 ~0.11229999999999998E1 (0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E~2): ~0.10012299999999998E1 ~0.10012299999999998E1 (0.8988465674311579E308, ~0.5E~323, 0.123E4): 0.123E4 0.123E4 (0.8988465674311579E308, ~0.5E~323, 0.123E2): 0.123E2 0.123E2 (0.8988465674311579E308, ~0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (0.8988465674311579E308, ~0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (0.123E4, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.123E4, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.123E4, 0.17976931348623157E309, 0.123E4): inf inf (0.123E4, 0.17976931348623157E309, 0.123E2): inf inf (0.123E4, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.123E4, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.123E4, 0.17976931348623157E309, 0.123E1): inf inf (0.123E4, 0.17976931348623157E309, 0.123): inf inf (0.123E4, 0.17976931348623157E309, 0.123E~2): inf inf (0.123E4, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.123E4, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.123E4, 0.17976931348623157E309, 0.5E~323): inf inf (0.123E4, 0.17976931348623157E309, 0.0): inf inf (0.123E4, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.123E4, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.123E4, 0.17976931348623157E309, ~0.123E4): inf inf (0.123E4, 0.17976931348623157E309, ~0.123E2): inf inf (0.123E4, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.123E4, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.123E4, 0.17976931348623157E309, ~0.123E1): inf inf (0.123E4, 0.17976931348623157E309, ~0.123): inf inf (0.123E4, 0.17976931348623157E309, ~0.123E~2): inf inf (0.123E4, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.123E4, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.123E4, 0.17976931348623157E309, ~0.5E~323): inf inf (0.123E4, 0.17976931348623157E309, ~0.0): inf inf (0.123E4, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.123E4, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.123E4, 0.8988465674311579E308, 0.123E4): inf inf (0.123E4, 0.8988465674311579E308, 0.123E2): inf inf (0.123E4, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.123E4, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.123E4, 0.8988465674311579E308, 0.123E1): inf inf (0.123E4, 0.8988465674311579E308, 0.123): inf inf (0.123E4, 0.8988465674311579E308, 0.123E~2): inf inf (0.123E4, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.123E4, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.123E4, 0.8988465674311579E308, 0.5E~323): inf inf (0.123E4, 0.8988465674311579E308, 0.0): inf inf (0.123E4, 0.8988465674311579E308, ~0.17976931348623157E309): inf inf (0.123E4, 0.8988465674311579E308, ~0.8988465674311579E308): inf inf (0.123E4, 0.8988465674311579E308, ~0.123E4): inf inf (0.123E4, 0.8988465674311579E308, ~0.123E2): inf inf (0.123E4, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.123E4, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.123E4, 0.8988465674311579E308, ~0.123E1): inf inf (0.123E4, 0.8988465674311579E308, ~0.123): inf inf (0.123E4, 0.8988465674311579E308, ~0.123E~2): inf inf (0.123E4, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.123E4, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.123E4, 0.8988465674311579E308, ~0.5E~323): inf inf (0.123E4, 0.8988465674311579E308, ~0.0): inf inf (0.123E4, 0.123E4, 0.123E2): 0.15129123E7 0.15129123E7 (0.123E4, 0.123E4, 0.3141592653589793E1): 0.15129031415926537E7 0.15129031415926537E7 (0.123E4, 0.123E4, 0.2718281828459045E1): 0.15129027182818286E7 0.15129027182818286E7 (0.123E4, 0.123E4, 0.123E1): 0.151290123E7 0.151290123E7 (0.123E4, 0.123E4, 0.123): 0.1512900123E7 0.1512900123E7 (0.123E4, 0.123E4, 0.123E~2): 0.151290000123E7 0.151290000123E7 (0.123E4, 0.123E4, ~0.123E2): 0.15128877E7 0.15128877E7 (0.123E4, 0.123E4, ~0.3141592653589793E1): 0.15128968584073463E7 0.15128968584073463E7 (0.123E4, 0.123E4, ~0.2718281828459045E1): 0.15128972817181714E7 0.15128972817181714E7 (0.123E4, 0.123E4, ~0.123E1): 0.151289877E7 0.151289877E7 (0.123E4, 0.123E4, ~0.123): 0.1512899877E7 0.1512899877E7 (0.123E4, 0.123E4, ~0.123E~2): 0.151289999877E7 0.151289999877E7 (0.123E4, 0.123E2, 0.123E4): 0.16359E5 0.16359E5 (0.123E4, 0.123E2, 0.123E2): 0.15141300000000001E5 0.15141300000000001E5 (0.123E4, 0.123E2, 0.3141592653589793E1): 0.1513214159265359E5 0.1513214159265359E5 (0.123E4, 0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.1513171828182846E5 (0.123E4, 0.123E2, 0.123E1): 0.15130230000000001E5 0.15130230000000001E5 (0.123E4, 0.123E2, 0.123): 0.15129123000000001E5 0.15129123000000001E5 (0.123E4, 0.123E2, 0.123E~2): 0.15129001230000002E5 0.15129001230000002E5 (0.123E4, 0.123E2, 0.22250738585072014E~307): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.11125369292536007E~307): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.5E~323): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, 0.0): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.123E4): 0.13899E5 0.13899E5 (0.123E4, 0.123E2, ~0.123E2): 0.151167E5 0.151167E5 (0.123E4, 0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.15125858407346412E5 (0.123E4, 0.123E2, ~0.2718281828459045E1): 0.15126281718171542E5 0.15126281718171542E5 (0.123E4, 0.123E2, ~0.123E1): 0.1512777E5 0.1512777E5 (0.123E4, 0.123E2, ~0.123): 0.15128877E5 0.15128877E5 (0.123E4, 0.123E2, ~0.123E~2): 0.1512899877E5 0.1512899877E5 (0.123E4, 0.123E2, ~0.22250738585072014E~307): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.11125369292536007E~307): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.5E~323): 0.15129E5 0.15129E5 (0.123E4, 0.123E2, ~0.0): 0.15129E5 0.15129E5 (0.123E4, 0.3141592653589793E1, 0.123E4): 0.5094158963915445E4 0.5094158963915445E4 (0.123E4, 0.3141592653589793E1, 0.123E2): 0.38764589639154456E4 0.38764589639154456E4 (0.123E4, 0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.38673005565690355E4 (0.123E4, 0.3141592653589793E1, 0.2718281828459045E1): 0.38668772457439045E4 0.38668772457439045E4 (0.123E4, 0.3141592653589793E1, 0.123E1): 0.38653889639154454E4 0.38653889639154454E4 (0.123E4, 0.3141592653589793E1, 0.123): 0.38642819639154454E4 0.38642819639154454E4 (0.123E4, 0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154457E4 (0.123E4, 0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, 0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, 0.0): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, ~0.123E4): 0.26341589639154454E4 0.26341589639154454E4 (0.123E4, 0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.38518589639154457E4 (0.123E4, 0.3141592653589793E1, ~0.3141592653589793E1): 0.38610173712618557E4 0.38610173712618557E4 (0.123E4, 0.3141592653589793E1, ~0.2718281828459045E1): 0.38614406820869863E4 0.38614406820869863E4 (0.123E4, 0.3141592653589793E1, ~0.123E1): 0.38629289639154454E4 0.38629289639154454E4 (0.123E4, 0.3141592653589793E1, ~0.123): 0.38640359639154453E4 0.38640359639154453E4 (0.123E4, 0.3141592653589793E1, ~0.123E~2): 0.38641577339154455E4 0.38641577339154455E4 (0.123E4, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, ~0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.3141592653589793E1, ~0.0): 0.38641589639154454E4 0.38641589639154454E4 (0.123E4, 0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004625E4 (0.123E4, 0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.33557866490046254E4 (0.123E4, 0.2718281828459045E1, 0.3141592653589793E1): 0.33466282416582153E4 0.33466282416582153E4 (0.123E4, 0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330843E4 (0.123E4, 0.2718281828459045E1, 0.123E1): 0.33447166490046257E4 0.33447166490046257E4 (0.123E4, 0.2718281828459045E1, 0.123): 0.33436096490046257E4 0.33436096490046257E4 (0.123E4, 0.2718281828459045E1, 0.123E~2): 0.33434878790046255E4 0.33434878790046255E4 (0.123E4, 0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, 0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, 0.0): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, ~0.123E4): 0.21134866490046256E4 0.21134866490046256E4 (0.123E4, 0.2718281828459045E1, ~0.123E2): 0.33311866490046255E4 0.33311866490046255E4 (0.123E4, 0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.33403450563510355E4 (0.123E4, 0.2718281828459045E1, ~0.2718281828459045E1): 0.33407683671761665E4 0.33407683671761665E4 (0.123E4, 0.2718281828459045E1, ~0.123E1): 0.33422566490046256E4 0.33422566490046256E4 (0.123E4, 0.2718281828459045E1, ~0.123): 0.33433636490046256E4 0.33433636490046256E4 (0.123E4, 0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.33434854190046253E4 (0.123E4, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, ~0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.2718281828459045E1, ~0.0): 0.33434866490046256E4 0.33434866490046256E4 (0.123E4, 0.123E1, 0.123E4): 0.27429E4 0.27429E4 (0.123E4, 0.123E1, 0.123E2): 0.15252E4 0.15252E4 (0.123E4, 0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.15160415926535898E4 (0.123E4, 0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.1515618281828459E4 (0.123E4, 0.123E1, 0.123E1): 0.15141299999999999E4 0.15141299999999999E4 (0.123E4, 0.123E1, 0.123): 0.1513023E4 0.1513023E4 (0.123E4, 0.123E1, 0.123E~2): 0.151290123E4 0.151290123E4 (0.123E4, 0.123E1, 0.22250738585072014E~307): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.11125369292536007E~307): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.5E~323): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, 0.0): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.123E4): 0.2829E3 0.2829E3 (0.123E4, 0.123E1, ~0.123E2): 0.15006E4 0.15006E4 (0.123E4, 0.123E1, ~0.3141592653589793E1): 0.15097584073464102E4 0.15097584073464102E4 (0.123E4, 0.123E1, ~0.2718281828459045E1): 0.1510181718171541E4 0.1510181718171541E4 (0.123E4, 0.123E1, ~0.123E1): 0.151167E4 0.151167E4 (0.123E4, 0.123E1, ~0.123): 0.1512777E4 0.1512777E4 (0.123E4, 0.123E1, ~0.123E~2): 0.151289877E4 0.151289877E4 (0.123E4, 0.123E1, ~0.22250738585072014E~307): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.11125369292536007E~307): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.5E~323): 0.15129E4 0.15129E4 (0.123E4, 0.123E1, ~0.0): 0.15129E4 0.15129E4 (0.123E4, 0.123, 0.123E4): 0.138129E4 0.138129E4 (0.123E4, 0.123, 0.123E2): 0.16359E3 0.16359E3 (0.123E4, 0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (0.123E4, 0.123, 0.2718281828459045E1): 0.15400828182845905E3 0.15400828182845905E3 (0.123E4, 0.123, 0.123E1): 0.15252E3 0.15252E3 (0.123E4, 0.123, 0.123): 0.151413E3 0.151413E3 (0.123E4, 0.123, 0.123E~2): 0.15129122999999998E3 0.15129122999999998E3 (0.123E4, 0.123, 0.22250738585072014E~307): 0.15129E3 0.15129E3 (0.123E4, 0.123, 0.11125369292536007E~307): 0.15129E3 0.15129E3 (0.123E4, 0.123, 0.5E~323): 0.15129E3 0.15129E3 (0.123E4, 0.123, 0.0): 0.15129E3 0.15129E3 (0.123E4, 0.123, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123E4, 0.123, ~0.123E2): 0.13899E3 0.13899E3 (0.123E4, 0.123, ~0.3141592653589793E1): 0.1481484073464102E3 0.1481484073464102E3 (0.123E4, 0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (0.123E4, 0.123, ~0.123E1): 0.15006E3 0.15006E3 (0.123E4, 0.123, ~0.123): 0.151167E3 0.151167E3 (0.123E4, 0.123, ~0.123E~2): 0.15128877E3 0.15128877E3 (0.123E4, 0.123, ~0.22250738585072014E~307): 0.15129E3 0.15129E3 (0.123E4, 0.123, ~0.11125369292536007E~307): 0.15129E3 0.15129E3 (0.123E4, 0.123, ~0.5E~323): 0.15129E3 0.15129E3 (0.123E4, 0.123, ~0.0): 0.15129E3 0.15129E3 (0.123E4, 0.123E~2, 0.123E4): 0.12315129E4 0.12315129E4 (0.123E4, 0.123E~2, 0.123E2): 0.138129E2 0.138129E2 (0.123E4, 0.123E~2, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (0.123E4, 0.123E~2, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (0.123E4, 0.123E~2, 0.123E1): 0.27429E1 0.27429E1 (0.123E4, 0.123E~2, 0.123): 0.16359E1 0.16359E1 (0.123E4, 0.123E~2, 0.123E~2): 0.151413E1 0.151413E1 (0.123E4, 0.123E~2, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, 0.5E~323): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, 0.0): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (0.123E4, 0.123E~2, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E4, 0.123E~2, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (0.123E4, 0.123E~2, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (0.123E4, 0.123E~2, ~0.123E1): 0.2829 0.2829 (0.123E4, 0.123E~2, ~0.123): 0.13899E1 0.13899E1 (0.123E4, 0.123E~2, ~0.123E~2): 0.151167E1 0.151167E1 (0.123E4, 0.123E~2, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, ~0.5E~323): 0.15129E1 0.15129E1 (0.123E4, 0.123E~2, ~0.0): 0.15129E1 0.15129E1 (0.123E4, 0.22250738585072014E~307, 0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (0.123E4, 0.22250738585072014E~307, ~0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (0.123E4, 0.11125369292536007E~307, 0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (0.123E4, 0.11125369292536007E~307, ~0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (0.123E4, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.123E4, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.123E4, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.123E4, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.123E4, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.123E4, ~0.123E4, 0.123E2): ~0.15128877E7 ~0.15128877E7 (0.123E4, ~0.123E4, 0.3141592653589793E1): ~0.15128968584073463E7 ~0.15128968584073463E7 (0.123E4, ~0.123E4, 0.2718281828459045E1): ~0.15128972817181714E7 ~0.15128972817181714E7 (0.123E4, ~0.123E4, 0.123E1): ~0.151289877E7 ~0.151289877E7 (0.123E4, ~0.123E4, 0.123): ~0.1512899877E7 ~0.1512899877E7 (0.123E4, ~0.123E4, 0.123E~2): ~0.151289999877E7 ~0.151289999877E7 (0.123E4, ~0.123E4, ~0.123E2): ~0.15129123E7 ~0.15129123E7 (0.123E4, ~0.123E4, ~0.3141592653589793E1): ~0.15129031415926537E7 ~0.15129031415926537E7 (0.123E4, ~0.123E4, ~0.2718281828459045E1): ~0.15129027182818286E7 ~0.15129027182818286E7 (0.123E4, ~0.123E4, ~0.123E1): ~0.151290123E7 ~0.151290123E7 (0.123E4, ~0.123E4, ~0.123): ~0.1512900123E7 ~0.1512900123E7 (0.123E4, ~0.123E4, ~0.123E~2): ~0.151290000123E7 ~0.151290000123E7 (0.123E4, ~0.123E2, 0.123E4): ~0.13899E5 ~0.13899E5 (0.123E4, ~0.123E2, 0.123E2): ~0.151167E5 ~0.151167E5 (0.123E4, ~0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.15125858407346412E5 (0.123E4, ~0.123E2, 0.2718281828459045E1): ~0.15126281718171542E5 ~0.15126281718171542E5 (0.123E4, ~0.123E2, 0.123E1): ~0.1512777E5 ~0.1512777E5 (0.123E4, ~0.123E2, 0.123): ~0.15128877E5 ~0.15128877E5 (0.123E4, ~0.123E2, 0.123E~2): ~0.1512899877E5 ~0.1512899877E5 (0.123E4, ~0.123E2, 0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.5E~323): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, 0.0): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.123E4): ~0.16359E5 ~0.16359E5 (0.123E4, ~0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.15141300000000001E5 (0.123E4, ~0.123E2, ~0.3141592653589793E1): ~0.1513214159265359E5 ~0.1513214159265359E5 (0.123E4, ~0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.1513171828182846E5 (0.123E4, ~0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.15130230000000001E5 (0.123E4, ~0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123000000001E5 (0.123E4, ~0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.15129001230000002E5 (0.123E4, ~0.123E2, ~0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.5E~323): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.123E2, ~0.0): ~0.15129E5 ~0.15129E5 (0.123E4, ~0.3141592653589793E1, 0.123E4): ~0.26341589639154454E4 ~0.26341589639154454E4 (0.123E4, ~0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.38518589639154457E4 (0.123E4, ~0.3141592653589793E1, 0.3141592653589793E1): ~0.38610173712618557E4 ~0.38610173712618557E4 (0.123E4, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.38614406820869863E4 ~0.38614406820869863E4 (0.123E4, ~0.3141592653589793E1, 0.123E1): ~0.38629289639154454E4 ~0.38629289639154454E4 (0.123E4, ~0.3141592653589793E1, 0.123): ~0.38640359639154453E4 ~0.38640359639154453E4 (0.123E4, ~0.3141592653589793E1, 0.123E~2): ~0.38641577339154455E4 ~0.38641577339154455E4 (0.123E4, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, 0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, 0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.123E4): ~0.5094158963915445E4 ~0.5094158963915445E4 (0.123E4, ~0.3141592653589793E1, ~0.123E2): ~0.38764589639154456E4 ~0.38764589639154456E4 (0.123E4, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.38673005565690355E4 (0.123E4, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.38668772457439045E4 ~0.38668772457439045E4 (0.123E4, ~0.3141592653589793E1, ~0.123E1): ~0.38653889639154454E4 ~0.38653889639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.123): ~0.38642819639154454E4 ~0.38642819639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154457E4 (0.123E4, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.3141592653589793E1, ~0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.123E4, ~0.2718281828459045E1, 0.123E4): ~0.21134866490046256E4 ~0.21134866490046256E4 (0.123E4, ~0.2718281828459045E1, 0.123E2): ~0.33311866490046255E4 ~0.33311866490046255E4 (0.123E4, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.33403450563510355E4 (0.123E4, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.33407683671761665E4 ~0.33407683671761665E4 (0.123E4, ~0.2718281828459045E1, 0.123E1): ~0.33422566490046256E4 ~0.33422566490046256E4 (0.123E4, ~0.2718281828459045E1, 0.123): ~0.33433636490046256E4 ~0.33433636490046256E4 (0.123E4, ~0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.33434854190046253E4 (0.123E4, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, 0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, 0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004625E4 (0.123E4, ~0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.33557866490046254E4 (0.123E4, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.33466282416582153E4 ~0.33466282416582153E4 (0.123E4, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330843E4 (0.123E4, ~0.2718281828459045E1, ~0.123E1): ~0.33447166490046257E4 ~0.33447166490046257E4 (0.123E4, ~0.2718281828459045E1, ~0.123): ~0.33436096490046257E4 ~0.33436096490046257E4 (0.123E4, ~0.2718281828459045E1, ~0.123E~2): ~0.33434878790046255E4 ~0.33434878790046255E4 (0.123E4, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.2718281828459045E1, ~0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.123E4, ~0.123E1, 0.123E4): ~0.2829E3 ~0.2829E3 (0.123E4, ~0.123E1, 0.123E2): ~0.15006E4 ~0.15006E4 (0.123E4, ~0.123E1, 0.3141592653589793E1): ~0.15097584073464102E4 ~0.15097584073464102E4 (0.123E4, ~0.123E1, 0.2718281828459045E1): ~0.1510181718171541E4 ~0.1510181718171541E4 (0.123E4, ~0.123E1, 0.123E1): ~0.151167E4 ~0.151167E4 (0.123E4, ~0.123E1, 0.123): ~0.1512777E4 ~0.1512777E4 (0.123E4, ~0.123E1, 0.123E~2): ~0.151289877E4 ~0.151289877E4 (0.123E4, ~0.123E1, 0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.5E~323): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, 0.0): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.123E4): ~0.27429E4 ~0.27429E4 (0.123E4, ~0.123E1, ~0.123E2): ~0.15252E4 ~0.15252E4 (0.123E4, ~0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.15160415926535898E4 (0.123E4, ~0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.1515618281828459E4 (0.123E4, ~0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.15141299999999999E4 (0.123E4, ~0.123E1, ~0.123): ~0.1513023E4 ~0.1513023E4 (0.123E4, ~0.123E1, ~0.123E~2): ~0.151290123E4 ~0.151290123E4 (0.123E4, ~0.123E1, ~0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.5E~323): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123E1, ~0.0): ~0.15129E4 ~0.15129E4 (0.123E4, ~0.123, 0.123E4): 0.107871E4 0.107871E4 (0.123E4, ~0.123, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123E4, ~0.123, 0.3141592653589793E1): ~0.1481484073464102E3 ~0.1481484073464102E3 (0.123E4, ~0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (0.123E4, ~0.123, 0.123E1): ~0.15006E3 ~0.15006E3 (0.123E4, ~0.123, 0.123): ~0.151167E3 ~0.151167E3 (0.123E4, ~0.123, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (0.123E4, ~0.123, 0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, 0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, 0.5E~323): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, 0.0): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123E4, ~0.123, ~0.123E2): ~0.16359E3 ~0.16359E3 (0.123E4, ~0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (0.123E4, ~0.123, ~0.2718281828459045E1): ~0.15400828182845905E3 ~0.15400828182845905E3 (0.123E4, ~0.123, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123E4, ~0.123, ~0.123): ~0.151413E3 ~0.151413E3 (0.123E4, ~0.123, ~0.123E~2): ~0.15129122999999998E3 ~0.15129122999999998E3 (0.123E4, ~0.123, ~0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, ~0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, ~0.5E~323): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123, ~0.0): ~0.15129E3 ~0.15129E3 (0.123E4, ~0.123E~2, 0.123E4): 0.12284871E4 0.12284871E4 (0.123E4, ~0.123E~2, 0.123E2): 0.107871E2 0.107871E2 (0.123E4, ~0.123E~2, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (0.123E4, ~0.123E~2, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (0.123E4, ~0.123E~2, 0.123E1): ~0.2829 ~0.2829 (0.123E4, ~0.123E~2, 0.123): ~0.13899E1 ~0.13899E1 (0.123E4, ~0.123E~2, 0.123E~2): ~0.151167E1 ~0.151167E1 (0.123E4, ~0.123E~2, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, 0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, 0.0): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (0.123E4, ~0.123E~2, ~0.123E2): ~0.138129E2 ~0.138129E2 (0.123E4, ~0.123E~2, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (0.123E4, ~0.123E~2, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (0.123E4, ~0.123E~2, ~0.123E1): ~0.27429E1 ~0.27429E1 (0.123E4, ~0.123E~2, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E4, ~0.123E~2, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123E4, ~0.123E~2, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, ~0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.123E~2, ~0.0): ~0.15129E1 ~0.15129E1 (0.123E4, ~0.22250738585072014E~307, 0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (0.123E4, ~0.22250738585072014E~307, ~0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (0.123E4, ~0.11125369292536007E~307, 0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (0.123E4, ~0.11125369292536007E~307, ~0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (0.123E2, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.123E2, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.123E2, 0.17976931348623157E309, 0.123E4): inf inf (0.123E2, 0.17976931348623157E309, 0.123E2): inf inf (0.123E2, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.123E2, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.123E2, 0.17976931348623157E309, 0.123E1): inf inf (0.123E2, 0.17976931348623157E309, 0.123): inf inf (0.123E2, 0.17976931348623157E309, 0.123E~2): inf inf (0.123E2, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.123E2, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.123E2, 0.17976931348623157E309, 0.5E~323): inf inf (0.123E2, 0.17976931348623157E309, 0.0): inf inf (0.123E2, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.123E2, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.123E2, 0.17976931348623157E309, ~0.123E4): inf inf (0.123E2, 0.17976931348623157E309, ~0.123E2): inf inf (0.123E2, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.123E2, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.123E2, 0.17976931348623157E309, ~0.123E1): inf inf (0.123E2, 0.17976931348623157E309, ~0.123): inf inf (0.123E2, 0.17976931348623157E309, ~0.123E~2): inf inf (0.123E2, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.123E2, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.123E2, 0.17976931348623157E309, ~0.5E~323): inf inf (0.123E2, 0.17976931348623157E309, ~0.0): inf inf (0.123E2, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.123E2, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.123E2, 0.8988465674311579E308, 0.123E4): inf inf (0.123E2, 0.8988465674311579E308, 0.123E2): inf inf (0.123E2, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.123E2, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.123E2, 0.8988465674311579E308, 0.123E1): inf inf (0.123E2, 0.8988465674311579E308, 0.123): inf inf (0.123E2, 0.8988465674311579E308, 0.123E~2): inf inf (0.123E2, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.123E2, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.123E2, 0.8988465674311579E308, 0.5E~323): inf inf (0.123E2, 0.8988465674311579E308, 0.0): inf inf (0.123E2, 0.8988465674311579E308, ~0.17976931348623157E309): inf inf (0.123E2, 0.8988465674311579E308, ~0.8988465674311579E308): inf inf (0.123E2, 0.8988465674311579E308, ~0.123E4): inf inf (0.123E2, 0.8988465674311579E308, ~0.123E2): inf inf (0.123E2, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.123E2, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.123E2, 0.8988465674311579E308, ~0.123E1): inf inf (0.123E2, 0.8988465674311579E308, ~0.123): inf inf (0.123E2, 0.8988465674311579E308, ~0.123E~2): inf inf (0.123E2, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.123E2, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.123E2, 0.8988465674311579E308, ~0.5E~323): inf inf (0.123E2, 0.8988465674311579E308, ~0.0): inf inf (0.123E2, 0.123E4, 0.123E4): 0.16359E5 0.16359E5 (0.123E2, 0.123E4, 0.123E2): 0.15141300000000001E5 0.15141300000000001E5 (0.123E2, 0.123E4, 0.3141592653589793E1): 0.1513214159265359E5 0.1513214159265359E5 (0.123E2, 0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.1513171828182846E5 (0.123E2, 0.123E4, 0.123E1): 0.15130230000000001E5 0.15130230000000001E5 (0.123E2, 0.123E4, 0.123): 0.15129123000000001E5 0.15129123000000001E5 (0.123E2, 0.123E4, 0.123E~2): 0.15129001230000002E5 0.15129001230000002E5 (0.123E2, 0.123E4, 0.22250738585072014E~307): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.11125369292536007E~307): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.5E~323): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, 0.0): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.123E4): 0.13899E5 0.13899E5 (0.123E2, 0.123E4, ~0.123E2): 0.151167E5 0.151167E5 (0.123E2, 0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.15125858407346412E5 (0.123E2, 0.123E4, ~0.2718281828459045E1): 0.15126281718171542E5 0.15126281718171542E5 (0.123E2, 0.123E4, ~0.123E1): 0.1512777E5 0.1512777E5 (0.123E2, 0.123E4, ~0.123): 0.15128877E5 0.15128877E5 (0.123E2, 0.123E4, ~0.123E~2): 0.1512899877E5 0.1512899877E5 (0.123E2, 0.123E4, ~0.22250738585072014E~307): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.11125369292536007E~307): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.5E~323): 0.15129E5 0.15129E5 (0.123E2, 0.123E4, ~0.0): 0.15129E5 0.15129E5 (0.123E2, 0.123E2, 0.123E4): 0.138129E4 0.138129E4 (0.123E2, 0.123E2, 0.123E2): 0.16359000000000003E3 0.16359000000000003E3 (0.123E2, 0.123E2, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (0.123E2, 0.123E2, 0.2718281828459045E1): 0.15400828182845908E3 0.15400828182845908E3 (0.123E2, 0.123E2, 0.123E1): 0.15252E3 0.15252E3 (0.123E2, 0.123E2, 0.123): 0.151413E3 0.151413E3 (0.123E2, 0.123E2, 0.123E~2): 0.15129123E3 0.15129123E3 (0.123E2, 0.123E2, 0.22250738585072014E~307): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, 0.11125369292536007E~307): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, 0.5E~323): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, 0.0): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123E2, 0.123E2, ~0.123E2): 0.13899E3 0.13899E3 (0.123E2, 0.123E2, ~0.3141592653589793E1): 0.14814840734641024E3 0.14814840734641024E3 (0.123E2, 0.123E2, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (0.123E2, 0.123E2, ~0.123E1): 0.15006000000000003E3 0.15006000000000003E3 (0.123E2, 0.123E2, ~0.123): 0.15116700000000003E3 0.15116700000000003E3 (0.123E2, 0.123E2, ~0.123E~2): 0.15128877000000003E3 0.15128877000000003E3 (0.123E2, 0.123E2, ~0.22250738585072014E~307): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, ~0.11125369292536007E~307): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, ~0.5E~323): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.123E2, ~0.0): 0.15129000000000002E3 0.15129000000000002E3 (0.123E2, 0.3141592653589793E1, 0.123E4): 0.12686415896391545E4 0.12686415896391545E4 (0.123E2, 0.3141592653589793E1, 0.123E2): 0.5094158963915446E2 0.5094158963915446E2 (0.123E2, 0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274425E2 (0.123E2, 0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.413598714676135E2 (0.123E2, 0.3141592653589793E1, 0.123E1): 0.3987158963915446E2 0.3987158963915446E2 (0.123E2, 0.3141592653589793E1, 0.123): 0.3876458963915446E2 0.3876458963915446E2 (0.123E2, 0.3141592653589793E1, 0.123E~2): 0.3864281963915446E2 0.3864281963915446E2 (0.123E2, 0.3141592653589793E1, 0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, 0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, 0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, 0.0): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.123E4): ~0.11913584103608455E4 ~0.11913584103608455E4 (0.123E2, 0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.26341589639154456E2 (0.123E2, 0.3141592653589793E1, ~0.3141592653589793E1): 0.35499996985564664E2 0.35499996985564664E2 (0.123E2, 0.3141592653589793E1, ~0.2718281828459045E1): 0.3592330781069541E2 0.3592330781069541E2 (0.123E2, 0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.3741158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.38518589639154456E2 (0.123E2, 0.3141592653589793E1, ~0.123E~2): 0.3864035963915446E2 0.3864035963915446E2 (0.123E2, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.3141592653589793E1, ~0.0): 0.3864158963915446E2 0.3864158963915446E2 (0.123E2, 0.2718281828459045E1, 0.123E4): 0.12634348664900463E4 0.12634348664900463E4 (0.123E2, 0.2718281828459045E1, 0.123E2): 0.4573486649004626E2 0.4573486649004626E2 (0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363605E2 (0.123E2, 0.2718281828459045E1, 0.2718281828459045E1): 0.361531483185053E2 0.361531483185053E2 (0.123E2, 0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004626E2 (0.123E2, 0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004626E2 (0.123E2, 0.2718281828459045E1, 0.123E~2): 0.3343609649004625E2 0.3343609649004625E2 (0.123E2, 0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, 0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, 0.0): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, ~0.123E4): ~0.11965651335099537E4 ~0.11965651335099537E4 (0.123E2, 0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046257E2 (0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.30293273836456464E2 (0.123E2, 0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.30716584661587213E2 (0.123E2, 0.2718281828459045E1, ~0.123E1): 0.3220486649004626E2 0.3220486649004626E2 (0.123E2, 0.2718281828459045E1, ~0.123): 0.33311866490046256E2 0.33311866490046256E2 (0.123E2, 0.2718281828459045E1, ~0.123E~2): 0.33433636490046254E2 0.33433636490046254E2 (0.123E2, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, ~0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.2718281828459045E1, ~0.0): 0.33434866490046254E2 0.33434866490046254E2 (0.123E2, 0.123E1, 0.123E4): 0.1245129E4 0.1245129E4 (0.123E2, 0.123E1, 0.123E2): 0.27429000000000002E2 0.27429000000000002E2 (0.123E2, 0.123E1, 0.3141592653589793E1): 0.18270592653589794E2 0.18270592653589794E2 (0.123E2, 0.123E1, 0.2718281828459045E1): 0.17847281828459046E2 0.17847281828459046E2 (0.123E2, 0.123E1, 0.123E1): 0.16359E2 0.16359E2 (0.123E2, 0.123E1, 0.123): 0.15252E2 0.15252E2 (0.123E2, 0.123E1, 0.123E~2): 0.15130230000000001E2 0.15130230000000001E2 (0.123E2, 0.123E1, 0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, 0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, 0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, 0.0): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (0.123E2, 0.123E1, ~0.123E2): 0.28289999999999997E1 0.28289999999999997E1 (0.123E2, 0.123E1, ~0.3141592653589793E1): 0.11987407346410208E2 0.11987407346410208E2 (0.123E2, 0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540955E2 (0.123E2, 0.123E1, ~0.123E1): 0.13899000000000001E2 0.13899000000000001E2 (0.123E2, 0.123E1, ~0.123): 0.15006E2 0.15006E2 (0.123E2, 0.123E1, ~0.123E~2): 0.1512777E2 0.1512777E2 (0.123E2, 0.123E1, ~0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, ~0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, ~0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123E1, ~0.0): 0.15129000000000001E2 0.15129000000000001E2 (0.123E2, 0.123, 0.123E4): 0.12315129E4 0.12315129E4 (0.123E2, 0.123, 0.123E2): 0.138129E2 0.138129E2 (0.123E2, 0.123, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (0.123E2, 0.123, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (0.123E2, 0.123, 0.123E1): 0.27429E1 0.27429E1 (0.123E2, 0.123, 0.123): 0.16359000000000001E1 0.16359000000000001E1 (0.123E2, 0.123, 0.123E~2): 0.151413E1 0.151413E1 (0.123E2, 0.123, 0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, 0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, 0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, 0.0): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (0.123E2, 0.123, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E2, 0.123, ~0.3141592653589793E1): ~0.1628692653589793E1 ~0.1628692653589793E1 (0.123E2, 0.123, ~0.2718281828459045E1): ~0.1205381828459045E1 ~0.1205381828459045E1 (0.123E2, 0.123, ~0.123E1): 0.2829000000000001 0.2829000000000001 (0.123E2, 0.123, ~0.123): 0.13899000000000001E1 0.13899000000000001E1 (0.123E2, 0.123, ~0.123E~2): 0.151167E1 0.151167E1 (0.123E2, 0.123, ~0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, ~0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, ~0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123, ~0.0): 0.15129000000000001E1 0.15129000000000001E1 (0.123E2, 0.123E~2, 0.123E4): 0.1230015129E4 0.1230015129E4 (0.123E2, 0.123E~2, 0.123E2): 0.12315129E2 0.12315129E2 (0.123E2, 0.123E~2, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (0.123E2, 0.123E~2, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (0.123E2, 0.123E~2, 0.123E1): 0.1245129E1 0.1245129E1 (0.123E2, 0.123E~2, 0.123): 0.138129 0.138129 (0.123E2, 0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359000000000002E~1 (0.123E2, 0.123E~2, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, 0.5E~323): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, 0.0): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (0.123E2, 0.123E~2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123E2, 0.123E~2, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (0.123E2, 0.123E~2, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (0.123E2, 0.123E~2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123E2, 0.123E~2, ~0.123): ~0.107871 ~0.107871 (0.123E2, 0.123E~2, ~0.123E~2): 0.13899E~1 0.13899E~1 (0.123E2, 0.123E~2, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, ~0.5E~323): 0.15129E~1 0.15129E~1 (0.123E2, 0.123E~2, ~0.0): 0.15129E~1 0.15129E~1 (0.123E2, 0.22250738585072014E~307, 0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (0.123E2, 0.22250738585072014E~307, ~0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (0.123E2, 0.11125369292536007E~307, 0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (0.123E2, 0.11125369292536007E~307, ~0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (0.123E2, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072073E~307 0.22250738585072073E~307 (0.123E2, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536066E~307 0.11125369292536066E~307 (0.123E2, 0.5E~323, 0.5E~323): 0.64E~322 0.64E~322 (0.123E2, 0.5E~323, 0.0): 0.6E~322 0.6E~322 (0.123E2, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585071955E~307 ~0.22250738585071955E~307 (0.123E2, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253595E~307 ~0.1112536929253595E~307 (0.123E2, 0.5E~323, ~0.5E~323): 0.54E~322 0.54E~322 (0.123E2, 0.5E~323, ~0.0): 0.6E~322 0.6E~322 (0.123E2, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.123E2, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.123E2, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.123E2, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.123E2, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.123E2, ~0.123E4, 0.123E4): ~0.13899E5 ~0.13899E5 (0.123E2, ~0.123E4, 0.123E2): ~0.151167E5 ~0.151167E5 (0.123E2, ~0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.15125858407346412E5 (0.123E2, ~0.123E4, 0.2718281828459045E1): ~0.15126281718171542E5 ~0.15126281718171542E5 (0.123E2, ~0.123E4, 0.123E1): ~0.1512777E5 ~0.1512777E5 (0.123E2, ~0.123E4, 0.123): ~0.15128877E5 ~0.15128877E5 (0.123E2, ~0.123E4, 0.123E~2): ~0.1512899877E5 ~0.1512899877E5 (0.123E2, ~0.123E4, 0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.5E~323): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, 0.0): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.123E4): ~0.16359E5 ~0.16359E5 (0.123E2, ~0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.15141300000000001E5 (0.123E2, ~0.123E4, ~0.3141592653589793E1): ~0.1513214159265359E5 ~0.1513214159265359E5 (0.123E2, ~0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.1513171828182846E5 (0.123E2, ~0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.15130230000000001E5 (0.123E2, ~0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123000000001E5 (0.123E2, ~0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.15129001230000002E5 (0.123E2, ~0.123E4, ~0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.5E~323): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E4, ~0.0): ~0.15129E5 ~0.15129E5 (0.123E2, ~0.123E2, 0.123E4): 0.107871E4 0.107871E4 (0.123E2, ~0.123E2, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123E2, ~0.123E2, 0.3141592653589793E1): ~0.14814840734641024E3 ~0.14814840734641024E3 (0.123E2, ~0.123E2, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (0.123E2, ~0.123E2, 0.123E1): ~0.15006000000000003E3 ~0.15006000000000003E3 (0.123E2, ~0.123E2, 0.123): ~0.15116700000000003E3 ~0.15116700000000003E3 (0.123E2, ~0.123E2, 0.123E~2): ~0.15128877000000003E3 ~0.15128877000000003E3 (0.123E2, ~0.123E2, 0.22250738585072014E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, 0.11125369292536007E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, 0.5E~323): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, 0.0): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123E2, ~0.123E2, ~0.123E2): ~0.16359000000000003E3 ~0.16359000000000003E3 (0.123E2, ~0.123E2, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (0.123E2, ~0.123E2, ~0.2718281828459045E1): ~0.15400828182845908E3 ~0.15400828182845908E3 (0.123E2, ~0.123E2, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123E2, ~0.123E2, ~0.123): ~0.151413E3 ~0.151413E3 (0.123E2, ~0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (0.123E2, ~0.123E2, ~0.22250738585072014E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, ~0.11125369292536007E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, ~0.5E~323): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.123E2, ~0.0): ~0.15129000000000002E3 ~0.15129000000000002E3 (0.123E2, ~0.3141592653589793E1, 0.123E4): 0.11913584103608455E4 0.11913584103608455E4 (0.123E2, ~0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.26341589639154456E2 (0.123E2, ~0.3141592653589793E1, 0.3141592653589793E1): ~0.35499996985564664E2 ~0.35499996985564664E2 (0.123E2, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.3592330781069541E2 ~0.3592330781069541E2 (0.123E2, ~0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.3741158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.38518589639154456E2 (0.123E2, ~0.3141592653589793E1, 0.123E~2): ~0.3864035963915446E2 ~0.3864035963915446E2 (0.123E2, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, 0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.123E4): ~0.12686415896391545E4 ~0.12686415896391545E4 (0.123E2, ~0.3141592653589793E1, ~0.123E2): ~0.5094158963915446E2 ~0.5094158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274425E2 (0.123E2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.413598714676135E2 (0.123E2, ~0.3141592653589793E1, ~0.123E1): ~0.3987158963915446E2 ~0.3987158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.123): ~0.3876458963915446E2 ~0.3876458963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.123E~2): ~0.3864281963915446E2 ~0.3864281963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.3141592653589793E1, ~0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.123E2, ~0.2718281828459045E1, 0.123E4): 0.11965651335099537E4 0.11965651335099537E4 (0.123E2, ~0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046257E2 (0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.30293273836456464E2 (0.123E2, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.30716584661587213E2 (0.123E2, ~0.2718281828459045E1, 0.123E1): ~0.3220486649004626E2 ~0.3220486649004626E2 (0.123E2, ~0.2718281828459045E1, 0.123): ~0.33311866490046256E2 ~0.33311866490046256E2 (0.123E2, ~0.2718281828459045E1, 0.123E~2): ~0.33433636490046254E2 ~0.33433636490046254E2 (0.123E2, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, 0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, 0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, ~0.123E4): ~0.12634348664900463E4 ~0.12634348664900463E4 (0.123E2, ~0.2718281828459045E1, ~0.123E2): ~0.4573486649004626E2 ~0.4573486649004626E2 (0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363605E2 (0.123E2, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.361531483185053E2 ~0.361531483185053E2 (0.123E2, ~0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004626E2 (0.123E2, ~0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004626E2 (0.123E2, ~0.2718281828459045E1, ~0.123E~2): ~0.3343609649004625E2 ~0.3343609649004625E2 (0.123E2, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, ~0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.2718281828459045E1, ~0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.123E2, ~0.123E1, 0.123E4): 0.1214871E4 0.1214871E4 (0.123E2, ~0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28289999999999997E1 (0.123E2, ~0.123E1, 0.3141592653589793E1): ~0.11987407346410208E2 ~0.11987407346410208E2 (0.123E2, ~0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540955E2 (0.123E2, ~0.123E1, 0.123E1): ~0.13899000000000001E2 ~0.13899000000000001E2 (0.123E2, ~0.123E1, 0.123): ~0.15006E2 ~0.15006E2 (0.123E2, ~0.123E1, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (0.123E2, ~0.123E1, 0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, 0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, 0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, 0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (0.123E2, ~0.123E1, ~0.123E2): ~0.27429000000000002E2 ~0.27429000000000002E2 (0.123E2, ~0.123E1, ~0.3141592653589793E1): ~0.18270592653589794E2 ~0.18270592653589794E2 (0.123E2, ~0.123E1, ~0.2718281828459045E1): ~0.17847281828459046E2 ~0.17847281828459046E2 (0.123E2, ~0.123E1, ~0.123E1): ~0.16359E2 ~0.16359E2 (0.123E2, ~0.123E1, ~0.123): ~0.15252E2 ~0.15252E2 (0.123E2, ~0.123E1, ~0.123E~2): ~0.15130230000000001E2 ~0.15130230000000001E2 (0.123E2, ~0.123E1, ~0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, ~0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, ~0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123E1, ~0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E2, ~0.123, 0.123E4): 0.12284871E4 0.12284871E4 (0.123E2, ~0.123, 0.123E2): 0.107871E2 0.107871E2 (0.123E2, ~0.123, 0.3141592653589793E1): 0.1628692653589793E1 0.1628692653589793E1 (0.123E2, ~0.123, 0.2718281828459045E1): 0.1205381828459045E1 0.1205381828459045E1 (0.123E2, ~0.123, 0.123E1): ~0.2829000000000001 ~0.2829000000000001 (0.123E2, ~0.123, 0.123): ~0.13899000000000001E1 ~0.13899000000000001E1 (0.123E2, ~0.123, 0.123E~2): ~0.151167E1 ~0.151167E1 (0.123E2, ~0.123, 0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, 0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, 0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, 0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (0.123E2, ~0.123, ~0.123E2): ~0.138129E2 ~0.138129E2 (0.123E2, ~0.123, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (0.123E2, ~0.123, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (0.123E2, ~0.123, ~0.123E1): ~0.27429E1 ~0.27429E1 (0.123E2, ~0.123, ~0.123): ~0.16359000000000001E1 ~0.16359000000000001E1 (0.123E2, ~0.123, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123E2, ~0.123, ~0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, ~0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, ~0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123, ~0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123E2, ~0.123E~2, 0.123E4): 0.1229984871E4 0.1229984871E4 (0.123E2, ~0.123E~2, 0.123E2): 0.12284871E2 0.12284871E2 (0.123E2, ~0.123E~2, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (0.123E2, ~0.123E~2, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (0.123E2, ~0.123E~2, 0.123E1): 0.1214871E1 0.1214871E1 (0.123E2, ~0.123E~2, 0.123): 0.107871 0.107871 (0.123E2, ~0.123E~2, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (0.123E2, ~0.123E~2, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, 0.0): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (0.123E2, ~0.123E~2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123E2, ~0.123E~2, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (0.123E2, ~0.123E~2, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (0.123E2, ~0.123E~2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123E2, ~0.123E~2, ~0.123): ~0.138129 ~0.138129 (0.123E2, ~0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359000000000002E~1 (0.123E2, ~0.123E~2, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.123E~2, ~0.0): ~0.15129E~1 ~0.15129E~1 (0.123E2, ~0.22250738585072014E~307, 0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (0.123E2, ~0.22250738585072014E~307, ~0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (0.123E2, ~0.11125369292536007E~307, 0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (0.123E2, ~0.11125369292536007E~307, ~0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (0.123E2, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585071955E~307 0.22250738585071955E~307 (0.123E2, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253595E~307 0.1112536929253595E~307 (0.123E2, ~0.5E~323, 0.5E~323): ~0.54E~322 ~0.54E~322 (0.123E2, ~0.5E~323, 0.0): ~0.6E~322 ~0.6E~322 (0.123E2, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072073E~307 ~0.22250738585072073E~307 (0.123E2, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536066E~307 ~0.11125369292536066E~307 (0.123E2, ~0.5E~323, ~0.5E~323): ~0.64E~322 ~0.64E~322 (0.123E2, ~0.5E~323, ~0.0): ~0.6E~322 ~0.6E~322 (0.3141592653589793E1, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.123E4): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.123E2): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.123E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.123): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.123E~2): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.5E~323): inf inf (0.3141592653589793E1, 0.17976931348623157E309, 0.0): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.123E4): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.123E2): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.123E1): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.123): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.123E~2): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.5E~323): inf inf (0.3141592653589793E1, 0.17976931348623157E309, ~0.0): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.123E4): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.123E2): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.123E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.123): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.123E~2): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.5E~323): inf inf (0.3141592653589793E1, 0.8988465674311579E308, 0.0): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 0.10261166380838123E309 (0.3141592653589793E1, 0.8988465674311579E308, ~0.8988465674311579E308): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.123E4): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.123E2): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.123E1): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.123): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.123E~2): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.5E~323): inf inf (0.3141592653589793E1, 0.8988465674311579E308, ~0.0): inf inf (0.3141592653589793E1, 0.123E4, 0.123E4): 0.5094158963915445E4 0.5094158963915445E4 (0.3141592653589793E1, 0.123E4, 0.123E2): 0.38764589639154456E4 0.38764589639154456E4 (0.3141592653589793E1, 0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.38673005565690355E4 (0.3141592653589793E1, 0.123E4, 0.2718281828459045E1): 0.38668772457439045E4 0.38668772457439045E4 (0.3141592653589793E1, 0.123E4, 0.123E1): 0.38653889639154454E4 0.38653889639154454E4 (0.3141592653589793E1, 0.123E4, 0.123): 0.38642819639154454E4 0.38642819639154454E4 (0.3141592653589793E1, 0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154457E4 (0.3141592653589793E1, 0.123E4, 0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, 0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, 0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, 0.0): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, ~0.123E4): 0.26341589639154454E4 0.26341589639154454E4 (0.3141592653589793E1, 0.123E4, ~0.123E2): 0.38518589639154457E4 0.38518589639154457E4 (0.3141592653589793E1, 0.123E4, ~0.3141592653589793E1): 0.38610173712618557E4 0.38610173712618557E4 (0.3141592653589793E1, 0.123E4, ~0.2718281828459045E1): 0.38614406820869863E4 0.38614406820869863E4 (0.3141592653589793E1, 0.123E4, ~0.123E1): 0.38629289639154454E4 0.38629289639154454E4 (0.3141592653589793E1, 0.123E4, ~0.123): 0.38640359639154453E4 0.38640359639154453E4 (0.3141592653589793E1, 0.123E4, ~0.123E~2): 0.38641577339154455E4 0.38641577339154455E4 (0.3141592653589793E1, 0.123E4, ~0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, ~0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, ~0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E4, ~0.0): 0.38641589639154454E4 0.38641589639154454E4 (0.3141592653589793E1, 0.123E2, 0.123E4): 0.12686415896391545E4 0.12686415896391545E4 (0.3141592653589793E1, 0.123E2, 0.123E2): 0.5094158963915446E2 0.5094158963915446E2 (0.3141592653589793E1, 0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274425E2 (0.3141592653589793E1, 0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.413598714676135E2 (0.3141592653589793E1, 0.123E2, 0.123E1): 0.3987158963915446E2 0.3987158963915446E2 (0.3141592653589793E1, 0.123E2, 0.123): 0.3876458963915446E2 0.3876458963915446E2 (0.3141592653589793E1, 0.123E2, 0.123E~2): 0.3864281963915446E2 0.3864281963915446E2 (0.3141592653589793E1, 0.123E2, 0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, 0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, 0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, 0.0): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.123E4): ~0.11913584103608455E4 ~0.11913584103608455E4 (0.3141592653589793E1, 0.123E2, ~0.123E2): 0.26341589639154456E2 0.26341589639154456E2 (0.3141592653589793E1, 0.123E2, ~0.3141592653589793E1): 0.35499996985564664E2 0.35499996985564664E2 (0.3141592653589793E1, 0.123E2, ~0.2718281828459045E1): 0.3592330781069541E2 0.3592330781069541E2 (0.3141592653589793E1, 0.123E2, ~0.123E1): 0.3741158963915446E2 0.3741158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.123): 0.38518589639154456E2 0.38518589639154456E2 (0.3141592653589793E1, 0.123E2, ~0.123E~2): 0.3864035963915446E2 0.3864035963915446E2 (0.3141592653589793E1, 0.123E2, ~0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.123E2, ~0.0): 0.3864158963915446E2 0.3864158963915446E2 (0.3141592653589793E1, 0.3141592653589793E1, 0.123E4): 0.12398696044010894E4 0.12398696044010894E4 (0.3141592653589793E1, 0.3141592653589793E1, 0.123E2): 0.2216960440108936E2 0.2216960440108936E2 (0.3141592653589793E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.13011197054679151E2 0.13011197054679151E2 (0.3141592653589793E1, 0.3141592653589793E1, 0.2718281828459045E1): 0.12587886229548403E2 0.12587886229548403E2 (0.3141592653589793E1, 0.3141592653589793E1, 0.123E1): 0.11099604401089358E2 0.11099604401089358E2 (0.3141592653589793E1, 0.3141592653589793E1, 0.123): 0.9992604401089357E1 0.9992604401089357E1 (0.3141592653589793E1, 0.3141592653589793E1, 0.123E~2): 0.9870834401089358E1 0.9870834401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, 0.22250738585072014E~307): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, 0.11125369292536007E~307): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, 0.5E~323): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, 0.0): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.123E4): ~0.12201303955989106E4 ~0.12201303955989106E4 (0.3141592653589793E1, 0.3141592653589793E1, ~0.123E2): ~0.24303955989106427E1 ~0.24303955989106427E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.3141592653589793E1): 0.6728011747499565E1 0.6728011747499565E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.71513225726303125E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.123E1): 0.8639604401089358E1 0.8639604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.123): 0.9746604401089359E1 0.9746604401089359E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.123E~2): 0.9868374401089358E1 0.9868374401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.5E~323): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.3141592653589793E1, ~0.0): 0.9869604401089358E1 0.9869604401089358E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123E4): 0.12385397342226736E4 0.12385397342226736E4 (0.3141592653589793E1, 0.2718281828459045E1, 0.123E2): 0.20839734222673567E2 0.20839734222673567E2 (0.3141592653589793E1, 0.2718281828459045E1, 0.3141592653589793E1): 0.11681326876263359E2 0.11681326876263359E2 (0.3141592653589793E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.1125801605113261E2 0.1125801605113261E2 (0.3141592653589793E1, 0.2718281828459045E1, 0.123E1): 0.9769734222673566E1 0.9769734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673567E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.123E~2): 0.8540964222673566E1 0.8540964222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, 0.0): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E4): ~0.12214602657773264E4 ~0.12214602657773264E4 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264343E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.5398141569083773E1 0.5398141569083773E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.5821452394214521E1 0.5821452394214521E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.7309734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123): 0.8416734222673567E1 0.8416734222673567E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.123E~2): 0.8538504222673566E1 0.8538504222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.2718281828459045E1, ~0.0): 0.8539734222673566E1 0.8539734222673566E1 (0.3141592653589793E1, 0.123E1, 0.123E4): 0.12338641589639155E4 0.12338641589639155E4 (0.3141592653589793E1, 0.123E1, 0.123E2): 0.16164158963915447E2 0.16164158963915447E2 (0.3141592653589793E1, 0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505239E1 (0.3141592653589793E1, 0.123E1, 0.2718281828459045E1): 0.65824407923744905E1 0.65824407923744905E1 (0.3141592653589793E1, 0.123E1, 0.123E1): 0.5094158963915445E1 0.5094158963915445E1 (0.3141592653589793E1, 0.123E1, 0.123): 0.39871589639154457E1 0.39871589639154457E1 (0.3141592653589793E1, 0.123E1, 0.123E~2): 0.38653889639154455E1 0.38653889639154455E1 (0.3141592653589793E1, 0.123E1, 0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, 0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, 0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, 0.0): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, ~0.123E4): ~0.12261358410360845E4 ~0.12261358410360845E4 (0.3141592653589793E1, 0.123E1, ~0.123E2): ~0.8435841036084556E1 ~0.8435841036084556E1 (0.3141592653589793E1, 0.123E1, ~0.3141592653589793E1): 0.7225663103256523 0.7225663103256523 (0.3141592653589793E1, 0.123E1, ~0.2718281828459045E1): 0.11458771354564004E1 0.11458771354564004E1 (0.3141592653589793E1, 0.123E1, ~0.123E1): 0.26341589639154455E1 0.26341589639154455E1 (0.3141592653589793E1, 0.123E1, ~0.123): 0.37411589639154457E1 0.37411589639154457E1 (0.3141592653589793E1, 0.123E1, ~0.123E~2): 0.38629289639154454E1 0.38629289639154454E1 (0.3141592653589793E1, 0.123E1, ~0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, ~0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, ~0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123E1, ~0.0): 0.38641589639154454E1 0.38641589639154454E1 (0.3141592653589793E1, 0.123, 0.123E4): 0.12303864158963916E4 0.12303864158963916E4 (0.3141592653589793E1, 0.123, 0.123E2): 0.12686415896391546E2 0.12686415896391546E2 (0.3141592653589793E1, 0.123, 0.3141592653589793E1): 0.35280085499813376E1 0.35280085499813376E1 (0.3141592653589793E1, 0.123, 0.2718281828459045E1): 0.31046977248505896E1 0.31046977248505896E1 (0.3141592653589793E1, 0.123, 0.123E1): 0.16164158963915445E1 0.16164158963915445E1 (0.3141592653589793E1, 0.123, 0.123): 0.5094158963915445 0.5094158963915445 (0.3141592653589793E1, 0.123, 0.123E~2): 0.38764589639154456 0.38764589639154456 (0.3141592653589793E1, 0.123, 0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, 0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, 0.5E~323): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, 0.0): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, ~0.123E4): ~0.12296135841036084E4 ~0.12296135841036084E4 (0.3141592653589793E1, 0.123, ~0.123E2): ~0.11913584103608455E2 ~0.11913584103608455E2 (0.3141592653589793E1, 0.123, ~0.3141592653589793E1): ~0.27551767571982486E1 ~0.27551767571982486E1 (0.3141592653589793E1, 0.123, ~0.2718281828459045E1): ~0.23318659320675006E1 ~0.23318659320675006E1 (0.3141592653589793E1, 0.123, ~0.123E1): ~0.8435841036084555 ~0.8435841036084555 (0.3141592653589793E1, 0.123, ~0.123): 0.26341589639154456 0.26341589639154456 (0.3141592653589793E1, 0.123, ~0.123E~2): 0.38518589639154455 0.38518589639154455 (0.3141592653589793E1, 0.123, ~0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, ~0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, ~0.5E~323): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123, ~0.0): 0.38641589639154456 0.38641589639154456 (0.3141592653589793E1, 0.123E~2, 0.123E4): 0.1230003864158964E4 0.1230003864158964E4 (0.3141592653589793E1, 0.123E~2, 0.123E2): 0.12303864158963917E2 0.12303864158963917E2 (0.3141592653589793E1, 0.123E~2, 0.3141592653589793E1): 0.31454568125537086E1 0.31454568125537086E1 (0.3141592653589793E1, 0.123E~2, 0.2718281828459045E1): 0.27221459874229605E1 0.27221459874229605E1 (0.3141592653589793E1, 0.123E~2, 0.123E1): 0.12338641589639154E1 0.12338641589639154E1 (0.3141592653589793E1, 0.123E~2, 0.123): 0.12686415896391545 0.12686415896391545 (0.3141592653589793E1, 0.123E~2, 0.123E~2): 0.5094158963915445E~2 0.5094158963915445E~2 (0.3141592653589793E1, 0.123E~2, 0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, 0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, 0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, 0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, ~0.123E4): ~0.1229996135841036E4 ~0.1229996135841036E4 (0.3141592653589793E1, 0.123E~2, ~0.123E2): ~0.12296135841036085E2 ~0.12296135841036085E2 (0.3141592653589793E1, 0.123E~2, ~0.3141592653589793E1): ~0.31377284946258777E1 ~0.31377284946258777E1 (0.3141592653589793E1, 0.123E~2, ~0.2718281828459045E1): ~0.27144176694951296E1 ~0.27144176694951296E1 (0.3141592653589793E1, 0.123E~2, ~0.123E1): ~0.12261358410360845E1 ~0.12261358410360845E1 (0.3141592653589793E1, 0.123E~2, ~0.123): ~0.11913584103608456 ~0.11913584103608456 (0.3141592653589793E1, 0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.26341589639154455E~2 (0.3141592653589793E1, 0.123E~2, ~0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, ~0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, ~0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.123E~2, ~0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (0.3141592653589793E1, 0.22250738585072014E~307, 0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (0.3141592653589793E1, 0.22250738585072014E~307, ~0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (0.3141592653589793E1, 0.5E~323, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (0.3141592653589793E1, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (0.3141592653589793E1, 0.5E~323, 0.5E~323): 0.2E~322 0.2E~322 (0.3141592653589793E1, 0.5E~323, 0.0): 0.15E~322 0.15E~322 (0.3141592653589793E1, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (0.3141592653589793E1, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (0.3141592653589793E1, 0.5E~323, ~0.5E~323): 0.1E~322 0.1E~322 (0.3141592653589793E1, 0.5E~323, ~0.0): 0.15E~322 0.15E~322 (0.3141592653589793E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.3141592653589793E1, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~0.10261166380838123E309 (0.3141592653589793E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.3141592653589793E1, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.3141592653589793E1, ~0.123E4, 0.123E4): ~0.26341589639154454E4 ~0.26341589639154454E4 (0.3141592653589793E1, ~0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.38518589639154457E4 (0.3141592653589793E1, ~0.123E4, 0.3141592653589793E1): ~0.38610173712618557E4 ~0.38610173712618557E4 (0.3141592653589793E1, ~0.123E4, 0.2718281828459045E1): ~0.38614406820869863E4 ~0.38614406820869863E4 (0.3141592653589793E1, ~0.123E4, 0.123E1): ~0.38629289639154454E4 ~0.38629289639154454E4 (0.3141592653589793E1, ~0.123E4, 0.123): ~0.38640359639154453E4 ~0.38640359639154453E4 (0.3141592653589793E1, ~0.123E4, 0.123E~2): ~0.38641577339154455E4 ~0.38641577339154455E4 (0.3141592653589793E1, ~0.123E4, 0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, 0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, 0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, 0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.123E4): ~0.5094158963915445E4 ~0.5094158963915445E4 (0.3141592653589793E1, ~0.123E4, ~0.123E2): ~0.38764589639154456E4 ~0.38764589639154456E4 (0.3141592653589793E1, ~0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.38673005565690355E4 (0.3141592653589793E1, ~0.123E4, ~0.2718281828459045E1): ~0.38668772457439045E4 ~0.38668772457439045E4 (0.3141592653589793E1, ~0.123E4, ~0.123E1): ~0.38653889639154454E4 ~0.38653889639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.123): ~0.38642819639154454E4 ~0.38642819639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154457E4 (0.3141592653589793E1, ~0.123E4, ~0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E4, ~0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (0.3141592653589793E1, ~0.123E2, 0.123E4): 0.11913584103608455E4 0.11913584103608455E4 (0.3141592653589793E1, ~0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.26341589639154456E2 (0.3141592653589793E1, ~0.123E2, 0.3141592653589793E1): ~0.35499996985564664E2 ~0.35499996985564664E2 (0.3141592653589793E1, ~0.123E2, 0.2718281828459045E1): ~0.3592330781069541E2 ~0.3592330781069541E2 (0.3141592653589793E1, ~0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.3741158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.123): ~0.38518589639154456E2 ~0.38518589639154456E2 (0.3141592653589793E1, ~0.123E2, 0.123E~2): ~0.3864035963915446E2 ~0.3864035963915446E2 (0.3141592653589793E1, ~0.123E2, 0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, 0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.123E4): ~0.12686415896391545E4 ~0.12686415896391545E4 (0.3141592653589793E1, ~0.123E2, ~0.123E2): ~0.5094158963915446E2 ~0.5094158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274425E2 (0.3141592653589793E1, ~0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.413598714676135E2 (0.3141592653589793E1, ~0.123E2, ~0.123E1): ~0.3987158963915446E2 ~0.3987158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.123): ~0.3876458963915446E2 ~0.3876458963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.123E~2): ~0.3864281963915446E2 ~0.3864281963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.123E2, ~0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (0.3141592653589793E1, ~0.3141592653589793E1, 0.123E4): 0.12201303955989106E4 0.12201303955989106E4 (0.3141592653589793E1, ~0.3141592653589793E1, 0.123E2): 0.24303955989106427E1 0.24303955989106427E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.3141592653589793E1): ~0.6728011747499565E1 ~0.6728011747499565E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.71513225726303125E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.123E1): ~0.8639604401089358E1 ~0.8639604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.123): ~0.9746604401089359E1 ~0.9746604401089359E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.123E~2): ~0.9868374401089358E1 ~0.9868374401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.5E~323): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, 0.0): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E4): ~0.12398696044010894E4 ~0.12398696044010894E4 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E2): ~0.2216960440108936E2 ~0.2216960440108936E2 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.13011197054679151E2 ~0.13011197054679151E2 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.12587886229548403E2 ~0.12587886229548403E2 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E1): ~0.11099604401089358E2 ~0.11099604401089358E2 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.123): ~0.9992604401089357E1 ~0.9992604401089357E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E~2): ~0.9870834401089358E1 ~0.9870834401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.5E~323): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.3141592653589793E1, ~0.0): ~0.9869604401089358E1 ~0.9869604401089358E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E4): 0.12214602657773264E4 0.12214602657773264E4 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264343E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.5398141569083773E1 ~0.5398141569083773E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.5821452394214521E1 ~0.5821452394214521E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.7309734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123): ~0.8416734222673567E1 ~0.8416734222673567E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.123E~2): ~0.8538504222673566E1 ~0.8538504222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, 0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E4): ~0.12385397342226736E4 ~0.12385397342226736E4 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E2): ~0.20839734222673567E2 ~0.20839734222673567E2 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.11681326876263359E2 ~0.11681326876263359E2 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.1125801605113261E2 ~0.1125801605113261E2 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E1): ~0.9769734222673566E1 ~0.9769734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673567E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E~2): ~0.8540964222673566E1 ~0.8540964222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.2718281828459045E1, ~0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.3141592653589793E1, ~0.123E1, 0.123E4): 0.12261358410360845E4 0.12261358410360845E4 (0.3141592653589793E1, ~0.123E1, 0.123E2): 0.8435841036084556E1 0.8435841036084556E1 (0.3141592653589793E1, ~0.123E1, 0.3141592653589793E1): ~0.7225663103256523 ~0.7225663103256523 (0.3141592653589793E1, ~0.123E1, 0.2718281828459045E1): ~0.11458771354564004E1 ~0.11458771354564004E1 (0.3141592653589793E1, ~0.123E1, 0.123E1): ~0.26341589639154455E1 ~0.26341589639154455E1 (0.3141592653589793E1, ~0.123E1, 0.123): ~0.37411589639154457E1 ~0.37411589639154457E1 (0.3141592653589793E1, ~0.123E1, 0.123E~2): ~0.38629289639154454E1 ~0.38629289639154454E1 (0.3141592653589793E1, ~0.123E1, 0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, 0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, 0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, 0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, ~0.123E4): ~0.12338641589639155E4 ~0.12338641589639155E4 (0.3141592653589793E1, ~0.123E1, ~0.123E2): ~0.16164158963915447E2 ~0.16164158963915447E2 (0.3141592653589793E1, ~0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505239E1 (0.3141592653589793E1, ~0.123E1, ~0.2718281828459045E1): ~0.65824407923744905E1 ~0.65824407923744905E1 (0.3141592653589793E1, ~0.123E1, ~0.123E1): ~0.5094158963915445E1 ~0.5094158963915445E1 (0.3141592653589793E1, ~0.123E1, ~0.123): ~0.39871589639154457E1 ~0.39871589639154457E1 (0.3141592653589793E1, ~0.123E1, ~0.123E~2): ~0.38653889639154455E1 ~0.38653889639154455E1 (0.3141592653589793E1, ~0.123E1, ~0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, ~0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, ~0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123E1, ~0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.3141592653589793E1, ~0.123, 0.123E4): 0.12296135841036084E4 0.12296135841036084E4 (0.3141592653589793E1, ~0.123, 0.123E2): 0.11913584103608455E2 0.11913584103608455E2 (0.3141592653589793E1, ~0.123, 0.3141592653589793E1): 0.27551767571982486E1 0.27551767571982486E1 (0.3141592653589793E1, ~0.123, 0.2718281828459045E1): 0.23318659320675006E1 0.23318659320675006E1 (0.3141592653589793E1, ~0.123, 0.123E1): 0.8435841036084555 0.8435841036084555 (0.3141592653589793E1, ~0.123, 0.123): ~0.26341589639154456 ~0.26341589639154456 (0.3141592653589793E1, ~0.123, 0.123E~2): ~0.38518589639154455 ~0.38518589639154455 (0.3141592653589793E1, ~0.123, 0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, 0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, 0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, 0.0): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, ~0.123E4): ~0.12303864158963916E4 ~0.12303864158963916E4 (0.3141592653589793E1, ~0.123, ~0.123E2): ~0.12686415896391546E2 ~0.12686415896391546E2 (0.3141592653589793E1, ~0.123, ~0.3141592653589793E1): ~0.35280085499813376E1 ~0.35280085499813376E1 (0.3141592653589793E1, ~0.123, ~0.2718281828459045E1): ~0.31046977248505896E1 ~0.31046977248505896E1 (0.3141592653589793E1, ~0.123, ~0.123E1): ~0.16164158963915445E1 ~0.16164158963915445E1 (0.3141592653589793E1, ~0.123, ~0.123): ~0.5094158963915445 ~0.5094158963915445 (0.3141592653589793E1, ~0.123, ~0.123E~2): ~0.38764589639154456 ~0.38764589639154456 (0.3141592653589793E1, ~0.123, ~0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, ~0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, ~0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123, ~0.0): ~0.38641589639154456 ~0.38641589639154456 (0.3141592653589793E1, ~0.123E~2, 0.123E4): 0.1229996135841036E4 0.1229996135841036E4 (0.3141592653589793E1, ~0.123E~2, 0.123E2): 0.12296135841036085E2 0.12296135841036085E2 (0.3141592653589793E1, ~0.123E~2, 0.3141592653589793E1): 0.31377284946258777E1 0.31377284946258777E1 (0.3141592653589793E1, ~0.123E~2, 0.2718281828459045E1): 0.27144176694951296E1 0.27144176694951296E1 (0.3141592653589793E1, ~0.123E~2, 0.123E1): 0.12261358410360845E1 0.12261358410360845E1 (0.3141592653589793E1, ~0.123E~2, 0.123): 0.11913584103608456 0.11913584103608456 (0.3141592653589793E1, ~0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.26341589639154455E~2 (0.3141592653589793E1, ~0.123E~2, 0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, 0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, 0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, 0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, ~0.123E4): ~0.1230003864158964E4 ~0.1230003864158964E4 (0.3141592653589793E1, ~0.123E~2, ~0.123E2): ~0.12303864158963917E2 ~0.12303864158963917E2 (0.3141592653589793E1, ~0.123E~2, ~0.3141592653589793E1): ~0.31454568125537086E1 ~0.31454568125537086E1 (0.3141592653589793E1, ~0.123E~2, ~0.2718281828459045E1): ~0.27221459874229605E1 ~0.27221459874229605E1 (0.3141592653589793E1, ~0.123E~2, ~0.123E1): ~0.12338641589639154E1 ~0.12338641589639154E1 (0.3141592653589793E1, ~0.123E~2, ~0.123): ~0.12686415896391545 ~0.12686415896391545 (0.3141592653589793E1, ~0.123E~2, ~0.123E~2): ~0.5094158963915445E~2 ~0.5094158963915445E~2 (0.3141592653589793E1, ~0.123E~2, ~0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, ~0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, ~0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.123E~2, ~0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.3141592653589793E1, ~0.22250738585072014E~307, 0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (0.3141592653589793E1, ~0.22250738585072014E~307, ~0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (0.3141592653589793E1, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (0.3141592653589793E1, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (0.3141592653589793E1, ~0.5E~323, 0.5E~323): ~0.1E~322 ~0.1E~322 (0.3141592653589793E1, ~0.5E~323, 0.0): ~0.15E~322 ~0.15E~322 (0.3141592653589793E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (0.3141592653589793E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (0.3141592653589793E1, ~0.5E~323, ~0.5E~323): ~0.2E~322 ~0.2E~322 (0.3141592653589793E1, ~0.5E~323, ~0.0): ~0.15E~322 ~0.15E~322 (0.2718281828459045E1, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.123E4): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.123E2): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.123E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.123): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.123E~2): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.5E~323): inf inf (0.2718281828459045E1, 0.17976931348623157E309, 0.0): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.17976931348623157E309): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.8988465674311579E308): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.123E4): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.123E2): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.123E1): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.123): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.123E~2): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.5E~323): inf inf (0.2718281828459045E1, 0.17976931348623157E309, ~0.0): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.123E4): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.123E2): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.3141592653589793E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.2718281828459045E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.123E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.123): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.123E~2): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.22250738585072014E~307): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.11125369292536007E~307): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.5E~323): inf inf (0.2718281828459045E1, 0.8988465674311579E308, 0.0): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 0.6456251559585884E308 (0.2718281828459045E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 0.15444717233897463E309 (0.2718281828459045E1, 0.8988465674311579E308, ~0.123E4): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.123E2): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.3141592653589793E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.2718281828459045E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.123E1): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.123): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.123E~2): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.5E~323): inf inf (0.2718281828459045E1, 0.8988465674311579E308, ~0.0): inf inf (0.2718281828459045E1, 0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004625E4 (0.2718281828459045E1, 0.123E4, 0.123E2): 0.33557866490046254E4 0.33557866490046254E4 (0.2718281828459045E1, 0.123E4, 0.3141592653589793E1): 0.33466282416582153E4 0.33466282416582153E4 (0.2718281828459045E1, 0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330843E4 (0.2718281828459045E1, 0.123E4, 0.123E1): 0.33447166490046257E4 0.33447166490046257E4 (0.2718281828459045E1, 0.123E4, 0.123): 0.33436096490046257E4 0.33436096490046257E4 (0.2718281828459045E1, 0.123E4, 0.123E~2): 0.33434878790046255E4 0.33434878790046255E4 (0.2718281828459045E1, 0.123E4, 0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, 0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, 0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, 0.0): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, ~0.123E4): 0.21134866490046256E4 0.21134866490046256E4 (0.2718281828459045E1, 0.123E4, ~0.123E2): 0.33311866490046255E4 0.33311866490046255E4 (0.2718281828459045E1, 0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.33403450563510355E4 (0.2718281828459045E1, 0.123E4, ~0.2718281828459045E1): 0.33407683671761665E4 0.33407683671761665E4 (0.2718281828459045E1, 0.123E4, ~0.123E1): 0.33422566490046256E4 0.33422566490046256E4 (0.2718281828459045E1, 0.123E4, ~0.123): 0.33433636490046256E4 0.33433636490046256E4 (0.2718281828459045E1, 0.123E4, ~0.123E~2): 0.33434854190046253E4 0.33434854190046253E4 (0.2718281828459045E1, 0.123E4, ~0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, ~0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, ~0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E4, ~0.0): 0.33434866490046256E4 0.33434866490046256E4 (0.2718281828459045E1, 0.123E2, 0.123E4): 0.12634348664900463E4 0.12634348664900463E4 (0.2718281828459045E1, 0.123E2, 0.123E2): 0.4573486649004626E2 0.4573486649004626E2 (0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363605E2 (0.2718281828459045E1, 0.123E2, 0.2718281828459045E1): 0.361531483185053E2 0.361531483185053E2 (0.2718281828459045E1, 0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004626E2 (0.2718281828459045E1, 0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004626E2 (0.2718281828459045E1, 0.123E2, 0.123E~2): 0.3343609649004625E2 0.3343609649004625E2 (0.2718281828459045E1, 0.123E2, 0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, 0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, 0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, 0.0): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, ~0.123E4): ~0.11965651335099537E4 ~0.11965651335099537E4 (0.2718281828459045E1, 0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046257E2 (0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.30293273836456464E2 (0.2718281828459045E1, 0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.30716584661587213E2 (0.2718281828459045E1, 0.123E2, ~0.123E1): 0.3220486649004626E2 0.3220486649004626E2 (0.2718281828459045E1, 0.123E2, ~0.123): 0.33311866490046256E2 0.33311866490046256E2 (0.2718281828459045E1, 0.123E2, ~0.123E~2): 0.33433636490046254E2 0.33433636490046254E2 (0.2718281828459045E1, 0.123E2, ~0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, ~0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, ~0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.123E2, ~0.0): 0.33434866490046254E2 0.33434866490046254E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.123E4): 0.12385397342226736E4 0.12385397342226736E4 (0.2718281828459045E1, 0.3141592653589793E1, 0.123E2): 0.20839734222673567E2 0.20839734222673567E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.11681326876263359E2 0.11681326876263359E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.2718281828459045E1): 0.1125801605113261E2 0.1125801605113261E2 (0.2718281828459045E1, 0.3141592653589793E1, 0.123E1): 0.9769734222673566E1 0.9769734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673567E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.123E~2): 0.8540964222673566E1 0.8540964222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, 0.0): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E4): ~0.12214602657773264E4 ~0.12214602657773264E4 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264343E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.3141592653589793E1): 0.5398141569083773E1 0.5398141569083773E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.5821452394214521E1 0.5821452394214521E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.7309734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123): 0.8416734222673567E1 0.8416734222673567E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.123E~2): 0.8538504222673566E1 0.8538504222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.3141592653589793E1, ~0.0): 0.8539734222673566E1 0.8539734222673566E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.123E4): 0.12373890560989307E4 0.12373890560989307E4 (0.2718281828459045E1, 0.2718281828459045E1, 0.123E2): 0.1968905609893065E2 0.1968905609893065E2 (0.2718281828459045E1, 0.2718281828459045E1, 0.3141592653589793E1): 0.10530648752520442E2 0.10530648752520442E2 (0.2718281828459045E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.10107337927389695E2 0.10107337927389695E2 (0.2718281828459045E1, 0.2718281828459045E1, 0.123E1): 0.8619056098930649E1 0.8619056098930649E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.123): 0.751205609893065E1 0.751205609893065E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.123E~2): 0.7390286098930649E1 0.7390286098930649E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.22250738585072014E~307): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.11125369292536007E~307): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.5E~323): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, 0.0): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E4): ~0.12226109439010693E4 ~0.12226109439010693E4 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E2): ~0.4910943901069351E1 ~0.4910943901069351E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.4247463445340856E1 0.4247463445340856E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.4670774270471604E1 0.4670774270471604E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.6159056098930649E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123): 0.7266056098930649E1 0.7266056098930649E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.7387826098930649E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.5E~323): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.2718281828459045E1, ~0.0): 0.73890560989306495E1 0.73890560989306495E1 (0.2718281828459045E1, 0.123E1, 0.123E4): 0.12333434866490047E4 0.12333434866490047E4 (0.2718281828459045E1, 0.123E1, 0.123E2): 0.15643486649004625E2 0.15643486649004625E2 (0.2718281828459045E1, 0.123E1, 0.3141592653589793E1): 0.6485079302594419E1 0.6485079302594419E1 (0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.606176847746367E1 (0.2718281828459045E1, 0.123E1, 0.123E1): 0.4573486649004625E1 0.4573486649004625E1 (0.2718281828459045E1, 0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046253E1 (0.2718281828459045E1, 0.123E1, 0.123E~2): 0.33447166490046256E1 0.33447166490046256E1 (0.2718281828459045E1, 0.123E1, 0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, 0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, 0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, 0.0): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, ~0.123E4): ~0.12266565133509953E4 ~0.12266565133509953E4 (0.2718281828459045E1, 0.123E1, ~0.123E2): ~0.8956513350995376E1 ~0.8956513350995376E1 (0.2718281828459045E1, 0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.2018939954148323 (0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455804 (0.2718281828459045E1, 0.123E1, ~0.123E1): 0.21134866490046256E1 0.21134866490046256E1 (0.2718281828459045E1, 0.123E1, ~0.123): 0.32204866490046253E1 0.32204866490046253E1 (0.2718281828459045E1, 0.123E1, ~0.123E~2): 0.33422566490046255E1 0.33422566490046255E1 (0.2718281828459045E1, 0.123E1, ~0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, ~0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, ~0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123E1, ~0.0): 0.33434866490046256E1 0.33434866490046256E1 (0.2718281828459045E1, 0.123, 0.123E4): 0.12303343486649005E4 0.12303343486649005E4 (0.2718281828459045E1, 0.123, 0.123E2): 0.12634348664900463E2 0.12634348664900463E2 (0.2718281828459045E1, 0.123, 0.3141592653589793E1): 0.34759413184902557E1 0.34759413184902557E1 (0.2718281828459045E1, 0.123, 0.2718281828459045E1): 0.30526304933595076E1 0.30526304933595076E1 (0.2718281828459045E1, 0.123, 0.123E1): 0.15643486649004625E1 0.15643486649004625E1 (0.2718281828459045E1, 0.123, 0.123): 0.45734866490046255 0.45734866490046255 (0.2718281828459045E1, 0.123, 0.123E~2): 0.33557866490046256 0.33557866490046256 (0.2718281828459045E1, 0.123, 0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, 0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, 0.5E~323): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, 0.0): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, ~0.123E4): ~0.12296656513350995E4 ~0.12296656513350995E4 (0.2718281828459045E1, 0.123, ~0.123E2): ~0.11965651335099539E2 ~0.11965651335099539E2 (0.2718281828459045E1, 0.123, ~0.3141592653589793E1): ~0.28072439886893306E1 ~0.28072439886893306E1 (0.2718281828459045E1, 0.123, ~0.2718281828459045E1): ~0.23839331635585825E1 ~0.23839331635585825E1 (0.2718281828459045E1, 0.123, ~0.123E1): ~0.8956513350995374 ~0.8956513350995374 (0.2718281828459045E1, 0.123, ~0.123): 0.21134866490046253 0.21134866490046253 (0.2718281828459045E1, 0.123, ~0.123E~2): 0.33311866490046255 0.33311866490046255 (0.2718281828459045E1, 0.123, ~0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, ~0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, ~0.5E~323): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123, ~0.0): 0.33434866490046256 0.33434866490046256 (0.2718281828459045E1, 0.123E~2, 0.123E4): 0.1230003343486649E4 0.1230003343486649E4 (0.2718281828459045E1, 0.123E~2, 0.123E2): 0.12303343486649005E2 0.12303343486649005E2 (0.2718281828459045E1, 0.123E~2, 0.3141592653589793E1): 0.3144936140238798E1 0.3144936140238798E1 (0.2718281828459045E1, 0.123E~2, 0.2718281828459045E1): 0.272162531510805E1 0.272162531510805E1 (0.2718281828459045E1, 0.123E~2, 0.123E1): 0.12333434866490045E1 0.12333434866490045E1 (0.2718281828459045E1, 0.123E~2, 0.123): 0.12634348664900463 0.12634348664900463 (0.2718281828459045E1, 0.123E~2, 0.123E~2): 0.4573486649004625E~2 0.4573486649004625E~2 (0.2718281828459045E1, 0.123E~2, 0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, 0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, 0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, 0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, ~0.123E4): ~0.1229996656513351E4 ~0.1229996656513351E4 (0.2718281828459045E1, 0.123E~2, ~0.123E2): ~0.12296656513350996E2 ~0.12296656513350996E2 (0.2718281828459045E1, 0.123E~2, ~0.3141592653589793E1): ~0.31382491669407884E1 ~0.31382491669407884E1 (0.2718281828459045E1, 0.123E~2, ~0.2718281828459045E1): ~0.27149383418100403E1 ~0.27149383418100403E1 (0.2718281828459045E1, 0.123E~2, ~0.123E1): ~0.12266565133509955E1 ~0.12266565133509955E1 (0.2718281828459045E1, 0.123E~2, ~0.123): ~0.11965651335099538 ~0.11965651335099538 (0.2718281828459045E1, 0.123E~2, ~0.123E~2): 0.21134866490046256E~2 0.21134866490046256E~2 (0.2718281828459045E1, 0.123E~2, ~0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, ~0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, ~0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.123E~2, ~0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (0.2718281828459045E1, 0.22250738585072014E~307, 0.5E~323): 0.6048377836559379E~307 0.6048377836559379E~307 (0.2718281828459045E1, 0.22250738585072014E~307, ~0.5E~323): 0.6048377836559377E~307 0.6048377836559377E~307 (0.2718281828459045E1, 0.11125369292536007E~307, 0.22250738585072014E~307): 0.524926277678689E~307 0.524926277678689E~307 (0.2718281828459045E1, 0.5E~323, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (0.2718281828459045E1, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (0.2718281828459045E1, 0.5E~323, 0.5E~323): 0.2E~322 0.2E~322 (0.2718281828459045E1, 0.5E~323, 0.0): 0.15E~322 0.15E~322 (0.2718281828459045E1, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (0.2718281828459045E1, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (0.2718281828459045E1, 0.5E~323, ~0.5E~323): 0.1E~322 0.1E~322 (0.2718281828459045E1, 0.5E~323, ~0.0): 0.15E~322 0.15E~322 (0.2718281828459045E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.2718281828459045E1, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~0.6456251559585884E308 (0.2718281828459045E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~0.15444717233897463E309 (0.2718281828459045E1, ~0.8988465674311579E308, 0.123E4): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.123E2): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.123E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.123): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.123E~2): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.5E~323): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, 0.0): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E4): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E2): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E1): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.123): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E~2): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.5E~323): ~inf ~inf (0.2718281828459045E1, ~0.8988465674311579E308, ~0.0): ~inf ~inf (0.2718281828459045E1, ~0.123E4, 0.123E4): ~0.21134866490046256E4 ~0.21134866490046256E4 (0.2718281828459045E1, ~0.123E4, 0.123E2): ~0.33311866490046255E4 ~0.33311866490046255E4 (0.2718281828459045E1, ~0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.33403450563510355E4 (0.2718281828459045E1, ~0.123E4, 0.2718281828459045E1): ~0.33407683671761665E4 ~0.33407683671761665E4 (0.2718281828459045E1, ~0.123E4, 0.123E1): ~0.33422566490046256E4 ~0.33422566490046256E4 (0.2718281828459045E1, ~0.123E4, 0.123): ~0.33433636490046256E4 ~0.33433636490046256E4 (0.2718281828459045E1, ~0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.33434854190046253E4 (0.2718281828459045E1, ~0.123E4, 0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, 0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, 0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, 0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004625E4 (0.2718281828459045E1, ~0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.33557866490046254E4 (0.2718281828459045E1, ~0.123E4, ~0.3141592653589793E1): ~0.33466282416582153E4 ~0.33466282416582153E4 (0.2718281828459045E1, ~0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330843E4 (0.2718281828459045E1, ~0.123E4, ~0.123E1): ~0.33447166490046257E4 ~0.33447166490046257E4 (0.2718281828459045E1, ~0.123E4, ~0.123): ~0.33436096490046257E4 ~0.33436096490046257E4 (0.2718281828459045E1, ~0.123E4, ~0.123E~2): ~0.33434878790046255E4 ~0.33434878790046255E4 (0.2718281828459045E1, ~0.123E4, ~0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, ~0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, ~0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E4, ~0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (0.2718281828459045E1, ~0.123E2, 0.123E4): 0.11965651335099537E4 0.11965651335099537E4 (0.2718281828459045E1, ~0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046257E2 (0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.30293273836456464E2 (0.2718281828459045E1, ~0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.30716584661587213E2 (0.2718281828459045E1, ~0.123E2, 0.123E1): ~0.3220486649004626E2 ~0.3220486649004626E2 (0.2718281828459045E1, ~0.123E2, 0.123): ~0.33311866490046256E2 ~0.33311866490046256E2 (0.2718281828459045E1, ~0.123E2, 0.123E~2): ~0.33433636490046254E2 ~0.33433636490046254E2 (0.2718281828459045E1, ~0.123E2, 0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, 0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, 0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, 0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, ~0.123E4): ~0.12634348664900463E4 ~0.12634348664900463E4 (0.2718281828459045E1, ~0.123E2, ~0.123E2): ~0.4573486649004626E2 ~0.4573486649004626E2 (0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363605E2 (0.2718281828459045E1, ~0.123E2, ~0.2718281828459045E1): ~0.361531483185053E2 ~0.361531483185053E2 (0.2718281828459045E1, ~0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004626E2 (0.2718281828459045E1, ~0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004626E2 (0.2718281828459045E1, ~0.123E2, ~0.123E~2): ~0.3343609649004625E2 ~0.3343609649004625E2 (0.2718281828459045E1, ~0.123E2, ~0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, ~0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, ~0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.123E2, ~0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E4): 0.12214602657773264E4 0.12214602657773264E4 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264343E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.3141592653589793E1): ~0.5398141569083773E1 ~0.5398141569083773E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.5821452394214521E1 ~0.5821452394214521E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.7309734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123): ~0.8416734222673567E1 ~0.8416734222673567E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.123E~2): ~0.8538504222673566E1 ~0.8538504222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, 0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E4): ~0.12385397342226736E4 ~0.12385397342226736E4 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E2): ~0.20839734222673567E2 ~0.20839734222673567E2 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.11681326876263359E2 ~0.11681326876263359E2 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.1125801605113261E2 ~0.1125801605113261E2 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E1): ~0.9769734222673566E1 ~0.9769734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673567E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E~2): ~0.8540964222673566E1 ~0.8540964222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.3141592653589793E1, ~0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E4): 0.12226109439010693E4 0.12226109439010693E4 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E2): 0.4910943901069351E1 0.4910943901069351E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.4247463445340856E1 ~0.4247463445340856E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.4670774270471604E1 ~0.4670774270471604E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.6159056098930649E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123): ~0.7266056098930649E1 ~0.7266056098930649E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.7387826098930649E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.5E~323): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, 0.0): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E4): ~0.12373890560989307E4 ~0.12373890560989307E4 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E2): ~0.1968905609893065E2 ~0.1968905609893065E2 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.10530648752520442E2 ~0.10530648752520442E2 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.10107337927389695E2 ~0.10107337927389695E2 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E1): ~0.8619056098930649E1 ~0.8619056098930649E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.123): ~0.751205609893065E1 ~0.751205609893065E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E~2): ~0.7390286098930649E1 ~0.7390286098930649E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.5E~323): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.2718281828459045E1, ~0.0): ~0.73890560989306495E1 ~0.73890560989306495E1 (0.2718281828459045E1, ~0.123E1, 0.123E4): 0.12266565133509953E4 0.12266565133509953E4 (0.2718281828459045E1, ~0.123E1, 0.123E2): 0.8956513350995376E1 0.8956513350995376E1 (0.2718281828459045E1, ~0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.2018939954148323 (0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455804 (0.2718281828459045E1, ~0.123E1, 0.123E1): ~0.21134866490046256E1 ~0.21134866490046256E1 (0.2718281828459045E1, ~0.123E1, 0.123): ~0.32204866490046253E1 ~0.32204866490046253E1 (0.2718281828459045E1, ~0.123E1, 0.123E~2): ~0.33422566490046255E1 ~0.33422566490046255E1 (0.2718281828459045E1, ~0.123E1, 0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, 0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, 0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, 0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, ~0.123E4): ~0.12333434866490047E4 ~0.12333434866490047E4 (0.2718281828459045E1, ~0.123E1, ~0.123E2): ~0.15643486649004625E2 ~0.15643486649004625E2 (0.2718281828459045E1, ~0.123E1, ~0.3141592653589793E1): ~0.6485079302594419E1 ~0.6485079302594419E1 (0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.606176847746367E1 (0.2718281828459045E1, ~0.123E1, ~0.123E1): ~0.4573486649004625E1 ~0.4573486649004625E1 (0.2718281828459045E1, ~0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046253E1 (0.2718281828459045E1, ~0.123E1, ~0.123E~2): ~0.33447166490046256E1 ~0.33447166490046256E1 (0.2718281828459045E1, ~0.123E1, ~0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, ~0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, ~0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123E1, ~0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.2718281828459045E1, ~0.123, 0.123E4): 0.12296656513350995E4 0.12296656513350995E4 (0.2718281828459045E1, ~0.123, 0.123E2): 0.11965651335099539E2 0.11965651335099539E2 (0.2718281828459045E1, ~0.123, 0.3141592653589793E1): 0.28072439886893306E1 0.28072439886893306E1 (0.2718281828459045E1, ~0.123, 0.2718281828459045E1): 0.23839331635585825E1 0.23839331635585825E1 (0.2718281828459045E1, ~0.123, 0.123E1): 0.8956513350995374 0.8956513350995374 (0.2718281828459045E1, ~0.123, 0.123): ~0.21134866490046253 ~0.21134866490046253 (0.2718281828459045E1, ~0.123, 0.123E~2): ~0.33311866490046255 ~0.33311866490046255 (0.2718281828459045E1, ~0.123, 0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, 0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, 0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, 0.0): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, ~0.123E4): ~0.12303343486649005E4 ~0.12303343486649005E4 (0.2718281828459045E1, ~0.123, ~0.123E2): ~0.12634348664900463E2 ~0.12634348664900463E2 (0.2718281828459045E1, ~0.123, ~0.3141592653589793E1): ~0.34759413184902557E1 ~0.34759413184902557E1 (0.2718281828459045E1, ~0.123, ~0.2718281828459045E1): ~0.30526304933595076E1 ~0.30526304933595076E1 (0.2718281828459045E1, ~0.123, ~0.123E1): ~0.15643486649004625E1 ~0.15643486649004625E1 (0.2718281828459045E1, ~0.123, ~0.123): ~0.45734866490046255 ~0.45734866490046255 (0.2718281828459045E1, ~0.123, ~0.123E~2): ~0.33557866490046256 ~0.33557866490046256 (0.2718281828459045E1, ~0.123, ~0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, ~0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, ~0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123, ~0.0): ~0.33434866490046256 ~0.33434866490046256 (0.2718281828459045E1, ~0.123E~2, 0.123E4): 0.1229996656513351E4 0.1229996656513351E4 (0.2718281828459045E1, ~0.123E~2, 0.123E2): 0.12296656513350996E2 0.12296656513350996E2 (0.2718281828459045E1, ~0.123E~2, 0.3141592653589793E1): 0.31382491669407884E1 0.31382491669407884E1 (0.2718281828459045E1, ~0.123E~2, 0.2718281828459045E1): 0.27149383418100403E1 0.27149383418100403E1 (0.2718281828459045E1, ~0.123E~2, 0.123E1): 0.12266565133509955E1 0.12266565133509955E1 (0.2718281828459045E1, ~0.123E~2, 0.123): 0.11965651335099538 0.11965651335099538 (0.2718281828459045E1, ~0.123E~2, 0.123E~2): ~0.21134866490046256E~2 ~0.21134866490046256E~2 (0.2718281828459045E1, ~0.123E~2, 0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, 0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, 0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, 0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, ~0.123E4): ~0.1230003343486649E4 ~0.1230003343486649E4 (0.2718281828459045E1, ~0.123E~2, ~0.123E2): ~0.12303343486649005E2 ~0.12303343486649005E2 (0.2718281828459045E1, ~0.123E~2, ~0.3141592653589793E1): ~0.3144936140238798E1 ~0.3144936140238798E1 (0.2718281828459045E1, ~0.123E~2, ~0.2718281828459045E1): ~0.272162531510805E1 ~0.272162531510805E1 (0.2718281828459045E1, ~0.123E~2, ~0.123E1): ~0.12333434866490045E1 ~0.12333434866490045E1 (0.2718281828459045E1, ~0.123E~2, ~0.123): ~0.12634348664900463 ~0.12634348664900463 (0.2718281828459045E1, ~0.123E~2, ~0.123E~2): ~0.4573486649004625E~2 ~0.4573486649004625E~2 (0.2718281828459045E1, ~0.123E~2, ~0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, ~0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, ~0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.123E~2, ~0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.2718281828459045E1, ~0.22250738585072014E~307, 0.5E~323): ~0.6048377836559377E~307 ~0.6048377836559377E~307 (0.2718281828459045E1, ~0.22250738585072014E~307, ~0.5E~323): ~0.6048377836559379E~307 ~0.6048377836559379E~307 (0.2718281828459045E1, ~0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.524926277678689E~307 ~0.524926277678689E~307 (0.2718281828459045E1, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (0.2718281828459045E1, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (0.2718281828459045E1, ~0.5E~323, 0.5E~323): ~0.1E~322 ~0.1E~322 (0.2718281828459045E1, ~0.5E~323, 0.0): ~0.15E~322 ~0.15E~322 (0.2718281828459045E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (0.2718281828459045E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (0.2718281828459045E1, ~0.5E~323, ~0.5E~323): ~0.2E~322 ~0.2E~322 (0.2718281828459045E1, ~0.5E~323, ~0.0): ~0.15E~322 ~0.15E~322 (0.123E1, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.123E1, 0.17976931348623157E309, 0.8988465674311579E308): inf inf (0.123E1, 0.17976931348623157E309, 0.123E4): inf inf (0.123E1, 0.17976931348623157E309, 0.123E2): inf inf (0.123E1, 0.17976931348623157E309, 0.3141592653589793E1): inf inf (0.123E1, 0.17976931348623157E309, 0.2718281828459045E1): inf inf (0.123E1, 0.17976931348623157E309, 0.123E1): inf inf (0.123E1, 0.17976931348623157E309, 0.123): inf inf (0.123E1, 0.17976931348623157E309, 0.123E~2): inf inf (0.123E1, 0.17976931348623157E309, 0.22250738585072014E~307): inf inf (0.123E1, 0.17976931348623157E309, 0.11125369292536007E~307): inf inf (0.123E1, 0.17976931348623157E309, 0.5E~323): inf inf (0.123E1, 0.17976931348623157E309, 0.0): inf inf (0.123E1, 0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 0.4134694210183326E308 (0.123E1, 0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 0.13123159884494904E309 (0.123E1, 0.17976931348623157E309, ~0.123E4): inf inf (0.123E1, 0.17976931348623157E309, ~0.123E2): inf inf (0.123E1, 0.17976931348623157E309, ~0.3141592653589793E1): inf inf (0.123E1, 0.17976931348623157E309, ~0.2718281828459045E1): inf inf (0.123E1, 0.17976931348623157E309, ~0.123E1): inf inf (0.123E1, 0.17976931348623157E309, ~0.123): inf inf (0.123E1, 0.17976931348623157E309, ~0.123E~2): inf inf (0.123E1, 0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (0.123E1, 0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (0.123E1, 0.17976931348623157E309, ~0.5E~323): inf inf (0.123E1, 0.17976931348623157E309, ~0.0): inf inf (0.123E1, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.123E1, 0.8988465674311579E308, 0.8988465674311579E308): inf inf (0.123E1, 0.8988465674311579E308, 0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.123): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, 0.0): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219915E308 (0.123E1, 0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.2067347105091663E308 (0.123E1, 0.8988465674311579E308, ~0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.123): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.8988465674311579E308, ~0.0): 0.1105581277940324E309 0.1105581277940324E309 (0.123E1, 0.123E4, 0.123E4): 0.27429E4 0.27429E4 (0.123E1, 0.123E4, 0.123E2): 0.15252E4 0.15252E4 (0.123E1, 0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.15160415926535898E4 (0.123E1, 0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.1515618281828459E4 (0.123E1, 0.123E4, 0.123E1): 0.15141299999999999E4 0.15141299999999999E4 (0.123E1, 0.123E4, 0.123): 0.1513023E4 0.1513023E4 (0.123E1, 0.123E4, 0.123E~2): 0.151290123E4 0.151290123E4 (0.123E1, 0.123E4, 0.22250738585072014E~307): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.11125369292536007E~307): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.5E~323): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, 0.0): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.123E4): 0.2829E3 0.2829E3 (0.123E1, 0.123E4, ~0.123E2): 0.15006E4 0.15006E4 (0.123E1, 0.123E4, ~0.3141592653589793E1): 0.15097584073464102E4 0.15097584073464102E4 (0.123E1, 0.123E4, ~0.2718281828459045E1): 0.1510181718171541E4 0.1510181718171541E4 (0.123E1, 0.123E4, ~0.123E1): 0.151167E4 0.151167E4 (0.123E1, 0.123E4, ~0.123): 0.1512777E4 0.1512777E4 (0.123E1, 0.123E4, ~0.123E~2): 0.151289877E4 0.151289877E4 (0.123E1, 0.123E4, ~0.22250738585072014E~307): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.11125369292536007E~307): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.5E~323): 0.15129E4 0.15129E4 (0.123E1, 0.123E4, ~0.0): 0.15129E4 0.15129E4 (0.123E1, 0.123E2, 0.123E4): 0.1245129E4 0.1245129E4 (0.123E1, 0.123E2, 0.123E2): 0.27429000000000002E2 0.27429000000000002E2 (0.123E1, 0.123E2, 0.3141592653589793E1): 0.18270592653589794E2 0.18270592653589794E2 (0.123E1, 0.123E2, 0.2718281828459045E1): 0.17847281828459046E2 0.17847281828459046E2 (0.123E1, 0.123E2, 0.123E1): 0.16359E2 0.16359E2 (0.123E1, 0.123E2, 0.123): 0.15252E2 0.15252E2 (0.123E1, 0.123E2, 0.123E~2): 0.15130230000000001E2 0.15130230000000001E2 (0.123E1, 0.123E2, 0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, 0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, 0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, 0.0): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (0.123E1, 0.123E2, ~0.123E2): 0.28289999999999997E1 0.28289999999999997E1 (0.123E1, 0.123E2, ~0.3141592653589793E1): 0.11987407346410208E2 0.11987407346410208E2 (0.123E1, 0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540955E2 (0.123E1, 0.123E2, ~0.123E1): 0.13899000000000001E2 0.13899000000000001E2 (0.123E1, 0.123E2, ~0.123): 0.15006E2 0.15006E2 (0.123E1, 0.123E2, ~0.123E~2): 0.1512777E2 0.1512777E2 (0.123E1, 0.123E2, ~0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, ~0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, ~0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.123E2, ~0.0): 0.15129000000000001E2 0.15129000000000001E2 (0.123E1, 0.3141592653589793E1, 0.123E4): 0.12338641589639155E4 0.12338641589639155E4 (0.123E1, 0.3141592653589793E1, 0.123E2): 0.16164158963915447E2 0.16164158963915447E2 (0.123E1, 0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505239E1 (0.123E1, 0.3141592653589793E1, 0.2718281828459045E1): 0.65824407923744905E1 0.65824407923744905E1 (0.123E1, 0.3141592653589793E1, 0.123E1): 0.5094158963915445E1 0.5094158963915445E1 (0.123E1, 0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.39871589639154457E1 (0.123E1, 0.3141592653589793E1, 0.123E~2): 0.38653889639154455E1 0.38653889639154455E1 (0.123E1, 0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, 0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, 0.0): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, ~0.123E4): ~0.12261358410360845E4 ~0.12261358410360845E4 (0.123E1, 0.3141592653589793E1, ~0.123E2): ~0.8435841036084556E1 ~0.8435841036084556E1 (0.123E1, 0.3141592653589793E1, ~0.3141592653589793E1): 0.7225663103256523 0.7225663103256523 (0.123E1, 0.3141592653589793E1, ~0.2718281828459045E1): 0.11458771354564004E1 0.11458771354564004E1 (0.123E1, 0.3141592653589793E1, ~0.123E1): 0.26341589639154455E1 0.26341589639154455E1 (0.123E1, 0.3141592653589793E1, ~0.123): 0.37411589639154457E1 0.37411589639154457E1 (0.123E1, 0.3141592653589793E1, ~0.123E~2): 0.38629289639154454E1 0.38629289639154454E1 (0.123E1, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, ~0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.3141592653589793E1, ~0.0): 0.38641589639154454E1 0.38641589639154454E1 (0.123E1, 0.2718281828459045E1, 0.123E4): 0.12333434866490047E4 0.12333434866490047E4 (0.123E1, 0.2718281828459045E1, 0.123E2): 0.15643486649004625E2 0.15643486649004625E2 (0.123E1, 0.2718281828459045E1, 0.3141592653589793E1): 0.6485079302594419E1 0.6485079302594419E1 (0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.606176847746367E1 (0.123E1, 0.2718281828459045E1, 0.123E1): 0.4573486649004625E1 0.4573486649004625E1 (0.123E1, 0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046253E1 (0.123E1, 0.2718281828459045E1, 0.123E~2): 0.33447166490046256E1 0.33447166490046256E1 (0.123E1, 0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, 0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, 0.0): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, ~0.123E4): ~0.12266565133509953E4 ~0.12266565133509953E4 (0.123E1, 0.2718281828459045E1, ~0.123E2): ~0.8956513350995376E1 ~0.8956513350995376E1 (0.123E1, 0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.2018939954148323 (0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455804 (0.123E1, 0.2718281828459045E1, ~0.123E1): 0.21134866490046256E1 0.21134866490046256E1 (0.123E1, 0.2718281828459045E1, ~0.123): 0.32204866490046253E1 0.32204866490046253E1 (0.123E1, 0.2718281828459045E1, ~0.123E~2): 0.33422566490046255E1 0.33422566490046255E1 (0.123E1, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, ~0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.2718281828459045E1, ~0.0): 0.33434866490046256E1 0.33434866490046256E1 (0.123E1, 0.123E1, 0.123E4): 0.12315129E4 0.12315129E4 (0.123E1, 0.123E1, 0.123E2): 0.138129E2 0.138129E2 (0.123E1, 0.123E1, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (0.123E1, 0.123E1, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (0.123E1, 0.123E1, 0.123E1): 0.27429E1 0.27429E1 (0.123E1, 0.123E1, 0.123): 0.16359E1 0.16359E1 (0.123E1, 0.123E1, 0.123E~2): 0.151413E1 0.151413E1 (0.123E1, 0.123E1, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.5E~323): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, 0.0): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (0.123E1, 0.123E1, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E1, 0.123E1, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (0.123E1, 0.123E1, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (0.123E1, 0.123E1, ~0.123E1): 0.2829 0.2829 (0.123E1, 0.123E1, ~0.123): 0.13899E1 0.13899E1 (0.123E1, 0.123E1, ~0.123E~2): 0.15116699999999998E1 0.15116699999999998E1 (0.123E1, 0.123E1, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.5E~323): 0.15129E1 0.15129E1 (0.123E1, 0.123E1, ~0.0): 0.15129E1 0.15129E1 (0.123E1, 0.123, 0.123E4): 0.123015129E4 0.123015129E4 (0.123E1, 0.123, 0.123E2): 0.1245129E2 0.1245129E2 (0.123E1, 0.123, 0.3141592653589793E1): 0.3292882653589793E1 0.3292882653589793E1 (0.123E1, 0.123, 0.2718281828459045E1): 0.2869571828459045E1 0.2869571828459045E1 (0.123E1, 0.123, 0.123E1): 0.138129E1 0.138129E1 (0.123E1, 0.123, 0.123): 0.27429 0.27429 (0.123E1, 0.123, 0.123E~2): 0.15252 0.15252 (0.123E1, 0.123, 0.22250738585072014E~307): 0.15129 0.15129 (0.123E1, 0.123, 0.11125369292536007E~307): 0.15129 0.15129 (0.123E1, 0.123, 0.5E~323): 0.15129 0.15129 (0.123E1, 0.123, 0.0): 0.15129 0.15129 (0.123E1, 0.123, ~0.123E4): ~0.122984871E4 ~0.122984871E4 (0.123E1, 0.123, ~0.123E2): ~0.12148710000000001E2 ~0.12148710000000001E2 (0.123E1, 0.123, ~0.3141592653589793E1): ~0.2990302653589793E1 ~0.2990302653589793E1 (0.123E1, 0.123, ~0.2718281828459045E1): ~0.2566991828459045E1 ~0.2566991828459045E1 (0.123E1, 0.123, ~0.123E1): ~0.107871E1 ~0.107871E1 (0.123E1, 0.123, ~0.123): 0.28289999999999996E~1 0.28289999999999996E~1 (0.123E1, 0.123, ~0.123E~2): 0.15006 0.15006 (0.123E1, 0.123, ~0.22250738585072014E~307): 0.15129 0.15129 (0.123E1, 0.123, ~0.11125369292536007E~307): 0.15129 0.15129 (0.123E1, 0.123, ~0.5E~323): 0.15129 0.15129 (0.123E1, 0.123, ~0.0): 0.15129 0.15129 (0.123E1, 0.123E~2, 0.123E4): 0.12300015129E4 0.12300015129E4 (0.123E1, 0.123E~2, 0.123E2): 0.123015129E2 0.123015129E2 (0.123E1, 0.123E~2, 0.3141592653589793E1): 0.3143105553589793E1 0.3143105553589793E1 (0.123E1, 0.123E~2, 0.2718281828459045E1): 0.2719794728459045E1 0.2719794728459045E1 (0.123E1, 0.123E~2, 0.123E1): 0.12315129E1 0.12315129E1 (0.123E1, 0.123E~2, 0.123): 0.1245129 0.1245129 (0.123E1, 0.123E~2, 0.123E~2): 0.27429E~2 0.27429E~2 (0.123E1, 0.123E~2, 0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, 0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, 0.5E~323): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, 0.0): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, ~0.123E4): ~0.12299984871E4 ~0.12299984871E4 (0.123E1, 0.123E~2, ~0.123E2): ~0.12298487100000001E2 ~0.12298487100000001E2 (0.123E1, 0.123E~2, ~0.3141592653589793E1): ~0.31400797535897933E1 ~0.31400797535897933E1 (0.123E1, 0.123E~2, ~0.2718281828459045E1): ~0.27167689284590453E1 ~0.27167689284590453E1 (0.123E1, 0.123E~2, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (0.123E1, 0.123E~2, ~0.123): ~0.1214871 ~0.1214871 (0.123E1, 0.123E~2, ~0.123E~2): 0.2829E~3 0.2829E~3 (0.123E1, 0.123E~2, ~0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, ~0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, ~0.5E~323): 0.15129E~2 0.15129E~2 (0.123E1, 0.123E~2, ~0.0): 0.15129E~2 0.15129E~2 (0.123E1, 0.5E~323, 0.22250738585072014E~307): 0.2225073858507202E~307 0.2225073858507202E~307 (0.123E1, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253601E~307 0.1112536929253601E~307 (0.123E1, 0.5E~323, 0.5E~323): 0.1E~322 0.1E~322 (0.123E1, 0.5E~323, 0.0): 0.5E~323 0.5E~323 (0.123E1, 0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507201E~307 ~0.2225073858507201E~307 (0.123E1, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536E~307 ~0.11125369292536E~307 (0.123E1, 0.5E~323, ~0.5E~323): 0.0 0.0 (0.123E1, 0.5E~323, ~0.0): 0.5E~323 0.5E~323 (0.123E1, ~0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~0.4134694210183326E308 (0.123E1, ~0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~0.13123159884494904E309 (0.123E1, ~0.17976931348623157E309, 0.123E4): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.123E2): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.123E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.123): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.123E~2): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.5E~323): ~inf ~inf (0.123E1, ~0.17976931348623157E309, 0.0): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.123E4): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.123E2): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.123E1): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.123): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.123E~2): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.5E~323): ~inf ~inf (0.123E1, ~0.17976931348623157E309, ~0.0): ~inf ~inf (0.123E1, ~0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219915E308 (0.123E1, ~0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.2067347105091663E308 (0.123E1, ~0.8988465674311579E308, 0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, 0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.123E1, ~0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (0.123E1, ~0.8988465674311579E308, ~0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.8988465674311579E308, ~0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (0.123E1, ~0.123E4, 0.123E4): ~0.2829E3 ~0.2829E3 (0.123E1, ~0.123E4, 0.123E2): ~0.15006E4 ~0.15006E4 (0.123E1, ~0.123E4, 0.3141592653589793E1): ~0.15097584073464102E4 ~0.15097584073464102E4 (0.123E1, ~0.123E4, 0.2718281828459045E1): ~0.1510181718171541E4 ~0.1510181718171541E4 (0.123E1, ~0.123E4, 0.123E1): ~0.151167E4 ~0.151167E4 (0.123E1, ~0.123E4, 0.123): ~0.1512777E4 ~0.1512777E4 (0.123E1, ~0.123E4, 0.123E~2): ~0.151289877E4 ~0.151289877E4 (0.123E1, ~0.123E4, 0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.5E~323): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, 0.0): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.123E4): ~0.27429E4 ~0.27429E4 (0.123E1, ~0.123E4, ~0.123E2): ~0.15252E4 ~0.15252E4 (0.123E1, ~0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.15160415926535898E4 (0.123E1, ~0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.1515618281828459E4 (0.123E1, ~0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.15141299999999999E4 (0.123E1, ~0.123E4, ~0.123): ~0.1513023E4 ~0.1513023E4 (0.123E1, ~0.123E4, ~0.123E~2): ~0.151290123E4 ~0.151290123E4 (0.123E1, ~0.123E4, ~0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.5E~323): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E4, ~0.0): ~0.15129E4 ~0.15129E4 (0.123E1, ~0.123E2, 0.123E4): 0.1214871E4 0.1214871E4 (0.123E1, ~0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28289999999999997E1 (0.123E1, ~0.123E2, 0.3141592653589793E1): ~0.11987407346410208E2 ~0.11987407346410208E2 (0.123E1, ~0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540955E2 (0.123E1, ~0.123E2, 0.123E1): ~0.13899000000000001E2 ~0.13899000000000001E2 (0.123E1, ~0.123E2, 0.123): ~0.15006E2 ~0.15006E2 (0.123E1, ~0.123E2, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (0.123E1, ~0.123E2, 0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, 0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, 0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, 0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (0.123E1, ~0.123E2, ~0.123E2): ~0.27429000000000002E2 ~0.27429000000000002E2 (0.123E1, ~0.123E2, ~0.3141592653589793E1): ~0.18270592653589794E2 ~0.18270592653589794E2 (0.123E1, ~0.123E2, ~0.2718281828459045E1): ~0.17847281828459046E2 ~0.17847281828459046E2 (0.123E1, ~0.123E2, ~0.123E1): ~0.16359E2 ~0.16359E2 (0.123E1, ~0.123E2, ~0.123): ~0.15252E2 ~0.15252E2 (0.123E1, ~0.123E2, ~0.123E~2): ~0.15130230000000001E2 ~0.15130230000000001E2 (0.123E1, ~0.123E2, ~0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, ~0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, ~0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.123E2, ~0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (0.123E1, ~0.3141592653589793E1, 0.123E4): 0.12261358410360845E4 0.12261358410360845E4 (0.123E1, ~0.3141592653589793E1, 0.123E2): 0.8435841036084556E1 0.8435841036084556E1 (0.123E1, ~0.3141592653589793E1, 0.3141592653589793E1): ~0.7225663103256523 ~0.7225663103256523 (0.123E1, ~0.3141592653589793E1, 0.2718281828459045E1): ~0.11458771354564004E1 ~0.11458771354564004E1 (0.123E1, ~0.3141592653589793E1, 0.123E1): ~0.26341589639154455E1 ~0.26341589639154455E1 (0.123E1, ~0.3141592653589793E1, 0.123): ~0.37411589639154457E1 ~0.37411589639154457E1 (0.123E1, ~0.3141592653589793E1, 0.123E~2): ~0.38629289639154454E1 ~0.38629289639154454E1 (0.123E1, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, 0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, 0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, ~0.123E4): ~0.12338641589639155E4 ~0.12338641589639155E4 (0.123E1, ~0.3141592653589793E1, ~0.123E2): ~0.16164158963915447E2 ~0.16164158963915447E2 (0.123E1, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505239E1 (0.123E1, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.65824407923744905E1 ~0.65824407923744905E1 (0.123E1, ~0.3141592653589793E1, ~0.123E1): ~0.5094158963915445E1 ~0.5094158963915445E1 (0.123E1, ~0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.39871589639154457E1 (0.123E1, ~0.3141592653589793E1, ~0.123E~2): ~0.38653889639154455E1 ~0.38653889639154455E1 (0.123E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, ~0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.3141592653589793E1, ~0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (0.123E1, ~0.2718281828459045E1, 0.123E4): 0.12266565133509953E4 0.12266565133509953E4 (0.123E1, ~0.2718281828459045E1, 0.123E2): 0.8956513350995376E1 0.8956513350995376E1 (0.123E1, ~0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.2018939954148323 (0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455804 (0.123E1, ~0.2718281828459045E1, 0.123E1): ~0.21134866490046256E1 ~0.21134866490046256E1 (0.123E1, ~0.2718281828459045E1, 0.123): ~0.32204866490046253E1 ~0.32204866490046253E1 (0.123E1, ~0.2718281828459045E1, 0.123E~2): ~0.33422566490046255E1 ~0.33422566490046255E1 (0.123E1, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, 0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, 0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, ~0.123E4): ~0.12333434866490047E4 ~0.12333434866490047E4 (0.123E1, ~0.2718281828459045E1, ~0.123E2): ~0.15643486649004625E2 ~0.15643486649004625E2 (0.123E1, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.6485079302594419E1 ~0.6485079302594419E1 (0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.606176847746367E1 (0.123E1, ~0.2718281828459045E1, ~0.123E1): ~0.4573486649004625E1 ~0.4573486649004625E1 (0.123E1, ~0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046253E1 (0.123E1, ~0.2718281828459045E1, ~0.123E~2): ~0.33447166490046256E1 ~0.33447166490046256E1 (0.123E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.2718281828459045E1, ~0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (0.123E1, ~0.123E1, 0.123E4): 0.12284871E4 0.12284871E4 (0.123E1, ~0.123E1, 0.123E2): 0.107871E2 0.107871E2 (0.123E1, ~0.123E1, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (0.123E1, ~0.123E1, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (0.123E1, ~0.123E1, 0.123E1): ~0.2829 ~0.2829 (0.123E1, ~0.123E1, 0.123): ~0.13899E1 ~0.13899E1 (0.123E1, ~0.123E1, 0.123E~2): ~0.15116699999999998E1 ~0.15116699999999998E1 (0.123E1, ~0.123E1, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, 0.0): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (0.123E1, ~0.123E1, ~0.123E2): ~0.138129E2 ~0.138129E2 (0.123E1, ~0.123E1, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (0.123E1, ~0.123E1, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (0.123E1, ~0.123E1, ~0.123E1): ~0.27429E1 ~0.27429E1 (0.123E1, ~0.123E1, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E1, ~0.123E1, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123E1, ~0.123E1, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123E1, ~0.0): ~0.15129E1 ~0.15129E1 (0.123E1, ~0.123, 0.123E4): 0.122984871E4 0.122984871E4 (0.123E1, ~0.123, 0.123E2): 0.12148710000000001E2 0.12148710000000001E2 (0.123E1, ~0.123, 0.3141592653589793E1): 0.2990302653589793E1 0.2990302653589793E1 (0.123E1, ~0.123, 0.2718281828459045E1): 0.2566991828459045E1 0.2566991828459045E1 (0.123E1, ~0.123, 0.123E1): 0.107871E1 0.107871E1 (0.123E1, ~0.123, 0.123): ~0.28289999999999996E~1 ~0.28289999999999996E~1 (0.123E1, ~0.123, 0.123E~2): ~0.15006 ~0.15006 (0.123E1, ~0.123, 0.22250738585072014E~307): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.11125369292536007E~307): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.5E~323): ~0.15129 ~0.15129 (0.123E1, ~0.123, 0.0): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.123E4): ~0.123015129E4 ~0.123015129E4 (0.123E1, ~0.123, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (0.123E1, ~0.123, ~0.3141592653589793E1): ~0.3292882653589793E1 ~0.3292882653589793E1 (0.123E1, ~0.123, ~0.2718281828459045E1): ~0.2869571828459045E1 ~0.2869571828459045E1 (0.123E1, ~0.123, ~0.123E1): ~0.138129E1 ~0.138129E1 (0.123E1, ~0.123, ~0.123): ~0.27429 ~0.27429 (0.123E1, ~0.123, ~0.123E~2): ~0.15252 ~0.15252 (0.123E1, ~0.123, ~0.22250738585072014E~307): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.11125369292536007E~307): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.5E~323): ~0.15129 ~0.15129 (0.123E1, ~0.123, ~0.0): ~0.15129 ~0.15129 (0.123E1, ~0.123E~2, 0.123E4): 0.12299984871E4 0.12299984871E4 (0.123E1, ~0.123E~2, 0.123E2): 0.12298487100000001E2 0.12298487100000001E2 (0.123E1, ~0.123E~2, 0.3141592653589793E1): 0.31400797535897933E1 0.31400797535897933E1 (0.123E1, ~0.123E~2, 0.2718281828459045E1): 0.27167689284590453E1 0.27167689284590453E1 (0.123E1, ~0.123E~2, 0.123E1): 0.12284871E1 0.12284871E1 (0.123E1, ~0.123E~2, 0.123): 0.1214871 0.1214871 (0.123E1, ~0.123E~2, 0.123E~2): ~0.2829E~3 ~0.2829E~3 (0.123E1, ~0.123E~2, 0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, 0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, 0.5E~323): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, 0.0): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, ~0.123E4): ~0.12300015129E4 ~0.12300015129E4 (0.123E1, ~0.123E~2, ~0.123E2): ~0.123015129E2 ~0.123015129E2 (0.123E1, ~0.123E~2, ~0.3141592653589793E1): ~0.3143105553589793E1 ~0.3143105553589793E1 (0.123E1, ~0.123E~2, ~0.2718281828459045E1): ~0.2719794728459045E1 ~0.2719794728459045E1 (0.123E1, ~0.123E~2, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (0.123E1, ~0.123E~2, ~0.123): ~0.1245129 ~0.1245129 (0.123E1, ~0.123E~2, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (0.123E1, ~0.123E~2, ~0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, ~0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, ~0.5E~323): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.123E~2, ~0.0): ~0.15129E~2 ~0.15129E~2 (0.123E1, ~0.5E~323, 0.22250738585072014E~307): 0.2225073858507201E~307 0.2225073858507201E~307 (0.123E1, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536E~307 0.11125369292536E~307 (0.123E1, ~0.5E~323, 0.5E~323): ~0.0 ~0.0 (0.123E1, ~0.5E~323, 0.0): ~0.5E~323 ~0.5E~323 (0.123E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507202E~307 ~0.2225073858507202E~307 (0.123E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253601E~307 ~0.1112536929253601E~307 (0.123E1, ~0.5E~323, ~0.5E~323): ~0.1E~322 ~0.1E~322 (0.123E1, ~0.5E~323, ~0.0): ~0.5E~323 ~0.5E~323 (0.123, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.123, 0.17976931348623157E309, 0.8988465674311579E308): 0.11199628230192226E309 0.11199628230192226E309 (0.123, 0.17976931348623157E309, 0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.123): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, 0.0): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.17976931348623157E309): ~0.15765768792742509E309 ~0.15765768792742509E309 (0.123, 0.17976931348623157E309, ~0.8988465674311579E308): ~0.677730311843093E308 ~0.677730311843093E308 (0.123, 0.17976931348623157E309, ~0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.123): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.17976931348623157E309, ~0.0): 0.22111625558806483E308 0.22111625558806483E308 (0.123, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.123, 0.8988465674311579E308, 0.8988465674311579E308): 0.10094046952251902E309 0.10094046952251902E309 (0.123, 0.8988465674311579E308, 0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.123): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, 0.0): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.16871350070682833E309 ~0.16871350070682833E309 (0.123, 0.8988465674311579E308, ~0.8988465674311579E308): ~0.7882884396371254E308 ~0.7882884396371254E308 (0.123, 0.8988465674311579E308, ~0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.123): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.8988465674311579E308, ~0.0): 0.11055812779403241E308 0.11055812779403241E308 (0.123, 0.123E4, 0.123E4): 0.138129E4 0.138129E4 (0.123, 0.123E4, 0.123E2): 0.16359E3 0.16359E3 (0.123, 0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (0.123, 0.123E4, 0.2718281828459045E1): 0.15400828182845905E3 0.15400828182845905E3 (0.123, 0.123E4, 0.123E1): 0.15252E3 0.15252E3 (0.123, 0.123E4, 0.123): 0.151413E3 0.151413E3 (0.123, 0.123E4, 0.123E~2): 0.15129122999999998E3 0.15129122999999998E3 (0.123, 0.123E4, 0.22250738585072014E~307): 0.15129E3 0.15129E3 (0.123, 0.123E4, 0.11125369292536007E~307): 0.15129E3 0.15129E3 (0.123, 0.123E4, 0.5E~323): 0.15129E3 0.15129E3 (0.123, 0.123E4, 0.0): 0.15129E3 0.15129E3 (0.123, 0.123E4, ~0.123E4): ~0.107871E4 ~0.107871E4 (0.123, 0.123E4, ~0.123E2): 0.13899E3 0.13899E3 (0.123, 0.123E4, ~0.3141592653589793E1): 0.1481484073464102E3 0.1481484073464102E3 (0.123, 0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (0.123, 0.123E4, ~0.123E1): 0.15006E3 0.15006E3 (0.123, 0.123E4, ~0.123): 0.151167E3 0.151167E3 (0.123, 0.123E4, ~0.123E~2): 0.15128877E3 0.15128877E3 (0.123, 0.123E4, ~0.22250738585072014E~307): 0.15129E3 0.15129E3 (0.123, 0.123E4, ~0.11125369292536007E~307): 0.15129E3 0.15129E3 (0.123, 0.123E4, ~0.5E~323): 0.15129E3 0.15129E3 (0.123, 0.123E4, ~0.0): 0.15129E3 0.15129E3 (0.123, 0.123E2, 0.123E4): 0.12315129E4 0.12315129E4 (0.123, 0.123E2, 0.123E2): 0.138129E2 0.138129E2 (0.123, 0.123E2, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (0.123, 0.123E2, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (0.123, 0.123E2, 0.123E1): 0.27429E1 0.27429E1 (0.123, 0.123E2, 0.123): 0.16359000000000001E1 0.16359000000000001E1 (0.123, 0.123E2, 0.123E~2): 0.151413E1 0.151413E1 (0.123, 0.123E2, 0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, 0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, 0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, 0.0): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (0.123, 0.123E2, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123, 0.123E2, ~0.3141592653589793E1): ~0.1628692653589793E1 ~0.1628692653589793E1 (0.123, 0.123E2, ~0.2718281828459045E1): ~0.1205381828459045E1 ~0.1205381828459045E1 (0.123, 0.123E2, ~0.123E1): 0.2829000000000001 0.2829000000000001 (0.123, 0.123E2, ~0.123): 0.13899000000000001E1 0.13899000000000001E1 (0.123, 0.123E2, ~0.123E~2): 0.151167E1 0.151167E1 (0.123, 0.123E2, ~0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, ~0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, ~0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.123E2, ~0.0): 0.15129000000000001E1 0.15129000000000001E1 (0.123, 0.3141592653589793E1, 0.123E4): 0.12303864158963916E4 0.12303864158963916E4 (0.123, 0.3141592653589793E1, 0.123E2): 0.12686415896391546E2 0.12686415896391546E2 (0.123, 0.3141592653589793E1, 0.3141592653589793E1): 0.35280085499813376E1 0.35280085499813376E1 (0.123, 0.3141592653589793E1, 0.2718281828459045E1): 0.31046977248505896E1 0.31046977248505896E1 (0.123, 0.3141592653589793E1, 0.123E1): 0.16164158963915445E1 0.16164158963915445E1 (0.123, 0.3141592653589793E1, 0.123): 0.5094158963915445 0.5094158963915445 (0.123, 0.3141592653589793E1, 0.123E~2): 0.38764589639154456 0.38764589639154456 (0.123, 0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, 0.5E~323): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, 0.0): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, ~0.123E4): ~0.12296135841036084E4 ~0.12296135841036084E4 (0.123, 0.3141592653589793E1, ~0.123E2): ~0.11913584103608455E2 ~0.11913584103608455E2 (0.123, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.27551767571982486E1 ~0.27551767571982486E1 (0.123, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.23318659320675006E1 ~0.23318659320675006E1 (0.123, 0.3141592653589793E1, ~0.123E1): ~0.8435841036084555 ~0.8435841036084555 (0.123, 0.3141592653589793E1, ~0.123): 0.26341589639154456 0.26341589639154456 (0.123, 0.3141592653589793E1, ~0.123E~2): 0.38518589639154455 0.38518589639154455 (0.123, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, ~0.5E~323): 0.38641589639154456 0.38641589639154456 (0.123, 0.3141592653589793E1, ~0.0): 0.38641589639154456 0.38641589639154456 (0.123, 0.2718281828459045E1, 0.123E4): 0.12303343486649005E4 0.12303343486649005E4 (0.123, 0.2718281828459045E1, 0.123E2): 0.12634348664900463E2 0.12634348664900463E2 (0.123, 0.2718281828459045E1, 0.3141592653589793E1): 0.34759413184902557E1 0.34759413184902557E1 (0.123, 0.2718281828459045E1, 0.2718281828459045E1): 0.30526304933595076E1 0.30526304933595076E1 (0.123, 0.2718281828459045E1, 0.123E1): 0.15643486649004625E1 0.15643486649004625E1 (0.123, 0.2718281828459045E1, 0.123): 0.45734866490046255 0.45734866490046255 (0.123, 0.2718281828459045E1, 0.123E~2): 0.33557866490046256 0.33557866490046256 (0.123, 0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, 0.5E~323): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, 0.0): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, ~0.123E4): ~0.12296656513350995E4 ~0.12296656513350995E4 (0.123, 0.2718281828459045E1, ~0.123E2): ~0.11965651335099539E2 ~0.11965651335099539E2 (0.123, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.28072439886893306E1 ~0.28072439886893306E1 (0.123, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.23839331635585825E1 ~0.23839331635585825E1 (0.123, 0.2718281828459045E1, ~0.123E1): ~0.8956513350995374 ~0.8956513350995374 (0.123, 0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046253 (0.123, 0.2718281828459045E1, ~0.123E~2): 0.33311866490046255 0.33311866490046255 (0.123, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, ~0.5E~323): 0.33434866490046256 0.33434866490046256 (0.123, 0.2718281828459045E1, ~0.0): 0.33434866490046256 0.33434866490046256 (0.123, 0.123E1, 0.123E4): 0.123015129E4 0.123015129E4 (0.123, 0.123E1, 0.123E2): 0.1245129E2 0.1245129E2 (0.123, 0.123E1, 0.3141592653589793E1): 0.3292882653589793E1 0.3292882653589793E1 (0.123, 0.123E1, 0.2718281828459045E1): 0.2869571828459045E1 0.2869571828459045E1 (0.123, 0.123E1, 0.123E1): 0.138129E1 0.138129E1 (0.123, 0.123E1, 0.123): 0.27429 0.27429 (0.123, 0.123E1, 0.123E~2): 0.15252 0.15252 (0.123, 0.123E1, 0.22250738585072014E~307): 0.15129 0.15129 (0.123, 0.123E1, 0.11125369292536007E~307): 0.15129 0.15129 (0.123, 0.123E1, 0.5E~323): 0.15129 0.15129 (0.123, 0.123E1, 0.0): 0.15129 0.15129 (0.123, 0.123E1, ~0.123E4): ~0.122984871E4 ~0.122984871E4 (0.123, 0.123E1, ~0.123E2): ~0.12148710000000001E2 ~0.12148710000000001E2 (0.123, 0.123E1, ~0.3141592653589793E1): ~0.2990302653589793E1 ~0.2990302653589793E1 (0.123, 0.123E1, ~0.2718281828459045E1): ~0.2566991828459045E1 ~0.2566991828459045E1 (0.123, 0.123E1, ~0.123E1): ~0.107871E1 ~0.107871E1 (0.123, 0.123E1, ~0.123): 0.28289999999999996E~1 0.28289999999999996E~1 (0.123, 0.123E1, ~0.123E~2): 0.15006 0.15006 (0.123, 0.123E1, ~0.22250738585072014E~307): 0.15129 0.15129 (0.123, 0.123E1, ~0.11125369292536007E~307): 0.15129 0.15129 (0.123, 0.123E1, ~0.5E~323): 0.15129 0.15129 (0.123, 0.123E1, ~0.0): 0.15129 0.15129 (0.123, 0.123, 0.123E4): 0.1230015129E4 0.1230015129E4 (0.123, 0.123, 0.123E2): 0.12315129E2 0.12315129E2 (0.123, 0.123, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (0.123, 0.123, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (0.123, 0.123, 0.123E1): 0.1245129E1 0.1245129E1 (0.123, 0.123, 0.123): 0.138129 0.138129 (0.123, 0.123, 0.123E~2): 0.16359E~1 0.16359E~1 (0.123, 0.123, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123, 0.123, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123, 0.123, 0.5E~323): 0.15129E~1 0.15129E~1 (0.123, 0.123, 0.0): 0.15129E~1 0.15129E~1 (0.123, 0.123, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (0.123, 0.123, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123, 0.123, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (0.123, 0.123, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (0.123, 0.123, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123, 0.123, ~0.123): ~0.107871 ~0.107871 (0.123, 0.123, ~0.123E~2): 0.13899E~1 0.13899E~1 (0.123, 0.123, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123, 0.123, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123, 0.123, ~0.5E~323): 0.15129E~1 0.15129E~1 (0.123, 0.123, ~0.0): 0.15129E~1 0.15129E~1 (0.123, 0.123E~2, 0.123E4): 0.123000015129E4 0.123000015129E4 (0.123, 0.123E~2, 0.123E2): 0.1230015129E2 0.1230015129E2 (0.123, 0.123E~2, 0.3141592653589793E1): 0.3141743943589793E1 0.3141743943589793E1 (0.123, 0.123E~2, 0.2718281828459045E1): 0.2718433118459045E1 0.2718433118459045E1 (0.123, 0.123E~2, 0.123E1): 0.123015129E1 0.123015129E1 (0.123, 0.123E~2, 0.123): 0.12315129 0.12315129 (0.123, 0.123E~2, 0.123E~2): 0.13812899999999999E~2 0.13812899999999999E~2 (0.123, 0.123E~2, 0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.5E~323): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, 0.0): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.123E4): ~0.122999984871E4 ~0.122999984871E4 (0.123, 0.123E~2, ~0.123E2): ~0.12299848710000001E2 ~0.12299848710000001E2 (0.123, 0.123E~2, ~0.3141592653589793E1): ~0.31414413635897933E1 ~0.31414413635897933E1 (0.123, 0.123E~2, ~0.2718281828459045E1): ~0.27181305384590453E1 ~0.27181305384590453E1 (0.123, 0.123E~2, ~0.123E1): ~0.122984871E1 ~0.122984871E1 (0.123, 0.123E~2, ~0.123): ~0.12284871 ~0.12284871 (0.123, 0.123E~2, ~0.123E~2): ~0.107871E~2 ~0.107871E~2 (0.123, 0.123E~2, ~0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.5E~323): 0.15129E~3 0.15129E~3 (0.123, 0.123E~2, ~0.0): 0.15129E~3 0.15129E~3 (0.123, 0.11125369292536007E~307, 0.22250738585072014E~307): 0.23619159008053945E~307 0.23619159008053945E~307 (0.123, 0.11125369292536007E~307, 0.11125369292536007E~307): 0.1249378971551794E~307 0.1249378971551794E~307 (0.123, 0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.136842042298193E~308 (0.123, 0.11125369292536007E~307, 0.0): 0.136842042298193E~308 0.136842042298193E~308 (0.123, 0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.20882318162090083E~307 ~0.20882318162090083E~307 (0.123, 0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.9756948869554076E~308 ~0.9756948869554076E~308 (0.123, 0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.136842042298192E~308 (0.123, 0.11125369292536007E~307, ~0.0): 0.136842042298193E~308 0.136842042298193E~308 (0.123, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.123, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.123, 0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (0.123, 0.5E~323, 0.0): 0.0 0.0 (0.123, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.123, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.123, 0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.123, 0.5E~323, ~0.0): 0.0 0.0 (0.123, ~0.17976931348623157E309, 0.17976931348623157E309): 0.15765768792742509E309 0.15765768792742509E309 (0.123, ~0.17976931348623157E309, 0.8988465674311579E308): 0.677730311843093E308 0.677730311843093E308 (0.123, ~0.17976931348623157E309, 0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, 0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.123, ~0.17976931348623157E309, ~0.8988465674311579E308): ~0.11199628230192226E309 ~0.11199628230192226E309 (0.123, ~0.17976931348623157E309, ~0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.17976931348623157E309, ~0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (0.123, ~0.8988465674311579E308, 0.17976931348623157E309): 0.16871350070682833E309 0.16871350070682833E309 (0.123, ~0.8988465674311579E308, 0.8988465674311579E308): 0.7882884396371254E308 0.7882884396371254E308 (0.123, ~0.8988465674311579E308, 0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, 0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.123, ~0.8988465674311579E308, ~0.8988465674311579E308): ~0.10094046952251902E309 ~0.10094046952251902E309 (0.123, ~0.8988465674311579E308, ~0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.8988465674311579E308, ~0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (0.123, ~0.123E4, 0.123E4): 0.107871E4 0.107871E4 (0.123, ~0.123E4, 0.123E2): ~0.13899E3 ~0.13899E3 (0.123, ~0.123E4, 0.3141592653589793E1): ~0.1481484073464102E3 ~0.1481484073464102E3 (0.123, ~0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (0.123, ~0.123E4, 0.123E1): ~0.15006E3 ~0.15006E3 (0.123, ~0.123E4, 0.123): ~0.151167E3 ~0.151167E3 (0.123, ~0.123E4, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (0.123, ~0.123E4, 0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, 0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, 0.5E~323): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, 0.0): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, ~0.123E4): ~0.138129E4 ~0.138129E4 (0.123, ~0.123E4, ~0.123E2): ~0.16359E3 ~0.16359E3 (0.123, ~0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (0.123, ~0.123E4, ~0.2718281828459045E1): ~0.15400828182845905E3 ~0.15400828182845905E3 (0.123, ~0.123E4, ~0.123E1): ~0.15252E3 ~0.15252E3 (0.123, ~0.123E4, ~0.123): ~0.151413E3 ~0.151413E3 (0.123, ~0.123E4, ~0.123E~2): ~0.15129122999999998E3 ~0.15129122999999998E3 (0.123, ~0.123E4, ~0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, ~0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, ~0.5E~323): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E4, ~0.0): ~0.15129E3 ~0.15129E3 (0.123, ~0.123E2, 0.123E4): 0.12284871E4 0.12284871E4 (0.123, ~0.123E2, 0.123E2): 0.107871E2 0.107871E2 (0.123, ~0.123E2, 0.3141592653589793E1): 0.1628692653589793E1 0.1628692653589793E1 (0.123, ~0.123E2, 0.2718281828459045E1): 0.1205381828459045E1 0.1205381828459045E1 (0.123, ~0.123E2, 0.123E1): ~0.2829000000000001 ~0.2829000000000001 (0.123, ~0.123E2, 0.123): ~0.13899000000000001E1 ~0.13899000000000001E1 (0.123, ~0.123E2, 0.123E~2): ~0.151167E1 ~0.151167E1 (0.123, ~0.123E2, 0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, 0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, 0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, 0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (0.123, ~0.123E2, ~0.123E2): ~0.138129E2 ~0.138129E2 (0.123, ~0.123E2, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (0.123, ~0.123E2, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (0.123, ~0.123E2, ~0.123E1): ~0.27429E1 ~0.27429E1 (0.123, ~0.123E2, ~0.123): ~0.16359000000000001E1 ~0.16359000000000001E1 (0.123, ~0.123E2, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123, ~0.123E2, ~0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, ~0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, ~0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.123E2, ~0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (0.123, ~0.3141592653589793E1, 0.123E4): 0.12296135841036084E4 0.12296135841036084E4 (0.123, ~0.3141592653589793E1, 0.123E2): 0.11913584103608455E2 0.11913584103608455E2 (0.123, ~0.3141592653589793E1, 0.3141592653589793E1): 0.27551767571982486E1 0.27551767571982486E1 (0.123, ~0.3141592653589793E1, 0.2718281828459045E1): 0.23318659320675006E1 0.23318659320675006E1 (0.123, ~0.3141592653589793E1, 0.123E1): 0.8435841036084555 0.8435841036084555 (0.123, ~0.3141592653589793E1, 0.123): ~0.26341589639154456 ~0.26341589639154456 (0.123, ~0.3141592653589793E1, 0.123E~2): ~0.38518589639154455 ~0.38518589639154455 (0.123, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, 0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, 0.0): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, ~0.123E4): ~0.12303864158963916E4 ~0.12303864158963916E4 (0.123, ~0.3141592653589793E1, ~0.123E2): ~0.12686415896391546E2 ~0.12686415896391546E2 (0.123, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.35280085499813376E1 ~0.35280085499813376E1 (0.123, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.31046977248505896E1 ~0.31046977248505896E1 (0.123, ~0.3141592653589793E1, ~0.123E1): ~0.16164158963915445E1 ~0.16164158963915445E1 (0.123, ~0.3141592653589793E1, ~0.123): ~0.5094158963915445 ~0.5094158963915445 (0.123, ~0.3141592653589793E1, ~0.123E~2): ~0.38764589639154456 ~0.38764589639154456 (0.123, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, ~0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.3141592653589793E1, ~0.0): ~0.38641589639154456 ~0.38641589639154456 (0.123, ~0.2718281828459045E1, 0.123E4): 0.12296656513350995E4 0.12296656513350995E4 (0.123, ~0.2718281828459045E1, 0.123E2): 0.11965651335099539E2 0.11965651335099539E2 (0.123, ~0.2718281828459045E1, 0.3141592653589793E1): 0.28072439886893306E1 0.28072439886893306E1 (0.123, ~0.2718281828459045E1, 0.2718281828459045E1): 0.23839331635585825E1 0.23839331635585825E1 (0.123, ~0.2718281828459045E1, 0.123E1): 0.8956513350995374 0.8956513350995374 (0.123, ~0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046253 (0.123, ~0.2718281828459045E1, 0.123E~2): ~0.33311866490046255 ~0.33311866490046255 (0.123, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, 0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, 0.0): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, ~0.123E4): ~0.12303343486649005E4 ~0.12303343486649005E4 (0.123, ~0.2718281828459045E1, ~0.123E2): ~0.12634348664900463E2 ~0.12634348664900463E2 (0.123, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.34759413184902557E1 ~0.34759413184902557E1 (0.123, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.30526304933595076E1 ~0.30526304933595076E1 (0.123, ~0.2718281828459045E1, ~0.123E1): ~0.15643486649004625E1 ~0.15643486649004625E1 (0.123, ~0.2718281828459045E1, ~0.123): ~0.45734866490046255 ~0.45734866490046255 (0.123, ~0.2718281828459045E1, ~0.123E~2): ~0.33557866490046256 ~0.33557866490046256 (0.123, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.2718281828459045E1, ~0.0): ~0.33434866490046256 ~0.33434866490046256 (0.123, ~0.123E1, 0.123E4): 0.122984871E4 0.122984871E4 (0.123, ~0.123E1, 0.123E2): 0.12148710000000001E2 0.12148710000000001E2 (0.123, ~0.123E1, 0.3141592653589793E1): 0.2990302653589793E1 0.2990302653589793E1 (0.123, ~0.123E1, 0.2718281828459045E1): 0.2566991828459045E1 0.2566991828459045E1 (0.123, ~0.123E1, 0.123E1): 0.107871E1 0.107871E1 (0.123, ~0.123E1, 0.123): ~0.28289999999999996E~1 ~0.28289999999999996E~1 (0.123, ~0.123E1, 0.123E~2): ~0.15006 ~0.15006 (0.123, ~0.123E1, 0.22250738585072014E~307): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.11125369292536007E~307): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.5E~323): ~0.15129 ~0.15129 (0.123, ~0.123E1, 0.0): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.123E4): ~0.123015129E4 ~0.123015129E4 (0.123, ~0.123E1, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (0.123, ~0.123E1, ~0.3141592653589793E1): ~0.3292882653589793E1 ~0.3292882653589793E1 (0.123, ~0.123E1, ~0.2718281828459045E1): ~0.2869571828459045E1 ~0.2869571828459045E1 (0.123, ~0.123E1, ~0.123E1): ~0.138129E1 ~0.138129E1 (0.123, ~0.123E1, ~0.123): ~0.27429 ~0.27429 (0.123, ~0.123E1, ~0.123E~2): ~0.15252 ~0.15252 (0.123, ~0.123E1, ~0.22250738585072014E~307): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.11125369292536007E~307): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.5E~323): ~0.15129 ~0.15129 (0.123, ~0.123E1, ~0.0): ~0.15129 ~0.15129 (0.123, ~0.123, 0.123E4): 0.1229984871E4 0.1229984871E4 (0.123, ~0.123, 0.123E2): 0.12284871E2 0.12284871E2 (0.123, ~0.123, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (0.123, ~0.123, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (0.123, ~0.123, 0.123E1): 0.1214871E1 0.1214871E1 (0.123, ~0.123, 0.123): 0.107871 0.107871 (0.123, ~0.123, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (0.123, ~0.123, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, 0.0): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (0.123, ~0.123, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123, ~0.123, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (0.123, ~0.123, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (0.123, ~0.123, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123, ~0.123, ~0.123): ~0.138129 ~0.138129 (0.123, ~0.123, ~0.123E~2): ~0.16359E~1 ~0.16359E~1 (0.123, ~0.123, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123, ~0.0): ~0.15129E~1 ~0.15129E~1 (0.123, ~0.123E~2, 0.123E4): 0.122999984871E4 0.122999984871E4 (0.123, ~0.123E~2, 0.123E2): 0.12299848710000001E2 0.12299848710000001E2 (0.123, ~0.123E~2, 0.3141592653589793E1): 0.31414413635897933E1 0.31414413635897933E1 (0.123, ~0.123E~2, 0.2718281828459045E1): 0.27181305384590453E1 0.27181305384590453E1 (0.123, ~0.123E~2, 0.123E1): 0.122984871E1 0.122984871E1 (0.123, ~0.123E~2, 0.123): 0.12284871 0.12284871 (0.123, ~0.123E~2, 0.123E~2): 0.107871E~2 0.107871E~2 (0.123, ~0.123E~2, 0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.5E~323): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, 0.0): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.123E4): ~0.123000015129E4 ~0.123000015129E4 (0.123, ~0.123E~2, ~0.123E2): ~0.1230015129E2 ~0.1230015129E2 (0.123, ~0.123E~2, ~0.3141592653589793E1): ~0.3141743943589793E1 ~0.3141743943589793E1 (0.123, ~0.123E~2, ~0.2718281828459045E1): ~0.2718433118459045E1 ~0.2718433118459045E1 (0.123, ~0.123E~2, ~0.123E1): ~0.123015129E1 ~0.123015129E1 (0.123, ~0.123E~2, ~0.123): ~0.12315129 ~0.12315129 (0.123, ~0.123E~2, ~0.123E~2): ~0.13812899999999999E~2 ~0.13812899999999999E~2 (0.123, ~0.123E~2, ~0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.5E~323): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.123E~2, ~0.0): ~0.15129E~3 ~0.15129E~3 (0.123, ~0.11125369292536007E~307, 0.22250738585072014E~307): 0.20882318162090083E~307 0.20882318162090083E~307 (0.123, ~0.11125369292536007E~307, 0.11125369292536007E~307): 0.9756948869554076E~308 0.9756948869554076E~308 (0.123, ~0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.136842042298192E~308 (0.123, ~0.11125369292536007E~307, 0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.123, ~0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.23619159008053945E~307 ~0.23619159008053945E~307 (0.123, ~0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.1249378971551794E~307 ~0.1249378971551794E~307 (0.123, ~0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.123, ~0.11125369292536007E~307, ~0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.123, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.123, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.123, ~0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (0.123, ~0.5E~323, 0.0): ~0.0 ~0.0 (0.123, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.123, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.123, ~0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.123, ~0.5E~323, ~0.0): ~0.0 ~0.0 (0.123E~2, 0.17976931348623157E309, 0.17976931348623157E309): inf inf (0.123E~2, 0.17976931348623157E309, 0.8988465674311579E308): 0.9010577299870385E308 0.9010577299870385E308 (0.123E~2, 0.17976931348623157E309, 0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.123): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, 0.0): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.17976931348623157E309): ~0.17954819723064351E309 ~0.17954819723064351E309 (0.123E~2, 0.17976931348623157E309, ~0.8988465674311579E308): ~0.8966354048752772E308 ~0.8966354048752772E308 (0.123E~2, 0.17976931348623157E309, ~0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.123): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.17976931348623157E309, ~0.0): 0.2211162555880648E306 0.2211162555880648E306 (0.123E~2, 0.8988465674311579E308, 0.17976931348623157E309): inf inf (0.123E~2, 0.8988465674311579E308, 0.8988465674311579E308): 0.8999521487090981E308 0.8999521487090981E308 (0.123E~2, 0.8988465674311579E308, 0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.123): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, 0.0): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.17976931348623157E309): ~0.17965875535843753E309 ~0.17965875535843753E309 (0.123E~2, 0.8988465674311579E308, ~0.8988465674311579E308): ~0.8977409861532176E308 ~0.8977409861532176E308 (0.123E~2, 0.8988465674311579E308, ~0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.123): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.8988465674311579E308, ~0.0): 0.1105581277940324E306 0.1105581277940324E306 (0.123E~2, 0.123E4, 0.123E4): 0.12315129E4 0.12315129E4 (0.123E~2, 0.123E4, 0.123E2): 0.138129E2 0.138129E2 (0.123E~2, 0.123E4, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (0.123E~2, 0.123E4, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (0.123E~2, 0.123E4, 0.123E1): 0.27429E1 0.27429E1 (0.123E~2, 0.123E4, 0.123): 0.16359E1 0.16359E1 (0.123E~2, 0.123E4, 0.123E~2): 0.151413E1 0.151413E1 (0.123E~2, 0.123E4, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, 0.5E~323): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, 0.0): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (0.123E~2, 0.123E4, ~0.123E2): ~0.107871E2 ~0.107871E2 (0.123E~2, 0.123E4, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (0.123E~2, 0.123E4, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (0.123E~2, 0.123E4, ~0.123E1): 0.2829 0.2829 (0.123E~2, 0.123E4, ~0.123): 0.13899E1 0.13899E1 (0.123E~2, 0.123E4, ~0.123E~2): 0.151167E1 0.151167E1 (0.123E~2, 0.123E4, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, ~0.5E~323): 0.15129E1 0.15129E1 (0.123E~2, 0.123E4, ~0.0): 0.15129E1 0.15129E1 (0.123E~2, 0.123E2, 0.123E4): 0.1230015129E4 0.1230015129E4 (0.123E~2, 0.123E2, 0.123E2): 0.12315129E2 0.12315129E2 (0.123E~2, 0.123E2, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (0.123E~2, 0.123E2, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (0.123E~2, 0.123E2, 0.123E1): 0.1245129E1 0.1245129E1 (0.123E~2, 0.123E2, 0.123): 0.138129 0.138129 (0.123E~2, 0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359000000000002E~1 (0.123E~2, 0.123E2, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, 0.5E~323): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, 0.0): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (0.123E~2, 0.123E2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (0.123E~2, 0.123E2, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (0.123E~2, 0.123E2, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (0.123E~2, 0.123E2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (0.123E~2, 0.123E2, ~0.123): ~0.107871 ~0.107871 (0.123E~2, 0.123E2, ~0.123E~2): 0.13899E~1 0.13899E~1 (0.123E~2, 0.123E2, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, ~0.5E~323): 0.15129E~1 0.15129E~1 (0.123E~2, 0.123E2, ~0.0): 0.15129E~1 0.15129E~1 (0.123E~2, 0.3141592653589793E1, 0.123E4): 0.1230003864158964E4 0.1230003864158964E4 (0.123E~2, 0.3141592653589793E1, 0.123E2): 0.12303864158963917E2 0.12303864158963917E2 (0.123E~2, 0.3141592653589793E1, 0.3141592653589793E1): 0.31454568125537086E1 0.31454568125537086E1 (0.123E~2, 0.3141592653589793E1, 0.2718281828459045E1): 0.27221459874229605E1 0.27221459874229605E1 (0.123E~2, 0.3141592653589793E1, 0.123E1): 0.12338641589639154E1 0.12338641589639154E1 (0.123E~2, 0.3141592653589793E1, 0.123): 0.12686415896391545 0.12686415896391545 (0.123E~2, 0.3141592653589793E1, 0.123E~2): 0.5094158963915445E~2 0.5094158963915445E~2 (0.123E~2, 0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, 0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, 0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, ~0.123E4): ~0.1229996135841036E4 ~0.1229996135841036E4 (0.123E~2, 0.3141592653589793E1, ~0.123E2): ~0.12296135841036085E2 ~0.12296135841036085E2 (0.123E~2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.31377284946258777E1 ~0.31377284946258777E1 (0.123E~2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.27144176694951296E1 ~0.27144176694951296E1 (0.123E~2, 0.3141592653589793E1, ~0.123E1): ~0.12261358410360845E1 ~0.12261358410360845E1 (0.123E~2, 0.3141592653589793E1, ~0.123): ~0.11913584103608456 ~0.11913584103608456 (0.123E~2, 0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.26341589639154455E~2 (0.123E~2, 0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, ~0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.3141592653589793E1, ~0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (0.123E~2, 0.2718281828459045E1, 0.123E4): 0.1230003343486649E4 0.1230003343486649E4 (0.123E~2, 0.2718281828459045E1, 0.123E2): 0.12303343486649005E2 0.12303343486649005E2 (0.123E~2, 0.2718281828459045E1, 0.3141592653589793E1): 0.3144936140238798E1 0.3144936140238798E1 (0.123E~2, 0.2718281828459045E1, 0.2718281828459045E1): 0.272162531510805E1 0.272162531510805E1 (0.123E~2, 0.2718281828459045E1, 0.123E1): 0.12333434866490045E1 0.12333434866490045E1 (0.123E~2, 0.2718281828459045E1, 0.123): 0.12634348664900463 0.12634348664900463 (0.123E~2, 0.2718281828459045E1, 0.123E~2): 0.4573486649004625E~2 0.4573486649004625E~2 (0.123E~2, 0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, 0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, 0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, ~0.123E4): ~0.1229996656513351E4 ~0.1229996656513351E4 (0.123E~2, 0.2718281828459045E1, ~0.123E2): ~0.12296656513350996E2 ~0.12296656513350996E2 (0.123E~2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.31382491669407884E1 ~0.31382491669407884E1 (0.123E~2, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.27149383418100403E1 ~0.27149383418100403E1 (0.123E~2, 0.2718281828459045E1, ~0.123E1): ~0.12266565133509955E1 ~0.12266565133509955E1 (0.123E~2, 0.2718281828459045E1, ~0.123): ~0.11965651335099538 ~0.11965651335099538 (0.123E~2, 0.2718281828459045E1, ~0.123E~2): 0.21134866490046256E~2 0.21134866490046256E~2 (0.123E~2, 0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, ~0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.2718281828459045E1, ~0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (0.123E~2, 0.123E1, 0.123E4): 0.12300015129E4 0.12300015129E4 (0.123E~2, 0.123E1, 0.123E2): 0.123015129E2 0.123015129E2 (0.123E~2, 0.123E1, 0.3141592653589793E1): 0.3143105553589793E1 0.3143105553589793E1 (0.123E~2, 0.123E1, 0.2718281828459045E1): 0.2719794728459045E1 0.2719794728459045E1 (0.123E~2, 0.123E1, 0.123E1): 0.12315129E1 0.12315129E1 (0.123E~2, 0.123E1, 0.123): 0.1245129 0.1245129 (0.123E~2, 0.123E1, 0.123E~2): 0.27429E~2 0.27429E~2 (0.123E~2, 0.123E1, 0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, 0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, 0.5E~323): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, 0.0): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, ~0.123E4): ~0.12299984871E4 ~0.12299984871E4 (0.123E~2, 0.123E1, ~0.123E2): ~0.12298487100000001E2 ~0.12298487100000001E2 (0.123E~2, 0.123E1, ~0.3141592653589793E1): ~0.31400797535897933E1 ~0.31400797535897933E1 (0.123E~2, 0.123E1, ~0.2718281828459045E1): ~0.27167689284590453E1 ~0.27167689284590453E1 (0.123E~2, 0.123E1, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (0.123E~2, 0.123E1, ~0.123): ~0.1214871 ~0.1214871 (0.123E~2, 0.123E1, ~0.123E~2): 0.2829E~3 0.2829E~3 (0.123E~2, 0.123E1, ~0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, ~0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, ~0.5E~323): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123E1, ~0.0): 0.15129E~2 0.15129E~2 (0.123E~2, 0.123, 0.123E4): 0.123000015129E4 0.123000015129E4 (0.123E~2, 0.123, 0.123E2): 0.1230015129E2 0.1230015129E2 (0.123E~2, 0.123, 0.3141592653589793E1): 0.3141743943589793E1 0.3141743943589793E1 (0.123E~2, 0.123, 0.2718281828459045E1): 0.2718433118459045E1 0.2718433118459045E1 (0.123E~2, 0.123, 0.123E1): 0.123015129E1 0.123015129E1 (0.123E~2, 0.123, 0.123): 0.12315129 0.12315129 (0.123E~2, 0.123, 0.123E~2): 0.13812899999999999E~2 0.13812899999999999E~2 (0.123E~2, 0.123, 0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.5E~323): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, 0.0): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.123E4): ~0.122999984871E4 ~0.122999984871E4 (0.123E~2, 0.123, ~0.123E2): ~0.12299848710000001E2 ~0.12299848710000001E2 (0.123E~2, 0.123, ~0.3141592653589793E1): ~0.31414413635897933E1 ~0.31414413635897933E1 (0.123E~2, 0.123, ~0.2718281828459045E1): ~0.27181305384590453E1 ~0.27181305384590453E1 (0.123E~2, 0.123, ~0.123E1): ~0.122984871E1 ~0.122984871E1 (0.123E~2, 0.123, ~0.123): ~0.12284871 ~0.12284871 (0.123E~2, 0.123, ~0.123E~2): ~0.107871E~2 ~0.107871E~2 (0.123E~2, 0.123, ~0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.5E~323): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123, ~0.0): 0.15129E~3 0.15129E~3 (0.123E~2, 0.123E~2, 0.123E4): 0.12300000015129E4 0.12300000015129E4 (0.123E~2, 0.123E~2, 0.123E2): 0.12300001512900002E2 0.12300001512900002E2 (0.123E~2, 0.123E~2, 0.3141592653589793E1): 0.3141594166489793E1 0.3141594166489793E1 (0.123E~2, 0.123E~2, 0.2718281828459045E1): 0.2718283341359045E1 0.2718283341359045E1 (0.123E~2, 0.123E~2, 0.123E1): 0.12300015129E1 0.12300015129E1 (0.123E~2, 0.123E~2, 0.123): 0.1230015129 0.1230015129 (0.123E~2, 0.123E~2, 0.123E~2): 0.12315129E~2 0.12315129E~2 (0.123E~2, 0.123E~2, 0.22250738585072014E~307): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, 0.11125369292536007E~307): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, 0.5E~323): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, 0.0): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, ~0.123E4): ~0.12299999984871E4 ~0.12299999984871E4 (0.123E~2, 0.123E~2, ~0.123E2): ~0.122999984871E2 ~0.122999984871E2 (0.123E~2, 0.123E~2, ~0.3141592653589793E1): ~0.3141591140689793E1 ~0.3141591140689793E1 (0.123E~2, 0.123E~2, ~0.2718281828459045E1): ~0.2718280315559045E1 ~0.2718280315559045E1 (0.123E~2, 0.123E~2, ~0.123E1): ~0.12299984871E1 ~0.12299984871E1 (0.123E~2, 0.123E~2, ~0.123): ~0.1229984871 ~0.1229984871 (0.123E~2, 0.123E~2, ~0.123E~2): ~0.12284871E~2 ~0.12284871E~2 (0.123E~2, 0.123E~2, ~0.22250738585072014E~307): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, ~0.11125369292536007E~307): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, ~0.5E~323): 0.15129E~5 0.15129E~5 (0.123E~2, 0.123E~2, ~0.0): 0.15129E~5 0.15129E~5 (0.123E~2, 0.22250738585072014E~307, 0.22250738585072014E~307): 0.22278106993531654E~307 0.22278106993531654E~307 (0.123E~2, 0.22250738585072014E~307, 0.11125369292536007E~307): 0.11152737700995647E~307 0.11152737700995647E~307 (0.123E~2, 0.22250738585072014E~307, 0.5E~323): 0.27368408459645E~310 0.27368408459645E~310 (0.123E~2, 0.22250738585072014E~307, 0.0): 0.2736840845964E~310 0.2736840845964E~310 (0.123E~2, 0.22250738585072014E~307, ~0.22250738585072014E~307): ~0.22223370176612374E~307 ~0.22223370176612374E~307 (0.123E~2, 0.22250738585072014E~307, ~0.11125369292536007E~307): ~0.11098000884076367E~307 ~0.11098000884076367E~307 (0.123E~2, 0.22250738585072014E~307, ~0.5E~323): 0.27368408459635E~310 0.27368408459635E~310 (0.123E~2, 0.22250738585072014E~307, ~0.0): 0.2736840845964E~310 0.2736840845964E~310 (0.123E~2, 0.11125369292536007E~307, 0.22250738585072014E~307): 0.22264422789301834E~307 0.22264422789301834E~307 (0.123E~2, 0.11125369292536007E~307, 0.11125369292536007E~307): 0.11139053496765827E~307 0.11139053496765827E~307 (0.123E~2, 0.11125369292536007E~307, 0.5E~323): 0.13684204229825E~310 0.13684204229825E~310 (0.123E~2, 0.11125369292536007E~307, 0.0): 0.1368420422982E~310 0.1368420422982E~310 (0.123E~2, 0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.22237054380842194E~307 ~0.22237054380842194E~307 (0.123E~2, 0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.11111685088306187E~307 ~0.11111685088306187E~307 (0.123E~2, 0.11125369292536007E~307, ~0.5E~323): 0.13684204229815E~310 0.13684204229815E~310 (0.123E~2, 0.11125369292536007E~307, ~0.0): 0.1368420422982E~310 0.1368420422982E~310 (0.123E~2, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.123E~2, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.123E~2, 0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (0.123E~2, 0.5E~323, 0.0): 0.0 0.0 (0.123E~2, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.123E~2, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.123E~2, 0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.123E~2, 0.5E~323, ~0.0): 0.0 0.0 (0.123E~2, ~0.17976931348623157E309, 0.17976931348623157E309): 0.17954819723064351E309 0.17954819723064351E309 (0.123E~2, ~0.17976931348623157E309, 0.8988465674311579E308): 0.8966354048752772E308 0.8966354048752772E308 (0.123E~2, ~0.17976931348623157E309, 0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, 0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (0.123E~2, ~0.17976931348623157E309, ~0.8988465674311579E308): ~0.9010577299870385E308 ~0.9010577299870385E308 (0.123E~2, ~0.17976931348623157E309, ~0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.17976931348623157E309, ~0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (0.123E~2, ~0.8988465674311579E308, 0.17976931348623157E309): 0.17965875535843753E309 0.17965875535843753E309 (0.123E~2, ~0.8988465674311579E308, 0.8988465674311579E308): 0.8977409861532176E308 0.8977409861532176E308 (0.123E~2, ~0.8988465674311579E308, 0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, 0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (0.123E~2, ~0.8988465674311579E308, ~0.8988465674311579E308): ~0.8999521487090981E308 ~0.8999521487090981E308 (0.123E~2, ~0.8988465674311579E308, ~0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.8988465674311579E308, ~0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (0.123E~2, ~0.123E4, 0.123E4): 0.12284871E4 0.12284871E4 (0.123E~2, ~0.123E4, 0.123E2): 0.107871E2 0.107871E2 (0.123E~2, ~0.123E4, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (0.123E~2, ~0.123E4, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (0.123E~2, ~0.123E4, 0.123E1): ~0.2829 ~0.2829 (0.123E~2, ~0.123E4, 0.123): ~0.13899E1 ~0.13899E1 (0.123E~2, ~0.123E4, 0.123E~2): ~0.151167E1 ~0.151167E1 (0.123E~2, ~0.123E4, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, 0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, 0.0): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (0.123E~2, ~0.123E4, ~0.123E2): ~0.138129E2 ~0.138129E2 (0.123E~2, ~0.123E4, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (0.123E~2, ~0.123E4, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (0.123E~2, ~0.123E4, ~0.123E1): ~0.27429E1 ~0.27429E1 (0.123E~2, ~0.123E4, ~0.123): ~0.16359E1 ~0.16359E1 (0.123E~2, ~0.123E4, ~0.123E~2): ~0.151413E1 ~0.151413E1 (0.123E~2, ~0.123E4, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, ~0.5E~323): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E4, ~0.0): ~0.15129E1 ~0.15129E1 (0.123E~2, ~0.123E2, 0.123E4): 0.1229984871E4 0.1229984871E4 (0.123E~2, ~0.123E2, 0.123E2): 0.12284871E2 0.12284871E2 (0.123E~2, ~0.123E2, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (0.123E~2, ~0.123E2, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (0.123E~2, ~0.123E2, 0.123E1): 0.1214871E1 0.1214871E1 (0.123E~2, ~0.123E2, 0.123): 0.107871 0.107871 (0.123E~2, ~0.123E2, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (0.123E~2, ~0.123E2, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, 0.0): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (0.123E~2, ~0.123E2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (0.123E~2, ~0.123E2, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (0.123E~2, ~0.123E2, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (0.123E~2, ~0.123E2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (0.123E~2, ~0.123E2, ~0.123): ~0.138129 ~0.138129 (0.123E~2, ~0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359000000000002E~1 (0.123E~2, ~0.123E2, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.123E2, ~0.0): ~0.15129E~1 ~0.15129E~1 (0.123E~2, ~0.3141592653589793E1, 0.123E4): 0.1229996135841036E4 0.1229996135841036E4 (0.123E~2, ~0.3141592653589793E1, 0.123E2): 0.12296135841036085E2 0.12296135841036085E2 (0.123E~2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.31377284946258777E1 0.31377284946258777E1 (0.123E~2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.27144176694951296E1 0.27144176694951296E1 (0.123E~2, ~0.3141592653589793E1, 0.123E1): 0.12261358410360845E1 0.12261358410360845E1 (0.123E~2, ~0.3141592653589793E1, 0.123): 0.11913584103608456 0.11913584103608456 (0.123E~2, ~0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.26341589639154455E~2 (0.123E~2, ~0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, 0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, 0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, ~0.123E4): ~0.1230003864158964E4 ~0.1230003864158964E4 (0.123E~2, ~0.3141592653589793E1, ~0.123E2): ~0.12303864158963917E2 ~0.12303864158963917E2 (0.123E~2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.31454568125537086E1 ~0.31454568125537086E1 (0.123E~2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.27221459874229605E1 ~0.27221459874229605E1 (0.123E~2, ~0.3141592653589793E1, ~0.123E1): ~0.12338641589639154E1 ~0.12338641589639154E1 (0.123E~2, ~0.3141592653589793E1, ~0.123): ~0.12686415896391545 ~0.12686415896391545 (0.123E~2, ~0.3141592653589793E1, ~0.123E~2): ~0.5094158963915445E~2 ~0.5094158963915445E~2 (0.123E~2, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, ~0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.3141592653589793E1, ~0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (0.123E~2, ~0.2718281828459045E1, 0.123E4): 0.1229996656513351E4 0.1229996656513351E4 (0.123E~2, ~0.2718281828459045E1, 0.123E2): 0.12296656513350996E2 0.12296656513350996E2 (0.123E~2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.31382491669407884E1 0.31382491669407884E1 (0.123E~2, ~0.2718281828459045E1, 0.2718281828459045E1): 0.27149383418100403E1 0.27149383418100403E1 (0.123E~2, ~0.2718281828459045E1, 0.123E1): 0.12266565133509955E1 0.12266565133509955E1 (0.123E~2, ~0.2718281828459045E1, 0.123): 0.11965651335099538 0.11965651335099538 (0.123E~2, ~0.2718281828459045E1, 0.123E~2): ~0.21134866490046256E~2 ~0.21134866490046256E~2 (0.123E~2, ~0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, 0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, 0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, ~0.123E4): ~0.1230003343486649E4 ~0.1230003343486649E4 (0.123E~2, ~0.2718281828459045E1, ~0.123E2): ~0.12303343486649005E2 ~0.12303343486649005E2 (0.123E~2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.3144936140238798E1 ~0.3144936140238798E1 (0.123E~2, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.272162531510805E1 ~0.272162531510805E1 (0.123E~2, ~0.2718281828459045E1, ~0.123E1): ~0.12333434866490045E1 ~0.12333434866490045E1 (0.123E~2, ~0.2718281828459045E1, ~0.123): ~0.12634348664900463 ~0.12634348664900463 (0.123E~2, ~0.2718281828459045E1, ~0.123E~2): ~0.4573486649004625E~2 ~0.4573486649004625E~2 (0.123E~2, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, ~0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.2718281828459045E1, ~0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (0.123E~2, ~0.123E1, 0.123E4): 0.12299984871E4 0.12299984871E4 (0.123E~2, ~0.123E1, 0.123E2): 0.12298487100000001E2 0.12298487100000001E2 (0.123E~2, ~0.123E1, 0.3141592653589793E1): 0.31400797535897933E1 0.31400797535897933E1 (0.123E~2, ~0.123E1, 0.2718281828459045E1): 0.27167689284590453E1 0.27167689284590453E1 (0.123E~2, ~0.123E1, 0.123E1): 0.12284871E1 0.12284871E1 (0.123E~2, ~0.123E1, 0.123): 0.1214871 0.1214871 (0.123E~2, ~0.123E1, 0.123E~2): ~0.2829E~3 ~0.2829E~3 (0.123E~2, ~0.123E1, 0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, 0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, 0.5E~323): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, 0.0): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, ~0.123E4): ~0.12300015129E4 ~0.12300015129E4 (0.123E~2, ~0.123E1, ~0.123E2): ~0.123015129E2 ~0.123015129E2 (0.123E~2, ~0.123E1, ~0.3141592653589793E1): ~0.3143105553589793E1 ~0.3143105553589793E1 (0.123E~2, ~0.123E1, ~0.2718281828459045E1): ~0.2719794728459045E1 ~0.2719794728459045E1 (0.123E~2, ~0.123E1, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (0.123E~2, ~0.123E1, ~0.123): ~0.1245129 ~0.1245129 (0.123E~2, ~0.123E1, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (0.123E~2, ~0.123E1, ~0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, ~0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, ~0.5E~323): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123E1, ~0.0): ~0.15129E~2 ~0.15129E~2 (0.123E~2, ~0.123, 0.123E4): 0.122999984871E4 0.122999984871E4 (0.123E~2, ~0.123, 0.123E2): 0.12299848710000001E2 0.12299848710000001E2 (0.123E~2, ~0.123, 0.3141592653589793E1): 0.31414413635897933E1 0.31414413635897933E1 (0.123E~2, ~0.123, 0.2718281828459045E1): 0.27181305384590453E1 0.27181305384590453E1 (0.123E~2, ~0.123, 0.123E1): 0.122984871E1 0.122984871E1 (0.123E~2, ~0.123, 0.123): 0.12284871 0.12284871 (0.123E~2, ~0.123, 0.123E~2): 0.107871E~2 0.107871E~2 (0.123E~2, ~0.123, 0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.5E~323): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, 0.0): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.123E4): ~0.123000015129E4 ~0.123000015129E4 (0.123E~2, ~0.123, ~0.123E2): ~0.1230015129E2 ~0.1230015129E2 (0.123E~2, ~0.123, ~0.3141592653589793E1): ~0.3141743943589793E1 ~0.3141743943589793E1 (0.123E~2, ~0.123, ~0.2718281828459045E1): ~0.2718433118459045E1 ~0.2718433118459045E1 (0.123E~2, ~0.123, ~0.123E1): ~0.123015129E1 ~0.123015129E1 (0.123E~2, ~0.123, ~0.123): ~0.12315129 ~0.12315129 (0.123E~2, ~0.123, ~0.123E~2): ~0.13812899999999999E~2 ~0.13812899999999999E~2 (0.123E~2, ~0.123, ~0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.5E~323): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123, ~0.0): ~0.15129E~3 ~0.15129E~3 (0.123E~2, ~0.123E~2, 0.123E4): 0.12299999984871E4 0.12299999984871E4 (0.123E~2, ~0.123E~2, 0.123E2): 0.122999984871E2 0.122999984871E2 (0.123E~2, ~0.123E~2, 0.3141592653589793E1): 0.3141591140689793E1 0.3141591140689793E1 (0.123E~2, ~0.123E~2, 0.2718281828459045E1): 0.2718280315559045E1 0.2718280315559045E1 (0.123E~2, ~0.123E~2, 0.123E1): 0.12299984871E1 0.12299984871E1 (0.123E~2, ~0.123E~2, 0.123): 0.1229984871 0.1229984871 (0.123E~2, ~0.123E~2, 0.123E~2): 0.12284871E~2 0.12284871E~2 (0.123E~2, ~0.123E~2, 0.22250738585072014E~307): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, 0.11125369292536007E~307): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, 0.5E~323): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, 0.0): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, ~0.123E4): ~0.12300000015129E4 ~0.12300000015129E4 (0.123E~2, ~0.123E~2, ~0.123E2): ~0.12300001512900002E2 ~0.12300001512900002E2 (0.123E~2, ~0.123E~2, ~0.3141592653589793E1): ~0.3141594166489793E1 ~0.3141594166489793E1 (0.123E~2, ~0.123E~2, ~0.2718281828459045E1): ~0.2718283341359045E1 ~0.2718283341359045E1 (0.123E~2, ~0.123E~2, ~0.123E1): ~0.12300015129E1 ~0.12300015129E1 (0.123E~2, ~0.123E~2, ~0.123): ~0.1230015129 ~0.1230015129 (0.123E~2, ~0.123E~2, ~0.123E~2): ~0.12315129E~2 ~0.12315129E~2 (0.123E~2, ~0.123E~2, ~0.22250738585072014E~307): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, ~0.11125369292536007E~307): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, ~0.5E~323): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.123E~2, ~0.0): ~0.15129E~5 ~0.15129E~5 (0.123E~2, ~0.22250738585072014E~307, 0.22250738585072014E~307): 0.22223370176612374E~307 0.22223370176612374E~307 (0.123E~2, ~0.22250738585072014E~307, 0.11125369292536007E~307): 0.11098000884076367E~307 0.11098000884076367E~307 (0.123E~2, ~0.22250738585072014E~307, 0.5E~323): ~0.27368408459635E~310 ~0.27368408459635E~310 (0.123E~2, ~0.22250738585072014E~307, 0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (0.123E~2, ~0.22250738585072014E~307, ~0.22250738585072014E~307): ~0.22278106993531654E~307 ~0.22278106993531654E~307 (0.123E~2, ~0.22250738585072014E~307, ~0.11125369292536007E~307): ~0.11152737700995647E~307 ~0.11152737700995647E~307 (0.123E~2, ~0.22250738585072014E~307, ~0.5E~323): ~0.27368408459645E~310 ~0.27368408459645E~310 (0.123E~2, ~0.22250738585072014E~307, ~0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (0.123E~2, ~0.11125369292536007E~307, 0.22250738585072014E~307): 0.22237054380842194E~307 0.22237054380842194E~307 (0.123E~2, ~0.11125369292536007E~307, 0.11125369292536007E~307): 0.11111685088306187E~307 0.11111685088306187E~307 (0.123E~2, ~0.11125369292536007E~307, 0.5E~323): ~0.13684204229815E~310 ~0.13684204229815E~310 (0.123E~2, ~0.11125369292536007E~307, 0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (0.123E~2, ~0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.22264422789301834E~307 ~0.22264422789301834E~307 (0.123E~2, ~0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.11139053496765827E~307 ~0.11139053496765827E~307 (0.123E~2, ~0.11125369292536007E~307, ~0.5E~323): ~0.13684204229825E~310 ~0.13684204229825E~310 (0.123E~2, ~0.11125369292536007E~307, ~0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (0.123E~2, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.123E~2, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.123E~2, ~0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (0.123E~2, ~0.5E~323, 0.0): ~0.0 ~0.0 (0.123E~2, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.123E~2, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.123E~2, ~0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.123E~2, ~0.5E~323, ~0.0): ~0.0 ~0.0 (0.22250738585072014E~307, 0.17976931348623157E309, 0.123E4): 0.1234E4 0.1234E4 (0.22250738585072014E~307, 0.17976931348623157E309, 0.123E2): 0.163E2 0.163E2 (0.22250738585072014E~307, 0.17976931348623157E309, 0.3141592653589793E1): 0.7141592653589793E1 0.7141592653589793E1 (0.22250738585072014E~307, 0.17976931348623157E309, 0.123): 0.4122999999999999E1 0.4122999999999999E1 (0.22250738585072014E~307, 0.17976931348623157E309, 0.123E~2): 0.400123E1 0.400123E1 (0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E4): ~0.1226E4 ~0.1226E4 (0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E2): ~0.83E1 ~0.83E1 (0.22250738585072014E~307, 0.17976931348623157E309, ~0.123): 0.3877E1 0.3877E1 (0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E~2): 0.39987699999999995E1 0.39987699999999995E1 (0.22250738585072014E~307, 0.8988465674311579E308, 0.123E4): 0.1232E4 0.1232E4 (0.22250738585072014E~307, 0.8988465674311579E308, 0.123E2): 0.143E2 0.143E2 (0.22250738585072014E~307, 0.8988465674311579E308, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (0.22250738585072014E~307, 0.8988465674311579E308, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (0.22250738585072014E~307, 0.8988465674311579E308, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (0.22250738585072014E~307, 0.8988465674311579E308, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E2): ~0.103E2 ~0.103E2 (0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (0.22250738585072014E~307, 0.123E4, 0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (0.22250738585072014E~307, 0.123E4, ~0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (0.22250738585072014E~307, 0.123E2, 0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (0.22250738585072014E~307, 0.123E2, ~0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (0.22250738585072014E~307, 0.3141592653589793E1, 0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (0.22250738585072014E~307, 0.3141592653589793E1, ~0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (0.22250738585072014E~307, 0.2718281828459045E1, 0.5E~323): 0.6048377836559379E~307 0.6048377836559379E~307 (0.22250738585072014E~307, 0.2718281828459045E1, ~0.5E~323): 0.6048377836559377E~307 0.6048377836559377E~307 (0.22250738585072014E~307, 0.123E~2, 0.22250738585072014E~307): 0.22278106993531654E~307 0.22278106993531654E~307 (0.22250738585072014E~307, 0.123E~2, 0.11125369292536007E~307): 0.11152737700995647E~307 0.11152737700995647E~307 (0.22250738585072014E~307, 0.123E~2, 0.5E~323): 0.27368408459645E~310 0.27368408459645E~310 (0.22250738585072014E~307, 0.123E~2, 0.0): 0.2736840845964E~310 0.2736840845964E~310 (0.22250738585072014E~307, 0.123E~2, ~0.22250738585072014E~307): ~0.22223370176612374E~307 ~0.22223370176612374E~307 (0.22250738585072014E~307, 0.123E~2, ~0.11125369292536007E~307): ~0.11098000884076367E~307 ~0.11098000884076367E~307 (0.22250738585072014E~307, 0.123E~2, ~0.5E~323): 0.27368408459635E~310 0.27368408459635E~310 (0.22250738585072014E~307, 0.123E~2, ~0.0): 0.2736840845964E~310 0.2736840845964E~310 (0.22250738585072014E~307, 0.22250738585072014E~307, 0.0): 0.0 0.0 (0.22250738585072014E~307, 0.22250738585072014E~307, ~0.0): 0.0 0.0 (0.22250738585072014E~307, 0.11125369292536007E~307, 0.0): 0.0 0.0 (0.22250738585072014E~307, 0.11125369292536007E~307, ~0.0): 0.0 0.0 (0.22250738585072014E~307, 0.5E~323, 0.0): 0.0 0.0 (0.22250738585072014E~307, 0.5E~323, ~0.0): 0.0 0.0 (0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E4): 0.1226E4 0.1226E4 (0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E2): 0.83E1 0.83E1 (0.22250738585072014E~307, ~0.17976931348623157E309, 0.123): ~0.3877E1 ~0.3877E1 (0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E~2): ~0.39987699999999995E1 ~0.39987699999999995E1 (0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E4): ~0.1234E4 ~0.1234E4 (0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E2): ~0.163E2 ~0.163E2 (0.22250738585072014E~307, ~0.17976931348623157E309, ~0.3141592653589793E1): ~0.7141592653589793E1 ~0.7141592653589793E1 (0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123): ~0.4122999999999999E1 ~0.4122999999999999E1 (0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E~2): ~0.400123E1 ~0.400123E1 (0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E4): 0.1228E4 0.1228E4 (0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E2): 0.103E2 0.103E2 (0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E2): ~0.143E2 ~0.143E2 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (0.22250738585072014E~307, ~0.123E4, 0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (0.22250738585072014E~307, ~0.123E4, ~0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (0.22250738585072014E~307, ~0.123E2, 0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (0.22250738585072014E~307, ~0.123E2, ~0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (0.22250738585072014E~307, ~0.3141592653589793E1, 0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (0.22250738585072014E~307, ~0.3141592653589793E1, ~0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (0.22250738585072014E~307, ~0.2718281828459045E1, 0.5E~323): ~0.6048377836559377E~307 ~0.6048377836559377E~307 (0.22250738585072014E~307, ~0.2718281828459045E1, ~0.5E~323): ~0.6048377836559379E~307 ~0.6048377836559379E~307 (0.22250738585072014E~307, ~0.123E~2, 0.22250738585072014E~307): 0.22223370176612374E~307 0.22223370176612374E~307 (0.22250738585072014E~307, ~0.123E~2, 0.11125369292536007E~307): 0.11098000884076367E~307 0.11098000884076367E~307 (0.22250738585072014E~307, ~0.123E~2, 0.5E~323): ~0.27368408459635E~310 ~0.27368408459635E~310 (0.22250738585072014E~307, ~0.123E~2, 0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (0.22250738585072014E~307, ~0.123E~2, ~0.22250738585072014E~307): ~0.22278106993531654E~307 ~0.22278106993531654E~307 (0.22250738585072014E~307, ~0.123E~2, ~0.11125369292536007E~307): ~0.11152737700995647E~307 ~0.11152737700995647E~307 (0.22250738585072014E~307, ~0.123E~2, ~0.5E~323): ~0.27368408459645E~310 ~0.27368408459645E~310 (0.22250738585072014E~307, ~0.123E~2, ~0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (0.22250738585072014E~307, ~0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (0.22250738585072014E~307, ~0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (0.22250738585072014E~307, ~0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (0.22250738585072014E~307, ~0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (0.22250738585072014E~307, ~0.5E~323, 0.0): ~0.0 ~0.0 (0.22250738585072014E~307, ~0.5E~323, ~0.0): ~0.0 ~0.0 (0.11125369292536007E~307, 0.17976931348623157E309, 0.123E4): 0.1232E4 0.1232E4 (0.11125369292536007E~307, 0.17976931348623157E309, 0.123E2): 0.143E2 0.143E2 (0.11125369292536007E~307, 0.17976931348623157E309, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (0.11125369292536007E~307, 0.17976931348623157E309, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (0.11125369292536007E~307, 0.17976931348623157E309, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (0.11125369292536007E~307, 0.17976931348623157E309, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E4): ~0.1228E4 ~0.1228E4 (0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E2): ~0.103E2 ~0.103E2 (0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (0.11125369292536007E~307, 0.8988465674311579E308, 0.123E4): 0.1231E4 0.1231E4 (0.11125369292536007E~307, 0.8988465674311579E308, 0.123E2): 0.133E2 0.133E2 (0.11125369292536007E~307, 0.8988465674311579E308, 0.3141592653589793E1): 0.4141592653589793E1 0.4141592653589793E1 (0.11125369292536007E~307, 0.8988465674311579E308, 0.2718281828459045E1): 0.3718281828459045E1 0.3718281828459045E1 (0.11125369292536007E~307, 0.8988465674311579E308, 0.123E1): 0.223E1 0.223E1 (0.11125369292536007E~307, 0.8988465674311579E308, 0.123): 0.11229999999999998E1 0.11229999999999998E1 (0.11125369292536007E~307, 0.8988465674311579E308, 0.123E~2): 0.10012299999999998E1 0.10012299999999998E1 (0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E4): ~0.1229E4 ~0.1229E4 (0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E2): ~0.113E2 ~0.113E2 (0.11125369292536007E~307, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.2141592653589793E1 ~0.2141592653589793E1 (0.11125369292536007E~307, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.1718281828459045E1 ~0.1718281828459045E1 (0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E~2): 0.9987699999999999 0.9987699999999999 (0.11125369292536007E~307, 0.123E4, 0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (0.11125369292536007E~307, 0.123E4, ~0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (0.11125369292536007E~307, 0.123E2, 0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (0.11125369292536007E~307, 0.123E2, ~0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (0.11125369292536007E~307, 0.2718281828459045E1, 0.22250738585072014E~307): 0.524926277678689E~307 0.524926277678689E~307 (0.11125369292536007E~307, 0.123, 0.22250738585072014E~307): 0.23619159008053945E~307 0.23619159008053945E~307 (0.11125369292536007E~307, 0.123, 0.11125369292536007E~307): 0.1249378971551794E~307 0.1249378971551794E~307 (0.11125369292536007E~307, 0.123, 0.5E~323): 0.136842042298193E~308 0.136842042298193E~308 (0.11125369292536007E~307, 0.123, 0.0): 0.136842042298193E~308 0.136842042298193E~308 (0.11125369292536007E~307, 0.123, ~0.22250738585072014E~307): ~0.20882318162090083E~307 ~0.20882318162090083E~307 (0.11125369292536007E~307, 0.123, ~0.11125369292536007E~307): ~0.9756948869554076E~308 ~0.9756948869554076E~308 (0.11125369292536007E~307, 0.123, ~0.5E~323): 0.136842042298192E~308 0.136842042298192E~308 (0.11125369292536007E~307, 0.123, ~0.0): 0.136842042298193E~308 0.136842042298193E~308 (0.11125369292536007E~307, 0.123E~2, 0.22250738585072014E~307): 0.22264422789301834E~307 0.22264422789301834E~307 (0.11125369292536007E~307, 0.123E~2, 0.11125369292536007E~307): 0.11139053496765827E~307 0.11139053496765827E~307 (0.11125369292536007E~307, 0.123E~2, 0.5E~323): 0.13684204229825E~310 0.13684204229825E~310 (0.11125369292536007E~307, 0.123E~2, 0.0): 0.1368420422982E~310 0.1368420422982E~310 (0.11125369292536007E~307, 0.123E~2, ~0.22250738585072014E~307): ~0.22237054380842194E~307 ~0.22237054380842194E~307 (0.11125369292536007E~307, 0.123E~2, ~0.11125369292536007E~307): ~0.11111685088306187E~307 ~0.11111685088306187E~307 (0.11125369292536007E~307, 0.123E~2, ~0.5E~323): 0.13684204229815E~310 0.13684204229815E~310 (0.11125369292536007E~307, 0.123E~2, ~0.0): 0.1368420422982E~310 0.1368420422982E~310 (0.11125369292536007E~307, 0.22250738585072014E~307, 0.0): 0.0 0.0 (0.11125369292536007E~307, 0.22250738585072014E~307, ~0.0): 0.0 0.0 (0.11125369292536007E~307, 0.11125369292536007E~307, 0.0): 0.0 0.0 (0.11125369292536007E~307, 0.11125369292536007E~307, ~0.0): 0.0 0.0 (0.11125369292536007E~307, 0.5E~323, 0.0): 0.0 0.0 (0.11125369292536007E~307, 0.5E~323, ~0.0): 0.0 0.0 (0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E4): 0.1228E4 0.1228E4 (0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E2): 0.103E2 0.103E2 (0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E4): ~0.1232E4 ~0.1232E4 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E2): ~0.143E2 ~0.143E2 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E4): 0.1229E4 0.1229E4 (0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E2): 0.113E2 0.113E2 (0.11125369292536007E~307, ~0.8988465674311579E308, 0.3141592653589793E1): 0.2141592653589793E1 0.2141592653589793E1 (0.11125369292536007E~307, ~0.8988465674311579E308, 0.2718281828459045E1): 0.1718281828459045E1 0.1718281828459045E1 (0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E~2): ~0.9987699999999999 ~0.9987699999999999 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E4): ~0.1231E4 ~0.1231E4 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E2): ~0.133E2 ~0.133E2 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.4141592653589793E1 ~0.4141592653589793E1 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.3718281828459045E1 ~0.3718281828459045E1 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E1): ~0.223E1 ~0.223E1 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123): ~0.11229999999999998E1 ~0.11229999999999998E1 (0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E~2): ~0.10012299999999998E1 ~0.10012299999999998E1 (0.11125369292536007E~307, ~0.123E4, 0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (0.11125369292536007E~307, ~0.123E4, ~0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (0.11125369292536007E~307, ~0.123E2, 0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (0.11125369292536007E~307, ~0.123E2, ~0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (0.11125369292536007E~307, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.524926277678689E~307 ~0.524926277678689E~307 (0.11125369292536007E~307, ~0.123, 0.22250738585072014E~307): 0.20882318162090083E~307 0.20882318162090083E~307 (0.11125369292536007E~307, ~0.123, 0.11125369292536007E~307): 0.9756948869554076E~308 0.9756948869554076E~308 (0.11125369292536007E~307, ~0.123, 0.5E~323): ~0.136842042298192E~308 ~0.136842042298192E~308 (0.11125369292536007E~307, ~0.123, 0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.11125369292536007E~307, ~0.123, ~0.22250738585072014E~307): ~0.23619159008053945E~307 ~0.23619159008053945E~307 (0.11125369292536007E~307, ~0.123, ~0.11125369292536007E~307): ~0.1249378971551794E~307 ~0.1249378971551794E~307 (0.11125369292536007E~307, ~0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.11125369292536007E~307, ~0.123, ~0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (0.11125369292536007E~307, ~0.123E~2, 0.22250738585072014E~307): 0.22237054380842194E~307 0.22237054380842194E~307 (0.11125369292536007E~307, ~0.123E~2, 0.11125369292536007E~307): 0.11111685088306187E~307 0.11111685088306187E~307 (0.11125369292536007E~307, ~0.123E~2, 0.5E~323): ~0.13684204229815E~310 ~0.13684204229815E~310 (0.11125369292536007E~307, ~0.123E~2, 0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (0.11125369292536007E~307, ~0.123E~2, ~0.22250738585072014E~307): ~0.22264422789301834E~307 ~0.22264422789301834E~307 (0.11125369292536007E~307, ~0.123E~2, ~0.11125369292536007E~307): ~0.11139053496765827E~307 ~0.11139053496765827E~307 (0.11125369292536007E~307, ~0.123E~2, ~0.5E~323): ~0.13684204229825E~310 ~0.13684204229825E~310 (0.11125369292536007E~307, ~0.123E~2, ~0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (0.11125369292536007E~307, ~0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (0.11125369292536007E~307, ~0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (0.11125369292536007E~307, ~0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (0.11125369292536007E~307, ~0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (0.11125369292536007E~307, ~0.5E~323, 0.0): ~0.0 ~0.0 (0.11125369292536007E~307, ~0.5E~323, ~0.0): ~0.0 ~0.0 (0.5E~323, 0.17976931348623157E309, 0.123E4): 0.123E4 0.123E4 (0.5E~323, 0.17976931348623157E309, 0.123E2): 0.123E2 0.123E2 (0.5E~323, 0.17976931348623157E309, ~0.123E4): ~0.123E4 ~0.123E4 (0.5E~323, 0.17976931348623157E309, ~0.123E2): ~0.123E2 ~0.123E2 (0.5E~323, 0.8988465674311579E308, 0.123E4): 0.123E4 0.123E4 (0.5E~323, 0.8988465674311579E308, 0.123E2): 0.123E2 0.123E2 (0.5E~323, 0.8988465674311579E308, ~0.123E4): ~0.123E4 ~0.123E4 (0.5E~323, 0.8988465674311579E308, ~0.123E2): ~0.123E2 ~0.123E2 (0.5E~323, 0.123E2, 0.22250738585072014E~307): 0.22250738585072073E~307 0.22250738585072073E~307 (0.5E~323, 0.123E2, 0.11125369292536007E~307): 0.11125369292536066E~307 0.11125369292536066E~307 (0.5E~323, 0.123E2, 0.5E~323): 0.64E~322 0.64E~322 (0.5E~323, 0.123E2, 0.0): 0.6E~322 0.6E~322 (0.5E~323, 0.123E2, ~0.22250738585072014E~307): ~0.22250738585071955E~307 ~0.22250738585071955E~307 (0.5E~323, 0.123E2, ~0.11125369292536007E~307): ~0.1112536929253595E~307 ~0.1112536929253595E~307 (0.5E~323, 0.123E2, ~0.5E~323): 0.54E~322 0.54E~322 (0.5E~323, 0.123E2, ~0.0): 0.6E~322 0.6E~322 (0.5E~323, 0.3141592653589793E1, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (0.5E~323, 0.3141592653589793E1, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (0.5E~323, 0.3141592653589793E1, 0.5E~323): 0.2E~322 0.2E~322 (0.5E~323, 0.3141592653589793E1, 0.0): 0.15E~322 0.15E~322 (0.5E~323, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (0.5E~323, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (0.5E~323, 0.3141592653589793E1, ~0.5E~323): 0.1E~322 0.1E~322 (0.5E~323, 0.3141592653589793E1, ~0.0): 0.15E~322 0.15E~322 (0.5E~323, 0.2718281828459045E1, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (0.5E~323, 0.2718281828459045E1, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (0.5E~323, 0.2718281828459045E1, 0.5E~323): 0.2E~322 0.2E~322 (0.5E~323, 0.2718281828459045E1, 0.0): 0.15E~322 0.15E~322 (0.5E~323, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (0.5E~323, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (0.5E~323, 0.2718281828459045E1, ~0.5E~323): 0.1E~322 0.1E~322 (0.5E~323, 0.2718281828459045E1, ~0.0): 0.15E~322 0.15E~322 (0.5E~323, 0.123E1, 0.22250738585072014E~307): 0.2225073858507202E~307 0.2225073858507202E~307 (0.5E~323, 0.123E1, 0.11125369292536007E~307): 0.1112536929253601E~307 0.1112536929253601E~307 (0.5E~323, 0.123E1, 0.5E~323): 0.1E~322 0.1E~322 (0.5E~323, 0.123E1, 0.0): 0.5E~323 0.5E~323 (0.5E~323, 0.123E1, ~0.22250738585072014E~307): ~0.2225073858507201E~307 ~0.2225073858507201E~307 (0.5E~323, 0.123E1, ~0.11125369292536007E~307): ~0.11125369292536E~307 ~0.11125369292536E~307 (0.5E~323, 0.123E1, ~0.5E~323): 0.0 0.0 (0.5E~323, 0.123E1, ~0.0): 0.5E~323 0.5E~323 (0.5E~323, 0.123, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.5E~323, 0.123, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.5E~323, 0.123, 0.5E~323): 0.5E~323 0.5E~323 (0.5E~323, 0.123, 0.0): 0.0 0.0 (0.5E~323, 0.123, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.5E~323, 0.123, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.5E~323, 0.123, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.5E~323, 0.123, ~0.0): 0.0 0.0 (0.5E~323, 0.123E~2, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.5E~323, 0.123E~2, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.5E~323, 0.123E~2, 0.5E~323): 0.5E~323 0.5E~323 (0.5E~323, 0.123E~2, 0.0): 0.0 0.0 (0.5E~323, 0.123E~2, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.5E~323, 0.123E~2, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.5E~323, 0.123E~2, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.5E~323, 0.123E~2, ~0.0): 0.0 0.0 (0.5E~323, 0.22250738585072014E~307, 0.0): 0.0 0.0 (0.5E~323, 0.22250738585072014E~307, ~0.0): 0.0 0.0 (0.5E~323, 0.11125369292536007E~307, 0.0): 0.0 0.0 (0.5E~323, 0.11125369292536007E~307, ~0.0): 0.0 0.0 (0.5E~323, 0.5E~323, 0.0): 0.0 0.0 (0.5E~323, 0.5E~323, ~0.0): 0.0 0.0 (0.5E~323, ~0.17976931348623157E309, 0.123E4): 0.123E4 0.123E4 (0.5E~323, ~0.17976931348623157E309, 0.123E2): 0.123E2 0.123E2 (0.5E~323, ~0.17976931348623157E309, ~0.123E4): ~0.123E4 ~0.123E4 (0.5E~323, ~0.17976931348623157E309, ~0.123E2): ~0.123E2 ~0.123E2 (0.5E~323, ~0.8988465674311579E308, 0.123E4): 0.123E4 0.123E4 (0.5E~323, ~0.8988465674311579E308, 0.123E2): 0.123E2 0.123E2 (0.5E~323, ~0.8988465674311579E308, ~0.123E4): ~0.123E4 ~0.123E4 (0.5E~323, ~0.8988465674311579E308, ~0.123E2): ~0.123E2 ~0.123E2 (0.5E~323, ~0.123E2, 0.22250738585072014E~307): 0.22250738585071955E~307 0.22250738585071955E~307 (0.5E~323, ~0.123E2, 0.11125369292536007E~307): 0.1112536929253595E~307 0.1112536929253595E~307 (0.5E~323, ~0.123E2, 0.5E~323): ~0.54E~322 ~0.54E~322 (0.5E~323, ~0.123E2, 0.0): ~0.6E~322 ~0.6E~322 (0.5E~323, ~0.123E2, ~0.22250738585072014E~307): ~0.22250738585072073E~307 ~0.22250738585072073E~307 (0.5E~323, ~0.123E2, ~0.11125369292536007E~307): ~0.11125369292536066E~307 ~0.11125369292536066E~307 (0.5E~323, ~0.123E2, ~0.5E~323): ~0.64E~322 ~0.64E~322 (0.5E~323, ~0.123E2, ~0.0): ~0.6E~322 ~0.6E~322 (0.5E~323, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (0.5E~323, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (0.5E~323, ~0.3141592653589793E1, 0.5E~323): ~0.1E~322 ~0.1E~322 (0.5E~323, ~0.3141592653589793E1, 0.0): ~0.15E~322 ~0.15E~322 (0.5E~323, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (0.5E~323, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (0.5E~323, ~0.3141592653589793E1, ~0.5E~323): ~0.2E~322 ~0.2E~322 (0.5E~323, ~0.3141592653589793E1, ~0.0): ~0.15E~322 ~0.15E~322 (0.5E~323, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (0.5E~323, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (0.5E~323, ~0.2718281828459045E1, 0.5E~323): ~0.1E~322 ~0.1E~322 (0.5E~323, ~0.2718281828459045E1, 0.0): ~0.15E~322 ~0.15E~322 (0.5E~323, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (0.5E~323, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (0.5E~323, ~0.2718281828459045E1, ~0.5E~323): ~0.2E~322 ~0.2E~322 (0.5E~323, ~0.2718281828459045E1, ~0.0): ~0.15E~322 ~0.15E~322 (0.5E~323, ~0.123E1, 0.22250738585072014E~307): 0.2225073858507201E~307 0.2225073858507201E~307 (0.5E~323, ~0.123E1, 0.11125369292536007E~307): 0.11125369292536E~307 0.11125369292536E~307 (0.5E~323, ~0.123E1, 0.5E~323): ~0.0 ~0.0 (0.5E~323, ~0.123E1, 0.0): ~0.5E~323 ~0.5E~323 (0.5E~323, ~0.123E1, ~0.22250738585072014E~307): ~0.2225073858507202E~307 ~0.2225073858507202E~307 (0.5E~323, ~0.123E1, ~0.11125369292536007E~307): ~0.1112536929253601E~307 ~0.1112536929253601E~307 (0.5E~323, ~0.123E1, ~0.5E~323): ~0.1E~322 ~0.1E~322 (0.5E~323, ~0.123E1, ~0.0): ~0.5E~323 ~0.5E~323 (0.5E~323, ~0.123, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.5E~323, ~0.123, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.5E~323, ~0.123, 0.5E~323): 0.5E~323 0.5E~323 (0.5E~323, ~0.123, 0.0): ~0.0 ~0.0 (0.5E~323, ~0.123, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.5E~323, ~0.123, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.5E~323, ~0.123, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.5E~323, ~0.123, ~0.0): ~0.0 ~0.0 (0.5E~323, ~0.123E~2, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (0.5E~323, ~0.123E~2, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (0.5E~323, ~0.123E~2, 0.5E~323): 0.5E~323 0.5E~323 (0.5E~323, ~0.123E~2, 0.0): ~0.0 ~0.0 (0.5E~323, ~0.123E~2, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (0.5E~323, ~0.123E~2, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (0.5E~323, ~0.123E~2, ~0.5E~323): ~0.5E~323 ~0.5E~323 (0.5E~323, ~0.123E~2, ~0.0): ~0.0 ~0.0 (0.5E~323, ~0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (0.5E~323, ~0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (0.5E~323, ~0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (0.5E~323, ~0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (0.5E~323, ~0.5E~323, 0.0): ~0.0 ~0.0 (0.5E~323, ~0.5E~323, ~0.0): ~0.0 ~0.0 (~0.17976931348623157E309, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E4, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E4, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E2, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E2, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.3141592653589793E1, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.2718281828459045E1, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.17976931348623157E309): ~0.4134694210183326E308 ~0.4134694210183326E308 (~0.17976931348623157E309, 0.123E1, 0.8988465674311579E308): ~0.13123159884494904E309 ~0.13123159884494904E309 (~0.17976931348623157E309, 0.123E1, 0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E1, 0.0): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.8988465674311579E308): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.123E4): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.123E2): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.3141592653589793E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.2718281828459045E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.123E1): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.123): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.123E~2): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.22250738585072014E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.11125369292536007E~307): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.5E~323): ~inf ~inf (~0.17976931348623157E309, 0.123E1, ~0.0): ~inf ~inf (~0.17976931348623157E309, 0.123, 0.17976931348623157E309): 0.15765768792742509E309 0.15765768792742509E309 (~0.17976931348623157E309, 0.123, 0.8988465674311579E308): 0.677730311843093E308 0.677730311843093E308 (~0.17976931348623157E309, 0.123, 0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, 0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123, ~0.8988465674311579E308): ~0.11199628230192226E309 ~0.11199628230192226E309 (~0.17976931348623157E309, 0.123, ~0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123, ~0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.17976931348623157E309, 0.123E~2, 0.17976931348623157E309): 0.17954819723064351E309 0.17954819723064351E309 (~0.17976931348623157E309, 0.123E~2, 0.8988465674311579E308): 0.8966354048752772E308 0.8966354048752772E308 (~0.17976931348623157E309, 0.123E~2, 0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, 0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.17976931348623157E309): ~inf ~inf (~0.17976931348623157E309, 0.123E~2, ~0.8988465674311579E308): ~0.9010577299870385E308 ~0.9010577299870385E308 (~0.17976931348623157E309, 0.123E~2, ~0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.123E~2, ~0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.17976931348623157E309, 0.22250738585072014E~307, 0.123E4): 0.1226E4 0.1226E4 (~0.17976931348623157E309, 0.22250738585072014E~307, 0.123E2): 0.83E1 0.83E1 (~0.17976931348623157E309, 0.22250738585072014E~307, 0.123): ~0.3877E1 ~0.3877E1 (~0.17976931348623157E309, 0.22250738585072014E~307, 0.123E~2): ~0.39987699999999995E1 ~0.39987699999999995E1 (~0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E4): ~0.1234E4 ~0.1234E4 (~0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E2): ~0.163E2 ~0.163E2 (~0.17976931348623157E309, 0.22250738585072014E~307, ~0.3141592653589793E1): ~0.7141592653589793E1 ~0.7141592653589793E1 (~0.17976931348623157E309, 0.22250738585072014E~307, ~0.123): ~0.4122999999999999E1 ~0.4122999999999999E1 (~0.17976931348623157E309, 0.22250738585072014E~307, ~0.123E~2): ~0.400123E1 ~0.400123E1 (~0.17976931348623157E309, 0.11125369292536007E~307, 0.123E4): 0.1228E4 0.1228E4 (~0.17976931348623157E309, 0.11125369292536007E~307, 0.123E2): 0.103E2 0.103E2 (~0.17976931348623157E309, 0.11125369292536007E~307, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E2): ~0.143E2 ~0.143E2 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (~0.17976931348623157E309, 0.11125369292536007E~307, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (~0.17976931348623157E309, 0.5E~323, 0.123E4): 0.123E4 0.123E4 (~0.17976931348623157E309, 0.5E~323, 0.123E2): 0.123E2 0.123E2 (~0.17976931348623157E309, 0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (~0.17976931348623157E309, 0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (~0.17976931348623157E309, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.123E4): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.123E2): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.123E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.123): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, 0.0): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.123): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.17976931348623157E309, ~0.0): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.123E4): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.123E2): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.123E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.123): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, 0.0): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.123): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.8988465674311579E308, ~0.0): inf inf (~0.17976931348623157E309, ~0.123E4, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E4, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.123E4, 0.123E4): inf inf (~0.17976931348623157E309, ~0.123E4, 0.123E2): inf inf (~0.17976931348623157E309, ~0.123E4, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E4, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E4, 0.123E1): inf inf (~0.17976931348623157E309, ~0.123E4, 0.123): inf inf (~0.17976931348623157E309, ~0.123E4, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E4, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E4, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E4, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E4, 0.0): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.123): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E4, ~0.0): inf inf (~0.17976931348623157E309, ~0.123E2, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E2, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.123E2, 0.123E4): inf inf (~0.17976931348623157E309, ~0.123E2, 0.123E2): inf inf (~0.17976931348623157E309, ~0.123E2, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E2, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E2, 0.123E1): inf inf (~0.17976931348623157E309, ~0.123E2, 0.123): inf inf (~0.17976931348623157E309, ~0.123E2, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E2, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E2, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E2, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E2, 0.0): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.123): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E2, ~0.0): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.123E4): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.123E2): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.123E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.123): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, 0.0): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.123): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.3141592653589793E1, ~0.0): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.123E4): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.123E2): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.123E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.123): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, 0.0): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.123): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.2718281828459045E1, ~0.0): inf inf (~0.17976931348623157E309, ~0.123E1, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E1, 0.8988465674311579E308): inf inf (~0.17976931348623157E309, ~0.123E1, 0.123E4): inf inf (~0.17976931348623157E309, ~0.123E1, 0.123E2): inf inf (~0.17976931348623157E309, ~0.123E1, 0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E1, 0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E1, 0.123E1): inf inf (~0.17976931348623157E309, ~0.123E1, 0.123): inf inf (~0.17976931348623157E309, ~0.123E1, 0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E1, 0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E1, 0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E1, 0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E1, 0.0): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.17976931348623157E309): 0.4134694210183326E308 0.4134694210183326E308 (~0.17976931348623157E309, ~0.123E1, ~0.8988465674311579E308): 0.13123159884494904E309 0.13123159884494904E309 (~0.17976931348623157E309, ~0.123E1, ~0.123E4): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.123E2): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.3141592653589793E1): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.2718281828459045E1): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.123E1): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.123): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.123E~2): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.22250738585072014E~307): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.11125369292536007E~307): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.5E~323): inf inf (~0.17976931348623157E309, ~0.123E1, ~0.0): inf inf (~0.17976931348623157E309, ~0.123, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123, 0.8988465674311579E308): 0.11199628230192226E309 0.11199628230192226E309 (~0.17976931348623157E309, ~0.123, 0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.123): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, 0.0): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.17976931348623157E309): ~0.15765768792742509E309 ~0.15765768792742509E309 (~0.17976931348623157E309, ~0.123, ~0.8988465674311579E308): ~0.677730311843093E308 ~0.677730311843093E308 (~0.17976931348623157E309, ~0.123, ~0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.123): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123, ~0.0): 0.22111625558806483E308 0.22111625558806483E308 (~0.17976931348623157E309, ~0.123E~2, 0.17976931348623157E309): inf inf (~0.17976931348623157E309, ~0.123E~2, 0.8988465674311579E308): 0.9010577299870385E308 0.9010577299870385E308 (~0.17976931348623157E309, ~0.123E~2, 0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.123): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, 0.0): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.17976931348623157E309): ~0.17954819723064351E309 ~0.17954819723064351E309 (~0.17976931348623157E309, ~0.123E~2, ~0.8988465674311579E308): ~0.8966354048752772E308 ~0.8966354048752772E308 (~0.17976931348623157E309, ~0.123E~2, ~0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.123): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.123E~2, ~0.0): 0.2211162555880648E306 0.2211162555880648E306 (~0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E4): 0.1234E4 0.1234E4 (~0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E2): 0.163E2 0.163E2 (~0.17976931348623157E309, ~0.22250738585072014E~307, 0.3141592653589793E1): 0.7141592653589793E1 0.7141592653589793E1 (~0.17976931348623157E309, ~0.22250738585072014E~307, 0.123): 0.4122999999999999E1 0.4122999999999999E1 (~0.17976931348623157E309, ~0.22250738585072014E~307, 0.123E~2): 0.400123E1 0.400123E1 (~0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E4): ~0.1226E4 ~0.1226E4 (~0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E2): ~0.83E1 ~0.83E1 (~0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123): 0.3877E1 0.3877E1 (~0.17976931348623157E309, ~0.22250738585072014E~307, ~0.123E~2): 0.39987699999999995E1 0.39987699999999995E1 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E4): 0.1232E4 0.1232E4 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E2): 0.143E2 0.143E2 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (~0.17976931348623157E309, ~0.11125369292536007E~307, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (~0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E2): ~0.103E2 ~0.103E2 (~0.17976931348623157E309, ~0.11125369292536007E~307, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (~0.17976931348623157E309, ~0.5E~323, 0.123E4): 0.123E4 0.123E4 (~0.17976931348623157E309, ~0.5E~323, 0.123E2): 0.123E2 0.123E2 (~0.17976931348623157E309, ~0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (~0.17976931348623157E309, ~0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (~0.8988465674311579E308, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.123E4, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.123E4, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.123E2, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.123E2, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.17976931348623157E309): ~0.10261166380838123E309 ~0.10261166380838123E309 (~0.8988465674311579E308, 0.3141592653589793E1, 0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.3141592653589793E1, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.17976931348623157E309): ~0.6456251559585884E308 ~0.6456251559585884E308 (~0.8988465674311579E308, 0.2718281828459045E1, 0.8988465674311579E308): ~0.15444717233897463E309 ~0.15444717233897463E309 (~0.8988465674311579E308, 0.2718281828459045E1, 0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.123): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, 0.0): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.123E4): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.123E2): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.3141592653589793E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.2718281828459045E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.123E1): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.123): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.123E~2): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.22250738585072014E~307): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.11125369292536007E~307): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.5E~323): ~inf ~inf (~0.8988465674311579E308, 0.2718281828459045E1, ~0.0): ~inf ~inf (~0.8988465674311579E308, 0.123E1, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219915E308 (~0.8988465674311579E308, 0.123E1, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.2067347105091663E308 (~0.8988465674311579E308, 0.123E1, 0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, 0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E1, ~0.8988465674311579E308): ~inf ~inf (~0.8988465674311579E308, 0.123E1, ~0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123E1, ~0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.8988465674311579E308, 0.123, 0.17976931348623157E309): 0.16871350070682833E309 0.16871350070682833E309 (~0.8988465674311579E308, 0.123, 0.8988465674311579E308): 0.7882884396371254E308 0.7882884396371254E308 (~0.8988465674311579E308, 0.123, 0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, 0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123, ~0.8988465674311579E308): ~0.10094046952251902E309 ~0.10094046952251902E309 (~0.8988465674311579E308, 0.123, ~0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123, ~0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.8988465674311579E308, 0.123E~2, 0.17976931348623157E309): 0.17965875535843753E309 0.17965875535843753E309 (~0.8988465674311579E308, 0.123E~2, 0.8988465674311579E308): 0.8977409861532176E308 0.8977409861532176E308 (~0.8988465674311579E308, 0.123E~2, 0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, 0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.17976931348623157E309): ~inf ~inf (~0.8988465674311579E308, 0.123E~2, ~0.8988465674311579E308): ~0.8999521487090981E308 ~0.8999521487090981E308 (~0.8988465674311579E308, 0.123E~2, ~0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.123E~2, ~0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.8988465674311579E308, 0.22250738585072014E~307, 0.123E4): 0.1228E4 0.1228E4 (~0.8988465674311579E308, 0.22250738585072014E~307, 0.123E2): 0.103E2 0.103E2 (~0.8988465674311579E308, 0.22250738585072014E~307, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E2): ~0.143E2 ~0.143E2 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (~0.8988465674311579E308, 0.22250738585072014E~307, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (~0.8988465674311579E308, 0.11125369292536007E~307, 0.123E4): 0.1229E4 0.1229E4 (~0.8988465674311579E308, 0.11125369292536007E~307, 0.123E2): 0.113E2 0.113E2 (~0.8988465674311579E308, 0.11125369292536007E~307, 0.3141592653589793E1): 0.2141592653589793E1 0.2141592653589793E1 (~0.8988465674311579E308, 0.11125369292536007E~307, 0.2718281828459045E1): 0.1718281828459045E1 0.1718281828459045E1 (~0.8988465674311579E308, 0.11125369292536007E~307, 0.123E~2): ~0.9987699999999999 ~0.9987699999999999 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E4): ~0.1231E4 ~0.1231E4 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E2): ~0.133E2 ~0.133E2 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.3141592653589793E1): ~0.4141592653589793E1 ~0.4141592653589793E1 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.2718281828459045E1): ~0.3718281828459045E1 ~0.3718281828459045E1 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E1): ~0.223E1 ~0.223E1 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.123): ~0.11229999999999998E1 ~0.11229999999999998E1 (~0.8988465674311579E308, 0.11125369292536007E~307, ~0.123E~2): ~0.10012299999999998E1 ~0.10012299999999998E1 (~0.8988465674311579E308, 0.5E~323, 0.123E4): 0.123E4 0.123E4 (~0.8988465674311579E308, 0.5E~323, 0.123E2): 0.123E2 0.123E2 (~0.8988465674311579E308, 0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (~0.8988465674311579E308, 0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (~0.8988465674311579E308, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.123E4): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.123E2): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.123E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.123): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, 0.0): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.123): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.17976931348623157E309, ~0.0): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.123E4): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.123E2): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.123E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.123): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, 0.0): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.123): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.8988465674311579E308, ~0.0): inf inf (~0.8988465674311579E308, ~0.123E4, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E4, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.123E4, 0.123E4): inf inf (~0.8988465674311579E308, ~0.123E4, 0.123E2): inf inf (~0.8988465674311579E308, ~0.123E4, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.123E4, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.123E4, 0.123E1): inf inf (~0.8988465674311579E308, ~0.123E4, 0.123): inf inf (~0.8988465674311579E308, ~0.123E4, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.123E4, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.123E4, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.123E4, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.123E4, 0.0): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.123): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.123E4, ~0.0): inf inf (~0.8988465674311579E308, ~0.123E2, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E2, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.123E2, 0.123E4): inf inf (~0.8988465674311579E308, ~0.123E2, 0.123E2): inf inf (~0.8988465674311579E308, ~0.123E2, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.123E2, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.123E2, 0.123E1): inf inf (~0.8988465674311579E308, ~0.123E2, 0.123): inf inf (~0.8988465674311579E308, ~0.123E2, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.123E2, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.123E2, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.123E2, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.123E2, 0.0): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.123): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.123E2, ~0.0): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.123E4): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.123E2): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.123E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.123): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, 0.0): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.17976931348623157E309): 0.10261166380838123E309 0.10261166380838123E309 (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.123): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.3141592653589793E1, ~0.0): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.123E4): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.123E2): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.123E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.123): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.123E~2): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.5E~323): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, 0.0): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.17976931348623157E309): 0.6456251559585884E308 0.6456251559585884E308 (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.8988465674311579E308): 0.15444717233897463E309 0.15444717233897463E309 (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E4): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E2): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.3141592653589793E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.2718281828459045E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E1): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.123): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.123E~2): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.22250738585072014E~307): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.11125369292536007E~307): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.5E~323): inf inf (~0.8988465674311579E308, ~0.2718281828459045E1, ~0.0): inf inf (~0.8988465674311579E308, ~0.123E1, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E1, 0.8988465674311579E308): inf inf (~0.8988465674311579E308, ~0.123E1, 0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.123): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, 0.0): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219915E308 (~0.8988465674311579E308, ~0.123E1, ~0.8988465674311579E308): 0.2067347105091663E308 0.2067347105091663E308 (~0.8988465674311579E308, ~0.123E1, ~0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.123): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123E1, ~0.0): 0.1105581277940324E309 0.1105581277940324E309 (~0.8988465674311579E308, ~0.123, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123, 0.8988465674311579E308): 0.10094046952251902E309 0.10094046952251902E309 (~0.8988465674311579E308, ~0.123, 0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.123): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, 0.0): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.17976931348623157E309): ~0.16871350070682833E309 ~0.16871350070682833E309 (~0.8988465674311579E308, ~0.123, ~0.8988465674311579E308): ~0.7882884396371254E308 ~0.7882884396371254E308 (~0.8988465674311579E308, ~0.123, ~0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.123): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123, ~0.0): 0.11055812779403241E308 0.11055812779403241E308 (~0.8988465674311579E308, ~0.123E~2, 0.17976931348623157E309): inf inf (~0.8988465674311579E308, ~0.123E~2, 0.8988465674311579E308): 0.8999521487090981E308 0.8999521487090981E308 (~0.8988465674311579E308, ~0.123E~2, 0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.123): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, 0.0): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.17976931348623157E309): ~0.17965875535843753E309 ~0.17965875535843753E309 (~0.8988465674311579E308, ~0.123E~2, ~0.8988465674311579E308): ~0.8977409861532176E308 ~0.8977409861532176E308 (~0.8988465674311579E308, ~0.123E~2, ~0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.123): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.123E~2, ~0.0): 0.1105581277940324E306 0.1105581277940324E306 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E4): 0.1232E4 0.1232E4 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E2): 0.143E2 0.143E2 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (~0.8988465674311579E308, ~0.22250738585072014E~307, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (~0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E2): ~0.103E2 ~0.103E2 (~0.8988465674311579E308, ~0.22250738585072014E~307, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E4): 0.1231E4 0.1231E4 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E2): 0.133E2 0.133E2 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.3141592653589793E1): 0.4141592653589793E1 0.4141592653589793E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.2718281828459045E1): 0.3718281828459045E1 0.3718281828459045E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E1): 0.223E1 0.223E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.123): 0.11229999999999998E1 0.11229999999999998E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, 0.123E~2): 0.10012299999999998E1 0.10012299999999998E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E4): ~0.1229E4 ~0.1229E4 (~0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E2): ~0.113E2 ~0.113E2 (~0.8988465674311579E308, ~0.11125369292536007E~307, ~0.3141592653589793E1): ~0.2141592653589793E1 ~0.2141592653589793E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, ~0.2718281828459045E1): ~0.1718281828459045E1 ~0.1718281828459045E1 (~0.8988465674311579E308, ~0.11125369292536007E~307, ~0.123E~2): 0.9987699999999999 0.9987699999999999 (~0.8988465674311579E308, ~0.5E~323, 0.123E4): 0.123E4 0.123E4 (~0.8988465674311579E308, ~0.5E~323, 0.123E2): 0.123E2 0.123E2 (~0.8988465674311579E308, ~0.5E~323, ~0.123E4): ~0.123E4 ~0.123E4 (~0.8988465674311579E308, ~0.5E~323, ~0.123E2): ~0.123E2 ~0.123E2 (~0.123E4, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.123E4, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.123E4, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.123E4, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.123E4, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.123E4, 0.123E4, 0.123E2): ~0.15128877E7 ~0.15128877E7 (~0.123E4, 0.123E4, 0.3141592653589793E1): ~0.15128968584073463E7 ~0.15128968584073463E7 (~0.123E4, 0.123E4, 0.2718281828459045E1): ~0.15128972817181714E7 ~0.15128972817181714E7 (~0.123E4, 0.123E4, 0.123E1): ~0.151289877E7 ~0.151289877E7 (~0.123E4, 0.123E4, 0.123): ~0.1512899877E7 ~0.1512899877E7 (~0.123E4, 0.123E4, 0.123E~2): ~0.151289999877E7 ~0.151289999877E7 (~0.123E4, 0.123E4, ~0.123E2): ~0.15129123E7 ~0.15129123E7 (~0.123E4, 0.123E4, ~0.3141592653589793E1): ~0.15129031415926537E7 ~0.15129031415926537E7 (~0.123E4, 0.123E4, ~0.2718281828459045E1): ~0.15129027182818286E7 ~0.15129027182818286E7 (~0.123E4, 0.123E4, ~0.123E1): ~0.151290123E7 ~0.151290123E7 (~0.123E4, 0.123E4, ~0.123): ~0.1512900123E7 ~0.1512900123E7 (~0.123E4, 0.123E4, ~0.123E~2): ~0.151290000123E7 ~0.151290000123E7 (~0.123E4, 0.123E2, 0.123E4): ~0.13899E5 ~0.13899E5 (~0.123E4, 0.123E2, 0.123E2): ~0.151167E5 ~0.151167E5 (~0.123E4, 0.123E2, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.15125858407346412E5 (~0.123E4, 0.123E2, 0.2718281828459045E1): ~0.15126281718171542E5 ~0.15126281718171542E5 (~0.123E4, 0.123E2, 0.123E1): ~0.1512777E5 ~0.1512777E5 (~0.123E4, 0.123E2, 0.123): ~0.15128877E5 ~0.15128877E5 (~0.123E4, 0.123E2, 0.123E~2): ~0.1512899877E5 ~0.1512899877E5 (~0.123E4, 0.123E2, 0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.5E~323): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, 0.0): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.123E4): ~0.16359E5 ~0.16359E5 (~0.123E4, 0.123E2, ~0.123E2): ~0.15141300000000001E5 ~0.15141300000000001E5 (~0.123E4, 0.123E2, ~0.3141592653589793E1): ~0.1513214159265359E5 ~0.1513214159265359E5 (~0.123E4, 0.123E2, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.1513171828182846E5 (~0.123E4, 0.123E2, ~0.123E1): ~0.15130230000000001E5 ~0.15130230000000001E5 (~0.123E4, 0.123E2, ~0.123): ~0.15129123000000001E5 ~0.15129123000000001E5 (~0.123E4, 0.123E2, ~0.123E~2): ~0.15129001230000002E5 ~0.15129001230000002E5 (~0.123E4, 0.123E2, ~0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.5E~323): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.123E2, ~0.0): ~0.15129E5 ~0.15129E5 (~0.123E4, 0.3141592653589793E1, 0.123E4): ~0.26341589639154454E4 ~0.26341589639154454E4 (~0.123E4, 0.3141592653589793E1, 0.123E2): ~0.38518589639154457E4 ~0.38518589639154457E4 (~0.123E4, 0.3141592653589793E1, 0.3141592653589793E1): ~0.38610173712618557E4 ~0.38610173712618557E4 (~0.123E4, 0.3141592653589793E1, 0.2718281828459045E1): ~0.38614406820869863E4 ~0.38614406820869863E4 (~0.123E4, 0.3141592653589793E1, 0.123E1): ~0.38629289639154454E4 ~0.38629289639154454E4 (~0.123E4, 0.3141592653589793E1, 0.123): ~0.38640359639154453E4 ~0.38640359639154453E4 (~0.123E4, 0.3141592653589793E1, 0.123E~2): ~0.38641577339154455E4 ~0.38641577339154455E4 (~0.123E4, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, 0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, 0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.123E4): ~0.5094158963915445E4 ~0.5094158963915445E4 (~0.123E4, 0.3141592653589793E1, ~0.123E2): ~0.38764589639154456E4 ~0.38764589639154456E4 (~0.123E4, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.38673005565690355E4 (~0.123E4, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.38668772457439045E4 ~0.38668772457439045E4 (~0.123E4, 0.3141592653589793E1, ~0.123E1): ~0.38653889639154454E4 ~0.38653889639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.123): ~0.38642819639154454E4 ~0.38642819639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154457E4 (~0.123E4, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.3141592653589793E1, ~0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.123E4, 0.2718281828459045E1, 0.123E4): ~0.21134866490046256E4 ~0.21134866490046256E4 (~0.123E4, 0.2718281828459045E1, 0.123E2): ~0.33311866490046255E4 ~0.33311866490046255E4 (~0.123E4, 0.2718281828459045E1, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.33403450563510355E4 (~0.123E4, 0.2718281828459045E1, 0.2718281828459045E1): ~0.33407683671761665E4 ~0.33407683671761665E4 (~0.123E4, 0.2718281828459045E1, 0.123E1): ~0.33422566490046256E4 ~0.33422566490046256E4 (~0.123E4, 0.2718281828459045E1, 0.123): ~0.33433636490046256E4 ~0.33433636490046256E4 (~0.123E4, 0.2718281828459045E1, 0.123E~2): ~0.33434854190046253E4 ~0.33434854190046253E4 (~0.123E4, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, 0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, 0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004625E4 (~0.123E4, 0.2718281828459045E1, ~0.123E2): ~0.33557866490046254E4 ~0.33557866490046254E4 (~0.123E4, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.33466282416582153E4 ~0.33466282416582153E4 (~0.123E4, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330843E4 (~0.123E4, 0.2718281828459045E1, ~0.123E1): ~0.33447166490046257E4 ~0.33447166490046257E4 (~0.123E4, 0.2718281828459045E1, ~0.123): ~0.33436096490046257E4 ~0.33436096490046257E4 (~0.123E4, 0.2718281828459045E1, ~0.123E~2): ~0.33434878790046255E4 ~0.33434878790046255E4 (~0.123E4, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.2718281828459045E1, ~0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.123E4, 0.123E1, 0.123E4): ~0.2829E3 ~0.2829E3 (~0.123E4, 0.123E1, 0.123E2): ~0.15006E4 ~0.15006E4 (~0.123E4, 0.123E1, 0.3141592653589793E1): ~0.15097584073464102E4 ~0.15097584073464102E4 (~0.123E4, 0.123E1, 0.2718281828459045E1): ~0.1510181718171541E4 ~0.1510181718171541E4 (~0.123E4, 0.123E1, 0.123E1): ~0.151167E4 ~0.151167E4 (~0.123E4, 0.123E1, 0.123): ~0.1512777E4 ~0.1512777E4 (~0.123E4, 0.123E1, 0.123E~2): ~0.151289877E4 ~0.151289877E4 (~0.123E4, 0.123E1, 0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.5E~323): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, 0.0): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.123E4): ~0.27429E4 ~0.27429E4 (~0.123E4, 0.123E1, ~0.123E2): ~0.15252E4 ~0.15252E4 (~0.123E4, 0.123E1, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.15160415926535898E4 (~0.123E4, 0.123E1, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.1515618281828459E4 (~0.123E4, 0.123E1, ~0.123E1): ~0.15141299999999999E4 ~0.15141299999999999E4 (~0.123E4, 0.123E1, ~0.123): ~0.1513023E4 ~0.1513023E4 (~0.123E4, 0.123E1, ~0.123E~2): ~0.151290123E4 ~0.151290123E4 (~0.123E4, 0.123E1, ~0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.5E~323): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123E1, ~0.0): ~0.15129E4 ~0.15129E4 (~0.123E4, 0.123, 0.123E4): 0.107871E4 0.107871E4 (~0.123E4, 0.123, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123E4, 0.123, 0.3141592653589793E1): ~0.1481484073464102E3 ~0.1481484073464102E3 (~0.123E4, 0.123, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (~0.123E4, 0.123, 0.123E1): ~0.15006E3 ~0.15006E3 (~0.123E4, 0.123, 0.123): ~0.151167E3 ~0.151167E3 (~0.123E4, 0.123, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (~0.123E4, 0.123, 0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, 0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, 0.5E~323): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, 0.0): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123E4, 0.123, ~0.123E2): ~0.16359E3 ~0.16359E3 (~0.123E4, 0.123, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (~0.123E4, 0.123, ~0.2718281828459045E1): ~0.15400828182845905E3 ~0.15400828182845905E3 (~0.123E4, 0.123, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123E4, 0.123, ~0.123): ~0.151413E3 ~0.151413E3 (~0.123E4, 0.123, ~0.123E~2): ~0.15129122999999998E3 ~0.15129122999999998E3 (~0.123E4, 0.123, ~0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, ~0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, ~0.5E~323): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123, ~0.0): ~0.15129E3 ~0.15129E3 (~0.123E4, 0.123E~2, 0.123E4): 0.12284871E4 0.12284871E4 (~0.123E4, 0.123E~2, 0.123E2): 0.107871E2 0.107871E2 (~0.123E4, 0.123E~2, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (~0.123E4, 0.123E~2, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (~0.123E4, 0.123E~2, 0.123E1): ~0.2829 ~0.2829 (~0.123E4, 0.123E~2, 0.123): ~0.13899E1 ~0.13899E1 (~0.123E4, 0.123E~2, 0.123E~2): ~0.151167E1 ~0.151167E1 (~0.123E4, 0.123E~2, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, 0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, 0.0): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (~0.123E4, 0.123E~2, ~0.123E2): ~0.138129E2 ~0.138129E2 (~0.123E4, 0.123E~2, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (~0.123E4, 0.123E~2, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (~0.123E4, 0.123E~2, ~0.123E1): ~0.27429E1 ~0.27429E1 (~0.123E4, 0.123E~2, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E4, 0.123E~2, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123E4, 0.123E~2, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, ~0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.123E~2, ~0.0): ~0.15129E1 ~0.15129E1 (~0.123E4, 0.22250738585072014E~307, 0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (~0.123E4, 0.22250738585072014E~307, ~0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (~0.123E4, 0.11125369292536007E~307, 0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (~0.123E4, 0.11125369292536007E~307, ~0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (~0.123E4, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.123E4, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.123E4, ~0.17976931348623157E309, 0.123E4): inf inf (~0.123E4, ~0.17976931348623157E309, 0.123E2): inf inf (~0.123E4, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.123E4, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.123E4, ~0.17976931348623157E309, 0.123E1): inf inf (~0.123E4, ~0.17976931348623157E309, 0.123): inf inf (~0.123E4, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.123E4, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.123E4, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.123E4, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.123E4, ~0.17976931348623157E309, 0.0): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.123): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.123E4, ~0.17976931348623157E309, ~0.0): inf inf (~0.123E4, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.123E4, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.123E4, ~0.8988465674311579E308, 0.123E4): inf inf (~0.123E4, ~0.8988465674311579E308, 0.123E2): inf inf (~0.123E4, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.123E4, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.123E4, ~0.8988465674311579E308, 0.123E1): inf inf (~0.123E4, ~0.8988465674311579E308, 0.123): inf inf (~0.123E4, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.123E4, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.123E4, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.123E4, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.123E4, ~0.8988465674311579E308, 0.0): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.17976931348623157E309): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.8988465674311579E308): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.123): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.123E4, ~0.8988465674311579E308, ~0.0): inf inf (~0.123E4, ~0.123E4, 0.123E2): 0.15129123E7 0.15129123E7 (~0.123E4, ~0.123E4, 0.3141592653589793E1): 0.15129031415926537E7 0.15129031415926537E7 (~0.123E4, ~0.123E4, 0.2718281828459045E1): 0.15129027182818286E7 0.15129027182818286E7 (~0.123E4, ~0.123E4, 0.123E1): 0.151290123E7 0.151290123E7 (~0.123E4, ~0.123E4, 0.123): 0.1512900123E7 0.1512900123E7 (~0.123E4, ~0.123E4, 0.123E~2): 0.151290000123E7 0.151290000123E7 (~0.123E4, ~0.123E4, ~0.123E2): 0.15128877E7 0.15128877E7 (~0.123E4, ~0.123E4, ~0.3141592653589793E1): 0.15128968584073463E7 0.15128968584073463E7 (~0.123E4, ~0.123E4, ~0.2718281828459045E1): 0.15128972817181714E7 0.15128972817181714E7 (~0.123E4, ~0.123E4, ~0.123E1): 0.151289877E7 0.151289877E7 (~0.123E4, ~0.123E4, ~0.123): 0.1512899877E7 0.1512899877E7 (~0.123E4, ~0.123E4, ~0.123E~2): 0.151289999877E7 0.151289999877E7 (~0.123E4, ~0.123E2, 0.123E4): 0.16359E5 0.16359E5 (~0.123E4, ~0.123E2, 0.123E2): 0.15141300000000001E5 0.15141300000000001E5 (~0.123E4, ~0.123E2, 0.3141592653589793E1): 0.1513214159265359E5 0.1513214159265359E5 (~0.123E4, ~0.123E2, 0.2718281828459045E1): 0.1513171828182846E5 0.1513171828182846E5 (~0.123E4, ~0.123E2, 0.123E1): 0.15130230000000001E5 0.15130230000000001E5 (~0.123E4, ~0.123E2, 0.123): 0.15129123000000001E5 0.15129123000000001E5 (~0.123E4, ~0.123E2, 0.123E~2): 0.15129001230000002E5 0.15129001230000002E5 (~0.123E4, ~0.123E2, 0.22250738585072014E~307): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.11125369292536007E~307): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.5E~323): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, 0.0): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.123E4): 0.13899E5 0.13899E5 (~0.123E4, ~0.123E2, ~0.123E2): 0.151167E5 0.151167E5 (~0.123E4, ~0.123E2, ~0.3141592653589793E1): 0.15125858407346412E5 0.15125858407346412E5 (~0.123E4, ~0.123E2, ~0.2718281828459045E1): 0.15126281718171542E5 0.15126281718171542E5 (~0.123E4, ~0.123E2, ~0.123E1): 0.1512777E5 0.1512777E5 (~0.123E4, ~0.123E2, ~0.123): 0.15128877E5 0.15128877E5 (~0.123E4, ~0.123E2, ~0.123E~2): 0.1512899877E5 0.1512899877E5 (~0.123E4, ~0.123E2, ~0.22250738585072014E~307): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.11125369292536007E~307): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.5E~323): 0.15129E5 0.15129E5 (~0.123E4, ~0.123E2, ~0.0): 0.15129E5 0.15129E5 (~0.123E4, ~0.3141592653589793E1, 0.123E4): 0.5094158963915445E4 0.5094158963915445E4 (~0.123E4, ~0.3141592653589793E1, 0.123E2): 0.38764589639154456E4 0.38764589639154456E4 (~0.123E4, ~0.3141592653589793E1, 0.3141592653589793E1): 0.38673005565690355E4 0.38673005565690355E4 (~0.123E4, ~0.3141592653589793E1, 0.2718281828459045E1): 0.38668772457439045E4 0.38668772457439045E4 (~0.123E4, ~0.3141592653589793E1, 0.123E1): 0.38653889639154454E4 0.38653889639154454E4 (~0.123E4, ~0.3141592653589793E1, 0.123): 0.38642819639154454E4 0.38642819639154454E4 (~0.123E4, ~0.3141592653589793E1, 0.123E~2): 0.38641601939154457E4 0.38641601939154457E4 (~0.123E4, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, 0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, 0.0): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E4): 0.26341589639154454E4 0.26341589639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E2): 0.38518589639154457E4 0.38518589639154457E4 (~0.123E4, ~0.3141592653589793E1, ~0.3141592653589793E1): 0.38610173712618557E4 0.38610173712618557E4 (~0.123E4, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.38614406820869863E4 0.38614406820869863E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E1): 0.38629289639154454E4 0.38629289639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.123): 0.38640359639154453E4 0.38640359639154453E4 (~0.123E4, ~0.3141592653589793E1, ~0.123E~2): 0.38641577339154455E4 0.38641577339154455E4 (~0.123E4, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.3141592653589793E1, ~0.0): 0.38641589639154454E4 0.38641589639154454E4 (~0.123E4, ~0.2718281828459045E1, 0.123E4): 0.4573486649004625E4 0.4573486649004625E4 (~0.123E4, ~0.2718281828459045E1, 0.123E2): 0.33557866490046254E4 0.33557866490046254E4 (~0.123E4, ~0.2718281828459045E1, 0.3141592653589793E1): 0.33466282416582153E4 0.33466282416582153E4 (~0.123E4, ~0.2718281828459045E1, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330843E4 (~0.123E4, ~0.2718281828459045E1, 0.123E1): 0.33447166490046257E4 0.33447166490046257E4 (~0.123E4, ~0.2718281828459045E1, 0.123): 0.33436096490046257E4 0.33436096490046257E4 (~0.123E4, ~0.2718281828459045E1, 0.123E~2): 0.33434878790046255E4 0.33434878790046255E4 (~0.123E4, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, 0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, 0.0): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E4): 0.21134866490046256E4 0.21134866490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E2): 0.33311866490046255E4 0.33311866490046255E4 (~0.123E4, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.33403450563510355E4 0.33403450563510355E4 (~0.123E4, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.33407683671761665E4 0.33407683671761665E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E1): 0.33422566490046256E4 0.33422566490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.123): 0.33433636490046256E4 0.33433636490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.123E~2): 0.33434854190046253E4 0.33434854190046253E4 (~0.123E4, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.2718281828459045E1, ~0.0): 0.33434866490046256E4 0.33434866490046256E4 (~0.123E4, ~0.123E1, 0.123E4): 0.27429E4 0.27429E4 (~0.123E4, ~0.123E1, 0.123E2): 0.15252E4 0.15252E4 (~0.123E4, ~0.123E1, 0.3141592653589793E1): 0.15160415926535898E4 0.15160415926535898E4 (~0.123E4, ~0.123E1, 0.2718281828459045E1): 0.1515618281828459E4 0.1515618281828459E4 (~0.123E4, ~0.123E1, 0.123E1): 0.15141299999999999E4 0.15141299999999999E4 (~0.123E4, ~0.123E1, 0.123): 0.1513023E4 0.1513023E4 (~0.123E4, ~0.123E1, 0.123E~2): 0.151290123E4 0.151290123E4 (~0.123E4, ~0.123E1, 0.22250738585072014E~307): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.11125369292536007E~307): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.5E~323): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, 0.0): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.123E4): 0.2829E3 0.2829E3 (~0.123E4, ~0.123E1, ~0.123E2): 0.15006E4 0.15006E4 (~0.123E4, ~0.123E1, ~0.3141592653589793E1): 0.15097584073464102E4 0.15097584073464102E4 (~0.123E4, ~0.123E1, ~0.2718281828459045E1): 0.1510181718171541E4 0.1510181718171541E4 (~0.123E4, ~0.123E1, ~0.123E1): 0.151167E4 0.151167E4 (~0.123E4, ~0.123E1, ~0.123): 0.1512777E4 0.1512777E4 (~0.123E4, ~0.123E1, ~0.123E~2): 0.151289877E4 0.151289877E4 (~0.123E4, ~0.123E1, ~0.22250738585072014E~307): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.11125369292536007E~307): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.5E~323): 0.15129E4 0.15129E4 (~0.123E4, ~0.123E1, ~0.0): 0.15129E4 0.15129E4 (~0.123E4, ~0.123, 0.123E4): 0.138129E4 0.138129E4 (~0.123E4, ~0.123, 0.123E2): 0.16359E3 0.16359E3 (~0.123E4, ~0.123, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (~0.123E4, ~0.123, 0.2718281828459045E1): 0.15400828182845905E3 0.15400828182845905E3 (~0.123E4, ~0.123, 0.123E1): 0.15252E3 0.15252E3 (~0.123E4, ~0.123, 0.123): 0.151413E3 0.151413E3 (~0.123E4, ~0.123, 0.123E~2): 0.15129122999999998E3 0.15129122999999998E3 (~0.123E4, ~0.123, 0.22250738585072014E~307): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, 0.11125369292536007E~307): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, 0.5E~323): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, 0.0): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123E4, ~0.123, ~0.123E2): 0.13899E3 0.13899E3 (~0.123E4, ~0.123, ~0.3141592653589793E1): 0.1481484073464102E3 0.1481484073464102E3 (~0.123E4, ~0.123, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (~0.123E4, ~0.123, ~0.123E1): 0.15006E3 0.15006E3 (~0.123E4, ~0.123, ~0.123): 0.151167E3 0.151167E3 (~0.123E4, ~0.123, ~0.123E~2): 0.15128877E3 0.15128877E3 (~0.123E4, ~0.123, ~0.22250738585072014E~307): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, ~0.11125369292536007E~307): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, ~0.5E~323): 0.15129E3 0.15129E3 (~0.123E4, ~0.123, ~0.0): 0.15129E3 0.15129E3 (~0.123E4, ~0.123E~2, 0.123E4): 0.12315129E4 0.12315129E4 (~0.123E4, ~0.123E~2, 0.123E2): 0.138129E2 0.138129E2 (~0.123E4, ~0.123E~2, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (~0.123E4, ~0.123E~2, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (~0.123E4, ~0.123E~2, 0.123E1): 0.27429E1 0.27429E1 (~0.123E4, ~0.123E~2, 0.123): 0.16359E1 0.16359E1 (~0.123E4, ~0.123E~2, 0.123E~2): 0.151413E1 0.151413E1 (~0.123E4, ~0.123E~2, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, 0.5E~323): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, 0.0): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (~0.123E4, ~0.123E~2, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E4, ~0.123E~2, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (~0.123E4, ~0.123E~2, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (~0.123E4, ~0.123E~2, ~0.123E1): 0.2829 0.2829 (~0.123E4, ~0.123E~2, ~0.123): 0.13899E1 0.13899E1 (~0.123E4, ~0.123E~2, ~0.123E~2): 0.151167E1 0.151167E1 (~0.123E4, ~0.123E~2, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, ~0.5E~323): 0.15129E1 0.15129E1 (~0.123E4, ~0.123E~2, ~0.0): 0.15129E1 0.15129E1 (~0.123E4, ~0.22250738585072014E~307, 0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (~0.123E4, ~0.22250738585072014E~307, ~0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (~0.123E4, ~0.11125369292536007E~307, 0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (~0.123E4, ~0.11125369292536007E~307, ~0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (~0.123E2, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.123E2, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.123E2, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.17976931348623157E309): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.123E2, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.123E2, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.123E2, 0.123E4, 0.123E4): ~0.13899E5 ~0.13899E5 (~0.123E2, 0.123E4, 0.123E2): ~0.151167E5 ~0.151167E5 (~0.123E2, 0.123E4, 0.3141592653589793E1): ~0.15125858407346412E5 ~0.15125858407346412E5 (~0.123E2, 0.123E4, 0.2718281828459045E1): ~0.15126281718171542E5 ~0.15126281718171542E5 (~0.123E2, 0.123E4, 0.123E1): ~0.1512777E5 ~0.1512777E5 (~0.123E2, 0.123E4, 0.123): ~0.15128877E5 ~0.15128877E5 (~0.123E2, 0.123E4, 0.123E~2): ~0.1512899877E5 ~0.1512899877E5 (~0.123E2, 0.123E4, 0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.5E~323): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, 0.0): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.123E4): ~0.16359E5 ~0.16359E5 (~0.123E2, 0.123E4, ~0.123E2): ~0.15141300000000001E5 ~0.15141300000000001E5 (~0.123E2, 0.123E4, ~0.3141592653589793E1): ~0.1513214159265359E5 ~0.1513214159265359E5 (~0.123E2, 0.123E4, ~0.2718281828459045E1): ~0.1513171828182846E5 ~0.1513171828182846E5 (~0.123E2, 0.123E4, ~0.123E1): ~0.15130230000000001E5 ~0.15130230000000001E5 (~0.123E2, 0.123E4, ~0.123): ~0.15129123000000001E5 ~0.15129123000000001E5 (~0.123E2, 0.123E4, ~0.123E~2): ~0.15129001230000002E5 ~0.15129001230000002E5 (~0.123E2, 0.123E4, ~0.22250738585072014E~307): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.11125369292536007E~307): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.5E~323): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E4, ~0.0): ~0.15129E5 ~0.15129E5 (~0.123E2, 0.123E2, 0.123E4): 0.107871E4 0.107871E4 (~0.123E2, 0.123E2, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123E2, 0.123E2, 0.3141592653589793E1): ~0.14814840734641024E3 ~0.14814840734641024E3 (~0.123E2, 0.123E2, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (~0.123E2, 0.123E2, 0.123E1): ~0.15006000000000003E3 ~0.15006000000000003E3 (~0.123E2, 0.123E2, 0.123): ~0.15116700000000003E3 ~0.15116700000000003E3 (~0.123E2, 0.123E2, 0.123E~2): ~0.15128877000000003E3 ~0.15128877000000003E3 (~0.123E2, 0.123E2, 0.22250738585072014E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, 0.11125369292536007E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, 0.5E~323): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, 0.0): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123E2, 0.123E2, ~0.123E2): ~0.16359000000000003E3 ~0.16359000000000003E3 (~0.123E2, 0.123E2, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (~0.123E2, 0.123E2, ~0.2718281828459045E1): ~0.15400828182845908E3 ~0.15400828182845908E3 (~0.123E2, 0.123E2, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123E2, 0.123E2, ~0.123): ~0.151413E3 ~0.151413E3 (~0.123E2, 0.123E2, ~0.123E~2): ~0.15129123E3 ~0.15129123E3 (~0.123E2, 0.123E2, ~0.22250738585072014E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, ~0.11125369292536007E~307): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, ~0.5E~323): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.123E2, ~0.0): ~0.15129000000000002E3 ~0.15129000000000002E3 (~0.123E2, 0.3141592653589793E1, 0.123E4): 0.11913584103608455E4 0.11913584103608455E4 (~0.123E2, 0.3141592653589793E1, 0.123E2): ~0.26341589639154456E2 ~0.26341589639154456E2 (~0.123E2, 0.3141592653589793E1, 0.3141592653589793E1): ~0.35499996985564664E2 ~0.35499996985564664E2 (~0.123E2, 0.3141592653589793E1, 0.2718281828459045E1): ~0.3592330781069541E2 ~0.3592330781069541E2 (~0.123E2, 0.3141592653589793E1, 0.123E1): ~0.3741158963915446E2 ~0.3741158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.123): ~0.38518589639154456E2 ~0.38518589639154456E2 (~0.123E2, 0.3141592653589793E1, 0.123E~2): ~0.3864035963915446E2 ~0.3864035963915446E2 (~0.123E2, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, 0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.123E4): ~0.12686415896391545E4 ~0.12686415896391545E4 (~0.123E2, 0.3141592653589793E1, ~0.123E2): ~0.5094158963915446E2 ~0.5094158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274425E2 (~0.123E2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.413598714676135E2 (~0.123E2, 0.3141592653589793E1, ~0.123E1): ~0.3987158963915446E2 ~0.3987158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.123): ~0.3876458963915446E2 ~0.3876458963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.123E~2): ~0.3864281963915446E2 ~0.3864281963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.3141592653589793E1, ~0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.123E2, 0.2718281828459045E1, 0.123E4): 0.11965651335099537E4 0.11965651335099537E4 (~0.123E2, 0.2718281828459045E1, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046257E2 (~0.123E2, 0.2718281828459045E1, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.30293273836456464E2 (~0.123E2, 0.2718281828459045E1, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.30716584661587213E2 (~0.123E2, 0.2718281828459045E1, 0.123E1): ~0.3220486649004626E2 ~0.3220486649004626E2 (~0.123E2, 0.2718281828459045E1, 0.123): ~0.33311866490046256E2 ~0.33311866490046256E2 (~0.123E2, 0.2718281828459045E1, 0.123E~2): ~0.33433636490046254E2 ~0.33433636490046254E2 (~0.123E2, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, 0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, 0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, ~0.123E4): ~0.12634348664900463E4 ~0.12634348664900463E4 (~0.123E2, 0.2718281828459045E1, ~0.123E2): ~0.4573486649004626E2 ~0.4573486649004626E2 (~0.123E2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363605E2 (~0.123E2, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.361531483185053E2 ~0.361531483185053E2 (~0.123E2, 0.2718281828459045E1, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004626E2 (~0.123E2, 0.2718281828459045E1, ~0.123): ~0.3355786649004626E2 ~0.3355786649004626E2 (~0.123E2, 0.2718281828459045E1, ~0.123E~2): ~0.3343609649004625E2 ~0.3343609649004625E2 (~0.123E2, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, ~0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.2718281828459045E1, ~0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.123E2, 0.123E1, 0.123E4): 0.1214871E4 0.1214871E4 (~0.123E2, 0.123E1, 0.123E2): ~0.28289999999999997E1 ~0.28289999999999997E1 (~0.123E2, 0.123E1, 0.3141592653589793E1): ~0.11987407346410208E2 ~0.11987407346410208E2 (~0.123E2, 0.123E1, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540955E2 (~0.123E2, 0.123E1, 0.123E1): ~0.13899000000000001E2 ~0.13899000000000001E2 (~0.123E2, 0.123E1, 0.123): ~0.15006E2 ~0.15006E2 (~0.123E2, 0.123E1, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (~0.123E2, 0.123E1, 0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, 0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, 0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, 0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (~0.123E2, 0.123E1, ~0.123E2): ~0.27429000000000002E2 ~0.27429000000000002E2 (~0.123E2, 0.123E1, ~0.3141592653589793E1): ~0.18270592653589794E2 ~0.18270592653589794E2 (~0.123E2, 0.123E1, ~0.2718281828459045E1): ~0.17847281828459046E2 ~0.17847281828459046E2 (~0.123E2, 0.123E1, ~0.123E1): ~0.16359E2 ~0.16359E2 (~0.123E2, 0.123E1, ~0.123): ~0.15252E2 ~0.15252E2 (~0.123E2, 0.123E1, ~0.123E~2): ~0.15130230000000001E2 ~0.15130230000000001E2 (~0.123E2, 0.123E1, ~0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, ~0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, ~0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123E1, ~0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E2, 0.123, 0.123E4): 0.12284871E4 0.12284871E4 (~0.123E2, 0.123, 0.123E2): 0.107871E2 0.107871E2 (~0.123E2, 0.123, 0.3141592653589793E1): 0.1628692653589793E1 0.1628692653589793E1 (~0.123E2, 0.123, 0.2718281828459045E1): 0.1205381828459045E1 0.1205381828459045E1 (~0.123E2, 0.123, 0.123E1): ~0.2829000000000001 ~0.2829000000000001 (~0.123E2, 0.123, 0.123): ~0.13899000000000001E1 ~0.13899000000000001E1 (~0.123E2, 0.123, 0.123E~2): ~0.151167E1 ~0.151167E1 (~0.123E2, 0.123, 0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, 0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, 0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, 0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (~0.123E2, 0.123, ~0.123E2): ~0.138129E2 ~0.138129E2 (~0.123E2, 0.123, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (~0.123E2, 0.123, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (~0.123E2, 0.123, ~0.123E1): ~0.27429E1 ~0.27429E1 (~0.123E2, 0.123, ~0.123): ~0.16359000000000001E1 ~0.16359000000000001E1 (~0.123E2, 0.123, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123E2, 0.123, ~0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, ~0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, ~0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123, ~0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123E2, 0.123E~2, 0.123E4): 0.1229984871E4 0.1229984871E4 (~0.123E2, 0.123E~2, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123E2, 0.123E~2, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (~0.123E2, 0.123E~2, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (~0.123E2, 0.123E~2, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123E2, 0.123E~2, 0.123): 0.107871 0.107871 (~0.123E2, 0.123E~2, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (~0.123E2, 0.123E~2, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, 0.0): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (~0.123E2, 0.123E~2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123E2, 0.123E~2, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (~0.123E2, 0.123E~2, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (~0.123E2, 0.123E~2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123E2, 0.123E~2, ~0.123): ~0.138129 ~0.138129 (~0.123E2, 0.123E~2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359000000000002E~1 (~0.123E2, 0.123E~2, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.123E~2, ~0.0): ~0.15129E~1 ~0.15129E~1 (~0.123E2, 0.22250738585072014E~307, 0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (~0.123E2, 0.22250738585072014E~307, ~0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (~0.123E2, 0.11125369292536007E~307, 0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (~0.123E2, 0.11125369292536007E~307, ~0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (~0.123E2, 0.5E~323, 0.22250738585072014E~307): 0.22250738585071955E~307 0.22250738585071955E~307 (~0.123E2, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253595E~307 0.1112536929253595E~307 (~0.123E2, 0.5E~323, 0.5E~323): ~0.54E~322 ~0.54E~322 (~0.123E2, 0.5E~323, 0.0): ~0.6E~322 ~0.6E~322 (~0.123E2, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072073E~307 ~0.22250738585072073E~307 (~0.123E2, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536066E~307 ~0.11125369292536066E~307 (~0.123E2, 0.5E~323, ~0.5E~323): ~0.64E~322 ~0.64E~322 (~0.123E2, 0.5E~323, ~0.0): ~0.6E~322 ~0.6E~322 (~0.123E2, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.123E2, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.123E2, ~0.17976931348623157E309, 0.123E4): inf inf (~0.123E2, ~0.17976931348623157E309, 0.123E2): inf inf (~0.123E2, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.123E2, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.123E2, ~0.17976931348623157E309, 0.123E1): inf inf (~0.123E2, ~0.17976931348623157E309, 0.123): inf inf (~0.123E2, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.123E2, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.123E2, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.123E2, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.123E2, ~0.17976931348623157E309, 0.0): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.123): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.123E2, ~0.17976931348623157E309, ~0.0): inf inf (~0.123E2, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.123E2, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.123E2, ~0.8988465674311579E308, 0.123E4): inf inf (~0.123E2, ~0.8988465674311579E308, 0.123E2): inf inf (~0.123E2, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.123E2, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.123E2, ~0.8988465674311579E308, 0.123E1): inf inf (~0.123E2, ~0.8988465674311579E308, 0.123): inf inf (~0.123E2, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.123E2, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.123E2, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.123E2, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.123E2, ~0.8988465674311579E308, 0.0): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.17976931348623157E309): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.8988465674311579E308): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.123): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.123E2, ~0.8988465674311579E308, ~0.0): inf inf (~0.123E2, ~0.123E4, 0.123E4): 0.16359E5 0.16359E5 (~0.123E2, ~0.123E4, 0.123E2): 0.15141300000000001E5 0.15141300000000001E5 (~0.123E2, ~0.123E4, 0.3141592653589793E1): 0.1513214159265359E5 0.1513214159265359E5 (~0.123E2, ~0.123E4, 0.2718281828459045E1): 0.1513171828182846E5 0.1513171828182846E5 (~0.123E2, ~0.123E4, 0.123E1): 0.15130230000000001E5 0.15130230000000001E5 (~0.123E2, ~0.123E4, 0.123): 0.15129123000000001E5 0.15129123000000001E5 (~0.123E2, ~0.123E4, 0.123E~2): 0.15129001230000002E5 0.15129001230000002E5 (~0.123E2, ~0.123E4, 0.22250738585072014E~307): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.11125369292536007E~307): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.5E~323): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, 0.0): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.123E4): 0.13899E5 0.13899E5 (~0.123E2, ~0.123E4, ~0.123E2): 0.151167E5 0.151167E5 (~0.123E2, ~0.123E4, ~0.3141592653589793E1): 0.15125858407346412E5 0.15125858407346412E5 (~0.123E2, ~0.123E4, ~0.2718281828459045E1): 0.15126281718171542E5 0.15126281718171542E5 (~0.123E2, ~0.123E4, ~0.123E1): 0.1512777E5 0.1512777E5 (~0.123E2, ~0.123E4, ~0.123): 0.15128877E5 0.15128877E5 (~0.123E2, ~0.123E4, ~0.123E~2): 0.1512899877E5 0.1512899877E5 (~0.123E2, ~0.123E4, ~0.22250738585072014E~307): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.11125369292536007E~307): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.5E~323): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E4, ~0.0): 0.15129E5 0.15129E5 (~0.123E2, ~0.123E2, 0.123E4): 0.138129E4 0.138129E4 (~0.123E2, ~0.123E2, 0.123E2): 0.16359000000000003E3 0.16359000000000003E3 (~0.123E2, ~0.123E2, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (~0.123E2, ~0.123E2, 0.2718281828459045E1): 0.15400828182845908E3 0.15400828182845908E3 (~0.123E2, ~0.123E2, 0.123E1): 0.15252E3 0.15252E3 (~0.123E2, ~0.123E2, 0.123): 0.151413E3 0.151413E3 (~0.123E2, ~0.123E2, 0.123E~2): 0.15129123E3 0.15129123E3 (~0.123E2, ~0.123E2, 0.22250738585072014E~307): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, 0.11125369292536007E~307): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, 0.5E~323): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, 0.0): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123E2, ~0.123E2, ~0.123E2): 0.13899E3 0.13899E3 (~0.123E2, ~0.123E2, ~0.3141592653589793E1): 0.14814840734641024E3 0.14814840734641024E3 (~0.123E2, ~0.123E2, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (~0.123E2, ~0.123E2, ~0.123E1): 0.15006000000000003E3 0.15006000000000003E3 (~0.123E2, ~0.123E2, ~0.123): 0.15116700000000003E3 0.15116700000000003E3 (~0.123E2, ~0.123E2, ~0.123E~2): 0.15128877000000003E3 0.15128877000000003E3 (~0.123E2, ~0.123E2, ~0.22250738585072014E~307): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, ~0.11125369292536007E~307): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, ~0.5E~323): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.123E2, ~0.0): 0.15129000000000002E3 0.15129000000000002E3 (~0.123E2, ~0.3141592653589793E1, 0.123E4): 0.12686415896391545E4 0.12686415896391545E4 (~0.123E2, ~0.3141592653589793E1, 0.123E2): 0.5094158963915446E2 0.5094158963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274425E2 (~0.123E2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.413598714676135E2 0.413598714676135E2 (~0.123E2, ~0.3141592653589793E1, 0.123E1): 0.3987158963915446E2 0.3987158963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.123): 0.3876458963915446E2 0.3876458963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.123E~2): 0.3864281963915446E2 0.3864281963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, 0.0): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E4): ~0.11913584103608455E4 ~0.11913584103608455E4 (~0.123E2, ~0.3141592653589793E1, ~0.123E2): 0.26341589639154456E2 0.26341589639154456E2 (~0.123E2, ~0.3141592653589793E1, ~0.3141592653589793E1): 0.35499996985564664E2 0.35499996985564664E2 (~0.123E2, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.3592330781069541E2 0.3592330781069541E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E1): 0.3741158963915446E2 0.3741158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.123): 0.38518589639154456E2 0.38518589639154456E2 (~0.123E2, ~0.3141592653589793E1, ~0.123E~2): 0.3864035963915446E2 0.3864035963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.3141592653589793E1, ~0.0): 0.3864158963915446E2 0.3864158963915446E2 (~0.123E2, ~0.2718281828459045E1, 0.123E4): 0.12634348664900463E4 0.12634348664900463E4 (~0.123E2, ~0.2718281828459045E1, 0.123E2): 0.4573486649004626E2 0.4573486649004626E2 (~0.123E2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363605E2 (~0.123E2, ~0.2718281828459045E1, 0.2718281828459045E1): 0.361531483185053E2 0.361531483185053E2 (~0.123E2, ~0.2718281828459045E1, 0.123E1): 0.3466486649004626E2 0.3466486649004626E2 (~0.123E2, ~0.2718281828459045E1, 0.123): 0.3355786649004626E2 0.3355786649004626E2 (~0.123E2, ~0.2718281828459045E1, 0.123E~2): 0.3343609649004625E2 0.3343609649004625E2 (~0.123E2, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, 0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, 0.0): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E4): ~0.11965651335099537E4 ~0.11965651335099537E4 (~0.123E2, ~0.2718281828459045E1, ~0.123E2): 0.21134866490046257E2 0.21134866490046257E2 (~0.123E2, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.30293273836456464E2 0.30293273836456464E2 (~0.123E2, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.30716584661587213E2 0.30716584661587213E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E1): 0.3220486649004626E2 0.3220486649004626E2 (~0.123E2, ~0.2718281828459045E1, ~0.123): 0.33311866490046256E2 0.33311866490046256E2 (~0.123E2, ~0.2718281828459045E1, ~0.123E~2): 0.33433636490046254E2 0.33433636490046254E2 (~0.123E2, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, ~0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.2718281828459045E1, ~0.0): 0.33434866490046254E2 0.33434866490046254E2 (~0.123E2, ~0.123E1, 0.123E4): 0.1245129E4 0.1245129E4 (~0.123E2, ~0.123E1, 0.123E2): 0.27429000000000002E2 0.27429000000000002E2 (~0.123E2, ~0.123E1, 0.3141592653589793E1): 0.18270592653589794E2 0.18270592653589794E2 (~0.123E2, ~0.123E1, 0.2718281828459045E1): 0.17847281828459046E2 0.17847281828459046E2 (~0.123E2, ~0.123E1, 0.123E1): 0.16359E2 0.16359E2 (~0.123E2, ~0.123E1, 0.123): 0.15252E2 0.15252E2 (~0.123E2, ~0.123E1, 0.123E~2): 0.15130230000000001E2 0.15130230000000001E2 (~0.123E2, ~0.123E1, 0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, 0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, 0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, 0.0): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (~0.123E2, ~0.123E1, ~0.123E2): 0.28289999999999997E1 0.28289999999999997E1 (~0.123E2, ~0.123E1, ~0.3141592653589793E1): 0.11987407346410208E2 0.11987407346410208E2 (~0.123E2, ~0.123E1, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540955E2 (~0.123E2, ~0.123E1, ~0.123E1): 0.13899000000000001E2 0.13899000000000001E2 (~0.123E2, ~0.123E1, ~0.123): 0.15006E2 0.15006E2 (~0.123E2, ~0.123E1, ~0.123E~2): 0.1512777E2 0.1512777E2 (~0.123E2, ~0.123E1, ~0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, ~0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, ~0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123E1, ~0.0): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E2, ~0.123, 0.123E4): 0.12315129E4 0.12315129E4 (~0.123E2, ~0.123, 0.123E2): 0.138129E2 0.138129E2 (~0.123E2, ~0.123, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (~0.123E2, ~0.123, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (~0.123E2, ~0.123, 0.123E1): 0.27429E1 0.27429E1 (~0.123E2, ~0.123, 0.123): 0.16359000000000001E1 0.16359000000000001E1 (~0.123E2, ~0.123, 0.123E~2): 0.151413E1 0.151413E1 (~0.123E2, ~0.123, 0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, 0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, 0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, 0.0): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (~0.123E2, ~0.123, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E2, ~0.123, ~0.3141592653589793E1): ~0.1628692653589793E1 ~0.1628692653589793E1 (~0.123E2, ~0.123, ~0.2718281828459045E1): ~0.1205381828459045E1 ~0.1205381828459045E1 (~0.123E2, ~0.123, ~0.123E1): 0.2829000000000001 0.2829000000000001 (~0.123E2, ~0.123, ~0.123): 0.13899000000000001E1 0.13899000000000001E1 (~0.123E2, ~0.123, ~0.123E~2): 0.151167E1 0.151167E1 (~0.123E2, ~0.123, ~0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, ~0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, ~0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123, ~0.0): 0.15129000000000001E1 0.15129000000000001E1 (~0.123E2, ~0.123E~2, 0.123E4): 0.1230015129E4 0.1230015129E4 (~0.123E2, ~0.123E~2, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123E2, ~0.123E~2, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (~0.123E2, ~0.123E~2, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (~0.123E2, ~0.123E~2, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123E2, ~0.123E~2, 0.123): 0.138129 0.138129 (~0.123E2, ~0.123E~2, 0.123E~2): 0.16359000000000002E~1 0.16359000000000002E~1 (~0.123E2, ~0.123E~2, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, 0.5E~323): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, 0.0): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (~0.123E2, ~0.123E~2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123E2, ~0.123E~2, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (~0.123E2, ~0.123E~2, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (~0.123E2, ~0.123E~2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123E2, ~0.123E~2, ~0.123): ~0.107871 ~0.107871 (~0.123E2, ~0.123E~2, ~0.123E~2): 0.13899E~1 0.13899E~1 (~0.123E2, ~0.123E~2, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, ~0.5E~323): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.123E~2, ~0.0): 0.15129E~1 0.15129E~1 (~0.123E2, ~0.22250738585072014E~307, 0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (~0.123E2, ~0.22250738585072014E~307, ~0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (~0.123E2, ~0.11125369292536007E~307, 0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (~0.123E2, ~0.11125369292536007E~307, ~0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (~0.123E2, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072073E~307 0.22250738585072073E~307 (~0.123E2, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536066E~307 0.11125369292536066E~307 (~0.123E2, ~0.5E~323, 0.5E~323): 0.64E~322 0.64E~322 (~0.123E2, ~0.5E~323, 0.0): 0.6E~322 0.6E~322 (~0.123E2, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585071955E~307 ~0.22250738585071955E~307 (~0.123E2, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253595E~307 ~0.1112536929253595E~307 (~0.123E2, ~0.5E~323, ~0.5E~323): 0.54E~322 0.54E~322 (~0.123E2, ~0.5E~323, ~0.0): 0.6E~322 0.6E~322 (~0.3141592653589793E1, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.3141592653589793E1, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.10261166380838123E309 ~0.10261166380838123E309 (~0.3141592653589793E1, 0.8988465674311579E308, 0.8988465674311579E308): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.3141592653589793E1, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.3141592653589793E1, 0.123E4, 0.123E4): ~0.26341589639154454E4 ~0.26341589639154454E4 (~0.3141592653589793E1, 0.123E4, 0.123E2): ~0.38518589639154457E4 ~0.38518589639154457E4 (~0.3141592653589793E1, 0.123E4, 0.3141592653589793E1): ~0.38610173712618557E4 ~0.38610173712618557E4 (~0.3141592653589793E1, 0.123E4, 0.2718281828459045E1): ~0.38614406820869863E4 ~0.38614406820869863E4 (~0.3141592653589793E1, 0.123E4, 0.123E1): ~0.38629289639154454E4 ~0.38629289639154454E4 (~0.3141592653589793E1, 0.123E4, 0.123): ~0.38640359639154453E4 ~0.38640359639154453E4 (~0.3141592653589793E1, 0.123E4, 0.123E~2): ~0.38641577339154455E4 ~0.38641577339154455E4 (~0.3141592653589793E1, 0.123E4, 0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, 0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, 0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, 0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.123E4): ~0.5094158963915445E4 ~0.5094158963915445E4 (~0.3141592653589793E1, 0.123E4, ~0.123E2): ~0.38764589639154456E4 ~0.38764589639154456E4 (~0.3141592653589793E1, 0.123E4, ~0.3141592653589793E1): ~0.38673005565690355E4 ~0.38673005565690355E4 (~0.3141592653589793E1, 0.123E4, ~0.2718281828459045E1): ~0.38668772457439045E4 ~0.38668772457439045E4 (~0.3141592653589793E1, 0.123E4, ~0.123E1): ~0.38653889639154454E4 ~0.38653889639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.123): ~0.38642819639154454E4 ~0.38642819639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.123E~2): ~0.38641601939154457E4 ~0.38641601939154457E4 (~0.3141592653589793E1, 0.123E4, ~0.22250738585072014E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.11125369292536007E~307): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.5E~323): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E4, ~0.0): ~0.38641589639154454E4 ~0.38641589639154454E4 (~0.3141592653589793E1, 0.123E2, 0.123E4): 0.11913584103608455E4 0.11913584103608455E4 (~0.3141592653589793E1, 0.123E2, 0.123E2): ~0.26341589639154456E2 ~0.26341589639154456E2 (~0.3141592653589793E1, 0.123E2, 0.3141592653589793E1): ~0.35499996985564664E2 ~0.35499996985564664E2 (~0.3141592653589793E1, 0.123E2, 0.2718281828459045E1): ~0.3592330781069541E2 ~0.3592330781069541E2 (~0.3141592653589793E1, 0.123E2, 0.123E1): ~0.3741158963915446E2 ~0.3741158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.123): ~0.38518589639154456E2 ~0.38518589639154456E2 (~0.3141592653589793E1, 0.123E2, 0.123E~2): ~0.3864035963915446E2 ~0.3864035963915446E2 (~0.3141592653589793E1, 0.123E2, 0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, 0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.123E4): ~0.12686415896391545E4 ~0.12686415896391545E4 (~0.3141592653589793E1, 0.123E2, ~0.123E2): ~0.5094158963915446E2 ~0.5094158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.3141592653589793E1): ~0.4178318229274425E2 ~0.4178318229274425E2 (~0.3141592653589793E1, 0.123E2, ~0.2718281828459045E1): ~0.413598714676135E2 ~0.413598714676135E2 (~0.3141592653589793E1, 0.123E2, ~0.123E1): ~0.3987158963915446E2 ~0.3987158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.123): ~0.3876458963915446E2 ~0.3876458963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.123E~2): ~0.3864281963915446E2 ~0.3864281963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.22250738585072014E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.11125369292536007E~307): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.5E~323): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.123E2, ~0.0): ~0.3864158963915446E2 ~0.3864158963915446E2 (~0.3141592653589793E1, 0.3141592653589793E1, 0.123E4): 0.12201303955989106E4 0.12201303955989106E4 (~0.3141592653589793E1, 0.3141592653589793E1, 0.123E2): 0.24303955989106427E1 0.24303955989106427E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.3141592653589793E1): ~0.6728011747499565E1 ~0.6728011747499565E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.71513225726303125E1 ~0.71513225726303125E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.123E1): ~0.8639604401089358E1 ~0.8639604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.123): ~0.9746604401089359E1 ~0.9746604401089359E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.123E~2): ~0.9868374401089358E1 ~0.9868374401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.5E~323): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, 0.0): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.123E4): ~0.12398696044010894E4 ~0.12398696044010894E4 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.123E2): ~0.2216960440108936E2 ~0.2216960440108936E2 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.13011197054679151E2 ~0.13011197054679151E2 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.12587886229548403E2 ~0.12587886229548403E2 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.123E1): ~0.11099604401089358E2 ~0.11099604401089358E2 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.123): ~0.9992604401089357E1 ~0.9992604401089357E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.123E~2): ~0.9870834401089358E1 ~0.9870834401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.5E~323): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.3141592653589793E1, ~0.0): ~0.9869604401089358E1 ~0.9869604401089358E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E4): 0.12214602657773264E4 0.12214602657773264E4 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E2): 0.37602657773264343E1 0.37602657773264343E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.5398141569083773E1 ~0.5398141569083773E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.5821452394214521E1 ~0.5821452394214521E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E1): ~0.7309734222673566E1 ~0.7309734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123): ~0.8416734222673567E1 ~0.8416734222673567E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.123E~2): ~0.8538504222673566E1 ~0.8538504222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, 0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123E4): ~0.12385397342226736E4 ~0.12385397342226736E4 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123E2): ~0.20839734222673567E2 ~0.20839734222673567E2 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.11681326876263359E2 ~0.11681326876263359E2 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.1125801605113261E2 ~0.1125801605113261E2 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123E1): ~0.9769734222673566E1 ~0.9769734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673567E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.123E~2): ~0.8540964222673566E1 ~0.8540964222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.2718281828459045E1, ~0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.3141592653589793E1, 0.123E1, 0.123E4): 0.12261358410360845E4 0.12261358410360845E4 (~0.3141592653589793E1, 0.123E1, 0.123E2): 0.8435841036084556E1 0.8435841036084556E1 (~0.3141592653589793E1, 0.123E1, 0.3141592653589793E1): ~0.7225663103256523 ~0.7225663103256523 (~0.3141592653589793E1, 0.123E1, 0.2718281828459045E1): ~0.11458771354564004E1 ~0.11458771354564004E1 (~0.3141592653589793E1, 0.123E1, 0.123E1): ~0.26341589639154455E1 ~0.26341589639154455E1 (~0.3141592653589793E1, 0.123E1, 0.123): ~0.37411589639154457E1 ~0.37411589639154457E1 (~0.3141592653589793E1, 0.123E1, 0.123E~2): ~0.38629289639154454E1 ~0.38629289639154454E1 (~0.3141592653589793E1, 0.123E1, 0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, 0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, 0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, 0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, ~0.123E4): ~0.12338641589639155E4 ~0.12338641589639155E4 (~0.3141592653589793E1, 0.123E1, ~0.123E2): ~0.16164158963915447E2 ~0.16164158963915447E2 (~0.3141592653589793E1, 0.123E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505239E1 (~0.3141592653589793E1, 0.123E1, ~0.2718281828459045E1): ~0.65824407923744905E1 ~0.65824407923744905E1 (~0.3141592653589793E1, 0.123E1, ~0.123E1): ~0.5094158963915445E1 ~0.5094158963915445E1 (~0.3141592653589793E1, 0.123E1, ~0.123): ~0.39871589639154457E1 ~0.39871589639154457E1 (~0.3141592653589793E1, 0.123E1, ~0.123E~2): ~0.38653889639154455E1 ~0.38653889639154455E1 (~0.3141592653589793E1, 0.123E1, ~0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, ~0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, ~0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123E1, ~0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.3141592653589793E1, 0.123, 0.123E4): 0.12296135841036084E4 0.12296135841036084E4 (~0.3141592653589793E1, 0.123, 0.123E2): 0.11913584103608455E2 0.11913584103608455E2 (~0.3141592653589793E1, 0.123, 0.3141592653589793E1): 0.27551767571982486E1 0.27551767571982486E1 (~0.3141592653589793E1, 0.123, 0.2718281828459045E1): 0.23318659320675006E1 0.23318659320675006E1 (~0.3141592653589793E1, 0.123, 0.123E1): 0.8435841036084555 0.8435841036084555 (~0.3141592653589793E1, 0.123, 0.123): ~0.26341589639154456 ~0.26341589639154456 (~0.3141592653589793E1, 0.123, 0.123E~2): ~0.38518589639154455 ~0.38518589639154455 (~0.3141592653589793E1, 0.123, 0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, 0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, 0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, 0.0): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, ~0.123E4): ~0.12303864158963916E4 ~0.12303864158963916E4 (~0.3141592653589793E1, 0.123, ~0.123E2): ~0.12686415896391546E2 ~0.12686415896391546E2 (~0.3141592653589793E1, 0.123, ~0.3141592653589793E1): ~0.35280085499813376E1 ~0.35280085499813376E1 (~0.3141592653589793E1, 0.123, ~0.2718281828459045E1): ~0.31046977248505896E1 ~0.31046977248505896E1 (~0.3141592653589793E1, 0.123, ~0.123E1): ~0.16164158963915445E1 ~0.16164158963915445E1 (~0.3141592653589793E1, 0.123, ~0.123): ~0.5094158963915445 ~0.5094158963915445 (~0.3141592653589793E1, 0.123, ~0.123E~2): ~0.38764589639154456 ~0.38764589639154456 (~0.3141592653589793E1, 0.123, ~0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, ~0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, ~0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123, ~0.0): ~0.38641589639154456 ~0.38641589639154456 (~0.3141592653589793E1, 0.123E~2, 0.123E4): 0.1229996135841036E4 0.1229996135841036E4 (~0.3141592653589793E1, 0.123E~2, 0.123E2): 0.12296135841036085E2 0.12296135841036085E2 (~0.3141592653589793E1, 0.123E~2, 0.3141592653589793E1): 0.31377284946258777E1 0.31377284946258777E1 (~0.3141592653589793E1, 0.123E~2, 0.2718281828459045E1): 0.27144176694951296E1 0.27144176694951296E1 (~0.3141592653589793E1, 0.123E~2, 0.123E1): 0.12261358410360845E1 0.12261358410360845E1 (~0.3141592653589793E1, 0.123E~2, 0.123): 0.11913584103608456 0.11913584103608456 (~0.3141592653589793E1, 0.123E~2, 0.123E~2): ~0.26341589639154455E~2 ~0.26341589639154455E~2 (~0.3141592653589793E1, 0.123E~2, 0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, 0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, 0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, 0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, ~0.123E4): ~0.1230003864158964E4 ~0.1230003864158964E4 (~0.3141592653589793E1, 0.123E~2, ~0.123E2): ~0.12303864158963917E2 ~0.12303864158963917E2 (~0.3141592653589793E1, 0.123E~2, ~0.3141592653589793E1): ~0.31454568125537086E1 ~0.31454568125537086E1 (~0.3141592653589793E1, 0.123E~2, ~0.2718281828459045E1): ~0.27221459874229605E1 ~0.27221459874229605E1 (~0.3141592653589793E1, 0.123E~2, ~0.123E1): ~0.12338641589639154E1 ~0.12338641589639154E1 (~0.3141592653589793E1, 0.123E~2, ~0.123): ~0.12686415896391545 ~0.12686415896391545 (~0.3141592653589793E1, 0.123E~2, ~0.123E~2): ~0.5094158963915445E~2 ~0.5094158963915445E~2 (~0.3141592653589793E1, 0.123E~2, ~0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, ~0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, ~0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.123E~2, ~0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.3141592653589793E1, 0.22250738585072014E~307, 0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (~0.3141592653589793E1, 0.22250738585072014E~307, ~0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (~0.3141592653589793E1, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (~0.3141592653589793E1, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (~0.3141592653589793E1, 0.5E~323, 0.5E~323): ~0.1E~322 ~0.1E~322 (~0.3141592653589793E1, 0.5E~323, 0.0): ~0.15E~322 ~0.15E~322 (~0.3141592653589793E1, 0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (~0.3141592653589793E1, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (~0.3141592653589793E1, 0.5E~323, ~0.5E~323): ~0.2E~322 ~0.2E~322 (~0.3141592653589793E1, 0.5E~323, ~0.0): ~0.15E~322 ~0.15E~322 (~0.3141592653589793E1, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.123E4): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.123E2): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.123E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.123): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, 0.0): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.123): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.3141592653589793E1, ~0.17976931348623157E309, ~0.0): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.123E4): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.123E2): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.123E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.123): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, 0.0): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.10261166380838123E309 0.10261166380838123E309 (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.8988465674311579E308): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.123): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.3141592653589793E1, ~0.8988465674311579E308, ~0.0): inf inf (~0.3141592653589793E1, ~0.123E4, 0.123E4): 0.5094158963915445E4 0.5094158963915445E4 (~0.3141592653589793E1, ~0.123E4, 0.123E2): 0.38764589639154456E4 0.38764589639154456E4 (~0.3141592653589793E1, ~0.123E4, 0.3141592653589793E1): 0.38673005565690355E4 0.38673005565690355E4 (~0.3141592653589793E1, ~0.123E4, 0.2718281828459045E1): 0.38668772457439045E4 0.38668772457439045E4 (~0.3141592653589793E1, ~0.123E4, 0.123E1): 0.38653889639154454E4 0.38653889639154454E4 (~0.3141592653589793E1, ~0.123E4, 0.123): 0.38642819639154454E4 0.38642819639154454E4 (~0.3141592653589793E1, ~0.123E4, 0.123E~2): 0.38641601939154457E4 0.38641601939154457E4 (~0.3141592653589793E1, ~0.123E4, 0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, 0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, 0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, 0.0): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E4): 0.26341589639154454E4 0.26341589639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E2): 0.38518589639154457E4 0.38518589639154457E4 (~0.3141592653589793E1, ~0.123E4, ~0.3141592653589793E1): 0.38610173712618557E4 0.38610173712618557E4 (~0.3141592653589793E1, ~0.123E4, ~0.2718281828459045E1): 0.38614406820869863E4 0.38614406820869863E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E1): 0.38629289639154454E4 0.38629289639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.123): 0.38640359639154453E4 0.38640359639154453E4 (~0.3141592653589793E1, ~0.123E4, ~0.123E~2): 0.38641577339154455E4 0.38641577339154455E4 (~0.3141592653589793E1, ~0.123E4, ~0.22250738585072014E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.11125369292536007E~307): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.5E~323): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E4, ~0.0): 0.38641589639154454E4 0.38641589639154454E4 (~0.3141592653589793E1, ~0.123E2, 0.123E4): 0.12686415896391545E4 0.12686415896391545E4 (~0.3141592653589793E1, ~0.123E2, 0.123E2): 0.5094158963915446E2 0.5094158963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.3141592653589793E1): 0.4178318229274425E2 0.4178318229274425E2 (~0.3141592653589793E1, ~0.123E2, 0.2718281828459045E1): 0.413598714676135E2 0.413598714676135E2 (~0.3141592653589793E1, ~0.123E2, 0.123E1): 0.3987158963915446E2 0.3987158963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.123): 0.3876458963915446E2 0.3876458963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.123E~2): 0.3864281963915446E2 0.3864281963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, 0.0): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E4): ~0.11913584103608455E4 ~0.11913584103608455E4 (~0.3141592653589793E1, ~0.123E2, ~0.123E2): 0.26341589639154456E2 0.26341589639154456E2 (~0.3141592653589793E1, ~0.123E2, ~0.3141592653589793E1): 0.35499996985564664E2 0.35499996985564664E2 (~0.3141592653589793E1, ~0.123E2, ~0.2718281828459045E1): 0.3592330781069541E2 0.3592330781069541E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E1): 0.3741158963915446E2 0.3741158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.123): 0.38518589639154456E2 0.38518589639154456E2 (~0.3141592653589793E1, ~0.123E2, ~0.123E~2): 0.3864035963915446E2 0.3864035963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.22250738585072014E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.11125369292536007E~307): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.5E~323): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.123E2, ~0.0): 0.3864158963915446E2 0.3864158963915446E2 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.123E4): 0.12398696044010894E4 0.12398696044010894E4 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.123E2): 0.2216960440108936E2 0.2216960440108936E2 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.13011197054679151E2 0.13011197054679151E2 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.2718281828459045E1): 0.12587886229548403E2 0.12587886229548403E2 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.123E1): 0.11099604401089358E2 0.11099604401089358E2 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.123): 0.9992604401089357E1 0.9992604401089357E1 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.123E~2): 0.9870834401089358E1 0.9870834401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.5E~323): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, 0.0): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E4): ~0.12201303955989106E4 ~0.12201303955989106E4 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E2): ~0.24303955989106427E1 ~0.24303955989106427E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.3141592653589793E1): 0.6728011747499565E1 0.6728011747499565E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.71513225726303125E1 0.71513225726303125E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E1): 0.8639604401089358E1 0.8639604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.123): 0.9746604401089359E1 0.9746604401089359E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.123E~2): 0.9868374401089358E1 0.9868374401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.5E~323): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.3141592653589793E1, ~0.0): 0.9869604401089358E1 0.9869604401089358E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123E4): 0.12385397342226736E4 0.12385397342226736E4 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123E2): 0.20839734222673567E2 0.20839734222673567E2 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.3141592653589793E1): 0.11681326876263359E2 0.11681326876263359E2 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.1125801605113261E2 0.1125801605113261E2 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123E1): 0.9769734222673566E1 0.9769734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123): 0.8662734222673567E1 0.8662734222673567E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.123E~2): 0.8540964222673566E1 0.8540964222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, 0.0): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E4): ~0.12214602657773264E4 ~0.12214602657773264E4 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264343E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.5398141569083773E1 0.5398141569083773E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.5821452394214521E1 0.5821452394214521E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E1): 0.7309734222673566E1 0.7309734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123): 0.8416734222673567E1 0.8416734222673567E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.123E~2): 0.8538504222673566E1 0.8538504222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.2718281828459045E1, ~0.0): 0.8539734222673566E1 0.8539734222673566E1 (~0.3141592653589793E1, ~0.123E1, 0.123E4): 0.12338641589639155E4 0.12338641589639155E4 (~0.3141592653589793E1, ~0.123E1, 0.123E2): 0.16164158963915447E2 0.16164158963915447E2 (~0.3141592653589793E1, ~0.123E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505239E1 (~0.3141592653589793E1, ~0.123E1, 0.2718281828459045E1): 0.65824407923744905E1 0.65824407923744905E1 (~0.3141592653589793E1, ~0.123E1, 0.123E1): 0.5094158963915445E1 0.5094158963915445E1 (~0.3141592653589793E1, ~0.123E1, 0.123): 0.39871589639154457E1 0.39871589639154457E1 (~0.3141592653589793E1, ~0.123E1, 0.123E~2): 0.38653889639154455E1 0.38653889639154455E1 (~0.3141592653589793E1, ~0.123E1, 0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, 0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, 0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, 0.0): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, ~0.123E4): ~0.12261358410360845E4 ~0.12261358410360845E4 (~0.3141592653589793E1, ~0.123E1, ~0.123E2): ~0.8435841036084556E1 ~0.8435841036084556E1 (~0.3141592653589793E1, ~0.123E1, ~0.3141592653589793E1): 0.7225663103256523 0.7225663103256523 (~0.3141592653589793E1, ~0.123E1, ~0.2718281828459045E1): 0.11458771354564004E1 0.11458771354564004E1 (~0.3141592653589793E1, ~0.123E1, ~0.123E1): 0.26341589639154455E1 0.26341589639154455E1 (~0.3141592653589793E1, ~0.123E1, ~0.123): 0.37411589639154457E1 0.37411589639154457E1 (~0.3141592653589793E1, ~0.123E1, ~0.123E~2): 0.38629289639154454E1 0.38629289639154454E1 (~0.3141592653589793E1, ~0.123E1, ~0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, ~0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, ~0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123E1, ~0.0): 0.38641589639154454E1 0.38641589639154454E1 (~0.3141592653589793E1, ~0.123, 0.123E4): 0.12303864158963916E4 0.12303864158963916E4 (~0.3141592653589793E1, ~0.123, 0.123E2): 0.12686415896391546E2 0.12686415896391546E2 (~0.3141592653589793E1, ~0.123, 0.3141592653589793E1): 0.35280085499813376E1 0.35280085499813376E1 (~0.3141592653589793E1, ~0.123, 0.2718281828459045E1): 0.31046977248505896E1 0.31046977248505896E1 (~0.3141592653589793E1, ~0.123, 0.123E1): 0.16164158963915445E1 0.16164158963915445E1 (~0.3141592653589793E1, ~0.123, 0.123): 0.5094158963915445 0.5094158963915445 (~0.3141592653589793E1, ~0.123, 0.123E~2): 0.38764589639154456 0.38764589639154456 (~0.3141592653589793E1, ~0.123, 0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, 0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, 0.5E~323): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, 0.0): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, ~0.123E4): ~0.12296135841036084E4 ~0.12296135841036084E4 (~0.3141592653589793E1, ~0.123, ~0.123E2): ~0.11913584103608455E2 ~0.11913584103608455E2 (~0.3141592653589793E1, ~0.123, ~0.3141592653589793E1): ~0.27551767571982486E1 ~0.27551767571982486E1 (~0.3141592653589793E1, ~0.123, ~0.2718281828459045E1): ~0.23318659320675006E1 ~0.23318659320675006E1 (~0.3141592653589793E1, ~0.123, ~0.123E1): ~0.8435841036084555 ~0.8435841036084555 (~0.3141592653589793E1, ~0.123, ~0.123): 0.26341589639154456 0.26341589639154456 (~0.3141592653589793E1, ~0.123, ~0.123E~2): 0.38518589639154455 0.38518589639154455 (~0.3141592653589793E1, ~0.123, ~0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, ~0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, ~0.5E~323): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123, ~0.0): 0.38641589639154456 0.38641589639154456 (~0.3141592653589793E1, ~0.123E~2, 0.123E4): 0.1230003864158964E4 0.1230003864158964E4 (~0.3141592653589793E1, ~0.123E~2, 0.123E2): 0.12303864158963917E2 0.12303864158963917E2 (~0.3141592653589793E1, ~0.123E~2, 0.3141592653589793E1): 0.31454568125537086E1 0.31454568125537086E1 (~0.3141592653589793E1, ~0.123E~2, 0.2718281828459045E1): 0.27221459874229605E1 0.27221459874229605E1 (~0.3141592653589793E1, ~0.123E~2, 0.123E1): 0.12338641589639154E1 0.12338641589639154E1 (~0.3141592653589793E1, ~0.123E~2, 0.123): 0.12686415896391545 0.12686415896391545 (~0.3141592653589793E1, ~0.123E~2, 0.123E~2): 0.5094158963915445E~2 0.5094158963915445E~2 (~0.3141592653589793E1, ~0.123E~2, 0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, 0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, 0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, 0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, ~0.123E4): ~0.1229996135841036E4 ~0.1229996135841036E4 (~0.3141592653589793E1, ~0.123E~2, ~0.123E2): ~0.12296135841036085E2 ~0.12296135841036085E2 (~0.3141592653589793E1, ~0.123E~2, ~0.3141592653589793E1): ~0.31377284946258777E1 ~0.31377284946258777E1 (~0.3141592653589793E1, ~0.123E~2, ~0.2718281828459045E1): ~0.27144176694951296E1 ~0.27144176694951296E1 (~0.3141592653589793E1, ~0.123E~2, ~0.123E1): ~0.12261358410360845E1 ~0.12261358410360845E1 (~0.3141592653589793E1, ~0.123E~2, ~0.123): ~0.11913584103608456 ~0.11913584103608456 (~0.3141592653589793E1, ~0.123E~2, ~0.123E~2): 0.26341589639154455E~2 0.26341589639154455E~2 (~0.3141592653589793E1, ~0.123E~2, ~0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, ~0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, ~0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.123E~2, ~0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.3141592653589793E1, ~0.22250738585072014E~307, 0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (~0.3141592653589793E1, ~0.22250738585072014E~307, ~0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (~0.3141592653589793E1, ~0.5E~323, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (~0.3141592653589793E1, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (~0.3141592653589793E1, ~0.5E~323, 0.5E~323): 0.2E~322 0.2E~322 (~0.3141592653589793E1, ~0.5E~323, 0.0): 0.15E~322 0.15E~322 (~0.3141592653589793E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (~0.3141592653589793E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (~0.3141592653589793E1, ~0.5E~323, ~0.5E~323): 0.1E~322 0.1E~322 (~0.3141592653589793E1, ~0.5E~323, ~0.0): 0.15E~322 0.15E~322 (~0.2718281828459045E1, 0.17976931348623157E309, 0.17976931348623157E309): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.8988465674311579E308): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.2718281828459045E1, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.17976931348623157E309): ~0.6456251559585884E308 ~0.6456251559585884E308 (~0.2718281828459045E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.15444717233897463E309 ~0.15444717233897463E309 (~0.2718281828459045E1, 0.8988465674311579E308, 0.123E4): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.123E2): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.3141592653589793E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.2718281828459045E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.123E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.123): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.123E~2): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.22250738585072014E~307): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.11125369292536007E~307): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.5E~323): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, 0.0): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.123E4): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.123E2): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.3141592653589793E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.2718281828459045E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.123E1): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.123): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.123E~2): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.22250738585072014E~307): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.11125369292536007E~307): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.5E~323): ~inf ~inf (~0.2718281828459045E1, 0.8988465674311579E308, ~0.0): ~inf ~inf (~0.2718281828459045E1, 0.123E4, 0.123E4): ~0.21134866490046256E4 ~0.21134866490046256E4 (~0.2718281828459045E1, 0.123E4, 0.123E2): ~0.33311866490046255E4 ~0.33311866490046255E4 (~0.2718281828459045E1, 0.123E4, 0.3141592653589793E1): ~0.33403450563510355E4 ~0.33403450563510355E4 (~0.2718281828459045E1, 0.123E4, 0.2718281828459045E1): ~0.33407683671761665E4 ~0.33407683671761665E4 (~0.2718281828459045E1, 0.123E4, 0.123E1): ~0.33422566490046256E4 ~0.33422566490046256E4 (~0.2718281828459045E1, 0.123E4, 0.123): ~0.33433636490046256E4 ~0.33433636490046256E4 (~0.2718281828459045E1, 0.123E4, 0.123E~2): ~0.33434854190046253E4 ~0.33434854190046253E4 (~0.2718281828459045E1, 0.123E4, 0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, 0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, 0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, 0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, ~0.123E4): ~0.4573486649004625E4 ~0.4573486649004625E4 (~0.2718281828459045E1, 0.123E4, ~0.123E2): ~0.33557866490046254E4 ~0.33557866490046254E4 (~0.2718281828459045E1, 0.123E4, ~0.3141592653589793E1): ~0.33466282416582153E4 ~0.33466282416582153E4 (~0.2718281828459045E1, 0.123E4, ~0.2718281828459045E1): ~0.33462049308330843E4 ~0.33462049308330843E4 (~0.2718281828459045E1, 0.123E4, ~0.123E1): ~0.33447166490046257E4 ~0.33447166490046257E4 (~0.2718281828459045E1, 0.123E4, ~0.123): ~0.33436096490046257E4 ~0.33436096490046257E4 (~0.2718281828459045E1, 0.123E4, ~0.123E~2): ~0.33434878790046255E4 ~0.33434878790046255E4 (~0.2718281828459045E1, 0.123E4, ~0.22250738585072014E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, ~0.11125369292536007E~307): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, ~0.5E~323): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E4, ~0.0): ~0.33434866490046256E4 ~0.33434866490046256E4 (~0.2718281828459045E1, 0.123E2, 0.123E4): 0.11965651335099537E4 0.11965651335099537E4 (~0.2718281828459045E1, 0.123E2, 0.123E2): ~0.21134866490046257E2 ~0.21134866490046257E2 (~0.2718281828459045E1, 0.123E2, 0.3141592653589793E1): ~0.30293273836456464E2 ~0.30293273836456464E2 (~0.2718281828459045E1, 0.123E2, 0.2718281828459045E1): ~0.30716584661587213E2 ~0.30716584661587213E2 (~0.2718281828459045E1, 0.123E2, 0.123E1): ~0.3220486649004626E2 ~0.3220486649004626E2 (~0.2718281828459045E1, 0.123E2, 0.123): ~0.33311866490046256E2 ~0.33311866490046256E2 (~0.2718281828459045E1, 0.123E2, 0.123E~2): ~0.33433636490046254E2 ~0.33433636490046254E2 (~0.2718281828459045E1, 0.123E2, 0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, 0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, 0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, 0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, ~0.123E4): ~0.12634348664900463E4 ~0.12634348664900463E4 (~0.2718281828459045E1, 0.123E2, ~0.123E2): ~0.4573486649004626E2 ~0.4573486649004626E2 (~0.2718281828459045E1, 0.123E2, ~0.3141592653589793E1): ~0.3657645914363605E2 ~0.3657645914363605E2 (~0.2718281828459045E1, 0.123E2, ~0.2718281828459045E1): ~0.361531483185053E2 ~0.361531483185053E2 (~0.2718281828459045E1, 0.123E2, ~0.123E1): ~0.3466486649004626E2 ~0.3466486649004626E2 (~0.2718281828459045E1, 0.123E2, ~0.123): ~0.3355786649004626E2 ~0.3355786649004626E2 (~0.2718281828459045E1, 0.123E2, ~0.123E~2): ~0.3343609649004625E2 ~0.3343609649004625E2 (~0.2718281828459045E1, 0.123E2, ~0.22250738585072014E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, ~0.11125369292536007E~307): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, ~0.5E~323): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.123E2, ~0.0): ~0.33434866490046254E2 ~0.33434866490046254E2 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E4): 0.12214602657773264E4 0.12214602657773264E4 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E2): 0.37602657773264343E1 0.37602657773264343E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.3141592653589793E1): ~0.5398141569083773E1 ~0.5398141569083773E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.5821452394214521E1 ~0.5821452394214521E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E1): ~0.7309734222673566E1 ~0.7309734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123): ~0.8416734222673567E1 ~0.8416734222673567E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.123E~2): ~0.8538504222673566E1 ~0.8538504222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, 0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123E4): ~0.12385397342226736E4 ~0.12385397342226736E4 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123E2): ~0.20839734222673567E2 ~0.20839734222673567E2 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.11681326876263359E2 ~0.11681326876263359E2 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.1125801605113261E2 ~0.1125801605113261E2 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123E1): ~0.9769734222673566E1 ~0.9769734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123): ~0.8662734222673567E1 ~0.8662734222673567E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.123E~2): ~0.8540964222673566E1 ~0.8540964222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.5E~323): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.3141592653589793E1, ~0.0): ~0.8539734222673566E1 ~0.8539734222673566E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E4): 0.12226109439010693E4 0.12226109439010693E4 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E2): 0.4910943901069351E1 0.4910943901069351E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.4247463445340856E1 ~0.4247463445340856E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.4670774270471604E1 ~0.4670774270471604E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E1): ~0.6159056098930649E1 ~0.6159056098930649E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123): ~0.7266056098930649E1 ~0.7266056098930649E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.123E~2): ~0.7387826098930649E1 ~0.7387826098930649E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.5E~323): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, 0.0): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.123E4): ~0.12373890560989307E4 ~0.12373890560989307E4 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.123E2): ~0.1968905609893065E2 ~0.1968905609893065E2 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.10530648752520442E2 ~0.10530648752520442E2 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.10107337927389695E2 ~0.10107337927389695E2 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.123E1): ~0.8619056098930649E1 ~0.8619056098930649E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.123): ~0.751205609893065E1 ~0.751205609893065E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.123E~2): ~0.7390286098930649E1 ~0.7390286098930649E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.5E~323): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.2718281828459045E1, ~0.0): ~0.73890560989306495E1 ~0.73890560989306495E1 (~0.2718281828459045E1, 0.123E1, 0.123E4): 0.12266565133509953E4 0.12266565133509953E4 (~0.2718281828459045E1, 0.123E1, 0.123E2): 0.8956513350995376E1 0.8956513350995376E1 (~0.2718281828459045E1, 0.123E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.2018939954148323 (~0.2718281828459045E1, 0.123E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455804 (~0.2718281828459045E1, 0.123E1, 0.123E1): ~0.21134866490046256E1 ~0.21134866490046256E1 (~0.2718281828459045E1, 0.123E1, 0.123): ~0.32204866490046253E1 ~0.32204866490046253E1 (~0.2718281828459045E1, 0.123E1, 0.123E~2): ~0.33422566490046255E1 ~0.33422566490046255E1 (~0.2718281828459045E1, 0.123E1, 0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, 0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, 0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, 0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, ~0.123E4): ~0.12333434866490047E4 ~0.12333434866490047E4 (~0.2718281828459045E1, 0.123E1, ~0.123E2): ~0.15643486649004625E2 ~0.15643486649004625E2 (~0.2718281828459045E1, 0.123E1, ~0.3141592653589793E1): ~0.6485079302594419E1 ~0.6485079302594419E1 (~0.2718281828459045E1, 0.123E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.606176847746367E1 (~0.2718281828459045E1, 0.123E1, ~0.123E1): ~0.4573486649004625E1 ~0.4573486649004625E1 (~0.2718281828459045E1, 0.123E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046253E1 (~0.2718281828459045E1, 0.123E1, ~0.123E~2): ~0.33447166490046256E1 ~0.33447166490046256E1 (~0.2718281828459045E1, 0.123E1, ~0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, ~0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, ~0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123E1, ~0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.2718281828459045E1, 0.123, 0.123E4): 0.12296656513350995E4 0.12296656513350995E4 (~0.2718281828459045E1, 0.123, 0.123E2): 0.11965651335099539E2 0.11965651335099539E2 (~0.2718281828459045E1, 0.123, 0.3141592653589793E1): 0.28072439886893306E1 0.28072439886893306E1 (~0.2718281828459045E1, 0.123, 0.2718281828459045E1): 0.23839331635585825E1 0.23839331635585825E1 (~0.2718281828459045E1, 0.123, 0.123E1): 0.8956513350995374 0.8956513350995374 (~0.2718281828459045E1, 0.123, 0.123): ~0.21134866490046253 ~0.21134866490046253 (~0.2718281828459045E1, 0.123, 0.123E~2): ~0.33311866490046255 ~0.33311866490046255 (~0.2718281828459045E1, 0.123, 0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, 0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, 0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, 0.0): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, ~0.123E4): ~0.12303343486649005E4 ~0.12303343486649005E4 (~0.2718281828459045E1, 0.123, ~0.123E2): ~0.12634348664900463E2 ~0.12634348664900463E2 (~0.2718281828459045E1, 0.123, ~0.3141592653589793E1): ~0.34759413184902557E1 ~0.34759413184902557E1 (~0.2718281828459045E1, 0.123, ~0.2718281828459045E1): ~0.30526304933595076E1 ~0.30526304933595076E1 (~0.2718281828459045E1, 0.123, ~0.123E1): ~0.15643486649004625E1 ~0.15643486649004625E1 (~0.2718281828459045E1, 0.123, ~0.123): ~0.45734866490046255 ~0.45734866490046255 (~0.2718281828459045E1, 0.123, ~0.123E~2): ~0.33557866490046256 ~0.33557866490046256 (~0.2718281828459045E1, 0.123, ~0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, ~0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, ~0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123, ~0.0): ~0.33434866490046256 ~0.33434866490046256 (~0.2718281828459045E1, 0.123E~2, 0.123E4): 0.1229996656513351E4 0.1229996656513351E4 (~0.2718281828459045E1, 0.123E~2, 0.123E2): 0.12296656513350996E2 0.12296656513350996E2 (~0.2718281828459045E1, 0.123E~2, 0.3141592653589793E1): 0.31382491669407884E1 0.31382491669407884E1 (~0.2718281828459045E1, 0.123E~2, 0.2718281828459045E1): 0.27149383418100403E1 0.27149383418100403E1 (~0.2718281828459045E1, 0.123E~2, 0.123E1): 0.12266565133509955E1 0.12266565133509955E1 (~0.2718281828459045E1, 0.123E~2, 0.123): 0.11965651335099538 0.11965651335099538 (~0.2718281828459045E1, 0.123E~2, 0.123E~2): ~0.21134866490046256E~2 ~0.21134866490046256E~2 (~0.2718281828459045E1, 0.123E~2, 0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, 0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, 0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, 0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, ~0.123E4): ~0.1230003343486649E4 ~0.1230003343486649E4 (~0.2718281828459045E1, 0.123E~2, ~0.123E2): ~0.12303343486649005E2 ~0.12303343486649005E2 (~0.2718281828459045E1, 0.123E~2, ~0.3141592653589793E1): ~0.3144936140238798E1 ~0.3144936140238798E1 (~0.2718281828459045E1, 0.123E~2, ~0.2718281828459045E1): ~0.272162531510805E1 ~0.272162531510805E1 (~0.2718281828459045E1, 0.123E~2, ~0.123E1): ~0.12333434866490045E1 ~0.12333434866490045E1 (~0.2718281828459045E1, 0.123E~2, ~0.123): ~0.12634348664900463 ~0.12634348664900463 (~0.2718281828459045E1, 0.123E~2, ~0.123E~2): ~0.4573486649004625E~2 ~0.4573486649004625E~2 (~0.2718281828459045E1, 0.123E~2, ~0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, ~0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, ~0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.123E~2, ~0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.2718281828459045E1, 0.22250738585072014E~307, 0.5E~323): ~0.6048377836559377E~307 ~0.6048377836559377E~307 (~0.2718281828459045E1, 0.22250738585072014E~307, ~0.5E~323): ~0.6048377836559379E~307 ~0.6048377836559379E~307 (~0.2718281828459045E1, 0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.524926277678689E~307 ~0.524926277678689E~307 (~0.2718281828459045E1, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (~0.2718281828459045E1, 0.5E~323, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (~0.2718281828459045E1, 0.5E~323, 0.5E~323): ~0.1E~322 ~0.1E~322 (~0.2718281828459045E1, 0.5E~323, 0.0): ~0.15E~322 ~0.15E~322 (~0.2718281828459045E1, 0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (~0.2718281828459045E1, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (~0.2718281828459045E1, 0.5E~323, ~0.5E~323): ~0.2E~322 ~0.2E~322 (~0.2718281828459045E1, 0.5E~323, ~0.0): ~0.15E~322 ~0.15E~322 (~0.2718281828459045E1, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.123E4): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.123E2): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.123E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.123): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, 0.0): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.17976931348623157E309): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.8988465674311579E308): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.123): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.2718281828459045E1, ~0.17976931348623157E309, ~0.0): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.123E4): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.123E2): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.3141592653589793E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.2718281828459045E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.123E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.123): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.123E~2): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.22250738585072014E~307): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.11125369292536007E~307): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.5E~323): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, 0.0): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.17976931348623157E309): 0.6456251559585884E308 0.6456251559585884E308 (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.15444717233897463E309 0.15444717233897463E309 (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E4): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E2): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.3141592653589793E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.2718281828459045E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E1): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.123): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.123E~2): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.5E~323): inf inf (~0.2718281828459045E1, ~0.8988465674311579E308, ~0.0): inf inf (~0.2718281828459045E1, ~0.123E4, 0.123E4): 0.4573486649004625E4 0.4573486649004625E4 (~0.2718281828459045E1, ~0.123E4, 0.123E2): 0.33557866490046254E4 0.33557866490046254E4 (~0.2718281828459045E1, ~0.123E4, 0.3141592653589793E1): 0.33466282416582153E4 0.33466282416582153E4 (~0.2718281828459045E1, ~0.123E4, 0.2718281828459045E1): 0.33462049308330843E4 0.33462049308330843E4 (~0.2718281828459045E1, ~0.123E4, 0.123E1): 0.33447166490046257E4 0.33447166490046257E4 (~0.2718281828459045E1, ~0.123E4, 0.123): 0.33436096490046257E4 0.33436096490046257E4 (~0.2718281828459045E1, ~0.123E4, 0.123E~2): 0.33434878790046255E4 0.33434878790046255E4 (~0.2718281828459045E1, ~0.123E4, 0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, 0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, 0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, 0.0): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E4): 0.21134866490046256E4 0.21134866490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E2): 0.33311866490046255E4 0.33311866490046255E4 (~0.2718281828459045E1, ~0.123E4, ~0.3141592653589793E1): 0.33403450563510355E4 0.33403450563510355E4 (~0.2718281828459045E1, ~0.123E4, ~0.2718281828459045E1): 0.33407683671761665E4 0.33407683671761665E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E1): 0.33422566490046256E4 0.33422566490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.123): 0.33433636490046256E4 0.33433636490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.123E~2): 0.33434854190046253E4 0.33434854190046253E4 (~0.2718281828459045E1, ~0.123E4, ~0.22250738585072014E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.11125369292536007E~307): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.5E~323): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E4, ~0.0): 0.33434866490046256E4 0.33434866490046256E4 (~0.2718281828459045E1, ~0.123E2, 0.123E4): 0.12634348664900463E4 0.12634348664900463E4 (~0.2718281828459045E1, ~0.123E2, 0.123E2): 0.4573486649004626E2 0.4573486649004626E2 (~0.2718281828459045E1, ~0.123E2, 0.3141592653589793E1): 0.3657645914363605E2 0.3657645914363605E2 (~0.2718281828459045E1, ~0.123E2, 0.2718281828459045E1): 0.361531483185053E2 0.361531483185053E2 (~0.2718281828459045E1, ~0.123E2, 0.123E1): 0.3466486649004626E2 0.3466486649004626E2 (~0.2718281828459045E1, ~0.123E2, 0.123): 0.3355786649004626E2 0.3355786649004626E2 (~0.2718281828459045E1, ~0.123E2, 0.123E~2): 0.3343609649004625E2 0.3343609649004625E2 (~0.2718281828459045E1, ~0.123E2, 0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, 0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, 0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, 0.0): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E4): ~0.11965651335099537E4 ~0.11965651335099537E4 (~0.2718281828459045E1, ~0.123E2, ~0.123E2): 0.21134866490046257E2 0.21134866490046257E2 (~0.2718281828459045E1, ~0.123E2, ~0.3141592653589793E1): 0.30293273836456464E2 0.30293273836456464E2 (~0.2718281828459045E1, ~0.123E2, ~0.2718281828459045E1): 0.30716584661587213E2 0.30716584661587213E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E1): 0.3220486649004626E2 0.3220486649004626E2 (~0.2718281828459045E1, ~0.123E2, ~0.123): 0.33311866490046256E2 0.33311866490046256E2 (~0.2718281828459045E1, ~0.123E2, ~0.123E~2): 0.33433636490046254E2 0.33433636490046254E2 (~0.2718281828459045E1, ~0.123E2, ~0.22250738585072014E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, ~0.11125369292536007E~307): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, ~0.5E~323): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.123E2, ~0.0): 0.33434866490046254E2 0.33434866490046254E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123E4): 0.12385397342226736E4 0.12385397342226736E4 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123E2): 0.20839734222673567E2 0.20839734222673567E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.11681326876263359E2 0.11681326876263359E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.2718281828459045E1): 0.1125801605113261E2 0.1125801605113261E2 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123E1): 0.9769734222673566E1 0.9769734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123): 0.8662734222673567E1 0.8662734222673567E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.123E~2): 0.8540964222673566E1 0.8540964222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, 0.0): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E4): ~0.12214602657773264E4 ~0.12214602657773264E4 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E2): ~0.37602657773264343E1 ~0.37602657773264343E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.3141592653589793E1): 0.5398141569083773E1 0.5398141569083773E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.5821452394214521E1 0.5821452394214521E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E1): 0.7309734222673566E1 0.7309734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123): 0.8416734222673567E1 0.8416734222673567E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.123E~2): 0.8538504222673566E1 0.8538504222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.5E~323): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.3141592653589793E1, ~0.0): 0.8539734222673566E1 0.8539734222673566E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.123E4): 0.12373890560989307E4 0.12373890560989307E4 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.123E2): 0.1968905609893065E2 0.1968905609893065E2 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.3141592653589793E1): 0.10530648752520442E2 0.10530648752520442E2 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.10107337927389695E2 0.10107337927389695E2 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.123E1): 0.8619056098930649E1 0.8619056098930649E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.123): 0.751205609893065E1 0.751205609893065E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.123E~2): 0.7390286098930649E1 0.7390286098930649E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.5E~323): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, 0.0): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E4): ~0.12226109439010693E4 ~0.12226109439010693E4 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E2): ~0.4910943901069351E1 ~0.4910943901069351E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.4247463445340856E1 0.4247463445340856E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.4670774270471604E1 0.4670774270471604E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E1): 0.6159056098930649E1 0.6159056098930649E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123): 0.7266056098930649E1 0.7266056098930649E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.123E~2): 0.7387826098930649E1 0.7387826098930649E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.5E~323): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.2718281828459045E1, ~0.0): 0.73890560989306495E1 0.73890560989306495E1 (~0.2718281828459045E1, ~0.123E1, 0.123E4): 0.12333434866490047E4 0.12333434866490047E4 (~0.2718281828459045E1, ~0.123E1, 0.123E2): 0.15643486649004625E2 0.15643486649004625E2 (~0.2718281828459045E1, ~0.123E1, 0.3141592653589793E1): 0.6485079302594419E1 0.6485079302594419E1 (~0.2718281828459045E1, ~0.123E1, 0.2718281828459045E1): 0.606176847746367E1 0.606176847746367E1 (~0.2718281828459045E1, ~0.123E1, 0.123E1): 0.4573486649004625E1 0.4573486649004625E1 (~0.2718281828459045E1, ~0.123E1, 0.123): 0.34664866490046253E1 0.34664866490046253E1 (~0.2718281828459045E1, ~0.123E1, 0.123E~2): 0.33447166490046256E1 0.33447166490046256E1 (~0.2718281828459045E1, ~0.123E1, 0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, 0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, 0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, 0.0): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, ~0.123E4): ~0.12266565133509953E4 ~0.12266565133509953E4 (~0.2718281828459045E1, ~0.123E1, ~0.123E2): ~0.8956513350995376E1 ~0.8956513350995376E1 (~0.2718281828459045E1, ~0.123E1, ~0.3141592653589793E1): 0.2018939954148323 0.2018939954148323 (~0.2718281828459045E1, ~0.123E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455804 (~0.2718281828459045E1, ~0.123E1, ~0.123E1): 0.21134866490046256E1 0.21134866490046256E1 (~0.2718281828459045E1, ~0.123E1, ~0.123): 0.32204866490046253E1 0.32204866490046253E1 (~0.2718281828459045E1, ~0.123E1, ~0.123E~2): 0.33422566490046255E1 0.33422566490046255E1 (~0.2718281828459045E1, ~0.123E1, ~0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, ~0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, ~0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123E1, ~0.0): 0.33434866490046256E1 0.33434866490046256E1 (~0.2718281828459045E1, ~0.123, 0.123E4): 0.12303343486649005E4 0.12303343486649005E4 (~0.2718281828459045E1, ~0.123, 0.123E2): 0.12634348664900463E2 0.12634348664900463E2 (~0.2718281828459045E1, ~0.123, 0.3141592653589793E1): 0.34759413184902557E1 0.34759413184902557E1 (~0.2718281828459045E1, ~0.123, 0.2718281828459045E1): 0.30526304933595076E1 0.30526304933595076E1 (~0.2718281828459045E1, ~0.123, 0.123E1): 0.15643486649004625E1 0.15643486649004625E1 (~0.2718281828459045E1, ~0.123, 0.123): 0.45734866490046255 0.45734866490046255 (~0.2718281828459045E1, ~0.123, 0.123E~2): 0.33557866490046256 0.33557866490046256 (~0.2718281828459045E1, ~0.123, 0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, 0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, 0.5E~323): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, 0.0): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, ~0.123E4): ~0.12296656513350995E4 ~0.12296656513350995E4 (~0.2718281828459045E1, ~0.123, ~0.123E2): ~0.11965651335099539E2 ~0.11965651335099539E2 (~0.2718281828459045E1, ~0.123, ~0.3141592653589793E1): ~0.28072439886893306E1 ~0.28072439886893306E1 (~0.2718281828459045E1, ~0.123, ~0.2718281828459045E1): ~0.23839331635585825E1 ~0.23839331635585825E1 (~0.2718281828459045E1, ~0.123, ~0.123E1): ~0.8956513350995374 ~0.8956513350995374 (~0.2718281828459045E1, ~0.123, ~0.123): 0.21134866490046253 0.21134866490046253 (~0.2718281828459045E1, ~0.123, ~0.123E~2): 0.33311866490046255 0.33311866490046255 (~0.2718281828459045E1, ~0.123, ~0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, ~0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, ~0.5E~323): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123, ~0.0): 0.33434866490046256 0.33434866490046256 (~0.2718281828459045E1, ~0.123E~2, 0.123E4): 0.1230003343486649E4 0.1230003343486649E4 (~0.2718281828459045E1, ~0.123E~2, 0.123E2): 0.12303343486649005E2 0.12303343486649005E2 (~0.2718281828459045E1, ~0.123E~2, 0.3141592653589793E1): 0.3144936140238798E1 0.3144936140238798E1 (~0.2718281828459045E1, ~0.123E~2, 0.2718281828459045E1): 0.272162531510805E1 0.272162531510805E1 (~0.2718281828459045E1, ~0.123E~2, 0.123E1): 0.12333434866490045E1 0.12333434866490045E1 (~0.2718281828459045E1, ~0.123E~2, 0.123): 0.12634348664900463 0.12634348664900463 (~0.2718281828459045E1, ~0.123E~2, 0.123E~2): 0.4573486649004625E~2 0.4573486649004625E~2 (~0.2718281828459045E1, ~0.123E~2, 0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, 0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, 0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, 0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, ~0.123E4): ~0.1229996656513351E4 ~0.1229996656513351E4 (~0.2718281828459045E1, ~0.123E~2, ~0.123E2): ~0.12296656513350996E2 ~0.12296656513350996E2 (~0.2718281828459045E1, ~0.123E~2, ~0.3141592653589793E1): ~0.31382491669407884E1 ~0.31382491669407884E1 (~0.2718281828459045E1, ~0.123E~2, ~0.2718281828459045E1): ~0.27149383418100403E1 ~0.27149383418100403E1 (~0.2718281828459045E1, ~0.123E~2, ~0.123E1): ~0.12266565133509955E1 ~0.12266565133509955E1 (~0.2718281828459045E1, ~0.123E~2, ~0.123): ~0.11965651335099538 ~0.11965651335099538 (~0.2718281828459045E1, ~0.123E~2, ~0.123E~2): 0.21134866490046256E~2 0.21134866490046256E~2 (~0.2718281828459045E1, ~0.123E~2, ~0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, ~0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, ~0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.123E~2, ~0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.2718281828459045E1, ~0.22250738585072014E~307, 0.5E~323): 0.6048377836559379E~307 0.6048377836559379E~307 (~0.2718281828459045E1, ~0.22250738585072014E~307, ~0.5E~323): 0.6048377836559377E~307 0.6048377836559377E~307 (~0.2718281828459045E1, ~0.11125369292536007E~307, 0.22250738585072014E~307): 0.524926277678689E~307 0.524926277678689E~307 (~0.2718281828459045E1, ~0.5E~323, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (~0.2718281828459045E1, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (~0.2718281828459045E1, ~0.5E~323, 0.5E~323): 0.2E~322 0.2E~322 (~0.2718281828459045E1, ~0.5E~323, 0.0): 0.15E~322 0.15E~322 (~0.2718281828459045E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (~0.2718281828459045E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (~0.2718281828459045E1, ~0.5E~323, ~0.5E~323): 0.1E~322 0.1E~322 (~0.2718281828459045E1, ~0.5E~323, ~0.0): 0.15E~322 0.15E~322 (~0.123E1, 0.17976931348623157E309, 0.17976931348623157E309): ~0.4134694210183326E308 ~0.4134694210183326E308 (~0.123E1, 0.17976931348623157E309, 0.8988465674311579E308): ~0.13123159884494904E309 ~0.13123159884494904E309 (~0.123E1, 0.17976931348623157E309, 0.123E4): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.123E2): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.3141592653589793E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.2718281828459045E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.123E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.123): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.123E~2): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.22250738585072014E~307): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.11125369292536007E~307): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.5E~323): ~inf ~inf (~0.123E1, 0.17976931348623157E309, 0.0): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.8988465674311579E308): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.123E4): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.123E2): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.3141592653589793E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.2718281828459045E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.123E1): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.123): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.123E~2): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.22250738585072014E~307): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.11125369292536007E~307): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.5E~323): ~inf ~inf (~0.123E1, 0.17976931348623157E309, ~0.0): ~inf ~inf (~0.123E1, 0.8988465674311579E308, 0.17976931348623157E309): 0.6921118569219915E308 0.6921118569219915E308 (~0.123E1, 0.8988465674311579E308, 0.8988465674311579E308): ~0.2067347105091663E308 ~0.2067347105091663E308 (~0.123E1, 0.8988465674311579E308, 0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, 0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.123E1, 0.8988465674311579E308, ~0.8988465674311579E308): ~inf ~inf (~0.123E1, 0.8988465674311579E308, ~0.123E4): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.123E2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.123E1): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.123): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.123E~2): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.22250738585072014E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.11125369292536007E~307): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.5E~323): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.8988465674311579E308, ~0.0): ~0.1105581277940324E309 ~0.1105581277940324E309 (~0.123E1, 0.123E4, 0.123E4): ~0.2829E3 ~0.2829E3 (~0.123E1, 0.123E4, 0.123E2): ~0.15006E4 ~0.15006E4 (~0.123E1, 0.123E4, 0.3141592653589793E1): ~0.15097584073464102E4 ~0.15097584073464102E4 (~0.123E1, 0.123E4, 0.2718281828459045E1): ~0.1510181718171541E4 ~0.1510181718171541E4 (~0.123E1, 0.123E4, 0.123E1): ~0.151167E4 ~0.151167E4 (~0.123E1, 0.123E4, 0.123): ~0.1512777E4 ~0.1512777E4 (~0.123E1, 0.123E4, 0.123E~2): ~0.151289877E4 ~0.151289877E4 (~0.123E1, 0.123E4, 0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.5E~323): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, 0.0): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.123E4): ~0.27429E4 ~0.27429E4 (~0.123E1, 0.123E4, ~0.123E2): ~0.15252E4 ~0.15252E4 (~0.123E1, 0.123E4, ~0.3141592653589793E1): ~0.15160415926535898E4 ~0.15160415926535898E4 (~0.123E1, 0.123E4, ~0.2718281828459045E1): ~0.1515618281828459E4 ~0.1515618281828459E4 (~0.123E1, 0.123E4, ~0.123E1): ~0.15141299999999999E4 ~0.15141299999999999E4 (~0.123E1, 0.123E4, ~0.123): ~0.1513023E4 ~0.1513023E4 (~0.123E1, 0.123E4, ~0.123E~2): ~0.151290123E4 ~0.151290123E4 (~0.123E1, 0.123E4, ~0.22250738585072014E~307): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.11125369292536007E~307): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.5E~323): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E4, ~0.0): ~0.15129E4 ~0.15129E4 (~0.123E1, 0.123E2, 0.123E4): 0.1214871E4 0.1214871E4 (~0.123E1, 0.123E2, 0.123E2): ~0.28289999999999997E1 ~0.28289999999999997E1 (~0.123E1, 0.123E2, 0.3141592653589793E1): ~0.11987407346410208E2 ~0.11987407346410208E2 (~0.123E1, 0.123E2, 0.2718281828459045E1): ~0.12410718171540955E2 ~0.12410718171540955E2 (~0.123E1, 0.123E2, 0.123E1): ~0.13899000000000001E2 ~0.13899000000000001E2 (~0.123E1, 0.123E2, 0.123): ~0.15006E2 ~0.15006E2 (~0.123E1, 0.123E2, 0.123E~2): ~0.1512777E2 ~0.1512777E2 (~0.123E1, 0.123E2, 0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, 0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, 0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, 0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, ~0.123E4): ~0.1245129E4 ~0.1245129E4 (~0.123E1, 0.123E2, ~0.123E2): ~0.27429000000000002E2 ~0.27429000000000002E2 (~0.123E1, 0.123E2, ~0.3141592653589793E1): ~0.18270592653589794E2 ~0.18270592653589794E2 (~0.123E1, 0.123E2, ~0.2718281828459045E1): ~0.17847281828459046E2 ~0.17847281828459046E2 (~0.123E1, 0.123E2, ~0.123E1): ~0.16359E2 ~0.16359E2 (~0.123E1, 0.123E2, ~0.123): ~0.15252E2 ~0.15252E2 (~0.123E1, 0.123E2, ~0.123E~2): ~0.15130230000000001E2 ~0.15130230000000001E2 (~0.123E1, 0.123E2, ~0.22250738585072014E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, ~0.11125369292536007E~307): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, ~0.5E~323): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.123E2, ~0.0): ~0.15129000000000001E2 ~0.15129000000000001E2 (~0.123E1, 0.3141592653589793E1, 0.123E4): 0.12261358410360845E4 0.12261358410360845E4 (~0.123E1, 0.3141592653589793E1, 0.123E2): 0.8435841036084556E1 0.8435841036084556E1 (~0.123E1, 0.3141592653589793E1, 0.3141592653589793E1): ~0.7225663103256523 ~0.7225663103256523 (~0.123E1, 0.3141592653589793E1, 0.2718281828459045E1): ~0.11458771354564004E1 ~0.11458771354564004E1 (~0.123E1, 0.3141592653589793E1, 0.123E1): ~0.26341589639154455E1 ~0.26341589639154455E1 (~0.123E1, 0.3141592653589793E1, 0.123): ~0.37411589639154457E1 ~0.37411589639154457E1 (~0.123E1, 0.3141592653589793E1, 0.123E~2): ~0.38629289639154454E1 ~0.38629289639154454E1 (~0.123E1, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, 0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, 0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, ~0.123E4): ~0.12338641589639155E4 ~0.12338641589639155E4 (~0.123E1, 0.3141592653589793E1, ~0.123E2): ~0.16164158963915447E2 ~0.16164158963915447E2 (~0.123E1, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.7005751617505239E1 ~0.7005751617505239E1 (~0.123E1, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.65824407923744905E1 ~0.65824407923744905E1 (~0.123E1, 0.3141592653589793E1, ~0.123E1): ~0.5094158963915445E1 ~0.5094158963915445E1 (~0.123E1, 0.3141592653589793E1, ~0.123): ~0.39871589639154457E1 ~0.39871589639154457E1 (~0.123E1, 0.3141592653589793E1, ~0.123E~2): ~0.38653889639154455E1 ~0.38653889639154455E1 (~0.123E1, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, ~0.5E~323): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.3141592653589793E1, ~0.0): ~0.38641589639154454E1 ~0.38641589639154454E1 (~0.123E1, 0.2718281828459045E1, 0.123E4): 0.12266565133509953E4 0.12266565133509953E4 (~0.123E1, 0.2718281828459045E1, 0.123E2): 0.8956513350995376E1 0.8956513350995376E1 (~0.123E1, 0.2718281828459045E1, 0.3141592653589793E1): ~0.2018939954148323 ~0.2018939954148323 (~0.123E1, 0.2718281828459045E1, 0.2718281828459045E1): ~0.6252048205455804 ~0.6252048205455804 (~0.123E1, 0.2718281828459045E1, 0.123E1): ~0.21134866490046256E1 ~0.21134866490046256E1 (~0.123E1, 0.2718281828459045E1, 0.123): ~0.32204866490046253E1 ~0.32204866490046253E1 (~0.123E1, 0.2718281828459045E1, 0.123E~2): ~0.33422566490046255E1 ~0.33422566490046255E1 (~0.123E1, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, 0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, 0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, ~0.123E4): ~0.12333434866490047E4 ~0.12333434866490047E4 (~0.123E1, 0.2718281828459045E1, ~0.123E2): ~0.15643486649004625E2 ~0.15643486649004625E2 (~0.123E1, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.6485079302594419E1 ~0.6485079302594419E1 (~0.123E1, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.606176847746367E1 ~0.606176847746367E1 (~0.123E1, 0.2718281828459045E1, ~0.123E1): ~0.4573486649004625E1 ~0.4573486649004625E1 (~0.123E1, 0.2718281828459045E1, ~0.123): ~0.34664866490046253E1 ~0.34664866490046253E1 (~0.123E1, 0.2718281828459045E1, ~0.123E~2): ~0.33447166490046256E1 ~0.33447166490046256E1 (~0.123E1, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.2718281828459045E1, ~0.0): ~0.33434866490046256E1 ~0.33434866490046256E1 (~0.123E1, 0.123E1, 0.123E4): 0.12284871E4 0.12284871E4 (~0.123E1, 0.123E1, 0.123E2): 0.107871E2 0.107871E2 (~0.123E1, 0.123E1, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (~0.123E1, 0.123E1, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (~0.123E1, 0.123E1, 0.123E1): ~0.2829 ~0.2829 (~0.123E1, 0.123E1, 0.123): ~0.13899E1 ~0.13899E1 (~0.123E1, 0.123E1, 0.123E~2): ~0.15116699999999998E1 ~0.15116699999999998E1 (~0.123E1, 0.123E1, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, 0.0): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (~0.123E1, 0.123E1, ~0.123E2): ~0.138129E2 ~0.138129E2 (~0.123E1, 0.123E1, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (~0.123E1, 0.123E1, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (~0.123E1, 0.123E1, ~0.123E1): ~0.27429E1 ~0.27429E1 (~0.123E1, 0.123E1, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E1, 0.123E1, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123E1, 0.123E1, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123E1, ~0.0): ~0.15129E1 ~0.15129E1 (~0.123E1, 0.123, 0.123E4): 0.122984871E4 0.122984871E4 (~0.123E1, 0.123, 0.123E2): 0.12148710000000001E2 0.12148710000000001E2 (~0.123E1, 0.123, 0.3141592653589793E1): 0.2990302653589793E1 0.2990302653589793E1 (~0.123E1, 0.123, 0.2718281828459045E1): 0.2566991828459045E1 0.2566991828459045E1 (~0.123E1, 0.123, 0.123E1): 0.107871E1 0.107871E1 (~0.123E1, 0.123, 0.123): ~0.28289999999999996E~1 ~0.28289999999999996E~1 (~0.123E1, 0.123, 0.123E~2): ~0.15006 ~0.15006 (~0.123E1, 0.123, 0.22250738585072014E~307): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.11125369292536007E~307): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.5E~323): ~0.15129 ~0.15129 (~0.123E1, 0.123, 0.0): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.123E4): ~0.123015129E4 ~0.123015129E4 (~0.123E1, 0.123, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (~0.123E1, 0.123, ~0.3141592653589793E1): ~0.3292882653589793E1 ~0.3292882653589793E1 (~0.123E1, 0.123, ~0.2718281828459045E1): ~0.2869571828459045E1 ~0.2869571828459045E1 (~0.123E1, 0.123, ~0.123E1): ~0.138129E1 ~0.138129E1 (~0.123E1, 0.123, ~0.123): ~0.27429 ~0.27429 (~0.123E1, 0.123, ~0.123E~2): ~0.15252 ~0.15252 (~0.123E1, 0.123, ~0.22250738585072014E~307): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.11125369292536007E~307): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.5E~323): ~0.15129 ~0.15129 (~0.123E1, 0.123, ~0.0): ~0.15129 ~0.15129 (~0.123E1, 0.123E~2, 0.123E4): 0.12299984871E4 0.12299984871E4 (~0.123E1, 0.123E~2, 0.123E2): 0.12298487100000001E2 0.12298487100000001E2 (~0.123E1, 0.123E~2, 0.3141592653589793E1): 0.31400797535897933E1 0.31400797535897933E1 (~0.123E1, 0.123E~2, 0.2718281828459045E1): 0.27167689284590453E1 0.27167689284590453E1 (~0.123E1, 0.123E~2, 0.123E1): 0.12284871E1 0.12284871E1 (~0.123E1, 0.123E~2, 0.123): 0.1214871 0.1214871 (~0.123E1, 0.123E~2, 0.123E~2): ~0.2829E~3 ~0.2829E~3 (~0.123E1, 0.123E~2, 0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, 0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, 0.5E~323): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, 0.0): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, ~0.123E4): ~0.12300015129E4 ~0.12300015129E4 (~0.123E1, 0.123E~2, ~0.123E2): ~0.123015129E2 ~0.123015129E2 (~0.123E1, 0.123E~2, ~0.3141592653589793E1): ~0.3143105553589793E1 ~0.3143105553589793E1 (~0.123E1, 0.123E~2, ~0.2718281828459045E1): ~0.2719794728459045E1 ~0.2719794728459045E1 (~0.123E1, 0.123E~2, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (~0.123E1, 0.123E~2, ~0.123): ~0.1245129 ~0.1245129 (~0.123E1, 0.123E~2, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (~0.123E1, 0.123E~2, ~0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, ~0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, ~0.5E~323): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.123E~2, ~0.0): ~0.15129E~2 ~0.15129E~2 (~0.123E1, 0.5E~323, 0.22250738585072014E~307): 0.2225073858507201E~307 0.2225073858507201E~307 (~0.123E1, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536E~307 0.11125369292536E~307 (~0.123E1, 0.5E~323, 0.5E~323): ~0.0 ~0.0 (~0.123E1, 0.5E~323, 0.0): ~0.5E~323 ~0.5E~323 (~0.123E1, 0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507202E~307 ~0.2225073858507202E~307 (~0.123E1, 0.5E~323, ~0.11125369292536007E~307): ~0.1112536929253601E~307 ~0.1112536929253601E~307 (~0.123E1, 0.5E~323, ~0.5E~323): ~0.1E~322 ~0.1E~322 (~0.123E1, 0.5E~323, ~0.0): ~0.5E~323 ~0.5E~323 (~0.123E1, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.123E1, ~0.17976931348623157E309, 0.8988465674311579E308): inf inf (~0.123E1, ~0.17976931348623157E309, 0.123E4): inf inf (~0.123E1, ~0.17976931348623157E309, 0.123E2): inf inf (~0.123E1, ~0.17976931348623157E309, 0.3141592653589793E1): inf inf (~0.123E1, ~0.17976931348623157E309, 0.2718281828459045E1): inf inf (~0.123E1, ~0.17976931348623157E309, 0.123E1): inf inf (~0.123E1, ~0.17976931348623157E309, 0.123): inf inf (~0.123E1, ~0.17976931348623157E309, 0.123E~2): inf inf (~0.123E1, ~0.17976931348623157E309, 0.22250738585072014E~307): inf inf (~0.123E1, ~0.17976931348623157E309, 0.11125369292536007E~307): inf inf (~0.123E1, ~0.17976931348623157E309, 0.5E~323): inf inf (~0.123E1, ~0.17976931348623157E309, 0.0): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.17976931348623157E309): 0.4134694210183326E308 0.4134694210183326E308 (~0.123E1, ~0.17976931348623157E309, ~0.8988465674311579E308): 0.13123159884494904E309 0.13123159884494904E309 (~0.123E1, ~0.17976931348623157E309, ~0.123E4): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.123E2): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.3141592653589793E1): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.2718281828459045E1): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.123E1): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.123): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.123E~2): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.22250738585072014E~307): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.11125369292536007E~307): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.5E~323): inf inf (~0.123E1, ~0.17976931348623157E309, ~0.0): inf inf (~0.123E1, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.123E1, ~0.8988465674311579E308, 0.8988465674311579E308): inf inf (~0.123E1, ~0.8988465674311579E308, 0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.123): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, 0.0): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.6921118569219915E308 ~0.6921118569219915E308 (~0.123E1, ~0.8988465674311579E308, ~0.8988465674311579E308): 0.2067347105091663E308 0.2067347105091663E308 (~0.123E1, ~0.8988465674311579E308, ~0.123E4): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.123E2): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.3141592653589793E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.2718281828459045E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.123E1): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.123): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.123E~2): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.22250738585072014E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.11125369292536007E~307): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.5E~323): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.8988465674311579E308, ~0.0): 0.1105581277940324E309 0.1105581277940324E309 (~0.123E1, ~0.123E4, 0.123E4): 0.27429E4 0.27429E4 (~0.123E1, ~0.123E4, 0.123E2): 0.15252E4 0.15252E4 (~0.123E1, ~0.123E4, 0.3141592653589793E1): 0.15160415926535898E4 0.15160415926535898E4 (~0.123E1, ~0.123E4, 0.2718281828459045E1): 0.1515618281828459E4 0.1515618281828459E4 (~0.123E1, ~0.123E4, 0.123E1): 0.15141299999999999E4 0.15141299999999999E4 (~0.123E1, ~0.123E4, 0.123): 0.1513023E4 0.1513023E4 (~0.123E1, ~0.123E4, 0.123E~2): 0.151290123E4 0.151290123E4 (~0.123E1, ~0.123E4, 0.22250738585072014E~307): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.11125369292536007E~307): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.5E~323): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, 0.0): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.123E4): 0.2829E3 0.2829E3 (~0.123E1, ~0.123E4, ~0.123E2): 0.15006E4 0.15006E4 (~0.123E1, ~0.123E4, ~0.3141592653589793E1): 0.15097584073464102E4 0.15097584073464102E4 (~0.123E1, ~0.123E4, ~0.2718281828459045E1): 0.1510181718171541E4 0.1510181718171541E4 (~0.123E1, ~0.123E4, ~0.123E1): 0.151167E4 0.151167E4 (~0.123E1, ~0.123E4, ~0.123): 0.1512777E4 0.1512777E4 (~0.123E1, ~0.123E4, ~0.123E~2): 0.151289877E4 0.151289877E4 (~0.123E1, ~0.123E4, ~0.22250738585072014E~307): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.11125369292536007E~307): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.5E~323): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E4, ~0.0): 0.15129E4 0.15129E4 (~0.123E1, ~0.123E2, 0.123E4): 0.1245129E4 0.1245129E4 (~0.123E1, ~0.123E2, 0.123E2): 0.27429000000000002E2 0.27429000000000002E2 (~0.123E1, ~0.123E2, 0.3141592653589793E1): 0.18270592653589794E2 0.18270592653589794E2 (~0.123E1, ~0.123E2, 0.2718281828459045E1): 0.17847281828459046E2 0.17847281828459046E2 (~0.123E1, ~0.123E2, 0.123E1): 0.16359E2 0.16359E2 (~0.123E1, ~0.123E2, 0.123): 0.15252E2 0.15252E2 (~0.123E1, ~0.123E2, 0.123E~2): 0.15130230000000001E2 0.15130230000000001E2 (~0.123E1, ~0.123E2, 0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, 0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, 0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, 0.0): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, ~0.123E4): ~0.1214871E4 ~0.1214871E4 (~0.123E1, ~0.123E2, ~0.123E2): 0.28289999999999997E1 0.28289999999999997E1 (~0.123E1, ~0.123E2, ~0.3141592653589793E1): 0.11987407346410208E2 0.11987407346410208E2 (~0.123E1, ~0.123E2, ~0.2718281828459045E1): 0.12410718171540955E2 0.12410718171540955E2 (~0.123E1, ~0.123E2, ~0.123E1): 0.13899000000000001E2 0.13899000000000001E2 (~0.123E1, ~0.123E2, ~0.123): 0.15006E2 0.15006E2 (~0.123E1, ~0.123E2, ~0.123E~2): 0.1512777E2 0.1512777E2 (~0.123E1, ~0.123E2, ~0.22250738585072014E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, ~0.11125369292536007E~307): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, ~0.5E~323): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.123E2, ~0.0): 0.15129000000000001E2 0.15129000000000001E2 (~0.123E1, ~0.3141592653589793E1, 0.123E4): 0.12338641589639155E4 0.12338641589639155E4 (~0.123E1, ~0.3141592653589793E1, 0.123E2): 0.16164158963915447E2 0.16164158963915447E2 (~0.123E1, ~0.3141592653589793E1, 0.3141592653589793E1): 0.7005751617505239E1 0.7005751617505239E1 (~0.123E1, ~0.3141592653589793E1, 0.2718281828459045E1): 0.65824407923744905E1 0.65824407923744905E1 (~0.123E1, ~0.3141592653589793E1, 0.123E1): 0.5094158963915445E1 0.5094158963915445E1 (~0.123E1, ~0.3141592653589793E1, 0.123): 0.39871589639154457E1 0.39871589639154457E1 (~0.123E1, ~0.3141592653589793E1, 0.123E~2): 0.38653889639154455E1 0.38653889639154455E1 (~0.123E1, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, 0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, 0.0): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, ~0.123E4): ~0.12261358410360845E4 ~0.12261358410360845E4 (~0.123E1, ~0.3141592653589793E1, ~0.123E2): ~0.8435841036084556E1 ~0.8435841036084556E1 (~0.123E1, ~0.3141592653589793E1, ~0.3141592653589793E1): 0.7225663103256523 0.7225663103256523 (~0.123E1, ~0.3141592653589793E1, ~0.2718281828459045E1): 0.11458771354564004E1 0.11458771354564004E1 (~0.123E1, ~0.3141592653589793E1, ~0.123E1): 0.26341589639154455E1 0.26341589639154455E1 (~0.123E1, ~0.3141592653589793E1, ~0.123): 0.37411589639154457E1 0.37411589639154457E1 (~0.123E1, ~0.3141592653589793E1, ~0.123E~2): 0.38629289639154454E1 0.38629289639154454E1 (~0.123E1, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, ~0.5E~323): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.3141592653589793E1, ~0.0): 0.38641589639154454E1 0.38641589639154454E1 (~0.123E1, ~0.2718281828459045E1, 0.123E4): 0.12333434866490047E4 0.12333434866490047E4 (~0.123E1, ~0.2718281828459045E1, 0.123E2): 0.15643486649004625E2 0.15643486649004625E2 (~0.123E1, ~0.2718281828459045E1, 0.3141592653589793E1): 0.6485079302594419E1 0.6485079302594419E1 (~0.123E1, ~0.2718281828459045E1, 0.2718281828459045E1): 0.606176847746367E1 0.606176847746367E1 (~0.123E1, ~0.2718281828459045E1, 0.123E1): 0.4573486649004625E1 0.4573486649004625E1 (~0.123E1, ~0.2718281828459045E1, 0.123): 0.34664866490046253E1 0.34664866490046253E1 (~0.123E1, ~0.2718281828459045E1, 0.123E~2): 0.33447166490046256E1 0.33447166490046256E1 (~0.123E1, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, 0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, 0.0): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, ~0.123E4): ~0.12266565133509953E4 ~0.12266565133509953E4 (~0.123E1, ~0.2718281828459045E1, ~0.123E2): ~0.8956513350995376E1 ~0.8956513350995376E1 (~0.123E1, ~0.2718281828459045E1, ~0.3141592653589793E1): 0.2018939954148323 0.2018939954148323 (~0.123E1, ~0.2718281828459045E1, ~0.2718281828459045E1): 0.6252048205455804 0.6252048205455804 (~0.123E1, ~0.2718281828459045E1, ~0.123E1): 0.21134866490046256E1 0.21134866490046256E1 (~0.123E1, ~0.2718281828459045E1, ~0.123): 0.32204866490046253E1 0.32204866490046253E1 (~0.123E1, ~0.2718281828459045E1, ~0.123E~2): 0.33422566490046255E1 0.33422566490046255E1 (~0.123E1, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, ~0.5E~323): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.2718281828459045E1, ~0.0): 0.33434866490046256E1 0.33434866490046256E1 (~0.123E1, ~0.123E1, 0.123E4): 0.12315129E4 0.12315129E4 (~0.123E1, ~0.123E1, 0.123E2): 0.138129E2 0.138129E2 (~0.123E1, ~0.123E1, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (~0.123E1, ~0.123E1, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (~0.123E1, ~0.123E1, 0.123E1): 0.27429E1 0.27429E1 (~0.123E1, ~0.123E1, 0.123): 0.16359E1 0.16359E1 (~0.123E1, ~0.123E1, 0.123E~2): 0.151413E1 0.151413E1 (~0.123E1, ~0.123E1, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.5E~323): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, 0.0): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (~0.123E1, ~0.123E1, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E1, ~0.123E1, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (~0.123E1, ~0.123E1, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (~0.123E1, ~0.123E1, ~0.123E1): 0.2829 0.2829 (~0.123E1, ~0.123E1, ~0.123): 0.13899E1 0.13899E1 (~0.123E1, ~0.123E1, ~0.123E~2): 0.15116699999999998E1 0.15116699999999998E1 (~0.123E1, ~0.123E1, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.5E~323): 0.15129E1 0.15129E1 (~0.123E1, ~0.123E1, ~0.0): 0.15129E1 0.15129E1 (~0.123E1, ~0.123, 0.123E4): 0.123015129E4 0.123015129E4 (~0.123E1, ~0.123, 0.123E2): 0.1245129E2 0.1245129E2 (~0.123E1, ~0.123, 0.3141592653589793E1): 0.3292882653589793E1 0.3292882653589793E1 (~0.123E1, ~0.123, 0.2718281828459045E1): 0.2869571828459045E1 0.2869571828459045E1 (~0.123E1, ~0.123, 0.123E1): 0.138129E1 0.138129E1 (~0.123E1, ~0.123, 0.123): 0.27429 0.27429 (~0.123E1, ~0.123, 0.123E~2): 0.15252 0.15252 (~0.123E1, ~0.123, 0.22250738585072014E~307): 0.15129 0.15129 (~0.123E1, ~0.123, 0.11125369292536007E~307): 0.15129 0.15129 (~0.123E1, ~0.123, 0.5E~323): 0.15129 0.15129 (~0.123E1, ~0.123, 0.0): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.123E4): ~0.122984871E4 ~0.122984871E4 (~0.123E1, ~0.123, ~0.123E2): ~0.12148710000000001E2 ~0.12148710000000001E2 (~0.123E1, ~0.123, ~0.3141592653589793E1): ~0.2990302653589793E1 ~0.2990302653589793E1 (~0.123E1, ~0.123, ~0.2718281828459045E1): ~0.2566991828459045E1 ~0.2566991828459045E1 (~0.123E1, ~0.123, ~0.123E1): ~0.107871E1 ~0.107871E1 (~0.123E1, ~0.123, ~0.123): 0.28289999999999996E~1 0.28289999999999996E~1 (~0.123E1, ~0.123, ~0.123E~2): 0.15006 0.15006 (~0.123E1, ~0.123, ~0.22250738585072014E~307): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.11125369292536007E~307): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.5E~323): 0.15129 0.15129 (~0.123E1, ~0.123, ~0.0): 0.15129 0.15129 (~0.123E1, ~0.123E~2, 0.123E4): 0.12300015129E4 0.12300015129E4 (~0.123E1, ~0.123E~2, 0.123E2): 0.123015129E2 0.123015129E2 (~0.123E1, ~0.123E~2, 0.3141592653589793E1): 0.3143105553589793E1 0.3143105553589793E1 (~0.123E1, ~0.123E~2, 0.2718281828459045E1): 0.2719794728459045E1 0.2719794728459045E1 (~0.123E1, ~0.123E~2, 0.123E1): 0.12315129E1 0.12315129E1 (~0.123E1, ~0.123E~2, 0.123): 0.1245129 0.1245129 (~0.123E1, ~0.123E~2, 0.123E~2): 0.27429E~2 0.27429E~2 (~0.123E1, ~0.123E~2, 0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, 0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, 0.5E~323): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, 0.0): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, ~0.123E4): ~0.12299984871E4 ~0.12299984871E4 (~0.123E1, ~0.123E~2, ~0.123E2): ~0.12298487100000001E2 ~0.12298487100000001E2 (~0.123E1, ~0.123E~2, ~0.3141592653589793E1): ~0.31400797535897933E1 ~0.31400797535897933E1 (~0.123E1, ~0.123E~2, ~0.2718281828459045E1): ~0.27167689284590453E1 ~0.27167689284590453E1 (~0.123E1, ~0.123E~2, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (~0.123E1, ~0.123E~2, ~0.123): ~0.1214871 ~0.1214871 (~0.123E1, ~0.123E~2, ~0.123E~2): 0.2829E~3 0.2829E~3 (~0.123E1, ~0.123E~2, ~0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, ~0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, ~0.5E~323): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.123E~2, ~0.0): 0.15129E~2 0.15129E~2 (~0.123E1, ~0.5E~323, 0.22250738585072014E~307): 0.2225073858507202E~307 0.2225073858507202E~307 (~0.123E1, ~0.5E~323, 0.11125369292536007E~307): 0.1112536929253601E~307 0.1112536929253601E~307 (~0.123E1, ~0.5E~323, 0.5E~323): 0.1E~322 0.1E~322 (~0.123E1, ~0.5E~323, 0.0): 0.5E~323 0.5E~323 (~0.123E1, ~0.5E~323, ~0.22250738585072014E~307): ~0.2225073858507201E~307 ~0.2225073858507201E~307 (~0.123E1, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536E~307 ~0.11125369292536E~307 (~0.123E1, ~0.5E~323, ~0.5E~323): 0.0 0.0 (~0.123E1, ~0.5E~323, ~0.0): 0.5E~323 0.5E~323 (~0.123, 0.17976931348623157E309, 0.17976931348623157E309): 0.15765768792742509E309 0.15765768792742509E309 (~0.123, 0.17976931348623157E309, 0.8988465674311579E308): 0.677730311843093E308 0.677730311843093E308 (~0.123, 0.17976931348623157E309, 0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, 0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.123, 0.17976931348623157E309, ~0.8988465674311579E308): ~0.11199628230192226E309 ~0.11199628230192226E309 (~0.123, 0.17976931348623157E309, ~0.123E4): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.123E2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.3141592653589793E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.2718281828459045E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.123E1): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.123): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.123E~2): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.22250738585072014E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.11125369292536007E~307): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.5E~323): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.17976931348623157E309, ~0.0): ~0.22111625558806483E308 ~0.22111625558806483E308 (~0.123, 0.8988465674311579E308, 0.17976931348623157E309): 0.16871350070682833E309 0.16871350070682833E309 (~0.123, 0.8988465674311579E308, 0.8988465674311579E308): 0.7882884396371254E308 0.7882884396371254E308 (~0.123, 0.8988465674311579E308, 0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, 0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.123, 0.8988465674311579E308, ~0.8988465674311579E308): ~0.10094046952251902E309 ~0.10094046952251902E309 (~0.123, 0.8988465674311579E308, ~0.123E4): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.123E2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.123E1): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.123): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.123E~2): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.22250738585072014E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.11125369292536007E~307): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.5E~323): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.8988465674311579E308, ~0.0): ~0.11055812779403241E308 ~0.11055812779403241E308 (~0.123, 0.123E4, 0.123E4): 0.107871E4 0.107871E4 (~0.123, 0.123E4, 0.123E2): ~0.13899E3 ~0.13899E3 (~0.123, 0.123E4, 0.3141592653589793E1): ~0.1481484073464102E3 ~0.1481484073464102E3 (~0.123, 0.123E4, 0.2718281828459045E1): ~0.14857171817154097E3 ~0.14857171817154097E3 (~0.123, 0.123E4, 0.123E1): ~0.15006E3 ~0.15006E3 (~0.123, 0.123E4, 0.123): ~0.151167E3 ~0.151167E3 (~0.123, 0.123E4, 0.123E~2): ~0.15128877E3 ~0.15128877E3 (~0.123, 0.123E4, 0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, 0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, 0.5E~323): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, 0.0): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, ~0.123E4): ~0.138129E4 ~0.138129E4 (~0.123, 0.123E4, ~0.123E2): ~0.16359E3 ~0.16359E3 (~0.123, 0.123E4, ~0.3141592653589793E1): ~0.1544315926535898E3 ~0.1544315926535898E3 (~0.123, 0.123E4, ~0.2718281828459045E1): ~0.15400828182845905E3 ~0.15400828182845905E3 (~0.123, 0.123E4, ~0.123E1): ~0.15252E3 ~0.15252E3 (~0.123, 0.123E4, ~0.123): ~0.151413E3 ~0.151413E3 (~0.123, 0.123E4, ~0.123E~2): ~0.15129122999999998E3 ~0.15129122999999998E3 (~0.123, 0.123E4, ~0.22250738585072014E~307): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, ~0.11125369292536007E~307): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, ~0.5E~323): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E4, ~0.0): ~0.15129E3 ~0.15129E3 (~0.123, 0.123E2, 0.123E4): 0.12284871E4 0.12284871E4 (~0.123, 0.123E2, 0.123E2): 0.107871E2 0.107871E2 (~0.123, 0.123E2, 0.3141592653589793E1): 0.1628692653589793E1 0.1628692653589793E1 (~0.123, 0.123E2, 0.2718281828459045E1): 0.1205381828459045E1 0.1205381828459045E1 (~0.123, 0.123E2, 0.123E1): ~0.2829000000000001 ~0.2829000000000001 (~0.123, 0.123E2, 0.123): ~0.13899000000000001E1 ~0.13899000000000001E1 (~0.123, 0.123E2, 0.123E~2): ~0.151167E1 ~0.151167E1 (~0.123, 0.123E2, 0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, 0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, 0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, 0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (~0.123, 0.123E2, ~0.123E2): ~0.138129E2 ~0.138129E2 (~0.123, 0.123E2, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (~0.123, 0.123E2, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (~0.123, 0.123E2, ~0.123E1): ~0.27429E1 ~0.27429E1 (~0.123, 0.123E2, ~0.123): ~0.16359000000000001E1 ~0.16359000000000001E1 (~0.123, 0.123E2, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123, 0.123E2, ~0.22250738585072014E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, ~0.11125369292536007E~307): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, ~0.5E~323): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.123E2, ~0.0): ~0.15129000000000001E1 ~0.15129000000000001E1 (~0.123, 0.3141592653589793E1, 0.123E4): 0.12296135841036084E4 0.12296135841036084E4 (~0.123, 0.3141592653589793E1, 0.123E2): 0.11913584103608455E2 0.11913584103608455E2 (~0.123, 0.3141592653589793E1, 0.3141592653589793E1): 0.27551767571982486E1 0.27551767571982486E1 (~0.123, 0.3141592653589793E1, 0.2718281828459045E1): 0.23318659320675006E1 0.23318659320675006E1 (~0.123, 0.3141592653589793E1, 0.123E1): 0.8435841036084555 0.8435841036084555 (~0.123, 0.3141592653589793E1, 0.123): ~0.26341589639154456 ~0.26341589639154456 (~0.123, 0.3141592653589793E1, 0.123E~2): ~0.38518589639154455 ~0.38518589639154455 (~0.123, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, 0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, 0.0): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, ~0.123E4): ~0.12303864158963916E4 ~0.12303864158963916E4 (~0.123, 0.3141592653589793E1, ~0.123E2): ~0.12686415896391546E2 ~0.12686415896391546E2 (~0.123, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.35280085499813376E1 ~0.35280085499813376E1 (~0.123, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.31046977248505896E1 ~0.31046977248505896E1 (~0.123, 0.3141592653589793E1, ~0.123E1): ~0.16164158963915445E1 ~0.16164158963915445E1 (~0.123, 0.3141592653589793E1, ~0.123): ~0.5094158963915445 ~0.5094158963915445 (~0.123, 0.3141592653589793E1, ~0.123E~2): ~0.38764589639154456 ~0.38764589639154456 (~0.123, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, ~0.5E~323): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.3141592653589793E1, ~0.0): ~0.38641589639154456 ~0.38641589639154456 (~0.123, 0.2718281828459045E1, 0.123E4): 0.12296656513350995E4 0.12296656513350995E4 (~0.123, 0.2718281828459045E1, 0.123E2): 0.11965651335099539E2 0.11965651335099539E2 (~0.123, 0.2718281828459045E1, 0.3141592653589793E1): 0.28072439886893306E1 0.28072439886893306E1 (~0.123, 0.2718281828459045E1, 0.2718281828459045E1): 0.23839331635585825E1 0.23839331635585825E1 (~0.123, 0.2718281828459045E1, 0.123E1): 0.8956513350995374 0.8956513350995374 (~0.123, 0.2718281828459045E1, 0.123): ~0.21134866490046253 ~0.21134866490046253 (~0.123, 0.2718281828459045E1, 0.123E~2): ~0.33311866490046255 ~0.33311866490046255 (~0.123, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, 0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, 0.0): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, ~0.123E4): ~0.12303343486649005E4 ~0.12303343486649005E4 (~0.123, 0.2718281828459045E1, ~0.123E2): ~0.12634348664900463E2 ~0.12634348664900463E2 (~0.123, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.34759413184902557E1 ~0.34759413184902557E1 (~0.123, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.30526304933595076E1 ~0.30526304933595076E1 (~0.123, 0.2718281828459045E1, ~0.123E1): ~0.15643486649004625E1 ~0.15643486649004625E1 (~0.123, 0.2718281828459045E1, ~0.123): ~0.45734866490046255 ~0.45734866490046255 (~0.123, 0.2718281828459045E1, ~0.123E~2): ~0.33557866490046256 ~0.33557866490046256 (~0.123, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, ~0.5E~323): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.2718281828459045E1, ~0.0): ~0.33434866490046256 ~0.33434866490046256 (~0.123, 0.123E1, 0.123E4): 0.122984871E4 0.122984871E4 (~0.123, 0.123E1, 0.123E2): 0.12148710000000001E2 0.12148710000000001E2 (~0.123, 0.123E1, 0.3141592653589793E1): 0.2990302653589793E1 0.2990302653589793E1 (~0.123, 0.123E1, 0.2718281828459045E1): 0.2566991828459045E1 0.2566991828459045E1 (~0.123, 0.123E1, 0.123E1): 0.107871E1 0.107871E1 (~0.123, 0.123E1, 0.123): ~0.28289999999999996E~1 ~0.28289999999999996E~1 (~0.123, 0.123E1, 0.123E~2): ~0.15006 ~0.15006 (~0.123, 0.123E1, 0.22250738585072014E~307): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.11125369292536007E~307): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.5E~323): ~0.15129 ~0.15129 (~0.123, 0.123E1, 0.0): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.123E4): ~0.123015129E4 ~0.123015129E4 (~0.123, 0.123E1, ~0.123E2): ~0.1245129E2 ~0.1245129E2 (~0.123, 0.123E1, ~0.3141592653589793E1): ~0.3292882653589793E1 ~0.3292882653589793E1 (~0.123, 0.123E1, ~0.2718281828459045E1): ~0.2869571828459045E1 ~0.2869571828459045E1 (~0.123, 0.123E1, ~0.123E1): ~0.138129E1 ~0.138129E1 (~0.123, 0.123E1, ~0.123): ~0.27429 ~0.27429 (~0.123, 0.123E1, ~0.123E~2): ~0.15252 ~0.15252 (~0.123, 0.123E1, ~0.22250738585072014E~307): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.11125369292536007E~307): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.5E~323): ~0.15129 ~0.15129 (~0.123, 0.123E1, ~0.0): ~0.15129 ~0.15129 (~0.123, 0.123, 0.123E4): 0.1229984871E4 0.1229984871E4 (~0.123, 0.123, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123, 0.123, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (~0.123, 0.123, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (~0.123, 0.123, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123, 0.123, 0.123): 0.107871 0.107871 (~0.123, 0.123, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (~0.123, 0.123, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, 0.0): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (~0.123, 0.123, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123, 0.123, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (~0.123, 0.123, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (~0.123, 0.123, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123, 0.123, ~0.123): ~0.138129 ~0.138129 (~0.123, 0.123, ~0.123E~2): ~0.16359E~1 ~0.16359E~1 (~0.123, 0.123, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123, ~0.0): ~0.15129E~1 ~0.15129E~1 (~0.123, 0.123E~2, 0.123E4): 0.122999984871E4 0.122999984871E4 (~0.123, 0.123E~2, 0.123E2): 0.12299848710000001E2 0.12299848710000001E2 (~0.123, 0.123E~2, 0.3141592653589793E1): 0.31414413635897933E1 0.31414413635897933E1 (~0.123, 0.123E~2, 0.2718281828459045E1): 0.27181305384590453E1 0.27181305384590453E1 (~0.123, 0.123E~2, 0.123E1): 0.122984871E1 0.122984871E1 (~0.123, 0.123E~2, 0.123): 0.12284871 0.12284871 (~0.123, 0.123E~2, 0.123E~2): 0.107871E~2 0.107871E~2 (~0.123, 0.123E~2, 0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.5E~323): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, 0.0): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.123E4): ~0.123000015129E4 ~0.123000015129E4 (~0.123, 0.123E~2, ~0.123E2): ~0.1230015129E2 ~0.1230015129E2 (~0.123, 0.123E~2, ~0.3141592653589793E1): ~0.3141743943589793E1 ~0.3141743943589793E1 (~0.123, 0.123E~2, ~0.2718281828459045E1): ~0.2718433118459045E1 ~0.2718433118459045E1 (~0.123, 0.123E~2, ~0.123E1): ~0.123015129E1 ~0.123015129E1 (~0.123, 0.123E~2, ~0.123): ~0.12315129 ~0.12315129 (~0.123, 0.123E~2, ~0.123E~2): ~0.13812899999999999E~2 ~0.13812899999999999E~2 (~0.123, 0.123E~2, ~0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.5E~323): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.123E~2, ~0.0): ~0.15129E~3 ~0.15129E~3 (~0.123, 0.11125369292536007E~307, 0.22250738585072014E~307): 0.20882318162090083E~307 0.20882318162090083E~307 (~0.123, 0.11125369292536007E~307, 0.11125369292536007E~307): 0.9756948869554076E~308 0.9756948869554076E~308 (~0.123, 0.11125369292536007E~307, 0.5E~323): ~0.136842042298192E~308 ~0.136842042298192E~308 (~0.123, 0.11125369292536007E~307, 0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.123, 0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.23619159008053945E~307 ~0.23619159008053945E~307 (~0.123, 0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.1249378971551794E~307 ~0.1249378971551794E~307 (~0.123, 0.11125369292536007E~307, ~0.5E~323): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.123, 0.11125369292536007E~307, ~0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.123, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.123, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.123, 0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (~0.123, 0.5E~323, 0.0): ~0.0 ~0.0 (~0.123, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.123, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.123, 0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.123, 0.5E~323, ~0.0): ~0.0 ~0.0 (~0.123, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.123, ~0.17976931348623157E309, 0.8988465674311579E308): 0.11199628230192226E309 0.11199628230192226E309 (~0.123, ~0.17976931348623157E309, 0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.123): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, 0.0): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.17976931348623157E309): ~0.15765768792742509E309 ~0.15765768792742509E309 (~0.123, ~0.17976931348623157E309, ~0.8988465674311579E308): ~0.677730311843093E308 ~0.677730311843093E308 (~0.123, ~0.17976931348623157E309, ~0.123E4): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.123E2): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.3141592653589793E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.2718281828459045E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.123E1): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.123): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.123E~2): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.22250738585072014E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.11125369292536007E~307): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.5E~323): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.17976931348623157E309, ~0.0): 0.22111625558806483E308 0.22111625558806483E308 (~0.123, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.123, ~0.8988465674311579E308, 0.8988465674311579E308): 0.10094046952251902E309 0.10094046952251902E309 (~0.123, ~0.8988465674311579E308, 0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.123): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, 0.0): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.16871350070682833E309 ~0.16871350070682833E309 (~0.123, ~0.8988465674311579E308, ~0.8988465674311579E308): ~0.7882884396371254E308 ~0.7882884396371254E308 (~0.123, ~0.8988465674311579E308, ~0.123E4): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.123E2): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.3141592653589793E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.2718281828459045E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.123E1): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.123): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.123E~2): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.22250738585072014E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.11125369292536007E~307): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.5E~323): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.8988465674311579E308, ~0.0): 0.11055812779403241E308 0.11055812779403241E308 (~0.123, ~0.123E4, 0.123E4): 0.138129E4 0.138129E4 (~0.123, ~0.123E4, 0.123E2): 0.16359E3 0.16359E3 (~0.123, ~0.123E4, 0.3141592653589793E1): 0.1544315926535898E3 0.1544315926535898E3 (~0.123, ~0.123E4, 0.2718281828459045E1): 0.15400828182845905E3 0.15400828182845905E3 (~0.123, ~0.123E4, 0.123E1): 0.15252E3 0.15252E3 (~0.123, ~0.123E4, 0.123): 0.151413E3 0.151413E3 (~0.123, ~0.123E4, 0.123E~2): 0.15129122999999998E3 0.15129122999999998E3 (~0.123, ~0.123E4, 0.22250738585072014E~307): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, 0.11125369292536007E~307): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, 0.5E~323): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, 0.0): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, ~0.123E4): ~0.107871E4 ~0.107871E4 (~0.123, ~0.123E4, ~0.123E2): 0.13899E3 0.13899E3 (~0.123, ~0.123E4, ~0.3141592653589793E1): 0.1481484073464102E3 0.1481484073464102E3 (~0.123, ~0.123E4, ~0.2718281828459045E1): 0.14857171817154097E3 0.14857171817154097E3 (~0.123, ~0.123E4, ~0.123E1): 0.15006E3 0.15006E3 (~0.123, ~0.123E4, ~0.123): 0.151167E3 0.151167E3 (~0.123, ~0.123E4, ~0.123E~2): 0.15128877E3 0.15128877E3 (~0.123, ~0.123E4, ~0.22250738585072014E~307): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, ~0.11125369292536007E~307): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, ~0.5E~323): 0.15129E3 0.15129E3 (~0.123, ~0.123E4, ~0.0): 0.15129E3 0.15129E3 (~0.123, ~0.123E2, 0.123E4): 0.12315129E4 0.12315129E4 (~0.123, ~0.123E2, 0.123E2): 0.138129E2 0.138129E2 (~0.123, ~0.123E2, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (~0.123, ~0.123E2, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (~0.123, ~0.123E2, 0.123E1): 0.27429E1 0.27429E1 (~0.123, ~0.123E2, 0.123): 0.16359000000000001E1 0.16359000000000001E1 (~0.123, ~0.123E2, 0.123E~2): 0.151413E1 0.151413E1 (~0.123, ~0.123E2, 0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, 0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, 0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, 0.0): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (~0.123, ~0.123E2, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123, ~0.123E2, ~0.3141592653589793E1): ~0.1628692653589793E1 ~0.1628692653589793E1 (~0.123, ~0.123E2, ~0.2718281828459045E1): ~0.1205381828459045E1 ~0.1205381828459045E1 (~0.123, ~0.123E2, ~0.123E1): 0.2829000000000001 0.2829000000000001 (~0.123, ~0.123E2, ~0.123): 0.13899000000000001E1 0.13899000000000001E1 (~0.123, ~0.123E2, ~0.123E~2): 0.151167E1 0.151167E1 (~0.123, ~0.123E2, ~0.22250738585072014E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, ~0.11125369292536007E~307): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, ~0.5E~323): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.123E2, ~0.0): 0.15129000000000001E1 0.15129000000000001E1 (~0.123, ~0.3141592653589793E1, 0.123E4): 0.12303864158963916E4 0.12303864158963916E4 (~0.123, ~0.3141592653589793E1, 0.123E2): 0.12686415896391546E2 0.12686415896391546E2 (~0.123, ~0.3141592653589793E1, 0.3141592653589793E1): 0.35280085499813376E1 0.35280085499813376E1 (~0.123, ~0.3141592653589793E1, 0.2718281828459045E1): 0.31046977248505896E1 0.31046977248505896E1 (~0.123, ~0.3141592653589793E1, 0.123E1): 0.16164158963915445E1 0.16164158963915445E1 (~0.123, ~0.3141592653589793E1, 0.123): 0.5094158963915445 0.5094158963915445 (~0.123, ~0.3141592653589793E1, 0.123E~2): 0.38764589639154456 0.38764589639154456 (~0.123, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, 0.5E~323): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, 0.0): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, ~0.123E4): ~0.12296135841036084E4 ~0.12296135841036084E4 (~0.123, ~0.3141592653589793E1, ~0.123E2): ~0.11913584103608455E2 ~0.11913584103608455E2 (~0.123, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.27551767571982486E1 ~0.27551767571982486E1 (~0.123, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.23318659320675006E1 ~0.23318659320675006E1 (~0.123, ~0.3141592653589793E1, ~0.123E1): ~0.8435841036084555 ~0.8435841036084555 (~0.123, ~0.3141592653589793E1, ~0.123): 0.26341589639154456 0.26341589639154456 (~0.123, ~0.3141592653589793E1, ~0.123E~2): 0.38518589639154455 0.38518589639154455 (~0.123, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, ~0.5E~323): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.3141592653589793E1, ~0.0): 0.38641589639154456 0.38641589639154456 (~0.123, ~0.2718281828459045E1, 0.123E4): 0.12303343486649005E4 0.12303343486649005E4 (~0.123, ~0.2718281828459045E1, 0.123E2): 0.12634348664900463E2 0.12634348664900463E2 (~0.123, ~0.2718281828459045E1, 0.3141592653589793E1): 0.34759413184902557E1 0.34759413184902557E1 (~0.123, ~0.2718281828459045E1, 0.2718281828459045E1): 0.30526304933595076E1 0.30526304933595076E1 (~0.123, ~0.2718281828459045E1, 0.123E1): 0.15643486649004625E1 0.15643486649004625E1 (~0.123, ~0.2718281828459045E1, 0.123): 0.45734866490046255 0.45734866490046255 (~0.123, ~0.2718281828459045E1, 0.123E~2): 0.33557866490046256 0.33557866490046256 (~0.123, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, 0.5E~323): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, 0.0): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, ~0.123E4): ~0.12296656513350995E4 ~0.12296656513350995E4 (~0.123, ~0.2718281828459045E1, ~0.123E2): ~0.11965651335099539E2 ~0.11965651335099539E2 (~0.123, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.28072439886893306E1 ~0.28072439886893306E1 (~0.123, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.23839331635585825E1 ~0.23839331635585825E1 (~0.123, ~0.2718281828459045E1, ~0.123E1): ~0.8956513350995374 ~0.8956513350995374 (~0.123, ~0.2718281828459045E1, ~0.123): 0.21134866490046253 0.21134866490046253 (~0.123, ~0.2718281828459045E1, ~0.123E~2): 0.33311866490046255 0.33311866490046255 (~0.123, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, ~0.5E~323): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.2718281828459045E1, ~0.0): 0.33434866490046256 0.33434866490046256 (~0.123, ~0.123E1, 0.123E4): 0.123015129E4 0.123015129E4 (~0.123, ~0.123E1, 0.123E2): 0.1245129E2 0.1245129E2 (~0.123, ~0.123E1, 0.3141592653589793E1): 0.3292882653589793E1 0.3292882653589793E1 (~0.123, ~0.123E1, 0.2718281828459045E1): 0.2869571828459045E1 0.2869571828459045E1 (~0.123, ~0.123E1, 0.123E1): 0.138129E1 0.138129E1 (~0.123, ~0.123E1, 0.123): 0.27429 0.27429 (~0.123, ~0.123E1, 0.123E~2): 0.15252 0.15252 (~0.123, ~0.123E1, 0.22250738585072014E~307): 0.15129 0.15129 (~0.123, ~0.123E1, 0.11125369292536007E~307): 0.15129 0.15129 (~0.123, ~0.123E1, 0.5E~323): 0.15129 0.15129 (~0.123, ~0.123E1, 0.0): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.123E4): ~0.122984871E4 ~0.122984871E4 (~0.123, ~0.123E1, ~0.123E2): ~0.12148710000000001E2 ~0.12148710000000001E2 (~0.123, ~0.123E1, ~0.3141592653589793E1): ~0.2990302653589793E1 ~0.2990302653589793E1 (~0.123, ~0.123E1, ~0.2718281828459045E1): ~0.2566991828459045E1 ~0.2566991828459045E1 (~0.123, ~0.123E1, ~0.123E1): ~0.107871E1 ~0.107871E1 (~0.123, ~0.123E1, ~0.123): 0.28289999999999996E~1 0.28289999999999996E~1 (~0.123, ~0.123E1, ~0.123E~2): 0.15006 0.15006 (~0.123, ~0.123E1, ~0.22250738585072014E~307): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.11125369292536007E~307): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.5E~323): 0.15129 0.15129 (~0.123, ~0.123E1, ~0.0): 0.15129 0.15129 (~0.123, ~0.123, 0.123E4): 0.1230015129E4 0.1230015129E4 (~0.123, ~0.123, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123, ~0.123, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (~0.123, ~0.123, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (~0.123, ~0.123, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123, ~0.123, 0.123): 0.138129 0.138129 (~0.123, ~0.123, 0.123E~2): 0.16359E~1 0.16359E~1 (~0.123, ~0.123, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, 0.5E~323): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, 0.0): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (~0.123, ~0.123, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123, ~0.123, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (~0.123, ~0.123, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (~0.123, ~0.123, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123, ~0.123, ~0.123): ~0.107871 ~0.107871 (~0.123, ~0.123, ~0.123E~2): 0.13899E~1 0.13899E~1 (~0.123, ~0.123, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, ~0.5E~323): 0.15129E~1 0.15129E~1 (~0.123, ~0.123, ~0.0): 0.15129E~1 0.15129E~1 (~0.123, ~0.123E~2, 0.123E4): 0.123000015129E4 0.123000015129E4 (~0.123, ~0.123E~2, 0.123E2): 0.1230015129E2 0.1230015129E2 (~0.123, ~0.123E~2, 0.3141592653589793E1): 0.3141743943589793E1 0.3141743943589793E1 (~0.123, ~0.123E~2, 0.2718281828459045E1): 0.2718433118459045E1 0.2718433118459045E1 (~0.123, ~0.123E~2, 0.123E1): 0.123015129E1 0.123015129E1 (~0.123, ~0.123E~2, 0.123): 0.12315129 0.12315129 (~0.123, ~0.123E~2, 0.123E~2): 0.13812899999999999E~2 0.13812899999999999E~2 (~0.123, ~0.123E~2, 0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.5E~323): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, 0.0): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.123E4): ~0.122999984871E4 ~0.122999984871E4 (~0.123, ~0.123E~2, ~0.123E2): ~0.12299848710000001E2 ~0.12299848710000001E2 (~0.123, ~0.123E~2, ~0.3141592653589793E1): ~0.31414413635897933E1 ~0.31414413635897933E1 (~0.123, ~0.123E~2, ~0.2718281828459045E1): ~0.27181305384590453E1 ~0.27181305384590453E1 (~0.123, ~0.123E~2, ~0.123E1): ~0.122984871E1 ~0.122984871E1 (~0.123, ~0.123E~2, ~0.123): ~0.12284871 ~0.12284871 (~0.123, ~0.123E~2, ~0.123E~2): ~0.107871E~2 ~0.107871E~2 (~0.123, ~0.123E~2, ~0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.5E~323): 0.15129E~3 0.15129E~3 (~0.123, ~0.123E~2, ~0.0): 0.15129E~3 0.15129E~3 (~0.123, ~0.11125369292536007E~307, 0.22250738585072014E~307): 0.23619159008053945E~307 0.23619159008053945E~307 (~0.123, ~0.11125369292536007E~307, 0.11125369292536007E~307): 0.1249378971551794E~307 0.1249378971551794E~307 (~0.123, ~0.11125369292536007E~307, 0.5E~323): 0.136842042298193E~308 0.136842042298193E~308 (~0.123, ~0.11125369292536007E~307, 0.0): 0.136842042298193E~308 0.136842042298193E~308 (~0.123, ~0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.20882318162090083E~307 ~0.20882318162090083E~307 (~0.123, ~0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.9756948869554076E~308 ~0.9756948869554076E~308 (~0.123, ~0.11125369292536007E~307, ~0.5E~323): 0.136842042298192E~308 0.136842042298192E~308 (~0.123, ~0.11125369292536007E~307, ~0.0): 0.136842042298193E~308 0.136842042298193E~308 (~0.123, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.123, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.123, ~0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (~0.123, ~0.5E~323, 0.0): 0.0 0.0 (~0.123, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.123, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.123, ~0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.123, ~0.5E~323, ~0.0): 0.0 0.0 (~0.123E~2, 0.17976931348623157E309, 0.17976931348623157E309): 0.17954819723064351E309 0.17954819723064351E309 (~0.123E~2, 0.17976931348623157E309, 0.8988465674311579E308): 0.8966354048752772E308 0.8966354048752772E308 (~0.123E~2, 0.17976931348623157E309, 0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, 0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.17976931348623157E309): ~inf ~inf (~0.123E~2, 0.17976931348623157E309, ~0.8988465674311579E308): ~0.9010577299870385E308 ~0.9010577299870385E308 (~0.123E~2, 0.17976931348623157E309, ~0.123E4): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.123E2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.3141592653589793E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.2718281828459045E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.123E1): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.123): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.123E~2): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.22250738585072014E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.11125369292536007E~307): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.5E~323): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.17976931348623157E309, ~0.0): ~0.2211162555880648E306 ~0.2211162555880648E306 (~0.123E~2, 0.8988465674311579E308, 0.17976931348623157E309): 0.17965875535843753E309 0.17965875535843753E309 (~0.123E~2, 0.8988465674311579E308, 0.8988465674311579E308): 0.8977409861532176E308 0.8977409861532176E308 (~0.123E~2, 0.8988465674311579E308, 0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, 0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.17976931348623157E309): ~inf ~inf (~0.123E~2, 0.8988465674311579E308, ~0.8988465674311579E308): ~0.8999521487090981E308 ~0.8999521487090981E308 (~0.123E~2, 0.8988465674311579E308, ~0.123E4): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.123E2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.123E1): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.123): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.123E~2): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.22250738585072014E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.11125369292536007E~307): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.5E~323): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.8988465674311579E308, ~0.0): ~0.1105581277940324E306 ~0.1105581277940324E306 (~0.123E~2, 0.123E4, 0.123E4): 0.12284871E4 0.12284871E4 (~0.123E~2, 0.123E4, 0.123E2): 0.107871E2 0.107871E2 (~0.123E~2, 0.123E4, 0.3141592653589793E1): 0.16286926535897932E1 0.16286926535897932E1 (~0.123E~2, 0.123E4, 0.2718281828459045E1): 0.12053818284590452E1 0.12053818284590452E1 (~0.123E~2, 0.123E4, 0.123E1): ~0.2829 ~0.2829 (~0.123E~2, 0.123E4, 0.123): ~0.13899E1 ~0.13899E1 (~0.123E~2, 0.123E4, 0.123E~2): ~0.151167E1 ~0.151167E1 (~0.123E~2, 0.123E4, 0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, 0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, 0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, 0.0): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, ~0.123E4): ~0.12315129E4 ~0.12315129E4 (~0.123E~2, 0.123E4, ~0.123E2): ~0.138129E2 ~0.138129E2 (~0.123E~2, 0.123E4, ~0.3141592653589793E1): ~0.4654492653589793E1 ~0.4654492653589793E1 (~0.123E~2, 0.123E4, ~0.2718281828459045E1): ~0.4231181828459045E1 ~0.4231181828459045E1 (~0.123E~2, 0.123E4, ~0.123E1): ~0.27429E1 ~0.27429E1 (~0.123E~2, 0.123E4, ~0.123): ~0.16359E1 ~0.16359E1 (~0.123E~2, 0.123E4, ~0.123E~2): ~0.151413E1 ~0.151413E1 (~0.123E~2, 0.123E4, ~0.22250738585072014E~307): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, ~0.11125369292536007E~307): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, ~0.5E~323): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E4, ~0.0): ~0.15129E1 ~0.15129E1 (~0.123E~2, 0.123E2, 0.123E4): 0.1229984871E4 0.1229984871E4 (~0.123E~2, 0.123E2, 0.123E2): 0.12284871E2 0.12284871E2 (~0.123E~2, 0.123E2, 0.3141592653589793E1): 0.3126463653589793E1 0.3126463653589793E1 (~0.123E~2, 0.123E2, 0.2718281828459045E1): 0.2703152828459045E1 0.2703152828459045E1 (~0.123E~2, 0.123E2, 0.123E1): 0.1214871E1 0.1214871E1 (~0.123E~2, 0.123E2, 0.123): 0.107871 0.107871 (~0.123E~2, 0.123E2, 0.123E~2): ~0.13899E~1 ~0.13899E~1 (~0.123E~2, 0.123E2, 0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, 0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, 0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, 0.0): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, ~0.123E4): ~0.1230015129E4 ~0.1230015129E4 (~0.123E~2, 0.123E2, ~0.123E2): ~0.12315129E2 ~0.12315129E2 (~0.123E~2, 0.123E2, ~0.3141592653589793E1): ~0.3156721653589793E1 ~0.3156721653589793E1 (~0.123E~2, 0.123E2, ~0.2718281828459045E1): ~0.2733410828459045E1 ~0.2733410828459045E1 (~0.123E~2, 0.123E2, ~0.123E1): ~0.1245129E1 ~0.1245129E1 (~0.123E~2, 0.123E2, ~0.123): ~0.138129 ~0.138129 (~0.123E~2, 0.123E2, ~0.123E~2): ~0.16359000000000002E~1 ~0.16359000000000002E~1 (~0.123E~2, 0.123E2, ~0.22250738585072014E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, ~0.11125369292536007E~307): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, ~0.5E~323): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.123E2, ~0.0): ~0.15129E~1 ~0.15129E~1 (~0.123E~2, 0.3141592653589793E1, 0.123E4): 0.1229996135841036E4 0.1229996135841036E4 (~0.123E~2, 0.3141592653589793E1, 0.123E2): 0.12296135841036085E2 0.12296135841036085E2 (~0.123E~2, 0.3141592653589793E1, 0.3141592653589793E1): 0.31377284946258777E1 0.31377284946258777E1 (~0.123E~2, 0.3141592653589793E1, 0.2718281828459045E1): 0.27144176694951296E1 0.27144176694951296E1 (~0.123E~2, 0.3141592653589793E1, 0.123E1): 0.12261358410360845E1 0.12261358410360845E1 (~0.123E~2, 0.3141592653589793E1, 0.123): 0.11913584103608456 0.11913584103608456 (~0.123E~2, 0.3141592653589793E1, 0.123E~2): ~0.26341589639154455E~2 ~0.26341589639154455E~2 (~0.123E~2, 0.3141592653589793E1, 0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, 0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, 0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, 0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, ~0.123E4): ~0.1230003864158964E4 ~0.1230003864158964E4 (~0.123E~2, 0.3141592653589793E1, ~0.123E2): ~0.12303864158963917E2 ~0.12303864158963917E2 (~0.123E~2, 0.3141592653589793E1, ~0.3141592653589793E1): ~0.31454568125537086E1 ~0.31454568125537086E1 (~0.123E~2, 0.3141592653589793E1, ~0.2718281828459045E1): ~0.27221459874229605E1 ~0.27221459874229605E1 (~0.123E~2, 0.3141592653589793E1, ~0.123E1): ~0.12338641589639154E1 ~0.12338641589639154E1 (~0.123E~2, 0.3141592653589793E1, ~0.123): ~0.12686415896391545 ~0.12686415896391545 (~0.123E~2, 0.3141592653589793E1, ~0.123E~2): ~0.5094158963915445E~2 ~0.5094158963915445E~2 (~0.123E~2, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, ~0.5E~323): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.3141592653589793E1, ~0.0): ~0.38641589639154456E~2 ~0.38641589639154456E~2 (~0.123E~2, 0.2718281828459045E1, 0.123E4): 0.1229996656513351E4 0.1229996656513351E4 (~0.123E~2, 0.2718281828459045E1, 0.123E2): 0.12296656513350996E2 0.12296656513350996E2 (~0.123E~2, 0.2718281828459045E1, 0.3141592653589793E1): 0.31382491669407884E1 0.31382491669407884E1 (~0.123E~2, 0.2718281828459045E1, 0.2718281828459045E1): 0.27149383418100403E1 0.27149383418100403E1 (~0.123E~2, 0.2718281828459045E1, 0.123E1): 0.12266565133509955E1 0.12266565133509955E1 (~0.123E~2, 0.2718281828459045E1, 0.123): 0.11965651335099538 0.11965651335099538 (~0.123E~2, 0.2718281828459045E1, 0.123E~2): ~0.21134866490046256E~2 ~0.21134866490046256E~2 (~0.123E~2, 0.2718281828459045E1, 0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, 0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, 0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, 0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, ~0.123E4): ~0.1230003343486649E4 ~0.1230003343486649E4 (~0.123E~2, 0.2718281828459045E1, ~0.123E2): ~0.12303343486649005E2 ~0.12303343486649005E2 (~0.123E~2, 0.2718281828459045E1, ~0.3141592653589793E1): ~0.3144936140238798E1 ~0.3144936140238798E1 (~0.123E~2, 0.2718281828459045E1, ~0.2718281828459045E1): ~0.272162531510805E1 ~0.272162531510805E1 (~0.123E~2, 0.2718281828459045E1, ~0.123E1): ~0.12333434866490045E1 ~0.12333434866490045E1 (~0.123E~2, 0.2718281828459045E1, ~0.123): ~0.12634348664900463 ~0.12634348664900463 (~0.123E~2, 0.2718281828459045E1, ~0.123E~2): ~0.4573486649004625E~2 ~0.4573486649004625E~2 (~0.123E~2, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, ~0.5E~323): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.2718281828459045E1, ~0.0): ~0.33434866490046253E~2 ~0.33434866490046253E~2 (~0.123E~2, 0.123E1, 0.123E4): 0.12299984871E4 0.12299984871E4 (~0.123E~2, 0.123E1, 0.123E2): 0.12298487100000001E2 0.12298487100000001E2 (~0.123E~2, 0.123E1, 0.3141592653589793E1): 0.31400797535897933E1 0.31400797535897933E1 (~0.123E~2, 0.123E1, 0.2718281828459045E1): 0.27167689284590453E1 0.27167689284590453E1 (~0.123E~2, 0.123E1, 0.123E1): 0.12284871E1 0.12284871E1 (~0.123E~2, 0.123E1, 0.123): 0.1214871 0.1214871 (~0.123E~2, 0.123E1, 0.123E~2): ~0.2829E~3 ~0.2829E~3 (~0.123E~2, 0.123E1, 0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, 0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, 0.5E~323): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, 0.0): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, ~0.123E4): ~0.12300015129E4 ~0.12300015129E4 (~0.123E~2, 0.123E1, ~0.123E2): ~0.123015129E2 ~0.123015129E2 (~0.123E~2, 0.123E1, ~0.3141592653589793E1): ~0.3143105553589793E1 ~0.3143105553589793E1 (~0.123E~2, 0.123E1, ~0.2718281828459045E1): ~0.2719794728459045E1 ~0.2719794728459045E1 (~0.123E~2, 0.123E1, ~0.123E1): ~0.12315129E1 ~0.12315129E1 (~0.123E~2, 0.123E1, ~0.123): ~0.1245129 ~0.1245129 (~0.123E~2, 0.123E1, ~0.123E~2): ~0.27429E~2 ~0.27429E~2 (~0.123E~2, 0.123E1, ~0.22250738585072014E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, ~0.11125369292536007E~307): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, ~0.5E~323): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123E1, ~0.0): ~0.15129E~2 ~0.15129E~2 (~0.123E~2, 0.123, 0.123E4): 0.122999984871E4 0.122999984871E4 (~0.123E~2, 0.123, 0.123E2): 0.12299848710000001E2 0.12299848710000001E2 (~0.123E~2, 0.123, 0.3141592653589793E1): 0.31414413635897933E1 0.31414413635897933E1 (~0.123E~2, 0.123, 0.2718281828459045E1): 0.27181305384590453E1 0.27181305384590453E1 (~0.123E~2, 0.123, 0.123E1): 0.122984871E1 0.122984871E1 (~0.123E~2, 0.123, 0.123): 0.12284871 0.12284871 (~0.123E~2, 0.123, 0.123E~2): 0.107871E~2 0.107871E~2 (~0.123E~2, 0.123, 0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.5E~323): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, 0.0): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.123E4): ~0.123000015129E4 ~0.123000015129E4 (~0.123E~2, 0.123, ~0.123E2): ~0.1230015129E2 ~0.1230015129E2 (~0.123E~2, 0.123, ~0.3141592653589793E1): ~0.3141743943589793E1 ~0.3141743943589793E1 (~0.123E~2, 0.123, ~0.2718281828459045E1): ~0.2718433118459045E1 ~0.2718433118459045E1 (~0.123E~2, 0.123, ~0.123E1): ~0.123015129E1 ~0.123015129E1 (~0.123E~2, 0.123, ~0.123): ~0.12315129 ~0.12315129 (~0.123E~2, 0.123, ~0.123E~2): ~0.13812899999999999E~2 ~0.13812899999999999E~2 (~0.123E~2, 0.123, ~0.22250738585072014E~307): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.11125369292536007E~307): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.5E~323): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123, ~0.0): ~0.15129E~3 ~0.15129E~3 (~0.123E~2, 0.123E~2, 0.123E4): 0.12299999984871E4 0.12299999984871E4 (~0.123E~2, 0.123E~2, 0.123E2): 0.122999984871E2 0.122999984871E2 (~0.123E~2, 0.123E~2, 0.3141592653589793E1): 0.3141591140689793E1 0.3141591140689793E1 (~0.123E~2, 0.123E~2, 0.2718281828459045E1): 0.2718280315559045E1 0.2718280315559045E1 (~0.123E~2, 0.123E~2, 0.123E1): 0.12299984871E1 0.12299984871E1 (~0.123E~2, 0.123E~2, 0.123): 0.1229984871 0.1229984871 (~0.123E~2, 0.123E~2, 0.123E~2): 0.12284871E~2 0.12284871E~2 (~0.123E~2, 0.123E~2, 0.22250738585072014E~307): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, 0.11125369292536007E~307): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, 0.5E~323): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, 0.0): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, ~0.123E4): ~0.12300000015129E4 ~0.12300000015129E4 (~0.123E~2, 0.123E~2, ~0.123E2): ~0.12300001512900002E2 ~0.12300001512900002E2 (~0.123E~2, 0.123E~2, ~0.3141592653589793E1): ~0.3141594166489793E1 ~0.3141594166489793E1 (~0.123E~2, 0.123E~2, ~0.2718281828459045E1): ~0.2718283341359045E1 ~0.2718283341359045E1 (~0.123E~2, 0.123E~2, ~0.123E1): ~0.12300015129E1 ~0.12300015129E1 (~0.123E~2, 0.123E~2, ~0.123): ~0.1230015129 ~0.1230015129 (~0.123E~2, 0.123E~2, ~0.123E~2): ~0.12315129E~2 ~0.12315129E~2 (~0.123E~2, 0.123E~2, ~0.22250738585072014E~307): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, ~0.11125369292536007E~307): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, ~0.5E~323): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.123E~2, ~0.0): ~0.15129E~5 ~0.15129E~5 (~0.123E~2, 0.22250738585072014E~307, 0.22250738585072014E~307): 0.22223370176612374E~307 0.22223370176612374E~307 (~0.123E~2, 0.22250738585072014E~307, 0.11125369292536007E~307): 0.11098000884076367E~307 0.11098000884076367E~307 (~0.123E~2, 0.22250738585072014E~307, 0.5E~323): ~0.27368408459635E~310 ~0.27368408459635E~310 (~0.123E~2, 0.22250738585072014E~307, 0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (~0.123E~2, 0.22250738585072014E~307, ~0.22250738585072014E~307): ~0.22278106993531654E~307 ~0.22278106993531654E~307 (~0.123E~2, 0.22250738585072014E~307, ~0.11125369292536007E~307): ~0.11152737700995647E~307 ~0.11152737700995647E~307 (~0.123E~2, 0.22250738585072014E~307, ~0.5E~323): ~0.27368408459645E~310 ~0.27368408459645E~310 (~0.123E~2, 0.22250738585072014E~307, ~0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (~0.123E~2, 0.11125369292536007E~307, 0.22250738585072014E~307): 0.22237054380842194E~307 0.22237054380842194E~307 (~0.123E~2, 0.11125369292536007E~307, 0.11125369292536007E~307): 0.11111685088306187E~307 0.11111685088306187E~307 (~0.123E~2, 0.11125369292536007E~307, 0.5E~323): ~0.13684204229815E~310 ~0.13684204229815E~310 (~0.123E~2, 0.11125369292536007E~307, 0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (~0.123E~2, 0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.22264422789301834E~307 ~0.22264422789301834E~307 (~0.123E~2, 0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.11139053496765827E~307 ~0.11139053496765827E~307 (~0.123E~2, 0.11125369292536007E~307, ~0.5E~323): ~0.13684204229825E~310 ~0.13684204229825E~310 (~0.123E~2, 0.11125369292536007E~307, ~0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (~0.123E~2, 0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.123E~2, 0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.123E~2, 0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (~0.123E~2, 0.5E~323, 0.0): ~0.0 ~0.0 (~0.123E~2, 0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.123E~2, 0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.123E~2, 0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.123E~2, 0.5E~323, ~0.0): ~0.0 ~0.0 (~0.123E~2, ~0.17976931348623157E309, 0.17976931348623157E309): inf inf (~0.123E~2, ~0.17976931348623157E309, 0.8988465674311579E308): 0.9010577299870385E308 0.9010577299870385E308 (~0.123E~2, ~0.17976931348623157E309, 0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.123): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, 0.0): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.17976931348623157E309): ~0.17954819723064351E309 ~0.17954819723064351E309 (~0.123E~2, ~0.17976931348623157E309, ~0.8988465674311579E308): ~0.8966354048752772E308 ~0.8966354048752772E308 (~0.123E~2, ~0.17976931348623157E309, ~0.123E4): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.123E2): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.3141592653589793E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.2718281828459045E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.123E1): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.123): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.123E~2): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.22250738585072014E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.11125369292536007E~307): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.5E~323): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.17976931348623157E309, ~0.0): 0.2211162555880648E306 0.2211162555880648E306 (~0.123E~2, ~0.8988465674311579E308, 0.17976931348623157E309): inf inf (~0.123E~2, ~0.8988465674311579E308, 0.8988465674311579E308): 0.8999521487090981E308 0.8999521487090981E308 (~0.123E~2, ~0.8988465674311579E308, 0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.123): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, 0.0): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.17976931348623157E309): ~0.17965875535843753E309 ~0.17965875535843753E309 (~0.123E~2, ~0.8988465674311579E308, ~0.8988465674311579E308): ~0.8977409861532176E308 ~0.8977409861532176E308 (~0.123E~2, ~0.8988465674311579E308, ~0.123E4): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.123E2): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.3141592653589793E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.2718281828459045E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.123E1): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.123): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.123E~2): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.22250738585072014E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.11125369292536007E~307): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.5E~323): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.8988465674311579E308, ~0.0): 0.1105581277940324E306 0.1105581277940324E306 (~0.123E~2, ~0.123E4, 0.123E4): 0.12315129E4 0.12315129E4 (~0.123E~2, ~0.123E4, 0.123E2): 0.138129E2 0.138129E2 (~0.123E~2, ~0.123E4, 0.3141592653589793E1): 0.4654492653589793E1 0.4654492653589793E1 (~0.123E~2, ~0.123E4, 0.2718281828459045E1): 0.4231181828459045E1 0.4231181828459045E1 (~0.123E~2, ~0.123E4, 0.123E1): 0.27429E1 0.27429E1 (~0.123E~2, ~0.123E4, 0.123): 0.16359E1 0.16359E1 (~0.123E~2, ~0.123E4, 0.123E~2): 0.151413E1 0.151413E1 (~0.123E~2, ~0.123E4, 0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, 0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, 0.5E~323): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, 0.0): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, ~0.123E4): ~0.12284871E4 ~0.12284871E4 (~0.123E~2, ~0.123E4, ~0.123E2): ~0.107871E2 ~0.107871E2 (~0.123E~2, ~0.123E4, ~0.3141592653589793E1): ~0.16286926535897932E1 ~0.16286926535897932E1 (~0.123E~2, ~0.123E4, ~0.2718281828459045E1): ~0.12053818284590452E1 ~0.12053818284590452E1 (~0.123E~2, ~0.123E4, ~0.123E1): 0.2829 0.2829 (~0.123E~2, ~0.123E4, ~0.123): 0.13899E1 0.13899E1 (~0.123E~2, ~0.123E4, ~0.123E~2): 0.151167E1 0.151167E1 (~0.123E~2, ~0.123E4, ~0.22250738585072014E~307): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, ~0.11125369292536007E~307): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, ~0.5E~323): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E4, ~0.0): 0.15129E1 0.15129E1 (~0.123E~2, ~0.123E2, 0.123E4): 0.1230015129E4 0.1230015129E4 (~0.123E~2, ~0.123E2, 0.123E2): 0.12315129E2 0.12315129E2 (~0.123E~2, ~0.123E2, 0.3141592653589793E1): 0.3156721653589793E1 0.3156721653589793E1 (~0.123E~2, ~0.123E2, 0.2718281828459045E1): 0.2733410828459045E1 0.2733410828459045E1 (~0.123E~2, ~0.123E2, 0.123E1): 0.1245129E1 0.1245129E1 (~0.123E~2, ~0.123E2, 0.123): 0.138129 0.138129 (~0.123E~2, ~0.123E2, 0.123E~2): 0.16359000000000002E~1 0.16359000000000002E~1 (~0.123E~2, ~0.123E2, 0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, 0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, 0.5E~323): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, 0.0): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, ~0.123E4): ~0.1229984871E4 ~0.1229984871E4 (~0.123E~2, ~0.123E2, ~0.123E2): ~0.12284871E2 ~0.12284871E2 (~0.123E~2, ~0.123E2, ~0.3141592653589793E1): ~0.3126463653589793E1 ~0.3126463653589793E1 (~0.123E~2, ~0.123E2, ~0.2718281828459045E1): ~0.2703152828459045E1 ~0.2703152828459045E1 (~0.123E~2, ~0.123E2, ~0.123E1): ~0.1214871E1 ~0.1214871E1 (~0.123E~2, ~0.123E2, ~0.123): ~0.107871 ~0.107871 (~0.123E~2, ~0.123E2, ~0.123E~2): 0.13899E~1 0.13899E~1 (~0.123E~2, ~0.123E2, ~0.22250738585072014E~307): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, ~0.11125369292536007E~307): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, ~0.5E~323): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.123E2, ~0.0): 0.15129E~1 0.15129E~1 (~0.123E~2, ~0.3141592653589793E1, 0.123E4): 0.1230003864158964E4 0.1230003864158964E4 (~0.123E~2, ~0.3141592653589793E1, 0.123E2): 0.12303864158963917E2 0.12303864158963917E2 (~0.123E~2, ~0.3141592653589793E1, 0.3141592653589793E1): 0.31454568125537086E1 0.31454568125537086E1 (~0.123E~2, ~0.3141592653589793E1, 0.2718281828459045E1): 0.27221459874229605E1 0.27221459874229605E1 (~0.123E~2, ~0.3141592653589793E1, 0.123E1): 0.12338641589639154E1 0.12338641589639154E1 (~0.123E~2, ~0.3141592653589793E1, 0.123): 0.12686415896391545 0.12686415896391545 (~0.123E~2, ~0.3141592653589793E1, 0.123E~2): 0.5094158963915445E~2 0.5094158963915445E~2 (~0.123E~2, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, 0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, 0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, ~0.123E4): ~0.1229996135841036E4 ~0.1229996135841036E4 (~0.123E~2, ~0.3141592653589793E1, ~0.123E2): ~0.12296135841036085E2 ~0.12296135841036085E2 (~0.123E~2, ~0.3141592653589793E1, ~0.3141592653589793E1): ~0.31377284946258777E1 ~0.31377284946258777E1 (~0.123E~2, ~0.3141592653589793E1, ~0.2718281828459045E1): ~0.27144176694951296E1 ~0.27144176694951296E1 (~0.123E~2, ~0.3141592653589793E1, ~0.123E1): ~0.12261358410360845E1 ~0.12261358410360845E1 (~0.123E~2, ~0.3141592653589793E1, ~0.123): ~0.11913584103608456 ~0.11913584103608456 (~0.123E~2, ~0.3141592653589793E1, ~0.123E~2): 0.26341589639154455E~2 0.26341589639154455E~2 (~0.123E~2, ~0.3141592653589793E1, ~0.22250738585072014E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, ~0.11125369292536007E~307): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, ~0.5E~323): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.3141592653589793E1, ~0.0): 0.38641589639154456E~2 0.38641589639154456E~2 (~0.123E~2, ~0.2718281828459045E1, 0.123E4): 0.1230003343486649E4 0.1230003343486649E4 (~0.123E~2, ~0.2718281828459045E1, 0.123E2): 0.12303343486649005E2 0.12303343486649005E2 (~0.123E~2, ~0.2718281828459045E1, 0.3141592653589793E1): 0.3144936140238798E1 0.3144936140238798E1 (~0.123E~2, ~0.2718281828459045E1, 0.2718281828459045E1): 0.272162531510805E1 0.272162531510805E1 (~0.123E~2, ~0.2718281828459045E1, 0.123E1): 0.12333434866490045E1 0.12333434866490045E1 (~0.123E~2, ~0.2718281828459045E1, 0.123): 0.12634348664900463 0.12634348664900463 (~0.123E~2, ~0.2718281828459045E1, 0.123E~2): 0.4573486649004625E~2 0.4573486649004625E~2 (~0.123E~2, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, 0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, 0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, ~0.123E4): ~0.1229996656513351E4 ~0.1229996656513351E4 (~0.123E~2, ~0.2718281828459045E1, ~0.123E2): ~0.12296656513350996E2 ~0.12296656513350996E2 (~0.123E~2, ~0.2718281828459045E1, ~0.3141592653589793E1): ~0.31382491669407884E1 ~0.31382491669407884E1 (~0.123E~2, ~0.2718281828459045E1, ~0.2718281828459045E1): ~0.27149383418100403E1 ~0.27149383418100403E1 (~0.123E~2, ~0.2718281828459045E1, ~0.123E1): ~0.12266565133509955E1 ~0.12266565133509955E1 (~0.123E~2, ~0.2718281828459045E1, ~0.123): ~0.11965651335099538 ~0.11965651335099538 (~0.123E~2, ~0.2718281828459045E1, ~0.123E~2): 0.21134866490046256E~2 0.21134866490046256E~2 (~0.123E~2, ~0.2718281828459045E1, ~0.22250738585072014E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, ~0.11125369292536007E~307): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, ~0.5E~323): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.2718281828459045E1, ~0.0): 0.33434866490046253E~2 0.33434866490046253E~2 (~0.123E~2, ~0.123E1, 0.123E4): 0.12300015129E4 0.12300015129E4 (~0.123E~2, ~0.123E1, 0.123E2): 0.123015129E2 0.123015129E2 (~0.123E~2, ~0.123E1, 0.3141592653589793E1): 0.3143105553589793E1 0.3143105553589793E1 (~0.123E~2, ~0.123E1, 0.2718281828459045E1): 0.2719794728459045E1 0.2719794728459045E1 (~0.123E~2, ~0.123E1, 0.123E1): 0.12315129E1 0.12315129E1 (~0.123E~2, ~0.123E1, 0.123): 0.1245129 0.1245129 (~0.123E~2, ~0.123E1, 0.123E~2): 0.27429E~2 0.27429E~2 (~0.123E~2, ~0.123E1, 0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, 0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, 0.5E~323): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, 0.0): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, ~0.123E4): ~0.12299984871E4 ~0.12299984871E4 (~0.123E~2, ~0.123E1, ~0.123E2): ~0.12298487100000001E2 ~0.12298487100000001E2 (~0.123E~2, ~0.123E1, ~0.3141592653589793E1): ~0.31400797535897933E1 ~0.31400797535897933E1 (~0.123E~2, ~0.123E1, ~0.2718281828459045E1): ~0.27167689284590453E1 ~0.27167689284590453E1 (~0.123E~2, ~0.123E1, ~0.123E1): ~0.12284871E1 ~0.12284871E1 (~0.123E~2, ~0.123E1, ~0.123): ~0.1214871 ~0.1214871 (~0.123E~2, ~0.123E1, ~0.123E~2): 0.2829E~3 0.2829E~3 (~0.123E~2, ~0.123E1, ~0.22250738585072014E~307): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, ~0.11125369292536007E~307): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, ~0.5E~323): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123E1, ~0.0): 0.15129E~2 0.15129E~2 (~0.123E~2, ~0.123, 0.123E4): 0.123000015129E4 0.123000015129E4 (~0.123E~2, ~0.123, 0.123E2): 0.1230015129E2 0.1230015129E2 (~0.123E~2, ~0.123, 0.3141592653589793E1): 0.3141743943589793E1 0.3141743943589793E1 (~0.123E~2, ~0.123, 0.2718281828459045E1): 0.2718433118459045E1 0.2718433118459045E1 (~0.123E~2, ~0.123, 0.123E1): 0.123015129E1 0.123015129E1 (~0.123E~2, ~0.123, 0.123): 0.12315129 0.12315129 (~0.123E~2, ~0.123, 0.123E~2): 0.13812899999999999E~2 0.13812899999999999E~2 (~0.123E~2, ~0.123, 0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.5E~323): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, 0.0): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.123E4): ~0.122999984871E4 ~0.122999984871E4 (~0.123E~2, ~0.123, ~0.123E2): ~0.12299848710000001E2 ~0.12299848710000001E2 (~0.123E~2, ~0.123, ~0.3141592653589793E1): ~0.31414413635897933E1 ~0.31414413635897933E1 (~0.123E~2, ~0.123, ~0.2718281828459045E1): ~0.27181305384590453E1 ~0.27181305384590453E1 (~0.123E~2, ~0.123, ~0.123E1): ~0.122984871E1 ~0.122984871E1 (~0.123E~2, ~0.123, ~0.123): ~0.12284871 ~0.12284871 (~0.123E~2, ~0.123, ~0.123E~2): ~0.107871E~2 ~0.107871E~2 (~0.123E~2, ~0.123, ~0.22250738585072014E~307): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.11125369292536007E~307): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.5E~323): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123, ~0.0): 0.15129E~3 0.15129E~3 (~0.123E~2, ~0.123E~2, 0.123E4): 0.12300000015129E4 0.12300000015129E4 (~0.123E~2, ~0.123E~2, 0.123E2): 0.12300001512900002E2 0.12300001512900002E2 (~0.123E~2, ~0.123E~2, 0.3141592653589793E1): 0.3141594166489793E1 0.3141594166489793E1 (~0.123E~2, ~0.123E~2, 0.2718281828459045E1): 0.2718283341359045E1 0.2718283341359045E1 (~0.123E~2, ~0.123E~2, 0.123E1): 0.12300015129E1 0.12300015129E1 (~0.123E~2, ~0.123E~2, 0.123): 0.1230015129 0.1230015129 (~0.123E~2, ~0.123E~2, 0.123E~2): 0.12315129E~2 0.12315129E~2 (~0.123E~2, ~0.123E~2, 0.22250738585072014E~307): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, 0.11125369292536007E~307): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, 0.5E~323): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, 0.0): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, ~0.123E4): ~0.12299999984871E4 ~0.12299999984871E4 (~0.123E~2, ~0.123E~2, ~0.123E2): ~0.122999984871E2 ~0.122999984871E2 (~0.123E~2, ~0.123E~2, ~0.3141592653589793E1): ~0.3141591140689793E1 ~0.3141591140689793E1 (~0.123E~2, ~0.123E~2, ~0.2718281828459045E1): ~0.2718280315559045E1 ~0.2718280315559045E1 (~0.123E~2, ~0.123E~2, ~0.123E1): ~0.12299984871E1 ~0.12299984871E1 (~0.123E~2, ~0.123E~2, ~0.123): ~0.1229984871 ~0.1229984871 (~0.123E~2, ~0.123E~2, ~0.123E~2): ~0.12284871E~2 ~0.12284871E~2 (~0.123E~2, ~0.123E~2, ~0.22250738585072014E~307): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, ~0.11125369292536007E~307): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, ~0.5E~323): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.123E~2, ~0.0): 0.15129E~5 0.15129E~5 (~0.123E~2, ~0.22250738585072014E~307, 0.22250738585072014E~307): 0.22278106993531654E~307 0.22278106993531654E~307 (~0.123E~2, ~0.22250738585072014E~307, 0.11125369292536007E~307): 0.11152737700995647E~307 0.11152737700995647E~307 (~0.123E~2, ~0.22250738585072014E~307, 0.5E~323): 0.27368408459645E~310 0.27368408459645E~310 (~0.123E~2, ~0.22250738585072014E~307, 0.0): 0.2736840845964E~310 0.2736840845964E~310 (~0.123E~2, ~0.22250738585072014E~307, ~0.22250738585072014E~307): ~0.22223370176612374E~307 ~0.22223370176612374E~307 (~0.123E~2, ~0.22250738585072014E~307, ~0.11125369292536007E~307): ~0.11098000884076367E~307 ~0.11098000884076367E~307 (~0.123E~2, ~0.22250738585072014E~307, ~0.5E~323): 0.27368408459635E~310 0.27368408459635E~310 (~0.123E~2, ~0.22250738585072014E~307, ~0.0): 0.2736840845964E~310 0.2736840845964E~310 (~0.123E~2, ~0.11125369292536007E~307, 0.22250738585072014E~307): 0.22264422789301834E~307 0.22264422789301834E~307 (~0.123E~2, ~0.11125369292536007E~307, 0.11125369292536007E~307): 0.11139053496765827E~307 0.11139053496765827E~307 (~0.123E~2, ~0.11125369292536007E~307, 0.5E~323): 0.13684204229825E~310 0.13684204229825E~310 (~0.123E~2, ~0.11125369292536007E~307, 0.0): 0.1368420422982E~310 0.1368420422982E~310 (~0.123E~2, ~0.11125369292536007E~307, ~0.22250738585072014E~307): ~0.22237054380842194E~307 ~0.22237054380842194E~307 (~0.123E~2, ~0.11125369292536007E~307, ~0.11125369292536007E~307): ~0.11111685088306187E~307 ~0.11111685088306187E~307 (~0.123E~2, ~0.11125369292536007E~307, ~0.5E~323): 0.13684204229815E~310 0.13684204229815E~310 (~0.123E~2, ~0.11125369292536007E~307, ~0.0): 0.1368420422982E~310 0.1368420422982E~310 (~0.123E~2, ~0.5E~323, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.123E~2, ~0.5E~323, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.123E~2, ~0.5E~323, 0.5E~323): 0.5E~323 0.5E~323 (~0.123E~2, ~0.5E~323, 0.0): 0.0 0.0 (~0.123E~2, ~0.5E~323, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.123E~2, ~0.5E~323, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.123E~2, ~0.5E~323, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.123E~2, ~0.5E~323, ~0.0): 0.0 0.0 (~0.22250738585072014E~307, 0.17976931348623157E309, 0.123E4): 0.1226E4 0.1226E4 (~0.22250738585072014E~307, 0.17976931348623157E309, 0.123E2): 0.83E1 0.83E1 (~0.22250738585072014E~307, 0.17976931348623157E309, 0.123): ~0.3877E1 ~0.3877E1 (~0.22250738585072014E~307, 0.17976931348623157E309, 0.123E~2): ~0.39987699999999995E1 ~0.39987699999999995E1 (~0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E4): ~0.1234E4 ~0.1234E4 (~0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E2): ~0.163E2 ~0.163E2 (~0.22250738585072014E~307, 0.17976931348623157E309, ~0.3141592653589793E1): ~0.7141592653589793E1 ~0.7141592653589793E1 (~0.22250738585072014E~307, 0.17976931348623157E309, ~0.123): ~0.4122999999999999E1 ~0.4122999999999999E1 (~0.22250738585072014E~307, 0.17976931348623157E309, ~0.123E~2): ~0.400123E1 ~0.400123E1 (~0.22250738585072014E~307, 0.8988465674311579E308, 0.123E4): 0.1228E4 0.1228E4 (~0.22250738585072014E~307, 0.8988465674311579E308, 0.123E2): 0.103E2 0.103E2 (~0.22250738585072014E~307, 0.8988465674311579E308, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E2): ~0.143E2 ~0.143E2 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (~0.22250738585072014E~307, 0.8988465674311579E308, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (~0.22250738585072014E~307, 0.123E4, 0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (~0.22250738585072014E~307, 0.123E4, ~0.5E~323): ~0.27368408459638577E~304 ~0.27368408459638577E~304 (~0.22250738585072014E~307, 0.123E2, 0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (~0.22250738585072014E~307, 0.123E2, ~0.5E~323): ~0.2736840845963858E~306 ~0.2736840845963858E~306 (~0.22250738585072014E~307, 0.3141592653589793E1, 0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (~0.22250738585072014E~307, 0.3141592653589793E1, ~0.5E~323): ~0.6990275687580919E~307 ~0.6990275687580919E~307 (~0.22250738585072014E~307, 0.2718281828459045E1, 0.5E~323): ~0.6048377836559377E~307 ~0.6048377836559377E~307 (~0.22250738585072014E~307, 0.2718281828459045E1, ~0.5E~323): ~0.6048377836559379E~307 ~0.6048377836559379E~307 (~0.22250738585072014E~307, 0.123E~2, 0.22250738585072014E~307): 0.22223370176612374E~307 0.22223370176612374E~307 (~0.22250738585072014E~307, 0.123E~2, 0.11125369292536007E~307): 0.11098000884076367E~307 0.11098000884076367E~307 (~0.22250738585072014E~307, 0.123E~2, 0.5E~323): ~0.27368408459635E~310 ~0.27368408459635E~310 (~0.22250738585072014E~307, 0.123E~2, 0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (~0.22250738585072014E~307, 0.123E~2, ~0.22250738585072014E~307): ~0.22278106993531654E~307 ~0.22278106993531654E~307 (~0.22250738585072014E~307, 0.123E~2, ~0.11125369292536007E~307): ~0.11152737700995647E~307 ~0.11152737700995647E~307 (~0.22250738585072014E~307, 0.123E~2, ~0.5E~323): ~0.27368408459645E~310 ~0.27368408459645E~310 (~0.22250738585072014E~307, 0.123E~2, ~0.0): ~0.2736840845964E~310 ~0.2736840845964E~310 (~0.22250738585072014E~307, 0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, 0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, 0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, 0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, 0.5E~323, 0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, 0.5E~323, ~0.0): ~0.0 ~0.0 (~0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E4): 0.1234E4 0.1234E4 (~0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E2): 0.163E2 0.163E2 (~0.22250738585072014E~307, ~0.17976931348623157E309, 0.3141592653589793E1): 0.7141592653589793E1 0.7141592653589793E1 (~0.22250738585072014E~307, ~0.17976931348623157E309, 0.123): 0.4122999999999999E1 0.4122999999999999E1 (~0.22250738585072014E~307, ~0.17976931348623157E309, 0.123E~2): 0.400123E1 0.400123E1 (~0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E4): ~0.1226E4 ~0.1226E4 (~0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E2): ~0.83E1 ~0.83E1 (~0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123): 0.3877E1 0.3877E1 (~0.22250738585072014E~307, ~0.17976931348623157E309, ~0.123E~2): 0.39987699999999995E1 0.39987699999999995E1 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E4): 0.1232E4 0.1232E4 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E2): 0.143E2 0.143E2 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (~0.22250738585072014E~307, ~0.8988465674311579E308, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (~0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E2): ~0.103E2 ~0.103E2 (~0.22250738585072014E~307, ~0.8988465674311579E308, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (~0.22250738585072014E~307, ~0.123E4, 0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (~0.22250738585072014E~307, ~0.123E4, ~0.5E~323): 0.27368408459638577E~304 0.27368408459638577E~304 (~0.22250738585072014E~307, ~0.123E2, 0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (~0.22250738585072014E~307, ~0.123E2, ~0.5E~323): 0.2736840845963858E~306 0.2736840845963858E~306 (~0.22250738585072014E~307, ~0.3141592653589793E1, 0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (~0.22250738585072014E~307, ~0.3141592653589793E1, ~0.5E~323): 0.6990275687580919E~307 0.6990275687580919E~307 (~0.22250738585072014E~307, ~0.2718281828459045E1, 0.5E~323): 0.6048377836559379E~307 0.6048377836559379E~307 (~0.22250738585072014E~307, ~0.2718281828459045E1, ~0.5E~323): 0.6048377836559377E~307 0.6048377836559377E~307 (~0.22250738585072014E~307, ~0.123E~2, 0.22250738585072014E~307): 0.22278106993531654E~307 0.22278106993531654E~307 (~0.22250738585072014E~307, ~0.123E~2, 0.11125369292536007E~307): 0.11152737700995647E~307 0.11152737700995647E~307 (~0.22250738585072014E~307, ~0.123E~2, 0.5E~323): 0.27368408459645E~310 0.27368408459645E~310 (~0.22250738585072014E~307, ~0.123E~2, 0.0): 0.2736840845964E~310 0.2736840845964E~310 (~0.22250738585072014E~307, ~0.123E~2, ~0.22250738585072014E~307): ~0.22223370176612374E~307 ~0.22223370176612374E~307 (~0.22250738585072014E~307, ~0.123E~2, ~0.11125369292536007E~307): ~0.11098000884076367E~307 ~0.11098000884076367E~307 (~0.22250738585072014E~307, ~0.123E~2, ~0.5E~323): 0.27368408459635E~310 0.27368408459635E~310 (~0.22250738585072014E~307, ~0.123E~2, ~0.0): 0.2736840845964E~310 0.2736840845964E~310 (~0.22250738585072014E~307, ~0.22250738585072014E~307, 0.0): 0.0 0.0 (~0.22250738585072014E~307, ~0.22250738585072014E~307, ~0.0): 0.0 0.0 (~0.22250738585072014E~307, ~0.11125369292536007E~307, 0.0): 0.0 0.0 (~0.22250738585072014E~307, ~0.11125369292536007E~307, ~0.0): 0.0 0.0 (~0.22250738585072014E~307, ~0.5E~323, 0.0): 0.0 0.0 (~0.22250738585072014E~307, ~0.5E~323, ~0.0): 0.0 0.0 (~0.11125369292536007E~307, 0.17976931348623157E309, 0.123E4): 0.1228E4 0.1228E4 (~0.11125369292536007E~307, 0.17976931348623157E309, 0.123E2): 0.103E2 0.103E2 (~0.11125369292536007E~307, 0.17976931348623157E309, 0.123E~2): ~0.19987699999999997E1 ~0.19987699999999997E1 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E4): ~0.1232E4 ~0.1232E4 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E2): ~0.143E2 ~0.143E2 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.3141592653589793E1): ~0.5141592653589793E1 ~0.5141592653589793E1 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.2718281828459045E1): ~0.4718281828459045E1 ~0.4718281828459045E1 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E1): ~0.32299999999999995E1 ~0.32299999999999995E1 (~0.11125369292536007E~307, 0.17976931348623157E309, ~0.123E~2): ~0.20012299999999996E1 ~0.20012299999999996E1 (~0.11125369292536007E~307, 0.8988465674311579E308, 0.123E4): 0.1229E4 0.1229E4 (~0.11125369292536007E~307, 0.8988465674311579E308, 0.123E2): 0.113E2 0.113E2 (~0.11125369292536007E~307, 0.8988465674311579E308, 0.3141592653589793E1): 0.2141592653589793E1 0.2141592653589793E1 (~0.11125369292536007E~307, 0.8988465674311579E308, 0.2718281828459045E1): 0.1718281828459045E1 0.1718281828459045E1 (~0.11125369292536007E~307, 0.8988465674311579E308, 0.123E~2): ~0.9987699999999999 ~0.9987699999999999 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E4): ~0.1231E4 ~0.1231E4 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E2): ~0.133E2 ~0.133E2 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.3141592653589793E1): ~0.4141592653589793E1 ~0.4141592653589793E1 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.2718281828459045E1): ~0.3718281828459045E1 ~0.3718281828459045E1 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E1): ~0.223E1 ~0.223E1 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.123): ~0.11229999999999998E1 ~0.11229999999999998E1 (~0.11125369292536007E~307, 0.8988465674311579E308, ~0.123E~2): ~0.10012299999999998E1 ~0.10012299999999998E1 (~0.11125369292536007E~307, 0.123E4, 0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (~0.11125369292536007E~307, 0.123E4, ~0.5E~323): ~0.13684204229819289E~304 ~0.13684204229819289E~304 (~0.11125369292536007E~307, 0.123E2, 0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (~0.11125369292536007E~307, 0.123E2, ~0.5E~323): ~0.1368420422981929E~306 ~0.1368420422981929E~306 (~0.11125369292536007E~307, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.524926277678689E~307 ~0.524926277678689E~307 (~0.11125369292536007E~307, 0.123, 0.22250738585072014E~307): 0.20882318162090083E~307 0.20882318162090083E~307 (~0.11125369292536007E~307, 0.123, 0.11125369292536007E~307): 0.9756948869554076E~308 0.9756948869554076E~308 (~0.11125369292536007E~307, 0.123, 0.5E~323): ~0.136842042298192E~308 ~0.136842042298192E~308 (~0.11125369292536007E~307, 0.123, 0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.11125369292536007E~307, 0.123, ~0.22250738585072014E~307): ~0.23619159008053945E~307 ~0.23619159008053945E~307 (~0.11125369292536007E~307, 0.123, ~0.11125369292536007E~307): ~0.1249378971551794E~307 ~0.1249378971551794E~307 (~0.11125369292536007E~307, 0.123, ~0.5E~323): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.11125369292536007E~307, 0.123, ~0.0): ~0.136842042298193E~308 ~0.136842042298193E~308 (~0.11125369292536007E~307, 0.123E~2, 0.22250738585072014E~307): 0.22237054380842194E~307 0.22237054380842194E~307 (~0.11125369292536007E~307, 0.123E~2, 0.11125369292536007E~307): 0.11111685088306187E~307 0.11111685088306187E~307 (~0.11125369292536007E~307, 0.123E~2, 0.5E~323): ~0.13684204229815E~310 ~0.13684204229815E~310 (~0.11125369292536007E~307, 0.123E~2, 0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (~0.11125369292536007E~307, 0.123E~2, ~0.22250738585072014E~307): ~0.22264422789301834E~307 ~0.22264422789301834E~307 (~0.11125369292536007E~307, 0.123E~2, ~0.11125369292536007E~307): ~0.11139053496765827E~307 ~0.11139053496765827E~307 (~0.11125369292536007E~307, 0.123E~2, ~0.5E~323): ~0.13684204229825E~310 ~0.13684204229825E~310 (~0.11125369292536007E~307, 0.123E~2, ~0.0): ~0.1368420422982E~310 ~0.1368420422982E~310 (~0.11125369292536007E~307, 0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, 0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, 0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, 0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, 0.5E~323, 0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, 0.5E~323, ~0.0): ~0.0 ~0.0 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E4): 0.1232E4 0.1232E4 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E2): 0.143E2 0.143E2 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.3141592653589793E1): 0.5141592653589793E1 0.5141592653589793E1 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.2718281828459045E1): 0.4718281828459045E1 0.4718281828459045E1 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E1): 0.32299999999999995E1 0.32299999999999995E1 (~0.11125369292536007E~307, ~0.17976931348623157E309, 0.123E~2): 0.20012299999999996E1 0.20012299999999996E1 (~0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E4): ~0.1228E4 ~0.1228E4 (~0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E2): ~0.103E2 ~0.103E2 (~0.11125369292536007E~307, ~0.17976931348623157E309, ~0.123E~2): 0.19987699999999997E1 0.19987699999999997E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E4): 0.1231E4 0.1231E4 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E2): 0.133E2 0.133E2 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.3141592653589793E1): 0.4141592653589793E1 0.4141592653589793E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.2718281828459045E1): 0.3718281828459045E1 0.3718281828459045E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E1): 0.223E1 0.223E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.123): 0.11229999999999998E1 0.11229999999999998E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, 0.123E~2): 0.10012299999999998E1 0.10012299999999998E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E4): ~0.1229E4 ~0.1229E4 (~0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E2): ~0.113E2 ~0.113E2 (~0.11125369292536007E~307, ~0.8988465674311579E308, ~0.3141592653589793E1): ~0.2141592653589793E1 ~0.2141592653589793E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, ~0.2718281828459045E1): ~0.1718281828459045E1 ~0.1718281828459045E1 (~0.11125369292536007E~307, ~0.8988465674311579E308, ~0.123E~2): 0.9987699999999999 0.9987699999999999 (~0.11125369292536007E~307, ~0.123E4, 0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (~0.11125369292536007E~307, ~0.123E4, ~0.5E~323): 0.13684204229819289E~304 0.13684204229819289E~304 (~0.11125369292536007E~307, ~0.123E2, 0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (~0.11125369292536007E~307, ~0.123E2, ~0.5E~323): 0.1368420422981929E~306 0.1368420422981929E~306 (~0.11125369292536007E~307, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.524926277678689E~307 0.524926277678689E~307 (~0.11125369292536007E~307, ~0.123, 0.22250738585072014E~307): 0.23619159008053945E~307 0.23619159008053945E~307 (~0.11125369292536007E~307, ~0.123, 0.11125369292536007E~307): 0.1249378971551794E~307 0.1249378971551794E~307 (~0.11125369292536007E~307, ~0.123, 0.5E~323): 0.136842042298193E~308 0.136842042298193E~308 (~0.11125369292536007E~307, ~0.123, 0.0): 0.136842042298193E~308 0.136842042298193E~308 (~0.11125369292536007E~307, ~0.123, ~0.22250738585072014E~307): ~0.20882318162090083E~307 ~0.20882318162090083E~307 (~0.11125369292536007E~307, ~0.123, ~0.11125369292536007E~307): ~0.9756948869554076E~308 ~0.9756948869554076E~308 (~0.11125369292536007E~307, ~0.123, ~0.5E~323): 0.136842042298192E~308 0.136842042298192E~308 (~0.11125369292536007E~307, ~0.123, ~0.0): 0.136842042298193E~308 0.136842042298193E~308 (~0.11125369292536007E~307, ~0.123E~2, 0.22250738585072014E~307): 0.22264422789301834E~307 0.22264422789301834E~307 (~0.11125369292536007E~307, ~0.123E~2, 0.11125369292536007E~307): 0.11139053496765827E~307 0.11139053496765827E~307 (~0.11125369292536007E~307, ~0.123E~2, 0.5E~323): 0.13684204229825E~310 0.13684204229825E~310 (~0.11125369292536007E~307, ~0.123E~2, 0.0): 0.1368420422982E~310 0.1368420422982E~310 (~0.11125369292536007E~307, ~0.123E~2, ~0.22250738585072014E~307): ~0.22237054380842194E~307 ~0.22237054380842194E~307 (~0.11125369292536007E~307, ~0.123E~2, ~0.11125369292536007E~307): ~0.11111685088306187E~307 ~0.11111685088306187E~307 (~0.11125369292536007E~307, ~0.123E~2, ~0.5E~323): 0.13684204229815E~310 0.13684204229815E~310 (~0.11125369292536007E~307, ~0.123E~2, ~0.0): 0.1368420422982E~310 0.1368420422982E~310 (~0.11125369292536007E~307, ~0.22250738585072014E~307, 0.0): 0.0 0.0 (~0.11125369292536007E~307, ~0.22250738585072014E~307, ~0.0): 0.0 0.0 (~0.11125369292536007E~307, ~0.11125369292536007E~307, 0.0): 0.0 0.0 (~0.11125369292536007E~307, ~0.11125369292536007E~307, ~0.0): 0.0 0.0 (~0.11125369292536007E~307, ~0.5E~323, 0.0): 0.0 0.0 (~0.11125369292536007E~307, ~0.5E~323, ~0.0): 0.0 0.0 (~0.5E~323, 0.17976931348623157E309, 0.123E4): 0.123E4 0.123E4 (~0.5E~323, 0.17976931348623157E309, 0.123E2): 0.123E2 0.123E2 (~0.5E~323, 0.17976931348623157E309, ~0.123E4): ~0.123E4 ~0.123E4 (~0.5E~323, 0.17976931348623157E309, ~0.123E2): ~0.123E2 ~0.123E2 (~0.5E~323, 0.8988465674311579E308, 0.123E4): 0.123E4 0.123E4 (~0.5E~323, 0.8988465674311579E308, 0.123E2): 0.123E2 0.123E2 (~0.5E~323, 0.8988465674311579E308, ~0.123E4): ~0.123E4 ~0.123E4 (~0.5E~323, 0.8988465674311579E308, ~0.123E2): ~0.123E2 ~0.123E2 (~0.5E~323, 0.123E2, 0.22250738585072014E~307): 0.22250738585071955E~307 0.22250738585071955E~307 (~0.5E~323, 0.123E2, 0.11125369292536007E~307): 0.1112536929253595E~307 0.1112536929253595E~307 (~0.5E~323, 0.123E2, 0.5E~323): ~0.54E~322 ~0.54E~322 (~0.5E~323, 0.123E2, 0.0): ~0.6E~322 ~0.6E~322 (~0.5E~323, 0.123E2, ~0.22250738585072014E~307): ~0.22250738585072073E~307 ~0.22250738585072073E~307 (~0.5E~323, 0.123E2, ~0.11125369292536007E~307): ~0.11125369292536066E~307 ~0.11125369292536066E~307 (~0.5E~323, 0.123E2, ~0.5E~323): ~0.64E~322 ~0.64E~322 (~0.5E~323, 0.123E2, ~0.0): ~0.6E~322 ~0.6E~322 (~0.5E~323, 0.3141592653589793E1, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (~0.5E~323, 0.3141592653589793E1, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (~0.5E~323, 0.3141592653589793E1, 0.5E~323): ~0.1E~322 ~0.1E~322 (~0.5E~323, 0.3141592653589793E1, 0.0): ~0.15E~322 ~0.15E~322 (~0.5E~323, 0.3141592653589793E1, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (~0.5E~323, 0.3141592653589793E1, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (~0.5E~323, 0.3141592653589793E1, ~0.5E~323): ~0.2E~322 ~0.2E~322 (~0.5E~323, 0.3141592653589793E1, ~0.0): ~0.15E~322 ~0.15E~322 (~0.5E~323, 0.2718281828459045E1, 0.22250738585072014E~307): 0.22250738585072E~307 0.22250738585072E~307 (~0.5E~323, 0.2718281828459045E1, 0.11125369292536007E~307): 0.1112536929253599E~307 0.1112536929253599E~307 (~0.5E~323, 0.2718281828459045E1, 0.5E~323): ~0.1E~322 ~0.1E~322 (~0.5E~323, 0.2718281828459045E1, 0.0): ~0.15E~322 ~0.15E~322 (~0.5E~323, 0.2718281828459045E1, ~0.22250738585072014E~307): ~0.2225073858507203E~307 ~0.2225073858507203E~307 (~0.5E~323, 0.2718281828459045E1, ~0.11125369292536007E~307): ~0.1112536929253602E~307 ~0.1112536929253602E~307 (~0.5E~323, 0.2718281828459045E1, ~0.5E~323): ~0.2E~322 ~0.2E~322 (~0.5E~323, 0.2718281828459045E1, ~0.0): ~0.15E~322 ~0.15E~322 (~0.5E~323, 0.123E1, 0.22250738585072014E~307): 0.2225073858507201E~307 0.2225073858507201E~307 (~0.5E~323, 0.123E1, 0.11125369292536007E~307): 0.11125369292536E~307 0.11125369292536E~307 (~0.5E~323, 0.123E1, 0.5E~323): ~0.0 ~0.0 (~0.5E~323, 0.123E1, 0.0): ~0.5E~323 ~0.5E~323 (~0.5E~323, 0.123E1, ~0.22250738585072014E~307): ~0.2225073858507202E~307 ~0.2225073858507202E~307 (~0.5E~323, 0.123E1, ~0.11125369292536007E~307): ~0.1112536929253601E~307 ~0.1112536929253601E~307 (~0.5E~323, 0.123E1, ~0.5E~323): ~0.1E~322 ~0.1E~322 (~0.5E~323, 0.123E1, ~0.0): ~0.5E~323 ~0.5E~323 (~0.5E~323, 0.123, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.5E~323, 0.123, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.5E~323, 0.123, 0.5E~323): 0.5E~323 0.5E~323 (~0.5E~323, 0.123, 0.0): ~0.0 ~0.0 (~0.5E~323, 0.123, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.5E~323, 0.123, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.5E~323, 0.123, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.5E~323, 0.123, ~0.0): ~0.0 ~0.0 (~0.5E~323, 0.123E~2, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.5E~323, 0.123E~2, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.5E~323, 0.123E~2, 0.5E~323): 0.5E~323 0.5E~323 (~0.5E~323, 0.123E~2, 0.0): ~0.0 ~0.0 (~0.5E~323, 0.123E~2, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.5E~323, 0.123E~2, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.5E~323, 0.123E~2, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.5E~323, 0.123E~2, ~0.0): ~0.0 ~0.0 (~0.5E~323, 0.22250738585072014E~307, 0.0): ~0.0 ~0.0 (~0.5E~323, 0.22250738585072014E~307, ~0.0): ~0.0 ~0.0 (~0.5E~323, 0.11125369292536007E~307, 0.0): ~0.0 ~0.0 (~0.5E~323, 0.11125369292536007E~307, ~0.0): ~0.0 ~0.0 (~0.5E~323, 0.5E~323, 0.0): ~0.0 ~0.0 (~0.5E~323, 0.5E~323, ~0.0): ~0.0 ~0.0 (~0.5E~323, ~0.17976931348623157E309, 0.123E4): 0.123E4 0.123E4 (~0.5E~323, ~0.17976931348623157E309, 0.123E2): 0.123E2 0.123E2 (~0.5E~323, ~0.17976931348623157E309, ~0.123E4): ~0.123E4 ~0.123E4 (~0.5E~323, ~0.17976931348623157E309, ~0.123E2): ~0.123E2 ~0.123E2 (~0.5E~323, ~0.8988465674311579E308, 0.123E4): 0.123E4 0.123E4 (~0.5E~323, ~0.8988465674311579E308, 0.123E2): 0.123E2 0.123E2 (~0.5E~323, ~0.8988465674311579E308, ~0.123E4): ~0.123E4 ~0.123E4 (~0.5E~323, ~0.8988465674311579E308, ~0.123E2): ~0.123E2 ~0.123E2 (~0.5E~323, ~0.123E2, 0.22250738585072014E~307): 0.22250738585072073E~307 0.22250738585072073E~307 (~0.5E~323, ~0.123E2, 0.11125369292536007E~307): 0.11125369292536066E~307 0.11125369292536066E~307 (~0.5E~323, ~0.123E2, 0.5E~323): 0.64E~322 0.64E~322 (~0.5E~323, ~0.123E2, 0.0): 0.6E~322 0.6E~322 (~0.5E~323, ~0.123E2, ~0.22250738585072014E~307): ~0.22250738585071955E~307 ~0.22250738585071955E~307 (~0.5E~323, ~0.123E2, ~0.11125369292536007E~307): ~0.1112536929253595E~307 ~0.1112536929253595E~307 (~0.5E~323, ~0.123E2, ~0.5E~323): 0.54E~322 0.54E~322 (~0.5E~323, ~0.123E2, ~0.0): 0.6E~322 0.6E~322 (~0.5E~323, ~0.3141592653589793E1, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (~0.5E~323, ~0.3141592653589793E1, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (~0.5E~323, ~0.3141592653589793E1, 0.5E~323): 0.2E~322 0.2E~322 (~0.5E~323, ~0.3141592653589793E1, 0.0): 0.15E~322 0.15E~322 (~0.5E~323, ~0.3141592653589793E1, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (~0.5E~323, ~0.3141592653589793E1, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (~0.5E~323, ~0.3141592653589793E1, ~0.5E~323): 0.1E~322 0.1E~322 (~0.5E~323, ~0.3141592653589793E1, ~0.0): 0.15E~322 0.15E~322 (~0.5E~323, ~0.2718281828459045E1, 0.22250738585072014E~307): 0.2225073858507203E~307 0.2225073858507203E~307 (~0.5E~323, ~0.2718281828459045E1, 0.11125369292536007E~307): 0.1112536929253602E~307 0.1112536929253602E~307 (~0.5E~323, ~0.2718281828459045E1, 0.5E~323): 0.2E~322 0.2E~322 (~0.5E~323, ~0.2718281828459045E1, 0.0): 0.15E~322 0.15E~322 (~0.5E~323, ~0.2718281828459045E1, ~0.22250738585072014E~307): ~0.22250738585072E~307 ~0.22250738585072E~307 (~0.5E~323, ~0.2718281828459045E1, ~0.11125369292536007E~307): ~0.1112536929253599E~307 ~0.1112536929253599E~307 (~0.5E~323, ~0.2718281828459045E1, ~0.5E~323): 0.1E~322 0.1E~322 (~0.5E~323, ~0.2718281828459045E1, ~0.0): 0.15E~322 0.15E~322 (~0.5E~323, ~0.123E1, 0.22250738585072014E~307): 0.2225073858507202E~307 0.2225073858507202E~307 (~0.5E~323, ~0.123E1, 0.11125369292536007E~307): 0.1112536929253601E~307 0.1112536929253601E~307 (~0.5E~323, ~0.123E1, 0.5E~323): 0.1E~322 0.1E~322 (~0.5E~323, ~0.123E1, 0.0): 0.5E~323 0.5E~323 (~0.5E~323, ~0.123E1, ~0.22250738585072014E~307): ~0.2225073858507201E~307 ~0.2225073858507201E~307 (~0.5E~323, ~0.123E1, ~0.11125369292536007E~307): ~0.11125369292536E~307 ~0.11125369292536E~307 (~0.5E~323, ~0.123E1, ~0.5E~323): 0.0 0.0 (~0.5E~323, ~0.123E1, ~0.0): 0.5E~323 0.5E~323 (~0.5E~323, ~0.123, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.5E~323, ~0.123, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.5E~323, ~0.123, 0.5E~323): 0.5E~323 0.5E~323 (~0.5E~323, ~0.123, 0.0): 0.0 0.0 (~0.5E~323, ~0.123, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.5E~323, ~0.123, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.5E~323, ~0.123, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.5E~323, ~0.123, ~0.0): 0.0 0.0 (~0.5E~323, ~0.123E~2, 0.22250738585072014E~307): 0.22250738585072014E~307 0.22250738585072014E~307 (~0.5E~323, ~0.123E~2, 0.11125369292536007E~307): 0.11125369292536007E~307 0.11125369292536007E~307 (~0.5E~323, ~0.123E~2, 0.5E~323): 0.5E~323 0.5E~323 (~0.5E~323, ~0.123E~2, 0.0): 0.0 0.0 (~0.5E~323, ~0.123E~2, ~0.22250738585072014E~307): ~0.22250738585072014E~307 ~0.22250738585072014E~307 (~0.5E~323, ~0.123E~2, ~0.11125369292536007E~307): ~0.11125369292536007E~307 ~0.11125369292536007E~307 (~0.5E~323, ~0.123E~2, ~0.5E~323): ~0.5E~323 ~0.5E~323 (~0.5E~323, ~0.123E~2, ~0.0): 0.0 0.0 (~0.5E~323, ~0.22250738585072014E~307, 0.0): 0.0 0.0 (~0.5E~323, ~0.22250738585072014E~307, ~0.0): 0.0 0.0 (~0.5E~323, ~0.11125369292536007E~307, 0.0): 0.0 0.0 (~0.5E~323, ~0.11125369292536007E~307, ~0.0): 0.0 0.0 (~0.5E~323, ~0.5E~323, 0.0): 0.0 0.0 (~0.5E~323, ~0.5E~323, ~0.0): 0.0 0.0 Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} < (0.17976931348623157E309, 0.17976931348623157E309) = false > (0.17976931348623157E309, 0.17976931348623157E309) = false == (0.17976931348623157E309, 0.17976931348623157E309) = true ?= (0.17976931348623157E309, 0.17976931348623157E309) = true < (0.17976931348623157E309, 0.8988465674311579E308) = false > (0.17976931348623157E309, 0.8988465674311579E308) = true == (0.17976931348623157E309, 0.8988465674311579E308) = false ?= (0.17976931348623157E309, 0.8988465674311579E308) = false < (0.17976931348623157E309, 0.123E4) = false > (0.17976931348623157E309, 0.123E4) = true == (0.17976931348623157E309, 0.123E4) = false ?= (0.17976931348623157E309, 0.123E4) = false < (0.17976931348623157E309, 0.123E2) = false > (0.17976931348623157E309, 0.123E2) = true == (0.17976931348623157E309, 0.123E2) = false ?= (0.17976931348623157E309, 0.123E2) = false < (0.17976931348623157E309, 0.3141592653589793E1) = false > (0.17976931348623157E309, 0.3141592653589793E1) = true == (0.17976931348623157E309, 0.3141592653589793E1) = false ?= (0.17976931348623157E309, 0.3141592653589793E1) = false < (0.17976931348623157E309, 0.2718281828459045E1) = false > (0.17976931348623157E309, 0.2718281828459045E1) = true == (0.17976931348623157E309, 0.2718281828459045E1) = false ?= (0.17976931348623157E309, 0.2718281828459045E1) = false < (0.17976931348623157E309, 0.123E1) = false > (0.17976931348623157E309, 0.123E1) = true == (0.17976931348623157E309, 0.123E1) = false ?= (0.17976931348623157E309, 0.123E1) = false < (0.17976931348623157E309, 0.123) = false > (0.17976931348623157E309, 0.123) = true == (0.17976931348623157E309, 0.123) = false ?= (0.17976931348623157E309, 0.123) = false < (0.17976931348623157E309, 0.123E~2) = false > (0.17976931348623157E309, 0.123E~2) = true == (0.17976931348623157E309, 0.123E~2) = false ?= (0.17976931348623157E309, 0.123E~2) = false < (0.17976931348623157E309, 0.22250738585072014E~307) = false > (0.17976931348623157E309, 0.22250738585072014E~307) = true == (0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (0.17976931348623157E309, 0.22250738585072014E~307) = false < (0.17976931348623157E309, 0.11125369292536007E~307) = false > (0.17976931348623157E309, 0.11125369292536007E~307) = true == (0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (0.17976931348623157E309, 0.11125369292536007E~307) = false < (0.17976931348623157E309, 0.5E~323) = false > (0.17976931348623157E309, 0.5E~323) = true == (0.17976931348623157E309, 0.5E~323) = false ?= (0.17976931348623157E309, 0.5E~323) = false < (0.17976931348623157E309, 0.0) = false > (0.17976931348623157E309, 0.0) = true == (0.17976931348623157E309, 0.0) = false ?= (0.17976931348623157E309, 0.0) = false < (0.17976931348623157E309, ~0.17976931348623157E309) = false > (0.17976931348623157E309, ~0.17976931348623157E309) = true == (0.17976931348623157E309, ~0.17976931348623157E309) = false ?= (0.17976931348623157E309, ~0.17976931348623157E309) = false < (0.17976931348623157E309, ~0.8988465674311579E308) = false > (0.17976931348623157E309, ~0.8988465674311579E308) = true == (0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (0.17976931348623157E309, ~0.8988465674311579E308) = false < (0.17976931348623157E309, ~0.123E4) = false > (0.17976931348623157E309, ~0.123E4) = true == (0.17976931348623157E309, ~0.123E4) = false ?= (0.17976931348623157E309, ~0.123E4) = false < (0.17976931348623157E309, ~0.123E2) = false > (0.17976931348623157E309, ~0.123E2) = true == (0.17976931348623157E309, ~0.123E2) = false ?= (0.17976931348623157E309, ~0.123E2) = false < (0.17976931348623157E309, ~0.3141592653589793E1) = false > (0.17976931348623157E309, ~0.3141592653589793E1) = true == (0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (0.17976931348623157E309, ~0.3141592653589793E1) = false < (0.17976931348623157E309, ~0.2718281828459045E1) = false > (0.17976931348623157E309, ~0.2718281828459045E1) = true == (0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (0.17976931348623157E309, ~0.2718281828459045E1) = false < (0.17976931348623157E309, ~0.123E1) = false > (0.17976931348623157E309, ~0.123E1) = true == (0.17976931348623157E309, ~0.123E1) = false ?= (0.17976931348623157E309, ~0.123E1) = false < (0.17976931348623157E309, ~0.123) = false > (0.17976931348623157E309, ~0.123) = true == (0.17976931348623157E309, ~0.123) = false ?= (0.17976931348623157E309, ~0.123) = false < (0.17976931348623157E309, ~0.123E~2) = false > (0.17976931348623157E309, ~0.123E~2) = true == (0.17976931348623157E309, ~0.123E~2) = false ?= (0.17976931348623157E309, ~0.123E~2) = false < (0.17976931348623157E309, ~0.22250738585072014E~307) = false > (0.17976931348623157E309, ~0.22250738585072014E~307) = true == (0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (0.17976931348623157E309, ~0.22250738585072014E~307) = false < (0.17976931348623157E309, ~0.11125369292536007E~307) = false > (0.17976931348623157E309, ~0.11125369292536007E~307) = true == (0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (0.17976931348623157E309, ~0.11125369292536007E~307) = false < (0.17976931348623157E309, ~0.5E~323) = false > (0.17976931348623157E309, ~0.5E~323) = true == (0.17976931348623157E309, ~0.5E~323) = false ?= (0.17976931348623157E309, ~0.5E~323) = false < (0.17976931348623157E309, ~0.0) = false > (0.17976931348623157E309, ~0.0) = true == (0.17976931348623157E309, ~0.0) = false ?= (0.17976931348623157E309, ~0.0) = false < (0.8988465674311579E308, 0.17976931348623157E309) = true > (0.8988465674311579E308, 0.17976931348623157E309) = false == (0.8988465674311579E308, 0.17976931348623157E309) = false ?= (0.8988465674311579E308, 0.17976931348623157E309) = false < (0.8988465674311579E308, 0.8988465674311579E308) = false > (0.8988465674311579E308, 0.8988465674311579E308) = false == (0.8988465674311579E308, 0.8988465674311579E308) = true ?= (0.8988465674311579E308, 0.8988465674311579E308) = true < (0.8988465674311579E308, 0.123E4) = false > (0.8988465674311579E308, 0.123E4) = true == (0.8988465674311579E308, 0.123E4) = false ?= (0.8988465674311579E308, 0.123E4) = false < (0.8988465674311579E308, 0.123E2) = false > (0.8988465674311579E308, 0.123E2) = true == (0.8988465674311579E308, 0.123E2) = false ?= (0.8988465674311579E308, 0.123E2) = false < (0.8988465674311579E308, 0.3141592653589793E1) = false > (0.8988465674311579E308, 0.3141592653589793E1) = true == (0.8988465674311579E308, 0.3141592653589793E1) = false ?= (0.8988465674311579E308, 0.3141592653589793E1) = false < (0.8988465674311579E308, 0.2718281828459045E1) = false > (0.8988465674311579E308, 0.2718281828459045E1) = true == (0.8988465674311579E308, 0.2718281828459045E1) = false ?= (0.8988465674311579E308, 0.2718281828459045E1) = false < (0.8988465674311579E308, 0.123E1) = false > (0.8988465674311579E308, 0.123E1) = true == (0.8988465674311579E308, 0.123E1) = false ?= (0.8988465674311579E308, 0.123E1) = false < (0.8988465674311579E308, 0.123) = false > (0.8988465674311579E308, 0.123) = true == (0.8988465674311579E308, 0.123) = false ?= (0.8988465674311579E308, 0.123) = false < (0.8988465674311579E308, 0.123E~2) = false > (0.8988465674311579E308, 0.123E~2) = true == (0.8988465674311579E308, 0.123E~2) = false ?= (0.8988465674311579E308, 0.123E~2) = false < (0.8988465674311579E308, 0.22250738585072014E~307) = false > (0.8988465674311579E308, 0.22250738585072014E~307) = true == (0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (0.8988465674311579E308, 0.22250738585072014E~307) = false < (0.8988465674311579E308, 0.11125369292536007E~307) = false > (0.8988465674311579E308, 0.11125369292536007E~307) = true == (0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (0.8988465674311579E308, 0.11125369292536007E~307) = false < (0.8988465674311579E308, 0.5E~323) = false > (0.8988465674311579E308, 0.5E~323) = true == (0.8988465674311579E308, 0.5E~323) = false ?= (0.8988465674311579E308, 0.5E~323) = false < (0.8988465674311579E308, 0.0) = false > (0.8988465674311579E308, 0.0) = true == (0.8988465674311579E308, 0.0) = false ?= (0.8988465674311579E308, 0.0) = false < (0.8988465674311579E308, ~0.17976931348623157E309) = false > (0.8988465674311579E308, ~0.17976931348623157E309) = true == (0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (0.8988465674311579E308, ~0.17976931348623157E309) = false < (0.8988465674311579E308, ~0.8988465674311579E308) = false > (0.8988465674311579E308, ~0.8988465674311579E308) = true == (0.8988465674311579E308, ~0.8988465674311579E308) = false ?= (0.8988465674311579E308, ~0.8988465674311579E308) = false < (0.8988465674311579E308, ~0.123E4) = false > (0.8988465674311579E308, ~0.123E4) = true == (0.8988465674311579E308, ~0.123E4) = false ?= (0.8988465674311579E308, ~0.123E4) = false < (0.8988465674311579E308, ~0.123E2) = false > (0.8988465674311579E308, ~0.123E2) = true == (0.8988465674311579E308, ~0.123E2) = false ?= (0.8988465674311579E308, ~0.123E2) = false < (0.8988465674311579E308, ~0.3141592653589793E1) = false > (0.8988465674311579E308, ~0.3141592653589793E1) = true == (0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (0.8988465674311579E308, ~0.3141592653589793E1) = false < (0.8988465674311579E308, ~0.2718281828459045E1) = false > (0.8988465674311579E308, ~0.2718281828459045E1) = true == (0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (0.8988465674311579E308, ~0.2718281828459045E1) = false < (0.8988465674311579E308, ~0.123E1) = false > (0.8988465674311579E308, ~0.123E1) = true == (0.8988465674311579E308, ~0.123E1) = false ?= (0.8988465674311579E308, ~0.123E1) = false < (0.8988465674311579E308, ~0.123) = false > (0.8988465674311579E308, ~0.123) = true == (0.8988465674311579E308, ~0.123) = false ?= (0.8988465674311579E308, ~0.123) = false < (0.8988465674311579E308, ~0.123E~2) = false > (0.8988465674311579E308, ~0.123E~2) = true == (0.8988465674311579E308, ~0.123E~2) = false ?= (0.8988465674311579E308, ~0.123E~2) = false < (0.8988465674311579E308, ~0.22250738585072014E~307) = false > (0.8988465674311579E308, ~0.22250738585072014E~307) = true == (0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (0.8988465674311579E308, ~0.22250738585072014E~307) = false < (0.8988465674311579E308, ~0.11125369292536007E~307) = false > (0.8988465674311579E308, ~0.11125369292536007E~307) = true == (0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (0.8988465674311579E308, ~0.11125369292536007E~307) = false < (0.8988465674311579E308, ~0.5E~323) = false > (0.8988465674311579E308, ~0.5E~323) = true == (0.8988465674311579E308, ~0.5E~323) = false ?= (0.8988465674311579E308, ~0.5E~323) = false < (0.8988465674311579E308, ~0.0) = false > (0.8988465674311579E308, ~0.0) = true == (0.8988465674311579E308, ~0.0) = false ?= (0.8988465674311579E308, ~0.0) = false < (0.123E4, 0.17976931348623157E309) = true > (0.123E4, 0.17976931348623157E309) = false == (0.123E4, 0.17976931348623157E309) = false ?= (0.123E4, 0.17976931348623157E309) = false < (0.123E4, 0.8988465674311579E308) = true > (0.123E4, 0.8988465674311579E308) = false == (0.123E4, 0.8988465674311579E308) = false ?= (0.123E4, 0.8988465674311579E308) = false < (0.123E4, 0.123E4) = false > (0.123E4, 0.123E4) = false == (0.123E4, 0.123E4) = true ?= (0.123E4, 0.123E4) = true < (0.123E4, 0.123E2) = false > (0.123E4, 0.123E2) = true == (0.123E4, 0.123E2) = false ?= (0.123E4, 0.123E2) = false < (0.123E4, 0.3141592653589793E1) = false > (0.123E4, 0.3141592653589793E1) = true == (0.123E4, 0.3141592653589793E1) = false ?= (0.123E4, 0.3141592653589793E1) = false < (0.123E4, 0.2718281828459045E1) = false > (0.123E4, 0.2718281828459045E1) = true == (0.123E4, 0.2718281828459045E1) = false ?= (0.123E4, 0.2718281828459045E1) = false < (0.123E4, 0.123E1) = false > (0.123E4, 0.123E1) = true == (0.123E4, 0.123E1) = false ?= (0.123E4, 0.123E1) = false < (0.123E4, 0.123) = false > (0.123E4, 0.123) = true == (0.123E4, 0.123) = false ?= (0.123E4, 0.123) = false < (0.123E4, 0.123E~2) = false > (0.123E4, 0.123E~2) = true == (0.123E4, 0.123E~2) = false ?= (0.123E4, 0.123E~2) = false < (0.123E4, 0.22250738585072014E~307) = false > (0.123E4, 0.22250738585072014E~307) = true == (0.123E4, 0.22250738585072014E~307) = false ?= (0.123E4, 0.22250738585072014E~307) = false < (0.123E4, 0.11125369292536007E~307) = false > (0.123E4, 0.11125369292536007E~307) = true == (0.123E4, 0.11125369292536007E~307) = false ?= (0.123E4, 0.11125369292536007E~307) = false < (0.123E4, 0.5E~323) = false > (0.123E4, 0.5E~323) = true == (0.123E4, 0.5E~323) = false ?= (0.123E4, 0.5E~323) = false < (0.123E4, 0.0) = false > (0.123E4, 0.0) = true == (0.123E4, 0.0) = false ?= (0.123E4, 0.0) = false < (0.123E4, ~0.17976931348623157E309) = false > (0.123E4, ~0.17976931348623157E309) = true == (0.123E4, ~0.17976931348623157E309) = false ?= (0.123E4, ~0.17976931348623157E309) = false < (0.123E4, ~0.8988465674311579E308) = false > (0.123E4, ~0.8988465674311579E308) = true == (0.123E4, ~0.8988465674311579E308) = false ?= (0.123E4, ~0.8988465674311579E308) = false < (0.123E4, ~0.123E4) = false > (0.123E4, ~0.123E4) = true == (0.123E4, ~0.123E4) = false ?= (0.123E4, ~0.123E4) = false < (0.123E4, ~0.123E2) = false > (0.123E4, ~0.123E2) = true == (0.123E4, ~0.123E2) = false ?= (0.123E4, ~0.123E2) = false < (0.123E4, ~0.3141592653589793E1) = false > (0.123E4, ~0.3141592653589793E1) = true == (0.123E4, ~0.3141592653589793E1) = false ?= (0.123E4, ~0.3141592653589793E1) = false < (0.123E4, ~0.2718281828459045E1) = false > (0.123E4, ~0.2718281828459045E1) = true == (0.123E4, ~0.2718281828459045E1) = false ?= (0.123E4, ~0.2718281828459045E1) = false < (0.123E4, ~0.123E1) = false > (0.123E4, ~0.123E1) = true == (0.123E4, ~0.123E1) = false ?= (0.123E4, ~0.123E1) = false < (0.123E4, ~0.123) = false > (0.123E4, ~0.123) = true == (0.123E4, ~0.123) = false ?= (0.123E4, ~0.123) = false < (0.123E4, ~0.123E~2) = false > (0.123E4, ~0.123E~2) = true == (0.123E4, ~0.123E~2) = false ?= (0.123E4, ~0.123E~2) = false < (0.123E4, ~0.22250738585072014E~307) = false > (0.123E4, ~0.22250738585072014E~307) = true == (0.123E4, ~0.22250738585072014E~307) = false ?= (0.123E4, ~0.22250738585072014E~307) = false < (0.123E4, ~0.11125369292536007E~307) = false > (0.123E4, ~0.11125369292536007E~307) = true == (0.123E4, ~0.11125369292536007E~307) = false ?= (0.123E4, ~0.11125369292536007E~307) = false < (0.123E4, ~0.5E~323) = false > (0.123E4, ~0.5E~323) = true == (0.123E4, ~0.5E~323) = false ?= (0.123E4, ~0.5E~323) = false < (0.123E4, ~0.0) = false > (0.123E4, ~0.0) = true == (0.123E4, ~0.0) = false ?= (0.123E4, ~0.0) = false < (0.123E2, 0.17976931348623157E309) = true > (0.123E2, 0.17976931348623157E309) = false == (0.123E2, 0.17976931348623157E309) = false ?= (0.123E2, 0.17976931348623157E309) = false < (0.123E2, 0.8988465674311579E308) = true > (0.123E2, 0.8988465674311579E308) = false == (0.123E2, 0.8988465674311579E308) = false ?= (0.123E2, 0.8988465674311579E308) = false < (0.123E2, 0.123E4) = true > (0.123E2, 0.123E4) = false == (0.123E2, 0.123E4) = false ?= (0.123E2, 0.123E4) = false < (0.123E2, 0.123E2) = false > (0.123E2, 0.123E2) = false == (0.123E2, 0.123E2) = true ?= (0.123E2, 0.123E2) = true < (0.123E2, 0.3141592653589793E1) = false > (0.123E2, 0.3141592653589793E1) = true == (0.123E2, 0.3141592653589793E1) = false ?= (0.123E2, 0.3141592653589793E1) = false < (0.123E2, 0.2718281828459045E1) = false > (0.123E2, 0.2718281828459045E1) = true == (0.123E2, 0.2718281828459045E1) = false ?= (0.123E2, 0.2718281828459045E1) = false < (0.123E2, 0.123E1) = false > (0.123E2, 0.123E1) = true == (0.123E2, 0.123E1) = false ?= (0.123E2, 0.123E1) = false < (0.123E2, 0.123) = false > (0.123E2, 0.123) = true == (0.123E2, 0.123) = false ?= (0.123E2, 0.123) = false < (0.123E2, 0.123E~2) = false > (0.123E2, 0.123E~2) = true == (0.123E2, 0.123E~2) = false ?= (0.123E2, 0.123E~2) = false < (0.123E2, 0.22250738585072014E~307) = false > (0.123E2, 0.22250738585072014E~307) = true == (0.123E2, 0.22250738585072014E~307) = false ?= (0.123E2, 0.22250738585072014E~307) = false < (0.123E2, 0.11125369292536007E~307) = false > (0.123E2, 0.11125369292536007E~307) = true == (0.123E2, 0.11125369292536007E~307) = false ?= (0.123E2, 0.11125369292536007E~307) = false < (0.123E2, 0.5E~323) = false > (0.123E2, 0.5E~323) = true == (0.123E2, 0.5E~323) = false ?= (0.123E2, 0.5E~323) = false < (0.123E2, 0.0) = false > (0.123E2, 0.0) = true == (0.123E2, 0.0) = false ?= (0.123E2, 0.0) = false < (0.123E2, ~0.17976931348623157E309) = false > (0.123E2, ~0.17976931348623157E309) = true == (0.123E2, ~0.17976931348623157E309) = false ?= (0.123E2, ~0.17976931348623157E309) = false < (0.123E2, ~0.8988465674311579E308) = false > (0.123E2, ~0.8988465674311579E308) = true == (0.123E2, ~0.8988465674311579E308) = false ?= (0.123E2, ~0.8988465674311579E308) = false < (0.123E2, ~0.123E4) = false > (0.123E2, ~0.123E4) = true == (0.123E2, ~0.123E4) = false ?= (0.123E2, ~0.123E4) = false < (0.123E2, ~0.123E2) = false > (0.123E2, ~0.123E2) = true == (0.123E2, ~0.123E2) = false ?= (0.123E2, ~0.123E2) = false < (0.123E2, ~0.3141592653589793E1) = false > (0.123E2, ~0.3141592653589793E1) = true == (0.123E2, ~0.3141592653589793E1) = false ?= (0.123E2, ~0.3141592653589793E1) = false < (0.123E2, ~0.2718281828459045E1) = false > (0.123E2, ~0.2718281828459045E1) = true == (0.123E2, ~0.2718281828459045E1) = false ?= (0.123E2, ~0.2718281828459045E1) = false < (0.123E2, ~0.123E1) = false > (0.123E2, ~0.123E1) = true == (0.123E2, ~0.123E1) = false ?= (0.123E2, ~0.123E1) = false < (0.123E2, ~0.123) = false > (0.123E2, ~0.123) = true == (0.123E2, ~0.123) = false ?= (0.123E2, ~0.123) = false < (0.123E2, ~0.123E~2) = false > (0.123E2, ~0.123E~2) = true == (0.123E2, ~0.123E~2) = false ?= (0.123E2, ~0.123E~2) = false < (0.123E2, ~0.22250738585072014E~307) = false > (0.123E2, ~0.22250738585072014E~307) = true == (0.123E2, ~0.22250738585072014E~307) = false ?= (0.123E2, ~0.22250738585072014E~307) = false < (0.123E2, ~0.11125369292536007E~307) = false > (0.123E2, ~0.11125369292536007E~307) = true == (0.123E2, ~0.11125369292536007E~307) = false ?= (0.123E2, ~0.11125369292536007E~307) = false < (0.123E2, ~0.5E~323) = false > (0.123E2, ~0.5E~323) = true == (0.123E2, ~0.5E~323) = false ?= (0.123E2, ~0.5E~323) = false < (0.123E2, ~0.0) = false > (0.123E2, ~0.0) = true == (0.123E2, ~0.0) = false ?= (0.123E2, ~0.0) = false < (0.3141592653589793E1, 0.17976931348623157E309) = true > (0.3141592653589793E1, 0.17976931348623157E309) = false == (0.3141592653589793E1, 0.17976931348623157E309) = false ?= (0.3141592653589793E1, 0.17976931348623157E309) = false < (0.3141592653589793E1, 0.8988465674311579E308) = true > (0.3141592653589793E1, 0.8988465674311579E308) = false == (0.3141592653589793E1, 0.8988465674311579E308) = false ?= (0.3141592653589793E1, 0.8988465674311579E308) = false < (0.3141592653589793E1, 0.123E4) = true > (0.3141592653589793E1, 0.123E4) = false == (0.3141592653589793E1, 0.123E4) = false ?= (0.3141592653589793E1, 0.123E4) = false < (0.3141592653589793E1, 0.123E2) = true > (0.3141592653589793E1, 0.123E2) = false == (0.3141592653589793E1, 0.123E2) = false ?= (0.3141592653589793E1, 0.123E2) = false < (0.3141592653589793E1, 0.3141592653589793E1) = false > (0.3141592653589793E1, 0.3141592653589793E1) = false == (0.3141592653589793E1, 0.3141592653589793E1) = true ?= (0.3141592653589793E1, 0.3141592653589793E1) = true < (0.3141592653589793E1, 0.2718281828459045E1) = false > (0.3141592653589793E1, 0.2718281828459045E1) = true == (0.3141592653589793E1, 0.2718281828459045E1) = false ?= (0.3141592653589793E1, 0.2718281828459045E1) = false < (0.3141592653589793E1, 0.123E1) = false > (0.3141592653589793E1, 0.123E1) = true == (0.3141592653589793E1, 0.123E1) = false ?= (0.3141592653589793E1, 0.123E1) = false < (0.3141592653589793E1, 0.123) = false > (0.3141592653589793E1, 0.123) = true == (0.3141592653589793E1, 0.123) = false ?= (0.3141592653589793E1, 0.123) = false < (0.3141592653589793E1, 0.123E~2) = false > (0.3141592653589793E1, 0.123E~2) = true == (0.3141592653589793E1, 0.123E~2) = false ?= (0.3141592653589793E1, 0.123E~2) = false < (0.3141592653589793E1, 0.22250738585072014E~307) = false > (0.3141592653589793E1, 0.22250738585072014E~307) = true == (0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (0.3141592653589793E1, 0.22250738585072014E~307) = false < (0.3141592653589793E1, 0.11125369292536007E~307) = false > (0.3141592653589793E1, 0.11125369292536007E~307) = true == (0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (0.3141592653589793E1, 0.11125369292536007E~307) = false < (0.3141592653589793E1, 0.5E~323) = false > (0.3141592653589793E1, 0.5E~323) = true == (0.3141592653589793E1, 0.5E~323) = false ?= (0.3141592653589793E1, 0.5E~323) = false < (0.3141592653589793E1, 0.0) = false > (0.3141592653589793E1, 0.0) = true == (0.3141592653589793E1, 0.0) = false ?= (0.3141592653589793E1, 0.0) = false < (0.3141592653589793E1, ~0.17976931348623157E309) = false > (0.3141592653589793E1, ~0.17976931348623157E309) = true == (0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (0.3141592653589793E1, ~0.17976931348623157E309) = false < (0.3141592653589793E1, ~0.8988465674311579E308) = false > (0.3141592653589793E1, ~0.8988465674311579E308) = true == (0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (0.3141592653589793E1, ~0.8988465674311579E308) = false < (0.3141592653589793E1, ~0.123E4) = false > (0.3141592653589793E1, ~0.123E4) = true == (0.3141592653589793E1, ~0.123E4) = false ?= (0.3141592653589793E1, ~0.123E4) = false < (0.3141592653589793E1, ~0.123E2) = false > (0.3141592653589793E1, ~0.123E2) = true == (0.3141592653589793E1, ~0.123E2) = false ?= (0.3141592653589793E1, ~0.123E2) = false < (0.3141592653589793E1, ~0.3141592653589793E1) = false > (0.3141592653589793E1, ~0.3141592653589793E1) = true == (0.3141592653589793E1, ~0.3141592653589793E1) = false ?= (0.3141592653589793E1, ~0.3141592653589793E1) = false < (0.3141592653589793E1, ~0.2718281828459045E1) = false > (0.3141592653589793E1, ~0.2718281828459045E1) = true == (0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (0.3141592653589793E1, ~0.2718281828459045E1) = false < (0.3141592653589793E1, ~0.123E1) = false > (0.3141592653589793E1, ~0.123E1) = true == (0.3141592653589793E1, ~0.123E1) = false ?= (0.3141592653589793E1, ~0.123E1) = false < (0.3141592653589793E1, ~0.123) = false > (0.3141592653589793E1, ~0.123) = true == (0.3141592653589793E1, ~0.123) = false ?= (0.3141592653589793E1, ~0.123) = false < (0.3141592653589793E1, ~0.123E~2) = false > (0.3141592653589793E1, ~0.123E~2) = true == (0.3141592653589793E1, ~0.123E~2) = false ?= (0.3141592653589793E1, ~0.123E~2) = false < (0.3141592653589793E1, ~0.22250738585072014E~307) = false > (0.3141592653589793E1, ~0.22250738585072014E~307) = true == (0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (0.3141592653589793E1, ~0.22250738585072014E~307) = false < (0.3141592653589793E1, ~0.11125369292536007E~307) = false > (0.3141592653589793E1, ~0.11125369292536007E~307) = true == (0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (0.3141592653589793E1, ~0.11125369292536007E~307) = false < (0.3141592653589793E1, ~0.5E~323) = false > (0.3141592653589793E1, ~0.5E~323) = true == (0.3141592653589793E1, ~0.5E~323) = false ?= (0.3141592653589793E1, ~0.5E~323) = false < (0.3141592653589793E1, ~0.0) = false > (0.3141592653589793E1, ~0.0) = true == (0.3141592653589793E1, ~0.0) = false ?= (0.3141592653589793E1, ~0.0) = false < (0.2718281828459045E1, 0.17976931348623157E309) = true > (0.2718281828459045E1, 0.17976931348623157E309) = false == (0.2718281828459045E1, 0.17976931348623157E309) = false ?= (0.2718281828459045E1, 0.17976931348623157E309) = false < (0.2718281828459045E1, 0.8988465674311579E308) = true > (0.2718281828459045E1, 0.8988465674311579E308) = false == (0.2718281828459045E1, 0.8988465674311579E308) = false ?= (0.2718281828459045E1, 0.8988465674311579E308) = false < (0.2718281828459045E1, 0.123E4) = true > (0.2718281828459045E1, 0.123E4) = false == (0.2718281828459045E1, 0.123E4) = false ?= (0.2718281828459045E1, 0.123E4) = false < (0.2718281828459045E1, 0.123E2) = true > (0.2718281828459045E1, 0.123E2) = false == (0.2718281828459045E1, 0.123E2) = false ?= (0.2718281828459045E1, 0.123E2) = false < (0.2718281828459045E1, 0.3141592653589793E1) = true > (0.2718281828459045E1, 0.3141592653589793E1) = false == (0.2718281828459045E1, 0.3141592653589793E1) = false ?= (0.2718281828459045E1, 0.3141592653589793E1) = false < (0.2718281828459045E1, 0.2718281828459045E1) = false > (0.2718281828459045E1, 0.2718281828459045E1) = false == (0.2718281828459045E1, 0.2718281828459045E1) = true ?= (0.2718281828459045E1, 0.2718281828459045E1) = true < (0.2718281828459045E1, 0.123E1) = false > (0.2718281828459045E1, 0.123E1) = true == (0.2718281828459045E1, 0.123E1) = false ?= (0.2718281828459045E1, 0.123E1) = false < (0.2718281828459045E1, 0.123) = false > (0.2718281828459045E1, 0.123) = true == (0.2718281828459045E1, 0.123) = false ?= (0.2718281828459045E1, 0.123) = false < (0.2718281828459045E1, 0.123E~2) = false > (0.2718281828459045E1, 0.123E~2) = true == (0.2718281828459045E1, 0.123E~2) = false ?= (0.2718281828459045E1, 0.123E~2) = false < (0.2718281828459045E1, 0.22250738585072014E~307) = false > (0.2718281828459045E1, 0.22250738585072014E~307) = true == (0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (0.2718281828459045E1, 0.22250738585072014E~307) = false < (0.2718281828459045E1, 0.11125369292536007E~307) = false > (0.2718281828459045E1, 0.11125369292536007E~307) = true == (0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (0.2718281828459045E1, 0.11125369292536007E~307) = false < (0.2718281828459045E1, 0.5E~323) = false > (0.2718281828459045E1, 0.5E~323) = true == (0.2718281828459045E1, 0.5E~323) = false ?= (0.2718281828459045E1, 0.5E~323) = false < (0.2718281828459045E1, 0.0) = false > (0.2718281828459045E1, 0.0) = true == (0.2718281828459045E1, 0.0) = false ?= (0.2718281828459045E1, 0.0) = false < (0.2718281828459045E1, ~0.17976931348623157E309) = false > (0.2718281828459045E1, ~0.17976931348623157E309) = true == (0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (0.2718281828459045E1, ~0.17976931348623157E309) = false < (0.2718281828459045E1, ~0.8988465674311579E308) = false > (0.2718281828459045E1, ~0.8988465674311579E308) = true == (0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (0.2718281828459045E1, ~0.8988465674311579E308) = false < (0.2718281828459045E1, ~0.123E4) = false > (0.2718281828459045E1, ~0.123E4) = true == (0.2718281828459045E1, ~0.123E4) = false ?= (0.2718281828459045E1, ~0.123E4) = false < (0.2718281828459045E1, ~0.123E2) = false > (0.2718281828459045E1, ~0.123E2) = true == (0.2718281828459045E1, ~0.123E2) = false ?= (0.2718281828459045E1, ~0.123E2) = false < (0.2718281828459045E1, ~0.3141592653589793E1) = false > (0.2718281828459045E1, ~0.3141592653589793E1) = true == (0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (0.2718281828459045E1, ~0.3141592653589793E1) = false < (0.2718281828459045E1, ~0.2718281828459045E1) = false > (0.2718281828459045E1, ~0.2718281828459045E1) = true == (0.2718281828459045E1, ~0.2718281828459045E1) = false ?= (0.2718281828459045E1, ~0.2718281828459045E1) = false < (0.2718281828459045E1, ~0.123E1) = false > (0.2718281828459045E1, ~0.123E1) = true == (0.2718281828459045E1, ~0.123E1) = false ?= (0.2718281828459045E1, ~0.123E1) = false < (0.2718281828459045E1, ~0.123) = false > (0.2718281828459045E1, ~0.123) = true == (0.2718281828459045E1, ~0.123) = false ?= (0.2718281828459045E1, ~0.123) = false < (0.2718281828459045E1, ~0.123E~2) = false > (0.2718281828459045E1, ~0.123E~2) = true == (0.2718281828459045E1, ~0.123E~2) = false ?= (0.2718281828459045E1, ~0.123E~2) = false < (0.2718281828459045E1, ~0.22250738585072014E~307) = false > (0.2718281828459045E1, ~0.22250738585072014E~307) = true == (0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (0.2718281828459045E1, ~0.22250738585072014E~307) = false < (0.2718281828459045E1, ~0.11125369292536007E~307) = false > (0.2718281828459045E1, ~0.11125369292536007E~307) = true == (0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (0.2718281828459045E1, ~0.11125369292536007E~307) = false < (0.2718281828459045E1, ~0.5E~323) = false > (0.2718281828459045E1, ~0.5E~323) = true == (0.2718281828459045E1, ~0.5E~323) = false ?= (0.2718281828459045E1, ~0.5E~323) = false < (0.2718281828459045E1, ~0.0) = false > (0.2718281828459045E1, ~0.0) = true == (0.2718281828459045E1, ~0.0) = false ?= (0.2718281828459045E1, ~0.0) = false < (0.123E1, 0.17976931348623157E309) = true > (0.123E1, 0.17976931348623157E309) = false == (0.123E1, 0.17976931348623157E309) = false ?= (0.123E1, 0.17976931348623157E309) = false < (0.123E1, 0.8988465674311579E308) = true > (0.123E1, 0.8988465674311579E308) = false == (0.123E1, 0.8988465674311579E308) = false ?= (0.123E1, 0.8988465674311579E308) = false < (0.123E1, 0.123E4) = true > (0.123E1, 0.123E4) = false == (0.123E1, 0.123E4) = false ?= (0.123E1, 0.123E4) = false < (0.123E1, 0.123E2) = true > (0.123E1, 0.123E2) = false == (0.123E1, 0.123E2) = false ?= (0.123E1, 0.123E2) = false < (0.123E1, 0.3141592653589793E1) = true > (0.123E1, 0.3141592653589793E1) = false == (0.123E1, 0.3141592653589793E1) = false ?= (0.123E1, 0.3141592653589793E1) = false < (0.123E1, 0.2718281828459045E1) = true > (0.123E1, 0.2718281828459045E1) = false == (0.123E1, 0.2718281828459045E1) = false ?= (0.123E1, 0.2718281828459045E1) = false < (0.123E1, 0.123E1) = false > (0.123E1, 0.123E1) = false == (0.123E1, 0.123E1) = true ?= (0.123E1, 0.123E1) = true < (0.123E1, 0.123) = false > (0.123E1, 0.123) = true == (0.123E1, 0.123) = false ?= (0.123E1, 0.123) = false < (0.123E1, 0.123E~2) = false > (0.123E1, 0.123E~2) = true == (0.123E1, 0.123E~2) = false ?= (0.123E1, 0.123E~2) = false < (0.123E1, 0.22250738585072014E~307) = false > (0.123E1, 0.22250738585072014E~307) = true == (0.123E1, 0.22250738585072014E~307) = false ?= (0.123E1, 0.22250738585072014E~307) = false < (0.123E1, 0.11125369292536007E~307) = false > (0.123E1, 0.11125369292536007E~307) = true == (0.123E1, 0.11125369292536007E~307) = false ?= (0.123E1, 0.11125369292536007E~307) = false < (0.123E1, 0.5E~323) = false > (0.123E1, 0.5E~323) = true == (0.123E1, 0.5E~323) = false ?= (0.123E1, 0.5E~323) = false < (0.123E1, 0.0) = false > (0.123E1, 0.0) = true == (0.123E1, 0.0) = false ?= (0.123E1, 0.0) = false < (0.123E1, ~0.17976931348623157E309) = false > (0.123E1, ~0.17976931348623157E309) = true == (0.123E1, ~0.17976931348623157E309) = false ?= (0.123E1, ~0.17976931348623157E309) = false < (0.123E1, ~0.8988465674311579E308) = false > (0.123E1, ~0.8988465674311579E308) = true == (0.123E1, ~0.8988465674311579E308) = false ?= (0.123E1, ~0.8988465674311579E308) = false < (0.123E1, ~0.123E4) = false > (0.123E1, ~0.123E4) = true == (0.123E1, ~0.123E4) = false ?= (0.123E1, ~0.123E4) = false < (0.123E1, ~0.123E2) = false > (0.123E1, ~0.123E2) = true == (0.123E1, ~0.123E2) = false ?= (0.123E1, ~0.123E2) = false < (0.123E1, ~0.3141592653589793E1) = false > (0.123E1, ~0.3141592653589793E1) = true == (0.123E1, ~0.3141592653589793E1) = false ?= (0.123E1, ~0.3141592653589793E1) = false < (0.123E1, ~0.2718281828459045E1) = false > (0.123E1, ~0.2718281828459045E1) = true == (0.123E1, ~0.2718281828459045E1) = false ?= (0.123E1, ~0.2718281828459045E1) = false < (0.123E1, ~0.123E1) = false > (0.123E1, ~0.123E1) = true == (0.123E1, ~0.123E1) = false ?= (0.123E1, ~0.123E1) = false < (0.123E1, ~0.123) = false > (0.123E1, ~0.123) = true == (0.123E1, ~0.123) = false ?= (0.123E1, ~0.123) = false < (0.123E1, ~0.123E~2) = false > (0.123E1, ~0.123E~2) = true == (0.123E1, ~0.123E~2) = false ?= (0.123E1, ~0.123E~2) = false < (0.123E1, ~0.22250738585072014E~307) = false > (0.123E1, ~0.22250738585072014E~307) = true == (0.123E1, ~0.22250738585072014E~307) = false ?= (0.123E1, ~0.22250738585072014E~307) = false < (0.123E1, ~0.11125369292536007E~307) = false > (0.123E1, ~0.11125369292536007E~307) = true == (0.123E1, ~0.11125369292536007E~307) = false ?= (0.123E1, ~0.11125369292536007E~307) = false < (0.123E1, ~0.5E~323) = false > (0.123E1, ~0.5E~323) = true == (0.123E1, ~0.5E~323) = false ?= (0.123E1, ~0.5E~323) = false < (0.123E1, ~0.0) = false > (0.123E1, ~0.0) = true == (0.123E1, ~0.0) = false ?= (0.123E1, ~0.0) = false < (0.123, 0.17976931348623157E309) = true > (0.123, 0.17976931348623157E309) = false == (0.123, 0.17976931348623157E309) = false ?= (0.123, 0.17976931348623157E309) = false < (0.123, 0.8988465674311579E308) = true > (0.123, 0.8988465674311579E308) = false == (0.123, 0.8988465674311579E308) = false ?= (0.123, 0.8988465674311579E308) = false < (0.123, 0.123E4) = true > (0.123, 0.123E4) = false == (0.123, 0.123E4) = false ?= (0.123, 0.123E4) = false < (0.123, 0.123E2) = true > (0.123, 0.123E2) = false == (0.123, 0.123E2) = false ?= (0.123, 0.123E2) = false < (0.123, 0.3141592653589793E1) = true > (0.123, 0.3141592653589793E1) = false == (0.123, 0.3141592653589793E1) = false ?= (0.123, 0.3141592653589793E1) = false < (0.123, 0.2718281828459045E1) = true > (0.123, 0.2718281828459045E1) = false == (0.123, 0.2718281828459045E1) = false ?= (0.123, 0.2718281828459045E1) = false < (0.123, 0.123E1) = true > (0.123, 0.123E1) = false == (0.123, 0.123E1) = false ?= (0.123, 0.123E1) = false < (0.123, 0.123) = false > (0.123, 0.123) = false == (0.123, 0.123) = true ?= (0.123, 0.123) = true < (0.123, 0.123E~2) = false > (0.123, 0.123E~2) = true == (0.123, 0.123E~2) = false ?= (0.123, 0.123E~2) = false < (0.123, 0.22250738585072014E~307) = false > (0.123, 0.22250738585072014E~307) = true == (0.123, 0.22250738585072014E~307) = false ?= (0.123, 0.22250738585072014E~307) = false < (0.123, 0.11125369292536007E~307) = false > (0.123, 0.11125369292536007E~307) = true == (0.123, 0.11125369292536007E~307) = false ?= (0.123, 0.11125369292536007E~307) = false < (0.123, 0.5E~323) = false > (0.123, 0.5E~323) = true == (0.123, 0.5E~323) = false ?= (0.123, 0.5E~323) = false < (0.123, 0.0) = false > (0.123, 0.0) = true == (0.123, 0.0) = false ?= (0.123, 0.0) = false < (0.123, ~0.17976931348623157E309) = false > (0.123, ~0.17976931348623157E309) = true == (0.123, ~0.17976931348623157E309) = false ?= (0.123, ~0.17976931348623157E309) = false < (0.123, ~0.8988465674311579E308) = false > (0.123, ~0.8988465674311579E308) = true == (0.123, ~0.8988465674311579E308) = false ?= (0.123, ~0.8988465674311579E308) = false < (0.123, ~0.123E4) = false > (0.123, ~0.123E4) = true == (0.123, ~0.123E4) = false ?= (0.123, ~0.123E4) = false < (0.123, ~0.123E2) = false > (0.123, ~0.123E2) = true == (0.123, ~0.123E2) = false ?= (0.123, ~0.123E2) = false < (0.123, ~0.3141592653589793E1) = false > (0.123, ~0.3141592653589793E1) = true == (0.123, ~0.3141592653589793E1) = false ?= (0.123, ~0.3141592653589793E1) = false < (0.123, ~0.2718281828459045E1) = false > (0.123, ~0.2718281828459045E1) = true == (0.123, ~0.2718281828459045E1) = false ?= (0.123, ~0.2718281828459045E1) = false < (0.123, ~0.123E1) = false > (0.123, ~0.123E1) = true == (0.123, ~0.123E1) = false ?= (0.123, ~0.123E1) = false < (0.123, ~0.123) = false > (0.123, ~0.123) = true == (0.123, ~0.123) = false ?= (0.123, ~0.123) = false < (0.123, ~0.123E~2) = false > (0.123, ~0.123E~2) = true == (0.123, ~0.123E~2) = false ?= (0.123, ~0.123E~2) = false < (0.123, ~0.22250738585072014E~307) = false > (0.123, ~0.22250738585072014E~307) = true == (0.123, ~0.22250738585072014E~307) = false ?= (0.123, ~0.22250738585072014E~307) = false < (0.123, ~0.11125369292536007E~307) = false > (0.123, ~0.11125369292536007E~307) = true == (0.123, ~0.11125369292536007E~307) = false ?= (0.123, ~0.11125369292536007E~307) = false < (0.123, ~0.5E~323) = false > (0.123, ~0.5E~323) = true == (0.123, ~0.5E~323) = false ?= (0.123, ~0.5E~323) = false < (0.123, ~0.0) = false > (0.123, ~0.0) = true == (0.123, ~0.0) = false ?= (0.123, ~0.0) = false < (0.123E~2, 0.17976931348623157E309) = true > (0.123E~2, 0.17976931348623157E309) = false == (0.123E~2, 0.17976931348623157E309) = false ?= (0.123E~2, 0.17976931348623157E309) = false < (0.123E~2, 0.8988465674311579E308) = true > (0.123E~2, 0.8988465674311579E308) = false == (0.123E~2, 0.8988465674311579E308) = false ?= (0.123E~2, 0.8988465674311579E308) = false < (0.123E~2, 0.123E4) = true > (0.123E~2, 0.123E4) = false == (0.123E~2, 0.123E4) = false ?= (0.123E~2, 0.123E4) = false < (0.123E~2, 0.123E2) = true > (0.123E~2, 0.123E2) = false == (0.123E~2, 0.123E2) = false ?= (0.123E~2, 0.123E2) = false < (0.123E~2, 0.3141592653589793E1) = true > (0.123E~2, 0.3141592653589793E1) = false == (0.123E~2, 0.3141592653589793E1) = false ?= (0.123E~2, 0.3141592653589793E1) = false < (0.123E~2, 0.2718281828459045E1) = true > (0.123E~2, 0.2718281828459045E1) = false == (0.123E~2, 0.2718281828459045E1) = false ?= (0.123E~2, 0.2718281828459045E1) = false < (0.123E~2, 0.123E1) = true > (0.123E~2, 0.123E1) = false == (0.123E~2, 0.123E1) = false ?= (0.123E~2, 0.123E1) = false < (0.123E~2, 0.123) = true > (0.123E~2, 0.123) = false == (0.123E~2, 0.123) = false ?= (0.123E~2, 0.123) = false < (0.123E~2, 0.123E~2) = false > (0.123E~2, 0.123E~2) = false == (0.123E~2, 0.123E~2) = true ?= (0.123E~2, 0.123E~2) = true < (0.123E~2, 0.22250738585072014E~307) = false > (0.123E~2, 0.22250738585072014E~307) = true == (0.123E~2, 0.22250738585072014E~307) = false ?= (0.123E~2, 0.22250738585072014E~307) = false < (0.123E~2, 0.11125369292536007E~307) = false > (0.123E~2, 0.11125369292536007E~307) = true == (0.123E~2, 0.11125369292536007E~307) = false ?= (0.123E~2, 0.11125369292536007E~307) = false < (0.123E~2, 0.5E~323) = false > (0.123E~2, 0.5E~323) = true == (0.123E~2, 0.5E~323) = false ?= (0.123E~2, 0.5E~323) = false < (0.123E~2, 0.0) = false > (0.123E~2, 0.0) = true == (0.123E~2, 0.0) = false ?= (0.123E~2, 0.0) = false < (0.123E~2, ~0.17976931348623157E309) = false > (0.123E~2, ~0.17976931348623157E309) = true == (0.123E~2, ~0.17976931348623157E309) = false ?= (0.123E~2, ~0.17976931348623157E309) = false < (0.123E~2, ~0.8988465674311579E308) = false > (0.123E~2, ~0.8988465674311579E308) = true == (0.123E~2, ~0.8988465674311579E308) = false ?= (0.123E~2, ~0.8988465674311579E308) = false < (0.123E~2, ~0.123E4) = false > (0.123E~2, ~0.123E4) = true == (0.123E~2, ~0.123E4) = false ?= (0.123E~2, ~0.123E4) = false < (0.123E~2, ~0.123E2) = false > (0.123E~2, ~0.123E2) = true == (0.123E~2, ~0.123E2) = false ?= (0.123E~2, ~0.123E2) = false < (0.123E~2, ~0.3141592653589793E1) = false > (0.123E~2, ~0.3141592653589793E1) = true == (0.123E~2, ~0.3141592653589793E1) = false ?= (0.123E~2, ~0.3141592653589793E1) = false < (0.123E~2, ~0.2718281828459045E1) = false > (0.123E~2, ~0.2718281828459045E1) = true == (0.123E~2, ~0.2718281828459045E1) = false ?= (0.123E~2, ~0.2718281828459045E1) = false < (0.123E~2, ~0.123E1) = false > (0.123E~2, ~0.123E1) = true == (0.123E~2, ~0.123E1) = false ?= (0.123E~2, ~0.123E1) = false < (0.123E~2, ~0.123) = false > (0.123E~2, ~0.123) = true == (0.123E~2, ~0.123) = false ?= (0.123E~2, ~0.123) = false < (0.123E~2, ~0.123E~2) = false > (0.123E~2, ~0.123E~2) = true == (0.123E~2, ~0.123E~2) = false ?= (0.123E~2, ~0.123E~2) = false < (0.123E~2, ~0.22250738585072014E~307) = false > (0.123E~2, ~0.22250738585072014E~307) = true == (0.123E~2, ~0.22250738585072014E~307) = false ?= (0.123E~2, ~0.22250738585072014E~307) = false < (0.123E~2, ~0.11125369292536007E~307) = false > (0.123E~2, ~0.11125369292536007E~307) = true == (0.123E~2, ~0.11125369292536007E~307) = false ?= (0.123E~2, ~0.11125369292536007E~307) = false < (0.123E~2, ~0.5E~323) = false > (0.123E~2, ~0.5E~323) = true == (0.123E~2, ~0.5E~323) = false ?= (0.123E~2, ~0.5E~323) = false < (0.123E~2, ~0.0) = false > (0.123E~2, ~0.0) = true == (0.123E~2, ~0.0) = false ?= (0.123E~2, ~0.0) = false < (0.22250738585072014E~307, 0.17976931348623157E309) = true > (0.22250738585072014E~307, 0.17976931348623157E309) = false == (0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (0.22250738585072014E~307, 0.17976931348623157E309) = false < (0.22250738585072014E~307, 0.8988465674311579E308) = true > (0.22250738585072014E~307, 0.8988465674311579E308) = false == (0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (0.22250738585072014E~307, 0.8988465674311579E308) = false < (0.22250738585072014E~307, 0.123E4) = true > (0.22250738585072014E~307, 0.123E4) = false == (0.22250738585072014E~307, 0.123E4) = false ?= (0.22250738585072014E~307, 0.123E4) = false < (0.22250738585072014E~307, 0.123E2) = true > (0.22250738585072014E~307, 0.123E2) = false == (0.22250738585072014E~307, 0.123E2) = false ?= (0.22250738585072014E~307, 0.123E2) = false < (0.22250738585072014E~307, 0.3141592653589793E1) = true > (0.22250738585072014E~307, 0.3141592653589793E1) = false == (0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (0.22250738585072014E~307, 0.3141592653589793E1) = false < (0.22250738585072014E~307, 0.2718281828459045E1) = true > (0.22250738585072014E~307, 0.2718281828459045E1) = false == (0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (0.22250738585072014E~307, 0.2718281828459045E1) = false < (0.22250738585072014E~307, 0.123E1) = true > (0.22250738585072014E~307, 0.123E1) = false == (0.22250738585072014E~307, 0.123E1) = false ?= (0.22250738585072014E~307, 0.123E1) = false < (0.22250738585072014E~307, 0.123) = true > (0.22250738585072014E~307, 0.123) = false == (0.22250738585072014E~307, 0.123) = false ?= (0.22250738585072014E~307, 0.123) = false < (0.22250738585072014E~307, 0.123E~2) = true > (0.22250738585072014E~307, 0.123E~2) = false == (0.22250738585072014E~307, 0.123E~2) = false ?= (0.22250738585072014E~307, 0.123E~2) = false < (0.22250738585072014E~307, 0.22250738585072014E~307) = false > (0.22250738585072014E~307, 0.22250738585072014E~307) = false == (0.22250738585072014E~307, 0.22250738585072014E~307) = true ?= (0.22250738585072014E~307, 0.22250738585072014E~307) = true < (0.22250738585072014E~307, 0.11125369292536007E~307) = false > (0.22250738585072014E~307, 0.11125369292536007E~307) = true == (0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, 0.11125369292536007E~307) = false < (0.22250738585072014E~307, 0.5E~323) = false > (0.22250738585072014E~307, 0.5E~323) = true == (0.22250738585072014E~307, 0.5E~323) = false ?= (0.22250738585072014E~307, 0.5E~323) = false < (0.22250738585072014E~307, 0.0) = false > (0.22250738585072014E~307, 0.0) = true == (0.22250738585072014E~307, 0.0) = false ?= (0.22250738585072014E~307, 0.0) = false < (0.22250738585072014E~307, ~0.17976931348623157E309) = false > (0.22250738585072014E~307, ~0.17976931348623157E309) = true == (0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (0.22250738585072014E~307, ~0.17976931348623157E309) = false < (0.22250738585072014E~307, ~0.8988465674311579E308) = false > (0.22250738585072014E~307, ~0.8988465674311579E308) = true == (0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (0.22250738585072014E~307, ~0.8988465674311579E308) = false < (0.22250738585072014E~307, ~0.123E4) = false > (0.22250738585072014E~307, ~0.123E4) = true == (0.22250738585072014E~307, ~0.123E4) = false ?= (0.22250738585072014E~307, ~0.123E4) = false < (0.22250738585072014E~307, ~0.123E2) = false > (0.22250738585072014E~307, ~0.123E2) = true == (0.22250738585072014E~307, ~0.123E2) = false ?= (0.22250738585072014E~307, ~0.123E2) = false < (0.22250738585072014E~307, ~0.3141592653589793E1) = false > (0.22250738585072014E~307, ~0.3141592653589793E1) = true == (0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (0.22250738585072014E~307, ~0.3141592653589793E1) = false < (0.22250738585072014E~307, ~0.2718281828459045E1) = false > (0.22250738585072014E~307, ~0.2718281828459045E1) = true == (0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (0.22250738585072014E~307, ~0.2718281828459045E1) = false < (0.22250738585072014E~307, ~0.123E1) = false > (0.22250738585072014E~307, ~0.123E1) = true == (0.22250738585072014E~307, ~0.123E1) = false ?= (0.22250738585072014E~307, ~0.123E1) = false < (0.22250738585072014E~307, ~0.123) = false > (0.22250738585072014E~307, ~0.123) = true == (0.22250738585072014E~307, ~0.123) = false ?= (0.22250738585072014E~307, ~0.123) = false < (0.22250738585072014E~307, ~0.123E~2) = false > (0.22250738585072014E~307, ~0.123E~2) = true == (0.22250738585072014E~307, ~0.123E~2) = false ?= (0.22250738585072014E~307, ~0.123E~2) = false < (0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (0.22250738585072014E~307, ~0.22250738585072014E~307) = true == (0.22250738585072014E~307, ~0.22250738585072014E~307) = false ?= (0.22250738585072014E~307, ~0.22250738585072014E~307) = false < (0.22250738585072014E~307, ~0.11125369292536007E~307) = false > (0.22250738585072014E~307, ~0.11125369292536007E~307) = true == (0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (0.22250738585072014E~307, ~0.5E~323) = false > (0.22250738585072014E~307, ~0.5E~323) = true == (0.22250738585072014E~307, ~0.5E~323) = false ?= (0.22250738585072014E~307, ~0.5E~323) = false < (0.22250738585072014E~307, ~0.0) = false > (0.22250738585072014E~307, ~0.0) = true == (0.22250738585072014E~307, ~0.0) = false ?= (0.22250738585072014E~307, ~0.0) = false < (0.11125369292536007E~307, 0.17976931348623157E309) = true > (0.11125369292536007E~307, 0.17976931348623157E309) = false == (0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (0.11125369292536007E~307, 0.17976931348623157E309) = false < (0.11125369292536007E~307, 0.8988465674311579E308) = true > (0.11125369292536007E~307, 0.8988465674311579E308) = false == (0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (0.11125369292536007E~307, 0.8988465674311579E308) = false < (0.11125369292536007E~307, 0.123E4) = true > (0.11125369292536007E~307, 0.123E4) = false == (0.11125369292536007E~307, 0.123E4) = false ?= (0.11125369292536007E~307, 0.123E4) = false < (0.11125369292536007E~307, 0.123E2) = true > (0.11125369292536007E~307, 0.123E2) = false == (0.11125369292536007E~307, 0.123E2) = false ?= (0.11125369292536007E~307, 0.123E2) = false < (0.11125369292536007E~307, 0.3141592653589793E1) = true > (0.11125369292536007E~307, 0.3141592653589793E1) = false == (0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (0.11125369292536007E~307, 0.3141592653589793E1) = false < (0.11125369292536007E~307, 0.2718281828459045E1) = true > (0.11125369292536007E~307, 0.2718281828459045E1) = false == (0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (0.11125369292536007E~307, 0.2718281828459045E1) = false < (0.11125369292536007E~307, 0.123E1) = true > (0.11125369292536007E~307, 0.123E1) = false == (0.11125369292536007E~307, 0.123E1) = false ?= (0.11125369292536007E~307, 0.123E1) = false < (0.11125369292536007E~307, 0.123) = true > (0.11125369292536007E~307, 0.123) = false == (0.11125369292536007E~307, 0.123) = false ?= (0.11125369292536007E~307, 0.123) = false < (0.11125369292536007E~307, 0.123E~2) = true > (0.11125369292536007E~307, 0.123E~2) = false == (0.11125369292536007E~307, 0.123E~2) = false ?= (0.11125369292536007E~307, 0.123E~2) = false < (0.11125369292536007E~307, 0.22250738585072014E~307) = true > (0.11125369292536007E~307, 0.22250738585072014E~307) = false == (0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, 0.22250738585072014E~307) = false < (0.11125369292536007E~307, 0.11125369292536007E~307) = false > (0.11125369292536007E~307, 0.11125369292536007E~307) = false == (0.11125369292536007E~307, 0.11125369292536007E~307) = true ?= (0.11125369292536007E~307, 0.11125369292536007E~307) = true < (0.11125369292536007E~307, 0.5E~323) = false > (0.11125369292536007E~307, 0.5E~323) = true == (0.11125369292536007E~307, 0.5E~323) = false ?= (0.11125369292536007E~307, 0.5E~323) = false < (0.11125369292536007E~307, 0.0) = false > (0.11125369292536007E~307, 0.0) = true == (0.11125369292536007E~307, 0.0) = false ?= (0.11125369292536007E~307, 0.0) = false < (0.11125369292536007E~307, ~0.17976931348623157E309) = false > (0.11125369292536007E~307, ~0.17976931348623157E309) = true == (0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (0.11125369292536007E~307, ~0.17976931348623157E309) = false < (0.11125369292536007E~307, ~0.8988465674311579E308) = false > (0.11125369292536007E~307, ~0.8988465674311579E308) = true == (0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (0.11125369292536007E~307, ~0.8988465674311579E308) = false < (0.11125369292536007E~307, ~0.123E4) = false > (0.11125369292536007E~307, ~0.123E4) = true == (0.11125369292536007E~307, ~0.123E4) = false ?= (0.11125369292536007E~307, ~0.123E4) = false < (0.11125369292536007E~307, ~0.123E2) = false > (0.11125369292536007E~307, ~0.123E2) = true == (0.11125369292536007E~307, ~0.123E2) = false ?= (0.11125369292536007E~307, ~0.123E2) = false < (0.11125369292536007E~307, ~0.3141592653589793E1) = false > (0.11125369292536007E~307, ~0.3141592653589793E1) = true == (0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (0.11125369292536007E~307, ~0.3141592653589793E1) = false < (0.11125369292536007E~307, ~0.2718281828459045E1) = false > (0.11125369292536007E~307, ~0.2718281828459045E1) = true == (0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (0.11125369292536007E~307, ~0.2718281828459045E1) = false < (0.11125369292536007E~307, ~0.123E1) = false > (0.11125369292536007E~307, ~0.123E1) = true == (0.11125369292536007E~307, ~0.123E1) = false ?= (0.11125369292536007E~307, ~0.123E1) = false < (0.11125369292536007E~307, ~0.123) = false > (0.11125369292536007E~307, ~0.123) = true == (0.11125369292536007E~307, ~0.123) = false ?= (0.11125369292536007E~307, ~0.123) = false < (0.11125369292536007E~307, ~0.123E~2) = false > (0.11125369292536007E~307, ~0.123E~2) = true == (0.11125369292536007E~307, ~0.123E~2) = false ?= (0.11125369292536007E~307, ~0.123E~2) = false < (0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (0.11125369292536007E~307, ~0.11125369292536007E~307) = true == (0.11125369292536007E~307, ~0.11125369292536007E~307) = false ?= (0.11125369292536007E~307, ~0.11125369292536007E~307) = false < (0.11125369292536007E~307, ~0.5E~323) = false > (0.11125369292536007E~307, ~0.5E~323) = true == (0.11125369292536007E~307, ~0.5E~323) = false ?= (0.11125369292536007E~307, ~0.5E~323) = false < (0.11125369292536007E~307, ~0.0) = false > (0.11125369292536007E~307, ~0.0) = true == (0.11125369292536007E~307, ~0.0) = false ?= (0.11125369292536007E~307, ~0.0) = false < (0.5E~323, 0.17976931348623157E309) = true > (0.5E~323, 0.17976931348623157E309) = false == (0.5E~323, 0.17976931348623157E309) = false ?= (0.5E~323, 0.17976931348623157E309) = false < (0.5E~323, 0.8988465674311579E308) = true > (0.5E~323, 0.8988465674311579E308) = false == (0.5E~323, 0.8988465674311579E308) = false ?= (0.5E~323, 0.8988465674311579E308) = false < (0.5E~323, 0.123E4) = true > (0.5E~323, 0.123E4) = false == (0.5E~323, 0.123E4) = false ?= (0.5E~323, 0.123E4) = false < (0.5E~323, 0.123E2) = true > (0.5E~323, 0.123E2) = false == (0.5E~323, 0.123E2) = false ?= (0.5E~323, 0.123E2) = false < (0.5E~323, 0.3141592653589793E1) = true > (0.5E~323, 0.3141592653589793E1) = false == (0.5E~323, 0.3141592653589793E1) = false ?= (0.5E~323, 0.3141592653589793E1) = false < (0.5E~323, 0.2718281828459045E1) = true > (0.5E~323, 0.2718281828459045E1) = false == (0.5E~323, 0.2718281828459045E1) = false ?= (0.5E~323, 0.2718281828459045E1) = false < (0.5E~323, 0.123E1) = true > (0.5E~323, 0.123E1) = false == (0.5E~323, 0.123E1) = false ?= (0.5E~323, 0.123E1) = false < (0.5E~323, 0.123) = true > (0.5E~323, 0.123) = false == (0.5E~323, 0.123) = false ?= (0.5E~323, 0.123) = false < (0.5E~323, 0.123E~2) = true > (0.5E~323, 0.123E~2) = false == (0.5E~323, 0.123E~2) = false ?= (0.5E~323, 0.123E~2) = false < (0.5E~323, 0.22250738585072014E~307) = true > (0.5E~323, 0.22250738585072014E~307) = false == (0.5E~323, 0.22250738585072014E~307) = false ?= (0.5E~323, 0.22250738585072014E~307) = false < (0.5E~323, 0.11125369292536007E~307) = true > (0.5E~323, 0.11125369292536007E~307) = false == (0.5E~323, 0.11125369292536007E~307) = false ?= (0.5E~323, 0.11125369292536007E~307) = false < (0.5E~323, 0.5E~323) = false > (0.5E~323, 0.5E~323) = false == (0.5E~323, 0.5E~323) = true ?= (0.5E~323, 0.5E~323) = true < (0.5E~323, 0.0) = false > (0.5E~323, 0.0) = true == (0.5E~323, 0.0) = false ?= (0.5E~323, 0.0) = false < (0.5E~323, ~0.17976931348623157E309) = false > (0.5E~323, ~0.17976931348623157E309) = true == (0.5E~323, ~0.17976931348623157E309) = false ?= (0.5E~323, ~0.17976931348623157E309) = false < (0.5E~323, ~0.8988465674311579E308) = false > (0.5E~323, ~0.8988465674311579E308) = true == (0.5E~323, ~0.8988465674311579E308) = false ?= (0.5E~323, ~0.8988465674311579E308) = false < (0.5E~323, ~0.123E4) = false > (0.5E~323, ~0.123E4) = true == (0.5E~323, ~0.123E4) = false ?= (0.5E~323, ~0.123E4) = false < (0.5E~323, ~0.123E2) = false > (0.5E~323, ~0.123E2) = true == (0.5E~323, ~0.123E2) = false ?= (0.5E~323, ~0.123E2) = false < (0.5E~323, ~0.3141592653589793E1) = false > (0.5E~323, ~0.3141592653589793E1) = true == (0.5E~323, ~0.3141592653589793E1) = false ?= (0.5E~323, ~0.3141592653589793E1) = false < (0.5E~323, ~0.2718281828459045E1) = false > (0.5E~323, ~0.2718281828459045E1) = true == (0.5E~323, ~0.2718281828459045E1) = false ?= (0.5E~323, ~0.2718281828459045E1) = false < (0.5E~323, ~0.123E1) = false > (0.5E~323, ~0.123E1) = true == (0.5E~323, ~0.123E1) = false ?= (0.5E~323, ~0.123E1) = false < (0.5E~323, ~0.123) = false > (0.5E~323, ~0.123) = true == (0.5E~323, ~0.123) = false ?= (0.5E~323, ~0.123) = false < (0.5E~323, ~0.123E~2) = false > (0.5E~323, ~0.123E~2) = true == (0.5E~323, ~0.123E~2) = false ?= (0.5E~323, ~0.123E~2) = false < (0.5E~323, ~0.22250738585072014E~307) = false > (0.5E~323, ~0.22250738585072014E~307) = true == (0.5E~323, ~0.22250738585072014E~307) = false ?= (0.5E~323, ~0.22250738585072014E~307) = false < (0.5E~323, ~0.11125369292536007E~307) = false > (0.5E~323, ~0.11125369292536007E~307) = true == (0.5E~323, ~0.11125369292536007E~307) = false ?= (0.5E~323, ~0.11125369292536007E~307) = false < (0.5E~323, ~0.5E~323) = false > (0.5E~323, ~0.5E~323) = true == (0.5E~323, ~0.5E~323) = false ?= (0.5E~323, ~0.5E~323) = false < (0.5E~323, ~0.0) = false > (0.5E~323, ~0.0) = true == (0.5E~323, ~0.0) = false ?= (0.5E~323, ~0.0) = false < (0.0, 0.17976931348623157E309) = true > (0.0, 0.17976931348623157E309) = false == (0.0, 0.17976931348623157E309) = false ?= (0.0, 0.17976931348623157E309) = false < (0.0, 0.8988465674311579E308) = true > (0.0, 0.8988465674311579E308) = false == (0.0, 0.8988465674311579E308) = false ?= (0.0, 0.8988465674311579E308) = false < (0.0, 0.123E4) = true > (0.0, 0.123E4) = false == (0.0, 0.123E4) = false ?= (0.0, 0.123E4) = false < (0.0, 0.123E2) = true > (0.0, 0.123E2) = false == (0.0, 0.123E2) = false ?= (0.0, 0.123E2) = false < (0.0, 0.3141592653589793E1) = true > (0.0, 0.3141592653589793E1) = false == (0.0, 0.3141592653589793E1) = false ?= (0.0, 0.3141592653589793E1) = false < (0.0, 0.2718281828459045E1) = true > (0.0, 0.2718281828459045E1) = false == (0.0, 0.2718281828459045E1) = false ?= (0.0, 0.2718281828459045E1) = false < (0.0, 0.123E1) = true > (0.0, 0.123E1) = false == (0.0, 0.123E1) = false ?= (0.0, 0.123E1) = false < (0.0, 0.123) = true > (0.0, 0.123) = false == (0.0, 0.123) = false ?= (0.0, 0.123) = false < (0.0, 0.123E~2) = true > (0.0, 0.123E~2) = false == (0.0, 0.123E~2) = false ?= (0.0, 0.123E~2) = false < (0.0, 0.22250738585072014E~307) = true > (0.0, 0.22250738585072014E~307) = false == (0.0, 0.22250738585072014E~307) = false ?= (0.0, 0.22250738585072014E~307) = false < (0.0, 0.11125369292536007E~307) = true > (0.0, 0.11125369292536007E~307) = false == (0.0, 0.11125369292536007E~307) = false ?= (0.0, 0.11125369292536007E~307) = false < (0.0, 0.5E~323) = true > (0.0, 0.5E~323) = false == (0.0, 0.5E~323) = false ?= (0.0, 0.5E~323) = false < (0.0, 0.0) = false > (0.0, 0.0) = false == (0.0, 0.0) = true ?= (0.0, 0.0) = true < (0.0, ~0.17976931348623157E309) = false > (0.0, ~0.17976931348623157E309) = true == (0.0, ~0.17976931348623157E309) = false ?= (0.0, ~0.17976931348623157E309) = false < (0.0, ~0.8988465674311579E308) = false > (0.0, ~0.8988465674311579E308) = true == (0.0, ~0.8988465674311579E308) = false ?= (0.0, ~0.8988465674311579E308) = false < (0.0, ~0.123E4) = false > (0.0, ~0.123E4) = true == (0.0, ~0.123E4) = false ?= (0.0, ~0.123E4) = false < (0.0, ~0.123E2) = false > (0.0, ~0.123E2) = true == (0.0, ~0.123E2) = false ?= (0.0, ~0.123E2) = false < (0.0, ~0.3141592653589793E1) = false > (0.0, ~0.3141592653589793E1) = true == (0.0, ~0.3141592653589793E1) = false ?= (0.0, ~0.3141592653589793E1) = false < (0.0, ~0.2718281828459045E1) = false > (0.0, ~0.2718281828459045E1) = true == (0.0, ~0.2718281828459045E1) = false ?= (0.0, ~0.2718281828459045E1) = false < (0.0, ~0.123E1) = false > (0.0, ~0.123E1) = true == (0.0, ~0.123E1) = false ?= (0.0, ~0.123E1) = false < (0.0, ~0.123) = false > (0.0, ~0.123) = true == (0.0, ~0.123) = false ?= (0.0, ~0.123) = false < (0.0, ~0.123E~2) = false > (0.0, ~0.123E~2) = true == (0.0, ~0.123E~2) = false ?= (0.0, ~0.123E~2) = false < (0.0, ~0.22250738585072014E~307) = false > (0.0, ~0.22250738585072014E~307) = true == (0.0, ~0.22250738585072014E~307) = false ?= (0.0, ~0.22250738585072014E~307) = false < (0.0, ~0.11125369292536007E~307) = false > (0.0, ~0.11125369292536007E~307) = true == (0.0, ~0.11125369292536007E~307) = false ?= (0.0, ~0.11125369292536007E~307) = false < (0.0, ~0.5E~323) = false > (0.0, ~0.5E~323) = true == (0.0, ~0.5E~323) = false ?= (0.0, ~0.5E~323) = false < (0.0, ~0.0) = false > (0.0, ~0.0) = false == (0.0, ~0.0) = true ?= (0.0, ~0.0) = true < (~0.17976931348623157E309, 0.17976931348623157E309) = true > (~0.17976931348623157E309, 0.17976931348623157E309) = false == (~0.17976931348623157E309, 0.17976931348623157E309) = false ?= (~0.17976931348623157E309, 0.17976931348623157E309) = false < (~0.17976931348623157E309, 0.8988465674311579E308) = true > (~0.17976931348623157E309, 0.8988465674311579E308) = false == (~0.17976931348623157E309, 0.8988465674311579E308) = false ?= (~0.17976931348623157E309, 0.8988465674311579E308) = false < (~0.17976931348623157E309, 0.123E4) = true > (~0.17976931348623157E309, 0.123E4) = false == (~0.17976931348623157E309, 0.123E4) = false ?= (~0.17976931348623157E309, 0.123E4) = false < (~0.17976931348623157E309, 0.123E2) = true > (~0.17976931348623157E309, 0.123E2) = false == (~0.17976931348623157E309, 0.123E2) = false ?= (~0.17976931348623157E309, 0.123E2) = false < (~0.17976931348623157E309, 0.3141592653589793E1) = true > (~0.17976931348623157E309, 0.3141592653589793E1) = false == (~0.17976931348623157E309, 0.3141592653589793E1) = false ?= (~0.17976931348623157E309, 0.3141592653589793E1) = false < (~0.17976931348623157E309, 0.2718281828459045E1) = true > (~0.17976931348623157E309, 0.2718281828459045E1) = false == (~0.17976931348623157E309, 0.2718281828459045E1) = false ?= (~0.17976931348623157E309, 0.2718281828459045E1) = false < (~0.17976931348623157E309, 0.123E1) = true > (~0.17976931348623157E309, 0.123E1) = false == (~0.17976931348623157E309, 0.123E1) = false ?= (~0.17976931348623157E309, 0.123E1) = false < (~0.17976931348623157E309, 0.123) = true > (~0.17976931348623157E309, 0.123) = false == (~0.17976931348623157E309, 0.123) = false ?= (~0.17976931348623157E309, 0.123) = false < (~0.17976931348623157E309, 0.123E~2) = true > (~0.17976931348623157E309, 0.123E~2) = false == (~0.17976931348623157E309, 0.123E~2) = false ?= (~0.17976931348623157E309, 0.123E~2) = false < (~0.17976931348623157E309, 0.22250738585072014E~307) = true > (~0.17976931348623157E309, 0.22250738585072014E~307) = false == (~0.17976931348623157E309, 0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, 0.22250738585072014E~307) = false < (~0.17976931348623157E309, 0.11125369292536007E~307) = true > (~0.17976931348623157E309, 0.11125369292536007E~307) = false == (~0.17976931348623157E309, 0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, 0.11125369292536007E~307) = false < (~0.17976931348623157E309, 0.5E~323) = true > (~0.17976931348623157E309, 0.5E~323) = false == (~0.17976931348623157E309, 0.5E~323) = false ?= (~0.17976931348623157E309, 0.5E~323) = false < (~0.17976931348623157E309, 0.0) = true > (~0.17976931348623157E309, 0.0) = false == (~0.17976931348623157E309, 0.0) = false ?= (~0.17976931348623157E309, 0.0) = false < (~0.17976931348623157E309, ~0.17976931348623157E309) = false > (~0.17976931348623157E309, ~0.17976931348623157E309) = false == (~0.17976931348623157E309, ~0.17976931348623157E309) = true ?= (~0.17976931348623157E309, ~0.17976931348623157E309) = true < (~0.17976931348623157E309, ~0.8988465674311579E308) = true > (~0.17976931348623157E309, ~0.8988465674311579E308) = false == (~0.17976931348623157E309, ~0.8988465674311579E308) = false ?= (~0.17976931348623157E309, ~0.8988465674311579E308) = false < (~0.17976931348623157E309, ~0.123E4) = true > (~0.17976931348623157E309, ~0.123E4) = false == (~0.17976931348623157E309, ~0.123E4) = false ?= (~0.17976931348623157E309, ~0.123E4) = false < (~0.17976931348623157E309, ~0.123E2) = true > (~0.17976931348623157E309, ~0.123E2) = false == (~0.17976931348623157E309, ~0.123E2) = false ?= (~0.17976931348623157E309, ~0.123E2) = false < (~0.17976931348623157E309, ~0.3141592653589793E1) = true > (~0.17976931348623157E309, ~0.3141592653589793E1) = false == (~0.17976931348623157E309, ~0.3141592653589793E1) = false ?= (~0.17976931348623157E309, ~0.3141592653589793E1) = false < (~0.17976931348623157E309, ~0.2718281828459045E1) = true > (~0.17976931348623157E309, ~0.2718281828459045E1) = false == (~0.17976931348623157E309, ~0.2718281828459045E1) = false ?= (~0.17976931348623157E309, ~0.2718281828459045E1) = false < (~0.17976931348623157E309, ~0.123E1) = true > (~0.17976931348623157E309, ~0.123E1) = false == (~0.17976931348623157E309, ~0.123E1) = false ?= (~0.17976931348623157E309, ~0.123E1) = false < (~0.17976931348623157E309, ~0.123) = true > (~0.17976931348623157E309, ~0.123) = false == (~0.17976931348623157E309, ~0.123) = false ?= (~0.17976931348623157E309, ~0.123) = false < (~0.17976931348623157E309, ~0.123E~2) = true > (~0.17976931348623157E309, ~0.123E~2) = false == (~0.17976931348623157E309, ~0.123E~2) = false ?= (~0.17976931348623157E309, ~0.123E~2) = false < (~0.17976931348623157E309, ~0.22250738585072014E~307) = true > (~0.17976931348623157E309, ~0.22250738585072014E~307) = false == (~0.17976931348623157E309, ~0.22250738585072014E~307) = false ?= (~0.17976931348623157E309, ~0.22250738585072014E~307) = false < (~0.17976931348623157E309, ~0.11125369292536007E~307) = true > (~0.17976931348623157E309, ~0.11125369292536007E~307) = false == (~0.17976931348623157E309, ~0.11125369292536007E~307) = false ?= (~0.17976931348623157E309, ~0.11125369292536007E~307) = false < (~0.17976931348623157E309, ~0.5E~323) = true > (~0.17976931348623157E309, ~0.5E~323) = false == (~0.17976931348623157E309, ~0.5E~323) = false ?= (~0.17976931348623157E309, ~0.5E~323) = false < (~0.17976931348623157E309, ~0.0) = true > (~0.17976931348623157E309, ~0.0) = false == (~0.17976931348623157E309, ~0.0) = false ?= (~0.17976931348623157E309, ~0.0) = false < (~0.8988465674311579E308, 0.17976931348623157E309) = true > (~0.8988465674311579E308, 0.17976931348623157E309) = false == (~0.8988465674311579E308, 0.17976931348623157E309) = false ?= (~0.8988465674311579E308, 0.17976931348623157E309) = false < (~0.8988465674311579E308, 0.8988465674311579E308) = true > (~0.8988465674311579E308, 0.8988465674311579E308) = false == (~0.8988465674311579E308, 0.8988465674311579E308) = false ?= (~0.8988465674311579E308, 0.8988465674311579E308) = false < (~0.8988465674311579E308, 0.123E4) = true > (~0.8988465674311579E308, 0.123E4) = false == (~0.8988465674311579E308, 0.123E4) = false ?= (~0.8988465674311579E308, 0.123E4) = false < (~0.8988465674311579E308, 0.123E2) = true > (~0.8988465674311579E308, 0.123E2) = false == (~0.8988465674311579E308, 0.123E2) = false ?= (~0.8988465674311579E308, 0.123E2) = false < (~0.8988465674311579E308, 0.3141592653589793E1) = true > (~0.8988465674311579E308, 0.3141592653589793E1) = false == (~0.8988465674311579E308, 0.3141592653589793E1) = false ?= (~0.8988465674311579E308, 0.3141592653589793E1) = false < (~0.8988465674311579E308, 0.2718281828459045E1) = true > (~0.8988465674311579E308, 0.2718281828459045E1) = false == (~0.8988465674311579E308, 0.2718281828459045E1) = false ?= (~0.8988465674311579E308, 0.2718281828459045E1) = false < (~0.8988465674311579E308, 0.123E1) = true > (~0.8988465674311579E308, 0.123E1) = false == (~0.8988465674311579E308, 0.123E1) = false ?= (~0.8988465674311579E308, 0.123E1) = false < (~0.8988465674311579E308, 0.123) = true > (~0.8988465674311579E308, 0.123) = false == (~0.8988465674311579E308, 0.123) = false ?= (~0.8988465674311579E308, 0.123) = false < (~0.8988465674311579E308, 0.123E~2) = true > (~0.8988465674311579E308, 0.123E~2) = false == (~0.8988465674311579E308, 0.123E~2) = false ?= (~0.8988465674311579E308, 0.123E~2) = false < (~0.8988465674311579E308, 0.22250738585072014E~307) = true > (~0.8988465674311579E308, 0.22250738585072014E~307) = false == (~0.8988465674311579E308, 0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, 0.22250738585072014E~307) = false < (~0.8988465674311579E308, 0.11125369292536007E~307) = true > (~0.8988465674311579E308, 0.11125369292536007E~307) = false == (~0.8988465674311579E308, 0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, 0.11125369292536007E~307) = false < (~0.8988465674311579E308, 0.5E~323) = true > (~0.8988465674311579E308, 0.5E~323) = false == (~0.8988465674311579E308, 0.5E~323) = false ?= (~0.8988465674311579E308, 0.5E~323) = false < (~0.8988465674311579E308, 0.0) = true > (~0.8988465674311579E308, 0.0) = false == (~0.8988465674311579E308, 0.0) = false ?= (~0.8988465674311579E308, 0.0) = false < (~0.8988465674311579E308, ~0.17976931348623157E309) = false > (~0.8988465674311579E308, ~0.17976931348623157E309) = true == (~0.8988465674311579E308, ~0.17976931348623157E309) = false ?= (~0.8988465674311579E308, ~0.17976931348623157E309) = false < (~0.8988465674311579E308, ~0.8988465674311579E308) = false > (~0.8988465674311579E308, ~0.8988465674311579E308) = false == (~0.8988465674311579E308, ~0.8988465674311579E308) = true ?= (~0.8988465674311579E308, ~0.8988465674311579E308) = true < (~0.8988465674311579E308, ~0.123E4) = true > (~0.8988465674311579E308, ~0.123E4) = false == (~0.8988465674311579E308, ~0.123E4) = false ?= (~0.8988465674311579E308, ~0.123E4) = false < (~0.8988465674311579E308, ~0.123E2) = true > (~0.8988465674311579E308, ~0.123E2) = false == (~0.8988465674311579E308, ~0.123E2) = false ?= (~0.8988465674311579E308, ~0.123E2) = false < (~0.8988465674311579E308, ~0.3141592653589793E1) = true > (~0.8988465674311579E308, ~0.3141592653589793E1) = false == (~0.8988465674311579E308, ~0.3141592653589793E1) = false ?= (~0.8988465674311579E308, ~0.3141592653589793E1) = false < (~0.8988465674311579E308, ~0.2718281828459045E1) = true > (~0.8988465674311579E308, ~0.2718281828459045E1) = false == (~0.8988465674311579E308, ~0.2718281828459045E1) = false ?= (~0.8988465674311579E308, ~0.2718281828459045E1) = false < (~0.8988465674311579E308, ~0.123E1) = true > (~0.8988465674311579E308, ~0.123E1) = false == (~0.8988465674311579E308, ~0.123E1) = false ?= (~0.8988465674311579E308, ~0.123E1) = false < (~0.8988465674311579E308, ~0.123) = true > (~0.8988465674311579E308, ~0.123) = false == (~0.8988465674311579E308, ~0.123) = false ?= (~0.8988465674311579E308, ~0.123) = false < (~0.8988465674311579E308, ~0.123E~2) = true > (~0.8988465674311579E308, ~0.123E~2) = false == (~0.8988465674311579E308, ~0.123E~2) = false ?= (~0.8988465674311579E308, ~0.123E~2) = false < (~0.8988465674311579E308, ~0.22250738585072014E~307) = true > (~0.8988465674311579E308, ~0.22250738585072014E~307) = false == (~0.8988465674311579E308, ~0.22250738585072014E~307) = false ?= (~0.8988465674311579E308, ~0.22250738585072014E~307) = false < (~0.8988465674311579E308, ~0.11125369292536007E~307) = true > (~0.8988465674311579E308, ~0.11125369292536007E~307) = false == (~0.8988465674311579E308, ~0.11125369292536007E~307) = false ?= (~0.8988465674311579E308, ~0.11125369292536007E~307) = false < (~0.8988465674311579E308, ~0.5E~323) = true > (~0.8988465674311579E308, ~0.5E~323) = false == (~0.8988465674311579E308, ~0.5E~323) = false ?= (~0.8988465674311579E308, ~0.5E~323) = false < (~0.8988465674311579E308, ~0.0) = true > (~0.8988465674311579E308, ~0.0) = false == (~0.8988465674311579E308, ~0.0) = false ?= (~0.8988465674311579E308, ~0.0) = false < (~0.123E4, 0.17976931348623157E309) = true > (~0.123E4, 0.17976931348623157E309) = false == (~0.123E4, 0.17976931348623157E309) = false ?= (~0.123E4, 0.17976931348623157E309) = false < (~0.123E4, 0.8988465674311579E308) = true > (~0.123E4, 0.8988465674311579E308) = false == (~0.123E4, 0.8988465674311579E308) = false ?= (~0.123E4, 0.8988465674311579E308) = false < (~0.123E4, 0.123E4) = true > (~0.123E4, 0.123E4) = false == (~0.123E4, 0.123E4) = false ?= (~0.123E4, 0.123E4) = false < (~0.123E4, 0.123E2) = true > (~0.123E4, 0.123E2) = false == (~0.123E4, 0.123E2) = false ?= (~0.123E4, 0.123E2) = false < (~0.123E4, 0.3141592653589793E1) = true > (~0.123E4, 0.3141592653589793E1) = false == (~0.123E4, 0.3141592653589793E1) = false ?= (~0.123E4, 0.3141592653589793E1) = false < (~0.123E4, 0.2718281828459045E1) = true > (~0.123E4, 0.2718281828459045E1) = false == (~0.123E4, 0.2718281828459045E1) = false ?= (~0.123E4, 0.2718281828459045E1) = false < (~0.123E4, 0.123E1) = true > (~0.123E4, 0.123E1) = false == (~0.123E4, 0.123E1) = false ?= (~0.123E4, 0.123E1) = false < (~0.123E4, 0.123) = true > (~0.123E4, 0.123) = false == (~0.123E4, 0.123) = false ?= (~0.123E4, 0.123) = false < (~0.123E4, 0.123E~2) = true > (~0.123E4, 0.123E~2) = false == (~0.123E4, 0.123E~2) = false ?= (~0.123E4, 0.123E~2) = false < (~0.123E4, 0.22250738585072014E~307) = true > (~0.123E4, 0.22250738585072014E~307) = false == (~0.123E4, 0.22250738585072014E~307) = false ?= (~0.123E4, 0.22250738585072014E~307) = false < (~0.123E4, 0.11125369292536007E~307) = true > (~0.123E4, 0.11125369292536007E~307) = false == (~0.123E4, 0.11125369292536007E~307) = false ?= (~0.123E4, 0.11125369292536007E~307) = false < (~0.123E4, 0.5E~323) = true > (~0.123E4, 0.5E~323) = false == (~0.123E4, 0.5E~323) = false ?= (~0.123E4, 0.5E~323) = false < (~0.123E4, 0.0) = true > (~0.123E4, 0.0) = false == (~0.123E4, 0.0) = false ?= (~0.123E4, 0.0) = false < (~0.123E4, ~0.17976931348623157E309) = false > (~0.123E4, ~0.17976931348623157E309) = true == (~0.123E4, ~0.17976931348623157E309) = false ?= (~0.123E4, ~0.17976931348623157E309) = false < (~0.123E4, ~0.8988465674311579E308) = false > (~0.123E4, ~0.8988465674311579E308) = true == (~0.123E4, ~0.8988465674311579E308) = false ?= (~0.123E4, ~0.8988465674311579E308) = false < (~0.123E4, ~0.123E4) = false > (~0.123E4, ~0.123E4) = false == (~0.123E4, ~0.123E4) = true ?= (~0.123E4, ~0.123E4) = true < (~0.123E4, ~0.123E2) = true > (~0.123E4, ~0.123E2) = false == (~0.123E4, ~0.123E2) = false ?= (~0.123E4, ~0.123E2) = false < (~0.123E4, ~0.3141592653589793E1) = true > (~0.123E4, ~0.3141592653589793E1) = false == (~0.123E4, ~0.3141592653589793E1) = false ?= (~0.123E4, ~0.3141592653589793E1) = false < (~0.123E4, ~0.2718281828459045E1) = true > (~0.123E4, ~0.2718281828459045E1) = false == (~0.123E4, ~0.2718281828459045E1) = false ?= (~0.123E4, ~0.2718281828459045E1) = false < (~0.123E4, ~0.123E1) = true > (~0.123E4, ~0.123E1) = false == (~0.123E4, ~0.123E1) = false ?= (~0.123E4, ~0.123E1) = false < (~0.123E4, ~0.123) = true > (~0.123E4, ~0.123) = false == (~0.123E4, ~0.123) = false ?= (~0.123E4, ~0.123) = false < (~0.123E4, ~0.123E~2) = true > (~0.123E4, ~0.123E~2) = false == (~0.123E4, ~0.123E~2) = false ?= (~0.123E4, ~0.123E~2) = false < (~0.123E4, ~0.22250738585072014E~307) = true > (~0.123E4, ~0.22250738585072014E~307) = false == (~0.123E4, ~0.22250738585072014E~307) = false ?= (~0.123E4, ~0.22250738585072014E~307) = false < (~0.123E4, ~0.11125369292536007E~307) = true > (~0.123E4, ~0.11125369292536007E~307) = false == (~0.123E4, ~0.11125369292536007E~307) = false ?= (~0.123E4, ~0.11125369292536007E~307) = false < (~0.123E4, ~0.5E~323) = true > (~0.123E4, ~0.5E~323) = false == (~0.123E4, ~0.5E~323) = false ?= (~0.123E4, ~0.5E~323) = false < (~0.123E4, ~0.0) = true > (~0.123E4, ~0.0) = false == (~0.123E4, ~0.0) = false ?= (~0.123E4, ~0.0) = false < (~0.123E2, 0.17976931348623157E309) = true > (~0.123E2, 0.17976931348623157E309) = false == (~0.123E2, 0.17976931348623157E309) = false ?= (~0.123E2, 0.17976931348623157E309) = false < (~0.123E2, 0.8988465674311579E308) = true > (~0.123E2, 0.8988465674311579E308) = false == (~0.123E2, 0.8988465674311579E308) = false ?= (~0.123E2, 0.8988465674311579E308) = false < (~0.123E2, 0.123E4) = true > (~0.123E2, 0.123E4) = false == (~0.123E2, 0.123E4) = false ?= (~0.123E2, 0.123E4) = false < (~0.123E2, 0.123E2) = true > (~0.123E2, 0.123E2) = false == (~0.123E2, 0.123E2) = false ?= (~0.123E2, 0.123E2) = false < (~0.123E2, 0.3141592653589793E1) = true > (~0.123E2, 0.3141592653589793E1) = false == (~0.123E2, 0.3141592653589793E1) = false ?= (~0.123E2, 0.3141592653589793E1) = false < (~0.123E2, 0.2718281828459045E1) = true > (~0.123E2, 0.2718281828459045E1) = false == (~0.123E2, 0.2718281828459045E1) = false ?= (~0.123E2, 0.2718281828459045E1) = false < (~0.123E2, 0.123E1) = true > (~0.123E2, 0.123E1) = false == (~0.123E2, 0.123E1) = false ?= (~0.123E2, 0.123E1) = false < (~0.123E2, 0.123) = true > (~0.123E2, 0.123) = false == (~0.123E2, 0.123) = false ?= (~0.123E2, 0.123) = false < (~0.123E2, 0.123E~2) = true > (~0.123E2, 0.123E~2) = false == (~0.123E2, 0.123E~2) = false ?= (~0.123E2, 0.123E~2) = false < (~0.123E2, 0.22250738585072014E~307) = true > (~0.123E2, 0.22250738585072014E~307) = false == (~0.123E2, 0.22250738585072014E~307) = false ?= (~0.123E2, 0.22250738585072014E~307) = false < (~0.123E2, 0.11125369292536007E~307) = true > (~0.123E2, 0.11125369292536007E~307) = false == (~0.123E2, 0.11125369292536007E~307) = false ?= (~0.123E2, 0.11125369292536007E~307) = false < (~0.123E2, 0.5E~323) = true > (~0.123E2, 0.5E~323) = false == (~0.123E2, 0.5E~323) = false ?= (~0.123E2, 0.5E~323) = false < (~0.123E2, 0.0) = true > (~0.123E2, 0.0) = false == (~0.123E2, 0.0) = false ?= (~0.123E2, 0.0) = false < (~0.123E2, ~0.17976931348623157E309) = false > (~0.123E2, ~0.17976931348623157E309) = true == (~0.123E2, ~0.17976931348623157E309) = false ?= (~0.123E2, ~0.17976931348623157E309) = false < (~0.123E2, ~0.8988465674311579E308) = false > (~0.123E2, ~0.8988465674311579E308) = true == (~0.123E2, ~0.8988465674311579E308) = false ?= (~0.123E2, ~0.8988465674311579E308) = false < (~0.123E2, ~0.123E4) = false > (~0.123E2, ~0.123E4) = true == (~0.123E2, ~0.123E4) = false ?= (~0.123E2, ~0.123E4) = false < (~0.123E2, ~0.123E2) = false > (~0.123E2, ~0.123E2) = false == (~0.123E2, ~0.123E2) = true ?= (~0.123E2, ~0.123E2) = true < (~0.123E2, ~0.3141592653589793E1) = true > (~0.123E2, ~0.3141592653589793E1) = false == (~0.123E2, ~0.3141592653589793E1) = false ?= (~0.123E2, ~0.3141592653589793E1) = false < (~0.123E2, ~0.2718281828459045E1) = true > (~0.123E2, ~0.2718281828459045E1) = false == (~0.123E2, ~0.2718281828459045E1) = false ?= (~0.123E2, ~0.2718281828459045E1) = false < (~0.123E2, ~0.123E1) = true > (~0.123E2, ~0.123E1) = false == (~0.123E2, ~0.123E1) = false ?= (~0.123E2, ~0.123E1) = false < (~0.123E2, ~0.123) = true > (~0.123E2, ~0.123) = false == (~0.123E2, ~0.123) = false ?= (~0.123E2, ~0.123) = false < (~0.123E2, ~0.123E~2) = true > (~0.123E2, ~0.123E~2) = false == (~0.123E2, ~0.123E~2) = false ?= (~0.123E2, ~0.123E~2) = false < (~0.123E2, ~0.22250738585072014E~307) = true > (~0.123E2, ~0.22250738585072014E~307) = false == (~0.123E2, ~0.22250738585072014E~307) = false ?= (~0.123E2, ~0.22250738585072014E~307) = false < (~0.123E2, ~0.11125369292536007E~307) = true > (~0.123E2, ~0.11125369292536007E~307) = false == (~0.123E2, ~0.11125369292536007E~307) = false ?= (~0.123E2, ~0.11125369292536007E~307) = false < (~0.123E2, ~0.5E~323) = true > (~0.123E2, ~0.5E~323) = false == (~0.123E2, ~0.5E~323) = false ?= (~0.123E2, ~0.5E~323) = false < (~0.123E2, ~0.0) = true > (~0.123E2, ~0.0) = false == (~0.123E2, ~0.0) = false ?= (~0.123E2, ~0.0) = false < (~0.3141592653589793E1, 0.17976931348623157E309) = true > (~0.3141592653589793E1, 0.17976931348623157E309) = false == (~0.3141592653589793E1, 0.17976931348623157E309) = false ?= (~0.3141592653589793E1, 0.17976931348623157E309) = false < (~0.3141592653589793E1, 0.8988465674311579E308) = true > (~0.3141592653589793E1, 0.8988465674311579E308) = false == (~0.3141592653589793E1, 0.8988465674311579E308) = false ?= (~0.3141592653589793E1, 0.8988465674311579E308) = false < (~0.3141592653589793E1, 0.123E4) = true > (~0.3141592653589793E1, 0.123E4) = false == (~0.3141592653589793E1, 0.123E4) = false ?= (~0.3141592653589793E1, 0.123E4) = false < (~0.3141592653589793E1, 0.123E2) = true > (~0.3141592653589793E1, 0.123E2) = false == (~0.3141592653589793E1, 0.123E2) = false ?= (~0.3141592653589793E1, 0.123E2) = false < (~0.3141592653589793E1, 0.3141592653589793E1) = true > (~0.3141592653589793E1, 0.3141592653589793E1) = false == (~0.3141592653589793E1, 0.3141592653589793E1) = false ?= (~0.3141592653589793E1, 0.3141592653589793E1) = false < (~0.3141592653589793E1, 0.2718281828459045E1) = true > (~0.3141592653589793E1, 0.2718281828459045E1) = false == (~0.3141592653589793E1, 0.2718281828459045E1) = false ?= (~0.3141592653589793E1, 0.2718281828459045E1) = false < (~0.3141592653589793E1, 0.123E1) = true > (~0.3141592653589793E1, 0.123E1) = false == (~0.3141592653589793E1, 0.123E1) = false ?= (~0.3141592653589793E1, 0.123E1) = false < (~0.3141592653589793E1, 0.123) = true > (~0.3141592653589793E1, 0.123) = false == (~0.3141592653589793E1, 0.123) = false ?= (~0.3141592653589793E1, 0.123) = false < (~0.3141592653589793E1, 0.123E~2) = true > (~0.3141592653589793E1, 0.123E~2) = false == (~0.3141592653589793E1, 0.123E~2) = false ?= (~0.3141592653589793E1, 0.123E~2) = false < (~0.3141592653589793E1, 0.22250738585072014E~307) = true > (~0.3141592653589793E1, 0.22250738585072014E~307) = false == (~0.3141592653589793E1, 0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, 0.22250738585072014E~307) = false < (~0.3141592653589793E1, 0.11125369292536007E~307) = true > (~0.3141592653589793E1, 0.11125369292536007E~307) = false == (~0.3141592653589793E1, 0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, 0.11125369292536007E~307) = false < (~0.3141592653589793E1, 0.5E~323) = true > (~0.3141592653589793E1, 0.5E~323) = false == (~0.3141592653589793E1, 0.5E~323) = false ?= (~0.3141592653589793E1, 0.5E~323) = false < (~0.3141592653589793E1, 0.0) = true > (~0.3141592653589793E1, 0.0) = false == (~0.3141592653589793E1, 0.0) = false ?= (~0.3141592653589793E1, 0.0) = false < (~0.3141592653589793E1, ~0.17976931348623157E309) = false > (~0.3141592653589793E1, ~0.17976931348623157E309) = true == (~0.3141592653589793E1, ~0.17976931348623157E309) = false ?= (~0.3141592653589793E1, ~0.17976931348623157E309) = false < (~0.3141592653589793E1, ~0.8988465674311579E308) = false > (~0.3141592653589793E1, ~0.8988465674311579E308) = true == (~0.3141592653589793E1, ~0.8988465674311579E308) = false ?= (~0.3141592653589793E1, ~0.8988465674311579E308) = false < (~0.3141592653589793E1, ~0.123E4) = false > (~0.3141592653589793E1, ~0.123E4) = true == (~0.3141592653589793E1, ~0.123E4) = false ?= (~0.3141592653589793E1, ~0.123E4) = false < (~0.3141592653589793E1, ~0.123E2) = false > (~0.3141592653589793E1, ~0.123E2) = true == (~0.3141592653589793E1, ~0.123E2) = false ?= (~0.3141592653589793E1, ~0.123E2) = false < (~0.3141592653589793E1, ~0.3141592653589793E1) = false > (~0.3141592653589793E1, ~0.3141592653589793E1) = false == (~0.3141592653589793E1, ~0.3141592653589793E1) = true ?= (~0.3141592653589793E1, ~0.3141592653589793E1) = true < (~0.3141592653589793E1, ~0.2718281828459045E1) = true > (~0.3141592653589793E1, ~0.2718281828459045E1) = false == (~0.3141592653589793E1, ~0.2718281828459045E1) = false ?= (~0.3141592653589793E1, ~0.2718281828459045E1) = false < (~0.3141592653589793E1, ~0.123E1) = true > (~0.3141592653589793E1, ~0.123E1) = false == (~0.3141592653589793E1, ~0.123E1) = false ?= (~0.3141592653589793E1, ~0.123E1) = false < (~0.3141592653589793E1, ~0.123) = true > (~0.3141592653589793E1, ~0.123) = false == (~0.3141592653589793E1, ~0.123) = false ?= (~0.3141592653589793E1, ~0.123) = false < (~0.3141592653589793E1, ~0.123E~2) = true > (~0.3141592653589793E1, ~0.123E~2) = false == (~0.3141592653589793E1, ~0.123E~2) = false ?= (~0.3141592653589793E1, ~0.123E~2) = false < (~0.3141592653589793E1, ~0.22250738585072014E~307) = true > (~0.3141592653589793E1, ~0.22250738585072014E~307) = false == (~0.3141592653589793E1, ~0.22250738585072014E~307) = false ?= (~0.3141592653589793E1, ~0.22250738585072014E~307) = false < (~0.3141592653589793E1, ~0.11125369292536007E~307) = true > (~0.3141592653589793E1, ~0.11125369292536007E~307) = false == (~0.3141592653589793E1, ~0.11125369292536007E~307) = false ?= (~0.3141592653589793E1, ~0.11125369292536007E~307) = false < (~0.3141592653589793E1, ~0.5E~323) = true > (~0.3141592653589793E1, ~0.5E~323) = false == (~0.3141592653589793E1, ~0.5E~323) = false ?= (~0.3141592653589793E1, ~0.5E~323) = false < (~0.3141592653589793E1, ~0.0) = true > (~0.3141592653589793E1, ~0.0) = false == (~0.3141592653589793E1, ~0.0) = false ?= (~0.3141592653589793E1, ~0.0) = false < (~0.2718281828459045E1, 0.17976931348623157E309) = true > (~0.2718281828459045E1, 0.17976931348623157E309) = false == (~0.2718281828459045E1, 0.17976931348623157E309) = false ?= (~0.2718281828459045E1, 0.17976931348623157E309) = false < (~0.2718281828459045E1, 0.8988465674311579E308) = true > (~0.2718281828459045E1, 0.8988465674311579E308) = false == (~0.2718281828459045E1, 0.8988465674311579E308) = false ?= (~0.2718281828459045E1, 0.8988465674311579E308) = false < (~0.2718281828459045E1, 0.123E4) = true > (~0.2718281828459045E1, 0.123E4) = false == (~0.2718281828459045E1, 0.123E4) = false ?= (~0.2718281828459045E1, 0.123E4) = false < (~0.2718281828459045E1, 0.123E2) = true > (~0.2718281828459045E1, 0.123E2) = false == (~0.2718281828459045E1, 0.123E2) = false ?= (~0.2718281828459045E1, 0.123E2) = false < (~0.2718281828459045E1, 0.3141592653589793E1) = true > (~0.2718281828459045E1, 0.3141592653589793E1) = false == (~0.2718281828459045E1, 0.3141592653589793E1) = false ?= (~0.2718281828459045E1, 0.3141592653589793E1) = false < (~0.2718281828459045E1, 0.2718281828459045E1) = true > (~0.2718281828459045E1, 0.2718281828459045E1) = false == (~0.2718281828459045E1, 0.2718281828459045E1) = false ?= (~0.2718281828459045E1, 0.2718281828459045E1) = false < (~0.2718281828459045E1, 0.123E1) = true > (~0.2718281828459045E1, 0.123E1) = false == (~0.2718281828459045E1, 0.123E1) = false ?= (~0.2718281828459045E1, 0.123E1) = false < (~0.2718281828459045E1, 0.123) = true > (~0.2718281828459045E1, 0.123) = false == (~0.2718281828459045E1, 0.123) = false ?= (~0.2718281828459045E1, 0.123) = false < (~0.2718281828459045E1, 0.123E~2) = true > (~0.2718281828459045E1, 0.123E~2) = false == (~0.2718281828459045E1, 0.123E~2) = false ?= (~0.2718281828459045E1, 0.123E~2) = false < (~0.2718281828459045E1, 0.22250738585072014E~307) = true > (~0.2718281828459045E1, 0.22250738585072014E~307) = false == (~0.2718281828459045E1, 0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, 0.22250738585072014E~307) = false < (~0.2718281828459045E1, 0.11125369292536007E~307) = true > (~0.2718281828459045E1, 0.11125369292536007E~307) = false == (~0.2718281828459045E1, 0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, 0.11125369292536007E~307) = false < (~0.2718281828459045E1, 0.5E~323) = true > (~0.2718281828459045E1, 0.5E~323) = false == (~0.2718281828459045E1, 0.5E~323) = false ?= (~0.2718281828459045E1, 0.5E~323) = false < (~0.2718281828459045E1, 0.0) = true > (~0.2718281828459045E1, 0.0) = false == (~0.2718281828459045E1, 0.0) = false ?= (~0.2718281828459045E1, 0.0) = false < (~0.2718281828459045E1, ~0.17976931348623157E309) = false > (~0.2718281828459045E1, ~0.17976931348623157E309) = true == (~0.2718281828459045E1, ~0.17976931348623157E309) = false ?= (~0.2718281828459045E1, ~0.17976931348623157E309) = false < (~0.2718281828459045E1, ~0.8988465674311579E308) = false > (~0.2718281828459045E1, ~0.8988465674311579E308) = true == (~0.2718281828459045E1, ~0.8988465674311579E308) = false ?= (~0.2718281828459045E1, ~0.8988465674311579E308) = false < (~0.2718281828459045E1, ~0.123E4) = false > (~0.2718281828459045E1, ~0.123E4) = true == (~0.2718281828459045E1, ~0.123E4) = false ?= (~0.2718281828459045E1, ~0.123E4) = false < (~0.2718281828459045E1, ~0.123E2) = false > (~0.2718281828459045E1, ~0.123E2) = true == (~0.2718281828459045E1, ~0.123E2) = false ?= (~0.2718281828459045E1, ~0.123E2) = false < (~0.2718281828459045E1, ~0.3141592653589793E1) = false > (~0.2718281828459045E1, ~0.3141592653589793E1) = true == (~0.2718281828459045E1, ~0.3141592653589793E1) = false ?= (~0.2718281828459045E1, ~0.3141592653589793E1) = false < (~0.2718281828459045E1, ~0.2718281828459045E1) = false > (~0.2718281828459045E1, ~0.2718281828459045E1) = false == (~0.2718281828459045E1, ~0.2718281828459045E1) = true ?= (~0.2718281828459045E1, ~0.2718281828459045E1) = true < (~0.2718281828459045E1, ~0.123E1) = true > (~0.2718281828459045E1, ~0.123E1) = false == (~0.2718281828459045E1, ~0.123E1) = false ?= (~0.2718281828459045E1, ~0.123E1) = false < (~0.2718281828459045E1, ~0.123) = true > (~0.2718281828459045E1, ~0.123) = false == (~0.2718281828459045E1, ~0.123) = false ?= (~0.2718281828459045E1, ~0.123) = false < (~0.2718281828459045E1, ~0.123E~2) = true > (~0.2718281828459045E1, ~0.123E~2) = false == (~0.2718281828459045E1, ~0.123E~2) = false ?= (~0.2718281828459045E1, ~0.123E~2) = false < (~0.2718281828459045E1, ~0.22250738585072014E~307) = true > (~0.2718281828459045E1, ~0.22250738585072014E~307) = false == (~0.2718281828459045E1, ~0.22250738585072014E~307) = false ?= (~0.2718281828459045E1, ~0.22250738585072014E~307) = false < (~0.2718281828459045E1, ~0.11125369292536007E~307) = true > (~0.2718281828459045E1, ~0.11125369292536007E~307) = false == (~0.2718281828459045E1, ~0.11125369292536007E~307) = false ?= (~0.2718281828459045E1, ~0.11125369292536007E~307) = false < (~0.2718281828459045E1, ~0.5E~323) = true > (~0.2718281828459045E1, ~0.5E~323) = false == (~0.2718281828459045E1, ~0.5E~323) = false ?= (~0.2718281828459045E1, ~0.5E~323) = false < (~0.2718281828459045E1, ~0.0) = true > (~0.2718281828459045E1, ~0.0) = false == (~0.2718281828459045E1, ~0.0) = false ?= (~0.2718281828459045E1, ~0.0) = false < (~0.123E1, 0.17976931348623157E309) = true > (~0.123E1, 0.17976931348623157E309) = false == (~0.123E1, 0.17976931348623157E309) = false ?= (~0.123E1, 0.17976931348623157E309) = false < (~0.123E1, 0.8988465674311579E308) = true > (~0.123E1, 0.8988465674311579E308) = false == (~0.123E1, 0.8988465674311579E308) = false ?= (~0.123E1, 0.8988465674311579E308) = false < (~0.123E1, 0.123E4) = true > (~0.123E1, 0.123E4) = false == (~0.123E1, 0.123E4) = false ?= (~0.123E1, 0.123E4) = false < (~0.123E1, 0.123E2) = true > (~0.123E1, 0.123E2) = false == (~0.123E1, 0.123E2) = false ?= (~0.123E1, 0.123E2) = false < (~0.123E1, 0.3141592653589793E1) = true > (~0.123E1, 0.3141592653589793E1) = false == (~0.123E1, 0.3141592653589793E1) = false ?= (~0.123E1, 0.3141592653589793E1) = false < (~0.123E1, 0.2718281828459045E1) = true > (~0.123E1, 0.2718281828459045E1) = false == (~0.123E1, 0.2718281828459045E1) = false ?= (~0.123E1, 0.2718281828459045E1) = false < (~0.123E1, 0.123E1) = true > (~0.123E1, 0.123E1) = false == (~0.123E1, 0.123E1) = false ?= (~0.123E1, 0.123E1) = false < (~0.123E1, 0.123) = true > (~0.123E1, 0.123) = false == (~0.123E1, 0.123) = false ?= (~0.123E1, 0.123) = false < (~0.123E1, 0.123E~2) = true > (~0.123E1, 0.123E~2) = false == (~0.123E1, 0.123E~2) = false ?= (~0.123E1, 0.123E~2) = false < (~0.123E1, 0.22250738585072014E~307) = true > (~0.123E1, 0.22250738585072014E~307) = false == (~0.123E1, 0.22250738585072014E~307) = false ?= (~0.123E1, 0.22250738585072014E~307) = false < (~0.123E1, 0.11125369292536007E~307) = true > (~0.123E1, 0.11125369292536007E~307) = false == (~0.123E1, 0.11125369292536007E~307) = false ?= (~0.123E1, 0.11125369292536007E~307) = false < (~0.123E1, 0.5E~323) = true > (~0.123E1, 0.5E~323) = false == (~0.123E1, 0.5E~323) = false ?= (~0.123E1, 0.5E~323) = false < (~0.123E1, 0.0) = true > (~0.123E1, 0.0) = false == (~0.123E1, 0.0) = false ?= (~0.123E1, 0.0) = false < (~0.123E1, ~0.17976931348623157E309) = false > (~0.123E1, ~0.17976931348623157E309) = true == (~0.123E1, ~0.17976931348623157E309) = false ?= (~0.123E1, ~0.17976931348623157E309) = false < (~0.123E1, ~0.8988465674311579E308) = false > (~0.123E1, ~0.8988465674311579E308) = true == (~0.123E1, ~0.8988465674311579E308) = false ?= (~0.123E1, ~0.8988465674311579E308) = false < (~0.123E1, ~0.123E4) = false > (~0.123E1, ~0.123E4) = true == (~0.123E1, ~0.123E4) = false ?= (~0.123E1, ~0.123E4) = false < (~0.123E1, ~0.123E2) = false > (~0.123E1, ~0.123E2) = true == (~0.123E1, ~0.123E2) = false ?= (~0.123E1, ~0.123E2) = false < (~0.123E1, ~0.3141592653589793E1) = false > (~0.123E1, ~0.3141592653589793E1) = true == (~0.123E1, ~0.3141592653589793E1) = false ?= (~0.123E1, ~0.3141592653589793E1) = false < (~0.123E1, ~0.2718281828459045E1) = false > (~0.123E1, ~0.2718281828459045E1) = true == (~0.123E1, ~0.2718281828459045E1) = false ?= (~0.123E1, ~0.2718281828459045E1) = false < (~0.123E1, ~0.123E1) = false > (~0.123E1, ~0.123E1) = false == (~0.123E1, ~0.123E1) = true ?= (~0.123E1, ~0.123E1) = true < (~0.123E1, ~0.123) = true > (~0.123E1, ~0.123) = false == (~0.123E1, ~0.123) = false ?= (~0.123E1, ~0.123) = false < (~0.123E1, ~0.123E~2) = true > (~0.123E1, ~0.123E~2) = false == (~0.123E1, ~0.123E~2) = false ?= (~0.123E1, ~0.123E~2) = false < (~0.123E1, ~0.22250738585072014E~307) = true > (~0.123E1, ~0.22250738585072014E~307) = false == (~0.123E1, ~0.22250738585072014E~307) = false ?= (~0.123E1, ~0.22250738585072014E~307) = false < (~0.123E1, ~0.11125369292536007E~307) = true > (~0.123E1, ~0.11125369292536007E~307) = false == (~0.123E1, ~0.11125369292536007E~307) = false ?= (~0.123E1, ~0.11125369292536007E~307) = false < (~0.123E1, ~0.5E~323) = true > (~0.123E1, ~0.5E~323) = false == (~0.123E1, ~0.5E~323) = false ?= (~0.123E1, ~0.5E~323) = false < (~0.123E1, ~0.0) = true > (~0.123E1, ~0.0) = false == (~0.123E1, ~0.0) = false ?= (~0.123E1, ~0.0) = false < (~0.123, 0.17976931348623157E309) = true > (~0.123, 0.17976931348623157E309) = false == (~0.123, 0.17976931348623157E309) = false ?= (~0.123, 0.17976931348623157E309) = false < (~0.123, 0.8988465674311579E308) = true > (~0.123, 0.8988465674311579E308) = false == (~0.123, 0.8988465674311579E308) = false ?= (~0.123, 0.8988465674311579E308) = false < (~0.123, 0.123E4) = true > (~0.123, 0.123E4) = false == (~0.123, 0.123E4) = false ?= (~0.123, 0.123E4) = false < (~0.123, 0.123E2) = true > (~0.123, 0.123E2) = false == (~0.123, 0.123E2) = false ?= (~0.123, 0.123E2) = false < (~0.123, 0.3141592653589793E1) = true > (~0.123, 0.3141592653589793E1) = false == (~0.123, 0.3141592653589793E1) = false ?= (~0.123, 0.3141592653589793E1) = false < (~0.123, 0.2718281828459045E1) = true > (~0.123, 0.2718281828459045E1) = false == (~0.123, 0.2718281828459045E1) = false ?= (~0.123, 0.2718281828459045E1) = false < (~0.123, 0.123E1) = true > (~0.123, 0.123E1) = false == (~0.123, 0.123E1) = false ?= (~0.123, 0.123E1) = false < (~0.123, 0.123) = true > (~0.123, 0.123) = false == (~0.123, 0.123) = false ?= (~0.123, 0.123) = false < (~0.123, 0.123E~2) = true > (~0.123, 0.123E~2) = false == (~0.123, 0.123E~2) = false ?= (~0.123, 0.123E~2) = false < (~0.123, 0.22250738585072014E~307) = true > (~0.123, 0.22250738585072014E~307) = false == (~0.123, 0.22250738585072014E~307) = false ?= (~0.123, 0.22250738585072014E~307) = false < (~0.123, 0.11125369292536007E~307) = true > (~0.123, 0.11125369292536007E~307) = false == (~0.123, 0.11125369292536007E~307) = false ?= (~0.123, 0.11125369292536007E~307) = false < (~0.123, 0.5E~323) = true > (~0.123, 0.5E~323) = false == (~0.123, 0.5E~323) = false ?= (~0.123, 0.5E~323) = false < (~0.123, 0.0) = true > (~0.123, 0.0) = false == (~0.123, 0.0) = false ?= (~0.123, 0.0) = false < (~0.123, ~0.17976931348623157E309) = false > (~0.123, ~0.17976931348623157E309) = true == (~0.123, ~0.17976931348623157E309) = false ?= (~0.123, ~0.17976931348623157E309) = false < (~0.123, ~0.8988465674311579E308) = false > (~0.123, ~0.8988465674311579E308) = true == (~0.123, ~0.8988465674311579E308) = false ?= (~0.123, ~0.8988465674311579E308) = false < (~0.123, ~0.123E4) = false > (~0.123, ~0.123E4) = true == (~0.123, ~0.123E4) = false ?= (~0.123, ~0.123E4) = false < (~0.123, ~0.123E2) = false > (~0.123, ~0.123E2) = true == (~0.123, ~0.123E2) = false ?= (~0.123, ~0.123E2) = false < (~0.123, ~0.3141592653589793E1) = false > (~0.123, ~0.3141592653589793E1) = true == (~0.123, ~0.3141592653589793E1) = false ?= (~0.123, ~0.3141592653589793E1) = false < (~0.123, ~0.2718281828459045E1) = false > (~0.123, ~0.2718281828459045E1) = true == (~0.123, ~0.2718281828459045E1) = false ?= (~0.123, ~0.2718281828459045E1) = false < (~0.123, ~0.123E1) = false > (~0.123, ~0.123E1) = true == (~0.123, ~0.123E1) = false ?= (~0.123, ~0.123E1) = false < (~0.123, ~0.123) = false > (~0.123, ~0.123) = false == (~0.123, ~0.123) = true ?= (~0.123, ~0.123) = true < (~0.123, ~0.123E~2) = true > (~0.123, ~0.123E~2) = false == (~0.123, ~0.123E~2) = false ?= (~0.123, ~0.123E~2) = false < (~0.123, ~0.22250738585072014E~307) = true > (~0.123, ~0.22250738585072014E~307) = false == (~0.123, ~0.22250738585072014E~307) = false ?= (~0.123, ~0.22250738585072014E~307) = false < (~0.123, ~0.11125369292536007E~307) = true > (~0.123, ~0.11125369292536007E~307) = false == (~0.123, ~0.11125369292536007E~307) = false ?= (~0.123, ~0.11125369292536007E~307) = false < (~0.123, ~0.5E~323) = true > (~0.123, ~0.5E~323) = false == (~0.123, ~0.5E~323) = false ?= (~0.123, ~0.5E~323) = false < (~0.123, ~0.0) = true > (~0.123, ~0.0) = false == (~0.123, ~0.0) = false ?= (~0.123, ~0.0) = false < (~0.123E~2, 0.17976931348623157E309) = true > (~0.123E~2, 0.17976931348623157E309) = false == (~0.123E~2, 0.17976931348623157E309) = false ?= (~0.123E~2, 0.17976931348623157E309) = false < (~0.123E~2, 0.8988465674311579E308) = true > (~0.123E~2, 0.8988465674311579E308) = false == (~0.123E~2, 0.8988465674311579E308) = false ?= (~0.123E~2, 0.8988465674311579E308) = false < (~0.123E~2, 0.123E4) = true > (~0.123E~2, 0.123E4) = false == (~0.123E~2, 0.123E4) = false ?= (~0.123E~2, 0.123E4) = false < (~0.123E~2, 0.123E2) = true > (~0.123E~2, 0.123E2) = false == (~0.123E~2, 0.123E2) = false ?= (~0.123E~2, 0.123E2) = false < (~0.123E~2, 0.3141592653589793E1) = true > (~0.123E~2, 0.3141592653589793E1) = false == (~0.123E~2, 0.3141592653589793E1) = false ?= (~0.123E~2, 0.3141592653589793E1) = false < (~0.123E~2, 0.2718281828459045E1) = true > (~0.123E~2, 0.2718281828459045E1) = false == (~0.123E~2, 0.2718281828459045E1) = false ?= (~0.123E~2, 0.2718281828459045E1) = false < (~0.123E~2, 0.123E1) = true > (~0.123E~2, 0.123E1) = false == (~0.123E~2, 0.123E1) = false ?= (~0.123E~2, 0.123E1) = false < (~0.123E~2, 0.123) = true > (~0.123E~2, 0.123) = false == (~0.123E~2, 0.123) = false ?= (~0.123E~2, 0.123) = false < (~0.123E~2, 0.123E~2) = true > (~0.123E~2, 0.123E~2) = false == (~0.123E~2, 0.123E~2) = false ?= (~0.123E~2, 0.123E~2) = false < (~0.123E~2, 0.22250738585072014E~307) = true > (~0.123E~2, 0.22250738585072014E~307) = false == (~0.123E~2, 0.22250738585072014E~307) = false ?= (~0.123E~2, 0.22250738585072014E~307) = false < (~0.123E~2, 0.11125369292536007E~307) = true > (~0.123E~2, 0.11125369292536007E~307) = false == (~0.123E~2, 0.11125369292536007E~307) = false ?= (~0.123E~2, 0.11125369292536007E~307) = false < (~0.123E~2, 0.5E~323) = true > (~0.123E~2, 0.5E~323) = false == (~0.123E~2, 0.5E~323) = false ?= (~0.123E~2, 0.5E~323) = false < (~0.123E~2, 0.0) = true > (~0.123E~2, 0.0) = false == (~0.123E~2, 0.0) = false ?= (~0.123E~2, 0.0) = false < (~0.123E~2, ~0.17976931348623157E309) = false > (~0.123E~2, ~0.17976931348623157E309) = true == (~0.123E~2, ~0.17976931348623157E309) = false ?= (~0.123E~2, ~0.17976931348623157E309) = false < (~0.123E~2, ~0.8988465674311579E308) = false > (~0.123E~2, ~0.8988465674311579E308) = true == (~0.123E~2, ~0.8988465674311579E308) = false ?= (~0.123E~2, ~0.8988465674311579E308) = false < (~0.123E~2, ~0.123E4) = false > (~0.123E~2, ~0.123E4) = true == (~0.123E~2, ~0.123E4) = false ?= (~0.123E~2, ~0.123E4) = false < (~0.123E~2, ~0.123E2) = false > (~0.123E~2, ~0.123E2) = true == (~0.123E~2, ~0.123E2) = false ?= (~0.123E~2, ~0.123E2) = false < (~0.123E~2, ~0.3141592653589793E1) = false > (~0.123E~2, ~0.3141592653589793E1) = true == (~0.123E~2, ~0.3141592653589793E1) = false ?= (~0.123E~2, ~0.3141592653589793E1) = false < (~0.123E~2, ~0.2718281828459045E1) = false > (~0.123E~2, ~0.2718281828459045E1) = true == (~0.123E~2, ~0.2718281828459045E1) = false ?= (~0.123E~2, ~0.2718281828459045E1) = false < (~0.123E~2, ~0.123E1) = false > (~0.123E~2, ~0.123E1) = true == (~0.123E~2, ~0.123E1) = false ?= (~0.123E~2, ~0.123E1) = false < (~0.123E~2, ~0.123) = false > (~0.123E~2, ~0.123) = true == (~0.123E~2, ~0.123) = false ?= (~0.123E~2, ~0.123) = false < (~0.123E~2, ~0.123E~2) = false > (~0.123E~2, ~0.123E~2) = false == (~0.123E~2, ~0.123E~2) = true ?= (~0.123E~2, ~0.123E~2) = true < (~0.123E~2, ~0.22250738585072014E~307) = true > (~0.123E~2, ~0.22250738585072014E~307) = false == (~0.123E~2, ~0.22250738585072014E~307) = false ?= (~0.123E~2, ~0.22250738585072014E~307) = false < (~0.123E~2, ~0.11125369292536007E~307) = true > (~0.123E~2, ~0.11125369292536007E~307) = false == (~0.123E~2, ~0.11125369292536007E~307) = false ?= (~0.123E~2, ~0.11125369292536007E~307) = false < (~0.123E~2, ~0.5E~323) = true > (~0.123E~2, ~0.5E~323) = false == (~0.123E~2, ~0.5E~323) = false ?= (~0.123E~2, ~0.5E~323) = false < (~0.123E~2, ~0.0) = true > (~0.123E~2, ~0.0) = false == (~0.123E~2, ~0.0) = false ?= (~0.123E~2, ~0.0) = false < (~0.22250738585072014E~307, 0.17976931348623157E309) = true > (~0.22250738585072014E~307, 0.17976931348623157E309) = false == (~0.22250738585072014E~307, 0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, 0.17976931348623157E309) = false < (~0.22250738585072014E~307, 0.8988465674311579E308) = true > (~0.22250738585072014E~307, 0.8988465674311579E308) = false == (~0.22250738585072014E~307, 0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, 0.8988465674311579E308) = false < (~0.22250738585072014E~307, 0.123E4) = true > (~0.22250738585072014E~307, 0.123E4) = false == (~0.22250738585072014E~307, 0.123E4) = false ?= (~0.22250738585072014E~307, 0.123E4) = false < (~0.22250738585072014E~307, 0.123E2) = true > (~0.22250738585072014E~307, 0.123E2) = false == (~0.22250738585072014E~307, 0.123E2) = false ?= (~0.22250738585072014E~307, 0.123E2) = false < (~0.22250738585072014E~307, 0.3141592653589793E1) = true > (~0.22250738585072014E~307, 0.3141592653589793E1) = false == (~0.22250738585072014E~307, 0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, 0.3141592653589793E1) = false < (~0.22250738585072014E~307, 0.2718281828459045E1) = true > (~0.22250738585072014E~307, 0.2718281828459045E1) = false == (~0.22250738585072014E~307, 0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, 0.2718281828459045E1) = false < (~0.22250738585072014E~307, 0.123E1) = true > (~0.22250738585072014E~307, 0.123E1) = false == (~0.22250738585072014E~307, 0.123E1) = false ?= (~0.22250738585072014E~307, 0.123E1) = false < (~0.22250738585072014E~307, 0.123) = true > (~0.22250738585072014E~307, 0.123) = false == (~0.22250738585072014E~307, 0.123) = false ?= (~0.22250738585072014E~307, 0.123) = false < (~0.22250738585072014E~307, 0.123E~2) = true > (~0.22250738585072014E~307, 0.123E~2) = false == (~0.22250738585072014E~307, 0.123E~2) = false ?= (~0.22250738585072014E~307, 0.123E~2) = false < (~0.22250738585072014E~307, 0.22250738585072014E~307) = true > (~0.22250738585072014E~307, 0.22250738585072014E~307) = false == (~0.22250738585072014E~307, 0.22250738585072014E~307) = false ?= (~0.22250738585072014E~307, 0.22250738585072014E~307) = false < (~0.22250738585072014E~307, 0.11125369292536007E~307) = true > (~0.22250738585072014E~307, 0.11125369292536007E~307) = false == (~0.22250738585072014E~307, 0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, 0.11125369292536007E~307) = false < (~0.22250738585072014E~307, 0.5E~323) = true > (~0.22250738585072014E~307, 0.5E~323) = false == (~0.22250738585072014E~307, 0.5E~323) = false ?= (~0.22250738585072014E~307, 0.5E~323) = false < (~0.22250738585072014E~307, 0.0) = true > (~0.22250738585072014E~307, 0.0) = false == (~0.22250738585072014E~307, 0.0) = false ?= (~0.22250738585072014E~307, 0.0) = false < (~0.22250738585072014E~307, ~0.17976931348623157E309) = false > (~0.22250738585072014E~307, ~0.17976931348623157E309) = true == (~0.22250738585072014E~307, ~0.17976931348623157E309) = false ?= (~0.22250738585072014E~307, ~0.17976931348623157E309) = false < (~0.22250738585072014E~307, ~0.8988465674311579E308) = false > (~0.22250738585072014E~307, ~0.8988465674311579E308) = true == (~0.22250738585072014E~307, ~0.8988465674311579E308) = false ?= (~0.22250738585072014E~307, ~0.8988465674311579E308) = false < (~0.22250738585072014E~307, ~0.123E4) = false > (~0.22250738585072014E~307, ~0.123E4) = true == (~0.22250738585072014E~307, ~0.123E4) = false ?= (~0.22250738585072014E~307, ~0.123E4) = false < (~0.22250738585072014E~307, ~0.123E2) = false > (~0.22250738585072014E~307, ~0.123E2) = true == (~0.22250738585072014E~307, ~0.123E2) = false ?= (~0.22250738585072014E~307, ~0.123E2) = false < (~0.22250738585072014E~307, ~0.3141592653589793E1) = false > (~0.22250738585072014E~307, ~0.3141592653589793E1) = true == (~0.22250738585072014E~307, ~0.3141592653589793E1) = false ?= (~0.22250738585072014E~307, ~0.3141592653589793E1) = false < (~0.22250738585072014E~307, ~0.2718281828459045E1) = false > (~0.22250738585072014E~307, ~0.2718281828459045E1) = true == (~0.22250738585072014E~307, ~0.2718281828459045E1) = false ?= (~0.22250738585072014E~307, ~0.2718281828459045E1) = false < (~0.22250738585072014E~307, ~0.123E1) = false > (~0.22250738585072014E~307, ~0.123E1) = true == (~0.22250738585072014E~307, ~0.123E1) = false ?= (~0.22250738585072014E~307, ~0.123E1) = false < (~0.22250738585072014E~307, ~0.123) = false > (~0.22250738585072014E~307, ~0.123) = true == (~0.22250738585072014E~307, ~0.123) = false ?= (~0.22250738585072014E~307, ~0.123) = false < (~0.22250738585072014E~307, ~0.123E~2) = false > (~0.22250738585072014E~307, ~0.123E~2) = true == (~0.22250738585072014E~307, ~0.123E~2) = false ?= (~0.22250738585072014E~307, ~0.123E~2) = false < (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false > (~0.22250738585072014E~307, ~0.22250738585072014E~307) = false == (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true ?= (~0.22250738585072014E~307, ~0.22250738585072014E~307) = true < (~0.22250738585072014E~307, ~0.11125369292536007E~307) = true > (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false == (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false ?= (~0.22250738585072014E~307, ~0.11125369292536007E~307) = false < (~0.22250738585072014E~307, ~0.5E~323) = true > (~0.22250738585072014E~307, ~0.5E~323) = false == (~0.22250738585072014E~307, ~0.5E~323) = false ?= (~0.22250738585072014E~307, ~0.5E~323) = false < (~0.22250738585072014E~307, ~0.0) = true > (~0.22250738585072014E~307, ~0.0) = false == (~0.22250738585072014E~307, ~0.0) = false ?= (~0.22250738585072014E~307, ~0.0) = false < (~0.11125369292536007E~307, 0.17976931348623157E309) = true > (~0.11125369292536007E~307, 0.17976931348623157E309) = false == (~0.11125369292536007E~307, 0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, 0.17976931348623157E309) = false < (~0.11125369292536007E~307, 0.8988465674311579E308) = true > (~0.11125369292536007E~307, 0.8988465674311579E308) = false == (~0.11125369292536007E~307, 0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, 0.8988465674311579E308) = false < (~0.11125369292536007E~307, 0.123E4) = true > (~0.11125369292536007E~307, 0.123E4) = false == (~0.11125369292536007E~307, 0.123E4) = false ?= (~0.11125369292536007E~307, 0.123E4) = false < (~0.11125369292536007E~307, 0.123E2) = true > (~0.11125369292536007E~307, 0.123E2) = false == (~0.11125369292536007E~307, 0.123E2) = false ?= (~0.11125369292536007E~307, 0.123E2) = false < (~0.11125369292536007E~307, 0.3141592653589793E1) = true > (~0.11125369292536007E~307, 0.3141592653589793E1) = false == (~0.11125369292536007E~307, 0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, 0.3141592653589793E1) = false < (~0.11125369292536007E~307, 0.2718281828459045E1) = true > (~0.11125369292536007E~307, 0.2718281828459045E1) = false == (~0.11125369292536007E~307, 0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, 0.2718281828459045E1) = false < (~0.11125369292536007E~307, 0.123E1) = true > (~0.11125369292536007E~307, 0.123E1) = false == (~0.11125369292536007E~307, 0.123E1) = false ?= (~0.11125369292536007E~307, 0.123E1) = false < (~0.11125369292536007E~307, 0.123) = true > (~0.11125369292536007E~307, 0.123) = false == (~0.11125369292536007E~307, 0.123) = false ?= (~0.11125369292536007E~307, 0.123) = false < (~0.11125369292536007E~307, 0.123E~2) = true > (~0.11125369292536007E~307, 0.123E~2) = false == (~0.11125369292536007E~307, 0.123E~2) = false ?= (~0.11125369292536007E~307, 0.123E~2) = false < (~0.11125369292536007E~307, 0.22250738585072014E~307) = true > (~0.11125369292536007E~307, 0.22250738585072014E~307) = false == (~0.11125369292536007E~307, 0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, 0.22250738585072014E~307) = false < (~0.11125369292536007E~307, 0.11125369292536007E~307) = true > (~0.11125369292536007E~307, 0.11125369292536007E~307) = false == (~0.11125369292536007E~307, 0.11125369292536007E~307) = false ?= (~0.11125369292536007E~307, 0.11125369292536007E~307) = false < (~0.11125369292536007E~307, 0.5E~323) = true > (~0.11125369292536007E~307, 0.5E~323) = false == (~0.11125369292536007E~307, 0.5E~323) = false ?= (~0.11125369292536007E~307, 0.5E~323) = false < (~0.11125369292536007E~307, 0.0) = true > (~0.11125369292536007E~307, 0.0) = false == (~0.11125369292536007E~307, 0.0) = false ?= (~0.11125369292536007E~307, 0.0) = false < (~0.11125369292536007E~307, ~0.17976931348623157E309) = false > (~0.11125369292536007E~307, ~0.17976931348623157E309) = true == (~0.11125369292536007E~307, ~0.17976931348623157E309) = false ?= (~0.11125369292536007E~307, ~0.17976931348623157E309) = false < (~0.11125369292536007E~307, ~0.8988465674311579E308) = false > (~0.11125369292536007E~307, ~0.8988465674311579E308) = true == (~0.11125369292536007E~307, ~0.8988465674311579E308) = false ?= (~0.11125369292536007E~307, ~0.8988465674311579E308) = false < (~0.11125369292536007E~307, ~0.123E4) = false > (~0.11125369292536007E~307, ~0.123E4) = true == (~0.11125369292536007E~307, ~0.123E4) = false ?= (~0.11125369292536007E~307, ~0.123E4) = false < (~0.11125369292536007E~307, ~0.123E2) = false > (~0.11125369292536007E~307, ~0.123E2) = true == (~0.11125369292536007E~307, ~0.123E2) = false ?= (~0.11125369292536007E~307, ~0.123E2) = false < (~0.11125369292536007E~307, ~0.3141592653589793E1) = false > (~0.11125369292536007E~307, ~0.3141592653589793E1) = true == (~0.11125369292536007E~307, ~0.3141592653589793E1) = false ?= (~0.11125369292536007E~307, ~0.3141592653589793E1) = false < (~0.11125369292536007E~307, ~0.2718281828459045E1) = false > (~0.11125369292536007E~307, ~0.2718281828459045E1) = true == (~0.11125369292536007E~307, ~0.2718281828459045E1) = false ?= (~0.11125369292536007E~307, ~0.2718281828459045E1) = false < (~0.11125369292536007E~307, ~0.123E1) = false > (~0.11125369292536007E~307, ~0.123E1) = true == (~0.11125369292536007E~307, ~0.123E1) = false ?= (~0.11125369292536007E~307, ~0.123E1) = false < (~0.11125369292536007E~307, ~0.123) = false > (~0.11125369292536007E~307, ~0.123) = true == (~0.11125369292536007E~307, ~0.123) = false ?= (~0.11125369292536007E~307, ~0.123) = false < (~0.11125369292536007E~307, ~0.123E~2) = false > (~0.11125369292536007E~307, ~0.123E~2) = true == (~0.11125369292536007E~307, ~0.123E~2) = false ?= (~0.11125369292536007E~307, ~0.123E~2) = false < (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false > (~0.11125369292536007E~307, ~0.22250738585072014E~307) = true == (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false ?= (~0.11125369292536007E~307, ~0.22250738585072014E~307) = false < (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false > (~0.11125369292536007E~307, ~0.11125369292536007E~307) = false == (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true ?= (~0.11125369292536007E~307, ~0.11125369292536007E~307) = true < (~0.11125369292536007E~307, ~0.5E~323) = true > (~0.11125369292536007E~307, ~0.5E~323) = false == (~0.11125369292536007E~307, ~0.5E~323) = false ?= (~0.11125369292536007E~307, ~0.5E~323) = false < (~0.11125369292536007E~307, ~0.0) = true > (~0.11125369292536007E~307, ~0.0) = false == (~0.11125369292536007E~307, ~0.0) = false ?= (~0.11125369292536007E~307, ~0.0) = false < (~0.5E~323, 0.17976931348623157E309) = true > (~0.5E~323, 0.17976931348623157E309) = false == (~0.5E~323, 0.17976931348623157E309) = false ?= (~0.5E~323, 0.17976931348623157E309) = false < (~0.5E~323, 0.8988465674311579E308) = true > (~0.5E~323, 0.8988465674311579E308) = false == (~0.5E~323, 0.8988465674311579E308) = false ?= (~0.5E~323, 0.8988465674311579E308) = false < (~0.5E~323, 0.123E4) = true > (~0.5E~323, 0.123E4) = false == (~0.5E~323, 0.123E4) = false ?= (~0.5E~323, 0.123E4) = false < (~0.5E~323, 0.123E2) = true > (~0.5E~323, 0.123E2) = false == (~0.5E~323, 0.123E2) = false ?= (~0.5E~323, 0.123E2) = false < (~0.5E~323, 0.3141592653589793E1) = true > (~0.5E~323, 0.3141592653589793E1) = false == (~0.5E~323, 0.3141592653589793E1) = false ?= (~0.5E~323, 0.3141592653589793E1) = false < (~0.5E~323, 0.2718281828459045E1) = true > (~0.5E~323, 0.2718281828459045E1) = false == (~0.5E~323, 0.2718281828459045E1) = false ?= (~0.5E~323, 0.2718281828459045E1) = false < (~0.5E~323, 0.123E1) = true > (~0.5E~323, 0.123E1) = false == (~0.5E~323, 0.123E1) = false ?= (~0.5E~323, 0.123E1) = false < (~0.5E~323, 0.123) = true > (~0.5E~323, 0.123) = false == (~0.5E~323, 0.123) = false ?= (~0.5E~323, 0.123) = false < (~0.5E~323, 0.123E~2) = true > (~0.5E~323, 0.123E~2) = false == (~0.5E~323, 0.123E~2) = false ?= (~0.5E~323, 0.123E~2) = false < (~0.5E~323, 0.22250738585072014E~307) = true > (~0.5E~323, 0.22250738585072014E~307) = false == (~0.5E~323, 0.22250738585072014E~307) = false ?= (~0.5E~323, 0.22250738585072014E~307) = false < (~0.5E~323, 0.11125369292536007E~307) = true > (~0.5E~323, 0.11125369292536007E~307) = false == (~0.5E~323, 0.11125369292536007E~307) = false ?= (~0.5E~323, 0.11125369292536007E~307) = false < (~0.5E~323, 0.5E~323) = true > (~0.5E~323, 0.5E~323) = false == (~0.5E~323, 0.5E~323) = false ?= (~0.5E~323, 0.5E~323) = false < (~0.5E~323, 0.0) = true > (~0.5E~323, 0.0) = false == (~0.5E~323, 0.0) = false ?= (~0.5E~323, 0.0) = false < (~0.5E~323, ~0.17976931348623157E309) = false > (~0.5E~323, ~0.17976931348623157E309) = true == (~0.5E~323, ~0.17976931348623157E309) = false ?= (~0.5E~323, ~0.17976931348623157E309) = false < (~0.5E~323, ~0.8988465674311579E308) = false > (~0.5E~323, ~0.8988465674311579E308) = true == (~0.5E~323, ~0.8988465674311579E308) = false ?= (~0.5E~323, ~0.8988465674311579E308) = false < (~0.5E~323, ~0.123E4) = false > (~0.5E~323, ~0.123E4) = true == (~0.5E~323, ~0.123E4) = false ?= (~0.5E~323, ~0.123E4) = false < (~0.5E~323, ~0.123E2) = false > (~0.5E~323, ~0.123E2) = true == (~0.5E~323, ~0.123E2) = false ?= (~0.5E~323, ~0.123E2) = false < (~0.5E~323, ~0.3141592653589793E1) = false > (~0.5E~323, ~0.3141592653589793E1) = true == (~0.5E~323, ~0.3141592653589793E1) = false ?= (~0.5E~323, ~0.3141592653589793E1) = false < (~0.5E~323, ~0.2718281828459045E1) = false > (~0.5E~323, ~0.2718281828459045E1) = true == (~0.5E~323, ~0.2718281828459045E1) = false ?= (~0.5E~323, ~0.2718281828459045E1) = false < (~0.5E~323, ~0.123E1) = false > (~0.5E~323, ~0.123E1) = true == (~0.5E~323, ~0.123E1) = false ?= (~0.5E~323, ~0.123E1) = false < (~0.5E~323, ~0.123) = false > (~0.5E~323, ~0.123) = true == (~0.5E~323, ~0.123) = false ?= (~0.5E~323, ~0.123) = false < (~0.5E~323, ~0.123E~2) = false > (~0.5E~323, ~0.123E~2) = true == (~0.5E~323, ~0.123E~2) = false ?= (~0.5E~323, ~0.123E~2) = false < (~0.5E~323, ~0.22250738585072014E~307) = false > (~0.5E~323, ~0.22250738585072014E~307) = true == (~0.5E~323, ~0.22250738585072014E~307) = false ?= (~0.5E~323, ~0.22250738585072014E~307) = false < (~0.5E~323, ~0.11125369292536007E~307) = false > (~0.5E~323, ~0.11125369292536007E~307) = true == (~0.5E~323, ~0.11125369292536007E~307) = false ?= (~0.5E~323, ~0.11125369292536007E~307) = false < (~0.5E~323, ~0.5E~323) = false > (~0.5E~323, ~0.5E~323) = false == (~0.5E~323, ~0.5E~323) = true ?= (~0.5E~323, ~0.5E~323) = true < (~0.5E~323, ~0.0) = true > (~0.5E~323, ~0.0) = false == (~0.5E~323, ~0.0) = false ?= (~0.5E~323, ~0.0) = false < (~0.0, 0.17976931348623157E309) = true > (~0.0, 0.17976931348623157E309) = false == (~0.0, 0.17976931348623157E309) = false ?= (~0.0, 0.17976931348623157E309) = false < (~0.0, 0.8988465674311579E308) = true > (~0.0, 0.8988465674311579E308) = false == (~0.0, 0.8988465674311579E308) = false ?= (~0.0, 0.8988465674311579E308) = false < (~0.0, 0.123E4) = true > (~0.0, 0.123E4) = false == (~0.0, 0.123E4) = false ?= (~0.0, 0.123E4) = false < (~0.0, 0.123E2) = true > (~0.0, 0.123E2) = false == (~0.0, 0.123E2) = false ?= (~0.0, 0.123E2) = false < (~0.0, 0.3141592653589793E1) = true > (~0.0, 0.3141592653589793E1) = false == (~0.0, 0.3141592653589793E1) = false ?= (~0.0, 0.3141592653589793E1) = false < (~0.0, 0.2718281828459045E1) = true > (~0.0, 0.2718281828459045E1) = false == (~0.0, 0.2718281828459045E1) = false ?= (~0.0, 0.2718281828459045E1) = false < (~0.0, 0.123E1) = true > (~0.0, 0.123E1) = false == (~0.0, 0.123E1) = false ?= (~0.0, 0.123E1) = false < (~0.0, 0.123) = true > (~0.0, 0.123) = false == (~0.0, 0.123) = false ?= (~0.0, 0.123) = false < (~0.0, 0.123E~2) = true > (~0.0, 0.123E~2) = false == (~0.0, 0.123E~2) = false ?= (~0.0, 0.123E~2) = false < (~0.0, 0.22250738585072014E~307) = true > (~0.0, 0.22250738585072014E~307) = false == (~0.0, 0.22250738585072014E~307) = false ?= (~0.0, 0.22250738585072014E~307) = false < (~0.0, 0.11125369292536007E~307) = true > (~0.0, 0.11125369292536007E~307) = false == (~0.0, 0.11125369292536007E~307) = false ?= (~0.0, 0.11125369292536007E~307) = false < (~0.0, 0.5E~323) = true > (~0.0, 0.5E~323) = false == (~0.0, 0.5E~323) = false ?= (~0.0, 0.5E~323) = false < (~0.0, 0.0) = false > (~0.0, 0.0) = false == (~0.0, 0.0) = true ?= (~0.0, 0.0) = true < (~0.0, ~0.17976931348623157E309) = false > (~0.0, ~0.17976931348623157E309) = true == (~0.0, ~0.17976931348623157E309) = false ?= (~0.0, ~0.17976931348623157E309) = false < (~0.0, ~0.8988465674311579E308) = false > (~0.0, ~0.8988465674311579E308) = true == (~0.0, ~0.8988465674311579E308) = false ?= (~0.0, ~0.8988465674311579E308) = false < (~0.0, ~0.123E4) = false > (~0.0, ~0.123E4) = true == (~0.0, ~0.123E4) = false ?= (~0.0, ~0.123E4) = false < (~0.0, ~0.123E2) = false > (~0.0, ~0.123E2) = true == (~0.0, ~0.123E2) = false ?= (~0.0, ~0.123E2) = false < (~0.0, ~0.3141592653589793E1) = false > (~0.0, ~0.3141592653589793E1) = true == (~0.0, ~0.3141592653589793E1) = false ?= (~0.0, ~0.3141592653589793E1) = false < (~0.0, ~0.2718281828459045E1) = false > (~0.0, ~0.2718281828459045E1) = true == (~0.0, ~0.2718281828459045E1) = false ?= (~0.0, ~0.2718281828459045E1) = false < (~0.0, ~0.123E1) = false > (~0.0, ~0.123E1) = true == (~0.0, ~0.123E1) = false ?= (~0.0, ~0.123E1) = false < (~0.0, ~0.123) = false > (~0.0, ~0.123) = true == (~0.0, ~0.123) = false ?= (~0.0, ~0.123) = false < (~0.0, ~0.123E~2) = false > (~0.0, ~0.123E~2) = true == (~0.0, ~0.123E~2) = false ?= (~0.0, ~0.123E~2) = false < (~0.0, ~0.22250738585072014E~307) = false > (~0.0, ~0.22250738585072014E~307) = true == (~0.0, ~0.22250738585072014E~307) = false ?= (~0.0, ~0.22250738585072014E~307) = false < (~0.0, ~0.11125369292536007E~307) = false > (~0.0, ~0.11125369292536007E~307) = true == (~0.0, ~0.11125369292536007E~307) = false ?= (~0.0, ~0.11125369292536007E~307) = false < (~0.0, ~0.5E~323) = false > (~0.0, ~0.5E~323) = true == (~0.0, ~0.5E~323) = false ?= (~0.0, ~0.5E~323) = false < (~0.0, ~0.0) = false > (~0.0, ~0.0) = false == (~0.0, ~0.0) = true ?= (~0.0, ~0.0) = true Testing compare, compareReal compare (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compareReal (0.17976931348623157E309, 0.17976931348623157E309) = EQUAL compare (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, 0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, 0.123E4) = GREATER compareReal (0.17976931348623157E309, 0.123E4) = GREATER compare (0.17976931348623157E309, 0.123E2) = GREATER compareReal (0.17976931348623157E309, 0.123E2) = GREATER compare (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, 0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, 0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, 0.123E1) = GREATER compareReal (0.17976931348623157E309, 0.123E1) = GREATER compare (0.17976931348623157E309, 0.123) = GREATER compareReal (0.17976931348623157E309, 0.123) = GREATER compare (0.17976931348623157E309, 0.123E~2) = GREATER compareReal (0.17976931348623157E309, 0.123E~2) = GREATER compare (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, 0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, 0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, 0.5E~323) = GREATER compareReal (0.17976931348623157E309, 0.5E~323) = GREATER compare (0.17976931348623157E309, 0.0) = GREATER compareReal (0.17976931348623157E309, 0.0) = GREATER compare (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compareReal (0.17976931348623157E309, ~0.17976931348623157E309) = GREATER compare (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compareReal (0.17976931348623157E309, ~0.8988465674311579E308) = GREATER compare (0.17976931348623157E309, ~0.123E4) = GREATER compareReal (0.17976931348623157E309, ~0.123E4) = GREATER compare (0.17976931348623157E309, ~0.123E2) = GREATER compareReal (0.17976931348623157E309, ~0.123E2) = GREATER compare (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compareReal (0.17976931348623157E309, ~0.3141592653589793E1) = GREATER compare (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compareReal (0.17976931348623157E309, ~0.2718281828459045E1) = GREATER compare (0.17976931348623157E309, ~0.123E1) = GREATER compareReal (0.17976931348623157E309, ~0.123E1) = GREATER compare (0.17976931348623157E309, ~0.123) = GREATER compareReal (0.17976931348623157E309, ~0.123) = GREATER compare (0.17976931348623157E309, ~0.123E~2) = GREATER compareReal (0.17976931348623157E309, ~0.123E~2) = GREATER compare (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compareReal (0.17976931348623157E309, ~0.22250738585072014E~307) = GREATER compare (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compareReal (0.17976931348623157E309, ~0.11125369292536007E~307) = GREATER compare (0.17976931348623157E309, ~0.5E~323) = GREATER compareReal (0.17976931348623157E309, ~0.5E~323) = GREATER compare (0.17976931348623157E309, ~0.0) = GREATER compareReal (0.17976931348623157E309, ~0.0) = GREATER compare (0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compareReal (0.8988465674311579E308, 0.8988465674311579E308) = EQUAL compare (0.8988465674311579E308, 0.123E4) = GREATER compareReal (0.8988465674311579E308, 0.123E4) = GREATER compare (0.8988465674311579E308, 0.123E2) = GREATER compareReal (0.8988465674311579E308, 0.123E2) = GREATER compare (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, 0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, 0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, 0.123E1) = GREATER compareReal (0.8988465674311579E308, 0.123E1) = GREATER compare (0.8988465674311579E308, 0.123) = GREATER compareReal (0.8988465674311579E308, 0.123) = GREATER compare (0.8988465674311579E308, 0.123E~2) = GREATER compareReal (0.8988465674311579E308, 0.123E~2) = GREATER compare (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, 0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, 0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, 0.5E~323) = GREATER compareReal (0.8988465674311579E308, 0.5E~323) = GREATER compare (0.8988465674311579E308, 0.0) = GREATER compareReal (0.8988465674311579E308, 0.0) = GREATER compare (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compareReal (0.8988465674311579E308, ~0.8988465674311579E308) = GREATER compare (0.8988465674311579E308, ~0.123E4) = GREATER compareReal (0.8988465674311579E308, ~0.123E4) = GREATER compare (0.8988465674311579E308, ~0.123E2) = GREATER compareReal (0.8988465674311579E308, ~0.123E2) = GREATER compare (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compareReal (0.8988465674311579E308, ~0.3141592653589793E1) = GREATER compare (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compareReal (0.8988465674311579E308, ~0.2718281828459045E1) = GREATER compare (0.8988465674311579E308, ~0.123E1) = GREATER compareReal (0.8988465674311579E308, ~0.123E1) = GREATER compare (0.8988465674311579E308, ~0.123) = GREATER compareReal (0.8988465674311579E308, ~0.123) = GREATER compare (0.8988465674311579E308, ~0.123E~2) = GREATER compareReal (0.8988465674311579E308, ~0.123E~2) = GREATER compare (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compareReal (0.8988465674311579E308, ~0.22250738585072014E~307) = GREATER compare (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compareReal (0.8988465674311579E308, ~0.11125369292536007E~307) = GREATER compare (0.8988465674311579E308, ~0.5E~323) = GREATER compareReal (0.8988465674311579E308, ~0.5E~323) = GREATER compare (0.8988465674311579E308, ~0.0) = GREATER compareReal (0.8988465674311579E308, ~0.0) = GREATER compare (0.123E4, 0.17976931348623157E309) = LESS compareReal (0.123E4, 0.17976931348623157E309) = LESS compare (0.123E4, 0.8988465674311579E308) = LESS compareReal (0.123E4, 0.8988465674311579E308) = LESS compare (0.123E4, 0.123E4) = EQUAL compareReal (0.123E4, 0.123E4) = EQUAL compare (0.123E4, 0.123E2) = GREATER compareReal (0.123E4, 0.123E2) = GREATER compare (0.123E4, 0.3141592653589793E1) = GREATER compareReal (0.123E4, 0.3141592653589793E1) = GREATER compare (0.123E4, 0.2718281828459045E1) = GREATER compareReal (0.123E4, 0.2718281828459045E1) = GREATER compare (0.123E4, 0.123E1) = GREATER compareReal (0.123E4, 0.123E1) = GREATER compare (0.123E4, 0.123) = GREATER compareReal (0.123E4, 0.123) = GREATER compare (0.123E4, 0.123E~2) = GREATER compareReal (0.123E4, 0.123E~2) = GREATER compare (0.123E4, 0.22250738585072014E~307) = GREATER compareReal (0.123E4, 0.22250738585072014E~307) = GREATER compare (0.123E4, 0.11125369292536007E~307) = GREATER compareReal (0.123E4, 0.11125369292536007E~307) = GREATER compare (0.123E4, 0.5E~323) = GREATER compareReal (0.123E4, 0.5E~323) = GREATER compare (0.123E4, 0.0) = GREATER compareReal (0.123E4, 0.0) = GREATER compare (0.123E4, ~0.17976931348623157E309) = GREATER compareReal (0.123E4, ~0.17976931348623157E309) = GREATER compare (0.123E4, ~0.8988465674311579E308) = GREATER compareReal (0.123E4, ~0.8988465674311579E308) = GREATER compare (0.123E4, ~0.123E4) = GREATER compareReal (0.123E4, ~0.123E4) = GREATER compare (0.123E4, ~0.123E2) = GREATER compareReal (0.123E4, ~0.123E2) = GREATER compare (0.123E4, ~0.3141592653589793E1) = GREATER compareReal (0.123E4, ~0.3141592653589793E1) = GREATER compare (0.123E4, ~0.2718281828459045E1) = GREATER compareReal (0.123E4, ~0.2718281828459045E1) = GREATER compare (0.123E4, ~0.123E1) = GREATER compareReal (0.123E4, ~0.123E1) = GREATER compare (0.123E4, ~0.123) = GREATER compareReal (0.123E4, ~0.123) = GREATER compare (0.123E4, ~0.123E~2) = GREATER compareReal (0.123E4, ~0.123E~2) = GREATER compare (0.123E4, ~0.22250738585072014E~307) = GREATER compareReal (0.123E4, ~0.22250738585072014E~307) = GREATER compare (0.123E4, ~0.11125369292536007E~307) = GREATER compareReal (0.123E4, ~0.11125369292536007E~307) = GREATER compare (0.123E4, ~0.5E~323) = GREATER compareReal (0.123E4, ~0.5E~323) = GREATER compare (0.123E4, ~0.0) = GREATER compareReal (0.123E4, ~0.0) = GREATER compare (0.123E2, 0.17976931348623157E309) = LESS compareReal (0.123E2, 0.17976931348623157E309) = LESS compare (0.123E2, 0.8988465674311579E308) = LESS compareReal (0.123E2, 0.8988465674311579E308) = LESS compare (0.123E2, 0.123E4) = LESS compareReal (0.123E2, 0.123E4) = LESS compare (0.123E2, 0.123E2) = EQUAL compareReal (0.123E2, 0.123E2) = EQUAL compare (0.123E2, 0.3141592653589793E1) = GREATER compareReal (0.123E2, 0.3141592653589793E1) = GREATER compare (0.123E2, 0.2718281828459045E1) = GREATER compareReal (0.123E2, 0.2718281828459045E1) = GREATER compare (0.123E2, 0.123E1) = GREATER compareReal (0.123E2, 0.123E1) = GREATER compare (0.123E2, 0.123) = GREATER compareReal (0.123E2, 0.123) = GREATER compare (0.123E2, 0.123E~2) = GREATER compareReal (0.123E2, 0.123E~2) = GREATER compare (0.123E2, 0.22250738585072014E~307) = GREATER compareReal (0.123E2, 0.22250738585072014E~307) = GREATER compare (0.123E2, 0.11125369292536007E~307) = GREATER compareReal (0.123E2, 0.11125369292536007E~307) = GREATER compare (0.123E2, 0.5E~323) = GREATER compareReal (0.123E2, 0.5E~323) = GREATER compare (0.123E2, 0.0) = GREATER compareReal (0.123E2, 0.0) = GREATER compare (0.123E2, ~0.17976931348623157E309) = GREATER compareReal (0.123E2, ~0.17976931348623157E309) = GREATER compare (0.123E2, ~0.8988465674311579E308) = GREATER compareReal (0.123E2, ~0.8988465674311579E308) = GREATER compare (0.123E2, ~0.123E4) = GREATER compareReal (0.123E2, ~0.123E4) = GREATER compare (0.123E2, ~0.123E2) = GREATER compareReal (0.123E2, ~0.123E2) = GREATER compare (0.123E2, ~0.3141592653589793E1) = GREATER compareReal (0.123E2, ~0.3141592653589793E1) = GREATER compare (0.123E2, ~0.2718281828459045E1) = GREATER compareReal (0.123E2, ~0.2718281828459045E1) = GREATER compare (0.123E2, ~0.123E1) = GREATER compareReal (0.123E2, ~0.123E1) = GREATER compare (0.123E2, ~0.123) = GREATER compareReal (0.123E2, ~0.123) = GREATER compare (0.123E2, ~0.123E~2) = GREATER compareReal (0.123E2, ~0.123E~2) = GREATER compare (0.123E2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E2, ~0.22250738585072014E~307) = GREATER compare (0.123E2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E2, ~0.11125369292536007E~307) = GREATER compare (0.123E2, ~0.5E~323) = GREATER compareReal (0.123E2, ~0.5E~323) = GREATER compare (0.123E2, ~0.0) = GREATER compareReal (0.123E2, ~0.0) = GREATER compare (0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (0.3141592653589793E1, 0.123E4) = LESS compareReal (0.3141592653589793E1, 0.123E4) = LESS compare (0.3141592653589793E1, 0.123E2) = LESS compareReal (0.3141592653589793E1, 0.123E2) = LESS compare (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compareReal (0.3141592653589793E1, 0.3141592653589793E1) = EQUAL compare (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, 0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, 0.123E1) = GREATER compareReal (0.3141592653589793E1, 0.123E1) = GREATER compare (0.3141592653589793E1, 0.123) = GREATER compareReal (0.3141592653589793E1, 0.123) = GREATER compare (0.3141592653589793E1, 0.123E~2) = GREATER compareReal (0.3141592653589793E1, 0.123E~2) = GREATER compare (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, 0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, 0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, 0.5E~323) = GREATER compareReal (0.3141592653589793E1, 0.5E~323) = GREATER compare (0.3141592653589793E1, 0.0) = GREATER compareReal (0.3141592653589793E1, 0.0) = GREATER compare (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (0.3141592653589793E1, ~0.123E4) = GREATER compareReal (0.3141592653589793E1, ~0.123E4) = GREATER compare (0.3141592653589793E1, ~0.123E2) = GREATER compareReal (0.3141592653589793E1, ~0.123E2) = GREATER compare (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compareReal (0.3141592653589793E1, ~0.3141592653589793E1) = GREATER compare (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compareReal (0.3141592653589793E1, ~0.2718281828459045E1) = GREATER compare (0.3141592653589793E1, ~0.123E1) = GREATER compareReal (0.3141592653589793E1, ~0.123E1) = GREATER compare (0.3141592653589793E1, ~0.123) = GREATER compareReal (0.3141592653589793E1, ~0.123) = GREATER compare (0.3141592653589793E1, ~0.123E~2) = GREATER compareReal (0.3141592653589793E1, ~0.123E~2) = GREATER compare (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compareReal (0.3141592653589793E1, ~0.22250738585072014E~307) = GREATER compare (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compareReal (0.3141592653589793E1, ~0.11125369292536007E~307) = GREATER compare (0.3141592653589793E1, ~0.5E~323) = GREATER compareReal (0.3141592653589793E1, ~0.5E~323) = GREATER compare (0.3141592653589793E1, ~0.0) = GREATER compareReal (0.3141592653589793E1, ~0.0) = GREATER compare (0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (0.2718281828459045E1, 0.123E4) = LESS compareReal (0.2718281828459045E1, 0.123E4) = LESS compare (0.2718281828459045E1, 0.123E2) = LESS compareReal (0.2718281828459045E1, 0.123E2) = LESS compare (0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compareReal (0.2718281828459045E1, 0.2718281828459045E1) = EQUAL compare (0.2718281828459045E1, 0.123E1) = GREATER compareReal (0.2718281828459045E1, 0.123E1) = GREATER compare (0.2718281828459045E1, 0.123) = GREATER compareReal (0.2718281828459045E1, 0.123) = GREATER compare (0.2718281828459045E1, 0.123E~2) = GREATER compareReal (0.2718281828459045E1, 0.123E~2) = GREATER compare (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, 0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, 0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, 0.5E~323) = GREATER compareReal (0.2718281828459045E1, 0.5E~323) = GREATER compare (0.2718281828459045E1, 0.0) = GREATER compareReal (0.2718281828459045E1, 0.0) = GREATER compare (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (0.2718281828459045E1, ~0.123E4) = GREATER compareReal (0.2718281828459045E1, ~0.123E4) = GREATER compare (0.2718281828459045E1, ~0.123E2) = GREATER compareReal (0.2718281828459045E1, ~0.123E2) = GREATER compare (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compareReal (0.2718281828459045E1, ~0.2718281828459045E1) = GREATER compare (0.2718281828459045E1, ~0.123E1) = GREATER compareReal (0.2718281828459045E1, ~0.123E1) = GREATER compare (0.2718281828459045E1, ~0.123) = GREATER compareReal (0.2718281828459045E1, ~0.123) = GREATER compare (0.2718281828459045E1, ~0.123E~2) = GREATER compareReal (0.2718281828459045E1, ~0.123E~2) = GREATER compare (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compareReal (0.2718281828459045E1, ~0.22250738585072014E~307) = GREATER compare (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compareReal (0.2718281828459045E1, ~0.11125369292536007E~307) = GREATER compare (0.2718281828459045E1, ~0.5E~323) = GREATER compareReal (0.2718281828459045E1, ~0.5E~323) = GREATER compare (0.2718281828459045E1, ~0.0) = GREATER compareReal (0.2718281828459045E1, ~0.0) = GREATER compare (0.123E1, 0.17976931348623157E309) = LESS compareReal (0.123E1, 0.17976931348623157E309) = LESS compare (0.123E1, 0.8988465674311579E308) = LESS compareReal (0.123E1, 0.8988465674311579E308) = LESS compare (0.123E1, 0.123E4) = LESS compareReal (0.123E1, 0.123E4) = LESS compare (0.123E1, 0.123E2) = LESS compareReal (0.123E1, 0.123E2) = LESS compare (0.123E1, 0.3141592653589793E1) = LESS compareReal (0.123E1, 0.3141592653589793E1) = LESS compare (0.123E1, 0.2718281828459045E1) = LESS compareReal (0.123E1, 0.2718281828459045E1) = LESS compare (0.123E1, 0.123E1) = EQUAL compareReal (0.123E1, 0.123E1) = EQUAL compare (0.123E1, 0.123) = GREATER compareReal (0.123E1, 0.123) = GREATER compare (0.123E1, 0.123E~2) = GREATER compareReal (0.123E1, 0.123E~2) = GREATER compare (0.123E1, 0.22250738585072014E~307) = GREATER compareReal (0.123E1, 0.22250738585072014E~307) = GREATER compare (0.123E1, 0.11125369292536007E~307) = GREATER compareReal (0.123E1, 0.11125369292536007E~307) = GREATER compare (0.123E1, 0.5E~323) = GREATER compareReal (0.123E1, 0.5E~323) = GREATER compare (0.123E1, 0.0) = GREATER compareReal (0.123E1, 0.0) = GREATER compare (0.123E1, ~0.17976931348623157E309) = GREATER compareReal (0.123E1, ~0.17976931348623157E309) = GREATER compare (0.123E1, ~0.8988465674311579E308) = GREATER compareReal (0.123E1, ~0.8988465674311579E308) = GREATER compare (0.123E1, ~0.123E4) = GREATER compareReal (0.123E1, ~0.123E4) = GREATER compare (0.123E1, ~0.123E2) = GREATER compareReal (0.123E1, ~0.123E2) = GREATER compare (0.123E1, ~0.3141592653589793E1) = GREATER compareReal (0.123E1, ~0.3141592653589793E1) = GREATER compare (0.123E1, ~0.2718281828459045E1) = GREATER compareReal (0.123E1, ~0.2718281828459045E1) = GREATER compare (0.123E1, ~0.123E1) = GREATER compareReal (0.123E1, ~0.123E1) = GREATER compare (0.123E1, ~0.123) = GREATER compareReal (0.123E1, ~0.123) = GREATER compare (0.123E1, ~0.123E~2) = GREATER compareReal (0.123E1, ~0.123E~2) = GREATER compare (0.123E1, ~0.22250738585072014E~307) = GREATER compareReal (0.123E1, ~0.22250738585072014E~307) = GREATER compare (0.123E1, ~0.11125369292536007E~307) = GREATER compareReal (0.123E1, ~0.11125369292536007E~307) = GREATER compare (0.123E1, ~0.5E~323) = GREATER compareReal (0.123E1, ~0.5E~323) = GREATER compare (0.123E1, ~0.0) = GREATER compareReal (0.123E1, ~0.0) = GREATER compare (0.123, 0.17976931348623157E309) = LESS compareReal (0.123, 0.17976931348623157E309) = LESS compare (0.123, 0.8988465674311579E308) = LESS compareReal (0.123, 0.8988465674311579E308) = LESS compare (0.123, 0.123E4) = LESS compareReal (0.123, 0.123E4) = LESS compare (0.123, 0.123E2) = LESS compareReal (0.123, 0.123E2) = LESS compare (0.123, 0.3141592653589793E1) = LESS compareReal (0.123, 0.3141592653589793E1) = LESS compare (0.123, 0.2718281828459045E1) = LESS compareReal (0.123, 0.2718281828459045E1) = LESS compare (0.123, 0.123E1) = LESS compareReal (0.123, 0.123E1) = LESS compare (0.123, 0.123) = EQUAL compareReal (0.123, 0.123) = EQUAL compare (0.123, 0.123E~2) = GREATER compareReal (0.123, 0.123E~2) = GREATER compare (0.123, 0.22250738585072014E~307) = GREATER compareReal (0.123, 0.22250738585072014E~307) = GREATER compare (0.123, 0.11125369292536007E~307) = GREATER compareReal (0.123, 0.11125369292536007E~307) = GREATER compare (0.123, 0.5E~323) = GREATER compareReal (0.123, 0.5E~323) = GREATER compare (0.123, 0.0) = GREATER compareReal (0.123, 0.0) = GREATER compare (0.123, ~0.17976931348623157E309) = GREATER compareReal (0.123, ~0.17976931348623157E309) = GREATER compare (0.123, ~0.8988465674311579E308) = GREATER compareReal (0.123, ~0.8988465674311579E308) = GREATER compare (0.123, ~0.123E4) = GREATER compareReal (0.123, ~0.123E4) = GREATER compare (0.123, ~0.123E2) = GREATER compareReal (0.123, ~0.123E2) = GREATER compare (0.123, ~0.3141592653589793E1) = GREATER compareReal (0.123, ~0.3141592653589793E1) = GREATER compare (0.123, ~0.2718281828459045E1) = GREATER compareReal (0.123, ~0.2718281828459045E1) = GREATER compare (0.123, ~0.123E1) = GREATER compareReal (0.123, ~0.123E1) = GREATER compare (0.123, ~0.123) = GREATER compareReal (0.123, ~0.123) = GREATER compare (0.123, ~0.123E~2) = GREATER compareReal (0.123, ~0.123E~2) = GREATER compare (0.123, ~0.22250738585072014E~307) = GREATER compareReal (0.123, ~0.22250738585072014E~307) = GREATER compare (0.123, ~0.11125369292536007E~307) = GREATER compareReal (0.123, ~0.11125369292536007E~307) = GREATER compare (0.123, ~0.5E~323) = GREATER compareReal (0.123, ~0.5E~323) = GREATER compare (0.123, ~0.0) = GREATER compareReal (0.123, ~0.0) = GREATER compare (0.123E~2, 0.17976931348623157E309) = LESS compareReal (0.123E~2, 0.17976931348623157E309) = LESS compare (0.123E~2, 0.8988465674311579E308) = LESS compareReal (0.123E~2, 0.8988465674311579E308) = LESS compare (0.123E~2, 0.123E4) = LESS compareReal (0.123E~2, 0.123E4) = LESS compare (0.123E~2, 0.123E2) = LESS compareReal (0.123E~2, 0.123E2) = LESS compare (0.123E~2, 0.3141592653589793E1) = LESS compareReal (0.123E~2, 0.3141592653589793E1) = LESS compare (0.123E~2, 0.2718281828459045E1) = LESS compareReal (0.123E~2, 0.2718281828459045E1) = LESS compare (0.123E~2, 0.123E1) = LESS compareReal (0.123E~2, 0.123E1) = LESS compare (0.123E~2, 0.123) = LESS compareReal (0.123E~2, 0.123) = LESS compare (0.123E~2, 0.123E~2) = EQUAL compareReal (0.123E~2, 0.123E~2) = EQUAL compare (0.123E~2, 0.22250738585072014E~307) = GREATER compareReal (0.123E~2, 0.22250738585072014E~307) = GREATER compare (0.123E~2, 0.11125369292536007E~307) = GREATER compareReal (0.123E~2, 0.11125369292536007E~307) = GREATER compare (0.123E~2, 0.5E~323) = GREATER compareReal (0.123E~2, 0.5E~323) = GREATER compare (0.123E~2, 0.0) = GREATER compareReal (0.123E~2, 0.0) = GREATER compare (0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (0.123E~2, ~0.17976931348623157E309) = GREATER compare (0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (0.123E~2, ~0.8988465674311579E308) = GREATER compare (0.123E~2, ~0.123E4) = GREATER compareReal (0.123E~2, ~0.123E4) = GREATER compare (0.123E~2, ~0.123E2) = GREATER compareReal (0.123E~2, ~0.123E2) = GREATER compare (0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (0.123E~2, ~0.3141592653589793E1) = GREATER compare (0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (0.123E~2, ~0.2718281828459045E1) = GREATER compare (0.123E~2, ~0.123E1) = GREATER compareReal (0.123E~2, ~0.123E1) = GREATER compare (0.123E~2, ~0.123) = GREATER compareReal (0.123E~2, ~0.123) = GREATER compare (0.123E~2, ~0.123E~2) = GREATER compareReal (0.123E~2, ~0.123E~2) = GREATER compare (0.123E~2, ~0.22250738585072014E~307) = GREATER compareReal (0.123E~2, ~0.22250738585072014E~307) = GREATER compare (0.123E~2, ~0.11125369292536007E~307) = GREATER compareReal (0.123E~2, ~0.11125369292536007E~307) = GREATER compare (0.123E~2, ~0.5E~323) = GREATER compareReal (0.123E~2, ~0.5E~323) = GREATER compare (0.123E~2, ~0.0) = GREATER compareReal (0.123E~2, ~0.0) = GREATER compare (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (0.22250738585072014E~307, 0.123E4) = LESS compareReal (0.22250738585072014E~307, 0.123E4) = LESS compare (0.22250738585072014E~307, 0.123E2) = LESS compareReal (0.22250738585072014E~307, 0.123E2) = LESS compare (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (0.22250738585072014E~307, 0.123E1) = LESS compareReal (0.22250738585072014E~307, 0.123E1) = LESS compare (0.22250738585072014E~307, 0.123) = LESS compareReal (0.22250738585072014E~307, 0.123) = LESS compare (0.22250738585072014E~307, 0.123E~2) = LESS compareReal (0.22250738585072014E~307, 0.123E~2) = LESS compare (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compareReal (0.22250738585072014E~307, 0.22250738585072014E~307) = EQUAL compare (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, 0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, 0.5E~323) = GREATER compareReal (0.22250738585072014E~307, 0.5E~323) = GREATER compare (0.22250738585072014E~307, 0.0) = GREATER compareReal (0.22250738585072014E~307, 0.0) = GREATER compare (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (0.22250738585072014E~307, ~0.123E4) = GREATER compare (0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E2) = GREATER compare (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (0.22250738585072014E~307, ~0.123E1) = GREATER compare (0.22250738585072014E~307, ~0.123) = GREATER compareReal (0.22250738585072014E~307, ~0.123) = GREATER compare (0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (0.22250738585072014E~307, ~0.123E~2) = GREATER compare (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.22250738585072014E~307) = GREATER compare (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.22250738585072014E~307, ~0.11125369292536007E~307) = GREATER compare (0.22250738585072014E~307, ~0.5E~323) = GREATER compareReal (0.22250738585072014E~307, ~0.5E~323) = GREATER compare (0.22250738585072014E~307, ~0.0) = GREATER compareReal (0.22250738585072014E~307, ~0.0) = GREATER compare (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (0.11125369292536007E~307, 0.123E4) = LESS compareReal (0.11125369292536007E~307, 0.123E4) = LESS compare (0.11125369292536007E~307, 0.123E2) = LESS compareReal (0.11125369292536007E~307, 0.123E2) = LESS compare (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (0.11125369292536007E~307, 0.123E1) = LESS compareReal (0.11125369292536007E~307, 0.123E1) = LESS compare (0.11125369292536007E~307, 0.123) = LESS compareReal (0.11125369292536007E~307, 0.123) = LESS compare (0.11125369292536007E~307, 0.123E~2) = LESS compareReal (0.11125369292536007E~307, 0.123E~2) = LESS compare (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compareReal (0.11125369292536007E~307, 0.11125369292536007E~307) = EQUAL compare (0.11125369292536007E~307, 0.5E~323) = GREATER compareReal (0.11125369292536007E~307, 0.5E~323) = GREATER compare (0.11125369292536007E~307, 0.0) = GREATER compareReal (0.11125369292536007E~307, 0.0) = GREATER compare (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (0.11125369292536007E~307, ~0.123E4) = GREATER compare (0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E2) = GREATER compare (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (0.11125369292536007E~307, ~0.123E1) = GREATER compare (0.11125369292536007E~307, ~0.123) = GREATER compareReal (0.11125369292536007E~307, ~0.123) = GREATER compare (0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (0.11125369292536007E~307, ~0.123E~2) = GREATER compare (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compareReal (0.11125369292536007E~307, ~0.11125369292536007E~307) = GREATER compare (0.11125369292536007E~307, ~0.5E~323) = GREATER compareReal (0.11125369292536007E~307, ~0.5E~323) = GREATER compare (0.11125369292536007E~307, ~0.0) = GREATER compareReal (0.11125369292536007E~307, ~0.0) = GREATER compare (0.5E~323, 0.17976931348623157E309) = LESS compareReal (0.5E~323, 0.17976931348623157E309) = LESS compare (0.5E~323, 0.8988465674311579E308) = LESS compareReal (0.5E~323, 0.8988465674311579E308) = LESS compare (0.5E~323, 0.123E4) = LESS compareReal (0.5E~323, 0.123E4) = LESS compare (0.5E~323, 0.123E2) = LESS compareReal (0.5E~323, 0.123E2) = LESS compare (0.5E~323, 0.3141592653589793E1) = LESS compareReal (0.5E~323, 0.3141592653589793E1) = LESS compare (0.5E~323, 0.2718281828459045E1) = LESS compareReal (0.5E~323, 0.2718281828459045E1) = LESS compare (0.5E~323, 0.123E1) = LESS compareReal (0.5E~323, 0.123E1) = LESS compare (0.5E~323, 0.123) = LESS compareReal (0.5E~323, 0.123) = LESS compare (0.5E~323, 0.123E~2) = LESS compareReal (0.5E~323, 0.123E~2) = LESS compare (0.5E~323, 0.22250738585072014E~307) = LESS compareReal (0.5E~323, 0.22250738585072014E~307) = LESS compare (0.5E~323, 0.11125369292536007E~307) = LESS compareReal (0.5E~323, 0.11125369292536007E~307) = LESS compare (0.5E~323, 0.5E~323) = EQUAL compareReal (0.5E~323, 0.5E~323) = EQUAL compare (0.5E~323, 0.0) = GREATER compareReal (0.5E~323, 0.0) = GREATER compare (0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (0.5E~323, ~0.17976931348623157E309) = GREATER compare (0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (0.5E~323, ~0.8988465674311579E308) = GREATER compare (0.5E~323, ~0.123E4) = GREATER compareReal (0.5E~323, ~0.123E4) = GREATER compare (0.5E~323, ~0.123E2) = GREATER compareReal (0.5E~323, ~0.123E2) = GREATER compare (0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (0.5E~323, ~0.3141592653589793E1) = GREATER compare (0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (0.5E~323, ~0.2718281828459045E1) = GREATER compare (0.5E~323, ~0.123E1) = GREATER compareReal (0.5E~323, ~0.123E1) = GREATER compare (0.5E~323, ~0.123) = GREATER compareReal (0.5E~323, ~0.123) = GREATER compare (0.5E~323, ~0.123E~2) = GREATER compareReal (0.5E~323, ~0.123E~2) = GREATER compare (0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (0.5E~323, ~0.22250738585072014E~307) = GREATER compare (0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (0.5E~323, ~0.11125369292536007E~307) = GREATER compare (0.5E~323, ~0.5E~323) = GREATER compareReal (0.5E~323, ~0.5E~323) = GREATER compare (0.5E~323, ~0.0) = GREATER compareReal (0.5E~323, ~0.0) = GREATER compare (0.0, 0.17976931348623157E309) = LESS compareReal (0.0, 0.17976931348623157E309) = LESS compare (0.0, 0.8988465674311579E308) = LESS compareReal (0.0, 0.8988465674311579E308) = LESS compare (0.0, 0.123E4) = LESS compareReal (0.0, 0.123E4) = LESS compare (0.0, 0.123E2) = LESS compareReal (0.0, 0.123E2) = LESS compare (0.0, 0.3141592653589793E1) = LESS compareReal (0.0, 0.3141592653589793E1) = LESS compare (0.0, 0.2718281828459045E1) = LESS compareReal (0.0, 0.2718281828459045E1) = LESS compare (0.0, 0.123E1) = LESS compareReal (0.0, 0.123E1) = LESS compare (0.0, 0.123) = LESS compareReal (0.0, 0.123) = LESS compare (0.0, 0.123E~2) = LESS compareReal (0.0, 0.123E~2) = LESS compare (0.0, 0.22250738585072014E~307) = LESS compareReal (0.0, 0.22250738585072014E~307) = LESS compare (0.0, 0.11125369292536007E~307) = LESS compareReal (0.0, 0.11125369292536007E~307) = LESS compare (0.0, 0.5E~323) = LESS compareReal (0.0, 0.5E~323) = LESS compare (0.0, 0.0) = EQUAL compareReal (0.0, 0.0) = EQUAL compare (0.0, ~0.17976931348623157E309) = GREATER compareReal (0.0, ~0.17976931348623157E309) = GREATER compare (0.0, ~0.8988465674311579E308) = GREATER compareReal (0.0, ~0.8988465674311579E308) = GREATER compare (0.0, ~0.123E4) = GREATER compareReal (0.0, ~0.123E4) = GREATER compare (0.0, ~0.123E2) = GREATER compareReal (0.0, ~0.123E2) = GREATER compare (0.0, ~0.3141592653589793E1) = GREATER compareReal (0.0, ~0.3141592653589793E1) = GREATER compare (0.0, ~0.2718281828459045E1) = GREATER compareReal (0.0, ~0.2718281828459045E1) = GREATER compare (0.0, ~0.123E1) = GREATER compareReal (0.0, ~0.123E1) = GREATER compare (0.0, ~0.123) = GREATER compareReal (0.0, ~0.123) = GREATER compare (0.0, ~0.123E~2) = GREATER compareReal (0.0, ~0.123E~2) = GREATER compare (0.0, ~0.22250738585072014E~307) = GREATER compareReal (0.0, ~0.22250738585072014E~307) = GREATER compare (0.0, ~0.11125369292536007E~307) = GREATER compareReal (0.0, ~0.11125369292536007E~307) = GREATER compare (0.0, ~0.5E~323) = GREATER compareReal (0.0, ~0.5E~323) = GREATER compare (0.0, ~0.0) = EQUAL compareReal (0.0, ~0.0) = EQUAL compare (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compareReal (~0.17976931348623157E309, 0.17976931348623157E309) = LESS compare (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, 0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, 0.123E4) = LESS compareReal (~0.17976931348623157E309, 0.123E4) = LESS compare (~0.17976931348623157E309, 0.123E2) = LESS compareReal (~0.17976931348623157E309, 0.123E2) = LESS compare (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, 0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, 0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, 0.123E1) = LESS compareReal (~0.17976931348623157E309, 0.123E1) = LESS compare (~0.17976931348623157E309, 0.123) = LESS compareReal (~0.17976931348623157E309, 0.123) = LESS compare (~0.17976931348623157E309, 0.123E~2) = LESS compareReal (~0.17976931348623157E309, 0.123E~2) = LESS compare (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, 0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, 0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, 0.5E~323) = LESS compareReal (~0.17976931348623157E309, 0.5E~323) = LESS compare (~0.17976931348623157E309, 0.0) = LESS compareReal (~0.17976931348623157E309, 0.0) = LESS compare (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compareReal (~0.17976931348623157E309, ~0.17976931348623157E309) = EQUAL compare (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compareReal (~0.17976931348623157E309, ~0.8988465674311579E308) = LESS compare (~0.17976931348623157E309, ~0.123E4) = LESS compareReal (~0.17976931348623157E309, ~0.123E4) = LESS compare (~0.17976931348623157E309, ~0.123E2) = LESS compareReal (~0.17976931348623157E309, ~0.123E2) = LESS compare (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compareReal (~0.17976931348623157E309, ~0.3141592653589793E1) = LESS compare (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compareReal (~0.17976931348623157E309, ~0.2718281828459045E1) = LESS compare (~0.17976931348623157E309, ~0.123E1) = LESS compareReal (~0.17976931348623157E309, ~0.123E1) = LESS compare (~0.17976931348623157E309, ~0.123) = LESS compareReal (~0.17976931348623157E309, ~0.123) = LESS compare (~0.17976931348623157E309, ~0.123E~2) = LESS compareReal (~0.17976931348623157E309, ~0.123E~2) = LESS compare (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compareReal (~0.17976931348623157E309, ~0.22250738585072014E~307) = LESS compare (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compareReal (~0.17976931348623157E309, ~0.11125369292536007E~307) = LESS compare (~0.17976931348623157E309, ~0.5E~323) = LESS compareReal (~0.17976931348623157E309, ~0.5E~323) = LESS compare (~0.17976931348623157E309, ~0.0) = LESS compareReal (~0.17976931348623157E309, ~0.0) = LESS compare (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compareReal (~0.8988465674311579E308, 0.17976931348623157E309) = LESS compare (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compareReal (~0.8988465674311579E308, 0.8988465674311579E308) = LESS compare (~0.8988465674311579E308, 0.123E4) = LESS compareReal (~0.8988465674311579E308, 0.123E4) = LESS compare (~0.8988465674311579E308, 0.123E2) = LESS compareReal (~0.8988465674311579E308, 0.123E2) = LESS compare (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, 0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, 0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, 0.123E1) = LESS compareReal (~0.8988465674311579E308, 0.123E1) = LESS compare (~0.8988465674311579E308, 0.123) = LESS compareReal (~0.8988465674311579E308, 0.123) = LESS compare (~0.8988465674311579E308, 0.123E~2) = LESS compareReal (~0.8988465674311579E308, 0.123E~2) = LESS compare (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, 0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, 0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, 0.5E~323) = LESS compareReal (~0.8988465674311579E308, 0.5E~323) = LESS compare (~0.8988465674311579E308, 0.0) = LESS compareReal (~0.8988465674311579E308, 0.0) = LESS compare (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compareReal (~0.8988465674311579E308, ~0.17976931348623157E309) = GREATER compare (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compareReal (~0.8988465674311579E308, ~0.8988465674311579E308) = EQUAL compare (~0.8988465674311579E308, ~0.123E4) = LESS compareReal (~0.8988465674311579E308, ~0.123E4) = LESS compare (~0.8988465674311579E308, ~0.123E2) = LESS compareReal (~0.8988465674311579E308, ~0.123E2) = LESS compare (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compareReal (~0.8988465674311579E308, ~0.3141592653589793E1) = LESS compare (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compareReal (~0.8988465674311579E308, ~0.2718281828459045E1) = LESS compare (~0.8988465674311579E308, ~0.123E1) = LESS compareReal (~0.8988465674311579E308, ~0.123E1) = LESS compare (~0.8988465674311579E308, ~0.123) = LESS compareReal (~0.8988465674311579E308, ~0.123) = LESS compare (~0.8988465674311579E308, ~0.123E~2) = LESS compareReal (~0.8988465674311579E308, ~0.123E~2) = LESS compare (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compareReal (~0.8988465674311579E308, ~0.22250738585072014E~307) = LESS compare (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compareReal (~0.8988465674311579E308, ~0.11125369292536007E~307) = LESS compare (~0.8988465674311579E308, ~0.5E~323) = LESS compareReal (~0.8988465674311579E308, ~0.5E~323) = LESS compare (~0.8988465674311579E308, ~0.0) = LESS compareReal (~0.8988465674311579E308, ~0.0) = LESS compare (~0.123E4, 0.17976931348623157E309) = LESS compareReal (~0.123E4, 0.17976931348623157E309) = LESS compare (~0.123E4, 0.8988465674311579E308) = LESS compareReal (~0.123E4, 0.8988465674311579E308) = LESS compare (~0.123E4, 0.123E4) = LESS compareReal (~0.123E4, 0.123E4) = LESS compare (~0.123E4, 0.123E2) = LESS compareReal (~0.123E4, 0.123E2) = LESS compare (~0.123E4, 0.3141592653589793E1) = LESS compareReal (~0.123E4, 0.3141592653589793E1) = LESS compare (~0.123E4, 0.2718281828459045E1) = LESS compareReal (~0.123E4, 0.2718281828459045E1) = LESS compare (~0.123E4, 0.123E1) = LESS compareReal (~0.123E4, 0.123E1) = LESS compare (~0.123E4, 0.123) = LESS compareReal (~0.123E4, 0.123) = LESS compare (~0.123E4, 0.123E~2) = LESS compareReal (~0.123E4, 0.123E~2) = LESS compare (~0.123E4, 0.22250738585072014E~307) = LESS compareReal (~0.123E4, 0.22250738585072014E~307) = LESS compare (~0.123E4, 0.11125369292536007E~307) = LESS compareReal (~0.123E4, 0.11125369292536007E~307) = LESS compare (~0.123E4, 0.5E~323) = LESS compareReal (~0.123E4, 0.5E~323) = LESS compare (~0.123E4, 0.0) = LESS compareReal (~0.123E4, 0.0) = LESS compare (~0.123E4, ~0.17976931348623157E309) = GREATER compareReal (~0.123E4, ~0.17976931348623157E309) = GREATER compare (~0.123E4, ~0.8988465674311579E308) = GREATER compareReal (~0.123E4, ~0.8988465674311579E308) = GREATER compare (~0.123E4, ~0.123E4) = EQUAL compareReal (~0.123E4, ~0.123E4) = EQUAL compare (~0.123E4, ~0.123E2) = LESS compareReal (~0.123E4, ~0.123E2) = LESS compare (~0.123E4, ~0.3141592653589793E1) = LESS compareReal (~0.123E4, ~0.3141592653589793E1) = LESS compare (~0.123E4, ~0.2718281828459045E1) = LESS compareReal (~0.123E4, ~0.2718281828459045E1) = LESS compare (~0.123E4, ~0.123E1) = LESS compareReal (~0.123E4, ~0.123E1) = LESS compare (~0.123E4, ~0.123) = LESS compareReal (~0.123E4, ~0.123) = LESS compare (~0.123E4, ~0.123E~2) = LESS compareReal (~0.123E4, ~0.123E~2) = LESS compare (~0.123E4, ~0.22250738585072014E~307) = LESS compareReal (~0.123E4, ~0.22250738585072014E~307) = LESS compare (~0.123E4, ~0.11125369292536007E~307) = LESS compareReal (~0.123E4, ~0.11125369292536007E~307) = LESS compare (~0.123E4, ~0.5E~323) = LESS compareReal (~0.123E4, ~0.5E~323) = LESS compare (~0.123E4, ~0.0) = LESS compareReal (~0.123E4, ~0.0) = LESS compare (~0.123E2, 0.17976931348623157E309) = LESS compareReal (~0.123E2, 0.17976931348623157E309) = LESS compare (~0.123E2, 0.8988465674311579E308) = LESS compareReal (~0.123E2, 0.8988465674311579E308) = LESS compare (~0.123E2, 0.123E4) = LESS compareReal (~0.123E2, 0.123E4) = LESS compare (~0.123E2, 0.123E2) = LESS compareReal (~0.123E2, 0.123E2) = LESS compare (~0.123E2, 0.3141592653589793E1) = LESS compareReal (~0.123E2, 0.3141592653589793E1) = LESS compare (~0.123E2, 0.2718281828459045E1) = LESS compareReal (~0.123E2, 0.2718281828459045E1) = LESS compare (~0.123E2, 0.123E1) = LESS compareReal (~0.123E2, 0.123E1) = LESS compare (~0.123E2, 0.123) = LESS compareReal (~0.123E2, 0.123) = LESS compare (~0.123E2, 0.123E~2) = LESS compareReal (~0.123E2, 0.123E~2) = LESS compare (~0.123E2, 0.22250738585072014E~307) = LESS compareReal (~0.123E2, 0.22250738585072014E~307) = LESS compare (~0.123E2, 0.11125369292536007E~307) = LESS compareReal (~0.123E2, 0.11125369292536007E~307) = LESS compare (~0.123E2, 0.5E~323) = LESS compareReal (~0.123E2, 0.5E~323) = LESS compare (~0.123E2, 0.0) = LESS compareReal (~0.123E2, 0.0) = LESS compare (~0.123E2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E2, ~0.17976931348623157E309) = GREATER compare (~0.123E2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E2, ~0.8988465674311579E308) = GREATER compare (~0.123E2, ~0.123E4) = GREATER compareReal (~0.123E2, ~0.123E4) = GREATER compare (~0.123E2, ~0.123E2) = EQUAL compareReal (~0.123E2, ~0.123E2) = EQUAL compare (~0.123E2, ~0.3141592653589793E1) = LESS compareReal (~0.123E2, ~0.3141592653589793E1) = LESS compare (~0.123E2, ~0.2718281828459045E1) = LESS compareReal (~0.123E2, ~0.2718281828459045E1) = LESS compare (~0.123E2, ~0.123E1) = LESS compareReal (~0.123E2, ~0.123E1) = LESS compare (~0.123E2, ~0.123) = LESS compareReal (~0.123E2, ~0.123) = LESS compare (~0.123E2, ~0.123E~2) = LESS compareReal (~0.123E2, ~0.123E~2) = LESS compare (~0.123E2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E2, ~0.22250738585072014E~307) = LESS compare (~0.123E2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E2, ~0.11125369292536007E~307) = LESS compare (~0.123E2, ~0.5E~323) = LESS compareReal (~0.123E2, ~0.5E~323) = LESS compare (~0.123E2, ~0.0) = LESS compareReal (~0.123E2, ~0.0) = LESS compare (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compareReal (~0.3141592653589793E1, 0.17976931348623157E309) = LESS compare (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compareReal (~0.3141592653589793E1, 0.8988465674311579E308) = LESS compare (~0.3141592653589793E1, 0.123E4) = LESS compareReal (~0.3141592653589793E1, 0.123E4) = LESS compare (~0.3141592653589793E1, 0.123E2) = LESS compareReal (~0.3141592653589793E1, 0.123E2) = LESS compare (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compareReal (~0.3141592653589793E1, 0.3141592653589793E1) = LESS compare (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, 0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, 0.123E1) = LESS compareReal (~0.3141592653589793E1, 0.123E1) = LESS compare (~0.3141592653589793E1, 0.123) = LESS compareReal (~0.3141592653589793E1, 0.123) = LESS compare (~0.3141592653589793E1, 0.123E~2) = LESS compareReal (~0.3141592653589793E1, 0.123E~2) = LESS compare (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, 0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, 0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, 0.5E~323) = LESS compareReal (~0.3141592653589793E1, 0.5E~323) = LESS compare (~0.3141592653589793E1, 0.0) = LESS compareReal (~0.3141592653589793E1, 0.0) = LESS compare (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compareReal (~0.3141592653589793E1, ~0.17976931348623157E309) = GREATER compare (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compareReal (~0.3141592653589793E1, ~0.8988465674311579E308) = GREATER compare (~0.3141592653589793E1, ~0.123E4) = GREATER compareReal (~0.3141592653589793E1, ~0.123E4) = GREATER compare (~0.3141592653589793E1, ~0.123E2) = GREATER compareReal (~0.3141592653589793E1, ~0.123E2) = GREATER compare (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compareReal (~0.3141592653589793E1, ~0.3141592653589793E1) = EQUAL compare (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compareReal (~0.3141592653589793E1, ~0.2718281828459045E1) = LESS compare (~0.3141592653589793E1, ~0.123E1) = LESS compareReal (~0.3141592653589793E1, ~0.123E1) = LESS compare (~0.3141592653589793E1, ~0.123) = LESS compareReal (~0.3141592653589793E1, ~0.123) = LESS compare (~0.3141592653589793E1, ~0.123E~2) = LESS compareReal (~0.3141592653589793E1, ~0.123E~2) = LESS compare (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compareReal (~0.3141592653589793E1, ~0.22250738585072014E~307) = LESS compare (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compareReal (~0.3141592653589793E1, ~0.11125369292536007E~307) = LESS compare (~0.3141592653589793E1, ~0.5E~323) = LESS compareReal (~0.3141592653589793E1, ~0.5E~323) = LESS compare (~0.3141592653589793E1, ~0.0) = LESS compareReal (~0.3141592653589793E1, ~0.0) = LESS compare (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compareReal (~0.2718281828459045E1, 0.17976931348623157E309) = LESS compare (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compareReal (~0.2718281828459045E1, 0.8988465674311579E308) = LESS compare (~0.2718281828459045E1, 0.123E4) = LESS compareReal (~0.2718281828459045E1, 0.123E4) = LESS compare (~0.2718281828459045E1, 0.123E2) = LESS compareReal (~0.2718281828459045E1, 0.123E2) = LESS compare (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compareReal (~0.2718281828459045E1, 0.3141592653589793E1) = LESS compare (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compareReal (~0.2718281828459045E1, 0.2718281828459045E1) = LESS compare (~0.2718281828459045E1, 0.123E1) = LESS compareReal (~0.2718281828459045E1, 0.123E1) = LESS compare (~0.2718281828459045E1, 0.123) = LESS compareReal (~0.2718281828459045E1, 0.123) = LESS compare (~0.2718281828459045E1, 0.123E~2) = LESS compareReal (~0.2718281828459045E1, 0.123E~2) = LESS compare (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, 0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, 0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, 0.5E~323) = LESS compareReal (~0.2718281828459045E1, 0.5E~323) = LESS compare (~0.2718281828459045E1, 0.0) = LESS compareReal (~0.2718281828459045E1, 0.0) = LESS compare (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compareReal (~0.2718281828459045E1, ~0.17976931348623157E309) = GREATER compare (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compareReal (~0.2718281828459045E1, ~0.8988465674311579E308) = GREATER compare (~0.2718281828459045E1, ~0.123E4) = GREATER compareReal (~0.2718281828459045E1, ~0.123E4) = GREATER compare (~0.2718281828459045E1, ~0.123E2) = GREATER compareReal (~0.2718281828459045E1, ~0.123E2) = GREATER compare (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compareReal (~0.2718281828459045E1, ~0.3141592653589793E1) = GREATER compare (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compareReal (~0.2718281828459045E1, ~0.2718281828459045E1) = EQUAL compare (~0.2718281828459045E1, ~0.123E1) = LESS compareReal (~0.2718281828459045E1, ~0.123E1) = LESS compare (~0.2718281828459045E1, ~0.123) = LESS compareReal (~0.2718281828459045E1, ~0.123) = LESS compare (~0.2718281828459045E1, ~0.123E~2) = LESS compareReal (~0.2718281828459045E1, ~0.123E~2) = LESS compare (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compareReal (~0.2718281828459045E1, ~0.22250738585072014E~307) = LESS compare (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compareReal (~0.2718281828459045E1, ~0.11125369292536007E~307) = LESS compare (~0.2718281828459045E1, ~0.5E~323) = LESS compareReal (~0.2718281828459045E1, ~0.5E~323) = LESS compare (~0.2718281828459045E1, ~0.0) = LESS compareReal (~0.2718281828459045E1, ~0.0) = LESS compare (~0.123E1, 0.17976931348623157E309) = LESS compareReal (~0.123E1, 0.17976931348623157E309) = LESS compare (~0.123E1, 0.8988465674311579E308) = LESS compareReal (~0.123E1, 0.8988465674311579E308) = LESS compare (~0.123E1, 0.123E4) = LESS compareReal (~0.123E1, 0.123E4) = LESS compare (~0.123E1, 0.123E2) = LESS compareReal (~0.123E1, 0.123E2) = LESS compare (~0.123E1, 0.3141592653589793E1) = LESS compareReal (~0.123E1, 0.3141592653589793E1) = LESS compare (~0.123E1, 0.2718281828459045E1) = LESS compareReal (~0.123E1, 0.2718281828459045E1) = LESS compare (~0.123E1, 0.123E1) = LESS compareReal (~0.123E1, 0.123E1) = LESS compare (~0.123E1, 0.123) = LESS compareReal (~0.123E1, 0.123) = LESS compare (~0.123E1, 0.123E~2) = LESS compareReal (~0.123E1, 0.123E~2) = LESS compare (~0.123E1, 0.22250738585072014E~307) = LESS compareReal (~0.123E1, 0.22250738585072014E~307) = LESS compare (~0.123E1, 0.11125369292536007E~307) = LESS compareReal (~0.123E1, 0.11125369292536007E~307) = LESS compare (~0.123E1, 0.5E~323) = LESS compareReal (~0.123E1, 0.5E~323) = LESS compare (~0.123E1, 0.0) = LESS compareReal (~0.123E1, 0.0) = LESS compare (~0.123E1, ~0.17976931348623157E309) = GREATER compareReal (~0.123E1, ~0.17976931348623157E309) = GREATER compare (~0.123E1, ~0.8988465674311579E308) = GREATER compareReal (~0.123E1, ~0.8988465674311579E308) = GREATER compare (~0.123E1, ~0.123E4) = GREATER compareReal (~0.123E1, ~0.123E4) = GREATER compare (~0.123E1, ~0.123E2) = GREATER compareReal (~0.123E1, ~0.123E2) = GREATER compare (~0.123E1, ~0.3141592653589793E1) = GREATER compareReal (~0.123E1, ~0.3141592653589793E1) = GREATER compare (~0.123E1, ~0.2718281828459045E1) = GREATER compareReal (~0.123E1, ~0.2718281828459045E1) = GREATER compare (~0.123E1, ~0.123E1) = EQUAL compareReal (~0.123E1, ~0.123E1) = EQUAL compare (~0.123E1, ~0.123) = LESS compareReal (~0.123E1, ~0.123) = LESS compare (~0.123E1, ~0.123E~2) = LESS compareReal (~0.123E1, ~0.123E~2) = LESS compare (~0.123E1, ~0.22250738585072014E~307) = LESS compareReal (~0.123E1, ~0.22250738585072014E~307) = LESS compare (~0.123E1, ~0.11125369292536007E~307) = LESS compareReal (~0.123E1, ~0.11125369292536007E~307) = LESS compare (~0.123E1, ~0.5E~323) = LESS compareReal (~0.123E1, ~0.5E~323) = LESS compare (~0.123E1, ~0.0) = LESS compareReal (~0.123E1, ~0.0) = LESS compare (~0.123, 0.17976931348623157E309) = LESS compareReal (~0.123, 0.17976931348623157E309) = LESS compare (~0.123, 0.8988465674311579E308) = LESS compareReal (~0.123, 0.8988465674311579E308) = LESS compare (~0.123, 0.123E4) = LESS compareReal (~0.123, 0.123E4) = LESS compare (~0.123, 0.123E2) = LESS compareReal (~0.123, 0.123E2) = LESS compare (~0.123, 0.3141592653589793E1) = LESS compareReal (~0.123, 0.3141592653589793E1) = LESS compare (~0.123, 0.2718281828459045E1) = LESS compareReal (~0.123, 0.2718281828459045E1) = LESS compare (~0.123, 0.123E1) = LESS compareReal (~0.123, 0.123E1) = LESS compare (~0.123, 0.123) = LESS compareReal (~0.123, 0.123) = LESS compare (~0.123, 0.123E~2) = LESS compareReal (~0.123, 0.123E~2) = LESS compare (~0.123, 0.22250738585072014E~307) = LESS compareReal (~0.123, 0.22250738585072014E~307) = LESS compare (~0.123, 0.11125369292536007E~307) = LESS compareReal (~0.123, 0.11125369292536007E~307) = LESS compare (~0.123, 0.5E~323) = LESS compareReal (~0.123, 0.5E~323) = LESS compare (~0.123, 0.0) = LESS compareReal (~0.123, 0.0) = LESS compare (~0.123, ~0.17976931348623157E309) = GREATER compareReal (~0.123, ~0.17976931348623157E309) = GREATER compare (~0.123, ~0.8988465674311579E308) = GREATER compareReal (~0.123, ~0.8988465674311579E308) = GREATER compare (~0.123, ~0.123E4) = GREATER compareReal (~0.123, ~0.123E4) = GREATER compare (~0.123, ~0.123E2) = GREATER compareReal (~0.123, ~0.123E2) = GREATER compare (~0.123, ~0.3141592653589793E1) = GREATER compareReal (~0.123, ~0.3141592653589793E1) = GREATER compare (~0.123, ~0.2718281828459045E1) = GREATER compareReal (~0.123, ~0.2718281828459045E1) = GREATER compare (~0.123, ~0.123E1) = GREATER compareReal (~0.123, ~0.123E1) = GREATER compare (~0.123, ~0.123) = EQUAL compareReal (~0.123, ~0.123) = EQUAL compare (~0.123, ~0.123E~2) = LESS compareReal (~0.123, ~0.123E~2) = LESS compare (~0.123, ~0.22250738585072014E~307) = LESS compareReal (~0.123, ~0.22250738585072014E~307) = LESS compare (~0.123, ~0.11125369292536007E~307) = LESS compareReal (~0.123, ~0.11125369292536007E~307) = LESS compare (~0.123, ~0.5E~323) = LESS compareReal (~0.123, ~0.5E~323) = LESS compare (~0.123, ~0.0) = LESS compareReal (~0.123, ~0.0) = LESS compare (~0.123E~2, 0.17976931348623157E309) = LESS compareReal (~0.123E~2, 0.17976931348623157E309) = LESS compare (~0.123E~2, 0.8988465674311579E308) = LESS compareReal (~0.123E~2, 0.8988465674311579E308) = LESS compare (~0.123E~2, 0.123E4) = LESS compareReal (~0.123E~2, 0.123E4) = LESS compare (~0.123E~2, 0.123E2) = LESS compareReal (~0.123E~2, 0.123E2) = LESS compare (~0.123E~2, 0.3141592653589793E1) = LESS compareReal (~0.123E~2, 0.3141592653589793E1) = LESS compare (~0.123E~2, 0.2718281828459045E1) = LESS compareReal (~0.123E~2, 0.2718281828459045E1) = LESS compare (~0.123E~2, 0.123E1) = LESS compareReal (~0.123E~2, 0.123E1) = LESS compare (~0.123E~2, 0.123) = LESS compareReal (~0.123E~2, 0.123) = LESS compare (~0.123E~2, 0.123E~2) = LESS compareReal (~0.123E~2, 0.123E~2) = LESS compare (~0.123E~2, 0.22250738585072014E~307) = LESS compareReal (~0.123E~2, 0.22250738585072014E~307) = LESS compare (~0.123E~2, 0.11125369292536007E~307) = LESS compareReal (~0.123E~2, 0.11125369292536007E~307) = LESS compare (~0.123E~2, 0.5E~323) = LESS compareReal (~0.123E~2, 0.5E~323) = LESS compare (~0.123E~2, 0.0) = LESS compareReal (~0.123E~2, 0.0) = LESS compare (~0.123E~2, ~0.17976931348623157E309) = GREATER compareReal (~0.123E~2, ~0.17976931348623157E309) = GREATER compare (~0.123E~2, ~0.8988465674311579E308) = GREATER compareReal (~0.123E~2, ~0.8988465674311579E308) = GREATER compare (~0.123E~2, ~0.123E4) = GREATER compareReal (~0.123E~2, ~0.123E4) = GREATER compare (~0.123E~2, ~0.123E2) = GREATER compareReal (~0.123E~2, ~0.123E2) = GREATER compare (~0.123E~2, ~0.3141592653589793E1) = GREATER compareReal (~0.123E~2, ~0.3141592653589793E1) = GREATER compare (~0.123E~2, ~0.2718281828459045E1) = GREATER compareReal (~0.123E~2, ~0.2718281828459045E1) = GREATER compare (~0.123E~2, ~0.123E1) = GREATER compareReal (~0.123E~2, ~0.123E1) = GREATER compare (~0.123E~2, ~0.123) = GREATER compareReal (~0.123E~2, ~0.123) = GREATER compare (~0.123E~2, ~0.123E~2) = EQUAL compareReal (~0.123E~2, ~0.123E~2) = EQUAL compare (~0.123E~2, ~0.22250738585072014E~307) = LESS compareReal (~0.123E~2, ~0.22250738585072014E~307) = LESS compare (~0.123E~2, ~0.11125369292536007E~307) = LESS compareReal (~0.123E~2, ~0.11125369292536007E~307) = LESS compare (~0.123E~2, ~0.5E~323) = LESS compareReal (~0.123E~2, ~0.5E~323) = LESS compare (~0.123E~2, ~0.0) = LESS compareReal (~0.123E~2, ~0.0) = LESS compare (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compareReal (~0.22250738585072014E~307, 0.17976931348623157E309) = LESS compare (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compareReal (~0.22250738585072014E~307, 0.8988465674311579E308) = LESS compare (~0.22250738585072014E~307, 0.123E4) = LESS compareReal (~0.22250738585072014E~307, 0.123E4) = LESS compare (~0.22250738585072014E~307, 0.123E2) = LESS compareReal (~0.22250738585072014E~307, 0.123E2) = LESS compare (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compareReal (~0.22250738585072014E~307, 0.3141592653589793E1) = LESS compare (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compareReal (~0.22250738585072014E~307, 0.2718281828459045E1) = LESS compare (~0.22250738585072014E~307, 0.123E1) = LESS compareReal (~0.22250738585072014E~307, 0.123E1) = LESS compare (~0.22250738585072014E~307, 0.123) = LESS compareReal (~0.22250738585072014E~307, 0.123) = LESS compare (~0.22250738585072014E~307, 0.123E~2) = LESS compareReal (~0.22250738585072014E~307, 0.123E~2) = LESS compare (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compareReal (~0.22250738585072014E~307, 0.22250738585072014E~307) = LESS compare (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, 0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, 0.5E~323) = LESS compareReal (~0.22250738585072014E~307, 0.5E~323) = LESS compare (~0.22250738585072014E~307, 0.0) = LESS compareReal (~0.22250738585072014E~307, 0.0) = LESS compare (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.22250738585072014E~307, ~0.17976931348623157E309) = GREATER compare (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.22250738585072014E~307, ~0.8988465674311579E308) = GREATER compare (~0.22250738585072014E~307, ~0.123E4) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E4) = GREATER compare (~0.22250738585072014E~307, ~0.123E2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E2) = GREATER compare (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.3141592653589793E1) = GREATER compare (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.2718281828459045E1) = GREATER compare (~0.22250738585072014E~307, ~0.123E1) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E1) = GREATER compare (~0.22250738585072014E~307, ~0.123) = GREATER compareReal (~0.22250738585072014E~307, ~0.123) = GREATER compare (~0.22250738585072014E~307, ~0.123E~2) = GREATER compareReal (~0.22250738585072014E~307, ~0.123E~2) = GREATER compare (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compareReal (~0.22250738585072014E~307, ~0.22250738585072014E~307) = EQUAL compare (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compareReal (~0.22250738585072014E~307, ~0.11125369292536007E~307) = LESS compare (~0.22250738585072014E~307, ~0.5E~323) = LESS compareReal (~0.22250738585072014E~307, ~0.5E~323) = LESS compare (~0.22250738585072014E~307, ~0.0) = LESS compareReal (~0.22250738585072014E~307, ~0.0) = LESS compare (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compareReal (~0.11125369292536007E~307, 0.17976931348623157E309) = LESS compare (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compareReal (~0.11125369292536007E~307, 0.8988465674311579E308) = LESS compare (~0.11125369292536007E~307, 0.123E4) = LESS compareReal (~0.11125369292536007E~307, 0.123E4) = LESS compare (~0.11125369292536007E~307, 0.123E2) = LESS compareReal (~0.11125369292536007E~307, 0.123E2) = LESS compare (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compareReal (~0.11125369292536007E~307, 0.3141592653589793E1) = LESS compare (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compareReal (~0.11125369292536007E~307, 0.2718281828459045E1) = LESS compare (~0.11125369292536007E~307, 0.123E1) = LESS compareReal (~0.11125369292536007E~307, 0.123E1) = LESS compare (~0.11125369292536007E~307, 0.123) = LESS compareReal (~0.11125369292536007E~307, 0.123) = LESS compare (~0.11125369292536007E~307, 0.123E~2) = LESS compareReal (~0.11125369292536007E~307, 0.123E~2) = LESS compare (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compareReal (~0.11125369292536007E~307, 0.22250738585072014E~307) = LESS compare (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compareReal (~0.11125369292536007E~307, 0.11125369292536007E~307) = LESS compare (~0.11125369292536007E~307, 0.5E~323) = LESS compareReal (~0.11125369292536007E~307, 0.5E~323) = LESS compare (~0.11125369292536007E~307, 0.0) = LESS compareReal (~0.11125369292536007E~307, 0.0) = LESS compare (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compareReal (~0.11125369292536007E~307, ~0.17976931348623157E309) = GREATER compare (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compareReal (~0.11125369292536007E~307, ~0.8988465674311579E308) = GREATER compare (~0.11125369292536007E~307, ~0.123E4) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E4) = GREATER compare (~0.11125369292536007E~307, ~0.123E2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E2) = GREATER compare (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.3141592653589793E1) = GREATER compare (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.2718281828459045E1) = GREATER compare (~0.11125369292536007E~307, ~0.123E1) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E1) = GREATER compare (~0.11125369292536007E~307, ~0.123) = GREATER compareReal (~0.11125369292536007E~307, ~0.123) = GREATER compare (~0.11125369292536007E~307, ~0.123E~2) = GREATER compareReal (~0.11125369292536007E~307, ~0.123E~2) = GREATER compare (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compareReal (~0.11125369292536007E~307, ~0.22250738585072014E~307) = GREATER compare (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compareReal (~0.11125369292536007E~307, ~0.11125369292536007E~307) = EQUAL compare (~0.11125369292536007E~307, ~0.5E~323) = LESS compareReal (~0.11125369292536007E~307, ~0.5E~323) = LESS compare (~0.11125369292536007E~307, ~0.0) = LESS compareReal (~0.11125369292536007E~307, ~0.0) = LESS compare (~0.5E~323, 0.17976931348623157E309) = LESS compareReal (~0.5E~323, 0.17976931348623157E309) = LESS compare (~0.5E~323, 0.8988465674311579E308) = LESS compareReal (~0.5E~323, 0.8988465674311579E308) = LESS compare (~0.5E~323, 0.123E4) = LESS compareReal (~0.5E~323, 0.123E4) = LESS compare (~0.5E~323, 0.123E2) = LESS compareReal (~0.5E~323, 0.123E2) = LESS compare (~0.5E~323, 0.3141592653589793E1) = LESS compareReal (~0.5E~323, 0.3141592653589793E1) = LESS compare (~0.5E~323, 0.2718281828459045E1) = LESS compareReal (~0.5E~323, 0.2718281828459045E1) = LESS compare (~0.5E~323, 0.123E1) = LESS compareReal (~0.5E~323, 0.123E1) = LESS compare (~0.5E~323, 0.123) = LESS compareReal (~0.5E~323, 0.123) = LESS compare (~0.5E~323, 0.123E~2) = LESS compareReal (~0.5E~323, 0.123E~2) = LESS compare (~0.5E~323, 0.22250738585072014E~307) = LESS compareReal (~0.5E~323, 0.22250738585072014E~307) = LESS compare (~0.5E~323, 0.11125369292536007E~307) = LESS compareReal (~0.5E~323, 0.11125369292536007E~307) = LESS compare (~0.5E~323, 0.5E~323) = LESS compareReal (~0.5E~323, 0.5E~323) = LESS compare (~0.5E~323, 0.0) = LESS compareReal (~0.5E~323, 0.0) = LESS compare (~0.5E~323, ~0.17976931348623157E309) = GREATER compareReal (~0.5E~323, ~0.17976931348623157E309) = GREATER compare (~0.5E~323, ~0.8988465674311579E308) = GREATER compareReal (~0.5E~323, ~0.8988465674311579E308) = GREATER compare (~0.5E~323, ~0.123E4) = GREATER compareReal (~0.5E~323, ~0.123E4) = GREATER compare (~0.5E~323, ~0.123E2) = GREATER compareReal (~0.5E~323, ~0.123E2) = GREATER compare (~0.5E~323, ~0.3141592653589793E1) = GREATER compareReal (~0.5E~323, ~0.3141592653589793E1) = GREATER compare (~0.5E~323, ~0.2718281828459045E1) = GREATER compareReal (~0.5E~323, ~0.2718281828459045E1) = GREATER compare (~0.5E~323, ~0.123E1) = GREATER compareReal (~0.5E~323, ~0.123E1) = GREATER compare (~0.5E~323, ~0.123) = GREATER compareReal (~0.5E~323, ~0.123) = GREATER compare (~0.5E~323, ~0.123E~2) = GREATER compareReal (~0.5E~323, ~0.123E~2) = GREATER compare (~0.5E~323, ~0.22250738585072014E~307) = GREATER compareReal (~0.5E~323, ~0.22250738585072014E~307) = GREATER compare (~0.5E~323, ~0.11125369292536007E~307) = GREATER compareReal (~0.5E~323, ~0.11125369292536007E~307) = GREATER compare (~0.5E~323, ~0.5E~323) = EQUAL compareReal (~0.5E~323, ~0.5E~323) = EQUAL compare (~0.5E~323, ~0.0) = LESS compareReal (~0.5E~323, ~0.0) = LESS compare (~0.0, 0.17976931348623157E309) = LESS compareReal (~0.0, 0.17976931348623157E309) = LESS compare (~0.0, 0.8988465674311579E308) = LESS compareReal (~0.0, 0.8988465674311579E308) = LESS compare (~0.0, 0.123E4) = LESS compareReal (~0.0, 0.123E4) = LESS compare (~0.0, 0.123E2) = LESS compareReal (~0.0, 0.123E2) = LESS compare (~0.0, 0.3141592653589793E1) = LESS compareReal (~0.0, 0.3141592653589793E1) = LESS compare (~0.0, 0.2718281828459045E1) = LESS compareReal (~0.0, 0.2718281828459045E1) = LESS compare (~0.0, 0.123E1) = LESS compareReal (~0.0, 0.123E1) = LESS compare (~0.0, 0.123) = LESS compareReal (~0.0, 0.123) = LESS compare (~0.0, 0.123E~2) = LESS compareReal (~0.0, 0.123E~2) = LESS compare (~0.0, 0.22250738585072014E~307) = LESS compareReal (~0.0, 0.22250738585072014E~307) = LESS compare (~0.0, 0.11125369292536007E~307) = LESS compareReal (~0.0, 0.11125369292536007E~307) = LESS compare (~0.0, 0.5E~323) = LESS compareReal (~0.0, 0.5E~323) = LESS compare (~0.0, 0.0) = EQUAL compareReal (~0.0, 0.0) = EQUAL compare (~0.0, ~0.17976931348623157E309) = GREATER compareReal (~0.0, ~0.17976931348623157E309) = GREATER compare (~0.0, ~0.8988465674311579E308) = GREATER compareReal (~0.0, ~0.8988465674311579E308) = GREATER compare (~0.0, ~0.123E4) = GREATER compareReal (~0.0, ~0.123E4) = GREATER compare (~0.0, ~0.123E2) = GREATER compareReal (~0.0, ~0.123E2) = GREATER compare (~0.0, ~0.3141592653589793E1) = GREATER compareReal (~0.0, ~0.3141592653589793E1) = GREATER compare (~0.0, ~0.2718281828459045E1) = GREATER compareReal (~0.0, ~0.2718281828459045E1) = GREATER compare (~0.0, ~0.123E1) = GREATER compareReal (~0.0, ~0.123E1) = GREATER compare (~0.0, ~0.123) = GREATER compareReal (~0.0, ~0.123) = GREATER compare (~0.0, ~0.123E~2) = GREATER compareReal (~0.0, ~0.123E~2) = GREATER compare (~0.0, ~0.22250738585072014E~307) = GREATER compareReal (~0.0, ~0.22250738585072014E~307) = GREATER compare (~0.0, ~0.11125369292536007E~307) = GREATER compareReal (~0.0, ~0.11125369292536007E~307) = GREATER compare (~0.0, ~0.5E~323) = GREATER compareReal (~0.0, ~0.5E~323) = GREATER compare (~0.0, ~0.0) = EQUAL compareReal (~0.0, ~0.0) = EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20210117+dfsg/regression/redundant.1.ok000066400000000000000000000000151416264345000206600ustar00rootroot000000000000001 2 3 5 6 7 mlton-20210117+dfsg/regression/redundant.1.sml000066400000000000000000000015031416264345000210450ustar00rootroot00000000000000 datatype ilist = nill | cons of int * ilist fun f Xs = case Xs of nill => nill | cons( z, zs ) => let fun g( a, b, c, ds ) = case ds of nill => cons( c, nill ) | cons( e, es ) => case ( e < b ) of false => cons( c, ds ) | true => cons( e, case ( z < a ) of false => g( b, c, c, es ) | true => cons( c, nill ) ) in case zs of nill => Xs | cons( y, ys ) => g( z, z, z, f( g( z, z, y, ys ) ) ) end fun print_ilist( nill ) = print "\n" | print_ilist( cons( X, Xs ) ) = ( print (Int.toString X ^ " "); print_ilist Xs ) val Input = cons( 6, cons( 5, cons( 7, cons( 3, cons( 1, cons( 2, cons( 4, nill ) ) ) ) ) ) ) val _ = print_ilist( f Input ) mlton-20210117+dfsg/regression/ref-flatten.2.ok000066400000000000000000000000061416264345000211040ustar00rootroot0000000000000071 EC mlton-20210117+dfsg/regression/ref-flatten.2.sml000066400000000000000000000013771416264345000213020ustar00rootroot00000000000000datatype t = A of Word16.word ref * Word16.word ref * int list | B val a = Array.tabulate (100, fn i => let val l = [100 + i, 2, 3] in case i mod 2 of 0 => A (ref 0w13, ref 0w123, l) | 1 => B end) val _ = Array.app (fn B => () | A (r, r', l) => (r := !r + Word16.fromLarge (LargeWord.fromInt (hd l)) ; r' := !r' + !r)) a val A (w, w', _) = Array.sub (a, 0) val _ = print (concat [Word16.toString (!w), " ", Word16.toString (!w'), "\n"]) mlton-20210117+dfsg/regression/ref-flatten.3.ok000066400000000000000000000000041416264345000211030ustar00rootroot000000000000000 0 mlton-20210117+dfsg/regression/ref-flatten.3.sml000066400000000000000000000013531416264345000212750ustar00rootroot00000000000000(* * This example tests for a bug that was in refFlatten at one point. The idea * is to allocate a ref cell outside a loop, and then allocate a tuple containing * the ref cell at each iteration of the loop. At one point, refFlatten * mistakenly flattened the ref cell, which meant that it wasn't shared across * all the tuples allocated in the loop, as it should have been. *) fun loop i = if i = 0 then () else let val r = ref 13 val l = List.tabulate (10, fn i => (r, ref i)) val (r1, r2) = List.nth (l, 0) val () = r1 := !r2 val (r1, _) = List.nth (l, 1) val () = print (concat [Int.toString (!r1), "\n"]) in loop (i - 1) end val () = loop 2 mlton-20210117+dfsg/regression/ref-flatten.4.ok000066400000000000000000000000141416264345000211050ustar00rootroot00000000000000NONE SOME 9 mlton-20210117+dfsg/regression/ref-flatten.4.sml000066400000000000000000000024101416264345000212710ustar00rootroot00000000000000structure CList = struct datatype 'a clist' = Cons of 'a * 'a clist ref withtype 'a clist = 'a clist' option fun cnil () = NONE fun ccons (h, t) = SOME (Cons (h, ref t)) fun match cl nilCase consCase = case cl of NONE => nilCase () | SOME (Cons (h, t)) => consCase (h, !t) fun fromList l = case l of [] => cnil () | h::t => ccons (h, fromList t) fun repeat x = let val r = ref NONE val cl = SOME (Cons (x, r)) val () = r := cl in cl end local val max = 1000 fun length' (cl, n) = if n >= max then NONE else match cl (fn () => SOME n) (fn (_,t) => length' (t, n + 1)) in fun length cl = length' (cl, 0) end end val cl = CList.repeat #"x" val n = CList.length cl val () = case n of NONE => print "NONE\n" | SOME n => print (concat ["SOME ", Int.toString n, "\n"]) val cl = CList.fromList [1,2,3,4,5,6,7,8,9] val n = CList.length cl val () = case n of NONE => print "NONE\n" | SOME n => print (concat ["SOME ", Int.toString n, "\n"]) mlton-20210117+dfsg/regression/ref-flatten.5.ok000066400000000000000000000000031416264345000211040ustar00rootroot0000000000000059 mlton-20210117+dfsg/regression/ref-flatten.5.sml000066400000000000000000000012071416264345000212750ustar00rootroot00000000000000datatype t = A of int ref * int | B val n = 100 val a = Array.tabulate (n, fn i => case i mod 3 of 0 => B | 1 => A (ref 13, 14) | 2 => A (ref 15, 16)) datatype t = A' of int ref * int | B' val a' = Array.tabulate (n, fn i => case Array.sub (a, i) of B => B' | A (r, n) => A' (r, n + 1)) val _ = Array.app (fn A (r, n) => r := 17 + n + !r | B => ()) a val _ = case Array.sub (a', 1) of A' (r, n) => print (concat [Int.toString (!r + n), "\n"]) | B' => () mlton-20210117+dfsg/regression/ref-flatten.6.ok000066400000000000000000000000031416264345000211050ustar00rootroot00000000000000hi mlton-20210117+dfsg/regression/ref-flatten.6.sml000066400000000000000000000020021416264345000212700ustar00rootroot00000000000000datatype ('a, 'b) either = LEFT of 'a | RIGHT of 'b fun eval thunk = LEFT (thunk ()) handle e => RIGHT e datatype 'a status = LAZY of unit -> 'a promise | EAGER of ('a, exn) either withtype 'a promise = 'a status ref ref fun lazy exp = ref (ref (LAZY exp)) fun delay exp = lazy (fn () => ref (ref (EAGER (eval exp)))) fun force promise = case !(!promise) of EAGER (LEFT x) => x | EAGER (RIGHT x) => raise x | LAZY exp => let val promise' = exp () in (case !(!promise) of LAZY _ => (!promise := !(!promise') ; promise' := !promise) | _ => ()) ; force promise end exception Assertion fun check (b, e) = if b then () else raise e fun verify b = check (b, Assertion) val () = let val r = delay (fn () => (print "hi\n" ; 1)) val s = lazy (fn () => r) val t = lazy (fn () => s) in verify (1 = force t) ; verify (1 = force r) end mlton-20210117+dfsg/regression/ref-flatten.ok000066400000000000000000000000031416264345000207410ustar00rootroot0000000000000044 mlton-20210117+dfsg/regression/ref-flatten.sml000066400000000000000000000011241416264345000211300ustar00rootroot00000000000000datatype t = A of int ref * int | B val n = 100 val a = Array.tabulate (n, fn i => case i mod 3 of 0 => B | 1 => A (ref 13, 14) | 2 => A (ref 15, 16)) val a' = Array.tabulate (n, fn i => case Array.sub (a, i) of B => B | A (r, n) => A (r, n + 1)) val _ = Array.app (fn A (r, n) => r := 17 + n + !r | B => ()) a val _ = case Array.sub (a', 1) of A (r, _) => print (concat [Int.toString (!r), "\n"]) | B => () mlton-20210117+dfsg/regression/rem-unused.1.ok000066400000000000000000000000051416264345000207570ustar00rootroot00000000000000true mlton-20210117+dfsg/regression/rem-unused.1.sml000066400000000000000000000006101416264345000211430ustar00rootroot00000000000000datatype ttt = AAA | BBB of ttt vector val z = AAA val y = BBB (Vector.tabulate (1, fn _ => z)) (* val x = BBB (Vector.tabulate (1, fn _ => z)) *) (* val _ = print (concat [Bool.toString (y = x), "\n"]) *) val a : ttt vector = Vector.tabulate (0, fn _ => raise Fail "a") val b : ttt vector = Vector.tabulate (0, fn _ => raise Fail "b") val _ = print (concat [Bool.toString (a = b), "\n"]) mlton-20210117+dfsg/regression/ring.ok000066400000000000000000000000021416264345000174700ustar00rootroot000000000000002 mlton-20210117+dfsg/regression/ring.sml000066400000000000000000000042761416264345000176730ustar00rootroot00000000000000signature RING = sig type ring type elt val make : {zero : 'a, one : 'a, + : 'a * 'a -> 'a, * : 'a * 'a -> 'a} -> {ring : ring, valOf : elt -> 'a} val zero : ring -> elt val one : ring -> elt val ringOf : elt -> ring exception TypeError (* raised by * or + with bogus args *) val * : elt * elt -> elt val + : elt * elt -> elt end structure Ring : RING = struct datatype ring = Ring of unit -> {zero : elt, one : elt, + : elt * elt -> elt, * : elt * elt -> elt} and elt = Elt of unit -> {ring : ring} fun ringOf(Elt th) = #ring(th()) fun extract sel (Ring th) = sel(th()) val zero = extract #zero val one = extract #one local fun make sel (x,y) = extract sel (ringOf x) (x,y) in val op * = make(# * ) val op + = make(# +) end exception TypeError fun 'a make{zero, one, +, * = op *} = let val r : 'a option ref = ref NONE fun valOf(Elt th) = (th() ; case !r of NONE => raise TypeError | SOME x => (x before r := NONE)) fun ring() = {zero = elt zero, one = elt one, + = binary(op +), * = binary(op * )} and elt(x : 'a) = Elt(fn () => (r := SOME x ; {ring = Ring ring})) and binary (f : 'a * 'a -> 'a) (x : elt, y : elt) = elt(f(valOf x, valOf y)) in {ring = Ring ring, valOf = valOf} end end val {ring = ints, valOf} = Ring.make{zero = 0, one = 1, + = op +, * = op *} val _ = (print(Int.toString(valOf(Ring.+(Ring.one ints, Ring.one ints)))) ; print "\n") mlton-20210117+dfsg/regression/rlimit.ok000066400000000000000000000000051416264345000200340ustar00rootroot00000000000000true mlton-20210117+dfsg/regression/rlimit.sml000066400000000000000000000005531416264345000202260ustar00rootroot00000000000000open MLton.Rlimit val _ = List.app (fn r => set (r, get r) handle _ => ()) [cpuTime, coreFileSize, dataSize, fileSize, (*lockedInMemorySize,*) numFiles, (*numProcesses,*) (*residentSetSize,*) stackSize, virtualMemorySize] val _ = print (concat [Bool.toString ((RLim.castToSysWord infinity) >= 0wxFFFF), "\n"]) mlton-20210117+dfsg/regression/same-fringe.ok000066400000000000000000000000101416264345000207250ustar00rootroot00000000000000success mlton-20210117+dfsg/regression/same-fringe.sml000066400000000000000000000032311416264345000211170ustar00rootroot00000000000000structure Z = struct structure Thread = MLton.Thread fun generate(f: ('a -> unit) -> unit): unit -> 'a option = let val paused: 'a option Thread.t option ref = ref NONE val gen: unit Thread.t option ref = ref NONE fun return(a: 'a option): unit = Thread.switch(fn t' => let val _ = gen := SOME t' val t = valOf(!paused) val _ = paused := NONE in Thread.prepare (t, a) end) val _ = gen := SOME(Thread.new(fn () => (f (return o SOME) ; return NONE))) in fn () => Thread.switch(fn t => (paused := SOME t ; Thread.prepare (valOf(!gen), ()))) end datatype 'a tree = L of 'a | N of 'a tree * 'a tree fun foreach(t: 'a tree, f: 'a -> unit): unit = let val rec loop = fn L a => f a | N(l, r) => (loop l; loop r) in loop t end fun same(f: unit -> 'a option, g: unit -> 'a option, eq: 'a * 'a -> bool): bool = let fun loop() = case (f(), g()) of (NONE, NONE) => true | (SOME x, SOME y) => eq(x, y) andalso loop() | _ => false in loop() end fun fringe(t: 'a tree): unit -> 'a option = generate(fn f => foreach(t, f)) fun sameFringe(t1: 'a tree, t2: 'a tree, eq: 'a * 'a -> bool): bool = same(fringe t1, fringe t2, eq) val t1 = N(N(L 1, L 2), N(N(L 3, L 4), L 5)) val t2 = N(L 1, N(N(L 2, L 3), N(L 4, L 5))) val _ = if sameFringe(t1, t2, op =) then print "success\n" else print "failure\n" end mlton-20210117+dfsg/regression/scon.ok000066400000000000000000000000001416264345000174710ustar00rootroot00000000000000mlton-20210117+dfsg/regression/scon.sml000066400000000000000000000003111416264345000176600ustar00rootroot00000000000000(* scon *) (* Checks parsing of special constants. *) #"\^C"; #"\a"; #"\u0000"; #"\ \x\ \"; 3.2121212121212121212121212121; 2e3; 0.00000000000e123213213123213123123; 0wxabcd; 0xAaAa; mlton-20210117+dfsg/regression/semicolon.ok000066400000000000000000000000001416264345000205170ustar00rootroot00000000000000mlton-20210117+dfsg/regression/semicolon.sml000066400000000000000000000002321416264345000207100ustar00rootroot00000000000000(* semicolon.sml *) (* Checks parsing of semicolons. *) structure A = struct ;;;;;;;; end; signature S = sig ;;;;;;;;;;; end; ;;;;;;;;;;;;;;;; mlton-20210117+dfsg/regression/serialize.ok000066400000000000000000000000371416264345000205300ustar00rootroot00000000000000true 1 2 3 4 true true 13 15 mlton-20210117+dfsg/regression/serialize.sml000066400000000000000000000011751416264345000207160ustar00rootroot00000000000000open MLton val l = [1, 2, 3, 4] structure W = Word8 structure V = Word8Vector val r = ref 0 val t = (r, r) fun pv v = (V.app (fn w => (print(W.toString w); print " ")) v ; print "\n") fun pr s = (print s; print "\n") fun pi i = (print(Int.toString i); print " ") fun pl l = List.app pi l fun 'a ds(a: 'a): 'a = deserialize(serialize a) val pb = pr o Bool.toString val _ = (pb(serialize l = serialize l) ; pl(ds l) ; print "\n" ; pb(l = ds l) ; pb(let val t: int ref * int ref = ds t in #1 t = #2 t end) ; pi(ds (fn x => x) 13) ; pi(ds (fn x => x + 1) 14) ; print "\n") mlton-20210117+dfsg/regression/sharing.ok000066400000000000000000000000001416264345000201620ustar00rootroot00000000000000mlton-20210117+dfsg/regression/sharing.sml000066400000000000000000000031501416264345000203550ustar00rootroot00000000000000(* sharing.sml *) (* Checks treatment of sharing constraints. *) signature S = sig type t type s = t sharing type t = s end; signature T = (* from SML/NJ doc *) sig type s structure A : sig datatype d = D of s datatype t = K end sharing type s = A.t end; (* Check that multiple sharing equations is all pairs. *) signature S = sig structure T: sig end structure U: sig type t = int end sharing T = U end functor F (structure A: sig type t end structure B: sig end structure C: sig type t end sharing A = B = C) = struct val _: A.t -> C.t = fn x => x end functor F (structure A: sig type t end structure B: sig type u end structure C: sig type t end structure D: sig type u end sharing A = B = C = D) = struct val _: A.t -> C.t = fn x => x val _: B.u -> D.u = fn x => x end (* Check that sharing doesn't mistakenly share structures that only differ in * free flexible tycons. *) signature T = sig type t structure U: sig val x: t end end structure S: sig structure T1: T structure T2: T sharing T1.U = T2.U end = struct structure T1 = struct type t = int structure U = struct val x = 13 end end structure T2 = struct type t = real structure U = struct val x = 13.0 end end end ; mlton-20210117+dfsg/regression/signals.ok000066400000000000000000000002071416264345000202000ustar00rootroot00000000000000sending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20210117+dfsg/regression/signals.sml000066400000000000000000000022441416264345000203650ustar00rootroot00000000000000structure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = case fork () of NONE => let val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) fun loop' () = (sleep 1; loop' ()) in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20210117+dfsg/regression/signals2.ok000066400000000000000000017143531416264345000203010ustar00rootroot000000000000000 1 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 mlton-20210117+dfsg/regression/signals2.sml000066400000000000000000000030311416264345000204420ustar00rootroot00000000000000signature CRITICAL = sig val atomicBegin : unit -> unit val atomicEnd : unit -> unit val doAtomic : (unit -> unit) -> unit end structure Critical : CRITICAL = struct structure Thread = MLton.Thread val atomicBegin = Thread.atomicBegin val atomicEnd = Thread.atomicEnd fun doAtomic f = (atomicBegin (); f (); atomicEnd ()) end structure Main = struct structure Signal = MLton.Signal structure Itimer = MLton.Itimer val alrmHandler = fn t => t fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun setAlrmHandler h = Signal.setHandler (Itimer.signal Itimer.Real, h) fun print s = Critical.doAtomic (fn () => TextIO.print s) fun doit n = let val () = setAlrmHandler (Signal.Handler.handler alrmHandler) val () = setItimer (Time.fromMilliseconds 10) fun loop i = if i > n then OS.Process.exit OS.Process.success else let val i' = (Int.toString i) ^ "\n" fun loop' j = if j > i then () else (print i' ; loop' (j + 1)) in loop' 0 ; loop (i + 1) end in loop 0 end end val _ = Main.doit 500 mlton-20210117+dfsg/regression/signals3.ok000066400000000000000000000002071416264345000202630ustar00rootroot00000000000000sending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20210117+dfsg/regression/signals3.sml000066400000000000000000000022311416264345000204440ustar00rootroot00000000000000structure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = case fork () of NONE => let val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) fun loop' () = loop' () in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20210117+dfsg/regression/signals4.ok000066400000000000000000000002071416264345000202640ustar00rootroot00000000000000sending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20210117+dfsg/regression/signals4.sml000066400000000000000000000020721416264345000204500ustar00rootroot00000000000000structure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) val _ = case fork () of NONE => let fun loop' () = loop' () in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20210117+dfsg/regression/sigs.sml000066400000000000000000000007611416264345000176740ustar00rootroot00000000000000signature S = sig end functor f () = struct structure K : S = struct end end signature A = sig type t val a : t end signature B = sig type s structure A : A where type t= s val a : s end signature C = sig structure A : A structure B : B sharing type A.t = B.s = B.A.t end structure A = struct datatype t = A | B val a = A val b = B end structure A' = A : A structure A'' : A = A val test1 = A'.a = A''.amlton-20210117+dfsg/regression/size.ok000066400000000000000000000000241416264345000175070ustar00rootroot00000000000000size.???.ok missing mlton-20210117+dfsg/regression/size.rep32a4.ok000066400000000000000000000011131416264345000206660ustar00rootroot00000000000000The size of a char is = 0 bytes. The size of an int list of length 4 is = 48 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 52 bytes. The size of a double array of length 10 is = 92 bytes. The size of an array of length 10 of 2-ples of ints is = 92 bytes. The size of a useless function is = 0 bytes. The size of an int list option (SOME) is = 56 bytes. The size of an int list option (NONE) is = 0 bytes. The size of a continuation option ref is >= 4000 bytes and <= 6000 bytes. 13 The size of a continuation option ref is = 8 bytes. mlton-20210117+dfsg/regression/size.rep32a8.ok000066400000000000000000000011131416264345000206720ustar00rootroot00000000000000The size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of a useless function is = 0 bytes. The size of an int list option (SOME) is = 72 bytes. The size of an int list option (NONE) is = 0 bytes. The size of a continuation option ref is >= 4000 bytes and <= 6000 bytes. 13 The size of a continuation option ref is = 8 bytes. mlton-20210117+dfsg/regression/size.rep64a4.ok000066400000000000000000000011161416264345000206760ustar00rootroot00000000000000The size of a char is = 0 bytes. The size of an int list of length 4 is = 80 bytes. The size of a string of length 10 is = 36 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of a useless function is = 0 bytes. The size of an int list option (SOME) is = 96 bytes. The size of an int list option (NONE) is = 0 bytes. The size of a continuation option ref is >= 4000 bytes and <= 6000 bytes. 13 The size of a continuation option ref is = 16 bytes. mlton-20210117+dfsg/regression/size.rep64a8.ok000066400000000000000000000011171416264345000207030ustar00rootroot00000000000000The size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of a useless function is = 0 bytes. The size of an int list option (SOME) is = 112 bytes. The size of an int list option (NONE) is = 0 bytes. The size of a continuation option ref is >= 4000 bytes and <= 6000 bytes. 13 The size of a continuation option ref is = 16 bytes. mlton-20210117+dfsg/regression/size.sml000066400000000000000000000062361416264345000177040ustar00rootroot00000000000000fun 'a printSize (name: string, min_max: (IntInf.int * IntInf.int) option, value: 'a, use: 'a -> unit): unit = (print "The size of " ; print name ; print " is" ; let val size = MLton.size value in case min_max of NONE => (print " = " ; print (IntInf.toString size) ; print " bytes.\n") | SOME (min, max) => if min <= size andalso size <= max then (print " >= " ; print (IntInf.toString min) ; print " bytes and <= " ; print (IntInf.toString max) ; print " bytes.\n") else (print " = " ; print (IntInf.toString size) ; print " bytes.\n") end ; use value) fun chk (x, y) = if x = y then () else raise Fail "bug" val l = [1, 2, 3, 4] val _ = (printSize ("a char", NONE, #"c", fn _ => ()) ; printSize ("an int list of length 4", NONE, List.tabulate (4, fn i => i + 1), fn l => chk (foldl (op +) 0 l, 10)) ; printSize ("a string of length 10", NONE, CharVector.tabulate (10, fn i => chr (ord #"0" + i)), fn s => chk (CharVector.foldl (fn (c,s) => ord c + s) 0 s, 525)) ; printSize ("an int array of length 10", NONE, Array.tabulate (10, fn i => i), fn a => chk (Array.foldl (op +) 0 a, 45)) ; printSize ("a double array of length 10", NONE, Array.tabulate (10, real), fn a => chk (Real.floor (Array.foldl (op +) 0.0 a), 45)) ; printSize ("an array of length 10 of 2-ples of ints", NONE, Array.tabulate (10, fn i => (i, i + 1)), fn a => chk (Array.foldl (fn ((a,b),s) => a + b + s) 0 a, 100)) ; printSize ("a useless function", NONE, fn _ => 13, fn f => ()) ; let val l = List.tabulate (8, fn i => if i mod 2 = 1 then NONE else SOME (List.tabulate (i, fn i => i + 1))) in () ; printSize ("an int list option (SOME)", NONE, List.nth (l, 4), fn lo => chk (case lo of NONE => 0 | SOME l => foldl (op +) 0 l, 10)) ; printSize ("an int list option (NONE)", NONE, List.nth (l, 5), fn lo => chk (case lo of NONE => 0 | SOME l => foldl (op +) 0 l, 0)) end) local open MLton.Cont in val rc: int option t option ref = ref NONE val _ = case callcc (fn k: int option t => (rc := SOME k; throw (k, NONE))) of NONE => () | SOME i => print (concat [Int.toString i, "\n"]) end val _ = printSize ("a continuation option ref", case !rc of NONE => NONE | SOME _ => SOME (4000, 6000), rc, fn rc => case !rc of NONE => () | SOME k => (rc := NONE; MLton.Cont.throw (k, SOME 13))) mlton-20210117+dfsg/regression/slow.ok000066400000000000000000000000071416264345000175220ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/slow.sml000066400000000000000000000003161416264345000177070ustar00rootroot00000000000000fun loop (left: IntInf.int): unit = case IntInf.compare (left, 0) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20210117+dfsg/regression/slow2.ok000066400000000000000000000000071416264345000176040ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/slow2.sml000066400000000000000000000002361416264345000177720ustar00rootroot00000000000000fun loop (left: IntInf.int): unit = if left = 0 then () else loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20210117+dfsg/regression/slower.ok000066400000000000000000000000071416264345000200510ustar00rootroot00000000000000All ok mlton-20210117+dfsg/regression/slower.sml000066400000000000000000000003301416264345000202320ustar00rootroot00000000000000fun loop (left: IntInf.int): unit = case IntInf.compare (left, 4294967296) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 4304967296 val _ = print "All ok\n" mlton-20210117+dfsg/regression/smith-normal-form.ok000066400000000000000000000163271416264345000221250ustar00rootroot00000000000000 8 ~3 1 3 6 9 ~2 4 ~9 ~9 2 3 8 ~1 3 ~5 4 ~3 ~5 ~6 8 1 4 ~5 7 ~4 ~4 ~7 7 1 4 ~3 0 8 ~6 ~2 ~3 4 5 ~2 7 ~7 ~6 ~7 ~3 ~4 9 7 ~3 3 0 3 3 ~8 ~8 2 3 8 3 ~2 ~4 3 ~6 ~6 0 ~5 8 ~9 2 4 2 7 ~4 9 ~3 6 ~2 3 ~3 0 ~9 5 8 ~1 2 ~8 3 4 ~6 5 ~6 ~5 ~8 0 ~5 3 5 4 7 2 3 ~9 7 ~7 3 ~8 7 5 5 ~2 ~6 ~3 6 5 3 ~1 ~1 4 5 ~5 5 9 9 3 8 ~3 ~1 9 2 9 9 3 ~4 0 9 2 5 3 ~5 ~3 ~1 1 8 ~6 2 ~4 ~8 ~7 ~8 4 5 8 ~1 ~1 7 2 5 5 ~4 ~7 5 5 1 ~7 3 ~5 4 9 3 4 4 ~5 7 ~1 7 4 ~7 7 ~7 ~2 9 ~9 0 ~4 ~4 0 2 6 3 ~1 6 6 7 1 2 7 6 5 ~6 ~3 ~4 ~8 0 9 6 1 2 ~5 4 4 4 ~6 ~7 ~9 ~6 2 ~4 5 ~2 1 0 1 ~8 7 6 2 ~1 ~8 4 ~7 7 ~3 ~2 ~5 3 0 3 ~9 3 3 9 ~1 4 8 ~9 6 ~5 9 5 ~1 ~1 ~9 7 ~2 3 9 0 ~6 ~3 ~7 ~1 5 ~2 8 ~5 ~3 ~8 7 ~2 ~2 0 ~8 4 8 9 ~5 ~4 ~8 ~1 7 1 1 6 ~9 ~4 0 8 4 ~4 9 6 ~3 ~2 ~6 ~3 4 8 ~8 1 ~5 9 7 9 7 ~9 ~6 6 1 ~3 3 ~3 ~7 1 7 ~7 0 ~2 7 ~4 ~6 6 7 ~5 ~9 6 1 8 4 ~2 7 ~7 ~1 ~9 1 ~6 ~5 4 9 6 0 ~8 ~3 1 ~3 8 ~3 2 9 ~3 ~9 ~1 ~3 1 7 ~8 ~9 ~7 ~3 8 9 ~7 ~1 ~7 4 0 0 1 ~5 9 ~8 ~1 ~2 3 5 9 ~9 5 4 ~9 1 ~4 ~2 3 ~4 ~5 ~4 ~4 9 2 7 ~2 6 7 2 ~9 4 2 7 8 ~9 2 5 3 9 6 3 0 ~7 ~6 ~7 6 ~2 9 ~3 ~6 9 5 ~7 8 ~4 8 8 ~4 ~9 6 0 ~3 6 0 8 8 ~6 ~2 5 4 ~1 ~8 1 ~3 ~1 2 3 ~9 ~9 ~5 1 8 ~5 7 ~5 ~1 5 ~2 7 0 ~7 ~1 8 8 ~3 9 ~5 7 ~8 ~8 ~4 3 2 ~1 8 ~2 1 2 5 0 ~6 7 3 3 7 ~4 ~2 3 ~3 ~1 2 ~2 ~1 ~9 ~5 1 0 0 2 9 ~3 ~9 2 9 3 8 ~3 4 8 8 3 ~3 ~1 ~4 4 ~6 ~9 5 1 4 ~3 ~1 ~9 5 ~8 ~8 6 1 1 ~2 7 5 6 ~4 2 ~7 0 ~7 ~3 ~5 9 3 4 ~6 8 ~4 3 6 0 2 ~6 ~1 8 4 ~3 ~1 ~6 ~2 ~8 ~2 ~1 ~1 ~5 ~9 ~8 9 ~9 5 1 9 ~1 ~6 9 ~7 2 8 ~7 4 ~9 7 6 ~2 9 ~9 ~6 1 ~8 8 4 ~6 8 1 ~3 ~7 8 ~5 2 ~8 1 3 ~2 6 6 6 1 0 0 ~7 7 ~3 ~3 0 ~4 ~7 ~4 4 1 ~1 ~3 ~8 3 7 9 8 3 0 4 4 ~1 ~5 4 2 2 0 6 ~6 2 ~9 8 ~9 3 ~2 2 6 6 ~5 8 6 1 ~6 ~6 6 1 1 ~3 ~9 ~6 2 ~7 2 ~1 6 ~6 0 2 ~7 8 ~8 4 9 ~3 9 ~7 ~9 ~6 ~4 ~4 ~4 ~7 ~2 2 ~4 ~2 6 ~3 ~1 ~4 0 ~5 9 7 ~6 ~9 7 ~9 ~6 2 ~3 1 5 ~9 4 ~5 4 ~9 1 ~2 ~2 4 ~9 6 6 ~5 ~1 ~7 4 ~9 4 ~1 6 ~4 7 2 8 7 3 1 ~7 7 7 9 8 ~9 7 2 1 2 ~8 4 5 6 4 ~3 8 0 ~2 ~2 2 ~3 8 3 1 ~8 ~5 ~2 5 6 8 0 ~3 4 ~2 4 ~9 ~5 7 6 ~4 ~7 2 4 ~3 ~8 ~8 ~8 6 ~2 ~6 8 ~3 3 ~1 ~7 1 9 1 7 ~6 8 ~2 ~9 ~1 3 ~4 7 8 ~1 9 ~9 6 ~3 5 0 2 5 5 ~2 3 0 ~9 ~8 ~6 1 8 0 1 2 ~8 ~2 0 ~9 ~8 0 5 ~3 ~4 5 6 ~2 ~5 0 ~9 9 ~9 ~5 9 9 ~4 5 ~5 7 8 9 7 ~3 1 9 ~7 ~1 8 ~5 ~1 2 ~8 1 0 9 ~8 ~1 6 ~1 9 ~8 7 4 ~8 7 0 ~6 7 0 ~9 6 8 2 2 5 ~6 ~6 9 ~5 9 2 2 ~8 0 ~6 ~9 ~6 ~4 ~9 8 ~2 9 7 ~5 ~1 7 2 ~7 7 8 ~7 ~9 ~6 9 ~7 ~7 6 ~8 9 5 ~4 1 ~7 ~8 ~6 ~3 8 ~8 1 ~8 6 9 ~3 ~7 7 1 6 1 0 8 ~5 ~3 ~2 8 1 ~1 ~1 ~4 3 7 ~2 ~9 9 ~8 ~9 6 ~4 7 ~1 ~5 ~3 ~9 0 ~3 0 7 9 1 ~2 7 ~9 ~6 3 ~9 ~9 ~2 ~9 ~9 9 6 6 7 5 ~1 ~2 1 5 2 ~3 ~4 1 ~6 0 ~3 ~9 ~1 7 0 ~9 5 ~2 ~2 5 3 4 7 7 8 7 6 1 ~2 5 ~6 9 4 8 5 0 ~4 ~2 ~2 ~5 ~2 ~6 9 ~8 ~2 ~5 ~9 3 ~6 ~3 ~4 ~5 ~2 6 dd: pos = 0 dd: pos = 1 dd: pos = 2 dd: pos = 3 dd: pos = 4 dd: pos = 5 dd: pos = 6 dd: pos = 7 dd: pos = 8 dd: pos = 9 dd: pos = 10 dd: pos = 11 dd: pos = 12 dd: pos = 13 dd: pos = 14 dd: pos = 15 dd: pos = 16 dd: pos = 17 dd: pos = 18 dd: pos = 19 dd: pos = 20 dd: pos = 21 dd: pos = 22 dd: pos = 23 dd: pos = 24 dd: pos = 25 dd: pos = 26 dd: pos = 27 dd: pos = 28 dd: pos = 29 dd: pos = 30 dd: pos = 31 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~8074709755269798283190497453463562613129 mlton-20210117+dfsg/regression/smith-normal-form.sml000066400000000000000000000627661416264345000223170ustar00rootroot00000000000000signature MATRIX = sig type 'entry matrix val make: int * int * (int * int -> 'entry) -> 'entry matrix val height: 'entry matrix -> int val width: 'entry matrix -> int val fetch: 'entry matrix * int * int -> 'entry val fetchRow: 'entry matrix * int -> int -> 'entry val fetchCol: 'entry matrix * int -> int -> 'entry val store: 'entry matrix * int * int * 'entry -> unit val storeRow: 'entry matrix * int -> int * 'entry -> unit val storeCol: 'entry matrix * int -> int * 'entry -> unit val rowSwap: 'entry matrix * int * int -> unit val colSwap: 'entry matrix * int * int -> unit val rowOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val colOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val copy: 'entry matrix -> 'entry matrix val map: 'entry1 matrix * ('entry1 -> 'entry2) -> 'entry2 matrix val toString: 'entry matrix * ('entry -> string) -> string end structure Matrix:> MATRIX = struct type 'entry matrix = int * int * 'entry array exception sizeError exception index exception foldError fun make (height: int, width: int, generator: int * int -> 'entry) : 'entry matrix = if height < 0 orelse width < 0 then raise sizeError else (height, width, Array.tabulate (height*width, fn z => generator (z div width, z mod width))) fun height (height, _, _) = height fun width (width, _, _) = width fun fetch ((height, width, mat), row, col) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.sub (mat, col + width*row) else raise index fun fetchRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn col => if 0 <= col andalso col < width then Array.sub (mat, col + offset) else raise index end else raise index fun fetchCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn row => if 0 <= row andalso row < height then Array.sub (mat, col + width*row) else raise index else raise index fun store ((height, width, mat), row, col, entry) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.update (mat, col + width*row, entry) else raise index fun storeRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn (col, entry) => if 0 <= col andalso col < width then Array.update (mat, col + offset, entry) else raise index end else raise index fun storeCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn (row, entry) => if 0 <= row andalso row < height then Array.update (mat, col + width*row, entry) else raise index else raise index fun swapLoop (from1: int -> 'entry, to1: int * 'entry -> unit, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int): unit = let fun loop (i: int): unit = if i = limit then () else let val tmp = from1 i in to1 (i, from2 i); to2 (i, tmp); loop (i + 1) end in loop 0 end fun rowSwap (mat as (height, width, _), row1, row2): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height then if row1 = row2 then () else swapLoop (fetchRow (mat, row1), storeRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width) else raise index fun colSwap (mat as (height, width, _), col1, col2): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width then if col1 = col2 then () else swapLoop (fetchCol (mat, col1), storeCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height) else raise index fun opLoop (from1: int -> 'entry, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int, f: 'entry * 'entry -> 'entry): unit = let fun loop (i: int): unit = if i = limit then () else ( to2 (i, f (from1 i, from2 i)); loop (i + 1)) in loop 0 end fun rowOp (mat as (height, width, _), row1, row2, f: 'entry * 'entry -> 'entry): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height andalso row1 <> row2 then opLoop (fetchRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width, f) else raise index fun colOp (mat as (height, width, _), col1, col2, f: 'entry * 'entry -> 'entry): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width andalso col1 <> col2 then opLoop (fetchCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height, f) else raise index fun copy ((height, width, mat)) = (height, width, Array.tabulate (Array.length mat, fn i => Array.sub (mat, i))) fun map ((height, width, mat: 'entry1 Array.array), f: 'entry1 -> 'entry2) : 'entry2 matrix = (height, width, Array.tabulate (Array.length mat, fn i => f (Array.sub (mat, i)))) (* Natural fold a range of integers in reverse. *) fun naturalFold (limit: int, state: 'state, folder: int * 'state -> 'state): 'state = let fun loop (i: int, state: 'state) = if i = 0 then state else loop (i - 1, folder (i - 1, state)) in if limit < 0 then raise foldError else loop (limit, state) end local val blank8 = Byte.charToByte #" " fun makeBlanks size = let val blanks = Word8Vector.tabulate (size, fn _ => blank8) in Byte.bytesToString blanks end in fun toString (mat: 'entry matrix, f: 'entry -> string): string = let val mat as (height, width, _) = map (mat, f) fun maxSize from (i, width) = Int.max (String.size (from i), width) fun colWidth col = naturalFold (height, 0, maxSize (fetchCol (mat, col))) val widths = Vector.tabulate (width, colWidth) fun doRow (row: int, ac: string list): string list = let val from = fetchRow (mat, row) fun loop (col: int, ac: string list) = let val next = from col val ac = next::ac val s = String.size next val pad = Vector.sub (widths, col) - s val ac = if pad <= 0 then ac else (makeBlanks pad)::ac in if col = 0 then ac else loop (col - 1, " "::ac) end val ac = "\n"::ac in if width = 0 then ac else loop (width - 1, ac) end val pieces = naturalFold (height, [], doRow) in String.concat pieces end end end val zero = IntInf.fromInt 0 fun smaller (a: IntInf.int, b: IntInf.int): bool = (not (a = zero)) andalso (b = zero orelse IntInf.< (IntInf.abs a , IntInf.abs b)) fun smithNormalForm (mat: IntInf.int Matrix.matrix): IntInf.int Matrix.matrix = let val height = Matrix.height mat val width = Matrix.width mat val mat = Matrix.copy mat val range = Int.min (width, height) fun dd pos = let val matCol = Matrix.fetchCol (mat, pos) val matRow = Matrix.fetchRow (mat, pos) val _ = print ("dd: pos = " ^ (Int.toString pos) ^ "\n") fun swapRowLoop (best, bestRow, bestCol, row) = if row >= height then (Matrix.rowSwap (mat, pos, bestRow); Matrix.colSwap (mat, pos, bestCol)) else let val matRow = Matrix.fetchRow (mat, row) fun swapColLoop (best, bestRow, bestCol, col) = if col >= width then swapRowLoop (best, bestRow, bestCol, row + 1) else let val next = matRow col in if smaller (next, best) then swapColLoop (next, row, col, col + 1) else swapColLoop (best, bestRow, bestCol, col + 1) end in swapColLoop (best, bestRow, bestCol, pos) end fun rowLoop row = if row < height then if (matCol row) = zero then rowLoop (row + 1) else (Matrix.rowOp (mat, pos, row, let val x = IntInf.~ (IntInf.quot(matCol row, matCol pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matCol row) = zero then rowLoop (row + 1) else hitPosAgain ()) else let fun colLoop col = if col < width then if (matRow col) = zero then colLoop (col + 1) else (Matrix.colOp (mat, pos, col, let val x = IntInf.~ (IntInf.quot (matRow col, matRow pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matRow col) = zero then colLoop (col + 1) else hitPosAgain ()) else () in colLoop (pos + 1) end and hitPosAgain () = (swapRowLoop (zero, pos, pos, pos); rowLoop (pos + 1)) in hitPosAgain () end fun loop pos = if pos = range then mat else (dd pos; loop (pos + 1)) in loop 0 end val table = [[ 8, ~3, 1, 3, 6, 9, ~2, 4, ~9, ~9, 2, 3, 8, ~1, 3, ~5, 4, ~3, ~5, ~6, 8, 1, 4, ~5, 7, ~4, ~4, ~7, 7, 1, 4, ~3, 8, 4, ~4, ~8, 5, ~9, 3, ~4, 1, 9, ~8, ~6, ~2, 8, ~9, ~5, ~3, ~3], [ 0, 8, ~6, ~2, ~3, 4, 5, ~2, 7, ~7, ~6, ~7, ~3, ~4, 9, 7, ~3, 3, 0, 3, 3, ~8, ~8, 2, 3, 8, 3, ~2, ~4, 3, ~6, ~6, ~2, 6, 5, ~1, ~3, 1, 8, ~8, 2, 1, ~7, ~7, ~7, ~3, ~6, 6, ~4, ~9], [ 0, ~5, 8, ~9, 2, 4, 2, 7, ~4, 9, ~3, 6, ~2, 3, ~3, 0, ~9, 5, 8, ~1, 2, ~8, 3, 4, ~6, 5, ~6, ~5, ~8, 0, ~5, 3, ~2, ~5, 8, 7, ~1, 1, ~1, 7, 6, 3, 6, 5, 6, 8, 7, 9, 7, ~3], [ 5, 4, 7, 2, 3, ~9, 7, ~7, 3, ~8, 7, 5, 5, ~2, ~6, ~3, 6, 5, 3, ~1, ~1, 4, 5, ~5, 5, 9, 9, 3, 8, ~3, ~1, 9, ~9, 6, ~7, 7, 4, 6, ~8, ~9, 0, ~3, ~2, ~7, 1, ~2, ~6, 7, 7, 7], [ 2, 9, 9, 3, ~4, 0, 9, 2, 5, 3, ~5, ~3, ~1, 1, 8, ~6, 2, ~4, ~8, ~7, ~8, 4, 5, 8, ~1, ~1, 7, 2, 5, 5, ~4, ~7, ~3, ~7, 6, ~4, ~5, ~8, ~5, ~9, ~8, 5, ~5, ~5, 0, 8, 8, 6, 4, ~1], [ 5, 5, 1, ~7, 3, ~5, 4, 9, 3, 4, 4, ~5, 7, ~1, 7, 4, ~7, 7, ~7, ~2, 9, ~9, 0, ~4, ~4, 0, 2, 6, 3, ~1, 6, 6, 8, ~6, ~4, ~9, 3, ~2, ~5, 5, ~3, 2, ~1, ~6, 9, 3, ~3, ~8, ~9, 7], [ 7, 1, 2, 7, 6, 5, ~6, ~3, ~4, ~8, 0, 9, 6, 1, 2, ~5, 4, 4, 4, ~6, ~7, ~9, ~6, 2, ~4, 5, ~2, 1, 0, 1, ~8, 7, ~7, ~5, 4, 1, ~5, 4, ~4, ~2, ~3, 1, 1, 3, 4, ~4, ~5, 9, 8, ~2], [ 6, 2, ~1, ~8, 4, ~7, 7, ~3, ~2, ~5, 3, 0, 3, ~9, 3, 3, 9, ~1, 4, 8, ~9, 6, ~5, 9, 5, ~1, ~1, ~9, 7, ~2, 3, 9, 8, 9, 2, 7, 7, 6, ~1, ~1, ~2, ~2, ~7, 3, ~6, 0, ~9, 4, 3, 7], [ 0, ~6, ~3, ~7, ~1, 5, ~2, 8, ~5, ~3, ~8, 7, ~2, ~2, 0, ~8, 4, 8, 9, ~5, ~4, ~8, ~1, 7, 1, 1, 6, ~9, ~4, 0, 8, 4, 3, ~7, 6, 0, 1, 8, 6, ~1, ~1, ~7, 9, ~9, ~5, ~2, ~2, ~1, 1, 0], [~4, 9, 6, ~3, ~2, ~6, ~3, 4, 8, ~8, 1, ~5, 9, 7, 9, 7, ~9, ~6, 6, 1, ~3, 3, ~3, ~7, 1, 7, ~7, 0, ~2, 7, ~4, ~6, 0, 1, ~3, ~5, ~9, ~7, 8, 4, 9, ~8, ~8, ~7, ~6, 7, 6, ~3, ~8, 5], [ 6, 7, ~5, ~9, 6, 1, 8, 4, ~2, 7, ~7, ~1, ~9, 1, ~6, ~5, 4, 9, 6, 0, ~8, ~3, 1, ~3, 8, ~3, 2, 9, ~3, ~9, ~1, ~3, 4, 3, 2, ~9, ~5, ~3, 8, ~4, 8, 5, ~4, 7, 6, ~8, 7, 6, ~5, 5], [ 1, 7, ~8, ~9, ~7, ~3, 8, 9, ~7, ~1, ~7, 4, 0, 0, 1, ~5, 9, ~8, ~1, ~2, 3, 5, 9, ~9, 5, 4, ~9, 1, ~4, ~2, 3, ~4, 8, ~6, ~4, ~8, ~5, ~5, 4, ~2, ~4, ~1, ~9, ~5, 2, ~9, 2, ~9, ~2, ~3], [~5, ~4, ~4, 9, 2, 7, ~2, 6, 7, 2, ~9, 4, 2, 7, 8, ~9, 2, 5, 3, 9, 6, 3, 0, ~7, ~6, ~7, 6, ~2, 9, ~3, ~6, 9, ~9, 2, 2, ~6, ~1, 4, ~3, 3, 0, 6, ~3, 4, 9, 9, ~6, 5, 5, ~5], [ 5, ~7, 8, ~4, 8, 8, ~4, ~9, 6, 0, ~3, 6, 0, 8, 8, ~6, ~2, 5, 4, ~1, ~8, 1, ~3, ~1, 2, 3, ~9, ~9, ~5, 1, 8, ~5, ~3, 0, ~4, ~9, 0, ~6, 3, ~1, ~7, 0, 8, 9, ~6, ~1, ~9, 1, ~6, 2], [ 7, ~5, ~1, 5, ~2, 7, 0, ~7, ~1, 8, 8, ~3, 9, ~5, 7, ~8, ~8, ~4, 3, 2, ~1, 8, ~2, 1, 2, 5, 0, ~6, 7, 3, 3, 7, ~5, 5, ~1, 1, 0, ~8, 1, 0, 0, ~4, 6, 9, ~5, ~6, 3, ~5, 8, 5], [~4, ~2, 3, ~3, ~1, 2, ~2, ~1, ~9, ~5, 1, 0, 0, 2, 9, ~3, ~9, 2, 9, 3, 8, ~3, 4, 8, 8, 3, ~3, ~1, ~4, 4, ~6, ~9, 5, ~2, 1, 3, ~7, ~5, ~6, ~5, ~8, 4, ~8, ~3, 5, 0, 7, ~9, 6, 2], [ 5, 1, 4, ~3, ~1, ~9, 5, ~8, ~8, 6, 1, 1, ~2, 7, 5, 6, ~4, 2, ~7, 0, ~7, ~3, ~5, 9, 3, 4, ~6, 8, ~4, 3, 6, 0, 2, 3, ~6, 3, 9, 4, 1, ~4, 6, ~5, ~7, 0, ~1, ~8, ~3, ~9, 9, 7], [ 2, ~6, ~1, 8, 4, ~3, ~1, ~6, ~2, ~8, ~2, ~1, ~1, ~5, ~9, ~8, 9, ~9, 5, 1, 9, ~1, ~6, 9, ~7, 2, 8, ~7, 4, ~9, 7, 6, ~2, 1, ~2, ~7, 8, 0, 5, 0, ~5, ~7, ~6, 0, 4, 0, 3, ~8, 5, 4], [~2, 9, ~9, ~6, 1, ~8, 8, 4, ~6, 8, 1, ~3, ~7, 8, ~5, 2, ~8, 1, 3, ~2, 6, 6, 6, 1, 0, 0, ~7, 7, ~3, ~3, 0, ~4, 3, ~7, ~6, 7, 5, 9, ~5, 7, ~8, 2, 3, ~8, ~7, 6, ~5, ~5, ~8, ~9], [~7, ~4, 4, 1, ~1, ~3, ~8, 3, 7, 9, 8, 3, 0, 4, 4, ~1, ~5, 4, 2, 2, 0, 6, ~6, 2, ~9, 8, ~9, 3, ~2, 2, 6, 6, 1, 7, 1, 0, ~8, 2, 3, ~3, 8, 9, 5, 5, ~6, 4, ~7, ~4, ~2, ~3], [~5, 8, 6, 1, ~6, ~6, 6, 1, 1, ~3, ~9, ~6, 2, ~7, 2, ~1, 6, ~6, 0, 2, ~7, 8, ~8, 4, 9, ~3, 9, ~7, ~9, ~6, ~4, ~4, ~5, 8, 2, ~5, ~4, ~3, 5, 2, 1, ~3, ~3, ~7, ~9, 3, 7, ~7, 3, ~8], [~4, ~7, ~2, 2, ~4, ~2, 6, ~3, ~1, ~4, 0, ~5, 9, 7, ~6, ~9, 7, ~9, ~6, 2, ~3, 1, 5, ~9, 4, ~5, 4, ~9, 1, ~2, ~2, 4, 0, 4, ~8, ~8, 3, ~1, ~5, ~4, ~9, ~7, 7, 6, 3, ~9, 6, 4, ~4, ~7], [~9, 6, 6, ~5, ~1, ~7, 4, ~9, 4, ~1, 6, ~4, 7, 2, 8, 7, 3, 1, ~7, 7, 7, 9, 8, ~9, 7, 2, 1, 2, ~8, 4, 5, 6, 7, 2, ~7, 6, 8, 4, ~9, 7, ~5, 6, 9, ~1, 9, 2, 0, 9, 3, 6], [ 4, ~3, 8, 0, ~2, ~2, 2, ~3, 8, 3, 1, ~8, ~5, ~2, 5, 6, 8, 0, ~3, 4, ~2, 4, ~9, ~5, 7, 6, ~4, ~7, 2, 4, ~3, ~8, ~9, 9, 8, ~9, 3, ~7, 4, ~7, ~5, 4, 9, 3, ~6, ~3, ~7, 4, 2, ~2], [~8, ~8, 6, ~2, ~6, 8, ~3, 3, ~1, ~7, 1, 9, 1, 7, ~6, 8, ~2, ~9, ~1, 3, ~4, 7, 8, ~1, 9, ~9, 6, ~3, 5, 0, 2, 5, ~1, ~6, ~6, 1, 8, 6, ~3, ~9, ~1, 9, ~2, 9, ~8, ~7, ~3, 6, ~3, ~3], [ 5, ~2, 3, 0, ~9, ~8, ~6, 1, 8, 0, 1, 2, ~8, ~2, 0, ~9, ~8, 0, 5, ~3, ~4, 5, 6, ~2, ~5, 0, ~9, 9, ~9, ~5, 9, 9, ~5, ~2, 4, 3, 8, ~8, ~7, 5, ~3, ~2, 2, 3, 9, 7, ~1, 0, 4, ~1], [~4, 5, ~5, 7, 8, 9, 7, ~3, 1, 9, ~7, ~1, 8, ~5, ~1, 2, ~8, 1, 0, 9, ~8, ~1, 6, ~1, 9, ~8, 7, 4, ~8, 7, 0, ~6, 2, 3, 7, 4, ~3, ~5, 9, ~3, 0, 6, ~9, 2, 4, ~8, 6, ~7, 9, 1], [ 7, 0, ~9, 6, 8, 2, 2, 5, ~6, ~6, 9, ~5, 9, 2, 2, ~8, 0, ~6, ~9, ~6, ~4, ~9, 8, ~2, 9, 7, ~5, ~1, 7, 2, ~7, 7, ~1, ~3, 6, 6, 1, ~4, 0, ~1, ~6, ~5, 6, ~7, ~3, ~2, 8, 2, ~9, 8], [ 8, ~7, ~9, ~6, 9, ~7, ~7, 6, ~8, 9, 5, ~4, 1, ~7, ~8, ~6, ~3, 8, ~8, 1, ~8, 6, 9, ~3, ~7, 7, 1, 6, 1, 0, 8, ~5, ~8, 8, ~9, 0, 4, 4, 3, ~4, 6, ~3, ~9, 0, 4, ~4, ~5, ~9, ~5, ~8], [~3, ~2, 8, 1, ~1, ~1, ~4, 3, 7, ~2, ~9, 9, ~8, ~9, 6, ~4, 7, ~1, ~5, ~3, ~9, 0, ~3, 0, 7, 9, 1, ~2, 7, ~9, ~6, 3, 3, ~4, ~7, ~3, ~4, ~8, ~2, ~3, ~9, ~2, ~6, 3, ~6, ~4, 7, ~5, ~8, ~1], [~9, ~9, ~2, ~9, ~9, 9, 6, 6, 7, 5, ~1, ~2, 1, 5, 2, ~3, ~4, 1, ~6, 0, ~3, ~9, ~1, 7, 0, ~9, 5, ~2, ~2, 5, 3, 4, ~1, 6, ~6, 3, ~6, 7, ~1, 5, ~8, ~4, ~2, ~2, ~6, ~5, ~6, 3, ~1, 4], [ 7, 7, 8, 7, 6, 1, ~2, 5, ~6, 9, 4, 8, 5, 0, ~4, ~2, ~2, ~5, ~2, ~6, 9, ~8, ~2, ~5, ~9, 3, ~6, ~3, ~4, ~5, ~2, 6, 1, 6, ~5, 0, ~3, ~2, 4, ~6, 1, 6, ~1, 3, ~9, 2, ~3, 1, 5, ~6], [ 6, 4, ~7, 3, ~7, 9, 1, ~7, ~8, 0, ~6, 8, 4, 1, 9, 6, 8, 3, 0, 9, 0, 4, 9, ~7, ~7, 1, 5, 1, ~5, 6, 9, 2, 4, 1, ~9, 8, 4, 5, 8, 3, 2, ~9, ~6, ~9, 9, ~9, 7, ~6, ~4, 3], [~3, ~9, ~4, 2, 3, 9, ~9, 8, ~9, 9, ~4, ~9, ~5, 5, 0, 7, 3, ~5, ~8, 2, ~3, 0, ~9, ~3, 1, 9, 4, 5, ~1, 8, 0, ~4, ~2, 9, ~4, ~1, 3, 5, 9, ~1, 1, 4, ~8, ~2, ~3, 5, 1, 5, ~6, 7], [ 9, ~3, 2, ~9, 3, 4, 0, 7, ~5, 9, 0, ~6, 7, ~2, 3, ~7, 2, ~5, ~2, 6, 3, ~9, ~5, ~9, 5, 2, ~5, ~3, 8, ~5, 6, 2, 9, ~7, ~7, ~7, ~6, 9, ~3, 6, 0, 6, ~6, ~9, 4, ~3, ~9, 0, ~4, ~9], [~4, ~8, 8, ~7, 7, 0, ~6, ~6, 8, ~9, ~4, 5, ~3, ~1, 7, ~5, ~6, ~1, 8, 6, ~2, 1, ~1, 5, ~9, 1, ~1, ~7, ~6, ~6, ~6, ~4, 6, 3, ~5, ~5, ~6, 2, 3, ~6, ~8, ~3, 8, ~2, ~5, ~4, ~3, 1, 4, ~4], [ 4, ~6, 2, 6, 2, ~8, 8, 5, 8, ~2, 0, ~6, ~1, ~6, ~2, 2, 6, ~9, ~7, ~6, ~4, ~4, ~7, ~2, 8, 6, 3, ~7, ~6, 8, 2, 3, 4, 5, 3, 4, ~6, 8, 8, ~1, 4, ~5, 6, 2, 8, ~3, ~9, ~2, 6, 7], [ 3, ~4, 0, ~3, ~5, 0, ~2, ~6, ~2, 8, 5, ~9, ~4, ~8, ~6, 0, 8, 9, 1, ~2, 8, 2, ~2, 8, 9, 3, 3, 5, ~9, ~3, ~2, 7, 2, 9, 0, 4, 8, ~9, 0, ~6, 9, ~9, 9, ~4, 8, ~8, ~8, 2, ~3, 2], [~1, 3, ~9, ~8, ~7, 6, ~6, 3, 0, 5, ~5, 1, 2, ~2, ~3, 7, 7, 3, ~4, ~2, ~9, ~5, ~1, 9, 6, 8, 2, 8, 7, ~3, 4, 6, 6, 0, ~2, 2, ~7, ~7, 6, ~3, 8, 2, 1, 0, 8, ~1, 3, 9, 8, 6], [ 1, ~2, ~3, 6, 5, 5, ~6, ~4, ~5, 1, 1, 6, ~7, ~4, ~3, 4, 4, ~8, ~9, 7, ~2, ~3, ~7, ~2, 1, 2, 0, 8, ~6, ~5, ~5, 7, 8, 5, ~2, 3, 9, 0, 5, 1, 3, ~4, ~6, 1, 4, ~9, ~2, 5, 4, 3], [ 3, 3, 9, ~2, 6, 9, 4, 9, 4, ~8, 5, ~1, 3, ~2, 1, ~7, ~3, 2, 2, 0, ~3, 3, 8, 2, 0, ~5, 7, 1, 4, ~8, 8, ~9, ~1, 1, ~9, ~4, 5, 2, 2, 8, 6, 1, 6, ~2, 2, 7, 1, ~6, ~1, ~1], [ 4, ~2, 4, ~1, ~5, ~1, 5, ~2, 3, ~4, ~5, 0, 2, ~4, 6, 4, ~3, 2, 2, 5, ~6, ~7, ~9, ~1, ~9, ~9, 6, 0, 6, 5, 9, ~1, 3, ~3, ~8, 8, ~8, 8, 4, 5, ~1, ~5, 1, 0, 3, ~2, 5, 6, 6, 5], [~4, 9, 6, 8, ~9, 5, 5, ~3, ~7, 7, 6, 8, ~8, 0, 4, ~1, 9, 5, ~7, 0, ~1, ~2, 3, 6, 0, 4, ~3, 1, 4, 6, 4, 0, 5, ~1, 7, ~7, ~6, ~8, ~3, ~6, 7, ~1, ~3, ~2, ~3, ~5, 3, 1, ~8, ~9], [~6, 4, ~5, 9, 9, ~7, ~1, ~8, ~4, 2, ~6, 0, ~6, ~6, 7, 6, 0, 1, 7, ~7, 0, ~4, ~6, ~8, ~9, 5, ~6, ~9, 2, ~7, ~2, ~6, 9, 4, ~5, 0, 4, ~4, ~5, 6, 9, 1, ~6, ~5, 3, ~1, 7, ~7, ~6, 7], [~8, 7, 7, ~6, 7, ~4, 8, 0, ~9, ~8, ~3, 7, ~3, 3, 8, ~7, ~2, ~7, 5, 5, ~5, 4, 6, 2, 4, 1, 4, ~9, ~3, 8, 8, ~9, ~4, ~2, 1, ~3, 1, 3, 9, ~5, ~8, ~2, 7, 8, 9, 2, 0, 1, ~9, 6], [~7, 1, ~9, 5, ~5, ~5, 7, 6, ~5, ~9, ~6, ~8, ~6, 9, 7, 9, 0, ~5, 7, 7, ~6, 4, 5, ~9, ~1, ~2, ~7, 3, ~5, ~2, ~5, 5, ~3, ~4, ~2, ~8, 2, ~8, 0, ~8, 0, ~8, 9, 8, ~5, ~5, 1, 3, 5, ~4], [~8, ~8, 0, ~5, ~8, ~6, 3, ~6, ~4, 6, 1, ~5, ~6, ~8, ~4, ~6, ~2, ~6, 6, ~4, 8, 8, 4, ~5, ~1, 0, 9, ~8, ~3, ~1, ~8, 7, ~3, 0, ~7, 1, ~7, ~1, ~7, 3, ~7, 3, ~4, ~8, 8, ~7, ~9, ~8, 3, 2], [ 3, 6, 8, ~9, 7, 1, ~9, 9, 3, 8, 6, 4, ~2, 1, ~8, 4, ~7, ~4, ~3, 3, ~5, ~6, ~7, ~2, 0, ~4, 5, 2, 5, 6, 3, ~8, 2, ~5, ~7, 6, 8, ~2, ~5, ~4, 9, 9, 2, ~2, ~2, 7, 4, 4, ~2, 3], [ 6, 6, ~5, ~2, ~8, ~2, ~9, 0, 2, 4, ~6, ~9, 9, 0, ~8, ~3, ~1, ~2, ~1, 6, 8, 2, ~9, 5, ~2, 1, 7, ~6, 5, 1, ~1, 4, ~4, ~7, ~6, ~3, ~8, 2, 2, 5, 5, ~6, 5, 3, 3, 7, 4, 7, ~3, ~9], [~9, 6, ~4, 1, 3, ~8, ~8, ~8, ~1, 5, 1, 1, ~1, 6, 5, 1, ~1, 5, ~8, 8, ~7, ~5, ~1, ~1, 6, ~8, ~3, ~1, ~2, ~6, ~5, ~5, ~6, 0, 2, 2, 7, ~1, ~5, ~7, ~1, ~3, 7, 6, 0, 2, 4, ~5, 0, ~4]] fun f (x, y) = List.nth (List.nth (table, x), y) fun show m = print (Matrix.toString (m, IntInf.toString)) val _ = let val dim = 32 val big = Matrix.map (Matrix.make (dim, dim, f), IntInf.fromInt) in show big; print "\n"; show (smithNormalForm big) end mlton-20210117+dfsg/regression/socket.ok000066400000000000000000000000441416264345000200270ustar00rootroot00000000000000OK hello, world NONE goodbye, world mlton-20210117+dfsg/regression/socket.sml000066400000000000000000000031311416264345000202110ustar00rootroot00000000000000val addr = INetSock.any 0 val socket = INetSock.TCP.socket () val _ = Socket.bind (socket, addr) val _ = Socket.listen (socket, 5) val addr = Socket.Ctl.getSockName socket fun read socket : string = Byte.unpackStringVec (Word8VectorSlice.full (Socket.recvVec (socket, 100))) fun readNB socket : string option = Option.map (Byte.unpackStringVec o Word8VectorSlice.full) (Socket.recvVecNB (socket, 100)) fun write (socket, s: string): unit = (Socket.sendVec (socket, Word8VectorSlice.full (Byte.stringToBytes s)) ; ()) val _ = print (case Socket.acceptNB socket of NONE => "OK\n" | SOME _ => "WRONG\n") val _ = case Posix.Process.fork () of NONE => let val _ = Posix.Process.sleep (Time.fromSeconds 1) val (socket, _) = Socket.accept socket val _ = print (read socket) val _ = print (case readNB socket of NONE => "NONE\n" | SOME s => s) val _ = write (socket, "goodbye, world\n"); val _ = Socket.close socket in () end | SOME pid => let val socket' = INetSock.TCP.socket () val _ = Socket.connect (socket', addr) val _ = write (socket', "hello, world\n") val _ = print (read socket') val _ = Socket.close socket' val (pid', status) = Posix.Process.wait () in if pid = pid' andalso status = Posix.Process.W_EXITED then () else print "child failed\n" end mlton-20210117+dfsg/regression/string.fromString.ok000066400000000000000000000001371416264345000222010ustar00rootroot00000000000000OK SOME [abc] OK NONE OK NONE OK SOME [a] OK SOME [a] OK SOME [] OK SOME [] OK SOME [] OK NONE mlton-20210117+dfsg/regression/string.fromString.sml000066400000000000000000000010751416264345000223650ustar00rootroot00000000000000fun toString NONE = "NONE" | toString (SOME s) = concat ["SOME [", s, "]"] fun check (s, s') = let val s'' = String.fromString s in if s'' = s' then print (concat ["OK ", toString s'', "\n"]) else print (concat ["WRONG ", toString s'', " ", toString s', "\n"]) end val _ = List.app check [("abc\"def", SOME "abc"), ("\n", NONE), (* from SML Basis manual example *) ("\\q", NONE), ("a\^D", SOME "a"), ("a\\ \\\\q", SOME "a"), ("\\ \\", SOME ""), ("", SOME ""), ("\\ \\\^D", SOME ""), ("\\ a", NONE)] mlton-20210117+dfsg/regression/string.ok000066400000000000000000000011141416264345000200440ustar00rootroot00000000000000Testing String... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test12a OK test12b OK test12c OK test12d OK test12e OK test12f OK test12g OK test13a OK test13b OK test14 OK test15 OK test16a OK test16b OK test17 OK test18 OK test19 OK test20 OK test21 OK test22 OK test23 OK test24 OK test25 OK mlton-20210117+dfsg/regression/string.sml000066400000000000000000000315041416264345000202340ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/string.sml PS 1994-12-10, 1995-06-14, 1996-05-16 *) (*KILL 05/11/1997 11:02. tho.: use "auxil.sml"; *) val _ = print "Testing String...\n"; local val map' = map open Char String val map = map' val s1 = "" (* size s1 = 0 *) and s2 = "ABCDE\tFGHI"; (* size s2 = 10 *) val ABCDE = List.map chr [65,66,67,68,69]; in val test1 = tst' "test1" (fn _ => (size s1 = 0 andalso size s2 = 10)); val test2 = tst' "test2" (fn _ => (sub(s2,6) = chr 70 andalso sub(s2,9) = chr 73)); val test3 = tst0 "test3" ((sub(s1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test4 = tst0 "test4" ((sub(s2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test5 = tst0 "test5" ((sub(s2, 10) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6 = tst' "test6" (fn _ => "" = concat [] andalso "" = concat [s1] andalso s2 = concat [s2] andalso s2^s2 = concat [s2,s2] andalso "ABCD" = concat ["A","B","C","D"]); val test7 = tst' "test7" (fn _ => "A" = str(chr 65)); val test8 = tst' "test8" (fn _ => "" = implode [] andalso "ABCDE" = implode ABCDE); val test9 = tst' "test9" (fn _ => [] = explode "" andalso ABCDE = explode "ABCDE"); val test10 = tst' "test10" (fn _ => s1 < s2 andalso s1 <= s1 andalso s2 > s1 andalso s2 >=s2); val test11a = tst' "test11a" (fn _ => s2 = extract(s2, 0, SOME (size s2)) andalso s2 = extract(s2, 0, NONE) andalso "" = extract(s2, size s2, SOME 0) andalso "" = extract(s2, size s2, NONE) andalso "" = extract(s1, 0, SOME 0) andalso "" = extract(s1, 0, NONE)); val test11b = tst0 "test11b" ((extract(s2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11c = tst0 "test11c" ((extract(s2, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11d = tst0 "test11d" ((extract(s2, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11e = tst0 "test11e" ((extract(s2, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11f = tst0 "test11f" ((extract(s2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11g = tst0 "test11g" ((extract(s2, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11h = tst' "test11h" (fn _ => "ABCDE" = extract(s2, 0, SOME 5) andalso "FGHI" = extract(s2, 6, SOME 4) andalso "FGHI" = extract(s2, 6, NONE)); val test12a = tst' "test12a" (fn _ => s2 = substring(s2, 0, size s2) andalso "" = substring(s2, size s2, 0) andalso "" = substring(s1, 0, 0)); val test12b = tst0 "test12b" ((substring(s2, ~1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12c = tst0 "test12c" ((substring(s2, 11, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12d = tst0 "test12d" ((substring(s2, 0, 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12e = tst0 "test12e" ((substring(s2, 10, 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12f = tst' "test12f" (fn _ => "ABCDE" = substring(s2, 0, 5) andalso "FGHI" = substring(s2, 6, 4)); val test12g = tst0 "test12g" (case (Int.minInt, Int.maxInt) of (SOME min, SOME max) => ((substring("", max, max); substring("", min, min); "WRONG") handle Subscript => "OK" | _ => "WRONG") | _ => "OK"); val test13a = tst' "test13a" (fn _ => (translate (fn _ => "") s2 = "" andalso translate (fn x => str x) "" = "" andalso translate (fn x => str x) s2 = s2)); val test13b = tst' "test13b" (fn _ => (translate (fn c => if c = #"\t" then "XYZ " else str c) s2 = "ABCDEXYZ FGHI")); val test14 = tst' "test14" (fn _ => (tokens isSpace "" = [] andalso tokens isSpace " \t \n" = [] andalso tokens (fn c => c = #",") ",asd,,def,fgh" = ["asd","def","fgh"])); val test15 = tst' "test15" (fn _ => (fields isSpace "" = [""] andalso fields isSpace " \t \n" = ["","","","","","",""] andalso fields (fn c => c = #",") ",asd,,def,fgh" = ["","asd","","def","fgh"])); val test16a = tst' "test16a" (fn _ => EQUAL = compare(s1,s1) andalso EQUAL = compare(s2,s2) andalso LESS = compare("A", "B") andalso GREATER = compare("B", "A") andalso LESS = compare("ABCD", "ABCDE") andalso GREATER = compare("ABCDE", "ABCD")); val test16b = tst' "test16b" (fn _ => EQUAL = compare(s1,s1) andalso EQUAL = compare(s2,s2) andalso LESS = compare("A", "a") andalso GREATER = compare("b", "B") andalso LESS = compare("abcd", "abcde") andalso GREATER = compare("abcde", "abcd")); (* Test cases for SML string escape functions. *) val test17 = let fun chk (arg, res) = toString (str arg) = res val argResList = [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")] val (arg, res) = (implode (map #1 argResList), concat (map #2 argResList)) in tst' "test17" (fn _ => List.all chk argResList andalso toString arg = res) end; val test18 = let val chars = CharVector.tabulate(256, chr) val l = CharVector.foldl (fn (e,l) => e :: l) [] chars val chars = implode l in tst' "test18" (fn _ => fromString(toString chars) = SOME chars) end val test19 = let fun chkFromString (arg, res) = fromString arg = SOME (str res) val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] val (arg, res) = (concat (map #1 argResList), implode (map #2 argResList)) in tst' "test19" (fn _ => List.all chkFromString argResList andalso fromString arg = SOME res) end; val test20 = tst' "test20" (fn _ => List.all (fn arg => not (isSome (fromString arg))) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\256", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\ a", "\\ a\\B"]); (* Test cases for C string escape functions *) val test21 = let val chars = CharVector.tabulate(256, chr) val l = CharVector.foldl (fn (e,l) => e :: l) [] chars val chars = implode l in tst' "test21" (fn _ => fromCString(toCString chars) = SOME chars) end; val test22 = let val argResList = [("\010", "\\n"), ("\009", "\\t"), ("\011", "\\v"), ("\008", "\\b"), ("\013", "\\r"), ("\012", "\\f"), ("\007", "\\a"), ("\\", "\\\\"), ("?", "\\?"), ("'", "\\'"), ("\"", "\\\"")] val (arg, res) = (concat (map #1 argResList), concat (map #2 argResList)) in tst' "test22" (fn _ => List.all (fn (arg, res) => toCString arg = res) argResList andalso toCString arg = res) end; val test23 = let fun checkFromCStringSucc (arg, res) = fromCString arg = SOME res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\0647"), ("\\100A", "\064A"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\0018"), ("\\178", "\0158"), ("\\1C", "\001C"), ("\\17C", "\015C"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010g"), ("\\xAAg", "\170g"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010g"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010g"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017+")] val (arg, res) = (concat (map #1 argResList), concat (map #2 argResList)) in tst' "test23" (fn _ => List.all checkFromCStringSucc argResList andalso fromCString arg = SOME res) end; val test24 = let fun checkFromCStringFail arg = isSome (fromCString arg) in tst' "test24" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\400", "\\777", "\\8", "\\9", "\\c", "\\d", "\\x", "\\x100", "\\xG"]) end; val test25 = tst' "test25" (fn _ => isPrefix "" "" andalso isPrefix "" "abcde" andalso isPrefix "a" "abcde" andalso isPrefix "abcd" "abcde" andalso isPrefix "abcde" "abcde" andalso not (isPrefix "abcde" "") andalso not (isPrefix "abcdef" "abcde") andalso not (isPrefix "Abcde" "abcde") andalso not (isPrefix "abcdE" "abcde")) end mlton-20210117+dfsg/regression/string2.ok000066400000000000000000000000111416264345000201210ustar00rootroot00000000000000\000\000 mlton-20210117+dfsg/regression/string2.sml000066400000000000000000000001671416264345000203170ustar00rootroot00000000000000val _ = print(concat[Char.toCString #"\000", String.toCString "\000", "\n"]) mlton-20210117+dfsg/regression/stringcvt.ok000066400000000000000000000002671416264345000205710ustar00rootroot00000000000000 File stringcvt.sml: Testing structure StringCvt... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK mlton-20210117+dfsg/regression/stringcvt.sml000066400000000000000000000154231416264345000207530ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/stringcvt.sml -- 1995-10-26, 1996-07-05 *) (*KILL 05/11/1997 11:02. tho.: use "auxil.sml"; *) val _ = print "\nFile stringcvt.sml: Testing structure StringCvt...\n"; local open StringCvt (* Read all upper case letters, skip lowercase letters, scan an * integer, and return the excess characters: *) fun triple getc src = let open StringCvt val (str1, src1) = splitl Char.isUpper getc src val src2 = dropl Char.isLower getc src1 in case Int.scan DEC getc src2 of NONE => NONE | SOME (i, src3) => let val str2 = takel (fn _ => true) getc src3 in SOME((str1, i, str2), src3) end end (* Testing TextIO.scanStream: *) val tmpfile = "textio.tmp"; fun putandscan scan s = let open TextIO val os = openOut tmpfile val _ = output(os, s) val _ = closeOut os val is = openIn tmpfile in scanStream scan is before closeIn is end; fun testtrip (s, res) = scanString triple s = res andalso putandscan triple s = res datatype result = Bool of bool | Int of int fun backtrack getc src = case Bool.scan getc src of SOME(b, rest) => SOME (Bool b, rest) | NONE => case Int.scan StringCvt.DEC getc src of SOME(i, rest) => SOME(Int i, rest) | NONE => case Int.scan StringCvt.HEX getc src of SOME(i, rest) => SOME(Int i, rest) | NONE => NONE fun testback (s, res) = scanString backtrack s = res andalso putandscan backtrack s = res in val test1 = tst' "test1" (fn _ => padLeft #"#" 0 "abcdef" = "abcdef" andalso padLeft #"#" 6 "abcdef" = "abcdef" andalso padLeft #"#" 7 "abcdef" = "#abcdef" andalso padLeft #"#" 10 "abcdef" = "####abcdef" andalso padLeft #"#" ~3 "abcdef" = "abcdef"); val test2 = tst' "test2" (fn _ => padRight #"#" 0 "abcdef" = "abcdef" andalso padRight #"#" 6 "abcdef" = "abcdef" andalso padRight #"#" 7 "abcdef" = "abcdef#" andalso padRight #"#" 10 "abcdef" = "abcdef####" andalso padRight #"#" ~3 "abcdef" = "abcdef"); val test3 = tst' "test3" (fn _ => testtrip ("", NONE) andalso testtrip(" a1", NONE) andalso testtrip(" A1", NONE) andalso testtrip("ABC A1", NONE) andalso testtrip("ABC a1", NONE) andalso testtrip(" *1", NONE) andalso testtrip("ABC *1", NONE)); val test4 = tst' "test4" (fn _ => testtrip ("1", SOME("", 1, "")) andalso testtrip ("1", SOME("", 1, "")) andalso testtrip (" 1", SOME("", 1, "")) andalso testtrip (" 1 ", SOME("", 1, " "))); val test5 = tst' "test5" (fn _ => testtrip ("1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("a1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("a1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc 1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc 1a123+ +&D", SOME("", 1, "a123+ +&D"))) val test6 = tst' "test6" (fn _ => testtrip ("~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("a~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("a~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc ~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc ~1234a123+ +&D", SOME("", ~1234, "a123+ +&D"))) val test7 = tst' "test7" (fn _ => testtrip ("A1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFG1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aa1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGa1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aazbc1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aazbc 1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc 1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D"))) val test8 = tst' "test8" (fn _ => testtrip ("A~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFG~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aa~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGa~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aazbc~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aazbc ~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc ~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D"))) val test9 = tst' "test9" (fn _ => let fun getstring b getc src = SOME(takel (fn _ => b) getc src, src) fun dup 0 s = s | dup n s = dup (n-1) (s^s); val longstring = dup 13 "abcDEFGHI" in scanString (getstring true) longstring = SOME longstring andalso scanString (getstring false) longstring = SOME "" andalso putandscan (getstring true) longstring = SOME longstring end) val test10 = tst' "test10" (fn _ => List.all testback [("false", SOME (Bool false)), ("true", SOME (Bool true)), ("tru e", NONE), ("fals e", SOME (Int 250)), ("fa", SOME (Int 250)), ("fa00", SOME (Int 64000)), ("21a", SOME (Int 21)), ("a21", SOME (Int 2593)), ("", NONE), ("gryf", NONE) ]); (*val _ = FileSys.remove tmpfile*) end mlton-20210117+dfsg/regression/substring-overflow.ok000066400000000000000000000000031416264345000224130ustar00rootroot00000000000000OK mlton-20210117+dfsg/regression/substring-overflow.sml000066400000000000000000000002061416264345000226020ustar00rootroot00000000000000open Substring val _ = (slice (full "abc", 1, SOME (valOf Int.maxInt)) ; print "ERROR\n") handle Subscript => print "OK\n" mlton-20210117+dfsg/regression/substring.ok000066400000000000000000000017111416264345000205610ustar00rootroot00000000000000test1a OK test1b OK test1c OK test1d OK test1e OK test1f OK test1g OK test1h OK test2a OK test2b OK test2c OK test3a OK test3b OK test3c OK test4 OK test5a OK test5b OK test6 OK test7 OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test12 OK test13 OK test14 OK test15 OK test16 OK test17 OK test18 OK test19 OK test20 OK test21 OK test22a OK test22b OK test23 OK test24 OK test25 OK test26a OK test26b OK test27a OK test27b OK test28 OK test29a OK test29b OK test29c OK test30a OK test30b OK test30c OK test30d OK test30e OK test30f OK test31 OK test32a OK test32b OK test32c OK test32d OK test32e OK mlton-20210117+dfsg/regression/substring.sml000066400000000000000000000375231416264345000207550ustar00rootroot00000000000000(* test/substring.sml 1995-04-27, 1997-06-03 *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun checkrange bounds = check o range bounds; local open Char Substring val all = full fun base2 (a, b) = (base a, base b) val s1 = "" (* String.size s1 = 0 *) and s2 = "ABCDE\tFGHI"; (* String.size s2 = 10 *) val ss1 = all s1 (* size s1 = 0 *) and ss2 = all s2; (* size s2 = 10 *) val sa = "AAAAaAbAABBBB"; (* String.size sa = 14 *) (* 45678 *) val ssa1 = extract(sa, 4, SOME 0) (* size ssa1 = 0 *) val ssa2 = extract(sa, 4, SOME 5) (* size ssa2 = 5 *) val ss3 = extract("junk this is a (clear)textjunk", 4, SOME 24); (* 456789012345678901234567 *) in val test1a = tst' "test1a" (fn _ => (s2, 10, 0) = base(extract(s2, 10, SOME 0)) andalso (s2, 10, 0) = base(extract(s2, 10, NONE)) andalso (s2, 0, 0) = base(extract(s2, 0, SOME 0)) andalso (s2, 4, 3) = base(extract(s2, 4, SOME 3)) andalso (s2, 4, 6) = base(extract(s2, 4, SOME 6)) andalso (s2, 4, 6) = base(extract(s2, 4, NONE)) andalso (s2, 0, 10) = base(extract(s2, 0, SOME 10)) andalso (s2, 0, 10) = base(extract(s2, 0, NONE))); val test1b = tst0 "test1b" ((extract(s2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1c = tst0 "test1c" ((extract(s2, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1d = tst0 "test1d" ((extract(s2, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1e = tst0 "test1e" ((extract(s2, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1f = tst0 "test1f" ((extract(s2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1g = tst0 "test1g" ((extract(s2, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1h = tst' "test1h" (fn _ => string ssa1 = "" andalso string ssa2 = "aAbAA" andalso s1 = string (all s1) andalso s2 = string (all s2)); val test2a = tst' "test2a" (fn _ => string(triml 6 ss2) = "FGHI" andalso s2 = string(triml 0 ss2) andalso s1 = string(triml 0 ss1) andalso (s2, 10, 0) = base(triml 10 ss2) andalso (s2, 10, 0) = base(triml 11 ss2) andalso (sa, 6, 3) = base(triml 2 ssa2) andalso (sa, 9, 0) = base(triml 5 ssa2) andalso (sa, 9, 0) = base(triml 6 ssa2)); val test2b = tst0 "test2b" ((triml ~1 ss2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test2c = tst0 "test2c" ((triml ~1 ssa2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test3a = tst' "test3a" (fn _ => string(trimr 6 ss2) = "ABCD" andalso s2 = string(trimr 0 ss2) andalso s1 = string(trimr 0 ss1) andalso (s2, 0, 0) = base(trimr 10 ss2) andalso (s2, 0, 0) = base(trimr 11 ss2) andalso (sa, 4, 3) = base(trimr 2 ssa2) andalso (sa, 4, 0) = base(trimr 5 ssa2) andalso (sa, 4, 0) = base(trimr 6 ssa2)); val test3b = tst0 "test3b" ((trimr ~1 ss2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test3c = tst0 "test3c" ((trimr ~1 ssa2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test4 = tst' "test4" (fn _ => isEmpty ss1 andalso not (isEmpty ss2) andalso isEmpty ssa1 andalso not (isEmpty ssa2)); val test5a = tst' "test5a" (fn _ => case getc ssa1 of NONE => true | _ => false); val test5b = tst' "test5b" (fn _ => case getc ssa2 of NONE => false | SOME(#"a", rest) => "AbAA" = string rest | _ => false); val test6 = tst' "test6" (fn _ => first ssa1 = NONE andalso first ssa2 = SOME #"a") val test7 = tst' "test7" (fn _ => (size ss1 = 0 andalso size ss2 = 10 andalso size ssa1 = 0 andalso size ssa2 = 5)); val test8a = tst' "test8a" (fn _ => (sub(ss2,6) = chr 70 andalso sub(ss2,9) = chr 73 andalso sub(ssa2, 1) = chr 65)); val test8b = tst0 "test8b" ((sub(ss1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8c = tst0 "test8c" ((sub(ss2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8d = tst0 "test8d" ((sub(ss2, 10) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8e = tst0 "test8e" ((sub(ssa2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8f = tst0 "test8f" ((sub(ssa2, 5) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9a = tst' "test9a" (fn _ => base ss2 = base(slice(ss2, 0, SOME (size ss2))) andalso base ss2 = base(slice(ss2, 0, NONE)) andalso (s2, 10, 0) = base(slice(ss2, size ss2, SOME 0)) andalso (s2, 10, 0) = base(slice(ss2, size ss2, NONE)) andalso base ss1 = base(slice(ss1, 0, SOME 0)) andalso base ss1 = base(slice(ss1, 0, NONE))); val test9b = tst' "test9b" (fn _ => (sa, 4, 5) = base(slice(ssa2, 0, SOME 5)) andalso (sa, 4, 5) = base(slice(ssa2, 0, NONE)) andalso (sa, 4, 0) = base(slice(ssa2, 0, SOME 0)) andalso (sa, 9, 0) = base(slice(ssa2, 5, SOME 0)) andalso (sa, 9, 0) = base(slice(ssa2, 5, NONE)) andalso (sa, 5, 3) = base(slice(ssa2, 1, SOME 3)) andalso (sa, 5, 4) = base(slice(ssa2, 1, SOME 4)) andalso (sa, 5, 4) = base(slice(ssa2, 1, NONE))); val test9c = tst0 "test9c" ((slice(ssa2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d = tst0 "test9d" ((slice(ssa2, 6, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e = tst0 "test9e" ((slice(ssa2, 0, SOME 6) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f = tst0 "test9f" ((slice(ssa2, 5, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g = tst0 "test9g" ((slice(ssa2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h = tst0 "test9h" ((slice(ssa2, 6, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test12 = tst' "test12" (fn _ => concat [] = "" andalso concat [ssa1, ssa1, ssa1] = "" andalso concat [ssa2, ssa2, ssa2] = "aAbAAaAbAAaAbAA" andalso concat [ssa2, ssa1, ss2, ss1] = "aAbAAABCDE\tFGHI"); val test13 = tst' "test13" (fn _ => explode ss1 = [] andalso explode ssa1 = [] andalso explode ssa2 = [#"a", #"A", #"b", #"A", #"A"]); val test14 = tst' "test14" (fn _ => EQUAL = compare(ssa1,ssa1) andalso EQUAL = compare(ssa2,ssa2) andalso LESS = compare(triml 1 ssa2, ssa2) andalso GREATER = compare(ssa2, triml 1 ssa2) andalso LESS = compare(trimr 1 ssa2, ssa2) andalso GREATER = compare(ssa2, trimr 1 ssa2) andalso LESS = compare(all "AB", ssa2) andalso GREATER = compare(ssa2, all "AB")); fun finda c = c <> #"A"; fun findb c = c <> #"B"; val test15 = tst' "test15" (fn _ => (sa, 5, 4) = base(dropl finda ssa2) andalso (sa, 9, 0) = base(dropl findb ssa2) andalso base ssa1 = base(dropl finda ssa1)); val test16 = tst' "test16" (fn _ => (sa, 4, 5) = base(dropr finda ssa2) andalso (sa, 4, 0) = base(dropr findb ssa2) andalso base ssa1 = base(dropr finda ssa1)); val test17 = tst' "test17" (fn _ => (sa, 4, 1) = base(takel finda ssa2) andalso (sa, 4, 5) = base(takel findb ssa2) andalso base ssa1 = base(takel finda ssa1)); val test18 = tst' "test18" (fn _ => (sa, 9, 0) = base(taker finda ssa2) andalso (sa, 4, 5) = base(taker findb ssa2) andalso base ssa1 = base(taker finda ssa1)); val test19 = tst' "test19" (fn _ => ((sa, 4, 1), (sa, 5, 4)) = base2(splitl finda ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(splitl findb ssa2) andalso base2(ssa1, ssa1) = base2(splitl finda ssa1)); val test20 = tst' "test20" (fn _ => ((sa, 4, 5), (sa, 9, 0)) = base2(splitr finda ssa2) andalso ((sa, 4, 0), (sa, 4, 5)) = base2(splitr findb ssa2) andalso base2(ssa1, ssa1) = base2 (splitr finda ssa1)); val test21 = tst' "test21" (fn _ => ((sa, 4, 0), (sa, 4, 5)) = base2(position "" ssa2) andalso ((sa, 4, 1), (sa, 5, 4)) = base2(position "Ab" ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "B" ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "AAB" ssa2) andalso ((sa, 4, 0), (sa, 4, 5)) = base2(position "aA" ssa2) andalso ((sa, 4, 2), (sa, 6, 3)) = base2(position "bAA" ssa2) andalso (base ssa1, base ssa1) = base2(position "A" ssa1) andalso (base ssa1, base ssa1) = base2(position "" ssa1)); (* For the pre-November 1995 version of position: val test21 = tst' "test21" (fn _ => (sa, 4, 5) = base(position "" ssa2) andalso (sa, 5, 4) = base(position "Ab" ssa2) andalso (sa, 9, 0) = base(position "B" ssa2) andalso (sa, 9, 0) = base(position "AAB" ssa2) andalso (sa, 4, 5) = base(position "aA" ssa2) andalso (sa, 6, 3) = base(position "bAA" ssa2) andalso base ssa1 = base(position "A" ssa1) andalso base ssa1 = base(position "" ssa1)); *) val test22a = tst' "test22a" (fn _ => (translate (fn _ => "") ssa2 = "" andalso translate (fn x => str x) ssa1 = "" andalso translate (fn x => str x) ssa2 = string ssa2)); val test22b = tst' "test22b" (fn _ => (translate (fn c => if c = #"b" then "XYZ " else str c) ssa2 = "aAXYZ AA")); val test23 = tst' "test23" (fn _ => (null(tokens isSpace ssa1) andalso null(tokens (Char.contains "Aab") ssa2) andalso map string (tokens (fn c => c = #"A") ssa2) = ["a","b"])); val test24 = tst' "test24" (fn _ => (map base (fields isSpace ssa1) = [base ssa1] andalso map base (fields (contains "Aab") ssa2) = [(sa,4,0),(sa,5,0),(sa,6,0),(sa,7,0),(sa,8,0),(sa,9,0)] andalso map string (fields (fn c => c = #"A") ssa2) = ["a","b","",""])); val test25 = tst' "test25" (fn _ => null(tokens (fn _ => true) ss3) andalso null(tokens (fn _ => false) (all "")) andalso null(tokens (contains " ()") (all "(()())(( ()")) andalso ["this","is","a","clear","text"] = map string (tokens (contains " ()") ss3)); local val v = ref 0 fun setv c = v := ord c; in val test26a = tst' "test26a" (fn _ => (v := 0; foldl (fn (x, _) => setv x) () ssa2; !v = 65)); val test26b = tst' "test26b" (fn _ => implode(foldl (op ::) [] ssa2) = "AAbAa"); val test27a = tst' "test27a" (fn _ => (v := 0; foldr (fn (x, _) => setv x) () ssa2; !v = 97)); val test27b = tst' "test27b" (fn _ => implode(foldr (op ::) [] ssa2) = "aAbAA"); val test28 = tst' "test28" (fn _ => (v := 0; app setv ssa2; !v = 65)); end val test29a = tst' "test29a" (fn _ => base2(splitAt(ssa1, 0)) = ((sa, 4, 0), (sa, 4, 0)) andalso base2(splitAt(ssa2, 0)) = ((sa, 4, 0), (sa, 4, 5)) andalso base2(splitAt(ssa2, 1)) = ((sa, 4, 1), (sa, 5, 4)) andalso base2(splitAt(ssa2, 4)) = ((sa, 4, 4), (sa, 8, 1)) andalso base2(splitAt(ssa2, 5)) = ((sa, 4, 5), (sa, 9, 0))); val test29b = tst0 "test29b" ((splitAt(ssa2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test29c = tst0 "test29c" ((splitAt(ssa2, 6) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30a = tst' "test30a" (fn _ => (s2, 10, 0) = base(substring(s2, 10, 0)) andalso (s2, 0, 0) = base(substring(s2, 0, 0)) andalso (s2, 4, 3) = base(substring(s2, 4, 3)) andalso (s2, 4, 6) = base(substring(s2, 4, 6)) andalso (s2, 0, 10) = base(substring(s2, 0, 10))); val test30b = tst0 "test30b" ((substring(s2, ~1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30c = tst0 "test30c" ((substring(s2, 11, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30d = tst0 "test30d" ((substring(s2, 0, 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30e = tst0 "test30e" ((substring(s2, 10, 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30f = tst0 "test30f" ((case (Int.minInt, Int.maxInt) of (SOME min, SOME max) => ((substring("", max, max); "WRONG") handle Subscript => ((substring("", min, min); "WRONG") handle Subscript => "OK" | _ => "WRONG")) | _ => "OK") handle _ => "EXN") (* val sa = "AAAAaAbAABBBB"; *) val test31 = tst' "test31" (fn _ => isPrefix "" (substring(sa, 0, 0)) andalso isPrefix "" (substring(sa, 13, 0)) andalso isPrefix "" ssa1 andalso isPrefix "aAbAA" ssa2 andalso isPrefix "aAbA" ssa2 andalso not (isPrefix "aAbAAB" ssa2) andalso not (isPrefix "aAbAAB" ssa1)) fun eqspan(sus1, sus2, res) = base(span(sus1, sus2)) = base res val test32a = tst' "test32a" (fn _ => eqspan(substring(sa, 0, 0), substring(sa, 0, 13), all sa) andalso eqspan(substring(sa, 0, 13), substring(sa, 13, 0), all sa) andalso eqspan(substring(sa, 5, 0), substring(sa, 5, 0), substring(sa, 5,0)) andalso eqspan(substring(sa, 0, 5), substring(sa, 5, 8), all sa) andalso eqspan(substring(sa, 0, 13), substring(sa, 0, 13), all sa) andalso eqspan(substring(sa, 5, 4), substring(sa, 2, 4), substring(sa,5,1)) andalso eqspan(substring(sa, 2, 5), substring(sa, 6, 3), substring(sa, 2,7)) andalso eqspan(substring("abcd", 1, 0), substring("abcd", 1, 2), substring("abcd", 1, 2)) andalso eqspan(substring("", 0, 0), substring("", 0, 0), all "")) val test32b = tst0 "test32b" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32c = tst0 "test32c" ((span(substring(sa, 1, 0), substring(sa, 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32d = tst0 "test32d" ((span(substring(sa, 3, 2), substring("abcd", 2, 1)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32e = tst0 "test32e" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") end; mlton-20210117+dfsg/regression/suspend.ok000066400000000000000000000000771416264345000202260ustar00rootroot00000000000000child suspending parent sending int child got an int done done mlton-20210117+dfsg/regression/suspend.sml000066400000000000000000000006741416264345000204130ustar00rootroot00000000000000open Posix.Signal MLton.Signal Posix.Process val _ = case fork () of NONE => (setHandler (int, Handler.simple (fn () => print "child got an int\n")) ; print "child suspending\n" ; suspend Mask.none ; print "done\n") | SOME pid => (sleep (Time.fromSeconds 1) ; print "parent sending int\n" ; kill (K_PROC pid, int) ; wait () ; print "done\n") mlton-20210117+dfsg/regression/tak.ok000066400000000000000000000000021416264345000173100ustar00rootroot000000000000007 mlton-20210117+dfsg/regression/tak.sml000066400000000000000000000002761416264345000175070ustar00rootroot00000000000000fun tak(x,y,z) = if y >= x then z else tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)) val _ = print(concat[Int.toString(tak(18,12,6)), "\n"]) mlton-20210117+dfsg/regression/taut.sml000066400000000000000000000004221416264345000176760ustar00rootroot00000000000000(* a tautology checker *) datatype t = Base of bool | Fun of bool -> t val rec taut = fn Base b => b | Fun f => taut (f true) andalso taut (f false) val rec bigTrue = fn 0 => Base true | n => Fun (fn _ => bigTrue (n - 1)) val _ = taut (bigTrue 12) mlton-20210117+dfsg/regression/test-create.ok000066400000000000000000000002441416264345000207610ustar00rootroot00000000000000create test: testing stdout... Hello world! [stdout] exit_status: W_EXITED testing exit... exit_status: W_EXITSTATUS 7 testing diverge... exit_status: W_SIGNALED 9 mlton-20210117+dfsg/regression/test-create.sml000066400000000000000000000035041416264345000211450ustar00rootroot00000000000000fun statusToString status = case status of Posix.Process.W_EXITED => "W_EXITED" | Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w] | Posix.Process.W_SIGNALED s => concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)] | Posix.Process.W_STOPPED s => concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)] val cmd = CommandLine.name () fun stdout () = TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n") fun exit () = Posix.Process.exit 0wx7 fun diverge () = diverge () fun test () = let fun create arg = let val _ = TextIO.flushOut (TextIO.stdOut) val _ = TextIO.flushOut (TextIO.stdErr) in MLton.Process.create {path = cmd, args = [arg], env = NONE, stdin = MLton.Process.Param.self, stdout = MLton.Process.Param.self, stderr = MLton.Process.Param.self} end fun reap pid = MLton.Process.reap pid fun kill (pid, signal) = MLton.Process.kill (pid, signal) fun doTest (arg, withPid) = let val _ = print (concat ["testing ", arg, "...\n"]) val pid = create arg val () = withPid pid val status = reap pid val _ = print (concat ["exit_status: ", statusToString status, "\n"]) in () end fun doSimpleTest arg = doTest (arg, fn _ => ()) in print "create test:\n" ; doSimpleTest "stdout" ; doSimpleTest "exit" ; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill)) end val _ = case CommandLine.arguments () of [] => test () | ["stdout"] => stdout () | ["exit"] => exit () | ["diverge"] => diverge () | _ => raise Match mlton-20210117+dfsg/regression/test-spawn.ok000066400000000000000000000002431416264345000206450ustar00rootroot00000000000000spawn test: testing stdout... Hello world! [stdout] exit_status: W_EXITED testing exit... exit_status: W_EXITSTATUS 7 testing diverge... exit_status: W_SIGNALED 9 mlton-20210117+dfsg/regression/test-spawn.sml000066400000000000000000000036511416264345000210350ustar00rootroot00000000000000fun statusToString status = case status of Posix.Process.W_EXITED => "W_EXITED" | Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w] | Posix.Process.W_SIGNALED s => concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)] | Posix.Process.W_STOPPED s => concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)] val cmd = CommandLine.name () fun stdout () = TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n") fun exit () = Posix.Process.exit 0wx7 fun diverge () = diverge () fun test () = let fun spawn arg = let val _ = TextIO.flushOut (TextIO.stdOut) val _ = TextIO.flushOut (TextIO.stdErr) in MLton.Process.spawn {path = cmd, args = [cmd, arg]} end fun waitpid pid = let val (pid', status) = Posix.Process.waitpid (Posix.Process.W_CHILD pid, []) val () = if pid <> pid' then raise Fail "reap: pid <> pid'" else () in status end fun kill (pid, signal) = Posix.Process.kill (Posix.Process.K_PROC pid, signal) fun doTest (arg, withPid) = let val _ = print (concat ["testing ", arg, "...\n"]) val pid = spawn arg val () = withPid pid val status = waitpid pid val _ = print (concat ["exit_status: ", statusToString status, "\n"]) in () end fun doSimpleTest arg = doTest (arg, fn _ => ()) in print "spawn test:\n" ; doSimpleTest "stdout" ; doSimpleTest "exit" ; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill)) end val _ = case CommandLine.arguments () of [] => test () | ["stdout"] => stdout () | ["exit"] => exit () | ["diverge"] => diverge () | _ => raise Match mlton-20210117+dfsg/regression/testMatrix.ok000066400000000000000000000000541416264345000207040ustar00rootroot00000000000000{x = 1, y = 2, z = 3} {x = 3, y = 5, z = 7} mlton-20210117+dfsg/regression/testMatrix.sml000066400000000000000000000022511416264345000210670ustar00rootroot00000000000000 exception Error fun translateXYZ (translateX : real, translateY : real, translateZ : real) = ((1.0, 0.0, 0.0, translateX), (0.0, 1.0, 0.0, translateY), (0.0, 0.0, 1.0, translateZ), (0.0, 0.0, 0.0, 1.0)) fun transformPoint matr {x, y, z} = let val ((in00, in01, in02, in03), (in10, in11, in12, in13), (in20, in21, in22, in23), (in30, in31, in32, in33)) = matr val w = x * in30 + y * in31 + z * in32 + in33 in if Real.== (0.0, w) then raise Error else {x = ((in00 * x) + (in01 * y) + (in02 * z) + in03) / w, y = ((in10 * x) + (in11 * y) + (in12 * z) + in13) / w, z = ((in20 * x) + (in21 * y) + (in22 * z) + in23) / w} end fun Point3DToString {x, y, z} = "{x = " ^ (Real.toString x) ^ ", y = " ^ (Real.toString y) ^ ", z = " ^ (Real.toString z) ^ "}\n" val m = translateXYZ (2.0, 3.0, 4.0) val p = {x = 1.0, y = 2.0, z = 3.0} val _ = print (Point3DToString p) val p' = transformPoint m p val _ = print (Point3DToString p') mlton-20210117+dfsg/regression/testdyn1.ok000066400000000000000000000030661416264345000203210ustar00rootroot00000000000000Testing list operations: [rev, @, map]... Ok - rev... Ok - map... Ok - @... Testing string operations: [implode, explode, chr, ord, size]... Ok - int_to_string... Ok - implode... Ok - explode... Ok - chr... Ok - ord... Ok - Chr... Ok - Chr2... Ok - size... Testing ref [ref, :=, !]... Ok - !1... Ok - :=1... Ok - !2... Ok - :=2... Ok - !3... Testing polymorphic equality... Ok - equal... Ok - equal2... Ok - equal3... Ok - equal4... Ok - equal5 (ref1)... Ok - equal5 (ref2)... Ok - equal6 (dat k)... Ok - equal7 (dat k)... Testing arithmetic integer operations: [~, abs, floor, +, -, *, div, mod, <, >, <=, >=] ... Ok - ~1... Ok - ~2... Ok - abs1... Ok - abs2... Ok - floor1... Ok - floor2... Ok - floor3... Ok - +... Ok - -... Ok - *... Ok - intdivmod - 2 mod 3 = 2, 2 div 3 = 0... Ok - intdivmod - 34 mod ~3 = ~2, 34 div ~3 = ~12... Ok - intdivmod - 5 mod ~2 = ~1, 5 div ~2 = ~3... Ok - intdivmod - ~7 mod 3 = 2, ~7 div 3 = ~3... Ok - Div1... Ok - Div2... Ok - <1... Ok - <2... Ok - <3... Ok - >1... Ok - >2... Ok - >3... Ok - <=1... Ok - <=2... Ok - <=3... Ok - >=1... Ok - >=2... Ok - >=3... Testing arithmetic real operations: [+, -, *, /, ~, abs, real, sqrt, <, >, <=, >=] ... Ok - +... Ok - -... Ok - *... Ok - /... Ok - ~1... Ok - ~2... Ok - abs1... Ok - abs2... Ok - real1... Ok - real2... Ok - sqrt1... Ok - sqrt2... Ok - sqrt3... Ok - <1... Ok - <2... Ok - <3... Ok - >1... Ok - >2... Ok - >3... Ok - <=1... Ok - <=2... Ok - <=3... Ok - >=1... Ok - >=2... Ok - >=3... Testing composition o: Ok - o... Testing generative exceptions: Ok - exn - generative... End of test. mlton-20210117+dfsg/regression/testdyn1.sml000066400000000000000000000150441416264345000205020ustar00rootroot00000000000000(*testdyn1.sml*) (* ------------------------------------------------------------------- *) (* testdyn1, 08/02/1995 19:17, Martin *) (* Dynamic test of primitives... except for input/output *) (* ------------------------------------------------------------------- *) (* MEMO : 'sin', 'cos', 'arctan', 'ln' and 'exp' are not checked yet. *) infix == val epsilon = 0.000666 fun r1 == r2 = abs (r1 - r2) < epsilon (*no perfect world*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = if n >= 0 then implode(digits(n,[])) else "~" ^ int_to_string(~n) fun error b s = print ((if b then "Ok - " else "Error - ") ^ s ^ "...\n") (* testing stuff *) val _ = let val _ = print "Testing list operations:\n\ \ [rev, @, map]...\n" in error (rev [3,34,2,23] = [23,2,34,3]) "rev"; error (map (fn a:int => 2 * a) [3,34,2] = [6,68,4]) "map"; error ([34,56] @ [12,67] = [34,56,12,67]) "@" end val _ = let val _ = print "Testing string operations:\n\ \ [implode, explode, chr, ord, size]...\n" fun hds [] = #"-" | hds (x::_) = x in error (int_to_string 232 = "232") "int_to_string"; error (implode [#"h", #"e", #"l", #"l", #" "] = "hell ") "implode"; error (hds (explode "hello") = #"h") "explode"; error (chr 66 = #"B") "chr"; error (ord #"B" = 66) "ord"; error (((chr 1000) handle Chr => #"h") = #"h") "Chr"; error (((chr 1000) handle Div => #"h" | Chr => #"k") = #"k") "Chr2"; error (size "hello I'm 19 long.." = 19) "size" end val _ = let val _ = print "Testing ref [ref, :=, !]...\n" val a = ref "hello" val g = ref 45 in error (!a = "hello") "!1"; error ((a := "hej") = ()) ":=1"; error (!a = "hej") "!2"; error ((g := !g + 1) = ()) ":=2"; error (!g = 46) "!3" end val _ = let val _ = print "Testing polymorphic equality...\n" val a = [(34,"hejsa"), (4, "bw")] val b = [[3,23], [~34,23]] val c = (56, ref "hello") val d = ref "hej" datatype k = A of int * string | B | C of k * k val k1 = C (A(5,"hello"), B) val k2 = C (A(5,"hello2"), B) val k3 = C (A(5,"hello2"), B) in error (a = [(34,"hejsa"), (4, "bw")]) "equal"; error ((a = [(34,"hejsa"), (4, "cw")]) = false) "equal2"; error (b = [[3,23], [~34,23]]) "equal3"; error ((b = [[3,23], [~34,21]]) = false) "equal4"; error ((c = (56, ref "hello")) = false) "equal5 (ref1)"; error ((34,d) = (34,d)) "equal5 (ref2)"; error (k1 <> k2) "equal6 (dat k)"; error (k2 = k3) "equal7 (dat k)" end val _ = let val _ = print "Testing arithmetic integer operations:\n\ \ [~, abs, floor, +, -, *, div, mod, <, >, <=, >=] ...\n" fun checkdivmod (i, d) = let val (r, q) = (i mod d, i div d) val gt_zero = fn a => a > 0 in error (gt_zero r = gt_zero d andalso d * q + r = i) ("intdivmod - " ^ int_to_string i ^ " mod " ^ int_to_string d ^ " = " ^ int_to_string r ^ ", " ^ int_to_string i ^ " div " ^ int_to_string d ^ " = " ^ int_to_string q) end in error (~ 5 = ~5) "~1"; error (~ (~2) = 2) "~2"; error (abs 5 = 5) "abs1"; error (abs (~23) = 23) "abs2"; error (floor (23.23) = 23) "floor1"; error (floor (~23.23) = ~24) "floor2"; error (((floor (23.0E23)) handle Overflow => 4) = 4) "floor3"; error (23 + 12 = 35 andalso ~4 + 5 = 1) "+"; error (34 - 12 = 22 andalso ~23 - 15 = ~38) "-"; error (12 * 3 = 36 andalso ~23 * 2 = ~46) "*"; map checkdivmod [(2,3), (34, ~3), (5, ~2), (~7, 3)]; error (((3 div 0) handle Div => 60) = 60) "Div1"; error (((3 mod 0) handle Div => 45) = 45) "Div2"; error ((23 < 40) = true) "<1"; error ((54 < 40) = false) "<2"; error ((40 < 40) = false) "<3"; error ((23 > 40) = false) ">1"; error ((54 > 40) = true) ">2"; error ((40 > 40) = false) ">3"; error ((23 <= 40) = true) "<=1"; error ((54 <= 40) = false) "<=2"; error ((40 <= 40) = true) "<=3"; error ((23 >= 40) = false) ">=1"; error ((54 >= 40) = true) ">=2"; error ((40 >= 40) = true) ">=3" end val _ = let val _ = print "Testing arithmetic real operations:\n\ \ [+, -, *, /, ~, abs, real, sqrt, <, >, <=, >=] ...\n" in error (4.0 + 3.0 == 7.0) "+"; error (4.0 - 1.0 == 3.0) "-"; error (4.0 * 3.0 == 12.0) "*"; error (9.0 / 2.0 == 4.5) "/"; error (~ 5.3 == ~5.3) "~1"; error (~ (~2.23) == 2.23) "~2"; error (abs 5.23 == 5.23) "abs1"; error (abs (~23.12) == 23.12) "abs2"; error (real 5 == 5.0) "real1"; error (real ~5 == ~5.0) "real2"; error (Math.sqrt 0.0 == 0.0) "sqrt1"; error (Math.sqrt 2.0 > 1.4) "sqrt2"; error (Math.sqrt 2.0 < 1.5) "sqrt3"; error ((23.34 < 40.23) = true) "<1"; error ((54.12 < 40.45) = false) "<2"; error ((40.12 < 40.12) = false) "<3"; error ((23.34 > 40.12) = false) ">1"; error ((54.45 > 40.23) = true) ">2"; error ((40.23 > 40.23) = false) ">3"; error ((23.12 <= 40.34) = true) "<=1"; error ((54.23 <= 40.23) = false) "<=2"; error ((40.23 <= 40.23) = true) "<=3"; error ((23.75 >= 40.75) = false) ">=1"; error ((54.57 >= 40.57) = true) ">=2"; error ((40.23 >= 40.23) = true) ">=3" end val _ = let val _ = print "Testing composition o:\n" fun f x = 3 + x fun g y = (y, 2*y) in error ((g o f) 7 = (10,20)) "o" end val _ = let val _ = print "Testing generative exceptions:\n" fun g a = let fun f x = let exception E in if x < 1 then raise E else ((f (x-1)) handle E => 7) (* should not handle this.. *) end in (f a) handle _ => a end (* a *) in error (g 10 = 10) "exn - generative" end fun etst b s = if b then () else print ("Error - " ^ s ^ "...\n"); val _ = etst ("\u0041\u000a\\u0041\n" = "A\n\092" ^ "u0041\010") "backslash u does not work or somepin"; val _ = etst (map ord [#"a", #"A", #" ", chr 42, #"\117"] = [97, 65, 32, 42, 117]) "char problem, maybe #" val _ = print "End of test.\n" mlton-20210117+dfsg/regression/testdyn2.ok000066400000000000000000000001601416264345000203120ustar00rootroot00000000000000Testing [open_out, output, close_out] Testing [open_in, input, lookahead, end_of_stream, close_in] End of test. mlton-20210117+dfsg/regression/textio.2.ok000066400000000000000000000002371416264345000202170ustar00rootroot00000000000000basic test of writing and reading back all characters done test of writing files of all possible characters in strings of lengths 0-256 finished test finished mlton-20210117+dfsg/regression/textio.2.sml000066400000000000000000000030041416264345000203740ustar00rootroot00000000000000(* Notice: This test will not be passed on platforms like Win32! (due to behind-the-scenes CR/LF <=> LF conversions). *) val filename = OS.FileSys.tmpName () fun testRange (start, length) = let val allChars = CharVector.tabulate(length, fn i => chr ((i + start) mod 256)) val outStr = TextIO.openOut filename val _ = TextIO.output (outStr, allChars) val _ = TextIO.closeOut outStr val inStr = TextIO.openIn filename val readChars = TextIO.inputAll inStr val _ = TextIO.closeIn inStr val _ = OS.FileSys.remove filename fun testCharF (c, cnt) = let val readC = CharVector.sub(readChars, cnt) val _ = if c = readC then () else print ("Error at index: " ^ (Int.toString cnt) ^ ": " ^ (Char.toString c) ^ " <> " ^ (Char.toString readC) ^ "\n") in cnt + 1 end val _ = CharVector.foldl testCharF 0 allChars in () end val _ = testRange (0, 256) val _ = print "basic test of writing and reading back all characters done\n" val _ = List.tabulate(256, fn i => List.tabulate(257, fn i2 => testRange (i, i2))) val _ = print "test of writing files of all possible characters in strings of lengths 0-256 finished\n" val _ = List.tabulate(6, fn i => List.tabulate(5000, fn i2 => testRange (i, i2))) val _ = print "test finished\n" mlton-20210117+dfsg/regression/textio.ok000066400000000000000000000010731416264345000200560ustar00rootroot00000000000000Testing TextIO... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK Two lines of output follow: 1234 <--- this should read 1234 12345 <--- this should read 12345 test7a OK test7b OK test7c OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test9a OK test9b OK test9c OK test9d OK test9e OK test10 OK test11 OK test12a OK test12b OK test12c OK test12d OK Two lines of output follow: abcde <--- this should read abcde abcde <--- this should read abcde mlton-20210117+dfsg/regression/textio.sml000066400000000000000000000233211416264345000202400ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/textio.sml PS 1995-11-22, 1996-04-18 *) (*KILL 05/11/1997 11:03. tho.: use "auxil.sml"; *) val _ = print "Testing TextIO...\n"; local open TextIO fun fileSize s = let val is = openIn s in size (inputAll is) before closeIn is end; fun dup 0 s = s | dup n s = dup (n-1) (s^s) val longstring = dup 5 "abcdefg" (* was 16 but because `limit stack` = 8192 kbytes on frigg * I received a SIGSEGV for stack growth failure. *) in val empty = openOut "empty.dat"; val small = openOut "small1.dat"; val medium = openOut "medium.dat"; val text = openOut "text.dat"; val test1 = tst' "test1" (fn _ => (closeOut empty; fileSize "empty.dat" = 0 andalso fileSize "empty.dat" = 0)); val test2 = tst' "test2" (fn _ => (output1(small, #"+"); closeOut small; fileSize "small1.dat" = 1 andalso fileSize "small1.dat" = 1)); val test3 = tst' "test3" (fn _ => let val small = openOut "small2.dat" in output(small, "*"); closeOut small; fileSize "small2.dat" = 1 andalso fileSize "small2.dat" = 1 end); val test4 = tst' "test4" (fn _ => (output(medium, longstring); closeOut medium; fileSize "medium.dat" = size longstring andalso fileSize "medium.dat" = size longstring)) val test5 = tst' "test5" (fn _ => let val small = openAppend "small2.dat" in output(small, "1"); closeOut small; fileSize "small2.dat" = 2 andalso fileSize "small2.dat" = 2 end); val test6 = tst' "test6" (fn _ => (output(text, "Line 1\n"); output(text, "Line 2\n"); output(text, "Line 3"); closeOut text; fileSize "text.dat" = 20 andalso fileSize "text.dat" = 20)); (* Test that stdErr is flushed immediately, that flushOut works, and * that print flushes stdOut. Assumes that stdOut is *not* flushed * immediately: *) val _ = let fun stdo s = output(stdOut, s) fun stde s = output(stdErr, s) in print "Two lines of output follow:\n"; stdo "3"; stde "1"; stdo "4"; stde "2"; flushOut stdOut; stde " <--- this should read 1234\n"; stdo "2"; stde "1"; print "3"; stde "4"; stdo "5"; flushOut stdOut; stde " <--- this should read 12345\n" end; val test7a = tst' "test7a" (fn _ => let val is = openIn "empty.dat" in (endOfStream is andalso input1 is = NONE andalso endOfStream is andalso input1 is = NONE) before closeIn is end); val test7b = tst' "test7b" (fn _ => let val is = openIn "small1.dat" in (not (endOfStream is) andalso input1 is = SOME #"+" andalso endOfStream is andalso input1 is = NONE andalso input1 is = NONE) before closeIn is end); val test7c = tst' "test7c" (fn _ => let val is = openIn "small2.dat" in (not (endOfStream is) andalso input1 is = SOME #"*" andalso not (endOfStream is) andalso input1 is = SOME #"1" andalso endOfStream is andalso input1 is = NONE andalso input1 is = NONE) before closeIn is end); val test8a = tst' "test8a" (fn _ => let val is = openIn "empty.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "" andalso inputN(is, 100) = "" andalso endOfStream is) before closeIn is end); val test8b = tst' "test8b" (fn _ => let val is = openIn "small1.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "+" andalso inputN(is, 100) = "") before closeIn is end); val test8c = tst' "test8c" (fn _ => let val is = openIn "small1.dat" in (inputN(is, 0) = "" andalso inputN(is, 100) = "+" andalso inputN(is, 100) = "") before closeIn is end); val test8d = tst' "test8d" (fn _ => let val is = openIn "small2.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "*" andalso inputN(is, 100) = "1" andalso inputN(is, 100) = "") before closeIn is end); val test8e = tst' "test8e" (fn _ => let val is = openIn "medium.dat" in (inputN(is, 0) = "" andalso inputN(is, 15) = "abcdefgabcdefga" andalso inputN(is, 15) = "bcdefgabcdefgab" andalso inputN(is, 0) = "" andalso not (endOfStream is)) before closeIn is end); val test8f = tst' "test8f" (fn _ => let val is = openIn "medium.dat" in (inputN(is, 500000) = longstring andalso inputN(is, 100) = "" andalso endOfStream is) before closeIn is end); val test9a = tst' "test9a" (fn _ => let val is = openIn "empty.dat" in (lookahead is = NONE andalso input is = "" andalso lookahead is = NONE andalso input is = "") before closeIn is end); val test9b = tst' "test9b" (fn _ => let val is = openIn "small1.dat" in (lookahead is = SOME #"+" andalso input is = "+" andalso input is = "" andalso lookahead is = NONE) before closeIn is end); val test9c = tst' "test9c" (fn _ => let val is = openIn "small2.dat" in (lookahead is = SOME #"*" andalso input is = "*1" andalso input is = "" andalso lookahead is = NONE) before closeIn is end); val test9d = tst' "test9d" (fn _ => let val is = openIn "small2.dat" in (input is = "*1" andalso input is = "") before closeIn is end); val test9e = tst' "test9e" (fn _ => let val is = openIn "medium.dat" in lookahead is = SOME #"a" andalso String.substring(input is, 0, 15) = "abcdefgabcdefga" before closeIn is end); val test10 = tst' "test10" (fn _ => let val is = openIn "medium.dat" in (lookahead is = SOME #"a" andalso input1 is = SOME #"a" andalso lookahead is = SOME #"b" andalso input1 is = SOME #"b" andalso lookahead is = SOME #"c") before closeIn is end); val test11 = tst' "test11" (fn _ => let val is = openIn "medium.dat" in (lookahead is = SOME #"a" andalso inputN(is, 5) = "abcde" andalso lookahead is = SOME #"f" andalso inputN(is, 4) = "fgab" andalso lookahead is = SOME #"c") before closeIn is end); val test12a = tst' "test12a" (fn _ => let val is = openIn "empty.dat" in (inputLine is = NONE andalso inputLine is = NONE) before closeIn is end); val test12b = tst' "test12b" (fn _ => let val is = openIn "small1.dat" in (inputLine is = SOME "+\n" andalso inputLine is = NONE) before closeIn is end); val test12c = tst' "test12c" (fn _ => let val is = openIn "text.dat" in (inputLine is = SOME "Line 1\n" andalso inputLine is = SOME "Line 2\n" andalso inputLine is = SOME "Line 3\n" andalso inputLine is = NONE) before closeIn is end); val test12d = tst' "test12d" (fn _ => let val is = openIn "medium.dat" in (inputLine is = SOME (longstring ^ "\n") andalso inputLine is = NONE) before closeIn is end); (* Test that outputSubstr works *) val _ = let fun stdo s i n = outputSubstr(stdOut, Substring.substring(s, i, n)) fun stde s = output(stdErr, s) val abcde = "abcde" in print "Two lines of output follow:\n"; stdo abcde 0 1; stdo abcde 1 3; stdo "" 0 0; stdo abcde 0 0; stdo abcde 5 0; stdo abcde 3 0; stdo abcde 4 1; flushOut stdOut; stde " <--- this should read abcde\n"; stdo abcde 0 5; flushOut stdOut; stde " <--- this should read abcde\n" end; end mlton-20210117+dfsg/regression/thread-switch-share.ok000066400000000000000000000000511416264345000224030ustar00rootroot00000000000000size1 >= size2 = true sum1 = sum2 = true mlton-20210117+dfsg/regression/thread-switch-share.sml000066400000000000000000000017661416264345000226030ustar00rootroot00000000000000(* Access the current stack in the heap via a MLton.share object trace. *) val rt : MLton.Thread.Runnable.t option ref = ref NONE fun stats () = let val () = MLton.share rt in () end fun switcheroo () = MLton.Thread.switch (fn t => let val () = rt := SOME (MLton.Thread.prepare (t, ())) val () = stats () in valOf (!rt) end) (* tuple option array *) val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun touch () = let val size = MLton.size a val sum = Array.foldr (fn (NONE,sum) => sum | (SOME (a, b),sum) => a + b + sum) 0 a in (size, sum) end val (size1,sum1) = touch () val () = switcheroo () val (size2,sum2) = touch () val _ = print (concat ["size1 >= size2 = ", Bool.toString (size1 >= size2), "\n"]) val _ = print (concat ["sum1 = sum2 = ", Bool.toString (sum1 >= sum2), "\n"]) mlton-20210117+dfsg/regression/thread-switch-size.ok000066400000000000000000000000171416264345000222550ustar00rootroot00000000000000!rs > 0 = true mlton-20210117+dfsg/regression/thread-switch-size.sml000066400000000000000000000010501416264345000224350ustar00rootroot00000000000000(* Access the current stack in the heap via a MLton.size object trace. *) val rt : MLton.Thread.Runnable.t option ref = ref NONE val rs : IntInf.int ref = ref 0 fun stats () = let val () = rs := MLton.size rt in () end fun switcheroo () = MLton.Thread.switch (fn t => let val () = rt := SOME (MLton.Thread.prepare (t, ())) val () = stats () in valOf (!rt) end) val () = switcheroo () val _ = print (concat ["!rs > 0 = ", Bool.toString (!rs > 0), "\n"]) mlton-20210117+dfsg/regression/thread-switch.ok000066400000000000000000000000031416264345000213000ustar00rootroot00000000000000ok mlton-20210117+dfsg/regression/thread-switch.sml000066400000000000000000000016641416264345000215000ustar00rootroot00000000000000(* * On my 400MhZ system, thread-switch 10000000 takes 4.98s, which comes out to * 2,008,032 switches per second. *) structure Main = struct type int = Int.int open MLton open Thread datatype t = T of (int * t) Thread.t val done: Thread.Runnable.t option ref = ref NONE fun loop (n: int, T t): unit = if n = 0 then switch (fn _ => valOf (!done)) else let val (n, t) = switch (fn t' => prepare (t, (n - 1, T t'))) in loop(n, t) end fun main () = let val numSwitches = case CommandLine.arguments () of [] => 1000 | s :: _ => valOf (Int.fromString s) in switch (fn cur => (done := SOME (prepare (cur, ())) ; prepare (new loop, (numSwitches, T (new loop))))) ; print "ok\n" end end val _ = Main.main () (* SMLofNJ.exportFn * ("thread-switch", fn _ => (Main.main(); OS.Process.success)) *) mlton-20210117+dfsg/regression/thread0.ok000066400000000000000000000000601416264345000200640ustar00rootroot000000000000001 succeeded 2 succeeded 3 succeeded 4 succeeded mlton-20210117+dfsg/regression/thread0.sml000066400000000000000000000013351416264345000202540ustar00rootroot00000000000000open MLton.Thread val _ = if 13 = 1 + switch(fn t => prepare (t, 12)) then print "1 succeeded\n" else () val _ = if 13 = 1 + switch(fn t => prepare (new(fn () => switch(fn _ => prepare (t, 12))), ())) then print "2 succeeded\n" else () val _ = if 13 = switch(fn t => prepare (prepend(t, fn n => n + 1), 12)) then print "3 succeeded\n" else () val _ = if 13 = switch(fn t => prepare (new(fn () => let val t = prepend(t, fn n => n + 1) in switch(fn _ => prepare (t, 12)) end), ())) then print "4 succeeded\n" else () mlton-20210117+dfsg/regression/thread1.ok000066400000000000000000000000751416264345000200730ustar00rootroot0000000000000010 8 6 4 2 9 7 5 3 1 8 6 4 2 7 5 3 1 6 4 2 5 3 1 4 2 3 1 2 1 mlton-20210117+dfsg/regression/thread1.sml000066400000000000000000000042561416264345000202620ustar00rootroot00000000000000structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new() = T{front = ref [], back = ref []} fun enque(T{back, ...}, x) = back := x :: !back fun deque(T{front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open MLton open Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new() in fun ready (t: Thread.Runnable.t) : unit = Queue.enque(threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf(!topLevel) | SOME t => t end fun 'a exit(): 'a = switch(fn _ => next()) fun new(f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f() handle _ => exit()) ; exit())), ()) fun schedule t = (ready t; next()) fun yield(): unit = switch(fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun run(): unit = (switch(fn t => (topLevel := SOME (Thread.prepare (t, ())) ; next())) ; topLevel := NONE) end val rec loop = fn 0 => () | n => (print(concat[Int.toString n, "\n"]) ; Thread.yield() ; loop(n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn(fn () => loop n); loop'(n - 2)) val _ = Thread.spawn(fn () => loop' 10) val _ = Thread.run() mlton-20210117+dfsg/regression/thread2.ok000066400000000000000000000000101416264345000200610ustar00rootroot00000000000000success mlton-20210117+dfsg/regression/thread2.sml000066400000000000000000000050141416264345000202540ustar00rootroot00000000000000structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open Posix.Signal open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t = Queue.enque (threads, t) fun next () = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 20))))) ; setItimer Time.zeroTime ; ignore alrm ; topLevel := NONE) end val rec delay = fn 0 => () | n => delay (n - 1) val rec loop = fn 0 => () | n => (delay 500000; loop (n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn (fn () => loop n); loop' (n - 1)) val _ = Thread.spawn (fn () => loop' 10) val _ = Thread.run () val _ = print "success\n" mlton-20210117+dfsg/regression/time.ok000066400000000000000000000006761416264345000175100ustar00rootroot00000000000000 File time.sml: Testing structure Time... test1 OK test2a OK test2b OK test2c OK test2d OK test2e OK test3a OK test3b OK test3c OK test4a OK test6a OK test7a OK test8a OK test9a OK test9b OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10b OK test10b OK test10b OK mlton-20210117+dfsg/regression/time.sml000066400000000000000000000073251416264345000176700ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/time.sml PS 1995-03-23 *) val _ = print "\nFile time.sml: Testing structure Time...\n" local fun fib n = if n<2 then 1 else fib(n-1) + fib(n-2); open Time val bigt = fromSeconds 987654321 + fromMicroseconds 500012; val litt = fromSeconds 454 + fromMicroseconds 501701 val test1 = tst' "test1" (fn _ => zeroTime + bigt = bigt andalso bigt - zeroTime = bigt); val test2a = tst' "test2a" (fn _ => toSeconds zeroTime = 0 andalso zeroTime = fromSeconds 0 andalso zeroTime = fromMilliseconds 0 andalso zeroTime = fromMicroseconds 0); val test2b = tst' "test2b" (fn _ => toSeconds bigt = 987654321 andalso toSeconds litt = 454 andalso toMilliseconds litt = 454501 andalso toMicroseconds litt = 454501701); val test2c = tst0 "test2c" ((fromSeconds ~1 seq "OK") handle _ => "WRONG") val test2d = tst0 "test2d" ((fromMilliseconds ~1 seq "OK") handle _ => "WRONG") val test2e = tst0 "test2e" ((fromMicroseconds ~1 seq "OK") handle _ => "WRONG") val test3a = tst' "test3a" (fn _ => fromReal 0.0 = zeroTime andalso fromReal 10.25 = fromSeconds 10 + fromMilliseconds 250); val test3b = tst0 "test3b" ((fromReal ~1.0 seq "OK") handle _ => "WRONG") val test3c = tst0 "test3c" ((fromReal 1E300 seq "OK") handle Time => "OK" | _ => "WRONG") val test4a = tst' "test4a" (fn _ => Real.==(toReal (fromReal 100.25), 100.25)); val test6a = tst' "test6a" (fn _ => bigt + litt = litt + bigt andalso (bigt + litt) - litt = bigt andalso (bigt - litt) + litt = bigt); val test7a = tst' "test7a" (fn _ => litt <= litt andalso litt >= litt andalso zeroTime < litt andalso litt > zeroTime andalso litt < bigt andalso bigt > litt andalso not (litt > bigt) andalso not (bigt < litt) andalso not(litt < litt) andalso not(litt > litt)); val test8a = tst' "test8a" (fn _ => now() <= now() andalso (now () before fib 27 seq ()) <= now()); val test9a = tst' "test9a" (fn _ => fmt 0 litt = "455") val test9b = tst' "test9b" (fn _ => fmt 1 litt = "454.5" andalso fmt 2 litt = "454.50" andalso fmt 3 litt = "454.502" andalso fmt 4 litt = "454.5017" andalso fmt 5 litt = "454.50170" andalso fmt 6 litt = "454.501701"); fun chk (s, r) = tst' "test10a" (fn _ => case fromString s of SOME res => res = fromMicroseconds r | NONE => false) val test10a = List.map chk [("189", 189000000), ("189.1", 189100000), ("189.125125", 189125125), (".1", 100000), (".125125", 125125), (" \n\t189crap", 189000000), (" \n\t189.1crap", 189100000), (" \n\t189.125125crap", 189125125), (" \n\t.1crap", 100000), (" \n\t.125125crap", 125125)]; val test10b = List.app (fn s => tst0 "test10b" (case fromString s of NONE => "OK" | _ => "WRONG")) ["", "now", "Monday"]; in end mlton-20210117+dfsg/regression/time2.ok000066400000000000000000000000141416264345000175540ustar00rootroot00000000000000OK OK OK OK mlton-20210117+dfsg/regression/time2.sml000066400000000000000000000007461416264345000177520ustar00rootroot00000000000000open Time val _ = if 1000000000000 = toMilliseconds (fromSeconds 1000000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000000 = toMicroseconds (fromSeconds 1000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000 = toSeconds (fromMilliseconds 1000000000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000 = toSeconds (fromMicroseconds 1000000000000000) then print "OK\n" else print "ERROR\n" mlton-20210117+dfsg/regression/time3.ok000066400000000000000000000001611416264345000175600ustar00rootroot000000000000000.000 123.457 123 123.5 123.46 123.457 123.4568 123.45679 123.456789 123.4567890 123.457 123.000 123.456 123.457 mlton-20210117+dfsg/regression/time3.sml000066400000000000000000000005521416264345000177460ustar00rootroot00000000000000open Time fun pt t = (print(toString t) ; print "\n") val messy = fromReal 123.456789 val _ = (pt zeroTime; pt messy; app (fn d => (print(fmt d messy) ; print "\n")) [0,1,2,3,4,5,6,7]; pt(fromReal 123.456789); pt(fromSeconds 123); pt(fromMilliseconds 123456); pt(fromMicroseconds 123456789) ) mlton-20210117+dfsg/regression/time4.ok000066400000000000000000000000641416264345000175630ustar00rootroot000000000000000.417 0.999 0.417 0.999 ~0.417 ~0.999 ~0.417 ~0.999 mlton-20210117+dfsg/regression/time4.sml000066400000000000000000000013101416264345000177400ustar00rootroot00000000000000 val t = valOf (Time.fromString "0.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "0.999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString ".417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString ".999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~0.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~0.999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~.999") val () = print (concat [Time.toString t, "\n"]) mlton-20210117+dfsg/regression/timeout.ok000066400000000000000000000000101416264345000202160ustar00rootroot00000000000000success mlton-20210117+dfsg/regression/timeout.sml000066400000000000000000000021651416264345000204150ustar00rootroot00000000000000open MLton MLton.Signal fun timeLimit (t: Time.time, f: unit -> 'a): 'a option = let val which = Itimer.Real val signal = Itimer.signal which val res = Thread.switch (fn cur: 'a option Thread.t => let val _ = setHandler (signal, Handler.handler (fn _ => Thread.prepare (cur, NONE))) val _ = Itimer.set (which, {value = t, interval = Time.zeroTime}) val t = Thread.new (fn () => let val res = SOME (f ()) handle _ => NONE in Thread.switch (fn _ => Thread.prepare (cur, res)) end) in Thread.prepare (t, ()) end) val _ = setHandler (signal, Handler.default) in res end val _ = case timeLimit (Time.fromSeconds 10, let fun loop () = loop () in loop end) of NONE => print "success\n" | SOME _ => print "failure\n" mlton-20210117+dfsg/regression/timer.ok000066400000000000000000000001401416264345000176540ustar00rootroot00000000000000 File timer.sml: Testing structure Timer... test1 OK test2 OK test3 OK test4 OK mlton-20210117+dfsg/regression/tststrcmp.ok000066400000000000000000000470001416264345000206050ustar00rootroot000000000000001 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12 ok 13 ok 14 ok 15 ok 16 ok 17 ok 18 ok 19 ok 20 ok 21 ok 22 ok 23 ok 24 ok 25 ok 26 ok 27 ok 28 ok 29 ok 30 ok 31 ok 32 ok 33 ok 34 ok 35 ok 36 ok 37 ok 38 ok 39 ok 40 ok 41 ok 42 ok 43 ok 44 ok 45 ok 46 ok 47 ok 48 ok 49 ok 50 ok 51 ok 52 ok 53 ok 54 ok 55 ok 56 ok 57 ok 58 ok 59 ok 60 ok 61 ok 62 ok 63 ok 64 ok 65 ok 66 ok 67 ok 68 ok 69 ok 70 ok 71 ok 72 ok 73 ok 74 ok 75 ok 76 ok 77 ok 78 ok 79 ok 80 ok 81 ok 82 ok 83 ok 84 ok 85 ok 86 ok 87 ok 88 ok 89 ok 90 ok 91 ok 92 ok 93 ok 94 ok 95 ok 96 ok Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. mlton-20210117+dfsg/regression/tststrcmp.sml000066400000000000000000000144131416264345000207710ustar00rootroot00000000000000(*tststrcmp.sml 27/06/1997 17:21. tho.*) (*test <, etc. on strings*) fun pr s = print s; fun prl s = pr (s ^ "\n"); local fun string' 0 = "0" | string' 1 = "1" | string' 2 = "2" | string' 3 = "3" | string' 4 = "4" | string' 5 = "5" | string' 6 = "6" | string' 7 = "7" | string' 8 = "8" | string' 9 = "9" | string' n = string' (n div 10) ^ string' (n mod 10) in fun int_to_string n = if n < 0 then "~" ^ string' (~n) else string' n end local val r = ref 0 in fun etst s e1 e2 = prl (int_to_string (r := !r + 1; !r) ^ (if e1 = e2 then " ok" else " * n o t o k ! *")) end val () = etst "1" ("" < "abc") true; (*den ene tom*) val () = etst "2" ("" > "abc") false; val () = etst "2" ("" >= "abc") false; val () = etst "2" ("" <= "abc") true; val () = etst "2" ("" = "abc") false; val () = etst "2" ("" <> "abc") true; val () = etst "3" ("abc" < "") false; (*den anden tom*) val () = etst "4" ("abc" > "") true; val () = etst "4" ("abc" >= "") true; val () = etst "4" ("abc" <= "") false; val () = etst "4" ("abc" = "") false; val () = etst "4" ("abc" <> "") true; val () = etst "5" ("abc" < "abc") false; (*ens*) val () = etst "6" ("abc" > "abc") false; val () = etst "6" ("abc" >= "abc") true; val () = etst "6" ("abc" <= "abc") true; val () = etst "6" ("abc" = "abc") true; val () = etst "6" ("abc" <> "abc") false; val () = etst "5" ("" < "") false; (*begge tomme*) val () = etst "6" ("" > "") false; val () = etst "6" ("" >= "") true; val () = etst "6" ("" <= "") true; val () = etst "6" ("" = "") true; val () = etst "6" ("" <> "") false; val () = etst "7" ("abc" < "abcd") true; (*den ene lngere*) val () = etst "8" ("abc" > "abcd") false; val () = etst "8" ("abc" >= "abcd") false; val () = etst "8" ("abc" <= "abcd") true; val () = etst "8" ("abc" = "abcd") false; val () = etst "8" ("abc" <> "abcd") true; val () = etst "-" ("abcd" < "abc") false; (*den anden lngere*) val () = etst "-" ("abcd" > "abc") true; val () = etst "-" ("abcd" >= "abc") true; val () = etst "-" ("abcd" <= "abc") false; val () = etst "-" ("abcd" = "abc") false; val () = etst "-" ("abcd" <> "abc") true; val () = etst "-" ("abc" < "abd") true; (*lige lange, sidste strst*) val () = etst "-" ("abc" > "abd") false; val () = etst "-" ("abc" >= "abd") false; val () = etst "-" ("abc" <= "abd") true; val () = etst "-" ("abc" = "abd") false; val () = etst "-" ("abc" <> "abd") true; val () = etst "-" ("abd" < "abc") false; (*lige lange, frste strst*) val () = etst "-" ("abd" > "abc") true; val () = etst "-" ("abd" >= "abc") true; val () = etst "-" ("abd" <= "abc") false; val () = etst "-" ("abd" = "abc") false; val () = etst "-" ("abd" <> "abc") true; (*& nu hele molevitten igen bare med meget lange strenge. Det er godt nok strenge...*) fun repeat 0 s = "" | repeat n s = s ^ repeat (n-1) s val long = repeat 50 "Der laa den Ridder i Graesset og drev.\n\ \Hejsa, nu sadler vi af.\n\ \Der laa hans Harnisk, hans Skjold og Vaerge,\n\ \Hans Tanker de floej over alle Bjerge.\n\ \De floej paa Skyer gennem Luften den blaa ---\n\ \Den Rejse man bruger ej Vaaben paa.\n\ \\n\ \Den Ridder han laa, hvor han steded sig foerst\n\ \Han kendte ej Sult, han kendte ej Toerst\n\ \Og Solen kom og Stedet og gik;\n\ \Han lytted som efter en sagte Musik.\n\ \\n\ \\n" val () = etst "1" (long ^ "" < long ^ "abc") true; (*den ene tom*) val () = etst "2" (long ^ "" > long ^ "abc") false; val () = etst "2" (long ^ "" >= long ^ "abc") false; val () = etst "2" (long ^ "" <= long ^ "abc") true; val () = etst "2" (long ^ "" = long ^ "abc") false; val () = etst "2" (long ^ "" <> long ^ "abc") true; val () = etst "3" (long ^ "abc" < long ^ "") false; (*den anden tom*) val () = etst "4" (long ^ "abc" > long ^ "") true; val () = etst "4" (long ^ "abc" >= long ^ "") true; val () = etst "4" (long ^ "abc" <= long ^ "") false; val () = etst "4" (long ^ "abc" = long ^ "") false; val () = etst "4" (long ^ "abc" <> long ^ "") true; val () = etst "5" (long ^ "abc" < long ^ "abc") false; (*ens*) val () = etst "6" (long ^ "abc" > long ^ "abc") false; val () = etst "6" (long ^ "abc" >= long ^ "abc") true; val () = etst "6" (long ^ "abc" <= long ^ "abc") true; val () = etst "6" (long ^ "abc" = long ^ "abc") true; val () = etst "6" (long ^ "abc" <> long ^ "abc") false; val () = etst "5" (long ^ "" < long ^ "") false; (*begge tomme*) val () = etst "6" (long ^ "" > long ^ "") false; val () = etst "6" (long ^ "" >= long ^ "") true; val () = etst "6" (long ^ "" <= long ^ "") true; val () = etst "6" (long ^ "" = long ^ "") true; val () = etst "6" (long ^ "" <> long ^ "") false; val () = etst "7" (long ^ "abc" < long ^ "abcd") true; (*den ene lngere*) val () = etst "8" (long ^ "abc" > long ^ "abcd") false; val () = etst "8" (long ^ "abc" >= long ^ "abcd") false; val () = etst "8" (long ^ "abc" <= long ^ "abcd") true; val () = etst "8" (long ^ "abc" = long ^ "abcd") false; val () = etst "8" (long ^ "abc" <> long ^ "abcd") true; val () = etst "-" (long ^ "abcd" < long ^ "abc") false; (*den anden lngere*) val () = etst "-" (long ^ "abcd" > long ^ "abc") true; val () = etst "-" (long ^ "abcd" >= long ^ "abc") true; val () = etst "-" (long ^ "abcd" <= long ^ "abc") false; val () = etst "-" (long ^ "abcd" = long ^ "abc") false; val () = etst "-" (long ^ "abcd" <> long ^ "abc") true; val () = etst "-" (long ^ "abc" < long ^ "abd") true; (*lige lange, sidste strst*) val () = etst "-" (long ^ "abc" > long ^ "abd") false; val () = etst "-" (long ^ "abc" >= long ^ "abd") false; val () = etst "-" (long ^ "abc" <= long ^ "abd") true; val () = etst "-" (long ^ "abc" = long ^ "abd") false; val () = etst "-" (long ^ "abc" <> long ^ "abd") true; val () = etst "-" (long ^ "abd" < long ^ "abc") false; (*lige lange, frste strst*) val () = etst "-" (long ^ "abd" > long ^ "abc") true; val () = etst "-" (long ^ "abd" >= long ^ "abc") true; val () = etst "-" (long ^ "abd" <= long ^ "abc") false; val () = etst "-" (long ^ "abd" = long ^ "abc") false; val () = etst "-" (long ^ "abd" <> long ^ "abc") true; val _ = prl long; mlton-20210117+dfsg/regression/type-check.sml000066400000000000000000000032631416264345000207630ustar00rootroot00000000000000(* This example is interesting because at the time of generalization of f, the * tyvar 'a is in scope, but does not appear in type types of any of the * variables in the environment (x's type has not yet been determined to be 'a). * Nevertheless, it is essential to not generalize 'a at g *) val 'a f = fn x => let exception E of 'a fun g (E y) = y | g _ = raise Fail "bug" in E x end (* This example is interesting because it binds a type variable at a scope where * the type variable does not appear in the type. Nevertheless, it is essential * to keep the type variable there, because it occurs in an inner scope. *) fun 'a f () = let val x: 'a = raise Fail "bug" in () end (* This example shows that type variables can be rebound in nested datatype * declarations, unlike the situation for nested value declarations. *) val 'a x = fn () => let datatype 'a t = T of 'a in () end (* This example verifies that datatype replication is allowed, even when the * right-hand side isn't a datatype. *) type 'a t = 'a * 'a datatype u = datatype t val _: int u = (13, 14); (* The following examples demonstrate acceptable forms of type variable scoping. *) fun f (x: 'a) = let fun g (y: 'a) = y in () end fun f (x: 'a) = let fun 'b g (y: 'b) = y in () end fun 'a f (x: 'a) = let fun g (y: 'a) = y in () end fun 'a f (x: 'a) = let fun 'b g (y: 'b) = y in () end val 'a x = fn () => let datatype 'a t = T of 'a in () end (* This example confirms that bools can be used as labels. *) val {false = x, ...} = {false = 13}; mlton-20210117+dfsg/regression/typespec.ok000066400000000000000000000000001416264345000203630ustar00rootroot00000000000000mlton-20210117+dfsg/regression/typespec.sml000066400000000000000000000003501416264345000205550ustar00rootroot00000000000000(* typespec.sml *) (* Checks scoping of definitional type specifications. *) type t = int signature S = sig type t = bool and u = t end structure X : S = struct type t = bool and u = bool end; mlton-20210117+dfsg/regression/unary.2.ok000066400000000000000000000000001416264345000200250ustar00rootroot00000000000000mlton-20210117+dfsg/regression/unary.2.sml000066400000000000000000000004301416264345000202160ustar00rootroot00000000000000datatype num = Z | S of num val rec plus = fn (n, Z) => n | (n, S m) => S (plus (n,m)) val rec times = fn (_, Z) => Z | (n, S m) => plus (n, times (n,m)) val rec fact = fn Z => S Z | n as S m => times (n, fact m) val x = fact (S (S (S Z))) mlton-20210117+dfsg/regression/unary.ok000066400000000000000000000000001416264345000176650ustar00rootroot00000000000000mlton-20210117+dfsg/regression/unary.sml000066400000000000000000000006711416264345000200650ustar00rootroot00000000000000datatype num = Z | S of num val rec plus = fn (n, Z) => n | (n, S m) => S (plus (n,m)) val zero = Z val one = S Z val two = plus (one,one) val rec times = fn (_, Z) => Z | (n, S m) => plus (n, times (n,m)) val square = fn n => times (n,n) val four = square two val sixteen = square four val two56 = square sixteen val rec fib = fn Z => Z | S Z => S Z | S (S n) => plus (fib (S n), fib n) val x = fib (S Z) mlton-20210117+dfsg/regression/undetermined.ok000066400000000000000000000000001416264345000212120ustar00rootroot00000000000000mlton-20210117+dfsg/regression/undetermined.sml000066400000000000000000000015151416264345000214100ustar00rootroot00000000000000(* undetermined.sml *) (* Checks inference for non-generalised types (aka "free type variables"). *) val f = (fn x => x) (fn x => x) structure A = struct end val y = f 7 ; structure A: sig val f: int -> int end = struct val f = (fn x => x) (fn x => x) end ; structure A : sig val a : int list ref end = struct val a = ref nil end ; val x = ref nil val _ = 1 :: !x ; ; ; val _ = let val x = ref nil val _ = 1 :: !x in () end ; (* 2.sml *) val id = (fn x => x) (fn x => x) val _ = id 13 ; structure X = struct val id = (fn x => x) (fn x => x) val _ = id 13 end ; (* 4.sml *) datatype t = T val id = (fn x => x) (fn x => x) val _ = id T ; (* 5.sml *) local val id = (fn x => x) (fn x => x) in val _ = id 13 end ; (* 7.sml *) val id = (fn x => x) (fn x => x) val _ = id 13 val id = () ; mlton-20210117+dfsg/regression/unixpath.ok000066400000000000000000000015521416264345000204040ustar00rootroot00000000000000 File unixpath.sml: Testing structure Path... test1a OK test1b OK test1c OK test1d OK test1e OK test1f OK test1g OK test1h OK test1i OK test1j OK test1k OK test1l OK test1m OK test1n OK test2a OK test2b OK test2c OK test2d OK test2e OK test2f OK test2g OK test2h OK test2i OK test2j OK test2k OK test2l OK test2m OK test2n OK test2o OK test2p OK test3b OK test3c OK test3d OK test3e OK test3f OK test3g OK test3h OK test4a OK test4b OK test5a OK test6a OK test6b OK test7a OK test7b OK test7c OK test8a OK test8b OK test8c OK test9a OK test10a OK test11a OK test12 OK test13 OK test14 OK test15 OK test16 OK test17 OK test18 OK test19 OK mlton-20210117+dfsg/regression/unixpath.sml000066400000000000000000000362221416264345000205700ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/unixpath.sml 6 -- for Unix, 1995-05-23 *) val _ = print "\nFile unixpath.sml: Testing structure Path...\n" local open OS.Path val test1a = tst' "test1a" (fn _ => fromString "" = {isAbs=false, vol = "", arcs = []}); val test1b = tst' "test1b" (fn _ => fromString "/" = {isAbs=true, vol="", arcs=[""]}); val test1c = tst' "test1c" (fn _ => fromString "//" = {isAbs=true, vol="", arcs=["", ""]}); val test1d = tst' "test1d" (fn _ => fromString "a" = {isAbs=false, vol = "", arcs = ["a"]}); val test1e = tst' "test1e" (fn _ => fromString "/a" = {isAbs=true, vol="", arcs=["a"]}); val test1f = tst' "test1f" (fn _ => fromString "//a" = {isAbs=true, vol="", arcs=["","a"]}); val test1g = tst' "test1g" (fn _ => fromString "a/" = {isAbs=false, vol = "", arcs = ["a", ""]}); val test1h = tst' "test1h" (fn _ => fromString "a//" = {isAbs=false, vol = "", arcs = ["a", "", ""]}); val test1i = tst' "test1i" (fn _ => fromString "a/b" = {isAbs=false, vol = "", arcs = ["a", "b"]}); val test1j = tst' "test1j" (fn _ => fromString "a.b/c" = {isAbs=false, vol = "", arcs = ["a.b", "c"]}); val test1k = tst' "test1k" (fn _ => fromString "a.b/c/" = {isAbs=false, vol = "", arcs = ["a.b", "c", ""]}); val test1l = tst' "test1l" (fn _ => fromString "a/./c" = {isAbs=false, vol = "", arcs = ["a", ".", "c"]}); val test1m = tst' "test1m" (fn _ => fromString "a/../c" = {isAbs=false, vol = "", arcs = ["a", "..", "c"]}); val test1n = tst' "test1n" (fn _ => fromString "." = {isAbs=false, vol = "", arcs = ["."]}); val test2a = tst' "test2a" (fn _ => toString {isAbs=false, vol = "", arcs = []} = ""); val test2b = tst' "test2b" (fn _ => toString {isAbs=true, vol="", arcs=[]} = "/"); val test2c = tst' "test2c" (fn _ => toString {isAbs=true, vol="", arcs=["", ""]} = "//"); val test2d = tst' "test2d" (fn _ => toString {isAbs=false, vol = "", arcs = ["a"]} = "a"); val test2e = tst' "test2e" (fn _ => toString {isAbs=true, vol="", arcs=["a"]} = "/a"); val test2f = tst' "test2f" (fn _ => toString {isAbs=true, vol="", arcs=["","a"]} = "//a"); val test2g = tst' "test2g" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", ""]} = "a/"); val test2h = tst' "test2h" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "", ""]} = "a//"); val test2i = tst' "test2i" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "b"]} = "a/b"); val test2j = tst' "test2j" (fn _ => toString {isAbs=false, vol = "", arcs = ["a.b", "c"]} = "a.b/c"); val test2k = tst' "test2k" (fn _ => toString {isAbs=false, vol = "", arcs = ["a.b", "c", ""]} = "a.b/c/"); val test2l = tst' "test2l" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", ".", "c"]} = "a/./c"); val test2m = tst' "test2m" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "..", "c"]} = "a/../c"); val test2n = tst' "test2n" (fn _ => toString {isAbs=true, vol="", arcs=["a", "..", "c"]} = "/a/../c"); val test2o = tst0 "test2o" ((toString {isAbs=false, vol = "", arcs = ["", "a"]} seq "WRONG") handle Path => "OK" | _ => "WRONG") val test2p = tst0 "test2p" ((toString {isAbs=true, vol = "C:", arcs = ["windows"]} seq "WRONG") handle Path => "OK" | _ => "WRONG") val test3b = tst' "test3b" (fn _ => getVolume "/" = ""); val test3c = tst' "test3c" (fn _ => getVolume "//" = ""); val test3d = tst' "test3d" (fn _ => getVolume "a//b/c/" = ""); val test3e = tst' "test3e" (fn _ => getVolume "./" = ""); val test3f = tst' "test3f" (fn _ => getVolume "../" = ""); val test3g = tst' "test3g" (fn _ => getVolume "" = ""); val test3h = tst' "test3h" (fn _ => getVolume "C:" = ""); val test4a = tst' "test4a" (fn _ => List.all isRelative ["", ".", "..", "a//"] andalso not (List.exists isRelative ["/", "/a", "//"])); val test4b = tst' "test4b" (fn _ => List.all isAbsolute ["/", "/a", "//", "/.", "/.."] andalso not (List.exists isAbsolute ["", ".", "..", "a//"])); val test5a = tst' "test5a" (fn _ => getParent "/" = "/" andalso getParent "a" = "." andalso getParent "a/" = "a/.." andalso getParent "a///" = "a///.." andalso getParent "a/b" = "a" andalso getParent "a/b/" = "a/b/.." andalso getParent "/a/b" = "/a" andalso getParent "/a/b/" = "/a/b/.." andalso getParent ".." = "../.." andalso getParent "." = ".." andalso getParent "../" = "../.." andalso getParent "./" = "./.." andalso getParent "" = ".."); val test6a = tst' "test6a" (fn _ => concat("a", "b") = "a/b" andalso concat("a", "b/c") = "a/b/c" andalso concat("/", "b/c") = "/b/c" andalso concat("", "b/c") = "b/c" andalso concat("/a", "b/c") = "/a/b/c" andalso concat("a/", "b/c") = "a/b/c" andalso concat("a//", "b/c") = "a//b/c" andalso concat(".", "b/c") = "./b/c" andalso concat("a/b", "..") = "a/b/.." andalso concat("a/b", "../c") = "a/b/../c"); val test6b = tst0 "test6b" ((concat ("a", "/b") seq "WRONG") handle Path => "OK" | _ => "WRONG") val mkAbsolute = fn (p, r) => mkAbsolute {path = p, relativeTo = r} val test7a = tst' "test7a" (fn _ => mkAbsolute("/a/b", "/c/d") = "/a/b" andalso mkAbsolute("/", "/c/d") = "/" andalso mkAbsolute("a/b", "/c/d") = "/c/d/a/b"); val test7b = tst0 "test7b" ((mkAbsolute("a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test7c = tst0 "test7c" ((mkAbsolute("/a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val mkRelative = fn (p, r) => mkRelative {path = p, relativeTo = r} val test8a = tst' "test8a" (fn _ => mkRelative("a/b", "/c/d") = "a/b" andalso mkRelative("/", "/a/b/c") = "../../.." andalso mkRelative("/a/", "/a/b/c") = "../../" andalso mkRelative("/a/b/", "/a/c") = "../b/" andalso mkRelative("/a/b", "/a/c/") = "../b" andalso mkRelative("/a/b/", "/a/c/") = "../b/" andalso mkRelative("/", "/") = "." andalso mkRelative("/", "/.") = "." andalso mkRelative("/", "/..") = "." andalso mkRelative("/", "/a") = ".." andalso mkRelative("/a/b/../c", "/a/d") = "../b/../c" andalso mkRelative("/a/b", "/c/d") = "../../a/b" andalso mkRelative("/c/a/b", "/c/d") = "../a/b" andalso mkRelative("/c/d/a/b", "/c/d") = "a/b"); val test8b = tst0 "test8b" ((mkRelative("/a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test8c = tst0 "test8c" ((mkRelative("a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test9a = let fun chkCanon (a, b) = (mkCanonical a = b) andalso (mkCanonical b = b) andalso (isCanonical b) in tst' "test9a" (fn _ => chkCanon("", ".") andalso chkCanon(".", ".") andalso chkCanon("./.", ".") andalso chkCanon("/.", "/") andalso chkCanon("..", "..") andalso chkCanon("../..", "../..") andalso chkCanon("b", "b") andalso chkCanon("a/b", "a/b") andalso chkCanon("/a/b", "/a/b") andalso chkCanon("a/b/", "a/b") andalso chkCanon("a/b//", "a/b") andalso chkCanon("a/../b", "b") andalso chkCanon("a/..", ".") andalso chkCanon("a/.", "a") andalso chkCanon("a/", "a") andalso chkCanon("/a/../b/", "/b") andalso chkCanon("/..", "/") andalso chkCanon("/../../a/b", "/a/b") andalso chkCanon("/./../../a/b", "/a/b") andalso chkCanon("/./../..", "/") andalso chkCanon("a/../b", "b") andalso chkCanon("a/./b", "a/b") andalso chkCanon("a////b", "a/b") andalso chkCanon("a////b", "a/b")) end val test10a = tst' "test10a" (fn _ => not (isCanonical "./." orelse isCanonical "/.." orelse isCanonical "/." orelse isCanonical "//" orelse isCanonical "a/.." orelse isCanonical "a//b" orelse isCanonical "a/." orelse isCanonical "a/b/" orelse isCanonical "a/..")) val test11a = tst' "test11a" (fn _ => splitDirFile "" = {dir = "", file = ""} andalso splitDirFile "." = {dir = "", file = "."} andalso splitDirFile ".." = {dir = "", file = ".."} andalso splitDirFile "b" = {dir = "", file = "b"} andalso splitDirFile "b/" = {dir = "b", file = ""} andalso splitDirFile "a/b" = {dir = "a", file = "b"} andalso splitDirFile "/a" = {dir = "/", file = "a"} andalso splitDirFile "/a/b" = {dir = "/a", file = "b"} andalso splitDirFile "/c/a/b" = {dir = "/c/a", file = "b"} andalso splitDirFile "/c/a/b/" = {dir = "/c/a/b", file = ""} andalso splitDirFile "/c/a/b.foo.bar" = {dir = "/c/a", file="b.foo.bar"} andalso splitDirFile "/c/a/b.foo" = {dir = "/c/a", file = "b.foo"}); (* val test11b = (splitDirFile "" seq "WRONG") handle Path => "OK" | _ => "WRONG"; *) val test12 = tst' "test12" (fn _ => List.all (fn (res, dir, file) => res = joinDirFile {dir = dir, file = file}) [("", "", ""), ("b", "", "b"), ("/", "/", ""), ("/b", "/", "b"), ("a/b", "a", "b"), ("/a/b", "/a", "b"), ("/c/a/b", "/c/a", "b"), ("/c/a/b/", "/c/a/b", ""), ("/c/a/b.foo.bar", "/c/a","b.foo.bar"), ("/c/a/b.foo", "/c/a", "b.foo")]) val test13 = tst' "test13" (fn _ => dir "b" = "" andalso dir "a/b" = "a" andalso dir "/" = "/" andalso dir "/b" = "/" andalso dir "/a/b" = "/a" andalso dir "/c/a/b" = "/c/a" andalso dir "/c/a/b/" = "/c/a/b" andalso dir "/c/a/b.foo.bar" = "/c/a" andalso dir "/c/a/b.foo" = "/c/a"); val test14 = tst' "test14" (fn _ => file "b" = "b" andalso file "a/b" = "b" andalso file "/" = "" andalso file "/b" = "b" andalso file "/a/b" = "b" andalso file "/c/a/b" = "b" andalso file "/c/a/b/" = "" andalso file "/c/a/b.foo.bar" = "b.foo.bar" andalso file "/c/a/b.foo" = "b.foo"); val test15 = tst' "test15" (fn _ => splitBaseExt "" = {base = "", ext = NONE} andalso splitBaseExt ".login" = {base = ".login", ext = NONE} andalso splitBaseExt "/.login" = {base = "/.login", ext = NONE} andalso splitBaseExt "a" = {base = "a", ext = NONE} andalso splitBaseExt "a." = {base = "a.", ext = NONE} andalso splitBaseExt "a.b" = {base = "a", ext = SOME "b"} andalso splitBaseExt "a.b.c" = {base = "a.b", ext = SOME "c"} andalso splitBaseExt "/a.b" = {base = "/a", ext = SOME "b"} andalso splitBaseExt "/c/a.b" = {base = "/c/a", ext = SOME "b"} andalso splitBaseExt "/c/a/b/.d" = {base = "/c/a/b/.d", ext = NONE} andalso splitBaseExt "/c.a/b.d" = {base = "/c.a/b", ext = SOME "d"} andalso splitBaseExt "/c.a/bd" = {base = "/c.a/bd", ext = NONE} andalso splitBaseExt "/c/a/b.foo.bar" = {base="/c/a/b.foo",ext=SOME "bar"} andalso splitBaseExt "/c/a/b.foo" = {base = "/c/a/b", ext = SOME "foo"}); val test16 = tst' "test16" (fn _ => "" = joinBaseExt {base = "", ext = NONE} andalso ".login" = joinBaseExt {base = ".login", ext = NONE} andalso "a" = joinBaseExt {base = "a", ext = NONE} andalso "a" = joinBaseExt {base = "a", ext = SOME ""} andalso "a.b" = joinBaseExt {base = "a", ext = SOME "b"} andalso "a.b.c" = joinBaseExt {base = "a.b", ext = SOME "c"} andalso "a.b.c.d" = joinBaseExt {base = "a.b", ext = SOME "c.d"} andalso "/a.b" = joinBaseExt {base = "/a", ext = SOME "b"} andalso "/c/a.b" = joinBaseExt {base = "/c/a", ext = SOME "b"} andalso "/c/a/b/.d" = joinBaseExt {base = "/c/a/b/", ext = SOME "d"} andalso "/c/a/b.foo.bar" = joinBaseExt {base="/c/a/b",ext=SOME "foo.bar"} andalso "/c/a/b.foo" = joinBaseExt {base = "/c/a/b", ext = SOME "foo"}); val test17 = tst' "test17" (fn _ => ext "" = NONE andalso ext ".login" = NONE andalso ext "/.login" = NONE andalso ext "a" = NONE andalso ext "a." = NONE andalso ext "a.b" = SOME "b" andalso ext "a.b.c" = SOME "c" andalso ext "a.b.c.d" = SOME "d" andalso ext "/a.b" = SOME "b" andalso ext "/c/a.b" = SOME "b" andalso ext "/c/a/b/.d" = NONE andalso ext "/c.a/b.d" = SOME "d" andalso ext "/c.a/bd" = NONE andalso ext "/c/a/b.foo.bar" = SOME "bar" andalso ext "/c/a/b.foo" = SOME "foo"); val test18 = tst' "test18" (fn _ => base "" = "" andalso base ".d" = ".d" andalso base ".login" = ".login" andalso base "/.login" = "/.login" andalso base "a" = "a" andalso base "a." = "a." andalso base "a.b" = "a" andalso base "a.b.c" = "a.b" andalso base "a.b.c.d" = "a.b.c" andalso base "/a.b" = "/a" andalso base "/c/a.b" = "/c/a" andalso base "/c/a/b/.d" = "/c/a/b/.d" andalso base "/c.a/b.d" = "/c.a/b" andalso base "/c.a/bd" = "/c.a/bd" andalso base "/c/a/b.foo.bar" = "/c/a/b.foo" andalso base "/c/a/b.foo" = "/c/a/b"); val test19 = tst' "test19" (fn () => validVolume{isAbs=false, vol=""} andalso validVolume{isAbs=true, vol=""} andalso not (validVolume{isAbs=true, vol="/"} orelse validVolume{isAbs=false, vol="/"} orelse validVolume{isAbs=true, vol="C:"} orelse validVolume{isAbs=false, vol="C:"} orelse validVolume{isAbs=true, vol=" "} orelse validVolume{isAbs=false, vol=" "})); in end mlton-20210117+dfsg/regression/useless-string.ok000066400000000000000000000000001416264345000215160ustar00rootroot00000000000000mlton-20210117+dfsg/regression/useless-string.sml000066400000000000000000000003031416264345000217060ustar00rootroot00000000000000val x = "abc" val y = "defg" val _ = if 3 = (String.size (if 0 = length (CommandLine.arguments ()) then x else y)) then () else raise Fail "bug" mlton-20210117+dfsg/regression/valrec.ok000066400000000000000000000000341416264345000200120ustar00rootroot00000000000000Hello, world! Hello, world! mlton-20210117+dfsg/regression/valrec.sml000066400000000000000000000014351416264345000202020ustar00rootroot00000000000000val rec ((((((((x)))))))) = fn () => () val _ = x () local val 'a rec f = fn () => () in end local val x = "Hello, world!\n" val x = "BUG\n" and rec f = fn () => print x in val _ = f () end local val x = "BUG\n" val x = "Hello, world!\n" and rec f = fn y => print y in val _ = f x end local val rec rec f = fn () => () in end local val rec f = fn () => () and rec g = fn () => () in end (* valrec.sml *) (* Checks parsing, scoping, typing and dynamic semantics of "val rec". *) fun x x = x val _ = case x 1 of 1 => () | _ => raise Fail "bug" val a = fn x => x val a = 1 and rec b = fn x => a(b(c(d(e(f(g x)))))) and c : 'a -> 'a as d : 'a -> 'a = fn x => x and rec e as f as g = fn x => x and h : 'b -> 'b : 'b -> 'b = fn x => x; mlton-20210117+dfsg/regression/vector-loop.ok000066400000000000000000000000001416264345000210000ustar00rootroot00000000000000mlton-20210117+dfsg/regression/vector-loop.sml000066400000000000000000000003541416264345000211760ustar00rootroot00000000000000open Vector datatype t = T of t vector fun makeT() = T(tabulate(0, fn _ => makeT())) fun destT(T v) = if length v > 0 then 1 + destT(sub(v, 0)) else 0 val _ = if 0 = destT(makeT()) then () else raise Fail "bug" mlton-20210117+dfsg/regression/vector.ok000066400000000000000000000005651416264345000200510ustar00rootroot00000000000000Testing Vector... test1: OK test2: OK test3: OK test4a: OK test4b: OK test4c: OK test5: OK test6a: OK test6b: OK test6c: OK test7: OK test8: OK test9: OK test9a: OK test9b: OK test9c: OK test9d: OK test9e: OK test9f: OK test9g: OK test9h: OK test9i: OK test10a: OK test11a: OK test11b: OK test11c: OK test11d: OK test11e: OK test11f: OK test11g: OK test11h: OK test11i: OK mlton-20210117+dfsg/regression/vector.sml000066400000000000000000000124071416264345000202310ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/vector.sml -- some test cases for Vector PS 1994-12-10, 1995-06-14, 1997-03-07 *) (*KILL 05/11/1997 11:04. tho.: use "auxil.sml"; *) val _ = print "Testing Vector...\n"; fun prtest (s, s') = print(s ^ ": " ^ s' ^ "\n") local open Vector; infix 9 sub; fun extract (vec, s, l) = VectorSlice.vector (VectorSlice.slice (vec, s, l)) fun mapi f (vec, s, l) = VectorSlice.mapi (fn (i,x) => f (i+s,x)) (VectorSlice.slice (vec, s, l)) in val a = fromList [0,1,2,3,4,5,6]; val b = fromList [44,55,66]; val c = fromList [0,1,2,3,4,5,6]; val test1 = check'(fn _ => a<>b); val _ = prtest("test1", test1); val test2 = check'(fn _ => a=c); val _ = prtest("test2", test2); val d = tabulate(100, fn i => i mod 7); val test3 = check'(fn _ => d sub 27 = 6); val _ = prtest("test3", test3); val test4a = (tabulate(maxLen+1, fn i => i) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG"; val _ = prtest("test4a", test4a); val test4b = (tabulate(~1, fn i => i) seq "WRONG") handle Size => "OK" | _ => "WRONG"; val _ = prtest("test4b", test4b); val test4c = check'(fn _ => length (tabulate(0, fn i => i div 0)) = 0); val _ = prtest("test4c", test4c); val test5 = check'(fn _ => length (fromList []) = 0 andalso length a = 7); val _ = prtest("test5", test5); val test6a = (c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test6a", test6a); val test6b = (c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test6b", test6b); val test6c = check'(fn _ => c sub 0 = 0); val _ = prtest("test6c", test6c); val e = concat [d, b, d]; val test7 = check'(fn _ => length e = 203); val _ = prtest("test7", test7); val test8 = check'(fn _ => length (concat []) = 0); val _ = prtest("test8", test8); val f = extract (e, 100, SOME 3); val test9 = check'(fn _ => f = b); val _ = prtest("test9", test9); val test9a = check'(fn _ => e = extract(e, 0, SOME (length e)) andalso e = extract(e, 0, NONE)); val _ = prtest("test9a", test9a); val test9b = check'(fn _ => fromList [] = extract(e, 100, SOME 0)); val _ = prtest("test9b", test9b); val test9c = (extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9c", test9c); val test9d = (extract(e, length e + 1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9d", test9d); val test9e = (extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9e", test9e); val test9f = (extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9f", test9f); val test9g = (extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9g", test9g); val test9h = (extract(e, length e + 1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9h", test9h); val test9i = check'(fn _ => fromList [] = extract(e, length e, SOME 0) andalso fromList [] = extract(e, length e, NONE)); val _ = prtest("test9i", test9i); fun chkiter iter f vec reslast = check'(fn _ => let val last = ref ~1 val res = iter (fn x => (last := x; f x)) vec in (res, !last) = reslast end) fun chkiteri iter f vec reslast = check'(fn _ => let val last = ref ~1 val res = iter (fn (i, x) => (last := i; f x)) vec in (res, !last) = reslast end) val test10a = chkiter map (fn x => 2*x) b (fromList [88,110,132], 66) val _ = prtest("test10a", test10a); val test11a = chkiteri mapi (fn x => 2*x) (b, 0, NONE) (fromList [88,110,132], 2) val _ = prtest("test11a", test11a); val test11b = chkiteri mapi (fn x => 2*x) (b, 1, NONE) (fromList [110,132], 2) val _ = prtest("test11b", test11b); val test11c = chkiteri mapi (fn x => 2*x) (b, 1, SOME 0) (fromList [], ~1) val _ = prtest("test11c", test11c); val test11d = chkiteri mapi (fn x => 2*x) (b, 1, SOME 1) (fromList [110], 1) val _ = prtest("test11d", test11d); val test11e = chkiteri mapi (fn x => 2*x) (b, 3, NONE) (fromList [], ~1) val _ = prtest("test11e", test11e); val test11f = (mapi #2 (b, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11f", test11f); val test11g = (mapi #2 (b, 3, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11g", test11g); val test11h = (mapi #2 (b, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11h", test11h); val test11i = (mapi #2 (b, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11i", test11i); end; mlton-20210117+dfsg/regression/vector2.ok000066400000000000000000000000021416264345000201150ustar00rootroot000000000000006 mlton-20210117+dfsg/regression/vector2.sml000066400000000000000000000001641416264345000203100ustar00rootroot00000000000000open Vector val v = tabulate(13, fn i => fn j => i + j) val _ = print(Int.toString(sub(v, 5) 1)) val _ = print "\n" mlton-20210117+dfsg/regression/vector3.ok000066400000000000000000000000051416264345000201210ustar00rootroot000000000000001000 mlton-20210117+dfsg/regression/vector3.sml000066400000000000000000000002071416264345000203070ustar00rootroot00000000000000val v = Vector.tabulate (1000, fn i => ()) val r = ref 0 val _ = r := Vector.length v val _ = print (concat [Int.toString (!r), "\n"]) mlton-20210117+dfsg/regression/vector4.ok000066400000000000000000000000001416264345000201150ustar00rootroot00000000000000mlton-20210117+dfsg/regression/vector4.sml000066400000000000000000000007211416264345000203110ustar00rootroot00000000000000open Vector fun assert(msg,b) = (if b then () else print("assertion failed: " ^ msg ^ "\n")) val v1 = fromList[1,2,3] val v2 = fromList[1,2,3] val _ = assert("vector equality", v1 = v2 andalso fromList[v1, v2] = fromList[v2, v1] andalso v1 <> fromList[1,2] andalso v1 <> fromList[1,2,4]) open Array val a1 = fromList[1,2,3] val a2 = fromList[1,2,3] val _ = assert("array equality", a1 <> a2) mlton-20210117+dfsg/regression/warn/000077500000000000000000000000001416264345000171555ustar00rootroot00000000000000mlton-20210117+dfsg/regression/warn/undetermined.sml000066400000000000000000000005401416264345000223540ustar00rootroot00000000000000(* 1.sml *) val id = (fn x => x) (fn x => x) ; structure B : sig end = struct val a = ref nil end ; (* 3.sml *) val id = (fn x => x) (fn x => x) ; val _ = id 13 ; (* 6.sml *) val id = (fn x => x) (fn x => x) val id = () ; val x = ref []; val _ = 1 :: !x ; val x = ref nil signature S = sig end val _ = 1 :: !x ; val x = ref nil; val _ = () :: !x mlton-20210117+dfsg/regression/warn/val-rec-constructor.2.sml000066400000000000000000000000501416264345000237410ustar00rootroot00000000000000val rec SOME = fn _ => raise Fail "foo" mlton-20210117+dfsg/regression/warn/val-rec-constructor.sml000066400000000000000000000000331416264345000236020ustar00rootroot00000000000000val rec NONE = fn () => () mlton-20210117+dfsg/regression/warn/warning.sml000066400000000000000000000007231416264345000213410ustar00rootroot00000000000000(* No warning according to page 28 of defn *) val x::l = [] structure S = struct val x :: l = [] end val _ = let val x::l = [] (* But this should generate a warning. *) in () end val _ = case 13 of 1 => () val _ = case 13 of 1 => 2 | 1 => 3 | 1 => 4 val NONE = NONE fun f _ 1 = () | f 1 _ = () fun f _ _ = () | f 1 2 = () | f 3 4 = () val _ = fn 13 => () val _ = () handle _ => () | x => () mlton-20210117+dfsg/regression/weak.2.ok000066400000000000000000000000231416264345000176230ustar00rootroot0000000000000018 true 19 20 true mlton-20210117+dfsg/regression/weak.2.sml000066400000000000000000000015541416264345000200170ustar00rootroot00000000000000structure Weak = MLton.Weak val x = (13, ref 5) val wx = Weak.new x fun use (v, r) = v + !r before r := !r + 1 fun isAlive () = case Weak.get wx of NONE => false | SOME p => (print (Int.toString (use p) ^ "\n"); true) val _ = print (Bool.toString (isAlive ()) ^ "\n") val _ = print (Int.toString (use x) ^ "\n") val _ = MLton.GC.collect () val _ = print (Bool.toString (isAlive ()) ^ "\n") (* fun sum (x : int * (int list ref vector * int * int) ref) = #1 x + #2 (! (#2 x)) + #3 (! (#2 x)) + Vector.foldr (fn (lr,s) => List.foldr (op +) s (!lr)) 0 (#1 (! (#2 x))) val x = (13, ref (Vector.tabulate (10, fn n => ref (List.tabulate (n, fn i => i))), 4, 5)) val wx = Weak.new x fun isAlive () = isSome (Weak.get wx) val _ = MLton.GC.collect () val _ = print (Bool.toString (isAlive ()) ^ "\n") val s1 = sum x *) mlton-20210117+dfsg/regression/weak.3.ok000066400000000000000000000000121416264345000176220ustar00rootroot000000000000006 5 4 3 2 mlton-20210117+dfsg/regression/weak.3.sml000066400000000000000000000013171416264345000200150ustar00rootroot00000000000000fun find cache x = case (List.find (fn (y,_) => x = y) (!cache)) of NONE => NONE | SOME (_,r) => SOME r fun remove cache x = cache := (List.filter (fn (y,_) => not (x = y)) (!cache)) fun insert cache (x,r) = cache := (x,r)::(!cache) val cache = ref [] fun lookup (x : int) = case find cache x of SOME r => (case MLton.Weak.get r of SOME r' => r' | NONE => (remove cache x; lookup x)) | NONE => let val res = x + 1 val wres = MLton.Weak.new res in insert cache (x, wres); res end val _ = List.app (fn x => print (concat [Int.toString (lookup x), "\n"])) [5,4,3,2,1] mlton-20210117+dfsg/regression/weak.ok000066400000000000000000000000401416264345000174620ustar00rootroot0000000000000013 12345678901234567890 1 12345 mlton-20210117+dfsg/regression/weak.sml000066400000000000000000000022741416264345000176570ustar00rootroot00000000000000structure Weak = MLton.Weak val w = Weak.new 13 val _ = if isSome (Weak.get w) then raise Fail "bug int" else () fun testIntInf (i: IntInf.int) = let val w = Weak.new i val _ = case Weak.get w of NONE => raise Fail "bug IntInf" | SOME i => print (concat [IntInf.toString i, "\n"]) in () end val _ = testIntInf 13 val _ = testIntInf 12345678901234567890 val r = ref 13 val n = 2 val rs = Array.tabulate (n, ref) val ws = Array.tabulate (n, fn i => Weak.new (Array.sub (rs, i))) fun isAlive i = isSome (Weak.get (Array.sub (ws, i))) val _ = MLton.GC.collect () val _ = if isAlive 0 andalso isAlive 1 then () else raise Fail "bug1" fun clear i = Array.update (rs, i, r) fun sub i = ! (Array.sub (rs, i)) fun pi x = print (concat [Int.toString x, "\n"]) val _ = pi (sub 0 + sub 1) val _ = valOf (Weak.get (Array.sub (ws, 0))) := 12345 val _ = clear 1 val _ = MLton.GC.collect () val _ = if isAlive 0 andalso not (isAlive 1) then () else raise Fail "bug2" val _ = pi (sub 0) val _ = clear 0 val _ = MLton.GC.collect () val _ = if not (isAlive 0) andalso not (isAlive 1) then () else raise Fail "bug2" mlton-20210117+dfsg/regression/weird-word1.ok000066400000000000000000000000051416264345000207000ustar00rootroot000000000000000wx8 mlton-20210117+dfsg/regression/weird-word1.sml000066400000000000000000000010211416264345000210610ustar00rootroot00000000000000fun fib (w: Word5.word) : Word5.word = if w <= 0wx1 then 0wx1 else fib (w - 0wx1) + fib (w - 0wx2) val s = case (fib 0wx5) of 0wx0 => "0wx0" | 0wx1 => "0wx1" | 0wx2 => "0wx2" | 0wx3 => "0wx3" | 0wx4 => "0wx4" | 0wx5 => "0wx5" | 0wx6 => "0wx6" | 0wx7 => "0wx7" | 0wx8 => "0wx8" | 0wx9 => "0wx9" | 0wxA => "0wxA" | 0wxB => "0wxB" | 0wxC => "0wxC" | 0wxD => "0wxD" | 0wxE => "0wxE" | 0wxF => "0wxF" | _ => "zzz" val _ = print (concat [s, "\n"]) mlton-20210117+dfsg/regression/weird-word2.ok000066400000000000000000000000051416264345000207010ustar00rootroot000000000000000wx8 mlton-20210117+dfsg/regression/weird-word2.sml000066400000000000000000000015601416264345000210720ustar00rootroot00000000000000fun fib (w: Word5.word) : Word5.word = if w <= 0wx1 then 0wx1 else fib (w - 0wx1) + fib (w - 0wx2) val s = case (fib 0wx5) of 0wx0 => "0wx0" | 0wx1 => "0wx1" | 0wx2 => "0wx2" | 0wx3 => "0wx3" | 0wx4 => "0wx4" | 0wx5 => "0wx5" | 0wx6 => "0wx6" | 0wx7 => "0wx7" | 0wx8 => "0wx8" | 0wx9 => "0wx9" | 0wxA => "0wxA" | 0wxB => "0wxB" | 0wxC => "0wxC" | 0wxD => "0wxD" | 0wxE => "0wxE" | 0wxF => "0wxF" | 0wx10 => "0wx10" | 0wx11 => "0wx11" | 0wx12 => "0wx12" | 0wx13 => "0wx13" | 0wx14 => "0wx14" | 0wx15 => "0wx15" | 0wx16 => "0wx16" | 0wx17 => "0wx17" | 0wx18 => "0wx18" | 0wx19 => "0wx19" | 0wx1A => "0wx1A" | 0wx1B => "0wx1B" | 0wx1C => "0wx1C" | 0wx1D => "0wx1D" | 0wx1E => "0wx1E" | 0wx1F => "0wx1F" val _ = print (concat [s, "\n"]) mlton-20210117+dfsg/regression/where-and.ok000066400000000000000000000000001416264345000204010ustar00rootroot00000000000000mlton-20210117+dfsg/regression/where-and.sml000066400000000000000000000017441416264345000206030ustar00rootroot00000000000000(* where-and.sml *) (* Checks parsing of where type ... and derived form. *) signature S = sig type t and u end signature T = S where type t = int and type u = bool and U = S where type t = int and type u = bool signature V = sig structure A : S where type t = int and type u = bool and B : S where type t = int and type u = bool end structure A : S where type t = int and type u = bool = struct type t = int type u = bool end structure B = A : S where type t = int and type u = bool and C = A : S where type t = int and type u = bool functor F(X : S where type t = int and type u = bool) : S where type t = int and type u = bool = X : S where type t = int and type u = bool and G(Y : S where type t = int and type u = bool) : S where type t = int and type u = bool = Y : S where type t = int and type u = bool signature W = sig type t and u and v end signature W' = W where type t = int and type u = int where type v = int and W'' = W; mlton-20210117+dfsg/regression/where.ok000066400000000000000000000000001416264345000176410ustar00rootroot00000000000000mlton-20210117+dfsg/regression/where.sml000066400000000000000000000005701416264345000200370ustar00rootroot00000000000000(* where.sml *) (* Checks treatment of type realisations. *) signature S = sig type t type s = t end where type s = int; (* Due to Martin Elsman, also see SML/NJ bug 1330. *) signature T = sig type s structure U : sig type 'a t type u = (int * real) t end where type 'a t = s end where type U.u = int; mlton-20210117+dfsg/regression/whitelist000066400000000000000000000000571416264345000201470ustar00rootroot00000000000000real world1 world2 world3 world4 world5 world6 mlton-20210117+dfsg/regression/widechar.ok000066400000000000000000000007701416264345000203330ustar00rootroot00000000000000File widechar.sml: Testing structure WideChar... test4 OK test5 OK test6 OK test18 OK test19 OK test20 OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK test31 OK test32 OK test33 OK test34a OK test34b OK test35a OK test35b OK test36 OK test37 OK test38 OK test39 OK test40 OK test41 OK test42 OK test43 OK mlton-20210117+dfsg/regression/widechar.sml000066400000000000000000000262611416264345000205200ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") (* handle _ => "EXN" *); fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/widechar.sml -- test cases WideChar, suitable for ASCII PS 1994-12-10, 1995-05-11, 1995-11-10, 1996-09-30 *) (*KILL 05/11/1997 10:55. tho.: use "auxil.sml"; *) val _ = print "File widechar.sml: Testing structure WideChar...\n" val test4 = tstrange "test4" (0, WideChar.maxOrd) (fn i => (WideChar.ord o WideChar.chr) i = i); val test5 = tst0 "test5" ((WideChar.chr ~1 seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test6 = tst0 "test6" ((WideChar.chr (WideChar.maxOrd+1) seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test18 = tst "test18" (not (WideChar.contains "" (WideChar.chr 65)) andalso not (WideChar.contains "aBCDE" (WideChar.chr 65)) andalso (WideChar.contains "ABCD" (WideChar.chr 67)) andalso not (WideChar.contains "" #"\000") andalso not (WideChar.contains "" #"\255") andalso not (WideChar.contains "azAZ09" #"\000") andalso not (WideChar.contains "azAZ09" #"\255")); val test19 = tst "test19" (WideChar.notContains "" (WideChar.chr 65) andalso WideChar.notContains "aBCDE" (WideChar.chr 65) andalso not (WideChar.notContains "ABCD" (WideChar.chr 67)) andalso WideChar.notContains "" #"\000" andalso WideChar.notContains "" #"\255" andalso WideChar.notContains "azAZ09" #"\000" andalso WideChar.notContains "azAZ09" #"\255"); val test20 = tst "test20" (WideChar.ord WideChar.maxChar = WideChar.maxOrd); local fun mycontains s c = let val stop = WideString.size s fun h i = i < stop andalso (c = WideString.sub(s, i) orelse h(i+1)) in h 0 end; (* Check that p(c) = (mycontains s c) for all characters: *) fun equivalent p s = let fun h n = n > 255 orelse (p (WideChar.chr n) = mycontains s (WideChar.chr n)) andalso h(n+1) in h 0 end fun checkset p s = tst' "checkset" (fn _ => equivalent p s); val graphchars : WideString.string = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\ \[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; val ascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val lowerascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val upperascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\127" val allchars = let fun h 0 res = WideChar.chr 0 :: res | h n res = h (n-1) (WideChar.chr n :: res) in h 255 [] end open WideChar in val test21 = checkset isLower "abcdefghijklmnopqrstuvwxyz"; val test22 = checkset isUpper "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test23 = checkset isDigit "0123456789"; val test24 = checkset isAlpha "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test25 = checkset isHexDigit "0123456789abcdefABCDEF"; val test26 = checkset isAlphaNum "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test27 = checkset isPrint (WideString.^ (" ", graphchars)) val test28 = checkset isSpace " \009\010\011\012\013"; val test29 = checkset isGraph graphchars val test30 = checkset isAscii ascii val test31 = tst' "test31" (fn _ => map toLower (WideString.explode ascii) = WideString.explode lowerascii) val test32 = tst' "test32" (fn _ => map toUpper (WideString.explode ascii) = WideString.explode upperascii) val test33 = tst' "test33" (fn _ => map toUpper (WideString.explode graphchars) seq map toLower (WideString.explode graphchars) seq true) val test34a = tst' "test34a" (fn _ => map pred (List.drop(allchars, 1)) = List.take(allchars, 255)); val test34b = tst0 "test34b" ((pred minChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test35a = tst' "test35a" (fn _ => map succ (List.take(allchars, 255)) = List.drop(allchars, 1)); val test35b = tst0 "test35b" ((succ maxChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") end (* Test cases for SML character escape functions. *) val test36 = let fun chk (arg, res) = WideChar.toString arg = res in tst' "test36" (fn _ => List.all chk [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")]) end; val test37 = let val chars = List.tabulate(256, WideChar.chr) fun chk c = WideChar.fromString(WideChar.toString c) = SOME c in tst' "test37" (fn _ => List.all chk chars) end val test38 = let fun chkFromString (arg, res) = WideChar.fromString arg = SOME res val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\256", #"\256"), ("\\999", #"\999"), ("\\u0000", #"\000"), ("\\u67ab", #"\u67ab"), ("\\U001067ab", #"\U001067ab"), ("\\U0010ffff", #"\U0010ffff"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] in tst' "test38" (fn _ => List.all chkFromString argResList) end; val test39 = tst' "test39" (fn _ => List.all (fn arg => WideChar.fromString arg = NONE) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\U00110000", (* outside the range of Unicode *) "\\ a", "\\ a\\B", "\\ \\"]); (* Test cases for C string escape functions *) val test40 = let val chars = List.tabulate(256, WideChar.chr) in tst' "test40" (fn _ => List.map SOME chars = List.map WideChar.fromCString (List.map WideChar.toCString chars)) end; val test41 = let val argResList = [(#"\010", "\\n"), (#"\009", "\\t"), (#"\011", "\\v"), (#"\008", "\\b"), (#"\013", "\\r"), (#"\012", "\\f"), (#"\007", "\\a"), (#"\\", "\\\\"), (#"?", "\\?"), (#"'", "\\'"), (#"\"", "\\\"")] in tst' "test41" (fn _ => List.all (fn (arg, res) => WideChar.toCString arg = res) argResList) end; val test42 = let fun checkFromCStringSucc (arg, res) = WideString.str (valOf (WideChar.fromCString arg)) = res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\064"), ("\\100A", "\064"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\001"), ("\\178", "\015"), ("\\1C", "\001"), ("\\17C", "\015"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010"), ("\\xAAg", "\170"), ("\\u0000", "\000"), ("\\x67ab", "\u67ab"), ("\\u67ab", "\u67ab"), ("\\uffff", "\uffff"), ("\\U001067ab", "\U001067ab"), ("\\U0010ffff", "\U0010ffff"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017") ] in tst' "test42" (fn _ => List.all checkFromCStringSucc argResList) end; val test43 = let fun checkFromCStringFail arg = WideChar.fromCString arg = NONE in tst' "test43" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\8", "\\9", "\\c", "\\d", "\\x", "\\U00110000", (* outside the range of Unicode *) "\\xG"]) end; mlton-20210117+dfsg/regression/withtype.ok000066400000000000000000000000001416264345000204040ustar00rootroot00000000000000mlton-20210117+dfsg/regression/withtype.sml000066400000000000000000000002301416264345000205730ustar00rootroot00000000000000(* withtype.sml *) (* Checks scoping rules of withtype *) type u = int datatype t = T of u * v withtype u = bool and v = u val x = T(true, 6); mlton-20210117+dfsg/regression/withtype2.ok000066400000000000000000000000001416264345000204660ustar00rootroot00000000000000mlton-20210117+dfsg/regression/withtype2.sml000066400000000000000000000003341416264345000206620ustar00rootroot00000000000000(* withtype2.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = A of v | B of u withtype u = int and v = u val a = A 1.0 val b = B 1 val x : v = 1.0 val y : u = 1 fun uEq (a: u, b: u) = a = b mlton-20210117+dfsg/regression/withtype3.ok000066400000000000000000000000001416264345000204670ustar00rootroot00000000000000mlton-20210117+dfsg/regression/withtype3.sml000066400000000000000000000003201416264345000206560ustar00rootroot00000000000000(* withtype3.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = T of u * v withtype u = int and v = u val z = T (1, 1.0) val x : v = 1.0 val y : u = 1 fun uEq (a: u, b: u) = a = b mlton-20210117+dfsg/regression/withtype4.ok000066400000000000000000000000001416264345000204700ustar00rootroot00000000000000mlton-20210117+dfsg/regression/withtype4.sml000066400000000000000000000002661416264345000206700ustar00rootroot00000000000000(* withtype4.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = T of u * v withtype u = int and v = u val x = T(1, 1.0); fun uEq (a: u, b: u) = a = b mlton-20210117+dfsg/regression/withtype5.ok000066400000000000000000000000001416264345000204710ustar00rootroot00000000000000mlton-20210117+dfsg/regression/withtype5.sml000066400000000000000000000004161416264345000206660ustar00rootroot00000000000000(* withtype.sml *) (* Checks scoping rules of withtype *) type u = int datatype t = T of u * v withtype u = bool and v = u val z = T(true, 6) val y : u = true val x : v = 1 fun tEq (a: t, b: t) = a = b fun uEq (a: u, b: u) = a = b fun vEq (a: v, b: v) = a = b mlton-20210117+dfsg/regression/word-all.ok000066400000000000000000000064671416264345000202770ustar00rootroot00000000000000Testing Word2 3 11 3 3 3 2 10 2 2 2 1 1 1 1 1 3 11 3 3 3 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word3 7 111 7 7 7 6 110 6 6 6 3 11 3 3 3 7 111 7 7 7 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word4 F 1111 17 15 F E 1110 16 14 E 7 111 7 7 7 F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word7 7F 1111111 177 127 7F 7E 1111110 176 126 7E 3F 111111 77 63 3F F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word8 FF 11111111 377 255 FF FE 11111110 376 254 FE 7F 1111111 177 127 7F F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word9 1FF 111111111 777 511 1FF 1FE 111111110 776 510 1FE FF 11111111 377 255 FF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word13 1FFF 1111111111111 17777 8191 1FFF 1FFE 1111111111110 17776 8190 1FFE FFF 111111111111 7777 4095 FFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word16 FFFF 1111111111111111 177777 65535 FFFF FFFE 1111111111111110 177776 65534 FFFE 7FFF 111111111111111 77777 32767 7FFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word17 1FFFF 11111111111111111 377777 131071 1FFFF 1FFFE 11111111111111110 377776 131070 1FFFE FFFF 1111111111111111 177777 65535 FFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word20 FFFFF 11111111111111111111 3777777 1048575 FFFFF FFFFE 11111111111111111110 3777776 1048574 FFFFE 7FFFF 1111111111111111111 1777777 524287 7FFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word25 1FFFFFF 1111111111111111111111111 177777777 33554431 1FFFFFF 1FFFFFE 1111111111111111111111110 177777776 33554430 1FFFFFE FFFFFF 111111111111111111111111 77777777 16777215 FFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word30 3FFFFFFF 111111111111111111111111111111 7777777777 1073741823 3FFFFFFF 3FFFFFFE 111111111111111111111111111110 7777777776 1073741822 3FFFFFFE 1FFFFFFF 11111111111111111111111111111 3777777777 536870911 1FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word31 7FFFFFFF 1111111111111111111111111111111 17777777777 2147483647 7FFFFFFF 7FFFFFFE 1111111111111111111111111111110 17777777776 2147483646 7FFFFFFE 3FFFFFFF 111111111111111111111111111111 7777777777 1073741823 3FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word32 FFFFFFFF 11111111111111111111111111111111 37777777777 4294967295 FFFFFFFF FFFFFFFE 11111111111111111111111111111110 37777777776 4294967294 FFFFFFFE 7FFFFFFF 1111111111111111111111111111111 17777777777 2147483647 7FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word64 FFFFFFFFFFFFFFFF 1111111111111111111111111111111111111111111111111111111111111111 1777777777777777777777 18446744073709551615 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFE 1111111111111111111111111111111111111111111111111111111111111110 1777777777777777777776 18446744073709551614 FFFFFFFFFFFFFFFE 7FFFFFFFFFFFFFFF 111111111111111111111111111111111111111111111111111111111111111 777777777777777777777 9223372036854775807 7FFFFFFFFFFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 mlton-20210117+dfsg/regression/word-all.sml000066400000000000000000000120461416264345000204470ustar00rootroot00000000000000functor Test (W: WORD) = struct structure LW = LargeWord val zero = W.fromInt 0 val one = W.fromInt 1 val two = W.fromInt 2 val max = W.~ one val words = [max, W.- (max, one), W.div (max, two), W.fromInt 0xF, two, one, zero] fun foreach (l, f) = List.app f l fun for (f: W.word -> unit) = foreach (words, f) structure Answer = struct datatype t = Div | Overflow | Word of W.word val toString = fn Div => "Div" | Overflow => "Overflow" | Word w => W.toString w fun run (f: unit -> W.word): t = Word (f ()) handle General.Div => Div | General.Overflow => Overflow val equals: t * t -> bool = op = end val m = concat ["Word", Int.toString W.wordSize] val _ = print (concat ["Testing ", m, "\n"]) fun err msg = print (concat [m, ": ", concat msg, "\n"]) val _ = for (fn w => print (concat [W.toString w, "\n", "\t", W.fmt StringCvt.BIN w, "\n", "\t", W.fmt StringCvt.OCT w, "\n", "\t", W.fmt StringCvt.DEC w, "\n", "\t", W.fmt StringCvt.HEX w, "\n"])) val _ = foreach ([("+", W.+, LW.+), ("-", W.-, LW.-), ("*", W.*, LW.* ), ("andb", W.andb, LW.andb), ("div", W.div, LW.div), ("max", W.max, LW.max), ("min", W.min, LW.min), ("mod", W.mod, LW.mod), ("orb", W.orb, LW.orb), ("xorb", W.xorb, LW.xorb)], fn (name, f, f') => for (fn w => for (fn w' => let val a = Answer.run (fn () => f (w, w')) val a' = Answer.run (fn () => W.fromLarge (f' (W.toLarge w, W.toLarge w'))) in if Answer.equals (a, a') then () else err [W.toString w, " ", name, " ", W.toString w', " = ", Answer.toString a, " <> ", Answer.toString a'] end))) val _ = for (fn w => if w = valOf (W.fromString (W.toString w)) then () else err ["{from,to}String"]) val _ = foreach ([("<<", W.<<, LW.<<), (">>", W.>>, LW.>>)], fn (name, f, f') => for (fn w => foreach ([0w0, 0w1, 0w2, 0w4, 0w8, 0w15, 0w30, 0wxFF], fn w' => let val a = f (w, w') val a' = W.fromLarge (f' (W.toLarge w, w')) in if a = a' then () else err [W.toString w, " ", name, " ", Word.toString w', " = ", W.toString a, " <> ", W.toString a'] end))) val _ = foreach ([("~>>", W.~>>, LW.~>>)], fn (name, f, f') => for (fn w => foreach ([0w0, 0w1, 0w2, 0w4, 0w8, 0w15, 0w30, 0wxFF], fn w' => let val a = f (w, w') val a' = W.fromLarge (f' (W.toLargeX w, w')) in if a = a' then () else err [W.toString w, " ", name, " ", Word.toString w', " = ", W.toString a, " <> ", W.toString a'] end))) val _ = foreach ([("<", W.<, LW.<), ("<=", W.<=, LW.<=), (">", W.>, LW.>), (">=", W.>=, LW.>=)], fn (name, f, f') => for (fn w => for (fn w' => let val b = f (w, w') val b' = f' (W.toLarge w, W.toLarge w') in if b = b' then () else err [W.toString w, " ", name, " ", W.toString w', " = ", Bool.toString b, " <> ", Bool.toString b'] end))) val _ = foreach ([("compare", W.compare, LW.compare)], fn (name, f, f') => for (fn w => for (fn w' => let val or = f (w, w') val or' = f' (W.toLarge w, W.toLarge w') in if or = or' then () else err [W.toString w, " ", name, " ", W.toString w'] end))) val _ = for (fn w => if w = W.fromLargeInt (W.toLargeInt w) andalso w = W.fromLargeInt (W.toLargeIntX w) andalso (case SOME (W.toInt w) handle Overflow => NONE of NONE => true | SOME i => w = W.fromInt i) andalso (case SOME (W.toIntX w) handle Overflow => NONE of NONE => true | SOME i => w = W.fromInt i) then () else err ["{from,to}Large"]) val _ = for (fn w => let val a = W.notb w val a' = W.fromLarge (LW.notb (W.toLarge w)) in if a = a' then () else err ["notb ", W.toString w, " = ", W.toString a, " <> ", W.toString a'] end) val _ = for (fn w => if W.~ w = W.- (zero, w) then () else err ["~"]) end structure Z = Test (Word2) structure Z = Test (Word3) structure Z = Test (Word4) structure Z = Test (Word7) structure Z = Test (Word8) structure Z = Test (Word9) structure Z = Test (Word13) structure Z = Test (Word16) structure Z = Test (Word17) structure Z = Test (Word20) structure Z = Test (Word25) structure Z = Test (Word30) structure Z = Test (Word31) structure Z = Test (Word32) structure Z = Test (Word64) mlton-20210117+dfsg/regression/word.ok000066400000000000000000000017451416264345000175230ustar00rootroot00000000000000test1: OK test3: OK test5a: OK test5b: OK test6a: OK test6b: OK test7a: OK test7b: OK test8a: OK test8b: OK test9a: OK test9b: OK test9c: OK test9d: OK test9e: OK test9f: OK test9g: OK test9h: OK test10a: OK test10b: OK test10c: OK test10d: OK test11a: OK test11b: OK test11c: OK test11d: OK test11e: OK test11f: OK test11g: OK test11h: OK test11i: OK test12a: OK test12b: OK test12c: OK test12d: OK test12e: OK test12f: OK test12g: OK test12h: OK test12i: OK test12j: OK test12k: OK test12l: OK test12m: OK test12n: OK test12o: OK test12p: OK test12r: OK test12s: OK test13a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test13b: OKOKOKOKOKOKOKOKOKOKOKOK test14a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test14b: OKOKOKOKOKOKOKOKOKOKOKOK test15a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test15b: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test16a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test16b: OKOKOKOKOKOKOKOKOKOKOKOKOK test17a: OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK test17b: OKOKOKOKOKOKOKOKOKOKOK test18: OK test19: OK test20: OK test21: OK test22: OK mlton-20210117+dfsg/regression/word.sml000066400000000000000000000270121416264345000177000ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/word.sml -- some test cases for Word, appropriate for a two's complement machine whose Int.precision = SOME 31 PS 1995-03-19, 1995-07-12, 1995-11-06, 1996-04-01, 1996-10-01 modified to work for Int.precision = SOME 32 -- ME 1998-10-07 *) (*KILL 05/11/1997 11:04. tho.: use "auxil.sml"; *) local (* Isn't this disgusting: *) val [gt, lt, ge, le] = [op>, op<, op>=, op<=] : (int * int -> bool) list val [add, sub, mul, idiv, imod] = [op+, op-, op*, op div, op mod] : (int * int -> int) list open Word; val op > = gt and op < = lt and op >= = ge and op <= = le; val op + = add and op - = sub and op * = mul and op div = idiv and op mod = imod; val i2w = fromInt and w2i = toIntX; fun pr_ln s s' = print (s ^ ": " ^ s' ^ "\n") in val test1 = checkrange (0, 1025) (fn i => i = w2i (i2w i)); val _ = pr_ln "test1" test1 val test3 = checkrange (~1000, 1000) (fn i => i = toIntX (i2w i)); val _ = pr_ln "test3" test3 val test5a = checkrange (0,15) (fn i => (i+960) div 2 * 2 + 1 = w2i (orb (i2w i, i2w 961))); val _ = pr_ln "test5a" test5a val test5b = checkrange (0,513) (fn i => i = w2i (orb (i2w i, i2w i))); val _ = pr_ln "test5b" test5b val test6a = checkrange (0,15) (fn i => i div 2 * 2 = w2i (andb (i2w i, i2w ~2))); val _ = pr_ln "test6a" test6a val test6b = checkrange (0,513) (fn i => i = w2i (andb (i2w i, i2w i))); val _ = pr_ln "test6b" test6b val test7a = checkrange (0,15) (fn i => i+960 = w2i (xorb (i2w i, i2w 960))); val _ = pr_ln "test7a" test7a val test7b = checkrange (0, 513) (fn i => 0 = w2i (xorb (i2w i, i2w i))); val _ = pr_ln "test7b" test7b val test8a = check(~1 = w2i (notb (i2w 0))); val _ = pr_ln "test8a" test8a val test8b = check (0 = w2i (notb (i2w ~1))); val _ = pr_ln "test8b" test8b val maxposint = valOf Int.maxInt; val maxnegint = (Int.~ maxposint)-1; fun pwr2 0 = 1 | pwr2 n = 2 * pwr2 (n-1); fun rwp i 0 = i | rwp i n = rwp i (n-1) div 2; val test9a = checkrange (0,29) (fn k => pwr2 k = w2i (<< (i2w 1, i2w k))); val _ = pr_ln "test9a" test9a val test9b = checkrange (32,65) (fn k => 0 = w2i (<< (i2w 1, i2w k))); val _ = pr_ln "test9b" test9b val test9c = check (maxnegint = w2i (<< (i2w 1, i2w 31))); val _ = pr_ln "test9c" test9c val test9d = checkrange (0, 1025) (fn i => 2 * i = w2i (<< (i2w i, i2w 1))); val _ = pr_ln "test9d" test9d val test9e = checkrange (0, 1025) (fn i => i div 2 = w2i (>> (i2w i, i2w 1))); val _ = pr_ln "test9e" test9e val test9f = checkrange (0,65) (fn k => rwp maxposint k = w2i (>> (i2w maxposint, i2w k))); val _ = pr_ln "test9f" test9f val test9g = checkrange (32,65) (fn k => 0 = w2i (<< (i2w ~1, i2w k))); val _ = pr_ln "test9g" test9g val test9h = checkrange (1,65) (fn k => 0 = w2i (>> (i2w 1, i2w k))); val _ = pr_ln "test9h" test9h val test10a = checkrange (1,65) (fn k => 0 = w2i (~>> (i2w 1, i2w k))); val _ = pr_ln "test10a" test10a val test10b = checkrange (1,65) (fn k => ~1 = w2i (~>> (i2w ~1, i2w k))); val _ = pr_ln "test10b" test10b val test10c = checkrange (~513, 513) (fn i => i div 2 = toIntX (~>> (i2w i, i2w 1))); val _ = pr_ln "test10c" test10c val test10d = checkrange (0,65) (fn k => rwp maxnegint k = toIntX (~>> (i2w maxnegint, i2w k))); val _ = pr_ln "test10d" test10d local open Word in val test11a = check (i2w 256 > i2w 255); val _ = pr_ln "test11a" test11a val test11b = check (i2w 0 < i2w ~1); val _ = pr_ln "test11b" test11b val test11c = check (i2w maxposint >= i2w maxposint); val _ = pr_ln "test11c" test11c val test11d = check (i2w maxnegint >= i2w 127); val _ = pr_ln "test11d" test11d val test11e = check (i2w 1 <= i2w 1); val _ = pr_ln "test11e" test11e val test11f = check (i2w 0 <= i2w 1); val _ = pr_ln "test11f" test11f val test11g = check (i2w 0 < i2w maxposint); val _ = pr_ln "test11g" test11g val test11h = check (i2w maxposint < i2w maxnegint); val _ = pr_ln "test11h" test11h val test11i = check (i2w maxnegint < i2w ~1); val _ = pr_ln "test11i" test11i end; local open Word in val test12a = checkrange(0, 300) (fn k => w2i (i2w k + i2w 17) = add(k, 17)); val _ = pr_ln "test12a" test12a val test12b = checkrange(0, 300) (fn k => w2i (i2w k - i2w 17) = sub(k, 17)); val _ = pr_ln "test12b" test12b val test12c = checkrange(0, 300) (fn k => w2i (i2w k * i2w 17) = mul(k, 17)); val _ = pr_ln "test12c" test12c val test12d = checkrange(0, 300) (fn k => w2i (i2w k div i2w 17) = idiv(k, 17)); val _ = pr_ln "test12d" test12d val test12e = checkrange(0, 300) (fn k => w2i (i2w k mod i2w 17) = imod(k, 17)); val _ = pr_ln "test12e" test12e val test12f = checkrange(0, 300) (fn k => w2i (i2w k + i2w maxnegint) = add(k, maxnegint)); val _ = pr_ln "test12f" test12f val test12g = checkrange(0, 300) (fn k => w2i (i2w maxnegint - i2w k - i2w 1) = sub(maxposint,k)); val _ = pr_ln "test12g" test12g val test12h = checkrange(0, 300) (fn k => w2i (i2w k * i2w maxnegint) = mul(imod(k, 2), maxnegint)); val _ = pr_ln "test12h" test12h val test12i = checkrange(0, 300) (fn k => w2i (i2w k * i2w maxposint + i2w k) = mul(imod(k, 2), maxnegint)); val _ = pr_ln "test12i" test12i val test12j = checkrange(0, 300) (fn k => w2i (i2w k div i2w ~1) = 0); val _ = pr_ln "test12j" test12j val test12k = checkrange(0, 300) (fn k => w2i (i2w k mod i2w ~1) = k); val _ = pr_ln "test12k" test12k val test12l = check(w2i (i2w maxposint + i2w 1) = maxnegint); val _ = pr_ln "test12l" test12l val test12m = check(w2i (i2w maxnegint - i2w 1) = maxposint); val _ = pr_ln "test12m" test12m val test12n = check(w2i (i2w ~1 div i2w 2) = maxposint); val _ = pr_ln "test12n" test12n val test12o = check(w2i (i2w ~1 mod i2w 2) = 1); val _ = pr_ln "test12o" test12o val test12p = check(w2i (i2w ~1 div i2w 100) = idiv(maxposint, 50)); val _ = pr_ln "test12p" test12p (*31bit val test12q = check(w2i (i2w ~1 mod i2w 10) = 7); val _ = pr_ln "test12q" test12q *) val test12r = (i2w 17 div i2w 0 seq "WRONG") handle Div => "OK" | _ => "WRONG"; val _ = pr_ln "test12r" test12r val test12s = (i2w 17 mod i2w 0 seq "WRONG") handle Div => "OK" | _ => "WRONG"; val _ = pr_ln "test12s" test12s fun chk f (s, r) = check'(fn _ => case f s of SOME res => res = i2w r | NONE => false) fun chkScan fmt = chk (StringCvt.scanString (scan fmt)) val test13a = List.map (chk fromString) [("20Af", 8367), (" \n\t20AfGrap", 8367), ("0w20Af", 0 (*8367*)), (" \n\t0w20AfGrap", 0 (*8367*)), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 1), ("0wX1", 1), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test13a" (concat test13a) val test13b = List.map (fn s => case fromString s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "GG"]; val _ = pr_ln "test13b" (concat test13b) val test14a = List.map (chkScan StringCvt.DEC) [("10789", 10789), (" \n\t10789crap", 10789), ("0w10789", 10789), (" \n\t0w10789crap", 10789), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test14a" (concat test14a) val test14b = List.map (fn s => case StringCvt.scanString (scan StringCvt.DEC) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "ff"]; val _ = pr_ln "test14b" (concat test14b) val test15a = List.map (chkScan StringCvt.BIN) [("10010", 18), (" \n\t10010crap", 18), ("0w10010", 18), (" \n\t0w10010crap", 18), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test15a" (concat test15a) val test15b = List.map (fn s => case StringCvt.scanString (scan StringCvt.BIN) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "2", "8", "ff"]; val _ = pr_ln "test15b" (concat test15b) val test16a = List.map (chkScan StringCvt.OCT) [("2071", 1081), (" \n\t2071crap", 1081), ("0w2071", 1081), (" \n\t0w2071crap", 1081), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test16a" (concat test16a) val test16b = List.map (fn s => case StringCvt.scanString (scan StringCvt.OCT) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "8", "ff"]; val _ = pr_ln "test16b" (concat test16b) val test17a = List.map (chkScan StringCvt.HEX) [("20Af", 8367), (" \n\t20AfGrap", 8367), ("0wx20Af", 8367), (" \n\t0wx20AfGrap", 8367), ("0wX20Af", 8367), (" \n\t0wX20AfGrap", 8367), ("0x20Af", 8367), (" \n\t0x20AfGrap", 8367), ("0X20Af", 8367), (" \n\t0X20AfGrap", 8367), ("0", 0), ("0w", 0), ("0w ", 0), ("0w1", 0 (*1*)), ("0W1", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 1), ("0wX1", 1)]; val _ = pr_ln "test17a" (concat test17a) val test17b = List.map (fn s => case StringCvt.scanString (scan StringCvt.HEX) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1"]; val _ = pr_ln "test17b" (concat test17b) end; local fun fromToString i = fromString (toString (fromInt i)) = SOME (fromInt i); fun scanFmt radix i = let val w = fromInt i val s = fmt radix w in StringCvt.scanString (scan radix) s = SOME w end; in val test18 = check'(fn _ => range (0, 1200) fromToString); val _ = pr_ln "test18" test18 val test19 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.BIN)); val _ = pr_ln "test19" test19 val test20 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.OCT)); val _ = pr_ln "test20" test20 val test21 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.DEC)); val _ = pr_ln "test21" test21 val test22 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.HEX)); val _ = pr_ln "test22" test22 end end; mlton-20210117+dfsg/regression/word8array.ok000066400000000000000000000012151416264345000206420ustar00rootroot00000000000000Testing Word8Array... test1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5a OK test5b OK test6a OK test6b OK test6c OK test7 OK test8a OK test8b OK test9 OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test9i OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test11k OK mlton-20210117+dfsg/regression/word8array.sml000066400000000000000000000202001416264345000210170ustar00rootroot00000000000000(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/word8array.sml -- some test cases for Word8Array PS 1994-12-21, 1995-05-11 *) (*KILL 05/11/1997 11:05. tho.: use "auxil.sml"; *) val _ = print "Testing Word8Array...\n"; local open Word8Array infix 9 sub; val array0 = fromList []; val copy = fn {src, si, len, dst, di} => Word8ArraySlice.copy {src = Word8ArraySlice.slice (src, si, len), dst = dst, di = di} val extract = fn (a, i, sz) => Word8ArraySlice.vector (Word8ArraySlice.slice (a, i, sz)) in val i2w = Word8.fromInt; val w127 = i2w 127; val a = fromList (map i2w [0,1,2,3,4,5,6]); val b = fromList (map i2w [44,55,66]); val c = fromList (map i2w [0,1,2,3,4,5,6]); val test1:unit = tst' "test1" (fn () => a<>c); val test2:unit = tst' "test2" (fn () => array(0, w127) <> array0 andalso array(0, w127) <> tabulate(0, fn _ => w127) andalso tabulate(0, fn _ => w127) <> fromList [] andalso array(0, w127) <> array(0, w127) andalso tabulate(0, fn _ => w127) <> tabulate(0, fn _ => w127) andalso fromList [] <> fromList []) val d = tabulate(100, fn i => i2w (i mod 7)) val test3:unit = tst' "test3" (fn () => d sub 27 = i2w 6) val test4a:unit = tst0 "test4a" ((tabulate(maxLen+1, i2w) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG") val test4b:unit = tst0 "test4b" ((tabulate(~1, i2w) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test4c:unit = tst' "test4c" (fn () => length (tabulate(0, fn i => i2w (i div 0))) = 0); val test5a:unit = tst' "test5a" (fn () => length (fromList []) = 0 andalso length a = 7); val test5b:unit = tst' "test5b" (fn () => length array0 = 0); val test6a:unit = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6b:unit = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6c:unit = tst' "test6c" (fn () => c sub 0 = i2w 0); val e = array(203, i2w 0); val _ = (copy{src=d, si=0, dst=e, di=0, len=NONE}; copy{src=b, si=0, dst=e, di=length d, len=NONE}; copy{src=d, si=0, dst=e, di=length d + length b, len=NONE}); fun a2v a = extract(a, 0, NONE); val ev = Word8Vector.concat [a2v d, a2v b, a2v d]; val test7:unit = tst' "test7" (fn () => length e = 203); val test8a:unit = tst0 "test8a" ((update(e, ~1, w127); "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8b:unit = tst0 "test8b" ((update(e, length e, w127); "WRONG") handle Subscript => "OK" | _ => "WRONG") val f = extract (e, 100, SOME 3); fun equal (v, v') = let val n = Word8Vector.length v val n' = Word8Vector.length v' fun loop i = i = n orelse (Word8Vector.sub (v, i) = Word8Vector.sub (v', i) andalso loop (i + 1)) in n = n' andalso loop 0 end val test9:unit = tst' "test9" (fn () => equal (f, a2v b)); val test9a:unit = tst' "test9a" (fn () => equal (ev, extract(e, 0, NONE)) andalso equal (ev, extract(e, 0, SOME (length e)))); val test9b:unit = tst' "test9b" (fn () => equal (Word8Vector.fromList [], extract(e, 100, SOME 0))); val test9c:unit = tst0 "test9c" ((extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d:unit = tst0 "test9d" ((extract(e, length e+1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e:unit = tst0 "test9e" ((extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f:unit = tst0 "test9f" ((extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g:unit = tst0 "test9g" ((extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h:unit = tst0 "test9h" ((extract(e, length e+1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9i:unit = tst' "test9i" (fn () => equal (a2v (fromList []), extract(e, length e, SOME 0)) andalso equal (a2v (fromList []), extract(e, length e, NONE))); val _ = copy{src=e, si=0, dst=e, di=0, len=NONE}; val g = array(203, w127); val _ = copy{src=e, si=0, dst=g, di=0, len=NONE}; val test10a:unit = tst' "test10a" (fn () => equal (ev, extract(e, 0, NONE)) andalso equal (ev, extract(e, 0, SOME (length e)))); val test10b:unit = tst' "test10b" (fn () => equal (ev, extract(g, 0, NONE)) andalso equal (ev, extract(g, 0, SOME (length g)))); val _ = copy{src=g, si=203, dst=g, di=0, len=SOME 0}; val test10c:unit = tst' "test10c" (fn () => equal (ev, extract(g, 0, NONE))); val _ = copy{src=g, si=0, dst=g, di=203, len=SOME 0}; val test10d:unit = tst' "test10d" (fn () => equal (ev, extract(g, 0, NONE))); val _ = copy{src=g, si=0, dst=g, di=1, len=SOME (length g-1)}; val test10e:unit = tst' "test10e" (fn () => equal (a2v b, extract(g, 101, SOME 3))); val _ = copy{src=g, si=1, dst=g, di=0, len=SOME(length g-1)}; val test10f:unit = tst' "test10f" (fn () => equal (a2v b, extract(g, 100, SOME 3))); val _ = copy{src=g, si=202, dst=g, di=202, len=SOME 1}; val test10g:unit = tst' "test10g" (fn () => g sub 202 = i2w ((202-1-103) mod 7)); val test10h:unit = tst' "test10h" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=NONE}; array0 <> array(0, w127))); val test10i:unit = tst' "test10i" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=SOME 0}; array0 <> array(0, w127))); val test11a:unit = tst0 "test11a" ((copy{src=g, si= ~1, dst=g, di=0, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11b:unit = tst0 "test11b" ((copy{src=g, si=0, dst=g, di= ~1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11c:unit = tst0 "test11c" ((copy{src=g, si=1, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11d:unit = tst0 "test11d" ((copy{src=g, si=0, dst=g, di=1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e:unit = tst0 "test11e" ((copy{src=g, si=203, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11f:unit = tst0 "test11f" ((copy{src=g, si= ~1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g:unit = tst0 "test11g" ((copy{src=g, si=0, dst=g, di= ~1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h:unit = tst0 "test11h" ((copy{src=g, si=1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i:unit = tst0 "test11i" ((copy{src=g, si=0, dst=g, di=1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j:unit = tst0 "test11j" ((copy{src=g, si=0, dst=g, di=0, len=SOME (length g+1)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11k:unit = tst0 "test11k" ((copy{src=g, si=203, dst=g, di=0, len=SOME 1}; "WRONG") handle Subscript => "OK" | _ => "WRONG") end; mlton-20210117+dfsg/regression/word8vector.ok000066400000000000000000000007461416264345000210360ustar00rootroot00000000000000test1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5 OK test6a OK test6b OK test6c OK test7 OK test8 OK test9 OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test9i OK test_chkiter OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test11f OK test11g OK test11h OK test11i OK mlton-20210117+dfsg/regression/word8vector.sml000066400000000000000000000126371416264345000212220ustar00rootroot00000000000000type word8 = Word8.word (* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/vector.sml -- some test cases for Vector PS 1994-12-10, 1995-06-14 *) (*KILL 05/11/1997 11:05. tho.: use "auxil.sml"; *) local open Word8Vector; fun extract (vec, s, l) = Word8VectorSlice.vector (Word8VectorSlice.slice (vec, s, l)) fun mapi f (vec, s, l) = Word8VectorSlice.mapi (fn (i,x) => f (i+s,x)) (Word8VectorSlice.slice (vec, s, l)) val i2w = Word8.fromInt; infix 9 sub; in val a = fromList (List.map i2w [0,1,2,3,4,5,6]); val b = fromList (List.map i2w [44,55,66]); val c = fromList (List.map i2w [0,1,2,3,4,5,6]); fun equal (v, v') = let val n = Word8Vector.length v val n' = Word8Vector.length v' fun loop i = i = n orelse (Word8Vector.sub (v, i) = Word8Vector.sub (v', i) andalso loop (i + 1)) in n = n' andalso loop 0 end val test1:unit = tst' "test1" (fn _ => not (equal (a,b))); val test2:unit = tst' "test2" (fn _ => equal (a, c)); val d = tabulate(100, fn i => i2w (i mod 7)); val test3:unit = tst' "test3" (fn _ => d sub 27 = i2w 6); val test4a:unit = tst0 "test4a" ((tabulate(maxLen+1, i2w) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG") val test4b:unit = tst0 "test4b" ((tabulate(~1, i2w) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test4c:unit = tst' "test4c" (fn _ => length (tabulate(0, fn i => i2w (i div 0))) = 0); val test5:unit = tst' "test5" (fn _ => length (fromList []) = 0 andalso length a = 7); val test6a:unit = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6b:unit = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6c:unit = tst' "test6c" (fn _ => c sub 0 = i2w 0); val e = concat [d, b, d]; val test7:unit = tst' "test7" (fn _ => length e = 203); val test8:unit = tst' "test8" (fn _ => length (concat []) = 0); val f = extract (e, 100, SOME 3); val test9:unit = tst' "test9" (fn _ => equal (f, b)); val test9a:unit = tst' "test9a" (fn _ => equal (e, extract(e, 0, SOME (length e))) andalso equal (e, extract(e, 0, NONE))); val test9b:unit = tst' "test9b" (fn _ => equal (fromList [], extract(e, 100, SOME 0))); val test9c:unit = tst0 "test9c" ((extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d:unit = tst0 "test9d" ((extract(e, length e + 1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e:unit = tst0 "test9e" ((extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f:unit = tst0 "test9f" ((extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g:unit = tst0 "test9g" ((extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h:unit = tst0 "test9h" ((extract(e, length e + 1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9i:unit = tst' "test9i" (fn _ => equal (fromList [], extract (e, length e, SOME 0)) andalso equal (fromList [], extract(e, length e, NONE))); fun chkiter iter f vec (res', last') = tst' "test_chkiter" (fn _ => let val last = ref (0w255:word8) val res = iter (fn x => (last := x; f x)) vec in equal (res, res') andalso !last = last' end) fun chkiteri iter f vec (res', last') = tst' "test_chkiteri" (fn _ => let val last = ref ~1 val res = iter (fn (i, x) => (last := i; f x)) vec in equal (res, res') andalso !last = last' end) val test10a:unit = chkiter map (fn x => 0w2*x) b (fromList [0w88,0w110,0w132], 0w66) val test11a:unit = chkiteri mapi (fn x => 0w2*x) (b, 0, NONE) (fromList [0w88,0w110,0w132], 2) val test11b:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, NONE) (fromList [0w110,0w132], 2) val test11c:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, SOME 0) (fromList [], ~1) val test11d:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, SOME 1) (fromList [0w110], 1) val test11e:unit = chkiteri mapi (fn x => 0w2*x) (b, 3, NONE) (fromList [], ~1) val test11f:unit = tst0 "test11f" ((mapi #2 (b, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g:unit = tst0 "test11g" ((mapi #2 (b, 3, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h:unit = tst0 "test11h" ((mapi #2 (b, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i:unit = tst0 "test11i" ((mapi #2 (b, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end; mlton-20210117+dfsg/regression/wordn-array.ok000066400000000000000000000000161416264345000210030ustar00rootroot000000000000009 9 9 9 9 9 9 mlton-20210117+dfsg/regression/wordn-array.sml000066400000000000000000000005741416264345000211760ustar00rootroot00000000000000(* Make sure that arrays of odd-size words work. *) functor F (W: WORD) = struct val v = Vector.tabulate (10, W.fromInt) val () = print (concat [W.toString (Vector.sub (v, 9)), "\n"]) end structure S = F (Word5) structure S = F (Word7) structure S = F (Word9) structure S = F (Word14) structure S = F (Word17) structure S = F (Word22) structure S = F (Word30) mlton-20210117+dfsg/regression/world1.ok000066400000000000000000000000411416264345000177440ustar00rootroot00000000000000I am the original I am the clone mlton-20210117+dfsg/regression/world1.sml000066400000000000000000000014131416264345000201320ustar00rootroot00000000000000fun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = case save w of Clone => (print "I am the clone\n"; succeed ()) | Original => print "I am the original\n" val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20210117+dfsg/regression/world2.ok000066400000000000000000000000031416264345000177430ustar00rootroot0000000000000030 mlton-20210117+dfsg/regression/world2.sml000066400000000000000000000016471416264345000201440ustar00rootroot00000000000000fun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val a = Array.array (10000, 17) val _ = case save w of Original => () | Clone => (Array.update (a, 0, 13) ; print (concat [Int.toString (Array.sub (a, 0) + Array.sub (a, 1)), "\n"]) ; succeed ()) val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20210117+dfsg/regression/world3.ok000066400000000000000000000000131416264345000177450ustar00rootroot00000000000000caught foo mlton-20210117+dfsg/regression/world3.sml000066400000000000000000000015521416264345000201400ustar00rootroot00000000000000fun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out exception Foo fun f n = if n = 0 then (case save w of Original => 0 | Clone => raise Foo) else f (n - 1) + 1 val _ = (f 13; ()) handle Foo => (print "caught foo\n"; succeed ()) val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20210117+dfsg/regression/world4.ok000066400000000000000000000001151416264345000177510ustar00rootroot00000000000000before saves between saves after saves between saves after saves after saves mlton-20210117+dfsg/regression/world4.sml000066400000000000000000000022321416264345000201350ustar00rootroot00000000000000fun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w1, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val (w2, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = print "before saves\n" val original = ref true val _ = (case save w1 of Clone => original := false | Original => ()) val _ = print "between saves\n" val _ = (case save w2 of Clone => original := false | Original => ()) val _ = print "after saves\n" val _ = if !original then (run (fn () => load w1) ; run (fn () => load w2) ; OS.FileSys.remove w1 ; OS.FileSys.remove w2) else () mlton-20210117+dfsg/regression/world5.ok000066400000000000000000000000201416264345000177450ustar00rootroot00000000000000success success mlton-20210117+dfsg/regression/world5.sml000066400000000000000000000032411416264345000201370ustar00rootroot00000000000000fun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World MLton.Signal Posix.Signal Posix.Process Posix.ProcEnv val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val childReady = ref false fun print s = TextIO.output (TextIO.stdErr, s) val _ = setHandler (usr1, Handler.simple (fn () => childReady := true)) val parent = getpid () val _ = case fork () of NONE => let val canExit = ref false in setHandler (usr1, Handler.handler (fn t => (canExit := true ; saveThread (w, t) ; t))) ; kill (K_PROC parent, usr1) ; let fun loop () = if !canExit then print "success\n" else loop () in loop () end ; let open OS.Process in exit success end end | SOME child => let fun loop () = if !childReady then () else loop () in loop () ; kill (K_PROC child, usr1) ; wait () ; run (fn () => load w) ; OS.FileSys.remove w end mlton-20210117+dfsg/regression/world6.ok000066400000000000000000000000171416264345000177540ustar00rootroot00000000000000./world6 a b c mlton-20210117+dfsg/regression/world6.sml000066400000000000000000000017471416264345000201510ustar00rootroot00000000000000fun run(f: unit -> unit) = case Posix.Process.fork() of SOME pid => let open Posix.Process val (pid', status) = waitpid(W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit((f(); success) handle _ => failure) end fun succeed() = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = case save w of Clone => let fun p s = (print s; print "\n") in p (CommandLine.name ()) ; List.app p (CommandLine.arguments ()) ; succeed () end | Original => () val _ = OS.Process.system (concat[CommandLine.name (), " @MLton load-world ", w, " -- a b c"]) val _ = OS.FileSys.remove w mlton-20210117+dfsg/runtime/000077500000000000000000000000001416264345000155115ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/.gitignore000066400000000000000000000001221416264345000174740ustar00rootroot00000000000000## Ignore all *.a, *.d, and *.o files *.a *.d *.o /gdtoa/ /c-types.h /ml-types.h mlton-20210117+dfsg/runtime/Makefile000066400000000000000000000241161416264345000171550ustar00rootroot00000000000000## Copyright (C) 2010-2013,2018,2019-2020 Matthew Fluet. # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## ROOT := .. include $(ROOT)/Makefile.config ###################################################################### ifeq ($(TARGET), self) CROSS_PREFIX := else CROSS_PREFIX := $(TARGET)- endif EXE := MDVARIANTS := OPT DBG PIVARIANTS := DPI NPI PIC PIE OPTSUFFIX := DBGSUFFIX := -dbg DPISUFFIX := NPISUFFIX := -npi PICSUFFIX := -pic PIESUFFIX := -pie WITH_OPT_RUNTIME := true WITH_DBG_RUNTIME := true WITH_DPI_RUNTIME := true WITH_NPI_RUNTIME := $(or $(findstring true,$(RELEASE) $(WITH_ALL_RUNTIME)),false) WITH_PIC_RUNTIME := $(or $(findstring true,$(RELEASE) $(WITH_ALL_RUNTIME)),false) WITH_PIE_RUNTIME := $(or $(findstring true,$(RELEASE) $(WITH_ALL_RUNTIME)),false) # These flags can be overridden by the user CCFLAGS := MFLAGS := CPPFLAGS := CFLAGS := LDFLAGS := XCCFLAGS := -std=gnu11 XMFLAGS := XCPPFLAGS := XCFLAGS := -fno-common -pedantic -Wall -Wextra OPTXCFLAGS := -Wdisabled-optimization -O2 DBGXCFLAGS := -g -DASSERT=1 -Wno-uninitialized -O0 DPIXCFLAGS := NPIXCFLAGS := -fno-pic -fno-pie PICXCFLAGS := -fPIC PIEXCFLAGS := -fPIE XLDFLAGS := ifneq ($(WITH_GMP_INC_DIR),) XCPPFLAGS += -I$(WITH_GMP_INC_DIR) endif ifneq ($(WITH_GMP_LIB_DIR),) XLDFLAGS += -L$(WITH_GMP_LIB_DIR) endif XCPPFLAGS += -I. # Win32&64 don't use PIC code, all other platforms do ifeq ($(findstring $(TARGET_OS), mingw cygwin),$(TARGET_OS)) WITH_PIC_RUNTIME := false WITH_PIE_RUNTIME := false endif # Make mlton library symbols private (win32&64 use another technique) ifeq ($(findstring $(TARGET_OS), mingw cygwin),) XCFLAGS += -fvisibility=hidden endif ifeq ($(TARGET_ARCH), alpha) XMFLAGS += -mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d endif ifeq ($(TARGET_ARCH), amd64) XMFLAGS += -m64 endif ifeq ($(TARGET_ARCH), ia64) XMFLAGS += -mtune=itanium2 ifeq ($(TARGET_OS), hpux) XMFLAGS += -mlp64 endif endif ifeq ($(TARGET_OS)-$(TARGET_ARCH), aix-powerpc64) XMFLAGS += -maix64 AR := ar -X 64 rc endif ifeq ($(TARGET_ARCH), sparc) XMFLAGS += -m32 -mcpu=v8 XCFLAGS := -Wa,-xarch=v8plusa endif ifeq ($(TARGET_ARCH), x86) XMFLAGS += -m32 endif ifeq ($(TARGET_OS), cygwin) EXE := .exe endif ifeq ($(TARGET_OS), mingw) EXE := .exe # GCC doesn't recognize the %I64 format specifier which means %ll on windows XCFLAGS += -Wno-format -Wno-missing-format-attribute endif ifeq ($(TARGET_OS), solaris) XCFLAGS += -funroll-all-loops endif ### MK_FLAGS ### ## MK_FLAGS (SRC,PHASE[,KS]) define MK_FLAGS $(strip \ $(XCCFLAGS) $($(1)_XCCFLAGS) $(CCFLAGS) \ $(XMFLAGS) $($(1)_XMFLAGS) $(MFLAGS) \ $(if $(findstring $(2),CPP C),$(CPPFLAGS) $(XCPPFLAGS) $($(1)_XCPPFLAGS)) \ $(if $(findstring $(2),C), \ $(CFLAGS) \ $(XCFLAGS) \ $(foreach K,$(3),$($(K)XCFLAGS)) \ $($(1)_XCFLAGS) \ $(foreach K,$(3),$($(1)_$(K)XCFLAGS))) \ $(if $(findstring $(2),LD),$(LDFLAGS) $(XLDFLAGS) $($(1)_XLDFLAGS)) \ ) endef ### Position-independent (or not) ### ifeq ($(shell echo "__pie__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C,PIE) -P -E -),2) HAVE_PIE := true ifeq ($(shell echo "__pie__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C) -P -E -),2) WITH_DEFAULT_PIE := true else WITH_DEFAULT_PIE := false endif else HAVE_PIE := false WITH_PIE_RUNTIME := false WITH_DEFAULT_PIE := false endif ifeq ($(shell echo "__pic__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C,PIC) -P -E -),2) HAVE_PIC := true ifeq ($(WITH_DEFAULT_PIE),true) WITH_DEFAULT_PIC := false else ifeq ($(shell echo "__pic__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C) -P -E -),2) WITH_DEFAULT_PIC := true else WITH_DEFAULT_PIC := false endif else HAVE_PIC := false WITH_PIC_RUNTIME := false WITH_DEFAULT_PIC := false endif ifeq ($(shell echo "__pic__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C,NPI) -P -E -),__pic__) HAVE_NPI := true ifeq ($(shell echo "__pic__" | $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,-,C) -P -E -),__pic__) WITH_DEFAULT_NPI := true else WITH_DEFAULT_NPI := false endif else HAVE_NPI := false WITH_NPI_RUNTIME := false WITH_DEFAULT_NPI := false endif ### pattern rules ### %.d: %.c $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,$<,CPP) -MM -MG $(foreach MD,$(MDVARIANTS),$(foreach PI,$(PIVARIANTS),-MT $(subst .d,$($(MD)SUFFIX)$($(PI)SUFFIX).o,$@))) -MT $@ -MM -MG -MF $@ $< ## O_C_TEMPLATE (MD,PI) define O_C_TEMPLATE %$($(1)SUFFIX)$($(2)SUFFIX).o: %.c $$(CROSS_PREFIX)$$(CC) $$(call MK_FLAGS,$$<,C,$(1) $(2)) -c -o $$@ $$< endef $(foreach MD,$(MDVARIANTS),$(foreach PI,$(PIVARIANTS), \ $(eval $(call O_C_TEMPLATE,$(MD),$(PI))))) %$(EXE): %.o $(CROSS_PREFIX)$(CC) $(call MK_FLAGS,$<,LD) -o $@ $^ %.a: $(RM) $@ $(CROSS_PREFIX)$(AR) rc $@ $^ $(CROSS_PREFIX)$(RANLIB) $@ define A_TEMPLATE $(foreach MD,$(MDVARIANTS),$(foreach PI,$(PIVARIANTS), \ ifeq ($(and $(findstring DPI,$(PI)),$(findstring true,$(foreach PIX,$(PIVARIANTS),$(WITH_DEFAULT_$(PIX))))),true) $(foreach PIX,$(PIVARIANTS), \ ifeq ($(WITH_DEFAULT_$(PIX)),true) lib$(1)$($(MD)SUFFIX).a: lib$(1)$($(MD)SUFFIX)$($(PIX)SUFFIX).a $$(CP) $$< $$@ endif ) else lib$(1)$($(MD)SUFFIX)$($(PI)SUFFIX).a: $(patsubst %.o,%$($(MD)SUFFIX)$($(PI)SUFFIX).o,$($(2)_OBJS)) endif )) endef ### all ### LIBS := \ $(foreach MD,$(MDVARIANTS), \ $(if $(findstring true,$(WITH_$(MD)_RUNTIME)),\ $(foreach PI,$(PIVARIANTS), \ $(if $(findstring true,$(WITH_$(PI)_RUNTIME)),\ $(patsubst %.a,%$($(MD)SUFFIX)$($(PI)SUFFIX).a,libgdtoa.a libmlton.a))))) ALL += $(LIBS) gen/constants gen/c-types.sml gen/basis-ffi.sml .PHONY: all all: $(ALL) ### c-types.h ml-types.h gen/c-types.sml ### c-types.h: gen/c-types.h $(CP) $< $@ ml-types.h: gen/ml-types.h $(CP) $< $@ gen/ml-types.h: gen/gen-types$(EXE) ./gen/gen-types$(EXE) ml-types.h > gen/ml-types.h gen/c-types.h: gen/gen-types$(EXE) ./gen/gen-types$(EXE) c-types.h > gen/c-types.h gen/c-types.sml: gen/gen-types$(EXE) ./gen/gen-types$(EXE) c-types.sml > gen/c-types.sml ifneq ($(MAKECMDGOALS),clean) -include gen/gen-types.d endif gen/gen-types$(EXE): util.o ### basis-ffi.h gen/basis-ffi.sml ### basis-ffi.h: gen/basis-ffi.h $(CP) $< $@ define BASIS_FFI_TEMPLATE ifeq ($(shell cat gen/gen-basis-ffi.sml gen/basis-ffi.def gen/$(1) | $(SHA1DGST)),$(shell cat gen/$(1).chk)) gen/$(1): gen/gen-basis-ffi.sml gen/basis-ffi.def touch gen/$(1) else gen/$(1): gen/gen-basis-ffi$(EXE) gen/basis-ffi.def ./gen/gen-basis-ffi$(EXE) $(1) < gen/basis-ffi.def > gen/$(1) cat gen/gen-basis-ffi.sml gen/basis-ffi.def gen/$(1) | $(SHA1DGST) > gen/$(1).chk endif endef $(eval $(call BASIS_FFI_TEMPLATE,basis-ffi.h)) $(eval $(call BASIS_FFI_TEMPLATE,basis-ffi.sml)) $(eval $(call BASIS_FFI_TEMPLATE,gen-basis-ffi-consts.c)) gen/gen-basis-ffi$(EXE): gen/gen-basis-ffi.sml $(RUN_MLTON) -output gen/gen-basis-ffi$(EXE) gen/gen-basis-ffi.sml ### libgdtoa ### GDTOA_CFILES := \ dmisc.c g_ddfmt.c g_ffmt_p.c gdtoa.c misc.c strtoIf.c strtodI.c strtopdd.c strtord.c sum.c \ dtoa.c g_ddfmt_p.c g_xLfmt.c gethex.c smisc.c strtoIg.c strtodg.c strtopf.c strtordd.c ulp.c \ g_Qfmt.c g_dfmt.c g_xLfmt_p.c gmisc.c strtoIQ.c strtoIx.c strtof.c strtopx.c strtorf.c \ g_Qfmt_p.c g_dfmt_p.c g_xfmt.c hd_init.c strtoId.c strtoIxL.c strtopQ.c strtopxL.c strtorx.c \ g__fmt.c g_ffmt.c g_xfmt_p.c hexnan.c strtoIdd.c strtod.c strtopd.c strtorQ.c strtorxL.c GDTOA_CFILES := $(patsubst %,gdtoa/%,$(GDTOA_CFILES)) GDTOA_OBJS := $(patsubst %.c,%.o,$(GDTOA_CFILES)) $(foreach F,$(GDTOA_CFILES), $(eval $(F)_XCFLAGS := -w -DINFNAN_CHECK)) ifneq ($(MAKECMDGOALS),clean) -include $(patsubst %.o,%.d,$(GDTOA_OBJS)) endif $(eval $(call A_TEMPLATE,gdtoa,GDTOA)) gdtoa/gdtoa.h $(GDTOACFILES): gdtoa/README @touch $@ gdtoa/README: gdtoa.tgz gdtoa.may_alias-unions.patch gdtoa.rename-public-fns.patch gdtoa.hide-private-fns.patch gdtoa.hide-public-fns.patch gdtoa.include-via-gdtoa.patch $(GZIP) -dc gdtoa.tgz | $(TAR) xf - $(PATCH) -s -d gdtoa -p1 gdtoa/arith.h gdtoa/arithchk.c: gdtoa/README @touch $@ gdtoa/arithchk.c_XCFLAGS := -w -O1 ifneq ($(MAKECMDGOALS),clean) -include gdtoa/arithchk.d endif gdtoa/gd_qnan.h: gdtoa/qnan$(EXE) ./gdtoa/qnan$(EXE) > gdtoa/gd_qnan.h gdtoa/qnan.c: gdtoa/README @touch $@ gdtoa/qnan.c_XCFLAGS := -w -O1 ifneq ($(MAKECMDGOALS),clean) -include gdtoa/qnan.d endif ### libmlton ### BASIS_CFILES := $(shell $(FIND) basis -type f -name '*.c') MLTON_OBJS := gc.o platform.o platform/$(TARGET_OS).o util.o MLTON_OBJS += $(patsubst %.c,%.o,$(BASIS_CFILES)) gc.c_XCFLAGS := -Wno-address-of-packed-member ifneq ($(MAKECMDGOALS),clean) -include $(patsubst %.o,%.d,$(MLTON_OBJS)) endif $(eval $(call A_TEMPLATE,mlton,MLTON)) ### gen/constants ### gen/constants: gen/gen-constants$(EXE) ./gen/gen-constants > gen/constants ifneq ($(MAKECMDGOALS),clean) -include gen/gen-constants.d endif gen/gen-constants$(EXE): libmlton.a ### bootstrap ### ifeq (true,$(shell if [ -d bootstrap ]; then echo true; else echo false; fi)) BOOTSTRAP_CFILES := $(shell $(FIND) bootstrap -type f -name '*.c') BOOTSTRAP_OBJS := $(patsubst %.c,%.o,$(BOOTSTRAP_CFILES)) bootstrap/$(MLTON_OUTPUT)$(EXE): $(BOOTSTRAP_OBJS) libmlton.a libgdtoa.a $(CC) $(call MK_FLAGS,-,LD) -L. -o $@ $(BOOTSTRAP_OBJS) -lmlton -lgdtoa -lgmp -lm bootstrap/%.o: bootstrap/%.c $(CC) $(call MK_FLAGS,-,C) -O1 -fno-strict-aliasing -foptimize-sibling-calls -w -I$(ROOT)/include -w -c -o $@ $< endif ###### SHOW_VARS += TARGET TARGET_ARCH TARGET_OS SHOW_VARS += WITH_OPT_RUNTIME WITH_DBG_RUNTIME WITH_DPI_RUNTIME WITH_NPI_RUNTIME WITH_PIC_RUNTIME WITH_PIE_RUNTIME SHOW_VARS += XCCFLAGS XMFLAGS XCPPFLAGS XCFLAGS OPTXCFLAGS DBGXCFLAGS DPIXCFLAGS NPIXCFLAGS PICXCFLAGS PIEXCFLAGS XLDFLAGS SHOW_VARS += HAVE_NPI WITH_DEFAULT_NPI HAVE_PIE WITH_DEFAULT_PIE HAVE_PIC WITH_DEFAULT_PIC SHOW_VARS += LIBS $(eval $(MK_SHOW_CONFIG)) .PHONY: clean clean: ../bin/clean mlton-20210117+dfsg/runtime/basis-ffi.h000066400000000000000000001722531416264345000175370ustar00rootroot00000000000000/* This file is automatically generated. Do not edit. */ #ifndef _MLTON_BASIS_FFI_H_ #define _MLTON_BASIS_FFI_H_ PRIVATE extern C_Int_t CommandLine_argc; PRIVATE extern C_StringArray_t CommandLine_argv; PRIVATE extern C_String_t CommandLine_commandName; PRIVATE C_String_t Cygwin_toFullWindowsPath(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t)); PRIVATE C_Double_t Date_localOffset(void); PRIVATE C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t)); PRIVATE C_Errno_t(C_Time_t) Date_mkTime(void); PRIVATE C_Size_t Date_strfTime(Array(Char8_t),C_Size_t,NullString8_t); PRIVATE C_Int_t Date_Tm_getHour(void); PRIVATE C_Int_t Date_Tm_getIsDst(void); PRIVATE C_Int_t Date_Tm_getMDay(void); PRIVATE C_Int_t Date_Tm_getMin(void); PRIVATE C_Int_t Date_Tm_getMon(void); PRIVATE C_Int_t Date_Tm_getSec(void); PRIVATE C_Int_t Date_Tm_getWDay(void); PRIVATE C_Int_t Date_Tm_getYDay(void); PRIVATE C_Int_t Date_Tm_getYear(void); PRIVATE void Date_Tm_setHour(C_Int_t); PRIVATE void Date_Tm_setIsDst(C_Int_t); PRIVATE void Date_Tm_setMDay(C_Int_t); PRIVATE void Date_Tm_setMin(C_Int_t); PRIVATE void Date_Tm_setMon(C_Int_t); PRIVATE void Date_Tm_setSec(C_Int_t); PRIVATE void Date_Tm_setWDay(C_Int_t); PRIVATE void Date_Tm_setYDay(C_Int_t); PRIVATE void Date_Tm_setYear(C_Int_t); PRIVATE C_Int_t IEEEReal_getRoundingMode(void); PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_UPWARD; PRIVATE C_Int_t IEEEReal_setRoundingMode(C_Int_t); PRIVATE void MinGW_clearNonBlock(C_Fd_t); PRIVATE C_Size_t MinGW_getTempPath(C_Size_t,Array(Char8_t)); PRIVATE void MinGW_setNonBlock(C_Fd_t); PRIVATE __attribute__((noreturn)) void MLton_bug(String8_t); PRIVATE extern const C_Int_t MLton_Itimer_PROF; PRIVATE extern const C_Int_t MLton_Itimer_REAL; PRIVATE C_Errno_t(C_Int_t) MLton_Itimer_set(C_Int_t,C_Time_t,C_SUSeconds_t,C_Time_t,C_SUSeconds_t); PRIVATE extern const C_Int_t MLton_Itimer_VIRTUAL; PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawne(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawnp(NullString8_t,Array(NullString8_t)); PRIVATE extern const C_Int_t MLton_Rlimit_AS; PRIVATE extern const C_Int_t MLton_Rlimit_CORE; PRIVATE extern const C_Int_t MLton_Rlimit_CPU; PRIVATE extern const C_Int_t MLton_Rlimit_DATA; PRIVATE extern const C_Int_t MLton_Rlimit_FSIZE; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_get(C_Int_t); PRIVATE C_RLim_t MLton_Rlimit_getHard(void); PRIVATE C_RLim_t MLton_Rlimit_getSoft(void); PRIVATE extern const C_RLim_t MLton_Rlimit_INFINITY; PRIVATE extern const C_Int_t MLton_Rlimit_MEMLOCK; PRIVATE extern const C_Int_t MLton_Rlimit_NOFILE; PRIVATE extern const C_Int_t MLton_Rlimit_NPROC; PRIVATE extern const C_Int_t MLton_Rlimit_RSS; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_set(C_Int_t,C_RLim_t,C_RLim_t); PRIVATE extern const C_Int_t MLton_Rlimit_STACK; PRIVATE C_Time_t MLton_Rusage_children_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_children_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_utime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_utime_usec(void); PRIVATE void MLton_Rusage_getrusage(GCState_t); PRIVATE C_Time_t MLton_Rusage_self_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_self_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_utime_usec(void); PRIVATE void MLton_Syslog_closelog(void); PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_AUTH; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_CRON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_DAEMON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_KERN; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LPR; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_MAIL; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_NEWS; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_USER; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_UUCP; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_CONS; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PERROR; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PID; PRIVATE void MLton_Syslog_openlog(NullString8_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ALERT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_CRIT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_DEBUG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_EMERG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ERR; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_INFO; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_NOTICE; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_WARNING; PRIVATE void MLton_Syslog_syslog(C_Int_t,NullString8_t); PRIVATE Word32_t Net_htonl(Word32_t); PRIVATE Word16_t Net_htons(Word16_t); PRIVATE Word32_t Net_ntohl(Word32_t); PRIVATE Word16_t Net_ntohs(Word16_t); PRIVATE C_Int_t NetHostDB_getByAddress(Vector(Word8_t),C_Socklen_t); PRIVATE C_Int_t NetHostDB_getByName(NullString8_t); PRIVATE void NetHostDB_getEntryAddrsN(C_Int_t,Array(Word8_t)); PRIVATE C_Int_t NetHostDB_getEntryAddrsNum(void); PRIVATE C_Int_t NetHostDB_getEntryAddrType(void); PRIVATE C_String_t NetHostDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetHostDB_getEntryAliasesNum(void); PRIVATE C_Int_t NetHostDB_getEntryLength(void); PRIVATE C_String_t NetHostDB_getEntryName(void); PRIVATE C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t),C_Size_t); PRIVATE extern const C_Int_t NetHostDB_INADDR_ANY; PRIVATE extern const C_Size_t NetHostDB_inAddrSize; PRIVATE C_Int_t NetProtDB_getByName(NullString8_t); PRIVATE C_Int_t NetProtDB_getByNumber(C_Int_t); PRIVATE C_String_t NetProtDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetProtDB_getEntryAliasesNum(void); PRIVATE C_String_t NetProtDB_getEntryName(void); PRIVATE C_Int_t NetProtDB_getEntryProto(void); PRIVATE C_Int_t NetServDB_getByName(NullString8_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByNameNull(NullString8_t); PRIVATE C_Int_t NetServDB_getByPort(C_Int_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByPortNull(C_Int_t); PRIVATE C_String_t NetServDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetServDB_getEntryAliasesNum(void); PRIVATE C_String_t NetServDB_getEntryName(void); PRIVATE C_Int_t NetServDB_getEntryPort(void); PRIVATE C_String_t NetServDB_getEntryProto(void); PRIVATE C_Errno_t(C_Int_t) OS_IO_poll(Vector(C_Fd_t),Vector(C_Short_t),C_NFds_t,C_Int_t,Array(C_Short_t)); PRIVATE extern const C_Short_t OS_IO_POLLIN; PRIVATE extern const C_Short_t OS_IO_POLLOUT; PRIVATE extern const C_Short_t OS_IO_POLLPRI; PRIVATE void Posix_Error_clearErrno(void); PRIVATE extern const C_Int_t Posix_Error_E2BIG; PRIVATE extern const C_Int_t Posix_Error_EACCES; PRIVATE extern const C_Int_t Posix_Error_EADDRINUSE; PRIVATE extern const C_Int_t Posix_Error_EADDRNOTAVAIL; PRIVATE extern const C_Int_t Posix_Error_EAFNOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EAGAIN; PRIVATE extern const C_Int_t Posix_Error_EALREADY; PRIVATE extern const C_Int_t Posix_Error_EBADF; PRIVATE extern const C_Int_t Posix_Error_EBADMSG; PRIVATE extern const C_Int_t Posix_Error_EBUSY; PRIVATE extern const C_Int_t Posix_Error_ECANCELED; PRIVATE extern const C_Int_t Posix_Error_ECHILD; PRIVATE extern const C_Int_t Posix_Error_ECONNABORTED; PRIVATE extern const C_Int_t Posix_Error_ECONNREFUSED; PRIVATE extern const C_Int_t Posix_Error_ECONNRESET; PRIVATE extern const C_Int_t Posix_Error_EDEADLK; PRIVATE extern const C_Int_t Posix_Error_EDESTADDRREQ; PRIVATE extern const C_Int_t Posix_Error_EDOM; PRIVATE extern const C_Int_t Posix_Error_EDQUOT; PRIVATE extern const C_Int_t Posix_Error_EEXIST; PRIVATE extern const C_Int_t Posix_Error_EFAULT; PRIVATE extern const C_Int_t Posix_Error_EFBIG; PRIVATE extern const C_Int_t Posix_Error_EHOSTUNREACH; PRIVATE extern const C_Int_t Posix_Error_EIDRM; PRIVATE extern const C_Int_t Posix_Error_EILSEQ; PRIVATE extern const C_Int_t Posix_Error_EINPROGRESS; PRIVATE extern const C_Int_t Posix_Error_EINTR; PRIVATE extern const C_Int_t Posix_Error_EINVAL; PRIVATE extern const C_Int_t Posix_Error_EIO; PRIVATE extern const C_Int_t Posix_Error_EISCONN; PRIVATE extern const C_Int_t Posix_Error_EISDIR; PRIVATE extern const C_Int_t Posix_Error_ELOOP; PRIVATE extern const C_Int_t Posix_Error_EMFILE; PRIVATE extern const C_Int_t Posix_Error_EMLINK; PRIVATE extern const C_Int_t Posix_Error_EMSGSIZE; PRIVATE extern const C_Int_t Posix_Error_EMULTIHOP; PRIVATE extern const C_Int_t Posix_Error_ENAMETOOLONG; PRIVATE extern const C_Int_t Posix_Error_ENETDOWN; PRIVATE extern const C_Int_t Posix_Error_ENETRESET; PRIVATE extern const C_Int_t Posix_Error_ENETUNREACH; PRIVATE extern const C_Int_t Posix_Error_ENFILE; PRIVATE extern const C_Int_t Posix_Error_ENOBUFS; PRIVATE extern const C_Int_t Posix_Error_ENODATA; PRIVATE extern const C_Int_t Posix_Error_ENODEV; PRIVATE extern const C_Int_t Posix_Error_ENOENT; PRIVATE extern const C_Int_t Posix_Error_ENOEXEC; PRIVATE extern const C_Int_t Posix_Error_ENOLCK; PRIVATE extern const C_Int_t Posix_Error_ENOLINK; PRIVATE extern const C_Int_t Posix_Error_ENOMEM; PRIVATE extern const C_Int_t Posix_Error_ENOMSG; PRIVATE extern const C_Int_t Posix_Error_ENOPROTOOPT; PRIVATE extern const C_Int_t Posix_Error_ENOSPC; PRIVATE extern const C_Int_t Posix_Error_ENOSR; PRIVATE extern const C_Int_t Posix_Error_ENOSTR; PRIVATE extern const C_Int_t Posix_Error_ENOSYS; PRIVATE extern const C_Int_t Posix_Error_ENOTCONN; PRIVATE extern const C_Int_t Posix_Error_ENOTDIR; PRIVATE extern const C_Int_t Posix_Error_ENOTEMPTY; PRIVATE extern const C_Int_t Posix_Error_ENOTSOCK; PRIVATE extern const C_Int_t Posix_Error_ENOTSUP; PRIVATE extern const C_Int_t Posix_Error_ENOTTY; PRIVATE extern const C_Int_t Posix_Error_ENXIO; PRIVATE extern const C_Int_t Posix_Error_EOPNOTSUPP; PRIVATE extern const C_Int_t Posix_Error_EOVERFLOW; PRIVATE extern const C_Int_t Posix_Error_EPERM; PRIVATE extern const C_Int_t Posix_Error_EPIPE; PRIVATE extern const C_Int_t Posix_Error_EPROTO; PRIVATE extern const C_Int_t Posix_Error_EPROTONOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EPROTOTYPE; PRIVATE extern const C_Int_t Posix_Error_ERANGE; PRIVATE extern const C_Int_t Posix_Error_EROFS; PRIVATE extern const C_Int_t Posix_Error_ESPIPE; PRIVATE extern const C_Int_t Posix_Error_ESRCH; PRIVATE extern const C_Int_t Posix_Error_ESTALE; PRIVATE extern const C_Int_t Posix_Error_ETIME; PRIVATE extern const C_Int_t Posix_Error_ETIMEDOUT; PRIVATE extern const C_Int_t Posix_Error_ETXTBSY; PRIVATE extern const C_Int_t Posix_Error_EWOULDBLOCK; PRIVATE extern const C_Int_t Posix_Error_EXDEV; PRIVATE C_Int_t Posix_Error_getErrno(void); PRIVATE C_String_t Posix_Error_strError(C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_A_F_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_R_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_W_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_X_OK; PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_access(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chmod(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chown(NullString8_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir(C_DirP_t); PRIVATE C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir(NullString8_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir(C_DirP_t); PRIVATE void Posix_FileSys_Dirstream_rewindDir(C_DirP_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchmod(C_Fd_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchown(C_Fd_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_fpathconf(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_ftruncate(C_Fd_t,C_Off_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_getcwd(Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_link(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkdir(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkfifo(NullString8_t,C_Mode_t); PRIVATE extern const C_Int_t Posix_FileSys_O_APPEND; PRIVATE extern const C_Int_t Posix_FileSys_O_BINARY; PRIVATE extern const C_Int_t Posix_FileSys_O_CREAT; PRIVATE extern const C_Int_t Posix_FileSys_O_DSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_EXCL; PRIVATE extern const C_Int_t Posix_FileSys_O_NOCTTY; PRIVATE extern const C_Int_t Posix_FileSys_O_NONBLOCK; PRIVATE extern const C_Int_t Posix_FileSys_O_RDONLY; PRIVATE extern const C_Int_t Posix_FileSys_O_RDWR; PRIVATE extern const C_Int_t Posix_FileSys_O_RSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_SYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_TEXT; PRIVATE extern const C_Int_t Posix_FileSys_O_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_O_WRONLY; PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open2(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open3(NullString8_t,C_Int_t,C_Mode_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_pathconf(NullString8_t,C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN; PRIVATE extern const C_Int_t Posix_FileSys_PC_ASYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED; PRIVATE extern const C_Int_t Posix_FileSys_PC_FILESIZEBITS; PRIVATE extern const C_Int_t Posix_FileSys_PC_LINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_CANON; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_INPUT; PRIVATE extern const C_Int_t Posix_FileSys_PC_NAME_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_NO_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_PC_PATH_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_PIPE_BUF; PRIVATE extern const C_Int_t Posix_FileSys_PC_PRIO_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYMLINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS; PRIVATE extern const C_Int_t Posix_FileSys_PC_VDISABLE; PRIVATE C_Errno_t(C_SSize_t) Posix_FileSys_readlink(NullString8_t,Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rename(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rmdir(NullString8_t); PRIVATE extern const C_Mode_t Posix_FileSys_S_IFBLK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFCHR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFDIR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFIFO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFLNK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFMT; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFREG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFSOCK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IROTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXU; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISGID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISUID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISVTX; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXUSR; PRIVATE C_Int_t Posix_FileSys_ST_isBlk(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isChr(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isDir(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isFIFO(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isLink(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isReg(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isSock(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat(C_Fd_t); PRIVATE C_Time_t Posix_FileSys_Stat_getATime(void); PRIVATE C_Time_t Posix_FileSys_Stat_getCTime(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getDev(void); PRIVATE C_GId_t Posix_FileSys_Stat_getGId(void); PRIVATE C_INo_t Posix_FileSys_Stat_getINo(void); PRIVATE C_Mode_t Posix_FileSys_Stat_getMode(void); PRIVATE C_Time_t Posix_FileSys_Stat_getMTime(void); PRIVATE C_NLink_t Posix_FileSys_Stat_getNLink(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getRDev(void); PRIVATE C_Off_t Posix_FileSys_Stat_getSize(void); PRIVATE C_UId_t Posix_FileSys_Stat_getUId(void); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_symlink(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_truncate(NullString8_t,C_Off_t); PRIVATE C_Mode_t Posix_FileSys_umask(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_unlink(NullString8_t); PRIVATE void Posix_FileSys_Utimbuf_setAcTime(C_Time_t); PRIVATE void Posix_FileSys_Utimbuf_setModTime(C_Time_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_close(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup2(C_Fd_t,C_Fd_t); PRIVATE extern const C_Int_t Posix_IO_F_DUPFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFL; PRIVATE extern const C_Int_t Posix_IO_F_GETOWN; PRIVATE extern const C_Int_t Posix_IO_F_SETFD; PRIVATE extern const C_Int_t Posix_IO_F_SETFL; PRIVATE extern const C_Int_t Posix_IO_F_SETOWN; PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl2(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl3(C_Fd_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_FD_CLOEXEC; PRIVATE extern const C_Int_t Posix_IO_FLock_F_GETLK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_RDLCK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLKW; PRIVATE extern const C_Short_t Posix_IO_FLock_F_UNLCK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_WRLCK; PRIVATE C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl(C_Fd_t,C_Int_t); PRIVATE C_Off_t Posix_IO_FLock_getLen(void); PRIVATE C_PId_t Posix_IO_FLock_getPId(void); PRIVATE C_Off_t Posix_IO_FLock_getStart(void); PRIVATE C_Short_t Posix_IO_FLock_getType(void); PRIVATE C_Short_t Posix_IO_FLock_getWhence(void); PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_CUR; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_END; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_SET; PRIVATE void Posix_IO_FLock_setLen(C_Off_t); PRIVATE void Posix_IO_FLock_setPId(C_PId_t); PRIVATE void Posix_IO_FLock_setStart(C_Off_t); PRIVATE void Posix_IO_FLock_setType(C_Short_t); PRIVATE void Posix_IO_FLock_setWhence(C_Short_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fsync(C_Fd_t); PRIVATE C_Errno_t(C_Off_t) Posix_IO_lseek(C_Fd_t,C_Off_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_O_ACCMODE; PRIVATE C_Errno_t(C_Int_t) Posix_IO_pipe(Array(C_Fd_t)); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readChar8(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readWord8(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE extern const C_Int_t Posix_IO_SEEK_CUR; PRIVATE extern const C_Int_t Posix_IO_SEEK_END; PRIVATE extern const C_Int_t Posix_IO_SEEK_SET; PRIVATE void Posix_IO_setbin(C_Fd_t); PRIVATE void Posix_IO_settext(C_Fd_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec(C_Fd_t,Vector(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec(C_Fd_t,Vector(Word8_t),C_Int_t,C_Size_t); PRIVATE C_String_t Posix_ProcEnv_ctermid(void); PRIVATE extern C_StringArray_t Posix_ProcEnv_environ; PRIVATE C_GId_t Posix_ProcEnv_getegid(void); PRIVATE C_String_t Posix_ProcEnv_getenv(NullString8_t); PRIVATE C_UId_t Posix_ProcEnv_geteuid(void); PRIVATE C_GId_t Posix_ProcEnv_getgid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups(C_Int_t,Array(C_GId_t)); PRIVATE C_Int_t Posix_ProcEnv_getgroupsN(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_getlogin(void); PRIVATE C_PId_t Posix_ProcEnv_getpgrp(void); PRIVATE C_PId_t Posix_ProcEnv_getpid(void); PRIVATE C_PId_t Posix_ProcEnv_getppid(void); PRIVATE C_UId_t Posix_ProcEnv_getuid(void); PRIVATE C_Int_t Posix_ProcEnv_isatty(C_Fd_t); PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_BIND; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_SW_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_UPE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ARG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AVPHYS_PAGES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BARRIERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CHILD_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLK_TCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_FSYNC; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IOV_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IPV6; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LINE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_CONF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_ONLN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGESIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PHYS_PAGES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REGEXP; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SAVED_IDS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEMAPHORES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHELL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPAWN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_STREAM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMEOUTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_LOG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION; PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setenv(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups(C_Int_t,Vector(C_GId_t)); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid(C_PId_t,C_PId_t); PRIVATE C_Errno_t(C_PId_t) Posix_ProcEnv_setsid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setuid(C_UId_t); PRIVATE C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf(C_Int_t); PRIVATE C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCUTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getUTime(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_ttyname(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_uname(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getMachine(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getNodeName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getRelease(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getSysName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getVersion(void); PRIVATE C_UInt_t Posix_Process_alarm(C_UInt_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_exece(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_execp(NullString8_t,Array(NullString8_t)); PRIVATE __attribute__((noreturn)) void Posix_Process_exit(C_Status_t); PRIVATE C_Int_t Posix_Process_exitStatus(C_Status_t); PRIVATE C_Errno_t(C_PId_t) Posix_Process_fork(void); PRIVATE C_Int_t Posix_Process_ifExited(C_Status_t); PRIVATE C_Int_t Posix_Process_ifSignaled(C_Status_t); PRIVATE C_Int_t Posix_Process_ifStopped(C_Status_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_kill(C_PId_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_nanosleep(Ref(C_Time_t),Ref(C_Long_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_pause(void); PRIVATE C_UInt_t Posix_Process_sleep(C_UInt_t); PRIVATE C_Signal_t Posix_Process_stopSig(C_Status_t); PRIVATE C_Errno_t(C_Status_t) Posix_Process_system(NullString8_t); PRIVATE C_Signal_t Posix_Process_termSig(C_Status_t); PRIVATE extern const C_Int_t Posix_Process_W_NOHANG; PRIVATE extern const C_Int_t Posix_Process_W_UNTRACED; PRIVATE C_Errno_t(C_PId_t) Posix_Process_waitpid(C_PId_t,Ref(C_Status_t),C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_default(GCState_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_handlee(GCState_t,C_Signal_t); PRIVATE void Posix_Signal_handleGC(GCState_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_ignore(GCState_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isDefault(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isIgnore(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Int_t Posix_Signal_isPending(GCState_t,C_Signal_t); PRIVATE C_Int_t Posix_Signal_isPendingGC(GCState_t); PRIVATE extern const C_Int_t Posix_Signal_NSIG; PRIVATE void Posix_Signal_resetPending(GCState_t); PRIVATE extern const C_Int_t Posix_Signal_SIG_BLOCK; PRIVATE extern const C_Int_t Posix_Signal_SIG_SETMASK; PRIVATE extern const C_Int_t Posix_Signal_SIG_UNBLOCK; PRIVATE extern const C_Signal_t Posix_Signal_SIGABRT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigaddset(Array(Word8_t),C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGBUS; PRIVATE extern const C_Signal_t Posix_Signal_SIGCHLD; PRIVATE extern const C_Signal_t Posix_Signal_SIGCONT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigdelset(Array(Word8_t),C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigemptyset(Array(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigfillset(Array(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGFPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGHUP; PRIVATE extern const C_Signal_t Posix_Signal_SIGILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGINT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigismember(Vector(Word8_t),C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGKILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGPIPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGPOLL; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigprocmask(C_Int_t,Vector(Word8_t),Array(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGPROF; PRIVATE extern const C_Signal_t Posix_Signal_SIGQUIT; PRIVATE extern const C_Signal_t Posix_Signal_SIGSEGV; PRIVATE extern const C_Size_t Posix_Signal_sigSetLen; PRIVATE extern const C_Signal_t Posix_Signal_SIGSTOP; PRIVATE void Posix_Signal_sigsuspend(Vector(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGSYS; PRIVATE extern const C_Signal_t Posix_Signal_SIGTERM; PRIVATE extern const C_Signal_t Posix_Signal_SIGTRAP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTSTP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTIN; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTOU; PRIVATE extern const C_Signal_t Posix_Signal_SIGURG; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR1; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR2; PRIVATE extern const C_Signal_t Posix_Signal_SIGVTALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGXCPU; PRIVATE extern const C_Signal_t Posix_Signal_SIGXFSZ; PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_GId_t); PRIVATE C_GId_t Posix_SysDB_Group_getGId(void); PRIVATE C_StringArray_t Posix_SysDB_Group_getMem(void); PRIVATE C_String_t Posix_SysDB_Group_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getDir(void); PRIVATE C_GId_t Posix_SysDB_Passwd_getGId(void); PRIVATE C_String_t Posix_SysDB_Passwd_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getShell(void); PRIVATE C_UId_t Posix_SysDB_Passwd_getUId(void); PRIVATE extern const C_Speed_t Posix_TTY_B0; PRIVATE extern const C_Speed_t Posix_TTY_B110; PRIVATE extern const C_Speed_t Posix_TTY_B1200; PRIVATE extern const C_Speed_t Posix_TTY_B134; PRIVATE extern const C_Speed_t Posix_TTY_B150; PRIVATE extern const C_Speed_t Posix_TTY_B1800; PRIVATE extern const C_Speed_t Posix_TTY_B19200; PRIVATE extern const C_Speed_t Posix_TTY_B200; PRIVATE extern const C_Speed_t Posix_TTY_B2400; PRIVATE extern const C_Speed_t Posix_TTY_B300; PRIVATE extern const C_Speed_t Posix_TTY_B38400; PRIVATE extern const C_Speed_t Posix_TTY_B4800; PRIVATE extern const C_Speed_t Posix_TTY_B50; PRIVATE extern const C_Speed_t Posix_TTY_B600; PRIVATE extern const C_Speed_t Posix_TTY_B75; PRIVATE extern const C_Speed_t Posix_TTY_B9600; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CLOCAL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CREAD; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS5; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS6; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS7; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS8; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSIZE; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSTOPB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_HUPCL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARENB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARODD; PRIVATE extern const C_TCFlag_t Posix_TTY_I_BRKINT; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ICRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNBRK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNPAR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INPCK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ISTRIP; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXANY; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXOFF; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXON; PRIVATE extern const C_TCFlag_t Posix_TTY_I_PARMRK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHO; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOE; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHONL; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ICANON; PRIVATE extern const C_TCFlag_t Posix_TTY_L_IEXTEN; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ISIG; PRIVATE extern const C_TCFlag_t Posix_TTY_L_NOFLSH; PRIVATE extern const C_TCFlag_t Posix_TTY_L_TOSTOP; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BSDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CRDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FFDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NLDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OCRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OFILL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLRET; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONOCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OPOST; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TABDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VTDLY; PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_drain(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flow(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flush(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_getattr(C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setattr(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp(C_Fd_t,C_PId_t); PRIVATE extern const C_Int_t Posix_TTY_TC_TCIFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCION; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOON; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSADRAIN; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSAFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSANOW; PRIVATE C_Speed_t Posix_TTY_Termios_cfGetISpeed(void); PRIVATE C_Speed_t Posix_TTY_Termios_cfGetOSpeed(void); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed(C_Speed_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed(C_Speed_t); PRIVATE void Posix_TTY_Termios_getCC(Array(C_CC_t)); PRIVATE C_TCFlag_t Posix_TTY_Termios_getCFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getIFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getLFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getOFlag(void); PRIVATE void Posix_TTY_Termios_setCC(Array(C_CC_t)); PRIVATE void Posix_TTY_Termios_setCFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setIFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setLFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setOFlag(C_TCFlag_t); PRIVATE extern const C_Int_t Posix_TTY_V_NCCS; PRIVATE extern const C_Int_t Posix_TTY_V_VEOF; PRIVATE extern const C_Int_t Posix_TTY_V_VEOL; PRIVATE extern const C_Int_t Posix_TTY_V_VERASE; PRIVATE extern const C_Int_t Posix_TTY_V_VINTR; PRIVATE extern const C_Int_t Posix_TTY_V_VKILL; PRIVATE extern const C_Int_t Posix_TTY_V_VMIN; PRIVATE extern const C_Int_t Posix_TTY_V_VQUIT; PRIVATE extern const C_Int_t Posix_TTY_V_VSTART; PRIVATE extern const C_Int_t Posix_TTY_V_VSTOP; PRIVATE extern const C_Int_t Posix_TTY_V_VSUSP; PRIVATE extern const C_Int_t Posix_TTY_V_VTIME; PRIVATE INLINE Real32_t Real32_abs(Real32_t); PRIVATE INLINE Real32_t Real32_add(Real32_t,Real32_t); PRIVATE INLINE Word32_t Real32_castToWord32(Real32_t); PRIVATE INLINE Real32_t Real32_div(Real32_t,Real32_t); PRIVATE INLINE Bool_t Real32_equal(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_fetch(Ref(Real32_t)); PRIVATE INLINE Real32_t Real32_frexp(Real32_t,Ref(C_Int_t)); PRIVATE C_String_t Real32_gdtoa(Real32_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE INLINE Real32_t Real32_ldexp(Real32_t,C_Int_t); PRIVATE INLINE Bool_t Real32_le(Real32_t,Real32_t); PRIVATE INLINE Bool_t Real32_lt(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_acos(Real32_t); PRIVATE INLINE Real32_t Real32_Math_asin(Real32_t); PRIVATE INLINE Real32_t Real32_Math_atan(Real32_t); PRIVATE INLINE Real32_t Real32_Math_atan2(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_cos(Real32_t); PRIVATE INLINE Real32_t Real32_Math_cosh(Real32_t); PRIVATE INLINE Real32_t Real32_Math_exp(Real32_t); PRIVATE INLINE Real32_t Real32_Math_ln(Real32_t); PRIVATE INLINE Real32_t Real32_Math_log10(Real32_t); PRIVATE INLINE Real32_t Real32_Math_pow(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_sin(Real32_t); PRIVATE INLINE Real32_t Real32_Math_sinh(Real32_t); PRIVATE INLINE Real32_t Real32_Math_sqrt(Real32_t); PRIVATE INLINE Real32_t Real32_Math_tan(Real32_t); PRIVATE INLINE Real32_t Real32_Math_tanh(Real32_t); PRIVATE INLINE Real32_t Real32_modf(Real32_t,Ref(Real32_t)); PRIVATE INLINE void Real32_move(Ref(Real32_t),Ref(Real32_t)); PRIVATE INLINE Real32_t Real32_mul(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_muladd(Real32_t,Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_mulsub(Real32_t,Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_neg(Real32_t); PRIVATE INLINE Real32_t Real32_realCeil(Real32_t); PRIVATE INLINE Real32_t Real32_realFloor(Real32_t); PRIVATE INLINE Real32_t Real32_realTrunc(Real32_t); PRIVATE INLINE Real32_t Real32_rndToReal32(Real32_t); PRIVATE INLINE Real64_t Real32_rndToReal64(Real32_t); PRIVATE INLINE Int16_t Real32_rndToWordS16(Real32_t); PRIVATE INLINE Int32_t Real32_rndToWordS32(Real32_t); PRIVATE INLINE Int64_t Real32_rndToWordS64(Real32_t); PRIVATE INLINE Int8_t Real32_rndToWordS8(Real32_t); PRIVATE INLINE Word16_t Real32_rndToWordU16(Real32_t); PRIVATE INLINE Word32_t Real32_rndToWordU32(Real32_t); PRIVATE INLINE Word64_t Real32_rndToWordU64(Real32_t); PRIVATE INLINE Word8_t Real32_rndToWordU8(Real32_t); PRIVATE INLINE Real32_t Real32_round(Real32_t); PRIVATE INLINE void Real32_store(Ref(Real32_t),Real32_t); PRIVATE Real32_t Real32_strtor(NullString8_t,C_Int_t); PRIVATE INLINE Real32_t Real32_sub(Real32_t,Real32_t); PRIVATE INLINE Real64_t Real64_abs(Real64_t); PRIVATE INLINE Real64_t Real64_add(Real64_t,Real64_t); PRIVATE INLINE Word64_t Real64_castToWord64(Real64_t); PRIVATE INLINE Real64_t Real64_div(Real64_t,Real64_t); PRIVATE INLINE Bool_t Real64_equal(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_fetch(Ref(Real64_t)); PRIVATE INLINE Real64_t Real64_frexp(Real64_t,Ref(C_Int_t)); PRIVATE C_String_t Real64_gdtoa(Real64_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE INLINE Real64_t Real64_ldexp(Real64_t,C_Int_t); PRIVATE INLINE Bool_t Real64_le(Real64_t,Real64_t); PRIVATE INLINE Bool_t Real64_lt(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_acos(Real64_t); PRIVATE INLINE Real64_t Real64_Math_asin(Real64_t); PRIVATE INLINE Real64_t Real64_Math_atan(Real64_t); PRIVATE INLINE Real64_t Real64_Math_atan2(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_cos(Real64_t); PRIVATE INLINE Real64_t Real64_Math_cosh(Real64_t); PRIVATE INLINE Real64_t Real64_Math_exp(Real64_t); PRIVATE INLINE Real64_t Real64_Math_ln(Real64_t); PRIVATE INLINE Real64_t Real64_Math_log10(Real64_t); PRIVATE INLINE Real64_t Real64_Math_pow(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_sin(Real64_t); PRIVATE INLINE Real64_t Real64_Math_sinh(Real64_t); PRIVATE INLINE Real64_t Real64_Math_sqrt(Real64_t); PRIVATE INLINE Real64_t Real64_Math_tan(Real64_t); PRIVATE INLINE Real64_t Real64_Math_tanh(Real64_t); PRIVATE INLINE Real64_t Real64_modf(Real64_t,Ref(Real64_t)); PRIVATE INLINE void Real64_move(Ref(Real64_t),Ref(Real64_t)); PRIVATE INLINE Real64_t Real64_mul(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_muladd(Real64_t,Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_mulsub(Real64_t,Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_neg(Real64_t); PRIVATE INLINE Real64_t Real64_realCeil(Real64_t); PRIVATE INLINE Real64_t Real64_realFloor(Real64_t); PRIVATE INLINE Real64_t Real64_realTrunc(Real64_t); PRIVATE INLINE Real32_t Real64_rndToReal32(Real64_t); PRIVATE INLINE Real64_t Real64_rndToReal64(Real64_t); PRIVATE INLINE Int16_t Real64_rndToWordS16(Real64_t); PRIVATE INLINE Int32_t Real64_rndToWordS32(Real64_t); PRIVATE INLINE Int64_t Real64_rndToWordS64(Real64_t); PRIVATE INLINE Int8_t Real64_rndToWordS8(Real64_t); PRIVATE INLINE Word16_t Real64_rndToWordU16(Real64_t); PRIVATE INLINE Word32_t Real64_rndToWordU32(Real64_t); PRIVATE INLINE Word64_t Real64_rndToWordU64(Real64_t); PRIVATE INLINE Word8_t Real64_rndToWordU8(Real64_t); PRIVATE INLINE Real64_t Real64_round(Real64_t); PRIVATE INLINE void Real64_store(Ref(Real64_t),Real64_t); PRIVATE Real64_t Real64_strtor(NullString8_t,C_Int_t); PRIVATE INLINE Real64_t Real64_sub(Real64_t,Real64_t); PRIVATE C_Errno_t(C_Int_t) Socket_accept(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE extern const C_Int_t Socket_AF_INET; PRIVATE extern const C_Int_t Socket_AF_INET6; PRIVATE extern const C_Int_t Socket_AF_UNIX; PRIVATE extern const C_Int_t Socket_AF_UNSPEC; PRIVATE C_Errno_t(C_Int_t) Socket_bind(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_close(C_Sock_t); PRIVATE C_Errno_t(C_Int_t) Socket_connect(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getATMARK(C_Sock_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getNREAD(C_Sock_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getPeerName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Int(C_Sock_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Linger(C_Sock_t,C_Int_t,C_Int_t,Ref(C_Int_t),Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Int(C_Sock_t,C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Linger(C_Sock_t,C_Int_t,C_Int_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Socket_Ctl_SO_ACCEPTCONN; PRIVATE extern const C_Int_t Socket_Ctl_SO_BROADCAST; PRIVATE extern const C_Int_t Socket_Ctl_SO_DEBUG; PRIVATE extern const C_Int_t Socket_Ctl_SO_DONTROUTE; PRIVATE extern const C_Int_t Socket_Ctl_SO_ERROR; PRIVATE extern const C_Int_t Socket_Ctl_SO_KEEPALIVE; PRIVATE extern const C_Int_t Socket_Ctl_SO_LINGER; PRIVATE extern const C_Int_t Socket_Ctl_SO_OOBINLINE; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_REUSEADDR; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_TYPE; PRIVATE extern const C_Int_t Socket_Ctl_SOL_SOCKET; PRIVATE C_Int_t Socket_familyOfAddr(Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socket(C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socketPair(C_Int_t,C_Int_t,C_Int_t,Array(C_Int_t)); PRIVATE C_Time_t Socket_getTimeout_sec(void); PRIVATE C_SUSeconds_t Socket_getTimeout_usec(void); PRIVATE extern const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP; PRIVATE extern const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY; PRIVATE void Socket_INetSock_fromAddr(Vector(Word8_t)); PRIVATE void Socket_INetSock_getInAddr(Array(Word8_t)); PRIVATE Word16_t Socket_INetSock_getPort(void); PRIVATE void Socket_INetSock_toAddr(Vector(Word8_t),Word16_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_listen(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_MSG_CTRUNC; PRIVATE extern const C_Int_t Socket_MSG_DONTROUTE; PRIVATE extern const C_Int_t Socket_MSG_DONTWAIT; PRIVATE extern const C_Int_t Socket_MSG_EOR; PRIVATE extern const C_Int_t Socket_MSG_OOB; PRIVATE extern const C_Int_t Socket_MSG_PEEK; PRIVATE extern const C_Int_t Socket_MSG_TRUNC; PRIVATE extern const C_Int_t Socket_MSG_WAITALL; PRIVATE C_Errno_t(C_SSize_t) Socket_recv(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_recvFrom(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_select(Vector(C_Fd_t),Vector(C_Fd_t),Vector(C_Fd_t),Array(C_Int_t),Array(C_Int_t),Array(C_Int_t)); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArr(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArrTo(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVec(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVecTo(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE void Socket_setTimeout(C_Time_t,C_SUSeconds_t); PRIVATE void Socket_setTimeoutNull(void); PRIVATE extern const C_Int_t Socket_SHUT_RD; PRIVATE extern const C_Int_t Socket_SHUT_RDWR; PRIVATE extern const C_Int_t Socket_SHUT_WR; PRIVATE C_Errno_t(C_Int_t) Socket_shutdown(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_SOCK_DGRAM; PRIVATE extern const C_Int_t Socket_SOCK_RAW; PRIVATE extern const C_Int_t Socket_SOCK_SEQPACKET; PRIVATE extern const C_Int_t Socket_SOCK_STREAM; PRIVATE extern const C_Size_t Socket_sockAddrStorageLen; PRIVATE void Socket_UnixSock_fromAddr(Vector(Word8_t),Array(Char8_t),C_Size_t); PRIVATE C_Size_t Socket_UnixSock_pathLen(Vector(Word8_t)); PRIVATE void Socket_UnixSock_toAddr(NullString8_t,C_Size_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE void Stdio_print(String8_t); PRIVATE void Stdio_printStderr(String8_t); PRIVATE void Stdio_printStdout(String8_t); PRIVATE C_Int_t Time_getTimeOfDay(Ref(C_Time_t),Ref(C_SUSeconds_t)); PRIVATE C_Errno_t(C_PId_t) Windows_Process_create(NullString8_t,NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Windows_Process_createNull(NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Windows_Process_getexitcode(C_PId_t,Ref(C_Status_t)); PRIVATE C_Errno_t(C_Int_t) Windows_Process_terminate(C_PId_t,C_Signal_t); PRIVATE INLINE Word16_t Word16_add(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_andb(Word16_t,Word16_t); PRIVATE INLINE Bool_t Word16_equal(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_lshift(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_neg(Word16_t); PRIVATE INLINE Word16_t Word16_notb(Word16_t); PRIVATE INLINE Word16_t Word16_orb(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_rol(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_ror(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_sub(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_xorb(Word16_t,Word16_t); PRIVATE INLINE Word32_t Word32_add(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_andb(Word32_t,Word32_t); PRIVATE INLINE Real32_t Word32_castToReal32(Word32_t); PRIVATE INLINE Bool_t Word32_equal(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_lshift(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_neg(Word32_t); PRIVATE INLINE Word32_t Word32_notb(Word32_t); PRIVATE INLINE Word32_t Word32_orb(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_rol(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_ror(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_sub(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_xorb(Word32_t,Word32_t); PRIVATE INLINE Word64_t Word64_add(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_andb(Word64_t,Word64_t); PRIVATE INLINE Real64_t Word64_castToReal64(Word64_t); PRIVATE INLINE Bool_t Word64_equal(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_fetch(Ref(Word64_t)); PRIVATE INLINE Word64_t Word64_lshift(Word64_t,Word32_t); PRIVATE INLINE void Word64_move(Ref(Word64_t),Ref(Word64_t)); PRIVATE INLINE Word64_t Word64_neg(Word64_t); PRIVATE INLINE Word64_t Word64_notb(Word64_t); PRIVATE INLINE Word64_t Word64_orb(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_rol(Word64_t,Word32_t); PRIVATE INLINE Word64_t Word64_ror(Word64_t,Word32_t); PRIVATE INLINE void Word64_store(Ref(Word64_t),Word64_t); PRIVATE INLINE Word64_t Word64_sub(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_xorb(Word64_t,Word64_t); PRIVATE INLINE Word8_t Word8_add(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_andb(Word8_t,Word8_t); PRIVATE INLINE Bool_t Word8_equal(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_lshift(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_neg(Word8_t); PRIVATE INLINE Word8_t Word8_notb(Word8_t); PRIVATE INLINE Word8_t Word8_orb(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_rol(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_ror(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_sub(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_xorb(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordS16_addCheckP(Int16_t,Int16_t); PRIVATE INLINE Word16_t WordS16_extdToWord16(Int16_t); PRIVATE INLINE Word32_t WordS16_extdToWord32(Int16_t); PRIVATE INLINE Word64_t WordS16_extdToWord64(Int16_t); PRIVATE INLINE Word8_t WordS16_extdToWord8(Int16_t); PRIVATE INLINE Bool_t WordS16_ge(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_gt(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_le(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_lt(Int16_t,Int16_t); PRIVATE INLINE Int16_t WordS16_mul(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_mulCheckP(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_negCheckP(Int16_t); PRIVATE INLINE Int16_t WordS16_quot(Int16_t,Int16_t); PRIVATE INLINE Int16_t WordS16_rem(Int16_t,Int16_t); PRIVATE Real32_t WordS16_rndToReal32(Int16_t); PRIVATE Real64_t WordS16_rndToReal64(Int16_t); PRIVATE INLINE Int16_t WordS16_rshift(Int16_t,Word32_t); PRIVATE INLINE Bool_t WordS16_subCheckP(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS32_addCheckP(Int32_t,Int32_t); PRIVATE INLINE Word16_t WordS32_extdToWord16(Int32_t); PRIVATE INLINE Word32_t WordS32_extdToWord32(Int32_t); PRIVATE INLINE Word64_t WordS32_extdToWord64(Int32_t); PRIVATE INLINE Word8_t WordS32_extdToWord8(Int32_t); PRIVATE INLINE Bool_t WordS32_ge(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_gt(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_le(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_lt(Int32_t,Int32_t); PRIVATE INLINE Int32_t WordS32_mul(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_mulCheckP(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_negCheckP(Int32_t); PRIVATE INLINE Int32_t WordS32_quot(Int32_t,Int32_t); PRIVATE INLINE Int32_t WordS32_rem(Int32_t,Int32_t); PRIVATE Real32_t WordS32_rndToReal32(Int32_t); PRIVATE Real64_t WordS32_rndToReal64(Int32_t); PRIVATE INLINE Int32_t WordS32_rshift(Int32_t,Word32_t); PRIVATE INLINE Bool_t WordS32_subCheckP(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS64_addCheckP(Int64_t,Int64_t); PRIVATE INLINE Word16_t WordS64_extdToWord16(Int64_t); PRIVATE INLINE Word32_t WordS64_extdToWord32(Int64_t); PRIVATE INLINE Word64_t WordS64_extdToWord64(Int64_t); PRIVATE INLINE Word8_t WordS64_extdToWord8(Int64_t); PRIVATE INLINE Bool_t WordS64_ge(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_gt(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_le(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_lt(Int64_t,Int64_t); PRIVATE INLINE Int64_t WordS64_mul(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_mulCheckP(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_negCheckP(Int64_t); PRIVATE INLINE Int64_t WordS64_quot(Int64_t,Int64_t); PRIVATE INLINE Int64_t WordS64_rem(Int64_t,Int64_t); PRIVATE Real32_t WordS64_rndToReal32(Int64_t); PRIVATE Real64_t WordS64_rndToReal64(Int64_t); PRIVATE INLINE Int64_t WordS64_rshift(Int64_t,Word32_t); PRIVATE INLINE Bool_t WordS64_subCheckP(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS8_addCheckP(Int8_t,Int8_t); PRIVATE INLINE Word16_t WordS8_extdToWord16(Int8_t); PRIVATE INLINE Word32_t WordS8_extdToWord32(Int8_t); PRIVATE INLINE Word64_t WordS8_extdToWord64(Int8_t); PRIVATE INLINE Word8_t WordS8_extdToWord8(Int8_t); PRIVATE INLINE Bool_t WordS8_ge(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_gt(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_le(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_lt(Int8_t,Int8_t); PRIVATE INLINE Int8_t WordS8_mul(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_mulCheckP(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_negCheckP(Int8_t); PRIVATE INLINE Int8_t WordS8_quot(Int8_t,Int8_t); PRIVATE INLINE Int8_t WordS8_rem(Int8_t,Int8_t); PRIVATE Real32_t WordS8_rndToReal32(Int8_t); PRIVATE Real64_t WordS8_rndToReal64(Int8_t); PRIVATE INLINE Int8_t WordS8_rshift(Int8_t,Word32_t); PRIVATE INLINE Bool_t WordS8_subCheckP(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordU16_addCheckP(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_extdToWord16(Word16_t); PRIVATE INLINE Word32_t WordU16_extdToWord32(Word16_t); PRIVATE INLINE Word64_t WordU16_extdToWord64(Word16_t); PRIVATE INLINE Word8_t WordU16_extdToWord8(Word16_t); PRIVATE INLINE Bool_t WordU16_ge(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_gt(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_le(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_lt(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_mul(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_mulCheckP(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_negCheckP(Word16_t); PRIVATE INLINE Word16_t WordU16_quot(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_rem(Word16_t,Word16_t); PRIVATE Real32_t WordU16_rndToReal32(Word16_t); PRIVATE Real64_t WordU16_rndToReal64(Word16_t); PRIVATE INLINE Word16_t WordU16_rshift(Word16_t,Word32_t); PRIVATE INLINE Bool_t WordU16_subCheckP(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU32_addCheckP(Word32_t,Word32_t); PRIVATE INLINE Word16_t WordU32_extdToWord16(Word32_t); PRIVATE INLINE Word32_t WordU32_extdToWord32(Word32_t); PRIVATE INLINE Word64_t WordU32_extdToWord64(Word32_t); PRIVATE INLINE Word8_t WordU32_extdToWord8(Word32_t); PRIVATE INLINE Bool_t WordU32_ge(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_gt(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_le(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_lt(Word32_t,Word32_t); PRIVATE INLINE Word32_t WordU32_mul(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_mulCheckP(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_negCheckP(Word32_t); PRIVATE INLINE Word32_t WordU32_quot(Word32_t,Word32_t); PRIVATE INLINE Word32_t WordU32_rem(Word32_t,Word32_t); PRIVATE Real32_t WordU32_rndToReal32(Word32_t); PRIVATE Real64_t WordU32_rndToReal64(Word32_t); PRIVATE INLINE Word32_t WordU32_rshift(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_subCheckP(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU64_addCheckP(Word64_t,Word64_t); PRIVATE INLINE Word16_t WordU64_extdToWord16(Word64_t); PRIVATE INLINE Word32_t WordU64_extdToWord32(Word64_t); PRIVATE INLINE Word64_t WordU64_extdToWord64(Word64_t); PRIVATE INLINE Word8_t WordU64_extdToWord8(Word64_t); PRIVATE INLINE Bool_t WordU64_ge(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_gt(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_le(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_lt(Word64_t,Word64_t); PRIVATE INLINE Word64_t WordU64_mul(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_mulCheckP(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_negCheckP(Word64_t); PRIVATE INLINE Word64_t WordU64_quot(Word64_t,Word64_t); PRIVATE INLINE Word64_t WordU64_rem(Word64_t,Word64_t); PRIVATE Real32_t WordU64_rndToReal32(Word64_t); PRIVATE Real64_t WordU64_rndToReal64(Word64_t); PRIVATE INLINE Word64_t WordU64_rshift(Word64_t,Word32_t); PRIVATE INLINE Bool_t WordU64_subCheckP(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU8_addCheckP(Word8_t,Word8_t); PRIVATE INLINE Word16_t WordU8_extdToWord16(Word8_t); PRIVATE INLINE Word32_t WordU8_extdToWord32(Word8_t); PRIVATE INLINE Word64_t WordU8_extdToWord64(Word8_t); PRIVATE INLINE Word8_t WordU8_extdToWord8(Word8_t); PRIVATE INLINE Bool_t WordU8_ge(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_gt(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_le(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_lt(Word8_t,Word8_t); PRIVATE INLINE Word8_t WordU8_mul(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_mulCheckP(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_negCheckP(Word8_t); PRIVATE INLINE Word8_t WordU8_quot(Word8_t,Word8_t); PRIVATE INLINE Word8_t WordU8_rem(Word8_t,Word8_t); PRIVATE Real32_t WordU8_rndToReal32(Word8_t); PRIVATE Real64_t WordU8_rndToReal64(Word8_t); PRIVATE INLINE Word8_t WordU8_rshift(Word8_t,Word32_t); PRIVATE INLINE Bool_t WordU8_subCheckP(Word8_t,Word8_t); #endif /* _MLTON_BASIS_FFI_H_ */ mlton-20210117+dfsg/runtime/basis/000077500000000000000000000000001416264345000166125ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/IntInf/000077500000000000000000000000001416264345000200015ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/IntInf/int-inf.c000066400000000000000000000121371416264345000215150ustar00rootroot00000000000000#define MLTON_GC_INTERNAL_TYPES #define MLTON_GC_INTERNAL_BASIS #include "platform.h" PRIVATE objptr IntInf_add (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_andb (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_gcd (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_mul (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_quot (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_orb (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_rem (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_sub (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_xorb (GC_state s, objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_neg (GC_state s, objptr arg, size_t bytes); PRIVATE objptr IntInf_notb (GC_state s, objptr arg, size_t bytes); PRIVATE objptr IntInf_arshift (GC_state s, objptr arg, Word32_t shift, size_t bytes); PRIVATE objptr IntInf_lshift (GC_state s, objptr arg, Word32_t shift, size_t bytes); PRIVATE Int32_t IntInf_compare (GC_state s, objptr lhs, objptr rhs); PRIVATE objptr IntInf_toString (GC_state s, objptr arg, Int32_t base, size_t bytes); objptr IntInf_add (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_add ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_add); } objptr IntInf_andb (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_andb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_and); } objptr IntInf_gcd (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_gcd ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_gcd); } objptr IntInf_mul (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_mul ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_mul); } objptr IntInf_quot (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_quot ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_tdiv_q); } objptr IntInf_orb (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_orb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_ior); } objptr IntInf_rem (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_quot ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_tdiv_r); } objptr IntInf_sub (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_sub ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_sub); } objptr IntInf_xorb (GC_state s, objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_xorb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return IntInf_binop (s, lhs, rhs, bytes, &mpz_xor); } objptr IntInf_neg (GC_state s, objptr arg, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_neg ("FMTOBJPTR", %"PRIuMAX")\n", arg, (uintmax_t)bytes); return IntInf_unop (s, arg, bytes, &mpz_neg); } objptr IntInf_notb (GC_state s, objptr arg, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_notb ("FMTOBJPTR", %"PRIuMAX")\n", arg, (uintmax_t)bytes); return IntInf_unop (s, arg, bytes, &mpz_com); } objptr IntInf_arshift (GC_state s, objptr arg, Word32_t shift, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_arshift ("FMTOBJPTR", %"PRIu32", %"PRIuMAX")\n", arg, shift, (uintmax_t)bytes); return IntInf_shop (s, arg, shift, bytes, &mpz_fdiv_q_2exp); } objptr IntInf_lshift (GC_state s, objptr arg, Word32_t shift, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_lshift ("FMTOBJPTR", %"PRIu32", %"PRIuMAX")\n", arg, shift, (uintmax_t)bytes); return IntInf_shop (s, arg, shift, bytes, &mpz_mul_2exp); } Int32_t IntInf_compare (GC_state s, objptr lhs, objptr rhs) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_compare ("FMTOBJPTR", "FMTOBJPTR")\n", lhs, rhs); return IntInf_cmpop (s, lhs, rhs, &mpz_cmp); } objptr IntInf_toString (GC_state s, objptr arg, Int32_t base, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_toString ("FMTOBJPTR", %"PRId32", %"PRIuMAX")\n", arg, base, (uintmax_t)bytes); return IntInf_strop (s, arg, base, bytes, &mpz_get_str); } mlton-20210117+dfsg/runtime/basis/MLton/000077500000000000000000000000001416264345000176435ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Itimer/000077500000000000000000000000001416264345000210745ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Itimer/itimer-consts.c000066400000000000000000000002521416264345000240370ustar00rootroot00000000000000#include "platform.h" const C_Int_t MLton_Itimer_PROF = ITIMER_PROF; const C_Int_t MLton_Itimer_REAL = ITIMER_REAL; const C_Int_t MLton_Itimer_VIRTUAL = ITIMER_VIRTUAL; mlton-20210117+dfsg/runtime/basis/MLton/Itimer/set.c000066400000000000000000000007411416264345000220350ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) MLton_Itimer_set (C_Int_t which, C_Time_t interval_tv_sec, C_SUSeconds_t interval_tv_usec, C_Time_t value_tv_sec, C_SUSeconds_t value_tv_usec) { struct itimerval v; v.it_interval.tv_sec = interval_tv_sec; v.it_interval.tv_usec = interval_tv_usec; v.it_value.tv_sec = value_tv_sec; v.it_value.tv_usec = value_tv_usec; return setitimer (which, &v, (struct itimerval *)NULL); } mlton-20210117+dfsg/runtime/basis/MLton/Process/000077500000000000000000000000001416264345000212615ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Process/spawne.c000066400000000000000000000024451416264345000227270ustar00rootroot00000000000000#include "platform.h" #if HAS_SPAWN C_Errno_t(C_PId_t) MLton_Process_spawne (NullString8_t pNStr, Array(NullString8_t) aStr, Array(NullString8_t) eStr) { const char *path; char **args; char **env; int aLen; int eLen; char *aSaved; char *eSaved; C_PId_t res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getSequenceLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; env = (char **) eStr; eLen = GC_getSequenceLength((pointer)eStr); eSaved = env[eLen - 1]; env[eLen - 1] = NULL; res = spawnve (SPAWN_MODE, path, (const char * const *)args, (const char * const *)env); /* spawnve failed */ args[aLen - 1] = aSaved; env[eLen - 1] = eSaved; return (C_Errno_t(C_PId_t))res; } #else __attribute__ ((noreturn)) C_Errno_t(C_PId_t) MLton_Process_spawne (__attribute__ ((unused))NullString8_t pNStr, __attribute__ ((unused))Array(NullString8_t) aStr, __attribute__ ((unused))Array(NullString8_t) ePtr) { die ("MLton_Process_spawne not implemented"); } #endif mlton-20210117+dfsg/runtime/basis/MLton/Process/spawnp.c000066400000000000000000000015771416264345000227470ustar00rootroot00000000000000#include "platform.h" #if HAS_SPAWN C_Errno_t(C_PId_t) MLton_Process_spawnp (NullString8_t pNStr, Array(NullString8_t) aStr) { const char *path; char **args; int aLen; char *aSaved; C_PId_t res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getSequenceLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; res = spawnvp (SPAWN_MODE, path, (const char * const *)args); /* spawnvp failed */ args[aLen - 1] = aSaved; return (C_Errno_t(C_PId_t))res; } #else __attribute__ ((noreturn)) C_Errno_t(C_PId_t) MLton_Process_spawnp (__attribute__ ((unused)) NullString8_t pNStr, __attribute__ ((unused)) Array(NullString8_t) aStr) { die ("MLton_Process_spawnp not implemented"); } #endif mlton-20210117+dfsg/runtime/basis/MLton/Rlimit/000077500000000000000000000000001416264345000211035ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Rlimit/rlimit-consts.c000066400000000000000000000017451416264345000240650ustar00rootroot00000000000000#include "platform.h" #if (defined (RLIMIT_AS)) const C_Int_t MLton_Rlimit_AS = RLIMIT_AS; #elif (defined (RLIMIT_DATA)) const C_Int_t MLton_Rlimit_AS = RLIMIT_DATA; #else #error MLton_Rlimit_AS not defined #endif const C_Int_t MLton_Rlimit_CORE = RLIMIT_CORE; const C_Int_t MLton_Rlimit_CPU = RLIMIT_CPU; const C_Int_t MLton_Rlimit_DATA = RLIMIT_DATA; const C_Int_t MLton_Rlimit_FSIZE = RLIMIT_FSIZE; /* NOT STANDARD */ #if (defined (RLIMIT_MEMLOCK)) const C_Int_t MLton_Rlimit_MEMLOCK = RLIMIT_MEMLOCK; #else const C_Int_t MLton_Rlimit_MEMLOCK = -1; #endif /* */ const C_Int_t MLton_Rlimit_NOFILE = RLIMIT_NOFILE; /* NOT STANDARD */ #if (defined (RLIMIT_NPROC)) const C_Int_t MLton_Rlimit_NPROC = RLIMIT_NPROC; #else const C_Int_t MLton_Rlimit_NPROC = -1; #endif #if (defined (RLIMIT_RSS)) const C_Int_t MLton_Rlimit_RSS = RLIMIT_RSS; #else const C_Int_t MLton_Rlimit_RSS = -1; #endif /* */ const C_Int_t MLton_Rlimit_STACK = RLIMIT_STACK; const C_RLim_t MLton_Rlimit_INFINITY = RLIM_INFINITY; mlton-20210117+dfsg/runtime/basis/MLton/Rlimit/rlimit.c000066400000000000000000000010251416264345000225450ustar00rootroot00000000000000#include "platform.h" static struct rlimit MLton_RLimit_rlimit; C_Errno_t(C_Int_t) MLton_Rlimit_get (C_Int_t r) { return getrlimit (r, &MLton_RLimit_rlimit); } C_RLim_t MLton_Rlimit_getHard (void) { return MLton_RLimit_rlimit.rlim_max; } C_RLim_t MLton_Rlimit_getSoft (void) { return MLton_RLimit_rlimit.rlim_cur; } C_Errno_t(C_Int_t) MLton_Rlimit_set (C_Int_t r, C_RLim_t hard, C_RLim_t soft) { MLton_RLimit_rlimit.rlim_max = hard; MLton_RLimit_rlimit.rlim_cur = soft; return setrlimit (r, &MLton_RLimit_rlimit); } mlton-20210117+dfsg/runtime/basis/MLton/Rusage/000077500000000000000000000000001416264345000210715ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Rusage/rusage.c000066400000000000000000000027531416264345000225320ustar00rootroot00000000000000#include "platform.h" static struct rusage MLton_Rusage_self; static struct rusage MLton_Rusage_children; static struct rusage MLton_Rusage_gc; C_Time_t MLton_Rusage_self_utime_sec (void) { return MLton_Rusage_self.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_self_utime_usec (void) { return MLton_Rusage_self.ru_utime.tv_usec; } C_Time_t MLton_Rusage_self_stime_sec (void) { return MLton_Rusage_self.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_self_stime_usec (void) { return MLton_Rusage_self.ru_stime.tv_usec; } C_Time_t MLton_Rusage_children_utime_sec (void) { return MLton_Rusage_children.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_children_utime_usec (void) { return MLton_Rusage_children.ru_utime.tv_usec; } C_Time_t MLton_Rusage_children_stime_sec (void) { return MLton_Rusage_children.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_children_stime_usec (void) { return MLton_Rusage_children.ru_stime.tv_usec; } C_Time_t MLton_Rusage_gc_utime_sec (void) { return MLton_Rusage_gc.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_gc_utime_usec (void) { return MLton_Rusage_gc.ru_utime.tv_usec; } C_Time_t MLton_Rusage_gc_stime_sec (void) { return MLton_Rusage_gc.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_gc_stime_usec (void) { return MLton_Rusage_gc.ru_stime.tv_usec; } void MLton_Rusage_getrusage (GCState_t s) { MLton_Rusage_gc = *(GC_getRusageGCAddr (s)); getrusage (RUSAGE_SELF, &MLton_Rusage_self); getrusage (RUSAGE_CHILDREN, &MLton_Rusage_children); } mlton-20210117+dfsg/runtime/basis/MLton/Syslog/000077500000000000000000000000001416264345000211235ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/MLton/Syslog/Syslog-consts.c000066400000000000000000000041311416264345000240550ustar00rootroot00000000000000#include "platform.h" const C_Int_t MLton_Syslog_Logopt_LOG_CONS = LOG_CONS; const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY = LOG_NDELAY; const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT = LOG_NOWAIT; const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY = LOG_ODELAY; /* NOT STANDARD */ #if (defined (LOG_PERROR)) const C_Int_t MLton_Syslog_Logopt_LOG_PERROR = LOG_PERROR; #else const C_Int_t MLton_Syslog_Logopt_LOG_PERROR = -1; #endif /* */ const C_Int_t MLton_Syslog_Logopt_LOG_PID = LOG_PID; const C_Int_t MLton_Syslog_Facility_LOG_AUTH = LOG_AUTH; const C_Int_t MLton_Syslog_Facility_LOG_CRON = LOG_CRON; const C_Int_t MLton_Syslog_Facility_LOG_DAEMON = LOG_DAEMON; const C_Int_t MLton_Syslog_Facility_LOG_KERN = LOG_KERN; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0 = LOG_LOCAL0; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1 = LOG_LOCAL1; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2 = LOG_LOCAL2; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3 = LOG_LOCAL3; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4 = LOG_LOCAL4; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5 = LOG_LOCAL5; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6 = LOG_LOCAL6; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7 = LOG_LOCAL7; const C_Int_t MLton_Syslog_Facility_LOG_LPR = LOG_LPR; const C_Int_t MLton_Syslog_Facility_LOG_MAIL = LOG_MAIL; const C_Int_t MLton_Syslog_Facility_LOG_NEWS = LOG_NEWS; /* NOT STANDARD */ #if (defined (LOG_SYSLOG)) const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG = LOG_SYSLOG; #else const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG = -1; #endif /* */ const C_Int_t MLton_Syslog_Facility_LOG_USER = LOG_USER; const C_Int_t MLton_Syslog_Facility_LOG_UUCP = LOG_UUCP; const C_Int_t MLton_Syslog_Severity_LOG_ALERT = LOG_ALERT; const C_Int_t MLton_Syslog_Severity_LOG_CRIT = LOG_CRIT; const C_Int_t MLton_Syslog_Severity_LOG_DEBUG = LOG_DEBUG; const C_Int_t MLton_Syslog_Severity_LOG_EMERG = LOG_EMERG; const C_Int_t MLton_Syslog_Severity_LOG_ERR = LOG_ERR; const C_Int_t MLton_Syslog_Severity_LOG_INFO = LOG_INFO; const C_Int_t MLton_Syslog_Severity_LOG_NOTICE = LOG_NOTICE; const C_Int_t MLton_Syslog_Severity_LOG_WARNING = LOG_WARNING; mlton-20210117+dfsg/runtime/basis/MLton/Syslog/Syslog.c000066400000000000000000000006071416264345000225520ustar00rootroot00000000000000#include "platform.h" void MLton_Syslog_closelog(void) { closelog(); } /* openlog relies on the string being around forever. */ void MLton_Syslog_openlog(NullString8_t s, C_Int_t o, C_Int_t f) { const char *s_ = strdup ((const char*)s); if (s_ == NULL) s_ = ""; openlog (s_, o, f); } void MLton_Syslog_syslog(C_Int_t p, NullString8_t s) { syslog(p, "%s", (const char*)s); } mlton-20210117+dfsg/runtime/basis/MLton/bug.c000066400000000000000000000005061416264345000205650ustar00rootroot00000000000000#include "platform.h" /* print a bug message and exit (2) */ void MLton_bug (String8_t msg) { uintmax_t size = GC_getSequenceLength ((pointer)msg); fprintf (stderr, "MLton bug: "); fwrite ((const void*)msg, (size_t)size, 1, stderr); fprintf (stderr, "\nPlease send a bug report to MLton@mlton.org.\n"); exit (2); } mlton-20210117+dfsg/runtime/basis/Net/000077500000000000000000000000001416264345000173405ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Net/Net.c000066400000000000000000000005021416264345000202270ustar00rootroot00000000000000#include "platform.h" Word32_t Net_htonl (Word32_t w) { Word32_t r = htonl (w); return r; } Word32_t Net_ntohl (Word32_t w) { Word32_t r = ntohl (w); return r; } Word16_t Net_htons (Word16_t w) { Word16_t r = htons (w); return r; } Word16_t Net_ntohs (Word16_t w) { Word16_t r = ntohs (w); return r; } mlton-20210117+dfsg/runtime/basis/Net/NetHostDB-consts.c000066400000000000000000000002071416264345000226040ustar00rootroot00000000000000#include "platform.h" const C_Size_t NetHostDB_inAddrSize = sizeof (struct in_addr); const C_Int_t NetHostDB_INADDR_ANY = INADDR_ANY; mlton-20210117+dfsg/runtime/basis/Net/NetHostDB.c000066400000000000000000000031031416264345000212730ustar00rootroot00000000000000#include "platform.h" static struct hostent *NetHostDB_hostent; C_String_t NetHostDB_getEntryName(void) { return (C_String_t)(NetHostDB_hostent->h_name); } C_Int_t NetHostDB_getEntryAliasesNum(void) { int num = 0; while (NetHostDB_hostent->h_aliases[num] != NULL) num++; return num; } C_String_t NetHostDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetHostDB_hostent->h_aliases[n]); } C_Int_t NetHostDB_getEntryAddrType(void) { return NetHostDB_hostent->h_addrtype; } C_Int_t NetHostDB_getEntryLength(void) { return NetHostDB_hostent->h_length; } C_Int_t NetHostDB_getEntryAddrsNum(void) { int num = 0; while (NetHostDB_hostent->h_addr_list[num] != NULL) num++; return num; } void NetHostDB_getEntryAddrsN(C_Int_t n, Array(Word8_t) addr) { int i; for (i = 0; i < NetHostDB_hostent->h_length; i++) { ((char*)addr)[i] = NetHostDB_hostent->h_addr_list[n][i]; } return; } C_Int_t NetHostDB_getByAddress(Vector(Word8_t) addr, C_Socklen_t len) { MLton_initSockets (); NetHostDB_hostent = gethostbyaddr((const char*)addr, len, AF_INET); return (C_Int_t)(NetHostDB_hostent != NULL and NetHostDB_hostent->h_name != NULL); } C_Int_t NetHostDB_getByName(NullString8_t name) { MLton_initSockets (); NetHostDB_hostent = gethostbyname((const char*)name); return (C_Int_t)(NetHostDB_hostent != NULL and NetHostDB_hostent->h_name != NULL); } C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t) buf, C_Size_t len) { int out; MLton_initSockets (); out = gethostname ((char*)buf, len); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20210117+dfsg/runtime/basis/Net/NetProtDB.c000066400000000000000000000015531416264345000213110ustar00rootroot00000000000000#include "platform.h" static struct protoent *NetProtDB_protoent; C_String_t NetProtDB_getEntryName(void) { return (C_String_t)(NetProtDB_protoent->p_name); } C_Int_t NetProtDB_getEntryAliasesNum(void) { int num = 0; while (NetProtDB_protoent->p_aliases[num] != NULL) num++; return num; } C_String_t NetProtDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetProtDB_protoent->p_aliases[n]); } C_Int_t NetProtDB_getEntryProto(void) { return NetProtDB_protoent->p_proto; } C_Int_t NetProtDB_getByName(NullString8_t name) { NetProtDB_protoent = getprotobyname((const char*)name); return (C_Int_t)(NetProtDB_protoent != NULL and NetProtDB_protoent->p_name != NULL); } C_Int_t NetProtDB_getByNumber(C_Int_t proto) { NetProtDB_protoent = getprotobynumber(proto); return (C_Int_t)(NetProtDB_protoent != NULL and NetProtDB_protoent->p_name != NULL); } mlton-20210117+dfsg/runtime/basis/Net/NetServDB.c000066400000000000000000000023461416264345000213050ustar00rootroot00000000000000#include "platform.h" static struct servent *NetHostDB_servent; C_String_t NetServDB_getEntryName(void) { return (C_String_t)(NetHostDB_servent->s_name); } C_Int_t NetServDB_getEntryAliasesNum(void) { int num = 0; while (NetHostDB_servent->s_aliases[num] != NULL) num++; return num; } C_String_t NetServDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetHostDB_servent->s_aliases[n]); } C_Int_t NetServDB_getEntryPort(void) { return NetHostDB_servent->s_port; } C_String_t NetServDB_getEntryProto(void) { return (C_String_t)(NetHostDB_servent->s_proto); } C_Int_t NetServDB_getByName(NullString8_t name, NullString8_t proto) { NetHostDB_servent = getservbyname((const char*)name, (const char*)proto); return (C_Int_t)(NetHostDB_servent != NULL and NetHostDB_servent->s_name != NULL); } C_Int_t NetServDB_getByNameNull(NullString8_t name) { return NetServDB_getByName(name, (NullString8_t)NULL); } C_Int_t NetServDB_getByPort(C_Int_t port, NullString8_t proto) { NetHostDB_servent = getservbyport(port, (const char*)proto); return (C_Int_t)(NetHostDB_servent != NULL and NetHostDB_servent->s_name != NULL); } C_Int_t NetServDB_getByPortNull(C_Int_t port) { return NetServDB_getByPort(port, (NullString8_t)NULL); } mlton-20210117+dfsg/runtime/basis/Net/Socket/000077500000000000000000000000001416264345000205705ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Net/Socket/GenericSock.c000066400000000000000000000010261416264345000231270ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Socket_GenericSock_socket (C_Int_t domain, C_Int_t type, C_Int_t protocol) { int out; MLton_initSockets (); out = socket (domain, type, protocol); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_GenericSock_socketPair (C_Int_t domain, C_Int_t type, C_Int_t protocol, Array(C_Int_t) sv) { int out; MLton_initSockets (); out = socketpair (domain, type, protocol, (int*)sv); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20210117+dfsg/runtime/basis/Net/Socket/INetSock-consts.c000066400000000000000000000002211416264345000237150ustar00rootroot00000000000000#include "platform.h" const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP = IPPROTO_TCP; const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY = TCP_NODELAY; mlton-20210117+dfsg/runtime/basis/Net/Socket/INetSock.c000066400000000000000000000017111416264345000224130ustar00rootroot00000000000000#include "platform.h" void Socket_INetSock_toAddr (Vector(Word8_t) in_addr, Word16_t port, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { struct sockaddr_in *sa = (struct sockaddr_in*)addr; sa->sin_family = AF_INET; sa->sin_port = (uint16_t)port; sa->sin_addr = *(const struct in_addr*)in_addr; *((socklen_t*)addrlen) = sizeof(struct sockaddr_in); } static uint16_t Socket_INetSock_fromAddr_port; static struct in_addr Socket_INetSock_fromAddr_in_addr; void Socket_INetSock_fromAddr (Vector(Word8_t) addr) { const struct sockaddr_in *sa = (const struct sockaddr_in*)addr; assert(sa->sin_family == AF_INET); Socket_INetSock_fromAddr_port = sa->sin_port; Socket_INetSock_fromAddr_in_addr = sa->sin_addr; } Word16_t Socket_INetSock_getPort (void) { return (Word16_t)Socket_INetSock_fromAddr_port; } void Socket_INetSock_getInAddr (Array(Word8_t) addr) { *(struct in_addr*)addr = Socket_INetSock_fromAddr_in_addr; } mlton-20210117+dfsg/runtime/basis/Net/Socket/Socket-consts.c000066400000000000000000000034161416264345000234770ustar00rootroot00000000000000#include "platform.h" const C_Size_t Socket_sockAddrStorageLen = sizeof (struct sockaddr_storage); const C_Int_t Socket_AF_INET = AF_INET; const C_Int_t Socket_AF_INET6 = AF_INET6; const C_Int_t Socket_AF_UNIX = AF_UNIX; const C_Int_t Socket_AF_UNSPEC = AF_UNSPEC; const C_Int_t Socket_Ctl_SOL_SOCKET = SOL_SOCKET; const C_Int_t Socket_Ctl_SO_ACCEPTCONN = SO_ACCEPTCONN; const C_Int_t Socket_Ctl_SO_BROADCAST = SO_BROADCAST; const C_Int_t Socket_Ctl_SO_DEBUG = SO_DEBUG; const C_Int_t Socket_Ctl_SO_DONTROUTE = SO_DONTROUTE; const C_Int_t Socket_Ctl_SO_ERROR = SO_ERROR; const C_Int_t Socket_Ctl_SO_KEEPALIVE = SO_KEEPALIVE; const C_Int_t Socket_Ctl_SO_LINGER = SO_LINGER; const C_Int_t Socket_Ctl_SO_OOBINLINE = SO_OOBINLINE; const C_Int_t Socket_Ctl_SO_RCVBUF = SO_RCVBUF; const C_Int_t Socket_Ctl_SO_RCVLOWAT = SO_RCVLOWAT; const C_Int_t Socket_Ctl_SO_RCVTIMEO = SO_RCVTIMEO; const C_Int_t Socket_Ctl_SO_REUSEADDR = SO_REUSEADDR; const C_Int_t Socket_Ctl_SO_SNDBUF = SO_SNDBUF; const C_Int_t Socket_Ctl_SO_SNDLOWAT = SO_SNDLOWAT; const C_Int_t Socket_Ctl_SO_SNDTIMEO = SO_SNDTIMEO; const C_Int_t Socket_Ctl_SO_TYPE = SO_TYPE; const C_Int_t Socket_MSG_CTRUNC = MSG_CTRUNC; const C_Int_t Socket_MSG_DONTROUTE = MSG_DONTROUTE; const C_Int_t Socket_MSG_DONTWAIT = MSG_DONTWAIT; const C_Int_t Socket_MSG_EOR = MSG_EOR; const C_Int_t Socket_MSG_OOB = MSG_OOB; const C_Int_t Socket_MSG_PEEK = MSG_PEEK; const C_Int_t Socket_MSG_TRUNC = MSG_TRUNC; const C_Int_t Socket_MSG_WAITALL = MSG_WAITALL; const C_Int_t Socket_SHUT_RD = SHUT_RD; const C_Int_t Socket_SHUT_RDWR = SHUT_RDWR; const C_Int_t Socket_SHUT_WR = SHUT_WR; const C_Int_t Socket_SOCK_DGRAM = SOCK_DGRAM; const C_Int_t Socket_SOCK_RAW = SOCK_RAW; const C_Int_t Socket_SOCK_SEQPACKET = SOCK_SEQPACKET; const C_Int_t Socket_SOCK_STREAM = SOCK_STREAM; mlton-20210117+dfsg/runtime/basis/Net/Socket/Socket.c000066400000000000000000000146141416264345000221720ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Socket_accept (C_Sock_t s, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { int out; MLton_initSockets (); out = accept (s, (struct sockaddr*)addr, (socklen_t*)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_bind (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) { int out; MLton_initSockets (); out = bind (s, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_close(C_Sock_t s) { #ifdef __MINGW32__ int out; MLton_initSockets (); out = closesocket(s); if (out == -1) MLton_fixSocketErrno (); return out; #else return close(s); #endif } C_Errno_t(C_Int_t) Socket_connect (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) { int out; MLton_initSockets (); out = connect (s, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Int_t Socket_familyOfAddr(Vector(Word8_t) addr) { return ((const struct sockaddr*)addr)->sa_family; } C_Errno_t(C_Int_t) Socket_listen (C_Sock_t s, C_Int_t backlog) { int out; MLton_initSockets (); out = listen (s, backlog); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_recv (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { ssize_t out; MLton_initSockets (); out = MLton_recv (s, (void*)((char *)msg + start), len, flags); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_recvFrom (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { ssize_t out; MLton_initSockets (); out = MLton_recvfrom (s, (void*)((char *)msg + start), len, flags, (struct sockaddr*)addr, (socklen_t*)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } static inline C_Errno_t(C_SSize_t) Socket_send (C_Sock_t s, Pointer msg, C_Int_t start, C_Size_t len, C_Int_t flags) { ssize_t out; MLton_initSockets (); out = send (s, (void*)((char *)msg + start), len, flags); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_sendArr (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { return Socket_send (s, (Pointer)msg, start, len, flags); } C_Errno_t(C_SSize_t) Socket_sendVec (C_Sock_t s, Vector(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { return Socket_send (s, (Pointer)msg, start, len, flags); } static inline C_Errno_t(C_SSize_t) Socket_sendTo (C_Sock_t s, Pointer msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { ssize_t out; MLton_initSockets (); out = sendto (s, (void*)((char *)msg + start), len, flags, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_sendArrTo (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen); } C_Errno_t(C_SSize_t) Socket_sendVecTo (C_Sock_t s, Vector(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen); } C_Errno_t(C_Int_t) Socket_shutdown (C_Sock_t s, C_Int_t how) { int out; MLton_initSockets (); out = shutdown (s, how); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Int (C_Sock_t s, C_Int_t level, C_Int_t optname, Ref(C_Int_t) optval) { socklen_t optlen = sizeof(int); int out; MLton_initSockets (); out = getsockopt (s, level, optname, optval, &optlen); assert (optlen == sizeof(int)); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Int (C_Sock_t s, C_Int_t level, C_Int_t optname, C_Int_t optval) { socklen_t optlen = sizeof(int); int out; MLton_initSockets (); out = setsockopt (s, level, optname, &optval, optlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Linger (C_Sock_t s, C_Int_t level, C_Int_t optname, Ref(C_Int_t) optval_l_onoff, Ref(C_Int_t) optval_l_linger) { struct linger optval; socklen_t optlen = sizeof(struct linger); int out; MLton_initSockets (); out = getsockopt (s, level, optname, &optval, &optlen); assert (optlen == sizeof(struct linger)); *((int*)optval_l_onoff) = optval.l_onoff; *((int*)optval_l_linger) = optval.l_linger; if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Linger (C_Sock_t s, C_Int_t level, C_Int_t optname, C_Int_t optval_l_onoff, C_Int_t optval_l_linger) { struct linger optval; socklen_t optlen = sizeof(struct linger); int out; MLton_initSockets (); optval.l_onoff = optval_l_onoff; optval.l_linger = optval_l_linger; out = setsockopt (s, level, optname, &optval, optlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getPeerName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) { int out; MLton_initSockets (); out = getpeername (s, (struct sockaddr*)name, (socklen_t*)namelen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getSockName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) { int out; MLton_initSockets (); out = getsockname (s, (struct sockaddr*)name, (socklen_t*)namelen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getNREAD (C_Sock_t s, Ref(C_Int_t) argp) { int out; out = ioctl (s, FIONREAD, &argp); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getATMARK (C_Sock_t s, Ref(C_Int_t) argp) { int out; out = ioctl (s, SIOCATMARK, &argp); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20210117+dfsg/runtime/basis/Net/Socket/UnixSock.c000066400000000000000000000024361416264345000225040ustar00rootroot00000000000000#include "platform.h" #define UNIXSOCK_PATH_MAX (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) void Socket_UnixSock_toAddr (NullString8_t path, C_Size_t pathlen, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { size_t i; struct sockaddr_un *sa = (struct sockaddr_un*)addr; sa->sun_family = AF_UNIX; if (pathlen <= UNIXSOCK_PATH_MAX) { for (i = 0; i < pathlen; i++) { sa->sun_path[i] = ((const char*)path)[i]; } } else { for (i = 0; i < UNIXSOCK_PATH_MAX-1; i++) { sa->sun_path[i] = ((const char*)path)[i]; } sa->sun_path[UNIXSOCK_PATH_MAX-1] = '\000'; } *((socklen_t*)addrlen) = sizeof(struct sockaddr_un); } C_Size_t Socket_UnixSock_pathLen (Vector(Word8_t) addr) { size_t i; const struct sockaddr_un *sa = (const struct sockaddr_un*)addr; i = 0; if (sa->sun_path[i] == '\000') { return UNIXSOCK_PATH_MAX; } else { while (i < UNIXSOCK_PATH_MAX && sa->sun_path[i] != '\000') i++; return i; } } void Socket_UnixSock_fromAddr (Vector(Word8_t) addr, Array(Char8_t) path, C_Size_t pathlen) { size_t i; const struct sockaddr_un *sa = (const struct sockaddr_un*)addr; assert (sa->sun_family == AF_UNIX); for (i = 0; i < pathlen; i++) { ((char*)path)[i] = sa->sun_path[i]; } } #undef UNIXSOCK_PATH_MAX mlton-20210117+dfsg/runtime/basis/Net/Socket/select.c000066400000000000000000000052011416264345000222110ustar00rootroot00000000000000#include "platform.h" static struct timeval Socket_timeout; static struct timeval *Socket_timeoutPtr; void Socket_setTimeout (C_Time_t sec, C_SUSeconds_t usec) { Socket_timeout.tv_sec = sec; Socket_timeout.tv_usec = usec; Socket_timeoutPtr = &Socket_timeout; } C_Time_t Socket_getTimeout_sec (void) { return Socket_timeout.tv_sec; } C_SUSeconds_t Socket_getTimeout_usec (void) { return Socket_timeout.tv_usec; } void Socket_setTimeoutNull (void) { Socket_timeoutPtr = NULL; } C_Errno_t(C_Int_t) Socket_select (Vector(C_Fd_t) read_vec, Vector(C_Fd_t) write_vec, Vector(C_Fd_t) except_vec, Array(C_Int) read_arr, Array(C_Int) write_arr, Array(C_Int) except_arr) { uintmax_t read_len, write_len, except_len; fd_set read_fd_set, write_fd_set, except_fd_set; fd_set *read_fds, *write_fds, *except_fds; int res; read_len = GC_getSequenceLength((pointer)read_vec); if (read_len > 0) { read_fds = &read_fd_set; FD_ZERO(read_fds); for (unsigned int i = 0; i < read_len; i++) { int fd = ((int *)read_vec)[i]; FD_SET (fd, read_fds); } } else { read_fds = NULL; } write_len = GC_getSequenceLength((pointer)write_vec); if (write_len > 0) { write_fds = &write_fd_set; FD_ZERO(write_fds); for (unsigned int i = 0; i < write_len; i++) { int fd = ((int *)write_vec)[i]; FD_SET (fd, write_fds); } } else { write_fds = NULL; } except_len = GC_getSequenceLength((pointer)except_vec); if (except_len > 0) { except_fds = &except_fd_set; FD_ZERO(except_fds); for (unsigned int i = 0; i < except_len; i++) { int fd = ((int *)except_vec)[i]; FD_SET (fd, except_fds); } } else { except_fds = NULL; } MLton_initSockets (); res = select(FD_SETSIZE, read_fds, write_fds, except_fds, Socket_timeoutPtr); if (res == -1) { MLton_fixSocketErrno(); return res; } if (read_len > 0) { for (unsigned int i = 0; i < read_len; i++) { int fd = ((int *)read_vec)[i]; if (FD_ISSET (fd, read_fds)) { ((int *)read_arr)[i] = 1; } } } if (write_len > 0) { for (unsigned int i = 0; i < write_len; i++) { int fd = ((int *)write_vec)[i]; if (FD_ISSET (fd, write_fds)) { ((int *)write_arr)[i] = 1; } } } if (except_len > 0) { for (unsigned int i = 0; i < except_len; i++) { int fd = ((int *)except_vec)[i]; if (FD_ISSET (fd, except_fds)) { ((int *)except_arr)[i] = 1; } } } return res; } mlton-20210117+dfsg/runtime/basis/Posix/000077500000000000000000000000001416264345000177145ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/Error-consts.c000066400000000000000000000155351416264345000224710ustar00rootroot00000000000000#include "platform.h" #ifndef E2BIG #define E2BIG -1 #endif const C_Int_t Posix_Error_E2BIG = E2BIG; #ifndef EACCES #define EACCES -1 #endif const C_Int_t Posix_Error_EACCES = EACCES; #ifndef EADDRINUSE #define EADDRINUSE -1 #endif const C_Int_t Posix_Error_EADDRINUSE = EADDRINUSE; #ifndef EADDRNOTAVAIL #define EADDRNOTAVAIL -1 #endif const C_Int_t Posix_Error_EADDRNOTAVAIL = EADDRNOTAVAIL; #ifndef EAFNOSUPPORT #define EAFNOSUPPORT -1 #endif const C_Int_t Posix_Error_EAFNOSUPPORT = EAFNOSUPPORT; #ifndef EAGAIN #define EAGAIN -1 #endif const C_Int_t Posix_Error_EAGAIN = EAGAIN; #ifndef EALREADY #define EALREADY -1 #endif const C_Int_t Posix_Error_EALREADY = EALREADY; #ifndef EBADF #define EBADF -1 #endif const C_Int_t Posix_Error_EBADF = EBADF; #ifndef EBADMSG #define EBADMSG -1 #endif const C_Int_t Posix_Error_EBADMSG = EBADMSG; #ifndef EBUSY #define EBUSY -1 #endif const C_Int_t Posix_Error_EBUSY = EBUSY; #ifndef ECANCELED #define ECANCELED -1 #endif const C_Int_t Posix_Error_ECANCELED = ECANCELED; #ifndef ECHILD #define ECHILD -1 #endif const C_Int_t Posix_Error_ECHILD = ECHILD; #ifndef ECONNABORTED #define ECONNABORTED -1 #endif const C_Int_t Posix_Error_ECONNABORTED = ECONNABORTED; #ifndef ECONNREFUSED #define ECONNREFUSED -1 #endif const C_Int_t Posix_Error_ECONNREFUSED = ECONNREFUSED; #ifndef ECONNRESET #define ECONNRESET -1 #endif const C_Int_t Posix_Error_ECONNRESET = ECONNRESET; #ifndef EDEADLK #define EDEADLK -1 #endif const C_Int_t Posix_Error_EDEADLK = EDEADLK; #ifndef EDESTADDRREQ #define EDESTADDRREQ -1 #endif const C_Int_t Posix_Error_EDESTADDRREQ = EDESTADDRREQ; #ifndef EDOM #define EDOM -1 #endif const C_Int_t Posix_Error_EDOM = EDOM; #ifndef EDQUOT #define EDQUOT -1 #endif const C_Int_t Posix_Error_EDQUOT = EDQUOT; #ifndef EEXIST #define EEXIST -1 #endif const C_Int_t Posix_Error_EEXIST = EEXIST; #ifndef EFAULT #define EFAULT -1 #endif const C_Int_t Posix_Error_EFAULT = EFAULT; #ifndef EFBIG #define EFBIG -1 #endif const C_Int_t Posix_Error_EFBIG = EFBIG; #ifndef EHOSTUNREACH #define EHOSTUNREACH -1 #endif const C_Int_t Posix_Error_EHOSTUNREACH = EHOSTUNREACH; #ifndef EIDRM #define EIDRM -1 #endif const C_Int_t Posix_Error_EIDRM = EIDRM; #ifndef EILSEQ #define EILSEQ -1 #endif const C_Int_t Posix_Error_EILSEQ = EILSEQ; #ifndef EINPROGRESS #define EINPROGRESS -1 #endif const C_Int_t Posix_Error_EINPROGRESS = EINPROGRESS; #ifndef EINTR #define EINTR -1 #endif const C_Int_t Posix_Error_EINTR = EINTR; #ifndef EINVAL #define EINVAL -1 #endif const C_Int_t Posix_Error_EINVAL = EINVAL; #ifndef EIO #define EIO -1 #endif const C_Int_t Posix_Error_EIO = EIO; #ifndef EISCONN #define EISCONN -1 #endif const C_Int_t Posix_Error_EISCONN = EISCONN; #ifndef EISDIR #define EISDIR -1 #endif const C_Int_t Posix_Error_EISDIR = EISDIR; #ifndef ELOOP #define ELOOP -1 #endif const C_Int_t Posix_Error_ELOOP = ELOOP; #ifndef EMFILE #define EMFILE -1 #endif const C_Int_t Posix_Error_EMFILE = EMFILE; #ifndef EMLINK #define EMLINK -1 #endif const C_Int_t Posix_Error_EMLINK = EMLINK; #ifndef EMSGSIZE #define EMSGSIZE -1 #endif const C_Int_t Posix_Error_EMSGSIZE = EMSGSIZE; #ifndef EMULTIHOP #define EMULTIHOP -1 #endif const C_Int_t Posix_Error_EMULTIHOP = EMULTIHOP; #ifndef ENAMETOOLONG #define ENAMETOOLONG -1 #endif const C_Int_t Posix_Error_ENAMETOOLONG = ENAMETOOLONG; #ifndef ENETDOWN #define ENETDOWN -1 #endif const C_Int_t Posix_Error_ENETDOWN = ENETDOWN; #ifndef ENETRESET #define ENETRESET -1 #endif const C_Int_t Posix_Error_ENETRESET = ENETRESET; #ifndef ENETUNREACH #define ENETUNREACH -1 #endif const C_Int_t Posix_Error_ENETUNREACH = ENETUNREACH; #ifndef ENFILE #define ENFILE -1 #endif const C_Int_t Posix_Error_ENFILE = ENFILE; #ifndef ENOBUFS #define ENOBUFS -1 #endif const C_Int_t Posix_Error_ENOBUFS = ENOBUFS; #ifndef ENODATA #define ENODATA -1 #endif const C_Int_t Posix_Error_ENODATA = ENODATA; #ifndef ENODEV #define ENODEV -1 #endif const C_Int_t Posix_Error_ENODEV = ENODEV; #ifndef ENOENT #define ENOENT -1 #endif const C_Int_t Posix_Error_ENOENT = ENOENT; #ifndef ENOEXEC #define ENOEXEC -1 #endif const C_Int_t Posix_Error_ENOEXEC = ENOEXEC; #ifndef ENOLCK #define ENOLCK -1 #endif const C_Int_t Posix_Error_ENOLCK = ENOLCK; #ifndef ENOLINK #define ENOLINK -1 #endif const C_Int_t Posix_Error_ENOLINK = ENOLINK; #ifndef ENOMEM #define ENOMEM -1 #endif const C_Int_t Posix_Error_ENOMEM = ENOMEM; #ifndef ENOMSG #define ENOMSG -1 #endif const C_Int_t Posix_Error_ENOMSG = ENOMSG; #ifndef ENOPROTOOPT #define ENOPROTOOPT -1 #endif const C_Int_t Posix_Error_ENOPROTOOPT = ENOPROTOOPT; #ifndef ENOSPC #define ENOSPC -1 #endif const C_Int_t Posix_Error_ENOSPC = ENOSPC; #ifndef ENOSR #define ENOSR -1 #endif const C_Int_t Posix_Error_ENOSR = ENOSR; #ifndef ENOSTR #define ENOSTR -1 #endif const C_Int_t Posix_Error_ENOSTR = ENOSTR; #ifndef ENOSYS #define ENOSYS -1 #endif const C_Int_t Posix_Error_ENOSYS = ENOSYS; #ifndef ENOTCONN #define ENOTCONN -1 #endif const C_Int_t Posix_Error_ENOTCONN = ENOTCONN; #ifndef ENOTDIR #define ENOTDIR -1 #endif const C_Int_t Posix_Error_ENOTDIR = ENOTDIR; #ifndef ENOTEMPTY #define ENOTEMPTY -1 #endif const C_Int_t Posix_Error_ENOTEMPTY = ENOTEMPTY; #ifndef ENOTSOCK #define ENOTSOCK -1 #endif const C_Int_t Posix_Error_ENOTSOCK = ENOTSOCK; #ifndef ENOTSUP #define ENOTSUP -1 #endif const C_Int_t Posix_Error_ENOTSUP = ENOTSUP; #ifndef ENOTTY #define ENOTTY -1 #endif const C_Int_t Posix_Error_ENOTTY = ENOTTY; #ifndef ENXIO #define ENXIO -1 #endif const C_Int_t Posix_Error_ENXIO = ENXIO; #ifndef EOPNOTSUPP #define EOPNOTSUPP -1 #endif const C_Int_t Posix_Error_EOPNOTSUPP = EOPNOTSUPP; #ifndef EOVERFLOW #define EOVERFLOW -1 #endif const C_Int_t Posix_Error_EOVERFLOW = EOVERFLOW; #ifndef EPERM #define EPERM -1 #endif const C_Int_t Posix_Error_EPERM = EPERM; #ifndef EPIPE #define EPIPE -1 #endif const C_Int_t Posix_Error_EPIPE = EPIPE; #ifndef EPROTO #define EPROTO -1 #endif const C_Int_t Posix_Error_EPROTO = EPROTO; #ifndef EPROTONOSUPPORT #define EPROTONOSUPPORT -1 #endif const C_Int_t Posix_Error_EPROTONOSUPPORT = EPROTONOSUPPORT; #ifndef EPROTOTYPE #define EPROTOTYPE -1 #endif const C_Int_t Posix_Error_EPROTOTYPE = EPROTOTYPE; #ifndef ERANGE #define ERANGE -1 #endif const C_Int_t Posix_Error_ERANGE = ERANGE; #ifndef EROFS #define EROFS -1 #endif const C_Int_t Posix_Error_EROFS = EROFS; #ifndef ESPIPE #define ESPIPE -1 #endif const C_Int_t Posix_Error_ESPIPE = ESPIPE; #ifndef ESRCH #define ESRCH -1 #endif const C_Int_t Posix_Error_ESRCH = ESRCH; #ifndef ESTALE #define ESTALE -1 #endif const C_Int_t Posix_Error_ESTALE = ESTALE; #ifndef ETIME #define ETIME -1 #endif const C_Int_t Posix_Error_ETIME = ETIME; #ifndef ETIMEDOUT #define ETIMEDOUT -1 #endif const C_Int_t Posix_Error_ETIMEDOUT = ETIMEDOUT; #ifndef ETXTBSY #define ETXTBSY -1 #endif const C_Int_t Posix_Error_ETXTBSY = ETXTBSY; #ifndef EWOULDBLOCK #define EWOULDBLOCK -1 #endif const C_Int_t Posix_Error_EWOULDBLOCK = EWOULDBLOCK; #ifndef EXDEV #define EXDEV -1 #endif const C_Int_t Posix_Error_EXDEV = EXDEV; mlton-20210117+dfsg/runtime/basis/Posix/Error.c000066400000000000000000000003531416264345000211520ustar00rootroot00000000000000#include "platform.h" void Posix_Error_clearErrno (void) { errno = 0; } C_Int_t Posix_Error_getErrno (void) { return errno; } C_String_t Posix_Error_strError (C_Int_t n) { char *res = strerror (n); return (C_String_t)res; } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/000077500000000000000000000000001416264345000212725ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/FileSys/Dirstream.c000066400000000000000000000010661416264345000233730ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir (C_DirP_t p) { return closedir ((DIR *) p); } C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir (NullString8_t p) { DIR *res = opendir ((const char *) p); return (C_Errno_t(C_DirP_t))res; } C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir (C_DirP_t d) { struct dirent *e; char *res; e = readdir ((DIR *) d); res = (NULL == e) ? NULL : e->d_name; return (C_Errno_t(C_String_t))res; } void Posix_FileSys_Dirstream_rewindDir (C_DirP_t p) { rewinddir ((DIR *) p); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/FileSys-consts.c000066400000000000000000000107371416264345000243330ustar00rootroot00000000000000#include "platform.h" const C_Int_t Posix_FileSys_A_F_OK = F_OK; const C_Int_t Posix_FileSys_A_R_OK = R_OK; const C_Int_t Posix_FileSys_A_W_OK = W_OK; const C_Int_t Posix_FileSys_A_X_OK = X_OK; const C_Int_t Posix_FileSys_O_RDONLY = O_RDONLY; const C_Int_t Posix_FileSys_O_RDWR = O_RDWR; const C_Int_t Posix_FileSys_O_WRONLY = O_WRONLY; const C_Int_t Posix_FileSys_O_APPEND = O_APPEND; #ifndef O_BINARY #define O_BINARY 0 #endif const C_Int_t Posix_FileSys_O_BINARY = O_BINARY; const C_Int_t Posix_FileSys_O_CREAT = O_CREAT; #ifndef O_DSYNC #define O_DSYNC 0 #endif const C_Int_t Posix_FileSys_O_DSYNC = O_DSYNC; const C_Int_t Posix_FileSys_O_EXCL = O_EXCL; const C_Int_t Posix_FileSys_O_NOCTTY = O_NOCTTY; const C_Int_t Posix_FileSys_O_NONBLOCK = O_NONBLOCK; #ifndef O_RSYNC #define O_RSYNC 0 #endif const C_Int_t Posix_FileSys_O_RSYNC = O_RSYNC; const C_Int_t Posix_FileSys_O_SYNC = O_SYNC; #ifndef O_TEXT #define O_TEXT 0 #endif const C_Int_t Posix_FileSys_O_TEXT = O_TEXT; const C_Int_t Posix_FileSys_O_TRUNC = O_TRUNC; #ifndef _PC_FILESIZEBITS #define _PC_FILESIZEBITS -1 #endif const C_Int_t Posix_FileSys_PC_FILESIZEBITS = _PC_FILESIZEBITS; #ifndef _PC_LINK_MAX #define _PC_LINK_MAX -1 #endif #ifndef _PC_LINK_MAX #define _PC_LINK_MAX -1 #endif const C_Int_t Posix_FileSys_PC_LINK_MAX = _PC_LINK_MAX; #ifndef _PC_MAX_CANON #define _PC_MAX_CANON -1 #endif const C_Int_t Posix_FileSys_PC_MAX_CANON = _PC_MAX_CANON; #ifndef _PC_MAX_INPUT #define _PC_MAX_INPUT -1 #endif const C_Int_t Posix_FileSys_PC_MAX_INPUT = _PC_MAX_INPUT; #ifndef _PC_NAME_MAX #define _PC_NAME_MAX -1 #endif const C_Int_t Posix_FileSys_PC_NAME_MAX = _PC_NAME_MAX; #ifndef _PC_PATH_MAX #define _PC_PATH_MAX -1 #endif const C_Int_t Posix_FileSys_PC_PATH_MAX = _PC_PATH_MAX; #ifndef _PC_PIPE_BUF #define _PC_PIPE_BUF -1 #endif const C_Int_t Posix_FileSys_PC_PIPE_BUF = _PC_PIPE_BUF; #ifndef _PC_2_SYMLINKS #define _PC_2_SYMLINKS -1 #endif const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS = _PC_2_SYMLINKS; #ifndef _PC_ALLOC_SIZE_MIN #define _PC_ALLOC_SIZE_MIN -1 #endif const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN = _PC_ALLOC_SIZE_MIN; #ifndef _PC_REC_INCR_XFER_SIZE #define _PC_REC_INCR_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE = _PC_REC_INCR_XFER_SIZE; #ifndef _PC_REC_MAX_XFER_SIZE #define _PC_REC_MAX_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE = _PC_REC_MAX_XFER_SIZE; #ifndef _PC_REC_MIN_XFER_SIZE #define _PC_REC_MIN_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE = _PC_REC_MIN_XFER_SIZE; #ifndef _PC_REC_XFER_ALIGN #define _PC_REC_XFER_ALIGN -1 #endif const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN = _PC_REC_XFER_ALIGN; #ifndef _PC_SYMLINK_MAX #define _PC_SYMLINK_MAX -1 #endif const C_Int_t Posix_FileSys_PC_SYMLINK_MAX = _PC_SYMLINK_MAX; #ifndef _PC_CHOWN_RESTRICTED #define _PC_CHOWN_RESTRICTED -1 #endif const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED = _PC_CHOWN_RESTRICTED; #ifndef _PC_NO_TRUNC #define _PC_NO_TRUNC -1 #endif const C_Int_t Posix_FileSys_PC_NO_TRUNC = _PC_NO_TRUNC; #ifndef _PC_VDISABLE #define _PC_VDISABLE -1 #endif const C_Int_t Posix_FileSys_PC_VDISABLE = _PC_VDISABLE; #ifndef _PC_ASYNC_IO #define _PC_ASYNC_IO -1 #endif const C_Int_t Posix_FileSys_PC_ASYNC_IO = _PC_ASYNC_IO; #ifndef _PC_PRIO_IO #define _PC_PRIO_IO -1 #endif const C_Int_t Posix_FileSys_PC_PRIO_IO = _PC_PRIO_IO; #ifndef _PC_SYNC_IO #define _PC_SYNC_IO -1 #endif const C_Int_t Posix_FileSys_PC_SYNC_IO = _PC_SYNC_IO; const C_Mode_t Posix_FileSys_S_IFBLK = S_IFBLK; const C_Mode_t Posix_FileSys_S_IFCHR = S_IFCHR; const C_Mode_t Posix_FileSys_S_IFDIR = S_IFDIR; const C_Mode_t Posix_FileSys_S_IFIFO = S_IFIFO; const C_Mode_t Posix_FileSys_S_IFLNK = S_IFLNK; const C_Mode_t Posix_FileSys_S_IFMT = S_IFMT; const C_Mode_t Posix_FileSys_S_IFREG = S_IFREG; const C_Mode_t Posix_FileSys_S_IFSOCK = S_IFSOCK; const C_Mode_t Posix_FileSys_S_IRGRP = S_IRGRP; const C_Mode_t Posix_FileSys_S_IROTH = S_IROTH; const C_Mode_t Posix_FileSys_S_IRUSR = S_IRUSR; const C_Mode_t Posix_FileSys_S_IRWXG = S_IRWXG; const C_Mode_t Posix_FileSys_S_IRWXO = S_IRWXO; const C_Mode_t Posix_FileSys_S_IRWXU = S_IRWXU; const C_Mode_t Posix_FileSys_S_ISGID = S_ISGID; const C_Mode_t Posix_FileSys_S_ISUID = S_ISUID; const C_Mode_t Posix_FileSys_S_ISVTX = S_ISVTX; const C_Mode_t Posix_FileSys_S_IWGRP = S_IWGRP; const C_Mode_t Posix_FileSys_S_IWOTH = S_IWOTH; const C_Mode_t Posix_FileSys_S_IWUSR = S_IWUSR; const C_Mode_t Posix_FileSys_S_IXGRP = S_IXGRP; const C_Mode_t Posix_FileSys_S_IXOTH = S_IXOTH; const C_Mode_t Posix_FileSys_S_IXUSR = S_IXUSR; mlton-20210117+dfsg/runtime/basis/Posix/FileSys/ST.c000066400000000000000000000010051416264345000217600ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_FileSys_ST_isBlk (C_Mode_t m) { return S_ISBLK(m); } C_Int_t Posix_FileSys_ST_isChr (C_Mode_t m) { return S_ISCHR(m); } C_Int_t Posix_FileSys_ST_isDir (C_Mode_t m) { return S_ISDIR(m); } C_Int_t Posix_FileSys_ST_isFIFO (C_Mode_t m) { return S_ISFIFO(m); } C_Int_t Posix_FileSys_ST_isLink (C_Mode_t m) { return S_ISLNK(m); } C_Int_t Posix_FileSys_ST_isReg (C_Mode_t m) { return S_ISREG(m); } C_Int_t Posix_FileSys_ST_isSock (C_Mode_t m) { return S_ISSOCK(m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/Stat.c000066400000000000000000000031741416264345000223560ustar00rootroot00000000000000#include "platform.h" static struct stat Posix_FileSys_Stat_statbuf; C_Dev_t Posix_FileSys_Stat_getDev (void) { return Posix_FileSys_Stat_statbuf.st_dev; } C_INo_t Posix_FileSys_Stat_getINo (void) { return Posix_FileSys_Stat_statbuf.st_ino; } C_Mode_t Posix_FileSys_Stat_getMode (void) { return Posix_FileSys_Stat_statbuf.st_mode; } C_NLink_t Posix_FileSys_Stat_getNLink (void) { return Posix_FileSys_Stat_statbuf.st_nlink; } C_UId_t Posix_FileSys_Stat_getUId (void) { return Posix_FileSys_Stat_statbuf.st_uid; } C_GId_t Posix_FileSys_Stat_getGId (void) { return Posix_FileSys_Stat_statbuf.st_gid; } C_Dev_t Posix_FileSys_Stat_getRDev (void) { return Posix_FileSys_Stat_statbuf.st_rdev; } C_Off_t Posix_FileSys_Stat_getSize (void) { return Posix_FileSys_Stat_statbuf.st_size; } C_Time_t Posix_FileSys_Stat_getATime (void) { return Posix_FileSys_Stat_statbuf.st_atime; } C_Time_t Posix_FileSys_Stat_getMTime (void) { return Posix_FileSys_Stat_statbuf.st_mtime; } C_Time_t Posix_FileSys_Stat_getCTime (void) { return Posix_FileSys_Stat_statbuf.st_ctime; } /* C_BlkSize_t Posix_FileSys_Stat_getBlkSize (void) { return Posix_FileSys_Stat_statbuf.st_blksize; } C_BlkCnt_t Posix_FileSys_Stat_getBlkCnt (void) { return Posix_FileSys_Stat_statbuf.st_blocks; } */ C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat (C_Fd_t f) { return fstat (f, &Posix_FileSys_Stat_statbuf); } C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat (NullString8_t f) { return lstat ((const char*)f, &Posix_FileSys_Stat_statbuf); } C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat (NullString8_t f) { return stat ((const char*)f, &Posix_FileSys_Stat_statbuf); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/Utimbuf.c000066400000000000000000000006341416264345000230540ustar00rootroot00000000000000#include "platform.h" static struct utimbuf Posix_FileSys_Utimbuf_utimbuf; void Posix_FileSys_Utimbuf_setAcTime (C_Time_t t) { Posix_FileSys_Utimbuf_utimbuf.actime = t; } void Posix_FileSys_Utimbuf_setModTime (C_Time_t t) { Posix_FileSys_Utimbuf_utimbuf.modtime = t; } C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime (NullString8_t s) { return utime((const char *)s, &Posix_FileSys_Utimbuf_utimbuf); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/access.c000066400000000000000000000002071416264345000226760ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_access (NullString8_t f, C_Int_t i) { return access ((const char *) f, i); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/chdir.c000066400000000000000000000001651416264345000225310ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t p) { return chdir((const char *) p); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/chmod.c000066400000000000000000000002061416264345000225260ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chmod (NullString8_t p, C_Mode_t m) { return chmod ((const char *) p, m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/chown.c000066400000000000000000000002231416264345000225510ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chown (NullString8_t p, C_UId_t u, C_GId_t g) { return chown ((const char *) p, u, g); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/fchdir.c000066400000000000000000000001411416264345000226710ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t f) { return fchdir(f); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/fchmod.c000066400000000000000000000001621416264345000226750ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchmod (C_Fd_t f, C_Mode_t m) { return fchmod (f, m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/fchown.c000066400000000000000000000001771416264345000227270ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchown (C_Fd_t f, C_UId_t u, C_GId_t g) { return fchown (f, u, g); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/fpathconf.c000066400000000000000000000001701416264345000234040ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Long_t) Posix_FileSys_fpathconf (C_Fd_t f, C_Int_t n) { return fpathconf (f, n); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/ftruncate.c000066400000000000000000000001671416264345000234350ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_ftruncate (C_Fd_t f, C_Off_t n) { return ftruncate (f, n); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/getcwd.c000066400000000000000000000002341416264345000227120ustar00rootroot00000000000000#include "platform.h" C_String_t Posix_FileSys_getcwd (Array(Char8_t) buf, C_Size_t n) { char *res = getcwd ((char*)buf, n); return (C_String_t)res; } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/link.c000066400000000000000000000002341416264345000223720ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_link (NullString8_t p1, NullString8_t p2) { return link ((const char *) p1, (const char *) p2); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/mkdir.c000066400000000000000000000002061416264345000225420ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_mkdir (NullString8_t p, C_Mode_t m) { return mkdir ((const char *) p, m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/mkfifo.c000066400000000000000000000002101416264345000227020ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_mkfifo (NullString8_t p, C_Mode_t m) { return mkfifo ((const char *) p, m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/open2.c000066400000000000000000000002011416264345000224520ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Fd_t) Posix_FileSys_open2 (NullString8_t p, C_Int_t i) { return open ((const char*)p, i); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/open3.c000066400000000000000000000002301416264345000224550ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Fd_t) Posix_FileSys_open3 (NullString8_t p, C_Int_t i, C_Mode_t m) { return open ((const char*)p, i, (mode_t)m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/pathconf.c000066400000000000000000000002131416264345000232340ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Long_t) Posix_FileSys_pathconf (NullString8_t p, C_Int_t n) { return pathconf ((const char *)p, n); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/readlink.c000066400000000000000000000002501416264345000232240ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_SSize_t) Posix_FileSys_readlink (NullString8_t p, Array(Char8_t) b, C_Size_t n) { return readlink ((const char*)p, (char*)b, n); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/rename.c000066400000000000000000000010041416264345000227000ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_rename (NullString8_t p1, NullString8_t p2) { C_Errno_t(C_Int_t) res; res = rename ((const char *) p1, (const char *) p2); #ifdef __MINGW32__ /* the MinGW rename() function does not remove the destination file * if it exists; we emulate the Unix behavior here. */ if ((res != 0) && (errno == EEXIST)) { res = unlink ((const char *) p2); if (res == 0) res = rename((const char *) p1, (const char *) p2); } #endif return res; } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/rmdir.c000066400000000000000000000001661416264345000225560ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_rmdir (NullString8_t p) { return rmdir ((const char*) p); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/symlink.c000066400000000000000000000002401416264345000231200ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_symlink (NullString8_t p1, NullString8_t p2) { return symlink ((const char*) p1, (const char*) p2); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/truncate.c000066400000000000000000000002111416264345000232550ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_truncate (NullString8_t p, C_Off_t n) { return truncate ((const char*)p, n); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/umask.c000066400000000000000000000001311416264345000225510ustar00rootroot00000000000000#include "platform.h" C_Mode_t Posix_FileSys_umask (C_Mode_t m) { return umask (m); } mlton-20210117+dfsg/runtime/basis/Posix/FileSys/unlink.c000066400000000000000000000001701416264345000227340ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_unlink (NullString8_t p) { return unlink ((const char*) p); } mlton-20210117+dfsg/runtime/basis/Posix/IO/000077500000000000000000000000001416264345000202235ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/IO/FLock-consts.c000066400000000000000000000007351416264345000227010ustar00rootroot00000000000000#include "platform.h" const C_Int_t Posix_IO_FLock_F_GETLK = F_GETLK; const C_Int_t Posix_IO_FLock_F_SETLK = F_SETLK; const C_Int_t Posix_IO_FLock_F_SETLKW = F_SETLKW; const C_Short_t Posix_IO_FLock_F_RDLCK = F_RDLCK; const C_Short_t Posix_IO_FLock_F_UNLCK = F_UNLCK; const C_Short_t Posix_IO_FLock_F_WRLCK = F_WRLCK; const C_Short_t Posix_IO_FLock_SEEK_CUR = SEEK_CUR; const C_Short_t Posix_IO_FLock_SEEK_END = SEEK_END; const C_Short_t Posix_IO_FLock_SEEK_SET = SEEK_SET; mlton-20210117+dfsg/runtime/basis/Posix/IO/FLock.c000066400000000000000000000017531416264345000213730ustar00rootroot00000000000000#include "platform.h" static struct flock Posix_IO_FLock_flock; C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl (C_Fd_t f, C_Int_t cmd) { return fcntl (f, cmd, &Posix_IO_FLock_flock); } C_Short_t Posix_IO_FLock_getType (void) { return Posix_IO_FLock_flock.l_type; } C_Short_t Posix_IO_FLock_getWhence (void) { return Posix_IO_FLock_flock.l_whence; } C_Off_t Posix_IO_FLock_getStart (void) { return Posix_IO_FLock_flock.l_start; } C_Off_t Posix_IO_FLock_getLen (void) { return Posix_IO_FLock_flock.l_len; } C_PId_t Posix_IO_FLock_getPId (void) { return Posix_IO_FLock_flock.l_pid; } void Posix_IO_FLock_setType (C_Short_t x) { Posix_IO_FLock_flock.l_type = x; } void Posix_IO_FLock_setWhence (C_Short_t x) { Posix_IO_FLock_flock.l_whence = x; } void Posix_IO_FLock_setStart (C_Off_t x) { Posix_IO_FLock_flock.l_start = x; } void Posix_IO_FLock_setLen (C_Off_t x) { Posix_IO_FLock_flock.l_len = x; } void Posix_IO_FLock_setPId (C_PId_t x) { Posix_IO_FLock_flock.l_pid = x; } mlton-20210117+dfsg/runtime/basis/Posix/IO/close.c000066400000000000000000000001341416264345000214720ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_close (C_Fd_t f) { return close (f); } mlton-20210117+dfsg/runtime/basis/Posix/IO/dup.c000066400000000000000000000001271416264345000211570ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Fd_t) Posix_IO_dup (C_Fd_t f) { return dup (f); } mlton-20210117+dfsg/runtime/basis/Posix/IO/dup2.c000066400000000000000000000001521416264345000212370ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Fd_t) Posix_IO_dup2 (C_Fd_t f1, C_Fd_t f2) { return dup2 (f1, f2); } mlton-20210117+dfsg/runtime/basis/Posix/IO/fcntl-consts.c000066400000000000000000000006411416264345000230050ustar00rootroot00000000000000#include "platform.h" const C_Int_t Posix_IO_F_DUPFD = F_DUPFD; const C_Int_t Posix_IO_F_GETFD = F_GETFD; const C_Int_t Posix_IO_F_GETFL = F_GETFL; const C_Int_t Posix_IO_F_GETOWN = F_GETOWN; const C_Int_t Posix_IO_F_SETFD = F_SETFD; const C_Int_t Posix_IO_F_SETFL = F_SETFL; const C_Int_t Posix_IO_F_SETOWN = F_SETOWN; const C_Int_t Posix_IO_FD_CLOEXEC = FD_CLOEXEC; const C_Int_t Posix_IO_O_ACCMODE = O_ACCMODE; mlton-20210117+dfsg/runtime/basis/Posix/IO/fcntl2.c000066400000000000000000000001531416264345000215560ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fcntl2 (C_Fd_t f, C_Int_t i) { return fcntl (f, i); } mlton-20210117+dfsg/runtime/basis/Posix/IO/fcntl3.c000066400000000000000000000001711416264345000215570ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fcntl3 (C_Fd_t f, C_Int_t i, C_Int_t j) { return fcntl (f, i, j); } mlton-20210117+dfsg/runtime/basis/Posix/IO/fsync.c000066400000000000000000000001341416264345000215070ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fsync (C_Fd_t f) { return fsync (f); } mlton-20210117+dfsg/runtime/basis/Posix/IO/lseek-consts.c000066400000000000000000000002331416264345000227770ustar00rootroot00000000000000#include "platform.h" const C_Int_t Posix_IO_SEEK_CUR = SEEK_CUR; const C_Int_t Posix_IO_SEEK_END = SEEK_END; const C_Int_t Posix_IO_SEEK_SET = SEEK_SET; mlton-20210117+dfsg/runtime/basis/Posix/IO/lseek.c000066400000000000000000000001701416264345000214700ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Off_t) Posix_IO_lseek (C_Fd_t f, C_Off_t i, C_Int_t j) { return lseek (f, i, j); } mlton-20210117+dfsg/runtime/basis/Posix/IO/pipe.c000066400000000000000000000001551416264345000213250ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_pipe (Array(C_Fd_t) fds) { return pipe ((int *) fds); } mlton-20210117+dfsg/runtime/basis/Posix/IO/read.c000066400000000000000000000007771416264345000213150ustar00rootroot00000000000000#include "platform.h" static inline C_Errno_t(C_SSize_t) Posix_IO_read (C_Fd_t fd, Pointer b, C_Int_t i, C_Size_t s) { return read (fd, (void *) ((char *) b + i), s); } C_Errno_t(C_SSize_t) Posix_IO_readChar8 (C_Fd_t fd, Array(Char8) b, C_Int_t i, C_Size_t s) { return Posix_IO_read (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_readWord8 (C_Fd_t fd, Array(Word8) b, C_Int_t i, C_Size_t s) { return Posix_IO_read (fd, (Pointer)b, i, s); } mlton-20210117+dfsg/runtime/basis/Posix/IO/write.c000066400000000000000000000015721416264345000215260ustar00rootroot00000000000000#include "platform.h" static inline C_Errno_t(C_SSize_t) Posix_IO_write (C_Fd_t fd, Pointer b, C_Int_t i, C_Size_t s) { return write (fd, (void *) ((char *) b + i), s); } C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr (C_Fd_t fd, Array(Char8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec (C_Fd_t fd, Vector(Char8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr (C_Fd_t fd, Array(Word8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec (C_Fd_t fd, Vector(Word8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/000077500000000000000000000000001416264345000212705ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/ProcEnv.c000066400000000000000000000015611416264345000230130ustar00rootroot00000000000000#include "platform.h" C_String_t Posix_ProcEnv_ctermid (void) { char *res = ctermid (NULL); return (C_String_t)res; } C_GId_t Posix_ProcEnv_getegid (void) { return getegid (); } C_UId_t Posix_ProcEnv_geteuid (void) { return geteuid (); } C_GId_t Posix_ProcEnv_getgid (void) { return getgid (); } C_PId_t Posix_ProcEnv_getpid (void) { return getpid (); } C_PId_t Posix_ProcEnv_getppid (void) { return getppid (); } C_PId_t Posix_ProcEnv_getpgrp (void) { return getpgrp (); } C_UId_t Posix_ProcEnv_getuid (void) { return getuid (); } C_Errno_t(C_Int_t) Posix_ProcEnv_setgid (C_GId_t g) { return setgid (g); } C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid (C_PId_t p, C_PId_t g) { return setpgid (p, g); } C_Errno_t(C_PId_t) Posix_ProcEnv_setsid (void) { return setsid (); } C_Errno_t(C_Int_t) Posix_ProcEnv_setuid (C_UId_t u) { return setuid (u); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/Times.c000066400000000000000000000010341416264345000225130ustar00rootroot00000000000000#include "platform.h" static struct tms Posix_ProcEnv_Times_tms; C_Clock_t Posix_ProcEnv_Times_getUTime(void) { return Posix_ProcEnv_Times_tms.tms_utime; } C_Clock_t Posix_ProcEnv_Times_getSTime(void) { return Posix_ProcEnv_Times_tms.tms_stime; } C_Clock_t Posix_ProcEnv_Times_getCUTime(void) { return Posix_ProcEnv_Times_tms.tms_cutime; } C_Clock_t Posix_ProcEnv_Times_getCSTime(void) { return Posix_ProcEnv_Times_tms.tms_cstime; } C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void) { return times(&Posix_ProcEnv_Times_tms); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/Uname.c000066400000000000000000000013361416264345000225040ustar00rootroot00000000000000#include "platform.h" static struct utsname Posix_ProcEnv_Uname_utsname; C_String_t Posix_ProcEnv_Uname_getSysName (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.sysname; } C_String_t Posix_ProcEnv_Uname_getNodeName (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.nodename; } C_String_t Posix_ProcEnv_Uname_getRelease (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.release; } C_String_t Posix_ProcEnv_Uname_getVersion (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.version; } C_String_t Posix_ProcEnv_Uname_getMachine (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.machine; } C_Errno_t(C_Int_t) Posix_ProcEnv_uname (void) { return uname (&Posix_ProcEnv_Uname_utsname); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/environ.c000066400000000000000000000002361416264345000231150ustar00rootroot00000000000000#include "platform.h" /* Manual initialization is a work-around for a Darwin linker issue. */ C_StringArray_t Posix_ProcEnv_environ = (C_StringArray_t)NULL; mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/getenv.c000066400000000000000000000002151416264345000227220ustar00rootroot00000000000000#include "platform.h" C_String_t Posix_ProcEnv_getenv (NullString8_t s) { char *res = getenv((const char*)s); return (C_String_t)res; } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/getgroups.c000066400000000000000000000003321416264345000234510ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_ProcEnv_getgroupsN (void) { return getgroups (0, (gid_t*)NULL); } C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups (C_Int_t i, Array(C_GId_t) a) { return getgroups (i, (gid_t*)a); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/getlogin.c000066400000000000000000000002171416264345000232440ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_String_t) Posix_ProcEnv_getlogin (void) { char *res = getlogin (); return (C_Errno_t(C_String_t))res; } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/isatty.c000066400000000000000000000001301416264345000227430ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_ProcEnv_isatty (C_Fd_t f) { return isatty (f); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/setenv.c000066400000000000000000000002331416264345000227360ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_ProcEnv_setenv (NullString8_t s, NullString8_t v) { return setenv ((const char*)s, (const char*)v, 1); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/setgroups.c000066400000000000000000000002161416264345000234660ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups (C_Int_t i, Vector(C_GId_t) v) { return setgroups (i, (const gid_t*)v); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/sysconf-consts.c000066400000000000000000000400131416264345000244250ustar00rootroot00000000000000#include "platform.h" #ifndef _SC_AIO_LISTIO_MAX #define _SC_AIO_LISTIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX = _SC_AIO_LISTIO_MAX; #ifndef _SC_AIO_MAX #define _SC_AIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_MAX = _SC_AIO_MAX; #ifndef _SC_AIO_PRIO_DELTA_MAX #define _SC_AIO_PRIO_DELTA_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX = _SC_AIO_PRIO_DELTA_MAX; #ifndef _SC_ARG_MAX #define _SC_ARG_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_ARG_MAX = _SC_ARG_MAX; #ifndef _SC_ATEXIT_MAX #define _SC_ATEXIT_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX = _SC_ATEXIT_MAX; #ifndef _SC_BC_BASE_MAX #define _SC_BC_BASE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX = _SC_BC_BASE_MAX; #ifndef _SC_BC_DIM_MAX #define _SC_BC_DIM_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX = _SC_BC_DIM_MAX; #ifndef _SC_BC_SCALE_MAX #define _SC_BC_SCALE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX = _SC_BC_SCALE_MAX; #ifndef _SC_BC_STRING_MAX #define _SC_BC_STRING_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX = _SC_BC_STRING_MAX; #ifndef _SC_CHILD_MAX #define _SC_CHILD_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_CHILD_MAX = _SC_CHILD_MAX; #ifndef _SC_CLK_TCK #define _SC_CLK_TCK -1 #endif const C_Int_t Posix_ProcEnv_SC_CLK_TCK = _SC_CLK_TCK; #ifndef _SC_COLL_WEIGHTS_MAX #define _SC_COLL_WEIGHTS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX = _SC_COLL_WEIGHTS_MAX; #ifndef _SC_DELAYTIMER_MAX #define _SC_DELAYTIMER_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX = _SC_DELAYTIMER_MAX; #ifndef _SC_EXPR_NEST_MAX #define _SC_EXPR_NEST_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX = _SC_EXPR_NEST_MAX; #ifndef _SC_HOST_NAME_MAX #define _SC_HOST_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX = _SC_HOST_NAME_MAX; #ifndef _SC_IOV_MAX #define _SC_IOV_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_IOV_MAX = _SC_IOV_MAX; #ifndef _SC_LINE_MAX #define _SC_LINE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_LINE_MAX = _SC_LINE_MAX; #ifndef _SC_LOGIN_NAME_MAX #define _SC_LOGIN_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX = _SC_LOGIN_NAME_MAX; #ifndef _SC_NGROUPS_MAX #define _SC_NGROUPS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX = _SC_NGROUPS_MAX; #ifndef _SC_GETGR_R_SIZE_MAX #define _SC_GETGR_R_SIZE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX = _SC_GETGR_R_SIZE_MAX; #ifndef _SC_GETPW_R_SIZE_MAX #define _SC_GETPW_R_SIZE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX = _SC_GETPW_R_SIZE_MAX; #ifndef _SC_MQ_OPEN_MAX #define _SC_MQ_OPEN_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX = _SC_MQ_OPEN_MAX; #ifndef _SC_MQ_PRIO_MAX #define _SC_MQ_PRIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX = _SC_MQ_PRIO_MAX; #ifndef _SC_OPEN_MAX #define _SC_OPEN_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_OPEN_MAX = _SC_OPEN_MAX; #ifndef _SC_ADVISORY_INFO #define _SC_ADVISORY_INFO -1 #endif const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO = _SC_ADVISORY_INFO; #ifndef _SC_AVPHYS_PAGES #define _SC_AVPHYS_PAGES -1 #endif const C_Int_t Posix_ProcEnv_SC_AVPHYS_PAGES = _SC_AVPHYS_PAGES; #ifndef _SC_BARRIERS #define _SC_BARRIERS -1 #endif const C_Int_t Posix_ProcEnv_SC_BARRIERS = _SC_BARRIERS; #ifndef _SC_ASYNCHRONOUS_IO #define _SC_ASYNCHRONOUS_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO = _SC_ASYNCHRONOUS_IO; #ifndef _SC_CLOCK_SELECTION #define _SC_CLOCK_SELECTION -1 #endif const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION = _SC_CLOCK_SELECTION; #ifndef _SC_CPUTIME #define _SC_CPUTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_CPUTIME = _SC_CPUTIME; #ifndef _SC_FSYNC #define _SC_FSYNC -1 #endif const C_Int_t Posix_ProcEnv_SC_FSYNC = _SC_FSYNC; #ifndef _SC_IPV6 #define _SC_IPV6 -1 #endif const C_Int_t Posix_ProcEnv_SC_IPV6 = _SC_IPV6; #ifndef _SC_JOB_CONTROL #define _SC_JOB_CONTROL -1 #endif const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL = _SC_JOB_CONTROL; #ifndef _SC_MAPPED_FILES #define _SC_MAPPED_FILES -1 #endif const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES = _SC_MAPPED_FILES; #ifndef _SC_MEMLOCK #define _SC_MEMLOCK -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMLOCK = _SC_MEMLOCK; #ifndef _SC_MEMLOCK_RANGE #define _SC_MEMLOCK_RANGE -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE = _SC_MEMLOCK_RANGE; #ifndef _SC_MEMORY_PROTECTION #define _SC_MEMORY_PROTECTION -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION = _SC_MEMORY_PROTECTION; #ifndef _SC_MESSAGE_PASSING #define _SC_MESSAGE_PASSING -1 #endif const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING = _SC_MESSAGE_PASSING; #ifndef _SC_MONOTONIC_CLOCK #define _SC_MONOTONIC_CLOCK -1 #endif const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK = _SC_MONOTONIC_CLOCK; #ifndef _SC_NPROCESSORS_CONF #define _SC_NPROCESSORS_CONF -1 #endif const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_CONF = _SC_NPROCESSORS_CONF; #ifndef _SC_NPROCESSORS_ONLN #define _SC_NPROCESSORS_ONLN -1 #endif const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_ONLN = _SC_NPROCESSORS_ONLN; #ifndef _SC_PHYS_PAGES #define _SC_PHYS_PAGES -1 #endif const C_Int_t Posix_ProcEnv_SC_PHYS_PAGES = _SC_PHYS_PAGES; #ifndef _SC_PRIORITIZED_IO #define _SC_PRIORITIZED_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO = _SC_PRIORITIZED_IO; #ifndef _SC_PRIORITY_SCHEDULING #define _SC_PRIORITY_SCHEDULING -1 #endif const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING = _SC_PRIORITY_SCHEDULING; #ifndef _SC_RAW_SOCKETS #define _SC_RAW_SOCKETS -1 #endif const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS = _SC_RAW_SOCKETS; #ifndef _SC_READER_WRITER_LOCKS #define _SC_READER_WRITER_LOCKS -1 #endif const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS = _SC_READER_WRITER_LOCKS; #ifndef _SC_REALTIME_SIGNALS #define _SC_REALTIME_SIGNALS -1 #endif const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS = _SC_REALTIME_SIGNALS; #ifndef _SC_REGEXP #define _SC_REGEXP -1 #endif const C_Int_t Posix_ProcEnv_SC_REGEXP = _SC_REGEXP; #ifndef _SC_SAVED_IDS #define _SC_SAVED_IDS -1 #endif const C_Int_t Posix_ProcEnv_SC_SAVED_IDS = _SC_SAVED_IDS; #ifndef _SC_SEMAPHORES #define _SC_SEMAPHORES -1 #endif const C_Int_t Posix_ProcEnv_SC_SEMAPHORES = _SC_SEMAPHORES; #ifndef _SC_SHARED_MEMORY_OBJECTS #define _SC_SHARED_MEMORY_OBJECTS -1 #endif const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS = _SC_SHARED_MEMORY_OBJECTS; #ifndef _SC_SHELL #define _SC_SHELL -1 #endif const C_Int_t Posix_ProcEnv_SC_SHELL = _SC_SHELL; #ifndef _SC_SPAWN #define _SC_SPAWN -1 #endif const C_Int_t Posix_ProcEnv_SC_SPAWN = _SC_SPAWN; #ifndef _SC_SPIN_LOCKS #define _SC_SPIN_LOCKS -1 #endif const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS = _SC_SPIN_LOCKS; #ifndef _SC_SPORADIC_SERVER #define _SC_SPORADIC_SERVER -1 #endif const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER = _SC_SPORADIC_SERVER; #ifndef _SC_SS_REPL_MAX #define _SC_SS_REPL_MAX -1 #endif #ifndef _SC_SS_REPL_MAX #define _SC_SS_REPL_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX = _SC_SS_REPL_MAX; #ifndef _SC_SYNCHRONIZED_IO #define _SC_SYNCHRONIZED_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO = _SC_SYNCHRONIZED_IO; #ifndef _SC_THREAD_ATTR_STACKADDR #define _SC_THREAD_ATTR_STACKADDR -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR = _SC_THREAD_ATTR_STACKADDR; #ifndef _SC_THREAD_ATTR_STACKSIZE #define _SC_THREAD_ATTR_STACKSIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE = _SC_THREAD_ATTR_STACKSIZE; #ifndef _SC_THREAD_CPUTIME #define _SC_THREAD_CPUTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME = _SC_THREAD_CPUTIME; #ifndef _SC_THREAD_PRIO_INHERIT #define _SC_THREAD_PRIO_INHERIT -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT = _SC_THREAD_PRIO_INHERIT; #ifndef _SC_THREAD_PRIO_PROTECT #define _SC_THREAD_PRIO_PROTECT -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT = _SC_THREAD_PRIO_PROTECT; #ifndef _SC_THREAD_PRIORITY_SCHEDULING #define _SC_THREAD_PRIORITY_SCHEDULING -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING = _SC_THREAD_PRIORITY_SCHEDULING; #ifndef _SC_THREAD_PROCESS_SHARED #define _SC_THREAD_PROCESS_SHARED -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED = _SC_THREAD_PROCESS_SHARED; #ifndef _SC_THREAD_SAFE_FUNCTIONS #define _SC_THREAD_SAFE_FUNCTIONS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS = _SC_THREAD_SAFE_FUNCTIONS; #ifndef _SC_THREAD_SPORADIC_SERVER #define _SC_THREAD_SPORADIC_SERVER -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER = _SC_THREAD_SPORADIC_SERVER; #ifndef _SC_THREADS #define _SC_THREADS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREADS = _SC_THREADS; #ifndef _SC_TIMEOUTS #define _SC_TIMEOUTS -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMEOUTS = _SC_TIMEOUTS; #ifndef _SC_TIMERS #define _SC_TIMERS -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMERS = _SC_TIMERS; #ifndef _SC_TRACE #define _SC_TRACE -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE = _SC_TRACE; #ifndef _SC_TRACE_EVENT_FILTER #define _SC_TRACE_EVENT_FILTER -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER = _SC_TRACE_EVENT_FILTER; #ifndef _SC_TRACE_EVENT_NAME_MAX #define _SC_TRACE_EVENT_NAME_MAX -1 #endif #ifndef _SC_TRACE_EVENT_NAME_MAX #define _SC_TRACE_EVENT_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX = _SC_TRACE_EVENT_NAME_MAX; #ifndef _SC_TRACE_INHERIT #define _SC_TRACE_INHERIT -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT = _SC_TRACE_INHERIT; #ifndef _SC_TRACE_LOG #define _SC_TRACE_LOG -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_LOG = _SC_TRACE_LOG; #ifndef _SC_TRACE_NAME_MAX #define _SC_TRACE_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX = _SC_TRACE_NAME_MAX; #ifndef _SC_TRACE_SYS_MAX #define _SC_TRACE_SYS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX = _SC_TRACE_SYS_MAX; #ifndef _SC_TRACE_USER_EVENT_MAX #define _SC_TRACE_USER_EVENT_MAX -1 #endif #ifndef _SC_TRACE_USER_EVENT_MAX #define _SC_TRACE_USER_EVENT_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX = _SC_TRACE_USER_EVENT_MAX; #ifndef _SC_TYPED_MEMORY_OBJECTS #define _SC_TYPED_MEMORY_OBJECTS -1 #endif const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS = _SC_TYPED_MEMORY_OBJECTS; #ifndef _SC_VERSION #define _SC_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_VERSION = _SC_VERSION; #ifndef _SC_V6_ILP32_OFF32 #define _SC_V6_ILP32_OFF32 -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32 = _SC_V6_ILP32_OFF32; #ifndef _SC_V6_ILP32_OFFBIG #define _SC_V6_ILP32_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG = _SC_V6_ILP32_OFFBIG; #ifndef _SC_V6_LP64_OFF64 #define _SC_V6_LP64_OFF64 -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64 = _SC_V6_LP64_OFF64; #ifndef _SC_V6_LPBIG_OFFBIG #define _SC_V6_LPBIG_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG = _SC_V6_LPBIG_OFFBIG; #ifndef _SC_2_C_BIND #define _SC_2_C_BIND -1 #endif const C_Int_t Posix_ProcEnv_SC_2_C_BIND = _SC_2_C_BIND; #ifndef _SC_2_C_DEV #define _SC_2_C_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_C_DEV = _SC_2_C_DEV; #ifndef _SC_2_CHAR_TERM #define _SC_2_CHAR_TERM -1 #endif const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM = _SC_2_CHAR_TERM; #ifndef _SC_2_FORT_DEV #define _SC_2_FORT_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV = _SC_2_FORT_DEV; #ifndef _SC_2_FORT_RUN #define _SC_2_FORT_RUN -1 #endif const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN = _SC_2_FORT_RUN; #ifndef _SC_2_LOCALEDEF #define _SC_2_LOCALEDEF -1 #endif const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF = _SC_2_LOCALEDEF; #ifndef _SC_2_PBS #define _SC_2_PBS -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS = _SC_2_PBS; #ifndef _SC_2_PBS_ACCOUNTING #define _SC_2_PBS_ACCOUNTING -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING = _SC_2_PBS_ACCOUNTING; #ifndef _SC_2_PBS_CHECKPOINT #define _SC_2_PBS_CHECKPOINT -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT = _SC_2_PBS_CHECKPOINT; #ifndef _SC_2_PBS_LOCATE #define _SC_2_PBS_LOCATE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE = _SC_2_PBS_LOCATE; #ifndef _SC_2_PBS_MESSAGE #define _SC_2_PBS_MESSAGE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE = _SC_2_PBS_MESSAGE; #ifndef _SC_2_PBS_TRACK #define _SC_2_PBS_TRACK -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK = _SC_2_PBS_TRACK; #ifndef _SC_2_SW_DEV #define _SC_2_SW_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_SW_DEV = _SC_2_SW_DEV; #ifndef _SC_2_UPE #define _SC_2_UPE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_UPE = _SC_2_UPE; #ifndef _SC_2_VERSION #define _SC_2_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_2_VERSION = _SC_2_VERSION; #ifndef _SC_PAGE_SIZE #define _SC_PAGE_SIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE = _SC_PAGE_SIZE; #ifndef _SC_PAGESIZE #define _SC_PAGESIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_PAGESIZE = _SC_PAGESIZE; #ifndef _SC_THREAD_DESTRUCTOR_ITERATIONS #define _SC_THREAD_DESTRUCTOR_ITERATIONS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS = _SC_THREAD_DESTRUCTOR_ITERATIONS; #ifndef _SC_THREAD_KEYS_MAX #define _SC_THREAD_KEYS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX = _SC_THREAD_KEYS_MAX; #ifndef _SC_THREAD_STACK_MIN #define _SC_THREAD_STACK_MIN -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN = _SC_THREAD_STACK_MIN; #ifndef _SC_THREAD_THREADS_MAX #define _SC_THREAD_THREADS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX = _SC_THREAD_THREADS_MAX; #ifndef _SC_RE_DUP_MAX #define _SC_RE_DUP_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX = _SC_RE_DUP_MAX; #ifndef _SC_RTSIG_MAX #define _SC_RTSIG_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX = _SC_RTSIG_MAX; #ifndef _SC_SEM_NSEMS_MAX #define _SC_SEM_NSEMS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX = _SC_SEM_NSEMS_MAX; #ifndef _SC_SEM_VALUE_MAX #define _SC_SEM_VALUE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX = _SC_SEM_VALUE_MAX; #ifndef _SC_SIGQUEUE_MAX #define _SC_SIGQUEUE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX = _SC_SIGQUEUE_MAX; #ifndef _SC_STREAM_MAX #define _SC_STREAM_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_STREAM_MAX = _SC_STREAM_MAX; #ifndef _SC_SYMLOOP_MAX #define _SC_SYMLOOP_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX = _SC_SYMLOOP_MAX; #ifndef _SC_TIMER_MAX #define _SC_TIMER_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMER_MAX = _SC_TIMER_MAX; #ifndef _SC_TTY_NAME_MAX #define _SC_TTY_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX = _SC_TTY_NAME_MAX; #ifndef _SC_TZNAME_MAX #define _SC_TZNAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX = _SC_TZNAME_MAX; #ifndef _SC_XBS5_ILP32_OFF32 #define _SC_XBS5_ILP32_OFF32 -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32 = _SC_XBS5_ILP32_OFF32; #ifndef _SC_XBS5_ILP32_OFFBIG #define _SC_XBS5_ILP32_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG = _SC_XBS5_ILP32_OFFBIG; #ifndef _SC_XBS5_LP64_OFF64 #define _SC_XBS5_LP64_OFF64 -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64 = _SC_XBS5_LP64_OFF64; #ifndef _SC_XBS5_LPBIG_OFFBIG #define _SC_XBS5_LPBIG_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG = _SC_XBS5_LPBIG_OFFBIG; #ifndef _SC_XOPEN_CRYPT #define _SC_XOPEN_CRYPT -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT = _SC_XOPEN_CRYPT; #ifndef _SC_XOPEN_ENH_I18N #define _SC_XOPEN_ENH_I18N -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N = _SC_XOPEN_ENH_I18N; #ifndef _SC_XOPEN_LEGACY #define _SC_XOPEN_LEGACY -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY = _SC_XOPEN_LEGACY; #ifndef _SC_XOPEN_REALTIME #define _SC_XOPEN_REALTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME = _SC_XOPEN_REALTIME; #ifndef _SC_XOPEN_REALTIME_THREADS #define _SC_XOPEN_REALTIME_THREADS -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS = _SC_XOPEN_REALTIME_THREADS; #ifndef _SC_XOPEN_SHM #define _SC_XOPEN_SHM -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM = _SC_XOPEN_SHM; #ifndef _SC_XOPEN_STREAMS #define _SC_XOPEN_STREAMS -1 #endif #ifndef _SC_XOPEN_STREAMS #define _SC_XOPEN_STREAMS -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS = _SC_XOPEN_STREAMS; #ifndef _SC_XOPEN_UNIX #define _SC_XOPEN_UNIX -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX = _SC_XOPEN_UNIX; #ifndef _SC_XOPEN_VERSION #define _SC_XOPEN_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION = _SC_XOPEN_VERSION; mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/sysconf.c000066400000000000000000000001471416264345000231220ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf (C_Int_t i) { return sysconf (i); } mlton-20210117+dfsg/runtime/basis/Posix/ProcEnv/ttyname.c000066400000000000000000000002221416264345000231110ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_String_t) Posix_ProcEnv_ttyname (C_Fd_t f) { char *res = ttyname (f); return (C_Errno_t(C_String_t))res; } mlton-20210117+dfsg/runtime/basis/Posix/Process/000077500000000000000000000000001416264345000213325ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/Process/alarm.c000066400000000000000000000001311416264345000225650ustar00rootroot00000000000000#include "platform.h" C_UInt_t Posix_Process_alarm (C_UInt_t i) { return alarm (i); } mlton-20210117+dfsg/runtime/basis/Posix/Process/exece.c000066400000000000000000000016121416264345000225670ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_exece (NullString8_t pNStr, Array(NullString8_t) aStr, Array(NullString8_t) eStr) { const char *path; char **args; char **env; uintmax_t aLen; uintmax_t eLen; char *aSaved; char *eSaved; int res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getSequenceLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; env = (char **) eStr; eLen = GC_getSequenceLength((pointer)eStr); eSaved = env[eLen - 1]; env[eLen - 1] = NULL; res = EXECVE (path, (char * const *)args, (char * const *)env); /* exece failed */ args[aLen - 1] = aSaved; env[eLen - 1] = eSaved; return (C_Errno_t(C_Int_t))res; } mlton-20210117+dfsg/runtime/basis/Posix/Process/execp.c000066400000000000000000000011041416264345000225760ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_execp (NullString8_t fNStr, Array(NullString8_t) aStr) { const char *file; char **args; uintmax_t aLen; char *aSaved; int res; file = (const char *) fNStr; args = (char **) aStr; aLen = GC_getSequenceLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; res = EXECVP (file, (char * const *)args); /* execp failed */ args[aLen - 1] = aSaved; return (C_Errno_t(C_Int_t))res; } mlton-20210117+dfsg/runtime/basis/Posix/Process/exit.c000066400000000000000000000001161416264345000224450ustar00rootroot00000000000000#include "platform.h" void Posix_Process_exit (C_Status_t i) { exit (i); } mlton-20210117+dfsg/runtime/basis/Posix/Process/exitStatus.c000066400000000000000000000001701416264345000236510ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_Process_exitStatus (C_Status_t s) { int i; i = s; return WEXITSTATUS (i); } mlton-20210117+dfsg/runtime/basis/Posix/Process/fork.c000066400000000000000000000005301416264345000224350ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_PId_t) Posix_Process_fork (void) { pid_t pid = fork (); #if (defined (__Darwin__)) /* Contrary to the documentation, a forked process does not inherit * the alternate signal stack; re-install the alternate signal * stack. */ if (pid == 0) { GC_initSignalStack(); } #endif return pid; } mlton-20210117+dfsg/runtime/basis/Posix/Process/ifExited.c000066400000000000000000000001411416264345000232330ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_Process_ifExited (C_Status_t s) { return WIFEXITED (s); } mlton-20210117+dfsg/runtime/basis/Posix/Process/ifSignaled.c000066400000000000000000000001451416264345000235430ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_Process_ifSignaled (C_Status_t s) { return WIFSIGNALED (s); } mlton-20210117+dfsg/runtime/basis/Posix/Process/ifStopped.c000066400000000000000000000001431416264345000234310ustar00rootroot00000000000000#include "platform.h" C_Int_t Posix_Process_ifStopped (C_Status_t s) { return WIFSTOPPED (s); } mlton-20210117+dfsg/runtime/basis/Posix/Process/kill.c000066400000000000000000000001611416264345000224270ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_kill (C_PId_t p, C_Signal_t s) { return kill (p, s); } mlton-20210117+dfsg/runtime/basis/Posix/Process/nanosleep.c000066400000000000000000000005721416264345000234660ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_nanosleep (Ref(C_Time_t) sec, Ref(C_Long_t) nsec) { struct timespec rem; struct timespec req; int res; req.tv_sec = *((time_t*)sec); req.tv_nsec =*((long*)nsec); rem.tv_sec = 0; rem.tv_nsec = 0; res = nanosleep (&req, &rem); *((time_t*)sec) = rem.tv_sec; *((long*)nsec) = rem.tv_nsec; return res; } mlton-20210117+dfsg/runtime/basis/Posix/Process/pause.c000066400000000000000000000001341416264345000226110ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_pause (void) { return pause (); } mlton-20210117+dfsg/runtime/basis/Posix/Process/sleep.c000066400000000000000000000001311416264345000226010ustar00rootroot00000000000000#include "platform.h" C_UInt_t Posix_Process_sleep (C_UInt_t i) { return sleep (i); } mlton-20210117+dfsg/runtime/basis/Posix/Process/stopSig.c000066400000000000000000000001651416264345000231300ustar00rootroot00000000000000#include "platform.h" C_Signal_t Posix_Process_stopSig (C_Status_t s) { int i; i = s; return WSTOPSIG (i); } mlton-20210117+dfsg/runtime/basis/Posix/Process/system.c000066400000000000000000000001771416264345000230270ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Status_t) Posix_Process_system (NullString8_t cmd) { return system ((const char*) cmd); } mlton-20210117+dfsg/runtime/basis/Posix/Process/termSig.c000066400000000000000000000001421416264345000231050ustar00rootroot00000000000000#include "platform.h" C_Signal_t Posix_Process_termSig (C_Status_t s) { return WTERMSIG (s); } mlton-20210117+dfsg/runtime/basis/Posix/Process/waitpid-consts.c000066400000000000000000000002641416264345000244500ustar00rootroot00000000000000#include "platform.h" // const C_Int_t Posix_Process_W_CONTINUED = WCONTINUED; const C_Int_t Posix_Process_W_NOHANG = WNOHANG; const C_Int_t Posix_Process_W_UNTRACED = WUNTRACED; mlton-20210117+dfsg/runtime/basis/Posix/Process/waitpid.c000066400000000000000000000002201416264345000231310ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_PId_t) Posix_Process_waitpid (C_PId_t p, Ref(C_Status_t) s, C_Int_t i) { return waitpid (p, (int*)s, i); } mlton-20210117+dfsg/runtime/basis/Posix/Signal-consts.c000066400000000000000000000056111416264345000226070ustar00rootroot00000000000000#include "platform.h" const C_Size_t Posix_Signal_sigSetLen = sizeof (sigset_t); #if (defined (NSIG)) const C_Int_t Posix_Signal_NSIG = NSIG; #elif (defined (_NSIG)) const C_Int_t Posix_Signal_NSIG = _NSIG; #else #error Posix_Signal_numSignals not defined #endif const C_Int_t Posix_Signal_SIG_BLOCK = SIG_BLOCK; const C_Int_t Posix_Signal_SIG_SETMASK = SIG_SETMASK; const C_Int_t Posix_Signal_SIG_UNBLOCK = SIG_UNBLOCK; #ifndef SIGABRT #define SIGABRT -1 #endif const C_Signal_t Posix_Signal_SIGABRT = SIGABRT; #ifndef SIGALRM #define SIGALRM -1 #endif const C_Signal_t Posix_Signal_SIGALRM = SIGALRM; #ifndef SIGBUS #define SIGBUS -1 #endif const C_Signal_t Posix_Signal_SIGBUS = SIGBUS; #ifndef SIGCHLD #define SIGCHLD -1 #endif const C_Signal_t Posix_Signal_SIGCHLD = SIGCHLD; #ifndef SIGCONT #define SIGCONT -1 #endif const C_Signal_t Posix_Signal_SIGCONT = SIGCONT; #ifndef SIGFPE #define SIGFPE -1 #endif const C_Signal_t Posix_Signal_SIGFPE = SIGFPE; #ifndef SIGHUP #define SIGHUP -1 #endif const C_Signal_t Posix_Signal_SIGHUP = SIGHUP; #ifndef SIGILL #define SIGILL -1 #endif const C_Signal_t Posix_Signal_SIGILL = SIGILL; #ifndef SIGINT #define SIGINT -1 #endif const C_Signal_t Posix_Signal_SIGINT = SIGINT; #ifndef SIGKILL #define SIGKILL -1 #endif const C_Signal_t Posix_Signal_SIGKILL = SIGKILL; #ifndef SIGPIPE #define SIGPIPE -1 #endif const C_Signal_t Posix_Signal_SIGPIPE = SIGPIPE; #ifndef SIGQUIT #define SIGQUIT -1 #endif const C_Signal_t Posix_Signal_SIGQUIT = SIGQUIT; #ifndef SIGSEGV #define SIGSEGV -1 #endif const C_Signal_t Posix_Signal_SIGSEGV = SIGSEGV; #ifndef SIGSTOP #define SIGSTOP -1 #endif const C_Signal_t Posix_Signal_SIGSTOP = SIGSTOP; #ifndef SIGTERM #define SIGTERM -1 #endif const C_Signal_t Posix_Signal_SIGTERM = SIGTERM; #ifndef SIGTSTP #define SIGTSTP -1 #endif const C_Signal_t Posix_Signal_SIGTSTP = SIGTSTP; #ifndef SIGTTIN #define SIGTTIN -1 #endif const C_Signal_t Posix_Signal_SIGTTIN = SIGTTIN; #ifndef SIGTTOU #define SIGTTOU -1 #endif const C_Signal_t Posix_Signal_SIGTTOU = SIGTTOU; #ifndef SIGUSR1 #define SIGUSR1 -1 #endif const C_Signal_t Posix_Signal_SIGUSR1 = SIGUSR1; #ifndef SIGUSR2 #define SIGUSR2 -1 #endif const C_Signal_t Posix_Signal_SIGUSR2 = SIGUSR2; #ifndef SIGPOLL #define SIGPOLL -1 #endif const C_Signal_t Posix_Signal_SIGPOLL = SIGPOLL; #ifndef SIGPROF #define SIGPROF -1 #endif const C_Signal_t Posix_Signal_SIGPROF = SIGPROF; #ifndef SIGSYS #define SIGSYS -1 #endif const C_Signal_t Posix_Signal_SIGSYS = SIGSYS; #ifndef SIGTRAP #define SIGTRAP -1 #endif const C_Signal_t Posix_Signal_SIGTRAP = SIGTRAP; #ifndef SIGURG #define SIGURG -1 #endif const C_Signal_t Posix_Signal_SIGURG = SIGURG; #ifndef SIGVTALRM #define SIGVTALRM -1 #endif const C_Signal_t Posix_Signal_SIGVTALRM = SIGVTALRM; #ifndef SIGXCPU #define SIGXCPU -1 #endif const C_Signal_t Posix_Signal_SIGXCPU = SIGXCPU; #ifndef SIGXFSZ #define SIGXFSZ -1 #endif const C_Signal_t Posix_Signal_SIGXFSZ = SIGXFSZ; mlton-20210117+dfsg/runtime/basis/Posix/Signal.c000066400000000000000000000057051416264345000213040ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) Posix_Signal_default (GCState_t s, C_Signal_t signum) { struct sigaction sa; sigdelset (GC_getSignalsHandledAddr (s), signum); memset (&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; return sigaction (signum, &sa, NULL); } C_Errno_t(C_Int_t) Posix_Signal_isDefault (C_Int_t signum, Ref(C_Int_t) isDef) { int res; struct sigaction sa; memset (&sa, 0, sizeof(sa)); res = sigaction (signum, NULL, &sa); *((C_Int_t*)isDef) = sa.sa_handler == SIG_DFL; return res; } C_Errno_t(C_Int_t) Posix_Signal_ignore (GCState_t s, C_Signal_t signum) { struct sigaction sa; sigdelset (GC_getSignalsHandledAddr (s), signum); memset (&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; return sigaction (signum, &sa, NULL); } C_Errno_t(C_Int_t) Posix_Signal_isIgnore (C_Int_t signum, Ref(C_Int_t) isIgn) { int res; struct sigaction sa; memset (&sa, 0, sizeof(sa)); res = sigaction (signum, NULL, &sa); *((C_Int_t*)isIgn) = sa.sa_handler == SIG_IGN; return res; } C_Errno_t(C_Int_t) Posix_Signal_handlee (GCState_t s, C_Int_t signum) { struct sigaction sa; sigaddset (GC_getSignalsHandledAddr (s), signum); memset (&sa, 0, sizeof(sa)); /* The mask must be full because GC_handler reads and writes * s->signalsPending (else there is a race condition). */ sigfillset (&sa.sa_mask); #if HAS_SIGALTSTACK sa.sa_flags = SA_ONSTACK; #endif sa.sa_handler = GC_handler; return sigaction (signum, &sa, NULL); } void Posix_Signal_handleGC (GCState_t s) { GC_setGCSignalHandled (s, TRUE); } C_Int_t Posix_Signal_isPending (GCState_t s, C_Int_t signum) { return sigismember (GC_getSignalsPendingAddr (s), signum); } C_Int_t Posix_Signal_isPendingGC (GCState_t s) { return GC_getGCSignalPending (s); } void Posix_Signal_resetPending (GCState_t s) { sigemptyset (GC_getSignalsPendingAddr (s)); GC_setGCSignalPending (s, FALSE); } C_Errno_t(C_Int_t) Posix_Signal_sigaddset (Array(Word8_t) sigset, C_Signal_t signum) { return sigaddset ((sigset_t*)sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigdelset (Array(Word8_t) sigset, C_Signal_t signum) { return sigdelset ((sigset_t*)sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigemptyset (Array(Word8_t) sigset) { return sigemptyset ((sigset_t*)sigset); } C_Errno_t(C_Int_t) Posix_Signal_sigfillset (Array(Word8_t) sigset) { return sigfillset ((sigset_t*)sigset); } C_Errno_t(C_Int_t) Posix_Signal_sigismember (Vector(Word8_t) sigset, C_Signal_t signum) { return sigismember ((sigset_t*)sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigprocmask (C_Int_t how, Vector(Word8_t) sigset, Array(Word8_t) oldsigset) { return sigprocmask (how, (sigset_t*)sigset, (sigset_t*)oldsigset); } #if ASSERT #define LOCAL_USED_FOR_ASSERT #else #define LOCAL_USED_FOR_ASSERT __attribute__ ((unused)) #endif void Posix_Signal_sigsuspend (Vector(Word8_t) sigset) { LOCAL_USED_FOR_ASSERT int res; res = sigsuspend ((sigset_t*)sigset); assert (-1 == res); } mlton-20210117+dfsg/runtime/basis/Posix/SysDB/000077500000000000000000000000001416264345000207005ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Posix/SysDB/Group.c000066400000000000000000000011651416264345000221430ustar00rootroot00000000000000#include "platform.h" static struct group *Posix_SysDB_Group_group; C_String_t Posix_SysDB_Group_getName(void) { return (C_String_t)(Posix_SysDB_Group_group->gr_name); } C_GId_t Posix_SysDB_Group_getGId(void) { return Posix_SysDB_Group_group->gr_gid; } C_StringArray_t Posix_SysDB_Group_getMem(void) { return (C_StringArray_t)(Posix_SysDB_Group_group->gr_mem); } C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t g) { return NULL != (Posix_SysDB_Group_group = getgrgid ((gid_t)g)); } C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t s) { return NULL != (Posix_SysDB_Group_group = getgrnam ((const char*)s)); } mlton-20210117+dfsg/runtime/basis/Posix/SysDB/Passwd.c000066400000000000000000000014731416264345000223120ustar00rootroot00000000000000#include "platform.h" static struct passwd *Posix_SysDB_Passwd_passwd; C_String_t Posix_SysDB_Passwd_getName(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_name); } C_UId_t Posix_SysDB_Passwd_getUId(void) { return Posix_SysDB_Passwd_passwd->pw_uid; } C_GId_t Posix_SysDB_Passwd_getGId(void) { return Posix_SysDB_Passwd_passwd->pw_gid; } C_String_t Posix_SysDB_Passwd_getDir(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_dir); } C_String_t Posix_SysDB_Passwd_getShell(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_shell); } C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t p) { return NULL != (Posix_SysDB_Passwd_passwd = getpwnam((const char *) p)); } C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_UId_t u) { return NULL != (Posix_SysDB_Passwd_passwd = getpwuid(u)); } mlton-20210117+dfsg/runtime/basis/Posix/TTY-consts.c000066400000000000000000000173001416264345000220500ustar00rootroot00000000000000#include "platform.h" const C_Int_t Posix_TTY_V_NCCS = NCCS; #ifndef VEOF #define VEOF -1 #endif const C_Int_t Posix_TTY_V_VEOF = VEOF; #ifndef VEOL #define VEOL -1 #endif const C_Int_t Posix_TTY_V_VEOL = VEOL; #ifndef VERASE #define VERASE -1 #endif const C_Int_t Posix_TTY_V_VERASE = VERASE; #ifndef VINTR #define VINTR -1 #endif const C_Int_t Posix_TTY_V_VINTR = VINTR; #ifndef VKILL #define VKILL -1 #endif const C_Int_t Posix_TTY_V_VKILL = VKILL; #ifndef VMIN #define VMIN -1 #endif const C_Int_t Posix_TTY_V_VMIN = VMIN; #ifndef VQUIT #define VQUIT -1 #endif const C_Int_t Posix_TTY_V_VQUIT = VQUIT; #ifndef VSTART #define VSTART -1 #endif const C_Int_t Posix_TTY_V_VSTART = VSTART; #ifndef VSTOP #define VSTOP -1 #endif const C_Int_t Posix_TTY_V_VSTOP = VSTOP; #ifndef VSUSP #define VSUSP -1 #endif const C_Int_t Posix_TTY_V_VSUSP = VSUSP; #ifndef VTIME #define VTIME -1 #endif const C_Int_t Posix_TTY_V_VTIME = VTIME; #ifndef BRKINT #define BRKINT -1 #endif const C_TCFlag_t Posix_TTY_I_BRKINT = BRKINT; #ifndef ICRNL #define ICRNL -1 #endif const C_TCFlag_t Posix_TTY_I_ICRNL = ICRNL; #ifndef IGNBRK #define IGNBRK -1 #endif const C_TCFlag_t Posix_TTY_I_IGNBRK = IGNBRK; #ifndef IGNCR #define IGNCR -1 #endif const C_TCFlag_t Posix_TTY_I_IGNCR = IGNCR; #ifndef IGNPAR #define IGNPAR -1 #endif const C_TCFlag_t Posix_TTY_I_IGNPAR = IGNPAR; #ifndef INLCR #define INLCR -1 #endif const C_TCFlag_t Posix_TTY_I_INLCR = INLCR; #ifndef INPCK #define INPCK -1 #endif const C_TCFlag_t Posix_TTY_I_INPCK = INPCK; #ifndef ISTRIP #define ISTRIP -1 #endif const C_TCFlag_t Posix_TTY_I_ISTRIP = ISTRIP; #ifndef IXANY #define IXANY -1 #endif const C_TCFlag_t Posix_TTY_I_IXANY = IXANY; #ifndef IXOFF #define IXOFF -1 #endif const C_TCFlag_t Posix_TTY_I_IXOFF = IXOFF; #ifndef IXON #define IXON -1 #endif const C_TCFlag_t Posix_TTY_I_IXON = IXON; #ifndef PARMRK #define PARMRK -1 #endif const C_TCFlag_t Posix_TTY_I_PARMRK = PARMRK; #ifndef OPOST #define OPOST -1 #endif const C_TCFlag_t Posix_TTY_O_OPOST = OPOST; #ifndef ONLCR #define ONLCR -1 #endif const C_TCFlag_t Posix_TTY_O_ONLCR = ONLCR; #ifndef OCRNL #define OCRNL -1 #endif const C_TCFlag_t Posix_TTY_O_OCRNL = OCRNL; #ifndef ONOCR #define ONOCR -1 #endif const C_TCFlag_t Posix_TTY_O_ONOCR = ONOCR; #ifndef ONLRET #define ONLRET -1 #endif const C_TCFlag_t Posix_TTY_O_ONLRET = ONLRET; #ifndef OFILL #define OFILL -1 #endif const C_TCFlag_t Posix_TTY_O_OFILL = OFILL; #ifndef NLDLY #define NLDLY -1 #endif const C_TCFlag_t Posix_TTY_O_NLDLY = NLDLY; #ifndef NL0 #define NL0 -1 #endif const C_TCFlag_t Posix_TTY_O_NL0 = NL0; #ifndef NL1 #define NL1 -1 #endif const C_TCFlag_t Posix_TTY_O_NL1 = NL1; #ifndef CRDLY #define CRDLY -1 #endif const C_TCFlag_t Posix_TTY_O_CRDLY = CRDLY; #ifndef CR0 #define CR0 -1 #endif const C_TCFlag_t Posix_TTY_O_CR0 = CR0; #ifndef CR1 #define CR1 -1 #endif const C_TCFlag_t Posix_TTY_O_CR1 = CR1; #ifndef CR2 #define CR2 -1 #endif const C_TCFlag_t Posix_TTY_O_CR2 = CR2; #ifndef CR3 #define CR3 -1 #endif const C_TCFlag_t Posix_TTY_O_CR3 = CR3; #ifndef TABDLY #define TABDLY -1 #endif const C_TCFlag_t Posix_TTY_O_TABDLY = TABDLY; #ifndef TAB0 #define TAB0 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB0 = TAB0; #ifndef TAB1 #define TAB1 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB1 = TAB1; #ifndef TAB2 #define TAB2 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB2 = TAB2; #ifndef TAB3 #define TAB3 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB3 = TAB3; #ifndef BSDLY #define BSDLY -1 #endif const C_TCFlag_t Posix_TTY_O_BSDLY = BSDLY; #ifndef BS0 #define BS0 -1 #endif const C_TCFlag_t Posix_TTY_O_BS0 = BS0; #ifndef BS1 #define BS1 -1 #endif const C_TCFlag_t Posix_TTY_O_BS1 = BS1; #ifndef VTDLY #define VTDLY -1 #endif const C_TCFlag_t Posix_TTY_O_VTDLY = VTDLY; #ifndef VT0 #define VT0 -1 #endif const C_TCFlag_t Posix_TTY_O_VT0 = VT0; #ifndef VT1 #define VT1 -1 #endif const C_TCFlag_t Posix_TTY_O_VT1 = VT1; #ifndef FFDLY #define FFDLY -1 #endif const C_TCFlag_t Posix_TTY_O_FFDLY = FFDLY; #ifndef FF0 #define FF0 -1 #endif const C_TCFlag_t Posix_TTY_O_FF0 = FF0; #ifndef FF1 #define FF1 -1 #endif const C_TCFlag_t Posix_TTY_O_FF1 = FF1; #ifndef CSIZE #define CSIZE -1 #endif const C_TCFlag_t Posix_TTY_C_CSIZE = CSIZE; #ifndef CS5 #define CS5 -1 #endif const C_TCFlag_t Posix_TTY_C_CS5 = CS5; #ifndef CS6 #define CS6 -1 #endif const C_TCFlag_t Posix_TTY_C_CS6 = CS6; #ifndef CS7 #define CS7 -1 #endif const C_TCFlag_t Posix_TTY_C_CS7 = CS7; #ifndef CS8 #define CS8 -1 #endif const C_TCFlag_t Posix_TTY_C_CS8 = CS8; #ifndef CSTOPB #define CSTOPB -1 #endif const C_TCFlag_t Posix_TTY_C_CSTOPB = CSTOPB; #ifndef CREAD #define CREAD -1 #endif const C_TCFlag_t Posix_TTY_C_CREAD = CREAD; #ifndef PARENB #define PARENB -1 #endif const C_TCFlag_t Posix_TTY_C_PARENB = PARENB; #ifndef PARODD #define PARODD -1 #endif const C_TCFlag_t Posix_TTY_C_PARODD = PARODD; #ifndef HUPCL #define HUPCL -1 #endif const C_TCFlag_t Posix_TTY_C_HUPCL = HUPCL; #ifndef CLOCAL #define CLOCAL -1 #endif const C_TCFlag_t Posix_TTY_C_CLOCAL = CLOCAL; #ifndef ECHO #define ECHO -1 #endif const C_TCFlag_t Posix_TTY_L_ECHO = ECHO; #ifndef ECHOE #define ECHOE -1 #endif const C_TCFlag_t Posix_TTY_L_ECHOE = ECHOE; #ifndef ECHOK #define ECHOK -1 #endif const C_TCFlag_t Posix_TTY_L_ECHOK = ECHOK; #ifndef ECHONL #define ECHONL -1 #endif const C_TCFlag_t Posix_TTY_L_ECHONL = ECHONL; #ifndef ICANON #define ICANON -1 #endif const C_TCFlag_t Posix_TTY_L_ICANON = ICANON; #ifndef IEXTEN #define IEXTEN -1 #endif const C_TCFlag_t Posix_TTY_L_IEXTEN = IEXTEN; #ifndef ISIG #define ISIG -1 #endif const C_TCFlag_t Posix_TTY_L_ISIG = ISIG; #ifndef NOFLSH #define NOFLSH -1 #endif const C_TCFlag_t Posix_TTY_L_NOFLSH = NOFLSH; #ifndef TOSTOP #define TOSTOP -1 #endif const C_TCFlag_t Posix_TTY_L_TOSTOP = TOSTOP; #ifndef B0 #define B0 -1 #endif const C_Speed_t Posix_TTY_B0 = B0; #ifndef B50 #define B50 -1 #endif const C_Speed_t Posix_TTY_B50 = B50; #ifndef B75 #define B75 -1 #endif const C_Speed_t Posix_TTY_B75 = B75; #ifndef B110 #define B110 -1 #endif const C_Speed_t Posix_TTY_B110 = B110; #ifndef B134 #define B134 -1 #endif const C_Speed_t Posix_TTY_B134 = B134; #ifndef B150 #define B150 -1 #endif const C_Speed_t Posix_TTY_B150 = B150; #ifndef B200 #define B200 -1 #endif const C_Speed_t Posix_TTY_B200 = B200; #ifndef B300 #define B300 -1 #endif const C_Speed_t Posix_TTY_B300 = B300; #ifndef B600 #define B600 -1 #endif const C_Speed_t Posix_TTY_B600 = B600; #ifndef B1200 #define B1200 -1 #endif const C_Speed_t Posix_TTY_B1200 = B1200; #ifndef B1800 #define B1800 -1 #endif const C_Speed_t Posix_TTY_B1800 = B1800; #ifndef B2400 #define B2400 -1 #endif const C_Speed_t Posix_TTY_B2400 = B2400; #ifndef B4800 #define B4800 -1 #endif const C_Speed_t Posix_TTY_B4800 = B4800; #ifndef B9600 #define B9600 -1 #endif const C_Speed_t Posix_TTY_B9600 = B9600; #ifndef B19200 #define B19200 -1 #endif const C_Speed_t Posix_TTY_B19200 = B19200; #ifndef B38400 #define B38400 -1 #endif const C_Speed_t Posix_TTY_B38400 = B38400; #ifndef TCSADRAIN #define TCSADRAIN -1 #endif const C_Int_t Posix_TTY_TC_TCSADRAIN = TCSADRAIN; #ifndef TCSAFLUSH #define TCSAFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCSAFLUSH = TCSAFLUSH; #ifndef TCSANOW #define TCSANOW -1 #endif const C_Int_t Posix_TTY_TC_TCSANOW = TCSANOW; #ifndef TCIOFF #define TCIOFF -1 #endif const C_Int_t Posix_TTY_TC_TCIOFF = TCIOFF; #ifndef TCION #define TCION -1 #endif const C_Int_t Posix_TTY_TC_TCION = TCION; #ifndef TCOOFF #define TCOOFF -1 #endif const C_Int_t Posix_TTY_TC_TCOOFF = TCOOFF; #ifndef TCOON #define TCOON -1 #endif const C_Int_t Posix_TTY_TC_TCOON = TCOON; #ifndef TCIFLUSH #define TCIFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCIFLUSH = TCIFLUSH; #ifndef TCIOFLUSH #define TCIOFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCIOFLUSH = TCIOFLUSH; #ifndef TCOFLUSH #define TCOFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCOFLUSH = TCOFLUSH; mlton-20210117+dfsg/runtime/basis/Posix/TTY.c000066400000000000000000000044041416264345000205420ustar00rootroot00000000000000#include "platform.h" static struct termios Posix_TTY_Termios_termios; C_TCFlag_t Posix_TTY_Termios_getIFlag (void) { return Posix_TTY_Termios_termios.c_iflag; } C_TCFlag_t Posix_TTY_Termios_getOFlag (void) { return Posix_TTY_Termios_termios.c_oflag; } C_TCFlag_t Posix_TTY_Termios_getCFlag (void) { return Posix_TTY_Termios_termios.c_cflag; } C_TCFlag_t Posix_TTY_Termios_getLFlag (void) { return Posix_TTY_Termios_termios.c_lflag; } void Posix_TTY_Termios_getCC (Array(C_CC_t) a) { for (int i = 0; i < NCCS; i++) ((cc_t*)a)[i] = Posix_TTY_Termios_termios.c_cc[i]; } C_Speed_t Posix_TTY_Termios_cfGetOSpeed (void) { return cfgetospeed (&Posix_TTY_Termios_termios); } C_Speed_t Posix_TTY_Termios_cfGetISpeed (void) { return cfgetispeed (&Posix_TTY_Termios_termios); } void Posix_TTY_Termios_setIFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_iflag = f; } void Posix_TTY_Termios_setOFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_oflag = f; } void Posix_TTY_Termios_setCFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_cflag = f; } void Posix_TTY_Termios_setLFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_lflag = f; } void Posix_TTY_Termios_setCC (Array(C_CC_t) a) { for (int i = 0; i < NCCS; i++) Posix_TTY_Termios_termios.c_cc[i] = ((cc_t*)a)[i]; } C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed (C_Speed_t s) { return cfsetospeed (&Posix_TTY_Termios_termios, s); } C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed (C_Speed_t s) { return cfsetispeed (&Posix_TTY_Termios_termios, s); } C_Errno_t(C_Int_t) Posix_TTY_TC_drain (C_Fd_t f) { return tcdrain (f); } C_Errno_t(C_Int_t) Posix_TTY_TC_flow (C_Fd_t f, C_Int_t i) { return tcflow (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_flush (C_Fd_t f, C_Int_t i) { return tcflush (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_getattr (C_Fd_t f) { return tcgetattr (f, &Posix_TTY_Termios_termios); } C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp (C_Fd_t f) { return tcgetpgrp (f); } C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak (C_Fd_t f, C_Int_t i) { return tcsendbreak (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_setattr (C_Fd_t f, C_Int_t i) { return tcsetattr (f, i, &Posix_TTY_Termios_termios); } C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp (C_Fd_t f, C_PId_t p) { return tcsetpgrp (f, p); } mlton-20210117+dfsg/runtime/basis/Real/000077500000000000000000000000001416264345000174755ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Real/IEEEReal-consts.c000066400000000000000000000005261416264345000224660ustar00rootroot00000000000000#include "platform.h" const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST = FE_TONEAREST; const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD = FE_DOWNWARD; const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT = FE_NOSUPPORT; const C_Int_t IEEEReal_RoundingMode_FE_UPWARD = FE_UPWARD; const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO = FE_TOWARDZERO; mlton-20210117+dfsg/runtime/basis/Real/IEEEReal.c000066400000000000000000000040761416264345000211630ustar00rootroot00000000000000#include "platform.h" #if !HAS_FEROUND #if (defined __i386__) || (defined __x86_64__) /* Macros for accessing the hardware control word. */ #define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) #define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) #define _SSE_GETCSR(csr) __asm__ ("stmxcsr %0" : "=m" (*&csr)) #define _SSE_SETCSR(csr) __asm__ ("ldmxcsr %0" : : "m" (*&csr)) #define FPU_ROUNDING_CONTROL_MASK 0x0C00 #define FPU_ROUNDING_CONTROL_SHIFT 10 #define SSE_ROUNDING_CONTROL_MASK 0x00006000 #define SSE_ROUNDING_CONTROL_SHIFT 13 static inline C_Int_t fegetround (void) { uint16_t fpuControl; _FPU_GETCW (fpuControl); return (fpuControl & FPU_ROUNDING_CONTROL_MASK) >> FPU_ROUNDING_CONTROL_SHIFT; } static inline C_Int_t fesetround (C_Int_t mode) { uint16_t fpuControl; #ifdef __x86_64__ uint32_t sseControl; #endif _FPU_GETCW (fpuControl); fpuControl &= ~FPU_ROUNDING_CONTROL_MASK; fpuControl |= mode << FPU_ROUNDING_CONTROL_SHIFT; _FPU_SETCW (fpuControl); #ifdef __x86_64__ _SSE_GETCSR (sseControl); sseControl &= ~SSE_ROUNDING_CONTROL_MASK; sseControl |= mode << SSE_ROUNDING_CONTROL_SHIFT; _SSE_SETCSR (sseControl); #endif return 0; } #elif (defined __UCLIBC__) /* Use whatever we got from fpu_control.h for this CPU model */ #define FE_MASK (FE_DOWNWARD|FE_TONEAREST|FE_TOWARDZERO|FE_UPWARD) static inline int fegetround () { fpu_control_t controlWord; _FPU_GETCW(controlWord); return controlWord & FE_MASK; } static inline int fesetround (int mode) { fpu_control_t controlWord; _FPU_GETCW (controlWord); controlWord = (controlWord & ~FE_MASK) | mode; _FPU_SETCW (controlWord); return 0; } #else #error fe{get,set}round not implemented #endif #endif /* !HAS_FEROUND */ C_Int_t IEEEReal_getRoundingMode (void) { return fegetround (); } C_Int_t IEEEReal_setRoundingMode (C_Int_t m) { assert (m != IEEEReal_RoundingMode_FE_NOSUPPORT); return fesetround (m); } mlton-20210117+dfsg/runtime/basis/Real/Real-ops.h000066400000000000000000000147141416264345000213370ustar00rootroot00000000000000#define FNSUF32 f #define FNSUF64 #define naryNameFnSufResArgsCall_(size, name, f, suf, rty, args, call) \ PRIVATE INLINE \ rty Real##size##_##name args { \ return f##suf call; \ } #define naryNameFnSufResArgsCall(size, name, f, suf, rty, args, call) \ naryNameFnSufResArgsCall_(size, name, f, suf, rty, args, call) #define naryNameFnResArgsCall(size, name, f, rty, args, call) \ naryNameFnSufResArgsCall(size, name, f, FNSUF##size, rty, args, call) #define binaryOp(size, name, op) \ PRIVATE INLINE \ Real##size##_t Real##size##_##name (Real##size##_t r1, Real##size##_t r2) { \ return r1 op r2; \ } #define binaryNameFn(size, name, f) \ naryNameFnResArgsCall(size, name, f, Real##size##_t, (Real##size##_t r1, Real##size##_t r2), (r1, r2)) #define binaryFn(size, f) \ binaryNameFn(size, f, f) #define binaryMathFn(size, f) \ binaryNameFn(size, Math_##f, f) #define compareNameFn(size, name, f) \ PRIVATE INLINE \ Bool Real##size##_##name (Real##size##_t r1, Real##size##_t r2) { \ return f (r1, r2); \ } #define equal(size) \ PRIVATE INLINE \ Bool Real##size##_equal (Real##size##_t r1, Real##size##_t r2) { \ return r1 == r2; \ } #define fmaNameOp(size, name, op) \ naryNameFnResArgsCall(size, name, fma, Real##size##_t, (Real##size##_t r1, Real##size##_t r2, Real##size##_t r3), (r1, r2, op r3)) #define qequal(size) \ PRIVATE INLINE \ Bool Real##size##_qequal (Real##size##_t r1, Real##size##_t r2) { \ return isunordered (r1, r2) || r1 == r2; \ } #define unaryOp(size, name, op) \ PRIVATE INLINE \ Real##size##_t Real##size##_##name (Real##size##_t r) { \ return op r; \ } #define unaryNameFn(size, name, f) \ naryNameFnResArgsCall(size, name, f, Real##size##_t, (Real##size##_t r), (r)) #define unaryFn(size, f) \ unaryNameFn(size, f, f) #define unaryMathFn(size, f) \ unaryNameFn(size, Math_##f, f) #define misaligned(size) \ PRIVATE INLINE \ Real##size##_t Real##size##_fetch (Ref(Real##size##_t) rp) { \ Real##size##_t r; \ memcpy(&r, rp, sizeof(Real##size##_t)); \ return r; \ } \ PRIVATE INLINE \ void Real##size##_store (Ref(Real##size##_t) rp, Real##size##_t r) { \ memcpy(rp, &r, sizeof(Real##size##_t)); \ return; \ } \ PRIVATE INLINE \ void Real##size##_move (Ref(Real##size##_t) dst, Ref(Real##size##_t) src) { \ memcpy(dst, src, sizeof(Real##size##_t)); \ return; \ } #define all(size) \ unaryNameFn(size, abs, fabs) \ binaryOp(size, add, +) \ binaryOp(size, div, /) \ equal(size) \ naryNameFnResArgsCall(size, frexp, frexp, Real##size##_t, (Real##size##_t r, Ref(C_Int_t) ip), (r, (int*)ip)) \ naryNameFnResArgsCall(size, ldexp, ldexp, Real##size##_t, (Real##size##_t r, C_Int_t i), (r, i)) \ compareNameFn(size, le, islessequal) \ compareNameFn(size, lt, isless) \ naryNameFnResArgsCall(size, modf, modf, Real##size##_t, (Real##size##_t x, Ref(Real##size##_t) yp), (x, (Real##size##_t*)yp)) \ binaryOp(size, mul, *) \ fmaNameOp(size, muladd, ) \ fmaNameOp(size, mulsub, -) \ unaryOp(size, neg, -) \ qequal(size) \ unaryNameFn(size, realCeil, ceil) \ unaryNameFn(size, realFloor, floor) \ unaryNameFn(size, realTrunc, trunc) \ unaryNameFn(size, round, rint) \ binaryOp(size, sub, -) \ unaryMathFn(size, acos) \ unaryMathFn(size, asin) \ unaryMathFn(size, atan) \ binaryMathFn(size, atan2) \ unaryMathFn(size, cos) \ unaryMathFn(size, cosh) \ unaryMathFn(size, exp) \ unaryNameFn(size, Math_ln, log) \ unaryMathFn(size, log10) \ binaryMathFn(size, pow) \ unaryMathFn(size, sin) \ unaryMathFn(size, sinh) \ unaryMathFn(size, sqrt) \ unaryMathFn(size, tan) \ unaryMathFn(size, tanh) \ misaligned(size) all(32) all(64) #undef all #undef misaligned #undef unaryMathFn #undef unaryFn #undef unaryNameFn #undef unaryOp #undef qequal #undef fmaNameOp #undef equal #undef compareNameFn #undef binaryMathFn #undef binaryFn #undef binaryNameFn #undef binaryOp #undef naryNameFnResArgsCall #undef naryNameFnSufResArgsCall #undef naryNameFnSufResArgsCall_ #undef FNSUF64 #undef FNSUF32 mlton-20210117+dfsg/runtime/basis/Real/Real.c000066400000000000000000000000701416264345000205210ustar00rootroot00000000000000#include "platform.h" #include "basis/Real/Real-ops.h" mlton-20210117+dfsg/runtime/basis/Real/gdtoa.c000066400000000000000000000025731416264345000207460ustar00rootroot00000000000000#include "platform.h" #include "gdtoa/gdtoa.h" /* This code is patterned on g_ffmt from the gdtoa sources. */ C_String_t Real32_gdtoa (Real32_t f, C_Int_t mode, C_Int_t ndig, C_Int_t rounding, Ref(C_Int_t) decpt) { FPI fpi = { 24, 1-127-24+1, 254-127-24+1, (int)rounding, 0, 6 }; ULong bits[1], L[1]; int ex, i; char *result; memcpy(L, &f, sizeof(Real32_t)); bits[0] = L[0] & 0x7fffff; if ((ex = (L[0] >> 23) & 0xff) != 0) bits[0] |= 0x800000; else ex = 1; ex -= 0x7f + 23; i = STRTOG_Normal; result = gdtoa__gdtoa (&fpi, ex, bits, &i, (int)mode, (int)ndig, (int*)decpt, NULL); return (C_String_t)result; } /* This code is patterned on g_dfmt from the gdtoa sources. */ C_String_t Real64_gdtoa (Real64_t d, C_Int_t mode, C_Int_t ndig, C_Int_t rounding, Ref(C_Int_t) decpt) { FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, (int)rounding, 0, 14 }; ULong bits[2], L[2]; int ex, i; char *result; int x0, x1; if (isBigEndian()) { x0 = 0; x1 = 1; } else { x0 = 1; x1 = 0; } memcpy(L, &d, sizeof(Real64_t)); bits[0] = L[x1]; bits[1] = L[x0] & 0xfffff; if ((ex = (L[x0] >> 20) & 0x7ff) != 0) bits[1] |= 0x100000; else ex = 1; ex -= 0x3ff + 52; i = STRTOG_Normal; result = gdtoa__gdtoa (&fpi, ex, bits, &i, mode, ndig, (int*)decpt, NULL); return (C_String_t)result; } mlton-20210117+dfsg/runtime/basis/Real/strtor.c000066400000000000000000000007051416264345000212000ustar00rootroot00000000000000#include "platform.h" #include "gdtoa/gdtoa.h" Real32_t Real32_strtor (NullString8_t s, C_Int_t rounding) { char *endptr; Real32_t res; gdtoa__strtorf ((const char*)s, &endptr, (int)rounding, &res); assert (NULL != endptr); return res; } Real64_t Real64_strtor (NullString8_t s, C_Int_t rounding) { char *endptr; Real64_t res; gdtoa__strtord ((const char*)s, &endptr, (int)rounding, &res); assert (NULL != endptr); return res; } mlton-20210117+dfsg/runtime/basis/Stdio.c000066400000000000000000000005731416264345000200450ustar00rootroot00000000000000#include "platform.h" void Stdio_printStderr (String8_t s) { uintmax_t size = GC_getSequenceLength ((pointer)s); fwrite ((const void*)s, (size_t)size, 1, stderr); } void Stdio_printStdout (String8_t s) { uintmax_t size = GC_getSequenceLength ((pointer)s); fwrite ((const void*)s, (size_t)size, 1, stdout); } void Stdio_print (String8_t s) { Stdio_printStderr (s); } mlton-20210117+dfsg/runtime/basis/System/000077500000000000000000000000001416264345000200765ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/System/CommandLine.c000066400000000000000000000003561416264345000224340ustar00rootroot00000000000000#include "platform.h" /* Manual initialization is a work-around for a Darwin linker issue. */ C_Int_t CommandLine_argc = 0; C_StringArray_t CommandLine_argv = (C_StringArray_t)NULL; C_String_t CommandLine_commandName = (C_String_t)NULL; mlton-20210117+dfsg/runtime/basis/System/Date.c000066400000000000000000000035121416264345000211200ustar00rootroot00000000000000#include "platform.h" static struct tm Date_tmIn; static struct tm *Date_tmOut; C_Int_t Date_Tm_getHour(void) { return Date_tmOut->tm_hour; } C_Int_t Date_Tm_getIsDst(void) { return Date_tmOut->tm_isdst; } C_Int_t Date_Tm_getMDay(void) { return Date_tmOut->tm_mday; } C_Int_t Date_Tm_getMin(void) { return Date_tmOut->tm_min; } C_Int_t Date_Tm_getMon(void) { return Date_tmOut->tm_mon; } C_Int_t Date_Tm_getSec(void) { return Date_tmOut->tm_sec; } C_Int_t Date_Tm_getWDay(void) { return Date_tmOut->tm_wday; } C_Int_t Date_Tm_getYDay(void) { return Date_tmOut->tm_yday; } C_Int_t Date_Tm_getYear(void) { return Date_tmOut->tm_year; } void Date_Tm_setHour(C_Int_t x) { Date_tmIn.tm_hour = x; } void Date_Tm_setIsDst(C_Int_t x) { Date_tmIn.tm_isdst = x; } void Date_Tm_setMDay(C_Int_t x) { Date_tmIn.tm_mday = x; } void Date_Tm_setMin(C_Int_t x) { Date_tmIn.tm_min = x; } void Date_Tm_setMon(C_Int_t x) { Date_tmIn.tm_mon = x; } void Date_Tm_setSec(C_Int_t x) { Date_tmIn.tm_sec = x; } void Date_Tm_setWDay(C_Int_t x) { Date_tmIn.tm_wday = x; } void Date_Tm_setYDay(C_Int_t x) { Date_tmIn.tm_yday = x; } void Date_Tm_setYear(C_Int_t x) { Date_tmIn.tm_year = x; } C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t) p) { Date_tmOut = gmtime((time_t*)p); if (Date_tmOut == NULL) return -1; return 0; } /* The idea for Date_localOffset comes from KitV3 src/Runtime/Time.c */ C_Double_t Date_localOffset(void) { time_t t1, t2; t1 = time(NULL); t2 = mktime(gmtime(&t1)); return difftime(t2, t1); } C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t) p) { Date_tmOut = localtime((time_t*)p); if (Date_tmOut == NULL) return -1; return 0; } C_Errno_t(C_Time_t) Date_mkTime(void) { return mktime(&Date_tmIn); } C_Size_t Date_strfTime(Array(Char8_t) buf, C_Size_t n, NullString8_t fmt) { return strftime((char*)(buf), n, (const char*)(fmt), &Date_tmIn); } mlton-20210117+dfsg/runtime/basis/System/OS/000077500000000000000000000000001416264345000204175ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/System/OS/IO/000077500000000000000000000000001416264345000207265ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/System/OS/IO/poll-consts.c000066400000000000000000000002201416264345000233410ustar00rootroot00000000000000#include "platform.h" const C_Short_t OS_IO_POLLIN = POLLIN; const C_Short_t OS_IO_POLLPRI = POLLPRI; const C_Short_t OS_IO_POLLOUT = POLLOUT; mlton-20210117+dfsg/runtime/basis/System/OS/IO/poll.c000066400000000000000000000010011416264345000220300ustar00rootroot00000000000000#include "platform.h" C_Errno_t(C_Int_t) OS_IO_poll (Vector(C_Fd_t) fds, Vector(C_Short_t) eventss, C_NFds_t n, C_Int_t timeout, Array(C_Short_t) reventss) { unsigned int i; int res; struct pollfd ufds[n]; for (i = 0; i < n; i++) { ufds[i].fd = ((const int*)fds)[i]; ufds[i].events = ((const short*)eventss)[i]; } res = poll (ufds, n, timeout); for (i = 0; i < n; i++) { ((short*)reventss)[i] = ufds[i].revents; } return res; } mlton-20210117+dfsg/runtime/basis/System/Time.c000066400000000000000000000004701416264345000211410ustar00rootroot00000000000000#include "platform.h" C_Int_t Time_getTimeOfDay (Ref(C_Time_t) sec, Ref(C_SUSeconds_t) usec) { struct timeval timeval; int res; res = gettimeofday (&timeval, (struct timezone*)NULL); if (! res) { *((C_Time_t*)sec) = timeval.tv_sec; *((C_SUSeconds_t*)usec) = timeval.tv_usec; } return res; } mlton-20210117+dfsg/runtime/basis/Word/000077500000000000000000000000001416264345000175255ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/basis/Word/Word-ops.h000066400000000000000000000204451416264345000214150ustar00rootroot00000000000000#define binary(kind, name, op) \ PRIVATE INLINE \ Word##kind Word##kind##_##name (Word##kind w1, Word##kind w2) { \ return w1 op w2; \ } #define bothBinary(size, name, op) \ binary (S##size, name, op) \ binary (U##size, name, op) /* Use `__builtin__overflow` for `Word_`, * because it has defined semantics even if the operation overflows * and to encourage fusing with matching `Word_CheckP`. */ #define binaryOvflOp(kind, name) \ PRIVATE INLINE \ Word##kind Word##kind##_##name (Word##kind w1, Word##kind w2) { \ Word##kind res; \ __builtin_##name##_overflow(w1, w2, &res); \ return res; \ } #define bothBinaryOvflOp(size, name) \ binaryOvflOp (S##size, name) \ binaryOvflOp (U##size, name) #define binaryOvflChk(kind, name) \ PRIVATE INLINE \ Bool Word##kind##_##name##CheckP (Word##kind w1, Word##kind w2) { \ Word##kind res; \ return __builtin_##name##_overflow(w1, w2, &res); \ } #define bothBinaryOvflChk(size, name) \ binaryOvflChk (S##size, name) \ binaryOvflChk (U##size, name) #define binaryOvflOpAndChk(kind, name) \ PRIVATE INLINE \ void Word##kind##_##name##AndCheck (Word##kind w1, Word##kind w2, Word##kind *rw, Bool *rb) { \ *rb = __builtin_##name##_overflow(w1, w2, rw); \ } #define bothBinaryOvflOpAndChk(size, name) \ binaryOvflOpAndChk (S##size, name) \ binaryOvflOpAndChk (U##size, name) #define compare(kind, name, op) \ PRIVATE INLINE \ Bool Word##kind##_##name (Word##kind w1, Word##kind w2) { \ return w1 op w2; \ } #define bothCompare(size, name, op) \ compare (S##size, name, op) \ compare (U##size, name, op) #define negOvflOp(kind) \ PRIVATE INLINE \ Word##kind Word##kind##_neg (Word##kind w) { \ Word##kind res; \ __builtin_sub_overflow(0, w, &res); \ return res; \ } #define negOvflChk(kind) \ PRIVATE INLINE \ Bool Word##kind##_negCheckP (Word##kind w) { \ Word##kind res; \ return __builtin_sub_overflow(0, w, &res); \ } #define negOvflOpAndChk(kind) \ PRIVATE INLINE \ void Word##kind##_negAndCheck (Word##kind w, Word##kind *rw, Bool *rb) { \ *rb = __builtin_sub_overflow(0, w, rw); \ } #define rol(size) \ PRIVATE INLINE \ Word##size Word##size##_rol (Word##size w1, Word32 w2) { \ return (Word##size)(w1 >> (size - w2)) | (Word##size)(w1 << w2); \ } #define ror(size) \ PRIVATE INLINE \ Word##size Word##size##_ror (Word##size w1, Word32 w2) { \ return (Word##size)(w1 >> w2) | (Word##size)(w1 << (size - w2)); \ } \ #define shift(kind, name, op) \ PRIVATE INLINE \ Word##kind Word##kind##_##name (Word##kind w1, Word32 w2) { \ return (Word##kind)(w1 op w2); \ } #define unary(kind, name, op) \ PRIVATE INLINE \ Word##kind Word##kind##_##name (Word##kind w) { \ return (Word##kind)(op w); \ } #define misaligned(size) \ PRIVATE INLINE \ Word##size##_t Word##size##_fetch (Ref(Word##size##_t) wp) { \ Word##size##_t w; \ memcpy(&w, wp, sizeof(Word##size##_t)); \ return w; \ } \ PRIVATE INLINE \ void Word##size##_store (Ref(Word##size##_t) wp, Word##size##_t w) { \ memcpy(wp, &w, sizeof(Word##size##_t)); \ return; \ } \ PRIVATE INLINE \ void Word##size##_move (Ref(Word##size##_t) dst, Ref(Word##size##_t) src) { \ memcpy(dst, src, sizeof(Word##size##_t)); \ return; \ } #define all(size) \ binaryOvflOp (size, add) \ bothBinaryOvflChk (size, add) \ bothBinaryOvflOpAndChk (size, add) \ binary (size, andb, &) \ compare (size, equal, ==) \ bothCompare (size, ge, >=) \ bothCompare (size, gt, >) \ bothCompare (size, le, <=) \ shift (size, lshift, <<) \ bothCompare (size, lt, <) \ bothBinaryOvflOp (size, mul) \ bothBinaryOvflChk (size, mul) \ bothBinaryOvflOpAndChk (size, mul) \ negOvflOp (size) \ negOvflChk (S##size) \ negOvflChk (U##size) \ negOvflOpAndChk (S##size) \ negOvflOpAndChk (U##size) \ unary (size, notb, ~) \ bothBinary (size, quot, /) \ bothBinary (size, rem, %) \ binary (size, orb, |) \ rol(size) \ ror(size) \ /* WordS_rshift has implementation-defined behavior under C11. * "The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has a * signed type and a negative value, the resulting value is * implementation-defined." * However, gcc and clang implement signed '>>' on negative numbers by sign * extension. */ \ shift (S##size, rshift, >>) \ shift (U##size, rshift, >>) \ binaryOvflOp (size, sub) \ bothBinaryOvflChk (size, sub) \ bothBinaryOvflOpAndChk (size, sub) \ binary (size, xorb, ^) all (8) all (16) all (32) all (64) misaligned(64) #undef all #undef misaligned #undef unary #undef shift #undef ror #undef rol #undef negOvflOpAndChk #undef negOvflChk #undef negOvflOp #undef bothCompare #undef compare #undef bothBinaryOvflOpAndChk #undef binaryOvflOpAndChk #undef bothBinaryOvflChk #undef binaryOvflChk #undef bothBinaryOvflOp #undef binaryOvflOp #undef bothBinary #undef binary mlton-20210117+dfsg/runtime/basis/Word/Word.c000066400000000000000000000000701416264345000206010ustar00rootroot00000000000000#include "platform.h" #include "basis/Word/Word-ops.h" mlton-20210117+dfsg/runtime/basis/coerce.c000066400000000000000000000013471416264345000202230ustar00rootroot00000000000000#include "platform.h" #include "basis/coerce.h" /* Real coercions depend on rounding mode and can't be inlined where * gcc might constant-fold them. */ #define coerce(n, f, t) \ t f##_##n##To##t (f x) { \ return (t)x; \ } #define bothFromWordCoerce(name, from, to) \ coerce (name, Word##S##from, to) \ coerce (name, Word##U##from, to) #define allWordCoerce(size) \ bothFromWordCoerce(rnd, size, Real32) \ bothFromWordCoerce(rnd, size, Real64) allWordCoerce(8) allWordCoerce(16) allWordCoerce(32) allWordCoerce(64) #undef allWordCoerce #undef bothToWordCoerce #undef bothFromWordCoerce #undef coerce mlton-20210117+dfsg/runtime/basis/coerce.h000066400000000000000000000027151416264345000202300ustar00rootroot00000000000000#define coerce(n, f, t) \ PRIVATE INLINE \ t f##_##n##To##t (f x) { \ return (t)x; \ } #define bothFromWordCoerce(name, from, to) \ coerce (name, Word##S##from, to) \ coerce (name, Word##U##from, to) #define bothToWordCoerce(name, from, to) \ coerce (name, from, Word##S##to) \ coerce (name, from, Word##U##to) #define allWordCoerce(size) \ bothToWordCoerce(rnd, Real32, size) \ bothToWordCoerce(rnd, Real64, size) \ bothFromWordCoerce(extd, size, Word8) \ bothFromWordCoerce(extd, size, Word16) \ bothFromWordCoerce(extd, size, Word32) \ bothFromWordCoerce(extd, size, Word64) allWordCoerce(8) allWordCoerce(16) allWordCoerce(32) allWordCoerce(64) #undef allWordCoerce #undef bothToWordCoerce #undef bothFromWordCoerce coerce(rnd, Real32, Real32) coerce(rnd, Real32, Real64) coerce(rnd, Real64, Real32) coerce(rnd, Real64, Real64) #undef coerce #define cast(f, t) \ PRIVATE INLINE \ t f##_castTo##t (f x) { \ t y; \ memcpy(&y, &x, sizeof(t)); \ return y; \ } cast(Real32, Word32) cast(Word32, Real32) cast(Real64, Word64) cast(Word64, Real64) #undef cast mlton-20210117+dfsg/runtime/basis/cpointer.c000066400000000000000000000000631416264345000206000ustar00rootroot00000000000000#include "platform.h" #include "basis/cpointer.h" mlton-20210117+dfsg/runtime/basis/cpointer.h000066400000000000000000000017631416264345000206150ustar00rootroot00000000000000PRIVATE INLINE Pointer CPointer_add (Pointer p, C_Size_t s); PRIVATE INLINE C_Size_t CPointer_diff (Pointer p1, Pointer p2); PRIVATE INLINE Bool CPointer_equal (Pointer p1, Pointer p2); PRIVATE INLINE Pointer CPointer_fromWord (C_Pointer_t x); PRIVATE INLINE Bool CPointer_lt (Pointer p1, Pointer p2); PRIVATE INLINE Pointer CPointer_sub (Pointer p, C_Size_t s); PRIVATE INLINE C_Pointer_t CPointer_toWord (Pointer p); PRIVATE INLINE Pointer CPointer_add (Pointer p, C_Size_t s) { return (p + s); } PRIVATE INLINE C_Size_t CPointer_diff (Pointer p1, Pointer p2) { return (size_t)(p1 - p2); } PRIVATE INLINE Bool CPointer_equal (Pointer p1, Pointer p2) { return (p1 == p2); } PRIVATE INLINE Pointer CPointer_fromWord (C_Pointer_t x) { return (Pointer)x; } PRIVATE INLINE Bool CPointer_lt (Pointer p1, Pointer p2) { return (p1 < p2); } PRIVATE INLINE Pointer CPointer_sub (Pointer p, C_Size_t s) { return (p - s); } PRIVATE INLINE C_Pointer_t CPointer_toWord (Pointer p) { return (C_Pointer_t)p; } mlton-20210117+dfsg/runtime/cenv.h000066400000000000000000000076201416264345000166220ustar00rootroot00000000000000/* Copyright (C) 2012,2017 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_CENV_H_ #define _MLTON_CENV_H_ #define _FILE_OFFSET_BITS 64 #ifndef ASSERT #define ASSERT 0 #define NDEBUG #endif /* C99 headers */ #include // #include #include #include // fenv.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include // inttypes.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include #include // #include #include // #include #include #include #include #include // stdint.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include #include #include // #include #include // #include // #include #include #define COMPILE_TIME_ASSERT(name, x) \ typedef int _COMPILE_TIME_ASSERT___##name[(x) ? 1 : -1] COMPILE_TIME_ASSERT(CHAR_BIT__is_eight, CHAR_BIT == 8); COMPILE_TIME_ASSERT(sizeof_float__is_four, sizeof(float) == 4); COMPILE_TIME_ASSERT(sizeof_double__is_eight, sizeof(double) == 8); #if (defined (__APPLE_CC__)) #define __Darwin__ #endif #if (defined (_AIX)) #include "platform/aix.h" #elif (defined (__CYGWIN__)) #include "platform/cygwin.h" #elif (defined (__Darwin__)) #include "platform/darwin.h" #elif (defined (__FreeBSD__) || defined(__FreeBSD_kernel__)) #include "platform/freebsd.h" #elif (defined (__hpux__)) #include "platform/hpux.h" #elif (defined (__GNU__)) #include "platform/hurd.h" #elif (defined (__linux__)) #include "platform/linux.h" #elif (defined (__MINGW32__)) #include "platform/mingw.h" #elif (defined (__NetBSD__)) #include "platform/netbsd.h" #elif (defined (__OpenBSD__)) #include "platform/openbsd.h" #elif (defined (__sun__)) #include "platform/solaris.h" #else #error unknown platform os #endif #if (defined (__alpha__)) #include "platform/alpha.h" #elif (defined (__x86_64__)) #include "platform/amd64.h" #elif (defined (__arm__)) #include "platform/arm.h" #elif (defined (__aarch64__)) #include "platform/arm64.h" #elif (defined (__hppa__)) #include "platform/hppa.h" #elif (defined (__ia64__)) #include "platform/ia64.h" #elif (defined (__m68k__)) #include "platform/m68k.h" #elif (defined (__mips__)) #include "platform/mips.h" #elif (defined (__powerpc64__)) #include "platform/powerpc64.h" #elif (defined (__ppc__)) || (defined (__powerpc__)) #include "platform/powerpc.h" #elif (defined (__riscv)) #include "platform/riscv.h" #elif (defined (__s390__)) #include "platform/s390.h" #elif (defined (__sparc__)) #include "platform/sparc.h" #elif (defined (__i386__)) #include "platform/x86.h" #else #error unknown platform arch #endif #ifndef POINTER_BITS #if UINTPTR_MAX == UINT32_MAX #define POINTER_BITS 32 #elif UINTPTR_MAX == UINT64_MAX #define POINTER_BITS 64 #else #error Platform did not set POINTER_BITS and could not guess it. #endif #endif #ifndef ADDRESS_BITS #define ADDRESS_BITS POINTER_BITS #endif COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_voidStar, sizeof(uintptr_t) == sizeof(void*)); COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_size_t, sizeof(uintptr_t) == sizeof(size_t)); COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_ptrdiff_t, sizeof(uintptr_t) == sizeof(ptrdiff_t)); COMPILE_TIME_ASSERT(sizeof_voidStar__is__pointer_bits, sizeof(void*)*CHAR_BIT == POINTER_BITS); COMPILE_TIME_ASSERT(address_bits__lte__pointer_bits, ADDRESS_BITS <= POINTER_BITS); #include "export.h" #endif /* _MLTON_CENV_H_ */ mlton-20210117+dfsg/runtime/export.h000066400000000000000000000026101416264345000172020ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_EXPORT_H_ #define _MLTON_EXPORT_H_ /* ------------------------------------------------- */ /* Symbols */ /* ------------------------------------------------- */ /* An external symbol is something not defined by the module * (executable or library) being built. Rather, it is provided * from a library dependency (dll, dylib, or shared object). * * A public symbol is defined in this module as being available * to users outside of this module. If building a library, this * means the symbol will be part of the public interface. * * A private symbol is defined within this module, but will not * be made available outside of it. This is typically used for * internal implementation details that should not be accessible. */ #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #define EXTERNAL __declspec(dllimport) #define PUBLIC __declspec(dllexport) #define PRIVATE #else #define EXTERNAL __attribute__((visibility("default"))) #define PUBLIC __attribute__((visibility("default"))) #define PRIVATE __attribute__((visibility("hidden"))) #endif #endif /* _MLTON_EXPORT_H_ */ mlton-20210117+dfsg/runtime/gc.c000066400000000000000000000034721416264345000162540ustar00rootroot00000000000000/* Copyright (C) 2012,2014,2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #define MLTON_GC_INTERNAL_TYPES #define MLTON_GC_INTERNAL_FUNCS #define MLTON_GC_INTERNAL_BASIS #include "platform.h" #if ASSERT #define ARG_USED_FOR_ASSERT #define LOCAL_USED_FOR_ASSERT #else #define ARG_USED_FOR_ASSERT __attribute__ ((unused)) #define LOCAL_USED_FOR_ASSERT __attribute__ ((unused)) #endif #include "gc/virtual-memory.c" #include "gc/align.c" #include "gc/read_write.c" #include "gc/atomic.c" #include "gc/call-stack.c" #include "gc/cheney-copy.c" #include "gc/controls.c" #include "gc/copy-thread.c" #include "gc/current.c" #include "gc/dfs-mark.c" #include "gc/done.c" #include "gc/enter_leave.c" #include "gc/foreach.c" #include "gc/forward.c" #include "gc/frame.c" #include "gc/garbage-collection.c" #include "gc/gc_state.c" #include "gc/generational.c" #include "gc/handler.c" #include "gc/hash-cons.c" #include "gc/heap.c" #include "gc/heap_predicates.c" #include "gc/init-world.c" #include "gc/init.c" #include "gc/int-inf.c" #include "gc/invariant.c" #include "gc/mark-compact.c" #include "gc/model.c" #include "gc/new-object.c" #include "gc/object-size.c" #include "gc/object.c" #include "gc/objptr.c" #include "gc/pack.c" #include "gc/pointer.c" #include "gc/profiling.c" #include "gc/rusage.c" #include "gc/sequence-allocate.c" #include "gc/sequence.c" #include "gc/share.c" #include "gc/signals.c" #include "gc/size.c" #include "gc/sources.c" #include "gc/stack.c" #include "gc/static-heaps.c" #include "gc/switch-thread.c" #include "gc/thread.c" #include "gc/translate.c" #include "gc/weak.c" #include "gc/world.c" mlton-20210117+dfsg/runtime/gc.h000066400000000000000000000035311416264345000162550ustar00rootroot00000000000000/* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_GC_H_ #define _MLTON_GC_H_ #include "platform.h" struct GC_state; typedef struct GC_state *GC_state; typedef GC_state GCState_t; #if POINTER_BITS == 32 #define GC_MODEL_NATIVE32 #elif POINTER_BITS == 64 #define GC_MODEL_NATIVE64 #else #error POINTER_BITS not defined #endif #include "gc/debug.h" #include "gc/align.h" #include "gc/model.h" #include "gc/pointer.h" #include "gc/objptr.h" #include "gc/object.h" #include "gc/sequence.h" #include "gc/sources.h" #include "gc/frame.h" #include "gc/static-heaps.h" #include "gc/foreach.h" #include "gc/stack.h" #include "gc/thread.h" #include "gc/weak.h" #include "gc/int-inf.h" #include "gc/string.h" #include "gc/object-size.h" #include "gc/generational.h" #include "gc/heap.h" #include "gc/current.h" #include "gc/translate.h" #include "gc/sysvals.h" #include "gc/controls.h" #include "gc/major.h" #include "gc/statistics.h" #include "gc/forward.h" #include "gc/cheney-copy.h" #include "gc/hash-cons.h" #include "gc/dfs-mark.h" #include "gc/mark-compact.h" #include "gc/invariant.h" #include "gc/atomic.h" #include "gc/enter_leave.h" #include "gc/signals.h" #include "gc/handler.h" #include "gc/switch-thread.h" #include "gc/garbage-collection.h" #include "gc/new-object.h" #include "gc/sequence-allocate.h" #include "gc/call-stack.h" #include "gc/profiling.h" #include "gc/rusage.h" #include "gc/gc_state.h" #include "gc/init-world.h" #include "gc/world.h" #include "gc/init.h" #include "gc/done.h" #include "gc/copy-thread.h" #include "gc/pack.h" #include "gc/size.h" #include "gc/share.h" #endif /* _MLTON_GC_H_ */ mlton-20210117+dfsg/runtime/gc/000077500000000000000000000000001416264345000161025ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/gc/align.c000066400000000000000000000013621416264345000173420ustar00rootroot00000000000000/* Copyright (C) 2016 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ size_t alignWithExtra (GC_state s, size_t bytes, size_t extra) { return align (bytes + extra, s->alignment) - extra; } #if ASSERT bool isFrontierAligned (GC_state s, pointer p) { return isAligned ((size_t)p + GC_NORMAL_METADATA_SIZE, s->alignment); } #endif pointer alignFrontier (GC_state s, pointer p) { size_t res; res = alignWithExtra (s, (size_t)p, GC_NORMAL_METADATA_SIZE); assert (isFrontierAligned (s, (pointer)res)); return (pointer)res; } mlton-20210117+dfsg/runtime/gc/align.h000066400000000000000000000011301416264345000173400ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t alignWithExtra (GC_state s, size_t bytes, size_t extra); #if ASSERT static inline bool isFrontierAligned (GC_state s, pointer p); #endif static inline pointer alignFrontier (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/atomic.c000066400000000000000000000010111416264345000175130ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void beginAtomic (GC_state s) { s->atomicState++; if (0 == s->limit) s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; } void endAtomic (GC_state s) { s->atomicState--; if (0 == s->atomicState and s->signalsInfo.signalIsPending) s->limit = 0; } mlton-20210117+dfsg/runtime/gc/atomic.h000066400000000000000000000006571416264345000175370ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void beginAtomic (GC_state s); static inline void endAtomic (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/call-stack.c000066400000000000000000000050641416264345000202710ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void numStackFramesAux (__attribute__ ((unused)) GC_state s, __attribute__ ((unused)) GC_frameIndex frameIndex, __attribute__ ((unused)) GC_frameInfo frameInfo, __attribute__ ((unused)) pointer frameTop, uint32_t *numStackFrames) { *numStackFrames += 1; } void numStackFramesFun (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, void *env) { numStackFramesAux (s, frameIndex, frameInfo, frameTop, env); } uint32_t GC_numStackFrames (GC_state s) { uint32_t numStackFrames = 0; struct GC_foreachStackFrameClosure numStackFramesClosure = {.fun = numStackFramesFun, .env = &numStackFrames}; foreachStackFrame (s, &numStackFramesClosure); if (DEBUG_CALL_STACK) fprintf (stderr, "%"PRIu32" = GC_numStackFrames\n", numStackFrames); return numStackFrames; } void callStackAux (__attribute__ ((unused)) GC_state s, GC_frameIndex frameIndex, __attribute__ ((unused)) GC_frameInfo frameInfo, __attribute__ ((unused)) pointer frameTop, GC_callStackState callStackState) { callStackState->frameIndices[callStackState->index] = frameIndex; callStackState->index++; } void callStackFun (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, void *env) { callStackAux (s, frameIndex, frameInfo, frameTop, env); } void GC_callStack (GC_state s, pointer p) { if (DEBUG_CALL_STACK) fprintf (stderr, "GC_callStack\n"); struct GC_callStackState callStackState = {.index = 0, .frameIndices = (uint32_t*)p}; struct GC_foreachStackFrameClosure callStackClosure = {.fun = callStackFun, .env = &callStackState}; foreachStackFrame (s, &callStackClosure); } const uint32_t * GC_frameIndexSourceSeq (GC_state s, GC_frameIndex frameIndex) { const uint32_t *res; res = s->sourceMaps.sourceSeqs[s->frameInfos[frameIndex].sourceSeqIndex]; if (DEBUG_CALL_STACK) fprintf (stderr, FMTPTR" = GC_frameIndexSourceSeq ("FMTFI")\n", (uintptr_t)res, frameIndex); return res; } mlton-20210117+dfsg/runtime/gc/call-stack.h000066400000000000000000000036621416264345000203000ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef struct GC_callStackState { uint32_t index; uint32_t *frameIndices; } *GC_callStackState; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void numStackFramesAux (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, uint32_t *numStackFrames); static inline void numStackFramesFun (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, void *env); static inline void callStackAux (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, GC_callStackState callStackState); static inline void callStackFun (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, void *env); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE uint32_t GC_numStackFrames (GC_state s); PRIVATE void GC_callStack (GC_state s, pointer p); PRIVATE const uint32_t * GC_frameIndexSourceSeq (GC_state s, GC_frameIndex frameIndex); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/cheney-copy.c000066400000000000000000000142531416264345000204760ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Cheney Copying Collection */ /* ---------------------------------------------------------------- */ void updateWeaksForCheneyCopy (GC_state s) { pointer p; GC_weak w; for (w = s->weaks; w != NULL; w = w->link) { assert (BOGUS_OBJPTR != w->objptr); if (DEBUG_WEAK) fprintf (stderr, "updateWeaksForCheneyCopy w = "FMTPTR" ", (uintptr_t)w); p = objptrToPointer (w->objptr, s->heap.start); if (hasFwdPtr(p)) { if (DEBUG_WEAK) fprintf (stderr, "forwarded from "FMTOBJPTR" to "FMTOBJPTR"\n", w->objptr, getFwdPtr(p)); w->objptr = getFwdPtr(p); } else { if (DEBUG_WEAK) fprintf (stderr, "cleared\n"); *(getHeaderp((pointer)w - offsetofWeak (s))) = GC_WEAK_GONE_HEADER; w->objptr = BOGUS_OBJPTR; } } s->weaks = NULL; } void swapHeapsForCheneyCopy (GC_state s) { struct GC_heap tempHeap; tempHeap = s->secondaryHeap; s->secondaryHeap = s->heap; s->heap = tempHeap; setCardMapAndCrossMap (s); } void majorCheneyCopyGC (GC_state s) { size_t bytesCopied; struct GC_forwardState forwardState; struct GC_foreachObjptrClosure forwardObjptrIfInHeapClosure; struct rusage ru_start; pointer toStart; assert (s->secondaryHeap.size >= s->heap.oldGenSize); if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numCopyingGCs++; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Starting major Cheney-copy;]\n"); fprintf (stderr, "[GC:\tfrom heap at "FMTPTR" of size %s bytes,]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); fprintf (stderr, "[GC:\tto heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->secondaryHeap.start), uintmaxToCommaString(s->secondaryHeap.size)); } assert (s->secondaryHeap.start != (pointer)NULL); /* The next assert ensures there is enough space for the copy to * succeed. It does not assert * (s->secondaryHeap.size >= s->heap.size) * because that is too strong. */ assert (s->secondaryHeap.size >= s->heap.oldGenSize); toStart = alignFrontier (s, s->secondaryHeap.start); forwardState.amInMinorGC = FALSE; forwardState.toStart = s->secondaryHeap.start; forwardState.toLimit = s->secondaryHeap.start + s->secondaryHeap.size; forwardState.back = toStart; forwardObjptrIfInHeapClosure.fun = forwardObjptrIfInHeapFun; forwardObjptrIfInHeapClosure.env = &forwardState; foreachGlobalObjptr (s, &forwardObjptrIfInHeapClosure); foreachObjptrInRange (s, toStart, &forwardState.back, &forwardObjptrIfInHeapClosure, TRUE); updateWeaksForCheneyCopy (s); s->secondaryHeap.oldGenSize = (size_t)(forwardState.back - s->secondaryHeap.start); bytesCopied = s->secondaryHeap.oldGenSize; s->cumulativeStatistics.bytesCopied += bytesCopied; swapHeapsForCheneyCopy (s); s->lastMajorStatistics.kind = GC_COPYING; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcCopying); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Finished major Cheney-copy; copied %s bytes.]\n", uintmaxToCommaString(bytesCopied)); } /* ---------------------------------------------------------------- */ /* Minor Cheney Copying Collection */ /* ---------------------------------------------------------------- */ void minorCheneyCopyGC (GC_state s) { size_t bytesAllocated; size_t bytesCopied; struct GC_forwardState forwardState; struct GC_foreachObjptrClosure forwardObjptrIfInNurseryClosure; struct rusage ru_start; if (DEBUG_GENERATIONAL) fprintf (stderr, "minorGC nursery = "FMTPTR" frontier = "FMTPTR"\n", (uintptr_t)s->heap.nursery, (uintptr_t)s->frontier); assert (invariantForGC (s)); bytesAllocated = (size_t)(s->frontier - s->heap.nursery); if (bytesAllocated == 0) return; s->cumulativeStatistics.bytesAllocated += bytesAllocated; if (not s->canMinor) { s->heap.oldGenSize += bytesAllocated; } else { if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numMinorGCs++; if (DEBUG_GENERATIONAL or s->controls.messages) { fprintf (stderr, "[GC: Starting minor Cheney-copy;]\n"); fprintf (stderr, "[GC:\tfrom nursery at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.nursery), uintmaxToCommaString(bytesAllocated)); } assert (invariantForGC (s)); forwardState.amInMinorGC = TRUE; forwardState.toStart = s->heap.start + s->heap.oldGenSize; forwardState.toLimit = forwardState.toStart + bytesAllocated; forwardState.back = forwardState.toStart; forwardObjptrIfInNurseryClosure.fun = forwardObjptrIfInNurseryFun; forwardObjptrIfInNurseryClosure.env = &forwardState; assert (isFrontierAligned (s, forwardState.toStart)); /* Forward all globals. Would like to avoid doing this once all * the globals have been assigned. */ foreachGlobalObjptr (s, &forwardObjptrIfInNurseryClosure); forwardInterGenerationalObjptrs (s, &forwardState); foreachObjptrInRange (s, forwardState.toStart, &forwardState.back, &forwardObjptrIfInNurseryClosure, TRUE); updateWeaksForCheneyCopy (s); bytesCopied = (size_t)(forwardState.back - forwardState.toStart); s->cumulativeStatistics.bytesCopiedMinor += bytesCopied; s->heap.oldGenSize += bytesCopied; s->lastMajorStatistics.numMinorGCs++; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcMinor); if (DEBUG_GENERATIONAL or s->controls.messages) fprintf (stderr, "[GC: Finished minor Cheney-copy; copied %s bytes.]\n", uintmaxToCommaString(bytesCopied)); } } mlton-20210117+dfsg/runtime/gc/cheney-copy.h000066400000000000000000000010411416264345000204720ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void updateWeaksForCheneyCopy (GC_state s); static inline void swapHeapsForCheneyCopy (GC_state s); static void majorCheneyCopyGC (GC_state s); static void minorCheneyCopyGC (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/controls.c000066400000000000000000000007221416264345000201120ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ bool detailedGCTime (GC_state s) { return s->controls.summary; } bool needGCTime (GC_state s) { return DEBUG or s->controls.summary or s->controls.messages or s->controls.rusageMeasureGC; } mlton-20210117+dfsg/runtime/gc/controls.h000066400000000000000000000037761416264345000201330ustar00rootroot00000000000000/* Copyright (C) 2017 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_ratios { /* Minimum live ratio to use copying GC. */ float copy; /* Only use generational GC with copying collection if the ratio of * heap size to live data size is below copyGenerational. */ float copyGenerational; float grow; float hashCons; /* Desired ratio of heap size to live data. */ float live; /* Minimum live ratio to use mark-compact GC. */ float markCompact; /* Only use generational GC with mark-compact collection if the * ratio of heap size to live data size is below * markCompactGenerational. */ float markCompactGenerational; /* As long as the ratio of bytes live to nursery size is greater * than nurseryRatio, use minor GCs. */ float nursery; float ramSlop; float stackCurrentGrow; float stackCurrentMaxReserved; float stackCurrentPermitReserved; float stackCurrentShrink; float stackMaxReserved; float stackShrink; }; struct GC_controls { size_t fixedHeap; /* If 0, then no fixed heap. */ size_t maxHeap; /* if zero, then unlimited, else limit total heap */ bool mayLoadWorld; bool mayPageHeap; /* Permit paging heap to disk during GC */ bool mayProcessAtMLton; bool messages; /* Print a message at the start and end of each gc. */ size_t oldGenSequenceSize; /* Sequences larger are allocated in old gen, if possible. */ struct GC_ratios ratios; bool rusageMeasureGC; bool summary; /* Print a summary of gc info when program exits. */ FILE* summaryFile; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool detailedGCTime (GC_state s); static inline bool needGCTime (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/copy-thread.c000066400000000000000000000056121416264345000204710ustar00rootroot00000000000000/* Copyright (C) 2011-2012 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ GC_thread copyThread (GC_state s, GC_thread from, size_t used) { GC_thread to; if (DEBUG_THREADS) fprintf (stderr, "copyThread ("FMTPTR")\n", (uintptr_t)from); /* newThread may do a GC, which invalidates from. * Hence we need to stash from someplace that the GC can find it. */ assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = pointerToObjptr((pointer)from - offsetofThread (s), s->heap.start); to = newThread (s, alignStackReserved(s, used)); from = (GC_thread)(objptrToPointer(s->savedThread, s->heap.start) + offsetofThread (s)); s->savedThread = BOGUS_OBJPTR; if (DEBUG_THREADS) { fprintf (stderr, FMTPTR" = copyThread ("FMTPTR")\n", (uintptr_t)to, (uintptr_t)from); } copyStack (s, (GC_stack)(objptrToPointer(from->stack, s->heap.start)), (GC_stack)(objptrToPointer(to->stack, s->heap.start))); to->bytesNeeded = from->bytesNeeded; to->exnStack = from->exnStack; return to; } void GC_copyCurrentThread (GC_state s) { GC_thread fromThread; GC_stack fromStack; GC_thread toThread; LOCAL_USED_FOR_ASSERT GC_stack toStack; if (DEBUG_THREADS) fprintf (stderr, "GC_copyCurrentThread\n"); enter (s); fromThread = (GC_thread)(objptrToPointer(s->currentThread, s->heap.start) + offsetofThread (s)); fromStack = (GC_stack)(objptrToPointer(fromThread->stack, s->heap.start)); toThread = copyThread (s, fromThread, fromStack->used); toStack = (GC_stack)(objptrToPointer(toThread->stack, s->heap.start)); assert (toStack->reserved == alignStackReserved (s, toStack->used)); leave (s); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = GC_copyCurrentThread\n", (uintptr_t)toThread); assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = pointerToObjptr((pointer)toThread - offsetofThread (s), s->heap.start); } pointer GC_copyThread (GC_state s, pointer p) { GC_thread fromThread; GC_stack fromStack; GC_thread toThread; LOCAL_USED_FOR_ASSERT GC_stack toStack; if (DEBUG_THREADS) fprintf (stderr, "GC_copyThread ("FMTPTR")\n", (uintptr_t)p); enter (s); fromThread = (GC_thread)(p + offsetofThread (s)); fromStack = (GC_stack)(objptrToPointer(fromThread->stack, s->heap.start)); toThread = copyThread (s, fromThread, fromStack->used); toStack = (GC_stack)(objptrToPointer(toThread->stack, s->heap.start)); assert (toStack->reserved == alignStackReserved (s, toStack->used)); leave (s); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = GC_copyThread ("FMTPTR")\n", (uintptr_t)toThread, (uintptr_t)fromThread); return ((pointer)toThread - offsetofThread (s)); } mlton-20210117+dfsg/runtime/gc/copy-thread.h000066400000000000000000000011501416264345000204670ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_thread copyThread (GC_state s, GC_thread from, size_t size); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_copyCurrentThread (GC_state s); PRIVATE pointer GC_copyThread (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/current.c000066400000000000000000000013441416264345000177320ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ objptr getThreadCurrentObjptr (GC_state s) { return s->currentThread; } GC_thread getThreadCurrent (GC_state s) { pointer p = objptrToPointer(getThreadCurrentObjptr(s), s->heap.start); return (GC_thread)(p + offsetofThread (s)); } objptr getStackCurrentObjptr (GC_state s) { GC_thread thread = getThreadCurrent(s); return thread->stack; } GC_stack getStackCurrent (GC_state s) { pointer p = objptrToPointer(getStackCurrentObjptr(s), s->heap.start); return (GC_stack)p; } mlton-20210117+dfsg/runtime/gc/current.h000066400000000000000000000010661416264345000177400ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline objptr getThreadCurrentObjptr (GC_state s); static inline GC_thread getThreadCurrent (GC_state s); static inline objptr getStackCurrentObjptr (GC_state s); static inline GC_stack getStackCurrent (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/debug.h000066400000000000000000000016451416264345000173470ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef DEBUG #define DEBUG FALSE #endif enum { DEBUG_CALL_STACK = FALSE, DEBUG_CARD_MARKING = FALSE, DEBUG_DETAILED = FALSE, DEBUG_DFS_MARK = FALSE, DEBUG_ENTER_LEAVE = FALSE, DEBUG_GENERATIONAL = FALSE, DEBUG_INT_INF = FALSE, DEBUG_INT_INF_DETAILED = FALSE, DEBUG_MARK_COMPACT = FALSE, DEBUG_MEM = FALSE, DEBUG_OBJPTR = FALSE, DEBUG_PROFILE = FALSE, DEBUG_RESIZING = FALSE, DEBUG_SEQUENCE = FALSE, DEBUG_SHARE = FALSE, DEBUG_SIGNALS = FALSE, DEBUG_SIZE = FALSE, DEBUG_SOURCES = FALSE, DEBUG_STACKS = FALSE, DEBUG_THREADS = FALSE, DEBUG_WEAK = FALSE, DEBUG_WORLD = FALSE, FORCE_GENERATIONAL = FALSE, FORCE_MARK_COMPACT = FALSE, }; mlton-20210117+dfsg/runtime/gc/dfs-mark.c000066400000000000000000000315061416264345000177570ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Depth-first Marking */ /* ---------------------------------------------------------------- */ bool isPointerMarked (pointer p) { return MARK_MASK & getHeader (p); } bool isPointerMarkedByMode (pointer p, GC_markMode m) { switch (m) { case MARK_MODE: return isPointerMarked (p); case UNMARK_MODE: return not isPointerMarked (p); default: die ("bad mark mode %u", m); } } /* dfsMark (s, r, markState) * * Sets all the mark bits in the object graph pointed to by r. * * If markState->markMode is MARK_MODE, it sets the bits to 1. * If markState->markMode is UNMARK_MODE, it sets the bits to 0. * * If markState->shouldHashCons, it hash-conses the objects marked. * * If markState->shouldLinkWeaks, it links the weak objects marked. * * It adds to markState.size the total size in bytes of the objects marked. */ void dfsMark (GC_state s, pointer root, GC_markState markState) { GC_markMode mode = markState->mode; bool shouldHashCons = markState->shouldHashCons; bool shouldLinkWeaks = markState->shouldLinkWeaks; GC_header mark; /* Used to set or clear the mark bit. */ size_t size; /* Total number of bytes marked. */ pointer cur; /* The current object being marked. */ pointer prev; /* The previous object on the mark stack. */ pointer next; /* The next object to mark. */ pointer todo; /* A pointer to the pointer in cur to next. */ GC_header header; GC_header* headerp; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; uint32_t objptrIndex; /* The i'th pointer in the object (element) being marked. */ GC_header nextHeader; GC_header* nextHeaderp; GC_sequenceCounter sequenceIndex; pointer top; /* The top of the next stack frame to mark. */ GC_returnAddress returnAddress; GC_frameInfo frameInfo; GC_frameOffsets frameOffsets; if (not isPointerInHeap (s, root)) return; if (isPointerMarkedByMode (root, mode)) /* Object has already been marked. */ return; mark = (MARK_MODE == mode) ? MARK_MASK : 0; size = 0; cur = root; prev = NULL; headerp = getHeaderp (cur); header = *headerp; goto mark; markNext: /* cur is the object that was being marked. * prev is the mark stack. * next is the unmarked object to be marked. * nextHeaderp points to the header of next. * nextHeader is the header of next. * todo is a pointer to the pointer inside cur that points to next. */ if (DEBUG_DFS_MARK) fprintf (stderr, "markNext" " cur = "FMTPTR" next = "FMTPTR " prev = "FMTPTR" todo = "FMTPTR"\n", (uintptr_t)cur, (uintptr_t)next, (uintptr_t)prev, (uintptr_t)todo); assert (not isPointerMarkedByMode (next, mode)); assert (nextHeaderp == getHeaderp (next)); assert (nextHeader == getHeader (next)); // assert (*(pointer*) todo == next); assert (fetchObjptrToPointer (todo, s->heap.start) == next); headerp = nextHeaderp; header = nextHeader; // *(pointer*)todo = prev; storeObjptrFromPointer (todo, prev, s->heap.start); prev = cur; cur = next; mark: if (DEBUG_DFS_MARK) fprintf (stderr, "mark cur = "FMTPTR" prev = "FMTPTR" mode = %s\n", (uintptr_t)cur, (uintptr_t)prev, (mode == MARK_MODE) ? "mark" : "unmark"); /* cur is the object to mark. * prev is the mark stack. * headerp points to the header of cur. * header is the header of cur. */ assert (not isPointerMarkedByMode (cur, mode)); assert (header == getHeader (cur)); assert (headerp == getHeaderp (cur)); assert (isPointerInHeap (s, cur)); header ^= MARK_MASK; /* Store the mark. In the case of an object that contains a pointer to * itself, it is essential that we store the marked header before marking * the internal pointers (markInNormal below). If we didn't, then we * would see the object as unmarked and traverse it again. */ *headerp = header; splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if (NORMAL_TAG == tag) { size += GC_NORMAL_METADATA_SIZE + bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); if (0 == numObjptrs) { /* There is nothing to mark. */ normalDone: if (shouldHashCons) cur = hashConsPointer (s, cur, TRUE); goto ret; } todo = cur + bytesNonObjptrs; objptrIndex = 0; markInNormal: if (DEBUG_DFS_MARK) fprintf (stderr, "markInNormal objptrIndex = %"PRIu32"\n", objptrIndex); assert (objptrIndex < numObjptrs); next = fetchObjptrToPointer (todo, s->heap.start); if (not isPointer (next) or not isPointerInHeap (s, next)) { markNextInNormal: assert (objptrIndex < numObjptrs); objptrIndex++; if (objptrIndex == numObjptrs) { /* Done. Clear out the counters and return. */ *headerp = header & ~COUNTER_MASK; goto normalDone; } todo += OBJPTR_SIZE; goto markInNormal; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markNextInNormal; } *headerp = (header & ~COUNTER_MASK) | (objptrIndex << COUNTER_SHIFT); goto markNext; } else if (WEAK_TAG == tag) { /* Store the marked header and don't follow any pointers. */ if (shouldLinkWeaks) { GC_weak w; w = (GC_weak)(cur + offsetofWeak (s)); if (DEBUG_WEAK) fprintf (stderr, "marking weak "FMTPTR" ", (uintptr_t)w); if (isObjptr (w->objptr) and isObjptrInHeap (s, w->objptr)) { if (DEBUG_WEAK) fprintf (stderr, "linking\n"); w->link = s->weaks; s->weaks = w; } else { if (DEBUG_WEAK) fprintf (stderr, "not linking\n"); } } goto ret; } else if (SEQUENCE_TAG == tag) { /* When marking sequences: * sequenceIndex is the index of the element to mark. * cur is the pointer to the sequence. * objptrIndex is the index of the pointer within the element * (i.e. the i'th pointer is at index i). * todo is the start of the element. */ size += GC_SEQUENCE_METADATA_SIZE + sizeofSequenceNoMetaData (s, getSequenceLength (cur), bytesNonObjptrs, numObjptrs); if (0 == numObjptrs or 0 == getSequenceLength (cur)) { /* There is nothing to mark. */ sequenceDone: if (shouldHashCons) cur = hashConsPointer (s, cur, TRUE); goto ret; } /* Begin marking first element. */ sequenceIndex = 0; todo = cur; markSequenceElt: assert (sequenceIndex < getSequenceLength (cur)); objptrIndex = 0; /* Skip to the first pointer. */ todo += bytesNonObjptrs; markInSequence: if (DEBUG_DFS_MARK) fprintf (stderr, "markInSequence sequenceIndex = %"PRIxSEQCTR" objptrIndex = %"PRIu32"\n", sequenceIndex, objptrIndex); assert (sequenceIndex < getSequenceLength (cur)); assert (objptrIndex < numObjptrs); assert (todo == indexSequenceAtObjptrIndex (s, cur, sequenceIndex, objptrIndex)); next = fetchObjptrToPointer (todo, s->heap.start); if (not isPointer (next) or not isPointerInHeap (s, next)) { markNextInSequence: assert (sequenceIndex < getSequenceLength (cur)); assert (objptrIndex < numObjptrs); assert (todo == indexSequenceAtObjptrIndex (s, cur, sequenceIndex, objptrIndex)); todo += OBJPTR_SIZE; objptrIndex++; if (objptrIndex < numObjptrs) goto markInSequence; sequenceIndex++; if (sequenceIndex < getSequenceLength (cur)) goto markSequenceElt; /* Done. Clear out the counters and return. */ *getSequenceCounterp (cur) = 0; *headerp = header & ~COUNTER_MASK; goto sequenceDone; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markNextInSequence; } /* Recur and mark next. */ *getSequenceCounterp (cur) = sequenceIndex; *headerp = (header & ~COUNTER_MASK) | (objptrIndex << COUNTER_SHIFT); goto markNext; } else { assert (STACK_TAG == tag); size += GC_STACK_METADATA_SIZE + sizeof (struct GC_stack) + ((GC_stack)cur)->reserved; top = getStackTop (s, (GC_stack)cur); assert (((GC_stack)cur)->used <= ((GC_stack)cur)->reserved); markInStack: /* Invariant: top points just past the return address of the frame * to be marked. */ assert (getStackBottom (s, (GC_stack)cur) <= top); if (DEBUG_DFS_MARK) fprintf (stderr, "markInStack top = %"PRIuMAX"\n", (uintmax_t)(top - getStackBottom (s, (GC_stack)cur))); if (top == getStackBottom (s, (GC_stack)(cur))) goto ret; objptrIndex = 0; returnAddress = *(GC_returnAddress*) (top - GC_RETURNADDRESS_SIZE); frameInfo = getFrameInfoFromReturnAddress (s, returnAddress); frameOffsets = frameInfo->offsets; ((GC_stack)cur)->markTop = top; markInFrame: if (objptrIndex == frameOffsets [0]) { top -= frameInfo->size; goto markInStack; } todo = top - frameInfo->size + frameOffsets [objptrIndex + 1]; next = fetchObjptrToPointer (todo, s->heap.start); if (DEBUG_DFS_MARK) fprintf (stderr, " offset %u todo "FMTPTR" next = "FMTPTR"\n", frameOffsets [objptrIndex + 1], (uintptr_t)todo, (uintptr_t)next); if (not isPointer (next) or not isPointerInHeap (s, next)) { objptrIndex++; goto markInFrame; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { objptrIndex++; if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markInFrame; } ((GC_stack)cur)->markIndex = objptrIndex; goto markNext; } assert (FALSE); ret: /* Done marking cur, continue with prev. * Need to set the pointer in the prev object that pointed to cur * to point back to prev, and restore prev. */ if (DEBUG_DFS_MARK) fprintf (stderr, "return cur = "FMTPTR" prev = "FMTPTR"\n", (uintptr_t)cur, (uintptr_t)prev); assert (isPointerMarkedByMode (cur, mode)); if (NULL == prev) { markState->size += size; return; } next = cur; cur = prev; headerp = getHeaderp (cur); header = *headerp; splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* It's impossible to get a WEAK_TAG here, since we would never * follow the weak object pointer. */ assert (WEAK_TAG != tag); if (NORMAL_TAG == tag) { todo = cur + bytesNonObjptrs; objptrIndex = (header & COUNTER_MASK) >> COUNTER_SHIFT; todo += objptrIndex * OBJPTR_SIZE; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); goto markNextInNormal; } else if (SEQUENCE_TAG == tag) { sequenceIndex = getSequenceCounter (cur); todo = cur + sequenceIndex * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); objptrIndex = (header & COUNTER_MASK) >> COUNTER_SHIFT; todo += bytesNonObjptrs + objptrIndex * OBJPTR_SIZE; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); goto markNextInSequence; } else { assert (STACK_TAG == tag); objptrIndex = ((GC_stack)cur)->markIndex; top = ((GC_stack)cur)->markTop; /* Invariant: top points just past a "return address". */ returnAddress = *(GC_returnAddress*) (top - GC_RETURNADDRESS_SIZE); frameInfo = getFrameInfoFromReturnAddress (s, returnAddress); frameOffsets = frameInfo->offsets; todo = top - frameInfo->size + frameOffsets [objptrIndex + 1]; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); objptrIndex++; goto markInFrame; } assert (FALSE); } void dfsMarkObjptr (GC_state s, objptr *opp, GC_markState markState) { pointer p; p = objptrToPointer (*opp, s->heap.start); dfsMark (s, p, markState); } void dfsMarkObjptrFun (GC_state s, objptr *opp, void *env) { dfsMarkObjptr(s, opp, env); } mlton-20210117+dfsg/runtime/gc/dfs-mark.h000066400000000000000000000017501416264345000177620ustar00rootroot00000000000000/* Copyright (C) 2012,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { MARK_MODE, UNMARK_MODE, } GC_markMode; typedef struct GC_markState { GC_markMode mode; bool shouldHashCons; bool shouldLinkWeaks; size_t size; } *GC_markState; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isPointerMarked (pointer p); static inline bool isPointerMarkedByMode (pointer p, GC_markMode m); static void dfsMark (GC_state s, pointer root, GC_markState markState); static void dfsMarkObjptr (GC_state s, objptr *root, GC_markState markState); static void dfsMarkObjptrFun (GC_state s, objptr *root, void *env); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/done.c000066400000000000000000000070301416264345000171730ustar00rootroot00000000000000/* Copyright (C) 2012,2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static void displayCol (FILE *out, size_t width, const char *s) { size_t extra; size_t i; size_t len; len = strlen (s); if (len < width) { extra = width - len; for (i = 0; i < extra; i++) fprintf (out, " "); } fprintf (out, "%s\t", s); } static void displayCollectionStats (FILE *out, const char *name, struct rusage *ru, uintmax_t num, uintmax_t bytes) { uintmax_t ms; ms = rusageTime (ru); fprintf (out, "%s", name); displayCol (out, 7, uintmaxToCommaString (ms)); displayCol (out, 7, uintmaxToCommaString (num)); displayCol (out, 15, uintmaxToCommaString (bytes)); displayCol (out, 15, (ms > 0) ? uintmaxToCommaString ((uintmax_t)(1000.0 * (float)bytes/(float)ms)) : "-"); fprintf (out, "\n"); } void GC_done (GC_state s) { FILE *out; enter (s); minorGC (s); out = s->controls.summaryFile; if (s->controls.summary) { struct rusage ru_total; uintmax_t gcTime; uintmax_t totalTime; getrusage (RUSAGE_SELF, &ru_total); totalTime = rusageTime (&ru_total); gcTime = rusageTime (&s->cumulativeStatistics.ru_gc); fprintf (out, "GC type\t\ttime ms\t number\t\t bytes\t bytes/sec\n"); fprintf (out, "-------------\t-------\t-------\t---------------\t---------------\n"); displayCollectionStats (out, "copying\t\t", &s->cumulativeStatistics.ru_gcCopying, s->cumulativeStatistics.numCopyingGCs, s->cumulativeStatistics.bytesCopied); displayCollectionStats (out, "mark-compact\t", &s->cumulativeStatistics.ru_gcMarkCompact, s->cumulativeStatistics.numMarkCompactGCs, s->cumulativeStatistics.bytesMarkCompacted); displayCollectionStats (out, "minor\t\t", &s->cumulativeStatistics.ru_gcMinor, s->cumulativeStatistics.numMinorGCs, s->cumulativeStatistics.bytesCopiedMinor); fprintf (out, "total time: %s ms\n", uintmaxToCommaString (totalTime)); fprintf (out, "total GC time: %s ms (%.1f%%)\n", uintmaxToCommaString (gcTime), (0 == totalTime) ? 0.0 : 100.0 * ((double) gcTime) / (double)totalTime); fprintf (out, "max pause time: %s ms\n", uintmaxToCommaString (s->cumulativeStatistics.maxPauseTime)); fprintf (out, "total bytes allocated: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesAllocated)); fprintf (out, "max bytes live: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxBytesLive)); fprintf (out, "max heap size: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxHeapSize)); fprintf (out, "max stack size: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxStackSize)); fprintf (out, "num cards marked: %s\n", uintmaxToCommaString (s->cumulativeStatistics.numCardsMarked)); fprintf (out, "bytes scanned: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesScannedMinor)); fprintf (out, "bytes hash consed: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesHashConsed)); } releaseHeap (s, &s->heap); releaseHeap (s, &s->secondaryHeap); } mlton-20210117+dfsg/runtime/gc/done.h000066400000000000000000000004371416264345000172040ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ PRIVATE void GC_done (GC_state s); mlton-20210117+dfsg/runtime/gc/enter_leave.c000066400000000000000000000022211416264345000205340ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* enter and leave should be called at the start and end of every GC * function that is exported to the outside world. They make sure * that the function is run in a critical section and check the GC * invariant. */ void enter (GC_state s) { if (DEBUG) fprintf (stderr, "enter\n"); /* used needs to be set because the mutator has changed s->stackTop. */ getStackCurrent(s)->used = sizeofGCStateCurrentStackUsed (s); getThreadCurrent(s)->exnStack = s->exnStack; if (DEBUG) displayGCState (s, stderr); beginAtomic (s); assert (invariantForGC (s)); if (DEBUG) fprintf (stderr, "enter ok\n"); } void leave (GC_state s) { if (DEBUG) fprintf (stderr, "leave\n"); /* The mutator frontier invariant may not hold * for functions that don't ensureBytesFree. */ assert (invariantForMutator (s, FALSE, TRUE)); endAtomic (s); if (DEBUG) fprintf (stderr, "leave ok\n"); } mlton-20210117+dfsg/runtime/gc/enter_leave.h000066400000000000000000000006451416264345000205510ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void enter (GC_state s); static inline void leave (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/foreach.c000066400000000000000000000200051416264345000176520ustar00rootroot00000000000000/* Copyright (C) 2016,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void callIfIsObjptr (GC_state s, GC_foreachObjptrClosure f, objptr *opp) { if (isObjptr (*opp)) f->fun (s, opp, f->env); } /* foreachGlobalObjptr (s, f) * * Apply f to each global object pointer into the heap. */ void foreachGlobalObjptr (GC_state s, GC_foreachObjptrClosure f) { for (unsigned int i = 0; i < s->globalsLength; ++i) { if (DEBUG_DETAILED) fprintf (stderr, "foreachGlobal %u\n", i); callIfIsObjptr (s, f, &s->globals [i]); } foreachObjptrInStaticHeap (s, &s->staticHeaps.root, f, TRUE); if (DEBUG_DETAILED) fprintf (stderr, "foreachGlobal threads\n"); callIfIsObjptr (s, f, &s->callFromCHandlerThread); callIfIsObjptr (s, f, &s->currentThread); callIfIsObjptr (s, f, &s->savedThread); callIfIsObjptr (s, f, &s->signalHandlerThread); } /* foreachObjptrInObject (s, p, f, skipWeaks) * * Applies f to each object pointer in the object pointed to by p. * Returns pointer to the end of object, i.e. just past object. * * If skipWeaks, then the object pointer in weak objects is skipped. */ pointer foreachObjptrInObject (GC_state s, pointer p, GC_foreachObjptrClosure f, bool skipWeaks) { GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; header = getHeader (p); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if (DEBUG_DETAILED) fprintf (stderr, "foreachObjptrInObject ("FMTPTR")" " header = "FMTHDR " tag = %s" " bytesNonObjptrs = %d" " numObjptrs = %d\n", (uintptr_t)p, header, objectTypeTagToString (tag), bytesNonObjptrs, numObjptrs); if (NORMAL_TAG == tag) { p += bytesNonObjptrs; pointer max = p + (numObjptrs * OBJPTR_SIZE); /* Apply f to all internal pointers. */ for ( ; p < max; p += OBJPTR_SIZE) { if (DEBUG_DETAILED) fprintf (stderr, " p = "FMTPTR" *p = "FMTOBJPTR"\n", (uintptr_t)p, *(objptr*)p); callIfIsObjptr (s, f, (objptr*)p); } } else if (WEAK_TAG == tag) { p += bytesNonObjptrs; if (1 == numObjptrs) { if (not skipWeaks) callIfIsObjptr (s, f, (objptr*)p); p += OBJPTR_SIZE; } } else if (SEQUENCE_TAG == tag) { size_t bytesPerElement; size_t dataBytes; pointer last; GC_sequenceLength numElements; numElements = getSequenceLength (p); bytesPerElement = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); dataBytes = numElements * bytesPerElement; if (0 == numObjptrs) { /* No objptrs to process. */ ; } else { last = p + dataBytes; if (0 == bytesNonObjptrs) /* Sequence with only pointers. */ for ( ; p < last; p += OBJPTR_SIZE) callIfIsObjptr (s, f, (objptr*)p); else { /* Sequence with a mix of pointers and non-pointers. */ size_t bytesObjptrs; bytesObjptrs = numObjptrs * OBJPTR_SIZE; /* For each sequence element. */ for ( ; p < last; ) { pointer next; /* Skip the non-pointers. */ p += bytesNonObjptrs; next = p + bytesObjptrs; /* For each internal pointer. */ for ( ; p < next; p += OBJPTR_SIZE) callIfIsObjptr (s, f, (objptr*)p); } } assert (p == last); p -= dataBytes; } p += alignWithExtra (s, dataBytes, GC_SEQUENCE_METADATA_SIZE); } else { /* stack */ GC_stack stack; pointer top, bottom; unsigned int i; GC_returnAddress returnAddress; GC_frameInfo frameInfo; GC_frameOffsets frameOffsets; assert (STACK_TAG == tag); stack = (GC_stack)p; bottom = getStackBottom (s, stack); top = getStackTop (s, stack); if (DEBUG) { fprintf (stderr, " bottom = "FMTPTR" top = "FMTPTR"\n", (uintptr_t)bottom, (uintptr_t)top); } assert (stack->used <= stack->reserved); while (top > bottom) { /* Invariant: top points just past a "return address". */ returnAddress = *((GC_returnAddress*)(top - GC_RETURNADDRESS_SIZE)); if (DEBUG) { fprintf (stderr, " top = "FMTPTR" return address = "FMTRA"\n", (uintptr_t)top, returnAddress); } frameInfo = getFrameInfoFromReturnAddress (s, returnAddress); frameOffsets = frameInfo->offsets; top -= frameInfo->size; for (i = 0 ; i < frameOffsets[0] ; ++i) { if (DEBUG) fprintf(stderr, " offset %"PRIx16" address "FMTOBJPTR"\n", frameOffsets[i + 1], *(objptr*)(top + frameOffsets[i + 1])); callIfIsObjptr (s, f, (objptr*)(top + frameOffsets[i + 1])); } } assert(top == bottom); p += sizeof (struct GC_stack) + stack->reserved; } return p; } /* foreachObjptrInRange (s, front, back, f, skipWeaks) * * Apply f to each pointer between front and *back, which should be a * contiguous sequence of objects, where front points at the beginning * of the first object and *back points just past the end of the last * object. f may increase *back (for example, this is done by * forward). foreachObjptrInRange returns a pointer to the end of * the last object it visits. * * If skipWeaks, then the object pointer in weak objects is skipped. */ pointer foreachObjptrInRange (GC_state s, pointer front, pointer *back, GC_foreachObjptrClosure f, bool skipWeaks) { pointer b; assert (isFrontierAligned (s, front)); if (DEBUG_DETAILED) fprintf (stderr, "foreachObjptrInRange front = "FMTPTR" *back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)(*back)); b = *back; assert (front <= b); while (front < b) { while (front < b) { assert (isAligned ((size_t)front, GC_MODEL_MINALIGN)); if (DEBUG_DETAILED) fprintf (stderr, " front = "FMTPTR" *back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)(*back)); pointer p = advanceToObjectData (s, front); assert (isAligned ((size_t)p, s->alignment)); front = foreachObjptrInObject (s, p, f, skipWeaks); } b = *back; } return front; } void foreachObjptrInStaticHeap (GC_state s, struct GC_staticHeap *staticHeap, GC_foreachObjptrClosure f, bool skipWeaks) { pointer front = alignFrontier (s, staticHeap->start); pointer back = staticHeap->start + staticHeap->size; foreachObjptrInRange (s, front, &back, f, skipWeaks); } /* Apply f to the frame index of each frame in the current thread's stack. */ void foreachStackFrame (GC_state s, GC_foreachStackFrameClosure f) { pointer bottom; GC_frameIndex frameIndex; GC_frameInfo frameInfo; GC_returnAddress returnAddress; pointer top; if (DEBUG_PROFILE) fprintf (stderr, "foreachStackFrame\n"); bottom = getStackBottom (s, getStackCurrent(s)); if (DEBUG_PROFILE) fprintf (stderr, " bottom = "FMTPTR" top = "FMTPTR".\n", (uintptr_t)bottom, (uintptr_t)s->stackTop); top = s->stackTop; while (top > bottom) { returnAddress = *((GC_returnAddress*)(top - GC_RETURNADDRESS_SIZE)); frameIndex = getFrameIndexFromReturnAddress (s, returnAddress); if (DEBUG_PROFILE) fprintf (stderr, "top = "FMTPTR" frameIndex = "FMTFI"\n", (uintptr_t)top, frameIndex); unless (frameIndex < s->frameInfosLength) die ("top = "FMTPTR" returnAddress = "FMTRA" frameIndex = "FMTFI"\n", (uintptr_t)top, (uintptr_t)returnAddress, frameIndex); frameInfo = &(s->frameInfos[frameIndex]); assert (frameInfo->size > 0); top -= frameInfo->size; f->fun (s, frameIndex, frameInfo, top, f->env); } if (DEBUG_PROFILE) fprintf (stderr, "done foreachStackFrame\n"); } mlton-20210117+dfsg/runtime/gc/foreach.h000066400000000000000000000051121416264345000176610ustar00rootroot00000000000000/* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) typedef void (*GC_foreachObjptrFun) (GC_state s, objptr *opp, void *env); typedef struct GC_foreachObjptrClosure { GC_foreachObjptrFun fun; void *env; } *GC_foreachObjptrClosure; static inline void callIfIsObjptr (GC_state s, GC_foreachObjptrClosure f, objptr *opp); /* foreachGlobalObjptr (s, f) * * Apply f to each global object pointer into the heap. */ static inline void foreachGlobalObjptr (GC_state s, GC_foreachObjptrClosure f); /* foreachObjptrInObject (s, p, skipWeaks, f) * * Applies f to each object pointer in the object pointed to by p. * Returns pointer to the end of object, i.e. just past object. * * If skipWeaks, then the object pointer in weak objects is skipped. */ static inline pointer foreachObjptrInObject (GC_state s, pointer p, GC_foreachObjptrClosure f, bool skipWeaks); /* foreachObjptrInRange (s, front, back, f, skipWeaks) * * Apply f to each pointer between front and *back, which should be a * contiguous sequence of objects, where front points at the beginning * of the first object and *back points just past the end of the last * object. f may increase *back (for example, this is done by * forward). foreachObjptrInRange returns a pointer to the end of * the last object it visits. * * If skipWeaks, then the object pointer in weak objects is skipped. */ static inline pointer foreachObjptrInRange (GC_state s, pointer front, pointer *back, GC_foreachObjptrClosure f, bool skipWeaks); static inline void foreachObjptrInStaticHeap (GC_state s, struct GC_staticHeap *staticHeap, GC_foreachObjptrClosure f, bool skipWeaks); typedef void (*GC_foreachStackFrameFun) (GC_state s, GC_frameIndex i, GC_frameInfo frameInfo, pointer frameTop, void *env); typedef struct GC_foreachStackFrameClosure { GC_foreachStackFrameFun fun; void *env; } *GC_foreachStackFrameClosure; /* foreachStackFrame (s, f); * * Apply f to the frame index of each frame in the current stack. */ static inline void foreachStackFrame (GC_state s, GC_foreachStackFrameClosure f); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/forward.c000066400000000000000000000227011416264345000177140ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if ASSERT bool isPointerInToSpace (__attribute__((unused)) GC_state s, pointer p, GC_forwardState forwardState) { return (not (isPointer (p)) or (forwardState->toStart <= p and p < forwardState->toLimit)); } bool isObjptrInToSpace (__attribute__((unused)) GC_state s, objptr op, GC_forwardState forwardState) { pointer p; if (not (isObjptr (op))) return TRUE; p = objptrToPointer (op, forwardState->toStart); return isPointerInToSpace (s, p, forwardState); } #endif /* getFwdPtrp (p) * * Returns a pointer to the forwarding pointer for the object pointed to by p. */ objptr* getFwdPtrp (pointer p) { return (objptr*)(getHeaderp(p)); } /* getFwdPtr (p) * * Returns the forwarding pointer for the object pointed to by p. */ objptr getFwdPtr (pointer p) { return *(getFwdPtrp(p)); } /* hasFwdPtr (p) * * Returns true if the object pointed to by p has a valid forwarding pointer. */ bool hasFwdPtr (pointer p) { return (not (GC_VALID_HEADER_MASK & getHeader(p))); } /* forward (s, opp) * Forwards the object pointed to by *opp and updates *opp to point to * the new object. */ void forwardObjptr (GC_state s, objptr *opp, GC_forwardState forwardState) { objptr op; pointer p; op = *opp; p = objptrToPointer (op, s->heap.start); if (DEBUG_DETAILED) fprintf (stderr, "forwardObjptr opp = "FMTPTR" op = "FMTOBJPTR" p = "FMTPTR"\n", (uintptr_t)opp, op, (uintptr_t)p); assert (isObjptrInFromSpace (s, *opp)); if (DEBUG_DETAILED and hasFwdPtr(p)) fprintf (stderr, " already FORWARDED\n"); if (not (hasFwdPtr(p))) { /* forward the object */ size_t size, skip; size_t metaDataBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; splitHeader(s, getHeader(p), &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ metaDataBytes = GC_NORMAL_METADATA_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skip = 0; } else if (SEQUENCE_TAG == tag) { metaDataBytes = GC_SEQUENCE_METADATA_SIZE; objectBytes = sizeofSequenceNoMetaData (s, getSequenceLength (p), bytesNonObjptrs, numObjptrs); skip = 0; } else { /* Stack. */ bool current; size_t reservedNew; GC_stack stack; assert (STACK_TAG == tag); metaDataBytes = GC_STACK_METADATA_SIZE; stack = (GC_stack)p; current = getStackCurrent(s) == stack; reservedNew = sizeofStackShrinkReserved (s, stack, current); if (reservedNew < stack->reserved) { if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Shrinking stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(stack->reserved), uintmaxToCommaString(reservedNew), uintmaxToCommaString(stack->used)); stack->reserved = reservedNew; } objectBytes = sizeof (struct GC_stack) + stack->used; skip = stack->reserved - stack->used; } size = metaDataBytes + objectBytes; assert (forwardState->back + size + skip <= forwardState->toLimit); /* Copy the object. */ GC_memcpy (p - metaDataBytes, forwardState->back, size); /* If the object has a valid weak pointer, link it into the weaks * for update after the copying GC is done. */ if ((WEAK_TAG == tag) and (numObjptrs == 1)) { GC_weak w; w = (GC_weak)(forwardState->back + GC_NORMAL_METADATA_SIZE + offsetofWeak (s)); if (DEBUG_WEAK) fprintf (stderr, "forwarding weak "FMTPTR" ", (uintptr_t)w); if (isObjptr (w->objptr) and (not forwardState->amInMinorGC or isObjptrInNursery (s, w->objptr))) { if (DEBUG_WEAK) fprintf (stderr, "linking\n"); w->link = s->weaks; s->weaks = w; } else { if (DEBUG_WEAK) fprintf (stderr, "not linking\n"); } } /* Store the forwarding pointer in the old object header. */ *(getFwdPtrp(p)) = pointerToObjptr (forwardState->back + metaDataBytes, forwardState->toStart); assert (hasFwdPtr(p)); /* Update the back of the queue. */ forwardState->back += size + skip; assert (isAligned ((size_t)forwardState->back + GC_NORMAL_METADATA_SIZE, s->alignment)); } *opp = getFwdPtr(p); if (DEBUG_DETAILED) fprintf (stderr, "forwardObjptr --> *opp = "FMTPTR"\n", (uintptr_t)*opp); assert (isObjptrInToSpace (s, *opp, forwardState)); } void forwardObjptrIfInNursery (GC_state s, objptr *opp, GC_forwardState forwardState) { objptr op; pointer p; op = *opp; p = objptrToPointer (op, s->heap.start); if ((p < s->heap.nursery) or (p > s->frontier)) return; if (DEBUG_GENERATIONAL) fprintf (stderr, "forwardObjptrIfInNursery opp = "FMTPTR" op = "FMTOBJPTR" p = "FMTPTR"\n", (uintptr_t)opp, op, (uintptr_t)p); assert (s->heap.nursery <= p and p < s->limitPlusSlop); forwardObjptr (s, opp, forwardState); } void forwardObjptrIfInNurseryFun (GC_state s, objptr *opp, void *env) { forwardObjptrIfInNursery(s, opp, env); } void forwardObjptrIfInHeap (GC_state s, objptr *opp, GC_forwardState forwardState) { objptr op; pointer p; op = *opp; p = objptrToPointer (op, s->heap.start); if ((p < s->heap.start) or (p > s->frontier)) return; if (DEBUG_DETAILED) fprintf (stderr, "forwardObjptrIfInHeap opp = "FMTPTR" op = "FMTOBJPTR" p = "FMTPTR"\n", (uintptr_t)opp, op, (uintptr_t)p); assert (s->heap.start <= p and p < s->limitPlusSlop); forwardObjptr (s, opp, forwardState); } void forwardObjptrIfInHeapFun (GC_state s, objptr *opp, void *env) { forwardObjptrIfInHeap(s, opp, env); } /* Walk through all the cards and forward all intergenerational pointers. */ void forwardInterGenerationalObjptrs (GC_state s, GC_forwardState forwardState) { GC_cardMapElem *cardMap; GC_crossMapElem *crossMap; pointer oldGenStart, oldGenEnd; size_t cardIndex, maxCardIndex; pointer cardStart, cardEnd; pointer objectStart; struct GC_foreachObjptrClosure forwardObjptrIfInNurseryClosure = {.fun = forwardObjptrIfInNurseryFun, .env = forwardState}; if (DEBUG_GENERATIONAL) fprintf (stderr, "Forwarding inter-generational pointers.\n"); updateCrossMap (s); /* Constants. */ cardMap = s->generationalMaps.cardMap; crossMap = s->generationalMaps.crossMap; maxCardIndex = sizeToCardMapIndex (align (s->heap.oldGenSize, CARD_SIZE)); oldGenStart = s->heap.start; oldGenEnd = oldGenStart + s->heap.oldGenSize; /* Loop variables*/ objectStart = alignFrontier (s, s->heap.start); cardIndex = 0; cardStart = oldGenStart; checkAll: assert (cardIndex <= maxCardIndex); assert (isFrontierAligned (s, objectStart)); if (cardIndex == maxCardIndex) goto done; checkCard: if (DEBUG_GENERATIONAL) fprintf (stderr, "checking card %"PRIuMAX" objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)objectStart); assert (objectStart < oldGenStart + cardMapIndexToSize (cardIndex + 1)); if (cardMap[cardIndex]) { pointer lastObject; s->cumulativeStatistics.numCardsMarked++; if (DEBUG_GENERATIONAL) fprintf (stderr, "card %"PRIuMAX" is marked objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)objectStart); assert (isFrontierAligned (s, objectStart)); cardEnd = cardStart + CARD_SIZE; if (oldGenEnd < cardEnd) cardEnd = oldGenEnd; assert (objectStart < cardEnd); lastObject = objectStart; /* If we ever add Weak.set, then there could be intergenerational * weak pointers, in which case we would need to link the weak * objects into s->weaks. But for now, since there is no * Weak.set, the foreachObjptrInRange will do the right thing on * weaks, since the weak pointer will never be into the nursery. */ objectStart = foreachObjptrInRange (s, objectStart, &cardEnd, &forwardObjptrIfInNurseryClosure, FALSE); s->cumulativeStatistics.bytesScannedMinor += (uintmax_t)(objectStart - lastObject); if (objectStart == oldGenEnd) goto done; cardIndex = sizeToCardMapIndex ((size_t)(objectStart - oldGenStart)); cardStart = oldGenStart + cardMapIndexToSize (cardIndex); goto checkCard; } else { unless (CROSS_MAP_EMPTY == crossMap[cardIndex]) objectStart = cardStart + (size_t)(crossMap[cardIndex] * CROSS_MAP_OFFSET_SCALE); if (DEBUG_GENERATIONAL) fprintf (stderr, "card %"PRIuMAX" is not marked" " crossMap[%"PRIuMAX"] == %"PRIuMAX"" " objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintmax_t)cardIndex, (uintmax_t)(crossMap[cardIndex] * CROSS_MAP_OFFSET_SCALE), (uintptr_t)objectStart); cardIndex++; cardStart += CARD_SIZE; goto checkAll; } assert (FALSE); done: if (DEBUG_GENERATIONAL) fprintf (stderr, "Forwarding inter-generational pointers done.\n"); } mlton-20210117+dfsg/runtime/gc/forward.h000066400000000000000000000027361416264345000177270ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef struct GC_forwardState { bool amInMinorGC; pointer back; pointer toStart; pointer toLimit; } *GC_forwardState; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #if ASSERT static inline bool isPointerInToSpace (GC_state s, pointer p, GC_forwardState forwardState); static inline bool isObjptrInToSpace (GC_state s, objptr opp, GC_forwardState forwardState); #endif static inline objptr* getFwdPtrp (pointer p); static inline objptr getFwdPtr (pointer p); static inline bool hasFwdPtr (pointer p); static inline void forwardObjptr (GC_state s, objptr *oppp, GC_forwardState forwardState); static inline void forwardObjptrIfInHeap (GC_state s, objptr *oppp, GC_forwardState forwardState); static inline void forwardObjptrIfInHeapFun (GC_state s, objptr *oppp, void *env); static inline void forwardObjptrIfInNursery (GC_state s, objptr *oppp, GC_forwardState forwardState); static inline void forwardObjptrIfInNurseryFun (GC_state s, objptr *oppp, void *env); static inline void forwardInterGenerationalObjptrs (GC_state s, GC_forwardState forwardState); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/frame.c000066400000000000000000000023251416264345000173420ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ GC_frameIndex getFrameIndexFromReturnAddress (GC_state s, GC_returnAddress ra) { GC_frameIndex res; res = s->returnAddressToFrameIndex (ra); if (DEBUG_DETAILED) fprintf (stderr, FMTFI" = getFrameIndexFromReturnAddress ("FMTRA")\n", res, ra); return res; } GC_frameInfo getFrameInfoFromFrameIndex (GC_state s, GC_frameIndex frameIndex) { GC_frameInfo frameInfo; if (DEBUG_DETAILED) fprintf (stderr, "frameIndex = "FMTFI" frameInfosLength = %"PRIu32"\n", frameIndex, s->frameInfosLength); assert (frameIndex < s->frameInfosLength); frameInfo = &(s->frameInfos[frameIndex]); assert (frameInfo->size > 0); return frameInfo; } GC_frameInfo getFrameInfoFromReturnAddress (GC_state s, GC_returnAddress ra) { GC_frameInfo frameInfo; GC_frameIndex frameIndex; frameIndex = getFrameIndexFromReturnAddress (s, ra); frameInfo = getFrameInfoFromFrameIndex(s, frameIndex); return frameInfo; } mlton-20210117+dfsg/runtime/gc/frame.h000066400000000000000000000044671416264345000173600ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * The "... reserved bytes ..." of a stack object constitute a linear * sequence of frames. For the purposes of garbage collection and * profiling, we must be able to recover information (e.g., the size * and offsets of live heap-pointers) for each frame. This data is * declared as follows: * * GC_frameInfo *frameInfos; * * The frameInfos pointer is initialized to point to a static array of * frame infos that is emitted for each compiled program. The kind * field identifies whether or not the frame is for a C call. (Note: * The ML stack is distinct from the system stack. A C call executes * on the system stack. The frame left on the ML stack is just a * marker.) The offsets field points to an array (the zeroeth element * recording the size of the array) whose elements record byte offsets * from the bottom of the frame at which live heap pointers are * located. The size field indicates the size of the frame, including * space for the return address. The sourceSeqIndex field indicates * the sequence of source names corresponding to the frame as an index * into sourceSeqs; see sources.h. */ typedef const uint16_t *GC_frameOffsets; typedef enum { C_FRAME, ML_FRAME } GC_frameKind; typedef const struct GC_frameInfo { const GC_frameKind kind; const GC_frameOffsets offsets; const uint16_t size; const GC_sourceSeqIndex sourceSeqIndex; } *GC_frameInfo; typedef uint32_t GC_frameIndex; #define PRIFI PRIu32 #define FMTFI "%"PRIFI typedef uintptr_t GC_returnAddress; #define GC_RETURNADDRESS_SIZE sizeof(GC_returnAddress) #define FMTRA "0x%016"PRIxPTR #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_frameIndex getFrameIndexFromReturnAddress (GC_state s, GC_returnAddress ra); static inline GC_frameInfo getFrameInfoFromFrameIndex (GC_state s, GC_frameIndex findex); static inline GC_frameInfo getFrameInfoFromReturnAddress (GC_state s, GC_returnAddress ra); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/garbage-collection.c000066400000000000000000000220141416264345000217660ustar00rootroot00000000000000/* Copyright (C) 2009-2010,2012,2016 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void minorGC (GC_state s) { minorCheneyCopyGC (s); } void majorGC (GC_state s, size_t bytesRequested, bool mayResize) { uintmax_t numGCs; size_t desiredSize; s->lastMajorStatistics.numMinorGCs = 0; numGCs = s->cumulativeStatistics.numCopyingGCs + s->cumulativeStatistics.numMarkCompactGCs; if (0 < numGCs and ((float)(s->cumulativeStatistics.numHashConsGCs) / (float)(numGCs) < s->controls.ratios.hashCons)) s->hashConsDuringGC = TRUE; desiredSize = sizeofHeapDesired (s, s->lastMajorStatistics.bytesLive + bytesRequested, 0); if (not FORCE_MARK_COMPACT and not s->hashConsDuringGC // only markCompact can hash cons and s->heap.withMapsSize < s->sysvals.ram and (not isHeapInit (&s->secondaryHeap) or createHeapSecondary (s, desiredSize))) majorCheneyCopyGC (s); else majorMarkCompactGC (s); s->hashConsDuringGC = FALSE; s->lastMajorStatistics.bytesLive = s->heap.oldGenSize; if (s->lastMajorStatistics.bytesLive > s->cumulativeStatistics.maxBytesLive) s->cumulativeStatistics.maxBytesLive = s->lastMajorStatistics.bytesLive; /* Notice that the s->lastMajorStatistics.bytesLive below is * different than the s->lastMajorStatistics.bytesLive used as an * argument to createHeapSecondary above. Above, it was an * estimate. Here, it is exactly how much was live after the GC. */ if (mayResize) { resizeHeap (s, s->lastMajorStatistics.bytesLive + bytesRequested); } setCardMapAndCrossMap (s); resizeHeapSecondary (s); assert (s->heap.oldGenSize + bytesRequested <= s->heap.size); } void growStackCurrent (GC_state s) { size_t reserved; GC_stack stack; reserved = sizeofStackGrowReserved (s, getStackCurrent(s)); if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Growing stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(getStackCurrent(s)->reserved), uintmaxToCommaString(reserved), uintmaxToCommaString(getStackCurrent(s)->used)); assert (hasHeapBytesFree (s, sizeofStackWithMetaData (s, reserved), 0)); stack = newStack (s, reserved, TRUE); copyStack (s, getStackCurrent(s), stack); getThreadCurrent(s)->stack = pointerToObjptr ((pointer)stack, s->heap.start); markCard (s, objptrToPointer (getThreadCurrentObjptr(s), s->heap.start)); } void enterGC (GC_state s) { if (s->profiling.isOn) { /* We don't need to profileEnter for count profiling because it * has already bumped the counter. If we did allow the bump, then * the count would look like function(s) had run an extra time. */ if (s->profiling.stack and not (PROFILE_COUNT == s->profiling.kind)) GC_profileEnter (s); } s->amInGC = TRUE; } void leaveGC (GC_state s) { if (s->profiling.isOn) { if (s->profiling.stack and not (PROFILE_COUNT == s->profiling.kind)) GC_profileLeave (s); } s->amInGC = FALSE; } void performGC (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested, bool forceMajor, bool mayResize) { uintmax_t gcTime; bool stackTopOk; size_t stackBytesRequested; struct rusage ru_start; size_t totalBytesRequested; enterGC (s); s->cumulativeStatistics.numGCs++; if (DEBUG or s->controls.messages) { size_t nurserySize = s->heap.size - ((size_t)(s->heap.nursery - s->heap.start)); size_t nurseryUsed = (size_t)(s->frontier - s->heap.nursery); fprintf (stderr, "[GC: Starting gc #%s; requesting %s nursery bytes and %s old-gen bytes,]\n", uintmaxToCommaString(s->cumulativeStatistics.numGCs), uintmaxToCommaString(nurseryBytesRequested), uintmaxToCommaString(oldGenBytesRequested)); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\twith old-gen of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(s->heap.oldGenSize), 100.0 * ((double)(s->heap.oldGenSize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(nurserySize), 100.0 * ((double)(nurserySize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery using %s bytes (%.1f%% of heap, %.1f%% of nursery).]\n", uintmaxToCommaString(nurseryUsed), 100.0 * ((double)(nurseryUsed) / (double)(s->heap.size)), 100.0 * ((double)(nurseryUsed) / (double)(nurserySize))); } assert (invariantForGC (s)); if (needGCTime (s)) startTiming (&ru_start); minorGC (s); stackTopOk = invariantForMutatorStack (s); stackBytesRequested = stackTopOk ? 0 : sizeofStackWithMetaData (s, sizeofStackGrowReserved (s, getStackCurrent (s))); totalBytesRequested = oldGenBytesRequested + nurseryBytesRequested + stackBytesRequested; if (forceMajor or totalBytesRequested > s->heap.size - s->heap.oldGenSize) majorGC (s, totalBytesRequested, mayResize); setGCStateCurrentHeap (s, oldGenBytesRequested + stackBytesRequested, nurseryBytesRequested); assert (hasHeapBytesFree (s, oldGenBytesRequested + stackBytesRequested, nurseryBytesRequested)); unless (stackTopOk) growStackCurrent (s); setGCStateCurrentThreadAndStack (s); if (needGCTime (s)) { gcTime = stopTiming (&ru_start, &s->cumulativeStatistics.ru_gc); s->cumulativeStatistics.maxPauseTime = max (s->cumulativeStatistics.maxPauseTime, gcTime); } else gcTime = 0; /* Assign gcTime to quell gcc warning. */ if (DEBUG or s->controls.messages) { size_t nurserySize = s->heap.size - (size_t)(s->heap.nursery - s->heap.start); fprintf (stderr, "[GC: Finished gc #%s; time %s ms,]\n", uintmaxToCommaString(s->cumulativeStatistics.numGCs), uintmaxToCommaString(gcTime)); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\twith old-gen of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(s->heap.oldGenSize), 100.0 * ((double)(s->heap.oldGenSize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery of size %s bytes (%.1f%% of heap).]\n", uintmaxToCommaString(nurserySize), 100.0 * ((double)(nurserySize) / (double)(s->heap.size))); } /* Send a GC signal. */ if (s->signalsInfo.gcSignalHandled and s->signalHandlerThread != BOGUS_OBJPTR) { if (DEBUG_SIGNALS) fprintf (stderr, "GC Signal pending.\n"); s->signalsInfo.gcSignalPending = TRUE; unless (s->signalsInfo.amInSignalHandler) s->signalsInfo.signalIsPending = TRUE; } if (DEBUG) displayGCState (s, stderr); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); assert (invariantForGC (s)); leaveGC (s); } void ensureInvariantForMutator (GC_state s, bool force) { if (force or not (invariantForMutatorFrontier(s)) or not (invariantForMutatorStack(s))) { /* This GC will grow the stack, if necessary. */ performGC (s, 0, getThreadCurrent(s)->bytesNeeded, force, TRUE); } assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); } /* ensureHasHeapBytesFree (s, oldGen, nursery) */ void ensureHasHeapBytesFree (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested) { assert (s->heap.nursery <= s->limitPlusSlop); assert (s->frontier <= s->limitPlusSlop); if (not hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)) performGC (s, oldGenBytesRequested, nurseryBytesRequested, FALSE, TRUE); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); } void GC_collect (GC_state s, size_t bytesRequested, bool force) { enter (s); /* When the mutator requests zero bytes, it may actually need as * much as GC_HEAP_LIMIT_SLOP. */ if (0 == bytesRequested) bytesRequested = GC_HEAP_LIMIT_SLOP; getThreadCurrent(s)->bytesNeeded = bytesRequested; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); ensureInvariantForMutator (s, force); assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); leave (s); } mlton-20210117+dfsg/runtime/gc/garbage-collection.h000066400000000000000000000023771416264345000220050ustar00rootroot00000000000000/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void minorGC (GC_state s); static void majorGC (GC_state s, size_t bytesRequested, bool mayResize); static inline void growStackCurrent (GC_state s); static inline void enterGC (GC_state s); static inline void leaveGC (GC_state s); static void performGC (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested, bool forceMajor, bool mayResize); static inline void ensureInvariantForMutator (GC_state s, bool force); static inline void ensureHasHeapBytesFree (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_collect (GC_state s, size_t bytesRequested, bool force); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/gc_state.c000066400000000000000000000151541416264345000200450ustar00rootroot00000000000000/* Copyright (C) 2009,2012,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void displayGCState (GC_state s, FILE *stream) { fprintf (stream, "GC state\n"); fprintf (stream, "\tcurrentThread = "FMTOBJPTR"\n", s->currentThread); displayThread (s, (GC_thread)(objptrToPointer (s->currentThread, s->heap.start) + offsetofThread (s)), stream); fprintf (stream, "\tgenerational\n"); displayGenerationalMaps (s, &s->generationalMaps, stream); fprintf (stream, "\theap\n"); displayHeap (s, &s->heap, stream); fprintf (stream, "\tlimit = "FMTPTR"\n" "\tstackBottom = "FMTPTR"\n" "\tstackTop = "FMTPTR"\n", (uintptr_t)s->limit, (uintptr_t)s->stackBottom, (uintptr_t)s->stackTop); } size_t sizeofGCStateCurrentStackUsed (GC_state s) { return (size_t)(s->stackTop - s->stackBottom); } void setGCStateCurrentThreadAndStack (GC_state s) { GC_thread thread; GC_stack stack; thread = getThreadCurrent (s); s->exnStack = thread->exnStack; stack = getStackCurrent (s); s->stackBottom = getStackBottom (s, stack); s->stackTop = getStackTop (s, stack); s->stackLimit = getStackLimit (s, stack); markCard (s, (pointer)stack); } void setGCStateCurrentHeap (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested) { GC_heap h; pointer nursery; size_t nurserySize; pointer genNursery; size_t genNurserySize; if (DEBUG_DETAILED) fprintf (stderr, "setGCStateCurrentHeap(%s, %s)\n", uintmaxToCommaString(oldGenBytesRequested), uintmaxToCommaString(nurseryBytesRequested)); h = &s->heap; assert (isFrontierAligned (s, h->start + h->oldGenSize + oldGenBytesRequested)); s->limitPlusSlop = h->start + h->size; s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; nurserySize = h->size - (h->oldGenSize + oldGenBytesRequested); assert (isFrontierAligned (s, s->limitPlusSlop - nurserySize)); nursery = s->limitPlusSlop - nurserySize; genNursery = alignFrontier (s, s->limitPlusSlop - (nurserySize / 2)); genNurserySize = (size_t)(s->limitPlusSlop - genNursery); if (/* The mutator marks cards. */ s->mutatorMarksCards /* There is enough space in the generational nursery. */ and (nurseryBytesRequested <= genNurserySize) /* The nursery is large enough to be worth it. */ and (((float)(h->size - s->lastMajorStatistics.bytesLive) / (float)nurserySize) <= s->controls.ratios.nursery) and /* There is a reason to use generational GC. */ ( /* We must use it for debugging purposes. */ FORCE_GENERATIONAL /* We just did a mark compact, so it will be advantageous to to use it. */ or (s->lastMajorStatistics.kind == GC_MARK_COMPACT) /* The live ratio is low enough to make it worthwhile. */ or ((float)h->size / (float)s->lastMajorStatistics.bytesLive <= (h->withMapsSize < s->sysvals.ram ? s->controls.ratios.copyGenerational : s->controls.ratios.markCompactGenerational)) )) { s->canMinor = TRUE; nursery = genNursery; nurserySize = genNurserySize; clearCardMap (s); } else { unless (nurseryBytesRequested <= nurserySize) die ("Out of memory. Insufficient space in nursery."); s->canMinor = FALSE; } assert (nurseryBytesRequested <= nurserySize); s->heap.nursery = nursery; s->frontier = nursery; assert (nurseryBytesRequested <= (size_t)(s->limitPlusSlop - s->frontier)); assert (isFrontierAligned (s, s->heap.nursery)); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); } bool GC_getAmOriginal (GC_state s) { return s->amOriginal; } void GC_setAmOriginal (GC_state s, bool b) { s->amOriginal = b; } void GC_setControlsMessages (GC_state s, bool b) { s->controls.messages = b; } void GC_setControlsSummary (GC_state s, bool b) { s->controls.summary = b; } void GC_setControlsRusageMeasureGC (GC_state s, bool b) { s->controls.rusageMeasureGC = b; } uintmax_t GC_getCumulativeStatisticsBytesAllocated (GC_state s) { return s->cumulativeStatistics.bytesAllocated; } uintmax_t GC_getCumulativeStatisticsNumCopyingGCs (GC_state s) { return s->cumulativeStatistics.numCopyingGCs; } uintmax_t GC_getCumulativeStatisticsNumMarkCompactGCs (GC_state s) { return s->cumulativeStatistics.numMarkCompactGCs; } uintmax_t GC_getCumulativeStatisticsNumMinorGCs (GC_state s) { return s->cumulativeStatistics.numMinorGCs; } size_t GC_getCumulativeStatisticsMaxBytesLive (GC_state s) { return s->cumulativeStatistics.maxBytesLive; } void GC_setHashConsDuringGC (GC_state s, bool b) { s->hashConsDuringGC = b; } size_t GC_getLastMajorStatisticsBytesLive (GC_state s) { return s->lastMajorStatistics.bytesLive; } pointer GC_getCallFromCHandlerThread (GC_state s) { pointer p = objptrToPointer (s->callFromCHandlerThread, s->heap.start); return p; } void GC_setCallFromCHandlerThread (GC_state s, pointer p) { objptr op = pointerToObjptr (p, s->heap.start); s->callFromCHandlerThread = op; } pointer GC_getCallFromCOpArgsResPtr (GC_state s) { return s->callFromCOpArgsResPtr; } pointer GC_getCurrentThread (GC_state s) { pointer p = objptrToPointer (s->currentThread, s->heap.start); return p; } pointer GC_getSavedThread (GC_state s) { pointer p; assert(s->savedThread != BOGUS_OBJPTR); p = objptrToPointer (s->savedThread, s->heap.start); s->savedThread = BOGUS_OBJPTR; return p; } void GC_setSavedThread (GC_state s, pointer p) { objptr op; assert(s->savedThread == BOGUS_OBJPTR); op = pointerToObjptr (p, s->heap.start); s->savedThread = op; } void GC_setSignalHandlerThread (GC_state s, pointer p) { objptr op = pointerToObjptr (p, s->heap.start); s->signalHandlerThread = op; } struct rusage* GC_getRusageGCAddr (GC_state s) { return &(s->cumulativeStatistics.ru_gc); } sigset_t* GC_getSignalsHandledAddr (GC_state s) { return &(s->signalsInfo.signalsHandled); } sigset_t* GC_getSignalsPendingAddr (GC_state s) { return &(s->signalsInfo.signalsPending); } void GC_setGCSignalHandled (GC_state s, bool b) { s->signalsInfo.gcSignalHandled = b; } bool GC_getGCSignalPending (GC_state s) { return (s->signalsInfo.gcSignalPending); } void GC_setGCSignalPending (GC_state s, bool b) { s->signalsInfo.gcSignalPending = b; } mlton-20210117+dfsg/runtime/gc/gc_state.h000066400000000000000000000116251416264345000200510ustar00rootroot00000000000000/* Copyright (C) 2012,2014,2019-2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_state { /* These fields are at the front because they are the most commonly * referenced, and having them at smaller offsets may decrease code * size and improve cache performance. */ pointer frontier; /* heap.start <= frontier < limit */ pointer limit; /* limit = heap.start + heap.size */ pointer stackTop; /* Top of stack in current thread. */ pointer stackLimit; /* stackBottom + stackSize - maxFrameSize */ ptrdiff_t exnStack; /* Alphabetized fields follow. */ size_t alignment; /* */ bool amInGC; bool amOriginal; char **atMLtons; /* Initial @MLton args, processed before command line. */ int atMLtonsLength; uint32_t atomicState; objptr callFromCHandlerThread; /* Handler for exported C calls (in heap). */ pointer callFromCOpArgsResPtr; /* Pass op, args, and res from exported C call */ bool canMinor; /* TRUE iff there is space for a minor gc. */ struct GC_controls controls; struct GC_cumulativeStatistics cumulativeStatistics; objptr currentThread; /* Currently executing thread (in heap). */ GC_frameInfo frameInfos; /* Array of frame infos. */ uint32_t frameInfosLength; /* Cardinality of frameInfos array. */ struct GC_generationalMaps generationalMaps; objptr *globals; uint32_t globalsLength; bool hashConsDuringGC; struct GC_heap heap; struct GC_lastMajorStatistics lastMajorStatistics; pointer limitPlusSlop; /* limit + GC_HEAP_LIMIT_SLOP */ int (*loadGlobals)(FILE *f); /* loads the globals from the file. */ uint32_t magic; /* The magic number for this executable. */ uint32_t maxFrameSize; bool mutatorMarksCards; GC_objectHashTable objectHashTable; GC_objectType objectTypes; /* Array of object types. */ uint32_t objectTypesLength; /* Cardinality of objectTypes array. */ struct GC_profiling profiling; GC_frameIndex (*returnAddressToFrameIndex) (GC_returnAddress ra); objptr savedThread; /* Result of GC_copyCurrentThread. * Thread interrupted by arrival of signal. */ int (*saveGlobals)(FILE *f); /* saves the globals to the file. */ bool saveWorldStatus; /* */ struct GC_heap secondaryHeap; /* Used for major copying collection. */ objptr signalHandlerThread; /* Handler for signals (in heap). */ struct GC_signalsInfo signalsInfo; struct GC_sourceMaps sourceMaps; pointer stackBottom; /* Bottom of stack in current thread. */ struct GC_staticHeaps staticHeaps; struct GC_sysvals sysvals; GC_weak weaks; /* Linked list of (live) weak pointers */ }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayGCState (GC_state s, FILE *stream); static inline size_t sizeofGCStateCurrentStackUsed (GC_state s); static inline void setGCStateCurrentThreadAndStack (GC_state s); static void setGCStateCurrentHeap (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE bool GC_getAmOriginal (GC_state s); PRIVATE void GC_setAmOriginal (GC_state s, bool b); PRIVATE void GC_setControlsMessages (GC_state s, bool b); PRIVATE void GC_setControlsSummary (GC_state s, bool b); PRIVATE void GC_setControlsRusageMeasureGC (GC_state s, bool b); PRIVATE uintmax_t GC_getCumulativeStatisticsBytesAllocated (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumCopyingGCs (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumMarkCompactGCs (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumMinorGCs (GC_state s); PRIVATE size_t GC_getCumulativeStatisticsMaxBytesLive (GC_state s); PRIVATE void GC_setHashConsDuringGC (GC_state s, bool b); PRIVATE size_t GC_getLastMajorStatisticsBytesLive (GC_state s); PRIVATE pointer GC_getCallFromCHandlerThread (GC_state s); PRIVATE void GC_setCallFromCHandlerThread (GC_state s, pointer p); PRIVATE pointer GC_getCallFromCOpArgsResPtr (GC_state s); PRIVATE pointer GC_getCurrentThread (GC_state s); PRIVATE pointer GC_getSavedThread (GC_state s); PRIVATE void GC_setSavedThread (GC_state s, pointer p); PRIVATE void GC_setSignalHandlerThread (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE struct rusage* GC_getRusageGCAddr (GC_state s); PRIVATE sigset_t* GC_getSignalsHandledAddr (GC_state s); PRIVATE sigset_t* GC_getSignalsPendingAddr (GC_state s); PRIVATE void GC_setGCSignalHandled (GC_state s, bool b); PRIVATE bool GC_getGCSignalPending (GC_state s); PRIVATE void GC_setGCSignalPending (GC_state s, bool b); PRIVATE GC_state MLton_gcState (); mlton-20210117+dfsg/runtime/gc/generational.c000066400000000000000000000322601416264345000207210ustar00rootroot00000000000000/* Copyright (C) 2009,2012 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void displayGenerationalMaps (__attribute__ ((unused)) GC_state s, struct GC_generationalMaps *generational, FILE *stream) { fprintf(stream, "\t\tcardMap = "FMTPTR"\n" "\t\tcardMapAbsolute = "FMTPTR"\n" "\t\tcardMapLength = %"PRIuMAX"\n" "\t\tcrossMap = "FMTPTR"\n" "\t\tcrossMapLength = %"PRIuMAX"\n" "\t\tcrossMapValidSize = %"PRIuMAX"\n", (uintptr_t)generational->cardMap, (uintptr_t)generational->cardMapAbsolute, (uintmax_t)generational->cardMapLength, (uintptr_t)generational->crossMap, (uintmax_t)generational->crossMapLength, (uintmax_t)generational->crossMapValidSize); if (DEBUG_GENERATIONAL and DEBUG_DETAILED) { GC_crossMapIndex i; fprintf (stderr, "crossMap trues\n"); for (i = 0; i < generational->crossMapLength; i++) unless (CROSS_MAP_EMPTY == generational->crossMap[i]) fprintf (stderr, "\t%"PRIuMAX" "FMTCME" %"PRIuMAX"\n", (uintmax_t)i, generational->crossMap[i], (uintmax_t)(CROSS_MAP_OFFSET_SCALE * generational->crossMap[i])); fprintf (stderr, "\n"); } } GC_cardMapIndex sizeToCardMapIndex (size_t z) { return (GC_cardMapIndex)z >> CARD_SIZE_LOG2; } size_t cardMapIndexToSize (GC_cardMapIndex i) { return (size_t)i << CARD_SIZE_LOG2; } GC_cardMapIndex pointerToCardMapIndexAbsolute (pointer p) { return (GC_cardMapIndex)p >> CARD_SIZE_LOG2; } GC_cardMapElem *pointerToCardMapAddr (GC_state s, pointer p) { GC_cardMapElem *res; res = &s->generationalMaps.cardMapAbsolute[pointerToCardMapIndexAbsolute (p)]; if (DEBUG_CARD_MARKING) fprintf (stderr, "pointerToCardMapAddr ("FMTPTR") = "FMTPTR"\n", (uintptr_t)p, (uintptr_t)res); return res; } GC_crossMapIndex sizeToCrossMapIndex (size_t z) { return (GC_crossMapIndex)z >> CARD_SIZE_LOG2; } #if ASSERT bool isCardMarked (GC_state s, pointer p) { return (*pointerToCardMapAddr (s, p) != 0x0); } #endif void markCard (GC_state s, pointer p) { if (DEBUG_CARD_MARKING) fprintf (stderr, "markCard ("FMTPTR")\n", (uintptr_t)p); if (s->mutatorMarksCards) *(pointerToCardMapAddr (s, p)) = 0x1; } void markIntergenerationalPointer (GC_state s, pointer *pp) { if (s->mutatorMarksCards and isPointerInOldGen (s, (pointer)pp) and isPointerInNursery (s, *pp)) markCard (s, (pointer)pp); } void markIntergenerationalObjptr (GC_state s, objptr *opp) { if (s->mutatorMarksCards and isPointerInOldGen (s, (pointer)opp) and isObjptrInNursery (s, *opp)) markCard (s, (pointer)opp); } void setCardMapAbsolute (GC_state s) { unless (s->mutatorMarksCards) return; /* It's OK if the subtraction below underflows because all the * subsequent additions to mark the cards will overflow and put us * in the right place. */ s->generationalMaps.cardMapAbsolute = s->generationalMaps.cardMap - pointerToCardMapIndexAbsolute (s->heap.start); if (DEBUG_CARD_MARKING) fprintf (stderr, "setCardMapAbsolute = "FMTPTR"\n", (uintptr_t)s->generationalMaps.cardMapAbsolute); } #if ASSERT pointer getCrossMapCardStart (GC_state s, pointer p) { /* The p - 1 is so that a pointer to the beginning of a card falls * into the index for the previous crossMap entry. */ return (p == s->heap.start) ? s->heap.start : (p - 1) - ((uintptr_t)(p - 1) % CARD_SIZE); } #endif size_t sizeofCardMap (GC_state s, size_t heapSize) { unless (s->mutatorMarksCards) { return 0; } assert (isAligned (heapSize, CARD_SIZE)); GC_cardMapIndex cardMapLength; size_t cardMapSize; cardMapLength = sizeToCardMapIndex (heapSize); cardMapSize = align (cardMapLength * CARD_MAP_ELEM_SIZE, s->sysvals.pageSize); return cardMapSize; } GC_cardMapIndex lenofCardMap (ARG_USED_FOR_ASSERT GC_state s, size_t cardMapSize) { GC_cardMapIndex cardMapLength; assert (isAligned (cardMapSize, s->sysvals.pageSize)); assert (isAligned (cardMapSize, CARD_MAP_ELEM_SIZE)); cardMapLength = (GC_cardMapIndex)(cardMapSize / CARD_MAP_ELEM_SIZE); return cardMapLength; } size_t sizeofCrossMap (GC_state s, size_t heapSize) { unless (s->mutatorMarksCards) { return 0; } assert (isAligned (heapSize, CARD_SIZE)); GC_crossMapIndex crossMapLength; size_t crossMapSize; crossMapLength = sizeToCrossMapIndex (heapSize); crossMapSize = align (crossMapLength * CROSS_MAP_ELEM_SIZE, s->sysvals.pageSize); return crossMapSize; } GC_crossMapIndex lenofCrossMap (ARG_USED_FOR_ASSERT GC_state s, size_t crossMapSize) { GC_crossMapIndex crossMapLength; assert (isAligned (crossMapSize, s->sysvals.pageSize)); assert (isAligned (crossMapSize, CROSS_MAP_ELEM_SIZE)); crossMapLength = (GC_crossMapIndex)(crossMapSize / CROSS_MAP_ELEM_SIZE); return crossMapLength; } void clearCardMap (GC_state s) { if (DEBUG_GENERATIONAL and DEBUG_DETAILED) fprintf (stderr, "clearCardMap ()\n"); memset (s->generationalMaps.cardMap, 0, s->generationalMaps.cardMapLength * CARD_MAP_ELEM_SIZE); } void clearCrossMap (GC_state s) { if (DEBUG_GENERATIONAL and DEBUG_DETAILED) fprintf (stderr, "clearCrossMap ()\n"); s->generationalMaps.crossMapValidSize = 0; memset (s->generationalMaps.crossMap, CROSS_MAP_EMPTY, s->generationalMaps.crossMapLength * CROSS_MAP_ELEM_SIZE); } void clearCardMapAndCrossMap (GC_state s) { clearCardMap (s); clearCrossMap (s); } size_t sizeofCardMapAndCrossMap (GC_state s, size_t heapSize) { size_t totalMapSize; totalMapSize = sizeofCardMap (s, heapSize) + sizeofCrossMap (s, heapSize); assert (isAligned (totalMapSize, s->sysvals.pageSize)); return totalMapSize; } /* * heapSize = invertSizeofCardMapAndCrossMap (s, heapWithMapsSize); * implies * heapSize + sizeofCardMapAndCrossMap (s, heapSize) * <= heapWithMapsSize * < (heapSize + s->sysvals.pageSize) * + sizeofCardMapAndCrossMap (s, heapSize + s->sysvals.pageSize) */ size_t invertSizeofCardMapAndCrossMap (GC_state s, size_t heapWithMapsSize) { unless (s->mutatorMarksCards) { return heapWithMapsSize; } assert (isAligned (heapWithMapsSize, s->sysvals.pageSize)); size_t minHeapSize; if (heapWithMapsSize <= 3 * s->sysvals.pageSize) { minHeapSize = 0; } else { double minHeapSizeD; minHeapSizeD = (((double)(CARD_SIZE) / (double)(CARD_SIZE + CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE)) * (double)(heapWithMapsSize - 3 * s->sysvals.pageSize)) - (((double)(CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE) / (double)(CARD_SIZE + CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE)) * (double)(s->sysvals.pageSize)); minHeapSize = alignDown ((size_t)minHeapSizeD, s->sysvals.pageSize); } size_t heapSize = minHeapSize; size_t nextHeapSize = heapSize + s->sysvals.pageSize; /* The termination condition is: * heapWithMapsSize >= nextHeapSize + sizeofCardMapAndCrossMap (s, nextHeapSize) * However, nextHeapSize + sizeofCardMapAndCrossMap (s, nextHeapSize) may overflow. */ while (heapWithMapsSize >= sizeofCardMapAndCrossMap (s, nextHeapSize) and heapWithMapsSize - sizeofCardMapAndCrossMap (s, nextHeapSize) >= nextHeapSize) { heapSize = nextHeapSize; nextHeapSize += s->sysvals.pageSize; } assert (isAligned (heapSize, s->sysvals.pageSize)); assert (heapSize + sizeofCardMapAndCrossMap (s, heapSize) <= heapWithMapsSize); assert (nextHeapSize == heapSize + s->sysvals.pageSize); assert (heapWithMapsSize < sizeofCardMapAndCrossMap (s, nextHeapSize) or heapWithMapsSize - sizeofCardMapAndCrossMap (s, nextHeapSize) < nextHeapSize); if (DEBUG_DETAILED) fprintf (stderr, "invertSizeofCardMapAndCrossMap(%s) = %s\n", uintmaxToCommaString(heapWithMapsSize), uintmaxToCommaString(heapSize)); return heapSize; } void setCardMapAndCrossMap (GC_state s) { unless (s->mutatorMarksCards) { s->generationalMaps.cardMapLength = 0; s->generationalMaps.cardMap = NULL; s->generationalMaps.cardMapAbsolute = NULL; s->generationalMaps.crossMapLength = 0; s->generationalMaps.crossMap = NULL; return; } GC_cardMapIndex cardMapLength; size_t cardMapSize; GC_crossMapIndex crossMapLength; size_t crossMapSize; cardMapSize = sizeofCardMap (s, s->heap.size); cardMapLength = lenofCardMap (s, cardMapSize); s->generationalMaps.cardMapLength = cardMapLength; crossMapSize = sizeofCrossMap (s, s->heap.size); crossMapLength = lenofCrossMap (s, crossMapSize); s->generationalMaps.crossMapLength = crossMapLength; /* The card map starts at the end of the heap. */ assert (s->heap.withMapsSize == s->heap.size + cardMapSize + crossMapSize); s->generationalMaps.cardMap = (GC_cardMap) (s->heap.start + s->heap.size); s->generationalMaps.crossMap = (GC_crossMap) (s->heap.start + s->heap.size + cardMapSize); setCardMapAbsolute (s); clearCardMapAndCrossMap (s); } #if ASSERT /* isCrossMapOk is a slower, but easier to understand, way of * computing the crossMap. updateCrossMap (below) incrementally * updates the crossMap, checking only the part of the old generation * that it hasn't seen before. isCrossMapOk simply walks through the * entire old generation. It is useful to check that the incremental * update is working correctly. */ bool isCrossMapOk (GC_state s) { static GC_crossMapElem *map; size_t mapSize; pointer front, back; GC_cardMapIndex cardIndex; pointer cardStart; if (DEBUG) fprintf (stderr, "isCrossMapOk ()\n"); mapSize = s->generationalMaps.crossMapLength * CROSS_MAP_ELEM_SIZE; map = GC_mmapAnon_safe (NULL, mapSize); memset (map, CROSS_MAP_EMPTY, mapSize); back = s->heap.start + s->heap.oldGenSize; front = alignFrontier (s, s->heap.start); loopObjects: assert (front <= back); cardStart = getCrossMapCardStart (s, front); cardIndex = sizeToCardMapIndex ((size_t)(cardStart - s->heap.start)); map[cardIndex] = (GC_crossMapElem)((front - cardStart) / CROSS_MAP_OFFSET_SCALE); if (front < back) { front += sizeofObject (s, advanceToObjectData (s, front)); goto loopObjects; } for (size_t i = 0; i < cardIndex; ++i) assert (map[i] == s->generationalMaps.crossMap[i]); GC_release (map, mapSize); return TRUE; } #endif void updateCrossMap (GC_state s) { GC_cardMapIndex cardIndex; pointer cardStart, cardEnd; pointer nextObject, objectStart; pointer oldGenEnd; if (DEBUG_GENERATIONAL) { fprintf (stderr, "updateCrossMap starting\n"); displayGenerationalMaps (s, &s->generationalMaps, stderr); } assert (isAligned (s->alignment, CROSS_MAP_OFFSET_SCALE)); if (s->generationalMaps.crossMapValidSize == s->heap.oldGenSize) goto done; oldGenEnd = s->heap.start + s->heap.oldGenSize; objectStart = s->heap.start + s->generationalMaps.crossMapValidSize; if (objectStart == s->heap.start) { cardIndex = 0; objectStart = alignFrontier (s, objectStart); } else cardIndex = sizeToCardMapIndex ((size_t)(objectStart - s->heap.start) - 1); cardStart = s->heap.start + cardMapIndexToSize (cardIndex); cardEnd = cardStart + CARD_SIZE; loopObjects: assert (objectStart < oldGenEnd); assert ((objectStart == s->heap.start or cardStart < objectStart) and objectStart <= cardEnd); nextObject = objectStart + sizeofObject (s, advanceToObjectData (s, objectStart)); if (DEBUG_GENERATIONAL) { fprintf (stderr, "\tloopObjects:\n" "\t cardIndex = %"PRIuMAX"\n" "\t cardStart = "FMTPTR"\n" "\t cardEnd = "FMTPTR"\n" "\tobjectStart = "FMTPTR"\n" "\t nextObject = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)cardStart, (uintptr_t)cardEnd, (uintptr_t)objectStart, (uintptr_t)nextObject); } if (nextObject > cardEnd) { /* We're about to move to a new card, so we are looking at the * last object boundary in the current card. * Store it in the crossMap. */ size_t offset; offset = (size_t)(objectStart - cardStart) / CROSS_MAP_OFFSET_SCALE; assert (offset < CROSS_MAP_EMPTY); if (DEBUG_GENERATIONAL) fprintf (stderr, "crossMap[%"PRIuMAX"] = %"PRIuMAX"\n", (uintmax_t)cardIndex, (uintmax_t)offset); s->generationalMaps.crossMap[cardIndex] = (GC_crossMapElem)offset; cardIndex = sizeToCardMapIndex ((size_t)(nextObject - s->heap.start) - 1); cardStart = s->heap.start + cardMapIndexToSize (cardIndex); cardEnd = cardStart + CARD_SIZE; } objectStart = nextObject; if (objectStart < oldGenEnd) goto loopObjects; assert (objectStart == oldGenEnd); s->generationalMaps.crossMap[cardIndex] = (GC_crossMapElem)(oldGenEnd - cardStart) / CROSS_MAP_OFFSET_SCALE; s->generationalMaps.crossMapValidSize = s->heap.oldGenSize; done: assert (s->generationalMaps.crossMapValidSize == s->heap.oldGenSize); assert (isCrossMapOk (s)); if (DEBUG_GENERATIONAL) { fprintf (stderr, "updateCrossMap finished\n"); displayGenerationalMaps (s, &s->generationalMaps, stderr); } } mlton-20210117+dfsg/runtime/gc/generational.h000066400000000000000000000071701416264345000207300ustar00rootroot00000000000000/* Copyright (C) 2009,2012 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* must agree w/ cardSizeLog2 in ssa-to-rssa.fun */ #define CARD_SIZE_LOG2 8 #define CARD_SIZE TWOPOWER(CARD_SIZE_LOG2) typedef uint8_t GC_cardMapElem; typedef uint8_t GC_crossMapElem; typedef GC_cardMapElem *GC_cardMap; typedef GC_crossMapElem *GC_crossMap; typedef size_t GC_cardMapIndex; typedef size_t GC_crossMapIndex; #define CARD_MAP_ELEM_SIZE sizeof(GC_cardMapElem) #define CROSS_MAP_ELEM_SIZE sizeof(GC_crossMapElem) #define CROSS_MAP_EMPTY ((GC_crossMapElem)255) #define CROSS_MAP_OFFSET_SCALE 4 #define FMTCME "%"PRIu8 struct GC_generationalMaps { /* cardMap is an array with cardinality equal to the size of the * heap divided by card size. Each element in the array is * interpreted as a boolean; true indicates that some mutable field * of some object in the corresponding card in the heap has been * written since the last minor GC; hence, the corresponding card * must be traced at the next minor GC. */ GC_cardMap cardMap; GC_cardMap cardMapAbsolute; GC_cardMapIndex cardMapLength; /* crossMap is an array with cardinality equal to the size of the * heap divided by card size. Each element in the array is * interpreted as a byte offset (scaled by CARD_MAP_OFFSET_SCALE); * the offset indicates the start of the last object in the * corresponding card from the start of the card. */ GC_crossMap crossMap; GC_crossMapIndex crossMapLength; /* crossMapValidSize the size of the prefix of the old generation * for which the crossMap is valid. */ size_t crossMapValidSize; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayGenerationalMaps (GC_state s, struct GC_generationalMaps *generational, FILE *stream); static inline GC_cardMapIndex sizeToCardMapIndex (size_t z); static inline size_t cardMapIndexToSize (GC_cardMapIndex i); static inline GC_cardMapIndex pointerToCardMapIndexAbsolute (pointer p); static inline GC_cardMapElem *pointerToCardMapAddr (GC_state s, pointer p); static inline GC_crossMapIndex sizeToCrossMapIndex (size_t z); #if ASSERT static inline bool isCardMarked (GC_state s, pointer p); #endif static inline void markCard (GC_state s, pointer p); static inline void markIntergenerationalPointer (GC_state s, pointer *pp); static inline void markIntergenerationalObjptr (GC_state s, objptr *opp); static inline void setCardMapAbsolute (GC_state s); #if ASSERT static inline pointer getCrossMapCardStart (GC_state s, pointer p); #endif static inline size_t sizeofCardMap (GC_state s, size_t heapSize); static inline GC_cardMapIndex lenofCardMap (GC_state s, size_t cardMapSize); static inline size_t sizeofCrossMap (GC_state s, size_t heapSize); static inline GC_crossMapIndex lenofCrossMap (GC_state s, size_t crossMapSize); static size_t sizeofCardMapAndCrossMap (GC_state s, size_t heapSize); static size_t invertSizeofCardMapAndCrossMap (GC_state s, size_t heapWithMapsSize); static inline void clearCardMap (GC_state s); static inline void clearCrossMap (GC_state s); static inline void clearCardMapAndCrossMap (GC_state s); static void setCardMapAndCrossMap (GC_state s); #if ASSERT static bool isCrossMapOk (GC_state s); #endif static void updateCrossMap (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/handler.c000066400000000000000000000051471416264345000176720ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* GC_startSignalHandler does not do an enter()/leave(), even though * it is exported. The basis library uses it via _import, not _prim, * and so does not treat it as a runtime call -- so the invariant in * enter would fail miserably. It is OK because GC_startHandler must * be called from within a critical section. * * Don't make it inline, because it is also called in basis/Thread.c, * and when compiling with COMPILE_FAST, they may appear out of order. */ void GC_startSignalHandler (GC_state s) { /* Switch to the signal handler thread. */ if (DEBUG_SIGNALS) { fprintf (stderr, "GC_startSignalHandler\n"); } assert (s->atomicState == 1); assert (s->signalsInfo.signalIsPending); s->signalsInfo.signalIsPending = FALSE; s->signalsInfo.amInSignalHandler = TRUE; assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = s->currentThread; /* Set s->atomicState to 2 when switching to the signal handler * thread; leaving the runtime will decrement s->atomicState to 1, * the signal handler will then run atomically and will finish by * switching to the thread to continue with, which will decrement * s->atomicState to 0. */ s->atomicState = 2; } void GC_finishSignalHandler (GC_state s) { if (DEBUG_SIGNALS) fprintf (stderr, "GC_finishSignalHandler ()\n"); assert (s->atomicState == 1); s->signalsInfo.amInSignalHandler = FALSE; } void switchToSignalHandlerThreadIfNonAtomicAndSignalPending (GC_state s) { if (s->atomicState == 1 and s->signalsInfo.signalIsPending) { GC_startSignalHandler (s); switchToThread (s, s->signalHandlerThread); } } /* GC_handler sets s->limit = 0 so that the next limit check will * fail. Signals need to be blocked during the handler (i.e. it * should run atomically) because sigaddset does both a read and a * write of s->signalsInfo.signalsPending. The signals are blocked * by Posix_Signal_handle (see Posix/Signal/Signal.c). */ void GC_handler (int signum) { GC_state s = MLton_gcState (); if (DEBUG_SIGNALS) fprintf (stderr, "GC_handler signum = %d\n", signum); assert (sigismember (&s->signalsInfo.signalsHandled, signum)); if (s->atomicState == 0) s->limit = 0; s->signalsInfo.signalIsPending = TRUE; sigaddset (&s->signalsInfo.signalsPending, signum); if (DEBUG_SIGNALS) fprintf (stderr, "GC_handler done\n"); } mlton-20210117+dfsg/runtime/gc/handler.h000066400000000000000000000012721416264345000176720ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void switchToSignalHandlerThreadIfNonAtomicAndSignalPending (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_startSignalHandler (GC_state s); PRIVATE void GC_finishSignalHandler (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE void GC_handler (int signum); mlton-20210117+dfsg/runtime/gc/hash-cons.c000066400000000000000000000235101416264345000201320ustar00rootroot00000000000000/* Copyright (C) 2012,2016 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Object hash consing */ /* ---------------------------------------------------------------- */ /* Hashing based on Introduction to Algorithms by Cormen, Leiserson, and Rivest. * Section numbers in parens. * k is key to be hashed. * table is of size 2^p (it must be a power of two) * Open addressing (12.4), meaning that we stick the entries directly in the * table and probe until we find what we want. * Multiplication method (12.3.2), meaning that we compute the hash by * multiplying by a magic number, chosen by Knuth, and take the high-order p * bits of the low order 32 bits. * Double hashing (12.4), meaning that we use two hash functions, the first to * decide where to start looking and a second to decide at what offset to * probe. The second hash must be relatively prime to the table size, which * we ensure by making it odd and keeping the table size as a power of 2. */ GC_objectHashTable allocHashTable (GC_state s) { uint32_t elementsLengthMax; pointer regionStart; pointer regionEnd; GC_objectHashTable t; t = (GC_objectHashTable)(malloc_safe (sizeof(*t))); // Try to use space in the heap for the elements. if (not (isHeapInit (&s->secondaryHeap))) { if (DEBUG_SHARE) fprintf (stderr, "using secondaryHeap\n"); regionStart = s->secondaryHeap.start; regionEnd = s->secondaryHeap.start + s->secondaryHeap.size; } else if (s->amInGC or not s->canMinor) { if (DEBUG_SHARE) fprintf (stderr, "using end of heap\n"); regionStart = s->frontier; regionEnd = s->limitPlusSlop; } else { if (DEBUG_SHARE) fprintf (stderr, "using minor space\n"); assert (s->canMinor); regionStart = s->heap.start + s->heap.oldGenSize; regionEnd = s->heap.nursery; } elementsLengthMax = (uint32_t)((size_t)(regionEnd - regionStart) / sizeof (*(t->elements))); if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax = %"PRIu32"\n", elementsLengthMax); t->elementsLengthMax = 64; // some small power of two t->elementsLengthMaxLog2 = 6; // and its log base 2 if (elementsLengthMax < t->elementsLengthMax) { if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax too small -- using calloc\n"); t->elementsIsInHeap = FALSE; t->elements = (struct GC_objectHashElement *) (calloc_safe(t->elementsLengthMax, sizeof(*(t->elements)))); } else { if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax big enough -- using heap\n"); t->elementsIsInHeap = TRUE; t->elements = (struct GC_objectHashElement*)regionStart; // Find the largest power of two that fits. for ( ; t->elementsLengthMax <= elementsLengthMax; t->elementsLengthMax <<= 1, t->elementsLengthMaxLog2++) ; // nothing t->elementsLengthMax >>= 1; t->elementsLengthMaxLog2--; assert (t->elementsLengthMax <= elementsLengthMax); for (unsigned int i = 0; i < t->elementsLengthMax; ++i) t->elements[i].object = NULL; } t->elementsLengthCur = 0; t->mayInsert = TRUE; if (DEBUG_SHARE) { fprintf (stderr, "elementsIsInHeap = %s\n", boolToString (t->elementsIsInHeap)); fprintf (stderr, "elementsLengthMax = %"PRIu32"\n", t->elementsLengthMax); fprintf (stderr, FMTPTR" = allocHashTable ()\n", (uintptr_t)t); } return t; } void freeHashTable (GC_objectHashTable t) { unless (t->elementsIsInHeap) free (t->elements); free (t); } pointer insertHashTableElem (GC_state s, GC_objectHashTable t, GC_hash hash, pointer object, pointer max, bool mightBeThere) { static bool init = FALSE; static uint64_t mult; // magic multiplier for hashing static uint32_t maxNumProbes = 0; GC_objectHashElement e; uint32_t numProbes; uint32_t probe; uint32_t slot; // slot in the hash table we are considering unsigned int *p1; unsigned int *p2; if (DEBUG_SHARE) fprintf (stderr, "insertHashTableElem ("FMTHASH", "FMTPTR", "FMTPTR", %s)\n", hash, (uintptr_t)object, (uintptr_t)max, boolToString (mightBeThere)); if (! init) { init = TRUE; double dmult = floor (((sqrt (5.0) - 1.0) / 2.0) * (double)0x100000000llu); mult = (uint64_t)dmult; } slot = (uint32_t)(mult * (uint64_t)hash) >> (32 - t->elementsLengthMaxLog2); probe = (1 == slot % 2) ? slot : slot - 1; if (DEBUG_SHARE) fprintf (stderr, "probe = 0x%"PRIx32"\n", probe); assert (1 == probe % 2); numProbes = 0; look: if (DEBUG_SHARE) fprintf (stderr, "slot = 0x%"PRIx32"\n", slot); assert (slot < t->elementsLengthMax); numProbes++; e = &t->elements[slot]; if (NULL == e->object) { /* It's not in the table. Add it. */ unless (t->mayInsert) { if (DEBUG_SHARE) fprintf (stderr, "not inserting\n"); return object; } e->hash = hash; e->object = object; t->elementsLengthCur++; if (numProbes > maxNumProbes) { maxNumProbes = numProbes; if (DEBUG_SHARE) fprintf (stderr, "numProbes = %"PRIu32"\n", numProbes); } return object; } unless (hash == e->hash) { lookNext: slot = (slot + probe) % t->elementsLengthMax; goto look; } unless (mightBeThere) goto lookNext; if (DEBUG_SHARE) fprintf (stderr, "comparing "FMTPTR" to "FMTPTR"\n", (uintptr_t)object, (uintptr_t)e->object); /* Compare object to e->object. */ unless (object == e->object) { GC_header header; GC_objectTypeTag tag; header = getHeader (object); unless (header == getHeader (e->object)) goto lookNext; for (p1 = (unsigned int*)object, p2 = (unsigned int*)e->object; p1 < (unsigned int*)max; ++p1, ++p2) unless (*p1 == *p2) goto lookNext; splitHeader (s, header, &tag, NULL, NULL, NULL); if (SEQUENCE_TAG == tag and (getSequenceLength (object) != getSequenceLength (e->object))) goto lookNext; } /* object is equal to e->object. */ return e->object; } void growHashTableMaybe (GC_state s, GC_objectHashTable t) { GC_objectHashElement oldElement; struct GC_objectHashElement *oldElements; uint32_t oldElementsLengthMax; uint32_t newElementsLengthMax; if (not t->mayInsert or t->elementsLengthCur * 2 <= t->elementsLengthMax) return; oldElements = t->elements; oldElementsLengthMax = t->elementsLengthMax; newElementsLengthMax = oldElementsLengthMax * 2; if (DEBUG_SHARE) fprintf (stderr, "trying to grow table to cardinality %"PRIu32"\n", newElementsLengthMax); // Try to alocate the new table. t->elements = (struct GC_objectHashElement *) (calloc(newElementsLengthMax, sizeof(*(t->elements)))); if (NULL == t->elements) { t->mayInsert = FALSE; t->elements = oldElements; if (DEBUG_SHARE) fprintf (stderr, "unable to grow table\n"); return; } t->elementsLengthMax = newElementsLengthMax; t->elementsLengthMaxLog2++; for (unsigned int i = 0; i < oldElementsLengthMax; ++i) { oldElement = &oldElements[i]; unless (NULL == oldElement->object) insertHashTableElem (s, t, oldElement->hash, oldElement->object, NULL, FALSE); } if (t->elementsIsInHeap) t->elementsIsInHeap = FALSE; else free (oldElements); if (DEBUG_SHARE) fprintf (stderr, "done growing table\n"); } pointer hashConsPointer (GC_state s, pointer object, bool countBytesHashConsed) { GC_objectHashTable t; GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; bool hasIdentity; GC_objectTypeTag tag; pointer max; GC_hash hash; GC_hash* p; pointer res; if (DEBUG_SHARE) fprintf (stderr, "hashConsPointer ("FMTPTR")\n", (uintptr_t)object); t = s->objectHashTable; header = getHeader (object); splitHeader(s, header, &tag, &hasIdentity, &bytesNonObjptrs, &numObjptrs); if (hasIdentity) { /* Don't hash cons. */ res = object; goto done; } assert ((SEQUENCE_TAG == tag) or (NORMAL_TAG == tag)); max = object + (SEQUENCE_TAG == tag ? (sizeofSequenceNoMetaData (s, getSequenceLength (object), bytesNonObjptrs, numObjptrs)) : (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE))); // Compute the hash. hash = (GC_hash)header; for (p = (GC_hash*)object; p < (GC_hash*)max; ++p) hash = hash * 31 + *p; /* Insert into table. */ res = insertHashTableElem (s, t, hash, object, max, TRUE); growHashTableMaybe (s, t); if (countBytesHashConsed and res != object) { size_t amount; amount = (size_t)(max - object); if (SEQUENCE_TAG == tag) amount += GC_SEQUENCE_METADATA_SIZE; else amount += GC_NORMAL_METADATA_SIZE; s->lastMajorStatistics.bytesHashConsed += amount; } done: if (DEBUG_SHARE) fprintf (stderr, FMTPTR" = hashConsPointer ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)object); return res; } void shareObjptr (GC_state s, objptr *opp) { pointer p; p = objptrToPointer (*opp, s->heap.start); if (DEBUG_SHARE) fprintf (stderr, "shareObjptr opp = "FMTPTR" *opp = "FMTOBJPTR"\n", (uintptr_t)opp, *opp); p = hashConsPointer (s, p, FALSE); *opp = pointerToObjptr (p, s->heap.start); markIntergenerationalObjptr (s, opp); } void printBytesHashConsedMessage (size_t bytesHashConsed, size_t bytesExamined) { fprintf (stderr, "[GC: hash-consed %s bytes (%.1f%% of bytes examined).]\n", uintmaxToCommaString(bytesHashConsed), 100.0 * ((double)bytesHashConsed / (double)bytesExamined)); } mlton-20210117+dfsg/runtime/gc/hash-cons.h000066400000000000000000000033421416264345000201400ustar00rootroot00000000000000/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* ---------------------------------------------------------------- */ /* Object hash consing */ /* ---------------------------------------------------------------- */ typedef uint32_t GC_hash; #define GC_HASH_SIZE sizeof(GC_hash) #define PRIxHASH PRIx32 #define FMTHASH "0x%08"PRIxHASH typedef struct GC_objectHashElement { GC_hash hash; pointer object; } *GC_objectHashElement; typedef struct GC_objectHashTable { struct GC_objectHashElement *elements; bool elementsIsInHeap; uint32_t elementsLengthCur; uint32_t elementsLengthMax; uint32_t elementsLengthMaxLog2; bool mayInsert; } *GC_objectHashTable; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_objectHashTable allocHashTable (GC_state s); static inline void freeHashTable (GC_objectHashTable t); static inline pointer insertHashTableElem (GC_state s, GC_objectHashTable t, GC_hash hash, pointer object, pointer max, bool mightBeThere); static inline void growHashTableMaybe (GC_state s, GC_objectHashTable t); static pointer hashConsPointer (GC_state s, pointer object, bool countBytesHashConsed); static inline void shareObjptr (GC_state s, objptr *opp); static void printBytesHashConsedMessage (size_t bytesHashConsed, size_t bytesExamined); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/heap.c000066400000000000000000000524521416264345000171730ustar00rootroot00000000000000/* Copyright (C) 2009-2012 Matthew Fluet. * Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void displayHeap (__attribute__ ((unused)) GC_state s, GC_heap heap, FILE *stream) { fprintf(stream, "\t\tnursery = "FMTPTR"\n" "\t\toldGenSize = %"PRIuMAX"\n" "\t\tsize = %"PRIuMAX"\n" "\t\tstart = "FMTPTR"\n" "\t\twithMapsSize = %"PRIuMAX"\n", (uintptr_t)heap->nursery, (uintmax_t)heap->oldGenSize, (uintmax_t)heap->size, (uintptr_t)heap->start, (uintmax_t)heap->withMapsSize); } void initHeap (__attribute__ ((unused)) GC_state s, GC_heap h) { h->nursery = NULL; h->oldGenSize = 0; h->size = 0; h->start = NULL; h->withMapsSize = 0; } /* sizeofHeapDesired (s, l, cs) * * returns the desired heap size for a heap with l bytes live, * given that the current heap size is cs. */ size_t sizeofHeapDesired (GC_state s, size_t liveSize, size_t currentSize) { size_t liveMapsSize, liveWithMapsSize; size_t currentMapsSize, currentWithMapsSize; size_t resSize, resWithMapsSize; size_t syslimSize, syslimWithMapsSize; LOCAL_USED_FOR_ASSERT size_t syslimMapsSize; double ratio; syslimWithMapsSize = alignDown (SIZE_MAX, s->sysvals.pageSize); syslimSize = invertSizeofCardMapAndCrossMap (s, syslimWithMapsSize); syslimMapsSize = sizeofCardMapAndCrossMap (s, syslimSize); assert (syslimSize + syslimMapsSize <= syslimWithMapsSize); liveSize = align (liveSize, s->sysvals.pageSize); if (syslimSize < liveSize) die ("Out of memory with system-limit heap size %s.\n", uintmaxToCommaString(syslimSize)); liveMapsSize = sizeofCardMapAndCrossMap (s, liveSize); liveWithMapsSize = liveSize + liveMapsSize; assert (isAligned (currentSize, s->sysvals.pageSize)); currentMapsSize = sizeofCardMapAndCrossMap (s, currentSize); currentWithMapsSize = currentSize + currentMapsSize; ratio = (double)s->sysvals.ram / (double)liveWithMapsSize; if (ratio >= s->controls.ratios.live + s->controls.ratios.grow) { /* Cheney copying fits in RAM with desired ratios.live. */ resWithMapsSize = (size_t)(liveWithMapsSize * s->controls.ratios.live); /* If the heap is currently close in size to what we want, leave * it alone. Favor growing over shrinking. */ if (0.5 * currentWithMapsSize <= resWithMapsSize and resWithMapsSize <= 1.1 * currentWithMapsSize) { resWithMapsSize = currentWithMapsSize; } else { resWithMapsSize = align (resWithMapsSize, s->sysvals.pageSize); } } else if (s->controls.ratios.grow >= s->controls.ratios.copy and ratio >= 2.0 * s->controls.ratios.copy) { /* Split RAM in half. Round down by pageSize so that the total * amount of space taken isn't greater than RAM once rounding * happens. This is so resizeHeapSecondary doesn't get confused * and free a semispace in a misguided attempt to avoid paging. */ resWithMapsSize = alignDown (s->sysvals.ram / 2, s->sysvals.pageSize); } else if (ratio >= s->controls.ratios.copy + s->controls.ratios.grow) { /* Cheney copying fits in RAM. */ resWithMapsSize = s->sysvals.ram - (size_t)(s->controls.ratios.grow * liveWithMapsSize); /* If the heap isn't too much smaller than what we want, leave it * alone. On the other hand, if it is bigger we want to leave * resWithMapsSize as is so that the heap is shrunk, to try to * avoid paging. */ if (1.0 * currentWithMapsSize <= resWithMapsSize and resWithMapsSize <= 1.1 * currentWithMapsSize) { resWithMapsSize = currentWithMapsSize; } else { resWithMapsSize = align (resWithMapsSize, s->sysvals.pageSize); } } else if (ratio >= s->controls.ratios.markCompact) { /* Mark compact fits in RAM. It doesn't matter what the current * size is. If the heap is currently smaller, we are using * copying and should switch to mark-compact. If the heap is * currently bigger, we want to shrink back to RAM to avoid * paging. */ resWithMapsSize = s->sysvals.ram; } else { /* Required live ratio. */ double resWithMapsSizeD = liveWithMapsSize * (double)(s->controls.ratios.markCompact); if (resWithMapsSizeD > (double)syslimWithMapsSize) { resWithMapsSize = syslimWithMapsSize; } else { resWithMapsSize = align ((size_t)resWithMapsSizeD, s->sysvals.pageSize); } /* If the current heap is bigger than resWithMapsSize, then * shrinking always sounds like a good idea. However, depending * on what pages the VM keeps around, growing could be very * expensive, if it involves paging the entire heap. Hopefully * the copy loop in growHeap will make the right thing happen. */ } if (s->controls.fixedHeap > 0) { if (resWithMapsSize > s->controls.fixedHeap / 2) resWithMapsSize = s->controls.fixedHeap; else resWithMapsSize = s->controls.fixedHeap / 2; if (resWithMapsSize < liveWithMapsSize) die ("Out of memory with fixed heap size %s.", uintmaxToCommaString(s->controls.fixedHeap)); } else if (s->controls.maxHeap > 0) { if (resWithMapsSize > s->controls.maxHeap) resWithMapsSize = s->controls.maxHeap; if (resWithMapsSize < liveWithMapsSize) die ("Out of memory with max heap size %s.", uintmaxToCommaString(s->controls.maxHeap)); } resSize = invertSizeofCardMapAndCrossMap (s, resWithMapsSize); assert (isAligned (resSize, s->sysvals.pageSize)); if (DEBUG_RESIZING) fprintf (stderr, "%s = sizeofHeapDesired (%s, %s)\n", uintmaxToCommaString(resSize), uintmaxToCommaString(liveSize), uintmaxToCommaString(currentSize)); assert (resSize >= liveSize); return resSize; } void releaseHeap (GC_state s, GC_heap h) { if (NULL == h->start) return; if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Releasing heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); GC_release (h->start, h->withMapsSize); initHeap (s, h); } /* shrinkHeap (s, h, keepSize) */ void shrinkHeap (GC_state s, GC_heap h, size_t keepSize) { assert (keepSize <= h->size); if (0 == keepSize) { releaseHeap (s, h); return; } keepSize = align (keepSize, s->sysvals.pageSize); if (keepSize < h->size) { size_t keepWithMapsSize; keepWithMapsSize = keepSize + sizeofCardMapAndCrossMap (s, keepSize); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Shrinking heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); fprintf (stderr, "[GC:\tto size %s bytes (+ %s bytes card/cross map).]\n", uintmaxToCommaString(keepSize), uintmaxToCommaString(keepWithMapsSize - keepSize)); } assert (isAligned (keepWithMapsSize, s->sysvals.pageSize)); assert (keepWithMapsSize <= h->withMapsSize); GC_release (h->start + keepWithMapsSize, h->withMapsSize - keepWithMapsSize); h->size = keepSize; h->withMapsSize = keepWithMapsSize; } } /* createHeap (s, h, desiredSize, minSize) * * allocates a heap of the size necessary to work with desiredSize * live data, and ensures that at least minSize is available. It * returns TRUE if it is able to allocate the space, and returns FALSE * if it is unable. */ bool createHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize) { size_t newSize; size_t newWithMapsSize; if (DEBUG_MEM) fprintf (stderr, "createHeap desired size = %s min size = %s\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(minSize)); if (desiredSize < minSize) desiredSize = minSize; minSize = align (minSize, s->sysvals.pageSize); desiredSize = align (desiredSize, s->sysvals.pageSize); assert (isHeapInit (h) and NULL == h->start); /* Biased binary search (between minSize and desiredSize) for a * successful mmap. * Toggle back and forth between high and low addresses to decrease * the chance of virtual memory fragmentation; important for large * heaps. * Always try a NULL address last. */ size_t factor = 16; const size_t maxFactor = s->sysvals.pageSize; size_t lowSize = minSize; size_t highSize = desiredSize; newSize = highSize; unsigned int loopCount = 0; while (lowSize <= highSize) { pointer newStart; newWithMapsSize = newSize + sizeofCardMapAndCrossMap (s, newSize); assert (isAligned (newWithMapsSize, s->sysvals.pageSize)); const unsigned int addressCountLog2 = 5; const unsigned int addressCount = 0x1 << addressCountLog2; const size_t addressStep = (size_t)0x1 << (ADDRESS_BITS - addressCountLog2); #if ADDRESS_BITS == POINTER_BITS const size_t addressHigh = 0; #else const size_t addressHigh = (size_t)0x1 << ADDRESS_BITS; #endif static bool addressScanDir = TRUE; for (unsigned int i = 1; i <= addressCount; i++) { size_t address = (size_t)i * addressStep; if (addressScanDir) address = addressHigh - address; /* Always use 0 in the last step. */ if (i == addressCount) address = 0; newStart = GC_mmapAnon ((pointer)address, newWithMapsSize); unless ((void*)-1 == newStart) { addressScanDir = not addressScanDir; h->start = newStart; h->size = newSize; h->withMapsSize = newWithMapsSize; if (h->size > s->cumulativeStatistics.maxHeapSize) s->cumulativeStatistics.maxHeapSize = h->size; assert (minSize <= h->size and h->size <= desiredSize); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Created heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); return TRUE; } } size_t prevSize = newSize; size_t prevWithMapsSize = newWithMapsSize; highSize = newSize - s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); if (s->controls.messages) { fprintf (stderr, "[GC: Creating heap of size %s bytes (+ %s bytes card/cross map) cannot be satisfied,]\n", uintmaxToCommaString (prevSize), uintmaxToCommaString (prevWithMapsSize - prevSize)); fprintf (stderr, "[GC:\tbacking off by %s bytes with minimum size of %s bytes.]\n", uintmaxToCommaString (prevSize - newSize), uintmaxToCommaString (minSize)); } if (factor < maxFactor and ++loopCount % 64 == 0) { factor += factor; } } return FALSE; } /* createHeapSecondary (s, desiredSize) */ bool createHeapSecondary (GC_state s, size_t desiredSize) { size_t desiredWithMapsSize; size_t minSize, minWithMapsSize; desiredWithMapsSize = desiredSize + sizeofCardMapAndCrossMap (s, desiredSize); if ((s->controls.fixedHeap > 0 and s->heap.withMapsSize + desiredWithMapsSize > s->controls.fixedHeap) or (s->controls.maxHeap > 0 and s->heap.withMapsSize + desiredWithMapsSize > s->controls.maxHeap)) return FALSE; minSize = align (s->heap.oldGenSize, s->sysvals.pageSize); minWithMapsSize = minSize + sizeofCardMapAndCrossMap (s, minSize); if (minWithMapsSize > SIZE_MAX - s->heap.withMapsSize) return FALSE; return createHeap (s, &s->secondaryHeap, desiredSize, s->heap.oldGenSize); } /* remapHeap (s, h, desiredSize, minSize) */ #if not HAS_REMAP bool remapHeap (__attribute__ ((unused)) GC_state s, __attribute__ ((unused)) GC_heap h, __attribute__ ((unused)) size_t desiredSize, __attribute__ ((unused)) size_t minSize) { return FALSE; } #else bool remapHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize) { size_t newSize; size_t newWithMapsSize; int result; if (DEBUG_MEM) fprintf (stderr, "remapHeap desired size = %s min size = %s\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(minSize)); assert (minSize <= desiredSize); assert (desiredSize >= h->size); minSize = align (minSize, s->sysvals.pageSize); desiredSize = align (desiredSize, s->sysvals.pageSize); /* Biased binary search (between minSize and desiredSize) for a * successful mremap. */ size_t factor = 16; size_t lowSize = minSize; size_t highSize = desiredSize; newSize = highSize; result = FALSE; while (lowSize <= highSize) { pointer newStart; newWithMapsSize = newSize + sizeofCardMapAndCrossMap (s, newSize); assert (isAligned (newWithMapsSize, s->sysvals.pageSize)); newStart = GC_mremap (h->start, h->withMapsSize, newWithMapsSize); if ((void*)-1 != newStart) { pointer origStart = h->start; size_t origSize = h->size; size_t origWithMapsSize = h->withMapsSize; h->start = newStart; h->size = newSize; h->withMapsSize = newWithMapsSize; if (h->size > s->cumulativeStatistics.maxHeapSize) s->cumulativeStatistics.maxHeapSize = h->size; assert (minSize <= h->size and h->size <= desiredSize); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Remapped heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)origStart, uintmaxToCommaString(origSize), uintmaxToCommaString(origWithMapsSize - origSize)); fprintf (stderr, "[GC:\tto heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); } lowSize = newSize + s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); result = TRUE; } else { size_t prevSize = newSize; size_t prevWithMapsSize = newWithMapsSize; highSize = newSize - s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); if (s->controls.messages) { fprintf (stderr, "[GC: Remapping heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)(h->start), uintmaxToCommaString (h->size), uintmaxToCommaString (h->withMapsSize - h->size)); fprintf (stderr, "[GC:\tto heap of size %s bytes (+ %s bytes card/cross map) cannot be satisfied,]\n", uintmaxToCommaString (prevSize), uintmaxToCommaString (prevWithMapsSize - prevSize)); if (result) { fprintf (stderr, "[GC:\tbacking off by %s bytes.]\n", uintmaxToCommaString (prevSize - newSize)); } else { fprintf (stderr, "[GC:\tbacking off by %s bytes with minimum size of %s bytes.]\n", uintmaxToCommaString (prevSize - newSize), uintmaxToCommaString (minSize)); } } } } return result; } #endif enum { COPY_CHUNK_SIZE = 0x2000000, /* 32M */ }; /* growHeap (s, desiredSize, minSize) */ void growHeap (GC_state s, size_t desiredSize, size_t minSize) { GC_heap curHeapp; struct GC_heap newHeap; GC_heap newHeapp; bool useCurrent; pointer origStart; size_t liveSize; assert (isAligned (desiredSize, s->sysvals.pageSize)); assert (isAligned (minSize, s->sysvals.pageSize)); assert (desiredSize >= s->heap.size); if (DEBUG_RESIZING or s->controls.messages) { fprintf (stderr, "[GC: Growing heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)s->heap.start, uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\tto desired size of %s bytes (+ %s bytes card/cross map)]\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(sizeofCardMapAndCrossMap (s, desiredSize))); fprintf (stderr, "[GC:\tand minimum size of %s bytes (+ %s bytes card/cross map).]\n", uintmaxToCommaString(minSize), uintmaxToCommaString(sizeofCardMapAndCrossMap (s, minSize))); } if (minSize <= s->heap.size) { useCurrent = TRUE; /* Demand proper growth from remapHeap and/or createHeap. */ minSize = s->heap.size + s->sysvals.pageSize; } else { useCurrent = FALSE; } curHeapp = &s->heap; newHeapp = &newHeap; origStart = curHeapp->start; liveSize = curHeapp->oldGenSize; assert (liveSize <= curHeapp->size); if (remapHeap (s, curHeapp, desiredSize, minSize)) { goto done; } if (!useCurrent) shrinkHeap (s, curHeapp, liveSize); initHeap (s, newHeapp); /* Allocate a space of the desired size. */ if (minSize + sizeofCardMapAndCrossMap (s, minSize) <= SIZE_MAX - curHeapp->withMapsSize and createHeap (s, newHeapp, desiredSize, minSize)) { pointer from; pointer to; size_t remaining; from = curHeapp->start + liveSize; to = newHeapp->start + liveSize; remaining = liveSize; shrinkHeap (s, curHeapp, remaining); copy: assert (remaining == (size_t)(from - curHeapp->start) and from >= curHeapp->start and to >= newHeapp->start); if (remaining < COPY_CHUNK_SIZE) { GC_memcpy (curHeapp->start, newHeapp->start, remaining); releaseHeap (s, curHeapp); } else { remaining -= COPY_CHUNK_SIZE; from -= COPY_CHUNK_SIZE; to -= COPY_CHUNK_SIZE; GC_memcpy (from, to, COPY_CHUNK_SIZE); shrinkHeap (s, curHeapp, remaining); goto copy; } newHeapp->oldGenSize = liveSize; *curHeapp = *newHeapp; } else if (useCurrent) { if (DEBUG_RESIZING or s->controls.messages) { fprintf (stderr, "[GC: Using heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)s->heap.start, uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); } } else if (s->controls.mayPageHeap) { /* Page the heap to disk and try again. */ void *data; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Writing heap at "FMTPTR" of size %s bytes to disk.]\n", (uintptr_t)curHeapp->start, uintmaxToCommaString(liveSize)); } data = GC_diskBack_write (curHeapp->start, liveSize); releaseHeap (s, curHeapp); if (createHeap (s, curHeapp, desiredSize, minSize)) { if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Reading heap to "FMTPTR" of size %s bytes from disk.]\n", (uintptr_t)(curHeapp->start), uintmaxToCommaString(liveSize)); } GC_diskBack_read (data, curHeapp->start, liveSize); GC_diskBack_close (data); curHeapp->oldGenSize = liveSize; } else { GC_diskBack_close (data); goto oom; } } else { goto oom; } done: unless (origStart == s->heap.start) { translateHeap (s, origStart, s->heap.start, s->heap.oldGenSize); } return; oom: if (s->controls.messages) GC_displayMem (); die ("Out of memory. Unable to allocate heap with %s bytes.\n", uintmaxToCommaString(minSize)); } /* resizeHeap (s, minSize) */ void resizeHeap (GC_state s, size_t minSize) { size_t desiredSize; if (DEBUG_RESIZING) fprintf (stderr, "resizeHeap minSize = %s size = %s\n", uintmaxToCommaString(minSize), uintmaxToCommaString(s->heap.size)); desiredSize = sizeofHeapDesired (s, minSize, s->heap.size); assert (isAligned (desiredSize, s->sysvals.pageSize)); assert (minSize <= desiredSize); minSize = align (minSize, s->sysvals.pageSize); if (desiredSize <= s->heap.size) { shrinkHeap (s, &s->heap, desiredSize); } else { releaseHeap (s, &s->secondaryHeap); growHeap (s, desiredSize, minSize); } assert (s->heap.size >= minSize); } /* resizeHeapSecondary (s) */ void resizeHeapSecondary (GC_state s) { size_t primarySize, primaryWithMapsSize; size_t secondarySize; primarySize = s->heap.size; primaryWithMapsSize = s->heap.withMapsSize; secondarySize = s->secondaryHeap.size; if (DEBUG_RESIZING) fprintf (stderr, "secondaryHeapResize\n"); if (0 == secondarySize) return; if (2 * primaryWithMapsSize > s->sysvals.ram) /* Holding on to secondaryHeap might cause paging. So don't. */ releaseHeap (s, &s->secondaryHeap); else if (secondarySize < primarySize) { unless (remapHeap (s, &s->secondaryHeap, primarySize, primarySize)) releaseHeap (s, &s->secondaryHeap); } else if (secondarySize > primarySize) shrinkHeap (s, &s->secondaryHeap, primarySize); assert (0 == s->secondaryHeap.size or s->heap.size == s->secondaryHeap.size); } mlton-20210117+dfsg/runtime/gc/heap.h000066400000000000000000000053331416264345000171740ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * All ML objects (including ML execution stacks) are allocated in a * contiguous heap. The heap has the following general layout: * * ------------------------------------------------------------------------- * | old generation | | nursery | cardMap | crossMap | * ------------------------------------------------------------------------- * |------oldGenSize------| * |-----------------------size-----------------------| * ^ ^ * start nursery * |------------------------------withMapsSize-----------------------------| */ typedef struct GC_heap { pointer nursery; /* start of nursery */ size_t oldGenSize; /* size of old generation */ size_t size; /* size of heap */ pointer start; /* start of heap (and old generation) */ size_t withMapsSize; /* size of heap with card/cross maps */ } *GC_heap; #define GC_HEAP_LIMIT_SLOP 512 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isObjptrInFromSpace (GC_state s, objptr op); static inline bool isObjptrInHeap (GC_state s, objptr op); static inline bool isObjptrInNursery (GC_state s, objptr op); static inline bool isObjptrInOldGen (GC_state s, objptr op); static inline bool isPointerInFromSpace (GC_state s, pointer p); static inline bool isPointerInHeap (GC_state s, pointer p); static inline bool isPointerInNursery (GC_state s, pointer p); static inline bool isPointerInOldGen (GC_state s, pointer p); static inline bool hasHeapBytesFree (GC_state s, size_t oldGen, size_t nursery); static inline bool isHeapInit (GC_heap h); static void displayHeap (GC_state s, GC_heap heap, FILE *stream); static inline void initHeap (GC_state s, GC_heap h); static inline size_t sizeofHeapDesired (GC_state s, size_t live, size_t currentSize); static inline void releaseHeap (GC_state s, GC_heap h); static void shrinkHeap (GC_state s, GC_heap h, size_t keepSize); static bool createHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize); static bool createHeapSecondary (GC_state s, size_t desiredSize); static bool remapHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize); static void growHeap (GC_state s, size_t desiredSize, size_t minSize); static void resizeHeap (GC_state s, size_t minSize); static void resizeHeapSecondary (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/heap_predicates.c000066400000000000000000000036671416264345000214020ustar00rootroot00000000000000/* Copyright (C) 2012,2017,2019-2020 Matthew Fluet. * Copyright (C) 2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ bool isPointerInOldGen (GC_state s, pointer p) { return (not (isPointer (p)) or (s->heap.start <= p and p <= s->heap.start + s->heap.oldGenSize)); } bool isPointerInNursery (GC_state s, pointer p) { return (not (isPointer (p)) or (s->heap.nursery <= p and p <= s->frontier)); } bool isObjptrInOldGen (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInOldGen (s, p); } bool isObjptrInNursery (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInNursery (s, p); } bool isPointerInFromSpace (GC_state s, pointer p) { return (isPointerInOldGen (s, p) or isPointerInNursery (s, p)); } bool isObjptrInFromSpace (GC_state s, objptr op) { return (isObjptrInOldGen (s, op) or isObjptrInNursery (s, op)); } bool isPointerInHeap (GC_state s, pointer p) { return isPointerInFromSpace(s, p); } bool isObjptrInHeap (GC_state s, objptr op) { return isObjptrInFromSpace(s, op); } bool hasHeapBytesFree (GC_state s, size_t oldGen, size_t nursery) { size_t total; bool res; total = s->heap.oldGenSize + oldGen + (s->canMinor ? 2 : 1) * (size_t)(s->limitPlusSlop - s->heap.nursery); res = (total <= s->heap.size) and (nursery <= (size_t)(s->limitPlusSlop - s->frontier)); if (DEBUG_DETAILED) fprintf (stderr, "%s = hasBytesFree (%s, %s)\n", boolToString (res), uintmaxToCommaString(oldGen), uintmaxToCommaString(nursery)); return res; } bool isHeapInit (GC_heap h) { return (0 == h->size); } mlton-20210117+dfsg/runtime/gc/init-world.c000066400000000000000000000033611416264345000203410ustar00rootroot00000000000000/* Copyright (C) 2011-2012,2014,2016,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Initialization */ /* ---------------------------------------------------------------- */ size_t sizeofInitialBytesLive (GC_state s) { size_t total; total = 0; total += s->staticHeaps.dynamic.size; total += sizeofStackWithMetaData (s, sizeofStackInitialReserved (s)) + sizeofThread (s); return total; } void initWorld (GC_state s) { pointer start; GC_thread thread; s->lastMajorStatistics.bytesLive = sizeofInitialBytesLive (s); createHeap (s, &s->heap, sizeofHeapDesired (s, s->lastMajorStatistics.bytesLive, 0), s->lastMajorStatistics.bytesLive); setCardMapAndCrossMap (s); start = alignFrontier (s, s->heap.start); s->frontier = start; s->limitPlusSlop = s->heap.start + s->heap.size; s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; GC_memcpy (s->staticHeaps.dynamic.start, start, s->staticHeaps.dynamic.size); s->frontier = start + s->staticHeaps.dynamic.size; translateHeap (s, s->staticHeaps.dynamic.start, start, s->staticHeaps.dynamic.size); assert ((size_t)(s->frontier - start) <= s->lastMajorStatistics.bytesLive); s->heap.oldGenSize = (size_t)(s->frontier - s->heap.start); setGCStateCurrentHeap (s, 0, 0); thread = newThread (s, sizeofStackInitialReserved (s)); switchToThread (s, pointerToObjptr((pointer)thread - offsetofThread (s), s->heap.start)); } mlton-20210117+dfsg/runtime/gc/init-world.h000066400000000000000000000007371416264345000203520ustar00rootroot00000000000000/* Copyright (C) 2014,2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofInitialBytesLive (GC_state s); static void initWorld (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/init.c000066400000000000000000000415331416264345000172170ustar00rootroot00000000000000/* Copyright (C) 2009,2012,2015,2017,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Initialization */ /* ---------------------------------------------------------------- */ static bool stringToBool (char *s) { if (0 == strcmp (s, "false")) return FALSE; if (0 == strcmp (s, "true")) return TRUE; die ("Invalid @MLton bool: %s.", s); } // From gdtoa/gdtoa.h. // Can't include the whole thing because it brings in too much junk. float gdtoa__strtof (const char *, char **); static float stringToFloat (char *s) { char *endptr; float f; f = gdtoa__strtof (s, &endptr); if (s == endptr) die ("Invalid @MLton float: %s.", s); return f; } static size_t stringToBytes (char *s) { double d; char *endptr; size_t factor; d = strtod (s, &endptr); if (s == endptr) goto bad; switch (*endptr++) { case 'g': case 'G': factor = 1024 * 1024 * 1024; break; case 'k': case 'K': factor = 1024; break; case 'm': case 'M': factor = 1024 * 1024; break; default: goto bad; } d *= factor; unless (*endptr == '\0' and 0.0 <= d and d <= (double)SIZE_MAX) goto bad; return (size_t)d; bad: die ("Invalid @MLton memory amount: %s.", s); } /* ---------------------------------------------------------------- */ /* GC_init */ /* ---------------------------------------------------------------- */ int processAtMLton (GC_state s, int start, int argc, char **argv, char **worldFile) { int i; i = start; while (s->controls.mayProcessAtMLton and i < argc and (0 == strcmp (argv [i], "@MLton"))) { bool done; i++; done = FALSE; while (!done) { if (i == argc) die ("Missing -- at end of @MLton args."); else { char *arg; arg = argv[i]; if (0 == strcmp (arg, "copy-generational-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton copy-generational-ratio missing argument."); s->controls.ratios.copyGenerational = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.copyGenerational) die ("@MLton copy-generational-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "copy-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton copy-ratio missing argument."); s->controls.ratios.copy = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.copy) die ("@MLton copy-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "fixed-heap")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton fixed-heap missing argument."); s->controls.fixedHeap = align (stringToBytes (argv[i++]), 2 * s->sysvals.pageSize); } else if (0 == strcmp (arg, "gc-messages")) { i++; s->controls.messages = TRUE; } else if (0 == strcmp (arg, "gc-summary")) { i++; s->controls.summary = TRUE; } else if (0 == strcmp (arg, "gc-summary-file")) { i++; if (i == argc || (0 == strcmp (argv[i], "--"))) die ("@MLton gc-summary-file missing argument."); s->controls.summary = TRUE; s->controls.summaryFile = fopen(argv[i++], "w"); if (s->controls.summaryFile == NULL) { die ("Invalid @MLton gc-summary-file %s (%s).", argv[i-1], strerror(errno)); } } else if (0 == strcmp (arg, "grow-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton grow-ratio missing argument."); s->controls.ratios.grow = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.grow) die ("@MLton grow-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "hash-cons")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton hash-cons missing argument."); s->controls.ratios.hashCons = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.hashCons and s->controls.ratios.hashCons <= 1.0) die ("@MLton hash-cons argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "live-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton live-ratio missing argument."); s->controls.ratios.live = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.live) die ("@MLton live-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "load-world")) { unless (s->controls.mayLoadWorld) die ("May not load world."); i++; s->amOriginal = FALSE; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton load-world missing argument."); *worldFile = argv[i++]; } else if (0 == strcmp (arg, "mark-compact-generational-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton mark-compact-generational-ratio missing argument."); s->controls.ratios.markCompactGenerational = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.markCompactGenerational) die ("@MLton mark-compact-generational-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "mark-compact-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton mark-compact-ratio missing argument."); s->controls.ratios.markCompact = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.markCompact) die ("@MLton mark-compact-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "max-heap")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton max-heap missing argument."); s->controls.maxHeap = align (stringToBytes (argv[i++]), 2 * s->sysvals.pageSize); } else if (0 == strcmp (arg, "may-page-heap")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton may-page-heap missing argument."); s->controls.mayPageHeap = stringToBool (argv[i++]); } else if (0 == strcmp (arg, "no-load-world")) { i++; s->controls.mayLoadWorld = FALSE; } else if (0 == strcmp (arg, "nursery-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton nursery-ratio missing argument."); s->controls.ratios.nursery = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.nursery) die ("@MLton nursery-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "ram-slop")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton ram-slop missing argument."); s->controls.ratios.ramSlop = stringToFloat (argv[i++]); } else if (0 == strcmp (arg, "show-sources")) { showSources (s); exit (0); } else if (0 == strcmp (arg, "stop")) { i++; s->controls.mayProcessAtMLton = FALSE; } else if (0 == strcmp (arg, "stack-current-grow-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-current-grow-ratio missing argument."); s->controls.ratios.stackCurrentGrow = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentGrow) die ("@MLton stack-current-grow-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-max-reserved-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-current-max-reserved-ratio missing argument."); s->controls.ratios.stackCurrentMaxReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentMaxReserved) die ("@MLton stack-current-max-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-permit-reserved-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-current-permit-reserved-ratio missing argument."); s->controls.ratios.stackCurrentPermitReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentPermitReserved) die ("@MLton stack-current-permit-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-shrink-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-current-shrink-ratio missing argument."); s->controls.ratios.stackCurrentShrink = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.stackCurrentShrink and s->controls.ratios.stackCurrentShrink <= 1.0) die ("@MLton stack-current-shrink-ratio argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "stack-max-reserved-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-max-reserved-ratio missing argument."); s->controls.ratios.stackMaxReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackMaxReserved) die ("@MLton stack-max-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-shrink-ratio")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton stack-shrink-ratio missing argument."); s->controls.ratios.stackShrink = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.stackShrink and s->controls.ratios.stackShrink <= 1.0) die ("@MLton stack-shrink-ratio argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "use-mmap")) { i++; if (i == argc || 0 == strcmp (argv[i], "--")) die ("@MLton use-mmap missing argument."); GC_setCygwinUseMmap (stringToBool (argv[i++])); } else if (0 == strcmp (arg, "--")) { i++; done = TRUE; } else if (i > 1) die ("Strange @MLton arg: %s", argv[i]); else done = TRUE; } } } return i; } int GC_init (GC_state s, int argc, char **argv) { char *worldFile; int res; assert (s->alignment >= GC_MODEL_MINALIGN); assert (isAligned (sizeof (struct GC_stack), s->alignment)); // While the following asserts are manifestly true, // they check the asserts in sizeofThread and sizeofWeak. assert (sizeofThread (s) == sizeofThread (s)); assert (sizeofWeak (s) == sizeofWeak (s)); s->amInGC = TRUE; s->amOriginal = TRUE; s->atomicState = 0; s->callFromCHandlerThread = BOGUS_OBJPTR; s->controls.fixedHeap = 0; s->controls.maxHeap = 0; s->controls.mayLoadWorld = TRUE; s->controls.mayPageHeap = FALSE; s->controls.mayProcessAtMLton = TRUE; s->controls.messages = FALSE; s->controls.oldGenSequenceSize = 0x100000; s->controls.ratios.copy = 4.0f; s->controls.ratios.copyGenerational = 4.0f; s->controls.ratios.grow = 8.0f; s->controls.ratios.hashCons = 0.0f; s->controls.ratios.live = 8.0f; s->controls.ratios.markCompact = 1.04f; s->controls.ratios.markCompactGenerational = 8.0f; s->controls.ratios.nursery = 10.0f; s->controls.ratios.ramSlop = 0.5f; s->controls.ratios.stackCurrentGrow = 2.0f; s->controls.ratios.stackCurrentMaxReserved = 32.0f; s->controls.ratios.stackCurrentPermitReserved = 4.0f; s->controls.ratios.stackCurrentShrink = 0.5f; s->controls.ratios.stackMaxReserved = 8.0f; s->controls.ratios.stackShrink = 0.5f; s->controls.summary = FALSE; s->controls.summaryFile = stderr; s->cumulativeStatistics.bytesAllocated = 0; s->cumulativeStatistics.bytesCopied = 0; s->cumulativeStatistics.bytesCopiedMinor = 0; s->cumulativeStatistics.bytesHashConsed = 0; s->cumulativeStatistics.bytesMarkCompacted = 0; s->cumulativeStatistics.bytesScannedMinor = 0; s->cumulativeStatistics.maxBytesLive = 0; s->cumulativeStatistics.maxHeapSize = 0; s->cumulativeStatistics.maxPauseTime = 0; s->cumulativeStatistics.maxStackSize = 0; s->cumulativeStatistics.numCardsMarked = 0; s->cumulativeStatistics.numCopyingGCs = 0; s->cumulativeStatistics.numHashConsGCs = 0; s->cumulativeStatistics.numMarkCompactGCs = 0; s->cumulativeStatistics.numMinorGCs = 0; rusageZero (&s->cumulativeStatistics.ru_gc); rusageZero (&s->cumulativeStatistics.ru_gcCopying); rusageZero (&s->cumulativeStatistics.ru_gcMarkCompact); rusageZero (&s->cumulativeStatistics.ru_gcMinor); s->currentThread = BOGUS_OBJPTR; s->hashConsDuringGC = FALSE; initHeap (s, &s->heap); s->lastMajorStatistics.bytesHashConsed = 0; s->lastMajorStatistics.bytesLive = 0; s->lastMajorStatistics.kind = GC_COPYING; s->lastMajorStatistics.numMinorGCs = 0; s->savedThread = BOGUS_OBJPTR; initHeap (s, &s->secondaryHeap); s->signalHandlerThread = BOGUS_OBJPTR; s->signalsInfo.amInSignalHandler = FALSE; s->signalsInfo.gcSignalHandled = FALSE; s->signalsInfo.gcSignalPending = FALSE; s->signalsInfo.signalIsPending = FALSE; sigemptyset (&s->signalsInfo.signalsHandled); sigemptyset (&s->signalsInfo.signalsPending); s->sysvals.pageSize = GC_pageSize (); s->sysvals.physMem = GC_physMem (); s->weaks = NULL; s->saveWorldStatus = true; initIntInf (s); initSignalStack (s); worldFile = NULL; unless (isAligned (s->sysvals.pageSize, CARD_SIZE)) die ("Page size must be a multiple of card size."); processAtMLton (s, 0, s->atMLtonsLength, s->atMLtons, &worldFile); res = processAtMLton (s, 1, argc, argv, &worldFile); if (s->controls.fixedHeap > 0 and s->controls.maxHeap > 0) die ("Cannot use both fixed-heap and max-heap."); unless (s->controls.ratios.markCompact <= s->controls.ratios.copy and s->controls.ratios.copy <= s->controls.ratios.live) die ("Ratios must satisfy mark-compact-ratio <= copy-ratio <= live-ratio."); unless (s->controls.ratios.stackCurrentPermitReserved <= s->controls.ratios.stackCurrentMaxReserved) die ("Ratios must satisfy stack-current-permit-reserved <= stack-current-max-reserved."); /* We align s->sysvals.ram by s->sysvals.pageSize so that we can * test whether or not we we are using mark-compact by comparing * heap size to ram size. If we didn't round, the size might be * slightly off. */ uintmax_t ram; ram = alignMax ((uintmax_t)(s->controls.ratios.ramSlop * (double)(s->sysvals.physMem)), (uintmax_t)(s->sysvals.pageSize)); ram = min (ram, alignMaxDown((uintmax_t)SIZE_MAX, (uintmax_t)(s->sysvals.pageSize))); s->sysvals.ram = (size_t)ram; if (DEBUG or DEBUG_RESIZING or s->controls.messages) fprintf (stderr, "[GC: Found %s bytes of RAM; using %s bytes (%.1f%% of RAM).]\n", uintmaxToCommaString(s->sysvals.physMem), uintmaxToCommaString(s->sysvals.ram), 100.0 * ((double)ram / (double)(s->sysvals.physMem))); if (DEBUG_SOURCES or DEBUG_PROFILE) { uint32_t i; for (i = 0; i < s->frameInfosLength; i++) { uint32_t j; const uint32_t *sourceSeq; fprintf (stderr, "%"PRIu32"\n", i); sourceSeq = s->sourceMaps.sourceSeqs[s->frameInfos[i].sourceSeqIndex]; for (j = 1; j <= sourceSeq[0]; j++) fprintf (stderr, "\t%s\n", s->sourceMaps.sourceNames[ s->sourceMaps.sources[sourceSeq[j]].sourceNameIndex ]); } } /* Initialize profiling. This must occur after processing * command-line arguments, because those may just be doing a * show-sources, in which case we don't want to initialize the * atExit. */ initProfiling (s); if (s->amOriginal) { initWorld (s); /* The mutator stack invariant doesn't hold, * because the mutator has yet to run. */ assert (invariantForMutator (s, TRUE, FALSE)); } else { loadWorldFromFileName (s, worldFile); if (s->profiling.isOn and s->profiling.stack) { struct GC_foreachStackFrameClosure enterFrameForProfilingClosure = {.fun = enterFrameForProfiling, .env = NULL}; foreachStackFrame (s, &enterFrameForProfilingClosure); } assert (invariantForMutator (s, TRUE, TRUE)); } s->amInGC = FALSE; return res; } mlton-20210117+dfsg/runtime/gc/init.h000066400000000000000000000010551416264345000172170ustar00rootroot00000000000000/* Copyright (C) 2015 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static int processAtMLton (GC_state s, int start, int argc, char **argv, char **worldFile); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ PRIVATE int GC_init (GC_state s, int argc, char **argv); mlton-20210117+dfsg/runtime/gc/int-inf.c000066400000000000000000000302041416264345000176110ustar00rootroot00000000000000/* Copyright (C) 2012,2014 Matthew Fluet. * Copyright (C) 1999-2005, 2007-2008 Henry Cejtin, Matthew Fluet, * Suresh Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* * Test if a intInf is a fixnum. */ static inline bool isSmall (objptr arg) { return (arg & 1); } static inline bool areSmall (objptr arg1, objptr arg2) { return ((arg1 & arg2) & (objptr)1); } /* * Convert a bignum intInf to a bignum pointer. */ static inline GC_intInf toBignum (GC_state s, objptr arg) { GC_intInf bp; assert (not isSmall(arg)); bp = (GC_intInf)(objptrToPointer(arg, s->heap.start) - (offsetof(struct GC_intInf, obj) + offsetof(struct GC_intInf_obj, isneg))); if (DEBUG_INT_INF) fprintf (stderr, "bp->header = "FMTHDR"\n", bp->header); assert (bp->header == GC_INTINF_HEADER); return bp; } /* * Given an intInf, a pointer to an __mpz_struct and space large * enough to contain LIMBS_PER_OBJPTR + 1 limbs, fill in the * __mpz_struct. */ void fillIntInfArg (GC_state s, objptr arg, __mpz_struct *res, mp_limb_t space[LIMBS_PER_OBJPTR + 1]) { GC_intInf bp; if (DEBUG_INT_INF) fprintf (stderr, "fillIntInfArg ("FMTOBJPTR", "FMTPTR", "FMTPTR")\n", arg, (uintptr_t)res, (uintptr_t)space); if (isSmall(arg)) { res->_mp_alloc = LIMBS_PER_OBJPTR + 1; res->_mp_d = space; if (arg == (objptr)1) { res->_mp_size = 0; } else { const objptr highBitMask = (objptr)1 << (CHAR_BIT * OBJPTR_SIZE - 1); bool neg = (arg & highBitMask) != (objptr)0; if (neg) { arg = -((arg >> 1) | highBitMask); } else { arg = (arg >> 1); } int size; if (sizeof(objptr) <= sizeof(mp_limb_t)) { space[0] = (mp_limb_t)arg; size = 1; } else { size = 0; while (arg != 0) { space[size] = (mp_limb_t)arg; // The conditional below is to quell a gcc warning: // right shift count >= width of type // When (sizeof(objptr) <= sizeof(mp_limb_t)), // this branch is unreachable, // so the shift doesn't matter. arg = arg >> (sizeof(objptr) <= sizeof(mp_limb_t) ? 0 : CHAR_BIT * sizeof(mp_limb_t)); size++; } } if (neg) size = - size; res->_mp_size = size; } } else { bp = toBignum (s, arg); /* The _mp_alloc field is declared as int. * No possibility of an overflowing assignment, as all *huge* * intInfs must have come from some previous GnuMP evaluation. */ res->_mp_alloc = (int)(bp->length - 1); res->_mp_d = (mp_limb_t*)(bp->obj.limbs); res->_mp_size = bp->obj.isneg ? - res->_mp_alloc : res->_mp_alloc; } assert ((res->_mp_size == 0) or (res->_mp_d[(res->_mp_size < 0 ? - res->_mp_size : res->_mp_size) - 1] != 0)); if (DEBUG_INT_INF_DETAILED) fprintf (stderr, "arg --> %s\n", mpz_get_str (NULL, 10, res)); } /* * Initialize an __mpz_struct to use the space provided by the heap. */ void initIntInfRes (GC_state s, __mpz_struct *res, ARG_USED_FOR_ASSERT size_t bytes) { GC_intInf bp; size_t nlimbs; assert (bytes <= (size_t)(s->limitPlusSlop - s->frontier)); bp = (GC_intInf)s->frontier; /* We have as much space for the limbs as there is to the end of the * heap. Divide by (sizeof(mp_limb_t)) to get number of limbs. */ nlimbs = ((size_t)(s->limitPlusSlop - (pointer)bp->obj.limbs)) / (sizeof(mp_limb_t)); /* The _mp_alloc field is declared as int. * Avoid an overflowing assignment, which could happen with huge * heaps. */ res->_mp_alloc = (int)(min(nlimbs,(size_t)INT_MAX)); res->_mp_d = (mp_limb_t*)(bp->obj.limbs); res->_mp_size = 0; /* is this necessary? */ } /* * Given an __mpz_struct pointer which reflects the answer, set * gcState.frontier and return the answer. * If the answer fits in a fixnum, we return that, with the frontier * rolled back. * If the answer doesn't need all of the space allocated, we adjust * the sequence size and roll the frontier slightly back. */ objptr finiIntInfRes (GC_state s, __mpz_struct *res, size_t bytes) { GC_intInf bp; int size; assert ((res->_mp_size == 0) or (res->_mp_d[(res->_mp_size < 0 ? - res->_mp_size : res->_mp_size) - 1] != 0)); if (DEBUG_INT_INF) fprintf (stderr, "finiIntInfRes ("FMTPTR", %"PRIuMAX")\n", (uintptr_t)res, (uintmax_t)bytes); if (DEBUG_INT_INF_DETAILED) fprintf (stderr, "res --> %s\n", mpz_get_str (NULL, 10, res)); bp = (GC_intInf)((pointer)res->_mp_d - (offsetof(struct GC_intInf, obj) + offsetof(struct GC_intInf_obj, limbs))); assert (res->_mp_d == (mp_limb_t*)(bp->obj.limbs)); size = res->_mp_size; if (size < 0) { bp->obj.isneg = TRUE; size = - size; } else bp->obj.isneg = FALSE; assert (size >= 0); if (size == 0) return (objptr)1; if (size <= LIMBS_PER_OBJPTR) { if (sizeof(objptr) <= sizeof(mp_limb_t)) { objptr ans; mp_limb_t val = bp->obj.limbs[0]; if (bp->obj.isneg) { /* * We only fit if val in [1, 2^(CHAR_BIT * OBJPTR_SIZE - 2)]. */ ans = (objptr)(- val); val = val - 1; } else /* * We only fit if val in [0, 2^(CHAR_BIT * OBJPTR_SIZE - 2) - 1]. */ ans = (objptr)val; // The conditional below is to quell a gcc warning: // right shift count >= width of type // When (sizeof(objptr) > sizeof(mp_limb_t)), // this branch is unreachable, // so the shift doesn't matter. if (val < (mp_limb_t)1<<(sizeof(objptr) > sizeof(mp_limb_t) ? 0 : CHAR_BIT * OBJPTR_SIZE - 2)) return (ans<<1 | 1); } else { objptr ans, val; val = (objptr)(bp->obj.limbs[0]); for (int i = 1; i < size; i++) { // The conditional below is to quell a gcc warning: // left shift count >= width of type // When (sizeof(objptr) <= sizeof(mp_limb_t)), // this branch is unreachable, // so the shift doesn't matter. val = val << (sizeof(objptr) <= sizeof(mp_limb_t) ? 0 : CHAR_BIT * sizeof(mp_limb_t)); val = val & (objptr)(bp->obj.limbs[i]); } if (bp->obj.isneg) { /* * We only fit if val in [1, 2^(CHAR_BIT * OBJPTR_SIZE - 2)]. */ ans = - val; val = val - 1; } else /* * We only fit if val in [0, 2^(CHAR_BIT * OBJPTR_SIZE - 2) - 1]. */ ans = val; if (val < (objptr)1<<(CHAR_BIT * OBJPTR_SIZE - 2)) return (ans<<1 | 1); } } setFrontier (s, (pointer)(&bp->obj.limbs[size]), bytes); bp->counter = (GC_sequenceCounter)0; bp->length = (GC_sequenceLength)(size + 1); /* +1 for isneg field */ bp->header = GC_INTINF_HEADER; return pointerToObjptr ((pointer)&bp->obj, s->heap.start); } objptr IntInf_binop (GC_state s, objptr lhs, objptr rhs, size_t bytes, void(*binop)(__mpz_struct *resmpz, const __mpz_struct *lhsspace, const __mpz_struct *rhsspace)) { __mpz_struct lhsmpz, rhsmpz, resmpz; mp_limb_t lhsspace[LIMBS_PER_OBJPTR + 1], rhsspace[LIMBS_PER_OBJPTR + 1]; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_binop ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); initIntInfRes (s, &resmpz, bytes); fillIntInfArg (s, lhs, &lhsmpz, lhsspace); fillIntInfArg (s, rhs, &rhsmpz, rhsspace); binop (&resmpz, &lhsmpz, &rhsmpz); return finiIntInfRes (s, &resmpz, bytes); } objptr IntInf_unop (GC_state s, objptr arg, size_t bytes, void(*unop)(__mpz_struct *resmpz, const __mpz_struct *argspace)) { __mpz_struct argmpz, resmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_unop ("FMTOBJPTR", %"PRIuMAX")\n", arg, (uintmax_t)bytes); initIntInfRes (s, &resmpz, bytes); fillIntInfArg (s, arg, &argmpz, argspace); unop (&resmpz, &argmpz); return finiIntInfRes (s, &resmpz, bytes); } objptr IntInf_shop (GC_state s, objptr arg, Word32_t shift, size_t bytes, void(*shop)(__mpz_struct *resmpz, const __mpz_struct *argspace, unsigned long shift)) { __mpz_struct argmpz, resmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_shop ("FMTOBJPTR", %"PRIu32", %"PRIuMAX")\n", arg, shift, (uintmax_t)bytes); initIntInfRes (s, &resmpz, bytes); fillIntInfArg (s, arg, &argmpz, argspace); shop (&resmpz, &argmpz, (unsigned long)shift); return finiIntInfRes (s, &resmpz, bytes); } Int32_t IntInf_cmpop (GC_state s, objptr lhs, objptr rhs, int(*cmpop)(const __mpz_struct *lhsspace, const __mpz_struct *rhsspace)) { __mpz_struct lhsmpz, rhsmpz; mp_limb_t lhsspace[LIMBS_PER_OBJPTR + 1], rhsspace[LIMBS_PER_OBJPTR + 1]; int res; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_cmpop ("FMTOBJPTR", "FMTOBJPTR")\n", lhs, rhs); fillIntInfArg (s, lhs, &lhsmpz, lhsspace); fillIntInfArg (s, rhs, &rhsmpz, rhsspace); res = cmpop (&lhsmpz, &rhsmpz); if (res < 0) return -1; if (res > 0) return 1; return 0; } objptr IntInf_strop (GC_state s, objptr arg, Int32_t base, size_t bytes, char*(*strop)(char *str, int base, const __mpz_struct *argspace)) { GC_string8 sp; __mpz_struct argmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; char *str; size_t size; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_strop ("FMTOBJPTR", %"PRId32", %"PRIuMAX")\n", arg, base, (uintmax_t)bytes); assert (base == 2 || base == 8 || base == 10 || base == 16); fillIntInfArg (s, arg, &argmpz, argspace); assert (bytes <= (size_t)(s->limitPlusSlop - s->frontier)); sp = (GC_string8)s->frontier; str = strop ((void*)&sp->obj, -base, &argmpz); assert (str == (char*)&sp->obj); size = strlen(str); if (sp->obj.chars[0] == '-') sp->obj.chars[0] = '~'; setFrontier (s, (pointer)&sp->obj + size, bytes); sp->counter = (GC_sequenceCounter)0; sp->length = (GC_sequenceLength)size; sp->header = GC_STRING8_HEADER; return pointerToObjptr ((pointer)&sp->obj, s->heap.start); } /* static GC_state intInfMemoryFuncsState; static void * wrap_alloc_func(size_t size) { if (DEBUG_INT_INF) fprintf (stderr, "alloc_func (size = %"PRIuMAX") = ", (uintmax_t)size); void * res = (*alloc_func_ptr)(size); if (DEBUG_INT_INF) fprintf (stderr, FMTPTR"\n", (uintptr_t)res); return res; } static void * wrap_realloc_func(void *ptr, size_t old_size, size_t new_size) { if (DEBUG_INT_INF) fprintf (stderr, "realloc_func (ptr = "FMTPTR", " "old_size = %"PRIuMAX", new_size = %"PRIuMAX") = ", (uintptr_t)ptr, (uintmax_t)old_size, (uintmax_t)new_size); assert (! isPointerInHeap(intInfMemoryFuncsState, (pointer)ptr)); void * res = (*realloc_func_ptr)(ptr, old_size, new_size); if (DEBUG_INT_INF) fprintf (stderr, FMTPTR"\n", (uintptr_t)res); return res; } static void wrap_free_func(void *ptr, size_t size) { if (DEBUG_INT_INF) fprintf (stderr, "free_func (ptr = "FMTPTR", size = %"PRIuMAX")", (uintptr_t)ptr, (uintmax_t)size); assert (! isPointerInHeap(intInfMemoryFuncsState, (pointer)ptr)); (*free_func_ptr)(ptr, size); if (DEBUG_INT_INF) fprintf (stderr, "\n"); return; } void initIntInf (GC_state s) { intInfMemoryFuncsState = s; mp_get_memory_functions (&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); mp_set_memory_functions (&wrap_alloc_func, &wrap_realloc_func, &wrap_free_func); return; } */ void initIntInf (__attribute__ ((unused)) GC_state s) { return; } mlton-20210117+dfsg/runtime/gc/int-inf.h000066400000000000000000000072231416264345000176230ustar00rootroot00000000000000/* Copyright (C) 2012,2014 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Layout of intInfs. * Note, the value passed around is a pointer to the obj member. */ struct GC_intInf_obj { mp_limb_t isneg; mp_limb_t limbs[1]; }; typedef struct GC_intInf { GC_sequenceCounter counter; GC_sequenceLength length; GC_header header; struct GC_intInf_obj obj; } __attribute__ ((packed)) *GC_intInf; COMPILE_TIME_ASSERT(GC_intInf__obj_packed, offsetof(struct GC_intInf, obj) == sizeof(GC_sequenceCounter) + sizeof(GC_sequenceLength) + sizeof(GC_header)); COMPILE_TIME_ASSERT(GC_intInf_obj__isneg_packed, offsetof(struct GC_intInf_obj, isneg) == 0); COMPILE_TIME_ASSERT(GC_intInf_obj__limbs_packed, offsetof(struct GC_intInf_obj, limbs) == 0 + sizeof(mp_limb_t)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) COMPILE_TIME_ASSERT(sizeof_mp_limb_t__is_four_or_eight, (sizeof(mp_limb_t) == 4 || sizeof(mp_limb_t) == 8)); #define GC_INTINF_HEADER ( \ CHAR_BIT * sizeof(mp_limb_t) == 32 ? \ GC_WORD32_VECTOR_HEADER : ( \ CHAR_BIT * sizeof(mp_limb_t) == 64 ? \ GC_WORD64_VECTOR_HEADER : ( 0 ) ) ) COMPILE_TIME_ASSERT(sizeof_mp_limb_t__compat__sizeof_objptr, sizeof(objptr) <= sizeof(mp_limb_t) ? sizeof(mp_limb_t) % sizeof(objptr) == 0 : sizeof(objptr) % sizeof(mp_limb_t) == 0); #define LIMBS_PER_OBJPTR ( \ sizeof(mp_limb_t) >= sizeof(objptr) ? \ 1 : (int)(sizeof(objptr) / sizeof(mp_limb_t))) PRIVATE void initIntInf (GC_state s); static inline void fillIntInfArg (GC_state s, objptr arg, __mpz_struct *res, mp_limb_t space[LIMBS_PER_OBJPTR + 1]); static inline void initIntInfRes (GC_state s, __mpz_struct *res, size_t bytes); static inline objptr finiIntInfRes (GC_state s, __mpz_struct *res, size_t bytes); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE objptr IntInf_binop (GC_state s, objptr lhs, objptr rhs, size_t bytes, void(*binop)(__mpz_struct *resmpz, const __mpz_struct *lhsspace, const __mpz_struct *rhsspace)); PRIVATE objptr IntInf_unop (GC_state s, objptr arg, size_t bytes, void(*unop)(__mpz_struct *resmpz, const __mpz_struct *argspace)); PRIVATE objptr IntInf_shop (GC_state s, objptr arg, Word32_t shift, size_t bytes, void(*shop)(__mpz_struct *resmpz, const __mpz_struct *argspace, unsigned long shift)); PRIVATE Int32_t IntInf_cmpop (GC_state s, objptr lhs, objptr rhs, int(*cmpop)(const __mpz_struct *lhsspace, const __mpz_struct *rhsspace)); PRIVATE objptr IntInf_strop (GC_state s, objptr arg, Int32_t base, size_t bytes, char*(*strop)(char *str, int base, const __mpz_struct *argspace)); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/invariant.c000066400000000000000000000153541416264345000202510ustar00rootroot00000000000000/* Copyright (C) 2011-2012,2017,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if ASSERT void assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeap (GC_state s, objptr *opp, __attribute__((unused)) void *env) { assert (isObjptrInFromSpace (s, *opp) || isObjptrInImmutableMutableOrRootStaticHeap (s, *opp)); unless (isObjptrInFromSpace (s, *opp) || isObjptrInImmutableMutableOrRootStaticHeap (s, *opp)) { displayGCState (s, stderr); die ("gc.c: assertIsObjptrInFromSpace " "opp = "FMTPTR" " "*opp = "FMTOBJPTR"\n", (uintptr_t)opp, *opp); } /* The following checks that intergenerational pointers have the * appropriate card marked. Unfortunately, it doesn't work because * for stacks, the card containing the beginning of the stack is * marked, but any remaining cards aren't. */ if (FALSE and s->mutatorMarksCards and isPointerInOldGen (s, (pointer)opp) and isObjptrInNursery (s, *opp) and not isCardMarked (s, (pointer)opp)) { displayGCState (s, stderr); die ("gc.c: intergenerational pointer from "FMTPTR" to "FMTOBJPTR" with unmarked card.\n", (uintptr_t)opp, *opp); } } void assertIsObjptrInImmutableMutableOrRootStaticHeap (GC_state s, objptr *opp, __attribute__((unused)) void *env) { assert (isObjptrInImmutableMutableOrRootStaticHeap (s, *opp)); } bool invariantForGC (GC_state s) { if (DEBUG) fprintf (stderr, "invariantForGC\n"); /* Frame sizes and offsets */ for (GC_frameIndex frameIndex = 0; frameIndex < s->frameInfosLength; ++frameIndex) { GC_frameInfo frameInfo; frameInfo = &(s->frameInfos[frameIndex]); if (frameInfo->size > 0) { GC_frameOffsets offsets; assert (frameInfo->size <= s->maxFrameSize); offsets = frameInfo->offsets; for (unsigned int j = 0; j < offsets[0]; ++j) assert (offsets[j + 1] < frameInfo->size); } } /* Generational */ if (s->mutatorMarksCards) { assert (s->generationalMaps.cardMap == &(s->generationalMaps.cardMapAbsolute [pointerToCardMapIndexAbsolute(s->heap.start)])); assert (&(s->generationalMaps.cardMapAbsolute [pointerToCardMapIndexAbsolute(s->heap.start + s->heap.size - 1)]) < (s->generationalMaps.cardMap + (s->generationalMaps.cardMapLength * CARD_MAP_ELEM_SIZE))); } assert (isAligned (s->heap.size, s->sysvals.pageSize)); assert (isAligned ((size_t)s->heap.start, CARD_SIZE)); assert (isFrontierAligned (s, s->heap.start + s->heap.oldGenSize)); assert (isFrontierAligned (s, s->heap.nursery)); assert (isFrontierAligned (s, s->frontier)); assert (s->heap.start + s->heap.oldGenSize <= s->heap.nursery); assert (s->heap.nursery <= s->heap.start + s->heap.size); assert (s->heap.nursery <= s->frontier); unless (0 == s->heap.size) { assert (s->frontier <= s->limitPlusSlop); assert (s->limit == s->limitPlusSlop - GC_HEAP_LIMIT_SLOP); assert (hasHeapBytesFree (s, 0, 0)); } assert (s->secondaryHeap.start == NULL or s->heap.size == s->secondaryHeap.size); struct GC_foreachObjptrClosure assertIsObjptrInImmutableMutableOrRootStaticHeapClosure = {.fun = assertIsObjptrInImmutableMutableOrRootStaticHeap, .env = NULL}; struct GC_foreachObjptrClosure assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeapClosure = {.fun = assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeap, .env = NULL}; /* The immutable and mutable static heaps may only have pointers into static heaps. */ if (DEBUG_DETAILED) fprintf (stderr, "Checking immutable static heap.\n"); foreachObjptrInStaticHeap (s, &s->staticHeaps.immutable, &assertIsObjptrInImmutableMutableOrRootStaticHeapClosure, FALSE); if (DEBUG_DETAILED) fprintf (stderr, "Checking mutable static heap.\n"); foreachObjptrInStaticHeap (s, &s->staticHeaps.mutable, &assertIsObjptrInImmutableMutableOrRootStaticHeapClosure, FALSE); /* The root static heap may have pointers into the runtime heap and static heaps. */ if (DEBUG_DETAILED) fprintf (stderr, "Checking root static heap.\n"); foreachObjptrInStaticHeap (s, &s->staticHeaps.root, &assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeapClosure, FALSE); /* Global objptrs may be into runtime heap. */ if (DEBUG_DETAILED) fprintf (stderr, "Checking global objptrs.\n"); foreachGlobalObjptr (s, &assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeapClosure); /* The runtime heap may have pointers into the runtime heap and static heaps. */ pointer back = s->heap.start + s->heap.oldGenSize; if (DEBUG_DETAILED) fprintf (stderr, "Checking old generation.\n"); foreachObjptrInRange (s, alignFrontier (s, s->heap.start), &back, &assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeapClosure, FALSE); if (DEBUG_DETAILED) fprintf (stderr, "Checking nursery.\n"); foreachObjptrInRange (s, s->heap.nursery, &s->frontier, &assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeapClosure, FALSE); /* Current thread. */ if (DEBUG_DETAILED) fprintf (stderr, "Checking current thread/stack.\n"); GC_stack stack = getStackCurrent(s); assert (isStackReservedAligned (s, stack->reserved)); assert (s->stackBottom == getStackBottom (s, stack)); assert (s->stackTop == getStackTop (s, stack)); assert (s->stackLimit == getStackLimit (s, stack)); assert (s->stackBottom <= s->stackTop); assert (stack->used == sizeofGCStateCurrentStackUsed (s)); assert (stack->used <= stack->reserved); if (DEBUG) fprintf (stderr, "invariantForGC passed\n"); return TRUE; } #endif bool invariantForMutatorFrontier (GC_state s) { GC_thread thread = getThreadCurrent(s); return (thread->bytesNeeded <= (size_t)(s->limitPlusSlop - s->frontier)); } bool invariantForMutatorStack (GC_state s) { GC_stack stack = getStackCurrent(s); return (getStackTop (s, stack) <= getStackLimit (s, stack) + getStackTopFrameSize (s, stack)); } #if ASSERT bool invariantForMutator (GC_state s, bool frontier, bool stack) { if (DEBUG) displayGCState (s, stderr); if (frontier) assert (invariantForMutatorFrontier(s)); if (stack) assert (invariantForMutatorStack(s)); assert (invariantForGC (s)); return TRUE; } #endif mlton-20210117+dfsg/runtime/gc/invariant.h000066400000000000000000000015621416264345000202520ustar00rootroot00000000000000/* Copyright (C) 2012,2019-2020 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #if ASSERT static inline void assertIsObjptrInFromSpaceOrImmutableMutableOrRootStaticHeap (GC_state s, objptr *opp, void *env); static inline void assertIsObjptrInImmutableMutableOrRootStaticHeap (GC_state s, objptr *opp, void *env); static bool invariantForGC (GC_state s); #endif static inline bool invariantForMutatorFrontier (GC_state s); static inline bool invariantForMutatorStack (GC_state s); #if ASSERT static bool invariantForMutator (GC_state s, bool frontier, bool stack); #endif #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/major.h000066400000000000000000000006271416264345000173700ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { GC_COPYING, GC_MARK_COMPACT, } GC_majorKind; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20210117+dfsg/runtime/gc/mark-compact.c000066400000000000000000000343211416264345000206270ustar00rootroot00000000000000/* Copyright (C) 2010,2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Jonkers Mark-compact Collection */ /* ---------------------------------------------------------------- */ void copyForThreadInternal (pointer dst, pointer src) { if (FALSE) fprintf (stderr, "copyForThreadInternal dst = "FMTPTR" src = "FMTPTR"\n", (uintptr_t)dst, (uintptr_t)src); if (OBJPTR_SIZE > GC_HEADER_SIZE) { size_t count; assert (0 == (OBJPTR_SIZE % GC_HEADER_SIZE)); count = (OBJPTR_SIZE - GC_HEADER_SIZE) / GC_HEADER_SIZE; src = src + GC_HEADER_SIZE * count; for (size_t i = 0; i <= count; i++) { *((GC_header*)dst) = *((GC_header*)src); dst += GC_HEADER_SIZE; src -= GC_HEADER_SIZE; } } else if (GC_HEADER_SIZE > OBJPTR_SIZE) { size_t count; assert (0 == (GC_HEADER_SIZE % OBJPTR_SIZE)); count = (GC_HEADER_SIZE - OBJPTR_SIZE) / OBJPTR_SIZE; dst = dst + OBJPTR_SIZE * count; for (size_t i = 0; i <= count; i++) { *((objptr*)dst) = *((objptr*)src); dst -= OBJPTR_SIZE; src += OBJPTR_SIZE; } } else /* (GC_HEADER_SIZE == OBJPTR_SIZE) */ { *((GC_header*)dst) = *((GC_header*)src); } } void threadInternalObjptr (GC_state s, objptr *opp, __attribute__((unused)) void *env) { objptr opop; pointer p; GC_header *headerp; opop = pointerToObjptr ((pointer)opp, s->heap.start); p = objptrToPointer (*opp, s->heap.start); if (not isPointerInHeap (s, p)) return; if (FALSE) fprintf (stderr, "threadInternal opp = "FMTPTR" p = "FMTPTR" header = "FMTHDR"\n", (uintptr_t)opp, (uintptr_t)p, getHeader (p)); headerp = getHeaderp (p); copyForThreadInternal ((pointer)(opp), (pointer)(headerp)); copyForThreadInternal ((pointer)(headerp), (pointer)(&opop)); } /* If the object pointer is valid, and points to an unmarked object, * then clear the object pointer. */ void updateWeaksForMarkCompact (GC_state s) { pointer p; GC_weak w; for (w = s->weaks; w != NULL; w = w->link) { assert (BOGUS_OBJPTR != w->objptr); if (DEBUG_WEAK) fprintf (stderr, "updateWeaksForMarkCompact w = "FMTPTR" ", (uintptr_t)w); p = objptrToPointer(w->objptr, s->heap.start); /* If it's unmarked, clear the weak pointer. */ if (isPointerMarked(p)) { if (DEBUG_WEAK) fprintf (stderr, "not cleared\n"); } else { if (DEBUG_WEAK) fprintf (stderr, "cleared\n"); *(getHeaderp((pointer)w - offsetofWeak (s))) = GC_WEAK_GONE_HEADER | MARK_MASK; w->objptr = BOGUS_OBJPTR; } } s->weaks = NULL; } void updateForwardPointersForMarkCompact (GC_state s, GC_stack currentStack) { pointer back; pointer endOfLastMarked; pointer front; size_t gap; GC_header header; GC_header *headerp; pointer p; size_t size, skipFront, skipGap; if (DEBUG_MARK_COMPACT) fprintf (stderr, "Update forward pointers.\n"); front = alignFrontier (s, s->heap.start); back = s->heap.start + s->heap.oldGenSize; gap = 0; endOfLastMarked = front; updateObject: if (DEBUG_MARK_COMPACT) fprintf (stderr, "updateObject front = "FMTPTR" back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)back); if (front == back) goto done; p = advanceToObjectData (s, front); headerp = getHeaderp (p); header = *headerp; if (GC_VALID_HEADER_MASK & header) { /* It's a header */ if (MARK_MASK & header) { /* It is marked, but has no forward pointers. * Thread internal pointers. */ thread: assert (GC_VALID_HEADER_MASK & header); assert (MARK_MASK & header); size_t metaDataBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; assert (header == getHeader (p)); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ metaDataBytes = GC_NORMAL_METADATA_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skipFront = 0; skipGap = 0; } else if (SEQUENCE_TAG == tag) { metaDataBytes = GC_SEQUENCE_METADATA_SIZE; objectBytes = sizeofSequenceNoMetaData (s, getSequenceLength (p), bytesNonObjptrs, numObjptrs); skipFront = 0; skipGap = 0; } else { /* Stack. */ bool current; size_t reservedNew, reservedOld; GC_stack stack; assert (STACK_TAG == tag); metaDataBytes = GC_STACK_METADATA_SIZE; stack = (GC_stack)p; current = currentStack == stack; reservedOld = stack->reserved; reservedNew = sizeofStackShrinkReserved (s, stack, current); objectBytes = sizeof (struct GC_stack) + stack->used; skipFront = reservedOld - stack->used; skipGap = reservedOld - reservedNew; } size = metaDataBytes + objectBytes; if (DEBUG_MARK_COMPACT) fprintf (stderr, "threading "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); if ((size_t)(front - endOfLastMarked) >= GC_SEQUENCE_METADATA_SIZE) { pointer newSequence = endOfLastMarked; /* Compress all of the unmarked into one sequence. We require * GC_SEQUENCE_METADATA_SIZE space to be available because that is * the smallest possible sequence. */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "compressing from "FMTPTR" to "FMTPTR" (length = %"PRIuMAX")\n", (uintptr_t)endOfLastMarked, (uintptr_t)front, (uintmax_t)(front - endOfLastMarked)); *((GC_sequenceCounter*)(newSequence)) = 0; newSequence += GC_SEQUENCE_COUNTER_SIZE; *((GC_sequenceLength*)(newSequence)) = ((size_t)(front - endOfLastMarked)) - GC_SEQUENCE_METADATA_SIZE; newSequence += GC_SEQUENCE_LENGTH_SIZE; *((GC_header*)(newSequence)) = GC_WORD8_VECTOR_HEADER; } gap += skipGap; front += size + skipFront; endOfLastMarked = front; struct GC_foreachObjptrClosure threadInternalObjptrClosure = {.fun = threadInternalObjptr, .env = NULL}; foreachObjptrInObject (s, p, &threadInternalObjptrClosure, FALSE); goto updateObject; } else { /* It's not marked. */ size = sizeofObject (s, p); gap += size; front += size; goto updateObject; } } else { pointer new; objptr newObjptr; assert (not (GC_VALID_HEADER_MASK & header)); assert (isPointerInHeap (s, (pointer)headerp)); /* It's a pointer. This object must be live. Fix all the forward * pointers to it, store its header, then thread its internal * pointers. */ new = p - gap; newObjptr = pointerToObjptr (new, s->heap.start); do { pointer cur; objptr curObjptr; copyForThreadInternal ((pointer)(&curObjptr), (pointer)headerp); cur = objptrToPointer (curObjptr, s->heap.start); copyForThreadInternal ((pointer)headerp, cur); *((objptr*)cur) = newObjptr; header = *headerp; } while (0 == (1 & header)); goto thread; } assert (FALSE); done: return; } void updateBackwardPointersAndSlideForMarkCompact (GC_state s, GC_stack currentStack) { pointer back; pointer front; size_t gap; GC_header header; GC_header *headerp; pointer p; size_t size, skipFront, skipGap; if (DEBUG_MARK_COMPACT) fprintf (stderr, "Update backward pointers and slide.\n"); front = alignFrontier (s, s->heap.start); back = s->heap.start + s->heap.oldGenSize; gap = 0; updateObject: if (DEBUG_MARK_COMPACT) fprintf (stderr, "updateObject front = "FMTPTR" back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)back); if (front == back) goto done; p = advanceToObjectData (s, front); headerp = getHeaderp (p); header = *headerp; if (GC_VALID_HEADER_MASK & header) { /* It's a header */ if (MARK_MASK & header) { /* It is marked, but has no backward pointers to it. * Unmark it. */ unmark: assert (GC_VALID_HEADER_MASK & header); assert (MARK_MASK & header); size_t metaDataBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; assert (header == getHeader (p)); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ metaDataBytes = GC_NORMAL_METADATA_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skipFront = 0; skipGap = 0; } else if (SEQUENCE_TAG == tag) { metaDataBytes = GC_SEQUENCE_METADATA_SIZE; objectBytes = sizeofSequenceNoMetaData (s, getSequenceLength (p), bytesNonObjptrs, numObjptrs); skipFront = 0; skipGap = 0; } else { /* Stack. */ bool current; size_t reservedNew, reservedOld; GC_stack stack; assert (STACK_TAG == tag); metaDataBytes = GC_STACK_METADATA_SIZE; stack = (GC_stack)p; current = currentStack == stack; reservedOld = stack->reserved; reservedNew = sizeofStackShrinkReserved (s, stack, current); if (reservedNew < stack->reserved) { if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Shrinking stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(stack->reserved), uintmaxToCommaString(reservedNew), uintmaxToCommaString(stack->used)); stack->reserved = reservedNew; } objectBytes = sizeof (struct GC_stack) + stack->used; skipFront = reservedOld - stack->used; skipGap = reservedOld - reservedNew; } size = metaDataBytes + objectBytes; /* unmark */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "unmarking "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); *headerp = header & ~MARK_MASK; /* slide */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "sliding "FMTPTR" down %"PRIuMAX" to "FMTPTR"\n", (uintptr_t)front, (uintmax_t)gap, (uintptr_t)(front - gap)); GC_memmove (front, front - gap, size); gap += skipGap; front += size + skipFront; goto updateObject; } else { /* It's not marked. */ size = sizeofObject (s, p); if (DEBUG_MARK_COMPACT) fprintf (stderr, "skipping "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); gap += size; front += size; goto updateObject; } } else { pointer new; objptr newObjptr; assert (not (GC_VALID_HEADER_MASK & header)); assert (isPointerInHeap (s, (pointer)headerp)); /* It's a pointer. This object must be live. Fix all the * backward pointers to it. Then unmark it. */ new = p - gap; newObjptr = pointerToObjptr (new, s->heap.start); do { pointer cur; objptr curObjptr; copyForThreadInternal ((pointer)(&curObjptr), (pointer)headerp); cur = objptrToPointer (curObjptr, s->heap.start); copyForThreadInternal ((pointer)headerp, cur); *((objptr*)cur) = newObjptr; header = *headerp; } while (0 == (1 & header)); /* The unmarked header will be stored by unmark. */ goto unmark; } assert (FALSE); done: s->heap.oldGenSize = (size_t)((front - gap) - s->heap.start); if (DEBUG_MARK_COMPACT) fprintf (stderr, "oldGenSize = %"PRIuMAX"\n", (uintmax_t)s->heap.oldGenSize); return; } void majorMarkCompactGC (GC_state s) { size_t bytesHashConsed; size_t bytesMarkCompacted; GC_stack currentStack; struct rusage ru_start; if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numMarkCompactGCs++; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Starting major mark-compact;]\n"); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); } currentStack = getStackCurrent (s); struct GC_markState markState; markState.mode = MARK_MODE; markState.size = 0; if (s->hashConsDuringGC) { s->lastMajorStatistics.bytesHashConsed = 0; s->cumulativeStatistics.numHashConsGCs++; s->objectHashTable = allocHashTable (s); markState.shouldHashCons = TRUE; } else { markState.shouldHashCons = FALSE; } markState.shouldLinkWeaks = TRUE; struct GC_foreachObjptrClosure dfsMarkObjptrClosure = {.fun = dfsMarkObjptrFun, .env = &markState}; foreachGlobalObjptr (s, &dfsMarkObjptrClosure); if (s->hashConsDuringGC) { freeHashTable (s->objectHashTable); } updateWeaksForMarkCompact (s); struct GC_foreachObjptrClosure threadInternalObjptrClosure = {.fun = threadInternalObjptr, .env = NULL}; foreachGlobalObjptr (s, &threadInternalObjptrClosure); updateForwardPointersForMarkCompact (s, currentStack); updateBackwardPointersAndSlideForMarkCompact (s, currentStack); bytesHashConsed = s->lastMajorStatistics.bytesHashConsed; s->cumulativeStatistics.bytesHashConsed += bytesHashConsed; bytesMarkCompacted = s->heap.oldGenSize; s->cumulativeStatistics.bytesMarkCompacted += bytesMarkCompacted; s->lastMajorStatistics.kind = GC_MARK_COMPACT; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcMarkCompact); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Finished major mark-compact; mark compacted %s bytes.]\n", uintmaxToCommaString(bytesMarkCompacted)); if (s->hashConsDuringGC) printBytesHashConsedMessage(bytesHashConsed, bytesHashConsed + bytesMarkCompacted); } } mlton-20210117+dfsg/runtime/gc/mark-compact.h000066400000000000000000000014521416264345000206330ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void copyForThreadInternal (pointer dst, pointer src); static inline void threadInternalObjptr (GC_state s, objptr *opp, void *env); static inline void updateWeaksForMarkCompact (GC_state s); static void updateForwardPointersForMarkCompact (GC_state s, GC_stack currentStack); static void updateBackwardPointersAndSlideForMarkCompact (GC_state s, GC_stack currentStack); static void majorMarkCompactGC (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/model.c000066400000000000000000000003101416264345000173400ustar00rootroot00000000000000/* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ mlton-20210117+dfsg/runtime/gc/model.h000066400000000000000000000130731416264345000173570ustar00rootroot00000000000000/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Consider the following schemes for representing object pointers and mapping them to 64-bit native pointers. A. 32 bits, with bottom two bits zero. B. 32 bits, with bottom bit zero, shift left by one. C. 32 bits, with bottom bit zero, shift left by two. D. 32 bits, shift left by two. E. 32 bits, shift left by three. F. 40 bits, with bottom two bits zero. G. 64 bits, with bottom two bits zero. These schemes vary in the number of bits to represent a pointer in an object, the time to load a pointer from memory into a register, the amount of addressable memory, and the object alignment. bits time mem(G) align A 32 fast 4 4 B 32 slow 8 4 C 32 slow 16 8 D 32 slow 16 4 E 32 slow 32 8 F 40 slow 256 4 G 64 fast 4G 4 Each of the (A-F) has a variant (AX-FX) in which pointers are added to some constant base address. This gives access to any region in the virtual address space instead of just the low addresses. The following diagram demonstrates what portion of the native pointer to which the object pointer corresponds. 64 32 0 | | | ----------------------------------------------------------------- ==============================00 A ===============================0 B ===============================0 C ================================ D ================================= E ======================================00 F ==============================================================00 G Algorithmically, we can compute the native pointer (P) from the object pointer (O) (with bitsize Z), given a shift (S) and a base (B): P = %add64(%shl64(%zxZ_64(O),S),B) Likewise, we can compute the object pointer (O) from the native pointer (P), given a shift (S) and a base (B): O = %lobits64_Z(%shr64(%sub64(P,B),S)) Hence, each of the schemes may be characterized by the size Z of the object pointer, the shift S, and whether or not the base B is zero. Noting that %zx64_64(x) = x %shl64(x, 0) = x %add64(x, 0) = x %lobits64_64(x) = x %shr64(x, 0) = x %sub64(x, 0) = x it is easy to compute the number of ALU operations required by each scheme: A :: Z = 32, S == 0, B == 0 ops = 1 AX :: Z = 32, S == 0, B != 0 ops = 2 B :: Z = 32, S == 1, B == 0 ops = 2 BX :: Z = 32, S == 1, B != 0 ops = 3 C :: Z = 32, S == 2, B == 0 ops = 2 CX :: Z = 32, S == 2, B != 0 ops = 3 D :: Z = 32, S == 2, B == 0 ops = 2 DX :: Z = 32, S == 2, B != 0 ops = 3 E :: Z = 32, S == 3, B == 0 ops = 2 EX :: Z = 32, S == 3, B != 0 ops = 3 F :: Z = 40, S == 0, B == 0 ops = 1 (#) FX :: Z = 40, S == 0, B != 0 ops = 2 (#) G :: Z = 64, S == 0, B == 0 ops = 0 #: In schemes F and FX, the conversion from object pointer to native pointer requires logical-shift-right, rather than zero-extend, since the object pointer would be fetched from memory as a 64-bit value. The cost may actually be higher, as storing an object pointer in memory requires some care so as not to overwrite neighboring data. It is not clear that any of the thirteen schemes dominates another. Here are some thoughts. (A) This is is what we have now, but is still useful on 64-bit machines where the bottom 4G may be less cluttered than on a 32-bit machine. (AX) seems like a nice cost/benefit tradeoff for a program that only needs 4G of memory, since the base can be used to find a contiguous 4G somewhere in the address space. (B) and (C) are similar, the tradeoff being to increase object alignment requirements in order to allow more memory. Importantly, pointers having a bottom zero bit means that we can still set the bottom bit to one to represent small values in sum types. (D) and (E) are problematic because they leave no room to represent small objects in sum types with pointers. I think that really rules them out. (F) costs some in object alignment because a sequence of pointers in an object may have to be padded to meet 4-byte alignment. Loading a pointer from memory into a register may be slightly faster than in (B) or (C) because we don't have to shift, but I wonder if that matters. (G) costs the most in space, but has the fastest load time for pointers of the schemes that allow access to 4G of memory. A reasonable tradeoff in implementation complexity vs allowing our users enough flexibility might be to provide: A, AX, B, BX, C, CX, G After some experiments on those, we might be able to find a more manageable set for users. */ #if defined (GC_MODEL_NATIVE32) #define GC_MODEL_OBJPTR_SIZE 32 #define GC_MODEL_OBJPTR_SHIFT 0 #define GC_MODEL_OBJPTR_BASE 0 #define GC_MODEL_HEADER_SIZE 32 #define GC_MODEL_SEQLEN_SIZE 32 #elif defined (GC_MODEL_NATIVE64) #define GC_MODEL_OBJPTR_SIZE 64 #define GC_MODEL_OBJPTR_SHIFT 0 #define GC_MODEL_OBJPTR_BASE 0 #define GC_MODEL_HEADER_SIZE 64 #define GC_MODEL_SEQLEN_SIZE 64 #else #error GC_MODEL_* undefined #endif #define GC_MODEL_MINALIGN_SHIFT max(2, GC_MODEL_OBJPTR_SHIFT + 1) #define GC_MODEL_MINALIGN TWOPOWER(GC_MODEL_MINALIGN_SHIFT) #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20210117+dfsg/runtime/gc/new-object.c000066400000000000000000000066131416264345000203110ustar00rootroot00000000000000/* Copyright (C) 2012,2016 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* newObject (s, header, bytesRequested, allocInOldGen) * * Allocate a new object in the heap. * bytesRequested includes the size of the header. */ pointer newObject (GC_state s, GC_header header, size_t bytesRequested, bool allocInOldGen) { pointer frontier; pointer result; assert (isAligned (bytesRequested, s->alignment)); assert (allocInOldGen ? hasHeapBytesFree (s, bytesRequested, 0) : hasHeapBytesFree (s, 0, bytesRequested)); if (allocInOldGen) { frontier = s->heap.start + s->heap.oldGenSize; s->heap.oldGenSize += bytesRequested; s->cumulativeStatistics.bytesAllocated += bytesRequested; } else { if (DEBUG_DETAILED) fprintf (stderr, "frontier changed from "FMTPTR" to "FMTPTR"\n", (uintptr_t)s->frontier, (uintptr_t)(s->frontier + bytesRequested)); frontier = s->frontier; s->frontier += bytesRequested; } GC_profileAllocInc (s, bytesRequested); *((GC_header*)frontier) = header; result = frontier + GC_HEADER_SIZE; assert (isAligned ((size_t)result, s->alignment)); if (DEBUG) fprintf (stderr, FMTPTR " = newObject ("FMTHDR", %"PRIuMAX", %s)\n", (uintptr_t)result, header, (uintmax_t)bytesRequested, boolToString (allocInOldGen)); return result; } GC_stack newStack (GC_state s, size_t reserved, bool allocInOldGen) { GC_stack stack; assert (isStackReservedAligned (s, reserved)); if (reserved > s->cumulativeStatistics.maxStackSize) s->cumulativeStatistics.maxStackSize = reserved; stack = (GC_stack)(newObject (s, GC_STACK_HEADER, sizeofStackWithMetaData (s, reserved), allocInOldGen)); stack->reserved = reserved; stack->used = 0; if (DEBUG_STACKS) fprintf (stderr, FMTPTR " = newStack (%"PRIuMAX")\n", (uintptr_t)stack, (uintmax_t)reserved); return stack; } GC_thread newThread (GC_state s, size_t reserved) { GC_stack stack; GC_thread thread; pointer res; assert (isStackReservedAligned (s, reserved)); ensureHasHeapBytesFree (s, 0, sizeofStackWithMetaData (s, reserved) + sizeofThread (s)); stack = newStack (s, reserved, FALSE); res = newObject (s, GC_THREAD_HEADER, sizeofThread (s), FALSE); thread = (GC_thread)(res + offsetofThread (s)); thread->bytesNeeded = 0; thread->exnStack = BOGUS_EXN_STACK; thread->stack = pointerToObjptr((pointer)stack, s->heap.start); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = newThreadOfSize (%"PRIuMAX")\n", (uintptr_t)thread, (uintmax_t)reserved);; return thread; } static inline void setFrontier (GC_state s, pointer p, ARG_USED_FOR_ASSERT size_t bytes) { p = alignFrontier (s, p); assert ((size_t)(p - s->frontier) <= bytes); GC_profileAllocInc (s, (size_t)(p - s->frontier)); s->cumulativeStatistics.bytesAllocated += (size_t)(p - s->frontier); s->frontier = p; assert (s->frontier <= s->limitPlusSlop); } mlton-20210117+dfsg/runtime/gc/new-object.h000066400000000000000000000012711416264345000203110ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline pointer newObject (GC_state s, GC_header header, size_t bytesRequested, bool allocInOldGen); static inline GC_stack newStack (GC_state s, size_t reserved, bool allocInOldGen); static GC_thread newThread (GC_state s, size_t stackSize); static inline void setFrontier (GC_state s, pointer p, size_t bytes); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/object-size.c000066400000000000000000000037601416264345000204720ustar00rootroot00000000000000/* Copyright (C) 2016-2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ size_t sizeofSequenceNoMetaData (GC_state s, GC_sequenceLength numElements, uint16_t bytesNonObjptrs, uint16_t numObjptrs) { size_t result; result = numElements * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); return alignWithExtra (s, result, GC_SEQUENCE_METADATA_SIZE); } size_t sizeofStackNoMetaData (__attribute__ ((unused)) GC_state s, GC_stack stack) { size_t result; result = sizeof (struct GC_stack) + stack->reserved; return result; } void sizeofObjectAux (GC_state s, pointer p, size_t* metaDataBytes, size_t* objectBytes) { GC_header header; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; header = getHeader (p); splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { *metaDataBytes = GC_NORMAL_METADATA_SIZE; *objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); } else if (SEQUENCE_TAG == tag) { *metaDataBytes = GC_SEQUENCE_METADATA_SIZE; *objectBytes = sizeofSequenceNoMetaData (s, getSequenceLength (p), bytesNonObjptrs, numObjptrs); } else { /* Stack. */ assert (STACK_TAG == tag); *metaDataBytes = GC_STACK_METADATA_SIZE; *objectBytes = sizeofStackNoMetaData (s, (GC_stack)p); } } size_t sizeofObject (GC_state s, pointer p) { size_t metaDataBytes, objectBytes; sizeofObjectAux(s, p, &metaDataBytes, &objectBytes); return metaDataBytes + objectBytes; } size_t sizeofObjectNoMetaData (GC_state s, pointer p) { size_t metaDataBytes, objectBytes; sizeofObjectAux(s, p, &metaDataBytes, &objectBytes); return objectBytes; } mlton-20210117+dfsg/runtime/gc/object-size.h000066400000000000000000000016221416264345000204720ustar00rootroot00000000000000/* Copyright (C) 2016-2017 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofSequenceNoMetaData (GC_state s, GC_sequenceLength numElements, uint16_t bytesNonObjptrs, uint16_t numObjptrs); static inline size_t sizeofStackNoMetaData (GC_state s, GC_stack stack); static inline void sizeofObjectAux (GC_state s, pointer p, size_t* metaDataBytes, size_t* objectBytes); static inline size_t sizeofObject (GC_state s, pointer p); static inline size_t sizeofObjectNoMetaData (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/object.c000066400000000000000000000063141416264345000175200ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ const char * objectTypeTagToString (GC_objectTypeTag tag) { switch (tag) { case SEQUENCE_TAG: return "SEQUENCE"; case NORMAL_TAG: return "NORMAL"; case STACK_TAG: return "STACK"; case WEAK_TAG: return "WEAK"; default: die ("bad GC_objectTypeTag %u", tag); } } /* getHeaderp (p) * * Returns a pointer to the header for the object pointed to by p. */ GC_header* getHeaderp (pointer p) { return (GC_header*)(p - GC_HEADER_SIZE); } /* getHeader (p) * * Returns the header for the object pointed to by p. */ GC_header getHeader (pointer p) { return *(getHeaderp(p)); } /* * Build the header for an object, given the index to its type info. */ GC_header buildHeaderFromTypeIndex (uint32_t t) { assert (t < TWOPOWER (TYPE_INDEX_BITS)); return 1 | (t << 1); } void splitHeader(GC_state s, GC_header header, GC_objectTypeTag *tagRet, bool *hasIdentityRet, uint16_t *bytesNonObjptrsRet, uint16_t *numObjptrsRet) { unsigned int objectTypeIndex; GC_objectType objectType; GC_objectTypeTag tag; bool hasIdentity; uint16_t bytesNonObjptrs, numObjptrs; assert (1 == (header & GC_VALID_HEADER_MASK)); objectTypeIndex = (header & TYPE_INDEX_MASK) >> TYPE_INDEX_SHIFT; assert (objectTypeIndex < s->objectTypesLength); objectType = &(s->objectTypes[objectTypeIndex]); tag = objectType->tag; hasIdentity = objectType->hasIdentity; bytesNonObjptrs = objectType->bytesNonObjptrs; numObjptrs = objectType->numObjptrs; if (DEBUG_DETAILED) fprintf (stderr, "splitHeader ("FMTHDR")" " objectTypeIndex = %u" " tag = %s" " hasIdentity = %s" " bytesNonObjptrs = %"PRIu16 " numObjptrs = %"PRIu16"\n", header, objectTypeIndex, objectTypeTagToString(tag), boolToString(hasIdentity), bytesNonObjptrs, numObjptrs); if (tagRet != NULL) *tagRet = tag; if (hasIdentityRet != NULL) *hasIdentityRet = hasIdentity; if (bytesNonObjptrsRet != NULL) *bytesNonObjptrsRet = bytesNonObjptrs; if (numObjptrsRet != NULL) *numObjptrsRet = numObjptrs; } /* advanceToObjectData (s, p) * * If p points at the beginning of an object, then advanceToObjectData * returns a pointer to the start of the object data. */ pointer advanceToObjectData (ARG_USED_FOR_ASSERT GC_state s, pointer p) { GC_header header; pointer res; assert (isFrontierAligned (s, p)); header = *(GC_header*)p; if (0 == header) /* Looking at the counter word in a sequence. */ res = p + GC_SEQUENCE_METADATA_SIZE; else /* Looking at a header word. */ res = p + GC_NORMAL_METADATA_SIZE; assert (isAligned ((uintptr_t)res, s->alignment)); if (DEBUG_DETAILED) fprintf (stderr, FMTPTR" = advanceToObjectData ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)p); return res; } mlton-20210117+dfsg/runtime/gc/object.h000066400000000000000000000137741416264345000175350ustar00rootroot00000000000000/* Copyright (C) 2016,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * There are four kinds of ML objects: * normal (fixed size), sequence, stack, and weak. */ typedef enum { /* The tag indices here must agree with those in declareObjectTypes() * in codegen/c-codegen/c-codegen.fun. */ NORMAL_TAG = 0, SEQUENCE_TAG = 1, STACK_TAG = 2, WEAK_TAG = 3, } GC_objectTypeTag; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static const char * objectTypeTagToString (GC_objectTypeTag tag); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Each object has a header, which immediately precedes the object data. * A header has the following bit layout: * * 00 : 1 * 01 - 19 : type index bits, index into GC_state->objectTypes. * 20 - 30 : counter bits, used by mark compact GC (initially 0) * 31 : mark bit, used by mark compact GC (initially 0) * 32 - 63 : 0wx00000000 (only w/ 64-bit header) */ #define GC_HEADER_TYPE__(z) uint ## z ## _t #define GC_HEADER_TYPE_(z) GC_HEADER_TYPE__(z) #define GC_HEADER_TYPE GC_HEADER_TYPE_(GC_MODEL_HEADER_SIZE) typedef GC_HEADER_TYPE GC_header; #define GC_HEADER_SIZE sizeof(GC_header) #define PRIxHDR__(z) PRIx ## z #define PRIxHDR_(z) PRIxHDR__(z) #define PRIxHDR PRIxHDR_(GC_MODEL_HEADER_SIZE) #define FMTHDR "%08"PRIxHDR COMPILE_TIME_ASSERT(sizeof_objptr__eq__sizeof_header, sizeof(objptr) == sizeof(GC_header)); #define GC_VALID_HEADER_MASK ((GC_header)0x1) #define TYPE_INDEX_BITS 19 #define TYPE_INDEX_MASK ((GC_header)0x000FFFFE) #define TYPE_INDEX_SHIFT 1 #define COUNTER_BITS 10 #define COUNTER_MASK ((GC_header)0x7FF00000) #define COUNTER_SHIFT 20 #define MARK_BITS 1 #define MARK_MASK ((GC_header)0x80000000) #define MARK_SHIFT 31 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_header* getHeaderp (pointer p); static inline GC_header getHeader (pointer p); static inline GC_header buildHeaderFromTypeIndex (uint32_t t); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Normal objects have the following layout: * * header :: * (non heap-pointers)* :: * (heap pointers)* * * Note that the non heap-pointers denote a sequence of primitive data * values. These data values need not map directly to values of the * native word size. MLton's aggressive representation strategies may * pack multiple primitive values into the same native word. * Likewise, a primitive value may span multiple native words (e.g., * Word64.word on an x86). */ #define GC_NORMAL_METADATA_SIZE (GC_HEADER_SIZE) #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ /* Sequence objects are described in "sequence.h" */ /* Stack objects are described in "stack.h" */ /* Weak objects are described in "weak.h" */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * The type index of a header is an index into an array of object * types, where each element describes the layout of an object. The * object types array is declared as: * * GC_objectType *objectTypes; * * The objectTypes pointer is initialized to point to a static array * of object types that is emitted for each compiled program. The * hasIdentity field indicates whether or not the object has mutable * fields, in which case it may not be hash-cons-ed. In a normal * object, the bytesNonObjptrs field indicates the number of bytes of * non heap-pointer data, while the numObjptrs field indicates the * number of heap pointers. In a sequence object, the bytesNonObjptrs * field indicates the number of bytes of non heap-pointer data in a * single sequence element, while the numObjptrs field indicates the * number of heap pointers in a single sequence element. In a stack * object, the bytesNonObjptrs and numObjptrs fields are irrelevant. * In a weak object, the bytesNonObjptrs and numObjptrs fields are * interpreted as in a normal object. */ typedef const struct GC_objectType { /* Keep tag first, at zero offset, since it is referenced most often. */ const GC_objectTypeTag tag; const bool hasIdentity; const uint16_t bytesNonObjptrs; const uint16_t numObjptrs; } *GC_objectType; enum { /* The type indices here must agree with those in backend/rep-type.fun. */ STACK_TYPE_INDEX = 0, THREAD_TYPE_INDEX = 1, WEAK_GONE_TYPE_INDEX = 2, REAL32_VECTOR_TYPE_INDEX = 3, REAL64_VECTOR_TYPE_INDEX = 4, WORD8_VECTOR_TYPE_INDEX = 5, WORD32_VECTOR_TYPE_INDEX = 6, WORD16_VECTOR_TYPE_INDEX = 7, WORD64_VECTOR_TYPE_INDEX = 8, }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define GC_STACK_HEADER buildHeaderFromTypeIndex (STACK_TYPE_INDEX) #define GC_THREAD_HEADER buildHeaderFromTypeIndex (THREAD_TYPE_INDEX) #define GC_WEAK_GONE_HEADER buildHeaderFromTypeIndex (WEAK_GONE_TYPE_INDEX) #define GC_REAL32_VECTOR_HEADER buildHeaderFromTypeIndex (REAL32_VECTOR_TYPE_INDEX) #define GC_REAL64_VECTOR_HEADER buildHeaderFromTypeIndex (REAL64_VECTOR_TYPE_INDEX) #define GC_WORD8_VECTOR_HEADER buildHeaderFromTypeIndex (WORD8_VECTOR_TYPE_INDEX) #define GC_WORD16_VECTOR_HEADER buildHeaderFromTypeIndex (WORD16_VECTOR_TYPE_INDEX) #define GC_WORD32_VECTOR_HEADER buildHeaderFromTypeIndex (WORD32_VECTOR_TYPE_INDEX) #define GC_WORD64_VECTOR_HEADER buildHeaderFromTypeIndex (WORD64_VECTOR_TYPE_INDEX) static inline void splitHeader (GC_state s, GC_header header, GC_objectTypeTag *tagRet, bool *hasIdentityRet, uint16_t *bytesNonObjptrsRet, uint16_t *numObjptrsRet); static inline pointer advanceToObjectData (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/objptr.c000066400000000000000000000035671416264345000175610ustar00rootroot00000000000000/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* isObjptr returns true if p looks like an object pointer. */ bool isObjptr (objptr p) { unsigned int shift = GC_MODEL_MINALIGN_SHIFT - GC_MODEL_OBJPTR_SHIFT; objptr mask = ~((~((objptr)0)) << shift); return (0 == (p & mask)); } pointer objptrToPointer (objptr O, pointer B) { uintptr_t O_ = (uintptr_t)O; uintptr_t B_; unsigned int S_ = GC_MODEL_OBJPTR_SHIFT; uintptr_t P_; pointer P; if (GC_MODEL_OBJPTR_BASE) { B_ = (uintptr_t)B; } else { B_ = 0; } P_ = ((O_ << S_) + B_); P = (pointer)P_; if (DEBUG_OBJPTR) fprintf (stderr, "objptrToPointer ("FMTOBJPTR") = "FMTPTR"\n", O, (uintptr_t)P); return P; } objptr pointerToObjptr (pointer P, pointer B) { uintptr_t P_ = (uintptr_t)P; uintptr_t B_; unsigned int S_ = GC_MODEL_OBJPTR_SHIFT; uintptr_t O_; objptr O; if (GC_MODEL_OBJPTR_BASE) { B_ = (uintptr_t)B; } else { B_ = 0; } O_ = ((P_ - B_) >> S_); O = (objptr)O_; if (DEBUG_OBJPTR) fprintf (stderr, "pointerToObjptr ("FMTPTR") = "FMTOBJPTR"\n", (uintptr_t)P, O); return O; } /* * Note that by indirectly fetching and storing object pointers, the * following functions admit implementations that behave according to * model characteristics determined at runtime. Hence, by making * exclusive use of these functions (and adding a GC_state->model * field set by the compiled program), we may be able to implement the * runtime in a manner which is agnostic to the actual objptr * representation. */ pointer fetchObjptrToPointer (pointer OP, pointer B) { return objptrToPointer (*((objptr*)OP), B); } void storeObjptrFromPointer (pointer OP, pointer P, pointer B) { *((objptr*)OP) = pointerToObjptr (P, B); } mlton-20210117+dfsg/runtime/gc/objptr.h000066400000000000000000000022611416264345000175540ustar00rootroot00000000000000/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) #define OBJPTR_TYPE__(z) uint ## z ## _t #define OBJPTR_TYPE_(z) OBJPTR_TYPE__(z) #define OBJPTR_TYPE OBJPTR_TYPE_(GC_MODEL_OBJPTR_SIZE) typedef OBJPTR_TYPE objptr; #define OBJPTR_SIZE sizeof(objptr) #define PRIxOBJPTR__(z) PRIx ## z #define PRIxOBJPTR_(z) PRIxOBJPTR__(z) #define PRIxOBJPTR PRIxOBJPTR_(GC_MODEL_OBJPTR_SIZE) #define FMTOBJPTR "0x%016"PRIxOBJPTR COMPILE_TIME_ASSERT(sizeof_voidStar__gte__sizeof_objptr, sizeof(void*) >= sizeof(objptr)); #define BOGUS_OBJPTR (objptr)0x1 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isObjptr (objptr p); static inline pointer objptrToPointer (objptr O, pointer B); static inline objptr pointerToObjptr (pointer P, pointer B); static inline pointer fetchObjptrToPointer (pointer OP, pointer B); static inline void storeObjptrFromPointer (pointer OP, pointer P, pointer B); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/pack.c000066400000000000000000000042331416264345000171660ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void GC_pack (GC_state s) { size_t keep; enter (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Packing heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); /* Could put some code here to skip the GC if there hasn't been much * allocated since the last collection. But you would still need to * do a minor GC to make all objects contiguous. */ performGC (s, 0, 0, TRUE, FALSE); keep = (size_t)(s->heap.oldGenSize * 1.1); if (keep <= s->heap.size) { shrinkHeap (s, &s->heap, keep); setCardMapAndCrossMap (s); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); } releaseHeap (s, &s->secondaryHeap); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Packed heap at "FMTPTR" to size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); leave (s); } void GC_unpack (GC_state s) { enter (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Unpacking heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); /* The enterGC is needed here because minorGC and resizeHeap might * move the stack, and the SIGPROF catcher would then see a bogus * stack. The leaveGC has to happen after the setStack. */ enterGC (s); minorGC (s); resizeHeap (s, s->heap.oldGenSize); setCardMapAndCrossMap (s); resizeHeapSecondary (s); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); leaveGC (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Unpacked heap at "FMTPTR" to size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); leave (s); } mlton-20210117+dfsg/runtime/gc/pack.h000066400000000000000000000006371416264345000171770ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_pack (GC_state s); PRIVATE void GC_unpack (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/pointer.c000066400000000000000000000006761416264345000177370ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* isPointer returns true if p looks like a pointer. */ bool isPointer (pointer p) { uintptr_t mask = ~((~((uintptr_t)0)) << GC_MODEL_MINALIGN_SHIFT); return (0 == ((uintptr_t)p & mask)); } mlton-20210117+dfsg/runtime/gc/pointer.h000066400000000000000000000006451416264345000177400ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define BOGUS_POINTER (pointer)0x1 static inline bool isPointer (pointer p); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20210117+dfsg/runtime/gc/profiling.c000066400000000000000000000361361416264345000202500ustar00rootroot00000000000000/* Copyright (C) 2011-2012,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ GC_profileMasterIndex sourceIndexToProfileMasterIndex (GC_state s, GC_sourceIndex i) { GC_profileMasterIndex pmi; pmi = s->sourceMaps.sources[i].sourceNameIndex + s->sourceMaps.sourcesLength; if (DEBUG_PROFILE) fprintf (stderr, "%"PRIu32" = sourceIndexToProfileMasterIndex ("FMTSI")\n", pmi, i); return pmi; } GC_sourceNameIndex profileMasterIndexToSourceNameIndex (GC_state s, GC_profileMasterIndex i) { assert (i >= s->sourceMaps.sourcesLength); return i - s->sourceMaps.sourcesLength; } const char * profileIndexSourceName (GC_state s, GC_sourceIndex i) { const char *res; if (i < s->sourceMaps.sourcesLength) res = getSourceName (s, i); else res = s->sourceMaps.sourceNames[profileMasterIndexToSourceNameIndex (s, i)]; return res; } GC_profileStack getProfileStackInfo (GC_state s, GC_profileMasterIndex i) { assert (s->profiling.data != NULL); return &(s->profiling.data->stack[i]); } static int profileDepth = 0; static void profileIndent (void) { int i; for (i = 0; i < profileDepth; ++i) fprintf (stderr, " "); } void addToStackForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); if (DEBUG_PROFILE) fprintf (stderr, "adding %s to stack lastTotal = %"PRIuMAX" lastTotalGC = %"PRIuMAX"\n", getSourceName (s, i), (uintmax_t)p->total, (uintmax_t)p->totalGC); ps->lastTotal = p->total; ps->lastTotalGC = p->totalGC; } void enterSourceForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileStack ps; ps = getProfileStackInfo (s, i); // assert (ps->numOccurrences >= 0); ps->numOccurrences++; if (1 == ps->numOccurrences) { addToStackForProfiling (s, i); } } void enterForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex) { uint32_t i; GC_sourceIndex sourceIndex; const uint32_t *sourceSeq; if (DEBUG_PROFILE) fprintf (stderr, "enterForProfiling ("FMTSSI")\n", sourceSeqIndex); assert (s->profiling.stack); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; for (i = 1; i <= sourceSeq[0]; i++) { sourceIndex = sourceSeq[i]; if (DEBUG_ENTER_LEAVE or DEBUG_PROFILE) { profileIndent (); fprintf (stderr, "(entering %s\n", getSourceName (s, sourceIndex)); profileDepth++; } enterSourceForProfiling (s, (GC_profileMasterIndex)sourceIndex); enterSourceForProfiling (s, sourceIndexToProfileMasterIndex (s, sourceIndex)); } } void enterFrameForProfiling (GC_state s, __attribute__((unused)) GC_frameIndex frameIndex, GC_frameInfo frameInfo, __attribute__((unused)) pointer frameTop, __attribute__((unused)) void *env) { enterForProfiling (s, frameInfo->sourceSeqIndex); } void GC_profileEnter (GC_state s) { enterForProfiling (s, getCachedStackTopFrameSourceSeqIndex (s)); } void removeFromStackForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); if (DEBUG_PROFILE) fprintf (stderr, "removing %s from stack ticksInc = %"PRIuMAX" ticksGCInc = %"PRIuMAX"\n", profileIndexSourceName (s, i), (uintmax_t)(p->total - ps->lastTotal), (uintmax_t)(p->totalGC - ps->lastTotalGC)); ps->ticks += p->total - ps->lastTotal; ps->ticksGC += p->totalGC - ps->lastTotalGC; } void leaveSourceForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileStack ps; ps = getProfileStackInfo (s, i); assert (ps->numOccurrences > 0); ps->numOccurrences--; if (0 == ps->numOccurrences) removeFromStackForProfiling (s, i); } void leaveForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex) { uint32_t i; GC_sourceIndex sourceIndex; const uint32_t *sourceSeq; if (DEBUG_PROFILE) fprintf (stderr, "leaveForProfiling ("FMTSSI")\n", sourceSeqIndex); assert (s->profiling.stack); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; for (i = sourceSeq[0]; i > 0; i--) { sourceIndex = sourceSeq[i]; if (DEBUG_ENTER_LEAVE or DEBUG_PROFILE) { profileDepth--; profileIndent (); fprintf (stderr, "leaving %s)\n", getSourceName (s, sourceIndex)); } leaveSourceForProfiling (s, (GC_profileMasterIndex)sourceIndex); leaveSourceForProfiling (s, sourceIndexToProfileMasterIndex (s, sourceIndex)); } } void GC_profileLeave (GC_state s) { leaveForProfiling (s, getCachedStackTopFrameSourceSeqIndex (s)); } void incForProfiling (GC_state s, size_t amount, GC_sourceSeqIndex sourceSeqIndex) { const uint32_t *sourceSeq; GC_sourceIndex topSourceIndex; if (DEBUG_PROFILE) fprintf (stderr, "incForProfiling (%"PRIuMAX", "FMTSSI")\n", (uintmax_t)amount, sourceSeqIndex); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; topSourceIndex = sourceSeq[0] > 0 ? sourceSeq[sourceSeq[0]] : UNKNOWN_SOURCE_INDEX; if (DEBUG_PROFILE) { profileIndent (); fprintf (stderr, "bumping %s by %"PRIuMAX"\n", getSourceName (s, topSourceIndex), (uintmax_t)amount); } s->profiling.data->countTop[topSourceIndex] += amount; s->profiling.data->countTop[sourceIndexToProfileMasterIndex (s, topSourceIndex)] += amount; if (s->profiling.stack) enterForProfiling (s, sourceSeqIndex); if (GC_SOURCE_INDEX == topSourceIndex) s->profiling.data->totalGC += amount; else s->profiling.data->total += amount; if (s->profiling.stack) leaveForProfiling (s, sourceSeqIndex); } void GC_profileInc (GC_state s, size_t amount) { if (DEBUG_PROFILE) fprintf (stderr, "GC_profileInc (%"PRIuMAX")\n", (uintmax_t)amount); incForProfiling (s, amount, s->amInGC ? GC_SOURCE_SEQ_INDEX : getCachedStackTopFrameSourceSeqIndex (s)); } void GC_profileAllocInc (GC_state s, size_t amount) { if (s->profiling.isOn and (PROFILE_ALLOC == s->profiling.kind)) { if (DEBUG_PROFILE) fprintf (stderr, "GC_profileAllocInc (%"PRIuMAX")\n", (uintmax_t)amount); GC_profileInc (s, amount); } } GC_profileData profileMalloc (GC_state s) { GC_profileData p; uint32_t profileMasterLength; p = (GC_profileData)(malloc_safe (sizeof(*p))); p->total = 0; p->totalGC = 0; profileMasterLength = s->sourceMaps.sourcesLength + s->sourceMaps.sourceNamesLength; p->countTop = (uintmax_t*)(calloc_safe(profileMasterLength, sizeof(*(p->countTop)))); if (s->profiling.stack) p->stack = (struct GC_profileStack *) (calloc_safe(profileMasterLength, sizeof(*(p->stack)))); if (DEBUG_PROFILE) fprintf (stderr, FMTPTR" = profileMalloc ()\n", (uintptr_t)p); return p; } GC_profileData GC_profileMalloc (GC_state s) { return profileMalloc (s); } void profileFree (GC_state s, GC_profileData p) { if (DEBUG_PROFILE) fprintf (stderr, "profileFree ("FMTPTR")\n", (uintptr_t)p); free (p->countTop); if (s->profiling.stack) free (p->stack); free (p); } void GC_profileFree (GC_state s, GC_profileData p) { profileFree (s, p); } void writeProfileCount (GC_state s, FILE *f, GC_profileData p, GC_profileMasterIndex i) { writeUintmaxU (f, p->countTop[i]); if (s->profiling.stack) { GC_profileStack ps; ps = &(p->stack[i]); writeString (f, " "); writeUintmaxU (f, ps->ticks); writeString (f, " "); writeUintmaxU (f, ps->ticksGC); } writeNewline (f); } void profileWrite (GC_state s, GC_profileData p, const char *fileName) { FILE *f; const char* kind; if (DEBUG_PROFILE) fprintf (stderr, "profileWrite("FMTPTR",%s)\n", (uintptr_t)p, fileName); f = fopen_safe (fileName, "wb"); writeString (f, "MLton prof\n"); switch (s->profiling.kind) { case PROFILE_ALLOC: kind = "alloc\n"; break; case PROFILE_COUNT: kind = "count\n"; break; case PROFILE_NONE: die ("impossible PROFILE_NONE"); // break; case PROFILE_TIME_FIELD: kind = "time\n"; break; case PROFILE_TIME_LABEL: kind = "time\n"; break; default: kind = ""; assert (FALSE); } writeString (f, kind); writeString (f, s->profiling.stack ? "stack\n" : "current\n"); writeUint32X (f, s->magic); writeNewline (f); writeUintmaxU (f, p->total); writeString (f, " "); writeUintmaxU (f, p->totalGC); writeNewline (f); writeUint32U (f, s->sourceMaps.sourcesLength); writeNewline (f); for (GC_sourceIndex i = 0; i < s->sourceMaps.sourcesLength; i++) writeProfileCount (s, f, p, (GC_profileMasterIndex)i); writeUint32U (f, s->sourceMaps.sourceNamesLength); writeNewline (f); for (GC_sourceNameIndex i = 0; i < s->sourceMaps.sourceNamesLength; i++) writeProfileCount (s, f, p, (GC_profileMasterIndex)(i + s->sourceMaps.sourcesLength)); fclose_safe (f); } void GC_profileWrite (GC_state s, GC_profileData p, NullString8_t fileName) { profileWrite (s, p, (const char*)fileName); } void setProfTimer (suseconds_t usec) { struct itimerval iv; iv.it_interval.tv_sec = 0; iv.it_interval.tv_usec = usec; iv.it_value.tv_sec = 0; iv.it_value.tv_usec = usec; unless (0 == setitimer (ITIMER_PROF, &iv, NULL)) die ("setProfTimer: setitimer failed"); } #if not HAS_TIME_PROFILING /* No time profiling on this platform. There is a check in * mlton/main/main.fun to make sure that time profiling is never * turned on. */ __attribute__ ((noreturn)) void initProfilingTime (__attribute__ ((unused)) GC_state s) { die ("no time profiling"); } #else static GC_state handleSigProfState; void GC_handleSigProf (code_pointer pc) { GC_frameIndex frameIndex; GC_state s; GC_sourceSeqIndex sourceSeqIndex; s = handleSigProfState; if (DEBUG_PROFILE) fprintf (stderr, "GC_handleSigProf ("FMTPTR")\n", (uintptr_t)pc); if (s->amInGC) sourceSeqIndex = GC_SOURCE_SEQ_INDEX; else { frameIndex = getCachedStackTopFrameIndex (s); if (C_FRAME == s->frameInfos[frameIndex].kind) sourceSeqIndex = s->frameInfos[frameIndex].sourceSeqIndex; else { if (PROFILE_TIME_LABEL == s->profiling.kind) { uint32_t start, end, i; /* Binary search labels to find which method contains PC */ start = 0; end = s->sourceMaps.profileLabelInfosLength; while (end - start > 1) { i = (start+end)/2; if ((uintptr_t)s->sourceMaps.profileLabelInfos[i].profileLabel <= (uintptr_t)pc) start = i; else end = i; } i = start; /* The last label is dead code. Any address past it is thus unknown. * The first label is before all SML code. Before it is also unknown. */ if (i-1 == s->sourceMaps.profileLabelInfosLength || (i == 0 && (uintptr_t)pc < (uintptr_t)s->sourceMaps.profileLabelInfos[i].profileLabel)) { if (DEBUG_PROFILE) fprintf (stderr, "pc out of bounds\n"); sourceSeqIndex = UNKNOWN_SOURCE_SEQ_INDEX; } else { sourceSeqIndex = s->sourceMaps.profileLabelInfos[start].sourceSeqIndex; } } else { sourceSeqIndex = s->sourceMaps.curSourceSeqIndex; } } } incForProfiling (s, 1, sourceSeqIndex); } static void initProfilingTime (GC_state s) { struct sigaction sa; s->profiling.data = profileMalloc (s); if (PROFILE_TIME_LABEL == s->profiling.kind) { initProfileLabelInfos (s); } else { s->sourceMaps.curSourceSeqIndex = UNKNOWN_SOURCE_SEQ_INDEX; } /* * Install catcher, which handles SIGPROF and calls MLton_Profile_inc. * * One thing I should point out that I discovered the hard way: If * the call to sigaction does NOT specify the SA_ONSTACK flag, then * even if you have called sigaltstack(), it will NOT switch stacks, * so you will probably die. Worse, if the call to sigaction DOES * have SA_ONSTACK and you have NOT called sigaltstack(), it still * switches stacks (to location 0) and you die of a SEGV. Thus the * sigaction() call MUST occur after the call to sigaltstack(), and * in order to have profiling cover as much as possible, you want it * to occur right after the sigaltstack() call. */ handleSigProfState = s; sigemptyset (&sa.sa_mask); GC_setSigProfHandler (&sa); unless (sigaction (SIGPROF, &sa, NULL) == 0) diee ("initProfilingTime: sigaction failed"); /* Start the SIGPROF timer. */ setProfTimer (10000); } #endif /* atexitForProfiling is for writing out an mlmon.out file even if the C code * terminates abnormally, e.g. due to running out of memory. It will * only run if the usual SML profile atExit cleanup code did not * manage to run. */ static GC_state atexitForProfilingState; void atexitForProfiling (void) { GC_state s; if (DEBUG_PROFILE) fprintf (stderr, "atexitForProfiling ()\n"); s = atexitForProfilingState; if (s->profiling.isOn) { fprintf (stderr, "profiling is on\n"); profileWrite (s, s->profiling.data, "mlmon.out"); } } void initProfiling (GC_state s) { if (PROFILE_NONE == s->profiling.kind) s->profiling.isOn = FALSE; else { s->profiling.isOn = TRUE; switch (s->profiling.kind) { case PROFILE_ALLOC: case PROFILE_COUNT: s->profiling.data = profileMalloc (s); break; case PROFILE_NONE: die ("impossible PROFILE_NONE"); // break; case PROFILE_TIME_FIELD: case PROFILE_TIME_LABEL: initProfilingTime (s); break; default: assert (FALSE); } atexitForProfilingState = s; atexit (atexitForProfiling); } } void GC_profileDone (GC_state s) { GC_profileData p; GC_profileMasterIndex profileMasterIndex; if (DEBUG_PROFILE) fprintf (stderr, "GC_profileDone ()\n"); assert (s->profiling.isOn); if (PROFILE_TIME_FIELD == s->profiling.kind or PROFILE_TIME_LABEL == s->profiling.kind) setProfTimer (0); s->profiling.isOn = FALSE; p = s->profiling.data; if (s->profiling.stack) { uint32_t profileMasterLength = s->sourceMaps.sourcesLength + s->sourceMaps.sourceNamesLength; for (profileMasterIndex = 0; profileMasterIndex < profileMasterLength; profileMasterIndex++) { if (p->stack[profileMasterIndex].numOccurrences > 0) { if (DEBUG_PROFILE) fprintf (stderr, "done leaving %s\n", profileIndexSourceName (s, profileMasterIndex)); removeFromStackForProfiling (s, profileMasterIndex); } } } } GC_profileData GC_getProfileCurrent (GC_state s) { return s->profiling.data; } void GC_setProfileCurrent (GC_state s, GC_profileData p) { s->profiling.data = p; } mlton-20210117+dfsg/runtime/gc/profiling.h000066400000000000000000000116501416264345000202470ustar00rootroot00000000000000/* Copyright (C) 2012,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { PROFILE_ALLOC, PROFILE_COUNT, PROFILE_NONE, PROFILE_TIME_FIELD, PROFILE_TIME_LABEL } GC_profileKind; /* If profileStack, then there is one struct GC_profileStack for each * function. */ typedef struct GC_profileStack { /* ticks counts ticks while the function was on the stack. */ uintmax_t ticks; /* ticksGC counts ticks in GC while the function was on the stack. */ uintmax_t ticksGC; /* lastTotal is the value of total when the oldest occurrence of f * on the stack was pushed, i.e., the most recent time that * numTimesOnStack changed from 0 to 1. lastTotal is used to * compute the amount to attribute to f when the oldest occurrence * is finally popped. */ uintmax_t lastTotal; /* lastTotalGC is like lastTotal, but for GC ticks. */ uintmax_t lastTotalGC; /* numOccurrences is the number of times this function is on the * stack. */ uintmax_t numOccurrences; } *GC_profileStack; typedef uint32_t GC_profileMasterIndex; /* GC_profileData is used for both time and allocation profiling. * In the comments below, "ticks" mean clock ticks with time profiling and * bytes allocated with allocation profiling. * * All of the arrays in GC_profileData are of length sourcesLength + sourceNamesLength. * The first sourceLength entries are for handling the duplicate copies of * functions, and the next sourceNamesLength entries are for the master versions. */ typedef struct GC_profileData { /* countTop is an array that counts for each function the number of * ticks that occurred while the function was on top of the stack. */ uintmax_t *countTop; /* stack is an array that gives stack info for each function. * It is only used if profileStack. */ struct GC_profileStack *stack; /* The total number of mutator ticks. */ uintmax_t total; /* The total number of GC ticks. */ uintmax_t totalGC; } *GC_profileData; struct GC_profiling { GC_profileData data; bool isOn; GC_profileKind kind; bool stack; }; #else struct GC_profileData; typedef struct GC_profileData *GC_profileData; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_profileMasterIndex sourceIndexToProfileMasterIndex (GC_state s, GC_sourceIndex i); static inline GC_sourceNameIndex profileMasterIndexToSourceNameIndex (GC_state s, GC_profileMasterIndex i); static inline GC_profileStack getProfileStackInfo (GC_state s, GC_profileMasterIndex i); static inline void addToStackForProfiling (GC_state s, GC_profileMasterIndex i); static inline void enterSourceForProfiling (GC_state s, GC_profileMasterIndex i); static inline void enterForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex); static inline void enterFrameForProfiling (GC_state s, GC_frameIndex frameIndex, GC_frameInfo frameInfo, pointer frameTop, void *env); static inline void removeFromStackForProfiling (GC_state s, GC_profileMasterIndex i); static inline void leaveSourceForProfiling (GC_state s, GC_profileMasterIndex i); static inline void leaveForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex); static inline void incForProfiling (GC_state s, size_t amount, GC_sourceSeqIndex sourceSeqIndex); static inline const char * profileIndexSourceName (GC_state s, GC_sourceIndex i); static void writeProfileCount (GC_state s, FILE *f, GC_profileData p, GC_profileMasterIndex i); PRIVATE GC_profileData profileMalloc (GC_state s); PRIVATE void profileWrite (GC_state s, GC_profileData p, const char* fileName); PRIVATE void profileFree (GC_state s, GC_profileData p); static void setProfTimer (suseconds_t usec); static void initProfilingTime (GC_state s); static void atexitForProfiling (void); static void initProfiling (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_profileEnter (GC_state s); PRIVATE void GC_profileLeave (GC_state s); PRIVATE void GC_profileInc (GC_state s, size_t amount); PRIVATE void GC_profileAllocInc (GC_state s, size_t amount); PRIVATE GC_profileData GC_getProfileCurrent (GC_state s); PRIVATE void GC_setProfileCurrent (GC_state s, GC_profileData p); PRIVATE GC_profileData GC_profileMalloc (GC_state s); PRIVATE void GC_profileWrite (GC_state s, GC_profileData p, NullString8_t fileName); PRIVATE void GC_profileFree (GC_state s, GC_profileData p); PRIVATE void GC_profileDone (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE void GC_handleSigProf (code_pointer pc); mlton-20210117+dfsg/runtime/gc/read_write.c000066400000000000000000000013411416264345000203720ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static inline objptr readObjptr (FILE *f) { objptr res; fread_safe (&res, sizeof(objptr), 1, f); return res; } static inline pointer readPointer (FILE *f) { uintptr_t res; fread_safe (&res, sizeof(uintptr_t), 1, f); return (pointer)res; } static inline void writeObjptr (FILE *f, objptr op) { fwrite_safe (&op, sizeof(objptr), 1, f); } static inline void writePointer (FILE *f, pointer p) { uintptr_t u = (uintptr_t)p; fwrite_safe (&u, sizeof(uintptr_t), 1, f); } mlton-20210117+dfsg/runtime/gc/rusage.c000066400000000000000000000045471416264345000175460ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void rusageZero (struct rusage *ru) { memset (ru, 0, sizeof (*ru)); } void rusagePlusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru) { const int million = 1000000; time_t sec; suseconds_t usec; sec = ru1->ru_utime.tv_sec + ru2->ru_utime.tv_sec; usec = ru1->ru_utime.tv_usec + ru2->ru_utime.tv_usec; sec += (usec / million); usec %= million; ru->ru_utime.tv_sec = sec; ru->ru_utime.tv_usec = usec; sec = ru1->ru_stime.tv_sec + ru2->ru_stime.tv_sec; usec = ru1->ru_stime.tv_usec + ru2->ru_stime.tv_usec; sec += (usec / million); usec %= million; ru->ru_stime.tv_sec = sec; ru->ru_stime.tv_usec = usec; } void rusageMinusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru) { const int million = 1000000; time_t sec; suseconds_t usec; sec = (ru1->ru_utime.tv_sec - ru2->ru_utime.tv_sec) - 1; usec = ru1->ru_utime.tv_usec + million - ru2->ru_utime.tv_usec; sec += (usec / million); usec %= million; ru->ru_utime.tv_sec = sec; ru->ru_utime.tv_usec = usec; sec = (ru1->ru_stime.tv_sec - ru2->ru_stime.tv_sec) - 1; usec = ru1->ru_stime.tv_usec + million - ru2->ru_stime.tv_usec; sec += (usec / million); usec %= million; ru->ru_stime.tv_sec = sec; ru->ru_stime.tv_usec = usec; } uintmax_t rusageTime (struct rusage *ru) { uintmax_t result; result = 0; result += 1000 * (uintmax_t)ru->ru_utime.tv_sec; result += 1000 * (uintmax_t)ru->ru_stime.tv_sec; result += (uintmax_t)ru->ru_utime.tv_usec / 1000; result += (uintmax_t)ru->ru_stime.tv_usec / 1000; return result; } void startTiming (struct rusage *ru_start) { getrusage (RUSAGE_SELF, ru_start); } /* Accumulate and return time as number of milliseconds. */ uintmax_t stopTiming (struct rusage *ru_start, struct rusage *ru_acc) { struct rusage ru_finish, ru_total; getrusage (RUSAGE_SELF, &ru_finish); rusageMinusMax (&ru_finish, ru_start, &ru_total); rusagePlusMax (ru_acc, &ru_total, ru_acc); return rusageTime (&ru_total); } mlton-20210117+dfsg/runtime/gc/rusage.h000066400000000000000000000016201416264345000175400ustar00rootroot00000000000000/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void rusageZero (struct rusage *ru); static inline void rusagePlusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru); static inline void rusageMinusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru); static inline uintmax_t rusageTime (struct rusage *ru); static inline void startTiming (struct rusage *ru_start); static uintmax_t stopTiming (struct rusage *ru_start, struct rusage *ru_gc); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/sequence-allocate.c000066400000000000000000000105071416264345000216430ustar00rootroot00000000000000/* Copyright (C) 2016 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ pointer GC_sequenceAllocate (GC_state s, size_t ensureBytesFree, GC_sequenceLength numElements, GC_header header) { size_t sequenceSize, sequenceSizeAligned; size_t bytesPerElement; uint16_t bytesNonObjptrs; uint16_t numObjptrs; pointer frontier; pointer last; pointer result; splitHeader(s, header, NULL, NULL, &bytesNonObjptrs, &numObjptrs); if (DEBUG) fprintf (stderr, "GC_sequenceAllocate (%"PRIuMAX", "FMTSEQLEN", "FMTHDR")\n", (uintmax_t)ensureBytesFree, numElements, header); bytesPerElement = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); /* Check for overflow when computing sequenceSize. */ if (bytesPerElement > 0 and numElements > (SIZE_MAX / bytesPerElement)) { goto doOverflow; } sequenceSize = bytesPerElement * numElements; if (sequenceSize > SIZE_MAX - GC_SEQUENCE_METADATA_SIZE) { goto doOverflow; } sequenceSize += GC_SEQUENCE_METADATA_SIZE; sequenceSizeAligned = align (sequenceSize, s->alignment); if (sequenceSizeAligned < sequenceSize) { goto doOverflow; } if (DEBUG_SEQUENCE) fprintf (stderr, "Sequence with "FMTSEQLEN" elts of size %"PRIuMAX" and total size %s and total aligned size %s. " "Ensure %s bytes free.\n", numElements, (uintmax_t)bytesPerElement, uintmaxToCommaString(sequenceSize), uintmaxToCommaString(sequenceSizeAligned), uintmaxToCommaString(ensureBytesFree)); if (sequenceSizeAligned >= s->controls.oldGenSequenceSize) { if (not hasHeapBytesFree (s, sequenceSizeAligned, ensureBytesFree)) { enter (s); performGC (s, sequenceSizeAligned, ensureBytesFree, FALSE, TRUE); leave (s); } frontier = s->heap.start + s->heap.oldGenSize; s->heap.oldGenSize += sequenceSizeAligned; s->cumulativeStatistics.bytesAllocated += sequenceSizeAligned; } else { size_t bytesRequested; pointer newFrontier; bytesRequested = sequenceSizeAligned + ensureBytesFree; if (not hasHeapBytesFree (s, 0, bytesRequested)) { enter (s); performGC (s, 0, bytesRequested, FALSE, TRUE); leave (s); } frontier = s->frontier; newFrontier = frontier + sequenceSizeAligned; assert (isFrontierAligned (s, newFrontier)); s->frontier = newFrontier; } last = frontier + sequenceSize; *((GC_sequenceCounter*)(frontier)) = 0; frontier = frontier + GC_SEQUENCE_COUNTER_SIZE; *((GC_sequenceLength*)(frontier)) = numElements; frontier = frontier + GC_SEQUENCE_LENGTH_SIZE; *((GC_header*)(frontier)) = header; frontier = frontier + GC_HEADER_SIZE; result = frontier; assert (isAligned ((size_t)result, s->alignment)); /* Initialize all pointers with BOGUS_OBJPTR. */ if (1 <= numObjptrs and 0 < numElements) { pointer p; if (0 == bytesNonObjptrs) for (p = frontier; p < last; p += OBJPTR_SIZE) *((objptr*)p) = BOGUS_OBJPTR; else { /* Sequence with a mix of pointers and non-pointers. */ size_t bytesObjptrs; bytesObjptrs = numObjptrs * OBJPTR_SIZE; for (p = frontier; p < last; ) { pointer next; p += bytesNonObjptrs; next = p + bytesObjptrs; assert (next <= last); for ( ; p < next; p += OBJPTR_SIZE) *((objptr*)p) = BOGUS_OBJPTR; } } } GC_profileAllocInc (s, sequenceSizeAligned); if (DEBUG_SEQUENCE) { fprintf (stderr, "GC_sequenceAllocate done. result = "FMTPTR" frontier = "FMTPTR"\n", (uintptr_t)result, (uintptr_t)s->frontier); displayGCState (s, stderr); } assert (ensureBytesFree <= (size_t)(s->limitPlusSlop - s->frontier)); /* Unfortunately, the invariant isn't quite true here, because * unless we did the GC, we never set s->currentThread->stack->used * to reflect what the mutator did with stackTop. */ return result; doOverflow: die ("Out of memory. Unable to allocate sequence with "FMTSEQLEN" elements and elements of size %"PRIuMAX" bytes.", numElements, (uintmax_t)bytesPerElement); } mlton-20210117+dfsg/runtime/gc/sequence-allocate.h000066400000000000000000000011011416264345000216360ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE pointer GC_sequenceAllocate (GC_state s, size_t ensureBytesFree, GC_sequenceLength numElements, GC_header header); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/sequence.c000066400000000000000000000047541416264345000200700ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* getSequenceLengthp (p) * * Returns a pointer to the length for the sequence pointed to by p. */ GC_sequenceLength* getSequenceLengthp (pointer a) { return (GC_sequenceLength*)(a - GC_HEADER_SIZE - GC_SEQUENCE_LENGTH_SIZE); } /* getSequenceLength (p) * * Returns the length for the sequence pointed to by p. */ GC_sequenceLength getSequenceLength (pointer a) { return *(getSequenceLengthp (a)); } uintmax_t GC_getSequenceLength (pointer a) { return ((uintmax_t)(getSequenceLength (a))); } /* getSequenceCounterp (p) * * Returns a pointer to the counter for the sequence pointed to by p. */ GC_sequenceCounter* getSequenceCounterp (pointer a) { return (GC_sequenceCounter*)(a - GC_HEADER_SIZE - GC_SEQUENCE_LENGTH_SIZE - GC_SEQUENCE_COUNTER_SIZE); } /* getSequenceCounter (p) * * Returns the counter for the sequence pointed to by p. */ GC_sequenceCounter getSequenceCounter (pointer a) { return *(getSequenceCounterp (a)); } #if ASSERT pointer indexSequenceAtObjptrIndex (GC_state s, pointer a, GC_sequenceCounter sequenceIndex, uint32_t objptrIndex) { GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; header = getHeader (a); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); assert (tag == SEQUENCE_TAG); return a + (sequenceIndex * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE))) + bytesNonObjptrs + (objptrIndex * OBJPTR_SIZE); } #endif /* GC_sequenceCopy (ad, as, as, ss, l) * * Copy l elements of as starting at ss to ad starting at as. */ void GC_sequenceCopy (GC_state s, pointer ad, size_t ds, pointer as, size_t ss, size_t l) { GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; size_t eltSize; header = getHeader (ad); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); assert (tag == SEQUENCE_TAG); eltSize = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); GC_memmove (as + eltSize * ss, ad + eltSize * ds, eltSize * l); } mlton-20210117+dfsg/runtime/gc/sequence.h000066400000000000000000000046051416264345000200700ustar00rootroot00000000000000/* Copyright (C) 2012,2016 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Sequence objects have the following layout: * * counter :: * length :: * header :: * ( (non heap-pointers)* :: (heap pointers)* )* * * The counter word is used by mark compact GC. The length word is * the number of elements in the sequence. Sequence elements have the same * individual layout as normal objects, omitting the header word. */ #define GC_SEQLEN_TYPE__(z) uint ## z ## _t #define GC_SEQLEN_TYPE_(z) GC_SEQLEN_TYPE__(z) #define GC_SEQLEN_TYPE GC_SEQLEN_TYPE_(GC_MODEL_SEQLEN_SIZE) typedef GC_SEQLEN_TYPE GC_sequenceLength; #define GC_SEQUENCE_LENGTH_SIZE sizeof(GC_sequenceLength) #define PRIxSEQLEN__(z) PRIx ## z #define PRIxSEQLEN_(z) PRIxSEQLEN__(z) #define PRIxSEQLEN PRIxSEQLEN_(GC_MODEL_SEQLEN_SIZE) #define FMTSEQLEN "%"PRIxSEQLEN typedef GC_sequenceLength GC_sequenceCounter; #define GC_SEQUENCE_COUNTER_SIZE sizeof(GC_sequenceCounter) #define PRIxSEQCTR PRIxSEQLEN #define FMTSEQCTR "%"PRIxSEQCTR #define GC_SEQUENCE_METADATA_SIZE (GC_SEQUENCE_COUNTER_SIZE + GC_SEQUENCE_LENGTH_SIZE + GC_HEADER_SIZE) COMPILE_TIME_ASSERT(sizeof_header__le__sizeof_seqlen, sizeof(GC_header) <= sizeof(GC_sequenceLength)); COMPILE_TIME_ASSERT(sizeof_seqlen__eq__sizeof_seqctr, sizeof(GC_sequenceLength) == sizeof(GC_sequenceCounter)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_sequenceLength* getSequenceLengthp (pointer a); static inline GC_sequenceLength getSequenceLength (pointer a); static inline GC_sequenceCounter* getSequenceCounterp (pointer a); static inline GC_sequenceCounter getSequenceCounter (pointer a); #if ASSERT static inline pointer indexSequenceAtObjptrIndex (GC_state s, pointer a, GC_sequenceCounter sequenceIndex, uint32_t objptrIndex); #endif #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ PRIVATE uintmax_t GC_getSequenceLength (pointer a); PRIVATE void GC_sequenceCopy (GC_state s, pointer ad, size_t ds, pointer as, size_t ss, size_t l); mlton-20210117+dfsg/runtime/gc/share.c000066400000000000000000000026561416264345000173610ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void GC_share (GC_state s, pointer object) { size_t bytesExamined; size_t bytesHashConsed; struct GC_markState markState; if (not isPointer (object)) return; enter (s); /* update stack in heap, in case it is reached */ if (DEBUG_SHARE) fprintf (stderr, "GC_share "FMTPTR"\n", (uintptr_t)object); if (DEBUG_SHARE or s->controls.messages) s->lastMajorStatistics.bytesHashConsed = 0; // Don't hash cons during the first round of marking. markState.mode = MARK_MODE; markState.size = 0; markState.shouldHashCons = FALSE; markState.shouldLinkWeaks = FALSE; dfsMark (s, object, &markState); bytesExamined = markState.size; s->objectHashTable = allocHashTable (s); // Hash cons during the second round of (un)marking. markState.mode = UNMARK_MODE; markState.size = 0; markState.shouldHashCons = TRUE; dfsMark (s, object, &markState); freeHashTable (s->objectHashTable); bytesHashConsed = s->lastMajorStatistics.bytesHashConsed; s->cumulativeStatistics.bytesHashConsed += bytesHashConsed; if (DEBUG_SHARE or s->controls.messages) printBytesHashConsedMessage (bytesHashConsed, bytesExamined); leave (s); } mlton-20210117+dfsg/runtime/gc/share.h000066400000000000000000000006131416264345000173550ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_share (GC_state s, pointer object); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/signals.c000066400000000000000000000016511416264345000177110ustar00rootroot00000000000000/* Copyright (C) 2010,2016,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if not HAS_SIGALTSTACK void initSignalStack () { } #else void initSignalStack () { static stack_t altstack = { .ss_sp = NULL, .ss_size = 0, .ss_flags = 0 }; if (! altstack.ss_sp) { size_t psize = GC_pageSize (); size_t ss_size = align (SIGSTKSZ, psize); int prot = PROT_READ | PROT_WRITE; #if NEEDS_SIGALTSTACK_EXEC prot = prot | PROT_EXEC; #endif void *ss_sp = GC_mmapAnonStack (NULL, 2 * ss_size, prot, psize, psize); altstack.ss_sp = (void*)((pointer)ss_sp + ss_size); altstack.ss_size = ss_size; } sigaltstack (&altstack, NULL); } #endif void GC_initSignalStack () { initSignalStack (); } mlton-20210117+dfsg/runtime/gc/signals.h000066400000000000000000000020601416264345000177110ustar00rootroot00000000000000/* Copyright (C) 2010,2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_signalsInfo { /* TRUE iff a signal handler is running. */ bool amInSignalHandler; bool gcSignalHandled; bool gcSignalPending; /* TRUE iff a signal has been received but not handled by the * mutator. */ volatile uint32_t signalIsPending; /* The signals for which a mutator signal handler needs to run in * order to handle the signal. */ sigset_t signalsHandled; /* The signals that have been recieved but not processed by the * mutator signal handler. */ sigset_t signalsPending; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void initSignalStack (); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ void GC_initSignalStack (); mlton-20210117+dfsg/runtime/gc/size.c000066400000000000000000000031751416264345000172260ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ size_t GC_size (GC_state s, pointer root) { struct GC_markState markState; size_t res; if (not isPointer (root)) return 0; enter (s); /* update stack in heap, in case it is reached */ if (DEBUG_SIZE) fprintf (stderr, "GC_size marking\n"); markState.mode = MARK_MODE; markState.size = 0; markState.shouldHashCons = FALSE; markState.shouldLinkWeaks = FALSE; dfsMark (s, root, &markState); res = markState.size; if (DEBUG_SIZE) fprintf (stderr, "GC_size unmarking\n"); markState.mode = UNMARK_MODE; markState.size = 0; dfsMark (s, root, &markState); leave(s); return res; } size_t GC_sizeAll (GC_state s) { struct GC_foreachObjptrClosure dfsMarkObjptrClosure; struct GC_markState markState; size_t res; enter (s); /* update stack in heap, in case it is reached */ dfsMarkObjptrClosure.fun = dfsMarkObjptrFun; dfsMarkObjptrClosure.env = &markState; if (DEBUG_SIZE) fprintf (stderr, "GC_sizeAll marking\n"); markState.mode = MARK_MODE; markState.size = 0; markState.shouldHashCons = FALSE; markState.shouldLinkWeaks = FALSE; foreachGlobalObjptr (s, &dfsMarkObjptrClosure); res = markState.size; if (DEBUG_SIZE) fprintf (stderr, "GC_sizeAll unmarking\n"); markState.mode = UNMARK_MODE; markState.size = 0; foreachGlobalObjptr (s, &dfsMarkObjptrClosure); leave(s); return res; } mlton-20210117+dfsg/runtime/gc/size.h000066400000000000000000000007271416264345000172330ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE size_t GC_size (GC_state s, pointer root); PRIVATE size_t GC_sizeAll (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/sources.c000066400000000000000000000073211416264345000177340ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ GC_sourceSeqIndex getCachedStackTopFrameSourceSeqIndex (GC_state s) { GC_frameIndex i; i = getCachedStackTopFrameIndex (s); assert(i < s->frameInfosLength); return s->frameInfos[i].sourceSeqIndex; } const char * getSourceName (GC_state s, GC_sourceIndex i) { assert (i < s->sourceMaps.sourcesLength); return s->sourceMaps.sourceNames[s->sourceMaps.sources[i].sourceNameIndex]; } const char * GC_sourceName (GC_state s, GC_sourceIndex i) { return getSourceName (s, i); } #if HAS_TIME_PROFILING int compareProfileLabelInfos (const void *v1, const void *v2) { const struct GC_profileLabelInfo* l1 = (const struct GC_profileLabelInfo*)v1; const struct GC_profileLabelInfo* l2 = (const struct GC_profileLabelInfo*)v2; uintptr_t ui1 = (uintptr_t)(l1->profileLabel); uintptr_t ui2 = (uintptr_t)(l2->profileLabel); if (ui1 < ui2) return -1; else if (ui1 == ui2) return 0; else /* if (ui1 > ui2) */ return 1; } void sortProfileLabelInfos (GC_state s) { GC_profileLabelInfoIndex i; /* Sort profileLabelInfos by address. */ qsort (s->sourceMaps.profileLabelInfos, s->sourceMaps.profileLabelInfosLength, sizeof (*s->sourceMaps.profileLabelInfos), compareProfileLabelInfos); if (0 == s->sourceMaps.profileLabelInfos[s->sourceMaps.profileLabelInfosLength - 1].profileLabel) die ("Max source label is 0 -- something is wrong."); if (ASSERT) for (i = 1; i < s->sourceMaps.profileLabelInfosLength; i++) assert (s->sourceMaps.profileLabelInfos[i-1].profileLabel <= s->sourceMaps.profileLabelInfos[i].profileLabel); } void compressProfileLabelInfos (GC_state s) { GC_profileLabelInfoIndex in, out, i; GC_sourceSeqIndex sourceSeqIndex; /* Eliminate duplicate profileLabelInfos */ out = 0; sourceSeqIndex = UNKNOWN_SOURCE_SEQ_INDEX; for (in = 0; in < s->sourceMaps.profileLabelInfosLength; ++in) { if (s->sourceMaps.profileLabelInfos[in].sourceSeqIndex != sourceSeqIndex) { s->sourceMaps.profileLabelInfos[out++] = s->sourceMaps.profileLabelInfos[in]; sourceSeqIndex = s->sourceMaps.profileLabelInfos[in].sourceSeqIndex; } } s->sourceMaps.profileLabelInfosLength = out; if (DEBUG_SOURCES) for (i = 0; i < s->sourceMaps.profileLabelInfosLength; i++) fprintf (stderr, FMTPTR" "FMTSSI"\n", (uintptr_t)s->sourceMaps.profileLabelInfos[i].profileLabel, s->sourceMaps.profileLabelInfos[i].sourceSeqIndex); } void initProfileLabelInfos (GC_state s) { sortProfileLabelInfos (s); compressProfileLabelInfos (s); } #endif void showSources (GC_state s) { uint32_t i; uint32_t j; fprintf (stdout, "0x%08"PRIx32"\n", s->magic); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourceNamesLength); for (i = 0; i < s->sourceMaps.sourceNamesLength; i++) fprintf (stdout, "%s\n", s->sourceMaps.sourceNames[i]); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourcesLength); for (i = 0; i < s->sourceMaps.sourcesLength; i++) fprintf (stdout, "%"PRIu32" %"PRIu32"\n", s->sourceMaps.sources[i].sourceNameIndex, s->sourceMaps.sources[i].successorSourceSeqIndex); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourceSeqsLength); for (i = 0; i < s->sourceMaps.sourceSeqsLength; i++) { const uint32_t *sourceSeq; sourceSeq = s->sourceMaps.sourceSeqs[i]; for (j = 1; j <= sourceSeq[0]; j++) fprintf (stdout, "%"PRIu32" ", sourceSeq[j]); fprintf (stdout, "\n"); } } mlton-20210117+dfsg/runtime/gc/sources.h000066400000000000000000000056331416264345000177450ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef uint32_t GC_sourceNameIndex; #define PRISNI PRIu32 #define FMTSNI "%"PRISNI typedef uint32_t GC_sourceSeqIndex; #define PRISSI PRIu32 #define FMTSSI "%"PRISSI #define UNKNOWN_SOURCE_SEQ_INDEX 0 #define GC_SOURCE_SEQ_INDEX 1 typedef uint32_t GC_sourceIndex; #define PRISI PRIu32 #define FMTSI "%"PRISI #define UNKNOWN_SOURCE_INDEX 0 #define GC_SOURCE_INDEX 1 typedef const struct GC_source { const GC_sourceNameIndex sourceNameIndex; const GC_sourceSeqIndex successorSourceSeqIndex; } *GC_source; typedef struct GC_profileLabelInfo { code_pointer profileLabel; GC_sourceSeqIndex sourceSeqIndex; } *GC_profileLabelInfo; typedef uint32_t GC_profileLabelInfoIndex; #define PRISLI PRIu32 #define FMTSLI "%"PRISLI struct GC_sourceMaps { volatile GC_sourceSeqIndex curSourceSeqIndex; /* profileLabelInfos is an array of cardinality profileLabelInfosLength; * the collection of profile labels embedded in output program * paired with an index into sourceSeqs of the sequence of source * names corresponding to the code pointer; only used with * ProfileTimeLabel. */ GC_profileLabelInfo profileLabelInfos; uint32_t profileLabelInfosLength; /* sourceNames is an array of cardinality sourceNamesLength; * the collection of source names from the program. */ const char * const *sourceNames; uint32_t sourceNamesLength; /* sourceSeqs is an array of cardinality sourceSeqsLength; * each entry describes a sequence of source names as a length * followed by the sequence of indices into sources. */ const uint32_t * const *sourceSeqs; uint32_t sourceSeqsLength; /* sources is an array of cardinality sourcesLength; * each entry describes a source name and successor sources as * the pair of an index into sourceNames and an index into * sourceSeqs. */ GC_source sources; uint32_t sourcesLength; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_sourceSeqIndex getCachedStackTopFrameSourceSeqIndex (GC_state s); static inline const char * getSourceName (GC_state s, GC_sourceIndex i); #if HAS_TIME_PROFILING static inline int compareProfileLabelInfos (const void *v1, const void *v2); static void sortProfileLabelInfos (GC_state s); static void compressProfileLabelInfos (GC_state s); static void initProfileLabelInfos (GC_state s); #endif static void showSources (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE const char * GC_sourceName (GC_state s, GC_sourceIndex i); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/stack.c000066400000000000000000000161761416264345000173660ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void displayStack (__attribute__ ((unused)) GC_state s, GC_stack stack, FILE *stream) { fprintf(stream, "\t\treserved = %"PRIuMAX"\n" "\t\tused = %"PRIuMAX"\n", (uintmax_t)stack->reserved, (uintmax_t)stack->used); } #if ASSERT bool isStackEmpty (GC_stack stack) { return 0 == stack->used; } bool isStackReservedAligned (GC_state s, size_t reserved) { return isAligned (GC_STACK_METADATA_SIZE + sizeof (struct GC_stack) + reserved, s->alignment); } #endif /* sizeofStackSlop returns the amount of "slop" space needed between * the top of the stack and the end of the stack space. */ size_t sizeofStackSlop (GC_state s) { return (size_t)(2 * s->maxFrameSize); } /* Pointer to the bottommost word in use on the stack. */ pointer getStackBottom (ARG_USED_FOR_ASSERT GC_state s, GC_stack stack) { pointer res; res = ((pointer)stack) + sizeof (struct GC_stack); assert (isAligned ((size_t)res, s->alignment)); return res; } /* Pointer to the topmost word in use on the stack. */ pointer getStackTop (GC_state s, GC_stack stack) { pointer res; res = getStackBottom (s, stack) + stack->used; assert (isAligned ((size_t)res, s->alignment)); return res; } /* Pointer to the end of stack. */ pointer getStackLimitPlusSlop (GC_state s, GC_stack stack) { pointer res; res = getStackBottom (s, stack) + stack->reserved; // assert (isAligned ((size_t)res, s->alignment)); return res; } /* The maximum value which is valid for stackTop. */ pointer getStackLimit (GC_state s, GC_stack stack) { pointer res; res = getStackLimitPlusSlop (s, stack) - sizeofStackSlop (s); // assert (isAligned ((size_t)res, s->alignment)); return res; } GC_frameIndex getCachedStackTopFrameIndex (GC_state s) { GC_frameIndex res; res = getFrameIndexFromReturnAddress (s, *((GC_returnAddress*)(s->stackTop - GC_RETURNADDRESS_SIZE))); return res; } GC_frameIndex getStackTopFrameIndex (GC_state s, GC_stack stack) { GC_frameIndex res; res = getFrameIndexFromReturnAddress (s, *((GC_returnAddress*)(getStackTop (s, stack) - GC_RETURNADDRESS_SIZE))); return res; } GC_frameInfo getStackTopFrameInfo (GC_state s, GC_stack stack) { GC_frameInfo frameInfo; frameInfo = getFrameInfoFromFrameIndex (s, getStackTopFrameIndex (s, stack)); return frameInfo; } uint16_t getStackTopFrameSize (GC_state s, GC_stack stack) { GC_frameInfo frameInfo; assert (not (isStackEmpty (stack))); frameInfo = getStackTopFrameInfo (s, stack); return frameInfo->size; } size_t alignStackReserved (GC_state s, size_t reserved) { size_t res; res = alignWithExtra (s, reserved, GC_STACK_METADATA_SIZE + sizeof (struct GC_stack)); if (DEBUG_STACKS) fprintf (stderr, "%"PRIuMAX" = alignStackReserved (%"PRIuMAX")\n", (uintmax_t)res, (uintmax_t)reserved); assert (isStackReservedAligned (s, res)); return res; } size_t sizeofStackWithMetaData (ARG_USED_FOR_ASSERT GC_state s, size_t reserved) { size_t res; assert (isStackReservedAligned (s, reserved)); res = GC_STACK_METADATA_SIZE + sizeof (struct GC_stack) + reserved; if (DEBUG_STACKS) fprintf (stderr, "%"PRIuMAX" = sizeofStackWithMetaData (%"PRIuMAX")\n", (uintmax_t)res, (uintmax_t)reserved); assert (isAligned (res, s->alignment)); return res; } size_t sizeofStackInitialReserved (GC_state s) { size_t res; res = alignStackReserved(s, sizeofStackSlop (s)); return res; } size_t sizeofStackMinimumReserved (GC_state s, GC_stack stack) { size_t res; res = alignStackReserved (s, stack->used + sizeofStackSlop (s) - getStackTopFrameSize (s, stack)); return res; } size_t sizeofStackGrowReserved (GC_state s, GC_stack stack) { double reservedD; size_t reservedGrow, reservedMin, reservedNew; const size_t RESERVED_MAX = (SIZE_MAX >> 2); assert (isStackReservedAligned (s, stack->reserved)); reservedD = (double)(stack->reserved); double reservedGrowD = (double)s->controls.ratios.stackCurrentGrow * reservedD; reservedGrow = reservedGrowD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedGrowD; reservedMin = sizeofStackMinimumReserved (s, stack); reservedNew = alignStackReserved (s, max (reservedGrow, reservedMin)); assert (isStackReservedAligned (s, reservedNew)); return reservedNew; } size_t sizeofStackShrinkReserved (GC_state s, GC_stack stack, bool current) { double usedD, reservedD; size_t reservedMax, reservedShrink, reservedMin, reservedNew; const size_t RESERVED_MAX = (SIZE_MAX >> 2); assert (isStackReservedAligned (s, stack->reserved)); usedD = (double)(stack->used); reservedD = (double)(stack->reserved); if (current) { /* Shrink current stacks. */ double reservedMaxD = (double)(s->controls.ratios.stackCurrentMaxReserved) * usedD; reservedMax = reservedMaxD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedMaxD; double reservedPermitD = (double)(s->controls.ratios.stackCurrentPermitReserved) * usedD; size_t reservedPermit = reservedPermitD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedPermitD; reservedShrink = (stack->reserved <= reservedPermit) ? stack->reserved : (size_t)((double)(s->controls.ratios.stackCurrentShrink) * reservedD); reservedMin = sizeofStackMinimumReserved (s, stack); } else { /* Shrink paused stacks. */ double reservedMaxD = (double)(s->controls.ratios.stackMaxReserved) * usedD; reservedMax = reservedMaxD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedMaxD; reservedShrink = (size_t)((double)s->controls.ratios.stackShrink * reservedD); reservedMin = stack->used; } reservedNew = alignStackReserved (s, max(min(reservedMax,reservedShrink),reservedMin)); /* It's possible that reservedNew > stack->reserved for the current * stack if the stack invariant is violated. In that case, we want * to leave the stack alone, because some other part of the gc will * grow the stack. We cannot do any growing here because we may run * out of to space. */ assert (current or reservedNew <= stack->reserved); reservedNew = min (stack->reserved, reservedNew); assert (isStackReservedAligned (s, reservedNew)); return reservedNew; } void copyStack (GC_state s, GC_stack from, GC_stack to) { pointer fromBottom, toBottom; fromBottom = getStackBottom (s, from); toBottom = getStackBottom (s, to); assert (from->used <= to->reserved); to->used = from->used; if (DEBUG_STACKS) fprintf (stderr, "stackCopy from "FMTPTR" to "FMTPTR" of length %"PRIuMAX"\n", (uintptr_t)fromBottom, (uintptr_t)toBottom, (uintmax_t)from->used); GC_memcpy (fromBottom, toBottom, from->used); } mlton-20210117+dfsg/runtime/gc/stack.h000066400000000000000000000063761416264345000173740ustar00rootroot00000000000000/* Copyright (C) 2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Stack objects have the following layout: * * header :: * markTop (native-pointer) :: * markIndex (word32) :: * reserved :: * used :: * ... reserved bytes ... * * The markTop and markIndex are used by the mark-compact GC. The * reserved size gives the number of bytes for the stack (before the * next ML object). The used size gives the number of bytes currently * used by the stack. The sequence of reserved bytes correspond to ML * stack frames, which will be discussed in more detail in "frame.h". */ typedef struct GC_stack { /* markTop and markIndex are only used during marking. They record * the current pointer in the stack that is being followed. markTop * points to the top of the stack frame containing the pointer and * markIndex is the index in that frame's frameOffsets of the pointer * slot. So, when the GC pointer reversal gets back to the stack, * it can continue with the next pointer (either in the current * frame or the next frame). */ pointer markTop; uint32_t markIndex; /* reserved is the number of bytes reserved for stack, * i.e. its maximum size. */ size_t reserved; /* used is the number of bytes used by the stack. * Stacks with used == reserved are continuations. */ size_t used; /* The next address is the bottom of the stack, and the following * reserved bytes hold space for the stack. */ } *GC_stack; #define GC_STACK_METADATA_SIZE (GC_HEADER_SIZE) #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayStack (GC_state s, GC_stack stack, FILE *stream); #if ASSERT static inline bool isStackEmpty (GC_stack stack); static inline bool isStackReservedAligned (GC_state s, size_t reserved); #endif static inline size_t sizeofStackSlop (GC_state s); static inline pointer getStackBottom (GC_state s, GC_stack stack); static inline pointer getStackTop (GC_state s, GC_stack stack); static inline pointer getStackLimitPlusSlop (GC_state s, GC_stack stack); static inline pointer getStackLimit (GC_state s, GC_stack stack); static inline GC_frameIndex getCachedStackTopFrameIndex (GC_state s); static inline GC_frameIndex getStackTopFrameIndex (GC_state s, GC_stack stack); static inline GC_frameInfo getStackTopFrameInfo (GC_state s, GC_stack stack); static inline uint16_t getStackTopFrameSize (GC_state s, GC_stack stack); static inline size_t alignStackReserved (GC_state s, size_t reserved); static inline size_t sizeofStackWithMetaData (GC_state s, size_t reserved); static inline size_t sizeofStackInitialReserved (GC_state s); static inline size_t sizeofStackMinimumReserved (GC_state s, GC_stack stack); static inline size_t sizeofStackGrowReserved (GC_state s, GC_stack stack); static inline size_t sizeofStackShrinkReserved (GC_state s, GC_stack stack, bool current); static inline void copyStack (GC_state s, GC_stack from, GC_stack to); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/static-heaps.c000066400000000000000000000035271416264345000206420ustar00rootroot00000000000000/* Copyright (C) 2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ bool isPointerInImmutableStaticHeap (GC_state s, pointer p) { return (not (isPointer (p)) or (s->staticHeaps.immutable.start <= p and p <= s->staticHeaps.immutable.start + s->staticHeaps.immutable.size)); } bool isObjptrInImmutableStaticHeap (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInImmutableStaticHeap (s, p); } bool isPointerInMutableStaticHeap (GC_state s, pointer p) { return (not (isPointer (p)) or (s->staticHeaps.mutable.start <= p and p <= s->staticHeaps.mutable.start + s->staticHeaps.mutable.size)); } bool isObjptrInMutableStaticHeap (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInMutableStaticHeap (s, p); } bool isPointerInRootStaticHeap (GC_state s, pointer p) { return (not (isPointer (p)) or (s->staticHeaps.root.start <= p and p <= s->staticHeaps.root.start + s->staticHeaps.root.size)); } bool isObjptrInRootStaticHeap (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInRootStaticHeap (s, p); } bool isPointerInImmutableMutableOrRootStaticHeap (GC_state s, pointer p) { return (isPointerInImmutableStaticHeap (s, p) or isPointerInMutableStaticHeap (s, p) or isPointerInRootStaticHeap (s, p)); } bool isObjptrInImmutableMutableOrRootStaticHeap (GC_state s, objptr op) { return (isObjptrInImmutableStaticHeap (s, op) or isObjptrInMutableStaticHeap (s, op) or isObjptrInRootStaticHeap (s, op)); } mlton-20210117+dfsg/runtime/gc/static-heaps.h000066400000000000000000000024541416264345000206450ustar00rootroot00000000000000/* Copyright (C) 2019-2020 Matthew Fluet. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_staticHeap { pointer start; size_t size; }; /* * Allowed references between heap objects: * * I -> {I,M,R} * M -> {I,M,R} * R -> {I,M,R,D[*],H} [*] only during initialization * D -> {I,M,R,D} * H -> {I,M,R,H} */ struct GC_staticHeaps { struct GC_staticHeap dynamic; struct GC_staticHeap immutable; struct GC_staticHeap mutable; struct GC_staticHeap root; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isObjptrInImmutableStaticHeap (GC_state s, objptr op); static inline bool isObjptrInMutableStaticHeap (GC_state s, objptr op); static inline bool isObjptrInRootStaticHeap (GC_state s, objptr op); static inline bool isObjptrInImmutableMutableOrRootStaticHeap (GC_state s, objptr op); static inline bool isPointerInImmutableStaticHeap (GC_state s, pointer p); static inline bool isPointerInMutableStaticHeap (GC_state s, pointer p); static inline bool isPointerInRootStaticHeap (GC_state s, pointer p); static inline bool isPointerInImmutableMutableOrRootStaticHeap (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/statistics.c000066400000000000000000000003731416264345000204430ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ mlton-20210117+dfsg/runtime/gc/statistics.h000066400000000000000000000024561416264345000204540ustar00rootroot00000000000000/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_cumulativeStatistics { uintmax_t bytesAllocated; uintmax_t bytesCopied; uintmax_t bytesCopiedMinor; uintmax_t bytesHashConsed; uintmax_t bytesMarkCompacted; uintmax_t bytesScannedMinor; size_t maxBytesLive; size_t maxHeapSize; uintmax_t maxPauseTime; size_t maxStackSize; uintmax_t numCardsMarked; /* Number of marked cards seen during minor GCs. */ uintmax_t numGCs; uintmax_t numCopyingGCs; uintmax_t numHashConsGCs; uintmax_t numMarkCompactGCs; uintmax_t numMinorGCs; struct rusage ru_gc; /* total resource usage in gc. */ struct rusage ru_gcCopying; /* resource usage in major copying gcs. */ struct rusage ru_gcMarkCompact; /* resource usage in major mark-compact gcs. */ struct rusage ru_gcMinor; /* resource usage in minor copying gcs. */ }; struct GC_lastMajorStatistics { size_t bytesHashConsed; size_t bytesLive; /* Number of bytes live at most recent major GC. */ GC_majorKind kind; uintmax_t numMinorGCs; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20210117+dfsg/runtime/gc/string.c000066400000000000000000000004741416264345000175610ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ GC_header GC_stringHeader (void) { return GC_STRING_HEADER; } mlton-20210117+dfsg/runtime/gc/string.h000066400000000000000000000022671416264345000175700ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Layout of strings. * Note, the value passed around is a pointer to the obj member. */ struct GC_string8_obj { char chars[1]; }; typedef struct GC_string8 { GC_sequenceCounter counter; GC_sequenceLength length; GC_header header; struct GC_string8_obj obj; } __attribute__ ((packed)) *GC_string8; COMPILE_TIME_ASSERT(GC_string8__obj_packed, offsetof(struct GC_string8, obj) == sizeof(GC_sequenceCounter) + sizeof(GC_sequenceLength) + sizeof(GC_header)); COMPILE_TIME_ASSERT(GC_string8_obj__chars_packed, offsetof(struct GC_string8_obj, chars) == 0); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define GC_STRING8_HEADER GC_WORD8_VECTOR_HEADER #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/switch-thread.c000066400000000000000000000046641416264345000210260ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void switchToThread (GC_state s, objptr op) { if (DEBUG_THREADS) { GC_thread thread; GC_stack stack; thread = (GC_thread)(objptrToPointer (op, s->heap.start) + offsetofThread (s)); stack = (GC_stack)(objptrToPointer (thread->stack, s->heap.start)); fprintf (stderr, "switchToThread ("FMTOBJPTR") used = %"PRIuMAX " reserved = %"PRIuMAX"\n", op, (uintmax_t)stack->used, (uintmax_t)stack->reserved); } s->currentThread = op; setGCStateCurrentThreadAndStack (s); } void GC_switchToThread (GC_state s, pointer p, size_t ensureBytesFree) { if (DEBUG_THREADS) fprintf (stderr, "GC_switchToThread ("FMTPTR", %"PRIuMAX")\n", (uintptr_t)p, (uintmax_t)ensureBytesFree); if (FALSE) { /* This branch is slower than the else branch, especially * when debugging is turned on, because it does an invariant * check on every thread switch. * So, we'll stick with the else branch for now. */ enter (s); getThreadCurrent(s)->bytesNeeded = ensureBytesFree; switchToThread (s, pointerToObjptr(p, s->heap.start)); s->atomicState--; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); ensureInvariantForMutator (s, FALSE); assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); leave (s); } else { /* BEGIN: enter(s); */ getStackCurrent(s)->used = sizeofGCStateCurrentStackUsed (s); getThreadCurrent(s)->exnStack = s->exnStack; beginAtomic (s); /* END: enter(s); */ getThreadCurrent(s)->bytesNeeded = ensureBytesFree; switchToThread (s, pointerToObjptr(p, s->heap.start)); s->atomicState--; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); /* BEGIN: ensureInvariantForMutator */ if (not (invariantForMutatorFrontier(s)) or not (invariantForMutatorStack(s))) { /* This GC will grow the stack, if necessary. */ performGC (s, 0, getThreadCurrent(s)->bytesNeeded, FALSE, TRUE); } /* END: ensureInvariantForMutator */ /* BEGIN: leave(s); */ endAtomic (s); /* END: leave(s); */ } assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); } mlton-20210117+dfsg/runtime/gc/switch-thread.h000066400000000000000000000010761416264345000210250ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void switchToThread (GC_state s, objptr op); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_switchToThread (GC_state s, pointer p, size_t ensureBytesFree); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/sysvals.h000066400000000000000000000006441416264345000177630ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_sysvals { size_t ram; size_t pageSize; uintmax_t physMem; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20210117+dfsg/runtime/gc/thread.c000066400000000000000000000027651416264345000175270ustar00rootroot00000000000000/* Copyright (C) 2016,2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void displayThread (GC_state s, GC_thread thread, FILE *stream) { fprintf(stream, "\t\texnStack = %"PRIiMAX"\n" "\t\tbytesNeeded = %"PRIuMAX"\n" "\t\tstack = "FMTOBJPTR"\n", (intmax_t)thread->exnStack, (uintmax_t)thread->bytesNeeded, thread->stack); displayStack (s, (GC_stack)(objptrToPointer (thread->stack, s->heap.start)), stream); } size_t sizeofThread (GC_state s) { size_t res; res = GC_NORMAL_METADATA_SIZE + sizeof (struct GC_thread); res = align (res, s->alignment); if (DEBUG) { size_t check; uint16_t bytesNonObjptrs, numObjptrs; splitHeader (s, GC_THREAD_HEADER, NULL, NULL, &bytesNonObjptrs, &numObjptrs); check = GC_NORMAL_METADATA_SIZE + (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); if (DEBUG_DETAILED) fprintf (stderr, "sizeofThread: res = %"PRIuMAX" check = %"PRIuMAX"\n", (uintmax_t)res, (uintmax_t)check); assert (check == res); } assert (isAligned (res, s->alignment)); return res; } size_t offsetofThread (GC_state s) { return (sizeofThread (s)) - (GC_NORMAL_METADATA_SIZE + sizeof (struct GC_thread)); } mlton-20210117+dfsg/runtime/gc/thread.h000066400000000000000000000033161416264345000175250ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Thread objects are normal objects with the following layout: * * header :: * padding :: * bytesNeeded (size_t) :: * exnStack (ptrdiff_t) :: * stack (object-pointer) * * There may be zero or more bytes of padding for alignment purposes. * * The bytesNeeded size_t is the number of bytes needed when returning * to this thread. * * The exnStack ptrdiff_t is an offset added to stackBottom that * specifies the top of the exnStack. * * The final component is the stack object-pointer. * * Note that the order of the fields is important. The non-objptr * fields must be first, because a thread object must appear to be a * normal object. */ typedef struct GC_thread { size_t bytesNeeded; ptrdiff_t exnStack; objptr stack; } __attribute__ ((packed)) *GC_thread; COMPILE_TIME_ASSERT(GC_thread__packed, sizeof(struct GC_thread) == sizeof(size_t) + sizeof(ptrdiff_t) + sizeof(objptr)); #define BOGUS_EXN_STACK ((ptrdiff_t)(-1)) #else struct GC_thread; typedef struct GC_thread *GC_thread; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayThread (GC_state s, GC_thread thread, FILE *stream); static inline size_t sizeofThread (GC_state s); static inline size_t offsetofThread (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/translate.c000066400000000000000000000033571416264345000202530ustar00rootroot00000000000000/* Copyright (C) 2010,2019-2020 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* translateHeap */ /* ---------------------------------------------------------------- */ typedef struct GC_translateState { pointer from; pointer to; size_t size; } *GC_translateState; void translateFun (__attribute__((unused)) GC_state s, objptr *opp, void *env) { GC_translateState translateState = env; pointer p; pointer from, to; from = translateState->from; to = translateState->to; p = objptrToPointer (*opp, from); if ((from <= p) and (p < from + translateState->size)) { p = (p - from) + to; *opp = pointerToObjptr (p, to); } } /* translateHeap (s, from, to, size) */ void translateHeap (GC_state s, pointer from, pointer to, size_t size) { pointer limit; if (from == to) return; if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Translating %s bytes of heap at "FMTPTR" from "FMTPTR".]\n", uintmaxToCommaString(size), (uintptr_t)to, (uintptr_t)from); struct GC_translateState translateState = {.from = from, .to = to, .size = size}; struct GC_foreachObjptrClosure translateClosure = {.fun = translateFun, .env = &translateState}; /* Translate globals and heap. */ foreachGlobalObjptr (s, &translateClosure); limit = to + size; foreachObjptrInRange (s, alignFrontier (s, to), &limit, &translateClosure, FALSE); } mlton-20210117+dfsg/runtime/gc/translate.h000066400000000000000000000010211416264345000202420ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void translateFun (GC_state s, objptr *opp, void *env); static void translateHeap (GC_state s, pointer from, pointer to, size_t size); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20210117+dfsg/runtime/gc/virtual-memory.c000066400000000000000000000024711416264345000212460ustar00rootroot00000000000000/* Copyright (C) 2010,2017 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void *GC_mmapAnonFlags_safe (void *p, size_t length, int flags) { void *result; result = GC_mmapAnonFlags (p, length, flags); if ((void*)-1 == result) { GC_displayMem (); die ("Out of memory. Unable to allocate %s bytes.\n", uintmaxToCommaString(length)); } return result; } void *GC_mmapAnon_safe (void *p, size_t length) { return GC_mmapAnonFlags_safe (p, length, 0); } static inline void GC_memcpy (pointer src, pointer dst, size_t size) { if (DEBUG_DETAILED) fprintf (stderr, "GC_memcpy ("FMTPTR", "FMTPTR", %"PRIuMAX")\n", (uintptr_t)src, (uintptr_t)dst, (uintmax_t)size); assert (! (src <= dst and dst < src + size)); assert (! (dst <= src and src < dst + size)); memcpy (dst, src, size); } static inline void GC_memmove (pointer src, pointer dst, size_t size) { if (DEBUG_DETAILED) fprintf (stderr, "GC_memmove ("FMTPTR", "FMTPTR", %"PRIuMAX")\n", (uintptr_t)src, (uintptr_t)dst, (uintmax_t)size); if (src == dst) return; memmove (dst, src, size); } mlton-20210117+dfsg/runtime/gc/weak.c000066400000000000000000000040431416264345000171760ustar00rootroot00000000000000/* Copyright (C) 2016 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ size_t sizeofWeak (GC_state s) { size_t res; res = GC_NORMAL_METADATA_SIZE + sizeof (struct GC_weak); res = align (res, s->alignment); if (DEBUG) { size_t check; uint16_t bytesNonObjptrs, numObjptrs; splitHeader (s, GC_WEAK_GONE_HEADER, NULL, NULL, &bytesNonObjptrs, &numObjptrs); check = GC_NORMAL_METADATA_SIZE + (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); if (DEBUG_DETAILED) fprintf (stderr, "sizeofWeak: res = %"PRIuMAX" check = %"PRIuMAX"\n", (uintmax_t)res, (uintmax_t)check); assert (check == res); } assert (isAligned (res, s->alignment)); return res; } size_t offsetofWeak (GC_state s) { return (sizeofWeak (s)) - (GC_NORMAL_METADATA_SIZE + sizeof (struct GC_weak)); } uint32_t GC_weakCanGet (__attribute__ ((unused)) GC_state s, pointer p) { uint32_t res; res = GC_WEAK_GONE_HEADER != getHeader (p); if (DEBUG_WEAK) fprintf (stderr, "%s = GC_weakCanGet ("FMTPTR")\n", boolToString (res), (uintptr_t)p); return res; } pointer GC_weakGet (GC_state s, pointer p) { GC_weak weak; pointer res; weak = (GC_weak)(p + offsetofWeak (s)); res = objptrToPointer(weak->objptr, s->heap.start); if (DEBUG_WEAK) fprintf (stderr, FMTPTR" = GC_weakGet ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)p); return res; } pointer GC_weakNew (GC_state s, GC_header header, pointer p) { GC_weak weak; pointer res; res = newObject (s, header, sizeofWeak (s), FALSE); weak = (GC_weak)(res + offsetofWeak (s)); weak->objptr = pointerToObjptr(p, s->heap.start); if (DEBUG_WEAK) fprintf (stderr, FMTPTR" = GC_weakNew ("FMTHDR", "FMTPTR")\n", (uintptr_t)res, header, (uintptr_t)p); return (pointer)res; } mlton-20210117+dfsg/runtime/gc/weak.h000066400000000000000000000035111416264345000172020ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Weak objects have the following layout: * * header :: * padding :: * link (native-pointer) :: * objptr (object-pointer) * * The object type indexed by the header determines whether the weak * is valid or not. If the type has numObjptrs == 1, then the weak * pointer is valid. Otherwise, the type has numObjptrs == 0 and the * weak pointer is not valid. * * There may be zero or more bytes of padding for alignment purposes. * * The link native-pointer is used to chain the live weaks together * during a copying/mark-compact gc and is otherwise unused. * * The final component is the weak object-pointer. * * Note that the order of the fields is important. The non-objptr * field must be first, because a weak object is sometimes treated as * a normal object. */ typedef struct GC_weak { struct GC_weak *link; objptr objptr; } __attribute__ ((packed)) *GC_weak; COMPILE_TIME_ASSERT(GC_weak__packed, sizeof(struct GC_weak) == sizeof(struct GC_weak*) + sizeof(objptr)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofWeak (GC_state s); static inline size_t offsetofWeak (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE uint32_t GC_weakCanGet (GC_state s, pointer p); PRIVATE pointer GC_weakGet (GC_state s, pointer p); PRIVATE pointer GC_weakNew (GC_state s, GC_header header, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gc/world.c000066400000000000000000000110411416264345000173720ustar00rootroot00000000000000/* Copyright (C) 2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ void loadWorldFromFILE (GC_state s, FILE *f) { uint32_t magic; pointer start; if (DEBUG_WORLD) fprintf (stderr, "loadWorldFromFILE\n"); until (readChar (f) == '\000') ; magic = readUint32 (f); unless (s->magic == magic) die ("Invalid world: wrong magic number."); unless ((uintptr_t)MLton_gcState == (uintptr_t)(readPointer (f))) die ("Invalid world: wrong code address; load-world incompatible with PIE and/or ASLR"); unless ((pointer)s == readPointer (f)) die ("Invalid world: wrong static-data address; load-world incompatible with PIE and/or ASLR"); start = readPointer (f); s->heap.oldGenSize = readSize (f); s->atomicState = readUint32 (f); s->callFromCHandlerThread = readObjptr (f); s->currentThread = readObjptr (f); s->signalHandlerThread = readObjptr (f); createHeap (s, &s->heap, sizeofHeapDesired (s, s->heap.oldGenSize, 0), s->heap.oldGenSize); setCardMapAndCrossMap (s); fread_safe (s->staticHeaps.mutable.start, 1, s->staticHeaps.mutable.size, f); fread_safe (s->staticHeaps.root.start, 1, s->staticHeaps.root.size, f); fread_safe (s->heap.start, 1, s->heap.oldGenSize, f); if ((*(s->loadGlobals)) (f) != 0) diee ("Invalid world: failed to load globals."); unless (EOF == fgetc (f)) die ("Invalid world: unexpected data at end of file."); /* translateHeap must occur after loading the heap and globals, * since it changes pointers in all of them. */ translateHeap (s, start, s->heap.start, s->heap.oldGenSize); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); } void loadWorldFromFileName (GC_state s, const char *fileName) { FILE *f; if (DEBUG_WORLD) fprintf (stderr, "loadWorldFromFileName (%s)\n", fileName); f = fopen_safe (fileName, "rb"); loadWorldFromFILE (s, f); fclose_safe (f); } /* Don't use 'safe' functions, because we don't want the ML program to die. * Instead, check return values, and propagate them up to SML for an exception. */ int saveWorldToFILE (GC_state s, FILE *f) { char buf[128]; size_t len; uintptr_t gcStateFn; if (DEBUG_WORLD) fprintf (stderr, "saveWorldToFILE\n"); /* Compact the heap. */ performGC (s, 0, 0, TRUE, TRUE); snprintf (buf, cardof(buf), "Heap file created by MLton.\nheap.start = "FMTPTR"\nbytesLive = %"PRIuMAX"\n", (uintptr_t)s->heap.start, (uintmax_t)s->lastMajorStatistics.bytesLive); len = strlen(buf) + 1; /* +1 to get the '\000' */ if (fwrite (buf, 1, len, f) != len) return -1; if (fwrite (&s->magic, sizeof(uint32_t), 1, f) != 1) return -1; gcStateFn = (uintptr_t)MLton_gcState; if (fwrite (&gcStateFn, sizeof(uintptr_t), 1, f) != 1) return -1; if (fwrite (&s, sizeof(uintptr_t), 1, f) != 1) return -1; if (fwrite (&s->heap.start, sizeof(uintptr_t), 1, f) != 1) return -1; if (fwrite (&s->heap.oldGenSize, sizeof(size_t), 1, f) != 1) return -1; /* atomicState must be saved in the heap, because the saveWorld may * be run in the context of a critical section, which will expect to * be in the same context when it is restored. */ if (fwrite (&s->atomicState, sizeof(uint32_t), 1, f) != 1) return -1; if (fwrite (&s->callFromCHandlerThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (&s->currentThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (&s->signalHandlerThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (s->staticHeaps.mutable.start, 1, s->staticHeaps.mutable.size, f) != s->staticHeaps.mutable.size) return -1; if (fwrite (s->staticHeaps.root.start, 1, s->staticHeaps.root.size, f) != s->staticHeaps.root.size) return -1; if (fwrite (s->heap.start, 1, s->heap.oldGenSize, f) != s->heap.oldGenSize) return -1; if ((*(s->saveGlobals)) (f) != 0) return -1; return 0; } void GC_saveWorld (GC_state s, NullString8_t fileName) { FILE *f; enter (s); f = fopen ((const char*)fileName, "wb"); if (f == 0) { s->saveWorldStatus = false; goto done; } if (saveWorldToFILE (s, f) != 0) { s->saveWorldStatus = false; goto done; } if (fclose (f) != 0) { s->saveWorldStatus = false; goto done; } s->saveWorldStatus = true; done: leave (s); return; } C_Errno_t(Bool_t) GC_getSaveWorldStatus (GC_state s) { return (Bool_t)(s->saveWorldStatus); } mlton-20210117+dfsg/runtime/gc/world.h000066400000000000000000000014041416264345000174010ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void loadWorldFromFILE (GC_state s, FILE *f); static void loadWorldFromFileName (GC_state s, const char *fileName); static int saveWorldToFILE (GC_state s, FILE *f); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_saveWorld (GC_state s, NullString8_t fileName); /* TRUE = success, FALSE = failure */ PRIVATE C_Errno_t(Bool_t) GC_getSaveWorldStatus (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20210117+dfsg/runtime/gdtoa/000077500000000000000000000000001416264345000166075ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/gdtoa/README000066400000000000000000000425251416264345000174770ustar00rootroot00000000000000This directory contains source for a library of binary -> decimal and decimal -> binary conversion routines, for single-, double-, and extended-precision IEEE binary floating-point arithmetic, and other IEEE-like binary floating-point, including "double double", as in T. J. Dekker, "A Floating-Point Technique for Extending the Available Precision", Numer. Math. 18 (1971), pp. 224-242 and "Inside Macintosh: PowerPC Numerics", Addison-Wesley, 1994 The conversion routines use double-precision floating-point arithmetic and, where necessary, high precision integer arithmetic. The routines are generalizations of the strtod and dtoa routines described in David M. Gay, "Correctly Rounded Binary-Decimal and Decimal-Binary Conversions", Numerical Analysis Manuscript No. 90-10, Bell Labs, Murray Hill, 1990; http://cm.bell-labs.com/cm/cs/what/ampl/REFS/rounding.ps.gz (based in part on papers by Clinger and Steele & White: see the references in the above paper). The present conversion routines should be able to use any of IEEE binary, VAX, or IBM-mainframe double-precision arithmetic internally, but I (dmg) have so far only had a chance to test them with IEEE double precision arithmetic. The core conversion routines are strtodg for decimal -> binary conversions and gdtoa for binary -> decimal conversions. These routines operate on arrays of unsigned 32-bit integers of type ULong, a signed 32-bit exponent of type Long, and arithmetic characteristics described in struct FPI; FPI, Long, and ULong are defined in gdtoa.h. File arith.h is supposed to provide #defines that cause gdtoa.h to define its types correctly. File arithchk.c is source for a program that generates a suitable arith.h on all systems where I've been able to test it. The core conversion routines are meant to be called by helper routines that know details of the particular binary arithmetic of interest and convert. The present directory provides helper routines for 5 variants of IEEE binary floating-point arithmetic, each indicated by one or two letters: f IEEE single precision d IEEE double precision x IEEE extended precision, as on Intel 80x87 and software emulations of Motorola 68xxx chips that do not pad the way the 68xxx does, but only store 80 bits xL IEEE extended precision, as on Motorola 68xxx chips Q quad precision, as on Sun Sparc chips dd double double, pairs of IEEE double numbers whose sum is the desired value For decimal -> binary conversions, there are three families of helper routines: one for round-nearest (or the current rounding mode on IEEE-arithmetic systems that provide the C99 fegetround() function, if compiled with -DHonor_FLT_ROUNDS): strtof strtod strtodd strtopd strtopf strtopx strtopxL strtopQ one with rounding direction specified: strtorf strtord strtordd strtorx strtorxL strtorQ and one for computing an interval (at most one bit wide) that contains the decimal number: strtoIf strtoId strtoIdd strtoIx strtoIxL strtoIQ The latter call strtoIg, which makes one call on strtodg and adjusts the result to provide the desired interval. On systems where native arithmetic can easily make one-ulp adjustments on values in the desired floating-point format, it might be more efficient to use the native arithmetic. Routine strtodI is a variant of strtoId that illustrates one way to do this for IEEE binary double-precision arithmetic -- but whether this is more efficient remains to be seen. Functions strtod and strtof have "natural" return types, float and double -- strtod is specified by the C standard, and strtof appears in the stdlib.h of some systems, such as (at least some) Linux systems. The other functions write their results to their final argument(s): to the final two argument for the strtoI... (interval) functions, and to the final argument for the others (strtop... and strtor...). Where possible, these arguments have "natural" return types (double* or float*), to permit at least some type checking. In reality, they are viewed as arrays of ULong (or, for the "x" functions, UShort) values. On systems where long double is the appropriate type, one can pass long double* final argument(s) to these routines. The int value that these routines return is the return value from the call they make on strtodg; see the enum of possible return values in gdtoa.h. Source files g_ddfmt.c, misc.c, smisc.c, strtod.c, strtodg.c, and ulp.c should use true IEEE double arithmetic (not, e.g., double extended), at least for storing (and viewing the bits of) the variables declared "double" within them. One detail indicated in struct FPI is whether the target binary arithmetic departs from the IEEE standard by flushing denormalized numbers to 0. On systems that do this, the helper routines for conversion to double-double format (when compiled with Sudden_Underflow #defined) penalize the bottom of the exponent range so that they return a nonzero result only when the least significant bit of the less significant member of the pair of double values returned can be expressed as a normalized double value. An alternative would be to drop to 53-bit precision near the bottom of the exponent range. To get correct rounding, this would (in general) require two calls on strtodg (one specifying 126-bit arithmetic, then, if necessary, one specifying 53-bit arithmetic). By default, the core routine strtodg and strtod set errno to ERANGE if the result overflows to +Infinity or underflows to 0. Compile these routines with NO_ERRNO #defined to inhibit errno assignments. Routine strtod is based on netlib's "dtoa.c from fp", and (f = strtod(s,se)) is more efficient for some conversions than, say, strtord(s,se,1,&f). Parts of strtod require true IEEE double arithmetic with the default rounding mode (round-to-nearest) and, on systems with IEEE extended-precision registers, double-precision (53-bit) rounding precision. If the machine uses (the equivalent of) Intel 80x87 arithmetic, the call _control87(PC_53, MCW_PC); does this with many compilers. Whether this or another call is appropriate depends on the compiler; for this to work, it may be necessary to #include "float.h" or another system-dependent header file. Source file strtodnrp.c gives a strtod that does not require 53-bit rounding precision on systems (such as Intel IA32 systems) that may suffer double rounding due to use of extended-precision registers. For some conversions this variant of strtod is less efficient than the one in strtod.c when the latter is run with 53-bit rounding precision. When float or double are involved, the values that the strto* routines return for NaNs are determined by gd_qnan.h, which the makefile generates by running the program whose source is qnan.c. For other types, default NaN values are specified in g__fmt.c and may need adjusting. Note that the rules for distinguishing signaling from quiet NaNs are system-dependent. For cross-compilation, you need to determine arith.h and gd_qnan.h suitably, e.g., using the arithmetic of the target machine. C99's hexadecimal floating-point constants are recognized by the strto* routines (but this feature has not yet been heavily tested). Compiling with NO_HEX_FP #defined disables this feature. When compiled with -DINFNAN_CHECK, the strto* routines recognize C99's NaN and Infinity syntax. Moreover, unless No_Hex_NaN is #defined, the strto* routines also recognize C99's NaN(...) syntax: they accept (case insensitively) strings of the form NaN(x), where x is a string of hexadecimal digits and spaces; if there is only one string of hexadecimal digits, it is taken for the fraction bits of the resulting NaN; if there are two or more strings of hexadecimal digits, each string is assigned to the next available sequence of 32-bit words of fractions bits (starting with the most significant), right-aligned in each sequence. Strings of hexadecimal digits may be preceded by "0x" or "0X". For binary -> decimal conversions, I've provided a family of helper routines: g_ffmt g_dfmt g_ddfmt g_xfmt g_xLfmt g_Qfmt g_ffmt_p g_dfmt_p g_ddfmt_p g_xfmt_p g_xLfmt_p g_Qfmt_p which do a "%g" style conversion either to a specified number of decimal places (if their ndig argument is positive), or to the shortest decimal string that rounds to the given binary floating-point value (if ndig <= 0). They write into a buffer supplied as an argument and return either a pointer to the end of the string (a null character) in the buffer, if the buffer was long enough, or 0. Other forms of conversion are easily done with the help of gdtoa(), such as %e or %f style and conversions with direction of rounding specified (so that, if desired, the decimal value is either >= or <= the binary value). On IEEE-arithmetic systems that provide the C99 fegetround() function, if compiled with -DHonor_FLT_ROUNDS, these routines honor the current rounding mode. For pedants, the ...fmt_p() routines are similar to the ...fmt() routines, but have an additional final int argument, nik, that for conversions of Infinity or NaN, determines whether upper, lower, or mixed case is used, whether (...) is added to NaN values, and whether the sign of a NaN is reported or suppressed: nik = ic + 6*(nb + 3*ns), where ic with 0 <= ic < 6 controls the rendering of Infinity and NaN: 0 ==> Infinity or NaN 1 ==> infinity or nan 2 ==> INFINITY or NAN 3 ==> Inf or NaN 4 ==> inf or nan 5 ==> INF or NAN nb with 0 <= nb < 3 determines whether NaN values are rendered as NaN(...): 0 ==> no 1 ==> yes 2 ==> no for default NaN values; yes otherwise ns = 0 or 1 determines whether the sign of NaN values reported: 0 ==> distinguish NaN and -NaN 1 ==> report both as NaN For an example of more general conversions based on dtoa(), see netlib's "printf.c from ampl/solvers". For double-double -> decimal, g_ddfmt() assumes IEEE-like arithmetic of precision max(126, #bits(input)) bits, where #bits(input) is the number of mantissa bits needed to represent the sum of the two double values in the input. The makefile creates a library, gdtoa.a. To use the helper routines, a program only needs to include gdtoa.h. All the source files for gdtoa.a include a more extensive gdtoaimp.h; among other things, gdtoaimp.h has #defines that make "internal" names end in _D2A. To make a "system" library, one could modify these #defines to make the names start with __. Various comments about possible #defines appear in gdtoaimp.h, but for most purposes, arith.h should set suitable #defines. Systems with preemptive scheduling of multiple threads require some manual intervention. On such systems, it's necessary to compile dmisc.c, dtoa.c gdota.c, and misc.c with MULTIPLE_THREADS #defined, and to provide (or suitably #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed in pow5mult, ensures lazy evaluation of only one copy of high powers of 5; omitting this lock would introduce a small probability of wasting memory, but would otherwise be harmless.) Routines that call dtoa or gdtoa directly must also invoke freedtoa(s) to free the value s returned by dtoa or gdtoa. It's OK to do so whether or not MULTIPLE_THREADS is #defined, and the helper g_*fmt routines listed above all do this indirectly (in gfmt_D2A(), which they all call). When MULTIPLE_THREADS is #defined, source file misc.c provides void set_max_gdtoa_threads(unsigned int n); and expects unsigned int dtoa_get_threadno(void); to be available (possibly provided by #define dtoa_get_threadno omp_get_thread_num if OpenMP is in use or by #define dtoa_get_threadno pthread_self if Pthreads is in use), to return the current thread number. If set_max_gdtoa_threads(n) was called and the current thread number is k with k < n, then calls on ACQUIRE_DTOA_LOCK(...) and FREE_DTOA_LOCK(...) are avoided; instead each thread with thread number < n has a separate copy of relevant data structures. After set_max_gdtoa_threads(n), a call set_max_gdtoa_threads(m) with m <= n has has no effect, but a call with m > n is honored. Such a call invokes REALLOC (assumed to be "realloc" if REALLOC is not #defined) to extend the size of the relevant array. By default, there is a private pool of memory of length 2304 bytes for intermediate quantities, and MALLOC (see gdtoaimp.h) is called only if the private pool does not suffice. 2304 is large enough that MALLOC is called only under very unusual circumstances (decimal -> binary conversion of very long strings) for conversions to and from double precision. For systems with preemptively scheduled multiple threads or for conversions to extended or quad, it may be appropriate to #define PRIVATE_MEM nnnn, where nnnn is a suitable value > 2304. For extended and quad precisions, -DPRIVATE_MEM=20000 is probably plenty even for many digits at the ends of the exponent range. Use of the private pool avoids some overhead. When MULTIPLE_THREADS is #defined, only thread 0 uses PRIVATE_MEM. Directory test provides some test routines. See its README. I've also tested this stuff (except double double conversions) with Vern Paxson's testbase program: see V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal Conversion", manuscript, May 1991, ftp://ftp.ee.lbl.gov/testbase-report.ps.Z . (The same ftp directory has source for testbase.) Some system-dependent additions to CFLAGS in the makefile: HP-UX: -Aa -Ae OSF (DEC Unix): -ieee_with_no_inexact SunOS 4.1x: -DKR_headers -DBad_float_h If you want to put this stuff into a shared library and your operating system requires export lists for shared libraries, the following would be an appropriate export list: dtoa freedtoa g_Qfmt g_ddfmt g_dfmt g_ffmt g_xLfmt g_xfmt gdtoa strtoIQ strtoId strtoIdd strtoIf strtoIx strtoIxL strtod strtodI strtodg strtof strtopQ strtopd strtopdd strtopf strtopx strtopxL strtorQ strtord strtordd strtorf strtorx strtorxL When time permits, I (dmg) hope to write in more detail about the present conversion routines; for now, this README file must suffice. Meanwhile, if you wish to write helper functions for other kinds of IEEE-like arithmetic, some explanation of struct FPI and the bits array may be helpful. Both gdtoa and strtodg operate on a bits array described by FPI *fpi. The bits array is of type ULong, a 32-bit unsigned integer type. Floating-point numbers have fpi->nbits bits, with the least significant 32 bits in bits[0], the next 32 bits in bits[1], etc. These numbers are regarded as integers multiplied by 2^e (i.e., 2 to the power of the exponent e), where e is the second argument (be) to gdtoa and is stored in *exp by strtodg. The minimum and maximum exponent values fpi->emin and fpi->emax for normalized floating-point numbers reflect this arrangement. For example, the P754 standard for binary IEEE arithmetic specifies doubles as having 53 bits, with normalized values of the form 1.xxxxx... times 2^(b-1023), with 52 bits (the x's) and the biased exponent b represented explicitly; b is an unsigned integer in the range 1 <= b <= 2046 for normalized finite doubles, b = 0 for denormals, and b = 2047 for Infinities and NaNs. To turn an IEEE double into the representation used by strtodg and gdtoa, we multiply 1.xxxx... by 2^52 (to make it an integer) and reduce the exponent e = (b-1023) by 52: fpi->emin = 1 - 1023 - 52 fpi->emax = 1046 - 1023 - 52 In various wrappers for IEEE double, we actually write -53 + 1 rather than -52, to emphasize that there are 53 bits including one implicit bit. Field fpi->rounding indicates the desired rounding direction, with possible values FPI_Round_zero = toward 0, FPI_Round_near = unbiased rounding -- the IEEE default, FPI_Round_up = toward +Infinity, and FPI_Round_down = toward -Infinity given in gdtoa.h. Field fpi->sudden_underflow indicates whether strtodg should return denormals or flush them to zero. Normal floating-point numbers have bit fpi->nbits in the bits array on. Denormals have it off, with exponent = fpi->emin. Strtodg provides distinct return values for normals and denormals; see gdtoa.h. Compiling g__fmt.c, strtod.c, and strtodg.c with -DUSE_LOCALE causes the decimal-point character to be taken from the current locale; otherwise it is '.'. Source files dtoa.c and strtod.c in this directory are derived from netlib's "dtoa.c from fp" and are meant to function equivalently. When compiled with Honor_FLT_ROUNDS #defined (on systems that provide FLT_ROUNDS and fegetround() as specified in the C99 standard), they honor the current rounding mode. Because FLT_ROUNDS is buggy on some (Linux) systems -- not reflecting calls on fesetround(), as the C99 standard says it should -- when Honor_FLT_ROUNDS is #defined, the current rounding mode is obtained from fegetround() rather than from FLT_ROUNDS, unless Trust_FLT_ROUNDS is also #defined. Compile with -DUSE_LOCALE to use the current locale; otherwise decimal points are assumed to be '.'. With -DUSE_LOCALE, unless you also compile with -DNO_LOCALE_CACHE, the details about the current "decimal point" character string are cached and assumed not to change during the program's execution. On machines with a 64-bit long double and perhaps a 113-bit "quad" type, you can invoke "make Printf" to add Printf (and variants, such as Fprintf) to gdtoa.a. These are analogs, declared in stdio1.h, of printf and fprintf, etc. in which %La, %Le, %Lf, and %Lg are for long double and (if appropriate) %Lqa, %Lqe, %Lqf, and %Lqg are for quad precision printing. Please send comments to David M. Gay (dmg at acm dot org, with " at " changed at "@" and " dot " changed to "."). mlton-20210117+dfsg/runtime/gdtoa/arithchk.c000066400000000000000000000100751416264345000205530ustar00rootroot00000000000000/**************************************************************** Copyright (C) 1997, 1998 Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Try to deduce arith.h from arithmetic properties. */ #include static int dalign; typedef struct Akind { char *name; int kind; } Akind; static Akind IEEE_8087 = { "IEEE_8087", 1 }, IEEE_MC68k = { "IEEE_MC68k", 2 }, IBM = { "IBM", 3 }, VAX = { "VAX", 4 }, CRAY = { "CRAY", 5}; static Akind * Lcheck(void) { union { double d; long L[2]; } __attribute__((__may_alias__)) u; struct { double d; long L; } x[2]; if (sizeof(x) > 2*(sizeof(double) + sizeof(long))) dalign = 1; u.L[0] = u.L[1] = 0; u.d = 1e13; if (u.L[0] == 1117925532 && u.L[1] == -448790528) return &IEEE_MC68k; if (u.L[1] == 1117925532 && u.L[0] == -448790528) return &IEEE_8087; if (u.L[0] == -2065213935 && u.L[1] == 10752) return &VAX; if (u.L[0] == 1267827943 && u.L[1] == 704643072) return &IBM; return 0; } static Akind * icheck(void) { union { double d; int L[2]; } __attribute__((__may_alias__)) u; struct { double d; int L; } x[2]; if (sizeof(x) > 2*(sizeof(double) + sizeof(int))) dalign = 1; u.L[0] = u.L[1] = 0; u.d = 1e13; if (u.L[0] == 1117925532 && u.L[1] == -448790528) return &IEEE_MC68k; if (u.L[1] == 1117925532 && u.L[0] == -448790528) return &IEEE_8087; if (u.L[0] == -2065213935 && u.L[1] == 10752) return &VAX; if (u.L[0] == 1267827943 && u.L[1] == 704643072) return &IBM; return 0; } static Akind * ccheck(int ac, char **av) { union { double d; long L; } __attribute__((__may_alias__)) u; long Cray1; /* Cray1 = 4617762693716115456 -- without overflow on non-Crays */ /* The next three tests should always be true. */ Cray1 = ac >= -2 ? 4617762 : 0; if (ac >= -1) Cray1 = 1000000*Cray1 + 693716; if (av || ac >= 0) Cray1 = 1000000*Cray1 + 115456; u.d = 1e13; if (u.L == Cray1) return &CRAY; return 0; } static int fzcheck(void) { double a, b; int i; a = 1.; b = .1; for(i = 155;; b *= b, i >>= 1) { if (i & 1) { a *= b; if (i == 1) break; } } b = a * a; return b == 0.; } int main(int argc, char **argv) { Akind *a = 0; int Ldef = 0; FILE *f; #ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ f = fopen("arith.h", "w"); if (!f) { printf("Cannot open arith.h\n"); return 1; } #else f = stdout; #endif if (sizeof(double) == 2*sizeof(long)) a = Lcheck(); else if (sizeof(double) == 2*sizeof(int)) { Ldef = 1; a = icheck(); } else if (sizeof(double) == sizeof(long)) a = ccheck(argc, argv); if (a) { fprintf(f, "#define %s\n#define Arith_Kind_ASL %d\n", a->name, a->kind); if (Ldef) fprintf(f, "#define Long int\n#define Intcast (int)(long)\n"); if (dalign) fprintf(f, "#define Double_Align\n"); if (sizeof(char*) == 8) fprintf(f, "#define X64_bit_pointers\n"); #ifndef NO_LONG_LONG if (sizeof(long long) < 8) #endif fprintf(f, "#define NO_LONG_LONG\n"); if (a->kind <= 2 && fzcheck()) fprintf(f, "#define Sudden_Underflow\n"); return 0; } fprintf(f, "/* Unknown arithmetic */\n"); return 1; } mlton-20210117+dfsg/runtime/gdtoa/dmisc.c000066400000000000000000000112711416264345000200540ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifndef MULTIPLE_THREADS char *dtoa_result; #endif char * #ifdef KR_headers rv_alloc(i MTa) int i; MTk #else rv_alloc(int i MTd) #endif { int j, k, *r; j = sizeof(ULong); for(k = 0; (int)(sizeof(Bigint) - sizeof(ULong) - sizeof(int)) + j <= i; j <<= 1) k++; r = (int*)Balloc(k MTa); *r = k; return #ifndef MULTIPLE_THREADS dtoa_result = #endif (char *)(r+1); } char * #ifdef KR_headers nrv_alloc(s, rve, n MTa) char *s, **rve; int n; MTk #else nrv_alloc(char *s, char **rve, int n MTd) #endif { char *rv, *t; t = rv = rv_alloc(n MTa); while((*t = *s++) !=0) t++; if (rve) *rve = t; return rv; } /* freedtoa(s) must be used to free values s returned by dtoa * when MULTIPLE_THREADS is #defined. It should be used in all cases, * but for consistency with earlier versions of dtoa, it is optional * when MULTIPLE_THREADS is not defined. */ void #ifdef KR_headers gdtoa__freedtoa(s) char *s; #else gdtoa__freedtoa(char *s) #endif { #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif Bigint *b = (Bigint *)((int *)s - 1); b->maxwds = 1 << (b->k = *(int*)b); Bfree(b MTb); #ifndef MULTIPLE_THREADS if (s == dtoa_result) dtoa_result = 0; #endif } int quorem #ifdef KR_headers (b, S) Bigint *b, *S; #else (Bigint *b, Bigint *S) #endif { int n; ULong *bx, *bxe, q, *sx, *sxe; #ifdef ULLong ULLong borrow, carry, y, ys; #else ULong borrow, carry, y, ys; #ifdef Pack_32 ULong si, z, zs; #endif #endif n = S->wds; #ifdef DEBUG /*debug*/ if (b->wds > n) /*debug*/ Bug("oversize b in quorem"); #endif if (b->wds < n) return 0; sx = S->x; sxe = sx + --n; bx = b->x; bxe = bx + n; q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ #ifdef DEBUG /*debug*/ if (q > 9) /*debug*/ Bug("oversized quotient in quorem"); #endif if (q) { borrow = 0; carry = 0; do { #ifdef ULLong ys = *sx++ * (ULLong)q + carry; carry = ys >> 32; y = *bx - (ys & 0xffffffffUL) - borrow; borrow = y >> 32 & 1UL; *bx++ = y & 0xffffffffUL; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) * q + carry; zs = (si >> 16) * q + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ * q + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); if (!*bxe) { bx = b->x; while(--bxe > bx && !*bxe) --n; b->wds = n; } } if (cmp(b, S) >= 0) { q++; borrow = 0; carry = 0; bx = b->x; sx = S->x; do { #ifdef ULLong ys = *sx++ + carry; carry = ys >> 32; y = *bx - (ys & 0xffffffffUL) - borrow; borrow = y >> 32 & 1UL; *bx++ = y & 0xffffffffUL; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) + carry; zs = (si >> 16) + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); bx = b->x; bxe = bx + n; if (!*bxe) { while(--bxe > bx && !*bxe) --n; b->wds = n; } } return q; } mlton-20210117+dfsg/runtime/gdtoa/dtoa.c000066400000000000000000000435171416264345000177140ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 1999 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. * * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. * * Modifications: * 1. Rather than iterating, we use a simple numeric overestimate * to determine k = floor(log10(d)). We scale relevant * quantities using O(log2(k)) rather than O(k) multiplications. * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't * try to generate digits strictly left to right. Instead, we * compute with fewer bits and propagate the carry if necessary * when rounding the final digit up. This is often faster. * 3. Under the assumption that input will be rounded nearest, * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. * That is, we allow equality in stopping tests when the * round-nearest rule will give the same floating-point value * as would satisfaction of the stopping test with strict * inequality. * 4. We remove common factors of powers of 2 from relevant * quantities. * 5. When converting floating-point integers less than 1e16, * we use floating-point arithmetic rather than resorting * to multiple-precision integers. * 6. When asked to produce fewer than 15 digits, we first try * to get by with floating-point arithmetic; we resort to * multiple-precision integer arithmetic only if we cannot * guarantee that the floating-point calculation has given * the correctly rounded result. For k requested digits and * "uniformly" distributed input, the probability is * something like 10^(k-15) that we must resort to the Long * calculation. */ #ifdef Honor_FLT_ROUNDS #undef Check_FLT_ROUNDS #define Check_FLT_ROUNDS #else #define Rounding Flt_Rounds #endif char * gdtoa__dtoa #ifdef KR_headers (d0, mode, ndigits, decpt, sign, rve) double d0; int mode, ndigits, *decpt, *sign; char **rve; #else (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve) #endif { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives 1e23 whereas mode 1 gives 9.999999999999999e22. 2 ==> max(1,ndigits) significant digits. This gives a return value similar to that of ecvt, except that trailing zeros are suppressed. 3 ==> through ndigits past the decimal point. This gives a return value similar to that from fcvt, except that trailing zeros are suppressed, and ndigits can be negative. 4,5 ==> similar to 2 and 3, respectively, but (in round-nearest mode) with the tests of mode 0 to possibly return a shorter string that rounds to d. With IEEE arithmetic and compilation with -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same as modes 2 and 3 when FLT_ROUNDS != 1. 6-9 ==> Debugging modes similar to mode - 4: don't try fast floating-point estimate (if applicable). Values of mode other than 0-9 are treated as mode 0. Sufficient space is allocated to the return value to hold the suppressed trailing zeros. */ #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, spec_case, try_quick; Long L; #ifndef Sudden_Underflow int denorm; ULong x; #endif Bigint *b, *b1, *delta, *mlo, *mhi, *S; U d, d2, eps, eps1; double ds; char *s, *s0; #ifdef SET_INEXACT int inexact, oldinexact; #endif #ifdef Honor_FLT_ROUNDS /*{*/ int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ #endif /*}*/ #ifndef MULTIPLE_THREADS if (dtoa_result) { gdtoa__freedtoa(dtoa_result); dtoa_result = 0; } #endif d.d = d0; if (word0(&d) & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; word0(&d) &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; #if defined(IEEE_Arith) + defined(VAX) #ifdef IEEE_Arith if ((word0(&d) & Exp_mask) == Exp_mask) #else if (word0(&d) == 0x8000) #endif { /* Infinity or NaN */ *decpt = 9999; #ifdef IEEE_Arith if (!word1(&d) && !(word0(&d) & 0xfffff)) return nrv_alloc("Infinity", rve, 8 MTb); #endif return nrv_alloc("NaN", rve, 3 MTb); } #endif #ifdef IBM dval(&d) += 0; /* normalize */ #endif if (!dval(&d)) { *decpt = 1; return nrv_alloc("0", rve, 1 MTb); } #ifdef SET_INEXACT try_quick = oldinexact = get_inexact(); inexact = 1; #endif #ifdef Honor_FLT_ROUNDS if (Rounding >= 2) { if (*sign) Rounding = Rounding == 2 ? 0 : 2; else if (Rounding != 2) Rounding = 0; } #endif b = d2b(dval(&d), &be, &bbits MTb); #ifdef Sudden_Underflow i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); #else if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) { #endif dval(&d2) = dval(&d); word0(&d2) &= Frac_mask1; word0(&d2) |= Exp_11; #ifdef IBM if (( j = 11 - hi0bits(word0(&d2) & Frac_mask) )!=0) dval(&d2) /= 1 << j; #endif /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2) * * This suggests computing an approximation k to log10(&d) by * * k = (i - Bias)*0.301029995663981 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); * * We want k to be too large rather than too small. * The error in the first-order Taylor series approximation * is in our favor, so we just round up the constant enough * to compensate for any error in the multiplication of * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, * adding 1e-13 to the constant term more than suffices. * Hence we adjust the constant term to 0.1760912590558. * (We could get a more accurate k by invoking log10, * but this is probably not worthwhile.) */ i -= Bias; #ifdef IBM i <<= 2; i += j; #endif #ifndef Sudden_Underflow denorm = 0; } else { /* d is denormalized */ i = bbits + be + (Bias + (P-1) - 1); x = i > 32 ? word0(&d) << (64 - i) | word1(&d) >> (i - 32) : word1(&d) << (32 - i); dval(&d2) = x; word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ i -= (Bias + (P-1) - 1) + 1; denorm = 1; } #endif ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; k = (int)ds; if (ds < 0. && ds != k) k--; /* want k = floor(ds) */ k_check = 1; if (k >= 0 && k <= Ten_pmax) { if (dval(&d) < tens[k]) k--; k_check = 0; } j = bbits - i - 1; if (j >= 0) { b2 = 0; s2 = j; } else { b2 = -j; s2 = 0; } if (k >= 0) { b5 = 0; s5 = k; s2 += k; } else { b2 -= k; b5 = -k; s5 = 0; } if (mode < 0 || mode > 9) mode = 0; #ifndef SET_INEXACT #ifdef Check_FLT_ROUNDS try_quick = Rounding == 1; #else try_quick = 1; #endif #endif /*SET_INEXACT*/ if (mode > 5) { mode -= 4; try_quick = 0; } leftright = 1; ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ /* silence erroneous "gcc -Wall" warning. */ switch(mode) { case 0: case 1: i = 18; ndigits = 0; break; case 2: leftright = 0; /* no break */ case 4: if (ndigits <= 0) ndigits = 1; ilim = ilim1 = i = ndigits; break; case 3: leftright = 0; /* no break */ case 5: i = ndigits + k + 1; ilim = i; ilim1 = i - 1; if (i <= 0) i = 1; } s = s0 = rv_alloc(i MTb); #ifdef Honor_FLT_ROUNDS if (mode > 1 && Rounding != 1) leftright = 0; #endif if (ilim >= 0 && ilim <= Quick_max && try_quick) { /* Try to get by with floating-point arithmetic. */ i = 0; dval(&d2) = dval(&d); k0 = k; ilim0 = ilim; ieps = 2; /* conservative */ if (k > 0) { ds = tens[k&0xf]; j = k >> 4; if (j & Bletch) { /* prevent overflows */ j &= Bletch - 1; dval(&d) /= bigtens[n_bigtens-1]; ieps++; } for(; j; j >>= 1, i++) if (j & 1) { ieps++; ds *= bigtens[i]; } dval(&d) /= ds; } else if (( j1 = -k )!=0) { dval(&d) *= tens[j1 & 0xf]; for(j = j1 >> 4; j; j >>= 1, i++) if (j & 1) { ieps++; dval(&d) *= bigtens[i]; } } if (k_check && dval(&d) < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; dval(&d) *= 10.; ieps++; } dval(&eps) = ieps*dval(&d) + 7.; word0(&eps) -= (P-1)*Exp_msk1; if (ilim == 0) { S = mhi = 0; dval(&d) -= 5.; if (dval(&d) > dval(&eps)) goto one_digit; if (dval(&d) < -dval(&eps)) goto no_digits; goto fast_failed; } #ifndef No_leftright if (leftright) { /* Use Steele & White method of only * generating digits needed. */ dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); if (k0 < 0 && j1 >= 307) { eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */ word0(&eps1) -= Exp_msk1 * (Bias+P-1); dval(&eps1) *= tens[j1 & 0xf]; for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++) if (j & 1) dval(&eps1) *= bigtens[i]; if (eps.d < eps1.d) eps.d = eps1.d; if (10. - d.d < 10.*eps.d && eps.d < 1.) { /* eps.d < 1. excludes trouble with the tiniest denormal */ *s++ = '1'; ++k; goto ret1; } } for(i = 0;;) { L = dval(&d); dval(&d) -= L; *s++ = '0' + (int)L; if (dval(&d) < dval(&eps)) goto retc; if (1. - dval(&d) < dval(&eps)) goto bump_up; if (++i >= ilim) break; dval(&eps) *= 10.; dval(&d) *= 10.; } } else { #endif /* Generate ilim digits, then fix them up. */ dval(&eps) *= tens[ilim-1]; for(i = 1;; i++, dval(&d) *= 10.) { L = (Long)(dval(&d)); if (!(dval(&d) -= L)) ilim = i; *s++ = '0' + (int)L; if (i == ilim) { if (dval(&d) > 0.5 + dval(&eps)) goto bump_up; else if (dval(&d) < 0.5 - dval(&eps)) goto retc; break; } } #ifndef No_leftright } #endif fast_failed: s = s0; dval(&d) = dval(&d2); k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= Int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || dval(&d) <= 5*ds) goto no_digits; goto one_digit; } for(i = 1;; i++, dval(&d) *= 10.) { L = (Long)(dval(&d) / ds); dval(&d) -= L*ds; #ifdef Check_FLT_ROUNDS /* If FLT_ROUNDS == 2, L will usually be high by 1 */ if (dval(&d) < 0) { L--; dval(&d) += ds; } #endif *s++ = '0' + (int)L; if (!dval(&d)) { #ifdef SET_INEXACT inexact = 0; #endif break; } if (i == ilim) { #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(Rounding) { case 0: goto retc; case 2: goto bump_up; } #endif dval(&d) += dval(&d); #ifdef ROUND_BIASED if (dval(&d) >= ds) #else if (dval(&d) > ds || (dval(&d) == ds && L & 1)) #endif { bump_up: while(*--s == '9') if (s == s0) { k++; *s = '0'; break; } ++*s++; } break; } } goto retc; } m2 = b2; m5 = b5; mhi = mlo = 0; if (leftright) { i = #ifndef Sudden_Underflow denorm ? be + (Bias + (P-1) - 1 + 1) : #endif #ifdef IBM 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); #else 1 + P - bbits; #endif b2 += i; s2 += i; mhi = i2b(1 MTb); } if (m2 > 0 && s2 > 0) { i = m2 < s2 ? m2 : s2; b2 -= i; m2 -= i; s2 -= i; } if (b5 > 0) { if (leftright) { if (m5 > 0) { mhi = pow5mult(mhi, m5 MTb); b1 = mult(mhi, b MTb); Bfree(b MTb); b = b1; } if (( j = b5 - m5 )!=0) b = pow5mult(b, j MTb); } else b = pow5mult(b, b5 MTb); } S = i2b(1 MTb); if (s5 > 0) S = pow5mult(S, s5 MTb); /* Check for special case that d is a normalized power of 2. */ spec_case = 0; if ((mode < 2 || leftright) #ifdef Honor_FLT_ROUNDS && Rounding == 1 #endif ) { if (!word1(&d) && !(word0(&d) & Bndry_mask) #ifndef Sudden_Underflow && word0(&d) & (Exp_mask & ~Exp_msk1) #endif ) { /* The special case */ b2 += Log2P; s2 += Log2P; spec_case = 1; } } /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. * * Perhaps we should just compute leading 28 bits of S once * and for all and pass them and a shift to quorem, so it * can do shifts and ors to compute the numerator for q. */ #ifdef Pack_32 if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0) i = 32 - i; #else if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0) i = 16 - i; #endif if (i > 4) { i -= 4; b2 += i; m2 += i; s2 += i; } else if (i < 4) { i += 28; b2 += i; m2 += i; s2 += i; } if (b2 > 0) b = lshift(b, b2 MTb); if (s2 > 0) S = lshift(S, s2 MTb); if (k_check) { if (cmp(b,S) < 0) { k--; b = multadd(b, 10, 0 MTb); /* we botched the k estimate */ if (leftright) mhi = multadd(mhi, 10, 0 MTb); ilim = ilim1; } } if (ilim <= 0 && (mode == 3 || mode == 5)) { if (ilim < 0 || cmp(b,S = multadd(S,5,0 MTb)) <= 0) { /* no digits, fcvt style */ no_digits: k = -1 - ndigits; goto ret; } one_digit: *s++ = '1'; k++; goto ret; } if (leftright) { if (m2 > 0) mhi = lshift(mhi, m2 MTb); /* Compute mlo -- check for special case * that d is a normalized power of 2. */ mlo = mhi; if (spec_case) { mhi = Balloc(mhi->k MTb); Bcopy(mhi, mlo); mhi = lshift(mhi, Log2P MTb); } for(i = 1;;i++) { dig = quorem(b,S) + '0'; /* Do we yet have the shortest decimal string * that will round to d? */ j = cmp(b, mlo); delta = diff(S, mhi MTb); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta MTb); #ifndef ROUND_BIASED if (j1 == 0 && mode != 1 && !(word1(&d) & 1) #ifdef Honor_FLT_ROUNDS && Rounding >= 1 #endif ) { if (dig == '9') goto round_9_up; if (j > 0) dig++; #ifdef SET_INEXACT else if (!b->x[0] && b->wds <= 1) inexact = 0; #endif *s++ = dig; goto ret; } #endif if (j < 0 || (j == 0 && mode != 1 #ifndef ROUND_BIASED && !(word1(&d) & 1) #endif )) { if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto accept_dig; } #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(Rounding) { case 0: goto accept_dig; case 2: goto keep_dig; } #endif /*Honor_FLT_ROUNDS*/ if (j1 > 0) { b = lshift(b, 1 MTb); j1 = cmp(b, S); #ifdef ROUND_BIASED if (j1 >= 0 /*)*/ #else if ((j1 > 0 || (j1 == 0 && dig & 1)) #endif && dig++ == '9') goto round_9_up; } accept_dig: *s++ = dig; goto ret; } if (j1 > 0) { #ifdef Honor_FLT_ROUNDS if (!Rounding && mode > 1) goto accept_dig; #endif if (dig == '9') { /* possible if i == 1 */ round_9_up: *s++ = '9'; goto roundoff; } *s++ = dig + 1; goto ret; } #ifdef Honor_FLT_ROUNDS keep_dig: #endif *s++ = dig; if (i == ilim) break; b = multadd(b, 10, 0 MTb); if (mlo == mhi) mlo = mhi = multadd(mhi, 10, 0 MTb); else { mlo = multadd(mlo, 10, 0 MTb); mhi = multadd(mhi, 10, 0 MTb); } } } else for(i = 1;; i++) { *s++ = dig = quorem(b,S) + '0'; if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto ret; } if (i >= ilim) break; b = multadd(b, 10, 0 MTb); } /* Round off last digit */ #ifdef Honor_FLT_ROUNDS switch(Rounding) { case 0: goto trimzeros; case 2: goto roundoff; } #endif b = lshift(b, 1 MTb); j = cmp(b, S); #ifdef ROUND_BIASED if (j >= 0) #else if (j > 0 || (j == 0 && dig & 1)) #endif { roundoff: while(*--s == '9') if (s == s0) { k++; *s++ = '1'; goto ret; } ++*s++; } else { #ifdef Honor_FLT_ROUNDS trimzeros: #endif while(*--s == '0'); s++; } ret: Bfree(S MTb); if (mhi) { if (mlo && mlo != mhi) Bfree(mlo MTb); Bfree(mhi MTb); } retc: while(s > s0 && s[-1] == '0') --s; ret1: #ifdef SET_INEXACT if (inexact) { if (!oldinexact) { word0(&d) = Exp_1 + (70 << Exp_shift); word1(&d) = 0; dval(&d) += 1.; } } else if (!oldinexact) clear_inexact(); #endif Bfree(b MTb); *s = 0; *decpt = k + 1; if (rve) *rve = s; return s0; } mlton-20210117+dfsg/runtime/gdtoa/g_Qfmt.c000066400000000000000000000056421416264345000201770ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif char* #ifdef KR_headers gdtoa__g_Qfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; size_t bufsize; #else gdtoa__g_Qfmt(char *buf, void *V, int ndig, size_t bufsize) #endif { static FPI fpi0 = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[4], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)V; sign = L[_0] & 0x80000000L; bits[3] = L[_0] & 0xffff; bits[2] = L[_1]; bits[1] = L[_2]; bits[0] = L[_3]; b = buf; if ( (ex = (L[_0] & 0x7fff0000L) >> 16) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (bits[0] | bits[1] | bits[2] | bits[3]) b = strcp(b, "NaN"); else { b = buf; if (sign) *b++ = '-'; b = strcp(b, "Infinity"); } return b; } i = STRTOG_Normal; bits[3] |= 0x10000; } else if (bits[0] | bits[1] | bits[2] | bits[3]) { i = STRTOG_Denormal; ex = 1; } else { #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 112; mode = 2; if (ndig <= 0) { if (bufsize < 48) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_Qfmt_p.c000066400000000000000000000064711416264345000205170ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_Q_D2A[4]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif char* #ifdef KR_headers gdtoa__g_Qfmt_p(buf, V, ndig, bufsize, nik) char *buf; char *V; int ndig; size_t bufsize; int nik; #else gdtoa__g_Qfmt_p(char *buf, void *V, int ndig, size_t bufsize, int nik) #endif { static FPI fpi0 = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[4], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)V; sign = L[_0] & 0x80000000L; bits[3] = L[_0] & 0xffff; bits[2] = L[_1]; bits[1] = L[_2]; bits[0] = L[_3]; b = buf; if ( (ex = (L[_0] & 0x7fff0000L) >> 16) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (nik < 0 || nik > 35) nik = 0; if (bits[0] | bits[1] | bits[2] | bits[3]) { if (sign && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || bits[0] != NanDflt_Q_D2A[0] || bits[1] != NanDflt_Q_D2A[1] || bits[2] != NanDflt_Q_D2A[2] || (bits[2] ^ NanDflt_Q_D2A[2]) & 0xffff)) b = add_nanbits(b, bufsize - (b-buf), bits, 4); } else { b = buf; if (sign) *b++ = '-'; b = strcp(b, InfName[nik%6]); } return b; } i = STRTOG_Normal; bits[3] |= 0x10000; } else if (bits[0] | bits[1] | bits[2] | bits[3]) { i = STRTOG_Denormal; ex = 1; } else { #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 112; mode = 2; if (ndig <= 0) { if (bufsize < 48) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g__fmt.c000066400000000000000000000110531416264345000202060ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifdef USE_LOCALE #include #endif #ifndef ldus_QNAN0 #define ldus_QNAN0 0x7fff #endif #ifndef ldus_QNAN1 #define ldus_QNAN1 0xc000 #endif #ifndef ldus_QNAN2 #define ldus_QNAN2 0 #endif #ifndef ldus_QNAN3 #define ldus_QNAN3 0 #endif #ifndef ldus_QNAN4 #define ldus_QNAN4 0 #endif const char *InfName[6] = { "Infinity", "infinity", "INFINITY", "Inf", "inf", "INF" }; const char *NanName[3] = { "NaN", "nan", "NAN" }; ULong NanDflt_Q_D2A[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff }; ULong NanDflt_d_D2A[2] = { d_QNAN1, d_QNAN0 }; ULong NanDflt_f_D2A[1] = { f_QNAN }; ULong NanDflt_xL_D2A[3] = { 1, 0x80000000, 0x7fff0000 }; UShort NanDflt_ldus_D2A[5] = { ldus_QNAN4, ldus_QNAN3, ldus_QNAN2, ldus_QNAN1, ldus_QNAN0 }; char * #ifdef KR_headers g__fmt(b, s, se, decpt, sign, blen) char *b; char *s; char *se; int decpt; ULong sign; size_t blen; #else g__fmt(char *b, char *s, char *se, int decpt, ULong sign, size_t blen) #endif { int i, j, k; char *be, *s0; size_t len; #ifdef USE_LOCALE #ifdef NO_LOCALE_CACHE char *decimalpoint = localeconv()->decimal_point; size_t dlen = strlen(decimalpoint); #else char *decimalpoint; static char *decimalpoint_cache; static size_t dlen; if (!(s0 = decimalpoint_cache)) { s0 = localeconv()->decimal_point; dlen = strlen(s0); if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { strcpy(decimalpoint_cache, s0); s0 = decimalpoint_cache; } } decimalpoint = s0; #endif #else #define dlen 0 #endif s0 = s; len = (se-s) + dlen + 6; /* 6 = sign + e+dd + trailing null */ if (blen < len) goto ret0; be = b + blen - 1; if (sign) *b++ = '-'; if (decpt <= -4 || decpt > se - s + 5) { *b++ = *s++; if (*s) { #ifdef USE_LOCALE while((*b = *decimalpoint++)) ++b; #else *b++ = '.'; #endif while((*b = *s++) !=0) b++; } *b++ = 'e'; /* sprintf(b, "%+.2d", decpt - 1); */ if (--decpt < 0) { *b++ = '-'; decpt = -decpt; } else *b++ = '+'; for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){} for(;;) { i = decpt / k; if (b >= be) goto ret0; *b++ = i + '0'; if (--j <= 0) break; decpt -= i*k; decpt *= 10; } *b = 0; } else if (decpt <= 0) { #ifdef USE_LOCALE while((*b = *decimalpoint++)) ++b; #else *b++ = '.'; #endif if (be < b - decpt + (se - s)) goto ret0; for(; decpt < 0; decpt++) *b++ = '0'; while((*b = *s++) != 0) b++; } else { while((*b = *s++) != 0) { b++; if (--decpt == 0 && *s) { #ifdef USE_LOCALE while(*b = *decimalpoint++) ++b; #else *b++ = '.'; #endif } } if (b + decpt > be) { ret0: b = 0; goto ret; } for(; decpt > 0; decpt--) *b++ = '0'; *b = 0; } ret: gdtoa__freedtoa(s0); return b; } char * add_nanbits_D2A(char *b, size_t blen, ULong *bits, int nb) { ULong t; char *rv; int i, j; size_t L; static char Hexdig[16] = "0123456789abcdef"; while(!bits[--nb]) if (!nb) return b; L = 8*nb + 3; t = bits[nb]; do ++L; while((t >>= 4)); if (L > blen) return b; b += L; *--b = 0; rv = b; *--b = /*(*/ ')'; for(i = 0; i < nb; ++i) { t = bits[i]; for(j = 0; j < 8; ++j, t >>= 4) *--b = Hexdig[t & 0xf]; } t = bits[nb]; do *--b = Hexdig[t & 0xf]; while(t >>= 4); *--b = '('; /*)*/ return rv; } mlton-20210117+dfsg/runtime/gdtoa/g_ddfmt.c000066400000000000000000000103311416264345000203550ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg@acm.org). */ #include "gdtoa/gdtoaimp.h" #include char * #ifdef KR_headers gdtoa__g_ddfmt(buf, dd0, ndig, bufsize) char *buf; double *dd0; int ndig; size_t bufsize; #else gdtoa__g_ddfmt(char *buf, double *dd0, int ndig, size_t bufsize) #endif { FPI fpi; char *b, *s, *se; ULong *L, bits0[4], *bits, *zx; int bx, by, decpt, ex, ey, i, j, mode; Bigint *x, *y, *z; U *dd, ddx[2]; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif #ifdef Honor_FLT_ROUNDS /*{{*/ int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ #else /*}{*/ #define Rounding FPI_Round_near #endif /*}}*/ if (bufsize < 10 || bufsize < (size_t)(ndig + 8)) return 0; dd = (U*)dd0; L = dd->L; if ((L[_0] & 0x7ff00000L) == 0x7ff00000L) { /* Infinity or NaN */ if (L[_0] & 0xfffff || L[_1]) { nanret: return strcp(buf, "NaN"); } if ((L[2+_0] & 0x7ff00000) == 0x7ff00000) { if (L[2+_0] & 0xfffff || L[2+_1]) goto nanret; if ((L[_0] ^ L[2+_0]) & 0x80000000L) goto nanret; /* Infinity - Infinity */ } infret: b = buf; if (L[_0] & 0x80000000L) *b++ = '-'; return strcp(b, "Infinity"); } if ((L[2+_0] & 0x7ff00000) == 0x7ff00000) { L += 2; if (L[_0] & 0xfffff || L[_1]) goto nanret; goto infret; } if (dval(&dd[0]) + dval(&dd[1]) == 0.) { b = buf; #ifndef IGNORE_ZERO_SIGN if (L[_0] & L[2+_0] & 0x80000000L) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } if ((L[_0] & 0x7ff00000L) < (L[2+_0] & 0x7ff00000L)) { dval(&ddx[1]) = dval(&dd[0]); dval(&ddx[0]) = dval(&dd[1]); dd = ddx; L = dd->L; } z = d2b(dval(&dd[0]), &ex, &bx MTb); if (dval(&dd[1]) == 0.) goto no_y; x = z; y = d2b(dval(&dd[1]), &ey, &by MTb); if ( (i = ex - ey) !=0) { if (i > 0) { x = lshift(x, i MTb); ex = ey; } else y = lshift(y, -i MTb); } if ((L[_0] ^ L[2+_0]) & 0x80000000L) { z = diff(x, y MTb); if (L[_0] & 0x80000000L) z->sign = 1 - z->sign; } else { z = sum(x, y MTb); if (L[_0] & 0x80000000L) z->sign = 1; } Bfree(x MTb); Bfree(y MTb); no_y: bits = zx = z->x; for(i = 0; !*zx; zx++) i += 32; i += lo0bits(zx); if (i) { rshift(z, i); ex += i; } fpi.nbits = z->wds * 32 - hi0bits(z->x[j = z->wds-1]); if (fpi.nbits < 106) { fpi.nbits = 106; if (j < 3) { for(i = 0; i <= j; i++) bits0[i] = bits[i]; while(i < 4) bits0[i++] = 0; bits = bits0; } } mode = 2; if (ndig <= 0) { if (bufsize < (size_t)(fpi.nbits * .301029995664) + 10) { Bfree(z MTb); return 0; } mode = 0; } fpi.emin = 1-1023-53+1; fpi.emax = 2046-1023-106+1; fpi.rounding = Rounding; fpi.sudden_underflow = 0; fpi.int_max = Int_max; i = STRTOG_Normal; s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); b = g__fmt(buf, s, se, decpt, z->sign, bufsize); Bfree(z MTb); return b; } mlton-20210117+dfsg/runtime/gdtoa/g_ddfmt_p.c000066400000000000000000000114651416264345000207050ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg@acm.org). */ #include "gdtoa/gdtoaimp.h" #include extern ULong NanDflt_d_D2A[2]; char * #ifdef KR_headers gdtoa__g_ddfmt_p(buf, dd0, ndig, bufsize, nik) char *buf; double *dd0; int ndig; size_t bufsize; int nik; #else gdtoa__g_ddfmt_p(char *buf, double *dd0, int ndig, size_t bufsize, int nik) #endif { FPI fpi; char *b, *s, *se; ULong *L, bits0[4], *bits, sign, *zx; int bx, by, decpt, ex, ey, i, j, mode; Bigint *x, *y, *z; U *dd, ddx[2]; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif #ifdef Honor_FLT_ROUNDS /*{{*/ int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ #else /*}{*/ #define Rounding FPI_Round_near #endif /*}}*/ if (bufsize < 10 || bufsize < (size_t)(ndig + 8)) return 0; dd = (U*)dd0; L = dd->L; sign = L[_0] & L[2+_0] & 0x80000000L; if (nik < 0 || nik > 35) nik = 0; if ((L[_0] & 0x7ff00000L) == 0x7ff00000L) { /* Infinity or NaN */ if (L[_0] & 0xfffff || L[_1]) { nanret: b = buf; if (sign && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || L[_1] != NanDflt_d_D2A[0] || (L[_0] ^ NanDflt_d_D2A[1]) & 0xfffff || L[2+_1] != NanDflt_d_D2A[0] || (L[2+_0] ^ NanDflt_d_D2A[1]) & 0xfffff)) { bits0[0] = L[2+_1]; bits0[1] = (L[2+_0] & 0xfffff) | (L[_1] << 20); bits0[2] = (L[_1] >> 12) | (L[_0] << 20); bits0[3] = (L[_0] >> 12) & 0xff; b = add_nanbits(b, bufsize - (b-buf), bits0, 4); } return b; } if ((L[2+_0] & 0x7ff00000) == 0x7ff00000) { if (L[2+_0] & 0xfffff || L[2+_1]) goto nanret; if ((L[_0] ^ L[2+_0]) & 0x80000000L) goto nanret; /* Infinity - Infinity */ } infret: b = buf; if (L[_0] & 0x80000000L) *b++ = '-'; return strcp(b, InfName[nik%6]); } if ((L[2+_0] & 0x7ff00000) == 0x7ff00000) { L += 2; if (L[_0] & 0xfffff || L[_1]) goto nanret; goto infret; } if (dval(&dd[0]) + dval(&dd[1]) == 0.) { b = buf; #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } if ((L[_0] & 0x7ff00000L) < (L[2+_0] & 0x7ff00000L)) { dval(&ddx[1]) = dval(&dd[0]); dval(&ddx[0]) = dval(&dd[1]); dd = ddx; L = dd->L; } z = d2b(dval(&dd[0]), &ex, &bx MTb); if (dval(&dd[1]) == 0.) goto no_y; x = z; y = d2b(dval(&dd[1]), &ey, &by MTb); if ( (i = ex - ey) !=0) { if (i > 0) { x = lshift(x, i MTb); ex = ey; } else y = lshift(y, -i MTb); } if ((L[_0] ^ L[2+_0]) & 0x80000000L) { z = diff(x, y MTb); if (L[_0] & 0x80000000L) z->sign = 1 - z->sign; } else { z = sum(x, y MTb); if (L[_0] & 0x80000000L) z->sign = 1; } Bfree(x MTb); Bfree(y MTb); no_y: bits = zx = z->x; for(i = 0; !*zx; zx++) i += 32; i += lo0bits(zx); if (i) { rshift(z, i); ex += i; } fpi.nbits = z->wds * 32 - hi0bits(z->x[j = z->wds-1]); if (fpi.nbits < 106) { fpi.nbits = 106; if (j < 3) { for(i = 0; i <= j; i++) bits0[i] = bits[i]; while(i < 4) bits0[i++] = 0; bits = bits0; } } mode = 2; if (ndig <= 0) { if (bufsize < (size_t)(fpi.nbits * .301029995664) + 10) { Bfree(z MTb); return 0; } mode = 0; } fpi.emin = 1-1023-53+1; fpi.emax = 2046-1023-106+1; fpi.rounding = Rounding; fpi.sudden_underflow = 0; fpi.int_max = Int_max; i = STRTOG_Normal; s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); b = g__fmt(buf, s, se, decpt, z->sign, bufsize); Bfree(z MTb); return b; } mlton-20210117+dfsg/runtime/gdtoa/g_dfmt.c000066400000000000000000000051711416264345000202170ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" char* #ifdef KR_headers gdtoa__g_dfmt(buf, d, ndig, bufsize) char *buf; double *d; int ndig; size_t bufsize; #else gdtoa__g_dfmt(char *buf, double *d, int ndig, size_t bufsize) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)d; sign = L[_0] & 0x80000000L; if ((L[_0] & 0x7ff00000) == 0x7ff00000) { /* Infinity or NaN */ if (bufsize < 10) return 0; if (L[_0] & 0xfffff || L[_1]) { return strcp(buf, "NaN"); } b = buf; if (sign) *b++ = '-'; return strcp(b, "Infinity"); } if (L[_1] == 0 && (L[_0] ^ sign) == 0 /*d == 0.*/) { b = buf; #ifndef IGNORE_ZERO_SIGN if (L[_0] & 0x80000000L) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } bits[0] = L[_1]; bits[1] = L[_0] & 0xfffff; if ( (ex = (L[_0] >> 20) & 0x7ff) !=0) bits[1] |= 0x100000; else ex = 1; ex -= 0x3ff + 52; mode = 2; if (ndig <= 0) mode = 0; i = STRTOG_Normal; if (sign) i = STRTOG_Normal | STRTOG_Neg; s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_dfmt_p.c000066400000000000000000000060261416264345000205360ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_d_D2A[2]; char* #ifdef KR_headers gdtoa__g_dfmt_p(buf, d, ndig, bufsize, nik) char *buf; double *d; int ndig; size_t bufsize; int nik; #else gdtoa__g_dfmt_p(char *buf, double *d, int ndig, size_t bufsize, int nik) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)d; sign = L[_0] & 0x80000000L; if ((L[_0] & 0x7ff00000) == 0x7ff00000) { /* Infinity or NaN */ if (nik < 0 || nik > 35) nik = 0; if (bufsize < 10) return 0; if (L[_0] & 0xfffff || L[_1]) { b = buf; if (L[_0] & 0x80000000L && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || bits[0] != NanDflt_d_D2A[0] || (bits[1] ^ NanDflt_d_D2A[1]) & 0xfffff)) { bits[0] = L[_1]; bits[1] = L[_0] & 0xfffff; b = add_nanbits(b, bufsize - (b-buf), bits, 2); } return b; } b = buf; if (sign) *b++ = '-'; return strcp(b, InfName[nik%6]); } if (L[_1] == 0 && (L[_0] ^ sign) == 0 /*d == 0.*/) { b = buf; #ifndef IGNORE_ZERO_SIGN if (L[_0] & 0x80000000L) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } bits[0] = L[_1]; bits[1] = L[_0] & 0xfffff; if ( (ex = (L[_0] >> 20) & 0x7ff) !=0) bits[1] |= 0x100000; else ex = 1; ex -= 0x3ff + 52; mode = 2; if (ndig <= 0) mode = 0; i = STRTOG_Normal; if (sign) i = STRTOG_Normal | STRTOG_Neg; s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_ffmt.c000066400000000000000000000050021416264345000202120ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" char* #ifdef KR_headers gdtoa__g_ffmt(buf, f, ndig, bufsize) char *buf; float *f; int ndig; size_t bufsize; #else gdtoa__g_ffmt(char *buf, float *f, int ndig, size_t bufsize) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, 0, 6 }; char *b, *s, *se; ULong bits[1], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)f; sign = L[0] & 0x80000000L; if ((L[0] & 0x7f800000) == 0x7f800000) { /* Infinity or NaN */ if (L[0] & 0x7fffff) { return strcp(buf, "NaN"); } b = buf; if (sign) *b++ = '-'; return strcp(b, "Infinity"); } if (*f == 0.) { b = buf; #ifndef IGNORE_ZERO_SIGN if (L[0] & 0x80000000L) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } bits[0] = L[0] & 0x7fffff; if ( (ex = (L[0] >> 23) & 0xff) !=0) bits[0] |= 0x800000; else ex = 1; ex -= 0x7f + 23; mode = 2; if (ndig <= 0) { if (bufsize < 16) return 0; mode = 0; } i = STRTOG_Normal; s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_ffmt_p.c000066400000000000000000000054751416264345000205470ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_f_D2A[1]; char* #ifdef KR_headers gdtoa__g_ffmt_p(buf, f, ndig, bufsize, nik) char *buf; float *f; int ndig; size_t bufsize; int nik; #else gdtoa__g_ffmt_p(char *buf, float *f, int ndig, size_t bufsize, int nik) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, 0, 6 }; char *b, *s, *se; ULong bits[1], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)f; sign = L[0] & 0x80000000L; if ((L[0] & 0x7f800000) == 0x7f800000) { /* Infinity or NaN */ if (nik < 0 || nik > 35) nik = 0; if ((bits[0] = L[0] & 0x7fffff)) { b = buf; if (sign && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || (bits[0] ^ NanDflt_f_D2A[0]) & 0x7fffff)) b = add_nanbits(b, bufsize - (b-buf), bits, 1); return b; } b = buf; if (sign) *b++ = '-'; return strcp(b, InfName[nik%6]); } if (*f == 0.) { b = buf; #ifndef IGNORE_ZERO_SIGN if (L[0] & 0x80000000L) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } bits[0] = L[0] & 0x7fffff; if ( (ex = (L[0] >> 23) & 0xff) !=0) bits[0] |= 0x800000; else ex = 1; ex -= 0x7f + 23; mode = 2; if (ndig <= 0) { if (bufsize < 16) return 0; mode = 0; } i = STRTOG_Normal; s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_xLfmt.c000066400000000000000000000054111416264345000203540ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #endif #ifdef IEEE_8087 #define _0 2 #define _1 1 #define _2 0 #endif char* #ifdef KR_headers gdtoa__g_xLfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; size_t bufsize; #else gdtoa__g_xLfmt(char *buf, void *V, int ndig, size_t bufsize) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)V; sign = L[_0] & 0x80000000L; bits[1] = L[_1]; bits[0] = L[_2]; if ( (ex = (L[_0] >> 16) & 0x7fff) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (bits[0] | bits[1]) b = strcp(buf, "NaN"); else { b = buf; if (sign) *b++ = '-'; b = strcp(b, "Infinity"); } return b; } i = STRTOG_Normal; } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; } else { b = buf; #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 63; mode = 2; if (ndig <= 0) { if (bufsize < 32) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_xLfmt_p.c000066400000000000000000000061521416264345000206760ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_xL_D2A[3]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #endif #ifdef IEEE_8087 #define _0 2 #define _1 1 #define _2 0 #endif char* #ifdef KR_headers gdtoa__g_xLfmt_p(buf, V, ndig, bufsize, nik) char *buf; char *V; int ndig; size_t bufsize; int nik; #else gdtoa__g_xLfmt_p(char *buf, void *V, int ndig, size_t bufsize, int nik) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], *L, sign; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (ULong*)V; sign = L[_0] & 0x80000000L; bits[1] = L[_1]; bits[0] = L[_2]; if ( (ex = (L[_0] >> 16) & 0x7fff) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (nik < 0 || nik > 35) nik = 0; if (!bits[0] && bits[1] == 0x80000000) { b = buf; if (sign) *b++ = '-'; b = strcp(b, InfName[nik%6]); } else { b = buf; if (sign && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || bits[0] != NanDflt_xL_D2A[0] || bits[1] != NanDflt_xL_D2A[1])) b = add_nanbits(b, bufsize - (b-buf), bits, 2); } return b; } i = STRTOG_Normal; } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; } else { b = buf; #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 63; mode = 2; if (ndig <= 0) { if (bufsize < 32) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_xfmt.c000066400000000000000000000055611416264345000202460ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif char* #ifdef KR_headers gdtoa__g_xfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; size_t bufsize; #else gdtoa__g_xfmt(char *buf, void *V, int ndig, size_t bufsize) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], sign; UShort *L; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (UShort *)V; sign = L[_0] & 0x8000; bits[1] = (L[_1] << 16) | L[_2]; bits[0] = (L[_3] << 16) | L[_4]; if ( (ex = L[_0] & 0x7fff) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (!bits[0] && bits[1]== 0x80000000) { b = buf; if (sign) *b++ = '-'; b = strcp(b, "Infinity"); } else b = strcp(buf, "NaN"); return b; } i = STRTOG_Normal; } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; ex = 1; } else { b = buf; #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 63; mode = 2; if (ndig <= 0) { if (bufsize < 32) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/g_xfmt_p.c000066400000000000000000000064661416264345000205720ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern UShort NanDflt_ldus_D2A[5]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif char* #ifdef KR_headers gdtoa__g_xfmt_p(buf, V, ndig, bufsize, nik) char *buf; char *V; int ndig; size_t bufsize; int nik; #else gdtoa__g_xfmt_p(char *buf, void *V, int ndig, size_t bufsize, int nik) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max }; char *b, *s, *se; ULong bits[2], sign; UShort *L; int decpt, ex, i, mode; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif if (ndig < 0) ndig = 0; if (bufsize < (size_t)(ndig + 10)) return 0; L = (UShort *)V; sign = L[_0] & 0x8000; bits[1] = (L[_1] << 16) | L[_2]; bits[0] = (L[_3] << 16) | L[_4]; if ( (ex = L[_0] & 0x7fff) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ if (nik < 0 || nik > 35) nik = 0; if (!bits[0] && bits[1]== 0x80000000) { b = buf; if (sign) *b++ = '-'; b = strcp(b, InfName[nik%6]); } else { b = buf; if (sign && nik < 18) *b++ = '-'; b = strcp(b, NanName[nik%3]); if (nik > 5 && (nik < 12 || L[_1] != NanDflt_ldus_D2A[3] || L[_2] != NanDflt_ldus_D2A[2] || L[_3] != NanDflt_ldus_D2A[1] || L[_4] != NanDflt_ldus_D2A[0])) { bits[1] &= 0x7fffffff; b = add_nanbits(b, bufsize - (b-buf), bits, 2); } } return b; } i = STRTOG_Normal; } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; ex = 1; } else { b = buf; #ifndef IGNORE_ZERO_SIGN if (sign) *b++ = '-'; #endif *b++ = '0'; *b = 0; return b; } ex -= 0x3fff + 63; mode = 2; if (ndig <= 0) { if (bufsize < 32) return 0; mode = 0; } s = gdtoa__gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign, bufsize); } mlton-20210117+dfsg/runtime/gdtoa/gdtoa.c000066400000000000000000000420401416264345000200510ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 1999 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" static Bigint * #ifdef KR_headers bitstob(bits, nbits, bbits MTa) ULong *bits; int nbits; int *bbits; MTk #else bitstob(ULong *bits, int nbits, int *bbits MTd) #endif { int i, k; Bigint *b; ULong *be, *x, *x0; i = ULbits; k = 0; while(i < nbits) { i <<= 1; k++; } #ifndef Pack_32 if (!k) k = 1; #endif b = Balloc(k MTa); be = bits + ((nbits - 1) >> kshift); x = x0 = b->x; do { *x++ = *bits & ALL_ON; #ifdef Pack_16 *x++ = (*bits >> 16) & ALL_ON; #endif } while(++bits <= be); i = x - x0; while(!x0[--i]) if (!i) { b->wds = 0; *bbits = 0; goto ret; } b->wds = i + 1; *bbits = i*ULbits + 32 - hi0bits(b->x[i]); ret: return b; } /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. * * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. * * Modifications: * 1. Rather than iterating, we use a simple numeric overestimate * to determine k = floor(log10(d)). We scale relevant * quantities using O(log2(k)) rather than O(k) multiplications. * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't * try to generate digits strictly left to right. Instead, we * compute with fewer bits and propagate the carry if necessary * when rounding the final digit up. This is often faster. * 3. Under the assumption that input will be rounded nearest, * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. * That is, we allow equality in stopping tests when the * round-nearest rule will give the same floating-point value * as would satisfaction of the stopping test with strict * inequality. * 4. We remove common factors of powers of 2 from relevant * quantities. * 5. When converting floating-point integers less than 1e16, * we use floating-point arithmetic rather than resorting * to multiple-precision integers. * 6. When asked to produce fewer than 15 digits, we first try * to get by with floating-point arithmetic; we resort to * multiple-precision integer arithmetic only if we cannot * guarantee that the floating-point calculation has given * the correctly rounded result. For k requested digits and * "uniformly" distributed input, the probability is * something like 10^(k-15) that we must resort to the Long * calculation. */ char * gdtoa__gdtoa #ifdef KR_headers (fpi, be, bits, kindp, mode, ndigits, decpt, rve) CONST FPI *fpi; int be; ULong *bits; int *kindp, mode, ndigits, *decpt; char **rve; #else (CONST FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve) #endif { /* Arguments ndigits and decpt are similar to the second and third arguments of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. be = exponent: value = (integer represented by bits) * (2 to the power of be). mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives 1e23 whereas mode 1 gives 9.999999999999999e22. 2 ==> max(1,ndigits) significant digits. This gives a return value similar to that of ecvt, except that trailing zeros are suppressed. 3 ==> through ndigits past the decimal point. This gives a return value similar to that from fcvt, except that trailing zeros are suppressed, and ndigits can be negative. 4-9 should give the same return values as 2-3, i.e., 4 <= mode <= 9 ==> same return as mode 2 + (mode & 1). These modes are mainly for debugging; often they run slower but sometimes faster than modes 2-3. 4,5,8,9 ==> left-to-right digit generation. 6-9 ==> don't try fast floating-point estimate (if applicable). Values of mode other than 0-9 are treated as mode 0. Sufficient space is allocated to the return value to hold the suppressed trailing zeros. */ #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex; int j, j1, k, k0, k_check, kind, leftright, m2, m5, nbits; int rdir, s2, s5, spec_case, try_quick; Long L; Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S; double d2, ds; char *s, *s0; U d, eps; #ifndef MULTIPLE_THREADS if (dtoa_result) { gdtoa__freedtoa(dtoa_result); dtoa_result = 0; } #endif inex = 0; kind = *kindp &= ~STRTOG_Inexact; switch(kind & STRTOG_Retmask) { case STRTOG_Zero: goto ret_zero; case STRTOG_Normal: case STRTOG_Denormal: break; case STRTOG_Infinite: *decpt = -32768; return nrv_alloc("Infinity", rve, 8 MTb); case STRTOG_NaN: *decpt = -32768; return nrv_alloc("NaN", rve, 3 MTb); default: return 0; } b = bitstob(bits, nbits = fpi->nbits, &bbits MTb); be0 = be; if ( (i = trailz(b)) !=0) { rshift(b, i); be += i; bbits -= i; } if (!b->wds) { Bfree(b MTb); ret_zero: *decpt = 1; return nrv_alloc("0", rve, 1 MTb); } dval(&d) = b2d(b, &i); i = be + bbits - 1; word0(&d) &= Frac_mask1; word0(&d) |= Exp_11; #ifdef IBM if ( (j = 11 - hi0bits(word0(&d) & Frac_mask)) !=0) dval(&d) /= 1 << j; #endif /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) * log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2) * * This suggests computing an approximation k to log10(&d) by * * k = (i - Bias)*0.301029995663981 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); * * We want k to be too large rather than too small. * The error in the first-order Taylor series approximation * is in our favor, so we just round up the constant enough * to compensate for any error in the multiplication of * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, * adding 1e-13 to the constant term more than suffices. * Hence we adjust the constant term to 0.1760912590558. * (We could get a more accurate k by invoking log10, * but this is probably not worthwhile.) */ ds = (dval(&d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; /* correct assumption about exponent range */ if ((j = i) < 0) j = -j; if ((j -= 1077) > 0) ds += j * 7e-17; k = (int)ds; if (ds < 0. && ds != k) k--; /* want k = floor(ds) */ k_check = 1; #ifdef IBM j = be + bbits - 1; if ( (j1 = j & 3) !=0) dval(&d) *= 1 << j1; word0(&d) += j << Exp_shift - 2 & Exp_mask; #else word0(&d) += (be + bbits - 1) << Exp_shift; #endif if (k >= 0 && k <= Ten_pmax) { if (dval(&d) < tens[k]) k--; k_check = 0; } j = bbits - i - 1; if (j >= 0) { b2 = 0; s2 = j; } else { b2 = -j; s2 = 0; } if (k >= 0) { b5 = 0; s5 = k; s2 += k; } else { b2 -= k; b5 = -k; s5 = 0; } if (mode < 0 || mode > 9) mode = 0; try_quick = 1; if (mode > 5) { mode -= 4; try_quick = 0; } else if (i >= -4 - Emin || i < Emin) try_quick = 0; leftright = 1; ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ /* silence erroneous "gcc -Wall" warning. */ switch(mode) { case 0: case 1: i = (int)(nbits * .30103) + 3; ndigits = 0; break; case 2: leftright = 0; /* no break */ case 4: if (ndigits <= 0) ndigits = 1; ilim = ilim1 = i = ndigits; break; case 3: leftright = 0; /* no break */ case 5: i = ndigits + k + 1; ilim = i; ilim1 = i - 1; if (i <= 0) i = 1; } s = s0 = rv_alloc(i MTb); if (mode <= 1) rdir = 0; else if ( (rdir = fpi->rounding - 1) !=0) { if (rdir < 0) rdir = 2; if (kind & STRTOG_Neg) rdir = 3 - rdir; } /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */ if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir #ifndef IMPRECISE_INEXACT && k == 0 #endif ) { /* Try to get by with floating-point arithmetic. */ i = 0; d2 = dval(&d); k0 = k; ilim0 = ilim; ieps = 2; /* conservative */ if (k > 0) { ds = tens[k&0xf]; j = k >> 4; if (j & Bletch) { /* prevent overflows */ j &= Bletch - 1; dval(&d) /= bigtens[n_bigtens-1]; ieps++; } for(; j; j >>= 1, i++) if (j & 1) { ieps++; ds *= bigtens[i]; } } else { ds = 1.; if ( (j1 = -k) !=0) { dval(&d) *= tens[j1 & 0xf]; for(j = j1 >> 4; j; j >>= 1, i++) if (j & 1) { ieps++; dval(&d) *= bigtens[i]; } } } if (k_check && dval(&d) < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; dval(&d) *= 10.; ieps++; } dval(&eps) = ieps*dval(&d) + 7.; word0(&eps) -= (P-1)*Exp_msk1; if (ilim == 0) { S = mhi = 0; dval(&d) -= 5.; if (dval(&d) > dval(&eps)) goto one_digit; if (dval(&d) < -dval(&eps)) goto no_digits; goto fast_failed; } #ifndef No_leftright if (leftright) { /* Use Steele & White method of only * generating digits needed. */ dval(&eps) = ds*0.5/tens[ilim-1] - dval(&eps); for(i = 0;;) { L = (Long)(dval(&d)/ds); dval(&d) -= L*ds; *s++ = '0' + (int)L; if (dval(&d) < dval(&eps)) { if (dval(&d)) inex = STRTOG_Inexlo; goto ret1; } if (ds - dval(&d) < dval(&eps)) goto bump_up; if (++i >= ilim) break; dval(&eps) *= 10.; dval(&d) *= 10.; } } else { #endif /* Generate ilim digits, then fix them up. */ dval(&eps) *= tens[ilim-1]; for(i = 1;; i++, dval(&d) *= 10.) { if ( (L = (Long)(dval(&d)/ds)) !=0) dval(&d) -= L*ds; *s++ = '0' + (int)L; if (i == ilim) { ds *= 0.5; if (dval(&d) > ds + dval(&eps)) goto bump_up; else if (dval(&d) < ds - dval(&eps)) { if (dval(&d)) inex = STRTOG_Inexlo; goto ret1; } break; } } #ifndef No_leftright } #endif fast_failed: s = s0; dval(&d) = d2; k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= fpi->int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || dval(&d) <= 5*ds) goto no_digits; goto one_digit; } for(i = 1;; i++, dval(&d) *= 10.) { L = dval(&d) / ds; dval(&d) -= L*ds; #ifdef Check_FLT_ROUNDS /* If FLT_ROUNDS == 2, L will usually be high by 1 */ if (dval(&d) < 0) { L--; dval(&d) += ds; } #endif *s++ = '0' + (int)L; if (dval(&d) == 0.) break; if (i == ilim) { if (rdir) { if (rdir == 1) goto bump_up; inex = STRTOG_Inexlo; goto ret1; } dval(&d) += dval(&d); #ifdef ROUND_BIASED if (dval(&d) >= ds) #else if (dval(&d) > ds || (dval(&d) == ds && L & 1)) #endif { bump_up: inex = STRTOG_Inexhi; while(*--s == '9') if (s == s0) { k++; *s = '0'; break; } ++*s++; } else inex = STRTOG_Inexlo; break; } } goto ret1; } m2 = b2; m5 = b5; mhi = mlo = 0; if (leftright) { i = nbits - bbits; if (be - i++ < fpi->emin && mode != 3 && mode != 5) { /* denormal */ i = be - fpi->emin + 1; if (mode >= 2 && ilim > 0 && ilim < i) goto small_ilim; } else if (mode >= 2) { small_ilim: j = ilim - 1; if (m5 >= j) m5 -= j; else { s5 += j -= m5; b5 += j; m5 = 0; } if ((i = ilim) < 0) { m2 -= i; i = 0; } } b2 += i; s2 += i; mhi = i2b(1 MTb); } if (m2 > 0 && s2 > 0) { i = m2 < s2 ? m2 : s2; b2 -= i; m2 -= i; s2 -= i; } if (b5 > 0) { if (leftright) { if (m5 > 0) { mhi = pow5mult(mhi, m5 MTb); b1 = mult(mhi, b MTb); Bfree(b MTb); b = b1; } if ( (j = b5 - m5) !=0) b = pow5mult(b, j MTb); } else b = pow5mult(b, b5 MTb); } S = i2b(1 MTb); if (s5 > 0) S = pow5mult(S, s5 MTb); /* Check for special case that d is a normalized power of 2. */ spec_case = 0; if (mode < 2) { if (bbits == 1 && be0 > fpi->emin + 1) { /* The special case */ b2++; s2++; spec_case = 1; } } /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. * * Perhaps we should just compute leading 28 bits of S once * and for all and pass them and a shift to quorem, so it * can do shifts and ors to compute the numerator for q. */ i = ((s5 ? hi0bits(S->x[S->wds-1]) : ULbits - 1) - s2 - 4) & kmask; m2 += i; if ((b2 += i) > 0) b = lshift(b, b2 MTb); if ((s2 += i) > 0) S = lshift(S, s2 MTb); if (k_check) { if (cmp(b,S) < 0) { k--; b = multadd(b, 10, 0 MTb); /* we botched the k estimate */ if (leftright) mhi = multadd(mhi, 10, 0 MTb); ilim = ilim1; } } if (ilim <= 0 && mode > 2) { if (ilim < 0 || cmp(b,S = multadd(S,5,0 MTb)) <= 0) { /* no digits, fcvt style */ no_digits: k = -1 - ndigits; inex = STRTOG_Inexlo; goto ret; } one_digit: inex = STRTOG_Inexhi; *s++ = '1'; k++; goto ret; } if (leftright) { if (m2 > 0) mhi = lshift(mhi, m2 MTb); /* Compute mlo -- check for special case * that d is a normalized power of 2. */ mlo = mhi; if (spec_case) { mhi = Balloc(mhi->k MTb); Bcopy(mhi, mlo); mhi = lshift(mhi, 1 MTb); } for(i = 1;;i++) { dig = quorem(b,S) + '0'; /* Do we yet have the shortest decimal string * that will round to d? */ j = cmp(b, mlo); delta = diff(S, mhi MTb); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta MTb); #ifndef ROUND_BIASED if (j1 == 0 && !mode && !(bits[0] & 1) && !rdir) { if (dig == '9') goto round_9_up; if (j <= 0) { if (b->wds > 1 || b->x[0]) inex = STRTOG_Inexlo; } else { dig++; inex = STRTOG_Inexhi; } *s++ = dig; goto ret; } #endif if (j < 0 || (j == 0 && !mode #ifndef ROUND_BIASED && !(bits[0] & 1) #endif )) { if (rdir && (b->wds > 1 || b->x[0])) { if (rdir == 2) { inex = STRTOG_Inexlo; goto accept; } while (cmp(S,mhi) > 0) { *s++ = dig; mhi1 = multadd(mhi, 10, 0 MTb); if (mlo == mhi) mlo = mhi1; mhi = mhi1; b = multadd(b, 10, 0 MTb); dig = quorem(b,S) + '0'; } if (dig++ == '9') goto round_9_up; inex = STRTOG_Inexhi; goto accept; } if (j1 > 0) { b = lshift(b, 1 MTb); j1 = cmp(b, S); #ifdef ROUND_BIASED if (j1 >= 0 /*)*/ #else if ((j1 > 0 || (j1 == 0 && dig & 1)) #endif && dig++ == '9') goto round_9_up; inex = STRTOG_Inexhi; } if (b->wds > 1 || b->x[0]) inex = STRTOG_Inexlo; accept: *s++ = dig; goto ret; } if (j1 > 0 && rdir != 2) { if (dig == '9') { /* possible if i == 1 */ round_9_up: *s++ = '9'; inex = STRTOG_Inexhi; goto roundoff; } inex = STRTOG_Inexhi; *s++ = dig + 1; goto ret; } *s++ = dig; if (i == ilim) break; b = multadd(b, 10, 0 MTb); if (mlo == mhi) mlo = mhi = multadd(mhi, 10, 0 MTb); else { mlo = multadd(mlo, 10, 0 MTb); mhi = multadd(mhi, 10, 0 MTb); } } } else for(i = 1;; i++) { *s++ = dig = quorem(b,S) + '0'; if (i >= ilim) break; b = multadd(b, 10, 0 MTb); } /* Round off last digit */ if (rdir) { if (rdir == 2 || (b->wds <= 1 && !b->x[0])) goto chopzeros; goto roundoff; } b = lshift(b, 1 MTb); j = cmp(b, S); #ifdef ROUND_BIASED if (j >= 0) #else if (j > 0 || (j == 0 && dig & 1)) #endif { roundoff: inex = STRTOG_Inexhi; while(*--s == '9') if (s == s0) { k++; *s++ = '1'; goto ret; } ++*s++; } else { chopzeros: if (b->wds > 1 || b->x[0]) inex = STRTOG_Inexlo; } ret: Bfree(S MTb); if (mhi) { if (mlo && mlo != mhi) Bfree(mlo MTb); Bfree(mhi MTb); } ret1: while(s > s0 && s[-1] == '0') --s; Bfree(b MTb); *s = 0; *decpt = k + 1; if (rve) *rve = s; *kindp |= inex; return s0; } mlton-20210117+dfsg/runtime/gdtoa/gdtoa.h000066400000000000000000000136101416264345000200570ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #ifndef GDTOA_H_INCLUDED #define GDTOA_H_INCLUDED #include "gdtoa/arith.h" #include /* for size_t */ #include "export.h" #ifndef Long #define Long int #endif #ifndef ULong typedef unsigned Long ULong; #endif #ifndef UShort typedef unsigned short UShort; #endif #ifndef ANSI #ifdef KR_headers #define ANSI(x) () #define Void /*nothing*/ #else #define ANSI(x) x #define Void void #endif #endif /* ANSI */ #ifndef CONST #ifdef KR_headers #define CONST /* blank */ #else #define CONST const #endif #endif /* CONST */ enum { /* return values from strtodg */ STRTOG_Zero = 0, STRTOG_Normal = 1, STRTOG_Denormal = 2, STRTOG_Infinite = 3, STRTOG_NaN = 4, STRTOG_NaNbits = 5, STRTOG_NoNumber = 6, STRTOG_Retmask = 7, /* The following may be or-ed into one of the above values. */ STRTOG_Neg = 0x08, /* does not affect STRTOG_Inexlo or STRTOG_Inexhi */ STRTOG_Inexlo = 0x10, /* returned result rounded toward zero */ STRTOG_Inexhi = 0x20, /* returned result rounded away from zero */ STRTOG_Inexact = 0x30, STRTOG_Underflow= 0x40, STRTOG_Overflow = 0x80 }; typedef struct FPI { int nbits; int emin; int emax; int rounding; int sudden_underflow; int int_max; } FPI; enum { /* FPI.rounding values: same as FLT_ROUNDS */ FPI_Round_zero = 0, FPI_Round_near = 1, FPI_Round_up = 2, FPI_Round_down = 3 }; #ifdef __cplusplus extern "C" { #endif PRIVATE extern char* gdtoa__dtoa ANSI((double d, int mode, int ndigits, int *decpt, int *sign, char **rve)); PRIVATE extern char* gdtoa__gdtoa ANSI((CONST FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve)); PRIVATE extern void gdtoa__freedtoa ANSI((char*)); PRIVATE extern float gdtoa__strtof ANSI((CONST char *, char **)); PRIVATE extern double gdtoa__strtod ANSI((CONST char *, char **)); PRIVATE extern int gdtoa__strtodg ANSI((CONST char*, char**, CONST FPI*, Long*, ULong*)); PRIVATE extern char* gdtoa__g_ddfmt ANSI((char*, double*, int, size_t)); PRIVATE extern char* gdtoa__g_ddfmt_p ANSI((char*, double*, int, size_t, int)); PRIVATE extern char* gdtoa__g_dfmt ANSI((char*, double*, int, size_t)); PRIVATE extern char* gdtoa__g_dfmt_p ANSI((char*, double*, int, size_t, int)); PRIVATE extern char* gdtoa__g_ffmt ANSI((char*, float*, int, size_t)); PRIVATE extern char* gdtoa__g_ffmt_p ANSI((char*, float*, int, size_t, int)); PRIVATE extern char* gdtoa__g_Qfmt ANSI((char*, void*, int, size_t)); PRIVATE extern char* gdtoa__g_Qfmt_p ANSI((char*, void*, int, size_t, int)); PRIVATE extern char* gdtoa__g_xfmt ANSI((char*, void*, int, size_t)); PRIVATE extern char* gdtoa__g_xfmt_p ANSI((char*, void*, int, size_t, int)); PRIVATE extern char* gdtoa__g_xLfmt ANSI((char*, void*, int, size_t)); PRIVATE extern char* gdtoa__g_xLfmt_p ANSI((char*, void*, int, size_t, int)); PRIVATE extern int gdtoa__strtoId ANSI((CONST char*, char**, double*, double*)); PRIVATE extern int gdtoa__strtoIdd ANSI((CONST char*, char**, double*, double*)); PRIVATE extern int gdtoa__strtoIf ANSI((CONST char*, char**, float*, float*)); PRIVATE extern int gdtoa__strtoIQ ANSI((CONST char*, char**, void*, void*)); PRIVATE extern int gdtoa__strtoIx ANSI((CONST char*, char**, void*, void*)); PRIVATE extern int gdtoa__strtoIxL ANSI((CONST char*, char**, void*, void*)); PRIVATE extern int gdtoa__strtord ANSI((CONST char*, char**, int, double*)); PRIVATE extern int gdtoa__strtordd ANSI((CONST char*, char**, int, double*)); PRIVATE extern int gdtoa__strtorf ANSI((CONST char*, char**, int, float*)); PRIVATE extern int gdtoa__strtorQ ANSI((CONST char*, char**, int, void*)); PRIVATE extern int gdtoa__strtorx ANSI((CONST char*, char**, int, void*)); PRIVATE extern int gdtoa__strtorxL ANSI((CONST char*, char**, int, void*)); #if 1 PRIVATE extern int gdtoa__strtodI ANSI((CONST char*, char**, double*)); PRIVATE extern int gdtoa__strtopd ANSI((CONST char*, char**, double*)); PRIVATE extern int gdtoa__strtopdd ANSI((CONST char*, char**, double*)); PRIVATE extern int gdtoa__strtopf ANSI((CONST char*, char**, float*)); PRIVATE extern int gdtoa__strtopQ ANSI((CONST char*, char**, void*)); PRIVATE extern int gdtoa__strtopx ANSI((CONST char*, char**, void*)); PRIVATE extern int gdtoa__strtopxL ANSI((CONST char*, char**, void*)); #else #define gdtoa__strtopd(s,se,x) gdtoa__strtord(s,se,1,x) #define gdtoa__strtopdd(s,se,x) gdtoa__strtordd(s,se,1,x) #define gdtoa__strtopf(s,se,x) gdtoa__strtorf(s,se,1,x) #define gdtoa__strtopQ(s,se,x) gdtoa__strtorQ(s,se,1,x) #define gdtoa__strtopx(s,se,x) gdtoa__strtorx(s,se,1,x) #define gdtoa__strtopxL(s,se,x) gdtoa__strtorxL(s,se,1,x) #endif #ifdef __cplusplus } #endif #endif /* GDTOA_H_INCLUDED */ mlton-20210117+dfsg/runtime/gdtoa/gdtoa_fltrnds.h000066400000000000000000000006451416264345000216170ustar00rootroot00000000000000 FPI *fpi, fpi1; int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ fpi = &fpi0; if (Rounding != 1) { fpi1 = fpi0; fpi = &fpi1; fpi1.rounding = Rounding; } mlton-20210117+dfsg/runtime/gdtoa/gdtoaimp.h000066400000000000000000000535531416264345000205770ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* This is a variation on dtoa.c that converts arbitary binary floating-point formats to and from decimal notation. It uses double-precision arithmetic internally, so there are still various #ifdefs that adapt the calculations to the native double-precision arithmetic (any of IEEE, VAX D_floating, or IBM mainframe arithmetic). Please send bug reports to David M. Gay (dmg at acm dot org, with " at " changed at "@" and " dot " changed to "."). */ /* On a machine with IEEE extended-precision registers, it is * necessary to specify double-precision (53-bit) rounding precision * before invoking strtod or dtoa. If the machine uses (the equivalent * of) Intel 80x87 arithmetic, the call * _control87(PC_53, MCW_PC); * does this with many compilers. Whether this or another call is * appropriate depends on the compiler; for this to work, it may be * necessary to #include "float.h" or another system-dependent header * file. */ /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. * * This strtod returns a nearest machine number to the input decimal * string (or sets errno to ERANGE). With IEEE arithmetic, ties are * broken by the IEEE round-even rule. Otherwise ties are broken by * biased rounding (add half and chop). * * Inspired loosely by William D. Clinger's paper "How to Read Floating * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. * * Modifications: * * 1. We only require IEEE, IBM, or VAX double-precision * arithmetic (not IEEE double-extended). * 2. We get by with floating-point arithmetic in a case that * Clinger missed -- when we're computing d * 10^n * for a small integer d and the integer n is not too * much larger than 22 (the maximum integer k for which * we can represent 10^k exactly), we may be able to * compute (d*10^k) * 10^(e-k) with just one roundoff. * 3. Rather than a bit-at-a-time adjustment of the binary * result in the hard case, we use floating-point * arithmetic to determine the adjustment to within * one bit; only in really hard cases do we need to * compute a second residual. * 4. Because of 3., we don't need a large table of powers of 10 * for ten-to-e (just some small tables, e.g. of 10^k * for 0 <= k <= 22). */ /* * #define IEEE_8087 for IEEE-arithmetic machines where the least * significant byte has the lowest address. * #define IEEE_MC68k for IEEE-arithmetic machines where the most * significant byte has the lowest address. * #define Long int on machines with 32-bit ints and 64-bit longs. * #define Sudden_Underflow for IEEE-format machines without gradual * underflow (i.e., that flush to zero on underflow). * #define IBM for IBM mainframe-style floating-point arithmetic. * #define VAX for VAX-style floating-point arithmetic (D_floating). * #define No_leftright to omit left-right logic in fast floating-point * computation of dtoa and gdtoa. This will cause modes 4 and 5 to be * treated the same as modes 2 and 3 for some inputs. * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines * that use extended-precision instructions to compute rounded * products and quotients) with IBM. * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic * that rounds toward +Infinity. * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased * rounding when the underlying floating-point arithmetic uses * unbiased rounding. This prevent using ordinary floating-point * arithmetic when the result could be computed with one rounding error. * #define Inaccurate_Divide for IEEE-format with correctly rounded * products but inaccurate quotients, e.g., for Intel i860. * #define NO_LONG_LONG on machines that do not have a "long long" * integer type (of >= 64 bits). On such machines, you can * #define Just_16 to store 16 bits per 32-bit Long when doing * high-precision integer arithmetic. Whether this speeds things * up or slows things down depends on the machine and the number * being converted. If long long is available and the name is * something other than "long long", #define Llong to be the name, * and if "unsigned Llong" does not work as an unsigned version of * Llong, #define #ULLong to be the corresponding unsigned type. * #define KR_headers for old-style C function headers. * #define Bad_float_h if your system lacks a float.h or if it does not * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) * if memory is available and otherwise does something you deem * appropriate. If MALLOC is undefined, malloc will be invoked * directly -- and assumed always to succeed. Similarly, if you * want something other than the system's free() to be called to * recycle memory acquired from MALLOC, #define FREE to be the * name of the alternate routine. (FREE or free is only called in * pathological cases, e.g., in a gdtoa call after a gdtoa return in * mode 3 with thousands of digits requested.) * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making * memory allocations from a private pool of memory when possible. * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, * unless #defined to be a different length. This default length * suffices to get rid of MALLOC calls except for unusual cases, * such as decimal-to-binary conversion of a very long string of * digits. When converting IEEE double precision values, the * longest string gdtoa can return is about 751 bytes long. For * conversions by strtod of strings of 800 digits and all gdtoa * conversions of IEEE doubles in single-threaded executions with * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK * #defined automatically on IEEE systems. On such systems, * when INFNAN_CHECK is #defined, strtod checks * for Infinity and NaN (case insensitively). * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, * strtodg also accepts (case insensitively) strings of the form * NaN(x), where x is a string of hexadecimal digits (optionally * preceded by 0x or 0X) and spaces; if there is only one string * of hexadecimal digits, it is taken for the fraction bits of the * resulting NaN; if there are two or more strings of hexadecimal * digits, each string is assigned to the next available sequence * of 32-bit words of fractions bits (starting with the most * significant), right-aligned in each sequence. * Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)" * is consumed even when ... has the wrong form (in which case the * "(...)" is consumed but ignored). * #define MULTIPLE_THREADS if the system offers preemptively scheduled * multiple threads. In this case, you must provide (or suitably * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed * in pow5mult, ensures lazy evaluation of only one copy of high * powers of 5; omitting this lock would introduce a small * probability of wasting memory, but would otherwise be harmless.) * You must also invoke freedtoa(s) to free the value s returned by * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. * When MULTIPLE_THREADS is #defined, source file misc.c provides * void set_max_gdtoa_threads(unsigned int n); * and expects * unsigned int dtoa_get_threadno(void); * to be available (possibly provided by * #define dtoa_get_threadno omp_get_thread_num * if OpenMP is in use or by * #define dtoa_get_threadno pthread_self * if Pthreads is in use), to return the current thread number. * If set_max_dtoa_threads(n) was called and the current thread * number is k with k < n, then calls on ACQUIRE_DTOA_LOCK(...) and * FREE_DTOA_LOCK(...) are avoided; instead each thread with thread * number < n has a separate copy of relevant data structures. * After set_max_dtoa_threads(n), a call set_max_dtoa_threads(m) * with m <= n has has no effect, but a call with m > n is honored. * Such a call invokes REALLOC (assumed to be "realloc" if REALLOC * is not #defined) to extend the size of the relevant array. * #define IMPRECISE_INEXACT if you do not care about the setting of * the STRTOG_Inexact bits in the special case of doing IEEE double * precision conversions (which could also be done by the strtod in * dtoa.c). * #define NO_HEX_FP to disable recognition of C9x's hexadecimal * floating-point constants. * #define -DNO_ERRNO to suppress setting errno (in strtod.c and * strtodg.c). * #define NO_STRING_H to use private versions of memcpy. * On some K&R systems, it may also be necessary to * #define DECLARE_SIZE_T in this case. * #define USE_LOCALE to use the current locale's decimal_point value. */ #ifndef GDTOAIMP_H_INCLUDED #define GDTOAIMP_H_INCLUDED #include "gdtoa/gdtoa.h" #include "gdtoa/gd_qnan.h" #ifdef Honor_FLT_ROUNDS #include #endif #ifdef DEBUG #include #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} #endif #include #include #ifdef KR_headers #define Char char #else #define Char void #endif #ifdef MALLOC extern Char *MALLOC ANSI((size_t)); #else #define MALLOC malloc #endif #ifdef REALLOC extern Char *REALLOC ANSI((Char*, size_t)); #else #define REALLOC realloc #endif #undef IEEE_Arith #undef Avoid_Underflow #ifdef IEEE_MC68k #define IEEE_Arith #endif #ifdef IEEE_8087 #define IEEE_Arith #endif #include #ifdef Bad_float_h #ifdef IEEE_Arith #define DBL_DIG 15 #define DBL_MAX_10_EXP 308 #define DBL_MAX_EXP 1024 #define FLT_RADIX 2 #define DBL_MAX 1.7976931348623157e+308 #endif #ifdef IBM #define DBL_DIG 16 #define DBL_MAX_10_EXP 75 #define DBL_MAX_EXP 63 #define FLT_RADIX 16 #define DBL_MAX 7.2370055773322621e+75 #endif #ifdef VAX #define DBL_DIG 16 #define DBL_MAX_10_EXP 38 #define DBL_MAX_EXP 127 #define FLT_RADIX 2 #define DBL_MAX 1.7014118346046923e+38 #define n_bigtens 2 #endif #ifndef LONG_MAX #define LONG_MAX 2147483647 #endif #else /* ifndef Bad_float_h */ #include #endif /* Bad_float_h */ #ifdef IEEE_Arith #define Scale_Bit 0x10 #define n_bigtens 5 #endif #ifdef IBM #define n_bigtens 3 #endif #ifdef VAX #define n_bigtens 2 #endif #ifndef __MATH_H__ #include #endif #ifdef __cplusplus extern "C" { #endif #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. #endif typedef union { double d; ULong L[2]; } __attribute__((__may_alias__)) U; #ifdef IEEE_8087 #define word0(x) (x)->L[1] #define word1(x) (x)->L[0] #else #define word0(x) (x)->L[0] #define word1(x) (x)->L[1] #endif #define dval(x) (x)->d /* The following definition of Storeinc is appropriate for MIPS processors. * An alternative that might be better on some machines is * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) */ #if defined(IEEE_8087) + defined(VAX) #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ ((unsigned short *)a)[0] = (unsigned short)c, a++) #else #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ ((unsigned short *)a)[1] = (unsigned short)c, a++) #endif /* #define P DBL_MANT_DIG */ /* Ten_pmax = floor(P*log(2)/log(5)) */ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ #ifdef IEEE_Arith #define Exp_shift 20 #define Exp_shift1 20 #define Exp_msk1 0x100000 #define Exp_msk11 0x100000 #define Exp_mask 0x7ff00000 #define P 53 #define Bias 1023 #define Emin (-1022) #define Exp_1 0x3ff00000 #define Exp_11 0x3ff00000 #define Ebits 11 #define Frac_mask 0xfffff #define Frac_mask1 0xfffff #define Ten_pmax 22 #define Bletch 0x10 #define Bndry_mask 0xfffff #define Bndry_mask1 0xfffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 1 #define Tiny0 0 #define Tiny1 1 #define Quick_max 14 #define Int_max 14 #ifndef Flt_Rounds #ifdef FLT_ROUNDS #define Flt_Rounds FLT_ROUNDS #else #define Flt_Rounds 1 #endif #endif /*Flt_Rounds*/ #else /* ifndef IEEE_Arith */ #undef Sudden_Underflow #define Sudden_Underflow #ifdef IBM #undef Flt_Rounds #define Flt_Rounds 0 #define Exp_shift 24 #define Exp_shift1 24 #define Exp_msk1 0x1000000 #define Exp_msk11 0x1000000 #define Exp_mask 0x7f000000 #define P 14 #define Bias 65 #define Exp_1 0x41000000 #define Exp_11 0x41000000 #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ #define Frac_mask 0xffffff #define Frac_mask1 0xffffff #define Bletch 4 #define Ten_pmax 22 #define Bndry_mask 0xefffff #define Bndry_mask1 0xffffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 4 #define Tiny0 0x100000 #define Tiny1 0 #define Quick_max 14 #define Int_max 15 #else /* VAX */ #undef Flt_Rounds #define Flt_Rounds 1 #define Exp_shift 23 #define Exp_shift1 7 #define Exp_msk1 0x80 #define Exp_msk11 0x800000 #define Exp_mask 0x7f80 #define P 56 #define Bias 129 #define Exp_1 0x40800000 #define Exp_11 0x4080 #define Ebits 8 #define Frac_mask 0x7fffff #define Frac_mask1 0xffff007f #define Ten_pmax 24 #define Bletch 2 #define Bndry_mask 0xffff007f #define Bndry_mask1 0xffff007f #define LSB 0x10000 #define Sign_bit 0x8000 #define Log2P 1 #define Tiny0 0x80 #define Tiny1 0 #define Quick_max 15 #define Int_max 15 #endif /* IBM, VAX */ #endif /* IEEE_Arith */ #ifndef IEEE_Arith #define ROUND_BIASED #else #ifdef ROUND_BIASED_without_Round_Up #undef ROUND_BIASED #define ROUND_BIASED #endif #endif #ifdef RND_PRODQUOT #define rounded_product(a,b) a = rnd_prod(a, b) #define rounded_quotient(a,b) a = rnd_quot(a, b) #ifdef KR_headers extern double rnd_prod(), rnd_quot(); #else extern double rnd_prod(double, double), rnd_quot(double, double); #endif #else #define rounded_product(a,b) a *= b #define rounded_quotient(a,b) a /= b #endif #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) #define Big1 0xffffffff #undef Pack_16 #ifndef Pack_32 #define Pack_32 #endif #ifdef NO_LONG_LONG #undef ULLong #ifdef Just_16 #undef Pack_32 #define Pack_16 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. * This makes some inner loops simpler and sometimes saves work * during multiplications, but it often seems to make things slightly * slower. Hence the default is now to store 32 bits per Long. */ #endif #else /* long long available */ #ifndef Llong #define Llong long long #endif #ifndef ULLong #define ULLong unsigned Llong #endif #endif /* NO_LONG_LONG */ #ifdef Pack_32 #define ULbits 32 #define kshift 5 #define kmask 31 #define ALL_ON 0xffffffff #else #define ULbits 16 #define kshift 4 #define kmask 15 #define ALL_ON 0xffff #endif #ifdef MULTIPLE_THREADS /*{{*/ #define MTa , PTI #define MTb , &TI #define MTd , ThInfo **PTI #define MTk ThInfo **PTI; extern void ACQUIRE_DTOA_LOCK ANSI((unsigned int)); extern void FREE_DTOA_LOCK ANSI((unsigned int)); extern unsigned int dtoa_get_threadno ANSI((void)); #else /*}{*/ #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ #define FREE_DTOA_LOCK(n) /*nothing*/ #define MTa /*nothing*/ #define MTb /*nothing*/ #define MTd /*nothing*/ #define MTk /*nothing*/ #endif /*}}*/ #define Kmax 9 struct Bigint { struct Bigint *next; int k, maxwds, sign, wds; ULong x[1]; }; typedef struct Bigint Bigint; typedef struct ThInfo { Bigint *Freelist[Kmax+1]; Bigint *P5s; } ThInfo; #ifdef NO_STRING_H #ifdef DECLARE_SIZE_T typedef unsigned int size_t; #endif extern void memcpy_D2A ANSI((void*, const void*, size_t)); #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) #else /* !NO_STRING_H */ #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) #endif /* NO_STRING_H */ #define Balloc Balloc_D2A #define Bfree Bfree_D2A #define InfName InfName_D2A #define NanName NanName_D2A #define ULtoQ ULtoQ_D2A #define ULtof ULtof_D2A #define ULtod ULtod_D2A #define ULtodd ULtodd_D2A #define ULtox ULtox_D2A #define ULtoxL ULtoxL_D2A #define add_nanbits add_nanbits_D2A #define any_on any_on_D2A #define b2d b2d_D2A #define bigtens bigtens_D2A #define cmp cmp_D2A #define copybits copybits_D2A #define d2b d2b_D2A #define decrement decrement_D2A #define diff diff_D2A #define dtoa_result dtoa_result_D2A #define g__fmt g__fmt_D2A #define gethex gethex_D2A #define hexdig hexdig_D2A #define hexdig_init hexdig_init_D2A #define hexnan hexnan_D2A #define hi0bits(x) hi0bits_D2A((ULong)(x)) #define i2b i2b_D2A #define increment increment_D2A #define lo0bits lo0bits_D2A #define lshift lshift_D2A #define match match_D2A #define mult mult_D2A #define multadd multadd_D2A #define nrv_alloc nrv_alloc_D2A #define pow5mult pow5mult_D2A #define quorem quorem_D2A #define ratio ratio_D2A #define rshift rshift_D2A #define rv_alloc rv_alloc_D2A #define s2b s2b_D2A #define set_ones set_ones_D2A #define strcp strcp_D2A #define strtoIg strtoIg_D2A #define strtod strtod_D2A #define sum sum_D2A #define tens tens_D2A #define tinytens tinytens_D2A #define tinytens tinytens_D2A #define trailz trailz_D2A #define ulp ulp_D2A PRIVATE extern char *add_nanbits ANSI((char*, size_t, ULong*, int)); PRIVATE extern char *dtoa_result; PRIVATE extern CONST double bigtens[], tens[], tinytens[]; PRIVATE extern unsigned char hexdig[]; PRIVATE extern const char *InfName[6], *NanName[3]; PRIVATE extern Bigint *Balloc ANSI((int MTd)); PRIVATE extern void Bfree ANSI((Bigint* MTd)); PRIVATE extern void ULtof ANSI((ULong*, ULong*, Long, int)); PRIVATE extern void ULtod ANSI((ULong*, ULong*, Long, int)); PRIVATE extern void ULtodd ANSI((ULong*, ULong*, Long, int)); PRIVATE extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); PRIVATE extern void ULtox ANSI((UShort*, ULong*, Long, int)); PRIVATE extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); PRIVATE extern ULong any_on ANSI((Bigint*, int)); PRIVATE extern double b2d ANSI((Bigint*, int*)); PRIVATE extern int cmp ANSI((Bigint*, Bigint*)); PRIVATE extern void copybits ANSI((ULong*, int, Bigint*)); PRIVATE extern Bigint *d2b ANSI((double, int*, int* MTd)); PRIVATE extern void decrement ANSI((Bigint*)); PRIVATE extern Bigint *diff ANSI((Bigint*, Bigint* MTd)); PRIVATE extern char *dtoa ANSI((double d, int mode, int ndigits, int *decpt, int *sign, char **rve)); PRIVATE extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t)); PRIVATE extern int gethex ANSI((CONST char**, CONST FPI*, Long*, Bigint**, int MTd)); /* PRIVATE extern void hexdig_init ANSI((Void)); */ PRIVATE extern int hexnan ANSI((CONST char**, CONST FPI*, ULong*)); PRIVATE extern int hi0bits_D2A ANSI((ULong)); PRIVATE extern Bigint *i2b ANSI((int MTd)); PRIVATE extern Bigint *increment ANSI((Bigint* MTd)); PRIVATE extern int lo0bits ANSI((ULong*)); PRIVATE extern Bigint *lshift ANSI((Bigint*, int MTd)); PRIVATE extern int match ANSI((CONST char**, char*)); PRIVATE extern Bigint *mult ANSI((Bigint*, Bigint* MTd)); PRIVATE extern Bigint *multadd ANSI((Bigint*, int, int MTd)); PRIVATE extern char *nrv_alloc ANSI((char*, char **, int MTd)); PRIVATE extern Bigint *pow5mult ANSI((Bigint*, int MTd)); PRIVATE extern int quorem ANSI((Bigint*, Bigint*)); PRIVATE extern double ratio ANSI((Bigint*, Bigint*)); PRIVATE extern void rshift ANSI((Bigint*, int)); PRIVATE extern char *rv_alloc ANSI((int MTd)); PRIVATE extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int MTd)); PRIVATE extern Bigint *set_ones ANSI((Bigint*, int MTd)); PRIVATE extern char *strcp ANSI((char*, const char*)); PRIVATE extern int strtoIg ANSI((CONST char*, char**, CONST FPI*, Long*, Bigint**, int*)); PRIVATE extern double strtod ANSI((const char *s00, char **se)); PRIVATE extern Bigint *sum ANSI((Bigint*, Bigint* MTd)); PRIVATE extern int trailz ANSI((Bigint*)); PRIVATE extern double ulp ANSI((U*)); #ifdef __cplusplus } #endif /* * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, * respectively), but now are determined by compiling and running * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... * and -DNAN_WORD1=... values if necessary. This should still work. * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) */ #ifdef IEEE_Arith #ifndef NO_INFNAN_CHECK #undef INFNAN_CHECK #define INFNAN_CHECK #endif #ifdef IEEE_MC68k #define _0 0 #define _1 1 #ifndef NAN_WORD0 #define NAN_WORD0 d_QNAN0 #endif #ifndef NAN_WORD1 #define NAN_WORD1 d_QNAN1 #endif #else #define _0 1 #define _1 0 #ifndef NAN_WORD0 #define NAN_WORD0 d_QNAN1 #endif #ifndef NAN_WORD1 #define NAN_WORD1 d_QNAN0 #endif #endif #else #undef INFNAN_CHECK #endif #undef SI #ifdef Sudden_Underflow #define SI 1 #else #define SI 0 #endif #endif /* GDTOAIMP_H_INCLUDED */ mlton-20210117+dfsg/runtime/gdtoa/gethex.c000066400000000000000000000163021416264345000202410ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifdef USE_LOCALE #include #endif int #ifdef KR_headers gethex(sp, fpi, exp, bp, sign MTa) CONST char **sp; CONST FPI *fpi; Long *exp; Bigint **bp; int sign; MTk #else gethex( CONST char **sp, CONST FPI *fpi, Long *exp, Bigint **bp, int sign MTd) #endif { Bigint *b; CONST unsigned char *decpt, *s0, *s, *s1; int big, esign, havedig, irv, j, k, n, n0, nbits, up, zret; ULong L, lostbits, *x; Long e, e1; #ifdef USE_LOCALE int i; #ifdef NO_LOCALE_CACHE const unsigned char *decimalpoint = (unsigned char*)localeconv()->decimal_point; #else const unsigned char *decimalpoint; static unsigned char *decimalpoint_cache; if (!(s0 = decimalpoint_cache)) { s0 = (unsigned char*)localeconv()->decimal_point; if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { strcpy(decimalpoint_cache, s0); s0 = decimalpoint_cache; } } decimalpoint = s0; #endif #endif /**** if (!hexdig['0']) hexdig_init(); ****/ *bp = 0; havedig = 0; s0 = *(CONST unsigned char **)sp + 2; while(s0[havedig] == '0') havedig++; s0 += havedig; s = s0; decpt = 0; zret = 0; e = 0; if (hexdig[*s]) havedig++; else { zret = 1; #ifdef USE_LOCALE for(i = 0; decimalpoint[i]; ++i) { if (s[i] != decimalpoint[i]) goto pcheck; } decpt = s += i; #else if (*s != '.') goto pcheck; decpt = ++s; #endif if (!hexdig[*s]) goto pcheck; while(*s == '0') s++; if (hexdig[*s]) zret = 0; havedig = 1; s0 = s; } while(hexdig[*s]) s++; #ifdef USE_LOCALE if (*s == *decimalpoint && !decpt) { for(i = 1; decimalpoint[i]; ++i) { if (s[i] != decimalpoint[i]) goto pcheck; } decpt = s += i; #else if (*s == '.' && !decpt) { decpt = ++s; #endif while(hexdig[*s]) s++; }/*}*/ if (decpt) e = -(((Long)(s-decpt)) << 2); pcheck: s1 = s; big = esign = 0; switch(*s) { case 'p': case 'P': switch(*++s) { case '-': esign = 1; /* no break */ case '+': s++; } if ((n = hexdig[*s]) == 0 || n > 0x19) { s = s1; break; } e1 = n - 0x10; while((n = hexdig[*++s]) !=0 && n <= 0x19) { if (e1 & 0xf8000000) big = 1; e1 = 10*e1 + n - 0x10; } if (esign) e1 = -e1; e += e1; } *sp = (char*)s; if (!havedig) *sp = (char*)s0 - 1; if (zret) return STRTOG_Zero; if (big) { if (esign) { switch(fpi->rounding) { case FPI_Round_up: if (sign) break; goto ret_tiny; case FPI_Round_down: if (!sign) break; goto ret_tiny; } goto retz; ret_tiny: b = Balloc(0 MTa); b->wds = 1; b->x[0] = 1; goto dret; } switch(fpi->rounding) { case FPI_Round_near: goto ovfl1; case FPI_Round_up: if (!sign) goto ovfl1; goto ret_big; case FPI_Round_down: if (sign) goto ovfl1; } ret_big: nbits = fpi->nbits; n0 = n = nbits >> kshift; if (nbits & kmask) ++n; for(j = n, k = 0; j >>= 1; ++k); *bp = b = Balloc(k MTa); b->wds = n; for(j = 0; j < n0; ++j) b->x[j] = ALL_ON; if (n > n0) b->x[j] = ALL_ON >> (ULbits - (nbits & kmask)); *exp = fpi->emax; return STRTOG_Normal | STRTOG_Inexlo; } n = s1 - s0 - 1; for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1) k++; b = Balloc(k MTa); x = b->x; n = 0; L = 0; #ifdef USE_LOCALE for(i = 0; decimalpoint[i+1]; ++i); #endif while(s1 > s0) { #ifdef USE_LOCALE if (*--s1 == decimalpoint[i]) { s1 -= i; continue; } #else if (*--s1 == '.') continue; #endif if (n == ULbits) { *x++ = L; L = 0; n = 0; } L |= (hexdig[*s1] & 0x0f) << n; n += 4; } *x++ = L; b->wds = n = x - b->x; n = ULbits*n - hi0bits(L); nbits = fpi->nbits; lostbits = 0; x = b->x; if (n > nbits) { n -= nbits; if (any_on(b,n)) { lostbits = 1; k = n - 1; if (x[k>>kshift] & 1 << (k & kmask)) { lostbits = 2; if (k > 0 && any_on(b,k)) lostbits = 3; } } rshift(b, n); e += n; } else if (n < nbits) { n = nbits - n; b = lshift(b, n MTa); e -= n; x = b->x; } if (e > fpi->emax) { ovfl: Bfree(b MTa); ovfl1: #ifndef NO_ERRNO errno = ERANGE; #endif switch (fpi->rounding) { case FPI_Round_zero: goto ret_big; case FPI_Round_down: if (!sign) goto ret_big; break; case FPI_Round_up: if (sign) goto ret_big; } return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; } irv = STRTOG_Normal; if (e < fpi->emin) { irv = STRTOG_Denormal; n = fpi->emin - e; if (n >= nbits) { switch (fpi->rounding) { case FPI_Round_near: if (n == nbits && (n < 2 || lostbits || any_on(b,n-1))) goto one_bit; break; case FPI_Round_up: if (!sign) goto one_bit; break; case FPI_Round_down: if (sign) { one_bit: x[0] = b->wds = 1; dret: *bp = b; *exp = fpi->emin; #ifndef NO_ERRNO errno = ERANGE; #endif return STRTOG_Denormal | STRTOG_Inexhi | STRTOG_Underflow; } } Bfree(b MTa); retz: #ifndef NO_ERRNO errno = ERANGE; #endif return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow; } k = n - 1; if (lostbits) lostbits = 1; else if (k > 0) lostbits = any_on(b,k); if (x[k>>kshift] & 1 << (k & kmask)) lostbits |= 2; nbits -= n; rshift(b,n); e = fpi->emin; } if (lostbits) { up = 0; switch(fpi->rounding) { case FPI_Round_zero: break; case FPI_Round_near: if (lostbits & 2 && (lostbits | x[0]) & 1) up = 1; break; case FPI_Round_up: up = 1 - sign; break; case FPI_Round_down: up = sign; } if (up) { k = b->wds; b = increment(b MTa); x = b->x; if (irv == STRTOG_Denormal) { if (nbits == fpi->nbits - 1 && x[nbits >> kshift] & 1 << (nbits & kmask)) irv = STRTOG_Normal; } else if (b->wds > k || ((n = nbits & kmask) !=0 && hi0bits(x[k-1]) < 32-n)) { rshift(b,1); if (++e > fpi->emax) goto ovfl; } irv |= STRTOG_Inexhi; } else irv |= STRTOG_Inexlo; } *bp = b; *exp = e; return irv; } mlton-20210117+dfsg/runtime/gdtoa/gmisc.c000066400000000000000000000040521416264345000200560ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" void #ifdef KR_headers rshift(b, k) Bigint *b; int k; #else rshift(Bigint *b, int k) #endif { ULong *x, *x1, *xe, y; int n; x = x1 = b->x; n = k >> kshift; if (n < b->wds) { xe = x + b->wds; x += n; if (k &= kmask) { n = ULbits - k; y = *x++ >> k; while(x < xe) { *x1++ = (y | (*x << n)) & ALL_ON; y = *x++ >> k; } if ((*x1 = y) !=0) x1++; } else while(x < xe) *x1++ = *x++; } if ((b->wds = x1 - b->x) == 0) b->x[0] = 0; } int #ifdef KR_headers trailz(b) Bigint *b; #else trailz(Bigint *b) #endif { ULong L, *x, *xe; int n = 0; x = b->x; xe = x + b->wds; for(n = 0; x < xe && !*x; x++) n += ULbits; if (x < xe) { L = *x; n += lo0bits(&L); } return n; } mlton-20210117+dfsg/runtime/gdtoa/hd_init.c000066400000000000000000000047371416264345000204040ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #if 0 unsigned char hexdig[256]; static void #ifdef KR_headers htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc; #else htinit(unsigned char *h, unsigned char *s, int inc) #endif { int i, j; for(i = 0; (j = s[i]) !=0; i++) h[j] = i + inc; } void hexdig_init(Void) /* Use of hexdig_init omitted 20121220 to avoid a */ /* race condition when multiple threads are used. */ { #define USC (unsigned char *) htinit(hexdig, USC "0123456789", 0x10); htinit(hexdig, USC "abcdef", 0x10 + 10); htinit(hexdig, USC "ABCDEF", 0x10 + 10); } #else unsigned char hexdig[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0, 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; #endif mlton-20210117+dfsg/runtime/gdtoa/hexnan.c000066400000000000000000000070661416264345000202450ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" static void #ifdef KR_headers L_shift(x, x1, i) ULong *x; ULong *x1; int i; #else L_shift(ULong *x, ULong *x1, int i) #endif { int j; i = 8 - i; i <<= 2; j = ULbits - i; do { *x |= x[1] << j; x[1] >>= i; } while(++x < x1); } int #ifdef KR_headers hexnan(sp, fpi, x0) CONST char **sp; CONST FPI *fpi; ULong *x0; #else hexnan( CONST char **sp, CONST FPI *fpi, ULong *x0) #endif { ULong c, h, *x, *x1, *xe; CONST char *s; int havedig, hd0, i, nbits; /**** if (!hexdig['0']) hexdig_init(); ****/ nbits = fpi->nbits; x = x0 + (nbits >> kshift); if (nbits & kmask) x++; *--x = 0; x1 = xe = x; havedig = hd0 = i = 0; s = *sp; /* allow optional initial 0x or 0X */ while((c = *(CONST unsigned char*)(s+1)) && c <= ' ') { if (!c) goto retnan; ++s; } if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X') && *(CONST unsigned char*)(s+3) > ' ') s += 2; while((c = *(CONST unsigned char*)++s)) { if (!(h = hexdig[c])) { if (c <= ' ') { if (hd0 < havedig) { if (x < x1 && i < 8) L_shift(x, x1, i); if (x <= x0) { i = 8; continue; } hd0 = havedig; *--x = 0; x1 = x; i = 0; } while((c = *(CONST unsigned char*)(s+1)) <= ' ') { if (!c) goto retnan; ++s; } if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X') && *(CONST unsigned char*)(s+3) > ' ') s += 2; continue; } if (/*(*/ c == ')' && havedig) { *sp = s + 1; break; } #ifndef GDTOA_NON_PEDANTIC_NANCHECK do { if (/*(*/ c == ')') { *sp = s + 1; goto break2; } } while((c = *++s)); #endif retnan: return STRTOG_NaN; } havedig++; if (++i > 8) { if (x <= x0) continue; i = 1; *--x = 0; } *x = (*x << 4) | (h & 0xf); } #ifndef GDTOA_NON_PEDANTIC_NANCHECK break2: #endif if (!havedig) return STRTOG_NaN; if (x < x1 && i < 8) L_shift(x, x1, i); if (x > x0) { x1 = x0; do *x1++ = *x++; while(x <= xe); do *x1++ = 0; while(x1 <= xe); } else { /* truncate high-order word if necessary */ if ( (i = nbits & (ULbits-1)) !=0) *xe &= ((ULong)0xffffffff) >> (ULbits - i); } for(x1 = xe;; --x1) { if (*x1 != 0) break; if (x1 == x0) { *x1 = 1; break; } } return STRTOG_NaNbits; } mlton-20210117+dfsg/runtime/gdtoa/makefile000066400000000000000000000067371416264345000203240ustar00rootroot00000000000000# /**************************************************************** # Copyright (C) 1998 by Lucent Technologies # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby # granted, provided that the above copyright notice appear in all # copies and that both that the copyright notice and this # permission notice and warranty disclaimer appear in supporting # documentation, and that the name of Lucent or any of its entities # not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior # permission. # # LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. # IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY # SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF # THIS SOFTWARE. # # ****************************************************************/ .SUFFIXES: .c .o CC = cc CFLAGS = -g .c.o: $(CC) -c $(CFLAGS) $*.c # invoke "make Printf" to add printf.o to gdtoa.a (if desired) all: arith.h gd_qnan.h gdtoa.a arith.h: arithchk.c $(CC) $(CFLAGS) arithchk.c || $(CC) -DNO_LONG_LONG $(CFLAGS) arithchk.c ./a.out >arith.h rm -f a.out arithchk.o gd_qnan.h: arith.h qnan.c $(CC) $(CFLAGS) qnan.c ./a.out >gd_qnan.h rm -f a.out qnan.o gdtoa.a: dmisc.c\ dtoa.c\ g_Qfmt.c\ g_Qfmt_p.c\ g__fmt.c\ g_ddfmt.c\ g_ddfmt_p.c\ g_dfmt.c\ g_dfmt_p.c\ g_ffmt.c\ g_ffmt_p.c\ g_xLfmt.c\ g_xLfmt_p.c\ g_xfmt.c\ g_xfmt_p.c\ gdtoa.c\ gethex.c\ gmisc.c\ hd_init.c\ hexnan.c\ misc.c\ smisc.c\ strtoIQ.c\ strtoId.c\ strtoIdd.c\ strtoIf.c\ strtoIg.c\ strtoIx.c\ strtoIxL.c\ strtod.c\ strtodI.c\ strtodg.c\ strtof.c\ strtopQ.c\ strtopd.c\ strtopdd.c\ strtopf.c\ strtopx.c\ strtopxL.c\ strtorQ.c\ strtord.c\ strtordd.c\ strtorf.c\ strtorx.c\ strtorxL.c\ sum.c\ ulp.c $(CC) -c $(CFLAGS) $? x=`echo $? | sed 's/\.c/.o/g'` && ar ruv gdtoa.a $$x && rm $$x ranlib gdtoa.a || true Printf: all printf.c $(CC) -c $(CFLAGS) printf.c ar ruv gdtoa.a printf.o rm printf.o touch Printf # If your system lacks ranlib, you do not need it. xs0 = README\ arithchk.c\ dmisc.c\ dtoa.c\ g_Qfmt.c\ g_Qfmt_p.c\ g__fmt.c\ g_ddfmt.c\ g_ddfmt_p.c\ g_dfmt.c\ g_dfmt_p.c\ g_ffmt.c\ g_ffmt_p.c\ g_xLfmt.c\ g_xLfmt_p.c\ g_xfmt.c\ g_xfmt_p.c\ gdtoa.c\ gdtoa.h\ gdtoa_fltrnds.h\ gdtoaimp.h\ gethex.c\ gmisc.c\ hd_init.c\ hexnan.c\ makefile\ misc.c\ printf.c\ printf.c0\ qnan.c\ smisc.c\ stdio1.h\ strtoIQ.c\ strtoId.c\ strtoIdd.c\ strtoIf.c\ strtoIg.c\ strtoIx.c\ strtoIxL.c\ strtod.c\ strtodI.c\ strtodg.c\ strtodnrp.c\ strtof.c\ strtopQ.c\ strtopd.c\ strtopdd.c\ strtopf.c\ strtopx.c\ strtopxL.c\ strtorQ.c\ strtord.c\ strtordd.c\ strtorf.c\ strtorx.c\ strtorxL.c\ sum.c\ ulp.c # "make -r xsum.out" to check for transmission errors; source for xsum is # netlib's "xsum.c from f2c", e.g., # ftp://netlib.bell-labs.com/netlib/f2c/xsum.c.gz xsum.out: xsum0.out $(xs0) xsum $(xs0) >xsum1.out cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out clean: rm -f arith.h gd_qnan.h *.[ao] Printf xsum.out xsum1.out mlton-20210117+dfsg/runtime/gdtoa/misc.c000066400000000000000000000374231416264345000177170ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 1999 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifndef Omit_Private_Memory #ifndef PRIVATE_MEM #define PRIVATE_MEM 2304 #endif #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) static double private_mem[PRIVATE_mem], *pmem_next = private_mem; #endif static ThInfo TI0; #ifdef MULTIPLE_THREADS /*{{*/ static unsigned int maxthreads = 0; static ThInfo *TI1; static int TI0_used; void set_max_gdtoa_threads(unsigned int n) { size_t L; if (n > maxthreads) { L = n*sizeof(ThInfo); if (TI1) { TI1 = (ThInfo*)REALLOC(TI1, L); memset(TI1 + maxthreads, 0, (n-maxthreads)*sizeof(ThInfo)); } else { TI1 = (ThInfo*)MALLOC(L); if (TI0_used) { memcpy(TI1, &TI0, sizeof(ThInfo)); if (n > 1) memset(TI1 + 1, 0, L - sizeof(ThInfo)); memset(&TI0, 0, sizeof(ThInfo)); } else memset(TI1, 0, L); } maxthreads = n; } } static ThInfo* get_TI(void) { unsigned int thno = dtoa_get_threadno(); if (thno < maxthreads) return TI1 + thno; if (thno == 0) TI0_used = 1; return &TI0; } #define freelist TI->Freelist #define p5s TI->P5s #else /*}{*/ #define freelist TI0.Freelist #define p5s TI0.P5s #endif /*}}*/ Bigint * Balloc #ifdef KR_headers (k MTa) int k; MTk #else (int k MTd) #endif { int x; Bigint *rv; #ifndef Omit_Private_Memory unsigned int len; #endif #ifdef MULTIPLE_THREADS ThInfo *TI; if (!(TI = *PTI)) *PTI = TI = get_TI(); if (TI == &TI0) ACQUIRE_DTOA_LOCK(0); #endif /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ /* but this case seems very unlikely. */ if (k <= Kmax && (rv = freelist[k]) !=0) { freelist[k] = rv->next; } else { x = 1 << k; #ifdef Omit_Private_Memory rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); #else len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) /sizeof(double); if (k <= Kmax && pmem_next - private_mem + len - PRIVATE_mem <= 0 #ifdef MULTIPLE_THREADS && TI == TI1 #endif ) { rv = (Bigint*)pmem_next; pmem_next += len; } else rv = (Bigint*)MALLOC(len*sizeof(double)); #endif rv->k = k; rv->maxwds = x; } #ifdef MULTIPLE_THREADS if (TI == &TI0) FREE_DTOA_LOCK(0); #endif rv->sign = rv->wds = 0; return rv; } void Bfree #ifdef KR_headers (v MTa) Bigint *v; MTk #else (Bigint *v MTd) #endif { #ifdef MULTIPLE_THREADS ThInfo *TI; #endif if (v) { if (v->k > Kmax) #ifdef FREE FREE((void*)v); #else free((void*)v); #endif else { #ifdef MULTIPLE_THREADS if (!(TI = *PTI)) *PTI = TI = get_TI(); if (TI == &TI0) ACQUIRE_DTOA_LOCK(0); #endif v->next = freelist[v->k]; freelist[v->k] = v; #ifdef MULTIPLE_THREADS if (TI == &TI0) FREE_DTOA_LOCK(0); #endif } } } int lo0bits #ifdef KR_headers (y) ULong *y; #else (ULong *y) #endif { int k; ULong x = *y; if (x & 7) { if (x & 1) return 0; if (x & 2) { *y = x >> 1; return 1; } *y = x >> 2; return 2; } k = 0; if (!(x & 0xffff)) { k = 16; x >>= 16; } if (!(x & 0xff)) { k += 8; x >>= 8; } if (!(x & 0xf)) { k += 4; x >>= 4; } if (!(x & 0x3)) { k += 2; x >>= 2; } if (!(x & 1)) { k++; x >>= 1; if (!x) return 32; } *y = x; return k; } Bigint * multadd #ifdef KR_headers (b, m, a MTa) Bigint *b; int m, a; MTk #else (Bigint *b, int m, int a MTd) /* multiply by m and add a */ #endif { int i, wds; #ifdef ULLong ULong *x; ULLong carry, y; #else ULong carry, *x, y; #ifdef Pack_32 ULong xi, z; #endif #endif Bigint *b1; wds = b->wds; x = b->x; i = 0; carry = a; do { #ifdef ULLong y = *x * (ULLong)m + carry; carry = y >> 32; *x++ = y & 0xffffffffUL; #else #ifdef Pack_32 xi = *x; y = (xi & 0xffff) * m + carry; z = (xi >> 16) * m + (y >> 16); carry = z >> 16; *x++ = (z << 16) + (y & 0xffff); #else y = *x * m + carry; carry = y >> 16; *x++ = y & 0xffff; #endif #endif } while(++i < wds); if (carry) { if (wds >= b->maxwds) { b1 = Balloc(b->k+1 MTa); Bcopy(b1, b); Bfree(b MTa); b = b1; } b->x[wds++] = carry; b->wds = wds; } return b; } int hi0bits_D2A #ifdef KR_headers (x) ULong x; #else (ULong x) #endif { int k = 0; if (!(x & 0xffff0000)) { k = 16; x <<= 16; } if (!(x & 0xff000000)) { k += 8; x <<= 8; } if (!(x & 0xf0000000)) { k += 4; x <<= 4; } if (!(x & 0xc0000000)) { k += 2; x <<= 2; } if (!(x & 0x80000000)) { k++; if (!(x & 0x40000000)) return 32; } return k; } Bigint * i2b #ifdef KR_headers (i MTa) int i; MTk #else (int i MTd) #endif { Bigint *b; b = Balloc(1 MTa); b->x[0] = i; b->wds = 1; return b; } Bigint * mult #ifdef KR_headers (a, b MTa) Bigint *a, *b; MTk #else (Bigint *a, Bigint *b MTd) #endif { Bigint *c; int k, wa, wb, wc; ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; ULong y; #ifdef ULLong ULLong carry, z; #else ULong carry, z; #ifdef Pack_32 ULong z2; #endif #endif if (a->wds < b->wds) { c = a; a = b; b = c; } k = a->k; wa = a->wds; wb = b->wds; wc = wa + wb; if (wc > a->maxwds) k++; c = Balloc(k MTa); for(x = c->x, xa = x + wc; x < xa; x++) *x = 0; xa = a->x; xae = xa + wa; xb = b->x; xbe = xb + wb; xc0 = c->x; #ifdef ULLong for(; xb < xbe; xc0++) { if ( (y = *xb++) !=0) { x = xa; xc = xc0; carry = 0; do { z = *x++ * (ULLong)y + *xc + carry; carry = z >> 32; *xc++ = z & 0xffffffffUL; } while(x < xae); *xc = carry; } } #else #ifdef Pack_32 for(; xb < xbe; xb++, xc0++) { if ( (y = *xb & 0xffff) !=0) { x = xa; xc = xc0; carry = 0; do { z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; carry = z >> 16; z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; carry = z2 >> 16; Storeinc(xc, z2, z); } while(x < xae); *xc = carry; } if ( (y = *xb >> 16) !=0) { x = xa; xc = xc0; carry = 0; z2 = *xc; do { z = (*x & 0xffff) * y + (*xc >> 16) + carry; carry = z >> 16; Storeinc(xc, z, z2); z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; carry = z2 >> 16; } while(x < xae); *xc = z2; } } #else for(; xb < xbe; xc0++) { if ( (y = *xb++) !=0) { x = xa; xc = xc0; carry = 0; do { z = *x++ * y + *xc + carry; carry = z >> 16; *xc++ = z & 0xffff; } while(x < xae); *xc = carry; } } #endif #endif for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; c->wds = wc; return c; } Bigint * pow5mult #ifdef KR_headers (b, k MTa) Bigint *b; int k; MTk #else (Bigint *b, int k MTd) #endif { Bigint *b1, *p5, *p51; #ifdef MULTIPLE_THREADS ThInfo *TI; #endif int i; static int p05[3] = { 5, 25, 125 }; if ( (i = k & 3) !=0) b = multadd(b, p05[i-1], 0 MTa); if (!(k >>= 2)) return b; #ifdef MULTIPLE_THREADS if (!(TI = *PTI)) *PTI = TI = get_TI(); #endif if ((p5 = p5s) == 0) { /* first time */ #ifdef MULTIPLE_THREADS if (!(TI = *PTI)) *PTI = TI = get_TI(); if (TI == &TI0) ACQUIRE_DTOA_LOCK(1); if (!(p5 = p5s)) { p5 = p5s = i2b(625 MTa); p5->next = 0; } if (TI == &TI0) FREE_DTOA_LOCK(1); #else p5 = p5s = i2b(625); p5->next = 0; #endif } for(;;) { if (k & 1) { b1 = mult(b, p5 MTa); Bfree(b MTa); b = b1; } if (!(k >>= 1)) break; if ((p51 = p5->next) == 0) { #ifdef MULTIPLE_THREADS if (!TI && !(TI = *PTI)) *PTI = TI = get_TI(); if (TI == &TI0) ACQUIRE_DTOA_LOCK(1); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5,p5 MTa); p51->next = 0; } if (TI == &TI0) FREE_DTOA_LOCK(1); #else p51 = p5->next = mult(p5,p5 MTa); p51->next = 0; #endif } p5 = p51; } return b; } Bigint * lshift #ifdef KR_headers (b, k MTa) Bigint *b; int k; MTk #else (Bigint *b, int k MTd) #endif { int i, k1, n, n1; Bigint *b1; ULong *x, *x1, *xe, z; n = k >> kshift; k1 = b->k; n1 = n + b->wds + 1; for(i = b->maxwds; n1 > i; i <<= 1) k1++; b1 = Balloc(k1 MTa); x1 = b1->x; for(i = 0; i < n; i++) *x1++ = 0; x = b->x; xe = x + b->wds; if (k &= kmask) { #ifdef Pack_32 k1 = 32 - k; z = 0; do { *x1++ = *x << k | z; z = *x++ >> k1; } while(x < xe); if ((*x1 = z) !=0) ++n1; #else k1 = 16 - k; z = 0; do { *x1++ = *x << k & 0xffff | z; z = *x++ >> k1; } while(x < xe); if (*x1 = z) ++n1; #endif } else do *x1++ = *x++; while(x < xe); b1->wds = n1 - 1; Bfree(b MTa); return b1; } int cmp #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { ULong *xa, *xa0, *xb, *xb0; int i, j; i = a->wds; j = b->wds; #ifdef DEBUG if (i > 1 && !a->x[i-1]) Bug("cmp called with a->x[a->wds-1] == 0"); if (j > 1 && !b->x[j-1]) Bug("cmp called with b->x[b->wds-1] == 0"); #endif if (i -= j) return i; xa0 = a->x; xa = xa0 + j; xb0 = b->x; xb = xb0 + j; for(;;) { if (*--xa != *--xb) return *xa < *xb ? -1 : 1; if (xa <= xa0) break; } return 0; } Bigint * diff #ifdef KR_headers (a, b MTa) Bigint *a, *b; MTk #else (Bigint *a, Bigint *b MTd) #endif { Bigint *c; int i, wa, wb; ULong *xa, *xae, *xb, *xbe, *xc; #ifdef ULLong ULLong borrow, y; #else ULong borrow, y; #ifdef Pack_32 ULong z; #endif #endif i = cmp(a,b); if (!i) { c = Balloc(0 MTa); c->wds = 1; c->x[0] = 0; return c; } if (i < 0) { c = a; a = b; b = c; i = 1; } else i = 0; c = Balloc(a->k MTa); c->sign = i; wa = a->wds; xa = a->x; xae = xa + wa; wb = b->wds; xb = b->x; xbe = xb + wb; xc = c->x; borrow = 0; #ifdef ULLong do { y = (ULLong)*xa++ - *xb++ - borrow; borrow = y >> 32 & 1UL; *xc++ = y & 0xffffffffUL; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = y >> 32 & 1UL; *xc++ = y & 0xffffffffUL; } #else #ifdef Pack_32 do { y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } while(xb < xbe); while(xa < xae) { y = (*xa & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } #else do { y = *xa++ - *xb++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } #endif #endif while(!*--xc) wa--; c->wds = wa; return c; } double b2d #ifdef KR_headers (a, e) Bigint *a; int *e; #else (Bigint *a, int *e) #endif { ULong *xa, *xa0, w, y, z; int k; U d; #ifdef VAX ULong d0, d1; #else #define d0 word0(&d) #define d1 word1(&d) #endif xa0 = a->x; xa = xa0 + a->wds; y = *--xa; #ifdef DEBUG if (!y) Bug("zero y in b2d"); #endif k = hi0bits(y); *e = 32 - k; #ifdef Pack_32 if (k < Ebits) { d0 = Exp_1 | y >> (Ebits - k); w = xa > xa0 ? *--xa : 0; d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); goto ret_d; } z = xa > xa0 ? *--xa : 0; if (k -= Ebits) { d0 = Exp_1 | y << k | z >> (32 - k); y = xa > xa0 ? *--xa : 0; d1 = z << k | y >> (32 - k); } else { d0 = Exp_1 | y; d1 = z; } #else if (k < Ebits + 16) { z = xa > xa0 ? *--xa : 0; d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; w = xa > xa0 ? *--xa : 0; y = xa > xa0 ? *--xa : 0; d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; goto ret_d; } z = xa > xa0 ? *--xa : 0; w = xa > xa0 ? *--xa : 0; k -= Ebits + 16; d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; y = xa > xa0 ? *--xa : 0; d1 = w << k + 16 | y << k; #endif ret_d: #ifdef VAX word0(&d) = d0 >> 16 | d0 << 16; word1(&d) = d1 >> 16 | d1 << 16; #endif return dval(&d); } #undef d0 #undef d1 Bigint * d2b #ifdef KR_headers (dd, e, bits MTa) double dd; int *e, *bits; MTk #else (double dd, int *e, int *bits MTd) #endif { Bigint *b; U d; #ifndef Sudden_Underflow int i; #endif int de, k; ULong *x, y, z; #ifdef VAX ULong d0, d1; #else #define d0 word0(&d) #define d1 word1(&d) #endif d.d = dd; #ifdef VAX d0 = word0(&d) >> 16 | word0(&d) << 16; d1 = word1(&d) >> 16 | word1(&d) << 16; #endif #ifdef Pack_32 b = Balloc(1 MTa); #else b = Balloc(2 MTa); #endif x = b->x; z = d0 & Frac_mask; d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ #ifdef Sudden_Underflow de = (int)(d0 >> Exp_shift); #ifndef IBM z |= Exp_msk11; #endif #else if ( (de = (int)(d0 >> Exp_shift)) !=0) z |= Exp_msk1; #endif #ifdef Pack_32 if ( (y = d1) !=0) { if ( (k = lo0bits(&y)) !=0) { x[0] = y | z << (32 - k); z >>= k; } else x[0] = y; #ifndef Sudden_Underflow i = #endif b->wds = (x[1] = z) !=0 ? 2 : 1; } else { k = lo0bits(&z); x[0] = z; #ifndef Sudden_Underflow i = #endif b->wds = 1; k += 32; } #else if ( (y = d1) !=0) { if ( (k = lo0bits(&y)) !=0) if (k >= 16) { x[0] = y | z << 32 - k & 0xffff; x[1] = z >> k - 16 & 0xffff; x[2] = z >> k; i = 2; } else { x[0] = y & 0xffff; x[1] = y >> 16 | z << 16 - k & 0xffff; x[2] = z >> k & 0xffff; x[3] = z >> k+16; i = 3; } else { x[0] = y & 0xffff; x[1] = y >> 16; x[2] = z & 0xffff; x[3] = z >> 16; i = 3; } } else { #ifdef DEBUG if (!z) Bug("Zero passed to d2b"); #endif k = lo0bits(&z); if (k >= 16) { x[0] = z; i = 0; } else { x[0] = z & 0xffff; x[1] = z >> 16; i = 1; } k += 32; } while(!x[i]) --i; b->wds = i + 1; #endif #ifndef Sudden_Underflow if (de) { #endif #ifdef IBM *e = (de - Bias - (P-1) << 2) + k; *bits = 4*P + 8 - k - hi0bits(word0(&d) & Frac_mask); #else *e = de - Bias - (P-1) + k; *bits = P - k; #endif #ifndef Sudden_Underflow } else { *e = de - Bias - (P-1) + 1 + k; #ifdef Pack_32 *bits = 32*i - hi0bits(x[i-1]); #else *bits = (i+2)*16 - hi0bits(x[i]); #endif } #endif return b; } #undef d0 #undef d1 CONST double #ifdef IEEE_Arith bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 }; #else #ifdef IBM bigtens[] = { 1e16, 1e32, 1e64 }; CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; #else bigtens[] = { 1e16, 1e32 }; CONST double tinytens[] = { 1e-16, 1e-32 }; #endif #endif CONST double tens[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 #ifdef VAX , 1e23, 1e24 #endif }; char * #ifdef KR_headers strcp_D2A(a, b) char *a; char *b; #else strcp_D2A(char *a, CONST char *b) #endif { while((*a = *b++)) a++; return a; } #ifdef NO_STRING_H Char * #ifdef KR_headers memcpy_D2A(a, b, len) Char *a; Char *b; size_t len; #else memcpy_D2A(void *a1, void *b1, size_t len) #endif { char *a = (char*)a1, *ae = a + len; char *b = (char*)b1, *a0 = a; while(a < ae) *a++ = *b++; return a0; } #endif /* NO_STRING_H */ mlton-20210117+dfsg/runtime/gdtoa/printf.c000066400000000000000000000002361416264345000202560ustar00rootroot00000000000000#ifdef __sun #define Use_GDTOA_Qtype #else #if defined(__i386) || defined(__x86_64) #define Use_GDTOA_for_i386_long_double #endif #endif #include "printf.c0" mlton-20210117+dfsg/runtime/gdtoa/printf.c0000066400000000000000000000721731416264345000203470ustar00rootroot00000000000000/**************************************************************** Copyright (C) 1997, 1999, 2001 Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* This implements most of ANSI C's printf, fprintf, and sprintf, * omitting L, with %.0g and %.0G giving the shortest decimal string * that rounds to the number being converted, and with negative * precisions allowed for %f. */ #ifdef KR_headers #include "varargs.h" #else #include "stddef.h" #include "stdarg.h" #include "stdlib.h" #endif #ifdef Use_GDTOA_for_i386_long_double /*{{*/ #include "gdtoa.h" #else /*}{*/ #ifndef NO_PRINTF_A_FMT /*{*/ #include "gdtoa.h" #endif /*}*/ #endif /*}}*/ #ifdef __i386 #define NO_GDTOA_i386_Quad #endif #ifdef Use_GDTOA_for_i386_long_double /*{*/ #ifndef NO_GDTOA_i386_Quad /*{*/ #define GDTOA_both #define Use_GDTOA_Qtype #ifdef __ICC__ /* or __INTEL_COMPILER__ or __INTEL_COMPILER ?? */ #define GDTOA_Qtype _Quad #else /*{*/ #ifdef __linux #define GDTOA_Qtype __float128 #else #undef GDTOA_both #undef Use_GDTOA_Qtype #endif #endif /*}*/ #endif /*} NO_GDTOA_i386_Quad */ #endif /*} Use_GDTOA_for_i386_long_double */ #ifdef Use_GDTOA_Qtype /*{*/ #ifndef GDTOA_H_INCLUDED #include "gdtoa.h" #endif #ifndef GDTOA_Qtype #define GDTOA_Qtype long double #endif #endif /*}*/ #ifndef GDTOA_H_INCLUDED /*{*/ enum { /* return values from strtodg */ STRTOG_Zero = 0, STRTOG_Normal = 1, STRTOG_Denormal = 2, STRTOG_Infinite = 3, STRTOG_NaN = 4, STRTOG_NaNbits = 5, STRTOG_NoNumber = 6, STRTOG_Retmask = 7}; typedef struct FPI { int nbits; int emin; int emax; int rounding; int sudden_underflow; } FPI; enum { /* FPI.rounding values: same as FLT_ROUNDS */ FPI_Round_zero = 0, FPI_Round_near = 1, FPI_Round_up = 2, FPI_Round_down = 3 }; #endif /*}*/ #ifdef NO_PRINTF_A_FMT /*{{*/ #define WANT_A_FMT(x) /*nothing*/ #else /*}{*/ #define WANT_A_FMT(x) x #endif /*}}*/ #include "stdio1.h" #include "string.h" #include "errno.h" typedef struct Finfo { union { FILE *cf; char *sf; } u; char *ob0, *obe1; size_t lastlen; } Finfo; typedef char *(*pgdtoa) ANSI((CONST FPI*, int be, ULong *bits, int *kind, int mode, int ndigits, int *decpt, char **rve)); typedef struct FPBits { ULong bits[4]; /* sufficient for quad; modify if considering wider types */ FPI *fpi; pgdtoa gdtoa; int sign; int ex; /* exponent */ int kind; } FPBits; typedef union U { double d; long double ld; #ifdef GDTOA_Qtype GDTOA_Qtype Qd; #endif unsigned int ui[4]; unsigned short us[5]; } U; typedef char *(*Putfunc) ANSI((Finfo*, int*)); typedef void (*Fpbits) ANSI((U*, FPBits*)); /* Would have preferred typedef void (*Fpbits)(va_list*, FPBits*) * but gcc is buggy in this regard. */ #ifdef Use_GDTOA_for_i386_long_double /*{*/ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif static void xfpbits(U *u, FPBits *b) { ULong *bits; int ex, i; static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, 0 /*not used*/ }; b->fpi = &fpi0; b->gdtoa = gdtoa; b->sign = u->us[_0] & 0x8000; bits = b->bits; bits[1] = (u->us[_1] << 16) | u->us[_2]; bits[0] = (u->us[_3] << 16) | u->us[_4]; if ( (ex = u->us[_0] & 0x7fff) !=0) { i = STRTOG_Normal; if (ex == 0x7fff) /* Infinity or NaN */ i = bits[0] | bits[1] ? STRTOG_NaN : STRTOG_Infinite; } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; ex = 1; } else i = STRTOG_Zero; b->kind = i; b->ex = ex - (0x3fff + 63); } #undef _0 #undef _1 #undef _2 #undef _3 #undef _4 #define GDTOA_LD_fpbits xfpbits #endif /*} Use_GDTOA_for_i386_long_double */ #ifdef Use_GDTOA_Qtype /*{*/ #include "gdtoa.h" #ifndef GDTOA_Qtype #define GDTOA_Qtype long double #endif #ifdef GDTOA_LD_fpbits #define GDTOA_Q_fpbits Qfpbits #else #define GDTOA_LD_fpbits Qfpbits #endif #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif static void Qfpbits(U *u, FPBits *b) { ULong *bits; int ex, i; static FPI fpi0 = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, 0, 0 /*not used*/ }; b->fpi = &fpi0; b->gdtoa = gdtoa; b->sign = u->ui[_0] & 0x80000000L; bits = b->bits; bits[3] = u->ui[_0] & 0xffff; bits[2] = u->ui[_1]; bits[1] = u->ui[_2]; bits[0] = u->ui[_3]; if ( (ex = (u->ui[_0] & 0x7fff0000L) >> 16) !=0) { if (ex == 0x7fff) { /* Infinity or NaN */ i = bits[0] | bits[1] | bits[2] | bits[3] ? STRTOG_NaN : STRTOG_Infinite; } else { i = STRTOG_Normal; bits[3] |= 0x10000; } } else if (bits[0] | bits[1] | bits[2] | bits[3]) { i = STRTOG_Denormal; ex = 1; } else i = STRTOG_Zero; b->kind = i; b->ex = ex - (0x3fff + 112); } #undef _0 #undef _1 #undef _2 #undef _3 #endif /*} GDTOA_Qtype */ #ifdef KR_headers #define Const /* const */ #define Voidptr char* #ifndef size_t__ #define size_t int #define size_t__ #endif #else #define Const const #define Voidptr void* #endif #undef MESS #ifndef Stderr #define Stderr stderr #endif #ifdef _windows_ #undef PF_BUF #define MESS #include "mux0.h" #define stdout_or_err(f) (f == stdout) #else #define stdout_or_err(f) (f == Stderr || f == stdout) #endif #ifdef __cplusplus extern "C" { #endif extern char *dtoa ANSI((double, int, int, int*, int*, char **)); extern void freedtoa ANSI((char*)); #ifdef USE_ULDIV /* This is for avoiding 64-bit divisions on the DEC Alpha, since */ /* they are not portable among variants of OSF1 (DEC's Unix). */ #define ULDIV(a,b) uldiv_ASL(a,(unsigned long)(b)) #ifndef LLBITS #define LLBITS 6 #endif #ifndef ULONG #define ULONG unsigned long #endif static int klog(ULONG x) { int k, rv = 0; if (x > 1L) for(k = 1 << LLBITS-1;;) { if (x >= (1L << k)) { rv |= k; x >>= k; } if (!(k >>= 1)) break; } return rv; } ULONG uldiv_ASL(ULONG a, ULONG b) { int ka; ULONG c, k; static ULONG b0; static int kb; if (a < b) return 0; if (b != b0) { b0 = b; kb = klog(b); } k = 1; if ((ka = klog(a) - kb) > 0) { k <<= ka; b <<= ka; } c = 0; for(;;) { if (a >= b) { a -= b; c |= k; } if (!(k >>= 1)) break; a <<= 1; } return c; } #else #define ULDIV(a,b) a / b #endif /* USE_ULDIV */ #ifdef PF_BUF FILE *stderr_ASL = (FILE*)&stderr_ASL; void (*pfbuf_print_ASL) ANSI((char*)); char *pfbuf_ASL; static char *pfbuf_next; static size_t pfbuf_len; extern Char *mymalloc_ASL ANSI((size_t)); extern Char *myralloc_ASL ANSI((void *, size_t)); #undef fflush #ifdef old_fflush_ASL #define fflush old_fflush_ASL #endif void fflush_ASL(FILE *f) { if (f == stderr_ASL) { if (pfbuf_ASL && pfbuf_print_ASL) { (*pfbuf_print_ASL)(pfbuf_ASL); free(pfbuf_ASL); pfbuf_ASL = 0; } } else fflush(f); } static void pf_put(char *buf, int len) { size_t x, y; if (!pfbuf_ASL) { x = len + 256; if (x < 512) x = 512; pfbuf_ASL = pfbuf_next = (char*)mymalloc_ASL(pfbuf_len = x); } else if ((y = (pfbuf_next - pfbuf_ASL) + len) >= pfbuf_len) { x = pfbuf_len; while((x <<= 1) <= y); y = pfbuf_next - pfbuf_ASL; pfbuf_ASL = (char*)myralloc_ASL(pfbuf_ASL, x); pfbuf_next = pfbuf_ASL + y; pfbuf_len = x; } memcpy(pfbuf_next, buf, len); pfbuf_next += len; *pfbuf_next = 0; } static char * pfput(Finfo *f, int *rvp) { int n; char *ob0 = f->ob0; *rvp += n = (int)(f->obe1 - ob0); pf_put(ob0, n); return ob0; } #endif /* PF_BUF */ static char * Fput #ifdef KR_headers (f, rvp) Finfo *f; int *rvp; #else (Finfo *f, int *rvp) #endif { char *ob0 = f->ob0; *rvp += f->obe1 - ob0; *f->obe1 = 0; fputs(ob0, f->u.cf); return ob0; } #ifdef _windows_ int stdout_fileno_ASL = 1; static char * Wput #ifdef KR_headers (f, rvp) Finfo *f; int *rvp; #else (Finfo *f, int *rvp) #endif { char *ob0 = f->ob0; *rvp += f->obe1 - ob0; *f->obe1 = 0; mwrite(ob0, f->obe1 - ob0); return ob0; } #endif /*_windows_*/ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #endif #ifdef IEEE_8087 #define _0 1 #define _1 0 #endif static void dfpbits(U *u, FPBits *b) { ULong *bits; int ex, i; static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0, 0 /*not used*/ }; b->fpi = &fpi0; b->gdtoa = gdtoa; b->sign = u->ui[_0] & 0x80000000L; bits = b->bits; bits[1] = u->ui[_0] & 0xfffff; bits[0] = u->ui[_1]; if ( (ex = (u->ui[_0] & 0x7ff00000L) >> 20) !=0) { if (ex == 0x7ff) { /* Infinity or NaN */ i = bits[0] | bits[1] ? STRTOG_NaN : STRTOG_Infinite; } else { i = STRTOG_Normal; bits[1] |= 0x100000; } } else if (bits[0] | bits[1]) { i = STRTOG_Denormal; ex = 1; } else i = STRTOG_Zero; b->kind = i; b->ex = ex - (0x3ff + 52); } #undef _0 #undef _1 #ifdef Honor_FLT_ROUNDS /*{{*/ #ifdef Trust_FLT_ROUNDS /*{{*/ #define RoundCheck if (Rounding == -1) Rounding = Flt_Rounds; if (Rounding != 1){\ fpi1 = *fpb.fpi; fpi1.rounding = Rounding; fpb.fpi = &fpi1;} #else /*}{*/ #define RoundCheck if (Rounding == -1) { Rounding = 1; switch((fegetround()) {\ case FE_TOWARDZERO: Rounding = 0; break;\ case FE_UPWARD: Rounding = 2; break;\ case FE_DOWNWARD: Rounding = 3; }}\ if (Rounding != 1){\ fpi1 = *fpb.fpi; fpi1.rounding = Rounding; fpb.fpi = &fpi1;} #endif /*}}*/ #else /*}{*/ #define RoundCheck /*nothing*/ #endif /*}}*/ #ifndef NO_PRINTF_A_FMT /*{*/ static int fpiprec(FPBits *b) /* return number of hex digits minus 1, or 0 for zero */ { FPI *fpi; ULong *bits; int i, j, k, m; if (b->kind == STRTOG_Zero) return b->ex = 0; fpi = b->fpi; bits = b->bits; for(k = (fpi->nbits - 1) >> 2; k > 0; --k) if ((bits[k >> 3] >> 4*(k & 7)) & 0xf) { m = k >> 3; for(i = 0; i <= m; ++i) if (bits[i]) { if (i > 0) { k -= 8*i; b->ex += 32*i; for(j = i; j <= m; ++j) bits[j-i] = bits[j]; } break; } for(i = 0; i < 28 && !((bits[0] >> i) & 0xf); i += 4); if (i) { b->ex += i; m = k >> 3; k -= (i >> 2); for(j = 0;;++j) { bits[j] >>= i; if (j == m) break; bits[j] |= bits[j+1] << (32 - i); } } break; } return k; } static int bround(FPBits *b, int prec, int prec1) /* round to prec hex digits after the "." */ { /* prec1 = incoming precision (after ".") */ ULong *bits, t; int i, inc, j, k, m, n; #ifdef Honor_FLT_ROUNDS int rounding = fpi->rounding; if (rounding > FPI_Round_near && b->sign) rounding = FPI_Round_up + FPI_Round_down - rounding; if (rounding == FPI_Round_down) rounding = FPI_Round_zero; #endif m = prec1 - prec; bits = b->bits; inc = 0; #ifdef Honor_FLT_ROUNDS switch(rounding) { case FPI_Round_up: for(i = 0; i < m; i += 8) if (bits[i>>3]) goto inc1; if ((j = i - m) > 0 && bits[(i-8)>>3] << j*4) goto inc1; break; case FPI_Round_near: #endif k = m - 1; if ((t = bits[k >> 3] >> (j = (k&7)*4)) & 8) { if (t & 7) goto inc1; if (j && bits[k >> 3] << (32 - j)) goto inc1; while(k >= 8) { k -= 8; if (bits[k>>3]) { inc1: inc = 1; goto haveinc; } } } #ifdef Honor_FLT_ROUNDS } #endif haveinc: b->ex += m*4; i = m >> 3; k = prec1 >> 3; j = i; if ((n = 4*(m & 7))) for(;; ++j) { bits[j-i] = bits[j] >> n; if (j == k) break; bits[j-i] |= bits[j+1] << (32-n); } else for(;; ++j) { bits[j-i] = bits[j]; if (j == k) break; } k = prec >> 3; if (inc) { for(j = 0; !(++bits[j] & 0xffffffff); ++j); if (j > k) { onebit: bits[0] = 1; b->ex += 4*prec; return 1; } if ((j = prec & 7) < 7 && bits[k] >> (j+1)*4) goto onebit; } for(i = 0; !(bits[i >> 3] & (0xf << 4*(i&7))); ++i); if (i) { b->ex += 4*i; prec -= i; j = i >> 3; i &= 7; i *= 4; for(m = j; ; ++m) { bits[m-j] = bits[m] >> i; if (m == k) break; bits[m-j] |= bits[m+1] << (32 - i); } } return prec; } #endif /*}NO_PRINTF_A_FMT*/ #define put(x) { *outbuf++ = x; if (outbuf == obe) outbuf = (*fput)(f,&rv); } static int x_sprintf #ifdef KR_headers (obe, fput, f, fmt, ap) char *obe, *fmt; Finfo *f; Putfunc fput; va_list ap; #else (char *obe, Putfunc fput, Finfo *f, const char *fmt, va_list ap) #endif { FPBits fpb; Fpbits fpbits; U u; char *digits, *ob0, *outbuf, *s, *s0, *se; Const char *fmt0; char buf[32]; long i; unsigned long j, ul; double x; int alt, base, c, decpt, dot, conv, i1, k, lead0, left, len, prec, prec1, psign, rv, sign, width; long Ltmp, *ip; short sh; unsigned short us; unsigned int ui; #ifdef Honor_FLT_ROUNDS FPI fpi1; int Rounding = -1; #endif #ifndef NO_PRINTF_A_FMT /*{*/ int bex, bw; #endif /*} NO_PRINTF_A_FMT */ static char hex[] = "0123456789abcdefpx"; static char Hex[] = "0123456789ABCDEFPX"; ob0 = outbuf = f->ob0; rv = 0; for(;;) { for(;;) { switch(c = *fmt++) { case 0: goto done; case '%': break; default: put(c) continue; } break; } alt=dot=lead0=left=len=prec=psign=sign=width=0; fpbits = dfpbits; fmt0 = fmt; fmtloop: switch(conv = *fmt++) { case ' ': case '+': sign = conv; goto fmtloop; case '-': if (dot) psign = 1; else left = 1; goto fmtloop; case '#': alt = 1; goto fmtloop; case '0': if (!lead0 && !dot) { lead0 = 1; goto fmtloop; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': k = conv - '0'; while((c = *fmt) >= '0' && c <= '9') { k = 10*k + c - '0'; fmt++; } if (dot) prec = psign ? -k : k; else width = k; goto fmtloop; case 'h': len = 2; goto fmtloop; case 'L': #ifdef GDTOA_LD_fpbits /*{*/ fpbits = GDTOA_LD_fpbits; #ifdef GDTOA_Q_fpbits if (*fmt == 'q') { ++fmt; fpbits = Qfpbits; } #endif #endif /*}*/ goto fmtloop; case 'l': len = 1; goto fmtloop; case '.': dot = 1; goto fmtloop; case '*': k = va_arg(ap, int); if (dot) prec = k; else { if (k < 0) { sign = '-'; k = -k; } width = k; } goto fmtloop; case 'c': c = va_arg(ap, int); put(c) continue; case '%': put(conv) continue; case 'u': switch(len) { case 0: ui = va_arg(ap, int); i = ui; break; case 1: i = va_arg(ap, long); break; case 2: us = va_arg(ap, int); i = us; } sign = 0; goto have_i; case 'i': case 'd': switch(len) { case 0: k = va_arg(ap, int); i = k; break; case 1: i = va_arg(ap, long); break; case 2: sh = va_arg(ap, int); i = sh; } if (i < 0) { sign = '-'; i = -i; } have_i: base = 10; ul = i; digits = hex; baseloop: if (dot) lead0 = 0; s = buf; if (!ul) alt = 0; do { j = ULDIV(ul, base); *s++ = digits[ul - base*j]; } while((ul = j)); prec -= c = s - buf; if (alt && conv == 'o' && prec <= 0) prec = 1; if ((width -= c) > 0) { if (prec > 0) width -= prec; if (sign) width--; if (alt == 2) width--; } if (left) { if (alt == 2) put('0') /* for 0x */ if (sign) put(sign) while(--prec >= 0) put('0') do put(*--s) while(s > buf); while(--width >= 0) put(' ') continue; } if (width > 0) { if (lead0) { if (alt == 2) put('0') if (sign) put(sign) while(--width >= 0) put('0') goto s_loop; } else while(--width >= 0) put(' ') } if (alt == 2) put('0') if (sign) put(sign) s_loop: while(--prec >= 0) put('0') do put(*--s) while(s > buf); continue; case 'n': ip = va_arg(ap, long*); if (!ip) ip = &Ltmp; c = outbuf - ob0 + rv; switch(len) { case 0: *(int*)ip = c; break; case 1: *ip = c; break; case 2: *(short*)ip = c; } break; case 'p': len = alt = 1; /* no break */ case 'x': digits = hex; goto more_x; case 'X': digits = Hex; more_x: if (alt) { alt = 2; sign = conv; } else sign = 0; base = 16; get_u: switch(len) { case 0: ui = va_arg(ap, int); ul = ui; break; case 1: ul = va_arg(ap, long); break; case 2: us = va_arg(ap, int); ul = us; } if (!ul) sign = alt = 0; goto baseloop; case 'o': base = 8; digits = hex; goto get_u; case 's': s0 = 0; s = va_arg(ap, char*); if (!s) s = ""; if (prec < 0) prec = 0; have_s: if (dot) { for(c = 0; c < prec; c++) if (!s[c]) break; prec = c; } else prec = strlen(s); width -= prec; if (!left) while(--width >= 0) put(' ') while(--prec >= 0) put(*s++) while(--width >= 0) put(' ') if (s0) freedtoa(s0); continue; case 'f': if (!dot) prec = 6; #ifdef GDTOA_H_INCLUDED if (fpbits == dfpbits) { #endif x = va_arg(ap, double); s = s0 = dtoa(x, 3, prec, &decpt, &fpb.sign, &se); #ifdef GDTOA_H_INCLUDED } else { #ifdef GDTOA_both if (fpbits == GDTOA_LD_fpbits) u.ld = va_arg(ap, long double); else u.Qd = va_arg(ap, GDTOA_Qtype); #else u.ld = va_arg(ap, long double); #endif fpbits(&u, &fpb); RoundCheck s = s0 = fpb.gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, 3, prec, &decpt, &se); } #endif if (decpt == 9999) { fmt9999: dot = prec = alt = 0; if (*s == 'N') goto have_s; decpt = strlen(s); } f_fmt: if (fpb.sign && (x||sign)) sign = '-'; if (prec > 0) width -= prec; if (width > 0) { if (sign) --width; if (decpt <= 0) { --width; if (prec > 0) --width; } else { if (s == se) decpt = 1; width -= decpt; if (prec > 0 || alt) --width; } } if (width > 0 && !left) { if (lead0) { if (sign) put(sign) sign = 0; do put('0') while(--width > 0); } else do put(' ') while(--width > 0); } if (sign) put(sign) if (decpt <= 0) { put('0') if (prec > 0 || alt) put('.') while(decpt < 0) { put('0') prec--; decpt++; } } else { do { if ((c = *s)) s++; else c = '0'; put(c) } while(--decpt > 0); if (prec > 0 || alt) put('.') } while(--prec >= 0) { if ((c = *s)) s++; else c = '0'; put(c) } while(--width >= 0) put(' ') if (s0) freedtoa(s0); continue; case 'G': case 'g': if (!dot) prec = 6; if (prec < 0) prec = 0; #ifdef GDTOA_H_INCLUDED if (fpbits == dfpbits) { #endif x = va_arg(ap, double); s = s0 = dtoa(x, prec ? 2 : 0, prec, &decpt, &fpb.sign, &se); #ifdef GDTOA_H_INCLUDED } else { #ifdef GDTOA_both if (fpbits == GDTOA_LD_fpbits) u.ld = va_arg(ap, long double); else u.Qd = va_arg(ap, GDTOA_Qtype); #else u.ld = va_arg(ap, long double); #endif fpbits(&u, &fpb); RoundCheck s = s0 = fpb.gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, prec ? 2 : 0, prec, &decpt, &se); } #endif if (decpt == 9999) goto fmt9999; c = se - s; prec1 = prec; if (!prec) { prec = c; prec1 = c + (s[1] || alt ? 5 : 4); /* %.0g gives 10 rather than 1e1 */ } if (decpt > -4 && decpt <= prec1) { if (alt) prec -= decpt; else prec = c - decpt; if (prec < 0) prec = 0; goto f_fmt; } conv -= 2; if (!alt && prec > c) prec = c; --prec; goto e_fmt; case 'e': case 'E': if (!dot) prec = 6; if (prec < 0) prec = 0; #ifdef GDTOA_H_INCLUDED if (fpbits == dfpbits) { #endif x = va_arg(ap, double); s = s0 = dtoa(x, prec ? 2 : 0, prec+1, &decpt, &fpb.sign, &se); #ifdef GDTOA_H_INCLUDED } else { #ifdef GDTOA_both if (fpbits == GDTOA_LD_fpbits) u.ld = va_arg(ap, long double); else u.Qd = va_arg(ap, GDTOA_Qtype); #else u.ld = va_arg(ap, long double); #endif fpbits(&u, &fpb); RoundCheck s = s0 = fpb.gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, prec ? 2 : 0, prec, &decpt, &se); } #endif if (decpt == 9999) goto fmt9999; e_fmt: if (fpb.sign && (x||sign)) sign = '-'; if ((width -= prec + 5) > 0) { if (sign) --width; if (prec || alt) --width; } if ((c = --decpt) < 0) c = -c; while(c >= 100) { --width; c /= 10; } if (width > 0 && !left) { if (lead0) { if (sign) put(sign) sign = 0; do put('0') while(--width > 0); } else do put(' ') while(--width > 0); } if (sign) put(sign) put(*s++) if (prec || alt) put('.') while(--prec >= 0) { if ((c = *s)) s++; else c = '0'; put(c) } put(conv) if (decpt < 0) { put('-') decpt = -decpt; } else put('+') for(c = 2, k = 10; 10*k <= decpt; c++, k *= 10); for(;;) { i1 = decpt / k; put(i1 + '0') if (--c <= 0) break; decpt -= i1*k; decpt *= 10; } while(--width >= 0) put(' ') freedtoa(s0); continue; #ifndef NO_PRINTF_A_FMT case 'a': digits = hex; goto more_a; case 'A': digits = Hex; more_a: #ifdef GDTOA_H_INCLUDED /*{{*/ if (fpbits == dfpbits) u.d = va_arg(ap, double); #ifdef GDTOA_both /*{*/ else if (fpbits == GDTOA_LD_fpbits) u.ld = va_arg(ap, long double); else u.Qd = va_arg(ap, GDTOA_Qtype); #else else u.ld = va_arg(ap, long double); #endif /*}*/ #else /*}{*/ u.d = va_arg(ap, double); #endif /*}}*/ fpbits(&u, &fpb); if (fpb.kind == STRTOG_Infinite) { s = "Infinity"; s0 = 0; goto fmt9999; } if (fpb.kind == STRTOG_NaN) { s = "NaN"; s0 = 0; goto fmt9999; } prec1 = fpiprec(&fpb); if (dot && prec < prec1) prec1 = bround(&fpb, prec, prec1); bw = 1; bex = fpb.ex + 4*prec1; if (bex) { if ((i1 = bex) < 0) i1 = -i1; while(i1 >= 10) { ++bw; i1 /= 10; } } if (fpb.sign && (sign || fpb.kind != STRTOG_Zero)) sign = '-'; if ((width -= bw + 5) > 0) { if (sign) --width; if (prec1 || alt) --width; } if ((width -= prec1) > 0 && !left && !lead0) { do put(' ') while(--width > 0); } if (sign) put(sign) put('0') put(digits[17]) if (lead0 && width > 0 && !left) { do put('0') while(--width > 0); } i1 = prec1 & 7; k = prec1 >> 3; put(digits[(fpb.bits[k] >> 4*i1) & 0xf]) if (prec1 > 0 || alt) put('.') if (prec1 > 0) { prec -= prec1; while(prec1 > 0) { if (--i1 < 0) { if (--k < 0) break; i1 = 7; } put(digits[(fpb.bits[k] >> 4*i1) & 0xf]) --prec1; } if (alt && prec > 0) do put(0) while(--prec > 0); } put(digits[16]) if (bex < 0) { put('-') bex = -bex; } else put('+') for(c = 1; 10*c <= bex; c *= 10); for(;;) { i1 = bex / c; put('0' + i1) if (!--bw) break; bex -= i1 * c; bex *= 10; } while(--width >= 0) put(' ') continue; #endif /* NO_PRINTF_A_FMT */ default: put('%') while(fmt0 < fmt) put(*fmt0++) continue; } } done: *outbuf = 0; return (f->lastlen = outbuf - ob0) + rv; } #define Bsize 256 int Printf #ifdef KR_headers (va_alist) va_dcl { char *fmt; va_list ap; int rv; Finfo f; char buf[Bsize]; va_start(ap); fmt = va_arg(ap, char*); /*}*/ #else (const char *fmt, ...) { va_list ap; int rv; Finfo f; char buf[Bsize]; va_start(ap, fmt); #endif f.u.cf = stdout; f.ob0 = buf; f.obe1 = buf + Bsize - 1; #ifdef _windows_ if (fileno(stdout) == stdout_fileno_ASL) { rv = x_sprintf(f.obe1, Wput, &f, fmt, ap); mwrite(buf, f.lastlen); } else #endif #ifdef PF_BUF if (stdout == stderr_ASL) { rv = x_sprintf(f.obe1, pfput, &f, fmt, ap); pf_put(buf, f.lastlen); } else #endif { rv = x_sprintf(f.obe1, Fput, &f, fmt, ap); fputs(buf, stdout); } va_end(ap); return rv; } static char * Sput #ifdef KR_headers (f, rvp) Finfo *f; int *rvp; #else (Finfo *f, int *rvp) #endif { if (Printf("\nBUG! Sput called!\n", f, rvp)) /* pass vp, rvp and return 0 to shut diagnostics off */ exit(250); return 0; } int Sprintf #ifdef KR_headers (va_alist) va_dcl { char *s, *fmt; va_list ap; int rv; Finfo f; va_start(ap); s = va_arg(ap, char*); fmt = va_arg(ap, char*); /*}*/ #else (char *s, const char *fmt, ...) { va_list ap; int rv; Finfo f; va_start(ap, fmt); #endif f.ob0 = s; rv = x_sprintf(s, Sput, &f, fmt, ap); va_end(ap); return rv; } int Fprintf #ifdef KR_headers (va_alist) va_dcl { FILE *F; char *s, *fmt; va_list ap; int rv; Finfo f; char buf[Bsize]; va_start(ap); F = va_arg(ap, FILE*); fmt = va_arg(ap, char*); /*}*/ #else (FILE *F, const char *fmt, ...) { va_list ap; int rv; Finfo f; char buf[Bsize]; va_start(ap, fmt); #endif f.u.cf = F; f.ob0 = buf; f.obe1 = buf + Bsize - 1; #ifdef MESS if (stdout_or_err(F)) { #ifdef _windows_ if (fileno(stdout) == stdout_fileno_ASL) { rv = x_sprintf(f.obe1, Wput, &f, fmt, ap); mwrite(buf, f.lastlen); } else #endif #ifdef PF_BUF if (F == stderr_ASL) { rv = x_sprintf(f.obe1, pfput, &f, fmt, ap); pf_put(buf, f.lastlen); } else #endif { rv = x_sprintf(f.obe1, Fput, &f, fmt, ap); fputs(buf, F); } } else #endif /*MESS*/ { #ifdef PF_BUF if (F == stderr_ASL) { rv = x_sprintf(f.obe1, pfput, &f, fmt, ap); pf_put(buf, f.lastlen); } else #endif { rv = x_sprintf(f.obe1, Fput, &f, fmt, ap); fputs(buf, F); } } va_end(ap); return rv; } int Vsprintf #ifdef KR_headers (s, fmt, ap) char *s, *fmt; va_list ap; #else (char *s, const char *fmt, va_list ap) #endif { Finfo f; return x_sprintf(f.ob0 = s, Sput, &f, fmt, ap); } int Vfprintf #ifdef KR_headers (F, fmt, ap) FILE *F; char *fmt; va_list ap; #else (FILE *F, const char *fmt, va_list ap) #endif { char buf[Bsize]; int rv; Finfo f; f.u.cf = F; f.ob0 = buf; f.obe1 = buf + Bsize - 1; #ifdef MESS if (stdout_or_err(F)) { #ifdef _windows_ if (fileno(stdout) == stdout_fileno_ASL) { rv = x_sprintf(f.obe1, Wput, &f, fmt, ap); mwrite(buf, f.lastlen); } else #endif #ifdef PF_BUF if (F == stderr_ASL) { rv = x_sprintf(f.obe1, pfput, &f, fmt, ap); pf_put(buf, f.lastlen); } else #endif { rv = x_sprintf(f.obe1, Fput, &f, fmt, ap); fputs(buf, F); } } else #endif /*MESS*/ { #ifdef PF_BUF if (F == stderr_ASL) { rv = x_sprintf(f.obe1, pfput, &f, fmt, ap); pf_put(buf, f.lastlen); } else #endif { rv = x_sprintf(f.obe1, Fput, &f, fmt, ap); fputs(buf, F); } } va_end(ap); return rv; } void Perror #ifdef KR_headers (s) char *s; #else (const char *s) #endif { if (s && *s) Fprintf(Stderr, "%s: ", s); Fprintf(Stderr, "%s\n", strerror(errno)); } static char * Snput #ifdef KR_headers (f, rvp) Finfo *f; int *rvp; #else (Finfo *f, int *rvp) #endif { char *s, *s0; size_t L; *rvp += Bsize; s0 = f->ob0; s = f->u.sf; if ((L = f->obe1 - s) > Bsize) { L = Bsize; goto copy; } if (L > 0) { copy: memcpy(s, s0, L); f->u.sf = s + L; } return s0; } int Vsnprintf #ifdef KR_headers (s, n, fmt, ap) char *s; size_t n; char *fmt; va_list ap; #else (char *s, size_t n, const char *fmt, va_list ap) #endif { Finfo f; char buf[Bsize]; int rv; size_t L; if (n <= 0 || !s) { n = 1; s = buf; } f.u.sf = s; f.ob0 = buf; f.obe1 = s + n - 1; rv = x_sprintf(buf + Bsize, Snput, &f, fmt, ap); if (f.lastlen > (L = f.obe1 - f.u.sf)) f.lastlen = L; if (f.lastlen > 0) { memcpy(f.u.sf, buf, f.lastlen); f.u.sf += f.lastlen; } *f.u.sf = 0; return rv; } int Snprintf #ifdef KR_headers (va_alist) va_dcl { char *s, *fmt; int rv; size_t n; va_list ap; va_start(ap); s = va_arg(ap, char*); n = va_arg(ap, size_t); fmt = va_arg(ap, char*); /*}*/ #else (char *s, size_t n, const char *fmt, ...) { int rv; va_list ap; va_start(ap, fmt); #endif rv = Vsnprintf(s, n, fmt, ap); va_end(ap); return rv; } #ifdef __cplusplus } #endif mlton-20210117+dfsg/runtime/gdtoa/qnan.c000066400000000000000000000070001416264345000177050ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2005 by David M. Gay All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author or any of his current or former employers not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Program to compute quiet NaNs of various precisions (float, */ /* double, and perhaps long double) on the current system, */ /* provided the system uses binary IEEE (P754) arithmetic. */ /* Note that one system's quiet NaN may be a signaling NaN on */ /* another system. The IEEE arithmetic standards (P754, P854) */ /* do not specify how to distinguish signaling NaNs from quiet */ /* ones, and this detail varies across systems. The computed */ /* NaN values are encoded in #defines for values for an */ /* unsigned 32-bit integer type, called Ulong below, and */ /* (for long double) perhaps as unsigned short values. Once */ /* upon a time, there were PC compilers for Intel CPUs that */ /* had sizeof(long double) = 10. Are such compilers still */ /* distributed? */ #include #include "gdtoa/arith.h" #ifndef Long #define Long long #endif typedef unsigned Long Ulong; #ifdef NO_LONG_LONG #undef Gen_ld_QNAN #endif #undef HAVE_IEEE #ifdef IEEE_8087 #define _0 1 #define _1 0 #ifdef Gen_ld_QNAN #define _3 3 static int perm[4] = { 0, 1, 2, 3 }; #endif #define HAVE_IEEE #endif #ifdef IEEE_MC68k #define _0 0 #define _1 1 #ifdef Gen_ld_QNAN #define _3 0 static int perm[4] = { 3, 2, 1, 0 }; #endif #define HAVE_IEEE #endif #define UL (unsigned long) int main(void) { #ifdef HAVE_IEEE typedef union { float f; double d; Ulong L[4]; #ifndef NO_LONG_LONG unsigned short u[5]; long double D; #endif } __attribute__((__may_alias__)) U; U a, b, c; #ifdef Gen_ld_QNAN int i; #endif a.L[0] = b.L[0] = 0x7f800000; c.f = a.f - b.f; printf("#define f_QNAN 0x%lx\n", UL (c.L[0] & 0x7fffffff)); a.L[_0] = b.L[_0] = 0x7ff00000; a.L[_1] = b.L[_1] = 0; c.d = a.d - b.d; /* quiet NaN */ c.L[_0] &= 0x7fffffff; printf("#define d_QNAN0 0x%lx\n", UL c.L[_0]); printf("#define d_QNAN1 0x%lx\n", UL c.L[_1]); #ifdef Gen_ld_QNAN if (sizeof(a.D) >= 16) { b.D = c.D = a.d; if (printf("") < 0) c.D = 37; /* never executed; just defeat optimization */ a.L[0] = a.L[1] = a.L[2] = a.L[3] = 0; a.D = b.D - c.D; a.L[_3] &= 0x7fffffff; for(i = 0; i < 4; i++) printf("#define ld_QNAN%d 0x%lx\n", i, UL a.L[perm[i]]); } #endif #endif /* HAVE_IEEE */ return 0; } mlton-20210117+dfsg/runtime/gdtoa/smisc.c000066400000000000000000000072251416264345000200770ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 1999 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" Bigint * s2b #ifdef KR_headers (s, nd0, nd, y9, dplen MTa) CONST char *s; int dplen, nd0, nd; ULong y9; MTk #else (CONST char *s, int nd0, int nd, ULong y9, int dplen MTd) #endif { Bigint *b; int i, k; Long x, y; x = (nd + 8) / 9; for(k = 0, y = 1; x > y; y <<= 1, k++) ; #ifdef Pack_32 b = Balloc(k MTa); b->x[0] = y9; b->wds = 1; #else b = Balloc(k+1 MTa); b->x[0] = y9 & 0xffff; b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; #endif i = 9; if (9 < nd0) { s += 9; do b = multadd(b, 10, *s++ - '0' MTa); while(++i < nd0); s += dplen; } else s += dplen + 9; for(; i < nd; i++) b = multadd(b, 10, *s++ - '0' MTa); return b; } double ratio #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { U da, db; int k, ka, kb; dval(&da) = b2d(a, &ka); dval(&db) = b2d(b, &kb); k = ka - kb + ULbits*(a->wds - b->wds); #ifdef IBM if (k > 0) { word0(&da) += (k >> 2)*Exp_msk1; if (k &= 3) dval(&da) *= 1 << k; } else { k = -k; word0(&db) += (k >> 2)*Exp_msk1; if (k &= 3) dval(&db) *= 1 << k; } #else if (k > 0) word0(&da) += k*Exp_msk1; else { k = -k; word0(&db) += k*Exp_msk1; } #endif return dval(&da) / dval(&db); } #ifdef INFNAN_CHECK int match #ifdef KR_headers (sp, t) char **sp, *t; #else (CONST char **sp, char *t) #endif { int c, d; CONST char *s = *sp; while( (d = *t++) !=0) { if ((c = *++s) >= 'A' && c <= 'Z') c += 'a' - 'A'; if (c != d) return 0; } *sp = s + 1; return 1; } #endif /* INFNAN_CHECK */ void #ifdef KR_headers copybits(c, n, b) ULong *c; int n; Bigint *b; #else copybits(ULong *c, int n, Bigint *b) #endif { ULong *ce, *x, *xe; #ifdef Pack_16 int nw, nw1; #endif ce = c + ((n-1) >> kshift) + 1; x = b->x; #ifdef Pack_32 xe = x + b->wds; while(x < xe) *c++ = *x++; #else nw = b->wds; nw1 = nw & 1; for(xe = x + (nw - nw1); x < xe; x += 2) Storeinc(c, x[1], x[0]); if (nw1) *c++ = *x; #endif while(c < ce) *c++ = 0; } ULong #ifdef KR_headers any_on(b, k) Bigint *b; int k; #else any_on(Bigint *b, int k) #endif { int n, nwds; ULong *x, *x0, x1, x2; x = b->x; nwds = b->wds; n = k >> kshift; if (n > nwds) n = nwds; else if (n < nwds && (k &= kmask)) { x1 = x2 = x[n]; x1 >>= k; x1 <<= k; if (x1 != x2) return 1; } x0 = x; x += n; while(x > x0) if (*--x) return 1; return 0; } mlton-20210117+dfsg/runtime/gdtoa/stdio1.h000066400000000000000000000057621416264345000201750ustar00rootroot00000000000000/**************************************************************** Copyright (C) 1997-1999 Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* stdio1.h -- for using Printf, Fprintf, Sprintf while * retaining the system-supplied printf, fprintf, sprintf. */ #ifndef STDIO1_H_included #define STDIO1_H_included #ifndef STDIO_H_included /* allow suppressing stdio.h */ #include /* in case it's already included, */ #endif /* e.g., by cplex.h */ #ifdef KR_headers #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; #endif #define ANSI(x) () #include "varargs.h" #ifndef Char #define Char char #endif #else #define ANSI(x) x #include "stdarg.h" #ifndef Char #define Char void #endif #endif #ifndef NO_STDIO1 #ifdef _WIN32 /* Avoid Microsoft bug that perrror may appear in stdlib.h. */ /* It should only be declared in stdio.h. */ #include #endif #ifdef __cplusplus extern "C" { #endif extern int Fprintf ANSI((FILE*, const char*, ...)); extern int Printf ANSI((const char*, ...)); extern int Sprintf ANSI((char*, const char*, ...)); extern int Snprintf ANSI((char*, size_t, const char*, ...)); extern void Perror ANSI((const char*)); extern int Vfprintf ANSI((FILE*, const char*, va_list)); extern int Vsprintf ANSI((char*, const char*, va_list)); extern int Vsnprintf ANSI((char*, size_t, const char*, va_list)); #ifdef PF_BUF extern FILE *stderr_ASL; extern void (*pfbuf_print_ASL) ANSI((char*)); extern char *pfbuf_ASL; extern void fflush_ASL ANSI((FILE*)); #ifdef fflush #define old_fflush_ASL fflush #undef fflush #endif #define fflush fflush_ASL #endif #ifdef __cplusplus } #endif #undef printf #undef fprintf #undef sprintf #undef perror #undef vfprintf #undef vsprintf #define printf Printf #define fprintf Fprintf #undef snprintf /* for MacOSX */ #undef vsnprintf /* for MacOSX */ #define snprintf Snprintf #define sprintf Sprintf #define perror Perror #define vfprintf Vfprintf #define vsnprintf Vsnprintf #define vsprintf Vsprintf #endif /* NO_STDIO1 */ #endif /* STDIO1_H_included */ mlton-20210117+dfsg/runtime/gdtoa/strtoIQ.c000066400000000000000000000037611416264345000203670ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoIQ(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else gdtoa__strtoIQ(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 113, 1-16383-113+1, 32766-16383-113+1, 1, SI, 0 /*unused*/ }; Long exp[2]; Bigint *B[2]; int k, rv[2]; ULong *L = (ULong *)a, *M = (ULong *)b; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(2 MTb); B[0]->wds = 4; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtoQ(L, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtoQ(M, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else { M[0] = L[0]; M[1] = L[1]; M[2] = L[2]; M[3] = L[3]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtoId.c000066400000000000000000000037511416264345000204110ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoId(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; #else gdtoa__strtoId(CONST char *s, char **sp, double *f0, double *f1) #endif { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; Long exp[2]; Bigint *B[2]; int k, rv[2]; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(1 MTb); B[0]->wds = 2; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtod((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtod((ULong*)f1, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else { ((ULong*)f1)[0] = ((ULong*)f0)[0]; ((ULong*)f1)[1] = ((ULong*)f0)[1]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtoIdd.c000066400000000000000000000042451416264345000205540ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoIdd(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; #else gdtoa__strtoIdd(CONST char *s, char **sp, double *f0, double *f1) #endif { #ifdef Sudden_Underflow static FPI fpi = { 106, 1-1023, 2046-1023-106+1, 1, 1, 0 /*unused*/ }; #else static FPI fpi = { 106, 1-1023-53+1, 2046-1023-106+1, 1, 0, 0 /*unused*/ }; #endif Long exp[2]; Bigint *B[2]; int k, rv[2]; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(2 MTb); B[0]->wds = 4; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtodd((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtodd((ULong*)f1, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else { ((ULong*)f1)[0] = ((ULong*)f0)[0]; ((ULong*)f1)[1] = ((ULong*)f0)[1]; ((ULong*)f1)[2] = ((ULong*)f0)[2]; ((ULong*)f1)[3] = ((ULong*)f0)[3]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtoIf.c000066400000000000000000000036611416264345000204130ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoIf(s, sp, f0, f1) CONST char *s; char **sp; float *f0, *f1; #else gdtoa__strtoIf(CONST char *s, char **sp, float *f0, float *f1) #endif { static FPI fpi = { 24, 1-127-24+1, 254-127-24+1, 1, SI, 0 /*unused*/ }; Long exp[2]; Bigint *B[2]; int k, rv[2]; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(0 MTb); B[0]->wds = 1; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtof((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtof((ULong*)f1, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else *(ULong*)f1 = *(ULong*)f0; return k; } mlton-20210117+dfsg/runtime/gdtoa/strtoIg.c000066400000000000000000000072251416264345000204140ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers strtoIg(s00, se, fpi, exp, B, rvp) CONST char *s00; char **se; CONST FPI *fpi; Long *exp; Bigint **B; int *rvp; #else strtoIg(CONST char *s00, char **se, CONST FPI *fpi, Long *exp, Bigint **B, int *rvp) #endif { Bigint *b, *b1; int i, nb, nw, nw1, rv, rv1, swap; unsigned int nb1, nb11; Long e1; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif b = *B; rv = gdtoa__strtodg(s00, se, fpi, exp, b->x); if (!(rv & STRTOG_Inexact)) { B[1] = 0; return *rvp = rv; } e1 = exp[0]; rv1 = rv ^ STRTOG_Inexact; b1 = Balloc(b->k MTb); Bcopy(b1, b); nb = fpi->nbits; nb1 = nb & 31; nb11 = (nb1 - 1) & 31; nw = b->wds; nw1 = nw - 1; if (rv & STRTOG_Inexlo) { swap = 0; b1 = increment(b1 MTb); if ((rv & STRTOG_Retmask) == STRTOG_Zero) { if (fpi->sudden_underflow) { b1->x[0] = 0; b1->x[nw1] = 1L << nb11; rv1 += STRTOG_Normal - STRTOG_Zero; rv1 &= ~STRTOG_Underflow; goto swapcheck; } rv1 &= STRTOG_Inexlo | STRTOG_Underflow | STRTOG_Zero | STRTOG_Neg; rv1 |= STRTOG_Inexhi | STRTOG_Denormal; goto swapcheck; } if (b1->wds > nw || (nb1 && b1->x[nw1] & 1L << nb1)) { if (++e1 > fpi->emax) rv1 = STRTOG_Infinite | STRTOG_Inexhi; rshift(b1, 1); } else if ((rv & STRTOG_Retmask) == STRTOG_Denormal) { if (b1->x[nw1] & 1L << nb11) { rv1 += STRTOG_Normal - STRTOG_Denormal; rv1 &= ~STRTOG_Underflow; } } } else { swap = STRTOG_Neg; if ((rv & STRTOG_Retmask) == STRTOG_Infinite) { b1 = set_ones(b1, nb MTb); e1 = fpi->emax; rv1 = STRTOG_Normal | STRTOG_Inexlo | (rv & STRTOG_Neg); goto swapcheck; } decrement(b1); if ((rv & STRTOG_Retmask) == STRTOG_Denormal) { for(i = nw1; !b1->x[i]; --i) if (!i) { rv1 = STRTOG_Zero | STRTOG_Inexlo | (rv & STRTOG_Neg); break; } goto swapcheck; } if (!(b1->x[nw1] & 1L << nb11)) { if (e1 == fpi->emin) { if (fpi->sudden_underflow) rv1 += STRTOG_Zero - STRTOG_Normal; else rv1 += STRTOG_Denormal - STRTOG_Normal; rv1 |= STRTOG_Underflow; } else { b1 = lshift(b1, 1 MTb); b1->x[0] |= 1; --e1; } } } swapcheck: if (swap ^ (rv & STRTOG_Neg)) { rvp[0] = rv1; rvp[1] = rv; B[0] = b1; B[1] = b; exp[1] = exp[0]; exp[0] = e1; } else { rvp[0] = rv; rvp[1] = rv1; B[1] = b1; exp[1] = e1; } return rv; } mlton-20210117+dfsg/runtime/gdtoa/strtoIx.c000066400000000000000000000040061416264345000204270ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoIx(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else gdtoa__strtoIx(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; Long exp[2]; Bigint *B[2]; int k, rv[2]; UShort *L = (UShort *)a, *M = (UShort *)b; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(1 MTb); B[0]->wds = 2; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtox(L, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtox(M, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else { M[0] = L[0]; M[1] = L[1]; M[2] = L[2]; M[3] = L[3]; M[4] = L[4]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtoIxL.c000066400000000000000000000037511416264345000205510ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtoIxL(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else gdtoa__strtoIxL(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; Long exp[2]; Bigint *B[2]; int k, rv[2]; ULong *L = (ULong *)a, *M = (ULong *)b; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif B[0] = Balloc(1 MTb); B[0]->wds = 2; k = strtoIg(s, sp, &fpi, exp, B, rv); ULtoxL(L, B[0]->x, exp[0], rv[0]); Bfree(B[0] MTb); if (B[1]) { ULtoxL(M, B[1]->x, exp[1], rv[1]); Bfree(B[1] MTb); } else { M[0] = L[0]; M[1] = L[1]; M[2] = L[2]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtod.c000066400000000000000000000547771416264345000203160ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifndef NO_FENV_H #include #endif #ifdef USE_LOCALE #include #endif #ifdef IEEE_Arith #ifndef NO_IEEE_Scale #define Avoid_Underflow #undef tinytens /* The factor of 2^106 in tinytens[4] helps us avoid setting the underflow */ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */ static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 9007199254740992.*9007199254740992.e-256 }; #endif #endif #ifdef Honor_FLT_ROUNDS #undef Check_FLT_ROUNDS #define Check_FLT_ROUNDS #else #define Rounding Flt_Rounds #endif #ifdef Avoid_Underflow /*{*/ static double sulp #ifdef KR_headers (x, scale) U *x; int scale; #else (U *x, int scale) #endif { U u; double rv; int i; rv = ulp(x); if (!scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0) return rv; /* Is there an example where i <= 0 ? */ word0(&u) = Exp_1 + (i << Exp_shift); word1(&u) = 0; return rv * u.d; } #endif /*}*/ double gdtoa__strtod #ifdef KR_headers (s00, se) CONST char *s00; char **se; #else (CONST char *s00, char **se) #endif { #ifdef Avoid_Underflow int scale; #endif int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign, e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; CONST char *s, *s0, *s1; double aadj; Long L; U adj, aadj1, rv, rv0; ULong y, z; Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; #ifdef Avoid_Underflow ULong Lsb, Lsb1; #endif #ifdef SET_INEXACT int inexact, oldinexact; #endif #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif #ifdef USE_LOCALE /*{{*/ #ifdef NO_LOCALE_CACHE char *decimalpoint = localeconv()->decimal_point; int dplen = strlen(decimalpoint); #else char *decimalpoint; static char *decimalpoint_cache; static int dplen; if (!(s0 = decimalpoint_cache)) { s0 = localeconv()->decimal_point; if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { strcpy(decimalpoint_cache, s0); s0 = decimalpoint_cache; } dplen = strlen(s0); } decimalpoint = (char*)s0; #endif /*NO_LOCALE_CACHE*/ #else /*USE_LOCALE}{*/ #define dplen 1 #endif /*USE_LOCALE}}*/ #ifdef Honor_FLT_ROUNDS /*{*/ int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ #endif /*}*/ sign = nz0 = nz = decpt = 0; dval(&rv) = 0.; for(s = s00;;s++) switch(*s) { case '-': sign = 1; /* no break */ case '+': if (*++s) goto break2; /* no break */ case 0: goto ret0; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': continue; default: goto break2; } break2: if (*s == '0') { #ifndef NO_HEX_FP /*{*/ { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; Long exp; ULong bits[2]; switch(s[1]) { case 'x': case 'X': { #ifdef Honor_FLT_ROUNDS FPI fpi1 = fpi; fpi1.rounding = Rounding; #else #define fpi1 fpi #endif switch((i = gethex(&s, &fpi1, &exp, &bb, sign MTb)) & STRTOG_Retmask) { case STRTOG_NoNumber: s = s00; sign = 0; case STRTOG_Zero: break; default: if (bb) { copybits(bits, fpi.nbits, bb); Bfree(bb MTb); } ULtod(((U*)&rv)->L, bits, exp, i); }} goto ret; } } #endif /*}*/ nz0 = 1; while(*++s == '0') ; if (!*s) goto ret; } s0 = s; y = z = 0; for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) if (nd < 9) y = 10*y + c - '0'; else if (nd < DBL_DIG + 2) z = 10*z + c - '0'; nd0 = nd; #ifdef USE_LOCALE if (c == *decimalpoint) { for(i = 1; decimalpoint[i]; ++i) if (s[i] != decimalpoint[i]) goto dig_done; s += i; c = *s; #else if (c == '.') { c = *++s; #endif decpt = 1; if (!nd) { for(; c == '0'; c = *++s) nz++; if (c > '0' && c <= '9') { s0 = s; nf += nz; nz = 0; goto have_dig; } goto dig_done; } for(; c >= '0' && c <= '9'; c = *++s) { have_dig: nz++; if (c -= '0') { nf += nz; for(i = 1; i < nz; i++) if (nd++ < 9) y *= 10; else if (nd <= DBL_DIG + 2) z *= 10; if (nd++ < 9) y = 10*y + c; else if (nd <= DBL_DIG + 2) z = 10*z + c; nz = 0; } } }/*}*/ dig_done: e = 0; if (c == 'e' || c == 'E') { if (!nd && !nz && !nz0) { goto ret0; } s00 = s; esign = 0; switch(c = *++s) { case '-': esign = 1; case '+': c = *++s; } if (c >= '0' && c <= '9') { while(c == '0') c = *++s; if (c > '0' && c <= '9') { L = c - '0'; s1 = s; while((c = *++s) >= '0' && c <= '9') L = 10*L + c - '0'; if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents * so large that e might overflow. */ e = 19999; /* safe for 16 bit ints */ else e = (int)L; if (esign) e = -e; } else e = 0; } else s = s00; } if (!nd) { if (!nz && !nz0) { #ifdef INFNAN_CHECK /* Check for Nan and Infinity */ ULong bits[2]; static FPI fpinan = /* only 52 explicit bits */ { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; if (!decpt) switch(c) { case 'i': case 'I': if (match(&s,"nf")) { --s; if (!match(&s,"inity")) ++s; word0(&rv) = 0x7ff00000; word1(&rv) = 0; goto ret; } break; case 'n': case 'N': if (match(&s, "an")) { #ifndef No_Hex_NaN if (*s == '(' /*)*/ && hexnan(&s, &fpinan, bits) == STRTOG_NaNbits) { word0(&rv) = 0x7ff00000 | bits[1]; word1(&rv) = bits[0]; } else { #endif word0(&rv) = NAN_WORD0; word1(&rv) = NAN_WORD1; #ifndef No_Hex_NaN } #endif goto ret; } } #endif /* INFNAN_CHECK */ ret0: s = s00; sign = 0; } goto ret; } e1 = e -= nf; /* Now we have nd0 digits, starting at s0, followed by a * decimal point, followed by nd-nd0 digits. The number we're * after is the integer represented by those digits times * 10**e */ if (!nd0) nd0 = nd; k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2; dval(&rv) = y; if (k > 9) { #ifdef SET_INEXACT if (k > DBL_DIG) oldinexact = get_inexact(); #endif dval(&rv) = tens[k - 9] * dval(&rv) + z; } bd0 = 0; if (nd <= DBL_DIG #ifndef RND_PRODQUOT #ifndef Honor_FLT_ROUNDS && Flt_Rounds == 1 #endif #endif ) { if (!e) goto ret; #ifndef ROUND_BIASED_without_Round_Up if (e > 0) { if (e <= Ten_pmax) { #ifdef VAX goto vax_ovfl_check; #else #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif /* rv = */ rounded_product(dval(&rv), tens[e]); goto ret; #endif } i = DBL_DIG - nd; if (e <= Ten_pmax + i) { /* A fancier test would sometimes let us do * this for larger i values. */ #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif e -= i; dval(&rv) *= tens[i]; #ifdef VAX /* VAX exponent range is so narrow we must * worry about overflow here... */ vax_ovfl_check: word0(&rv) -= P*Exp_msk1; /* rv = */ rounded_product(dval(&rv), tens[e]); if ((word0(&rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) goto ovfl; word0(&rv) += P*Exp_msk1; #else /* rv = */ rounded_product(dval(&rv), tens[e]); #endif goto ret; } } #ifndef Inaccurate_Divide else if (e >= -Ten_pmax) { #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif /* rv = */ rounded_quotient(dval(&rv), tens[-e]); goto ret; } #endif #endif /* ROUND_BIASED_without_Round_Up */ } e1 += nd - k; #ifdef IEEE_Arith #ifdef SET_INEXACT inexact = 1; if (k <= DBL_DIG) oldinexact = get_inexact(); #endif #ifdef Avoid_Underflow scale = 0; #endif #ifdef Honor_FLT_ROUNDS if (Rounding >= 2) { if (sign) Rounding = Rounding == 2 ? 0 : 2; else if (Rounding != 2) Rounding = 0; } #endif #endif /*IEEE_Arith*/ /* Get starting approximation = rv * 10**e1 */ if (e1 > 0) { if ( (i = e1 & 15) !=0) dval(&rv) *= tens[i]; if (e1 &= ~15) { if (e1 > DBL_MAX_10_EXP) { ovfl: /* Can't trust HUGE_VAL */ #ifdef IEEE_Arith #ifdef Honor_FLT_ROUNDS switch(Rounding) { case 0: /* toward 0 */ case 3: /* toward -infinity */ word0(&rv) = Big0; word1(&rv) = Big1; break; default: word0(&rv) = Exp_mask; word1(&rv) = 0; } #else /*Honor_FLT_ROUNDS*/ word0(&rv) = Exp_mask; word1(&rv) = 0; #endif /*Honor_FLT_ROUNDS*/ #ifdef SET_INEXACT /* set overflow bit */ dval(&rv0) = 1e300; dval(&rv0) *= dval(&rv0); #endif #else /*IEEE_Arith*/ word0(&rv) = Big0; word1(&rv) = Big1; #endif /*IEEE_Arith*/ range_err: if (bd0) { Bfree(bb MTb); Bfree(bd MTb); Bfree(bs MTb); Bfree(bd0 MTb); Bfree(delta MTb); } #ifndef NO_ERRNO errno = ERANGE; #endif goto ret; } e1 >>= 4; for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= bigtens[j]; /* The last multiplication could overflow. */ word0(&rv) -= P*Exp_msk1; dval(&rv) *= bigtens[j]; if ((z = word0(&rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-P)) goto ovfl; if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { /* set to largest number */ /* (Can't trust DBL_MAX) */ word0(&rv) = Big0; word1(&rv) = Big1; } else word0(&rv) += P*Exp_msk1; } } else if (e1 < 0) { e1 = -e1; if ( (i = e1 & 15) !=0) dval(&rv) /= tens[i]; if (e1 >>= 4) { if (e1 >= 1 << n_bigtens) goto undfl; #ifdef Avoid_Underflow if (e1 & Scale_Bit) scale = 2*P; for(j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= tinytens[j]; if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) { /* scaled rv is denormal; zap j low bits */ if (j >= 32) { word1(&rv) = 0; if (j >= 53) word0(&rv) = (P+2)*Exp_msk1; else word0(&rv) &= 0xffffffff << (j-32); } else word1(&rv) &= 0xffffffff << j; } #else for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= tinytens[j]; /* The last multiplication could underflow. */ dval(&rv0) = dval(&rv); dval(&rv) *= tinytens[j]; if (!dval(&rv)) { dval(&rv) = 2.*dval(&rv0); dval(&rv) *= tinytens[j]; #endif if (!dval(&rv)) { undfl: dval(&rv) = 0.; #ifdef Honor_FLT_ROUNDS if (Rounding == 2) word1(&rv) = 1; #endif goto range_err; } #ifndef Avoid_Underflow word0(&rv) = Tiny0; word1(&rv) = Tiny1; /* The refinement below will clean * this approximation up. */ } #endif } } /* Now the hard part -- adjusting rv to the correct value.*/ /* Put digits into bd: true value = bd * 10^e */ bd0 = s2b(s0, nd0, nd, y, dplen MTb); for(;;) { bd = Balloc(bd0->k MTb); Bcopy(bd, bd0); bb = d2b(dval(&rv), &bbe, &bbbits MTb); /* rv = bb * 2^bbe */ bs = i2b(1 MTb); if (e >= 0) { bb2 = bb5 = 0; bd2 = bd5 = e; } else { bb2 = bb5 = -e; bd2 = bd5 = 0; } if (bbe >= 0) bb2 += bbe; else bd2 -= bbe; bs2 = bb2; #ifdef Honor_FLT_ROUNDS if (Rounding != 1) bs2++; #endif #ifdef Avoid_Underflow Lsb = LSB; Lsb1 = 0; j = bbe - scale; i = j + bbbits - 1; /* logb(rv) */ j = P + 1 - bbbits; if (i < Emin) { /* denormal */ i = Emin - i; j -= i; if (i < 32) Lsb <<= i; else Lsb1 = Lsb << (i-32); } #else /*Avoid_Underflow*/ #ifdef Sudden_Underflow #ifdef IBM j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); #else j = P + 1 - bbbits; #endif #else /*Sudden_Underflow*/ j = bbe; i = j + bbbits - 1; /* logb(&rv) */ if (i < Emin) /* denormal */ j += P - Emin; else j = P + 1 - bbbits; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ bb2 += j; bd2 += j; #ifdef Avoid_Underflow bd2 += scale; #endif i = bb2 < bd2 ? bb2 : bd2; if (i > bs2) i = bs2; if (i > 0) { bb2 -= i; bd2 -= i; bs2 -= i; } if (bb5 > 0) { bs = pow5mult(bs, bb5 MTb); bb1 = mult(bs, bb MTb); Bfree(bb MTb); bb = bb1; } if (bb2 > 0) bb = lshift(bb, bb2 MTb); if (bd5 > 0) bd = pow5mult(bd, bd5 MTb); if (bd2 > 0) bd = lshift(bd, bd2 MTb); if (bs2 > 0) bs = lshift(bs, bs2 MTb); delta = diff(bb, bd MTb); dsign = delta->sign; delta->sign = 0; i = cmp(delta, bs); #ifdef Honor_FLT_ROUNDS if (Rounding != 1) { if (i < 0) { /* Error is less than an ulp */ if (!delta->x[0] && delta->wds <= 1) { /* exact */ #ifdef SET_INEXACT inexact = 0; #endif break; } if (Rounding) { if (dsign) { dval(&adj) = 1.; goto apply_adj; } } else if (!dsign) { dval(&adj) = -1.; if (!word1(&rv) && !(word0(&rv) & Frac_mask)) { y = word0(&rv) & Exp_mask; #ifdef Avoid_Underflow if (!scale || y > 2*P*Exp_msk1) #else if (y) #endif { delta = lshift(delta,Log2P MTb); if (cmp(delta, bs) <= 0) dval(&adj) = -0.5; } } apply_adj: #ifdef Avoid_Underflow if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) word0(&adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { word0(&rv) += P*Exp_msk1; dval(&rv) += adj*ulp(&rv); word0(&rv) -= P*Exp_msk1; } else #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ dval(&rv) += adj.d*ulp(&rv); } break; } dval(&adj) = ratio(delta, bs); if (adj.d < 1.) dval(&adj) = 1.; if (adj.d <= 0x7ffffffe) { /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */ y = adj.d; if (y != adj.d) { if (!((Rounding>>1) ^ dsign)) y++; dval(&adj) = y; } } #ifdef Avoid_Underflow if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) word0(&adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { word0(&rv) += P*Exp_msk1; dval(&adj) *= ulp(&rv); if (dsign) dval(&rv) += adj; else dval(&rv) -= adj; word0(&rv) -= P*Exp_msk1; goto cont; } #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ dval(&adj) *= ulp(&rv); if (dsign) { if (word0(&rv) == Big0 && word1(&rv) == Big1) goto ovfl; dval(&rv) += adj.d; } else dval(&rv) -= adj.d; goto cont; } #endif /*Honor_FLT_ROUNDS*/ if (i < 0) { /* Error is less than half an ulp -- check for * special case of mantissa a power of two. */ if (dsign || word1(&rv) || word0(&rv) & Bndry_mask #ifdef IEEE_Arith #ifdef Avoid_Underflow || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 #else || (word0(&rv) & Exp_mask) <= Exp_msk1 #endif #endif ) { #ifdef SET_INEXACT if (!delta->x[0] && delta->wds <= 1) inexact = 0; #endif break; } if (!delta->x[0] && delta->wds <= 1) { /* exact result */ #ifdef SET_INEXACT inexact = 0; #endif break; } delta = lshift(delta,Log2P MTb); if (cmp(delta, bs) > 0) goto drop_down; break; } if (i == 0) { /* exactly half-way between */ if (dsign) { if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 && word1(&rv) == ( #ifdef Avoid_Underflow (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : #endif 0xffffffff)) { /*boundary case -- increment exponent*/ if (word0(&rv) == Big0 && word1(&rv) == Big1) goto ovfl; word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1 #ifdef IBM | Exp_msk1 >> 4 #endif ; word1(&rv) = 0; #ifdef Avoid_Underflow dsign = 0; #endif break; } } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { drop_down: /* boundary case -- decrement exponent */ #ifdef Sudden_Underflow /*{{*/ L = word0(&rv) & Exp_mask; #ifdef IBM if (L < Exp_msk1) #else #ifdef Avoid_Underflow if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) #else if (L <= Exp_msk1) #endif /*Avoid_Underflow*/ #endif /*IBM*/ goto undfl; L -= Exp_msk1; #else /*Sudden_Underflow}{*/ #ifdef Avoid_Underflow if (scale) { L = word0(&rv) & Exp_mask; if (L <= (2*P+1)*Exp_msk1) { if (L > (P+2)*Exp_msk1) /* round even ==> */ /* accept rv */ break; /* rv = smallest denormal */ goto undfl; } } #endif /*Avoid_Underflow*/ L = (word0(&rv) & Exp_mask) - Exp_msk1; #endif /*Sudden_Underflow}}*/ word0(&rv) = L | Bndry_mask1; word1(&rv) = 0xffffffff; #ifdef IBM goto cont; #else break; #endif } #ifndef ROUND_BIASED #ifdef Avoid_Underflow if (Lsb1) { if (!(word0(&rv) & Lsb1)) break; } else if (!(word1(&rv) & Lsb)) break; #else if (!(word1(&rv) & LSB)) break; #endif #endif if (dsign) #ifdef Avoid_Underflow dval(&rv) += sulp(&rv, scale); #else dval(&rv) += ulp(&rv); #endif #ifndef ROUND_BIASED else { #ifdef Avoid_Underflow dval(&rv) -= sulp(&rv, scale); #else dval(&rv) -= ulp(&rv); #endif #ifndef Sudden_Underflow if (!dval(&rv)) goto undfl; #endif } #ifdef Avoid_Underflow dsign = 1 - dsign; #endif #endif break; } if ((aadj = ratio(delta, bs)) <= 2.) { if (dsign) aadj = dval(&aadj1) = 1.; else if (word1(&rv) || word0(&rv) & Bndry_mask) { #ifndef Sudden_Underflow if (word1(&rv) == Tiny1 && !word0(&rv)) goto undfl; #endif aadj = 1.; dval(&aadj1) = -1.; } else { /* special case -- power of FLT_RADIX to be */ /* rounded down... */ if (aadj < 2./FLT_RADIX) aadj = 1./FLT_RADIX; else aadj *= 0.5; dval(&aadj1) = -aadj; } } else { aadj *= 0.5; dval(&aadj1) = dsign ? aadj : -aadj; #ifdef Check_FLT_ROUNDS switch(Rounding) { case 2: /* towards +infinity */ dval(&aadj1) -= 0.5; break; case 0: /* towards 0 */ case 3: /* towards -infinity */ dval(&aadj1) += 0.5; } #else if (Flt_Rounds == 0) dval(&aadj1) += 0.5; #endif /*Check_FLT_ROUNDS*/ } y = word0(&rv) & Exp_mask; /* Check for overflow */ if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { dval(&rv0) = dval(&rv); word0(&rv) -= P*Exp_msk1; dval(&adj) = dval(&aadj1) * ulp(&rv); dval(&rv) += dval(&adj); if ((word0(&rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(&rv0) == Big0 && word1(&rv0) == Big1) goto ovfl; word0(&rv) = Big0; word1(&rv) = Big1; goto cont; } else word0(&rv) += P*Exp_msk1; } else { #ifdef Avoid_Underflow if (scale && y <= 2*P*Exp_msk1) { if (aadj <= 0x7fffffff) { if ((z = aadj) <= 0) z = 1; aadj = z; dval(&aadj1) = dsign ? aadj : -aadj; } word0(&aadj1) += (2*P+1)*Exp_msk1 - y; } dval(&adj) = dval(&aadj1) * ulp(&rv); dval(&rv) += dval(&adj); #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { dval(&rv0) = dval(&rv); word0(&rv) += P*Exp_msk1; dval(&adj) = dval(&aadj1) * ulp(&rv); dval(&rv) += adj; #ifdef IBM if ((word0(&rv) & Exp_mask) < P*Exp_msk1) #else if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) #endif { if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1) goto undfl; word0(&rv) = Tiny0; word1(&rv) = Tiny1; goto cont; } else word0(&rv) -= P*Exp_msk1; } else { dval(&adj) = dval(&aadj1) * ulp(&rv); dval(&rv) += adj; } #else /*Sudden_Underflow*/ /* Compute dval(&adj) so that the IEEE rounding rules will * correctly round rv + dval(&adj) in some half-way cases. * If rv * ulp(&rv) is denormalized (i.e., * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid * trouble from bits lost to denormalization; * example: 1.2e-307 . */ if (y <= (P-1)*Exp_msk1 && aadj > 1.) { dval(&aadj1) = (double)(int)(aadj + 0.5); if (!dsign) dval(&aadj1) = -dval(&aadj1); } dval(&adj) = dval(&aadj1) * ulp(&rv); dval(&rv) += adj; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ } z = word0(&rv) & Exp_mask; #ifndef SET_INEXACT #ifdef Avoid_Underflow if (!scale) #endif if (y == z) { /* Can we stop now? */ L = (Long)aadj; aadj -= L; /* The tolerances below are conservative. */ if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { if (aadj < .4999999 || aadj > .5000001) break; } else if (aadj < .4999999/FLT_RADIX) break; } #endif cont: Bfree(bb MTb); Bfree(bd MTb); Bfree(bs MTb); Bfree(delta MTb); } Bfree(bb MTb); Bfree(bd MTb); Bfree(bs MTb); Bfree(bd0 MTb); Bfree(delta MTb); #ifdef SET_INEXACT if (inexact) { if (!oldinexact) { word0(&rv0) = Exp_1 + (70 << Exp_shift); word1(&rv0) = 0; dval(&rv0) += 1.; } } else if (!oldinexact) clear_inexact(); #endif #ifdef Avoid_Underflow if (scale) { word0(&rv0) = Exp_1 - 2*P*Exp_msk1; word1(&rv0) = 0; dval(&rv) *= dval(&rv0); #ifndef NO_ERRNO /* try to avoid the bug of testing an 8087 register value */ #ifdef IEEE_Arith if (!(word0(&rv) & Exp_mask)) #else if (word0(&rv) == 0 && word1(&rv) == 0) #endif errno = ERANGE; #endif } #endif /* Avoid_Underflow */ #ifdef SET_INEXACT if (inexact && !(word0(&rv) & Exp_mask)) { /* set underflow bit */ dval(&rv0) = 1e-300; dval(&rv0) *= dval(&rv0); } #endif ret: if (se) *se = (char *)s; return sign ? -dval(&rv) : dval(&rv); } mlton-20210117+dfsg/runtime/gdtoa/strtodI.c000066400000000000000000000077151416264345000204150ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" static double #ifdef KR_headers ulpdown(d) U *d; #else ulpdown(U *d) #endif { double u; ULong *L = d->L; u = ulp(d); if (!(L[_1] | (L[_0] & 0xfffff)) && (L[_0] & 0x7ff00000) > 0x00100000) u *= 0.5; return u; } int #ifdef KR_headers gdtoa__strtodI(s, sp, dd) CONST char *s; char **sp; double *dd; #else gdtoa__strtodI(CONST char *s, char **sp, double *dd) #endif { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; ULong bits[2], sign; Long exp; int j, k; U *u; k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); u = (U*)dd; sign = k & STRTOG_Neg ? 0x80000000L : 0; switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: dval(&u[0]) = dval(&u[1]) = 0.; break; case STRTOG_Zero: dval(&u[0]) = dval(&u[1]) = 0.; #ifdef Sudden_Underflow if (k & STRTOG_Inexact) { if (sign) word0(&u[0]) = 0x80100000L; else word0(&u[1]) = 0x100000L; } break; #else goto contain; #endif case STRTOG_Denormal: word1(&u[0]) = bits[0]; word0(&u[0]) = bits[1]; goto contain; case STRTOG_Normal: word1(&u[0]) = bits[0]; word0(&u[0]) = (bits[1] & ~0x100000) | ((exp + 0x3ff + 52) << 20); contain: j = k & STRTOG_Inexact; if (sign) { word0(&u[0]) |= sign; j = STRTOG_Inexact - j; } switch(j) { case STRTOG_Inexlo: #ifdef Sudden_Underflow if ((u->L[_0] & 0x7ff00000) < 0x3500000) { word0(&u[1]) = word0(&u[0]) + 0x3500000; word1(&u[1]) = word1(&u[0]); dval(&u[1]) += ulp(&u[1]); word0(&u[1]) -= 0x3500000; if (!(word0(&u[1]) & 0x7ff00000)) { word0(&u[1]) = sign; word1(&u[1]) = 0; } } else #endif dval(&u[1]) = dval(&u[0]) + ulp(&u[0]); break; case STRTOG_Inexhi: dval(&u[1]) = dval(&u[0]); #ifdef Sudden_Underflow if ((word0(&u[0]) & 0x7ff00000) < 0x3500000) { word0(&u[0]) += 0x3500000; dval(&u[0]) -= ulpdown(u); word0(&u[0]) -= 0x3500000; if (!(word0(&u[0]) & 0x7ff00000)) { word0(&u[0]) = sign; word1(&u[0]) = 0; } } else #endif dval(&u[0]) -= ulpdown(u); break; default: dval(&u[1]) = dval(&u[0]); } break; case STRTOG_Infinite: word0(&u[0]) = word0(&u[1]) = sign | 0x7ff00000; word1(&u[0]) = word1(&u[1]) = 0; if (k & STRTOG_Inexact) { if (sign) { word0(&u[1]) = 0xffefffffL; word1(&u[1]) = 0xffffffffL; } else { word0(&u[0]) = 0x7fefffffL; word1(&u[0]) = 0xffffffffL; } } break; case STRTOG_NaN: u->L[0] = (u+1)->L[0] = d_QNAN0; u->L[1] = (u+1)->L[1] = d_QNAN1; break; case STRTOG_NaNbits: word0(&u[0]) = word0(&u[1]) = 0x7ff00000 | sign | bits[1]; word1(&u[0]) = word1(&u[1]) = bits[0]; } return k; } mlton-20210117+dfsg/runtime/gdtoa/strtodg.c000066400000000000000000000526611416264345000204530ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #ifdef USE_LOCALE #include #endif static CONST int fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52 #ifdef VAX , 54, 56 #endif }; Bigint * #ifdef KR_headers increment(b MTa) Bigint *b; MTk #else increment(Bigint *b MTd) #endif { ULong *x, *xe; Bigint *b1; #ifdef Pack_16 ULong carry = 1, y; #endif x = b->x; xe = x + b->wds; #ifdef Pack_32 do { if (*x < (ULong)0xffffffffL) { ++*x; return b; } *x++ = 0; } while(x < xe); #else do { y = *x + carry; carry = y >> 16; *x++ = y & 0xffff; if (!carry) return b; } while(x < xe); if (carry) #endif { if (b->wds >= b->maxwds) { b1 = Balloc(b->k+1 MTa); Bcopy(b1,b); Bfree(b MTa); b = b1; } b->x[b->wds++] = 1; } return b; } void #ifdef KR_headers decrement(b) Bigint *b; #else decrement(Bigint *b) #endif { ULong *x, *xe; #ifdef Pack_16 ULong borrow = 1, y; #endif x = b->x; xe = x + b->wds; #ifdef Pack_32 do { if (*x) { --*x; break; } *x++ = 0xffffffffL; } while(x < xe); #else do { y = *x - borrow; borrow = (y & 0x10000) >> 16; *x++ = y & 0xffff; } while(borrow && x < xe); #endif } static int #ifdef KR_headers all_on(b, n) Bigint *b; int n; #else all_on(Bigint *b, int n) #endif { ULong *x, *xe; x = b->x; xe = x + (n >> kshift); while(x < xe) if ((*x++ & ALL_ON) != ALL_ON) return 0; if (n &= kmask) return ((*x | (ALL_ON << n)) & ALL_ON) == ALL_ON; return 1; } Bigint * #ifdef KR_headers set_ones(b, n MTa) Bigint *b; int n; MTk #else set_ones(Bigint *b, int n MTd) #endif { int k; ULong *x, *xe; k = (n + ((1 << kshift) - 1)) >> kshift; if (b->k < k) { Bfree(b MTa); b = Balloc(k MTa); } k = n >> kshift; if (n &= kmask) k++; b->wds = k; x = b->x; xe = x + k; while(x < xe) *x++ = ALL_ON; if (n) x[-1] >>= ULbits - n; return b; } static int rvOK #ifdef KR_headers (d, fpi, exp, bits, exact, rd, irv MTa) U *d; CONST FPI *fpi; Long *exp; ULong *bits; int exact, rd, *irv; MTk #else (U *d, CONST FPI *fpi, Long *exp, ULong *bits, int exact, int rd, int *irv MTd) #endif { Bigint *b; ULong carry, inex, lostbits; int bdif, e, j, k, k1, nb, rv; carry = rv = 0; b = d2b(dval(d), &e, &bdif MTa); bdif -= nb = fpi->nbits; e += bdif; if (bdif <= 0) { if (exact) goto trunc; goto ret; } if (P == nb) { if ( #ifndef IMPRECISE_INEXACT exact && #endif fpi->rounding == #ifdef RND_PRODQUOT FPI_Round_near #else Flt_Rounds #endif ) goto trunc; goto ret; } switch(rd) { case 1: /* round down (toward -Infinity) */ goto trunc; case 2: /* round up (toward +Infinity) */ break; default: /* round near */ k = bdif - 1; if (k < 0) goto trunc; if (!k) { if (!exact) goto ret; if (b->x[0] & 2) break; goto trunc; } if (b->x[k>>kshift] & ((ULong)1 << (k & kmask))) break; goto trunc; } /* "break" cases: round up 1 bit, then truncate; bdif > 0 */ carry = 1; trunc: inex = lostbits = 0; if (bdif > 0) { if ( (lostbits = any_on(b, bdif)) !=0) inex = STRTOG_Inexlo; rshift(b, bdif); if (carry) { inex = STRTOG_Inexhi; b = increment(b MTa); if ( (j = nb & kmask) !=0) j = ULbits - j; if (hi0bits(b->x[b->wds - 1]) != j) { if (!lostbits) lostbits = b->x[0] & 1; rshift(b, 1); e++; } } } else if (bdif < 0) b = lshift(b, -bdif MTa); if (e < fpi->emin) { k = fpi->emin - e; e = fpi->emin; if (k > nb || fpi->sudden_underflow) { b->wds = inex = 0; *irv = STRTOG_Underflow | STRTOG_Inexlo; } else { k1 = k - 1; if (k1 > 0 && !lostbits) lostbits = any_on(b, k1); if (!lostbits && !exact) goto ret; lostbits |= carry = b->x[k1>>kshift] & (1 << (k1 & kmask)); rshift(b, k); *irv = STRTOG_Denormal; if (carry) { b = increment(b MTa); inex = STRTOG_Inexhi | STRTOG_Underflow; } else if (lostbits) inex = STRTOG_Inexlo | STRTOG_Underflow; } } else if (e > fpi->emax) { e = fpi->emax + 1; *irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; #ifndef NO_ERRNO errno = ERANGE; #endif b->wds = inex = 0; } *exp = e; copybits(bits, nb, b); *irv |= inex; rv = 1; ret: Bfree(b MTa); return rv; } static int #ifdef KR_headers mantbits(d) U *d; #else mantbits(U *d) #endif { ULong L; #ifdef VAX L = word1(d) << 16 | word1(d) >> 16; if (L) #else if ( (L = word1(d)) !=0) #endif return P - lo0bits(&L); #ifdef VAX L = word0(d) << 16 | word0(d) >> 16 | Exp_msk11; #else L = word0(d) | Exp_msk1; #endif return P - 32 - lo0bits(&L); } int gdtoa__strtodg #ifdef KR_headers (s00, se, fpi, exp, bits) CONST char *s00; char **se; CONST FPI *fpi; Long *exp; ULong *bits; #else (CONST char *s00, char **se, CONST FPI *fpi, Long *exp, ULong *bits) #endif { int abe, abits, asub; int bb0, bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, denorm; int dsign, e, e1, e2, emin, esign, finished, i, inex, irv, j, k; int nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign; int sudden_underflow; CONST char *s, *s0, *s1; double adj0, tol; Long L; U adj, rv; ULong *b, *be, y, z; Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0; #ifdef MULTIPLE_THREADS ThInfo *TI = 0; #endif #ifdef USE_LOCALE /*{{*/ #ifdef NO_LOCALE_CACHE char *decimalpoint = localeconv()->decimal_point; int dplen = strlen(decimalpoint); #else char *decimalpoint; static char *decimalpoint_cache; static int dplen; if (!(s0 = decimalpoint_cache)) { s0 = localeconv()->decimal_point; if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { strcpy(decimalpoint_cache, s0); s0 = decimalpoint_cache; } dplen = strlen(s0); } decimalpoint = (char*)s0; #endif /*NO_LOCALE_CACHE*/ #else /*USE_LOCALE}{*/ #define dplen 1 #endif /*USE_LOCALE}}*/ irv = STRTOG_Zero; denorm = sign = nz0 = nz = 0; dval(&rv) = 0.; rvb = 0; nbits = fpi->nbits; for(s = s00;;s++) switch(*s) { case '-': sign = 1; /* no break */ case '+': if (*++s) goto break2; /* no break */ case 0: sign = 0; irv = STRTOG_NoNumber; s = s00; goto ret; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': continue; default: goto break2; } break2: if (*s == '0') { #ifndef NO_HEX_FP switch(s[1]) { case 'x': case 'X': irv = gethex(&s, fpi, exp, &rvb, sign MTb); if (irv == STRTOG_NoNumber) { s = s00; sign = 0; } goto ret; } #endif nz0 = 1; while(*++s == '0') ; if (!*s) goto ret; } sudden_underflow = fpi->sudden_underflow; s0 = s; y = z = 0; for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) if (nd < 9) y = 10*y + c - '0'; else if (nd < DBL_DIG + 2) z = 10*z + c - '0'; nd0 = nd; #ifdef USE_LOCALE if (c == *decimalpoint) { for(i = 1; decimalpoint[i]; ++i) if (s[i] != decimalpoint[i]) goto dig_done; s += i; c = *s; #else if (c == '.') { c = *++s; #endif decpt = 1; if (!nd) { for(; c == '0'; c = *++s) nz++; if (c > '0' && c <= '9') { s0 = s; nf += nz; nz = 0; goto have_dig; } goto dig_done; } for(; c >= '0' && c <= '9'; c = *++s) { have_dig: nz++; if (c -= '0') { nf += nz; for(i = 1; i < nz; i++) if (nd++ < 9) y *= 10; else if (nd <= DBL_DIG + 2) z *= 10; if (nd++ < 9) y = 10*y + c; else if (nd <= DBL_DIG + 2) z = 10*z + c; nz = 0; } } }/*}*/ dig_done: e = 0; if (c == 'e' || c == 'E') { if (!nd && !nz && !nz0) { irv = STRTOG_NoNumber; s = s00; goto ret; } s00 = s; esign = 0; switch(c = *++s) { case '-': esign = 1; case '+': c = *++s; } if (c >= '0' && c <= '9') { while(c == '0') c = *++s; if (c > '0' && c <= '9') { L = c - '0'; s1 = s; while((c = *++s) >= '0' && c <= '9') L = 10*L + c - '0'; if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents * so large that e might overflow. */ e = 19999; /* safe for 16 bit ints */ else e = (int)L; if (esign) e = -e; } else e = 0; } else s = s00; } if (!nd) { if (!nz && !nz0) { #ifdef INFNAN_CHECK /* Check for Nan and Infinity */ if (!decpt) switch(c) { case 'i': case 'I': if (match(&s,"nf")) { --s; if (!match(&s,"inity")) ++s; irv = STRTOG_Infinite; goto infnanexp; } break; case 'n': case 'N': if (match(&s, "an")) { irv = STRTOG_NaN; *exp = fpi->emax + 1; #ifndef No_Hex_NaN if (*s == '(') /*)*/ irv = hexnan(&s, fpi, bits); #endif goto infnanexp; } } #endif /* INFNAN_CHECK */ irv = STRTOG_NoNumber; s = s00; } goto ret; } irv = STRTOG_Normal; e1 = e -= nf; rd = 0; switch(fpi->rounding & 3) { case FPI_Round_up: rd = 2 - sign; break; case FPI_Round_zero: rd = 1; break; case FPI_Round_down: rd = 1 + sign; } /* Now we have nd0 digits, starting at s0, followed by a * decimal point, followed by nd-nd0 digits. The number we're * after is the integer represented by those digits times * 10**e */ if (!nd0) nd0 = nd; k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2; dval(&rv) = y; if (k > 9) dval(&rv) = tens[k - 9] * dval(&rv) + z; bd0 = 0; if (nbits <= P && nd <= DBL_DIG) { if (!e) { if (rvOK(&rv, fpi, exp, bits, 1, rd, &irv MTb)) goto ret; } else if (e > 0) { if (e <= Ten_pmax) { #ifdef VAX goto vax_ovfl_check; #else i = fivesbits[e] + mantbits(&rv) <= P; /* rv = */ rounded_product(dval(&rv), tens[e]); if (rvOK(&rv, fpi, exp, bits, i, rd, &irv MTb)) goto ret; e1 -= e; goto rv_notOK; #endif } i = DBL_DIG - nd; if (e <= Ten_pmax + i) { /* A fancier test would sometimes let us do * this for larger i values. */ e2 = e - i; e1 -= i; dval(&rv) *= tens[i]; #ifdef VAX /* VAX exponent range is so narrow we must * worry about overflow here... */ vax_ovfl_check: dval(&adj) = dval(&rv); word0(&adj) -= P*Exp_msk1; /* adj = */ rounded_product(dval(&adj), tens[e2]); if ((word0(&adj) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) goto rv_notOK; word0(&adj) += P*Exp_msk1; dval(&rv) = dval(&adj); #else /* rv = */ rounded_product(dval(&rv), tens[e2]); #endif if (rvOK(&rv, fpi, exp, bits, 0, rd, &irv MTb)) goto ret; e1 -= e2; } } #ifndef Inaccurate_Divide else if (e >= -Ten_pmax) { /* rv = */ rounded_quotient(dval(&rv), tens[-e]); if (rvOK(&rv, fpi, exp, bits, 0, rd, &irv MTb)) goto ret; e1 -= e; } #endif } rv_notOK: e1 += nd - k; /* Get starting approximation = rv * 10**e1 */ e2 = 0; if (e1 > 0) { if ( (i = e1 & 15) !=0) dval(&rv) *= tens[i]; if (e1 &= ~15) { e1 >>= 4; while(e1 >= (1 << (n_bigtens-1))) { e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; word0(&rv) &= ~Exp_mask; word0(&rv) |= Bias << Exp_shift1; dval(&rv) *= bigtens[n_bigtens-1]; e1 -= 1 << (n_bigtens-1); } e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; word0(&rv) &= ~Exp_mask; word0(&rv) |= Bias << Exp_shift1; for(j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= bigtens[j]; } } else if (e1 < 0) { e1 = -e1; if ( (i = e1 & 15) !=0) dval(&rv) /= tens[i]; if (e1 &= ~15) { e1 >>= 4; while(e1 >= (1 << (n_bigtens-1))) { e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; word0(&rv) &= ~Exp_mask; word0(&rv) |= Bias << Exp_shift1; dval(&rv) *= tinytens[n_bigtens-1]; e1 -= 1 << (n_bigtens-1); } e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; word0(&rv) &= ~Exp_mask; word0(&rv) |= Bias << Exp_shift1; for(j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= tinytens[j]; } } #ifdef IBM /* e2 is a correction to the (base 2) exponent of the return * value, reflecting adjustments above to avoid overflow in the * native arithmetic. For native IBM (base 16) arithmetic, we * must multiply e2 by 4 to change from base 16 to 2. */ e2 <<= 2; #endif rvb = d2b(dval(&rv), &rve, &rvbits MTb); /* rv = rvb * 2^rve */ rve += e2; if ((j = rvbits - nbits) > 0) { rshift(rvb, j); rvbits = nbits; rve += j; } bb0 = 0; /* trailing zero bits in rvb */ e2 = rve + rvbits - nbits; if (e2 > fpi->emax + 1) goto huge; rve1 = rve + rvbits - nbits; if (e2 < (emin = fpi->emin)) { denorm = 1; j = rve - emin; if (j > 0) { rvb = lshift(rvb, j MTb); rvbits += j; } else if (j < 0) { rvbits += j; if (rvbits <= 0) { if (rvbits < -1) { ufl: rvb->wds = 0; rvb->x[0] = 0; switch(fpi->rounding) { case FPI_Round_up: if (!sign) goto ret_tiny; break; case FPI_Round_down: if (sign) { ret_tiny: rvb->wds = rvb->x[0] = 1; } } *exp = emin; irv = STRTOG_Underflow | STRTOG_Inexlo; goto ret; } rvb->x[0] = rvb->wds = rvbits = 1; } else rshift(rvb, -j); } rve = rve1 = emin; if (sudden_underflow && e2 + 1 < emin) goto ufl; } /* Now the hard part -- adjusting rv to the correct value.*/ /* Put digits into bd: true value = bd * 10^e */ bd0 = s2b(s0, nd0, nd, y, dplen MTb); for(;;) { bd = Balloc(bd0->k MTb); Bcopy(bd, bd0); bb = Balloc(rvb->k MTb); Bcopy(bb, rvb); bbbits = rvbits - bb0; bbe = rve + bb0; bs = i2b(1 MTb); if (e >= 0) { bb2 = bb5 = 0; bd2 = bd5 = e; } else { bb2 = bb5 = -e; bd2 = bd5 = 0; } if (bbe >= 0) bb2 += bbe; else bd2 -= bbe; bs2 = bb2; j = nbits + 1 - bbbits; i = bbe + bbbits - nbits; if (i < emin) /* denormal */ j += i - emin; bb2 += j; bd2 += j; i = bb2 < bd2 ? bb2 : bd2; if (i > bs2) i = bs2; if (i > 0) { bb2 -= i; bd2 -= i; bs2 -= i; } if (bb5 > 0) { bs = pow5mult(bs, bb5 MTb); bb1 = mult(bs, bb MTb); Bfree(bb MTb); bb = bb1; } bb2 -= bb0; if (bb2 > 0) bb = lshift(bb, bb2 MTb); else if (bb2 < 0) rshift(bb, -bb2); if (bd5 > 0) bd = pow5mult(bd, bd5 MTb); if (bd2 > 0) bd = lshift(bd, bd2 MTb); if (bs2 > 0) bs = lshift(bs, bs2 MTb); asub = 1; inex = STRTOG_Inexhi; delta = diff(bb, bd MTb); if (delta->wds <= 1 && !delta->x[0]) break; dsign = delta->sign; delta->sign = finished = 0; L = 0; i = cmp(delta, bs); if (rd && i <= 0) { irv = STRTOG_Normal; if ( (finished = dsign ^ (rd&1)) !=0) { if (dsign != 0) { irv |= STRTOG_Inexhi; goto adj1; } irv |= STRTOG_Inexlo; if (rve1 == emin) goto adj1; for(i = 0, j = nbits; j >= ULbits; i++, j -= ULbits) { if (rvb->x[i] & ALL_ON) goto adj1; } if (j > 1 && lo0bits(rvb->x + i) < j - 1) goto adj1; rve = rve1 - 1; rvb = set_ones(rvb, rvbits = nbits MTb); break; } irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi; break; } if (i < 0) { /* Error is less than half an ulp -- check for * special case of mantissa a power of two. */ irv = dsign ? STRTOG_Normal | STRTOG_Inexlo : STRTOG_Normal | STRTOG_Inexhi; if (dsign || bbbits > 1 || denorm || rve1 == emin) break; delta = lshift(delta,1 MTb); if (cmp(delta, bs) > 0) { irv = STRTOG_Normal | STRTOG_Inexlo; goto drop_down; } break; } if (i == 0) { /* exactly half-way between */ if (dsign) { if (denorm && all_on(rvb, rvbits)) { /*boundary case -- increment exponent*/ rvb->wds = 1; rvb->x[0] = 1; rve = emin + nbits - (rvbits = 1); irv = STRTOG_Normal | STRTOG_Inexhi; denorm = 0; break; } irv = STRTOG_Normal | STRTOG_Inexlo; } else if (bbbits == 1) { irv = STRTOG_Normal; drop_down: /* boundary case -- decrement exponent */ if (rve1 == emin) { irv = STRTOG_Normal | STRTOG_Inexhi; if (rvb->wds == 1 && rvb->x[0] == 1) sudden_underflow = 1; break; } rve -= nbits; rvb = set_ones(rvb, rvbits = nbits MTb); break; } else irv = STRTOG_Normal | STRTOG_Inexhi; if ((bbbits < nbits && !denorm) || !(rvb->x[0] & 1)) break; if (dsign) { rvb = increment(rvb MTb); j = kmask & (ULbits - (rvbits & kmask)); if (hi0bits(rvb->x[rvb->wds - 1]) != j) rvbits++; irv = STRTOG_Normal | STRTOG_Inexhi; } else { if (bbbits == 1) goto undfl; decrement(rvb); irv = STRTOG_Normal | STRTOG_Inexlo; } break; } if ((dval(&adj) = ratio(delta, bs)) <= 2.) { adj1: inex = STRTOG_Inexlo; if (dsign) { asub = 0; inex = STRTOG_Inexhi; } else if (denorm && bbbits <= 1) { undfl: rvb->wds = 0; rve = emin; irv = STRTOG_Underflow | STRTOG_Inexlo; if (fpi->rounding == 2) { rvb->wds = 1; rvb->x[0] = 1; irv = STRTOG_Underflow | STRTOG_Inexhi; } break; } adj0 = dval(&adj) = 1.; } else { adj0 = dval(&adj) *= 0.5; if (dsign) { asub = 0; inex = STRTOG_Inexlo; } if (dval(&adj) < 2147483647.) { L = adj0; adj0 -= L; switch(rd) { case 0: if (adj0 >= .5) goto inc_L; break; case 1: if (asub && adj0 > 0.) goto inc_L; break; case 2: if (!asub && adj0 > 0.) { inc_L: L++; inex = STRTOG_Inexact - inex; } } dval(&adj) = L; } } y = rve + rvbits; /* adj *= ulp(dval(&rv)); */ /* if (asub) rv -= adj; else rv += adj; */ if (!denorm && rvbits < nbits) { rvb = lshift(rvb, j = nbits - rvbits MTb); rve -= j; rvbits = nbits; } ab = d2b(dval(&adj), &abe, &abits MTb); if (abe < 0) rshift(ab, -abe); else if (abe > 0) ab = lshift(ab, abe MTb); rvb0 = rvb; if (asub) { /* rv -= adj; */ j = hi0bits(rvb->x[rvb->wds-1]); rvb = diff(rvb, ab MTb); k = rvb0->wds - 1; if (denorm) /* do nothing */; else if (rvb->wds <= k || hi0bits( rvb->x[k]) > hi0bits(rvb0->x[k])) { /* unlikely; can only have lost 1 high bit */ if (rve1 == emin) { --rvbits; denorm = 1; } else { rvb = lshift(rvb, 1 MTb); --rve; --rve1; L = finished = 0; } } } else { rvb = sum(rvb, ab MTb); k = rvb->wds - 1; if (k >= rvb0->wds || hi0bits(rvb->x[k]) < hi0bits(rvb0->x[k])) { if (denorm) { if (++rvbits == nbits) denorm = 0; } else { rshift(rvb, 1); rve++; rve1++; L = 0; } } } Bfree(ab MTb); Bfree(rvb0 MTb); if (finished) break; z = rve + rvbits; if (y == z && L) { /* Can we stop now? */ tol = dval(&adj) * 5e-16; /* > max rel error */ dval(&adj) = adj0 - .5; if (dval(&adj) < -tol) { if (adj0 > tol) { irv |= inex; break; } } else if (dval(&adj) > tol && adj0 < 1. - tol) { irv |= inex; break; } } bb0 = denorm ? 0 : trailz(rvb); Bfree(bb MTb); Bfree(bd MTb); Bfree(bs MTb); Bfree(delta MTb); } if (!denorm && (j = nbits - rvbits)) { if (j > 0) rvb = lshift(rvb, j MTb); else rshift(rvb, -j); rve -= j; } *exp = rve; Bfree(bb MTb); Bfree(bd MTb); Bfree(bs MTb); Bfree(bd0 MTb); Bfree(delta MTb); if (rve > fpi->emax) { huge: Bfree(rvb MTb); rvb = 0; #ifndef NO_ERRNO errno = ERANGE; #endif switch(fpi->rounding & 3) { case FPI_Round_up: if (!sign) goto ret_inf; break; case FPI_Round_down: if (!sign) break; case FPI_Round_near: ret_inf: irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; k = nbits >> kshift; if (nbits & kmask) ++k; memset(bits, 0, k*sizeof(ULong)); infnanexp: *exp = fpi->emax + 1; goto ret; } /* Round to largest representable magnitude */ irv = STRTOG_Normal | STRTOG_Inexlo; *exp = fpi->emax; b = bits; be = b + ((fpi->nbits + 31) >> 5); while(b < be) *b++ = -1; if ((j = fpi->nbits & 0x1f)) *--be >>= (32 - j); } ret: if (denorm) { if (sudden_underflow) { rvb->wds = 0; irv = STRTOG_Underflow | STRTOG_Inexlo; #ifndef NO_ERRNO errno = ERANGE; #endif } else { irv = (irv & ~STRTOG_Retmask) | (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero); if (irv & STRTOG_Inexact) { irv |= STRTOG_Underflow; #ifndef NO_ERRNO errno = ERANGE; #endif } } } if (se) *se = (char *)s; if (sign) irv |= STRTOG_Neg; if (rvb) { copybits(bits, nbits, rvb); Bfree(rvb MTb); } return irv; } mlton-20210117+dfsg/runtime/gdtoa/strtodnrp.c000066400000000000000000000050271416264345000210160ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2004 by David M. Gay. All Rights Reserved Based on material in the rest of /netlib/fp/gdota.tar.gz, which is copyright (C) 1998, 2000 by Lucent Technologies. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* This is a variant of strtod that works on Intel ia32 systems */ /* with the default extended-precision arithmetic -- it does not */ /* require setting the precision control to 53 bits. */ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoaimp.h" double #ifdef KR_headers strtod(s, sp) CONST char *s; char **sp; #else strtod(CONST char *s, char **sp) #endif { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; ULong bits[2]; Long exp; int k; union { ULong L[2]; double d; } __attribute__((__may_alias__)) u; k = strtodg(s, sp, &fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: u.L[0] = u.L[1] = 0; break; case STRTOG_Normal: u.L[_1] = bits[0]; u.L[_0] = (bits[1] & ~0x100000) | ((exp + 0x3ff + 52) << 20); break; case STRTOG_Denormal: u.L[_1] = bits[0]; u.L[_0] = bits[1]; break; case STRTOG_Infinite: u.L[_0] = 0x7ff00000; u.L[_1] = 0; break; case STRTOG_NaN: u.L[0] = d_QNAN0; u.L[1] = d_QNAN1; break; case STRTOG_NaNbits: u.L[_0] = 0x7ff00000 | bits[1]; u.L[_1] = bits[0]; } if (k & STRTOG_Neg) u.L[_0] |= 0x80000000L; return u.d; } mlton-20210117+dfsg/runtime/gdtoa/strtof.c000066400000000000000000000043301416264345000202740ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" float #ifdef KR_headers gdtoa__strtof(s, sp) CONST char *s; char **sp; #else gdtoa__strtof(CONST char *s, char **sp) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI, 0 /*unused*/ }; ULong bits[1]; Long exp; int k; union { ULong L[1]; float f; } __attribute__((__may_alias__)) u; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); switch(k & STRTOG_Retmask) { default: /* unused */ case STRTOG_NoNumber: case STRTOG_Zero: u.L[0] = 0; break; case STRTOG_Normal: case STRTOG_NaNbits: u.L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23); break; case STRTOG_Denormal: u.L[0] = bits[0]; break; case STRTOG_Infinite: u.L[0] = 0x7f800000; break; case STRTOG_NaN: u.L[0] = f_QNAN; } if (k & STRTOG_Neg) u.L[0] |= 0x80000000L; return u.f; } mlton-20210117+dfsg/runtime/gdtoa/strtopQ.c000066400000000000000000000053121416264345000204300ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif extern ULong NanDflt_Q_D2A[4]; int #ifdef KR_headers gdtoa__strtopQ(s, sp, V) CONST char *s; char **sp; void *V; #else gdtoa__strtopQ(CONST char *s, char **sp, void *V) #endif { static FPI fpi0 = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, SI, 0 /*unused*/ }; ULong bits[4]; Long exp; int k; ULong *L = (ULong*)V; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = L[3] = 0; break; case STRTOG_Normal: case STRTOG_NaNbits: L[_3] = bits[0]; L[_2] = bits[1]; L[_1] = bits[2]; L[_0] = (bits[3] & ~0x10000) | ((exp + 0x3fff + 112) << 16); break; case STRTOG_Denormal: L[_3] = bits[0]; L[_2] = bits[1]; L[_1] = bits[2]; L[_0] = bits[3]; break; case STRTOG_Infinite: L[_0] = 0x7fff0000; L[_1] = L[_2] = L[_3] = 0; break; case STRTOG_NaN: L[_0] = NanDflt_Q_D2A[3]; L[_1] = NanDflt_Q_D2A[2]; L[_2] = NanDflt_Q_D2A[1]; L[_3] = NanDflt_Q_D2A[0]; } if (k & STRTOG_Neg) L[_0] |= 0x80000000L; return k; } mlton-20210117+dfsg/runtime/gdtoa/strtopd.c000066400000000000000000000034061416264345000204550ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtopd(s, sp, d) char *s; char **sp; double *d; #else gdtoa__strtopd(CONST char *s, char **sp, double *d) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; ULong bits[2]; Long exp; int k; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtod((ULong*)d, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtopdd.c000066400000000000000000000111741416264345000206220ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtopdd(s, sp, dd) CONST char *s; char **sp; double *dd; #else gdtoa__strtopdd(CONST char *s, char **sp, double *dd) #endif { #ifdef Sudden_Underflow static FPI fpi0 = { 106, 1-1023, 2046-1023-106+1, 1, 1, 0 /*unused*/ }; #else static FPI fpi0 = { 106, 1-1023-53+1, 2046-1023-106+1, 1, 0, 0 /*unused*/ }; #endif ULong bits[4]; Long exp; int i, j, rv; typedef union { double d[2]; ULong L[4]; } __attribute__((__may_alias__)) U; U *u; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif rv = gdtoa__strtodg(s, sp, fpi, &exp, bits); u = (U*)dd; switch(rv & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: u->d[0] = u->d[1] = 0.; break; case STRTOG_Normal: u->L[_1] = (bits[1] >> 21 | bits[2] << 11) & 0xffffffffL; u->L[_0] = (bits[2] >> 21) | ((bits[3] << 11) & 0xfffff) | ((exp + 0x3ff + 105) << 20); exp += 0x3ff + 52; if (bits[1] &= 0x1fffff) { i = hi0bits(bits[1]) - 11; if (i >= exp) { i = exp - 1; exp = 0; } else exp -= i; if (i > 0) { bits[1] = bits[1] << i | bits[0] >> (32-i); bits[0] = bits[0] << i & 0xffffffffL; } } else if (bits[0]) { i = hi0bits(bits[0]) + 21; if (i >= exp) { i = exp - 1; exp = 0; } else exp -= i; if (i < 32) { bits[1] = bits[0] >> (32 - i); bits[0] = bits[0] << i & 0xffffffffL; } else { bits[1] = bits[0] << (i - 32); bits[0] = 0; } } else { u->L[2] = u->L[3] = 0; break; } u->L[2+_1] = bits[0]; u->L[2+_0] = (bits[1] & 0xfffff) | (exp << 20); break; case STRTOG_Denormal: if (bits[3]) goto nearly_normal; if (bits[2]) goto partly_normal; if (bits[1] & 0xffe00000) goto hardly_normal; /* completely denormal */ u->L[2] = u->L[3] = 0; u->L[_1] = bits[0]; u->L[_0] = bits[1]; break; nearly_normal: i = hi0bits(bits[3]) - 11; /* i >= 12 */ j = 32 - i; u->L[_0] = ((bits[3] << i | bits[2] >> j) & 0xfffff) | ((65 - i) << 20); u->L[_1] = (bits[2] << i | bits[1] >> j) & 0xffffffffL; u->L[2+_0] = bits[1] & ((1L << j) - 1); u->L[2+_1] = bits[0]; break; partly_normal: i = hi0bits(bits[2]) - 11; if (i < 0) { j = -i; i += 32; u->L[_0] = (bits[2] >> j & 0xfffff) | (33 + j) << 20; u->L[_1] = ((bits[2] << i) | (bits[1] >> j)) & 0xffffffffL; u->L[2+_0] = bits[1] & ((1L << j) - 1); u->L[2+_1] = bits[0]; break; } if (i == 0) { u->L[_0] = (bits[2] & 0xfffff) | (33 << 20); u->L[_1] = bits[1]; u->L[2+_0] = 0; u->L[2+_1] = bits[0]; break; } j = 32 - i; u->L[_0] = (((bits[2] << i) | (bits[1] >> j)) & 0xfffff) | ((j + 1) << 20); u->L[_1] = (bits[1] << i | bits[0] >> j) & 0xffffffffL; u->L[2+_0] = 0; u->L[2+_1] = bits[0] & ((1L << j) - 1); break; hardly_normal: j = 11 - hi0bits(bits[1]); i = 32 - j; u->L[_0] = (bits[1] >> j & 0xfffff) | ((j + 1) << 20); u->L[_1] = (bits[1] << i | bits[0] >> j) & 0xffffffffL; u->L[2+_0] = 0; u->L[2+_1] = bits[0] & ((1L << j) - 1); break; case STRTOG_Infinite: u->L[_0] = u->L[2+_0] = 0x7ff00000; u->L[_1] = u->L[2+_1] = 0; break; case STRTOG_NaN: u->L[0] = u->L[2] = d_QNAN0; u->L[1] = u->L[3] = d_QNAN1; } if (rv & STRTOG_Neg) { u->L[ _0] |= 0x80000000L; u->L[2+_0] |= 0x80000000L; } return rv; } mlton-20210117+dfsg/runtime/gdtoa/strtopf.c000066400000000000000000000042321416264345000204550ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" int #ifdef KR_headers gdtoa__strtopf(s, sp, f) CONST char *s; char **sp; float *f; #else gdtoa__strtopf(CONST char *s, char **sp, float *f) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI, 0 /*unused*/ }; ULong bits[1], *L; Long exp; int k; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); L = (ULong*)f; switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = 0; break; case STRTOG_Normal: case STRTOG_NaNbits: L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23); break; case STRTOG_Denormal: L[0] = bits[0]; break; case STRTOG_Infinite: L[0] = 0x7f800000; break; case STRTOG_NaN: L[0] = f_QNAN; } if (k & STRTOG_Neg) L[0] |= 0x80000000L; return k; } mlton-20210117+dfsg/runtime/gdtoa/strtopx.c000066400000000000000000000054341416264345000205040ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern UShort NanDflt_ldus_D2A[5]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif int #ifdef KR_headers gdtoa__strtopx(s, sp, V) CONST char *s; char **sp; void *V; #else gdtoa__strtopx(CONST char *s, char **sp, void *V) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; ULong bits[2]; Long exp; int k; UShort *L = (UShort*)V; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = L[3] = L[4] = 0; break; case STRTOG_Denormal: L[_0] = 0; goto normal_bits; case STRTOG_Normal: case STRTOG_NaNbits: L[_0] = exp + 0x3fff + 63; normal_bits: L[_4] = (UShort)bits[0]; L[_3] = (UShort)(bits[0] >> 16); L[_2] = (UShort)bits[1]; L[_1] = (UShort)(bits[1] >> 16); break; case STRTOG_Infinite: L[_0] = 0x7fff; L[_1] = 0x8000; L[_2] = L[_3] = L[_4] = 0; break; case STRTOG_NaN: L[_4] = NanDflt_ldus_D2A[0]; L[_3] = NanDflt_ldus_D2A[1]; L[_2] = NanDflt_ldus_D2A[2]; L[_1] = NanDflt_ldus_D2A[3]; L[_0] = NanDflt_ldus_D2A[4]; } if (k & STRTOG_Neg) L[_0] |= 0x8000; return k; } mlton-20210117+dfsg/runtime/gdtoa/strtopxL.c000066400000000000000000000050241416264345000206130ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_xL_D2A[3]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #endif #ifdef IEEE_8087 #define _0 2 #define _1 1 #define _2 0 #endif int #ifdef KR_headers gdtoa__strtopxL(s, sp, V) CONST char *s; char **sp; void *V; #else gdtoa__strtopxL(CONST char *s, char **sp, void *V) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; ULong bits[2]; Long exp; int k; ULong *L = (ULong*)V; #ifdef Honor_FLT_ROUNDS #include "gdtoa/gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = gdtoa__strtodg(s, sp, fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = 0; break; case STRTOG_Normal: case STRTOG_Denormal: case STRTOG_NaNbits: L[_2] = bits[0]; L[_1] = bits[1]; L[_0] = (exp + 0x3fff + 63) << 16; break; case STRTOG_Infinite: L[_0] = 0x7fff << 16; L[_1] = 0x80000000; L[_2] = 0; break; case STRTOG_NaN: L[_0] = NanDflt_xL_D2A[2]; L[_1] = NanDflt_xL_D2A[1]; L[_2] = NanDflt_xL_D2A[0]; } if (k & STRTOG_Neg) L[_0] |= 0x80000000L; return k; } mlton-20210117+dfsg/runtime/gdtoa/strtorQ.c000066400000000000000000000056631416264345000204430ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif extern ULong NanDflt_Q_D2A[4]; void #ifdef KR_headers ULtoQ(L, bits, exp, k) ULong *L; ULong *bits; Long exp; int k; #else ULtoQ(ULong *L, ULong *bits, Long exp, int k) #endif { switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = L[3] = 0; break; case STRTOG_Normal: case STRTOG_NaNbits: L[_3] = bits[0]; L[_2] = bits[1]; L[_1] = bits[2]; L[_0] = (bits[3] & ~0x10000) | ((exp + 0x3fff + 112) << 16); break; case STRTOG_Denormal: L[_3] = bits[0]; L[_2] = bits[1]; L[_1] = bits[2]; L[_0] = bits[3]; break; case STRTOG_Infinite: L[_0] = 0x7fff0000; L[_1] = L[_2] = L[_3] = 0; break; case STRTOG_NaN: L[_0] = NanDflt_Q_D2A[3]; L[_1] = NanDflt_Q_D2A[2]; L[_2] = NanDflt_Q_D2A[1]; L[_3] = NanDflt_Q_D2A[0]; } if (k & STRTOG_Neg) L[_0] |= 0x80000000L; } int #ifdef KR_headers gdtoa__strtorQ(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else gdtoa__strtorQ(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 113, 1-16383-113+1, 32766-16383-113+1, 1, SI, 0 /*unused*/ }; FPI *fpi, fpi1; ULong bits[4]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtoQ((ULong*)L, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtord.c000066400000000000000000000050311416264345000204530ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_d_D2A[2]; void #ifdef KR_headers ULtod(L, bits, exp, k) ULong *L; ULong *bits; Long exp; int k; #else ULtod(ULong *L, ULong *bits, Long exp, int k) #endif { switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = 0; break; case STRTOG_Denormal: L[_1] = bits[0]; L[_0] = bits[1]; break; case STRTOG_Normal: case STRTOG_NaNbits: L[_1] = bits[0]; L[_0] = (bits[1] & ~0x100000) | ((exp + 0x3ff + 52) << 20); break; case STRTOG_Infinite: L[_0] = 0x7ff00000; L[_1] = 0; break; case STRTOG_NaN: L[_0] = NanDflt_d_D2A[1]; L[_1] = NanDflt_d_D2A[0]; } if (k & STRTOG_Neg) L[_0] |= 0x80000000L; } int #ifdef KR_headers gdtoa__strtord(s, sp, rounding, d) CONST char *s; char **sp; int rounding; double *d; #else gdtoa__strtord(CONST char *s, char **sp, int rounding, double *d) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, 0 /*unused*/ }; FPI *fpi, fpi1; ULong bits[2]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtod((ULong*)d, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtordd.c000066400000000000000000000121651416264345000206250ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_d_D2A[2]; void #ifdef KR_headers ULtodd(L, bits, exp, k) ULong *L; ULong *bits; Long exp; int k; #else ULtodd(ULong *L, ULong *bits, Long exp, int k) #endif { int i, j; switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = L[3] = 0; break; case STRTOG_Normal: L[_1] = (bits[1] >> 21 | bits[2] << 11) & (ULong)0xffffffffL; L[_0] = (bits[2] >> 21) | (bits[3] << 11 & 0xfffff) | ((exp + 0x3ff + 105) << 20); exp += 0x3ff + 52; if (bits[1] &= 0x1fffff) { i = hi0bits(bits[1]) - 11; if (i >= exp) { i = exp - 1; exp = 0; } else exp -= i; if (i > 0) { bits[1] = bits[1] << i | bits[0] >> (32-i); bits[0] = bits[0] << i & (ULong)0xffffffffL; } } else if (bits[0]) { i = hi0bits(bits[0]) + 21; if (i >= exp) { i = exp - 1; exp = 0; } else exp -= i; if (i < 32) { bits[1] = bits[0] >> (32 - i); bits[0] = bits[0] << i & (ULong)0xffffffffL; } else { bits[1] = bits[0] << (i - 32); bits[0] = 0; } } else { L[2] = L[3] = 0; break; } L[2+_1] = bits[0]; L[2+_0] = (bits[1] & 0xfffff) | (exp << 20); break; case STRTOG_Denormal: if (bits[3]) goto nearly_normal; if (bits[2]) goto partly_normal; if (bits[1] & 0xffe00000) goto hardly_normal; /* completely denormal */ L[2] = L[3] = 0; L[_1] = bits[0]; L[_0] = bits[1]; break; nearly_normal: i = hi0bits(bits[3]) - 11; /* i >= 12 */ j = 32 - i; L[_0] = ((bits[3] << i | bits[2] >> j) & 0xfffff) | ((65 - i) << 20); L[_1] = (bits[2] << i | bits[1] >> j) & 0xffffffffL; L[2+_0] = bits[1] & (((ULong)1L << j) - 1); L[2+_1] = bits[0]; break; partly_normal: i = hi0bits(bits[2]) - 11; if (i < 0) { j = -i; i += 32; L[_0] = (bits[2] >> j & 0xfffff) | ((33 + j) << 20); L[_1] = (bits[2] << i | bits[1] >> j) & 0xffffffffL; L[2+_0] = bits[1] & (((ULong)1L << j) - 1); L[2+_1] = bits[0]; break; } if (i == 0) { L[_0] = (bits[2] & 0xfffff) | (33 << 20); L[_1] = bits[1]; L[2+_0] = 0; L[2+_1] = bits[0]; break; } j = 32 - i; L[_0] = (((bits[2] << i) | (bits[1] >> j)) & 0xfffff) | ((j + 1) << 20); L[_1] = (bits[1] << i | bits[0] >> j) & 0xffffffffL; L[2+_0] = 0; L[2+_1] = bits[0] & ((1L << j) - 1); break; hardly_normal: j = 11 - hi0bits(bits[1]); i = 32 - j; L[_0] = (bits[1] >> j & 0xfffff) | ((j + 1) << 20); L[_1] = (bits[1] << i | bits[0] >> j) & 0xffffffffL; L[2+_0] = 0; L[2+_1] = bits[0] & (((ULong)1L << j) - 1); break; case STRTOG_Infinite: L[_0] = L[2+_0] = 0x7ff00000; L[_1] = L[2+_1] = 0; break; case STRTOG_NaN: L[_0] = L[_0+2] = NanDflt_d_D2A[1]; L[_1] = L[_1+2] = NanDflt_d_D2A[0]; break; case STRTOG_NaNbits: L[_1] = (bits[1] >> 20 | bits[2] << 12) & (ULong)0xffffffffL; L[_0] = bits[2] >> 20 | bits[3] << 12; L[_0] |= (L[_1] | L[_0]) ? (ULong)0x7ff00000L : (ULong)0x7ff80000L; L[2+_1] = bits[0] & (ULong)0xffffffffL; L[2+_0] = bits[1] & 0xfffffL; L[2+_0] |= (L[2+_1] | L[2+_0]) ? (ULong)0x7ff00000L : (ULong)0x7ff80000L; } if (k & STRTOG_Neg) { L[_0] |= 0x80000000L; L[2+_0] |= 0x80000000L; } } int #ifdef KR_headers gdtoa__strtordd(s, sp, rounding, dd) CONST char *s; char **sp; int rounding; double *dd; #else gdtoa__strtordd(CONST char *s, char **sp, int rounding, double *dd) #endif { #ifdef Sudden_Underflow static FPI fpi0 = { 106, 1-1023, 2046-1023-106+1, 1, 1, 0 /*unused*/ }; #else static FPI fpi0 = { 106, 1-1023-53+1, 2046-1023-106+1, 1, 0, 0 /*unused*/ }; #endif FPI *fpi, fpi1; ULong bits[4]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtodd((ULong*)dd, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtorf.c000066400000000000000000000046661416264345000204720ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" extern ULong NanDflt_f_D2A[1]; void #ifdef KR_headers ULtof(L, bits, exp, k) ULong *L; ULong *bits; Long exp; int k; #else ULtof(ULong *L, ULong *bits, Long exp, int k) #endif { switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: *L = 0; break; case STRTOG_Normal: case STRTOG_NaNbits: L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23); break; case STRTOG_Denormal: L[0] = bits[0]; break; case STRTOG_Infinite: L[0] = 0x7f800000; break; case STRTOG_NaN: L[0] = NanDflt_f_D2A[0]; } if (k & STRTOG_Neg) L[0] |= 0x80000000L; } int #ifdef KR_headers gdtoa__strtorf(s, sp, rounding, f) CONST char *s; char **sp; int rounding; float *f; #else gdtoa__strtorf(CONST char *s, char **sp, int rounding, float *f) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI, 0 /*unused*/ }; FPI *fpi, fpi1; ULong bits[1]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtof((ULong*)f, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtorx.c000066400000000000000000000060151416264345000205020ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif extern UShort NanDflt_ldus_D2A[5]; void #ifdef KR_headers ULtox(L, bits, exp, k) UShort *L; ULong *bits; Long exp; int k; #else ULtox(UShort *L, ULong *bits, Long exp, int k) #endif { switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = L[3] = L[4] = 0; break; case STRTOG_Denormal: L[_0] = 0; goto normal_bits; case STRTOG_Normal: case STRTOG_NaNbits: L[_0] = exp + 0x3fff + 63; normal_bits: L[_4] = (UShort)bits[0]; L[_3] = (UShort)(bits[0] >> 16); L[_2] = (UShort)bits[1]; L[_1] = (UShort)(bits[1] >> 16); break; case STRTOG_Infinite: L[_0] = 0x7fff; L[_1] = 0x8000; L[_2] = L[_3] = L[_4] = 0; break; case STRTOG_NaN: L[_4] = NanDflt_ldus_D2A[0]; L[_3] = NanDflt_ldus_D2A[1]; L[_2] = NanDflt_ldus_D2A[2]; L[_1] = NanDflt_ldus_D2A[3]; L[_0] = NanDflt_ldus_D2A[4]; } if (k & STRTOG_Neg) L[_0] |= 0x8000; } int #ifdef KR_headers gdtoa__strtorx(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else gdtoa__strtorx(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; FPI *fpi, fpi1; ULong bits[2]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtox((UShort*)L, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/strtorxL.c000066400000000000000000000054051416264345000206200ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2000 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #endif #ifdef IEEE_8087 #define _0 2 #define _1 1 #define _2 0 #endif extern ULong NanDflt_xL_D2A[3]; void #ifdef KR_headers ULtoxL(L, bits, exp, k) ULong *L; ULong *bits; Long exp; int k; #else ULtoxL(ULong *L, ULong *bits, Long exp, int k) #endif { switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: L[0] = L[1] = L[2] = 0; break; case STRTOG_Normal: case STRTOG_Denormal: case STRTOG_NaNbits: L[_0] = (exp + 0x3fff + 63) << 16; L[_1] = bits[1]; L[_2] = bits[0]; break; case STRTOG_Infinite: L[_0] = 0x7fff0000; L[_1] = 0x80000000; L[_2] = 0; break; case STRTOG_NaN: L[_0] = NanDflt_xL_D2A[2]; L[_1] = NanDflt_xL_D2A[1]; L[_2] = NanDflt_xL_D2A[0]; } if (k & STRTOG_Neg) L[_0] |= 0x80000000L; } int #ifdef KR_headers gdtoa__strtorxL(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else gdtoa__strtorxL(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, 0 /*unused*/ }; FPI *fpi, fpi1; ULong bits[2]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtoxL((ULong*)L, bits, exp, k); return k; } mlton-20210117+dfsg/runtime/gdtoa/sum.c000066400000000000000000000047341416264345000175670ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" Bigint * #ifdef KR_headers sum(a, b MTa) Bigint *a; Bigint *b; MTk #else sum(Bigint *a, Bigint *b MTd) #endif { Bigint *c; ULong carry, *xc, *xa, *xb, *xe, y; #ifdef Pack_32 ULong z; #endif if (a->wds < b->wds) { c = b; b = a; a = c; } c = Balloc(a->k MTa); c->wds = a->wds; carry = 0; xa = a->x; xb = b->x; xc = c->x; xe = xc + b->wds; #ifdef Pack_32 do { y = (*xa & 0xffff) + (*xb & 0xffff) + carry; carry = (y & 0x10000) >> 16; z = (*xa++ >> 16) + (*xb++ >> 16) + carry; carry = (z & 0x10000) >> 16; Storeinc(xc, z, y); } while(xc < xe); xe += a->wds - b->wds; while(xc < xe) { y = (*xa & 0xffff) + carry; carry = (y & 0x10000) >> 16; z = (*xa++ >> 16) + carry; carry = (z & 0x10000) >> 16; Storeinc(xc, z, y); } #else do { y = *xa++ + *xb++ + carry; carry = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } while(xc < xe); xe += a->wds - b->wds; while(xc < xe) { y = *xa++ + carry; carry = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } #endif if (carry) { if (c->wds == c->maxwds) { b = Balloc(c->k + 1 MTa); Bcopy(b, c); Bfree(c MTa); c = b; } c->x[c->wds++] = 1; } return c; } mlton-20210117+dfsg/runtime/gdtoa/test/000077500000000000000000000000001416264345000175665ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/gdtoa/test/Q.ou0000066400000000000000000000704411416264345000204210ustar00rootroot00000000000000 Input: 1.23 strtoQ consumes 4 bytes and returns 17 with bits = #3fff3ae1 47ae147a e147ae14 7ae147ae g_Qfmt(0) gives 4 bytes: "1.23" strtoIQ returns 17, consuming 4 bytes. fI[0] = #3fff3ae1 47ae147a e147ae14 7ae147ae fI[1] = #3fff3ae1 47ae147a e147ae14 7ae147af fI[0] == strtod Input: 1.23e+20 strtoQ consumes 8 bytes and returns 1 with bits = #4041aabd f2145b43 0 0 g_Qfmt(0) gives 8 bytes: "1.23e+20" strtoIQ returns 1, consuming 8 bytes. fI[0] == fI[1] = #4041aabd f2145b43 0 0 Input: 1.23e-20 strtoQ consumes 8 bytes and returns 17 with bits = #3fbcd0ae 4cf76753 9e4cbca ad934841 g_Qfmt(0) gives 8 bytes: "1.23e-20" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3fbcd0ae 4cf76753 9e4cbca ad934841 fI[1] = #3fbcd0ae 4cf76753 9e4cbca ad934842 fI[0] == strtod Input: 1.23456789 strtoQ consumes 10 bytes and returns 17 with bits = #3fff3c0c a4283de1 b7eb6945 1304948f g_Qfmt(0) gives 10 bytes: "1.23456789" strtoIQ returns 17, consuming 10 bytes. fI[0] = #3fff3c0c a4283de1 b7eb6945 1304948f fI[1] = #3fff3c0c a4283de1 b7eb6945 13049490 fI[0] == strtod Input: 1.23456589e+20 strtoQ consumes 14 bytes and returns 1 with bits = #4041ac53 7a660b99 74000000 0 g_Qfmt(0) gives 14 bytes: "1.23456589e+20" strtoIQ returns 1, consuming 14 bytes. fI[0] == fI[1] = #4041ac53 7a660b99 74000000 0 Input: 1.23e+30 strtoQ consumes 8 bytes and returns 1 with bits = #4062f0cb 4e8fb79 4945600 0 g_Qfmt(0) gives 8 bytes: "1.23e+30" strtoIQ returns 1, consuming 8 bytes. fI[0] == fI[1] = #4062f0cb 4e8fb79 4945600 0 Input: 1.23e-30 strtoQ consumes 8 bytes and returns 17 with bits = #3f9b8f28 66f5010a a9d63f9e d7e8ba14 g_Qfmt(0) gives 8 bytes: "1.23e-30" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3f9b8f28 66f5010a a9d63f9e d7e8ba14 fI[1] = #3f9b8f28 66f5010a a9d63f9e d7e8ba15 fI[0] == strtod Input: 1.23456789e-20 strtoQ consumes 14 bytes and returns 33 with bits = #3fbcd268 1471e7ad a6a4a029 d86c1fa2 g_Qfmt(0) gives 14 bytes: "1.23456789e-20" strtoIQ returns 33, consuming 14 bytes. fI[0] = #3fbcd268 1471e7ad a6a4a029 d86c1fa1 fI[1] = #3fbcd268 1471e7ad a6a4a029 d86c1fa2 fI[1] == strtod Input: 1.23456789e-30 strtoQ consumes 14 bytes and returns 17 with bits = #3f9b90a3 e33bbd99 51f85855 5a6b19d4 g_Qfmt(0) gives 14 bytes: "1.23456789e-30" strtoIQ returns 17, consuming 14 bytes. fI[0] = #3f9b90a3 e33bbd99 51f85855 5a6b19d4 fI[1] = #3f9b90a3 e33bbd99 51f85855 5a6b19d5 fI[0] == strtod Input: 1.234567890123456789 strtoQ consumes 20 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a4194 68dd175b g_Qfmt(0) gives 20 bytes: "1.234567890123456789" strtoIQ returns 17, consuming 20 bytes. fI[0] = #3fff3c0c a428c59f b71a4194 68dd175b fI[1] = #3fff3c0c a428c59f b71a4194 68dd175c fI[0] == strtod Input: 1.23456789012345678901234567890123456789 strtoQ consumes 40 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a7be1 6b6b6d5b g_Qfmt(0) gives 36 bytes: "1.2345678901234567890123456789012346" strtoIQ returns 17, consuming 40 bytes. fI[0] = #3fff3c0c a428c59f b71a7be1 6b6b6d5b fI[1] = #3fff3c0c a428c59f b71a7be1 6b6b6d5c fI[0] == strtod Input: 1.23e306 strtoQ consumes 8 bytes and returns 33 with bits = #43f7c067 6cd1c61f 4daac5f1 e9fa3b55 g_Qfmt(0) gives 9 bytes: "1.23e+306" strtoIQ returns 33, consuming 8 bytes. fI[0] = #43f7c067 6cd1c61f 4daac5f1 e9fa3b54 fI[1] = #43f7c067 6cd1c61f 4daac5f1 e9fa3b55 fI[1] == strtod Input: 1.23e-306 strtoQ consumes 9 bytes and returns 17 with bits = #3c06ba3b 85da396e 7e496ab7 d233c3dd g_Qfmt(0) gives 9 bytes: "1.23e-306" strtoIQ returns 17, consuming 9 bytes. fI[0] = #3c06ba3b 85da396e 7e496ab7 d233c3dd fI[1] = #3c06ba3b 85da396e 7e496ab7 d233c3de fI[0] == strtod Input: 1.23e-320 strtoQ consumes 9 bytes and returns 33 with bits = #3bd83731 86e30898 7e33b2e8 355f847b g_Qfmt(0) gives 9 bytes: "1.23e-320" strtoIQ returns 33, consuming 9 bytes. fI[0] = #3bd83731 86e30898 7e33b2e8 355f847a fI[1] = #3bd83731 86e30898 7e33b2e8 355f847b fI[1] == strtod Input: 1.23e-20 strtoQ consumes 8 bytes and returns 17 with bits = #3fbcd0ae 4cf76753 9e4cbca ad934841 g_Qfmt(0) gives 8 bytes: "1.23e-20" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3fbcd0ae 4cf76753 9e4cbca ad934841 fI[1] = #3fbcd0ae 4cf76753 9e4cbca ad934842 fI[0] == strtod Input: 1.23456789e307 strtoQ consumes 14 bytes and returns 17 with bits = #43fb194b 14bdaecd bcea468c 902464cf g_Qfmt(0) gives 15 bytes: "1.23456789e+307" strtoIQ returns 17, consuming 14 bytes. fI[0] = #43fb194b 14bdaecd bcea468c 902464cf fI[1] = #43fb194b 14bdaecd bcea468c 902464d0 fI[0] == strtod Input: 1.23456589e-307 strtoQ consumes 15 bytes and returns 17 with bits = #3c036319 6bb9845f a6d234e3 39163574 g_Qfmt(0) gives 15 bytes: "1.23456589e-307" strtoIQ returns 17, consuming 15 bytes. fI[0] = #3c036319 6bb9845f a6d234e3 39163574 fI[1] = #3c036319 6bb9845f a6d234e3 39163575 fI[0] == strtod Input: 1.234567890123456789 strtoQ consumes 20 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a4194 68dd175b g_Qfmt(0) gives 20 bytes: "1.234567890123456789" strtoIQ returns 17, consuming 20 bytes. fI[0] = #3fff3c0c a428c59f b71a4194 68dd175b fI[1] = #3fff3c0c a428c59f b71a4194 68dd175c fI[0] == strtod Input: 1.234567890123456789e301 strtoQ consumes 24 bytes and returns 33 with bits = #43e726f5 175f5641 3017ea80 763990ef g_Qfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIQ returns 33, consuming 24 bytes. fI[0] = #43e726f5 175f5641 3017ea80 763990ee fI[1] = #43e726f5 175f5641 3017ea80 763990ef fI[1] == strtod Input: 1.234567890123456789e-301 strtoQ consumes 25 bytes and returns 17 with bits = #3c1752a6 4e34ba0d 35b19b04 3222fce5 g_Qfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIQ returns 17, consuming 25 bytes. fI[0] = #3c1752a6 4e34ba0d 35b19b04 3222fce5 fI[1] = #3c1752a6 4e34ba0d 35b19b04 3222fce6 fI[0] == strtod Input: 1.234567890123456789e-321 strtoQ consumes 25 bytes and returns 17 with bits = #3bd4f3c2 3699d4db 99d1ea94 2fecd7de g_Qfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIQ returns 17, consuming 25 bytes. fI[0] = #3bd4f3c2 3699d4db 99d1ea94 2fecd7de fI[1] = #3bd4f3c2 3699d4db 99d1ea94 2fecd7df fI[0] == strtod Input: 1e23 strtoQ consumes 4 bytes and returns 1 with bits = #404b52d0 2c7e14af 68000000 0 g_Qfmt(0) gives 5 bytes: "1e+23" strtoIQ returns 1, consuming 4 bytes. fI[0] == fI[1] = #404b52d0 2c7e14af 68000000 0 Input: 1e310 strtoQ consumes 5 bytes and returns 33 with bits = #4404bd03 c8140697 9e9ff00e fefd4cbd g_Qfmt(0) gives 6 bytes: "1e+310" strtoIQ returns 33, consuming 5 bytes. fI[0] = #4404bd03 c8140697 9e9ff00e fefd4cbc fI[1] = #4404bd03 c8140697 9e9ff00e fefd4cbd fI[1] == strtod Input: 9.0259718793241475e-277 strtoQ consumes 23 bytes and returns 17 with bits = #3c69ffff ffffffff f9ed5779 ac118fe1 g_Qfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIQ returns 17, consuming 23 bytes. fI[0] = #3c69ffff ffffffff f9ed5779 ac118fe1 fI[1] = #3c69ffff ffffffff f9ed5779 ac118fe2 fI[0] == strtod Input: 9.025971879324147880346310405869e-277 strtoQ consumes 37 bytes and returns 33 with bits = #3c6a0000 0 0 9a g_Qfmt(0) gives 37 bytes: "9.025971879324147880346310405869e-277" strtoIQ returns 33, consuming 37 bytes. fI[0] = #3c6a0000 0 0 99 fI[1] = #3c6a0000 0 0 9a fI[1] == strtod Input: 9.025971879324147880346310405868e-277 strtoQ consumes 37 bytes and returns 17 with bits = #3c69ffff ffffffff ffffffff fffffcb5 g_Qfmt(0) gives 37 bytes: "9.025971879324147880346310405868e-277" strtoIQ returns 17, consuming 37 bytes. fI[0] = #3c69ffff ffffffff ffffffff fffffcb5 fI[1] = #3c69ffff ffffffff ffffffff fffffcb6 fI[0] == strtod Input: 2.2250738585072014e-308 strtoQ consumes 23 bytes and returns 33 with bits = #3c010000 0 8c304c cf867de0 g_Qfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIQ returns 33, consuming 23 bytes. fI[0] = #3c010000 0 8c304c cf867ddf fI[1] = #3c010000 0 8c304c cf867de0 fI[1] == strtod Input: 2.2250738585072013e-308 strtoQ consumes 23 bytes and returns 33 with bits = #3c00ffff ffffffff fa9e4c4f 4c1e8a10 g_Qfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIQ returns 33, consuming 23 bytes. fI[0] = #3c00ffff ffffffff fa9e4c4f 4c1e8a0f fI[1] = #3c00ffff ffffffff fa9e4c4f 4c1e8a10 fI[1] == strtod Input: 3.2649476e14 strtoQ consumes 12 bytes and returns 1 with bits = #402f28f1 fc30da00 0 0 g_Qfmt(0) gives 13 bytes: "3.2649476e+14" strtoIQ returns 1, consuming 12 bytes. fI[0] == fI[1] = #402f28f1 fc30da00 0 0 Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtoQ consumes 3 bytes and returns 17 with bits = #3fff1999 99999999 99999999 99999999 g_Qfmt(0) gives 36 bytes: "1.0999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 fI[1] = #3fff1999 99999999 99999999 9999999a fI[0] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 25 with bits = #bfff1999 99999999 99999999 99999999 g_Qfmt(0) gives 37 bytes: "-1.0999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a fI[1] = #bfff1999 99999999 99999999 99999999 fI[1] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 fI[1] = #3fff3333 33333333 33333333 33333334 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 fI[1] = #bfff3333 33333333 33333333 33333333 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 17 with bits = #3fff4ccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 36 bytes: "1.2999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc fI[1] = #3fff4ccc cccccccc cccccccc cccccccd fI[0] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 25 with bits = #bfff4ccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 37 bytes: "-1.2999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd fI[1] = #bfff4ccc cccccccc cccccccc cccccccc fI[1] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 fI[1] = #3fff6666 66666666 66666666 66666667 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 fI[1] = #bfff6666 66666666 66666666 66666666 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 Input: 1.6 strtoQ consumes 3 bytes and returns 17 with bits = #3fff9999 99999999 99999999 99999999 g_Qfmt(0) gives 36 bytes: "1.5999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 fI[1] = #3fff9999 99999999 99999999 9999999a fI[0] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 25 with bits = #bfff9999 99999999 99999999 99999999 g_Qfmt(0) gives 37 bytes: "-1.5999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a fI[1] = #bfff9999 99999999 99999999 99999999 fI[1] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 fI[1] = #3fffb333 33333333 33333333 33333334 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 fI[1] = #bfffb333 33333333 33333333 33333333 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 17 with bits = #3fffcccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 36 bytes: "1.7999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc fI[1] = #3fffcccc cccccccc cccccccc cccccccd fI[0] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 25 with bits = #bfffcccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 37 bytes: "-1.7999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd fI[1] = #bfffcccc cccccccc cccccccc cccccccc fI[1] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 fI[1] = #3fffe666 66666666 66666666 66666667 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 fI[1] = #bfffe666 66666666 66666666 66666666 fI[1] == strtod Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtoQ consumes 3 bytes and returns 33 with bits = #3fff1999 99999999 99999999 9999999a g_Qfmt(0) gives 3 bytes: "1.1" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 fI[1] = #3fff1999 99999999 99999999 9999999a fI[1] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 41 with bits = #bfff1999 99999999 99999999 9999999a g_Qfmt(0) gives 4 bytes: "-1.1" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a fI[1] = #bfff1999 99999999 99999999 99999999 fI[0] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 fI[1] = #3fff3333 33333333 33333333 33333334 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 fI[1] = #bfff3333 33333333 33333333 33333333 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 33 with bits = #3fff4ccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 3 bytes: "1.3" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc fI[1] = #3fff4ccc cccccccc cccccccc cccccccd fI[1] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 41 with bits = #bfff4ccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 4 bytes: "-1.3" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd fI[1] = #bfff4ccc cccccccc cccccccc cccccccc fI[0] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 fI[1] = #3fff6666 66666666 66666666 66666667 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 fI[1] = #bfff6666 66666666 66666666 66666666 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 Input: 1.6 strtoQ consumes 3 bytes and returns 33 with bits = #3fff9999 99999999 99999999 9999999a g_Qfmt(0) gives 3 bytes: "1.6" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 fI[1] = #3fff9999 99999999 99999999 9999999a fI[1] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 41 with bits = #bfff9999 99999999 99999999 9999999a g_Qfmt(0) gives 4 bytes: "-1.6" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a fI[1] = #bfff9999 99999999 99999999 99999999 fI[0] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 fI[1] = #3fffb333 33333333 33333333 33333334 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 fI[1] = #bfffb333 33333333 33333333 33333333 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 33 with bits = #3fffcccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 3 bytes: "1.8" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc fI[1] = #3fffcccc cccccccc cccccccc cccccccd fI[1] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 41 with bits = #bfffcccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 4 bytes: "-1.8" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd fI[1] = #bfffcccc cccccccc cccccccc cccccccc fI[0] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 fI[1] = #3fffe666 66666666 66666666 66666667 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 fI[1] = #bfffe666 66666666 66666666 66666666 fI[1] == strtod Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtoQ consumes 3 bytes and returns 33 with bits = #3fff1999 99999999 99999999 9999999a g_Qfmt(0) gives 3 bytes: "1.1" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 fI[1] = #3fff1999 99999999 99999999 9999999a fI[1] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 25 with bits = #bfff1999 99999999 99999999 99999999 g_Qfmt(0) gives 37 bytes: "-1.0999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a fI[1] = #bfff1999 99999999 99999999 99999999 fI[1] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 33 with bits = #3fff3333 33333333 33333333 33333334 g_Qfmt(0) gives 36 bytes: "1.2000000000000000000000000000000002" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 fI[1] = #3fff3333 33333333 33333333 33333334 fI[1] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 fI[1] = #bfff3333 33333333 33333333 33333333 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 33 with bits = #3fff4ccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 3 bytes: "1.3" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc fI[1] = #3fff4ccc cccccccc cccccccc cccccccd fI[1] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 25 with bits = #bfff4ccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 37 bytes: "-1.2999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd fI[1] = #bfff4ccc cccccccc cccccccc cccccccc fI[1] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 33 with bits = #3fff6666 66666666 66666666 66666667 g_Qfmt(0) gives 36 bytes: "1.4000000000000000000000000000000001" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 fI[1] = #3fff6666 66666666 66666666 66666667 fI[1] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 fI[1] = #bfff6666 66666666 66666666 66666666 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 Input: 1.6 strtoQ consumes 3 bytes and returns 33 with bits = #3fff9999 99999999 99999999 9999999a g_Qfmt(0) gives 3 bytes: "1.6" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 fI[1] = #3fff9999 99999999 99999999 9999999a fI[1] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 25 with bits = #bfff9999 99999999 99999999 99999999 g_Qfmt(0) gives 37 bytes: "-1.5999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a fI[1] = #bfff9999 99999999 99999999 99999999 fI[1] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 33 with bits = #3fffb333 33333333 33333333 33333334 g_Qfmt(0) gives 36 bytes: "1.7000000000000000000000000000000002" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 fI[1] = #3fffb333 33333333 33333333 33333334 fI[1] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 fI[1] = #bfffb333 33333333 33333333 33333333 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 33 with bits = #3fffcccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 3 bytes: "1.8" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc fI[1] = #3fffcccc cccccccc cccccccc cccccccd fI[1] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 25 with bits = #bfffcccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 37 bytes: "-1.7999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd fI[1] = #bfffcccc cccccccc cccccccc cccccccc fI[1] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 33 with bits = #3fffe666 66666666 66666666 66666667 g_Qfmt(0) gives 36 bytes: "1.9000000000000000000000000000000001" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 fI[1] = #3fffe666 66666666 66666666 66666667 fI[1] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 fI[1] = #bfffe666 66666666 66666666 66666666 fI[1] == strtod Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtoQ consumes 3 bytes and returns 17 with bits = #3fff1999 99999999 99999999 99999999 g_Qfmt(0) gives 36 bytes: "1.0999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 fI[1] = #3fff1999 99999999 99999999 9999999a fI[0] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 41 with bits = #bfff1999 99999999 99999999 9999999a g_Qfmt(0) gives 4 bytes: "-1.1" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a fI[1] = #bfff1999 99999999 99999999 99999999 fI[0] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 fI[1] = #3fff3333 33333333 33333333 33333334 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 41 with bits = #bfff3333 33333333 33333333 33333334 g_Qfmt(0) gives 37 bytes: "-1.2000000000000000000000000000000002" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 fI[1] = #bfff3333 33333333 33333333 33333333 fI[0] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 17 with bits = #3fff4ccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 36 bytes: "1.2999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc fI[1] = #3fff4ccc cccccccc cccccccc cccccccd fI[0] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 41 with bits = #bfff4ccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 4 bytes: "-1.3" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd fI[1] = #bfff4ccc cccccccc cccccccc cccccccc fI[0] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 fI[1] = #3fff6666 66666666 66666666 66666667 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 41 with bits = #bfff6666 66666666 66666666 66666667 g_Qfmt(0) gives 37 bytes: "-1.4000000000000000000000000000000001" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 fI[1] = #bfff6666 66666666 66666666 66666666 fI[0] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 Input: 1.6 strtoQ consumes 3 bytes and returns 17 with bits = #3fff9999 99999999 99999999 99999999 g_Qfmt(0) gives 36 bytes: "1.5999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 fI[1] = #3fff9999 99999999 99999999 9999999a fI[0] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 41 with bits = #bfff9999 99999999 99999999 9999999a g_Qfmt(0) gives 4 bytes: "-1.6" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a fI[1] = #bfff9999 99999999 99999999 99999999 fI[0] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 fI[1] = #3fffb333 33333333 33333333 33333334 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 41 with bits = #bfffb333 33333333 33333333 33333334 g_Qfmt(0) gives 37 bytes: "-1.7000000000000000000000000000000002" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 fI[1] = #bfffb333 33333333 33333333 33333333 fI[0] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 17 with bits = #3fffcccc cccccccc cccccccc cccccccc g_Qfmt(0) gives 36 bytes: "1.7999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc fI[1] = #3fffcccc cccccccc cccccccc cccccccd fI[0] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 41 with bits = #bfffcccc cccccccc cccccccc cccccccd g_Qfmt(0) gives 4 bytes: "-1.8" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd fI[1] = #bfffcccc cccccccc cccccccc cccccccc fI[0] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 fI[1] = #3fffe666 66666666 66666666 66666667 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 41 with bits = #bfffe666 66666666 66666666 66666667 g_Qfmt(0) gives 37 bytes: "-1.9000000000000000000000000000000001" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 fI[1] = #bfffe666 66666666 66666666 66666666 fI[0] == strtod mlton-20210117+dfsg/runtime/gdtoa/test/Q.ou1000066400000000000000000001156501416264345000204240ustar00rootroot00000000000000 Input: 1.23 strtoQ consumes 4 bytes and returns 17 with bits = #3fff3ae1 47ae147a e147ae14 7ae147ae printf("%.35Lg") gives 1.23 g_Qfmt(0) gives 4 bytes: "1.23" strtoIQ returns 17, consuming 4 bytes. fI[0] = #3fff3ae1 47ae147a e147ae14 7ae147ae = 1.23 fI[1] = #3fff3ae1 47ae147a e147ae14 7ae147af = 1.2300000000000000000000000000000002 fI[0] == strtod Input: 1.23e+20 strtoQ consumes 8 bytes and returns 1 with bits = #4041aabd f2145b43 0 0 printf("%.35Lg") gives 123000000000000000000 g_Qfmt(0) gives 8 bytes: "1.23e+20" strtoIQ returns 1, consuming 8 bytes. fI[0] == fI[1] = #4041aabd f2145b43 0 0 = 123000000000000000000 Input: 1.23e-20 strtoQ consumes 8 bytes and returns 17 with bits = #3fbcd0ae 4cf76753 9e4cbca ad934841 printf("%.35Lg") gives 1.2299999999999999999999999999999999e-20 g_Qfmt(0) gives 8 bytes: "1.23e-20" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3fbcd0ae 4cf76753 9e4cbca ad934841 = 1.2299999999999999999999999999999999e-20 fI[1] = #3fbcd0ae 4cf76753 9e4cbca ad934842 = 1.2300000000000000000000000000000001e-20 fI[0] == strtod Input: 1.23456789 strtoQ consumes 10 bytes and returns 17 with bits = #3fff3c0c a4283de1 b7eb6945 1304948f printf("%.35Lg") gives 1.2345678899999999999999999999999999 g_Qfmt(0) gives 10 bytes: "1.23456789" strtoIQ returns 17, consuming 10 bytes. fI[0] = #3fff3c0c a4283de1 b7eb6945 1304948f = 1.2345678899999999999999999999999999 fI[1] = #3fff3c0c a4283de1 b7eb6945 13049490 = 1.2345678900000000000000000000000001 fI[0] == strtod Input: 1.23456589e+20 strtoQ consumes 14 bytes and returns 1 with bits = #4041ac53 7a660b99 74000000 0 printf("%.35Lg") gives 123456589000000000000 g_Qfmt(0) gives 14 bytes: "1.23456589e+20" strtoIQ returns 1, consuming 14 bytes. fI[0] == fI[1] = #4041ac53 7a660b99 74000000 0 = 123456589000000000000 Input: 1.23e+30 strtoQ consumes 8 bytes and returns 1 with bits = #4062f0cb 4e8fb79 4945600 0 printf("%.35Lg") gives 1230000000000000000000000000000 g_Qfmt(0) gives 8 bytes: "1.23e+30" strtoIQ returns 1, consuming 8 bytes. fI[0] == fI[1] = #4062f0cb 4e8fb79 4945600 0 = 1230000000000000000000000000000 Input: 1.23e-30 strtoQ consumes 8 bytes and returns 17 with bits = #3f9b8f28 66f5010a a9d63f9e d7e8ba14 printf("%.35Lg") gives 1.2299999999999999999999999999999999e-30 g_Qfmt(0) gives 8 bytes: "1.23e-30" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3f9b8f28 66f5010a a9d63f9e d7e8ba14 = 1.2299999999999999999999999999999999e-30 fI[1] = #3f9b8f28 66f5010a a9d63f9e d7e8ba15 = 1.2300000000000000000000000000000001e-30 fI[0] == strtod Input: 1.23456789e-20 strtoQ consumes 14 bytes and returns 33 with bits = #3fbcd268 1471e7ad a6a4a029 d86c1fa2 printf("%.35Lg") gives 1.2345678900000000000000000000000001e-20 g_Qfmt(0) gives 14 bytes: "1.23456789e-20" strtoIQ returns 33, consuming 14 bytes. fI[0] = #3fbcd268 1471e7ad a6a4a029 d86c1fa1 = 1.2345678899999999999999999999999999e-20 fI[1] = #3fbcd268 1471e7ad a6a4a029 d86c1fa2 = 1.2345678900000000000000000000000001e-20 fI[1] == strtod Input: 1.23456789e-30 strtoQ consumes 14 bytes and returns 17 with bits = #3f9b90a3 e33bbd99 51f85855 5a6b19d4 printf("%.35Lg") gives 1.23456789e-30 g_Qfmt(0) gives 14 bytes: "1.23456789e-30" strtoIQ returns 17, consuming 14 bytes. fI[0] = #3f9b90a3 e33bbd99 51f85855 5a6b19d4 = 1.23456789e-30 fI[1] = #3f9b90a3 e33bbd99 51f85855 5a6b19d5 = 1.2345678900000000000000000000000001e-30 fI[0] == strtod Input: 1.234567890123456789 strtoQ consumes 20 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a4194 68dd175b printf("%.35Lg") gives 1.234567890123456789 g_Qfmt(0) gives 20 bytes: "1.234567890123456789" strtoIQ returns 17, consuming 20 bytes. fI[0] = #3fff3c0c a428c59f b71a4194 68dd175b = 1.234567890123456789 fI[1] = #3fff3c0c a428c59f b71a4194 68dd175c = 1.2345678901234567890000000000000002 fI[0] == strtod Input: 1.23456789012345678901234567890123456789 strtoQ consumes 40 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a7be1 6b6b6d5b printf("%.35Lg") gives 1.2345678901234567890123456789012346 g_Qfmt(0) gives 36 bytes: "1.2345678901234567890123456789012346" strtoIQ returns 17, consuming 40 bytes. fI[0] = #3fff3c0c a428c59f b71a7be1 6b6b6d5b = 1.2345678901234567890123456789012346 fI[1] = #3fff3c0c a428c59f b71a7be1 6b6b6d5c = 1.2345678901234567890123456789012347 fI[0] == strtod Input: 1.23e306 strtoQ consumes 8 bytes and returns 33 with bits = #43f7c067 6cd1c61f 4daac5f1 e9fa3b55 printf("%.35Lg") gives 1.23e+306 g_Qfmt(0) gives 9 bytes: "1.23e+306" strtoIQ returns 33, consuming 8 bytes. fI[0] = #43f7c067 6cd1c61f 4daac5f1 e9fa3b54 = 1.2299999999999999999999999999999999e+306 fI[1] = #43f7c067 6cd1c61f 4daac5f1 e9fa3b55 = 1.23e+306 fI[1] == strtod Input: 1.23e-306 strtoQ consumes 9 bytes and returns 17 with bits = #3c06ba3b 85da396e 7e496ab7 d233c3dd printf("%.35Lg") gives 1.23e-306 g_Qfmt(0) gives 9 bytes: "1.23e-306" strtoIQ returns 17, consuming 9 bytes. fI[0] = #3c06ba3b 85da396e 7e496ab7 d233c3dd = 1.23e-306 fI[1] = #3c06ba3b 85da396e 7e496ab7 d233c3de = 1.2300000000000000000000000000000001e-306 fI[0] == strtod Input: 1.23e-320 strtoQ consumes 9 bytes and returns 33 with bits = #3bd83731 86e30898 7e33b2e8 355f847b printf("%.35Lg") gives 1.2300000000000000000000000000000001e-320 g_Qfmt(0) gives 9 bytes: "1.23e-320" strtoIQ returns 33, consuming 9 bytes. fI[0] = #3bd83731 86e30898 7e33b2e8 355f847a = 1.2299999999999999999999999999999999e-320 fI[1] = #3bd83731 86e30898 7e33b2e8 355f847b = 1.2300000000000000000000000000000001e-320 fI[1] == strtod Input: 1.23e-20 strtoQ consumes 8 bytes and returns 17 with bits = #3fbcd0ae 4cf76753 9e4cbca ad934841 printf("%.35Lg") gives 1.2299999999999999999999999999999999e-20 g_Qfmt(0) gives 8 bytes: "1.23e-20" strtoIQ returns 17, consuming 8 bytes. fI[0] = #3fbcd0ae 4cf76753 9e4cbca ad934841 = 1.2299999999999999999999999999999999e-20 fI[1] = #3fbcd0ae 4cf76753 9e4cbca ad934842 = 1.2300000000000000000000000000000001e-20 fI[0] == strtod Input: 1.23456789e307 strtoQ consumes 14 bytes and returns 17 with bits = #43fb194b 14bdaecd bcea468c 902464cf printf("%.35Lg") gives 1.2345678899999999999999999999999999e+307 g_Qfmt(0) gives 15 bytes: "1.23456789e+307" strtoIQ returns 17, consuming 14 bytes. fI[0] = #43fb194b 14bdaecd bcea468c 902464cf = 1.2345678899999999999999999999999999e+307 fI[1] = #43fb194b 14bdaecd bcea468c 902464d0 = 1.2345678900000000000000000000000001e+307 fI[0] == strtod Input: 1.23456589e-307 strtoQ consumes 15 bytes and returns 17 with bits = #3c036319 6bb9845f a6d234e3 39163574 printf("%.35Lg") gives 1.23456589e-307 g_Qfmt(0) gives 15 bytes: "1.23456589e-307" strtoIQ returns 17, consuming 15 bytes. fI[0] = #3c036319 6bb9845f a6d234e3 39163574 = 1.23456589e-307 fI[1] = #3c036319 6bb9845f a6d234e3 39163575 = 1.2345658900000000000000000000000002e-307 fI[0] == strtod Input: 1.234567890123456789 strtoQ consumes 20 bytes and returns 17 with bits = #3fff3c0c a428c59f b71a4194 68dd175b printf("%.35Lg") gives 1.234567890123456789 g_Qfmt(0) gives 20 bytes: "1.234567890123456789" strtoIQ returns 17, consuming 20 bytes. fI[0] = #3fff3c0c a428c59f b71a4194 68dd175b = 1.234567890123456789 fI[1] = #3fff3c0c a428c59f b71a4194 68dd175c = 1.2345678901234567890000000000000002 fI[0] == strtod Input: 1.234567890123456789e301 strtoQ consumes 24 bytes and returns 33 with bits = #43e726f5 175f5641 3017ea80 763990ef printf("%.35Lg") gives 1.2345678901234567890000000000000001e+301 g_Qfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIQ returns 33, consuming 24 bytes. fI[0] = #43e726f5 175f5641 3017ea80 763990ee = 1.2345678901234567889999999999999999e+301 fI[1] = #43e726f5 175f5641 3017ea80 763990ef = 1.2345678901234567890000000000000001e+301 fI[1] == strtod Input: 1.234567890123456789e-301 strtoQ consumes 25 bytes and returns 17 with bits = #3c1752a6 4e34ba0d 35b19b04 3222fce5 printf("%.35Lg") gives 1.234567890123456789e-301 g_Qfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIQ returns 17, consuming 25 bytes. fI[0] = #3c1752a6 4e34ba0d 35b19b04 3222fce5 = 1.234567890123456789e-301 fI[1] = #3c1752a6 4e34ba0d 35b19b04 3222fce6 = 1.2345678901234567890000000000000002e-301 fI[0] == strtod Input: 1.234567890123456789e-321 strtoQ consumes 25 bytes and returns 17 with bits = #3bd4f3c2 3699d4db 99d1ea94 2fecd7de printf("%.35Lg") gives 1.234567890123456789e-321 g_Qfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIQ returns 17, consuming 25 bytes. fI[0] = #3bd4f3c2 3699d4db 99d1ea94 2fecd7de = 1.234567890123456789e-321 fI[1] = #3bd4f3c2 3699d4db 99d1ea94 2fecd7df = 1.2345678901234567890000000000000001e-321 fI[0] == strtod Input: 1e23 strtoQ consumes 4 bytes and returns 1 with bits = #404b52d0 2c7e14af 68000000 0 printf("%.35Lg") gives 100000000000000000000000 g_Qfmt(0) gives 5 bytes: "1e+23" strtoIQ returns 1, consuming 4 bytes. fI[0] == fI[1] = #404b52d0 2c7e14af 68000000 0 = 100000000000000000000000 Input: 1e310 strtoQ consumes 5 bytes and returns 33 with bits = #4404bd03 c8140697 9e9ff00e fefd4cbd printf("%.35Lg") gives 1e+310 g_Qfmt(0) gives 6 bytes: "1e+310" strtoIQ returns 33, consuming 5 bytes. fI[0] = #4404bd03 c8140697 9e9ff00e fefd4cbc = 9.9999999999999999999999999999999992e+309 fI[1] = #4404bd03 c8140697 9e9ff00e fefd4cbd = 1e+310 fI[1] == strtod Input: 9.0259718793241475e-277 strtoQ consumes 23 bytes and returns 17 with bits = #3c69ffff ffffffff f9ed5779 ac118fe1 printf("%.35Lg") gives 9.0259718793241474999999999999999997e-277 g_Qfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIQ returns 17, consuming 23 bytes. fI[0] = #3c69ffff ffffffff f9ed5779 ac118fe1 = 9.0259718793241474999999999999999997e-277 fI[1] = #3c69ffff ffffffff f9ed5779 ac118fe2 = 9.0259718793241475000000000000000006e-277 fI[0] == strtod Input: 9.025971879324147880346310405869e-277 strtoQ consumes 37 bytes and returns 33 with bits = #3c6a0000 0 0 9a printf("%.35Lg") gives 9.0259718793241478803463104058690004e-277 g_Qfmt(0) gives 37 bytes: "9.025971879324147880346310405869e-277" strtoIQ returns 33, consuming 37 bytes. fI[0] = #3c6a0000 0 0 99 = 9.0259718793241478803463104058689987e-277 fI[1] = #3c6a0000 0 0 9a = 9.0259718793241478803463104058690004e-277 fI[1] == strtod Input: 9.025971879324147880346310405868e-277 strtoQ consumes 37 bytes and returns 17 with bits = #3c69ffff ffffffff ffffffff fffffcb5 printf("%.35Lg") gives 9.025971879324147880346310405868e-277 g_Qfmt(0) gives 37 bytes: "9.025971879324147880346310405868e-277" strtoIQ returns 17, consuming 37 bytes. fI[0] = #3c69ffff ffffffff ffffffff fffffcb5 = 9.025971879324147880346310405868e-277 fI[1] = #3c69ffff ffffffff ffffffff fffffcb6 = 9.0259718793241478803463104058680009e-277 fI[0] == strtod Input: 2.2250738585072014e-308 strtoQ consumes 23 bytes and returns 33 with bits = #3c010000 0 8c304c cf867de0 printf("%.35Lg") gives 2.2250738585072014000000000000000001e-308 g_Qfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIQ returns 33, consuming 23 bytes. fI[0] = #3c010000 0 8c304c cf867ddf = 2.2250738585072013999999999999999997e-308 fI[1] = #3c010000 0 8c304c cf867de0 = 2.2250738585072014000000000000000001e-308 fI[1] == strtod Input: 2.2250738585072013e-308 strtoQ consumes 23 bytes and returns 33 with bits = #3c00ffff ffffffff fa9e4c4f 4c1e8a10 printf("%.35Lg") gives 2.2250738585072013e-308 g_Qfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIQ returns 33, consuming 23 bytes. fI[0] = #3c00ffff ffffffff fa9e4c4f 4c1e8a0f = 2.2250738585072012999999999999999998e-308 fI[1] = #3c00ffff ffffffff fa9e4c4f 4c1e8a10 = 2.2250738585072013e-308 fI[1] == strtod Input: 3.2649476e14 strtoQ consumes 12 bytes and returns 1 with bits = #402f28f1 fc30da00 0 0 printf("%.35Lg") gives 326494760000000 g_Qfmt(0) gives 13 bytes: "3.2649476e+14" strtoIQ returns 1, consuming 12 bytes. fI[0] == fI[1] = #402f28f1 fc30da00 0 0 = 326494760000000 Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtoQ consumes 3 bytes and returns 17 with bits = #3fff1999 99999999 99999999 99999999 printf("%.35Lg") gives 1.0999999999999999999999999999999999 g_Qfmt(0) gives 36 bytes: "1.0999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 = 1.0999999999999999999999999999999999 fI[1] = #3fff1999 99999999 99999999 9999999a = 1.1000000000000000000000000000000001 fI[0] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 25 with bits = #bfff1999 99999999 99999999 99999999 printf("%.35Lg") gives -1.0999999999999999999999999999999999 g_Qfmt(0) gives 37 bytes: "-1.0999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a = -1.1000000000000000000000000000000001 fI[1] = #bfff1999 99999999 99999999 99999999 = -1.0999999999999999999999999999999999 fI[1] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 printf("%.35Lg") gives 1.2 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 = 1.2 fI[1] = #3fff3333 33333333 33333333 33333334 = 1.2000000000000000000000000000000002 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 printf("%.35Lg") gives -1.2 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 = -1.2000000000000000000000000000000002 fI[1] = #bfff3333 33333333 33333333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 17 with bits = #3fff4ccc cccccccc cccccccc cccccccc printf("%.35Lg") gives 1.2999999999999999999999999999999998 g_Qfmt(0) gives 36 bytes: "1.2999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc = 1.2999999999999999999999999999999998 fI[1] = #3fff4ccc cccccccc cccccccc cccccccd = 1.3 fI[0] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 25 with bits = #bfff4ccc cccccccc cccccccc cccccccc printf("%.35Lg") gives -1.2999999999999999999999999999999998 g_Qfmt(0) gives 37 bytes: "-1.2999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd = -1.3 fI[1] = #bfff4ccc cccccccc cccccccc cccccccc = -1.2999999999999999999999999999999998 fI[1] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 printf("%.35Lg") gives 1.3999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 = 1.3999999999999999999999999999999999 fI[1] = #3fff6666 66666666 66666666 66666667 = 1.4000000000000000000000000000000001 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 printf("%.35Lg") gives -1.3999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 = -1.4000000000000000000000000000000001 fI[1] = #bfff6666 66666666 66666666 66666666 = -1.3999999999999999999999999999999999 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 printf("%.35Lg") gives 1.5 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 = 1.5 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 printf("%.35Lg") gives -1.5 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 = -1.5 Input: 1.6 strtoQ consumes 3 bytes and returns 17 with bits = #3fff9999 99999999 99999999 99999999 printf("%.35Lg") gives 1.5999999999999999999999999999999999 g_Qfmt(0) gives 36 bytes: "1.5999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 = 1.5999999999999999999999999999999999 fI[1] = #3fff9999 99999999 99999999 9999999a = 1.6000000000000000000000000000000001 fI[0] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 25 with bits = #bfff9999 99999999 99999999 99999999 printf("%.35Lg") gives -1.5999999999999999999999999999999999 g_Qfmt(0) gives 37 bytes: "-1.5999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a = -1.6000000000000000000000000000000001 fI[1] = #bfff9999 99999999 99999999 99999999 = -1.5999999999999999999999999999999999 fI[1] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 printf("%.35Lg") gives 1.7 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 = 1.7 fI[1] = #3fffb333 33333333 33333333 33333334 = 1.7000000000000000000000000000000002 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 printf("%.35Lg") gives -1.7 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 = -1.7000000000000000000000000000000002 fI[1] = #bfffb333 33333333 33333333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 17 with bits = #3fffcccc cccccccc cccccccc cccccccc printf("%.35Lg") gives 1.7999999999999999999999999999999998 g_Qfmt(0) gives 36 bytes: "1.7999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc = 1.7999999999999999999999999999999998 fI[1] = #3fffcccc cccccccc cccccccc cccccccd = 1.8 fI[0] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 25 with bits = #bfffcccc cccccccc cccccccc cccccccc printf("%.35Lg") gives -1.7999999999999999999999999999999998 g_Qfmt(0) gives 37 bytes: "-1.7999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd = -1.8 fI[1] = #bfffcccc cccccccc cccccccc cccccccc = -1.7999999999999999999999999999999998 fI[1] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 printf("%.35Lg") gives 1.8999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 = 1.8999999999999999999999999999999999 fI[1] = #3fffe666 66666666 66666666 66666667 = 1.9000000000000000000000000000000001 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 printf("%.35Lg") gives -1.8999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 = -1.9000000000000000000000000000000001 fI[1] = #bfffe666 66666666 66666666 66666666 = -1.8999999999999999999999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtoQ consumes 3 bytes and returns 33 with bits = #3fff1999 99999999 99999999 9999999a printf("%.35Lg") gives 1.1000000000000000000000000000000001 g_Qfmt(0) gives 3 bytes: "1.1" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 = 1.0999999999999999999999999999999999 fI[1] = #3fff1999 99999999 99999999 9999999a = 1.1000000000000000000000000000000001 fI[1] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 41 with bits = #bfff1999 99999999 99999999 9999999a printf("%.35Lg") gives -1.1000000000000000000000000000000001 g_Qfmt(0) gives 4 bytes: "-1.1" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a = -1.1000000000000000000000000000000001 fI[1] = #bfff1999 99999999 99999999 99999999 = -1.0999999999999999999999999999999999 fI[0] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 printf("%.35Lg") gives 1.2 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 = 1.2 fI[1] = #3fff3333 33333333 33333333 33333334 = 1.2000000000000000000000000000000002 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 printf("%.35Lg") gives -1.2 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 = -1.2000000000000000000000000000000002 fI[1] = #bfff3333 33333333 33333333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 33 with bits = #3fff4ccc cccccccc cccccccc cccccccd printf("%.35Lg") gives 1.3 g_Qfmt(0) gives 3 bytes: "1.3" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc = 1.2999999999999999999999999999999998 fI[1] = #3fff4ccc cccccccc cccccccc cccccccd = 1.3 fI[1] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 41 with bits = #bfff4ccc cccccccc cccccccc cccccccd printf("%.35Lg") gives -1.3 g_Qfmt(0) gives 4 bytes: "-1.3" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd = -1.3 fI[1] = #bfff4ccc cccccccc cccccccc cccccccc = -1.2999999999999999999999999999999998 fI[0] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 printf("%.35Lg") gives 1.3999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 = 1.3999999999999999999999999999999999 fI[1] = #3fff6666 66666666 66666666 66666667 = 1.4000000000000000000000000000000001 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 printf("%.35Lg") gives -1.3999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 = -1.4000000000000000000000000000000001 fI[1] = #bfff6666 66666666 66666666 66666666 = -1.3999999999999999999999999999999999 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 printf("%.35Lg") gives 1.5 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 = 1.5 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 printf("%.35Lg") gives -1.5 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 = -1.5 Input: 1.6 strtoQ consumes 3 bytes and returns 33 with bits = #3fff9999 99999999 99999999 9999999a printf("%.35Lg") gives 1.6000000000000000000000000000000001 g_Qfmt(0) gives 3 bytes: "1.6" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 = 1.5999999999999999999999999999999999 fI[1] = #3fff9999 99999999 99999999 9999999a = 1.6000000000000000000000000000000001 fI[1] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 41 with bits = #bfff9999 99999999 99999999 9999999a printf("%.35Lg") gives -1.6000000000000000000000000000000001 g_Qfmt(0) gives 4 bytes: "-1.6" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a = -1.6000000000000000000000000000000001 fI[1] = #bfff9999 99999999 99999999 99999999 = -1.5999999999999999999999999999999999 fI[0] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 printf("%.35Lg") gives 1.7 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 = 1.7 fI[1] = #3fffb333 33333333 33333333 33333334 = 1.7000000000000000000000000000000002 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 printf("%.35Lg") gives -1.7 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 = -1.7000000000000000000000000000000002 fI[1] = #bfffb333 33333333 33333333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 33 with bits = #3fffcccc cccccccc cccccccc cccccccd printf("%.35Lg") gives 1.8 g_Qfmt(0) gives 3 bytes: "1.8" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc = 1.7999999999999999999999999999999998 fI[1] = #3fffcccc cccccccc cccccccc cccccccd = 1.8 fI[1] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 41 with bits = #bfffcccc cccccccc cccccccc cccccccd printf("%.35Lg") gives -1.8 g_Qfmt(0) gives 4 bytes: "-1.8" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd = -1.8 fI[1] = #bfffcccc cccccccc cccccccc cccccccc = -1.7999999999999999999999999999999998 fI[0] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 printf("%.35Lg") gives 1.8999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 = 1.8999999999999999999999999999999999 fI[1] = #3fffe666 66666666 66666666 66666667 = 1.9000000000000000000000000000000001 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 printf("%.35Lg") gives -1.8999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 = -1.9000000000000000000000000000000001 fI[1] = #bfffe666 66666666 66666666 66666666 = -1.8999999999999999999999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtoQ consumes 3 bytes and returns 33 with bits = #3fff1999 99999999 99999999 9999999a printf("%.35Lg") gives 1.1000000000000000000000000000000001 g_Qfmt(0) gives 3 bytes: "1.1" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 = 1.0999999999999999999999999999999999 fI[1] = #3fff1999 99999999 99999999 9999999a = 1.1000000000000000000000000000000001 fI[1] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 25 with bits = #bfff1999 99999999 99999999 99999999 printf("%.35Lg") gives -1.0999999999999999999999999999999999 g_Qfmt(0) gives 37 bytes: "-1.0999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a = -1.1000000000000000000000000000000001 fI[1] = #bfff1999 99999999 99999999 99999999 = -1.0999999999999999999999999999999999 fI[1] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 33 with bits = #3fff3333 33333333 33333333 33333334 printf("%.35Lg") gives 1.2000000000000000000000000000000002 g_Qfmt(0) gives 36 bytes: "1.2000000000000000000000000000000002" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 = 1.2 fI[1] = #3fff3333 33333333 33333333 33333334 = 1.2000000000000000000000000000000002 fI[1] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 25 with bits = #bfff3333 33333333 33333333 33333333 printf("%.35Lg") gives -1.2 g_Qfmt(0) gives 4 bytes: "-1.2" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 = -1.2000000000000000000000000000000002 fI[1] = #bfff3333 33333333 33333333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 33 with bits = #3fff4ccc cccccccc cccccccc cccccccd printf("%.35Lg") gives 1.3 g_Qfmt(0) gives 3 bytes: "1.3" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc = 1.2999999999999999999999999999999998 fI[1] = #3fff4ccc cccccccc cccccccc cccccccd = 1.3 fI[1] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 25 with bits = #bfff4ccc cccccccc cccccccc cccccccc printf("%.35Lg") gives -1.2999999999999999999999999999999998 g_Qfmt(0) gives 37 bytes: "-1.2999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd = -1.3 fI[1] = #bfff4ccc cccccccc cccccccc cccccccc = -1.2999999999999999999999999999999998 fI[1] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 33 with bits = #3fff6666 66666666 66666666 66666667 printf("%.35Lg") gives 1.4000000000000000000000000000000001 g_Qfmt(0) gives 36 bytes: "1.4000000000000000000000000000000001" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 = 1.3999999999999999999999999999999999 fI[1] = #3fff6666 66666666 66666666 66666667 = 1.4000000000000000000000000000000001 fI[1] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 25 with bits = #bfff6666 66666666 66666666 66666666 printf("%.35Lg") gives -1.3999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.4" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 = -1.4000000000000000000000000000000001 fI[1] = #bfff6666 66666666 66666666 66666666 = -1.3999999999999999999999999999999999 fI[1] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 printf("%.35Lg") gives 1.5 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 = 1.5 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 printf("%.35Lg") gives -1.5 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 = -1.5 Input: 1.6 strtoQ consumes 3 bytes and returns 33 with bits = #3fff9999 99999999 99999999 9999999a printf("%.35Lg") gives 1.6000000000000000000000000000000001 g_Qfmt(0) gives 3 bytes: "1.6" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 = 1.5999999999999999999999999999999999 fI[1] = #3fff9999 99999999 99999999 9999999a = 1.6000000000000000000000000000000001 fI[1] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 25 with bits = #bfff9999 99999999 99999999 99999999 printf("%.35Lg") gives -1.5999999999999999999999999999999999 g_Qfmt(0) gives 37 bytes: "-1.5999999999999999999999999999999999" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a = -1.6000000000000000000000000000000001 fI[1] = #bfff9999 99999999 99999999 99999999 = -1.5999999999999999999999999999999999 fI[1] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 33 with bits = #3fffb333 33333333 33333333 33333334 printf("%.35Lg") gives 1.7000000000000000000000000000000002 g_Qfmt(0) gives 36 bytes: "1.7000000000000000000000000000000002" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 = 1.7 fI[1] = #3fffb333 33333333 33333333 33333334 = 1.7000000000000000000000000000000002 fI[1] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 25 with bits = #bfffb333 33333333 33333333 33333333 printf("%.35Lg") gives -1.7 g_Qfmt(0) gives 4 bytes: "-1.7" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 = -1.7000000000000000000000000000000002 fI[1] = #bfffb333 33333333 33333333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 33 with bits = #3fffcccc cccccccc cccccccc cccccccd printf("%.35Lg") gives 1.8 g_Qfmt(0) gives 3 bytes: "1.8" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc = 1.7999999999999999999999999999999998 fI[1] = #3fffcccc cccccccc cccccccc cccccccd = 1.8 fI[1] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 25 with bits = #bfffcccc cccccccc cccccccc cccccccc printf("%.35Lg") gives -1.7999999999999999999999999999999998 g_Qfmt(0) gives 37 bytes: "-1.7999999999999999999999999999999998" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd = -1.8 fI[1] = #bfffcccc cccccccc cccccccc cccccccc = -1.7999999999999999999999999999999998 fI[1] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 33 with bits = #3fffe666 66666666 66666666 66666667 printf("%.35Lg") gives 1.9000000000000000000000000000000001 g_Qfmt(0) gives 36 bytes: "1.9000000000000000000000000000000001" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 = 1.8999999999999999999999999999999999 fI[1] = #3fffe666 66666666 66666666 66666667 = 1.9000000000000000000000000000000001 fI[1] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 25 with bits = #bfffe666 66666666 66666666 66666666 printf("%.35Lg") gives -1.8999999999999999999999999999999999 g_Qfmt(0) gives 4 bytes: "-1.9" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 = -1.9000000000000000000000000000000001 fI[1] = #bfffe666 66666666 66666666 66666666 = -1.8999999999999999999999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtoQ consumes 3 bytes and returns 17 with bits = #3fff1999 99999999 99999999 99999999 printf("%.35Lg") gives 1.0999999999999999999999999999999999 g_Qfmt(0) gives 36 bytes: "1.0999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff1999 99999999 99999999 99999999 = 1.0999999999999999999999999999999999 fI[1] = #3fff1999 99999999 99999999 9999999a = 1.1000000000000000000000000000000001 fI[0] == strtod Input: -1.1 strtoQ consumes 4 bytes and returns 41 with bits = #bfff1999 99999999 99999999 9999999a printf("%.35Lg") gives -1.1000000000000000000000000000000001 g_Qfmt(0) gives 4 bytes: "-1.1" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff1999 99999999 99999999 9999999a = -1.1000000000000000000000000000000001 fI[1] = #bfff1999 99999999 99999999 99999999 = -1.0999999999999999999999999999999999 fI[0] == strtod Input: 1.2 strtoQ consumes 3 bytes and returns 17 with bits = #3fff3333 33333333 33333333 33333333 printf("%.35Lg") gives 1.2 g_Qfmt(0) gives 3 bytes: "1.2" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff3333 33333333 33333333 33333333 = 1.2 fI[1] = #3fff3333 33333333 33333333 33333334 = 1.2000000000000000000000000000000002 fI[0] == strtod Input: -1.2 strtoQ consumes 4 bytes and returns 41 with bits = #bfff3333 33333333 33333333 33333334 printf("%.35Lg") gives -1.2000000000000000000000000000000002 g_Qfmt(0) gives 37 bytes: "-1.2000000000000000000000000000000002" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff3333 33333333 33333333 33333334 = -1.2000000000000000000000000000000002 fI[1] = #bfff3333 33333333 33333333 33333333 = -1.2 fI[0] == strtod Input: 1.3 strtoQ consumes 3 bytes and returns 17 with bits = #3fff4ccc cccccccc cccccccc cccccccc printf("%.35Lg") gives 1.2999999999999999999999999999999998 g_Qfmt(0) gives 36 bytes: "1.2999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff4ccc cccccccc cccccccc cccccccc = 1.2999999999999999999999999999999998 fI[1] = #3fff4ccc cccccccc cccccccc cccccccd = 1.3 fI[0] == strtod Input: -1.3 strtoQ consumes 4 bytes and returns 41 with bits = #bfff4ccc cccccccc cccccccc cccccccd printf("%.35Lg") gives -1.3 g_Qfmt(0) gives 4 bytes: "-1.3" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff4ccc cccccccc cccccccc cccccccd = -1.3 fI[1] = #bfff4ccc cccccccc cccccccc cccccccc = -1.2999999999999999999999999999999998 fI[0] == strtod Input: 1.4 strtoQ consumes 3 bytes and returns 17 with bits = #3fff6666 66666666 66666666 66666666 printf("%.35Lg") gives 1.3999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.4" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fff6666 66666666 66666666 66666666 = 1.3999999999999999999999999999999999 fI[1] = #3fff6666 66666666 66666666 66666667 = 1.4000000000000000000000000000000001 fI[0] == strtod Input: -1.4 strtoQ consumes 4 bytes and returns 41 with bits = #bfff6666 66666666 66666666 66666667 printf("%.35Lg") gives -1.4000000000000000000000000000000001 g_Qfmt(0) gives 37 bytes: "-1.4000000000000000000000000000000001" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfff6666 66666666 66666666 66666667 = -1.4000000000000000000000000000000001 fI[1] = #bfff6666 66666666 66666666 66666666 = -1.3999999999999999999999999999999999 fI[0] == strtod Input: 1.5 strtoQ consumes 3 bytes and returns 1 with bits = #3fff8000 0 0 0 printf("%.35Lg") gives 1.5 g_Qfmt(0) gives 3 bytes: "1.5" strtoIQ returns 1, consuming 3 bytes. fI[0] == fI[1] = #3fff8000 0 0 0 = 1.5 Input: -1.5 strtoQ consumes 4 bytes and returns 9 with bits = #bfff8000 0 0 0 printf("%.35Lg") gives -1.5 g_Qfmt(0) gives 4 bytes: "-1.5" strtoIQ returns 9, consuming 4 bytes. fI[0] == fI[1] = #bfff8000 0 0 0 = -1.5 Input: 1.6 strtoQ consumes 3 bytes and returns 17 with bits = #3fff9999 99999999 99999999 99999999 printf("%.35Lg") gives 1.5999999999999999999999999999999999 g_Qfmt(0) gives 36 bytes: "1.5999999999999999999999999999999999" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fff9999 99999999 99999999 99999999 = 1.5999999999999999999999999999999999 fI[1] = #3fff9999 99999999 99999999 9999999a = 1.6000000000000000000000000000000001 fI[0] == strtod Input: -1.6 strtoQ consumes 4 bytes and returns 41 with bits = #bfff9999 99999999 99999999 9999999a printf("%.35Lg") gives -1.6000000000000000000000000000000001 g_Qfmt(0) gives 4 bytes: "-1.6" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfff9999 99999999 99999999 9999999a = -1.6000000000000000000000000000000001 fI[1] = #bfff9999 99999999 99999999 99999999 = -1.5999999999999999999999999999999999 fI[0] == strtod Input: 1.7 strtoQ consumes 3 bytes and returns 17 with bits = #3fffb333 33333333 33333333 33333333 printf("%.35Lg") gives 1.7 g_Qfmt(0) gives 3 bytes: "1.7" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffb333 33333333 33333333 33333333 = 1.7 fI[1] = #3fffb333 33333333 33333333 33333334 = 1.7000000000000000000000000000000002 fI[0] == strtod Input: -1.7 strtoQ consumes 4 bytes and returns 41 with bits = #bfffb333 33333333 33333333 33333334 printf("%.35Lg") gives -1.7000000000000000000000000000000002 g_Qfmt(0) gives 37 bytes: "-1.7000000000000000000000000000000002" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffb333 33333333 33333333 33333334 = -1.7000000000000000000000000000000002 fI[1] = #bfffb333 33333333 33333333 33333333 = -1.7 fI[0] == strtod Input: 1.8 strtoQ consumes 3 bytes and returns 17 with bits = #3fffcccc cccccccc cccccccc cccccccc printf("%.35Lg") gives 1.7999999999999999999999999999999998 g_Qfmt(0) gives 36 bytes: "1.7999999999999999999999999999999998" strtoIQ returns 33, consuming 3 bytes. fI[0] = #3fffcccc cccccccc cccccccc cccccccc = 1.7999999999999999999999999999999998 fI[1] = #3fffcccc cccccccc cccccccc cccccccd = 1.8 fI[0] == strtod Input: -1.8 strtoQ consumes 4 bytes and returns 41 with bits = #bfffcccc cccccccc cccccccc cccccccd printf("%.35Lg") gives -1.8 g_Qfmt(0) gives 4 bytes: "-1.8" strtoIQ returns 41, consuming 4 bytes. fI[0] = #bfffcccc cccccccc cccccccc cccccccd = -1.8 fI[1] = #bfffcccc cccccccc cccccccc cccccccc = -1.7999999999999999999999999999999998 fI[0] == strtod Input: 1.9 strtoQ consumes 3 bytes and returns 17 with bits = #3fffe666 66666666 66666666 66666666 printf("%.35Lg") gives 1.8999999999999999999999999999999999 g_Qfmt(0) gives 3 bytes: "1.9" strtoIQ returns 17, consuming 3 bytes. fI[0] = #3fffe666 66666666 66666666 66666666 = 1.8999999999999999999999999999999999 fI[1] = #3fffe666 66666666 66666666 66666667 = 1.9000000000000000000000000000000001 fI[0] == strtod Input: -1.9 strtoQ consumes 4 bytes and returns 41 with bits = #bfffe666 66666666 66666666 66666667 printf("%.35Lg") gives -1.9000000000000000000000000000000001 g_Qfmt(0) gives 37 bytes: "-1.9000000000000000000000000000000001" strtoIQ returns 25, consuming 4 bytes. fI[0] = #bfffe666 66666666 66666666 66666667 = -1.9000000000000000000000000000000001 fI[1] = #bfffe666 66666666 66666666 66666666 = -1.8999999999999999999999999999999999 fI[0] == strtod mlton-20210117+dfsg/runtime/gdtoa/test/Qtest.c000066400000000000000000000132771416264345000210440ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_Qfmt, strtoIQ, strtopQ, and strtorQ. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex0 hex1 hex2 hex3 * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex0 is a string of <= 8 Hex digits for the most significant * word of the number, hex1 is a similar string for the next * word, etc., and ndig is a parameters to g_Qfmt. */ #include "gdtoa.h" #include #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[2048], obuf1[2048]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #endif #ifdef IEEE_8087 #define _0 3 #define _1 2 #define _2 1 #define _3 0 #endif #define U (unsigned long) int main(Void) { char *s, *s1, *se, *se1; int Ltest, i, dItry, ndig = 0, nik, nike, r = 1; union { long double d; ULong bits[4]; } u, v[2], w; w.bits[0] = w.bits[3] = 0; w.d = 1.; u.d = 3.; w.d = w.d / u.d; Ltest = sizeof(long double) == 16 && w.bits[0] && w.bits[3]; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': /* sscanf(s+1, "%lx %lx %lx %lx", &u.bits[_0], */ /* &u.bits[_1], &u.bits[_2], &u.bits[_3]); */ u.bits[_0] = (ULong)strtoul(s1 = s+1, &se, 16); if (se > s1) { u.bits[_1] = (ULong)strtoul(s1 = se, &se, 16); if (se > s1) { u.bits[_2] = (ULong)strtoul(s1 = se, &se, 16); if (se > s1) u.bits[_3] = (ULong)strtoul(s1 = se, &se, 16); } } printf("\nInput: %s", ibuf); printf(" --> f = #%lx %lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2], U u.bits[_3]); i = 0; goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorQ(ibuf, &se, r, u.bits); if (r == 1 && (strtopQ(ibuf,&se1,v[0].bits) != i || se != se1 || memcmp(u.bits, v[0].bits, 16))) printf("***strtoQ and strtorQ disagree!!\n:"); printf("\nstrtoQ consumes %d bytes and returns %d\n", (int)(se-ibuf), i); printf("with bits = #%lx %lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2], U u.bits[_3]); fmt_test: if (Ltest) printf("printf(\"%%.35Lg\") gives %.35Lg\n", u.d); se = g_Qfmt(obuf, u.bits, ndig, sizeof(obuf)); printf("g_Qfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_Qfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_Qfmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (!dItry) continue; printf("strtoIQ returns %d,", strtoIQ(ibuf, &se, v[0].bits, v[1].bits)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (!memcmp(v[0].bits, v[1].bits, 16)) { if (!memcpy(u.bits, v[0].bits, 16)) printf("fI[0] == fI[1] == strtoQ\n"); else { printf("fI[0] == fI[1] = #%lx %lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2], U v[0].bits[_3]); if (Ltest) printf("= %.35Lg\n", v[0].d); } } else { printf("fI[0] = #%lx %lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2], U v[0].bits[_3]); if (Ltest) printf("= %.35Lg\n", v[0].d); printf("fI[1] = #%lx %lx %lx %lx\n", U v[1].bits[_0], U v[1].bits[_1], U v[1].bits[_2], U v[1].bits[_3]); if (Ltest) printf("= %.35Lg\n", v[1].d); if (!memcmp(v[0].bits, u.bits, 16)) printf("fI[0] == strtod\n"); else if (!memcmp(v[1].bits, u.bits, 16)) printf("fI[1] == strtod\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_Qfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_Qfmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_Qfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_Qfmt_p(...,%d): \"%s\"\n", nik, obuf1); } } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/README000066400000000000000000000065241416264345000204550ustar00rootroot00000000000000This directory contains source for several test programs: dt is for conversion to/from double; it permits input of pairs of 32-bit hex integers as #hhhhhhhh hhhhhhhh (i.e., the initial '#' indicates hex input). No initial # ==> decimal input. After the input number is an optional : mode ndigits (colon, and decimal integers for parameters "mode" and "ndigits" to gdtoa). Qtest, ddtest, dtest, ftest, xLtest and xtest are for conversion to/from f IEEE single precision d IEEE double precision xL IEEE extended precision, as on Motorola 680x0 chips x IEEE extended precision, as on Intel 80x87 chips or software emulation of Motorola 680x0 chips Q quad precision, as on Sun Sparc chips dd double double, pairs of IEEE double numbers whose sum is the desired value They're all similar, except for the precision. They test both directed roundings and interval input (the strtoI* routines). Lines that begin with "r" specify or interrogate the desired rounding direction: 0 = toward 0 1 = nearest (default) 2 = toward +Infinity 3 = toward -Infinity These are the FPI_Round_* values in gdota.h. The "r" value is sticky: it stays in effect til changed. To change the value, give a line that starts with r followed by 0, 1, 2, or 3. To check the value, give "r" by itself. Lines that begin with n followed by a number specify the ndig argument for subsequent calls to the relevant g_*fmt routine. Lines that start with # followed by the appropriate number of hexadecimal strings (see the comments) give the big-endian internal representation of the desired number. When routines Qtest, xLtest, and xtest are used on machines whose long double is of type "quad" (for Qtest) or "extended" (for x*test), they try to print with %Lg as another way to show binary values. Program ddtest also accepts (white-space separated) pairs of decimal input numbers; it converts both with strtod and feeds the result to g_ddfmt. Program dItest exercises strtodI and strtoId. Programs dItestsi and ddtestsi are for testing the sudden-underflow logic (on double and double-double conversions). Program strtodt tests strtod on some hard cases (in file testnos3) posted by Fred Tydeman to comp.arch.arithmetic on 26 Feb. 1996. To get correct results on Intel (x86) systems, the rounding precision must be set to 53 bits. This can be done, e.g., by invoking fpinit_ASL(), whose source appears in http://www.netlib.org/ampl/solvers/fpinit.c . The obad directory shows results expected on (at least some) Intel x86 Linux systems and may not be relevant to other systems. You can optionally compile getround.c with -DHonor_FLT_ROUNDS to manually test strtof, strtod, etc., using fegetround(). You can also or alternatively compile getround.c with -DUSE_MY_LOCALE (when ../gdtoa.a is compiled with -DUSE_LOCALE) to test multi-byte decimal points. If in the parent directory, you have sucessfully invoked "make Printf" to add a "printf" (called Printf and accessed via ../stdio1.h), then here you can use "make pf_test" and (if you have both a 64-bit long double and a 113-bit "quad" double type) "make pf_testLq" for a brief test of %g and %a variants in Printf. These are simple test programs, not meant for exhaustive testing, but for manually testing "interesting" cases. Paxson's testbase is good for more exhaustive testing, in part with random inputs. See ftp://ftp.ee.lbl.gov/testbase-report.ps.Z . mlton-20210117+dfsg/runtime/gdtoa/test/d.out000066400000000000000000000677061416264345000205620ustar00rootroot00000000000000 Input: 1.23 strtord consumes 4 bytes and returns 17 with f = 1.23 = #3ff3ae14 7ae147ae g_dfmt(0) gives 4 bytes: "1.23" strtoId returns 17, consuming 4 bytes. fI[0] = #3ff3ae14 7ae147ae = 1.23 fI[1] = #3ff3ae14 7ae147af = 1.2300000000000002 fI[0] == strtod Input: 1.23e+20 strtord consumes 8 bytes and returns 1 with f = 1.23e+20 = #441aabdf 2145b430 g_dfmt(0) gives 8 bytes: "1.23e+20" strtoId returns 1, consuming 8 bytes. fI[0] == fI[1] == strtod Input: 1.23e-20 strtord consumes 8 bytes and returns 33 with f = 1.2300000000000001e-20 = #3bcd0ae4 cf767531 g_dfmt(0) gives 8 bytes: "1.23e-20" strtoId returns 33, consuming 8 bytes. fI[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 fI[1] = #3bcd0ae4 cf767531 = 1.2300000000000001e-20 fI[1] == strtod Input: 1.23456789 strtord consumes 10 bytes and returns 17 with f = 1.2345678899999999 = #3ff3c0ca 4283de1b g_dfmt(0) gives 10 bytes: "1.23456789" strtoId returns 17, consuming 10 bytes. fI[0] = #3ff3c0ca 4283de1b = 1.2345678899999999 fI[1] = #3ff3c0ca 4283de1c = 1.2345678900000001 fI[0] == strtod Input: 1.23456589e+20 strtord consumes 14 bytes and returns 17 with f = 1.23456589e+20 = #441ac537 a660b997 g_dfmt(0) gives 14 bytes: "1.23456589e+20" strtoId returns 17, consuming 14 bytes. fI[0] = #441ac537 a660b997 = 1.23456589e+20 fI[1] = #441ac537 a660b998 = 1.2345658900000001e+20 fI[0] == strtod Input: 1.23e+30 strtord consumes 8 bytes and returns 17 with f = 1.23e+30 = #462f0cb0 4e8fb790 g_dfmt(0) gives 8 bytes: "1.23e+30" strtoId returns 17, consuming 8 bytes. fI[0] = #462f0cb0 4e8fb790 = 1.23e+30 fI[1] = #462f0cb0 4e8fb791 = 1.2300000000000001e+30 fI[0] == strtod Input: 1.23e-30 strtord consumes 8 bytes and returns 33 with f = 1.2300000000000001e-30 = #39b8f286 6f5010ab g_dfmt(0) gives 8 bytes: "1.23e-30" strtoId returns 33, consuming 8 bytes. fI[0] = #39b8f286 6f5010aa = 1.2299999999999999e-30 fI[1] = #39b8f286 6f5010ab = 1.2300000000000001e-30 fI[1] == strtod Input: 1.23456789e-20 strtord consumes 14 bytes and returns 17 with f = 1.2345678899999999e-20 = #3bcd2681 471e7ada g_dfmt(0) gives 14 bytes: "1.23456789e-20" strtoId returns 17, consuming 14 bytes. fI[0] = #3bcd2681 471e7ada = 1.2345678899999999e-20 fI[1] = #3bcd2681 471e7adb = 1.2345678900000001e-20 fI[0] == strtod Input: 1.23456789e-30 strtord consumes 14 bytes and returns 17 with f = 1.23456789e-30 = #39b90a3e 33bbd995 g_dfmt(0) gives 14 bytes: "1.23456789e-30" strtoId returns 17, consuming 14 bytes. fI[0] = #39b90a3e 33bbd995 = 1.23456789e-30 fI[1] = #39b90a3e 33bbd996 = 1.2345678900000002e-30 fI[0] == strtod Input: 1.234567890123456789 strtord consumes 20 bytes and returns 17 with f = 1.2345678901234567 = #3ff3c0ca 428c59fb g_dfmt(0) gives 18 bytes: "1.2345678901234567" strtoId returns 17, consuming 20 bytes. fI[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 fI[1] = #3ff3c0ca 428c59fc = 1.2345678901234569 fI[0] == strtod Input: 1.23456789012345678901234567890123456789 strtord consumes 40 bytes and returns 17 with f = 1.2345678901234567 = #3ff3c0ca 428c59fb g_dfmt(0) gives 18 bytes: "1.2345678901234567" strtoId returns 17, consuming 40 bytes. fI[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 fI[1] = #3ff3c0ca 428c59fc = 1.2345678901234569 fI[0] == strtod Input: 1.23e306 strtord consumes 8 bytes and returns 33 with f = 1.23e+306 = #7f7c0676 cd1c61f5 g_dfmt(0) gives 9 bytes: "1.23e+306" strtoId returns 33, consuming 8 bytes. fI[0] = #7f7c0676 cd1c61f4 = 1.2299999999999999e+306 fI[1] = #7f7c0676 cd1c61f5 = 1.23e+306 fI[1] == strtod Input: 1.23e-306 strtord consumes 9 bytes and returns 33 with f = 1.23e-306 = #6ba3b8 5da396e8 g_dfmt(0) gives 9 bytes: "1.23e-306" strtoId returns 33, consuming 9 bytes. fI[0] = #6ba3b8 5da396e7 = 1.2299999999999999e-306 fI[1] = #6ba3b8 5da396e8 = 1.23e-306 fI[1] == strtod Input: 1.23e-320 strtord consumes 9 bytes and returns 98 with f = 1.2302234581447039e-320 = #0 9ba g_dfmt(0) gives 9 bytes: "1.23e-320" strtoId returns 98, consuming 9 bytes. fI[0] = #0 9b9 = 1.2297293924988626e-320 fI[1] = #0 9ba = 1.2302234581447039e-320 fI[1] == strtod Input: 1.23e-20 strtord consumes 8 bytes and returns 33 with f = 1.2300000000000001e-20 = #3bcd0ae4 cf767531 g_dfmt(0) gives 8 bytes: "1.23e-20" strtoId returns 33, consuming 8 bytes. fI[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 fI[1] = #3bcd0ae4 cf767531 = 1.2300000000000001e-20 fI[1] == strtod Input: 1.23456789e307 strtord consumes 14 bytes and returns 33 with f = 1.23456789e+307 = #7fb194b1 4bdaecdc g_dfmt(0) gives 15 bytes: "1.23456789e+307" strtoId returns 33, consuming 14 bytes. fI[0] = #7fb194b1 4bdaecdb = 1.2345678899999998e+307 fI[1] = #7fb194b1 4bdaecdc = 1.23456789e+307 fI[1] == strtod Input: 1.23456589e-307 strtord consumes 15 bytes and returns 17 with f = 1.2345658899999999e-307 = #363196 bb9845fa g_dfmt(0) gives 15 bytes: "1.23456589e-307" strtoId returns 17, consuming 15 bytes. fI[0] = #363196 bb9845fa = 1.2345658899999999e-307 fI[1] = #363196 bb9845fb = 1.2345658900000001e-307 fI[0] == strtod Input: 1.234567890123456789 strtord consumes 20 bytes and returns 17 with f = 1.2345678901234567 = #3ff3c0ca 428c59fb g_dfmt(0) gives 18 bytes: "1.2345678901234567" strtoId returns 17, consuming 20 bytes. fI[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 fI[1] = #3ff3c0ca 428c59fc = 1.2345678901234569 fI[0] == strtod Input: 1.234567890123456789e301 strtord consumes 24 bytes and returns 17 with f = 1.2345678901234568e+301 = #7e726f51 75f56413 g_dfmt(0) gives 23 bytes: "1.2345678901234568e+301" strtoId returns 17, consuming 24 bytes. fI[0] = #7e726f51 75f56413 = 1.2345678901234568e+301 fI[1] = #7e726f51 75f56414 = 1.234567890123457e+301 fI[0] == strtod Input: 1.234567890123456789e-301 strtord consumes 25 bytes and returns 17 with f = 1.2345678901234567e-301 = #1752a64 e34ba0d3 g_dfmt(0) gives 23 bytes: "1.2345678901234567e-301" strtoId returns 17, consuming 25 bytes. fI[0] = #1752a64 e34ba0d3 = 1.2345678901234567e-301 fI[1] = #1752a64 e34ba0d4 = 1.2345678901234569e-301 fI[0] == strtod Input: 1.234567890123456789e-321 strtord consumes 25 bytes and returns 98 with f = 1.2351641146031164e-321 = #0 fa g_dfmt(0) gives 10 bytes: "1.235e-321" strtoId returns 98, consuming 25 bytes. fI[0] = #0 f9 = 1.2302234581447039e-321 fI[1] = #0 fa = 1.2351641146031164e-321 fI[1] == strtod Input: 1e23 strtord consumes 4 bytes and returns 17 with f = 9.9999999999999992e+22 = #44b52d02 c7e14af6 g_dfmt(0) gives 5 bytes: "1e+23" strtoId returns 17, consuming 4 bytes. fI[0] = #44b52d02 c7e14af6 = 9.9999999999999992e+22 fI[1] = #44b52d02 c7e14af7 = 1.0000000000000001e+23 fI[0] == strtod Input: 1e310 strtord consumes 5 bytes and returns 163 with f = Infinity = #7ff00000 0 g_dfmt(0) gives 8 bytes: "Infinity" strtoId returns 163, consuming 5 bytes. fI[0] = #7fefffff ffffffff = 1.7976931348623157e+308 fI[1] = #7ff00000 0 = Infinity fI[1] == strtod g_dfmt_p(...,0): "Infinity" g_dfmt_p(...,1): "Infinity" g_dfmt_p(...,2): "Infinity" g_dfmt_p(...,3): "Infinity" g_dfmt_p(...,4): "Infinity" g_dfmt_p(...,5): "Infinity" Input: 9.0259718793241475e-277 strtord consumes 23 bytes and returns 33 with f = 9.0259718793241479e-277 = #6a00000 0 g_dfmt(0) gives 22 bytes: "9.025971879324148e-277" strtoId returns 33, consuming 23 bytes. fI[0] = #69fffff ffffffff = 9.0259718793241469e-277 fI[1] = #6a00000 0 = 9.0259718793241479e-277 fI[1] == strtod Input: 9.025971879324147880346310405869e-277 strtord consumes 37 bytes and returns 17 with f = 9.0259718793241479e-277 = #6a00000 0 g_dfmt(0) gives 22 bytes: "9.025971879324148e-277" strtoId returns 17, consuming 37 bytes. fI[0] = #6a00000 0 = 9.0259718793241479e-277 fI[1] = #6a00000 1 = 9.0259718793241499e-277 fI[0] == strtod Input: 9.025971879324147880346310405868e-277 strtord consumes 37 bytes and returns 33 with f = 9.0259718793241479e-277 = #6a00000 0 g_dfmt(0) gives 22 bytes: "9.025971879324148e-277" strtoId returns 33, consuming 37 bytes. fI[0] = #69fffff ffffffff = 9.0259718793241469e-277 fI[1] = #6a00000 0 = 9.0259718793241479e-277 fI[1] == strtod Input: 2.2250738585072014e-308 strtord consumes 23 bytes and returns 17 with f = 2.2250738585072014e-308 = #100000 0 g_dfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoId returns 17, consuming 23 bytes. fI[0] = #100000 0 = 2.2250738585072014e-308 fI[1] = #100000 1 = 2.2250738585072019e-308 fI[0] == strtod Input: 2.2250738585072013e-308 strtord consumes 23 bytes and returns 33 with f = 2.2250738585072014e-308 = #100000 0 g_dfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoId returns 33, consuming 23 bytes. fI[0] = #fffff ffffffff = 2.2250738585072009e-308 fI[1] = #100000 0 = 2.2250738585072014e-308 fI[1] == strtod Input: 3.2649476e14 strtord consumes 12 bytes and returns 1 with f = 326494760000000 = #42f28f1f c30da000 g_dfmt(0) gives 13 bytes: "3.2649476e+14" strtoId returns 1, consuming 12 bytes. fI[0] == fI[1] == strtod Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtord consumes 3 bytes and returns 17 with f = 1.0999999999999999 = #3ff19999 99999999 g_dfmt(0) gives 18 bytes: "1.0999999999999999" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff19999 99999999 = 1.0999999999999999 fI[1] = #3ff19999 9999999a = 1.1000000000000001 fI[0] == strtod Input: -1.1 strtord consumes 4 bytes and returns 25 with f = -1.0999999999999999 = #bff19999 99999999 g_dfmt(0) gives 19 bytes: "-1.0999999999999999" strtoId returns 41, consuming 4 bytes. fI[0] = #bff19999 9999999a = -1.1000000000000001 fI[1] = #bff19999 99999999 = -1.0999999999999999 fI[1] == strtod Input: 1.2 strtord consumes 3 bytes and returns 17 with f = 1.2 = #3ff33333 33333333 g_dfmt(0) gives 3 bytes: "1.2" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff33333 33333333 = 1.2 fI[1] = #3ff33333 33333334 = 1.2000000000000002 fI[0] == strtod Input: -1.2 strtord consumes 4 bytes and returns 25 with f = -1.2 = #bff33333 33333333 g_dfmt(0) gives 4 bytes: "-1.2" strtoId returns 25, consuming 4 bytes. fI[0] = #bff33333 33333334 = -1.2000000000000002 fI[1] = #bff33333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtord consumes 3 bytes and returns 17 with f = 1.2999999999999998 = #3ff4cccc cccccccc g_dfmt(0) gives 18 bytes: "1.2999999999999998" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff4cccc cccccccc = 1.2999999999999998 fI[1] = #3ff4cccc cccccccd = 1.3 fI[0] == strtod Input: -1.3 strtord consumes 4 bytes and returns 25 with f = -1.2999999999999998 = #bff4cccc cccccccc g_dfmt(0) gives 19 bytes: "-1.2999999999999998" strtoId returns 41, consuming 4 bytes. fI[0] = #bff4cccc cccccccd = -1.3 fI[1] = #bff4cccc cccccccc = -1.2999999999999998 fI[1] == strtod Input: 1.4 strtord consumes 3 bytes and returns 17 with f = 1.3999999999999999 = #3ff66666 66666666 g_dfmt(0) gives 3 bytes: "1.4" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff66666 66666666 = 1.3999999999999999 fI[1] = #3ff66666 66666667 = 1.4000000000000001 fI[0] == strtod Input: -1.4 strtord consumes 4 bytes and returns 25 with f = -1.3999999999999999 = #bff66666 66666666 g_dfmt(0) gives 4 bytes: "-1.4" strtoId returns 25, consuming 4 bytes. fI[0] = #bff66666 66666667 = -1.4000000000000001 fI[1] = #bff66666 66666666 = -1.3999999999999999 fI[1] == strtod Input: 1.5 strtord consumes 3 bytes and returns 1 with f = 1.5 = #3ff80000 0 g_dfmt(0) gives 3 bytes: "1.5" strtoId returns 1, consuming 3 bytes. fI[0] == fI[1] == strtod Input: -1.5 strtord consumes 4 bytes and returns 9 with f = -1.5 = #bff80000 0 g_dfmt(0) gives 4 bytes: "-1.5" strtoId returns 9, consuming 4 bytes. fI[0] == fI[1] == strtod Input: 1.6 strtord consumes 3 bytes and returns 17 with f = 1.5999999999999999 = #3ff99999 99999999 g_dfmt(0) gives 18 bytes: "1.5999999999999999" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff99999 99999999 = 1.5999999999999999 fI[1] = #3ff99999 9999999a = 1.6000000000000001 fI[0] == strtod Input: -1.6 strtord consumes 4 bytes and returns 25 with f = -1.5999999999999999 = #bff99999 99999999 g_dfmt(0) gives 19 bytes: "-1.5999999999999999" strtoId returns 41, consuming 4 bytes. fI[0] = #bff99999 9999999a = -1.6000000000000001 fI[1] = #bff99999 99999999 = -1.5999999999999999 fI[1] == strtod Input: 1.7 strtord consumes 3 bytes and returns 17 with f = 1.7 = #3ffb3333 33333333 g_dfmt(0) gives 3 bytes: "1.7" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffb3333 33333333 = 1.7 fI[1] = #3ffb3333 33333334 = 1.7000000000000002 fI[0] == strtod Input: -1.7 strtord consumes 4 bytes and returns 25 with f = -1.7 = #bffb3333 33333333 g_dfmt(0) gives 4 bytes: "-1.7" strtoId returns 25, consuming 4 bytes. fI[0] = #bffb3333 33333334 = -1.7000000000000002 fI[1] = #bffb3333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtord consumes 3 bytes and returns 17 with f = 1.7999999999999998 = #3ffccccc cccccccc g_dfmt(0) gives 18 bytes: "1.7999999999999998" strtoId returns 33, consuming 3 bytes. fI[0] = #3ffccccc cccccccc = 1.7999999999999998 fI[1] = #3ffccccc cccccccd = 1.8 fI[0] == strtod Input: -1.8 strtord consumes 4 bytes and returns 25 with f = -1.7999999999999998 = #bffccccc cccccccc g_dfmt(0) gives 19 bytes: "-1.7999999999999998" strtoId returns 41, consuming 4 bytes. fI[0] = #bffccccc cccccccd = -1.8 fI[1] = #bffccccc cccccccc = -1.7999999999999998 fI[1] == strtod Input: 1.9 strtord consumes 3 bytes and returns 17 with f = 1.8999999999999999 = #3ffe6666 66666666 g_dfmt(0) gives 3 bytes: "1.9" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffe6666 66666666 = 1.8999999999999999 fI[1] = #3ffe6666 66666667 = 1.9000000000000001 fI[0] == strtod Input: -1.9 strtord consumes 4 bytes and returns 25 with f = -1.8999999999999999 = #bffe6666 66666666 g_dfmt(0) gives 4 bytes: "-1.9" strtoId returns 25, consuming 4 bytes. fI[0] = #bffe6666 66666667 = -1.9000000000000001 fI[1] = #bffe6666 66666666 = -1.8999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtord consumes 3 bytes and returns 33 with f = 1.1000000000000001 = #3ff19999 9999999a g_dfmt(0) gives 3 bytes: "1.1" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff19999 99999999 = 1.0999999999999999 fI[1] = #3ff19999 9999999a = 1.1000000000000001 fI[1] == strtod Input: -1.1 strtord consumes 4 bytes and returns 41 with f = -1.1000000000000001 = #bff19999 9999999a g_dfmt(0) gives 4 bytes: "-1.1" strtoId returns 41, consuming 4 bytes. fI[0] = #bff19999 9999999a = -1.1000000000000001 fI[1] = #bff19999 99999999 = -1.0999999999999999 fI[0] == strtod Input: 1.2 strtord consumes 3 bytes and returns 17 with f = 1.2 = #3ff33333 33333333 g_dfmt(0) gives 3 bytes: "1.2" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff33333 33333333 = 1.2 fI[1] = #3ff33333 33333334 = 1.2000000000000002 fI[0] == strtod Input: -1.2 strtord consumes 4 bytes and returns 25 with f = -1.2 = #bff33333 33333333 g_dfmt(0) gives 4 bytes: "-1.2" strtoId returns 25, consuming 4 bytes. fI[0] = #bff33333 33333334 = -1.2000000000000002 fI[1] = #bff33333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtord consumes 3 bytes and returns 33 with f = 1.3 = #3ff4cccc cccccccd g_dfmt(0) gives 3 bytes: "1.3" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff4cccc cccccccc = 1.2999999999999998 fI[1] = #3ff4cccc cccccccd = 1.3 fI[1] == strtod Input: -1.3 strtord consumes 4 bytes and returns 41 with f = -1.3 = #bff4cccc cccccccd g_dfmt(0) gives 4 bytes: "-1.3" strtoId returns 41, consuming 4 bytes. fI[0] = #bff4cccc cccccccd = -1.3 fI[1] = #bff4cccc cccccccc = -1.2999999999999998 fI[0] == strtod Input: 1.4 strtord consumes 3 bytes and returns 17 with f = 1.3999999999999999 = #3ff66666 66666666 g_dfmt(0) gives 3 bytes: "1.4" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff66666 66666666 = 1.3999999999999999 fI[1] = #3ff66666 66666667 = 1.4000000000000001 fI[0] == strtod Input: -1.4 strtord consumes 4 bytes and returns 25 with f = -1.3999999999999999 = #bff66666 66666666 g_dfmt(0) gives 4 bytes: "-1.4" strtoId returns 25, consuming 4 bytes. fI[0] = #bff66666 66666667 = -1.4000000000000001 fI[1] = #bff66666 66666666 = -1.3999999999999999 fI[1] == strtod Input: 1.5 strtord consumes 3 bytes and returns 1 with f = 1.5 = #3ff80000 0 g_dfmt(0) gives 3 bytes: "1.5" strtoId returns 1, consuming 3 bytes. fI[0] == fI[1] == strtod Input: -1.5 strtord consumes 4 bytes and returns 9 with f = -1.5 = #bff80000 0 g_dfmt(0) gives 4 bytes: "-1.5" strtoId returns 9, consuming 4 bytes. fI[0] == fI[1] == strtod Input: 1.6 strtord consumes 3 bytes and returns 33 with f = 1.6000000000000001 = #3ff99999 9999999a g_dfmt(0) gives 3 bytes: "1.6" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff99999 99999999 = 1.5999999999999999 fI[1] = #3ff99999 9999999a = 1.6000000000000001 fI[1] == strtod Input: -1.6 strtord consumes 4 bytes and returns 41 with f = -1.6000000000000001 = #bff99999 9999999a g_dfmt(0) gives 4 bytes: "-1.6" strtoId returns 41, consuming 4 bytes. fI[0] = #bff99999 9999999a = -1.6000000000000001 fI[1] = #bff99999 99999999 = -1.5999999999999999 fI[0] == strtod Input: 1.7 strtord consumes 3 bytes and returns 17 with f = 1.7 = #3ffb3333 33333333 g_dfmt(0) gives 3 bytes: "1.7" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffb3333 33333333 = 1.7 fI[1] = #3ffb3333 33333334 = 1.7000000000000002 fI[0] == strtod Input: -1.7 strtord consumes 4 bytes and returns 25 with f = -1.7 = #bffb3333 33333333 g_dfmt(0) gives 4 bytes: "-1.7" strtoId returns 25, consuming 4 bytes. fI[0] = #bffb3333 33333334 = -1.7000000000000002 fI[1] = #bffb3333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtord consumes 3 bytes and returns 33 with f = 1.8 = #3ffccccc cccccccd g_dfmt(0) gives 3 bytes: "1.8" strtoId returns 33, consuming 3 bytes. fI[0] = #3ffccccc cccccccc = 1.7999999999999998 fI[1] = #3ffccccc cccccccd = 1.8 fI[1] == strtod Input: -1.8 strtord consumes 4 bytes and returns 41 with f = -1.8 = #bffccccc cccccccd g_dfmt(0) gives 4 bytes: "-1.8" strtoId returns 41, consuming 4 bytes. fI[0] = #bffccccc cccccccd = -1.8 fI[1] = #bffccccc cccccccc = -1.7999999999999998 fI[0] == strtod Input: 1.9 strtord consumes 3 bytes and returns 17 with f = 1.8999999999999999 = #3ffe6666 66666666 g_dfmt(0) gives 3 bytes: "1.9" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffe6666 66666666 = 1.8999999999999999 fI[1] = #3ffe6666 66666667 = 1.9000000000000001 fI[0] == strtod Input: -1.9 strtord consumes 4 bytes and returns 25 with f = -1.8999999999999999 = #bffe6666 66666666 g_dfmt(0) gives 4 bytes: "-1.9" strtoId returns 25, consuming 4 bytes. fI[0] = #bffe6666 66666667 = -1.9000000000000001 fI[1] = #bffe6666 66666666 = -1.8999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtord consumes 3 bytes and returns 33 with f = 1.1000000000000001 = #3ff19999 9999999a g_dfmt(0) gives 3 bytes: "1.1" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff19999 99999999 = 1.0999999999999999 fI[1] = #3ff19999 9999999a = 1.1000000000000001 fI[1] == strtod Input: -1.1 strtord consumes 4 bytes and returns 25 with f = -1.0999999999999999 = #bff19999 99999999 g_dfmt(0) gives 19 bytes: "-1.0999999999999999" strtoId returns 41, consuming 4 bytes. fI[0] = #bff19999 9999999a = -1.1000000000000001 fI[1] = #bff19999 99999999 = -1.0999999999999999 fI[1] == strtod Input: 1.2 strtord consumes 3 bytes and returns 33 with f = 1.2000000000000002 = #3ff33333 33333334 g_dfmt(0) gives 18 bytes: "1.2000000000000002" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff33333 33333333 = 1.2 fI[1] = #3ff33333 33333334 = 1.2000000000000002 fI[1] == strtod Input: -1.2 strtord consumes 4 bytes and returns 25 with f = -1.2 = #bff33333 33333333 g_dfmt(0) gives 4 bytes: "-1.2" strtoId returns 25, consuming 4 bytes. fI[0] = #bff33333 33333334 = -1.2000000000000002 fI[1] = #bff33333 33333333 = -1.2 fI[1] == strtod Input: 1.3 strtord consumes 3 bytes and returns 33 with f = 1.3 = #3ff4cccc cccccccd g_dfmt(0) gives 3 bytes: "1.3" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff4cccc cccccccc = 1.2999999999999998 fI[1] = #3ff4cccc cccccccd = 1.3 fI[1] == strtod Input: -1.3 strtord consumes 4 bytes and returns 25 with f = -1.2999999999999998 = #bff4cccc cccccccc g_dfmt(0) gives 19 bytes: "-1.2999999999999998" strtoId returns 41, consuming 4 bytes. fI[0] = #bff4cccc cccccccd = -1.3 fI[1] = #bff4cccc cccccccc = -1.2999999999999998 fI[1] == strtod Input: 1.4 strtord consumes 3 bytes and returns 33 with f = 1.4000000000000001 = #3ff66666 66666667 g_dfmt(0) gives 18 bytes: "1.4000000000000001" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff66666 66666666 = 1.3999999999999999 fI[1] = #3ff66666 66666667 = 1.4000000000000001 fI[1] == strtod Input: -1.4 strtord consumes 4 bytes and returns 25 with f = -1.3999999999999999 = #bff66666 66666666 g_dfmt(0) gives 4 bytes: "-1.4" strtoId returns 25, consuming 4 bytes. fI[0] = #bff66666 66666667 = -1.4000000000000001 fI[1] = #bff66666 66666666 = -1.3999999999999999 fI[1] == strtod Input: 1.5 strtord consumes 3 bytes and returns 1 with f = 1.5 = #3ff80000 0 g_dfmt(0) gives 3 bytes: "1.5" strtoId returns 1, consuming 3 bytes. fI[0] == fI[1] == strtod Input: -1.5 strtord consumes 4 bytes and returns 9 with f = -1.5 = #bff80000 0 g_dfmt(0) gives 4 bytes: "-1.5" strtoId returns 9, consuming 4 bytes. fI[0] == fI[1] == strtod Input: 1.6 strtord consumes 3 bytes and returns 33 with f = 1.6000000000000001 = #3ff99999 9999999a g_dfmt(0) gives 3 bytes: "1.6" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff99999 99999999 = 1.5999999999999999 fI[1] = #3ff99999 9999999a = 1.6000000000000001 fI[1] == strtod Input: -1.6 strtord consumes 4 bytes and returns 25 with f = -1.5999999999999999 = #bff99999 99999999 g_dfmt(0) gives 19 bytes: "-1.5999999999999999" strtoId returns 41, consuming 4 bytes. fI[0] = #bff99999 9999999a = -1.6000000000000001 fI[1] = #bff99999 99999999 = -1.5999999999999999 fI[1] == strtod Input: 1.7 strtord consumes 3 bytes and returns 33 with f = 1.7000000000000002 = #3ffb3333 33333334 g_dfmt(0) gives 18 bytes: "1.7000000000000002" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffb3333 33333333 = 1.7 fI[1] = #3ffb3333 33333334 = 1.7000000000000002 fI[1] == strtod Input: -1.7 strtord consumes 4 bytes and returns 25 with f = -1.7 = #bffb3333 33333333 g_dfmt(0) gives 4 bytes: "-1.7" strtoId returns 25, consuming 4 bytes. fI[0] = #bffb3333 33333334 = -1.7000000000000002 fI[1] = #bffb3333 33333333 = -1.7 fI[1] == strtod Input: 1.8 strtord consumes 3 bytes and returns 33 with f = 1.8 = #3ffccccc cccccccd g_dfmt(0) gives 3 bytes: "1.8" strtoId returns 33, consuming 3 bytes. fI[0] = #3ffccccc cccccccc = 1.7999999999999998 fI[1] = #3ffccccc cccccccd = 1.8 fI[1] == strtod Input: -1.8 strtord consumes 4 bytes and returns 25 with f = -1.7999999999999998 = #bffccccc cccccccc g_dfmt(0) gives 19 bytes: "-1.7999999999999998" strtoId returns 41, consuming 4 bytes. fI[0] = #bffccccc cccccccd = -1.8 fI[1] = #bffccccc cccccccc = -1.7999999999999998 fI[1] == strtod Input: 1.9 strtord consumes 3 bytes and returns 33 with f = 1.9000000000000001 = #3ffe6666 66666667 g_dfmt(0) gives 18 bytes: "1.9000000000000001" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffe6666 66666666 = 1.8999999999999999 fI[1] = #3ffe6666 66666667 = 1.9000000000000001 fI[1] == strtod Input: -1.9 strtord consumes 4 bytes and returns 25 with f = -1.8999999999999999 = #bffe6666 66666666 g_dfmt(0) gives 4 bytes: "-1.9" strtoId returns 25, consuming 4 bytes. fI[0] = #bffe6666 66666667 = -1.9000000000000001 fI[1] = #bffe6666 66666666 = -1.8999999999999999 fI[1] == strtod Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtord consumes 3 bytes and returns 17 with f = 1.0999999999999999 = #3ff19999 99999999 g_dfmt(0) gives 18 bytes: "1.0999999999999999" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff19999 99999999 = 1.0999999999999999 fI[1] = #3ff19999 9999999a = 1.1000000000000001 fI[0] == strtod Input: -1.1 strtord consumes 4 bytes and returns 41 with f = -1.1000000000000001 = #bff19999 9999999a g_dfmt(0) gives 4 bytes: "-1.1" strtoId returns 41, consuming 4 bytes. fI[0] = #bff19999 9999999a = -1.1000000000000001 fI[1] = #bff19999 99999999 = -1.0999999999999999 fI[0] == strtod Input: 1.2 strtord consumes 3 bytes and returns 17 with f = 1.2 = #3ff33333 33333333 g_dfmt(0) gives 3 bytes: "1.2" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff33333 33333333 = 1.2 fI[1] = #3ff33333 33333334 = 1.2000000000000002 fI[0] == strtod Input: -1.2 strtord consumes 4 bytes and returns 41 with f = -1.2000000000000002 = #bff33333 33333334 g_dfmt(0) gives 19 bytes: "-1.2000000000000002" strtoId returns 25, consuming 4 bytes. fI[0] = #bff33333 33333334 = -1.2000000000000002 fI[1] = #bff33333 33333333 = -1.2 fI[0] == strtod Input: 1.3 strtord consumes 3 bytes and returns 17 with f = 1.2999999999999998 = #3ff4cccc cccccccc g_dfmt(0) gives 18 bytes: "1.2999999999999998" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff4cccc cccccccc = 1.2999999999999998 fI[1] = #3ff4cccc cccccccd = 1.3 fI[0] == strtod Input: -1.3 strtord consumes 4 bytes and returns 41 with f = -1.3 = #bff4cccc cccccccd g_dfmt(0) gives 4 bytes: "-1.3" strtoId returns 41, consuming 4 bytes. fI[0] = #bff4cccc cccccccd = -1.3 fI[1] = #bff4cccc cccccccc = -1.2999999999999998 fI[0] == strtod Input: 1.4 strtord consumes 3 bytes and returns 17 with f = 1.3999999999999999 = #3ff66666 66666666 g_dfmt(0) gives 3 bytes: "1.4" strtoId returns 17, consuming 3 bytes. fI[0] = #3ff66666 66666666 = 1.3999999999999999 fI[1] = #3ff66666 66666667 = 1.4000000000000001 fI[0] == strtod Input: -1.4 strtord consumes 4 bytes and returns 41 with f = -1.4000000000000001 = #bff66666 66666667 g_dfmt(0) gives 19 bytes: "-1.4000000000000001" strtoId returns 25, consuming 4 bytes. fI[0] = #bff66666 66666667 = -1.4000000000000001 fI[1] = #bff66666 66666666 = -1.3999999999999999 fI[0] == strtod Input: 1.5 strtord consumes 3 bytes and returns 1 with f = 1.5 = #3ff80000 0 g_dfmt(0) gives 3 bytes: "1.5" strtoId returns 1, consuming 3 bytes. fI[0] == fI[1] == strtod Input: -1.5 strtord consumes 4 bytes and returns 9 with f = -1.5 = #bff80000 0 g_dfmt(0) gives 4 bytes: "-1.5" strtoId returns 9, consuming 4 bytes. fI[0] == fI[1] == strtod Input: 1.6 strtord consumes 3 bytes and returns 17 with f = 1.5999999999999999 = #3ff99999 99999999 g_dfmt(0) gives 18 bytes: "1.5999999999999999" strtoId returns 33, consuming 3 bytes. fI[0] = #3ff99999 99999999 = 1.5999999999999999 fI[1] = #3ff99999 9999999a = 1.6000000000000001 fI[0] == strtod Input: -1.6 strtord consumes 4 bytes and returns 41 with f = -1.6000000000000001 = #bff99999 9999999a g_dfmt(0) gives 4 bytes: "-1.6" strtoId returns 41, consuming 4 bytes. fI[0] = #bff99999 9999999a = -1.6000000000000001 fI[1] = #bff99999 99999999 = -1.5999999999999999 fI[0] == strtod Input: 1.7 strtord consumes 3 bytes and returns 17 with f = 1.7 = #3ffb3333 33333333 g_dfmt(0) gives 3 bytes: "1.7" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffb3333 33333333 = 1.7 fI[1] = #3ffb3333 33333334 = 1.7000000000000002 fI[0] == strtod Input: -1.7 strtord consumes 4 bytes and returns 41 with f = -1.7000000000000002 = #bffb3333 33333334 g_dfmt(0) gives 19 bytes: "-1.7000000000000002" strtoId returns 25, consuming 4 bytes. fI[0] = #bffb3333 33333334 = -1.7000000000000002 fI[1] = #bffb3333 33333333 = -1.7 fI[0] == strtod Input: 1.8 strtord consumes 3 bytes and returns 17 with f = 1.7999999999999998 = #3ffccccc cccccccc g_dfmt(0) gives 18 bytes: "1.7999999999999998" strtoId returns 33, consuming 3 bytes. fI[0] = #3ffccccc cccccccc = 1.7999999999999998 fI[1] = #3ffccccc cccccccd = 1.8 fI[0] == strtod Input: -1.8 strtord consumes 4 bytes and returns 41 with f = -1.8 = #bffccccc cccccccd g_dfmt(0) gives 4 bytes: "-1.8" strtoId returns 41, consuming 4 bytes. fI[0] = #bffccccc cccccccd = -1.8 fI[1] = #bffccccc cccccccc = -1.7999999999999998 fI[0] == strtod Input: 1.9 strtord consumes 3 bytes and returns 17 with f = 1.8999999999999999 = #3ffe6666 66666666 g_dfmt(0) gives 3 bytes: "1.9" strtoId returns 17, consuming 3 bytes. fI[0] = #3ffe6666 66666666 = 1.8999999999999999 fI[1] = #3ffe6666 66666667 = 1.9000000000000001 fI[0] == strtod Input: -1.9 strtord consumes 4 bytes and returns 41 with f = -1.9000000000000001 = #bffe6666 66666667 g_dfmt(0) gives 19 bytes: "-1.9000000000000001" strtoId returns 25, consuming 4 bytes. fI[0] = #bffe6666 66666667 = -1.9000000000000001 fI[1] = #bffe6666 66666666 = -1.8999999999999999 fI[0] == strtod mlton-20210117+dfsg/runtime/gdtoa/test/dI.out000066400000000000000000000106451416264345000206610ustar00rootroot00000000000000 Input: 1.23 strtodI consumes 4 bytes and returns 17 dd[0] = #3ff3ae14 7ae147ae = 1.23 dd[1] = #3ff3ae14 7ae147af = 1.2300000000000002 Input: 1.23e+20 strtodI consumes 8 bytes and returns 1 dd[0] = #441aabdf 2145b430 = 1.23e+20 dd[1] = #441aabdf 2145b430 = 1.23e+20 Input: 1.23e-20 strtodI consumes 8 bytes and returns 33 dd[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 dd[1] = #3bcd0ae4 cf767531 = 1.23e-20 Input: 1.23456789 strtodI consumes 10 bytes and returns 17 dd[0] = #3ff3c0ca 4283de1b = 1.23456789 dd[1] = #3ff3c0ca 4283de1c = 1.2345678900000001 Input: 1.23456589e+20 strtodI consumes 14 bytes and returns 17 dd[0] = #441ac537 a660b997 = 1.23456589e+20 dd[1] = #441ac537 a660b998 = 123456589000000010000 Input: 1.23e+30 strtodI consumes 8 bytes and returns 17 dd[0] = #462f0cb0 4e8fb790 = 1.23e+30 dd[1] = #462f0cb0 4e8fb791 = 1.2300000000000001e+30 Input: 1.23e-30 strtodI consumes 8 bytes and returns 33 dd[0] = #39b8f286 6f5010aa = 1.2299999999999999e-30 dd[1] = #39b8f286 6f5010ab = 1.23e-30 Input: 1.23456789e-20 strtodI consumes 14 bytes and returns 17 dd[0] = #3bcd2681 471e7ada = 1.23456789e-20 dd[1] = #3bcd2681 471e7adb = 1.2345678900000001e-20 Input: 1.23456789e-30 strtodI consumes 14 bytes and returns 17 dd[0] = #39b90a3e 33bbd995 = 1.23456789e-30 dd[1] = #39b90a3e 33bbd996 = 1.2345678900000002e-30 Input: 1.234567890123456789 strtodI consumes 20 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.23456789012345678901234567890123456789 strtodI consumes 40 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.23e306 strtodI consumes 8 bytes and returns 33 dd[0] = #7f7c0676 cd1c61f4 = 1.2299999999999999e+306 dd[1] = #7f7c0676 cd1c61f5 = 1.23e+306 Input: 1.23e-306 strtodI consumes 9 bytes and returns 33 dd[0] = #6ba3b8 5da396e7 = 1.2299999999999999e-306 dd[1] = #6ba3b8 5da396e8 = 1.23e-306 Input: 1.23e-320 strtodI consumes 9 bytes and returns 98 dd[0] = #0 9b9 = 1.2297e-320 dd[1] = #0 9ba = 1.23e-320 Input: 1.23e-20 strtodI consumes 8 bytes and returns 33 dd[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 dd[1] = #3bcd0ae4 cf767531 = 1.23e-20 Input: 1.23456789e307 strtodI consumes 14 bytes and returns 33 dd[0] = #7fb194b1 4bdaecdb = 1.2345678899999998e+307 dd[1] = #7fb194b1 4bdaecdc = 1.23456789e+307 Input: 1.23456589e-307 strtodI consumes 15 bytes and returns 17 dd[0] = #363196 bb9845fa = 1.23456589e-307 dd[1] = #363196 bb9845fb = 1.2345658900000001e-307 Input: 1.234567890123456789 strtodI consumes 20 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.234567890123456789e301 strtodI consumes 24 bytes and returns 17 dd[0] = #7e726f51 75f56413 = 1.2345678901234568e+301 dd[1] = #7e726f51 75f56414 = 1.234567890123457e+301 Input: 1.234567890123456789e-301 strtodI consumes 25 bytes and returns 17 dd[0] = #1752a64 e34ba0d3 = 1.2345678901234567e-301 dd[1] = #1752a64 e34ba0d4 = 1.234567890123457e-301 Input: 1.234567890123456789e-321 strtodI consumes 25 bytes and returns 98 dd[0] = #0 f9 = 1.23e-321 dd[1] = #0 fa = 1.235e-321 Input: 1e23 strtodI consumes 4 bytes and returns 17 dd[0] = #44b52d02 c7e14af6 = 1e+23 dd[1] = #44b52d02 c7e14af7 = 1.0000000000000001e+23 Input: 1e310 strtodI consumes 5 bytes and returns 163 dd[0] = #7fefffff ffffffff = 1.7976931348623157e+308 dd[1] = #7ff00000 0 = Infinity Input: 9.0259718793241475e-277 strtodI consumes 23 bytes and returns 33 dd[0] = #69fffff ffffffff = 9.025971879324147e-277 dd[1] = #6a00000 0 = 9.025971879324148e-277 Input: 9.025971879324147880346310405869e-277 strtodI consumes 37 bytes and returns 17 dd[0] = #6a00000 0 = 9.025971879324148e-277 dd[1] = #6a00000 1 = 9.02597187932415e-277 Input: 9.025971879324147880346310405868e-277 strtodI consumes 37 bytes and returns 33 dd[0] = #69fffff ffffffff = 9.025971879324147e-277 dd[1] = #6a00000 0 = 9.025971879324148e-277 Input: 2.2250738585072014e-308 strtodI consumes 23 bytes and returns 17 dd[0] = #100000 0 = 2.2250738585072014e-308 dd[1] = #100000 1 = 2.225073858507202e-308 Input: 2.2250738585072013e-308 strtodI consumes 23 bytes and returns 33 dd[0] = #fffff ffffffff = 2.225073858507201e-308 dd[1] = #100000 0 = 2.2250738585072014e-308 Input: 3.2649476e14 strtodI consumes 12 bytes and returns 1 dd[0] = #42f28f1f c30da000 = 3.2649476e+14 dd[1] = #42f28f1f c30da000 = 3.2649476e+14 mlton-20210117+dfsg/runtime/gdtoa/test/dIsi.out000066400000000000000000000106221416264345000212100ustar00rootroot00000000000000 Input: 1.23 strtodI consumes 4 bytes and returns 17 dd[0] = #3ff3ae14 7ae147ae = 1.23 dd[1] = #3ff3ae14 7ae147af = 1.2300000000000002 Input: 1.23e+20 strtodI consumes 8 bytes and returns 1 dd[0] = #441aabdf 2145b430 = 1.23e+20 dd[1] = #441aabdf 2145b430 = 1.23e+20 Input: 1.23e-20 strtodI consumes 8 bytes and returns 33 dd[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 dd[1] = #3bcd0ae4 cf767531 = 1.23e-20 Input: 1.23456789 strtodI consumes 10 bytes and returns 17 dd[0] = #3ff3c0ca 4283de1b = 1.23456789 dd[1] = #3ff3c0ca 4283de1c = 1.2345678900000001 Input: 1.23456589e+20 strtodI consumes 14 bytes and returns 17 dd[0] = #441ac537 a660b997 = 1.23456589e+20 dd[1] = #441ac537 a660b998 = 123456589000000010000 Input: 1.23e+30 strtodI consumes 8 bytes and returns 17 dd[0] = #462f0cb0 4e8fb790 = 1.23e+30 dd[1] = #462f0cb0 4e8fb791 = 1.2300000000000001e+30 Input: 1.23e-30 strtodI consumes 8 bytes and returns 33 dd[0] = #39b8f286 6f5010aa = 1.2299999999999999e-30 dd[1] = #39b8f286 6f5010ab = 1.23e-30 Input: 1.23456789e-20 strtodI consumes 14 bytes and returns 17 dd[0] = #3bcd2681 471e7ada = 1.23456789e-20 dd[1] = #3bcd2681 471e7adb = 1.2345678900000001e-20 Input: 1.23456789e-30 strtodI consumes 14 bytes and returns 17 dd[0] = #39b90a3e 33bbd995 = 1.23456789e-30 dd[1] = #39b90a3e 33bbd996 = 1.2345678900000002e-30 Input: 1.234567890123456789 strtodI consumes 20 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.23456789012345678901234567890123456789 strtodI consumes 40 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.23e306 strtodI consumes 8 bytes and returns 33 dd[0] = #7f7c0676 cd1c61f4 = 1.2299999999999999e+306 dd[1] = #7f7c0676 cd1c61f5 = 1.23e+306 Input: 1.23e-306 strtodI consumes 9 bytes and returns 33 dd[0] = #6ba3b8 5da396e7 = 1.2299999999999999e-306 dd[1] = #6ba3b8 5da396e8 = 1.23e-306 Input: 1.23e-320 strtodI consumes 9 bytes and returns 80 dd[0] = #0 0 = 0 dd[1] = #100000 0 = 2.2250738585072014e-308 Input: 1.23e-20 strtodI consumes 8 bytes and returns 33 dd[0] = #3bcd0ae4 cf767530 = 1.2299999999999999e-20 dd[1] = #3bcd0ae4 cf767531 = 1.23e-20 Input: 1.23456789e307 strtodI consumes 14 bytes and returns 33 dd[0] = #7fb194b1 4bdaecdb = 1.2345678899999998e+307 dd[1] = #7fb194b1 4bdaecdc = 1.23456789e+307 Input: 1.23456589e-307 strtodI consumes 15 bytes and returns 17 dd[0] = #363196 bb9845fa = 1.23456589e-307 dd[1] = #363196 bb9845fb = 1.2345658900000001e-307 Input: 1.234567890123456789 strtodI consumes 20 bytes and returns 17 dd[0] = #3ff3c0ca 428c59fb = 1.2345678901234567 dd[1] = #3ff3c0ca 428c59fc = 1.234567890123457 Input: 1.234567890123456789e301 strtodI consumes 24 bytes and returns 17 dd[0] = #7e726f51 75f56413 = 1.2345678901234568e+301 dd[1] = #7e726f51 75f56414 = 1.234567890123457e+301 Input: 1.234567890123456789e-301 strtodI consumes 25 bytes and returns 17 dd[0] = #1752a64 e34ba0d3 = 1.2345678901234567e-301 dd[1] = #1752a64 e34ba0d4 = 1.234567890123457e-301 Input: 1.234567890123456789e-321 strtodI consumes 25 bytes and returns 80 dd[0] = #0 0 = 0 dd[1] = #100000 0 = 2.2250738585072014e-308 Input: 1e23 strtodI consumes 4 bytes and returns 17 dd[0] = #44b52d02 c7e14af6 = 1e+23 dd[1] = #44b52d02 c7e14af7 = 1.0000000000000001e+23 Input: 1e310 strtodI consumes 5 bytes and returns 163 dd[0] = #7fefffff ffffffff = 1.7976931348623157e+308 dd[1] = #7ff00000 0 = Infinity Input: 9.0259718793241475e-277 strtodI consumes 23 bytes and returns 33 dd[0] = #69fffff ffffffff = 9.025971879324147e-277 dd[1] = #6a00000 0 = 9.025971879324148e-277 Input: 9.025971879324147880346310405869e-277 strtodI consumes 37 bytes and returns 17 dd[0] = #6a00000 0 = 9.025971879324148e-277 dd[1] = #6a00000 1 = 9.02597187932415e-277 Input: 9.025971879324147880346310405868e-277 strtodI consumes 37 bytes and returns 33 dd[0] = #69fffff ffffffff = 9.025971879324147e-277 dd[1] = #6a00000 0 = 9.025971879324148e-277 Input: 2.2250738585072014e-308 strtodI consumes 23 bytes and returns 17 dd[0] = #100000 0 = 2.2250738585072014e-308 dd[1] = #100000 1 = 2.225073858507202e-308 Input: 2.2250738585072013e-308 strtodI consumes 23 bytes and returns 33 dd[0] = #0 0 = 0 dd[1] = #100000 0 = 2.2250738585072014e-308 Input: 3.2649476e14 strtodI consumes 12 bytes and returns 1 dd[0] = #42f28f1f c30da000 = 3.2649476e+14 dd[1] = #42f28f1f c30da000 = 3.2649476e+14 mlton-20210117+dfsg/runtime/gdtoa/test/dItest.c000066400000000000000000000045041416264345000211710ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoaimp.h" #include #include static char ibuf[2048]; #define UL (unsigned long) static void #ifdef KR_headers dshow(what, d) char *what; double d; #else dshow(char *what, double d) #endif { char buf[32]; g_dfmt(buf, &d, 0, sizeof(buf)); printf("%s = #%lx %lx = %s\n", what, UL ((U*)&d)->L[_0], UL ((U*)&d)->L[_1], buf); } int main(Void) { /* Input: one number per line */ char *s, *se, *se1; int i, j; double dd[2], dd1, dd2; static char cfmt[] = "%s consumes %d bytes and returns %d\n"; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; printf("\nInput: %s", ibuf); i = strtodI(ibuf, &se, dd); printf(cfmt, "strtodI", (int)(se-ibuf), i); dshow("dd[0]", dd[0]); dshow("dd[1]", dd[1]); printf("\n"); j = strtoId(ibuf, &se1, &dd1, &dd2); if (j != i || se != se1 || dd[0] != dd1 || dd[1] != dd2) { printf(cfmt, "**** strtoId", (int)(se-ibuf), j); dshow("dd1", dd1); dshow("dd2", dd2); } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/dd.out000066400000000000000000001205651416264345000207170ustar00rootroot00000000000000 Input: 1.23 strtopdd consumes 4 bytes and returns 17 dd[0] = 1.23 = #3ff3ae14 7ae147ae dd[1] = 1.7763568394002496e-17 = #3c747ae1 47ae1478 g_ddfmt(0) gives 4 bytes: "1.23" strtoIdd returns 17, consuming 4 bytes. ddI[0] = #3ff3ae14 7ae147ae + 3c747ae1 47ae1478 = 1.23 + 1.7763568394002496e-17 ddI[1] = #3ff3ae14 7ae147ae + 3c747ae1 47ae1480 = 1.23 + 1.776356839400252e-17 ddI[0] == strtod Input: 1.23e+20 strtopdd consumes 8 bytes and returns 1 dd[0] = 1.23e+20 = #441aabdf 2145b430 dd[1] = 0 = #0 0 g_ddfmt(0) gives 8 bytes: "1.23e+20" strtoIdd returns 1, consuming 8 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e-20 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e-20 = #3bcd0ae4 cf767530 dd[1] = 9.304023318521521e-37 = #3873c997 955b2691 g_ddfmt(0) gives 8 bytes: "1.23e-20" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #3bcd0ae4 cf767530 + 3873c997 955b2690 = 1.2299999999999999e-20 + 9.3040233185215194e-37 ddI[1] = #3bcd0ae4 cf767530 + 3873c997 955b2691 = 1.2299999999999999e-20 + 9.3040233185215211e-37 ddI[1] == strtod Input: 1.23456789 strtopdd consumes 10 bytes and returns 17 dd[0] = 1.23456789 = #3ff3c0ca 4283de1b dd[1] = 1.0990618193318369e-16 = #3c9fada5 144c1252 g_ddfmt(0) gives 10 bytes: "1.23456789" strtoIdd returns 17, consuming 10 bytes. ddI[0] = #3ff3c0ca 4283de1b + 3c9fada5 144c1252 = 1.2345678899999999 + 1.0990618193318369e-16 ddI[1] = #3ff3c0ca 4283de1b + 3c9fada5 144c1254 = 1.2345678899999999 + 1.0990618193318371e-16 ddI[0] == strtod Input: 1.23456589e+20 strtopdd consumes 14 bytes and returns 1 dd[0] = 1.23456589e+20 = #441ac537 a660b997 dd[1] = 4096 = #40b00000 0 g_ddfmt(0) gives 14 bytes: "1.23456589e+20" strtoIdd returns 1, consuming 14 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e+30 strtopdd consumes 8 bytes and returns 1 dd[0] = 1.23e+30 = #462f0cb0 4e8fb790 dd[1] = 40281156091904 = #42c25158 0 g_ddfmt(0) gives 8 bytes: "1.23e+30" strtoIdd returns 1, consuming 8 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e-30 strtopdd consumes 8 bytes and returns 17 dd[0] = 1.2299999999999999e-30 = #39b8f286 6f5010aa dd[1] = 1.076909723013918e-46 = #3663ac7f 3dafd174 g_ddfmt(0) gives 8 bytes: "1.23e-30" strtoIdd returns 17, consuming 8 bytes. ddI[0] = #39b8f286 6f5010aa + 3663ac7f 3dafd174 = 1.2299999999999999e-30 + 1.076909723013918e-46 ddI[1] = #39b8f286 6f5010aa + 3663ac7f 3dafd175 = 1.2299999999999999e-30 + 1.0769097230139181e-46 ddI[0] == strtod Input: 1.23456789e-20 strtopdd consumes 14 bytes and returns 17 dd[0] = 1.23456789e-20 = #3bcd2681 471e7ada dd[1] = 6.247111971663133e-37 = #386a9280 a761b07e g_ddfmt(0) gives 14 bytes: "1.23456789e-20" strtoIdd returns 17, consuming 14 bytes. ddI[0] = #3bcd2681 471e7ada + 386a9280 a761b07e = 1.2345678899999999e-20 + 6.2471119716631328e-37 ddI[1] = #3bcd2681 471e7ada + 386a9280 a761b080 = 1.2345678899999999e-20 + 6.2471119716631345e-37 ddI[0] == strtod Input: 1.23456789e-30 strtopdd consumes 14 bytes and returns 33 dd[0] = 1.23456789e-30 = #39b90a3e 33bbd995 dd[1] = 2.1567930523648577e-47 = #363f8585 55a6b1a0 g_ddfmt(0) gives 14 bytes: "1.23456789e-30" strtoIdd returns 33, consuming 14 bytes. ddI[0] = #39b90a3e 33bbd995 + 363f8585 55a6b198 = 1.23456789e-30 + 2.1567930523648558e-47 ddI[1] = #39b90a3e 33bbd995 + 363f8585 55a6b1a0 = 1.23456789e-30 + 2.1567930523648577e-47 ddI[1] == strtod Input: 1.234567890123456789 strtopdd consumes 20 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.856786452588859e-17 = #3c9c6906 51a3745e g_ddfmt(0) gives 20 bytes: "1.234567890123456789" strtoIdd returns 33, consuming 20 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745c = 1.2345678901234567 + 9.8567864525888563e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745e = 1.2345678901234567 + 9.8567864525888588e-17 ddI[1] == strtod Input: 1.23456789012345678901234567890123456789 strtopdd consumes 40 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.858021020478982e-17 = #3c9c69ef 85adadb6 g_ddfmt(0) gives 34 bytes: "1.23456789012345678901234567890124" strtoIdd returns 33, consuming 40 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c69ef 85adadb4 = 1.2345678901234567 + 9.8580210204789798e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c69ef 85adadb6 = 1.2345678901234567 + 9.8580210204789823e-17 ddI[1] == strtod Input: 1.23e306 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e+306 = #7f7c0676 cd1c61f4 dd[1] = 1.3319001448659015e+290 = #7c2b558b e3d3f477 g_ddfmt(0) gives 9 bytes: "1.23e+306" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #7f7c0676 cd1c61f4 + 7c2b558b e3d3f476 = 1.2299999999999999e+306 + 1.3319001448659013e+290 ddI[1] = #7f7c0676 cd1c61f4 + 7c2b558b e3d3f477 = 1.2299999999999999e+306 + 1.3319001448659015e+290 ddI[1] == strtod Input: 1.23e-306 strtopdd consumes 9 bytes and returns 98 dd[0] = 1.2299999999999999e-306 = #6ba3b8 5da396e7 dd[1] = 1.43e-322 = #0 1d g_ddfmt(0) gives 9 bytes: "1.23e-306" strtoIdd returns 98, consuming 9 bytes. ddI[0] = #6ba3b8 5da396e7 + 0 1c = 1.2299999999999999e-306 + 1.3833838083554903e-322 ddI[1] = #6ba3b8 5da396e7 + 0 1d = 1.2299999999999999e-306 + 1.432790372939615e-322 ddI[1] == strtod Input: 1.23e-320 strtopdd consumes 9 bytes and returns 98 dd[0] = 1.23e-320 = #0 9ba dd[1] = 0 = #0 0 g_ddfmt(0) gives 9 bytes: "1.23e-320" strtoIdd returns 98, consuming 9 bytes. ddI[0] = #0 9b9 + 0 0 = 1.2297293924988626e-320 + 0 ddI[1] = #0 9ba + 0 0 = 1.2302234581447039e-320 + 0 ddI[1] == strtod Input: 1.23e-20 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e-20 = #3bcd0ae4 cf767530 dd[1] = 9.304023318521521e-37 = #3873c997 955b2691 g_ddfmt(0) gives 8 bytes: "1.23e-20" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #3bcd0ae4 cf767530 + 3873c997 955b2690 = 1.2299999999999999e-20 + 9.3040233185215194e-37 ddI[1] = #3bcd0ae4 cf767530 + 3873c997 955b2691 = 1.2299999999999999e-20 + 9.3040233185215211e-37 ddI[1] == strtod Input: 1.23456789e307 strtopdd consumes 14 bytes and returns 33 dd[0] = 1.2345678899999998e+307 = #7fb194b1 4bdaecdb dd[1] = 2.0137933598720243e+291 = #7c69d48d 192048ca g_ddfmt(0) gives 15 bytes: "1.23456789e+307" strtoIdd returns 33, consuming 14 bytes. ddI[0] = #7fb194b1 4bdaecdb + 7c69d48d 192048c9 = 1.2345678899999998e+307 + 2.013793359872024e+291 ddI[1] = #7fb194b1 4bdaecdb + 7c69d48d 192048ca = 1.2345678899999998e+307 + 2.0137933598720243e+291 ddI[1] == strtod Input: 1.23456589e-307 strtopdd consumes 15 bytes and returns 98 dd[0] = 1.23456589e-307 = #363196 bb9845fa dd[1] = 1e-323 = #0 2 g_ddfmt(0) gives 15 bytes: "1.23456589e-307" strtoIdd returns 98, consuming 15 bytes. ddI[0] = #363196 bb9845fa + 0 1 = 1.2345658899999999e-307 + 4.9406564584124654e-324 ddI[1] = #363196 bb9845fa + 0 2 = 1.2345658899999999e-307 + 9.8813129168249309e-324 ddI[1] == strtod Input: 1.234567890123456789 strtopdd consumes 20 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.856786452588859e-17 = #3c9c6906 51a3745e g_ddfmt(0) gives 20 bytes: "1.234567890123456789" strtoIdd returns 33, consuming 20 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745c = 1.2345678901234567 + 9.8567864525888563e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745e = 1.2345678901234567 + 9.8567864525888588e-17 ddI[1] == strtod Input: 1.234567890123456789e301 strtopdd consumes 24 bytes and returns 33 dd[0] = 1.2345678901234568e+301 = #7e726f51 75f56413 dd[1] = 1.3892003943918827e+283 = #7ab7ea80 76399100 g_ddfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIdd returns 33, consuming 24 bytes. ddI[0] = #7e726f51 75f56413 + 7ab7ea80 76399080 = 1.2345678901234568e+301 + 1.3892003943918563e+283 ddI[1] = #7e726f51 75f56413 + 7ab7ea80 76399100 = 1.2345678901234568e+301 + 1.3892003943918827e+283 ddI[1] == strtod Input: 1.234567890123456789e-301 strtopdd consumes 25 bytes and returns 82 dd[0] = 1.2345678901234567e-301 = #1752a64 e34ba0d3 dd[1] = 7.374365e-318 = #0 16c66c g_ddfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIdd returns 82, consuming 25 bytes. ddI[0] = #1752a64 e34ba0d3 + 0 16c66c = 1.2345678901234567e-301 + 7.374364541948945e-318 ddI[1] = #1752a64 e34ba0d3 + 0 16c66d = 1.2345678901234567e-301 + 7.3743694826054034e-318 ddI[0] == strtod Input: 1.234567890123456789e-321 strtopdd consumes 25 bytes and returns 98 dd[0] = 1.235e-321 = #0 fa dd[1] = 0 = #0 0 g_ddfmt(0) gives 10 bytes: "1.235e-321" strtoIdd returns 98, consuming 25 bytes. ddI[0] = #0 f9 + 0 0 = 1.2302234581447039e-321 + 0 ddI[1] = #0 fa + 0 0 = 1.2351641146031164e-321 + 0 ddI[1] == strtod Input: 1e23 strtopdd consumes 4 bytes and returns 1 dd[0] = 1e+23 = #44b52d02 c7e14af6 dd[1] = 8388608 = #41600000 0 g_ddfmt(0) gives 5 bytes: "1e+23" strtoIdd returns 1, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1e310 strtopdd consumes 5 bytes and returns 163 dd[0] = Infinity = #7ff00000 0 dd[1] = Infinity = #7ff00000 0 g_ddfmt(0) gives 8 bytes: "Infinity" strtoIdd returns 163, consuming 5 bytes. ddI[0] = #7fefffff ffffffff + 7c9fffff ffffffff = 1.7976931348623157e+308 + 1.9958403095347196e+292 ddI[1] = #7ff00000 0 + 7ff00000 0 = Infinity + Infinity ddI[1] == strtod g_ddfmt_p(...,0): "Infinity" g_ddfmt_p(...,1): "Infinity" g_ddfmt_p(...,2): "Infinity" g_ddfmt_p(...,3): "Infinity" g_ddfmt_p(...,4): "Infinity" g_ddfmt_p(...,5): "Infinity" Input: 9.0259718793241475e-277 strtopdd consumes 23 bytes and returns 33 dd[0] = 9.025971879324147e-277 = #69fffff ffffffff dd[1] = 6.217378695986177e-293 = #343daae f3582320 g_ddfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIdd returns 33, consuming 23 bytes. ddI[0] = #69fffff ffffffff + 343daae f358231f = 9.0259718793241469e-277 + 6.2173786959861757e-293 ddI[1] = #69fffff ffffffff + 343daae f3582320 = 9.0259718793241469e-277 + 6.2173786959861768e-293 ddI[1] == strtod Input: 9.025971879324147880346310405869e-277 strtopdd consumes 37 bytes and returns 17 dd[0] = 9.025971879324148e-277 = #6a00000 0 dd[1] = 2.2250738585072014e-308 = #100000 0 g_ddfmt(0) gives 37 bytes: "9.025971879324147880346310405869e-277" strtoIdd returns 17, consuming 37 bytes. ddI[0] = #6a00000 0 + 100000 0 = 9.0259718793241479e-277 + 2.2250738585072014e-308 ddI[1] = #6a00000 0 + 200000 0 = 9.0259718793241479e-277 + 4.4501477170144028e-308 ddI[0] == strtod Input: 9.025971879324147880346310405868e-277 strtopdd consumes 37 bytes and returns 17 dd[0] = 9.025971879324147e-277 = #69fffff ffffffff dd[1] = 1.0020841800044856e-292 = #34fffff fffffff9 g_ddfmt(0) gives 37 bytes: "9.025971879324147880346310405868e-277" strtoIdd returns 17, consuming 37 bytes. ddI[0] = #69fffff ffffffff + 34fffff fffffff9 = 9.0259718793241469e-277 + 1.0020841800044856e-292 ddI[1] = #69fffff ffffffff + 34fffff fffffffa = 9.0259718793241469e-277 + 1.0020841800044857e-292 ddI[0] == strtod Input: 2.2250738585072014e-308 strtopdd consumes 23 bytes and returns 82 dd[0] = 2.2250738585072014e-308 = #100000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIdd returns 82, consuming 23 bytes. ddI[0] = #100000 0 + 0 0 = 2.2250738585072014e-308 + 0 ddI[1] = #100000 1 + 0 0 = 2.2250738585072019e-308 + 0 ddI[0] == strtod Input: 2.2250738585072013e-308 strtopdd consumes 23 bytes and returns 98 dd[0] = 2.2250738585072014e-308 = #100000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIdd returns 98, consuming 23 bytes. ddI[0] = #fffff ffffffff + 0 0 = 2.2250738585072009e-308 + 0 ddI[1] = #100000 0 + 0 0 = 2.2250738585072014e-308 + 0 ddI[1] == strtod Input: 3.2649476e14 strtopdd consumes 12 bytes and returns 1 dd[0] = 3.2649476e+14 = #42f28f1f c30da000 dd[1] = 0 = #0 0 g_ddfmt(0) gives 13 bytes: "3.2649476e+14" strtoIdd returns 1, consuming 12 bytes. ddI[0] == ddI[1] == strtopdd Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.0999999999999999 = #3ff19999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.1" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff19999 99999999 + 3ca33333 33333333 = 1.0999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff19999 99999999 + 3ca33333 33333334 = 1.0999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.1 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.0999999999999999 = #bff19999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.1" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff19999 99999999 + bca33333 33333334 = -1.0999999999999999 + -1.332267629550188e-16 ddI[1] = #bff19999 99999999 + bca33333 33333333 = -1.0999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.2 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.2 = #3ff33333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.2" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff33333 33333333 + 3c899999 99999998 = 1.2 + 4.4408920985006252e-17 ddI[1] = #3ff33333 33333333 + 3c899999 9999999c = 1.2 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.2 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.2 = #bff33333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.2" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff33333 33333333 + bc899999 9999999c = -1.2 + -4.4408920985006276e-17 ddI[1] = #bff33333 33333333 + bc899999 99999998 = -1.2 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.3 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.2999999999999998 = #3ff4cccc cccccccc dd[1] = 1.7763568394002503e-16 = #3ca99999 99999999 g_ddfmt(0) gives 34 bytes: "1.29999999999999999999999999999999" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff4cccc cccccccc + 3ca99999 99999999 = 1.2999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ff4cccc cccccccc + 3ca99999 9999999a = 1.2999999999999998 + 1.7763568394002506e-16 ddI[0] == strtod Input: -1.3 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.2999999999999998 = #bff4cccc cccccccc dd[1] = -1.7763568394002503e-16 = #bca99999 99999999 g_ddfmt(0) gives 35 bytes: "-1.29999999999999999999999999999999" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff4cccc cccccccc + bca99999 9999999a = -1.2999999999999998 + -1.7763568394002506e-16 ddI[1] = #bff4cccc cccccccc + bca99999 99999999 = -1.2999999999999998 + -1.7763568394002503e-16 ddI[1] == strtod Input: 1.4 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.4 = #3ff66666 66666666 dd[1] = 8.88178419700125e-17 = #3c999999 99999998 g_ddfmt(0) gives 34 bytes: "1.39999999999999999999999999999998" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff66666 66666666 + 3c999999 99999998 = 1.3999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ff66666 66666666 + 3c999999 9999999a = 1.3999999999999999 + 8.8817841970012528e-17 ddI[0] == strtod Input: -1.4 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.4 = #bff66666 66666666 dd[1] = -8.88178419700125e-17 = #bc999999 99999998 g_ddfmt(0) gives 35 bytes: "-1.39999999999999999999999999999998" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff66666 66666666 + bc999999 9999999a = -1.3999999999999999 + -8.8817841970012528e-17 ddI[1] = #bff66666 66666666 + bc999999 99999998 = -1.3999999999999999 + -8.8817841970012504e-17 ddI[1] == strtod Input: 1.5 strtopdd consumes 3 bytes and returns 1 dd[0] = 1.5 = #3ff80000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 1, consuming 3 bytes. ddI[0] == ddI[1] == strtopdd Input: -1.5 strtopdd consumes 4 bytes and returns 9 dd[0] = -1.5 = #bff80000 0 dd[1] = -0 = #80000000 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 9, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.6 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.5999999999999999 = #3ff99999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.6" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff99999 99999999 + 3ca33333 33333333 = 1.5999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff99999 99999999 + 3ca33333 33333334 = 1.5999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.6 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.5999999999999999 = #bff99999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.6" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff99999 99999999 + bca33333 33333334 = -1.5999999999999999 + -1.332267629550188e-16 ddI[1] = #bff99999 99999999 + bca33333 33333333 = -1.5999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.7 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.7 = #3ffb3333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.7" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ffb3333 33333333 + 3c899999 99999998 = 1.7 + 4.4408920985006252e-17 ddI[1] = #3ffb3333 33333333 + 3c899999 9999999c = 1.7 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.7 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.7 = #bffb3333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.7" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bffb3333 33333333 + bc899999 9999999c = -1.7 + -4.4408920985006276e-17 ddI[1] = #bffb3333 33333333 + bc899999 99999998 = -1.7 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.8 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.7999999999999998 = #3ffccccc cccccccc dd[1] = 1.7763568394002503e-16 = #3ca99999 99999999 g_ddfmt(0) gives 34 bytes: "1.79999999999999999999999999999999" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffccccc cccccccc + 3ca99999 99999999 = 1.7999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ffccccc cccccccc + 3ca99999 9999999a = 1.7999999999999998 + 1.7763568394002506e-16 ddI[0] == strtod Input: -1.8 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.7999999999999998 = #bffccccc cccccccc dd[1] = -1.7763568394002503e-16 = #bca99999 99999999 g_ddfmt(0) gives 35 bytes: "-1.79999999999999999999999999999999" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffccccc cccccccc + bca99999 9999999a = -1.7999999999999998 + -1.7763568394002506e-16 ddI[1] = #bffccccc cccccccc + bca99999 99999999 = -1.7999999999999998 + -1.7763568394002503e-16 ddI[1] == strtod Input: 1.9 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.9 = #3ffe6666 66666666 dd[1] = 8.88178419700125e-17 = #3c999999 99999998 g_ddfmt(0) gives 34 bytes: "1.89999999999999999999999999999998" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffe6666 66666666 + 3c999999 99999998 = 1.8999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ffe6666 66666666 + 3c999999 9999999a = 1.8999999999999999 + 8.8817841970012528e-17 ddI[0] == strtod Input: -1.9 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.9 = #bffe6666 66666666 dd[1] = -8.88178419700125e-17 = #bc999999 99999998 g_ddfmt(0) gives 35 bytes: "-1.89999999999999999999999999999998" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffe6666 66666666 + bc999999 9999999a = -1.8999999999999999 + -8.8817841970012528e-17 ddI[1] = #bffe6666 66666666 + bc999999 99999998 = -1.8999999999999999 + -8.8817841970012504e-17 ddI[1] == strtod Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.0999999999999999 = #3ff19999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.1" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff19999 99999999 + 3ca33333 33333333 = 1.0999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff19999 99999999 + 3ca33333 33333334 = 1.0999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.1 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.0999999999999999 = #bff19999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.1" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff19999 99999999 + bca33333 33333334 = -1.0999999999999999 + -1.332267629550188e-16 ddI[1] = #bff19999 99999999 + bca33333 33333333 = -1.0999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.2 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.2 = #3ff33333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.2" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff33333 33333333 + 3c899999 99999998 = 1.2 + 4.4408920985006252e-17 ddI[1] = #3ff33333 33333333 + 3c899999 9999999c = 1.2 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.2 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.2 = #bff33333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.2" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff33333 33333333 + bc899999 9999999c = -1.2 + -4.4408920985006276e-17 ddI[1] = #bff33333 33333333 + bc899999 99999998 = -1.2 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.3 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.2999999999999998 = #3ff4cccc cccccccc dd[1] = 1.7763568394002506e-16 = #3ca99999 9999999a g_ddfmt(0) gives 3 bytes: "1.3" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff4cccc cccccccc + 3ca99999 99999999 = 1.2999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ff4cccc cccccccc + 3ca99999 9999999a = 1.2999999999999998 + 1.7763568394002506e-16 ddI[1] == strtod Input: -1.3 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.2999999999999998 = #bff4cccc cccccccc dd[1] = -1.7763568394002506e-16 = #bca99999 9999999a g_ddfmt(0) gives 4 bytes: "-1.3" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff4cccc cccccccc + bca99999 9999999a = -1.2999999999999998 + -1.7763568394002506e-16 ddI[1] = #bff4cccc cccccccc + bca99999 99999999 = -1.2999999999999998 + -1.7763568394002503e-16 ddI[0] == strtod Input: 1.4 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.4 = #3ff66666 66666666 dd[1] = 8.881784197001253e-17 = #3c999999 9999999a g_ddfmt(0) gives 3 bytes: "1.4" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff66666 66666666 + 3c999999 99999998 = 1.3999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ff66666 66666666 + 3c999999 9999999a = 1.3999999999999999 + 8.8817841970012528e-17 ddI[1] == strtod Input: -1.4 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.4 = #bff66666 66666666 dd[1] = -8.881784197001253e-17 = #bc999999 9999999a g_ddfmt(0) gives 4 bytes: "-1.4" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff66666 66666666 + bc999999 9999999a = -1.3999999999999999 + -8.8817841970012528e-17 ddI[1] = #bff66666 66666666 + bc999999 99999998 = -1.3999999999999999 + -8.8817841970012504e-17 ddI[0] == strtod Input: 1.5 strtopdd consumes 3 bytes and returns 1 dd[0] = 1.5 = #3ff80000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 1, consuming 3 bytes. ddI[0] == ddI[1] == strtopdd Input: -1.5 strtopdd consumes 4 bytes and returns 9 dd[0] = -1.5 = #bff80000 0 dd[1] = -0 = #80000000 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 9, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.6 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.5999999999999999 = #3ff99999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.6" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff99999 99999999 + 3ca33333 33333333 = 1.5999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff99999 99999999 + 3ca33333 33333334 = 1.5999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.6 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.5999999999999999 = #bff99999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.6" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff99999 99999999 + bca33333 33333334 = -1.5999999999999999 + -1.332267629550188e-16 ddI[1] = #bff99999 99999999 + bca33333 33333333 = -1.5999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.7 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.7 = #3ffb3333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.7" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ffb3333 33333333 + 3c899999 99999998 = 1.7 + 4.4408920985006252e-17 ddI[1] = #3ffb3333 33333333 + 3c899999 9999999c = 1.7 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.7 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.7 = #bffb3333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.7" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bffb3333 33333333 + bc899999 9999999c = -1.7 + -4.4408920985006276e-17 ddI[1] = #bffb3333 33333333 + bc899999 99999998 = -1.7 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.8 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.7999999999999998 = #3ffccccc cccccccc dd[1] = 1.7763568394002506e-16 = #3ca99999 9999999a g_ddfmt(0) gives 3 bytes: "1.8" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffccccc cccccccc + 3ca99999 99999999 = 1.7999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ffccccc cccccccc + 3ca99999 9999999a = 1.7999999999999998 + 1.7763568394002506e-16 ddI[1] == strtod Input: -1.8 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.7999999999999998 = #bffccccc cccccccc dd[1] = -1.7763568394002506e-16 = #bca99999 9999999a g_ddfmt(0) gives 4 bytes: "-1.8" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffccccc cccccccc + bca99999 9999999a = -1.7999999999999998 + -1.7763568394002506e-16 ddI[1] = #bffccccc cccccccc + bca99999 99999999 = -1.7999999999999998 + -1.7763568394002503e-16 ddI[0] == strtod Input: 1.9 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.9 = #3ffe6666 66666666 dd[1] = 8.881784197001253e-17 = #3c999999 9999999a g_ddfmt(0) gives 3 bytes: "1.9" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffe6666 66666666 + 3c999999 99999998 = 1.8999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ffe6666 66666666 + 3c999999 9999999a = 1.8999999999999999 + 8.8817841970012528e-17 ddI[1] == strtod Input: -1.9 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.9 = #bffe6666 66666666 dd[1] = -8.881784197001253e-17 = #bc999999 9999999a g_ddfmt(0) gives 4 bytes: "-1.9" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffe6666 66666666 + bc999999 9999999a = -1.8999999999999999 + -8.8817841970012528e-17 ddI[1] = #bffe6666 66666666 + bc999999 99999998 = -1.8999999999999999 + -8.8817841970012504e-17 ddI[0] == strtod Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.0999999999999999 = #3ff19999 99999999 dd[1] = 1.332267629550188e-16 = #3ca33333 33333334 g_ddfmt(0) gives 34 bytes: "1.10000000000000000000000000000002" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff19999 99999999 + 3ca33333 33333333 = 1.0999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff19999 99999999 + 3ca33333 33333334 = 1.0999999999999999 + 1.332267629550188e-16 ddI[1] == strtod Input: -1.1 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.0999999999999999 = #bff19999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.1" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff19999 99999999 + bca33333 33333334 = -1.0999999999999999 + -1.332267629550188e-16 ddI[1] = #bff19999 99999999 + bca33333 33333333 = -1.0999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.2 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.2 = #3ff33333 33333333 dd[1] = 4.4408920985006276e-17 = #3c899999 9999999c g_ddfmt(0) gives 34 bytes: "1.20000000000000000000000000000001" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff33333 33333333 + 3c899999 99999998 = 1.2 + 4.4408920985006252e-17 ddI[1] = #3ff33333 33333333 + 3c899999 9999999c = 1.2 + 4.4408920985006276e-17 ddI[1] == strtod Input: -1.2 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.2 = #bff33333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.2" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff33333 33333333 + bc899999 9999999c = -1.2 + -4.4408920985006276e-17 ddI[1] = #bff33333 33333333 + bc899999 99999998 = -1.2 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.3 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.2999999999999998 = #3ff4cccc cccccccc dd[1] = 1.7763568394002506e-16 = #3ca99999 9999999a g_ddfmt(0) gives 3 bytes: "1.3" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff4cccc cccccccc + 3ca99999 99999999 = 1.2999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ff4cccc cccccccc + 3ca99999 9999999a = 1.2999999999999998 + 1.7763568394002506e-16 ddI[1] == strtod Input: -1.3 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.2999999999999998 = #bff4cccc cccccccc dd[1] = -1.7763568394002503e-16 = #bca99999 99999999 g_ddfmt(0) gives 35 bytes: "-1.29999999999999999999999999999999" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff4cccc cccccccc + bca99999 9999999a = -1.2999999999999998 + -1.7763568394002506e-16 ddI[1] = #bff4cccc cccccccc + bca99999 99999999 = -1.2999999999999998 + -1.7763568394002503e-16 ddI[1] == strtod Input: 1.4 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.4 = #3ff66666 66666666 dd[1] = 8.881784197001253e-17 = #3c999999 9999999a g_ddfmt(0) gives 3 bytes: "1.4" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff66666 66666666 + 3c999999 99999998 = 1.3999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ff66666 66666666 + 3c999999 9999999a = 1.3999999999999999 + 8.8817841970012528e-17 ddI[1] == strtod Input: -1.4 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.4 = #bff66666 66666666 dd[1] = -8.88178419700125e-17 = #bc999999 99999998 g_ddfmt(0) gives 35 bytes: "-1.39999999999999999999999999999998" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff66666 66666666 + bc999999 9999999a = -1.3999999999999999 + -8.8817841970012528e-17 ddI[1] = #bff66666 66666666 + bc999999 99999998 = -1.3999999999999999 + -8.8817841970012504e-17 ddI[1] == strtod Input: 1.5 strtopdd consumes 3 bytes and returns 1 dd[0] = 1.5 = #3ff80000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 1, consuming 3 bytes. ddI[0] == ddI[1] == strtopdd Input: -1.5 strtopdd consumes 4 bytes and returns 9 dd[0] = -1.5 = #bff80000 0 dd[1] = -0 = #80000000 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 9, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.6 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.5999999999999999 = #3ff99999 99999999 dd[1] = 1.332267629550188e-16 = #3ca33333 33333334 g_ddfmt(0) gives 34 bytes: "1.60000000000000000000000000000002" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff99999 99999999 + 3ca33333 33333333 = 1.5999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff99999 99999999 + 3ca33333 33333334 = 1.5999999999999999 + 1.332267629550188e-16 ddI[1] == strtod Input: -1.6 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.5999999999999999 = #bff99999 99999999 dd[1] = -1.3322676295501878e-16 = #bca33333 33333333 g_ddfmt(0) gives 4 bytes: "-1.6" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff99999 99999999 + bca33333 33333334 = -1.5999999999999999 + -1.332267629550188e-16 ddI[1] = #bff99999 99999999 + bca33333 33333333 = -1.5999999999999999 + -1.3322676295501878e-16 ddI[1] == strtod Input: 1.7 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.7 = #3ffb3333 33333333 dd[1] = 4.4408920985006276e-17 = #3c899999 9999999c g_ddfmt(0) gives 34 bytes: "1.70000000000000000000000000000001" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ffb3333 33333333 + 3c899999 99999998 = 1.7 + 4.4408920985006252e-17 ddI[1] = #3ffb3333 33333333 + 3c899999 9999999c = 1.7 + 4.4408920985006276e-17 ddI[1] == strtod Input: -1.7 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.7 = #bffb3333 33333333 dd[1] = -4.440892098500625e-17 = #bc899999 99999998 g_ddfmt(0) gives 4 bytes: "-1.7" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bffb3333 33333333 + bc899999 9999999c = -1.7 + -4.4408920985006276e-17 ddI[1] = #bffb3333 33333333 + bc899999 99999998 = -1.7 + -4.4408920985006252e-17 ddI[1] == strtod Input: 1.8 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.7999999999999998 = #3ffccccc cccccccc dd[1] = 1.7763568394002506e-16 = #3ca99999 9999999a g_ddfmt(0) gives 3 bytes: "1.8" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffccccc cccccccc + 3ca99999 99999999 = 1.7999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ffccccc cccccccc + 3ca99999 9999999a = 1.7999999999999998 + 1.7763568394002506e-16 ddI[1] == strtod Input: -1.8 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.7999999999999998 = #bffccccc cccccccc dd[1] = -1.7763568394002503e-16 = #bca99999 99999999 g_ddfmt(0) gives 35 bytes: "-1.79999999999999999999999999999999" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffccccc cccccccc + bca99999 9999999a = -1.7999999999999998 + -1.7763568394002506e-16 ddI[1] = #bffccccc cccccccc + bca99999 99999999 = -1.7999999999999998 + -1.7763568394002503e-16 ddI[1] == strtod Input: 1.9 strtopdd consumes 3 bytes and returns 33 dd[0] = 1.9 = #3ffe6666 66666666 dd[1] = 8.881784197001253e-17 = #3c999999 9999999a g_ddfmt(0) gives 3 bytes: "1.9" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffe6666 66666666 + 3c999999 99999998 = 1.8999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ffe6666 66666666 + 3c999999 9999999a = 1.8999999999999999 + 8.8817841970012528e-17 ddI[1] == strtod Input: -1.9 strtopdd consumes 4 bytes and returns 25 dd[0] = -1.9 = #bffe6666 66666666 dd[1] = -8.88178419700125e-17 = #bc999999 99999998 g_ddfmt(0) gives 35 bytes: "-1.89999999999999999999999999999998" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffe6666 66666666 + bc999999 9999999a = -1.8999999999999999 + -8.8817841970012528e-17 ddI[1] = #bffe6666 66666666 + bc999999 99999998 = -1.8999999999999999 + -8.8817841970012504e-17 ddI[1] == strtod Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.0999999999999999 = #3ff19999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.1" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff19999 99999999 + 3ca33333 33333333 = 1.0999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff19999 99999999 + 3ca33333 33333334 = 1.0999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.1 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.0999999999999999 = #bff19999 99999999 dd[1] = -1.332267629550188e-16 = #bca33333 33333334 g_ddfmt(0) gives 35 bytes: "-1.10000000000000000000000000000002" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff19999 99999999 + bca33333 33333334 = -1.0999999999999999 + -1.332267629550188e-16 ddI[1] = #bff19999 99999999 + bca33333 33333333 = -1.0999999999999999 + -1.3322676295501878e-16 ddI[0] == strtod Input: 1.2 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.2 = #3ff33333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.2" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff33333 33333333 + 3c899999 99999998 = 1.2 + 4.4408920985006252e-17 ddI[1] = #3ff33333 33333333 + 3c899999 9999999c = 1.2 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.2 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.2 = #bff33333 33333333 dd[1] = -4.4408920985006276e-17 = #bc899999 9999999c g_ddfmt(0) gives 35 bytes: "-1.20000000000000000000000000000001" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff33333 33333333 + bc899999 9999999c = -1.2 + -4.4408920985006276e-17 ddI[1] = #bff33333 33333333 + bc899999 99999998 = -1.2 + -4.4408920985006252e-17 ddI[0] == strtod Input: 1.3 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.2999999999999998 = #3ff4cccc cccccccc dd[1] = 1.7763568394002503e-16 = #3ca99999 99999999 g_ddfmt(0) gives 34 bytes: "1.29999999999999999999999999999999" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff4cccc cccccccc + 3ca99999 99999999 = 1.2999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ff4cccc cccccccc + 3ca99999 9999999a = 1.2999999999999998 + 1.7763568394002506e-16 ddI[0] == strtod Input: -1.3 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.2999999999999998 = #bff4cccc cccccccc dd[1] = -1.7763568394002506e-16 = #bca99999 9999999a g_ddfmt(0) gives 4 bytes: "-1.3" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff4cccc cccccccc + bca99999 9999999a = -1.2999999999999998 + -1.7763568394002506e-16 ddI[1] = #bff4cccc cccccccc + bca99999 99999999 = -1.2999999999999998 + -1.7763568394002503e-16 ddI[0] == strtod Input: 1.4 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.4 = #3ff66666 66666666 dd[1] = 8.88178419700125e-17 = #3c999999 99999998 g_ddfmt(0) gives 34 bytes: "1.39999999999999999999999999999998" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ff66666 66666666 + 3c999999 99999998 = 1.3999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ff66666 66666666 + 3c999999 9999999a = 1.3999999999999999 + 8.8817841970012528e-17 ddI[0] == strtod Input: -1.4 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.4 = #bff66666 66666666 dd[1] = -8.881784197001253e-17 = #bc999999 9999999a g_ddfmt(0) gives 4 bytes: "-1.4" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bff66666 66666666 + bc999999 9999999a = -1.3999999999999999 + -8.8817841970012528e-17 ddI[1] = #bff66666 66666666 + bc999999 99999998 = -1.3999999999999999 + -8.8817841970012504e-17 ddI[0] == strtod Input: 1.5 strtopdd consumes 3 bytes and returns 1 dd[0] = 1.5 = #3ff80000 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 1, consuming 3 bytes. ddI[0] == ddI[1] == strtopdd Input: -1.5 strtopdd consumes 4 bytes and returns 9 dd[0] = -1.5 = #bff80000 0 dd[1] = -0 = #80000000 0 g_ddfmt(0) gives 3 bytes: "1.5" strtoIdd returns 9, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.6 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.5999999999999999 = #3ff99999 99999999 dd[1] = 1.3322676295501878e-16 = #3ca33333 33333333 g_ddfmt(0) gives 3 bytes: "1.6" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ff99999 99999999 + 3ca33333 33333333 = 1.5999999999999999 + 1.3322676295501878e-16 ddI[1] = #3ff99999 99999999 + 3ca33333 33333334 = 1.5999999999999999 + 1.332267629550188e-16 ddI[0] == strtod Input: -1.6 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.5999999999999999 = #bff99999 99999999 dd[1] = -1.332267629550188e-16 = #bca33333 33333334 g_ddfmt(0) gives 35 bytes: "-1.60000000000000000000000000000002" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bff99999 99999999 + bca33333 33333334 = -1.5999999999999999 + -1.332267629550188e-16 ddI[1] = #bff99999 99999999 + bca33333 33333333 = -1.5999999999999999 + -1.3322676295501878e-16 ddI[0] == strtod Input: 1.7 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.7 = #3ffb3333 33333333 dd[1] = 4.440892098500625e-17 = #3c899999 99999998 g_ddfmt(0) gives 3 bytes: "1.7" strtoIdd returns 17, consuming 3 bytes. ddI[0] = #3ffb3333 33333333 + 3c899999 99999998 = 1.7 + 4.4408920985006252e-17 ddI[1] = #3ffb3333 33333333 + 3c899999 9999999c = 1.7 + 4.4408920985006276e-17 ddI[0] == strtod Input: -1.7 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.7 = #bffb3333 33333333 dd[1] = -4.4408920985006276e-17 = #bc899999 9999999c g_ddfmt(0) gives 35 bytes: "-1.70000000000000000000000000000001" strtoIdd returns 25, consuming 4 bytes. ddI[0] = #bffb3333 33333333 + bc899999 9999999c = -1.7 + -4.4408920985006276e-17 ddI[1] = #bffb3333 33333333 + bc899999 99999998 = -1.7 + -4.4408920985006252e-17 ddI[0] == strtod Input: 1.8 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.7999999999999998 = #3ffccccc cccccccc dd[1] = 1.7763568394002503e-16 = #3ca99999 99999999 g_ddfmt(0) gives 34 bytes: "1.79999999999999999999999999999999" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffccccc cccccccc + 3ca99999 99999999 = 1.7999999999999998 + 1.7763568394002503e-16 ddI[1] = #3ffccccc cccccccc + 3ca99999 9999999a = 1.7999999999999998 + 1.7763568394002506e-16 ddI[0] == strtod Input: -1.8 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.7999999999999998 = #bffccccc cccccccc dd[1] = -1.7763568394002506e-16 = #bca99999 9999999a g_ddfmt(0) gives 4 bytes: "-1.8" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffccccc cccccccc + bca99999 9999999a = -1.7999999999999998 + -1.7763568394002506e-16 ddI[1] = #bffccccc cccccccc + bca99999 99999999 = -1.7999999999999998 + -1.7763568394002503e-16 ddI[0] == strtod Input: 1.9 strtopdd consumes 3 bytes and returns 17 dd[0] = 1.9 = #3ffe6666 66666666 dd[1] = 8.88178419700125e-17 = #3c999999 99999998 g_ddfmt(0) gives 34 bytes: "1.89999999999999999999999999999998" strtoIdd returns 33, consuming 3 bytes. ddI[0] = #3ffe6666 66666666 + 3c999999 99999998 = 1.8999999999999999 + 8.8817841970012504e-17 ddI[1] = #3ffe6666 66666666 + 3c999999 9999999a = 1.8999999999999999 + 8.8817841970012528e-17 ddI[0] == strtod Input: -1.9 strtopdd consumes 4 bytes and returns 41 dd[0] = -1.9 = #bffe6666 66666666 dd[1] = -8.881784197001253e-17 = #bc999999 9999999a g_ddfmt(0) gives 4 bytes: "-1.9" strtoIdd returns 41, consuming 4 bytes. ddI[0] = #bffe6666 66666666 + bc999999 9999999a = -1.8999999999999999 + -8.8817841970012528e-17 ddI[1] = #bffe6666 66666666 + bc999999 99999998 = -1.8999999999999999 + -8.8817841970012504e-17 ddI[0] == strtod mlton-20210117+dfsg/runtime/gdtoa/test/ddsi.out000066400000000000000000000246451416264345000212550ustar00rootroot00000000000000 Input: 1.23 strtopdd consumes 4 bytes and returns 17 dd[0] = 1.23 = #3ff3ae14 7ae147ae dd[1] = 1.7763568394002496e-17 = #3c747ae1 47ae1478 g_ddfmt(0) gives 4 bytes: "1.23" strtoIdd returns 17, consuming 4 bytes. ddI[0] = #3ff3ae14 7ae147ae + 3c747ae1 47ae1478 = 1.23 + 1.7763568394002496e-17 ddI[1] = #3ff3ae14 7ae147ae + 3c747ae1 47ae1480 = 1.23 + 1.776356839400252e-17 ddI[0] == strtod Input: 1.23e+20 strtopdd consumes 8 bytes and returns 1 dd[0] = 1.23e+20 = #441aabdf 2145b430 dd[1] = 0 = #0 0 g_ddfmt(0) gives 8 bytes: "1.23e+20" strtoIdd returns 1, consuming 8 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e-20 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e-20 = #3bcd0ae4 cf767530 dd[1] = 9.304023318521521e-37 = #3873c997 955b2691 g_ddfmt(0) gives 8 bytes: "1.23e-20" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #3bcd0ae4 cf767530 + 3873c997 955b2690 = 1.2299999999999999e-20 + 9.3040233185215194e-37 ddI[1] = #3bcd0ae4 cf767530 + 3873c997 955b2691 = 1.2299999999999999e-20 + 9.3040233185215211e-37 ddI[1] == strtod Input: 1.23456789 strtopdd consumes 10 bytes and returns 17 dd[0] = 1.23456789 = #3ff3c0ca 4283de1b dd[1] = 1.0990618193318369e-16 = #3c9fada5 144c1252 g_ddfmt(0) gives 10 bytes: "1.23456789" strtoIdd returns 17, consuming 10 bytes. ddI[0] = #3ff3c0ca 4283de1b + 3c9fada5 144c1252 = 1.2345678899999999 + 1.0990618193318369e-16 ddI[1] = #3ff3c0ca 4283de1b + 3c9fada5 144c1254 = 1.2345678899999999 + 1.0990618193318371e-16 ddI[0] == strtod Input: 1.23456589e+20 strtopdd consumes 14 bytes and returns 1 dd[0] = 1.23456589e+20 = #441ac537 a660b997 dd[1] = 4096 = #40b00000 0 g_ddfmt(0) gives 14 bytes: "1.23456589e+20" strtoIdd returns 1, consuming 14 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e+30 strtopdd consumes 8 bytes and returns 1 dd[0] = 1.23e+30 = #462f0cb0 4e8fb790 dd[1] = 40281156091904 = #42c25158 0 g_ddfmt(0) gives 8 bytes: "1.23e+30" strtoIdd returns 1, consuming 8 bytes. ddI[0] == ddI[1] == strtopdd Input: 1.23e-30 strtopdd consumes 8 bytes and returns 17 dd[0] = 1.2299999999999999e-30 = #39b8f286 6f5010aa dd[1] = 1.076909723013918e-46 = #3663ac7f 3dafd174 g_ddfmt(0) gives 8 bytes: "1.23e-30" strtoIdd returns 17, consuming 8 bytes. ddI[0] = #39b8f286 6f5010aa + 3663ac7f 3dafd174 = 1.2299999999999999e-30 + 1.076909723013918e-46 ddI[1] = #39b8f286 6f5010aa + 3663ac7f 3dafd175 = 1.2299999999999999e-30 + 1.0769097230139181e-46 ddI[0] == strtod Input: 1.23456789e-20 strtopdd consumes 14 bytes and returns 17 dd[0] = 1.23456789e-20 = #3bcd2681 471e7ada dd[1] = 6.247111971663133e-37 = #386a9280 a761b07e g_ddfmt(0) gives 14 bytes: "1.23456789e-20" strtoIdd returns 17, consuming 14 bytes. ddI[0] = #3bcd2681 471e7ada + 386a9280 a761b07e = 1.2345678899999999e-20 + 6.2471119716631328e-37 ddI[1] = #3bcd2681 471e7ada + 386a9280 a761b080 = 1.2345678899999999e-20 + 6.2471119716631345e-37 ddI[0] == strtod Input: 1.23456789e-30 strtopdd consumes 14 bytes and returns 33 dd[0] = 1.23456789e-30 = #39b90a3e 33bbd995 dd[1] = 2.1567930523648577e-47 = #363f8585 55a6b1a0 g_ddfmt(0) gives 14 bytes: "1.23456789e-30" strtoIdd returns 33, consuming 14 bytes. ddI[0] = #39b90a3e 33bbd995 + 363f8585 55a6b198 = 1.23456789e-30 + 2.1567930523648558e-47 ddI[1] = #39b90a3e 33bbd995 + 363f8585 55a6b1a0 = 1.23456789e-30 + 2.1567930523648577e-47 ddI[1] == strtod Input: 1.234567890123456789 strtopdd consumes 20 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.856786452588859e-17 = #3c9c6906 51a3745e g_ddfmt(0) gives 20 bytes: "1.234567890123456789" strtoIdd returns 33, consuming 20 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745c = 1.2345678901234567 + 9.8567864525888563e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745e = 1.2345678901234567 + 9.8567864525888588e-17 ddI[1] == strtod Input: 1.23456789012345678901234567890123456789 strtopdd consumes 40 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.858021020478982e-17 = #3c9c69ef 85adadb6 g_ddfmt(0) gives 34 bytes: "1.23456789012345678901234567890124" strtoIdd returns 33, consuming 40 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c69ef 85adadb4 = 1.2345678901234567 + 9.8580210204789798e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c69ef 85adadb6 = 1.2345678901234567 + 9.8580210204789823e-17 ddI[1] == strtod Input: 1.23e306 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e+306 = #7f7c0676 cd1c61f4 dd[1] = 1.3319001448659015e+290 = #7c2b558b e3d3f477 g_ddfmt(0) gives 9 bytes: "1.23e+306" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #7f7c0676 cd1c61f4 + 7c2b558b e3d3f476 = 1.2299999999999999e+306 + 1.3319001448659013e+290 ddI[1] = #7f7c0676 cd1c61f4 + 7c2b558b e3d3f477 = 1.2299999999999999e+306 + 1.3319001448659015e+290 ddI[1] == strtod Input: 1.23e-306 strtopdd consumes 9 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 9 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 1.23e-320 strtopdd consumes 9 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 9 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 1.23e-20 strtopdd consumes 8 bytes and returns 33 dd[0] = 1.2299999999999999e-20 = #3bcd0ae4 cf767530 dd[1] = 9.304023318521521e-37 = #3873c997 955b2691 g_ddfmt(0) gives 8 bytes: "1.23e-20" strtoIdd returns 33, consuming 8 bytes. ddI[0] = #3bcd0ae4 cf767530 + 3873c997 955b2690 = 1.2299999999999999e-20 + 9.3040233185215194e-37 ddI[1] = #3bcd0ae4 cf767530 + 3873c997 955b2691 = 1.2299999999999999e-20 + 9.3040233185215211e-37 ddI[1] == strtod Input: 1.23456789e307 strtopdd consumes 14 bytes and returns 33 dd[0] = 1.2345678899999998e+307 = #7fb194b1 4bdaecdb dd[1] = 2.0137933598720243e+291 = #7c69d48d 192048ca g_ddfmt(0) gives 15 bytes: "1.23456789e+307" strtoIdd returns 33, consuming 14 bytes. ddI[0] = #7fb194b1 4bdaecdb + 7c69d48d 192048c9 = 1.2345678899999998e+307 + 2.013793359872024e+291 ddI[1] = #7fb194b1 4bdaecdb + 7c69d48d 192048ca = 1.2345678899999998e+307 + 2.0137933598720243e+291 ddI[1] == strtod Input: 1.23456589e-307 strtopdd consumes 15 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 15 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 1.234567890123456789 strtopdd consumes 20 bytes and returns 33 dd[0] = 1.2345678901234567 = #3ff3c0ca 428c59fb dd[1] = 9.856786452588859e-17 = #3c9c6906 51a3745e g_ddfmt(0) gives 20 bytes: "1.234567890123456789" strtoIdd returns 33, consuming 20 bytes. ddI[0] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745c = 1.2345678901234567 + 9.8567864525888563e-17 ddI[1] = #3ff3c0ca 428c59fb + 3c9c6906 51a3745e = 1.2345678901234567 + 9.8567864525888588e-17 ddI[1] == strtod Input: 1.234567890123456789e301 strtopdd consumes 24 bytes and returns 33 dd[0] = 1.2345678901234568e+301 = #7e726f51 75f56413 dd[1] = 1.3892003943918827e+283 = #7ab7ea80 76399100 g_ddfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIdd returns 33, consuming 24 bytes. ddI[0] = #7e726f51 75f56413 + 7ab7ea80 76399080 = 1.2345678901234568e+301 + 1.3892003943918563e+283 ddI[1] = #7e726f51 75f56413 + 7ab7ea80 76399100 = 1.2345678901234568e+301 + 1.3892003943918827e+283 ddI[1] == strtod Input: 1.234567890123456789e-301 strtopdd consumes 25 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 25 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 1.234567890123456789e-321 strtopdd consumes 25 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 25 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 1e23 strtopdd consumes 4 bytes and returns 1 dd[0] = 1e+23 = #44b52d02 c7e14af6 dd[1] = 8388608 = #41600000 0 g_ddfmt(0) gives 5 bytes: "1e+23" strtoIdd returns 1, consuming 4 bytes. ddI[0] == ddI[1] == strtopdd Input: 1e310 strtopdd consumes 5 bytes and returns 163 dd[0] = Infinity = #7ff00000 0 dd[1] = Infinity = #7ff00000 0 g_ddfmt(0) gives 8 bytes: "Infinity" strtoIdd returns 163, consuming 5 bytes. ddI[0] = #7fefffff ffffffff + 7c9fffff ffffffff = 1.7976931348623157e+308 + 1.9958403095347196e+292 ddI[1] = #7ff00000 0 + 7ff00000 0 = Infinity + Infinity ddI[1] == strtod g_ddfmt_p(...,0): "Infinity" g_ddfmt_p(...,1): "Infinity" g_ddfmt_p(...,2): "Infinity" g_ddfmt_p(...,3): "Infinity" g_ddfmt_p(...,4): "Infinity" g_ddfmt_p(...,5): "Infinity" Input: 9.0259718793241475e-277 strtopdd consumes 23 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 23 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 9.025971879324147880346310405869e-277 strtopdd consumes 37 bytes and returns 17 dd[0] = 9.025971879324148e-277 = #6a00000 0 dd[1] = 2.2250738585072014e-308 = #100000 0 g_ddfmt(0) gives 37 bytes: "9.025971879324147880346310405869e-277" strtoIdd returns 17, consuming 37 bytes. ddI[0] = #6a00000 0 + 100000 0 = 9.0259718793241479e-277 + 2.2250738585072014e-308 ddI[1] = #6a00000 0 + 200000 0 = 9.0259718793241479e-277 + 4.4501477170144028e-308 ddI[0] == strtod Input: 9.025971879324147880346310405868e-277 strtopdd consumes 37 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 37 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 2.2250738585072014e-308 strtopdd consumes 23 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 23 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 2.2250738585072013e-308 strtopdd consumes 23 bytes and returns 80 dd[0] = 0 = #0 0 dd[1] = 0 = #0 0 g_ddfmt(0) gives 1 bytes: "0" strtoIdd returns 80, consuming 23 bytes. ddI[0] = #0 0 + 0 0 = 0 + 0 ddI[1] = #6a00000 0 + 0 0 = 9.0259718793241479e-277 + 0 ddI[0] == strtod Input: 3.2649476e14 strtopdd consumes 12 bytes and returns 1 dd[0] = 3.2649476e+14 = #42f28f1f c30da000 dd[1] = 0 = #0 0 g_ddfmt(0) gives 13 bytes: "3.2649476e+14" strtoIdd returns 1, consuming 12 bytes. ddI[0] == ddI[1] == strtopdd mlton-20210117+dfsg/runtime/gdtoa/test/ddtest.c000066400000000000000000000127771416264345000212370ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_ddfmt, strtoIdd, strtopdd, and strtordd. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex0 hex1 hex2 hex3 * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex0 is a string of <= 8 Hex digits for the most significant * word of the number, hex1 is a similar string for the next * word, etc., and ndig is a parameters to g_ddfmt. */ #include "gdtoaimp.h" #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[1024], obuf1[2048]; #define UL (unsigned long) static void #ifdef KR_headers dprint(what, d) char *what; double d; #else dprint(char *what, double d) #endif { U u; char buf[32]; u.d = d; g_dfmt(buf,&d,0,sizeof(buf)); printf("%s = %s = #%lx %lx\n", what, buf, UL u.L[_0], UL u.L[_1]); } int main(Void) { U ddI[4], u[2]; char *s, *s1, *se, *se1; int dItry, i, j, nik, nike, r = 1, ndig = 0; long LL[4]; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': LL[0] = u[0].L[_0]; LL[1] = u[0].L[_1]; LL[2] = u[1].L[_0]; LL[3] = u[1].L[_1]; sscanf(s+1, "%lx %lx %lx %lx", &LL[0], &LL[1], &LL[2], &LL[3]); u[0].L[_0] = LL[0]; u[0].L[_1] = LL[1]; u[1].L[_0] = LL[2]; u[1].L[_1] = LL[3]; printf("\nInput: %s", ibuf); printf(" --> f = #%lx %lx %lx %lx\n", LL[0],LL[1],LL[2],LL[3]); i = 0; goto fmt_test; } printf("\nInput: %s", ibuf); for(s1 = s; *s1 > ' '; s1++){}; while(*s1 <= ' ' && *s1) s1++; if (!*s1) { dItry = 1; i = strtordd(ibuf, &se, r, &u[0].d); if (r == 1) { j = strtopdd(ibuf, &se1, &ddI[0].d); if (i != j || u[0].d != ddI[0].d || u[1].d != ddI[1].d || se != se1) printf("***strtopdd and strtordd disagree!!\n:"); } printf("strtopdd consumes %d bytes and returns %d\n", (int)(se-ibuf), i); } else { u[0].d = strtod(s, &se); u[1].d = strtod(se, &se); } fmt_test: dprint("dd[0]", u[0].d); dprint("dd[1]", u[1].d); se = g_ddfmt(obuf, &u[0].d, ndig, sizeof(obuf)); printf("g_ddfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_ddfmt_p(obuf1, &u[0].d, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_ddfmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (!dItry) continue; printf("strtoIdd returns %d,", strtoIdd(ibuf, &se, &ddI[0].d, &ddI[2].d)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (ddI[0].d == ddI[2].d && ddI[1].d == ddI[3].d) { if (ddI[0].d == u[0].d && ddI[1].d == u[1].d) printf("ddI[0] == ddI[1] == strtopdd\n"); else printf("ddI[0] == ddI[1] = #%lx %lx + %lx %lx\n= %.17g + %17.g\n", UL ddI[0].L[_0], UL ddI[0].L[_1], UL ddI[1].L[_0], UL ddI[1].L[_1], ddI[0].d, ddI[1].d); } else { printf("ddI[0] = #%lx %lx + %lx %lx\n= %.17g + %.17g\n", UL ddI[0].L[_0], UL ddI[0].L[_1], UL ddI[1].L[_0],UL ddI[1].L[_1], ddI[0].d, ddI[1].d); printf("ddI[1] = #%lx %lx + %lx %lx\n= %.17g + %.17g\n", UL ddI[2].L[_0], UL ddI[2].L[_1], UL ddI[3].L[_0],UL ddI[3].L[_1], ddI[2].d, ddI[3].d); if (ddI[0].d == u[0].d && ddI[1].d == u[1].d) printf("ddI[0] == strtod\n"); else if (ddI[2].d == u[0].d && ddI[3].d == u[1].d) printf("ddI[1] == strtod\n"); else printf("**** Both differ from strtopdd ****\n"); } switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_ddfmt_p(obuf1, &u[0].d, ndig, sizeof(obuf1), nik); printf("g_ddfmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_ddfmt_p(obuf1, &u[0].d, ndig, sizeof(obuf1), nik); printf("g_ddfmt_p(...,%d): \"%s\"\n", nik, obuf1); } } printf("\n"); } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/dt.c000066400000000000000000000156421416264345000203510ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for strtod and dtoa. * * Inputs (on stdin): * number[: mode [ndigits]] * or * #hex0 hex1[: mode [ndigits]] * where number is a decimal floating-point number, * hex0 is a string of Hex digits for the most significant * word of the number, hex1 is a similar string for the other * (least significant) word, and mode and ndigits are * parameters to dtoa. */ #include #include "gdtoa.h" int STRTOD_DIGLIM = 24; #ifdef KR_headers #define Void /*void*/ #else #define Void void #endif #ifdef __STDC__ #include #else #ifdef __cplusplus extern "C" double atof(const char*); #else extern double atof ANSI((char*)); #endif #endif typedef union { double d; ULong L[2]; } U; #ifdef IEEE_8087 #define word0(x) (x)->L[1] #define word1(x) (x)->L[0] #else #define word0(x) (x)->L[0] #define word1(x) (x)->L[1] #endif #define dval(x) (x)->d #include "errno.h" #ifdef __cplusplus extern "C" char *dtoa(double, int, int, int*, int*, char **); #else extern char *dtoa ANSI((double, int, int, int*, int*, char **)); #endif static void #ifdef KR_headers g_fmt(b, x) char *b; double x; #else g_fmt(char *b, double x) #endif { char *s, *se; int decpt, i, j, k, sign; if (!x) { *b++ = '0'; *b = 0; return; } s = dtoa(x, 0, 0, &decpt, &sign, &se); if (sign) *b++ = '-'; if (decpt == 9999) /* Infinity or Nan */ { while((*b++ = *s++)); return; } if (decpt <= -4 || decpt > se - s + 5) { *b++ = *s++; if (*s) { *b++ = '.'; while((*b = *s++)) b++; } *b++ = 'e'; /* sprintf(b, "%+.2d", decpt - 1); */ if (--decpt < 0) { *b++ = '-'; decpt = -decpt; } else *b++ = '+'; for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){}; for(;;) { i = decpt / k; *b++ = i + '0'; if (--j <= 0) break; decpt -= i*k; decpt *= 10; } *b = 0; } else if (decpt <= 0) { *b++ = '.'; for(; decpt < 0; decpt++) *b++ = '0'; while((*b++ = *s++)); } else { while((*b = *s++)) { b++; if (--decpt == 0 && *s) *b++ = '.'; } for(; decpt > 0; decpt--) *b++ = '0'; *b = 0; } } static void baderrno(Void) { fflush(stdout); perror("\nerrno strtod"); fflush(stderr); } #define UL (unsigned long) static void #ifdef KR_headers check(d) U *d; #else check(U *d) #endif { char buf[64]; int decpt, sign; char *s, *se; U d1; s = dtoa(dval(d), 0, 0, &decpt, &sign, &se); sprintf(buf, "%s%s%se%d", sign ? "-" : "", decpt == 9999 ? "" : ".", s, decpt); errno = 0; dval(&d1) = strtod(buf, (char **)0); if (errno) baderrno(); if (dval(d) != dval(&d1)) { printf("sent d = %.17g = 0x%lx %lx, buf = %s\n", dval(d), UL word0(d), UL word1(d), buf); printf("got d1 = %.17g = 0x%lx %lx\n", dval(&d1), UL word0(&d1), UL word1(&d1)); } } #ifdef USE_fpinit extern void fpinit_ASL(); /* fpinit_ASL() appears in the AMPL/solver interface library and with */ /* Intel 80x87-style processing, sets the rounding precision to 53 bits. */ #else #define fpinit_ASL() /*nothing*/ #endif int main(Void) { U d, d1; char buf[2048], buf1[32]; char *fmt, *s, *s1, *se; int decpt, sign; int mode = 0, ndigits = 17; ULong x, y; #ifdef VAX ULong z; #endif fpinit_ASL(); d.d = 0.; while(fgets(buf, sizeof(buf), stdin)) { if (*buf == '*') { printf("%s", buf); continue; } printf("Input: %s", buf); if (*buf == '#') { x = word0(&d); y = word1(&d); /* sscanf(buf+1, "%lx %lx:%d %d", &x, &y, &mode, &ndigits); */ x = (ULong)strtoul(s1 = buf+1, &se, 16); if (se > s1) { y = (ULong)strtoul(s1 = se, &se, 16); if (se > s1) sscanf(se, ":%d %d", &mode, &ndigits); } word0(&d) = x; word1(&d) = y; fmt = "Output: d =\n%.17g = 0x%lx %lx\n"; } else if (*buf == '*') { x = strtoul(buf,&s,10); if (!*s && x > 18) STRTOD_DIGLIM = (int)x; printf("STRTOD_DIGLIM = %lu\n", UL x); continue; } else { errno = 0; dval(&d) = strtod(buf,&se); if (*se == ':') sscanf(se+1,"%d %d", &mode, &ndigits); dval(&d1) = atof(buf); fmt = "Output: d =\n%.17g = 0x%lx %lx, se = %s"; if (errno) baderrno(); } printf(fmt, dval(&d), UL word0(&d), UL word1(&d), se); g_fmt(buf1, dval(&d)); printf("\tg_fmt gives \"%s\"\n", buf1); if (*buf != '#' && dval(&d) != dval(&d1)) printf("atof gives\n\ d1 = %.17g = 0x%lx %lx\nversus\n\ d = %.17g = 0x%lx %lx\n", dval(&d1), UL word0(&d1), UL word1(&d1), dval(&d), UL word0(&d), UL word1(&d)); check(&d); s = dtoa(dval(&d), mode, ndigits, &decpt, &sign, &se); printf("\tdtoa(mode = %d, ndigits = %d):\n", mode, ndigits); printf("\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", sign, decpt, (int)(se-s), s); x = word1(&d); if (x != 0xffffffff && (word0(&d) & 0x7ff00000) != 0x7ff00000) { #ifdef VAX z = x << 16 | x >> 16; z++; z = z << 16 | z >> 16; word1(&d) = z; #else word1(&d) = x + 1; #endif printf("\tnextafter(d,+Inf) = %.17g = 0x%lx %lx:\n", dval(&d), UL word0(&d), UL word1(&d)); g_fmt(buf1, dval(&d)); printf("\tg_fmt gives \"%s\"\n", buf1); s = dtoa(dval(&d), mode, ndigits, &decpt, &sign, &se); printf( "\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", sign, decpt, (int)(se-s), s); check(&d); } if (x) { #ifdef VAX z = x << 16 | x >> 16; z--; z = z << 16 | z >> 16; word1(&d) = z; #else word1(&d) = x - 1; #endif printf("\tnextafter(d,-Inf) = %.17g = 0x%lx %lx:\n", dval(&d), UL word0(&d), UL word1(&d)); g_fmt(buf1, dval(&d)); printf("\tg_fmt gives \"%s\"\n", buf1); s = dtoa(dval(&d), mode, ndigits, &decpt, &sign, &se); printf( "\tdtoa returns sign = %d, decpt = %d, %d digits:\n%s\n", sign, decpt, (int)(se-s), s); check(&d); } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/dtest.c000066400000000000000000000112021416264345000210510ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_dfmt, strtoId, strtod, strtopd, and strtord. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex0 hex1 * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex0 is a string of Hex <= 8 digits for the most significant * word of the number, hex1 is a similar string for the other * (least significant) word, and ndig is a parameters to g_dfmt. */ #include "gdtoaimp.h" #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[2048], obuf1[2048]; #define UL (unsigned long) int main(Void) { U fI[2], u; char *s, *se, *se1; double f1; int i, i1, ndig = 0, nik, nike, r = 1; long LL[2]; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': LL[0] = u.L[_0]; LL[1] = u.L[_1]; sscanf(s+1, "%lx %lx", &LL[0], &LL[1]); u.L[_0] = LL[0]; u.L[_1] = LL[1]; printf("\nInput: %s", ibuf); printf("--> f = #%lx %lx\n", (long)u.L[_0], (long)u.L[_1]); i = 0; goto fmt_test; } printf("\nInput: %s", ibuf); i = strtord(ibuf, &se, r, &u.d); if (r == 1) { if ((u.d != strtod(ibuf, &se1) || se1 != se)) printf("***strtod and strtord disagree!!\n"); i1 = strtopd(ibuf, &se, &f1); if (i != i1 || u.d != f1 || se != se1) printf("***strtord and strtopd disagree!!\n"); } printf("strtord consumes %d bytes and returns %d with f = %.17g = #%lx %lx\n", (int)(se-ibuf), i, u.d, UL u.L[_0], UL u.L[_1]); fmt_test: se = g_dfmt(obuf, &u.d, ndig, sizeof(obuf)); printf("g_dfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_dfmt_p(obuf1, &u.d, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_dfmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (*s == '#') continue; printf("strtoId returns %d,", strtoId(ibuf, &se, &fI[0].d, &fI[1].d)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (fI[0].d == fI[1].d) { if (fI[0].d == u.d) printf("fI[0] == fI[1] == strtod\n"); else printf("fI[0] == fI[1] = #%lx %lx = %.17g\n", UL fI[0].L[_0], UL fI[0].L[_1], fI[0].d); } else { printf("fI[0] = #%lx %lx = %.17g\n", UL fI[0].L[_0], UL fI[0].L[_1], fI[0].d); printf("fI[1] = #%lx %lx = %.17g\n", UL fI[1].L[_0], UL fI[1].L[_1], fI[1].d); if (fI[0].d == u.d) printf("fI[0] == strtod\n"); else if (fI[1].d == u.d) printf("fI[1] == strtod\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_dfmt_p(obuf1, &u.d, ndig, sizeof(obuf1), nik); printf("g_dfmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_dfmt_p(obuf1, &u.d, ndig, sizeof(obuf1), nik); printf("g_dfmt_p(...,%d): \"%s\"\n", nik, obuf1); } } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/dtst.out000066400000000000000000000572551416264345000213130ustar00rootroot00000000000000Input: 1.23 Output: d = 1.23 = 0x3ff3ae14 7ae147ae, se = g_fmt gives "1.23" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 1, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002 = 0x3ff3ae14 7ae147af: g_fmt gives "1.2300000000000002" dtoa returns sign = 0, decpt = 1, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999998 = 0x3ff3ae14 7ae147ad: g_fmt gives "1.2299999999999998" dtoa returns sign = 0, decpt = 1, 17 digits: 12299999999999998 Input: 1.23e+20 Output: d = 1.23e+20 = 0x441aabdf 2145b430, se = g_fmt gives "1.23e+20" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 21, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e+20 = 0x441aabdf 2145b431: g_fmt gives "123000000000000020000" dtoa returns sign = 0, decpt = 21, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999998e+20 = 0x441aabdf 2145b42f: g_fmt gives "122999999999999980000" dtoa returns sign = 0, decpt = 21, 17 digits: 12299999999999998 Input: 1.23e-20 Output: d = 1.2300000000000001e-20 = 0x3bcd0ae4 cf767531, se = g_fmt gives "1.23e-20" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-20 = 0x3bcd0ae4 cf767532: g_fmt gives "1.2300000000000002e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999999e-20 = 0x3bcd0ae4 cf767530: g_fmt gives "1.2299999999999999e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12299999999999999 Input: 1.23456789 Output: d = 1.2345678899999999 = 0x3ff3c0ca 4283de1b, se = g_fmt gives "1.23456789" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 1, 9 digits: 123456789 nextafter(d,+Infinity) = 1.2345678900000001 = 0x3ff3c0ca 4283de1c: g_fmt gives "1.2345678900000001" dtoa returns sign = 0, decpt = 1, 17 digits: 12345678900000001 nextafter(d,-Infinity) = 1.2345678899999997 = 0x3ff3c0ca 4283de1a: g_fmt gives "1.2345678899999997" dtoa returns sign = 0, decpt = 1, 17 digits: 12345678899999997 Input: 1.23456589e+20 Output: d = 1.23456589e+20 = 0x441ac537 a660b997, se = g_fmt gives "1.23456589e+20" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 21, 9 digits: 123456589 nextafter(d,+Infinity) = 1.2345658900000001e+20 = 0x441ac537 a660b998: g_fmt gives "123456589000000010000" dtoa returns sign = 0, decpt = 21, 17 digits: 12345658900000001 nextafter(d,-Infinity) = 1.2345658899999998e+20 = 0x441ac537 a660b996: g_fmt gives "123456588999999980000" dtoa returns sign = 0, decpt = 21, 17 digits: 12345658899999998 Input: 1.23e+30 Output: d = 1.23e+30 = 0x462f0cb0 4e8fb790, se = g_fmt gives "1.23e+30" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 31, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000001e+30 = 0x462f0cb0 4e8fb791: g_fmt gives "1.2300000000000001e+30" dtoa returns sign = 0, decpt = 31, 17 digits: 12300000000000001 nextafter(d,-Infinity) = 1.2299999999999998e+30 = 0x462f0cb0 4e8fb78f: g_fmt gives "1.2299999999999998e+30" dtoa returns sign = 0, decpt = 31, 17 digits: 12299999999999998 Input: 1.23e-30 Output: d = 1.2300000000000001e-30 = 0x39b8f286 6f5010ab, se = g_fmt gives "1.23e-30" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -29, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-30 = 0x39b8f286 6f5010ac: g_fmt gives "1.2300000000000002e-30" dtoa returns sign = 0, decpt = -29, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999999e-30 = 0x39b8f286 6f5010aa: g_fmt gives "1.2299999999999999e-30" dtoa returns sign = 0, decpt = -29, 17 digits: 12299999999999999 Input: 1.23456789e-20 Output: d = 1.2345678899999999e-20 = 0x3bcd2681 471e7ada, se = g_fmt gives "1.23456789e-20" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -19, 9 digits: 123456789 nextafter(d,+Infinity) = 1.2345678900000001e-20 = 0x3bcd2681 471e7adb: g_fmt gives "1.2345678900000001e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12345678900000001 nextafter(d,-Infinity) = 1.2345678899999998e-20 = 0x3bcd2681 471e7ad9: g_fmt gives "1.2345678899999998e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12345678899999998 Input: 1.23456789e-30 Output: d = 1.23456789e-30 = 0x39b90a3e 33bbd995, se = g_fmt gives "1.23456789e-30" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -29, 9 digits: 123456789 nextafter(d,+Infinity) = 1.2345678900000002e-30 = 0x39b90a3e 33bbd996: g_fmt gives "1.2345678900000002e-30" dtoa returns sign = 0, decpt = -29, 17 digits: 12345678900000002 nextafter(d,-Infinity) = 1.2345678899999998e-30 = 0x39b90a3e 33bbd994: g_fmt gives "1.2345678899999998e-30" dtoa returns sign = 0, decpt = -29, 17 digits: 12345678899999998 Input: 1.234567890123456789 Output: d = 1.2345678901234567 = 0x3ff3c0ca 428c59fb, se = g_fmt gives "1.2345678901234567" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234567 nextafter(d,+Infinity) = 1.2345678901234569 = 0x3ff3c0ca 428c59fc: g_fmt gives "1.234567890123457" dtoa returns sign = 0, decpt = 1, 16 digits: 1234567890123457 nextafter(d,-Infinity) = 1.2345678901234565 = 0x3ff3c0ca 428c59fa: g_fmt gives "1.2345678901234565" dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234565 Input: 1.23456789012345678901234567890123456789 Output: d = 1.2345678901234567 = 0x3ff3c0ca 428c59fb, se = g_fmt gives "1.2345678901234567" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234567 nextafter(d,+Infinity) = 1.2345678901234569 = 0x3ff3c0ca 428c59fc: g_fmt gives "1.234567890123457" dtoa returns sign = 0, decpt = 1, 16 digits: 1234567890123457 nextafter(d,-Infinity) = 1.2345678901234565 = 0x3ff3c0ca 428c59fa: g_fmt gives "1.2345678901234565" dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234565 Input: 1.23e306 Output: d = 1.23e+306 = 0x7f7c0676 cd1c61f5, se = g_fmt gives "1.23e+306" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 307, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e+306 = 0x7f7c0676 cd1c61f6: g_fmt gives "1.2300000000000002e+306" dtoa returns sign = 0, decpt = 307, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999999e+306 = 0x7f7c0676 cd1c61f4: g_fmt gives "1.2299999999999999e+306" dtoa returns sign = 0, decpt = 307, 17 digits: 12299999999999999 Input: 1.23e-306 Output: d = 1.23e-306 = 0x6ba3b8 5da396e8, se = g_fmt gives "1.23e-306" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -305, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-306 = 0x6ba3b8 5da396e9: g_fmt gives "1.2300000000000002e-306" dtoa returns sign = 0, decpt = -305, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999999e-306 = 0x6ba3b8 5da396e7: g_fmt gives "1.2299999999999999e-306" dtoa returns sign = 0, decpt = -305, 17 digits: 12299999999999999 Input: 1.23e-320 Output: d = 1.2302234581447039e-320 = 0x0 9ba, se = g_fmt gives "1.23e-320" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -319, 3 digits: 123 nextafter(d,+Infinity) = 1.2307175237905451e-320 = 0x0 9bb: g_fmt gives "1.2307e-320" dtoa returns sign = 0, decpt = -319, 5 digits: 12307 nextafter(d,-Infinity) = 1.2297293924988626e-320 = 0x0 9b9: g_fmt gives "1.2297e-320" dtoa returns sign = 0, decpt = -319, 5 digits: 12297 Input: 1.23e-20 Output: d = 1.2300000000000001e-20 = 0x3bcd0ae4 cf767531, se = g_fmt gives "1.23e-20" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-20 = 0x3bcd0ae4 cf767532: g_fmt gives "1.2300000000000002e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12300000000000002 nextafter(d,-Infinity) = 1.2299999999999999e-20 = 0x3bcd0ae4 cf767530: g_fmt gives "1.2299999999999999e-20" dtoa returns sign = 0, decpt = -19, 17 digits: 12299999999999999 Input: 1.23456789e307 Output: d = 1.23456789e+307 = 0x7fb194b1 4bdaecdc, se = g_fmt gives "1.23456789e+307" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 308, 9 digits: 123456789 nextafter(d,+Infinity) = 1.2345678900000003e+307 = 0x7fb194b1 4bdaecdd: g_fmt gives "1.2345678900000003e+307" dtoa returns sign = 0, decpt = 308, 17 digits: 12345678900000003 nextafter(d,-Infinity) = 1.2345678899999998e+307 = 0x7fb194b1 4bdaecdb: g_fmt gives "1.2345678899999998e+307" dtoa returns sign = 0, decpt = 308, 17 digits: 12345678899999998 Input: 1.23456589e-307 Output: d = 1.2345658899999999e-307 = 0x363196 bb9845fa, se = g_fmt gives "1.23456589e-307" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -306, 9 digits: 123456589 nextafter(d,+Infinity) = 1.2345658900000001e-307 = 0x363196 bb9845fb: g_fmt gives "1.2345658900000001e-307" dtoa returns sign = 0, decpt = -306, 17 digits: 12345658900000001 nextafter(d,-Infinity) = 1.2345658899999997e-307 = 0x363196 bb9845f9: g_fmt gives "1.2345658899999997e-307" dtoa returns sign = 0, decpt = -306, 17 digits: 12345658899999997 Input: 1.234567890123456789 Output: d = 1.2345678901234567 = 0x3ff3c0ca 428c59fb, se = g_fmt gives "1.2345678901234567" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234567 nextafter(d,+Infinity) = 1.2345678901234569 = 0x3ff3c0ca 428c59fc: g_fmt gives "1.234567890123457" dtoa returns sign = 0, decpt = 1, 16 digits: 1234567890123457 nextafter(d,-Infinity) = 1.2345678901234565 = 0x3ff3c0ca 428c59fa: g_fmt gives "1.2345678901234565" dtoa returns sign = 0, decpt = 1, 17 digits: 12345678901234565 Input: 1.234567890123456789e301 Output: d = 1.2345678901234568e+301 = 0x7e726f51 75f56413, se = g_fmt gives "1.2345678901234568e+301" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 302, 17 digits: 12345678901234568 nextafter(d,+Infinity) = 1.234567890123457e+301 = 0x7e726f51 75f56414: g_fmt gives "1.234567890123457e+301" dtoa returns sign = 0, decpt = 302, 16 digits: 1234567890123457 nextafter(d,-Infinity) = 1.2345678901234565e+301 = 0x7e726f51 75f56412: g_fmt gives "1.2345678901234565e+301" dtoa returns sign = 0, decpt = 302, 17 digits: 12345678901234565 Input: 1.234567890123456789e-301 Output: d = 1.2345678901234567e-301 = 0x1752a64 e34ba0d3, se = g_fmt gives "1.2345678901234567e-301" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -300, 17 digits: 12345678901234567 nextafter(d,+Infinity) = 1.2345678901234569e-301 = 0x1752a64 e34ba0d4: g_fmt gives "1.234567890123457e-301" dtoa returns sign = 0, decpt = -300, 16 digits: 1234567890123457 nextafter(d,-Infinity) = 1.2345678901234565e-301 = 0x1752a64 e34ba0d2: g_fmt gives "1.2345678901234565e-301" dtoa returns sign = 0, decpt = -300, 17 digits: 12345678901234565 Input: 1.234567890123456789e-321 Output: d = 1.2351641146031164e-321 = 0x0 fa, se = g_fmt gives "1.235e-321" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -320, 4 digits: 1235 nextafter(d,+Infinity) = 1.2401047710615288e-321 = 0x0 fb: g_fmt gives "1.24e-321" dtoa returns sign = 0, decpt = -320, 3 digits: 124 nextafter(d,-Infinity) = 1.2302234581447039e-321 = 0x0 f9: g_fmt gives "1.23e-321" dtoa returns sign = 0, decpt = -320, 3 digits: 123 Input: 1e23 Output: d = 9.9999999999999992e+22 = 0x44b52d02 c7e14af6, se = g_fmt gives "1e+23" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 24, 1 digits: 1 nextafter(d,+Infinity) = 1.0000000000000001e+23 = 0x44b52d02 c7e14af7: g_fmt gives "1.0000000000000001e+23" dtoa returns sign = 0, decpt = 24, 17 digits: 10000000000000001 nextafter(d,-Infinity) = 9.9999999999999975e+22 = 0x44b52d02 c7e14af5: g_fmt gives "9.999999999999997e+22" dtoa returns sign = 0, decpt = 23, 16 digits: 9999999999999997 Input: 1e310 Output: d = Infinity = 0x7ff00000 0, se = g_fmt gives "Infinity" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 9999, 8 digits: Infinity Input: 9.0259718793241475e-277 Output: d = 9.0259718793241479e-277 = 0x6a00000 0, se = g_fmt gives "9.025971879324148e-277" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -276, 16 digits: 9025971879324148 nextafter(d,+Infinity) = 9.0259718793241499e-277 = 0x6a00000 1: g_fmt gives "9.02597187932415e-277" dtoa returns sign = 0, decpt = -276, 15 digits: 902597187932415 Input: 9.025971879324147880346310405869e-277 Output: d = 9.0259718793241479e-277 = 0x6a00000 0, se = g_fmt gives "9.025971879324148e-277" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -276, 16 digits: 9025971879324148 nextafter(d,+Infinity) = 9.0259718793241499e-277 = 0x6a00000 1: g_fmt gives "9.02597187932415e-277" dtoa returns sign = 0, decpt = -276, 15 digits: 902597187932415 Input: 9.025971879324147880346310405868e-277 Output: d = 9.0259718793241479e-277 = 0x6a00000 0, se = g_fmt gives "9.025971879324148e-277" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -276, 16 digits: 9025971879324148 nextafter(d,+Infinity) = 9.0259718793241499e-277 = 0x6a00000 1: g_fmt gives "9.02597187932415e-277" dtoa returns sign = 0, decpt = -276, 15 digits: 902597187932415 Input: 2.2250738585072014e-308 Output: d = 2.2250738585072014e-308 = 0x100000 0, se = g_fmt gives "2.2250738585072014e-308" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -307, 17 digits: 22250738585072014 nextafter(d,+Infinity) = 2.2250738585072019e-308 = 0x100000 1: g_fmt gives "2.225073858507202e-308" dtoa returns sign = 0, decpt = -307, 16 digits: 2225073858507202 Input: 2.2250738585072013e-308 Output: d = 2.2250738585072014e-308 = 0x100000 0, se = g_fmt gives "2.2250738585072014e-308" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = -307, 17 digits: 22250738585072014 nextafter(d,+Infinity) = 2.2250738585072019e-308 = 0x100000 1: g_fmt gives "2.225073858507202e-308" dtoa returns sign = 0, decpt = -307, 16 digits: 2225073858507202 Input: 3.2649476e14 Output: d = 326494760000000 = 0x42f28f1f c30da000, se = g_fmt gives "3.2649476e+14" dtoa(mode = 0, ndigits = 17): dtoa returns sign = 0, decpt = 15, 8 digits: 32649476 nextafter(d,+Infinity) = 326494760000000.06 = 0x42f28f1f c30da001: g_fmt gives "326494760000000.06" dtoa returns sign = 0, decpt = 15, 17 digits: 32649476000000006 nextafter(d,-Infinity) = 326494759999999.94 = 0x42f28f1f c30d9fff: g_fmt gives "326494759999999.94" dtoa returns sign = 0, decpt = 15, 17 digits: 32649475999999994 Input: 1.23:2 6 Output: d = 1.23 = 0x3ff3ae14 7ae147ae, se = :2 6 g_fmt gives "1.23" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 1, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002 = 0x3ff3ae14 7ae147af: g_fmt gives "1.2300000000000002" dtoa returns sign = 0, decpt = 1, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999998 = 0x3ff3ae14 7ae147ad: g_fmt gives "1.2299999999999998" dtoa returns sign = 0, decpt = 1, 3 digits: 123 Input: 1.23:4 6 Output: d = 1.23 = 0x3ff3ae14 7ae147ae, se = :4 6 g_fmt gives "1.23" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 1, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002 = 0x3ff3ae14 7ae147af: g_fmt gives "1.2300000000000002" dtoa returns sign = 0, decpt = 1, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999998 = 0x3ff3ae14 7ae147ad: g_fmt gives "1.2299999999999998" dtoa returns sign = 0, decpt = 1, 3 digits: 123 Input: 1.23e+20:2 6 Output: d = 1.23e+20 = 0x441aabdf 2145b430, se = :2 6 g_fmt gives "1.23e+20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 21, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e+20 = 0x441aabdf 2145b431: g_fmt gives "123000000000000020000" dtoa returns sign = 0, decpt = 21, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999998e+20 = 0x441aabdf 2145b42f: g_fmt gives "122999999999999980000" dtoa returns sign = 0, decpt = 21, 3 digits: 123 Input: 1.23e+20:4 6 Output: d = 1.23e+20 = 0x441aabdf 2145b430, se = :4 6 g_fmt gives "1.23e+20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 21, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e+20 = 0x441aabdf 2145b431: g_fmt gives "123000000000000020000" dtoa returns sign = 0, decpt = 21, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999998e+20 = 0x441aabdf 2145b42f: g_fmt gives "122999999999999980000" dtoa returns sign = 0, decpt = 21, 3 digits: 123 Input: 1.23e-20:2 6 Output: d = 1.2300000000000001e-20 = 0x3bcd0ae4 cf767531, se = :2 6 g_fmt gives "1.23e-20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-20 = 0x3bcd0ae4 cf767532: g_fmt gives "1.2300000000000002e-20" dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999999e-20 = 0x3bcd0ae4 cf767530: g_fmt gives "1.2299999999999999e-20" dtoa returns sign = 0, decpt = -19, 3 digits: 123 Input: 1.23e-20:4 6 Output: d = 1.2300000000000001e-20 = 0x3bcd0ae4 cf767531, se = :4 6 g_fmt gives "1.23e-20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,+Infinity) = 1.2300000000000002e-20 = 0x3bcd0ae4 cf767532: g_fmt gives "1.2300000000000002e-20" dtoa returns sign = 0, decpt = -19, 3 digits: 123 nextafter(d,-Infinity) = 1.2299999999999999e-20 = 0x3bcd0ae4 cf767530: g_fmt gives "1.2299999999999999e-20" dtoa returns sign = 0, decpt = -19, 3 digits: 123 Input: 1.23456789:2 6 Output: d = 1.2345678899999999 = 0x3ff3c0ca 4283de1b, se = :2 6 g_fmt gives "1.23456789" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345678900000001 = 0x3ff3c0ca 4283de1c: g_fmt gives "1.2345678900000001" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345678899999997 = 0x3ff3c0ca 4283de1a: g_fmt gives "1.2345678899999997" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 Input: 1.23456789:4 6 Output: d = 1.2345678899999999 = 0x3ff3c0ca 4283de1b, se = :4 6 g_fmt gives "1.23456789" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345678900000001 = 0x3ff3c0ca 4283de1c: g_fmt gives "1.2345678900000001" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345678899999997 = 0x3ff3c0ca 4283de1a: g_fmt gives "1.2345678899999997" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 Input: 1.23456589e+20:2 6 Output: d = 1.23456589e+20 = 0x441ac537 a660b997, se = :2 6 g_fmt gives "1.23456589e+20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345658900000001e+20 = 0x441ac537 a660b998: g_fmt gives "123456589000000010000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345658899999998e+20 = 0x441ac537 a660b996: g_fmt gives "123456588999999980000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 Input: 1.23456589e+20:4 6 Output: d = 1.23456589e+20 = 0x441ac537 a660b997, se = :4 6 g_fmt gives "1.23456589e+20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345658900000001e+20 = 0x441ac537 a660b998: g_fmt gives "123456589000000010000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345658899999998e+20 = 0x441ac537 a660b996: g_fmt gives "123456588999999980000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 Input: 1.23456789e-20:2 6 Output: d = 1.2345678899999999e-20 = 0x3bcd2681 471e7ada, se = :2 6 g_fmt gives "1.23456789e-20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345678900000001e-20 = 0x3bcd2681 471e7adb: g_fmt gives "1.2345678900000001e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345678899999998e-20 = 0x3bcd2681 471e7ad9: g_fmt gives "1.2345678899999998e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 Input: 1.23456789e-20:4 6 Output: d = 1.2345678899999999e-20 = 0x3bcd2681 471e7ada, se = :4 6 g_fmt gives "1.23456789e-20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,+Infinity) = 1.2345678900000001e-20 = 0x3bcd2681 471e7adb: g_fmt gives "1.2345678900000001e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345678899999998e-20 = 0x3bcd2681 471e7ad9: g_fmt gives "1.2345678899999998e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 Input: 1234565:2 6 Output: d = 1234565 = 0x4132d685 0, se = :2 6 g_fmt gives "1234565" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 7, 6 digits: 123456 nextafter(d,+Infinity) = 1234565.0000000002 = 0x4132d685 1: g_fmt gives "1234565.0000000002" dtoa returns sign = 0, decpt = 7, 6 digits: 123457 Input: 1234565:4 6 Output: d = 1234565 = 0x4132d685 0, se = :4 6 g_fmt gives "1234565" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 7, 6 digits: 123456 nextafter(d,+Infinity) = 1234565.0000000002 = 0x4132d685 1: g_fmt gives "1234565.0000000002" dtoa returns sign = 0, decpt = 7, 6 digits: 123457 Input: 1.234565:2 6 Output: d = 1.2345649999999999 = 0x3ff3c0c7 3abc9470, se = :2 6 g_fmt gives "1.234565" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 1, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000001 = 0x3ff3c0c7 3abc9471: g_fmt gives "1.2345650000000001" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999997 = 0x3ff3c0c7 3abc946f: g_fmt gives "1.2345649999999997" dtoa returns sign = 0, decpt = 1, 6 digits: 123456 Input: 1.234565:4 6 Output: d = 1.2345649999999999 = 0x3ff3c0c7 3abc9470, se = :4 6 g_fmt gives "1.234565" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 1, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000001 = 0x3ff3c0c7 3abc9471: g_fmt gives "1.2345650000000001" dtoa returns sign = 0, decpt = 1, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999997 = 0x3ff3c0c7 3abc946f: g_fmt gives "1.2345649999999997" dtoa returns sign = 0, decpt = 1, 6 digits: 123456 Input: 1.234565e+20:2 6 Output: d = 1.234565e+20 = 0x441ac536 6299040d, se = :2 6 g_fmt gives "1.234565e+20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = 21, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000002e+20 = 0x441ac536 6299040e: g_fmt gives "123456500000000020000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999998e+20 = 0x441ac536 6299040c: g_fmt gives "123456499999999980000" dtoa returns sign = 0, decpt = 21, 6 digits: 123456 Input: 1.234565e+20:4 6 Output: d = 1.234565e+20 = 0x441ac536 6299040d, se = :4 6 g_fmt gives "1.234565e+20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = 21, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000002e+20 = 0x441ac536 6299040e: g_fmt gives "123456500000000020000" dtoa returns sign = 0, decpt = 21, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999998e+20 = 0x441ac536 6299040c: g_fmt gives "123456499999999980000" dtoa returns sign = 0, decpt = 21, 6 digits: 123456 Input: 1.234565e-20:2 6 Output: d = 1.234565e-20 = 0x3bcd267c ce45a93f, se = :2 6 g_fmt gives "1.234565e-20" dtoa(mode = 2, ndigits = 6): dtoa returns sign = 0, decpt = -19, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000001e-20 = 0x3bcd267c ce45a940: g_fmt gives "1.2345650000000001e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999998e-20 = 0x3bcd267c ce45a93e: g_fmt gives "1.2345649999999998e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123456 Input: 1.234565e-20:4 6 Output: d = 1.234565e-20 = 0x3bcd267c ce45a93f, se = :4 6 g_fmt gives "1.234565e-20" dtoa(mode = 4, ndigits = 6): dtoa returns sign = 0, decpt = -19, 6 digits: 123456 nextafter(d,+Infinity) = 1.2345650000000001e-20 = 0x3bcd267c ce45a940: g_fmt gives "1.2345650000000001e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123457 nextafter(d,-Infinity) = 1.2345649999999998e-20 = 0x3bcd267c ce45a93e: g_fmt gives "1.2345649999999998e-20" dtoa returns sign = 0, decpt = -19, 6 digits: 123456 mlton-20210117+dfsg/runtime/gdtoa/test/f.out000066400000000000000000000536751416264345000205640ustar00rootroot00000000000000 Input: 1.23 strtof consumes 4 bytes and returns 1.23 = #3f9d70a4 g_ffmt(0) gives 4 bytes: "1.23" strtoIf returns 33, consuming 4 bytes. fI[0] = #3f9d70a3 = 1.2299999 fI[1] = #3f9d70a4 = 1.23 fI[1] == strtof Input: 1.23e+20 strtof consumes 8 bytes and returns 1.23e+20 = #60d55ef9 g_ffmt(0) gives 8 bytes: "1.23e+20" strtoIf returns 17, consuming 8 bytes. fI[0] = #60d55ef9 = 1.23e+20 fI[1] = #60d55efa = 1.2300001e+20 fI[0] == strtof Input: 1.23e-20 strtof consumes 8 bytes and returns 1.23e-20 = #1e685726 g_ffmt(0) gives 8 bytes: "1.23e-20" strtoIf returns 17, consuming 8 bytes. fI[0] = #1e685726 = 1.23e-20 fI[1] = #1e685727 = 1.23e-20 fI[0] == strtof Input: 1.23456789 strtof consumes 10 bytes and returns 1.2345679 = #3f9e0652 g_ffmt(0) gives 9 bytes: "1.2345679" strtoIf returns 17, consuming 10 bytes. fI[0] = #3f9e0652 = 1.2345679 fI[1] = #3f9e0653 = 1.234568 fI[0] == strtof Input: 1.23456589e+20 strtof consumes 14 bytes and returns 1.2345659e+20 = #60d629bd g_ffmt(0) gives 13 bytes: "1.2345659e+20" strtoIf returns 17, consuming 14 bytes. fI[0] = #60d629bd = 1.2345659e+20 fI[1] = #60d629be = 1.234566e+20 fI[0] == strtof Input: 1.23e+30 strtof consumes 8 bytes and returns 1.23e+30 = #71786582 g_ffmt(0) gives 8 bytes: "1.23e+30" strtoIf returns 17, consuming 8 bytes. fI[0] = #71786582 = 1.23e+30 fI[1] = #71786583 = 1.23e+30 fI[0] == strtof Input: 1.23e-30 strtof consumes 8 bytes and returns 1.23e-30 = #dc79433 g_ffmt(0) gives 8 bytes: "1.23e-30" strtoIf returns 17, consuming 8 bytes. fI[0] = #dc79433 = 1.23e-30 fI[1] = #dc79434 = 1.23e-30 fI[0] == strtof Input: 1.23456789e-20 strtof consumes 14 bytes and returns 1.2345679e-20 = #1e69340a g_ffmt(0) gives 13 bytes: "1.2345679e-20" strtoIf returns 17, consuming 14 bytes. fI[0] = #1e69340a = 1.2345679e-20 fI[1] = #1e69340b = 1.234568e-20 fI[0] == strtof Input: 1.23456789e-30 strtof consumes 14 bytes and returns 1.2345679e-30 = #dc851f2 g_ffmt(0) gives 13 bytes: "1.2345679e-30" strtoIf returns 33, consuming 14 bytes. fI[0] = #dc851f1 = 1.2345678e-30 fI[1] = #dc851f2 = 1.2345679e-30 fI[1] == strtof Input: 1.234567890123456789 strtof consumes 20 bytes and returns 1.2345679 = #3f9e0652 g_ffmt(0) gives 9 bytes: "1.2345679" strtoIf returns 17, consuming 20 bytes. fI[0] = #3f9e0652 = 1.2345679 fI[1] = #3f9e0653 = 1.234568 fI[0] == strtof Input: 1.23456789012345678901234567890123456789 strtof consumes 40 bytes and returns 1.2345679 = #3f9e0652 g_ffmt(0) gives 9 bytes: "1.2345679" strtoIf returns 17, consuming 40 bytes. fI[0] = #3f9e0652 = 1.2345679 fI[1] = #3f9e0653 = 1.234568 fI[0] == strtof Input: 1.23e306 strtof consumes 8 bytes and returns Infinity = #7f800000 g_ffmt(0) gives 8 bytes: "Infinity" strtoIf returns 163, consuming 8 bytes. fI[0] = #7f7fffff = 3.4028235e+38 fI[1] = #7f800000 = Infinity fI[1] == strtof g_ffmt_p(...,0): "Infinity" g_ffmt_p(...,1): "Infinity" g_ffmt_p(...,2): "Infinity" g_ffmt_p(...,3): "Infinity" g_ffmt_p(...,4): "Infinity" g_ffmt_p(...,5): "Infinity" Input: 1.23e-306 strtof consumes 9 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 9 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 1.23e-320 strtof consumes 9 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 9 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 1.23e-20 strtof consumes 8 bytes and returns 1.23e-20 = #1e685726 g_ffmt(0) gives 8 bytes: "1.23e-20" strtoIf returns 17, consuming 8 bytes. fI[0] = #1e685726 = 1.23e-20 fI[1] = #1e685727 = 1.23e-20 fI[0] == strtof Input: 1.23456789e307 strtof consumes 14 bytes and returns Infinity = #7f800000 g_ffmt(0) gives 8 bytes: "Infinity" strtoIf returns 163, consuming 14 bytes. fI[0] = #7f7fffff = 3.4028235e+38 fI[1] = #7f800000 = Infinity fI[1] == strtof g_ffmt_p(...,0): "Infinity" g_ffmt_p(...,1): "Infinity" g_ffmt_p(...,2): "Infinity" g_ffmt_p(...,3): "Infinity" g_ffmt_p(...,4): "Infinity" g_ffmt_p(...,5): "Infinity" Input: 1.23456589e-307 strtof consumes 15 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 15 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 1.234567890123456789 strtof consumes 20 bytes and returns 1.2345679 = #3f9e0652 g_ffmt(0) gives 9 bytes: "1.2345679" strtoIf returns 17, consuming 20 bytes. fI[0] = #3f9e0652 = 1.2345679 fI[1] = #3f9e0653 = 1.234568 fI[0] == strtof Input: 1.234567890123456789e301 strtof consumes 24 bytes and returns Infinity = #7f800000 g_ffmt(0) gives 8 bytes: "Infinity" strtoIf returns 163, consuming 24 bytes. fI[0] = #7f7fffff = 3.4028235e+38 fI[1] = #7f800000 = Infinity fI[1] == strtof g_ffmt_p(...,0): "Infinity" g_ffmt_p(...,1): "Infinity" g_ffmt_p(...,2): "Infinity" g_ffmt_p(...,3): "Infinity" g_ffmt_p(...,4): "Infinity" g_ffmt_p(...,5): "Infinity" Input: 1.234567890123456789e-301 strtof consumes 25 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 25 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 1.234567890123456789e-321 strtof consumes 25 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 25 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 1e23 strtof consumes 4 bytes and returns 9.9999998e+22 = #65a96816 g_ffmt(0) gives 5 bytes: "1e+23" strtoIf returns 17, consuming 4 bytes. fI[0] = #65a96816 = 9.9999998e+22 fI[1] = #65a96817 = 1.0000001e+23 fI[0] == strtof Input: 1e310 strtof consumes 5 bytes and returns Infinity = #7f800000 g_ffmt(0) gives 8 bytes: "Infinity" strtoIf returns 163, consuming 5 bytes. fI[0] = #7f7fffff = 3.4028235e+38 fI[1] = #7f800000 = Infinity fI[1] == strtof g_ffmt_p(...,0): "Infinity" g_ffmt_p(...,1): "Infinity" g_ffmt_p(...,2): "Infinity" g_ffmt_p(...,3): "Infinity" g_ffmt_p(...,4): "Infinity" g_ffmt_p(...,5): "Infinity" Input: 9.0259718793241475e-277 strtof consumes 23 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 23 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 9.025971879324147880346310405869e-277 strtof consumes 37 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 37 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 9.025971879324147880346310405868e-277 strtof consumes 37 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 37 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 2.2250738585072014e-308 strtof consumes 23 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 23 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 2.2250738585072013e-308 strtof consumes 23 bytes and returns 0 = #0 g_ffmt(0) gives 1 bytes: "0" strtoIf returns 80, consuming 23 bytes. fI[0] = #0 = 0 fI[1] = #1 = 1.4012985e-45 fI[0] == strtof Input: 3.2649476e14 strtof consumes 12 bytes and returns 3.2649476e+14 = #579478fe g_ffmt(0) gives 13 bytes: "3.2649476e+14" strtoIf returns 17, consuming 12 bytes. fI[0] = #579478fe = 3.2649476e+14 fI[1] = #579478ff = 3.2649479e+14 fI[0] == strtof Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtof consumes 3 bytes and returns 1.0999999 = #3f8ccccc g_ffmt(0) gives 9 bytes: "1.0999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f8ccccc = 1.0999999 fI[1] = #3f8ccccd = 1.1 fI[0] == strtof Input: -1.1 strtof consumes 4 bytes and returns -1.0999999 = #bf8ccccc g_ffmt(0) gives 10 bytes: "-1.0999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf8ccccd = -1.1 fI[1] = #bf8ccccc = -1.0999999 fI[1] == strtof Input: 1.2 strtof consumes 3 bytes and returns 1.1999999 = #3f999999 g_ffmt(0) gives 9 bytes: "1.1999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f999999 = 1.1999999 fI[1] = #3f99999a = 1.2 fI[0] == strtof Input: -1.2 strtof consumes 4 bytes and returns -1.1999999 = #bf999999 g_ffmt(0) gives 10 bytes: "-1.1999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf99999a = -1.2 fI[1] = #bf999999 = -1.1999999 fI[1] == strtof Input: 1.3 strtof consumes 3 bytes and returns 1.3 = #3fa66666 g_ffmt(0) gives 3 bytes: "1.3" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fa66666 = 1.3 fI[1] = #3fa66667 = 1.3000001 fI[0] == strtof Input: -1.3 strtof consumes 4 bytes and returns -1.3 = #bfa66666 g_ffmt(0) gives 4 bytes: "-1.3" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfa66667 = -1.3000001 fI[1] = #bfa66666 = -1.3 fI[1] == strtof Input: 1.4 strtof consumes 3 bytes and returns 1.4 = #3fb33333 g_ffmt(0) gives 3 bytes: "1.4" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fb33333 = 1.4 fI[1] = #3fb33334 = 1.4000001 fI[0] == strtof Input: -1.4 strtof consumes 4 bytes and returns -1.4 = #bfb33333 g_ffmt(0) gives 4 bytes: "-1.4" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfb33334 = -1.4000001 fI[1] = #bfb33333 = -1.4 fI[1] == strtof Input: 1.5 strtof consumes 3 bytes and returns 1.5 = #3fc00000 g_ffmt(0) gives 3 bytes: "1.5" strtoIf returns 1, consuming 3 bytes. fI[0] == fI[1] == strtof Input: -1.5 strtof consumes 4 bytes and returns -1.5 = #bfc00000 g_ffmt(0) gives 4 bytes: "-1.5" strtoIf returns 9, consuming 4 bytes. fI[0] == fI[1] == strtof Input: 1.6 strtof consumes 3 bytes and returns 1.5999999 = #3fcccccc g_ffmt(0) gives 9 bytes: "1.5999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fcccccc = 1.5999999 fI[1] = #3fcccccd = 1.6 fI[0] == strtof Input: -1.6 strtof consumes 4 bytes and returns -1.5999999 = #bfcccccc g_ffmt(0) gives 10 bytes: "-1.5999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfcccccd = -1.6 fI[1] = #bfcccccc = -1.5999999 fI[1] == strtof Input: 1.7 strtof consumes 3 bytes and returns 1.6999999 = #3fd99999 g_ffmt(0) gives 9 bytes: "1.6999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fd99999 = 1.6999999 fI[1] = #3fd9999a = 1.7 fI[0] == strtof Input: -1.7 strtof consumes 4 bytes and returns -1.6999999 = #bfd99999 g_ffmt(0) gives 10 bytes: "-1.6999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfd9999a = -1.7 fI[1] = #bfd99999 = -1.6999999 fI[1] == strtof Input: 1.8 strtof consumes 3 bytes and returns 1.8 = #3fe66666 g_ffmt(0) gives 3 bytes: "1.8" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fe66666 = 1.8 fI[1] = #3fe66667 = 1.8000001 fI[0] == strtof Input: -1.8 strtof consumes 4 bytes and returns -1.8 = #bfe66666 g_ffmt(0) gives 4 bytes: "-1.8" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfe66667 = -1.8000001 fI[1] = #bfe66666 = -1.8 fI[1] == strtof Input: 1.9 strtof consumes 3 bytes and returns 1.9 = #3ff33333 g_ffmt(0) gives 3 bytes: "1.9" strtoIf returns 17, consuming 3 bytes. fI[0] = #3ff33333 = 1.9 fI[1] = #3ff33334 = 1.9000001 fI[0] == strtof Input: -1.9 strtof consumes 4 bytes and returns -1.9 = #bff33333 g_ffmt(0) gives 4 bytes: "-1.9" strtoIf returns 25, consuming 4 bytes. fI[0] = #bff33334 = -1.9000001 fI[1] = #bff33333 = -1.9 fI[1] == strtof Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtof consumes 3 bytes and returns 1.1 = #3f8ccccd g_ffmt(0) gives 3 bytes: "1.1" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f8ccccc = 1.0999999 fI[1] = #3f8ccccd = 1.1 fI[1] == strtof Input: -1.1 strtof consumes 4 bytes and returns -1.1 = #bf8ccccd g_ffmt(0) gives 4 bytes: "-1.1" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf8ccccd = -1.1 fI[1] = #bf8ccccc = -1.0999999 fI[0] == strtof Input: 1.2 strtof consumes 3 bytes and returns 1.2 = #3f99999a g_ffmt(0) gives 3 bytes: "1.2" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f999999 = 1.1999999 fI[1] = #3f99999a = 1.2 fI[1] == strtof Input: -1.2 strtof consumes 4 bytes and returns -1.2 = #bf99999a g_ffmt(0) gives 4 bytes: "-1.2" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf99999a = -1.2 fI[1] = #bf999999 = -1.1999999 fI[0] == strtof Input: 1.3 strtof consumes 3 bytes and returns 1.3 = #3fa66666 g_ffmt(0) gives 3 bytes: "1.3" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fa66666 = 1.3 fI[1] = #3fa66667 = 1.3000001 fI[0] == strtof Input: -1.3 strtof consumes 4 bytes and returns -1.3 = #bfa66666 g_ffmt(0) gives 4 bytes: "-1.3" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfa66667 = -1.3000001 fI[1] = #bfa66666 = -1.3 fI[1] == strtof Input: 1.4 strtof consumes 3 bytes and returns 1.4 = #3fb33333 g_ffmt(0) gives 3 bytes: "1.4" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fb33333 = 1.4 fI[1] = #3fb33334 = 1.4000001 fI[0] == strtof Input: -1.4 strtof consumes 4 bytes and returns -1.4 = #bfb33333 g_ffmt(0) gives 4 bytes: "-1.4" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfb33334 = -1.4000001 fI[1] = #bfb33333 = -1.4 fI[1] == strtof Input: 1.5 strtof consumes 3 bytes and returns 1.5 = #3fc00000 g_ffmt(0) gives 3 bytes: "1.5" strtoIf returns 1, consuming 3 bytes. fI[0] == fI[1] == strtof Input: -1.5 strtof consumes 4 bytes and returns -1.5 = #bfc00000 g_ffmt(0) gives 4 bytes: "-1.5" strtoIf returns 9, consuming 4 bytes. fI[0] == fI[1] == strtof Input: 1.6 strtof consumes 3 bytes and returns 1.6 = #3fcccccd g_ffmt(0) gives 3 bytes: "1.6" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fcccccc = 1.5999999 fI[1] = #3fcccccd = 1.6 fI[1] == strtof Input: -1.6 strtof consumes 4 bytes and returns -1.6 = #bfcccccd g_ffmt(0) gives 4 bytes: "-1.6" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfcccccd = -1.6 fI[1] = #bfcccccc = -1.5999999 fI[0] == strtof Input: 1.7 strtof consumes 3 bytes and returns 1.7 = #3fd9999a g_ffmt(0) gives 3 bytes: "1.7" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fd99999 = 1.6999999 fI[1] = #3fd9999a = 1.7 fI[1] == strtof Input: -1.7 strtof consumes 4 bytes and returns -1.7 = #bfd9999a g_ffmt(0) gives 4 bytes: "-1.7" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfd9999a = -1.7 fI[1] = #bfd99999 = -1.6999999 fI[0] == strtof Input: 1.8 strtof consumes 3 bytes and returns 1.8 = #3fe66666 g_ffmt(0) gives 3 bytes: "1.8" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fe66666 = 1.8 fI[1] = #3fe66667 = 1.8000001 fI[0] == strtof Input: -1.8 strtof consumes 4 bytes and returns -1.8 = #bfe66666 g_ffmt(0) gives 4 bytes: "-1.8" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfe66667 = -1.8000001 fI[1] = #bfe66666 = -1.8 fI[1] == strtof Input: 1.9 strtof consumes 3 bytes and returns 1.9 = #3ff33333 g_ffmt(0) gives 3 bytes: "1.9" strtoIf returns 17, consuming 3 bytes. fI[0] = #3ff33333 = 1.9 fI[1] = #3ff33334 = 1.9000001 fI[0] == strtof Input: -1.9 strtof consumes 4 bytes and returns -1.9 = #bff33333 g_ffmt(0) gives 4 bytes: "-1.9" strtoIf returns 25, consuming 4 bytes. fI[0] = #bff33334 = -1.9000001 fI[1] = #bff33333 = -1.9 fI[1] == strtof Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtof consumes 3 bytes and returns 1.1 = #3f8ccccd g_ffmt(0) gives 3 bytes: "1.1" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f8ccccc = 1.0999999 fI[1] = #3f8ccccd = 1.1 fI[1] == strtof Input: -1.1 strtof consumes 4 bytes and returns -1.0999999 = #bf8ccccc g_ffmt(0) gives 10 bytes: "-1.0999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf8ccccd = -1.1 fI[1] = #bf8ccccc = -1.0999999 fI[1] == strtof Input: 1.2 strtof consumes 3 bytes and returns 1.2 = #3f99999a g_ffmt(0) gives 3 bytes: "1.2" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f999999 = 1.1999999 fI[1] = #3f99999a = 1.2 fI[1] == strtof Input: -1.2 strtof consumes 4 bytes and returns -1.1999999 = #bf999999 g_ffmt(0) gives 10 bytes: "-1.1999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf99999a = -1.2 fI[1] = #bf999999 = -1.1999999 fI[1] == strtof Input: 1.3 strtof consumes 3 bytes and returns 1.3000001 = #3fa66667 g_ffmt(0) gives 9 bytes: "1.3000001" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fa66666 = 1.3 fI[1] = #3fa66667 = 1.3000001 fI[1] == strtof Input: -1.3 strtof consumes 4 bytes and returns -1.3 = #bfa66666 g_ffmt(0) gives 4 bytes: "-1.3" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfa66667 = -1.3000001 fI[1] = #bfa66666 = -1.3 fI[1] == strtof Input: 1.4 strtof consumes 3 bytes and returns 1.4000001 = #3fb33334 g_ffmt(0) gives 9 bytes: "1.4000001" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fb33333 = 1.4 fI[1] = #3fb33334 = 1.4000001 fI[1] == strtof Input: -1.4 strtof consumes 4 bytes and returns -1.4 = #bfb33333 g_ffmt(0) gives 4 bytes: "-1.4" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfb33334 = -1.4000001 fI[1] = #bfb33333 = -1.4 fI[1] == strtof Input: 1.5 strtof consumes 3 bytes and returns 1.5 = #3fc00000 g_ffmt(0) gives 3 bytes: "1.5" strtoIf returns 1, consuming 3 bytes. fI[0] == fI[1] == strtof Input: -1.5 strtof consumes 4 bytes and returns -1.5 = #bfc00000 g_ffmt(0) gives 4 bytes: "-1.5" strtoIf returns 9, consuming 4 bytes. fI[0] == fI[1] == strtof Input: 1.6 strtof consumes 3 bytes and returns 1.6 = #3fcccccd g_ffmt(0) gives 3 bytes: "1.6" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fcccccc = 1.5999999 fI[1] = #3fcccccd = 1.6 fI[1] == strtof Input: -1.6 strtof consumes 4 bytes and returns -1.5999999 = #bfcccccc g_ffmt(0) gives 10 bytes: "-1.5999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfcccccd = -1.6 fI[1] = #bfcccccc = -1.5999999 fI[1] == strtof Input: 1.7 strtof consumes 3 bytes and returns 1.7 = #3fd9999a g_ffmt(0) gives 3 bytes: "1.7" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fd99999 = 1.6999999 fI[1] = #3fd9999a = 1.7 fI[1] == strtof Input: -1.7 strtof consumes 4 bytes and returns -1.6999999 = #bfd99999 g_ffmt(0) gives 10 bytes: "-1.6999999" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfd9999a = -1.7 fI[1] = #bfd99999 = -1.6999999 fI[1] == strtof Input: 1.8 strtof consumes 3 bytes and returns 1.8000001 = #3fe66667 g_ffmt(0) gives 9 bytes: "1.8000001" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fe66666 = 1.8 fI[1] = #3fe66667 = 1.8000001 fI[1] == strtof Input: -1.8 strtof consumes 4 bytes and returns -1.8 = #bfe66666 g_ffmt(0) gives 4 bytes: "-1.8" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfe66667 = -1.8000001 fI[1] = #bfe66666 = -1.8 fI[1] == strtof Input: 1.9 strtof consumes 3 bytes and returns 1.9000001 = #3ff33334 g_ffmt(0) gives 9 bytes: "1.9000001" strtoIf returns 17, consuming 3 bytes. fI[0] = #3ff33333 = 1.9 fI[1] = #3ff33334 = 1.9000001 fI[1] == strtof Input: -1.9 strtof consumes 4 bytes and returns -1.9 = #bff33333 g_ffmt(0) gives 4 bytes: "-1.9" strtoIf returns 25, consuming 4 bytes. fI[0] = #bff33334 = -1.9000001 fI[1] = #bff33333 = -1.9 fI[1] == strtof Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtof consumes 3 bytes and returns 1.0999999 = #3f8ccccc g_ffmt(0) gives 9 bytes: "1.0999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f8ccccc = 1.0999999 fI[1] = #3f8ccccd = 1.1 fI[0] == strtof Input: -1.1 strtof consumes 4 bytes and returns -1.1 = #bf8ccccd g_ffmt(0) gives 4 bytes: "-1.1" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf8ccccd = -1.1 fI[1] = #bf8ccccc = -1.0999999 fI[0] == strtof Input: 1.2 strtof consumes 3 bytes and returns 1.1999999 = #3f999999 g_ffmt(0) gives 9 bytes: "1.1999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3f999999 = 1.1999999 fI[1] = #3f99999a = 1.2 fI[0] == strtof Input: -1.2 strtof consumes 4 bytes and returns -1.2 = #bf99999a g_ffmt(0) gives 4 bytes: "-1.2" strtoIf returns 41, consuming 4 bytes. fI[0] = #bf99999a = -1.2 fI[1] = #bf999999 = -1.1999999 fI[0] == strtof Input: 1.3 strtof consumes 3 bytes and returns 1.3 = #3fa66666 g_ffmt(0) gives 3 bytes: "1.3" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fa66666 = 1.3 fI[1] = #3fa66667 = 1.3000001 fI[0] == strtof Input: -1.3 strtof consumes 4 bytes and returns -1.3000001 = #bfa66667 g_ffmt(0) gives 10 bytes: "-1.3000001" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfa66667 = -1.3000001 fI[1] = #bfa66666 = -1.3 fI[0] == strtof Input: 1.4 strtof consumes 3 bytes and returns 1.4 = #3fb33333 g_ffmt(0) gives 3 bytes: "1.4" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fb33333 = 1.4 fI[1] = #3fb33334 = 1.4000001 fI[0] == strtof Input: -1.4 strtof consumes 4 bytes and returns -1.4000001 = #bfb33334 g_ffmt(0) gives 10 bytes: "-1.4000001" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfb33334 = -1.4000001 fI[1] = #bfb33333 = -1.4 fI[0] == strtof Input: 1.5 strtof consumes 3 bytes and returns 1.5 = #3fc00000 g_ffmt(0) gives 3 bytes: "1.5" strtoIf returns 1, consuming 3 bytes. fI[0] == fI[1] == strtof Input: -1.5 strtof consumes 4 bytes and returns -1.5 = #bfc00000 g_ffmt(0) gives 4 bytes: "-1.5" strtoIf returns 9, consuming 4 bytes. fI[0] == fI[1] == strtof Input: 1.6 strtof consumes 3 bytes and returns 1.5999999 = #3fcccccc g_ffmt(0) gives 9 bytes: "1.5999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fcccccc = 1.5999999 fI[1] = #3fcccccd = 1.6 fI[0] == strtof Input: -1.6 strtof consumes 4 bytes and returns -1.6 = #bfcccccd g_ffmt(0) gives 4 bytes: "-1.6" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfcccccd = -1.6 fI[1] = #bfcccccc = -1.5999999 fI[0] == strtof Input: 1.7 strtof consumes 3 bytes and returns 1.6999999 = #3fd99999 g_ffmt(0) gives 9 bytes: "1.6999999" strtoIf returns 33, consuming 3 bytes. fI[0] = #3fd99999 = 1.6999999 fI[1] = #3fd9999a = 1.7 fI[0] == strtof Input: -1.7 strtof consumes 4 bytes and returns -1.7 = #bfd9999a g_ffmt(0) gives 4 bytes: "-1.7" strtoIf returns 41, consuming 4 bytes. fI[0] = #bfd9999a = -1.7 fI[1] = #bfd99999 = -1.6999999 fI[0] == strtof Input: 1.8 strtof consumes 3 bytes and returns 1.8 = #3fe66666 g_ffmt(0) gives 3 bytes: "1.8" strtoIf returns 17, consuming 3 bytes. fI[0] = #3fe66666 = 1.8 fI[1] = #3fe66667 = 1.8000001 fI[0] == strtof Input: -1.8 strtof consumes 4 bytes and returns -1.8000001 = #bfe66667 g_ffmt(0) gives 10 bytes: "-1.8000001" strtoIf returns 25, consuming 4 bytes. fI[0] = #bfe66667 = -1.8000001 fI[1] = #bfe66666 = -1.8 fI[0] == strtof Input: 1.9 strtof consumes 3 bytes and returns 1.9 = #3ff33333 g_ffmt(0) gives 3 bytes: "1.9" strtoIf returns 17, consuming 3 bytes. fI[0] = #3ff33333 = 1.9 fI[1] = #3ff33334 = 1.9000001 fI[0] == strtof Input: -1.9 strtof consumes 4 bytes and returns -1.9000001 = #bff33334 g_ffmt(0) gives 10 bytes: "-1.9000001" strtoIf returns 25, consuming 4 bytes. fI[0] = #bff33334 = -1.9000001 fI[1] = #bff33333 = -1.9 fI[0] == strtof mlton-20210117+dfsg/runtime/gdtoa/test/ftest.c000066400000000000000000000112001416264345000210510ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_ffmt, strtof, strtoIf, strtopf, and strtorf. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex is a string of <= 8 Hex digits for the internal representation * of the number, and ndig is a parameters to g_ffmt. */ #include "gdtoa.h" #include #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[2048], obuf1[2048]; #define UL (unsigned long) typedef union { float f; ULong L; } Uf; int main(Void) { Uf fI[2], u; char *s, *se, *se1; float f1; int dItry, i, i1, ndig = 0, nik, nike, r = 1; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': /* sscanf(s+1, "%lx", &u.L); */ u.L = (ULong)strtoul(s+1, &se, 16); printf("\nInput: %s", ibuf); printf(" --> f = #%lx\n", UL u.L); i = 0; goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorf(ibuf, &se, r, &u.f); if (r == 1) { if (u.f != (i1 = strtopf(ibuf, &se1, &f1), f1) || se != se1 || i != i1) { printf("***strtopf and strtorf disagree!!\n"); if (u.f != f1) printf("\tf1 = %g\n", (double)f1); if (i != i1) printf("\ti = %d but i1 = %d\n", i, i1); if (se != se1) printf("se - se1 = %d\n", (int)(se-se1)); } if (u.f != strtof(ibuf, &se1) || se != se1) printf("***strtof and strtorf disagree!\n"); } printf("strtof consumes %d bytes and returns %.8g = #%lx\n", (int)(se-ibuf), u.f, UL u.L); fmt_test: se = g_ffmt(obuf, &u.f, ndig, sizeof(obuf)); printf("g_ffmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_ffmt_p(obuf1, &u.f, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_ffmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (!dItry) continue; printf("strtoIf returns %d,", strtoIf(ibuf, &se, &fI[0].f, &fI[1].f)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (fI[0].f == fI[1].f) { if (fI[0].f == u.f) printf("fI[0] == fI[1] == strtof\n"); else printf("fI[0] == fI[1] = #%lx = %.8g\n", UL fI[0].L, fI[0].f); } else { printf("fI[0] = #%lx = %.8g\nfI[1] = #%lx = %.8g\n", UL fI[0].L, fI[0].f, UL fI[1].L, fI[1].f); if (fI[0].f == u.f) printf("fI[0] == strtof\n"); else if (fI[1].f == u.f) printf("fI[1] == strtof\n"); else printf("**** Both differ from strtof ****\n"); } printf("\n"); switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_ffmt_p(obuf1, &u.f, ndig, sizeof(obuf1), nik); printf("g_ffmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_ffmt_p(obuf1, &u.f, ndig, sizeof(obuf1), nik); printf("g_ffmt_p(...,%d): \"%s\"\n", nik, obuf1); } } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/getround.c000066400000000000000000000047061416264345000215700ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include #include static char *dir[4] = { "toward zero", "nearest", "toward +Infinity", "toward -Infinity" }; #ifdef Honor_FLT_ROUNDS #include static int fe_conv[4] = {FE_TOWARDZERO, FE_TONEAREST, FE_UPWARD, FE_DOWNWARD }; #endif int #ifdef KR_headers getround(r, s) int r; char *s; #else getround(int r, char *s) #endif { int i; while(*++s <= ' ') { if (!*s) { printf("Current round mode for strtor... is %d (%s).\n", r, dir[r]); return r; } } i = atoi(s); if (i >= 0 && i < 4) { printf("Rounding mode for strtor... "); if (i == r) printf("was and is %d (%s)\n", i, dir[i]); else printf("changed from %d (%s) to %d (%s)\n", r, dir[r], i, dir[i]); #ifdef Honor_FLT_ROUNDS fesetround(fe_conv[i]); #endif return i; } printf("Bad rounding direction %d: choose among\n", i); for(i = 0; i < 4; i++) printf("\t%d (%s)\n", i, dir[i]); printf("Leaving rounding mode for strtor... at %d (%s)\n", r, dir[r]); return r; } #ifdef USE_MY_LOCALE #include struct lconv * localeconv(void) { static struct lconv mylocale; mylocale.decimal_point = ""; return &mylocale; } #endif mlton-20210117+dfsg/runtime/gdtoa/test/makefile000066400000000000000000000130021416264345000212620ustar00rootroot00000000000000# /**************************************************************** # Copyright (C) 1998, 2000 by Lucent Technologies # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby # granted, provided that the above copyright notice appear in all # copies and that both that the copyright notice and this # permission notice and warranty disclaimer appear in supporting # documentation, and that the name of Lucent or any of its entities # not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior # permission. # # LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. # IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY # SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF # THIS SOFTWARE. # # ****************************************************************/ .SUFFIXES: .c .o CC = cc CFLAGS = -g -I.. A = ../gdtoa.a L = -lm L1 = #use "L1=-lm" when compiled with -DHonor_FLTP_ROUNDS or -DUSE_LOCALE INFFIX = | sed 's/[Ii][Nn][Ff][intyINTY]*/Infinity/g' .c.o: $(CC) -c $(CFLAGS) $*.c all: dt dItest ddtest dtest ftest Qtest xLtest xtest ddtestsi dItestsi tests dt = dt.o $A dt: $(dt) $(CC) -o dt $(dt) $L dItest = dItest.o getround.o $A dItest: $(dItest) $(CC) -o dItest $(dItest) $(L1) ddtest = ddtest.o getround.o $A ddtest: $(ddtest) $(CC) -o ddtest $(ddtest) $L dtest = dtest.o getround.o $A dtest: $(dtest) $(CC) -o dtest $(dtest) $L ftest = ftest.o getround.o $A ftest: $(ftest) $(CC) -o ftest $(ftest) $(L1) Qtest = Qtest.o getround.o $A Qtest: $(Qtest) $(CC) -o Qtest $(Qtest) $(L1) xtest = xtest.o getround.o $A xtest: $(xtest) $(CC) -o xtest $(xtest) $(L1) xLtest = xLtest.o getround.o $A xLtest: $(xLtest) $(CC) -o xLtest $(xLtest) $(L1) strtopddSI.o: strtopddSI.c ../strtopdd.c strtorddSI.o: strtorddSI.c ../strtordd.c strtodISI.o: strtodISI.c ../strtodI.c strtoIddSI.o: strtoIddSI.c ../strtoIdd.c strtoIdSI.o: strtoIdSI.c ../strtoId.c ddtestsi = ddtest.o strtopddSI.o strtorddSI.o strtoIddSI.o getround.o $A ddtestsi: $(ddtestsi) $(CC) -o ddtestsi $(ddtestsi) $L dItestsi = dItest.o strtodISI.o strtoIdSI.o getround.o $A dItestsi: $(dItestsi) $(CC) -o dItestsi $(dItestsi) $(L1) strtodt = strtodt.o $A strtodt: $(strtodt) $(CC) -o strtodt $(strtodt) $L pftest = pftest.o $A pftest: ../Printf $(pftest) $(CC) -o pftest $(pftest) $L ## On Intel (and Intel-like) systems using extended-precision registers ## for double-precision (C type double) computations that sometimes suffer ## double rounding errors, the test below involving strtodt generally shows ## five lines of unexpected results. Variant strtodtnrp uses ../strtodrnp.c ## (which does all computations in integer arithmetic) and should show no ## unexpected results. strtodtnrp = strtodt.o ../strtodnrp.c $A strtodtnrp: $(strtodtnrp) $(CC) -o strtodtnrp $(strtodtnrp) # xQtest generates cp commands that depend on sizeof(long double). # See the source for details. If you know better, create Q.out, # x.out and xL.out by copying the relevant *.ou0 or *.ou1 files # to the corresponding .out files. In short, the *.ou0 files are # for long double == double; x.ou1 and xL.ou1 are for # long double == extended (a la 80x87 and MC680x0), and Q.ou1 is # for long double == quad. Q.out x.out xL.out: $(CC) -o xQtest xQtest.c ./xQtest | sh rm -f xQtest xQtest.o ## The rmdir below will fail if any test results differ. tests: Q.out x.out xL.out dt dItest ddtest dtest ftest Qtest xLtest xtest ddtestsi dItestsi strtodt strtodtnrp mkdir bad cat testnos testnos1 | ./dt $(INFFIX) >zap 2>&1 cmp dtst.out zap || mv zap bad/dtst.out ./dItest zap 2>&1 cmp dI.out zap || mv zap bad/dI.out ./dItestsi zap 2>&1 cmp dIsi.out zap || mv zap bad/dIsi.out ./ddtestsi zap 2>&1 cmp ddsi.out zap || mv zap bad/ddsi.out for i in dd d f x xL Q; do cat testnos rtestnos | \ ./"$$i"test $(INFFIX) >zap 2>&1;\ cmp $$i.out zap || mv zap bad/$$i.out; done ./strtodt testnos3 >bad/strtodt.out && rm bad/strtodt.out || \ cat bad/strtodt.out ./strtodtnrp testnos3 >bad/strtodtnrp.out && rm bad/strtodtnrp.out || \ cat bad/strtodtnrp.out rmdir bad 2>/dev/null || \ (cd bad; for i in *; do cmp -s $$i ../obad/$$i && rm $$i;done; cd ..; rmdir bad) touch tests # To test Printf in ../gdtoa.a, "make pf_test" and perhaps "make pf_testLq" # (if both long double and quad are desired and available). pf_test: pftest ./pftest zap cmp pftest.out zap && rm zap pf_testLq: pftest ./pftest zap cmp pftestLq.out zap && rm zap xs0 = README Q.ou0 Q.ou1 Qtest.c d.out dI.out dIsi.out dItest.c dd.out\ ddsi.out ddtest.c dt.c dtest.c dtst.out f.out ftest.c\ getround.c makefile pfLqtestnos pftest.c pftestQ.out\ pftestx.out pftestLq.out pftestnos rtestnos strtoIdSI.c\ strtoIddSI.c strtodISI.c strtodt.c strtopddSI.c strtorddSI.c\ testnos testnos1 testnos3 x.ou0 x.ou1 xL.ou0 xL.ou1 xLtest.c\ xQtest.c xtest.c # invoke "make -r xsum.out" xsum.out: xsum0.out $(xs0) xsum $(xs0) >xsum1.out cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out clean: rm -f *.[ao] dt *test *testsi pftest.out strtodt strtodtnrp xsum.out\ xsum1.out tests zap x.out xL.out Q.out rm -rf bad mlton-20210117+dfsg/runtime/gdtoa/test/obad/000077500000000000000000000000001416264345000204735ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/gdtoa/test/obad/strtodt.out000066400000000000000000000005651416264345000227350ustar00rootroot00000000000000Line 31 of testnos3: got 4585747a b143e354; expected 4585747a b143e353 Line 46 of testnos3: got 64fdcf7d f8f573b8; expected 64fdcf7d f8f573b7 Line 47 of testnos3: got 650dcf7d f8f573b8; expected 650dcf7d f8f573b7 Line 72 of testnos3: got 3cc70385 6844bdbe; expected 3cc70385 6844bdbf Line 73 of testnos3: got 3cb70385 6844bdbe; expected 3cb70385 6844bdbf 5 bad conversions mlton-20210117+dfsg/runtime/gdtoa/test/obad/xL.out000066400000000000000000001107031416264345000216110ustar00rootroot00000000000000 Input: 1.23 strtoxL consumes 4 bytes and returns 33 with bits = #3fff0000 9d70a3d7 a3d70a4 printf("%.21Lg") gives 7.73283722915781506499e-4933 g_xLfmt(0) gives 4 bytes: "1.23" strtoIxL returns 33, consuming 4 bytes. fI[0] = #3fff0000 9d70a3d7 a3d70a3 = 7.73283722915781506134e-4933 fI[1] = #3fff0000 9d70a3d7 a3d70a4 = 7.73283722915781506499e-4933 fI[1] == strtoxL Input: 1.23e+20 strtoxL consumes 8 bytes and returns 1 with bits = #40410000 d55ef90a 2da18000 printf("%.21Lg") gives 2.24239113715721119512e-4932 g_xLfmt(0) gives 8 bytes: "1.23e+20" strtoIxL returns 1, consuming 8 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 printf("%.21Lg") gives 2.74065070995958800375e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 = 2.74065070995958800375e-4932 fI[1] = #3fbc0000 e857267b b3a984f3 = 2.74065070995958800411e-4932 fI[0] == strtoxL Input: 1.23456789 strtoxL consumes 10 bytes and returns 33 with bits = #3fff0000 9e065214 1ef0dbf6 printf("%.21Lg") gives 7.88641440242171807354e-4933 g_xLfmt(0) gives 10 bytes: "1.23456789" strtoIxL returns 33, consuming 10 bytes. fI[0] = #3fff0000 9e065214 1ef0dbf5 = 7.8864144024217180699e-4933 fI[1] = #3fff0000 9e065214 1ef0dbf6 = 7.88641440242171807354e-4933 fI[1] == strtoxL Input: 1.23456589e+20 strtoxL consumes 14 bytes and returns 1 with bits = #40410000 d629bd33 5ccba00 printf("%.21Lg") gives 2.26319561227049478508e-4932 g_xLfmt(0) gives 14 bytes: "1.23456589e+20" strtoIxL returns 1, consuming 14 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e+30 strtoxL consumes 8 bytes and returns 17 with bits = #40620000 f8658274 7dbc824a printf("%.21Lg") gives 3.16238691003557160385e-4932 g_xLfmt(0) gives 8 bytes: "1.23e+30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #40620000 f8658274 7dbc824a = 3.16238691003557160385e-4932 fI[1] = #40620000 f8658274 7dbc824b = 3.16238691003557160421e-4932 fI[0] == strtoxL Input: 1.23e-30 strtoxL consumes 8 bytes and returns 17 with bits = #3f9b0000 c794337a 808554eb printf("%.21Lg") gives 1.88012249978407873966e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3f9b0000 c794337a 808554eb = 1.88012249978407873966e-4932 fI[1] = #3f9b0000 c794337a 808554ec = 1.88012249978407874003e-4932 fI[0] == strtoxL Input: 1.23456789e-20 strtoxL consumes 14 bytes and returns 17 with bits = #3fbc0000 e9340a38 f3d6d352 printf("%.21Lg") gives 2.76331470044569174626e-4932 g_xLfmt(0) gives 14 bytes: "1.23456789e-20" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3fbc0000 e9340a38 f3d6d352 = 2.76331470044569174626e-4932 fI[1] = #3fbc0000 e9340a38 f3d6d353 = 2.76331470044569174663e-4932 fI[0] == strtoxL Input: 1.23456789e-30 strtoxL consumes 14 bytes and returns 17 with bits = #3f9b0000 c851f19d decca8fc printf("%.21Lg") gives 1.89959071937101288293e-4932 g_xLfmt(0) gives 14 bytes: "1.23456789e-30" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3f9b0000 c851f19d decca8fc = 1.89959071937101288293e-4932 fI[1] = #3f9b0000 c851f19d decca8fd = 1.89959071937101288329e-4932 fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.23456789012345678901234567890123456789 strtoxL consumes 40 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 40 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.23e306 strtoxL consumes 8 bytes and returns 17 with bits = #43f70000 e033b668 e30fa6d5 printf("%.21Lg") gives 2.52688323155200052759e-4932 g_xLfmt(0) gives 9 bytes: "1.23e+306" strtoIxL returns 17, consuming 8 bytes. fI[0] = #43f70000 e033b668 e30fa6d5 = 2.52688323155200052759e-4932 fI[1] = #43f70000 e033b668 e30fa6d6 = 2.52688323155200052796e-4932 fI[0] == strtoxL Input: 1.23e-306 strtoxL consumes 9 bytes and returns 33 with bits = #3c060000 dd1dc2ed 1cb73f25 printf("%.21Lg") gives 2.44583168427704605801e-4932 g_xLfmt(0) gives 9 bytes: "1.23e-306" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3c060000 dd1dc2ed 1cb73f24 = 2.44583168427704605765e-4932 fI[1] = #3c060000 dd1dc2ed 1cb73f25 = 2.44583168427704605801e-4932 fI[1] == strtoxL Input: 1.23e-320 strtoxL consumes 9 bytes and returns 33 with bits = #3bd80000 9b98c371 844c3f1a printf("%.21Lg") gives 7.24867657578821329238e-4933 g_xLfmt(0) gives 9 bytes: "1.23e-320" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3bd80000 9b98c371 844c3f19 = 7.24867657578821328874e-4933 fI[1] = #3bd80000 9b98c371 844c3f1a = 7.24867657578821329238e-4933 fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 printf("%.21Lg") gives 2.74065070995958800375e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 = 2.74065070995958800375e-4932 fI[1] = #3fbc0000 e857267b b3a984f3 = 2.74065070995958800411e-4932 fI[0] == strtoxL Input: 1.23456789e307 strtoxL consumes 14 bytes and returns 17 with bits = #43fb0000 8ca58a5e d766de75 printf("%.21Lg") gives 3.32182163192682931854e-4933 g_xLfmt(0) gives 15 bytes: "1.23456789e+307" strtoIxL returns 17, consuming 14 bytes. fI[0] = #43fb0000 8ca58a5e d766de75 = 3.32182163192682931854e-4933 fI[1] = #43fb0000 8ca58a5e d766de76 = 3.32182163192682932219e-4933 fI[0] == strtoxL Input: 1.23456589e-307 strtoxL consumes 15 bytes and returns 17 with bits = #3c030000 b18cb5dc c22fd369 printf("%.21Lg") gives 1.30149245314004923345e-4932 g_xLfmt(0) gives 15 bytes: "1.23456589e-307" strtoIxL returns 17, consuming 15 bytes. fI[0] = #3c030000 b18cb5dc c22fd369 = 1.30149245314004923345e-4932 fI[1] = #3c030000 b18cb5dc c22fd36a = 1.30149245314004923382e-4932 fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.234567890123456789e301 strtoxL consumes 24 bytes and returns 33 with bits = #43e70000 937a8baf ab20980c printf("%.21Lg") gives 5.11635766619117643114e-4933 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIxL returns 33, consuming 24 bytes. fI[0] = #43e70000 937a8baf ab20980b = 5.1163576661911764275e-4933 fI[1] = #43e70000 937a8baf ab20980c = 5.11635766619117643114e-4933 fI[1] == strtoxL Input: 1.234567890123456789e-301 strtoxL consumes 25 bytes and returns 33 with bits = #3c170000 a953271a 5d069ad9 printf("%.21Lg") gives 1.08545540462853463561e-4932 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3c170000 a953271a 5d069ad8 = 1.08545540462853463524e-4932 fI[1] = #3c170000 a953271a 5d069ad9 = 1.08545540462853463561e-4932 fI[1] == strtoxL Input: 1.234567890123456789e-321 strtoxL consumes 25 bytes and returns 33 with bits = #3bd40000 f9e11b4c ea6dcce9 printf("%.21Lg") gives 3.20133479952876185942e-4932 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3bd40000 f9e11b4c ea6dcce8 = 3.20133479952876185905e-4932 fI[1] = #3bd40000 f9e11b4c ea6dcce9 = 3.20133479952876185942e-4932 fI[1] == strtoxL Input: 1e23 strtoxL consumes 4 bytes and returns 1 with bits = #404b0000 a968163f a57b400 printf("%.21Lg") gives 1.08760331670538037378e-4932 g_xLfmt(0) gives 5 bytes: "1e+23" strtoIxL returns 1, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1e310 strtoxL consumes 5 bytes and returns 33 with bits = #44040000 de81e40a 34bcf50 printf("%.21Lg") gives 2.48237171106260601618e-4932 g_xLfmt(0) gives 6 bytes: "1e+310" strtoIxL returns 33, consuming 5 bytes. fI[0] = #44040000 de81e40a 34bcf4f = 2.48237171106260601582e-4932 fI[1] = #44040000 de81e40a 34bcf50 = 2.48237171106260601618e-4932 fI[1] == strtoxL Input: 9.0259718793241475e-277 strtoxL consumes 23 bytes and returns 33 with bits = #3c690000 ffffffff fffffcf7 printf("%.21Lg") gives 3.36210314311209322303e-4932 g_xLfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIxL returns 33, consuming 23 bytes. fI[0] = #3c690000 ffffffff fffffcf6 = 3.36210314311209322267e-4932 fI[1] = #3c690000 ffffffff fffffcf7 = 3.36210314311209322303e-4932 fI[1] == strtoxL Input: 9.025971879324147880346310405869e-277 strtoxL consumes 37 bytes and returns 17 with bits = #3c6a0000 80000000 0 printf("%.21Lg") gives 3.36210314311209350626e-4932 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 17, consuming 37 bytes. fI[0] = #3c6a0000 80000000 0 = 3.36210314311209350626e-4932 fI[1] = #3c6a0000 80000000 1 = 3.64519953188247460253e-4951 fI[0] == strtoxL Input: 9.025971879324147880346310405868e-277 strtoxL consumes 37 bytes and returns 33 with bits = #3c6a0000 80000000 0 printf("%.21Lg") gives 3.36210314311209350626e-4932 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 33, consuming 37 bytes. fI[0] = #3c690000 ffffffff ffffffff = 3.3621031431120935059e-4932 fI[1] = #3c6a0000 80000000 0 = 3.36210314311209350626e-4932 fI[1] == strtoxL Input: 2.2250738585072014e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c010000 80000000 46 printf("%.21Lg") gives 2.55163967231773222177e-4949 g_xLfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c010000 80000000 46 = 2.55163967231773222177e-4949 fI[1] = #3c010000 80000000 47 = 2.5880916676365569678e-4949 fI[0] == strtoxL Input: 2.2250738585072013e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c000000 ffffffff fffffd4f printf("%.21Lg") gives 3.36210314311209325511e-4932 g_xLfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c000000 ffffffff fffffd4f = 3.36210314311209325511e-4932 fI[1] = #3c000000 ffffffff fffffd50 = 3.36210314311209325547e-4932 fI[0] == strtoxL Input: 3.2649476e14 strtoxL consumes 12 bytes and returns 1 with bits = #402f0000 9478fe18 6d000000 printf("%.21Lg") gives 5.3774284544988676575e-4933 g_xLfmt(0) gives 13 bytes: "3.2649476e+14" strtoIxL returns 1, consuming 12 bytes. fI[0] == fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 a6666666 66666667 printf("%.21Lg") gives 1.0086309429336280521e-4932 g_xLfmt(0) gives 21 bytes: "1.3000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 b3333333 33333334 printf("%.21Lg") gives 1.3448412572448374028e-4932 g_xLfmt(0) gives 21 bytes: "1.4000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 e6666666 66666667 printf("%.21Lg") gives 2.68968251448967480523e-4932 g_xLfmt(0) gives 21 bytes: "1.8000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 f3333333 33333334 printf("%.21Lg") gives 3.02589282880088415593e-4932 g_xLfmt(0) gives 21 bytes: "1.9000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 a6666666 66666667 printf("%.21Lg") gives 1.0086309429336280521e-4932 g_xLfmt(0) gives 22 bytes: "-1.3000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[0] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 b3333333 33333334 printf("%.21Lg") gives 1.3448412572448374028e-4932 g_xLfmt(0) gives 22 bytes: "-1.4000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[0] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 e6666666 66666667 printf("%.21Lg") gives 2.68968251448967480523e-4932 g_xLfmt(0) gives 22 bytes: "-1.8000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[0] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 f3333333 33333334 printf("%.21Lg") gives 3.02589282880088415593e-4932 g_xLfmt(0) gives 22 bytes: "-1.9000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[0] == strtoxL mlton-20210117+dfsg/runtime/gdtoa/test/pfLqtestnos000066400000000000000000000001431416264345000220310ustar00rootroot00000000000000%.8a 1.23 %.7a %.2a %.La 1.23 %.20Lqa 1.23 %La 3e27 %La 1.7e27 %Lqa 3e48 %Lqa 1e49 1.5 2.5 4.5 8.5 mlton-20210117+dfsg/runtime/gdtoa/test/pftest.c000066400000000000000000000065741416264345000212530ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2009 by David M. Gay All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all source-code copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation. THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #include "stdio1.h" #include "gdtoa.h" #include #undef allow_Quad #undef want_Quad #undef want_Ux #define want_LD typedef union Ud {double x; unsigned int u[2]; } Ud; #ifdef __x86_64 /*{{*/ #define want_Ux #ifndef NO_GDTOA_i386_Quad /*{*/ typedef union UQ {__float128 x; unsigned int u[4]; } UQ; #define allow_Quad(x) x #define want_Quad #endif /*}*/ #else /*}{*/ #ifdef __i386 /*{{*/ #define want_Ux #else /*}{*/ #ifdef __sparc /*{{*/ typedef union UQ {long double x; unsigned int u[4]; } Ux; #else /*}{*/ #ifdef __INTEL_COMPILER /*{*/ #undef want_Quad #undef want_Ux #undef want_LD #endif /*}*/ #endif /*}}*/ #endif /*}}*/ #endif /*}}*/ #ifndef allow_Quad #define allow_Quad(x) /*nothing*/ #endif #ifdef want_Ux /*{{*/ typedef union Ux {long double x; unsigned short u[5]; } Ux; #else /*}{*/ #ifdef __sparc #define want_Ux #endif #endif /*}}*/ int main(void) { Ud d; allow_Quad(UQ q;) char *b, buf[256], fmt[32], *s; #ifdef want_Ux Ux x; x.x = 0.; #endif int k; k = 0; strcpy(fmt, "%.g"); d.x = 0.; allow_Quad(q.x = 0.;) while(fgets(buf, sizeof(buf), stdin)) { for(b = buf; *b && *b != '\n'; ++b); *b = 0; if (b == buf) continue; b = buf; if (*b == '%') { for(k = 0; *b > ' '; ++b) #ifdef want_LD /*{{*/ switch(*b) { case 'L': k = 1; #ifdef want_Quad break; case 'q': if (k >= 1) k = 2; #endif } #else /*}{*/ ; #endif /*}}*/ if (*b) *b++ = 0; if (b - buf < sizeof(fmt)) { strcpy(fmt, buf); } } if (*b) { switch(k) { case 0: d.x = strtod(b,&s); break; case 1: #ifdef want_Ux #ifdef __sparc strtopQ(b,&s,&x.x); #else strtopx(b,&s,&x.x); #endif #else strtopQ(b,&s,&q.x); #endif break; allow_Quad(case 2: strtopQ(b,&s,&q.x);) } if (*s) printf("Ignoring \"%s\"\n", s); } switch(k) { case 0: printf("d.x = %.g = #%x %x; %s ==> ", d.x, d.u[1], d.u[0], fmt); printf(fmt, d.x); break; case 1: #ifdef __sparc printf("x.x = %.Lg = #%x %x %x %x; %s ==> ", x.x, x.u[0], x.u[1], x.u[2], x.u[3], fmt); #else printf("x.x = %.Lg = #%x %x %x %x %x; %s ==> ", x.x, x.u[4], x.u[3], x.u[2], x.u[1], x.u[0], fmt); #endif printf(fmt, x.x); #ifdef want_Quad break; case 2: printf("q.x = %.Lqg = #%x %x %x %x; %s ==> ", q.x, q.u[3], q.u[2], q.u[1], q.u[0], fmt); printf(fmt, q.x); #endif } putchar('\n'); } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/pftestLq.out000066400000000000000000000015151416264345000221230ustar00rootroot00000000000000d.x = 1.23 = #3ff3ae14 7ae147ae; %.8a ==> 0x1.3ae147aep+0 d.x = 1.23 = #3ff3ae14 7ae147ae; %.7a ==> 0x1.3ae147bp+0 d.x = 1.23 = #3ff3ae14 7ae147ae; %.2a ==> 0x1.3bp+0 x.x = 1.23 = #3fff 9d70 a3d7 a3d 70a4; %.La ==> 0xap-3 q.x = 1.23 = #3fff3ae1 47ae147a e147ae14 7ae147ae; %.20Lqa ==> 0x1.3ae147ae147ae147ae14p+0 x.x = 3e+27 = #405a 9b18 ab5d f718 b6c; %La ==> 0x9.b18ab5df7180b6cp+88 x.x = 1.7e+27 = #4059 afc6 a015 291b 4024; %La ==> 0xa.fc6a015291b4024p+87 q.x = 3e+48 = #40a006be 53879565 60c1e1a9 9c13ee2; %Lqa ==> 0x1.06be5387956560c1e1a909c13ee2p+161 q.x = 1e+49 = #40a1b5e7 e08ca3a8 f6987819 baecbe22; %Lqa ==> 0x1.b5e7e08ca3a8f6987819baecbe22p+162 q.x = 1.5 = #3fff8000 0 0 0; %Lqa ==> 0x1.8p+0 q.x = 2.5 = #40004000 0 0 0; %Lqa ==> 0x1.4p+1 q.x = 4.5 = #40012000 0 0 0; %Lqa ==> 0x1.2p+2 q.x = 8.5 = #40021000 0 0 0; %Lqa ==> 0x1.1p+3 mlton-20210117+dfsg/runtime/gdtoa/test/pftestQ.out000066400000000000000000000014761416264345000217550ustar00rootroot00000000000000d.x = 1.23 = #7ae147ae 3ff3ae14; %.8a ==> 0x1.3ae147aep+0 d.x = 1.23 = #7ae147ae 3ff3ae14; %.7a ==> 0x1.3ae147bp+0 d.x = 1.23 = #7ae147ae 3ff3ae14; %.2a ==> 0x1.3bp+0 x.x = 1.23 = #3fff3ae1 47ae147a e147ae14 7ae147ae; %.La ==> 0x1p+0 x.x = 1.23 = #3fff3ae1 47ae147a e147ae14 7ae147ae; %.20La ==> 0x1.3ae147ae147ae147ae14p+0 x.x = 3e+27 = #405a3631 56bbee30 16d70000 0; %La ==> 0x1.363156bbee3016d7p+91 x.x = 1.7e+27 = #40595f8d 402a5236 80490000 0; %La ==> 0x1.5f8d402a52368049p+90 d.x = 1.5 = #0 3ff80000; %a ==> 0x1.8p+0 d.x = 2.5 = #0 40040000; %a ==> 0x1.4p+1 d.x = 4.5 = #0 40120000; %a ==> 0x1.2p+2 d.x = 8.5 = #0 40210000; %a ==> 0x1.1p+3 x.x = 1.5 = #3fff8000 0 0 0; %La ==> 0x1.8p+0 x.x = 2.5 = #40004000 0 0 0; %La ==> 0x1.4p+1 x.x = 4.5 = #40012000 0 0 0; %La ==> 0x1.2p+2 x.x = 8.5 = #40021000 0 0 0; %La ==> 0x1.1p+3 mlton-20210117+dfsg/runtime/gdtoa/test/pftestnos000066400000000000000000000001451416264345000215360ustar00rootroot00000000000000%.8a 1.23 %.7a %.2a %.La 1.23 %.20La 1.23 %La 3e27 %La 1.7e27 %a 1.5 2.5 4.5 8.5 %La 1.5 2.5 4.5 8.5 mlton-20210117+dfsg/runtime/gdtoa/test/pftestx.out000066400000000000000000000014241416264345000220150ustar00rootroot00000000000000d.x = 1.23 = #3ff3ae14 7ae147ae; %.8a ==> 0x1.3ae147aep+0 d.x = 1.23 = #3ff3ae14 7ae147ae; %.7a ==> 0x1.3ae147bp+0 d.x = 1.23 = #3ff3ae14 7ae147ae; %.2a ==> 0x1.3bp+0 x.x = 1.23 = #3fff 9d70 a3d7 a3d 70a4; %.La ==> 0xap-3 x.x = 1.23 = #3fff 9d70 a3d7 a3d 70a4; %.20La ==> 0x9.d70a3d70a3d70a4p-3 x.x = 3e+27 = #405a 9b18 ab5d f718 b6c; %La ==> 0x9.b18ab5df7180b6cp+88 x.x = 1.7e+27 = #4059 afc6 a015 291b 4024; %La ==> 0xa.fc6a015291b4024p+87 d.x = 1.5 = #3ff80000 0; %a ==> 0x1.8p+0 d.x = 2.5 = #40040000 0; %a ==> 0x1.4p+1 d.x = 4.5 = #40120000 0; %a ==> 0x1.2p+2 d.x = 8.5 = #40210000 0; %a ==> 0x1.1p+3 x.x = 1.5 = #3fff c000 0 0 0; %La ==> 0xcp-3 x.x = 2.5 = #4000 a000 0 0 0; %La ==> 0xap-2 x.x = 4.5 = #4001 9000 0 0 0; %La ==> 0x9p-1 x.x = 8.5 = #4002 8800 0 0 0; %La ==> 0x8.8p+0 mlton-20210117+dfsg/runtime/gdtoa/test/rtestnos000066400000000000000000000005201416264345000213670ustar00rootroot00000000000000r0 1.1 -1.1 1.2 -1.2 1.3 -1.3 1.4 -1.4 1.5 -1.5 1.6 -1.6 1.7 -1.7 1.8 -1.8 1.9 -1.9 r1 1.1 -1.1 1.2 -1.2 1.3 -1.3 1.4 -1.4 1.5 -1.5 1.6 -1.6 1.7 -1.7 1.8 -1.8 1.9 -1.9 r2 1.1 -1.1 1.2 -1.2 1.3 -1.3 1.4 -1.4 1.5 -1.5 1.6 -1.6 1.7 -1.7 1.8 -1.8 1.9 -1.9 r3 1.1 -1.1 1.2 -1.2 1.3 -1.3 1.4 -1.4 1.5 -1.5 1.6 -1.6 1.7 -1.7 1.8 -1.8 1.9 -1.9 mlton-20210117+dfsg/runtime/gdtoa/test/strtoIdSI.c000066400000000000000000000000611416264345000216130ustar00rootroot00000000000000#define Sudden_Underflow #include "../strtoId.c" mlton-20210117+dfsg/runtime/gdtoa/test/strtoIddSI.c000066400000000000000000000000621416264345000217600ustar00rootroot00000000000000#define Sudden_Underflow #include "../strtoIdd.c" mlton-20210117+dfsg/runtime/gdtoa/test/strtodISI.c000066400000000000000000000000611416264345000216130ustar00rootroot00000000000000#define Sudden_Underflow #include "../strtodI.c" mlton-20210117+dfsg/runtime/gdtoa/test/strtodt.c000066400000000000000000000064561416264345000214500ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test strtod. */ /* On stdin, read triples: d x y: * d = decimal string * x = high-order Hex value expected from strtod * y = low-order Hex value * Complain about errors. */ #include "gdtoa.h" /* for ULong */ #include #include #include static int W0, W1; typedef union { double d; ULong L[2]; } U; #define UL (unsigned long) static int process(char *fname, FILE *f) { U a, b; char buf[2048]; char *s, *s1, *se; int line, n; line = n = 0; top: while(fgets(s = buf, sizeof(buf), f)) { line++; while(*s <= ' ') if (!*s++) goto top; /* break 2 */ if (*s == '#') continue; while(*s > ' ') s++; /* if (sscanf(s,"\t%lx\t%lx", &a.L[0], &a.L[1]) != 2) */ if ((a.L[0] = (ULong)strtoul(s, &s1,16), s1 <= s) || (a.L[1] = (ULong)strtoul(s1,&se,16), se <= s1)) { printf("Badly formatted line %d of %s\n", line, fname); n++; continue; } b.d = strtod(buf,0); if (b.L[W0] != a.L[0] || b.L[W1] != a.L[1]) { n++; printf("Line %d of %s: got %lx %lx; expected %lx %lx\n", line, fname, UL b.L[W0], UL b.L[W1], UL a.L[0], UL a.L[1]); } } return n; } int main(int argc, char **argv) { FILE *f; char *prog, *s; int n, rc; U u; prog = argv[0]; if (argc == 2 && !strcmp(argv[1],"-?")) { fprintf(stderr, "Usage: %s [file [file...]]\n" "\tto read data file(s) of tab-separated triples d x y with\n" "\t\td decimal string\n" "\t\tx = high-order Hex value expected from strtod\n" "\t\ty = low-order Hex value\n" "\tComplain about errors by strtod.\n" "\tIf no files, read triples from stdin.\n", prog); return 0; } /* determine endian-ness */ u.d = 1.; W0 = u.L[0] == 0; W1 = 1 - W0; /* test */ n = rc = 0; if (argc <= 1) n = process("", stdin); else while((s = *++argv)) if ((f = fopen(s,"r"))) { n += process(s, f); fclose(f); } else { rc = 2; fprintf(stderr, "Cannot open %s\n", s); } printf("%d bad conversions\n", n); if (n) rc |= 1; return rc; } mlton-20210117+dfsg/runtime/gdtoa/test/strtopddSI.c000066400000000000000000000000621416264345000220270ustar00rootroot00000000000000#define Sudden_Underflow #include "../strtopdd.c" mlton-20210117+dfsg/runtime/gdtoa/test/strtorddSI.c000066400000000000000000000000621416264345000220310ustar00rootroot00000000000000#define Sudden_Underflow #include "../strtordd.c" mlton-20210117+dfsg/runtime/gdtoa/test/testnos000066400000000000000000000007621416264345000212150ustar00rootroot000000000000001.23 1.23e+20 1.23e-20 1.23456789 1.23456589e+20 1.23e+30 1.23e-30 1.23456789e-20 1.23456789e-30 1.234567890123456789 1.23456789012345678901234567890123456789 1.23e306 1.23e-306 1.23e-320 1.23e-20 1.23456789e307 1.23456589e-307 1.234567890123456789 1.234567890123456789e301 1.234567890123456789e-301 1.234567890123456789e-321 1e23 1e310 9.0259718793241475e-277 9.025971879324147880346310405869e-277 9.025971879324147880346310405868e-277 2.2250738585072014e-308 2.2250738585072013e-308 3.2649476e14 mlton-20210117+dfsg/runtime/gdtoa/test/testnos1000066400000000000000000000004461416264345000212750ustar00rootroot000000000000001.23:2 6 1.23:4 6 1.23e+20:2 6 1.23e+20:4 6 1.23e-20:2 6 1.23e-20:4 6 1.23456789:2 6 1.23456789:4 6 1.23456589e+20:2 6 1.23456589e+20:4 6 1.23456789e-20:2 6 1.23456789e-20:4 6 1234565:2 6 1234565:4 6 1.234565:2 6 1.234565:4 6 1.234565e+20:2 6 1.234565e+20:4 6 1.234565e-20:2 6 1.234565e-20:4 6 mlton-20210117+dfsg/runtime/gdtoa/test/testnos3000066400000000000000000000341031416264345000212740ustar00rootroot00000000000000# Test triples for strtodt, derived from Fred Tydeman's posting # of 26 February 1996 to comp.arch.arithmetic. 9e0306 7fa9a202 8368022e 4e-079 2fa7b6d7 1d20b96c 7e-261 9eb8d7e 32be6396 6e-025 3ae7361c b863de62 7e-161 1eaf7e0d b3799aa3 7e0289 7c1cbb54 7777a285 5e0079 507afcef 51f0fb5f 1e0080 508afcef 51f0fb5f 7e-303 1333391 31c46f8b 5e0152 5fa317e5 ef3ab327 5e0125 5a07a2ec c414a03f 2e0126 5a27a2ec c414a03f 7e-141 22d5570f 59bd178c 4e-192 18323ff0 6eea847a 9e0043 49102498 ea6df0c4 1e0303 7ed754e3 1cd072da 95e-089 2dde3cbc 9907fdc8 85e0194 689d1c26 db7d0dae 69e0267 77c0b7cb 60c994da 97e-019 3c665dde 8e688ba6 37e0046 49d033d7 eca0adef 74e0046 49e033d7 eca0adef 61e-099 2bc0ad83 6f269a17 53e-208 151b39ae 1909c31b 93e-234 fc27b2e 4f210075 79e-095 2c9a5db8 12948281 87e-274 772d36c f48e7abd 83e0025 4585747a b143e353 17e-036 38b698cc dc60015a 53e0033 47246a34 18629ef6 51e-074 30ecd5be e57763e6 63e-022 3bbdc03b 8fd7016a 839e0143 5e3ae03f 245703e2 749e-182 1abf1472 7744c63e 999e-026 3b282782 afe1869e 345e0266 77b0b7cb 60c994da 914e-102 2b5ffc81 bc29f02b 829e0102 55b7221a 79cdd1d9 307e0090 5322d6b1 83fe4b55 859e0182 6654374d 8b87ac63 283e0085 5216c309 24bab4b 589e0187 675526be 9c22eb17 302e0176 64fdcf7d f8f573b7 604e0176 650dcf7d f8f573b7 761e-244 de03cea 3586452e 647e0230 7044d64d 4079150c 755e0174 64a7d931 93f78fc6 255e-075 30dcd5be e57763e6 3391e0055 4c159bd3 ad46e346 4147e-015 3d923d1b 5eb1d778 3996e-026 3b482782 afe1869e 1998e-026 3b382782 afe1869e 3338e-296 335519a c5142aab 1669e-296 325519a c5142aab 8699e-276 772d2df 246ecd2d 5311e0243 73284e91 f4aa0fdb 7903e-096 2cd07c2d 27a5b989 7611e-226 11d19b87 44033457 3257e0058 4cb444b3 4a6fb3eb 6514e0058 4cc444b3 4a6fb3eb 3571e0263 77462644 c61d41aa 7142e0263 77562644 c61d41aa 5311e0242 72f3720e 5d54d97c 1617e-063 3384c98f ce16152e 51881e0037 4897d295 dc76da4 31441e-118 285ef890 f5de4c86 30179e0079 5143e272 a77478e8 60358e0079 5153e272 a77478e8 63876e-020 3cc70385 6844bdbf 31938e-020 3cb70385 6844bdbf 46073e-032 3a42405b 773fbdf3 32941e0051 4b757eb8 ad52a5c9 82081e0041 49770105 df3d47cb 38701e-215 1440492a 4a8a37fd 62745e0047 4ab0c52f e6dc6a1b 12549e0048 4ac0c52f e6dc6a1b 64009e-183 1af099b3 93b84832 89275e0261 77262644 c61d41aa 75859e0025 46232645 e1ba93f0 57533e0287 7c8272ed 2307f56a 584169e0229 70ad6570 59dc79aa 940189e-112 29eb99d6 240c1a28 416121e0197 6a00fd07 ed297f80 832242e0197 6a10fd07 ed297f80 584738e0076 50e8a85e b277e645 933587e-140 241b2487 28b9c117 252601e0121 5a2dda59 2e398dd7 358423e0274 79f9463b 59b8f2bd 892771e-213 14f25818 c7294f27 410405e0040 49670105 df3d47cb 928609e-261 afbe2dd 66200bef 302276e-254 c55a462 d91c6ab3 920657e-023 3c653a99 85dbde6c 609019e-025 3bf1f99e 11ea0a24 252601e0120 59f7e1e0 f1c7a4ac 654839e-060 34b00e7d b3b3f242 8823691e0130 5c5e597c b94b7ae 2920845e0228 709d6570 59dc79aa 9210917e0080 51fda232 347e6032 5800419e-303 26e58ff a48f4fce 6119898e-243 ee3ecf2 2ea07863 3059949e-243 ed3ecf2 2ea07863 2572231e0223 6f90f73b e1dff9ad 5444097e-021 3cf8849d d33c95af 5783893e-127 26f7e590 2ce0e151 3865421e-225 1295d4fe 53afec65 4590831e0156 61b4689b 4a5fa201 9181662e0156 61c4689b 4a5fa201 5906361e-027 3bbbe45a 312d08a0 7315057e0235 7225f0d4 8362a72 9088115e0106 5762e51a 84a3c6a0 1817623e0107 5772e51a 84a3c6a0 44118455e0129 5c4e597c b94b7ae 35282041e0293 7e5512d5 273e62e8 31279898e-291 5129b01 b6885d36 15639949e-291 5029b01 b6885d36 27966061e0145 5f955bcf 72fd10f9 55932122e0145 5fa55bcf 72fd10f9 70176353e-053 36900683 a21de855 40277543e-032 3adf29ca ff893b1 50609263e0157 622193af f1f1c8e3 66094077e0077 518b37c4 b7928317 84863171e0114 59406e98 f5ec8f37 89396333e0264 786526f0 61ca9053 87575437e-309 16e0732 602056c 78693511e-044 3870bc7b 7603a2ca 90285923e-206 16d14700 83f89d48 30155207e-030 3b423a4a d20748a2 245540327e0121 5acc569e 968e0944 263125459e0287 7d44997a 298b2f2e 566446538e-257 c64472b a9550e86 283223269e-257 c54472b a9550e86 245540327e0122 5b01b623 1e18c5cb 491080654e0122 5b11b623 1e18c5cb 971212611e-126 27a397d3 c9745d2f 229058583e0052 4c76ce94 febdc7a5 325270231e0039 49cc7ccf 90c9f8ab 989648089e-035 3a8880a3 d515e849 653777767e0273 7a720223 f2b3a881 923091487e0209 6d30bc60 e6896717 526250918e0288 7d89bfd8 b3edfafa 350301748e-309 18e0732 602056c 741111169e-203 17a14fe7 daf8f3ae 667284113e-240 ff09355 f8050c02 1227701635e0120 5abc569e 968e0944 9981396317e-182 1c38afe1 a2a66aa 5232604057e-298 41465b8 96c24520 5572170023e-088 2fb08478 22f765b2 1964322616e0122 5b31b623 1e18c5cb 3928645232e0122 5b41b623 1e18c5cb 8715380633e-058 35f4614c 3219891f 4856063055e-127 279397d3 c9745d2f 8336960483e-153 223a06a1 24b95e1 1007046393e-155 21a01891 fc4717fd 5378822089e-176 1d695fd4 c88d4b1b 5981342308e-190 1a83db11 ac608107 7214782613e-086 3020b552 d2edcdea 5458466829e0142 5f70acde 6a98eb4c 9078555839e-109 2b5fc575 867314ee 6418488827e0079 526021f1 4ed7b3fa 65325840981e0069 5081a151 ddbd3c4a 49573485983e0089 54a221bd 871d2cf4 46275205733e0074 51830e6c 7d4e3480 92550411466e0074 51930e6c 7d4e3480 41129842097e-202 1832c3e7 2d179607 93227267727e-049 380960fe 8d5847f 41297294357e0185 688c4943 7fccfadb 41534892987e-067 343a1266 6477886d 42333842451e0201 6be0189a 26df575f 78564021519e-227 13115551 5fd37265 53587107423e-061 35800a19 a3ffd981 53827010643e-200 18a32fa6 9a69bd6d 83356057653e0193 6a4544e6 daee2a18 45256834646e-118 29a541ec dfd48694 45392779195e-110 2b4fc575 867314ee 23934638219e0291 7e81deaf 40ead9a0 995779191233e0113 59e2d44e dcc51304 997422852243e-265 b676688 faee99bc 653532977297e-123 28d925a0 aabcdc68 938885684947e0147 60f11894 b202e9f4 619534293513e0124 5c210c20 303fe0f1 539879452414e-042 39a5e66d c3d6bdb5 742522891517e0259 782c1c35 2fc3c309 254901016865e-022 3dbc06d3 66394441 685763015669e0280 7c85fd7a a44d9477 384865004907e-285 72aa65b 58639e69 286556458711e0081 5321958b 36c5102b 573112917422e0081 5331958b 36c5102b 769525178383e-150 234253ec e161420 416780288265e0192 6a3544e6 daee2a18 226963895975e-111 2b3fc575 867314ee 665592809339e0063 4f778b65 16c2b478 3891901811465e0217 6f99ab82 61990292 4764593340755e0069 50e4177a 9915fbf8 6336156586177e0269 7a7173f7 6c63b792 8233559360849e0095 56566fee 5649a7a 3662265515198e-107 2c538e6e dd48f2a3 1831132757599e-107 2c438e6e dd48f2a3 7812878489261e-179 1d726dae 7bbeda75 6363857920591e0145 60b28a61 cf9483b7 8811915538555e0082 53a51f50 8b287ae7 9997878507563e-195 1a253db2 fea1ea31 9224786422069e-291 634ee5d 56b32957 6284426329974e-294 58d3409 dfbca26f 9199302046091e-062 35c13597 2630774c 6070482281213e-122 29423fa9 e6fcf47e 2780161250963e-301 405acc2 53064c2 8233559360849e0094 5621f324 d11d4862 72027097041701e0206 6d946778 12d3a606 97297545286625e0215 6f79ab82 61990292 99021992302453e-025 3da5c671 4def374c 54104687080198e-022 3e373cdf 8db7a7bc 33519685743233e0089 5537f203 339c9629 67039371486466e0089 5547f203 339c9629 39064392446305e-180 1d626dae 7bbeda75 17796979903653e0261 78e072f3 819c1321 28921916763211e0038 4a9eebab e0957af3 87605699161665e0155 6302920f 96e7f9ef 41921560615349e-067 34d9b2a5 c4041e4b 80527976643809e0061 4f7c7c5a ea080a49 72335858886654e-159 21cce77c 2b3328fc 52656615219377e0102 57f561de f4a9ee32 15400733123779e-072 33b8bf7e 7fa6f02a 77003665618895e-073 33a8bf7e 7fa6f02a 475603213226859e-042 3a42d730 88f4050a 972708181182949e0116 5b218a7f 36172332 246411729980464e-071 342eef5e 1f90ac34 123205864990232e-071 341eef5e 1f90ac34 609610927149051e-255 e104273 b18918b1 475603213226859e-041 3a778cfc ab31064d 672574798934795e0065 508226c6 84c87261 134514959786959e0066 509226c6 84c87261 294897574603217e-151 2395f2df 5e675a0f 723047919080275e0036 4a7eebab e0957af3 660191429952702e-088 30bddc7e 975c5045 330095714976351e-088 30addc7e 975c5045 578686871093232e-159 21fce77c 2b3328fc 144671717773308e-159 21dce77c 2b3328fc 385018328094475e-074 3398bf7e 7fa6f02a 330095714976351e-089 3077e398 7916a69e 2215901545757777e-212 171a80a6 e566428c 1702061899637397e-276 9cacc46 749dccfe 1864950924021923e0213 6f53ae60 753af6ca 3729901848043846e0213 6f63ae60 753af6ca 7487252720986826e-165 20f8823a 57adbef9 3743626360493413e-165 20e8823a 57adbef9 4988915232824583e0119 5be5f6de 9d5d6b5b 3771476185376383e0277 7cae3c14 d6916ce9 6182410494241627e-119 2a81b964 58445d07 2572981889477453e0142 609dfc11 fbf46087 7793560217139653e0051 4dd28046 1b856ec5 9163942927285259e-202 194fe601 457dce4d 6353227084707473e0155 63650aff 653ffe8a 4431803091515554e-211 17609068 4f5fe998 9324754620109615e0211 6f0f7d67 21f7f144 8870461176410409e0263 79d90529 a37b7e22 90372559027740405e0143 612491da ad0ba280 18074511805548081e0146 61a011f2 d73116f4 54897030182071313e0029 496ec556 66d8f9ec 76232626624829156e-032 3ccb7738 11e75fe 59898021767894608e-165 2128823a 57adbef9 29949010883947304e-165 2118823a 57adbef9 26153245263757307e0049 4d83de00 5bd620df 27176258005319167e-261 d27c074 7bd76fa1 18074511805548081e0147 61d4166f 8cfd5cb1 24691002732654881e-115 2b759a27 83ce70ab 58483921078398283e0057 4f408ce4 99519ce3 64409240769861689e-159 22692238 f7987779 94080055902682397e-242 11364981 e39e66ca 31766135423537365e0154 63550aff 653ffe8a 68985865317742005e0164 657a999d dec72aca 13797173063548401e0165 658a999d dec72aca 902042358290366539e-281 9522dc0 1ca1cb8c 238296178309629163e0272 7c038fd9 3f1f5342 783308178698887621e0226 72925ae6 2cb346d8 439176241456570504e0029 499ec556 66d8f9ec 899810892172646163e0283 7e6adf51 fa055e03 926145344610700019e-225 14f307a6 7f1f69ff 653831131593932675e0047 4d63de00 5bd620df 130766226318786535e0048 4d73de00 5bd620df 557035730189854663e-294 693bfac 6bc4767b 902042358290366539e-280 986b930 23ca3e6f 272104041512242479e0200 6d13bbb4 bf05f087 544208083024484958e0200 6d23bbb4 bf05f087 680429695511221511e0192 6b808ebc 116f8a20 308975121073410857e0236 7490db75 cc001072 792644927852378159e0078 53d7bff3 36d8ff06 783308178698887621e0223 71f2cbac 35f71140 8396094300569779681e-252 f8ab223 efcee35a 3507665085003296281e-074 346b85c0 26a264e4 7322325862592278999e0074 5336775b 6caa5ae0 6014546754280072926e0209 6f396397 b06732a4 7120190517612959703e0120 5cc3220d cd5899fd 3507665085003296281e-073 34a13398 18257f0f 4345544743100783551e-218 168a9c42 e5b6d89f 9778613303868468131e-090 313146fe 1075e1ef 7539204280836061195e-082 32d3d969 e3dbe723 7862637540082247119e-202 19eaba32 62ee707b 2176832332097939832e0200 6d43bbb4 bf05f087 8643988913946659879e0115 5bbe71ec 1ed0a4f9 5529436763613147623e0138 6079c677 be6f236e 6764958008109694533e-173 1fed0669 2e6f5ef6 6802601037806061975e0197 6cbf92ba cb3cb40c 1360520207561212395e0198 6ccf92ba cb3cb40c 62259110684423957791e0047 4dcd8f2c fc20d6e8 88800290202542652011e-226 1526cec5 1a43f41a 41010852717673354694e-221 16201295 4b6aabba 20505426358836677347e-221 16101295 4b6aabba 66102447903809911604e0055 4f776206 8a24fd55 35600952588064798515e0119 5cb3220d cd5899fd 14371240869903838702e0205 6e78d92d 2bcc7a81 57500690832492901689e0043 4cf65d3e 2acd616b 23432630639573022093e-107 2dbdd54c 40a2f25f 62259110684423957791e0048 4e02797c 1d948651 35620497849450218807e-306 475b220 82529425 69658634627134074624e0200 6d93bbb4 bf05f087 99440755792436956989e-062 37362d10 462a26f4 55277197169490210673e0081 54d945bf a911e32a 36992084760177624177e-318 1f8c5f9 551c2f9a 30888265282878466443e-111 2cf01b8e f28251fc # examples of bugs introduced 20001113, fixed 20010207 # first is 2^-1075 (half the smallest denormal) 2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125e-324 0 0 2.47032822920623272e-324 0 0 # examples reported by Mark Dickinson of bugs in the bigcomp() logic introduced # 20090316 in dtoa.c to speed handling of absurdly long input: 12579816049008305546974391768996369464963024663104e-357 90bbd 7412d19f 17489628565202117263145367596028389348922981857013e-357 c938e 9000492f 18487398785991994634182916638542680759613590482273e-357 d4b3a ee198863 32002864200581033134358724675198044527469366773928e-358 24d1e ed8448e3 99999999999999994487665465554760717039532578546e-47 3ff00000 0 1.0000000000000000100000000000000000000001e44 4911efc6 59cf7d4c 1000000000000000000000000000000000000000e-16 44b52d02 c7e14af6 10000000000000000000000000000000000000000e-17 44b52d02 c7e14af6 10.900000000000000012345678912345678912345 4025cccc cccccccd 104308485241983990666713401708072175773165034278685682646111762292409330928739751702404658197872319129036519947435319418387839758990478549477777586673075945844895981012024387992135617064532141489278815239849108105951619997829153633535314849999674266169258928940692239684771590065027025835804863585454872499320500023126142553932654370362024104462255244034053203998964360882487378334860197725139151265590832887433736189468858614521708567646743455601905935595381852723723645799866672558576993978025033590728687206296379801363024094048327273913079612469982585674824156000783167963081616214710691759864332339239688734656548790656486646106983450809073750535624894296242072010195710276073042036425579852459556183541199012652571123898996574563824424330960027873516082763671875e-1075 78026 65fd9600 99037485700245683102805043437346965248029601286431e-373 0 2 99617639833743863161109961162881027406769510558457e-373 0 2 98852915025769345295749278351563179840130565591462e-372 0 14 99059944827693569659153042769690930905148015876788e-373 0 2 98914979205069368270421829889078356254059760327101e-372 0 14 0.999999999999999999999999999999999999999999999e23 44b52d02 c7e14af6 991633793189150720000000000000000000000000000000000000000e-33 44ea3f92 6bad90c6 37652435753827922121470370984740152789920e234 78f1667a c9e75d61 999999999999999996790597280027956716285163e-42 3ff00000 0 9483973038658180570348795755328802873667739881500874740826641664593613312413122937394311083577538394191754403820631172036846773125424639263833553383990195662207006139342261292777056851379062046720e0 68a03d69 82f2f936 20209005503919489280000000000000000000000000000000000000000e-40 43bc0bae 57e880e6 mlton-20210117+dfsg/runtime/gdtoa/test/x.ou0000066400000000000000000000617501416264345000204730ustar00rootroot00000000000000 Input: 1.23 strtox consumes 4 bytes and returns 33 with bits = #3fff 9d70 a3d7 a3d 70a4 g_xfmt(0) gives 4 bytes: "1.23" strtoIx returns 33, consuming 4 bytes. fI[0] = #3fff 9d70 a3d7 a3d 70a3 fI[1] = #3fff 9d70 a3d7 a3d 70a4 fI[1] == strtox Input: 1.23e+20 strtox consumes 8 bytes and returns 1 with bits = #4041 d55e f90a 2da1 8000 g_xfmt(0) gives 8 bytes: "1.23e+20" strtoIx returns 1, consuming 8 bytes. fI[0] == fI[1] == strtox Input: 1.23e-20 strtox consumes 8 bytes and returns 17 with bits = #3fbc e857 267b b3a9 84f2 g_xfmt(0) gives 8 bytes: "1.23e-20" strtoIx returns 17, consuming 8 bytes. fI[0] = #3fbc e857 267b b3a9 84f2 fI[1] = #3fbc e857 267b b3a9 84f3 fI[0] == strtox Input: 1.23456789 strtox consumes 10 bytes and returns 33 with bits = #3fff 9e06 5214 1ef0 dbf6 g_xfmt(0) gives 10 bytes: "1.23456789" strtoIx returns 33, consuming 10 bytes. fI[0] = #3fff 9e06 5214 1ef0 dbf5 fI[1] = #3fff 9e06 5214 1ef0 dbf6 fI[1] == strtox Input: 1.23456589e+20 strtox consumes 14 bytes and returns 1 with bits = #4041 d629 bd33 5cc ba00 g_xfmt(0) gives 14 bytes: "1.23456589e+20" strtoIx returns 1, consuming 14 bytes. fI[0] == fI[1] == strtox Input: 1.23e+30 strtox consumes 8 bytes and returns 17 with bits = #4062 f865 8274 7dbc 824a g_xfmt(0) gives 8 bytes: "1.23e+30" strtoIx returns 17, consuming 8 bytes. fI[0] = #4062 f865 8274 7dbc 824a fI[1] = #4062 f865 8274 7dbc 824b fI[0] == strtox Input: 1.23e-30 strtox consumes 8 bytes and returns 17 with bits = #3f9b c794 337a 8085 54eb g_xfmt(0) gives 8 bytes: "1.23e-30" strtoIx returns 17, consuming 8 bytes. fI[0] = #3f9b c794 337a 8085 54eb fI[1] = #3f9b c794 337a 8085 54ec fI[0] == strtox Input: 1.23456789e-20 strtox consumes 14 bytes and returns 17 with bits = #3fbc e934 a38 f3d6 d352 g_xfmt(0) gives 14 bytes: "1.23456789e-20" strtoIx returns 17, consuming 14 bytes. fI[0] = #3fbc e934 a38 f3d6 d352 fI[1] = #3fbc e934 a38 f3d6 d353 fI[0] == strtox Input: 1.23456789e-30 strtox consumes 14 bytes and returns 17 with bits = #3f9b c851 f19d decc a8fc g_xfmt(0) gives 14 bytes: "1.23456789e-30" strtoIx returns 17, consuming 14 bytes. fI[0] = #3f9b c851 f19d decc a8fc fI[1] = #3f9b c851 f19d decc a8fd fI[0] == strtox Input: 1.234567890123456789 strtox consumes 20 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 20 bytes. fI[0] = #3fff 9e06 5214 62cf db8d fI[1] = #3fff 9e06 5214 62cf db8e fI[0] == strtox Input: 1.23456789012345678901234567890123456789 strtox consumes 40 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 40 bytes. fI[0] = #3fff 9e06 5214 62cf db8d fI[1] = #3fff 9e06 5214 62cf db8e fI[0] == strtox Input: 1.23e306 strtox consumes 8 bytes and returns 17 with bits = #43f7 e033 b668 e30f a6d5 g_xfmt(0) gives 9 bytes: "1.23e+306" strtoIx returns 17, consuming 8 bytes. fI[0] = #43f7 e033 b668 e30f a6d5 fI[1] = #43f7 e033 b668 e30f a6d6 fI[0] == strtox Input: 1.23e-306 strtox consumes 9 bytes and returns 33 with bits = #3c06 dd1d c2ed 1cb7 3f25 g_xfmt(0) gives 9 bytes: "1.23e-306" strtoIx returns 33, consuming 9 bytes. fI[0] = #3c06 dd1d c2ed 1cb7 3f24 fI[1] = #3c06 dd1d c2ed 1cb7 3f25 fI[1] == strtox Input: 1.23e-320 strtox consumes 9 bytes and returns 33 with bits = #3bd8 9b98 c371 844c 3f1a g_xfmt(0) gives 9 bytes: "1.23e-320" strtoIx returns 33, consuming 9 bytes. fI[0] = #3bd8 9b98 c371 844c 3f19 fI[1] = #3bd8 9b98 c371 844c 3f1a fI[1] == strtox Input: 1.23e-20 strtox consumes 8 bytes and returns 17 with bits = #3fbc e857 267b b3a9 84f2 g_xfmt(0) gives 8 bytes: "1.23e-20" strtoIx returns 17, consuming 8 bytes. fI[0] = #3fbc e857 267b b3a9 84f2 fI[1] = #3fbc e857 267b b3a9 84f3 fI[0] == strtox Input: 1.23456789e307 strtox consumes 14 bytes and returns 17 with bits = #43fb 8ca5 8a5e d766 de75 g_xfmt(0) gives 15 bytes: "1.23456789e+307" strtoIx returns 17, consuming 14 bytes. fI[0] = #43fb 8ca5 8a5e d766 de75 fI[1] = #43fb 8ca5 8a5e d766 de76 fI[0] == strtox Input: 1.23456589e-307 strtox consumes 15 bytes and returns 17 with bits = #3c03 b18c b5dc c22f d369 g_xfmt(0) gives 15 bytes: "1.23456589e-307" strtoIx returns 17, consuming 15 bytes. fI[0] = #3c03 b18c b5dc c22f d369 fI[1] = #3c03 b18c b5dc c22f d36a fI[0] == strtox Input: 1.234567890123456789 strtox consumes 20 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 20 bytes. fI[0] = #3fff 9e06 5214 62cf db8d fI[1] = #3fff 9e06 5214 62cf db8e fI[0] == strtox Input: 1.234567890123456789e301 strtox consumes 24 bytes and returns 33 with bits = #43e7 937a 8baf ab20 980c g_xfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIx returns 33, consuming 24 bytes. fI[0] = #43e7 937a 8baf ab20 980b fI[1] = #43e7 937a 8baf ab20 980c fI[1] == strtox Input: 1.234567890123456789e-301 strtox consumes 25 bytes and returns 33 with bits = #3c17 a953 271a 5d06 9ad9 g_xfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIx returns 33, consuming 25 bytes. fI[0] = #3c17 a953 271a 5d06 9ad8 fI[1] = #3c17 a953 271a 5d06 9ad9 fI[1] == strtox Input: 1.234567890123456789e-321 strtox consumes 25 bytes and returns 33 with bits = #3bd4 f9e1 1b4c ea6d cce9 g_xfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIx returns 33, consuming 25 bytes. fI[0] = #3bd4 f9e1 1b4c ea6d cce8 fI[1] = #3bd4 f9e1 1b4c ea6d cce9 fI[1] == strtox Input: 1e23 strtox consumes 4 bytes and returns 1 with bits = #404b a968 163f a57 b400 g_xfmt(0) gives 5 bytes: "1e+23" strtoIx returns 1, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1e310 strtox consumes 5 bytes and returns 33 with bits = #4404 de81 e40a 34b cf50 g_xfmt(0) gives 6 bytes: "1e+310" strtoIx returns 33, consuming 5 bytes. fI[0] = #4404 de81 e40a 34b cf4f fI[1] = #4404 de81 e40a 34b cf50 fI[1] == strtox Input: 9.0259718793241475e-277 strtox consumes 23 bytes and returns 33 with bits = #3c69 ffff ffff ffff fcf7 g_xfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIx returns 33, consuming 23 bytes. fI[0] = #3c69 ffff ffff ffff fcf6 fI[1] = #3c69 ffff ffff ffff fcf7 fI[1] == strtox Input: 9.025971879324147880346310405869e-277 strtox consumes 37 bytes and returns 17 with bits = #3c6a 8000 0 0 0 g_xfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIx returns 17, consuming 37 bytes. fI[0] = #3c6a 8000 0 0 0 fI[1] = #3c6a 8000 0 0 1 fI[0] == strtox Input: 9.025971879324147880346310405868e-277 strtox consumes 37 bytes and returns 33 with bits = #3c6a 8000 0 0 0 g_xfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIx returns 33, consuming 37 bytes. fI[0] = #3c69 ffff ffff ffff ffff fI[1] = #3c6a 8000 0 0 0 fI[1] == strtox Input: 2.2250738585072014e-308 strtox consumes 23 bytes and returns 17 with bits = #3c01 8000 0 0 46 g_xfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIx returns 17, consuming 23 bytes. fI[0] = #3c01 8000 0 0 46 fI[1] = #3c01 8000 0 0 47 fI[0] == strtox Input: 2.2250738585072013e-308 strtox consumes 23 bytes and returns 17 with bits = #3c00 ffff ffff ffff fd4f g_xfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIx returns 17, consuming 23 bytes. fI[0] = #3c00 ffff ffff ffff fd4f fI[1] = #3c00 ffff ffff ffff fd50 fI[0] == strtox Input: 3.2649476e14 strtox consumes 12 bytes and returns 1 with bits = #402f 9478 fe18 6d00 0 g_xfmt(0) gives 13 bytes: "3.2649476e+14" strtoIx returns 1, consuming 12 bytes. fI[0] == fI[1] == strtox Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtox consumes 3 bytes and returns 17 with bits = #3fff 8ccc cccc cccc cccc g_xfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc fI[1] = #3fff 8ccc cccc cccc cccd fI[0] == strtox Input: -1.1 strtox consumes 4 bytes and returns 25 with bits = #bfff 8ccc cccc cccc cccc g_xfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd fI[1] = #bfff 8ccc cccc cccc cccc fI[1] == strtox Input: 1.2 strtox consumes 3 bytes and returns 17 with bits = #3fff 9999 9999 9999 9999 g_xfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 fI[1] = #3fff 9999 9999 9999 999a fI[0] == strtox Input: -1.2 strtox consumes 4 bytes and returns 25 with bits = #bfff 9999 9999 9999 9999 g_xfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a fI[1] = #bfff 9999 9999 9999 9999 fI[1] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 fI[1] = #3fff a666 6666 6666 6667 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 fI[1] = #bfff a666 6666 6666 6666 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 fI[1] = #3fff b333 3333 3333 3334 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 fI[1] = #bfff b333 3333 3333 3333 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 17 with bits = #3fff cccc cccc cccc cccc g_xfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc fI[1] = #3fff cccc cccc cccc cccd fI[0] == strtox Input: -1.6 strtox consumes 4 bytes and returns 25 with bits = #bfff cccc cccc cccc cccc g_xfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd fI[1] = #bfff cccc cccc cccc cccc fI[1] == strtox Input: 1.7 strtox consumes 3 bytes and returns 17 with bits = #3fff d999 9999 9999 9999 g_xfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 fI[1] = #3fff d999 9999 9999 999a fI[0] == strtox Input: -1.7 strtox consumes 4 bytes and returns 25 with bits = #bfff d999 9999 9999 9999 g_xfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a fI[1] = #bfff d999 9999 9999 9999 fI[1] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 fI[1] = #3fff e666 6666 6666 6667 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 fI[1] = #bfff e666 6666 6666 6666 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 fI[1] = #3fff f333 3333 3333 3334 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 fI[1] = #bfff f333 3333 3333 3333 fI[1] == strtox Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtox consumes 3 bytes and returns 33 with bits = #3fff 8ccc cccc cccc cccd g_xfmt(0) gives 3 bytes: "1.1" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc fI[1] = #3fff 8ccc cccc cccc cccd fI[1] == strtox Input: -1.1 strtox consumes 4 bytes and returns 41 with bits = #bfff 8ccc cccc cccc cccd g_xfmt(0) gives 4 bytes: "-1.1" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd fI[1] = #bfff 8ccc cccc cccc cccc fI[0] == strtox Input: 1.2 strtox consumes 3 bytes and returns 33 with bits = #3fff 9999 9999 9999 999a g_xfmt(0) gives 3 bytes: "1.2" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 fI[1] = #3fff 9999 9999 9999 999a fI[1] == strtox Input: -1.2 strtox consumes 4 bytes and returns 41 with bits = #bfff 9999 9999 9999 999a g_xfmt(0) gives 4 bytes: "-1.2" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a fI[1] = #bfff 9999 9999 9999 9999 fI[0] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 fI[1] = #3fff a666 6666 6666 6667 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 fI[1] = #bfff a666 6666 6666 6666 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 fI[1] = #3fff b333 3333 3333 3334 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 fI[1] = #bfff b333 3333 3333 3333 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 33 with bits = #3fff cccc cccc cccc cccd g_xfmt(0) gives 3 bytes: "1.6" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc fI[1] = #3fff cccc cccc cccc cccd fI[1] == strtox Input: -1.6 strtox consumes 4 bytes and returns 41 with bits = #bfff cccc cccc cccc cccd g_xfmt(0) gives 4 bytes: "-1.6" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd fI[1] = #bfff cccc cccc cccc cccc fI[0] == strtox Input: 1.7 strtox consumes 3 bytes and returns 33 with bits = #3fff d999 9999 9999 999a g_xfmt(0) gives 3 bytes: "1.7" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 fI[1] = #3fff d999 9999 9999 999a fI[1] == strtox Input: -1.7 strtox consumes 4 bytes and returns 41 with bits = #bfff d999 9999 9999 999a g_xfmt(0) gives 4 bytes: "-1.7" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a fI[1] = #bfff d999 9999 9999 9999 fI[0] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 fI[1] = #3fff e666 6666 6666 6667 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 fI[1] = #bfff e666 6666 6666 6666 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 fI[1] = #3fff f333 3333 3333 3334 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 fI[1] = #bfff f333 3333 3333 3333 fI[1] == strtox Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtox consumes 3 bytes and returns 33 with bits = #3fff 8ccc cccc cccc cccd g_xfmt(0) gives 3 bytes: "1.1" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc fI[1] = #3fff 8ccc cccc cccc cccd fI[1] == strtox Input: -1.1 strtox consumes 4 bytes and returns 25 with bits = #bfff 8ccc cccc cccc cccc g_xfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd fI[1] = #bfff 8ccc cccc cccc cccc fI[1] == strtox Input: 1.2 strtox consumes 3 bytes and returns 33 with bits = #3fff 9999 9999 9999 999a g_xfmt(0) gives 3 bytes: "1.2" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 fI[1] = #3fff 9999 9999 9999 999a fI[1] == strtox Input: -1.2 strtox consumes 4 bytes and returns 25 with bits = #bfff 9999 9999 9999 9999 g_xfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a fI[1] = #bfff 9999 9999 9999 9999 fI[1] == strtox Input: 1.3 strtox consumes 3 bytes and returns 33 with bits = #3fff a666 6666 6666 6667 g_xfmt(0) gives 21 bytes: "1.3000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 fI[1] = #3fff a666 6666 6666 6667 fI[1] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 fI[1] = #bfff a666 6666 6666 6666 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 33 with bits = #3fff b333 3333 3333 3334 g_xfmt(0) gives 21 bytes: "1.4000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 fI[1] = #3fff b333 3333 3333 3334 fI[1] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 fI[1] = #bfff b333 3333 3333 3333 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 33 with bits = #3fff cccc cccc cccc cccd g_xfmt(0) gives 3 bytes: "1.6" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc fI[1] = #3fff cccc cccc cccc cccd fI[1] == strtox Input: -1.6 strtox consumes 4 bytes and returns 25 with bits = #bfff cccc cccc cccc cccc g_xfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd fI[1] = #bfff cccc cccc cccc cccc fI[1] == strtox Input: 1.7 strtox consumes 3 bytes and returns 33 with bits = #3fff d999 9999 9999 999a g_xfmt(0) gives 3 bytes: "1.7" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 fI[1] = #3fff d999 9999 9999 999a fI[1] == strtox Input: -1.7 strtox consumes 4 bytes and returns 25 with bits = #bfff d999 9999 9999 9999 g_xfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a fI[1] = #bfff d999 9999 9999 9999 fI[1] == strtox Input: 1.8 strtox consumes 3 bytes and returns 33 with bits = #3fff e666 6666 6666 6667 g_xfmt(0) gives 21 bytes: "1.8000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 fI[1] = #3fff e666 6666 6666 6667 fI[1] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 fI[1] = #bfff e666 6666 6666 6666 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 33 with bits = #3fff f333 3333 3333 3334 g_xfmt(0) gives 21 bytes: "1.9000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 fI[1] = #3fff f333 3333 3333 3334 fI[1] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 fI[1] = #bfff f333 3333 3333 3333 fI[1] == strtox Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtox consumes 3 bytes and returns 17 with bits = #3fff 8ccc cccc cccc cccc g_xfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc fI[1] = #3fff 8ccc cccc cccc cccd fI[0] == strtox Input: -1.1 strtox consumes 4 bytes and returns 41 with bits = #bfff 8ccc cccc cccc cccd g_xfmt(0) gives 4 bytes: "-1.1" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd fI[1] = #bfff 8ccc cccc cccc cccc fI[0] == strtox Input: 1.2 strtox consumes 3 bytes and returns 17 with bits = #3fff 9999 9999 9999 9999 g_xfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 fI[1] = #3fff 9999 9999 9999 999a fI[0] == strtox Input: -1.2 strtox consumes 4 bytes and returns 41 with bits = #bfff 9999 9999 9999 999a g_xfmt(0) gives 4 bytes: "-1.2" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a fI[1] = #bfff 9999 9999 9999 9999 fI[0] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 fI[1] = #3fff a666 6666 6666 6667 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 41 with bits = #bfff a666 6666 6666 6667 g_xfmt(0) gives 22 bytes: "-1.3000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 fI[1] = #bfff a666 6666 6666 6666 fI[0] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 fI[1] = #3fff b333 3333 3333 3334 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 41 with bits = #bfff b333 3333 3333 3334 g_xfmt(0) gives 22 bytes: "-1.4000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 fI[1] = #bfff b333 3333 3333 3333 fI[0] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 17 with bits = #3fff cccc cccc cccc cccc g_xfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc fI[1] = #3fff cccc cccc cccc cccd fI[0] == strtox Input: -1.6 strtox consumes 4 bytes and returns 41 with bits = #bfff cccc cccc cccc cccd g_xfmt(0) gives 4 bytes: "-1.6" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd fI[1] = #bfff cccc cccc cccc cccc fI[0] == strtox Input: 1.7 strtox consumes 3 bytes and returns 17 with bits = #3fff d999 9999 9999 9999 g_xfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 fI[1] = #3fff d999 9999 9999 999a fI[0] == strtox Input: -1.7 strtox consumes 4 bytes and returns 41 with bits = #bfff d999 9999 9999 999a g_xfmt(0) gives 4 bytes: "-1.7" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a fI[1] = #bfff d999 9999 9999 9999 fI[0] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 fI[1] = #3fff e666 6666 6666 6667 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 41 with bits = #bfff e666 6666 6666 6667 g_xfmt(0) gives 22 bytes: "-1.8000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 fI[1] = #bfff e666 6666 6666 6666 fI[0] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 fI[1] = #3fff f333 3333 3333 3334 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 41 with bits = #bfff f333 3333 3333 3334 g_xfmt(0) gives 22 bytes: "-1.9000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 fI[1] = #bfff f333 3333 3333 3333 fI[0] == strtox mlton-20210117+dfsg/runtime/gdtoa/test/x.ou1000066400000000000000000001040101416264345000204570ustar00rootroot00000000000000 Input: 1.23 strtox consumes 4 bytes and returns 33 with bits = #3fff 9d70 a3d7 a3d 70a4 printf("%.21Lg") gives 1.23000000000000000002 g_xfmt(0) gives 4 bytes: "1.23" strtoIx returns 33, consuming 4 bytes. fI[0] = #3fff 9d70 a3d7 a3d 70a3 = 1.22999999999999999991 fI[1] = #3fff 9d70 a3d7 a3d 70a4 = 1.23000000000000000002 fI[1] == strtox Input: 1.23e+20 strtox consumes 8 bytes and returns 1 with bits = #4041 d55e f90a 2da1 8000 printf("%.21Lg") gives 123000000000000000000 g_xfmt(0) gives 8 bytes: "1.23e+20" strtoIx returns 1, consuming 8 bytes. fI[0] == fI[1] == strtox Input: 1.23e-20 strtox consumes 8 bytes and returns 17 with bits = #3fbc e857 267b b3a9 84f2 printf("%.21Lg") gives 1.22999999999999999997e-20 g_xfmt(0) gives 8 bytes: "1.23e-20" strtoIx returns 17, consuming 8 bytes. fI[0] = #3fbc e857 267b b3a9 84f2 = 1.22999999999999999997e-20 fI[1] = #3fbc e857 267b b3a9 84f3 = 1.23000000000000000004e-20 fI[0] == strtox Input: 1.23456789 strtox consumes 10 bytes and returns 33 with bits = #3fff 9e06 5214 1ef0 dbf6 printf("%.21Lg") gives 1.23456789000000000003 g_xfmt(0) gives 10 bytes: "1.23456789" strtoIx returns 33, consuming 10 bytes. fI[0] = #3fff 9e06 5214 1ef0 dbf5 = 1.23456788999999999992 fI[1] = #3fff 9e06 5214 1ef0 dbf6 = 1.23456789000000000003 fI[1] == strtox Input: 1.23456589e+20 strtox consumes 14 bytes and returns 1 with bits = #4041 d629 bd33 5cc ba00 printf("%.21Lg") gives 123456589000000000000 g_xfmt(0) gives 14 bytes: "1.23456589e+20" strtoIx returns 1, consuming 14 bytes. fI[0] == fI[1] == strtox Input: 1.23e+30 strtox consumes 8 bytes and returns 17 with bits = #4062 f865 8274 7dbc 824a printf("%.21Lg") gives 1.22999999999999999999e+30 g_xfmt(0) gives 8 bytes: "1.23e+30" strtoIx returns 17, consuming 8 bytes. fI[0] = #4062 f865 8274 7dbc 824a = 1.22999999999999999999e+30 fI[1] = #4062 f865 8274 7dbc 824b = 1.23000000000000000006e+30 fI[0] == strtox Input: 1.23e-30 strtox consumes 8 bytes and returns 17 with bits = #3f9b c794 337a 8085 54eb printf("%.21Lg") gives 1.22999999999999999999e-30 g_xfmt(0) gives 8 bytes: "1.23e-30" strtoIx returns 17, consuming 8 bytes. fI[0] = #3f9b c794 337a 8085 54eb = 1.22999999999999999999e-30 fI[1] = #3f9b c794 337a 8085 54ec = 1.23000000000000000007e-30 fI[0] == strtox Input: 1.23456789e-20 strtox consumes 14 bytes and returns 17 with bits = #3fbc e934 a38 f3d6 d352 printf("%.21Lg") gives 1.23456788999999999998e-20 g_xfmt(0) gives 14 bytes: "1.23456789e-20" strtoIx returns 17, consuming 14 bytes. fI[0] = #3fbc e934 a38 f3d6 d352 = 1.23456788999999999998e-20 fI[1] = #3fbc e934 a38 f3d6 d353 = 1.23456789000000000005e-20 fI[0] == strtox Input: 1.23456789e-30 strtox consumes 14 bytes and returns 17 with bits = #3f9b c851 f19d decc a8fc printf("%.21Lg") gives 1.23456788999999999999e-30 g_xfmt(0) gives 14 bytes: "1.23456789e-30" strtoIx returns 17, consuming 14 bytes. fI[0] = #3f9b c851 f19d decc a8fc = 1.23456788999999999999e-30 fI[1] = #3f9b c851 f19d decc a8fd = 1.23456789000000000007e-30 fI[0] == strtox Input: 1.234567890123456789 strtox consumes 20 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d printf("%.21Lg") gives 1.23456789012345678899 g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 20 bytes. fI[0] = #3fff 9e06 5214 62cf db8d = 1.23456789012345678899 fI[1] = #3fff 9e06 5214 62cf db8e = 1.23456789012345678909 fI[0] == strtox Input: 1.23456789012345678901234567890123456789 strtox consumes 40 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d printf("%.21Lg") gives 1.23456789012345678899 g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 40 bytes. fI[0] = #3fff 9e06 5214 62cf db8d = 1.23456789012345678899 fI[1] = #3fff 9e06 5214 62cf db8e = 1.23456789012345678909 fI[0] == strtox Input: 1.23e306 strtox consumes 8 bytes and returns 17 with bits = #43f7 e033 b668 e30f a6d5 printf("%.21Lg") gives 1.22999999999999999997e+306 g_xfmt(0) gives 9 bytes: "1.23e+306" strtoIx returns 17, consuming 8 bytes. fI[0] = #43f7 e033 b668 e30f a6d5 = 1.22999999999999999997e+306 fI[1] = #43f7 e033 b668 e30f a6d6 = 1.23000000000000000005e+306 fI[0] == strtox Input: 1.23e-306 strtox consumes 9 bytes and returns 33 with bits = #3c06 dd1d c2ed 1cb7 3f25 printf("%.21Lg") gives 1.23000000000000000002e-306 g_xfmt(0) gives 9 bytes: "1.23e-306" strtoIx returns 33, consuming 9 bytes. fI[0] = #3c06 dd1d c2ed 1cb7 3f24 = 1.22999999999999999995e-306 fI[1] = #3c06 dd1d c2ed 1cb7 3f25 = 1.23000000000000000002e-306 fI[1] == strtox Input: 1.23e-320 strtox consumes 9 bytes and returns 33 with bits = #3bd8 9b98 c371 844c 3f1a printf("%.21Lg") gives 1.23000000000000000002e-320 g_xfmt(0) gives 9 bytes: "1.23e-320" strtoIx returns 33, consuming 9 bytes. fI[0] = #3bd8 9b98 c371 844c 3f19 = 1.22999999999999999991e-320 fI[1] = #3bd8 9b98 c371 844c 3f1a = 1.23000000000000000002e-320 fI[1] == strtox Input: 1.23e-20 strtox consumes 8 bytes and returns 17 with bits = #3fbc e857 267b b3a9 84f2 printf("%.21Lg") gives 1.22999999999999999997e-20 g_xfmt(0) gives 8 bytes: "1.23e-20" strtoIx returns 17, consuming 8 bytes. fI[0] = #3fbc e857 267b b3a9 84f2 = 1.22999999999999999997e-20 fI[1] = #3fbc e857 267b b3a9 84f3 = 1.23000000000000000004e-20 fI[0] == strtox Input: 1.23456789e307 strtox consumes 14 bytes and returns 17 with bits = #43fb 8ca5 8a5e d766 de75 printf("%.21Lg") gives 1.23456788999999999998e+307 g_xfmt(0) gives 15 bytes: "1.23456789e+307" strtoIx returns 17, consuming 14 bytes. fI[0] = #43fb 8ca5 8a5e d766 de75 = 1.23456788999999999998e+307 fI[1] = #43fb 8ca5 8a5e d766 de76 = 1.23456789000000000011e+307 fI[0] == strtox Input: 1.23456589e-307 strtox consumes 15 bytes and returns 17 with bits = #3c03 b18c b5dc c22f d369 printf("%.21Lg") gives 1.23456588999999999999e-307 g_xfmt(0) gives 15 bytes: "1.23456589e-307" strtoIx returns 17, consuming 15 bytes. fI[0] = #3c03 b18c b5dc c22f d369 = 1.23456588999999999999e-307 fI[1] = #3c03 b18c b5dc c22f d36a = 1.23456589000000000009e-307 fI[0] == strtox Input: 1.234567890123456789 strtox consumes 20 bytes and returns 17 with bits = #3fff 9e06 5214 62cf db8d printf("%.21Lg") gives 1.23456789012345678899 g_xfmt(0) gives 20 bytes: "1.234567890123456789" strtoIx returns 17, consuming 20 bytes. fI[0] = #3fff 9e06 5214 62cf db8d = 1.23456789012345678899 fI[1] = #3fff 9e06 5214 62cf db8e = 1.23456789012345678909 fI[0] == strtox Input: 1.234567890123456789e301 strtox consumes 24 bytes and returns 33 with bits = #43e7 937a 8baf ab20 980c printf("%.21Lg") gives 1.234567890123456789e+301 g_xfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIx returns 33, consuming 24 bytes. fI[0] = #43e7 937a 8baf ab20 980b = 1.23456789012345678889e+301 fI[1] = #43e7 937a 8baf ab20 980c = 1.234567890123456789e+301 fI[1] == strtox Input: 1.234567890123456789e-301 strtox consumes 25 bytes and returns 33 with bits = #3c17 a953 271a 5d06 9ad9 printf("%.21Lg") gives 1.23456789012345678902e-301 g_xfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIx returns 33, consuming 25 bytes. fI[0] = #3c17 a953 271a 5d06 9ad8 = 1.23456789012345678892e-301 fI[1] = #3c17 a953 271a 5d06 9ad9 = 1.23456789012345678902e-301 fI[1] == strtox Input: 1.234567890123456789e-321 strtox consumes 25 bytes and returns 33 with bits = #3bd4 f9e1 1b4c ea6d cce9 printf("%.21Lg") gives 1.234567890123456789e-321 g_xfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIx returns 33, consuming 25 bytes. fI[0] = #3bd4 f9e1 1b4c ea6d cce8 = 1.23456789012345678893e-321 fI[1] = #3bd4 f9e1 1b4c ea6d cce9 = 1.234567890123456789e-321 fI[1] == strtox Input: 1e23 strtox consumes 4 bytes and returns 1 with bits = #404b a968 163f a57 b400 printf("%.21Lg") gives 1e+23 g_xfmt(0) gives 5 bytes: "1e+23" strtoIx returns 1, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1e310 strtox consumes 5 bytes and returns 33 with bits = #4404 de81 e40a 34b cf50 printf("%.21Lg") gives 1e+310 g_xfmt(0) gives 6 bytes: "1e+310" strtoIx returns 33, consuming 5 bytes. fI[0] = #4404 de81 e40a 34b cf4f = 9.9999999999999999994e+309 fI[1] = #4404 de81 e40a 34b cf50 = 1e+310 fI[1] == strtox Input: 9.0259718793241475e-277 strtox consumes 23 bytes and returns 33 with bits = #3c69 ffff ffff ffff fcf7 printf("%.21Lg") gives 9.02597187932414750016e-277 g_xfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIx returns 33, consuming 23 bytes. fI[0] = #3c69 ffff ffff ffff fcf6 = 9.02597187932414749967e-277 fI[1] = #3c69 ffff ffff ffff fcf7 = 9.02597187932414750016e-277 fI[1] == strtox Input: 9.025971879324147880346310405869e-277 strtox consumes 37 bytes and returns 17 with bits = #3c6a 8000 0 0 0 printf("%.21Lg") gives 9.02597187932414788035e-277 g_xfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIx returns 17, consuming 37 bytes. fI[0] = #3c6a 8000 0 0 0 = 9.02597187932414788035e-277 fI[1] = #3c6a 8000 0 0 1 = 9.02597187932414788132e-277 fI[0] == strtox Input: 9.025971879324147880346310405868e-277 strtox consumes 37 bytes and returns 33 with bits = #3c6a 8000 0 0 0 printf("%.21Lg") gives 9.02597187932414788035e-277 g_xfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIx returns 33, consuming 37 bytes. fI[0] = #3c69 ffff ffff ffff ffff = 9.02597187932414787986e-277 fI[1] = #3c6a 8000 0 0 0 = 9.02597187932414788035e-277 fI[1] == strtox Input: 2.2250738585072014e-308 strtox consumes 23 bytes and returns 17 with bits = #3c01 8000 0 0 46 printf("%.21Lg") gives 2.22507385850720139998e-308 g_xfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIx returns 17, consuming 23 bytes. fI[0] = #3c01 8000 0 0 46 = 2.22507385850720139998e-308 fI[1] = #3c01 8000 0 0 47 = 2.22507385850720140022e-308 fI[0] == strtox Input: 2.2250738585072013e-308 strtox consumes 23 bytes and returns 17 with bits = #3c00 ffff ffff ffff fd4f printf("%.21Lg") gives 2.22507385850720129998e-308 g_xfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIx returns 17, consuming 23 bytes. fI[0] = #3c00 ffff ffff ffff fd4f = 2.22507385850720129998e-308 fI[1] = #3c00 ffff ffff ffff fd50 = 2.2250738585072013001e-308 fI[0] == strtox Input: 3.2649476e14 strtox consumes 12 bytes and returns 1 with bits = #402f 9478 fe18 6d00 0 printf("%.21Lg") gives 326494760000000 g_xfmt(0) gives 13 bytes: "3.2649476e+14" strtoIx returns 1, consuming 12 bytes. fI[0] == fI[1] == strtox Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtox consumes 3 bytes and returns 17 with bits = #3fff 8ccc cccc cccc cccc printf("%.21Lg") gives 1.09999999999999999991 g_xfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc = 1.09999999999999999991 fI[1] = #3fff 8ccc cccc cccc cccd = 1.10000000000000000002 fI[0] == strtox Input: -1.1 strtox consumes 4 bytes and returns 25 with bits = #bfff 8ccc cccc cccc cccc printf("%.21Lg") gives -1.09999999999999999991 g_xfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd = -1.10000000000000000002 fI[1] = #bfff 8ccc cccc cccc cccc = -1.09999999999999999991 fI[1] == strtox Input: 1.2 strtox consumes 3 bytes and returns 17 with bits = #3fff 9999 9999 9999 9999 printf("%.21Lg") gives 1.19999999999999999993 g_xfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 = 1.19999999999999999993 fI[1] = #3fff 9999 9999 9999 999a = 1.20000000000000000004 fI[0] == strtox Input: -1.2 strtox consumes 4 bytes and returns 25 with bits = #bfff 9999 9999 9999 9999 printf("%.21Lg") gives -1.19999999999999999993 g_xfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a = -1.20000000000000000004 fI[1] = #bfff 9999 9999 9999 9999 = -1.19999999999999999993 fI[1] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 printf("%.21Lg") gives 1.29999999999999999996 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 = 1.29999999999999999996 fI[1] = #3fff a666 6666 6666 6667 = 1.30000000000000000007 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 printf("%.21Lg") gives -1.29999999999999999996 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 = -1.30000000000000000007 fI[1] = #bfff a666 6666 6666 6666 = -1.29999999999999999996 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 printf("%.21Lg") gives 1.39999999999999999998 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 = 1.39999999999999999998 fI[1] = #3fff b333 3333 3333 3334 = 1.40000000000000000009 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 printf("%.21Lg") gives -1.39999999999999999998 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 = -1.40000000000000000009 fI[1] = #bfff b333 3333 3333 3333 = -1.39999999999999999998 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 printf("%.21Lg") gives 1.5 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 printf("%.21Lg") gives -1.5 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 17 with bits = #3fff cccc cccc cccc cccc printf("%.21Lg") gives 1.59999999999999999991 g_xfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc = 1.59999999999999999991 fI[1] = #3fff cccc cccc cccc cccd = 1.60000000000000000002 fI[0] == strtox Input: -1.6 strtox consumes 4 bytes and returns 25 with bits = #bfff cccc cccc cccc cccc printf("%.21Lg") gives -1.59999999999999999991 g_xfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd = -1.60000000000000000002 fI[1] = #bfff cccc cccc cccc cccc = -1.59999999999999999991 fI[1] == strtox Input: 1.7 strtox consumes 3 bytes and returns 17 with bits = #3fff d999 9999 9999 9999 printf("%.21Lg") gives 1.69999999999999999993 g_xfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 = 1.69999999999999999993 fI[1] = #3fff d999 9999 9999 999a = 1.70000000000000000004 fI[0] == strtox Input: -1.7 strtox consumes 4 bytes and returns 25 with bits = #bfff d999 9999 9999 9999 printf("%.21Lg") gives -1.69999999999999999993 g_xfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a = -1.70000000000000000004 fI[1] = #bfff d999 9999 9999 9999 = -1.69999999999999999993 fI[1] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 printf("%.21Lg") gives 1.79999999999999999996 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 = 1.79999999999999999996 fI[1] = #3fff e666 6666 6666 6667 = 1.80000000000000000007 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 printf("%.21Lg") gives -1.79999999999999999996 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 = -1.80000000000000000007 fI[1] = #bfff e666 6666 6666 6666 = -1.79999999999999999996 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 printf("%.21Lg") gives 1.89999999999999999998 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 = 1.89999999999999999998 fI[1] = #3fff f333 3333 3333 3334 = 1.90000000000000000009 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 printf("%.21Lg") gives -1.89999999999999999998 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 = -1.90000000000000000009 fI[1] = #bfff f333 3333 3333 3333 = -1.89999999999999999998 fI[1] == strtox Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtox consumes 3 bytes and returns 33 with bits = #3fff 8ccc cccc cccc cccd printf("%.21Lg") gives 1.10000000000000000002 g_xfmt(0) gives 3 bytes: "1.1" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc = 1.09999999999999999991 fI[1] = #3fff 8ccc cccc cccc cccd = 1.10000000000000000002 fI[1] == strtox Input: -1.1 strtox consumes 4 bytes and returns 41 with bits = #bfff 8ccc cccc cccc cccd printf("%.21Lg") gives -1.10000000000000000002 g_xfmt(0) gives 4 bytes: "-1.1" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd = -1.10000000000000000002 fI[1] = #bfff 8ccc cccc cccc cccc = -1.09999999999999999991 fI[0] == strtox Input: 1.2 strtox consumes 3 bytes and returns 33 with bits = #3fff 9999 9999 9999 999a printf("%.21Lg") gives 1.20000000000000000004 g_xfmt(0) gives 3 bytes: "1.2" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 = 1.19999999999999999993 fI[1] = #3fff 9999 9999 9999 999a = 1.20000000000000000004 fI[1] == strtox Input: -1.2 strtox consumes 4 bytes and returns 41 with bits = #bfff 9999 9999 9999 999a printf("%.21Lg") gives -1.20000000000000000004 g_xfmt(0) gives 4 bytes: "-1.2" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a = -1.20000000000000000004 fI[1] = #bfff 9999 9999 9999 9999 = -1.19999999999999999993 fI[0] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 printf("%.21Lg") gives 1.29999999999999999996 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 = 1.29999999999999999996 fI[1] = #3fff a666 6666 6666 6667 = 1.30000000000000000007 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 printf("%.21Lg") gives -1.29999999999999999996 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 = -1.30000000000000000007 fI[1] = #bfff a666 6666 6666 6666 = -1.29999999999999999996 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 printf("%.21Lg") gives 1.39999999999999999998 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 = 1.39999999999999999998 fI[1] = #3fff b333 3333 3333 3334 = 1.40000000000000000009 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 printf("%.21Lg") gives -1.39999999999999999998 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 = -1.40000000000000000009 fI[1] = #bfff b333 3333 3333 3333 = -1.39999999999999999998 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 printf("%.21Lg") gives 1.5 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 printf("%.21Lg") gives -1.5 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 33 with bits = #3fff cccc cccc cccc cccd printf("%.21Lg") gives 1.60000000000000000002 g_xfmt(0) gives 3 bytes: "1.6" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc = 1.59999999999999999991 fI[1] = #3fff cccc cccc cccc cccd = 1.60000000000000000002 fI[1] == strtox Input: -1.6 strtox consumes 4 bytes and returns 41 with bits = #bfff cccc cccc cccc cccd printf("%.21Lg") gives -1.60000000000000000002 g_xfmt(0) gives 4 bytes: "-1.6" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd = -1.60000000000000000002 fI[1] = #bfff cccc cccc cccc cccc = -1.59999999999999999991 fI[0] == strtox Input: 1.7 strtox consumes 3 bytes and returns 33 with bits = #3fff d999 9999 9999 999a printf("%.21Lg") gives 1.70000000000000000004 g_xfmt(0) gives 3 bytes: "1.7" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 = 1.69999999999999999993 fI[1] = #3fff d999 9999 9999 999a = 1.70000000000000000004 fI[1] == strtox Input: -1.7 strtox consumes 4 bytes and returns 41 with bits = #bfff d999 9999 9999 999a printf("%.21Lg") gives -1.70000000000000000004 g_xfmt(0) gives 4 bytes: "-1.7" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a = -1.70000000000000000004 fI[1] = #bfff d999 9999 9999 9999 = -1.69999999999999999993 fI[0] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 printf("%.21Lg") gives 1.79999999999999999996 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 = 1.79999999999999999996 fI[1] = #3fff e666 6666 6666 6667 = 1.80000000000000000007 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 printf("%.21Lg") gives -1.79999999999999999996 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 = -1.80000000000000000007 fI[1] = #bfff e666 6666 6666 6666 = -1.79999999999999999996 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 printf("%.21Lg") gives 1.89999999999999999998 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 = 1.89999999999999999998 fI[1] = #3fff f333 3333 3333 3334 = 1.90000000000000000009 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 printf("%.21Lg") gives -1.89999999999999999998 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 = -1.90000000000000000009 fI[1] = #bfff f333 3333 3333 3333 = -1.89999999999999999998 fI[1] == strtox Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtox consumes 3 bytes and returns 33 with bits = #3fff 8ccc cccc cccc cccd printf("%.21Lg") gives 1.10000000000000000002 g_xfmt(0) gives 3 bytes: "1.1" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc = 1.09999999999999999991 fI[1] = #3fff 8ccc cccc cccc cccd = 1.10000000000000000002 fI[1] == strtox Input: -1.1 strtox consumes 4 bytes and returns 25 with bits = #bfff 8ccc cccc cccc cccc printf("%.21Lg") gives -1.09999999999999999991 g_xfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd = -1.10000000000000000002 fI[1] = #bfff 8ccc cccc cccc cccc = -1.09999999999999999991 fI[1] == strtox Input: 1.2 strtox consumes 3 bytes and returns 33 with bits = #3fff 9999 9999 9999 999a printf("%.21Lg") gives 1.20000000000000000004 g_xfmt(0) gives 3 bytes: "1.2" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 = 1.19999999999999999993 fI[1] = #3fff 9999 9999 9999 999a = 1.20000000000000000004 fI[1] == strtox Input: -1.2 strtox consumes 4 bytes and returns 25 with bits = #bfff 9999 9999 9999 9999 printf("%.21Lg") gives -1.19999999999999999993 g_xfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a = -1.20000000000000000004 fI[1] = #bfff 9999 9999 9999 9999 = -1.19999999999999999993 fI[1] == strtox Input: 1.3 strtox consumes 3 bytes and returns 33 with bits = #3fff a666 6666 6666 6667 printf("%.21Lg") gives 1.30000000000000000007 g_xfmt(0) gives 21 bytes: "1.3000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 = 1.29999999999999999996 fI[1] = #3fff a666 6666 6666 6667 = 1.30000000000000000007 fI[1] == strtox Input: -1.3 strtox consumes 4 bytes and returns 25 with bits = #bfff a666 6666 6666 6666 printf("%.21Lg") gives -1.29999999999999999996 g_xfmt(0) gives 4 bytes: "-1.3" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 = -1.30000000000000000007 fI[1] = #bfff a666 6666 6666 6666 = -1.29999999999999999996 fI[1] == strtox Input: 1.4 strtox consumes 3 bytes and returns 33 with bits = #3fff b333 3333 3333 3334 printf("%.21Lg") gives 1.40000000000000000009 g_xfmt(0) gives 21 bytes: "1.4000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 = 1.39999999999999999998 fI[1] = #3fff b333 3333 3333 3334 = 1.40000000000000000009 fI[1] == strtox Input: -1.4 strtox consumes 4 bytes and returns 25 with bits = #bfff b333 3333 3333 3333 printf("%.21Lg") gives -1.39999999999999999998 g_xfmt(0) gives 4 bytes: "-1.4" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 = -1.40000000000000000009 fI[1] = #bfff b333 3333 3333 3333 = -1.39999999999999999998 fI[1] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 printf("%.21Lg") gives 1.5 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 printf("%.21Lg") gives -1.5 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 33 with bits = #3fff cccc cccc cccc cccd printf("%.21Lg") gives 1.60000000000000000002 g_xfmt(0) gives 3 bytes: "1.6" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc = 1.59999999999999999991 fI[1] = #3fff cccc cccc cccc cccd = 1.60000000000000000002 fI[1] == strtox Input: -1.6 strtox consumes 4 bytes and returns 25 with bits = #bfff cccc cccc cccc cccc printf("%.21Lg") gives -1.59999999999999999991 g_xfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd = -1.60000000000000000002 fI[1] = #bfff cccc cccc cccc cccc = -1.59999999999999999991 fI[1] == strtox Input: 1.7 strtox consumes 3 bytes and returns 33 with bits = #3fff d999 9999 9999 999a printf("%.21Lg") gives 1.70000000000000000004 g_xfmt(0) gives 3 bytes: "1.7" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 = 1.69999999999999999993 fI[1] = #3fff d999 9999 9999 999a = 1.70000000000000000004 fI[1] == strtox Input: -1.7 strtox consumes 4 bytes and returns 25 with bits = #bfff d999 9999 9999 9999 printf("%.21Lg") gives -1.69999999999999999993 g_xfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a = -1.70000000000000000004 fI[1] = #bfff d999 9999 9999 9999 = -1.69999999999999999993 fI[1] == strtox Input: 1.8 strtox consumes 3 bytes and returns 33 with bits = #3fff e666 6666 6666 6667 printf("%.21Lg") gives 1.80000000000000000007 g_xfmt(0) gives 21 bytes: "1.8000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 = 1.79999999999999999996 fI[1] = #3fff e666 6666 6666 6667 = 1.80000000000000000007 fI[1] == strtox Input: -1.8 strtox consumes 4 bytes and returns 25 with bits = #bfff e666 6666 6666 6666 printf("%.21Lg") gives -1.79999999999999999996 g_xfmt(0) gives 4 bytes: "-1.8" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 = -1.80000000000000000007 fI[1] = #bfff e666 6666 6666 6666 = -1.79999999999999999996 fI[1] == strtox Input: 1.9 strtox consumes 3 bytes and returns 33 with bits = #3fff f333 3333 3333 3334 printf("%.21Lg") gives 1.90000000000000000009 g_xfmt(0) gives 21 bytes: "1.9000000000000000001" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 = 1.89999999999999999998 fI[1] = #3fff f333 3333 3333 3334 = 1.90000000000000000009 fI[1] == strtox Input: -1.9 strtox consumes 4 bytes and returns 25 with bits = #bfff f333 3333 3333 3333 printf("%.21Lg") gives -1.89999999999999999998 g_xfmt(0) gives 4 bytes: "-1.9" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 = -1.90000000000000000009 fI[1] = #bfff f333 3333 3333 3333 = -1.89999999999999999998 fI[1] == strtox Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtox consumes 3 bytes and returns 17 with bits = #3fff 8ccc cccc cccc cccc printf("%.21Lg") gives 1.09999999999999999991 g_xfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 8ccc cccc cccc cccc = 1.09999999999999999991 fI[1] = #3fff 8ccc cccc cccc cccd = 1.10000000000000000002 fI[0] == strtox Input: -1.1 strtox consumes 4 bytes and returns 41 with bits = #bfff 8ccc cccc cccc cccd printf("%.21Lg") gives -1.10000000000000000002 g_xfmt(0) gives 4 bytes: "-1.1" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 8ccc cccc cccc cccd = -1.10000000000000000002 fI[1] = #bfff 8ccc cccc cccc cccc = -1.09999999999999999991 fI[0] == strtox Input: 1.2 strtox consumes 3 bytes and returns 17 with bits = #3fff 9999 9999 9999 9999 printf("%.21Lg") gives 1.19999999999999999993 g_xfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff 9999 9999 9999 9999 = 1.19999999999999999993 fI[1] = #3fff 9999 9999 9999 999a = 1.20000000000000000004 fI[0] == strtox Input: -1.2 strtox consumes 4 bytes and returns 41 with bits = #bfff 9999 9999 9999 999a printf("%.21Lg") gives -1.20000000000000000004 g_xfmt(0) gives 4 bytes: "-1.2" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff 9999 9999 9999 999a = -1.20000000000000000004 fI[1] = #bfff 9999 9999 9999 9999 = -1.19999999999999999993 fI[0] == strtox Input: 1.3 strtox consumes 3 bytes and returns 17 with bits = #3fff a666 6666 6666 6666 printf("%.21Lg") gives 1.29999999999999999996 g_xfmt(0) gives 3 bytes: "1.3" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff a666 6666 6666 6666 = 1.29999999999999999996 fI[1] = #3fff a666 6666 6666 6667 = 1.30000000000000000007 fI[0] == strtox Input: -1.3 strtox consumes 4 bytes and returns 41 with bits = #bfff a666 6666 6666 6667 printf("%.21Lg") gives -1.30000000000000000007 g_xfmt(0) gives 22 bytes: "-1.3000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff a666 6666 6666 6667 = -1.30000000000000000007 fI[1] = #bfff a666 6666 6666 6666 = -1.29999999999999999996 fI[0] == strtox Input: 1.4 strtox consumes 3 bytes and returns 17 with bits = #3fff b333 3333 3333 3333 printf("%.21Lg") gives 1.39999999999999999998 g_xfmt(0) gives 3 bytes: "1.4" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff b333 3333 3333 3333 = 1.39999999999999999998 fI[1] = #3fff b333 3333 3333 3334 = 1.40000000000000000009 fI[0] == strtox Input: -1.4 strtox consumes 4 bytes and returns 41 with bits = #bfff b333 3333 3333 3334 printf("%.21Lg") gives -1.40000000000000000009 g_xfmt(0) gives 22 bytes: "-1.4000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff b333 3333 3333 3334 = -1.40000000000000000009 fI[1] = #bfff b333 3333 3333 3333 = -1.39999999999999999998 fI[0] == strtox Input: 1.5 strtox consumes 3 bytes and returns 1 with bits = #3fff c000 0 0 0 printf("%.21Lg") gives 1.5 g_xfmt(0) gives 3 bytes: "1.5" strtoIx returns 1, consuming 3 bytes. fI[0] == fI[1] == strtox Input: -1.5 strtox consumes 4 bytes and returns 9 with bits = #bfff c000 0 0 0 printf("%.21Lg") gives -1.5 g_xfmt(0) gives 4 bytes: "-1.5" strtoIx returns 9, consuming 4 bytes. fI[0] == fI[1] == strtox Input: 1.6 strtox consumes 3 bytes and returns 17 with bits = #3fff cccc cccc cccc cccc printf("%.21Lg") gives 1.59999999999999999991 g_xfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff cccc cccc cccc cccc = 1.59999999999999999991 fI[1] = #3fff cccc cccc cccc cccd = 1.60000000000000000002 fI[0] == strtox Input: -1.6 strtox consumes 4 bytes and returns 41 with bits = #bfff cccc cccc cccc cccd printf("%.21Lg") gives -1.60000000000000000002 g_xfmt(0) gives 4 bytes: "-1.6" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff cccc cccc cccc cccd = -1.60000000000000000002 fI[1] = #bfff cccc cccc cccc cccc = -1.59999999999999999991 fI[0] == strtox Input: 1.7 strtox consumes 3 bytes and returns 17 with bits = #3fff d999 9999 9999 9999 printf("%.21Lg") gives 1.69999999999999999993 g_xfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIx returns 33, consuming 3 bytes. fI[0] = #3fff d999 9999 9999 9999 = 1.69999999999999999993 fI[1] = #3fff d999 9999 9999 999a = 1.70000000000000000004 fI[0] == strtox Input: -1.7 strtox consumes 4 bytes and returns 41 with bits = #bfff d999 9999 9999 999a printf("%.21Lg") gives -1.70000000000000000004 g_xfmt(0) gives 4 bytes: "-1.7" strtoIx returns 41, consuming 4 bytes. fI[0] = #bfff d999 9999 9999 999a = -1.70000000000000000004 fI[1] = #bfff d999 9999 9999 9999 = -1.69999999999999999993 fI[0] == strtox Input: 1.8 strtox consumes 3 bytes and returns 17 with bits = #3fff e666 6666 6666 6666 printf("%.21Lg") gives 1.79999999999999999996 g_xfmt(0) gives 3 bytes: "1.8" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff e666 6666 6666 6666 = 1.79999999999999999996 fI[1] = #3fff e666 6666 6666 6667 = 1.80000000000000000007 fI[0] == strtox Input: -1.8 strtox consumes 4 bytes and returns 41 with bits = #bfff e666 6666 6666 6667 printf("%.21Lg") gives -1.80000000000000000007 g_xfmt(0) gives 22 bytes: "-1.8000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff e666 6666 6666 6667 = -1.80000000000000000007 fI[1] = #bfff e666 6666 6666 6666 = -1.79999999999999999996 fI[0] == strtox Input: 1.9 strtox consumes 3 bytes and returns 17 with bits = #3fff f333 3333 3333 3333 printf("%.21Lg") gives 1.89999999999999999998 g_xfmt(0) gives 3 bytes: "1.9" strtoIx returns 17, consuming 3 bytes. fI[0] = #3fff f333 3333 3333 3333 = 1.89999999999999999998 fI[1] = #3fff f333 3333 3333 3334 = 1.90000000000000000009 fI[0] == strtox Input: -1.9 strtox consumes 4 bytes and returns 41 with bits = #bfff f333 3333 3333 3334 printf("%.21Lg") gives -1.90000000000000000009 g_xfmt(0) gives 22 bytes: "-1.9000000000000000001" strtoIx returns 25, consuming 4 bytes. fI[0] = #bfff f333 3333 3333 3334 = -1.90000000000000000009 fI[1] = #bfff f333 3333 3333 3333 = -1.89999999999999999998 fI[0] == strtox mlton-20210117+dfsg/runtime/gdtoa/test/xL.ou0000066400000000000000000000637201416264345000206060ustar00rootroot00000000000000 Input: 1.23 strtoxL consumes 4 bytes and returns 33 with bits = #3fff0000 9d70a3d7 a3d70a4 g_xLfmt(0) gives 4 bytes: "1.23" strtoIxL returns 33, consuming 4 bytes. fI[0] = #3fff0000 9d70a3d7 a3d70a3 fI[1] = #3fff0000 9d70a3d7 a3d70a4 fI[1] == strtoxL Input: 1.23e+20 strtoxL consumes 8 bytes and returns 1 with bits = #40410000 d55ef90a 2da18000 g_xLfmt(0) gives 8 bytes: "1.23e+20" strtoIxL returns 1, consuming 8 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 fI[1] = #3fbc0000 e857267b b3a984f3 fI[0] == strtoxL Input: 1.23456789 strtoxL consumes 10 bytes and returns 33 with bits = #3fff0000 9e065214 1ef0dbf6 g_xLfmt(0) gives 10 bytes: "1.23456789" strtoIxL returns 33, consuming 10 bytes. fI[0] = #3fff0000 9e065214 1ef0dbf5 fI[1] = #3fff0000 9e065214 1ef0dbf6 fI[1] == strtoxL Input: 1.23456589e+20 strtoxL consumes 14 bytes and returns 1 with bits = #40410000 d629bd33 5ccba00 g_xLfmt(0) gives 14 bytes: "1.23456589e+20" strtoIxL returns 1, consuming 14 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e+30 strtoxL consumes 8 bytes and returns 17 with bits = #40620000 f8658274 7dbc824a g_xLfmt(0) gives 8 bytes: "1.23e+30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #40620000 f8658274 7dbc824a fI[1] = #40620000 f8658274 7dbc824b fI[0] == strtoxL Input: 1.23e-30 strtoxL consumes 8 bytes and returns 17 with bits = #3f9b0000 c794337a 808554eb g_xLfmt(0) gives 8 bytes: "1.23e-30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3f9b0000 c794337a 808554eb fI[1] = #3f9b0000 c794337a 808554ec fI[0] == strtoxL Input: 1.23456789e-20 strtoxL consumes 14 bytes and returns 17 with bits = #3fbc0000 e9340a38 f3d6d352 g_xLfmt(0) gives 14 bytes: "1.23456789e-20" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3fbc0000 e9340a38 f3d6d352 fI[1] = #3fbc0000 e9340a38 f3d6d353 fI[0] == strtoxL Input: 1.23456789e-30 strtoxL consumes 14 bytes and returns 17 with bits = #3f9b0000 c851f19d decca8fc g_xLfmt(0) gives 14 bytes: "1.23456789e-30" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3f9b0000 c851f19d decca8fc fI[1] = #3f9b0000 c851f19d decca8fd fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d fI[1] = #3fff0000 9e065214 62cfdb8e fI[0] == strtoxL Input: 1.23456789012345678901234567890123456789 strtoxL consumes 40 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 40 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d fI[1] = #3fff0000 9e065214 62cfdb8e fI[0] == strtoxL Input: 1.23e306 strtoxL consumes 8 bytes and returns 17 with bits = #43f70000 e033b668 e30fa6d5 g_xLfmt(0) gives 9 bytes: "1.23e+306" strtoIxL returns 17, consuming 8 bytes. fI[0] = #43f70000 e033b668 e30fa6d5 fI[1] = #43f70000 e033b668 e30fa6d6 fI[0] == strtoxL Input: 1.23e-306 strtoxL consumes 9 bytes and returns 33 with bits = #3c060000 dd1dc2ed 1cb73f25 g_xLfmt(0) gives 9 bytes: "1.23e-306" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3c060000 dd1dc2ed 1cb73f24 fI[1] = #3c060000 dd1dc2ed 1cb73f25 fI[1] == strtoxL Input: 1.23e-320 strtoxL consumes 9 bytes and returns 33 with bits = #3bd80000 9b98c371 844c3f1a g_xLfmt(0) gives 9 bytes: "1.23e-320" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3bd80000 9b98c371 844c3f19 fI[1] = #3bd80000 9b98c371 844c3f1a fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 fI[1] = #3fbc0000 e857267b b3a984f3 fI[0] == strtoxL Input: 1.23456789e307 strtoxL consumes 14 bytes and returns 17 with bits = #43fb0000 8ca58a5e d766de75 g_xLfmt(0) gives 15 bytes: "1.23456789e+307" strtoIxL returns 17, consuming 14 bytes. fI[0] = #43fb0000 8ca58a5e d766de75 fI[1] = #43fb0000 8ca58a5e d766de76 fI[0] == strtoxL Input: 1.23456589e-307 strtoxL consumes 15 bytes and returns 17 with bits = #3c030000 b18cb5dc c22fd369 g_xLfmt(0) gives 15 bytes: "1.23456589e-307" strtoIxL returns 17, consuming 15 bytes. fI[0] = #3c030000 b18cb5dc c22fd369 fI[1] = #3c030000 b18cb5dc c22fd36a fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d fI[1] = #3fff0000 9e065214 62cfdb8e fI[0] == strtoxL Input: 1.234567890123456789e301 strtoxL consumes 24 bytes and returns 33 with bits = #43e70000 937a8baf ab20980c g_xLfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIxL returns 33, consuming 24 bytes. fI[0] = #43e70000 937a8baf ab20980b fI[1] = #43e70000 937a8baf ab20980c fI[1] == strtoxL Input: 1.234567890123456789e-301 strtoxL consumes 25 bytes and returns 33 with bits = #3c170000 a953271a 5d069ad9 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3c170000 a953271a 5d069ad8 fI[1] = #3c170000 a953271a 5d069ad9 fI[1] == strtoxL Input: 1.234567890123456789e-321 strtoxL consumes 25 bytes and returns 33 with bits = #3bd40000 f9e11b4c ea6dcce9 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3bd40000 f9e11b4c ea6dcce8 fI[1] = #3bd40000 f9e11b4c ea6dcce9 fI[1] == strtoxL Input: 1e23 strtoxL consumes 4 bytes and returns 1 with bits = #404b0000 a968163f a57b400 g_xLfmt(0) gives 5 bytes: "1e+23" strtoIxL returns 1, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1e310 strtoxL consumes 5 bytes and returns 33 with bits = #44040000 de81e40a 34bcf50 g_xLfmt(0) gives 6 bytes: "1e+310" strtoIxL returns 33, consuming 5 bytes. fI[0] = #44040000 de81e40a 34bcf4f fI[1] = #44040000 de81e40a 34bcf50 fI[1] == strtoxL Input: 9.0259718793241475e-277 strtoxL consumes 23 bytes and returns 33 with bits = #3c690000 ffffffff fffffcf7 g_xLfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIxL returns 33, consuming 23 bytes. fI[0] = #3c690000 ffffffff fffffcf6 fI[1] = #3c690000 ffffffff fffffcf7 fI[1] == strtoxL Input: 9.025971879324147880346310405869e-277 strtoxL consumes 37 bytes and returns 17 with bits = #3c6a0000 80000000 0 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 17, consuming 37 bytes. fI[0] = #3c6a0000 80000000 0 fI[1] = #3c6a0000 80000000 1 fI[0] == strtoxL Input: 9.025971879324147880346310405868e-277 strtoxL consumes 37 bytes and returns 33 with bits = #3c6a0000 80000000 0 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 33, consuming 37 bytes. fI[0] = #3c690000 ffffffff ffffffff fI[1] = #3c6a0000 80000000 0 fI[1] == strtoxL Input: 2.2250738585072014e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c010000 80000000 46 g_xLfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c010000 80000000 46 fI[1] = #3c010000 80000000 47 fI[0] == strtoxL Input: 2.2250738585072013e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c000000 ffffffff fffffd4f g_xLfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c000000 ffffffff fffffd4f fI[1] = #3c000000 ffffffff fffffd50 fI[0] == strtoxL Input: 3.2649476e14 strtoxL consumes 12 bytes and returns 1 with bits = #402f0000 9478fe18 6d000000 g_xLfmt(0) gives 13 bytes: "3.2649476e+14" strtoIxL returns 1, consuming 12 bytes. fI[0] == fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc fI[1] = #3fff0000 8ccccccc cccccccd fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd fI[1] = #bfff0000 8ccccccc cccccccc fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 fI[1] = #3fff0000 99999999 9999999a fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a fI[1] = #bfff0000 99999999 99999999 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 fI[1] = #3fff0000 a6666666 66666667 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 fI[1] = #bfff0000 a6666666 66666666 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 fI[1] = #3fff0000 b3333333 33333334 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 fI[1] = #bfff0000 b3333333 33333333 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc fI[1] = #3fff0000 cccccccc cccccccd fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd fI[1] = #bfff0000 cccccccc cccccccc fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 fI[1] = #3fff0000 d9999999 9999999a fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a fI[1] = #bfff0000 d9999999 99999999 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 fI[1] = #3fff0000 e6666666 66666667 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 fI[1] = #bfff0000 e6666666 66666666 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 fI[1] = #3fff0000 f3333333 33333334 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 fI[1] = #bfff0000 f3333333 33333333 fI[1] == strtoxL Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc fI[1] = #3fff0000 8ccccccc cccccccd fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd fI[1] = #bfff0000 8ccccccc cccccccc fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 fI[1] = #3fff0000 99999999 9999999a fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a fI[1] = #bfff0000 99999999 99999999 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 fI[1] = #3fff0000 a6666666 66666667 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 fI[1] = #bfff0000 a6666666 66666666 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 fI[1] = #3fff0000 b3333333 33333334 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 fI[1] = #bfff0000 b3333333 33333333 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc fI[1] = #3fff0000 cccccccc cccccccd fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd fI[1] = #bfff0000 cccccccc cccccccc fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 fI[1] = #3fff0000 d9999999 9999999a fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a fI[1] = #bfff0000 d9999999 99999999 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 fI[1] = #3fff0000 e6666666 66666667 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 fI[1] = #bfff0000 e6666666 66666666 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 fI[1] = #3fff0000 f3333333 33333334 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 fI[1] = #bfff0000 f3333333 33333333 fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc fI[1] = #3fff0000 8ccccccc cccccccd fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd fI[1] = #bfff0000 8ccccccc cccccccc fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 fI[1] = #3fff0000 99999999 9999999a fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a fI[1] = #bfff0000 99999999 99999999 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 a6666666 66666667 g_xLfmt(0) gives 21 bytes: "1.3000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 fI[1] = #3fff0000 a6666666 66666667 fI[1] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 fI[1] = #bfff0000 a6666666 66666666 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 b3333333 33333334 g_xLfmt(0) gives 21 bytes: "1.4000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 fI[1] = #3fff0000 b3333333 33333334 fI[1] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 fI[1] = #bfff0000 b3333333 33333333 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc fI[1] = #3fff0000 cccccccc cccccccd fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd fI[1] = #bfff0000 cccccccc cccccccc fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 fI[1] = #3fff0000 d9999999 9999999a fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a fI[1] = #bfff0000 d9999999 99999999 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 e6666666 66666667 g_xLfmt(0) gives 21 bytes: "1.8000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 fI[1] = #3fff0000 e6666666 66666667 fI[1] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 fI[1] = #bfff0000 e6666666 66666666 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 f3333333 33333334 g_xLfmt(0) gives 21 bytes: "1.9000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 fI[1] = #3fff0000 f3333333 33333334 fI[1] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 fI[1] = #bfff0000 f3333333 33333333 fI[1] == strtoxL Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc fI[1] = #3fff0000 8ccccccc cccccccd fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd fI[1] = #bfff0000 8ccccccc cccccccc fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 fI[1] = #3fff0000 99999999 9999999a fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a fI[1] = #bfff0000 99999999 99999999 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 fI[1] = #3fff0000 a6666666 66666667 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 a6666666 66666667 g_xLfmt(0) gives 22 bytes: "-1.3000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 fI[1] = #bfff0000 a6666666 66666666 fI[0] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 fI[1] = #3fff0000 b3333333 33333334 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 b3333333 33333334 g_xLfmt(0) gives 22 bytes: "-1.4000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 fI[1] = #bfff0000 b3333333 33333333 fI[0] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc fI[1] = #3fff0000 cccccccc cccccccd fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd fI[1] = #bfff0000 cccccccc cccccccc fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 fI[1] = #3fff0000 d9999999 9999999a fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a fI[1] = #bfff0000 d9999999 99999999 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 fI[1] = #3fff0000 e6666666 66666667 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 e6666666 66666667 g_xLfmt(0) gives 22 bytes: "-1.8000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 fI[1] = #bfff0000 e6666666 66666666 fI[0] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 fI[1] = #3fff0000 f3333333 33333334 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 f3333333 33333334 g_xLfmt(0) gives 22 bytes: "-1.9000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 fI[1] = #bfff0000 f3333333 33333333 fI[0] == strtoxL mlton-20210117+dfsg/runtime/gdtoa/test/xL.ou1000066400000000000000000001110651416264345000206030ustar00rootroot00000000000000***** This file is not right. It needs to be generated on a ***** system with a Motorla 68881 or the equivalent. Input: 1.23 strtoxL consumes 4 bytes and returns 33 with bits = #3fff0000 9d70a3d7 a3d70a4 printf("%.21Lg") gives 7.73283722915781506499e-4933 g_xLfmt(0) gives 4 bytes: "1.23" strtoIxL returns 33, consuming 4 bytes. fI[0] = #3fff0000 9d70a3d7 a3d70a3 = 7.73283722915781506134e-4933 fI[1] = #3fff0000 9d70a3d7 a3d70a4 = 7.73283722915781506499e-4933 fI[1] == strtoxL Input: 1.23e+20 strtoxL consumes 8 bytes and returns 1 with bits = #40410000 d55ef90a 2da18000 printf("%.21Lg") gives 2.24239113715721119512e-4932 g_xLfmt(0) gives 8 bytes: "1.23e+20" strtoIxL returns 1, consuming 8 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 printf("%.21Lg") gives 2.74065070995958800375e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 = 2.74065070995958800375e-4932 fI[1] = #3fbc0000 e857267b b3a984f3 = 2.74065070995958800411e-4932 fI[0] == strtoxL Input: 1.23456789 strtoxL consumes 10 bytes and returns 33 with bits = #3fff0000 9e065214 1ef0dbf6 printf("%.21Lg") gives 7.88641440242171807354e-4933 g_xLfmt(0) gives 10 bytes: "1.23456789" strtoIxL returns 33, consuming 10 bytes. fI[0] = #3fff0000 9e065214 1ef0dbf5 = 7.8864144024217180699e-4933 fI[1] = #3fff0000 9e065214 1ef0dbf6 = 7.88641440242171807354e-4933 fI[1] == strtoxL Input: 1.23456589e+20 strtoxL consumes 14 bytes and returns 1 with bits = #40410000 d629bd33 5ccba00 printf("%.21Lg") gives 2.26319561227049478508e-4932 g_xLfmt(0) gives 14 bytes: "1.23456589e+20" strtoIxL returns 1, consuming 14 bytes. fI[0] == fI[1] == strtoxL Input: 1.23e+30 strtoxL consumes 8 bytes and returns 17 with bits = #40620000 f8658274 7dbc824a printf("%.21Lg") gives 3.16238691003557160385e-4932 g_xLfmt(0) gives 8 bytes: "1.23e+30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #40620000 f8658274 7dbc824a = 3.16238691003557160385e-4932 fI[1] = #40620000 f8658274 7dbc824b = 3.16238691003557160421e-4932 fI[0] == strtoxL Input: 1.23e-30 strtoxL consumes 8 bytes and returns 17 with bits = #3f9b0000 c794337a 808554eb printf("%.21Lg") gives 1.88012249978407873966e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-30" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3f9b0000 c794337a 808554eb = 1.88012249978407873966e-4932 fI[1] = #3f9b0000 c794337a 808554ec = 1.88012249978407874003e-4932 fI[0] == strtoxL Input: 1.23456789e-20 strtoxL consumes 14 bytes and returns 17 with bits = #3fbc0000 e9340a38 f3d6d352 printf("%.21Lg") gives 2.76331470044569174626e-4932 g_xLfmt(0) gives 14 bytes: "1.23456789e-20" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3fbc0000 e9340a38 f3d6d352 = 2.76331470044569174626e-4932 fI[1] = #3fbc0000 e9340a38 f3d6d353 = 2.76331470044569174663e-4932 fI[0] == strtoxL Input: 1.23456789e-30 strtoxL consumes 14 bytes and returns 17 with bits = #3f9b0000 c851f19d decca8fc printf("%.21Lg") gives 1.89959071937101288293e-4932 g_xLfmt(0) gives 14 bytes: "1.23456789e-30" strtoIxL returns 17, consuming 14 bytes. fI[0] = #3f9b0000 c851f19d decca8fc = 1.89959071937101288293e-4932 fI[1] = #3f9b0000 c851f19d decca8fd = 1.89959071937101288329e-4932 fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.23456789012345678901234567890123456789 strtoxL consumes 40 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 40 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.23e306 strtoxL consumes 8 bytes and returns 17 with bits = #43f70000 e033b668 e30fa6d5 printf("%.21Lg") gives 2.52688323155200052759e-4932 g_xLfmt(0) gives 9 bytes: "1.23e+306" strtoIxL returns 17, consuming 8 bytes. fI[0] = #43f70000 e033b668 e30fa6d5 = 2.52688323155200052759e-4932 fI[1] = #43f70000 e033b668 e30fa6d6 = 2.52688323155200052796e-4932 fI[0] == strtoxL Input: 1.23e-306 strtoxL consumes 9 bytes and returns 33 with bits = #3c060000 dd1dc2ed 1cb73f25 printf("%.21Lg") gives 2.44583168427704605801e-4932 g_xLfmt(0) gives 9 bytes: "1.23e-306" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3c060000 dd1dc2ed 1cb73f24 = 2.44583168427704605765e-4932 fI[1] = #3c060000 dd1dc2ed 1cb73f25 = 2.44583168427704605801e-4932 fI[1] == strtoxL Input: 1.23e-320 strtoxL consumes 9 bytes and returns 33 with bits = #3bd80000 9b98c371 844c3f1a printf("%.21Lg") gives 7.24867657578821329238e-4933 g_xLfmt(0) gives 9 bytes: "1.23e-320" strtoIxL returns 33, consuming 9 bytes. fI[0] = #3bd80000 9b98c371 844c3f19 = 7.24867657578821328874e-4933 fI[1] = #3bd80000 9b98c371 844c3f1a = 7.24867657578821329238e-4933 fI[1] == strtoxL Input: 1.23e-20 strtoxL consumes 8 bytes and returns 17 with bits = #3fbc0000 e857267b b3a984f2 printf("%.21Lg") gives 2.74065070995958800375e-4932 g_xLfmt(0) gives 8 bytes: "1.23e-20" strtoIxL returns 17, consuming 8 bytes. fI[0] = #3fbc0000 e857267b b3a984f2 = 2.74065070995958800375e-4932 fI[1] = #3fbc0000 e857267b b3a984f3 = 2.74065070995958800411e-4932 fI[0] == strtoxL Input: 1.23456789e307 strtoxL consumes 14 bytes and returns 17 with bits = #43fb0000 8ca58a5e d766de75 printf("%.21Lg") gives 3.32182163192682931854e-4933 g_xLfmt(0) gives 15 bytes: "1.23456789e+307" strtoIxL returns 17, consuming 14 bytes. fI[0] = #43fb0000 8ca58a5e d766de75 = 3.32182163192682931854e-4933 fI[1] = #43fb0000 8ca58a5e d766de76 = 3.32182163192682932219e-4933 fI[0] == strtoxL Input: 1.23456589e-307 strtoxL consumes 15 bytes and returns 17 with bits = #3c030000 b18cb5dc c22fd369 printf("%.21Lg") gives 1.30149245314004923345e-4932 g_xLfmt(0) gives 15 bytes: "1.23456589e-307" strtoIxL returns 17, consuming 15 bytes. fI[0] = #3c030000 b18cb5dc c22fd369 = 1.30149245314004923345e-4932 fI[1] = #3c030000 b18cb5dc c22fd36a = 1.30149245314004923382e-4932 fI[0] == strtoxL Input: 1.234567890123456789 strtoxL consumes 20 bytes and returns 17 with bits = #3fff0000 9e065214 62cfdb8d printf("%.21Lg") gives 7.88641440657246265535e-4933 g_xLfmt(0) gives 20 bytes: "1.234567890123456789" strtoIxL returns 17, consuming 20 bytes. fI[0] = #3fff0000 9e065214 62cfdb8d = 7.88641440657246265535e-4933 fI[1] = #3fff0000 9e065214 62cfdb8e = 7.886414406572462659e-4933 fI[0] == strtoxL Input: 1.234567890123456789e301 strtoxL consumes 24 bytes and returns 33 with bits = #43e70000 937a8baf ab20980c printf("%.21Lg") gives 5.11635766619117643114e-4933 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e+301" strtoIxL returns 33, consuming 24 bytes. fI[0] = #43e70000 937a8baf ab20980b = 5.1163576661911764275e-4933 fI[1] = #43e70000 937a8baf ab20980c = 5.11635766619117643114e-4933 fI[1] == strtoxL Input: 1.234567890123456789e-301 strtoxL consumes 25 bytes and returns 33 with bits = #3c170000 a953271a 5d069ad9 printf("%.21Lg") gives 1.08545540462853463561e-4932 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-301" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3c170000 a953271a 5d069ad8 = 1.08545540462853463524e-4932 fI[1] = #3c170000 a953271a 5d069ad9 = 1.08545540462853463561e-4932 fI[1] == strtoxL Input: 1.234567890123456789e-321 strtoxL consumes 25 bytes and returns 33 with bits = #3bd40000 f9e11b4c ea6dcce9 printf("%.21Lg") gives 3.20133479952876185942e-4932 g_xLfmt(0) gives 25 bytes: "1.234567890123456789e-321" strtoIxL returns 33, consuming 25 bytes. fI[0] = #3bd40000 f9e11b4c ea6dcce8 = 3.20133479952876185905e-4932 fI[1] = #3bd40000 f9e11b4c ea6dcce9 = 3.20133479952876185942e-4932 fI[1] == strtoxL Input: 1e23 strtoxL consumes 4 bytes and returns 1 with bits = #404b0000 a968163f a57b400 printf("%.21Lg") gives 1.08760331670538037378e-4932 g_xLfmt(0) gives 5 bytes: "1e+23" strtoIxL returns 1, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1e310 strtoxL consumes 5 bytes and returns 33 with bits = #44040000 de81e40a 34bcf50 printf("%.21Lg") gives 2.48237171106260601618e-4932 g_xLfmt(0) gives 6 bytes: "1e+310" strtoIxL returns 33, consuming 5 bytes. fI[0] = #44040000 de81e40a 34bcf4f = 2.48237171106260601582e-4932 fI[1] = #44040000 de81e40a 34bcf50 = 2.48237171106260601618e-4932 fI[1] == strtoxL Input: 9.0259718793241475e-277 strtoxL consumes 23 bytes and returns 33 with bits = #3c690000 ffffffff fffffcf7 printf("%.21Lg") gives 3.36210314311209322303e-4932 g_xLfmt(0) gives 23 bytes: "9.0259718793241475e-277" strtoIxL returns 33, consuming 23 bytes. fI[0] = #3c690000 ffffffff fffffcf6 = 3.36210314311209322267e-4932 fI[1] = #3c690000 ffffffff fffffcf7 = 3.36210314311209322303e-4932 fI[1] == strtoxL Input: 9.025971879324147880346310405869e-277 strtoxL consumes 37 bytes and returns 17 with bits = #3c6a0000 80000000 0 printf("%.21Lg") gives 3.36210314311209350626e-4932 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 17, consuming 37 bytes. fI[0] = #3c6a0000 80000000 0 = 3.36210314311209350626e-4932 fI[1] = #3c6a0000 80000000 1 = 3.64519953188247460253e-4951 fI[0] == strtoxL Input: 9.025971879324147880346310405868e-277 strtoxL consumes 37 bytes and returns 33 with bits = #3c6a0000 80000000 0 printf("%.21Lg") gives 3.36210314311209350626e-4932 g_xLfmt(0) gives 26 bytes: "9.0259718793241478803e-277" strtoIxL returns 33, consuming 37 bytes. fI[0] = #3c690000 ffffffff ffffffff = 3.3621031431120935059e-4932 fI[1] = #3c6a0000 80000000 0 = 3.36210314311209350626e-4932 fI[1] == strtoxL Input: 2.2250738585072014e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c010000 80000000 46 printf("%.21Lg") gives 2.55163967231773222177e-4949 g_xLfmt(0) gives 23 bytes: "2.2250738585072014e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c010000 80000000 46 = 2.55163967231773222177e-4949 fI[1] = #3c010000 80000000 47 = 2.5880916676365569678e-4949 fI[0] == strtoxL Input: 2.2250738585072013e-308 strtoxL consumes 23 bytes and returns 17 with bits = #3c000000 ffffffff fffffd4f printf("%.21Lg") gives 3.36210314311209325511e-4932 g_xLfmt(0) gives 23 bytes: "2.2250738585072013e-308" strtoIxL returns 17, consuming 23 bytes. fI[0] = #3c000000 ffffffff fffffd4f = 3.36210314311209325511e-4932 fI[1] = #3c000000 ffffffff fffffd50 = 3.36210314311209325547e-4932 fI[0] == strtoxL Input: 3.2649476e14 strtoxL consumes 12 bytes and returns 1 with bits = #402f0000 9478fe18 6d000000 printf("%.21Lg") gives 5.3774284544988676575e-4933 g_xLfmt(0) gives 13 bytes: "3.2649476e+14" strtoIxL returns 1, consuming 12 bytes. fI[0] == fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 0 (toward zero) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 0 (toward zero) to 1 (nearest) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 1 (nearest) to 2 (toward +Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 3 bytes: "1.1" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 22 bytes: "-1.0999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 3 bytes: "1.2" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 22 bytes: "-1.1999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 a6666666 66666667 printf("%.21Lg") gives 1.0086309429336280521e-4932 g_xLfmt(0) gives 21 bytes: "1.3000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 4 bytes: "-1.3" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 b3333333 33333334 printf("%.21Lg") gives 1.3448412572448374028e-4932 g_xLfmt(0) gives 21 bytes: "1.4000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 4 bytes: "-1.4" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 3 bytes: "1.6" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 22 bytes: "-1.5999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 3 bytes: "1.7" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 22 bytes: "-1.6999999999999999999" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 e6666666 66666667 printf("%.21Lg") gives 2.68968251448967480523e-4932 g_xLfmt(0) gives 21 bytes: "1.8000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 4 bytes: "-1.8" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 33 with bits = #3fff0000 f3333333 33333334 printf("%.21Lg") gives 3.02589282880088415593e-4932 g_xLfmt(0) gives 21 bytes: "1.9000000000000000001" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 25 with bits = #bfff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 4 bytes: "-1.9" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] == strtoxL Rounding mode for strtor... changed from 2 (toward +Infinity) to 3 (toward -Infinity) Input: 1.1 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 8ccccccc cccccccc printf("%.21Lg") gives 3.36210314311209350335e-4933 g_xLfmt(0) gives 21 bytes: "1.0999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[1] = #3fff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[0] == strtoxL Input: -1.1 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 8ccccccc cccccccd printf("%.21Lg") gives 3.36210314311209350699e-4933 g_xLfmt(0) gives 4 bytes: "-1.1" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 8ccccccc cccccccd = 3.36210314311209350699e-4933 fI[1] = #bfff0000 8ccccccc cccccccc = 3.36210314311209350335e-4933 fI[0] == strtoxL Input: 1.2 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 99999999 99999999 printf("%.21Lg") gives 6.72420628622418701034e-4933 g_xLfmt(0) gives 21 bytes: "1.1999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[1] = #3fff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[0] == strtoxL Input: -1.2 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 99999999 9999999a printf("%.21Lg") gives 6.72420628622418701398e-4933 g_xLfmt(0) gives 4 bytes: "-1.2" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 99999999 9999999a = 6.72420628622418701398e-4933 fI[1] = #bfff0000 99999999 99999999 = 6.72420628622418701034e-4933 fI[0] == strtoxL Input: 1.3 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 a6666666 66666666 printf("%.21Lg") gives 1.00863094293362805173e-4932 g_xLfmt(0) gives 3 bytes: "1.3" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[1] = #3fff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[0] == strtoxL Input: -1.3 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 a6666666 66666667 printf("%.21Lg") gives 1.0086309429336280521e-4932 g_xLfmt(0) gives 22 bytes: "-1.3000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 a6666666 66666667 = 1.0086309429336280521e-4932 fI[1] = #bfff0000 a6666666 66666666 = 1.00863094293362805173e-4932 fI[0] == strtoxL Input: 1.4 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 b3333333 33333333 printf("%.21Lg") gives 1.34484125724483740243e-4932 g_xLfmt(0) gives 3 bytes: "1.4" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[1] = #3fff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[0] == strtoxL Input: -1.4 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 b3333333 33333334 printf("%.21Lg") gives 1.3448412572448374028e-4932 g_xLfmt(0) gives 22 bytes: "-1.4000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 b3333333 33333334 = 1.3448412572448374028e-4932 fI[1] = #bfff0000 b3333333 33333333 = 1.34484125724483740243e-4932 fI[0] == strtoxL Input: 1.5 strtoxL consumes 3 bytes and returns 1 with bits = #3fff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 3 bytes: "1.5" strtoIxL returns 1, consuming 3 bytes. fI[0] == fI[1] == strtoxL Input: -1.5 strtoxL consumes 4 bytes and returns 9 with bits = #bfff0000 c0000000 0 printf("%.21Lg") gives 1.68105157155604675313e-4932 g_xLfmt(0) gives 4 bytes: "-1.5" strtoIxL returns 9, consuming 4 bytes. fI[0] == fI[1] == strtoxL Input: 1.6 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 cccccccc cccccccc printf("%.21Lg") gives 2.01726188586725610347e-4932 g_xLfmt(0) gives 21 bytes: "1.5999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[1] = #3fff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[0] == strtoxL Input: -1.6 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 cccccccc cccccccd printf("%.21Lg") gives 2.01726188586725610383e-4932 g_xLfmt(0) gives 4 bytes: "-1.6" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 cccccccc cccccccd = 2.01726188586725610383e-4932 fI[1] = #bfff0000 cccccccc cccccccc = 2.01726188586725610347e-4932 fI[0] == strtoxL Input: 1.7 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 d9999999 99999999 printf("%.21Lg") gives 2.35347220017846545417e-4932 g_xLfmt(0) gives 21 bytes: "1.6999999999999999999" strtoIxL returns 33, consuming 3 bytes. fI[0] = #3fff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[1] = #3fff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[0] == strtoxL Input: -1.7 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 d9999999 9999999a printf("%.21Lg") gives 2.35347220017846545453e-4932 g_xLfmt(0) gives 4 bytes: "-1.7" strtoIxL returns 41, consuming 4 bytes. fI[0] = #bfff0000 d9999999 9999999a = 2.35347220017846545453e-4932 fI[1] = #bfff0000 d9999999 99999999 = 2.35347220017846545417e-4932 fI[0] == strtoxL Input: 1.8 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 e6666666 66666666 printf("%.21Lg") gives 2.68968251448967480486e-4932 g_xLfmt(0) gives 3 bytes: "1.8" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[1] = #3fff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[0] == strtoxL Input: -1.8 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 e6666666 66666667 printf("%.21Lg") gives 2.68968251448967480523e-4932 g_xLfmt(0) gives 22 bytes: "-1.8000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 e6666666 66666667 = 2.68968251448967480523e-4932 fI[1] = #bfff0000 e6666666 66666666 = 2.68968251448967480486e-4932 fI[0] == strtoxL Input: 1.9 strtoxL consumes 3 bytes and returns 17 with bits = #3fff0000 f3333333 33333333 printf("%.21Lg") gives 3.02589282880088415556e-4932 g_xLfmt(0) gives 3 bytes: "1.9" strtoIxL returns 17, consuming 3 bytes. fI[0] = #3fff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[1] = #3fff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[0] == strtoxL Input: -1.9 strtoxL consumes 4 bytes and returns 41 with bits = #bfff0000 f3333333 33333334 printf("%.21Lg") gives 3.02589282880088415593e-4932 g_xLfmt(0) gives 22 bytes: "-1.9000000000000000001" strtoIxL returns 25, consuming 4 bytes. fI[0] = #bfff0000 f3333333 33333334 = 3.02589282880088415593e-4932 fI[1] = #bfff0000 f3333333 33333333 = 3.02589282880088415556e-4932 fI[0] == strtoxL mlton-20210117+dfsg/runtime/gdtoa/test/xLtest.c000066400000000000000000000126641416264345000212260ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_xLfmt, strtoIxL, strtopxL, and strtorxL. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex0 hex1 hex2 * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex0 is a string of <= 8 Hex digits for the most significant * word of the number, hex1 is a similar string for the next * word, etc., and ndig is a parameters to g_xLfmt. */ #include "gdtoa.h" #include #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[2048], obuf1[2048]; #define U (unsigned long) #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #endif #ifdef IEEE_8087 #define _0 2 #define _1 1 #define _2 0 #endif int main(Void) { char *s, *s1, *se, *se1; int dItry, i, ndig = 0, nik, nike, r = 1; union { long double d; ULong bits[3]; } u, v[2]; while((s = fgets(ibuf, sizeof(ibuf), stdin))) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': /* sscanf(s+1, "%lx %lx %lx", &u.bits[_0], */ /* &u.bits[_1], &u.bits[_2]); */ u.bits[_0] = (ULong)strtoul(s1 = s+1, &se, 16); if (se > s1) { u.bits[_1] = (ULong)strtoul(s1=se, &se, 16); if (se > s1) u.bits[_2] = (ULong)strtoul(s1=se, &se, 16); } printf("\nInput: %s", ibuf); printf(" --> f = #%lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2]); i = 0; goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorxL(ibuf, &se, r, u.bits); if (r == 1 && (i != strtopxL(ibuf, &se1, v[0].bits) || se1 != se || memcmp(u.bits, v[0].bits, 12))) printf("***strtoxL and strtorxL disagree!!\n:"); printf("\nstrtoxL consumes %d bytes and returns %d\n", (int)(se-ibuf), i); printf("with bits = #%lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2]); if (sizeof(long double) == 12) printf("printf(\"%%.21Lg\") gives %.21Lg\n", u.d); fmt_test: se = g_xLfmt(obuf, u.bits, ndig, sizeof(obuf)); printf("g_xLfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_xLfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_xLfmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (!dItry) continue; printf("strtoIxL returns %d,", strtoIxL(ibuf, &se, v[0].bits, v[1].bits)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (!memcmp(v[0].bits, v[1].bits, 12)) { if (!memcmp(u.bits, v[0].bits, 12)) printf("fI[0] == fI[1] == strtoxL\n"); else { printf("fI[0] == fI[1] = #%lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); } } else { printf("fI[0] = #%lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); printf("fI[1] = #%lx %lx %lx\n", U v[1].bits[_0], U v[1].bits[_1], U v[1].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[1].d); if (!memcmp(v[0].bits, u.bits, 12)) printf("fI[0] == strtoxL\n"); else if (!memcmp(v[1].bits, u.bits, 12)) printf("fI[1] == strtoxL\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_xLfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_xLfmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_xLfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_xLfmt_p(...,%d): \"%s\"\n", nik, obuf1); } } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/xQtest.c000066400000000000000000000035701416264345000212270ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 2002 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #include int main(void) { union { long double d; unsigned int bits[4]; } u, w; switch(sizeof(long double)) { case 16: w.bits[0] = w.bits[3] = 0; w.d = 1.; u.d = 3.; w.d = w.d / u.d; if (w.bits[0] && w.bits[3]) printf("cp x.ou0 x.out; cp xL.ou0 xL.out;" " cp Q.ou1 Q.out; cp pftestQ.out pftest.out\n"); else printf("cp x.ou0 x.out; cp xL.ou0 xL.out;" " cp Q.ou0 Q.out; cp pftestx.out pftest.out\n"); break; case 10: case 12: printf("cp x.ou1 x.out; cp xL.ou1 xL.out; cp Q.ou0 Q.out;" " cp pftestx.out pftest.out\n"); break; default: printf("cp x.ou0 x.out; cp xL.ou0 xL.out; cp Q.ou0 Q.out;" " cp pftestx.out pftest.out\n"); } return 0; } mlton-20210117+dfsg/runtime/gdtoa/test/xsum0.out000066400000000000000000000016341416264345000213770ustar00rootroot00000000000000README efba0d5d 3412 Q.ou0 e5903210 28961 Q.ou1 c0a0cec 39848 Qtest.c 39c7381 5823 d.out fbd2cc70 28614 dI.out 12d50f0d 4517 dIsi.out 1ecb6a38 4498 dItest.c 375fe4e 2372 dd.out feae6ba5 41333 ddsi.out 1dba4cfd 10661 ddtest.c f664a218 5631 dt.c a240b56 7074 dtest.c fa7324f5 4738 dtst.out 71e63d3 24237 f.out ea035e24 22461 ftest.c fe6ae5f0 4736 getround.c ee95ed1 2502 makefile f714a641 5634 pfLqtestnos ffb9723 99 pftest.c ea314d7f 3452 pftestQ.out 198434fd 830 pftestx.out 1ccea5dd 788 pftestLq.out 1691dbfc 845 pftestnos ecbc9be6 101 rtestnos f94bcdf6 336 strtoIdSI.c 7bfb88b 49 strtoIddSI.c 72e8852 50 strtodISI.c ed08b740 49 strtodt.c f1aa53af 3374 strtopddSI.c 13e7138d 50 strtorddSI.c f7e4b1d5 50 testnos fb521644 498 testnos1 7e16229 294 testnos3 f5ae7ef3 14403 x.ou0 1426698f 25576 x.ou1 e196c6c1 34824 xL.ou0 f85f5eb6 26576 xL.ou1 1550d69c 37429 xLtest.c f1964154 5556 xQtest.c efbe29be 1912 xtest.c 1b76bf93 5541 mlton-20210117+dfsg/runtime/gdtoa/test/xtest.c000066400000000000000000000126451416264345000211110ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998-2001 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* Test program for g_xfmt, strtoIx, strtopx, and strtorx. * * Inputs (on stdin): * r rounding_mode * n ndig * number * #hex0 hex1 hex2 hex3 hex4 * * rounding_mode values: * 0 = toward zero * 1 = nearest * 2 = toward +Infinity * 3 = toward -Infinity * * where number is a decimal floating-point number, * hex0 is a string of <= 4 Hex digits for the most significant * half-word of the number, hex1 is a similar string for the next * half-word, etc., and ndig is a parameters to g_xfmt. */ #include "gdtoa.h" #include #include #include extern int getround ANSI((int,char*)); static char ibuf[2048], obuf[2048], obuf1[2048]; #undef _0 #undef _1 /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ #ifdef IEEE_MC68k #define _0 0 #define _1 1 #define _2 2 #define _3 3 #define _4 4 #endif #ifdef IEEE_8087 #define _0 4 #define _1 3 #define _2 2 #define _3 1 #define _4 0 #endif int main(Void) { char *s, *se, *se1; int i, dItry, ndig = 0, nik, nike, r = 1; union { long double d; UShort bits[5]; } u, v[2]; while((s = fgets(ibuf, sizeof(ibuf), stdin))) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': sscanf(s+1, "%hx %hx %hx %hx %hx", &u.bits[_0], &u.bits[_1], &u.bits[_2], &u.bits[_3], &u.bits[_4]); printf("\nInput: %s", ibuf); printf(" --> f = #%x %x %x %x %x\n", u.bits[_0], u.bits[_1], u.bits[_2], u.bits[_3], u.bits[_4]); i = 0; goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorx(ibuf, &se, r, u.bits); if (r == 1 && (i != strtopx(ibuf, &se1, v[0].bits) || se1 != se || memcmp(u.bits, v[0].bits, 10))) printf("***strtox and strtorx disagree!!\n:"); printf("\nstrtox consumes %d bytes and returns %d\n", (int)(se-ibuf), i); printf("with bits = #%x %x %x %x %x\n", u.bits[_0], u.bits[_1], u.bits[_2], u.bits[_3], u.bits[_4]); if (sizeof(long double) == 12) printf("printf(\"%%.21Lg\") gives %.21Lg\n", u.d); fmt_test: se = g_xfmt(obuf, u.bits, ndig, sizeof(obuf)); printf("g_xfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : ""); se1 = g_xfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), 0); if (se1 - obuf1 != se - obuf || strcmp(obuf, obuf1)) printf("Botch: g_xfmt_p gives \"%s\" rather than \"%s\"\n", obuf1, obuf); if (!dItry) continue; printf("strtoIx returns %d,", strtoIx(ibuf, &se, v[0].bits, v[1].bits)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (!memcmp(v[0].bits, v[1].bits, 10)) { if (!memcmp(u.bits, v[0].bits, 10)) printf("fI[0] == fI[1] == strtox\n"); else { printf("fI[0] == fI[1] = #%x %x %x %x %x\n", v[0].bits[_0], v[0].bits[_1], v[0].bits[_2], v[0].bits[_3], v[0].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); } } else { printf("fI[0] = #%x %x %x %x %x\n", v[0].bits[_0], v[0].bits[_1], v[0].bits[_2], v[0].bits[_3], v[0].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); printf("fI[1] = #%x %x %x %x %x\n", v[1].bits[_0], v[1].bits[_1], v[1].bits[_2], v[1].bits[_3], v[1].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[1].d); if (!memcmp(v[0].bits, u.bits, 10)) printf("fI[0] == strtox\n"); else if (!memcmp(v[1].bits, u.bits, 10)) printf("fI[1] == strtox\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); switch(i & STRTOG_Retmask) { case STRTOG_Infinite: for(nik = 0; nik < 6; ++nik) { se1 = g_xfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_xfmt_p(...,%d): \"%s\"\n", nik, obuf1); } break; case STRTOG_NaN: case STRTOG_NaNbits: for(i = 0; i < 3; ++i) for(nik = 6*i, nike = nik + 3; nik < nike; ++nik) { se1 = g_xfmt_p(obuf1, u.bits, ndig, sizeof(obuf1), nik); printf("g_xfmt_p(...,%d): \"%s\"\n", nik, obuf1); } } } return 0; } mlton-20210117+dfsg/runtime/gdtoa/ulp.c000066400000000000000000000035201416264345000175530ustar00rootroot00000000000000/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998, 1999 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ #include "gdtoa/gdtoaimp.h" double ulp #ifdef KR_headers (x) U *x; #else (U *x) #endif { Long L; U a; L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; #ifndef Sudden_Underflow if (L > 0) { #endif #ifdef IBM L |= Exp_msk1 >> 4; #endif word0(&a) = L; word1(&a) = 0; #ifndef Sudden_Underflow } else { L = -L >> Exp_shift; if (L < Exp_shift) { word0(&a) = 0x80000 >> L; word1(&a) = 0; } else { word0(&a) = 0; L -= Exp_shift; word1(&a) = L >= 31 ? 1 : 1 << (31 - L); } } #endif return dval(&a); } mlton-20210117+dfsg/runtime/gdtoa/xsum0.out000066400000000000000000000025211416264345000204140ustar00rootroot00000000000000README fbd27a99 17749 arithchk.c 4bb1e54 4064 dmisc.c e0d5f990 4773 dtoa.c f59614cc 18235 g_Qfmt.c ce0dd69 2945 g_Qfmt_p.c fb5c0391 3352 g__fmt.c 1ce54774 4638 g_ddfmt.c cb78a82 4286 g_ddfmt_p.c e8060288 4890 g_dfmt.c ebdfd6b1 2648 g_dfmt_p.c 32b3862 3061 g_ffmt.c f037fcc2 2529 g_ffmt_p.c 7edb123 2844 g_xLfmt.c eee688e 2792 g_xLfmt_p.c e4f82595 3145 g_xfmt.c 7a908f5 2896 g_xfmt_p.c 1907a7a5 3349 gdtoa.c 15f30219 17420 gdtoa.h eaadc6a8 5359 gdtoa_fltrnds.h 1aaf5112 421 gdtoaimp.h 131b5d0d 21889 gethex.c e16371ae 7360 gmisc.c 1859d016 2084 hd_init.c f561fe9c 2525 hexnan.c e337dab 3636 makefile 1d70a257 3551 misc.c 1d181bfd 16141 printf.c 15c97ab 158 printf.c0 f8fda84b 29819 qnan.c f8e9e8cf 3547 smisc.c 1d9fbad 3727 stdio1.h b6acbbe 3058 strtoIQ.c f3272d6f 2013 strtoId.c fabd9105 2005 strtoIdd.c 11248808 2193 strtoIf.c 16750d29 1949 strtoIg.c a0bcf2 3720 strtoIx.c e7af77b4 2034 strtoIxL.c a83e84a 2005 strtod.c 6a63adb 23026 strtodI.c 1e8708d3 4018 strtodg.c 189daf00 21924 strtodnrp.c 1489d0a1 2552 strtof.c efc8e192 2200 strtopQ.c e8127161 2729 strtopd.c e17050bd 1765 strtopdd.c e7851577 4668 strtopf.c e8c661a1 2169 strtopx.c f4cd73b2 2811 strtopxL.c 1fe9ea0f 2547 strtorQ.c 125fffcb 2968 strtord.c f943330 2558 strtordd.c 9cf5b6b 5210 strtorf.c 1d26a04f 2459 strtorx.c 4055fd4 3058 strtorxL.c fa548382 2794 sum.c 2bcf893 2518 ulp.c edb56c0b 1866 mlton-20210117+dfsg/runtime/gen/000077500000000000000000000000001416264345000162625ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/gen/.gitignore000066400000000000000000000002151416264345000202500ustar00rootroot00000000000000/c-types.h /c-types.sml /constants /gen-basis-ffi /gen-basis-ffi.exe /gen-constants /gen-constants.exe /gen-types /gen-types.exe /ml-types.h mlton-20210117+dfsg/runtime/gen/basis-ffi.def000066400000000000000000001660351416264345000206200ustar00rootroot00000000000000CommandLine.argc = _symbol : C_Int.t CommandLine.argv = _symbol : C_StringArray.t CommandLine.commandName = _symbol : C_String.t Cygwin.toFullWindowsPath = _import : NullString8.t -> C_String.t Date.Tm.getHour = _import : unit -> C_Int.t Date.Tm.getIsDst = _import : unit -> C_Int.t Date.Tm.getMDay = _import : unit -> C_Int.t Date.Tm.getMin = _import : unit -> C_Int.t Date.Tm.getMon = _import : unit -> C_Int.t Date.Tm.getSec = _import : unit -> C_Int.t Date.Tm.getWDay = _import : unit -> C_Int.t Date.Tm.getYDay = _import : unit -> C_Int.t Date.Tm.getYear = _import : unit -> C_Int.t Date.Tm.setHour = _import : C_Int.t -> unit Date.Tm.setIsDst = _import : C_Int.t -> unit Date.Tm.setMDay = _import : C_Int.t -> unit Date.Tm.setMin = _import : C_Int.t -> unit Date.Tm.setMon = _import : C_Int.t -> unit Date.Tm.setSec = _import : C_Int.t -> unit Date.Tm.setWDay = _import : C_Int.t -> unit Date.Tm.setYDay = _import : C_Int.t -> unit Date.Tm.setYear = _import : C_Int.t -> unit Date.gmTime = _import : C_Time.t ref -> C_Int.t C_Errno.t Date.localOffset = _import : unit -> C_Double.t Date.localTime = _import : C_Time.t ref -> C_Int.t C_Errno.t Date.mkTime = _import : unit -> C_Time.t C_Errno.t Date.strfTime = _import : Char8.t array * C_Size.t * NullString8.t -> C_Size.t IEEEReal.RoundingMode.FE_DOWNWARD = _const : C_Int.t IEEEReal.RoundingMode.FE_NOSUPPORT = _const : C_Int.t IEEEReal.RoundingMode.FE_TONEAREST = _const : C_Int.t IEEEReal.RoundingMode.FE_TOWARDZERO = _const : C_Int.t IEEEReal.RoundingMode.FE_UPWARD = _const : C_Int.t IEEEReal.getRoundingMode = _import : unit -> C_Int.t IEEEReal.setRoundingMode = _import : C_Int.t -> C_Int.t MLton.bug = _import __attribute__((noreturn)) : String8.t -> unit MLton.Itimer.PROF = _const : C_Int.t MLton.Itimer.REAL = _const : C_Int.t MLton.Itimer.VIRTUAL = _const : C_Int.t MLton.Itimer.set = _import : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> C_Int.t C_Errno.t MLton.Process.spawne = _import : NullString8.t * NullString8.t array * NullString8.t array -> C_PId.t C_Errno.t MLton.Process.spawnp = _import : NullString8.t * NullString8.t array -> C_PId.t C_Errno.t MLton.Rlimit.AS = _const : C_Int.t MLton.Rlimit.CORE = _const : C_Int.t MLton.Rlimit.CPU = _const : C_Int.t MLton.Rlimit.DATA = _const : C_Int.t MLton.Rlimit.FSIZE = _const : C_Int.t MLton.Rlimit.INFINITY = _const : C_RLim.t MLton.Rlimit.MEMLOCK = _const : C_Int.t MLton.Rlimit.NOFILE = _const : C_Int.t MLton.Rlimit.NPROC = _const : C_Int.t MLton.Rlimit.RSS = _const : C_Int.t MLton.Rlimit.STACK = _const : C_Int.t MLton.Rlimit.get = _import : C_Int.t -> C_Int.t C_Errno.t MLton.Rlimit.getHard = _import : unit -> C_RLim.t MLton.Rlimit.getSoft = _import : unit -> C_RLim.t MLton.Rlimit.set = _import : C_Int.t * C_RLim.t * C_RLim.t -> C_Int.t C_Errno.t MLton.Rusage.children_stime_sec = _import : unit -> C_Time.t MLton.Rusage.children_stime_usec = _import : unit -> C_SUSeconds.t MLton.Rusage.children_utime_sec = _import : unit -> C_Time.t MLton.Rusage.children_utime_usec = _import : unit -> C_SUSeconds.t MLton.Rusage.gc_stime_sec = _import : unit -> C_Time.t MLton.Rusage.gc_stime_usec = _import : unit -> C_SUSeconds.t MLton.Rusage.gc_utime_sec = _import : unit -> C_Time.t MLton.Rusage.gc_utime_usec = _import : unit -> C_SUSeconds.t MLton.Rusage.getrusage = _import : GCState.t -> unit MLton.Rusage.self_stime_sec = _import : unit -> C_Time.t MLton.Rusage.self_stime_usec = _import : unit -> C_SUSeconds.t MLton.Rusage.self_utime_sec = _import : unit -> C_Time.t MLton.Rusage.self_utime_usec = _import : unit -> C_SUSeconds.t MLton.Syslog.Facility.LOG_AUTH = _const : C_Int.t MLton.Syslog.Facility.LOG_CRON = _const : C_Int.t MLton.Syslog.Facility.LOG_DAEMON = _const : C_Int.t MLton.Syslog.Facility.LOG_KERN = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL0 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL1 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL2 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL3 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL4 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL5 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL6 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL7 = _const : C_Int.t MLton.Syslog.Facility.LOG_LPR = _const : C_Int.t MLton.Syslog.Facility.LOG_MAIL = _const : C_Int.t MLton.Syslog.Facility.LOG_NEWS = _const : C_Int.t MLton.Syslog.Facility.LOG_SYSLOG = _const : C_Int.t MLton.Syslog.Facility.LOG_USER = _const : C_Int.t MLton.Syslog.Facility.LOG_UUCP = _const : C_Int.t MLton.Syslog.Logopt.LOG_CONS = _const : C_Int.t MLton.Syslog.Logopt.LOG_NDELAY = _const : C_Int.t MLton.Syslog.Logopt.LOG_NOWAIT = _const : C_Int.t MLton.Syslog.Logopt.LOG_ODELAY = _const : C_Int.t MLton.Syslog.Logopt.LOG_PERROR = _const : C_Int.t MLton.Syslog.Logopt.LOG_PID = _const : C_Int.t MLton.Syslog.Severity.LOG_ALERT = _const : C_Int.t MLton.Syslog.Severity.LOG_CRIT = _const : C_Int.t MLton.Syslog.Severity.LOG_DEBUG = _const : C_Int.t MLton.Syslog.Severity.LOG_EMERG = _const : C_Int.t MLton.Syslog.Severity.LOG_ERR = _const : C_Int.t MLton.Syslog.Severity.LOG_INFO = _const : C_Int.t MLton.Syslog.Severity.LOG_NOTICE = _const : C_Int.t MLton.Syslog.Severity.LOG_WARNING = _const : C_Int.t MLton.Syslog.closelog = _import : unit -> unit MLton.Syslog.openlog = _import : NullString8.t * C_Int.t * C_Int.t -> unit MLton.Syslog.syslog = _import : C_Int.t * NullString8.t -> unit MinGW.getTempPath = _import : C_Size.t * Char8.t array -> C_Size.t MinGW.setNonBlock = _import : C_Fd.t -> unit MinGW.clearNonBlock = _import : C_Fd.t -> unit Net.htonl = _import : Word32.t -> Word32.t Net.htons = _import : Word16.t -> Word16.t Net.ntohl = _import : Word32.t -> Word32.t Net.ntohs = _import : Word16.t -> Word16.t NetHostDB.INADDR_ANY = _const : C_Int.t NetHostDB.getByAddress = _import : Word8.t vector * C_Socklen.t -> C_Int.t NetHostDB.getByName = _import : NullString8.t -> C_Int.t NetHostDB.getEntryAddrType = _import : unit -> C_Int.t NetHostDB.getEntryAddrsN = _import : C_Int.t * Word8.t array -> unit NetHostDB.getEntryAddrsNum = _import : unit -> C_Int.t NetHostDB.getEntryAliasesN = _import : C_Int.t -> C_String.t NetHostDB.getEntryAliasesNum = _import : unit -> C_Int.t NetHostDB.getEntryLength = _import : unit -> C_Int.t NetHostDB.getEntryName = _import : unit -> C_String.t NetHostDB.getHostName = _import : Char8.t array * C_Size.t -> C_Int.t C_Errno.t NetHostDB.inAddrSize = _const : C_Size.t NetProtDB.getByName = _import : NullString8.t -> C_Int.t NetProtDB.getByNumber = _import : C_Int.t -> C_Int.t NetProtDB.getEntryAliasesN = _import : C_Int.t -> C_String.t NetProtDB.getEntryAliasesNum = _import : unit -> C_Int.t NetProtDB.getEntryName = _import : unit -> C_String.t NetProtDB.getEntryProto = _import : unit -> C_Int.t NetServDB.getByName = _import : NullString8.t * NullString8.t -> C_Int.t NetServDB.getByNameNull = _import : NullString8.t -> C_Int.t NetServDB.getByPort = _import : C_Int.t * NullString8.t -> C_Int.t NetServDB.getByPortNull = _import : C_Int.t -> C_Int.t NetServDB.getEntryAliasesN = _import : C_Int.t -> C_String.t NetServDB.getEntryAliasesNum = _import : unit -> C_Int.t NetServDB.getEntryName = _import : unit -> C_String.t NetServDB.getEntryPort = _import : unit -> C_Int.t NetServDB.getEntryProto = _import : unit -> C_String.t OS.IO.POLLIN = _const : C_Short.t OS.IO.POLLOUT = _const : C_Short.t OS.IO.POLLPRI = _const : C_Short.t OS.IO.poll = _import : C_Fd.t vector * C_Short.t vector * C_NFds.t * C_Int.t * C_Short.t array -> C_Int.t C_Errno.t Posix.Error.E2BIG = _const : C_Int.t Posix.Error.EACCES = _const : C_Int.t Posix.Error.EADDRINUSE = _const : C_Int.t Posix.Error.EADDRNOTAVAIL = _const : C_Int.t Posix.Error.EAFNOSUPPORT = _const : C_Int.t Posix.Error.EAGAIN = _const : C_Int.t Posix.Error.EALREADY = _const : C_Int.t Posix.Error.EBADF = _const : C_Int.t Posix.Error.EBADMSG = _const : C_Int.t Posix.Error.EBUSY = _const : C_Int.t Posix.Error.ECANCELED = _const : C_Int.t Posix.Error.ECHILD = _const : C_Int.t Posix.Error.ECONNABORTED = _const : C_Int.t Posix.Error.ECONNREFUSED = _const : C_Int.t Posix.Error.ECONNRESET = _const : C_Int.t Posix.Error.EDEADLK = _const : C_Int.t Posix.Error.EDESTADDRREQ = _const : C_Int.t Posix.Error.EDOM = _const : C_Int.t Posix.Error.EDQUOT = _const : C_Int.t Posix.Error.EEXIST = _const : C_Int.t Posix.Error.EFAULT = _const : C_Int.t Posix.Error.EFBIG = _const : C_Int.t Posix.Error.EHOSTUNREACH = _const : C_Int.t Posix.Error.EIDRM = _const : C_Int.t Posix.Error.EILSEQ = _const : C_Int.t Posix.Error.EINPROGRESS = _const : C_Int.t Posix.Error.EINTR = _const : C_Int.t Posix.Error.EINVAL = _const : C_Int.t Posix.Error.EIO = _const : C_Int.t Posix.Error.EISCONN = _const : C_Int.t Posix.Error.EISDIR = _const : C_Int.t Posix.Error.ELOOP = _const : C_Int.t Posix.Error.EMFILE = _const : C_Int.t Posix.Error.EMLINK = _const : C_Int.t Posix.Error.EMSGSIZE = _const : C_Int.t Posix.Error.EMULTIHOP = _const : C_Int.t Posix.Error.ENAMETOOLONG = _const : C_Int.t Posix.Error.ENETDOWN = _const : C_Int.t Posix.Error.ENETRESET = _const : C_Int.t Posix.Error.ENETUNREACH = _const : C_Int.t Posix.Error.ENFILE = _const : C_Int.t Posix.Error.ENOBUFS = _const : C_Int.t Posix.Error.ENODATA = _const : C_Int.t Posix.Error.ENODEV = _const : C_Int.t Posix.Error.ENOENT = _const : C_Int.t Posix.Error.ENOEXEC = _const : C_Int.t Posix.Error.ENOLCK = _const : C_Int.t Posix.Error.ENOLINK = _const : C_Int.t Posix.Error.ENOMEM = _const : C_Int.t Posix.Error.ENOMSG = _const : C_Int.t Posix.Error.ENOPROTOOPT = _const : C_Int.t Posix.Error.ENOSPC = _const : C_Int.t Posix.Error.ENOSR = _const : C_Int.t Posix.Error.ENOSTR = _const : C_Int.t Posix.Error.ENOSYS = _const : C_Int.t Posix.Error.ENOTCONN = _const : C_Int.t Posix.Error.ENOTDIR = _const : C_Int.t Posix.Error.ENOTEMPTY = _const : C_Int.t Posix.Error.ENOTSOCK = _const : C_Int.t Posix.Error.ENOTSUP = _const : C_Int.t Posix.Error.ENOTTY = _const : C_Int.t Posix.Error.ENXIO = _const : C_Int.t Posix.Error.EOPNOTSUPP = _const : C_Int.t Posix.Error.EOVERFLOW = _const : C_Int.t Posix.Error.EPERM = _const : C_Int.t Posix.Error.EPIPE = _const : C_Int.t Posix.Error.EPROTO = _const : C_Int.t Posix.Error.EPROTONOSUPPORT = _const : C_Int.t Posix.Error.EPROTOTYPE = _const : C_Int.t Posix.Error.ERANGE = _const : C_Int.t Posix.Error.EROFS = _const : C_Int.t Posix.Error.ESPIPE = _const : C_Int.t Posix.Error.ESRCH = _const : C_Int.t Posix.Error.ESTALE = _const : C_Int.t Posix.Error.ETIME = _const : C_Int.t Posix.Error.ETIMEDOUT = _const : C_Int.t Posix.Error.ETXTBSY = _const : C_Int.t Posix.Error.EWOULDBLOCK = _const : C_Int.t Posix.Error.EXDEV = _const : C_Int.t Posix.Error.clearErrno = _import : unit -> unit Posix.Error.getErrno = _import : unit -> C_Int.t Posix.Error.strError = _import : C_Int.t -> C_String.t Posix.FileSys.A.F_OK = _const : C_Int.t Posix.FileSys.A.R_OK = _const : C_Int.t Posix.FileSys.A.W_OK = _const : C_Int.t Posix.FileSys.A.X_OK = _const : C_Int.t Posix.FileSys.Dirstream.closeDir = _import : C_DirP.t -> C_Int.t C_Errno.t Posix.FileSys.Dirstream.openDir = _import : NullString8.t -> C_DirP.t C_Errno.t Posix.FileSys.Dirstream.readDir = _import : C_DirP.t -> C_String.t C_Errno.t Posix.FileSys.Dirstream.rewindDir = _import : C_DirP.t -> unit Posix.FileSys.O.APPEND = _const : C_Int.t Posix.FileSys.O.BINARY = _const : C_Int.t Posix.FileSys.O.CREAT = _const : C_Int.t Posix.FileSys.O.DSYNC = _const : C_Int.t Posix.FileSys.O.EXCL = _const : C_Int.t Posix.FileSys.O.NOCTTY = _const : C_Int.t Posix.FileSys.O.NONBLOCK = _const : C_Int.t Posix.FileSys.O.RDONLY = _const : C_Int.t Posix.FileSys.O.RDWR = _const : C_Int.t Posix.FileSys.O.RSYNC = _const : C_Int.t Posix.FileSys.O.SYNC = _const : C_Int.t Posix.FileSys.O.TEXT = _const : C_Int.t Posix.FileSys.O.TRUNC = _const : C_Int.t Posix.FileSys.O.WRONLY = _const : C_Int.t Posix.FileSys.PC.ALLOC_SIZE_MIN = _const : C_Int.t Posix.FileSys.PC.ASYNC_IO = _const : C_Int.t Posix.FileSys.PC.CHOWN_RESTRICTED = _const : C_Int.t Posix.FileSys.PC.FILESIZEBITS = _const : C_Int.t Posix.FileSys.PC.LINK_MAX = _const : C_Int.t Posix.FileSys.PC.MAX_CANON = _const : C_Int.t Posix.FileSys.PC.MAX_INPUT = _const : C_Int.t Posix.FileSys.PC.NAME_MAX = _const : C_Int.t Posix.FileSys.PC.NO_TRUNC = _const : C_Int.t Posix.FileSys.PC.PATH_MAX = _const : C_Int.t Posix.FileSys.PC.PIPE_BUF = _const : C_Int.t Posix.FileSys.PC.PRIO_IO = _const : C_Int.t Posix.FileSys.PC.REC_INCR_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_MAX_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_MIN_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_XFER_ALIGN = _const : C_Int.t Posix.FileSys.PC.SYMLINK_MAX = _const : C_Int.t Posix.FileSys.PC.SYNC_IO = _const : C_Int.t Posix.FileSys.PC.TWO_SYMLINKS = _const : C_Int.t Posix.FileSys.PC.VDISABLE = _const : C_Int.t Posix.FileSys.S.IFBLK = _const : C_Mode.t Posix.FileSys.S.IFCHR = _const : C_Mode.t Posix.FileSys.S.IFDIR = _const : C_Mode.t Posix.FileSys.S.IFIFO = _const : C_Mode.t Posix.FileSys.S.IFLNK = _const : C_Mode.t Posix.FileSys.S.IFMT = _const : C_Mode.t Posix.FileSys.S.IFREG = _const : C_Mode.t Posix.FileSys.S.IFSOCK = _const : C_Mode.t Posix.FileSys.S.IRGRP = _const : C_Mode.t Posix.FileSys.S.IROTH = _const : C_Mode.t Posix.FileSys.S.IRUSR = _const : C_Mode.t Posix.FileSys.S.IRWXG = _const : C_Mode.t Posix.FileSys.S.IRWXO = _const : C_Mode.t Posix.FileSys.S.IRWXU = _const : C_Mode.t Posix.FileSys.S.ISGID = _const : C_Mode.t Posix.FileSys.S.ISUID = _const : C_Mode.t Posix.FileSys.S.ISVTX = _const : C_Mode.t Posix.FileSys.S.IWGRP = _const : C_Mode.t Posix.FileSys.S.IWOTH = _const : C_Mode.t Posix.FileSys.S.IWUSR = _const : C_Mode.t Posix.FileSys.S.IXGRP = _const : C_Mode.t Posix.FileSys.S.IXOTH = _const : C_Mode.t Posix.FileSys.S.IXUSR = _const : C_Mode.t Posix.FileSys.ST.isBlk = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isChr = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isDir = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isFIFO = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isLink = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isReg = _import : C_Mode.t -> C_Int.t Posix.FileSys.ST.isSock = _import : C_Mode.t -> C_Int.t Posix.FileSys.Stat.fstat = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.FileSys.Stat.getATime = _import : unit -> C_Time.t # Posix.FileSys.Stat.getBlkCnt = _import : unit -> C_BlkCnt.t # Posix.FileSys.Stat.getBlkSize = _import : unit -> C_BlkSize.t Posix.FileSys.Stat.getCTime = _import : unit -> C_Time.t Posix.FileSys.Stat.getDev = _import : unit -> C_Dev.t Posix.FileSys.Stat.getGId = _import : unit -> C_GId.t Posix.FileSys.Stat.getINo = _import : unit -> C_INo.t Posix.FileSys.Stat.getMTime = _import : unit -> C_Time.t Posix.FileSys.Stat.getMode = _import : unit -> C_Mode.t Posix.FileSys.Stat.getNLink = _import : unit -> C_NLink.t Posix.FileSys.Stat.getRDev = _import : unit -> C_Dev.t Posix.FileSys.Stat.getSize = _import : unit -> C_Off.t Posix.FileSys.Stat.getUId = _import : unit -> C_UId.t Posix.FileSys.Stat.lstat = _import : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.Stat.stat = _import : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.Utimbuf.setAcTime = _import : C_Time.t -> unit Posix.FileSys.Utimbuf.setModTime = _import : C_Time.t -> unit Posix.FileSys.Utimbuf.utime = _import : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.access = _import : NullString8.t * C_Int.t -> C_Int.t C_Errno.t Posix.FileSys.chdir = _import : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.chmod = _import : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.chown = _import : NullString8.t * C_UId.t * C_GId.t -> C_Int.t C_Errno.t Posix.FileSys.fchdir = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.FileSys.fchmod = _import : C_Fd.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.fchown = _import : C_Fd.t * C_UId.t * C_GId.t -> C_Int.t C_Errno.t Posix.FileSys.fpathconf = _import : C_Fd.t * C_Int.t -> C_Long.t C_Errno.t Posix.FileSys.ftruncate = _import : C_Fd.t * C_Off.t -> C_Int.t C_Errno.t Posix.FileSys.getcwd = _import : Char8.t array * C_Size.t -> C_String.t C_Errno.t Posix.FileSys.link = _import : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.mkdir = _import : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.mkfifo = _import : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.open2 = _import : NullString8.t * C_Int.t -> C_Fd.t C_Errno.t Posix.FileSys.open3 = _import : NullString8.t * C_Int.t * C_Mode.t -> C_Fd.t C_Errno.t Posix.FileSys.pathconf = _import : NullString8.t * C_Int.t -> C_Long.t C_Errno.t Posix.FileSys.readlink = _import : NullString8.t * Char8.t array * C_Size.t -> C_SSize.t C_Errno.t Posix.FileSys.rename = _import : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.rmdir = _import : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.symlink = _import : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.truncate = _import : NullString8.t * C_Off.t -> C_Int.t C_Errno.t Posix.FileSys.umask = _import : C_Mode.t -> C_Mode.t Posix.FileSys.unlink = _import : NullString8.t -> C_Int.t C_Errno.t Posix.IO.FD.CLOEXEC = _const : C_Int.t Posix.IO.FLock.F_GETLK = _const : C_Int.t Posix.IO.FLock.F_RDLCK = _const : C_Short.t Posix.IO.FLock.F_SETLK = _const : C_Int.t Posix.IO.FLock.F_SETLKW = _const : C_Int.t Posix.IO.FLock.F_UNLCK = _const : C_Short.t Posix.IO.FLock.F_WRLCK = _const : C_Short.t Posix.IO.FLock.SEEK_CUR = _const : C_Short.t Posix.IO.FLock.SEEK_END= _const : C_Short.t Posix.IO.FLock.SEEK_SET = _const : C_Short.t Posix.IO.FLock.fcntl = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.FLock.getLen = _import : unit -> C_Off.t Posix.IO.FLock.getPId = _import : unit -> C_PId.t Posix.IO.FLock.getStart = _import : unit -> C_Off.t Posix.IO.FLock.getType = _import : unit -> C_Short.t Posix.IO.FLock.getWhence = _import : unit -> C_Short.t Posix.IO.FLock.setLen = _import : C_Off.t -> unit Posix.IO.FLock.setPId = _import : C_PId.t -> unit Posix.IO.FLock.setStart = _import : C_Off.t -> unit Posix.IO.FLock.setType = _import : C_Short.t -> unit Posix.IO.FLock.setWhence = _import : C_Short.t -> unit Posix.IO.F_DUPFD = _const : C_Int.t Posix.IO.F_GETFD = _const : C_Int.t Posix.IO.F_GETFL = _const : C_Int.t Posix.IO.F_GETOWN = _const : C_Int.t Posix.IO.F_SETFD = _const : C_Int.t Posix.IO.F_SETFL = _const : C_Int.t Posix.IO.F_SETOWN = _const : C_Int.t Posix.IO.O_ACCMODE = _const : C_Int.t Posix.IO.SEEK_CUR = _const : C_Int.t Posix.IO.SEEK_END= _const : C_Int.t Posix.IO.SEEK_SET = _const : C_Int.t Posix.IO.close = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.IO.dup = _import : C_Fd.t -> C_Fd.t C_Errno.t Posix.IO.dup2 = _import : C_Fd.t * C_Fd.t -> C_Fd.t C_Errno.t Posix.IO.fcntl2 = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.fcntl3 = _import : C_Fd.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.fsync = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.IO.lseek = _import : C_Fd.t * C_Off.t * C_Int.t -> C_Off.t C_Errno.t Posix.IO.pipe = _import : C_Fd.t array -> C_Int.t C_Errno.t Posix.IO.readChar8 = _import : C_Fd.t * Char8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.readWord8 = _import : C_Fd.t * Word8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.setbin = _import : C_Fd.t -> unit Posix.IO.settext = _import : C_Fd.t -> unit Posix.IO.writeChar8Arr = _import : C_Fd.t * Char8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeChar8Vec = _import : C_Fd.t * Char8.t vector * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeWord8Arr = _import : C_Fd.t * Word8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeWord8Vec = _import : C_Fd.t * Word8.t vector * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.ProcEnv.SC_2_CHAR_TERM = _const : C_Int.t Posix.ProcEnv.SC_2_C_BIND = _const : C_Int.t Posix.ProcEnv.SC_2_C_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_FORT_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_FORT_RUN = _const : C_Int.t Posix.ProcEnv.SC_2_LOCALEDEF = _const : C_Int.t Posix.ProcEnv.SC_2_PBS = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_ACCOUNTING = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_CHECKPOINT = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_LOCATE = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_MESSAGE = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_TRACK = _const : C_Int.t Posix.ProcEnv.SC_2_SW_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_UPE = _const : C_Int.t Posix.ProcEnv.SC_2_VERSION = _const : C_Int.t Posix.ProcEnv.SC_ADVISORY_INFO = _const : C_Int.t Posix.ProcEnv.SC_AIO_LISTIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_AIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_AIO_PRIO_DELTA_MAX = _const : C_Int.t Posix.ProcEnv.SC_ARG_MAX = _const : C_Int.t Posix.ProcEnv.SC_ASYNCHRONOUS_IO = _const : C_Int.t Posix.ProcEnv.SC_ATEXIT_MAX = _const : C_Int.t Posix.ProcEnv.SC_AVPHYS_PAGES = _const : C_Int.t Posix.ProcEnv.SC_BARRIERS = _const : C_Int.t Posix.ProcEnv.SC_BC_BASE_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_DIM_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_SCALE_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_STRING_MAX = _const : C_Int.t Posix.ProcEnv.SC_CHILD_MAX = _const : C_Int.t Posix.ProcEnv.SC_CLK_TCK = _const : C_Int.t Posix.ProcEnv.SC_CLOCK_SELECTION = _const : C_Int.t Posix.ProcEnv.SC_COLL_WEIGHTS_MAX = _const : C_Int.t Posix.ProcEnv.SC_CPUTIME = _const : C_Int.t Posix.ProcEnv.SC_DELAYTIMER_MAX = _const : C_Int.t Posix.ProcEnv.SC_EXPR_NEST_MAX = _const : C_Int.t Posix.ProcEnv.SC_FSYNC = _const : C_Int.t Posix.ProcEnv.SC_GETGR_R_SIZE_MAX = _const : C_Int.t Posix.ProcEnv.SC_GETPW_R_SIZE_MAX = _const : C_Int.t Posix.ProcEnv.SC_HOST_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_IOV_MAX = _const : C_Int.t Posix.ProcEnv.SC_IPV6 = _const : C_Int.t Posix.ProcEnv.SC_JOB_CONTROL = _const : C_Int.t Posix.ProcEnv.SC_LINE_MAX = _const : C_Int.t Posix.ProcEnv.SC_LOGIN_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_MAPPED_FILES = _const : C_Int.t Posix.ProcEnv.SC_MEMLOCK = _const : C_Int.t Posix.ProcEnv.SC_MEMLOCK_RANGE = _const : C_Int.t Posix.ProcEnv.SC_MEMORY_PROTECTION = _const : C_Int.t Posix.ProcEnv.SC_MESSAGE_PASSING = _const : C_Int.t Posix.ProcEnv.SC_MONOTONIC_CLOCK = _const : C_Int.t Posix.ProcEnv.SC_MQ_OPEN_MAX = _const : C_Int.t Posix.ProcEnv.SC_MQ_PRIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_NGROUPS_MAX = _const : C_Int.t Posix.ProcEnv.SC_NPROCESSORS_CONF = _const : C_Int.t Posix.ProcEnv.SC_NPROCESSORS_ONLN = _const : C_Int.t Posix.ProcEnv.SC_OPEN_MAX = _const : C_Int.t Posix.ProcEnv.SC_PAGESIZE = _const : C_Int.t Posix.ProcEnv.SC_PAGE_SIZE = _const : C_Int.t Posix.ProcEnv.SC_PHYS_PAGES = _const : C_Int.t Posix.ProcEnv.SC_PRIORITIZED_IO = _const : C_Int.t Posix.ProcEnv.SC_PRIORITY_SCHEDULING = _const : C_Int.t Posix.ProcEnv.SC_RAW_SOCKETS = _const : C_Int.t Posix.ProcEnv.SC_READER_WRITER_LOCKS = _const : C_Int.t Posix.ProcEnv.SC_REALTIME_SIGNALS = _const : C_Int.t Posix.ProcEnv.SC_REGEXP = _const : C_Int.t Posix.ProcEnv.SC_RE_DUP_MAX = _const : C_Int.t Posix.ProcEnv.SC_RTSIG_MAX = _const : C_Int.t Posix.ProcEnv.SC_SAVED_IDS = _const : C_Int.t Posix.ProcEnv.SC_SEMAPHORES = _const : C_Int.t Posix.ProcEnv.SC_SEM_NSEMS_MAX = _const : C_Int.t Posix.ProcEnv.SC_SEM_VALUE_MAX = _const : C_Int.t Posix.ProcEnv.SC_SHARED_MEMORY_OBJECTS = _const : C_Int.t Posix.ProcEnv.SC_SHELL = _const : C_Int.t Posix.ProcEnv.SC_SIGQUEUE_MAX = _const : C_Int.t Posix.ProcEnv.SC_SPAWN = _const : C_Int.t Posix.ProcEnv.SC_SPIN_LOCKS = _const : C_Int.t Posix.ProcEnv.SC_SPORADIC_SERVER = _const : C_Int.t Posix.ProcEnv.SC_SS_REPL_MAX = _const : C_Int.t Posix.ProcEnv.SC_STREAM_MAX = _const : C_Int.t Posix.ProcEnv.SC_SYMLOOP_MAX = _const : C_Int.t Posix.ProcEnv.SC_SYNCHRONIZED_IO = _const : C_Int.t Posix.ProcEnv.SC_THREADS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_ATTR_STACKADDR = _const : C_Int.t Posix.ProcEnv.SC_THREAD_ATTR_STACKSIZE = _const : C_Int.t Posix.ProcEnv.SC_THREAD_CPUTIME = _const : C_Int.t Posix.ProcEnv.SC_THREAD_DESTRUCTOR_ITERATIONS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_KEYS_MAX = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIORITY_SCHEDULING = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIO_INHERIT = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIO_PROTECT = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PROCESS_SHARED = _const : C_Int.t Posix.ProcEnv.SC_THREAD_SAFE_FUNCTIONS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_SPORADIC_SERVER = _const : C_Int.t Posix.ProcEnv.SC_THREAD_STACK_MIN = _const : C_Int.t Posix.ProcEnv.SC_THREAD_THREADS_MAX = _const : C_Int.t Posix.ProcEnv.SC_TIMEOUTS = _const : C_Int.t Posix.ProcEnv.SC_TIMERS = _const : C_Int.t Posix.ProcEnv.SC_TIMER_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE = _const : C_Int.t Posix.ProcEnv.SC_TRACE_EVENT_FILTER = _const : C_Int.t Posix.ProcEnv.SC_TRACE_EVENT_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_INHERIT = _const : C_Int.t Posix.ProcEnv.SC_TRACE_LOG = _const : C_Int.t Posix.ProcEnv.SC_TRACE_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_SYS_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_USER_EVENT_MAX = _const : C_Int.t Posix.ProcEnv.SC_TTY_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TYPED_MEMORY_OBJECTS = _const : C_Int.t Posix.ProcEnv.SC_TZNAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_V6_ILP32_OFF32 = _const : C_Int.t Posix.ProcEnv.SC_V6_ILP32_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_V6_LP64_OFF64 = _const : C_Int.t Posix.ProcEnv.SC_V6_LPBIG_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_VERSION = _const : C_Int.t Posix.ProcEnv.SC_XBS5_ILP32_OFF32 = _const : C_Int.t Posix.ProcEnv.SC_XBS5_ILP32_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_XBS5_LP64_OFF64 = _const : C_Int.t Posix.ProcEnv.SC_XBS5_LPBIG_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_CRYPT = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_ENH_I18N = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_LEGACY = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_REALTIME = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_REALTIME_THREADS = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_SHM = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_STREAMS = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_UNIX = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_VERSION = _const : C_Int.t Posix.ProcEnv.Times.getCSTime = _import : unit -> C_Clock.t Posix.ProcEnv.Times.getCUTime = _import : unit -> C_Clock.t Posix.ProcEnv.Times.getSTime = _import : unit -> C_Clock.t Posix.ProcEnv.Times.getUTime = _import : unit -> C_Clock.t Posix.ProcEnv.Uname.getMachine = _import : unit -> C_String.t Posix.ProcEnv.Uname.getNodeName = _import : unit -> C_String.t Posix.ProcEnv.Uname.getRelease = _import : unit -> C_String.t Posix.ProcEnv.Uname.getSysName = _import : unit -> C_String.t Posix.ProcEnv.Uname.getVersion = _import : unit -> C_String.t Posix.ProcEnv.ctermid = _import : unit -> C_String.t Posix.ProcEnv.environ = _symbol : C_StringArray.t Posix.ProcEnv.getegid = _import : unit -> C_GId.t Posix.ProcEnv.getenv = _import : NullString8.t -> C_String.t Posix.ProcEnv.geteuid = _import : unit -> C_UId.t Posix.ProcEnv.getgid = _import : unit -> C_GId.t Posix.ProcEnv.getgroups = _import : C_Int.t * C_GId.t array -> C_Int.t C_Errno.t Posix.ProcEnv.getgroupsN = _import : unit -> C_Int.t Posix.ProcEnv.getlogin = _import : unit -> C_String.t C_Errno.t Posix.ProcEnv.getpgrp = _import : unit -> C_PId.t Posix.ProcEnv.getpid = _import : unit -> C_PId.t Posix.ProcEnv.getppid = _import : unit -> C_PId.t Posix.ProcEnv.getuid = _import : unit -> C_UId.t Posix.ProcEnv.isatty = _import : C_Fd.t -> C_Int.t Posix.ProcEnv.setenv = _import : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.ProcEnv.setgid = _import : C_GId.t -> C_Int.t C_Errno.t Posix.ProcEnv.setgroups = _import : C_Int.t * C_GId.t vector -> C_Int.t C_Errno.t Posix.ProcEnv.setpgid = _import : C_PId.t * C_PId.t -> C_Int.t C_Errno.t Posix.ProcEnv.setsid = _import : unit -> C_PId.t C_Errno.t Posix.ProcEnv.setuid = _import : C_UId.t -> C_Int.t C_Errno.t Posix.ProcEnv.sysconf = _import : C_Int.t -> C_Long.t C_Errno.t Posix.ProcEnv.times = _import : unit -> C_Clock.t C_Errno.t Posix.ProcEnv.ttyname = _import : C_Fd.t -> C_String.t C_Errno.t Posix.ProcEnv.uname = _import : unit -> C_Int.t C_Errno.t # Posix.Process.W.CONTINUED = _const : C_Int.t Posix.Process.W.NOHANG = _const : C_Int.t Posix.Process.W.UNTRACED = _const : C_Int.t Posix.Process.alarm = _import : C_UInt.t -> C_UInt.t Posix.Process.exece = _import : NullString8.t * NullString8.t array * NullString8.t array -> C_Int.t C_Errno.t Posix.Process.execp = _import : NullString8.t * NullString8.t array -> C_Int.t C_Errno.t Posix.Process.exit = _import __attribute__((noreturn)) : C_Status.t -> unit Posix.Process.exitStatus = _import : C_Status.t -> C_Int.t Posix.Process.fork = _import : unit -> C_PId.t C_Errno.t Posix.Process.ifExited = _import : C_Status.t -> C_Int.t Posix.Process.ifSignaled = _import : C_Status.t -> C_Int.t Posix.Process.ifStopped = _import : C_Status.t -> C_Int.t Posix.Process.kill = _import : C_PId.t * C_Signal.t -> C_Int.t C_Errno.t Posix.Process.nanosleep = _import : C_Time.t ref * C_Long.t ref -> C_Int.t C_Errno.t Posix.Process.pause = _import : unit -> C_Int.t C_Errno.t Posix.Process.sleep = _import : C_UInt.t -> C_UInt.t Posix.Process.stopSig = _import : C_Status.t -> C_Signal.t Posix.Process.system = _import : NullString8.t -> C_Status.t C_Errno.t Posix.Process.termSig = _import : C_Status.t -> C_Signal.t Posix.Process.waitpid = _import : C_PId.t * C_Status.t ref * C_Int.t -> C_PId.t C_Errno.t Posix.Signal.sigSetLen = _const : C_Size.t Posix.Signal.NSIG = _const : C_Int.t Posix.Signal.SIGABRT = _const : C_Signal.t Posix.Signal.SIGALRM = _const : C_Signal.t Posix.Signal.SIGBUS = _const : C_Signal.t Posix.Signal.SIGCHLD = _const : C_Signal.t Posix.Signal.SIGCONT = _const : C_Signal.t Posix.Signal.SIGFPE = _const : C_Signal.t Posix.Signal.SIGHUP = _const : C_Signal.t Posix.Signal.SIGILL = _const : C_Signal.t Posix.Signal.SIGINT = _const : C_Signal.t Posix.Signal.SIGKILL = _const : C_Signal.t Posix.Signal.SIGPIPE = _const : C_Signal.t Posix.Signal.SIGPOLL = _const : C_Signal.t Posix.Signal.SIGPROF = _const : C_Signal.t Posix.Signal.SIGQUIT = _const : C_Signal.t Posix.Signal.SIGSEGV = _const : C_Signal.t Posix.Signal.SIGSTOP = _const : C_Signal.t Posix.Signal.SIGSYS = _const : C_Signal.t Posix.Signal.SIGTERM = _const : C_Signal.t Posix.Signal.SIGTRAP = _const : C_Signal.t Posix.Signal.SIGTSTP = _const : C_Signal.t Posix.Signal.SIGTTIN = _const : C_Signal.t Posix.Signal.SIGTTOU = _const : C_Signal.t Posix.Signal.SIGURG = _const : C_Signal.t Posix.Signal.SIGUSR1 = _const : C_Signal.t Posix.Signal.SIGUSR2 = _const : C_Signal.t Posix.Signal.SIGVTALRM = _const : C_Signal.t Posix.Signal.SIGXCPU = _const : C_Signal.t Posix.Signal.SIGXFSZ = _const : C_Signal.t Posix.Signal.SIG_BLOCK = _const : C_Int.t Posix.Signal.SIG_SETMASK = _const : C_Int.t Posix.Signal.SIG_UNBLOCK = _const : C_Int.t Posix.Signal.default = _import : GCState.t * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.handleGC = _import : GCState.t -> unit Posix.Signal.handlee = _import : GCState.t * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.ignore = _import : GCState.t * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.isDefault = _import : C_Signal.t * C_Int.t ref -> C_Int.t C_Errno.t Posix.Signal.isIgnore = _import : C_Signal.t * C_Int.t ref -> C_Int.t C_Errno.t Posix.Signal.isPending = _import : GCState.t * C_Signal.t -> C_Int.t Posix.Signal.isPendingGC = _import : GCState.t -> C_Int.t Posix.Signal.resetPending = _import : GCState.t -> unit Posix.Signal.sigaddset = _import : Word8.t array * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigdelset = _import : Word8.t array * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigemptyset = _import : Word8.t array -> C_Int.t C_Errno.t Posix.Signal.sigfillset = _import : Word8.t array -> C_Int.t C_Errno.t Posix.Signal.sigismember = _import : Word8.t vector * C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigprocmask = _import : C_Int.t * Word8.t vector * Word8.t array -> C_Int.t C_Errno.t Posix.Signal.sigsuspend = _import : Word8.t vector -> unit Posix.SysDB.Group.getGId = _import : unit -> C_GId.t Posix.SysDB.Group.getMem = _import : unit -> C_StringArray.t Posix.SysDB.Group.getName = _import : unit -> C_String.t Posix.SysDB.Passwd.getDir = _import : unit -> C_String.t Posix.SysDB.Passwd.getGId = _import : unit -> C_GId.t Posix.SysDB.Passwd.getName = _import : unit -> C_String.t Posix.SysDB.Passwd.getShell = _import : unit -> C_String.t Posix.SysDB.Passwd.getUId = _import : unit -> C_UId.t Posix.SysDB.getgrgid = _import : C_GId.t -> C_Int.t C_Errno.t Posix.SysDB.getgrnam = _import : NullString8.t -> C_Int.t C_Errno.t Posix.SysDB.getpwnam = _import : NullString8.t -> C_Int.t C_Errno.t Posix.SysDB.getpwuid = _import : C_GId.t -> C_Int.t C_Errno.t Posix.TTY.B0 = _const : C_Speed.t Posix.TTY.B110 = _const : C_Speed.t Posix.TTY.B1200 = _const : C_Speed.t Posix.TTY.B134 = _const : C_Speed.t Posix.TTY.B150 = _const : C_Speed.t Posix.TTY.B1800 = _const : C_Speed.t Posix.TTY.B19200 = _const : C_Speed.t Posix.TTY.B200 = _const : C_Speed.t Posix.TTY.B2400 = _const : C_Speed.t Posix.TTY.B300 = _const : C_Speed.t Posix.TTY.B38400 = _const : C_Speed.t Posix.TTY.B4800 = _const : C_Speed.t Posix.TTY.B50 = _const : C_Speed.t Posix.TTY.B600 = _const : C_Speed.t Posix.TTY.B75 = _const : C_Speed.t Posix.TTY.B9600 = _const : C_Speed.t Posix.TTY.C.CLOCAL = _const : C_TCFlag.t Posix.TTY.C.CREAD = _const : C_TCFlag.t Posix.TTY.C.CS5 = _const : C_TCFlag.t Posix.TTY.C.CS6 = _const : C_TCFlag.t Posix.TTY.C.CS7 = _const : C_TCFlag.t Posix.TTY.C.CS8 = _const : C_TCFlag.t Posix.TTY.C.CSIZE = _const : C_TCFlag.t Posix.TTY.C.CSTOPB = _const : C_TCFlag.t Posix.TTY.C.HUPCL = _const : C_TCFlag.t Posix.TTY.C.PARENB = _const : C_TCFlag.t Posix.TTY.C.PARODD = _const : C_TCFlag.t Posix.TTY.I.BRKINT = _const : C_TCFlag.t Posix.TTY.I.ICRNL = _const : C_TCFlag.t Posix.TTY.I.IGNBRK = _const : C_TCFlag.t Posix.TTY.I.IGNCR = _const : C_TCFlag.t Posix.TTY.I.IGNPAR = _const : C_TCFlag.t Posix.TTY.I.INLCR = _const : C_TCFlag.t Posix.TTY.I.INPCK = _const : C_TCFlag.t Posix.TTY.I.ISTRIP = _const : C_TCFlag.t Posix.TTY.I.IXANY = _const : C_TCFlag.t Posix.TTY.I.IXOFF = _const : C_TCFlag.t Posix.TTY.I.IXON = _const : C_TCFlag.t Posix.TTY.I.PARMRK = _const : C_TCFlag.t Posix.TTY.L.ECHO = _const : C_TCFlag.t Posix.TTY.L.ECHOE = _const : C_TCFlag.t Posix.TTY.L.ECHOK = _const : C_TCFlag.t Posix.TTY.L.ECHONL = _const : C_TCFlag.t Posix.TTY.L.ICANON = _const : C_TCFlag.t Posix.TTY.L.IEXTEN = _const : C_TCFlag.t Posix.TTY.L.ISIG = _const : C_TCFlag.t Posix.TTY.L.NOFLSH = _const : C_TCFlag.t Posix.TTY.L.TOSTOP = _const : C_TCFlag.t Posix.TTY.O.BS0 = _const : C_TCFlag.t Posix.TTY.O.BS1 = _const : C_TCFlag.t Posix.TTY.O.BSDLY = _const : C_TCFlag.t Posix.TTY.O.CR0 = _const : C_TCFlag.t Posix.TTY.O.CR1 = _const : C_TCFlag.t Posix.TTY.O.CR2 = _const : C_TCFlag.t Posix.TTY.O.CR3 = _const : C_TCFlag.t Posix.TTY.O.CRDLY = _const : C_TCFlag.t Posix.TTY.O.FF0 = _const : C_TCFlag.t Posix.TTY.O.FF1 = _const : C_TCFlag.t Posix.TTY.O.FFDLY = _const : C_TCFlag.t Posix.TTY.O.NL0 = _const : C_TCFlag.t Posix.TTY.O.NL1 = _const : C_TCFlag.t Posix.TTY.O.NLDLY = _const : C_TCFlag.t Posix.TTY.O.OCRNL = _const : C_TCFlag.t Posix.TTY.O.OFILL = _const : C_TCFlag.t Posix.TTY.O.ONLCR = _const : C_TCFlag.t Posix.TTY.O.ONLRET = _const : C_TCFlag.t Posix.TTY.O.ONOCR = _const : C_TCFlag.t Posix.TTY.O.OPOST = _const : C_TCFlag.t Posix.TTY.O.TAB0 = _const : C_TCFlag.t Posix.TTY.O.TAB1 = _const : C_TCFlag.t Posix.TTY.O.TAB2 = _const : C_TCFlag.t Posix.TTY.O.TAB3 = _const : C_TCFlag.t Posix.TTY.O.TABDLY = _const : C_TCFlag.t Posix.TTY.O.VT0 = _const : C_TCFlag.t Posix.TTY.O.VT1 = _const : C_TCFlag.t Posix.TTY.O.VTDLY = _const : C_TCFlag.t Posix.TTY.TC.TCIFLUSH = _const : C_Int.t Posix.TTY.TC.TCIOFF = _const : C_Int.t Posix.TTY.TC.TCIOFLUSH = _const : C_Int.t Posix.TTY.TC.TCION = _const : C_Int.t Posix.TTY.TC.TCOFLUSH = _const : C_Int.t Posix.TTY.TC.TCOOFF = _const : C_Int.t Posix.TTY.TC.TCOON = _const : C_Int.t Posix.TTY.TC.TCSADRAIN = _const : C_Int.t Posix.TTY.TC.TCSAFLUSH = _const : C_Int.t Posix.TTY.TC.TCSANOW = _const : C_Int.t Posix.TTY.TC.drain = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.TTY.TC.flow = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.flush = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.getattr = _import : C_Fd.t -> C_Int.t C_Errno.t Posix.TTY.TC.getpgrp = _import : C_Fd.t -> C_PId.t C_Errno.t Posix.TTY.TC.sendbreak = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.setattr = _import : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.setpgrp = _import : C_Fd.t * C_PId.t -> C_Int.t C_Errno.t Posix.TTY.Termios.cfGetISpeed = _import : unit -> C_Speed.t Posix.TTY.Termios.cfGetOSpeed = _import : unit -> C_Speed.t Posix.TTY.Termios.cfSetISpeed = _import : C_Speed.t -> C_Int.t C_Errno.t Posix.TTY.Termios.cfSetOSpeed = _import : C_Speed.t -> C_Int.t C_Errno.t Posix.TTY.Termios.getCC = _import : C_CC.t array -> unit Posix.TTY.Termios.getCFlag = _import : unit -> C_TCFlag.t Posix.TTY.Termios.getIFlag = _import : unit -> C_TCFlag.t Posix.TTY.Termios.getLFlag = _import : unit -> C_TCFlag.t Posix.TTY.Termios.getOFlag = _import : unit -> C_TCFlag.t Posix.TTY.Termios.setCC = _import : C_CC.t array -> unit Posix.TTY.Termios.setCFlag = _import : C_TCFlag.t -> unit Posix.TTY.Termios.setIFlag = _import : C_TCFlag.t -> unit Posix.TTY.Termios.setLFlag = _import : C_TCFlag.t -> unit Posix.TTY.Termios.setOFlag = _import : C_TCFlag.t -> unit Posix.TTY.V.NCCS = _const : C_Int.t Posix.TTY.V.VEOF = _const : C_Int.t Posix.TTY.V.VEOL = _const : C_Int.t Posix.TTY.V.VERASE = _const : C_Int.t Posix.TTY.V.VINTR = _const : C_Int.t Posix.TTY.V.VKILL = _const : C_Int.t Posix.TTY.V.VMIN = _const : C_Int.t Posix.TTY.V.VQUIT = _const : C_Int.t Posix.TTY.V.VSTART = _const : C_Int.t Posix.TTY.V.VSTOP = _const : C_Int.t Posix.TTY.V.VSUSP = _const : C_Int.t Posix.TTY.V.VTIME = _const : C_Int.t Socket.AF.INET = _const : C_Int.t Socket.AF.INET6 = _const : C_Int.t Socket.AF.UNIX = _const : C_Int.t Socket.AF.UNSPEC = _const : C_Int.t Socket.Ctl.SOL_SOCKET = _const : C_Int.t Socket.Ctl.SO_ACCEPTCONN = _const : C_Int.t Socket.Ctl.SO_BROADCAST = _const : C_Int.t Socket.Ctl.SO_DEBUG = _const : C_Int.t Socket.Ctl.SO_DONTROUTE = _const : C_Int.t Socket.Ctl.SO_ERROR = _const : C_Int.t Socket.Ctl.SO_KEEPALIVE = _const : C_Int.t Socket.Ctl.SO_LINGER = _const : C_Int.t Socket.Ctl.SO_OOBINLINE = _const : C_Int.t Socket.Ctl.SO_RCVBUF = _const : C_Int.t Socket.Ctl.SO_RCVLOWAT = _const : C_Int.t Socket.Ctl.SO_RCVTIMEO = _const : C_Int.t Socket.Ctl.SO_REUSEADDR = _const : C_Int.t Socket.Ctl.SO_SNDBUF = _const : C_Int.t Socket.Ctl.SO_SNDLOWAT = _const : C_Int.t Socket.Ctl.SO_SNDTIMEO = _const : C_Int.t Socket.Ctl.SO_TYPE = _const : C_Int.t Socket.Ctl.getATMARK = _import : C_Sock.t * C_Int.t ref -> C_Int.t C_Errno.t Socket.Ctl.getNREAD = _import : C_Sock.t * C_Int.t ref -> C_Int.t C_Errno.t Socket.Ctl.getPeerName = _import : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.Ctl.getSockName = _import : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.Ctl.getSockOptC_Int = _import : C_Sock.t * C_Int.t * C_Int.t * C_Int.t ref -> C_Int.t C_Errno.t Socket.Ctl.getSockOptC_Linger = _import : C_Sock.t * C_Int.t * C_Int.t * C_Int.t ref * C_Int.t ref -> C_Int.t C_Errno.t Socket.Ctl.setSockOptC_Int = _import : C_Sock.t * C_Int.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Socket.Ctl.setSockOptC_Linger = _import : C_Sock.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Socket.GenericSock.socket = _import : C_Int.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Socket.GenericSock.socketPair = _import : C_Int.t * C_Int.t * C_Int.t * C_Int.t array -> C_Int.t C_Errno.t Socket.INetSock.Ctl.IPPROTO_TCP = _const : C_Int.t Socket.INetSock.Ctl.TCP_NODELAY = _const : C_Int.t Socket.INetSock.fromAddr = _import : Word8.t vector -> unit Socket.INetSock.getInAddr = _import : Word8.t array -> unit Socket.INetSock.getPort = _import : unit -> Word16.t Socket.INetSock.toAddr = _import : Word8.t vector * Word16.t * Word8.t array * C_Socklen.t ref -> unit Socket.MSG_CTRUNC = _const : C_Int.t Socket.MSG_DONTROUTE = _const : C_Int.t Socket.MSG_DONTWAIT = _const : C_Int.t Socket.MSG_EOR = _const : C_Int.t Socket.MSG_OOB = _const : C_Int.t Socket.MSG_PEEK = _const : C_Int.t Socket.MSG_TRUNC = _const : C_Int.t Socket.MSG_WAITALL = _const : C_Int.t Socket.SHUT_RD = _const : C_Int.t Socket.SHUT_RDWR = _const : C_Int.t Socket.SHUT_WR = _const : C_Int.t Socket.SOCK.DGRAM = _const : C_Int.t Socket.SOCK.RAW = _const : C_Int.t Socket.SOCK.SEQPACKET = _const : C_Int.t Socket.SOCK.STREAM = _const : C_Int.t Socket.UnixSock.fromAddr = _import : Word8.t vector * Char8.t array * C_Size.t -> unit Socket.UnixSock.pathLen = _import : Word8.t vector -> C_Size.t Socket.UnixSock.toAddr = _import : NullString8.t * C_Size.t * Word8.t array * C_Socklen.t ref -> unit Socket.accept = _import : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.bind = _import : C_Sock.t * Word8.t vector * C_Socklen.t -> C_Int.t C_Errno.t Socket.close = _import : C_Sock.t -> C_Int.t C_Errno.t Socket.connect = _import : C_Sock.t * Word8.t vector * C_Socklen.t -> C_Int.t C_Errno.t Socket.familyOfAddr = _import : Word8.t vector -> C_Int.t Socket.getTimeout_sec = _import : unit -> C_Time.t Socket.getTimeout_usec = _import : unit -> C_SUSeconds.t Socket.listen = _import : C_Sock.t * C_Int.t -> C_Int.t C_Errno.t Socket.recv = _import : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.recvFrom = _import : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t * Word8.t array * C_Socklen.t ref -> C_SSize.t C_Errno.t Socket.select = _import : C_Fd.t vector * C_Fd.t vector * C_Fd.t vector * C_Int.t array * C_Int.t array * C_Int.t array -> C_Int.t C_Errno.t Socket.sendArr = _import : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.sendArrTo = _import : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t * Word8.t vector * C_Socklen.t -> C_SSize.t C_Errno.t Socket.sendVec = _import : C_Sock.t * Word8.t vector * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.sendVecTo = _import : C_Sock.t * Word8.t vector * C_Int.t * C_Size.t * C_Int.t * Word8.t vector * C_Socklen.t -> C_SSize.t C_Errno.t Socket.setTimeout = _import : C_Time.t * C_SUSeconds.t -> unit Socket.setTimeoutNull = _import : unit -> unit Socket.shutdown = _import : C_Sock.t * C_Int.t -> C_Int.t C_Errno.t Socket.sockAddrStorageLen = _const : C_Size.t Stdio.print = _import : String8.t -> unit Stdio.printStderr = _import : String8.t -> unit Stdio.printStdout = _import : String8.t -> unit Time.getTimeOfDay = _import : C_Time.t ref * C_SUSeconds.t ref -> C_Int.t Windows.Process.create = _import : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> C_PId.t C_Errno.t Windows.Process.createNull = _import : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> C_PId.t C_Errno.t Windows.Process.getexitcode = _import : C_PId.t * C_Status.t ref -> C_Int.t C_Errno.t Windows.Process.terminate = _import : C_PId.t * C_Signal.t -> C_Int.t C_Errno.t ## Real32.Math.acos = _import INLINE : Real32.t -> Real32.t Real32.Math.asin = _import INLINE : Real32.t -> Real32.t Real32.Math.atan = _import INLINE : Real32.t -> Real32.t Real32.Math.atan2 = _import INLINE : Real32.t * Real32.t -> Real32.t Real32.Math.cos = _import INLINE : Real32.t -> Real32.t Real32.Math.cosh = _import INLINE : Real32.t -> Real32.t Real32.Math.exp = _import INLINE : Real32.t -> Real32.t Real32.Math.ln = _import INLINE : Real32.t -> Real32.t Real32.Math.log10 = _import INLINE : Real32.t -> Real32.t Real32.Math.pow = _import INLINE : Real32.t * Real32.t -> Real32.t Real32.Math.sin = _import INLINE : Real32.t -> Real32.t Real32.Math.sinh = _import INLINE : Real32.t -> Real32.t Real32.Math.sqrt = _import INLINE : Real32.t -> Real32.t Real32.Math.tan = _import INLINE : Real32.t -> Real32.t Real32.Math.tanh = _import INLINE : Real32.t -> Real32.t Real32.abs = _import INLINE : Real32.t -> Real32.t Real32.add = _import INLINE : Real32.t * Real32.t -> Real32.t Real32.castToWord32 = _import INLINE : Real32.t -> Word32.t Real32.div = _import INLINE : Real32.t * Real32.t -> Real32.t Real32.equal = _import INLINE : Real32.t * Real32.t -> Bool.t Real32.fetch = _import INLINE : Real32.t ref -> Real32.t Real32.frexp = _import INLINE : Real32.t * C_Int.t ref -> Real32.t Real32.gdtoa = _import : Real32.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t Real32.ldexp = _import INLINE : Real32.t * C_Int.t -> Real32.t Real32.le = _import INLINE : Real32.t * Real32.t -> Bool.t Real32.lt = _import INLINE : Real32.t * Real32.t -> Bool.t Real32.modf = _import INLINE : Real32.t * Real32.t ref -> Real32.t Real32.move = _import INLINE : Real32.t ref * Real32.t ref -> unit Real32.mul = _import INLINE : Real32.t * Real32.t -> Real32.t Real32.muladd = _import INLINE : Real32.t * Real32.t * Real32.t -> Real32.t Real32.mulsub = _import INLINE : Real32.t * Real32.t * Real32.t -> Real32.t Real32.neg = _import INLINE : Real32.t -> Real32.t Real32.realCeil = _import INLINE : Real32.t -> Real32.t Real32.realFloor = _import INLINE : Real32.t -> Real32.t Real32.realTrunc = _import INLINE : Real32.t -> Real32.t Real32.rndToReal32 = _import INLINE : Real32.t -> Real32.t Real32.rndToReal64 = _import INLINE : Real32.t -> Real64.t Real32.rndToWordS16 = _import INLINE : Real32.t -> Int16.t Real32.rndToWordS32 = _import INLINE : Real32.t -> Int32.t Real32.rndToWordS64 = _import INLINE : Real32.t -> Int64.t Real32.rndToWordS8 = _import INLINE : Real32.t -> Int8.t Real32.rndToWordU16 = _import INLINE : Real32.t -> Word16.t Real32.rndToWordU32 = _import INLINE : Real32.t -> Word32.t Real32.rndToWordU64 = _import INLINE : Real32.t -> Word64.t Real32.rndToWordU8 = _import INLINE : Real32.t -> Word8.t Real32.round = _import INLINE : Real32.t -> Real32.t Real32.store = _import INLINE : Real32.t ref * Real32.t -> unit Real32.strtor = _import : NullString8.t * C_Int.t -> Real32.t Real32.sub = _import INLINE : Real32.t * Real32.t -> Real32.t Real64.Math.acos = _import INLINE : Real64.t -> Real64.t Real64.Math.asin = _import INLINE : Real64.t -> Real64.t Real64.Math.atan = _import INLINE : Real64.t -> Real64.t Real64.Math.atan2 = _import INLINE : Real64.t * Real64.t -> Real64.t Real64.Math.cos = _import INLINE : Real64.t -> Real64.t Real64.Math.cosh = _import INLINE : Real64.t -> Real64.t Real64.Math.exp = _import INLINE : Real64.t -> Real64.t Real64.Math.ln = _import INLINE : Real64.t -> Real64.t Real64.Math.log10 = _import INLINE : Real64.t -> Real64.t Real64.Math.pow = _import INLINE : Real64.t * Real64.t -> Real64.t Real64.Math.sin = _import INLINE : Real64.t -> Real64.t Real64.Math.sinh = _import INLINE : Real64.t -> Real64.t Real64.Math.sqrt = _import INLINE : Real64.t -> Real64.t Real64.Math.tan = _import INLINE : Real64.t -> Real64.t Real64.Math.tanh = _import INLINE : Real64.t -> Real64.t Real64.abs = _import INLINE : Real64.t -> Real64.t Real64.add = _import INLINE : Real64.t * Real64.t -> Real64.t Real64.castToWord64 = _import INLINE : Real64.t -> Word64.t Real64.div = _import INLINE : Real64.t * Real64.t -> Real64.t Real64.equal = _import INLINE : Real64.t * Real64.t -> Bool.t Real64.fetch = _import INLINE : Real64.t ref -> Real64.t Real64.frexp = _import INLINE : Real64.t * C_Int.t ref -> Real64.t Real64.gdtoa = _import : Real64.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t Real64.ldexp = _import INLINE : Real64.t * C_Int.t -> Real64.t Real64.le = _import INLINE : Real64.t * Real64.t -> Bool.t Real64.lt = _import INLINE : Real64.t * Real64.t -> Bool.t Real64.modf = _import INLINE : Real64.t * Real64.t ref -> Real64.t Real64.move = _import INLINE : Real64.t ref * Real64.t ref -> unit Real64.mul = _import INLINE : Real64.t * Real64.t -> Real64.t Real64.muladd = _import INLINE : Real64.t * Real64.t * Real64.t -> Real64.t Real64.mulsub = _import INLINE : Real64.t * Real64.t * Real64.t -> Real64.t Real64.neg = _import INLINE : Real64.t -> Real64.t Real64.realCeil = _import INLINE : Real64.t -> Real64.t Real64.realFloor = _import INLINE : Real64.t -> Real64.t Real64.realTrunc = _import INLINE : Real64.t -> Real64.t Real64.rndToReal32 = _import INLINE : Real64.t -> Real32.t Real64.rndToReal64 = _import INLINE : Real64.t -> Real64.t Real64.rndToWordS16 = _import INLINE : Real64.t -> Int16.t Real64.rndToWordS32 = _import INLINE : Real64.t -> Int32.t Real64.rndToWordS64 = _import INLINE : Real64.t -> Int64.t Real64.rndToWordS8 = _import INLINE : Real64.t -> Int8.t Real64.rndToWordU16 = _import INLINE : Real64.t -> Word16.t Real64.rndToWordU32 = _import INLINE : Real64.t -> Word32.t Real64.rndToWordU64 = _import INLINE : Real64.t -> Word64.t Real64.rndToWordU8 = _import INLINE : Real64.t -> Word8.t Real64.round = _import INLINE : Real64.t -> Real64.t Real64.store = _import INLINE : Real64.t ref * Real64.t -> unit Real64.strtor = _import : NullString8.t * C_Int.t -> Real64.t Real64.sub = _import INLINE : Real64.t * Real64.t -> Real64.t Word16.add = _import INLINE : Word16.t * Word16.t -> Word16.t Word16.andb = _import INLINE : Word16.t * Word16.t -> Word16.t Word16.equal = _import INLINE : Word16.t * Word16.t -> Bool.t Word16.lshift = _import INLINE : Word16.t * Word32.t -> Word16.t Word16.neg = _import INLINE : Word16.t -> Word16.t Word16.notb = _import INLINE : Word16.t -> Word16.t Word16.orb = _import INLINE : Word16.t * Word16.t -> Word16.t Word16.rol = _import INLINE : Word16.t * Word32.t -> Word16.t Word16.ror = _import INLINE : Word16.t * Word32.t -> Word16.t Word16.sub = _import INLINE : Word16.t * Word16.t -> Word16.t Word16.xorb = _import INLINE : Word16.t * Word16.t -> Word16.t Word32.add = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.andb = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.castToReal32 = _import INLINE : Word32.t -> Real32.t Word32.equal = _import INLINE : Word32.t * Word32.t -> Bool.t Word32.lshift = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.neg = _import INLINE : Word32.t -> Word32.t Word32.notb = _import INLINE : Word32.t -> Word32.t Word32.orb = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.rol = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.ror = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.sub = _import INLINE : Word32.t * Word32.t -> Word32.t Word32.xorb = _import INLINE : Word32.t * Word32.t -> Word32.t Word64.add = _import INLINE : Word64.t * Word64.t -> Word64.t Word64.andb = _import INLINE : Word64.t * Word64.t -> Word64.t Word64.castToReal64 = _import INLINE : Word64.t -> Real64.t Word64.equal = _import INLINE : Word64.t * Word64.t -> Bool.t Word64.fetch = _import INLINE : Word64.t ref -> Word64.t Word64.lshift = _import INLINE : Word64.t * Word32.t -> Word64.t Word64.move = _import INLINE : Word64.t ref * Word64.t ref -> unit Word64.neg = _import INLINE : Word64.t -> Word64.t Word64.notb = _import INLINE : Word64.t -> Word64.t Word64.orb = _import INLINE : Word64.t * Word64.t -> Word64.t Word64.rol = _import INLINE : Word64.t * Word32.t -> Word64.t Word64.ror = _import INLINE : Word64.t * Word32.t -> Word64.t Word64.store = _import INLINE : Word64.t ref * Word64.t -> unit Word64.sub = _import INLINE : Word64.t * Word64.t -> Word64.t Word64.xorb = _import INLINE : Word64.t * Word64.t -> Word64.t Word8.add = _import INLINE : Word8.t * Word8.t -> Word8.t Word8.andb = _import INLINE : Word8.t * Word8.t -> Word8.t Word8.equal = _import INLINE : Word8.t * Word8.t -> Bool.t Word8.lshift = _import INLINE : Word8.t * Word32.t -> Word8.t Word8.neg = _import INLINE : Word8.t -> Word8.t Word8.notb = _import INLINE : Word8.t -> Word8.t Word8.orb = _import INLINE : Word8.t * Word8.t -> Word8.t Word8.rol = _import INLINE : Word8.t * Word32.t -> Word8.t Word8.ror = _import INLINE : Word8.t * Word32.t -> Word8.t Word8.sub = _import INLINE : Word8.t * Word8.t -> Word8.t Word8.xorb = _import INLINE : Word8.t * Word8.t -> Word8.t WordS16.addCheckP = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.extdToWord16 = _import INLINE : Int16.t -> Word16.t WordS16.extdToWord32 = _import INLINE : Int16.t -> Word32.t WordS16.extdToWord64 = _import INLINE : Int16.t -> Word64.t WordS16.extdToWord8 = _import INLINE : Int16.t -> Word8.t WordS16.ge = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.gt = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.le = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.lt = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.mul = _import INLINE : Int16.t * Int16.t -> Int16.t WordS16.mulCheckP = _import INLINE : Int16.t * Int16.t -> Bool.t WordS16.negCheckP = _import INLINE : Int16.t -> Bool.t WordS16.quot = _import INLINE : Int16.t * Int16.t -> Int16.t WordS16.rem = _import INLINE : Int16.t * Int16.t -> Int16.t WordS16.rndToReal32 = _import : Int16.t -> Real32.t WordS16.rndToReal64 = _import : Int16.t -> Real64.t WordS16.rshift = _import INLINE : Int16.t * Word32.t -> Int16.t WordS16.subCheckP = _import INLINE : Int16.t * Int16.t -> Bool.t WordS32.addCheckP = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.extdToWord16 = _import INLINE : Int32.t -> Word16.t WordS32.extdToWord32 = _import INLINE : Int32.t -> Word32.t WordS32.extdToWord64 = _import INLINE : Int32.t -> Word64.t WordS32.extdToWord8 = _import INLINE : Int32.t -> Word8.t WordS32.ge = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.gt = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.le = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.lt = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.mul = _import INLINE : Int32.t * Int32.t -> Int32.t WordS32.mulCheckP = _import INLINE : Int32.t * Int32.t -> Bool.t WordS32.negCheckP = _import INLINE : Int32.t -> Bool.t WordS32.quot = _import INLINE : Int32.t * Int32.t -> Int32.t WordS32.rem = _import INLINE : Int32.t * Int32.t -> Int32.t WordS32.rndToReal32 = _import : Int32.t -> Real32.t WordS32.rndToReal64 = _import : Int32.t -> Real64.t WordS32.rshift = _import INLINE : Int32.t * Word32.t -> Int32.t WordS32.subCheckP = _import INLINE : Int32.t * Int32.t -> Bool.t WordS64.addCheckP = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.extdToWord16 = _import INLINE : Int64.t -> Word16.t WordS64.extdToWord32 = _import INLINE : Int64.t -> Word32.t WordS64.extdToWord64 = _import INLINE : Int64.t -> Word64.t WordS64.extdToWord8 = _import INLINE : Int64.t -> Word8.t WordS64.ge = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.gt = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.le = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.lt = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.mul = _import INLINE : Int64.t * Int64.t -> Int64.t WordS64.mulCheckP = _import INLINE : Int64.t * Int64.t -> Bool.t WordS64.negCheckP = _import INLINE : Int64.t -> Bool.t WordS64.quot = _import INLINE : Int64.t * Int64.t -> Int64.t WordS64.rem = _import INLINE : Int64.t * Int64.t -> Int64.t WordS64.rndToReal32 = _import : Int64.t -> Real32.t WordS64.rndToReal64 = _import : Int64.t -> Real64.t WordS64.rshift = _import INLINE : Int64.t * Word32.t -> Int64.t WordS64.subCheckP = _import INLINE : Int64.t * Int64.t -> Bool.t WordS8.addCheckP = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.extdToWord16 = _import INLINE : Int8.t -> Word16.t WordS8.extdToWord32 = _import INLINE : Int8.t -> Word32.t WordS8.extdToWord64 = _import INLINE : Int8.t -> Word64.t WordS8.extdToWord8 = _import INLINE : Int8.t -> Word8.t WordS8.ge = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.gt = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.le = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.lt = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.mul = _import INLINE : Int8.t * Int8.t -> Int8.t WordS8.mulCheckP = _import INLINE : Int8.t * Int8.t -> Bool.t WordS8.negCheckP = _import INLINE : Int8.t -> Bool.t WordS8.quot = _import INLINE : Int8.t * Int8.t -> Int8.t WordS8.rem = _import INLINE : Int8.t * Int8.t -> Int8.t WordS8.rndToReal32 = _import : Int8.t -> Real32.t WordS8.rndToReal64 = _import : Int8.t -> Real64.t WordS8.rshift = _import INLINE : Int8.t * Word32.t -> Int8.t WordS8.subCheckP = _import INLINE : Int8.t * Int8.t -> Bool.t WordU16.addCheckP = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.extdToWord16 = _import INLINE : Word16.t -> Word16.t WordU16.extdToWord32 = _import INLINE : Word16.t -> Word32.t WordU16.extdToWord64 = _import INLINE : Word16.t -> Word64.t WordU16.extdToWord8 = _import INLINE : Word16.t -> Word8.t WordU16.ge = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.gt = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.le = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.lt = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.mul = _import INLINE : Word16.t * Word16.t -> Word16.t WordU16.mulCheckP = _import INLINE : Word16.t * Word16.t -> Bool.t WordU16.negCheckP = _import INLINE : Word16.t -> Bool.t WordU16.quot = _import INLINE : Word16.t * Word16.t -> Word16.t WordU16.rem = _import INLINE : Word16.t * Word16.t -> Word16.t WordU16.rndToReal32 = _import : Word16.t -> Real32.t WordU16.rndToReal64 = _import : Word16.t -> Real64.t WordU16.rshift = _import INLINE : Word16.t * Word32.t -> Word16.t WordU16.subCheckP = _import INLINE : Word16.t * Word16.t -> Bool.t WordU32.addCheckP = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.extdToWord16 = _import INLINE : Word32.t -> Word16.t WordU32.extdToWord32 = _import INLINE : Word32.t -> Word32.t WordU32.extdToWord64 = _import INLINE : Word32.t -> Word64.t WordU32.extdToWord8 = _import INLINE : Word32.t -> Word8.t WordU32.ge = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.gt = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.le = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.lt = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.mul = _import INLINE : Word32.t * Word32.t -> Word32.t WordU32.mulCheckP = _import INLINE : Word32.t * Word32.t -> Bool.t WordU32.negCheckP = _import INLINE : Word32.t -> Bool.t WordU32.quot = _import INLINE : Word32.t * Word32.t -> Word32.t WordU32.rem = _import INLINE : Word32.t * Word32.t -> Word32.t WordU32.rndToReal32 = _import : Word32.t -> Real32.t WordU32.rndToReal64 = _import : Word32.t -> Real64.t WordU32.rshift = _import INLINE : Word32.t * Word32.t -> Word32.t WordU32.subCheckP = _import INLINE : Word32.t * Word32.t -> Bool.t WordU64.addCheckP = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.extdToWord16 = _import INLINE : Word64.t -> Word16.t WordU64.extdToWord32 = _import INLINE : Word64.t -> Word32.t WordU64.extdToWord64 = _import INLINE : Word64.t -> Word64.t WordU64.extdToWord8 = _import INLINE : Word64.t -> Word8.t WordU64.ge = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.gt = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.le = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.lt = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.mul = _import INLINE : Word64.t * Word64.t -> Word64.t WordU64.mulCheckP = _import INLINE : Word64.t * Word64.t -> Bool.t WordU64.negCheckP = _import INLINE : Word64.t -> Bool.t WordU64.quot = _import INLINE : Word64.t * Word64.t -> Word64.t WordU64.rem = _import INLINE : Word64.t * Word64.t -> Word64.t WordU64.rndToReal32 = _import : Word64.t -> Real32.t WordU64.rndToReal64 = _import : Word64.t -> Real64.t WordU64.rshift = _import INLINE : Word64.t * Word32.t -> Word64.t WordU64.subCheckP = _import INLINE : Word64.t * Word64.t -> Bool.t WordU8.addCheckP = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.extdToWord16 = _import INLINE : Word8.t -> Word16.t WordU8.extdToWord32 = _import INLINE : Word8.t -> Word32.t WordU8.extdToWord64 = _import INLINE : Word8.t -> Word64.t WordU8.extdToWord8 = _import INLINE : Word8.t -> Word8.t WordU8.ge = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.gt = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.le = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.lt = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.mul = _import INLINE : Word8.t * Word8.t -> Word8.t WordU8.mulCheckP = _import INLINE : Word8.t * Word8.t -> Bool.t WordU8.negCheckP = _import INLINE : Word8.t -> Bool.t WordU8.quot = _import INLINE : Word8.t * Word8.t -> Word8.t WordU8.rem = _import INLINE : Word8.t * Word8.t -> Word8.t WordU8.rndToReal32 = _import : Word8.t -> Real32.t WordU8.rndToReal64 = _import : Word8.t -> Real64.t WordU8.rshift = _import INLINE : Word8.t * Word32.t -> Word8.t WordU8.subCheckP = _import INLINE : Word8.t * Word8.t -> Bool.t mlton-20210117+dfsg/runtime/gen/basis-ffi.h000066400000000000000000001722531416264345000203100ustar00rootroot00000000000000/* This file is automatically generated. Do not edit. */ #ifndef _MLTON_BASIS_FFI_H_ #define _MLTON_BASIS_FFI_H_ PRIVATE extern C_Int_t CommandLine_argc; PRIVATE extern C_StringArray_t CommandLine_argv; PRIVATE extern C_String_t CommandLine_commandName; PRIVATE C_String_t Cygwin_toFullWindowsPath(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t)); PRIVATE C_Double_t Date_localOffset(void); PRIVATE C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t)); PRIVATE C_Errno_t(C_Time_t) Date_mkTime(void); PRIVATE C_Size_t Date_strfTime(Array(Char8_t),C_Size_t,NullString8_t); PRIVATE C_Int_t Date_Tm_getHour(void); PRIVATE C_Int_t Date_Tm_getIsDst(void); PRIVATE C_Int_t Date_Tm_getMDay(void); PRIVATE C_Int_t Date_Tm_getMin(void); PRIVATE C_Int_t Date_Tm_getMon(void); PRIVATE C_Int_t Date_Tm_getSec(void); PRIVATE C_Int_t Date_Tm_getWDay(void); PRIVATE C_Int_t Date_Tm_getYDay(void); PRIVATE C_Int_t Date_Tm_getYear(void); PRIVATE void Date_Tm_setHour(C_Int_t); PRIVATE void Date_Tm_setIsDst(C_Int_t); PRIVATE void Date_Tm_setMDay(C_Int_t); PRIVATE void Date_Tm_setMin(C_Int_t); PRIVATE void Date_Tm_setMon(C_Int_t); PRIVATE void Date_Tm_setSec(C_Int_t); PRIVATE void Date_Tm_setWDay(C_Int_t); PRIVATE void Date_Tm_setYDay(C_Int_t); PRIVATE void Date_Tm_setYear(C_Int_t); PRIVATE C_Int_t IEEEReal_getRoundingMode(void); PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_UPWARD; PRIVATE C_Int_t IEEEReal_setRoundingMode(C_Int_t); PRIVATE void MinGW_clearNonBlock(C_Fd_t); PRIVATE C_Size_t MinGW_getTempPath(C_Size_t,Array(Char8_t)); PRIVATE void MinGW_setNonBlock(C_Fd_t); PRIVATE __attribute__((noreturn)) void MLton_bug(String8_t); PRIVATE extern const C_Int_t MLton_Itimer_PROF; PRIVATE extern const C_Int_t MLton_Itimer_REAL; PRIVATE C_Errno_t(C_Int_t) MLton_Itimer_set(C_Int_t,C_Time_t,C_SUSeconds_t,C_Time_t,C_SUSeconds_t); PRIVATE extern const C_Int_t MLton_Itimer_VIRTUAL; PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawne(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawnp(NullString8_t,Array(NullString8_t)); PRIVATE extern const C_Int_t MLton_Rlimit_AS; PRIVATE extern const C_Int_t MLton_Rlimit_CORE; PRIVATE extern const C_Int_t MLton_Rlimit_CPU; PRIVATE extern const C_Int_t MLton_Rlimit_DATA; PRIVATE extern const C_Int_t MLton_Rlimit_FSIZE; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_get(C_Int_t); PRIVATE C_RLim_t MLton_Rlimit_getHard(void); PRIVATE C_RLim_t MLton_Rlimit_getSoft(void); PRIVATE extern const C_RLim_t MLton_Rlimit_INFINITY; PRIVATE extern const C_Int_t MLton_Rlimit_MEMLOCK; PRIVATE extern const C_Int_t MLton_Rlimit_NOFILE; PRIVATE extern const C_Int_t MLton_Rlimit_NPROC; PRIVATE extern const C_Int_t MLton_Rlimit_RSS; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_set(C_Int_t,C_RLim_t,C_RLim_t); PRIVATE extern const C_Int_t MLton_Rlimit_STACK; PRIVATE C_Time_t MLton_Rusage_children_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_children_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_utime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_utime_usec(void); PRIVATE void MLton_Rusage_getrusage(GCState_t); PRIVATE C_Time_t MLton_Rusage_self_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_self_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_utime_usec(void); PRIVATE void MLton_Syslog_closelog(void); PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_AUTH; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_CRON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_DAEMON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_KERN; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LPR; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_MAIL; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_NEWS; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_USER; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_UUCP; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_CONS; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PERROR; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PID; PRIVATE void MLton_Syslog_openlog(NullString8_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ALERT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_CRIT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_DEBUG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_EMERG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ERR; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_INFO; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_NOTICE; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_WARNING; PRIVATE void MLton_Syslog_syslog(C_Int_t,NullString8_t); PRIVATE Word32_t Net_htonl(Word32_t); PRIVATE Word16_t Net_htons(Word16_t); PRIVATE Word32_t Net_ntohl(Word32_t); PRIVATE Word16_t Net_ntohs(Word16_t); PRIVATE C_Int_t NetHostDB_getByAddress(Vector(Word8_t),C_Socklen_t); PRIVATE C_Int_t NetHostDB_getByName(NullString8_t); PRIVATE void NetHostDB_getEntryAddrsN(C_Int_t,Array(Word8_t)); PRIVATE C_Int_t NetHostDB_getEntryAddrsNum(void); PRIVATE C_Int_t NetHostDB_getEntryAddrType(void); PRIVATE C_String_t NetHostDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetHostDB_getEntryAliasesNum(void); PRIVATE C_Int_t NetHostDB_getEntryLength(void); PRIVATE C_String_t NetHostDB_getEntryName(void); PRIVATE C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t),C_Size_t); PRIVATE extern const C_Int_t NetHostDB_INADDR_ANY; PRIVATE extern const C_Size_t NetHostDB_inAddrSize; PRIVATE C_Int_t NetProtDB_getByName(NullString8_t); PRIVATE C_Int_t NetProtDB_getByNumber(C_Int_t); PRIVATE C_String_t NetProtDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetProtDB_getEntryAliasesNum(void); PRIVATE C_String_t NetProtDB_getEntryName(void); PRIVATE C_Int_t NetProtDB_getEntryProto(void); PRIVATE C_Int_t NetServDB_getByName(NullString8_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByNameNull(NullString8_t); PRIVATE C_Int_t NetServDB_getByPort(C_Int_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByPortNull(C_Int_t); PRIVATE C_String_t NetServDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetServDB_getEntryAliasesNum(void); PRIVATE C_String_t NetServDB_getEntryName(void); PRIVATE C_Int_t NetServDB_getEntryPort(void); PRIVATE C_String_t NetServDB_getEntryProto(void); PRIVATE C_Errno_t(C_Int_t) OS_IO_poll(Vector(C_Fd_t),Vector(C_Short_t),C_NFds_t,C_Int_t,Array(C_Short_t)); PRIVATE extern const C_Short_t OS_IO_POLLIN; PRIVATE extern const C_Short_t OS_IO_POLLOUT; PRIVATE extern const C_Short_t OS_IO_POLLPRI; PRIVATE void Posix_Error_clearErrno(void); PRIVATE extern const C_Int_t Posix_Error_E2BIG; PRIVATE extern const C_Int_t Posix_Error_EACCES; PRIVATE extern const C_Int_t Posix_Error_EADDRINUSE; PRIVATE extern const C_Int_t Posix_Error_EADDRNOTAVAIL; PRIVATE extern const C_Int_t Posix_Error_EAFNOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EAGAIN; PRIVATE extern const C_Int_t Posix_Error_EALREADY; PRIVATE extern const C_Int_t Posix_Error_EBADF; PRIVATE extern const C_Int_t Posix_Error_EBADMSG; PRIVATE extern const C_Int_t Posix_Error_EBUSY; PRIVATE extern const C_Int_t Posix_Error_ECANCELED; PRIVATE extern const C_Int_t Posix_Error_ECHILD; PRIVATE extern const C_Int_t Posix_Error_ECONNABORTED; PRIVATE extern const C_Int_t Posix_Error_ECONNREFUSED; PRIVATE extern const C_Int_t Posix_Error_ECONNRESET; PRIVATE extern const C_Int_t Posix_Error_EDEADLK; PRIVATE extern const C_Int_t Posix_Error_EDESTADDRREQ; PRIVATE extern const C_Int_t Posix_Error_EDOM; PRIVATE extern const C_Int_t Posix_Error_EDQUOT; PRIVATE extern const C_Int_t Posix_Error_EEXIST; PRIVATE extern const C_Int_t Posix_Error_EFAULT; PRIVATE extern const C_Int_t Posix_Error_EFBIG; PRIVATE extern const C_Int_t Posix_Error_EHOSTUNREACH; PRIVATE extern const C_Int_t Posix_Error_EIDRM; PRIVATE extern const C_Int_t Posix_Error_EILSEQ; PRIVATE extern const C_Int_t Posix_Error_EINPROGRESS; PRIVATE extern const C_Int_t Posix_Error_EINTR; PRIVATE extern const C_Int_t Posix_Error_EINVAL; PRIVATE extern const C_Int_t Posix_Error_EIO; PRIVATE extern const C_Int_t Posix_Error_EISCONN; PRIVATE extern const C_Int_t Posix_Error_EISDIR; PRIVATE extern const C_Int_t Posix_Error_ELOOP; PRIVATE extern const C_Int_t Posix_Error_EMFILE; PRIVATE extern const C_Int_t Posix_Error_EMLINK; PRIVATE extern const C_Int_t Posix_Error_EMSGSIZE; PRIVATE extern const C_Int_t Posix_Error_EMULTIHOP; PRIVATE extern const C_Int_t Posix_Error_ENAMETOOLONG; PRIVATE extern const C_Int_t Posix_Error_ENETDOWN; PRIVATE extern const C_Int_t Posix_Error_ENETRESET; PRIVATE extern const C_Int_t Posix_Error_ENETUNREACH; PRIVATE extern const C_Int_t Posix_Error_ENFILE; PRIVATE extern const C_Int_t Posix_Error_ENOBUFS; PRIVATE extern const C_Int_t Posix_Error_ENODATA; PRIVATE extern const C_Int_t Posix_Error_ENODEV; PRIVATE extern const C_Int_t Posix_Error_ENOENT; PRIVATE extern const C_Int_t Posix_Error_ENOEXEC; PRIVATE extern const C_Int_t Posix_Error_ENOLCK; PRIVATE extern const C_Int_t Posix_Error_ENOLINK; PRIVATE extern const C_Int_t Posix_Error_ENOMEM; PRIVATE extern const C_Int_t Posix_Error_ENOMSG; PRIVATE extern const C_Int_t Posix_Error_ENOPROTOOPT; PRIVATE extern const C_Int_t Posix_Error_ENOSPC; PRIVATE extern const C_Int_t Posix_Error_ENOSR; PRIVATE extern const C_Int_t Posix_Error_ENOSTR; PRIVATE extern const C_Int_t Posix_Error_ENOSYS; PRIVATE extern const C_Int_t Posix_Error_ENOTCONN; PRIVATE extern const C_Int_t Posix_Error_ENOTDIR; PRIVATE extern const C_Int_t Posix_Error_ENOTEMPTY; PRIVATE extern const C_Int_t Posix_Error_ENOTSOCK; PRIVATE extern const C_Int_t Posix_Error_ENOTSUP; PRIVATE extern const C_Int_t Posix_Error_ENOTTY; PRIVATE extern const C_Int_t Posix_Error_ENXIO; PRIVATE extern const C_Int_t Posix_Error_EOPNOTSUPP; PRIVATE extern const C_Int_t Posix_Error_EOVERFLOW; PRIVATE extern const C_Int_t Posix_Error_EPERM; PRIVATE extern const C_Int_t Posix_Error_EPIPE; PRIVATE extern const C_Int_t Posix_Error_EPROTO; PRIVATE extern const C_Int_t Posix_Error_EPROTONOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EPROTOTYPE; PRIVATE extern const C_Int_t Posix_Error_ERANGE; PRIVATE extern const C_Int_t Posix_Error_EROFS; PRIVATE extern const C_Int_t Posix_Error_ESPIPE; PRIVATE extern const C_Int_t Posix_Error_ESRCH; PRIVATE extern const C_Int_t Posix_Error_ESTALE; PRIVATE extern const C_Int_t Posix_Error_ETIME; PRIVATE extern const C_Int_t Posix_Error_ETIMEDOUT; PRIVATE extern const C_Int_t Posix_Error_ETXTBSY; PRIVATE extern const C_Int_t Posix_Error_EWOULDBLOCK; PRIVATE extern const C_Int_t Posix_Error_EXDEV; PRIVATE C_Int_t Posix_Error_getErrno(void); PRIVATE C_String_t Posix_Error_strError(C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_A_F_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_R_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_W_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_X_OK; PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_access(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chmod(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chown(NullString8_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir(C_DirP_t); PRIVATE C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir(NullString8_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir(C_DirP_t); PRIVATE void Posix_FileSys_Dirstream_rewindDir(C_DirP_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchmod(C_Fd_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchown(C_Fd_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_fpathconf(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_ftruncate(C_Fd_t,C_Off_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_getcwd(Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_link(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkdir(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkfifo(NullString8_t,C_Mode_t); PRIVATE extern const C_Int_t Posix_FileSys_O_APPEND; PRIVATE extern const C_Int_t Posix_FileSys_O_BINARY; PRIVATE extern const C_Int_t Posix_FileSys_O_CREAT; PRIVATE extern const C_Int_t Posix_FileSys_O_DSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_EXCL; PRIVATE extern const C_Int_t Posix_FileSys_O_NOCTTY; PRIVATE extern const C_Int_t Posix_FileSys_O_NONBLOCK; PRIVATE extern const C_Int_t Posix_FileSys_O_RDONLY; PRIVATE extern const C_Int_t Posix_FileSys_O_RDWR; PRIVATE extern const C_Int_t Posix_FileSys_O_RSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_SYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_TEXT; PRIVATE extern const C_Int_t Posix_FileSys_O_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_O_WRONLY; PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open2(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open3(NullString8_t,C_Int_t,C_Mode_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_pathconf(NullString8_t,C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN; PRIVATE extern const C_Int_t Posix_FileSys_PC_ASYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED; PRIVATE extern const C_Int_t Posix_FileSys_PC_FILESIZEBITS; PRIVATE extern const C_Int_t Posix_FileSys_PC_LINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_CANON; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_INPUT; PRIVATE extern const C_Int_t Posix_FileSys_PC_NAME_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_NO_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_PC_PATH_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_PIPE_BUF; PRIVATE extern const C_Int_t Posix_FileSys_PC_PRIO_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYMLINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS; PRIVATE extern const C_Int_t Posix_FileSys_PC_VDISABLE; PRIVATE C_Errno_t(C_SSize_t) Posix_FileSys_readlink(NullString8_t,Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rename(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rmdir(NullString8_t); PRIVATE extern const C_Mode_t Posix_FileSys_S_IFBLK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFCHR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFDIR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFIFO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFLNK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFMT; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFREG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFSOCK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IROTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXU; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISGID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISUID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISVTX; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXUSR; PRIVATE C_Int_t Posix_FileSys_ST_isBlk(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isChr(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isDir(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isFIFO(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isLink(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isReg(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isSock(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat(C_Fd_t); PRIVATE C_Time_t Posix_FileSys_Stat_getATime(void); PRIVATE C_Time_t Posix_FileSys_Stat_getCTime(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getDev(void); PRIVATE C_GId_t Posix_FileSys_Stat_getGId(void); PRIVATE C_INo_t Posix_FileSys_Stat_getINo(void); PRIVATE C_Mode_t Posix_FileSys_Stat_getMode(void); PRIVATE C_Time_t Posix_FileSys_Stat_getMTime(void); PRIVATE C_NLink_t Posix_FileSys_Stat_getNLink(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getRDev(void); PRIVATE C_Off_t Posix_FileSys_Stat_getSize(void); PRIVATE C_UId_t Posix_FileSys_Stat_getUId(void); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_symlink(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_truncate(NullString8_t,C_Off_t); PRIVATE C_Mode_t Posix_FileSys_umask(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_unlink(NullString8_t); PRIVATE void Posix_FileSys_Utimbuf_setAcTime(C_Time_t); PRIVATE void Posix_FileSys_Utimbuf_setModTime(C_Time_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_close(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup2(C_Fd_t,C_Fd_t); PRIVATE extern const C_Int_t Posix_IO_F_DUPFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFL; PRIVATE extern const C_Int_t Posix_IO_F_GETOWN; PRIVATE extern const C_Int_t Posix_IO_F_SETFD; PRIVATE extern const C_Int_t Posix_IO_F_SETFL; PRIVATE extern const C_Int_t Posix_IO_F_SETOWN; PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl2(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl3(C_Fd_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_FD_CLOEXEC; PRIVATE extern const C_Int_t Posix_IO_FLock_F_GETLK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_RDLCK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLKW; PRIVATE extern const C_Short_t Posix_IO_FLock_F_UNLCK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_WRLCK; PRIVATE C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl(C_Fd_t,C_Int_t); PRIVATE C_Off_t Posix_IO_FLock_getLen(void); PRIVATE C_PId_t Posix_IO_FLock_getPId(void); PRIVATE C_Off_t Posix_IO_FLock_getStart(void); PRIVATE C_Short_t Posix_IO_FLock_getType(void); PRIVATE C_Short_t Posix_IO_FLock_getWhence(void); PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_CUR; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_END; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_SET; PRIVATE void Posix_IO_FLock_setLen(C_Off_t); PRIVATE void Posix_IO_FLock_setPId(C_PId_t); PRIVATE void Posix_IO_FLock_setStart(C_Off_t); PRIVATE void Posix_IO_FLock_setType(C_Short_t); PRIVATE void Posix_IO_FLock_setWhence(C_Short_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fsync(C_Fd_t); PRIVATE C_Errno_t(C_Off_t) Posix_IO_lseek(C_Fd_t,C_Off_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_O_ACCMODE; PRIVATE C_Errno_t(C_Int_t) Posix_IO_pipe(Array(C_Fd_t)); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readChar8(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readWord8(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE extern const C_Int_t Posix_IO_SEEK_CUR; PRIVATE extern const C_Int_t Posix_IO_SEEK_END; PRIVATE extern const C_Int_t Posix_IO_SEEK_SET; PRIVATE void Posix_IO_setbin(C_Fd_t); PRIVATE void Posix_IO_settext(C_Fd_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec(C_Fd_t,Vector(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec(C_Fd_t,Vector(Word8_t),C_Int_t,C_Size_t); PRIVATE C_String_t Posix_ProcEnv_ctermid(void); PRIVATE extern C_StringArray_t Posix_ProcEnv_environ; PRIVATE C_GId_t Posix_ProcEnv_getegid(void); PRIVATE C_String_t Posix_ProcEnv_getenv(NullString8_t); PRIVATE C_UId_t Posix_ProcEnv_geteuid(void); PRIVATE C_GId_t Posix_ProcEnv_getgid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups(C_Int_t,Array(C_GId_t)); PRIVATE C_Int_t Posix_ProcEnv_getgroupsN(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_getlogin(void); PRIVATE C_PId_t Posix_ProcEnv_getpgrp(void); PRIVATE C_PId_t Posix_ProcEnv_getpid(void); PRIVATE C_PId_t Posix_ProcEnv_getppid(void); PRIVATE C_UId_t Posix_ProcEnv_getuid(void); PRIVATE C_Int_t Posix_ProcEnv_isatty(C_Fd_t); PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_BIND; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_SW_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_UPE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ARG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AVPHYS_PAGES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BARRIERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CHILD_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLK_TCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_FSYNC; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IOV_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IPV6; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LINE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_CONF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NPROCESSORS_ONLN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGESIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PHYS_PAGES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REGEXP; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SAVED_IDS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEMAPHORES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHELL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPAWN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_STREAM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMEOUTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_LOG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION; PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setenv(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups(C_Int_t,Vector(C_GId_t)); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid(C_PId_t,C_PId_t); PRIVATE C_Errno_t(C_PId_t) Posix_ProcEnv_setsid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setuid(C_UId_t); PRIVATE C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf(C_Int_t); PRIVATE C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCUTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getUTime(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_ttyname(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_uname(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getMachine(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getNodeName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getRelease(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getSysName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getVersion(void); PRIVATE C_UInt_t Posix_Process_alarm(C_UInt_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_exece(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_execp(NullString8_t,Array(NullString8_t)); PRIVATE __attribute__((noreturn)) void Posix_Process_exit(C_Status_t); PRIVATE C_Int_t Posix_Process_exitStatus(C_Status_t); PRIVATE C_Errno_t(C_PId_t) Posix_Process_fork(void); PRIVATE C_Int_t Posix_Process_ifExited(C_Status_t); PRIVATE C_Int_t Posix_Process_ifSignaled(C_Status_t); PRIVATE C_Int_t Posix_Process_ifStopped(C_Status_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_kill(C_PId_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_nanosleep(Ref(C_Time_t),Ref(C_Long_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_pause(void); PRIVATE C_UInt_t Posix_Process_sleep(C_UInt_t); PRIVATE C_Signal_t Posix_Process_stopSig(C_Status_t); PRIVATE C_Errno_t(C_Status_t) Posix_Process_system(NullString8_t); PRIVATE C_Signal_t Posix_Process_termSig(C_Status_t); PRIVATE extern const C_Int_t Posix_Process_W_NOHANG; PRIVATE extern const C_Int_t Posix_Process_W_UNTRACED; PRIVATE C_Errno_t(C_PId_t) Posix_Process_waitpid(C_PId_t,Ref(C_Status_t),C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_default(GCState_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_handlee(GCState_t,C_Signal_t); PRIVATE void Posix_Signal_handleGC(GCState_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_ignore(GCState_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isDefault(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isIgnore(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Int_t Posix_Signal_isPending(GCState_t,C_Signal_t); PRIVATE C_Int_t Posix_Signal_isPendingGC(GCState_t); PRIVATE extern const C_Int_t Posix_Signal_NSIG; PRIVATE void Posix_Signal_resetPending(GCState_t); PRIVATE extern const C_Int_t Posix_Signal_SIG_BLOCK; PRIVATE extern const C_Int_t Posix_Signal_SIG_SETMASK; PRIVATE extern const C_Int_t Posix_Signal_SIG_UNBLOCK; PRIVATE extern const C_Signal_t Posix_Signal_SIGABRT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigaddset(Array(Word8_t),C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGBUS; PRIVATE extern const C_Signal_t Posix_Signal_SIGCHLD; PRIVATE extern const C_Signal_t Posix_Signal_SIGCONT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigdelset(Array(Word8_t),C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigemptyset(Array(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigfillset(Array(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGFPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGHUP; PRIVATE extern const C_Signal_t Posix_Signal_SIGILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGINT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigismember(Vector(Word8_t),C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGKILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGPIPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGPOLL; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigprocmask(C_Int_t,Vector(Word8_t),Array(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGPROF; PRIVATE extern const C_Signal_t Posix_Signal_SIGQUIT; PRIVATE extern const C_Signal_t Posix_Signal_SIGSEGV; PRIVATE extern const C_Size_t Posix_Signal_sigSetLen; PRIVATE extern const C_Signal_t Posix_Signal_SIGSTOP; PRIVATE void Posix_Signal_sigsuspend(Vector(Word8_t)); PRIVATE extern const C_Signal_t Posix_Signal_SIGSYS; PRIVATE extern const C_Signal_t Posix_Signal_SIGTERM; PRIVATE extern const C_Signal_t Posix_Signal_SIGTRAP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTSTP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTIN; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTOU; PRIVATE extern const C_Signal_t Posix_Signal_SIGURG; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR1; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR2; PRIVATE extern const C_Signal_t Posix_Signal_SIGVTALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGXCPU; PRIVATE extern const C_Signal_t Posix_Signal_SIGXFSZ; PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_GId_t); PRIVATE C_GId_t Posix_SysDB_Group_getGId(void); PRIVATE C_StringArray_t Posix_SysDB_Group_getMem(void); PRIVATE C_String_t Posix_SysDB_Group_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getDir(void); PRIVATE C_GId_t Posix_SysDB_Passwd_getGId(void); PRIVATE C_String_t Posix_SysDB_Passwd_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getShell(void); PRIVATE C_UId_t Posix_SysDB_Passwd_getUId(void); PRIVATE extern const C_Speed_t Posix_TTY_B0; PRIVATE extern const C_Speed_t Posix_TTY_B110; PRIVATE extern const C_Speed_t Posix_TTY_B1200; PRIVATE extern const C_Speed_t Posix_TTY_B134; PRIVATE extern const C_Speed_t Posix_TTY_B150; PRIVATE extern const C_Speed_t Posix_TTY_B1800; PRIVATE extern const C_Speed_t Posix_TTY_B19200; PRIVATE extern const C_Speed_t Posix_TTY_B200; PRIVATE extern const C_Speed_t Posix_TTY_B2400; PRIVATE extern const C_Speed_t Posix_TTY_B300; PRIVATE extern const C_Speed_t Posix_TTY_B38400; PRIVATE extern const C_Speed_t Posix_TTY_B4800; PRIVATE extern const C_Speed_t Posix_TTY_B50; PRIVATE extern const C_Speed_t Posix_TTY_B600; PRIVATE extern const C_Speed_t Posix_TTY_B75; PRIVATE extern const C_Speed_t Posix_TTY_B9600; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CLOCAL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CREAD; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS5; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS6; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS7; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS8; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSIZE; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSTOPB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_HUPCL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARENB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARODD; PRIVATE extern const C_TCFlag_t Posix_TTY_I_BRKINT; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ICRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNBRK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNPAR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INPCK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ISTRIP; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXANY; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXOFF; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXON; PRIVATE extern const C_TCFlag_t Posix_TTY_I_PARMRK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHO; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOE; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHONL; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ICANON; PRIVATE extern const C_TCFlag_t Posix_TTY_L_IEXTEN; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ISIG; PRIVATE extern const C_TCFlag_t Posix_TTY_L_NOFLSH; PRIVATE extern const C_TCFlag_t Posix_TTY_L_TOSTOP; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BSDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CRDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FFDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NLDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OCRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OFILL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLRET; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONOCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OPOST; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TABDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VTDLY; PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_drain(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flow(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flush(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_getattr(C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setattr(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp(C_Fd_t,C_PId_t); PRIVATE extern const C_Int_t Posix_TTY_TC_TCIFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCION; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOON; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSADRAIN; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSAFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSANOW; PRIVATE C_Speed_t Posix_TTY_Termios_cfGetISpeed(void); PRIVATE C_Speed_t Posix_TTY_Termios_cfGetOSpeed(void); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed(C_Speed_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed(C_Speed_t); PRIVATE void Posix_TTY_Termios_getCC(Array(C_CC_t)); PRIVATE C_TCFlag_t Posix_TTY_Termios_getCFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getIFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getLFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getOFlag(void); PRIVATE void Posix_TTY_Termios_setCC(Array(C_CC_t)); PRIVATE void Posix_TTY_Termios_setCFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setIFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setLFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setOFlag(C_TCFlag_t); PRIVATE extern const C_Int_t Posix_TTY_V_NCCS; PRIVATE extern const C_Int_t Posix_TTY_V_VEOF; PRIVATE extern const C_Int_t Posix_TTY_V_VEOL; PRIVATE extern const C_Int_t Posix_TTY_V_VERASE; PRIVATE extern const C_Int_t Posix_TTY_V_VINTR; PRIVATE extern const C_Int_t Posix_TTY_V_VKILL; PRIVATE extern const C_Int_t Posix_TTY_V_VMIN; PRIVATE extern const C_Int_t Posix_TTY_V_VQUIT; PRIVATE extern const C_Int_t Posix_TTY_V_VSTART; PRIVATE extern const C_Int_t Posix_TTY_V_VSTOP; PRIVATE extern const C_Int_t Posix_TTY_V_VSUSP; PRIVATE extern const C_Int_t Posix_TTY_V_VTIME; PRIVATE INLINE Real32_t Real32_abs(Real32_t); PRIVATE INLINE Real32_t Real32_add(Real32_t,Real32_t); PRIVATE INLINE Word32_t Real32_castToWord32(Real32_t); PRIVATE INLINE Real32_t Real32_div(Real32_t,Real32_t); PRIVATE INLINE Bool_t Real32_equal(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_fetch(Ref(Real32_t)); PRIVATE INLINE Real32_t Real32_frexp(Real32_t,Ref(C_Int_t)); PRIVATE C_String_t Real32_gdtoa(Real32_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE INLINE Real32_t Real32_ldexp(Real32_t,C_Int_t); PRIVATE INLINE Bool_t Real32_le(Real32_t,Real32_t); PRIVATE INLINE Bool_t Real32_lt(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_acos(Real32_t); PRIVATE INLINE Real32_t Real32_Math_asin(Real32_t); PRIVATE INLINE Real32_t Real32_Math_atan(Real32_t); PRIVATE INLINE Real32_t Real32_Math_atan2(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_cos(Real32_t); PRIVATE INLINE Real32_t Real32_Math_cosh(Real32_t); PRIVATE INLINE Real32_t Real32_Math_exp(Real32_t); PRIVATE INLINE Real32_t Real32_Math_ln(Real32_t); PRIVATE INLINE Real32_t Real32_Math_log10(Real32_t); PRIVATE INLINE Real32_t Real32_Math_pow(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_Math_sin(Real32_t); PRIVATE INLINE Real32_t Real32_Math_sinh(Real32_t); PRIVATE INLINE Real32_t Real32_Math_sqrt(Real32_t); PRIVATE INLINE Real32_t Real32_Math_tan(Real32_t); PRIVATE INLINE Real32_t Real32_Math_tanh(Real32_t); PRIVATE INLINE Real32_t Real32_modf(Real32_t,Ref(Real32_t)); PRIVATE INLINE void Real32_move(Ref(Real32_t),Ref(Real32_t)); PRIVATE INLINE Real32_t Real32_mul(Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_muladd(Real32_t,Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_mulsub(Real32_t,Real32_t,Real32_t); PRIVATE INLINE Real32_t Real32_neg(Real32_t); PRIVATE INLINE Real32_t Real32_realCeil(Real32_t); PRIVATE INLINE Real32_t Real32_realFloor(Real32_t); PRIVATE INLINE Real32_t Real32_realTrunc(Real32_t); PRIVATE INLINE Real32_t Real32_rndToReal32(Real32_t); PRIVATE INLINE Real64_t Real32_rndToReal64(Real32_t); PRIVATE INLINE Int16_t Real32_rndToWordS16(Real32_t); PRIVATE INLINE Int32_t Real32_rndToWordS32(Real32_t); PRIVATE INLINE Int64_t Real32_rndToWordS64(Real32_t); PRIVATE INLINE Int8_t Real32_rndToWordS8(Real32_t); PRIVATE INLINE Word16_t Real32_rndToWordU16(Real32_t); PRIVATE INLINE Word32_t Real32_rndToWordU32(Real32_t); PRIVATE INLINE Word64_t Real32_rndToWordU64(Real32_t); PRIVATE INLINE Word8_t Real32_rndToWordU8(Real32_t); PRIVATE INLINE Real32_t Real32_round(Real32_t); PRIVATE INLINE void Real32_store(Ref(Real32_t),Real32_t); PRIVATE Real32_t Real32_strtor(NullString8_t,C_Int_t); PRIVATE INLINE Real32_t Real32_sub(Real32_t,Real32_t); PRIVATE INLINE Real64_t Real64_abs(Real64_t); PRIVATE INLINE Real64_t Real64_add(Real64_t,Real64_t); PRIVATE INLINE Word64_t Real64_castToWord64(Real64_t); PRIVATE INLINE Real64_t Real64_div(Real64_t,Real64_t); PRIVATE INLINE Bool_t Real64_equal(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_fetch(Ref(Real64_t)); PRIVATE INLINE Real64_t Real64_frexp(Real64_t,Ref(C_Int_t)); PRIVATE C_String_t Real64_gdtoa(Real64_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE INLINE Real64_t Real64_ldexp(Real64_t,C_Int_t); PRIVATE INLINE Bool_t Real64_le(Real64_t,Real64_t); PRIVATE INLINE Bool_t Real64_lt(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_acos(Real64_t); PRIVATE INLINE Real64_t Real64_Math_asin(Real64_t); PRIVATE INLINE Real64_t Real64_Math_atan(Real64_t); PRIVATE INLINE Real64_t Real64_Math_atan2(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_cos(Real64_t); PRIVATE INLINE Real64_t Real64_Math_cosh(Real64_t); PRIVATE INLINE Real64_t Real64_Math_exp(Real64_t); PRIVATE INLINE Real64_t Real64_Math_ln(Real64_t); PRIVATE INLINE Real64_t Real64_Math_log10(Real64_t); PRIVATE INLINE Real64_t Real64_Math_pow(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_Math_sin(Real64_t); PRIVATE INLINE Real64_t Real64_Math_sinh(Real64_t); PRIVATE INLINE Real64_t Real64_Math_sqrt(Real64_t); PRIVATE INLINE Real64_t Real64_Math_tan(Real64_t); PRIVATE INLINE Real64_t Real64_Math_tanh(Real64_t); PRIVATE INLINE Real64_t Real64_modf(Real64_t,Ref(Real64_t)); PRIVATE INLINE void Real64_move(Ref(Real64_t),Ref(Real64_t)); PRIVATE INLINE Real64_t Real64_mul(Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_muladd(Real64_t,Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_mulsub(Real64_t,Real64_t,Real64_t); PRIVATE INLINE Real64_t Real64_neg(Real64_t); PRIVATE INLINE Real64_t Real64_realCeil(Real64_t); PRIVATE INLINE Real64_t Real64_realFloor(Real64_t); PRIVATE INLINE Real64_t Real64_realTrunc(Real64_t); PRIVATE INLINE Real32_t Real64_rndToReal32(Real64_t); PRIVATE INLINE Real64_t Real64_rndToReal64(Real64_t); PRIVATE INLINE Int16_t Real64_rndToWordS16(Real64_t); PRIVATE INLINE Int32_t Real64_rndToWordS32(Real64_t); PRIVATE INLINE Int64_t Real64_rndToWordS64(Real64_t); PRIVATE INLINE Int8_t Real64_rndToWordS8(Real64_t); PRIVATE INLINE Word16_t Real64_rndToWordU16(Real64_t); PRIVATE INLINE Word32_t Real64_rndToWordU32(Real64_t); PRIVATE INLINE Word64_t Real64_rndToWordU64(Real64_t); PRIVATE INLINE Word8_t Real64_rndToWordU8(Real64_t); PRIVATE INLINE Real64_t Real64_round(Real64_t); PRIVATE INLINE void Real64_store(Ref(Real64_t),Real64_t); PRIVATE Real64_t Real64_strtor(NullString8_t,C_Int_t); PRIVATE INLINE Real64_t Real64_sub(Real64_t,Real64_t); PRIVATE C_Errno_t(C_Int_t) Socket_accept(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE extern const C_Int_t Socket_AF_INET; PRIVATE extern const C_Int_t Socket_AF_INET6; PRIVATE extern const C_Int_t Socket_AF_UNIX; PRIVATE extern const C_Int_t Socket_AF_UNSPEC; PRIVATE C_Errno_t(C_Int_t) Socket_bind(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_close(C_Sock_t); PRIVATE C_Errno_t(C_Int_t) Socket_connect(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getATMARK(C_Sock_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getNREAD(C_Sock_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getPeerName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Int(C_Sock_t,C_Int_t,C_Int_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOptC_Linger(C_Sock_t,C_Int_t,C_Int_t,Ref(C_Int_t),Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Int(C_Sock_t,C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOptC_Linger(C_Sock_t,C_Int_t,C_Int_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Socket_Ctl_SO_ACCEPTCONN; PRIVATE extern const C_Int_t Socket_Ctl_SO_BROADCAST; PRIVATE extern const C_Int_t Socket_Ctl_SO_DEBUG; PRIVATE extern const C_Int_t Socket_Ctl_SO_DONTROUTE; PRIVATE extern const C_Int_t Socket_Ctl_SO_ERROR; PRIVATE extern const C_Int_t Socket_Ctl_SO_KEEPALIVE; PRIVATE extern const C_Int_t Socket_Ctl_SO_LINGER; PRIVATE extern const C_Int_t Socket_Ctl_SO_OOBINLINE; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_REUSEADDR; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_TYPE; PRIVATE extern const C_Int_t Socket_Ctl_SOL_SOCKET; PRIVATE C_Int_t Socket_familyOfAddr(Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socket(C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socketPair(C_Int_t,C_Int_t,C_Int_t,Array(C_Int_t)); PRIVATE C_Time_t Socket_getTimeout_sec(void); PRIVATE C_SUSeconds_t Socket_getTimeout_usec(void); PRIVATE extern const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP; PRIVATE extern const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY; PRIVATE void Socket_INetSock_fromAddr(Vector(Word8_t)); PRIVATE void Socket_INetSock_getInAddr(Array(Word8_t)); PRIVATE Word16_t Socket_INetSock_getPort(void); PRIVATE void Socket_INetSock_toAddr(Vector(Word8_t),Word16_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_listen(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_MSG_CTRUNC; PRIVATE extern const C_Int_t Socket_MSG_DONTROUTE; PRIVATE extern const C_Int_t Socket_MSG_DONTWAIT; PRIVATE extern const C_Int_t Socket_MSG_EOR; PRIVATE extern const C_Int_t Socket_MSG_OOB; PRIVATE extern const C_Int_t Socket_MSG_PEEK; PRIVATE extern const C_Int_t Socket_MSG_TRUNC; PRIVATE extern const C_Int_t Socket_MSG_WAITALL; PRIVATE C_Errno_t(C_SSize_t) Socket_recv(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_recvFrom(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_select(Vector(C_Fd_t),Vector(C_Fd_t),Vector(C_Fd_t),Array(C_Int_t),Array(C_Int_t),Array(C_Int_t)); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArr(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArrTo(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVec(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVecTo(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE void Socket_setTimeout(C_Time_t,C_SUSeconds_t); PRIVATE void Socket_setTimeoutNull(void); PRIVATE extern const C_Int_t Socket_SHUT_RD; PRIVATE extern const C_Int_t Socket_SHUT_RDWR; PRIVATE extern const C_Int_t Socket_SHUT_WR; PRIVATE C_Errno_t(C_Int_t) Socket_shutdown(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_SOCK_DGRAM; PRIVATE extern const C_Int_t Socket_SOCK_RAW; PRIVATE extern const C_Int_t Socket_SOCK_SEQPACKET; PRIVATE extern const C_Int_t Socket_SOCK_STREAM; PRIVATE extern const C_Size_t Socket_sockAddrStorageLen; PRIVATE void Socket_UnixSock_fromAddr(Vector(Word8_t),Array(Char8_t),C_Size_t); PRIVATE C_Size_t Socket_UnixSock_pathLen(Vector(Word8_t)); PRIVATE void Socket_UnixSock_toAddr(NullString8_t,C_Size_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE void Stdio_print(String8_t); PRIVATE void Stdio_printStderr(String8_t); PRIVATE void Stdio_printStdout(String8_t); PRIVATE C_Int_t Time_getTimeOfDay(Ref(C_Time_t),Ref(C_SUSeconds_t)); PRIVATE C_Errno_t(C_PId_t) Windows_Process_create(NullString8_t,NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Windows_Process_createNull(NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Windows_Process_getexitcode(C_PId_t,Ref(C_Status_t)); PRIVATE C_Errno_t(C_Int_t) Windows_Process_terminate(C_PId_t,C_Signal_t); PRIVATE INLINE Word16_t Word16_add(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_andb(Word16_t,Word16_t); PRIVATE INLINE Bool_t Word16_equal(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_lshift(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_neg(Word16_t); PRIVATE INLINE Word16_t Word16_notb(Word16_t); PRIVATE INLINE Word16_t Word16_orb(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_rol(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_ror(Word16_t,Word32_t); PRIVATE INLINE Word16_t Word16_sub(Word16_t,Word16_t); PRIVATE INLINE Word16_t Word16_xorb(Word16_t,Word16_t); PRIVATE INLINE Word32_t Word32_add(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_andb(Word32_t,Word32_t); PRIVATE INLINE Real32_t Word32_castToReal32(Word32_t); PRIVATE INLINE Bool_t Word32_equal(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_lshift(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_neg(Word32_t); PRIVATE INLINE Word32_t Word32_notb(Word32_t); PRIVATE INLINE Word32_t Word32_orb(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_rol(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_ror(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_sub(Word32_t,Word32_t); PRIVATE INLINE Word32_t Word32_xorb(Word32_t,Word32_t); PRIVATE INLINE Word64_t Word64_add(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_andb(Word64_t,Word64_t); PRIVATE INLINE Real64_t Word64_castToReal64(Word64_t); PRIVATE INLINE Bool_t Word64_equal(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_fetch(Ref(Word64_t)); PRIVATE INLINE Word64_t Word64_lshift(Word64_t,Word32_t); PRIVATE INLINE void Word64_move(Ref(Word64_t),Ref(Word64_t)); PRIVATE INLINE Word64_t Word64_neg(Word64_t); PRIVATE INLINE Word64_t Word64_notb(Word64_t); PRIVATE INLINE Word64_t Word64_orb(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_rol(Word64_t,Word32_t); PRIVATE INLINE Word64_t Word64_ror(Word64_t,Word32_t); PRIVATE INLINE void Word64_store(Ref(Word64_t),Word64_t); PRIVATE INLINE Word64_t Word64_sub(Word64_t,Word64_t); PRIVATE INLINE Word64_t Word64_xorb(Word64_t,Word64_t); PRIVATE INLINE Word8_t Word8_add(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_andb(Word8_t,Word8_t); PRIVATE INLINE Bool_t Word8_equal(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_lshift(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_neg(Word8_t); PRIVATE INLINE Word8_t Word8_notb(Word8_t); PRIVATE INLINE Word8_t Word8_orb(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_rol(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_ror(Word8_t,Word32_t); PRIVATE INLINE Word8_t Word8_sub(Word8_t,Word8_t); PRIVATE INLINE Word8_t Word8_xorb(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordS16_addCheckP(Int16_t,Int16_t); PRIVATE INLINE Word16_t WordS16_extdToWord16(Int16_t); PRIVATE INLINE Word32_t WordS16_extdToWord32(Int16_t); PRIVATE INLINE Word64_t WordS16_extdToWord64(Int16_t); PRIVATE INLINE Word8_t WordS16_extdToWord8(Int16_t); PRIVATE INLINE Bool_t WordS16_ge(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_gt(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_le(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_lt(Int16_t,Int16_t); PRIVATE INLINE Int16_t WordS16_mul(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_mulCheckP(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS16_negCheckP(Int16_t); PRIVATE INLINE Int16_t WordS16_quot(Int16_t,Int16_t); PRIVATE INLINE Int16_t WordS16_rem(Int16_t,Int16_t); PRIVATE Real32_t WordS16_rndToReal32(Int16_t); PRIVATE Real64_t WordS16_rndToReal64(Int16_t); PRIVATE INLINE Int16_t WordS16_rshift(Int16_t,Word32_t); PRIVATE INLINE Bool_t WordS16_subCheckP(Int16_t,Int16_t); PRIVATE INLINE Bool_t WordS32_addCheckP(Int32_t,Int32_t); PRIVATE INLINE Word16_t WordS32_extdToWord16(Int32_t); PRIVATE INLINE Word32_t WordS32_extdToWord32(Int32_t); PRIVATE INLINE Word64_t WordS32_extdToWord64(Int32_t); PRIVATE INLINE Word8_t WordS32_extdToWord8(Int32_t); PRIVATE INLINE Bool_t WordS32_ge(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_gt(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_le(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_lt(Int32_t,Int32_t); PRIVATE INLINE Int32_t WordS32_mul(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_mulCheckP(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS32_negCheckP(Int32_t); PRIVATE INLINE Int32_t WordS32_quot(Int32_t,Int32_t); PRIVATE INLINE Int32_t WordS32_rem(Int32_t,Int32_t); PRIVATE Real32_t WordS32_rndToReal32(Int32_t); PRIVATE Real64_t WordS32_rndToReal64(Int32_t); PRIVATE INLINE Int32_t WordS32_rshift(Int32_t,Word32_t); PRIVATE INLINE Bool_t WordS32_subCheckP(Int32_t,Int32_t); PRIVATE INLINE Bool_t WordS64_addCheckP(Int64_t,Int64_t); PRIVATE INLINE Word16_t WordS64_extdToWord16(Int64_t); PRIVATE INLINE Word32_t WordS64_extdToWord32(Int64_t); PRIVATE INLINE Word64_t WordS64_extdToWord64(Int64_t); PRIVATE INLINE Word8_t WordS64_extdToWord8(Int64_t); PRIVATE INLINE Bool_t WordS64_ge(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_gt(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_le(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_lt(Int64_t,Int64_t); PRIVATE INLINE Int64_t WordS64_mul(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_mulCheckP(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS64_negCheckP(Int64_t); PRIVATE INLINE Int64_t WordS64_quot(Int64_t,Int64_t); PRIVATE INLINE Int64_t WordS64_rem(Int64_t,Int64_t); PRIVATE Real32_t WordS64_rndToReal32(Int64_t); PRIVATE Real64_t WordS64_rndToReal64(Int64_t); PRIVATE INLINE Int64_t WordS64_rshift(Int64_t,Word32_t); PRIVATE INLINE Bool_t WordS64_subCheckP(Int64_t,Int64_t); PRIVATE INLINE Bool_t WordS8_addCheckP(Int8_t,Int8_t); PRIVATE INLINE Word16_t WordS8_extdToWord16(Int8_t); PRIVATE INLINE Word32_t WordS8_extdToWord32(Int8_t); PRIVATE INLINE Word64_t WordS8_extdToWord64(Int8_t); PRIVATE INLINE Word8_t WordS8_extdToWord8(Int8_t); PRIVATE INLINE Bool_t WordS8_ge(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_gt(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_le(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_lt(Int8_t,Int8_t); PRIVATE INLINE Int8_t WordS8_mul(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_mulCheckP(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordS8_negCheckP(Int8_t); PRIVATE INLINE Int8_t WordS8_quot(Int8_t,Int8_t); PRIVATE INLINE Int8_t WordS8_rem(Int8_t,Int8_t); PRIVATE Real32_t WordS8_rndToReal32(Int8_t); PRIVATE Real64_t WordS8_rndToReal64(Int8_t); PRIVATE INLINE Int8_t WordS8_rshift(Int8_t,Word32_t); PRIVATE INLINE Bool_t WordS8_subCheckP(Int8_t,Int8_t); PRIVATE INLINE Bool_t WordU16_addCheckP(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_extdToWord16(Word16_t); PRIVATE INLINE Word32_t WordU16_extdToWord32(Word16_t); PRIVATE INLINE Word64_t WordU16_extdToWord64(Word16_t); PRIVATE INLINE Word8_t WordU16_extdToWord8(Word16_t); PRIVATE INLINE Bool_t WordU16_ge(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_gt(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_le(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_lt(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_mul(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_mulCheckP(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU16_negCheckP(Word16_t); PRIVATE INLINE Word16_t WordU16_quot(Word16_t,Word16_t); PRIVATE INLINE Word16_t WordU16_rem(Word16_t,Word16_t); PRIVATE Real32_t WordU16_rndToReal32(Word16_t); PRIVATE Real64_t WordU16_rndToReal64(Word16_t); PRIVATE INLINE Word16_t WordU16_rshift(Word16_t,Word32_t); PRIVATE INLINE Bool_t WordU16_subCheckP(Word16_t,Word16_t); PRIVATE INLINE Bool_t WordU32_addCheckP(Word32_t,Word32_t); PRIVATE INLINE Word16_t WordU32_extdToWord16(Word32_t); PRIVATE INLINE Word32_t WordU32_extdToWord32(Word32_t); PRIVATE INLINE Word64_t WordU32_extdToWord64(Word32_t); PRIVATE INLINE Word8_t WordU32_extdToWord8(Word32_t); PRIVATE INLINE Bool_t WordU32_ge(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_gt(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_le(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_lt(Word32_t,Word32_t); PRIVATE INLINE Word32_t WordU32_mul(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_mulCheckP(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_negCheckP(Word32_t); PRIVATE INLINE Word32_t WordU32_quot(Word32_t,Word32_t); PRIVATE INLINE Word32_t WordU32_rem(Word32_t,Word32_t); PRIVATE Real32_t WordU32_rndToReal32(Word32_t); PRIVATE Real64_t WordU32_rndToReal64(Word32_t); PRIVATE INLINE Word32_t WordU32_rshift(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU32_subCheckP(Word32_t,Word32_t); PRIVATE INLINE Bool_t WordU64_addCheckP(Word64_t,Word64_t); PRIVATE INLINE Word16_t WordU64_extdToWord16(Word64_t); PRIVATE INLINE Word32_t WordU64_extdToWord32(Word64_t); PRIVATE INLINE Word64_t WordU64_extdToWord64(Word64_t); PRIVATE INLINE Word8_t WordU64_extdToWord8(Word64_t); PRIVATE INLINE Bool_t WordU64_ge(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_gt(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_le(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_lt(Word64_t,Word64_t); PRIVATE INLINE Word64_t WordU64_mul(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_mulCheckP(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU64_negCheckP(Word64_t); PRIVATE INLINE Word64_t WordU64_quot(Word64_t,Word64_t); PRIVATE INLINE Word64_t WordU64_rem(Word64_t,Word64_t); PRIVATE Real32_t WordU64_rndToReal32(Word64_t); PRIVATE Real64_t WordU64_rndToReal64(Word64_t); PRIVATE INLINE Word64_t WordU64_rshift(Word64_t,Word32_t); PRIVATE INLINE Bool_t WordU64_subCheckP(Word64_t,Word64_t); PRIVATE INLINE Bool_t WordU8_addCheckP(Word8_t,Word8_t); PRIVATE INLINE Word16_t WordU8_extdToWord16(Word8_t); PRIVATE INLINE Word32_t WordU8_extdToWord32(Word8_t); PRIVATE INLINE Word64_t WordU8_extdToWord64(Word8_t); PRIVATE INLINE Word8_t WordU8_extdToWord8(Word8_t); PRIVATE INLINE Bool_t WordU8_ge(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_gt(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_le(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_lt(Word8_t,Word8_t); PRIVATE INLINE Word8_t WordU8_mul(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_mulCheckP(Word8_t,Word8_t); PRIVATE INLINE Bool_t WordU8_negCheckP(Word8_t); PRIVATE INLINE Word8_t WordU8_quot(Word8_t,Word8_t); PRIVATE INLINE Word8_t WordU8_rem(Word8_t,Word8_t); PRIVATE Real32_t WordU8_rndToReal32(Word8_t); PRIVATE Real64_t WordU8_rndToReal64(Word8_t); PRIVATE INLINE Word8_t WordU8_rshift(Word8_t,Word32_t); PRIVATE INLINE Bool_t WordU8_subCheckP(Word8_t,Word8_t); #endif /* _MLTON_BASIS_FFI_H_ */ mlton-20210117+dfsg/runtime/gen/basis-ffi.h.chk000066400000000000000000000000511416264345000210360ustar00rootroot00000000000000cbda5224b17ce17c781e794dbcb904e68e40f458 mlton-20210117+dfsg/runtime/gen/basis-ffi.sml000066400000000000000000002506041416264345000206510ustar00rootroot00000000000000(* This file is automatically generated. Do not edit. *) local open Primitive in structure PrimitiveFFI = struct structure CommandLine = struct val (argcGet, argcSet) = _symbol "CommandLine_argc" private : (unit -> (C_Int.t)) * ((C_Int.t) -> unit); val (argvGet, argvSet) = _symbol "CommandLine_argv" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val (commandNameGet, commandNameSet) = _symbol "CommandLine_commandName" private : (unit -> (C_String.t)) * ((C_String.t) -> unit); end structure Cygwin = struct val toFullWindowsPath = _import "Cygwin_toFullWindowsPath" private : NullString8.t -> C_String.t; end structure Date = struct val gmTime = _import "Date_gmTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val localOffset = _import "Date_localOffset" private : unit -> C_Double.t; val localTime = _import "Date_localTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val mkTime = _import "Date_mkTime" private : unit -> (C_Time.t) C_Errno.t; val strfTime = _import "Date_strfTime" private : (Char8.t) array * C_Size.t * NullString8.t -> C_Size.t; structure Tm = struct val getHour = _import "Date_Tm_getHour" private : unit -> C_Int.t; val getIsDst = _import "Date_Tm_getIsDst" private : unit -> C_Int.t; val getMDay = _import "Date_Tm_getMDay" private : unit -> C_Int.t; val getMin = _import "Date_Tm_getMin" private : unit -> C_Int.t; val getMon = _import "Date_Tm_getMon" private : unit -> C_Int.t; val getSec = _import "Date_Tm_getSec" private : unit -> C_Int.t; val getWDay = _import "Date_Tm_getWDay" private : unit -> C_Int.t; val getYDay = _import "Date_Tm_getYDay" private : unit -> C_Int.t; val getYear = _import "Date_Tm_getYear" private : unit -> C_Int.t; val setHour = _import "Date_Tm_setHour" private : C_Int.t -> unit; val setIsDst = _import "Date_Tm_setIsDst" private : C_Int.t -> unit; val setMDay = _import "Date_Tm_setMDay" private : C_Int.t -> unit; val setMin = _import "Date_Tm_setMin" private : C_Int.t -> unit; val setMon = _import "Date_Tm_setMon" private : C_Int.t -> unit; val setSec = _import "Date_Tm_setSec" private : C_Int.t -> unit; val setWDay = _import "Date_Tm_setWDay" private : C_Int.t -> unit; val setYDay = _import "Date_Tm_setYDay" private : C_Int.t -> unit; val setYear = _import "Date_Tm_setYear" private : C_Int.t -> unit; end end structure IEEEReal = struct val getRoundingMode = _import "IEEEReal_getRoundingMode" private : unit -> C_Int.t; structure RoundingMode = struct val FE_DOWNWARD = _const "IEEEReal_RoundingMode_FE_DOWNWARD" : C_Int.t; val FE_NOSUPPORT = _const "IEEEReal_RoundingMode_FE_NOSUPPORT" : C_Int.t; val FE_TONEAREST = _const "IEEEReal_RoundingMode_FE_TONEAREST" : C_Int.t; val FE_TOWARDZERO = _const "IEEEReal_RoundingMode_FE_TOWARDZERO" : C_Int.t; val FE_UPWARD = _const "IEEEReal_RoundingMode_FE_UPWARD" : C_Int.t; end val setRoundingMode = _import "IEEEReal_setRoundingMode" private : C_Int.t -> C_Int.t; end structure MinGW = struct val clearNonBlock = _import "MinGW_clearNonBlock" private : C_Fd.t -> unit; val getTempPath = _import "MinGW_getTempPath" private : C_Size.t * (Char8.t) array -> C_Size.t; val setNonBlock = _import "MinGW_setNonBlock" private : C_Fd.t -> unit; end structure MLton = struct val bug = _import "MLton_bug" private : String8.t -> unit; structure Itimer = struct val PROF = _const "MLton_Itimer_PROF" : C_Int.t; val REAL = _const "MLton_Itimer_REAL" : C_Int.t; val set = _import "MLton_Itimer_set" private : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> (C_Int.t) C_Errno.t; val VIRTUAL = _const "MLton_Itimer_VIRTUAL" : C_Int.t; end structure Process = struct val spawne = _import "MLton_Process_spawne" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_PId.t) C_Errno.t; val spawnp = _import "MLton_Process_spawnp" private : NullString8.t * (NullString8.t) array -> (C_PId.t) C_Errno.t; end structure Rlimit = struct val AS = _const "MLton_Rlimit_AS" : C_Int.t; val CORE = _const "MLton_Rlimit_CORE" : C_Int.t; val CPU = _const "MLton_Rlimit_CPU" : C_Int.t; val DATA = _const "MLton_Rlimit_DATA" : C_Int.t; val FSIZE = _const "MLton_Rlimit_FSIZE" : C_Int.t; val get = _import "MLton_Rlimit_get" private : C_Int.t -> (C_Int.t) C_Errno.t; val getHard = _import "MLton_Rlimit_getHard" private : unit -> C_RLim.t; val getSoft = _import "MLton_Rlimit_getSoft" private : unit -> C_RLim.t; val INFINITY = _const "MLton_Rlimit_INFINITY" : C_RLim.t; val MEMLOCK = _const "MLton_Rlimit_MEMLOCK" : C_Int.t; val NOFILE = _const "MLton_Rlimit_NOFILE" : C_Int.t; val NPROC = _const "MLton_Rlimit_NPROC" : C_Int.t; val RSS = _const "MLton_Rlimit_RSS" : C_Int.t; val set = _import "MLton_Rlimit_set" private : C_Int.t * C_RLim.t * C_RLim.t -> (C_Int.t) C_Errno.t; val STACK = _const "MLton_Rlimit_STACK" : C_Int.t; end structure Rusage = struct val children_stime_sec = _import "MLton_Rusage_children_stime_sec" private : unit -> C_Time.t; val children_stime_usec = _import "MLton_Rusage_children_stime_usec" private : unit -> C_SUSeconds.t; val children_utime_sec = _import "MLton_Rusage_children_utime_sec" private : unit -> C_Time.t; val children_utime_usec = _import "MLton_Rusage_children_utime_usec" private : unit -> C_SUSeconds.t; val gc_stime_sec = _import "MLton_Rusage_gc_stime_sec" private : unit -> C_Time.t; val gc_stime_usec = _import "MLton_Rusage_gc_stime_usec" private : unit -> C_SUSeconds.t; val gc_utime_sec = _import "MLton_Rusage_gc_utime_sec" private : unit -> C_Time.t; val gc_utime_usec = _import "MLton_Rusage_gc_utime_usec" private : unit -> C_SUSeconds.t; val getrusage = _import "MLton_Rusage_getrusage" private : GCState.t -> unit; val self_stime_sec = _import "MLton_Rusage_self_stime_sec" private : unit -> C_Time.t; val self_stime_usec = _import "MLton_Rusage_self_stime_usec" private : unit -> C_SUSeconds.t; val self_utime_sec = _import "MLton_Rusage_self_utime_sec" private : unit -> C_Time.t; val self_utime_usec = _import "MLton_Rusage_self_utime_usec" private : unit -> C_SUSeconds.t; end structure Syslog = struct val closelog = _import "MLton_Syslog_closelog" private : unit -> unit; structure Facility = struct val LOG_AUTH = _const "MLton_Syslog_Facility_LOG_AUTH" : C_Int.t; val LOG_CRON = _const "MLton_Syslog_Facility_LOG_CRON" : C_Int.t; val LOG_DAEMON = _const "MLton_Syslog_Facility_LOG_DAEMON" : C_Int.t; val LOG_KERN = _const "MLton_Syslog_Facility_LOG_KERN" : C_Int.t; val LOG_LOCAL0 = _const "MLton_Syslog_Facility_LOG_LOCAL0" : C_Int.t; val LOG_LOCAL1 = _const "MLton_Syslog_Facility_LOG_LOCAL1" : C_Int.t; val LOG_LOCAL2 = _const "MLton_Syslog_Facility_LOG_LOCAL2" : C_Int.t; val LOG_LOCAL3 = _const "MLton_Syslog_Facility_LOG_LOCAL3" : C_Int.t; val LOG_LOCAL4 = _const "MLton_Syslog_Facility_LOG_LOCAL4" : C_Int.t; val LOG_LOCAL5 = _const "MLton_Syslog_Facility_LOG_LOCAL5" : C_Int.t; val LOG_LOCAL6 = _const "MLton_Syslog_Facility_LOG_LOCAL6" : C_Int.t; val LOG_LOCAL7 = _const "MLton_Syslog_Facility_LOG_LOCAL7" : C_Int.t; val LOG_LPR = _const "MLton_Syslog_Facility_LOG_LPR" : C_Int.t; val LOG_MAIL = _const "MLton_Syslog_Facility_LOG_MAIL" : C_Int.t; val LOG_NEWS = _const "MLton_Syslog_Facility_LOG_NEWS" : C_Int.t; val LOG_SYSLOG = _const "MLton_Syslog_Facility_LOG_SYSLOG" : C_Int.t; val LOG_USER = _const "MLton_Syslog_Facility_LOG_USER" : C_Int.t; val LOG_UUCP = _const "MLton_Syslog_Facility_LOG_UUCP" : C_Int.t; end structure Logopt = struct val LOG_CONS = _const "MLton_Syslog_Logopt_LOG_CONS" : C_Int.t; val LOG_NDELAY = _const "MLton_Syslog_Logopt_LOG_NDELAY" : C_Int.t; val LOG_NOWAIT = _const "MLton_Syslog_Logopt_LOG_NOWAIT" : C_Int.t; val LOG_ODELAY = _const "MLton_Syslog_Logopt_LOG_ODELAY" : C_Int.t; val LOG_PERROR = _const "MLton_Syslog_Logopt_LOG_PERROR" : C_Int.t; val LOG_PID = _const "MLton_Syslog_Logopt_LOG_PID" : C_Int.t; end val openlog = _import "MLton_Syslog_openlog" private : NullString8.t * C_Int.t * C_Int.t -> unit; structure Severity = struct val LOG_ALERT = _const "MLton_Syslog_Severity_LOG_ALERT" : C_Int.t; val LOG_CRIT = _const "MLton_Syslog_Severity_LOG_CRIT" : C_Int.t; val LOG_DEBUG = _const "MLton_Syslog_Severity_LOG_DEBUG" : C_Int.t; val LOG_EMERG = _const "MLton_Syslog_Severity_LOG_EMERG" : C_Int.t; val LOG_ERR = _const "MLton_Syslog_Severity_LOG_ERR" : C_Int.t; val LOG_INFO = _const "MLton_Syslog_Severity_LOG_INFO" : C_Int.t; val LOG_NOTICE = _const "MLton_Syslog_Severity_LOG_NOTICE" : C_Int.t; val LOG_WARNING = _const "MLton_Syslog_Severity_LOG_WARNING" : C_Int.t; end val syslog = _import "MLton_Syslog_syslog" private : C_Int.t * NullString8.t -> unit; end end structure Net = struct val htonl = _import "Net_htonl" private : Word32.t -> Word32.t; val htons = _import "Net_htons" private : Word16.t -> Word16.t; val ntohl = _import "Net_ntohl" private : Word32.t -> Word32.t; val ntohs = _import "Net_ntohs" private : Word16.t -> Word16.t; end structure NetHostDB = struct val getByAddress = _import "NetHostDB_getByAddress" private : (Word8.t) vector * C_Socklen.t -> C_Int.t; val getByName = _import "NetHostDB_getByName" private : NullString8.t -> C_Int.t; val getEntryAddrsN = _import "NetHostDB_getEntryAddrsN" private : C_Int.t * (Word8.t) array -> unit; val getEntryAddrsNum = _import "NetHostDB_getEntryAddrsNum" private : unit -> C_Int.t; val getEntryAddrType = _import "NetHostDB_getEntryAddrType" private : unit -> C_Int.t; val getEntryAliasesN = _import "NetHostDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetHostDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryLength = _import "NetHostDB_getEntryLength" private : unit -> C_Int.t; val getEntryName = _import "NetHostDB_getEntryName" private : unit -> C_String.t; val getHostName = _import "NetHostDB_getHostName" private : (Char8.t) array * C_Size.t -> (C_Int.t) C_Errno.t; val INADDR_ANY = _const "NetHostDB_INADDR_ANY" : C_Int.t; val inAddrSize = _const "NetHostDB_inAddrSize" : C_Size.t; end structure NetProtDB = struct val getByName = _import "NetProtDB_getByName" private : NullString8.t -> C_Int.t; val getByNumber = _import "NetProtDB_getByNumber" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetProtDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetProtDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetProtDB_getEntryName" private : unit -> C_String.t; val getEntryProto = _import "NetProtDB_getEntryProto" private : unit -> C_Int.t; end structure NetServDB = struct val getByName = _import "NetServDB_getByName" private : NullString8.t * NullString8.t -> C_Int.t; val getByNameNull = _import "NetServDB_getByNameNull" private : NullString8.t -> C_Int.t; val getByPort = _import "NetServDB_getByPort" private : C_Int.t * NullString8.t -> C_Int.t; val getByPortNull = _import "NetServDB_getByPortNull" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetServDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetServDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetServDB_getEntryName" private : unit -> C_String.t; val getEntryPort = _import "NetServDB_getEntryPort" private : unit -> C_Int.t; val getEntryProto = _import "NetServDB_getEntryProto" private : unit -> C_String.t; end structure OS = struct structure IO = struct val poll = _import "OS_IO_poll" private : (C_Fd.t) vector * (C_Short.t) vector * C_NFds.t * C_Int.t * (C_Short.t) array -> (C_Int.t) C_Errno.t; val POLLIN = _const "OS_IO_POLLIN" : C_Short.t; val POLLOUT = _const "OS_IO_POLLOUT" : C_Short.t; val POLLPRI = _const "OS_IO_POLLPRI" : C_Short.t; end end structure Posix = struct structure Error = struct val clearErrno = _import "Posix_Error_clearErrno" private : unit -> unit; val E2BIG = _const "Posix_Error_E2BIG" : C_Int.t; val EACCES = _const "Posix_Error_EACCES" : C_Int.t; val EADDRINUSE = _const "Posix_Error_EADDRINUSE" : C_Int.t; val EADDRNOTAVAIL = _const "Posix_Error_EADDRNOTAVAIL" : C_Int.t; val EAFNOSUPPORT = _const "Posix_Error_EAFNOSUPPORT" : C_Int.t; val EAGAIN = _const "Posix_Error_EAGAIN" : C_Int.t; val EALREADY = _const "Posix_Error_EALREADY" : C_Int.t; val EBADF = _const "Posix_Error_EBADF" : C_Int.t; val EBADMSG = _const "Posix_Error_EBADMSG" : C_Int.t; val EBUSY = _const "Posix_Error_EBUSY" : C_Int.t; val ECANCELED = _const "Posix_Error_ECANCELED" : C_Int.t; val ECHILD = _const "Posix_Error_ECHILD" : C_Int.t; val ECONNABORTED = _const "Posix_Error_ECONNABORTED" : C_Int.t; val ECONNREFUSED = _const "Posix_Error_ECONNREFUSED" : C_Int.t; val ECONNRESET = _const "Posix_Error_ECONNRESET" : C_Int.t; val EDEADLK = _const "Posix_Error_EDEADLK" : C_Int.t; val EDESTADDRREQ = _const "Posix_Error_EDESTADDRREQ" : C_Int.t; val EDOM = _const "Posix_Error_EDOM" : C_Int.t; val EDQUOT = _const "Posix_Error_EDQUOT" : C_Int.t; val EEXIST = _const "Posix_Error_EEXIST" : C_Int.t; val EFAULT = _const "Posix_Error_EFAULT" : C_Int.t; val EFBIG = _const "Posix_Error_EFBIG" : C_Int.t; val EHOSTUNREACH = _const "Posix_Error_EHOSTUNREACH" : C_Int.t; val EIDRM = _const "Posix_Error_EIDRM" : C_Int.t; val EILSEQ = _const "Posix_Error_EILSEQ" : C_Int.t; val EINPROGRESS = _const "Posix_Error_EINPROGRESS" : C_Int.t; val EINTR = _const "Posix_Error_EINTR" : C_Int.t; val EINVAL = _const "Posix_Error_EINVAL" : C_Int.t; val EIO = _const "Posix_Error_EIO" : C_Int.t; val EISCONN = _const "Posix_Error_EISCONN" : C_Int.t; val EISDIR = _const "Posix_Error_EISDIR" : C_Int.t; val ELOOP = _const "Posix_Error_ELOOP" : C_Int.t; val EMFILE = _const "Posix_Error_EMFILE" : C_Int.t; val EMLINK = _const "Posix_Error_EMLINK" : C_Int.t; val EMSGSIZE = _const "Posix_Error_EMSGSIZE" : C_Int.t; val EMULTIHOP = _const "Posix_Error_EMULTIHOP" : C_Int.t; val ENAMETOOLONG = _const "Posix_Error_ENAMETOOLONG" : C_Int.t; val ENETDOWN = _const "Posix_Error_ENETDOWN" : C_Int.t; val ENETRESET = _const "Posix_Error_ENETRESET" : C_Int.t; val ENETUNREACH = _const "Posix_Error_ENETUNREACH" : C_Int.t; val ENFILE = _const "Posix_Error_ENFILE" : C_Int.t; val ENOBUFS = _const "Posix_Error_ENOBUFS" : C_Int.t; val ENODATA = _const "Posix_Error_ENODATA" : C_Int.t; val ENODEV = _const "Posix_Error_ENODEV" : C_Int.t; val ENOENT = _const "Posix_Error_ENOENT" : C_Int.t; val ENOEXEC = _const "Posix_Error_ENOEXEC" : C_Int.t; val ENOLCK = _const "Posix_Error_ENOLCK" : C_Int.t; val ENOLINK = _const "Posix_Error_ENOLINK" : C_Int.t; val ENOMEM = _const "Posix_Error_ENOMEM" : C_Int.t; val ENOMSG = _const "Posix_Error_ENOMSG" : C_Int.t; val ENOPROTOOPT = _const "Posix_Error_ENOPROTOOPT" : C_Int.t; val ENOSPC = _const "Posix_Error_ENOSPC" : C_Int.t; val ENOSR = _const "Posix_Error_ENOSR" : C_Int.t; val ENOSTR = _const "Posix_Error_ENOSTR" : C_Int.t; val ENOSYS = _const "Posix_Error_ENOSYS" : C_Int.t; val ENOTCONN = _const "Posix_Error_ENOTCONN" : C_Int.t; val ENOTDIR = _const "Posix_Error_ENOTDIR" : C_Int.t; val ENOTEMPTY = _const "Posix_Error_ENOTEMPTY" : C_Int.t; val ENOTSOCK = _const "Posix_Error_ENOTSOCK" : C_Int.t; val ENOTSUP = _const "Posix_Error_ENOTSUP" : C_Int.t; val ENOTTY = _const "Posix_Error_ENOTTY" : C_Int.t; val ENXIO = _const "Posix_Error_ENXIO" : C_Int.t; val EOPNOTSUPP = _const "Posix_Error_EOPNOTSUPP" : C_Int.t; val EOVERFLOW = _const "Posix_Error_EOVERFLOW" : C_Int.t; val EPERM = _const "Posix_Error_EPERM" : C_Int.t; val EPIPE = _const "Posix_Error_EPIPE" : C_Int.t; val EPROTO = _const "Posix_Error_EPROTO" : C_Int.t; val EPROTONOSUPPORT = _const "Posix_Error_EPROTONOSUPPORT" : C_Int.t; val EPROTOTYPE = _const "Posix_Error_EPROTOTYPE" : C_Int.t; val ERANGE = _const "Posix_Error_ERANGE" : C_Int.t; val EROFS = _const "Posix_Error_EROFS" : C_Int.t; val ESPIPE = _const "Posix_Error_ESPIPE" : C_Int.t; val ESRCH = _const "Posix_Error_ESRCH" : C_Int.t; val ESTALE = _const "Posix_Error_ESTALE" : C_Int.t; val ETIME = _const "Posix_Error_ETIME" : C_Int.t; val ETIMEDOUT = _const "Posix_Error_ETIMEDOUT" : C_Int.t; val ETXTBSY = _const "Posix_Error_ETXTBSY" : C_Int.t; val EWOULDBLOCK = _const "Posix_Error_EWOULDBLOCK" : C_Int.t; val EXDEV = _const "Posix_Error_EXDEV" : C_Int.t; val getErrno = _import "Posix_Error_getErrno" private : unit -> C_Int.t; val strError = _import "Posix_Error_strError" private : C_Int.t -> C_String.t; end structure FileSys = struct structure A = struct val F_OK = _const "Posix_FileSys_A_F_OK" : C_Int.t; val R_OK = _const "Posix_FileSys_A_R_OK" : C_Int.t; val W_OK = _const "Posix_FileSys_A_W_OK" : C_Int.t; val X_OK = _const "Posix_FileSys_A_X_OK" : C_Int.t; end val access = _import "Posix_FileSys_access" private : NullString8.t * C_Int.t -> (C_Int.t) C_Errno.t; val chdir = _import "Posix_FileSys_chdir" private : NullString8.t -> (C_Int.t) C_Errno.t; val chmod = _import "Posix_FileSys_chmod" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val chown = _import "Posix_FileSys_chown" private : NullString8.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; structure Dirstream = struct val closeDir = _import "Posix_FileSys_Dirstream_closeDir" private : C_DirP.t -> (C_Int.t) C_Errno.t; val openDir = _import "Posix_FileSys_Dirstream_openDir" private : NullString8.t -> (C_DirP.t) C_Errno.t; val readDir = _import "Posix_FileSys_Dirstream_readDir" private : C_DirP.t -> (C_String.t) C_Errno.t; val rewindDir = _import "Posix_FileSys_Dirstream_rewindDir" private : C_DirP.t -> unit; end val fchdir = _import "Posix_FileSys_fchdir" private : C_Fd.t -> (C_Int.t) C_Errno.t; val fchmod = _import "Posix_FileSys_fchmod" private : C_Fd.t * C_Mode.t -> (C_Int.t) C_Errno.t; val fchown = _import "Posix_FileSys_fchown" private : C_Fd.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; val fpathconf = _import "Posix_FileSys_fpathconf" private : C_Fd.t * C_Int.t -> (C_Long.t) C_Errno.t; val ftruncate = _import "Posix_FileSys_ftruncate" private : C_Fd.t * C_Off.t -> (C_Int.t) C_Errno.t; val getcwd = _import "Posix_FileSys_getcwd" private : (Char8.t) array * C_Size.t -> (C_String.t) C_Errno.t; val link = _import "Posix_FileSys_link" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val mkdir = _import "Posix_FileSys_mkdir" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val mkfifo = _import "Posix_FileSys_mkfifo" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; structure O = struct val APPEND = _const "Posix_FileSys_O_APPEND" : C_Int.t; val BINARY = _const "Posix_FileSys_O_BINARY" : C_Int.t; val CREAT = _const "Posix_FileSys_O_CREAT" : C_Int.t; val DSYNC = _const "Posix_FileSys_O_DSYNC" : C_Int.t; val EXCL = _const "Posix_FileSys_O_EXCL" : C_Int.t; val NOCTTY = _const "Posix_FileSys_O_NOCTTY" : C_Int.t; val NONBLOCK = _const "Posix_FileSys_O_NONBLOCK" : C_Int.t; val RDONLY = _const "Posix_FileSys_O_RDONLY" : C_Int.t; val RDWR = _const "Posix_FileSys_O_RDWR" : C_Int.t; val RSYNC = _const "Posix_FileSys_O_RSYNC" : C_Int.t; val SYNC = _const "Posix_FileSys_O_SYNC" : C_Int.t; val TEXT = _const "Posix_FileSys_O_TEXT" : C_Int.t; val TRUNC = _const "Posix_FileSys_O_TRUNC" : C_Int.t; val WRONLY = _const "Posix_FileSys_O_WRONLY" : C_Int.t; end val open2 = _import "Posix_FileSys_open2" private : NullString8.t * C_Int.t -> (C_Fd.t) C_Errno.t; val open3 = _import "Posix_FileSys_open3" private : NullString8.t * C_Int.t * C_Mode.t -> (C_Fd.t) C_Errno.t; val pathconf = _import "Posix_FileSys_pathconf" private : NullString8.t * C_Int.t -> (C_Long.t) C_Errno.t; structure PC = struct val ALLOC_SIZE_MIN = _const "Posix_FileSys_PC_ALLOC_SIZE_MIN" : C_Int.t; val ASYNC_IO = _const "Posix_FileSys_PC_ASYNC_IO" : C_Int.t; val CHOWN_RESTRICTED = _const "Posix_FileSys_PC_CHOWN_RESTRICTED" : C_Int.t; val FILESIZEBITS = _const "Posix_FileSys_PC_FILESIZEBITS" : C_Int.t; val LINK_MAX = _const "Posix_FileSys_PC_LINK_MAX" : C_Int.t; val MAX_CANON = _const "Posix_FileSys_PC_MAX_CANON" : C_Int.t; val MAX_INPUT = _const "Posix_FileSys_PC_MAX_INPUT" : C_Int.t; val NAME_MAX = _const "Posix_FileSys_PC_NAME_MAX" : C_Int.t; val NO_TRUNC = _const "Posix_FileSys_PC_NO_TRUNC" : C_Int.t; val PATH_MAX = _const "Posix_FileSys_PC_PATH_MAX" : C_Int.t; val PIPE_BUF = _const "Posix_FileSys_PC_PIPE_BUF" : C_Int.t; val PRIO_IO = _const "Posix_FileSys_PC_PRIO_IO" : C_Int.t; val REC_INCR_XFER_SIZE = _const "Posix_FileSys_PC_REC_INCR_XFER_SIZE" : C_Int.t; val REC_MAX_XFER_SIZE = _const "Posix_FileSys_PC_REC_MAX_XFER_SIZE" : C_Int.t; val REC_MIN_XFER_SIZE = _const "Posix_FileSys_PC_REC_MIN_XFER_SIZE" : C_Int.t; val REC_XFER_ALIGN = _const "Posix_FileSys_PC_REC_XFER_ALIGN" : C_Int.t; val SYMLINK_MAX = _const "Posix_FileSys_PC_SYMLINK_MAX" : C_Int.t; val SYNC_IO = _const "Posix_FileSys_PC_SYNC_IO" : C_Int.t; val TWO_SYMLINKS = _const "Posix_FileSys_PC_TWO_SYMLINKS" : C_Int.t; val VDISABLE = _const "Posix_FileSys_PC_VDISABLE" : C_Int.t; end val readlink = _import "Posix_FileSys_readlink" private : NullString8.t * (Char8.t) array * C_Size.t -> (C_SSize.t) C_Errno.t; val rename = _import "Posix_FileSys_rename" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val rmdir = _import "Posix_FileSys_rmdir" private : NullString8.t -> (C_Int.t) C_Errno.t; structure S = struct val IFBLK = _const "Posix_FileSys_S_IFBLK" : C_Mode.t; val IFCHR = _const "Posix_FileSys_S_IFCHR" : C_Mode.t; val IFDIR = _const "Posix_FileSys_S_IFDIR" : C_Mode.t; val IFIFO = _const "Posix_FileSys_S_IFIFO" : C_Mode.t; val IFLNK = _const "Posix_FileSys_S_IFLNK" : C_Mode.t; val IFMT = _const "Posix_FileSys_S_IFMT" : C_Mode.t; val IFREG = _const "Posix_FileSys_S_IFREG" : C_Mode.t; val IFSOCK = _const "Posix_FileSys_S_IFSOCK" : C_Mode.t; val IRGRP = _const "Posix_FileSys_S_IRGRP" : C_Mode.t; val IROTH = _const "Posix_FileSys_S_IROTH" : C_Mode.t; val IRUSR = _const "Posix_FileSys_S_IRUSR" : C_Mode.t; val IRWXG = _const "Posix_FileSys_S_IRWXG" : C_Mode.t; val IRWXO = _const "Posix_FileSys_S_IRWXO" : C_Mode.t; val IRWXU = _const "Posix_FileSys_S_IRWXU" : C_Mode.t; val ISGID = _const "Posix_FileSys_S_ISGID" : C_Mode.t; val ISUID = _const "Posix_FileSys_S_ISUID" : C_Mode.t; val ISVTX = _const "Posix_FileSys_S_ISVTX" : C_Mode.t; val IWGRP = _const "Posix_FileSys_S_IWGRP" : C_Mode.t; val IWOTH = _const "Posix_FileSys_S_IWOTH" : C_Mode.t; val IWUSR = _const "Posix_FileSys_S_IWUSR" : C_Mode.t; val IXGRP = _const "Posix_FileSys_S_IXGRP" : C_Mode.t; val IXOTH = _const "Posix_FileSys_S_IXOTH" : C_Mode.t; val IXUSR = _const "Posix_FileSys_S_IXUSR" : C_Mode.t; end structure ST = struct val isBlk = _import "Posix_FileSys_ST_isBlk" private : C_Mode.t -> C_Int.t; val isChr = _import "Posix_FileSys_ST_isChr" private : C_Mode.t -> C_Int.t; val isDir = _import "Posix_FileSys_ST_isDir" private : C_Mode.t -> C_Int.t; val isFIFO = _import "Posix_FileSys_ST_isFIFO" private : C_Mode.t -> C_Int.t; val isLink = _import "Posix_FileSys_ST_isLink" private : C_Mode.t -> C_Int.t; val isReg = _import "Posix_FileSys_ST_isReg" private : C_Mode.t -> C_Int.t; val isSock = _import "Posix_FileSys_ST_isSock" private : C_Mode.t -> C_Int.t; end structure Stat = struct val fstat = _import "Posix_FileSys_Stat_fstat" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getATime = _import "Posix_FileSys_Stat_getATime" private : unit -> C_Time.t; val getCTime = _import "Posix_FileSys_Stat_getCTime" private : unit -> C_Time.t; val getDev = _import "Posix_FileSys_Stat_getDev" private : unit -> C_Dev.t; val getGId = _import "Posix_FileSys_Stat_getGId" private : unit -> C_GId.t; val getINo = _import "Posix_FileSys_Stat_getINo" private : unit -> C_INo.t; val getMode = _import "Posix_FileSys_Stat_getMode" private : unit -> C_Mode.t; val getMTime = _import "Posix_FileSys_Stat_getMTime" private : unit -> C_Time.t; val getNLink = _import "Posix_FileSys_Stat_getNLink" private : unit -> C_NLink.t; val getRDev = _import "Posix_FileSys_Stat_getRDev" private : unit -> C_Dev.t; val getSize = _import "Posix_FileSys_Stat_getSize" private : unit -> C_Off.t; val getUId = _import "Posix_FileSys_Stat_getUId" private : unit -> C_UId.t; val lstat = _import "Posix_FileSys_Stat_lstat" private : NullString8.t -> (C_Int.t) C_Errno.t; val stat = _import "Posix_FileSys_Stat_stat" private : NullString8.t -> (C_Int.t) C_Errno.t; end val symlink = _import "Posix_FileSys_symlink" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val truncate = _import "Posix_FileSys_truncate" private : NullString8.t * C_Off.t -> (C_Int.t) C_Errno.t; val umask = _import "Posix_FileSys_umask" private : C_Mode.t -> C_Mode.t; val unlink = _import "Posix_FileSys_unlink" private : NullString8.t -> (C_Int.t) C_Errno.t; structure Utimbuf = struct val setAcTime = _import "Posix_FileSys_Utimbuf_setAcTime" private : C_Time.t -> unit; val setModTime = _import "Posix_FileSys_Utimbuf_setModTime" private : C_Time.t -> unit; val utime = _import "Posix_FileSys_Utimbuf_utime" private : NullString8.t -> (C_Int.t) C_Errno.t; end end structure IO = struct val close = _import "Posix_IO_close" private : C_Fd.t -> (C_Int.t) C_Errno.t; val dup = _import "Posix_IO_dup" private : C_Fd.t -> (C_Fd.t) C_Errno.t; val dup2 = _import "Posix_IO_dup2" private : C_Fd.t * C_Fd.t -> (C_Fd.t) C_Errno.t; val F_DUPFD = _const "Posix_IO_F_DUPFD" : C_Int.t; val F_GETFD = _const "Posix_IO_F_GETFD" : C_Int.t; val F_GETFL = _const "Posix_IO_F_GETFL" : C_Int.t; val F_GETOWN = _const "Posix_IO_F_GETOWN" : C_Int.t; val F_SETFD = _const "Posix_IO_F_SETFD" : C_Int.t; val F_SETFL = _const "Posix_IO_F_SETFL" : C_Int.t; val F_SETOWN = _const "Posix_IO_F_SETOWN" : C_Int.t; val fcntl2 = _import "Posix_IO_fcntl2" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val fcntl3 = _import "Posix_IO_fcntl3" private : C_Fd.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; structure FD = struct val CLOEXEC = _const "Posix_IO_FD_CLOEXEC" : C_Int.t; end structure FLock = struct val F_GETLK = _const "Posix_IO_FLock_F_GETLK" : C_Int.t; val F_RDLCK = _const "Posix_IO_FLock_F_RDLCK" : C_Short.t; val F_SETLK = _const "Posix_IO_FLock_F_SETLK" : C_Int.t; val F_SETLKW = _const "Posix_IO_FLock_F_SETLKW" : C_Int.t; val F_UNLCK = _const "Posix_IO_FLock_F_UNLCK" : C_Short.t; val F_WRLCK = _const "Posix_IO_FLock_F_WRLCK" : C_Short.t; val fcntl = _import "Posix_IO_FLock_fcntl" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getLen = _import "Posix_IO_FLock_getLen" private : unit -> C_Off.t; val getPId = _import "Posix_IO_FLock_getPId" private : unit -> C_PId.t; val getStart = _import "Posix_IO_FLock_getStart" private : unit -> C_Off.t; val getType = _import "Posix_IO_FLock_getType" private : unit -> C_Short.t; val getWhence = _import "Posix_IO_FLock_getWhence" private : unit -> C_Short.t; val SEEK_CUR = _const "Posix_IO_FLock_SEEK_CUR" : C_Short.t; val SEEK_END = _const "Posix_IO_FLock_SEEK_END" : C_Short.t; val SEEK_SET = _const "Posix_IO_FLock_SEEK_SET" : C_Short.t; val setLen = _import "Posix_IO_FLock_setLen" private : C_Off.t -> unit; val setPId = _import "Posix_IO_FLock_setPId" private : C_PId.t -> unit; val setStart = _import "Posix_IO_FLock_setStart" private : C_Off.t -> unit; val setType = _import "Posix_IO_FLock_setType" private : C_Short.t -> unit; val setWhence = _import "Posix_IO_FLock_setWhence" private : C_Short.t -> unit; end val fsync = _import "Posix_IO_fsync" private : C_Fd.t -> (C_Int.t) C_Errno.t; val lseek = _import "Posix_IO_lseek" private : C_Fd.t * C_Off.t * C_Int.t -> (C_Off.t) C_Errno.t; val O_ACCMODE = _const "Posix_IO_O_ACCMODE" : C_Int.t; val pipe = _import "Posix_IO_pipe" private : (C_Fd.t) array -> (C_Int.t) C_Errno.t; val readChar8 = _import "Posix_IO_readChar8" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val readWord8 = _import "Posix_IO_readWord8" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val SEEK_CUR = _const "Posix_IO_SEEK_CUR" : C_Int.t; val SEEK_END = _const "Posix_IO_SEEK_END" : C_Int.t; val SEEK_SET = _const "Posix_IO_SEEK_SET" : C_Int.t; val setbin = _import "Posix_IO_setbin" private : C_Fd.t -> unit; val settext = _import "Posix_IO_settext" private : C_Fd.t -> unit; val writeChar8Arr = _import "Posix_IO_writeChar8Arr" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeChar8Vec = _import "Posix_IO_writeChar8Vec" private : C_Fd.t * (Char8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Arr = _import "Posix_IO_writeWord8Arr" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Vec = _import "Posix_IO_writeWord8Vec" private : C_Fd.t * (Word8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; end structure ProcEnv = struct val ctermid = _import "Posix_ProcEnv_ctermid" private : unit -> C_String.t; val (environGet, environSet) = _symbol "Posix_ProcEnv_environ" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val getegid = _import "Posix_ProcEnv_getegid" private : unit -> C_GId.t; val getenv = _import "Posix_ProcEnv_getenv" private : NullString8.t -> C_String.t; val geteuid = _import "Posix_ProcEnv_geteuid" private : unit -> C_UId.t; val getgid = _import "Posix_ProcEnv_getgid" private : unit -> C_GId.t; val getgroups = _import "Posix_ProcEnv_getgroups" private : C_Int.t * (C_GId.t) array -> (C_Int.t) C_Errno.t; val getgroupsN = _import "Posix_ProcEnv_getgroupsN" private : unit -> C_Int.t; val getlogin = _import "Posix_ProcEnv_getlogin" private : unit -> (C_String.t) C_Errno.t; val getpgrp = _import "Posix_ProcEnv_getpgrp" private : unit -> C_PId.t; val getpid = _import "Posix_ProcEnv_getpid" private : unit -> C_PId.t; val getppid = _import "Posix_ProcEnv_getppid" private : unit -> C_PId.t; val getuid = _import "Posix_ProcEnv_getuid" private : unit -> C_UId.t; val isatty = _import "Posix_ProcEnv_isatty" private : C_Fd.t -> C_Int.t; val SC_2_C_BIND = _const "Posix_ProcEnv_SC_2_C_BIND" : C_Int.t; val SC_2_C_DEV = _const "Posix_ProcEnv_SC_2_C_DEV" : C_Int.t; val SC_2_CHAR_TERM = _const "Posix_ProcEnv_SC_2_CHAR_TERM" : C_Int.t; val SC_2_FORT_DEV = _const "Posix_ProcEnv_SC_2_FORT_DEV" : C_Int.t; val SC_2_FORT_RUN = _const "Posix_ProcEnv_SC_2_FORT_RUN" : C_Int.t; val SC_2_LOCALEDEF = _const "Posix_ProcEnv_SC_2_LOCALEDEF" : C_Int.t; val SC_2_PBS = _const "Posix_ProcEnv_SC_2_PBS" : C_Int.t; val SC_2_PBS_ACCOUNTING = _const "Posix_ProcEnv_SC_2_PBS_ACCOUNTING" : C_Int.t; val SC_2_PBS_CHECKPOINT = _const "Posix_ProcEnv_SC_2_PBS_CHECKPOINT" : C_Int.t; val SC_2_PBS_LOCATE = _const "Posix_ProcEnv_SC_2_PBS_LOCATE" : C_Int.t; val SC_2_PBS_MESSAGE = _const "Posix_ProcEnv_SC_2_PBS_MESSAGE" : C_Int.t; val SC_2_PBS_TRACK = _const "Posix_ProcEnv_SC_2_PBS_TRACK" : C_Int.t; val SC_2_SW_DEV = _const "Posix_ProcEnv_SC_2_SW_DEV" : C_Int.t; val SC_2_UPE = _const "Posix_ProcEnv_SC_2_UPE" : C_Int.t; val SC_2_VERSION = _const "Posix_ProcEnv_SC_2_VERSION" : C_Int.t; val SC_ADVISORY_INFO = _const "Posix_ProcEnv_SC_ADVISORY_INFO" : C_Int.t; val SC_AIO_LISTIO_MAX = _const "Posix_ProcEnv_SC_AIO_LISTIO_MAX" : C_Int.t; val SC_AIO_MAX = _const "Posix_ProcEnv_SC_AIO_MAX" : C_Int.t; val SC_AIO_PRIO_DELTA_MAX = _const "Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX" : C_Int.t; val SC_ARG_MAX = _const "Posix_ProcEnv_SC_ARG_MAX" : C_Int.t; val SC_ASYNCHRONOUS_IO = _const "Posix_ProcEnv_SC_ASYNCHRONOUS_IO" : C_Int.t; val SC_ATEXIT_MAX = _const "Posix_ProcEnv_SC_ATEXIT_MAX" : C_Int.t; val SC_AVPHYS_PAGES = _const "Posix_ProcEnv_SC_AVPHYS_PAGES" : C_Int.t; val SC_BARRIERS = _const "Posix_ProcEnv_SC_BARRIERS" : C_Int.t; val SC_BC_BASE_MAX = _const "Posix_ProcEnv_SC_BC_BASE_MAX" : C_Int.t; val SC_BC_DIM_MAX = _const "Posix_ProcEnv_SC_BC_DIM_MAX" : C_Int.t; val SC_BC_SCALE_MAX = _const "Posix_ProcEnv_SC_BC_SCALE_MAX" : C_Int.t; val SC_BC_STRING_MAX = _const "Posix_ProcEnv_SC_BC_STRING_MAX" : C_Int.t; val SC_CHILD_MAX = _const "Posix_ProcEnv_SC_CHILD_MAX" : C_Int.t; val SC_CLK_TCK = _const "Posix_ProcEnv_SC_CLK_TCK" : C_Int.t; val SC_CLOCK_SELECTION = _const "Posix_ProcEnv_SC_CLOCK_SELECTION" : C_Int.t; val SC_COLL_WEIGHTS_MAX = _const "Posix_ProcEnv_SC_COLL_WEIGHTS_MAX" : C_Int.t; val SC_CPUTIME = _const "Posix_ProcEnv_SC_CPUTIME" : C_Int.t; val SC_DELAYTIMER_MAX = _const "Posix_ProcEnv_SC_DELAYTIMER_MAX" : C_Int.t; val SC_EXPR_NEST_MAX = _const "Posix_ProcEnv_SC_EXPR_NEST_MAX" : C_Int.t; val SC_FSYNC = _const "Posix_ProcEnv_SC_FSYNC" : C_Int.t; val SC_GETGR_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETGR_R_SIZE_MAX" : C_Int.t; val SC_GETPW_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETPW_R_SIZE_MAX" : C_Int.t; val SC_HOST_NAME_MAX = _const "Posix_ProcEnv_SC_HOST_NAME_MAX" : C_Int.t; val SC_IOV_MAX = _const "Posix_ProcEnv_SC_IOV_MAX" : C_Int.t; val SC_IPV6 = _const "Posix_ProcEnv_SC_IPV6" : C_Int.t; val SC_JOB_CONTROL = _const "Posix_ProcEnv_SC_JOB_CONTROL" : C_Int.t; val SC_LINE_MAX = _const "Posix_ProcEnv_SC_LINE_MAX" : C_Int.t; val SC_LOGIN_NAME_MAX = _const "Posix_ProcEnv_SC_LOGIN_NAME_MAX" : C_Int.t; val SC_MAPPED_FILES = _const "Posix_ProcEnv_SC_MAPPED_FILES" : C_Int.t; val SC_MEMLOCK = _const "Posix_ProcEnv_SC_MEMLOCK" : C_Int.t; val SC_MEMLOCK_RANGE = _const "Posix_ProcEnv_SC_MEMLOCK_RANGE" : C_Int.t; val SC_MEMORY_PROTECTION = _const "Posix_ProcEnv_SC_MEMORY_PROTECTION" : C_Int.t; val SC_MESSAGE_PASSING = _const "Posix_ProcEnv_SC_MESSAGE_PASSING" : C_Int.t; val SC_MONOTONIC_CLOCK = _const "Posix_ProcEnv_SC_MONOTONIC_CLOCK" : C_Int.t; val SC_MQ_OPEN_MAX = _const "Posix_ProcEnv_SC_MQ_OPEN_MAX" : C_Int.t; val SC_MQ_PRIO_MAX = _const "Posix_ProcEnv_SC_MQ_PRIO_MAX" : C_Int.t; val SC_NGROUPS_MAX = _const "Posix_ProcEnv_SC_NGROUPS_MAX" : C_Int.t; val SC_NPROCESSORS_CONF = _const "Posix_ProcEnv_SC_NPROCESSORS_CONF" : C_Int.t; val SC_NPROCESSORS_ONLN = _const "Posix_ProcEnv_SC_NPROCESSORS_ONLN" : C_Int.t; val SC_OPEN_MAX = _const "Posix_ProcEnv_SC_OPEN_MAX" : C_Int.t; val SC_PAGE_SIZE = _const "Posix_ProcEnv_SC_PAGE_SIZE" : C_Int.t; val SC_PAGESIZE = _const "Posix_ProcEnv_SC_PAGESIZE" : C_Int.t; val SC_PHYS_PAGES = _const "Posix_ProcEnv_SC_PHYS_PAGES" : C_Int.t; val SC_PRIORITIZED_IO = _const "Posix_ProcEnv_SC_PRIORITIZED_IO" : C_Int.t; val SC_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_PRIORITY_SCHEDULING" : C_Int.t; val SC_RAW_SOCKETS = _const "Posix_ProcEnv_SC_RAW_SOCKETS" : C_Int.t; val SC_RE_DUP_MAX = _const "Posix_ProcEnv_SC_RE_DUP_MAX" : C_Int.t; val SC_READER_WRITER_LOCKS = _const "Posix_ProcEnv_SC_READER_WRITER_LOCKS" : C_Int.t; val SC_REALTIME_SIGNALS = _const "Posix_ProcEnv_SC_REALTIME_SIGNALS" : C_Int.t; val SC_REGEXP = _const "Posix_ProcEnv_SC_REGEXP" : C_Int.t; val SC_RTSIG_MAX = _const "Posix_ProcEnv_SC_RTSIG_MAX" : C_Int.t; val SC_SAVED_IDS = _const "Posix_ProcEnv_SC_SAVED_IDS" : C_Int.t; val SC_SEM_NSEMS_MAX = _const "Posix_ProcEnv_SC_SEM_NSEMS_MAX" : C_Int.t; val SC_SEM_VALUE_MAX = _const "Posix_ProcEnv_SC_SEM_VALUE_MAX" : C_Int.t; val SC_SEMAPHORES = _const "Posix_ProcEnv_SC_SEMAPHORES" : C_Int.t; val SC_SHARED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS" : C_Int.t; val SC_SHELL = _const "Posix_ProcEnv_SC_SHELL" : C_Int.t; val SC_SIGQUEUE_MAX = _const "Posix_ProcEnv_SC_SIGQUEUE_MAX" : C_Int.t; val SC_SPAWN = _const "Posix_ProcEnv_SC_SPAWN" : C_Int.t; val SC_SPIN_LOCKS = _const "Posix_ProcEnv_SC_SPIN_LOCKS" : C_Int.t; val SC_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_SPORADIC_SERVER" : C_Int.t; val SC_SS_REPL_MAX = _const "Posix_ProcEnv_SC_SS_REPL_MAX" : C_Int.t; val SC_STREAM_MAX = _const "Posix_ProcEnv_SC_STREAM_MAX" : C_Int.t; val SC_SYMLOOP_MAX = _const "Posix_ProcEnv_SC_SYMLOOP_MAX" : C_Int.t; val SC_SYNCHRONIZED_IO = _const "Posix_ProcEnv_SC_SYNCHRONIZED_IO" : C_Int.t; val SC_THREAD_ATTR_STACKADDR = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR" : C_Int.t; val SC_THREAD_ATTR_STACKSIZE = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE" : C_Int.t; val SC_THREAD_CPUTIME = _const "Posix_ProcEnv_SC_THREAD_CPUTIME" : C_Int.t; val SC_THREAD_DESTRUCTOR_ITERATIONS = _const "Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS" : C_Int.t; val SC_THREAD_KEYS_MAX = _const "Posix_ProcEnv_SC_THREAD_KEYS_MAX" : C_Int.t; val SC_THREAD_PRIO_INHERIT = _const "Posix_ProcEnv_SC_THREAD_PRIO_INHERIT" : C_Int.t; val SC_THREAD_PRIO_PROTECT = _const "Posix_ProcEnv_SC_THREAD_PRIO_PROTECT" : C_Int.t; val SC_THREAD_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING" : C_Int.t; val SC_THREAD_PROCESS_SHARED = _const "Posix_ProcEnv_SC_THREAD_PROCESS_SHARED" : C_Int.t; val SC_THREAD_SAFE_FUNCTIONS = _const "Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS" : C_Int.t; val SC_THREAD_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER" : C_Int.t; val SC_THREAD_STACK_MIN = _const "Posix_ProcEnv_SC_THREAD_STACK_MIN" : C_Int.t; val SC_THREAD_THREADS_MAX = _const "Posix_ProcEnv_SC_THREAD_THREADS_MAX" : C_Int.t; val SC_THREADS = _const "Posix_ProcEnv_SC_THREADS" : C_Int.t; val SC_TIMEOUTS = _const "Posix_ProcEnv_SC_TIMEOUTS" : C_Int.t; val SC_TIMER_MAX = _const "Posix_ProcEnv_SC_TIMER_MAX" : C_Int.t; val SC_TIMERS = _const "Posix_ProcEnv_SC_TIMERS" : C_Int.t; val SC_TRACE = _const "Posix_ProcEnv_SC_TRACE" : C_Int.t; val SC_TRACE_EVENT_FILTER = _const "Posix_ProcEnv_SC_TRACE_EVENT_FILTER" : C_Int.t; val SC_TRACE_EVENT_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX" : C_Int.t; val SC_TRACE_INHERIT = _const "Posix_ProcEnv_SC_TRACE_INHERIT" : C_Int.t; val SC_TRACE_LOG = _const "Posix_ProcEnv_SC_TRACE_LOG" : C_Int.t; val SC_TRACE_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_NAME_MAX" : C_Int.t; val SC_TRACE_SYS_MAX = _const "Posix_ProcEnv_SC_TRACE_SYS_MAX" : C_Int.t; val SC_TRACE_USER_EVENT_MAX = _const "Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX" : C_Int.t; val SC_TTY_NAME_MAX = _const "Posix_ProcEnv_SC_TTY_NAME_MAX" : C_Int.t; val SC_TYPED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS" : C_Int.t; val SC_TZNAME_MAX = _const "Posix_ProcEnv_SC_TZNAME_MAX" : C_Int.t; val SC_V6_ILP32_OFF32 = _const "Posix_ProcEnv_SC_V6_ILP32_OFF32" : C_Int.t; val SC_V6_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_V6_ILP32_OFFBIG" : C_Int.t; val SC_V6_LP64_OFF64 = _const "Posix_ProcEnv_SC_V6_LP64_OFF64" : C_Int.t; val SC_V6_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_V6_LPBIG_OFFBIG" : C_Int.t; val SC_VERSION = _const "Posix_ProcEnv_SC_VERSION" : C_Int.t; val SC_XBS5_ILP32_OFF32 = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFF32" : C_Int.t; val SC_XBS5_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG" : C_Int.t; val SC_XBS5_LP64_OFF64 = _const "Posix_ProcEnv_SC_XBS5_LP64_OFF64" : C_Int.t; val SC_XBS5_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG" : C_Int.t; val SC_XOPEN_CRYPT = _const "Posix_ProcEnv_SC_XOPEN_CRYPT" : C_Int.t; val SC_XOPEN_ENH_I18N = _const "Posix_ProcEnv_SC_XOPEN_ENH_I18N" : C_Int.t; val SC_XOPEN_LEGACY = _const "Posix_ProcEnv_SC_XOPEN_LEGACY" : C_Int.t; val SC_XOPEN_REALTIME = _const "Posix_ProcEnv_SC_XOPEN_REALTIME" : C_Int.t; val SC_XOPEN_REALTIME_THREADS = _const "Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS" : C_Int.t; val SC_XOPEN_SHM = _const "Posix_ProcEnv_SC_XOPEN_SHM" : C_Int.t; val SC_XOPEN_STREAMS = _const "Posix_ProcEnv_SC_XOPEN_STREAMS" : C_Int.t; val SC_XOPEN_UNIX = _const "Posix_ProcEnv_SC_XOPEN_UNIX" : C_Int.t; val SC_XOPEN_VERSION = _const "Posix_ProcEnv_SC_XOPEN_VERSION" : C_Int.t; val setenv = _import "Posix_ProcEnv_setenv" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val setgid = _import "Posix_ProcEnv_setgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val setgroups = _import "Posix_ProcEnv_setgroups" private : C_Int.t * (C_GId.t) vector -> (C_Int.t) C_Errno.t; val setpgid = _import "Posix_ProcEnv_setpgid" private : C_PId.t * C_PId.t -> (C_Int.t) C_Errno.t; val setsid = _import "Posix_ProcEnv_setsid" private : unit -> (C_PId.t) C_Errno.t; val setuid = _import "Posix_ProcEnv_setuid" private : C_UId.t -> (C_Int.t) C_Errno.t; val sysconf = _import "Posix_ProcEnv_sysconf" private : C_Int.t -> (C_Long.t) C_Errno.t; val times = _import "Posix_ProcEnv_times" private : unit -> (C_Clock.t) C_Errno.t; structure Times = struct val getCSTime = _import "Posix_ProcEnv_Times_getCSTime" private : unit -> C_Clock.t; val getCUTime = _import "Posix_ProcEnv_Times_getCUTime" private : unit -> C_Clock.t; val getSTime = _import "Posix_ProcEnv_Times_getSTime" private : unit -> C_Clock.t; val getUTime = _import "Posix_ProcEnv_Times_getUTime" private : unit -> C_Clock.t; end val ttyname = _import "Posix_ProcEnv_ttyname" private : C_Fd.t -> (C_String.t) C_Errno.t; val uname = _import "Posix_ProcEnv_uname" private : unit -> (C_Int.t) C_Errno.t; structure Uname = struct val getMachine = _import "Posix_ProcEnv_Uname_getMachine" private : unit -> C_String.t; val getNodeName = _import "Posix_ProcEnv_Uname_getNodeName" private : unit -> C_String.t; val getRelease = _import "Posix_ProcEnv_Uname_getRelease" private : unit -> C_String.t; val getSysName = _import "Posix_ProcEnv_Uname_getSysName" private : unit -> C_String.t; val getVersion = _import "Posix_ProcEnv_Uname_getVersion" private : unit -> C_String.t; end end structure Process = struct val alarm = _import "Posix_Process_alarm" private : C_UInt.t -> C_UInt.t; val exece = _import "Posix_Process_exece" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_Int.t) C_Errno.t; val execp = _import "Posix_Process_execp" private : NullString8.t * (NullString8.t) array -> (C_Int.t) C_Errno.t; val exit = _import "Posix_Process_exit" private : C_Status.t -> unit; val exitStatus = _import "Posix_Process_exitStatus" private : C_Status.t -> C_Int.t; val fork = _import "Posix_Process_fork" private : unit -> (C_PId.t) C_Errno.t; val ifExited = _import "Posix_Process_ifExited" private : C_Status.t -> C_Int.t; val ifSignaled = _import "Posix_Process_ifSignaled" private : C_Status.t -> C_Int.t; val ifStopped = _import "Posix_Process_ifStopped" private : C_Status.t -> C_Int.t; val kill = _import "Posix_Process_kill" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; val nanosleep = _import "Posix_Process_nanosleep" private : (C_Time.t) ref * (C_Long.t) ref -> (C_Int.t) C_Errno.t; val pause = _import "Posix_Process_pause" private : unit -> (C_Int.t) C_Errno.t; val sleep = _import "Posix_Process_sleep" private : C_UInt.t -> C_UInt.t; val stopSig = _import "Posix_Process_stopSig" private : C_Status.t -> C_Signal.t; val system = _import "Posix_Process_system" private : NullString8.t -> (C_Status.t) C_Errno.t; val termSig = _import "Posix_Process_termSig" private : C_Status.t -> C_Signal.t; structure W = struct val NOHANG = _const "Posix_Process_W_NOHANG" : C_Int.t; val UNTRACED = _const "Posix_Process_W_UNTRACED" : C_Int.t; end val waitpid = _import "Posix_Process_waitpid" private : C_PId.t * (C_Status.t) ref * C_Int.t -> (C_PId.t) C_Errno.t; end structure Signal = struct val default = _import "Posix_Signal_default" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val handlee = _import "Posix_Signal_handlee" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val handleGC = _import "Posix_Signal_handleGC" private : GCState.t -> unit; val ignore = _import "Posix_Signal_ignore" private : GCState.t * C_Signal.t -> (C_Int.t) C_Errno.t; val isDefault = _import "Posix_Signal_isDefault" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isIgnore = _import "Posix_Signal_isIgnore" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isPending = _import "Posix_Signal_isPending" private : GCState.t * C_Signal.t -> C_Int.t; val isPendingGC = _import "Posix_Signal_isPendingGC" private : GCState.t -> C_Int.t; val NSIG = _const "Posix_Signal_NSIG" : C_Int.t; val resetPending = _import "Posix_Signal_resetPending" private : GCState.t -> unit; val SIG_BLOCK = _const "Posix_Signal_SIG_BLOCK" : C_Int.t; val SIG_SETMASK = _const "Posix_Signal_SIG_SETMASK" : C_Int.t; val SIG_UNBLOCK = _const "Posix_Signal_SIG_UNBLOCK" : C_Int.t; val SIGABRT = _const "Posix_Signal_SIGABRT" : C_Signal.t; val sigaddset = _import "Posix_Signal_sigaddset" private : (Word8.t) array * C_Signal.t -> (C_Int.t) C_Errno.t; val SIGALRM = _const "Posix_Signal_SIGALRM" : C_Signal.t; val SIGBUS = _const "Posix_Signal_SIGBUS" : C_Signal.t; val SIGCHLD = _const "Posix_Signal_SIGCHLD" : C_Signal.t; val SIGCONT = _const "Posix_Signal_SIGCONT" : C_Signal.t; val sigdelset = _import "Posix_Signal_sigdelset" private : (Word8.t) array * C_Signal.t -> (C_Int.t) C_Errno.t; val sigemptyset = _import "Posix_Signal_sigemptyset" private : (Word8.t) array -> (C_Int.t) C_Errno.t; val sigfillset = _import "Posix_Signal_sigfillset" private : (Word8.t) array -> (C_Int.t) C_Errno.t; val SIGFPE = _const "Posix_Signal_SIGFPE" : C_Signal.t; val SIGHUP = _const "Posix_Signal_SIGHUP" : C_Signal.t; val SIGILL = _const "Posix_Signal_SIGILL" : C_Signal.t; val SIGINT = _const "Posix_Signal_SIGINT" : C_Signal.t; val sigismember = _import "Posix_Signal_sigismember" private : (Word8.t) vector * C_Signal.t -> (C_Int.t) C_Errno.t; val SIGKILL = _const "Posix_Signal_SIGKILL" : C_Signal.t; val SIGPIPE = _const "Posix_Signal_SIGPIPE" : C_Signal.t; val SIGPOLL = _const "Posix_Signal_SIGPOLL" : C_Signal.t; val sigprocmask = _import "Posix_Signal_sigprocmask" private : C_Int.t * (Word8.t) vector * (Word8.t) array -> (C_Int.t) C_Errno.t; val SIGPROF = _const "Posix_Signal_SIGPROF" : C_Signal.t; val SIGQUIT = _const "Posix_Signal_SIGQUIT" : C_Signal.t; val SIGSEGV = _const "Posix_Signal_SIGSEGV" : C_Signal.t; val sigSetLen = _const "Posix_Signal_sigSetLen" : C_Size.t; val SIGSTOP = _const "Posix_Signal_SIGSTOP" : C_Signal.t; val sigsuspend = _import "Posix_Signal_sigsuspend" private : (Word8.t) vector -> unit; val SIGSYS = _const "Posix_Signal_SIGSYS" : C_Signal.t; val SIGTERM = _const "Posix_Signal_SIGTERM" : C_Signal.t; val SIGTRAP = _const "Posix_Signal_SIGTRAP" : C_Signal.t; val SIGTSTP = _const "Posix_Signal_SIGTSTP" : C_Signal.t; val SIGTTIN = _const "Posix_Signal_SIGTTIN" : C_Signal.t; val SIGTTOU = _const "Posix_Signal_SIGTTOU" : C_Signal.t; val SIGURG = _const "Posix_Signal_SIGURG" : C_Signal.t; val SIGUSR1 = _const "Posix_Signal_SIGUSR1" : C_Signal.t; val SIGUSR2 = _const "Posix_Signal_SIGUSR2" : C_Signal.t; val SIGVTALRM = _const "Posix_Signal_SIGVTALRM" : C_Signal.t; val SIGXCPU = _const "Posix_Signal_SIGXCPU" : C_Signal.t; val SIGXFSZ = _const "Posix_Signal_SIGXFSZ" : C_Signal.t; end structure SysDB = struct val getgrgid = _import "Posix_SysDB_getgrgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val getgrnam = _import "Posix_SysDB_getgrnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwnam = _import "Posix_SysDB_getpwnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwuid = _import "Posix_SysDB_getpwuid" private : C_GId.t -> (C_Int.t) C_Errno.t; structure Group = struct val getGId = _import "Posix_SysDB_Group_getGId" private : unit -> C_GId.t; val getMem = _import "Posix_SysDB_Group_getMem" private : unit -> C_StringArray.t; val getName = _import "Posix_SysDB_Group_getName" private : unit -> C_String.t; end structure Passwd = struct val getDir = _import "Posix_SysDB_Passwd_getDir" private : unit -> C_String.t; val getGId = _import "Posix_SysDB_Passwd_getGId" private : unit -> C_GId.t; val getName = _import "Posix_SysDB_Passwd_getName" private : unit -> C_String.t; val getShell = _import "Posix_SysDB_Passwd_getShell" private : unit -> C_String.t; val getUId = _import "Posix_SysDB_Passwd_getUId" private : unit -> C_UId.t; end end structure TTY = struct val B0 = _const "Posix_TTY_B0" : C_Speed.t; val B110 = _const "Posix_TTY_B110" : C_Speed.t; val B1200 = _const "Posix_TTY_B1200" : C_Speed.t; val B134 = _const "Posix_TTY_B134" : C_Speed.t; val B150 = _const "Posix_TTY_B150" : C_Speed.t; val B1800 = _const "Posix_TTY_B1800" : C_Speed.t; val B19200 = _const "Posix_TTY_B19200" : C_Speed.t; val B200 = _const "Posix_TTY_B200" : C_Speed.t; val B2400 = _const "Posix_TTY_B2400" : C_Speed.t; val B300 = _const "Posix_TTY_B300" : C_Speed.t; val B38400 = _const "Posix_TTY_B38400" : C_Speed.t; val B4800 = _const "Posix_TTY_B4800" : C_Speed.t; val B50 = _const "Posix_TTY_B50" : C_Speed.t; val B600 = _const "Posix_TTY_B600" : C_Speed.t; val B75 = _const "Posix_TTY_B75" : C_Speed.t; val B9600 = _const "Posix_TTY_B9600" : C_Speed.t; structure C = struct val CLOCAL = _const "Posix_TTY_C_CLOCAL" : C_TCFlag.t; val CREAD = _const "Posix_TTY_C_CREAD" : C_TCFlag.t; val CS5 = _const "Posix_TTY_C_CS5" : C_TCFlag.t; val CS6 = _const "Posix_TTY_C_CS6" : C_TCFlag.t; val CS7 = _const "Posix_TTY_C_CS7" : C_TCFlag.t; val CS8 = _const "Posix_TTY_C_CS8" : C_TCFlag.t; val CSIZE = _const "Posix_TTY_C_CSIZE" : C_TCFlag.t; val CSTOPB = _const "Posix_TTY_C_CSTOPB" : C_TCFlag.t; val HUPCL = _const "Posix_TTY_C_HUPCL" : C_TCFlag.t; val PARENB = _const "Posix_TTY_C_PARENB" : C_TCFlag.t; val PARODD = _const "Posix_TTY_C_PARODD" : C_TCFlag.t; end structure I = struct val BRKINT = _const "Posix_TTY_I_BRKINT" : C_TCFlag.t; val ICRNL = _const "Posix_TTY_I_ICRNL" : C_TCFlag.t; val IGNBRK = _const "Posix_TTY_I_IGNBRK" : C_TCFlag.t; val IGNCR = _const "Posix_TTY_I_IGNCR" : C_TCFlag.t; val IGNPAR = _const "Posix_TTY_I_IGNPAR" : C_TCFlag.t; val INLCR = _const "Posix_TTY_I_INLCR" : C_TCFlag.t; val INPCK = _const "Posix_TTY_I_INPCK" : C_TCFlag.t; val ISTRIP = _const "Posix_TTY_I_ISTRIP" : C_TCFlag.t; val IXANY = _const "Posix_TTY_I_IXANY" : C_TCFlag.t; val IXOFF = _const "Posix_TTY_I_IXOFF" : C_TCFlag.t; val IXON = _const "Posix_TTY_I_IXON" : C_TCFlag.t; val PARMRK = _const "Posix_TTY_I_PARMRK" : C_TCFlag.t; end structure L = struct val ECHO = _const "Posix_TTY_L_ECHO" : C_TCFlag.t; val ECHOE = _const "Posix_TTY_L_ECHOE" : C_TCFlag.t; val ECHOK = _const "Posix_TTY_L_ECHOK" : C_TCFlag.t; val ECHONL = _const "Posix_TTY_L_ECHONL" : C_TCFlag.t; val ICANON = _const "Posix_TTY_L_ICANON" : C_TCFlag.t; val IEXTEN = _const "Posix_TTY_L_IEXTEN" : C_TCFlag.t; val ISIG = _const "Posix_TTY_L_ISIG" : C_TCFlag.t; val NOFLSH = _const "Posix_TTY_L_NOFLSH" : C_TCFlag.t; val TOSTOP = _const "Posix_TTY_L_TOSTOP" : C_TCFlag.t; end structure O = struct val BS0 = _const "Posix_TTY_O_BS0" : C_TCFlag.t; val BS1 = _const "Posix_TTY_O_BS1" : C_TCFlag.t; val BSDLY = _const "Posix_TTY_O_BSDLY" : C_TCFlag.t; val CR0 = _const "Posix_TTY_O_CR0" : C_TCFlag.t; val CR1 = _const "Posix_TTY_O_CR1" : C_TCFlag.t; val CR2 = _const "Posix_TTY_O_CR2" : C_TCFlag.t; val CR3 = _const "Posix_TTY_O_CR3" : C_TCFlag.t; val CRDLY = _const "Posix_TTY_O_CRDLY" : C_TCFlag.t; val FF0 = _const "Posix_TTY_O_FF0" : C_TCFlag.t; val FF1 = _const "Posix_TTY_O_FF1" : C_TCFlag.t; val FFDLY = _const "Posix_TTY_O_FFDLY" : C_TCFlag.t; val NL0 = _const "Posix_TTY_O_NL0" : C_TCFlag.t; val NL1 = _const "Posix_TTY_O_NL1" : C_TCFlag.t; val NLDLY = _const "Posix_TTY_O_NLDLY" : C_TCFlag.t; val OCRNL = _const "Posix_TTY_O_OCRNL" : C_TCFlag.t; val OFILL = _const "Posix_TTY_O_OFILL" : C_TCFlag.t; val ONLCR = _const "Posix_TTY_O_ONLCR" : C_TCFlag.t; val ONLRET = _const "Posix_TTY_O_ONLRET" : C_TCFlag.t; val ONOCR = _const "Posix_TTY_O_ONOCR" : C_TCFlag.t; val OPOST = _const "Posix_TTY_O_OPOST" : C_TCFlag.t; val TAB0 = _const "Posix_TTY_O_TAB0" : C_TCFlag.t; val TAB1 = _const "Posix_TTY_O_TAB1" : C_TCFlag.t; val TAB2 = _const "Posix_TTY_O_TAB2" : C_TCFlag.t; val TAB3 = _const "Posix_TTY_O_TAB3" : C_TCFlag.t; val TABDLY = _const "Posix_TTY_O_TABDLY" : C_TCFlag.t; val VT0 = _const "Posix_TTY_O_VT0" : C_TCFlag.t; val VT1 = _const "Posix_TTY_O_VT1" : C_TCFlag.t; val VTDLY = _const "Posix_TTY_O_VTDLY" : C_TCFlag.t; end structure TC = struct val drain = _import "Posix_TTY_TC_drain" private : C_Fd.t -> (C_Int.t) C_Errno.t; val flow = _import "Posix_TTY_TC_flow" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val flush = _import "Posix_TTY_TC_flush" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getattr = _import "Posix_TTY_TC_getattr" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getpgrp = _import "Posix_TTY_TC_getpgrp" private : C_Fd.t -> (C_PId.t) C_Errno.t; val sendbreak = _import "Posix_TTY_TC_sendbreak" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setattr = _import "Posix_TTY_TC_setattr" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setpgrp = _import "Posix_TTY_TC_setpgrp" private : C_Fd.t * C_PId.t -> (C_Int.t) C_Errno.t; val TCIFLUSH = _const "Posix_TTY_TC_TCIFLUSH" : C_Int.t; val TCIOFF = _const "Posix_TTY_TC_TCIOFF" : C_Int.t; val TCIOFLUSH = _const "Posix_TTY_TC_TCIOFLUSH" : C_Int.t; val TCION = _const "Posix_TTY_TC_TCION" : C_Int.t; val TCOFLUSH = _const "Posix_TTY_TC_TCOFLUSH" : C_Int.t; val TCOOFF = _const "Posix_TTY_TC_TCOOFF" : C_Int.t; val TCOON = _const "Posix_TTY_TC_TCOON" : C_Int.t; val TCSADRAIN = _const "Posix_TTY_TC_TCSADRAIN" : C_Int.t; val TCSAFLUSH = _const "Posix_TTY_TC_TCSAFLUSH" : C_Int.t; val TCSANOW = _const "Posix_TTY_TC_TCSANOW" : C_Int.t; end structure Termios = struct val cfGetISpeed = _import "Posix_TTY_Termios_cfGetISpeed" private : unit -> C_Speed.t; val cfGetOSpeed = _import "Posix_TTY_Termios_cfGetOSpeed" private : unit -> C_Speed.t; val cfSetISpeed = _import "Posix_TTY_Termios_cfSetISpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val cfSetOSpeed = _import "Posix_TTY_Termios_cfSetOSpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val getCC = _import "Posix_TTY_Termios_getCC" private : (C_CC.t) array -> unit; val getCFlag = _import "Posix_TTY_Termios_getCFlag" private : unit -> C_TCFlag.t; val getIFlag = _import "Posix_TTY_Termios_getIFlag" private : unit -> C_TCFlag.t; val getLFlag = _import "Posix_TTY_Termios_getLFlag" private : unit -> C_TCFlag.t; val getOFlag = _import "Posix_TTY_Termios_getOFlag" private : unit -> C_TCFlag.t; val setCC = _import "Posix_TTY_Termios_setCC" private : (C_CC.t) array -> unit; val setCFlag = _import "Posix_TTY_Termios_setCFlag" private : C_TCFlag.t -> unit; val setIFlag = _import "Posix_TTY_Termios_setIFlag" private : C_TCFlag.t -> unit; val setLFlag = _import "Posix_TTY_Termios_setLFlag" private : C_TCFlag.t -> unit; val setOFlag = _import "Posix_TTY_Termios_setOFlag" private : C_TCFlag.t -> unit; end structure V = struct val NCCS = _const "Posix_TTY_V_NCCS" : C_Int.t; val VEOF = _const "Posix_TTY_V_VEOF" : C_Int.t; val VEOL = _const "Posix_TTY_V_VEOL" : C_Int.t; val VERASE = _const "Posix_TTY_V_VERASE" : C_Int.t; val VINTR = _const "Posix_TTY_V_VINTR" : C_Int.t; val VKILL = _const "Posix_TTY_V_VKILL" : C_Int.t; val VMIN = _const "Posix_TTY_V_VMIN" : C_Int.t; val VQUIT = _const "Posix_TTY_V_VQUIT" : C_Int.t; val VSTART = _const "Posix_TTY_V_VSTART" : C_Int.t; val VSTOP = _const "Posix_TTY_V_VSTOP" : C_Int.t; val VSUSP = _const "Posix_TTY_V_VSUSP" : C_Int.t; val VTIME = _const "Posix_TTY_V_VTIME" : C_Int.t; end end end structure Real32 = struct type t = Real32.t val abs = _import "Real32_abs" private inline : Real32.t -> Real32.t; val add = _import "Real32_add" private inline : Real32.t * Real32.t -> Real32.t; val castToWord32 = _import "Real32_castToWord32" private inline : Real32.t -> Word32.t; val div = _import "Real32_div" private inline : Real32.t * Real32.t -> Real32.t; val equal = _import "Real32_equal" private inline : Real32.t * Real32.t -> Bool.t; val fetch = _import "Real32_fetch" private inline : (Real32.t) ref -> Real32.t; val frexp = _import "Real32_frexp" private inline : Real32.t * (C_Int.t) ref -> Real32.t; val gdtoa = _import "Real32_gdtoa" private : Real32.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real32_ldexp" private inline : Real32.t * C_Int.t -> Real32.t; val le = _import "Real32_le" private inline : Real32.t * Real32.t -> Bool.t; val lt = _import "Real32_lt" private inline : Real32.t * Real32.t -> Bool.t; structure Math = struct val acos = _import "Real32_Math_acos" private inline : Real32.t -> Real32.t; val asin = _import "Real32_Math_asin" private inline : Real32.t -> Real32.t; val atan = _import "Real32_Math_atan" private inline : Real32.t -> Real32.t; val atan2 = _import "Real32_Math_atan2" private inline : Real32.t * Real32.t -> Real32.t; val cos = _import "Real32_Math_cos" private inline : Real32.t -> Real32.t; val cosh = _import "Real32_Math_cosh" private inline : Real32.t -> Real32.t; val exp = _import "Real32_Math_exp" private inline : Real32.t -> Real32.t; val ln = _import "Real32_Math_ln" private inline : Real32.t -> Real32.t; val log10 = _import "Real32_Math_log10" private inline : Real32.t -> Real32.t; val pow = _import "Real32_Math_pow" private inline : Real32.t * Real32.t -> Real32.t; val sin = _import "Real32_Math_sin" private inline : Real32.t -> Real32.t; val sinh = _import "Real32_Math_sinh" private inline : Real32.t -> Real32.t; val sqrt = _import "Real32_Math_sqrt" private inline : Real32.t -> Real32.t; val tan = _import "Real32_Math_tan" private inline : Real32.t -> Real32.t; val tanh = _import "Real32_Math_tanh" private inline : Real32.t -> Real32.t; end val modf = _import "Real32_modf" private inline : Real32.t * (Real32.t) ref -> Real32.t; val move = _import "Real32_move" private inline : (Real32.t) ref * (Real32.t) ref -> unit; val mul = _import "Real32_mul" private inline : Real32.t * Real32.t -> Real32.t; val muladd = _import "Real32_muladd" private inline : Real32.t * Real32.t * Real32.t -> Real32.t; val mulsub = _import "Real32_mulsub" private inline : Real32.t * Real32.t * Real32.t -> Real32.t; val neg = _import "Real32_neg" private inline : Real32.t -> Real32.t; val realCeil = _import "Real32_realCeil" private inline : Real32.t -> Real32.t; val realFloor = _import "Real32_realFloor" private inline : Real32.t -> Real32.t; val realTrunc = _import "Real32_realTrunc" private inline : Real32.t -> Real32.t; val rndToReal32 = _import "Real32_rndToReal32" private inline : Real32.t -> Real32.t; val rndToReal64 = _import "Real32_rndToReal64" private inline : Real32.t -> Real64.t; val rndToWordS16 = _import "Real32_rndToWordS16" private inline : Real32.t -> Int16.t; val rndToWordS32 = _import "Real32_rndToWordS32" private inline : Real32.t -> Int32.t; val rndToWordS64 = _import "Real32_rndToWordS64" private inline : Real32.t -> Int64.t; val rndToWordS8 = _import "Real32_rndToWordS8" private inline : Real32.t -> Int8.t; val rndToWordU16 = _import "Real32_rndToWordU16" private inline : Real32.t -> Word16.t; val rndToWordU32 = _import "Real32_rndToWordU32" private inline : Real32.t -> Word32.t; val rndToWordU64 = _import "Real32_rndToWordU64" private inline : Real32.t -> Word64.t; val rndToWordU8 = _import "Real32_rndToWordU8" private inline : Real32.t -> Word8.t; val round = _import "Real32_round" private inline : Real32.t -> Real32.t; val store = _import "Real32_store" private inline : (Real32.t) ref * Real32.t -> unit; val strtor = _import "Real32_strtor" private : NullString8.t * C_Int.t -> Real32.t; val sub = _import "Real32_sub" private inline : Real32.t * Real32.t -> Real32.t; end structure Real64 = struct type t = Real64.t val abs = _import "Real64_abs" private inline : Real64.t -> Real64.t; val add = _import "Real64_add" private inline : Real64.t * Real64.t -> Real64.t; val castToWord64 = _import "Real64_castToWord64" private inline : Real64.t -> Word64.t; val div = _import "Real64_div" private inline : Real64.t * Real64.t -> Real64.t; val equal = _import "Real64_equal" private inline : Real64.t * Real64.t -> Bool.t; val fetch = _import "Real64_fetch" private inline : (Real64.t) ref -> Real64.t; val frexp = _import "Real64_frexp" private inline : Real64.t * (C_Int.t) ref -> Real64.t; val gdtoa = _import "Real64_gdtoa" private : Real64.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real64_ldexp" private inline : Real64.t * C_Int.t -> Real64.t; val le = _import "Real64_le" private inline : Real64.t * Real64.t -> Bool.t; val lt = _import "Real64_lt" private inline : Real64.t * Real64.t -> Bool.t; structure Math = struct val acos = _import "Real64_Math_acos" private inline : Real64.t -> Real64.t; val asin = _import "Real64_Math_asin" private inline : Real64.t -> Real64.t; val atan = _import "Real64_Math_atan" private inline : Real64.t -> Real64.t; val atan2 = _import "Real64_Math_atan2" private inline : Real64.t * Real64.t -> Real64.t; val cos = _import "Real64_Math_cos" private inline : Real64.t -> Real64.t; val cosh = _import "Real64_Math_cosh" private inline : Real64.t -> Real64.t; val exp = _import "Real64_Math_exp" private inline : Real64.t -> Real64.t; val ln = _import "Real64_Math_ln" private inline : Real64.t -> Real64.t; val log10 = _import "Real64_Math_log10" private inline : Real64.t -> Real64.t; val pow = _import "Real64_Math_pow" private inline : Real64.t * Real64.t -> Real64.t; val sin = _import "Real64_Math_sin" private inline : Real64.t -> Real64.t; val sinh = _import "Real64_Math_sinh" private inline : Real64.t -> Real64.t; val sqrt = _import "Real64_Math_sqrt" private inline : Real64.t -> Real64.t; val tan = _import "Real64_Math_tan" private inline : Real64.t -> Real64.t; val tanh = _import "Real64_Math_tanh" private inline : Real64.t -> Real64.t; end val modf = _import "Real64_modf" private inline : Real64.t * (Real64.t) ref -> Real64.t; val move = _import "Real64_move" private inline : (Real64.t) ref * (Real64.t) ref -> unit; val mul = _import "Real64_mul" private inline : Real64.t * Real64.t -> Real64.t; val muladd = _import "Real64_muladd" private inline : Real64.t * Real64.t * Real64.t -> Real64.t; val mulsub = _import "Real64_mulsub" private inline : Real64.t * Real64.t * Real64.t -> Real64.t; val neg = _import "Real64_neg" private inline : Real64.t -> Real64.t; val realCeil = _import "Real64_realCeil" private inline : Real64.t -> Real64.t; val realFloor = _import "Real64_realFloor" private inline : Real64.t -> Real64.t; val realTrunc = _import "Real64_realTrunc" private inline : Real64.t -> Real64.t; val rndToReal32 = _import "Real64_rndToReal32" private inline : Real64.t -> Real32.t; val rndToReal64 = _import "Real64_rndToReal64" private inline : Real64.t -> Real64.t; val rndToWordS16 = _import "Real64_rndToWordS16" private inline : Real64.t -> Int16.t; val rndToWordS32 = _import "Real64_rndToWordS32" private inline : Real64.t -> Int32.t; val rndToWordS64 = _import "Real64_rndToWordS64" private inline : Real64.t -> Int64.t; val rndToWordS8 = _import "Real64_rndToWordS8" private inline : Real64.t -> Int8.t; val rndToWordU16 = _import "Real64_rndToWordU16" private inline : Real64.t -> Word16.t; val rndToWordU32 = _import "Real64_rndToWordU32" private inline : Real64.t -> Word32.t; val rndToWordU64 = _import "Real64_rndToWordU64" private inline : Real64.t -> Word64.t; val rndToWordU8 = _import "Real64_rndToWordU8" private inline : Real64.t -> Word8.t; val round = _import "Real64_round" private inline : Real64.t -> Real64.t; val store = _import "Real64_store" private inline : (Real64.t) ref * Real64.t -> unit; val strtor = _import "Real64_strtor" private : NullString8.t * C_Int.t -> Real64.t; val sub = _import "Real64_sub" private inline : Real64.t * Real64.t -> Real64.t; end structure Socket = struct val accept = _import "Socket_accept" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; structure AF = struct val INET = _const "Socket_AF_INET" : C_Int.t; val INET6 = _const "Socket_AF_INET6" : C_Int.t; val UNIX = _const "Socket_AF_UNIX" : C_Int.t; val UNSPEC = _const "Socket_AF_UNSPEC" : C_Int.t; end val bind = _import "Socket_bind" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val close = _import "Socket_close" private : C_Sock.t -> (C_Int.t) C_Errno.t; val connect = _import "Socket_connect" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; structure Ctl = struct val getATMARK = _import "Socket_Ctl_getATMARK" private : C_Sock.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getNREAD = _import "Socket_Ctl_getNREAD" private : C_Sock.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getPeerName = _import "Socket_Ctl_getPeerName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockName = _import "Socket_Ctl_getSockName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockOptC_Int = _import "Socket_Ctl_getSockOptC_Int" private : C_Sock.t * C_Int.t * C_Int.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val getSockOptC_Linger = _import "Socket_Ctl_getSockOptC_Linger" private : C_Sock.t * C_Int.t * C_Int.t * (C_Int.t) ref * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val setSockOptC_Int = _import "Socket_Ctl_setSockOptC_Int" private : C_Sock.t * C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val setSockOptC_Linger = _import "Socket_Ctl_setSockOptC_Linger" private : C_Sock.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val SO_ACCEPTCONN = _const "Socket_Ctl_SO_ACCEPTCONN" : C_Int.t; val SO_BROADCAST = _const "Socket_Ctl_SO_BROADCAST" : C_Int.t; val SO_DEBUG = _const "Socket_Ctl_SO_DEBUG" : C_Int.t; val SO_DONTROUTE = _const "Socket_Ctl_SO_DONTROUTE" : C_Int.t; val SO_ERROR = _const "Socket_Ctl_SO_ERROR" : C_Int.t; val SO_KEEPALIVE = _const "Socket_Ctl_SO_KEEPALIVE" : C_Int.t; val SO_LINGER = _const "Socket_Ctl_SO_LINGER" : C_Int.t; val SO_OOBINLINE = _const "Socket_Ctl_SO_OOBINLINE" : C_Int.t; val SO_RCVBUF = _const "Socket_Ctl_SO_RCVBUF" : C_Int.t; val SO_RCVLOWAT = _const "Socket_Ctl_SO_RCVLOWAT" : C_Int.t; val SO_RCVTIMEO = _const "Socket_Ctl_SO_RCVTIMEO" : C_Int.t; val SO_REUSEADDR = _const "Socket_Ctl_SO_REUSEADDR" : C_Int.t; val SO_SNDBUF = _const "Socket_Ctl_SO_SNDBUF" : C_Int.t; val SO_SNDLOWAT = _const "Socket_Ctl_SO_SNDLOWAT" : C_Int.t; val SO_SNDTIMEO = _const "Socket_Ctl_SO_SNDTIMEO" : C_Int.t; val SO_TYPE = _const "Socket_Ctl_SO_TYPE" : C_Int.t; val SOL_SOCKET = _const "Socket_Ctl_SOL_SOCKET" : C_Int.t; end val familyOfAddr = _import "Socket_familyOfAddr" private : (Word8.t) vector -> C_Int.t; structure GenericSock = struct val socket = _import "Socket_GenericSock_socket" private : C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val socketPair = _import "Socket_GenericSock_socketPair" private : C_Int.t * C_Int.t * C_Int.t * (C_Int.t) array -> (C_Int.t) C_Errno.t; end val getTimeout_sec = _import "Socket_getTimeout_sec" private : unit -> C_Time.t; val getTimeout_usec = _import "Socket_getTimeout_usec" private : unit -> C_SUSeconds.t; structure INetSock = struct structure Ctl = struct val IPPROTO_TCP = _const "Socket_INetSock_Ctl_IPPROTO_TCP" : C_Int.t; val TCP_NODELAY = _const "Socket_INetSock_Ctl_TCP_NODELAY" : C_Int.t; end val fromAddr = _import "Socket_INetSock_fromAddr" private : (Word8.t) vector -> unit; val getInAddr = _import "Socket_INetSock_getInAddr" private : (Word8.t) array -> unit; val getPort = _import "Socket_INetSock_getPort" private : unit -> Word16.t; val toAddr = _import "Socket_INetSock_toAddr" private : (Word8.t) vector * Word16.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end val listen = _import "Socket_listen" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; val MSG_CTRUNC = _const "Socket_MSG_CTRUNC" : C_Int.t; val MSG_DONTROUTE = _const "Socket_MSG_DONTROUTE" : C_Int.t; val MSG_DONTWAIT = _const "Socket_MSG_DONTWAIT" : C_Int.t; val MSG_EOR = _const "Socket_MSG_EOR" : C_Int.t; val MSG_OOB = _const "Socket_MSG_OOB" : C_Int.t; val MSG_PEEK = _const "Socket_MSG_PEEK" : C_Int.t; val MSG_TRUNC = _const "Socket_MSG_TRUNC" : C_Int.t; val MSG_WAITALL = _const "Socket_MSG_WAITALL" : C_Int.t; val recv = _import "Socket_recv" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val recvFrom = _import "Socket_recvFrom" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_SSize.t) C_Errno.t; val select = _import "Socket_select" private : (C_Fd.t) vector * (C_Fd.t) vector * (C_Fd.t) vector * (C_Int.t) array * (C_Int.t) array * (C_Int.t) array -> (C_Int.t) C_Errno.t; val sendArr = _import "Socket_sendArr" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendArrTo = _import "Socket_sendArrTo" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val sendVec = _import "Socket_sendVec" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendVecTo = _import "Socket_sendVecTo" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val setTimeout = _import "Socket_setTimeout" private : C_Time.t * C_SUSeconds.t -> unit; val setTimeoutNull = _import "Socket_setTimeoutNull" private : unit -> unit; val SHUT_RD = _const "Socket_SHUT_RD" : C_Int.t; val SHUT_RDWR = _const "Socket_SHUT_RDWR" : C_Int.t; val SHUT_WR = _const "Socket_SHUT_WR" : C_Int.t; val shutdown = _import "Socket_shutdown" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; structure SOCK = struct val DGRAM = _const "Socket_SOCK_DGRAM" : C_Int.t; val RAW = _const "Socket_SOCK_RAW" : C_Int.t; val SEQPACKET = _const "Socket_SOCK_SEQPACKET" : C_Int.t; val STREAM = _const "Socket_SOCK_STREAM" : C_Int.t; end val sockAddrStorageLen = _const "Socket_sockAddrStorageLen" : C_Size.t; structure UnixSock = struct val fromAddr = _import "Socket_UnixSock_fromAddr" private : (Word8.t) vector * (Char8.t) array * C_Size.t -> unit; val pathLen = _import "Socket_UnixSock_pathLen" private : (Word8.t) vector -> C_Size.t; val toAddr = _import "Socket_UnixSock_toAddr" private : NullString8.t * C_Size.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end end structure Stdio = struct val print = _import "Stdio_print" private : String8.t -> unit; val printStderr = _import "Stdio_printStderr" private : String8.t -> unit; val printStdout = _import "Stdio_printStdout" private : String8.t -> unit; end structure Time = struct val getTimeOfDay = _import "Time_getTimeOfDay" private : (C_Time.t) ref * (C_SUSeconds.t) ref -> C_Int.t; end structure Windows = struct structure Process = struct val create = _import "Windows_Process_create" private : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val createNull = _import "Windows_Process_createNull" private : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val getexitcode = _import "Windows_Process_getexitcode" private : C_PId.t * (C_Status.t) ref -> (C_Int.t) C_Errno.t; val terminate = _import "Windows_Process_terminate" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; end end structure Word16 = struct type t = Word16.t val add = _import "Word16_add" private inline : Word16.t * Word16.t -> Word16.t; val andb = _import "Word16_andb" private inline : Word16.t * Word16.t -> Word16.t; val equal = _import "Word16_equal" private inline : Word16.t * Word16.t -> Bool.t; val lshift = _import "Word16_lshift" private inline : Word16.t * Word32.t -> Word16.t; val neg = _import "Word16_neg" private inline : Word16.t -> Word16.t; val notb = _import "Word16_notb" private inline : Word16.t -> Word16.t; val orb = _import "Word16_orb" private inline : Word16.t * Word16.t -> Word16.t; val rol = _import "Word16_rol" private inline : Word16.t * Word32.t -> Word16.t; val ror = _import "Word16_ror" private inline : Word16.t * Word32.t -> Word16.t; val sub = _import "Word16_sub" private inline : Word16.t * Word16.t -> Word16.t; val xorb = _import "Word16_xorb" private inline : Word16.t * Word16.t -> Word16.t; end structure Word32 = struct type t = Word32.t val add = _import "Word32_add" private inline : Word32.t * Word32.t -> Word32.t; val andb = _import "Word32_andb" private inline : Word32.t * Word32.t -> Word32.t; val castToReal32 = _import "Word32_castToReal32" private inline : Word32.t -> Real32.t; val equal = _import "Word32_equal" private inline : Word32.t * Word32.t -> Bool.t; val lshift = _import "Word32_lshift" private inline : Word32.t * Word32.t -> Word32.t; val neg = _import "Word32_neg" private inline : Word32.t -> Word32.t; val notb = _import "Word32_notb" private inline : Word32.t -> Word32.t; val orb = _import "Word32_orb" private inline : Word32.t * Word32.t -> Word32.t; val rol = _import "Word32_rol" private inline : Word32.t * Word32.t -> Word32.t; val ror = _import "Word32_ror" private inline : Word32.t * Word32.t -> Word32.t; val sub = _import "Word32_sub" private inline : Word32.t * Word32.t -> Word32.t; val xorb = _import "Word32_xorb" private inline : Word32.t * Word32.t -> Word32.t; end structure Word64 = struct type t = Word64.t val add = _import "Word64_add" private inline : Word64.t * Word64.t -> Word64.t; val andb = _import "Word64_andb" private inline : Word64.t * Word64.t -> Word64.t; val castToReal64 = _import "Word64_castToReal64" private inline : Word64.t -> Real64.t; val equal = _import "Word64_equal" private inline : Word64.t * Word64.t -> Bool.t; val fetch = _import "Word64_fetch" private inline : (Word64.t) ref -> Word64.t; val lshift = _import "Word64_lshift" private inline : Word64.t * Word32.t -> Word64.t; val move = _import "Word64_move" private inline : (Word64.t) ref * (Word64.t) ref -> unit; val neg = _import "Word64_neg" private inline : Word64.t -> Word64.t; val notb = _import "Word64_notb" private inline : Word64.t -> Word64.t; val orb = _import "Word64_orb" private inline : Word64.t * Word64.t -> Word64.t; val rol = _import "Word64_rol" private inline : Word64.t * Word32.t -> Word64.t; val ror = _import "Word64_ror" private inline : Word64.t * Word32.t -> Word64.t; val store = _import "Word64_store" private inline : (Word64.t) ref * Word64.t -> unit; val sub = _import "Word64_sub" private inline : Word64.t * Word64.t -> Word64.t; val xorb = _import "Word64_xorb" private inline : Word64.t * Word64.t -> Word64.t; end structure Word8 = struct type t = Word8.t val add = _import "Word8_add" private inline : Word8.t * Word8.t -> Word8.t; val andb = _import "Word8_andb" private inline : Word8.t * Word8.t -> Word8.t; val equal = _import "Word8_equal" private inline : Word8.t * Word8.t -> Bool.t; val lshift = _import "Word8_lshift" private inline : Word8.t * Word32.t -> Word8.t; val neg = _import "Word8_neg" private inline : Word8.t -> Word8.t; val notb = _import "Word8_notb" private inline : Word8.t -> Word8.t; val orb = _import "Word8_orb" private inline : Word8.t * Word8.t -> Word8.t; val rol = _import "Word8_rol" private inline : Word8.t * Word32.t -> Word8.t; val ror = _import "Word8_ror" private inline : Word8.t * Word32.t -> Word8.t; val sub = _import "Word8_sub" private inline : Word8.t * Word8.t -> Word8.t; val xorb = _import "Word8_xorb" private inline : Word8.t * Word8.t -> Word8.t; end structure WordS16 = struct val addCheckP = _import "WordS16_addCheckP" private inline : Int16.t * Int16.t -> Bool.t; val extdToWord16 = _import "WordS16_extdToWord16" private inline : Int16.t -> Word16.t; val extdToWord32 = _import "WordS16_extdToWord32" private inline : Int16.t -> Word32.t; val extdToWord64 = _import "WordS16_extdToWord64" private inline : Int16.t -> Word64.t; val extdToWord8 = _import "WordS16_extdToWord8" private inline : Int16.t -> Word8.t; val ge = _import "WordS16_ge" private inline : Int16.t * Int16.t -> Bool.t; val gt = _import "WordS16_gt" private inline : Int16.t * Int16.t -> Bool.t; val le = _import "WordS16_le" private inline : Int16.t * Int16.t -> Bool.t; val lt = _import "WordS16_lt" private inline : Int16.t * Int16.t -> Bool.t; val mul = _import "WordS16_mul" private inline : Int16.t * Int16.t -> Int16.t; val mulCheckP = _import "WordS16_mulCheckP" private inline : Int16.t * Int16.t -> Bool.t; val negCheckP = _import "WordS16_negCheckP" private inline : Int16.t -> Bool.t; val quot = _import "WordS16_quot" private inline : Int16.t * Int16.t -> Int16.t; val rem = _import "WordS16_rem" private inline : Int16.t * Int16.t -> Int16.t; val rndToReal32 = _import "WordS16_rndToReal32" private : Int16.t -> Real32.t; val rndToReal64 = _import "WordS16_rndToReal64" private : Int16.t -> Real64.t; val rshift = _import "WordS16_rshift" private inline : Int16.t * Word32.t -> Int16.t; val subCheckP = _import "WordS16_subCheckP" private inline : Int16.t * Int16.t -> Bool.t; end structure WordS32 = struct val addCheckP = _import "WordS32_addCheckP" private inline : Int32.t * Int32.t -> Bool.t; val extdToWord16 = _import "WordS32_extdToWord16" private inline : Int32.t -> Word16.t; val extdToWord32 = _import "WordS32_extdToWord32" private inline : Int32.t -> Word32.t; val extdToWord64 = _import "WordS32_extdToWord64" private inline : Int32.t -> Word64.t; val extdToWord8 = _import "WordS32_extdToWord8" private inline : Int32.t -> Word8.t; val ge = _import "WordS32_ge" private inline : Int32.t * Int32.t -> Bool.t; val gt = _import "WordS32_gt" private inline : Int32.t * Int32.t -> Bool.t; val le = _import "WordS32_le" private inline : Int32.t * Int32.t -> Bool.t; val lt = _import "WordS32_lt" private inline : Int32.t * Int32.t -> Bool.t; val mul = _import "WordS32_mul" private inline : Int32.t * Int32.t -> Int32.t; val mulCheckP = _import "WordS32_mulCheckP" private inline : Int32.t * Int32.t -> Bool.t; val negCheckP = _import "WordS32_negCheckP" private inline : Int32.t -> Bool.t; val quot = _import "WordS32_quot" private inline : Int32.t * Int32.t -> Int32.t; val rem = _import "WordS32_rem" private inline : Int32.t * Int32.t -> Int32.t; val rndToReal32 = _import "WordS32_rndToReal32" private : Int32.t -> Real32.t; val rndToReal64 = _import "WordS32_rndToReal64" private : Int32.t -> Real64.t; val rshift = _import "WordS32_rshift" private inline : Int32.t * Word32.t -> Int32.t; val subCheckP = _import "WordS32_subCheckP" private inline : Int32.t * Int32.t -> Bool.t; end structure WordS64 = struct val addCheckP = _import "WordS64_addCheckP" private inline : Int64.t * Int64.t -> Bool.t; val extdToWord16 = _import "WordS64_extdToWord16" private inline : Int64.t -> Word16.t; val extdToWord32 = _import "WordS64_extdToWord32" private inline : Int64.t -> Word32.t; val extdToWord64 = _import "WordS64_extdToWord64" private inline : Int64.t -> Word64.t; val extdToWord8 = _import "WordS64_extdToWord8" private inline : Int64.t -> Word8.t; val ge = _import "WordS64_ge" private inline : Int64.t * Int64.t -> Bool.t; val gt = _import "WordS64_gt" private inline : Int64.t * Int64.t -> Bool.t; val le = _import "WordS64_le" private inline : Int64.t * Int64.t -> Bool.t; val lt = _import "WordS64_lt" private inline : Int64.t * Int64.t -> Bool.t; val mul = _import "WordS64_mul" private inline : Int64.t * Int64.t -> Int64.t; val mulCheckP = _import "WordS64_mulCheckP" private inline : Int64.t * Int64.t -> Bool.t; val negCheckP = _import "WordS64_negCheckP" private inline : Int64.t -> Bool.t; val quot = _import "WordS64_quot" private inline : Int64.t * Int64.t -> Int64.t; val rem = _import "WordS64_rem" private inline : Int64.t * Int64.t -> Int64.t; val rndToReal32 = _import "WordS64_rndToReal32" private : Int64.t -> Real32.t; val rndToReal64 = _import "WordS64_rndToReal64" private : Int64.t -> Real64.t; val rshift = _import "WordS64_rshift" private inline : Int64.t * Word32.t -> Int64.t; val subCheckP = _import "WordS64_subCheckP" private inline : Int64.t * Int64.t -> Bool.t; end structure WordS8 = struct val addCheckP = _import "WordS8_addCheckP" private inline : Int8.t * Int8.t -> Bool.t; val extdToWord16 = _import "WordS8_extdToWord16" private inline : Int8.t -> Word16.t; val extdToWord32 = _import "WordS8_extdToWord32" private inline : Int8.t -> Word32.t; val extdToWord64 = _import "WordS8_extdToWord64" private inline : Int8.t -> Word64.t; val extdToWord8 = _import "WordS8_extdToWord8" private inline : Int8.t -> Word8.t; val ge = _import "WordS8_ge" private inline : Int8.t * Int8.t -> Bool.t; val gt = _import "WordS8_gt" private inline : Int8.t * Int8.t -> Bool.t; val le = _import "WordS8_le" private inline : Int8.t * Int8.t -> Bool.t; val lt = _import "WordS8_lt" private inline : Int8.t * Int8.t -> Bool.t; val mul = _import "WordS8_mul" private inline : Int8.t * Int8.t -> Int8.t; val mulCheckP = _import "WordS8_mulCheckP" private inline : Int8.t * Int8.t -> Bool.t; val negCheckP = _import "WordS8_negCheckP" private inline : Int8.t -> Bool.t; val quot = _import "WordS8_quot" private inline : Int8.t * Int8.t -> Int8.t; val rem = _import "WordS8_rem" private inline : Int8.t * Int8.t -> Int8.t; val rndToReal32 = _import "WordS8_rndToReal32" private : Int8.t -> Real32.t; val rndToReal64 = _import "WordS8_rndToReal64" private : Int8.t -> Real64.t; val rshift = _import "WordS8_rshift" private inline : Int8.t * Word32.t -> Int8.t; val subCheckP = _import "WordS8_subCheckP" private inline : Int8.t * Int8.t -> Bool.t; end structure WordU16 = struct val addCheckP = _import "WordU16_addCheckP" private inline : Word16.t * Word16.t -> Bool.t; val extdToWord16 = _import "WordU16_extdToWord16" private inline : Word16.t -> Word16.t; val extdToWord32 = _import "WordU16_extdToWord32" private inline : Word16.t -> Word32.t; val extdToWord64 = _import "WordU16_extdToWord64" private inline : Word16.t -> Word64.t; val extdToWord8 = _import "WordU16_extdToWord8" private inline : Word16.t -> Word8.t; val ge = _import "WordU16_ge" private inline : Word16.t * Word16.t -> Bool.t; val gt = _import "WordU16_gt" private inline : Word16.t * Word16.t -> Bool.t; val le = _import "WordU16_le" private inline : Word16.t * Word16.t -> Bool.t; val lt = _import "WordU16_lt" private inline : Word16.t * Word16.t -> Bool.t; val mul = _import "WordU16_mul" private inline : Word16.t * Word16.t -> Word16.t; val mulCheckP = _import "WordU16_mulCheckP" private inline : Word16.t * Word16.t -> Bool.t; val negCheckP = _import "WordU16_negCheckP" private inline : Word16.t -> Bool.t; val quot = _import "WordU16_quot" private inline : Word16.t * Word16.t -> Word16.t; val rem = _import "WordU16_rem" private inline : Word16.t * Word16.t -> Word16.t; val rndToReal32 = _import "WordU16_rndToReal32" private : Word16.t -> Real32.t; val rndToReal64 = _import "WordU16_rndToReal64" private : Word16.t -> Real64.t; val rshift = _import "WordU16_rshift" private inline : Word16.t * Word32.t -> Word16.t; val subCheckP = _import "WordU16_subCheckP" private inline : Word16.t * Word16.t -> Bool.t; end structure WordU32 = struct val addCheckP = _import "WordU32_addCheckP" private inline : Word32.t * Word32.t -> Bool.t; val extdToWord16 = _import "WordU32_extdToWord16" private inline : Word32.t -> Word16.t; val extdToWord32 = _import "WordU32_extdToWord32" private inline : Word32.t -> Word32.t; val extdToWord64 = _import "WordU32_extdToWord64" private inline : Word32.t -> Word64.t; val extdToWord8 = _import "WordU32_extdToWord8" private inline : Word32.t -> Word8.t; val ge = _import "WordU32_ge" private inline : Word32.t * Word32.t -> Bool.t; val gt = _import "WordU32_gt" private inline : Word32.t * Word32.t -> Bool.t; val le = _import "WordU32_le" private inline : Word32.t * Word32.t -> Bool.t; val lt = _import "WordU32_lt" private inline : Word32.t * Word32.t -> Bool.t; val mul = _import "WordU32_mul" private inline : Word32.t * Word32.t -> Word32.t; val mulCheckP = _import "WordU32_mulCheckP" private inline : Word32.t * Word32.t -> Bool.t; val negCheckP = _import "WordU32_negCheckP" private inline : Word32.t -> Bool.t; val quot = _import "WordU32_quot" private inline : Word32.t * Word32.t -> Word32.t; val rem = _import "WordU32_rem" private inline : Word32.t * Word32.t -> Word32.t; val rndToReal32 = _import "WordU32_rndToReal32" private : Word32.t -> Real32.t; val rndToReal64 = _import "WordU32_rndToReal64" private : Word32.t -> Real64.t; val rshift = _import "WordU32_rshift" private inline : Word32.t * Word32.t -> Word32.t; val subCheckP = _import "WordU32_subCheckP" private inline : Word32.t * Word32.t -> Bool.t; end structure WordU64 = struct val addCheckP = _import "WordU64_addCheckP" private inline : Word64.t * Word64.t -> Bool.t; val extdToWord16 = _import "WordU64_extdToWord16" private inline : Word64.t -> Word16.t; val extdToWord32 = _import "WordU64_extdToWord32" private inline : Word64.t -> Word32.t; val extdToWord64 = _import "WordU64_extdToWord64" private inline : Word64.t -> Word64.t; val extdToWord8 = _import "WordU64_extdToWord8" private inline : Word64.t -> Word8.t; val ge = _import "WordU64_ge" private inline : Word64.t * Word64.t -> Bool.t; val gt = _import "WordU64_gt" private inline : Word64.t * Word64.t -> Bool.t; val le = _import "WordU64_le" private inline : Word64.t * Word64.t -> Bool.t; val lt = _import "WordU64_lt" private inline : Word64.t * Word64.t -> Bool.t; val mul = _import "WordU64_mul" private inline : Word64.t * Word64.t -> Word64.t; val mulCheckP = _import "WordU64_mulCheckP" private inline : Word64.t * Word64.t -> Bool.t; val negCheckP = _import "WordU64_negCheckP" private inline : Word64.t -> Bool.t; val quot = _import "WordU64_quot" private inline : Word64.t * Word64.t -> Word64.t; val rem = _import "WordU64_rem" private inline : Word64.t * Word64.t -> Word64.t; val rndToReal32 = _import "WordU64_rndToReal32" private : Word64.t -> Real32.t; val rndToReal64 = _import "WordU64_rndToReal64" private : Word64.t -> Real64.t; val rshift = _import "WordU64_rshift" private inline : Word64.t * Word32.t -> Word64.t; val subCheckP = _import "WordU64_subCheckP" private inline : Word64.t * Word64.t -> Bool.t; end structure WordU8 = struct val addCheckP = _import "WordU8_addCheckP" private inline : Word8.t * Word8.t -> Bool.t; val extdToWord16 = _import "WordU8_extdToWord16" private inline : Word8.t -> Word16.t; val extdToWord32 = _import "WordU8_extdToWord32" private inline : Word8.t -> Word32.t; val extdToWord64 = _import "WordU8_extdToWord64" private inline : Word8.t -> Word64.t; val extdToWord8 = _import "WordU8_extdToWord8" private inline : Word8.t -> Word8.t; val ge = _import "WordU8_ge" private inline : Word8.t * Word8.t -> Bool.t; val gt = _import "WordU8_gt" private inline : Word8.t * Word8.t -> Bool.t; val le = _import "WordU8_le" private inline : Word8.t * Word8.t -> Bool.t; val lt = _import "WordU8_lt" private inline : Word8.t * Word8.t -> Bool.t; val mul = _import "WordU8_mul" private inline : Word8.t * Word8.t -> Word8.t; val mulCheckP = _import "WordU8_mulCheckP" private inline : Word8.t * Word8.t -> Bool.t; val negCheckP = _import "WordU8_negCheckP" private inline : Word8.t -> Bool.t; val quot = _import "WordU8_quot" private inline : Word8.t * Word8.t -> Word8.t; val rem = _import "WordU8_rem" private inline : Word8.t * Word8.t -> Word8.t; val rndToReal32 = _import "WordU8_rndToReal32" private : Word8.t -> Real32.t; val rndToReal64 = _import "WordU8_rndToReal64" private : Word8.t -> Real64.t; val rshift = _import "WordU8_rshift" private inline : Word8.t * Word32.t -> Word8.t; val subCheckP = _import "WordU8_subCheckP" private inline : Word8.t * Word8.t -> Bool.t; end end end mlton-20210117+dfsg/runtime/gen/basis-ffi.sml.chk000066400000000000000000000000511416264345000214020ustar00rootroot00000000000000bc01909c7cc0c5df9406990d2022296a6ca1d354 mlton-20210117+dfsg/runtime/gen/gen-basis-ffi-consts.c000066400000000000000000000576401416264345000223630ustar00rootroot00000000000000/* This file is automatically generated. Do not edit. */ MkNumConst (IEEEReal_RoundingMode_FE_DOWNWARD, C_Int_t); MkNumConst (IEEEReal_RoundingMode_FE_NOSUPPORT, C_Int_t); MkNumConst (IEEEReal_RoundingMode_FE_TONEAREST, C_Int_t); MkNumConst (IEEEReal_RoundingMode_FE_TOWARDZERO, C_Int_t); MkNumConst (IEEEReal_RoundingMode_FE_UPWARD, C_Int_t); MkNumConst (MLton_Itimer_PROF, C_Int_t); MkNumConst (MLton_Itimer_REAL, C_Int_t); MkNumConst (MLton_Itimer_VIRTUAL, C_Int_t); MkNumConst (MLton_Rlimit_AS, C_Int_t); MkNumConst (MLton_Rlimit_CORE, C_Int_t); MkNumConst (MLton_Rlimit_CPU, C_Int_t); MkNumConst (MLton_Rlimit_DATA, C_Int_t); MkNumConst (MLton_Rlimit_FSIZE, C_Int_t); MkNumConst (MLton_Rlimit_INFINITY, C_RLim_t); MkNumConst (MLton_Rlimit_MEMLOCK, C_Int_t); MkNumConst (MLton_Rlimit_NOFILE, C_Int_t); MkNumConst (MLton_Rlimit_NPROC, C_Int_t); MkNumConst (MLton_Rlimit_RSS, C_Int_t); MkNumConst (MLton_Rlimit_STACK, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_AUTH, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_CRON, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_DAEMON, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_KERN, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL0, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL1, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL2, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL3, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL4, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL5, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL6, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LOCAL7, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_LPR, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_MAIL, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_NEWS, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_SYSLOG, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_USER, C_Int_t); MkNumConst (MLton_Syslog_Facility_LOG_UUCP, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_CONS, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_NDELAY, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_NOWAIT, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_ODELAY, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_PERROR, C_Int_t); MkNumConst (MLton_Syslog_Logopt_LOG_PID, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_ALERT, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_CRIT, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_DEBUG, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_EMERG, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_ERR, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_INFO, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_NOTICE, C_Int_t); MkNumConst (MLton_Syslog_Severity_LOG_WARNING, C_Int_t); MkNumConst (NetHostDB_INADDR_ANY, C_Int_t); MkNumConst (NetHostDB_inAddrSize, C_Size_t); MkNumConst (OS_IO_POLLIN, C_Short_t); MkNumConst (OS_IO_POLLOUT, C_Short_t); MkNumConst (OS_IO_POLLPRI, C_Short_t); MkNumConst (Posix_Error_E2BIG, C_Int_t); MkNumConst (Posix_Error_EACCES, C_Int_t); MkNumConst (Posix_Error_EADDRINUSE, C_Int_t); MkNumConst (Posix_Error_EADDRNOTAVAIL, C_Int_t); MkNumConst (Posix_Error_EAFNOSUPPORT, C_Int_t); MkNumConst (Posix_Error_EAGAIN, C_Int_t); MkNumConst (Posix_Error_EALREADY, C_Int_t); MkNumConst (Posix_Error_EBADF, C_Int_t); MkNumConst (Posix_Error_EBADMSG, C_Int_t); MkNumConst (Posix_Error_EBUSY, C_Int_t); MkNumConst (Posix_Error_ECANCELED, C_Int_t); MkNumConst (Posix_Error_ECHILD, C_Int_t); MkNumConst (Posix_Error_ECONNABORTED, C_Int_t); MkNumConst (Posix_Error_ECONNREFUSED, C_Int_t); MkNumConst (Posix_Error_ECONNRESET, C_Int_t); MkNumConst (Posix_Error_EDEADLK, C_Int_t); MkNumConst (Posix_Error_EDESTADDRREQ, C_Int_t); MkNumConst (Posix_Error_EDOM, C_Int_t); MkNumConst (Posix_Error_EDQUOT, C_Int_t); MkNumConst (Posix_Error_EEXIST, C_Int_t); MkNumConst (Posix_Error_EFAULT, C_Int_t); MkNumConst (Posix_Error_EFBIG, C_Int_t); MkNumConst (Posix_Error_EHOSTUNREACH, C_Int_t); MkNumConst (Posix_Error_EIDRM, C_Int_t); MkNumConst (Posix_Error_EILSEQ, C_Int_t); MkNumConst (Posix_Error_EINPROGRESS, C_Int_t); MkNumConst (Posix_Error_EINTR, C_Int_t); MkNumConst (Posix_Error_EINVAL, C_Int_t); MkNumConst (Posix_Error_EIO, C_Int_t); MkNumConst (Posix_Error_EISCONN, C_Int_t); MkNumConst (Posix_Error_EISDIR, C_Int_t); MkNumConst (Posix_Error_ELOOP, C_Int_t); MkNumConst (Posix_Error_EMFILE, C_Int_t); MkNumConst (Posix_Error_EMLINK, C_Int_t); MkNumConst (Posix_Error_EMSGSIZE, C_Int_t); MkNumConst (Posix_Error_EMULTIHOP, C_Int_t); MkNumConst (Posix_Error_ENAMETOOLONG, C_Int_t); MkNumConst (Posix_Error_ENETDOWN, C_Int_t); MkNumConst (Posix_Error_ENETRESET, C_Int_t); MkNumConst (Posix_Error_ENETUNREACH, C_Int_t); MkNumConst (Posix_Error_ENFILE, C_Int_t); MkNumConst (Posix_Error_ENOBUFS, C_Int_t); MkNumConst (Posix_Error_ENODATA, C_Int_t); MkNumConst (Posix_Error_ENODEV, C_Int_t); MkNumConst (Posix_Error_ENOENT, C_Int_t); MkNumConst (Posix_Error_ENOEXEC, C_Int_t); MkNumConst (Posix_Error_ENOLCK, C_Int_t); MkNumConst (Posix_Error_ENOLINK, C_Int_t); MkNumConst (Posix_Error_ENOMEM, C_Int_t); MkNumConst (Posix_Error_ENOMSG, C_Int_t); MkNumConst (Posix_Error_ENOPROTOOPT, C_Int_t); MkNumConst (Posix_Error_ENOSPC, C_Int_t); MkNumConst (Posix_Error_ENOSR, C_Int_t); MkNumConst (Posix_Error_ENOSTR, C_Int_t); MkNumConst (Posix_Error_ENOSYS, C_Int_t); MkNumConst (Posix_Error_ENOTCONN, C_Int_t); MkNumConst (Posix_Error_ENOTDIR, C_Int_t); MkNumConst (Posix_Error_ENOTEMPTY, C_Int_t); MkNumConst (Posix_Error_ENOTSOCK, C_Int_t); MkNumConst (Posix_Error_ENOTSUP, C_Int_t); MkNumConst (Posix_Error_ENOTTY, C_Int_t); MkNumConst (Posix_Error_ENXIO, C_Int_t); MkNumConst (Posix_Error_EOPNOTSUPP, C_Int_t); MkNumConst (Posix_Error_EOVERFLOW, C_Int_t); MkNumConst (Posix_Error_EPERM, C_Int_t); MkNumConst (Posix_Error_EPIPE, C_Int_t); MkNumConst (Posix_Error_EPROTO, C_Int_t); MkNumConst (Posix_Error_EPROTONOSUPPORT, C_Int_t); MkNumConst (Posix_Error_EPROTOTYPE, C_Int_t); MkNumConst (Posix_Error_ERANGE, C_Int_t); MkNumConst (Posix_Error_EROFS, C_Int_t); MkNumConst (Posix_Error_ESPIPE, C_Int_t); MkNumConst (Posix_Error_ESRCH, C_Int_t); MkNumConst (Posix_Error_ESTALE, C_Int_t); MkNumConst (Posix_Error_ETIME, C_Int_t); MkNumConst (Posix_Error_ETIMEDOUT, C_Int_t); MkNumConst (Posix_Error_ETXTBSY, C_Int_t); MkNumConst (Posix_Error_EWOULDBLOCK, C_Int_t); MkNumConst (Posix_Error_EXDEV, C_Int_t); MkNumConst (Posix_FileSys_A_F_OK, C_Int_t); MkNumConst (Posix_FileSys_A_R_OK, C_Int_t); MkNumConst (Posix_FileSys_A_W_OK, C_Int_t); MkNumConst (Posix_FileSys_A_X_OK, C_Int_t); MkNumConst (Posix_FileSys_O_APPEND, C_Int_t); MkNumConst (Posix_FileSys_O_BINARY, C_Int_t); MkNumConst (Posix_FileSys_O_CREAT, C_Int_t); MkNumConst (Posix_FileSys_O_DSYNC, C_Int_t); MkNumConst (Posix_FileSys_O_EXCL, C_Int_t); MkNumConst (Posix_FileSys_O_NOCTTY, C_Int_t); MkNumConst (Posix_FileSys_O_NONBLOCK, C_Int_t); MkNumConst (Posix_FileSys_O_RDONLY, C_Int_t); MkNumConst (Posix_FileSys_O_RDWR, C_Int_t); MkNumConst (Posix_FileSys_O_RSYNC, C_Int_t); MkNumConst (Posix_FileSys_O_SYNC, C_Int_t); MkNumConst (Posix_FileSys_O_TEXT, C_Int_t); MkNumConst (Posix_FileSys_O_TRUNC, C_Int_t); MkNumConst (Posix_FileSys_O_WRONLY, C_Int_t); MkNumConst (Posix_FileSys_PC_ALLOC_SIZE_MIN, C_Int_t); MkNumConst (Posix_FileSys_PC_ASYNC_IO, C_Int_t); MkNumConst (Posix_FileSys_PC_CHOWN_RESTRICTED, C_Int_t); MkNumConst (Posix_FileSys_PC_FILESIZEBITS, C_Int_t); MkNumConst (Posix_FileSys_PC_LINK_MAX, C_Int_t); MkNumConst (Posix_FileSys_PC_MAX_CANON, C_Int_t); MkNumConst (Posix_FileSys_PC_MAX_INPUT, C_Int_t); MkNumConst (Posix_FileSys_PC_NAME_MAX, C_Int_t); MkNumConst (Posix_FileSys_PC_NO_TRUNC, C_Int_t); MkNumConst (Posix_FileSys_PC_PATH_MAX, C_Int_t); MkNumConst (Posix_FileSys_PC_PIPE_BUF, C_Int_t); MkNumConst (Posix_FileSys_PC_PRIO_IO, C_Int_t); MkNumConst (Posix_FileSys_PC_REC_INCR_XFER_SIZE, C_Int_t); MkNumConst (Posix_FileSys_PC_REC_MAX_XFER_SIZE, C_Int_t); MkNumConst (Posix_FileSys_PC_REC_MIN_XFER_SIZE, C_Int_t); MkNumConst (Posix_FileSys_PC_REC_XFER_ALIGN, C_Int_t); MkNumConst (Posix_FileSys_PC_SYMLINK_MAX, C_Int_t); MkNumConst (Posix_FileSys_PC_SYNC_IO, C_Int_t); MkNumConst (Posix_FileSys_PC_TWO_SYMLINKS, C_Int_t); MkNumConst (Posix_FileSys_PC_VDISABLE, C_Int_t); MkNumConst (Posix_FileSys_S_IFBLK, C_Mode_t); MkNumConst (Posix_FileSys_S_IFCHR, C_Mode_t); MkNumConst (Posix_FileSys_S_IFDIR, C_Mode_t); MkNumConst (Posix_FileSys_S_IFIFO, C_Mode_t); MkNumConst (Posix_FileSys_S_IFLNK, C_Mode_t); MkNumConst (Posix_FileSys_S_IFMT, C_Mode_t); MkNumConst (Posix_FileSys_S_IFREG, C_Mode_t); MkNumConst (Posix_FileSys_S_IFSOCK, C_Mode_t); MkNumConst (Posix_FileSys_S_IRGRP, C_Mode_t); MkNumConst (Posix_FileSys_S_IROTH, C_Mode_t); MkNumConst (Posix_FileSys_S_IRUSR, C_Mode_t); MkNumConst (Posix_FileSys_S_IRWXG, C_Mode_t); MkNumConst (Posix_FileSys_S_IRWXO, C_Mode_t); MkNumConst (Posix_FileSys_S_IRWXU, C_Mode_t); MkNumConst (Posix_FileSys_S_ISGID, C_Mode_t); MkNumConst (Posix_FileSys_S_ISUID, C_Mode_t); MkNumConst (Posix_FileSys_S_ISVTX, C_Mode_t); MkNumConst (Posix_FileSys_S_IWGRP, C_Mode_t); MkNumConst (Posix_FileSys_S_IWOTH, C_Mode_t); MkNumConst (Posix_FileSys_S_IWUSR, C_Mode_t); MkNumConst (Posix_FileSys_S_IXGRP, C_Mode_t); MkNumConst (Posix_FileSys_S_IXOTH, C_Mode_t); MkNumConst (Posix_FileSys_S_IXUSR, C_Mode_t); MkNumConst (Posix_IO_F_DUPFD, C_Int_t); MkNumConst (Posix_IO_F_GETFD, C_Int_t); MkNumConst (Posix_IO_F_GETFL, C_Int_t); MkNumConst (Posix_IO_F_GETOWN, C_Int_t); MkNumConst (Posix_IO_F_SETFD, C_Int_t); MkNumConst (Posix_IO_F_SETFL, C_Int_t); MkNumConst (Posix_IO_F_SETOWN, C_Int_t); MkNumConst (Posix_IO_FD_CLOEXEC, C_Int_t); MkNumConst (Posix_IO_FLock_F_GETLK, C_Int_t); MkNumConst (Posix_IO_FLock_F_RDLCK, C_Short_t); MkNumConst (Posix_IO_FLock_F_SETLK, C_Int_t); MkNumConst (Posix_IO_FLock_F_SETLKW, C_Int_t); MkNumConst (Posix_IO_FLock_F_UNLCK, C_Short_t); MkNumConst (Posix_IO_FLock_F_WRLCK, C_Short_t); MkNumConst (Posix_IO_FLock_SEEK_CUR, C_Short_t); MkNumConst (Posix_IO_FLock_SEEK_END, C_Short_t); MkNumConst (Posix_IO_FLock_SEEK_SET, C_Short_t); MkNumConst (Posix_IO_O_ACCMODE, C_Int_t); MkNumConst (Posix_IO_SEEK_CUR, C_Int_t); MkNumConst (Posix_IO_SEEK_END, C_Int_t); MkNumConst (Posix_IO_SEEK_SET, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_C_BIND, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_C_DEV, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_CHAR_TERM, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_FORT_DEV, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_FORT_RUN, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_LOCALEDEF, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS_ACCOUNTING, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS_CHECKPOINT, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS_LOCATE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS_MESSAGE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_PBS_TRACK, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_SW_DEV, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_UPE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_2_VERSION, C_Int_t); MkNumConst (Posix_ProcEnv_SC_ADVISORY_INFO, C_Int_t); MkNumConst (Posix_ProcEnv_SC_AIO_LISTIO_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_AIO_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_ARG_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_ASYNCHRONOUS_IO, C_Int_t); MkNumConst (Posix_ProcEnv_SC_ATEXIT_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_AVPHYS_PAGES, C_Int_t); MkNumConst (Posix_ProcEnv_SC_BARRIERS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_BC_BASE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_BC_DIM_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_BC_SCALE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_BC_STRING_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_CHILD_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_CLK_TCK, C_Int_t); MkNumConst (Posix_ProcEnv_SC_CLOCK_SELECTION, C_Int_t); MkNumConst (Posix_ProcEnv_SC_COLL_WEIGHTS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_CPUTIME, C_Int_t); MkNumConst (Posix_ProcEnv_SC_DELAYTIMER_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_EXPR_NEST_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_FSYNC, C_Int_t); MkNumConst (Posix_ProcEnv_SC_GETGR_R_SIZE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_GETPW_R_SIZE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_HOST_NAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_IOV_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_IPV6, C_Int_t); MkNumConst (Posix_ProcEnv_SC_JOB_CONTROL, C_Int_t); MkNumConst (Posix_ProcEnv_SC_LINE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_LOGIN_NAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MAPPED_FILES, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MEMLOCK, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MEMLOCK_RANGE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MEMORY_PROTECTION, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MESSAGE_PASSING, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MONOTONIC_CLOCK, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MQ_OPEN_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_MQ_PRIO_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_NGROUPS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_NPROCESSORS_CONF, C_Int_t); MkNumConst (Posix_ProcEnv_SC_NPROCESSORS_ONLN, C_Int_t); MkNumConst (Posix_ProcEnv_SC_OPEN_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_PAGE_SIZE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_PAGESIZE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_PHYS_PAGES, C_Int_t); MkNumConst (Posix_ProcEnv_SC_PRIORITIZED_IO, C_Int_t); MkNumConst (Posix_ProcEnv_SC_PRIORITY_SCHEDULING, C_Int_t); MkNumConst (Posix_ProcEnv_SC_RAW_SOCKETS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_RE_DUP_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_READER_WRITER_LOCKS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_REALTIME_SIGNALS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_REGEXP, C_Int_t); MkNumConst (Posix_ProcEnv_SC_RTSIG_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SAVED_IDS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SEM_NSEMS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SEM_VALUE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SEMAPHORES, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SHELL, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SIGQUEUE_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SPAWN, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SPIN_LOCKS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SPORADIC_SERVER, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SS_REPL_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_STREAM_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SYMLOOP_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_SYNCHRONIZED_IO, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_CPUTIME, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_KEYS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_PRIO_INHERIT, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_PRIO_PROTECT, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_PROCESS_SHARED, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_STACK_MIN, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREAD_THREADS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_THREADS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TIMEOUTS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TIMER_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TIMERS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_EVENT_FILTER, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_INHERIT, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_LOG, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_NAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_SYS_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TTY_NAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_TZNAME_MAX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_V6_ILP32_OFF32, C_Int_t); MkNumConst (Posix_ProcEnv_SC_V6_ILP32_OFFBIG, C_Int_t); MkNumConst (Posix_ProcEnv_SC_V6_LP64_OFF64, C_Int_t); MkNumConst (Posix_ProcEnv_SC_V6_LPBIG_OFFBIG, C_Int_t); MkNumConst (Posix_ProcEnv_SC_VERSION, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XBS5_ILP32_OFF32, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XBS5_LP64_OFF64, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_CRYPT, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_ENH_I18N, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_LEGACY, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_REALTIME, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_SHM, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_STREAMS, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_UNIX, C_Int_t); MkNumConst (Posix_ProcEnv_SC_XOPEN_VERSION, C_Int_t); MkNumConst (Posix_Process_W_NOHANG, C_Int_t); MkNumConst (Posix_Process_W_UNTRACED, C_Int_t); MkNumConst (Posix_Signal_NSIG, C_Int_t); MkNumConst (Posix_Signal_SIG_BLOCK, C_Int_t); MkNumConst (Posix_Signal_SIG_SETMASK, C_Int_t); MkNumConst (Posix_Signal_SIG_UNBLOCK, C_Int_t); MkNumConst (Posix_Signal_SIGABRT, C_Signal_t); MkNumConst (Posix_Signal_SIGALRM, C_Signal_t); MkNumConst (Posix_Signal_SIGBUS, C_Signal_t); MkNumConst (Posix_Signal_SIGCHLD, C_Signal_t); MkNumConst (Posix_Signal_SIGCONT, C_Signal_t); MkNumConst (Posix_Signal_SIGFPE, C_Signal_t); MkNumConst (Posix_Signal_SIGHUP, C_Signal_t); MkNumConst (Posix_Signal_SIGILL, C_Signal_t); MkNumConst (Posix_Signal_SIGINT, C_Signal_t); MkNumConst (Posix_Signal_SIGKILL, C_Signal_t); MkNumConst (Posix_Signal_SIGPIPE, C_Signal_t); MkNumConst (Posix_Signal_SIGPOLL, C_Signal_t); MkNumConst (Posix_Signal_SIGPROF, C_Signal_t); MkNumConst (Posix_Signal_SIGQUIT, C_Signal_t); MkNumConst (Posix_Signal_SIGSEGV, C_Signal_t); MkNumConst (Posix_Signal_sigSetLen, C_Size_t); MkNumConst (Posix_Signal_SIGSTOP, C_Signal_t); MkNumConst (Posix_Signal_SIGSYS, C_Signal_t); MkNumConst (Posix_Signal_SIGTERM, C_Signal_t); MkNumConst (Posix_Signal_SIGTRAP, C_Signal_t); MkNumConst (Posix_Signal_SIGTSTP, C_Signal_t); MkNumConst (Posix_Signal_SIGTTIN, C_Signal_t); MkNumConst (Posix_Signal_SIGTTOU, C_Signal_t); MkNumConst (Posix_Signal_SIGURG, C_Signal_t); MkNumConst (Posix_Signal_SIGUSR1, C_Signal_t); MkNumConst (Posix_Signal_SIGUSR2, C_Signal_t); MkNumConst (Posix_Signal_SIGVTALRM, C_Signal_t); MkNumConst (Posix_Signal_SIGXCPU, C_Signal_t); MkNumConst (Posix_Signal_SIGXFSZ, C_Signal_t); MkNumConst (Posix_TTY_B0, C_Speed_t); MkNumConst (Posix_TTY_B110, C_Speed_t); MkNumConst (Posix_TTY_B1200, C_Speed_t); MkNumConst (Posix_TTY_B134, C_Speed_t); MkNumConst (Posix_TTY_B150, C_Speed_t); MkNumConst (Posix_TTY_B1800, C_Speed_t); MkNumConst (Posix_TTY_B19200, C_Speed_t); MkNumConst (Posix_TTY_B200, C_Speed_t); MkNumConst (Posix_TTY_B2400, C_Speed_t); MkNumConst (Posix_TTY_B300, C_Speed_t); MkNumConst (Posix_TTY_B38400, C_Speed_t); MkNumConst (Posix_TTY_B4800, C_Speed_t); MkNumConst (Posix_TTY_B50, C_Speed_t); MkNumConst (Posix_TTY_B600, C_Speed_t); MkNumConst (Posix_TTY_B75, C_Speed_t); MkNumConst (Posix_TTY_B9600, C_Speed_t); MkNumConst (Posix_TTY_C_CLOCAL, C_TCFlag_t); MkNumConst (Posix_TTY_C_CREAD, C_TCFlag_t); MkNumConst (Posix_TTY_C_CS5, C_TCFlag_t); MkNumConst (Posix_TTY_C_CS6, C_TCFlag_t); MkNumConst (Posix_TTY_C_CS7, C_TCFlag_t); MkNumConst (Posix_TTY_C_CS8, C_TCFlag_t); MkNumConst (Posix_TTY_C_CSIZE, C_TCFlag_t); MkNumConst (Posix_TTY_C_CSTOPB, C_TCFlag_t); MkNumConst (Posix_TTY_C_HUPCL, C_TCFlag_t); MkNumConst (Posix_TTY_C_PARENB, C_TCFlag_t); MkNumConst (Posix_TTY_C_PARODD, C_TCFlag_t); MkNumConst (Posix_TTY_I_BRKINT, C_TCFlag_t); MkNumConst (Posix_TTY_I_ICRNL, C_TCFlag_t); MkNumConst (Posix_TTY_I_IGNBRK, C_TCFlag_t); MkNumConst (Posix_TTY_I_IGNCR, C_TCFlag_t); MkNumConst (Posix_TTY_I_IGNPAR, C_TCFlag_t); MkNumConst (Posix_TTY_I_INLCR, C_TCFlag_t); MkNumConst (Posix_TTY_I_INPCK, C_TCFlag_t); MkNumConst (Posix_TTY_I_ISTRIP, C_TCFlag_t); MkNumConst (Posix_TTY_I_IXANY, C_TCFlag_t); MkNumConst (Posix_TTY_I_IXOFF, C_TCFlag_t); MkNumConst (Posix_TTY_I_IXON, C_TCFlag_t); MkNumConst (Posix_TTY_I_PARMRK, C_TCFlag_t); MkNumConst (Posix_TTY_L_ECHO, C_TCFlag_t); MkNumConst (Posix_TTY_L_ECHOE, C_TCFlag_t); MkNumConst (Posix_TTY_L_ECHOK, C_TCFlag_t); MkNumConst (Posix_TTY_L_ECHONL, C_TCFlag_t); MkNumConst (Posix_TTY_L_ICANON, C_TCFlag_t); MkNumConst (Posix_TTY_L_IEXTEN, C_TCFlag_t); MkNumConst (Posix_TTY_L_ISIG, C_TCFlag_t); MkNumConst (Posix_TTY_L_NOFLSH, C_TCFlag_t); MkNumConst (Posix_TTY_L_TOSTOP, C_TCFlag_t); MkNumConst (Posix_TTY_O_BS0, C_TCFlag_t); MkNumConst (Posix_TTY_O_BS1, C_TCFlag_t); MkNumConst (Posix_TTY_O_BSDLY, C_TCFlag_t); MkNumConst (Posix_TTY_O_CR0, C_TCFlag_t); MkNumConst (Posix_TTY_O_CR1, C_TCFlag_t); MkNumConst (Posix_TTY_O_CR2, C_TCFlag_t); MkNumConst (Posix_TTY_O_CR3, C_TCFlag_t); MkNumConst (Posix_TTY_O_CRDLY, C_TCFlag_t); MkNumConst (Posix_TTY_O_FF0, C_TCFlag_t); MkNumConst (Posix_TTY_O_FF1, C_TCFlag_t); MkNumConst (Posix_TTY_O_FFDLY, C_TCFlag_t); MkNumConst (Posix_TTY_O_NL0, C_TCFlag_t); MkNumConst (Posix_TTY_O_NL1, C_TCFlag_t); MkNumConst (Posix_TTY_O_NLDLY, C_TCFlag_t); MkNumConst (Posix_TTY_O_OCRNL, C_TCFlag_t); MkNumConst (Posix_TTY_O_OFILL, C_TCFlag_t); MkNumConst (Posix_TTY_O_ONLCR, C_TCFlag_t); MkNumConst (Posix_TTY_O_ONLRET, C_TCFlag_t); MkNumConst (Posix_TTY_O_ONOCR, C_TCFlag_t); MkNumConst (Posix_TTY_O_OPOST, C_TCFlag_t); MkNumConst (Posix_TTY_O_TAB0, C_TCFlag_t); MkNumConst (Posix_TTY_O_TAB1, C_TCFlag_t); MkNumConst (Posix_TTY_O_TAB2, C_TCFlag_t); MkNumConst (Posix_TTY_O_TAB3, C_TCFlag_t); MkNumConst (Posix_TTY_O_TABDLY, C_TCFlag_t); MkNumConst (Posix_TTY_O_VT0, C_TCFlag_t); MkNumConst (Posix_TTY_O_VT1, C_TCFlag_t); MkNumConst (Posix_TTY_O_VTDLY, C_TCFlag_t); MkNumConst (Posix_TTY_TC_TCIFLUSH, C_Int_t); MkNumConst (Posix_TTY_TC_TCIOFF, C_Int_t); MkNumConst (Posix_TTY_TC_TCIOFLUSH, C_Int_t); MkNumConst (Posix_TTY_TC_TCION, C_Int_t); MkNumConst (Posix_TTY_TC_TCOFLUSH, C_Int_t); MkNumConst (Posix_TTY_TC_TCOOFF, C_Int_t); MkNumConst (Posix_TTY_TC_TCOON, C_Int_t); MkNumConst (Posix_TTY_TC_TCSADRAIN, C_Int_t); MkNumConst (Posix_TTY_TC_TCSAFLUSH, C_Int_t); MkNumConst (Posix_TTY_TC_TCSANOW, C_Int_t); MkNumConst (Posix_TTY_V_NCCS, C_Int_t); MkNumConst (Posix_TTY_V_VEOF, C_Int_t); MkNumConst (Posix_TTY_V_VEOL, C_Int_t); MkNumConst (Posix_TTY_V_VERASE, C_Int_t); MkNumConst (Posix_TTY_V_VINTR, C_Int_t); MkNumConst (Posix_TTY_V_VKILL, C_Int_t); MkNumConst (Posix_TTY_V_VMIN, C_Int_t); MkNumConst (Posix_TTY_V_VQUIT, C_Int_t); MkNumConst (Posix_TTY_V_VSTART, C_Int_t); MkNumConst (Posix_TTY_V_VSTOP, C_Int_t); MkNumConst (Posix_TTY_V_VSUSP, C_Int_t); MkNumConst (Posix_TTY_V_VTIME, C_Int_t); MkNumConst (Socket_AF_INET, C_Int_t); MkNumConst (Socket_AF_INET6, C_Int_t); MkNumConst (Socket_AF_UNIX, C_Int_t); MkNumConst (Socket_AF_UNSPEC, C_Int_t); MkNumConst (Socket_Ctl_SO_ACCEPTCONN, C_Int_t); MkNumConst (Socket_Ctl_SO_BROADCAST, C_Int_t); MkNumConst (Socket_Ctl_SO_DEBUG, C_Int_t); MkNumConst (Socket_Ctl_SO_DONTROUTE, C_Int_t); MkNumConst (Socket_Ctl_SO_ERROR, C_Int_t); MkNumConst (Socket_Ctl_SO_KEEPALIVE, C_Int_t); MkNumConst (Socket_Ctl_SO_LINGER, C_Int_t); MkNumConst (Socket_Ctl_SO_OOBINLINE, C_Int_t); MkNumConst (Socket_Ctl_SO_RCVBUF, C_Int_t); MkNumConst (Socket_Ctl_SO_RCVLOWAT, C_Int_t); MkNumConst (Socket_Ctl_SO_RCVTIMEO, C_Int_t); MkNumConst (Socket_Ctl_SO_REUSEADDR, C_Int_t); MkNumConst (Socket_Ctl_SO_SNDBUF, C_Int_t); MkNumConst (Socket_Ctl_SO_SNDLOWAT, C_Int_t); MkNumConst (Socket_Ctl_SO_SNDTIMEO, C_Int_t); MkNumConst (Socket_Ctl_SO_TYPE, C_Int_t); MkNumConst (Socket_Ctl_SOL_SOCKET, C_Int_t); MkNumConst (Socket_INetSock_Ctl_IPPROTO_TCP, C_Int_t); MkNumConst (Socket_INetSock_Ctl_TCP_NODELAY, C_Int_t); MkNumConst (Socket_MSG_CTRUNC, C_Int_t); MkNumConst (Socket_MSG_DONTROUTE, C_Int_t); MkNumConst (Socket_MSG_DONTWAIT, C_Int_t); MkNumConst (Socket_MSG_EOR, C_Int_t); MkNumConst (Socket_MSG_OOB, C_Int_t); MkNumConst (Socket_MSG_PEEK, C_Int_t); MkNumConst (Socket_MSG_TRUNC, C_Int_t); MkNumConst (Socket_MSG_WAITALL, C_Int_t); MkNumConst (Socket_SHUT_RD, C_Int_t); MkNumConst (Socket_SHUT_RDWR, C_Int_t); MkNumConst (Socket_SHUT_WR, C_Int_t); MkNumConst (Socket_SOCK_DGRAM, C_Int_t); MkNumConst (Socket_SOCK_RAW, C_Int_t); MkNumConst (Socket_SOCK_SEQPACKET, C_Int_t); MkNumConst (Socket_SOCK_STREAM, C_Int_t); MkNumConst (Socket_sockAddrStorageLen, C_Size_t); mlton-20210117+dfsg/runtime/gen/gen-basis-ffi-consts.c.chk000066400000000000000000000000511416264345000231070ustar00rootroot000000000000004a0e02080b7bdc2d2117952d219978e74f303aff mlton-20210117+dfsg/runtime/gen/gen-basis-ffi.sml000066400000000000000000000400621416264345000214130ustar00rootroot00000000000000(* Copyright (C) 2019-2020 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. *) structure List = struct open List fun sort f l = let fun qsort l = case l of [] => [] | hd::tl => let val (lt,eq,gt) = List.foldr (fn (x,(lt,eq,gt)) => case f (x,hd) of LESS => (x::lt,eq,gt) | EQUAL => (lt,x::eq,gt) | GREATER => (lt,eq,x::gt)) ([],[],[]) tl val lt = qsort lt val gt = qsort gt in lt @ (hd :: eq) @ gt end in qsort l end end structure Substring = struct open Substring fun droplSpace ss = dropl Char.isSpace ss fun droprSpace ss = dropr Char.isSpace ss end structure Name = struct datatype t = T of string list fun compare (T ss1, T ss2) = List.collate (fn (s1,s2) => String.compare (CharVector.map Char.toLower s1, CharVector.map Char.toLower s2)) (ss1, ss2) fun last (T ss) = List.last ss fun toC (T ss) = String.concatWith "_" ss fun toML (T ss) = String.concatWith "." ss fun parse ss = let val ss = Substring.droplSpace ss val (names, rest) = Substring.splitl (fn c => Char.isAlphaNum c orelse c = #"." orelse c = #"_") ss val rest = Substring.droplSpace rest in if Substring.isEmpty names then NONE else let val names = Substring.fields (fn c => #"." = c) names val names = List.map Substring.string names in SOME (T names, rest) end end end structure Type = struct datatype t = Array of t | Base of Name.t | Con of Name.t * t | Ref of t | Unit | Vector of t local fun make s t = case t of Base name => Name.compare (name, Name.T [s, "t"]) = EQUAL | _ => false in val isString = make "String8" val isBool = make "Bool" end fun toC t = case t of Array t => concat ["Array(", toC t, ")"] | Base name => Name.toC name | Con (name, t) => concat [Name.toC name, "(", toC t, ")"] | Ref t => concat ["Ref(", toC t, ")"] | Unit => "void" | Vector t => concat ["Vector(", toC t, ")"] fun toML t = case t of Array t => concat ["(", toML t, ") array"] | Base name => Name.toML name | Con (name, t) => concat ["(", toML t, ") ", Name.toML name] | Ref t => concat ["(", toML t, ") ref"] | Unit => "unit" | Vector t => concat ["(", toML t, ") vector"] fun parse s = let fun loop (s, t) = case Name.parse s of NONE => (t, s) | SOME (Name.T ["array"], rest) => loop (rest, Array t) | SOME (Name.T ["ref"], rest) => loop (rest, Ref t) | SOME (Name.T ["vector"], rest) => loop (rest, Vector t) | SOME (name, rest) => loop (rest, Con (name, t)) in case Name.parse s of NONE => raise Fail (concat ["Type.parse: \"", Substring.string s, "\""]) | SOME (Name.T ["unit"], rest) => loop (rest, Unit) | SOME (name, rest) => loop (rest, Base name) end fun parseFn s = let fun loop (s, args) = let val (arg, rest) = parse s in if Substring.isPrefix "*" rest then let val rest = #2 (Substring.splitAt (rest, 1)) in loop (rest, arg::args) end else if Substring.isPrefix "->" rest then let val rest = #2 (Substring.splitAt (rest, 2)) val (ret, rest) = parse rest in ({args = List.rev (arg::args), ret = ret}, rest) end else raise Fail (concat ["Type.parseFn: \"", Substring.string s, "\""]) end in loop (s, []) end end structure Entry = struct datatype t = Const of {name: Name.t, ty: Type.t} | Import of {attrs: string, name: Name.t, ty: {args: Type.t list, ret: Type.t}} | SymConst of {name: Name.t, ty: Type.t} | Symbol of {name: Name.t, ty: Type.t} fun name entry = case entry of Const {name,...} => name | Import {name,...} => name | SymConst {name, ...} => name | Symbol {name,...} => name fun compare (entry1, entry2) = Name.compare (name entry1, name entry2) fun toC entry = case entry of Const {name, ty} => String.concat ["PRIVATE extern const ", Type.toC ty, " ", Name.toC name, ";"] | Import {attrs, name, ty = {args, ret}} => String.concat ["PRIVATE ", attrs, if String.size attrs > 0 then " " else "", Type.toC ret, " ", Name.toC name, "(", String.concatWith "," (List.map Type.toC args), ");"] | SymConst {name, ty} => String.concat ["PRIVATE extern const ", Type.toC ty, " ", Name.toC name, ";"] | Symbol {name, ty} => String.concat ["PRIVATE extern ", Type.toC ty, " ", Name.toC name, ";"] fun toML entry = case entry of Const {name, ty} => String.concat ["val ", Name.last name, " = _const \"", Name.toC name, "\" : ", Type.toML ty, ";"] | Import {attrs, name, ty = {args, ret}} => String.concat ["val ", Name.last name, " = _import \"", Name.toC name, "\" private ", if List.exists (fn s => s = "INLINE") (String.tokens Char.isSpace attrs) then "inline " else "", ": ", String.concatWith " * " (List.map Type.toML args), " -> ", Type.toML ret, ";"] | SymConst {name, ty} => String.concat ["val ", Name.last name, " = #1 (_symbol \"", Name.toC name, "\" private : (unit -> (", Type.toML ty, ")) * ((", Type.toML ty, ") -> unit);) ()"] | Symbol {name, ty} => String.concat ["val (", Name.last name, "Get, ", Name.last name, "Set) = _symbol \"", Name.toC name, "\" private : (unit -> (", Type.toML ty, ")) * ((", Type.toML ty, ") -> unit);"] fun parseType (s, kw) = let val s = #2 (Substring.splitAt (s, 1 + String.size kw)) val s = Substring.droplSpace s val s = if Substring.isPrefix ":" s then #2 (Substring.splitAt (s, 1)) else raise Fail (concat ["Entry.parse", kw, ": \"", Substring.string s, "\""]) val (ret, rest) = Type.parse s val () = if Substring.isEmpty rest then () else raise Fail (concat ["Entry.parse", kw, ": \"", Substring.string s, "\""]) in ret end fun parseConst (s, name) = let val ty = parseType (s, "Const") in Const {name = name, ty = ty} end fun parseImport (s, name) = let val s = #2 (Substring.splitAt (s, 7)) val s = Substring.droplSpace s val (attrs, s) = case CharVectorSlice.findi (fn (_, c) => c = #":") s of NONE => raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) | SOME (i, _) => Substring.splitAt (s, i) val attrs = Substring.droprSpace attrs val s = if Substring.isPrefix ":" s then #2 (Substring.splitAt (s, 1)) else raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) val ({args, ret}, rest) = Type.parseFn s val () = if Substring.isEmpty rest then () else raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) in Import {attrs = Substring.string attrs, name = name, ty = {args = args, ret = ret}} end fun parseSymConst (s, name) = let val ty = parseType (s, "SymConst") in SymConst {name = name, ty = ty} end fun parseSymbol (s, name) = let val ty = parseType (s, "Symbol") in Symbol {name = name, ty = ty} end fun parse s = case Name.parse s of NONE => raise Fail "Entry.parse" | SOME (name, rest) => if Substring.isPrefix "=" rest then let val rest = #2 (Substring.splitAt (rest, 1)) val rest = Substring.droplSpace rest in if Substring.isPrefix "_const" rest then parseConst (rest, name) else if Substring.isPrefix "_import" rest then parseImport (rest, name) else if Substring.isPrefix "_symconst" rest then parseSymConst (rest, name) else if Substring.isPrefix "_symbol" rest then parseSymbol (rest, name) else raise Fail (concat ["Entry.parse: \"", Substring.string s, "\""]) end else raise Fail (concat ["Entry.parse: \"", Substring.string s, "\""]) end val entries = let val f = TextIO.stdIn fun loop entries = case TextIO.inputLine f of NONE => List.rev entries | SOME s => if String.isPrefix "#" s then loop entries else let val entry = Entry.parse (Substring.full s) in loop (entry :: entries) end val entries = loop [] val () = TextIO.closeIn f val entries = List.sort Entry.compare entries in entries end fun outputC entries = let fun println s = if s <> "" then (print s; print "\n") else () val () = println "/* This file is automatically generated. Do not edit. */\n" val () = println "#ifndef _MLTON_BASIS_FFI_H_" val () = println "#define _MLTON_BASIS_FFI_H_" val () = List.app (fn entry => println (Entry.toC entry)) entries val () = println "#endif /* _MLTON_BASIS_FFI_H_ */" in () end fun outputML entries = let fun println s = if s <> "" then (print s; print "\n") else () val primStrs = (List.map (fn n => "Char" ^ n) ["8", "16", "32"]) @ (List.map (fn n => "Int" ^ n) ["8", "16", "32", "64"]) @ (List.map (fn n => "Real" ^ n) ["32", "64"]) @ (List.map (fn n => "Word" ^ n) ["8", "16", "32", "64"]) val () = println "(* This file is automatically generated. Do not edit. *)\n" val () = println "local open Primitive in " val () = println "structure PrimitiveFFI =" val () = println "struct" val cur = List.foldl (fn (entry, cur) => let val Name.T names = Entry.name entry val str = List.rev (List.tl (List.rev names)) fun loop (cur, str) = case (cur, str) of ([], []) => () | ([], str) => List.app (fn s => (println ("structure " ^ s ^ " = ") ; println "struct" ; if List.exists (fn s' => s = s') primStrs then println ("type t = " ^ s ^ ".t") else ())) str | (cur, []) => List.app (fn _ => println "end") cur | (c::cur,s::str) => if c = s then loop (cur, str) else (println "end" ; loop (cur, s::str)) in loop (cur, str) ; println (Entry.toML entry) ; str end) [] entries val () = List.app (fn _ => println "end") cur val () = println "end" val () = println "end" in () end fun outputGenConsts entries = let fun println s = if s <> "" then (print s; print "\n") else () val () = println "/* This file is automatically generated. Do not edit. */\n" val () = List.app (fn entry => case entry of Entry.Const {name, ty} => if Type.isBool ty then println (concat ["MkBoolConst (", Name.toC name, ");"]) else if Type.isString ty then println (concat ["MkStrConst (", Name.toC name, ");"]) else println (concat ["MkNumConst (", Name.toC name, ", ", Type.toC ty, ");"]) | _ => ()) entries in () end val () = case CommandLine.arguments () of ["basis-ffi.h"] => outputC entries | ["basis-ffi.sml"] => outputML entries | ["gen-basis-ffi-consts.c"] => outputGenConsts entries | _ => (TextIO.output (TextIO.stdErr, concat ["usage: ", CommandLine.name (), " basis-ffi.h|basis-ffi.sml|gen-basis-ffi-consts.c\n"]) ; OS.Process.exit OS.Process.failure) mlton-20210117+dfsg/runtime/gen/gen-constants.c000066400000000000000000000055521416264345000212200ustar00rootroot00000000000000/* Copyright (C) 2016-2017,2020 Matthew Fluet. * Copyright (C) 2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #define MLTON_GC_INTERNAL_TYPES #include "platform.h" #define MkSize(name, value) \ fprintf (stdout, "size::" #name " = %"PRIuMAX"\n", (uintmax_t)(value)) #define MkGCFieldOffset(field) \ fprintf (stdout, "offset::gcState." #field " = %"PRIuMAX"\n", (uintmax_t)(offsetof (struct GC_state, field))) #define MkBoolConst(name) \ fprintf (stdout, "const::" #name " = %s\n", name ? "true" : "false") #define MkNumConst(name, ty) \ do { \ if ((double)((ty)(0.25)) > 0) { \ fprintf (stdout, "const::" #name " = %.20f\n", (double)name); \ } else if ((double)((ty)(-1)) > 0) { \ fprintf (stdout, "const::" #name " = %"PRIuMAX"\n", (uintmax_t)name); \ } else { \ fprintf (stdout, "const::" #name " = %"PRIdMAX"\n", (intmax_t)name); \ } \ } while (0) #define MkStrConst(name) \ fprintf (stdout, "const::" #name " = %s\n", name) int main (__attribute__ ((unused)) int argc, __attribute__ ((unused)) char* argv[]) { #ifdef __pie__ fprintf (stdout, "default::pie = %d\n", __pie__); #else fprintf (stdout, "default::pie = %d\n", 0); #endif #ifdef __pic__ fprintf (stdout, "default::pic = %d\n", __pic__); #else fprintf (stdout, "default::pic = %d\n", 0); #endif MkSize (cint, sizeof(C_Int_t)); MkSize (cpointer, sizeof(C_Pointer_t)); MkSize (cptrdiff, sizeof(C_Ptrdiff_t)); MkSize (csize, sizeof(C_Size_t)); MkSize (header, sizeof(GC_header)); MkSize (mplimb, sizeof(C_MPLimb_t)); MkSize (normalMetaData, GC_NORMAL_METADATA_SIZE); MkSize (objptr, sizeof(objptr)); MkSize (seqIndex, sizeof(GC_sequenceLength)); MkSize (sequenceMetaData, GC_SEQUENCE_METADATA_SIZE); MkGCFieldOffset (atomicState); MkGCFieldOffset (exnStack); MkGCFieldOffset (frontier); MkGCFieldOffset (generationalMaps.cardMapAbsolute); MkGCFieldOffset (limit); MkGCFieldOffset (limitPlusSlop); MkGCFieldOffset (signalsInfo.signalIsPending); MkGCFieldOffset (sourceMaps.curSourceSeqIndex); MkGCFieldOffset (stackBottom); MkGCFieldOffset (stackLimit); MkGCFieldOffset (stackTop); MkStrConst (MLton_Platform_Arch_host); MkStrConst (MLton_Platform_OS_host); MkBoolConst (MLton_Platform_Arch_bigendian); #include "gen/gen-basis-ffi-consts.c" return 0; } mlton-20210117+dfsg/runtime/gen/gen-types.c000066400000000000000000000401701416264345000203430ustar00rootroot00000000000000/* Copyright (C) 2012,2017,2020 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #include "cenv.h" #include "util.h" enum tgt {mlTypesH, cTypesH, cTypesSML}; static const char* mlTypesHPrefix[] = { "/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a HPND-style license.", " * See the file MLton-LICENSE for details.", " */", "", "#ifndef _MLTON_MLTYPES_H_", "#define _MLTON_MLTYPES_H_", "", "/* We need these because in header files for exported SML functions, ", " * types.h is included without cenv.h.", " */", "#if (defined (_AIX) || defined (__hpux__) || defined (__OpenBSD__))", "#include ", "#elif (defined (__sun__))", "#include ", "#else", "#include ", "#endif", "", NULL }; static const char* cTypesHPrefix[] = { "/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a HPND-style license.", " * See the file MLton-LICENSE for details.", " */", "", "#ifndef _MLTON_CTYPES_H_", "#define _MLTON_CTYPES_H_", "", NULL }; static const char* cTypesSMLPrefix[] = { "(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a HPND-style license.", " * See the file MLton-LICENSE for details.", " *)", "", NULL }; static const char* mlTypesHStd[] = { "/* ML types */", // "typedef void* Pointer;", // "typedef uintptr_t Pointer;", // "typedef unsigned char* Pointer;", "typedef unsigned char PointerAux __attribute__ ((may_alias));", "typedef PointerAux* Pointer;", "#define Array(t) Pointer", "#define Ref(t) Pointer", "#define Vector(t) Pointer", "", "typedef int8_t Int8_t;", "typedef int8_t Int8;", "typedef int16_t Int16_t;", "typedef int16_t Int16;", "typedef int32_t Int32_t;", "typedef int32_t Int32;", "typedef int64_t Int64_t;", "typedef int64_t Int64;", "typedef float Real32_t;", "typedef float Real32;", "typedef double Real64_t;", "typedef double Real64;", // "typedef long double Real128_t;", // "typedef long double Real128;", "typedef uint8_t Word8_t;", "typedef uint8_t Word8;", "typedef uint16_t Word16_t;", "typedef uint16_t Word16;", "typedef uint32_t Word32_t;", "typedef uint32_t Word32;", "typedef uint64_t Word64_t;", "typedef uint64_t Word64;", "", "typedef Int8_t WordS8_t;", "typedef Int8_t WordS8;", "typedef Int16_t WordS16_t;", "typedef Int16_t WordS16;", "typedef Int32_t WordS32_t;", "typedef Int32_t WordS32;", "typedef Int64_t WordS64_t;", "typedef Int64_t WordS64;", "", "typedef Word8_t WordU8_t;", "typedef Word8_t WordU8;", "typedef Word16_t WordU16_t;", "typedef Word16_t WordU16;", "typedef Word32_t WordU32_t;", "typedef Word32_t WordU32;", "typedef Word64_t WordU64_t;", "typedef Word64_t WordU64;", "", "typedef WordU8_t Char8_t;", "typedef WordU8_t Char8;", "typedef WordU16_t Char16_t;", "typedef WordU16_t Char16;", "typedef WordU32_t Char32_t;", "typedef WordU32_t Char32;", "", "typedef Vector(Char8_t) String8_t;", "typedef Vector(Char8_t) String8;", "typedef Vector(Char16_t) String16_t;", "typedef Vector(Char16_t) String16;", "typedef Vector(Char32_t) String32_t;", "typedef Vector(Char32_t) String32;", "", "typedef Int32_t Bool_t;", "typedef Int32_t Bool;", // "typedef Char8_t Char_t;", // "typedef Char8_t Char;", // "typedef Int32_t Int_t;", // "typedef Int32_t Int;", // "typedef Real64_t Real_t;", // "typedef Real64_t Real;", // "typedef String8_t String_t;", // "typedef String8_t String;", // "typedef Word32_t Word_t;", // "typedef Word32_t Word;", "" "typedef String8_t NullString8_t;", "typedef String8_t NullString8;", "", "typedef void* CPointer;", "typedef Pointer Objptr;", NULL }; #define booltype(t, bt, name) \ do { \ switch (tgt) { \ case mlTypesH: \ break; \ case cTypesH: \ writeString (stdout, "typedef"); \ writeString (stdout, " /* "); \ writeString (stdout, #t); \ writeString (stdout, " */ "); \ writeString (stdout, bt); \ writeUintmaxU (stdout, CHAR_BIT * sizeof(t)); \ writeString (stdout, "_t"); \ writeString (stdout, " "); \ writeString (stdout, "C_"); \ writeString (stdout, name); \ writeString (stdout, "_t;"); \ break; \ case cTypesSML: \ writeString (stdout, "structure C_"); \ writeString (stdout, name); \ writeString (stdout, " = WordToBool ("); \ writeString (stdout, "type t = "); \ writeString (stdout, "Word"); \ writeUintmaxU (stdout, CHAR_BIT * sizeof(t)); \ writeString (stdout, ".word"); \ writeString (stdout, " "); \ writeString (stdout, "val zero: t = 0wx0"); \ writeString (stdout, " "); \ writeString (stdout, "val one: t = 0wx1"); \ writeString (stdout, ")"); \ break; \ } \ writeNewline (stdout); \ } while (0) #define systype(t, bt, name) \ do { \ char *btLower = strdup(bt); \ for (size_t i = 0; i < strlen(btLower); i++) \ btLower[i] = (char)(tolower((int)(bt[i]))); \ char *btUpper = strdup(bt); \ for (size_t i = 0; i < strlen(btUpper); i++) \ btUpper[i] = (char)(toupper((int)(bt[i]))); \ switch (tgt) { \ case mlTypesH: \ break; \ case cTypesH: \ writeString (stdout, "typedef"); \ writeString (stdout, " /* "); \ writeString (stdout, #t); \ writeString (stdout, " */ "); \ writeString (stdout, bt); \ writeUintmaxU (stdout, CHAR_BIT * sizeof(t)); \ writeString (stdout, "_t"); \ writeString (stdout, " "); \ writeString (stdout, "C_"); \ writeString (stdout, name); \ writeString (stdout, "_t;"); \ break; \ case cTypesSML: \ writeString (stdout, "structure C_"); \ writeString (stdout, name); \ writeString (stdout, " = struct open "); \ writeString (stdout, bt); \ writeUintmaxU (stdout, CHAR_BIT * sizeof(t)); \ writeString (stdout, " type t = "); \ writeString (stdout, btLower); \ writeString (stdout, " end"); \ writeNewline (stdout); \ writeString (stdout, "functor C_"); \ writeString (stdout, name); \ writeString (stdout, "_Choose"); \ writeString (stdout, bt); \ writeString (stdout, "N (A: CHOOSE_"); \ writeString (stdout, btUpper); \ writeString (stdout, "N_ARG) = Choose"); \ writeString (stdout, bt); \ writeString (stdout, "N_"); \ writeString (stdout, bt); \ writeUintmaxU (stdout, CHAR_BIT * sizeof(t)); \ writeString (stdout, " (A)"); \ break; \ } \ writeNewline (stdout); \ free (btLower); \ free (btUpper); \ } while (0) #define chksystype(t, name) \ do { \ if ((double)((t)(0.25)) > 0) \ systype(t, "Real", name); \ else if ((double)((t)(-1)) > 0) \ systype(t, "Word", name); \ else \ systype(t, "Int", name); \ } while (0) #define ptrtype(t, name) \ do { \ systype(t, "Word", name); \ } while (0) #define aliastype(name1, bt, name2) \ do { \ char *btLower = strdup(bt); \ for (size_t i = 0; i < strlen(btLower); i++) \ btLower[i] = (char)(tolower((int)(bt[i]))); \ char *btUpper = strdup(bt); \ for (size_t i = 0; i < strlen(btUpper); i++) \ btUpper[i] = (char)(toupper((int)(bt[i]))); \ switch (tgt) { \ case mlTypesH: \ break; \ case cTypesH: \ writeString (stdout, "typedef "); \ writeString (stdout, "C_"); \ writeString (stdout, name1); \ writeString (stdout, "_t "); \ writeString (stdout, "C_"); \ writeString (stdout, name2); \ writeString (stdout, "_t;"); \ break; \ case cTypesSML: \ writeString (stdout, "structure C_"); \ writeString (stdout, name2); \ writeString (stdout, " = C_"); \ writeString (stdout, name1); \ writeNewline (stdout); \ writeString (stdout, "functor C_"); \ writeString (stdout, name2); \ writeString (stdout, "_Choose"); \ writeString (stdout, bt); \ writeString (stdout, "N (A: CHOOSE_"); \ writeString (stdout, btUpper); \ writeString (stdout, "N_ARG) = C_"); \ writeString (stdout, name1); \ writeString (stdout, "_Choose"); \ writeString (stdout, bt); \ writeString (stdout, "N (A)"); \ break; \ } \ writeNewline (stdout); \ free (btLower); \ free (btUpper); \ } while (0) static const char* mlTypesHSuffix[] = { "", "#endif /* _MLTON_MLTYPES_H_ */", NULL }; static const char* cTypesHSuffix[] = { "", "#define C_Errno_t(t) t", "", "#endif /* _MLTON_CTYPES_H_ */", NULL }; static const char* cTypesSMLSuffix[] = { NULL }; #define tgtCom(com) \ (tgt == cTypesH ? "/* " com " */" : "(* " com " *)") int main (int argc, char* argv[]) { enum tgt tgt; if (argc != 2) die ("usage: %s ml-types.h|c-types.h|c-types.sml", argv[0]); if (strcmp(argv[1], "ml-types.h") == 0) tgt = mlTypesH; else if (strcmp(argv[1], "c-types.h") == 0) tgt = cTypesH; else if (strcmp(argv[1], "c-types.sml") == 0) tgt = cTypesSML; else die ("usage: %s ml-types.h|c-types.h|c-types.sml", argv[0]); switch (tgt) { case mlTypesH: for (int i = 0; mlTypesHPrefix[i] != NULL; i++) writeStringWithNewline (stdout, mlTypesHPrefix[i]); for (int i = 0; mlTypesHStd[i] != NULL; i++) writeStringWithNewline (stdout, mlTypesHStd[i]); for (int i = 0; mlTypesHSuffix[i] != NULL; i++) writeStringWithNewline (stdout, mlTypesHSuffix[i]); break; case cTypesH: case cTypesSML: { const char* *cTypesPrefix = NULL; const char* *cTypesSuffix = NULL; switch (tgt) { case mlTypesH: break; case cTypesH: cTypesPrefix = cTypesHPrefix; cTypesSuffix = cTypesHSuffix; break; case cTypesSML: cTypesPrefix = cTypesSMLPrefix; cTypesSuffix = cTypesSMLSuffix; break; } for (int i = 0; cTypesPrefix[i] != NULL; i++) writeStringWithNewline (stdout, cTypesPrefix[i]); writeStringWithNewline (stdout, tgtCom ("C")); booltype(_Bool, "Word", "Bool"); chksystype(char, "Char"); chksystype(signed char, "SChar"); chksystype(unsigned char, "UChar"); chksystype(short, "Short"); chksystype(signed short, "SShort"); chksystype(unsigned short, "UShort"); chksystype(int, "Int"); chksystype(signed int, "SInt"); chksystype(unsigned int, "UInt"); chksystype(long, "Long"); chksystype(signed long, "SLong"); chksystype(unsigned long, "ULong"); chksystype(long long, "LongLong"); chksystype(signed long long, "SLongLong"); chksystype(unsigned long long, "ULongLong"); chksystype(float, "Float"); chksystype(double, "Double"); // chksystype(long double, "LongDouble"); chksystype(size_t, "Size"); writeNewline (stdout); ptrtype(unsigned char*, "Pointer"); // ptrtype(void*, "Pointer"); // ptrtype(uintptr_t, "Pointer"); ptrtype(char*, "String"); ptrtype(char**, "StringArray"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("Generic integers")); aliastype("Int", "Int", "Fd"); aliastype("Int", "Int", "Signal"); aliastype("Int", "Int", "Status"); aliastype("Int", "Int", "Sock"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("C99")); chksystype(ptrdiff_t, "Ptrdiff"); chksystype(intmax_t, "Intmax"); chksystype(uintmax_t, "UIntmax"); chksystype(intptr_t, "Intptr"); chksystype(uintptr_t, "UIntptr"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); // ptrtype(DIR*, "DirP"); systype(DIR*, "Word", "DirP"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); chksystype(nfds_t, "NFds"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); chksystype(rlim_t, "RLim"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); // chksystype(blkcnt_t, "BlkCnt"); // chksystype(blksize_t, "BlkSize"); chksystype(clock_t, "Clock"); chksystype(dev_t, "Dev"); chksystype(gid_t, "GId"); // chksystype(id_t, "Id"); chksystype(ino_t, "INo"); chksystype(mode_t, "Mode"); chksystype(nlink_t, "NLink"); chksystype(off_t, "Off"); chksystype(pid_t, "PId"); chksystype(ssize_t, "SSize"); chksystype(suseconds_t, "SUSeconds"); chksystype(time_t, "Time"); chksystype(uid_t, "UId"); // chksystype(useconds_t, "USeconds"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); chksystype(socklen_t, "Socklen"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from ")); chksystype(cc_t, "CC"); chksystype(speed_t, "Speed"); chksystype(tcflag_t, "TCFlag"); writeNewline (stdout); writeStringWithNewline (stdout, tgtCom ("from \"gmp.h\"")); chksystype(mp_limb_t, "MPLimb"); for (int i = 0; cTypesSuffix[i] != NULL; i++) writeStringWithNewline (stdout, cTypesSuffix[i]); break; } } return 0; } mlton-20210117+dfsg/runtime/platform.c000066400000000000000000000017111416264345000175010ustar00rootroot00000000000000/* Copyright (C) 2004-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #include "platform.h" Bool MLton_Platform_CygwinUseMmap = TRUE; void GC_setCygwinUseMmap (bool b) { MLton_Platform_CygwinUseMmap = b; } void MLton_init (int argc, char **argv, GC_state s) { int start; Posix_ProcEnv_environ = (C_StringArray_t)environ; start = GC_init (s, argc, argv); /* Setup argv and argc that SML sees. */ /* start is now the index of the first real arg. */ CommandLine_commandName = (C_String_t)(argv[0]); CommandLine_argc = argc - start; CommandLine_argv = (C_StringArray_t)(argv + start); } void MLton_halt (GC_state s, C_Int_t status) { GC_done (s); exit (status); } void MLton_heapCheckTooLarge (void) { die ("Out of memory. Unable to check heap for more than %"PRIuMAX" bytes.\n", (uintmax_t)SIZE_MAX); } mlton-20210117+dfsg/runtime/platform.h000066400000000000000000000134461416264345000175160ustar00rootroot00000000000000/* Copyright (C) 2010,2012,2016,2019 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_PLATFORM_H_ #define _MLTON_PLATFORM_H_ #include "cenv.h" #include "util.h" #include "ml-types.h" #include "c-types.h" #ifndef MLton_Platform_Arch_host #error MLton_Platform_Arch_host not defined #endif #ifndef MLton_Platform_OS_host #error MLton_Platform_OS_host not defined #endif #ifndef HAS_FEROUND #error HAS_FEROUND not defined #endif #ifndef HAS_MSG_DONTWAIT #error HAS_MSG_DONTWAIT not defined #endif #ifndef HAS_REMAP #error HAS_REMAP not defined #endif #ifndef HAS_SIGALTSTACK #error HAS_SIGALTSTACK not defined #else #ifndef NEEDS_SIGALTSTACK_EXEC #error NEEDS_SIGALTSTACK_EXEC not defined #endif #endif #ifndef HAS_SPAWN #error HAS_SPAWN not defined #endif #ifndef HAS_TIME_PROFILING #error HAS_TIME_PROFILING not defined #endif #ifndef EXECVP #define EXECVP execvp #endif #ifndef EXECVE #define EXECVE execve #endif #define FE_NOSUPPORT -1 /* With HAS_FEROUND unset, the runtime will provide the implementation. * That implementation depends on FE_* having the values we set below. * We must therefore make sure to eliminate any existing #defines and * then create our own defines, which will also take precedence over * any enums we included from system headers. */ #if not HAS_FEROUND #ifdef FE_TONEAREST #undef FE_TONEAREST #endif #ifdef FE_DOWNWARD #undef FE_DOWNWARD #endif #ifdef FE_UPWARD #undef FE_UPWARD #endif #ifdef FE_TOWARDZERO #undef FE_TOWARDZERO #endif #define FE_TONEAREST 0 #define FE_DOWNWARD 1 #define FE_UPWARD 2 #define FE_TOWARDZERO 3 #endif #include "gc.h" #ifndef INLINE #define INLINE #endif #include "basis-ffi.h" /* ---------------------------------------------------------------- */ /* Runtime Init/Exit/Alloc */ /* ---------------------------------------------------------------- */ PRIVATE void MLton_init (int argc, char **argv, GC_state s); PRIVATE __attribute__ ((noreturn)) void MLton_halt (GC_state s, C_Int_t status); PRIVATE __attribute__ ((noreturn)) void MLton_heapCheckTooLarge (void); /* ---------------------------------------------------------------- */ /* Utility libraries */ /* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */ /* Garbage Collector */ /* ---------------------------------------------------------------- */ /* ------------------------------------------------- */ /* Virtual Memory */ /* ------------------------------------------------- */ /* GC_displayMem displays the virtual memory mapping to stdout. * It is used to diagnose memory problems. */ PRIVATE void GC_displayMem (void); PRIVATE void *GC_mmapAnon (void *start, size_t length); PRIVATE void *GC_mmapAnonFlags (void *start, size_t length, int flags); PRIVATE void *GC_mmapAnon_safe (void *start, size_t length); PRIVATE void *GC_mmapAnonFlags_safe (void *start, size_t length, int flags); PRIVATE void *GC_mmapAnon_safe_protect (void *start, size_t length, int prot, size_t dead_low, size_t dead_high); PRIVATE void *GC_mmapAnonStack (void *start, size_t length, int prot, size_t dead_low, size_t dead_high); PRIVATE void *GC_mmapAnonFlags_safe_protect (void *start, size_t length, int prot, int flags, size_t dead_low, size_t dead_high); PRIVATE void *GC_mremap (void *start, size_t oldLength, size_t newLength); PRIVATE void GC_release (void *base, size_t length); PRIVATE size_t GC_pageSize (void); PRIVATE uintmax_t GC_physMem (void); PRIVATE void GC_setCygwinUseMmap (bool b); PRIVATE void GC_diskBack_close (void *data); PRIVATE void GC_diskBack_read (void *data, pointer buf, size_t size); PRIVATE void *GC_diskBack_write (pointer buf, size_t size); /* ------------------------------------------------- */ /* SigProf Handler */ /* ------------------------------------------------- */ PRIVATE void GC_setSigProfHandler (struct sigaction *sa); /* ---------------------------------------------------------------- */ /* MLton libraries */ /* ---------------------------------------------------------------- */ /* ------------------------------------------------- */ /* MLton */ /* ------------------------------------------------- */ /* ---------------------------------- */ /* MLton.Platform */ /* ---------------------------------- */ #define MLton_Platform_Arch_bigendian isBigEndian() PRIVATE extern Bool MLton_Platform_CygwinUseMmap; /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ #if (defined (__MSVCRT__)) PRIVATE void MLton_initSockets (void); PRIVATE void MLton_fixSocketErrno (void); #else static inline void MLton_initSockets (void) {} static inline void MLton_fixSocketErrno (void) {} #endif #if HAS_MSG_DONTWAIT #define MLton_recv recv #define MLton_recvfrom recvfrom #else /* Platform has no MSG_DONTWAIT flag for recv(), so these must be defined to simulate that flag. */ PRIVATE int MLton_recv(int s, void *buf, int len, int flags); PRIVATE int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen); #endif #endif /* _MLTON_PLATFORM_H_ */ mlton-20210117+dfsg/runtime/platform/000077500000000000000000000000001416264345000173355ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/platform/aix.c000066400000000000000000000106171416264345000202670ustar00rootroot00000000000000#include "platform.h" #include #include #include #include "platform/diskBack.unix.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/recv.nonblock.c" #include "platform/use-mmap.c" size_t GC_pageSize (void) { long pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } /* We cannot use _SC_PHYS_PAGES from sysconf.c. It fails on some versions of AIX. */ uintmax_t GC_physMem (void) { struct vminfo vminfo; uintmax_t physMem; if (vmgetinfo (&vminfo, VMINFO, sizeof (vminfo)) < 0) diee ("GC_physMem error: vmgetinfo failed"); physMem = (uintmax_t)vminfo.memsizepgs * (uintmax_t)4096; return physMem; } struct map_type { int flag; const char *type; }; static struct map_type map_types[] = {{MA_MAINEXEC, "main"}, {MA_KERNTEXT, "kern"}, {MA_SHARED, "shared"}, {MA_STACK, "stack"}, {0, NULL}}; struct map_segment { prptr64_t start; prptr64_t end; const char *name; }; static struct map_segment map_segments[] = {{(prptr64_t)0x00000000, (prptr64_t)0x0fffffff, "kernel"}, /* Application program text. */ {(prptr64_t)0x10000000, (prptr64_t)0x1fffffff, "text"}, /* Application program data and the application stack. */ {(prptr64_t)0x20000000, (prptr64_t)0x2fffffff, "data"}, /* Available for use by shared memory or mmap services. */ {(prptr64_t)0x30000000, (prptr64_t)0xafffffff, "mmap"}, /* Shared library text. */ {(prptr64_t)0xd0000000, (prptr64_t)0xdfffffff, "shtext"}, /* Miscellaneous kernel data. */ {(prptr64_t)0xe0000000, (prptr64_t)0xefffffff, "kdata"}, /* Application shared library data. */ {(prptr64_t)0xf0000000, (prptr64_t)0xffffffff, "shdata"}, {0, 0, NULL}}; static const char * get_map_type (int flags, prptr64_t addr) { struct map_type *m; for (m = map_types; m->flag; m++) if (m->flag & flags) return m->type; if ((addr >= (prptr64_t)0xd0000000 && addr <= (prptr64_t)0xdfffffff) || (addr >= (prptr64_t)0xf0000000 && addr <= (prptr64_t)0xffffffff)) return "shlib"; return ""; } static const char * get_map_segment (prptr64_t addr) { struct map_segment *m; for (m = map_segments; m->name; m++) if (m->start <= addr && m->end >= addr) return m->name; return ""; } #define BUFLEN 65536 void GC_displayMem (void) { pid_t pid = getpid (); char fname[128]; int fd = 0; char *buf; struct prmap *map; printf ("va_start va_end perm type segment file (member) [object]\n"); printf ("--------+--------+---+------+------+----------------------\n"); snprintf (fname, sizeof (fname), "/proc/%d/map", pid); fd = open (fname, O_RDONLY); if (fd == -1) diee ("showMem error: opening %s failed", fname); /* I couldn't figure out a way to get the size of the map file beforehand (only open, read, write, and close work on files under /proc), so let's just hope that 64k will be enough. */ buf = malloc (BUFLEN); if (buf == NULL) die ("showMem error: out of memory."); read (fd, buf, BUFLEN); map = (struct prmap*)buf; for (map = (struct prmap*)buf; map->pr_size; map++) { char *m = buf + map->pr_pathoff; m += strlen (m) + 1; if (!m[0]) m = NULL; printf ("%08llx %08llx %s%s%s %-6s %-6s %s %s%s%s[%s]\n", map->pr_vaddr, map->pr_vaddr + map->pr_size, map->pr_mflags & MA_READ ? "r" : "-", map->pr_mflags & MA_WRITE ? "w" : "-", map->pr_mflags & MA_EXEC ? "x" : "-", get_map_type (map->pr_mflags, map->pr_vaddr), get_map_segment (map->pr_vaddr), buf + map->pr_pathoff, m ? "(" : "", m ? m : "", m ? ") " : "", map->pr_mapname); } } mlton-20210117+dfsg/runtime/platform/aix.h000066400000000000000000000016771416264345000203020ustar00rootroot00000000000000#if defined(_ARCH_PPC64) #define __powerpc64__ #elif defined(_ARCH_PPC) #define __powerpc__ #else #error "Unknown architecture" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT FALSE #define HAS_PTRACE FALSE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING FALSE #define MLton_Platform_OS_host "aix" /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 mlton-20210117+dfsg/runtime/platform/alpha.h000066400000000000000000000000511416264345000205670ustar00rootroot00000000000000#define MLton_Platform_Arch_host "alpha" mlton-20210117+dfsg/runtime/platform/amd64.h000066400000000000000000000003471416264345000204250ustar00rootroot00000000000000#define MLton_Platform_Arch_host "amd64" #define POINTER_BITS 64 #if (defined (__CYGWIN__) || defined (__MINGW32__)) #define ADDRESS_BITS 43 #elif (defined (__linux__)) #define ADDRESS_BITS 48 #else #define ADDRESS_BITS 40 #endif mlton-20210117+dfsg/runtime/platform/android_ucontext.h000066400000000000000000000103151416264345000230570ustar00rootroot00000000000000// Copyright (c) 2009, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Only recent versions of Android's C library correctly define the // required types for ucontext_t handling. This header provides a // custom declarations that will work when Google Breakpad is built // against any version of the NDK or platform headers, and work on // any version of the system. // // See http://code.google.com/p/android/issues/detail?id=34784 // #ifndef GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_ #define GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_ #include #include #ifndef __BIONIC_HAVE_UCONTEXT_T #if defined(__arm__) // Ensure that 'struct sigcontext' is defined. #include typedef struct sigcontext mcontext_t; typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; mcontext_t uc_mcontext; // Other fields are not used by Google Breakpad. Don't define them. } ucontext_t; #elif defined(__i386__) /* 80-bit floating-point register */ struct _libc_fpreg { unsigned short significand[4]; unsigned short exponent; }; /* Simple floating-point state, see FNSTENV instruction */ struct _libc_fpstate { unsigned long cw; unsigned long sw; unsigned long tag; unsigned long ipoff; unsigned long cssel; unsigned long dataoff; unsigned long datasel; struct _libc_fpreg _st[8]; unsigned long status; }; typedef struct { uint32_t gregs[19]; struct _libc_fpstate* fpregs; uint32_t oldmask; uint32_t cr2; } mcontext_t; enum { REG_GS = 0, REG_FS, REG_ES, REG_DS, REG_EDI, REG_ESI, REG_EBP, REG_ESP, REG_EBX, REG_EDX, REG_ECX, REG_EAX, REG_TRAPNO, REG_ERR, REG_EIP, REG_CS, REG_EFL, REG_UESP, REG_SS, REG_ES, REG_ES, REG_ES, REG_ES, }; typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; mcontext_t uc_mcontext; // Other fields are not used by Google Breakpad. Don't define them. } ucontext_t; #elif defined(__mips__) // Not supported by Google Breakpad at this point, but just in case. typedef struct { uint32_t regmask; uint32_t status; uint64_t pc; uint64_t gregs[32]; uint64_t fpregs[32]; uint32_t acx; uint32_t fpc_csr; uint32_t fpc_eir; uint32_t used_math; uint32_t dsp; uint64_t mdhi; uint64_t mdlo; uint32_t hi1; uint32_t lo1; uint32_t hi2; uint32_t lo2; uint32_t hi3; uint32_t lo3; } mcontext_t; typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; mcontext_t uc_mcontext; // Other fields are not used by Google Breakpad. Don't define them. } ucontext_t; #else # error "Unsupported Android CPU ABI!" #endif #endif // !__BIONIC_HAVE_UCONTEXT_T #endif // GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_ mlton-20210117+dfsg/runtime/platform/arm.h000066400000000000000000000017611416264345000202720ustar00rootroot00000000000000#define MLton_Platform_Arch_host "arm" /* Work around broken rounding mode control on ARM * * ARM CPUs can be running with either hardware or software. * Neither support rounding modes with fe{get,set}round. * Rounding direction is part of the instruction format. * * Unfortunately, due to vendor stupidity, every OS deals * with this differently: * Some pretend to support it and ignore calls. * Some throw an error even for the supported mode (TO_NEAREST). * All of them define all of the TO_* macros in defiance of the standard. * ... basically, the system libraries are useless. * * The solution for MLton: replace fe{get,set}round with our own honest * versions which accept TO_NEAREST and fail for other values. */ #undef fegetround #undef fesetround #define fegetround MLton_fegetround #define fesetround MLton_fesetround static inline int fegetround(void) { return FE_TONEAREST; } static inline int fesetround(int rounding_mode) { return (rounding_mode==FE_TONEAREST)?0:1; } mlton-20210117+dfsg/runtime/platform/arm64.h000066400000000000000000000000511416264345000204330ustar00rootroot00000000000000#define MLton_Platform_Arch_host "arm64" mlton-20210117+dfsg/runtime/platform/cygwin.c000066400000000000000000000076121416264345000210070ustar00rootroot00000000000000#define _GNU_SOURCE #include "platform.h" #include "platform/mmap.c" #if not HAS_MSG_DONTWAIT #include "platform/recv.nonblock.c" #endif #include "platform/windows.c" #include "platform/mremap.c" /* * The sysconf(_SC_PAGESIZE) is the necessary alignment for using * mmap. Windows has another notion of page size (that corresponds to * physical page size?). Just to be safe, we take the least common * multiple of the sysconf and Windows notions of page size. * * Since sysconf(_SC_PAGESIZE) might not correspond to the physical * page size, we can't use sysconf(_SC_PHYS_PAGES) to get physical * memory. So, use the Windows function. * * See: http://cygwin.com/ml/cygwin/2006-06/msg00341.html */ static size_t GC_pageSize_sysconf (void) { SYSTEM_INFO sysinfo; long int pageSize; pageSize = sysconf (_SC_PAGESIZE); GetSystemInfo(&sysinfo); /* MLton_Platform_CygwinUseMmap is not set when this is called. * Assume the worst; choose the larger allocation unit. */ if ((size_t)pageSize < (size_t)sysinfo.dwAllocationGranularity) return (size_t)sysinfo.dwAllocationGranularity; else return (size_t)pageSize; } static size_t GC_pageSize_windows (void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return (size_t)sysinfo.dwPageSize; } size_t GC_pageSize (void) { size_t pageSize_sysconf = GC_pageSize_sysconf (); size_t pageSize_windows = GC_pageSize_windows (); size_t a = pageSize_sysconf; size_t b = pageSize_windows; size_t t; while (b != 0) { t = b; b = a % b; a = t; } size_t gcd = a; size_t lcm = (pageSize_sysconf / gcd) * pageSize_windows; return lcm; } uintmax_t GC_physMem (void) { MEMORYSTATUS memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatus(&memstat); return (uintmax_t)memstat.dwTotalPhys; } void *GC_mmapAnon (void *start, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (start, length); else return Windows_mmapAnon (start, length); } void *GC_mmapAnonFlags (void *start, size_t length, __attribute__ ((unused)) int flags) { return GC_mmapAnon(start, length); } void GC_release (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) munmap_safe (base, length); else Windows_release (base, length); } void* GC_extendHead (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (base, length); else return Windows_mmapAnon (base, length); } void* GC_extendTail (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (base, length); else return Windows_extend (base, length); } HANDLE fileDesHandle (int fd) { // The temporary prevents a "cast does not match function type" warning. long t; t = get_osfhandle (fd); return (HANDLE)t; } /* ------------------------------------------------- */ /* Cygwin */ /* ------------------------------------------------- */ C_String_t Cygwin_toFullWindowsPath (NullString8_t path) { static char res[MAX_PATH]; #if ((CYGWIN_VERSION_API_MAJOR > 0) || (CYGWIN_VERSION_API_MINOR > 181)) cygwin_conv_path (CCP_POSIX_TO_WIN_A | CCP_ABSOLUTE, (char*)path, &res[0], MAX_PATH); #else cygwin_conv_to_full_win32_path ((char*)path, &res[0]); #endif return (C_String_t)&res[0]; } /* ------------------------------------------------- */ /* Posix */ /* ------------------------------------------------- */ void Posix_IO_setbin (C_Fd_t fd) { /* cygwin has a different method for working with its fds */ setmode (fd, O_BINARY); } void Posix_IO_settext (C_Fd_t fd) { /* cygwin has a different method for working with its fds */ setmode (fd, O_TEXT); } mlton-20210117+dfsg/runtime/platform/cygwin.h000066400000000000000000000030501416264345000210040ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MLton_Platform_OS_host "cygwin" #define HAS_FEROUND FALSE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK FALSE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN TRUE #define HAS_TIME_PROFILING FALSE #ifndef MSG_DONTWAIT #define HAS_MSG_DONTWAIT FALSE /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 #else #define HAS_MSG_DONTWAIT TRUE #endif #define SPAWN_MODE _P_NOWAIT /* Cygwin does not handle IPv6. */ #ifndef AF_INET6 #define AF_INET6 23 /* Internet Protocol, Version 6 */ #define PF_INET6 AF_INET6 struct sockaddr_in6 { int dummy; // quell gcc warnings about "struct has no members" }; /* Cygwin does provide sockaddr_storage. */ #endif typedef unsigned int nfds_t; typedef long suseconds_t; // type of timeval.tv_usec in sys/time.h #ifndef MSG_WAITALL // Unimplemented on Cygwin #define MSG_WAITALL 0 #endif #ifndef MSG_EOR // Unimplemented on Cygwin #define MSG_EOR 0 #endif mlton-20210117+dfsg/runtime/platform/darwin.c000066400000000000000000000032301416264345000207630ustar00rootroot00000000000000#include "platform.h" #include #include #include "platform/diskBack.unix.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/sysctl.c" #include "platform/use-mmap.c" void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "/usr/bin/vmmap -w -interleaved %d\n", (int)getpid ()); (void)system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; #if (defined(__powerpc__) || defined(__ppc__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__srr0); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.srr0); #endif #elif (defined(__i386__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__eip); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.eip); #endif #elif (defined(__x86_64__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__rip); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.rip); #endif #elif (defined(__aarch64__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__pc); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.pc); #endif #else #error Unsupported darwin CPU architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20210117+dfsg/runtime/platform/darwin.h000066400000000000000000000023421416264345000207730ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "darwin" // MacOS only defines this if POSIX_C_SOURCE is defined. // However, defining that breaks half the osx system headers. // They couldn't possibly change the number at this point anyway. #ifndef SIGPOLL #define SIGPOLL 7 #endif /* for Posix_ProcEnv_environ */ #define environ *_NSGetEnviron() mlton-20210117+dfsg/runtime/platform/diskBack.unix.c000066400000000000000000000034361416264345000222040ustar00rootroot00000000000000static FILE *tempFileDes (void) { int fd; FILE *f; char *template; const char *tmpDir; const char *tag = "/TempFileXXXXXXXXXX"; size_t tmpDirLen, tagLen; mode_t m; tmpDir = getenv ("TMP"); if (NULL == tmpDir) { tmpDir = getenv ("TMPDIR"); if (NULL == tmpDir) tmpDir = "/var/tmp"; } tmpDirLen = strlen(tmpDir); tagLen = strlen(tag); template = malloc_safe (tmpDirLen + tagLen + 1); strncpy (template, tmpDir, tmpDirLen + 1); strncpy (template + tmpDirLen, tag, tagLen + 1); m = umask(077); fd = mkstemp_safe (template); f = fdopen_safe (fd, "w+"); (void)umask(m); unlink_safe (template); free (template); return f; } typedef struct { FILE *f; } *WriteToDiskData; void GC_diskBack_read (void *data, pointer buf, size_t size) { FILE *f; const size_t READ_CHUNK_SIZE = 0x2000000; /* 32M */ f = ((WriteToDiskData)data)->f; fseek_safe (f, 0, SEEK_SET); /* fread (_, 1, size, _) succeeds * with size >= 2^31 * for a 32-bit executable on 64-bit linux. * Nonetheless, match GC_diskBack_write. */ while (size > 0) { size_t s = min (READ_CHUNK_SIZE, size); fread_safe (buf, 1, s, f); buf += s; size -= s; } } void GC_diskBack_close (void *data) { FILE *f; f = ((WriteToDiskData)data)->f; fclose_safe (f); free (data); } void *GC_diskBack_write (pointer buf, size_t size) { FILE *f; WriteToDiskData d; const size_t WRITE_CHUNK_SIZE = 0x2000000; /* 32M */ f = tempFileDes (); /* fwrite (_, 1, size, _) fails * (with no helpful error conditions!) * with size >= 2^31 * on x86-linux. */ while (size > 0) { size_t s = min (WRITE_CHUNK_SIZE, size); fwrite_safe (buf, 1, s, f); buf += s; size -= s; } d = (WriteToDiskData)(malloc_safe (sizeof(*d))); d->f = f; return d; } mlton-20210117+dfsg/runtime/platform/displayMem.proc.c000066400000000000000000000003621416264345000225500ustar00rootroot00000000000000void GC_displayMem (void) { static char buffer[256]; int res; snprintf (buffer, cardof(buffer), "/bin/cat /proc/%d/maps\n", (int)(getpid ())); res = system (buffer); if (-1 == res) return; } mlton-20210117+dfsg/runtime/platform/freebsd.c000066400000000000000000000023141416264345000211130ustar00rootroot00000000000000#include "platform.h" #include "platform/diskBack.unix.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/sysctl.c" #include "platform/use-mmap.c" void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "/bin/cat /proc/%d/map\n", (int)getpid ()); (void)system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; #if (defined (__x86_64__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.mc_rip); #elif (defined (__i386__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.mc_eip); #elif (defined (__arm__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.__gregs[_REG_PC]); #elif (defined (__aarch64__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.mc_gpregs.gp_elr); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20210117+dfsg/runtime/platform/freebsd.h000066400000000000000000000020761416264345000211250ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "freebsd" /* This is probably debian specific, since freebsd worked w/o it before. */ #if (defined (__FreeBSD_kernel__)) #define getpgrp() getpgrp(getpid()) #endif extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20210117+dfsg/runtime/platform/hppa.h000066400000000000000000000000501416264345000204310ustar00rootroot00000000000000#define MLton_Platform_Arch_host "hppa" mlton-20210117+dfsg/runtime/platform/hpux.c000066400000000000000000000073231416264345000204720ustar00rootroot00000000000000#include "platform.h" #include #include #include #include #define MAP_ANON MAP_ANONYMOUS #include "platform/diskBack.unix.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/recv.nonblock.c" #include "platform/setenv.putenv.c" #include "platform/use-mmap.c" struct pstnames { int type; const char *name; }; static struct pstnames pst_type_names[] = {{ PS_NOTUSED, "unused" }, { PS_USER_AREA, "user" }, { PS_TEXT, "text" }, { PS_DATA, "data" }, { PS_STACK, "stack" }, { PS_SHARED, "shared" }, { PS_NULLDEREF, "null" }, { PS_IO, "io" }, { PS_MMF, "mmap" }, { PS_GRAPHICS, "gfx" }, { PS_GRAPHICS_DMA, "gfxdma" }, #ifdef PS_RSESTACK { PS_RSESTACK, "rsestack" }, #endif { 0, NULL }}; static const char * pst_type_name(int type) { int i; for (i = 0; pst_type_names[i].name; i++) if (pst_type_names[i].type == type) return pst_type_names[i].name; return "unknown"; } static const char* pst_filename(struct pst_vm_status vm) { static char fname[256]; #ifdef PSTAT_FILEDETAILS if (pstat_getpathname (fname, sizeof (fname), &vm.pst_fid) < 0) #endif strcpy (fname, "unknown"); return fname; } void GC_displayMem (void) { int i; struct pst_vm_status buf; size_t page_size = sysconf (_SC_PAGE_SIZE); printf("va_start va_end perms type phys filename\n"); printf("--------+--------+-----+-------+------+-----------\n"); for (i = 0;; i++) { if (pstat_getprocvm (&buf, sizeof (buf), 0, i) < 0) break; printf("%p %p %s%s%s %-8s %4d %s\n", (void*)buf.pst_vaddr, (void*)(buf.pst_vaddr + buf.pst_length * page_size - 1), (buf.pst_flags & PS_PROT_READ) ? "-" : "r", (buf.pst_flags & PS_PROT_WRITE) ? "-" : "w", (buf.pst_flags & PS_PROT_EXECUTE) ? "-" : "x", pst_type_name (buf.pst_type), buf.pst_phys_pages, pst_filename (buf)); } } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_link)); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } size_t GC_pageSize (void) { struct pst_static buf; if (pstat_getstatic (&buf, sizeof (buf), 1, 0) < 0) diee ("failed to get page size"); return buf.page_size; } uintmax_t GC_physMem (void) { struct pst_static buf; uintmax_t physMem; if (pstat_getstatic (&buf, sizeof (buf), 1, 0) < 0) diee ("failed to get physical memory size"); physMem = (uintmax_t)buf.physical_memory * (uintmax_t)buf.page_size; return physMem; } #ifdef __hppa__ float modff (float x, float *iptr) { double d, i; d = modf ((double)x, &i); *iptr = (float)i; return d; } float rintf (float x) { return (float)rint ((double)x); } float frexpf (float x, int *e) { return (float)frexp ((double)x, e); } float ldexpf (float x, int e) { return (float)ldexp ((double)x, e); } #endif /* __hppa__ */ mlton-20210117+dfsg/runtime/platform/hpux.h000066400000000000000000000037641416264345000205040ustar00rootroot00000000000000#ifndef _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "platform/setenv.h" #if defined(SO_TOE) #define HPUX_VERSION 1123 #elif defined(PRIV_PSET) #define HPUX_VERSION 1111 #elif defined(PRIV_SPUCTL) #define HPUX_VERSION 1100 #else #error "HP-UX 11.00 is the oldest supported version." #endif #undef UINTPTR_MAX #define UINTPTR_MAX ULONG_MAX #ifndef SIZE_MAX #define SIZE_MAX ((size_t)SSIZE_MAX * 2 + 1) #endif #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT FALSE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "hpux" #define LOG_PERROR 0 #ifndef LOG_AUTHPRIV #define LOG_AUTHPRIV LOG_AUTH #endif /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 /* fesetround() doesn't seem to be returning 0 as expected. */ static int MLton_fesetround (int mode) { fesetround (mode); return 0; } #define fesetround MLton_fesetround typedef long suseconds_t; // type of timeval.tv_usec in sys/time.h #ifdef __hppa__ /* These do not exist on HPPA, so we implement our own. */ float modff(float x, float *iptr); float rintf(float x); float frexpf(float x, int *exp); float ldexpf(float x, int exp); #endif /* __hppa__ */ #define PRIxPTR "lx" /* These are incorrectly defined in the system headers. */ #undef PRIu32 #define PRIu32 "u" #undef PRIx32 #define PRIx32 "x" #undef PRId32 #define PRId32 "d" mlton-20210117+dfsg/runtime/platform/hurd.c000066400000000000000000000007121416264345000204430ustar00rootroot00000000000000#define _GNU_SOURCE #include "platform.h" #include "platform/diskBack.unix.c" #include "platform/displayMem.proc.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/use-mmap.c" #include "platform/sysconf.c" #include "platform/mremap.c" void* GC_extendHead (void *base, size_t length) { return mmapAnon (base, length); } void* GC_extendTail (void *base, size_t length) { return mmapAnon (base, length); } mlton-20210117+dfsg/runtime/platform/hurd.h000066400000000000000000000016401416264345000204510ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING FALSE #define MLton_Platform_OS_host "hurd" // environ is already defined if _GNU_SOURCE is. #ifndef _GNU_SOURCE extern char **environ; /* for Posix_ProcEnv_environ */ #endif mlton-20210117+dfsg/runtime/platform/ia64.h000066400000000000000000000000501416264345000202440ustar00rootroot00000000000000#define MLton_Platform_Arch_host "ia64" mlton-20210117+dfsg/runtime/platform/linux.c000066400000000000000000000066371416264345000206540ustar00rootroot00000000000000// For `mremap` and `MREMAP_MAYMOVE` #define _GNU_SOURCE #include "platform.h" #include "platform/diskBack.unix.c" #include "platform/displayMem.proc.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/use-mmap.c" static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { #if (defined (__x86_64__)) #ifndef REG_RIP #define REG_INDEX(NAME) (offsetof(struct sigcontext, NAME) / sizeof(greg_t)) #define REG_RIP REG_INDEX(rip) /* seems to be 16 */ #endif ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[REG_RIP]); #elif (defined (__alpha__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_mcontext.sc_pc)); #elif (defined (__hppa__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_mcontext.sc_iaoq[0] & ~0x3UL)); #elif (defined(__ia64__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->_u._mc.sc_ip); #elif (defined (__ppc__)) || (defined (__powerpc__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.regs->nip); #elif (defined (__sparc__)) struct sigcontext* scp = (struct sigcontext*)context; #if __WORDSIZE == 64 GC_handleSigProf ((code_pointer) scp->sigc_regs.tpc); #else GC_handleSigProf ((code_pointer) scp->si_regs.pc); #endif #elif (defined (__mips__)) ucontext_t* ucp = (ucontext_t*)context; #ifdef __UCLIBC__ GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gpregs[CTX_EPC]); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext.pc); #endif #elif (defined (__i386__)) #ifndef EIP #define EIP 14 #endif ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[EIP]); #elif (defined (__arm__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.arm_pc); #elif (defined (__aarch64__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.pc); #elif (defined (__s390__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.psw.addr); #elif (defined (__riscv)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.__gregs[REG_PC]); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } void *GC_mremap (void *start, size_t oldLength, size_t newLength) { return mremap (start, oldLength, newLength, MREMAP_MAYMOVE); } size_t GC_pageSize (void) { long int pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } /* sysconf(_SC_PHYS_PAGES) is not portable (mipsel uclibc) */ uintmax_t GC_physMem (void) { struct sysinfo si; if (sysinfo(&si) < 0) diee ("GC_physMem error: sysinfo failed"); return (uintmax_t)si.totalram * (uintmax_t)si.mem_unit; } mlton-20210117+dfsg/runtime/platform/linux.h000066400000000000000000000043171416264345000206520ustar00rootroot00000000000000#include #include #ifdef __UCLIBC__ #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __UCLIBC__ #define HAS_FEROUND FALSE #else #define HAS_FEROUND TRUE #endif #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK TRUE #if (defined (__hppa__)) #define NEEDS_SIGALTSTACK_EXEC TRUE #else #define NEEDS_SIGALTSTACK_EXEC FALSE #endif #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "linux" // environ is already defined if _GNU_SOURCE is. #if !defined(_GNU_SOURCE) && !defined(__ANDROID__) extern char **environ; /* for Posix_ProcEnv_environ */ #endif /* The following is compatibility code with older glibc and kernel versions. */ #ifndef __suseconds_t_defined #include typedef __kernel_suseconds_t suseconds_t; #define __suseconds_t_defined #endif #ifdef __GLIBC__ #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 1 typedef unsigned long int nfds_t; #endif #endif #ifdef __ANDROID__ /* Work around buggy android system libraries */ #undef PRIxPTR #define PRIxPTR "x" /* Needed for fetching program counter */ #include /* Android is missing these methods: */ #undef tcdrain #undef ctermid #define tcdrain MLton_tcdrain #define ctermid MLton_ctermid static inline int tcdrain(int fd) { return ioctl(fd, TCSBRK, 1); } static inline char* ctermid(char* x) { static char buf[] = "/dev/tty"; if (x) { strcpy(x, buf); return x; } else { return &buf[0]; } } #endif #ifndef SO_ACCEPTCONN #define SO_ACCEPTCONN 30 #endif #ifdef __UCLIBC__ #define FE_DOWNWARD _FPU_RC_DOWN #define FE_TONEAREST _FPU_RC_NEAREST #define FE_TOWARDZERO _FPU_RC_ZERO #define FE_UPWARD _FPU_RC_UP #endif mlton-20210117+dfsg/runtime/platform/m68k.h000066400000000000000000000000501416264345000202660ustar00rootroot00000000000000#define MLton_Platform_Arch_host "m68k" mlton-20210117+dfsg/runtime/platform/mingw.c000066400000000000000000001454131416264345000206320ustar00rootroot00000000000000#define _GNU_SOURCE #include "platform.h" #include "platform/windows.c" #include "platform/mremap.c" void *GC_mmapAnon (void *start, size_t length) { return Windows_mmapAnon (start, length); } void *GC_mmapAnonFlags (void *start, size_t length, __attribute__ ((unused)) int flags) { return GC_mmapAnon(start, length); } void GC_release (void *base, size_t length) { Windows_release (base, length); } void *GC_extendHead (void *base, size_t length) { return Windows_mmapAnon (base, length); } void *GC_extendTail (void *base, size_t length) { return Windows_extend (base, length); } uintmax_t GC_physMem (void) { #ifdef _WIN64 MEMORYSTATUSEX memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatusEx(&memstat); return (uintmax_t)memstat.ullTotalPhys; #else MEMORYSTATUS memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatus(&memstat); return (uintmax_t)memstat.dwTotalPhys; #endif } size_t GC_pageSize (void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return (size_t)sysinfo.dwAllocationGranularity; } HANDLE fileDesHandle (int fd) { // The temporary prevents a "cast does not match function type" warning. intptr_t t; t = _get_osfhandle (fd); return (HANDLE)t; } int mkstemp (char *template) { char file_path[255]; char file_name[255]; char templ[4]; if (0 == GetTempPath (sizeof (file_path), file_path)) diee ("unable to make temporary file"); strncpy (templ, template, sizeof (templ) - 1); templ[sizeof (templ) - 1] = 0x00; if (0 == GetTempFileName (file_path, templ, 0, file_name)) diee ("unable to make temporary file"); return _open (file_name, _O_CREAT | _O_RDWR, _S_IREAD | _S_IWRITE); } /* ------------------------------------------------- */ /* Date */ /* ------------------------------------------------- */ #ifndef __GNUC__ #define EPOCHFILETIME (116444736000000000i64) #else #define EPOCHFILETIME (116444736000000000LL) #endif /* The basic plan is to get an initial time using GetSystemTime * that is good up to ~10ms accuracy. From then on, we compute * using deltas with the high-resolution (> microsecond range) * performance timers. A 64-bit accumulator holds microseconds * since (*nix) epoch. This is good for over 500,000 years before * wrap-around becomes a concern. * * However, we might need to watch out for wrap-around with the * QueryPerformanceCounter, because it could be measuring at a higher * frequency than microseconds. * * This function only strives to allow a program to run for * 100 years without being restarted. */ int gettimeofday (struct timeval *tv, __attribute__ ((unused)) struct timezone *tz) { static LARGE_INTEGER frequency; /* ticks/second */ static LARGE_INTEGER baseCounter; /* ticks since last rebase */ static LARGE_INTEGER baseMicroSeconds; /* unix time at last rebase */ LARGE_INTEGER nowCounter; LARGE_INTEGER deltaCounter; LARGE_INTEGER nowMicroSeconds; double deltaMicroseconds; /* This code is run the first time gettimeofday is called. */ if (frequency.QuadPart == 0) { FILETIME ft; /* tzset prepares the localtime function. I don't * really understand why it's here and not there, * but this has been the case since before svn logs. * So I leave it here to preserve the status-quo. */ tzset(); QueryPerformanceCounter(&baseCounter); QueryPerformanceFrequency(&frequency); if (frequency.QuadPart == 0) die("no high resolution clock"); GetSystemTimeAsFileTime (&ft); baseMicroSeconds.LowPart = ft.dwLowDateTime; baseMicroSeconds.HighPart = ft.dwHighDateTime; baseMicroSeconds.QuadPart -= EPOCHFILETIME; baseMicroSeconds.QuadPart /= 10; /* 100ns -> 1ms */ } /* Use the high res counter ticks to calculate the delta. * A double has 52+1 bits of precision. This means it can fit * deltas of up to 9007199254 seconds, or 286 years. We could * rebase before an overflow, but 286 is already > 100. */ QueryPerformanceCounter(&nowCounter); deltaCounter.QuadPart = nowCounter.QuadPart - baseCounter.QuadPart; deltaMicroseconds = deltaCounter.QuadPart; deltaMicroseconds /= frequency.QuadPart; deltaMicroseconds *= 1000000.0; nowMicroSeconds.QuadPart = baseMicroSeconds.QuadPart + deltaMicroseconds; /* If the frequency too fast, we need to check for wrap around. * 2**32 seconds is 136 years, so if HighPart == 0 we don't need to * waste a system call on GetSystemTimeAsFileTime. */ if (frequency.HighPart != 0) { LARGE_INTEGER nowLowResMicroSeconds; FILETIME ft; /* Use low res timer to detect performance counter wrap-around. */ GetSystemTimeAsFileTime (&ft); nowLowResMicroSeconds.LowPart = ft.dwLowDateTime; nowLowResMicroSeconds.HighPart = ft.dwHighDateTime; nowLowResMicroSeconds.QuadPart -= EPOCHFILETIME; nowLowResMicroSeconds.QuadPart /= 10; /* If deltaMicroseconds deviates by more than a second from the low * resolution timer, assume the high performance counter has wrapped. * One second is a safe margin b/c QueryPerformanceFrequency must fit * in a 64-bit integer. Therefore any wrap must exceed one second. */ if (nowMicroSeconds.QuadPart + 1000000 < nowLowResMicroSeconds.QuadPart) { baseCounter = nowCounter; baseMicroSeconds = nowLowResMicroSeconds; nowMicroSeconds = nowLowResMicroSeconds; } /* The above wrap-around detection destroys high resolution timing. * However, if one needs high resolution timing, then one is querying * gettimeofday quite often. Therefore, rebase the clock before any * wrap around troubles happen. We don't do this too often as it * introduces clock drift. */ if ((deltaCounter.HighPart & 0xffff0000UL) != 0) { baseCounter = nowCounter; baseMicroSeconds = nowMicroSeconds; } } tv->tv_sec = (long)(nowMicroSeconds.QuadPart / 1000000); tv->tv_usec = (long)(nowMicroSeconds.QuadPart % 1000000); return 0; } /* ------------------------------------------------- */ /* MLton.Itimer */ /* ------------------------------------------------- */ /* We use the kernel's TimerQueues -- see: * http://msdn.microsoft.com/en-us/library/ms686796(VS.85).aspx */ static HANDLE MainThread = NULL; static HANDLE TimerQueue = NULL; static HANDLE RealTimer = NULL; static HANDLE VirtTimer = NULL; static HANDLE ProfTimer = NULL; static HANDLE PrioTimer = NULL; static void (*SIGALRM_handler)(int sig) = SIG_DFL; static void (*SIGVTAM_handler)(int sig) = SIG_DFL; static void (*SIGPROF_handler)(int sig) = SIG_DFL; /* The timer handler is fired in another thread. * The idea is to suspend the main thread and resume it once we're done. * This will appear more-or-less the same as if a Unix system had received * the signal. We will also be firing the handler in the timer thread itself * for performance reasons (MLton uses this mechanism to do multi-threading). * This means the signal handlers must be fast, which they are since they * just mark the signal to be processed later. */ static VOID CALLBACK MLton_SIGALRM(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGALRM_handler == SIG_IGN) { /* noop */ } else if (SIGALRM_handler == SIG_DFL) { die("alarm"); } else { (*SIGALRM_handler)(SIGALRM); } ResumeThread(MainThread); } static VOID CALLBACK MLton_SIGVTAM(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGVTAM_handler == SIG_IGN) { /* noop */ } else if (SIGVTAM_handler == SIG_DFL) { die("vtalarm"); } else { (*SIGVTAM_handler)(SIGVTALRM); } ResumeThread(MainThread); } static VOID CALLBACK MLton_SIGPROF(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGPROF_handler == SIG_IGN) { /* noop */ } else if (SIGPROF_handler == SIG_DFL) { die("sigprof"); } else { (*SIGPROF_handler)(SIGPROF); } ResumeThread(MainThread); } static void CALLBACK fixPriority(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); DeleteTimerQueueTimer(TimerQueue, PrioTimer, NULL); } static int MLTimer(HANDLE *timer, const struct itimerval *value, WAITORTIMERCALLBACK callback) { DWORD DueTime, Period; /* Initialize the TimerQueue */ if (MainThread == 0) { /* This call improves the resolution of the scheduler from * 16ms to about 2ms in my testing. Sadly it requires winmm. */ timeBeginPeriod(1); TimerQueue = CreateTimerQueue(); if (TimerQueue == NULL) { errno = ENOMEM; return -1; } /* We need to get the TimerQueue to have higher priority. * From my testing, if it has the same priority as the main * thread and the main thread is busy, your best resolution * is a terribly slow 188ms. By boosting the priority of the * timer thread to ABOVE_NORMAL, I've gotten down to 2ms. */ CreateTimerQueueTimer(&PrioTimer, TimerQueue, fixPriority, 0, 1, 0, WT_EXECUTEINTIMERTHREAD); /* We need a handle to the main thread usable by the timer * thread. GetCurrentThread() is a self-reference so we need * to copy it to a new handle for it to work in other threads. */ DuplicateHandle(GetCurrentProcess(), /* source process */ GetCurrentThread(), /* source handle */ GetCurrentProcess(), /* target process */ &MainThread, /* target handle */ 0, /* access (ignored) */ FALSE, /* not inheritable */ DUPLICATE_SAME_ACCESS); if (MainThread == 0) die("Cannot get handle to initial thread"); } /* Windows uses ms accuracy for TimerQueues */ DueTime = value->it_value.tv_sec * 1000 + (value->it_value.tv_usec + 999) / 1000; Period = value->it_interval.tv_sec * 1000 + (value->it_interval.tv_usec + 999) / 1000; if (timer != NULL) { DeleteTimerQueueTimer(TimerQueue, *timer, NULL); *timer = NULL; } if (DueTime == 0) { return 0; } if (!CreateTimerQueueTimer( timer, /* output: created timer */ TimerQueue, /* The queue which holds the timers */ callback, /* Invoked on timer events */ 0, /* myArg for the callback */ DueTime, /* Must be non-zero => time till first event */ Period, /* Time till the event repeats (forever) */ WT_EXECUTEINTIMERTHREAD)) { /* Don't use a thread pool */ errno = ENOMEM; return -1; } return 0; } int setitimer (int which, const struct itimerval *value, struct itimerval *ovalue) { if (ovalue != 0) die("setitimer doesn't support retrieving old state"); switch (which) { case ITIMER_REAL: return MLTimer(&RealTimer, value, &MLton_SIGALRM); case ITIMER_VIRT: return MLTimer(&VirtTimer, value, &MLton_SIGVTAM); case ITIMER_PROF: return MLTimer(&ProfTimer, value, &MLton_SIGPROF); default: errno = EINVAL; return -1; } } static void catcher(__attribute__ ((unused)) int signo) { CONTEXT context; context.ContextFlags = CONTEXT_CONTROL; GetThreadContext(MainThread, &context); #if defined(__i386__) GC_handleSigProf((code_pointer) context.Eip); #elif defined(__x86_64__) GC_handleSigProf((code_pointer) context.Rip); #elif defined(_PPC_) GC_handleSigProf((code_pointer) context.Iar); #elif defined(_ALPHA_) GC_handleSigProf((code_pointer) context.Fir); #elif defined(MIPS) GC_handleSigProf((code_pointer) context.Fir); #elif defined(ARM) GC_handleSigProf((code_pointer) context.Pc); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = 0; sa->sa_handler = (_sig_func_ptr)&catcher; } /* ------------------------------------------------- */ /* MLton.Rlimit */ /* ------------------------------------------------- */ static struct rlimit rlimits[RLIM_NLIMITS]; static void initRlimits (void) { static int done = FALSE; int lim; if (done) return; done = TRUE; for (lim = 0; lim < RLIM_NLIMITS; ++lim ) { rlimits[lim].rlim_cur = 0; rlimits[lim].rlim_max = UINT_MAX; } } int getrlimit (int resource, struct rlimit *rlp) { initRlimits (); if (resource < 0 or resource >= RLIM_NLIMITS) { errno = EINVAL; return -1; } *rlp = rlimits[resource]; return 0; } int setrlimit (int resource, const struct rlimit *rlp) { initRlimits (); if (resource < 0 or resource >= RLIM_NLIMITS) { errno = EINVAL; return -1; } if (rlp->rlim_cur < rlimits[resource].rlim_max) rlimits[resource].rlim_cur = rlp->rlim_cur; else { errno = EPERM; return -1; } rlimits[resource].rlim_max = rlp->rlim_max; return 0; } /* ------------------------------------------------- */ /* MLton.Rusage */ /* ------------------------------------------------- */ /* GetProcessTimes and GetSystemTimeAsFileTime are documented at: * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocesstimes.asp */ int getrusage (int who, struct rusage *usage) { /* FILETIME has dw{High,Low}DateTime which store the number of * 100-nanoseconds since January 1, 1601 */ FILETIME creation_time; FILETIME exit_time; FILETIME kernel_time; FILETIME user_time; uint64_t user_usecs, kernel_usecs; if (who == RUSAGE_CHILDREN) { // !!! could use exit_time - creation_time from cwait memset(usage, 0, sizeof(struct rusage)); return 0; } if (who != RUSAGE_SELF) { errno = EINVAL; return -1; } if (GetProcessTimes(GetCurrentProcess(), &creation_time, &exit_time, &kernel_time, &user_time) == 0) { errno = EFAULT; return -1; } kernel_usecs = kernel_time.dwHighDateTime; kernel_usecs <<= sizeof(kernel_time.dwHighDateTime)*8; kernel_usecs |= kernel_time.dwLowDateTime; kernel_usecs /= 10; user_usecs = user_time.dwHighDateTime; user_usecs <<= sizeof(user_time.dwHighDateTime)*8; user_usecs |= user_time.dwLowDateTime; user_usecs /= 10; usage->ru_utime.tv_sec = user_usecs / 1000000; usage->ru_utime.tv_usec = user_usecs % 1000000; usage->ru_stime.tv_sec = kernel_usecs / 1000000; usage->ru_stime.tv_usec = kernel_usecs % 1000000; return 0; } /* ------------------------------------------------- */ /* OS.IO */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int poll (__attribute__ ((unused)) struct pollfd *ufds, __attribute__ ((unused)) unsigned int nfds, __attribute__ ((unused)) int timeout) { die ("poll not implemented"); } /* ------------------------------------------------- */ /* Posix.FileSys */ /* ------------------------------------------------- */ static void GetWin32FileName (int fd, char* fname) { HANDLE fh, fhmap; DWORD fileSize, fileSizeHi; void* pMem = NULL; intptr_t tmp; tmp = _get_osfhandle (fd); fh = (HANDLE)tmp; fileSize = GetFileSize (fh, &fileSizeHi); fhmap = CreateFileMapping (fh, NULL, PAGE_READONLY, 0, fileSize, NULL); if (fhmap) { pMem = MapViewOfFile (fhmap, FILE_MAP_READ, 0, 0, 1); if (pMem) { GetMappedFileNameA (GetCurrentProcess(), pMem, fname, MAX_PATH); UnmapViewOfFile (pMem); } CloseHandle (fhmap); } } int fchmod (int filedes, mode_t mode) { char fname[MAX_PATH + 1]; GetWin32FileName (filedes, fname); return _chmod (fname, mode); } int fchdir (int filedes) { char fname[MAX_PATH + 1]; GetWin32FileName (filedes, fname); return chdir (fname); } __attribute__ ((noreturn)) int chown (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) uid_t owner, __attribute__ ((unused)) gid_t group) { die ("chown not implemented"); } __attribute__ ((noreturn)) int fchown (__attribute__ ((unused)) int fd, __attribute__ ((unused)) uid_t owner, __attribute__ ((unused)) gid_t group) { die ("fchown not implemented"); } __attribute__ ((noreturn)) long fpathconf (__attribute__ ((unused)) int filedes, __attribute__ ((unused)) int name) { die ("fpathconf not implemented"); } __attribute__ ((noreturn)) int link (__attribute__ ((unused)) const char *oldpath, __attribute__ ((unused)) const char *newpath) { die ("link not implemented"); } int lstat (const char *file_name, struct stat *buf) { /* Win32 doesn't really have links. */ return stat (file_name, buf); } __attribute__ ((noreturn)) int mkfifo (__attribute__ ((unused)) const char *pathname, __attribute__ ((unused)) mode_t mode) { die ("mkfifo not implemented"); } __attribute__ ((noreturn)) long pathconf (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) int name) { die ("pathconf not implemented"); } __attribute__ ((noreturn)) int readlink (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) char *buf, __attribute__ ((unused)) size_t bufsiz) { die ("readlink not implemented"); } __attribute__ ((noreturn)) int symlink (__attribute__ ((unused)) const char *oldpath, __attribute__ ((unused)) const char *newpath) { die ("symlink not implemented"); } int truncate (const char *path, off_t len) { int fd; if ((fd = open(path, O_RDWR)) == -1) return -1; if (ftruncate(fd, len) < 0) { close(fd); return -1; } close(fd); return 0; } /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int fcntl (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int cmd, ...) { die ("fcntl not implemented"); } int fsync (int fd) { return _commit (fd); } int pipe (int filedes[2]) { HANDLE read_h; HANDLE write_h; /* We pass no security attributes (0), so the current policy gets * inherited. The pipe is set to NOT stay open in child processes. * This will be corrected using DuplicateHandle in create() * The 4k buffersize is choosen b/c that's what linux uses. */ if (!CreatePipe(&read_h, &write_h, 0, 4096)) { errno = ENOMEM; /* fake errno: out of resources */ return -1; } /* This requires Win98+ * Choosing text/binary mode is defered till a later setbin/text call */ filedes[0] = _open_osfhandle((intptr_t)read_h, _O_RDONLY); filedes[1] = _open_osfhandle((intptr_t)write_h, _O_WRONLY); if (filedes[0] == -1 or filedes[1] == -1) { if (filedes[0] == -1) CloseHandle(read_h); else close(filedes[0]); if (filedes[1] == -1) CloseHandle(write_h); else close(filedes[1]); errno = ENFILE; return -1; } return 0; } /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) char *ctermid (__attribute__ ((unused)) char* s) { die ("*ctermid not implemented"); } __attribute__ ((noreturn)) gid_t getegid (void) { die ("getegid not implemented"); } __attribute__ ((noreturn)) uid_t geteuid (void) { die ("geteuid not implemented"); } __attribute__ ((noreturn)) gid_t getgid (void) { die ("getgid not implemented"); } __attribute__ ((noreturn)) int getgroups (__attribute__ ((unused)) int size, __attribute__ ((unused)) gid_t list[]) { die ("getgroups not implemented"); } __attribute__ ((noreturn)) char *getlogin (void) { die ("getlogin not implemented"); } __attribute__ ((noreturn)) pid_t getpgid(__attribute__ ((unused)) pid_t pid) { die ("getpgid not implemented"); } __attribute__ ((noreturn)) pid_t getpgrp(void) { die ("getpgrp not implemented"); } __attribute__ ((noreturn)) pid_t getppid (void) { die ("getppid not implemented"); } __attribute__ ((noreturn)) uid_t getuid (void) { die ("getuid not implemented"); } int setenv (const char *name, const char *value, int overwrite) { /* We could use _putenv, but then we'd need a temporary buffer for * use to concat name=value. */ if (not overwrite and getenv (name)) { errno = EEXIST; return -1; /* previous mingw setenv was buggy and returned 0 */ } if (SetEnvironmentVariable (name, value)) { errno = ENOMEM; /* this happens often in Windows.. */ return -1; } return 0; } __attribute__ ((noreturn)) int setgid (__attribute__ ((unused)) gid_t gid) { die ("setgid not implemented"); } __attribute__ ((noreturn)) int setgroups (__attribute__ ((unused)) size_t size, __attribute__ ((unused)) const gid_t *list) { die ("setgroups not implemented"); } __attribute__ ((noreturn)) int setpgid (__attribute__ ((unused)) pid_t pid, __attribute__ ((unused)) pid_t pgid) { die ("setpgid not implemented"); } __attribute__ ((noreturn)) pid_t setsid (void) { die ("setsid not implemented"); } __attribute__ ((noreturn)) int setuid (__attribute__ ((unused)) uid_t uid) { die ("setuid not implemented"); } __attribute__ ((noreturn)) long sysconf (__attribute__ ((unused)) int name) { die ("sysconf not implemented"); } __attribute__ ((noreturn)) clock_t times (__attribute__ ((unused)) struct tms *buf) { die ("times not implemented"); } __attribute__ ((noreturn)) char *ttyname (__attribute__ ((unused)) int desc) { die ("*ttyname not implemented"); } static void setMachine (struct utsname *buf) { int level; const char* platform = "unknown"; SYSTEM_INFO si; GetSystemInfo (&si); level = si.dwProcessorType; switch (si.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_INTEL: if (level < 3) level = 3; if (level > 6) level = 6; platform = "i%d86"; break; case PROCESSOR_ARCHITECTURE_IA64: platform = "ia64"; break; case PROCESSOR_ARCHITECTURE_AMD64: platform = "amd64"; break; case PROCESSOR_ARCHITECTURE_PPC: platform = "ppc"; break; case PROCESSOR_ARCHITECTURE_ALPHA: platform = "alpha"; break; case PROCESSOR_ARCHITECTURE_MIPS: platform = "mips"; break; case PROCESSOR_ARCHITECTURE_ARM: platform = "arm"; break; case PROCESSOR_ARCHITECTURE_ALPHA64: platform = "alpha64"; break; /* SHX? MSIL? IA32_ON_WIN64? */ default: platform = "unknown"; break; } sprintf (buf->machine, platform, level); } static void setSysname (struct utsname *buf) { OSVERSIONINFOEX osv; const char* os = "??"; #ifndef _WIN64 /* Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. */ SYSTEM_INFO si; void (WINAPI *pGNSI)(LPSYSTEM_INFO); pGNSI = (void(WINAPI *)(LPSYSTEM_INFO)) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); if (NULL != pGNSI) pGNSI(&si); else GetSystemInfo(&si); #endif osv.dwOSVersionInfoSize = sizeof (osv); /* Try to get extended information in order to be able to match the O.S. more precisely using osv.wProductType */ if (! GetVersionEx ((OSVERSIONINFO *)(void*) &osv)) { ZeroMemory(&osv, sizeof(OSVERSIONINFOEX)); osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO *)(void*) &osv); } switch (osv.dwPlatformId) { case VER_PLATFORM_WIN32_NT: #ifdef _WIN64 if (osv.dwMinorVersion == 0) { if (osv.dwMajorVersion <= 6) { if (osv.wProductType == VER_NT_WORKSTATION) os = "Vista_64"; else os = "2008_64"; } else os = "NTx_64"; } else if (osv.dwMinorVersion <= 2) os = "XP_64"; else os = "NTx_64"; #else if (osv.dwMinorVersion == 0) { if (osv.dwMajorVersion <= 4) os = "NT"; else if (osv.dwMajorVersion <= 5) os = "2000"; else { if (osv.wProductType == VER_NT_WORKSTATION) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "Vista_WOW64"; else os = "Vista"; } else { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "2008"; else os = "2008_WOW64"; } } } else if (osv.dwMinorVersion <= 1) os = "XP"; else if (osv.dwMinorVersion <= 2) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "XP_WOW64"; else os = "2003"; } else os = "NTx"; #endif break; case VER_PLATFORM_WIN32_WINDOWS: if (osv.dwMinorVersion == 0) os = "95"; else if (osv.dwMinorVersion < 90) os = "98"; else if (osv.dwMinorVersion == 90) os = "Me"; else os = "9X"; break; case VER_PLATFORM_WIN32s: os = "31"; /* aka DOS + Windows 3.1 */ break; default: os = "unknown"; break; } #ifdef _WIN64 #define mingw_name "MINGW64" #else #define mingw_name "MINGW32" #endif sprintf (buf->sysname, "%s_%s-%d.%d", mingw_name, os, (int)osv.dwMajorVersion, (int)osv.dwMinorVersion); } int uname (struct utsname *buf) { MLton_initSockets(); /* needed for gethostname */ setMachine (buf); setSysname (buf); unless (0 == gethostname (buf->nodename, sizeof (buf->nodename))) { strcpy (buf->nodename, "unknown"); } #ifdef _WIN64 sprintf (buf->release, "%d", __MINGW64_VERSION_MINOR); sprintf (buf->version, "%d", __MINGW64_VERSION_MAJOR); #else sprintf (buf->release, "%d", __MINGW32_MINOR_VERSION); sprintf (buf->version, "%d", __MINGW32_MAJOR_VERSION); #endif return 0; } /* ------------------------------------------------- */ /* Posix.Process */ /* ------------------------------------------------- */ int alarm (int secs) { struct itimerval new; new.it_interval.tv_usec = 0; new.it_interval.tv_sec = 0; new.it_value.tv_usec = 0; new.it_value.tv_sec = secs; return setitimer(ITIMER_REAL, &new, 0); } __attribute__ ((noreturn)) int fork (void) { die ("fork not implemented"); } int kill (pid_t pid, int sig) { HANDLE h = (HANDLE)pid; unless (TerminateProcess (h, SIGNALLED_BIT | sig)) { errno = ECHILD; return -1; } return 0; } int nanosleep (const struct timespec *req, struct timespec *rem) { Sleep (req->tv_sec * 1000 + (req->tv_nsec + 999999) / 1000000); rem->tv_nsec = 0; rem->tv_sec = 0; return 0; } __attribute__ ((noreturn)) int pause (void) { die ("pause not implemented"); } unsigned int sleep (unsigned int seconds) { Sleep (seconds * 1000); return 0; } __attribute__ ((noreturn)) pid_t wait (__attribute__ ((unused)) int *status) { die ("wait not implemented"); } pid_t waitpid (pid_t pid, int *status, int options) { HANDLE h; DWORD delay; /* pid <= 0 is handled in stub-mingw.sml */ h = (HANDLE)pid; delay = ((options & WNOHANG) != 0) ? 0 : INFINITE; switch (WaitForSingleObject (h, delay)) { case WAIT_OBJECT_0: /* process has exited */ break; case WAIT_TIMEOUT: /* process has not exited */ return 0; default: /* some sort of error */ errno = ECHILD; return -1; } unless (GetExitCodeProcess (h, (DWORD*)status)) { errno = ECHILD; return -1; } return pid; } /* ------------------------------------------------- */ /* Signals */ /* ------------------------------------------------- */ int sigaction (int signum, const struct sigaction *newact, struct sigaction *oldact) { _sig_func_ptr old; if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } switch (signum) { case SIGKILL: case SIGSTOP: errno = EINVAL; return -1; case SIGALRM: old = SIGALRM_handler; if (newact) SIGALRM_handler = newact->sa_handler; break; case SIGVTALRM: old = SIGVTAM_handler; if (newact) SIGVTAM_handler = newact->sa_handler; break; case SIGPROF: old = SIGPROF_handler; if (newact) SIGPROF_handler = newact->sa_handler; break; default: old = signal (signum, newact?newact->sa_handler:0); if (!newact) signal (signum, old); break; } if (oldact) oldact->sa_handler = old; return 0; } int sigaddset (sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } *set |= SIGTOMASK (signum); return 0; } int sigdelset (sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } *set &= ~SIGTOMASK (signum); return 0; } int sigemptyset (sigset_t *set) { *set = (sigset_t) 0; return 0; } int sigfillset (sigset_t *set) { *set = ~((sigset_t) 0); return 0; } int sigismember (const sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } return (*set & SIGTOMASK(signum)) ? 1 : 0; } /* With a bit of work and a redirected signal() function, we could * probably emulate these methods properly. AtM blocking is a lie. */ static sigset_t signals_blocked = 0; static sigset_t signals_pending = 0; int sigpending (sigset_t *set) { *set = signals_pending; return 0; } int sigprocmask (int how, const sigset_t *set, sigset_t *oldset) { if (oldset) { *oldset = signals_blocked; } if (set) { sigset_t newmask = signals_blocked; switch (how) { case SIG_BLOCK: /* add set to current mask */ newmask |= *set; break; case SIG_UNBLOCK: /* remove set from current mask */ newmask &= ~*set; break; case SIG_SETMASK: /* just set it */ newmask = *set; break; default: return -1; } signals_blocked = newmask; } return 0; } __attribute__ ((noreturn)) int sigsuspend (__attribute__ ((unused)) const sigset_t *mask) { die("sigsuspend is unimplemented, but could be hacked in if needed"); } /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ void Posix_IO_setbin (C_Fd_t fd) { _setmode (fd, _O_BINARY); } void Posix_IO_settext (C_Fd_t fd) { _setmode (fd, _O_TEXT); } /* ------------------------------------------------- */ /* Posix.SysDB.Passwd */ /* ------------------------------------------------- */ #define INFO_LEVEL 3 static LPUSER_INFO_3 usrData = NULL; static struct passwd passwd; __attribute__ ((noreturn)) struct group *getgrgid (__attribute__ ((unused)) gid_t gid) { die ("getgrgid not implemented"); } __attribute__ ((noreturn)) struct group *getgrnam (__attribute__ ((unused)) const char *name) { die ("getgrnam not implemented"); } struct passwd *getpwnam (__attribute__ ((unused)) const char *name) { return NULL; // unless (NERR_Success == // NetUserGetInfo (NULL, (LPCWSTR)name, INFO_LEVEL, // (LPBYTE*)&usrData)) // return NULL; passwd.pw_dir = (char*)usrData->usri3_home_dir; passwd.pw_gid = usrData->usri3_primary_group_id; passwd.pw_name = (char*)usrData->usri3_name; passwd.pw_shell = (char*)usrData->usri3_script_path; passwd.pw_uid = usrData->usri3_user_id; return &passwd; } __attribute__ ((noreturn)) struct passwd *getpwuid (__attribute__ ((unused)) uid_t uid) { die ("getpwuid not implemented"); } /* ------------------------------------------------- */ /* Posix.TTY */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) speed_t cfgetispeed (__attribute__ ((unused)) struct termios *termios_p) { die ("cfgetispeed not implemented"); } __attribute__ ((noreturn)) speed_t cfgetospeed (__attribute__ ((unused)) struct termios *termios_p) { die ("cfgetospeed not implemented"); } __attribute__ ((noreturn)) int cfsetispeed (__attribute__ ((unused)) struct termios *termios_p, __attribute__ ((unused)) speed_t speed) { die ("cfsetispeed not implemented"); } __attribute__ ((noreturn)) int cfsetospeed (__attribute__ ((unused)) struct termios *termios_p, __attribute__ ((unused)) speed_t speed) { die ("cfsetospeed not implemented"); } __attribute__ ((noreturn)) int tcdrain (__attribute__ ((unused)) int fd) { die ("tcdrain not implemented"); } __attribute__ ((noreturn)) int tcflow (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int action) { die ("tcflow not implemented"); } __attribute__ ((noreturn)) int tcflush (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int queue_selector) { die ("tcflush not implemented"); } __attribute__ ((noreturn)) int tcgetattr (__attribute__ ((unused)) int fd, __attribute__ ((unused)) struct termios *termios_p) { die ("tcgetattr not implemented"); } __attribute__ ((noreturn)) pid_t tcgetpgrp (__attribute__ ((unused)) int fd) { die ("tcgetpgrp not implemented"); } __attribute__ ((noreturn)) int tcsendbreak (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int duration) { die ("tcsendbreak not implemented"); } __attribute__ ((noreturn)) int tcsetattr (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int optional_actions, __attribute__ ((unused)) struct termios *termios_p) { die ("tcsetattr not implemented"); } __attribute__ ((noreturn)) int tcsetpgrp (__attribute__ ((unused)) int fd, __attribute__ ((unused)) pid_t pgrpid) { die ("tcsetpgrp not implemented"); } /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int ioctl (__attribute__ ((unused)) int d, __attribute__ ((unused)) int request, ...) { die ("ioctl not implemented"); } __attribute__ ((noreturn)) int socketpair (__attribute__ ((unused)) int d, __attribute__ ((unused)) int type, __attribute__ ((unused)) int protocol, __attribute__ ((unused)) int sv[2]) { die ("socketpair not implemented"); } void MLton_initSockets (void) { static Bool isInitialized = FALSE; WORD version; WSADATA wsaData; unless (isInitialized) { isInitialized = TRUE; version = MAKEWORD (2,2); WSAStartup (version, &wsaData); } } /* This table was constructed with help of * http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx#winsock.wsaenotsock_2 * man errno(3) */ void MLton_fixSocketErrno (void) { int status = WSAGetLastError (); switch (status) { case 0: errno = 0; break; case WSAEINTR: errno = EINTR; break; case WSAEBADF: errno = EBADF; break; case WSAEACCES: errno = EACCES; break; case WSAEFAULT: errno = EFAULT; break; case WSAEINVAL: errno = EINVAL; break; case WSAEMFILE: errno = EMFILE; break; case WSAEWOULDBLOCK: errno = EWOULDBLOCK; break; case WSAEINPROGRESS: errno = EINPROGRESS; break; case WSAEALREADY: errno = EALREADY; break; case WSAENOTSOCK: errno = ENOTSOCK; break; case WSAEDESTADDRREQ: errno = EDESTADDRREQ; break; case WSAEMSGSIZE: errno = EMSGSIZE; break; case WSAEPROTOTYPE: errno = EPROTOTYPE; break; case WSAENOPROTOOPT: errno = ENOPROTOOPT; break; case WSAEPROTONOSUPPORT: errno = EPROTONOSUPPORT; break; case WSAESOCKTNOSUPPORT: errno = ESOCKTNOSUPPORT; break; case WSAEOPNOTSUPP: errno = EOPNOTSUPP; break; case WSAEPFNOSUPPORT: errno = EPFNOSUPPORT; break; case WSAEAFNOSUPPORT: errno = EAFNOSUPPORT; break; case WSAEADDRINUSE: errno = EADDRINUSE; break; case WSAEADDRNOTAVAIL: errno = EADDRNOTAVAIL; break; case WSAENETDOWN: errno = ENETDOWN; break; case WSAENETUNREACH: errno = ENETUNREACH; break; case WSAENETRESET: errno = ENETRESET; break; case WSAECONNABORTED: errno = ECONNABORTED; break; case WSAECONNRESET: errno = ECONNRESET; break; case WSAENOBUFS: errno = ENOBUFS; break; case WSAEISCONN: errno = EISCONN; break; case WSAENOTCONN: errno = ENOTCONN; break; case WSAESHUTDOWN: errno = ESHUTDOWN; break; case WSAETIMEDOUT: errno = ETIMEDOUT; break; case WSAECONNREFUSED: errno = ECONNREFUSED; break; case WSAELOOP: errno = ELOOP; break; case WSAENAMETOOLONG: errno = ENAMETOOLONG; break; case WSAEHOSTDOWN: errno = EHOSTDOWN; break; case WSAEHOSTUNREACH: errno = EHOSTUNREACH; break; case WSAENOTEMPTY: errno = ENOTEMPTY; break; case WSAEDQUOT: errno = EDQUOT; break; case WSAESTALE: errno = ESTALE; break; case WSAEREMOTE: errno = EREMOTE; break; /* These codes appear to have a matching name, but the manual * descriptions of what the error codes mean seem to differ */ case WSAEUSERS: errno = EUSERS; break; case WSAECANCELLED: errno = ECANCELED; break; case WSA_E_CANCELLED: errno = ECANCELED; break; /* These codes have no matching code in the errno(3) man page. */ case WSAEPROCLIM: errno = EBUSY; break; case WSAETOOMANYREFS: errno = ENOMEM; break; case WSAEDISCON: errno = ESHUTDOWN; break; case WSA_E_NO_MORE: case WSAENOMORE: case WSASYSCALLFAILURE: errno = EIO; break; /* These codes are returned from the OS and subject to chage */ // WSA_INVALID_HANDLE // WSA_NOT_ENOUGH_MEMORY // WSA_INVALID_PARAMETER // WSA_OPERATION_ABORTED // WSA_IO_INCOMPLETE // WSA_IO_PENDING /* These codes mean some sort of windows specific fatal error */ case WSASYSNOTREADY: case WSAVERNOTSUPPORTED: case WSANOTINITIALISED: case WSAEINVALIDPROCTABLE: case WSAEINVALIDPROVIDER: case WSAEPROVIDERFAILEDINIT: case WSASERVICE_NOT_FOUND: case WSATYPE_NOT_FOUND: die("Problem loading winsock"); case WSAEREFUSED: case WSAHOST_NOT_FOUND: case WSATRY_AGAIN: case WSANO_RECOVERY: case WSANO_DATA: die("Strange winsock specific status code"); default: die("Unknown winsock status code"); } } static const char *MLton_strerrorExtension(int code) { switch (code) { case EINTR: return "Interrupted function call"; case EBADF: return "Bad file descriptor"; case EACCES: return "Permission denied"; case EFAULT: return "Bad address"; case EINVAL: return "Invalid argument"; case EMFILE: return "Too many open files"; case EAGAIN: return "Resource temporarily unavailable"; case EINPROGRESS: return "Operation in progress"; case EALREADY: return "Connection already in progress"; case ENOTSOCK: return "Not a socket"; case EDESTADDRREQ: return "Destination address required"; case EMSGSIZE: return "Message too long"; case EPROTOTYPE: return "Protocol wrong type for socket"; case ENOPROTOOPT: return "Protocol not available"; case EPROTONOSUPPORT: return "Protocol not supported"; case ESOCKTNOSUPPORT: return "Socket type not supported"; case EOPNOTSUPP: return "Operation not supported on socket"; case EPFNOSUPPORT: return "Protocol family not supported"; case EAFNOSUPPORT: return "Address family not supported"; case EADDRINUSE: return "Address already in use"; case EADDRNOTAVAIL: return "Address not available"; case ENETDOWN: return "Network is down"; case ENETUNREACH: return "Network unreachable"; case ENETRESET: return "Connection aborted by network"; case ECONNABORTED: return "Connection aborted"; case ECONNRESET: return "Connection reset"; case ENOBUFS: return "No buffer space available"; case EISCONN: return "Socket is connected"; case ENOTCONN: return "The socket is not connected"; case ESHUTDOWN: return "Cannot send after transport endpoint shutdown"; case ETIMEDOUT: return "Connection timed out"; case ECONNREFUSED: return "Connection refused"; case ELOOP: return "Too many levels of symbolic links"; case ENAMETOOLONG: return "Filename too long"; case EHOSTDOWN: return "Host is down"; case EHOSTUNREACH: return "Host is unreachable"; case ENOTEMPTY: return "Directory not empty"; case EDQUOT: return "Disk quota exceeded"; case ESTALE: return "Stale file handle"; case EREMOTE: return "Object is remote"; case EUSERS: return "Too many users"; case ECANCELED: return "Operation canceled"; default: return "Unknown error"; } } /* MinGW strerror works for all system-defined errno values. * However, platform/mingw.h adds some missing POSIX networking error codes. * It defines these codes as their closest-equivalent winsock error code. * To report network errors, MLton_fixSocketErrno maps winsock errors to * their closest POSIX errno value. * * This function must handle the winsock errno values we have added. * FormatMessage doesn't return the POSIX string for errors, and it uses * the current locale's language. The MinGW strerror is always English. * * Thus, we just make a big English table to augment strerror. * The descriptions are taken from man errno(3). */ char *MLton_strerror(int code) { static char buffer[80]; #undef strerror if (code < sys_nerr) return strerror(code); #define strerror MLton_strerror strcpy(buffer, MLton_strerrorExtension(code)); return buffer; } int MLton_recv(int s, void *buf, int len, int flags) { int ret, status = 0; if (flags & MSG_DONTWAIT) MinGW_setNonBlock(s); ret = recv(s, buf, len, flags & ~MSG_DONTWAIT); /* We need to preserve the error status across non-blocking call */ if (ret == -1) status = WSAGetLastError(); if (flags & MSG_DONTWAIT) MinGW_clearNonBlock(s); if (ret == -1) WSASetLastError(status); return ret; } int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen) { int ret, status = 0; if (flags & MSG_DONTWAIT) MinGW_setNonBlock(s); ret = recvfrom(s, buf, len, flags & ~MSG_DONTWAIT, from, fromlen); /* We need to preserve the error status across non-blocking call */ if (ret == -1) status = WSAGetLastError(); if (flags & MSG_DONTWAIT) MinGW_clearNonBlock(s); if (ret == -1) WSASetLastError(status); return ret; } /* ------------------------------------------------- */ /* Syslog */ /* ------------------------------------------------- */ static const char* logident = ""; static int logopt = LOG_PERROR; static int logfacility = LOG_LOCAL0; void openlog(const char* ident, int opt, int facility) { logident = ident; logopt = opt; logfacility = facility; } void closelog(void) { } void syslog(int priority, __attribute__ ((unused)) const char* fmt, const char* msg) { static const char* severity[] = { "debug", "informational", "notice", "warning", "error", "CRITICAL", "ALERT", "EMERGENCY" }; if (priority < 0) priority = LOG_DEBUG; if (priority > LOG_EMERG) priority = LOG_EMERG; /* !!! Use ReportEvent to log with windows */ if ((logopt & LOG_PERROR) != 0) { if ((logopt & LOG_PID) != 0) fprintf(stderr, "%s(%d): %s: %s\n", logident, getpid(), severity[priority], msg); else fprintf(stderr, "%s: %s: %s\n", logident, severity[priority], msg); } } /* ------------------------------------------------- */ /* MinGW */ /* ------------------------------------------------- */ C_Size_t MinGW_getTempPath(C_Size_t buf_size, Array(Char8_t) buf) { return GetTempPath(buf_size, (char*)buf); } void MinGW_setNonBlock(C_Fd_t fd) { unsigned long yes = 1; ioctlsocket(fd, FIONBIO, &yes); } void MinGW_clearNonBlock(C_Fd_t fd) { unsigned long no = 0; ioctlsocket(fd, FIONBIO, &no); } mlton-20210117+dfsg/runtime/platform/mingw.h000066400000000000000000000777041416264345000206460ustar00rootroot00000000000000/* Many of the functions used in mingw.c are Win2000+ */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #undef max // As of 20080807, MinGW has a broken fesetround. Use the runtime's. #define HAS_FEROUND FALSE #define HAS_MSG_DONTWAIT FALSE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK FALSE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN TRUE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "mingw" /** MinGW is a moving target. MLton seems to break every release. * Often new releases add new emulation for POSIX functions. * We need to provide wrappers for some POSIX functions, but * these wrappers end up conflicting with MinGW if they're added. * Therefore, all wrapper stuff we add will be #define'd to use * a MLton_prefix, thus avoiding collision with MinGW versions, * current, old, or future. Macros themselves can conflict, so * we need to #undef any old value, and in the case of constants, * wrap the define in an ifndef. It's ugly and verbose, but safe. */ #define MLTON_WRAPPER typedef unsigned short MLton_gid_t; typedef unsigned short MLton_uid_t; typedef long MLton_suseconds_t; // type of timeval.tv_usec in sys/time.h typedef short MLton_nlink_t; // type of st_nlink in sys/stat.h typedef unsigned int MLton_nfds_t; // we have a fake poll() with this many fds #undef gid_t #undef uid_t #undef suseconds_t #undef nlink_t #undef nfds_t #define gid_t MLton_gid_t #define uid_t MLton_uid_t #define suseconds_t MLton_suseconds_t #define nlink_t MLton_nlink_t #define nfds_t MLton_nfds_t MLTON_WRAPPER int MLton_getpagesize (void); MLTON_WRAPPER int MLton_mkstemp (char *template); #undef getpagesize #undef mkstemp #define getpagesize MLton_getpagesize #define mkstemp MLton_mkstemp #ifndef POLLIN #define POLLIN 1 #endif #ifndef POLLPRI #define POLLPRI 2 #endif #ifndef POLLOUT #define POLLOUT 4 #endif #ifndef _PC_CHOWN_RESTRICTED #define _PC_CHOWN_RESTRICTED 6 #endif #ifndef _PC_LINK_MAX #define _PC_LINK_MAX 0 #endif #ifndef _PC_MAX_CANON #define _PC_MAX_CANON 1 #endif #ifndef _PC_MAX_INPUT #define _PC_MAX_INPUT 2 #endif #ifndef _PC_NAME_MAX #define _PC_NAME_MAX 3 #endif #ifndef _PC_NO_TRUNC #define _PC_NO_TRUNC 7 #endif #ifndef _PC_PATH_MAX #define _PC_PATH_MAX 4 #endif #ifndef _PC_PIPE_BUF #define _PC_PIPE_BUF 5 #endif #ifndef _PC_VDISABLE #define _PC_VDISABLE 8 #endif #ifndef F_DUPFD #define F_DUPFD 0 #endif #ifndef F_GETFD #define F_GETFD 1 #endif #ifndef F_SETFD #define F_SETFD 2 #endif #ifndef F_GETFL #define F_GETFL 3 #endif #ifndef F_SETFL #define F_SETFL 4 #endif #ifndef F_GETOWN #define F_GETOWN 5 #endif #ifndef F_SETOWN #define F_SETOWN 6 #endif #ifndef F_GETLK #define F_GETLK 7 #endif #ifndef F_SETLK #define F_SETLK 8 #endif #ifndef F_RDLCK #define F_RDLCK 1 #endif #ifndef F_WRLCK #define F_WRLCK 2 #endif #ifndef F_UNLCK #define F_UNLCK 3 #endif #ifndef F_SETLKW #define F_SETLKW 9 #endif #ifndef FD_CLOEXEC #define FD_CLOEXEC 1 #endif #ifndef SHUT_RD #define SHUT_RD SD_RECEIVE #endif #ifndef SHUT_WR #define SHUT_WR SD_SEND #endif #ifndef SHUT_RDWR #define SHUT_RDWR SD_BOTH #endif /* ------------------------------------------------- */ /* Date */ /* ------------------------------------------------- */ /* MinGW provides gettimeofday in -lmingwex, which we don't link. * In order to avoid a name conflict, we use a different name. */ struct MLton_timezone { int unused; }; #undef timezone #define timezone MLton_timezone MLTON_WRAPPER int MLton_gettimeofday (struct timeval *tv, struct timezone *tz); #undef gettimeofday #define gettimeofday MLton_gettimeofday /* ------------------------------------------------- */ /* MLton.Itimer */ /* ------------------------------------------------- */ #ifndef ITIMER_REAL #define ITIMER_REAL 0 /*generates sigalrm */ #endif #ifndef ITIMER_VIRTUAL #define ITIMER_VIRTUAL 1 /*generates sigvtalrm */ #endif #ifndef ITIMER_VIRT #define ITIMER_VIRT 1 /*generates sigvtalrm */ #endif #ifndef ITIMER_PROF #define ITIMER_PROF 2 /*generates sigprof */ #endif struct MLton_itimerval { struct timeval it_interval; struct timeval it_value; }; #undef itimerval #define itimerval MLton_itimerval MLTON_WRAPPER int MLton_setitimer (int which, const struct itimerval *value, struct itimerval *ovalue); #undef setitimer #define setitimer MLton_setitimer /* ------------------------------------------------- */ /* MLton.Rlimit */ /* ------------------------------------------------- */ #ifndef RLIMIT_CPU #define RLIMIT_CPU 0 /* CPU time in seconds */ #endif #ifndef RLIMIT_FSIZE #define RLIMIT_FSIZE 1 /* Maximum filesize */ #endif #ifndef RLIMIT_DATA #define RLIMIT_DATA 2 /* max data size */ #endif #ifndef RLIMIT_STACK #define RLIMIT_STACK 3 /* max stack size */ #endif #ifndef RLIMIT_CORE #define RLIMIT_CORE 4 /* max core file size */ #endif #ifndef RLIMIT_NOFILE #define RLIMIT_NOFILE 5 /* max number of open files */ #endif #ifndef RLIMIT_OFILE #define RLIMIT_OFILE RLIMIT_NOFILE /* BSD name */ #endif #ifndef RLIMIT_AS #define RLIMIT_AS 6 /* address space (virt. memory) limit */ #endif #define RLIMIT_NLIMITS 7 /* upper bound of RLIMIT_* defines */ #define RLIM_NLIMITS RLIMIT_NLIMITS #ifndef RLIM_INFINITY #define RLIM_INFINITY (0xffffffffUL) #endif #ifndef RLIM_SAVED_MAX #define RLIM_SAVED_MAX RLIM_INFINITY #endif #ifndef RLIM_SAVED_CUR #define RLIM_SAVED_CUR RLIM_INFINITY #endif typedef unsigned long MLton_rlim_t; #undef rlim_t #define rlim_t MLton_rlim_t struct MLton_rlimit { rlim_t rlim_cur; rlim_t rlim_max; }; #undef rlimit #define rlimit MLton_rlimit MLTON_WRAPPER int MLton_getrlimit (int resource, struct rlimit *rlim); MLTON_WRAPPER int MLton_setrlimit (int resource, const struct rlimit *rlim); #undef getrlimit #undef setrlimit #define getrlimit MLton_getrlimit #define setrlimit MLton_setrlimit /* ------------------------------------------------- */ /* MLton.Rusage */ /* ------------------------------------------------- */ #ifndef RUSAGE_SELF #define RUSAGE_SELF 0 /* calling process */ #endif #ifndef RUSAGE_CHILDREN #define RUSAGE_CHILDREN -1 /* terminated child processes */ #endif struct MLton_rusage { struct timeval ru_utime; struct timeval ru_stime; }; #undef rusage #define rusage MLton_rusage MLTON_WRAPPER int MLton_getrusage (int who, struct rusage *usage); #undef getrusage #define getrusage MLton_getrusage /* ------------------------------------------------- */ /* OS.IO */ /* ------------------------------------------------- */ struct MLton_pollfd { short events; int fd; short revents; }; #undef pollfd #define pollfd MLton_pollfd MLTON_WRAPPER int MLton_poll (struct pollfd *ufds, nfds_t nfds, int timeout); #undef poll #define poll MLton_poll /* ------------------------------------------------- */ /* Posix.Error */ /* ------------------------------------------------- */ /* We cannot yet replace strerror at the time util.c is built */ #ifndef MLTON_UTIL MLTON_WRAPPER char *MLton_strerror(int code); #undef strerror #define strerror MLton_strerror #endif /* If MinGW doesn't (currently) define an error status we need, but winsock * does, then default to using the winsock status. They will not conflict. */ #ifndef EINTR #define EINTR WSAEINTR #endif #ifndef EBADF #define EBADF WSAEBADF #endif #ifndef EACCES #define EACCES WSAEACCES #endif #ifndef EFAULT #define EFAULT WSAEFAULT #endif #ifndef EINVAL #define EINVAL WSAEINVAL #endif #ifndef EMFILE #define EMFILE WSAEMFILE #endif #ifndef EAGAIN #define EAGAIN WSAEWOULDBLOCK #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK EAGAIN #endif #ifndef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #endif #ifndef EALREADY #define EALREADY WSAEALREADY #endif #ifndef ENOTSOCK #define ENOTSOCK WSAENOTSOCK #endif #ifndef EDESTADDRREQ #define EDESTADDRREQ WSAEDESTADDRREQ #endif #ifndef EMSGSIZE #define EMSGSIZE WSAEMSGSIZE #endif #ifndef EPROTOTYPE #define EPROTOTYPE WSAEPROTOTYPE #endif #ifndef ENOPROTOOPT #define ENOPROTOOPT WSAENOPROTOOPT #endif #ifndef EPROTONOSUPPORT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #endif #ifndef ESOCKTNOSUPPORT #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #endif #ifndef EOPNOTSUPP #define EOPNOTSUPP WSAEOPNOTSUPP #endif #ifndef EPFNOSUPPORT #define EPFNOSUPPORT WSAEPFNOSUPPORT #endif #ifndef EAFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #ifndef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #endif #ifndef EADDRNOTAVAIL #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #endif #ifndef ENETDOWN #define ENETDOWN WSAENETDOWN #endif #ifndef ENETUNREACH #define ENETUNREACH WSAENETUNREACH #endif #ifndef ENETRESET #define ENETRESET WSAENETRESET #endif #ifndef ECONNABORTED #define ECONNABORTED WSAECONNABORTED #endif #ifndef ECONNRESET #define ECONNRESET WSAECONNRESET #endif #ifndef ENOBUFS #define ENOBUFS WSAENOBUFS #endif #ifndef EISCONN #define EISCONN WSAEISCONN #endif #ifndef ENOTCONN #define ENOTCONN WSAENOTCONN #endif #ifndef ESHUTDOWN #define ESHUTDOWN WSAESHUTDOWN #endif #ifndef ETIMEDOUT #define ETIMEDOUT WSAETIMEDOUT #endif #ifndef ECONNREFUSED #define ECONNREFUSED WSAECONNREFUSED #endif #ifndef ELOOP #define ELOOP WSAELOOP #endif #ifndef ENAMETOOLONG #define ENAMETOOLONG WSAENAMETOOLONG #endif #ifndef EHOSTDOWN #define EHOSTDOWN WSAEHOSTDOWN #endif #ifndef EHOSTUNREACH #define EHOSTUNREACH WSAEHOSTUNREACH #endif #ifndef ENOTEMPTY #define ENOTEMPTY WSAENOTEMPTY #endif #ifndef EDQUOT #define EDQUOT WSAEDQUOT #endif #ifndef ESTALE #define ESTALE WSAESTALE #endif #ifndef ERMOTE #define EREMOTE WSAEREMOTE #endif /* Questionable fall backs: */ #ifndef EUSERS #define EUSERS WSAEUSERS #endif #ifndef ECANCELED #define ECANCELED WSAECANCELLED #endif #ifndef EBADMSG #define EBADMSG 77 #endif /* ------------------------------------------------- */ /* Posix.FileSys */ /* ------------------------------------------------- */ #ifndef S_IRGRP #define S_IRGRP 0000040 #endif #ifndef S_IROTH #define S_IROTH 0000004 #endif #ifndef S_IRWXG #define S_IRWXG 0000070 #endif #ifndef S_IRWXO #define S_IRWXO 0000007 #endif #ifndef S_ISGID #define S_ISGID 0002000 #endif #ifndef S_ISUID #define S_ISUID 0004000 #endif #ifndef S_IWGRP #define S_IWGRP 0000020 #endif #ifndef S_IWOTH #define S_IWOTH 0000002 #endif #ifndef S_IXGRP #define S_IXGRP 0000010 #endif #ifndef S_IXOTH #define S_IXOTH 0000001 #endif // Do not exist in a windows filesystem #ifndef S_IFLNK #define S_IFLNK 0 #endif #ifndef S_IFSOCK #define S_IFSOCK 0 #endif #ifndef S_ISVTX #define S_ISVTX 0 #endif #ifndef O_NOCTTY #define O_NOCTTY 0x8000 #endif #ifndef O_NONBLOCK #define O_NONBLOCK 0x4000 #endif // Synchronized writes? Safety of any kind? ... and windows?! hell no! #ifndef O_SYNC #define O_SYNC 0 #endif // Use m to silence unused warnings #undef S_ISLNK #undef S_ISSOCK #define S_ISLNK(m) (m?FALSE:FALSE) #define S_ISSOCK(m) (m?FALSE:FALSE) #ifndef O_ACCMODE #define O_ACCMODE O_RDONLY|O_WRONLY|O_RDWR #endif MLTON_WRAPPER int MLton_chown (const char *path, uid_t owner, gid_t group); MLTON_WRAPPER int MLton_fchmod (int filedes, mode_t mode); MLTON_WRAPPER int MLton_fchdir (int filedes); MLTON_WRAPPER int MLton_fchown (int fd, uid_t owner, gid_t group); MLTON_WRAPPER long MLton_fpathconf (int filedes, int name); MLTON_WRAPPER int MLton_link (const char *oldpath, const char *newpath); MLTON_WRAPPER int MLton_lstat (const char *file_name, struct stat *buf); MLTON_WRAPPER int MLton_mkfifo (const char *pathname, mode_t mode); MLTON_WRAPPER long MLton_pathconf (const char *path, int name); MLTON_WRAPPER int MLton_readlink (const char *path, char *buf, size_t bufsiz); MLTON_WRAPPER int MLton_symlink (const char *oldpath, const char *newpath); MLTON_WRAPPER int MLton_truncate (const char *path, off_t len); #undef chown #undef fchmod #undef fchdir #undef fchown #undef fpathconf #undef link #undef lstat #undef mkfifo #undef pathconf #undef readlink #undef symlink #undef truncate #define chown MLton_chown #define fchmod MLton_fchmod #define fchdir MLton_fchdir #define fchown MLton_fchown #define fpathconf MLton_fpathconf #define link MLton_link #define lstat MLton_lstat #define mkfifo MLton_mkfifo #define pathconf MLton_pathconf #define readlink MLton_readlink #define symlink MLton_symlink #define truncate MLton_truncate #undef mkdir #define mkdir(f, m) mkdir(f); chmod(f, m) /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ struct MLton_flock { off_t l_len; pid_t l_pid; off_t l_start; short l_type; short l_whence; }; #undef flock #define flock MLton_flock MLTON_WRAPPER int MLton_fcntl (int fd, int cmd, ...); MLTON_WRAPPER int MLton_fsync (int fd); MLTON_WRAPPER int MLton_pipe (int filedes[2]); #undef fcntl #undef fsync #undef pipe #define fcntl MLton_fcntl #define fsync MLton_fsync #define pipe MLton_pipe /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ #ifndef _SC_ARG_MAX #define _SC_ARG_MAX 0 #endif #ifndef _SC_CHILD_MAX #define _SC_CHILD_MAX 1 #endif #ifndef _SC_CLK_TCK #define _SC_CLK_TCK 2 #endif #ifndef _SC_JOB_CONTROL #define _SC_JOB_CONTROL 5 #endif #ifndef _SC_NGROUPS_MAX #define _SC_NGROUPS_MAX 3 #endif #ifndef _SC_OPEN_MAX #define _SC_OPEN_MAX 4 #endif #ifndef _SC_SAVED_IDS #define _SC_SAVED_IDS 6 #endif #ifndef _SC_VERSION #define _SC_VERSION 7 #endif struct MLton_tms { int tms_utime; int tms_stime; int tms_cutime; int tms_cstime; }; struct MLton_utsname { char machine[20]; char nodename[256]; char release[20]; char sysname[30]; char version[20]; }; #undef tms #undef utsname #define tms MLton_tms #define utsname MLton_utsname MLTON_WRAPPER char *MLton_getlogin (void); MLTON_WRAPPER char *MLton_ctermid (char *s); MLTON_WRAPPER gid_t MLton_getegid (void); MLTON_WRAPPER uid_t MLton_geteuid (void); MLTON_WRAPPER gid_t MLton_getgid (void); MLTON_WRAPPER int MLton_getgroups (int size, gid_t list[]); MLTON_WRAPPER pid_t MLton_getpgid(pid_t pid); MLTON_WRAPPER pid_t MLton_getpgrp(void); MLTON_WRAPPER pid_t MLton_getppid (void); MLTON_WRAPPER uid_t MLton_getuid (void); MLTON_WRAPPER int MLton_setenv (const char *name, const char *value, int overwrite); MLTON_WRAPPER int MLton_setgid (gid_t gid); MLTON_WRAPPER int MLton_setgroups (size_t size, const gid_t *list); MLTON_WRAPPER int MLton_setpgid (pid_t pid, pid_t pgid); MLTON_WRAPPER pid_t MLton_setsid (void); MLTON_WRAPPER int MLton_setuid (uid_t uid); MLTON_WRAPPER long MLton_sysconf (int name); MLTON_WRAPPER clock_t MLton_times (struct tms *buf); MLTON_WRAPPER char *MLton_ttyname (int desc); MLTON_WRAPPER int MLton_uname (struct utsname *buf); #undef getlogin #undef ctermid #undef getegid #undef geteuid #undef getgid #undef getgroups #undef getpgid #undef getpgrp #undef getppid #undef getuid #undef setenv #undef setgid #undef setgroups #undef setpgid #undef setsid #undef setuid #undef sysconf #undef times #undef ttyname #undef uname #define getlogin MLton_getlogin #define ctermid MLton_ctermid #define getegid MLton_getegid #define geteuid MLton_geteuid #define getgid MLton_getgid #define getgroups MLton_getgroups #define getpgid MLton_getpgid #define getpgrp MLton_getpgrp #define getppid MLton_getppid #define getuid MLton_getuid #define setenv MLton_setenv #define setgid MLton_setgid #define setgroups MLton_setgroups #define setpgid MLton_setpgid #define setsid MLton_setsid #define setuid MLton_setuid #define sysconf MLton_sysconf #define times MLton_times #define ttyname MLton_ttyname #define uname MLton_uname /* ------------------------------------------------- */ /* Posix.Process */ /* ------------------------------------------------- */ #define EXECVE(path, args, env) \ execve (path, (const char* const*)args, (const char* const*)env) #define EXECVP(file, args) execvp (file, (const char* const*) args) #define SPAWN_MODE _P_NOWAIT /* Windows exit status comes from: * 1. ExitProcess (used by return from main and exit) * 2. TerminateProcess (used by a remote process to 'kill') * * Windows does NOT differentiate between these two cases. * The waitpid API expects us to be able to tell the difference, * so we will emulate this difference by setting high 31st bit * whenever we 'kill' a process. */ #ifndef WNOHANG #define WNOHANG 1 #endif #ifndef WUNTRACED #define WUNTRACED 2 #endif #define SIGNALLED_BIT 0x80000000UL #ifndef WIFEXITED #define WIFEXITED(w) (((w) & SIGNALLED_BIT) == 0) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(w) (((w) & SIGNALLED_BIT) != 0) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(w) 0 #endif #ifndef WEXITSTATUS #define WEXITSTATUS(w) ((w) & 0xff) #endif #ifndef WTERMSIG #define WTERMSIG(w) ((w) & 0xff) #endif #ifndef WSTOPSIG #define WSTOPSIG WEXITSTATUS #endif /* Sometimes defined by mingw */ #if !defined(TIMESPEC_DEFINED) && !defined(_TIMESPEC_DEFINED) struct timespec { time_t tv_sec; long tv_nsec; }; #endif MLTON_WRAPPER int MLton_alarm(int); MLTON_WRAPPER int MLton_fork(void); /* mingw demands this return int */ MLTON_WRAPPER int MLton_kill (pid_t pid, int sig); MLTON_WRAPPER int MLton_pause (void); MLTON_WRAPPER int MLton_nanosleep (const struct timespec *req, struct timespec *rem); MLTON_WRAPPER unsigned int MLton_sleep (unsigned int seconds); MLTON_WRAPPER pid_t MLton_wait (int *status); MLTON_WRAPPER pid_t MLton_waitpid (pid_t pid, int *status, int options); #undef alarm #undef fork #undef kill #undef pause #undef nanosleep #undef sleep #undef wait #undef waitpid #define alarm MLton_alarm #define fork MLton_fork #define kill MLton_kill #define pause MLton_pause #define nanosleep MLton_nanosleep #define sleep MLton_sleep #define wait MLton_wait #define waitpid MLton_waitpid /* ------------------------------------------------- */ /* Posix.Signal */ /* ------------------------------------------------- */ /* Sometimes mingw defines some of these. Some not. Some always. */ #ifndef SIG_BLOCK #define SIG_BLOCK 1 #endif #ifndef SIG_SETMASK #define SIG_SETMASK 0 #endif #ifndef SIG_UNBLOCK #define SIG_UNBLOCK 2 #endif #ifndef SIGHUP #define SIGHUP 1 #endif /* SIGINT = 2 */ #ifndef SIGQUIT #define SIGQUIT 3 #endif /* SIGILL = 4 */ /* SIGTRAP = 5 (unused) */ /* SIGIOT = 6 (unused) */ /* SIGABRT = 6 (unused) */ /* SIGEMT = 7 (unused) */ /* SIGFPE = 8 */ #ifndef SIGKILL #define SIGKILL 9 #endif #ifndef SIGBUS #define SIGBUS 10 #endif /* SIGSEGV = 11 */ /* SIGSYS = 12 (unused) */ #ifndef SIGPIPE #define SIGPIPE 13 #endif #ifndef SIGALRM #define SIGALRM 14 #endif /* SIGTERM = 15 */ /* SIGBREAK = 21 */ /* SIGABRT2 = 22 */ /* These signals are fake. They do not exist on windows. */ #ifndef SIGSTOP #define SIGSTOP 16 #endif #ifndef SIGTSTP #define SIGTSTP 18 #endif #ifndef SIGCHLD #define SIGCHLD 23 #endif #ifndef SIGTTIN #define SIGTTIN 24 #endif #ifndef SIGTTOU #define SIGTTOU 25 #endif #ifndef SIGCONT #define SIGCONT 26 #endif #ifndef SIGUSR1 #define SIGUSR1 27 #endif #ifndef SIGUSR2 #define SIGUSR2 28 #endif #ifndef SIGVTALRM #define SIGVTALRM 29 /* virtual time alarm */ #endif #ifndef SIGPROF #define SIGPROF 30 /* profiling time alarm */ #endif /* We have extended the number of signals ... */ #ifdef NSIG #undef NSIG #endif #define NSIG 32 typedef __p_sig_fn_t MLton__sig_func_ptr; typedef int MLton_sigset_t; #undef _sig_func_ptr #undef sigset_t #define _sig_func_ptr MLton__sig_func_ptr #define sigset_t MLton_sigset_t struct MLton_sigaction { int sa_flags; sigset_t sa_mask; _sig_func_ptr sa_handler; }; #undef sigaction #define sigaction MLton_sigaction #ifndef SIGTOMASK #define SIGTOMASK(sn) (1 << ((sn)-1)) #endif MLTON_WRAPPER int MLton_sigaction (int signum, const struct sigaction *act, struct sigaction *oldact); MLTON_WRAPPER int MLton_sigaddset (sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigdelset (sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigemptyset (sigset_t *set); MLTON_WRAPPER int MLton_sigfillset (sigset_t *set); MLTON_WRAPPER int MLton_sigismember (const sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigpending (sigset_t *set); MLTON_WRAPPER int MLton_sigprocmask (int how, const sigset_t *set, sigset_t *oldset); MLTON_WRAPPER int MLton_sigsuspend (const sigset_t *mask); #undef sigaction #undef sigaddset #undef sigdelset #undef sigemptyset #undef sigfillset #undef sigismember #undef sigpending #undef sigprocmask #undef sigsuspend #define sigaction MLton_sigaction #define sigaddset MLton_sigaddset #define sigdelset MLton_sigdelset #define sigemptyset MLton_sigemptyset #define sigfillset MLton_sigfillset #define sigismember MLton_sigismember #define sigpending MLton_sigpending #define sigprocmask MLton_sigprocmask #define sigsuspend MLton_sigsuspend /* ------------------------------------------------- */ /* Posix.SysDB.Passwd */ /* ------------------------------------------------- */ struct MLton_group { gid_t gr_gid; char **gr_mem; char *gr_name; char *gr_passwd; }; struct MLton_passwd { char *pw_dir; gid_t pw_gid; char *pw_name; char *pw_shell; uid_t pw_uid; }; #undef group #undef passwd #define group MLton_group #define passwd MLton_passwd MLTON_WRAPPER struct group *MLton_getgrgid (gid_t gid); MLTON_WRAPPER struct group *MLton_getgrnam (const char *name); MLTON_WRAPPER struct passwd *MLton_getpwnam (const char *name); MLTON_WRAPPER struct passwd *MLton_getpwuid (uid_t uid); #undef getgrgid #undef getgrnam #undef getpwnam #undef getpwuid #define getgrgid MLton_getgrgid #define getgrnam MLton_getgrnam #define getpwnam MLton_getpwnam #define getpwuid MLton_getpwuid /* ------------------------------------------------- */ /* Posix.TTY */ /* ------------------------------------------------- */ #ifndef B0 #define B0 0x00000 #endif #ifndef B50 #define B50 0x00001 #endif #ifndef B75 #define B75 0x00002 #endif #ifndef B110 #define B110 0x00003 #endif #ifndef B134 #define B134 0x00004 #endif #ifndef B150 #define B150 0x00005 #endif #ifndef B200 #define B200 0x00006 #endif #ifndef B300 #define B300 0x00007 #endif #ifndef B600 #define B600 0x00008 #endif #ifndef B1200 #define B1200 0x00009 #endif #ifndef B1800 #define B1800 0x0000a #endif #ifndef B2400 #define B2400 0x0000b #endif #ifndef B4800 #define B4800 0x0000c #endif #ifndef B9600 #define B9600 0x0000d #endif #ifndef B19200 #define B19200 0x0000e #endif #ifndef B38400 #define B38400 0x0000f #endif #ifndef VEOL #define VEOL 2 #endif #ifndef VEOL2 #define VEOL2 3 #endif #ifndef VEOF #define VEOF 4 #endif #ifndef VERASE #define VERASE 5 #endif #ifndef VINTER #define VINTR 6 #endif #ifndef VKILL #define VKILL 7 #endif #ifndef VLNEXT #define VLNEXT 8 #endif #ifndef VMIN #define VMIN 9 #endif #ifndef VQUIT #define VQUIT 10 #endif #ifndef VREPRINT #define VREPRINT 11 #endif #ifndef VSTART #define VSTART 12 #endif #ifndef VSTOP #define VSTOP 13 #endif #ifndef VSUSP #define VSUSP 14 #endif #ifndef VSWTC #define VSWTC 15 #endif #ifndef VTIME #define VTIME 16 #endif #ifndef VWERASE #define VWERASE 17 #endif #ifndef NCCS #define NCCS 18 #endif #ifndef IGNBRK #define IGNBRK 0x00001 #endif #ifndef BRKINT #define BRKINT 0x00002 #endif #ifndef IGNPAR #define IGNPAR 0x00004 #endif #ifndef IMAXBEL #define IMAXBEL 0x00008 #endif #ifndef INPCK #define INPCK 0x00010 #endif #ifndef ISTRIP #define ISTRIP 0x00020 #endif #ifndef INLCR #define INLCR 0x00040 #endif #ifndef IGNCR #define IGNCR 0x00080 #endif #ifndef ICRNL #define ICRNL 0x00100 #endif #ifndef IXON #define IXON 0x00400 #endif #ifndef IXOFF #define IXOFF 0x01000 #endif #ifndef IUCLC #define IUCLC 0x04000 #endif #ifndef IXANY #define IXANY 0x08000 #endif #ifndef PARMRK #define PARMRK 0x10000 #endif #ifndef OPOST #define OPOST 0x00001 #endif #ifndef CSIZE #define CSIZE 0x00030 #endif #ifndef CS5 #define CS5 0x00000 #endif #ifndef CS6 #define CS6 0x00010 #endif #ifndef CS7 #define CS7 0x00020 #endif #ifndef CS8 #define CS8 0x00030 #endif #ifndef CSTOPB #define CSTOPB 0x00040 #endif #ifndef CREAD #define CREAD 0x00080 #endif #ifndef PARENB #define PARENB 0x00100 #endif #ifndef PARODD #define PARODD 0x00200 #endif #ifndef HPUCL #define HUPCL 0x00400 #endif #ifndef CLOCAL #define CLOCAL 0x00800 #endif #ifndef CBAUDEX #define CBAUDEX 0x0100f #endif #ifndef B57600 #define B57600 0x01001 #endif #ifndef B115200 #define B115200 0x01002 #endif #ifndef B128000 #define B128000 0x01003 #endif #ifndef B230400 #define B230400 0x01004 #endif #ifndef B256000 #define B256000 0x01005 #endif #ifndef CRTSXOFF #define CRTSXOFF 0x04000 #endif #ifndef CRTSCTS #define CRTSCTS 0x08000 #endif #ifndef ISIG #define ISIG 0x0001 #endif #ifndef ICANON #define ICANON 0x0002 #endif #ifndef ECHO #define ECHO 0x0004 #endif #ifndef ECHOE #define ECHOE 0x0008 #endif #ifndef ECHOK #define ECHOK 0x0010 #endif #ifndef ECHONL #define ECHONL 0x0020 #endif #ifndef NOFLSH #define NOFLSH 0x0040 #endif #ifndef TOSTOP #define TOSTOP 0x0080 #endif #ifndef IEXTEN #define IEXTEN 0x0100 #endif #ifndef FLUSHO #define FLUSHO 0x0200 #endif #ifndef ECHOKE #define ECHOKE 0x0400 #endif #ifndef ECHOCTL #define ECHOCTL 0x0800 #endif #ifndef TCOOFF #define TCOOFF 0 #endif #ifndef TCOON #define TCOON 1 #endif #ifndef TCIOFF #define TCIOFF 2 #endif #ifndef TCION #define TCION 3 #endif #ifndef TCIFLUSH #define TCIFLUSH 0 #endif #ifndef TCOFLUSH #define TCOFLUSH 1 #endif #ifndef TCIOFLUSH #define TCIOFLUSH 2 #endif #ifndef TCFLSH #define TCFLSH 3 #endif #ifndef TCSAFLUSH #define TCSAFLUSH 1 #endif #ifndef TCSANOW #define TCSANOW 2 #endif #ifndef TCSADRAIN #define TCSADRAIN 3 #endif #ifndef TCSADFLUSH #define TCSADFLUSH 4 #endif typedef unsigned char MLton_cc_t; typedef unsigned int MLton_speed_t; typedef unsigned int MLton_tcflag_t; #undef cc_t #undef speed_t #undef tcflag_t #define cc_t MLton_cc_t #define speed_t MLton_speed_t #define tcflag_t MLton_tcflag_t struct MLton_termios { cc_t c_cc[NCCS]; tcflag_t c_cflag; tcflag_t c_iflag; tcflag_t c_lflag; tcflag_t c_oflag; }; #undef termios #define termios MLton_termios MLTON_WRAPPER speed_t MLton_cfgetispeed (struct termios *termios_p); MLTON_WRAPPER speed_t MLton_cfgetospeed (struct termios *termios_p); MLTON_WRAPPER int MLton_cfsetispeed (struct termios *termios_p, speed_t speed); MLTON_WRAPPER int MLton_cfsetospeed (struct termios *termios_p, speed_t speed); MLTON_WRAPPER int MLton_tcdrain (int fd); MLTON_WRAPPER int MLton_tcflow (int fd, int action); MLTON_WRAPPER int MLton_tcflush (int fd, int queue_selector); MLTON_WRAPPER int MLton_tcgetattr (int fd, struct termios *termios_p); MLTON_WRAPPER pid_t MLton_tcgetpgrp (int fd); MLTON_WRAPPER int MLton_tcsendbreak (int fd, int duration); MLTON_WRAPPER int MLton_tcsetattr (int fd, int optional_actions, struct termios *termios_p); MLTON_WRAPPER int MLton_tcsetpgrp (int fd, pid_t pgrpid); #undef cfgetispeed #undef cfgetospeed #undef cfsetispeed #undef cfsetospeed #undef tcdrain #undef tcflow #undef tcflush #undef tcgetattr #undef tcgetpgrp #undef tcsendbreak #undef tcsetattr #undef tcsetpgrp #define cfgetispeed MLton_cfgetispeed #define cfgetospeed MLton_cfgetospeed #define cfsetispeed MLton_cfsetispeed #define cfsetospeed MLton_cfsetospeed #define tcdrain MLton_tcdrain #define tcflow MLton_tcflow #define tcflush MLton_tcflush #define tcgetattr MLton_tcgetattr #define tcgetpgrp MLton_tcgetpgrp #define tcsendbreak MLton_tcsendbreak #define tcsetattr MLton_tcsetattr #define tcsetpgrp MLton_tcsetpgrp /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ // Unimplemented on windows: #ifndef MSG_WAITALL #define MSG_WAITALL 0x8 #endif #ifndef MSG_DONTWAIT #define MSG_DONTWAIT 0x1000000 #endif #ifndef MSG_EOR #define MSG_EOR 0 #endif #ifndef MSG_CTRUNC #define MSG_CTRUNC 0 #endif #ifndef MSG_TRUNC #define MSG_TRUNC MSG_PARTIAL #endif #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 #endif typedef unsigned short MLton_sa_family_t; #undef sa_family_t #define sa_family_t MLton_sa_family_t struct MLton_sockaddr_un { sa_family_t sun_family; char sun_path[UNIX_PATH_MAX]; }; #undef sockaddr_un #define sockaddr_un MLton_sockaddr_un MLTON_WRAPPER int MLton_ioctl (int d, int request, ...); MLTON_WRAPPER int MLton_socketpair (int d, int type, int protocol, int sv[2]); #undef ioctl #undef socketpair #define ioctl MLton_ioctl #define socketpair MLton_socketpair /* ------------------------------------------------- */ /* Syslog */ /* ------------------------------------------------- */ #ifndef LOG_EMERG #define LOG_EMERG 7 #endif #ifndef LOG_ALERT #define LOG_ALERT 6 #endif #ifndef LOG_CRIT #define LOG_CRIT 5 #endif #ifndef LOG_ERR #define LOG_ERR 4 #endif #ifndef LOG_WARNING #define LOG_WARNING 3 #endif #ifndef LOG_NOTICE #define LOG_NOTICE 2 #endif #ifndef LOG_INFO #define LOG_INFO 1 #endif #ifndef LOG_DEBUG #define LOG_DEBUG 0 #endif #ifndef LOG_PID #define LOG_PID 0x01 /* include PID in output */ #endif #ifndef LOG_CONS #define LOG_CONS 0x02 /* dump to console (meaningless for windows?) */ #endif #ifndef LOG_ODELAY #define LOG_ODELAY 0x04 /* delay open; meaningless---always open */ #endif #ifndef LOG_NDELAY #define LOG_NDELAY 0x08 /* don't delay; meaningless */ #endif #ifndef LOG_NOWAIT #define LOG_NOWAIT 0x10 /* ignored and obsolete anyways */ #endif #ifndef LOG_PERROR #define LOG_PERROR 0x20 /* print to standard error, honoured */ #endif #ifndef LOG_AUTH #define LOG_AUTH 1 #endif #ifndef LOG_CRON #define LOG_CRON 2 #endif #ifndef LOG_DAEMON #define LOG_DAEMON 3 #endif #ifndef LOG_KERN #define LOG_KERN 4 #endif #ifndef LOG_LOCAL0 #define LOG_LOCAL0 5 #endif #ifndef LOG_LOCAL1 #define LOG_LOCAL1 6 #endif #ifndef LOG_LOCAL2 #define LOG_LOCAL2 7 #endif #ifndef LOG_LOCAL3 #define LOG_LOCAL3 8 #endif #ifndef LOG_LOCAL4 #define LOG_LOCAL4 9 #endif #ifndef LOG_LOCAL5 #define LOG_LOCAL5 10 #endif #ifndef LOG_LOCAL6 #define LOG_LOCAL6 11 #endif #ifndef LOG_LOCAL7 #define LOG_LOCAL7 12 #endif #ifndef LOG_LPR #define LOG_LPR 13 #endif #ifndef LOG_MAIL #define LOG_MAIL 14 #endif #ifndef LOG_NEWS #define LOG_NEWS 15 #endif #ifndef LOG_SYSLOG #define LOG_SYSLOG 16 #endif #ifndef LOG_USER #define LOG_USER 17 #endif #ifndef LOG_UUCP #define LOG_UUCP 18 #endif MLTON_WRAPPER void MLton_openlog(const char* ident, int logopt, int facility); MLTON_WRAPPER void MLton_closelog(void); MLTON_WRAPPER void MLton_syslog(int priority, const char* fmt, const char* msg); #undef openlog #undef closelog #undef syslog #define openlog MLton_openlog #define closelog MLton_closelog #define syslog MLton_syslog mlton-20210117+dfsg/runtime/platform/mips.h000066400000000000000000000000501416264345000204510ustar00rootroot00000000000000#define MLton_Platform_Arch_host "mips" mlton-20210117+dfsg/runtime/platform/mmap-protect.c000066400000000000000000000021501416264345000221070ustar00rootroot00000000000000void *GC_mmapAnonFlags_safe_protect (void *start, size_t length, int prot, int flags, size_t dead_low, size_t dead_high) { void *base,*low,*result,*high; size_t totlen; totlen = length + dead_low + dead_high; base = GC_mmapAnonFlags_safe (start, totlen, flags); low = base; if (mprotect (low, dead_low, PROT_NONE)) diee ("mprotect failed"); result = (void*)((pointer)low + dead_low); if (mprotect (result, length, prot)) diee ("mprotect failed"); high = (void*)((pointer)result + length); if (mprotect (high, dead_high, PROT_NONE)) diee ("mprotect failed"); return result; } void *GC_mmapAnon_safe_protect (void *start, size_t length, int prot, size_t dead_low, size_t dead_high) { return GC_mmapAnonFlags_safe_protect (start, length, prot, 0, dead_low, dead_high); } mlton-20210117+dfsg/runtime/platform/mmap.c000066400000000000000000000010241416264345000204300ustar00rootroot00000000000000static inline void *mmapAnonFlags (void *start, size_t length, int flags) { return mmap (start, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | flags, -1, 0); } static inline void *mmapAnon (void *start, size_t length) { return mmapAnonFlags (start, length, 0); } static void munmap_safe (void *base, size_t length) { assert (base != NULL); if (0 == length) return; if (0 != munmap (base, length)) diee ("munmap failed"); } mlton-20210117+dfsg/runtime/platform/mremap.c000066400000000000000000000104551416264345000207670ustar00rootroot00000000000000#define GC_SMALLEST_PAGESIZE 4096 /* #define DEBUG_MREMAP 1 */ /* Used to allocate at the head and tail of an existing allocation */ static void *GC_extendHead (void *base, size_t length); static void *GC_extendTail (void *base, size_t length); void *GC_mremap (void *base, size_t oldLength, size_t newLength) { static void* cacheAddress = 0; static size_t cacheOldLength = 0; static size_t cacheNewLength = 0; static size_t cacheTailSize; static size_t cacheHeadSize; void* tail; void* head; void* alloc; size_t growth, bsLow, bsHigh, bsTry; #ifdef DEBUG_MREMAP fprintf(stderr, "remap(%08X, %d, %d)\n", (size_t)base, oldLength, newLength); fflush(stderr); #endif if (newLength == oldLength) return base; if (newLength < oldLength) { GC_release((char*)base + newLength, oldLength-newLength); return base; } growth = newLength-oldLength; if (cacheAddress == base && cacheOldLength == oldLength && cacheNewLength > newLength) /* cache only during backoff */ goto GC_mremap_cached; /* Start probing for the available tail length */ bsLow = 0; bsHigh = (growth+GC_SMALLEST_PAGESIZE-1)/GC_SMALLEST_PAGESIZE; /* Round bsHigh to a power of two -> allocation works with all page sizes */ for (bsTry = 1; bsTry <= bsHigh; bsTry += bsTry) { } bsHigh = bsTry; while (bsHigh - bsLow > 1) { bsTry = (bsHigh + bsLow)/2; tail = (char*)base + oldLength; alloc = GC_extendTail(tail, bsTry*GC_SMALLEST_PAGESIZE); if (tail == alloc) { GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsLow = bsTry; } else { if (alloc != (void*)-1) GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsHigh = bsTry; } } cacheTailSize = bsLow*GC_SMALLEST_PAGESIZE; /* Start probing for the available head length */ bsLow = 0; bsHigh = (growth+GC_SMALLEST_PAGESIZE-1)/GC_SMALLEST_PAGESIZE; /* Round bsHigh to a power of two -> allocation works with all page sizes */ for (bsTry = 1; bsTry <= bsHigh; bsTry += bsTry) { } bsHigh = bsTry; while (bsHigh - bsLow > 1) { bsTry = (bsHigh + bsLow)/2; head = (char*)base - bsTry*GC_SMALLEST_PAGESIZE; alloc = GC_extendHead(head, bsTry*GC_SMALLEST_PAGESIZE); if (head == alloc) { GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsLow = bsTry; } else { if (alloc != (void*)-1) GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsHigh = bsTry; } } cacheHeadSize = bsLow*GC_SMALLEST_PAGESIZE; #ifdef DEBUG_MREMAP fprintf(stderr, "Expansion detects: %10d/%10d/%10d = %10d\n", cacheHeadSize, oldLength, cacheTailSize, cacheHeadSize+ oldLength+ cacheTailSize); fflush(stderr); #endif cacheAddress = base; cacheOldLength = oldLength; GC_mremap_cached: cacheNewLength = newLength; /* Is there enough free space? */ if (cacheTailSize + cacheHeadSize < growth) { /* No, there's not. Try to move it instead. */ alloc = GC_mmapAnon(0, newLength); if (alloc != (void*)-1) { memcpy(alloc, base, oldLength); GC_release(base, oldLength); return alloc; } /* Failed even to move it */ return (void*)-1; } #ifdef DEBUG_MREMAP fprintf(stderr, "Expansion attempts %d bytes\n", newLength); fflush(stderr); #endif if (growth <= cacheTailSize) { tail = (char*)base + oldLength; alloc = GC_extendTail(tail, growth); if (alloc != tail) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, growth); return (void*)-1; } return base; } if (cacheTailSize > 0) { tail = (char*)base + oldLength; alloc = GC_extendTail(tail, cacheTailSize); if (alloc != tail) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, cacheTailSize); return (void*)-1; } } else { tail = 0; /* quell warning */ } head = (char*)base - (growth-cacheTailSize); alloc = GC_extendHead(head, growth-cacheTailSize); if (alloc != head) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, growth-cacheTailSize); if (cacheTailSize > 0) GC_release(tail, cacheTailSize); return (void*)-1; } memmove(head, base, oldLength); return head; } mlton-20210117+dfsg/runtime/platform/netbsd.c000066400000000000000000000012501416264345000207560ustar00rootroot00000000000000#include "platform.h" #include "platform/diskBack.unix.c" #include "platform/displayMem.proc.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/sysctl.c" #include "platform/use-mmap.c" static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.__gregs[_REG_EIP]); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20210117+dfsg/runtime/platform/netbsd.h000066400000000000000000000015331416264345000207670ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND FALSE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "netbsd" extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20210117+dfsg/runtime/platform/nonwin.c000066400000000000000000000006761416264345000210220ustar00rootroot00000000000000/* ------------------------------------------------- */ /* Posix */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) void Posix_IO_setbin (__attribute__ ((unused)) C_Fd_t fd) { die("Posix_IO_setbin not implemented"); } __attribute__ ((noreturn)) void Posix_IO_settext (__attribute__ ((unused)) C_Fd_t fd) { die("Posix_IO_settext not implemented"); } mlton-20210117+dfsg/runtime/platform/openbsd.c000066400000000000000000000027101416264345000211330ustar00rootroot00000000000000#include "platform.h" #include "platform/diskBack.unix.c" #include "platform/displayMem.proc.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/sysctl.c" #include "platform/mmap.c" void GC_release (void *base, size_t length) { munmap_safe (base, length); } void *GC_mmapAnon (void *start, size_t length) { return mmapAnonFlags (start, length, MAP_STACK); } void *GC_mmapAnonFlags (void *start, size_t length, int flags) { return mmapAnonFlags (start, length, flags | MAP_STACK); } void *GC_mmapAnonStack (void *start, size_t length, int prot, size_t dead_low, size_t dead_high) { int flags = 0; #ifdef MAP_STACK flags |= MAP_STACK; #endif return GC_mmapAnonFlags_safe_protect (start, length, prot, flags, dead_low, dead_high); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; #if (defined (__x86_64__)) GC_handleSigProf ((code_pointer) ucp->sc_rip); #elif (defined (__i386__)) GC_handleSigProf ((code_pointer) ucp->sc_eip); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20210117+dfsg/runtime/platform/openbsd.h000066400000000000000000000031241416264345000211400ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #define HAS_FEROUND FALSE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "openbsd" /* #ifndef PRIu8 */ /* #define PRIu8 "hhu" */ /* #endif */ /* #ifndef PRIu16 */ /* #define PRIu16 "hu" */ /* #endif */ /* #ifndef PRIx16 */ /* #define PRIx16 "hx" */ /* #endif */ /* #ifndef PRId32 */ /* #define PRId32 "d" */ /* #endif */ /* #ifndef PRIu32 */ /* #define PRIu32 "u" */ /* #endif */ /* #ifndef PRIx32 */ /* #define PRIx32 "x" */ /* #endif */ /* typedef long long int intmax_t; */ /* #ifndef INTMAX_MIN */ /* #define INTMAX_MIN LLONG_MIN */ /* #endif */ /* typedef unsigned long long int uintmax_t; */ /* #ifndef PRIuMAX */ /* #define PRIuMAX "llu" */ /* #endif */ /* #ifndef PRIxMAX */ /* #define PRIxMAX "llx" */ /* #endif */ /* #ifndef PRIxPTR */ /* #define PRIxPTR "lx" */ /* #endif */ extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20210117+dfsg/runtime/platform/powerpc.h000066400000000000000000000000531416264345000211630ustar00rootroot00000000000000#define MLton_Platform_Arch_host "powerpc" mlton-20210117+dfsg/runtime/platform/powerpc64.h000066400000000000000000000000551416264345000213370ustar00rootroot00000000000000#define MLton_Platform_Arch_host "powerpc64" mlton-20210117+dfsg/runtime/platform/recv.nonblock.c000066400000000000000000000020641416264345000222460ustar00rootroot00000000000000/* Simulates MSG_DONTWAIT using fcntl() and O_NONBLOCK. */ static void fd_modify(int fd, int flags, int add, int shouldRemove) { int status; if (flags & MSG_DONTWAIT) { status = errno; int f = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, (f | add) & ~shouldRemove); errno = status; } } static void set_nonblock(int fd, int flags) { fd_modify(fd, flags, O_NONBLOCK, 0); } static void clear_nonblock(int fd, int flags) { fd_modify(fd, flags, 0, O_NONBLOCK); } int MLton_recv(int s, void *buf, int len, int flags) { int ret; set_nonblock(s, flags); ret = recv(s, buf, len, flags & ~MSG_DONTWAIT); clear_nonblock(s, flags); return ret; } int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen) { int ret; set_nonblock(s, flags); ret = recvfrom(s, buf, len, flags & ~MSG_DONTWAIT, from, fromlen); clear_nonblock(s, flags); return ret; } mlton-20210117+dfsg/runtime/platform/riscv.h000066400000000000000000000000511416264345000206300ustar00rootroot00000000000000#define MLton_Platform_Arch_host "riscv" mlton-20210117+dfsg/runtime/platform/s390.h000066400000000000000000000000501416264345000201770ustar00rootroot00000000000000#define MLton_Platform_Arch_host "s390" mlton-20210117+dfsg/runtime/platform/setenv.h000066400000000000000000000001011416264345000210020ustar00rootroot00000000000000int setenv (const char *name, const char *value, int overwrite); mlton-20210117+dfsg/runtime/platform/setenv.putenv.c000066400000000000000000000007741416264345000223350ustar00rootroot00000000000000/* This implementation of setenv has a space leak, but I don't see how to avoid * it, since the specification of putenv is that it uses the memory for its arg. */ int setenv (const char *name, const char *value, int overwrite) { size_t len; char *b; if (!overwrite && getenv (name)) return 0; len = strlen (name) + strlen (value) + 2 /* = and \000 */; b = malloc (len); snprintf (b, len, "%s=%s", name, value); return putenv (b); } mlton-20210117+dfsg/runtime/platform/solaris.c000066400000000000000000000017741416264345000211660ustar00rootroot00000000000000#include "platform.h" #include "platform/diskBack.unix.c" #include "platform/mmap-protect.c" #include "platform/nonwin.c" #include "platform/sysconf.c" #include "platform/setenv.putenv.c" #include "platform/use-mmap.c" /* ------------------------------------------------- */ /* GC */ /* ------------------------------------------------- */ void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "pmap %d\n", (int)(getpid ())); system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[REG_PC]); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20210117+dfsg/runtime/platform/solaris.h000066400000000000000000000026521416264345000211670ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For FIONBIO, FIONREAD. */ #include #include /* This is defined in , bet we'll redefine it in export.h. */ #undef PRIVATE #include #include #include /* For SIOCATMARK. */ #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define NEEDS_SIGALTSTACK_EXEC FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "solaris" /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ extern char **environ; /* ------------------------------------------------- */ /* MLton.Syslog */ /* ------------------------------------------------- */ #ifndef LOG_AUTHPRIV #define LOG_AUTHPRIV LOG_AUTH #endif #define LOG_PERROR 0 mlton-20210117+dfsg/runtime/platform/sparc.h000066400000000000000000000000511416264345000206120ustar00rootroot00000000000000#define MLton_Platform_Arch_host "sparc" mlton-20210117+dfsg/runtime/platform/sysconf.c000066400000000000000000000011331416264345000211630ustar00rootroot00000000000000size_t GC_pageSize (void) { long int pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } uintmax_t GC_physMem (void) { size_t pageSize = GC_pageSize (); long int physPages; uintmax_t physMem; physPages = sysconf (_SC_PHYS_PAGES); if (physPages < 0) diee ("GC_physMem error: sysconf (_SC_PHYS_PAGES) failed"); physMem = (uintmax_t)pageSize * (uintmax_t)physPages; return physMem; } mlton-20210117+dfsg/runtime/platform/sysctl.c000066400000000000000000000033561416264345000210310ustar00rootroot00000000000000size_t GC_pageSize (void) { size_t len; int mib[2]; len = 0; mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; if (-1 == sysctl (mib, 2, NULL, &len, NULL, 0)) diee ("sysctl failed"); if (len == sizeof(unsigned long long int)) { unsigned long long int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else if (len == sizeof(unsigned long int)) { unsigned long int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else if (len == sizeof(unsigned int)) { unsigned int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else { die ("GC_pageSize"); } } uintmax_t GC_physMem (void) { size_t len; int mib[2]; len = 0; mib[0] = CTL_HW; #if defined(HW_MEMSIZE) /* Darwin */ mib[1] = HW_MEMSIZE; #elif defined(HW_PHYSMEM64) /* NetBSD */ mib[1] = HW_PHYSMEM64; #else mib[1] = HW_PHYSMEM; #endif if (-1 == sysctl (mib, 2, NULL, &len, NULL, 0)) diee ("sysctl failed"); if (len == sizeof(unsigned long long int)) { unsigned long long int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else if (len == sizeof(unsigned long int)) { unsigned long int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else if (len == sizeof(unsigned int)) { unsigned int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else { die ("GC_physMem"); } } mlton-20210117+dfsg/runtime/platform/use-mmap.c000066400000000000000000000010701416264345000212230ustar00rootroot00000000000000#include "platform/mmap.c" void GC_release (void *base, size_t length) { munmap_safe (base, length); } void *GC_mmapAnon (void *start, size_t length) { return mmapAnon (start, length); } void *GC_mmapAnonFlags (void *start, size_t length, int flags) { return mmapAnonFlags(start, length, flags); } void *GC_mmapAnonStack (void *start, size_t length, int prot, size_t dead_low, size_t dead_high) { return GC_mmapAnonFlags_safe_protect (start, length, prot, 0, dead_low, dead_high); } mlton-20210117+dfsg/runtime/platform/windows.c000066400000000000000000000400301416264345000211700ustar00rootroot00000000000000HANDLE fileDesHandle (int fd); #define BUFSIZE 512 static HANDLE tempFileDes (void) { /* Based on http://msdn.microsoft.com/en-us/library/aa363875(VS.85).aspx */ HANDLE hTempFile; DWORD dwRetVal; DWORD dwBufSize=BUFSIZE; UINT uRetVal; TCHAR szTempName[BUFSIZE]; TCHAR lpPathBuffer[BUFSIZE]; dwRetVal = GetTempPath(dwBufSize, lpPathBuffer); if (dwRetVal > dwBufSize || (dwRetVal == 0)) die ("GetTempPath(%ld,...) failed with error %ld\n", dwBufSize, GetLastError()); uRetVal = GetTempFileName(lpPathBuffer, TEXT("MLtonTempFile"), 0, szTempName); if (uRetVal == 0) die ("GetTempFileName(\"%s\",...) failed with error %ld\n", lpPathBuffer, GetLastError()); hTempFile = CreateFile((LPTSTR) szTempName, GENERIC_READ | GENERIC_WRITE, 0, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hTempFile == INVALID_HANDLE_VALUE) die ("CreateFile(\"%s\",...) failed with error %ld\n", szTempName, GetLastError()); return hTempFile; } typedef struct { HANDLE handle; } *WriteToDiskData; void GC_diskBack_read (void *data, pointer buf, size_t size) { HANDLE h; DWORD d; DWORD dwBytesRead; h = ((WriteToDiskData)data)->handle; d = SetFilePointer (h, 0, NULL, FILE_BEGIN); if (d == INVALID_SET_FILE_POINTER) die ("SetFilePointer failed with error %ld\n", GetLastError()); unless (ReadFile(h, buf, size, &dwBytesRead, NULL)) die ("ReadFile failed with error %ld\n", GetLastError()); } void GC_diskBack_close (void *data) { HANDLE h; h = ((WriteToDiskData)data)->handle; unless (CloseHandle (h)) die ("CloseHandle failed with error %ld.", GetLastError()); free (data); } void *GC_diskBack_write (pointer buf, size_t size) { HANDLE h; WriteToDiskData d; DWORD dwBytesWritten; h = tempFileDes (); unless (WriteFile (h, buf, size, &dwBytesWritten, NULL)) die ("WriteFile failed with error %ld\n", GetLastError()); d = (WriteToDiskData)(malloc_safe (sizeof(*d))); d->handle = h; return d; } static void displayMaps (void) { MEMORY_BASIC_INFORMATION buf; const char *state = ""; const char *protect = ""; uintptr_t address; buf.RegionSize = 0; for (address = 0; address + buf.RegionSize >= address; address += buf.RegionSize) { if (0 == VirtualQuery ((LPCVOID)address, &buf, sizeof (buf))) break; if (0 == buf.RegionSize) break; switch (buf.Protect) { case PAGE_READONLY: protect = "PAGE_READONLY"; break; case PAGE_READWRITE: protect = "PAGE_READWRITE"; break; case PAGE_WRITECOPY: protect = "PAGE_WRITECOPY"; break; case PAGE_EXECUTE: protect = "PAGE_EXECUTE"; break; case PAGE_EXECUTE_READ: protect = "PAGE_EXECUTE_READ"; break; case PAGE_EXECUTE_READWRITE: protect = "PAGE_EXECUTE_READWRITE"; break; case PAGE_EXECUTE_WRITECOPY: protect = "PAGE_EXECUTE_WRITECOPY"; break; case PAGE_GUARD: protect = "PAGE_GUARD"; break; case PAGE_NOACCESS: protect = "PAGE_NOACCESS"; break; case PAGE_NOCACHE: protect = "PAGE_NOCACHE"; break; default: assert (FALSE); } switch (buf.State) { case MEM_COMMIT: state = "MEM_COMMIT"; break; case MEM_FREE: state = "MEM_FREE"; break; case MEM_RESERVE: state = "MEM_RESERVE"; break; default: assert (FALSE); } fprintf(stderr, FMTPTR " %10"PRIuMAX" %s %s\n", (uintptr_t)buf.BaseAddress, (uintmax_t)buf.RegionSize, state, protect); } } void GC_displayMem (void) { #ifdef _WIN64 MEMORYSTATUSEX ms; ms.dwLength = sizeof (MEMORYSTATUSEX); GlobalMemoryStatusEx (&ms); fprintf(stderr, "Total Phys. Mem: %"PRIuMAX"\n" "Avail Phys. Mem: %"PRIuMAX"\n" "Total Page File: %"PRIuMAX"\n" "Avail Page File: %"PRIuMAX"\n" "Total Virtual: %"PRIuMAX"\n" "Avail Virtual: %"PRIuMAX"\n", (uintmax_t)ms.ullTotalPhys, (uintmax_t)ms.ullAvailPhys, (uintmax_t)ms.ullTotalPageFile, (uintmax_t)ms.ullAvailPageFile, (uintmax_t)ms.ullTotalVirtual, (uintmax_t)ms.ullAvailVirtual); #else MEMORYSTATUS ms; ms.dwLength = sizeof (MEMORYSTATUS); GlobalMemoryStatus (&ms); fprintf(stderr, "Total Phys. Mem: %"PRIuMAX"\n" "Avail Phys. Mem: %"PRIuMAX"\n" "Total Page File: %"PRIuMAX"\n" "Avail Page File: %"PRIuMAX"\n" "Total Virtual: %"PRIuMAX"\n" "Avail Virtual: %"PRIuMAX"\n", (uintmax_t)ms.dwTotalPhys, (uintmax_t)ms.dwAvailPhys, (uintmax_t)ms.dwTotalPageFile, (uintmax_t)ms.dwAvailPageFile, (uintmax_t)ms.dwTotalVirtual, (uintmax_t)ms.dwAvailVirtual); #endif displayMaps (); } static HANDLE dupHandle (int fd) { HANDLE dupd; HANDLE raw; raw = fileDesHandle (fd); if (raw == (HANDLE)-1 or raw == 0) { errno = EBADF; return 0; } /* 'Inspired' by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp * It's interesting that you can open files for/from other processes... */ unless (DuplicateHandle ( GetCurrentProcess(), /* source process */ raw, /* source handle */ GetCurrentProcess(), /* target process */ &dupd, /* target handle - valid in target proc */ 0, /* ignored b/c DUPLICATE_SAME_ACCESS used */ TRUE, /* this can be inherited by children */ DUPLICATE_SAME_ACCESS))/* keep the same permissions */ { errno = ENOMEM; return 0; } return dupd; } /* Windows memory is allocated in two phases: reserve and commit. * A reservation makes the address space unavailable to other reservations. * Commiting reserved memory actually maps the reserved memory for use. * Decommitting a portion of a reservation releases the physical memory only. * The complicating detail is that one cannot partially release a reservation. * * The management routines below manage a 'heap' that is composed of several * distinct reservations, laid out in the following order: * 0+ reservations set MEM_COMMIT * 1 reservation starting MEM_COMMIT with an optional MEM_RESERVE tail * * The heap always starts on a reservation and ends at where the MEM_RESERVE * region (if any) begins. */ /* Create a new heap */ static inline void *Windows_mmapAnon (void *base, size_t length) { void *res; /* We prevoiusly used "0" instead of start, which lead to crashes. * After reading win32 documentation, the reason for these crashes * becomes clear: we were using only MEM_COMMIT! If there was memory * decommitted in a previous heap shrink, a new heap might end up * inside the reserved (but uncommitted) memory. When the old heap is * freed, it will kill the new heap as well. This bug will not happen * now because we reserve, then commit. Reserved memory cannot conflict. */ res = VirtualAlloc (base, length, MEM_RESERVE, PAGE_NOACCESS); if (0 == res) return (void*)-1; /* Actually get the memory for use */ if (0 == VirtualAlloc (res, length, MEM_COMMIT, PAGE_READWRITE)) { VirtualFree(res, 0, MEM_RELEASE); return (void*)-1; } return res; } static inline void Windows_release (void *base, size_t length) { MEMORY_BASIC_INFORMATION mi; if (length == 0) return; /* We might not be able to release the first reservation because * it overlaps the base address we wish to keep. The idea is to * decommit the part we don't need, and release all reservations * that may be after this point. */ if (0 == VirtualQuery(base, &mi, sizeof(mi))) die("VirtualQuery failed"); assert (mi.State != MEM_FREE); assert (mi.RegionSize <= length); if (mi.AllocationBase != base) { if (0 == VirtualFree(base, mi.RegionSize, MEM_DECOMMIT)) die("VirtualFree(MEM_DECOMMIT)"); /* Requery: the following region might also be decommit */ VirtualQuery(base, &mi, sizeof(mi)); assert (mi.State == MEM_RESERVE); /* It's possible the consolidated reserved space is larger * than the range we were asked to free. Bail out early. */ if (mi.RegionSize >= length) return; /* Skip decommited region and move to the next reservation */ base = (char*)base + mi.RegionSize; length -= mi.RegionSize; } /* Clean-up the remaining tail. */ while (length > 0) { if (0 == VirtualQuery(base, &mi, sizeof(mi))) die("VirtualQuery"); /* We should never have a completely decommitted alloc */ assert (mi.State == MEM_COMMIT); /* This method is supposed to only do complete releases */ assert (mi.AllocationBase == base); /* The committed region should never exceed the length */ assert (mi.RegionSize <= length); if (0 == VirtualFree(base, 0, MEM_RELEASE)) die("VirtualFree(MEM_RELEASE) failed"); base = (char*)base + mi.RegionSize; length -= mi.RegionSize; } /* The last release also handled the optional MEM_RESERVE region */ } /* Extend an existing heap */ static inline void* Windows_extend (void *base, size_t length) { MEMORY_BASIC_INFORMATION mi; void *end; /* Check the status of memory after the end of the allocation */ VirtualQuery(base, &mi, sizeof(mi)); if (mi.State == MEM_FREE) { /* No tail of reserved memory -> simply try to allocate */ return Windows_mmapAnon(base, length); } else if (mi.State == MEM_RESERVE) { assert (mi.AllocationBase <= base); end = (char*)base + mi.RegionSize; if (mi.RegionSize > length) { /* only commit is needed */ if (0 == VirtualAlloc(base, length, MEM_COMMIT, PAGE_READWRITE)) { return (void*)-1; } else { return base; } } else if (end == Windows_mmapAnon(end, length-mi.RegionSize)) { if (0 == VirtualAlloc(base, mi.RegionSize, MEM_COMMIT, PAGE_READWRITE)) { VirtualFree(end, 0, MEM_RELEASE); return (void*)-1; } else { return base; } } else { /* Failed to allocate tail */ return (void*)-1; } } else { /* The memory is used by another mapping */ return (void*)-1; } } C_Errno_t(C_PId_t) Windows_Process_create (NullString8_t cmds, NullString8_t args, NullString8_t envs, C_Fd_t in, C_Fd_t out, C_Fd_t err) { char *cmd; char *arg; char *env; STARTUPINFO si; PROCESS_INFORMATION pi; cmd = (char*)cmds; arg = (char*)args; env = (char*)envs; ZeroMemory (&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.hStdInput = dupHandle (in); si.hStdOutput = dupHandle (out); si.hStdError = dupHandle (err); si.dwFlags = STARTF_USESTDHANDLES; /* use the above */ if (!si.hStdInput or !si.hStdOutput or !si.hStdError) { if (si.hStdInput) CloseHandle (si.hStdInput); if (si.hStdOutput) CloseHandle (si.hStdOutput); if (si.hStdError) CloseHandle (si.hStdError); /* errno already faked by dupHandle */ return -1; } ZeroMemory (&pi, sizeof(PROCESS_INFORMATION)); unless (CreateProcess ( cmd, /* Module name */ arg, /* Command line */ NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ TRUE, /* Set handle inheritance to TRUE */ 0, /* No creation flags */ env, /* Environment */ NULL, /* Use parent's starting directory */ &si, /* Pointer to STARTUPINFO structure */ &pi /* Pointer to PROCESS_INFORMATION structure */ )) { errno = ENOENT; /* probably does not exist (aka ENOFILE)*/ return -1; } /* Process created successfully */ /* We will return the process handle for the 'pid'. * This way we can TerminateProcess (kill) it and * WaitForSingleObject/GetExitCodeProcess (reap) it. * The thread handle is not needed, so clean it. */ CloseHandle (pi.hThread); CloseHandle (si.hStdInput); CloseHandle (si.hStdOutput); CloseHandle (si.hStdError); return (C_PId_t)pi.hProcess; } C_Errno_t(C_PId_t) Windows_Process_createNull (NullString8_t cmds, NullString8_t args, C_Fd_t in, C_Fd_t out, C_Fd_t err) { return Windows_Process_create (cmds, args, NULL, in, out, err); } C_Errno_t(C_Int_t) Windows_Process_getexitcode (C_PId_t pid, Ref(C_Status_t) status) { HANDLE h; h = (HANDLE)pid; unless (WaitForSingleObject (h, INFINITE) == WAIT_OBJECT_0) { errno = ECHILD; return -1; } unless (GetExitCodeProcess (h, (DWORD*)status)) { errno = ECHILD; return -1; } return 0; } C_Errno_t(C_Int_t) Windows_Process_terminate (C_PId_t pid, C_Signal_t sig) { HANDLE h; h = (HANDLE)pid; unless (TerminateProcess (h, 0x80000000UL | sig)) { errno = ECHILD; return -1; } return 0; } mlton-20210117+dfsg/runtime/platform/x86.h000066400000000000000000000000471416264345000201340ustar00rootroot00000000000000#define MLton_Platform_Arch_host "x86" mlton-20210117+dfsg/runtime/util.c000066400000000000000000000005131416264345000166310ustar00rootroot00000000000000/* Copyright (C) 2018,2020 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #define MLTON_UTIL #include "util.h" #include "util/die.c" #include "util/to-string.c" mlton-20210117+dfsg/runtime/util.h000066400000000000000000000016441416264345000166440ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_UTIL_H_ #define _MLTON_UTIL_H_ #include "cenv.h" #include "util/pointer.h" #ifndef TRUE #define TRUE (0 == 0) #endif #ifndef FALSE #define FALSE (not TRUE) #endif #define unless(p) if (not (p)) #define until(p) while (not (p)) #define cardof(a) (sizeof(a) / sizeof(*(a))) #define endof(a) ((a) + cardof(a)) #define TWOPOWER(n) (1 << (n)) #ifndef max #define max(a, b) ((a)>(b)?(a):(b)) #endif #ifndef min #define min(a, b) ((a)<(b)?(a):(b)) #endif #include "util/die.h" #include "util/safe.h" #include "util/read_write.h" #include "util/to-string.h" #include "util/align.h" #include "util/endian.h" #endif /* _MLTON_UTIL_H_ */ mlton-20210117+dfsg/runtime/util/000077500000000000000000000000001416264345000164665ustar00rootroot00000000000000mlton-20210117+dfsg/runtime/util/align.h000066400000000000000000000020401416264345000177250ustar00rootroot00000000000000/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static inline bool isAligned (size_t a, size_t b) { return 0 == a % b; } static inline bool isAlignedMax (uintmax_t a, uintmax_t b) { return 0 == a % b; } static inline size_t alignDown (size_t a, size_t b) { assert (b >= 1 && b == (b & -b)); a &= -b; assert (isAligned (a, b)); return a; } static inline uintmax_t alignMaxDown (uintmax_t a, uintmax_t b) { assert (b >= 1 && b == (b & -b)); a &= -b; assert (isAlignedMax (a, b)); return a; } static inline size_t align (size_t a, size_t b) { assert (b >= 1 && b == (b & -b)); a += b - 1; a &= -b; assert (isAligned (a, b)); return a; } static inline uintmax_t alignMax (uintmax_t a, uintmax_t b) { assert (b >= 1 && b == (b & -b)); a += b - 1; a &= -b; assert (isAlignedMax (a, b)); return a; } mlton-20210117+dfsg/runtime/util/die.c000066400000000000000000000011301416264345000173660ustar00rootroot00000000000000/* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #include "util.h" void die (const char *fmt, ...) { va_list args; fflush(stdout); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); exit(1); } void diee (const char * fmt, ...) { va_list args; fflush(stdout); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, " (%s)\n", strerror(errno)); exit(1); } mlton-20210117+dfsg/runtime/util/die.h000066400000000000000000000012531416264345000174010ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ /* issue error message and exit */ PRIVATE extern void die (const char *fmt, ...) __attribute__ ((format(printf, 1, 2))) __attribute__ ((noreturn)); /* issue error message and exit. Also print strerror(errno). */ PRIVATE extern void diee (const char *fmt, ...) __attribute__ ((format(printf, 1, 2))) __attribute__ ((noreturn)); mlton-20210117+dfsg/runtime/util/endian.h000066400000000000000000000013271416264345000201000ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static inline bool isBigEndian(void) { uint16_t x = 0xABCDU; uint8_t y = 0; /* gcc optimizes the following code to just return the result. */ memcpy(&y, &x, sizeof(uint8_t)); if (y == 0xAB) return TRUE; /* big endian */ if (y == 0xCD) return FALSE; /* little endian */ die ("Could not detect endian --- neither big nor little!\n"); // return 0; } static inline bool isLittleEndian(void) { return not (isBigEndian()); } mlton-20210117+dfsg/runtime/util/pointer.h000066400000000000000000000011311416264345000203130ustar00rootroot00000000000000/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ // typedef void* pointer; // typedef unsigned char* pointer; typedef unsigned char pointerAux __attribute__ ((may_alias)); typedef pointerAux* pointer; #if POINTER_BITS == 32 #define FMTPTR "0x%08"PRIxPTR #elif POINTER_BITS == 64 #define FMTPTR "0x%016"PRIxPTR #else #error POINTER_BITS undefined #endif typedef const unsigned char* code_pointer; mlton-20210117+dfsg/runtime/util/read_write.h000066400000000000000000000041401416264345000207630ustar00rootroot00000000000000/* Copyright (C) 2012 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static inline char readChar (FILE *f) { char res; fread_safe (&res, sizeof(char), 1, f); return res; } static inline size_t readSize (FILE *f) { size_t res; fread_safe (&res, sizeof(size_t), 1, f); return res; } static inline uint32_t readUint32 (FILE *f) { uint32_t res; fread_safe (&res, sizeof(uint32_t), 1, f); return res; } static inline uintptr_t readUintptr (FILE *f) { uintptr_t res; fread_safe (&res, sizeof(uintptr_t), 1, f); return res; } static inline void writeChar (FILE *f, char c) { fwrite_safe (&c, sizeof(char), 1, f); } static inline void writeSize (FILE *f, size_t z) { fwrite_safe (&z, sizeof(size_t), 1, f); } static inline void writeUint32 (FILE *f, uint32_t u) { fwrite_safe (&u, sizeof(uint32_t), 1, f); } static inline void writeUintptr (FILE *f, uintptr_t u) { fwrite_safe (&u, sizeof(uintptr_t), 1, f); } static inline void writeString (FILE *f, const char* s) { fwrite_safe (s, 1, strlen(s), f); } #define BUF_SIZE 64 static inline void writeUint32U (FILE *f, uint32_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "%"PRIu32, u); writeString (f, buf); } static inline void writeUintmaxU (FILE *f, uintmax_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "%"PRIuMAX, u); writeString (f, buf); } static inline void writeUint32X (FILE *f, uint32_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "0x%08"PRIx32, u); writeString (f, buf); } static inline void writeUintmaxX (FILE *f, uintmax_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "0x%0*"PRIxMAX, (int)(2 * sizeof(uintmax_t)), u); writeString (f, buf); } #undef BUF_SIZE static inline void writeNewline (FILE *f) { writeString (f, "\n"); } static inline void writeStringWithNewline (FILE *f, const char* s) { writeString (f, s); writeNewline (f); } mlton-20210117+dfsg/runtime/util/safe.h000066400000000000000000000047421416264345000175640ustar00rootroot00000000000000/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ static inline void *calloc_safe (size_t count, size_t size) { void *res; res = calloc (count, size); if (NULL == res) die ("calloc (%"PRIuMAX", %"PRIuMAX") failed.\n", (uintmax_t)count, (uintmax_t)size); return res; } static inline void fclose_safe (FILE* f) { int res; res = fclose (f); if (-1 == res) diee ("fclose (_) failed.\n"); return; } static inline FILE *fdopen_safe (int fd, const char *mode) { FILE *res; res = fdopen (fd, mode); if (0 == res) diee ("fopen (%d, %s) failed.\n", fd, mode); return res; } static inline FILE *fopen_safe (const char *fileName, const char *mode) { FILE *res; res = fopen (fileName, mode); if (0 == res) diee ("fopen (%s, %s) failed.\n", fileName, mode); return res; } static inline void fread_safe (void *buf, size_t size, size_t count, FILE *f) { size_t res; res = fread (buf, size, count, f); if (res != count) { diee ("fread ("FMTPTR", %"PRIuMAX", %"PRIuMAX", _) failed " "(only read %"PRIuMAX"%s).\n", (uintptr_t)buf, (uintmax_t)size, (uintmax_t)count, (uintmax_t)res, feof (f) ? "; eof" : ""); } } static inline int fseek_safe (FILE *f, long offset, int whence) { int res; res = fseek (f, offset, whence); if (-1 == res) diee ("fseek (_, %"PRIuMAX", %"PRIuMAX") failed.\n", (uintmax_t)offset, (uintmax_t)whence); return res; } static inline void fwrite_safe (const void *buf, size_t size, size_t count, FILE *f) { size_t res; res = fwrite (buf, size, count, f); if (res != count) diee ("fwrite (_, %"PRIuMAX", %"PRIuMAX", _) failed " "(only wrote %"PRIuMAX").\n", (uintmax_t)size, (uintmax_t)count, (uintmax_t)res); } static inline void *malloc_safe (size_t size) { void *res; res = malloc (size); if (NULL == res) die ("malloc (%"PRIuMAX") failed.\n", (uintmax_t)size); return res; } static inline int mkstemp_safe (char *template) { int fd; fd = mkstemp (template); if (-1 == fd) diee ("mkstemp (%s) failed.\n", template); return fd; } static inline void unlink_safe (const char *pathname) { int res; res = unlink (pathname); if (-1 == res) diee ("unlink (%s) failed.\n", pathname); return; } mlton-20210117+dfsg/runtime/util/to-string.c000066400000000000000000000034521416264345000205640ustar00rootroot00000000000000/* Copyright (C) 2012,2013 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ #include "util.h" const char* boolToString (bool b) { return b ? "TRUE" : "FALSE"; } #define BUF_SIZE 64 char* intmaxToCommaString (intmax_t n) { static char buf1[BUF_SIZE]; static char buf2[BUF_SIZE]; static char buf3[BUF_SIZE]; static char buf4[BUF_SIZE]; static char buf5[BUF_SIZE]; static char *bufs[] = {buf1, buf2, buf3, buf4, buf5}; static int bufIndex = 0; static char *buf; char tmp[BUF_SIZE]; int i, j, k, l; buf = bufs[bufIndex++]; bufIndex %= 5; l = snprintf(tmp, BUF_SIZE, "%"PRIdMAX, n); if (tmp[0] == '-') { buf[0] = '-'; i = 1; j = 1; k = (l - 1) % 3; } else { i = 0; j = 0; k = l % 3; } if (k == 0) { k = 3; } buf[j++] = tmp[i++]; k--; while (tmp[i] != '\000') { if (k == 0) { buf[j++] = ','; k = 3; } buf[j++] = tmp[i++]; k--; } buf[j] = '\000'; return buf; } char* uintmaxToCommaString (uintmax_t n) { static char buf1[BUF_SIZE]; static char buf2[BUF_SIZE]; static char buf3[BUF_SIZE]; static char buf4[BUF_SIZE]; static char buf5[BUF_SIZE]; static char *bufs[] = {buf1, buf2, buf3, buf4, buf5}; static int bufIndex = 0; static char *buf; char tmp[BUF_SIZE]; int i, j, k, l; buf = bufs[bufIndex++]; bufIndex %= 5; l = snprintf(tmp, BUF_SIZE, "%"PRIuMAX, n); i = 0; j = 0; k = l % 3; if (k == 0) { k = 3; } buf[j++] = tmp[i++]; k--; while (tmp[i] != '\000') { if (k == 0) { buf[j++] = ','; k = 3; } buf[j++] = tmp[i++]; k--; } buf[j] = '\000'; return buf; } #undef BUF_SIZE mlton-20210117+dfsg/runtime/util/to-string.h000066400000000000000000000005261416264345000205700ustar00rootroot00000000000000/* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a HPND-style license. * See the file MLton-LICENSE for details. */ PRIVATE const char* boolToString (bool b); PRIVATE char* intmaxToCommaString (intmax_t n); PRIVATE char* uintmaxToCommaString (uintmax_t n); mlton-20210117+dfsg/util/000077500000000000000000000000001416264345000150035ustar00rootroot00000000000000mlton-20210117+dfsg/util/cm2mlb/000077500000000000000000000000001416264345000161575ustar00rootroot00000000000000mlton-20210117+dfsg/util/cm2mlb/.gitignore000066400000000000000000000000601416264345000201430ustar00rootroot00000000000000## Ignore all .cm directories .cm/ /cm2mlb.*-* mlton-20210117+dfsg/util/cm2mlb/Makefile000066400000000000000000000020761416264345000176240ustar00rootroot00000000000000## Copyright (C) 2010 Matthew Fluet. # # MLton is released under a HPND-style license. # See the file MLton-LICENSE for details. ## # # SML/NJ tools and heap suffix # ML_BUILD := ml-build ML_BUILD_FLAGS := ML_HEAP_SUFFIX := $(shell echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null) # # cm2mlb root .cm # CM2MLB_CM := cm2mlb.cm # # cm2mlb heap image # CM2MLB_HEAP := cm2mlb.$(ML_HEAP_SUFFIX) all: $(CM2MLB_HEAP) $(CM2MLB_HEAP): cm2mlb.cm cm2mlb.sml gen-mlb.sml cm2mlb-map rm -f $(CM2MLB_HEAP) # $(ML_BUILD) $(ML_BUILD_FLAGS) $(CM2MLB_CM) CM2MLB.main $(CM2MLB_HEAP) ( \ echo 'if (CM.make "cm2mlb.cm") handle _ => false'; \ echo ' then ()'; \ echo ' else OS.Process.exit OS.Process.failure;'; \ echo 'CM2MLB.export();' \ ) | sml .PHONY: clean clean: ../../bin/clean SMLDIR := $(dir $(shell which sml)) .PHONY: install install: $(CM2MLB_HEAP) rm -f $(SMLDIR).heap/$(CM2MLB_HEAP) $(SMLDIR)cm2mlb cp $(CM2MLB_HEAP) $(SMLDIR).heap (cd $(SMLDIR) ; ln -s .run-sml cm2mlb)mlton-20210117+dfsg/util/cm2mlb/cm2mlb-map000066400000000000000000000041341416264345000200330ustar00rootroot00000000000000# Standard ML Basis Library $SMLNJ-BASIS $(SML_LIB)/basis $basis.cm $(SML_LIB)/basis $basis.cm/basis.cm $(SML_LIB)/basis/basis.mlb ##### # ckit Library $ckit-lib.cm $(SML_LIB)/ckit-lib $ckit-lib.cm/ckit-lib.cm $(SML_LIB)/ckit-lib/ckit-lib.mlb # CML Library $cml $(SML_LIB)/cml $cml/cml.cm $(SML_LIB)/cml/cml.mlb # MLLPT Library $ml-lpt-lib.cm $(SML_LIB)/mllpt-lib $ml-lpt-lib.cm/ml-lpt-lib.cm $(SML_LIB)/mllpt-lib/mllpt-lib.mlb # MLNLFFI Library $c $(SML_LIB)/mlnlffi-lib $c/c.cm $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb # MLRISC Library $SMLNJ-MLRISC $(SML_LIB)/mlrisc-lib/mlb # MLYacc Library $SMLNJ-ML-YACC-LIB $(SML_LIB)/mlyacc-lib $SMLNJ-ML-YACC-LIB/ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb $ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib $ml-yacc-lib.cm/ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb # SMLNJ Library $SMLNJ-LIB $(SML_LIB)/smlnj-lib $controls-lib.cm $(SML_LIB)/smlnj-lib/Controls $hash-cons-lib.cm $(SML_LIB)/smlnj-lib/HashCons $html-lib.cm $(SML_LIB)/smlnj-lib/HTML $html4-lib.cm $(SML_LIB)/smlnj-lib/HTML4 $inet-lib.cm $(SML_LIB)/smlnj-lib/INet $json-lib.cm $(SML_LIB)/smlnj-lib/JSON $pp-lib.cm $(SML_LIB)/smlnj-lib/PP $reactive-lib.cm $(SML_LIB)/smlnj-lib/Reactive $regexp-lib.cm $(SML_LIB)/smlnj-lib/RegExp $sexp-lib.cm $(SML_LIB)/smlnj-lib/SExp $smlnj-lib.cm $(SML_LIB)/smlnj-lib/Util $unix-lib.cm $(SML_LIB)/smlnj-lib/Unix $xml-lib.cm $(SML_LIB)/smlnj-lib/XML mlton-20210117+dfsg/util/cm2mlb/cm2mlb.cm000066400000000000000000000002751416264345000176600ustar00rootroot00000000000000Library structure CM2MLB is $/pgraph.cm $smlnj/cm.cm $smlnj/viscomp/core.cm $/smlnj-lib.cm $/basis.cm gen-mlb.sml cm2mlb.sml mlton-20210117+dfsg/util/cm2mlb/cm2mlb.sml000066400000000000000000000277621416264345000200660ustar00rootroot00000000000000(* * Author: Matthew Fluet (mfluet@acm.org) * * This requires that you have SML/NJ installed. * It works with SML/NJ 110.47 and may require changes to work with other * versions, since it depends on the CM structure. * * cm2mlb takes a ".cm" file and prints on stdout a corresponding ".mlb". * * To use from the REPL, do the following: * CM2MLB.cm2mlb {defines = ["MLton"], * binds = [], * maps = [], * sources = "sources.cm", * out = TextIO.stdOut} * * Before using from the shell, you must do the following, where is * the root directory of the SML/NJ installation. You may need to be root in * order to do these. * 1. From the SML/NJ REPL: * CM.make "cm2mlb.cm"; * CM2MLB.export (); * 2. ln -s /bin/.run-sml /bin/cm2mlb * 3. mv cm2mlb.x86-linux /bin/.heap * * Once it is installed, the usage is as follows: * cm2mlb [-Dsym ...] [-bind file] [-map file] sources.cm * * -Dsym can be used to define CM preprocessor symbols. * -bind file can be used to add cm anchor bindings. * -map file can be used to add cm2mlb mappings. *) structure CM2MLB : sig val cm2mlb : {defines: string list, binds: string list, maps: string list, out: TextIO.outstream, sources: string} -> unit val main: string * string list -> OS.Process.status val export : unit -> unit end = struct structure PG = PortableGraph fun message s = TextIO.output (TextIO.stdErr, s ^ "\n") fun die msg = (message ("Error: " ^ msg) ; OS.Process.exit OS.Process.failure) structure CM = struct open CM structure Graph = struct val graph = fn src => (Graph.graph src) handle _ => NONE end end structure AnchorBind = struct fun make (file : string) = if OS.FileSys.access (file, [OS.FileSys.A_READ]) then let val lines = let val f = TextIO.openIn file in let fun loop lines = case TextIO.inputLine f of NONE => List.rev lines | SOME l => loop (l::lines) in loop [] before TextIO.closeIn f end handle e => (TextIO.closeIn f; raise e) end handle _ => [] in List.mapPartial (fn line => if CharVector.all Char.isSpace line orelse CharVector.sub (line, 0) = #"#" then NONE else case String.tokens Char.isSpace line of [anchor, value] => SOME {anchor = anchor, value = value} | _ => die (concat ["strange anchor->value mapping: ", file, ":: ", line])) lines end else [] end structure AnchorMap = struct fun make (file : string) = if OS.FileSys.access (file, [OS.FileSys.A_READ]) then let val lines = let val f = TextIO.openIn file in let fun loop lines = case TextIO.inputLine f of NONE => List.rev lines | SOME l => loop (l::lines) in loop [] before TextIO.closeIn f end handle e => (TextIO.closeIn f; raise e) end handle _ => [] in List.mapPartial (fn line => if CharVector.all Char.isSpace line orelse CharVector.sub (line, 0) = #"#" then NONE else case String.tokens Char.isSpace line of [cmAnchor, mlbPath] => SOME {cmAnchor = cmAnchor, mlbPath = mlbPath} | _ => die (concat ["strange cm->mlb mapping: ", file, ":: ", line])) lines end else [] val default = make "cm2mlb-map" end fun cm2mlb {defines, binds, maps, out, sources} = let (* Define preprocessor symbols *) val _ = List.app (fn sym => (#set (CM.symval sym)) (SOME 1)) defines val _ = (#set CM.Control.verbose) false val _ = (#set CM.Control.warn_obsolete) false val _ = Control.printWarnings := false val _ = List.app (fn {anchor, value} => #set (CM.Anchor.anchor anchor) (SOME value)) (List.concat (List.map AnchorBind.make binds)) local val anchorMap = List.concat ((List.map AnchorMap.make maps) @ [AnchorMap.default]) fun peekAnchorMap cmAnchor' = case List.find (fn {cmAnchor, ...} => cmAnchor = cmAnchor') anchorMap of NONE => NONE | SOME {mlbPath, ...} => SOME mlbPath in val peekAnchorMap = peekAnchorMap end val _ = if OS.FileSys.access (sources, [OS.FileSys.A_READ]) then () else die (concat ["file not found: ", sources]) val {dir, file = sources} = OS.Path.splitDirFile sources val () = if dir <> "" then OS.FileSys.chDir dir else () in case CM.Graph.graph sources of SOME {graph as PG.GRAPH {imports, ...}, imports = importLibs, nativesrc} => let val imports = ListPair.map (fn (bid, cmLib) => let val cmLibDescr = CM.Library.descr cmLib val cmLibOSString = CM.Library.osstring cmLib fun mlbLibDef () = let val {base, ext} = OS.Path.splitBaseExt cmLibOSString val mlbLib = OS.Path.joinBaseExt {base = base, ext = SOME "mlb"} in mlbLib end fun doitAnchoredPath arcs = let fun loop (prefix, suffix) = if List.null prefix then concat ["(* ", cmLibDescr, " =??=> *) ", mlbLibDef ()] else case peekAnchorMap (String.concatWith "/" (List.rev prefix)) of SOME mlbPath => concat ["(* ", cmLibDescr, " ====> *) ", mlbPath ^ suffix] | NONE => let val suffix = if suffix = "" then OS.Path.joinBaseExt {base = #base (OS.Path.splitBaseExt (List.hd prefix)), ext = SOME "mlb"} else (List.hd prefix) ^ suffix in loop (List.tl prefix, "/" ^ suffix) end in loop (List.rev arcs, "") end val mlbLib = if String.sub (cmLibDescr, 0) = #"$" then case String.fields (fn #"/" => true | _ => false) cmLibDescr of "$" :: (arcs as (arc0 :: _)) => doitAnchoredPath (("$" ^ arc0) :: arcs) | arc0 :: arcs => let val arc0 = case CharVector.findi (fn (_, #"(") => true | _ => false) arc0 of SOME (i, _) => String.extract (arc0, i + 2, SOME (String.size arc0 - i - 3)) | NONE => arc0 in doitAnchoredPath (arc0 :: arcs) end | arcs => doitAnchoredPath arcs else concat ["(* ", cmLibOSString, " ===> *) ", mlbLibDef ()] in concat [" basis ", bid, " =\n", " bas\n", " ", mlbLib, "\n", " end\n"] end) (imports, importLibs) in TextIO.output (out, "local\n"); List.app (fn s => TextIO.output (out, s)) imports; TextIO.output (out, "in\n"); GenMLB.gen {graph = graph, nativesrc = nativesrc, importprefix = fn _ => "", exportprefix = "", outstream = out}; TextIO.output (out, "end\n") end | NONE => die ("CM.Graph.graph " ^ sources ^ " failed") end fun usage msg = (message "Usage: cm2mlb [-Dsym ...] [-bind file] [-map file] sources.cm" ; die msg) fun main (_, args) = let val defines = ref ["MLton"] val binds = ref [] val maps = ref [] fun loop args = case args of [file] => cm2mlb {defines = !defines, binds = !binds, maps = !maps, out = TextIO.stdOut, sources = file} | flag :: args => if String.isPrefix "-D" flag then (defines := String.extract (flag, 2, NONE) :: !defines ; loop args) else if "-bind" = flag then case args of file :: args => (binds := file :: !binds ; loop args) | _ => usage "missing map file" else if "-map" = flag then case args of file :: args => (maps := file :: !maps ; loop args) | _ => usage "missing map file" else usage (String.concat ["invalid flag ", flag]) | _ => usage "wrong number of arguments" in loop args handle e => die (concat ["cm2mlb failed: ", General.exnMessage e]) ; OS.Process.success end fun export () = SMLofNJ.exportFn ("cm2mlb", main) end mlton-20210117+dfsg/util/cm2mlb/gen-mlb.sml000066400000000000000000000142501416264345000202170ustar00rootroot00000000000000(* gen-mlb.sml *) (* Modified from SML/NJ sources by Matthew Fluet (mfluet@acm.org) *) (* gen-sml.sml * * Generate SML source code for a given library. * * (C) 2001 Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) local structure P = PortableGraph in structure GenMLB : sig type typ = string type varname = string exception TypeError of typ * varname exception Unbound of varname exception ImportMismatch val gen : { graph: P.graph, nativesrc: string -> string, importprefix: string -> string, outstream: TextIO.outstream, exportprefix: string } -> unit end = struct type typ = string type varname = string exception TypeError of typ * varname exception Unbound of varname exception ImportMismatch structure M = RedBlackMapFn (type ord_key = string val compare = String.compare) type namespace = string type name = string type symbol = namespace * name fun symbol_compare ((ns, n), (ns', n')) = case String.compare (n, n') of EQUAL => String.compare (ns, ns') | unequal => unequal structure SS = RedBlackSetFn (type ord_key = symbol val compare = symbol_compare) structure SM = RedBlackMapFn (type ord_key = symbol val compare = symbol_compare) datatype binding = SYM of symbol | SYMS of SS.set | ENV of symbol SM.map fun gen args = let val { graph = P.GRAPH { imports, defs, export }, nativesrc, importprefix, outstream = outs, exportprefix } = args val (xlocal, xin, xend) = ("local", "in", "end") local val indent = ref 0 in fun out l = (TextIO.output (outs, CharVector.tabulate(!indent, fn _ => #" ")); app (fn s => TextIO.output (outs, s)) l; TextIO.output (outs, "\n")) val (xlocal, xin, xend) = (fn () => (out [xlocal]; indent := !indent + 3), fn () => (indent := !indent - 3; out [xin]; indent := !indent + 3), fn () => (indent := !indent - 3; out [xend])) end val im = let fun add (v, m) = M.insert (m, v, importprefix v) val m = List.foldl add M.empty imports in fn v => M.find (m, v) end val gensym = let val next = ref 0 in fn () => let val i = !next in next := i + 1; "gs_" ^ Int.toString i end end fun genexport (ss, fmt) = let val sl = SS.listItems ss val sl' = map (fn (ns, n) => (ns, gensym ())) sl fun oneline (sy, sy', e) = (fmt (sy, sy'); SM.insert (e, sy, sy')) in ListPair.foldl oneline SM.empty (sl, sl') end fun import (lib, ss) = let val lstruct = case im lib of NONE => raise Unbound lib | SOME n => n fun fmt ((ns, n), (_, n')) = out [ns, " ", n', " = ", lstruct, n] in xlocal (); out ["open ", lib]; xin (); genexport (ss, fmt) before xend () end fun genimport ((ns, n), (_, n')) = out [ns, " ", n, " = ", n'] fun compile (src, native, e, oss) = let fun fmt ((ns, n), (_, n')) = out [ns, " ", n', " = ", n] in xlocal (); SM.appi genimport e; out [if native then src else nativesrc src]; xin (); genexport (oss, fmt) before xend () end fun filter (e, ss) = SM.filteri (fn (sy, _) => SS.member (ss, sy)) e fun get dm v = case M.find (dm, v) of NONE => raise Unbound v | SOME d => d fun getENV dm v = case get dm v of ENV m => m | _ => raise TypeError ("env", v) fun namespace P.SGN = "signature" | namespace P.STR = "structure" | namespace P.FCT = "functor" fun onedef (P.DEF { lhs, rhs }, dm) = let val get = get dm val getENV = getENV dm fun getSYM v = case get v of SYM s => s | _ => raise TypeError ("sym", v) fun getSYMS v = case get v of SYMS ss => ss | _ => raise TypeError ("syms", v) in M.insert (dm, lhs, case rhs of P.SYM (ns, n) => SYM (namespace ns, n) | P.SYMS vl => let fun one (v, ss) = SS.add (ss, getSYM v) in SYMS (foldl one SS.empty vl) end | P.IMPORT { lib, syms } => ENV (import (lib, getSYMS syms)) | P.COMPILE { src = (src, native), env, syms } => ENV (compile (src, native, getENV env, getSYMS syms)) | P.FILTER { env, syms } => ENV (filter (getENV env, getSYMS syms)) | P.MERGE el => let fun one (v, e) = SM.unionWith #2 (getENV v, e) in ENV (foldl one SM.empty el) end) end val _ = xlocal () val _ = out ["$(SML_LIB)/basis/pervasive.mlb"] val dm = foldl onedef M.empty defs val ee = getENV dm export fun libexport ((ns, n), (_, n')) = out [ns, " ", exportprefix, n, " = ", n'] in xin (); SM.appi libexport ee; xend () end end end